From 3869ccc6bc6f676eb3bc2f475fd6f6cd1a8ff9ec Mon Sep 17 00:00:00 2001 From: Anver sadhique Date: Fri, 17 Apr 2020 20:46:45 +0530 Subject: [PATCH 001/127] asoc : codec : enable usb analog headset support Add support for usbc analog audio for SDM660 platform by adding usbc gpio setup in mbhc driver. Change-Id: I7f13962f71268e546efed54a74e8445a53b2343f Signed-off-by: Shashi Kant Maurya --- asoc/codecs/wcd-mbhc-v2.c | 283 ++++++++++++++++++++++++++++++++++++-- asoc/codecs/wcd-mbhc-v2.h | 18 ++- 2 files changed, 289 insertions(+), 12 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index ffe573e33adb..d6e336974e8c 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2018, 2020, 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 @@ -1021,7 +1021,8 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) mbhc->extn_cable_hph_rem = false; wcd_mbhc_report_plug(mbhc, 0, jack_type); - if (mbhc->mbhc_cfg->enable_usbc_analog) { + if (mbhc->mbhc_cfg->enable_usbc_analog && + mbhc->mbhc_cfg->fsa_enable) { WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); if (mbhc->mbhc_cb->clk_setup) mbhc->mbhc_cb->clk_setup(mbhc->codec, false); @@ -1398,7 +1399,7 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) * when a non-audio accessory is inserted. L_DET_EN sets to 1 when FSA * I2C driver notifies that ANALOG_AUDIO_ADAPTER is inserted */ - if (mbhc->mbhc_cfg->enable_usbc_analog) + if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->mbhc_cfg->fsa_enable) WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); else WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); @@ -1421,7 +1422,8 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) mbhc->mbhc_cb->mbhc_bias(codec, true); /* enable MBHC clock */ if (mbhc->mbhc_cb->clk_setup) { - if (mbhc->mbhc_cfg->enable_usbc_analog) + if (mbhc->mbhc_cfg->enable_usbc_analog && + mbhc->mbhc_cfg->fsa_enable) mbhc->mbhc_cb->clk_setup(codec, false); else mbhc->mbhc_cb->clk_setup(codec, true); @@ -1595,9 +1597,209 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, return 0; } +static int wcd_mbhc_init_gpio(struct wcd_mbhc *mbhc, + struct wcd_mbhc_config *mbhc_cfg, + const char *gpio_dt_str, + int *gpio, + struct device_node **gpio_dn) +{ + int rc = 0; + struct snd_soc_codec *codec = mbhc->codec; + struct snd_soc_card *card = codec->component.card; + + dev_dbg(mbhc->codec->dev, "%s: gpio %s\n", __func__, gpio_dt_str); + + *gpio_dn = of_parse_phandle(card->dev->of_node, gpio_dt_str, 0); + + if (!(*gpio_dn)) { + *gpio = of_get_named_gpio(card->dev->of_node, gpio_dt_str, 0); + if (!gpio_is_valid(*gpio)) { + dev_err(card->dev, "%s, property %s not in node %s", + __func__, gpio_dt_str, + card->dev->of_node->full_name); + rc = -EINVAL; + } + } + + return rc; +} + +static int wcd_mbhc_usb_c_analog_setup_gpios(struct wcd_mbhc *mbhc, bool active) +{ + int rc = 0; + struct usbc_ana_audio_config *config = + &mbhc->mbhc_cfg->usbc_analog_cfg; + union power_supply_propval pval; + + dev_dbg(mbhc->codec->dev, "%s: setting GPIOs active = %d\n", + __func__, active); + + memset(&pval, 0, sizeof(pval)); + + if (active) { + pval.intval = POWER_SUPPLY_TYPEC_PR_SOURCE; + if (power_supply_set_property(mbhc->usb_psy, + POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &pval)) + dev_info(mbhc->codec->dev, "%s: force PR_SOURCE mode unsuccessful\n", + __func__); + else + mbhc->usbc_force_pr_mode = true; + + if (config->usbc_en1_gpio_p) + rc = msm_cdc_pinctrl_select_active_state( + config->usbc_en1_gpio_p); + if (rc == 0 && config->usbc_en2n_gpio_p) + rc = msm_cdc_pinctrl_select_active_state( + config->usbc_en2n_gpio_p); + if (rc == 0 && config->usbc_force_gpio_p) + rc = msm_cdc_pinctrl_select_active_state( + config->usbc_force_gpio_p); + mbhc->usbc_mode = POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER; + } else { + /* no delay is required when disabling GPIOs */ + if (config->usbc_en2n_gpio_p) + msm_cdc_pinctrl_select_sleep_state( + config->usbc_en2n_gpio_p); + if (config->usbc_en1_gpio_p) + msm_cdc_pinctrl_select_sleep_state( + config->usbc_en1_gpio_p); + if (config->usbc_force_gpio_p) + msm_cdc_pinctrl_select_sleep_state( + config->usbc_force_gpio_p); + + if (mbhc->usbc_force_pr_mode) { + pval.intval = POWER_SUPPLY_TYPEC_PR_DUAL; + if (power_supply_set_property(mbhc->usb_psy, + POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &pval)) + dev_info(mbhc->codec->dev, "%s: force PR_DUAL mode unsuccessful\n", + __func__); + mbhc->usbc_force_pr_mode = false; + } + mbhc->usbc_mode = POWER_SUPPLY_TYPEC_NONE; + } + + return rc; +} + + +/* workqueue */ +static void wcd_mbhc_usbc_analog_work_fn(struct work_struct *work) +{ + struct wcd_mbhc *mbhc = + container_of(work, struct wcd_mbhc, usbc_analog_work); + + wcd_mbhc_usb_c_analog_setup_gpios(mbhc, + mbhc->usbc_mode != POWER_SUPPLY_TYPEC_NONE); +} + +/* this callback function is used to process PMI notification */ +static int wcd_mbhc_usb_c_event_changed(struct notifier_block *nb, + unsigned long evt, void *ptr) +{ + int ret; + union power_supply_propval mode; + struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, psy_nb); + struct snd_soc_codec *codec = mbhc->codec; + + if (ptr != mbhc->usb_psy || evt != PSY_EVENT_PROP_CHANGED) + return 0; + + ret = power_supply_get_property(mbhc->usb_psy, + POWER_SUPPLY_PROP_TYPEC_MODE, &mode); + if (ret) { + dev_err(codec->dev, "%s: Unable to read USB TYPEC_MODE: %d\n", + __func__, ret); + return ret; + } + + dev_dbg(codec->dev, "%s: USB change event received\n", + __func__); + dev_dbg(codec->dev, "%s: supply mode %d, expected %d\n", __func__, + mode.intval, POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER); + + switch (mode.intval) { + case POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER: + case POWER_SUPPLY_TYPEC_NONE: + dev_dbg(codec->dev, "%s: usbc_mode: %d; mode.intval: %d\n", + __func__, mbhc->usbc_mode, mode.intval); + + /* filter notifications received before */ + if (mbhc->usbc_mode == mode.intval) + break; + mbhc->usbc_mode = mode.intval; + + dev_dbg(codec->dev, "%s: queueing usbc_analog_work\n", + __func__); + schedule_work(&mbhc->usbc_analog_work); + break; + default: + break; + } + return ret; +} + +/* PMI registration code */ +static int wcd_mbhc_usb_c_analog_init(struct wcd_mbhc *mbhc) +{ + int ret = 0; + struct snd_soc_codec *codec = mbhc->codec; + + dev_dbg(mbhc->codec->dev, "%s: usb-c analog setup start\n", __func__); + INIT_WORK(&mbhc->usbc_analog_work, wcd_mbhc_usbc_analog_work_fn); + + mbhc->usb_psy = power_supply_get_by_name("usb"); + if (IS_ERR_OR_NULL(mbhc->usb_psy)) { + dev_err(codec->dev, "%s: could not get USB psy info\n", + __func__); + ret = -EPROBE_DEFER; + if (IS_ERR(mbhc->usb_psy)) + ret = PTR_ERR(mbhc->usb_psy); + mbhc->usb_psy = NULL; + goto err; + } + ret = wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); + if (ret) { + dev_err(codec->dev, "%s: error while setting USBC ana gpios\n", + __func__); + goto err; + } + + mbhc->psy_nb.notifier_call = wcd_mbhc_usb_c_event_changed; + mbhc->psy_nb.priority = 0; + ret = power_supply_reg_notifier(&mbhc->psy_nb); + if (ret) { + dev_err(codec->dev, "%s: power supply registration failed\n", + __func__); + goto err; + } + + /* + * as part of the init sequence check if there is a connected + * USB C analog adapter + */ + dev_dbg(mbhc->codec->dev, "%s: verify if USB adapter is already inserted\n", + __func__); + ret = wcd_mbhc_usb_c_event_changed(&mbhc->psy_nb, + PSY_EVENT_PROP_CHANGED, + mbhc->usb_psy); + +err: + return ret; +} + +static int wcd_mbhc_usb_c_analog_deinit(struct wcd_mbhc *mbhc) +{ + wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); + + /* deregister from PMI */ + power_supply_unreg_notifier(&mbhc->psy_nb); + return 0; +} + int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) { int rc = 0; + struct usbc_ana_audio_config *config; struct snd_soc_codec *codec; struct snd_soc_card *card; const char *usb_c_dt = "qcom,msm-mbhc-usbc-audio-supported"; @@ -1605,6 +1807,7 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) if (!mbhc || !mbhc_cfg) return -EINVAL; + config = &mbhc_cfg->usbc_analog_cfg; codec = mbhc->codec; card = codec->component.card; @@ -1634,14 +1837,48 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD; mbhc->fsa_np = of_parse_phandle(card->dev->of_node, "fsa4480-i2c-handle", 0); - if (!mbhc->fsa_np) { + if (mbhc->fsa_np) { + mbhc_cfg->fsa_enable = true; + } else { dev_err(card->dev, "%s: fsa4480 i2c node not found\n", + __func__); + + mbhc_cfg->fsa_enable = false; + rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, + "qcom,usbc-analog-en1_gpio", + &config->usbc_en1_gpio, + &config->usbc_en1_gpio_p); + if (rc) + goto err; + + rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, + "qcom,usbc-analog-en2_n_gpio", + &config->usbc_en2n_gpio, + &config->usbc_en2n_gpio_p); + if (rc) + goto err; + + if (of_find_property(card->dev->of_node, + "qcom,usbc-analog-force_detect_gpio", + NULL)) { + rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, + "qcom,usbc-analog-force_detect_gpio", + &config->usbc_force_gpio, + &config->usbc_force_gpio_p); + if (rc) + goto err; + } + + dev_dbg(mbhc->codec->dev, "%s: calling usb_c_analog_init\n", __func__); - rc = -EINVAL; - goto err; + /* init PMI notifier */ + rc = wcd_mbhc_usb_c_analog_init(mbhc); + if (rc) { + rc = EPROBE_DEFER; + goto err; + } } } - /* Set btn key code */ if ((!mbhc->is_btn_already_regd) && wcd_mbhc_set_keycode(mbhc)) pr_err("Set btn key code error!!!\n"); @@ -1653,6 +1890,7 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) if (rc) { dev_err(card->dev, "%s: wcd mbhc initialize failed\n", __func__); + wcd_mbhc_usb_c_analog_deinit(mbhc); goto err; } } else { @@ -1664,7 +1902,7 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); } - if (mbhc_cfg->enable_usbc_analog) { + if (mbhc_cfg->enable_usbc_analog && mbhc_cfg->fsa_enable) { mbhc->fsa_nb.notifier_call = wcd_mbhc_usbc_ana_event_handler; mbhc->fsa_nb.priority = 0; rc = fsa4480_reg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); @@ -1679,6 +1917,10 @@ EXPORT_SYMBOL(wcd_mbhc_start); void wcd_mbhc_stop(struct wcd_mbhc *mbhc) { + struct usbc_ana_audio_config *config; + + config = &mbhc->mbhc_cfg->usbc_analog_cfg; + pr_debug("%s: enter\n", __func__); if (mbhc->current_plug != MBHC_PLUG_TYPE_NONE) { @@ -1703,8 +1945,27 @@ void wcd_mbhc_stop(struct wcd_mbhc *mbhc) mbhc->mbhc_cal = NULL; } - if (mbhc->mbhc_cfg->enable_usbc_analog) - fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); + if (mbhc->mbhc_cfg->enable_usbc_analog) { + if (mbhc->mbhc_cfg->fsa_enable) { + fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); + } else { + wcd_mbhc_usb_c_analog_deinit(mbhc); + /* free GPIOs */ + if (config->usbc_en1_gpio > 0) + gpio_free(config->usbc_en1_gpio); + if (config->usbc_en2n_gpio > 0) + gpio_free(config->usbc_en2n_gpio); + if (config->usbc_force_gpio) + gpio_free(config->usbc_force_gpio); + if (config->usbc_en1_gpio_p) + of_node_put(config->usbc_en1_gpio_p); + if (config->usbc_en2n_gpio_p) + of_node_put(config->usbc_en2n_gpio_p); + if (config->usbc_force_gpio_p) + of_node_put(config->usbc_force_gpio_p); + } + } + pr_debug("%s: leave\n", __func__); } diff --git a/asoc/codecs/wcd-mbhc-v2.h b/asoc/codecs/wcd-mbhc-v2.h index a20765f56691..7457c81716a0 100644 --- a/asoc/codecs/wcd-mbhc-v2.h +++ b/asoc/codecs/wcd-mbhc-v2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2020, 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 @@ -416,6 +416,15 @@ enum mbhc_hs_pullup_iref_v2 { HS_PULLUP_I_OFF, }; +struct usbc_ana_audio_config { + int usbc_en1_gpio; + int usbc_en2n_gpio; + int usbc_force_gpio; + struct device_node *usbc_en1_gpio_p; /* used by pinctrl API */ + struct device_node *usbc_en2n_gpio_p; /* used by pinctrl API */ + struct device_node *usbc_force_gpio_p; /* used by pinctrl API */ +}; + enum mbhc_moisture_rref { R_OFF, R_24_KOHM, @@ -439,6 +448,8 @@ struct wcd_mbhc_config { bool enable_anc_mic_detect; u32 enable_usbc_analog; bool moisture_duty_cycle_en; + struct usbc_ana_audio_config usbc_analog_cfg; + bool fsa_enable; }; struct wcd_mbhc_intr { @@ -597,11 +608,16 @@ struct wcd_mbhc { unsigned long intr_status; bool is_hph_ocp_pending; + bool usbc_force_pr_mode; struct wcd_mbhc_fn *mbhc_fn; bool force_linein; + int usbc_mode; struct device_node *fsa_np; struct notifier_block fsa_nb; + struct notifier_block psy_nb; + struct power_supply *usb_psy; + struct work_struct usbc_analog_work; }; void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, From 20b2b5eb391171de136b3e686e529022ed7b539a Mon Sep 17 00:00:00 2001 From: sheenam monga Date: Wed, 8 Jul 2020 10:34:46 +0530 Subject: [PATCH 002/127] qcacmn: Fix OOB issue in wlan_parse_rsn_ie Issue: Currently, host doesn't validate pkid_count before populating data in rsn->pmkid. rsn->pmkid array can store only 4/MAX_PMKID pmkids which may cause OOB write if host tries to copy pmkids more than MAX_PMKID. Fix: validate pkid_count before populating rsn->pmkid and return Failure in case pkid_count becomes greater than MAX_PMKID to avoid OOB. Change-Id: I211ea791a52ecb84872d139929f999a89db240d5 CRs-Fixed: 2724407 --- umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index c10b9d604009..448bf9c67000 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -1510,7 +1510,8 @@ static inline QDF_STATUS wlan_parse_rsn_ie(uint8_t *rsn_ie, rsn->pmkid_count = LE_READ_2(ie); ie += 2; rem_len -= 2; - if (rsn->pmkid_count > (unsigned int) rem_len / PMKID_LEN) { + if (rsn->pmkid_count > MAX_PMKID || + rsn->pmkid_count > (unsigned int)rem_len / PMKID_LEN) { rsn->pmkid_count = 0; return QDF_STATUS_E_INVAL; } From b4f1c986d26ebfb0bf8840189a922a3a77d1261b Mon Sep 17 00:00:00 2001 From: Sujin Panicker Date: Mon, 27 Jul 2020 17:40:00 +0530 Subject: [PATCH 003/127] uapi: Remove ADM_AUDPROC_PERSISTENT_CAL_TYPE cal type Remove support for ADM_AUDPROC_PERSISTENT_CAL_TYPE cal type, as support for this cal type is not extended for the targets sharing this particular component. Change-Id: I9bb8094fe8d4ba3acae55424ab6383050c631af8 --- 4.0/include/uapi/linux/msm_audio_calibration.h | 2 -- include/uapi/linux/msm_audio_calibration.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/4.0/include/uapi/linux/msm_audio_calibration.h b/4.0/include/uapi/linux/msm_audio_calibration.h index e8ba1b3c206a..35b596062247 100644 --- a/4.0/include/uapi/linux/msm_audio_calibration.h +++ b/4.0/include/uapi/linux/msm_audio_calibration.h @@ -104,7 +104,6 @@ enum { ADM_LSM_TOPOLOGY_CAL_TYPE, ADM_LSM_AUDPROC_CAL_TYPE, ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, - ADM_AUDPROC_PERSISTENT_CAL_TYPE, MAX_CAL_TYPES, }; @@ -118,7 +117,6 @@ enum { #define ADM_LSM_TOPOLOGY_CAL_TYPE ADM_LSM_TOPOLOGY_CAL_TYPE #define ADM_LSM_AUDPROC_CAL_TYPE ADM_LSM_AUDPROC_CAL_TYPE #define ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE -#define ADM_AUDPROC_PERSISTENT_CAL_TYPE ADM_AUDPROC_PERSISTENT_CAL_TYPE #define LSM_CAL_TYPES #define TOPOLOGY_SPECIFIC_CHANNEL_INFO diff --git a/include/uapi/linux/msm_audio_calibration.h b/include/uapi/linux/msm_audio_calibration.h index e8ba1b3c206a..35b596062247 100644 --- a/include/uapi/linux/msm_audio_calibration.h +++ b/include/uapi/linux/msm_audio_calibration.h @@ -104,7 +104,6 @@ enum { ADM_LSM_TOPOLOGY_CAL_TYPE, ADM_LSM_AUDPROC_CAL_TYPE, ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, - ADM_AUDPROC_PERSISTENT_CAL_TYPE, MAX_CAL_TYPES, }; @@ -118,7 +117,6 @@ enum { #define ADM_LSM_TOPOLOGY_CAL_TYPE ADM_LSM_TOPOLOGY_CAL_TYPE #define ADM_LSM_AUDPROC_CAL_TYPE ADM_LSM_AUDPROC_CAL_TYPE #define ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE -#define ADM_AUDPROC_PERSISTENT_CAL_TYPE ADM_AUDPROC_PERSISTENT_CAL_TYPE #define LSM_CAL_TYPES #define TOPOLOGY_SPECIFIC_CHANNEL_INFO From 3419551753b987c21b2480effe29b6fbe6086359 Mon Sep 17 00:00:00 2001 From: spuligil Date: Thu, 30 Jul 2020 18:00:44 -0700 Subject: [PATCH 004/127] fw-api: CL 11198984 - update fw common interface files Change-Id: I5637e9e5293bd790fec09758fd7c3c451c8b6807 WMI: add WMI_SERVICE_LL_STATS_PER_CHAN_RX_TX_TIME_SUPPORT def CRs-Fixed: 2262693 --- fw/wmi_services.h | 1 + fw/wmi_version.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fw/wmi_services.h b/fw/wmi_services.h index 9b6d51c7f688..4186129c312a 100644 --- a/fw/wmi_services.h +++ b/fw/wmi_services.h @@ -475,6 +475,7 @@ typedef enum { WMI_SERVICE_CFR_CAPTURE_COUNT_SUPPORT = 256, /* indicates FW support to program CFR capture mode and capture count */ WMI_SERVICE_OCV_SUPPORT = 257, /* FW supports OCV (Operating Channel Validation) */ + WMI_SERVICE_LL_STATS_PER_CHAN_RX_TX_TIME_SUPPORT = 258, /* Indicates firmware support sending per channel own tx & rx time in radio stats of LL stats. */ WMI_MAX_EXT2_SERVICE diff --git a/fw/wmi_version.h b/fw/wmi_version.h index 1c9ece2f85a5..ae393f0ec5ab 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 872 +#define __WMI_REVISION_ 873 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work From 9a858d031ea50720930d17b14e1435f956536ec3 Mon Sep 17 00:00:00 2001 From: spuligil Date: Fri, 31 Jul 2020 06:00:42 -0700 Subject: [PATCH 005/127] fw-api: CL 11199621 - update fw common interface files HTT stats: add pream_punc_tx flag in user_cmpltn_common_tlv Change-Id: Ieda5d4906465f3d8eca8d3ad76c3e9a8619987e1 CRs-Fixed: 2262693 --- fw/htt_ppdu_stats.h | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/fw/htt_ppdu_stats.h b/fw/htt_ppdu_stats.h index a9f25643a649..526fd692793a 100644 --- a/fw/htt_ppdu_stats.h +++ b/fw/htt_ppdu_stats.h @@ -1745,6 +1745,19 @@ typedef enum HTT_PPDU_STATS_RESP_TYPE HTT_PPDU_STATS_RESP_TYPE; ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_S)); \ } while (0) +#define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_M 0x00040000 +#define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_S 18 + +#define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_GET(_var) \ + (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_M) >> \ + HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_S) + +#define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_SET (_var , _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX, _val); \ + ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_S)); \ + } while (0) + #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_M 0xffffffff #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_S 0 @@ -1868,11 +1881,15 @@ typedef struct { * BIT [ 15: 13] :- medium protection type * BIT [ 16: 16] :- rts_success * BIT [ 17: 17] :- rts_failure - * BIT [ 31: 18] :- reserved + * BIT [ 18: 18] :- pream_punc_tx + * BIT [ 31: 19] :- reserved */ union { - A_UINT32 resp_type_is_ampdu__short_retry__long_retry; /* older name */ - A_UINT32 resp_type__is_ampdu__short_retry__long_retry__mprot_type__rts_success__rts_failure; /* newer name */ + /* older names */ + A_UINT32 resp_type_is_ampdu__short_retry__long_retry; + A_UINT32 resp_type__is_ampdu__short_retry__long_retry__mprot_type__rts_success__rts_failure; + /* newest name */ + A_UINT32 resp_type__is_ampdu__short_retry__long_retry__mprot_type__rts_success__rts_failure__pream_punc_tx; struct { /* bitfield names */ A_UINT32 long_retries: 4, short_retries: 4, @@ -1881,7 +1898,8 @@ typedef struct { mprot_type: 3, rts_success: 1, rts_failure: 1, - reserved0: 14; + pream_punc_tx: 1, + reserved0: 13; }; }; From e55bd2909f1e5a0d77b8ec6567352b092c0f3dd3 Mon Sep 17 00:00:00 2001 From: spuligil Date: Sat, 1 Aug 2020 06:00:38 -0700 Subject: [PATCH 006/127] fw-api: CL 11212157 - update fw common interface files Change-Id: I419263a90837b3a95d676e50520895e595c34608 WMI: add fc_duration field in frame_inject_cmd msg CRs-Fixed: 2262693 --- fw/wmi_unified.h | 10 ++++++++++ fw/wmi_version.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 6bb8e967e5aa..6a2134127a1a 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -8060,6 +8060,12 @@ typedef struct { A_UINT32 tx_time; /** msecs the radio is in active receive (32 bits number accruing over time) */ A_UINT32 rx_time; + /*** NOTE *** + * Be cautious about adding new fields in wmi_channel_stats. + * STA-centric targets may instantiate many instances of per-channel + * stats, and consequently may consume a non-trivial amount of on-chip + * memory for storing the channel stats. + */ } wmi_channel_stats; /* @@ -11774,6 +11780,10 @@ typedef struct { A_UINT32 frame_inject_period; /** Destination address of frame */ wmi_mac_addr frame_addr1; + /** Frame control duration field to be set in CTS_TO_SELF. + * Applicable to frame_type WMI_FRAME_INJECT_TYPE_CTS_TO_SELF only. + */ + A_UINT32 fc_duration; /** variable buffer length. Can be used for frame template. * data is in TLV data[] */ diff --git a/fw/wmi_version.h b/fw/wmi_version.h index ae393f0ec5ab..d0a5c4857eeb 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 873 +#define __WMI_REVISION_ 874 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work From af92cd2959dd9213662dcc2bb752c6eb84f24e32 Mon Sep 17 00:00:00 2001 From: spuligil Date: Sat, 1 Aug 2020 18:00:41 -0700 Subject: [PATCH 007/127] fw-api: CL 11216157 - update fw common interface files Change-Id: I86b6439ca6232cf50e9c292f1484f423b0a8ba5b WMI: add radio caps ext info to READY_EXT2 msg CRs-Fixed: 2262693 --- fw/wmi_tlv_defs.h | 4 +++- fw/wmi_unified.h | 38 ++++++++++++++++++++++++++++++++++++++ fw/wmi_version.h | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/fw/wmi_tlv_defs.h b/fw/wmi_tlv_defs.h index 1a8ea2273fa0..8553675e166b 100644 --- a/fw/wmi_tlv_defs.h +++ b/fw/wmi_tlv_defs.h @@ -1100,6 +1100,7 @@ typedef enum { WMITLV_TAG_STRUC_wmi_configure_roam_trigger_parameters, WMITLV_TAG_STRUC_wmi_vdev_extd_stats, WMITLV_TAG_STRUC_wmi_twt_add_dialog_additional_params, + WMITLV_TAG_STRUC_WMI_SCAN_RADIO_CAPABILITIES_EXT2, } WMITLV_TAG_ID; /* @@ -4517,7 +4518,8 @@ WMITLV_CREATE_PARAM_STRUC(WMI_SERVICE_READY_EXT_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_spectral_bin_scaling_params, wmi_bin_scaling_params, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WMI_MAC_PHY_CAPABILITIES_EXT, mac_phy_caps, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WMI_HAL_REG_CAPABILITIES_EXT2, hal_reg_caps, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_nan_capabilities, wmi_nan_capabilities, nan_cap, WMITLV_SIZE_FIX) + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_nan_capabilities, wmi_nan_capabilities, nan_cap, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WMI_SCAN_RADIO_CAPABILITIES_EXT2, wmi_scan_radio_caps, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_SERVICE_READY_EXT2_EVENTID); #define WMITLV_TABLE_WMI_CHAN_RF_CHARACTERIZATION_INFO_EVENTID(id,op,buf,len) \ diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 6a2134127a1a..a6922267933a 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -9521,6 +9521,11 @@ typedef struct { * VDEV_FLAGS_NON_TRANSMIT_AP classify it as either Tx vap * or non Tx vap. */ +#define VDEV_FLAGS_SCAN_MODE_VAP 0x00000010 /* for Scan Radio vdev will be special vap. + * There will not be WMI_VDEV_UP_CMD, there will be only WMI_VDEV_CREATE_CMD + * and WMI_VDEV_START_REQUEST_CMD. Based on this parameter need to make decision like + * vdev Pause/Unpause at WMI_VDEV_START_REQUEST_CMD. + */ typedef struct { A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_vdev_create_cmd_fixed_param */ @@ -25923,6 +25928,39 @@ typedef struct { A_UINT32 wireless_modes_ext; } WMI_HAL_REG_CAPABILITIES_EXT2; +/* + * This TLV used for Scan Radio RDP + * We have an RDP which supports Multiband-Frequency (2Ghz, 5Ghz and 6Ghz) + * on a single radio. + * The AP acts as a special VAP. There will not be WMI_VDEV_UP_CMD. + * This radio is used only for scanning purpose and to send few MGMT frames. + * The DFS feature is disabled on this scan radio, since there will not be + * much TX traffic. + * The Host has to disable CAC timer because DFS feature not supported here. + * In order to know about the scan radio RDP and DFS disabled case, + * the target has to send this information to Host per pdev via + * WMI_SERVICE_READY_EXT2_EVENT. + * The target is notified of the special scan VAP by the flags variable + * in the WMI_CREATE_CMD. + */ +typedef struct { + A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_WMI_SCAN_RADIO_CAPABILITIES_EXT2 */ + /* pdev id */ + A_UINT32 pdev_id; + /* + * [0] 1 - SCAN_RADIO supported 0 - SCAN_RADIO not supported + * [1] 1 - DFS enabled 0 - DFS disabled + * [2:31] reserved + */ + A_UINT32 flags; +} WMI_SCAN_RADIO_CAPABILITIES_EXT2; + +#define WMI_SCAN_RADIO_CAP_SCAN_RADIO_FLAG_GET(flag) WMI_GET_BITS(flag, 0, 1) +#define WMI_SCAN_RADIO_CAP_SCAN_RADIO_FLAG_SET(flag, val) WMI_SET_BITS(flag, 0, 1, val) + +#define WMI_SCAN_RADIO_CAP_DFS_FLAG_GET(flag) WMI_GET_BITS(flag, 1, 1) +#define WMI_SCAN_RADIO_CAP_DFS_FLAG_SET(flag, val) WMI_SET_BITS(flag, 1, 1, val) + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_WMI_SOC_HAL_REG_CAPABILITIES */ A_UINT32 num_phy; diff --git a/fw/wmi_version.h b/fw/wmi_version.h index d0a5c4857eeb..8494762fa16b 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 874 +#define __WMI_REVISION_ 875 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work From 148fcfc2a7bf0060c75ff9a7abdbf54cfe5afea1 Mon Sep 17 00:00:00 2001 From: spuligil Date: Mon, 3 Aug 2020 18:00:57 -0700 Subject: [PATCH 008/127] fw-api: CL 11228391 - update fw common interface files Change-Id: I2ee49ebd9740a50063fa0325c29ee236bee36ea1 WMI: in new SCAN_RADIO_CAPABILITIES_EXT2.pdev_id change pdev_id to phy_id CRs-Fixed: 2262693 --- fw/wmi_unified.h | 3 +-- fw/wmi_version.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index a6922267933a..1eff06f2b36b 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -25945,8 +25945,7 @@ typedef struct { */ typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_WMI_SCAN_RADIO_CAPABILITIES_EXT2 */ - /* pdev id */ - A_UINT32 pdev_id; + A_UINT32 phy_id; /* * [0] 1 - SCAN_RADIO supported 0 - SCAN_RADIO not supported * [1] 1 - DFS enabled 0 - DFS disabled diff --git a/fw/wmi_version.h b/fw/wmi_version.h index 8494762fa16b..2bddd2a6c010 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 875 +#define __WMI_REVISION_ 876 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work From ca7ee8baa607e935fa09b0fbd929d644e33b464b Mon Sep 17 00:00:00 2001 From: spuligil Date: Tue, 4 Aug 2020 18:00:47 -0700 Subject: [PATCH 009/127] fw-api: CL 11237513 - update fw common interface files Change-Id: I11045dee7e74726d88049a9f5c264bcbfe3ef19c WMI: add priority and client_id fields to therm_throttle_config_req msg CRs-Fixed: 2262693 --- fw/wmi_services.h | 1 + fw/wmi_unified.h | 12 ++++++++++++ fw/wmi_version.h | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/fw/wmi_services.h b/fw/wmi_services.h index 4186129c312a..7309c6317077 100644 --- a/fw/wmi_services.h +++ b/fw/wmi_services.h @@ -476,6 +476,7 @@ typedef enum { WMI_SERVICE_CFR_CAPTURE_COUNT_SUPPORT = 256, /* indicates FW support to program CFR capture mode and capture count */ WMI_SERVICE_OCV_SUPPORT = 257, /* FW supports OCV (Operating Channel Validation) */ WMI_SERVICE_LL_STATS_PER_CHAN_RX_TX_TIME_SUPPORT = 258, /* Indicates firmware support sending per channel own tx & rx time in radio stats of LL stats. */ + WMI_SERVICE_THERMAL_MULTI_CLIENT_SUPPORT = 259, /* Indicates FW Thermal Mgr will support multiple clients for mitigation */ WMI_MAX_EXT2_SERVICE diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 1eff06f2b36b..6cd47b8ae8aa 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -26082,6 +26082,16 @@ typedef struct { A_UINT32 prio; } wmi_therm_throt_level_config_info; +typedef enum { + WMI_THERMAL_CLIENT_UNSPECIFIED = 0, + WMI_THERMAL_CLIENT_APPS = 1, + WMI_THERMAL_CLIENT_WPSS = 2, + WMI_THERMAL_CLIENT_FW = 3, + WMI_THERMAL_CLIENT_MAX +} WMI_THERMAL_MITIGATION_CLIENTS; + +#define WMI_THERMAL_CLIENT_MAX_PRIORITY 10 + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_therm_throt_config_request_fixed_param */ A_UINT32 pdev_id; /* config for each pdev */ @@ -26089,6 +26099,8 @@ typedef struct { A_UINT32 dc; /* duty cycle in ms */ A_UINT32 dc_per_event; /* how often (after how many duty cycles) the FW sends stats to host */ A_UINT32 therm_throt_levels; /* Indicates the number of thermal zone configuration */ + A_UINT32 client_id; /* Indicates the client from whom the request is being forwarded to FW. Refer to WMI_THERMAL_MITIGATION_CLIENTS. */ + A_UINT32 priority; /* Indicates the priority, higher the value, higher the priority. Varies from 1 to WMI_THERMAL_CLIENT_MAX_PRIORITY. */ /* * Following this structure is the TLV: * struct wmi_therm_throt_level_config_info therm_throt_level_config_info[therm_throt_levels]; diff --git a/fw/wmi_version.h b/fw/wmi_version.h index 2bddd2a6c010..cae687e9332f 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 876 +#define __WMI_REVISION_ 877 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work From 28f4f5e3ff37afbd104be1a106fb4610aa0507ae Mon Sep 17 00:00:00 2001 From: Srikanth Marepalli Date: Tue, 4 Aug 2020 19:20:20 +0530 Subject: [PATCH 010/127] qcacld-3.0: Fix Mem leak during GTK/IGTK rekey in FT-SuiteB roam In commit I5aa50145fcd3ba91b1c92d4817b7f0e4fc216e3f for FT-SuiteB case Memory is allocated for GTK/IGTK in wlan_parse_ftie_sha384 while parsing the FTIE in Assoc/Reassoc response but it is not freed properly. This change does the respective mem free wherever required. Change-Id: I59ccdd234efd2ee693b05426e62d3c2422fb5326 CRs-Fixed: 2747641 --- .../src/pe/lim/lim_process_assoc_rsp_frame.c | 18 ++++++++++++++++++ core/mac/src/pe/lim/lim_process_deauth_frame.c | 5 +++++ .../src/pe/lim/lim_process_disassoc_frame.c | 5 +++++ core/mac/src/pe/lim/lim_reassoc_utils.c | 4 ++++ core/mac/src/pe/lim/lim_session.c | 4 ++++ 5 files changed, 36 insertions(+) diff --git a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c index b5ca95daa2fb..b1d7034d1a1c 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c +++ b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c @@ -517,6 +517,14 @@ static void lim_handle_assoc_reject_status(tpAniSirGlobal mac_ctx, } #endif +static void clean_up_ft_sha384(tpSirAssocRsp assoc_rsp, bool sha384_akm) +{ + if (sha384_akm) { + qdf_mem_free(assoc_rsp->sha384_ft_subelem.gtk); + qdf_mem_free(assoc_rsp->sha384_ft_subelem.igtk); + } +} + /** * lim_process_assoc_rsp_frame() - Processes assoc response * @mac_ctx: Pointer to Global MAC structure @@ -550,6 +558,8 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, #endif tSirMacEdcaParamRecord mu_edca_set[MAX_NUM_AC]; int8_t rssi; + enum ani_akm_type auth_type; + bool sha384_akm; #ifdef WLAN_FEATURE_ROAM_OFFLOAD sme_sessionid = session_entry->smeSessionId; @@ -729,6 +739,9 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, lim_update_ese_tspec(mac_ctx, session_entry, assoc_rsp); #endif + auth_type = session_entry->connected_akm; + sha384_akm = lim_is_sha384_akm(auth_type); + if (assoc_rsp->capabilityInfo.ibss) { /* * Received Re/Association Response from peer @@ -737,6 +750,7 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, * failure timeout. */ pe_err("received Re/AssocRsp frame with IBSS capability"); + clean_up_ft_sha384(assoc_rsp, sha384_akm); qdf_mem_free(assoc_rsp); qdf_mem_free(beacon); return; @@ -744,6 +758,7 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, if (cfg_get_capability_info(mac_ctx, &caps, session_entry) != QDF_STATUS_SUCCESS) { + clean_up_ft_sha384(assoc_rsp, sha384_akm); qdf_mem_free(assoc_rsp); qdf_mem_free(beacon); pe_err("could not retrieve Capabilities"); @@ -837,6 +852,7 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, NULL) != QDF_STATUS_SUCCESS) { pe_err("Set link state to POSTASSOC failed"); qdf_mem_free(beacon); + clean_up_ft_sha384(assoc_rsp, sha384_akm); qdf_mem_free(assoc_rsp); return; } @@ -969,6 +985,7 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, assoc_cnf.protStatusCode = eSIR_SME_SUCCESS; lim_post_sme_message(mac_ctx, LIM_MLM_ASSOC_CNF, (uint32_t *) &assoc_cnf); + clean_up_ft_sha384(assoc_rsp, sha384_akm); qdf_mem_free(assoc_rsp); qdf_mem_free(beacon); return; @@ -1034,6 +1051,7 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, beacon, &session_entry->pLimJoinReq->bssDescription, true, session_entry)) { + clean_up_ft_sha384(assoc_rsp, sha384_akm); qdf_mem_free(assoc_rsp); qdf_mem_free(beacon); return; diff --git a/core/mac/src/pe/lim/lim_process_deauth_frame.c b/core/mac/src/pe/lim/lim_process_deauth_frame.c index 0ed23d8e16d0..146d2738a005 100644 --- a/core/mac/src/pe/lim/lim_process_deauth_frame.c +++ b/core/mac/src/pe/lim/lim_process_deauth_frame.c @@ -324,6 +324,7 @@ void lim_perform_deauth(tpAniSirGlobal mac_ctx, tpPESession pe_session, tLimMlmAssocCnf mlmAssocCnf; uint16_t aid; tpDphHashNode sta_ds; + tpSirAssocRsp assoc_rsp; sta_ds = dph_lookup_hash_entry(mac_ctx, addr, &aid, &pe_session->dph.dphHashTable); @@ -539,6 +540,10 @@ void lim_perform_deauth(tpAniSirGlobal mac_ctx, tpPESession pe_session, lim_delete_pre_auth_node(mac_ctx, addr); if (pe_session->limAssocResponseData) { + assoc_rsp = (tpSirAssocRsp) pe_session-> + limAssocResponseData; + qdf_mem_free(assoc_rsp->sha384_ft_subelem.gtk); + qdf_mem_free(assoc_rsp->sha384_ft_subelem.igtk); qdf_mem_free(pe_session->limAssocResponseData); pe_session->limAssocResponseData = NULL; } diff --git a/core/mac/src/pe/lim/lim_process_disassoc_frame.c b/core/mac/src/pe/lim/lim_process_disassoc_frame.c index 750dfd3d4ed9..a67ebabbac51 100644 --- a/core/mac/src/pe/lim/lim_process_disassoc_frame.c +++ b/core/mac/src/pe/lim/lim_process_disassoc_frame.c @@ -348,6 +348,7 @@ void lim_perform_disassoc(tpAniSirGlobal mac_ctx, int32_t frame_rssi, tLimMlmDisassocInd mlmDisassocInd; uint16_t aid; tpDphHashNode sta_ds; + tpSirAssocRsp assoc_rsp; sta_ds = dph_lookup_hash_entry(mac_ctx, addr, &aid, &pe_session->dph.dphHashTable); @@ -378,6 +379,10 @@ void lim_perform_disassoc(tpAniSirGlobal mac_ctx, int32_t frame_rssi, pe_debug("received Disassoc from AP while waiting for Reassoc Rsp"); if (pe_session->limAssocResponseData) { + assoc_rsp = (tpSirAssocRsp) pe_session-> + limAssocResponseData; + qdf_mem_free(assoc_rsp->sha384_ft_subelem.gtk); + qdf_mem_free(assoc_rsp->sha384_ft_subelem.igtk); qdf_mem_free(pe_session->limAssocResponseData); pe_session->limAssocResponseData = NULL; } diff --git a/core/mac/src/pe/lim/lim_reassoc_utils.c b/core/mac/src/pe/lim/lim_reassoc_utils.c index 0cad0ea12694..bdc68d2e2c83 100644 --- a/core/mac/src/pe/lim/lim_reassoc_utils.c +++ b/core/mac/src/pe/lim/lim_reassoc_utils.c @@ -208,6 +208,8 @@ void lim_handle_del_bss_in_re_assoc_context(tpAniSirGlobal pMac, qdf_mem_free(beacon_struct); goto error; } + qdf_mem_free(assocRsp->sha384_ft_subelem.gtk); + qdf_mem_free(assocRsp->sha384_ft_subelem.igtk); qdf_mem_free(assocRsp); qdf_mem_free(beacon_struct); psessionEntry->limAssocResponseData = NULL; @@ -334,6 +336,8 @@ void lim_handle_add_bss_in_re_assoc_context(tpAniSirGlobal pMac, qdf_mem_free(pBeaconStruct); goto Error; } + qdf_mem_free(assocRsp->sha384_ft_subelem.gtk); + qdf_mem_free(assocRsp->sha384_ft_subelem.igtk); qdf_mem_free(assocRsp); psessionEntry->limAssocResponseData = NULL; qdf_mem_free(pBeaconStruct); diff --git a/core/mac/src/pe/lim/lim_session.c b/core/mac/src/pe/lim/lim_session.c index bca6f3666012..1efb25272729 100644 --- a/core/mac/src/pe/lim/lim_session.c +++ b/core/mac/src/pe/lim/lim_session.c @@ -797,6 +797,7 @@ void pe_delete_session(tpAniSirGlobal mac_ctx, tpPESession session) uint16_t i = 0; uint16_t n; TX_TIMER *timer_ptr; + tpSirAssocRsp assoc_rsp; if (!session || (session && !session->valid)) { pe_debug("session already deleted or not valid"); @@ -913,6 +914,9 @@ void pe_delete_session(tpAniSirGlobal mac_ctx, tpPESession session) session->parsedAssocReq = NULL; } if (NULL != session->limAssocResponseData) { + assoc_rsp = (tpSirAssocRsp) session->limAssocResponseData; + qdf_mem_free(assoc_rsp->sha384_ft_subelem.gtk); + qdf_mem_free(assoc_rsp->sha384_ft_subelem.igtk); qdf_mem_free(session->limAssocResponseData); session->limAssocResponseData = NULL; } From 524725964bee5c36a200356768595f047c679a77 Mon Sep 17 00:00:00 2001 From: snandini Date: Wed, 5 Aug 2020 15:49:13 -0700 Subject: [PATCH 011/127] Release 5.2.03.29Y Release 5.2.03.29Y Change-Id: I14ece745b67c7e2e34370a6cd53deaace8faddd8 CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index 0c905b94a313..be8ba9a145b1 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 2 #define QWLAN_VERSION_PATCH 03 -#define QWLAN_VERSION_EXTRA "X" +#define QWLAN_VERSION_EXTRA "Y" #define QWLAN_VERSION_BUILD 29 -#define QWLAN_VERSIONSTR "5.2.03.29X" +#define QWLAN_VERSIONSTR "5.2.03.29Y" #endif /* QWLAN_VERSION_H */ From 8992c6a8a655041543d5819bd3628537d9cd3ab8 Mon Sep 17 00:00:00 2001 From: spuligil Date: Wed, 5 Aug 2020 18:00:50 -0700 Subject: [PATCH 012/127] fw-api: CL 11245227 - update fw common interface files Add WMI_PDEV_PARAM_PCIE_HW_ILP def Change-Id: I90eb31709d12bc515f327a639514cb8207897602 CRs-Fixed: 2262693 --- fw/wmi_unified.h | 3 +++ fw/wmi_version.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 6cd47b8ae8aa..8040c0ca73bc 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -6861,6 +6861,9 @@ typedef enum { */ WMI_PDEV_PARAM_SR_TRIGGER_MARGIN, + /* Param to enable/disable PCIE HW ILP */ + WMI_PDEV_PARAM_PCIE_HW_ILP, + } WMI_PDEV_PARAM; #define WMI_PDEV_ONLY_BSR_TRIG_IS_ENABLED(trig_type) WMI_GET_BITS(trig_type, 0, 1) diff --git a/fw/wmi_version.h b/fw/wmi_version.h index cae687e9332f..b5a0a98e4a13 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 877 +#define __WMI_REVISION_ 878 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work From d562210dcff6932e5a53fda1124a51deb556af7e Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Mon, 20 Jul 2020 21:37:25 +0530 Subject: [PATCH 013/127] qcacld-3.0: Enhance logging in RX path to check refill failures Enable logging feature which helps to check rx ring refill failure. Currently rx ring refill count is updated same time from multiple places without protection, so use atomic variable for refill count. Change-Id: Icd88d351cb15d0f18edf0b986e4de95dbe4e6989 CRs-Fixed: 2740225 --- Kbuild | 2 ++ configs/default_defconfig | 7 ++++++- core/dp/htt/htt.c | 4 ++-- core/dp/htt/htt_internal.h | 6 +++++- core/dp/htt/htt_rx.c | 9 +++++---- core/dp/htt/htt_types.h | 5 +++-- 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Kbuild b/Kbuild index 1f067755cd53..bba0db6d0eec 100644 --- a/Kbuild +++ b/Kbuild @@ -1705,6 +1705,8 @@ cppflags-$(CONFIG_WLAN_HANG_EVENT) += -DWLAN_HANG_EVENT cppflags-$(CONFIG_WLAN_FEATURE_PERIODIC_STA_STATS) += -DWLAN_FEATURE_PERIODIC_STA_STATS +cppflags-$(CONFIG_RX_HASH_DEBUG) += -DRX_HASH_DEBUG + ifeq ($(CONFIG_CNSS), y) ifeq ($(CONFIG_CNSS_SDIO), y) cppflags-y += -DCONFIG_PLD_SDIO_CNSS diff --git a/configs/default_defconfig b/configs/default_defconfig index 67a4e65f9e8a..467d44e834d2 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -656,7 +656,6 @@ endif ifneq ($(TARGET_BUILD_VARIANT),user) CONFIG_DESC_DUP_DETECT_DEBUG := y -CONFIG_DEBUG_RX_RING_BUFFER := y endif CONFIG_DP_TRACE := y @@ -684,4 +683,10 @@ ifeq ($(CONFIG_ARCH_SDM660), y) CONFIG_WLAN_FEATURE_PKT_CAPTURE := y endif +#Enable RX RING buffers debug +CONFIG_DEBUG_RX_RING_BUFFER := y + +#Enable Hash debug +CONFIG_RX_HASH_DEBUG := y + CONFIG_WLAN_HANG_EVENT := y diff --git a/core/dp/htt/htt.c b/core/dp/htt/htt.c index cf33c26aaf25..f5397f34a836 100644 --- a/core/dp/htt/htt.c +++ b/core/dp/htt/htt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014-2018, 2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -807,7 +807,7 @@ void htt_log_rx_ring_info(htt_pdev_handle pdev) "%s: Data Stall Detected with reason 4 (=FW_RX_REFILL_FAILED)." "src htt rx ring: space for %d elements, filled with %d buffers, buffers in the ring %d, refill debt %d", __func__, pdev->rx_ring.size, pdev->rx_ring.fill_level, - pdev->rx_ring.fill_cnt, + qdf_atomic_read(&pdev->rx_ring.fill_cnt), qdf_atomic_read(&pdev->rx_ring.refill_debt)); } diff --git a/core/dp/htt/htt_internal.h b/core/dp/htt/htt_internal.h index fd54f2d2aa6a..94493f2b38c0 100644 --- a/core/dp/htt/htt_internal.h +++ b/core/dp/htt/htt_internal.h @@ -160,7 +160,11 @@ struct htt_host_rx_desc_base { * @posted: time-stamp when HTT message is recived * @recvd : 0x48545452584D5367 ('HTTRXMSG') */ +#ifdef CONFIG_SLUB_DEBUG_ON #define HTT_RX_RING_BUFF_DBG_LIST (8 * 1024) +#else +#define HTT_RX_RING_BUFF_DBG_LIST (4 * 1024) +#endif struct rx_buf_debug { qdf_dma_addr_t paddr; qdf_nbuf_t nbuf; @@ -1017,7 +1021,7 @@ static inline qdf_nbuf_t htt_rx_in_order_netbuf_pop(htt_pdev_handle pdev, qdf_dma_addr_t paddr) { HTT_ASSERT1(htt_rx_in_order_ring_elems(pdev) != 0); - pdev->rx_ring.fill_cnt--; + qdf_atomic_dec(&pdev->rx_ring.fill_cnt); paddr = htt_paddr_trim_to_37(paddr); return htt_rx_hash_list_lookup(pdev, paddr); } diff --git a/core/dp/htt/htt_rx.c b/core/dp/htt/htt_rx.c index 22291f0418b7..ae6d09631e79 100644 --- a/core/dp/htt/htt_rx.c +++ b/core/dp/htt/htt_rx.c @@ -739,7 +739,7 @@ moretofill: } pdev->rx_ring.buf.paddrs_ring[idx] = paddr_marked; - pdev->rx_ring.fill_cnt++; + qdf_atomic_inc(&pdev->rx_ring.fill_cnt); num--; idx++; @@ -1220,7 +1220,7 @@ static inline qdf_nbuf_t htt_rx_netbuf_pop(htt_pdev_handle pdev) idx++; idx &= pdev->rx_ring.size_mask; pdev->rx_ring.sw_rd_idx.msdu_payld = idx; - pdev->rx_ring.fill_cnt--; + qdf_atomic_dec(&pdev->rx_ring.fill_cnt); return msdu; } @@ -2505,7 +2505,8 @@ static void htt_rx_fill_ring_count(htt_pdev_handle pdev) { int num_to_fill; - num_to_fill = pdev->rx_ring.fill_level - pdev->rx_ring.fill_cnt; + num_to_fill = pdev->rx_ring.fill_level - + qdf_atomic_read(&pdev->rx_ring.fill_cnt); htt_rx_ring_fill_n(pdev, num_to_fill /* okay if <= 0 */); } #endif @@ -2992,7 +2993,7 @@ int htt_rx_attach(struct htt_pdev_t *pdev) htt_rx_ring_refill_retry, (void *)pdev, QDF_TIMER_TYPE_SW); - pdev->rx_ring.fill_cnt = 0; + qdf_atomic_init(&pdev->rx_ring.fill_cnt); pdev->rx_ring.pop_fail_cnt = 0; #ifdef DEBUG_DMA_DONE pdev->rx_ring.dbg_ring_idx = 0; diff --git a/core/dp/htt/htt_types.h b/core/dp/htt/htt_types.h index 2f1d49ab603f..7cd8038436d2 100644 --- a/core/dp/htt/htt_types.h +++ b/core/dp/htt/htt_types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014-2018, 2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -288,7 +288,8 @@ struct htt_pdev_t { uint32_t size_mask; /* size - 1, at least 16 bits long */ int fill_level; /* how many rx buffers to keep in the ring */ - int fill_cnt; /* # of rx buffers (full+empty) in the ring */ + /* # of rx buffers (full+empty) in the ring */ + qdf_atomic_t fill_cnt; int pop_fail_cnt; /* # of nebuf pop failures */ /* From 1eb2a84748ffcee3a9e3ef58ff3c82c1300cfbeb Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Mon, 20 Jul 2020 22:28:50 +0530 Subject: [PATCH 014/127] qcacld-3.0: Check refill debt count during rx data stall When rx data stall happens due to ring refill failure check for refill debt count. Change-Id: Ib88074f0e7ed9a64b522a64ff669af87626ce1da CRs-Fixed: 2740233 --- core/dp/htt/htt.c | 5 +++++ core/dp/ol/inc/ol_htt_api.h | 10 +++++++++- core/dp/txrx/ol_txrx.c | 4 +++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/dp/htt/htt.c b/core/dp/htt/htt.c index f5397f34a836..3da5ea4f62d9 100644 --- a/core/dp/htt/htt.c +++ b/core/dp/htt/htt.c @@ -811,6 +811,11 @@ void htt_log_rx_ring_info(htt_pdev_handle pdev) qdf_atomic_read(&pdev->rx_ring.refill_debt)); } +void htt_rx_refill_failure(htt_pdev_handle pdev) +{ + QDF_BUG(qdf_atomic_read(&pdev->rx_ring.refill_debt)); +} + #if HTT_DEBUG_LEVEL > 5 void htt_display(htt_pdev_handle pdev, int indent) { diff --git a/core/dp/ol/inc/ol_htt_api.h b/core/dp/ol/inc/ol_htt_api.h index afb04d2bb2f8..887847afabee 100644 --- a/core/dp/ol/inc/ol_htt_api.h +++ b/core/dp/ol/inc/ol_htt_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014-2018, 2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -195,6 +195,14 @@ void htt_t2h_stats_print(uint8_t *stats_data, int concise); */ void htt_log_rx_ring_info(htt_pdev_handle pdev); +/** + * htt_rx_refill_failure() - During refill failure check if debt is zero + * @pdev: handle to the HTT instance + * + * Return: None + */ +void htt_rx_refill_failure(htt_pdev_handle pdev); + #ifndef HTT_DEBUG_LEVEL #if defined(DEBUG) #define HTT_DEBUG_LEVEL 10 diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index bc83a452b27e..60e647458cfc 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -6202,8 +6202,10 @@ static void ol_txrx_post_data_stall_event( data_stall_info->recovery_type = recovery_type; if (data_stall_info->data_stall_type == - DATA_STALL_LOG_FW_RX_REFILL_FAILED) + DATA_STALL_LOG_FW_RX_REFILL_FAILED) { htt_log_rx_ring_info(pdev->htt_pdev); + htt_rx_refill_failure(pdev->htt_pdev); + } sys_build_message_header(SYS_MSG_ID_DATA_STALL_MSG, &msg); /* Save callback and data */ From cc9dee6c985363c084c98a83da1a63f22bfded63 Mon Sep 17 00:00:00 2001 From: snandini Date: Thu, 6 Aug 2020 16:06:51 -0700 Subject: [PATCH 015/127] Release 5.2.03.29Z Release 5.2.03.29Z Change-Id: Ie8a15b65ff7ab48f5ad0a1889801fdf3ec9259dc CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index be8ba9a145b1..9bafb6405c6b 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 2 #define QWLAN_VERSION_PATCH 03 -#define QWLAN_VERSION_EXTRA "Y" +#define QWLAN_VERSION_EXTRA "Z" #define QWLAN_VERSION_BUILD 29 -#define QWLAN_VERSIONSTR "5.2.03.29Y" +#define QWLAN_VERSIONSTR "5.2.03.29Z" #endif /* QWLAN_VERSION_H */ From f41312c246fc2a4ac1ea40d334e81b4f968674bd Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Wed, 31 Jul 2019 19:21:05 +0530 Subject: [PATCH 016/127] qcacld-3.0: Disable tx beam forming for NDI vdev Do not set tx beam forming related ie's in ht cap, vht cap, he cap when set IE command is sent to FW for NDI vdev. Change-Id: If629eedeab5d35b1799c6eb5ee7d71726ada262a CRs-Fixed: 2499132 --- core/mac/src/pe/lim/lim_utils.c | 50 ++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index f1c2ee5377cf..ada5e6f3666b 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -6503,6 +6503,19 @@ QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, tSirMacVHTCapabilityInfo *p_vht_cap = (tSirMacVHTCapabilityInfo *)(&vht_caps[2]); QDF_STATUS status; + struct wlan_objmgr_vdev *vdev; + enum QDF_OPMODE device_mode; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc( + mac_ctx->psoc, vdev_id, + WLAN_LEGACY_MAC_ID); + if (!vdev) { + pe_err("vdev is NULL"); + return QDF_STATUS_E_FAILURE; + } + device_mode = wlan_vdev_mlme_get_opmode(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); + /* * Note: Do not use Dot11f VHT structure, since 1 byte present flag in @@ -6523,8 +6536,14 @@ QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, p_ht_cap->supportedChannelWidthSet = 0; p_ht_cap->shortGI40MHz = 0; } + lim_populate_mcs_set_ht_per_vdev(mac_ctx, p_ht_cap, vdev_id, NSS_CHAINS_BAND_2GHZ); + if (device_mode == QDF_NDI_MODE) { + p_ht_cap->txBF = 0; + p_ht_cap->implicitTxBF = 0; + p_ht_cap->explicitCSITxBF = 0; + } lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HTCAPS, CDS_BAND_2GHZ, &ht_caps[2], DOT11F_IE_HTCAPS_MIN_LEN); @@ -6560,6 +6579,13 @@ QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, lim_populate_mcs_set_vht_per_vdev(mac_ctx, vht_caps, vdev_id, NSS_CHAINS_BAND_5GHZ); + if (device_mode == QDF_NDI_MODE) { + p_vht_cap->muBeamformeeCap = 0; + p_vht_cap->muBeamformerCap = 0; + p_vht_cap->suBeamformeeCap = 0; + p_vht_cap->suBeamFormerCap = 0; + } + /* Self VHT channel width for 5G is already negotiated with FW */ lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_VHTCAPS, CDS_BAND_5GHZ, &vht_caps[2], DOT11F_IE_VHTCAPS_MIN_LEN); @@ -7858,6 +7884,18 @@ QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, tpPESession session, uint8_t he_caps[SIR_MAC_HE_CAP_MIN_LEN + 3]; struct he_capability_info *he_cap; QDF_STATUS status_5g, status_2g; + struct wlan_objmgr_vdev *vdev; + enum QDF_OPMODE device_mode; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc( + mac_ctx->psoc, vdev_id, + WLAN_LEGACY_MAC_ID); + if (!vdev) { + pe_err("vdev is NULL"); + return QDF_STATUS_E_FAILURE; + } + device_mode = wlan_vdev_mlme_get_opmode(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); /* Sending only minimal info(no PPET) to FW now, update if required */ qdf_mem_zero(he_caps, SIR_MAC_HE_CAP_MIN_LEN + 3); @@ -7868,7 +7906,17 @@ QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, tpPESession session, SIR_MAC_HE_CAP_MIN_LEN + 3); he_cap = (struct he_capability_info *) (&he_caps[2 + HE_CAP_OUI_SIZE]); he_cap->ppet_present = 0; - + if (device_mode == QDF_NDI_MODE) { + he_cap->su_beamformee = 0; + he_cap->su_beamformer = 0; + he_cap->mu_beamformer = 0; + he_cap->bfee_sts_gt_80 = 0; + he_cap->bfee_sts_lt_80 = 0; + he_cap->num_sounding_gt_80 = 0; + he_cap->num_sounding_lt_80 = 0; + he_cap->su_feedback_tone16 = 0; + he_cap->mu_feedback_tone16 = 0; + } status_5g = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HE_CAP, CDS_BAND_5GHZ, &he_caps[2], SIR_MAC_HE_CAP_MIN_LEN + 1); From 0270280eded0e716069993f8b9b509fc45f49b82 Mon Sep 17 00:00:00 2001 From: snandini Date: Thu, 6 Aug 2020 23:47:12 -0700 Subject: [PATCH 017/127] Release 5.2.03.30 Release 5.2.03.30 Change-Id: I589aa785b178b143f14aa5b1442a680e1ed674c7 CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index 9bafb6405c6b..cdd739a9f150 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 2 #define QWLAN_VERSION_PATCH 03 -#define QWLAN_VERSION_EXTRA "Z" -#define QWLAN_VERSION_BUILD 29 +#define QWLAN_VERSION_EXTRA "" +#define QWLAN_VERSION_BUILD 30 -#define QWLAN_VERSIONSTR "5.2.03.29Z" +#define QWLAN_VERSIONSTR "5.2.03.30" #endif /* QWLAN_VERSION_H */ From caa2ce89f14458c3667ff6a8dad05fa05158e2ae Mon Sep 17 00:00:00 2001 From: Baowei Liu Date: Wed, 17 Jun 2020 15:17:52 +0800 Subject: [PATCH 018/127] qcacmn: Improve 'Not set force_set if event completed' Original changes have problems and have been reverted. This is improved fix, the difference is set event done flag before complete Original submit is I31f947169153ccbeb8435c539faab1059c055c04 Revert submit is If8318b28883ae8ddd4fee36013f28c45f30fa426 Change-Id: I72814381a3ee932c9ff43fdae7d2dda5619baa48 --- qdf/linux/src/i_qdf_event.h | 2 ++ qdf/linux/src/qdf_event.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/qdf/linux/src/i_qdf_event.h b/qdf/linux/src/i_qdf_event.h index 41726f934dc1..5d26c7d9a36a 100644 --- a/qdf/linux/src/i_qdf_event.h +++ b/qdf/linux/src/i_qdf_event.h @@ -30,11 +30,13 @@ * qdf_event_t - manages events * @complete: instance to completion * @cookie: unsigned int + * @done: indicate completion * @force_set: indicate forceful completion */ typedef struct qdf_evt { struct completion complete; uint32_t cookie; + bool done; bool force_set; } __qdf_event_t; diff --git a/qdf/linux/src/qdf_event.c b/qdf/linux/src/qdf_event.c index a4494b36a5db..025f2e43378b 100644 --- a/qdf/linux/src/qdf_event.c +++ b/qdf/linux/src/qdf_event.c @@ -100,6 +100,7 @@ QDF_STATUS qdf_event_set(qdf_event_t *event) if (event->cookie != LINUX_EVENT_COOKIE) return QDF_STATUS_E_INVAL; + event->done = true; complete(&event->complete); return QDF_STATUS_SUCCESS; @@ -133,6 +134,7 @@ QDF_STATUS qdf_event_reset(qdf_event_t *event) return QDF_STATUS_E_INVAL; /* (re)initialize event */ + event->done = false; event->force_set = false; INIT_COMPLETION(event->complete); @@ -252,8 +254,10 @@ void qdf_complete_wait_events(void) event_node = qdf_container_of(list_node, struct qdf_evt_node, node); - event_node->pevent->force_set = true; - qdf_event_set(event_node->pevent); + if (!event_node->pevent->done) { + event_node->pevent->force_set = true; + qdf_event_set(event_node->pevent); + } status = qdf_list_peek_next(&qdf_wait_event_list, &event_node->node, &list_node); From afaa6d65319a292a433f47d524d8f186b2f75786 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Wed, 29 Jul 2020 20:44:36 +0530 Subject: [PATCH 019/127] qcacld-3.0: Do not send HT, VHT and HE ie's to FW in all the modes Send HT ie's to FW in AUTO, 11N, 11AC and 11AX modes. Send VHT ie's to FW in AUTO, 11C, and 11AX modes. Send HE ie's to FW in AUTO and 11AX modes. Change-Id: I0ed7b0108593ee20540d4e5da2c1461a4a15e8fc CRs-Fixed: 2748761 --- core/mac/src/pe/lim/lim_utils.c | 250 ++++++++++++++++++++++++-------- core/mac/src/pe/lim/lim_utils.h | 6 +- 2 files changed, 195 insertions(+), 61 deletions(-) diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index ada5e6f3666b..014b9a0dce40 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -6483,51 +6483,95 @@ end: } /** - * lim_send_ies_per_band() - gets ht and vht capability and send to firmware via - * wma + * is_dot11mode_support_ht_cap() - Check dot11mode supports HT capability + * @dot11mode: dot11mode + * + * This function checks whether dot11mode support HT capability or not + * + * Return: True, if supports. False otherwise + */ +static bool is_dot11mode_support_ht_cap(enum csr_cfgdot11mode dot11mode) +{ + if ((dot11mode == eCSR_CFG_DOT11_MODE_AUTO) || + (dot11mode == eCSR_CFG_DOT11_MODE_11N) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AC) || + (dot11mode == eCSR_CFG_DOT11_MODE_11N_ONLY) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AC_ONLY) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AX) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AX_ONLY)) { + return true; + } + + return false; +} + +/** + * is_dot11mode_support_vht_cap() - Check dot11mode supports VHT capability + * @dot11mode: dot11mode + * + * This function checks whether dot11mode support VHT capability or not + * + * Return: True, if supports. False otherwise + */ +static bool is_dot11mode_support_vht_cap(enum csr_cfgdot11mode dot11mode) +{ + if ((dot11mode == eCSR_CFG_DOT11_MODE_AUTO) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AC) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AC_ONLY) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AX) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AX_ONLY)) { + return true; + } + + return false; +} + +/** + * is_dot11mode_support_he_cap() - Check dot11mode supports HE capability + * @dot11mode: dot11mode + * + * This function checks whether dot11mode support HE capability or not + * + * Return: True, if supports. False otherwise + */ +static bool is_dot11mode_support_he_cap(enum csr_cfgdot11mode dot11mode) +{ + if ((dot11mode == eCSR_CFG_DOT11_MODE_AUTO) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AX) || + (dot11mode == eCSR_CFG_DOT11_MODE_11AX_ONLY)) { + return true; + } + + return false; +} + +/** + * lim_send_ht_caps_ie() - gets HT capability and send to firmware via wma * @mac_ctx: global mac context * @session: pe session. This can be NULL. In that case self cap will be sent + * @device_mode: VDEV op mode * @vdev_id: vdev for which IE is targeted * - * This funciton gets ht and vht capability and send to firmware via wma + * This function gets HT capability and send to firmware via wma * - * Return: status of operation + * Return: QDF_STATUS */ -QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, - tpPESession session, - uint8_t vdev_id) +static QDF_STATUS lim_send_ht_caps_ie(tpAniSirGlobal mac_ctx, + tpPESession session, + enum QDF_OPMODE device_mode, + uint8_t vdev_id) { uint8_t ht_caps[DOT11F_IE_HTCAPS_MIN_LEN + 2] = {0}; - uint8_t vht_caps[DOT11F_IE_VHTCAPS_MAX_LEN + 2] = {0}; tHtCaps *p_ht_cap = (tHtCaps *)(&ht_caps[2]); - tSirMacVHTCapabilityInfo *p_vht_cap = - (tSirMacVHTCapabilityInfo *)(&vht_caps[2]); - QDF_STATUS status; - struct wlan_objmgr_vdev *vdev; - enum QDF_OPMODE device_mode; + QDF_STATUS status_5g, status_2g; - vdev = wlan_objmgr_get_vdev_by_id_from_psoc( - mac_ctx->psoc, vdev_id, - WLAN_LEGACY_MAC_ID); - if (!vdev) { - pe_err("vdev is NULL"); - return QDF_STATUS_E_FAILURE; - } - device_mode = wlan_vdev_mlme_get_opmode(vdev); - wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); - - - /* - * Note: Do not use Dot11f VHT structure, since 1 byte present flag in - * it is causing weird padding errors. Instead use Sir Mac VHT struct - * to send IE to wma. - */ ht_caps[0] = DOT11F_EID_HTCAPS; ht_caps[1] = DOT11F_IE_HTCAPS_MIN_LEN; lim_set_ht_caps(mac_ctx, session, ht_caps, DOT11F_IE_HTCAPS_MIN_LEN + 2); /* Get LDPC and over write for 2G */ - p_ht_cap->advCodingCap = lim_get_rx_ldpc(mac_ctx, CHAN_ENUM_6); + p_ht_cap->advCodingCap = lim_get_rx_ldpc(mac_ctx, + CHAN_ENUM_6); /* Get self cap for HT40 support in 2G */ if (mac_ctx->roam.configParam.channelBondingMode24GHz) { p_ht_cap->supportedChannelWidthSet = 1; @@ -6545,8 +6589,9 @@ QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, p_ht_cap->explicitCSITxBF = 0; } - lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HTCAPS, - CDS_BAND_2GHZ, &ht_caps[2], DOT11F_IE_HTCAPS_MIN_LEN); + status_2g = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HTCAPS, + CDS_BAND_2GHZ, &ht_caps[2], + DOT11F_IE_HTCAPS_MIN_LEN); /* * Get LDPC and over write for 5G - using channel 64 because it * is available in all reg domains. @@ -6562,22 +6607,49 @@ QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, } lim_populate_mcs_set_ht_per_vdev(mac_ctx, p_ht_cap, vdev_id, NSS_CHAINS_BAND_5GHZ); + status_5g = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HTCAPS, + CDS_BAND_5GHZ, &ht_caps[2], + DOT11F_IE_HTCAPS_MIN_LEN); - lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HTCAPS, - CDS_BAND_5GHZ, &ht_caps[2], DOT11F_IE_HTCAPS_MIN_LEN); + if (QDF_IS_STATUS_SUCCESS(status_2g) && + QDF_IS_STATUS_SUCCESS(status_5g)) + return QDF_STATUS_SUCCESS; + + return QDF_STATUS_E_FAILURE; +} + +/** + * lim_send_vht_caps_ie() - gets VHT capability and send to firmware via wma + * @mac_ctx: global mac context + * @session: pe session. This can be NULL. In that case self cap will be sent + * @device_mode: VDEV op mode + * @vdev_id: vdev for which IE is targeted + * + * This function gets VHT capability and send to firmware via wma + * + * Return: QDF_STATUS + */ +static QDF_STATUS lim_send_vht_caps_ie(tpAniSirGlobal mac_ctx, + tpPESession session, + enum QDF_OPMODE device_mode, + uint8_t vdev_id) +{ + uint8_t vht_caps[DOT11F_IE_VHTCAPS_MAX_LEN + 2] = {0}; + tSirMacVHTCapabilityInfo *p_vht_cap = + (tSirMacVHTCapabilityInfo *)(&vht_caps[2]); + QDF_STATUS status_5g, status_2g; vht_caps[0] = DOT11F_EID_VHTCAPS; vht_caps[1] = DOT11F_IE_VHTCAPS_MAX_LEN; lim_set_vht_caps(mac_ctx, session, vht_caps, - DOT11F_IE_VHTCAPS_MIN_LEN + 2); + DOT11F_IE_VHTCAPS_MIN_LEN + 2); /* * Get LDPC and over write for 5G - using channel 64 because it * is available in all reg domains. */ p_vht_cap->ldpcCodingCap = lim_get_rx_ldpc(mac_ctx, CHAN_ENUM_64); - /* Self VHT channel width for 5G is already negotiated with FW */ - lim_populate_mcs_set_vht_per_vdev(mac_ctx, vht_caps, - vdev_id, NSS_CHAINS_BAND_5GHZ); + lim_populate_mcs_set_vht_per_vdev(mac_ctx, vht_caps, vdev_id, + NSS_CHAINS_BAND_5GHZ); if (device_mode == QDF_NDI_MODE) { p_vht_cap->muBeamformeeCap = 0; @@ -6585,9 +6657,13 @@ QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, p_vht_cap->suBeamformeeCap = 0; p_vht_cap->suBeamFormerCap = 0; } - /* Self VHT channel width for 5G is already negotiated with FW */ - lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_VHTCAPS, - CDS_BAND_5GHZ, &vht_caps[2], DOT11F_IE_VHTCAPS_MIN_LEN); + /* + * Self VHT channel width for 5G is already negotiated + * with FW + */ + status_5g = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_VHTCAPS, + CDS_BAND_5GHZ, &vht_caps[2], + DOT11F_IE_VHTCAPS_MIN_LEN); /* Get LDPC and over write for 2G */ p_vht_cap->ldpcCodingCap = lim_get_rx_ldpc(mac_ctx, CHAN_ENUM_6); @@ -6595,15 +6671,76 @@ QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, p_vht_cap->supportedChannelWidthSet = 0; p_vht_cap->shortGI80MHz = 0; p_vht_cap->shortGI160and80plus80MHz = 0; - lim_populate_mcs_set_vht_per_vdev(mac_ctx, vht_caps, - vdev_id, NSS_CHAINS_BAND_2GHZ); + lim_populate_mcs_set_vht_per_vdev(mac_ctx, vht_caps, vdev_id, + NSS_CHAINS_BAND_2GHZ); + status_2g = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_VHTCAPS, + CDS_BAND_2GHZ, &vht_caps[2], + DOT11F_IE_VHTCAPS_MIN_LEN); - lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_VHTCAPS, - CDS_BAND_2GHZ, &vht_caps[2], DOT11F_IE_VHTCAPS_MIN_LEN); + if (QDF_IS_STATUS_SUCCESS(status_2g) && + QDF_IS_STATUS_SUCCESS(status_5g)) + return QDF_STATUS_SUCCESS; - status = lim_send_he_caps_ie(mac_ctx, session, vdev_id); + return QDF_STATUS_E_FAILURE; +} - return status; +/** + * lim_send_ies_per_band() - gets ht and vht capability and send to firmware via + * wma + * @mac_ctx: global mac context + * @session: pe session. This can be NULL. In that case self cap will be sent + * @vdev_id: vdev for which IE is targeted + * + * This funciton gets ht and vht capability and send to firmware via wma + * + * Return: status of operation + */ +QDF_STATUS lim_send_ies_per_band(tpAniSirGlobal mac_ctx, + tpPESession session, + uint8_t vdev_id) +{ + struct wlan_objmgr_vdev *vdev; + enum QDF_OPMODE device_mode; + QDF_STATUS status_ht = QDF_STATUS_SUCCESS; + QDF_STATUS status_vht = QDF_STATUS_SUCCESS; + QDF_STATUS status_he = QDF_STATUS_SUCCESS; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc( + mac_ctx->psoc, vdev_id, + WLAN_LEGACY_MAC_ID); + if (!vdev) { + pe_err("vdev is NULL"); + return QDF_STATUS_E_FAILURE; + } + device_mode = wlan_vdev_mlme_get_opmode(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); + + /* + * Note: Do not use Dot11f VHT structure, since 1 byte present flag in + * it is causing weird padding errors. Instead use Sir Mac VHT struct + * to send IE to wma. + */ + if (is_dot11mode_support_ht_cap( + mac_ctx->roam.configParam.uCfgDot11Mode)) + status_ht = lim_send_ht_caps_ie(mac_ctx, session, + device_mode, vdev_id); + + if (is_dot11mode_support_vht_cap( + mac_ctx->roam.configParam.uCfgDot11Mode)) + status_vht = lim_send_vht_caps_ie(mac_ctx, session, + device_mode, vdev_id); + + if (is_dot11mode_support_he_cap( + mac_ctx->roam.configParam.uCfgDot11Mode)) + status_he = lim_send_he_caps_ie(mac_ctx, session, + device_mode, vdev_id); + + if (QDF_IS_STATUS_SUCCESS(status_ht) && + QDF_IS_STATUS_SUCCESS(status_vht) && + QDF_IS_STATUS_SUCCESS(status_he)) + return QDF_STATUS_SUCCESS; + + return QDF_STATUS_E_FAILURE; } /** @@ -7878,24 +8015,17 @@ void lim_set_he_caps(tpAniSirGlobal mac, tpPESession session, uint8_t *ie_start, } } -QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, tpPESession session, +QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, + tpPESession session, + enum QDF_OPMODE device_mode, uint8_t vdev_id) { uint8_t he_caps[SIR_MAC_HE_CAP_MIN_LEN + 3]; struct he_capability_info *he_cap; QDF_STATUS status_5g, status_2g; - struct wlan_objmgr_vdev *vdev; - enum QDF_OPMODE device_mode; - - vdev = wlan_objmgr_get_vdev_by_id_from_psoc( - mac_ctx->psoc, vdev_id, - WLAN_LEGACY_MAC_ID); - if (!vdev) { - pe_err("vdev is NULL"); - return QDF_STATUS_E_FAILURE; - } - device_mode = wlan_vdev_mlme_get_opmode(vdev); - wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); + uint8_t he_cap_total_len = SIR_MAC_HE_CAP_MIN_LEN + HE_CAP_OUI_LEN + + HE_CAP_160M_MCS_MAP_LEN + + HE_CAP_80P80_MCS_MAP_LEN; /* Sending only minimal info(no PPET) to FW now, update if required */ qdf_mem_zero(he_caps, SIR_MAC_HE_CAP_MIN_LEN + 3); diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index 6e8ce102d4b8..da2839c0519e 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -1159,13 +1159,16 @@ void lim_set_he_caps(tpAniSirGlobal mac, tpPESession session, * lim_send_he_caps_ie() - gets HE capability and send to firmware via wma * @mac_ctx: global mac context * @session: pe session. This can be NULL. In that case self cap will be sent + * @device_mode: VDEV op mode * @vdev_id: vdev for which IE is targeted * * This function gets HE capability and send to firmware via wma * * Return: QDF_STATUS */ -QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, tpPESession session, +QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, + tpPESession session, + enum QDF_OPMODE device_mode, uint8_t vdev_id); /** @@ -1301,6 +1304,7 @@ static inline void lim_set_he_caps(tpAniSirGlobal mac, tpPESession session, static inline QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, tpPESession session, + enum QDF_OPMODE device_mode, uint8_t vdev_id) { return QDF_STATUS_SUCCESS; From 9e45dbde0fd609cb9fd9847e03163b26919902c8 Mon Sep 17 00:00:00 2001 From: snandini Date: Fri, 7 Aug 2020 12:07:58 -0700 Subject: [PATCH 020/127] Release 5.2.03.30A Release 5.2.03.30A Change-Id: Ica26852124c0d61dba5b3a2e917e368b72d68f58 CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index cdd739a9f150..a5e3a0af9ead 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 2 #define QWLAN_VERSION_PATCH 03 -#define QWLAN_VERSION_EXTRA "" +#define QWLAN_VERSION_EXTRA "A" #define QWLAN_VERSION_BUILD 30 -#define QWLAN_VERSIONSTR "5.2.03.30" +#define QWLAN_VERSIONSTR "5.2.03.30A" #endif /* QWLAN_VERSION_H */ From 4cc564a35d9e98b56cf7bac96bc819761810c774 Mon Sep 17 00:00:00 2001 From: Abhishek Ambure Date: Mon, 10 Aug 2020 11:18:45 +0530 Subject: [PATCH 021/127] qcacmn: Do not hold the lock for a long time in timer delete function On NOL timer expiry, timer callback handler dfs_remove_from_nol is called. It acquires dfs_nol_lock at various instances while accessing the elements of NOL list like deleting an NOL element, printing or copying the elements of NOL. Also, there is a thread scheduled in the callback handler dfs_nol_elem_free_work to free the NOL element memory after all operations. This thread does a del_timer_sync and hence waits for the timer handler to complete operation before freeing the NOL timer element. Consider a case where nol timer expires on channel (say chan 100) and the timer handler is called on core1 of CPU. After all cleanup operations, the thread to free NOL timer element is scheduled and acquires an NOL lock. The lock will be released only after del_timer_sync succeeds in its operation for which the handler (dfs_remove_from_nol) must have finished executing on other CPUs. While the Lock is held by Core1, nol timer expires on another channel (say chan 120) and timer handler function dfs_remove_from_nol is called from CPU Core0. In the handler, the same NOL lock is tried to be acquired. Since it is already held by cleanup thread, it spins. del_timer_sync fails to succeed in its timer cleanup as the handler function dfs_remove_from_nol is executing on another CPU. It waits for the handler to finish execution and handler waits for the lock acquired by the thread. It runs into a deadlock. Release the NOL lock before calling del_timer_sync. This will give a chance for the handler to execute. Acquire the lock again when the next element is removed from the free list. Change-Id: I822714edee3269ccbb93838e3892796219e1b88e CRs-Fixed: 2301063 --- umac/dfs/core/src/misc/dfs_nol.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/umac/dfs/core/src/misc/dfs_nol.c b/umac/dfs/core/src/misc/dfs_nol.c index 3db800552121..e345ad04e18e 100644 --- a/umac/dfs/core/src/misc/dfs_nol.c +++ b/umac/dfs/core/src/misc/dfs_nol.c @@ -126,7 +126,9 @@ static void dfs_nol_elem_free_work_cb(void *context) tmp_nol_entry) { TAILQ_REMOVE(&dfs->dfs_nol_free_list, nol_entry, nolelem_list); + WLAN_DFSNOL_UNLOCK(dfs); qdf_timer_free(&nol_entry->nol_timer); + WLAN_DFSNOL_LOCK(dfs); qdf_mem_free(nol_entry); } WLAN_DFSNOL_UNLOCK(dfs); From 646f46ace01502644c60f6ca107525a7a135e6fc Mon Sep 17 00:00:00 2001 From: Shashikala Prabhu Date: Wed, 26 Sep 2018 12:23:25 +0530 Subject: [PATCH 022/127] qcacmn: Fix the nol timeout panic In macro TAILQ_FOREACH_SAFE, var and tvar point to current head and the next element respectively. If we unlock the spinlock inside the for loop and then lock it again, there is a chance (race) that the next element is pointed to by another thread of execution and both of them may try to remove the same element at the same time. This may lead to panic. Instead of using TAILQ_FOREACH_SAFE macro remove the element from the list one by one using a while loop from the head of the list. Do not lock the entire while loop, instead lock only during the removal of element from the list. This is required because we want to wait for the dfs_remove_from_nol timer to complete. But the wait should not be done from inside the lock because the same lock is used by the dfs_remove_from_nol timer. Change-Id: If820dbb1789b7fcfc33c133b3f90968377bfbf3c CRs-Fixed: 2322831 --- umac/dfs/core/src/misc/dfs_nol.c | 53 ++++++++++++++++---------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/umac/dfs/core/src/misc/dfs_nol.c b/umac/dfs/core/src/misc/dfs_nol.c index e345ad04e18e..3be3d6877646 100644 --- a/umac/dfs/core/src/misc/dfs_nol.c +++ b/umac/dfs/core/src/misc/dfs_nol.c @@ -116,22 +116,24 @@ static os_timer_func(dfs_nol_timeout) static void dfs_nol_elem_free_work_cb(void *context) { struct wlan_dfs *dfs = (struct wlan_dfs *)context; - struct dfs_nolelem *tmp_nol_entry, *nol_entry; + struct dfs_nolelem *nol_head; - WLAN_DFSNOL_LOCK(dfs); - if (!TAILQ_EMPTY(&dfs->dfs_nol_free_list)) - TAILQ_FOREACH_SAFE(nol_entry, - &dfs->dfs_nol_free_list, - nolelem_list, - tmp_nol_entry) { - TAILQ_REMOVE(&dfs->dfs_nol_free_list, - nol_entry, nolelem_list); + while (true) { + WLAN_DFSNOL_LOCK(dfs); + + nol_head = TAILQ_FIRST(&dfs->dfs_nol_free_list); + if (nol_head) { + TAILQ_REMOVE(&dfs->dfs_nol_free_list, nol_head, + nolelem_list); WLAN_DFSNOL_UNLOCK(dfs); - qdf_timer_free(&nol_entry->nol_timer); - WLAN_DFSNOL_LOCK(dfs); - qdf_mem_free(nol_entry); + + qdf_timer_free(&nol_head->nol_timer); + qdf_mem_free(nol_head); + } else { + WLAN_DFSNOL_UNLOCK(dfs); + break; } - WLAN_DFSNOL_UNLOCK(dfs); + } } void dfs_nol_timer_init(struct wlan_dfs *dfs) @@ -544,23 +546,22 @@ void dfs_nol_timer_cleanup(struct wlan_dfs *dfs) { struct dfs_nolelem *nol; - WLAN_DFSNOL_LOCK(dfs); - nol = dfs->dfs_nol; - while (nol) { - dfs->dfs_nol = nol->nol_next; - dfs->dfs_nol_count--; - /* - * Unlock is required so that when we sync with the - * nol_timeout timer we do not run into deadlock. - */ - WLAN_DFSNOL_UNLOCK(dfs); - qdf_timer_free(&nol->nol_timer); + while (true) { WLAN_DFSNOL_LOCK(dfs); - qdf_mem_free(nol); nol = dfs->dfs_nol; + if (nol) { + dfs->dfs_nol = nol->nol_next; + dfs->dfs_nol_count--; + WLAN_DFSNOL_UNLOCK(dfs); + + qdf_timer_free(&nol->nol_timer); + qdf_mem_free(nol); + } else { + WLAN_DFSNOL_UNLOCK(dfs); + break; + } } - WLAN_DFSNOL_UNLOCK(dfs); } void dfs_nol_workqueue_cleanup(struct wlan_dfs *dfs) From 5c1bb77fef9601f887c75b0a7b978d83fe19ff74 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Tue, 28 Jul 2020 14:31:38 +0530 Subject: [PATCH 023/127] qcacmn: Fix NULL pointer dereference of roam stats event param buf In extract_roam_scan_ap_stats_tlv, if param buf is null, null pointer dereference can happen while trying to access num_roam_ap_info in the error message print. Return failure if param_buf is NULL Change-Id: I9f5cbb5534d1ef58bb9406ba8dc0aa68a9f8c194 CRs-Fixed: 2669350 --- wmi/src/wmi_unified_tlv.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 410fa1cea5cb..6756bab99b64 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -23962,7 +23962,12 @@ extract_roam_scan_ap_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint8_t i; param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf; - if (!param_buf || ap_idx >= param_buf->num_roam_ap_info) { + if (!param_buf) { + WMI_LOGE("%s Param buf is NULL", __func__); + return QDF_STATUS_E_FAILURE; + } + + if (ap_idx >= param_buf->num_roam_ap_info) { WMI_LOGE("Invalid roam scan AP tlv ap_idx:%d total_ap:%d", ap_idx, param_buf->num_roam_ap_info); return QDF_STATUS_E_FAILURE; From 57e7c47daa1cae8cb8c1450ad359027bac68fb9b Mon Sep 17 00:00:00 2001 From: mtk81325 Date: Thu, 6 Aug 2020 12:00:27 +0800 Subject: [PATCH 024/127] ANDROID: Incremental fs: fix magic compatibility again It's still magic number issue which cannot be compatible with arm-32 platform, although we try to fix it in Iae4f3877444 ("ANDROID: Incremental fs: magic number compatible 32-bit"), there is still incompatible scenario, such as: get_incfs_node(), it will return NULL then kernel exception will be trigger because of NULL pointer access. (inode_set() -> get_incfs_node(), then used node->xxx directly) We change magic number directly, otherwise, we must fix above issues one by one. Bug: 159772865 Fixes: Iae4f3877444("ANDROID: Incremental fs: magic number compatible 32-bit") Signed-off-by: Peng Zhou Signed-off-by: mtk81325 Change-Id: I71f279c1bb55ea296ab33a47644f30df4a9f60a6 Signed-off-by: Paul Lawrence --- fs/incfs/vfs.c | 2 +- include/uapi/linux/incrementalfs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c index ea29534bea53..b5ec4edc3b7a 100644 --- a/fs/incfs/vfs.c +++ b/fs/incfs/vfs.c @@ -2180,7 +2180,7 @@ struct dentry *incfs_mount_fs(struct file_system_type *type, int flags, sb->s_op = &incfs_super_ops; sb->s_d_op = &incfs_dentry_ops; sb->s_flags |= S_NOATIME; - sb->s_magic = (long)INCFS_MAGIC_NUMBER; + sb->s_magic = INCFS_MAGIC_NUMBER; sb->s_time_gran = 1; sb->s_blocksize = INCFS_DATA_FILE_BLOCK_SIZE; sb->s_blocksize_bits = blksize_bits(sb->s_blocksize); diff --git a/include/uapi/linux/incrementalfs.h b/include/uapi/linux/incrementalfs.h index 13c3d5173e14..71efcf3d1a51 100644 --- a/include/uapi/linux/incrementalfs.h +++ b/include/uapi/linux/incrementalfs.h @@ -18,7 +18,7 @@ /* ===== constants ===== */ #define INCFS_NAME "incremental-fs" -#define INCFS_MAGIC_NUMBER (0x5346434e49ul) +#define INCFS_MAGIC_NUMBER (unsigned long)(0x5346434e49ul) #define INCFS_DATA_FILE_BLOCK_SIZE 4096 #define INCFS_HEADER_VER 1 From 6c5415d0ae83ac7ff9d56f770e4a3f5f4e7e3158 Mon Sep 17 00:00:00 2001 From: Zhaoyang Liu Date: Fri, 15 Mar 2019 13:49:58 +0800 Subject: [PATCH 025/127] qcacld-3.0: Fix issues about uninitialized variables Fix issues that variables used without initialization. Change-Id: I40d7054a719bf8a442d153beeb4c9aa38bcad373 CRs-Fixed: 2416837 --- core/mac/src/pe/lim/lim_assoc_utils.c | 18 ++++++++++-------- .../src/pe/lim/lim_process_sme_req_messages.c | 2 +- core/sap/src/sap_module.c | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c index 0a8b3deb4d30..6ac0ca371464 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/core/mac/src/pe/lim/lim_assoc_utils.c @@ -353,7 +353,8 @@ uint8_t lim_check_rx_rsn_ie_match(tpAniSirGlobal mac_ctx, bool *pmf_connection) { tDot11fIERSN *rsn_ie; - uint8_t i, j, match, only_non_ht_cipher = 1; + bool match = false; + uint8_t i, j, only_non_ht_cipher = 1; #ifdef WLAN_FEATURE_11W bool we_are_pmf_capable; bool we_require_pmf; @@ -380,7 +381,7 @@ uint8_t lim_check_rx_rsn_ie_match(tpAniSirGlobal mac_ctx, if (!qdf_mem_cmp(&rx_rsn_ie->akm_suite[0], &rsn_ie->akm_suite[i], sizeof(rsn_ie->akm_suite[i]))) { - match = 1; + match = true; break; } if (!match) { @@ -400,13 +401,13 @@ uint8_t lim_check_rx_rsn_ie_match(tpAniSirGlobal mac_ctx, * For each Pairwise cipher suite check whether we support * received pairwise */ - match = 0; + match = false; for (i = 0; i < rx_rsn_ie->pwise_cipher_suite_count; i++) { for (j = 0; j < rsn_ie->pwise_cipher_suite_count; j++) { if (!qdf_mem_cmp(&rx_rsn_ie->pwise_cipher_suites[i], &rsn_ie->pwise_cipher_suites[j], sizeof(rsn_ie->pwise_cipher_suites[j]))) { - match = 1; + match = true; break; } } @@ -488,7 +489,8 @@ lim_check_rx_wpa_ie_match(tpAniSirGlobal mac, tDot11fIEWPA rx_wpaie, tpPESession session_entry, uint8_t sta_is_ht) { tDot11fIEWPA *wpa_ie; - uint8_t i, j, match, only_non_ht_cipher = 1; + bool match = false; + uint8_t i, j, only_non_ht_cipher = 1; /* WPA IE should be received from PE */ wpa_ie = &session_entry->gStartBssWPAIe; @@ -504,7 +506,7 @@ lim_check_rx_wpa_ie_match(tpAniSirGlobal mac, tDot11fIEWPA rx_wpaie, if (!qdf_mem_cmp(&rx_wpaie.auth_suites[0], &wpa_ie->auth_suites[i], sizeof(wpa_ie->auth_suites[i]))) { - match = 1; + match = true; break; } if (!match) { @@ -524,12 +526,12 @@ lim_check_rx_wpa_ie_match(tpAniSirGlobal mac, tDot11fIEWPA rx_wpaie, * For each Pairwise cipher suite check whether we support * received pairwise */ - match = 0; + match = false; for (i = 0; i < rx_wpaie.unicast_cipher_count; i++) { for (j = 0; j < wpa_ie->unicast_cipher_count; j++) { if (!qdf_mem_cmp(rx_wpaie.unicast_ciphers[i], wpa_ie->unicast_ciphers[j], 4)) { - match = 1; + match = true; break; } } diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index c5b6b165f8c9..9dfc25a29cad 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -3062,7 +3062,7 @@ void __lim_process_sme_assoc_cnf_new(tpAniSirGlobal mac_ctx, uint32_t msg_type, if (msg_buf == NULL) { pe_err("msg_buf is NULL"); - goto end; + return; } qdf_mem_copy(&assoc_cnf, msg_buf, sizeof(struct sSirSmeAssocCnf)); diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c index 14f824df13f7..279078dbae8c 100644 --- a/core/sap/src/sap_module.c +++ b/core/sap/src/sap_module.c @@ -3120,7 +3120,7 @@ QDF_STATUS wlansap_update_owe_info(struct sap_context *sap_ctx, struct owe_assoc_ind *owe_assoc_ind; tSirSmeAssocInd *assoc_ind = NULL; qdf_list_node_t *node = NULL, *next_node = NULL; - QDF_STATUS status; + QDF_STATUS status = QDF_STATUS_SUCCESS; if (!wlansap_validate_owe_ies(ie, ie_len)) { QDF_TRACE_ERROR(QDF_MODULE_ID_SAP, "Invalid OWE IE"); From 0fdd9596ae01082543d51da5c0aa2b0ccd683d63 Mon Sep 17 00:00:00 2001 From: snandini Date: Tue, 11 Aug 2020 03:09:20 -0700 Subject: [PATCH 026/127] Release 5.2.03.30B Release 5.2.03.30B Change-Id: Ibf673d6a6b729fd96913ff4e0f4e91c7ceec2a38 CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index a5e3a0af9ead..b185a51433a7 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 2 #define QWLAN_VERSION_PATCH 03 -#define QWLAN_VERSION_EXTRA "A" +#define QWLAN_VERSION_EXTRA "B" #define QWLAN_VERSION_BUILD 30 -#define QWLAN_VERSIONSTR "5.2.03.30A" +#define QWLAN_VERSIONSTR "5.2.03.30B" #endif /* QWLAN_VERSION_H */ From d8fcf25a4f791d48cf45f3b87e202a2a662eae2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Mon, 17 Aug 2020 14:17:23 -0700 Subject: [PATCH 027/127] ANDROID: fix a bug in quota2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If quota is precisely equal to skb->len then a notification would not be sent due to immediately hitting 0. This fixes that, and takes the opportunity to slightly clean up the code and make quota behave more correctly for packet mode as well. Test: builds, net tests continue to pass Bug: 164336990 Signed-off-by: Maciej Å»enczykowski Change-Id: I78a11b48794496255513a6226c0469d809d7aa56 (cherry picked from commit b20eacd8ddbd1dbf403df94f5ba6384e6fef0113) --- net/netfilter/xt_quota2.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/net/netfilter/xt_quota2.c b/net/netfilter/xt_quota2.c index c42724469759..c9a06d0652fe 100644 --- a/net/netfilter/xt_quota2.c +++ b/net/netfilter/xt_quota2.c @@ -306,6 +306,8 @@ quota_mt2(const struct sk_buff *skb, struct xt_action_param *par) { struct xt_quota_mtinfo2 *q = (void *)par->matchinfo; struct xt_quota_counter *e = q->master; + int charge = (q->flags & XT_QUOTA_PACKET) ? 1 : skb->len; + bool no_change = q->flags & XT_QUOTA_NO_CHANGE; bool ret = q->flags & XT_QUOTA_INVERT; spin_lock_bh(&e->lock); @@ -314,24 +316,21 @@ quota_mt2(const struct sk_buff *skb, struct xt_action_param *par) * While no_change is pointless in "grow" mode, we will * implement it here simply to have a consistent behavior. */ - if (!(q->flags & XT_QUOTA_NO_CHANGE)) { - e->quota += (q->flags & XT_QUOTA_PACKET) ? 1 : skb->len; - } - ret = true; + if (!no_change) + e->quota += charge; + ret = true; /* note: does not respect inversion (bug??) */ } else { - if (e->quota >= skb->len) { - if (!(q->flags & XT_QUOTA_NO_CHANGE)) - e->quota -= (q->flags & XT_QUOTA_PACKET) ? 1 : skb->len; + if (e->quota > charge) { + if (!no_change) + e->quota -= charge; ret = !ret; - } else { + } else if (e->quota) { /* We are transitioning, log that fact. */ - if (e->quota) { - quota2_log(xt_hooknum(par), - skb, - xt_in(par), - xt_out(par), - q->name); - } + quota2_log(xt_hooknum(par), + skb, + xt_in(par), + xt_out(par), + q->name); /* we do not allow even small packets from now on */ e->quota = 0; } From 5795915cff00286fb2cc551dbcaa40ab38486287 Mon Sep 17 00:00:00 2001 From: Chanho Park Date: Tue, 4 Aug 2020 17:57:58 +0900 Subject: [PATCH 028/127] ANDROID: tty: fix tty name overflow The tty name can be up to 8 chars if id is greater than 10 such as ttyUSB11. In that case, the name will be overflowed. To prevent this, this patch removes snprintf and adds comparison the idx value of pdev_tty_port only if pdev_tty_port is specified. Bug: 157525691 Bug: 161501868 Fixes: 21d085e1cc2c ("ANDROID: serdev: restrict claim of platform devices") Change-Id: I2a766c9a83a09a1d386686638d8e9c529eeeb735 Signed-off-by: Chanho Park --- drivers/tty/serdev/serdev-ttyport.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/tty/serdev/serdev-ttyport.c b/drivers/tty/serdev/serdev-ttyport.c index 0669e18ff879..bdae29670fcb 100644 --- a/drivers/tty/serdev/serdev-ttyport.c +++ b/drivers/tty/serdev/serdev-ttyport.c @@ -274,12 +274,16 @@ struct device *serdev_tty_port_register(struct tty_port *port, * be ignored. */ if (parent->bus == &platform_bus_type) { - char tty_port_name[7]; + if (pdev_tty_port) { + unsigned long pdev_idx; + int tty_len = strlen(drv->name); - sprintf(tty_port_name, "%s%d", drv->name, idx); - if (pdev_tty_port && - !strcmp(pdev_tty_port, tty_port_name)) { - platform = true; + if (!strncmp(pdev_tty_port, drv->name, tty_len)) { + if (!kstrtoul(pdev_tty_port + tty_len, 10, + &pdev_idx) && pdev_idx == idx) { + platform = true; + } + } } } From 869a7e5bbe8c0e4facc4be2edbd676bb6445ffe4 Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Thu, 4 Jun 2020 13:37:36 -0700 Subject: [PATCH 029/127] ANDROID: virtio_gpu.h: move map/unmap to 3d group This is an experimental UAPI, without which it would be impossible to virtualize Vulkan on Android using virtgpu. This matches virtio-spec and latest upstream proposals: https://markmail.org/message/akx5yzrubjcutefl https://gitlab.freedesktop.org/virgl/drm-misc-next/-/tree/resource-blob crosvm has been updated to reflect the latest proposals. Once the aosp crosvm is updated, Vulkan will break on Cuttlefish. As such, we must update crosvm and the respective kernels at the same time. First step: update the kernels, as this change does. This is not a new feature, just maintainence and convergence on an existing one. Bug: 153580313 TEST=compile Change-Id: I3305503264eb6859ace32376fdc91b2ee7cc10e7 Signed-off-by: Gurchetan Singh --- include/uapi/linux/virtio_gpu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gpu.h index f44af31f7990..f67d443077cd 100644 --- a/include/uapi/linux/virtio_gpu.h +++ b/include/uapi/linux/virtio_gpu.h @@ -85,8 +85,6 @@ enum virtio_gpu_ctrl_type { VIRTIO_GPU_CMD_GET_EDID, VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID, VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB, - VIRTIO_GPU_CMD_RESOURCE_MAP, - VIRTIO_GPU_CMD_RESOURCE_UNMAP, /* 3d commands */ VIRTIO_GPU_CMD_CTX_CREATE = 0x0200, @@ -97,6 +95,8 @@ enum virtio_gpu_ctrl_type { VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D, VIRTIO_GPU_CMD_SUBMIT_3D, + VIRTIO_GPU_CMD_RESOURCE_MAP, + VIRTIO_GPU_CMD_RESOURCE_UNMAP, /* cursor commands */ VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300, From 5a9ed4e6591c5c6ea6da63ab948be87c0a5049b8 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 8 Jul 2020 16:49:11 +0100 Subject: [PATCH 030/127] drm/vgem: Replace opencoded version of drm_gem_dumb_map_offset() [ Upstream commit 119c53d2d4044c59c450c4f5a568d80b9d861856 ] drm_gem_dumb_map_offset() now exists and does everything vgem_gem_dump_map does and *ought* to do. In particular, vgem_gem_dumb_map() was trying to reject mmapping an imported dmabuf by checking the existence of obj->filp. Unfortunately, we always allocated an obj->filp, even if unused for an imported dmabuf. Instead, the drm_gem_dumb_map_offset(), since commit 90378e589192 ("drm/gem: drm_gem_dumb_map_offset(): reject dma-buf"), uses the obj->import_attach to reject such invalid mmaps. This prevents vgem from allowing userspace mmapping the dumb handle and attempting to incorrectly fault in remote pages belonging to another device, where there may not even be a struct page. v2: Use the default drm_gem_dumb_map_offset() callback Fixes: af33a9190d02 ("drm/vgem: Enable dmabuf import interfaces") Signed-off-by: Chris Wilson Reviewed-by: Daniel Vetter Cc: # v4.13+ Link: https://patchwork.freedesktop.org/patch/msgid/20200708154911.21236-1-chris@chris-wilson.co.uk Signed-off-by: Sasha Levin --- drivers/gpu/drm/vgem/vgem_drv.c | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c index aa592277d510..67037eb9a80e 100644 --- a/drivers/gpu/drm/vgem/vgem_drv.c +++ b/drivers/gpu/drm/vgem/vgem_drv.c @@ -220,32 +220,6 @@ static int vgem_gem_dumb_create(struct drm_file *file, struct drm_device *dev, return 0; } -static int vgem_gem_dumb_map(struct drm_file *file, struct drm_device *dev, - uint32_t handle, uint64_t *offset) -{ - struct drm_gem_object *obj; - int ret; - - obj = drm_gem_object_lookup(file, handle); - if (!obj) - return -ENOENT; - - if (!obj->filp) { - ret = -EINVAL; - goto unref; - } - - ret = drm_gem_create_mmap_offset(obj); - if (ret) - goto unref; - - *offset = drm_vma_node_offset_addr(&obj->vma_node); -unref: - drm_gem_object_put_unlocked(obj); - - return ret; -} - static struct drm_ioctl_desc vgem_ioctls[] = { DRM_IOCTL_DEF_DRV(VGEM_FENCE_ATTACH, vgem_fence_attach_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(VGEM_FENCE_SIGNAL, vgem_fence_signal_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), @@ -439,7 +413,6 @@ static struct drm_driver vgem_driver = { .fops = &vgem_driver_fops, .dumb_create = vgem_gem_dumb_create, - .dumb_map_offset = vgem_gem_dumb_map, .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle, From 61c4decf3743d69bb83bef15a1aedf6844d6f0ea Mon Sep 17 00:00:00 2001 From: Masami Hiramatsu Date: Fri, 10 Jul 2020 22:11:23 +0900 Subject: [PATCH 031/127] perf probe: Fix memory leakage when the probe point is not found [ Upstream commit 12d572e785b15bc764e956caaa8a4c846fd15694 ] Fix the memory leakage in debuginfo__find_trace_events() when the probe point is not found in the debuginfo. If there is no probe point found in the debuginfo, debuginfo__find_probes() will NOT return -ENOENT, but 0. Thus the caller of debuginfo__find_probes() must check the tf.ntevs and release the allocated memory for the array of struct probe_trace_event. The current code releases the memory only if the debuginfo__find_probes() hits an error but not checks tf.ntevs. In the result, the memory allocated on *tevs are not released if tf.ntevs == 0. This fixes the memory leakage by checking tf.ntevs == 0 in addition to ret < 0. Fixes: ff741783506c ("perf probe: Introduce debuginfo to encapsulate dwarf information") Signed-off-by: Masami Hiramatsu Reviewed-by: Srikar Dronamraju Cc: Andi Kleen Cc: Oleg Nesterov Cc: stable@vger.kernel.org Link: http://lore.kernel.org/lkml/159438668346.62703.10887420400718492503.stgit@devnote2 Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/util/probe-finder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 8f7f9d05f38c..bfa6d9d21556 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -1354,7 +1354,7 @@ int debuginfo__find_trace_events(struct debuginfo *dbg, tf.ntevs = 0; ret = debuginfo__find_probes(dbg, &tf.pf); - if (ret < 0) { + if (ret < 0 || tf.ntevs == 0) { for (i = 0; i < tf.ntevs; i++) clear_probe_trace_event(&tf.tevs[i]); zfree(tevs); From 0b383dae5f81863b9a6767c2985500d461d4e566 Mon Sep 17 00:00:00 2001 From: Hugh Dickins Date: Thu, 6 Aug 2020 23:26:25 -0700 Subject: [PATCH 032/127] khugepaged: khugepaged_test_exit() check mmget_still_valid() [ Upstream commit bbe98f9cadff58cdd6a4acaeba0efa8565dabe65 ] Move collapse_huge_page()'s mmget_still_valid() check into khugepaged_test_exit() itself. collapse_huge_page() is used for anon THP only, and earned its mmget_still_valid() check because it inserts a huge pmd entry in place of the page table's pmd entry; whereas collapse_file()'s retract_page_tables() or collapse_pte_mapped_thp() merely clears the page table's pmd entry. But core dumping without mmap lock must have been as open to mistaking a racily cleared pmd entry for a page table at physical page 0, as exit_mmap() was. And we certainly have no interest in mapping as a THP once dumping core. Fixes: 59ea6d06cfa9 ("coredump: fix race condition between collapse_huge_page() and core dumping") Signed-off-by: Hugh Dickins Signed-off-by: Andrew Morton Cc: Andrea Arcangeli Cc: Song Liu Cc: Mike Kravetz Cc: Kirill A. Shutemov Cc: [4.8+] Link: http://lkml.kernel.org/r/alpine.LSU.2.11.2008021217020.27773@eggly.anvils Signed-off-by: Linus Torvalds Signed-off-by: Sasha Levin --- mm/khugepaged.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 04b4c38d0c18..a1b7475c05d0 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -394,7 +394,7 @@ static void insert_to_mm_slots_hash(struct mm_struct *mm, static inline int khugepaged_test_exit(struct mm_struct *mm) { - return atomic_read(&mm->mm_users) == 0; + return atomic_read(&mm->mm_users) == 0 || !mmget_still_valid(mm); } int __khugepaged_enter(struct mm_struct *mm) @@ -1006,9 +1006,6 @@ static void collapse_huge_page(struct mm_struct *mm, * handled by the anon_vma lock + PG_lock. */ down_write(&mm->mmap_sem); - result = SCAN_ANY_PROCESS; - if (!mmget_still_valid(mm)) - goto out; result = hugepage_vma_revalidate(mm, address, &vma); if (result) goto out; From d45ce5e4828959465fc9a2edf451cee2596d018e Mon Sep 17 00:00:00 2001 From: Hugh Dickins Date: Thu, 20 Aug 2020 17:42:02 -0700 Subject: [PATCH 033/127] khugepaged: adjust VM_BUG_ON_MM() in __khugepaged_enter() [ Upstream commit f3f99d63a8156c7a4a6b20aac22b53c5579c7dc1 ] syzbot crashes on the VM_BUG_ON_MM(khugepaged_test_exit(mm), mm) in __khugepaged_enter(): yes, when one thread is about to dump core, has set core_state, and is waiting for others, another might do something calling __khugepaged_enter(), which now crashes because I lumped the core_state test (known as "mmget_still_valid") into khugepaged_test_exit(). I still think it's best to lump them together, so just in this exceptional case, check mm->mm_users directly instead of khugepaged_test_exit(). Fixes: bbe98f9cadff ("khugepaged: khugepaged_test_exit() check mmget_still_valid()") Reported-by: syzbot Signed-off-by: Hugh Dickins Signed-off-by: Andrew Morton Acked-by: Yang Shi Cc: "Kirill A. Shutemov" Cc: Andrea Arcangeli Cc: Song Liu Cc: Mike Kravetz Cc: Eric Dumazet Cc: [4.8+] Link: http://lkml.kernel.org/r/alpine.LSU.2.11.2008141503370.18085@eggly.anvils Signed-off-by: Linus Torvalds Signed-off-by: Sasha Levin --- mm/khugepaged.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index a1b7475c05d0..9dfe364d4c0d 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -407,7 +407,7 @@ int __khugepaged_enter(struct mm_struct *mm) return -ENOMEM; /* __khugepaged_exit() must not run from under us */ - VM_BUG_ON_MM(khugepaged_test_exit(mm), mm); + VM_BUG_ON_MM(atomic_read(&mm->mm_users) == 0, mm); if (unlikely(test_and_set_bit(MMF_VM_HUGEPAGE, &mm->flags))) { free_mm_slot(mm_slot); return 0; From 55069b03922aa29705e3b5d249a182e3c2a32d54 Mon Sep 17 00:00:00 2001 From: Christophe Leroy Date: Wed, 23 May 2018 10:53:22 +0200 Subject: [PATCH 034/127] powerpc/mm: Only read faulting instruction when necessary in do_page_fault() [ Upstream commit 0e36b0d12501e278686634712975b785bae11641 ] Commit a7a9dcd882a67 ("powerpc: Avoid taking a data miss on every userspace instruction miss") has shown that limiting the read of faulting instruction to likely cases improves performance. This patch goes further into this direction by limiting the read of the faulting instruction to the only cases where it is likely needed. On an MPC885, with the same benchmark app as in the commit referred above, we see a reduction of about 3900 dTLB misses (approx 3%): Before the patch: Performance counter stats for './fault 500' (10 runs): 683033312 cpu-cycles ( +- 0.03% ) 134538 dTLB-load-misses ( +- 0.03% ) 46099 iTLB-load-misses ( +- 0.02% ) 19681 faults ( +- 0.02% ) 5.389747878 seconds time elapsed ( +- 0.06% ) With the patch: Performance counter stats for './fault 500' (10 runs): 682112862 cpu-cycles ( +- 0.03% ) 130619 dTLB-load-misses ( +- 0.03% ) 46073 iTLB-load-misses ( +- 0.05% ) 19681 faults ( +- 0.01% ) 5.381342641 seconds time elapsed ( +- 0.07% ) The proper work of the huge stack expansion was tested with the following app: int main(int argc, char **argv) { char buf[1024 * 1025]; sprintf(buf, "Hello world !\n"); printf(buf); exit(0); } Signed-off-by: Christophe Leroy Reviewed-by: Nicholas Piggin [mpe: Add include of pagemap.h to fix build errors] Signed-off-by: Michael Ellerman Signed-off-by: Sasha Levin --- arch/powerpc/mm/fault.c | 50 ++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 5fc8a010fdf0..998c77e600a4 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -66,15 +67,11 @@ static inline bool notify_page_fault(struct pt_regs *regs) } /* - * Check whether the instruction at regs->nip is a store using + * Check whether the instruction inst is a store using * an update addressing form which will update r1. */ -static bool store_updates_sp(struct pt_regs *regs) +static bool store_updates_sp(unsigned int inst) { - unsigned int inst; - - if (get_user(inst, (unsigned int __user *)regs->nip)) - return false; /* check for 1 in the rA field */ if (((inst >> 16) & 0x1f) != 1) return false; @@ -228,8 +225,8 @@ static bool bad_kernel_fault(bool is_exec, unsigned long error_code, } static bool bad_stack_expansion(struct pt_regs *regs, unsigned long address, - struct vm_area_struct *vma, - bool store_update_sp) + struct vm_area_struct *vma, unsigned int flags, + bool *must_retry) { /* * N.B. The POWER/Open ABI allows programs to access up to @@ -241,6 +238,7 @@ static bool bad_stack_expansion(struct pt_regs *regs, unsigned long address, * expand to 1MB without further checks. */ if (address + 0x100000 < vma->vm_end) { + unsigned int __user *nip = (unsigned int __user *)regs->nip; /* get user regs even if this fault is in kernel mode */ struct pt_regs *uregs = current->thread.regs; if (uregs == NULL) @@ -258,8 +256,22 @@ static bool bad_stack_expansion(struct pt_regs *regs, unsigned long address, * between the last mapped region and the stack will * expand the stack rather than segfaulting. */ - if (address + 2048 < uregs->gpr[1] && !store_update_sp) - return true; + if (address + 2048 >= uregs->gpr[1]) + return false; + + if ((flags & FAULT_FLAG_WRITE) && (flags & FAULT_FLAG_USER) && + access_ok(VERIFY_READ, nip, sizeof(*nip))) { + unsigned int inst; + int res; + + pagefault_disable(); + res = __get_user_inatomic(inst, nip); + pagefault_enable(); + if (!res) + return !store_updates_sp(inst); + *must_retry = true; + } + return true; } return false; } @@ -392,7 +404,7 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address, int is_user = user_mode(regs); int is_write = page_fault_is_write(error_code); int fault, major = 0; - bool store_update_sp = false; + bool must_retry = false; if (notify_page_fault(regs)) return 0; @@ -439,9 +451,6 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address, * can result in fault, which will cause a deadlock when called with * mmap_sem held */ - if (is_write && is_user) - store_update_sp = store_updates_sp(regs); - if (is_user) flags |= FAULT_FLAG_USER; if (is_write) @@ -488,8 +497,17 @@ retry: return bad_area(regs, address); /* The stack is being expanded, check if it's valid */ - if (unlikely(bad_stack_expansion(regs, address, vma, store_update_sp))) - return bad_area(regs, address); + if (unlikely(bad_stack_expansion(regs, address, vma, flags, + &must_retry))) { + if (!must_retry) + return bad_area(regs, address); + + up_read(&mm->mmap_sem); + if (fault_in_pages_readable((const char __user *)regs->nip, + sizeof(unsigned int))) + return bad_area_nosemaphore(regs, address); + goto retry; + } /* Try to expand it */ if (unlikely(expand_stack(vma, address))) From 8af919714c19513e2bea7645d2524be093bf683a Mon Sep 17 00:00:00 2001 From: Michael Ellerman Date: Fri, 24 Jul 2020 19:25:25 +1000 Subject: [PATCH 035/127] powerpc: Allow 4224 bytes of stack expansion for the signal frame [ Upstream commit 63dee5df43a31f3844efabc58972f0a206ca4534 ] We have powerpc specific logic in our page fault handling to decide if an access to an unmapped address below the stack pointer should expand the stack VMA. The code was originally added in 2004 "ported from 2.4". The rough logic is that the stack is allowed to grow to 1MB with no extra checking. Over 1MB the access must be within 2048 bytes of the stack pointer, or be from a user instruction that updates the stack pointer. The 2048 byte allowance below the stack pointer is there to cover the 288 byte "red zone" as well as the "about 1.5kB" needed by the signal delivery code. Unfortunately since then the signal frame has expanded, and is now 4224 bytes on 64-bit kernels with transactional memory enabled. This means if a process has consumed more than 1MB of stack, and its stack pointer lies less than 4224 bytes from the next page boundary, signal delivery will fault when trying to expand the stack and the process will see a SEGV. The total size of the signal frame is the size of struct rt_sigframe (which includes the red zone) plus __SIGNAL_FRAMESIZE (128 bytes on 64-bit). The 2048 byte allowance was correct until 2008 as the signal frame was: struct rt_sigframe { struct ucontext uc; /* 0 1440 */ /* --- cacheline 11 boundary (1408 bytes) was 32 bytes ago --- */ long unsigned int _unused[2]; /* 1440 16 */ unsigned int tramp[6]; /* 1456 24 */ struct siginfo * pinfo; /* 1480 8 */ void * puc; /* 1488 8 */ struct siginfo info; /* 1496 128 */ /* --- cacheline 12 boundary (1536 bytes) was 88 bytes ago --- */ char abigap[288]; /* 1624 288 */ /* size: 1920, cachelines: 15, members: 7 */ /* padding: 8 */ }; 1920 + 128 = 2048 Then in commit ce48b2100785 ("powerpc: Add VSX context save/restore, ptrace and signal support") (Jul 2008) the signal frame expanded to 2304 bytes: struct rt_sigframe { struct ucontext uc; /* 0 1696 */ <-- /* --- cacheline 13 boundary (1664 bytes) was 32 bytes ago --- */ long unsigned int _unused[2]; /* 1696 16 */ unsigned int tramp[6]; /* 1712 24 */ struct siginfo * pinfo; /* 1736 8 */ void * puc; /* 1744 8 */ struct siginfo info; /* 1752 128 */ /* --- cacheline 14 boundary (1792 bytes) was 88 bytes ago --- */ char abigap[288]; /* 1880 288 */ /* size: 2176, cachelines: 17, members: 7 */ /* padding: 8 */ }; 2176 + 128 = 2304 At this point we should have been exposed to the bug, though as far as I know it was never reported. I no longer have a system old enough to easily test on. Then in 2010 commit 320b2b8de126 ("mm: keep a guard page below a grow-down stack segment") caused our stack expansion code to never trigger, as there was always a VMA found for a write up to PAGE_SIZE below r1. That meant the bug was hidden as we continued to expand the signal frame in commit 2b0a576d15e0 ("powerpc: Add new transactional memory state to the signal context") (Feb 2013): struct rt_sigframe { struct ucontext uc; /* 0 1696 */ /* --- cacheline 13 boundary (1664 bytes) was 32 bytes ago --- */ struct ucontext uc_transact; /* 1696 1696 */ <-- /* --- cacheline 26 boundary (3328 bytes) was 64 bytes ago --- */ long unsigned int _unused[2]; /* 3392 16 */ unsigned int tramp[6]; /* 3408 24 */ struct siginfo * pinfo; /* 3432 8 */ void * puc; /* 3440 8 */ struct siginfo info; /* 3448 128 */ /* --- cacheline 27 boundary (3456 bytes) was 120 bytes ago --- */ char abigap[288]; /* 3576 288 */ /* size: 3872, cachelines: 31, members: 8 */ /* padding: 8 */ /* last cacheline: 32 bytes */ }; 3872 + 128 = 4000 And commit 573ebfa6601f ("powerpc: Increase stack redzone for 64-bit userspace to 512 bytes") (Feb 2014): struct rt_sigframe { struct ucontext uc; /* 0 1696 */ /* --- cacheline 13 boundary (1664 bytes) was 32 bytes ago --- */ struct ucontext uc_transact; /* 1696 1696 */ /* --- cacheline 26 boundary (3328 bytes) was 64 bytes ago --- */ long unsigned int _unused[2]; /* 3392 16 */ unsigned int tramp[6]; /* 3408 24 */ struct siginfo * pinfo; /* 3432 8 */ void * puc; /* 3440 8 */ struct siginfo info; /* 3448 128 */ /* --- cacheline 27 boundary (3456 bytes) was 120 bytes ago --- */ char abigap[512]; /* 3576 512 */ <-- /* size: 4096, cachelines: 32, members: 8 */ /* padding: 8 */ }; 4096 + 128 = 4224 Then finally in 2017, commit 1be7107fbe18 ("mm: larger stack guard gap, between vmas") exposed us to the existing bug, because it changed the stack VMA to be the correct/real size, meaning our stack expansion code is now triggered. Fix it by increasing the allowance to 4224 bytes. Hard-coding 4224 is obviously unsafe against future expansions of the signal frame in the same way as the existing code. We can't easily use sizeof() because the signal frame structure is not in a header. We will either fix that, or rip out all the custom stack expansion checking logic entirely. Fixes: ce48b2100785 ("powerpc: Add VSX context save/restore, ptrace and signal support") Cc: stable@vger.kernel.org # v2.6.27+ Reported-by: Tom Lane Tested-by: Daniel Axtens Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20200724092528.1578671-2-mpe@ellerman.id.au Signed-off-by: Sasha Levin --- arch/powerpc/mm/fault.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 998c77e600a4..ebe97e5500ee 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c @@ -224,6 +224,9 @@ static bool bad_kernel_fault(bool is_exec, unsigned long error_code, return is_exec || (address >= TASK_SIZE); } +// This comes from 64-bit struct rt_sigframe + __SIGNAL_FRAMESIZE +#define SIGFRAME_MAX_SIZE (4096 + 128) + static bool bad_stack_expansion(struct pt_regs *regs, unsigned long address, struct vm_area_struct *vma, unsigned int flags, bool *must_retry) @@ -231,7 +234,7 @@ static bool bad_stack_expansion(struct pt_regs *regs, unsigned long address, /* * N.B. The POWER/Open ABI allows programs to access up to * 288 bytes below the stack pointer. - * The kernel signal delivery code writes up to about 1.5kB + * The kernel signal delivery code writes a bit over 4KB * below the stack pointer (r1) before decrementing it. * The exec code can write slightly over 640kB to the stack * before setting the user r1. Thus we allow the stack to @@ -256,7 +259,7 @@ static bool bad_stack_expansion(struct pt_regs *regs, unsigned long address, * between the last mapped region and the stack will * expand the stack rather than segfaulting. */ - if (address + 2048 >= uregs->gpr[1]) + if (address + SIGFRAME_MAX_SIZE >= uregs->gpr[1]) return false; if ((flags & FAULT_FLAG_WRITE) && (flags & FAULT_FLAG_USER) && From 847745154e2e8afe1fb965baea2c94357ada0eef Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Fri, 21 Feb 2020 14:56:12 +0100 Subject: [PATCH 036/127] btrfs: export helpers for subvolume name/id resolution [ Upstream commit c0c907a47dccf2cf26251a8fb4a8e7a3bf79ce84 ] The functions will be used outside of export.c and super.c to allow resolving subvolume name from a given id, eg. for subvolume deletion by id ioctl. Signed-off-by: Marcos Paulo de Souza Reviewed-by: David Sterba [ split from the next patch ] Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/ctree.h | 2 ++ fs/btrfs/export.c | 8 ++++---- fs/btrfs/export.h | 5 +++++ fs/btrfs/super.c | 8 ++++---- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 5412b12491cb..de951987fd23 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -3262,6 +3262,8 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size); int btrfs_parse_options(struct btrfs_fs_info *info, char *options, unsigned long new_flags); int btrfs_sync_fs(struct super_block *sb, int wait); +char *btrfs_get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info, + u64 subvol_objectid); static inline __printf(2, 3) void btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) diff --git a/fs/btrfs/export.c b/fs/btrfs/export.c index 3aeb5770f896..b6ce765aa7f3 100644 --- a/fs/btrfs/export.c +++ b/fs/btrfs/export.c @@ -56,9 +56,9 @@ static int btrfs_encode_fh(struct inode *inode, u32 *fh, int *max_len, return type; } -static struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid, - u64 root_objectid, u32 generation, - int check_generation) +struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid, + u64 root_objectid, u32 generation, + int check_generation) { struct btrfs_fs_info *fs_info = btrfs_sb(sb); struct btrfs_root *root; @@ -151,7 +151,7 @@ static struct dentry *btrfs_fh_to_dentry(struct super_block *sb, struct fid *fh, return btrfs_get_dentry(sb, objectid, root_objectid, generation, 1); } -static struct dentry *btrfs_get_parent(struct dentry *child) +struct dentry *btrfs_get_parent(struct dentry *child) { struct inode *dir = d_inode(child); struct btrfs_fs_info *fs_info = btrfs_sb(dir->i_sb); diff --git a/fs/btrfs/export.h b/fs/btrfs/export.h index 91b3908e7c54..15db02462141 100644 --- a/fs/btrfs/export.h +++ b/fs/btrfs/export.h @@ -17,4 +17,9 @@ struct btrfs_fid { u64 parent_root_objectid; } __attribute__ ((packed)); +struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid, + u64 root_objectid, u32 generation, + int check_generation); +struct dentry *btrfs_get_parent(struct dentry *child); + #endif diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 17a8463ef35c..ca95e57b60ee 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -939,8 +939,8 @@ out: return error; } -static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info, - u64 subvol_objectid) +char *btrfs_get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info, + u64 subvol_objectid) { struct btrfs_root *root = fs_info->tree_root; struct btrfs_root *fs_root; @@ -1427,8 +1427,8 @@ static struct dentry *mount_subvol(const char *subvol_name, u64 subvol_objectid, goto out; } } - subvol_name = get_subvol_name_from_objectid(btrfs_sb(mnt->mnt_sb), - subvol_objectid); + subvol_name = btrfs_get_subvol_name_from_objectid( + btrfs_sb(mnt->mnt_sb), subvol_objectid); if (IS_ERR(subvol_name)) { root = ERR_CAST(subvol_name); subvol_name = NULL; From 82ba99cfbdc46075c6c9f8941e6ed6bac0a5dacc Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Wed, 22 Jul 2020 11:12:46 -0400 Subject: [PATCH 037/127] btrfs: don't show full path of bind mounts in subvol= [ Upstream commit 3ef3959b29c4a5bd65526ab310a1a18ae533172a ] Chris Murphy reported a problem where rpm ostree will bind mount a bunch of things for whatever voodoo it's doing. But when it does this /proc/mounts shows something like /dev/sda /mnt/test btrfs rw,relatime,subvolid=256,subvol=/foo 0 0 /dev/sda /mnt/test/baz btrfs rw,relatime,subvolid=256,subvol=/foo/bar 0 0 Despite subvolid=256 being subvol=/foo. This is because we're just spitting out the dentry of the mount point, which in the case of bind mounts is the source path for the mountpoint. Instead we should spit out the path to the actual subvol. Fix this by looking up the name for the subvolid we have mounted. With this fix the same test looks like this /dev/sda /mnt/test btrfs rw,relatime,subvolid=256,subvol=/foo 0 0 /dev/sda /mnt/test/baz btrfs rw,relatime,subvolid=256,subvol=/foo 0 0 Reported-by: Chris Murphy CC: stable@vger.kernel.org # 4.4+ Signed-off-by: Josef Bacik Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/super.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index ca95e57b60ee..eb64d4b159e0 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1221,6 +1221,7 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) { struct btrfs_fs_info *info = btrfs_sb(dentry->d_sb); char *compress_type; + const char *subvol_name; if (btrfs_test_opt(info, DEGRADED)) seq_puts(seq, ",degraded"); @@ -1307,8 +1308,13 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) #endif seq_printf(seq, ",subvolid=%llu", BTRFS_I(d_inode(dentry))->root->root_key.objectid); - seq_puts(seq, ",subvol="); - seq_dentry(seq, dentry, " \t\n\\"); + subvol_name = btrfs_get_subvol_name_from_objectid(info, + BTRFS_I(d_inode(dentry))->root->root_key.objectid); + if (!IS_ERR(subvol_name)) { + seq_puts(seq, ",subvol="); + seq_escape(seq, subvol_name, " \t\n\\"); + kfree(subvol_name); + } return 0; } From c05c73db96b3fb47bab80c43651972ecc1c8c461 Mon Sep 17 00:00:00 2001 From: Nikolay Borisov Date: Wed, 17 Jul 2019 14:41:45 +0300 Subject: [PATCH 038/127] btrfs: Move free_pages_out label in inline extent handling branch in compress_file_range [ Upstream commit cecc8d9038d164eda61fbcd72520975a554ea63e ] This label is only executed if compress_file_range fails to create an inline extent. So move its code in the semantically related inline extent handling branch. No functional changes. Signed-off-by: Nikolay Borisov Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 57908ee964a2..dc520749f51d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -629,7 +629,14 @@ cont: btrfs_free_reserved_data_space_noquota(inode, start, end - start + 1); - goto free_pages_out; + + for (i = 0; i < nr_pages; i++) { + WARN_ON(pages[i]->mapping); + put_page(pages[i]); + } + kfree(pages); + + return; } } @@ -708,13 +715,6 @@ cleanup_and_bail_uncompressed: *num_added += 1; return; - -free_pages_out: - for (i = 0; i < nr_pages; i++) { - WARN_ON(pages[i]->mapping); - put_page(pages[i]); - } - kfree(pages); } static void free_async_extent_pages(struct async_extent *async_extent) From e0b8bbf26492d12fc4f477f281dde1bcde7aedf0 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Tue, 28 Jul 2020 16:39:26 +0800 Subject: [PATCH 039/127] btrfs: inode: fix NULL pointer dereference if inode doesn't need compression [ Upstream commit 1e6e238c3002ea3611465ce5f32777ddd6a40126 ] [BUG] There is a bug report of NULL pointer dereference caused in compress_file_extent(): Oops: Kernel access of bad area, sig: 11 [#1] LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries Workqueue: btrfs-delalloc btrfs_delalloc_helper [btrfs] NIP [c008000006dd4d34] compress_file_range.constprop.41+0x75c/0x8a0 [btrfs] LR [c008000006dd4d1c] compress_file_range.constprop.41+0x744/0x8a0 [btrfs] Call Trace: [c000000c69093b00] [c008000006dd4d1c] compress_file_range.constprop.41+0x744/0x8a0 [btrfs] (unreliable) [c000000c69093bd0] [c008000006dd4ebc] async_cow_start+0x44/0xa0 [btrfs] [c000000c69093c10] [c008000006e14824] normal_work_helper+0xdc/0x598 [btrfs] [c000000c69093c80] [c0000000001608c0] process_one_work+0x2c0/0x5b0 [c000000c69093d10] [c000000000160c38] worker_thread+0x88/0x660 [c000000c69093db0] [c00000000016b55c] kthread+0x1ac/0x1c0 [c000000c69093e20] [c00000000000b660] ret_from_kernel_thread+0x5c/0x7c ---[ end trace f16954aa20d822f6 ]--- [CAUSE] For the following execution route of compress_file_range(), it's possible to hit NULL pointer dereference: compress_file_extent() |- pages = NULL; |- start = async_chunk->start = 0; |- end = async_chunk = 4095; |- nr_pages = 1; |- inode_need_compress() == false; <<< Possible, see later explanation | Now, we have nr_pages = 1, pages = NULL |- cont: |- ret = cow_file_range_inline(); |- if (ret <= 0) { |- for (i = 0; i < nr_pages; i++) { |- WARN_ON(pages[i]->mapping); <<< Crash To enter above call execution branch, we need the following race: Thread 1 (chattr) | Thread 2 (writeback) --------------------------+------------------------------ | btrfs_run_delalloc_range | |- inode_need_compress = true | |- cow_file_range_async() btrfs_ioctl_set_flag() | |- binode_flags |= | BTRFS_INODE_NOCOMPRESS | | compress_file_range() | |- inode_need_compress = false | |- nr_page = 1 while pages = NULL | | Then hit the crash [FIX] This patch will fix it by checking @pages before doing accessing it. This patch is only designed as a hot fix and easy to backport. More elegant fix may make btrfs only check inode_need_compress() once to avoid such race, but that would be another story. Reported-by: Luciano Chavez Fixes: 4d3a800ebb12 ("btrfs: merge nr_pages input and output parameter in compress_pages") CC: stable@vger.kernel.org # 4.14.x: cecc8d9038d16: btrfs: Move free_pages_out label in inline extent handling branch in compress_file_range CC: stable@vger.kernel.org # 4.14+ Signed-off-by: Qu Wenruo Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index dc520749f51d..17856e92b93d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -630,11 +630,18 @@ cont: start, end - start + 1); - for (i = 0; i < nr_pages; i++) { - WARN_ON(pages[i]->mapping); - put_page(pages[i]); + /* + * Ensure we only free the compressed pages if we have + * them allocated, as we can still reach here with + * inode_need_compress() == false. + */ + if (pages) { + for (i = 0; i < nr_pages; i++) { + WARN_ON(pages[i]->mapping); + put_page(pages[i]); + } + kfree(pages); } - kfree(pages); return; } From 58253e22b61047290585e9b2f3e721439a9e9299 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Tue, 21 Jul 2020 10:17:50 -0400 Subject: [PATCH 040/127] btrfs: sysfs: use NOFS for device creation [ Upstream commit a47bd78d0c44621efb98b525d04d60dc4d1a79b0 ] Dave hit this splat during testing btrfs/078: ====================================================== WARNING: possible circular locking dependency detected 5.8.0-rc6-default+ #1191 Not tainted ------------------------------------------------------ kswapd0/75 is trying to acquire lock: ffffa040e9d04ff8 (&delayed_node->mutex){+.+.}-{3:3}, at: __btrfs_release_delayed_node.part.0+0x3f/0x310 [btrfs] but task is already holding lock: ffffffff8b0c8040 (fs_reclaim){+.+.}-{0:0}, at: __fs_reclaim_acquire+0x5/0x30 which lock already depends on the new lock. the existing dependency chain (in reverse order) is: -> #2 (fs_reclaim){+.+.}-{0:0}: __lock_acquire+0x56f/0xaa0 lock_acquire+0xa3/0x440 fs_reclaim_acquire.part.0+0x25/0x30 __kmalloc_track_caller+0x49/0x330 kstrdup+0x2e/0x60 __kernfs_new_node.constprop.0+0x44/0x250 kernfs_new_node+0x25/0x50 kernfs_create_link+0x34/0xa0 sysfs_do_create_link_sd+0x5e/0xd0 btrfs_sysfs_add_devices_dir+0x65/0x100 [btrfs] btrfs_init_new_device+0x44c/0x12b0 [btrfs] btrfs_ioctl+0xc3c/0x25c0 [btrfs] ksys_ioctl+0x68/0xa0 __x64_sys_ioctl+0x16/0x20 do_syscall_64+0x50/0xe0 entry_SYSCALL_64_after_hwframe+0x44/0xa9 -> #1 (&fs_info->chunk_mutex){+.+.}-{3:3}: __lock_acquire+0x56f/0xaa0 lock_acquire+0xa3/0x440 __mutex_lock+0xa0/0xaf0 btrfs_chunk_alloc+0x137/0x3e0 [btrfs] find_free_extent+0xb44/0xfb0 [btrfs] btrfs_reserve_extent+0x9b/0x180 [btrfs] btrfs_alloc_tree_block+0xc1/0x350 [btrfs] alloc_tree_block_no_bg_flush+0x4a/0x60 [btrfs] __btrfs_cow_block+0x143/0x7a0 [btrfs] btrfs_cow_block+0x15f/0x310 [btrfs] push_leaf_right+0x150/0x240 [btrfs] split_leaf+0x3cd/0x6d0 [btrfs] btrfs_search_slot+0xd14/0xf70 [btrfs] btrfs_insert_empty_items+0x64/0xc0 [btrfs] __btrfs_commit_inode_delayed_items+0xb2/0x840 [btrfs] btrfs_async_run_delayed_root+0x10e/0x1d0 [btrfs] btrfs_work_helper+0x2f9/0x650 [btrfs] process_one_work+0x22c/0x600 worker_thread+0x50/0x3b0 kthread+0x137/0x150 ret_from_fork+0x1f/0x30 -> #0 (&delayed_node->mutex){+.+.}-{3:3}: check_prev_add+0x98/0xa20 validate_chain+0xa8c/0x2a00 __lock_acquire+0x56f/0xaa0 lock_acquire+0xa3/0x440 __mutex_lock+0xa0/0xaf0 __btrfs_release_delayed_node.part.0+0x3f/0x310 [btrfs] btrfs_evict_inode+0x3bf/0x560 [btrfs] evict+0xd6/0x1c0 dispose_list+0x48/0x70 prune_icache_sb+0x54/0x80 super_cache_scan+0x121/0x1a0 do_shrink_slab+0x175/0x420 shrink_slab+0xb1/0x2e0 shrink_node+0x192/0x600 balance_pgdat+0x31f/0x750 kswapd+0x206/0x510 kthread+0x137/0x150 ret_from_fork+0x1f/0x30 other info that might help us debug this: Chain exists of: &delayed_node->mutex --> &fs_info->chunk_mutex --> fs_reclaim Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(fs_reclaim); lock(&fs_info->chunk_mutex); lock(fs_reclaim); lock(&delayed_node->mutex); *** DEADLOCK *** 3 locks held by kswapd0/75: #0: ffffffff8b0c8040 (fs_reclaim){+.+.}-{0:0}, at: __fs_reclaim_acquire+0x5/0x30 #1: ffffffff8b0b50b8 (shrinker_rwsem){++++}-{3:3}, at: shrink_slab+0x54/0x2e0 #2: ffffa040e057c0e8 (&type->s_umount_key#26){++++}-{3:3}, at: trylock_super+0x16/0x50 stack backtrace: CPU: 2 PID: 75 Comm: kswapd0 Not tainted 5.8.0-rc6-default+ #1191 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba527-rebuilt.opensuse.org 04/01/2014 Call Trace: dump_stack+0x78/0xa0 check_noncircular+0x16f/0x190 check_prev_add+0x98/0xa20 validate_chain+0xa8c/0x2a00 __lock_acquire+0x56f/0xaa0 lock_acquire+0xa3/0x440 ? __btrfs_release_delayed_node.part.0+0x3f/0x310 [btrfs] __mutex_lock+0xa0/0xaf0 ? __btrfs_release_delayed_node.part.0+0x3f/0x310 [btrfs] ? __lock_acquire+0x56f/0xaa0 ? __btrfs_release_delayed_node.part.0+0x3f/0x310 [btrfs] ? lock_acquire+0xa3/0x440 ? btrfs_evict_inode+0x138/0x560 [btrfs] ? btrfs_evict_inode+0x2fe/0x560 [btrfs] ? __btrfs_release_delayed_node.part.0+0x3f/0x310 [btrfs] __btrfs_release_delayed_node.part.0+0x3f/0x310 [btrfs] btrfs_evict_inode+0x3bf/0x560 [btrfs] evict+0xd6/0x1c0 dispose_list+0x48/0x70 prune_icache_sb+0x54/0x80 super_cache_scan+0x121/0x1a0 do_shrink_slab+0x175/0x420 shrink_slab+0xb1/0x2e0 shrink_node+0x192/0x600 balance_pgdat+0x31f/0x750 kswapd+0x206/0x510 ? _raw_spin_unlock_irqrestore+0x3e/0x50 ? finish_wait+0x90/0x90 ? balance_pgdat+0x750/0x750 kthread+0x137/0x150 ? kthread_stop+0x2a0/0x2a0 ret_from_fork+0x1f/0x30 This is because we're holding the chunk_mutex while adding this device and adding its sysfs entries. We actually hold different locks in different places when calling this function, the dev_replace semaphore for instance in dev replace, so instead of moving this call around simply wrap it's operations in NOFS. CC: stable@vger.kernel.org # 4.14+ Reported-by: David Sterba Signed-off-by: Josef Bacik Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/sysfs.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index f05341bda1d1..383546ff62f0 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "ctree.h" #include "disk-io.h" @@ -749,7 +750,9 @@ int btrfs_sysfs_add_device_link(struct btrfs_fs_devices *fs_devices, { int error = 0; struct btrfs_device *dev; + unsigned int nofs_flag; + nofs_flag = memalloc_nofs_save(); list_for_each_entry(dev, &fs_devices->devices, dev_list) { struct hd_struct *disk; struct kobject *disk_kobj; @@ -768,6 +771,7 @@ int btrfs_sysfs_add_device_link(struct btrfs_fs_devices *fs_devices, if (error) break; } + memalloc_nofs_restore(nofs_flag); return error; } From 89346bc395e7bc0a7d3c36c824782050b17d4fec Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Thu, 20 Aug 2020 17:42:11 -0700 Subject: [PATCH 041/127] romfs: fix uninitialized memory leak in romfs_dev_read() commit bcf85fcedfdd17911982a3e3564fcfec7b01eebd upstream. romfs has a superblock field that limits the size of the filesystem; data beyond that limit is never accessed. romfs_dev_read() fetches a caller-supplied number of bytes from the backing device. It returns 0 on success or an error code on failure; therefore, its API can't represent short reads, it's all-or-nothing. However, when romfs_dev_read() detects that the requested operation would cross the filesystem size limit, it currently silently truncates the requested number of bytes. This e.g. means that when the content of a file with size 0x1000 starts one byte before the filesystem size limit, ->readpage() will only fill a single byte of the supplied page while leaving the rest uninitialized, leaking that uninitialized memory to userspace. Fix it by returning an error code instead of truncating the read when the requested read operation would go beyond the end of the filesystem. Fixes: da4458bda237 ("NOMMU: Make it possible for RomFS to use MTD devices directly") Signed-off-by: Jann Horn Signed-off-by: Andrew Morton Reviewed-by: Greg Kroah-Hartman Cc: David Howells Cc: Link: http://lkml.kernel.org/r/20200818013202.2246365-1-jannh@google.com Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- fs/romfs/storage.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/romfs/storage.c b/fs/romfs/storage.c index f86f51f99ace..1dcadd22b440 100644 --- a/fs/romfs/storage.c +++ b/fs/romfs/storage.c @@ -221,10 +221,8 @@ int romfs_dev_read(struct super_block *sb, unsigned long pos, size_t limit; limit = romfs_maxsize(sb); - if (pos >= limit) + if (pos >= limit || buflen > limit - pos) return -EIO; - if (buflen > limit - pos) - buflen = limit - pos; #ifdef CONFIG_ROMFS_ON_MTD if (sb->s_mtd) From 6b7be0bc036bd70cf3b819d51750ed203b34e7ff Mon Sep 17 00:00:00 2001 From: Wei Yongjun Date: Thu, 20 Aug 2020 17:42:14 -0700 Subject: [PATCH 042/127] kernel/relay.c: fix memleak on destroy relay channel commit 71e843295c680898959b22dc877ae3839cc22470 upstream. kmemleak report memory leak as follows: unreferenced object 0x607ee4e5f948 (size 8): comm "syz-executor.1", pid 2098, jiffies 4295031601 (age 288.468s) hex dump (first 8 bytes): 00 00 00 00 00 00 00 00 ........ backtrace: relay_open kernel/relay.c:583 [inline] relay_open+0xb6/0x970 kernel/relay.c:563 do_blk_trace_setup+0x4a8/0xb20 kernel/trace/blktrace.c:557 __blk_trace_setup+0xb6/0x150 kernel/trace/blktrace.c:597 blk_trace_ioctl+0x146/0x280 kernel/trace/blktrace.c:738 blkdev_ioctl+0xb2/0x6a0 block/ioctl.c:613 block_ioctl+0xe5/0x120 fs/block_dev.c:1871 vfs_ioctl fs/ioctl.c:48 [inline] __do_sys_ioctl fs/ioctl.c:753 [inline] __se_sys_ioctl fs/ioctl.c:739 [inline] __x64_sys_ioctl+0x170/0x1ce fs/ioctl.c:739 do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x44/0xa9 'chan->buf' is malloced in relay_open() by alloc_percpu() but not free while destroy the relay channel. Fix it by adding free_percpu() before return from relay_destroy_channel(). Fixes: 017c59c042d0 ("relay: Use per CPU constructs for the relay channel buffer pointers") Reported-by: Hulk Robot Signed-off-by: Wei Yongjun Signed-off-by: Andrew Morton Reviewed-by: Chris Wilson Cc: Al Viro Cc: Michael Ellerman Cc: David Rientjes Cc: Michel Lespinasse Cc: Daniel Axtens Cc: Thomas Gleixner Cc: Akash Goel Cc: Link: http://lkml.kernel.org/r/20200817122826.48518-1-weiyongjun1@huawei.com Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- kernel/relay.c | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/relay.c b/kernel/relay.c index b141ce697679..53c2a1a4b057 100644 --- a/kernel/relay.c +++ b/kernel/relay.c @@ -196,6 +196,7 @@ free_buf: static void relay_destroy_channel(struct kref *kref) { struct rchan *chan = container_of(kref, struct rchan, kref); + free_percpu(chan->buf); kfree(chan); } From d93b51bcceb226ec686e465ad821dcf89ecf2e0b Mon Sep 17 00:00:00 2001 From: Doug Berger Date: Thu, 20 Aug 2020 17:42:24 -0700 Subject: [PATCH 043/127] mm: include CMA pages in lowmem_reserve at boot commit e08d3fdfe2dafa0331843f70ce1ff6c1c4900bf4 upstream. The lowmem_reserve arrays provide a means of applying pressure against allocations from lower zones that were targeted at higher zones. Its values are a function of the number of pages managed by higher zones and are assigned by a call to the setup_per_zone_lowmem_reserve() function. The function is initially called at boot time by the function init_per_zone_wmark_min() and may be called later by accesses of the /proc/sys/vm/lowmem_reserve_ratio sysctl file. The function init_per_zone_wmark_min() was moved up from a module_init to a core_initcall to resolve a sequencing issue with khugepaged. Unfortunately this created a sequencing issue with CMA page accounting. The CMA pages are added to the managed page count of a zone when cma_init_reserved_areas() is called at boot also as a core_initcall. This makes it uncertain whether the CMA pages will be added to the managed page counts of their zones before or after the call to init_per_zone_wmark_min() as it becomes dependent on link order. With the current link order the pages are added to the managed count after the lowmem_reserve arrays are initialized at boot. This means the lowmem_reserve values at boot may be lower than the values used later if /proc/sys/vm/lowmem_reserve_ratio is accessed even if the ratio values are unchanged. In many cases the difference is not significant, but for example an ARM platform with 1GB of memory and the following memory layout cma: Reserved 256 MiB at 0x0000000030000000 Zone ranges: DMA [mem 0x0000000000000000-0x000000002fffffff] Normal empty HighMem [mem 0x0000000030000000-0x000000003fffffff] would result in 0 lowmem_reserve for the DMA zone. This would allow userspace to deplete the DMA zone easily. Funnily enough $ cat /proc/sys/vm/lowmem_reserve_ratio would fix up the situation because as a side effect it forces setup_per_zone_lowmem_reserve. This commit breaks the link order dependency by invoking init_per_zone_wmark_min() as a postcore_initcall so that the CMA pages have the chance to be properly accounted in their zone(s) and allowing the lowmem_reserve arrays to receive consistent values. Fixes: bc22af74f271 ("mm: update min_free_kbytes from khugepaged after core initialization") Signed-off-by: Doug Berger Signed-off-by: Andrew Morton Acked-by: Michal Hocko Cc: Jason Baron Cc: David Rientjes Cc: "Kirill A. Shutemov" Cc: Link: http://lkml.kernel.org/r/1597423766-27849-1-git-send-email-opendmb@gmail.com Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e992afe3a58e..46ded8d77fb3 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -7018,7 +7018,7 @@ int __meminit init_per_zone_wmark_min(void) return 0; } -core_initcall(init_per_zone_wmark_min) +postcore_initcall(init_per_zone_wmark_min) /* * min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so From 0063bb829eba8d1f677cdfd79d7f0a093d724a36 Mon Sep 17 00:00:00 2001 From: Charan Teja Reddy Date: Thu, 20 Aug 2020 17:42:27 -0700 Subject: [PATCH 044/127] mm, page_alloc: fix core hung in free_pcppages_bulk() commit 88e8ac11d2ea3acc003cf01bb5a38c8aa76c3cfd upstream. The following race is observed with the repeated online, offline and a delay between two successive online of memory blocks of movable zone. P1 P2 Online the first memory block in the movable zone. The pcp struct values are initialized to default values,i.e., pcp->high = 0 & pcp->batch = 1. Allocate the pages from the movable zone. Try to Online the second memory block in the movable zone thus it entered the online_pages() but yet to call zone_pcp_update(). This process is entered into the exit path thus it tries to release the order-0 pages to pcp lists through free_unref_page_commit(). As pcp->high = 0, pcp->count = 1 proceed to call the function free_pcppages_bulk(). Update the pcp values thus the new pcp values are like, say, pcp->high = 378, pcp->batch = 63. Read the pcp's batch value using READ_ONCE() and pass the same to free_pcppages_bulk(), pcp values passed here are, batch = 63, count = 1. Since num of pages in the pcp lists are less than ->batch, then it will stuck in while(list_empty(list)) loop with interrupts disabled thus a core hung. Avoid this by ensuring free_pcppages_bulk() is called with proper count of pcp list pages. The mentioned race is some what easily reproducible without [1] because pcp's are not updated for the first memory block online and thus there is a enough race window for P2 between alloc+free and pcp struct values update through onlining of second memory block. With [1], the race still exists but it is very narrow as we update the pcp struct values for the first memory block online itself. This is not limited to the movable zone, it could also happen in cases with the normal zone (e.g., hotplug to a node that only has DMA memory, or no other memory yet). [1]: https://patchwork.kernel.org/patch/11696389/ Fixes: 5f8dcc21211a ("page-allocator: split per-cpu list into one-list-per-migrate-type") Signed-off-by: Charan Teja Reddy Signed-off-by: Andrew Morton Acked-by: David Hildenbrand Acked-by: David Rientjes Acked-by: Michal Hocko Cc: Michal Hocko Cc: Vlastimil Babka Cc: Vinayak Menon Cc: [2.6+] Link: http://lkml.kernel.org/r/1597150703-19003-1-git-send-email-charante@codeaurora.org Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- mm/page_alloc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 46ded8d77fb3..a3958b4fec6c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1114,6 +1114,11 @@ static void free_pcppages_bulk(struct zone *zone, int count, spin_lock(&zone->lock); isolated_pageblocks = has_isolate_pageblock(zone); + /* + * Ensure proper count is passed which otherwise would stuck in the + * below while (list_empty(list)) loop. + */ + count = min(pcp->count, count); while (count) { struct page *page; struct list_head *list; From f9d723d0b788ca94a957bb96177b65049caaa8e5 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Fri, 31 Jul 2020 18:21:35 +0200 Subject: [PATCH 045/127] ext4: fix checking of directory entry validity for inline directories commit 7303cb5bfe845f7d43cd9b2dbd37dbb266efda9b upstream. ext4_search_dir() and ext4_generic_delete_entry() can be called both for standard director blocks and for inline directories stored inside inode or inline xattr space. For the second case we didn't call ext4_check_dir_entry() with proper constraints that could result in accepting corrupted directory entry as well as false positive filesystem errors like: EXT4-fs error (device dm-0): ext4_search_dir:1395: inode #28320400: block 113246792: comm dockerd: bad entry in directory: directory entry too close to block end - offset=0, inode=28320403, rec_len=32, name_len=8, size=4096 Fix the arguments passed to ext4_check_dir_entry(). Fixes: 109ba779d6cc ("ext4: check for directory entries too close to block end") CC: stable@vger.kernel.org Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20200731162135.8080-1-jack@suse.cz Signed-off-by: Theodore Ts'o Signed-off-by: Greg Kroah-Hartman --- fs/ext4/namei.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 161099f39ab9..ed17edb31e22 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1308,8 +1308,8 @@ int ext4_search_dir(struct buffer_head *bh, char *search_buf, int buf_size, ext4_match(fname, de)) { /* found a match - just to be sure, do * a full check */ - if (ext4_check_dir_entry(dir, NULL, de, bh, bh->b_data, - bh->b_size, offset)) + if (ext4_check_dir_entry(dir, NULL, de, bh, search_buf, + buf_size, offset)) return -1; *res_dir = de; return 1; @@ -2353,7 +2353,7 @@ int ext4_generic_delete_entry(handle_t *handle, de = (struct ext4_dir_entry_2 *)entry_buf; while (i < buf_size - csum_size) { if (ext4_check_dir_entry(dir, NULL, de, bh, - bh->b_data, bh->b_size, i)) + entry_buf, buf_size, i)) return -EFSCORRUPTED; if (de == de_del) { if (pde) From 81545a2affa2b78602a1cedd8e172ea474f7c205 Mon Sep 17 00:00:00 2001 From: "zhangyi (F)" Date: Sat, 20 Jun 2020 14:19:48 +0800 Subject: [PATCH 046/127] jbd2: add the missing unlock_buffer() in the error path of jbd2_write_superblock() commit ef3f5830b859604eda8723c26d90ab23edc027a4 upstream. jbd2_write_superblock() is under the buffer lock of journal superblock before ending that superblock write, so add a missing unlock_buffer() in in the error path before submitting buffer. Fixes: 742b06b5628f ("jbd2: check superblock mapped prior to committing") Signed-off-by: zhangyi (F) Reviewed-by: Ritesh Harjani Cc: stable@kernel.org Link: https://lore.kernel.org/r/20200620061948.2049579-1-yi.zhang@huawei.com Signed-off-by: Theodore Ts'o Signed-off-by: Greg Kroah-Hartman --- fs/jbd2/journal.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 6e054b368b5f..93a466cf58ba 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1356,8 +1356,10 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) int ret; /* Buffer got discarded which means block device got invalidated */ - if (!buffer_mapped(bh)) + if (!buffer_mapped(bh)) { + unlock_buffer(bh); return -EIO; + } trace_jbd2_write_superblock(journal, write_flags); if (!(journal->j_flags & JBD2_BARRIER)) From 413a0634d56b31719c3c2f8d495783efea84a226 Mon Sep 17 00:00:00 2001 From: Lukas Wunner Date: Mon, 3 Aug 2020 13:09:01 +0200 Subject: [PATCH 047/127] spi: Prevent adding devices below an unregistering controller [ Upstream commit ddf75be47ca748f8b12d28ac64d624354fddf189 ] CONFIG_OF_DYNAMIC and CONFIG_ACPI allow adding SPI devices at runtime using a DeviceTree overlay or DSDT patch. CONFIG_SPI_SLAVE allows the same via sysfs. But there are no precautions to prevent adding a device below a controller that's being removed. Such a device is unusable and may not even be able to unbind cleanly as it becomes inaccessible once the controller has been torn down. E.g. it is then impossible to quiesce the device's interrupt. of_spi_notify() and acpi_spi_notify() do hold a ref on the controller, but otherwise run lockless against spi_unregister_controller(). Fix by holding the spi_add_lock in spi_unregister_controller() and bailing out of spi_add_device() if the controller has been unregistered concurrently. Fixes: ce79d54ae447 ("spi/of: Add OF notifier handler") Signed-off-by: Lukas Wunner Cc: stable@vger.kernel.org # v3.19+ Cc: Geert Uytterhoeven Cc: Octavian Purdila Cc: Pantelis Antoniou Link: https://lore.kernel.org/r/a8c3205088a969dc8410eec1eba9aface60f36af.1596451035.git.lukas@wunner.de Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/Kconfig | 3 +++ drivers/spi/spi.c | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index a75f2a2cf780..4b6a1629969f 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -827,4 +827,7 @@ config SPI_SLAVE_SYSTEM_CONTROL endif # SPI_SLAVE +config SPI_DYNAMIC + def_bool ACPI || OF_DYNAMIC || SPI_SLAVE + endif # SPI diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 49eee894f51d..ab6a4f85bcde 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -428,6 +428,12 @@ static LIST_HEAD(spi_controller_list); */ static DEFINE_MUTEX(board_lock); +/* + * Prevents addition of devices with same chip select and + * addition of devices below an unregistering controller. + */ +static DEFINE_MUTEX(spi_add_lock); + /** * spi_alloc_device - Allocate a new SPI device * @ctlr: Controller to which device is connected @@ -506,7 +512,6 @@ static int spi_dev_check(struct device *dev, void *data) */ int spi_add_device(struct spi_device *spi) { - static DEFINE_MUTEX(spi_add_lock); struct spi_controller *ctlr = spi->controller; struct device *dev = ctlr->dev.parent; int status; @@ -534,6 +539,13 @@ int spi_add_device(struct spi_device *spi) goto done; } + /* Controller may unregister concurrently */ + if (IS_ENABLED(CONFIG_SPI_DYNAMIC) && + !device_is_registered(&ctlr->dev)) { + status = -ENODEV; + goto done; + } + if (ctlr->cs_gpios) spi->cs_gpio = ctlr->cs_gpios[spi->chip_select]; @@ -2265,6 +2277,10 @@ void spi_unregister_controller(struct spi_controller *ctlr) struct spi_controller *found; int id = ctlr->bus_num; + /* Prevent addition of new devices, unregister existing ones */ + if (IS_ENABLED(CONFIG_SPI_DYNAMIC)) + mutex_lock(&spi_add_lock); + device_for_each_child(&ctlr->dev, NULL, __unregister); /* First make sure that this controller was ever added */ @@ -2285,6 +2301,9 @@ void spi_unregister_controller(struct spi_controller *ctlr) if (found == ctlr) idr_remove(&spi_master_idr, id); mutex_unlock(&board_lock); + + if (IS_ENABLED(CONFIG_SPI_DYNAMIC)) + mutex_unlock(&spi_add_lock); } EXPORT_SYMBOL_GPL(spi_unregister_controller); From 046f3765d4cc814f1166dfe1cebbaf8a55f09f42 Mon Sep 17 00:00:00 2001 From: Stanley Chu Date: Fri, 12 Jun 2020 09:26:24 +0800 Subject: [PATCH 048/127] scsi: ufs: Add DELAY_BEFORE_LPM quirk for Micron devices [ Upstream commit c0a18ee0ce78d7957ec1a53be35b1b3beba80668 ] It is confirmed that Micron device needs DELAY_BEFORE_LPM quirk to have a delay before VCC is powered off. Sdd Micron vendor ID and this quirk for Micron devices. Link: https://lore.kernel.org/r/20200612012625.6615-2-stanley.chu@mediatek.com Reviewed-by: Bean Huo Reviewed-by: Alim Akhtar Signed-off-by: Stanley Chu Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/ufs/ufs_quirks.h | 1 + drivers/scsi/ufs/ufshcd.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/drivers/scsi/ufs/ufs_quirks.h b/drivers/scsi/ufs/ufs_quirks.h index 71f73d1d1ad1..6c944fbefd40 100644 --- a/drivers/scsi/ufs/ufs_quirks.h +++ b/drivers/scsi/ufs/ufs_quirks.h @@ -21,6 +21,7 @@ #define UFS_ANY_VENDOR 0xFFFF #define UFS_ANY_MODEL "ANY_MODEL" +#define UFS_VENDOR_MICRON 0x12C #define UFS_VENDOR_TOSHIBA 0x198 #define UFS_VENDOR_SAMSUNG 0x1CE #define UFS_VENDOR_SKHYNIX 0x1AD diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 1e2a97a10033..11e917b44a0f 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -189,6 +189,8 @@ ufs_get_desired_pm_lvl_for_dev_link_state(enum ufs_dev_pwr_mode dev_state, static struct ufs_dev_fix ufs_fixups[] = { /* UFS cards deviations table */ + UFS_FIX(UFS_VENDOR_MICRON, UFS_ANY_MODEL, + UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM), UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM), UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, UFS_DEVICE_NO_VCCQ), From 87f1b49ee84f63f49bdba5e67e836d06117f59b5 Mon Sep 17 00:00:00 2001 From: Chuhong Yuan Date: Fri, 5 Jun 2020 18:17:28 +0200 Subject: [PATCH 049/127] media: budget-core: Improve exception handling in budget_register() [ Upstream commit fc0456458df8b3421dba2a5508cd817fbc20ea71 ] budget_register() has no error handling after its failure. Add the missed undo functions for error handling to fix it. Signed-off-by: Chuhong Yuan Signed-off-by: Sean Young Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- drivers/media/pci/ttpci/budget-core.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/media/pci/ttpci/budget-core.c b/drivers/media/pci/ttpci/budget-core.c index 97499b2af714..20524376b83b 100644 --- a/drivers/media/pci/ttpci/budget-core.c +++ b/drivers/media/pci/ttpci/budget-core.c @@ -383,20 +383,25 @@ static int budget_register(struct budget *budget) ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->hw_frontend); if (ret < 0) - return ret; + goto err_release_dmx; budget->mem_frontend.source = DMX_MEMORY_FE; ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->mem_frontend); if (ret < 0) - return ret; + goto err_release_dmx; ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &budget->hw_frontend); if (ret < 0) - return ret; + goto err_release_dmx; dvb_net_init(&budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx); return 0; + +err_release_dmx: + dvb_dmxdev_release(&budget->dmxdev); + dvb_dmx_release(&budget->demux); + return ret; } static void budget_unregister(struct budget *budget) From 59e8bcc1f6fa6512786c6b703496bc6d3446f5c2 Mon Sep 17 00:00:00 2001 From: Huacai Chen Date: Sat, 20 Jun 2020 20:04:43 +0800 Subject: [PATCH 050/127] rtc: goldfish: Enable interrupt in set_alarm() when necessary [ Upstream commit 22f8d5a1bf230cf8567a4121fc3789babb46336d ] When use goldfish rtc, the "hwclock" command fails with "select() to /dev/rtc to wait for clock tick timed out". This is because "hwclock" need the set_alarm() hook to enable interrupt when alrm->enabled is true. This operation is missing in goldfish rtc (but other rtc drivers, such as cmos rtc, enable interrupt here), so add it. Signed-off-by: Huacai Chen Signed-off-by: Jiaxun Yang Signed-off-by: Alexandre Belloni Link: https://lore.kernel.org/r/1592654683-31314-1-git-send-email-chenhc@lemote.com Signed-off-by: Sasha Levin --- drivers/rtc/rtc-goldfish.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/rtc/rtc-goldfish.c b/drivers/rtc/rtc-goldfish.c index a1c44d0c8557..30cbe22c57a8 100644 --- a/drivers/rtc/rtc-goldfish.c +++ b/drivers/rtc/rtc-goldfish.c @@ -87,6 +87,7 @@ static int goldfish_rtc_set_alarm(struct device *dev, rtc_alarm64 = rtc_alarm * NSEC_PER_SEC; writel((rtc_alarm64 >> 32), base + TIMER_ALARM_HIGH); writel(rtc_alarm64, base + TIMER_ALARM_LOW); + writel(1, base + TIMER_IRQ_ENABLED); } else { /* * if this function was called with enabled=0 From d18cbd381c83f53d9ef20c9504c91edc0bf244de Mon Sep 17 00:00:00 2001 From: Evgeny Novikov Date: Fri, 10 Jul 2020 11:02:23 +0200 Subject: [PATCH 051/127] media: vpss: clean up resources in init [ Upstream commit 9c487b0b0ea7ff22127fe99a7f67657d8730ff94 ] If platform_driver_register() fails within vpss_init() resources are not cleaned up. The patch fixes this issue by introducing the corresponding error handling. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Evgeny Novikov Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- drivers/media/platform/davinci/vpss.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/davinci/vpss.c b/drivers/media/platform/davinci/vpss.c index 2ee4cd9e6d80..d984f45c0314 100644 --- a/drivers/media/platform/davinci/vpss.c +++ b/drivers/media/platform/davinci/vpss.c @@ -514,19 +514,31 @@ static void vpss_exit(void) static int __init vpss_init(void) { + int ret; + if (!request_mem_region(VPSS_CLK_CTRL, 4, "vpss_clock_control")) return -EBUSY; oper_cfg.vpss_regs_base2 = ioremap(VPSS_CLK_CTRL, 4); if (unlikely(!oper_cfg.vpss_regs_base2)) { - release_mem_region(VPSS_CLK_CTRL, 4); - return -ENOMEM; + ret = -ENOMEM; + goto err_ioremap; } writel(VPSS_CLK_CTRL_VENCCLKEN | - VPSS_CLK_CTRL_DACCLKEN, oper_cfg.vpss_regs_base2); + VPSS_CLK_CTRL_DACCLKEN, oper_cfg.vpss_regs_base2); - return platform_driver_register(&vpss_driver); + ret = platform_driver_register(&vpss_driver); + if (ret) + goto err_pd_register; + + return 0; + +err_pd_register: + iounmap(oper_cfg.vpss_regs_base2); +err_ioremap: + release_mem_region(VPSS_CLK_CTRL, 4); + return ret; } subsys_initcall(vpss_init); module_exit(vpss_exit); From d3eb5be2b7a76e59c2827c77ae1ce845ab8f972a Mon Sep 17 00:00:00 2001 From: Xiongfeng Wang Date: Tue, 21 Jul 2020 22:24:07 -0700 Subject: [PATCH 052/127] Input: psmouse - add a newline when printing 'proto' by sysfs [ Upstream commit 4aec14de3a15cf9789a0e19c847f164776f49473 ] When I cat parameter 'proto' by sysfs, it displays as follows. It's better to add a newline for easy reading. root@syzkaller:~# cat /sys/module/psmouse/parameters/proto autoroot@syzkaller:~# Signed-off-by: Xiongfeng Wang Link: https://lore.kernel.org/r/20200720073846.120724-1-wangxiongfeng2@huawei.com Signed-off-by: Dmitry Torokhov Signed-off-by: Sasha Levin --- drivers/input/mouse/psmouse-base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 8ac9e03c05b4..ca8f726dab2e 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c @@ -2012,7 +2012,7 @@ static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp) { int type = *((unsigned int *)kp->arg); - return sprintf(buffer, "%s", psmouse_protocol_by_type(type)->name); + return sprintf(buffer, "%s\n", psmouse_protocol_by_type(type)->name); } static int __init psmouse_init(void) From 951e12c66ea4aa31af3be9de97abd20fc3c11294 Mon Sep 17 00:00:00 2001 From: Greg Ungerer Date: Sat, 13 Jun 2020 17:17:52 +1000 Subject: [PATCH 053/127] m68knommu: fix overwriting of bits in ColdFire V3 cache control [ Upstream commit bdee0e793cea10c516ff48bf3ebb4ef1820a116b ] The Cache Control Register (CACR) of the ColdFire V3 has bits that control high level caching functions, and also enable/disable the use of the alternate stack pointer register (the EUSP bit) to provide separate supervisor and user stack pointer registers. The code as it is today will blindly clear the EUSP bit on cache actions like invalidation. So it is broken for this case - and that will result in failed booting (interrupt entry and exit processing will be completely hosed). This only affects ColdFire V3 parts that support the alternate stack register (like the 5329 for example) - generally speaking new parts do, older parts don't. It has no impact on ColdFire V3 parts with the single stack pointer, like the 5307 for example. Fix the cache bit defines used, so they maintain the EUSP bit when carrying out cache actions through the CACR register. Signed-off-by: Greg Ungerer Signed-off-by: Sasha Levin --- arch/m68k/include/asm/m53xxacr.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/m68k/include/asm/m53xxacr.h b/arch/m68k/include/asm/m53xxacr.h index 9138a624c5c8..692f90e7fecc 100644 --- a/arch/m68k/include/asm/m53xxacr.h +++ b/arch/m68k/include/asm/m53xxacr.h @@ -89,9 +89,9 @@ * coherency though in all cases. And for copyback caches we will need * to push cached data as well. */ -#define CACHE_INIT CACR_CINVA -#define CACHE_INVALIDATE CACR_CINVA -#define CACHE_INVALIDATED CACR_CINVA +#define CACHE_INIT (CACHE_MODE + CACR_CINVA - CACR_EC) +#define CACHE_INVALIDATE (CACHE_MODE + CACR_CINVA) +#define CACHE_INVALIDATED (CACHE_MODE + CACR_CINVA) #define ACR0_MODE ((CONFIG_RAMBASE & 0xff000000) + \ (0x000f0000) + \ From 5d53c0bf7dbbd28ff731f39047d593652cd950f1 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Tue, 14 Jul 2020 10:36:09 -0700 Subject: [PATCH 054/127] xfs: fix inode quota reservation checks [ Upstream commit f959b5d037e71a4d69b5bf71faffa065d9269b4a ] xfs_trans_dqresv is the function that we use to make reservations against resource quotas. Each resource contains two counters: the q_core counter, which tracks resources allocated on disk; and the dquot reservation counter, which tracks how much of that resource has either been allocated or reserved by threads that are working on metadata updates. For disk blocks, we compare the proposed reservation counter against the hard and soft limits to decide if we're going to fail the operation. However, for inodes we inexplicably compare against the q_core counter, not the incore reservation count. Since the q_core counter is always lower than the reservation count and we unlock the dquot between reservation and transaction commit, this means that multiple threads can reserve the last inode count before we hit the hard limit, and when they commit, we'll be well over the hard limit. Fix this by checking against the incore inode reservation counter, since we would appear to maintain that correctly (and that's what we report in GETQUOTA). Signed-off-by: Darrick J. Wong Reviewed-by: Allison Collins Reviewed-by: Chandan Babu R Reviewed-by: Christoph Hellwig Signed-off-by: Sasha Levin --- fs/xfs/xfs_trans_dquot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index c3d547211d16..9c42e50a5cb7 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -669,7 +669,7 @@ xfs_trans_dqresv( } } if (ninos > 0) { - total_count = be64_to_cpu(dqp->q_core.d_icount) + ninos; + total_count = dqp->q_res_icount + ninos; timer = be32_to_cpu(dqp->q_core.d_itimer); warns = be16_to_cpu(dqp->q_core.d_iwarns); warnlimit = dqp->q_mount->m_quotainfo->qi_iwarnlimit; From f851d159b2b1f068d167f62a951dc9f52558bcc3 Mon Sep 17 00:00:00 2001 From: Zhe Li Date: Fri, 19 Jun 2020 17:06:35 +0800 Subject: [PATCH 055/127] jffs2: fix UAF problem [ Upstream commit 798b7347e4f29553db4b996393caf12f5b233daf ] The log of UAF problem is listed below. BUG: KASAN: use-after-free in jffs2_rmdir+0xa4/0x1cc [jffs2] at addr c1f165fc Read of size 4 by task rm/8283 ============================================================================= BUG kmalloc-32 (Tainted: P B O ): kasan: bad access detected ----------------------------------------------------------------------------- INFO: Allocated in 0xbbbbbbbb age=3054364 cpu=0 pid=0 0xb0bba6ef jffs2_write_dirent+0x11c/0x9c8 [jffs2] __slab_alloc.isra.21.constprop.25+0x2c/0x44 __kmalloc+0x1dc/0x370 jffs2_write_dirent+0x11c/0x9c8 [jffs2] jffs2_do_unlink+0x328/0x5fc [jffs2] jffs2_rmdir+0x110/0x1cc [jffs2] vfs_rmdir+0x180/0x268 do_rmdir+0x2cc/0x300 ret_from_syscall+0x0/0x3c INFO: Freed in 0x205b age=3054364 cpu=0 pid=0 0x2e9173 jffs2_add_fd_to_list+0x138/0x1dc [jffs2] jffs2_add_fd_to_list+0x138/0x1dc [jffs2] jffs2_garbage_collect_dirent.isra.3+0x21c/0x288 [jffs2] jffs2_garbage_collect_live+0x16bc/0x1800 [jffs2] jffs2_garbage_collect_pass+0x678/0x11d4 [jffs2] jffs2_garbage_collect_thread+0x1e8/0x3b0 [jffs2] kthread+0x1a8/0x1b0 ret_from_kernel_thread+0x5c/0x64 Call Trace: [c17ddd20] [c02452d4] kasan_report.part.0+0x298/0x72c (unreliable) [c17ddda0] [d2509680] jffs2_rmdir+0xa4/0x1cc [jffs2] [c17dddd0] [c026da04] vfs_rmdir+0x180/0x268 [c17dde00] [c026f4e4] do_rmdir+0x2cc/0x300 [c17ddf40] [c001a658] ret_from_syscall+0x0/0x3c The root cause is that we don't get "jffs2_inode_info.sem" before we scan list "jffs2_inode_info.dents" in function jffs2_rmdir. This patch add codes to get "jffs2_inode_info.sem" before we scan "jffs2_inode_info.dents" to slove the UAF problem. Signed-off-by: Zhe Li Reviewed-by: Hou Tao Signed-off-by: Richard Weinberger Signed-off-by: Sasha Levin --- fs/jffs2/dir.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index e5a6deb38e1e..f4a5ec92f5dc 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c @@ -590,10 +590,14 @@ static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry) int ret; uint32_t now = get_seconds(); + mutex_lock(&f->sem); for (fd = f->dents ; fd; fd = fd->next) { - if (fd->ino) + if (fd->ino) { + mutex_unlock(&f->sem); return -ENOTEMPTY; + } } + mutex_unlock(&f->sem); ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name, dentry->d_name.len, f, now); From 8281409d9ed37045a2e54411d03316590e2f663a Mon Sep 17 00:00:00 2001 From: Srinivas Pandruvada Date: Mon, 3 Aug 2020 11:37:20 -0700 Subject: [PATCH 056/127] cpufreq: intel_pstate: Fix cpuinfo_max_freq when MSR_TURBO_RATIO_LIMIT is 0 [ Upstream commit 4daca379c703ff55edc065e8e5173dcfeecf0148 ] The MSR_TURBO_RATIO_LIMIT can be 0. This is not an error. User can update this MSR via BIOS settings on some systems or can use msr tools to update. Also some systems boot with value = 0. This results in display of cpufreq/cpuinfo_max_freq wrong. This value will be equal to cpufreq/base_frequency, even though turbo is enabled. But platform will still function normally in HWP mode as we get max 1-core frequency from the MSR_HWP_CAPABILITIES. This MSR is already used to calculate cpu->pstate.turbo_freq, which is used for to set policy->cpuinfo.max_freq. But some other places cpu->pstate.turbo_pstate is used. For example to set policy->max. To fix this, also update cpu->pstate.turbo_pstate when updating cpu->pstate.turbo_freq. Signed-off-by: Srinivas Pandruvada Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/cpufreq/intel_pstate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 1aa0b05c8cbd..5c41dc9aaa46 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c @@ -1378,6 +1378,7 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu) intel_pstate_get_hwp_max(cpu->cpu, &phy_max, ¤t_max); cpu->pstate.turbo_freq = phy_max * cpu->pstate.scaling; + cpu->pstate.turbo_pstate = phy_max; } else { cpu->pstate.turbo_freq = cpu->pstate.turbo_pstate * cpu->pstate.scaling; } From 9b5681afc9e69f7cacd769c7274f1d2a102257f7 Mon Sep 17 00:00:00 2001 From: Javed Hasan Date: Wed, 29 Jul 2020 01:18:23 -0700 Subject: [PATCH 057/127] scsi: libfc: Free skb in fc_disc_gpn_id_resp() for valid cases [ Upstream commit ec007ef40abb6a164d148b0dc19789a7a2de2cc8 ] In fc_disc_gpn_id_resp(), skb is supposed to get freed in all cases except for PTR_ERR. However, in some cases it didn't. This fix is to call fc_frame_free(fp) before function returns. Link: https://lore.kernel.org/r/20200729081824.30996-2-jhasan@marvell.com Reviewed-by: Girish Basrur Reviewed-by: Santosh Vernekar Reviewed-by: Saurav Kashyap Reviewed-by: Shyam Sundar Signed-off-by: Javed Hasan Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/libfc/fc_disc.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c index 28b50ab2fbb0..62f83cc151b2 100644 --- a/drivers/scsi/libfc/fc_disc.c +++ b/drivers/scsi/libfc/fc_disc.c @@ -605,8 +605,12 @@ static void fc_disc_gpn_id_resp(struct fc_seq *sp, struct fc_frame *fp, if (PTR_ERR(fp) == -FC_EX_CLOSED) goto out; - if (IS_ERR(fp)) - goto redisc; + if (IS_ERR(fp)) { + mutex_lock(&disc->disc_mutex); + fc_disc_restart(disc); + mutex_unlock(&disc->disc_mutex); + goto out; + } cp = fc_frame_payload_get(fp, sizeof(*cp)); if (!cp) @@ -633,7 +637,7 @@ static void fc_disc_gpn_id_resp(struct fc_seq *sp, struct fc_frame *fp, new_rdata->disc_id = disc->disc_id; fc_rport_login(new_rdata); } - goto out; + goto free_fp; } rdata->disc_id = disc->disc_id; mutex_unlock(&rdata->rp_mutex); @@ -650,6 +654,8 @@ redisc: fc_disc_restart(disc); mutex_unlock(&disc->disc_mutex); } +free_fp: + fc_frame_free(fp); out: kref_put(&rdata->kref, fc_rport_destroy); if (!IS_ERR(fp)) From 1f49e8cefa5a313d69dedfec8e47745231914c06 Mon Sep 17 00:00:00 2001 From: Mao Wenan Date: Sun, 2 Aug 2020 15:44:09 +0800 Subject: [PATCH 058/127] virtio_ring: Avoid loop when vq is broken in virtqueue_poll [ Upstream commit 481a0d7422db26fb63e2d64f0652667a5c6d0f3e ] The loop may exist if vq->broken is true, virtqueue_get_buf_ctx_packed or virtqueue_get_buf_ctx_split will return NULL, so virtnet_poll will reschedule napi to receive packet, it will lead cpu usage(si) to 100%. call trace as below: virtnet_poll virtnet_receive virtqueue_get_buf_ctx virtqueue_get_buf_ctx_packed virtqueue_get_buf_ctx_split virtqueue_napi_complete virtqueue_poll //return true virtqueue_napi_schedule //it will reschedule napi to fix this, return false if vq is broken in virtqueue_poll. Signed-off-by: Mao Wenan Acked-by: Michael S. Tsirkin Link: https://lore.kernel.org/r/1596354249-96204-1-git-send-email-wenan.mao@linux.alibaba.com Signed-off-by: Michael S. Tsirkin Acked-by: Jason Wang Signed-off-by: Sasha Levin --- drivers/virtio/virtio_ring.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index b82bb0b08161..51278f8bd3ab 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -829,6 +829,9 @@ bool virtqueue_poll(struct virtqueue *_vq, unsigned last_used_idx) { struct vring_virtqueue *vq = to_vvq(_vq); + if (unlikely(vq->broken)) + return false; + virtio_mb(vq->weak_barriers); return (u16)last_used_idx != virtio16_to_cpu(_vq->vdev, vq->vring.used->idx); } From 1f37616ecb66710ff50ec8c2f97068b7809f4aaa Mon Sep 17 00:00:00 2001 From: Eiichi Tsukata Date: Thu, 6 Aug 2020 15:18:48 -0700 Subject: [PATCH 059/127] xfs: Fix UBSAN null-ptr-deref in xfs_sysfs_init [ Upstream commit 96cf2a2c75567ff56195fe3126d497a2e7e4379f ] If xfs_sysfs_init is called with parent_kobj == NULL, UBSAN shows the following warning: UBSAN: null-ptr-deref in ./fs/xfs/xfs_sysfs.h:37:23 member access within null pointer of type 'struct xfs_kobj' Call Trace: dump_stack+0x10e/0x195 ubsan_type_mismatch_common+0x241/0x280 __ubsan_handle_type_mismatch_v1+0x32/0x40 init_xfs_fs+0x12b/0x28f do_one_initcall+0xdd/0x1d0 do_initcall_level+0x151/0x1b6 do_initcalls+0x50/0x8f do_basic_setup+0x29/0x2b kernel_init_freeable+0x19f/0x20b kernel_init+0x11/0x1e0 ret_from_fork+0x22/0x30 Fix it by checking parent_kobj before the code accesses its member. Signed-off-by: Eiichi Tsukata Reviewed-by: Darrick J. Wong [darrick: minor whitespace edits] Signed-off-by: Darrick J. Wong Signed-off-by: Sasha Levin --- fs/xfs/xfs_sysfs.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_sysfs.h b/fs/xfs/xfs_sysfs.h index d04637181ef2..980c9429abec 100644 --- a/fs/xfs/xfs_sysfs.h +++ b/fs/xfs/xfs_sysfs.h @@ -44,9 +44,11 @@ xfs_sysfs_init( struct xfs_kobj *parent_kobj, const char *name) { + struct kobject *parent; + + parent = parent_kobj ? &parent_kobj->kobject : NULL; init_completion(&kobj->complete); - return kobject_init_and_add(&kobj->kobject, ktype, - &parent_kobj->kobject, "%s", name); + return kobject_init_and_add(&kobj->kobject, ktype, parent, "%s", name); } static inline void From d254a3e6c3b9a35c27c1bf7027be3ccb26b2d12a Mon Sep 17 00:00:00 2001 From: Luc Van Oostenryck Date: Tue, 11 Aug 2020 18:33:54 -0700 Subject: [PATCH 060/127] alpha: fix annotation of io{read,write}{16,32}be() [ Upstream commit bd72866b8da499e60633ff28f8a4f6e09ca78efe ] These accessors must be used to read/write a big-endian bus. The value returned or written is native-endian. However, these accessors are defined using be{16,32}_to_cpu() or cpu_to_be{16,32}() to make the endian conversion but these expect a __be{16,32} when none is present. Keeping them would need a force cast that would solve nothing at all. So, do the conversion using swab{16,32}, like done in asm-generic for similar situations. Reported-by: kernel test robot Signed-off-by: Luc Van Oostenryck Signed-off-by: Andrew Morton Cc: Richard Henderson Cc: Ivan Kokshaysky Cc: Matt Turner Cc: Stephen Boyd Cc: Arnd Bergmann Link: http://lkml.kernel.org/r/20200622114232.80039-1-luc.vanoostenryck@gmail.com Signed-off-by: Linus Torvalds Signed-off-by: Sasha Levin --- arch/alpha/include/asm/io.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h index d123ff90f7a8..9995bed6e92e 100644 --- a/arch/alpha/include/asm/io.h +++ b/arch/alpha/include/asm/io.h @@ -493,10 +493,10 @@ extern inline void writeq(u64 b, volatile void __iomem *addr) } #endif -#define ioread16be(p) be16_to_cpu(ioread16(p)) -#define ioread32be(p) be32_to_cpu(ioread32(p)) -#define iowrite16be(v,p) iowrite16(cpu_to_be16(v), (p)) -#define iowrite32be(v,p) iowrite32(cpu_to_be32(v), (p)) +#define ioread16be(p) swab16(ioread16(p)) +#define ioread32be(p) swab32(ioread32(p)) +#define iowrite16be(v,p) iowrite16(swab16(v), (p)) +#define iowrite32be(v,p) iowrite32(swab32(v), (p)) #define inb_p inb #define inw_p inw From fbbfd55a40d5d0806b59ee0403c75d5ac517533f Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Wed, 17 Jun 2020 14:19:04 -0500 Subject: [PATCH 061/127] ext4: fix potential negative array index in do_split() [ Upstream commit 5872331b3d91820e14716632ebb56b1399b34fe1 ] If for any reason a directory passed to do_split() does not have enough active entries to exceed half the size of the block, we can end up iterating over all "count" entries without finding a split point. In this case, count == move, and split will be zero, and we will attempt a negative index into map[]. Guard against this by detecting this case, and falling back to split-to-half-of-count instead; in this case we will still have plenty of space (> half blocksize) in each split block. Fixes: ef2b02d3e617 ("ext34: ensure do_split leaves enough free space in both blocks") Signed-off-by: Eric Sandeen Reviewed-by: Andreas Dilger Reviewed-by: Jan Kara Link: https://lore.kernel.org/r/f53e246b-647c-64bb-16ec-135383c70ad7@redhat.com Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/namei.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index ed17edb31e22..3f999053457b 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1741,7 +1741,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, blocksize, hinfo, map); map -= count; dx_sort_map(map, count); - /* Split the existing block in the middle, size-wise */ + /* Ensure that neither split block is over half full */ size = 0; move = 0; for (i = count-1; i >= 0; i--) { @@ -1751,8 +1751,18 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, size += map[i].size; move++; } - /* map index at which we will split */ - split = count - move; + /* + * map index at which we will split + * + * If the sum of active entries didn't exceed half the block size, just + * split it in half by count; each resulting block will have at least + * half the space free. + */ + if (i > 0) + split = count - move; + else + split = count/2; + hash2 = map[split].hash; continued = hash2 == map[split - 1].hash; dxtrace(printk(KERN_INFO "Split block %lu at %x, %i/%i\n", From 32da7d0a9cff974f62cd8d3eb8e636297842a05a Mon Sep 17 00:00:00 2001 From: Przemyslaw Patynowski Date: Thu, 6 Aug 2020 13:40:59 +0000 Subject: [PATCH 062/127] i40e: Set RX_ONLY mode for unicast promiscuous on VLAN [ Upstream commit 4bd5e02a2ed1575c2f65bd3c557a077dd399f0e8 ] Trusted VF with unicast promiscuous mode set, could listen to TX traffic of other VFs. Set unicast promiscuous mode to RX traffic, if VSI has port VLAN configured. Rename misleading I40E_AQC_SET_VSI_PROMISC_TX bit to I40E_AQC_SET_VSI_PROMISC_RX_ONLY. Aligned unicast promiscuous with VLAN to the one without VLAN. Fixes: 6c41a7606967 ("i40e: Add promiscuous on VLAN support") Fixes: 3b1200891b7f ("i40e: When in promisc mode apply promisc mode to Tx Traffic as well") Signed-off-by: Przemyslaw Patynowski Signed-off-by: Aleksandr Loktionov Signed-off-by: Arkadiusz Kubalewski Tested-by: Andrew Bowers Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- .../net/ethernet/intel/i40e/i40e_adminq_cmd.h | 2 +- drivers/net/ethernet/intel/i40e/i40e_common.c | 35 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h index 5d5f422cbae5..f82da2b47d9a 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h @@ -1175,7 +1175,7 @@ struct i40e_aqc_set_vsi_promiscuous_modes { #define I40E_AQC_SET_VSI_PROMISC_BROADCAST 0x04 #define I40E_AQC_SET_VSI_DEFAULT 0x08 #define I40E_AQC_SET_VSI_PROMISC_VLAN 0x10 -#define I40E_AQC_SET_VSI_PROMISC_TX 0x8000 +#define I40E_AQC_SET_VSI_PROMISC_RX_ONLY 0x8000 __le16 seid; #define I40E_AQC_VSI_PROM_CMD_SEID_MASK 0x3FF __le16 vlan_tag; diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c index 111426ba5fbc..3fd2dfaf2bd5 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_common.c +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c @@ -1914,6 +1914,21 @@ i40e_status i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags, return status; } +/** + * i40e_is_aq_api_ver_ge + * @aq: pointer to AdminQ info containing HW API version to compare + * @maj: API major value + * @min: API minor value + * + * Assert whether current HW API version is greater/equal than provided. + **/ +static bool i40e_is_aq_api_ver_ge(struct i40e_adminq_info *aq, u16 maj, + u16 min) +{ + return (aq->api_maj_ver > maj || + (aq->api_maj_ver == maj && aq->api_min_ver >= min)); +} + /** * i40e_aq_add_vsi * @hw: pointer to the hw struct @@ -2039,18 +2054,16 @@ i40e_status i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw, if (set) { flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST; - if (rx_only_promisc && - (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) || - (hw->aq.api_maj_ver > 1))) - flags |= I40E_AQC_SET_VSI_PROMISC_TX; + if (rx_only_promisc && i40e_is_aq_api_ver_ge(&hw->aq, 1, 5)) + flags |= I40E_AQC_SET_VSI_PROMISC_RX_ONLY; } cmd->promiscuous_flags = cpu_to_le16(flags); cmd->valid_flags = cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_UNICAST); - if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) || - (hw->aq.api_maj_ver > 1)) - cmd->valid_flags |= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_TX); + if (i40e_is_aq_api_ver_ge(&hw->aq, 1, 5)) + cmd->valid_flags |= + cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_RX_ONLY); cmd->seid = cpu_to_le16(seid); status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); @@ -2147,11 +2160,17 @@ enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw, i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_vsi_promiscuous_modes); - if (enable) + if (enable) { flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST; + if (i40e_is_aq_api_ver_ge(&hw->aq, 1, 5)) + flags |= I40E_AQC_SET_VSI_PROMISC_RX_ONLY; + } cmd->promiscuous_flags = cpu_to_le16(flags); cmd->valid_flags = cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_UNICAST); + if (i40e_is_aq_api_ver_ge(&hw->aq, 1, 5)) + cmd->valid_flags |= + cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_RX_ONLY); cmd->seid = cpu_to_le16(seid); cmd->vlan_tag = cpu_to_le16(vid | I40E_AQC_SET_VSI_VLAN_VALID); From 12427446b40d5e896923aa7e592a5eb7f865c1e5 Mon Sep 17 00:00:00 2001 From: Grzegorz Szczurek Date: Tue, 11 Aug 2020 10:56:49 +0000 Subject: [PATCH 063/127] i40e: Fix crash during removing i40e driver [ Upstream commit 5b6d4a7f20b09c47ca598760f6dafd554af8b6d5 ] Fix the reason of crashing system by add waiting time to finish reset recovery process before starting remove driver procedure. Now VSI is releasing if VSI is not in reset recovery mode. Without this fix it was possible to start remove driver if other processing command need reset recovery procedure which resulted in null pointer dereference. VSI used by the ethtool process has been cleared by remove driver process. [ 6731.508665] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 6731.508668] #PF: supervisor read access in kernel mode [ 6731.508670] #PF: error_code(0x0000) - not-present page [ 6731.508671] PGD 0 P4D 0 [ 6731.508674] Oops: 0000 [#1] SMP PTI [ 6731.508679] Hardware name: Intel Corporation S2600WT2R/S2600WT2R, BIOS SE5C610.86B.01.01.0021.032120170601 03/21/2017 [ 6731.508694] RIP: 0010:i40e_down+0x252/0x310 [i40e] [ 6731.508696] Code: c7 78 de fa c0 e8 61 02 3a c1 66 83 bb f6 0c 00 00 00 0f 84 bf 00 00 00 45 31 e4 45 31 ff eb 03 41 89 c7 48 8b 83 98 0c 00 00 <4a> 8b 3c 20 e8 a5 79 02 00 48 83 bb d0 0c 00 00 00 74 10 48 8b 83 [ 6731.508698] RSP: 0018:ffffb75ac7b3faf0 EFLAGS: 00010246 [ 6731.508700] RAX: 0000000000000000 RBX: ffff9c9874bd5000 RCX: 0000000000000007 [ 6731.508701] RDX: 0000000000000000 RSI: 0000000000000096 RDI: ffff9c987f4d9780 [ 6731.508703] RBP: ffffb75ac7b3fb30 R08: 0000000000005b60 R09: 0000000000000004 [ 6731.508704] R10: ffffb75ac64fbd90 R11: 0000000000000001 R12: 0000000000000000 [ 6731.508706] R13: ffff9c97a08e0000 R14: ffff9c97a08e0a68 R15: 0000000000000000 [ 6731.508708] FS: 00007f2617cd2740(0000) GS:ffff9c987f4c0000(0000) knlGS:0000000000000000 [ 6731.508710] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 6731.508711] CR2: 0000000000000000 CR3: 0000001e765c4006 CR4: 00000000003606e0 [ 6731.508713] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 6731.508714] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 6731.508715] Call Trace: [ 6731.508734] i40e_vsi_close+0x84/0x90 [i40e] [ 6731.508742] i40e_quiesce_vsi.part.98+0x3c/0x40 [i40e] [ 6731.508749] i40e_pf_quiesce_all_vsi+0x55/0x60 [i40e] [ 6731.508757] i40e_prep_for_reset+0x59/0x130 [i40e] [ 6731.508765] i40e_reconfig_rss_queues+0x5a/0x120 [i40e] [ 6731.508774] i40e_set_channels+0xda/0x170 [i40e] [ 6731.508778] ethtool_set_channels+0xe9/0x150 [ 6731.508781] dev_ethtool+0x1b94/0x2920 [ 6731.508805] dev_ioctl+0xc2/0x590 [ 6731.508811] sock_do_ioctl+0xae/0x150 [ 6731.508813] sock_ioctl+0x34f/0x3c0 [ 6731.508821] ksys_ioctl+0x98/0xb0 [ 6731.508828] __x64_sys_ioctl+0x1a/0x20 [ 6731.508831] do_syscall_64+0x57/0x1c0 [ 6731.508835] entry_SYSCALL_64_after_hwframe+0x44/0xa9 Fixes: 4b8164467b85 ("i40e: Add common function for finding VSI by type") Signed-off-by: Grzegorz Szczurek Signed-off-by: Arkadiusz Kubalewski Tested-by: Aaron Brown Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/i40e/i40e_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index aa2b446d6ad0..f4475cbf8ce8 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -11822,6 +11822,9 @@ static void i40e_remove(struct pci_dev *pdev) i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), 0); i40e_write_rx_ctl(hw, I40E_PFQF_HENA(1), 0); + while (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) + usleep_range(1000, 2000); + /* no more scheduling of any task */ set_bit(__I40E_SUSPENDED, pf->state); set_bit(__I40E_DOWN, pf->state); From b1feb356d983a642b2e62e893afb699af22dfdfe Mon Sep 17 00:00:00 2001 From: Fugang Duan Date: Thu, 13 Aug 2020 15:13:14 +0800 Subject: [PATCH 064/127] net: fec: correct the error path for regulator disable in probe [ Upstream commit c6165cf0dbb82ded90163dce3ac183fc7a913dc4 ] Correct the error path for regulator disable. Fixes: 9269e5560b26 ("net: fec: add phy-reset-gpios PROBE_DEFER check") Signed-off-by: Fugang Duan Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/freescale/fec_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 8ba915cc4c2e..22f964ef859e 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -3536,11 +3536,11 @@ failed_mii_init: failed_irq: failed_init: fec_ptp_stop(pdev); - if (fep->reg_phy) - regulator_disable(fep->reg_phy); failed_reset: pm_runtime_put_noidle(&pdev->dev); pm_runtime_disable(&pdev->dev); + if (fep->reg_phy) + regulator_disable(fep->reg_phy); failed_regulator: clk_disable_unprepare(fep->clk_ahb); failed_clk_ahb: From fcb549293e51076e334ffce7fa0683c8d63e012e Mon Sep 17 00:00:00 2001 From: Jarod Wilson Date: Thu, 13 Aug 2020 10:09:00 -0400 Subject: [PATCH 065/127] bonding: show saner speed for broadcast mode [ Upstream commit 4ca0d9ac3fd8f9f90b72a15d8da2aca3ffb58418 ] Broadcast mode bonds transmit a copy of all traffic simultaneously out of all interfaces, so the "speed" of the bond isn't really the aggregate of all interfaces, but rather, the speed of the slowest active interface. Also, the type of the speed field is u32, not unsigned long, so adjust that accordingly, as required to make min() function here without complaining about mismatching types. Fixes: bb5b052f751b ("bond: add support to read speed and duplex via ethtool") CC: Jay Vosburgh CC: Veaceslav Falico CC: Andy Gospodarek CC: "David S. Miller" CC: netdev@vger.kernel.org Acked-by: Jay Vosburgh Signed-off-by: Jarod Wilson Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/bonding/bond_main.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 1f867e275408..9ddbafdca3b0 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -4156,13 +4156,23 @@ static netdev_tx_t bond_start_xmit(struct sk_buff *skb, struct net_device *dev) return ret; } +static u32 bond_mode_bcast_speed(struct slave *slave, u32 speed) +{ + if (speed == 0 || speed == SPEED_UNKNOWN) + speed = slave->speed; + else + speed = min(speed, slave->speed); + + return speed; +} + static int bond_ethtool_get_link_ksettings(struct net_device *bond_dev, struct ethtool_link_ksettings *cmd) { struct bonding *bond = netdev_priv(bond_dev); - unsigned long speed = 0; struct list_head *iter; struct slave *slave; + u32 speed = 0; cmd->base.duplex = DUPLEX_UNKNOWN; cmd->base.port = PORT_OTHER; @@ -4174,8 +4184,13 @@ static int bond_ethtool_get_link_ksettings(struct net_device *bond_dev, */ bond_for_each_slave(bond, slave, iter) { if (bond_slave_can_tx(slave)) { - if (slave->speed != SPEED_UNKNOWN) - speed += slave->speed; + if (slave->speed != SPEED_UNKNOWN) { + if (BOND_MODE(bond) == BOND_MODE_BROADCAST) + speed = bond_mode_bcast_speed(slave, + speed); + else + speed += slave->speed; + } if (cmd->base.duplex == DUPLEX_UNKNOWN && slave->duplex != DUPLEX_UNKNOWN) cmd->base.duplex = slave->duplex; From b128bd1cd1e19ed29e28c5b764389752dec3de99 Mon Sep 17 00:00:00 2001 From: Cong Wang Date: Fri, 14 Aug 2020 20:05:58 -0700 Subject: [PATCH 066/127] bonding: fix a potential double-unregister [ Upstream commit 832707021666411d04795c564a4adea5d6b94f17 ] When we tear down a network namespace, we unregister all the netdevices within it. So we may queue a slave device and a bonding device together in the same unregister queue. If the only slave device is non-ethernet, it would automatically unregister the bonding device as well. Thus, we may end up unregistering the bonding device twice. Workaround this special case by checking reg_state. Fixes: 9b5e383c11b0 ("net: Introduce unregister_netdevice_many()") Reported-by: syzbot+af23e7f3e0a7e10c8b67@syzkaller.appspotmail.com Cc: Eric Dumazet Cc: Andy Gospodarek Cc: Jay Vosburgh Signed-off-by: Cong Wang Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/bonding/bond_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 9ddbafdca3b0..a6d8d3b3c903 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -2010,7 +2010,8 @@ static int bond_release_and_destroy(struct net_device *bond_dev, int ret; ret = __bond_release_one(bond_dev, slave_dev, false, true); - if (ret == 0 && !bond_has_slaves(bond)) { + if (ret == 0 && !bond_has_slaves(bond) && + bond_dev->reg_state != NETREG_UNREGISTERING) { bond_dev->priv_flags |= IFF_DISABLE_NETPOLL; netdev_info(bond_dev, "Destroying bond %s\n", bond_dev->name); From b6ee1e72f7a94ba88c9ce6fa3406accbfa3074c2 Mon Sep 17 00:00:00 2001 From: Srinivas Kandagatla Date: Tue, 11 Aug 2020 11:34:52 +0100 Subject: [PATCH 067/127] ASoC: msm8916-wcd-analog: fix register Interrupt offset [ Upstream commit ff69c97ef84c9f7795adb49e9f07c9adcdd0c288 ] For some reason interrupt set and clear register offsets are not set correctly. This patch corrects them! Fixes: 585e881e5b9e ("ASoC: codecs: Add msm8916-wcd analog codec") Signed-off-by: Srinivas Kandagatla Tested-by: Stephan Gerhold Reviewed-by: Stephan Gerhold Link: https://lore.kernel.org/r/20200811103452.20448-1-srinivas.kandagatla@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/msm8916-wcd-analog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c index 3633eb30dd13..4f949ad50d6a 100644 --- a/sound/soc/codecs/msm8916-wcd-analog.c +++ b/sound/soc/codecs/msm8916-wcd-analog.c @@ -16,8 +16,8 @@ #define CDC_D_REVISION1 (0xf000) #define CDC_D_PERPH_SUBTYPE (0xf005) -#define CDC_D_INT_EN_SET (0x015) -#define CDC_D_INT_EN_CLR (0x016) +#define CDC_D_INT_EN_SET (0xf015) +#define CDC_D_INT_EN_CLR (0xf016) #define MBHC_SWITCH_INT BIT(7) #define MBHC_MIC_ELECTRICAL_INS_REM_DET BIT(6) #define MBHC_BUTTON_PRESS_DET BIT(5) From 9a9fca9ad05ae96a2dca9cb420861a7f80e38090 Mon Sep 17 00:00:00 2001 From: Dinghao Liu Date: Thu, 13 Aug 2020 16:41:10 +0800 Subject: [PATCH 068/127] ASoC: intel: Fix memleak in sst_media_open [ Upstream commit 062fa09f44f4fb3776a23184d5d296b0c8872eb9 ] When power_up_sst() fails, stream needs to be freed just like when try_module_get() fails. However, current code is returning directly and ends up leaking memory. Fixes: 0121327c1a68b ("ASoC: Intel: mfld-pcm: add control for powering up/down dsp") Signed-off-by: Dinghao Liu Acked-by: Pierre-Louis Bossart Link: https://lore.kernel.org/r/20200813084112.26205-1-dinghao.liu@zju.edu.cn Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/intel/atom/sst-mfld-platform-pcm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c index 4558c8b93036..3a645fc425cd 100644 --- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c +++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c @@ -339,7 +339,7 @@ static int sst_media_open(struct snd_pcm_substream *substream, ret_val = power_up_sst(stream); if (ret_val < 0) - return ret_val; + goto out_power_up; /* Make sure, that the period size is always even */ snd_pcm_hw_constraint_step(substream->runtime, 0, @@ -348,8 +348,9 @@ static int sst_media_open(struct snd_pcm_substream *substream, return snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); out_ops: - kfree(stream); mutex_unlock(&sst_lock); +out_power_up: + kfree(stream); return ret_val; } From 36e839f9c0f4a0306b645ae6bbf3d4875d20ea68 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Mon, 17 Aug 2020 11:09:13 -0600 Subject: [PATCH 069/127] vfio/type1: Add proper error unwind for vfio_iommu_replay() [ Upstream commit aae7a75a821a793ed6b8ad502a5890fb8e8f172d ] The vfio_iommu_replay() function does not currently unwind on error, yet it does pin pages, perform IOMMU mapping, and modify the vfio_dma structure to indicate IOMMU mapping. The IOMMU mappings are torn down when the domain is destroyed, but the other actions go on to cause trouble later. For example, the iommu->domain_list can be empty if we only have a non-IOMMU backed mdev attached. We don't currently check if the list is empty before getting the first entry in the list, which leads to a bogus domain pointer. If a vfio_dma entry is erroneously marked as iommu_mapped, we'll attempt to use that bogus pointer to retrieve the existing physical page addresses. This is the scenario that uncovered this issue, attempting to hot-add a vfio-pci device to a container with an existing mdev device and DMA mappings, one of which could not be pinned, causing a failure adding the new group to the existing container and setting the conditions for a subsequent attempt to explode. To resolve this, we can first check if the domain_list is empty so that we can reject replay of a bogus domain, should we ever encounter this inconsistent state again in the future. The real fix though is to add the necessary unwind support, which means cleaning up the current pinning if an IOMMU mapping fails, then walking back through the r-b tree of DMA entries, reading from the IOMMU which ranges are mapped, and unmapping and unpinning those ranges. To be able to do this, we also defer marking the DMA entry as IOMMU mapped until all entries are processed, in order to allow the unwind to know the disposition of each entry. Fixes: a54eb55045ae ("vfio iommu type1: Add support for mediated devices") Reported-by: Zhiyi Guo Tested-by: Zhiyi Guo Reviewed-by: Cornelia Huck Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- drivers/vfio/vfio_iommu_type1.c | 71 ++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 35a3750a6ddd..f22425501bc1 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -1086,13 +1086,16 @@ static int vfio_bus_type(struct device *dev, void *data) static int vfio_iommu_replay(struct vfio_iommu *iommu, struct vfio_domain *domain) { - struct vfio_domain *d; + struct vfio_domain *d = NULL; struct rb_node *n; unsigned long limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; int ret; /* Arbitrarily pick the first domain in the list for lookups */ - d = list_first_entry(&iommu->domain_list, struct vfio_domain, next); + if (!list_empty(&iommu->domain_list)) + d = list_first_entry(&iommu->domain_list, + struct vfio_domain, next); + n = rb_first(&iommu->dma_list); for (; n; n = rb_next(n)) { @@ -1110,6 +1113,11 @@ static int vfio_iommu_replay(struct vfio_iommu *iommu, phys_addr_t p; dma_addr_t i; + if (WARN_ON(!d)) { /* mapped w/o a domain?! */ + ret = -EINVAL; + goto unwind; + } + phys = iommu_iova_to_phys(d->domain, iova); if (WARN_ON(!phys)) { @@ -1139,7 +1147,7 @@ static int vfio_iommu_replay(struct vfio_iommu *iommu, if (npage <= 0) { WARN_ON(!npage); ret = (int)npage; - return ret; + goto unwind; } phys = pfn << PAGE_SHIFT; @@ -1148,14 +1156,67 @@ static int vfio_iommu_replay(struct vfio_iommu *iommu, ret = iommu_map(domain->domain, iova, phys, size, dma->prot | domain->prot); - if (ret) - return ret; + if (ret) { + if (!dma->iommu_mapped) + vfio_unpin_pages_remote(dma, iova, + phys >> PAGE_SHIFT, + size >> PAGE_SHIFT, + true); + goto unwind; + } iova += size; } + } + + /* All dmas are now mapped, defer to second tree walk for unwind */ + for (n = rb_first(&iommu->dma_list); n; n = rb_next(n)) { + struct vfio_dma *dma = rb_entry(n, struct vfio_dma, node); + dma->iommu_mapped = true; } + return 0; + +unwind: + for (; n; n = rb_prev(n)) { + struct vfio_dma *dma = rb_entry(n, struct vfio_dma, node); + dma_addr_t iova; + + if (dma->iommu_mapped) { + iommu_unmap(domain->domain, dma->iova, dma->size); + continue; + } + + iova = dma->iova; + while (iova < dma->iova + dma->size) { + phys_addr_t phys, p; + size_t size; + dma_addr_t i; + + phys = iommu_iova_to_phys(domain->domain, iova); + if (!phys) { + iova += PAGE_SIZE; + continue; + } + + size = PAGE_SIZE; + p = phys + size; + i = iova + size; + while (i < dma->iova + dma->size && + p == iommu_iova_to_phys(domain->domain, i)) { + size += PAGE_SIZE; + p += PAGE_SIZE; + i += PAGE_SIZE; + } + + iommu_unmap(domain->domain, iova, size); + vfio_unpin_pages_remote(dma, iova, phys >> PAGE_SHIFT, + size >> PAGE_SHIFT, true); + } + } + + return ret; } /* From 5ca8e51f09ffe035cdfc7ae62adf1bfa48a1f604 Mon Sep 17 00:00:00 2001 From: Jiri Wiesner Date: Sun, 16 Aug 2020 20:52:44 +0200 Subject: [PATCH 070/127] bonding: fix active-backup failover for current ARP slave [ Upstream commit 0410d07190961ac526f05085765a8d04d926545b ] When the ARP monitor is used for link detection, ARP replies are validated for all slaves (arp_validate=3) and fail_over_mac is set to active, two slaves of an active-backup bond may get stuck in a state where both of them are active and pass packets that they receive to the bond. This state makes IPv6 duplicate address detection fail. The state is reached thus: 1. The current active slave goes down because the ARP target is not reachable. 2. The current ARP slave is chosen and made active. 3. A new slave is enslaved. This new slave becomes the current active slave and can reach the ARP target. As a result, the current ARP slave stays active after the enslave action has finished and the log is littered with "PROBE BAD" messages: > bond0: PROBE: c_arp ens10 && cas ens11 BAD The workaround is to remove the slave with "going back" status from the bond and re-enslave it. This issue was encountered when DPDK PMD interfaces were being enslaved to an active-backup bond. I would be possible to fix the issue in bond_enslave() or bond_change_active_slave() but the ARP monitor was fixed instead to keep most of the actions changing the current ARP slave in the ARP monitor code. The current ARP slave is set as inactive and backup during the commit phase. A new state, BOND_LINK_FAIL, has been introduced for slaves in the context of the ARP monitor. This allows administrators to see how slaves are rotated for sending ARP requests and attempts are made to find a new active slave. Fixes: b2220cad583c9 ("bonding: refactor ARP active-backup monitor") Signed-off-by: Jiri Wiesner Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/bonding/bond_main.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index a6d8d3b3c903..861d2c0a521a 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -2753,6 +2753,9 @@ static int bond_ab_arp_inspect(struct bonding *bond) if (bond_time_in_interval(bond, last_rx, 1)) { bond_propose_link_state(slave, BOND_LINK_UP); commit++; + } else if (slave->link == BOND_LINK_BACK) { + bond_propose_link_state(slave, BOND_LINK_FAIL); + commit++; } continue; } @@ -2863,6 +2866,19 @@ static void bond_ab_arp_commit(struct bonding *bond) continue; + case BOND_LINK_FAIL: + bond_set_slave_link_state(slave, BOND_LINK_FAIL, + BOND_SLAVE_NOTIFY_NOW); + bond_set_slave_inactive_flags(slave, + BOND_SLAVE_NOTIFY_NOW); + + /* A slave has just been enslaved and has become + * the current active slave. + */ + if (rtnl_dereference(bond->curr_active_slave)) + RCU_INIT_POINTER(bond->current_arp_slave, NULL); + continue; + default: netdev_err(bond->dev, "impossible: new_link %d on slave %s\n", slave->link_new_state, slave->dev->name); @@ -2912,8 +2928,6 @@ static bool bond_ab_arp_probe(struct bonding *bond) return should_notify_rtnl; } - bond_set_slave_inactive_flags(curr_arp_slave, BOND_SLAVE_NOTIFY_LATER); - bond_for_each_slave_rcu(bond, slave, iter) { if (!found && !before && bond_slave_is_up(slave)) before = slave; From 30cb922fdc59f81403a9ce9fdbc277be0d9da3ee Mon Sep 17 00:00:00 2001 From: Haiyang Zhang Date: Thu, 20 Aug 2020 14:53:15 -0700 Subject: [PATCH 071/127] hv_netvsc: Fix the queue_mapping in netvsc_vf_xmit() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit c3d897e01aef8ddc43149e4d661b86f823e3aae7 ] netvsc_vf_xmit() / dev_queue_xmit() will call VF NIC’s ndo_select_queue or netdev_pick_tx() again. They will use skb_get_rx_queue() to get the queue number, so the “skb->queue_mapping - 1†will be used. This may cause the last queue of VF not been used. Use skb_record_rx_queue() here, so that the skb_get_rx_queue() called later will get the correct queue number, and VF will be able to use all queues. Fixes: b3bf5666a510 ("hv_netvsc: defer queue selection to VF") Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/hyperv/netvsc_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 10c3480c2da8..dbc6c9ed1c8f 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -500,7 +500,7 @@ static int netvsc_vf_xmit(struct net_device *net, struct net_device *vf_netdev, int rc; skb->dev = vf_netdev; - skb->queue_mapping = qdisc_skb_cb(skb)->slave_dev_queue_mapping; + skb_record_rx_queue(skb, qdisc_skb_cb(skb)->slave_dev_queue_mapping); rc = dev_queue_xmit(skb); if (likely(rc == NET_XMIT_SUCCESS || rc == NET_XMIT_CN)) { From b5ce9e60c76f0be5d743605f68f9438c641d015e Mon Sep 17 00:00:00 2001 From: Tom Rix Date: Fri, 21 Aug 2020 06:56:00 -0700 Subject: [PATCH 072/127] net: dsa: b53: check for timeout [ Upstream commit 774d977abfd024e6f73484544b9abe5a5cd62de7 ] clang static analysis reports this problem b53_common.c:1583:13: warning: The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage ent.port &= ~BIT(port); ~~~~~~~~ ^ ent is set by a successful call to b53_arl_read(). Unsuccessful calls are caught by an switch statement handling specific returns. b32_arl_read() calls b53_arl_op_wait() which fails with the unhandled -ETIMEDOUT. So add -ETIMEDOUT to the switch statement. Because b53_arl_op_wait() already prints out a message, do not add another one. Fixes: 1da6df85c6fb ("net: dsa: b53: Implement ARL add/del/dump operations") Signed-off-by: Tom Rix Acked-by: Florian Fainelli Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/dsa/b53/b53_common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 274d36915110..5c3fa0be8844 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1160,6 +1160,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, return ret; switch (ret) { + case -ETIMEDOUT: + return ret; case -ENOSPC: dev_dbg(dev->dev, "{%pM,%.4d} no space left in ARL\n", addr, vid); From 7fc6f022dead815600f53fbe20ced862dba7a71b Mon Sep 17 00:00:00 2001 From: Vasant Hegde Date: Thu, 20 Aug 2020 11:48:44 +0530 Subject: [PATCH 073/127] powerpc/pseries: Do not initiate shutdown when system is running on UPS commit 90a9b102eddf6a3f987d15f4454e26a2532c1c98 upstream. As per PAPR we have to look for both EPOW sensor value and event modifier to identify the type of event and take appropriate action. In LoPAPR v1.1 section 10.2.2 includes table 136 "EPOW Action Codes": SYSTEM_SHUTDOWN 3 The system must be shut down. An EPOW-aware OS logs the EPOW error log information, then schedules the system to be shut down to begin after an OS defined delay internal (default is 10 minutes.) Then in section 10.3.2.2.8 there is table 146 "Platform Event Log Format, Version 6, EPOW Section", which includes the "EPOW Event Modifier": For EPOW sensor value = 3 0x01 = Normal system shutdown with no additional delay 0x02 = Loss of utility power, system is running on UPS/Battery 0x03 = Loss of system critical functions, system should be shutdown 0x04 = Ambient temperature too high All other values = reserved We have a user space tool (rtas_errd) on LPAR to monitor for EPOW_SHUTDOWN_ON_UPS. Once it gets an event it initiates shutdown after predefined time. It also starts monitoring for any new EPOW events. If it receives "Power restored" event before predefined time it will cancel the shutdown. Otherwise after predefined time it will shutdown the system. Commit 79872e35469b ("powerpc/pseries: All events of EPOW_SYSTEM_SHUTDOWN must initiate shutdown") changed our handling of the "on UPS/Battery" case, to immediately shutdown the system. This breaks existing setups that rely on the userspace tool to delay shutdown and let the system run on the UPS. Fixes: 79872e35469b ("powerpc/pseries: All events of EPOW_SYSTEM_SHUTDOWN must initiate shutdown") Cc: stable@vger.kernel.org # v4.0+ Signed-off-by: Vasant Hegde [mpe: Massage change log and add PAPR references] Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20200820061844.306460-1-hegdevasant@linux.vnet.ibm.com Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/platforms/pseries/ras.c | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c index 5ec935521204..8d20d49b252a 100644 --- a/arch/powerpc/platforms/pseries/ras.c +++ b/arch/powerpc/platforms/pseries/ras.c @@ -115,7 +115,6 @@ static void handle_system_shutdown(char event_modifier) case EPOW_SHUTDOWN_ON_UPS: pr_emerg("Loss of system power detected. System is running on" " UPS/battery. Check RTAS error log for details\n"); - orderly_poweroff(true); break; case EPOW_SHUTDOWN_LOSS_OF_CRITICAL_FUNCTIONS: From 7867516bcbc50a9c9951f5c3a28f2a53c32b89a4 Mon Sep 17 00:00:00 2001 From: Marc Zyngier Date: Wed, 19 Aug 2020 17:12:17 +0100 Subject: [PATCH 074/127] epoll: Keep a reference on files added to the check list commit a9ed4a6560b8562b7e2e2bed9527e88001f7b682 upstream. When adding a new fd to an epoll, and that this new fd is an epoll fd itself, we recursively scan the fds attached to it to detect cycles, and add non-epool files to a "check list" that gets subsequently parsed. However, this check list isn't completely safe when deletions can happen concurrently. To sidestep the issue, make sure that a struct file placed on the check list sees its f_count increased, ensuring that a concurrent deletion won't result in the file disapearing from under our feet. Cc: stable@vger.kernel.org Signed-off-by: Marc Zyngier Signed-off-by: Al Viro Signed-off-by: Marc Zyngier Signed-off-by: Greg Kroah-Hartman --- fs/eventpoll.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index c291bf61afb9..94f6c19dcf30 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -1900,9 +1900,11 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests) * not already there, and calling reverse_path_check() * during ep_insert(). */ - if (list_empty(&epi->ffd.file->f_tfile_llink)) + if (list_empty(&epi->ffd.file->f_tfile_llink)) { + get_file(epi->ffd.file); list_add(&epi->ffd.file->f_tfile_llink, &tfile_check_list); + } } } mutex_unlock(&ep->mtx); @@ -1946,6 +1948,7 @@ static void clear_tfile_check_list(void) file = list_first_entry(&tfile_check_list, struct file, f_tfile_llink); list_del_init(&file->f_tfile_llink); + fput(file); } INIT_LIST_HEAD(&tfile_check_list); } @@ -2100,9 +2103,11 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, clear_tfile_check_list(); goto error_tgt_fput; } - } else + } else { + get_file(tf.file); list_add(&tf.file->f_tfile_llink, &tfile_check_list); + } mutex_lock_nested(&ep->mtx, 0); if (is_file_epoll(tf.file)) { tep = tf.file->private_data; From 6875d79ba740f47a480908cf9fa791715ea0e4f1 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Sat, 22 Aug 2020 18:25:52 -0400 Subject: [PATCH 075/127] do_epoll_ctl(): clean the failure exits up a bit commit 52c479697c9b73f628140dcdfcd39ea302d05482 upstream. Signed-off-by: Al Viro Signed-off-by: Marc Zyngier Signed-off-by: Greg Kroah-Hartman --- fs/eventpoll.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 94f6c19dcf30..00f0902e27e8 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -2099,10 +2099,8 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, mutex_lock(&epmutex); if (is_file_epoll(tf.file)) { error = -ELOOP; - if (ep_loop_check(ep, tf.file) != 0) { - clear_tfile_check_list(); + if (ep_loop_check(ep, tf.file) != 0) goto error_tgt_fput; - } } else { get_file(tf.file); list_add(&tf.file->f_tfile_llink, @@ -2131,8 +2129,6 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, error = ep_insert(ep, &epds, tf.file, fd, full_check); } else error = -EEXIST; - if (full_check) - clear_tfile_check_list(); break; case EPOLL_CTL_DEL: if (epi) @@ -2155,8 +2151,10 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, mutex_unlock(&ep->mtx); error_tgt_fput: - if (full_check) + if (full_check) { + clear_tfile_check_list(); mutex_unlock(&epmutex); + } fdput(tf); error_fput: From 85ce79dd934362c5533c1e4897d5aed663600296 Mon Sep 17 00:00:00 2001 From: Peter Xu Date: Thu, 6 Aug 2020 23:26:11 -0700 Subject: [PATCH 076/127] mm/hugetlb: fix calculation of adjust_range_if_pmd_sharing_possible commit 75802ca66354a39ab8e35822747cd08b3384a99a upstream. This is found by code observation only. Firstly, the worst case scenario should assume the whole range was covered by pmd sharing. The old algorithm might not work as expected for ranges like (1g-2m, 1g+2m), where the adjusted range should be (0, 1g+2m) but the expected range should be (0, 2g). Since at it, remove the loop since it should not be required. With that, the new code should be faster too when the invalidating range is huge. Mike said: : With range (1g-2m, 1g+2m) within a vma (0, 2g) the existing code will only : adjust to (0, 1g+2m) which is incorrect. : : We should cc stable. The original reason for adjusting the range was to : prevent data corruption (getting wrong page). Since the range is not : always adjusted correctly, the potential for corruption still exists. : : However, I am fairly confident that adjust_range_if_pmd_sharing_possible : is only gong to be called in two cases: : : 1) for a single page : 2) for range == entire vma : : In those cases, the current code should produce the correct results. : : To be safe, let's just cc stable. Fixes: 017b1660df89 ("mm: migration: fix migration of huge PMD shared pages") Signed-off-by: Peter Xu Signed-off-by: Andrew Morton Reviewed-by: Mike Kravetz Cc: Andrea Arcangeli Cc: Matthew Wilcox Cc: Link: http://lkml.kernel.org/r/20200730201636.74778-1-peterx@redhat.com Signed-off-by: Linus Torvalds Signed-off-by: Mike Kravetz Signed-off-by: Greg Kroah-Hartman --- mm/hugetlb.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index d6464045d3b9..194125cf2d2b 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -4575,25 +4575,21 @@ static bool vma_shareable(struct vm_area_struct *vma, unsigned long addr) void adjust_range_if_pmd_sharing_possible(struct vm_area_struct *vma, unsigned long *start, unsigned long *end) { - unsigned long check_addr = *start; + unsigned long a_start, a_end; if (!(vma->vm_flags & VM_MAYSHARE)) return; - for (check_addr = *start; check_addr < *end; check_addr += PUD_SIZE) { - unsigned long a_start = check_addr & PUD_MASK; - unsigned long a_end = a_start + PUD_SIZE; + /* Extend the range to be PUD aligned for a worst case scenario */ + a_start = ALIGN_DOWN(*start, PUD_SIZE); + a_end = ALIGN(*end, PUD_SIZE); - /* - * If sharing is possible, adjust start/end if necessary. - */ - if (range_in_vma(vma, a_start, a_end)) { - if (a_start < *start) - *start = a_start; - if (a_end > *end) - *end = a_end; - } - } + /* + * Intersect the range with the vma range, since pmd sharing won't be + * across vma after all + */ + *start = max(vma->vm_start, a_start); + *end = min(vma->vm_end, a_end); } /* From 877ed468614c08e995c4c3ec5fad7806ce125268 Mon Sep 17 00:00:00 2001 From: Juergen Gross Date: Thu, 20 Aug 2020 08:59:08 +0200 Subject: [PATCH 077/127] xen: don't reschedule in preemption off sections For support of long running hypercalls xen_maybe_preempt_hcall() is calling cond_resched() in case a hypercall marked as preemptible has been interrupted. Normally this is no problem, as only hypercalls done via some ioctl()s are marked to be preemptible. In rare cases when during such a preemptible hypercall an interrupt occurs and any softirq action is started from irq_exit(), a further hypercall issued by the softirq handler will be regarded to be preemptible, too. This might lead to rescheduling in spite of the softirq handler potentially having set preempt_disable(), leading to splats like: BUG: sleeping function called from invalid context at drivers/xen/preempt.c:37 in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 20775, name: xl INFO: lockdep is turned off. CPU: 1 PID: 20775 Comm: xl Tainted: G D W 5.4.46-1_prgmr_debug.el7.x86_64 #1 Call Trace: dump_stack+0x8f/0xd0 ___might_sleep.cold.76+0xb2/0x103 xen_maybe_preempt_hcall+0x48/0x70 xen_do_hypervisor_callback+0x37/0x40 RIP: e030:xen_hypercall_xen_version+0xa/0x20 Code: ... RSP: e02b:ffffc900400dcc30 EFLAGS: 00000246 RAX: 000000000004000d RBX: 0000000000000200 RCX: ffffffff8100122a RDX: ffff88812e788000 RSI: 0000000000000000 RDI: 0000000000000000 RBP: ffffffff83ee3ad0 R08: 0000000000000001 R09: 0000000000000001 R10: 0000000000000000 R11: 0000000000000246 R12: ffff8881824aa0b0 R13: 0000000865496000 R14: 0000000865496000 R15: ffff88815d040000 ? xen_hypercall_xen_version+0xa/0x20 ? xen_force_evtchn_callback+0x9/0x10 ? check_events+0x12/0x20 ? xen_restore_fl_direct+0x1f/0x20 ? _raw_spin_unlock_irqrestore+0x53/0x60 ? debug_dma_sync_single_for_cpu+0x91/0xc0 ? _raw_spin_unlock_irqrestore+0x53/0x60 ? xen_swiotlb_sync_single_for_cpu+0x3d/0x140 ? mlx4_en_process_rx_cq+0x6b6/0x1110 [mlx4_en] ? mlx4_en_poll_rx_cq+0x64/0x100 [mlx4_en] ? net_rx_action+0x151/0x4a0 ? __do_softirq+0xed/0x55b ? irq_exit+0xea/0x100 ? xen_evtchn_do_upcall+0x2c/0x40 ? xen_do_hypervisor_callback+0x29/0x40 ? xen_hypercall_domctl+0xa/0x20 ? xen_hypercall_domctl+0x8/0x20 ? privcmd_ioctl+0x221/0x990 [xen_privcmd] ? do_vfs_ioctl+0xa5/0x6f0 ? ksys_ioctl+0x60/0x90 ? trace_hardirqs_off_thunk+0x1a/0x20 ? __x64_sys_ioctl+0x16/0x20 ? do_syscall_64+0x62/0x250 ? entry_SYSCALL_64_after_hwframe+0x49/0xbe Fix that by testing preempt_count() before calling cond_resched(). In kernel 5.8 this can't happen any more due to the entry code rework (more than 100 patches, so not a candidate for backporting). The issue was introduced in kernel 4.3, so this patch should go into all stable kernels in [4.3 ... 5.7]. Reported-by: Sarah Newman Fixes: 0fa2f5cb2b0ecd8 ("sched/preempt, xen: Use need_resched() instead of should_resched()") Cc: Sarah Newman Cc: stable@vger.kernel.org Signed-off-by: Juergen Gross Tested-by: Chris Brannon Signed-off-by: Greg Kroah-Hartman --- drivers/xen/preempt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/xen/preempt.c b/drivers/xen/preempt.c index 5f6b77ea34fb..128375ff80b8 100644 --- a/drivers/xen/preempt.c +++ b/drivers/xen/preempt.c @@ -31,7 +31,7 @@ EXPORT_SYMBOL_GPL(xen_in_preemptible_hcall); asmlinkage __visible void xen_maybe_preempt_hcall(void) { if (unlikely(__this_cpu_read(xen_in_preemptible_hcall) - && need_resched())) { + && need_resched() && !preempt_count())) { /* * Clear flag as we may be rescheduled on a different * cpu. From f114a36246812b5c06b0a6066412215e45b3ac8c Mon Sep 17 00:00:00 2001 From: Stephen Boyd Date: Wed, 28 Aug 2019 11:19:59 -0700 Subject: [PATCH 078/127] clk: Evict unregistered clks from parent caches commit bdcf1dc253248542537a742ae1e7ccafdd03f2d3 upstream. We leave a dangling pointer in each clk_core::parents array that has an unregistered clk as a potential parent when that clk_core pointer is freed by clk{_hw}_unregister(). It is impossible for the true parent of a clk to be set with clk_set_parent() once the dangling pointer is left in the cache because we compare parent pointers in clk_fetch_parent_index() instead of checking for a matching clk name or clk_hw pointer. Before commit ede77858473a ("clk: Remove global clk traversal on fetch parent index"), we would check clk_hw pointers, which has a higher chance of being the same between registration and unregistration, but it can still be allocated and freed by the clk provider. In fact, this has been a long standing problem since commit da0f0b2c3ad2 ("clk: Correct lookup logic in clk_fetch_parent_index()") where we stopped trying to compare clk names and skipped over entries in the cache that weren't NULL. There are good (performance) reasons to not do the global tree lookup in cases where the cache holds dangling pointers to parents that have been unregistered. Let's take the performance hit on the uncommon registration path instead. Loop through all the clk_core::parents arrays when a clk is unregistered and set the entry to NULL when the parent cache entry and clk being unregistered are the same pointer. This will fix this problem and avoid the overhead for the "normal" case. Based on a patch by Bjorn Andersson. Fixes: da0f0b2c3ad2 ("clk: Correct lookup logic in clk_fetch_parent_index()") Reviewed-by: Bjorn Andersson Tested-by: Sai Prakash Ranjan Signed-off-by: Stephen Boyd Link: https://lkml.kernel.org/r/20190828181959.204401-1-sboyd@kernel.org Tested-by: Naresh Kamboju Signed-off-by: Greg Kroah-Hartman --- drivers/clk/clk.c | 52 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 44b6f23cc851..4289c519af1b 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -39,6 +39,17 @@ static HLIST_HEAD(clk_root_list); static HLIST_HEAD(clk_orphan_list); static LIST_HEAD(clk_notifier_list); +static struct hlist_head *all_lists[] = { + &clk_root_list, + &clk_orphan_list, + NULL, +}; + +static struct hlist_head *orphan_list[] = { + &clk_orphan_list, + NULL, +}; + /*** private data structures ***/ struct clk_core { @@ -1993,17 +2004,6 @@ static int inited = 0; static DEFINE_MUTEX(clk_debug_lock); static HLIST_HEAD(clk_debug_list); -static struct hlist_head *all_lists[] = { - &clk_root_list, - &clk_orphan_list, - NULL, -}; - -static struct hlist_head *orphan_list[] = { - &clk_orphan_list, - NULL, -}; - static void clk_summary_show_one(struct seq_file *s, struct clk_core *c, int level) { @@ -2735,6 +2735,34 @@ static const struct clk_ops clk_nodrv_ops = { .set_parent = clk_nodrv_set_parent, }; +static void clk_core_evict_parent_cache_subtree(struct clk_core *root, + struct clk_core *target) +{ + int i; + struct clk_core *child; + + for (i = 0; i < root->num_parents; i++) + if (root->parents[i] == target) + root->parents[i] = NULL; + + hlist_for_each_entry(child, &root->children, child_node) + clk_core_evict_parent_cache_subtree(child, target); +} + +/* Remove this clk from all parent caches */ +static void clk_core_evict_parent_cache(struct clk_core *core) +{ + struct hlist_head **lists; + struct clk_core *root; + + lockdep_assert_held(&prepare_lock); + + for (lists = all_lists; *lists; lists++) + hlist_for_each_entry(root, *lists, child_node) + clk_core_evict_parent_cache_subtree(root, core); + +} + /** * clk_unregister - unregister a currently registered clock * @clk: clock to unregister @@ -2773,6 +2801,8 @@ void clk_unregister(struct clk *clk) clk_core_set_parent(child, NULL); } + clk_core_evict_parent_cache(clk->core); + hlist_del_init(&clk->core->child_node); if (clk->core->prepare_count) From d4768573159b599a6d161a4aba8c8b32bfd33b82 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Mon, 24 Aug 2020 12:29:54 +0100 Subject: [PATCH 079/127] KVM: arm/arm64: Don't reschedule in unmap_stage2_range() Upstream commits fdfe7cbd5880 ("KVM: Pass MMU notifier range flags to kvm_unmap_hva_range()") and b5331379bc62 ("KVM: arm64: Only reschedule if MMU_NOTIFIER_RANGE_BLOCKABLE is not set") fix a "sleeping from invalid context" BUG caused by unmap_stage2_range() attempting to reschedule when called on the OOM path. Unfortunately, these patches rely on the MMU notifier callback being passed knowledge about whether or not blocking is permitted, which was introduced in 4.19. Rather than backport this considerable amount of infrastructure just for KVM on arm, instead just remove the conditional reschedule. Cc: # v4.14 only Cc: Marc Zyngier Cc: Suzuki K Poulose Cc: James Morse Signed-off-by: Will Deacon Acked-by: Marc Zyngier Signed-off-by: Greg Kroah-Hartman --- virt/kvm/arm/mmu.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 3814cdad643a..7fe673248e98 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -307,12 +307,6 @@ static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) next = stage2_pgd_addr_end(addr, end); if (!stage2_pgd_none(*pgd)) unmap_stage2_puds(kvm, pgd, addr, next); - /* - * If the range is too large, release the kvm->mmu_lock - * to prevent starvation and lockup detector warnings. - */ - if (next != end) - cond_resched_lock(&kvm->mmu_lock); } while (pgd++, addr = next, addr != end); } From d7e78d08fa77acdea351c8f628f49ca9a0e1029a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 26 Aug 2020 10:30:00 +0200 Subject: [PATCH 080/127] Linux 4.14.195 Tested-by: Jon Hunter Tested-by: Guenter Roeck Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8e2a1418c5ae..a5946969f4fc 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 14 -SUBLEVEL = 194 +SUBLEVEL = 195 EXTRAVERSION = NAME = Petit Gorille From 8d45aa9786a876b3cc5189e5a36054e87ddf49da Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 13:45:36 +0530 Subject: [PATCH 081/127] qcacld-3.0: disable debug configs added in LA.UM.8.1.r1-15800-sm8150.0 Signed-off-by: UtsavBalar1231 --- drivers/staging/qcacld-3.0/configs/default_defconfig | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/staging/qcacld-3.0/configs/default_defconfig b/drivers/staging/qcacld-3.0/configs/default_defconfig index e702b8d6e63b..ef47513f597b 100644 --- a/drivers/staging/qcacld-3.0/configs/default_defconfig +++ b/drivers/staging/qcacld-3.0/configs/default_defconfig @@ -614,16 +614,16 @@ CONFIG_CHANNEL_HOPPING_ALL_BANDS := y endif ifneq ($(CONFIG_HIF_USB), y) -CONFIG_WLAN_LOGGING_SOCK_SVC := y +CONFIG_WLAN_LOGGING_SOCK_SVC := n endif ifneq ($(TARGET_BUILD_VARIANT),user) -CONFIG_DESC_DUP_DETECT_DEBUG := y +CONFIG_DESC_DUP_DETECT_DEBUG := n endif -CONFIG_DP_TRACE := y +CONFIG_DP_TRACE := n #Enable Beacon Reception Stats -CONFIG_FEATURE_BECN_STATS := y +CONFIG_FEATURE_BECN_STATS := n #enable MPTA helper for QCS405 ifeq ($(CONFIG_ARCH_QCS405), y) @@ -657,9 +657,9 @@ ifeq ($(CONFIG_SLUB_DEBUG), y) endif #Enable RX RING buffers debug -CONFIG_DEBUG_RX_RING_BUFFER := y +CONFIG_DEBUG_RX_RING_BUFFER := n #Enable Hash debug -CONFIG_RX_HASH_DEBUG := y +CONFIG_RX_HASH_DEBUG := n CONFIG_WLAN_HANG_EVENT := n From ecbcd0b324670c4dfb740bb9b4a4c2200c470ee5 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 17:05:22 +0530 Subject: [PATCH 082/127] ASoC: codec: Remove qcom USB analog headset support Xiaomi has its own custom usb analog headset support which is pretty similar to qcom so revert qcom change to avoid further conflicts This reverts commit 3869ccc6bc6f676eb3bc2f475fd6f6cd1a8ff9ec. Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd-mbhc-v2.c | 283 ++------------------------------------ asoc/codecs/wcd-mbhc-v2.h | 18 +-- 2 files changed, 12 insertions(+), 289 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index d6e336974e8c..ffe573e33adb 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2018, 2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2018, 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 @@ -1021,8 +1021,7 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) mbhc->extn_cable_hph_rem = false; wcd_mbhc_report_plug(mbhc, 0, jack_type); - if (mbhc->mbhc_cfg->enable_usbc_analog && - mbhc->mbhc_cfg->fsa_enable) { + if (mbhc->mbhc_cfg->enable_usbc_analog) { WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); if (mbhc->mbhc_cb->clk_setup) mbhc->mbhc_cb->clk_setup(mbhc->codec, false); @@ -1399,7 +1398,7 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) * when a non-audio accessory is inserted. L_DET_EN sets to 1 when FSA * I2C driver notifies that ANALOG_AUDIO_ADAPTER is inserted */ - if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->mbhc_cfg->fsa_enable) + if (mbhc->mbhc_cfg->enable_usbc_analog) WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); else WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); @@ -1422,8 +1421,7 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) mbhc->mbhc_cb->mbhc_bias(codec, true); /* enable MBHC clock */ if (mbhc->mbhc_cb->clk_setup) { - if (mbhc->mbhc_cfg->enable_usbc_analog && - mbhc->mbhc_cfg->fsa_enable) + if (mbhc->mbhc_cfg->enable_usbc_analog) mbhc->mbhc_cb->clk_setup(codec, false); else mbhc->mbhc_cb->clk_setup(codec, true); @@ -1597,209 +1595,9 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, return 0; } -static int wcd_mbhc_init_gpio(struct wcd_mbhc *mbhc, - struct wcd_mbhc_config *mbhc_cfg, - const char *gpio_dt_str, - int *gpio, - struct device_node **gpio_dn) -{ - int rc = 0; - struct snd_soc_codec *codec = mbhc->codec; - struct snd_soc_card *card = codec->component.card; - - dev_dbg(mbhc->codec->dev, "%s: gpio %s\n", __func__, gpio_dt_str); - - *gpio_dn = of_parse_phandle(card->dev->of_node, gpio_dt_str, 0); - - if (!(*gpio_dn)) { - *gpio = of_get_named_gpio(card->dev->of_node, gpio_dt_str, 0); - if (!gpio_is_valid(*gpio)) { - dev_err(card->dev, "%s, property %s not in node %s", - __func__, gpio_dt_str, - card->dev->of_node->full_name); - rc = -EINVAL; - } - } - - return rc; -} - -static int wcd_mbhc_usb_c_analog_setup_gpios(struct wcd_mbhc *mbhc, bool active) -{ - int rc = 0; - struct usbc_ana_audio_config *config = - &mbhc->mbhc_cfg->usbc_analog_cfg; - union power_supply_propval pval; - - dev_dbg(mbhc->codec->dev, "%s: setting GPIOs active = %d\n", - __func__, active); - - memset(&pval, 0, sizeof(pval)); - - if (active) { - pval.intval = POWER_SUPPLY_TYPEC_PR_SOURCE; - if (power_supply_set_property(mbhc->usb_psy, - POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &pval)) - dev_info(mbhc->codec->dev, "%s: force PR_SOURCE mode unsuccessful\n", - __func__); - else - mbhc->usbc_force_pr_mode = true; - - if (config->usbc_en1_gpio_p) - rc = msm_cdc_pinctrl_select_active_state( - config->usbc_en1_gpio_p); - if (rc == 0 && config->usbc_en2n_gpio_p) - rc = msm_cdc_pinctrl_select_active_state( - config->usbc_en2n_gpio_p); - if (rc == 0 && config->usbc_force_gpio_p) - rc = msm_cdc_pinctrl_select_active_state( - config->usbc_force_gpio_p); - mbhc->usbc_mode = POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER; - } else { - /* no delay is required when disabling GPIOs */ - if (config->usbc_en2n_gpio_p) - msm_cdc_pinctrl_select_sleep_state( - config->usbc_en2n_gpio_p); - if (config->usbc_en1_gpio_p) - msm_cdc_pinctrl_select_sleep_state( - config->usbc_en1_gpio_p); - if (config->usbc_force_gpio_p) - msm_cdc_pinctrl_select_sleep_state( - config->usbc_force_gpio_p); - - if (mbhc->usbc_force_pr_mode) { - pval.intval = POWER_SUPPLY_TYPEC_PR_DUAL; - if (power_supply_set_property(mbhc->usb_psy, - POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &pval)) - dev_info(mbhc->codec->dev, "%s: force PR_DUAL mode unsuccessful\n", - __func__); - mbhc->usbc_force_pr_mode = false; - } - mbhc->usbc_mode = POWER_SUPPLY_TYPEC_NONE; - } - - return rc; -} - - -/* workqueue */ -static void wcd_mbhc_usbc_analog_work_fn(struct work_struct *work) -{ - struct wcd_mbhc *mbhc = - container_of(work, struct wcd_mbhc, usbc_analog_work); - - wcd_mbhc_usb_c_analog_setup_gpios(mbhc, - mbhc->usbc_mode != POWER_SUPPLY_TYPEC_NONE); -} - -/* this callback function is used to process PMI notification */ -static int wcd_mbhc_usb_c_event_changed(struct notifier_block *nb, - unsigned long evt, void *ptr) -{ - int ret; - union power_supply_propval mode; - struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, psy_nb); - struct snd_soc_codec *codec = mbhc->codec; - - if (ptr != mbhc->usb_psy || evt != PSY_EVENT_PROP_CHANGED) - return 0; - - ret = power_supply_get_property(mbhc->usb_psy, - POWER_SUPPLY_PROP_TYPEC_MODE, &mode); - if (ret) { - dev_err(codec->dev, "%s: Unable to read USB TYPEC_MODE: %d\n", - __func__, ret); - return ret; - } - - dev_dbg(codec->dev, "%s: USB change event received\n", - __func__); - dev_dbg(codec->dev, "%s: supply mode %d, expected %d\n", __func__, - mode.intval, POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER); - - switch (mode.intval) { - case POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER: - case POWER_SUPPLY_TYPEC_NONE: - dev_dbg(codec->dev, "%s: usbc_mode: %d; mode.intval: %d\n", - __func__, mbhc->usbc_mode, mode.intval); - - /* filter notifications received before */ - if (mbhc->usbc_mode == mode.intval) - break; - mbhc->usbc_mode = mode.intval; - - dev_dbg(codec->dev, "%s: queueing usbc_analog_work\n", - __func__); - schedule_work(&mbhc->usbc_analog_work); - break; - default: - break; - } - return ret; -} - -/* PMI registration code */ -static int wcd_mbhc_usb_c_analog_init(struct wcd_mbhc *mbhc) -{ - int ret = 0; - struct snd_soc_codec *codec = mbhc->codec; - - dev_dbg(mbhc->codec->dev, "%s: usb-c analog setup start\n", __func__); - INIT_WORK(&mbhc->usbc_analog_work, wcd_mbhc_usbc_analog_work_fn); - - mbhc->usb_psy = power_supply_get_by_name("usb"); - if (IS_ERR_OR_NULL(mbhc->usb_psy)) { - dev_err(codec->dev, "%s: could not get USB psy info\n", - __func__); - ret = -EPROBE_DEFER; - if (IS_ERR(mbhc->usb_psy)) - ret = PTR_ERR(mbhc->usb_psy); - mbhc->usb_psy = NULL; - goto err; - } - ret = wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); - if (ret) { - dev_err(codec->dev, "%s: error while setting USBC ana gpios\n", - __func__); - goto err; - } - - mbhc->psy_nb.notifier_call = wcd_mbhc_usb_c_event_changed; - mbhc->psy_nb.priority = 0; - ret = power_supply_reg_notifier(&mbhc->psy_nb); - if (ret) { - dev_err(codec->dev, "%s: power supply registration failed\n", - __func__); - goto err; - } - - /* - * as part of the init sequence check if there is a connected - * USB C analog adapter - */ - dev_dbg(mbhc->codec->dev, "%s: verify if USB adapter is already inserted\n", - __func__); - ret = wcd_mbhc_usb_c_event_changed(&mbhc->psy_nb, - PSY_EVENT_PROP_CHANGED, - mbhc->usb_psy); - -err: - return ret; -} - -static int wcd_mbhc_usb_c_analog_deinit(struct wcd_mbhc *mbhc) -{ - wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); - - /* deregister from PMI */ - power_supply_unreg_notifier(&mbhc->psy_nb); - return 0; -} - int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) { int rc = 0; - struct usbc_ana_audio_config *config; struct snd_soc_codec *codec; struct snd_soc_card *card; const char *usb_c_dt = "qcom,msm-mbhc-usbc-audio-supported"; @@ -1807,7 +1605,6 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) if (!mbhc || !mbhc_cfg) return -EINVAL; - config = &mbhc_cfg->usbc_analog_cfg; codec = mbhc->codec; card = codec->component.card; @@ -1837,48 +1634,14 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD; mbhc->fsa_np = of_parse_phandle(card->dev->of_node, "fsa4480-i2c-handle", 0); - if (mbhc->fsa_np) { - mbhc_cfg->fsa_enable = true; - } else { + if (!mbhc->fsa_np) { dev_err(card->dev, "%s: fsa4480 i2c node not found\n", - __func__); - - mbhc_cfg->fsa_enable = false; - rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, - "qcom,usbc-analog-en1_gpio", - &config->usbc_en1_gpio, - &config->usbc_en1_gpio_p); - if (rc) - goto err; - - rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, - "qcom,usbc-analog-en2_n_gpio", - &config->usbc_en2n_gpio, - &config->usbc_en2n_gpio_p); - if (rc) - goto err; - - if (of_find_property(card->dev->of_node, - "qcom,usbc-analog-force_detect_gpio", - NULL)) { - rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, - "qcom,usbc-analog-force_detect_gpio", - &config->usbc_force_gpio, - &config->usbc_force_gpio_p); - if (rc) - goto err; - } - - dev_dbg(mbhc->codec->dev, "%s: calling usb_c_analog_init\n", __func__); - /* init PMI notifier */ - rc = wcd_mbhc_usb_c_analog_init(mbhc); - if (rc) { - rc = EPROBE_DEFER; - goto err; - } + rc = -EINVAL; + goto err; } } + /* Set btn key code */ if ((!mbhc->is_btn_already_regd) && wcd_mbhc_set_keycode(mbhc)) pr_err("Set btn key code error!!!\n"); @@ -1890,7 +1653,6 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) if (rc) { dev_err(card->dev, "%s: wcd mbhc initialize failed\n", __func__); - wcd_mbhc_usb_c_analog_deinit(mbhc); goto err; } } else { @@ -1902,7 +1664,7 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); } - if (mbhc_cfg->enable_usbc_analog && mbhc_cfg->fsa_enable) { + if (mbhc_cfg->enable_usbc_analog) { mbhc->fsa_nb.notifier_call = wcd_mbhc_usbc_ana_event_handler; mbhc->fsa_nb.priority = 0; rc = fsa4480_reg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); @@ -1917,10 +1679,6 @@ EXPORT_SYMBOL(wcd_mbhc_start); void wcd_mbhc_stop(struct wcd_mbhc *mbhc) { - struct usbc_ana_audio_config *config; - - config = &mbhc->mbhc_cfg->usbc_analog_cfg; - pr_debug("%s: enter\n", __func__); if (mbhc->current_plug != MBHC_PLUG_TYPE_NONE) { @@ -1945,27 +1703,8 @@ void wcd_mbhc_stop(struct wcd_mbhc *mbhc) mbhc->mbhc_cal = NULL; } - if (mbhc->mbhc_cfg->enable_usbc_analog) { - if (mbhc->mbhc_cfg->fsa_enable) { - fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); - } else { - wcd_mbhc_usb_c_analog_deinit(mbhc); - /* free GPIOs */ - if (config->usbc_en1_gpio > 0) - gpio_free(config->usbc_en1_gpio); - if (config->usbc_en2n_gpio > 0) - gpio_free(config->usbc_en2n_gpio); - if (config->usbc_force_gpio) - gpio_free(config->usbc_force_gpio); - if (config->usbc_en1_gpio_p) - of_node_put(config->usbc_en1_gpio_p); - if (config->usbc_en2n_gpio_p) - of_node_put(config->usbc_en2n_gpio_p); - if (config->usbc_force_gpio_p) - of_node_put(config->usbc_force_gpio_p); - } - } - + if (mbhc->mbhc_cfg->enable_usbc_analog) + fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); pr_debug("%s: leave\n", __func__); } diff --git a/asoc/codecs/wcd-mbhc-v2.h b/asoc/codecs/wcd-mbhc-v2.h index 7457c81716a0..a20765f56691 100644 --- a/asoc/codecs/wcd-mbhc-v2.h +++ b/asoc/codecs/wcd-mbhc-v2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2019, 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 @@ -416,15 +416,6 @@ enum mbhc_hs_pullup_iref_v2 { HS_PULLUP_I_OFF, }; -struct usbc_ana_audio_config { - int usbc_en1_gpio; - int usbc_en2n_gpio; - int usbc_force_gpio; - struct device_node *usbc_en1_gpio_p; /* used by pinctrl API */ - struct device_node *usbc_en2n_gpio_p; /* used by pinctrl API */ - struct device_node *usbc_force_gpio_p; /* used by pinctrl API */ -}; - enum mbhc_moisture_rref { R_OFF, R_24_KOHM, @@ -448,8 +439,6 @@ struct wcd_mbhc_config { bool enable_anc_mic_detect; u32 enable_usbc_analog; bool moisture_duty_cycle_en; - struct usbc_ana_audio_config usbc_analog_cfg; - bool fsa_enable; }; struct wcd_mbhc_intr { @@ -608,16 +597,11 @@ struct wcd_mbhc { unsigned long intr_status; bool is_hph_ocp_pending; - bool usbc_force_pr_mode; struct wcd_mbhc_fn *mbhc_fn; bool force_linein; - int usbc_mode; struct device_node *fsa_np; struct notifier_block fsa_nb; - struct notifier_block psy_nb; - struct power_supply *usb_psy; - struct work_struct usbc_analog_work; }; void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, From e180bf064308ed4a7f4047bbe4ca17f3f36aa2b3 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Sat, 9 May 2020 21:59:47 +0530 Subject: [PATCH 083/127] ASoC: Revert sm8150 fix for i2s * Results in Kernel Panic and breaks the device from booting This reverts commit 9fb14b346750d1a1912111c99483e4939b7b9c30. Signed-off-by: UtsavBalar1231 --- asoc/msm-pcm-routing-v2.c | 28 +---------- asoc/msm-pcm-routing-v2.h | 4 +- asoc/sm8150.c | 98 ++++++--------------------------------- 3 files changed, 16 insertions(+), 114 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index d7f87171069b..e5ebeb4f89e2 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2019, 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 @@ -730,12 +730,6 @@ static struct msm_pcm_routing_fdai_data {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, /* MULTIMEDIA29 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA30 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA31 */ {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, /* VOIP */ @@ -12332,10 +12326,6 @@ static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = { MSM_BACKEND_DAI_SLIMBUS_0_RX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), }; static const struct snd_kcontrol_new slimbus_6_rx_voice_mixer_controls[] = { @@ -12359,10 +12349,6 @@ MSM_BACKEND_DAI_SLIMBUS_6_RX, MSM_BACKEND_DAI_SLIMBUS_6_RX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), }; static const struct snd_kcontrol_new usb_audio_rx_voice_mixer_controls[] = { @@ -12593,10 +12579,6 @@ static const struct snd_kcontrol_new quat_mi2s_rx_voice_mixer_controls[] = { MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), }; static const struct snd_kcontrol_new quin_mi2s_rx_voice_mixer_controls[] = { @@ -14315,10 +14297,6 @@ static const struct snd_kcontrol_new quat_mi2s_rx_port_mixer_controls[] = { MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, @@ -21644,7 +21622,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"SLIM_0_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, {"SLIM_0_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, {"SLIM_0_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIM_0_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"}, {"SLIM_6_RX_Voice Mixer", "Voip", "VOIP_DL"}, @@ -21652,7 +21629,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"SLIM_6_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, {"SLIM_6_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, {"SLIM_6_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIM_6_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, {"SLIMBUS_6_RX", NULL, "SLIM_6_RX_Voice Mixer"}, {"USB_AUDIO_RX_Voice Mixer", "Voip", "VOIP_DL"}, @@ -21772,7 +21748,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"QUAT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_Voice Mixer"}, {"QUIN_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, @@ -22928,7 +22903,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"QUAT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, {"QUAT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, {"QUAT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUAT_MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, {"QUAT_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, {"QUAT_MI2S_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, {"QUAT_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h index 8f56c1f947d9..7807647e196e 100644 --- a/asoc/msm-pcm-routing-v2.h +++ b/asoc/msm-pcm-routing-v2.h @@ -274,8 +274,8 @@ enum { MSM_FRONTEND_DAI_MAX, }; -#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_VOLTE_STUB + 1) -#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_VOLTE_STUB +#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_MULTIMEDIA31 + 1) +#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_MULTIMEDIA31 enum { MSM_BACKEND_DAI_PRI_I2S_RX = 0, diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 14d65162c5a5..394c4faac958 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2019, 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 @@ -174,7 +174,6 @@ struct msm_asoc_mach_data { struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ struct device_node *fsa_handle; - struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */ struct snd_soc_codec *codec; struct work_struct adsp_power_up_work; }; @@ -5038,29 +5037,23 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) ret = msm_mi2s_set_sclk(substream, true); if (ret < 0) { dev_err(rtd->card->dev, - "%s: afe lpass clock failed ", - "to enable MI2S clock, err:%d\n", + "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", __func__, ret); goto clean_up; } ret = snd_soc_dai_set_fmt(cpu_dai, fmt); if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S(%d) err:%d\n", + pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", __func__, index, ret); goto clk_off; } if (index == QUAT_MI2S) { ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_MI2S_ACTIVE); - if (ret_pinctrl) { - pr_err("%s: MI2S TLMM pinctrl set failed %d", - "switching to gpio\n", + STATE_MI2S_ACTIVE); + if (ret_pinctrl) + pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", __func__, ret_pinctrl); - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[index]); - } } } clk_off: @@ -5095,19 +5088,14 @@ static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) if (--mi2s_intf_conf[index].ref_cnt == 0) { ret = msm_mi2s_set_sclk(substream, false); if (ret < 0) - pr_err("%s:clock disable failed for MI2S(%d) ret=%d\n", + pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", __func__, index, ret); if (index == QUAT_MI2S) { ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_DISABLE); - if (ret_pinctrl) { - pr_err("%s: MI2S TLMM pinctrl set failed %d", - "switching to gpio\n", + STATE_DISABLE); + if (ret_pinctrl) + pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", __func__, ret_pinctrl); - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[index]); - } } } mutex_unlock(&mi2s_intf_conf[index].lock); @@ -5879,54 +5867,6 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA31, }, - { - .name = "Quaternary MI2S_RX Hostless Playback", - .stream_name = "Quaternary MI2S_RX Hostless Playback", - .cpu_dai_name = "QUAT_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Quaternary MI2S_TX Hostless Capture", - .stream_name = "Quaternary MI2S_TX Hostless Capture", - .cpu_dai_name = "QUAT_MI2S_TX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -/* Voice Stub */ - { - .name = "Voice Stub", - .stream_name = "Voice Stub", - .cpu_dai_name = "VOICE_STUB", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, }; static struct snd_soc_dai_link msm_common_be_dai_links[] = { @@ -7022,11 +6962,6 @@ struct snd_soc_card snd_soc_card_tavil_msm = { .late_probe = msm_snd_card_tavil_late_probe, }; -struct snd_soc_card snd_soc_card_hanasdx_msm = { - .name = "sm8150-hana55-snd-card", - .late_probe = msm_snd_card_tavil_late_probe, -}; - static int msm_populate_dai_link_component_of_node( struct snd_soc_card *card) { @@ -7239,8 +7174,6 @@ static const struct of_device_id sm8150_asoc_machine_of_match[] = { .data = "tavil_codec"}, { .compatible = "qcom,sm8150-asoc-snd-stub", .data = "stub_codec"}, - { .compatible = "qcom,sm8150-asoc-snd-hana55", - .data = "tavil_codec"}, {}, }; @@ -7325,10 +7258,7 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) dailink = msm_pahu_snd_card_dai_links; } else if (!strcmp(match->data, "tavil_codec")) { - if (!strcmp(match->compatible, "qcom,sm8150-asoc-snd-hana55")) - card = &snd_soc_card_hanasdx_msm; - else - card = &snd_soc_card_tavil_msm; + card = &snd_soc_card_tavil_msm; len_1 = ARRAY_SIZE(msm_common_dai_links); len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links); len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links); @@ -7827,12 +7757,10 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) if (!ret) { pr_debug("%s: pinctrl parsing successful\n", __func__); } else { - pr_err("%s: Parsing pinctrl failed %d. switching to gpio\n", + dev_dbg(&pdev->dev, + "%s: Parsing pinctrl failed with %d. Cannot use Ports\n", __func__, ret); ret = 0; - pdata->mi2s_gpio_p[QUAT_MI2S] = - of_parse_phandle(pdev->dev.of_node, - "qcom,quat-mi2s-gpios", 0); } msm_i2s_auxpcm_init(pdev); From 123f260a9315600c30d3a9743c4df6851ed1fef3 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 17:23:32 +0530 Subject: [PATCH 084/127] ASoC: Add Support for cs35l41 driver - Extracted from MiCode/vendor_qcom_opensource_audio-kernel at branch 'cepheus-q-oss' Signed-off-by: UtsavBalar1231 --- Android.mk | 1 + asoc/Kbuild | 4 + asoc/codecs/Kbuild | 1 + asoc/codecs/cs35l41/Android.mk | 55 + asoc/codecs/cs35l41/Kbuild | 117 + asoc/codecs/cs35l41/Kconfig | 1066 ++++++ asoc/codecs/cs35l41/Makefile | 433 +++ asoc/codecs/cs35l41/cs35l41-i2c.c | 123 + asoc/codecs/cs35l41/cs35l41-spi.c | 114 + asoc/codecs/cs35l41/cs35l41-tables.c | 945 +++++ asoc/codecs/cs35l41/cs35l41.c | 2081 +++++++++++ asoc/codecs/cs35l41/cs35l41.h | 764 ++++ asoc/codecs/cs35l41/cs35l41.txt | 184 + asoc/codecs/cs35l41/wm_adsp.c | 5113 ++++++++++++++++++++++++++ asoc/codecs/cs35l41/wm_adsp.h | 195 + asoc/codecs/cs35l41/wmfw.h | 201 + asoc/sm8150.c | 122 + config/sm8150auto.conf | 2 + config/sm8150autoconf.h | 1 + include/uapi/sound/cs35l41.h | 83 + 20 files changed, 11605 insertions(+) create mode 100755 asoc/codecs/cs35l41/Android.mk create mode 100755 asoc/codecs/cs35l41/Kbuild create mode 100755 asoc/codecs/cs35l41/Kconfig create mode 100755 asoc/codecs/cs35l41/Makefile create mode 100755 asoc/codecs/cs35l41/cs35l41-i2c.c create mode 100755 asoc/codecs/cs35l41/cs35l41-spi.c create mode 100755 asoc/codecs/cs35l41/cs35l41-tables.c create mode 100755 asoc/codecs/cs35l41/cs35l41.c create mode 100755 asoc/codecs/cs35l41/cs35l41.h create mode 100755 asoc/codecs/cs35l41/cs35l41.txt create mode 100755 asoc/codecs/cs35l41/wm_adsp.c create mode 100755 asoc/codecs/cs35l41/wm_adsp.h create mode 100755 asoc/codecs/cs35l41/wmfw.h create mode 100755 include/uapi/sound/cs35l41.h diff --git a/Android.mk b/Android.mk index 0afb5c6b7c18..9a79412df70b 100644 --- a/Android.mk +++ b/Android.mk @@ -22,6 +22,7 @@ include $(MY_LOCAL_PATH)/soc/Android.mk include $(MY_LOCAL_PATH)/asoc/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/wcd934x/Android.mk +include $(MY_LOCAL_PATH)/asoc/codecs/cs35l41/Android.mk endif ifeq ($(call is-board-platform-in-list, atoll),true) diff --git a/asoc/Kbuild b/asoc/Kbuild index 951e123db8f1..2ee3a7bb2e35 100644 --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -186,6 +186,10 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ -Werror\ -D__linux__ +ifdef CONFIG_SND_SOC_CS35L41_FOR_CEPH + CDEFINES += -DCONFIG_SND_SOC_CS35L41_FOR_CEPH +endif + KBUILD_CPPFLAGS += $(CDEFINES) # Currently, for versions of gcc which support it, the kernel Makefile diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild index 2f0add181dda..eede1524b127 100644 --- a/asoc/codecs/Kbuild +++ b/asoc/codecs/Kbuild @@ -209,6 +209,7 @@ ifeq ($(KERNEL_BUILD), 1) obj-y += msm_sdw/ obj-y += wcd9360/ obj-y += wcd937x/ + obj-y += cs35l41/ endif ifeq ($(CONFIG_SND_SOC_GCOV), y) diff --git a/asoc/codecs/cs35l41/Android.mk b/asoc/codecs/cs35l41/Android.mk new file mode 100755 index 000000000000..9b2b116f0487 --- /dev/null +++ b/asoc/codecs/cs35l41/Android.mk @@ -0,0 +1,55 @@ +# Android makefile for audio kernel modules + +# Assume no targets will be supported + +# Check if this driver needs be built for current target +ifeq ($(call is-board-platform,msmnile),true) +AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m +endif + +ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) +AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m +endif + +AUDIO_CHIPSET := audio +# Build/Package only in case of supported target +ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE)),true) + +LOCAL_PATH := $(call my-dir) + +# This makefile is only for DLKM +ifneq ($(findstring vendor,$(LOCAL_PATH)),) + +ifneq ($(findstring opensource,$(LOCAL_PATH)),) + #AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel + AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel +endif # opensource + +DLKM_DIR := $(TOP)/device/qcom/common/dlkm + +# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko +########################################################### +# This is set once per LOCAL_PATH, not per (kernel) module +KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) + +# We are actually building audio.ko here, as per the +# requirement we are specifying _audio.ko as LOCAL_MODULE. +# This means we need to rename the module to _audio.ko +# after audio.ko is built. +KBUILD_OPTIONS += MODNAME=cs35l41_dlkm +KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) +KBUILD_OPTIONS += $(AUDIO_SELECT) + +########################################################### +include $(CLEAR_VARS) +LOCAL_MODULE := $(AUDIO_CHIPSET)_cs35l41.ko +LOCAL_MODULE_KBUILD_NAME := cs35l41_dlkm.ko +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_DEBUG_ENABLE := true +LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +include $(DLKM_DIR)/AndroidKernelModule.mk +########################################################### +########################################################### + +endif # DLKM check +endif # supported target check diff --git a/asoc/codecs/cs35l41/Kbuild b/asoc/codecs/cs35l41/Kbuild new file mode 100755 index 000000000000..d13b2a6fcf3e --- /dev/null +++ b/asoc/codecs/cs35l41/Kbuild @@ -0,0 +1,117 @@ +# We can build either as part of a standalone Kernel build or as +# an external module. Determine which mechanism is being used +ifeq ($(MODNAME),) + KERNEL_BUILD := 1 +else + KERNEL_BUILD := 0 +endif + + + +ifeq ($(KERNEL_BUILD), 1) + # These are configurable via Kconfig for kernel-based builds + # Need to explicitly configure for Android-based builds + AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.14 + AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio +endif + +ifeq ($(KERNEL_BUILD), 0) + ifeq ($(CONFIG_ARCH_SM8150), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif + ifeq ($(CONFIG_ARCH_SM6150), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif + + ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif +endif + +# As per target team, build is done as follows: +# Defconfig : build with default flags +# Slub : defconfig + CONFIG_SLUB_DEBUG := y + +# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y +# Perf : Using appropriate msmXXXX-perf_defconfig +# +# Shipment builds (user variants) should not have any debug feature +# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds +# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since +# there is no other way to identify defconfig builds, QTI internal +# representation of perf builds (identified using the string 'perf'), +# is used to identify if the build is a slub or defconfig one. This +# way no critical debug feature will be enabled for perf and shipment +# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT +# config. + +############ UAPI ############ +UAPI_DIR := uapi +UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) + +############ COMMON ############ +COMMON_DIR := include +COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) + +############ CS35L41 ############ + +# for CS35L41 Codec +ifdef CONFIG_SND_SOC_CS35L41 + CS35L41_OBJS += cs35l41.o + CS35L41_OBJS += cs35l41-i2c.o + CS35L41_OBJS += cs35l41-tables.o + CS35L41_OBJS += wm_adsp.o +endif + +LINUX_INC += -Iinclude/linux + +INCS += $(COMMON_INC) \ + $(UAPI_INC) + +EXTRA_CFLAGS += $(INCS) + + +CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ + -DANI_LITTLE_BIT_ENDIAN \ + -DDOT11F_LITTLE_ENDIAN_HOST \ + -DANI_COMPILER_TYPE_GCC \ + -DANI_OS_TYPE_ANDROID=6 \ + -DPTT_SOCK_SVC_ENABLE \ + -Wall\ + -Werror\ + -D__linux__ + +KBUILD_CPPFLAGS += $(CDEFINES) + +# Currently, for versions of gcc which support it, the kernel Makefile +# is disabling the maybe-uninitialized warning. Re-enable it for the +# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it +# will override the kernel settings. +ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) +EXTRA_CFLAGS += -Wmaybe-uninitialized +endif +#EXTRA_CFLAGS += -Wmissing-prototypes + +ifeq ($(call cc-option-yn, -Wheader-guard),y) +EXTRA_CFLAGS += -Wheader-guard +endif + +ifeq ($(KERNEL_BUILD), 0) +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers +endif + +# Module information used by KBuild framework +obj-$(CONFIG_SND_SOC_CS35L41) += cs35l41_dlkm.o +cs35l41_dlkm-y := $(CS35L41_OBJS) + +# inject some build related information +DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/cs35l41/Kconfig b/asoc/codecs/cs35l41/Kconfig new file mode 100755 index 000000000000..111d2a1ab555 --- /dev/null +++ b/asoc/codecs/cs35l41/Kconfig @@ -0,0 +1,1066 @@ +# Helper to resolve issues with configs that have SPI enabled but I2C +# modular, meaning we can't build the codec driver in with I2C support. +# We use an ordered list of conditional defaults to pick the appropriate +# setting - SPI can't be modular so that case doesn't need to be covered. +config SND_SOC_I2C_AND_SPI + tristate + default m if I2C=m + default y if I2C=y + default y if SPI_MASTER=y + +menu "CODEC drivers" + +config SND_SOC_ALL_CODECS + tristate "Build all ASoC CODEC drivers" + depends on COMPILE_TEST + select SND_SOC_88PM860X if MFD_88PM860X + select SND_SOC_L3 + select SND_SOC_AB8500_CODEC if ABX500_CORE + select SND_SOC_AC97_CODEC + select SND_SOC_AD1836 if SPI_MASTER + select SND_SOC_AD193X_SPI if SPI_MASTER + select SND_SOC_AD193X_I2C if I2C + select SND_SOC_AD1980 if SND_SOC_AC97_BUS + select SND_SOC_AD73311 + select SND_SOC_ADAU1373 if I2C + select SND_SOC_ADAU1761_I2C if I2C + select SND_SOC_ADAU1761_SPI if SPI + select SND_SOC_ADAU1781_I2C if I2C + select SND_SOC_ADAU1781_SPI if SPI + select SND_SOC_ADAV801 if SPI_MASTER + select SND_SOC_ADAV803 if I2C + select SND_SOC_ADAU1977_SPI if SPI_MASTER + select SND_SOC_ADAU1977_I2C if I2C + select SND_SOC_ADAU1701 if I2C + select SND_SOC_ADS117X + select SND_SOC_AK4104 if SPI_MASTER + select SND_SOC_AK4535 if I2C + select SND_SOC_AK4554 + select SND_SOC_AK4613 if I2C + select SND_SOC_AK4641 if I2C + select SND_SOC_AK4642 if I2C + select SND_SOC_AK4671 if I2C + select SND_SOC_AK5386 + select SND_SOC_ALC5623 if I2C + select SND_SOC_ALC5632 if I2C + select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC + select SND_SOC_CIRRUS_PSIA + select SND_SOC_CS35L32 if I2C + select SND_SOC_CS35L33 if I2C + select SND_SOC_CS35L34 if I2C + select SND_SOC_CS35L35 if I2C + select SND_SOC_CS35L36 if I2C + select SND_SOC_CS35L41_SPI if SPI_MASTER + select SND_SOC_CS35L41_I2C if I2C + select SND_SOC_CS42L42_I2C if I2C + select SND_SOC_CS42L51_I2C if I2C + select SND_SOC_CS42L52 if I2C && INPUT + select SND_SOC_CS42L56 if I2C && INPUT + select SND_SOC_CS42L73 if I2C + select SND_SOC_CS4265 if I2C + select SND_SOC_CS4270 if I2C + select SND_SOC_CS4271_I2C if I2C + select SND_SOC_CS4271_SPI if SPI_MASTER + select SND_SOC_CS42XX8_I2C if I2C + select SND_SOC_CS4349 if I2C + select SND_SOC_CS43130 if I2C + select SND_SOC_CS47L24 if MFD_CS47L24 + select SND_SOC_CS53L30 if I2C + select SND_SOC_CX20442 if TTY + select SND_SOC_DA7210 if SND_SOC_I2C_AND_SPI + select SND_SOC_DA7213 if I2C + select SND_SOC_DA7218 if I2C + select SND_SOC_DA7219 if I2C + select SND_SOC_DA732X if I2C + select SND_SOC_DA9055 if I2C + select SND_SOC_DMIC + select SND_SOC_BT_SCO + select SND_SOC_ES8328_SPI if SPI_MASTER + select SND_SOC_ES8328_I2C if I2C + select SND_SOC_GTM601 + select SND_SOC_HDAC_HDMI + select SND_SOC_ICS43432 + select SND_SOC_INNO_RK3036 + select SND_SOC_ISABELLE if I2C + select SND_SOC_JZ4740_CODEC + select SND_SOC_LM4857 if I2C + select SND_SOC_LM49453 if I2C + select SND_SOC_MAX98088 if I2C + select SND_SOC_MAX98090 if I2C + select SND_SOC_MAX98095 if I2C + select SND_SOC_MAX98357A if GPIOLIB + select SND_SOC_MAX9867 if I2C + select SND_SOC_MAX98925 if I2C + select SND_SOC_MAX98926 if I2C + select SND_SOC_MAX9850 if I2C + select SND_SOC_MAX9768 if I2C + select SND_SOC_MAX9877 if I2C + select SND_SOC_MC13783 if MFD_MC13XXX + select SND_SOC_ML26124 if I2C + select SND_SOC_NAU8825 if I2C + select SND_SOC_PCM1681 if I2C + select SND_SOC_PCM179X_I2C if I2C + select SND_SOC_PCM179X_SPI if SPI_MASTER + select SND_SOC_PCM3008 + select SND_SOC_PCM3168A_I2C if I2C + select SND_SOC_PCM3168A_SPI if SPI_MASTER + select SND_SOC_PCM512x_I2C if I2C + select SND_SOC_PCM512x_SPI if SPI_MASTER + select SND_SOC_RT286 if I2C + select SND_SOC_RT298 if I2C + select SND_SOC_RT5514 if I2C + select SND_SOC_RT5616 if I2C + select SND_SOC_RT5631 if I2C + select SND_SOC_RT5640 if I2C + select SND_SOC_RT5645 if I2C + select SND_SOC_RT5651 if I2C + select SND_SOC_RT5659 if I2C + select SND_SOC_RT5670 if I2C + select SND_SOC_RT5677 if I2C && SPI_MASTER + select SND_SOC_SGTL5000 if I2C + select SND_SOC_SI476X if MFD_SI476X_CORE + select SND_SOC_SIRF_AUDIO_CODEC + select SND_SOC_SN95031 if INTEL_SCU_IPC + select SND_SOC_SPDIF + select SND_SOC_SSM2518 if I2C + select SND_SOC_SSM2602_SPI if SPI_MASTER + select SND_SOC_SSM2602_I2C if I2C + select SND_SOC_SSM4567 if I2C + select SND_SOC_STA32X if I2C + select SND_SOC_STA350 if I2C + select SND_SOC_STA529 if I2C + select SND_SOC_STAC9766 if SND_SOC_AC97_BUS + select SND_SOC_STI_SAS + select SND_SOC_TAS2552 if I2C + select SND_SOC_TAS5086 if I2C + select SND_SOC_TAS571X if I2C + select SND_SOC_TFA9879 if I2C + select SND_SOC_TLV320AIC23_I2C if I2C + select SND_SOC_TLV320AIC23_SPI if SPI_MASTER + select SND_SOC_TLV320AIC26 if SPI_MASTER + select SND_SOC_TLV320AIC31XX if I2C + select SND_SOC_TLV320AIC32X4 if I2C + select SND_SOC_TLV320AIC3X if I2C + select SND_SOC_TPA6130A2 if I2C + select SND_SOC_TLV320DAC33 if I2C + select SND_SOC_TS3A227E if I2C + select SND_SOC_TWL4030 if TWL4030_CORE + select SND_SOC_TWL6040 if TWL6040_CORE + select SND_SOC_UDA134X + select SND_SOC_UDA1380 if I2C + select SND_SOC_WL1273 if MFD_WL1273_CORE + select SND_SOC_WM0010 if SPI_MASTER + select SND_SOC_WM1250_EV1 if I2C + select SND_SOC_WM2000 if I2C + select SND_SOC_WM2200 if I2C + select SND_SOC_WM5100 if I2C + select SND_SOC_WM5102 if MFD_WM5102 + select SND_SOC_WM5110 if MFD_WM5110 + select SND_SOC_WM8350 if MFD_WM8350 + select SND_SOC_WM8400 if MFD_WM8400 + select SND_SOC_WM8510 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8523 if I2C + select SND_SOC_WM8580 if I2C + select SND_SOC_WM8711 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8727 + select SND_SOC_WM8728 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8731 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8737 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8741 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8750 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8753 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8770 if SPI_MASTER + select SND_SOC_WM8776 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8782 + select SND_SOC_WM8804_I2C if I2C + select SND_SOC_WM8804_SPI if SPI_MASTER + select SND_SOC_WM8900 if I2C + select SND_SOC_WM8903 if I2C + select SND_SOC_WM8904 if I2C + select SND_SOC_WM8940 if I2C + select SND_SOC_WM8955 if I2C + select SND_SOC_WM8960 if I2C + select SND_SOC_WM8961 if I2C + select SND_SOC_WM8962 if I2C && INPUT + select SND_SOC_WM8971 if I2C + select SND_SOC_WM8974 if I2C + select SND_SOC_WM8978 if I2C + select SND_SOC_WM8983 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8985 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8988 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8990 if I2C + select SND_SOC_WM8991 if I2C + select SND_SOC_WM8993 if I2C + select SND_SOC_WM8994 if MFD_WM8994 + select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8996 if I2C + select SND_SOC_WM8997 if MFD_WM8997 + select SND_SOC_WM8998 if MFD_WM8998 + select SND_SOC_WM9081 if I2C + select SND_SOC_WM9090 if I2C + select SND_SOC_WM9705 if SND_SOC_AC97_BUS + select SND_SOC_WM9712 if SND_SOC_AC97_BUS + select SND_SOC_WM9713 if SND_SOC_AC97_BUS + help + Normally ASoC codec drivers are only built if a machine driver which + uses them is also built since they are only usable with a machine + driver. Selecting this option will allow these drivers to be built + without an explicit machine driver for test and development purposes. + + Support for the bus types used to access the codecs to be built must + be selected separately. + + If unsure select "N". + +config SND_SOC_88PM860X + tristate + +config SND_SOC_ARIZONA + tristate + default y if SND_SOC_CS47L24=y + default y if SND_SOC_WM5102=y + default y if SND_SOC_WM5110=y + default y if SND_SOC_WM8997=y + default y if SND_SOC_WM8998=y + default m if SND_SOC_CS47L24=m + default m if SND_SOC_WM5102=m + default m if SND_SOC_WM5110=m + default m if SND_SOC_WM8997=m + default m if SND_SOC_WM8998=m + +config SND_SOC_WM_HUBS + tristate + default y if SND_SOC_WM8993=y || SND_SOC_WM8994=y + default m if SND_SOC_WM8993=m || SND_SOC_WM8994=m + +config SND_SOC_WM_ADSP + tristate + select SND_SOC_COMPRESS + default y if SND_SOC_CS47L24=y + default y if SND_SOC_WM5102=y + default y if SND_SOC_WM5110=y + default y if SND_SOC_WM2200=y + default m if SND_SOC_CS47L24=m + default m if SND_SOC_WM5102=m + default m if SND_SOC_WM5110=m + default m if SND_SOC_WM2200=m + +config SND_SOC_AB8500_CODEC + tristate + +config SND_SOC_AC97_CODEC + tristate "Build generic ASoC AC97 CODEC driver" + select SND_AC97_CODEC + select SND_SOC_AC97_BUS + +config SND_SOC_AD1836 + tristate + +config SND_SOC_AD193X + tristate + +config SND_SOC_AD193X_SPI + tristate + select SND_SOC_AD193X + +config SND_SOC_AD193X_I2C + tristate + select SND_SOC_AD193X + +config SND_SOC_AD1980 + select REGMAP_AC97 + tristate + +config SND_SOC_AD73311 + tristate + +config SND_SOC_ADAU1373 + tristate + +config SND_SOC_ADAU1701 + tristate "Analog Devices ADAU1701 CODEC" + depends on I2C + select SND_SOC_SIGMADSP_I2C + +config SND_SOC_ADAU17X1 + tristate + select SND_SOC_SIGMADSP_REGMAP + +config SND_SOC_ADAU1761 + tristate + select SND_SOC_ADAU17X1 + +config SND_SOC_ADAU1761_I2C + tristate + select SND_SOC_ADAU1761 + select REGMAP_I2C + +config SND_SOC_ADAU1761_SPI + tristate + select SND_SOC_ADAU1761 + select REGMAP_SPI + +config SND_SOC_ADAU1781 + select SND_SOC_ADAU17X1 + tristate + +config SND_SOC_ADAU1781_I2C + tristate + select SND_SOC_ADAU1781 + select REGMAP_I2C + +config SND_SOC_ADAU1781_SPI + tristate + select SND_SOC_ADAU1781 + select REGMAP_SPI + +config SND_SOC_ADAU1977 + tristate + +config SND_SOC_ADAU1977_SPI + tristate + select SND_SOC_ADAU1977 + select REGMAP_SPI + +config SND_SOC_ADAU1977_I2C + tristate + select SND_SOC_ADAU1977 + select REGMAP_I2C + +config SND_SOC_ADAV80X + tristate + +config SND_SOC_ADAV801 + tristate + select SND_SOC_ADAV80X + +config SND_SOC_ADAV803 + tristate + select SND_SOC_ADAV80X + +config SND_SOC_ADS117X + tristate + +config SND_SOC_AK4104 + tristate "AKM AK4104 CODEC" + depends on SPI_MASTER + +config SND_SOC_AK4535 + tristate + +config SND_SOC_AK4554 + tristate "AKM AK4554 CODEC" + +config SND_SOC_AK4613 + tristate "AKM AK4613 CODEC" + depends on I2C + +config SND_SOC_AK4641 + tristate + +config SND_SOC_AK4642 + tristate "AKM AK4642 CODEC" + depends on I2C + +config SND_SOC_AK4671 + tristate + +config SND_SOC_AK5386 + tristate "AKM AK5638 CODEC" + +config SND_SOC_ALC5623 + tristate "Realtek ALC5623 CODEC" + depends on I2C + +config SND_SOC_ALC5632 + tristate + +config SND_SOC_CQ0093VC + tristate + +config SND_SOC_CIRRUS_PSIA + tristate "Cirrus Logic PSIA Stub" + +config SND_SOC_CS35L32 + tristate "Cirrus Logic CS35L32 CODEC" + depends on I2C + +config SND_SOC_CS35L33 + tristate "Cirrus Logic CS35L33 CODEC" + depends on I2C + +config SND_SOC_CS35L34 + tristate "Cirrus Logic CS35L34 CODEC" + depends on I2C + +config SND_SOC_CS35L35 + tristate "Cirrus Logic CS35L35 CODEC" + depends on I2C + +config SND_SOC_CS35L36 + tristate "Cirrus Logic CS35L36 CODEC" + depends on I2C + +config SND_SOC_CS35L41 + tristate + select SND_SOC_WM_ADSP + +config SND_SOC_CS35L41_SPI + tristate "Cirrus Logic CS35L41 CODEC (SPI)" + depends on SPI_MASTER + select SND_SOC_CS35L41 + select REGMAP_SPI + +config SND_SOC_CS35L41_I2C + tristate "Cirrus Logic CS35L41 CODEC (I2C)" + depends on I2C + select SND_SOC_CS35L41 + select REGMAP_I2C + +config SND_SOC_CS42L42 + tristate "Cirrus Logic CS42L42 CODEC" + depends on I2C + +config SND_SOC_CS42L51 + tristate + +config SND_SOC_CS42L51_I2C + tristate "Cirrus Logic CS42L51 CODEC (I2C)" + depends on I2C + select SND_SOC_CS42L51 + +config SND_SOC_CS42L51 + tristate + +config SND_SOC_CS42L52 + tristate "Cirrus Logic CS42L52 CODEC" + depends on I2C && INPUT + +config SND_SOC_CS42L56 + tristate "Cirrus Logic CS42L56 CODEC" + depends on I2C && INPUT + +config SND_SOC_CS42L73 + tristate "Cirrus Logic CS42L73 CODEC" + depends on I2C + +config SND_SOC_CS4265 + tristate "Cirrus Logic CS4265 CODEC" + depends on I2C + select REGMAP_I2C + +# Cirrus Logic CS4270 Codec +config SND_SOC_CS4270 + tristate "Cirrus Logic CS4270 CODEC" + depends on I2C + +# Cirrus Logic CS4270 Codec VD = 3.3V Errata +# Select if you are affected by the errata where the part will not function +# if MCLK divide-by-1.5 is selected and VD is set to 3.3V. The driver will +# not select any sample rates that require MCLK to be divided by 1.5. +config SND_SOC_CS4270_VD33_ERRATA + bool + depends on SND_SOC_CS4270 + +config SND_SOC_CS4271 + tristate + +config SND_SOC_CS4271_I2C + tristate "Cirrus Logic CS4271 CODEC (I2C)" + depends on I2C + select SND_SOC_CS4271 + select REGMAP_I2C + +config SND_SOC_CS4271_SPI + tristate "Cirrus Logic CS4271 CODEC (SPI)" + depends on SPI_MASTER + select SND_SOC_CS4271 + select REGMAP_SPI + +config SND_SOC_CS42XX8 + tristate + +config SND_SOC_CS42XX8_I2C + tristate "Cirrus Logic CS42448/CS42888 CODEC (I2C)" + depends on I2C + select SND_SOC_CS42XX8 + select REGMAP_I2C + +# Cirrus Logic CS4349 HiFi DAC +config SND_SOC_CS4349 + tristate "Cirrus Logic CS4349 CODEC" + depends on I2C + +# Cirrus Logic CS43130 HiFi DAC +config SND_SOC_CS43130 + tristate "Cirrus Logic CS43130 CODEC" + depends on I2C + +config SND_SOC_CS47L24 + tristate + +config SND_SOC_CS53L30 + tristate "Cirrus Logic CS53L30 CODEC" + depends on I2C + +config SND_SOC_CX20442 + tristate + depends on TTY + +config SND_SOC_JZ4740_CODEC + select REGMAP_MMIO + tristate + +config SND_SOC_L3 + tristate + +config SND_SOC_DA7210 + tristate + +config SND_SOC_DA7213 + tristate + +config SND_SOC_DA7218 + tristate + +config SND_SOC_DA7219 + tristate + +config SND_SOC_DA732X + tristate + +config SND_SOC_DA9055 + tristate + +config SND_SOC_BT_SCO + tristate + +config SND_SOC_DMIC + tristate + +config SND_SOC_ES8328 + tristate "Everest Semi ES8328 CODEC" + +config SND_SOC_ES8328_I2C + tristate + select SND_SOC_ES8328 + +config SND_SOC_ES8328_SPI + tristate + select SND_SOC_ES8328 + +config SND_SOC_GTM601 + tristate 'GTM601 UMTS modem audio codec' + +config SND_SOC_HDAC_HDMI + tristate + select SND_HDA_EXT_CORE + select SND_PCM_ELD + select HDMI + +config SND_SOC_ICS43432 + tristate + +config SND_SOC_INNO_RK3036 + tristate "Inno codec driver for RK3036 SoC" + select REGMAP_MMIO + +config SND_SOC_ISABELLE + tristate + +config SND_SOC_LM49453 + tristate + +config SND_SOC_MAX98088 + tristate + +config SND_SOC_MAX98090 + tristate + +config SND_SOC_MAX98095 + tristate + +config SND_SOC_MAX98357A + tristate + +config SND_SOC_MAX9867 + tristate + +config SND_SOC_MAX98925 + tristate + +config SND_SOC_MAX98926 + tristate + +config SND_SOC_MAX9850 + tristate + +config SND_SOC_PCM1681 + tristate "Texas Instruments PCM1681 CODEC" + depends on I2C + +config SND_SOC_PCM179X + tristate + +config SND_SOC_PCM179X_I2C + tristate "Texas Instruments PCM179X CODEC (I2C)" + depends on I2C + select SND_SOC_PCM179X + help + Enable support for Texas Instruments PCM179x CODEC. + Select this if your PCM179x is connected via an I2C bus. + +config SND_SOC_PCM179X_SPI + tristate "Texas Instruments PCM179X CODEC (SPI)" + depends on SPI_MASTER + select SND_SOC_PCM179X + help + Enable support for Texas Instruments PCM179x CODEC. + Select this if your PCM179x is connected via an SPI bus. + +config SND_SOC_PCM3008 + tristate + +config SND_SOC_PCM3168A + tristate + +config SND_SOC_PCM3168A_I2C + tristate "Texas Instruments PCM3168A CODEC - I2C" + depends on I2C + select SND_SOC_PCM3168A + select REGMAP_I2C + +config SND_SOC_PCM3168A_SPI + tristate "Texas Instruments PCM3168A CODEC - SPI" + depends on SPI_MASTER + select SND_SOC_PCM3168A + select REGMAP_SPI + +config SND_SOC_PCM512x + tristate + +config SND_SOC_PCM512x_I2C + tristate "Texas Instruments PCM512x CODECs - I2C" + depends on I2C + select SND_SOC_PCM512x + select REGMAP_I2C + +config SND_SOC_PCM512x_SPI + tristate "Texas Instruments PCM512x CODECs - SPI" + depends on SPI_MASTER + select SND_SOC_PCM512x + select REGMAP_SPI + +config SND_SOC_RL6231 + tristate + default y if SND_SOC_RT5514=y + default y if SND_SOC_RT5616=y + default y if SND_SOC_RT5640=y + default y if SND_SOC_RT5645=y + default y if SND_SOC_RT5651=y + default y if SND_SOC_RT5659=y + default y if SND_SOC_RT5670=y + default y if SND_SOC_RT5677=y + default m if SND_SOC_RT5514=m + default m if SND_SOC_RT5616=m + default m if SND_SOC_RT5640=m + default m if SND_SOC_RT5645=m + default m if SND_SOC_RT5651=m + default m if SND_SOC_RT5659=m + default m if SND_SOC_RT5670=m + default m if SND_SOC_RT5677=m + +config SND_SOC_RL6347A + tristate + default y if SND_SOC_RT286=y + default y if SND_SOC_RT298=y + default m if SND_SOC_RT286=m + default m if SND_SOC_RT298=m + +config SND_SOC_RT286 + tristate + depends on I2C + +config SND_SOC_RT298 + tristate + depends on I2C + +config SND_SOC_RT5514 + tristate + +config SND_SOC_RT5616 + tristate "Realtek RT5616 CODEC" + depends on I2C + +config SND_SOC_RT5631 + tristate "Realtek ALC5631/RT5631 CODEC" + depends on I2C + +config SND_SOC_RT5640 + tristate + +config SND_SOC_RT5645 + tristate + +config SND_SOC_RT5651 + tristate + +config SND_SOC_RT5659 + tristate + +config SND_SOC_RT5670 + tristate + +config SND_SOC_RT5677 + tristate + select REGMAP_I2C + select REGMAP_IRQ + +config SND_SOC_RT5677_SPI + tristate + default SND_SOC_RT5677 && SPI + +#Freescale sgtl5000 codec +config SND_SOC_SGTL5000 + tristate "Freescale SGTL5000 CODEC" + depends on I2C + +config SND_SOC_SI476X + tristate + +config SND_SOC_SIGMADSP + tristate + select CRC32 + +config SND_SOC_SIGMADSP_I2C + tristate + select SND_SOC_SIGMADSP + +config SND_SOC_SIGMADSP_REGMAP + tristate + select SND_SOC_SIGMADSP + +config SND_SOC_SIRF_AUDIO_CODEC + tristate "SiRF SoC internal audio codec" + select REGMAP_MMIO + +config SND_SOC_SN95031 + tristate + +config SND_SOC_SPDIF + tristate "S/PDIF CODEC" + +config SND_SOC_SSM2518 + tristate + +config SND_SOC_SSM2602 + tristate + +config SND_SOC_SSM2602_SPI + tristate "Analog Devices SSM2602 CODEC - SPI" + depends on SPI_MASTER + select SND_SOC_SSM2602 + select REGMAP_SPI + +config SND_SOC_SSM2602_I2C + tristate "Analog Devices SSM2602 CODEC - I2C" + depends on I2C + select SND_SOC_SSM2602 + select REGMAP_I2C + +config SND_SOC_SSM4567 + tristate "Analog Devices ssm4567 amplifier driver support" + depends on I2C + +config SND_SOC_STA32X + tristate "STA326, STA328 and STA329 speaker amplifier" + depends on I2C + select REGMAP_I2C + +config SND_SOC_STA350 + tristate "STA350 speaker amplifier" + depends on I2C + +config SND_SOC_STA529 + tristate + +config SND_SOC_STAC9766 + tristate + +config SND_SOC_STI_SAS + tristate "codec Audio support for STI SAS codec" + +config SND_SOC_TAS2552 + tristate "Texas Instruments TAS2552 Mono Audio amplifier" + depends on I2C + +config SND_SOC_TAS5086 + tristate "Texas Instruments TAS5086 speaker amplifier" + depends on I2C + +config SND_SOC_TAS571X + tristate "Texas Instruments TAS5711/TAS5717/TAS5719 power amplifiers" + depends on I2C + +config SND_SOC_TFA9879 + tristate "NXP Semiconductors TFA9879 amplifier" + depends on I2C + +config SND_SOC_TLV320AIC23 + tristate + +config SND_SOC_TLV320AIC23_I2C + tristate "Texas Instruments TLV320AIC23 audio CODEC - I2C" + depends on I2C + select SND_SOC_TLV320AIC23 + +config SND_SOC_TLV320AIC23_SPI + tristate "Texas Instruments TLV320AIC23 audio CODEC - SPI" + depends on SPI_MASTER + select SND_SOC_TLV320AIC23 + +config SND_SOC_TLV320AIC26 + tristate + depends on SPI + +config SND_SOC_TLV320AIC31XX + tristate "Texas Instruments TLV320AIC31xx CODECs" + depends on I2C + select REGMAP_I2C + +config SND_SOC_TLV320AIC32X4 + tristate + +config SND_SOC_TLV320AIC3X + tristate "Texas Instruments TLV320AIC3x CODECs" + depends on I2C + +config SND_SOC_TLV320DAC33 + tristate + +config SND_SOC_TS3A227E + tristate "TI Headset/Mic detect and keypress chip" + depends on I2C + +config SND_SOC_TWL4030 + select MFD_TWL4030_AUDIO + tristate + +config SND_SOC_TWL6040 + tristate + +config SND_SOC_UDA134X + tristate + +config SND_SOC_UDA1380 + tristate + +config SND_SOC_WL1273 + tristate + +config SND_SOC_WM0010 + tristate + +config SND_SOC_WM1250_EV1 + tristate + +config SND_SOC_WM2000 + tristate + +config SND_SOC_WM2200 + tristate + +config SND_SOC_WM5100 + tristate + +config SND_SOC_WM5102 + tristate + +config SND_SOC_WM5110 + tristate + +config SND_SOC_WM8350 + tristate + +config SND_SOC_WM8400 + tristate + +config SND_SOC_WM8510 + tristate "Wolfson Microelectronics WM8510 CODEC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8523 + tristate "Wolfson Microelectronics WM8523 DAC" + depends on I2C + +config SND_SOC_WM8580 + tristate "Wolfson Microelectronics WM8523 CODEC" + depends on I2C + +config SND_SOC_WM8711 + tristate "Wolfson Microelectronics WM8711 CODEC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8727 + tristate + +config SND_SOC_WM8728 + tristate "Wolfson Microelectronics WM8728 DAC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8731 + tristate "Wolfson Microelectronics WM8731 CODEC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8737 + tristate "Wolfson Microelectronics WM8737 ADC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8741 + tristate "Wolfson Microelectronics WM8737 DAC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8750 + tristate "Wolfson Microelectronics WM8750 CODEC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8753 + tristate "Wolfson Microelectronics WM8753 CODEC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8770 + tristate "Wolfson Microelectronics WM8770 CODEC" + depends on SPI_MASTER + +config SND_SOC_WM8776 + tristate "Wolfson Microelectronics WM8776 CODEC" + depends on SND_SOC_I2C_AND_SPI + +config SND_SOC_WM8782 + tristate + +config SND_SOC_WM8804 + tristate + +config SND_SOC_WM8804_I2C + tristate "Wolfson Microelectronics WM8804 S/PDIF transceiver I2C" + depends on I2C + select SND_SOC_WM8804 + select REGMAP_I2C + +config SND_SOC_WM8804_SPI + tristate "Wolfson Microelectronics WM8804 S/PDIF transceiver SPI" + depends on SPI_MASTER + select SND_SOC_WM8804 + select REGMAP_SPI + +config SND_SOC_WM8900 + tristate + +config SND_SOC_WM8903 + tristate "Wolfson Microelectronics WM8903 CODEC" + depends on I2C + +config SND_SOC_WM8904 + tristate + +config SND_SOC_WM8940 + tristate + +config SND_SOC_WM8955 + tristate + +config SND_SOC_WM8960 + tristate + +config SND_SOC_WM8961 + tristate + +config SND_SOC_WM8962 + tristate "Wolfson Microelectronics WM8962 CODEC" + depends on I2C && INPUT + +config SND_SOC_WM8971 + tristate + +config SND_SOC_WM8974 + tristate "Wolfson Microelectronics WM8974 codec" + depends on I2C + +config SND_SOC_WM8978 + tristate "Wolfson Microelectronics WM8978 codec" + depends on I2C + +config SND_SOC_WM8983 + tristate + +config SND_SOC_WM8985 + tristate + +config SND_SOC_WM8988 + tristate + +config SND_SOC_WM8990 + tristate + +config SND_SOC_WM8991 + tristate + +config SND_SOC_WM8993 + tristate + +config SND_SOC_WM8994 + tristate + +config SND_SOC_WM8995 + tristate + +config SND_SOC_WM8996 + tristate + +config SND_SOC_WM8997 + tristate + +config SND_SOC_WM8998 + tristate + +config SND_SOC_WM9081 + tristate + +config SND_SOC_WM9090 + tristate + +config SND_SOC_WM9705 + tristate + +config SND_SOC_WM9712 + tristate + +config SND_SOC_WM9713 + tristate + select REGMAP_AC97 + +# Amp +config SND_SOC_LM4857 + tristate + +config SND_SOC_MAX9768 + tristate + +config SND_SOC_MAX9877 + tristate + +config SND_SOC_MC13783 + tristate + +config SND_SOC_ML26124 + tristate + +config SND_SOC_NAU8825 + tristate + +config SND_SOC_TPA6130A2 + tristate "Texas Instruments TPA6130A2 headphone amplifier" + depends on I2C + +endmenu diff --git a/asoc/codecs/cs35l41/Makefile b/asoc/codecs/cs35l41/Makefile new file mode 100755 index 000000000000..e7e3ce8cf43a --- /dev/null +++ b/asoc/codecs/cs35l41/Makefile @@ -0,0 +1,433 @@ +snd-soc-88pm860x-objs := 88pm860x-codec.o +snd-soc-ab8500-codec-objs := ab8500-codec.o +snd-soc-ac97-objs := ac97.o +snd-soc-ad1836-objs := ad1836.o +snd-soc-ad193x-objs := ad193x.o +snd-soc-ad193x-spi-objs := ad193x-spi.o +snd-soc-ad193x-i2c-objs := ad193x-i2c.o +snd-soc-ad1980-objs := ad1980.o +snd-soc-ad73311-objs := ad73311.o +snd-soc-adau1373-objs := adau1373.o +snd-soc-adau1701-objs := adau1701.o +snd-soc-adau17x1-objs := adau17x1.o +snd-soc-adau1761-objs := adau1761.o +snd-soc-adau1761-i2c-objs := adau1761-i2c.o +snd-soc-adau1761-spi-objs := adau1761-spi.o +snd-soc-adau1781-objs := adau1781.o +snd-soc-adau1781-i2c-objs := adau1781-i2c.o +snd-soc-adau1781-spi-objs := adau1781-spi.o +snd-soc-adau1977-objs := adau1977.o +snd-soc-adau1977-spi-objs := adau1977-spi.o +snd-soc-adau1977-i2c-objs := adau1977-i2c.o +snd-soc-adav80x-objs := adav80x.o +snd-soc-adav801-objs := adav801.o +snd-soc-adav803-objs := adav803.o +snd-soc-ads117x-objs := ads117x.o +snd-soc-ak4104-objs := ak4104.o +snd-soc-ak4535-objs := ak4535.o +snd-soc-ak4554-objs := ak4554.o +snd-soc-ak4613-objs := ak4613.o +snd-soc-ak4641-objs := ak4641.o +snd-soc-ak4642-objs := ak4642.o +snd-soc-ak4671-objs := ak4671.o +snd-soc-ak5386-objs := ak5386.o +snd-soc-arizona-objs := arizona.o +snd-soc-cq93vc-objs := cq93vc.o +snd-soc-cirrus-psia-objs := cirrus-psia.o +snd-soc-cs35l32-objs := cs35l32.o +snd-soc-cs35l33-objs := cs35l33.o +snd-soc-cs35l34-objs := cs35l34.o +snd-soc-cs35l35-objs := cs35l35.o +snd-soc-cs35l36-objs := cs35l36.o cs35l36-tables.o +snd-soc-cs35l41-objs := cs35l41.o +snd-soc-cs35l41-spi-objs := cs35l41-spi.o cs35l41-tables.o +snd-soc-cs35l41-i2c-objs := cs35l41-i2c.o cs35l41-tables.o +snd-soc-cs42l42-objs := cs42l42.o +snd-soc-cs42l51-objs := cs42l51.o +snd-soc-cs42l51-i2c-objs := cs42l51-i2c.o +snd-soc-cs42l52-objs := cs42l52.o +snd-soc-cs42l56-objs := cs42l56.o +snd-soc-cs42l73-objs := cs42l73.o +snd-soc-cs4265-objs := cs4265.o +snd-soc-cs4270-objs := cs4270.o +snd-soc-cs4271-objs := cs4271.o +snd-soc-cs4271-i2c-objs := cs4271-i2c.o +snd-soc-cs4271-spi-objs := cs4271-spi.o +snd-soc-cs42xx8-objs := cs42xx8.o +snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o +snd-soc-cs4349-objs := cs4349.o +snd-soc-cs43130-objs := cs43130.o +snd-soc-cs47l24-objs := cs47l24.o +snd-soc-cs53l30-objs := cs53l30.o +snd-soc-cx20442-objs := cx20442.o +snd-soc-da7210-objs := da7210.o +snd-soc-da7213-objs := da7213.o +snd-soc-da7218-objs := da7218.o +snd-soc-da7219-objs := da7219.o da7219-aad.o +snd-soc-da732x-objs := da732x.o +snd-soc-da9055-objs := da9055.o +snd-soc-bt-sco-objs := bt-sco.o +snd-soc-dmic-objs := dmic.o +snd-soc-es8328-objs := es8328.o +snd-soc-es8328-i2c-objs := es8328-i2c.o +snd-soc-es8328-spi-objs := es8328-spi.o +snd-soc-gtm601-objs := gtm601.o +snd-soc-hdac-hdmi-objs := hdac_hdmi.o +snd-soc-ics43432-objs := ics43432.o +snd-soc-inno-rk3036-objs := inno_rk3036.o +snd-soc-isabelle-objs := isabelle.o +snd-soc-jz4740-codec-objs := jz4740.o +snd-soc-l3-objs := l3.o +snd-soc-lm4857-objs := lm4857.o +snd-soc-lm49453-objs := lm49453.o +snd-soc-max9768-objs := max9768.o +snd-soc-max98088-objs := max98088.o +snd-soc-max98090-objs := max98090.o +snd-soc-max98095-objs := max98095.o +snd-soc-max98357a-objs := max98357a.o +snd-soc-max9867-objs := max9867.o +snd-soc-max98925-objs := max98925.o +snd-soc-max98926-objs := max98926.o +snd-soc-max9850-objs := max9850.o +snd-soc-mc13783-objs := mc13783.o +snd-soc-ml26124-objs := ml26124.o +snd-soc-nau8825-objs := nau8825.o +snd-soc-pcm1681-objs := pcm1681.o +snd-soc-pcm179x-codec-objs := pcm179x.o +snd-soc-pcm179x-i2c-objs := pcm179x-i2c.o +snd-soc-pcm179x-spi-objs := pcm179x-spi.o +snd-soc-pcm3008-objs := pcm3008.o +snd-soc-pcm3168a-objs := pcm3168a.o +snd-soc-pcm3168a-i2c-objs := pcm3168a-i2c.o +snd-soc-pcm3168a-spi-objs := pcm3168a-spi.o +snd-soc-pcm512x-objs := pcm512x.o +snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o +snd-soc-pcm512x-spi-objs := pcm512x-spi.o +snd-soc-rl6231-objs := rl6231.o +snd-soc-rl6347a-objs := rl6347a.o +snd-soc-rt286-objs := rt286.o +snd-soc-rt298-objs := rt298.o +snd-soc-rt5514-objs := rt5514.o +snd-soc-rt5616-objs := rt5616.o +snd-soc-rt5631-objs := rt5631.o +snd-soc-rt5640-objs := rt5640.o +snd-soc-rt5645-objs := rt5645.o +snd-soc-rt5651-objs := rt5651.o +snd-soc-rt5659-objs := rt5659.o +snd-soc-rt5670-objs := rt5670.o +snd-soc-rt5677-objs := rt5677.o +snd-soc-rt5677-spi-objs := rt5677-spi.o +snd-soc-sgtl5000-objs := sgtl5000.o +snd-soc-alc5623-objs := alc5623.o +snd-soc-alc5632-objs := alc5632.o +snd-soc-sigmadsp-objs := sigmadsp.o +snd-soc-sigmadsp-i2c-objs := sigmadsp-i2c.o +snd-soc-sigmadsp-regmap-objs := sigmadsp-regmap.o +snd-soc-si476x-objs := si476x.o +snd-soc-sirf-audio-codec-objs := sirf-audio-codec.o +snd-soc-sn95031-objs := sn95031.o +snd-soc-spdif-tx-objs := spdif_transmitter.o +snd-soc-spdif-rx-objs := spdif_receiver.o +snd-soc-ssm2518-objs := ssm2518.o +snd-soc-ssm2602-objs := ssm2602.o +snd-soc-ssm2602-spi-objs := ssm2602-spi.o +snd-soc-ssm2602-i2c-objs := ssm2602-i2c.o +snd-soc-ssm4567-objs := ssm4567.o +snd-soc-sta32x-objs := sta32x.o +snd-soc-sta350-objs := sta350.o +snd-soc-sta529-objs := sta529.o +snd-soc-stac9766-objs := stac9766.o +snd-soc-sti-sas-objs := sti-sas.o +snd-soc-tas5086-objs := tas5086.o +snd-soc-tas571x-objs := tas571x.o +snd-soc-tfa9879-objs := tfa9879.o +snd-soc-tlv320aic23-objs := tlv320aic23.o +snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o +snd-soc-tlv320aic23-spi-objs := tlv320aic23-spi.o +snd-soc-tlv320aic26-objs := tlv320aic26.o +snd-soc-tlv320aic31xx-objs := tlv320aic31xx.o +snd-soc-tlv320aic32x4-objs := tlv320aic32x4.o +snd-soc-tlv320aic3x-objs := tlv320aic3x.o +snd-soc-tlv320dac33-objs := tlv320dac33.o +snd-soc-ts3a227e-objs := ts3a227e.o +snd-soc-twl4030-objs := twl4030.o +snd-soc-twl6040-objs := twl6040.o +snd-soc-uda134x-objs := uda134x.o +snd-soc-uda1380-objs := uda1380.o +snd-soc-wl1273-objs := wl1273.o +snd-soc-wm-adsp-objs := wm_adsp.o +snd-soc-wm0010-objs := wm0010.o +snd-soc-wm1250-ev1-objs := wm1250-ev1.o +snd-soc-wm2000-objs := wm2000.o +snd-soc-wm2200-objs := wm2200.o +snd-soc-wm5100-objs := wm5100.o wm5100-tables.o +snd-soc-wm5102-objs := wm5102.o +snd-soc-wm5110-objs := wm5110.o +snd-soc-wm8350-objs := wm8350.o +snd-soc-wm8400-objs := wm8400.o +snd-soc-wm8510-objs := wm8510.o +snd-soc-wm8523-objs := wm8523.o +snd-soc-wm8580-objs := wm8580.o +snd-soc-wm8711-objs := wm8711.o +snd-soc-wm8727-objs := wm8727.o +snd-soc-wm8728-objs := wm8728.o +snd-soc-wm8731-objs := wm8731.o +snd-soc-wm8737-objs := wm8737.o +snd-soc-wm8741-objs := wm8741.o +snd-soc-wm8750-objs := wm8750.o +snd-soc-wm8753-objs := wm8753.o +snd-soc-wm8770-objs := wm8770.o +snd-soc-wm8776-objs := wm8776.o +snd-soc-wm8782-objs := wm8782.o +snd-soc-wm8804-objs := wm8804.o +snd-soc-wm8804-i2c-objs := wm8804-i2c.o +snd-soc-wm8804-spi-objs := wm8804-spi.o +snd-soc-wm8900-objs := wm8900.o +snd-soc-wm8903-objs := wm8903.o +snd-soc-wm8904-objs := wm8904.o +snd-soc-wm8996-objs := wm8996.o +snd-soc-wm8940-objs := wm8940.o +snd-soc-wm8955-objs := wm8955.o +snd-soc-wm8960-objs := wm8960.o +snd-soc-wm8961-objs := wm8961.o +snd-soc-wm8962-objs := wm8962.o +snd-soc-wm8971-objs := wm8971.o +snd-soc-wm8974-objs := wm8974.o +snd-soc-wm8978-objs := wm8978.o +snd-soc-wm8983-objs := wm8983.o +snd-soc-wm8985-objs := wm8985.o +snd-soc-wm8988-objs := wm8988.o +snd-soc-wm8990-objs := wm8990.o +snd-soc-wm8991-objs := wm8991.o +snd-soc-wm8993-objs := wm8993.o +snd-soc-wm8994-objs := wm8994.o wm8958-dsp2.o +snd-soc-wm8995-objs := wm8995.o +snd-soc-wm8997-objs := wm8997.o +snd-soc-wm8998-objs := wm8998.o +snd-soc-wm9081-objs := wm9081.o +snd-soc-wm9090-objs := wm9090.o +snd-soc-wm9705-objs := wm9705.o +snd-soc-wm9712-objs := wm9712.o +snd-soc-wm9713-objs := wm9713.o +snd-soc-wm-hubs-objs := wm_hubs.o + +# Amp +snd-soc-max9877-objs := max9877.o +snd-soc-tpa6130a2-objs := tpa6130a2.o +snd-soc-tas2552-objs := tas2552.o + +obj-$(CONFIG_SND_SOC_88PM860X) += snd-soc-88pm860x.o +obj-$(CONFIG_SND_SOC_AB8500_CODEC) += snd-soc-ab8500-codec.o +obj-$(CONFIG_SND_SOC_AC97_CODEC) += snd-soc-ac97.o +obj-$(CONFIG_SND_SOC_AD1836) += snd-soc-ad1836.o +obj-$(CONFIG_SND_SOC_AD193X) += snd-soc-ad193x.o +obj-$(CONFIG_SND_SOC_AD193X_SPI) += snd-soc-ad193x-spi.o +obj-$(CONFIG_SND_SOC_AD193X_I2C) += snd-soc-ad193x-i2c.o +obj-$(CONFIG_SND_SOC_AD1980) += snd-soc-ad1980.o +obj-$(CONFIG_SND_SOC_AD73311) += snd-soc-ad73311.o +obj-$(CONFIG_SND_SOC_ADAU1373) += snd-soc-adau1373.o +obj-$(CONFIG_SND_SOC_ADAU1701) += snd-soc-adau1701.o +obj-$(CONFIG_SND_SOC_ADAU17X1) += snd-soc-adau17x1.o +obj-$(CONFIG_SND_SOC_ADAU1761) += snd-soc-adau1761.o +obj-$(CONFIG_SND_SOC_ADAU1761_I2C) += snd-soc-adau1761-i2c.o +obj-$(CONFIG_SND_SOC_ADAU1761_SPI) += snd-soc-adau1761-spi.o +obj-$(CONFIG_SND_SOC_ADAU1781) += snd-soc-adau1781.o +obj-$(CONFIG_SND_SOC_ADAU1781_I2C) += snd-soc-adau1781-i2c.o +obj-$(CONFIG_SND_SOC_ADAU1781_SPI) += snd-soc-adau1781-spi.o +obj-$(CONFIG_SND_SOC_ADAU1977) += snd-soc-adau1977.o +obj-$(CONFIG_SND_SOC_ADAU1977_SPI) += snd-soc-adau1977-spi.o +obj-$(CONFIG_SND_SOC_ADAU1977_I2C) += snd-soc-adau1977-i2c.o +obj-$(CONFIG_SND_SOC_ADAV80X) += snd-soc-adav80x.o +obj-$(CONFIG_SND_SOC_ADAV801) += snd-soc-adav801.o +obj-$(CONFIG_SND_SOC_ADAV803) += snd-soc-adav803.o +obj-$(CONFIG_SND_SOC_ADS117X) += snd-soc-ads117x.o +obj-$(CONFIG_SND_SOC_AK4104) += snd-soc-ak4104.o +obj-$(CONFIG_SND_SOC_AK4535) += snd-soc-ak4535.o +obj-$(CONFIG_SND_SOC_AK4554) += snd-soc-ak4554.o +obj-$(CONFIG_SND_SOC_AK4613) += snd-soc-ak4613.o +obj-$(CONFIG_SND_SOC_AK4641) += snd-soc-ak4641.o +obj-$(CONFIG_SND_SOC_AK4642) += snd-soc-ak4642.o +obj-$(CONFIG_SND_SOC_AK4671) += snd-soc-ak4671.o +obj-$(CONFIG_SND_SOC_AK5386) += snd-soc-ak5386.o +obj-$(CONFIG_SND_SOC_ALC5623) += snd-soc-alc5623.o +obj-$(CONFIG_SND_SOC_ALC5632) += snd-soc-alc5632.o +obj-$(CONFIG_SND_SOC_ARIZONA) += snd-soc-arizona.o +obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o +obj-$(CONFIG_SND_SOC_CIRRUS_PSIA) += snd-soc-cirrus-psia.o +obj-$(CONFIG_SND_SOC_CS35L32) += snd-soc-cs35l32.o +obj-$(CONFIG_SND_SOC_CS35L33) += snd-soc-cs35l33.o +obj-$(CONFIG_SND_SOC_CS35L34) += snd-soc-cs35l34.o +obj-$(CONFIG_SND_SOC_CS35L35) += snd-soc-cs35l35.o +obj-$(CONFIG_SND_SOC_CS35L41) += snd-soc-cs35l41.o +obj-$(CONFIG_SND_SOC_CS35L41_SPI) += snd-soc-cs35l41-spi.o +obj-$(CONFIG_SND_SOC_CS35L41_I2C) += snd-soc-cs35l41-i2c.o +obj-$(CONFIG_SND_SOC_CS35L36) += snd-soc-cs35l36.o +obj-$(CONFIG_SND_SOC_CS42L42) += snd-soc-cs42l42.o +obj-$(CONFIG_SND_SOC_CS42L51) += snd-soc-cs42l51.o +obj-$(CONFIG_SND_SOC_CS42L51_I2C) += snd-soc-cs42l51-i2c.o +obj-$(CONFIG_SND_SOC_CS42L52) += snd-soc-cs42l52.o +obj-$(CONFIG_SND_SOC_CS42L56) += snd-soc-cs42l56.o +obj-$(CONFIG_SND_SOC_CS42L73) += snd-soc-cs42l73.o +obj-$(CONFIG_SND_SOC_CS4265) += snd-soc-cs4265.o +obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o +obj-$(CONFIG_SND_SOC_CS4271) += snd-soc-cs4271.o +obj-$(CONFIG_SND_SOC_CS4271_I2C) += snd-soc-cs4271-i2c.o +obj-$(CONFIG_SND_SOC_CS4271_SPI) += snd-soc-cs4271-spi.o +obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o +obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o +obj-$(CONFIG_SND_SOC_CS4349) += snd-soc-cs4349.o +obj-$(CONFIG_SND_SOC_CS43130) += snd-soc-cs43130.o +obj-$(CONFIG_SND_SOC_CS47L24) += snd-soc-cs47l24.o +obj-$(CONFIG_SND_SOC_CS53L30) += snd-soc-cs53l30.o +obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o +obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o +obj-$(CONFIG_SND_SOC_DA7213) += snd-soc-da7213.o +obj-$(CONFIG_SND_SOC_DA7218) += snd-soc-da7218.o +obj-$(CONFIG_SND_SOC_DA7219) += snd-soc-da7219.o +obj-$(CONFIG_SND_SOC_DA732X) += snd-soc-da732x.o +obj-$(CONFIG_SND_SOC_DA9055) += snd-soc-da9055.o +obj-$(CONFIG_SND_SOC_BT_SCO) += snd-soc-bt-sco.o +obj-$(CONFIG_SND_SOC_DMIC) += snd-soc-dmic.o +obj-$(CONFIG_SND_SOC_ES8328) += snd-soc-es8328.o +obj-$(CONFIG_SND_SOC_ES8328_I2C)+= snd-soc-es8328-i2c.o +obj-$(CONFIG_SND_SOC_ES8328_SPI)+= snd-soc-es8328-spi.o +obj-$(CONFIG_SND_SOC_GTM601) += snd-soc-gtm601.o +obj-$(CONFIG_SND_SOC_HDAC_HDMI) += snd-soc-hdac-hdmi.o +obj-$(CONFIG_SND_SOC_ICS43432) += snd-soc-ics43432.o +obj-$(CONFIG_SND_SOC_INNO_RK3036) += snd-soc-inno-rk3036.o +obj-$(CONFIG_SND_SOC_ISABELLE) += snd-soc-isabelle.o +obj-$(CONFIG_SND_SOC_JZ4740_CODEC) += snd-soc-jz4740-codec.o +obj-$(CONFIG_SND_SOC_L3) += snd-soc-l3.o +obj-$(CONFIG_SND_SOC_LM4857) += snd-soc-lm4857.o +obj-$(CONFIG_SND_SOC_LM49453) += snd-soc-lm49453.o +obj-$(CONFIG_SND_SOC_MAX9768) += snd-soc-max9768.o +obj-$(CONFIG_SND_SOC_MAX98088) += snd-soc-max98088.o +obj-$(CONFIG_SND_SOC_MAX98090) += snd-soc-max98090.o +obj-$(CONFIG_SND_SOC_MAX98095) += snd-soc-max98095.o +obj-$(CONFIG_SND_SOC_MAX98357A) += snd-soc-max98357a.o +obj-$(CONFIG_SND_SOC_MAX9867) += snd-soc-max9867.o +obj-$(CONFIG_SND_SOC_MAX98925) += snd-soc-max98925.o +obj-$(CONFIG_SND_SOC_MAX98926) += snd-soc-max98926.o +obj-$(CONFIG_SND_SOC_MAX9850) += snd-soc-max9850.o +obj-$(CONFIG_SND_SOC_MC13783) += snd-soc-mc13783.o +obj-$(CONFIG_SND_SOC_ML26124) += snd-soc-ml26124.o +obj-$(CONFIG_SND_SOC_NAU8825) += snd-soc-nau8825.o +obj-$(CONFIG_SND_SOC_PCM1681) += snd-soc-pcm1681.o +obj-$(CONFIG_SND_SOC_PCM179X) += snd-soc-pcm179x-codec.o +obj-$(CONFIG_SND_SOC_PCM179X_I2C) += snd-soc-pcm179x-i2c.o +obj-$(CONFIG_SND_SOC_PCM179X_SPI) += snd-soc-pcm179x-spi.o +obj-$(CONFIG_SND_SOC_PCM3008) += snd-soc-pcm3008.o +obj-$(CONFIG_SND_SOC_PCM3168A) += snd-soc-pcm3168a.o +obj-$(CONFIG_SND_SOC_PCM3168A_I2C) += snd-soc-pcm3168a-i2c.o +obj-$(CONFIG_SND_SOC_PCM3168A_SPI) += snd-soc-pcm3168a-spi.o +obj-$(CONFIG_SND_SOC_PCM512x) += snd-soc-pcm512x.o +obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o +obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o +obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o +obj-$(CONFIG_SND_SOC_RL6347A) += snd-soc-rl6347a.o +obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o +obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o +obj-$(CONFIG_SND_SOC_RT5514) += snd-soc-rt5514.o +obj-$(CONFIG_SND_SOC_RT5616) += snd-soc-rt5616.o +obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o +obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o +obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o +obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o +obj-$(CONFIG_SND_SOC_RT5659) += snd-soc-rt5659.o +obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o +obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o +obj-$(CONFIG_SND_SOC_RT5677_SPI) += snd-soc-rt5677-spi.o +obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o +obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o +obj-$(CONFIG_SND_SOC_SIGMADSP_I2C) += snd-soc-sigmadsp-i2c.o +obj-$(CONFIG_SND_SOC_SIGMADSP_REGMAP) += snd-soc-sigmadsp-regmap.o +obj-$(CONFIG_SND_SOC_SI476X) += snd-soc-si476x.o +obj-$(CONFIG_SND_SOC_SN95031) +=snd-soc-sn95031.o +obj-$(CONFIG_SND_SOC_SPDIF) += snd-soc-spdif-rx.o snd-soc-spdif-tx.o +obj-$(CONFIG_SND_SOC_SSM2518) += snd-soc-ssm2518.o +obj-$(CONFIG_SND_SOC_SSM2602) += snd-soc-ssm2602.o +obj-$(CONFIG_SND_SOC_SSM2602_SPI) += snd-soc-ssm2602-spi.o +obj-$(CONFIG_SND_SOC_SSM2602_I2C) += snd-soc-ssm2602-i2c.o +obj-$(CONFIG_SND_SOC_SSM4567) += snd-soc-ssm4567.o +obj-$(CONFIG_SND_SOC_STA32X) += snd-soc-sta32x.o +obj-$(CONFIG_SND_SOC_STA350) += snd-soc-sta350.o +obj-$(CONFIG_SND_SOC_STA529) += snd-soc-sta529.o +obj-$(CONFIG_SND_SOC_STAC9766) += snd-soc-stac9766.o +obj-$(CONFIG_SND_SOC_STI_SAS) += snd-soc-sti-sas.o +obj-$(CONFIG_SND_SOC_TAS2552) += snd-soc-tas2552.o +obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o +obj-$(CONFIG_SND_SOC_TAS571X) += snd-soc-tas571x.o +obj-$(CONFIG_SND_SOC_TFA9879) += snd-soc-tfa9879.o +obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o +obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o +obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) += snd-soc-tlv320aic23-spi.o +obj-$(CONFIG_SND_SOC_TLV320AIC26) += snd-soc-tlv320aic26.o +obj-$(CONFIG_SND_SOC_TLV320AIC31XX) += snd-soc-tlv320aic31xx.o +obj-$(CONFIG_SND_SOC_TLV320AIC32X4) += snd-soc-tlv320aic32x4.o +obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o +obj-$(CONFIG_SND_SOC_TLV320DAC33) += snd-soc-tlv320dac33.o +obj-$(CONFIG_SND_SOC_TS3A227E) += snd-soc-ts3a227e.o +obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o +obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o +obj-$(CONFIG_SND_SOC_UDA134X) += snd-soc-uda134x.o +obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o +obj-$(CONFIG_SND_SOC_WL1273) += snd-soc-wl1273.o +obj-$(CONFIG_SND_SOC_WM0010) += snd-soc-wm0010.o +obj-$(CONFIG_SND_SOC_WM1250_EV1) += snd-soc-wm1250-ev1.o +obj-$(CONFIG_SND_SOC_WM2000) += snd-soc-wm2000.o +obj-$(CONFIG_SND_SOC_WM2200) += snd-soc-wm2200.o +obj-$(CONFIG_SND_SOC_WM5100) += snd-soc-wm5100.o +obj-$(CONFIG_SND_SOC_WM5102) += snd-soc-wm5102.o +obj-$(CONFIG_SND_SOC_WM5110) += snd-soc-wm5110.o +obj-$(CONFIG_SND_SOC_WM8350) += snd-soc-wm8350.o +obj-$(CONFIG_SND_SOC_WM8400) += snd-soc-wm8400.o +obj-$(CONFIG_SND_SOC_WM8510) += snd-soc-wm8510.o +obj-$(CONFIG_SND_SOC_WM8523) += snd-soc-wm8523.o +obj-$(CONFIG_SND_SOC_WM8580) += snd-soc-wm8580.o +obj-$(CONFIG_SND_SOC_WM8711) += snd-soc-wm8711.o +obj-$(CONFIG_SND_SOC_WM8727) += snd-soc-wm8727.o +obj-$(CONFIG_SND_SOC_WM8728) += snd-soc-wm8728.o +obj-$(CONFIG_SND_SOC_WM8731) += snd-soc-wm8731.o +obj-$(CONFIG_SND_SOC_WM8737) += snd-soc-wm8737.o +obj-$(CONFIG_SND_SOC_WM8741) += snd-soc-wm8741.o +obj-$(CONFIG_SND_SOC_WM8750) += snd-soc-wm8750.o +obj-$(CONFIG_SND_SOC_WM8753) += snd-soc-wm8753.o +obj-$(CONFIG_SND_SOC_WM8770) += snd-soc-wm8770.o +obj-$(CONFIG_SND_SOC_WM8776) += snd-soc-wm8776.o +obj-$(CONFIG_SND_SOC_WM8782) += snd-soc-wm8782.o +obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.o +obj-$(CONFIG_SND_SOC_WM8804_I2C) += snd-soc-wm8804-i2c.o +obj-$(CONFIG_SND_SOC_WM8804_SPI) += snd-soc-wm8804-spi.o +obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o +obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o +obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o +obj-$(CONFIG_SND_SOC_WM8996) += snd-soc-wm8996.o +obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o +obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o +obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o +obj-$(CONFIG_SND_SOC_WM8961) += snd-soc-wm8961.o +obj-$(CONFIG_SND_SOC_WM8962) += snd-soc-wm8962.o +obj-$(CONFIG_SND_SOC_WM8971) += snd-soc-wm8971.o +obj-$(CONFIG_SND_SOC_WM8974) += snd-soc-wm8974.o +obj-$(CONFIG_SND_SOC_WM8978) += snd-soc-wm8978.o +obj-$(CONFIG_SND_SOC_WM8983) += snd-soc-wm8983.o +obj-$(CONFIG_SND_SOC_WM8985) += snd-soc-wm8985.o +obj-$(CONFIG_SND_SOC_WM8988) += snd-soc-wm8988.o +obj-$(CONFIG_SND_SOC_WM8990) += snd-soc-wm8990.o +obj-$(CONFIG_SND_SOC_WM8991) += snd-soc-wm8991.o +obj-$(CONFIG_SND_SOC_WM8993) += snd-soc-wm8993.o +obj-$(CONFIG_SND_SOC_WM8994) += snd-soc-wm8994.o +obj-$(CONFIG_SND_SOC_WM8995) += snd-soc-wm8995.o +obj-$(CONFIG_SND_SOC_WM8997) += snd-soc-wm8997.o +obj-$(CONFIG_SND_SOC_WM8998) += snd-soc-wm8998.o +obj-$(CONFIG_SND_SOC_WM9081) += snd-soc-wm9081.o +obj-$(CONFIG_SND_SOC_WM9090) += snd-soc-wm9090.o +obj-$(CONFIG_SND_SOC_WM9705) += snd-soc-wm9705.o +obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o +obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o +obj-$(CONFIG_SND_SOC_WM_ADSP) += snd-soc-wm-adsp.o +obj-$(CONFIG_SND_SOC_WM_HUBS) += snd-soc-wm-hubs.o + +# Amp +obj-$(CONFIG_SND_SOC_MAX9877) += snd-soc-max9877.o +obj-$(CONFIG_SND_SOC_TPA6130A2) += snd-soc-tpa6130a2.o diff --git a/asoc/codecs/cs35l41/cs35l41-i2c.c b/asoc/codecs/cs35l41/cs35l41-i2c.c new file mode 100755 index 000000000000..e33bc7412feb --- /dev/null +++ b/asoc/codecs/cs35l41/cs35l41-i2c.c @@ -0,0 +1,123 @@ +/* + * cs35l41-i2c.c -- CS35l41 I2C driver + * + * Copyright 2017 Cirrus Logic, Inc. + * + * Author: David Rhodes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wm_adsp.h" +#include "cs35l41.h" +#include + +static struct regmap_config cs35l41_regmap_i2c = { + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, + .reg_format_endian = REGMAP_ENDIAN_BIG, + .val_format_endian = REGMAP_ENDIAN_BIG, + .max_register = CS35L41_LASTREG, + .reg_defaults = cs35l41_reg, + .num_reg_defaults = ARRAY_SIZE(cs35l41_reg), + .volatile_reg = cs35l41_volatile_reg, + .readable_reg = cs35l41_readable_reg, + .precious_reg = cs35l41_precious_reg, + .cache_type = REGCACHE_RBTREE, +}; + +static const struct i2c_device_id cs35l41_id_i2c[] = { + {"cs35l40", 0}, + {"cs35l41", 0}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, cs35l41_id_i2c); + +static int cs35l41_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct cs35l41_private *cs35l41; + struct device *dev = &client->dev; + struct cs35l41_platform_data *pdata = dev_get_platdata(dev); + const struct regmap_config *regmap_config = &cs35l41_regmap_i2c; + int ret; + + + dev_info(dev, "cs35l41 i2c probe start\n"); + + cs35l41 = devm_kzalloc(dev, sizeof(struct cs35l41_private), GFP_KERNEL); + + if (cs35l41 == NULL) + return -ENOMEM; + + cs35l41->dev = dev; + cs35l41->irq = client->irq; + cs35l41->bus_spi = false; + + i2c_set_clientdata(client, cs35l41); + cs35l41->regmap = devm_regmap_init_i2c(client, regmap_config); + if (IS_ERR(cs35l41->regmap)) { + ret = PTR_ERR(cs35l41->regmap); + dev_err(cs35l41->dev, "Failed to allocate register map: %d\n", + ret); + return ret; + } + + return cs35l41_probe(cs35l41, pdata); +} + +static int cs35l41_i2c_remove(struct i2c_client *client) +{ + struct cs35l41_private *cs35l41 = i2c_get_clientdata(client); + + regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, 0xFFFFFFFF); + wm_adsp2_remove(&cs35l41->dsp); + regulator_bulk_disable(cs35l41->num_supplies, cs35l41->supplies); + snd_soc_unregister_codec(cs35l41->dev); + return 0; +} + +static const struct of_device_id cs35l41_of_match[] = { + {.compatible = "cirrus,cs35l40"}, + {.compatible = "cirrus,cs35l41"}, + {}, +}; +MODULE_DEVICE_TABLE(of, cs35l41_of_match); + +static struct i2c_driver cs35l41_i2c_driver = { + .driver = { + .name = "cs35l41", + .of_match_table = cs35l41_of_match, + }, + .id_table = cs35l41_id_i2c, + .probe = cs35l41_i2c_probe, + .remove = cs35l41_i2c_remove, +}; + +module_i2c_driver(cs35l41_i2c_driver); + +MODULE_DESCRIPTION("I2C CS35L41 driver"); +MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, "); +MODULE_LICENSE("GPL"); diff --git a/asoc/codecs/cs35l41/cs35l41-spi.c b/asoc/codecs/cs35l41/cs35l41-spi.c new file mode 100755 index 000000000000..49ee3a8d2058 --- /dev/null +++ b/asoc/codecs/cs35l41/cs35l41-spi.c @@ -0,0 +1,114 @@ +/* + * cs35l41-spi.c -- CS35l41 SPI driver + * + * Copyright 2017 Cirrus Logic, Inc. + * + * Author: David Rhodes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wm_adsp.h" +#include "cs35l41.h" +#include + +static struct regmap_config cs35l41_regmap_spi = { + .reg_bits = 32, + .val_bits = 32, + .pad_bits = 16, + .reg_stride = 4, + .reg_format_endian = REGMAP_ENDIAN_BIG, + .val_format_endian = REGMAP_ENDIAN_BIG, + .max_register = CS35L41_LASTREG, + .reg_defaults = cs35l41_reg, + .num_reg_defaults = ARRAY_SIZE(cs35l41_reg), + .volatile_reg = cs35l41_volatile_reg, + .readable_reg = cs35l41_readable_reg, + .cache_type = REGCACHE_RBTREE, +}; + +static const struct spi_device_id cs35l41_id_spi[] = { + {"cs35l40", 0}, + {"cs35l41", 0}, + {} +}; + +MODULE_DEVICE_TABLE(spi, cs35l41_id_spi); + +static int cs35l41_spi_probe(struct spi_device *spi) +{ + const struct regmap_config *regmap_config = &cs35l41_regmap_spi; + struct cs35l41_platform_data *pdata = + dev_get_platdata(&spi->dev); + struct cs35l41_private *cs35l41; + int ret; + + cs35l41 = devm_kzalloc(&spi->dev, + sizeof(struct cs35l41_private), + GFP_KERNEL); + if (cs35l41 == NULL) + return -ENOMEM; + + spi_set_drvdata(spi, cs35l41); + cs35l41->regmap = devm_regmap_init_spi(spi, regmap_config); + if (IS_ERR(cs35l41->regmap)) { + ret = PTR_ERR(cs35l41->regmap); + dev_err(&spi->dev, "Failed to allocate register map: %d\n", + ret); + return ret; + } + + cs35l41->dev = &spi->dev; + cs35l41->irq = spi->irq; + + return cs35l41_probe(cs35l41, pdata); +} + +static int cs35l41_spi_remove(struct spi_device *spi) +{ + struct cs35l41_private *cs35l41 = spi_get_drvdata(spi); + + regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, 0xFFFFFFFF); + wm_adsp2_remove(&cs35l41->dsp); + regulator_bulk_disable(cs35l41->num_supplies, cs35l41->supplies); + snd_soc_unregister_codec(cs35l41->dev); + return 0; +} + +static const struct of_device_id cs35l41_of_match[] = { + {.compatible = "cirrus,cs35l40"}, + {.compatible = "cirrus,cs35l41"}, + {}, +}; +MODULE_DEVICE_TABLE(of, cs35l41_of_match); + +static struct spi_driver cs35l41_spi_driver = { + .driver = { + .name = "cs35l41", + .of_match_table = cs35l41_of_match, + }, + .id_table = cs35l41_id_spi, + .probe = cs35l41_spi_probe, + .remove = cs35l41_spi_remove, +}; + +module_spi_driver(cs35l41_spi_driver); + +MODULE_DESCRIPTION("SPI CS35L41 driver"); +MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, "); +MODULE_LICENSE("GPL"); diff --git a/asoc/codecs/cs35l41/cs35l41-tables.c b/asoc/codecs/cs35l41/cs35l41-tables.c new file mode 100755 index 000000000000..ec8c1eb1c5f7 --- /dev/null +++ b/asoc/codecs/cs35l41/cs35l41-tables.c @@ -0,0 +1,945 @@ +/* + * cs35l41-tables.c -- CS35L41 ALSA SoC audio driver + * + * Copyright 2018 Cirrus Logic, Inc. + * + * Author: Brian Austin + * David Rhodes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include "cs35l41.h" + +const struct reg_default cs35l41_reg[CS35L41_MAX_CACHE_REG] = { + {CS35L41_TEST_KEY_CTL, 0x00000000}, + {CS35L41_USER_KEY_CTL, 0x00000000}, + {CS35L41_OTP_CTRL0, 0x00006418}, + {CS35L41_OTP_CTRL1, 0x00000000}, + {CS35L41_OTP_CTRL3, 0x00000000}, + {CS35L41_OTP_CTRL4, 0x00000000}, + {CS35L41_OTP_CTRL5, 0x00000030}, + {CS35L41_OTP_CTRL6, 0x00000000}, + {CS35L41_OTP_CTRL7, 0x00000000}, + {CS35L41_OTP_CTRL8, 0x00000000}, + {CS35L41_PWR_CTRL1, 0x00000000}, + {CS35L41_PWR_CTRL3, 0x01000010}, + {CS35L41_CTRL_OVRRIDE, 0x00000002}, + {CS35L41_AMP_OUT_MUTE, 0x00000000}, + {CS35L41_PROTECT_REL_ERR_IGN, 0x00000000}, + {CS35L41_GPIO_PAD_CONTROL, 0x00000000}, + {CS35L41_JTAG_CONTROL, 0x00000000}, + {CS35L41_PLL_CLK_CTRL, 0x00000010}, + {CS35L41_DSP_CLK_CTRL, 0x00000003}, + {CS35L41_GLOBAL_CLK_CTRL, 0x00000003}, + {CS35L41_DATA_FS_SEL, 0x00000000}, + {CS35L41_MDSYNC_EN, 0x00000200}, + {CS35L41_MDSYNC_TX_ID, 0x00000000}, + {CS35L41_MDSYNC_PWR_CTRL, 0x00000002}, + {CS35L41_MDSYNC_DATA_TX, 0x00000000}, + {CS35L41_MDSYNC_TX_STATUS, 0x00000002}, + {CS35L41_MDSYNC_DATA_RX, 0x00000000}, + {CS35L41_MDSYNC_RX_STATUS, 0x00000002}, + {CS35L41_MDSYNC_ERR_STATUS, 0x00000000}, + {CS35L41_MDSYNC_SYNC_PTE2, 0x00000000}, + {CS35L41_MDSYNC_SYNC_PTE3, 0x00000000}, + {CS35L41_MDSYNC_SYNC_MSM_STATUS, 0x00000000}, + {CS35L41_BSTCVRT_VCTRL1, 0x00000000}, + {CS35L41_BSTCVRT_VCTRL2, 0x00000001}, + {CS35L41_BSTCVRT_PEAK_CUR, 0x0000004A}, + {CS35L41_BSTCVRT_SFT_RAMP, 0x00000003}, + {CS35L41_BSTCVRT_COEFF, 0x00002424}, + {CS35L41_BSTCVRT_SLOPE_LBST, 0x00007500}, + {CS35L41_BSTCVRT_SW_FREQ, 0x01008000}, + {CS35L41_BSTCVRT_DCM_CTRL, 0x00002001}, + {CS35L41_BSTCVRT_DCM_MODE_FORCE, 0x00000000}, + {CS35L41_BSTCVRT_OVERVOLT_CTRL, 0x00000130}, + {CS35L41_VI_VOL_POL, 0x08000800}, + {CS35L41_DTEMP_WARN_THLD, 0x00000002}, + {CS35L41_DTEMP_EN, 0x00000000}, + {CS35L41_VPVBST_FS_SEL, 0x00000001}, + {CS35L41_SP_ENABLES, 0x00000000}, + {CS35L41_SP_RATE_CTRL, 0x00000028}, + {CS35L41_SP_FORMAT, 0x10100200}, + {CS35L41_SP_HIZ_CTRL, 0x00000002}, + {CS35L41_SP_FRAME_TX_SLOT, 0x03020100}, + {CS35L41_SP_FRAME_RX_SLOT, 0x00000100}, + {CS35L41_SP_TX_WL, 0x00000010}, + {CS35L41_SP_RX_WL, 0x00000018}, + {CS35L41_DAC_PCM1_SRC, 0x00000008}, + {CS35L41_ASP_TX1_SRC, 0x00000018}, + {CS35L41_ASP_TX2_SRC, 0x00000019}, + {CS35L41_ASP_TX3_SRC, 0x00000020}, + {CS35L41_ASP_TX4_SRC, 0x00000021}, + {CS35L41_DSP1_RX1_SRC, 0x00000008}, + {CS35L41_DSP1_RX2_SRC, 0x00000009}, + {CS35L41_DSP1_RX3_SRC, 0x00000018}, + {CS35L41_DSP1_RX4_SRC, 0x00000019}, + {CS35L41_DSP1_RX5_SRC, 0x00000020}, + {CS35L41_DSP1_RX6_SRC, 0x00000021}, + {CS35L41_DSP1_RX7_SRC, 0x0000003A}, + {CS35L41_DSP1_RX8_SRC, 0x00000001}, + {CS35L41_NGATE1_SRC, 0x00000008}, + {CS35L41_NGATE2_SRC, 0x00000009}, + {CS35L41_AMP_DIG_VOL_CTRL, 0x00008000}, + {CS35L41_VPBR_CFG, 0x02AA1905}, + {CS35L41_VBBR_CFG, 0x02AA1905}, + {CS35L41_VPBR_STATUS, 0x00000000}, + {CS35L41_VBBR_STATUS, 0x00000000}, + {CS35L41_OVERTEMP_CFG, 0x00000001}, + {CS35L41_AMP_ERR_VOL, 0x00000000}, + {CS35L41_VOL_STATUS_TO_DSP, 0x00000000}, + {CS35L41_CLASSH_CFG, 0x000B0405}, + {CS35L41_WKFET_CFG, 0x00000111}, + {CS35L41_NG_CFG, 0x00000033}, + {CS35L41_AMP_GAIN_CTRL, 0x00000273}, + {CS35L41_DAC_MSM_CFG, 0x00580000}, + {CS35L41_GPIO1_CTRL1, 0xE1000001}, + {CS35L41_GPIO2_CTRL1, 0xE1000001}, + {CS35L41_MIXER_NGATE_CFG, 0x00000000}, + {CS35L41_MIXER_NGATE_CH1_CFG, 0x00000303}, + {CS35L41_MIXER_NGATE_CH2_CFG, 0x00000303}, + {CS35L41_CLOCK_DETECT_1, 0x00000000}, + {CS35L41_TIMER1_CONTROL, 0x00000000}, + {CS35L41_TIMER1_COUNT_PRESET, 0x00000000}, + {CS35L41_TIMER1_START_STOP, 0x00000000}, + {CS35L41_TIMER1_STATUS, 0x00000000}, + {CS35L41_TIMER1_COUNT_READBACK, 0x00000000}, + {CS35L41_TIMER1_DSP_CLK_CFG, 0x00000000}, + {CS35L41_TIMER1_DSP_CLK_STATUS, 0x00000000}, + {CS35L41_TIMER2_CONTROL, 0x00000000}, + {CS35L41_TIMER2_COUNT_PRESET, 0x00000000}, + {CS35L41_TIMER2_START_STOP, 0x00000000}, + {CS35L41_TIMER2_STATUS, 0x00000000}, + {CS35L41_TIMER2_COUNT_READBACK, 0x00000000}, + {CS35L41_TIMER2_DSP_CLK_CFG, 0x00000000}, + {CS35L41_TIMER2_DSP_CLK_STATUS, 0x00000000}, + {CS35L41_DFT_JTAG_CONTROL, 0x00000000}, + {CS35L41_DIE_STS1, 0x00000000}, + {CS35L41_DIE_STS2, 0x00000000}, + {CS35L41_TEMP_CAL1, 0x00000000}, + {CS35L41_TEMP_CAL2, 0x00000000}, +}; + +bool cs35l41_readable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case CS35L41_DEVID: + case CS35L41_REVID: + case CS35L41_FABID: + case CS35L41_RELID: + case CS35L41_OTPID: + case CS35L41_TEST_KEY_CTL: + case CS35L41_USER_KEY_CTL: + case CS35L41_OTP_CTRL0: + case CS35L41_OTP_CTRL3: + case CS35L41_OTP_CTRL4: + case CS35L41_OTP_CTRL5: + case CS35L41_OTP_CTRL6: + case CS35L41_OTP_CTRL7: + case CS35L41_OTP_CTRL8: + case CS35L41_PWR_CTRL1: + case CS35L41_PWR_CTRL2: + case CS35L41_PWR_CTRL3: + case CS35L41_CTRL_OVRRIDE: + case CS35L41_AMP_OUT_MUTE: + case CS35L41_PROTECT_REL_ERR_IGN: + case CS35L41_GPIO_PAD_CONTROL: + case CS35L41_JTAG_CONTROL: + case CS35L41_PLL_CLK_CTRL: + case CS35L41_DSP_CLK_CTRL: + case CS35L41_GLOBAL_CLK_CTRL: + case CS35L41_DATA_FS_SEL: + case CS35L41_MDSYNC_EN: + case CS35L41_MDSYNC_TX_ID: + case CS35L41_MDSYNC_PWR_CTRL: + case CS35L41_MDSYNC_DATA_TX: + case CS35L41_MDSYNC_TX_STATUS: + case CS35L41_MDSYNC_DATA_RX: + case CS35L41_MDSYNC_RX_STATUS: + case CS35L41_MDSYNC_ERR_STATUS: + case CS35L41_MDSYNC_SYNC_PTE2: + case CS35L41_MDSYNC_SYNC_PTE3: + case CS35L41_MDSYNC_SYNC_MSM_STATUS: + case CS35L41_BSTCVRT_VCTRL1: + case CS35L41_BSTCVRT_VCTRL2: + case CS35L41_BSTCVRT_PEAK_CUR: + case CS35L41_BSTCVRT_SFT_RAMP: + case CS35L41_BSTCVRT_COEFF: + case CS35L41_BSTCVRT_SLOPE_LBST: + case CS35L41_BSTCVRT_SW_FREQ: + case CS35L41_BSTCVRT_DCM_CTRL: + case CS35L41_BSTCVRT_DCM_MODE_FORCE: + case CS35L41_BSTCVRT_OVERVOLT_CTRL: + case CS35L41_VI_VOL_POL: + case CS35L41_DTEMP_WARN_THLD: + case CS35L41_DTEMP_CFG: + case CS35L41_DTEMP_EN: + case CS35L41_VPVBST_FS_SEL: + case CS35L41_SP_ENABLES: + case CS35L41_SP_RATE_CTRL: + case CS35L41_SP_FORMAT: + case CS35L41_SP_HIZ_CTRL: + case CS35L41_SP_FRAME_TX_SLOT: + case CS35L41_SP_FRAME_RX_SLOT: + case CS35L41_SP_TX_WL: + case CS35L41_SP_RX_WL: + case CS35L41_DAC_PCM1_SRC: + case CS35L41_ASP_TX1_SRC: + case CS35L41_ASP_TX2_SRC: + case CS35L41_ASP_TX3_SRC: + case CS35L41_ASP_TX4_SRC: + case CS35L41_DSP1_RX1_SRC: + case CS35L41_DSP1_RX2_SRC: + case CS35L41_DSP1_RX3_SRC: + case CS35L41_DSP1_RX4_SRC: + case CS35L41_DSP1_RX5_SRC: + case CS35L41_DSP1_RX6_SRC: + case CS35L41_DSP1_RX7_SRC: + case CS35L41_DSP1_RX8_SRC: + case CS35L41_NGATE1_SRC: + case CS35L41_NGATE2_SRC: + case CS35L41_AMP_DIG_VOL_CTRL: + case CS35L41_VPBR_CFG: + case CS35L41_VBBR_CFG: + case CS35L41_VPBR_STATUS: + case CS35L41_VBBR_STATUS: + case CS35L41_OVERTEMP_CFG: + case CS35L41_AMP_ERR_VOL: + case CS35L41_VOL_STATUS_TO_DSP: + case CS35L41_CLASSH_CFG: + case CS35L41_WKFET_CFG: + case CS35L41_NG_CFG: + case CS35L41_AMP_GAIN_CTRL: + case CS35L41_DAC_MSM_CFG: + case CS35L41_IRQ1_CFG: + case CS35L41_IRQ1_STATUS: + case CS35L41_IRQ1_STATUS1: + case CS35L41_IRQ1_STATUS2: + case CS35L41_IRQ1_STATUS3: + case CS35L41_IRQ1_STATUS4: + case CS35L41_IRQ1_RAW_STATUS1: + case CS35L41_IRQ1_RAW_STATUS2: + case CS35L41_IRQ1_RAW_STATUS3: + case CS35L41_IRQ1_RAW_STATUS4: + case CS35L41_IRQ1_MASK1: + case CS35L41_IRQ1_MASK2: + case CS35L41_IRQ1_MASK3: + case CS35L41_IRQ1_MASK4: + case CS35L41_IRQ1_FRC1: + case CS35L41_IRQ1_FRC2: + case CS35L41_IRQ1_FRC3: + case CS35L41_IRQ1_FRC4: + case CS35L41_IRQ1_EDGE1: + case CS35L41_IRQ1_EDGE4: + case CS35L41_IRQ1_POL1: + case CS35L41_IRQ1_POL2: + case CS35L41_IRQ1_POL3: + case CS35L41_IRQ1_POL4: + case CS35L41_IRQ1_DB3: + case CS35L41_IRQ2_CFG: + case CS35L41_IRQ2_STATUS: + case CS35L41_IRQ2_STATUS1: + case CS35L41_IRQ2_STATUS2: + case CS35L41_IRQ2_STATUS3: + case CS35L41_IRQ2_STATUS4: + case CS35L41_IRQ2_RAW_STATUS1: + case CS35L41_IRQ2_RAW_STATUS2: + case CS35L41_IRQ2_RAW_STATUS3: + case CS35L41_IRQ2_RAW_STATUS4: + case CS35L41_IRQ2_MASK1: + case CS35L41_IRQ2_MASK2: + case CS35L41_IRQ2_MASK3: + case CS35L41_IRQ2_MASK4: + case CS35L41_IRQ2_FRC1: + case CS35L41_IRQ2_FRC2: + case CS35L41_IRQ2_FRC3: + case CS35L41_IRQ2_FRC4: + case CS35L41_IRQ2_EDGE1: + case CS35L41_IRQ2_EDGE4: + case CS35L41_IRQ2_POL1: + case CS35L41_IRQ2_POL2: + case CS35L41_IRQ2_POL3: + case CS35L41_IRQ2_POL4: + case CS35L41_IRQ2_DB3: + case CS35L41_GPIO_STATUS1: + case CS35L41_GPIO1_CTRL1: + case CS35L41_GPIO2_CTRL1: + case CS35L41_MIXER_NGATE_CFG: + case CS35L41_MIXER_NGATE_CH1_CFG: + case CS35L41_MIXER_NGATE_CH2_CFG: + case CS35L41_DSP_MBOX_1 ... CS35L41_DSP_VIRT2_MBOX_8: + case CS35L41_CLOCK_DETECT_1: + case CS35L41_TIMER1_CONTROL: + case CS35L41_TIMER1_COUNT_PRESET: + case CS35L41_TIMER1_STATUS: + case CS35L41_TIMER1_COUNT_READBACK: + case CS35L41_TIMER1_DSP_CLK_CFG: + case CS35L41_TIMER1_DSP_CLK_STATUS: + case CS35L41_TIMER2_CONTROL: + case CS35L41_TIMER2_COUNT_PRESET: + case CS35L41_TIMER2_STATUS: + case CS35L41_TIMER2_COUNT_READBACK: + case CS35L41_TIMER2_DSP_CLK_CFG: + case CS35L41_TIMER2_DSP_CLK_STATUS: + case CS35L41_DFT_JTAG_CONTROL: + case CS35L41_DIE_STS1: + case CS35L41_DIE_STS2: + case CS35L41_TEMP_CAL1: + case CS35L41_TEMP_CAL2: + case CS35L41_DSP1_TIMESTAMP_COUNT: + case CS35L41_DSP1_SYS_ID: + case CS35L41_DSP1_SYS_VERSION: + case CS35L41_DSP1_SYS_CORE_ID: + case CS35L41_DSP1_SYS_AHB_ADDR: + case CS35L41_DSP1_SYS_XSRAM_SIZE: + case CS35L41_DSP1_SYS_YSRAM_SIZE: + case CS35L41_DSP1_SYS_PSRAM_SIZE: + case CS35L41_DSP1_SYS_PM_BOOT_SIZE: + case CS35L41_DSP1_SYS_FEATURES: + case CS35L41_DSP1_SYS_FIR_FILTERS: + case CS35L41_DSP1_SYS_LMS_FILTERS: + case CS35L41_DSP1_SYS_XM_BANK_SIZE: + case CS35L41_DSP1_SYS_YM_BANK_SIZE: + case CS35L41_DSP1_SYS_PM_BANK_SIZE: + case CS35L41_DSP1_AHBM_WIN0_CTRL0: + case CS35L41_DSP1_AHBM_WIN0_CTRL1: + case CS35L41_DSP1_AHBM_WIN1_CTRL0: + case CS35L41_DSP1_AHBM_WIN1_CTRL1: + case CS35L41_DSP1_AHBM_WIN2_CTRL0: + case CS35L41_DSP1_AHBM_WIN2_CTRL1: + case CS35L41_DSP1_AHBM_WIN3_CTRL0: + case CS35L41_DSP1_AHBM_WIN3_CTRL1: + case CS35L41_DSP1_AHBM_WIN4_CTRL0: + case CS35L41_DSP1_AHBM_WIN4_CTRL1: + case CS35L41_DSP1_AHBM_WIN5_CTRL0: + case CS35L41_DSP1_AHBM_WIN5_CTRL1: + case CS35L41_DSP1_AHBM_WIN6_CTRL0: + case CS35L41_DSP1_AHBM_WIN6_CTRL1: + case CS35L41_DSP1_AHBM_WIN7_CTRL0: + case CS35L41_DSP1_AHBM_WIN7_CTRL1: + case CS35L41_DSP1_AHBM_WIN_DBG_CTRL0: + case CS35L41_DSP1_AHBM_WIN_DBG_CTRL1: + case CS35L41_DSP1_DEBUG: + case CS35L41_DSP1_TIMER_CTRL: + case CS35L41_DSP1_RX1_RATE: + case CS35L41_DSP1_RX2_RATE: + case CS35L41_DSP1_RX3_RATE: + case CS35L41_DSP1_RX4_RATE: + case CS35L41_DSP1_RX5_RATE: + case CS35L41_DSP1_RX6_RATE: + case CS35L41_DSP1_RX7_RATE: + case CS35L41_DSP1_RX8_RATE: + case CS35L41_DSP1_TX1_RATE: + case CS35L41_DSP1_TX2_RATE: + case CS35L41_DSP1_TX3_RATE: + case CS35L41_DSP1_TX4_RATE: + case CS35L41_DSP1_TX5_RATE: + case CS35L41_DSP1_TX6_RATE: + case CS35L41_DSP1_TX7_RATE: + case CS35L41_DSP1_TX8_RATE: + case CS35L41_DSP1_NMI_CTRL1: + case CS35L41_DSP1_NMI_CTRL2: + case CS35L41_DSP1_NMI_CTRL3: + case CS35L41_DSP1_NMI_CTRL4: + case CS35L41_DSP1_NMI_CTRL5: + case CS35L41_DSP1_NMI_CTRL6: + case CS35L41_DSP1_NMI_CTRL7: + case CS35L41_DSP1_NMI_CTRL8: + case CS35L41_DSP1_RESUME_CTRL: + case CS35L41_DSP1_IRQ1_CTRL: + case CS35L41_DSP1_IRQ2_CTRL: + case CS35L41_DSP1_IRQ3_CTRL: + case CS35L41_DSP1_IRQ4_CTRL: + case CS35L41_DSP1_IRQ5_CTRL: + case CS35L41_DSP1_IRQ6_CTRL: + case CS35L41_DSP1_IRQ7_CTRL: + case CS35L41_DSP1_IRQ8_CTRL: + case CS35L41_DSP1_IRQ9_CTRL: + case CS35L41_DSP1_IRQ10_CTRL: + case CS35L41_DSP1_IRQ11_CTRL: + case CS35L41_DSP1_IRQ12_CTRL: + case CS35L41_DSP1_IRQ13_CTRL: + case CS35L41_DSP1_IRQ14_CTRL: + case CS35L41_DSP1_IRQ15_CTRL: + case CS35L41_DSP1_IRQ16_CTRL: + case CS35L41_DSP1_IRQ17_CTRL: + case CS35L41_DSP1_IRQ18_CTRL: + case CS35L41_DSP1_IRQ19_CTRL: + case CS35L41_DSP1_IRQ20_CTRL: + case CS35L41_DSP1_IRQ21_CTRL: + case CS35L41_DSP1_IRQ22_CTRL: + case CS35L41_DSP1_IRQ23_CTRL: + case CS35L41_DSP1_SCRATCH1: + case CS35L41_DSP1_SCRATCH2: + case CS35L41_DSP1_SCRATCH3: + case CS35L41_DSP1_SCRATCH4: + case CS35L41_DSP1_CCM_CORE_CTRL: + case CS35L41_DSP1_CCM_CLK_OVERRIDE: + case CS35L41_DSP1_XM_MSTR_EN: + case CS35L41_DSP1_XM_CORE_PRI: + case CS35L41_DSP1_XM_AHB_PACK_PL_PRI: + case CS35L41_DSP1_XM_AHB_UP_PL_PRI: + case CS35L41_DSP1_XM_ACCEL_PL0_PRI: + case CS35L41_DSP1_XM_NPL0_PRI: + case CS35L41_DSP1_YM_MSTR_EN: + case CS35L41_DSP1_YM_CORE_PRI: + case CS35L41_DSP1_YM_AHB_PACK_PL_PRI: + case CS35L41_DSP1_YM_AHB_UP_PL_PRI: + case CS35L41_DSP1_YM_ACCEL_PL0_PRI: + case CS35L41_DSP1_YM_NPL0_PRI: + case CS35L41_DSP1_PM_MSTR_EN: + case CS35L41_DSP1_PM_PATCH0_ADDR: + case CS35L41_DSP1_PM_PATCH0_EN: + case CS35L41_DSP1_PM_PATCH0_DATA_LO: + case CS35L41_DSP1_PM_PATCH0_DATA_HI: + case CS35L41_DSP1_PM_PATCH1_ADDR: + case CS35L41_DSP1_PM_PATCH1_EN: + case CS35L41_DSP1_PM_PATCH1_DATA_LO: + case CS35L41_DSP1_PM_PATCH1_DATA_HI: + case CS35L41_DSP1_PM_PATCH2_ADDR: + case CS35L41_DSP1_PM_PATCH2_EN: + case CS35L41_DSP1_PM_PATCH2_DATA_LO: + case CS35L41_DSP1_PM_PATCH2_DATA_HI: + case CS35L41_DSP1_PM_PATCH3_ADDR: + case CS35L41_DSP1_PM_PATCH3_EN: + case CS35L41_DSP1_PM_PATCH3_DATA_LO: + case CS35L41_DSP1_PM_PATCH3_DATA_HI: + case CS35L41_DSP1_PM_PATCH4_ADDR: + case CS35L41_DSP1_PM_PATCH4_EN: + case CS35L41_DSP1_PM_PATCH4_DATA_LO: + case CS35L41_DSP1_PM_PATCH4_DATA_HI: + case CS35L41_DSP1_PM_PATCH5_ADDR: + case CS35L41_DSP1_PM_PATCH5_EN: + case CS35L41_DSP1_PM_PATCH5_DATA_LO: + case CS35L41_DSP1_PM_PATCH5_DATA_HI: + case CS35L41_DSP1_PM_PATCH6_ADDR: + case CS35L41_DSP1_PM_PATCH6_EN: + case CS35L41_DSP1_PM_PATCH6_DATA_LO: + case CS35L41_DSP1_PM_PATCH6_DATA_HI: + case CS35L41_DSP1_PM_PATCH7_ADDR: + case CS35L41_DSP1_PM_PATCH7_EN: + case CS35L41_DSP1_PM_PATCH7_DATA_LO: + case CS35L41_DSP1_PM_PATCH7_DATA_HI: + case CS35L41_DSP1_MPU_XM_ACCESS0: + case CS35L41_DSP1_MPU_YM_ACCESS0: + case CS35L41_DSP1_MPU_WNDW_ACCESS0: + case CS35L41_DSP1_MPU_XREG_ACCESS0: + case CS35L41_DSP1_MPU_YREG_ACCESS0: + case CS35L41_DSP1_MPU_XM_ACCESS1: + case CS35L41_DSP1_MPU_YM_ACCESS1: + case CS35L41_DSP1_MPU_WNDW_ACCESS1: + case CS35L41_DSP1_MPU_XREG_ACCESS1: + case CS35L41_DSP1_MPU_YREG_ACCESS1: + case CS35L41_DSP1_MPU_XM_ACCESS2: + case CS35L41_DSP1_MPU_YM_ACCESS2: + case CS35L41_DSP1_MPU_WNDW_ACCESS2: + case CS35L41_DSP1_MPU_XREG_ACCESS2: + case CS35L41_DSP1_MPU_YREG_ACCESS2: + case CS35L41_DSP1_MPU_XM_ACCESS3: + case CS35L41_DSP1_MPU_YM_ACCESS3: + case CS35L41_DSP1_MPU_WNDW_ACCESS3: + case CS35L41_DSP1_MPU_XREG_ACCESS3: + case CS35L41_DSP1_MPU_YREG_ACCESS3: + case CS35L41_DSP1_MPU_XM_VIO_ADDR: + case CS35L41_DSP1_MPU_XM_VIO_STATUS: + case CS35L41_DSP1_MPU_YM_VIO_ADDR: + case CS35L41_DSP1_MPU_YM_VIO_STATUS: + case CS35L41_DSP1_MPU_PM_VIO_ADDR: + case CS35L41_DSP1_MPU_PM_VIO_STATUS: + case CS35L41_DSP1_MPU_LOCK_CONFIG: + case CS35L41_DSP1_MPU_WDT_RST_CTRL: + case CS35L41_DSP1_STRMARB_MSTR0_CFG0: + case CS35L41_DSP1_STRMARB_MSTR0_CFG1: + case CS35L41_DSP1_STRMARB_MSTR0_CFG2: + case CS35L41_DSP1_STRMARB_MSTR1_CFG0: + case CS35L41_DSP1_STRMARB_MSTR1_CFG1: + case CS35L41_DSP1_STRMARB_MSTR1_CFG2: + case CS35L41_DSP1_STRMARB_MSTR2_CFG0: + case CS35L41_DSP1_STRMARB_MSTR2_CFG1: + case CS35L41_DSP1_STRMARB_MSTR2_CFG2: + case CS35L41_DSP1_STRMARB_MSTR3_CFG0: + case CS35L41_DSP1_STRMARB_MSTR3_CFG1: + case CS35L41_DSP1_STRMARB_MSTR3_CFG2: + case CS35L41_DSP1_STRMARB_MSTR4_CFG0: + case CS35L41_DSP1_STRMARB_MSTR4_CFG1: + case CS35L41_DSP1_STRMARB_MSTR4_CFG2: + case CS35L41_DSP1_STRMARB_MSTR5_CFG0: + case CS35L41_DSP1_STRMARB_MSTR5_CFG1: + case CS35L41_DSP1_STRMARB_MSTR5_CFG2: + case CS35L41_DSP1_STRMARB_MSTR6_CFG0: + case CS35L41_DSP1_STRMARB_MSTR6_CFG1: + case CS35L41_DSP1_STRMARB_MSTR6_CFG2: + case CS35L41_DSP1_STRMARB_MSTR7_CFG0: + case CS35L41_DSP1_STRMARB_MSTR7_CFG1: + case CS35L41_DSP1_STRMARB_MSTR7_CFG2: + case CS35L41_DSP1_STRMARB_TX0_CFG0: + case CS35L41_DSP1_STRMARB_TX0_CFG1: + case CS35L41_DSP1_STRMARB_TX1_CFG0: + case CS35L41_DSP1_STRMARB_TX1_CFG1: + case CS35L41_DSP1_STRMARB_TX2_CFG0: + case CS35L41_DSP1_STRMARB_TX2_CFG1: + case CS35L41_DSP1_STRMARB_TX3_CFG0: + case CS35L41_DSP1_STRMARB_TX3_CFG1: + case CS35L41_DSP1_STRMARB_TX4_CFG0: + case CS35L41_DSP1_STRMARB_TX4_CFG1: + case CS35L41_DSP1_STRMARB_TX5_CFG0: + case CS35L41_DSP1_STRMARB_TX5_CFG1: + case CS35L41_DSP1_STRMARB_TX6_CFG0: + case CS35L41_DSP1_STRMARB_TX6_CFG1: + case CS35L41_DSP1_STRMARB_TX7_CFG0: + case CS35L41_DSP1_STRMARB_TX7_CFG1: + case CS35L41_DSP1_STRMARB_RX0_CFG0: + case CS35L41_DSP1_STRMARB_RX0_CFG1: + case CS35L41_DSP1_STRMARB_RX1_CFG0: + case CS35L41_DSP1_STRMARB_RX1_CFG1: + case CS35L41_DSP1_STRMARB_RX2_CFG0: + case CS35L41_DSP1_STRMARB_RX2_CFG1: + case CS35L41_DSP1_STRMARB_RX3_CFG0: + case CS35L41_DSP1_STRMARB_RX3_CFG1: + case CS35L41_DSP1_STRMARB_RX4_CFG0: + case CS35L41_DSP1_STRMARB_RX4_CFG1: + case CS35L41_DSP1_STRMARB_RX5_CFG0: + case CS35L41_DSP1_STRMARB_RX5_CFG1: + case CS35L41_DSP1_STRMARB_RX6_CFG0: + case CS35L41_DSP1_STRMARB_RX6_CFG1: + case CS35L41_DSP1_STRMARB_RX7_CFG0: + case CS35L41_DSP1_STRMARB_RX7_CFG1: + case CS35L41_DSP1_STRMARB_IRQ0_CFG0: + case CS35L41_DSP1_STRMARB_IRQ0_CFG1: + case CS35L41_DSP1_STRMARB_IRQ0_CFG2: + case CS35L41_DSP1_STRMARB_IRQ1_CFG0: + case CS35L41_DSP1_STRMARB_IRQ1_CFG1: + case CS35L41_DSP1_STRMARB_IRQ1_CFG2: + case CS35L41_DSP1_STRMARB_IRQ2_CFG0: + case CS35L41_DSP1_STRMARB_IRQ2_CFG1: + case CS35L41_DSP1_STRMARB_IRQ2_CFG2: + case CS35L41_DSP1_STRMARB_IRQ3_CFG0: + case CS35L41_DSP1_STRMARB_IRQ3_CFG1: + case CS35L41_DSP1_STRMARB_IRQ3_CFG2: + case CS35L41_DSP1_STRMARB_IRQ4_CFG0: + case CS35L41_DSP1_STRMARB_IRQ4_CFG1: + case CS35L41_DSP1_STRMARB_IRQ4_CFG2: + case CS35L41_DSP1_STRMARB_IRQ5_CFG0: + case CS35L41_DSP1_STRMARB_IRQ5_CFG1: + case CS35L41_DSP1_STRMARB_IRQ5_CFG2: + case CS35L41_DSP1_STRMARB_IRQ6_CFG0: + case CS35L41_DSP1_STRMARB_IRQ6_CFG1: + case CS35L41_DSP1_STRMARB_IRQ6_CFG2: + case CS35L41_DSP1_STRMARB_IRQ7_CFG0: + case CS35L41_DSP1_STRMARB_IRQ7_CFG1: + case CS35L41_DSP1_STRMARB_IRQ7_CFG2: + case CS35L41_DSP1_STRMARB_RESYNC_MSK: + case CS35L41_DSP1_STRMARB_ERR_STATUS: + case CS35L41_DSP1_INTPCTL_RES_STATIC: + case CS35L41_DSP1_INTPCTL_RES_DYN: + case CS35L41_DSP1_INTPCTL_NMI_CTRL: + case CS35L41_DSP1_INTPCTL_IRQ_INV: + case CS35L41_DSP1_INTPCTL_IRQ_MODE: + case CS35L41_DSP1_INTPCTL_IRQ_EN: + case CS35L41_DSP1_INTPCTL_IRQ_MSK: + case CS35L41_DSP1_INTPCTL_IRQ_ERR: + case CS35L41_DSP1_INTPCTL_IRQ_PEND: + case CS35L41_DSP1_INTPCTL_TESTBITS: + case CS35L41_DSP1_WDT_CONTROL: + case CS35L41_DSP1_WDT_STATUS: + case CS35L41_OTP_TRIM_1: + case CS35L41_OTP_TRIM_2: + case CS35L41_OTP_TRIM_3: + case CS35L41_OTP_TRIM_4: + case CS35L41_OTP_TRIM_5: + case CS35L41_OTP_TRIM_6: + case CS35L41_OTP_TRIM_7: + case CS35L41_OTP_TRIM_8: + case CS35L41_OTP_TRIM_9: + case CS35L41_OTP_TRIM_10: + case CS35L41_OTP_TRIM_11: + case CS35L41_OTP_TRIM_12: + case CS35L41_OTP_TRIM_13: + case CS35L41_OTP_TRIM_14: + case CS35L41_OTP_TRIM_15: + case CS35L41_OTP_TRIM_16: + case CS35L41_OTP_TRIM_17: + case CS35L41_OTP_TRIM_18: + case CS35L41_OTP_TRIM_19: + case CS35L41_OTP_TRIM_20: + case CS35L41_OTP_TRIM_21: + case CS35L41_OTP_TRIM_22: + case CS35L41_OTP_TRIM_23: + case CS35L41_OTP_TRIM_24: + case CS35L41_OTP_TRIM_25: + case CS35L41_OTP_TRIM_26: + case CS35L41_OTP_TRIM_27: + case CS35L41_OTP_TRIM_28: + case CS35L41_OTP_TRIM_29: + case CS35L41_OTP_TRIM_30: + case CS35L41_OTP_TRIM_31: + case CS35L41_OTP_TRIM_32: + case CS35L41_OTP_TRIM_33: + case CS35L41_OTP_TRIM_34: + case CS35L41_OTP_TRIM_35: + case CS35L41_OTP_TRIM_36: + case CS35L41_OTP_MEM0 ... CS35L41_OTP_MEM31: + case CS35L41_DSP1_XMEM_PACK_0 ... CS35L41_DSP1_XMEM_PACK_3068: + case CS35L41_DSP1_XMEM_UNPACK32_0 ... CS35L41_DSP1_XMEM_UNPACK32_2046: + case CS35L41_DSP1_XMEM_UNPACK24_0 ... CS35L41_DSP1_XMEM_UNPACK24_4093: + case CS35L41_DSP1_YMEM_PACK_0 ... CS35L41_DSP1_YMEM_PACK_1532: + case CS35L41_DSP1_YMEM_UNPACK32_0 ... CS35L41_DSP1_YMEM_UNPACK32_1022: + case CS35L41_DSP1_YMEM_UNPACK24_0 ... CS35L41_DSP1_YMEM_UNPACK24_2045: + case CS35L41_DSP1_PMEM_0 ... CS35L41_DSP1_PMEM_5114: + /*test regs*/ + case CS35L41_PLL_OVR: + case CS35L41_BST_TEST_DUTY: + case CS35L41_DIGPWM_IOCTRL: + return true; + default: + return false; + } +} + +bool cs35l41_precious_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case CS35L41_OTP_MEM0 ... CS35L41_OTP_MEM31: + return true; + default: + return false; + } +} + +bool cs35l41_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case CS35L41_DEVID: + case CS35L41_SFT_RESET: + case CS35L41_FABID: + case CS35L41_REVID: + case CS35L41_DTEMP_EN: + case CS35L41_IRQ1_STATUS: + case CS35L41_IRQ1_STATUS1: + case CS35L41_IRQ1_STATUS2: + case CS35L41_IRQ1_STATUS3: + case CS35L41_IRQ1_STATUS4: + case CS35L41_IRQ1_RAW_STATUS1: + case CS35L41_IRQ1_RAW_STATUS2: + case CS35L41_IRQ1_RAW_STATUS3: + case CS35L41_IRQ1_RAW_STATUS4: + case CS35L41_IRQ1_FRC1: + case CS35L41_IRQ1_FRC2: + case CS35L41_IRQ1_FRC3: + case CS35L41_IRQ1_FRC4: + case CS35L41_IRQ1_EDGE1: + case CS35L41_IRQ1_EDGE4: + case CS35L41_IRQ1_POL1: + case CS35L41_IRQ1_POL2: + case CS35L41_IRQ1_POL3: + case CS35L41_IRQ1_POL4: + case CS35L41_IRQ1_DB3: + case CS35L41_IRQ2_STATUS: + case CS35L41_IRQ2_STATUS1: + case CS35L41_IRQ2_STATUS2: + case CS35L41_IRQ2_STATUS3: + case CS35L41_IRQ2_STATUS4: + case CS35L41_IRQ2_RAW_STATUS1: + case CS35L41_IRQ2_RAW_STATUS2: + case CS35L41_IRQ2_RAW_STATUS3: + case CS35L41_IRQ2_RAW_STATUS4: + case CS35L41_IRQ2_FRC1: + case CS35L41_IRQ2_FRC2: + case CS35L41_IRQ2_FRC3: + case CS35L41_IRQ2_FRC4: + case CS35L41_IRQ2_EDGE1: + case CS35L41_IRQ2_EDGE4: + case CS35L41_IRQ2_POL1: + case CS35L41_IRQ2_POL2: + case CS35L41_IRQ2_POL3: + case CS35L41_IRQ2_POL4: + case CS35L41_IRQ2_DB3: + case CS35L41_GPIO_STATUS1: + case CS35L41_OTP_TRIM_1: + case CS35L41_OTP_TRIM_2: + case CS35L41_OTP_TRIM_3: + case CS35L41_OTP_TRIM_4: + case CS35L41_OTP_TRIM_5: + case CS35L41_OTP_TRIM_6: + case CS35L41_OTP_TRIM_7: + case CS35L41_OTP_TRIM_8: + case CS35L41_OTP_TRIM_9: + case CS35L41_OTP_TRIM_10: + case CS35L41_OTP_TRIM_11: + case CS35L41_OTP_TRIM_12: + case CS35L41_OTP_TRIM_13: + case CS35L41_OTP_TRIM_14: + case CS35L41_OTP_TRIM_15: + case CS35L41_OTP_TRIM_16: + case CS35L41_OTP_TRIM_17: + case CS35L41_OTP_TRIM_18: + case CS35L41_OTP_TRIM_19: + case CS35L41_OTP_TRIM_20: + case CS35L41_OTP_TRIM_21: + case CS35L41_OTP_TRIM_22: + case CS35L41_OTP_TRIM_23: + case CS35L41_OTP_TRIM_24: + case CS35L41_OTP_TRIM_25: + case CS35L41_OTP_TRIM_26: + case CS35L41_OTP_TRIM_27: + case CS35L41_OTP_TRIM_28: + case CS35L41_OTP_TRIM_29: + case CS35L41_OTP_TRIM_30: + case CS35L41_OTP_TRIM_31: + case CS35L41_OTP_TRIM_32: + case CS35L41_OTP_TRIM_33: + case CS35L41_OTP_TRIM_34: + case CS35L41_OTP_TRIM_35: + case CS35L41_OTP_TRIM_36: + case CS35L41_DSP_MBOX_1 ... CS35L41_DSP_VIRT2_MBOX_8: + case CS35L41_DSP1_XMEM_PACK_0 ... CS35L41_DSP1_XMEM_PACK_3068: + case CS35L41_DSP1_XMEM_UNPACK32_0 ... CS35L41_DSP1_XMEM_UNPACK32_2046: + case CS35L41_DSP1_XMEM_UNPACK24_0 ... CS35L41_DSP1_XMEM_UNPACK24_4093: + case CS35L41_DSP1_YMEM_PACK_0 ... CS35L41_DSP1_YMEM_PACK_1532: + case CS35L41_DSP1_YMEM_UNPACK32_0 ... CS35L41_DSP1_YMEM_UNPACK32_1022: + case CS35L41_DSP1_YMEM_UNPACK24_0 ... CS35L41_DSP1_YMEM_UNPACK24_2045: + case CS35L41_DSP1_PMEM_0 ... CS35L41_DSP1_PMEM_5114: + case CS35L41_DSP1_CCM_CORE_CTRL ... CS35L41_DSP1_WDT_STATUS: + case CS35L41_OTP_MEM0 ... CS35L41_OTP_MEM31: + return true; + default: + return false; + } +} + +static const struct cs35l41_otp_packed_element_t + otp_map_1[CS35L41_NUM_OTP_ELEM] = { + /* addr shift size */ + {0x00002030, 0, 4}, /*TRIM_OSC_FREQ_TRIM*/ + {0x00002030, 7, 1}, /*TRIM_OSC_TRIM_DONE*/ + {0x0000208c, 24, 6}, /*TST_DIGREG_VREF_TRIM*/ + {0x00002090, 14, 4}, /*TST_REF_TRIM*/ + {0x00002090, 10, 4}, /*TST_REF_TEMPCO_TRIM*/ + {0x0000300C, 11, 4}, /*PLL_LDOA_TST_VREF_TRIM*/ + {0x0000394C, 23, 2}, /*BST_ATEST_CM_VOFF*/ + {0x00003950, 0, 7}, /*BST_ATRIM_IADC_OFFSET*/ + {0x00003950, 8, 7}, /*BST_ATRIM_IADC_GAIN1*/ + {0x00003950, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET1*/ + {0x00003950, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN1*/ + {0x00003954, 0, 7}, /*BST_ATRIM_IADC_OFFSET2*/ + {0x00003954, 8, 7}, /*BST_ATRIM_IADC_GAIN2*/ + {0x00003954, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET2*/ + {0x00003954, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN2*/ + {0x00003958, 0, 7}, /*BST_ATRIM_IADC_OFFSET3*/ + {0x00003958, 8, 7}, /*BST_ATRIM_IADC_GAIN3*/ + {0x00003958, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET3*/ + {0x00003958, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN3*/ + {0x0000395C, 0, 7}, /*BST_ATRIM_IADC_OFFSET4*/ + {0x0000395C, 8, 7}, /*BST_ATRIM_IADC_GAIN4*/ + {0x0000395C, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET4*/ + {0x0000395C, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN4*/ + {0x0000416C, 0, 8}, /*VMON_GAIN_OTP_VAL*/ + {0x00004160, 0, 7}, /*VMON_OFFSET_OTP_VAL*/ + {0x0000416C, 8, 8}, /*IMON_GAIN_OTP_VAL*/ + {0x00004160, 16, 10}, /*IMON_OFFSET_OTP_VAL*/ + {0x0000416C, 16, 12}, /*VMON_CM_GAIN_OTP_VAL*/ + {0x0000416C, 28, 1}, /*VMON_CM_GAIN_SIGN_OTP_VAL*/ + {0x00004170, 0, 6}, /*IMON_CAL_TEMPCO_OTP_VAL*/ + {0x00004170, 6, 1}, /*IMON_CAL_TEMPCO_SIGN_OTP*/ + {0x00004170, 8, 6}, /*IMON_CAL_TEMPCO2_OTP_VAL*/ + {0x00004170, 14, 1}, /*IMON_CAL_TEMPCO2_DN_UPB_OTP_VAL*/ + {0x00004170, 16, 9}, /*IMON_CAL_TEMPCO_TBASE_OTP_VAL*/ + {0x00004360, 0, 5}, /*TEMP_GAIN_OTP_VAL*/ + {0x00004360, 6, 9}, /*TEMP_OFFSET_OTP_VAL*/ + {0x00004448, 0, 8}, /*VP_SARADC_OFFSET*/ + {0x00004448, 8, 8}, /*VP_GAIN_INDEX*/ + {0x00004448, 16, 8}, /*VBST_SARADC_OFFSET*/ + {0x00004448, 24, 8}, /*VBST_GAIN_INDEX*/ + {0x0000444C, 0, 3}, /*ANA_SELINVREF*/ + {0x00006E30, 0, 5}, /*GAIN_ERR_COEFF_0*/ + {0x00006E30, 8, 5}, /*GAIN_ERR_COEFF_1*/ + {0x00006E30, 16, 5}, /*GAIN_ERR_COEFF_2*/ + {0x00006E30, 24, 5}, /*GAIN_ERR_COEFF_3*/ + {0x00006E34, 0, 5}, /*GAIN_ERR_COEFF_4*/ + {0x00006E34, 8, 5}, /*GAIN_ERR_COEFF_5*/ + {0x00006E34, 16, 5}, /*GAIN_ERR_COEFF_6*/ + {0x00006E34, 24, 5}, /*GAIN_ERR_COEFF_7*/ + {0x00006E38, 0, 5}, /*GAIN_ERR_COEFF_8*/ + {0x00006E38, 8, 5}, /*GAIN_ERR_COEFF_9*/ + {0x00006E38, 16, 5}, /*GAIN_ERR_COEFF_10*/ + {0x00006E38, 24, 5}, /*GAIN_ERR_COEFF_11*/ + {0x00006E3C, 0, 5}, /*GAIN_ERR_COEFF_12*/ + {0x00006E3C, 8, 5}, /*GAIN_ERR_COEFF_13*/ + {0x00006E3C, 16, 5}, /*GAIN_ERR_COEFF_14*/ + {0x00006E3C, 24, 5}, /*GAIN_ERR_COEFF_15*/ + {0x00006E40, 0, 5}, /*GAIN_ERR_COEFF_16*/ + {0x00006E40, 8, 5}, /*GAIN_ERR_COEFF_17*/ + {0x00006E40, 16, 5}, /*GAIN_ERR_COEFF_18*/ + {0x00006E40, 24, 5}, /*GAIN_ERR_COEFF_19*/ + {0x00006E44, 0, 5}, /*GAIN_ERR_COEFF_20*/ + {0x00006E48, 0, 10}, /*VOFF_GAIN_0*/ + {0x00006E48, 10, 10}, /*VOFF_GAIN_1*/ + {0x00006E48, 20, 10}, /*VOFF_GAIN_2*/ + {0x00006E4C, 0, 10}, /*VOFF_GAIN_3*/ + {0x00006E4C, 10, 10}, /*VOFF_GAIN_4*/ + {0x00006E4C, 20, 10}, /*VOFF_GAIN_5*/ + {0x00006E50, 0, 10}, /*VOFF_GAIN_6*/ + {0x00006E50, 10, 10}, /*VOFF_GAIN_7*/ + {0x00006E50, 20, 10}, /*VOFF_GAIN_8*/ + {0x00006E54, 0, 10}, /*VOFF_GAIN_9*/ + {0x00006E54, 10, 10}, /*VOFF_GAIN_10*/ + {0x00006E54, 20, 10}, /*VOFF_GAIN_11*/ + {0x00006E58, 0, 10}, /*VOFF_GAIN_12*/ + {0x00006E58, 10, 10}, /*VOFF_GAIN_13*/ + {0x00006E58, 20, 10}, /*VOFF_GAIN_14*/ + {0x00006E5C, 0, 10}, /*VOFF_GAIN_15*/ + {0x00006E5C, 10, 10}, /*VOFF_GAIN_16*/ + {0x00006E5C, 20, 10}, /*VOFF_GAIN_17*/ + {0x00006E60, 0, 10}, /*VOFF_GAIN_18*/ + {0x00006E60, 10, 10}, /*VOFF_GAIN_19*/ + {0x00006E60, 20, 10}, /*VOFF_GAIN_20*/ + {0x00006E64, 0, 10}, /*VOFF_INT1*/ + {0x00007418, 7, 5}, /*DS_SPK_INT1_CAP_TRIM*/ + {0x0000741C, 0, 5}, /*DS_SPK_INT2_CAP_TRIM*/ + {0x0000741C, 11, 4}, /*DS_SPK_LPF_CAP_TRIM*/ + {0x0000741C, 19, 4}, /*DS_SPK_QUAN_CAP_TRIM*/ + {0x00007434, 17, 1}, /*FORCE_CAL*/ + {0x00007434, 18, 7}, /*CAL_OVERRIDE*/ + {0x00007068, 0, 9}, /*MODIX*/ + {0x0000410C, 7, 1}, /*VIMON_DLY_NOT_COMB*/ + {0x0000400C, 0, 7}, /*VIMON_DLY*/ + {0x00000000, 0, 1}, /*extra bit*/ + {0x00017040, 0, 8}, /*X_COORDINATE*/ + {0x00017040, 8, 8}, /*Y_COORDINATE*/ + {0x00017040, 16, 8}, /*WAFER_ID*/ + {0x00017040, 24, 8}, /*DVS*/ + {0x00017044, 0, 24}, /*LOT_NUMBER*/ +}; + +static const struct cs35l41_otp_packed_element_t + otp_map_2[CS35L41_NUM_OTP_ELEM] = { + /* addr shift size */ + {0x00002030, 0, 4}, /*TRIM_OSC_FREQ_TRIM*/ + {0x00002030, 7, 1}, /*TRIM_OSC_TRIM_DONE*/ + {0x0000208c, 24, 6}, /*TST_DIGREG_VREF_TRIM*/ + {0x00002090, 14, 4}, /*TST_REF_TRIM*/ + {0x00002090, 10, 4}, /*TST_REF_TEMPCO_TRIM*/ + {0x0000300C, 11, 4}, /*PLL_LDOA_TST_VREF_TRIM*/ + {0x0000394C, 23, 2}, /*BST_ATEST_CM_VOFF*/ + {0x00003950, 0, 7}, /*BST_ATRIM_IADC_OFFSET*/ + {0x00003950, 8, 7}, /*BST_ATRIM_IADC_GAIN1*/ + {0x00003950, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET1*/ + {0x00003950, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN1*/ + {0x00003954, 0, 7}, /*BST_ATRIM_IADC_OFFSET2*/ + {0x00003954, 8, 7}, /*BST_ATRIM_IADC_GAIN2*/ + {0x00003954, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET2*/ + {0x00003954, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN2*/ + {0x00003958, 0, 7}, /*BST_ATRIM_IADC_OFFSET3*/ + {0x00003958, 8, 7}, /*BST_ATRIM_IADC_GAIN3*/ + {0x00003958, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET3*/ + {0x00003958, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN3*/ + {0x0000395C, 0, 7}, /*BST_ATRIM_IADC_OFFSET4*/ + {0x0000395C, 8, 7}, /*BST_ATRIM_IADC_GAIN4*/ + {0x0000395C, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET4*/ + {0x0000395C, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN4*/ + {0x0000416C, 0, 8}, /*VMON_GAIN_OTP_VAL*/ + {0x00004160, 0, 7}, /*VMON_OFFSET_OTP_VAL*/ + {0x0000416C, 8, 8}, /*IMON_GAIN_OTP_VAL*/ + {0x00004160, 16, 10}, /*IMON_OFFSET_OTP_VAL*/ + {0x0000416C, 16, 12}, /*VMON_CM_GAIN_OTP_VAL*/ + {0x0000416C, 28, 1}, /*VMON_CM_GAIN_SIGN_OTP_VAL*/ + {0x00004170, 0, 6}, /*IMON_CAL_TEMPCO_OTP_VAL*/ + {0x00004170, 6, 1}, /*IMON_CAL_TEMPCO_SIGN_OTP*/ + {0x00004170, 8, 6}, /*IMON_CAL_TEMPCO2_OTP_VAL*/ + {0x00004170, 14, 1}, /*IMON_CAL_TEMPCO2_DN_UPB_OTP_VAL*/ + {0x00004170, 16, 9}, /*IMON_CAL_TEMPCO_TBASE_OTP_VAL*/ + {0x00004360, 0, 5}, /*TEMP_GAIN_OTP_VAL*/ + {0x00004360, 6, 9}, /*TEMP_OFFSET_OTP_VAL*/ + {0x00004448, 0, 8}, /*VP_SARADC_OFFSET*/ + {0x00004448, 8, 8}, /*VP_GAIN_INDEX*/ + {0x00004448, 16, 8}, /*VBST_SARADC_OFFSET*/ + {0x00004448, 24, 8}, /*VBST_GAIN_INDEX*/ + {0x0000444C, 0, 3}, /*ANA_SELINVREF*/ + {0x00006E30, 0, 5}, /*GAIN_ERR_COEFF_0*/ + {0x00006E30, 8, 5}, /*GAIN_ERR_COEFF_1*/ + {0x00006E30, 16, 5}, /*GAIN_ERR_COEFF_2*/ + {0x00006E30, 24, 5}, /*GAIN_ERR_COEFF_3*/ + {0x00006E34, 0, 5}, /*GAIN_ERR_COEFF_4*/ + {0x00006E34, 8, 5}, /*GAIN_ERR_COEFF_5*/ + {0x00006E34, 16, 5}, /*GAIN_ERR_COEFF_6*/ + {0x00006E34, 24, 5}, /*GAIN_ERR_COEFF_7*/ + {0x00006E38, 0, 5}, /*GAIN_ERR_COEFF_8*/ + {0x00006E38, 8, 5}, /*GAIN_ERR_COEFF_9*/ + {0x00006E38, 16, 5}, /*GAIN_ERR_COEFF_10*/ + {0x00006E38, 24, 5}, /*GAIN_ERR_COEFF_11*/ + {0x00006E3C, 0, 5}, /*GAIN_ERR_COEFF_12*/ + {0x00006E3C, 8, 5}, /*GAIN_ERR_COEFF_13*/ + {0x00006E3C, 16, 5}, /*GAIN_ERR_COEFF_14*/ + {0x00006E3C, 24, 5}, /*GAIN_ERR_COEFF_15*/ + {0x00006E40, 0, 5}, /*GAIN_ERR_COEFF_16*/ + {0x00006E40, 8, 5}, /*GAIN_ERR_COEFF_17*/ + {0x00006E40, 16, 5}, /*GAIN_ERR_COEFF_18*/ + {0x00006E40, 24, 5}, /*GAIN_ERR_COEFF_19*/ + {0x00006E44, 0, 5}, /*GAIN_ERR_COEFF_20*/ + {0x00006E48, 0, 10}, /*VOFF_GAIN_0*/ + {0x00006E48, 10, 10}, /*VOFF_GAIN_1*/ + {0x00006E48, 20, 10}, /*VOFF_GAIN_2*/ + {0x00006E4C, 0, 10}, /*VOFF_GAIN_3*/ + {0x00006E4C, 10, 10}, /*VOFF_GAIN_4*/ + {0x00006E4C, 20, 10}, /*VOFF_GAIN_5*/ + {0x00006E50, 0, 10}, /*VOFF_GAIN_6*/ + {0x00006E50, 10, 10}, /*VOFF_GAIN_7*/ + {0x00006E50, 20, 10}, /*VOFF_GAIN_8*/ + {0x00006E54, 0, 10}, /*VOFF_GAIN_9*/ + {0x00006E54, 10, 10}, /*VOFF_GAIN_10*/ + {0x00006E54, 20, 10}, /*VOFF_GAIN_11*/ + {0x00006E58, 0, 10}, /*VOFF_GAIN_12*/ + {0x00006E58, 10, 10}, /*VOFF_GAIN_13*/ + {0x00006E58, 20, 10}, /*VOFF_GAIN_14*/ + {0x00006E5C, 0, 10}, /*VOFF_GAIN_15*/ + {0x00006E5C, 10, 10}, /*VOFF_GAIN_16*/ + {0x00006E5C, 20, 10}, /*VOFF_GAIN_17*/ + {0x00006E60, 0, 10}, /*VOFF_GAIN_18*/ + {0x00006E60, 10, 10}, /*VOFF_GAIN_19*/ + {0x00006E60, 20, 10}, /*VOFF_GAIN_20*/ + {0x00006E64, 0, 10}, /*VOFF_INT1*/ + {0x00007418, 7, 5}, /*DS_SPK_INT1_CAP_TRIM*/ + {0x0000741C, 0, 5}, /*DS_SPK_INT2_CAP_TRIM*/ + {0x0000741C, 11, 4}, /*DS_SPK_LPF_CAP_TRIM*/ + {0x0000741C, 19, 4}, /*DS_SPK_QUAN_CAP_TRIM*/ + {0x00007434, 17, 1}, /*FORCE_CAL*/ + {0x00007434, 18, 7}, /*CAL_OVERRIDE*/ + {0x00007068, 0, 9}, /*MODIX*/ + {0x0000410C, 7, 1}, /*VIMON_DLY_NOT_COMB*/ + {0x0000400C, 0, 7}, /*VIMON_DLY*/ + {0x00004000, 11, 1}, /*VMON_POL*/ + {0x00017040, 0, 8}, /*X_COORDINATE*/ + {0x00017040, 8, 8}, /*Y_COORDINATE*/ + {0x00017040, 16, 8}, /*WAFER_ID*/ + {0x00017040, 24, 8}, /*DVS*/ + {0x00017044, 0, 24}, /*LOT_NUMBER*/ +}; + +const struct cs35l41_otp_map_element_t + cs35l41_otp_map_map[CS35L41_NUM_OTP_MAPS] = { + { + .id = 0x01, + .map = otp_map_1, + .num_elements = CS35L41_NUM_OTP_ELEM, + .bit_offset = 16, + .word_offset = 2, + }, + { + .id = 0x02, + .map = otp_map_2, + .num_elements = CS35L41_NUM_OTP_ELEM, + .bit_offset = 16, + .word_offset = 2, + }, + { + .id = 0x06, + .map = otp_map_2, + .num_elements = CS35L41_NUM_OTP_ELEM, + .bit_offset = 16, + .word_offset = 2, + }, +}; diff --git a/asoc/codecs/cs35l41/cs35l41.c b/asoc/codecs/cs35l41/cs35l41.c new file mode 100755 index 000000000000..edaddf38335d --- /dev/null +++ b/asoc/codecs/cs35l41/cs35l41.c @@ -0,0 +1,2081 @@ +/* + * cs35l41.c -- CS35l41 ALSA SoC audio driver + * + * Copyright 2018 Cirrus Logic, Inc. + * + * Author: David Rhodes + * Brian Austin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#define DEBUG 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wm_adsp.h" +#include "cs35l41.h" +#include + +static const char * const cs35l41_supplies[] = { + "VA", + "VP", +}; + +struct cs35l41_pll_sysclk_config { + int freq; + int clk_cfg; +}; + +static const struct cs35l41_pll_sysclk_config cs35l41_pll_sysclk[] = { + { 32768, 0x00 }, + { 8000, 0x01 }, + { 11025, 0x02 }, + { 12000, 0x03 }, + { 16000, 0x04 }, + { 22050, 0x05 }, + { 24000, 0x06 }, + { 32000, 0x07 }, + { 44100, 0x08 }, + { 48000, 0x09 }, + { 88200, 0x0A }, + { 96000, 0x0B }, + { 128000, 0x0C }, + { 176400, 0x0D }, + { 192000, 0x0E }, + { 256000, 0x0F }, + { 352800, 0x10 }, + { 384000, 0x11 }, + { 512000, 0x12 }, + { 705600, 0x13 }, + { 750000, 0x14 }, + { 768000, 0x15 }, + { 1000000, 0x16 }, + { 1024000, 0x17 }, + { 1200000, 0x18 }, + { 1411200, 0x19 }, + { 1500000, 0x1A }, + { 1536000, 0x1B }, + { 2000000, 0x1C }, + { 2048000, 0x1D }, + { 2400000, 0x1E }, + { 2822400, 0x1F }, + { 3000000, 0x20 }, + { 3072000, 0x21 }, + { 3200000, 0x22 }, + { 4000000, 0x23 }, + { 4096000, 0x24 }, + { 4800000, 0x25 }, + { 5644800, 0x26 }, + { 6000000, 0x27 }, + { 6144000, 0x28 }, + { 6250000, 0x29 }, + { 6400000, 0x2A }, + { 6500000, 0x2B }, + { 6750000, 0x2C }, + { 7526400, 0x2D }, + { 8000000, 0x2E }, + { 8192000, 0x2F }, + { 9600000, 0x30 }, + { 11289600, 0x31 }, + { 12000000, 0x32 }, + { 12288000, 0x33 }, + { 12500000, 0x34 }, + { 12800000, 0x35 }, + { 13000000, 0x36 }, + { 13500000, 0x37 }, + { 19200000, 0x38 }, + { 22579200, 0x39 }, + { 24000000, 0x3A }, + { 24576000, 0x3B }, + { 25000000, 0x3C }, + { 25600000, 0x3D }, + { 26000000, 0x3E }, + { 27000000, 0x3F }, +}; + +static const unsigned char cs35l41_bst_k1_table[4][5] = { + {0x24, 0x32, 0x32, 0x4F, 0x57}, + {0x24, 0x32, 0x32, 0x4F, 0x57}, + {0x40, 0x32, 0x32, 0x4F, 0x57}, + {0x40, 0x32, 0x32, 0x4F, 0x57} +}; + +static const unsigned char cs35l41_bst_k2_table[4][5] = { + {0x24, 0x49, 0x66, 0xA3, 0xEA}, + {0x24, 0x49, 0x66, 0xA3, 0xEA}, + {0x48, 0x49, 0x66, 0xA3, 0xEA}, + {0x48, 0x49, 0x66, 0xA3, 0xEA} +}; + +static const unsigned char cs35l41_bst_slope_table[4] = { + 0x75, 0x6B, 0x3B, 0x28}; + +static int cs35l41_codec_set_sysclk(struct snd_soc_codec *codec, + int clk_id, int source, unsigned int freq, + int dir); + +static int cs35l41_dsp_power_ev(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + if (cs35l41->halo_booted == false) + wm_halo_early_event(w, kcontrol, event); + else + cs35l41->dsp.booted = true; + + return 0; + case SND_SOC_DAPM_PRE_PMD: + if (cs35l41->halo_booted == false) { + wm_halo_early_event(w, kcontrol, event); + wm_halo_event(w, kcontrol, event); + } + default: + return 0; + } +} + +static int cs35l41_dsp_load_ev(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + if (cs35l41->halo_booted == false) { + wm_halo_event(w, kcontrol, event); + cs35l41->halo_booted = true; + } + default: + return 0; + } +} + +static int cs35l41_halo_booted_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = cs35l41->halo_booted; + + return 0; +} + +static int cs35l41_halo_booted_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + cs35l41->halo_booted = ucontrol->value.integer.value[0]; + + return 0; +} + +static int vendor_id_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = VENDOR_ID_NONE; + + if (cs35l41->pdata.spk_id_gpio_p) + ucontrol->value.integer.value[0] = spk_id_get(cs35l41->pdata.spk_id_gpio_p); + + return 0; +} + +static const DECLARE_TLV_DB_RANGE(dig_vol_tlv, + 0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1), + 1, 913, TLV_DB_SCALE_ITEM(-10200, 25, 0)); +static DECLARE_TLV_DB_SCALE(amp_gain_tlv, 0, 1, 1); + +static const struct snd_kcontrol_new dre_ctrl = + SOC_DAPM_SINGLE("Switch", CS35L41_PWR_CTRL3, 20, 1, 0); + +static const char * const cs35l41_pcm_sftramp_text[] = { + "Off", ".5ms", "1ms", "2ms", "4ms", "8ms", "15ms", "30ms"}; + +static SOC_ENUM_SINGLE_DECL(pcm_sft_ramp, + CS35L41_AMP_DIG_VOL_CTRL, 0, + cs35l41_pcm_sftramp_text); + +static const char * const cs35l41_cspl_cmd_text[] = { + "CSPL_MBOX_CMD_RESUME", + "CSPL_MBOX_CMD_REINIT", + "CSPL_MBOX_CMD_STOP_PRE_REINIT", +}; + +static const unsigned int cs35l41_cspl_cmd_val[] = { + (unsigned int)CSPL_MBOX_CMD_RESUME, + (unsigned int)CSPL_MBOX_CMD_REINIT, + (unsigned int)CSPL_MBOX_CMD_STOP_PRE_REINIT, +}; + +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_cspl_cmd, SND_SOC_NOPM, 0, 0, + cs35l41_cspl_cmd_text, cs35l41_cspl_cmd_val); + +static bool cs35l41_is_csplmboxsts_correct(enum cs35l41_cspl_mboxcmd cmd, + enum cs35l41_cspl_mboxstate sts) +{ + switch (cmd) { + case CSPL_MBOX_CMD_NONE: + case CSPL_MBOX_CMD_UNKNOWN_CMD: + return true; + case CSPL_MBOX_CMD_PAUSE: + return (sts == CSPL_MBOX_STS_PAUSED); + case CSPL_MBOX_CMD_RESUME: + return (sts == CSPL_MBOX_STS_RUNNING); + case CSPL_MBOX_CMD_REINIT: + return (sts == CSPL_MBOX_STS_RUNNING); + case CSPL_MBOX_CMD_STOP_PRE_REINIT: + return (sts == CSPL_MBOX_STS_RDY_FOR_REINIT); + default: + return false; + } +} + +static int cs35l41_set_csplmboxcmd(struct cs35l41_private *cs35l41, + enum cs35l41_cspl_mboxcmd cmd) +{ + int ret; + unsigned int sts; + + /* Reset DSP sticky bit */ + regmap_write(cs35l41->regmap, CS35L41_IRQ2_STATUS2, + 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT); + + /* Reset AP sticky bit */ + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS2, + 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT); + + /* + * Set mailbox cmd + */ + reinit_completion(&cs35l41->mbox_cmd); + /* Unmask DSP INT */ + regmap_update_bits(cs35l41->regmap, CS35L41_IRQ2_MASK2, + 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT, 0); + /* Unmask AP INT */ + regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK2, + 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT, 0); + regmap_write(cs35l41->regmap, CS35L41_CSPL_MBOX_CMD_DRV, cmd); + ret = wait_for_completion_timeout(&cs35l41->mbox_cmd, + msecs_to_jiffies(CS35L41_MBOXWAIT)); + if (ret == 0) { + dev_err(cs35l41->dev, + "Timout waiting for DSP to set mbox cmd\n"); + ret = -ETIMEDOUT; + } + + /* Mask AP INT */ + regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK2, + 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT, + 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT); + /* Mask DSP INT */ + regmap_update_bits(cs35l41->regmap, CS35L41_IRQ2_MASK2, + 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT, + 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT); + + if (regmap_read(cs35l41->regmap, + CS35L41_CSPL_MBOX_STS, &sts) < 0) { + dev_err(cs35l41->dev, "Failed to read %u\n", + CS35L41_CSPL_MBOX_STS); + ret = -EACCES; + } + + if (!cs35l41_is_csplmboxsts_correct(cmd, + (enum cs35l41_cspl_mboxstate)sts)) { + dev_err(cs35l41->dev, + "Failed to set mailbox(cmd: %u, sts: %u)\n", cmd, sts); + ret = -ENOMSG; + } + + return ret; +} + +static int cs35l41_cspl_cmd_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + struct soc_enum *soc_enum; + unsigned int i = ucontrol->value.enumerated.item[0]; + + soc_enum = (struct soc_enum *)kcontrol->private_value; + + if (i >= soc_enum->items) { + dev_err(codec->dev, "Invalid mixer input (%u)\n", i); + return -EINVAL; + } + + cs35l41->cspl_cmd = soc_enum->values[i]; + + return 0; +} + +static int cs35l41_cspl_cmd_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + struct soc_enum *soc_enum; + unsigned int i; + int ret = 0; + + soc_enum = (struct soc_enum *)kcontrol->private_value; + + for (i = 0; i < soc_enum->items; i++) { + if (cs35l41->cspl_cmd == soc_enum->values[i]) + break; + } + + if (i >= soc_enum->items) { + /* Cannot find value */ + dev_err(cs35l41->dev, "Cannot find cspl cmd\n"); + i = 0; + ret = -EINVAL; + } + + ucontrol->value.enumerated.item[0] = i; + + return ret; +} +static const char *virt_text[] = { "None", "Ref"}; +static SOC_ENUM_SINGLE_DECL(virt_enum, + SND_SOC_NOPM, 2, virt_text); + +static const struct snd_kcontrol_new virt_mux = + SOC_DAPM_ENUM("Virt Connect", virt_enum); + +static const char * const cs35l41_pcm_source_texts[] = {"None", "ASP", "DSP"}; +static const unsigned int cs35l41_pcm_source_values[] = {0x00, 0x08, 0x32}; +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_pcm_source_enum, + CS35L41_DAC_PCM1_SRC, + 0, CS35L41_ASP_SOURCE_MASK, + cs35l41_pcm_source_texts, + cs35l41_pcm_source_values); + +static const struct snd_kcontrol_new pcm_source_mux = + SOC_DAPM_ENUM("PCM Source", cs35l41_pcm_source_enum); + +static const char * const cs35l41_tx_input_texts[] = {"Zero", "ASPRX1", + "ASPRX2", "VMON", + "IMON", "VPMON", + "DSPTX1", "DSPTX2"}; +static const unsigned int cs35l41_tx_input_values[] = {0x00, + CS35L41_INPUT_SRC_ASPRX1, + CS35L41_INPUT_SRC_ASPRX2, + CS35L41_INPUT_SRC_VMON, + CS35L41_INPUT_SRC_IMON, + CS35L41_INPUT_SRC_VPMON, + CS35L41_INPUT_DSP_TX1, + CS35L41_INPUT_DSP_TX2}; + +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx1_enum, + CS35L41_ASP_TX1_SRC, + 0, CS35L41_ASP_SOURCE_MASK, + cs35l41_tx_input_texts, + cs35l41_tx_input_values); + +static const struct snd_kcontrol_new asp_tx1_mux = + SOC_DAPM_ENUM("ASPTX1 SRC", cs35l41_asptx1_enum); + +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx2_enum, + CS35L41_ASP_TX2_SRC, + 0, CS35L41_ASP_SOURCE_MASK, + cs35l41_tx_input_texts, + cs35l41_tx_input_values); + +static const struct snd_kcontrol_new asp_tx2_mux = + SOC_DAPM_ENUM("ASPTX2 SRC", cs35l41_asptx2_enum); + +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx3_enum, + CS35L41_ASP_TX3_SRC, + 0, CS35L41_ASP_SOURCE_MASK, + cs35l41_tx_input_texts, + cs35l41_tx_input_values); + +static const struct snd_kcontrol_new asp_tx3_mux = + SOC_DAPM_ENUM("ASPTX3 SRC", cs35l41_asptx3_enum); + +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx4_enum, + CS35L41_ASP_TX4_SRC, + 0, CS35L41_ASP_SOURCE_MASK, + cs35l41_tx_input_texts, + cs35l41_tx_input_values); + +static const struct snd_kcontrol_new asp_tx4_mux = + SOC_DAPM_ENUM("ASPTX4 SRC", cs35l41_asptx4_enum); + +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_dsprx1_enum, + CS35L41_DSP1_RX1_SRC, + 0, CS35L41_ASP_SOURCE_MASK, + cs35l41_tx_input_texts, + cs35l41_tx_input_values); + +static const struct snd_kcontrol_new dsp_rx1_mux = + SOC_DAPM_ENUM("DSPRX1 SRC", cs35l41_dsprx1_enum); + +static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_dsprx2_enum, + CS35L41_DSP1_RX2_SRC, + 0, CS35L41_ASP_SOURCE_MASK, + cs35l41_tx_input_texts, + cs35l41_tx_input_values); + +static const struct snd_kcontrol_new dsp_rx2_mux = + SOC_DAPM_ENUM("DSPRX2 SRC", cs35l41_dsprx2_enum); + +static const char *const vendor_id_text[] = {"None", "AAC", "SSI", "GOER", "Unknown"}; +static const struct soc_enum vendor_id[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(vendor_id_text), vendor_id_text), +}; + +static const struct snd_kcontrol_new cs35l41_aud_controls[] = { + SOC_SINGLE_SX_TLV("Digital PCM Volume", CS35L41_AMP_DIG_VOL_CTRL, + 3, 0x4CF, 0x391, dig_vol_tlv), + SOC_SINGLE_TLV("AMP PCM Gain", CS35L41_AMP_GAIN_CTRL, 5, 0x14, 0, + amp_gain_tlv), + SOC_SINGLE_RANGE("ASPTX1 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 0, + 0, 7, 0), + SOC_SINGLE_RANGE("ASPTX2 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 8, + 0, 7, 0), + SOC_SINGLE_RANGE("ASPTX3 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 16, + 0, 7, 0), + SOC_SINGLE_RANGE("ASPTX4 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 24, + 0, 7, 0), + SOC_SINGLE_RANGE("ASPRX1 Slot Position", CS35L41_SP_FRAME_RX_SLOT, 0, + 0, 7, 0), + SOC_SINGLE_RANGE("ASPRX2 Slot Position", CS35L41_SP_FRAME_RX_SLOT, 8, + 0, 7, 0), + SOC_ENUM("PCM Soft Ramp", pcm_sft_ramp), + SOC_VALUE_ENUM_EXT("CSPL Command", cs35l41_cspl_cmd, + cs35l41_cspl_cmd_get, cs35l41_cspl_cmd_put), + SOC_SINGLE_EXT("DSP Booted", SND_SOC_NOPM, 0, 1, 0, + cs35l41_halo_booted_get, cs35l41_halo_booted_put), + WM_ADSP2_PRELOAD_SWITCH("DSP1", 1), + SOC_ENUM_EXT("SPK ID", vendor_id, vendor_id_get, NULL), +}; + +static const struct cs35l41_otp_map_element_t *cs35l41_find_otp_map(u32 otp_id) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(cs35l41_otp_map_map); i++) { + if (cs35l41_otp_map_map[i].id == otp_id) + return &cs35l41_otp_map_map[i]; + } + + return NULL; +} + +static int cs35l41_otp_unpack(void *data) +{ + struct cs35l41_private *cs35l41 = data; + u32 otp_mem[32]; + int i; + int bit_offset, word_offset; + unsigned int bit_sum = 8; + u32 otp_val, otp_id_reg; + const struct cs35l41_otp_map_element_t *otp_map_match; + const struct cs35l41_otp_packed_element_t *otp_map; + int ret; + struct spi_device *spi = NULL; + u32 orig_spi_freq = 0; + + ret = regmap_read(cs35l41->regmap, CS35L41_OTPID, &otp_id_reg); + if (ret < 0) { + dev_err(cs35l41->dev, "Read OTP ID failed\n"); + return -EINVAL; + } + + otp_map_match = cs35l41_find_otp_map(otp_id_reg); + + if (otp_map_match == NULL) { + dev_err(cs35l41->dev, "OTP Map matching ID %d not found\n", + otp_id_reg); + return -EINVAL; + } + + if (cs35l41->bus_spi) { + spi = to_spi_device(cs35l41->dev); + orig_spi_freq = spi->max_speed_hz; + spi->max_speed_hz = CS35L41_SPI_MAX_FREQ_OTP; + spi_setup(spi); + } + + #define MAX_BULK_READ_SIZE 4 + for (i = 0; i < CS35L41_OTP_SIZE_WORDS / MAX_BULK_READ_SIZE; i++) { + ret = regmap_bulk_read(cs35l41->regmap, CS35L41_OTP_MEM0 + i * 4 * MAX_BULK_READ_SIZE, + &otp_mem[i * MAX_BULK_READ_SIZE], MAX_BULK_READ_SIZE); + } + + if (ret < 0) { + dev_err(cs35l41->dev, "Read OTP Mem failed\n"); + return -EINVAL; + } + + if (cs35l41->bus_spi) { + spi->max_speed_hz = orig_spi_freq; + spi_setup(spi); + } + + otp_map = otp_map_match->map; + + bit_offset = otp_map_match->bit_offset; + word_offset = otp_map_match->word_offset; + + ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x00000055); + if (ret < 0) { + dev_err(cs35l41->dev, "Write Unlock key failed 1/2\n"); + return -EINVAL; + } + ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x000000AA); + if (ret < 0) { + dev_err(cs35l41->dev, "Write Unlock key failed 2/2\n"); + return -EINVAL; + } + + for (i = 0; i < otp_map_match->num_elements; i++) { + dev_dbg(cs35l41->dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d\n", + bit_offset, word_offset, bit_sum % 32); + if (bit_offset + otp_map[i].size - 1 >= 32) { + otp_val = (otp_mem[word_offset] & + GENMASK(31, bit_offset)) >> + bit_offset; + otp_val |= (otp_mem[++word_offset] & + GENMASK(bit_offset + + otp_map[i].size - 33, 0)) << + (32 - bit_offset); + bit_offset += otp_map[i].size - 32; + } else { + + otp_val = (otp_mem[word_offset] & + GENMASK(bit_offset + otp_map[i].size - 1, + bit_offset)) >> bit_offset; + bit_offset += otp_map[i].size; + } + bit_sum += otp_map[i].size; + + if (bit_offset == 32) { + bit_offset = 0; + word_offset++; + } + + if (otp_map[i].reg != 0) { + ret = regmap_update_bits(cs35l41->regmap, + otp_map[i].reg, + GENMASK(otp_map[i].shift + + otp_map[i].size - 1, + otp_map[i].shift), + otp_val << otp_map[i].shift); + if (ret < 0) { + dev_err(cs35l41->dev, "Write OTP val failed\n"); + return -EINVAL; + } + } + } + + ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x000000CC); + if (ret < 0) { + dev_err(cs35l41->dev, "Write Lock key failed 1/2\n"); + return -EINVAL; + } + ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x00000033); + if (ret < 0) { + dev_err(cs35l41->dev, "Write Lock key failed 2/2\n"); + return -EINVAL; + } + + return 0; +} + +static irqreturn_t cs35l41_irq(int irq, void *data) +{ + struct cs35l41_private *cs35l41 = data; + unsigned int status[4]; + unsigned int masks[4]; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(status); i++) { + regmap_read(cs35l41->regmap, + CS35L41_IRQ1_STATUS1 + (i * CS35L41_REGSTRIDE), + &status[i]); + regmap_read(cs35l41->regmap, + CS35L41_IRQ1_MASK1 + (i * CS35L41_REGSTRIDE), + &masks[i]); + } + + /* Check to see if unmasked bits are active */ + if (!(status[0] & ~masks[0]) && !(status[1] & ~masks[1]) && + !(status[2] & ~masks[2]) && !(status[3] & ~masks[3])) + return IRQ_NONE; + + if (status[1] & (1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT)) { + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS2, + 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT); + complete(&cs35l41->mbox_cmd); + } + + if (status[0] & CS35L41_PUP_DONE_MASK) { + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_PUP_DONE_MASK); + complete(&cs35l41->global_pup_done); + } + + if (status[0] & CS35L41_PDN_DONE_MASK) { + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_PDN_DONE_MASK); + complete(&cs35l41->global_pdn_done); + } + + /* + * The following interrupts require a + * protection release cycle to get the + * speaker out of Safe-Mode. + */ + if (status[0] & CS35L41_AMP_SHORT_ERR) { + dev_crit(cs35l41->dev, "Amp short error\n"); + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_AMP_SHORT_ERR); + regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_AMP_SHORT_ERR_RLS, + CS35L41_AMP_SHORT_ERR_RLS); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_AMP_SHORT_ERR_RLS, 0); + } + + if (status[0] & CS35L41_TEMP_WARN) { + dev_crit(cs35l41->dev, "Over temperature warning\n"); + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_TEMP_WARN); + regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_TEMP_WARN_ERR_RLS, + CS35L41_TEMP_WARN_ERR_RLS); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_TEMP_WARN_ERR_RLS, 0); + } + + if (status[0] & CS35L41_TEMP_ERR) { + dev_crit(cs35l41->dev, "Over temperature error\n"); + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_TEMP_ERR); + regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_TEMP_ERR_RLS, + CS35L41_TEMP_ERR_RLS); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_TEMP_ERR_RLS, 0); + } + + if (status[0] & CS35L41_BST_OVP_ERR) { + dev_crit(cs35l41->dev, "VBST Over Voltage error\n"); + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, + CS35L41_BST_EN_MASK, 0); + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_BST_OVP_ERR); + regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_BST_OVP_ERR_RLS, + CS35L41_BST_OVP_ERR_RLS); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_BST_OVP_ERR_RLS, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, + CS35L41_BST_EN_MASK, + CS35L41_BST_EN_DEFAULT << + CS35L41_BST_EN_SHIFT); + } + + if (status[0] & CS35L41_BST_DCM_UVP_ERR) { + dev_crit(cs35l41->dev, "DCM VBST Under Voltage Error\n"); + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, + CS35L41_BST_EN_MASK, 0); + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_BST_DCM_UVP_ERR); + regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_BST_UVP_ERR_RLS, + CS35L41_BST_UVP_ERR_RLS); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_BST_UVP_ERR_RLS, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, + CS35L41_BST_EN_MASK, + CS35L41_BST_EN_DEFAULT << + CS35L41_BST_EN_SHIFT); + } + + if (status[0] & CS35L41_BST_SHORT_ERR) { + dev_crit(cs35l41->dev, "LBST error: powering off!\n"); + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, + CS35L41_BST_EN_MASK, 0); + regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, + CS35L41_BST_SHORT_ERR); + regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_BST_SHORT_ERR_RLS, + CS35L41_BST_SHORT_ERR_RLS); + regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, + CS35L41_BST_SHORT_ERR_RLS, 0); + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, + CS35L41_BST_EN_MASK, + CS35L41_BST_EN_DEFAULT << + CS35L41_BST_EN_SHIFT); + } + + if (status[3] & CS35L41_OTP_BOOT_DONE) { + regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK4, + CS35L41_OTP_BOOT_DONE, CS35L41_OTP_BOOT_DONE); + } + + return IRQ_HANDLED; +} + +static const struct reg_sequence cs35l41_pup_patch[] = { + {0x00000040, 0x00000055}, + {0x00000040, 0x000000AA}, + {0x00002084, 0x002F1AA0}, + {0x00000040, 0x000000CC}, + {0x00000040, 0x00000033}, +}; + +static const struct reg_sequence cs35l41_pdn_patch[] = { + {0x00000040, 0x00000055}, + {0x00000040, 0x000000AA}, + {0x00002084, 0x002F1AA3}, + {0x00000040, 0x000000CC}, + {0x00000040, 0x00000033}, +}; + +static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + int ret = 0; + + pr_debug("++++>CSPL: %s, event = %d.\n", __func__, event); + switch (event) { + case SND_SOC_DAPM_POST_PMU: + regmap_multi_reg_write_bypassed(cs35l41->regmap, + cs35l41_pup_patch, + ARRAY_SIZE(cs35l41_pup_patch)); + + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL1, + CS35L41_GLOBAL_EN_MASK, + 1 << CS35L41_GLOBAL_EN_SHIFT); + + usleep_range(1000, 1100); + + if (cs35l41->halo_booted) { + if (cs35l41->cspl_cmd == CSPL_MBOX_CMD_STOP_PRE_REINIT) + /* Send this command on power down event */ + ret = cs35l41_set_csplmboxcmd(cs35l41, + CSPL_MBOX_CMD_RESUME); + else + ret = cs35l41_set_csplmboxcmd(cs35l41, + cs35l41->cspl_cmd); + } + break; + case SND_SOC_DAPM_POST_PMD: + if (cs35l41->halo_booted) { + if (cs35l41->cspl_cmd == CSPL_MBOX_CMD_STOP_PRE_REINIT) + ret = cs35l41_set_csplmboxcmd(cs35l41, + cs35l41->cspl_cmd); + else + ret = cs35l41_set_csplmboxcmd(cs35l41, + CSPL_MBOX_CMD_PAUSE); + } + + regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL1, + CS35L41_GLOBAL_EN_MASK, 0); + + usleep_range(1000, 1100); + + regmap_multi_reg_write_bypassed(cs35l41->regmap, + cs35l41_pdn_patch, + ARRAY_SIZE(cs35l41_pdn_patch)); + break; + default: + dev_err(codec->dev, "Invalid event = 0x%x\n", event); + ret = -EINVAL; + } + pr_debug("----CSPL: %s.\n", __func__); + return ret; +} + +static const struct snd_soc_dapm_widget cs35l41_dapm_widgets[] = { + + SND_SOC_DAPM_SPK("DSP1 Preload", NULL), + SND_SOC_DAPM_SUPPLY_S("DSP1 Preloader", 100, + SND_SOC_NOPM, 0, 0, cs35l41_dsp_power_ev, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), + SND_SOC_DAPM_OUT_DRV_E("DSP1", SND_SOC_NOPM, 0, 0, NULL, 0, + cs35l41_dsp_load_ev, SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_OUTPUT("SPK"), + + SND_SOC_DAPM_AIF_IN("ASPRX1", NULL, 0, CS35L41_SP_ENABLES, 16, 0), + SND_SOC_DAPM_AIF_IN("ASPRX2", NULL, 0, CS35L41_SP_ENABLES, 17, 0), + SND_SOC_DAPM_AIF_OUT("ASPTX1", NULL, 0, CS35L41_SP_ENABLES, 0, 0), + SND_SOC_DAPM_AIF_OUT("ASPTX2", NULL, 0, CS35L41_SP_ENABLES, 1, 0), + SND_SOC_DAPM_AIF_OUT("ASPTX3", NULL, 0, CS35L41_SP_ENABLES, 2, 0), + SND_SOC_DAPM_AIF_OUT("ASPTX4", NULL, 0, CS35L41_SP_ENABLES, 3, 0), + + SND_SOC_DAPM_ADC("VMON ADC", NULL, CS35L41_PWR_CTRL2, 12, 0), + SND_SOC_DAPM_ADC("IMON ADC", NULL, CS35L41_PWR_CTRL2, 13, 0), + SND_SOC_DAPM_ADC("VPMON ADC", NULL, CS35L41_PWR_CTRL2, 8, 0), + SND_SOC_DAPM_ADC("VBSTMON ADC", NULL, CS35L41_PWR_CTRL2, 9, 0), + SND_SOC_DAPM_ADC("TEMPMON ADC", NULL, CS35L41_PWR_CTRL2, 10, 0), + SND_SOC_DAPM_ADC("CLASS H", NULL, CS35L41_PWR_CTRL3, 4, 0), + + SND_SOC_DAPM_OUT_DRV_E("Main AMP", CS35L41_PWR_CTRL2, 0, 0, NULL, 0, + cs35l41_main_amp_event, + SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU), + + SND_SOC_DAPM_INPUT("VP"), + SND_SOC_DAPM_INPUT("VBST"), + SND_SOC_DAPM_INPUT("ISENSE"), + SND_SOC_DAPM_INPUT("VSENSE"), + SND_SOC_DAPM_INPUT("TEMP"), + + SND_SOC_DAPM_MUX("ASPTX Ref", SND_SOC_NOPM, 0, 0, &virt_mux), + SND_SOC_DAPM_MUX("ASP TX1 Source", SND_SOC_NOPM, 0, 0, &asp_tx1_mux), + SND_SOC_DAPM_MUX("ASP TX2 Source", SND_SOC_NOPM, 0, 0, &asp_tx2_mux), + SND_SOC_DAPM_MUX("ASP TX3 Source", SND_SOC_NOPM, 0, 0, &asp_tx3_mux), + SND_SOC_DAPM_MUX("ASP TX4 Source", SND_SOC_NOPM, 0, 0, &asp_tx4_mux), + SND_SOC_DAPM_MUX("DSP RX1 Source", SND_SOC_NOPM, 0, 0, &dsp_rx1_mux), + SND_SOC_DAPM_MUX("DSP RX2 Source", SND_SOC_NOPM, 0, 0, &dsp_rx2_mux), + SND_SOC_DAPM_MUX("PCM Source", SND_SOC_NOPM, 0, 0, &pcm_source_mux), + SND_SOC_DAPM_SWITCH("DRE", SND_SOC_NOPM, 0, 0, &dre_ctrl), + +}; + +static const struct snd_soc_dapm_route cs35l41_audio_map[] = { + + { "DSP1", NULL, "DSP1 Preloader" }, + { "DSP1 Preload", NULL, "DSP1 Preloader" }, + + {"DSP RX1 Source", "VMON", "VMON ADC"}, + {"DSP RX1 Source", "IMON", "IMON ADC"}, + {"DSP RX1 Source", "VPMON", "VPMON ADC"}, + {"DSP RX1 Source", "DSPTX1", "DSP1"}, + {"DSP RX1 Source", "DSPTX2", "DSP1"}, + {"DSP RX1 Source", "ASPRX1", "ASPRX1"}, + {"DSP RX1 Source", "ASPRX2", "ASPRX2"}, + {"DSP RX1 Source", "Zero", "ASPRX1"}, + {"DSP1", NULL, "DSP RX1 Source"}, + + {"DSP RX2 Source", "VMON", "VMON ADC"}, + {"DSP RX2 Source", "IMON", "IMON ADC"}, + {"DSP RX2 Source", "VPMON", "VPMON ADC"}, + {"DSP RX2 Source", "DSPTX1", "DSP1"}, + {"DSP RX2 Source", "DSPTX2", "DSP1"}, + {"DSP RX2 Source", "ASPRX1", "ASPRX1"}, + {"DSP RX2 Source", "ASPRX2", "ASPRX2"}, + {"DSP RX2 Source", "Zero", "ASPRX1"}, + {"DSP1", NULL, "DSP RX2 Source"}, + + {"ASP TX1 Source", "VMON", "VMON ADC"}, + {"ASP TX1 Source", "IMON", "IMON ADC"}, + {"ASP TX1 Source", "VPMON", "VPMON ADC"}, + {"ASP TX1 Source", "DSPTX1", "DSP1"}, + {"ASP TX1 Source", "DSPTX2", "DSP1"}, + {"ASP TX1 Source", "ASPRX1", "ASPRX1" }, + {"ASP TX1 Source", "ASPRX2", "ASPRX2" }, + {"ASP TX2 Source", "VMON", "VMON ADC"}, + {"ASP TX2 Source", "IMON", "IMON ADC"}, + {"ASP TX2 Source", "VPMON", "VPMON ADC"}, + {"ASP TX2 Source", "DSPTX1", "DSP1"}, + {"ASP TX2 Source", "DSPTX2", "DSP1"}, + {"ASP TX2 Source", "ASPRX1", "ASPRX1" }, + {"ASP TX2 Source", "ASPRX2", "ASPRX2" }, + {"ASP TX3 Source", "VMON", "VMON ADC"}, + {"ASP TX3 Source", "IMON", "IMON ADC"}, + {"ASP TX3 Source", "VPMON", "VPMON ADC"}, + {"ASP TX3 Source", "DSPTX1", "DSP1"}, + {"ASP TX3 Source", "DSPTX2", "DSP1"}, + {"ASP TX3 Source", "ASPRX1", "ASPRX1" }, + {"ASP TX3 Source", "ASPRX2", "ASPRX2" }, + {"ASP TX4 Source", "VMON", "VMON ADC"}, + {"ASP TX4 Source", "IMON", "IMON ADC"}, + {"ASP TX4 Source", "VPMON", "VPMON ADC"}, + {"ASP TX4 Source", "DSPTX1", "DSP1"}, + {"ASP TX4 Source", "DSPTX2", "DSP1"}, + {"ASP TX4 Source", "ASPRX1", "ASPRX1" }, + {"ASP TX4 Source", "ASPRX2", "ASPRX2" }, + {"ASPTX1", NULL, "ASP TX1 Source"}, + {"ASPTX2", NULL, "ASP TX2 Source"}, + {"ASPTX3", NULL, "ASP TX3 Source"}, + {"ASPTX4", NULL, "ASP TX4 Source"}, + {"AMP Capture", NULL, "ASPTX1"}, + {"AMP Capture", NULL, "ASPTX2"}, + {"AMP Capture", NULL, "ASPTX3"}, + {"AMP Capture", NULL, "ASPTX4"}, + + {"VMON ADC", NULL, "ASPRX1"}, + {"IMON ADC", NULL, "ASPRX1"}, + {"VPMON ADC", NULL, "ASPRX1"}, + {"TEMPMON ADC", NULL, "ASPRX1"}, + {"VBSTMON ADC", NULL, "ASPRX1"}, + + {"DSP1", NULL, "IMON ADC"}, + {"DSP1", NULL, "VMON ADC"}, + {"DSP1", NULL, "VBSTMON ADC"}, + {"DSP1", NULL, "VPMON ADC"}, + {"DSP1", NULL, "TEMPMON ADC"}, + + {"ASPRX1", NULL, "AMP Playback"}, + {"ASPRX2", NULL, "AMP Playback"}, + {"DRE", "Switch", "CLASS H"}, + {"Main AMP", NULL, "CLASS H"}, + {"Main AMP", NULL, "DRE"}, + {"SPK", NULL, "Main AMP"}, + {"Main AMP", NULL, "ASPTX Ref"}, + {"ASPTX Ref", "Ref", "ASPTX1"}, + {"ASPTX Ref", "Ref", "ASPTX2"}, + {"PCM Source", "ASP", "ASPRX1"}, + {"PCM Source", "DSP", "DSP1"}, + {"CLASS H", NULL, "PCM Source"}, + +}; + +static const struct wm_adsp_region cs35l41_dsp1_regions[] = { + { .type = WMFW_HALO_PM_PACKED, .base = CS35L41_DSP1_PMEM_0 }, + { .type = WMFW_HALO_XM_PACKED, .base = CS35L41_DSP1_XMEM_PACK_0 }, + { .type = WMFW_HALO_YM_PACKED, .base = CS35L41_DSP1_YMEM_PACK_0 }, + {. type = WMFW_ADSP2_XM, .base = CS35L41_DSP1_XMEM_UNPACK24_0}, + {. type = WMFW_ADSP2_YM, .base = CS35L41_DSP1_YMEM_UNPACK24_0}, +}; + +static int cs35l41_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) +{ + struct cs35l41_private *cs35l41 = + snd_soc_codec_get_drvdata(codec_dai->codec); + unsigned int asp_fmt, lrclk_fmt, sclk_fmt, slave_mode; + + pr_debug("++++>CSPL: %s, fmt = %d.\n", __func__, fmt); + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + slave_mode = 1; + break; + case SND_SOC_DAIFMT_CBS_CFS: + slave_mode = 0; + break; + default: + dev_warn(cs35l41->dev, "cs35l41_set_dai_fmt: Mixed master mode unsupported\n"); + return -EINVAL; + } + + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_SCLK_MSTR_MASK, + slave_mode << CS35L41_SCLK_MSTR_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_LRCLK_MSTR_MASK, + slave_mode << CS35L41_LRCLK_MSTR_SHIFT); + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_DSP_A: + asp_fmt = 0; + cs35l41->i2s_mode = false; + cs35l41->dspa_mode = true; + break; + case SND_SOC_DAIFMT_I2S: + asp_fmt = 2; + cs35l41->i2s_mode = true; + cs35l41->dspa_mode = false; + break; + default: + dev_warn(cs35l41->dev, "cs35l41_set_dai_fmt: Invalid or unsupported DAI format\n"); + return -EINVAL; + } + + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_ASP_FMT_MASK, + asp_fmt << CS35L41_ASP_FMT_SHIFT); + + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_NB_IF: + lrclk_fmt = 1; + sclk_fmt = 0; + break; + case SND_SOC_DAIFMT_IB_NF: + lrclk_fmt = 0; + sclk_fmt = 1; + break; + case SND_SOC_DAIFMT_IB_IF: + lrclk_fmt = 1; + sclk_fmt = 1; + break; + case SND_SOC_DAIFMT_NB_NF: + lrclk_fmt = 0; + sclk_fmt = 0; + break; + default: + dev_warn(cs35l41->dev, "cs35l41_set_dai_fmt: Invalid DAI clock INV\n"); + return -EINVAL; + } + + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_LRCLK_INV_MASK, + lrclk_fmt << CS35L41_LRCLK_INV_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_SCLK_INV_MASK, + sclk_fmt << CS35L41_SCLK_INV_SHIFT); + + pr_debug("---->CSPL: %s, fmt = %d.\n", __func__, fmt); + return 0; +} + +struct cs35l41_global_fs_config { + int rate; + int fs_cfg; +}; + +static const struct cs35l41_global_fs_config cs35l41_fs_rates[] = { + { 12000, 0x01 }, + { 24000, 0x02 }, + { 48000, 0x03 }, + { 96000, 0x04 }, + { 192000, 0x05 }, + { 11025, 0x09 }, + { 22050, 0x0A }, + { 44100, 0x0B }, + { 88200, 0x0C }, + { 176400, 0x0D }, + { 8000, 0x11 }, + { 16000, 0x12 }, + { 32000, 0x13 }, +}; + +static int cs35l41_pcm_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(dai->codec); + int i; + unsigned int rate = params_rate(params); + u8 asp_width, asp_wl; + + pr_debug("++++>CSPL: %s.\n", __func__); + for (i = 0; i < ARRAY_SIZE(cs35l41_fs_rates); i++) { + if (rate == cs35l41_fs_rates[i].rate) + break; + } + regmap_update_bits(cs35l41->regmap, CS35L41_GLOBAL_CLK_CTRL, + CS35L41_GLOBAL_FS_MASK, + cs35l41_fs_rates[i].fs_cfg << CS35L41_GLOBAL_FS_SHIFT); + + asp_wl = params_width(params); + asp_width = params_physical_width(params); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_ASP_WIDTH_RX_MASK, + asp_width << CS35L41_ASP_WIDTH_RX_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_SP_RX_WL, + CS35L41_ASP_RX_WL_MASK, + asp_wl << CS35L41_ASP_RX_WL_SHIFT); + if (cs35l41->i2s_mode || cs35l41->dspa_mode) { + regmap_update_bits(cs35l41->regmap, + CS35L41_SP_FRAME_RX_SLOT, + CS35L41_ASP_RX1_SLOT_MASK, + ((cs35l41->pdata.right_channel) ? 1 : 0) + << CS35L41_ASP_RX1_SLOT_SHIFT); + regmap_update_bits(cs35l41->regmap, + CS35L41_SP_FRAME_RX_SLOT, + CS35L41_ASP_RX2_SLOT_MASK, + ((cs35l41->pdata.right_channel) ? 0 : 1) + << CS35L41_ASP_RX2_SLOT_SHIFT); + } + } else { + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_ASP_WIDTH_TX_MASK, + asp_width << CS35L41_ASP_WIDTH_TX_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_SP_TX_WL, + CS35L41_ASP_TX_WL_MASK, + asp_wl << CS35L41_ASP_TX_WL_SHIFT); + } + + pr_debug("---->CSPL: %s.\n", __func__); + return 0; +} + +static int cs35l41_get_clk_config(int freq) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(cs35l41_pll_sysclk); i++) { + if (cs35l41_pll_sysclk[i].freq == freq) + return cs35l41_pll_sysclk[i].clk_cfg; + } + + return -EINVAL; +} + +#if 0 +static const unsigned int cs35l41_src_rates[] = { + 8000, 12000, 11025, 16000, 22050, 24000, 32000, + 44100, 48000, 88200, 96000, 176400, 192000 +}; + +static const struct snd_pcm_hw_constraint_list cs35l41_constraints = { + .count = ARRAY_SIZE(cs35l41_src_rates), + .list = cs35l41_src_rates, +}; +#endif + +static int cs35l41_pcm_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + + struct snd_soc_codec *codec = dai->codec; + pr_debug("++++>CSPL: %s.\n", __func__); + + cs35l41_set_dai_fmt(dai, SND_SOC_DAIFMT_CBS_CFS|SND_SOC_DAIFMT_I2S); + cs35l41_codec_set_sysclk(codec, 0, 0, 1536000, 0); +#if 0 + if (substream->runtime) + return snd_pcm_hw_constraint_list(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, &cs35l41_constraints); +#endif + pr_debug("---->CSPL: %s.\n", __func__); + return 0; +} + +static int cs35l41_codec_set_sysclk(struct snd_soc_codec *codec, + int clk_id, int source, unsigned int freq, + int dir) +{ + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + int val = 0; + cs35l41->extclk_freq = freq; + + pr_debug("++++>CSPL: %s: clk_id = %d, src = %d, freq = %d, dir = %d.\n", __func__, clk_id, source, freq, dir); + dev_info(codec->dev, "%s: clk_id=%d, src=%d, freq=%d\n", __func__, clk_id, source, freq); + + switch (clk_id) { + case 0: + cs35l41->clksrc = CS35L41_PLLSRC_SCLK; + break; + case 1: + cs35l41->clksrc = CS35L41_PLLSRC_LRCLK; + break; + case 2: + cs35l41->clksrc = CS35L41_PLLSRC_PDMCLK; + break; + case 3: + cs35l41->clksrc = CS35L41_PLLSRC_SELF; + break; + case 4: + cs35l41->clksrc = CS35L41_PLLSRC_MCLK; + break; + default: + dev_err(codec->dev, "Invalid CLK Config\n"); + return -EINVAL; + } + + cs35l41->extclk_cfg = cs35l41_get_clk_config(freq); + + if (cs35l41->extclk_cfg < 0) { + dev_err(codec->dev, "Invalid CLK Config: %d, freq: %u\n", + cs35l41->extclk_cfg, freq); + return -EINVAL; + } + + regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, + CS35L41_PLL_OPENLOOP_MASK, + 1 << CS35L41_PLL_OPENLOOP_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, + CS35L41_REFCLK_FREQ_MASK, + cs35l41->extclk_cfg << CS35L41_REFCLK_FREQ_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, + CS35L41_PLL_CLK_EN_MASK, + 0 << CS35L41_PLL_CLK_EN_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, + CS35L41_PLL_CLK_SEL_MASK, cs35l41->clksrc); + regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, + CS35L41_PLL_OPENLOOP_MASK, + 0 << CS35L41_PLL_OPENLOOP_SHIFT); + regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, + CS35L41_PLL_CLK_EN_MASK, + 1 << CS35L41_PLL_CLK_EN_SHIFT); + + regmap_read(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, &val); + dev_info(codec->dev, "%s: 0x%x <== 0x%x\n",__func__, CS35L41_PLL_CLK_CTRL, val); + pr_debug("---->CSPL: %s.\n", __func__); + + return 0; +} + +static int cs35l41_dai_set_sysclk(struct snd_soc_dai *dai, + int clk_id, unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = dai->codec; + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + pr_debug("++++>CSPL: %s: clk_id=%d, freq=%d, dir=%d\n", __func__, clk_id, freq, dir); + if (cs35l41_get_clk_config(freq) < 0) { + dev_err(codec->dev, "Invalid CLK Config freq: %u\n", freq); + return -EINVAL; + } + + if (clk_id == CS35L41_PLLSRC_SCLK) + cs35l41->sclk = freq; + pr_debug("---->CSPL: %s.\n", __func__); + + return 0; +} + +static int cs35l41_digital_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_codec *codec = dai->codec; + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(cs35l41->dev, "%s: %d\n", __func__, mute); + pr_debug("++++>CSPL: %s, mute = %d.\n", __func__, mute); + + if (mute) { + regmap_update_bits(cs35l41->regmap,0x6000, + 0x7ff << 3, 0x400 << 3 | 0x7); + mdelay(30); + } else { + regmap_update_bits(cs35l41->regmap,0x6000, + 0x7ff << 3, 0x0 << 3 | 0x4 ); + } + + pr_debug("---->CSPL: %s.\n", __func__); + return 0; +} + +static int cs35l41_boost_config(struct cs35l41_private *cs35l41, + int boost_ind, int boost_cap, int boost_ipk) +{ + int ret; + unsigned char bst_lbst_val, bst_cbst_range, bst_ipk_scaled; + struct regmap *regmap = cs35l41->regmap; + struct device *dev = cs35l41->dev; + + switch (boost_ind) { + case 1000: /* 1.0 uH */ + bst_lbst_val = 0; + break; + case 1200: /* 1.2 uH */ + bst_lbst_val = 1; + break; + case 1500: /* 1.5 uH */ + bst_lbst_val = 2; + break; + case 2200: /* 2.2 uH */ + bst_lbst_val = 3; + break; + default: + dev_err(dev, "Invalid boost inductor value: %d nH\n", + boost_ind); + return -EINVAL; + } + + switch (boost_cap) { + case 0 ... 19: + bst_cbst_range = 0; + break; + case 20 ... 50: + bst_cbst_range = 1; + break; + case 51 ... 100: + bst_cbst_range = 2; + break; + case 101 ... 200: + bst_cbst_range = 3; + break; + default: /* 201 uF and greater */ + bst_cbst_range = 4; + } + + ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_COEFF, + CS35L41_BST_K1_MASK, + cs35l41_bst_k1_table[bst_lbst_val][bst_cbst_range] + << CS35L41_BST_K1_SHIFT); + if (ret) { + dev_err(dev, "Failed to write boost K1 coefficient\n"); + return ret; + } + + ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_COEFF, + CS35L41_BST_K2_MASK, + cs35l41_bst_k2_table[bst_lbst_val][bst_cbst_range] + << CS35L41_BST_K2_SHIFT); + if (ret) { + dev_err(dev, "Failed to write boost K2 coefficient\n"); + return ret; + } + + ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_SLOPE_LBST, + CS35L41_BST_SLOPE_MASK, + cs35l41_bst_slope_table[bst_lbst_val] + << CS35L41_BST_SLOPE_SHIFT); + if (ret) { + dev_err(dev, "Failed to write boost slope coefficient\n"); + return ret; + } + + ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_SLOPE_LBST, + CS35L41_BST_LBST_VAL_MASK, + bst_lbst_val << CS35L41_BST_LBST_VAL_SHIFT); + if (ret) { + dev_err(dev, "Failed to write boost inductor value\n"); + return ret; + } + + if ((boost_ipk < 1600) || (boost_ipk > 4500)) { + dev_err(dev, "Invalid boost inductor peak current: %d mA\n", + boost_ipk); + return -EINVAL; + } + bst_ipk_scaled = ((boost_ipk - 1600) / 50) + 0x10; + + ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_PEAK_CUR, + CS35L41_BST_IPK_MASK, + bst_ipk_scaled << CS35L41_BST_IPK_SHIFT); + if (ret) { + dev_err(dev, "Failed to write boost inductor peak current\n"); + return ret; + } + + return 0; +} + +static int cs35l41_codec_probe(struct snd_soc_codec *codec) +{ + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct classh_cfg *classh = &cs35l41->pdata.classh_config; + int ret; + + /* Set Platform Data */ + /* Required */ + if (cs35l41->pdata.bst_ipk && + cs35l41->pdata.bst_ind && cs35l41->pdata.bst_cap) { + ret = cs35l41_boost_config(cs35l41, cs35l41->pdata.bst_ind, + cs35l41->pdata.bst_cap, + cs35l41->pdata.bst_ipk); + if (ret) { + dev_err(cs35l41->dev, "Error in Boost DT config\n"); + return ret; + } + } else { + dev_err(cs35l41->dev, "Incomplete Boost component DT config\n"); + return -EINVAL; + } + + /* Optional */ + if (cs35l41->pdata.sclk_frc) + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_SCLK_FRC_MASK, + cs35l41->pdata.sclk_frc << + CS35L41_SCLK_FRC_SHIFT); + + if (cs35l41->pdata.lrclk_frc) + regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, + CS35L41_LRCLK_FRC_MASK, + cs35l41->pdata.lrclk_frc << + CS35L41_LRCLK_FRC_SHIFT); + + if (cs35l41->pdata.amp_gain_zc) + regmap_update_bits(cs35l41->regmap, CS35L41_AMP_GAIN_CTRL, + CS35L41_AMP_GAIN_ZC_MASK, + cs35l41->pdata.amp_gain_zc << + CS35L41_AMP_GAIN_ZC_SHIFT); + + if (cs35l41->pdata.bst_vctrl) + regmap_update_bits(cs35l41->regmap, CS35L41_BSTCVRT_VCTRL1, + CS35L41_BST_CTL_MASK, cs35l41->pdata.bst_vctrl); + + if (cs35l41->pdata.temp_warn_thld) + regmap_update_bits(cs35l41->regmap, CS35L41_DTEMP_WARN_THLD, + CS35L41_TEMP_THLD_MASK, + cs35l41->pdata.temp_warn_thld); + + if (cs35l41->pdata.dout_hiz <= CS35L41_ASP_DOUT_HIZ_MASK && + cs35l41->pdata.dout_hiz >= 0) + regmap_update_bits(cs35l41->regmap, CS35L41_SP_HIZ_CTRL, + CS35L41_ASP_DOUT_HIZ_MASK, + cs35l41->pdata.dout_hiz); + + if (cs35l41->pdata.ng_enable) { + regmap_update_bits(cs35l41->regmap, + CS35L41_MIXER_NGATE_CH1_CFG, + CS35L41_NG_ENABLE_MASK, + CS35L41_NG_ENABLE_MASK); + regmap_update_bits(cs35l41->regmap, + CS35L41_MIXER_NGATE_CH2_CFG, + CS35L41_NG_ENABLE_MASK, + CS35L41_NG_ENABLE_MASK); + + if (cs35l41->pdata.ng_pcm_thld) { + regmap_update_bits(cs35l41->regmap, + CS35L41_MIXER_NGATE_CH1_CFG, + CS35L41_NG_THLD_MASK, + cs35l41->pdata.ng_pcm_thld); + regmap_update_bits(cs35l41->regmap, + CS35L41_MIXER_NGATE_CH2_CFG, + CS35L41_NG_THLD_MASK, + cs35l41->pdata.ng_pcm_thld); + } + + if (cs35l41->pdata.ng_delay) { + regmap_update_bits(cs35l41->regmap, + CS35L41_MIXER_NGATE_CH1_CFG, + CS35L41_NG_DELAY_MASK, + cs35l41->pdata.ng_delay << + CS35L41_NG_DELAY_SHIFT); + regmap_update_bits(cs35l41->regmap, + CS35L41_MIXER_NGATE_CH2_CFG, + CS35L41_NG_DELAY_MASK, + cs35l41->pdata.ng_delay << + CS35L41_NG_DELAY_SHIFT); + } + } + + if (classh->classh_algo_enable) { + if (classh->classh_bst_override) + regmap_update_bits(cs35l41->regmap, + CS35L41_BSTCVRT_VCTRL2, + CS35L41_BST_CTL_SEL_MASK, + CS35L41_BST_CTL_SEL_REG); + if (classh->classh_bst_max_limit) + regmap_update_bits(cs35l41->regmap, + CS35L41_BSTCVRT_VCTRL2, + CS35L41_BST_LIM_MASK, + classh->classh_bst_max_limit << + CS35L41_BST_LIM_SHIFT); + if (classh->classh_mem_depth) + regmap_update_bits(cs35l41->regmap, + CS35L41_CLASSH_CFG, + CS35L41_CH_MEM_DEPTH_MASK, + classh->classh_mem_depth << + CS35L41_CH_MEM_DEPTH_SHIFT); + if (classh->classh_headroom) + regmap_update_bits(cs35l41->regmap, + CS35L41_CLASSH_CFG, + CS35L41_CH_HDRM_CTL_MASK, + classh->classh_headroom << + CS35L41_CH_HDRM_CTL_SHIFT); + if (classh->classh_release_rate) + regmap_update_bits(cs35l41->regmap, + CS35L41_CLASSH_CFG, + CS35L41_CH_REL_RATE_MASK, + classh->classh_release_rate << + CS35L41_CH_REL_RATE_SHIFT); + if (classh->classh_wk_fet_delay) + regmap_update_bits(cs35l41->regmap, + CS35L41_WKFET_CFG, + CS35L41_CH_WKFET_DLY_MASK, + classh->classh_wk_fet_delay << + CS35L41_CH_WKFET_DLY_SHIFT); + if (classh->classh_wk_fet_thld) + regmap_update_bits(cs35l41->regmap, + CS35L41_WKFET_CFG, + CS35L41_CH_WKFET_THLD_MASK, + classh->classh_wk_fet_thld << + CS35L41_CH_WKFET_THLD_SHIFT); + } + + wm_adsp2_codec_probe(&cs35l41->dsp, codec); + + snd_soc_dapm_ignore_suspend(dapm, "AMP Playback"); + snd_soc_dapm_ignore_suspend(dapm, "AMP Capture"); + snd_soc_dapm_ignore_suspend(dapm, "Main AMP"); + snd_soc_dapm_ignore_suspend(dapm, "SPK"); + snd_soc_dapm_ignore_suspend(dapm, "VP"); + snd_soc_dapm_ignore_suspend(dapm, "VBST"); + snd_soc_dapm_ignore_suspend(dapm, "ISENSE"); + snd_soc_dapm_ignore_suspend(dapm, "VSENSE"); + snd_soc_dapm_ignore_suspend(dapm, "TEMP"); + snd_soc_dapm_ignore_suspend(dapm, "DSP1 Preloader"); + snd_soc_dapm_ignore_suspend(dapm, "DSP1 Preload"); + + return 0; +} + +static int cs35l41_irq_gpio_config(struct cs35l41_private *cs35l41) +{ + struct irq_cfg *irq_gpio_cfg1 = &cs35l41->pdata.irq_config1; + struct irq_cfg *irq_gpio_cfg2 = &cs35l41->pdata.irq_config2; + int irq_pol = IRQF_TRIGGER_NONE; + + if (irq_gpio_cfg1->is_present) { + if (irq_gpio_cfg1->irq_pol_inv) + regmap_update_bits(cs35l41->regmap, + CS35L41_GPIO1_CTRL1, + CS35L41_GPIO_POL_MASK, + CS35L41_GPIO_POL_MASK); + if (irq_gpio_cfg1->irq_out_en) + regmap_update_bits(cs35l41->regmap, + CS35L41_GPIO1_CTRL1, + CS35L41_GPIO_DIR_MASK, + 0); + if (irq_gpio_cfg1->irq_src_sel) + regmap_update_bits(cs35l41->regmap, + CS35L41_GPIO_PAD_CONTROL, + CS35L41_GPIO1_CTRL_MASK, + irq_gpio_cfg1->irq_src_sel << + CS35L41_GPIO1_CTRL_SHIFT); + } + + if (irq_gpio_cfg2->is_present) { + if (irq_gpio_cfg2->irq_pol_inv) + regmap_update_bits(cs35l41->regmap, + CS35L41_GPIO2_CTRL1, + CS35L41_GPIO_POL_MASK, + CS35L41_GPIO_POL_MASK); + if (irq_gpio_cfg2->irq_out_en) + regmap_update_bits(cs35l41->regmap, + CS35L41_GPIO2_CTRL1, + CS35L41_GPIO_DIR_MASK, + 0); + if (irq_gpio_cfg2->irq_src_sel) + regmap_update_bits(cs35l41->regmap, + CS35L41_GPIO_PAD_CONTROL, + CS35L41_GPIO2_CTRL_MASK, + irq_gpio_cfg2->irq_src_sel << + CS35L41_GPIO2_CTRL_SHIFT); + } + + if (irq_gpio_cfg2->irq_src_sel == + (CS35L41_GPIO_CTRL_ACTV_LO | CS35L41_VALID_PDATA)) + irq_pol = IRQF_TRIGGER_LOW; + else if (irq_gpio_cfg2->irq_src_sel == + (CS35L41_GPIO_CTRL_ACTV_HI | CS35L41_VALID_PDATA)) + irq_pol = IRQF_TRIGGER_HIGH; + + return irq_pol; +} + +static int cs35l41_codec_remove(struct snd_soc_codec *codec) +{ + struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); + + wm_adsp2_codec_remove(&cs35l41->dsp, codec); + return 0; +} + +static const struct snd_soc_dai_ops cs35l41_ops = { + .startup = cs35l41_pcm_startup, + .set_fmt = cs35l41_set_dai_fmt, + .hw_params = cs35l41_pcm_hw_params, + .set_sysclk = cs35l41_dai_set_sysclk, + .digital_mute = cs35l41_digital_mute, +}; + +static struct snd_soc_dai_driver cs35l41_dai[] = { + { + .name = "cs35l41-pcm", + .id = 0, + .playback = { + .stream_name = "AMP Playback", + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_KNOT, + .formats = CS35L41_RX_FORMATS, + }, + .capture = { + .stream_name = "AMP Capture", + .channels_min = 1, + .channels_max = 8, + .rates = SNDRV_PCM_RATE_KNOT, + .formats = CS35L41_TX_FORMATS, + }, + .ops = &cs35l41_ops, + .symmetric_rates = 1, + }, +}; + + + +static struct snd_soc_codec_driver soc_codec_dev_cs35l41 = { + .probe = cs35l41_codec_probe, + .remove = cs35l41_codec_remove, + .component_driver = { + .dapm_widgets = cs35l41_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs35l41_dapm_widgets), + .dapm_routes = cs35l41_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs35l41_audio_map), + .controls = cs35l41_aud_controls, + .num_controls = ARRAY_SIZE(cs35l41_aud_controls), + }, + .set_sysclk = cs35l41_codec_set_sysclk, + .ignore_pmdown_time = false, + .idle_bias_off = true, +}; + +int spk_id_get(struct device_node *np) +{ + int id; + int state; + + state = spk_id_get_pin_3state(np); + if (state < 0) { + pr_err("%s: Can not get id pin state, %d\n", __func__, state); + return VENDOR_ID_NONE; + } + + switch (state) { + case PIN_PULL_DOWN: + id = VENDOR_ID_AAC; + break; + case PIN_PULL_UP: + id = VENDOR_ID_UNKNOWN; + break; + case PIN_FLOAT: + id = VENDOR_ID_GOER; + break; + default: + id = VENDOR_ID_UNKNOWN; + break; + } + return id; +} + +static int cs35l41_handle_of_data(struct device *dev, + struct cs35l41_platform_data *pdata) +{ + struct device_node *np = dev->of_node; + unsigned int val; + int ret; + struct device_node *sub_node; + struct classh_cfg *classh_config = &pdata->classh_config; + struct irq_cfg *irq_gpio1_config = &pdata->irq_config1; + struct irq_cfg *irq_gpio2_config = &pdata->irq_config2; + + if (!np) + return 0; + + pdata->right_channel = of_property_read_bool(np, + "cirrus,right-channel-amp"); + pdata->sclk_frc = of_property_read_bool(np, + "cirrus,sclk-force-output"); + pdata->lrclk_frc = of_property_read_bool(np, + "cirrus,lrclk-force-output"); + pdata->amp_gain_zc = of_property_read_bool(np, + "cirrus,amp-gain-zc"); + + if (of_property_read_u32(np, "cirrus,temp-warn_threshold", &val) >= 0) + pdata->temp_warn_thld = val | CS35L41_VALID_PDATA; + + ret = of_property_read_u32(np, "cirrus,boost-ctl-millivolt", &val); + if (ret >= 0) { + if (val < 2550 || val > 11000) { + dev_err(dev, + "Invalid Boost Voltage %u mV\n", val); + return -EINVAL; + } + pdata->bst_vctrl = ((val - 2550) / 100) + 1; + } + + ret = of_property_read_u32(np, "cirrus,boost-peak-milliamp", &val); + if (ret >= 0) + pdata->bst_ipk = val; + + ret = of_property_read_u32(np, "cirrus,boost-ind-nanohenry", &val); + if (ret >= 0) + pdata->bst_ind = val; + + ret = of_property_read_u32(np, "cirrus,boost-cap-microfarad", &val); + if (ret >= 0) + pdata->bst_cap = val; + + ret = of_property_read_u32(np, "cirrus,asp-sdout-hiz", &val); + if (ret >= 0) + pdata->dout_hiz = val; + else + pdata->dout_hiz = -1; + + pdata->ng_enable = of_property_read_bool(np, + "cirrus,noise-gate-enable"); + if (of_property_read_u32(np, "cirrus,noise-gate-threshold", &val) >= 0) + pdata->ng_pcm_thld = val | CS35L41_VALID_PDATA; + if (of_property_read_u32(np, "cirrus,noise-gate-delay", &val) >= 0) + pdata->ng_delay = val | CS35L41_VALID_PDATA; + + pdata->spk_id_gpio_p = of_parse_phandle(np, + "cirrus,spk-id-pin", 0); + if (!pdata->spk_id_gpio_p) { + dev_err(dev, "property %s not detected in node %s", + "cirrus,spk-id-pin", np->full_name); + pdata->mnSpkType = VENDOR_ID_NONE; + } else { + pdata->mnSpkType = spk_id_get(pdata->spk_id_gpio_p); + } + dev_info(dev, "spk is is %d", pdata->mnSpkType); + + sub_node = of_get_child_by_name(np, "cirrus,classh-internal-algo"); + classh_config->classh_algo_enable = sub_node ? true : false; + + if (classh_config->classh_algo_enable) { + classh_config->classh_bst_override = + of_property_read_bool(sub_node, + "cirrus,classh-bst-overide"); + + ret = of_property_read_u32(sub_node, + "cirrus,classh-bst-max-limit", + &val); + if (ret >= 0) { + val |= CS35L41_VALID_PDATA; + classh_config->classh_bst_max_limit = val; + } + + ret = of_property_read_u32(sub_node, "cirrus,classh-mem-depth", + &val); + if (ret >= 0) { + val |= CS35L41_VALID_PDATA; + classh_config->classh_mem_depth = val; + } + + ret = of_property_read_u32(sub_node, + "cirrus,classh-release-rate", &val); + if (ret >= 0) + classh_config->classh_release_rate = val; + + ret = of_property_read_u32(sub_node, "cirrus,classh-headroom", + &val); + if (ret >= 0) { + val |= CS35L41_VALID_PDATA; + classh_config->classh_headroom = val; + } + + ret = of_property_read_u32(sub_node, + "cirrus,classh-wk-fet-delay", &val); + if (ret >= 0) { + val |= CS35L41_VALID_PDATA; + classh_config->classh_wk_fet_delay = val; + } + + ret = of_property_read_u32(sub_node, + "cirrus,classh-wk-fet-thld", &val); + if (ret >= 0) + classh_config->classh_wk_fet_thld = val; + } + of_node_put(sub_node); + + /* GPIO1 Pin Config */ + sub_node = of_get_child_by_name(np, "cirrus,gpio-config1"); + irq_gpio1_config->is_present = sub_node ? true : false; + if (irq_gpio1_config->is_present) { + irq_gpio1_config->irq_pol_inv = of_property_read_bool(sub_node, + "cirrus,gpio-polarity-invert"); + irq_gpio1_config->irq_out_en = of_property_read_bool(sub_node, + "cirrus,gpio-output-enable"); + ret = of_property_read_u32(sub_node, "cirrus,gpio-src-select", + &val); + if (ret >= 0) { + val |= CS35L41_VALID_PDATA; + irq_gpio1_config->irq_src_sel = val; + } + } + of_node_put(sub_node); + + /* GPIO2 Pin Config */ + sub_node = of_get_child_by_name(np, "cirrus,gpio-config2"); + irq_gpio2_config->is_present = sub_node ? true : false; + if (irq_gpio2_config->is_present) { + irq_gpio2_config->irq_pol_inv = of_property_read_bool(sub_node, + "cirrus,gpio-polarity-invert"); + irq_gpio2_config->irq_out_en = of_property_read_bool(sub_node, + "cirrus,gpio-output-enable"); + ret = of_property_read_u32(sub_node, "cirrus,gpio-src-select", + &val); + if (ret >= 0) { + val |= CS35L41_VALID_PDATA; + irq_gpio2_config->irq_src_sel = val; + } + } + of_node_put(sub_node); + + return 0; +} + +static const struct reg_sequence cs35l41_reva0_errata_patch[] = { + {0x00000040, 0x00005555}, + {0x00000040, 0x0000AAAA}, + {0x00003854, 0x05180240}, + {CS35L41_VIMON_SPKMON_RESYNC, 0x00000000}, + {CS35L41_OTP_TRIM_30, 0x9091A1C8}, + {0x00003014, 0x0200EE0E}, + {CS35L41_BSTCVRT_DCM_CTRL, 0x00000051}, + {0x00000054, 0x00000004}, + {CS35L41_IRQ1_DB3, 0x00000000}, + {CS35L41_IRQ2_DB3, 0x00000000}, + {CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000}, + {CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000}, + {CS35L41_ASP_CONTROL4, 0x00000000}, + {0x00000040, 0x0000CCCC}, + {0x00000040, 0x00003333}, +}; + +static const struct reg_sequence cs35l41_revb0_errata_patch[] = { + {0x00000040, 0x00005555}, + {0x00000040, 0x0000AAAA}, + {CS35L41_VIMON_SPKMON_RESYNC, 0x00000000}, + {CS35L41_BSTCVRT_DCM_CTRL, 0x00000051}, + {CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000}, + {CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000}, + {CS35L41_ASP_CONTROL4, 0x00000000}, + {0x00000040, 0x0000CCCC}, + {0x00000040, 0x00003333}, +}; + +static int cs35l41_dsp_init(struct cs35l41_private *cs35l41) +{ + struct wm_adsp *dsp; + int ret; + + dsp = &cs35l41->dsp; + dsp->part = "cs35l41"; + dsp->num = 1; + dsp->type = WMFW_HALO; + dsp->rev = 0; + dsp->dev = cs35l41->dev; + dsp->regmap = cs35l41->regmap; + + dsp->base = CS35L41_DSP1_CTRL_BASE; + dsp->base_sysinfo = CS35L41_DSP1_SYS_ID; + dsp->mem = cs35l41_dsp1_regions; + dsp->num_mems = ARRAY_SIZE(cs35l41_dsp1_regions); + dsp->unlock_all = true; + + dsp->n_rx_rates = CS35L41_DSP_N_RX_RATES; + dsp->n_tx_rates = CS35L41_DSP_N_TX_RATES; + ret = wm_halo_init(dsp); + cs35l41->halo_booted = false; + + regmap_write(cs35l41->regmap, CS35L41_DSP1_RX5_SRC, + CS35L41_INPUT_SRC_VPMON); + regmap_write(cs35l41->regmap, CS35L41_DSP1_RX6_SRC, + CS35L41_INPUT_SRC_CLASSH); + regmap_write(cs35l41->regmap, CS35L41_DSP1_RX7_SRC, + CS35L41_INPUT_SRC_TEMPMON); + regmap_write(cs35l41->regmap, CS35L41_DSP1_RX8_SRC, + CS35L41_INPUT_SRC_RSVD); + + return ret; +} + +int cs35l41_probe(struct cs35l41_private *cs35l41, + struct cs35l41_platform_data *pdata) +{ + int ret; + u32 regid, reg_revid, i, mtl_revid, int_status, chipid_match; + int timeout = 100; + int irq_pol = 0; + + dev_info(cs35l41->dev, "cs35l41 proble\n" ); + + /* Default to RESUME cmd */ + cs35l41->cspl_cmd = (unsigned int)CSPL_MBOX_CMD_RESUME; + + for (i = 0; i < ARRAY_SIZE(cs35l41_supplies); i++) + cs35l41->supplies[i].supply = cs35l41_supplies[i]; + + cs35l41->num_supplies = ARRAY_SIZE(cs35l41_supplies); + + ret = devm_regulator_bulk_get(cs35l41->dev, cs35l41->num_supplies, + cs35l41->supplies); + if (ret != 0) { + dev_err(cs35l41->dev, + "Failed to request core supplies: %d\n", + ret); + return ret; + } + + if (pdata) { + cs35l41->pdata = *pdata; + } else if (cs35l41->dev->of_node) { + ret = cs35l41_handle_of_data(cs35l41->dev, &cs35l41->pdata); + if (ret != 0) + return ret; + } else { + ret = -EINVAL; + goto err; + } + + ret = regulator_bulk_enable(cs35l41->num_supplies, cs35l41->supplies); + if (ret != 0) { + dev_err(cs35l41->dev, + "Failed to enable core supplies: %d\n", ret); + return ret; + } + + /* returning NULL can be an option if in stereo mode */ + cs35l41->reset_gpio = of_get_named_gpio(cs35l41->dev->of_node, + "cs,cdc-reset-gpio", 0); + + dev_err(cs35l41->dev, "Set GPIO %d as RESET pin\n", cs35l41->reset_gpio); + if (!gpio_is_valid(cs35l41->reset_gpio)) { + dev_err(cs35l41->dev, "GPIO %d is invalid!\n", cs35l41->reset_gpio); + } + + if (cs35l41->reset_gpio) { + dev_err(cs35l41->dev, "Reset cs35l41\n"); + /* satisfy minimum reset pulse width spec */ + usleep_range(2000, 2100); + + gpio_direction_output(cs35l41->reset_gpio, 0); + msleep(5); + gpio_direction_output(cs35l41->reset_gpio, 1); + msleep(2); + } + + usleep_range(2000, 2100); + + do { + if (timeout == 0) { + dev_err(cs35l41->dev, + "Timeout waiting for OTP_BOOT_DONE\n"); + ret = -EBUSY; + goto err; + } + usleep_range(1000, 1100); + regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS4, &int_status); + timeout--; + } while (!(int_status & CS35L41_OTP_BOOT_DONE)); + + regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS3, &int_status); + if (int_status & CS35L41_OTP_BOOT_ERR) { + dev_err(cs35l41->dev, "OTP Boot error\n"); + ret = -EINVAL; + goto err; + } + + ret = regmap_read(cs35l41->regmap, CS35L41_DEVID, ®id); + if (ret < 0) { + dev_err(cs35l41->dev, "Get Device ID failed\n"); + goto err; + } + + ret = regmap_read(cs35l41->regmap, CS35L41_REVID, ®_revid); + if (ret < 0) { + dev_err(cs35l41->dev, "Get Revision ID failed\n"); + goto err; + } + + mtl_revid = reg_revid & CS35L41_MTLREVID_MASK; + + /* CS35L41 will have even MTLREVID + * CS35L41R will have odd MTLREVID + */ + chipid_match = (mtl_revid % 2) ? CS35L41R_CHIP_ID : CS35L41_CHIP_ID; + if (regid != chipid_match) { + dev_err(cs35l41->dev, "CS35L41 Device ID (%X). Expected ID %X\n", + regid, chipid_match); + ret = -ENODEV; + goto err; + } + + irq_pol = cs35l41_irq_gpio_config(cs35l41); + + init_completion(&cs35l41->global_pdn_done); + init_completion(&cs35l41->global_pup_done); + + init_completion(&cs35l41->mbox_cmd); + + ret = devm_request_threaded_irq(cs35l41->dev, cs35l41->irq, NULL, + cs35l41_irq, irq_pol | IRQF_ONESHOT, + "cs35l41", cs35l41); + + /* CS35L41 needs INT for PDN_DONE */ + if (ret != 0) { + dev_err(cs35l41->dev, "Failed to request IRQ: %d\n", cs35l41->irq); + //goto err; + } + + /* Set interrupt masks for critical errors */ + regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, + CS35L41_INT1_MASK_DEFAULT); + + switch (reg_revid) { + case CS35L41_REVID_A0: + ret = regmap_multi_reg_write(cs35l41->regmap, + cs35l41_reva0_errata_patch, + ARRAY_SIZE(cs35l41_reva0_errata_patch)); + if (ret < 0) { + dev_err(cs35l41->dev, + "Failed to apply A0 errata patch %d\n", ret); + goto err; + } + break; + case CS35L41_REVID_B0: + ret = regmap_multi_reg_write(cs35l41->regmap, + cs35l41_revb0_errata_patch, + ARRAY_SIZE(cs35l41_revb0_errata_patch)); + if (ret < 0) { + dev_err(cs35l41->dev, + "Failed to apply B0 errata patch %d\n", ret); + goto err; + } + break; + } + + ret = cs35l41_otp_unpack(cs35l41); + if (ret < 0) { + dev_err(cs35l41->dev, "OTP Unpack failed\n"); + goto err; + } + + cs35l41_dsp_init(cs35l41); + + ret = snd_soc_register_codec(cs35l41->dev, &soc_codec_dev_cs35l41, + cs35l41_dai, ARRAY_SIZE(cs35l41_dai)); + if (ret < 0) { + dev_err(cs35l41->dev, "%s: Register codec failed\n", __func__); + goto err; + } + + dev_info(cs35l41->dev, "Cirrus Logic CS35L41 (%x), Revision: %02X\n", + regid, reg_revid); + +err: + regulator_bulk_disable(cs35l41->num_supplies, cs35l41->supplies); + return ret; +} + +MODULE_DESCRIPTION("ASoC CS35L41 driver"); +MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, "); +MODULE_LICENSE("GPL"); diff --git a/asoc/codecs/cs35l41/cs35l41.h b/asoc/codecs/cs35l41/cs35l41.h new file mode 100755 index 000000000000..4569abf5f1d6 --- /dev/null +++ b/asoc/codecs/cs35l41/cs35l41.h @@ -0,0 +1,764 @@ +/* + * cs35l41.h -- CS35L41 ALSA SoC audio driver + * + * Copyright 2018 Cirrus Logic, Inc. + * + * Author: Brian Austin + * David Rhodes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef __CS35L41_H__ +#define __CS35L41_H__ + +#include + +#define CS35L41_FIRSTREG 0x00000000 +#define CS35L41_LASTREG 0x03804FE8 +#define CS35L41_DEVID 0x00000000 +#define CS35L41_REVID 0x00000004 +#define CS35L41_FABID 0x00000008 +#define CS35L41_RELID 0x0000000C +#define CS35L41_OTPID 0x00000010 +#define CS35L41_SFT_RESET 0x00000020 +#define CS35L41_TEST_KEY_CTL 0x00000040 +#define CS35L41_USER_KEY_CTL 0x00000044 +#define CS35L41_OTP_MEM0 0x00000400 +#define CS35L41_OTP_MEM31 0x0000047C +#define CS35L41_OTP_CTRL0 0x00000500 +#define CS35L41_OTP_CTRL1 0x00000504 +#define CS35L41_OTP_CTRL3 0x00000508 +#define CS35L41_OTP_CTRL4 0x0000050C +#define CS35L41_OTP_CTRL5 0x00000510 +#define CS35L41_OTP_CTRL6 0x00000514 +#define CS35L41_OTP_CTRL7 0x00000518 +#define CS35L41_OTP_CTRL8 0x0000051C +#define CS35L41_PWR_CTRL1 0x00002014 +#define CS35L41_PWR_CTRL2 0x00002018 +#define CS35L41_PWR_CTRL3 0x0000201C +#define CS35L41_CTRL_OVRRIDE 0x00002020 +#define CS35L41_AMP_OUT_MUTE 0x00002024 +#define CS35L41_PROTECT_REL_ERR_IGN 0x00002034 +#define CS35L41_GPIO_PAD_CONTROL 0x0000242C +#define CS35L41_JTAG_CONTROL 0x00002438 +#define CS35L41_PLL_CLK_CTRL 0x00002C04 +#define CS35L41_DSP_CLK_CTRL 0x00002C08 +#define CS35L41_GLOBAL_CLK_CTRL 0x00002C0C +#define CS35L41_DATA_FS_SEL 0x00002C10 +#define CS35L41_MDSYNC_EN 0x00003400 +#define CS35L41_MDSYNC_TX_ID 0x00003408 +#define CS35L41_MDSYNC_PWR_CTRL 0x0000340C +#define CS35L41_MDSYNC_DATA_TX 0x00003410 +#define CS35L41_MDSYNC_TX_STATUS 0x00003414 +#define CS35L41_MDSYNC_DATA_RX 0x0000341C +#define CS35L41_MDSYNC_RX_STATUS 0x00003420 +#define CS35L41_MDSYNC_ERR_STATUS 0x00003424 +#define CS35L41_MDSYNC_SYNC_PTE2 0x00003528 +#define CS35L41_MDSYNC_SYNC_PTE3 0x0000352C +#define CS35L41_MDSYNC_SYNC_MSM_STATUS 0x0000353C +#define CS35L41_BSTCVRT_VCTRL1 0x00003800 +#define CS35L41_BSTCVRT_VCTRL2 0x00003804 +#define CS35L41_BSTCVRT_PEAK_CUR 0x00003808 +#define CS35L41_BSTCVRT_SFT_RAMP 0x0000380C +#define CS35L41_BSTCVRT_COEFF 0x00003810 +#define CS35L41_BSTCVRT_SLOPE_LBST 0x00003814 +#define CS35L41_BSTCVRT_SW_FREQ 0x00003818 +#define CS35L41_BSTCVRT_DCM_CTRL 0x0000381C +#define CS35L41_BSTCVRT_DCM_MODE_FORCE 0x00003820 +#define CS35L41_BSTCVRT_OVERVOLT_CTRL 0x00003830 +#define CS35L41_VI_VOL_POL 0x00004000 +#define CS35L41_VIMON_SPKMON_RESYNC 0x00004100 +#define CS35L41_DTEMP_WARN_THLD 0x00004220 +#define CS35L41_DTEMP_CFG 0x00004224 +#define CS35L41_DTEMP_EN 0x00004308 +#define CS35L41_VPVBST_FS_SEL 0x00004400 +#define CS35L41_SP_ENABLES 0x00004800 +#define CS35L41_SP_RATE_CTRL 0x00004804 +#define CS35L41_SP_FORMAT 0x00004808 +#define CS35L41_SP_HIZ_CTRL 0x0000480C +#define CS35L41_SP_FRAME_TX_SLOT 0x00004810 +#define CS35L41_SP_FRAME_RX_SLOT 0x00004820 +#define CS35L41_SP_TX_WL 0x00004830 +#define CS35L41_SP_RX_WL 0x00004840 +#define CS35L41_ASP_CONTROL4 0x00004854 +#define CS35L41_DAC_PCM1_SRC 0x00004C00 +#define CS35L41_ASP_TX1_SRC 0x00004C20 +#define CS35L41_ASP_TX2_SRC 0x00004C24 +#define CS35L41_ASP_TX3_SRC 0x00004C28 +#define CS35L41_ASP_TX4_SRC 0x00004C2C +#define CS35L41_DSP1_RX1_SRC 0x00004C40 +#define CS35L41_DSP1_RX2_SRC 0x00004C44 +#define CS35L41_DSP1_RX3_SRC 0x00004C48 +#define CS35L41_DSP1_RX4_SRC 0x00004C4C +#define CS35L41_DSP1_RX5_SRC 0x00004C50 +#define CS35L41_DSP1_RX6_SRC 0x00004C54 +#define CS35L41_DSP1_RX7_SRC 0x00004C58 +#define CS35L41_DSP1_RX8_SRC 0x00004C5C +#define CS35L41_NGATE1_SRC 0x00004C60 +#define CS35L41_NGATE2_SRC 0x00004C64 +#define CS35L41_AMP_DIG_VOL_CTRL 0x00006000 +#define CS35L41_VPBR_CFG 0x00006404 +#define CS35L41_VBBR_CFG 0x00006408 +#define CS35L41_VPBR_STATUS 0x0000640C +#define CS35L41_VBBR_STATUS 0x00006410 +#define CS35L41_OVERTEMP_CFG 0x00006414 +#define CS35L41_AMP_ERR_VOL 0x00006418 +#define CS35L41_VOL_STATUS_TO_DSP 0x00006450 +#define CS35L41_CLASSH_CFG 0x00006800 +#define CS35L41_WKFET_CFG 0x00006804 +#define CS35L41_NG_CFG 0x00006808 +#define CS35L41_AMP_GAIN_CTRL 0x00006C04 +#define CS35L41_DAC_MSM_CFG 0x00007400 +#define CS35L41_IRQ1_CFG 0x00010000 +#define CS35L41_IRQ1_STATUS 0x00010004 +#define CS35L41_IRQ1_STATUS1 0x00010010 +#define CS35L41_IRQ1_STATUS2 0x00010014 +#define CS35L41_IRQ1_STATUS3 0x00010018 +#define CS35L41_IRQ1_STATUS4 0x0001001C +#define CS35L41_IRQ1_RAW_STATUS1 0x00010090 +#define CS35L41_IRQ1_RAW_STATUS2 0x00010094 +#define CS35L41_IRQ1_RAW_STATUS3 0x00010098 +#define CS35L41_IRQ1_RAW_STATUS4 0x0001009C +#define CS35L41_IRQ1_MASK1 0x00010110 +#define CS35L41_IRQ1_MASK2 0x00010114 +#define CS35L41_IRQ1_MASK3 0x00010118 +#define CS35L41_IRQ1_MASK4 0x0001011C +#define CS35L41_IRQ1_FRC1 0x00010190 +#define CS35L41_IRQ1_FRC2 0x00010194 +#define CS35L41_IRQ1_FRC3 0x00010198 +#define CS35L41_IRQ1_FRC4 0x0001019C +#define CS35L41_IRQ1_EDGE1 0x00010210 +#define CS35L41_IRQ1_EDGE4 0x0001021C +#define CS35L41_IRQ1_POL1 0x00010290 +#define CS35L41_IRQ1_POL2 0x00010294 +#define CS35L41_IRQ1_POL3 0x00010298 +#define CS35L41_IRQ1_POL4 0x0001029C +#define CS35L41_IRQ1_DB3 0x00010318 +#define CS35L41_IRQ2_CFG 0x00010800 +#define CS35L41_IRQ2_STATUS 0x00010804 +#define CS35L41_IRQ2_STATUS1 0x00010810 +#define CS35L41_IRQ2_STATUS2 0x00010814 +#define CS35L41_IRQ2_STATUS3 0x00010818 +#define CS35L41_IRQ2_STATUS4 0x0001081C +#define CS35L41_IRQ2_RAW_STATUS1 0x00010890 +#define CS35L41_IRQ2_RAW_STATUS2 0x00010894 +#define CS35L41_IRQ2_RAW_STATUS3 0x00010898 +#define CS35L41_IRQ2_RAW_STATUS4 0x0001089C +#define CS35L41_IRQ2_MASK1 0x00010910 +#define CS35L41_IRQ2_MASK2 0x00010914 +#define CS35L41_IRQ2_MASK3 0x00010918 +#define CS35L41_IRQ2_MASK4 0x0001091C +#define CS35L41_IRQ2_FRC1 0x00010990 +#define CS35L41_IRQ2_FRC2 0x00010994 +#define CS35L41_IRQ2_FRC3 0x00010998 +#define CS35L41_IRQ2_FRC4 0x0001099C +#define CS35L41_IRQ2_EDGE1 0x00010A10 +#define CS35L41_IRQ2_EDGE4 0x00010A1C +#define CS35L41_IRQ2_POL1 0x00010A90 +#define CS35L41_IRQ2_POL2 0x00010A94 +#define CS35L41_IRQ2_POL3 0x00010A98 +#define CS35L41_IRQ2_POL4 0x00010A9C +#define CS35L41_IRQ2_DB3 0x00010B18 +#define CS35L41_GPIO_STATUS1 0x00011000 +#define CS35L41_GPIO1_CTRL1 0x00011008 +#define CS35L41_GPIO2_CTRL1 0x0001100C +#define CS35L41_MIXER_NGATE_CFG 0x00012000 +#define CS35L41_MIXER_NGATE_CH1_CFG 0x00012004 +#define CS35L41_MIXER_NGATE_CH2_CFG 0x00012008 +#define CS35L41_DSP_MBOX_1 0x00013000 +#define CS35L41_DSP_MBOX_2 0x00013004 +#define CS35L41_DSP_MBOX_3 0x00013008 +#define CS35L41_DSP_MBOX_4 0x0001300C +#define CS35L41_DSP_MBOX_5 0x00013010 +#define CS35L41_DSP_MBOX_6 0x00013014 +#define CS35L41_DSP_MBOX_7 0x00013018 +#define CS35L41_DSP_MBOX_8 0x0001301C +#define CS35L41_DSP_VIRT1_MBOX_1 0x00013020 +#define CS35L41_DSP_VIRT1_MBOX_2 0x00013024 +#define CS35L41_DSP_VIRT1_MBOX_3 0x00013028 +#define CS35L41_DSP_VIRT1_MBOX_4 0x0001302C +#define CS35L41_DSP_VIRT1_MBOX_5 0x00013030 +#define CS35L41_DSP_VIRT1_MBOX_6 0x00013034 +#define CS35L41_DSP_VIRT1_MBOX_7 0x00013038 +#define CS35L41_DSP_VIRT1_MBOX_8 0x0001303C +#define CS35L41_DSP_VIRT2_MBOX_1 0x00013040 +#define CS35L41_DSP_VIRT2_MBOX_2 0x00013044 +#define CS35L41_DSP_VIRT2_MBOX_3 0x00013048 +#define CS35L41_DSP_VIRT2_MBOX_4 0x0001304C +#define CS35L41_DSP_VIRT2_MBOX_5 0x00013050 +#define CS35L41_DSP_VIRT2_MBOX_6 0x00013054 +#define CS35L41_DSP_VIRT2_MBOX_7 0x00013058 +#define CS35L41_DSP_VIRT2_MBOX_8 0x0001305C +#define CS35L41_CLOCK_DETECT_1 0x00014000 +#define CS35L41_TIMER1_CONTROL 0x00015000 +#define CS35L41_TIMER1_COUNT_PRESET 0x00015004 +#define CS35L41_TIMER1_START_STOP 0x0001500C +#define CS35L41_TIMER1_STATUS 0x00015010 +#define CS35L41_TIMER1_COUNT_READBACK 0x00015014 +#define CS35L41_TIMER1_DSP_CLK_CFG 0x00015018 +#define CS35L41_TIMER1_DSP_CLK_STATUS 0x0001501C +#define CS35L41_TIMER2_CONTROL 0x00015100 +#define CS35L41_TIMER2_COUNT_PRESET 0x00015104 +#define CS35L41_TIMER2_START_STOP 0x0001510C +#define CS35L41_TIMER2_STATUS 0x00015110 +#define CS35L41_TIMER2_COUNT_READBACK 0x00015114 +#define CS35L41_TIMER2_DSP_CLK_CFG 0x00015118 +#define CS35L41_TIMER2_DSP_CLK_STATUS 0x0001511C +#define CS35L41_DFT_JTAG_CONTROL 0x00016000 +#define CS35L41_DIE_STS1 0x00017040 +#define CS35L41_DIE_STS2 0x00017044 +#define CS35L41_TEMP_CAL1 0x00017048 +#define CS35L41_TEMP_CAL2 0x0001704C +#define CS35L41_DSP1_XMEM_PACK_0 0x02000000 +#define CS35L41_DSP1_XMEM_PACK_3068 0x02002FF0 +#define CS35L41_DSP1_XMEM_UNPACK32_0 0x02400000 +#define CS35L41_DSP1_XMEM_UNPACK32_2046 0x02401FF8 +#define CS35L41_DSP1_TIMESTAMP_COUNT 0x025C0800 +#define CS35L41_DSP1_SYS_ID 0x025E0000 +#define CS35L41_DSP1_SYS_VERSION 0x025E0004 +#define CS35L41_DSP1_SYS_CORE_ID 0x025E0008 +#define CS35L41_DSP1_SYS_AHB_ADDR 0x025E000C +#define CS35L41_DSP1_SYS_XSRAM_SIZE 0x025E0010 +#define CS35L41_DSP1_SYS_YSRAM_SIZE 0x025E0018 +#define CS35L41_DSP1_SYS_PSRAM_SIZE 0x025E0020 +#define CS35L41_DSP1_SYS_PM_BOOT_SIZE 0x025E0028 +#define CS35L41_DSP1_SYS_FEATURES 0x025E002C +#define CS35L41_DSP1_SYS_FIR_FILTERS 0x025E0030 +#define CS35L41_DSP1_SYS_LMS_FILTERS 0x025E0034 +#define CS35L41_DSP1_SYS_XM_BANK_SIZE 0x025E0038 +#define CS35L41_DSP1_SYS_YM_BANK_SIZE 0x025E003C +#define CS35L41_DSP1_SYS_PM_BANK_SIZE 0x025E0040 +#define CS35L41_DSP1_AHBM_WIN0_CTRL0 0x025E2000 +#define CS35L41_DSP1_AHBM_WIN0_CTRL1 0x025E2004 +#define CS35L41_DSP1_AHBM_WIN1_CTRL0 0x025E2008 +#define CS35L41_DSP1_AHBM_WIN1_CTRL1 0x025E200C +#define CS35L41_DSP1_AHBM_WIN2_CTRL0 0x025E2010 +#define CS35L41_DSP1_AHBM_WIN2_CTRL1 0x025E2014 +#define CS35L41_DSP1_AHBM_WIN3_CTRL0 0x025E2018 +#define CS35L41_DSP1_AHBM_WIN3_CTRL1 0x025E201C +#define CS35L41_DSP1_AHBM_WIN4_CTRL0 0x025E2020 +#define CS35L41_DSP1_AHBM_WIN4_CTRL1 0x025E2024 +#define CS35L41_DSP1_AHBM_WIN5_CTRL0 0x025E2028 +#define CS35L41_DSP1_AHBM_WIN5_CTRL1 0x025E202C +#define CS35L41_DSP1_AHBM_WIN6_CTRL0 0x025E2030 +#define CS35L41_DSP1_AHBM_WIN6_CTRL1 0x025E2034 +#define CS35L41_DSP1_AHBM_WIN7_CTRL0 0x025E2038 +#define CS35L41_DSP1_AHBM_WIN7_CTRL1 0x025E203C +#define CS35L41_DSP1_AHBM_WIN_DBG_CTRL0 0x025E2040 +#define CS35L41_DSP1_AHBM_WIN_DBG_CTRL1 0x025E2044 +#define CS35L41_DSP1_XMEM_UNPACK24_0 0x02800000 +#define CS35L41_DSP1_XMEM_UNPACK24_4093 0x02803FF4 +#define CS35L41_DSP1_CTRL_BASE 0x02B80000 +#define CS35L41_DSP1_CORE_SOFT_RESET 0x02B80010 +#define CS35L41_DSP1_DEBUG 0x02B80040 +#define CS35L41_DSP1_TIMER_CTRL 0x02B80048 +#define CS35L41_DSP1_STREAM_ARB_CTRL 0x02B80050 +#define CS35L41_DSP1_RX1_RATE 0x02B80080 +#define CS35L41_DSP1_RX2_RATE 0x02B80088 +#define CS35L41_DSP1_RX3_RATE 0x02B80090 +#define CS35L41_DSP1_RX4_RATE 0x02B80098 +#define CS35L41_DSP1_RX5_RATE 0x02B800A0 +#define CS35L41_DSP1_RX6_RATE 0x02B800A8 +#define CS35L41_DSP1_RX7_RATE 0x02B800B0 +#define CS35L41_DSP1_RX8_RATE 0x02B800B8 +#define CS35L41_DSP1_TX1_RATE 0x02B80280 +#define CS35L41_DSP1_TX2_RATE 0x02B80288 +#define CS35L41_DSP1_TX3_RATE 0x02B80290 +#define CS35L41_DSP1_TX4_RATE 0x02B80298 +#define CS35L41_DSP1_TX5_RATE 0x02B802A0 +#define CS35L41_DSP1_TX6_RATE 0x02B802A8 +#define CS35L41_DSP1_TX7_RATE 0x02B802B0 +#define CS35L41_DSP1_TX8_RATE 0x02B802B8 +#define CS35L41_DSP1_NMI_CTRL1 0x02B80480 +#define CS35L41_DSP1_NMI_CTRL2 0x02B80488 +#define CS35L41_DSP1_NMI_CTRL3 0x02B80490 +#define CS35L41_DSP1_NMI_CTRL4 0x02B80498 +#define CS35L41_DSP1_NMI_CTRL5 0x02B804A0 +#define CS35L41_DSP1_NMI_CTRL6 0x02B804A8 +#define CS35L41_DSP1_NMI_CTRL7 0x02B804B0 +#define CS35L41_DSP1_NMI_CTRL8 0x02B804B8 +#define CS35L41_DSP1_RESUME_CTRL 0x02B80500 +#define CS35L41_DSP1_IRQ1_CTRL 0x02B80508 +#define CS35L41_DSP1_IRQ2_CTRL 0x02B80510 +#define CS35L41_DSP1_IRQ3_CTRL 0x02B80518 +#define CS35L41_DSP1_IRQ4_CTRL 0x02B80520 +#define CS35L41_DSP1_IRQ5_CTRL 0x02B80528 +#define CS35L41_DSP1_IRQ6_CTRL 0x02B80530 +#define CS35L41_DSP1_IRQ7_CTRL 0x02B80538 +#define CS35L41_DSP1_IRQ8_CTRL 0x02B80540 +#define CS35L41_DSP1_IRQ9_CTRL 0x02B80548 +#define CS35L41_DSP1_IRQ10_CTRL 0x02B80550 +#define CS35L41_DSP1_IRQ11_CTRL 0x02B80558 +#define CS35L41_DSP1_IRQ12_CTRL 0x02B80560 +#define CS35L41_DSP1_IRQ13_CTRL 0x02B80568 +#define CS35L41_DSP1_IRQ14_CTRL 0x02B80570 +#define CS35L41_DSP1_IRQ15_CTRL 0x02B80578 +#define CS35L41_DSP1_IRQ16_CTRL 0x02B80580 +#define CS35L41_DSP1_IRQ17_CTRL 0x02B80588 +#define CS35L41_DSP1_IRQ18_CTRL 0x02B80590 +#define CS35L41_DSP1_IRQ19_CTRL 0x02B80598 +#define CS35L41_DSP1_IRQ20_CTRL 0x02B805A0 +#define CS35L41_DSP1_IRQ21_CTRL 0x02B805A8 +#define CS35L41_DSP1_IRQ22_CTRL 0x02B805B0 +#define CS35L41_DSP1_IRQ23_CTRL 0x02B805B8 +#define CS35L41_DSP1_SCRATCH1 0x02B805C0 +#define CS35L41_DSP1_SCRATCH2 0x02B805C8 +#define CS35L41_DSP1_SCRATCH3 0x02B805D0 +#define CS35L41_DSP1_SCRATCH4 0x02B805D8 +#define CS35L41_DSP1_CCM_CORE_CTRL 0x02BC1000 +#define CS35L41_DSP1_CCM_CLK_OVERRIDE 0x02BC1008 +#define CS35L41_DSP1_XM_MSTR_EN 0x02BC2000 +#define CS35L41_DSP1_XM_CORE_PRI 0x02BC2008 +#define CS35L41_DSP1_XM_AHB_PACK_PL_PRI 0x02BC2010 +#define CS35L41_DSP1_XM_AHB_UP_PL_PRI 0x02BC2018 +#define CS35L41_DSP1_XM_ACCEL_PL0_PRI 0x02BC2020 +#define CS35L41_DSP1_XM_NPL0_PRI 0x02BC2078 +#define CS35L41_DSP1_YM_MSTR_EN 0x02BC20C0 +#define CS35L41_DSP1_YM_CORE_PRI 0x02BC20C8 +#define CS35L41_DSP1_YM_AHB_PACK_PL_PRI 0x02BC20D0 +#define CS35L41_DSP1_YM_AHB_UP_PL_PRI 0x02BC20D8 +#define CS35L41_DSP1_YM_ACCEL_PL0_PRI 0x02BC20E0 +#define CS35L41_DSP1_YM_NPL0_PRI 0x02BC2138 +#define CS35L41_DSP1_PM_MSTR_EN 0x02BC2180 +#define CS35L41_DSP1_PM_PATCH0_ADDR 0x02BC2188 +#define CS35L41_DSP1_PM_PATCH0_EN 0x02BC218C +#define CS35L41_DSP1_PM_PATCH0_DATA_LO 0x02BC2190 +#define CS35L41_DSP1_PM_PATCH0_DATA_HI 0x02BC2194 +#define CS35L41_DSP1_PM_PATCH1_ADDR 0x02BC2198 +#define CS35L41_DSP1_PM_PATCH1_EN 0x02BC219C +#define CS35L41_DSP1_PM_PATCH1_DATA_LO 0x02BC21A0 +#define CS35L41_DSP1_PM_PATCH1_DATA_HI 0x02BC21A4 +#define CS35L41_DSP1_PM_PATCH2_ADDR 0x02BC21A8 +#define CS35L41_DSP1_PM_PATCH2_EN 0x02BC21AC +#define CS35L41_DSP1_PM_PATCH2_DATA_LO 0x02BC21B0 +#define CS35L41_DSP1_PM_PATCH2_DATA_HI 0x02BC21B4 +#define CS35L41_DSP1_PM_PATCH3_ADDR 0x02BC21B8 +#define CS35L41_DSP1_PM_PATCH3_EN 0x02BC21BC +#define CS35L41_DSP1_PM_PATCH3_DATA_LO 0x02BC21C0 +#define CS35L41_DSP1_PM_PATCH3_DATA_HI 0x02BC21C4 +#define CS35L41_DSP1_PM_PATCH4_ADDR 0x02BC21C8 +#define CS35L41_DSP1_PM_PATCH4_EN 0x02BC21CC +#define CS35L41_DSP1_PM_PATCH4_DATA_LO 0x02BC21D0 +#define CS35L41_DSP1_PM_PATCH4_DATA_HI 0x02BC21D4 +#define CS35L41_DSP1_PM_PATCH5_ADDR 0x02BC21D8 +#define CS35L41_DSP1_PM_PATCH5_EN 0x02BC21DC +#define CS35L41_DSP1_PM_PATCH5_DATA_LO 0x02BC21E0 +#define CS35L41_DSP1_PM_PATCH5_DATA_HI 0x02BC21E4 +#define CS35L41_DSP1_PM_PATCH6_ADDR 0x02BC21E8 +#define CS35L41_DSP1_PM_PATCH6_EN 0x02BC21EC +#define CS35L41_DSP1_PM_PATCH6_DATA_LO 0x02BC21F0 +#define CS35L41_DSP1_PM_PATCH6_DATA_HI 0x02BC21F4 +#define CS35L41_DSP1_PM_PATCH7_ADDR 0x02BC21F8 +#define CS35L41_DSP1_PM_PATCH7_EN 0x02BC21FC +#define CS35L41_DSP1_PM_PATCH7_DATA_LO 0x02BC2200 +#define CS35L41_DSP1_PM_PATCH7_DATA_HI 0x02BC2204 +#define CS35L41_DSP1_MPU_XM_ACCESS0 0x02BC3000 +#define CS35L41_DSP1_MPU_YM_ACCESS0 0x02BC3004 +#define CS35L41_DSP1_MPU_WNDW_ACCESS0 0x02BC3008 +#define CS35L41_DSP1_MPU_XREG_ACCESS0 0x02BC300C +#define CS35L41_DSP1_MPU_YREG_ACCESS0 0x02BC3014 +#define CS35L41_DSP1_MPU_XM_ACCESS1 0x02BC3018 +#define CS35L41_DSP1_MPU_YM_ACCESS1 0x02BC301C +#define CS35L41_DSP1_MPU_WNDW_ACCESS1 0x02BC3020 +#define CS35L41_DSP1_MPU_XREG_ACCESS1 0x02BC3024 +#define CS35L41_DSP1_MPU_YREG_ACCESS1 0x02BC302C +#define CS35L41_DSP1_MPU_XM_ACCESS2 0x02BC3030 +#define CS35L41_DSP1_MPU_YM_ACCESS2 0x02BC3034 +#define CS35L41_DSP1_MPU_WNDW_ACCESS2 0x02BC3038 +#define CS35L41_DSP1_MPU_XREG_ACCESS2 0x02BC303C +#define CS35L41_DSP1_MPU_YREG_ACCESS2 0x02BC3044 +#define CS35L41_DSP1_MPU_XM_ACCESS3 0x02BC3048 +#define CS35L41_DSP1_MPU_YM_ACCESS3 0x02BC304C +#define CS35L41_DSP1_MPU_WNDW_ACCESS3 0x02BC3050 +#define CS35L41_DSP1_MPU_XREG_ACCESS3 0x02BC3054 +#define CS35L41_DSP1_MPU_YREG_ACCESS3 0x02BC305C +#define CS35L41_DSP1_MPU_XM_VIO_ADDR 0x02BC3100 +#define CS35L41_DSP1_MPU_XM_VIO_STATUS 0x02BC3104 +#define CS35L41_DSP1_MPU_YM_VIO_ADDR 0x02BC3108 +#define CS35L41_DSP1_MPU_YM_VIO_STATUS 0x02BC310C +#define CS35L41_DSP1_MPU_PM_VIO_ADDR 0x02BC3110 +#define CS35L41_DSP1_MPU_PM_VIO_STATUS 0x02BC3114 +#define CS35L41_DSP1_MPU_LOCK_CONFIG 0x02BC3140 +#define CS35L41_DSP1_MPU_WDT_RST_CTRL 0x02BC3180 +#define CS35L41_DSP1_STRMARB_MSTR0_CFG0 0x02BC5000 +#define CS35L41_DSP1_STRMARB_MSTR0_CFG1 0x02BC5004 +#define CS35L41_DSP1_STRMARB_MSTR0_CFG2 0x02BC5008 +#define CS35L41_DSP1_STRMARB_MSTR1_CFG0 0x02BC5010 +#define CS35L41_DSP1_STRMARB_MSTR1_CFG1 0x02BC5014 +#define CS35L41_DSP1_STRMARB_MSTR1_CFG2 0x02BC5018 +#define CS35L41_DSP1_STRMARB_MSTR2_CFG0 0x02BC5020 +#define CS35L41_DSP1_STRMARB_MSTR2_CFG1 0x02BC5024 +#define CS35L41_DSP1_STRMARB_MSTR2_CFG2 0x02BC5028 +#define CS35L41_DSP1_STRMARB_MSTR3_CFG0 0x02BC5030 +#define CS35L41_DSP1_STRMARB_MSTR3_CFG1 0x02BC5034 +#define CS35L41_DSP1_STRMARB_MSTR3_CFG2 0x02BC5038 +#define CS35L41_DSP1_STRMARB_MSTR4_CFG0 0x02BC5040 +#define CS35L41_DSP1_STRMARB_MSTR4_CFG1 0x02BC5044 +#define CS35L41_DSP1_STRMARB_MSTR4_CFG2 0x02BC5048 +#define CS35L41_DSP1_STRMARB_MSTR5_CFG0 0x02BC5050 +#define CS35L41_DSP1_STRMARB_MSTR5_CFG1 0x02BC5054 +#define CS35L41_DSP1_STRMARB_MSTR5_CFG2 0x02BC5058 +#define CS35L41_DSP1_STRMARB_MSTR6_CFG0 0x02BC5060 +#define CS35L41_DSP1_STRMARB_MSTR6_CFG1 0x02BC5064 +#define CS35L41_DSP1_STRMARB_MSTR6_CFG2 0x02BC5068 +#define CS35L41_DSP1_STRMARB_MSTR7_CFG0 0x02BC5070 +#define CS35L41_DSP1_STRMARB_MSTR7_CFG1 0x02BC5074 +#define CS35L41_DSP1_STRMARB_MSTR7_CFG2 0x02BC5078 +#define CS35L41_DSP1_STRMARB_TX0_CFG0 0x02BC5200 +#define CS35L41_DSP1_STRMARB_TX0_CFG1 0x02BC5204 +#define CS35L41_DSP1_STRMARB_TX1_CFG0 0x02BC5208 +#define CS35L41_DSP1_STRMARB_TX1_CFG1 0x02BC520C +#define CS35L41_DSP1_STRMARB_TX2_CFG0 0x02BC5210 +#define CS35L41_DSP1_STRMARB_TX2_CFG1 0x02BC5214 +#define CS35L41_DSP1_STRMARB_TX3_CFG0 0x02BC5218 +#define CS35L41_DSP1_STRMARB_TX3_CFG1 0x02BC521C +#define CS35L41_DSP1_STRMARB_TX4_CFG0 0x02BC5220 +#define CS35L41_DSP1_STRMARB_TX4_CFG1 0x02BC5224 +#define CS35L41_DSP1_STRMARB_TX5_CFG0 0x02BC5228 +#define CS35L41_DSP1_STRMARB_TX5_CFG1 0x02BC522C +#define CS35L41_DSP1_STRMARB_TX6_CFG0 0x02BC5230 +#define CS35L41_DSP1_STRMARB_TX6_CFG1 0x02BC5234 +#define CS35L41_DSP1_STRMARB_TX7_CFG0 0x02BC5238 +#define CS35L41_DSP1_STRMARB_TX7_CFG1 0x02BC523C +#define CS35L41_DSP1_STRMARB_RX0_CFG0 0x02BC5400 +#define CS35L41_DSP1_STRMARB_RX0_CFG1 0x02BC5404 +#define CS35L41_DSP1_STRMARB_RX1_CFG0 0x02BC5408 +#define CS35L41_DSP1_STRMARB_RX1_CFG1 0x02BC540C +#define CS35L41_DSP1_STRMARB_RX2_CFG0 0x02BC5410 +#define CS35L41_DSP1_STRMARB_RX2_CFG1 0x02BC5414 +#define CS35L41_DSP1_STRMARB_RX3_CFG0 0x02BC5418 +#define CS35L41_DSP1_STRMARB_RX3_CFG1 0x02BC541C +#define CS35L41_DSP1_STRMARB_RX4_CFG0 0x02BC5420 +#define CS35L41_DSP1_STRMARB_RX4_CFG1 0x02BC5424 +#define CS35L41_DSP1_STRMARB_RX5_CFG0 0x02BC5428 +#define CS35L41_DSP1_STRMARB_RX5_CFG1 0x02BC542C +#define CS35L41_DSP1_STRMARB_RX6_CFG0 0x02BC5430 +#define CS35L41_DSP1_STRMARB_RX6_CFG1 0x02BC5434 +#define CS35L41_DSP1_STRMARB_RX7_CFG0 0x02BC5438 +#define CS35L41_DSP1_STRMARB_RX7_CFG1 0x02BC543C +#define CS35L41_DSP1_STRMARB_IRQ0_CFG0 0x02BC5600 +#define CS35L41_DSP1_STRMARB_IRQ0_CFG1 0x02BC5604 +#define CS35L41_DSP1_STRMARB_IRQ0_CFG2 0x02BC5608 +#define CS35L41_DSP1_STRMARB_IRQ1_CFG0 0x02BC5610 +#define CS35L41_DSP1_STRMARB_IRQ1_CFG1 0x02BC5614 +#define CS35L41_DSP1_STRMARB_IRQ1_CFG2 0x02BC5618 +#define CS35L41_DSP1_STRMARB_IRQ2_CFG0 0x02BC5620 +#define CS35L41_DSP1_STRMARB_IRQ2_CFG1 0x02BC5624 +#define CS35L41_DSP1_STRMARB_IRQ2_CFG2 0x02BC5628 +#define CS35L41_DSP1_STRMARB_IRQ3_CFG0 0x02BC5630 +#define CS35L41_DSP1_STRMARB_IRQ3_CFG1 0x02BC5634 +#define CS35L41_DSP1_STRMARB_IRQ3_CFG2 0x02BC5638 +#define CS35L41_DSP1_STRMARB_IRQ4_CFG0 0x02BC5640 +#define CS35L41_DSP1_STRMARB_IRQ4_CFG1 0x02BC5644 +#define CS35L41_DSP1_STRMARB_IRQ4_CFG2 0x02BC5648 +#define CS35L41_DSP1_STRMARB_IRQ5_CFG0 0x02BC5650 +#define CS35L41_DSP1_STRMARB_IRQ5_CFG1 0x02BC5654 +#define CS35L41_DSP1_STRMARB_IRQ5_CFG2 0x02BC5658 +#define CS35L41_DSP1_STRMARB_IRQ6_CFG0 0x02BC5660 +#define CS35L41_DSP1_STRMARB_IRQ6_CFG1 0x02BC5664 +#define CS35L41_DSP1_STRMARB_IRQ6_CFG2 0x02BC5668 +#define CS35L41_DSP1_STRMARB_IRQ7_CFG0 0x02BC5670 +#define CS35L41_DSP1_STRMARB_IRQ7_CFG1 0x02BC5674 +#define CS35L41_DSP1_STRMARB_IRQ7_CFG2 0x02BC5678 +#define CS35L41_DSP1_STRMARB_RESYNC_MSK 0x02BC5A00 +#define CS35L41_DSP1_STRMARB_ERR_STATUS 0x02BC5A08 +#define CS35L41_DSP1_INTPCTL_RES_STATIC 0x02BC6000 +#define CS35L41_DSP1_INTPCTL_RES_DYN 0x02BC6004 +#define CS35L41_DSP1_INTPCTL_NMI_CTRL 0x02BC6008 +#define CS35L41_DSP1_INTPCTL_IRQ_INV 0x02BC6010 +#define CS35L41_DSP1_INTPCTL_IRQ_MODE 0x02BC6014 +#define CS35L41_DSP1_INTPCTL_IRQ_EN 0x02BC6018 +#define CS35L41_DSP1_INTPCTL_IRQ_MSK 0x02BC601C +#define CS35L41_DSP1_INTPCTL_IRQ_FLUSH 0x02BC6020 +#define CS35L41_DSP1_INTPCTL_IRQ_MSKCLR 0x02BC6024 +#define CS35L41_DSP1_INTPCTL_IRQ_FRC 0x02BC6028 +#define CS35L41_DSP1_INTPCTL_IRQ_MSKSET 0x02BC602C +#define CS35L41_DSP1_INTPCTL_IRQ_ERR 0x02BC6030 +#define CS35L41_DSP1_INTPCTL_IRQ_PEND 0x02BC6034 +#define CS35L41_DSP1_INTPCTL_IRQ_GEN 0x02BC6038 +#define CS35L41_DSP1_INTPCTL_TESTBITS 0x02BC6040 +#define CS35L41_DSP1_WDT_CONTROL 0x02BC7000 +#define CS35L41_DSP1_WDT_STATUS 0x02BC7008 +#define CS35L41_DSP1_YMEM_PACK_0 0x02C00000 +#define CS35L41_DSP1_YMEM_PACK_1532 0x02C017F0 +#define CS35L41_DSP1_YMEM_UNPACK32_0 0x03000000 +#define CS35L41_DSP1_YMEM_UNPACK32_1022 0x03000FF8 +#define CS35L41_DSP1_YMEM_UNPACK24_0 0x03400000 +#define CS35L41_DSP1_YMEM_UNPACK24_2045 0x03401FF4 +#define CS35L41_DSP1_PMEM_0 0x03800000 +#define CS35L41_DSP1_PMEM_5114 0x03804FE8 + +/*test regs for emulation bringup*/ +#define CS35L41_PLL_OVR 0x00003018 +#define CS35L41_BST_TEST_DUTY 0x00003900 +#define CS35L41_DIGPWM_IOCTRL 0x0000706C + +/*registers populated by OTP*/ +#define CS35L41_OTP_TRIM_1 0x0000208c +#define CS35L41_OTP_TRIM_2 0x00002090 +#define CS35L41_OTP_TRIM_3 0x00003010 +#define CS35L41_OTP_TRIM_4 0x0000300C +#define CS35L41_OTP_TRIM_5 0x0000394C +#define CS35L41_OTP_TRIM_6 0x00003950 +#define CS35L41_OTP_TRIM_7 0x00003954 +#define CS35L41_OTP_TRIM_8 0x00003958 +#define CS35L41_OTP_TRIM_9 0x0000395C +#define CS35L41_OTP_TRIM_10 0x0000416C +#define CS35L41_OTP_TRIM_11 0x00004160 +#define CS35L41_OTP_TRIM_12 0x00004170 +#define CS35L41_OTP_TRIM_13 0x00004360 +#define CS35L41_OTP_TRIM_14 0x00004448 +#define CS35L41_OTP_TRIM_15 0x0000444C +#define CS35L41_OTP_TRIM_16 0x00006E30 +#define CS35L41_OTP_TRIM_17 0x00006E34 +#define CS35L41_OTP_TRIM_18 0x00006E38 +#define CS35L41_OTP_TRIM_19 0x00006E3C +#define CS35L41_OTP_TRIM_20 0x00006E40 +#define CS35L41_OTP_TRIM_21 0x00006E44 +#define CS35L41_OTP_TRIM_22 0x00006E48 +#define CS35L41_OTP_TRIM_23 0x00006E4C +#define CS35L41_OTP_TRIM_24 0x00006E50 +#define CS35L41_OTP_TRIM_25 0x00006E54 +#define CS35L41_OTP_TRIM_26 0x00006E58 +#define CS35L41_OTP_TRIM_27 0x00006E5C +#define CS35L41_OTP_TRIM_28 0x00006E60 +#define CS35L41_OTP_TRIM_29 0x00006E64 +#define CS35L41_OTP_TRIM_30 0x00007418 +#define CS35L41_OTP_TRIM_31 0x0000741C +#define CS35L41_OTP_TRIM_32 0x00007434 +#define CS35L41_OTP_TRIM_33 0x00007068 +#define CS35L41_OTP_TRIM_34 0x0000410C +#define CS35L41_OTP_TRIM_35 0x0000400C +#define CS35L41_OTP_TRIM_36 0x00002030 + +#define CS35L41_MAX_CACHE_REG 0x0000006B +#define CS35L41_OTP_SIZE_WORDS 32 +#define CS35L41_NUM_OTP_ELEM 100 +#define CS35L41_NUM_OTP_MAPS 3 + +#define CS35L41_VALID_PDATA 0x80000000 + +#define CS35L41_SCLK_MSTR_MASK 0x10 +#define CS35L41_SCLK_MSTR_SHIFT 4 +#define CS35L41_LRCLK_MSTR_MASK 0x01 +#define CS35L41_LRCLK_MSTR_SHIFT 0 +#define CS35L41_SCLK_INV_MASK 0x40 +#define CS35L41_SCLK_INV_SHIFT 6 +#define CS35L41_LRCLK_INV_MASK 0x04 +#define CS35L41_LRCLK_INV_SHIFT 2 +#define CS35L41_SCLK_FRC_MASK 0x20 +#define CS35L41_SCLK_FRC_SHIFT 5 +#define CS35L41_LRCLK_FRC_MASK 0x02 +#define CS35L41_LRCLK_FRC_SHIFT 1 + +#define CS35L41_AMP_GAIN_ZC_MASK 0x0400 +#define CS35L41_AMP_GAIN_ZC_SHIFT 10 + +#define CS35L41_BST_CTL_MASK 0xFF +#define CS35L41_BST_CTL_SEL_MASK 0x03 +#define CS35L41_BST_CTL_SEL_REG 0x00 +#define CS35L41_BST_CTL_SEL_CLASSH 0x01 +#define CS35L41_BST_IPK_MASK 0x7F +#define CS35L41_BST_IPK_SHIFT 0 +#define CS35L41_BST_LIM_MASK 0x4 +#define CS35L41_BST_LIM_SHIFT 2 +#define CS35L41_BST_K1_MASK 0x000000FF +#define CS35L41_BST_K1_SHIFT 0 +#define CS35L41_BST_K2_MASK 0x0000FF00 +#define CS35L41_BST_K2_SHIFT 8 +#define CS35L41_BST_SLOPE_MASK 0x0000FF00 +#define CS35L41_BST_SLOPE_SHIFT 8 +#define CS35L41_BST_LBST_VAL_MASK 0x00000003 +#define CS35L41_BST_LBST_VAL_SHIFT 0 + +#define CS35L41_TEMP_THLD_MASK 0x03 +#define CS35L41_VMON_IMON_VOL_MASK 0x07FF07FF +#define CS35L41_PDM_MODE_MASK 0x01 +#define CS35L41_PDM_MODE_SHIFT 0 + +#define CS35L41_CH_MEM_DEPTH_MASK 0x07 +#define CS35L41_CH_MEM_DEPTH_SHIFT 0 +#define CS35L41_CH_HDRM_CTL_MASK 0x007F0000 +#define CS35L41_CH_HDRM_CTL_SHIFT 16 +#define CS35L41_CH_REL_RATE_MASK 0xFF00 +#define CS35L41_CH_REL_RATE_SHIFT 8 +#define CS35L41_CH_WKFET_DLY_MASK 0x001C +#define CS35L41_CH_WKFET_DLY_SHIFT 2 +#define CS35L41_CH_WKFET_THLD_MASK 0x0F00 +#define CS35L41_CH_WKFET_THLD_SHIFT 8 + +#define CS35L41_NG_ENABLE_MASK 0x00010000 +#define CS35L41_NG_ENABLE_SHIFT 16 +#define CS35L41_NG_THLD_MASK 0x7 +#define CS35L41_NG_THLD_SHIFT 0 +#define CS35L41_NG_DELAY_MASK 0x0F00 +#define CS35L41_NG_DELAY_SHIFT 8 + +#define CS35L41_ASP_FMT_MASK 0x0700 +#define CS35L41_ASP_FMT_SHIFT 8 +#define CS35L41_ASP_DOUT_HIZ_MASK 0x03 +#define CS35L41_ASP_DOUT_HIZ_SHIFT 0 +#define CS35L41_ASP_WIDTH_16 0x10 +#define CS35L41_ASP_WIDTH_24 0x18 +#define CS35L41_ASP_WIDTH_32 0x20 +#define CS35L41_ASP_WIDTH_TX_MASK 0xFF0000 +#define CS35L41_ASP_WIDTH_TX_SHIFT 16 +#define CS35L41_ASP_WIDTH_RX_MASK 0xFF000000 +#define CS35L41_ASP_WIDTH_RX_SHIFT 24 +#define CS35L41_ASP_RX1_SLOT_MASK 0x3F +#define CS35L41_ASP_RX1_SLOT_SHIFT 0 +#define CS35L41_ASP_RX2_SLOT_MASK 0x3F00 +#define CS35L41_ASP_RX2_SLOT_SHIFT 8 +#define CS35L41_ASP_RX_WL_MASK 0x3F +#define CS35L41_ASP_TX_WL_MASK 0x3F +#define CS35L41_ASP_RX_WL_SHIFT 0 +#define CS35L41_ASP_TX_WL_SHIFT 0 +#define CS35L41_ASP_SOURCE_MASK 0x7F + +#define CS35L41_INPUT_SRC_ASPRX1 0x08 +#define CS35L41_INPUT_SRC_ASPRX2 0x09 +#define CS35L41_INPUT_SRC_VMON 0x18 +#define CS35L41_INPUT_SRC_IMON 0x19 +#define CS35L41_INPUT_SRC_CLASSH 0x21 +#define CS35L41_INPUT_SRC_VPMON 0x28 +#define CS35L41_INPUT_SRC_VBSTMON 0x29 +#define CS35L41_INPUT_SRC_TEMPMON 0x3A +#define CS35L41_INPUT_SRC_RSVD 0x3B +#define CS35L41_INPUT_DSP_TX1 0x32 +#define CS35L41_INPUT_DSP_TX2 0x33 + +#define CS35L41_PLL_CLK_SEL_MASK 0x07 +#define CS35L41_PLL_CLK_SEL_SHIFT 0 +#define CS35L41_PLL_CLK_EN_MASK 0x10 +#define CS35L41_PLL_CLK_EN_SHIFT 4 +#define CS35L41_PLL_OPENLOOP_MASK 0x0800 +#define CS35L41_PLL_OPENLOOP_SHIFT 11 +#define CS35L41_PLLSRC_SCLK 0 +#define CS35L41_PLLSRC_LRCLK 1 +#define CS35L41_PLLSRC_SELF 3 +#define CS35L41_PLLSRC_PDMCLK 4 +#define CS35L41_PLLSRC_MCLK 5 +#define CS35L41_PLLSRC_SWIRE 7 +#define CS35L41_REFCLK_FREQ_MASK 0x7E0 +#define CS35L41_REFCLK_FREQ_SHIFT 5 + +#define CS35L41_GLOBAL_FS_MASK 0x1F +#define CS35L41_GLOBAL_FS_SHIFT 0 + +#define CS35L41_GLOBAL_EN_MASK 0x01 +#define CS35L41_GLOBAL_EN_SHIFT 0 +#define CS35L41_BST_EN_MASK 0x0030 +#define CS35L41_BST_EN_SHIFT 4 +#define CS35L41_BST_EN_DEFAULT 0x2 + +#define CS35L41_PDN_DONE_MASK 0x00800000 +#define CS35L41_PDN_DONE_SHIFT 23 +#define CS35L41_PUP_DONE_MASK 0x01000000 +#define CS35L41_PUP_DONE_SHIFT 24 + +#define CS35L36_PUP_DONE_IRQ_UNMASK 0x5F +#define CS35L36_PUP_DONE_IRQ_MASK 0xBF + +#define CS35L41_AMP_SHORT_ERR 0x80000000 +#define CS35L41_BST_SHORT_ERR 0x0100 +#define CS35L41_TEMP_WARN 0x8000 +#define CS35L41_TEMP_ERR 0x00020000 +#define CS35L41_BST_OVP_ERR 0x40 +#define CS35L41_BST_DCM_UVP_ERR 0x80 +#define CS35L41_OTP_BOOT_DONE 0x02 +#define CS35L41_PLL_UNLOCK 0x10 +#define CS35L41_OTP_BOOT_ERR 0x80000000 + +#define CS35L41_AMP_SHORT_ERR_RLS 0x02 +#define CS35L41_BST_SHORT_ERR_RLS 0x04 +#define CS35L41_BST_OVP_ERR_RLS 0x08 +#define CS35L41_BST_UVP_ERR_RLS 0x10 +#define CS35L41_TEMP_WARN_ERR_RLS 0x20 +#define CS35L41_TEMP_ERR_RLS 0x40 + +#define CS35L41_INT1_MASK_DEFAULT 0x7FFCFE3F +#define CS35L41_INT1_UNMASK_PUP 0xFEFFFFFF +#define CS35L41_INT1_UNMASK_PDN 0xFF7FFFFF + +#define CS35L41_GPIO_DIR_MASK 0x80000000 +#define CS35L41_GPIO1_CTRL_MASK 0x00030000 +#define CS35L41_GPIO1_CTRL_SHIFT 16 +#define CS35L41_GPIO2_CTRL_MASK 0x07000000 +#define CS35L41_GPIO2_CTRL_SHIFT 24 +#define CS35L41_GPIO_CTRL_ACTV_LO 4 +#define CS35L41_GPIO_CTRL_ACTV_HI 5 +#define CS35L41_GPIO_POL_MASK 0x1000 +#define CS35L41_GPIO_POL_SHIFT 12 + +#define CS35L41_CHIP_ID 0x35a40 +#define CS35L41R_CHIP_ID 0x35b40 +#define CS35L41_MTLREVID_MASK 0x0F +#define CS35L41_REVID_A0 0xA0 +#define CS35L41_REVID_B0 0xB0 + +#define CS35L41_DSP_N_RX_RATES 8 +#define CS35L41_DSP_N_TX_RATES 8 +#define CS35L41_HALO_CORE_RESET 0x00000200 + +#define CS35L41_SPI_MAX_FREQ_OTP 4000000 + +#define CS35L41_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE) +#define CS35L41_TX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE \ + | SNDRV_PCM_FMTBIT_S32_LE) + +bool cs35l41_readable_reg(struct device *dev, unsigned int reg); +bool cs35l41_precious_reg(struct device *dev, unsigned int reg); +bool cs35l41_volatile_reg(struct device *dev, unsigned int reg); + +struct cs35l41_otp_packed_element_t { + u32 reg; + u8 shift; + u8 size; +}; + +struct cs35l41_otp_map_element_t { + u32 id; + u32 num_elements; + const struct cs35l41_otp_packed_element_t *map; + u32 bit_offset; + u32 word_offset; +}; + +extern const struct reg_default cs35l41_reg[CS35L41_MAX_CACHE_REG]; +extern const struct cs35l41_otp_map_element_t + cs35l41_otp_map_map[CS35L41_NUM_OTP_MAPS]; + +#define CS35L41_REGSTRIDE 4 +#define CS35L41_MBOXWAIT 100 + +#define CS35L41_DSP_VIRT1_MBOX_SHIFT 20 +#define CS35L41_DSP_VIRT2_MBOX_SHIFT 21 +#define CS35L41_CSPL_MBOX_STS CS35L41_DSP_MBOX_2 +/* Firmware update following reg */ +#define CS35L41_CSPL_MBOX_CMD_FW CS35L41_DSP_VIRT2_MBOX_1 +#define CS35L41_CSPL_MBOX_CMD_FW_SHIFT CS35L41_DSP_VIRT2_MBOX_SHIFT +/* Driver update following reg */ +#define CS35L41_CSPL_MBOX_CMD_DRV CS35L41_DSP_VIRT1_MBOX_1 +#define CS35L41_CSPL_MBOX_CMD_DRV_SHIFT CS35L41_DSP_VIRT1_MBOX_SHIFT + +enum cs35l41_cspl_mboxstate { + CSPL_MBOX_STS_RUNNING = 0, + CSPL_MBOX_STS_PAUSED = 1, + CSPL_MBOX_STS_RDY_FOR_REINIT = 2, +}; + +enum cs35l41_cspl_mboxcmd { + CSPL_MBOX_CMD_NONE = 0, + CSPL_MBOX_CMD_PAUSE = 1, + CSPL_MBOX_CMD_RESUME = 2, + CSPL_MBOX_CMD_REINIT = 3, + CSPL_MBOX_CMD_STOP_PRE_REINIT = 4, + CSPL_MBOX_CMD_UNKNOWN_CMD = -1, + CSPL_MBOX_CMD_INVALID_SEQUENCE = -2, +}; + +#endif /*__CS35L41_H__*/ diff --git a/asoc/codecs/cs35l41/cs35l41.txt b/asoc/codecs/cs35l41/cs35l41.txt new file mode 100755 index 000000000000..9ce49ac9ac68 --- /dev/null +++ b/asoc/codecs/cs35l41/cs35l41.txt @@ -0,0 +1,184 @@ +CS35L41 Speaker Amplifier + +Required properties: + + - compatible : "cirrus,cs35l41" + "cirrus,cs35l40" + + - reg : the SPI chip select line for the device + + - VA-supply, VP-supply : power supplies for the device, + as covered in + Documentation/devicetree/bindings/regulator/regulator.txt. + +Optional properties: + - cirrus,sclk-force-output : Audio serial port SCLK force + output control. Forces the SCLK to continue to drive even + if no ASP_TXn channels are enabled. + + - cirrus,lrclk-force-output : Audio serial port LRCLK force + output control. Forces the LRCLK to continue to drive even + if no ASP_TXn channels are enabled. + + - cirrus,right-channel-amp : Boolean to determine which channel + the amplifier is to receive the audio data on. If present the + amplifier receives data on the right channel of I2S data. + If not present the amplifier receives data on the left + channel of I2S data + + - cirrus,boost-ctl-millivolt : Boost Voltage Value. Configures the + boost converter's output voltage in mV. The range is from 2550 mV to + 11000 mV with increments of 50 mV. + (Default) VP + + Boost hardware configuration: + + These three properties should be used together to specify the external + component configuration of the part. See section 4.3.6 of the datasheet + for details regarding how these values are used to configure the + digital boost converter's control loop. + + - cirrus,boost-peak-milliamp : Boost-converter peak current limit in mA. + Configures the peak current by monitoring the current through the boost FET. + Range starts at 1600 mA and goes to a maximum of 4500 mA with increments + of 50 mA. + (Default) 4.50 Amps + + - cirrus,boost-ind-nanohenry : Boost inductor value, expressed in nH. Valid + values include 1000, 1200, 1500 and 2200. + + - cirrus,boost-cap-microfarad : Total equivalent boost capacitance on the VBST + and VAMP pins, derated at 11 volts DC. The value must be rounded to the + nearest integer and expressed in uF. + + - cirrus,amp-gain-zc : Boolean to determine whether to use the amplifier + gain-change zero-crossing feature. If the feature is enabled, any + user-controlled amplifier gain change will occur on a zero-crossing point. + (Default) Disabled + + - cirrus,temp-warn-threshold : Amplifier overtemperature warning threshold. + Configures the threshold at which the overtemperature warning condition occurs. + When the threshold is met, the ovetemperature warning attenuation is applied + and the TEMP_WARN_EINT interrupt status bit is set. + If TEMP_WARN_MASK = 0, INTb is asserted. + + 0 = 105C + 1 = 115C + 2 = 125C (Default) + 3 = 135C + + - cirrus,noise-gate-enable : DSP Noise Gate feature. If present, noise + gate feature will be enabled. + + - cirrus,noise-gate-threshold : Threshold of audio signal input which the + noise gate considers the input audio to be at a low enough level to be + valid to enter a noise gating state of operation. + + 0 = -66 dBFS + 1 = -72 dBFS + 2 = -78 dBFS + 3 = -84 dBFS (default) + 4 = -90 dBFS + 5 = -96 dBFS + 6 = -102 dBFS + 7 = -108 dBFS + + - cirrus,noise-gate-delay : Time that the incoming audio signal must be + below the noise gate threshold prior to entering a noise gated state + + 0 = 5 ms + 1 = 10 ms + 2 = 25 ms + 3 = 50 ms (default) + 4 = 100 ms + 5 = 250 ms + 6 = 500 ms + 7 = 1 s + 8 = 5 s + 9 = 10 s + 10 = 20 s + 11 = 30 s + 12 = 40 s + 13 = 50 s + 14 = 60 s + 15 = 120 s + +Optional H/G Algorithm sub-node: + + The cs35l41 node can have a single "cirrus,classh-internal-algo" sub-node + that will disable automatic control of the internal H/G Algorithm. + + It is strongly recommended that the Datasheet be referenced when adjusting + or using these Class H Algorithm controls over the internal Algorithm. + Serious damage can occur to the Device and surrounding components. + + - cirrus,classh-internal-algo : Sub-node for the Internal Class H Algorithm + See Section 4.4 Internal Class H Algorithm in the Datasheet. + If not used, the device manages the ClassH Algorithm internally. + +Optional properties for the "cirrus,classh-internal-algo" Sub-node + + Section 7.9 Boost Control + - cirrus,classh-bst-overide : Boolean + - cirrus,classh-bst-max-limit + + Section 7.17 Class H, Weak-FET Control + - cirrus,classh-headroom + - cirrus,classh-release-rate + - cirrus,classh-mem-depth + - cirrus,classh-wk-fet-delay + - cirrus,classh-wk-fet-thld + + +Optional GPIO1 sub-node: + +The cs35l41 node can have an single "cirrus,gpio-config1" sub-node for +configuring the GPIO1 pin. + +- cirrus,gpio-polarity-invert : Boolean which specifies whether the GPIO1 +level is inverted. If this property is not present the level is not inverted. + +- cirrus,gpio-output-enable : Boolean which specifies whether the GPIO1 pin +is configured as an output. If this property is not present the +pin will be configured as an input. + +- cirrus,gpio-src-select : Configures the function of the GPIO1 pin. +Note that the options are different from the GPIO2 pin. + +0 = High Impedance (Default) +1 = GPIO +2 = Sync +3 = MCLK input + + +Optional GPIO2 sub-node: + +The cs35l41 node can have an single "cirrus,gpio-config2" sub-node for +configuring the GPIO1 pin. + +- cirrus,gpio-polarity-invert : Boolean which specifies whether the GPIO2 +level is inverted. If this property is not present the level is not inverted. + +- cirrus,gpio-output-enable : Boolean which specifies whether the GPIO2 pin +is configured as an output. If this property is not present the +pin will be configured as an input. + +- cirrus,gpio-src-select : Configures the function of the GPIO2 pin. +Note that the options are different from the GPIO1 pin. + +0 = High Impedance (Default) +1 = GPIO +2 = Open Drain INTB +3 = MCLK input +4 = Push-pull INTB (active low) +5 = Push-pull INT (active high) + + +Example: + +cs35l41: cs35l41@2 { + compatible = "cirrus,cs35l41"; + reg = <2>; + VA-supply = <&dummy_vreg>; + VP-supply = <&dummy_vreg>; +}; diff --git a/asoc/codecs/cs35l41/wm_adsp.c b/asoc/codecs/cs35l41/wm_adsp.c new file mode 100755 index 000000000000..2e028ac6ef36 --- /dev/null +++ b/asoc/codecs/cs35l41/wm_adsp.c @@ -0,0 +1,5113 @@ +/* + * wm_adsp.c -- Wolfson ADSP support + * + * Copyright 2012 Wolfson Microelectronics plc + * + * Author: Mark Brown + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#define DEBUG +//#define WM_ADSP_DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wm_adsp.h" + +#define adsp_crit(_dsp, fmt, ...) \ + dev_crit(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) +#define adsp_err(_dsp, fmt, ...) \ + dev_err(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) +#define adsp_warn(_dsp, fmt, ...) \ + dev_warn(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) +#define adsp_info(_dsp, fmt, ...) \ + dev_info(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) +#define adsp_dbg(_dsp, fmt, ...) \ + dev_info(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) + +#define MAXBULK 4 /* Max byte I2C bulk limit */ + +#define ADSP1_CONTROL_1 0x00 +#define ADSP1_CONTROL_2 0x02 +#define ADSP1_CONTROL_3 0x03 +#define ADSP1_CONTROL_4 0x04 +#define ADSP1_CONTROL_5 0x06 +#define ADSP1_CONTROL_6 0x07 +#define ADSP1_CONTROL_7 0x08 +#define ADSP1_CONTROL_8 0x09 +#define ADSP1_CONTROL_9 0x0A +#define ADSP1_CONTROL_10 0x0B +#define ADSP1_CONTROL_11 0x0C +#define ADSP1_CONTROL_12 0x0D +#define ADSP1_CONTROL_13 0x0F +#define ADSP1_CONTROL_14 0x10 +#define ADSP1_CONTROL_15 0x11 +#define ADSP1_CONTROL_16 0x12 +#define ADSP1_CONTROL_17 0x13 +#define ADSP1_CONTROL_18 0x14 +#define ADSP1_CONTROL_19 0x16 +#define ADSP1_CONTROL_20 0x17 +#define ADSP1_CONTROL_21 0x18 +#define ADSP1_CONTROL_22 0x1A +#define ADSP1_CONTROL_23 0x1B +#define ADSP1_CONTROL_24 0x1C +#define ADSP1_CONTROL_25 0x1E +#define ADSP1_CONTROL_26 0x20 +#define ADSP1_CONTROL_27 0x21 +#define ADSP1_CONTROL_28 0x22 +#define ADSP1_CONTROL_29 0x23 +#define ADSP1_CONTROL_30 0x24 +#define ADSP1_CONTROL_31 0x26 + +/* + * ADSP1 Control 19 + */ +#define ADSP1_WDMA_BUFFER_LENGTH_MASK 0x00FF /* DSP1_WDMA_BUFFER_LENGTH - [7:0] */ +#define ADSP1_WDMA_BUFFER_LENGTH_SHIFT 0 /* DSP1_WDMA_BUFFER_LENGTH - [7:0] */ +#define ADSP1_WDMA_BUFFER_LENGTH_WIDTH 8 /* DSP1_WDMA_BUFFER_LENGTH - [7:0] */ + + +/* + * ADSP1 Control 30 + */ +#define ADSP1_DBG_CLK_ENA 0x0008 /* DSP1_DBG_CLK_ENA */ +#define ADSP1_DBG_CLK_ENA_MASK 0x0008 /* DSP1_DBG_CLK_ENA */ +#define ADSP1_DBG_CLK_ENA_SHIFT 3 /* DSP1_DBG_CLK_ENA */ +#define ADSP1_DBG_CLK_ENA_WIDTH 1 /* DSP1_DBG_CLK_ENA */ +#define ADSP1_SYS_ENA 0x0004 /* DSP1_SYS_ENA */ +#define ADSP1_SYS_ENA_MASK 0x0004 /* DSP1_SYS_ENA */ +#define ADSP1_SYS_ENA_SHIFT 2 /* DSP1_SYS_ENA */ +#define ADSP1_SYS_ENA_WIDTH 1 /* DSP1_SYS_ENA */ +#define ADSP1_CORE_ENA 0x0002 /* DSP1_CORE_ENA */ +#define ADSP1_CORE_ENA_MASK 0x0002 /* DSP1_CORE_ENA */ +#define ADSP1_CORE_ENA_SHIFT 1 /* DSP1_CORE_ENA */ +#define ADSP1_CORE_ENA_WIDTH 1 /* DSP1_CORE_ENA */ +#define ADSP1_START 0x0001 /* DSP1_START */ +#define ADSP1_START_MASK 0x0001 /* DSP1_START */ +#define ADSP1_START_SHIFT 0 /* DSP1_START */ +#define ADSP1_START_WIDTH 1 /* DSP1_START */ + +/* + * ADSP1 Control 31 + */ +#define ADSP1_CLK_SEL_MASK 0x0007 /* CLK_SEL_ENA */ +#define ADSP1_CLK_SEL_SHIFT 0 /* CLK_SEL_ENA */ +#define ADSP1_CLK_SEL_WIDTH 3 /* CLK_SEL_ENA */ + +#define ADSP2_CONTROL 0x0 +#define ADSP2_CLOCKING 0x1 +#define ADSP2V2_CLOCKING 0x2 +#define ADSP2_STATUS1 0x4 +#define ADSP2_WDMA_CONFIG_1 0x30 +#define ADSP2_WDMA_CONFIG_2 0x31 +#define ADSP2V2_WDMA_CONFIG_2 0x32 +#define ADSP2_RDMA_CONFIG_1 0x34 + +#define ADSP2_SCRATCH0 0x40 +#define ADSP2_SCRATCH1 0x41 +#define ADSP2_SCRATCH2 0x42 +#define ADSP2_SCRATCH3 0x43 + +#define ADSP2V2_SCRATCH0_1 0x40 +#define ADSP2V2_SCRATCH2_3 0x42 + +/* + * ADSP2 Control + */ + +#define ADSP2_MEM_ENA 0x0010 /* DSP1_MEM_ENA */ +#define ADSP2_MEM_ENA_MASK 0x0010 /* DSP1_MEM_ENA */ +#define ADSP2_MEM_ENA_SHIFT 4 /* DSP1_MEM_ENA */ +#define ADSP2_MEM_ENA_WIDTH 1 /* DSP1_MEM_ENA */ +#define ADSP2_SYS_ENA 0x0004 /* DSP1_SYS_ENA */ +#define ADSP2_SYS_ENA_MASK 0x0004 /* DSP1_SYS_ENA */ +#define ADSP2_SYS_ENA_SHIFT 2 /* DSP1_SYS_ENA */ +#define ADSP2_SYS_ENA_WIDTH 1 /* DSP1_SYS_ENA */ +#define ADSP2_CORE_ENA 0x0002 /* DSP1_CORE_ENA */ +#define ADSP2_CORE_ENA_MASK 0x0002 /* DSP1_CORE_ENA */ +#define ADSP2_CORE_ENA_SHIFT 1 /* DSP1_CORE_ENA */ +#define ADSP2_CORE_ENA_WIDTH 1 /* DSP1_CORE_ENA */ +#define ADSP2_START 0x0001 /* DSP1_START */ +#define ADSP2_START_MASK 0x0001 /* DSP1_START */ +#define ADSP2_START_SHIFT 0 /* DSP1_START */ +#define ADSP2_START_WIDTH 1 /* DSP1_START */ + +/* + * ADSP2 clocking + */ +#define ADSP2_CLK_SEL_MASK 0x0007 /* CLK_SEL_ENA */ +#define ADSP2_CLK_SEL_SHIFT 0 /* CLK_SEL_ENA */ +#define ADSP2_CLK_SEL_WIDTH 3 /* CLK_SEL_ENA */ + +/* + * ADSP2V2 clocking + */ +#define ADSP2V2_CLK_SEL_MASK 0x70000 /* CLK_SEL_ENA */ +#define ADSP2V2_CLK_SEL_SHIFT 16 /* CLK_SEL_ENA */ +#define ADSP2V2_CLK_SEL_WIDTH 3 /* CLK_SEL_ENA */ + +#define ADSP2V2_RATE_MASK 0x7800 /* DSP_RATE */ +#define ADSP2V2_RATE_SHIFT 11 /* DSP_RATE */ +#define ADSP2V2_RATE_WIDTH 4 /* DSP_RATE */ + +/* + * ADSP2 Status 1 + */ +#define ADSP2_RAM_RDY 0x0001 +#define ADSP2_RAM_RDY_MASK 0x0001 +#define ADSP2_RAM_RDY_SHIFT 0 +#define ADSP2_RAM_RDY_WIDTH 1 + +/* + * ADSP2 Lock support + */ +#define ADSP2_LOCK_CODE_0 0x5555 +#define ADSP2_LOCK_CODE_1 0xAAAA + +#define ADSP2_WATCHDOG 0x0A +#define ADSP2_BUS_ERR_ADDR 0x52 +#define ADSP2_REGION_LOCK_STATUS 0x64 +#define ADSP2_LOCK_REGION_1_LOCK_REGION_0 0x66 +#define ADSP2_LOCK_REGION_3_LOCK_REGION_2 0x68 +#define ADSP2_LOCK_REGION_5_LOCK_REGION_4 0x6A +#define ADSP2_LOCK_REGION_7_LOCK_REGION_6 0x6C +#define ADSP2_LOCK_REGION_9_LOCK_REGION_8 0x6E +#define ADSP2_LOCK_REGION_CTRL 0x7A +#define ADSP2_PMEM_ERR_ADDR_XMEM_ERR_ADDR 0x7C + +#define ADSP2_REGION_LOCK_ERR_MASK 0x8000 +#define ADSP2_SLAVE_ERR_MASK 0x4000 +#define ADSP2_WDT_TIMEOUT_STS_MASK 0x2000 +#define ADSP2_CTRL_ERR_PAUSE_ENA 0x0002 +#define ADSP2_CTRL_ERR_EINT 0x0001 + +#define ADSP2_BUS_ERR_ADDR_MASK 0x00FFFFFF +#define ADSP2_XMEM_ERR_ADDR_MASK 0x0000FFFF +#define ADSP2_PMEM_ERR_ADDR_MASK 0x7FFF0000 +#define ADSP2_PMEM_ERR_ADDR_SHIFT 16 +#define ADSP2_WDT_ENA_MASK 0xFFFFFFFD + +#define ADSP2_LOCK_REGION_SHIFT 16 + +#define ADSP_MAX_STD_CTRL_SIZE 512 + +#define WM_ADSP_ACKED_CTL_TIMEOUT_MS 100 +#define WM_ADSP_ACKED_CTL_N_QUICKPOLLS 10 +#define WM_ADSP_ACKED_CTL_MIN_VALUE 0 +#define WM_ADSP_ACKED_CTL_MAX_VALUE 0xFFFFFF + +/* + * Event control messages + */ +#define WM_ADSP_FW_EVENT_SHUTDOWN 0x000001 + +/* + * HALO system info + */ +#define HALO_SYS_INFO_XM_SRAM_SIZE 0x00010 +#define HALO_SYS_INFO_YM_SRAM_SIZE 0x00018 +#define HALO_SYS_INFO_XM_BANK_SIZE 0x00038 +#define HALO_SYS_INFO_YM_BANK_SIZE 0x0003c +#define HALO_AHBM_WINDOW_DEBUG_0 0x02040 +#define HALO_AHBM_WINDOW_DEBUG_1 0x02044 + +/* + * HALO core + */ +#define HALO_SAMPLE_RATE_RX1 0x00080 +#define HALO_SAMPLE_RATE_TX1 0x00280 +#define HALO_SCRATCH1 0x005c0 +#define HALO_CCM_CORE_CONTROL 0x41000 + +/* + * HALO Lock support + */ +#define HALO_MPU_UNLOCK_CODE_0 0x5555 +#define HALO_MPU_UNLOCK_CODE_1 0xaaaa + +/* + * HALO MPU banks + */ +#define HALO_MPU_XMEM_ACCESS_0 0x43000 +#define HALO_MPU_YMEM_ACCESS_0 0x43004 +#define HALO_MPU_WINDOW_ACCESS_0 0x43008 +#define HALO_MPU_XREG_ACCESS_0 0x4300C +#define HALO_MPU_YREG_ACCESS_0 0x43014 +#define HALO_MPU_XMEM_ACCESS_1 0x43018 +#define HALO_MPU_YMEM_ACCESS_1 0x4301C +#define HALO_MPU_WINDOW_ACCESS_1 0x43020 +#define HALO_MPU_XREG_ACCESS_1 0x43024 +#define HALO_MPU_YREG_ACCESS_1 0x4302C +#define HALO_MPU_XMEM_ACCESS_2 0x43030 +#define HALO_MPU_YMEM_ACCESS_2 0x43034 +#define HALO_MPU_WINDOW_ACCESS_2 0x43038 +#define HALO_MPU_XREG_ACCESS_2 0x4303C +#define HALO_MPU_YREG_ACCESS_2 0x43044 +#define HALO_MPU_XMEM_ACCESS_3 0x43048 +#define HALO_MPU_YMEM_ACCESS_3 0x4304C +#define HALO_MPU_WINDOW_ACCESS_3 0x43050 +#define HALO_MPU_XREG_ACCESS_3 0x43054 +#define HALO_MPU_YREG_ACCESS_3 0x4305C +#define HALO_MPU_XM_VIO_ADDR 0x43100 +#define HALO_MPU_XM_VIO_STATUS 0x43104 +#define HALO_MPU_YM_VIO_ADDR 0x43108 +#define HALO_MPU_YM_VIO_STATUS 0x4310C +#define HALO_MPU_PM_VIO_ADDR 0x43110 +#define HALO_MPU_PM_VIO_STATUS 0x43114 +#define HALO_MPU_LOCK_CONFIG 0x43140 + +/* + * HALO stream arb + */ +#define HALO_STREAM_ARB_MSTR0_CONFIG_0 0x45000 +#define HALO_STREAM_ARB_MSTR0_CONFIG_1 0x45004 +#define HALO_STREAM_ARB_MSTR0_CONFIG_2 0x45008 +#define HALO_STREAM_ARB_MSTR1_CONFIG_0 0x45010 +#define HALO_STREAM_ARB_MSTR1_CONFIG_1 0x45014 +#define HALO_STREAM_ARB_MSTR1_CONFIG_2 0x45018 +#define HALO_STREAM_ARB_MSTR2_CONFIG_0 0x45020 +#define HALO_STREAM_ARB_MSTR2_CONFIG_1 0x45024 +#define HALO_STREAM_ARB_MSTR2_CONFIG_2 0x45028 +#define HALO_STREAM_ARB_MSTR3_CONFIG_0 0x45030 +#define HALO_STREAM_ARB_MSTR3_CONFIG_1 0x45034 +#define HALO_STREAM_ARB_MSTR3_CONFIG_2 0x45038 +#define HALO_STREAM_ARB_MSTR4_CONFIG_0 0x45040 +#define HALO_STREAM_ARB_MSTR4_CONFIG_1 0x45044 +#define HALO_STREAM_ARB_MSTR4_CONFIG_2 0x45048 +#define HALO_STREAM_ARB_MSTR5_CONFIG_0 0x45050 +#define HALO_STREAM_ARB_MSTR5_CONFIG_1 0x45054 +#define HALO_STREAM_ARB_MSTR5_CONFIG_2 0x45058 + +#define HALO_STREAM_ARB_TX1_CONFIG_0 0x45200 +#define HALO_STREAM_ARB_TX1_CONFIG_1 0x45204 +#define HALO_STREAM_ARB_TX2_CONFIG_0 0x45208 +#define HALO_STREAM_ARB_TX2_CONFIG_1 0x4520C +#define HALO_STREAM_ARB_TX3_CONFIG_0 0x45210 +#define HALO_STREAM_ARB_TX3_CONFIG_1 0x45214 +#define HALO_STREAM_ARB_TX4_CONFIG_0 0x45218 +#define HALO_STREAM_ARB_TX4_CONFIG_1 0x4521C +#define HALO_STREAM_ARB_TX5_CONFIG_0 0x45220 +#define HALO_STREAM_ARB_TX5_CONFIG_1 0x45224 +#define HALO_STREAM_ARB_TX6_CONFIG_0 0x45228 +#define HALO_STREAM_ARB_TX6_CONFIG_1 0x4522C +#define HALO_STREAM_ARB_TX7_CONFIG_0 0x45230 +#define HALO_STREAM_ARB_TX7_CONFIG_1 0x45234 +#define HALO_STREAM_ARB_TX8_CONFIG_0 0x45238 +#define HALO_STREAM_ARB_TX8_CONFIG_1 0x4523C +#define HALO_STREAM_ARB_RX1_CONFIG_0 0x45400 +#define HALO_STREAM_ARB_RX1_CONFIG_1 0x45404 +#define HALO_STREAM_ARB_RX2_CONFIG_0 0x45408 +#define HALO_STREAM_ARB_RX2_CONFIG_1 0x4540C +#define HALO_STREAM_ARB_RX3_CONFIG_0 0x45410 +#define HALO_STREAM_ARB_RX3_CONFIG_1 0x45414 +#define HALO_STREAM_ARB_RX4_CONFIG_0 0x45418 +#define HALO_STREAM_ARB_RX4_CONFIG_1 0x4541C +#define HALO_STREAM_ARB_RX5_CONFIG_0 0x45420 +#define HALO_STREAM_ARB_RX5_CONFIG_1 0x45424 +#define HALO_STREAM_ARB_RX6_CONFIG_0 0x45428 +#define HALO_STREAM_ARB_RX6_CONFIG_1 0x4542C +#define HALO_STREAM_ARB_RX7_CONFIG_0 0x45430 +#define HALO_STREAM_ARB_RX7_CONFIG_1 0x45434 +#define HALO_STREAM_ARB_RX8_CONFIG_0 0x45438 +#define HALO_STREAM_ARB_RX8_CONFIG_1 0x4543C + +#define HALO_STREAM_ARB_IRQ0_CONFIG_0 0x45600 +#define HALO_STREAM_ARB_IRQ0_CONFIG_1 0x45604 +#define HALO_STREAM_ARB_IRQ0_CONFIG_2 0x45608 +#define HALO_STREAM_ARB_IRQ1_CONFIG_0 0x45610 +#define HALO_STREAM_ARB_IRQ1_CONFIG_1 0x45614 +#define HALO_STREAM_ARB_IRQ1_CONFIG_2 0x45618 +#define HALO_STREAM_ARB_IRQ2_CONFIG_0 0x45620 +#define HALO_STREAM_ARB_IRQ2_CONFIG_1 0x45624 +#define HALO_STREAM_ARB_IRQ2_CONFIG_2 0x45628 +#define HALO_STREAM_ARB_IRQ3_CONFIG_0 0x45630 +#define HALO_STREAM_ARB_IRQ3_CONFIG_1 0x45634 +#define HALO_STREAM_ARB_IRQ3_CONFIG_2 0x45638 +#define HALO_STREAM_ARB_IRQ4_CONFIG_0 0x45640 +#define HALO_STREAM_ARB_IRQ4_CONFIG_1 0x45644 +#define HALO_STREAM_ARB_IRQ4_CONFIG_2 0x45648 +#define HALO_STREAM_ARB_IRQ5_CONFIG_0 0x45650 +#define HALO_STREAM_ARB_IRQ5_CONFIG_1 0x45654 +#define HALO_STREAM_ARB_IRQ5_CONFIG_2 0x45658 +#define HALO_STREAM_ARB_IRQ6_CONFIG_0 0x45660 +#define HALO_STREAM_ARB_IRQ6_CONFIG_1 0x45664 +#define HALO_STREAM_ARB_IRQ6_CONFIG_2 0x45668 +#define HALO_STREAM_ARB_IRQ7_CONFIG_0 0x45670 +#define HALO_STREAM_ARB_IRQ7_CONFIG_1 0x45674 +#define HALO_STREAM_ARB_IRQ7_CONFIG_2 0x45678 + +#define HALO_INTP_CTL_NMI_CONTROL 0x46008 + +/* + * HALO_AHBM_WINDOW_DEBUG_1 + */ +#define HALO_AHBM_CORE_ERR_ADDR_MASK 0x0fffff00 +#define HALO_AHBM_CORE_ERR_ADDR_SHIFT 8 +#define HALO_AHBM_ADDR_ERR_MASK 0x00000080 +#define HALO_AHBM_LOCKED_ERR_MASK 0x00000040 +#define HALO_AHBM_SIZE_ERR_MASK 0x00000020 +#define HALO_AHBM_MODE_ERR_MASK 0x00000010 +#define HALO_AHBM_AHB_ERR_MASK 0x00000001 + +/* + * HALO_SAMPLE_RATE_[RX|TX]n + */ +#define HALO_DSP_RATE_SHIFT 0 +#define HALO_DSP_RATE_MASK 0x1f + +/* + * HALO_CCM_CORE_CONTROL + */ +#define HALO_CORE_EN 0x00000001 +#define HALO_CORE_EN_MASK 0x00000001 +#define HALO_CORE_EN_SHIFT 0 +#define HALO_CORE_EN_WIDTH 1 +#define HALO_CORE_RESET 0x00000200 + +/* + * HALO_MPU_?M_VIO_STATUS + */ +#define HALO_MPU_VIO_STS_MASK 0x007e0000 +#define HALO_MPU_VIO_STS_SHIFT 17 +#define HALO_MPU_VIO_ERR_MASK 0x00010000 +#define HALO_MPU_VIO_ERR_SHIFT 16 +#define HALO_MPU_VIO_ERR_WR_MASK 0x00008000 +#define HALO_MPU_VIO_ERR_WR_SHIFT 15 +#define HALO_MPU_VIO_ERR_SRC_MASK 0x00007fff +#define HALO_MPU_VIO_ERR_SRC_SHIFT 0 + +#define HALO_MPU_VIO_SRAM 0x01 +#define HALO_MPU_VIO_REG 0x02 +#define HALO_MPU_VIO_AHB 0x04 +#define HALO_MPU_VIO_EREG 0x08 +#define HALO_MPU_VIO_EXTERNAL_MEM 0x10 +#define HALO_MPU_VIO_NON_EXIST 0x20 + +/* + * HALO_STREAM_ARB_MSTRn_CONFIG_0 + */ +#define HALO_STREAM_ARB_MSTR_EN_MASK 0x1 + +/* + * HALO_STREAM_ARB_[TX|RX]n_CONFIG_0 + * HALO_STREAM_ARB_IRQn_CONFIG_0 + */ +#define HALO_STREAM_ARB_MSTR_SEL_DEFAULT 0xfc + +static const unsigned int halo_mpu_access[18] = { + HALO_MPU_WINDOW_ACCESS_0, + HALO_MPU_XREG_ACCESS_0, + HALO_MPU_YREG_ACCESS_0, + HALO_MPU_XMEM_ACCESS_1, + HALO_MPU_YMEM_ACCESS_1, + HALO_MPU_WINDOW_ACCESS_1, + HALO_MPU_XREG_ACCESS_1, + HALO_MPU_YREG_ACCESS_1, + HALO_MPU_XMEM_ACCESS_2, + HALO_MPU_YMEM_ACCESS_2, + HALO_MPU_WINDOW_ACCESS_2, + HALO_MPU_XREG_ACCESS_2, + HALO_MPU_YREG_ACCESS_2, + HALO_MPU_XMEM_ACCESS_3, + HALO_MPU_YMEM_ACCESS_3, + HALO_MPU_WINDOW_ACCESS_3, + HALO_MPU_XREG_ACCESS_3, + HALO_MPU_YREG_ACCESS_3, +}; + +struct wm_adsp_buf { + struct list_head list; + void *buf; +}; + +static struct wm_adsp_buf *wm_adsp_buf_alloc(const void *src, size_t len, + struct list_head *list) +{ + struct wm_adsp_buf *buf = kzalloc(sizeof(*buf), GFP_KERNEL); + + if (buf == NULL) + return NULL; + + buf->buf = kmemdup(src, len, GFP_KERNEL | GFP_DMA); + if (!buf->buf) { + kfree(buf); + return NULL; + } + memcpy(buf->buf, src, len); + + if (list) + list_add_tail(&buf->list, list); + + return buf; +} + +static void wm_adsp_buf_free(struct list_head *list) +{ + while (!list_empty(list)) { + struct wm_adsp_buf *buf = list_first_entry(list, + struct wm_adsp_buf, + list); + list_del(&buf->list); + kfree(buf->buf); + kfree(buf); + } +} + +#define WM_ADSP_FW_MBC_VSS 0 +#define WM_ADSP_FW_HIFI 1 +#define WM_ADSP_FW_TX 2 +#define WM_ADSP_FW_TX_SPK 3 +#define WM_ADSP_FW_RX 4 +#define WM_ADSP_FW_RX_ANC 5 +#define WM_ADSP_FW_CTRL 6 +#define WM_ADSP_FW_ASR 7 +#define WM_ADSP_FW_TRACE 8 +#define WM_ADSP_FW_SPK_PROT 9 +#define WM_ADSP_FW_DIAG 10 +#define WM_ADSP_FW_CALIB 11 + +#define WM_ADSP_NUM_FW 12 + +#define AMBIENT_DEFAULT 30 +#define CAL_R_DEFAULT 8392 +#define CAL_STATUS_DEFAULT 1 + +static const char *wm_adsp_fw_text[WM_ADSP_NUM_FW] = { + [WM_ADSP_FW_MBC_VSS] = "MBC/VSS", + [WM_ADSP_FW_HIFI] = "MasterHiFi", + [WM_ADSP_FW_TX] = "Tx", + [WM_ADSP_FW_TX_SPK] = "Tx Speaker", + [WM_ADSP_FW_RX] = "Rx", + [WM_ADSP_FW_RX_ANC] = "Rx ANC", + [WM_ADSP_FW_CTRL] = "Voice Ctrl", + [WM_ADSP_FW_ASR] = "ASR Assist", + [WM_ADSP_FW_TRACE] = "Dbg Trace", + [WM_ADSP_FW_SPK_PROT] = "Protection", + [WM_ADSP_FW_DIAG] = "Diag", + [WM_ADSP_FW_CALIB] = "Diag Z", +}; + +struct wm_adsp_system_config_xm_hdr { + __be32 sys_enable; + __be32 fw_id; + __be32 fw_rev; + __be32 boot_status; + __be32 watchdog; + __be32 dma_buffer_size; + __be32 rdma[6]; + __be32 wdma[8]; + __be32 build_job_name[3]; + __be32 build_job_number; +}; + +struct wm_adsp_alg_xm_struct { + __be32 magic; + __be32 smoothing; + __be32 threshold; + __be32 host_buf_ptr; + __be32 start_seq; + __be32 high_water_mark; + __be32 low_water_mark; + __be64 smoothed_power; +}; + +struct wm_adsp_buffer { + __be32 X_buf_base; /* XM base addr of first X area */ + __be32 X_buf_size; /* Size of 1st X area in words */ + __be32 X_buf_base2; /* XM base addr of 2nd X area */ + __be32 X_buf_brk; /* Total X size in words */ + __be32 Y_buf_base; /* YM base addr of Y area */ + __be32 wrap; /* Total size X and Y in words */ + __be32 high_water_mark; /* Point at which IRQ is asserted */ + __be32 irq_count; /* bits 1-31 count IRQ assertions */ + __be32 irq_ack; /* acked IRQ count, bit 0 enables IRQ */ + __be32 next_write_index; /* word index of next write */ + __be32 next_read_index; /* word index of next read */ + __be32 error; /* error if any */ + __be32 oldest_block_index; /* word index of oldest surviving */ + __be32 requested_rewind; /* how many blocks rewind was done */ + __be32 reserved_space; /* internal */ + __be32 min_free; /* min free space since stream start */ + __be32 blocks_written[2]; /* total blocks written (64 bit) */ + __be32 words_written[2]; /* total words written (64 bit) */ +}; + +struct wm_adsp_compr; + +struct wm_adsp_compr_buf { + struct wm_adsp *dsp; + struct wm_adsp_compr *compr; + + struct wm_adsp_buffer_region *regions; + u32 host_buf_ptr; + + u32 error; + u32 irq_count; + int read_index; + int avail; +}; + +struct wm_adsp_compr { + struct wm_adsp *dsp; + struct wm_adsp_compr_buf *buf; + + struct snd_compr_stream *stream; + struct snd_compressed_buffer size; + + u32 *raw_buf; + unsigned int copied_total; + + unsigned int sample_rate; +}; + +#define WM_ADSP_DATA_WORD_SIZE 3 + +#define WM_ADSP_MIN_FRAGMENTS 1 +#define WM_ADSP_MAX_FRAGMENTS 256 +#define WM_ADSP_MIN_FRAGMENT_SIZE (64 * WM_ADSP_DATA_WORD_SIZE) +#define WM_ADSP_MAX_FRAGMENT_SIZE (4096 * WM_ADSP_DATA_WORD_SIZE) + +#define WM_ADSP_ALG_XM_STRUCT_MAGIC 0x49aec7 + +#define HOST_BUFFER_FIELD(field) \ + (offsetof(struct wm_adsp_buffer, field) / sizeof(__be32)) + +#define ALG_XM_FIELD(field) \ + (offsetof(struct wm_adsp_alg_xm_struct, field) / sizeof(__be32)) + +static int wm_adsp_buffer_init(struct wm_adsp *dsp); +static int wm_adsp_buffer_free(struct wm_adsp *dsp); + +struct wm_adsp_buffer_region { + unsigned int offset; + unsigned int cumulative_size; + unsigned int mem_type; + unsigned int base_addr; +}; + +struct wm_adsp_buffer_region_def { + unsigned int mem_type; + unsigned int base_offset; + unsigned int size_offset; +}; + +static const struct wm_adsp_buffer_region_def default_regions[] = { + { + .mem_type = WMFW_ADSP2_XM, + .base_offset = HOST_BUFFER_FIELD(X_buf_base), + .size_offset = HOST_BUFFER_FIELD(X_buf_size), + }, + { + .mem_type = WMFW_ADSP2_XM, + .base_offset = HOST_BUFFER_FIELD(X_buf_base2), + .size_offset = HOST_BUFFER_FIELD(X_buf_brk), + }, + { + .mem_type = WMFW_ADSP2_YM, + .base_offset = HOST_BUFFER_FIELD(Y_buf_base), + .size_offset = HOST_BUFFER_FIELD(wrap), + }, +}; + +struct wm_adsp_fw_caps { + u32 id; + struct snd_codec_desc desc; + int num_regions; + const struct wm_adsp_buffer_region_def *region_defs; +}; + +static const struct wm_adsp_fw_caps ctrl_caps[] = { + { + .id = SND_AUDIOCODEC_BESPOKE, + .desc = { + .max_ch = 1, + .sample_rates = { 16000 }, + .num_sample_rates = 1, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .num_regions = ARRAY_SIZE(default_regions), + .region_defs = default_regions, + }, +}; + +static const struct wm_adsp_fw_caps trace_caps[] = { + { + .id = SND_AUDIOCODEC_BESPOKE, + .desc = { + .max_ch = 8, + .sample_rates = { + 4000, 8000, 11025, 12000, 16000, 22050, + 24000, 32000, 44100, 48000, 64000, 88200, + 96000, 176400, 192000 + }, + .num_sample_rates = 15, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .num_regions = ARRAY_SIZE(default_regions), + .region_defs = default_regions, + }, +}; + +static const struct { + const char *file; + int compr_direction; + int num_caps; + const struct wm_adsp_fw_caps *caps; + bool voice_trigger; +} wm_adsp_fw[WM_ADSP_NUM_FW] = { + [WM_ADSP_FW_MBC_VSS] = { .file = "mbc-vss" }, + [WM_ADSP_FW_HIFI] = { .file = "hifi" }, + [WM_ADSP_FW_TX] = { .file = "tx" }, + [WM_ADSP_FW_TX_SPK] = { .file = "tx-spk" }, + [WM_ADSP_FW_RX] = { .file = "rx" }, + [WM_ADSP_FW_RX_ANC] = { .file = "rx-anc" }, + [WM_ADSP_FW_CTRL] = { + .file = "ctrl", + .compr_direction = SND_COMPRESS_CAPTURE, + .num_caps = ARRAY_SIZE(ctrl_caps), + .caps = ctrl_caps, + .voice_trigger = true, + }, + [WM_ADSP_FW_ASR] = { .file = "asr" }, + [WM_ADSP_FW_TRACE] = { + .file = "trace", + .compr_direction = SND_COMPRESS_CAPTURE, + .num_caps = ARRAY_SIZE(trace_caps), + .caps = trace_caps, + }, + [WM_ADSP_FW_SPK_PROT] = { .file = "spk-prot" }, + [WM_ADSP_FW_DIAG] = { .file = "diag" }, + [WM_ADSP_FW_CALIB] = { .file = "diag-z" }, +}; + +struct wm_coeff_ctl_ops { + int (*xget)(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol); + int (*xput)(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol); +}; + +struct wm_coeff_ctl { + const char *name; + const char *fw_name; + struct wm_adsp_alg_region alg_region; + struct wm_coeff_ctl_ops ops; + struct wm_adsp *dsp; + unsigned int enabled:1; + struct list_head list; + void *cache; + unsigned int offset; + size_t len; + unsigned int set:1; + struct soc_bytes_ext bytes_ext; + unsigned int flags; + unsigned int type; +}; + +static const char *wm_adsp_mem_region_name(unsigned int type) +{ + switch (type) { + case WMFW_ADSP1_PM: + return "PM"; + case WMFW_HALO_PM_PACKED: + return "PM_PACKED"; + case WMFW_ADSP1_DM: + return "DM"; + case WMFW_ADSP2_XM: + return "XM"; + case WMFW_HALO_XM_PACKED: + return "XM_PACKED"; + case WMFW_ADSP2_YM: + return "YM"; + case WMFW_HALO_YM_PACKED: + return "YM_PACKED"; + case WMFW_ADSP1_ZM: + return "ZM"; + default: + return NULL; + } +} +static int wm_halo_apply_calibration(struct snd_soc_dapm_widget *w); +static int wm_adsp_k_ctl_put(struct wm_adsp *dsp, const char *name, int value); +static int wm_adsp_k_ctl_get(struct wm_adsp *dsp, const char *name); + +#ifdef CONFIG_DEBUG_FS +static void wm_adsp_debugfs_save_wmfwname(struct wm_adsp *dsp, const char *s) +{ + char *tmp = kasprintf(GFP_KERNEL, "%s\n", s); + + kfree(dsp->wmfw_file_name); + dsp->wmfw_file_name = tmp; +} + +static void wm_adsp_debugfs_save_binname(struct wm_adsp *dsp, const char *s) +{ + char *tmp = kasprintf(GFP_KERNEL, "%s\n", s); + + kfree(dsp->bin_file_name); + dsp->bin_file_name = tmp; +} + +static void wm_adsp_debugfs_clear(struct wm_adsp *dsp) +{ + kfree(dsp->wmfw_file_name); + kfree(dsp->bin_file_name); + dsp->wmfw_file_name = NULL; + dsp->bin_file_name = NULL; +} + +static ssize_t wm_adsp_debugfs_wmfw_read(struct file *file, + char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct wm_adsp *dsp = file->private_data; + ssize_t ret; + + mutex_lock(&dsp->pwr_lock); + + if (!dsp->wmfw_file_name || !dsp->booted) + ret = 0; + else + ret = simple_read_from_buffer(user_buf, count, ppos, + dsp->wmfw_file_name, + strlen(dsp->wmfw_file_name)); + + mutex_unlock(&dsp->pwr_lock); + return ret; +} + +static ssize_t wm_adsp_debugfs_bin_read(struct file *file, + char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct wm_adsp *dsp = file->private_data; + ssize_t ret; + + mutex_lock(&dsp->pwr_lock); + + if (!dsp->bin_file_name || !dsp->booted) + ret = 0; + else + ret = simple_read_from_buffer(user_buf, count, ppos, + dsp->bin_file_name, + strlen(dsp->bin_file_name)); + + mutex_unlock(&dsp->pwr_lock); + return ret; +} + +static const struct { + const char *name; + const struct file_operations fops; +} wm_adsp_debugfs_fops[] = { + { + .name = "wmfw_file_name", + .fops = { + .open = simple_open, + .read = wm_adsp_debugfs_wmfw_read, + }, + }, + { + .name = "bin_file_name", + .fops = { + .open = simple_open, + .read = wm_adsp_debugfs_bin_read, + }, + }, +}; + +static void wm_adsp2_init_debugfs(struct wm_adsp *dsp, + struct snd_soc_codec *codec) +{ + struct dentry *root = NULL; + char *root_name; + int i; + + if (!codec->component.debugfs_root) { + adsp_err(dsp, "No codec debugfs root\n"); + goto err; + } + + root_name = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!root_name) + goto err; + + snprintf(root_name, PAGE_SIZE, "dsp%d", dsp->num); + root = debugfs_create_dir(root_name, codec->component.debugfs_root); + kfree(root_name); + + if (!root) + goto err; + + if (!debugfs_create_bool("booted", S_IRUGO, root, &dsp->booted)) + goto err; + + if (!debugfs_create_bool("running", S_IRUGO, root, &dsp->running)) + goto err; + + if (!debugfs_create_x32("fw_id", S_IRUGO, root, &dsp->fw_id)) + goto err; + + if (!debugfs_create_x32("fw_version", S_IRUGO, root, + &dsp->fw_id_version)) + goto err; + + for (i = 0; i < ARRAY_SIZE(wm_adsp_debugfs_fops); ++i) { + if (!debugfs_create_file(wm_adsp_debugfs_fops[i].name, + S_IRUGO, root, dsp, + &wm_adsp_debugfs_fops[i].fops)) + goto err; + } + + dsp->debugfs_root = root; + return; + +err: + debugfs_remove_recursive(root); + adsp_err(dsp, "Failed to create debugfs\n"); +} + +static void wm_adsp2_cleanup_debugfs(struct wm_adsp *dsp) +{ + wm_adsp_debugfs_clear(dsp); + debugfs_remove_recursive(dsp->debugfs_root); +} +#else +static inline void wm_adsp2_init_debugfs(struct wm_adsp *dsp, + struct snd_soc_codec *codec) +{ +} + +static inline void wm_adsp2_cleanup_debugfs(struct wm_adsp *dsp) +{ +} + +static inline void wm_adsp_debugfs_save_wmfwname(struct wm_adsp *dsp, + const char *s) +{ +} + +static inline void wm_adsp_debugfs_save_binname(struct wm_adsp *dsp, + const char *s) +{ +} + +static inline void wm_adsp_debugfs_clear(struct wm_adsp *dsp) +{ +} +#endif + +static int wm_adsp_fw_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.enumerated.item[0] = dsp[e->shift_l].fw; + + return 0; +} + +static int wm_adsp_fw_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + int ret = 0; + + if (ucontrol->value.enumerated.item[0] == dsp[e->shift_l].fw) + return 0; + + if (ucontrol->value.enumerated.item[0] >= WM_ADSP_NUM_FW) + return -EINVAL; + + mutex_lock(&dsp[e->shift_l].pwr_lock); + + if (dsp[e->shift_l].booted || dsp[e->shift_l].compr) + ret = -EBUSY; + else + dsp[e->shift_l].fw = ucontrol->value.enumerated.item[0]; + + mutex_unlock(&dsp[e->shift_l].pwr_lock); + + return ret; +} + +static int wm_adsp_cal_z_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.enumerated.item[0] = dsp->cal_z; + + return 0; +} + +static int wm_adsp_cal_z_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + dsp->cal_z = ucontrol->value.enumerated.item[0]; + dsp->cal_chksum = dsp->cal_z + CAL_STATUS_DEFAULT; + + dev_info(codec->dev, "cal_z = %d\n", dsp->cal_z); + + return 0; +} + +static int wm_adsp_ambient_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.enumerated.item[0] = dsp->ambient; + + return 0; +} + +static int wm_adsp_ambient_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + dsp->ambient = ucontrol->value.enumerated.item[0]; + + dev_info(codec->dev, "ambient = %d\n", dsp->ambient); + + return 0; +} + +static int wm_adsp_cal_status_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.enumerated.item[0] = dsp->cal_status; + + return 0; +} + +static int wm_adsp_cal_status_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + dsp->cal_status = ucontrol->value.enumerated.item[0]; + + dev_info(codec->dev, "cal_status = %d\n", dsp->cal_status); + + return 0; +} + +static int wm_adsp_cal_chksum_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.enumerated.item[0] = dsp->cal_chksum; + + return 0; +} + +static int wm_adsp_cal_chksum_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + dsp->cal_chksum = ucontrol->value.enumerated.item[0]; + + dev_info(codec->dev, "cal_chksum = %d\n", dsp->cal_chksum); + + return 0; +} + +static int wm_adsp_block_bypass_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.enumerated.item[0] = dsp->block_bypass; + + return 0; +} + +static int wm_adsp_block_bypass_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + dsp->block_bypass = ucontrol->value.enumerated.item[0]; + + switch(dsp->block_bypass) { + case 0: + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00000000); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_EQ", 0x00000000); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_ACTI", 0x00000000); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_MBL", 0x00000000); + break; + case 1: + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00400001); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_EQ", 0x00400001); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_ACTI", 0x00400001); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_MBL", 0x00400001); + break; + default: + break; + } + + dev_info(codec->dev, "block_bypass = %d\n", dsp->block_bypass); + + return 0; +} + +static int wm_adsp_block_bypass_in_enh_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.enumerated.item[0] = dsp->block_bypass_in_enh; + + return 0; +} + +static int wm_adsp_block_bypass_in_enh_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + dsp->block_bypass_in_enh = ucontrol->value.enumerated.item[0]; + + switch(dsp->block_bypass_in_enh) { + case 0: + dev_info(codec->dev, "block_bypass_in_enh = %d, put 0x00000000.\n", dsp->block_bypass_in_enh); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00000000); + break; + case 1: + dev_info(codec->dev, "block_bypass_in_enh = %d, put 0x00400001.\n", dsp->block_bypass_in_enh); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00400001); + break; + default: + break; + } + + dev_info(codec->dev, "block_bypass_in_enh = %d\n", dsp->block_bypass_in_enh); + + return 0; +} + +static const struct soc_enum wm_adsp_fw_enum[] = { + SOC_ENUM_SINGLE(0, 0, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), + SOC_ENUM_SINGLE(0, 1, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), + SOC_ENUM_SINGLE(0, 2, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), + SOC_ENUM_SINGLE(0, 3, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), + SOC_ENUM_SINGLE(0, 4, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), + SOC_ENUM_SINGLE(0, 5, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), + SOC_ENUM_SINGLE(0, 6, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), +}; +static const char *wm_adsp_block_bypass_text[2] = {"Off", "On"}; +static const struct soc_enum wm_adsp_block_bypass_enum[] = { + SOC_ENUM_SINGLE(0, 0, ARRAY_SIZE(wm_adsp_block_bypass_text), wm_adsp_block_bypass_text), +}; +const struct snd_kcontrol_new wm_adsp_fw_controls[] = { + SOC_ENUM_EXT("DSP1 Firmware", wm_adsp_fw_enum[0], + wm_adsp_fw_get, wm_adsp_fw_put), + SOC_ENUM_EXT("DSP2 Firmware", wm_adsp_fw_enum[1], + wm_adsp_fw_get, wm_adsp_fw_put), + SOC_ENUM_EXT("DSP3 Firmware", wm_adsp_fw_enum[2], + wm_adsp_fw_get, wm_adsp_fw_put), + SOC_ENUM_EXT("DSP4 Firmware", wm_adsp_fw_enum[3], + wm_adsp_fw_get, wm_adsp_fw_put), + SOC_ENUM_EXT("DSP5 Firmware", wm_adsp_fw_enum[4], + wm_adsp_fw_get, wm_adsp_fw_put), + SOC_ENUM_EXT("DSP6 Firmware", wm_adsp_fw_enum[5], + wm_adsp_fw_get, wm_adsp_fw_put), + SOC_ENUM_EXT("DSP7 Firmware", wm_adsp_fw_enum[6], + wm_adsp_fw_get, wm_adsp_fw_put), +}; + +const struct snd_kcontrol_new wm_adsp_cal_controls[] = { + /* In Halo DSP, values are 24-bit */ + SOC_SINGLE_EXT("DSP Set CAL_Z", SND_SOC_NOPM, 0, 0xFFFFFF, 0, + wm_adsp_cal_z_get, wm_adsp_cal_z_put), + SOC_SINGLE_EXT("DSP Set AMBIENT", SND_SOC_NOPM, 0, 0xFFFFFF, 0, + wm_adsp_ambient_get, wm_adsp_ambient_put), + SOC_SINGLE_EXT("DSP Set CAL_STATUS", SND_SOC_NOPM, 0, 0xFFFFFF, 0, + wm_adsp_cal_status_get, wm_adsp_cal_status_put), + SOC_SINGLE_EXT("DSP Set CAL_CHKSUM", SND_SOC_NOPM, 0, 0xFFFFFF, 0, + wm_adsp_cal_chksum_get, wm_adsp_cal_chksum_put), + SOC_ENUM_EXT("DSP Block Bypass", wm_adsp_block_bypass_enum[0], + wm_adsp_block_bypass_get, wm_adsp_block_bypass_put), + SOC_ENUM_EXT("DSP Block Bypass_IN_ENH", wm_adsp_block_bypass_enum[0], + wm_adsp_block_bypass_in_enh_get, wm_adsp_block_bypass_in_enh_put), +}; +EXPORT_SYMBOL_GPL(wm_adsp_cal_controls); + +static struct wm_adsp_region const *wm_adsp_find_region(struct wm_adsp *dsp, + int type) +{ + int i; + + for (i = 0; i < dsp->num_mems; i++) + if (dsp->mem[i].type == type) + return &dsp->mem[i]; + + return NULL; +} + +static unsigned int wm_adsp_region_to_reg(struct wm_adsp *dsp, + struct wm_adsp_region const *mem, + unsigned int offset) +{ + if (WARN_ON(!mem)) + return offset; + switch (dsp->type) { + case WMFW_ADSP1: + case WMFW_ADSP2: + switch (mem->type) { + case WMFW_ADSP1_PM: + return mem->base + (offset * 3); + case WMFW_ADSP1_DM: + return mem->base + (offset * 2); + case WMFW_ADSP2_XM: + return mem->base + (offset * 2); + case WMFW_ADSP2_YM: + return mem->base + (offset * 2); + case WMFW_ADSP1_ZM: + return mem->base + (offset * 2); + default: + WARN(1, "Unknown memory region type"); + return offset; + } + case WMFW_HALO: + switch (mem->type) { + case WMFW_ADSP2_XM: + return mem->base + (offset * 4); + case WMFW_ADSP2_YM: + return mem->base + (offset * 4); + case WMFW_HALO_XM_PACKED: + return (mem->base + (offset * 3)) & ~0x3; + case WMFW_HALO_YM_PACKED: + return (mem->base + (offset * 3)) & ~0x3; + case WMFW_HALO_PM_PACKED: + return mem->base + (offset * 5); + default: + WARN(1, "Unknown memory region type"); + return offset; + } + default: + WARN(1, "Unknown DSP type"); + return offset; + } +} +static int wm_adsp2_raw_read(size_t maxbulk, struct regmap *map, + unsigned int reg, void *val, size_t len) +{ + int ret; + size_t read_len = 0; + size_t toread_len; + + while ((len - read_len) > 0) { + toread_len = (len - read_len) > maxbulk ? + maxbulk : (len - read_len); + ret = regmap_raw_read(map, reg + read_len, + val + read_len, toread_len); + if (ret < 0) { + printk("%s failed, toread_len:%u reg base:%u reg:%u read_len:%u\n", + __func__, toread_len, reg, + reg + read_len, read_len); + return ret; + } + read_len += toread_len; + } + + return 0; +} + +static void wm_adsp2_show_fw_status(struct wm_adsp *dsp) +{ + u16 scratch[4]; + int ret; + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, dsp->base + ADSP2_SCRATCH0, + scratch, sizeof(scratch)); + if (ret) { + adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); + return; + } + + adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", + be16_to_cpu(scratch[0]), + be16_to_cpu(scratch[1]), + be16_to_cpu(scratch[2]), + be16_to_cpu(scratch[3])); +} + +static void wm_adsp2v2_show_fw_status(struct wm_adsp *dsp) +{ + u32 scratch[2]; + int ret; + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, dsp->base + ADSP2V2_SCRATCH0_1, + scratch, sizeof(scratch)); + + if (ret) { + adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); + return; + } + + scratch[0] = be32_to_cpu(scratch[0]); + scratch[1] = be32_to_cpu(scratch[1]); + + adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", + scratch[0] & 0xFFFF, + scratch[0] >> 16, + scratch[1] & 0xFFFF, + scratch[1] >> 16); +} + +static void wm_halo_show_fw_status(struct wm_adsp *dsp) +{ + u32 scratch[4]; + int ret; + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, dsp->base + HALO_SCRATCH1, + scratch, sizeof(scratch)); + if (ret) { + adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); + return; + } + + adsp_dbg(dsp, "FW SCRATCH 1:0x%x 2:0x%x 3:0x%x 4:0x%x\n", + be32_to_cpu(scratch[0]), + be32_to_cpu(scratch[1]), + be32_to_cpu(scratch[2]), + be32_to_cpu(scratch[3])); +} + +static inline struct wm_coeff_ctl *bytes_ext_to_ctl(struct soc_bytes_ext *ext) +{ + return container_of(ext, struct wm_coeff_ctl, bytes_ext); +} + +static int wm_coeff_base_reg(struct wm_coeff_ctl *ctl, unsigned int *reg) +{ + const struct wm_adsp_alg_region *alg_region = &ctl->alg_region; + struct wm_adsp *dsp = ctl->dsp; + const struct wm_adsp_region *mem; + + mem = wm_adsp_find_region(dsp, alg_region->type); + if (!mem) { + adsp_err(dsp, "No base for region %x\n", + alg_region->type); + return -EINVAL; + } + + *reg = wm_adsp_region_to_reg(dsp, mem, + ctl->alg_region.base + ctl->offset); + + return 0; +} + +static int wm_coeff_info(struct snd_kcontrol *kctl, + struct snd_ctl_elem_info *uinfo) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + + switch (ctl->type) { + case WMFW_CTL_TYPE_ACKED: + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->value.integer.min = WM_ADSP_ACKED_CTL_MIN_VALUE; + uinfo->value.integer.max = WM_ADSP_ACKED_CTL_MAX_VALUE; + uinfo->value.integer.step = 1; + uinfo->count = 1; + break; + default: + uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; + uinfo->count = ctl->len; + break; + } + + return 0; +} + +static int wm_coeff_write_acked_control(struct wm_coeff_ctl *ctl, + unsigned int event_id) +{ + struct wm_adsp *dsp = ctl->dsp; + u32 val = cpu_to_be32(event_id); + unsigned int reg; + int i, ret; + + ret = wm_coeff_base_reg(ctl, ®); + if (ret) + return ret; + + adsp_dbg(dsp, "Sending 0x%x to acked control alg 0x%x %s:0x%x\n", + event_id, ctl->alg_region.alg, + wm_adsp_mem_region_name(ctl->alg_region.type), ctl->offset); + + ret = regmap_raw_write(dsp->regmap, reg, &val, sizeof(val)); + if (ret) { + adsp_err(dsp, "Failed to write %x: %d\n", reg, ret); + return ret; + } + + /* + * Poll for ack, we initially poll at ~1ms intervals for firmwares + * that respond quickly, then go to ~10ms polls. A firmware is unlikely + * to ack instantly so we do the first 1ms delay before reading the + * control to avoid a pointless bus transaction + */ + for (i = 0; i < WM_ADSP_ACKED_CTL_TIMEOUT_MS;) { + switch (i) { + case 0 ... WM_ADSP_ACKED_CTL_N_QUICKPOLLS - 1: + usleep_range(1000, 2000); + i++; + break; + default: + usleep_range(10000, 20000); + i += 10; + break; + } + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, reg, &val, sizeof(val)); + if (ret) { + adsp_err(dsp, "Failed to read %x: %d\n", reg, ret); + return ret; + } + + if (val == 0) { + adsp_dbg(dsp, "Acked control ACKED at poll %u\n", i); + return 0; + } + } + + adsp_warn(dsp, "Acked control @0x%x alg:0x%x %s:0x%x timed out\n", + reg, ctl->alg_region.alg, + wm_adsp_mem_region_name(ctl->alg_region.type), + ctl->offset); + + return -ETIMEDOUT; +} + +static int wm_coeff_write_control(struct wm_coeff_ctl *ctl, + const void *buf, size_t len) +{ + struct wm_adsp *dsp = ctl->dsp; + void *scratch; + int ret; + unsigned int reg; + + ret = wm_coeff_base_reg(ctl, ®); + if (ret) + return ret; + + scratch = kmemdup(buf, len, GFP_KERNEL | GFP_DMA); + if (!scratch) + return -ENOMEM; + + ret = regmap_raw_write(dsp->regmap, reg, scratch, + len); + if (ret) { + adsp_err(dsp, "Failed to write %zu bytes to %x: %d\n", + len, reg, ret); + kfree(scratch); + return ret; + } + adsp_dbg(dsp, "Wrote %zu bytes to %x\n", len, reg); + + kfree(scratch); + + return 0; +} + +static int wm_coeff_put(struct snd_kcontrol *kctl, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + char *p = ucontrol->value.bytes.data; + int ret = 0; + + mutex_lock(&ctl->dsp->pwr_lock); + + if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) + ret = -EPERM; + else + memcpy(ctl->cache, p, ctl->len); + + ctl->set = 1; + if (ctl->enabled && ctl->dsp->running) + ret = wm_coeff_write_control(ctl, p, ctl->len); + + mutex_unlock(&ctl->dsp->pwr_lock); + + return ret; +} + +static int wm_coeff_tlv_put(struct snd_kcontrol *kctl, + const unsigned int __user *bytes, unsigned int size) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + int ret = 0; + + mutex_lock(&ctl->dsp->pwr_lock); + + if (copy_from_user(ctl->cache, bytes, size)) { + ret = -EFAULT; + } else { + ctl->set = 1; + if (ctl->enabled && ctl->dsp->running) + ret = wm_coeff_write_control(ctl, ctl->cache, size); + else if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) + ret = -EPERM; + } + + mutex_unlock(&ctl->dsp->pwr_lock); + + return ret; +} + +static int wm_coeff_put_acked(struct snd_kcontrol *kctl, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + unsigned int val = ucontrol->value.integer.value[0]; + int ret; + + if (val == 0) + return 0; /* 0 means no event */ + + mutex_lock(&ctl->dsp->pwr_lock); + + if (ctl->enabled && ctl->dsp->running) + ret = wm_coeff_write_acked_control(ctl, val); + else + ret = -EPERM; + + mutex_unlock(&ctl->dsp->pwr_lock); + + return ret; +} + +static int wm_coeff_read_control(struct wm_coeff_ctl *ctl, + void *buf, size_t len) +{ + struct wm_adsp *dsp = ctl->dsp; + void *scratch; + int ret; + unsigned int reg; + + ret = wm_coeff_base_reg(ctl, ®); + if (ret) + return ret; + + scratch = kmalloc(len, GFP_KERNEL | GFP_DMA); + if (!scratch) + return -ENOMEM; + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, reg, scratch, len); + if (ret) { + adsp_err(dsp, "Failed to read %zu bytes from %x: %d\n", + len, reg, ret); + kfree(scratch); + return ret; + } + adsp_dbg(dsp, "Read %zu bytes from %x\n", len, reg); + + memcpy(buf, scratch, len); + kfree(scratch); + + return 0; +} + +static int wm_coeff_get(struct snd_kcontrol *kctl, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + char *p = ucontrol->value.bytes.data; + int ret = 0; + + mutex_lock(&ctl->dsp->pwr_lock); + + if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { + if (ctl->enabled && ctl->dsp->running) + ret = wm_coeff_read_control(ctl, p, ctl->len); + else + ret = -EPERM; + } else { + if (!ctl->flags && ctl->enabled && ctl->dsp->running) + ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); + + memcpy(p, ctl->cache, ctl->len); + } + + mutex_unlock(&ctl->dsp->pwr_lock); + + return ret; +} + +static int wm_coeff_tlv_get(struct snd_kcontrol *kctl, + unsigned int __user *bytes, unsigned int size) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + int ret = 0; + + mutex_lock(&ctl->dsp->pwr_lock); + + if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { + if (ctl->enabled && ctl->dsp->running) + ret = wm_coeff_read_control(ctl, ctl->cache, size); + else + ret = -EPERM; + } else { + if (!ctl->flags && ctl->enabled && ctl->dsp->running) + ret = wm_coeff_read_control(ctl, ctl->cache, size); + } + + if (!ret && copy_to_user(bytes, ctl->cache, size)) + ret = -EFAULT; + + mutex_unlock(&ctl->dsp->pwr_lock); + + return ret; +} + +static int wm_coeff_get_acked(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + /* + * Although it's not useful to read an acked control, we must satisfy + * user-side assumptions that all controls are readable and that a + * write of the same value should be filtered out (it's valid to send + * the same event number again to the firmware). We therefore return 0, + * meaning "no event" so valid event numbers will always be a change + */ + ucontrol->value.integer.value[0] = 0; + + return 0; +} + +struct wmfw_ctl_work { + struct wm_adsp *dsp; + struct wm_coeff_ctl *ctl; + struct work_struct work; +}; + +static unsigned int wmfw_convert_flags(unsigned int in, unsigned int len) +{ + unsigned int out, rd, wr, vol; + + if (len > ADSP_MAX_STD_CTRL_SIZE) { + rd = SNDRV_CTL_ELEM_ACCESS_TLV_READ; + wr = SNDRV_CTL_ELEM_ACCESS_TLV_WRITE; + vol = SNDRV_CTL_ELEM_ACCESS_VOLATILE; + + out = SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK; + } else { + rd = SNDRV_CTL_ELEM_ACCESS_READ; + wr = SNDRV_CTL_ELEM_ACCESS_WRITE; + vol = SNDRV_CTL_ELEM_ACCESS_VOLATILE; + + out = 0; + } + + if (in) { + if (in & WMFW_CTL_FLAG_READABLE) + out |= rd; + if (in & WMFW_CTL_FLAG_WRITEABLE) + out |= wr; + if (in & WMFW_CTL_FLAG_VOLATILE) + out |= vol; + } else { + out |= rd | wr | vol; + } + + return out; +} + + +static int wmfw_add_ctl(struct wm_adsp *dsp, struct wm_coeff_ctl *ctl) +{ + struct snd_kcontrol_new *kcontrol; + int ret; + + if (!ctl || !ctl->name) + return -EINVAL; + + kcontrol = kzalloc(sizeof(*kcontrol), GFP_KERNEL); + if (!kcontrol) + return -ENOMEM; + + kcontrol->name = ctl->name; + kcontrol->info = wm_coeff_info; + kcontrol->iface = SNDRV_CTL_ELEM_IFACE_MIXER; + kcontrol->tlv.c = snd_soc_bytes_tlv_callback; + kcontrol->private_value = (unsigned long)&ctl->bytes_ext; + kcontrol->access = wmfw_convert_flags(ctl->flags, ctl->len); + + switch (ctl->type) { + case WMFW_CTL_TYPE_ACKED: + kcontrol->get = wm_coeff_get_acked; + kcontrol->put = wm_coeff_put_acked; + break; + default: + kcontrol->get = wm_coeff_get; + kcontrol->put = wm_coeff_put; + + ctl->bytes_ext.max = ctl->len; + ctl->bytes_ext.get = wm_coeff_tlv_get; + ctl->bytes_ext.put = wm_coeff_tlv_put; + break; + } + + ret = snd_soc_add_codec_controls(dsp->codec, kcontrol, 1); + if (ret < 0) + goto err_kcontrol; + + kfree(kcontrol); + + return 0; + +err_kcontrol: + kfree(kcontrol); + return ret; +} + +static int wm_coeff_init_control_caches(struct wm_adsp *dsp) +{ + struct wm_coeff_ctl *ctl; + int ret; + + list_for_each_entry(ctl, &dsp->ctl_list, list) { + if (!ctl->enabled || ctl->set) + continue; + if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) + continue; + + ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); + if (ret < 0) + return ret; + } + + return 0; +} + +static int wm_coeff_sync_controls(struct wm_adsp *dsp) +{ + struct wm_coeff_ctl *ctl; + int ret; + + list_for_each_entry(ctl, &dsp->ctl_list, list) { + if (!ctl->enabled) + continue; + if (ctl->set && !(ctl->flags & WMFW_CTL_FLAG_VOLATILE)) { + ret = wm_coeff_write_control(ctl, ctl->cache, ctl->len); + if (ret < 0) + return ret; + } + } + + return 0; +} + +static void wm_adsp_signal_event_controls(struct wm_adsp *dsp, + unsigned int event) +{ + struct wm_coeff_ctl *ctl; + int ret; + + list_for_each_entry(ctl, &dsp->ctl_list, list) { + if (ctl->type != WMFW_CTL_TYPE_HOSTEVENT) + continue; + + if (!ctl->enabled) + continue; + + ret = wm_coeff_write_acked_control(ctl, event); + if (ret) + adsp_warn(dsp, + "Failed to send 0x%x event to alg 0x%x (%d)\n", + event, ctl->alg_region.alg, ret); + } +} + +static void wm_adsp_ctl_work(struct work_struct *work) +{ + struct wmfw_ctl_work *ctl_work = container_of(work, + struct wmfw_ctl_work, + work); + + wmfw_add_ctl(ctl_work->dsp, ctl_work->ctl); + kfree(ctl_work); +} + +static void wm_adsp_free_ctl_blk(struct wm_coeff_ctl *ctl) +{ + kfree(ctl->cache); + kfree(ctl->name); + kfree(ctl); +} + +static int wm_adsp_create_control(struct wm_adsp *dsp, + const struct wm_adsp_alg_region *alg_region, + unsigned int offset, unsigned int len, + const char *subname, unsigned int subname_len, + unsigned int flags, unsigned int type) +{ + struct wm_coeff_ctl *ctl; + struct wmfw_ctl_work *ctl_work; + char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; + const char *region_name; + int ret; + + region_name = wm_adsp_mem_region_name(alg_region->type); + if (!region_name) { + adsp_err(dsp, "Unknown region type: %d\n", alg_region->type); + return -EINVAL; + } + + switch (dsp->fw_ver) { + case 0: + case 1: + snprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, "DSP%d %s %x", + dsp->num, region_name, alg_region->alg); + break; + default: + ret = snprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, + "DSP%d%c %.12s %x", dsp->num, *region_name, + wm_adsp_fw_text[dsp->fw], alg_region->alg); + + /* Truncate the subname from the start if it is too long */ + if (subname) { + int avail = SNDRV_CTL_ELEM_ID_NAME_MAXLEN - ret - 2; + int skip = 0; + + if (subname_len > avail) + skip = subname_len - avail; + + snprintf(name + ret, + SNDRV_CTL_ELEM_ID_NAME_MAXLEN - ret, " %.*s", + subname_len - skip, subname + skip); + } + break; + } + + list_for_each_entry(ctl, &dsp->ctl_list, list) { + if (!strcmp(ctl->name, name)) { + if (!ctl->enabled) + ctl->enabled = 1; + return 0; + } + } + + ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); + if (!ctl) + return -ENOMEM; + ctl->fw_name = wm_adsp_fw_text[dsp->fw]; + ctl->alg_region = *alg_region; + ctl->name = kmemdup(name, strlen(name) + 1, GFP_KERNEL); + if (!ctl->name) { + ret = -ENOMEM; + goto err_ctl; + } + ctl->enabled = 1; + ctl->set = 0; + ctl->ops.xget = wm_coeff_get; + ctl->ops.xput = wm_coeff_put; + ctl->dsp = dsp; + + ctl->flags = flags; + ctl->type = type; + ctl->offset = offset; + ctl->len = len; + ctl->cache = kzalloc(ctl->len, GFP_KERNEL); + if (!ctl->cache) { + ret = -ENOMEM; + goto err_ctl_name; + } + + list_add(&ctl->list, &dsp->ctl_list); + + if (flags & WMFW_CTL_FLAG_SYS) + return 0; + + ctl_work = kzalloc(sizeof(*ctl_work), GFP_KERNEL); + if (!ctl_work) { + ret = -ENOMEM; + goto err_ctl_cache; + } + + ctl_work->dsp = dsp; + ctl_work->ctl = ctl; + INIT_WORK(&ctl_work->work, wm_adsp_ctl_work); + schedule_work(&ctl_work->work); + + return 0; + +err_ctl_cache: + kfree(ctl->cache); +err_ctl_name: + kfree(ctl->name); +err_ctl: + kfree(ctl); + + return ret; +} + +struct wm_coeff_parsed_alg { + int id; + const u8 *name; + int name_len; + int ncoeff; +}; + +struct wm_coeff_parsed_coeff { + int offset; + int mem_type; + const u8 *name; + int name_len; + int ctl_type; + int flags; + int len; +}; + +static int wm_coeff_parse_string(int bytes, const u8 **pos, const u8 **str) +{ + int length; + + switch (bytes) { + case 1: + length = **pos; + break; + case 2: + length = le16_to_cpu(*((__le16 *)*pos)); + break; + default: + return 0; + } + + if (str) + *str = *pos + bytes; + + *pos += ((length + bytes) + 3) & ~0x03; + + return length; +} + +static int wm_coeff_parse_int(int bytes, const u8 **pos) +{ + int val = 0; + + switch (bytes) { + case 2: + val = le16_to_cpu(*((__le16 *)*pos)); + break; + case 4: + val = le32_to_cpu(*((__le32 *)*pos)); + break; + default: + break; + } + + *pos += bytes; + + return val; +} + +static inline void wm_coeff_parse_alg(struct wm_adsp *dsp, const u8 **data, + struct wm_coeff_parsed_alg *blk) +{ + const struct wmfw_adsp_alg_data *raw; + + switch (dsp->fw_ver) { + case 0: + case 1: + raw = (const struct wmfw_adsp_alg_data *)*data; + *data = raw->data; + + blk->id = le32_to_cpu(raw->id); + blk->name = raw->name; + blk->name_len = strlen(raw->name); + blk->ncoeff = le32_to_cpu(raw->ncoeff); + break; + default: + blk->id = wm_coeff_parse_int(sizeof(raw->id), data); + blk->name_len = wm_coeff_parse_string(sizeof(u8), data, + &blk->name); + wm_coeff_parse_string(sizeof(u16), data, NULL); + blk->ncoeff = wm_coeff_parse_int(sizeof(raw->ncoeff), data); + break; + } + + adsp_dbg(dsp, "Algorithm ID: %#x\n", blk->id); + adsp_dbg(dsp, "Algorithm name: %.*s\n", blk->name_len, blk->name); + adsp_dbg(dsp, "# of coefficient descriptors: %#x\n", blk->ncoeff); +} + +static inline void wm_coeff_parse_coeff(struct wm_adsp *dsp, const u8 **data, + struct wm_coeff_parsed_coeff *blk) +{ + const struct wmfw_adsp_coeff_data *raw; + const u8 *tmp; + int length; + + switch (dsp->fw_ver) { + case 0: + case 1: + raw = (const struct wmfw_adsp_coeff_data *)*data; + *data = *data + sizeof(raw->hdr) + le32_to_cpu(raw->hdr.size); + + blk->offset = le16_to_cpu(raw->hdr.offset); + blk->mem_type = le16_to_cpu(raw->hdr.type); + blk->name = raw->name; + blk->name_len = strlen(raw->name); + blk->ctl_type = le16_to_cpu(raw->ctl_type); + blk->flags = le16_to_cpu(raw->flags); + blk->len = le32_to_cpu(raw->len); + break; + default: + tmp = *data; + blk->offset = wm_coeff_parse_int(sizeof(raw->hdr.offset), &tmp); + blk->mem_type = wm_coeff_parse_int(sizeof(raw->hdr.type), &tmp); + length = wm_coeff_parse_int(sizeof(raw->hdr.size), &tmp); + blk->name_len = wm_coeff_parse_string(sizeof(u8), &tmp, + &blk->name); + wm_coeff_parse_string(sizeof(u8), &tmp, NULL); + wm_coeff_parse_string(sizeof(u16), &tmp, NULL); + blk->ctl_type = wm_coeff_parse_int(sizeof(raw->ctl_type), &tmp); + blk->flags = wm_coeff_parse_int(sizeof(raw->flags), &tmp); + blk->len = wm_coeff_parse_int(sizeof(raw->len), &tmp); + + *data = *data + sizeof(raw->hdr) + length; + break; + } + + adsp_dbg(dsp, "\tCoefficient type: %#x\n", blk->mem_type); + adsp_dbg(dsp, "\tCoefficient offset: %#x\n", blk->offset); + adsp_dbg(dsp, "\tCoefficient name: %.*s\n", blk->name_len, blk->name); + adsp_dbg(dsp, "\tCoefficient flags: %#x\n", blk->flags); + adsp_dbg(dsp, "\tALSA control type: %#x\n", blk->ctl_type); + adsp_dbg(dsp, "\tALSA control len: %#x\n", blk->len); +} + +static int wm_adsp_check_coeff_flags(struct wm_adsp *dsp, + const struct wm_coeff_parsed_coeff *coeff_blk, + unsigned int f_required, + unsigned int f_illegal) +{ + if ((coeff_blk->flags & f_illegal) || + ((coeff_blk->flags & f_required) != f_required)) { + adsp_err(dsp, "Illegal flags 0x%x for control type 0x%x\n", + coeff_blk->flags, coeff_blk->ctl_type); + return -EINVAL; + } + + return 0; +} + +static int wm_adsp_parse_coeff(struct wm_adsp *dsp, + const struct wmfw_region *region) +{ + struct wm_adsp_alg_region alg_region = {}; + struct wm_coeff_parsed_alg alg_blk; + struct wm_coeff_parsed_coeff coeff_blk; + const u8 *data = region->data; + int i, ret; + + wm_coeff_parse_alg(dsp, &data, &alg_blk); + for (i = 0; i < alg_blk.ncoeff; i++) { + wm_coeff_parse_coeff(dsp, &data, &coeff_blk); + + switch (coeff_blk.ctl_type) { + case SNDRV_CTL_ELEM_TYPE_BYTES: + break; + case WMFW_CTL_TYPE_ACKED: + if (coeff_blk.flags & WMFW_CTL_FLAG_SYS) + continue; /* ignore */ + + ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk, + WMFW_CTL_FLAG_VOLATILE | + WMFW_CTL_FLAG_WRITEABLE | + WMFW_CTL_FLAG_READABLE, + 0); + if (ret) + return -EINVAL; + break; + case WMFW_CTL_TYPE_HOSTEVENT: + ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk, + WMFW_CTL_FLAG_SYS | + WMFW_CTL_FLAG_VOLATILE | + WMFW_CTL_FLAG_WRITEABLE | + WMFW_CTL_FLAG_READABLE, + 0); + if (ret) + return -EINVAL; + break; + default: + adsp_err(dsp, "Unknown control type: %d\n", + coeff_blk.ctl_type); + return -EINVAL; + } + + alg_region.type = coeff_blk.mem_type; + alg_region.alg = alg_blk.id; + + ret = wm_adsp_create_control(dsp, &alg_region, + coeff_blk.offset, + coeff_blk.len, + coeff_blk.name, + coeff_blk.name_len, + coeff_blk.flags, + coeff_blk.ctl_type); + if (ret < 0) + adsp_err(dsp, "Failed to create control: %.*s, %d\n", + coeff_blk.name_len, coeff_blk.name, ret); + } + + return 0; +} + +static int wm_adsp_load(struct wm_adsp *dsp) +{ + LIST_HEAD(buf_list); + const struct firmware *firmware; + struct regmap *regmap = dsp->regmap; + unsigned int pos = 0; + const struct wmfw_header *header; + const struct wmfw_adsp1_sizes *adsp1_sizes; + const struct wmfw_adsp2_sizes *adsp2_sizes; + const struct wmfw_footer *footer; + const struct wmfw_region *region; + const struct wm_adsp_region *mem; + const char *region_name; + char *file, *text = NULL; + struct wm_adsp_buf *buf; +#ifdef WM_ADSP_DEBUG + void *bufVerify; +#endif + unsigned int reg; + int regions = 0; + int ret, offset, type, sizes; +#ifdef WM_ADSP_DEBUG + size_t i; + bool verifyOk = true; + int tempA, tempB; + int* pTempA, *pTempB; + int max_failures = 666666; + int num_failures = 0; + int whileLoopCount = 0; +#endif + file = kzalloc(PAGE_SIZE, GFP_KERNEL); + if (file == NULL) + return -ENOMEM; + + snprintf(file, PAGE_SIZE, "%s-dsp%d-%s.wmfw", dsp->part, dsp->num, + wm_adsp_fw[dsp->fw].file); + file[PAGE_SIZE - 1] = '\0'; + + ret = request_firmware(&firmware, file, dsp->dev); + if (ret != 0) { + adsp_err(dsp, "Failed to request '%s'\n", file); + goto out; + } + ret = -EINVAL; + + pos = sizeof(*header) + sizeof(*adsp1_sizes) + sizeof(*footer); + if (pos >= firmware->size) { + adsp_err(dsp, "%s: file too short, %zu bytes\n", + file, firmware->size); + goto out_fw; + } + + header = (void *)&firmware->data[0]; + + if (memcmp(&header->magic[0], "WMFW", 4) != 0) { + adsp_err(dsp, "%s: invalid magic\n", file); + goto out_fw; + } + + switch (dsp->type) { + case WMFW_ADSP1: + case WMFW_ADSP2: + switch (header->ver) { + case 0: + adsp_warn(dsp, "%s: Deprecated file format %d\n", + file, header->ver); + break; + case 1: + case 2: + break; + default: + adsp_err(dsp, "%s: unknown file format %d\n", + file, header->ver); + goto out_fw; + } + break; + case WMFW_HALO: + switch (header->ver) { + case 1: + case 2: + /* + * we are required to load these for testing purposes + * but this format is not allowed for production fw + */ + adsp_warn(dsp, + "%s: Not a production firmware (deprecated file format %d)\n", + file, header->ver); + break; + case 3: + break; + default: + adsp_err(dsp, "%s: unknown file format %d\n", + file, header->ver); + goto out_fw; + } + } + + adsp_info(dsp, "Firmware version: %d\n", header->ver); + dsp->fw_ver = header->ver; + + if (header->core != dsp->type) { + adsp_err(dsp, "%s: invalid core %d != %d\n", + file, header->core, dsp->type); + goto out_fw; + } + + switch (dsp->type) { + case WMFW_ADSP1: + pos = sizeof(*header) + sizeof(*adsp1_sizes) + sizeof(*footer); + adsp1_sizes = (void *)&(header[1]); + footer = (void *)&(adsp1_sizes[1]); + sizes = sizeof(*adsp1_sizes); + + adsp_dbg(dsp, "%s: %d DM, %d PM, %d ZM\n", + file, le32_to_cpu(adsp1_sizes->dm), + le32_to_cpu(adsp1_sizes->pm), + le32_to_cpu(adsp1_sizes->zm)); + break; + + case WMFW_HALO: + case WMFW_ADSP2: + pos = sizeof(*header) + sizeof(*adsp2_sizes) + sizeof(*footer); + adsp2_sizes = (void *)&(header[1]); + footer = (void *)&(adsp2_sizes[1]); + sizes = sizeof(*adsp2_sizes); + + adsp_dbg(dsp, "%s: %d XM, %d YM %d PM, %d ZM\n", + file, le32_to_cpu(adsp2_sizes->xm), + le32_to_cpu(adsp2_sizes->ym), + le32_to_cpu(adsp2_sizes->pm), + le32_to_cpu(adsp2_sizes->zm)); + break; + + default: + WARN(1, "Unknown DSP type"); + goto out_fw; + } + + if (le32_to_cpu(header->len) != sizeof(*header) + + sizes + sizeof(*footer)) { + adsp_err(dsp, "%s: unexpected header length %d\n", + file, le32_to_cpu(header->len)); + goto out_fw; + } + + adsp_dbg(dsp, "%s: timestamp %llu\n", file, + le64_to_cpu(footer->timestamp)); + + while (pos < firmware->size && + pos - firmware->size > sizeof(*region)) { +#ifdef WM_ADSP_DEBUG + num_failures = 0; +#endif + region = (void *)&(firmware->data[pos]); + region_name = "Unknown"; + reg = 0; + text = NULL; + offset = le32_to_cpu(region->offset) & 0xffffff; + type = be32_to_cpu(region->type) & 0xff; + mem = wm_adsp_find_region(dsp, type); + + switch (type) { + case WMFW_NAME_TEXT: + region_name = "Firmware name"; + text = kzalloc(le32_to_cpu(region->len) + 1, + GFP_KERNEL); + break; + case WMFW_ALGORITHM_DATA: + region_name = "Algorithm"; + ret = wm_adsp_parse_coeff(dsp, region); + if (ret != 0) + goto out_fw; + break; + case WMFW_INFO_TEXT: + region_name = "Information"; + text = kzalloc(le32_to_cpu(region->len) + 1, + GFP_KERNEL); + break; + case WMFW_ABSOLUTE: + region_name = "Absolute"; + reg = offset; + break; + case WMFW_ADSP1_PM: + case WMFW_ADSP1_DM: + case WMFW_ADSP2_XM: + case WMFW_ADSP2_YM: + case WMFW_ADSP1_ZM: + case WMFW_HALO_PM_PACKED: + case WMFW_HALO_XM_PACKED: + case WMFW_HALO_YM_PACKED: + region_name = wm_adsp_mem_region_name(type); + reg = wm_adsp_region_to_reg(dsp, mem, offset); + break; + default: + adsp_warn(dsp, + "%s.%d: Unknown region type %x at %d(%x)\n", + file, regions, type, pos, pos); + break; + } + + adsp_dbg(dsp, "%s.%d: %d bytes at %d in %s\n", file, + regions, le32_to_cpu(region->len), offset, + region_name); + + if ((pos + le32_to_cpu(region->len) + sizeof(*region)) > + firmware->size) { + adsp_err(dsp, + "%s.%d: %s region len %d bytes exceeds file length %zu\n", + file, regions, region_name, + le32_to_cpu(region->len), firmware->size); + ret = -EINVAL; + goto out_fw; + } + + if (text) { + memcpy(text, region->data, le32_to_cpu(region->len)); + adsp_info(dsp, "%s: %s\n", file, text); + kfree(text); + text = NULL; + } + + if (reg) { + buf = wm_adsp_buf_alloc(region->data, + le32_to_cpu(region->len), + &buf_list); + if (!buf) { + adsp_err(dsp, "Out of memory\n"); + ret = -ENOMEM; + goto out_fw; + } +#ifdef WM_ADSP_DEBUG + bufVerify = vmalloc(le32_to_cpu(region->len)); + if (!bufVerify) { + adsp_err(dsp, "Could not allocate memory for verification buffer\n"); + ret = -ENOMEM; + goto out_fw; + } +#endif + + ret = regmap_raw_write_async(regmap, reg, buf->buf, + le32_to_cpu(region->len)); + + if (ret != 0) { + adsp_err(dsp, + "%s.%d: Failed to write %d bytes at %d in %s: %d\n", + file, regions, + le32_to_cpu(region->len), offset, + region_name, ret); + goto out_fw; + } +#ifdef WM_ADSP_DEBUG + /* abb. 3/5/18 - DEBUG. Wait for this write to complete + Then we will read back the registers and verify contents */ + adsp_info(dsp, "%s: Waiting to complete async write\n", __func__); + ret = regmap_async_complete(regmap); + if (ret != 0) { + adsp_err(dsp, "[1] Failed to complete async write: %d\n", ret); + goto out_fw; + } + adsp_err(dsp, "%s: Async write completed\n", __func__); + + ret = wm_adsp2_raw_read(MAXBULK, regmap, reg, bufVerify, le32_to_cpu(region->len)); + + adsp_err(dsp, "%s: Beginning Verification (loop %d)\n", __func__, whileLoopCount); + adsp_err(dsp, "%s: Total loop length: %d\n", __func__, le32_to_cpu(region->len) / 4); + pTempA = (int *)buf->buf; + pTempB = (int *)bufVerify; + for (i=0; i < le32_to_cpu(region->len) / 4; i++) { + tempA = pTempA[i]; + tempB = pTempB[i]; + + if (tempA != tempB) { + adsp_err(dsp, "** Verify failed on reg 0x%x at i=%zu (wrote 0x%x vs read 0x%x)\n", + reg, i, tempA, tempB); + verifyOk = false; + num_failures++; + } + + if (num_failures >= max_failures) { + adsp_err(dsp, "** Too many failed register verifies (hit max of %d). Exiting\n", + max_failures); + break; + } + } + + vfree(bufVerify); +#endif + } + + pos += le32_to_cpu(region->len) + sizeof(*region); + regions++; +#ifdef WM_ADSP_DEBUG + whileLoopCount++; +#endif + } + + ret = regmap_async_complete(regmap); + if (ret != 0) { + adsp_err(dsp, "Failed to complete async write: %d\n", ret); + goto out_fw; + } + + if (pos > firmware->size) + adsp_warn(dsp, "%s.%d: %zu bytes at end of file\n", + file, regions, pos - firmware->size); + + wm_adsp_debugfs_save_wmfwname(dsp, file); + +out_fw: + regmap_async_complete(regmap); + wm_adsp_buf_free(&buf_list); + release_firmware(firmware); + kfree(text); +out: + kfree(file); +#ifdef WM_ADSP_DEBUG + adsp_err(dsp, "wm_adsp_load- with verifyOk = %d and ret = %d", + verifyOk, ret); +#endif + return ret; +} + +static void wm_adsp_ctl_fixup_base(struct wm_adsp *dsp, + const struct wm_adsp_alg_region *alg_region) +{ + struct wm_coeff_ctl *ctl; + + list_for_each_entry(ctl, &dsp->ctl_list, list) { + if (ctl->fw_name == wm_adsp_fw_text[dsp->fw] && + alg_region->alg == ctl->alg_region.alg && + alg_region->type == ctl->alg_region.type) { + ctl->alg_region.base = alg_region->base; + } + } +} + +static void *wm_adsp_read_algs(struct wm_adsp *dsp, size_t n_algs, + unsigned int pos, unsigned int len) +{ + void *alg; + int ret; + __be32 val; + + if (n_algs == 0) { + adsp_err(dsp, "No algorithms\n"); + return ERR_PTR(-EINVAL); + } + + if (n_algs > 1024) { + adsp_err(dsp, "Algorithm count %zx excessive\n", n_algs); + return ERR_PTR(-EINVAL); + } + + /* Read the terminator first to validate the length */ + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, pos + len, &val, sizeof(val)); + if (ret != 0) { + adsp_err(dsp, "Failed to read algorithm list end: %d\n", + ret); + return ERR_PTR(ret); + } + + if (be32_to_cpu(val) != 0xbedead) + adsp_warn(dsp, "Algorithm list end %x 0x%x != 0xbedead\n", + pos + len, be32_to_cpu(val)); + + alg = kzalloc(len * 2, GFP_KERNEL | GFP_DMA); + if (!alg) + return ERR_PTR(-ENOMEM); + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, pos, alg, len * 2); + if (ret != 0) { + adsp_err(dsp, "Failed to read algorithm list: %d\n", ret); + kfree(alg); + return ERR_PTR(ret); + } + + return alg; +} + +static struct wm_adsp_alg_region * + wm_adsp_find_alg_region(struct wm_adsp *dsp, int type, unsigned int id) +{ + struct wm_adsp_alg_region *alg_region; + + list_for_each_entry(alg_region, &dsp->alg_regions, list) { + if (id == alg_region->alg && type == alg_region->type) + return alg_region; + } + + return NULL; +} + +static struct wm_adsp_alg_region *wm_adsp_create_region(struct wm_adsp *dsp, + int type, __be32 id, + __be32 base) +{ + struct wm_adsp_alg_region *alg_region; + + alg_region = kzalloc(sizeof(*alg_region), GFP_KERNEL); + if (!alg_region) + return ERR_PTR(-ENOMEM); + + alg_region->type = type; + alg_region->alg = be32_to_cpu(id); + alg_region->base = be32_to_cpu(base); + + list_add_tail(&alg_region->list, &dsp->alg_regions); + + if (dsp->fw_ver > 0) + wm_adsp_ctl_fixup_base(dsp, alg_region); + + return alg_region; +} + +static void wm_adsp_free_alg_regions(struct wm_adsp *dsp) +{ + struct wm_adsp_alg_region *alg_region; + + while (!list_empty(&dsp->alg_regions)) { + alg_region = list_first_entry(&dsp->alg_regions, + struct wm_adsp_alg_region, + list); + list_del(&alg_region->list); + kfree(alg_region); + } +} + +static int wm_adsp1_setup_algs(struct wm_adsp *dsp) +{ + struct wmfw_adsp1_id_hdr adsp1_id; + struct wmfw_adsp1_alg_hdr *adsp1_alg; + struct wm_adsp_alg_region *alg_region; + const struct wm_adsp_region *mem; + unsigned int pos, len; + size_t n_algs; + int i, ret; + + mem = wm_adsp_find_region(dsp, WMFW_ADSP1_DM); + if (WARN_ON(!mem)) + return -EINVAL; + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, mem->base, &adsp1_id, + sizeof(adsp1_id)); + if (ret != 0) { + adsp_err(dsp, "Failed to read algorithm info: %d\n", + ret); + return ret; + } + + n_algs = be32_to_cpu(adsp1_id.n_algs); + dsp->fw_id = be32_to_cpu(adsp1_id.fw.id); + adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n", + dsp->fw_id, + (be32_to_cpu(adsp1_id.fw.ver) & 0xff0000) >> 16, + (be32_to_cpu(adsp1_id.fw.ver) & 0xff00) >> 8, + be32_to_cpu(adsp1_id.fw.ver) & 0xff, + n_algs); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_ZM, + adsp1_id.fw.id, adsp1_id.zm); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_DM, + adsp1_id.fw.id, adsp1_id.dm); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + pos = sizeof(adsp1_id) / 2; + len = (sizeof(*adsp1_alg) * n_algs) / 2; + + adsp1_alg = wm_adsp_read_algs(dsp, n_algs, mem->base + pos, len); + if (IS_ERR(adsp1_alg)) + return PTR_ERR(adsp1_alg); + + for (i = 0; i < n_algs; i++) { + adsp_info(dsp, "%d: ID %x v%d.%d.%d DM@%x ZM@%x\n", + i, be32_to_cpu(adsp1_alg[i].alg.id), + (be32_to_cpu(adsp1_alg[i].alg.ver) & 0xff0000) >> 16, + (be32_to_cpu(adsp1_alg[i].alg.ver) & 0xff00) >> 8, + be32_to_cpu(adsp1_alg[i].alg.ver) & 0xff, + be32_to_cpu(adsp1_alg[i].dm), + be32_to_cpu(adsp1_alg[i].zm)); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_DM, + adsp1_alg[i].alg.id, + adsp1_alg[i].dm); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + if (dsp->fw_ver == 0) { + if (i + 1 < n_algs) { + len = be32_to_cpu(adsp1_alg[i + 1].dm); + len -= be32_to_cpu(adsp1_alg[i].dm); + len *= 4; + wm_adsp_create_control(dsp, alg_region, 0, + len, NULL, 0, 0, + SNDRV_CTL_ELEM_TYPE_BYTES); + } else { + adsp_warn(dsp, "Missing length info for region DM with ID %x\n", + be32_to_cpu(adsp1_alg[i].alg.id)); + } + } + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_ZM, + adsp1_alg[i].alg.id, + adsp1_alg[i].zm); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + if (dsp->fw_ver == 0) { + if (i + 1 < n_algs) { + len = be32_to_cpu(adsp1_alg[i + 1].zm); + len -= be32_to_cpu(adsp1_alg[i].zm); + len *= 4; + wm_adsp_create_control(dsp, alg_region, 0, + len, NULL, 0, 0, + SNDRV_CTL_ELEM_TYPE_BYTES); + } else { + adsp_warn(dsp, "Missing length info for region ZM with ID %x\n", + be32_to_cpu(adsp1_alg[i].alg.id)); + } + } + } + +out: + kfree(adsp1_alg); + return ret; +} + +static int wm_adsp2_setup_algs(struct wm_adsp *dsp) +{ + struct wmfw_adsp2_id_hdr adsp2_id; + struct wmfw_adsp2_alg_hdr *adsp2_alg; + struct wm_adsp_alg_region *alg_region; + const struct wm_adsp_region *mem; + unsigned int pos, len; + size_t n_algs; + int i, ret; + + mem = wm_adsp_find_region(dsp, WMFW_ADSP2_XM); + if (WARN_ON(!mem)) + return -EINVAL; + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, mem->base, &adsp2_id, + sizeof(adsp2_id)); + if (ret != 0) { + adsp_err(dsp, "Failed to read algorithm info: %d\n", + ret); + return ret; + } + + n_algs = be32_to_cpu(adsp2_id.n_algs); + dsp->fw_id = be32_to_cpu(adsp2_id.fw.id); + dsp->fw_id_version = be32_to_cpu(adsp2_id.fw.ver); + dsp->fw_vendor_id = 0; + adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n", + dsp->fw_id, + (dsp->fw_id_version & 0xff0000) >> 16, + (dsp->fw_id_version & 0xff00) >> 8, + dsp->fw_id_version & 0xff, + n_algs); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, + adsp2_id.fw.id, adsp2_id.xm); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, + adsp2_id.fw.id, adsp2_id.ym); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + switch (dsp->type) { + case WMFW_HALO: + pos = sizeof(adsp2_id); + len = sizeof(*adsp2_alg) * n_algs; + break; + default: + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_ZM, + adsp2_id.fw.id, adsp2_id.zm); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + pos = sizeof(adsp2_id) / 2; + len = (sizeof(*adsp2_alg) * n_algs) / 2; + break; + } + + adsp2_alg = wm_adsp_read_algs(dsp, n_algs, mem->base + pos, len); + if (IS_ERR(adsp2_alg)) + return PTR_ERR(adsp2_alg); + + for (i = 0; i < n_algs; i++) { + adsp_info(dsp, + "%d: ID %x v%d.%d.%d XM@%x YM@%x ZM@%x\n", + i, be32_to_cpu(adsp2_alg[i].alg.id), + (be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff0000) >> 16, + (be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff00) >> 8, + be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff, + be32_to_cpu(adsp2_alg[i].xm), + be32_to_cpu(adsp2_alg[i].ym), + be32_to_cpu(adsp2_alg[i].zm)); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, + adsp2_alg[i].alg.id, + adsp2_alg[i].xm); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + if (dsp->fw_ver == 0) { + if (i + 1 < n_algs) { + len = be32_to_cpu(adsp2_alg[i + 1].xm); + len -= be32_to_cpu(adsp2_alg[i].xm); + len *= 4; + wm_adsp_create_control(dsp, alg_region, 0, + len, NULL, 0, 0, + SNDRV_CTL_ELEM_TYPE_BYTES); + } else { + adsp_warn(dsp, "Missing length info for region XM with ID %x\n", + be32_to_cpu(adsp2_alg[i].alg.id)); + } + } + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, + adsp2_alg[i].alg.id, + adsp2_alg[i].ym); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + if (dsp->fw_ver == 0) { + if (i + 1 < n_algs) { + len = be32_to_cpu(adsp2_alg[i + 1].ym); + len -= be32_to_cpu(adsp2_alg[i].ym); + len *= 4; + wm_adsp_create_control(dsp, alg_region, 0, + len, NULL, 0, 0, + SNDRV_CTL_ELEM_TYPE_BYTES); + } else { + adsp_warn(dsp, "Missing length info for region YM with ID %x\n", + be32_to_cpu(adsp2_alg[i].alg.id)); + } + } + + /* no ZM on HALO */ + if (dsp->type == WMFW_HALO) + continue; + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_ZM, + adsp2_alg[i].alg.id, + adsp2_alg[i].zm); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + if (dsp->fw_ver == 0) { + if (i + 1 < n_algs) { + len = be32_to_cpu(adsp2_alg[i + 1].zm); + len -= be32_to_cpu(adsp2_alg[i].zm); + len *= 4; + wm_adsp_create_control(dsp, alg_region, 0, + len, NULL, 0, 0, + SNDRV_CTL_ELEM_TYPE_BYTES); + } else { + adsp_warn(dsp, "Missing length info for region ZM with ID %x\n", + be32_to_cpu(adsp2_alg[i].alg.id)); + } + } + } + +out: + kfree(adsp2_alg); + return ret; +} + +static int wm_halo_setup_algs(struct wm_adsp *dsp) +{ + struct wmfw_halo_id_hdr halo_id; + struct wmfw_halo_alg_hdr *halo_alg; + struct wm_adsp_alg_region *alg_region; + const struct wm_adsp_region *mem; + unsigned int pos, len, block_rev; + size_t n_algs; + int i, ret; + + mem = wm_adsp_find_region(dsp, WMFW_ADSP2_XM); + if (WARN_ON(!mem)) + return -EINVAL; + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, mem->base, &halo_id, + sizeof(halo_id)); + if (ret != 0) { + adsp_err(dsp, "Failed to read algorithm info: %d\n", + ret); + return ret; + } + + block_rev = be32_to_cpu(halo_id.fw.block_rev) >> 16; + switch (block_rev) { + case 3: + break; + default: + adsp_err(dsp, "Unknown firmware ID block version 0x%x\n", + block_rev); + return -EINVAL; + } + + n_algs = be32_to_cpu(halo_id.n_algs); + dsp->fw_id = be32_to_cpu(halo_id.fw.id); + dsp->fw_id_version = be32_to_cpu(halo_id.fw.ver); + dsp->fw_vendor_id = be32_to_cpu(halo_id.fw.vendor_id); + adsp_info(dsp, "Firmware: %x vendor: 0x%x v%d.%d.%d, %zu algorithms\n", + dsp->fw_id, + dsp->fw_vendor_id, + (dsp->fw_id_version & 0xff0000) >> 16, + (dsp->fw_id_version & 0xff00) >> 8, + dsp->fw_id_version & 0xff, + n_algs); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, + halo_id.fw.id, halo_id.xm_base); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + alg_region = wm_adsp_create_region(dsp, WMFW_HALO_XM_PACKED, + halo_id.fw.id, halo_id.xm_base); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, + halo_id.fw.id, halo_id.ym_base); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + alg_region = wm_adsp_create_region(dsp, WMFW_HALO_YM_PACKED, + halo_id.fw.id, halo_id.ym_base); + if (IS_ERR(alg_region)) + return PTR_ERR(alg_region); + + pos = sizeof(halo_id); + len = (sizeof(*halo_alg) * n_algs); + + halo_alg = wm_adsp_read_algs(dsp, n_algs, mem->base + pos, len); + if (IS_ERR(halo_alg)) + return PTR_ERR(halo_alg); + + for (i = 0; i < n_algs; i++) { + adsp_info(dsp, + "%d: ID %x v%d.%d.%d XM@%x YM@%x\n", + i, be32_to_cpu(halo_alg[i].alg.id), + (be32_to_cpu(halo_alg[i].alg.ver) & 0xff0000) >> 16, + (be32_to_cpu(halo_alg[i].alg.ver) & 0xff00) >> 8, + be32_to_cpu(halo_alg[i].alg.ver) & 0xff, + be32_to_cpu(halo_alg[i].xm_base), + be32_to_cpu(halo_alg[i].ym_base)); + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, + halo_alg[i].alg.id, + halo_alg[i].xm_base); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + + alg_region = wm_adsp_create_region(dsp, WMFW_HALO_XM_PACKED, + halo_alg[i].alg.id, + halo_alg[i].xm_base); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + + alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, + halo_alg[i].alg.id, + halo_alg[i].ym_base); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + + alg_region = wm_adsp_create_region(dsp, WMFW_HALO_YM_PACKED, + halo_alg[i].alg.id, + halo_alg[i].ym_base); + if (IS_ERR(alg_region)) { + ret = PTR_ERR(alg_region); + goto out; + } + } + +out: + kfree(halo_alg); + return ret; +} + +static int wm_adsp_load_coeff(struct wm_adsp *dsp) +{ + LIST_HEAD(buf_list); + struct regmap *regmap = dsp->regmap; + struct wmfw_coeff_hdr *hdr; + struct wmfw_coeff_item *blk; + const struct firmware *firmware; + const struct wm_adsp_region *mem; + struct wm_adsp_alg_region *alg_region; + const char *region_name; + int ret, pos, blocks, type, offset, reg; + char *file; + struct wm_adsp_buf *buf; + + file = kzalloc(PAGE_SIZE, GFP_KERNEL); + if (file == NULL) + return -ENOMEM; + + snprintf(file, PAGE_SIZE, "%s-dsp%d-%s.bin", dsp->part, dsp->num, + wm_adsp_fw[dsp->fw].file); + file[PAGE_SIZE - 1] = '\0'; + + ret = request_firmware(&firmware, file, dsp->dev); + if (ret != 0) { + adsp_warn(dsp, "Failed to request '%s'\n", file); + ret = 0; + goto out; + } + ret = -EINVAL; + + if (sizeof(*hdr) >= firmware->size) { + adsp_err(dsp, "%s: file too short, %zu bytes\n", + file, firmware->size); + goto out_fw; + } + + hdr = (void *)&firmware->data[0]; + if (memcmp(hdr->magic, "WMDR", 4) != 0) { + adsp_err(dsp, "%s: invalid magic\n", file); + goto out_fw; + } + + switch (be32_to_cpu(hdr->rev) & 0xff) { + case 1: + break; + default: + adsp_err(dsp, "%s: Unsupported coefficient file format %d\n", + file, be32_to_cpu(hdr->rev) & 0xff); + ret = -EINVAL; + goto out_fw; + } + + adsp_dbg(dsp, "%s: v%d.%d.%d\n", file, + (le32_to_cpu(hdr->ver) >> 16) & 0xff, + (le32_to_cpu(hdr->ver) >> 8) & 0xff, + le32_to_cpu(hdr->ver) & 0xff); + + pos = le32_to_cpu(hdr->len); + + blocks = 0; + while (pos < firmware->size && + pos - firmware->size > sizeof(*blk)) { + blk = (void *)(&firmware->data[pos]); + + type = le16_to_cpu(blk->type); + offset = le16_to_cpu(blk->offset); + + adsp_dbg(dsp, "%s.%d: %x v%d.%d.%d\n", + file, blocks, le32_to_cpu(blk->id), + (le32_to_cpu(blk->ver) >> 16) & 0xff, + (le32_to_cpu(blk->ver) >> 8) & 0xff, + le32_to_cpu(blk->ver) & 0xff); + adsp_dbg(dsp, "%s.%d: %d bytes at 0x%x in %x\n", + file, blocks, le32_to_cpu(blk->len), offset, type); + + reg = 0; + region_name = "Unknown"; + switch (type) { + case (WMFW_NAME_TEXT << 8): + case (WMFW_INFO_TEXT << 8): + break; + case (WMFW_ABSOLUTE << 8): + /* + * Old files may use this for global + * coefficients. + */ + if (le32_to_cpu(blk->id) == dsp->fw_id && + offset == 0) { + region_name = "global coefficients"; + mem = wm_adsp_find_region(dsp, type); + if (!mem) { + adsp_err(dsp, "No ZM\n"); + break; + } + reg = wm_adsp_region_to_reg(dsp, mem, 0); + + } else { + region_name = "register"; + reg = offset; + } + break; + + case WMFW_ADSP1_DM: + case WMFW_ADSP1_ZM: + case WMFW_ADSP2_XM: + case WMFW_ADSP2_YM: + case WMFW_HALO_XM_PACKED: + case WMFW_HALO_YM_PACKED: + case WMFW_HALO_PM_PACKED: + adsp_dbg(dsp, "%s.%d: %d bytes in %x for %x\n", + file, blocks, le32_to_cpu(blk->len), + type, le32_to_cpu(blk->id)); + + mem = wm_adsp_find_region(dsp, type); + if (!mem) { + adsp_err(dsp, "No base for region %x\n", type); + break; + } + + alg_region = wm_adsp_find_alg_region(dsp, type, + le32_to_cpu(blk->id)); + if (alg_region) { + reg = alg_region->base; + reg = wm_adsp_region_to_reg(dsp, mem, reg); + reg += offset; + } else { + adsp_err(dsp, "No %x for algorithm %x\n", + type, le32_to_cpu(blk->id)); + } + break; + + default: + adsp_err(dsp, "%s.%d: Unknown region type %x at %d\n", + file, blocks, type, pos); + break; + } + + if (reg) { + if ((pos + le32_to_cpu(blk->len) + sizeof(*blk)) > + firmware->size) { + adsp_err(dsp, + "%s.%d: %s region len %d bytes exceeds file length %zu\n", + file, blocks, region_name, + le32_to_cpu(blk->len), + firmware->size); + ret = -EINVAL; + goto out_fw; + } + + buf = wm_adsp_buf_alloc(blk->data, + le32_to_cpu(blk->len), + &buf_list); + if (!buf) { + adsp_err(dsp, "Out of memory\n"); + ret = -ENOMEM; + goto out_fw; + } + + adsp_dbg(dsp, "%s.%d: Writing %d bytes at %x\n", + file, blocks, le32_to_cpu(blk->len), + reg); + ret = regmap_raw_write_async(regmap, reg, buf->buf, + le32_to_cpu(blk->len)); + if (ret != 0) { + adsp_err(dsp, + "%s.%d: Failed to write to %x in %s: %d\n", + file, blocks, reg, region_name, ret); + } + } + + pos += (le32_to_cpu(blk->len) + sizeof(*blk) + 3) & ~0x03; + blocks++; + } + + ret = regmap_async_complete(regmap); + if (ret != 0) + adsp_err(dsp, "Failed to complete async write: %d\n", ret); + + if (pos > firmware->size) + adsp_warn(dsp, "%s.%d: %zu bytes at end of file\n", + file, blocks, pos - firmware->size); + + wm_adsp_debugfs_save_binname(dsp, file); + +out_fw: + regmap_async_complete(regmap); + release_firmware(firmware); + wm_adsp_buf_free(&buf_list); +out: + kfree(file); + return ret; +} + +int wm_adsp1_init(struct wm_adsp *dsp) +{ + INIT_LIST_HEAD(&dsp->alg_regions); + + mutex_init(&dsp->pwr_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp1_init); + +int wm_adsp1_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, + int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = &dsps[w->shift]; + struct wm_coeff_ctl *ctl; + int ret; + unsigned int val; + + dsp->codec = codec; + + mutex_lock(&dsp->pwr_lock); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, + ADSP1_SYS_ENA, ADSP1_SYS_ENA); + + /* + * For simplicity set the DSP clock rate to be the + * SYSCLK rate rather than making it configurable. + */ + if (dsp->sysclk_reg) { + ret = regmap_read(dsp->regmap, dsp->sysclk_reg, &val); + if (ret != 0) { + adsp_err(dsp, "Failed to read SYSCLK state: %d\n", + ret); + goto err_mutex; + } + + val = (val & dsp->sysclk_mask) >> dsp->sysclk_shift; + + ret = regmap_update_bits(dsp->regmap, + dsp->base + ADSP1_CONTROL_31, + ADSP1_CLK_SEL_MASK, val); + if (ret != 0) { + adsp_err(dsp, "Failed to set clock rate: %d\n", + ret); + goto err_mutex; + } + } + + ret = wm_adsp_load(dsp); + if (ret != 0) + goto err_ena; + + ret = wm_adsp1_setup_algs(dsp); + if (ret != 0) + goto err_ena; + + ret = wm_adsp_load_coeff(dsp); + if (ret != 0) + goto err_ena; + + /* Initialize caches for enabled and unset controls */ + ret = wm_coeff_init_control_caches(dsp); + if (ret != 0) + goto err_ena; + + /* Sync set controls */ + ret = wm_coeff_sync_controls(dsp); + if (ret != 0) + goto err_ena; + + dsp->booted = true; + + /* Start the core running */ + regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, + ADSP1_CORE_ENA | ADSP1_START, + ADSP1_CORE_ENA | ADSP1_START); + + dsp->running = true; + break; + + case SND_SOC_DAPM_PRE_PMD: + dsp->running = false; + dsp->booted = false; + + /* Halt the core */ + regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, + ADSP1_CORE_ENA | ADSP1_START, 0); + + regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_19, + ADSP1_WDMA_BUFFER_LENGTH_MASK, 0); + + regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, + ADSP1_SYS_ENA, 0); + + list_for_each_entry(ctl, &dsp->ctl_list, list) + ctl->enabled = 0; + + + wm_adsp_free_alg_regions(dsp); + break; + + default: + break; + } + + mutex_unlock(&dsp->pwr_lock); + + return 0; + +err_ena: + regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, + ADSP1_SYS_ENA, 0); +err_mutex: + mutex_unlock(&dsp->pwr_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(wm_adsp1_event); + +static int wm_adsp2_ena(struct wm_adsp *dsp) +{ + unsigned int val; + int ret, count; + + switch (dsp->rev) { + case 0: + ret = regmap_update_bits_async(dsp->regmap, + dsp->base + ADSP2_CONTROL, + ADSP2_SYS_ENA, ADSP2_SYS_ENA); + if (ret != 0) + return ret; + break; + default: + break; + } + + /* Wait for the RAM to start, should be near instantaneous */ + for (count = 0; count < 10; ++count) { + ret = regmap_read(dsp->regmap, dsp->base + ADSP2_STATUS1, &val); + if (ret != 0) + return ret; + + if (val & ADSP2_RAM_RDY) + break; + + usleep_range(250, 500); + } + + if (!(val & ADSP2_RAM_RDY)) { + adsp_err(dsp, "Failed to start DSP RAM\n"); + return -EBUSY; + } + + adsp_dbg(dsp, "RAM ready after %d polls\n", count); + + return 0; +} + +static void wm_adsp2_boot_work(struct work_struct *work) +{ + struct wm_adsp *dsp = container_of(work, + struct wm_adsp, + boot_work); + int ret; + + mutex_lock(&dsp->pwr_lock); + + ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, + ADSP2_MEM_ENA, ADSP2_MEM_ENA); + if (ret != 0) + goto err_mutex; + + ret = wm_adsp2_ena(dsp); + if (ret != 0) + goto err_mem; + + ret = wm_adsp_load(dsp); + if (ret != 0) + goto err_ena; + + ret = wm_adsp2_setup_algs(dsp); + if (ret != 0) + goto err_ena; + + ret = wm_adsp_load_coeff(dsp); + if (ret != 0) + goto err_ena; + + /* Initialize caches for enabled and unset controls */ + ret = wm_coeff_init_control_caches(dsp); + if (ret != 0) + goto err_ena; + + switch (dsp->rev) { + case 0: + /* Turn DSP back off until we are ready to run */ + ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, + ADSP2_SYS_ENA, 0); + if (ret != 0) + goto err_ena; + break; + default: + break; + } + + dsp->booted = true; + + mutex_unlock(&dsp->pwr_lock); + + return; + +err_ena: + regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, + ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0); +err_mem: + regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, + ADSP2_MEM_ENA, 0); +err_mutex: + mutex_unlock(&dsp->pwr_lock); +} + +static int wm_halo_set_rate_block(struct wm_adsp *dsp, + unsigned int rate_base, + unsigned int n_rates, + const u8 *rate_cache) +{ + unsigned int addr = dsp->base + rate_base, val; + int ret, i; + + for (i = 0; i < n_rates; ++i) { + val = rate_cache[i] << HALO_DSP_RATE_SHIFT; + + ret = regmap_update_bits(dsp->regmap, + addr + (i * 8), + HALO_DSP_RATE_MASK, + val); + if (ret) { + adsp_err(dsp, "Failed to set rate: %d\n", ret); + return ret; + } + + adsp_dbg(dsp, "Set rate %d to 0x%x\n", i, val); + } + + return 0; +} + +static int wm_halo_clear_stream_arb(struct wm_adsp *dsp) +{ + struct regmap *regmap = dsp->regmap; + unsigned int dspbase = dsp->base, reg; + u32 values[3] = {0, 0, 0}; + int ret; + + /* disable stream arbiter masters */ + for (reg = dspbase + HALO_STREAM_ARB_MSTR0_CONFIG_0; + reg <= dspbase + HALO_STREAM_ARB_MSTR5_CONFIG_0; + reg += 0x10) { + ret = regmap_update_bits(regmap, reg, + HALO_STREAM_ARB_MSTR_EN_MASK, 0); + if (ret) + goto error; + } + + /* clear stream arbiter masters */ + for (reg = dspbase + HALO_STREAM_ARB_MSTR0_CONFIG_0; + reg <= dspbase + HALO_STREAM_ARB_MSTR5_CONFIG_0; + reg += 0x10) { + ret = regmap_bulk_write(regmap, reg, values, 3); + if (ret) + goto error; + } + + /* clear stream arbiter channel configs */ + for (reg = dspbase + HALO_STREAM_ARB_TX1_CONFIG_0; + reg <= dspbase + HALO_STREAM_ARB_RX8_CONFIG_0; + reg += 0x8) { + ret = regmap_write(regmap, reg, + HALO_STREAM_ARB_MSTR_SEL_DEFAULT); + if (ret) + goto error; + } + + /* clear stream arbiter interrupt registers */ + values[0] = HALO_STREAM_ARB_MSTR_SEL_DEFAULT; + for (reg = dspbase + HALO_STREAM_ARB_IRQ0_CONFIG_0; + reg <= dspbase + HALO_STREAM_ARB_IRQ7_CONFIG_1; + reg += 0x10) { + ret = regmap_bulk_write(regmap, reg, values, 2); + if (ret) + goto error; + } + return 0; + +error: + adsp_err(dsp, + "Error while clearing stream arbiter config (reg 0x%x): %d\n", + reg, ret); + return ret; +} + +static int wm_halo_configure_mpu(struct wm_adsp *dsp) +{ + struct regmap *regmap = dsp->regmap; + int i = 0, len = 0, ret; + unsigned int sysinfo_base = dsp->base_sysinfo, dsp_base = dsp->base; + unsigned int xm_sz, xm_bank_sz, ym_sz, ym_bank_sz; + unsigned int xm_acc_cfg, ym_acc_cfg; + unsigned int lock_cfg; + + ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_XM_BANK_SIZE, + &xm_bank_sz); + if (ret) { + adsp_err(dsp, "Failed to read XM bank size.\n"); + goto err; + } + + if (!xm_bank_sz) { + adsp_err(dsp, "Failed to configure MPU (XM_BANK_SIZE = 0)\n"); + goto err; + } + + ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_YM_BANK_SIZE, + &ym_bank_sz); + if (ret) { + adsp_err(dsp, "Failed to read YM bank size.\n"); + goto err; + } + + if (!ym_bank_sz) { + adsp_err(dsp, "Failed to configure MPU (YM_BANK_SIZE = 0)\n"); + goto err; + } + + ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_XM_SRAM_SIZE, + &xm_sz); + if (ret) { + adsp_err(dsp, "Failed to read XM size.\n"); + goto err; + } + + ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_YM_SRAM_SIZE, + &ym_sz); + if (ret) { + adsp_err(dsp, "Failed to read YM size.\n"); + goto err; + } + + adsp_dbg(dsp, + "XM size 0x%x XM bank size 0x%x YM size 0x%x YM bank size 0x%x\n", + xm_sz, xm_bank_sz, ym_sz, ym_bank_sz); + + /* calculate amount of banks to unlock */ + xm_acc_cfg = (1 << (xm_sz / xm_bank_sz)) - 1; + ym_acc_cfg = (1 << (ym_sz / ym_bank_sz)) - 1; + + /* unlock MPU */ + ret = regmap_write(regmap, dsp_base + HALO_MPU_LOCK_CONFIG, + HALO_MPU_UNLOCK_CODE_0); + if (ret) { + adsp_err(dsp, "Error while unlocking MPU: %d\n", ret); + goto err; + } + + ret = regmap_write(regmap, dsp_base + HALO_MPU_LOCK_CONFIG, + HALO_MPU_UNLOCK_CODE_1); + if (ret) { + adsp_err(dsp, "Error while unlocking MPU: %d\n", ret); + goto err; + } + + adsp_dbg(dsp, "Unlocking XM (cfg: %x) and YM (cfg: %x)", + xm_acc_cfg, ym_acc_cfg); + + /* unlock XMEM and YMEM */ + ret = regmap_write(regmap, dsp_base + HALO_MPU_XMEM_ACCESS_0, + xm_acc_cfg); + if (ret) + goto err; + + ret = regmap_write(regmap, dsp_base + HALO_MPU_YMEM_ACCESS_0, + ym_acc_cfg); + if (ret) + goto err; + + len = sizeof(halo_mpu_access) / sizeof(halo_mpu_access[0]); + lock_cfg = (dsp->unlock_all) ? 0xFFFFFFFF : 0; + /* configure all other banks */ + for (i = 0; i < len; i++) { /* TODO: think if can be done without LUT */ + ret = regmap_write(regmap, dsp_base + halo_mpu_access[i], + lock_cfg); + if (ret) + goto err; + } + + /* lock MPU */ + ret = regmap_write(regmap, dsp_base + HALO_MPU_LOCK_CONFIG, 0); + if (ret) + adsp_err(dsp, "Error while locking MPU: %d\n", ret); + +err: + return ret; +} + +static void wm_halo_boot_work(struct work_struct *work) +{ + struct wm_adsp *dsp = container_of(work, + struct wm_adsp, + boot_work); + int ret; + + mutex_lock(&dsp->pwr_lock); + + ret = wm_adsp_load(dsp); + if (ret != 0) + goto err; + + switch (dsp->fw_ver) { + case 1: + case 2: + ret = wm_adsp2_setup_algs(dsp); + if (ret != 0) + goto err; + break; + default: + ret = wm_halo_setup_algs(dsp); + if (ret != 0) + goto err; + break; + } + + ret = wm_adsp_load_coeff(dsp); + if (ret != 0) + goto err; + + /* Initialize caches for enabled and unset controls */ + ret = wm_coeff_init_control_caches(dsp); + if (ret != 0) + goto err; + + dsp->booted = true; + + mutex_unlock(&dsp->pwr_lock); + + return; + +err: + regmap_update_bits(dsp->regmap, dsp->base + HALO_CCM_CORE_CONTROL, + HALO_CORE_EN, 0); + mutex_unlock(&dsp->pwr_lock); +} + +static void wm_adsp2_set_dspclk(struct wm_adsp *dsp, unsigned int freq) +{ + int ret; + + switch (dsp->rev) { + case 0: + ret = regmap_update_bits_async(dsp->regmap, + dsp->base + ADSP2_CLOCKING, + ADSP2_CLK_SEL_MASK, + freq << ADSP2_CLK_SEL_SHIFT); + if (ret) { + adsp_err(dsp, "Failed to set clock rate: %d\n", ret); + return; + } + break; + default: + /* clock is handled by parent codec driver */ + break; + } +} + +int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = dsp->preloaded; + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp2_preloader_get); + +int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + char preload[32]; + + snprintf(preload, ARRAY_SIZE(preload), "DSP%u Preload", mc->shift); + + dsp->preloaded = ucontrol->value.integer.value[0]; + + if (ucontrol->value.integer.value[0]) + snd_soc_dapm_force_enable_pin(dapm, preload); + else + snd_soc_dapm_disable_pin(dapm, preload); + + snd_soc_dapm_sync(dapm); + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put); + +static void wm_adsp_stop_watchdog(struct wm_adsp *dsp) +{ + switch (dsp->rev) { + case 0: + case 1: + return; + default: + regmap_update_bits(dsp->regmap, dsp->base + ADSP2_WATCHDOG, + ADSP2_WDT_ENA_MASK, 0); + } +} + +int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event, + unsigned int freq) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = &dsps[w->shift]; + struct wm_coeff_ctl *ctl; + + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + wm_adsp2_set_dspclk(dsp, freq); + queue_work(system_unbound_wq, &dsp->boot_work); + break; + case SND_SOC_DAPM_PRE_PMD: + mutex_lock(&dsp->pwr_lock); + + wm_adsp_debugfs_clear(dsp); + + dsp->fw_id = 0; + dsp->fw_id_version = 0; + + dsp->booted = false; + + regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, + ADSP2_MEM_ENA, 0); + + list_for_each_entry(ctl, &dsp->ctl_list, list) + ctl->enabled = 0; + + wm_adsp_free_alg_regions(dsp); + + mutex_unlock(&dsp->pwr_lock); + + adsp_dbg(dsp, "Shutdown complete\n"); + break; + default: + break; + } + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp2_early_event); + +int wm_halo_early_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = &dsps[w->shift]; + struct wm_coeff_ctl *ctl; + int ret; + + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + ret = regmap_update_bits(dsp->regmap, + dsp->base + HALO_CCM_CORE_CONTROL, + HALO_CORE_RESET, HALO_CORE_RESET); + if (ret != 0) { + adsp_err(dsp, "Error while resetting core: %d\n", ret); + return ret; + } + + queue_work(system_unbound_wq, &dsp->boot_work); + break; + case SND_SOC_DAPM_PRE_PMD: + mutex_lock(&dsp->pwr_lock); + + wm_adsp_debugfs_clear(dsp); + + dsp->fw_id = 0; + dsp->fw_id_version = 0; + + dsp->booted = false; + + list_for_each_entry(ctl, &dsp->ctl_list, list) + ctl->enabled = 0; + + wm_adsp_free_alg_regions(dsp); + + mutex_unlock(&dsp->pwr_lock); + + adsp_dbg(dsp, "Shutdown complete\n"); + break; + default: + break; + } + + return 0; +} +EXPORT_SYMBOL_GPL(wm_halo_early_event); + +int wm_adsp2_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = &dsps[w->shift]; + int ret; + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + flush_work(&dsp->boot_work); + + mutex_lock(&dsp->pwr_lock); + + if (!dsp->booted) { + ret = -EIO; + goto err; + } + + ret = wm_adsp2_ena(dsp); + if (ret != 0) + goto err; + + /* Sync set controls */ + ret = wm_coeff_sync_controls(dsp); + if (ret != 0) + goto err; + + wm_adsp2_lock(dsp, dsp->lock_regions); + + ret = regmap_update_bits(dsp->regmap, + dsp->base + ADSP2_CONTROL, + ADSP2_CORE_ENA | ADSP2_START, + ADSP2_CORE_ENA | ADSP2_START); + if (ret != 0) + goto err; + + if (wm_adsp_fw[dsp->fw].num_caps != 0) { + ret = wm_adsp_buffer_init(dsp); + if (ret < 0) + goto err; + } + + dsp->running = true; + + mutex_unlock(&dsp->pwr_lock); + + break; + + case SND_SOC_DAPM_PRE_PMD: + /* Tell the firmware to cleanup */ + wm_adsp_signal_event_controls(dsp, WM_ADSP_FW_EVENT_SHUTDOWN); + + wm_adsp_stop_watchdog(dsp); + + /* Log firmware state, it can be useful for analysis */ + switch (dsp->rev) { + case 0: + wm_adsp2_show_fw_status(dsp); + break; + default: + wm_adsp2v2_show_fw_status(dsp); + break; + } + + mutex_lock(&dsp->pwr_lock); + + dsp->running = false; + + regmap_update_bits(dsp->regmap, + dsp->base + ADSP2_CONTROL, + ADSP2_CORE_ENA | ADSP2_START, 0); + + /* Make sure DMAs are quiesced */ + switch (dsp->rev) { + case 0: + regmap_write(dsp->regmap, + dsp->base + ADSP2_RDMA_CONFIG_1, 0); + regmap_write(dsp->regmap, + dsp->base + ADSP2_WDMA_CONFIG_1, 0); + regmap_write(dsp->regmap, + dsp->base + ADSP2_WDMA_CONFIG_2, 0); + + regmap_update_bits(dsp->regmap, + dsp->base + ADSP2_CONTROL, + ADSP2_SYS_ENA, 0); + break; + default: + regmap_write(dsp->regmap, + dsp->base + ADSP2_RDMA_CONFIG_1, 0); + regmap_write(dsp->regmap, + dsp->base + ADSP2_WDMA_CONFIG_1, 0); + regmap_write(dsp->regmap, + dsp->base + ADSP2V2_WDMA_CONFIG_2, 0); + break; + } + + if (wm_adsp_fw[dsp->fw].num_caps != 0) + wm_adsp_buffer_free(dsp); + + mutex_unlock(&dsp->pwr_lock); + + adsp_dbg(dsp, "Execution stopped\n"); + break; + + default: + break; + } + + return 0; +err: + regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, + ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0); + mutex_unlock(&dsp->pwr_lock); + return ret; +} +EXPORT_SYMBOL_GPL(wm_adsp2_event); + +int wm_halo_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, + int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = &dsps[w->shift]; + int ret; + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + flush_work(&dsp->boot_work); + + mutex_lock(&dsp->pwr_lock); + + if (!dsp->booted) { + ret = -EIO; + goto err; + } + wm_halo_apply_calibration(w); + /* Sync set controls */ + ret = wm_coeff_sync_controls(dsp); + if (ret != 0) + goto err; + + //wm_halo_apply_calibration(w); + + adsp_dbg(dsp, "Setting RX rates.\n"); + ret = wm_halo_set_rate_block(dsp, HALO_SAMPLE_RATE_RX1, + dsp->n_rx_rates, dsp->rx_rate_cache); + if (ret) { + adsp_err(dsp, "Failed to set RX rates.\n"); + goto err; + } + + adsp_dbg(dsp, "Setting TX rates.\n"); + ret = wm_halo_set_rate_block(dsp, HALO_SAMPLE_RATE_TX1, + dsp->n_tx_rates, dsp->tx_rate_cache); + if (ret) { + adsp_err(dsp, "Failed to set TX rates.\n"); + goto err; + } + + ret = wm_halo_clear_stream_arb(dsp); + if (ret != 0) + goto err; + + /* disable NMI */ + ret = regmap_write(dsp->regmap, dsp->base + + HALO_INTP_CTL_NMI_CONTROL, 0); + if (ret != 0) { + adsp_err(dsp, "Error while disabling NMI: %d\n", ret); + goto err; + } + + ret = wm_halo_configure_mpu(dsp); + if (ret != 0) + goto err; + + ret = regmap_update_bits(dsp->regmap, + dsp->base + HALO_CCM_CORE_CONTROL, + HALO_CORE_EN, HALO_CORE_EN); + + if (ret != 0) + goto err; + + if (wm_adsp_fw[dsp->fw].num_caps != 0) { + ret = wm_adsp_buffer_init(dsp); + if (ret < 0) + goto err; + } + + dsp->running = true; + + mutex_unlock(&dsp->pwr_lock); + + break; + case SND_SOC_DAPM_PRE_PMD: + /* Tell the firmware to cleanup */ + wm_adsp_signal_event_controls(dsp, WM_ADSP_FW_EVENT_SHUTDOWN); + + /* Log firmware state, it can be useful for analysis */ + wm_halo_show_fw_status(dsp); + + mutex_lock(&dsp->pwr_lock); + + dsp->running = false; + + regmap_update_bits(dsp->regmap, + dsp->base + HALO_CCM_CORE_CONTROL, + HALO_CORE_EN, 0); + + wm_halo_clear_stream_arb(dsp); + + if (wm_adsp_fw[dsp->fw].num_caps != 0) + wm_adsp_buffer_free(dsp); + + mutex_unlock(&dsp->pwr_lock); + + adsp_info(dsp, "Execution stopped\n"); + break; + default: + break; + } + + return 0; +err: + mutex_unlock(&dsp->pwr_lock); + regmap_update_bits(dsp->regmap, dsp->base + HALO_CCM_CORE_CONTROL, + HALO_CORE_EN, 0); + return ret; +} +EXPORT_SYMBOL_GPL(wm_halo_event); + +static int wm_coeff_k_put(struct snd_kcontrol *kctl, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + char *p = ucontrol->value.bytes.data; + int ret = 0; + + if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { + ret = 0; + } else + memcpy(ctl->cache, p, ctl->len); + + ctl->set = 1; + ret = wm_coeff_write_control(ctl, p, ctl->len); + + + return ret; +} +static int wm_coeff_k_get(struct snd_kcontrol *kctl, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_bytes_ext *bytes_ext = + (struct soc_bytes_ext *)kctl->private_value; + struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); + char *p = ucontrol->value.bytes.data; + int ret = 0; + + if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { + ret = wm_coeff_read_control(ctl, p, ctl->len); + } else { + ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); + memcpy(p, ctl->cache, ctl->len); + } + + return ret; +} +static int wm_adsp_k_ctl_put(struct wm_adsp *dsp, const char *name, int value) +{ + struct snd_kcontrol *kctl = NULL; + struct snd_ctl_elem_value ucontrol; + struct snd_soc_card *card = dsp->codec->component.card; + + kctl = snd_soc_card_get_kcontrol(card, name); + if (kctl == NULL) { + adsp_warn(dsp, "%s: %s isn't found\n", __func__, name); + return -1; + } + + adsp_dbg(dsp, "%s: %s:0x%x\n", __func__, kctl->id.name, value); + value = cpu_to_be32(value); + memcpy((char *)ucontrol.value.bytes.data, (char *)&value, sizeof(value)); + wm_coeff_k_put(kctl, &ucontrol); + + return 0; +} + +static int wm_adsp_k_ctl_get(struct wm_adsp *dsp, const char *name) +{ + struct snd_kcontrol *kctl = NULL; + struct snd_ctl_elem_value ucontrol; + struct snd_soc_card *card = dsp->codec->component.card; + + int value = 0; + + kctl = snd_soc_card_get_kcontrol(card, name); + if (kctl == NULL) { + adsp_warn(dsp, "%s: %s isn't found\n", __func__, name); + return -1; + } + + wm_coeff_k_get(kctl, &ucontrol); + memcpy((char *)&value, (char *)ucontrol.value.bytes.data, sizeof(value)); + value = be32_to_cpu(value); + + adsp_dbg(dsp, "%s: %s:0x%x\n", __func__, kctl->id.name, value); + + return 0; +} + +static int wm_halo_apply_calibration(struct snd_soc_dapm_widget *w) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = &dsps[w->shift]; + + switch(dsp->fw) { + case WM_ADSP_FW_CALIB: + adsp_warn(dsp, "Set ambient %d, only for Z Diagnostic\n", dsp->ambient); + wm_adsp_k_ctl_put(dsp, "DSP1X Diag Z cd CAL_AMBIENT", dsp->ambient); + break; + case WM_ADSP_FW_DIAG: + adsp_warn(dsp, "Set ambient %d, only for Diagnostic\n", dsp->ambient); + wm_adsp_k_ctl_put(dsp, "DSP1X Diag cd CAL_AMBIENT", dsp->ambient); + break; + case WM_ADSP_FW_SPK_PROT: + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd CAL_R", dsp->cal_z); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd CAL_STATUS", dsp->cal_status); + wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd CAL_CHECKSUM", dsp->cal_chksum); + wm_adsp_k_ctl_get(dsp, "DSP1X Protection cd CAL_R"); + wm_adsp_k_ctl_get(dsp, "DSP1X Protection cd CAL_STATUS"); + wm_adsp_k_ctl_get(dsp, "DSP1X Protection cd CAL_CHECKSUM"); + break; + default: + break; + } + + adsp_warn(dsp, "Do thing'\n"); + return 0; +} + + +int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec) +{ + struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + char preload[32]; + + snprintf(preload, ARRAY_SIZE(preload), "DSP%d Preload", dsp->num); + snd_soc_dapm_disable_pin(dapm, preload); + + wm_adsp2_init_debugfs(dsp, codec); + + dsp->codec = codec; + + snd_soc_add_codec_controls(codec, + wm_adsp_cal_controls, + ARRAY_SIZE(wm_adsp_cal_controls)); + + return snd_soc_add_codec_controls(codec, + &wm_adsp_fw_controls[dsp->num - 1], + 1); +} +EXPORT_SYMBOL_GPL(wm_adsp2_codec_probe); + +int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec) +{ + wm_adsp2_cleanup_debugfs(dsp); + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp2_codec_remove); + +int wm_adsp2_init(struct wm_adsp *dsp) +{ + int ret; + + switch (dsp->rev) { + case 0: + /* + * Disable the DSP memory by default when in reset for a small + * power saving. + */ + ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, + ADSP2_MEM_ENA, 0); + if (ret) { + adsp_err(dsp, + "Failed to clear memory retention: %d\n", ret); + return ret; + } + break; + default: + break; + } + + INIT_LIST_HEAD(&dsp->alg_regions); + INIT_LIST_HEAD(&dsp->ctl_list); + INIT_WORK(&dsp->boot_work, wm_adsp2_boot_work); + + mutex_init(&dsp->pwr_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp2_init); + +int wm_halo_init(struct wm_adsp *dsp) +{ + INIT_LIST_HEAD(&dsp->alg_regions); + INIT_LIST_HEAD(&dsp->ctl_list); + INIT_WORK(&dsp->boot_work, wm_halo_boot_work); + + mutex_init(&dsp->pwr_lock); + + dsp->rx_rate_cache = kcalloc(dsp->n_rx_rates, sizeof(u8), GFP_KERNEL); + dsp->tx_rate_cache = kcalloc(dsp->n_tx_rates, sizeof(u8), GFP_KERNEL); + + dsp->ambient = AMBIENT_DEFAULT; + dsp->cal_z = CAL_R_DEFAULT; + dsp->cal_status = CAL_STATUS_DEFAULT; + dsp->cal_chksum = CAL_R_DEFAULT + CAL_STATUS_DEFAULT; + return 0; +} +EXPORT_SYMBOL_GPL(wm_halo_init); + +void wm_adsp2_remove(struct wm_adsp *dsp) +{ + struct wm_coeff_ctl *ctl; + + while (!list_empty(&dsp->ctl_list)) { + ctl = list_first_entry(&dsp->ctl_list, struct wm_coeff_ctl, + list); + list_del(&ctl->list); + wm_adsp_free_ctl_blk(ctl); + } + + kfree(dsp->rx_rate_cache); + kfree(dsp->tx_rate_cache); +} +EXPORT_SYMBOL_GPL(wm_adsp2_remove); + +static inline int wm_adsp_compr_attached(struct wm_adsp_compr *compr) +{ + return compr->buf != NULL; +} + +static int wm_adsp_compr_attach(struct wm_adsp_compr *compr) +{ + /* + * Note this will be more complex once each DSP can support multiple + * streams + */ + if (!compr->dsp->buffer) + return -EINVAL; + + compr->buf = compr->dsp->buffer; + compr->buf->compr = compr; + + return 0; +} + +static void wm_adsp_compr_detach(struct wm_adsp_compr *compr) +{ + if (!compr) + return; + + /* Wake the poll so it can see buffer is no longer attached */ + if (compr->stream) + snd_compr_fragment_elapsed(compr->stream); + + if (wm_adsp_compr_attached(compr)) { + compr->buf->compr = NULL; + compr->buf = NULL; + } +} + +int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream) +{ + struct wm_adsp_compr *compr; + int ret = 0; + + mutex_lock(&dsp->pwr_lock); + + if (wm_adsp_fw[dsp->fw].num_caps == 0) { + adsp_err(dsp, "Firmware does not support compressed API\n"); + ret = -ENXIO; + goto out; + } + + if (wm_adsp_fw[dsp->fw].compr_direction != stream->direction) { + adsp_err(dsp, "Firmware does not support stream direction\n"); + ret = -EINVAL; + goto out; + } + + if (dsp->compr) { + /* It is expect this limitation will be removed in future */ + adsp_err(dsp, "Only a single stream supported per DSP\n"); + ret = -EBUSY; + goto out; + } + + compr = kzalloc(sizeof(*compr), GFP_KERNEL); + if (!compr) { + ret = -ENOMEM; + goto out; + } + + compr->dsp = dsp; + compr->stream = stream; + + dsp->compr = compr; + + stream->runtime->private_data = compr; + +out: + mutex_unlock(&dsp->pwr_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_open); + +int wm_adsp_compr_free(struct snd_compr_stream *stream) +{ + struct wm_adsp_compr *compr = stream->runtime->private_data; + struct wm_adsp *dsp = compr->dsp; + + mutex_lock(&dsp->pwr_lock); + + wm_adsp_compr_detach(compr); + dsp->compr = NULL; + + kfree(compr->raw_buf); + kfree(compr); + + mutex_unlock(&dsp->pwr_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_free); + +static int wm_adsp_compr_check_params(struct snd_compr_stream *stream, + struct snd_compr_params *params) +{ + struct wm_adsp_compr *compr = stream->runtime->private_data; + struct wm_adsp *dsp = compr->dsp; + const struct wm_adsp_fw_caps *caps; + const struct snd_codec_desc *desc; + int i, j; + + if (params->buffer.fragment_size < WM_ADSP_MIN_FRAGMENT_SIZE || + params->buffer.fragment_size > WM_ADSP_MAX_FRAGMENT_SIZE || + params->buffer.fragments < WM_ADSP_MIN_FRAGMENTS || + params->buffer.fragments > WM_ADSP_MAX_FRAGMENTS || + params->buffer.fragment_size % WM_ADSP_DATA_WORD_SIZE) { + adsp_err(dsp, "Invalid buffer fragsize=%d fragments=%d\n", + params->buffer.fragment_size, + params->buffer.fragments); + + return -EINVAL; + } + + for (i = 0; i < wm_adsp_fw[dsp->fw].num_caps; i++) { + caps = &wm_adsp_fw[dsp->fw].caps[i]; + desc = &caps->desc; + + if (caps->id != params->codec.id) + continue; + + if (stream->direction == SND_COMPRESS_PLAYBACK) { + if (desc->max_ch < params->codec.ch_out) + continue; + } else { + if (desc->max_ch < params->codec.ch_in) + continue; + } + + if (!(desc->formats & (1 << params->codec.format))) + continue; + + for (j = 0; j < desc->num_sample_rates; ++j) + if (desc->sample_rates[j] == params->codec.sample_rate) + return 0; + } + + adsp_err(dsp, "Invalid params id=%u ch=%u,%u rate=%u fmt=%u\n", + params->codec.id, params->codec.ch_in, params->codec.ch_out, + params->codec.sample_rate, params->codec.format); + return -EINVAL; +} + +static inline unsigned int wm_adsp_compr_frag_words(struct wm_adsp_compr *compr) +{ + return compr->size.fragment_size / WM_ADSP_DATA_WORD_SIZE; +} + +int wm_adsp_compr_set_params(struct snd_compr_stream *stream, + struct snd_compr_params *params) +{ + struct wm_adsp_compr *compr = stream->runtime->private_data; + unsigned int size; + int ret; + + ret = wm_adsp_compr_check_params(stream, params); + if (ret) + return ret; + + compr->size = params->buffer; + + adsp_dbg(compr->dsp, "fragment_size=%d fragments=%d\n", + compr->size.fragment_size, compr->size.fragments); + + size = wm_adsp_compr_frag_words(compr) * sizeof(*compr->raw_buf); + compr->raw_buf = kmalloc(size, GFP_DMA | GFP_KERNEL); + if (!compr->raw_buf) + return -ENOMEM; + + compr->sample_rate = params->codec.sample_rate; + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_set_params); + +int wm_adsp_compr_get_caps(struct snd_compr_stream *stream, + struct snd_compr_caps *caps) +{ + struct wm_adsp_compr *compr = stream->runtime->private_data; + int fw = compr->dsp->fw; + int i; + + if (wm_adsp_fw[fw].caps) { + for (i = 0; i < wm_adsp_fw[fw].num_caps; i++) + caps->codecs[i] = wm_adsp_fw[fw].caps[i].id; + + caps->num_codecs = i; + caps->direction = wm_adsp_fw[fw].compr_direction; + + caps->min_fragment_size = WM_ADSP_MIN_FRAGMENT_SIZE; + caps->max_fragment_size = WM_ADSP_MAX_FRAGMENT_SIZE; + caps->min_fragments = WM_ADSP_MIN_FRAGMENTS; + caps->max_fragments = WM_ADSP_MAX_FRAGMENTS; + } + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_get_caps); + +static int wm_adsp_read_data_block(struct wm_adsp *dsp, int mem_type, + unsigned int mem_addr, + unsigned int num_words, u32 *data) +{ + struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type); + unsigned int i, reg; + int ret; + + if (!mem) + return -EINVAL; + + reg = wm_adsp_region_to_reg(dsp, mem, mem_addr); + + ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, reg, data, + sizeof(*data) * num_words); + if (ret < 0) + return ret; + + for (i = 0; i < num_words; ++i) + data[i] = be32_to_cpu(data[i]) & 0x00ffffffu; + + return 0; +} + +static inline int wm_adsp_read_data_word(struct wm_adsp *dsp, int mem_type, + unsigned int mem_addr, u32 *data) +{ + return wm_adsp_read_data_block(dsp, mem_type, mem_addr, 1, data); +} + +static int wm_adsp_write_data_word(struct wm_adsp *dsp, int mem_type, + unsigned int mem_addr, u32 data) +{ + struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type); + unsigned int reg; + + if (!mem) + return -EINVAL; + + reg = wm_adsp_region_to_reg(dsp, mem, mem_addr); + + data = cpu_to_be32(data & 0x00ffffffu); + + return regmap_raw_write(dsp->regmap, reg, &data, sizeof(data)); +} + +static inline int wm_adsp_buffer_read(struct wm_adsp_compr_buf *buf, + unsigned int field_offset, u32 *data) +{ + return wm_adsp_read_data_word(buf->dsp, WMFW_ADSP2_XM, + buf->host_buf_ptr + field_offset, data); +} + +static inline int wm_adsp_buffer_write(struct wm_adsp_compr_buf *buf, + unsigned int field_offset, u32 data) +{ + return wm_adsp_write_data_word(buf->dsp, WMFW_ADSP2_XM, + buf->host_buf_ptr + field_offset, data); +} + +static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf) +{ + struct wm_adsp_alg_region *alg_region; + struct wm_adsp *dsp = buf->dsp; + u32 xmalg, addr, magic; + int i, ret; + + alg_region = wm_adsp_find_alg_region(dsp, WMFW_ADSP2_XM, dsp->fw_id); + xmalg = sizeof(struct wm_adsp_system_config_xm_hdr) / sizeof(__be32); + + addr = alg_region->base + xmalg + ALG_XM_FIELD(magic); + ret = wm_adsp_read_data_word(dsp, WMFW_ADSP2_XM, addr, &magic); + if (ret < 0) + return ret; + + if (magic != WM_ADSP_ALG_XM_STRUCT_MAGIC) + return -EINVAL; + + addr = alg_region->base + xmalg + ALG_XM_FIELD(host_buf_ptr); + for (i = 0; i < 5; ++i) { + ret = wm_adsp_read_data_word(dsp, WMFW_ADSP2_XM, addr, + &buf->host_buf_ptr); + if (ret < 0) + return ret; + + if (buf->host_buf_ptr) + break; + + usleep_range(1000, 2000); + } + + if (!buf->host_buf_ptr) + return -EIO; + + adsp_dbg(dsp, "host_buf_ptr=%x\n", buf->host_buf_ptr); + + return 0; +} + +static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf) +{ + const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps; + struct wm_adsp_buffer_region *region; + u32 offset = 0; + int i, ret; + + for (i = 0; i < caps->num_regions; ++i) { + region = &buf->regions[i]; + + region->offset = offset; + region->mem_type = caps->region_defs[i].mem_type; + + ret = wm_adsp_buffer_read(buf, caps->region_defs[i].base_offset, + ®ion->base_addr); + if (ret < 0) + return ret; + + ret = wm_adsp_buffer_read(buf, caps->region_defs[i].size_offset, + &offset); + if (ret < 0) + return ret; + + region->cumulative_size = offset; + + adsp_dbg(buf->dsp, + "region=%d type=%d base=%04x off=%04x size=%04x\n", + i, region->mem_type, region->base_addr, + region->offset, region->cumulative_size); + } + + return 0; +} + +static int wm_adsp_buffer_init(struct wm_adsp *dsp) +{ + struct wm_adsp_compr_buf *buf; + int ret; + + buf = kzalloc(sizeof(*buf), GFP_KERNEL); + if (!buf) + return -ENOMEM; + + buf->dsp = dsp; + buf->read_index = -1; + buf->irq_count = 0xFFFFFFFF; + + ret = wm_adsp_buffer_locate(buf); + if (ret < 0) { + adsp_err(dsp, "Failed to acquire host buffer: %d\n", ret); + goto err_buffer; + } + + buf->regions = kcalloc(wm_adsp_fw[dsp->fw].caps->num_regions, + sizeof(*buf->regions), GFP_KERNEL); + if (!buf->regions) { + ret = -ENOMEM; + goto err_buffer; + } + + ret = wm_adsp_buffer_populate(buf); + if (ret < 0) { + adsp_err(dsp, "Failed to populate host buffer: %d\n", ret); + goto err_regions; + } + + dsp->buffer = buf; + + return 0; + +err_regions: + kfree(buf->regions); +err_buffer: + kfree(buf); + return ret; +} + +static int wm_adsp_buffer_free(struct wm_adsp *dsp) +{ + if (dsp->buffer) { + wm_adsp_compr_detach(dsp->buffer->compr); + + kfree(dsp->buffer->regions); + kfree(dsp->buffer); + + dsp->buffer = NULL; + } + + return 0; +} + +int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd) +{ + struct wm_adsp_compr *compr = stream->runtime->private_data; + struct wm_adsp *dsp = compr->dsp; + int ret = 0; + + adsp_dbg(dsp, "Trigger: %d\n", cmd); + + mutex_lock(&dsp->pwr_lock); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + if (wm_adsp_compr_attached(compr)) + break; + + ret = wm_adsp_compr_attach(compr); + if (ret < 0) { + adsp_err(dsp, "Failed to link buffer and stream: %d\n", + ret); + break; + } + + /* Trigger the IRQ at one fragment of data */ + ret = wm_adsp_buffer_write(compr->buf, + HOST_BUFFER_FIELD(high_water_mark), + wm_adsp_compr_frag_words(compr)); + if (ret < 0) { + adsp_err(dsp, "Failed to set high water mark: %d\n", + ret); + break; + } + break; + case SNDRV_PCM_TRIGGER_STOP: + break; + default: + ret = -EINVAL; + break; + } + + mutex_unlock(&dsp->pwr_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_trigger); + +static inline int wm_adsp_buffer_size(struct wm_adsp_compr_buf *buf) +{ + int last_region = wm_adsp_fw[buf->dsp->fw].caps->num_regions - 1; + + return buf->regions[last_region].cumulative_size; +} + +static int wm_adsp_buffer_update_avail(struct wm_adsp_compr_buf *buf) +{ + u32 next_read_index, next_write_index; + int write_index, read_index, avail; + int ret; + + /* Only sync read index if we haven't already read a valid index */ + if (buf->read_index < 0) { + ret = wm_adsp_buffer_read(buf, + HOST_BUFFER_FIELD(next_read_index), + &next_read_index); + if (ret < 0) + return ret; + + read_index = sign_extend32(next_read_index, 23); + + if (read_index < 0) { + adsp_dbg(buf->dsp, "Avail check on unstarted stream\n"); + return 0; + } + + buf->read_index = read_index; + } + + ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(next_write_index), + &next_write_index); + if (ret < 0) + return ret; + + write_index = sign_extend32(next_write_index, 23); + + avail = write_index - buf->read_index; + if (avail < 0) + avail += wm_adsp_buffer_size(buf); + + adsp_dbg(buf->dsp, "readindex=0x%x, writeindex=0x%x, avail=%d\n", + buf->read_index, write_index, avail * WM_ADSP_DATA_WORD_SIZE); + + buf->avail = avail; + + return 0; +} + +static int wm_adsp_buffer_get_error(struct wm_adsp_compr_buf *buf) +{ + int ret; + + ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(error), &buf->error); + if (ret < 0) { + adsp_err(buf->dsp, "Failed to check buffer error: %d\n", ret); + return ret; + } + if (buf->error != 0) { + adsp_err(buf->dsp, "Buffer error occurred: %d\n", buf->error); + return -EIO; + } + + return 0; +} + +int wm_adsp_compr_handle_irq(struct wm_adsp *dsp) +{ + struct wm_adsp_compr_buf *buf; + struct wm_adsp_compr *compr; + int ret = 0; + + mutex_lock(&dsp->pwr_lock); + + buf = dsp->buffer; + compr = dsp->compr; + + if (!buf) { + ret = -ENODEV; + goto out; + } + + adsp_dbg(dsp, "Handling buffer IRQ\n"); + + ret = wm_adsp_buffer_get_error(buf); + if (ret < 0) + goto out_notify; /* Wake poll to report error */ + + ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(irq_count), + &buf->irq_count); + if (ret < 0) { + adsp_err(dsp, "Failed to get irq_count: %d\n", ret); + goto out; + } + + ret = wm_adsp_buffer_update_avail(buf); + if (ret < 0) { + adsp_err(dsp, "Error reading avail: %d\n", ret); + goto out; + } + + if (wm_adsp_fw[dsp->fw].voice_trigger && buf->irq_count == 2) + ret = WM_ADSP_COMPR_VOICE_TRIGGER; + +out_notify: + if (compr && compr->stream) + snd_compr_fragment_elapsed(compr->stream); + +out: + mutex_unlock(&dsp->pwr_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_handle_irq); + +static int wm_adsp_buffer_reenable_irq(struct wm_adsp_compr_buf *buf) +{ + if (buf->irq_count & 0x01) + return 0; + + adsp_dbg(buf->dsp, "Enable IRQ(0x%x) for next fragment\n", + buf->irq_count); + + buf->irq_count |= 0x01; + + return wm_adsp_buffer_write(buf, HOST_BUFFER_FIELD(irq_ack), + buf->irq_count); +} + +int wm_adsp_compr_pointer(struct snd_compr_stream *stream, + struct snd_compr_tstamp *tstamp) +{ + struct wm_adsp_compr *compr = stream->runtime->private_data; + struct wm_adsp *dsp = compr->dsp; + struct wm_adsp_compr_buf *buf; + int ret = 0; + + adsp_dbg(dsp, "Pointer request\n"); + + mutex_lock(&dsp->pwr_lock); + + buf = compr->buf; + + if (!compr->buf || compr->buf->error) { + snd_compr_stop_error(stream, SNDRV_PCM_STATE_XRUN); + ret = -EIO; + goto out; + } + + if (buf->avail < wm_adsp_compr_frag_words(compr)) { + ret = wm_adsp_buffer_update_avail(buf); + if (ret < 0) { + adsp_err(dsp, "Error reading avail: %d\n", ret); + goto out; + } + + /* + * If we really have less than 1 fragment available tell the + * DSP to inform us once a whole fragment is available. + */ + if (buf->avail < wm_adsp_compr_frag_words(compr)) { + ret = wm_adsp_buffer_get_error(buf); + if (ret < 0) { + if (compr->buf->error) + snd_compr_stop_error(stream, + SNDRV_PCM_STATE_XRUN); + goto out; + } + + ret = wm_adsp_buffer_reenable_irq(buf); + if (ret < 0) { + adsp_err(dsp, + "Failed to re-enable buffer IRQ: %d\n", + ret); + goto out; + } + } + } + + tstamp->copied_total = compr->copied_total; + tstamp->copied_total += buf->avail * WM_ADSP_DATA_WORD_SIZE; + tstamp->sampling_rate = compr->sample_rate; + +out: + mutex_unlock(&dsp->pwr_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_pointer); + +static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target) +{ + struct wm_adsp_compr_buf *buf = compr->buf; + u8 *pack_in = (u8 *)compr->raw_buf; + u8 *pack_out = (u8 *)compr->raw_buf; + unsigned int adsp_addr; + int mem_type, nwords, max_read; + int i, j, ret; + + /* Calculate read parameters */ + for (i = 0; i < wm_adsp_fw[buf->dsp->fw].caps->num_regions; ++i) + if (buf->read_index < buf->regions[i].cumulative_size) + break; + + if (i == wm_adsp_fw[buf->dsp->fw].caps->num_regions) + return -EINVAL; + + mem_type = buf->regions[i].mem_type; + adsp_addr = buf->regions[i].base_addr + + (buf->read_index - buf->regions[i].offset); + + max_read = wm_adsp_compr_frag_words(compr); + nwords = buf->regions[i].cumulative_size - buf->read_index; + + if (nwords > target) + nwords = target; + if (nwords > buf->avail) + nwords = buf->avail; + if (nwords > max_read) + nwords = max_read; + if (!nwords) + return 0; + + /* Read data from DSP */ + ret = wm_adsp_read_data_block(buf->dsp, mem_type, adsp_addr, + nwords, compr->raw_buf); + if (ret < 0) + return ret; + + /* Remove the padding bytes from the data read from the DSP */ + for (i = 0; i < nwords; i++) { + for (j = 0; j < WM_ADSP_DATA_WORD_SIZE; j++) + *pack_out++ = *pack_in++; + + pack_in += sizeof(*(compr->raw_buf)) - WM_ADSP_DATA_WORD_SIZE; + } + + /* update read index to account for words read */ + buf->read_index += nwords; + if (buf->read_index == wm_adsp_buffer_size(buf)) + buf->read_index = 0; + + ret = wm_adsp_buffer_write(buf, HOST_BUFFER_FIELD(next_read_index), + buf->read_index); + if (ret < 0) + return ret; + + /* update avail to account for words read */ + buf->avail -= nwords; + + return nwords; +} + +static int wm_adsp_compr_read(struct wm_adsp_compr *compr, + char __user *buf, size_t count) +{ + struct wm_adsp *dsp = compr->dsp; + int ntotal = 0; + int nwords, nbytes; + + adsp_dbg(dsp, "Requested read of %zu bytes\n", count); + + if (!compr->buf || compr->buf->error) { + snd_compr_stop_error(compr->stream, SNDRV_PCM_STATE_XRUN); + return -EIO; + } + + count /= WM_ADSP_DATA_WORD_SIZE; + + do { + nwords = wm_adsp_buffer_capture_block(compr, count); + if (nwords < 0) { + adsp_err(dsp, "Failed to capture block: %d\n", nwords); + return nwords; + } + + nbytes = nwords * WM_ADSP_DATA_WORD_SIZE; + + adsp_dbg(dsp, "Read %d bytes\n", nbytes); + + if (copy_to_user(buf + ntotal, compr->raw_buf, nbytes)) { + adsp_err(dsp, "Failed to copy data to user: %d, %d\n", + ntotal, nbytes); + return -EFAULT; + } + + count -= nwords; + ntotal += nbytes; + } while (nwords > 0 && count > 0); + + compr->copied_total += ntotal; + + return ntotal; +} + +int wm_adsp_compr_copy(struct snd_compr_stream *stream, char __user *buf, + size_t count) +{ + struct wm_adsp_compr *compr = stream->runtime->private_data; + struct wm_adsp *dsp = compr->dsp; + int ret; + + mutex_lock(&dsp->pwr_lock); + + if (stream->direction == SND_COMPRESS_CAPTURE) + ret = wm_adsp_compr_read(compr, buf, count); + else + ret = -ENOTSUPP; + + mutex_unlock(&dsp->pwr_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(wm_adsp_compr_copy); + +int wm_adsp2_lock(struct wm_adsp *dsp, unsigned int lock_regions) +{ + struct regmap *regmap = dsp->regmap; + unsigned int code0, code1, lock_reg; + + if (!(lock_regions & WM_ADSP2_REGION_ALL)) + return 0; + + lock_regions &= WM_ADSP2_REGION_ALL; + lock_reg = dsp->base + ADSP2_LOCK_REGION_1_LOCK_REGION_0; + + while (lock_regions) { + code0 = code1 = 0; + if (lock_regions & BIT(0)) { + code0 = ADSP2_LOCK_CODE_0; + code1 = ADSP2_LOCK_CODE_1; + } + if (lock_regions & BIT(1)) { + code0 |= ADSP2_LOCK_CODE_0 << ADSP2_LOCK_REGION_SHIFT; + code1 |= ADSP2_LOCK_CODE_1 << ADSP2_LOCK_REGION_SHIFT; + } + regmap_write(regmap, lock_reg, code0); + regmap_write(regmap, lock_reg, code1); + lock_regions >>= 2; + lock_reg += 2; + } + + return 0; +} +EXPORT_SYMBOL_GPL(wm_adsp2_lock); + +irqreturn_t wm_adsp2_bus_error(struct wm_adsp *dsp) +{ + unsigned int val; + struct regmap *regmap = dsp->regmap; + int ret = 0; + + ret = regmap_read(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL, &val); + if (ret) { + adsp_err(dsp, + "Failed to read Region Lock Ctrl register: %d\n", ret); + return IRQ_HANDLED; + } + + if (val & ADSP2_WDT_TIMEOUT_STS_MASK) { + adsp_err(dsp, "watchdog timeout error\n"); + wm_adsp_stop_watchdog(dsp); + } + + if (val & (ADSP2_SLAVE_ERR_MASK | ADSP2_REGION_LOCK_ERR_MASK)) { + if (val & ADSP2_SLAVE_ERR_MASK) + adsp_err(dsp, "bus error: slave error\n"); + else + adsp_err(dsp, "bus error: region lock error\n"); + + ret = regmap_read(regmap, dsp->base + ADSP2_BUS_ERR_ADDR, &val); + if (ret) { + adsp_err(dsp, + "Failed to read Bus Err Addr register: %d\n", + ret); + return IRQ_HANDLED; + } + + adsp_err(dsp, "bus error address = 0x%x\n", + val & ADSP2_BUS_ERR_ADDR_MASK); + + ret = regmap_read(regmap, + dsp->base + ADSP2_PMEM_ERR_ADDR_XMEM_ERR_ADDR, + &val); + if (ret) { + adsp_err(dsp, + "Failed to read Pmem Xmem Err Addr register: %d\n", + ret); + return IRQ_HANDLED; + } + + adsp_err(dsp, "xmem error address = 0x%x\n", + val & ADSP2_XMEM_ERR_ADDR_MASK); + adsp_err(dsp, "pmem error address = 0x%x\n", + (val & ADSP2_PMEM_ERR_ADDR_MASK) >> + ADSP2_PMEM_ERR_ADDR_SHIFT); + } + + regmap_update_bits(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL, + ADSP2_CTRL_ERR_EINT, ADSP2_CTRL_ERR_EINT); + + return IRQ_HANDLED; +} +EXPORT_SYMBOL_GPL(wm_adsp2_bus_error); + +static void wm_halo_dump_fault_info(struct wm_adsp *dsp, const char *region, + unsigned int addr, unsigned int status) +{ + unsigned int write = status & HALO_MPU_VIO_ERR_WR_MASK; + unsigned int type = (status & HALO_MPU_VIO_STS_MASK) >> + HALO_MPU_VIO_STS_SHIFT; + unsigned int src = (status & HALO_MPU_VIO_ERR_SRC_MASK) >> + HALO_MPU_VIO_ERR_SRC_SHIFT; + + adsp_warn(dsp, "%s: FAULT_ADDR:0x%x FAULT_STATUS:0x%x %s\n", + region, addr, status, + write ? "write" : "read"); + + switch (src) { + case 0: + adsp_warn(dsp, "%s: SRC=HALO\n", region); + break; + default: + adsp_warn(dsp, "%s: SRC=Requestor%u\n", region, src); + break; + } + + adsp_warn(dsp, "%s: %s %s %s %s %s %s\n", + region, + type & HALO_MPU_VIO_SRAM ? "SRAM" : "", + type & HALO_MPU_VIO_REG ? "REG" : "", + type & HALO_MPU_VIO_AHB ? "AHB" : "", + type & HALO_MPU_VIO_EREG ? "EREG" : "", + type & HALO_MPU_VIO_EXTERNAL_MEM ? "ExtMem" : "", + type & HALO_MPU_VIO_NON_EXIST ? "NotExist" : ""); +} + +irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp) +{ + struct regmap *regmap = dsp->regmap; + unsigned int fault[6], ahb_sts, reg; + int ret; + + mutex_lock(&dsp->pwr_lock); + + /* Ensure we log the fault even if we fail to read the fault info */ + adsp_warn(dsp, "MPU FAULT\n"); + + ret = regmap_read(regmap, dsp->base_sysinfo + HALO_AHBM_WINDOW_DEBUG_1, + &ahb_sts); + if (ret) { + adsp_warn(dsp, "Failed to read AHB DEBUG_1 (%d)\n", ret); + goto exit_unlock; + } + + adsp_warn(dsp, "AHB WINDOW: ADDR: 0x%x STATUS: 0x%x\n", + (ahb_sts & HALO_AHBM_CORE_ERR_ADDR_MASK) >> + HALO_AHBM_CORE_ERR_ADDR_SHIFT, + ahb_sts); + adsp_warn(dsp, "AHB WINDOW: %s %s %s %s\n", + (ahb_sts & HALO_AHBM_ADDR_ERR_MASK) ? "ADDR" : "", + (ahb_sts & HALO_AHBM_LOCKED_ERR_MASK) ? "LOCKED" : "", + (ahb_sts & HALO_AHBM_SIZE_ERR_MASK) ? "SIZE" : "", + (ahb_sts & HALO_AHBM_MODE_ERR_MASK) ? "MODE" : ""); + + ret = regmap_read(regmap, dsp->base_sysinfo + HALO_AHBM_WINDOW_DEBUG_0, + &ahb_sts); + if (ret) { + adsp_warn(dsp, "Failed to read AHB DEBUG_0 (%d)\n", ret); + goto exit_unlock; + } + + adsp_warn(dsp, "AHB SYS_ADDR: 0x%x\n", ahb_sts); + + ret = regmap_bulk_read(regmap, dsp->base + HALO_MPU_XM_VIO_ADDR, + fault, ARRAY_SIZE(fault)); + if (ret) { + adsp_warn(dsp, "Failed to read MPU fault info (%d)\n", ret); + goto exit_unlock; + } + + wm_halo_dump_fault_info(dsp, "XM", fault[0], fault[1]); + wm_halo_dump_fault_info(dsp, "YM", fault[2], fault[3]); + wm_halo_dump_fault_info(dsp, "PM", fault[4], fault[5]); + + /* Clear fault status */ + for (reg = HALO_MPU_XM_VIO_STATUS; reg <= HALO_MPU_PM_VIO_STATUS; + reg += 8) { + ret = regmap_write(regmap, dsp->base + reg, 0); + if (ret) + adsp_warn(dsp, "Failed to clear MPU status @0x%x (%d)\n", + reg, ret); + } + +exit_unlock: + mutex_unlock(&dsp->pwr_lock); + + return IRQ_HANDLED; +} +EXPORT_SYMBOL_GPL(wm_halo_bus_error); + +MODULE_LICENSE("GPL v2"); diff --git a/asoc/codecs/cs35l41/wm_adsp.h b/asoc/codecs/cs35l41/wm_adsp.h new file mode 100755 index 000000000000..084d3aa1e14a --- /dev/null +++ b/asoc/codecs/cs35l41/wm_adsp.h @@ -0,0 +1,195 @@ +/* + * wm_adsp.h -- Wolfson ADSP support + * + * Copyright 2012 Wolfson Microelectronics plc + * + * Author: Mark Brown + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __WM_ADSP_H +#define __WM_ADSP_H + +#include +#include +#include + +#include "wmfw.h" + +/* Return values for wm_adsp_compr_handle_irq */ +#define WM_ADSP_COMPR_OK 0 +#define WM_ADSP_COMPR_VOICE_TRIGGER 1 + +#define WM_ADSP2_REGION_0 BIT(0) +#define WM_ADSP2_REGION_1 BIT(1) +#define WM_ADSP2_REGION_2 BIT(2) +#define WM_ADSP2_REGION_3 BIT(3) +#define WM_ADSP2_REGION_4 BIT(4) +#define WM_ADSP2_REGION_5 BIT(5) +#define WM_ADSP2_REGION_6 BIT(6) +#define WM_ADSP2_REGION_7 BIT(7) +#define WM_ADSP2_REGION_8 BIT(8) +#define WM_ADSP2_REGION_9 BIT(9) +#define WM_ADSP2_REGION_1_9 (WM_ADSP2_REGION_1 | \ + WM_ADSP2_REGION_2 | WM_ADSP2_REGION_3 | \ + WM_ADSP2_REGION_4 | WM_ADSP2_REGION_5 | \ + WM_ADSP2_REGION_6 | WM_ADSP2_REGION_7 | \ + WM_ADSP2_REGION_8 | WM_ADSP2_REGION_9) +#define WM_ADSP2_REGION_ALL (WM_ADSP2_REGION_0 | WM_ADSP2_REGION_1_9) + +struct wm_adsp_region { + int type; + unsigned int base; +}; + +struct wm_adsp_alg_region { + struct list_head list; + unsigned int alg; + int type; + unsigned int base; +}; + +struct wm_adsp_compr; +struct wm_adsp_compr_buf; + +struct wm_adsp { + const char *part; + int rev; + int num; + int type; + struct device *dev; + struct regmap *regmap; + struct snd_soc_codec *codec; + int cal_z; + int ambient; + int cal_status; + int cal_chksum; + int block_bypass; + int block_bypass_in_enh; + int base; + int base_sysinfo; + int sysclk_reg; + int sysclk_mask; + int sysclk_shift; + + struct list_head alg_regions; + + unsigned int fw_id; + unsigned int fw_id_version; + unsigned int fw_vendor_id; + + const struct wm_adsp_region *mem; + int num_mems; + + int fw; + int fw_ver; + + bool preloaded; + bool booted; + bool running; + + struct list_head ctl_list; + + struct work_struct boot_work; + + struct wm_adsp_compr *compr; + struct wm_adsp_compr_buf *buffer; + + struct mutex pwr_lock; + + unsigned int lock_regions; + bool unlock_all; + + unsigned int n_rx_rates; + unsigned int n_tx_rates; + + u8 *rx_rate_cache; + u8 *tx_rate_cache; + +#ifdef CONFIG_DEBUG_FS + struct dentry *debugfs_root; + char *wmfw_file_name; + char *bin_file_name; +#endif +}; + +#define WM_ADSP1(wname, num) \ + SND_SOC_DAPM_PGA_E(wname, SND_SOC_NOPM, num, 0, NULL, 0, \ + wm_adsp1_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD) + +#define WM_ADSP2_PRELOAD_SWITCH(wname, num) \ + SOC_SINGLE_EXT(wname " Preload Switch", SND_SOC_NOPM, num, 1, 0, \ + wm_adsp2_preloader_get, wm_adsp2_preloader_put) + +#define WM_ADSP2(wname, num, event_fn) \ + SND_SOC_DAPM_SPK(wname " Preload", NULL), \ +{ .id = snd_soc_dapm_supply, .name = wname " Preloader", \ + .reg = SND_SOC_NOPM, .shift = num, .event = event_fn, \ + .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \ + .subseq = 100, /* Ensure we run after SYSCLK supply widget */ }, \ +{ .id = snd_soc_dapm_out_drv, .name = wname, \ + .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp2_event, \ + .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD } + +#define WM_HALO(wname, num, event_fn) \ + SND_SOC_DAPM_SPK(wname " Preload", NULL), \ +{ .id = snd_soc_dapm_supply, .name = wname " Preloader", \ + .reg = SND_SOC_NOPM, .shift = num, .event = event_fn, \ + .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \ + .subseq = 100, /* Ensure we run after SYSCLK supply widget */ }, \ +{ .id = snd_soc_dapm_out_drv, .name = wname, \ + .reg = SND_SOC_NOPM, .shift = num, .event = wm_halo_event, \ + .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD } + +extern const struct snd_kcontrol_new wm_adsp_fw_controls[]; + +int wm_adsp1_init(struct wm_adsp *dsp); +int wm_adsp2_init(struct wm_adsp *dsp); +void wm_adsp2_remove(struct wm_adsp *dsp); +int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec); +int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec); +int wm_halo_init(struct wm_adsp *dsp); +int wm_adsp1_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event); + +int wm_halo_set_clocking(struct wm_adsp *dsp, unsigned int freq, + struct mutex *rate_lock); + +int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event, + unsigned int freq); + +int wm_adsp2_lock(struct wm_adsp *adsp, unsigned int regions); +irqreturn_t wm_adsp2_bus_error(struct wm_adsp *adsp); +irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp); + +int wm_adsp2_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event); + +int wm_halo_early_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event); +int wm_halo_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event); + +int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol); +int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol); + +int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream); +int wm_adsp_compr_free(struct snd_compr_stream *stream); +int wm_adsp_compr_set_params(struct snd_compr_stream *stream, + struct snd_compr_params *params); +int wm_adsp_compr_get_caps(struct snd_compr_stream *stream, + struct snd_compr_caps *caps); +int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd); +int wm_adsp_compr_handle_irq(struct wm_adsp *dsp); +int wm_adsp_compr_pointer(struct snd_compr_stream *stream, + struct snd_compr_tstamp *tstamp); +int wm_adsp_compr_copy(struct snd_compr_stream *stream, + char __user *buf, size_t count); + +#endif diff --git a/asoc/codecs/cs35l41/wmfw.h b/asoc/codecs/cs35l41/wmfw.h new file mode 100755 index 000000000000..5e10bb4737af --- /dev/null +++ b/asoc/codecs/cs35l41/wmfw.h @@ -0,0 +1,201 @@ +/* + * wmfw.h - Wolfson firmware format information + * + * Copyright 2012 Wolfson Microelectronics plc + * + * Author: Mark Brown + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __WMFW_H +#define __WMFW_H + +#include + +#define WMFW_MAX_ALG_NAME 256 +#define WMFW_MAX_ALG_DESCR_NAME 256 + +#define WMFW_MAX_COEFF_NAME 256 +#define WMFW_MAX_COEFF_DESCR_NAME 256 + +#define WMFW_CTL_FLAG_SYS 0x8000 +#define WMFW_CTL_FLAG_VOLATILE 0x0004 +#define WMFW_CTL_FLAG_WRITEABLE 0x0002 +#define WMFW_CTL_FLAG_READABLE 0x0001 + +/* Non-ALSA coefficient types start at 0x1000 */ +#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */ +#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */ + +struct wmfw_header { + char magic[4]; + __le32 len; + __le16 rev; + u8 core; + u8 ver; +} __packed; + +struct wmfw_footer { + __le64 timestamp; + __le32 checksum; +} __packed; + +struct wmfw_adsp1_sizes { + __le32 dm; + __le32 pm; + __le32 zm; +} __packed; + +struct wmfw_adsp2_sizes { + __le32 xm; + __le32 ym; + __le32 pm; + __le32 zm; +} __packed; + +struct wmfw_region { + union { + __be32 type; + __le32 offset; + }; + __le32 len; + u8 data[]; +} __packed; + +struct wmfw_id_hdr { + __be32 core_id; + __be32 core_rev; + __be32 id; + __be32 ver; +} __packed; + +struct wmfw_adsp1_id_hdr { + struct wmfw_id_hdr fw; + __be32 zm; + __be32 dm; + __be32 n_algs; +} __packed; + +struct wmfw_adsp2_id_hdr { + struct wmfw_id_hdr fw; + __be32 zm; + __be32 xm; + __be32 ym; + __be32 n_algs; +} __packed; + +struct wmfw_halo_fwid_hdr { + __be32 core_id; + __be32 block_rev; + __be32 vendor_id; + __be32 id; + __be32 ver; +} __packed; + +struct wmfw_halo_id_hdr { + struct wmfw_halo_fwid_hdr fw; + __be32 xm_base; + __be32 xm_size; + __be32 ym_base; + __be32 ym_size; + __be32 n_algs; +} __packed; + +struct wmfw_alg_hdr { + __be32 id; + __be32 ver; +} __packed; + +struct wmfw_adsp1_alg_hdr { + struct wmfw_alg_hdr alg; + __be32 zm; + __be32 dm; +} __packed; + +struct wmfw_adsp2_alg_hdr { + struct wmfw_alg_hdr alg; + __be32 zm; + __be32 xm; + __be32 ym; +} __packed; + +struct wmfw_halo_alg_hdr { + struct wmfw_alg_hdr alg; + __be32 xm_base; + __be32 xm_size; + __be32 ym_base; + __be32 ym_size; +} __packed; + +struct wmfw_adsp_alg_data { + __le32 id; + u8 name[WMFW_MAX_ALG_NAME]; + u8 descr[WMFW_MAX_ALG_DESCR_NAME]; + __le32 ncoeff; + u8 data[]; +} __packed; + +struct wmfw_adsp_coeff_data { + struct { + __le16 offset; + __le16 type; + __le32 size; + } hdr; + u8 name[WMFW_MAX_COEFF_NAME]; + u8 descr[WMFW_MAX_COEFF_DESCR_NAME]; + __le16 ctl_type; + __le16 flags; + __le32 len; + u8 data[]; +} __packed; + +struct wmfw_coeff_hdr { + u8 magic[4]; + __le32 len; + union { + __be32 rev; + __le32 ver; + }; + union { + __be32 core; + __le32 core_ver; + }; + u8 data[]; +} __packed; + +struct wmfw_coeff_item { + __le16 offset; + __le16 type; + __le32 id; + __le32 ver; + __le32 sr; + __le32 len; + u8 data[]; +} __packed; + +#define WMFW_ADSP1 1 +#define WMFW_ADSP2 2 +#define WMFW_HALO 4 + +#define WMFW_ABSOLUTE 0xf0 +#define WMFW_ALGORITHM_DATA 0xf2 +#define WMFW_NAME_TEXT 0xfe +#define WMFW_INFO_TEXT 0xff + +#define WMFW_ADSP1_PM 2 +#define WMFW_ADSP1_DM 3 +#define WMFW_ADSP1_ZM 4 + +#define WMFW_ADSP2_PM 2 +#define WMFW_ADSP2_ZM 4 +#define WMFW_ADSP2_XM 5 +#define WMFW_ADSP2_YM 6 + +#define WMFW_HALO_PM_PACKED 0x10 +#define WMFW_HALO_XM_PACKED 0x11 +#define WMFW_HALO_YM_PACKED 0x12 + +#endif diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 394c4faac958..63453faef3e5 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -68,6 +68,11 @@ #define WCN_CDC_SLIM_RX_CH_MAX 2 #define WCN_CDC_SLIM_TX_CH_MAX 3 +#define CS35L41_CODEC_NAME "cs35l41.0-0040" +#if 0 +static atomic_t cs35l41_mclk_rsc_ref; +#endif + #define ADSP_STATE_READY_TIMEOUT_MS 3000 #define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ #define MSM_HIFI_ON 1 @@ -5106,6 +5111,93 @@ static struct snd_soc_ops msm_mi2s_be_ops = { .shutdown = msm_mi2s_snd_shutdown, }; +/* use qcom default be ops */ +#if 0 +static int msm_hw_params_cs35l41_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + struct snd_interval *rate = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_RATE); + + struct snd_interval *channels = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + + param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, SNDRV_PCM_FORMAT_S16_LE); + + pr_debug("%s()\n", __func__); + rate->min = rate->max = 48000; + channels->min = channels->max = 2; + + return 0; +} + +static int msm_mi2s_cs35l41_startup(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_card *card = rtd->card; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_codec *codec = codec_dai->codec; + int ret; + + if (atomic_inc_return(&cs35l41_mclk_rsc_ref) == 1) { + ret = msm_mi2s_snd_startup(substream); + if (ret) { + dev_err(card->dev, "%s: Failed to startup mi2s: %d\n", __func__, ret); + return ret; + } + + // Set cpu_dai as master + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS); + if (ret < 0) { + dev_err(card->dev, "%s: Failed to set fmt cpu dai: %d\n", __func__, ret); + return ret; + } + + // Set codec_dai as slave + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_I2S); + if (ret < 0) { + dev_err(card->dev, "%s: Failed to set fmt codec dai: %d\n", __func__, ret); + return ret; + } + + // Set mclk to 12.288MHz for codec + ret = snd_soc_codec_set_sysclk(codec, 0, 0, + Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, + SND_SOC_CLOCK_IN); + if (ret < 0) { + dev_err(card->dev, "%s: Failed to set codec_sysclk: %d\n", __func__, ret); + return ret; + } + } + dev_info(card->dev, "------%s\n", __func__); + return 0; +} + +void msm_mi2s_cs35l41_shutdown(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_card *card = rtd->card; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_codec *codec = codec_dai->codec; + struct msm_asoc_mach_data *pdata = pdata = snd_soc_card_get_drvdata(codec->component.card); + + dev_info(card->dev, "+++++%s, mclk refcount = %d \n", __func__, atomic_read(&cs35l41_mclk_rsc_ref)); + + if (atomic_dec_return(&cs35l41_mclk_rsc_ref) == 0) { + msm_mi2s_snd_shutdown(substream); + } + + dev_info(card->dev, "-----%s\n", __func__); + return; +} + +static struct snd_soc_ops msm_mi2s_cs35l41_be_ops = { + .startup = msm_mi2s_cs35l41_startup, + .shutdown = msm_mi2s_cs35l41_shutdown, +}; +#endif + static struct snd_soc_ops msm_be_ops = { .hw_params = msm_snd_hw_params, }; @@ -6922,6 +7014,11 @@ static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) struct snd_soc_pcm_runtime *rtd; int ret = 0; void *mbhc_calibration; +#ifdef CONFIG_SND_SOC_CS35L41_FOR_CEPH + struct snd_soc_dai_link *dai_link; + struct snd_soc_codec *cs35l41_codec; + struct snd_soc_dapm_context * cs35l41_dapm; +#endif rtd = snd_soc_get_pcm_runtime(card, be_dl_name); if (!rtd) { @@ -6944,6 +7041,31 @@ static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) __func__, ret); goto err_hs_detect; } +#ifdef CONFIG_SND_SOC_CS35L41_FOR_CEPH +#if 0 + atomic_set(&cs35l41_mclk_rsc_ref, 0); + dev_info(card->dev, "%s: set cs35l41_mclk_rsc_ref to 0 \n", __func__); +#endif + + dai_link = rtd->dai_link; + if (dai_link && dai_link->codec_name) { + if (!strcmp(dai_link->codec_name, CS35L41_CODEC_NAME)) { + dev_info(card->dev, "%s: found codec[%s]\n", __func__, CS35L41_CODEC_NAME); + cs35l41_codec = rtd->codec; + cs35l41_dapm = snd_soc_codec_get_dapm(cs35l41_codec); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "AMP Playback"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "AMP Capture"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "DSP1"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "Main AMP"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPRX1"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPRX2"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPTX1"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPTX2"); + snd_soc_dapm_ignore_suspend(cs35l41_dapm, "SPK"); + snd_soc_dapm_sync(cs35l41_dapm); + } + } +#endif return 0; err_hs_detect: diff --git a/config/sm8150auto.conf b/config/sm8150auto.conf index e0e49e7757ba..7f2a9bfa77d2 100644 --- a/config/sm8150auto.conf +++ b/config/sm8150auto.conf @@ -39,3 +39,5 @@ CONFIG_SND_SOC_MSM_STUB=m CONFIG_MSM_AVTIMER=m CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m CONFIG_VOICE_MHI=m +CONFIG_SND_SOC_CS35L41=m +CONFIG_SND_SOC_CS35L41_FOR_CEPH=m diff --git a/config/sm8150autoconf.h b/config/sm8150autoconf.h index e0eea9d99c5e..cfcb56eee838 100644 --- a/config/sm8150autoconf.h +++ b/config/sm8150autoconf.h @@ -51,3 +51,4 @@ #define CONFIG_MSM_AVTIMER 1 #define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 #define CONFIG_VOICE_MHI 1 +#define CONFIG_SND_SOC_CS35L41 1 diff --git a/include/uapi/sound/cs35l41.h b/include/uapi/sound/cs35l41.h new file mode 100755 index 000000000000..a3f7e537f6b8 --- /dev/null +++ b/include/uapi/sound/cs35l41.h @@ -0,0 +1,83 @@ +/* + * linux/sound/cs35l41.h -- Platform data for CS35L41 + * + * Copyright (c) 2018 Cirrus Logic Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __CS35L41_H +#define __CS35L41_H + +struct classh_cfg { + bool classh_bst_override; + bool classh_algo_enable; + int classh_bst_max_limit; + int classh_mem_depth; + int classh_release_rate; + int classh_headroom; + int classh_wk_fet_delay; + int classh_wk_fet_thld; +}; + +struct irq_cfg { + bool is_present; + bool irq_pol_inv; + bool irq_out_en; + int irq_src_sel; +}; + +struct cs35l41_platform_data { + bool sclk_frc; + bool lrclk_frc; + bool right_channel; + bool amp_gain_zc; + bool ng_enable; + int bst_ind; + int bst_vctrl; + int bst_ipk; + int bst_cap; + int temp_warn_thld; + int ng_pcm_thld; + int ng_delay; + int dout_hiz; + struct irq_cfg irq_config1; + struct irq_cfg irq_config2; + struct classh_cfg classh_config; + int mnSpkType; + struct device_node *spk_id_gpio_p; +}; + +struct cs35l41_private { + struct wm_adsp dsp; /* needs to be first member */ + struct snd_soc_codec *codec; + struct cs35l41_platform_data pdata; + struct device *dev; + struct regmap *regmap; + struct regulator_bulk_data supplies[2]; + int num_supplies; + int irq; + int clksrc; + int extclk_freq; + int extclk_cfg; + int sclk; + unsigned int cspl_cmd; + bool dspa_mode; + bool i2s_mode; + bool swire_mode; + bool halo_booted; + bool bus_spi; + /* GPIO for /RST */ + //struct gpio_desc *reset_gpio; + int reset_gpio; + struct completion global_pup_done; + struct completion global_pdn_done; + struct completion mbox_cmd; +}; + +int cs35l41_probe(struct cs35l41_private *cs35l41, + struct cs35l41_platform_data *pdata); +int spk_id_get(struct device_node *np); +#endif /* __CS35L41_H */ From 23b36a3f086ee2f0535913388c13aa5f43821329 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 17:29:13 +0530 Subject: [PATCH 085/127] ASoC: Add Support for tas2557 driver - Extracted from MiCode/vendor_qcom_opensource_audio-kernel at branch 'cepheus-q-oss' Signed-off-by: UtsavBalar1231 --- Android.mk | 1 + asoc/codecs/Kbuild | 1 + asoc/codecs/tas2557/Android.mk | 55 + asoc/codecs/tas2557/Kbuild | 118 ++ asoc/codecs/tas2557/tas2557-codec.c | 668 ++++++++ asoc/codecs/tas2557/tas2557-codec.h | 30 + asoc/codecs/tas2557/tas2557-core.c | 2137 ++++++++++++++++++++++++++ asoc/codecs/tas2557/tas2557-core.h | 81 + asoc/codecs/tas2557/tas2557-misc.c | 603 ++++++++ asoc/codecs/tas2557/tas2557-misc.h | 57 + asoc/codecs/tas2557/tas2557-regmap.c | 936 +++++++++++ asoc/codecs/tas2557/tas2557.h | 495 ++++++ asoc/codecs/tas2557/tiload.c | 428 ++++++ asoc/codecs/tas2557/tiload.h | 65 + config/sm8150auto.conf | 4 + config/sm8150autoconf.h | 4 + 16 files changed, 5683 insertions(+) create mode 100755 asoc/codecs/tas2557/Android.mk create mode 100755 asoc/codecs/tas2557/Kbuild create mode 100755 asoc/codecs/tas2557/tas2557-codec.c create mode 100755 asoc/codecs/tas2557/tas2557-codec.h create mode 100755 asoc/codecs/tas2557/tas2557-core.c create mode 100755 asoc/codecs/tas2557/tas2557-core.h create mode 100755 asoc/codecs/tas2557/tas2557-misc.c create mode 100755 asoc/codecs/tas2557/tas2557-misc.h create mode 100755 asoc/codecs/tas2557/tas2557-regmap.c create mode 100755 asoc/codecs/tas2557/tas2557.h create mode 100755 asoc/codecs/tas2557/tiload.c create mode 100755 asoc/codecs/tas2557/tiload.h diff --git a/Android.mk b/Android.mk index 9a79412df70b..40d7448ec3e6 100644 --- a/Android.mk +++ b/Android.mk @@ -23,6 +23,7 @@ include $(MY_LOCAL_PATH)/asoc/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/wcd934x/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/cs35l41/Android.mk +include $(MY_LOCAL_PATH)/asoc/codecs/tas2557/Android.mk endif ifeq ($(call is-board-platform-in-list, atoll),true) diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild index eede1524b127..8b308313fc87 100644 --- a/asoc/codecs/Kbuild +++ b/asoc/codecs/Kbuild @@ -210,6 +210,7 @@ ifeq ($(KERNEL_BUILD), 1) obj-y += wcd9360/ obj-y += wcd937x/ obj-y += cs35l41/ + obj-y += tas2557/ endif ifeq ($(CONFIG_SND_SOC_GCOV), y) diff --git a/asoc/codecs/tas2557/Android.mk b/asoc/codecs/tas2557/Android.mk new file mode 100755 index 000000000000..279ede3ee009 --- /dev/null +++ b/asoc/codecs/tas2557/Android.mk @@ -0,0 +1,55 @@ +# Android makefile for audio kernel modules + +# Assume no targets will be supported + +# Check if this driver needs be built for current target +ifeq ($(call is-board-platform,msmnile),true) +AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m +endif + +ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) +AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m +endif + +AUDIO_CHIPSET := audio +# Build/Package only in case of supported target +ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE)),true) + +LOCAL_PATH := $(call my-dir) + +# This makefile is only for DLKM +ifneq ($(findstring vendor,$(LOCAL_PATH)),) + +ifneq ($(findstring opensource,$(LOCAL_PATH)),) + #AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel + AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel +endif # opensource + +DLKM_DIR := $(TOP)/device/qcom/common/dlkm + +# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko +########################################################### +# This is set once per LOCAL_PATH, not per (kernel) module +KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) + +# We are actually building audio.ko here, as per the +# requirement we are specifying _audio.ko as LOCAL_MODULE. +# This means we need to rename the module to _audio.ko +# after audio.ko is built. +KBUILD_OPTIONS += MODNAME=tas2557_dlkm +KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) +KBUILD_OPTIONS += $(AUDIO_SELECT) + +########################################################### +include $(CLEAR_VARS) +LOCAL_MODULE := $(AUDIO_CHIPSET)_tas2557.ko +LOCAL_MODULE_KBUILD_NAME := tas2557_dlkm.ko +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_DEBUG_ENABLE := true +LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +include $(DLKM_DIR)/AndroidKernelModule.mk +########################################################### +########################################################### + +endif # DLKM check +endif # supported target check diff --git a/asoc/codecs/tas2557/Kbuild b/asoc/codecs/tas2557/Kbuild new file mode 100755 index 000000000000..3be6f37c47b9 --- /dev/null +++ b/asoc/codecs/tas2557/Kbuild @@ -0,0 +1,118 @@ +# We can build either as part of a standalone Kernel build or as +# an external module. Determine which mechanism is being used +ifeq ($(MODNAME),) + KERNEL_BUILD := 1 +else + KERNEL_BUILD := 0 +endif + + + +ifeq ($(KERNEL_BUILD), 1) + # These are configurable via Kconfig for kernel-based builds + # Need to explicitly configure for Android-based builds + AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.14 + AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio +endif + +ifeq ($(KERNEL_BUILD), 0) + ifeq ($(CONFIG_ARCH_SM8150), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif + ifeq ($(CONFIG_ARCH_SM6150), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif + + ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif +endif + +# As per target team, build is done as follows: +# Defconfig : build with default flags +# Slub : defconfig + CONFIG_SLUB_DEBUG := y + +# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y +# Perf : Using appropriate msmXXXX-perf_defconfig +# +# Shipment builds (user variants) should not have any debug feature +# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds +# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since +# there is no other way to identify defconfig builds, QTI internal +# representation of perf builds (identified using the string 'perf'), +# is used to identify if the build is a slub or defconfig one. This +# way no critical debug feature will be enabled for perf and shipment +# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT +# config. + +############ UAPI ############ +UAPI_DIR := uapi +UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) + +############ COMMON ############ +COMMON_DIR := include +COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) + +############ CS35L41 ############ + +# for CS35L41 Codec +ifdef CONFIG_SND_SOC_TAS2557 + TAS2557_OBJS += tas2557-core.o + TAS2557_OBJS += tas2557-misc.o + TAS2557_OBJS += tas2557-codec.o + TAS2557_OBJS += tas2557-regmap.o + TAS2557_OBJS += tiload.o +endif + +LINUX_INC += -Iinclude/linux + +INCS += $(COMMON_INC) \ + $(UAPI_INC) + +EXTRA_CFLAGS += $(INCS) + + +CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ + -DANI_LITTLE_BIT_ENDIAN \ + -DDOT11F_LITTLE_ENDIAN_HOST \ + -DANI_COMPILER_TYPE_GCC \ + -DANI_OS_TYPE_ANDROID=6 \ + -DPTT_SOCK_SVC_ENABLE \ + -Wall\ + -Werror\ + -D__linux__ + +KBUILD_CPPFLAGS += $(CDEFINES) + +# Currently, for versions of gcc which support it, the kernel Makefile +# is disabling the maybe-uninitialized warning. Re-enable it for the +# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it +# will override the kernel settings. +ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) +EXTRA_CFLAGS += -Wmaybe-uninitialized +endif +#EXTRA_CFLAGS += -Wmissing-prototypes + +ifeq ($(call cc-option-yn, -Wheader-guard),y) +EXTRA_CFLAGS += -Wheader-guard +endif + +ifeq ($(KERNEL_BUILD), 0) +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers +endif + +# Module information used by KBuild framework +obj-$(CONFIG_SND_SOC_TAS2557) += tas2557_dlkm.o +tas2557_dlkm-y := $(TAS2557_OBJS) + +# inject some build related information +DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/tas2557/tas2557-codec.c b/asoc/codecs/tas2557/tas2557-codec.c new file mode 100755 index 000000000000..06de3fd7bc43 --- /dev/null +++ b/asoc/codecs/tas2557/tas2557-codec.c @@ -0,0 +1,668 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557-codec.c +** +** Description: +** ALSA SoC driver for Texas Instruments TAS2557 High Performance 4W Smart Amplifier +** +** ============================================================================= +*/ + +#ifdef CONFIG_TAS2557_CODEC + +#define DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tas2557-core.h" +#include "tas2557-codec.h" + +#define KCONTROL_CODEC + +static unsigned int tas2557_codec_read(struct snd_soc_codec *pCodec, + unsigned int nRegister) +{ + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + int ret = 0; + unsigned int Value = 0; + + mutex_lock(&pTAS2557->codec_lock); + + ret = pTAS2557->read(pTAS2557, nRegister, &Value); + if (ret < 0) + dev_err(pTAS2557->dev, "%s, %d, ERROR happen=%d\n", __func__, + __LINE__, ret); + else + ret = Value; + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static int tas2557_codec_write(struct snd_soc_codec *pCodec, unsigned int nRegister, + unsigned int nValue) +{ + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + int ret = 0; + + mutex_lock(&pTAS2557->codec_lock); + + ret = pTAS2557->write(pTAS2557, nRegister, nValue); + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static int tas2557_codec_suspend(struct snd_soc_codec *pCodec) +{ + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + int ret = 0; + + mutex_lock(&pTAS2557->codec_lock); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + pTAS2557->runtime_suspend(pTAS2557); + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static int tas2557_codec_resume(struct snd_soc_codec *pCodec) +{ + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + int ret = 0; + + mutex_lock(&pTAS2557->codec_lock); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + pTAS2557->runtime_resume(pTAS2557); + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static const struct snd_soc_dapm_widget tas2557_dapm_widgets[] = { + SND_SOC_DAPM_AIF_IN("ASI1", "ASI1 Playback", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_IN("ASI2", "ASI2 Playback", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_IN("ASIM", "ASIM Playback", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0), + + SND_SOC_DAPM_OUT_DRV("ClassD", SND_SOC_NOPM, 0, 0, NULL, 0), + + SND_SOC_DAPM_SUPPLY("PLL", SND_SOC_NOPM, 0, 0, NULL, 0), + SND_SOC_DAPM_SUPPLY("NDivider", SND_SOC_NOPM, 0, 0, NULL, 0), + + SND_SOC_DAPM_OUTPUT("OUT") +}; + +static const struct snd_soc_dapm_route tas2557_audio_map[] = { + {"DAC", NULL, "ASI1"}, + {"DAC", NULL, "ASI2"}, + {"DAC", NULL, "ASIM"}, + {"ClassD", NULL, "DAC"}, + {"OUT", NULL, "ClassD"}, + {"DAC", NULL, "PLL"}, + {"DAC", NULL, "NDivider"}, +}; + +static int tas2557_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + return 0; +} + +static void tas2557_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); +} + +static int tas2557_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_codec *codec = dai->codec; + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + mutex_lock(&pTAS2557->codec_lock); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + tas2557_enable(pTAS2557, !mute); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_set_dai_sysclk(struct snd_soc_dai *pDAI, + int nClkID, unsigned int nFreqency, int nDir) +{ + struct snd_soc_codec *pCodec = pDAI->codec; + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + + dev_dbg(pTAS2557->dev, "tas2557_set_dai_sysclk: freq = %u\n", nFreqency); + + return 0; +} + +static int tas2557_hw_params(struct snd_pcm_substream *pSubstream, + struct snd_pcm_hw_params *pParams, struct snd_soc_dai *pDAI) +{ + struct snd_soc_codec *pCodec = pDAI->codec; + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + + mutex_lock(&pTAS2557->codec_lock); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); +/* do bit rate setting during platform data */ +/* tas2557_set_bit_rate(pTAS2557, channel_both, snd_pcm_format_width(params_format(pParams))); */ + tas2557_set_sampling_rate(pTAS2557, params_rate(pParams)); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_set_dai_fmt(struct snd_soc_dai *pDAI, unsigned int nFormat) +{ + struct snd_soc_codec *codec = pDAI->codec; + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + return 0; +} + +static int tas2557_prepare(struct snd_pcm_substream *pSubstream, + struct snd_soc_dai *pDAI) +{ + struct snd_soc_codec *codec = pDAI->codec; + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + return 0; +} + +static int tas2557_set_bias_level(struct snd_soc_codec *pCodec, + enum snd_soc_bias_level eLevel) +{ + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + + dev_dbg(pTAS2557->dev, "%s: %d\n", __func__, eLevel); + return 0; +} + +static int tas2557_codec_probe(struct snd_soc_codec *pCodec) +{ + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + return 0; +} + +static int tas2557_codec_remove(struct snd_soc_codec *pCodec) +{ + return 0; +} +static int tas2557_mute_ctrl_get(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + mutex_lock(&pTAS2557->codec_lock); + + pValue->value.integer.value[0] = pTAS2557->mbMute; + dev_dbg(pTAS2557->dev, "tas2557_mute_ctrl_get = %d\n", + pTAS2557->mbMute); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_mute_ctrl_put(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + int mbMute = pValue->value.integer.value[0]; + + mutex_lock(&pTAS2557->codec_lock); + + dev_dbg(pTAS2557->dev, "tas2557_mute_ctrl_put = %d\n", mbMute); + + tas2557_permanent_mute(pTAS2557, mbMute); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_power_ctrl_get(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + mutex_lock(&pTAS2557->codec_lock); + + pValue->value.integer.value[0] = pTAS2557->mbPowerUp; + dev_dbg(pTAS2557->dev, "tas2557_power_ctrl_get = %d\n", + pTAS2557->mbPowerUp); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_power_ctrl_put(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + int nPowerOn = pValue->value.integer.value[0]; + + mutex_lock(&pTAS2557->codec_lock); + + dev_dbg(pTAS2557->dev, "tas2557_power_ctrl_put = %d\n", nPowerOn); + tas2557_enable(pTAS2557, (nPowerOn != 0)); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int vendor_id_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = VENDOR_ID_NONE; + + if (pTAS2557->spk_id_gpio_p) + ucontrol->value.integer.value[0] = spk_id_get(pTAS2557->spk_id_gpio_p); + + return 0; +} + +static int pa_version_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = 0; + + if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) + ucontrol->value.integer.value[0] = 1; + else if(pTAS2557->mnPGID == TAS2557_PG_VERSION_2P0) + ucontrol->value.integer.value[0] = 2; + else if(pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) + ucontrol->value.integer.value[0] = 3; + return 0; +} + +static int tas2557_fs_get(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + int nFS = 48000; + + mutex_lock(&pTAS2557->codec_lock); + + if (pTAS2557->mpFirmware->mnConfigurations) + nFS = pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration].mnSamplingRate; + pValue->value.integer.value[0] = nFS; + dev_dbg(pTAS2557->dev, "tas2557_fs_get = %d\n", nFS); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_fs_put(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + int ret = 0; + int nFS = pValue->value.integer.value[0]; + + mutex_lock(&pTAS2557->codec_lock); + + dev_info(pTAS2557->dev, "tas2557_fs_put = %d\n", nFS); + ret = tas2557_set_sampling_rate(pTAS2557, nFS); + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static int tas2557_Cali_get(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + bool ret = 0; + int prm_r0 = 0; + + mutex_lock(&pTAS2557->codec_lock); + + ret = tas2557_get_Cali_prm_r0(pTAS2557, &prm_r0); + if (ret) + pValue->value.integer.value[0] = prm_r0; + + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_program_get(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + mutex_lock(&pTAS2557->codec_lock); + + pValue->value.integer.value[0] = pTAS2557->mnCurrentProgram; + dev_dbg(pTAS2557->dev, "tas2557_program_get = %d\n", + pTAS2557->mnCurrentProgram); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_program_put(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + unsigned int nProgram = pValue->value.integer.value[0]; + int ret = 0, nConfiguration = -1; + + mutex_lock(&pTAS2557->codec_lock); + + if (nProgram == pTAS2557->mnCurrentProgram) + nConfiguration = pTAS2557->mnCurrentConfiguration; + ret = tas2557_set_program(pTAS2557, nProgram, nConfiguration); + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static int tas2557_configuration_get(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + mutex_lock(&pTAS2557->codec_lock); + + pValue->value.integer.value[0] = pTAS2557->mnCurrentConfiguration; + dev_dbg(pTAS2557->dev, "tas2557_configuration_get = %d\n", + pTAS2557->mnCurrentConfiguration); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_configuration_put(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + unsigned int nConfiguration = pValue->value.integer.value[0]; + int ret = 0; + + mutex_lock(&pTAS2557->codec_lock); + + dev_info(pTAS2557->dev, "%s = %d\n", __func__, nConfiguration); + ret = tas2557_set_config(pTAS2557, nConfiguration); + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static int tas2557_calibration_get(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + + mutex_lock(&pTAS2557->codec_lock); + + pValue->value.integer.value[0] = pTAS2557->mnCurrentCalibration; + dev_info(pTAS2557->dev, + "tas2557_calibration_get = %d\n", + pTAS2557->mnCurrentCalibration); + + mutex_unlock(&pTAS2557->codec_lock); + return 0; +} + +static int tas2557_calibration_put(struct snd_kcontrol *pKcontrol, + struct snd_ctl_elem_value *pValue) +{ +#ifdef KCONTROL_CODEC + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); +#else + struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); +#endif + struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); + unsigned int nCalibration = pValue->value.integer.value[0]; + int ret = 0; + + mutex_lock(&pTAS2557->codec_lock); + + ret = tas2557_set_calibration(pTAS2557, nCalibration); + + mutex_unlock(&pTAS2557->codec_lock); + return ret; +} + +static const char *const vendor_id_text[] = {"None", "AAC", "SSI", "GOER", "Unknown"}; +static const struct soc_enum vendor_id[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(vendor_id_text), vendor_id_text), +}; + +static const char *const pa_version_text[] = {"Unknown", "tas2557_v1.0", "tas2557_v2.0", "tas2557_v2.1"}; +static const struct soc_enum pa_version[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(pa_version_text), pa_version_text), +}; + +static const struct snd_kcontrol_new tas2557_snd_controls[] = { + SOC_SINGLE_EXT("PowerCtrl", SND_SOC_NOPM, 0, 0x0001, 0, + tas2557_power_ctrl_get, tas2557_power_ctrl_put), + SOC_SINGLE_EXT("Program", SND_SOC_NOPM, 0, 0x00FF, 0, tas2557_program_get, + tas2557_program_put), + SOC_SINGLE_EXT("Configuration", SND_SOC_NOPM, 0, 0x00FF, 0, + tas2557_configuration_get, tas2557_configuration_put), + SOC_SINGLE_EXT("FS", SND_SOC_NOPM, 8000, 48000, 0, + tas2557_fs_get, tas2557_fs_put), + SOC_SINGLE_EXT("Get Cali_Re", SND_SOC_NOPM, 0, 0x7f000000, 0, + tas2557_Cali_get, NULL), + SOC_SINGLE_EXT("Calibration", SND_SOC_NOPM, 0, 0x00FF, 0, + tas2557_calibration_get, tas2557_calibration_put), + SOC_ENUM_EXT("SPK ID", vendor_id, vendor_id_get, NULL), + SOC_ENUM_EXT("SmartPA Version", pa_version, pa_version_get, NULL), + SOC_SINGLE_EXT("SmartPA Mute", SND_SOC_NOPM, 0, 0x0001, 0, + tas2557_mute_ctrl_get, tas2557_mute_ctrl_put), + +}; + +static struct snd_soc_codec_driver soc_codec_driver_tas2557 = { + .probe = tas2557_codec_probe, + .remove = tas2557_codec_remove, + .read = tas2557_codec_read, + .write = tas2557_codec_write, + .suspend = tas2557_codec_suspend, + .resume = tas2557_codec_resume, + .set_bias_level = tas2557_set_bias_level, + .idle_bias_off = true, + .component_driver = { + .controls = tas2557_snd_controls, + .num_controls = ARRAY_SIZE(tas2557_snd_controls), + .dapm_widgets = tas2557_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tas2557_dapm_widgets), + .dapm_routes = tas2557_audio_map, + .num_dapm_routes = ARRAY_SIZE(tas2557_audio_map), + }, +}; + +static struct snd_soc_dai_ops tas2557_dai_ops = { + .startup = tas2557_startup, + .shutdown = tas2557_shutdown, + .digital_mute = tas2557_mute, + .hw_params = tas2557_hw_params, + .prepare = tas2557_prepare, + .set_sysclk = tas2557_set_dai_sysclk, + .set_fmt = tas2557_set_dai_fmt, +}; + +#define TAS2557_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) +static struct snd_soc_dai_driver tas2557_dai_driver[] = { + { + .name = "tas2557 ASI1", + .id = 0, + .playback = { + .stream_name = "ASI1 Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_192000, + .formats = TAS2557_FORMATS, + }, + .ops = &tas2557_dai_ops, + .symmetric_rates = 1, + }, + { + .name = "tas2557 ASI2", + .id = 1, + .playback = { + .stream_name = "ASI2 Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_192000, + .formats = TAS2557_FORMATS, + }, + .ops = &tas2557_dai_ops, + .symmetric_rates = 1, + }, + { + .name = "tas2557 ASIM", + .id = 2, + .playback = { + .stream_name = "ASIM Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_192000, + .formats = TAS2557_FORMATS, + }, + .ops = &tas2557_dai_ops, + .symmetric_rates = 1, + }, +}; + +int tas2557_register_codec(struct tas2557_priv *pTAS2557) +{ + int nResult = 0; + + dev_info(pTAS2557->dev, "%s, enter\n", __func__); + nResult = snd_soc_register_codec(pTAS2557->dev, + &soc_codec_driver_tas2557, + tas2557_dai_driver, ARRAY_SIZE(tas2557_dai_driver)); + return nResult; +} + +int tas2557_deregister_codec(struct tas2557_priv *pTAS2557) +{ + snd_soc_unregister_codec(pTAS2557->dev); + return 0; +} + +MODULE_AUTHOR("Texas Instruments Inc."); +MODULE_DESCRIPTION("TAS2557 ALSA SOC Smart Amplifier driver"); +MODULE_LICENSE("GPL v2"); +#endif diff --git a/asoc/codecs/tas2557/tas2557-codec.h b/asoc/codecs/tas2557/tas2557-codec.h new file mode 100755 index 000000000000..8e20270c6b92 --- /dev/null +++ b/asoc/codecs/tas2557/tas2557-codec.h @@ -0,0 +1,30 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557-codec.h +** +** Description: +** header file for tas2557-codec.c +** +** ============================================================================= +*/ + +#ifndef _TAS2557_CODEC_H +#define _TAS2557_CODEC_H + +#include "tas2557.h" + +int tas2557_register_codec(struct tas2557_priv *pTAS2557); +int tas2557_deregister_codec(struct tas2557_priv *pTAS2557); + +#endif /* _TAS2557_CODEC_H */ diff --git a/asoc/codecs/tas2557/tas2557-core.c b/asoc/codecs/tas2557/tas2557-core.c new file mode 100755 index 000000000000..cc385b2cdaa4 --- /dev/null +++ b/asoc/codecs/tas2557/tas2557-core.c @@ -0,0 +1,2137 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557-core.c +** +** Description: +** TAS2557 common functions for Android Linux +** +** ============================================================================= +*/ + +#define DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tas2557.h" +#include "tas2557-core.h" + +#define PPC_DRIVER_CRCCHK 0x00000200 +#define PPC_DRIVER_CONFDEV 0x00000300 +#define PPC_DRIVER_MTPLLSRC 0x00000400 +#define PPC_DRIVER_CFGDEV_NONCRC 0x00000101 + +#define TAS2557_CAL_NAME "/mnt/vendor/persist/audio/tas2557_cal.bin" +#define RESTART_MAX 3 + + +static int tas2557_load_calibration(struct tas2557_priv *pTAS2557, + char *pFileName); +static int tas2557_load_data(struct tas2557_priv *pTAS2557, struct TData *pData, + unsigned int nType); +static void tas2557_clear_firmware(struct TFirmware *pFirmware); +static int tas2557_load_block(struct tas2557_priv *pTAS2557, struct TBlock *pBlock); +static int tas2557_load_configuration(struct tas2557_priv *pTAS2557, + unsigned int nConfiguration, bool bLoadSame); + +#define TAS2557_UDELAY 0xFFFFFFFE +#define TAS2557_MDELAY 0xFFFFFFFD + +#define TAS2557_BLOCK_PLL 0x00 +#define TAS2557_BLOCK_PGM_ALL 0x0d +#define TAS2557_BLOCK_PGM_DEV_A 0x01 +#define TAS2557_BLOCK_PGM_DEV_B 0x08 +#define TAS2557_BLOCK_CFG_COEFF_DEV_A 0x03 +#define TAS2557_BLOCK_CFG_COEFF_DEV_B 0x0a +#define TAS2557_BLOCK_CFG_PRE_DEV_A 0x04 +#define TAS2557_BLOCK_CFG_PRE_DEV_B 0x0b +#define TAS2557_BLOCK_CFG_POST 0x05 +#define TAS2557_BLOCK_CFG_POST_POWER 0x06 + +static unsigned int p_tas2557_default_data[] = { + TAS2557_SAR_ADC2_REG, 0x05, /* enable SAR ADC */ + TAS2557_CLK_ERR_CTRL2, 0x21, /*clk1:clock hysteresis, 0.34ms; clock halt, 22ms*/ + TAS2557_CLK_ERR_CTRL3, 0x21, /*clk2: rampDown 15dB/us, clock hysteresis, 10.66us; clock halt, 22ms */ + TAS2557_SAFE_GUARD_REG, TAS2557_SAFE_GUARD_PATTERN, /* safe guard */ + 0xFFFFFFFF, 0xFFFFFFFF +}; + +static unsigned int p_tas2557_irq_config[] = { + TAS2557_CLK_HALT_REG, 0x71, /* enable clk halt detect2 interrupt */ + TAS2557_INT_GEN1_REG, 0x11, /* enable spk OC and OV */ + TAS2557_INT_GEN2_REG, 0x11, /* enable clk err1 and die OT */ + TAS2557_INT_GEN3_REG, 0x11, /* enable clk err2 and brownout */ + TAS2557_INT_GEN4_REG, 0x01, /* disable SAR, enable clk halt */ + TAS2557_GPIO4_PIN_REG, 0x07, /* set GPIO4 as int1, default */ + TAS2557_INT_MODE_REG, 0x80, /* active high until INT_STICKY_1 and INT_STICKY_2 are read to be cleared. */ + 0xFFFFFFFF, 0xFFFFFFFF +}; + +static unsigned int p_tas2557_startup_data[] = { + TAS2557_GPI_PIN_REG, 0x15, /* enable DIN, MCLK, CCI */ + TAS2557_GPIO1_PIN_REG, 0x01, /* enable BCLK */ + TAS2557_GPIO2_PIN_REG, 0x01, /* enable WCLK */ + TAS2557_POWER_CTRL2_REG, 0xA0, /* Class-D, Boost power up */ + TAS2557_POWER_CTRL2_REG, 0xA3, /* Class-D, Boost, IV sense power up */ + TAS2557_POWER_CTRL1_REG, 0xF8, /* PLL, DSP, clock dividers power up */ + TAS2557_UDELAY, 2000, /* delay */ + TAS2557_CLK_ERR_CTRL, 0x2b, /* enable clock error detection */ + 0xFFFFFFFF, 0xFFFFFFFF +}; + +static unsigned int p_tas2557_unmute_data[] = { + TAS2557_MUTE_REG, 0x00, /* unmute */ + TAS2557_SOFT_MUTE_REG, 0x00, /* soft unmute */ + 0xFFFFFFFF, 0xFFFFFFFF +}; + +static unsigned int p_tas2557_shutdown_data[] = { + TAS2557_CLK_ERR_CTRL, 0x00, /* disable clock error detection */ + TAS2557_SOFT_MUTE_REG, 0x01, /* soft mute */ + TAS2557_UDELAY, 10000, /* delay 10ms */ + TAS2557_MUTE_REG, 0x03, /* mute */ + TAS2557_POWER_CTRL1_REG, 0x60, /* DSP power down */ + TAS2557_UDELAY, 2000, /* delay 2ms */ + TAS2557_POWER_CTRL2_REG, 0x00, /* Class-D, Boost power down */ + TAS2557_POWER_CTRL1_REG, 0x00, /* all power down */ + TAS2557_GPIO1_PIN_REG, 0x00, /* disable BCLK */ + TAS2557_GPIO2_PIN_REG, 0x00, /* disable WCLK */ + TAS2557_GPI_PIN_REG, 0x00, /* disable DIN, MCLK, CCI */ + 0xFFFFFFFF, 0xFFFFFFFF +}; + +static int tas2557_dev_load_data(struct tas2557_priv *pTAS2557, + unsigned int *pData) +{ + int ret = 0; + unsigned int n = 0; + unsigned int nRegister; + unsigned int nData; + + do { + nRegister = pData[n * 2]; + nData = pData[n * 2 + 1]; + if (nRegister == TAS2557_UDELAY) + udelay(nData); + else if (nRegister != 0xFFFFFFFF) { + ret = pTAS2557->write(pTAS2557, nRegister, nData); + if (ret < 0) + break; + } + n++; + } while (nRegister != 0xFFFFFFFF); + return ret; +} + +int tas2557_configIRQ(struct tas2557_priv *pTAS2557) +{ + return tas2557_dev_load_data(pTAS2557, p_tas2557_irq_config); +} + +int tas2557_set_bit_rate(struct tas2557_priv *pTAS2557, unsigned int nBitRate) +{ + int ret = 0, n = -1; + + dev_dbg(pTAS2557->dev, "tas2557_set_bit_rate: nBitRate = %d\n", nBitRate); + + switch (nBitRate) { + case 16: + n = 0; + break; + case 20: + n = 1; + break; + case 24: + n = 2; + break; + case 32: + n = 3; + break; + } + + if (n >= 0) + ret = pTAS2557->update_bits(pTAS2557, TAS2557_ASI1_DAC_FORMAT_REG, 0x18, n<<3); + return ret; +} + +int tas2557_get_bit_rate(struct tas2557_priv *pTAS2557, unsigned char *pBitRate) +{ + int ret = 0; + unsigned int nValue = 0; + unsigned char bitRate; + + ret = pTAS2557->read(pTAS2557, TAS2557_ASI1_DAC_FORMAT_REG, &nValue); + if (ret >= 0) { + bitRate = (nValue&0x18)>>3; + if (bitRate == 0) + bitRate = 16; + else if (bitRate == 1) + bitRate = 20; + else if (bitRate == 2) + bitRate = 24; + else if (bitRate == 3) + bitRate = 32; + *pBitRate = bitRate; + } + + return ret; +} + +int tas2557_get_DAC_gain(struct tas2557_priv *pTAS2557, unsigned char *pnGain) +{ + int ret = 0; + unsigned int nValue = 0; + + ret = pTAS2557->read(pTAS2557, TAS2557_SPK_CTRL_REG, &nValue); + if (ret >= 0) + *pnGain = ((nValue&TAS2557_DAC_GAIN_MASK)>>TAS2557_DAC_GAIN_SHIFT); + + return ret; +} + +int tas2557_set_DAC_gain(struct tas2557_priv *pTAS2557, unsigned int nGain) +{ + int ret = 0; + + ret = pTAS2557->update_bits(pTAS2557, TAS2557_SPK_CTRL_REG, TAS2557_DAC_GAIN_MASK, + (nGain<mpFirmware->mnConfigurations) { + dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + goto end; + } + + if (!pTAS2557->mbPowerUp) { + dev_err(pTAS2557->dev, "%s, device not powered on\n", __func__); + goto end; + } + + nResult = pTAS2557->bulk_read(pTAS2557, TAS2557_DIE_TEMP_REG, nBuf, 4); + if (nResult >= 0) { + temp = ((int)nBuf[0] << 24) | ((int)nBuf[1] << 16) | ((int)nBuf[2] << 8) | nBuf[3]; + *pTemperature = temp; + } + +end: + + return nResult; +} + +int tas2557_load_platdata(struct tas2557_priv *pTAS2557) +{ + int nResult = 0; + + if (gpio_is_valid(pTAS2557->mnGpioINT)) { + nResult = tas2557_configIRQ(pTAS2557); + if (nResult < 0) + goto end; + } + + nResult = tas2557_set_bit_rate(pTAS2557, pTAS2557->mnI2SBits); + +end: + + return nResult; +} + +int tas2557_load_default(struct tas2557_priv *pTAS2557) +{ + int nResult = 0; + + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_default_data); + if (nResult < 0) + goto end; + + nResult = tas2557_load_platdata(pTAS2557); + if (nResult < 0) + goto end; + + /* enable DOUT tri-state for extra BCLKs */ + nResult = pTAS2557->update_bits(pTAS2557, TAS2557_ASI1_DAC_FORMAT_REG, 0x01, 0x01); +end: + + return nResult; +} + +static void failsafe(struct tas2557_priv *pTAS2557) +{ + dev_err(pTAS2557->dev, "%s\n", __func__); + pTAS2557->mnErrCode |= ERROR_FAILSAFE; + if (hrtimer_active(&pTAS2557->mtimer)) + hrtimer_cancel(&pTAS2557->mtimer); + if(pTAS2557->mnRestart < RESTART_MAX) + { + pTAS2557->mnRestart ++; + msleep(100); + dev_err(pTAS2557->dev, "I2C COMM error, restart SmartAmp.\n"); + schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(100)); + return; + } + pTAS2557->enableIRQ(pTAS2557, false); + tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + pTAS2557->mbPowerUp = false; + pTAS2557->hw_reset(pTAS2557); + pTAS2557->write(pTAS2557, TAS2557_SW_RESET_REG, 0x01); + udelay(1000); + pTAS2557->write(pTAS2557, TAS2557_SPK_CTRL_REG, 0x04); + if (pTAS2557->mpFirmware != NULL) + tas2557_clear_firmware(pTAS2557->mpFirmware); +} + +int tas2557_checkPLL(struct tas2557_priv *pTAS2557) +{ + int nResult = 0; +/* +* TO DO +*/ + + return nResult; +} + +/* +* tas2557_load_coefficient +*/ +static int tas2557_load_coefficient(struct tas2557_priv *pTAS2557, + int nPrevConfig, int nNewConfig, bool bPowerOn) +{ + int nResult = 0; + struct TPLL *pPLL; + struct TProgram *pProgram; + struct TConfiguration *pPrevConfiguration; + struct TConfiguration *pNewConfiguration; + bool bRestorePower = false; + + if (!pTAS2557->mpFirmware->mnConfigurations) { + dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + goto end; + } + + if (nNewConfig >= pTAS2557->mpFirmware->mnConfigurations) { + dev_err(pTAS2557->dev, "%s, invalid configuration New=%d, total=%d\n", + __func__, nNewConfig, pTAS2557->mpFirmware->mnConfigurations); + goto end; + } + + if (nPrevConfig < 0) + pPrevConfiguration = NULL; + else if (nPrevConfig == nNewConfig) { + dev_dbg(pTAS2557->dev, "%s, config [%d] already loaded\n", + __func__, nNewConfig); + goto end; + } else + pPrevConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[nPrevConfig]); + + pNewConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[nNewConfig]); + pTAS2557->mnCurrentConfiguration = nNewConfig; + if (pPrevConfiguration) { + if (pPrevConfiguration->mnPLL == pNewConfiguration->mnPLL) { + dev_dbg(pTAS2557->dev, "%s, PLL same\n", __func__); + goto prog_coefficient; + } + } + + pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); + if (bPowerOn) { + dev_dbg(pTAS2557->dev, "%s, power down to load new PLL\n", __func__); + if (hrtimer_active(&pTAS2557->mtimer)) + hrtimer_cancel(&pTAS2557->mtimer); + + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) + pTAS2557->enableIRQ(pTAS2557, false); + + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + if (nResult < 0) + goto end; + bRestorePower = true; + } + + /* load PLL */ + pPLL = &(pTAS2557->mpFirmware->mpPLLs[pNewConfiguration->mnPLL]); + dev_dbg(pTAS2557->dev, "load PLL: %s block for Configuration %s\n", + pPLL->mpName, pNewConfiguration->mpName); + nResult = tas2557_load_block(pTAS2557, &(pPLL->mBlock)); + if (nResult < 0) + goto end; + pTAS2557->mnCurrentSampleRate = pNewConfiguration->mnSamplingRate; + + dev_dbg(pTAS2557->dev, "load configuration %s conefficient pre block\n", + pNewConfiguration->mpName); + nResult = tas2557_load_data(pTAS2557, &(pNewConfiguration->mData), TAS2557_BLOCK_CFG_PRE_DEV_A); + if (nResult < 0) + goto end; + +prog_coefficient: + dev_dbg(pTAS2557->dev, "load new configuration: %s, coeff block data\n", + pNewConfiguration->mpName); + nResult = tas2557_load_data(pTAS2557, &(pNewConfiguration->mData), + TAS2557_BLOCK_CFG_COEFF_DEV_A); + if (nResult < 0) + goto end; + + if (pTAS2557->mpCalFirmware->mnCalibrations) { + nResult = tas2557_set_calibration(pTAS2557, pTAS2557->mnCurrentCalibration); + if (nResult < 0) + goto end; + } + + if (bRestorePower) { + pTAS2557->clearIRQ(pTAS2557); + dev_dbg(pTAS2557->dev, "device powered up, load startup\n"); + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_startup_data); + if (nResult < 0) + goto end; + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + nResult = tas2557_checkPLL(pTAS2557); + if (nResult < 0) { + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + pTAS2557->mbPowerUp = false; + goto end; + } + } + dev_dbg(pTAS2557->dev, + "device powered up, load unmute\n"); + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_unmute_data); + if (nResult < 0) + goto end; + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + pTAS2557->enableIRQ(pTAS2557, true); + if (!hrtimer_active(&pTAS2557->mtimer)) { + pTAS2557->mnDieTvReadCounter = 0; + hrtimer_start(&pTAS2557->mtimer, + ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); + } + } + } +end: + + pTAS2557->mnNewConfiguration = pTAS2557->mnCurrentConfiguration; + return nResult; +} + +int tas2557_permanent_mute(struct tas2557_priv *pTAS2557, bool bmute) +{ + int nResult = 0; + + nResult = tas2557_enable(pTAS2557, !bmute); + if(nResult) { + dev_dbg(pTAS2557->dev, "set mute = %d faild\n",bmute ); + goto end; + } + + pTAS2557->mbMute = bmute; + + if(bmute) { //make sure codec is permanent mute + p_tas2557_unmute_data[1] = 0x03; + p_tas2557_unmute_data[3] = 0x01; + }else { + p_tas2557_unmute_data[1] = 0x00; + p_tas2557_unmute_data[3] = 0x00; + } + +end: + return nResult; +} +int tas2557_enable(struct tas2557_priv *pTAS2557, bool bEnable) +{ + int nResult = 0; + unsigned int nValue; + const char *pFWName; + struct TProgram *pProgram; + + dev_dbg(pTAS2557->dev, "Enable: %d\n", bEnable); + + if ((pTAS2557->mpFirmware->mnPrograms == 0) + || (pTAS2557->mpFirmware->mnConfigurations == 0)) { + dev_err(pTAS2557->dev, "%s, firmware not loaded, try to load again\n", __func__); + /*Load firmware*/ + if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) { + dev_info(pTAS2557->dev, "PG2.1 Silicon found\n"); + pFWName = TAS2557_AAC_FW_NAME; + } else if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) { + dev_info(pTAS2557->dev, "PG1.0 Silicon found\n"); + pFWName = TAS2557_PG1P0_FW_NAME; + } else { + nResult = -ENOTSUPP; + dev_info(pTAS2557->dev, "unsupport Silicon 0x%x\n", pTAS2557->mnPGID); + goto end; + } + if (pTAS2557->mnSpkType == VENDOR_ID_GOER) + pFWName = TAS2557_GOER_FW_NAME; + else if (pTAS2557->mnSpkType == VENDOR_ID_AAC) + pFWName = TAS2557_AAC_FW_NAME; + else + pFWName = TAS2557_DEFAULT_FW_NAME; + + nResult = request_firmware_nowait(THIS_MODULE, 1, pFWName, + pTAS2557->dev, GFP_KERNEL, pTAS2557, tas2557_fw_ready); + if(nResult < 0) + goto end; + dev_err(pTAS2557->dev, "%s, firmware is loaded\n", __func__); + } + + /* check safe guard*/ + nResult = pTAS2557->read(pTAS2557, TAS2557_SAFE_GUARD_REG, &nValue); + if (nResult < 0) + goto end; + if ((nValue&0xff) != TAS2557_SAFE_GUARD_PATTERN) { + dev_err(pTAS2557->dev, "ERROR safe guard failure!\n"); + nResult = -EPIPE; + pTAS2557->mnErrCode = ERROR_SAFE_GUARD; + pTAS2557->mbPowerUp = true; + goto end; + } + + pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); + if (bEnable) { + if (!pTAS2557->mbPowerUp) { + if (!pTAS2557->mbCalibrationLoaded) { + if (tas2557_set_calibration(pTAS2557, 0xFF) < 0) + dev_err(pTAS2557->dev, "calibration data load fail!\n"); + else + pTAS2557->mbCalibrationLoaded = true; + } + if (pTAS2557->mbLoadConfigurationPrePowerUp) { + dev_dbg(pTAS2557->dev, "load coefficient before power\n"); + pTAS2557->mbLoadConfigurationPrePowerUp = false; + nResult = tas2557_load_coefficient(pTAS2557, + pTAS2557->mnCurrentConfiguration, pTAS2557->mnNewConfiguration, false); + if (nResult < 0) + goto end; + } + + pTAS2557->clearIRQ(pTAS2557); + /* power on device */ + dev_dbg(pTAS2557->dev, "Enable: load startup sequence\n"); + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_startup_data); + if (nResult < 0) + goto end; + + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + nResult = tas2557_checkPLL(pTAS2557); + if (nResult < 0) { + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + goto end; + } + } + dev_dbg(pTAS2557->dev, "Enable: load unmute sequence\n"); + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_unmute_data); + if (nResult < 0) + goto end; + + pTAS2557->mbPowerUp = true; + + nResult = tas2557_get_die_temperature(pTAS2557, &nValue); + if ((nValue == 0x80000000) || (nResult < 0)) { + dev_err(pTAS2557->dev, "%s, thermal sensor is wrong, mute output, mbPower: %d\n", __func__, pTAS2557->mbPowerUp); + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + pTAS2557->mbPowerUp = false; + goto end; + } + + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + /* turn on IRQ */ + pTAS2557->enableIRQ(pTAS2557, true); + if (!hrtimer_active(&pTAS2557->mtimer)) { + pTAS2557->mnDieTvReadCounter = 0; + hrtimer_start(&pTAS2557->mtimer, + ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); + } + } + pTAS2557->mnRestart = 0; + } + } else { + if (pTAS2557->mbPowerUp) { + if (hrtimer_active(&pTAS2557->mtimer)) + hrtimer_cancel(&pTAS2557->mtimer); + + dev_dbg(pTAS2557->dev, "Enable: load shutdown sequence\n"); + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + /* turn off IRQ */ + pTAS2557->enableIRQ(pTAS2557, false); + } + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + if (nResult < 0) + goto end; + + pTAS2557->mbPowerUp = false; + pTAS2557->mnRestart = 0; + } + } + + nResult = 0; + +end: + if (nResult < 0) { + if (pTAS2557->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK | ERROR_SAFE_GUARD)) + failsafe(pTAS2557); + } + + return nResult; +} + +int tas2557_set_sampling_rate(struct tas2557_priv *pTAS2557, unsigned int nSamplingRate) +{ + int nResult = 0; + struct TConfiguration *pConfiguration; + unsigned int nConfiguration; + + dev_dbg(pTAS2557->dev, "tas2557_setup_clocks: nSamplingRate = %d [Hz]\n", + nSamplingRate); + + if ((!pTAS2557->mpFirmware->mpPrograms) || + (!pTAS2557->mpFirmware->mpConfigurations)) { + dev_err(pTAS2557->dev, "Firmware not loaded\n"); + nResult = -EINVAL; + goto end; + } + + pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); + if (pConfiguration->mnSamplingRate == nSamplingRate) { + dev_info(pTAS2557->dev, "Sampling rate for current configuration matches: %d\n", + nSamplingRate); + nResult = 0; + goto end; + } + + for (nConfiguration = 0; + nConfiguration < pTAS2557->mpFirmware->mnConfigurations; + nConfiguration++) { + pConfiguration = + &(pTAS2557->mpFirmware->mpConfigurations[nConfiguration]); + if ((pConfiguration->mnSamplingRate == nSamplingRate) + && (pConfiguration->mnProgram == pTAS2557->mnCurrentProgram)) { + dev_info(pTAS2557->dev, + "Found configuration: %s, with compatible sampling rate %d\n", + pConfiguration->mpName, nSamplingRate); + nResult = tas2557_load_configuration(pTAS2557, nConfiguration, false); + goto end; + } + } + + dev_err(pTAS2557->dev, "Cannot find a configuration that supports sampling rate: %d\n", + nSamplingRate); + +end: + + return nResult; +} + +static void fw_print_header(struct tas2557_priv *pTAS2557, struct TFirmware *pFirmware) +{ + dev_info(pTAS2557->dev, "FW Size = %d", pFirmware->mnFWSize); + dev_info(pTAS2557->dev, "Checksum = 0x%04X", pFirmware->mnChecksum); + dev_info(pTAS2557->dev, "PPC Version = 0x%04X", pFirmware->mnPPCVersion); + dev_info(pTAS2557->dev, "FW Version = 0x%04X", pFirmware->mnFWVersion); + dev_info(pTAS2557->dev, "Driver Version= 0x%04X", pFirmware->mnDriverVersion); + dev_info(pTAS2557->dev, "Timestamp = %d", pFirmware->mnTimeStamp); + dev_info(pTAS2557->dev, "DDC Name = %s", pFirmware->mpDDCName); + dev_info(pTAS2557->dev, "Description = %s", pFirmware->mpDescription); +} + +inline unsigned int fw_convert_number(unsigned char *pData) +{ + return pData[3] + (pData[2] << 8) + (pData[1] << 16) + (pData[0] << 24); +} + +static int fw_parse_header(struct tas2557_priv *pTAS2557, + struct TFirmware *pFirmware, unsigned char *pData, unsigned int nSize) +{ + unsigned char *pDataStart = pData; + unsigned int n; + unsigned char pMagicNumber[] = { 0x35, 0x35, 0x35, 0x32 }; + + if (nSize < 104) { + dev_err(pTAS2557->dev, "Firmware: Header too short"); + return -EINVAL; + } + + if (memcmp(pData, pMagicNumber, 4)) { + dev_err(pTAS2557->dev, "Firmware: Magic number doesn't match"); + return -EINVAL; + } + pData += 4; + + pFirmware->mnFWSize = fw_convert_number(pData); + pData += 4; + + pFirmware->mnChecksum = fw_convert_number(pData); + pData += 4; + + pFirmware->mnPPCVersion = fw_convert_number(pData); + pData += 4; + + pFirmware->mnFWVersion = fw_convert_number(pData); + pData += 4; + + pFirmware->mnDriverVersion = fw_convert_number(pData); + pData += 4; + + pFirmware->mnTimeStamp = fw_convert_number(pData); + pData += 4; + + memcpy(pFirmware->mpDDCName, pData, 64); + pData += 64; + + n = strlen(pData); + pFirmware->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); + pData += n + 1; + if ((pData - pDataStart) >= nSize) { + dev_err(pTAS2557->dev, "Firmware: Header too short after DDC description"); + return -EINVAL; + } + + pFirmware->mnDeviceFamily = fw_convert_number(pData); + pData += 4; + if (pFirmware->mnDeviceFamily != 0) { + dev_err(pTAS2557->dev, + "deviceFamily %d, not TAS device", pFirmware->mnDeviceFamily); + return -EINVAL; + } + + pFirmware->mnDevice = fw_convert_number(pData); + pData += 4; + + if (pFirmware->mnDevice != 2) { + dev_err(pTAS2557->dev, + "device %d, not TAS2557 Dual Mono", pFirmware->mnDevice); + return -EINVAL; + } + + fw_print_header(pTAS2557, pFirmware); + return pData - pDataStart; +} + +static int fw_parse_block_data(struct tas2557_priv *pTAS2557, struct TFirmware *pFirmware, + struct TBlock *pBlock, unsigned char *pData) +{ + unsigned char *pDataStart = pData; + unsigned int n; + + pBlock->mnType = fw_convert_number(pData); + pData += 4; + + if (pFirmware->mnDriverVersion >= PPC_DRIVER_CRCCHK) { + pBlock->mbPChkSumPresent = pData[0]; + pData++; + + pBlock->mnPChkSum = pData[0]; + pData++; + + pBlock->mbYChkSumPresent = pData[0]; + pData++; + + pBlock->mnYChkSum = pData[0]; + pData++; + } else { + pBlock->mbPChkSumPresent = 0; + pBlock->mbYChkSumPresent = 0; + } + + pBlock->mnCommands = fw_convert_number(pData); + pData += 4; + + n = pBlock->mnCommands * 4; + pBlock->mpData = kmemdup(pData, n, GFP_KERNEL); + pData += n; + return pData - pDataStart; +} + +static int fw_parse_data(struct tas2557_priv *pTAS2557, struct TFirmware *pFirmware, + struct TData *pImageData, unsigned char *pData) +{ + unsigned char *pDataStart = pData; + unsigned int nBlock; + unsigned int n; + + memcpy(pImageData->mpName, pData, 64); + pData += 64; + + n = strlen(pData); + pImageData->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); + pData += n + 1; + + pImageData->mnBlocks = (pData[0] << 8) + pData[1]; + pData += 2; + + pImageData->mpBlocks = + kmalloc(sizeof(struct TBlock) * pImageData->mnBlocks, GFP_KERNEL); + + for (nBlock = 0; nBlock < pImageData->mnBlocks; nBlock++) { + n = fw_parse_block_data(pTAS2557, pFirmware, + &(pImageData->mpBlocks[nBlock]), pData); + pData += n; + } + return pData - pDataStart; +} + +static int fw_parse_pll_data(struct tas2557_priv *pTAS2557, + struct TFirmware *pFirmware, unsigned char *pData) +{ + unsigned char *pDataStart = pData; + unsigned int n; + unsigned int nPLL; + struct TPLL *pPLL; + + pFirmware->mnPLLs = (pData[0] << 8) + pData[1]; + pData += 2; + + if (pFirmware->mnPLLs == 0) + goto end; + + pFirmware->mpPLLs = kmalloc_array(pFirmware->mnPLLs, sizeof(struct TPLL), GFP_KERNEL); + for (nPLL = 0; nPLL < pFirmware->mnPLLs; nPLL++) { + pPLL = &(pFirmware->mpPLLs[nPLL]); + + memcpy(pPLL->mpName, pData, 64); + pData += 64; + + n = strlen(pData); + pPLL->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); + pData += n + 1; + + n = fw_parse_block_data(pTAS2557, pFirmware, &(pPLL->mBlock), pData); + pData += n; + } + +end: + return pData - pDataStart; +} + +static int fw_parse_program_data(struct tas2557_priv *pTAS2557, + struct TFirmware *pFirmware, unsigned char *pData) +{ + unsigned char *pDataStart = pData; + unsigned int n; + unsigned int nProgram; + struct TProgram *pProgram; + + pFirmware->mnPrograms = (pData[0] << 8) + pData[1]; + pData += 2; + + if (pFirmware->mnPrograms == 0) + goto end; + + pFirmware->mpPrograms = + kmalloc(sizeof(struct TProgram) * pFirmware->mnPrograms, GFP_KERNEL); + for (nProgram = 0; nProgram < pFirmware->mnPrograms; nProgram++) { + pProgram = &(pFirmware->mpPrograms[nProgram]); + memcpy(pProgram->mpName, pData, 64); + pData += 64; + + n = strlen(pData); + pProgram->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); + pData += n + 1; + + pProgram->mnAppMode = pData[0]; + pData++; + + pProgram->mnBoost = (pData[0] << 8) + pData[1]; + pData += 2; + + n = fw_parse_data(pTAS2557, pFirmware, &(pProgram->mData), pData); + pData += n; + } + +end: + + return pData - pDataStart; +} + +static int fw_parse_configuration_data(struct tas2557_priv *pTAS2557, + struct TFirmware *pFirmware, unsigned char *pData) +{ + unsigned char *pDataStart = pData; + unsigned int n; + unsigned int nConfiguration; + struct TConfiguration *pConfiguration; + + pFirmware->mnConfigurations = (pData[0] << 8) + pData[1]; + pData += 2; + + if (pFirmware->mnConfigurations == 0) + goto end; + + pFirmware->mpConfigurations = + kmalloc(sizeof(struct TConfiguration) * pFirmware->mnConfigurations, + GFP_KERNEL); + for (nConfiguration = 0; nConfiguration < pFirmware->mnConfigurations; + nConfiguration++) { + pConfiguration = &(pFirmware->mpConfigurations[nConfiguration]); + memcpy(pConfiguration->mpName, pData, 64); + pData += 64; + + n = strlen(pData); + pConfiguration->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); + pData += n + 1; + + if ((pFirmware->mnDriverVersion >= PPC_DRIVER_CONFDEV) + || ((pFirmware->mnDriverVersion >= PPC_DRIVER_CFGDEV_NONCRC) + && (pFirmware->mnDriverVersion < PPC_DRIVER_CRCCHK))) { + pConfiguration->mnDevices = (pData[0] << 8) + pData[1]; + pData += 2; + } else + pConfiguration->mnDevices = 1; + + pConfiguration->mnProgram = pData[0]; + pData++; + + pConfiguration->mnPLL = pData[0]; + pData++; + + pConfiguration->mnSamplingRate = fw_convert_number(pData); + pData += 4; + + if (pFirmware->mnDriverVersion >= PPC_DRIVER_MTPLLSRC) { + pConfiguration->mnPLLSrc = pData[0]; + pData++; + + pConfiguration->mnPLLSrcRate = fw_convert_number(pData); + pData += 4; + } + + n = fw_parse_data(pTAS2557, pFirmware, &(pConfiguration->mData), pData); + pData += n; + } + +end: + + return pData - pDataStart; +} + +int fw_parse_calibration_data(struct tas2557_priv *pTAS2557, + struct TFirmware *pFirmware, unsigned char *pData) +{ + unsigned char *pDataStart = pData; + unsigned int n; + unsigned int nCalibration; + struct TCalibration *pCalibration; + + pFirmware->mnCalibrations = (pData[0] << 8) + pData[1]; + pData += 2; + + if (pFirmware->mnCalibrations == 0) + goto end; + + pFirmware->mpCalibrations = + kmalloc(sizeof(struct TCalibration) * pFirmware->mnCalibrations, GFP_KERNEL); + for (nCalibration = 0; + nCalibration < pFirmware->mnCalibrations; + nCalibration++) { + pCalibration = &(pFirmware->mpCalibrations[nCalibration]); + memcpy(pCalibration->mpName, pData, 64); + pData += 64; + + n = strlen(pData); + pCalibration->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); + pData += n + 1; + + pCalibration->mnProgram = pData[0]; + pData++; + + pCalibration->mnConfiguration = pData[0]; + pData++; + + n = fw_parse_data(pTAS2557, pFirmware, &(pCalibration->mData), pData); + pData += n; + } + +end: + + return pData - pDataStart; +} + +static int fw_parse(struct tas2557_priv *pTAS2557, + struct TFirmware *pFirmware, unsigned char *pData, unsigned int nSize) +{ + int nPosition = 0; + + nPosition = fw_parse_header(pTAS2557, pFirmware, pData, nSize); + if (nPosition < 0) { + dev_err(pTAS2557->dev, "Firmware: Wrong Header"); + return -EINVAL; + } + + if (nPosition >= nSize) { + dev_err(pTAS2557->dev, "Firmware: Too short"); + return -EINVAL; + } + + pData += nPosition; + nSize -= nPosition; + nPosition = 0; + + nPosition = fw_parse_pll_data(pTAS2557, pFirmware, pData); + + pData += nPosition; + nSize -= nPosition; + nPosition = 0; + + nPosition = fw_parse_program_data(pTAS2557, pFirmware, pData); + + pData += nPosition; + nSize -= nPosition; + nPosition = 0; + + nPosition = fw_parse_configuration_data(pTAS2557, pFirmware, pData); + + pData += nPosition; + nSize -= nPosition; + nPosition = 0; + + if (nSize > 64) + nPosition = fw_parse_calibration_data(pTAS2557, pFirmware, pData); + return 0; +} + + +static const unsigned char crc8_lookup_table[CRC8_TABLE_SIZE] = { +0x00, 0x4D, 0x9A, 0xD7, 0x79, 0x34, 0xE3, 0xAE, 0xF2, 0xBF, 0x68, 0x25, 0x8B, 0xC6, 0x11, 0x5C, +0xA9, 0xE4, 0x33, 0x7E, 0xD0, 0x9D, 0x4A, 0x07, 0x5B, 0x16, 0xC1, 0x8C, 0x22, 0x6F, 0xB8, 0xF5, +0x1F, 0x52, 0x85, 0xC8, 0x66, 0x2B, 0xFC, 0xB1, 0xED, 0xA0, 0x77, 0x3A, 0x94, 0xD9, 0x0E, 0x43, +0xB6, 0xFB, 0x2C, 0x61, 0xCF, 0x82, 0x55, 0x18, 0x44, 0x09, 0xDE, 0x93, 0x3D, 0x70, 0xA7, 0xEA, +0x3E, 0x73, 0xA4, 0xE9, 0x47, 0x0A, 0xDD, 0x90, 0xCC, 0x81, 0x56, 0x1B, 0xB5, 0xF8, 0x2F, 0x62, +0x97, 0xDA, 0x0D, 0x40, 0xEE, 0xA3, 0x74, 0x39, 0x65, 0x28, 0xFF, 0xB2, 0x1C, 0x51, 0x86, 0xCB, +0x21, 0x6C, 0xBB, 0xF6, 0x58, 0x15, 0xC2, 0x8F, 0xD3, 0x9E, 0x49, 0x04, 0xAA, 0xE7, 0x30, 0x7D, +0x88, 0xC5, 0x12, 0x5F, 0xF1, 0xBC, 0x6B, 0x26, 0x7A, 0x37, 0xE0, 0xAD, 0x03, 0x4E, 0x99, 0xD4, +0x7C, 0x31, 0xE6, 0xAB, 0x05, 0x48, 0x9F, 0xD2, 0x8E, 0xC3, 0x14, 0x59, 0xF7, 0xBA, 0x6D, 0x20, +0xD5, 0x98, 0x4F, 0x02, 0xAC, 0xE1, 0x36, 0x7B, 0x27, 0x6A, 0xBD, 0xF0, 0x5E, 0x13, 0xC4, 0x89, +0x63, 0x2E, 0xF9, 0xB4, 0x1A, 0x57, 0x80, 0xCD, 0x91, 0xDC, 0x0B, 0x46, 0xE8, 0xA5, 0x72, 0x3F, +0xCA, 0x87, 0x50, 0x1D, 0xB3, 0xFE, 0x29, 0x64, 0x38, 0x75, 0xA2, 0xEF, 0x41, 0x0C, 0xDB, 0x96, +0x42, 0x0F, 0xD8, 0x95, 0x3B, 0x76, 0xA1, 0xEC, 0xB0, 0xFD, 0x2A, 0x67, 0xC9, 0x84, 0x53, 0x1E, +0xEB, 0xA6, 0x71, 0x3C, 0x92, 0xDF, 0x08, 0x45, 0x19, 0x54, 0x83, 0xCE, 0x60, 0x2D, 0xFA, 0xB7, +0x5D, 0x10, 0xC7, 0x8A, 0x24, 0x69, 0xBE, 0xF3, 0xAF, 0xE2, 0x35, 0x78, 0xD6, 0x9B, 0x4C, 0x01, +0xF4, 0xB9, 0x6E, 0x23, 0x8D, 0xC0, 0x17, 0x5A, 0x06, 0x4B, 0x9C, 0xD1, 0x7F, 0x32, 0xE5, 0xA8 +}; + +static int isInPageYRAM(struct tas2557_priv *pTAS2557, struct TYCRC *pCRCData, + unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char len) +{ + int nResult = 0; + + if (nBook == TAS2557_YRAM_BOOK1) { + if (nPage == TAS2557_YRAM1_PAGE) { + if (nReg >= TAS2557_YRAM1_START_REG) { + pCRCData->mnOffset = nReg; + pCRCData->mnLen = len; + nResult = 1; + } else if ((nReg + len) > TAS2557_YRAM1_START_REG) { + pCRCData->mnOffset = TAS2557_YRAM1_START_REG; + pCRCData->mnLen = len - (TAS2557_YRAM1_START_REG - nReg); + nResult = 1; + } else + nResult = 0; + } else if (nPage == TAS2557_YRAM3_PAGE) { + if (nReg > TAS2557_YRAM3_END_REG) { + nResult = 0; + } else if (nReg >= TAS2557_YRAM3_START_REG) { + if ((nReg + len) > TAS2557_YRAM3_END_REG) { + pCRCData->mnOffset = nReg; + pCRCData->mnLen = TAS2557_YRAM3_END_REG - nReg + 1; + nResult = 1; + } else { + pCRCData->mnOffset = nReg; + pCRCData->mnLen = len; + nResult = 1; + } + } else { + if ((nReg + (len - 1)) < TAS2557_YRAM3_START_REG) + nResult = 0; + else { + pCRCData->mnOffset = TAS2557_YRAM3_START_REG; + pCRCData->mnLen = len - (TAS2557_YRAM3_START_REG - nReg); + nResult = 1; + } + } + } + } else if (nBook == TAS2557_YRAM_BOOK2) { + if (nPage == TAS2557_YRAM5_PAGE) { + if (nReg > TAS2557_YRAM5_END_REG) { + nResult = 0; + } else if (nReg >= TAS2557_YRAM5_START_REG) { + if ((nReg + len) > TAS2557_YRAM5_END_REG) { + pCRCData->mnOffset = nReg; + pCRCData->mnLen = TAS2557_YRAM5_END_REG - nReg + 1; + nResult = 1; + } else { + pCRCData->mnOffset = nReg; + pCRCData->mnLen = len; + nResult = 1; + } + } else { + if ((nReg + (len - 1)) < TAS2557_YRAM5_START_REG) + nResult = 0; + else { + pCRCData->mnOffset = TAS2557_YRAM5_START_REG; + pCRCData->mnLen = len - (TAS2557_YRAM5_START_REG - nReg); + nResult = 1; + } + } + } + } else + nResult = 0; + + return nResult; +} + +static int isInBlockYRAM(struct tas2557_priv *pTAS2557, struct TYCRC *pCRCData, + unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char len) +{ + int nResult; + + if (nBook == TAS2557_YRAM_BOOK1) { + if (nPage < TAS2557_YRAM2_START_PAGE) + nResult = 0; + else if (nPage <= TAS2557_YRAM2_END_PAGE) { + if (nReg > TAS2557_YRAM2_END_REG) + nResult = 0; + else if (nReg >= TAS2557_YRAM2_START_REG) { + pCRCData->mnOffset = nReg; + pCRCData->mnLen = len; + nResult = 1; + } else { + if ((nReg + (len - 1)) < TAS2557_YRAM2_START_REG) + nResult = 0; + else { + pCRCData->mnOffset = TAS2557_YRAM2_START_REG; + pCRCData->mnLen = nReg + len - TAS2557_YRAM2_START_REG; + nResult = 1; + } + } + } else + nResult = 0; + } else if (nBook == TAS2557_YRAM_BOOK2) { + if (nPage < TAS2557_YRAM4_START_PAGE) + nResult = 0; + else if (nPage <= TAS2557_YRAM4_END_PAGE) { + if (nReg > TAS2557_YRAM2_END_REG) + nResult = 0; + else if (nReg >= TAS2557_YRAM2_START_REG) { + pCRCData->mnOffset = nReg; + pCRCData->mnLen = len; + nResult = 1; + } else { + if ((nReg + (len - 1)) < TAS2557_YRAM2_START_REG) + nResult = 0; + else { + pCRCData->mnOffset = TAS2557_YRAM2_START_REG; + pCRCData->mnLen = nReg + len - TAS2557_YRAM2_START_REG; + nResult = 1; + } + } + } else + nResult = 0; + } else + nResult = 0; + + return nResult; +} + + +static int isYRAM(struct tas2557_priv *pTAS2557, struct TYCRC *pCRCData, + unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char len) +{ + int nResult; + + nResult = isInPageYRAM(pTAS2557, pCRCData, nBook, nPage, nReg, len); + + if (nResult == 0) + nResult = isInBlockYRAM(pTAS2557, pCRCData, nBook, nPage, nReg, len); + + return nResult; +} + +/* + * crc8 - calculate a crc8 over the given input data. + * + * table: crc table used for calculation. + * pdata: pointer to data buffer. + * nbytes: number of bytes in data buffer. + * crc: previous returned crc8 value. + */ +static u8 ti_crc8(const u8 table[CRC8_TABLE_SIZE], u8 *pdata, size_t nbytes, u8 crc) +{ + /* loop over the buffer data */ + while (nbytes-- > 0) + crc = table[(crc ^ *pdata++) & 0xff]; + + return crc; +} + +static int doSingleRegCheckSum(struct tas2557_priv *pTAS2557, + unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char nValue) +{ + int nResult = 0; + struct TYCRC sCRCData; + unsigned int nData1 = 0; + + if ((nBook == TAS2557_BOOK_ID(TAS2557_SA_COEFF_SWAP_REG)) + && (nPage == TAS2557_PAGE_ID(TAS2557_SA_COEFF_SWAP_REG)) + && (nReg >= TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG)) + && (nReg <= (TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG) + 4))) { + /* DSP swap command, pass */ + nResult = 0; + goto end; + } + + nResult = isYRAM(pTAS2557, &sCRCData, nBook, nPage, nReg, 1); + if (nResult == 1) { + nResult = pTAS2557->read(pTAS2557, TAS2557_REG(nBook, nPage, nReg), &nData1); + if (nResult < 0) + goto end; + + if (nData1 != nValue) { + dev_err(pTAS2557->dev, "error2 (line %d),B[0x%x]P[0x%x]R[0x%x] W[0x%x], R[0x%x]\n", + __LINE__, nBook, nPage, nReg, nValue, nData1); + nResult = -EAGAIN; + goto end; + } + + nResult = ti_crc8(crc8_lookup_table, &nValue, 1, 0); + } + +end: + + return nResult; +} + +static int doMultiRegCheckSum(struct tas2557_priv *pTAS2557, + unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned int len) +{ + int nResult = 0, i; + unsigned char nCRCChkSum = 0; + unsigned char nBuf1[128]; + struct TYCRC TCRCData; + + if ((nReg + len-1) > 127) { + nResult = -EINVAL; + dev_err(pTAS2557->dev, "firmware error\n"); + goto end; + } + + if ((nBook == TAS2557_BOOK_ID(TAS2557_SA_COEFF_SWAP_REG)) + && (nPage == TAS2557_PAGE_ID(TAS2557_SA_COEFF_SWAP_REG)) + && (nReg == TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG)) + && (len == 4)) { + /* DSP swap command, pass */ + nResult = 0; + goto end; + } + + nResult = isYRAM(pTAS2557, &TCRCData, nBook, nPage, nReg, len); + if (nResult == 1) { + if (len == 1) { + dev_err(pTAS2557->dev, "firmware error\n"); + nResult = -EINVAL; + goto end; + } else { + nResult = pTAS2557->bulk_read(pTAS2557, TAS2557_REG(nBook, nPage, TCRCData.mnOffset), nBuf1, TCRCData.mnLen); + if (nResult < 0) + goto end; + + for (i = 0; i < TCRCData.mnLen; i++) { + if ((nBook == TAS2557_BOOK_ID(TAS2557_SA_COEFF_SWAP_REG)) + && (nPage == TAS2557_PAGE_ID(TAS2557_SA_COEFF_SWAP_REG)) + && ((i + TCRCData.mnOffset) + >= TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG)) + && ((i + TCRCData.mnOffset) + <= (TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG) + 4))) { + /* DSP swap command, bypass */ + continue; + } else + nCRCChkSum += ti_crc8(crc8_lookup_table, &nBuf1[i], 1, 0); + } + + nResult = nCRCChkSum; + } + } + +end: + + return nResult; +} + +static int tas2557_load_block(struct tas2557_priv *pTAS2557, struct TBlock *pBlock) +{ + int nResult = 0; + unsigned int nCommand = 0; + unsigned char nBook; + unsigned char nPage; + unsigned char nOffset; + unsigned char nData; + unsigned int nLength; + unsigned int nSleep; + unsigned char nCRCChkSum = 0; + unsigned int nValue1; + int nRetry = 6; + unsigned char *pData = pBlock->mpData; + + dev_dbg(pTAS2557->dev, "TAS2557 load block: Type = %d, commands = %d\n", + pBlock->mnType, pBlock->mnCommands); +start: + if (pBlock->mbPChkSumPresent) { + nResult = pTAS2557->write(pTAS2557, TAS2557_CRC_RESET_REG, 1); + if (nResult < 0) + goto end; + } + + if (pBlock->mbYChkSumPresent) + nCRCChkSum = 0; + + nCommand = 0; + + while (nCommand < pBlock->mnCommands) { + pData = pBlock->mpData + nCommand * 4; + + nBook = pData[0]; + nPage = pData[1]; + nOffset = pData[2]; + nData = pData[3]; + + nCommand++; + + if (nOffset <= 0x7F) { + nResult = pTAS2557->write(pTAS2557, TAS2557_REG(nBook, nPage, nOffset), nData); + if (nResult < 0) + goto end; + if (pBlock->mbYChkSumPresent) { + nResult = doSingleRegCheckSum(pTAS2557, nBook, nPage, nOffset, nData); + if (nResult < 0) + goto check; + nCRCChkSum += (unsigned char)nResult; + } + } else if (nOffset == 0x81) { + nSleep = (nBook << 8) + nPage; + msleep(nSleep); + } else if (nOffset == 0x85) { + pData += 4; + nLength = (nBook << 8) + nPage; + nBook = pData[0]; + nPage = pData[1]; + nOffset = pData[2]; + if (nLength > 1) { + nResult = pTAS2557->bulk_write(pTAS2557, TAS2557_REG(nBook, nPage, nOffset), pData + 3, nLength); + if (nResult < 0) + goto end; + if (pBlock->mbYChkSumPresent) { + nResult = doMultiRegCheckSum(pTAS2557, nBook, nPage, nOffset, nLength); + if (nResult < 0) + goto check; + nCRCChkSum += (unsigned char)nResult; + } + } else { + nResult = pTAS2557->write(pTAS2557, TAS2557_REG(nBook, nPage, nOffset), pData[3]); + if (nResult < 0) + goto end; + if (pBlock->mbYChkSumPresent) { + nResult = doSingleRegCheckSum(pTAS2557, nBook, nPage, nOffset, pData[3]); + if (nResult < 0) + goto check; + nCRCChkSum += (unsigned char)nResult; + } + } + + nCommand++; + + if (nLength >= 2) + nCommand += ((nLength - 2) / 4) + 1; + } + } + if (pBlock->mbPChkSumPresent) { + nResult = pTAS2557->read(pTAS2557, TAS2557_CRC_CHECKSUM_REG, &nValue1); + if (nResult < 0) + goto end; + if ((nValue1&0xff) != pBlock->mnPChkSum) { + dev_err(pTAS2557->dev, "Block PChkSum Error: FW = 0x%x, Reg = 0x%x\n", + pBlock->mnPChkSum, (nValue1&0xff)); + nResult = -EAGAIN; + pTAS2557->mnErrCode |= ERROR_PRAM_CRCCHK; + goto check; + } + + nResult = 0; + pTAS2557->mnErrCode &= ~ERROR_PRAM_CRCCHK; + dev_dbg(pTAS2557->dev, "Block[0x%x] PChkSum match\n", pBlock->mnType); + } + + if (pBlock->mbYChkSumPresent) { + if (nCRCChkSum != pBlock->mnYChkSum) { + dev_err(pTAS2557->dev, "Block YChkSum Error: FW = 0x%x, YCRC = 0x%x\n", + pBlock->mnYChkSum, nCRCChkSum); + nResult = -EAGAIN; + pTAS2557->mnErrCode |= ERROR_YRAM_CRCCHK; + goto check; + } + pTAS2557->mnErrCode &= ~ERROR_YRAM_CRCCHK; + nResult = 0; + dev_dbg(pTAS2557->dev, "Block[0x%x] YChkSum match\n", pBlock->mnType); + } + +check: + if (nResult == -EAGAIN) { + nRetry--; + if (nRetry > 0) + goto start; + } + +end: + if (nResult < 0) { + dev_err(pTAS2557->dev, "Block (%d) load error\n", + pBlock->mnType); + } + return nResult; +} + +static int tas2557_load_data(struct tas2557_priv *pTAS2557, struct TData *pData, unsigned int nType) +{ + int nResult = 0; + unsigned int nBlock; + struct TBlock *pBlock; + + dev_dbg(pTAS2557->dev, + "TAS2557 load data: %s, Blocks = %d, Block Type = %d\n", pData->mpName, pData->mnBlocks, nType); + + for (nBlock = 0; nBlock < pData->mnBlocks; nBlock++) { + pBlock = &(pData->mpBlocks[nBlock]); + if (pBlock->mnType == nType) { + nResult = tas2557_load_block(pTAS2557, pBlock); + if (nResult < 0) + break; + } + } + + return nResult; +} + +static int tas2557_load_configuration(struct tas2557_priv *pTAS2557, + unsigned int nConfiguration, bool bLoadSame) +{ + int nResult = 0; + struct TConfiguration *pCurrentConfiguration = NULL; + struct TConfiguration *pNewConfiguration = NULL; + + dev_dbg(pTAS2557->dev, "%s: %d\n", __func__, nConfiguration); + + if ((!pTAS2557->mpFirmware->mpPrograms) || + (!pTAS2557->mpFirmware->mpConfigurations)) { + dev_err(pTAS2557->dev, "Firmware not loaded\n"); + nResult = 0; + goto end; + } + + if (nConfiguration >= pTAS2557->mpFirmware->mnConfigurations) { + dev_err(pTAS2557->dev, "Configuration %d doesn't exist\n", + nConfiguration); + nResult = 0; + goto end; + } + + if ((!pTAS2557->mbLoadConfigurationPrePowerUp) + && (nConfiguration == pTAS2557->mnCurrentConfiguration) + && (!bLoadSame)) { + dev_info(pTAS2557->dev, "Configuration %d is already loaded\n", + nConfiguration); + nResult = 0; + goto end; + } + + pCurrentConfiguration = + &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); + pNewConfiguration = + &(pTAS2557->mpFirmware->mpConfigurations[nConfiguration]); + if (pNewConfiguration->mnProgram != pCurrentConfiguration->mnProgram) { + dev_err(pTAS2557->dev, "Configuration %d, %s doesn't share the same program as current %d\n", + nConfiguration, pNewConfiguration->mpName, pCurrentConfiguration->mnProgram); + nResult = 0; + goto end; + } + + if (pNewConfiguration->mnPLL >= pTAS2557->mpFirmware->mnPLLs) { + dev_err(pTAS2557->dev, "Configuration %d, %s doesn't have a valid PLL index %d\n", + nConfiguration, pNewConfiguration->mpName, pNewConfiguration->mnPLL); + nResult = 0; + goto end; + } + + if (pTAS2557->mbPowerUp) { + pTAS2557->mbLoadConfigurationPrePowerUp = false; + nResult = tas2557_load_coefficient(pTAS2557, pTAS2557->mnCurrentConfiguration, nConfiguration, true); + } else { + dev_dbg(pTAS2557->dev, + "TAS2557 was powered down, will load coefficient when power up\n"); + pTAS2557->mbLoadConfigurationPrePowerUp = true; + pTAS2557->mnNewConfiguration = nConfiguration; + } + +end: + + if (nResult < 0) { + if (pTAS2557->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK)) + failsafe(pTAS2557); + } + + return nResult; +} + +int tas2557_set_config(struct tas2557_priv *pTAS2557, int config) +{ + struct TConfiguration *pConfiguration; + struct TProgram *pProgram; + unsigned int nProgram = pTAS2557->mnCurrentProgram; + unsigned int nConfiguration = config; + int nResult = 0; + + if ((!pTAS2557->mpFirmware->mpPrograms) || + (!pTAS2557->mpFirmware->mpConfigurations)) { + dev_err(pTAS2557->dev, "Firmware not loaded\n"); + nResult = -EINVAL; + goto end; + } + + if (nConfiguration >= pTAS2557->mpFirmware->mnConfigurations) { + dev_err(pTAS2557->dev, "Configuration %d doesn't exist\n", + nConfiguration); + nResult = -EINVAL; + goto end; + } + + pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[nConfiguration]); + pProgram = &(pTAS2557->mpFirmware->mpPrograms[nProgram]); + + if (nProgram != pConfiguration->mnProgram) { + dev_err(pTAS2557->dev, + "Configuration %d, %s with Program %d isn't compatible with existing Program %d, %s\n", + nConfiguration, pConfiguration->mpName, pConfiguration->mnProgram, + nProgram, pProgram->mpName); + nResult = -EINVAL; + goto end; + } + + nResult = tas2557_load_configuration(pTAS2557, nConfiguration, false); + +end: + + return nResult; +} + +void tas2557_clear_firmware(struct TFirmware *pFirmware) +{ + unsigned int n, nn; + + if (!pFirmware) + return; + + kfree(pFirmware->mpDescription); + + if (pFirmware->mpPLLs != NULL) { + for (n = 0; n < pFirmware->mnPLLs; n++) { + kfree(pFirmware->mpPLLs[n].mpDescription); + kfree(pFirmware->mpPLLs[n].mBlock.mpData); + } + kfree(pFirmware->mpPLLs); + } + + if (pFirmware->mpPrograms != NULL) { + for (n = 0; n < pFirmware->mnPrograms; n++) { + kfree(pFirmware->mpPrograms[n].mpDescription); + kfree(pFirmware->mpPrograms[n].mData.mpDescription); + for (nn = 0; nn < pFirmware->mpPrograms[n].mData.mnBlocks; nn++) + kfree(pFirmware->mpPrograms[n].mData.mpBlocks[nn].mpData); + kfree(pFirmware->mpPrograms[n].mData.mpBlocks); + } + kfree(pFirmware->mpPrograms); + } + + if (pFirmware->mpConfigurations != NULL) { + for (n = 0; n < pFirmware->mnConfigurations; n++) { + kfree(pFirmware->mpConfigurations[n].mpDescription); + kfree(pFirmware->mpConfigurations[n].mData.mpDescription); + for (nn = 0; nn < pFirmware->mpConfigurations[n].mData.mnBlocks; nn++) + kfree(pFirmware->mpConfigurations[n].mData.mpBlocks[nn].mpData); + kfree(pFirmware->mpConfigurations[n].mData.mpBlocks); + } + kfree(pFirmware->mpConfigurations); + } + + if (pFirmware->mpCalibrations != NULL) { + for (n = 0; n < pFirmware->mnCalibrations; n++) { + kfree(pFirmware->mpCalibrations[n].mpDescription); + kfree(pFirmware->mpCalibrations[n].mData.mpDescription); + for (nn = 0; nn < pFirmware->mpCalibrations[n].mData.mnBlocks; nn++) + kfree(pFirmware->mpCalibrations[n].mData.mpBlocks[nn].mpData); + kfree(pFirmware->mpCalibrations[n].mData.mpBlocks); + } + kfree(pFirmware->mpCalibrations); + } + + memset(pFirmware, 0x00, sizeof(struct TFirmware)); +} + +static int tas2557_load_calibration(struct tas2557_priv *pTAS2557, char *pFileName) +{ + int nResult = 0; + struct file *nFile=NULL; + mm_segment_t fs; + unsigned char pBuffer[1000]; + int nSize = 0; + loff_t pos = 0; + + dev_dbg(pTAS2557->dev, "%s:\n", __func__); + fs = get_fs(); + set_fs(KERNEL_DS); + nFile = filp_open(pFileName, O_RDONLY, 0); + + dev_info(pTAS2557->dev, "TAS2557 calibration file = %s\n", pFileName); + if (IS_ERR(nFile)) { + if (PTR_ERR(nFile) == -ENOENT) + dev_err(pTAS2557->dev, "TAS2557 calibration file %s is not exit\n", pFileName); + else + dev_err(pTAS2557->dev, "TAS2557 cannot open calibration file: %s errno:%d\n", pFileName, (int)PTR_ERR(nFile)); + } else { + pos = nFile->f_pos; + nSize = vfs_read(nFile, pBuffer, 1000, &pos); + filp_close(nFile,NULL); + } + + set_fs(fs); + if (!nSize) + goto end; + + tas2557_clear_firmware(pTAS2557->mpCalFirmware); + dev_info(pTAS2557->dev, "TAS2557 calibration file size = %d\n", nSize); + nResult = fw_parse(pTAS2557, pTAS2557->mpCalFirmware, pBuffer, nSize); + + if (nResult) + dev_err(pTAS2557->dev, "TAS2557 calibration file is corrupt\n"); + else + dev_info(pTAS2557->dev, "TAS2557 calibration: %d calibrations\n", pTAS2557->mpCalFirmware->mnCalibrations); + +end: + return nResult; +} + +static bool tas2557_get_coefficient_in_block(struct tas2557_priv *pTAS2557, + struct TBlock *pBlock, int nReg, int *pnValue) +{ + int nCoefficient = 0; + bool bFound = false; + unsigned char *pCommands; + int nBook, nPage, nOffset, len; + int i, n; + + pCommands = pBlock->mpData; + for (i = 0 ; i < pBlock->mnCommands;) { + nBook = pCommands[4 * i + 0]; + nPage = pCommands[4 * i + 1]; + nOffset = pCommands[4 * i + 2]; + if ((nOffset < 0x7f) || (nOffset == 0x81)) + i++; + else if (nOffset == 0x85) { + len = ((int)nBook << 8) | nPage; + nBook = pCommands[4 * i + 4]; + nPage = pCommands[4 * i + 5]; + nOffset = pCommands[4 * i + 6]; + n = 4 * i + 7; + i += 2; + i += ((len - 1) / 4); + if ((len - 1) % 4) + i++; + if ((nBook != TAS2557_BOOK_ID(nReg)) + || (nPage != TAS2557_PAGE_ID(nReg))) + continue; + if (nOffset > TAS2557_PAGE_REG(nReg)) + continue; + if ((len + nOffset) >= (TAS2557_PAGE_REG(nReg) + 4)) { + n += (TAS2557_PAGE_REG(nReg) - nOffset); + nCoefficient = ((int)pCommands[n] << 24) + | ((int)pCommands[n + 1] << 16) + | ((int)pCommands[n + 2] << 8) + | (int)pCommands[n + 3]; + bFound = true; + break; + } + } else { + dev_err(pTAS2557->dev, "%s, format error %d\n", __func__, nOffset); + break; + } + } + + if (bFound) { + *pnValue = nCoefficient; + dev_dbg(pTAS2557->dev, "%s, B[0x%x]P[0x%x]R[0x%x]=0x%x\n", __func__, + TAS2557_BOOK_ID(nReg), TAS2557_PAGE_ID(nReg), TAS2557_PAGE_REG(nReg), + nCoefficient); + } + + return bFound; +} + +static bool tas2557_get_coefficient_in_data(struct tas2557_priv *pTAS2557, + struct TData *pData, int blockType, int nReg, int *pnValue) +{ + bool bFound = false; + struct TBlock *pBlock; + int i; + + for (i = 0; i < pData->mnBlocks; i++) { + pBlock = &(pData->mpBlocks[i]); + if (pBlock->mnType == blockType) { + bFound = tas2557_get_coefficient_in_block(pTAS2557, + pBlock, nReg, pnValue); + if (bFound) + break; + } + } + + return bFound; +} + +static bool tas2557_find_Tmax_in_configuration(struct tas2557_priv *pTAS2557, + struct TConfiguration *pConfiguration, int *pnTMax) +{ + struct TData *pData; + bool bFound = false; + int nBlockType, nReg, nCoefficient; + + if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) + nReg = TAS2557_PG2P1_CALI_T_REG; + else + nReg = TAS2557_PG1P0_CALI_T_REG; + + nBlockType = TAS2557_BLOCK_CFG_COEFF_DEV_A; + + pData = &(pConfiguration->mData); + bFound = tas2557_get_coefficient_in_data(pTAS2557, pData, nBlockType, nReg, &nCoefficient); + if (bFound) + *pnTMax = nCoefficient; + + return bFound; +} + +void tas2557_fw_ready(const struct firmware *pFW, void *pContext) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *) pContext; + int nResult; + unsigned int nProgram = 0; + unsigned int nSampleRate = 0; + +#ifdef CONFIG_TAS2557_CODEC + mutex_lock(&pTAS2557->codec_lock); +#endif + +#ifdef CONFIG_TAS2557_MISC + mutex_lock(&pTAS2557->file_lock); +#endif + + dev_info(pTAS2557->dev, "%s:\n", __func__); + + if (unlikely(!pFW) || unlikely(!pFW->data)) { + dev_err(pTAS2557->dev, "firmware is not loaded.\n"); + goto end; + } + + if (pTAS2557->mpFirmware->mpConfigurations) { + nProgram = pTAS2557->mnCurrentProgram; + nSampleRate = pTAS2557->mnCurrentSampleRate; + dev_dbg(pTAS2557->dev, "clear current firmware\n"); + tas2557_clear_firmware(pTAS2557->mpFirmware); + } + + nResult = fw_parse(pTAS2557, pTAS2557->mpFirmware, (unsigned char *)(pFW->data), pFW->size); + release_firmware(pFW); + if (nResult < 0) { + dev_err(pTAS2557->dev, "firmware is corrupt\n"); + goto end; + } + + if (!pTAS2557->mpFirmware->mnPrograms) { + dev_err(pTAS2557->dev, "firmware contains no programs\n"); + nResult = -EINVAL; + goto end; + } + + if (!pTAS2557->mpFirmware->mnConfigurations) { + dev_err(pTAS2557->dev, "firmware contains no configurations\n"); + nResult = -EINVAL; + goto end; + } + + if (nProgram >= pTAS2557->mpFirmware->mnPrograms) { + dev_info(pTAS2557->dev, + "no previous program, set to default\n"); + nProgram = 0; + } + + pTAS2557->mnCurrentSampleRate = nSampleRate; + nResult = tas2557_set_program(pTAS2557, nProgram, -1); + +end: + +#ifdef CONFIG_TAS2557_CODEC + mutex_unlock(&pTAS2557->codec_lock); +#endif + +#ifdef CONFIG_TAS2557_MISC + mutex_unlock(&pTAS2557->file_lock); +#endif +} + +int tas2557_set_program(struct tas2557_priv *pTAS2557, + unsigned int nProgram, int nConfig) +{ + struct TProgram *pProgram; + unsigned int nConfiguration = 0; + unsigned int nSampleRate = 0; + unsigned char nGain; + bool bFound = false; + int nResult = 0; + + if ((!pTAS2557->mpFirmware->mpPrograms) || + (!pTAS2557->mpFirmware->mpConfigurations)) { + dev_err(pTAS2557->dev, "Firmware not loaded\n"); + nResult = 0; + goto end; + } + + if (nProgram >= pTAS2557->mpFirmware->mnPrograms) { + dev_err(pTAS2557->dev, "TAS2557: Program %d doesn't exist\n", + nProgram); + nResult = 0; + goto end; + } + + if (nConfig < 0) { + nConfiguration = 0; + nSampleRate = pTAS2557->mnCurrentSampleRate; + while (!bFound && (nConfiguration < pTAS2557->mpFirmware->mnConfigurations)) { + if (pTAS2557->mpFirmware->mpConfigurations[nConfiguration].mnProgram == nProgram) { + if (nSampleRate == 0) { + bFound = true; + dev_info(pTAS2557->dev, "find default configuration %d\n", nConfiguration); + } else if (nSampleRate == pTAS2557->mpFirmware->mpConfigurations[nConfiguration].mnSamplingRate) { + bFound = true; + dev_info(pTAS2557->dev, "find matching configuration %d\n", nConfiguration); + } else { + nConfiguration++; + } + } else { + nConfiguration++; + } + } + if (!bFound) { + dev_err(pTAS2557->dev, + "Program %d, no valid configuration found for sample rate %d, ignore\n", + nProgram, nSampleRate); + nResult = 0; + goto end; + } + } else { + if (pTAS2557->mpFirmware->mpConfigurations[nConfig].mnProgram != nProgram) { + dev_err(pTAS2557->dev, "%s, configuration program doesn't match\n", __func__); + nResult = 0; + goto end; + } + nConfiguration = nConfig; + } + + pProgram = &(pTAS2557->mpFirmware->mpPrograms[nProgram]); + if (pTAS2557->mbPowerUp) { + dev_info(pTAS2557->dev, + "device powered up, power down to load program %d (%s)\n", + nProgram, pProgram->mpName); + if (hrtimer_active(&pTAS2557->mtimer)) + hrtimer_cancel(&pTAS2557->mtimer); + + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) + pTAS2557->enableIRQ(pTAS2557, false); + + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + if (nResult < 0) + goto end; + } + + pTAS2557->hw_reset(pTAS2557); + nResult = pTAS2557->write(pTAS2557, TAS2557_SW_RESET_REG, 0x01); + if (nResult < 0) + goto end; + msleep(1); + nResult = tas2557_load_default(pTAS2557); + if (nResult < 0) + goto end; + + dev_info(pTAS2557->dev, "load program %d (%s)\n", nProgram, pProgram->mpName); + nResult = tas2557_load_data(pTAS2557, &(pProgram->mData), TAS2557_BLOCK_PGM_DEV_A); + if (nResult < 0) + goto end; + pTAS2557->mnCurrentProgram = nProgram; + + nResult = tas2557_get_DAC_gain(pTAS2557, &nGain); + if (nResult < 0) + goto end; + pTAS2557->mnDevGain = nGain; + pTAS2557->mnDevCurrentGain = nGain; + + nResult = tas2557_load_coefficient(pTAS2557, -1, nConfiguration, false); + if (nResult < 0) + goto end; + + if (pTAS2557->mbPowerUp) { + pTAS2557->clearIRQ(pTAS2557); + dev_dbg(pTAS2557->dev, "device powered up, load startup\n"); + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_startup_data); + if (nResult < 0) + goto end; + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + nResult = tas2557_checkPLL(pTAS2557); + if (nResult < 0) { + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); + pTAS2557->mbPowerUp = false; + goto end; + } + } + dev_dbg(pTAS2557->dev, "device powered up, load unmute\n"); + nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_unmute_data); + if (nResult < 0) + goto end; + + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + pTAS2557->enableIRQ(pTAS2557, true); + if (!hrtimer_active(&pTAS2557->mtimer)) { + pTAS2557->mnDieTvReadCounter = 0; + hrtimer_start(&pTAS2557->mtimer, + ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); + } + } + } + +end: + + if (nResult < 0) { + if (pTAS2557->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK)) + failsafe(pTAS2557); + } + return nResult; +} + +int tas2557_set_calibration(struct tas2557_priv *pTAS2557, int nCalibration) +{ + struct TCalibration *pCalibration = NULL; + struct TConfiguration *pConfiguration; + struct TProgram *pProgram; + int nTmax = 0; + bool bFound = false; + int nResult = 0; + + if ((!pTAS2557->mpFirmware->mpPrograms) + || (!pTAS2557->mpFirmware->mpConfigurations)) { + dev_err(pTAS2557->dev, "Firmware not loaded\n\r"); + nResult = 0; + goto end; + } + + if (nCalibration == 0x00FF) { + nResult = tas2557_load_calibration(pTAS2557, TAS2557_CAL_NAME); + if (nResult < 0) { + dev_info(pTAS2557->dev, "load new calibration file %s fail %d\n", + TAS2557_CAL_NAME, nResult); + goto end; + } + nCalibration = 0; + } + + if (nCalibration >= pTAS2557->mpCalFirmware->mnCalibrations) { + dev_err(pTAS2557->dev, + "Calibration %d doesn't exist\n", nCalibration); + nResult = 0; + goto end; + } + + pTAS2557->mnCurrentCalibration = nCalibration; + if (pTAS2557->mbLoadConfigurationPrePowerUp) + goto end; + + pCalibration = &(pTAS2557->mpCalFirmware->mpCalibrations[nCalibration]); + pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); + pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); + if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { + if (pTAS2557->mbBypassTMax) { + bFound = tas2557_find_Tmax_in_configuration(pTAS2557, pConfiguration, &nTmax); + if (bFound && (nTmax == TAS2557_COEFFICIENT_TMAX)) { + dev_dbg(pTAS2557->dev, "%s, config[%s] bypass load calibration\n", + __func__, pConfiguration->mpName); + goto end; + } + } + + dev_dbg(pTAS2557->dev, "%s, load calibration\n", __func__); + nResult = tas2557_load_data(pTAS2557, &(pCalibration->mData), TAS2557_BLOCK_CFG_COEFF_DEV_A); + if (nResult < 0) + goto end; + } + +end: + if (nResult < 0) { + tas2557_clear_firmware(pTAS2557->mpCalFirmware); + nResult = tas2557_set_program(pTAS2557, pTAS2557->mnCurrentProgram, pTAS2557->mnCurrentConfiguration); + } + + return nResult; +} + +bool tas2557_get_Cali_prm_r0(struct tas2557_priv *pTAS2557, int *prm_r0) +{ + struct TCalibration *pCalibration; + struct TData *pData; + int nReg; + int nCali_Re; + bool bFound = false; + int nBlockType; + + if (!pTAS2557->mpCalFirmware->mnCalibrations) { + dev_err(pTAS2557->dev, "%s, no calibration data\n", __func__); + goto end; + } + + if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) + nReg = TAS2557_PG2P1_CALI_R0_REG; + else + nReg = TAS2557_PG1P0_CALI_R0_REG; + + nBlockType = TAS2557_BLOCK_CFG_COEFF_DEV_A; + + pCalibration = &(pTAS2557->mpCalFirmware->mpCalibrations[pTAS2557->mnCurrentCalibration]); + pData = &(pCalibration->mData); + + bFound = tas2557_get_coefficient_in_data(pTAS2557, pData, nBlockType, nReg, &nCali_Re); + +end: + + if (bFound) + *prm_r0 = nCali_Re; + + return bFound; +} + +int spk_id_get(struct device_node *np) +{ + int id; + int state; + + state = spk_id_get_pin_3state(np); + if (state < 0) { + pr_err("%s: Can not get id pin state, %d\n", __func__, state); + return VENDOR_ID_NONE; + } + + switch (state) { + case PIN_PULL_DOWN: + id = VENDOR_ID_AAC; + break; + case PIN_PULL_UP: + id = VENDOR_ID_UNKNOWN; + break; + case PIN_FLOAT: + id = VENDOR_ID_GOER; + break; + default: + id = VENDOR_ID_UNKNOWN; + break; + } + return id; +} + +int tas2557_parse_dt(struct device *dev, struct tas2557_priv *pTAS2557) +{ + struct device_node *np = dev->of_node; + int rc = 0, ret = 0; + unsigned int value; + + pTAS2557->spk_id_gpio_p = of_parse_phandle(np, + "ti,spk-id-pin", 0); + if (!pTAS2557->spk_id_gpio_p) { + dev_dbg(pTAS2557->dev, "property %s not detected in node %s", + "ti,spk-id-pin", np->full_name); + pTAS2557->mnSpkType = VENDOR_ID_NONE; + } else { + pTAS2557->mnSpkType = spk_id_get(pTAS2557->spk_id_gpio_p); + } + dev_dbg(pTAS2557->dev, "spk is is %d", pTAS2557->mnSpkType); + + pTAS2557->mnResetGPIO = of_get_named_gpio(np, "ti,cdc-reset-gpio", 0); + if (!gpio_is_valid(pTAS2557->mnResetGPIO)) { + dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", + "ti,cdc-reset-gpio", np->full_name, + pTAS2557->mnResetGPIO); + ret = -EINVAL; + goto end; + } else + dev_dbg(pTAS2557->dev, "ti,cdc-reset-gpio=%d\n", pTAS2557->mnResetGPIO); + + pTAS2557->mnGpioINT = of_get_named_gpio(np, "ti,irq-gpio", 0); + if (!gpio_is_valid(pTAS2557->mnGpioINT)) + dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", + "ti,irq-gpio", np->full_name, + pTAS2557->mnGpioINT); + + + rc = of_property_read_u32(np, "ti,i2s-bits", &value); + if (rc) + dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", + "ti,i2s-bits", np->full_name, rc); + else + pTAS2557->mnI2SBits = value; + + rc = of_property_read_u32(np, "ti,bypass-tmax", &value); + if (rc) + dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", + "ti,bypass-tmax", np->full_name, rc); + else + pTAS2557->mbBypassTMax = (value > 0); + +end: + + return ret; +} + +MODULE_AUTHOR("Texas Instruments Inc."); +MODULE_DESCRIPTION("TAS2557 common functions for Android Linux"); +MODULE_LICENSE("GPL v2"); diff --git a/asoc/codecs/tas2557/tas2557-core.h b/asoc/codecs/tas2557/tas2557-core.h new file mode 100755 index 000000000000..5081d5bb4364 --- /dev/null +++ b/asoc/codecs/tas2557/tas2557-core.h @@ -0,0 +1,81 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557-core.h +** +** Description: +** header file for tas2557-core.c +** +** ============================================================================= +*/ + +#ifndef _TAS2557_CORE_H +#define _TAS2557_CORE_H + +#include "tas2557.h" + +#define TAS2557_YRAM_BOOK1 140 + +#define TAS2557_YRAM1_PAGE 42 +#define TAS2557_YRAM1_START_REG 88 +#define TAS2557_YRAM1_END_REG 127 + +#define TAS2557_YRAM2_START_PAGE 43 +#define TAS2557_YRAM2_END_PAGE 49 +#define TAS2557_YRAM2_START_REG 8 +#define TAS2557_YRAM2_END_REG 127 + +#define TAS2557_YRAM3_PAGE 50 +#define TAS2557_YRAM3_START_REG 8 +#define TAS2557_YRAM3_END_REG 27 + +/* should not include B0_P53_R44-R47 */ +#define TAS2557_YRAM_BOOK2 0 +#define TAS2557_YRAM4_START_PAGE 50 +#define TAS2557_YRAM4_END_PAGE 60 +#define TAS2557_YRAM4_START_REG 8 +#define TAS2557_YRAM4_END_REG 127 + +#define TAS2557_YRAM5_PAGE 61 +#define TAS2557_YRAM5_START_REG 8 +#define TAS2557_YRAM5_END_REG 27 + +#define TAS2557_COEFFICIENT_TMAX 0x7fffffff +#define TAS2557_SAFE_GUARD_PATTERN 0x5a +#define LOW_TEMPERATURE_CHECK_PERIOD 5000 /* 5 second */ + +struct TYCRC { + unsigned char mnOffset; + unsigned char mnLen; +}; + +int tas2557_enable(struct tas2557_priv *pTAS2557, bool bEnable); +int tas2557_permanent_mute(struct tas2557_priv *pTAS2557, bool bmute); +int tas2557_SA_DevChnSetup(struct tas2557_priv *pTAS2557, unsigned int mode); +int tas2557_get_die_temperature(struct tas2557_priv *pTAS2557, int *pTemperature); +int tas2557_set_sampling_rate(struct tas2557_priv *pTAS2557, unsigned int nSamplingRate); +int tas2557_set_bit_rate(struct tas2557_priv *pTAS2557, unsigned int nBitRate); +int tas2557_get_bit_rate(struct tas2557_priv *pTAS2557, unsigned char *pBitRate); +int tas2557_set_config(struct tas2557_priv *pTAS2557, int config); +void tas2557_fw_ready(const struct firmware *pFW, void *pContext); +bool tas2557_get_Cali_prm_r0(struct tas2557_priv *pTAS2557, int *prm_r0); +int tas2557_set_program(struct tas2557_priv *pTAS2557, unsigned int nProgram, int nConfig); +int tas2557_set_calibration(struct tas2557_priv *pTAS2557, int nCalibration); +int tas2557_load_default(struct tas2557_priv *pTAS2557); +int tas2557_parse_dt(struct device *dev, struct tas2557_priv *pTAS2557); +int tas2557_get_DAC_gain(struct tas2557_priv *pTAS2557, unsigned char *pnGain); +int tas2557_set_DAC_gain(struct tas2557_priv *pTAS2557, unsigned int nGain); +int tas2557_configIRQ(struct tas2557_priv *pTAS2557); +int spk_id_get(struct device_node *np); + +#endif /* _TAS2557_CORE_H */ diff --git a/asoc/codecs/tas2557/tas2557-misc.c b/asoc/codecs/tas2557/tas2557-misc.c new file mode 100755 index 000000000000..5f342e60e33a --- /dev/null +++ b/asoc/codecs/tas2557/tas2557-misc.c @@ -0,0 +1,603 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557-misc.c +** +** Description: +** misc driver for Texas Instruments TAS2557 High Performance 4W Smart Amplifier +** +** ============================================================================= +*/ + +#ifdef CONFIG_TAS2557_MISC + +#define DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tas2557.h" +#include "tas2557-core.h" +#include "tas2557-misc.h" + +static int g_logEnable = 1; +static struct tas2557_priv *g_tas2557; + +static int tas2557_file_open(struct inode *inode, struct file *file) +{ + struct tas2557_priv *pTAS2557 = g_tas2557; + + if (!try_module_get(THIS_MODULE)) + return -ENODEV; + + file->private_data = (void *)pTAS2557; + if (g_logEnable) + dev_info(pTAS2557->dev, "%s\n", __func__); + return 0; +} + +static int tas2557_file_release(struct inode *inode, struct file *file) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)file->private_data; + + if (g_logEnable) + dev_info(pTAS2557->dev, "%s\n", __func__); + file->private_data = (void *)NULL; + module_put(THIS_MODULE); + + return 0; +} + +static ssize_t tas2557_file_read(struct file *file, char *buf, size_t count, loff_t *ppos) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)file->private_data; + int ret = 0; + unsigned int nValue = 0; + unsigned char value = 0; + unsigned char *p_kBuf = NULL; + + mutex_lock(&pTAS2557->file_lock); + + switch (pTAS2557->mnDBGCmd) { + case TIAUDIO_CMD_REG_READ: { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_READ: current_reg = 0x%x, count=%d\n", + pTAS2557->mnCurrentReg, (int)count); + if (count == 1) { + ret = pTAS2557->read(pTAS2557, pTAS2557->mnCurrentReg, &nValue); + if (ret < 0) + break; + + value = (u8)nValue; + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_READ: nValue=0x%x, value=0x%x\n", nValue, value); + ret = copy_to_user(buf, &value, 1); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + } else if (count > 1) { + p_kBuf = kzalloc(count, GFP_KERNEL); + if (p_kBuf != NULL) { + ret = pTAS2557->bulk_read(pTAS2557, pTAS2557->mnCurrentReg, p_kBuf, count); + if (ret < 0) + break; + ret = copy_to_user(buf, p_kBuf, count); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + kfree(p_kBuf); + } else + dev_err(pTAS2557->dev, "read no mem\n"); + } + } + break; + + case TIAUDIO_CMD_PROGRAM: { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_PROGRAM: count = %d\n", (int)count); + + if (count == PROGRAM_BUF_SIZE) { + p_kBuf = kzalloc(count, GFP_KERNEL); + if (p_kBuf != NULL) { + struct TProgram *pProgram = + &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); + p_kBuf[0] = pTAS2557->mpFirmware->mnPrograms; + p_kBuf[1] = pTAS2557->mnCurrentProgram; + p_kBuf[2] = pProgram->mnAppMode; + p_kBuf[3] = (pProgram->mnBoost&0xff00)>>8; + p_kBuf[4] = (pProgram->mnBoost&0x00ff); + memcpy(&p_kBuf[5], pProgram->mpName, FW_NAME_SIZE); + strlcpy(&p_kBuf[5+FW_NAME_SIZE], pProgram->mpDescription, strlen(pProgram->mpDescription) + 1); + ret = copy_to_user(buf, p_kBuf, count); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + kfree(p_kBuf); + } else + dev_err(pTAS2557->dev, "read no mem\n"); + } else + dev_err(pTAS2557->dev, "read buffer not sufficient\n"); + } else + dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + } + break; + + case TIAUDIO_CMD_CONFIGURATION: { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_CONFIGURATION: count = %d\n", (int)count); + if (count == CONFIGURATION_BUF_SIZE) { + p_kBuf = kzalloc(count, GFP_KERNEL); + if (p_kBuf != NULL) { + struct TConfiguration *pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); + + p_kBuf[0] = pTAS2557->mpFirmware->mnConfigurations; + p_kBuf[1] = pTAS2557->mnCurrentConfiguration; + memcpy(&p_kBuf[2], pConfiguration->mpName, FW_NAME_SIZE); + p_kBuf[2+FW_NAME_SIZE] = pConfiguration->mnProgram; + p_kBuf[3+FW_NAME_SIZE] = pConfiguration->mnPLL; + p_kBuf[4+FW_NAME_SIZE] = (pConfiguration->mnSamplingRate&0x000000ff); + p_kBuf[5+FW_NAME_SIZE] = ((pConfiguration->mnSamplingRate&0x0000ff00)>>8); + p_kBuf[6+FW_NAME_SIZE] = ((pConfiguration->mnSamplingRate&0x00ff0000)>>16); + p_kBuf[7+FW_NAME_SIZE] = ((pConfiguration->mnSamplingRate&0xff000000)>>24); + strlcpy(&p_kBuf[8+FW_NAME_SIZE], pConfiguration->mpDescription, strlen(pConfiguration->mpDescription)+1); + ret = copy_to_user(buf, p_kBuf, count); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + kfree(p_kBuf); + } else + dev_err(pTAS2557->dev, "read no mem\n"); + } else + dev_err(pTAS2557->dev, "read buffer not sufficient\n"); + } else + dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + } + break; + + case TIAUDIO_CMD_FW_TIMESTAMP: { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_FW_TIMESTAMP: count = %d\n", (int)count); + + if (count == 4) { + p_kBuf = kzalloc(count, GFP_KERNEL); + if (p_kBuf != NULL) { + p_kBuf[0] = (pTAS2557->mpFirmware->mnTimeStamp&0x000000ff); + p_kBuf[1] = ((pTAS2557->mpFirmware->mnTimeStamp&0x0000ff00)>>8); + p_kBuf[2] = ((pTAS2557->mpFirmware->mnTimeStamp&0x00ff0000)>>16); + p_kBuf[3] = ((pTAS2557->mpFirmware->mnTimeStamp&0xff000000)>>24); + ret = copy_to_user(buf, p_kBuf, count); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + kfree(p_kBuf); + } else + dev_err(pTAS2557->dev, "read no mem\n"); + } + } + break; + + case TIAUDIO_CMD_CALIBRATION: { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_CALIBRATION: count = %d\n", (int)count); + + if (count == 1) { + unsigned char curCal = pTAS2557->mnCurrentCalibration; + + ret = copy_to_user(buf, &curCal, 1); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + } + } + break; + + case TIAUDIO_CMD_SAMPLERATE: { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_SAMPLERATE: count = %d\n", (int)count); + if (count == 4) { + p_kBuf = kzalloc(count, GFP_KERNEL); + if (p_kBuf != NULL) { + struct TConfiguration *pConfiguration = + &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); + + p_kBuf[0] = (pConfiguration->mnSamplingRate&0x000000ff); + p_kBuf[1] = ((pConfiguration->mnSamplingRate&0x0000ff00)>>8); + p_kBuf[2] = ((pConfiguration->mnSamplingRate&0x00ff0000)>>16); + p_kBuf[3] = ((pConfiguration->mnSamplingRate&0xff000000)>>24); + + ret = copy_to_user(buf, p_kBuf, count); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + + kfree(p_kBuf); + } else + dev_err(pTAS2557->dev, "read no mem\n"); + } + } + break; + + case TIAUDIO_CMD_BITRATE: { + if (g_logEnable) + dev_info(pTAS2557->dev, + "TIAUDIO_CMD_BITRATE: count = %d\n", (int)count); + + if (count == 1) { + unsigned char bitRate = 0; + ret = tas2557_get_bit_rate(pTAS2557, &bitRate); + if (ret >= 0) { + ret = copy_to_user(buf, &bitRate, 1); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + } + } + } + break; + + case TIAUDIO_CMD_DACVOLUME: { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_DACVOLUME: count = %d\n", (int)count); + + if (count == 1) { + unsigned char volume = 0; + + ret = tas2557_get_DAC_gain(pTAS2557, &volume); + if (ret >= 0) { + ret = copy_to_user(buf, &volume, 1); + if (ret != 0) { + /* Failed to copy all the data, exit */ + dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); + } + } + } + } + break; + } + pTAS2557->mnDBGCmd = 0; + + mutex_unlock(&pTAS2557->file_lock); + return count; +} + +static ssize_t tas2557_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)file->private_data; + int ret = 0; + unsigned char *p_kBuf = NULL; + unsigned int reg = 0; + unsigned int len = 0; + + mutex_lock(&pTAS2557->file_lock); + + p_kBuf = kzalloc(count, GFP_KERNEL); + if (p_kBuf == NULL) { + dev_err(pTAS2557->dev, "write no mem\n"); + goto err; + } + + ret = copy_from_user(p_kBuf, buf, count); + if (ret != 0) { + dev_err(pTAS2557->dev, "copy_from_user failed.\n"); + goto err; + } + + pTAS2557->mnDBGCmd = p_kBuf[0]; + switch (pTAS2557->mnDBGCmd) { + case TIAUDIO_CMD_REG_WITE: + if (count > 5) { + reg = ((unsigned int)p_kBuf[1] << 24) + + ((unsigned int)p_kBuf[2] << 16) + + ((unsigned int)p_kBuf[3] << 8) + + (unsigned int)p_kBuf[4]; + len = count - 5; + if (len == 1) { + ret = pTAS2557->write(pTAS2557, reg, p_kBuf[5]); + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_WITE, Reg=0x%x, Val=0x%x\n", reg, p_kBuf[5]); + } else + ret = pTAS2557->bulk_write(pTAS2557, reg, &p_kBuf[5], len); + } else + dev_err(pTAS2557->dev, "%s, write len fail, count=%d.\n", __func__, (int)count); + pTAS2557->mnDBGCmd = 0; + break; + + case TIAUDIO_CMD_REG_READ: + if (count == 5) { + pTAS2557->mnCurrentReg = ((unsigned int)p_kBuf[1] << 24) + + ((unsigned int)p_kBuf[2] << 16) + + ((unsigned int)p_kBuf[3] << 8) + + (unsigned int)p_kBuf[4]; + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_READ whole=0x%x\n", pTAS2557->mnCurrentReg); + } else + dev_err(pTAS2557->dev, "read len fail.\n"); + break; + + case TIAUDIO_CMD_DEBUG_ON: + if (count == 2) + g_logEnable = p_kBuf[1]; + + pTAS2557->mnDBGCmd = 0; + break; + + case TIAUDIO_CMD_PROGRAM: + { + if (count == 2) { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) { + int config = -1; + + if (p_kBuf[1] == pTAS2557->mnCurrentProgram) + config = pTAS2557->mnCurrentConfiguration; + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_PROGRAM, set to %d, cfg=%d\n", p_kBuf[1], config); + tas2557_set_program(pTAS2557, p_kBuf[1], config); + pTAS2557->mnDBGCmd = 0; + } else + dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + } + } + break; + + case TIAUDIO_CMD_CONFIGURATION: + { + if (count == 2) { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_CONFIGURATION, set to %d\n", p_kBuf[1]); + tas2557_set_config(pTAS2557, p_kBuf[1]); + pTAS2557->mnDBGCmd = 0; + } else + dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + } + } + break; + + case TIAUDIO_CMD_FW_TIMESTAMP: + /*let go*/ + break; + + case TIAUDIO_CMD_CALIBRATION: + { + if (count == 2) { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_CALIBRATION, set to %d\n", p_kBuf[1]); + tas2557_set_calibration(pTAS2557, p_kBuf[1]); + pTAS2557->mnDBGCmd = 0; + } + } + } + break; + + case TIAUDIO_CMD_SAMPLERATE: + if (count == 5) { + unsigned int nSampleRate = ((unsigned int)p_kBuf[1] << 24) + + ((unsigned int)p_kBuf[2] << 16) + + ((unsigned int)p_kBuf[3] << 8) + + (unsigned int)p_kBuf[4]; + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_SAMPLERATE, set to %d\n", nSampleRate); + + tas2557_set_sampling_rate(pTAS2557, nSampleRate); + } + break; + + case TIAUDIO_CMD_BITRATE: + if (count == 2) { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_BITRATE, set to %d\n", p_kBuf[1]); + + tas2557_set_bit_rate(pTAS2557, p_kBuf[1]); + } + break; + + case TIAUDIO_CMD_DACVOLUME: + if (count == 2) { + unsigned char volume; + + volume = (p_kBuf[1] & 0x0f); + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_DACVOLUME, set to %d\n", volume); + + tas2557_set_DAC_gain(pTAS2557, volume); + } + break; + + case TIAUDIO_CMD_SPEAKER: + if (count == 2) { + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_SPEAKER, set to %d\n", p_kBuf[1]); + tas2557_enable(pTAS2557, (p_kBuf[1] > 0)); + } + break; + + case TIAUDIO_CMD_FW_RELOAD: + if (count == 1) { + const char *pFWName; + if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) + pFWName = TAS2557_AAC_FW_NAME; + else if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) + pFWName = TAS2557_PG1P0_FW_NAME; + else + break; + + if (pTAS2557->mnSpkType == VENDOR_ID_GOER) + pFWName = TAS2557_GOER_FW_NAME; + else if (pTAS2557->mnSpkType == VENDOR_ID_AAC) + pFWName = TAS2557_AAC_FW_NAME; + else if (pTAS2557->mnSpkType == VENDOR_ID_SSI) + pFWName = TAS2557_SSI_FW_NAME; + else + pFWName = TAS2557_DEFAULT_FW_NAME; + + ret = request_firmware_nowait(THIS_MODULE, 1, pFWName, + pTAS2557->dev, GFP_KERNEL, pTAS2557, tas2557_fw_ready); + + if (g_logEnable) + dev_info(pTAS2557->dev, "TIAUDIO_CMD_FW_RELOAD: ret = %d\n", ret); + } + break; + + default: + pTAS2557->mnDBGCmd = 0; + break; + } + +err: + if (p_kBuf != NULL) + kfree(p_kBuf); + + mutex_unlock(&pTAS2557->file_lock); + + return count; +} + +static long tas2557_file_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct tas2557_priv *pTAS2557 = file->private_data; + int ret = 0; + + mutex_lock(&pTAS2557->file_lock); + + switch (cmd) { + case SMARTPA_SPK_DAC_VOLUME: + { + } + break; + + case SMARTPA_SPK_POWER_ON: + { + tas2557_enable(pTAS2557, true); + } + break; + + case SMARTPA_SPK_POWER_OFF: + { + tas2557_enable(pTAS2557, false); + } + break; + + case SMARTPA_SPK_SWITCH_PROGRAM: + { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) + tas2557_set_program(pTAS2557, arg, -1); + } + break; + + case SMARTPA_SPK_SWITCH_CONFIGURATION: + { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) + tas2557_set_config(pTAS2557, arg); + } + break; + + case SMARTPA_SPK_SWITCH_CALIBRATION: + { + if ((pTAS2557->mpFirmware->mnConfigurations > 0) + && (pTAS2557->mpFirmware->mnPrograms > 0)) + tas2557_set_calibration(pTAS2557, arg); + } + break; + + case SMARTPA_SPK_SET_SAMPLERATE: + { + tas2557_set_sampling_rate(pTAS2557, arg); + } + break; + + case SMARTPA_SPK_SET_BITRATE: + { + tas2557_set_bit_rate(pTAS2557, arg); + } + break; + } + + mutex_unlock(&pTAS2557->file_lock); + return ret; +} + +static const struct file_operations fops = { + .owner = THIS_MODULE, + .read = tas2557_file_read, + .write = tas2557_file_write, + .unlocked_ioctl = tas2557_file_unlocked_ioctl, + .open = tas2557_file_open, + .release = tas2557_file_release, +}; + +#define MODULE_NAME "tas2557" +static struct miscdevice tas2557_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = MODULE_NAME, + .fops = &fops, +}; + +int tas2557_register_misc(struct tas2557_priv *pTAS2557) +{ + int ret = 0; + + g_tas2557 = pTAS2557; + + ret = misc_register(&tas2557_misc); + if (ret) + dev_err(pTAS2557->dev, "TAS2557 misc fail: %d\n", ret); + + dev_info(pTAS2557->dev, "%s, leave\n", __func__); + + return ret; +} + +int tas2557_deregister_misc(struct tas2557_priv *pTAS2557) +{ + misc_deregister(&tas2557_misc); + return 0; +} + +MODULE_AUTHOR("Texas Instruments Inc."); +MODULE_DESCRIPTION("TAS2557 Misc Smart Amplifier driver"); +MODULE_LICENSE("GPL v2"); +#endif diff --git a/asoc/codecs/tas2557/tas2557-misc.h b/asoc/codecs/tas2557/tas2557-misc.h new file mode 100755 index 000000000000..a82f1d74b3c4 --- /dev/null +++ b/asoc/codecs/tas2557/tas2557-misc.h @@ -0,0 +1,57 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557-misc.h +** +** Description: +** header file for tas2557-misc.c +** +** ============================================================================= +*/ + +#ifndef _TAS2557_MISC_H +#define _TAS2557_MISC_H + +#define FW_NAME_SIZE 64 +#define FW_DESCRIPTION_SIZE 256 +#define PROGRAM_BUF_SIZE (5 + FW_NAME_SIZE + FW_DESCRIPTION_SIZE) +#define CONFIGURATION_BUF_SIZE (8 + FW_NAME_SIZE + FW_DESCRIPTION_SIZE) + +#define TIAUDIO_CMD_REG_WITE 1 +#define TIAUDIO_CMD_REG_READ 2 +#define TIAUDIO_CMD_DEBUG_ON 3 +#define TIAUDIO_CMD_PROGRAM 4 +#define TIAUDIO_CMD_CONFIGURATION 5 +#define TIAUDIO_CMD_FW_TIMESTAMP 6 +#define TIAUDIO_CMD_CALIBRATION 7 +#define TIAUDIO_CMD_SAMPLERATE 8 +#define TIAUDIO_CMD_BITRATE 9 +#define TIAUDIO_CMD_DACVOLUME 10 +#define TIAUDIO_CMD_SPEAKER 11 +#define TIAUDIO_CMD_FW_RELOAD 12 + +#define TAS2557_MAGIC_NUMBER 0x3235/* '2557' */ + +#define SMARTPA_SPK_DAC_VOLUME _IOWR(TAS2557_MAGIC_NUMBER, 1, unsigned long) +#define SMARTPA_SPK_POWER_ON _IOWR(TAS2557_MAGIC_NUMBER, 2, unsigned long) +#define SMARTPA_SPK_POWER_OFF _IOWR(TAS2557_MAGIC_NUMBER, 3, unsigned long) +#define SMARTPA_SPK_SWITCH_PROGRAM _IOWR(TAS2557_MAGIC_NUMBER, 4, unsigned long) +#define SMARTPA_SPK_SWITCH_CONFIGURATION _IOWR(TAS2557_MAGIC_NUMBER, 5, unsigned long) +#define SMARTPA_SPK_SWITCH_CALIBRATION _IOWR(TAS2557_MAGIC_NUMBER, 6, unsigned long) +#define SMARTPA_SPK_SET_SAMPLERATE _IOWR(TAS2557_MAGIC_NUMBER, 7, unsigned long) +#define SMARTPA_SPK_SET_BITRATE _IOWR(TAS2557_MAGIC_NUMBER, 8, unsigned long) + +int tas2557_register_misc(struct tas2557_priv *pTAS2557); +int tas2557_deregister_misc(struct tas2557_priv *pTAS2557); + +#endif /* _TAS2557_MISC_H */ diff --git a/asoc/codecs/tas2557/tas2557-regmap.c b/asoc/codecs/tas2557/tas2557-regmap.c new file mode 100755 index 000000000000..4a1f3b4ff73f --- /dev/null +++ b/asoc/codecs/tas2557/tas2557-regmap.c @@ -0,0 +1,936 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557-regmap.c +** +** Description: +** I2C driver with regmap for Texas Instruments TAS2557 High Performance 4W Smart Amplifier +** +** ============================================================================= +*/ + +#ifdef CONFIG_TAS2557_REGMAP + +#define DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tas2557.h" +#include "tas2557-core.h" +#include +#include +#ifdef CONFIG_TAS2557_CODEC +#include "tas2557-codec.h" +#endif + +#ifdef CONFIG_TAS2557_MISC +#include "tas2557-misc.h" +#endif + +#define ENABLE_TILOAD +#ifdef ENABLE_TILOAD +#include "tiload.h" +#endif +#include "../spk-id.h" + +#define LOW_TEMPERATURE_GAIN 6 +#define LOW_TEMPERATURE_COUNTER 12 + +static int tas2557_change_book_page( + struct tas2557_priv *pTAS2557, + unsigned char nBook, + unsigned char nPage) +{ + int nResult = 0; + + if ((pTAS2557->mnCurrentBook == nBook) + && pTAS2557->mnCurrentPage == nPage) + goto end; + + if (pTAS2557->mnCurrentBook != nBook) { + nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_PAGE, 0); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + goto end; + } + pTAS2557->mnCurrentPage = 0; + nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_REG, nBook); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + goto end; + } + pTAS2557->mnCurrentBook = nBook; + if (nPage != 0) { + nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_PAGE, nPage); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + goto end; + } + pTAS2557->mnCurrentPage = nPage; + } + } else if (pTAS2557->mnCurrentPage != nPage) { + nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_PAGE, nPage); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + goto end; + } + pTAS2557->mnCurrentPage = nPage; + } + +end: + if (nResult < 0) + pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; + else + pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; + + return nResult; +} + +static int tas2557_dev_read( + struct tas2557_priv *pTAS2557, + unsigned int nRegister, + unsigned int *pValue) +{ + int nResult = 0; + unsigned int Value = 0; + + mutex_lock(&pTAS2557->dev_lock); + + if (pTAS2557->mbTILoadActive) { + if (!(nRegister & 0x80000000)) + goto end; /* let only reads from TILoad pass. */ + nRegister &= ~0x80000000; + + dev_dbg(pTAS2557->dev, "TiLoad R REG B[%d]P[%d]R[%d]\n", + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister), + TAS2557_PAGE_REG(nRegister)); + } + + nResult = tas2557_change_book_page(pTAS2557, + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister)); + if (nResult >= 0) { + nResult = regmap_read(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), &Value); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; + goto end; + } else + pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; + *pValue = Value; + } + +end: + + mutex_unlock(&pTAS2557->dev_lock); + return nResult; +} + +static int tas2557_dev_write( + struct tas2557_priv *pTAS2557, + unsigned int nRegister, + unsigned int nValue) +{ + int nResult = 0; + + mutex_lock(&pTAS2557->dev_lock); + if ((nRegister == 0xAFFEAFFE) && (nValue == 0xBABEBABE)) { + pTAS2557->mbTILoadActive = true; + goto end; + } + + if ((nRegister == 0xBABEBABE) && (nValue == 0xAFFEAFFE)) { + pTAS2557->mbTILoadActive = false; + goto end; + } + + if (pTAS2557->mbTILoadActive) { + if (!(nRegister & 0x80000000)) + goto end;/* let only writes from TILoad pass. */ + nRegister &= ~0x80000000; + + dev_dbg(pTAS2557->dev, "TiLoad W REG B[%d]P[%d]R[%d] =0x%x\n", + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister), + TAS2557_PAGE_REG(nRegister), + nValue); + } + + nResult = tas2557_change_book_page(pTAS2557, + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister)); + if (nResult >= 0) { + nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), nValue); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; + } else + pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; + } + +end: + + mutex_unlock(&pTAS2557->dev_lock); + + return nResult; +} + +static int tas2557_dev_bulk_read( + struct tas2557_priv *pTAS2557, + unsigned int nRegister, + u8 *pData, + unsigned int nLength) +{ + int nResult = 0; + int i; + + mutex_lock(&pTAS2557->dev_lock); + if (pTAS2557->mbTILoadActive) { + if (!(nRegister & 0x80000000)) + goto end; /* let only writes from TILoad pass. */ + + nRegister &= ~0x80000000; + dev_dbg(pTAS2557->dev, "TiLoad BR REG B[%d]P[%d]R[%d], count=%d\n", + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister), + TAS2557_PAGE_REG(nRegister), + nLength); + } + + nResult = tas2557_change_book_page(pTAS2557, + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister)); + if (nResult >= 0) { + #define STRIDE 4 + /* Read chunk bytes defined by STRIDE */ + for (i = 0; i < (nLength / STRIDE); i++) { + nResult = regmap_bulk_read(pTAS2557->mpRegmap, + TAS2557_PAGE_REG((nRegister + i*STRIDE)), + &pData[i*STRIDE], STRIDE); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; + } else { + pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; + } + } + + /* Read remaining bytes */ + if ((nLength % STRIDE) != 0) { + nResult = regmap_bulk_read(pTAS2557->mpRegmap, + TAS2557_PAGE_REG(nRegister + i*STRIDE), + &pData[i*STRIDE], (nLength % STRIDE)); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; + } else { + pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; + } + } + } + +end: + mutex_unlock(&pTAS2557->dev_lock); + return nResult; +} + +static int tas2557_dev_bulk_write( + struct tas2557_priv *pTAS2557, + unsigned int nRegister, + u8 *pData, + unsigned int nLength) +{ + int nResult = 0; + + mutex_lock(&pTAS2557->dev_lock); + if (pTAS2557->mbTILoadActive) { + if (!(nRegister & 0x80000000)) + goto end; /* let only writes from TILoad pass. */ + + nRegister &= ~0x80000000; + + dev_dbg(pTAS2557->dev, "TiLoad BW REG B[%d]P[%d]R[%d], count=%d\n", + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister), + TAS2557_PAGE_REG(nRegister), + nLength); + } + + nResult = tas2557_change_book_page( pTAS2557, + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister)); + if (nResult >= 0) { + nResult = regmap_bulk_write(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), pData, nLength); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; + } else + pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; + } + +end: + + mutex_unlock(&pTAS2557->dev_lock); + return nResult; +} + +static int tas2557_dev_update_bits( + struct tas2557_priv *pTAS2557, + unsigned int nRegister, + unsigned int nMask, + unsigned int nValue) +{ + int nResult = 0; + + mutex_lock(&pTAS2557->dev_lock); + + if (pTAS2557->mbTILoadActive) { + if (!(nRegister & 0x80000000)) + goto end; /* let only writes from TILoad pass. */ + + nRegister &= ~0x80000000; + dev_dbg(pTAS2557->dev, "TiLoad SB REG B[%d]P[%d]R[%d], mask=0x%x, value=0x%x\n", + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister), + TAS2557_PAGE_REG(nRegister), + nMask, nValue); + } + + nResult = tas2557_change_book_page( pTAS2557, + TAS2557_BOOK_ID(nRegister), + TAS2557_PAGE_ID(nRegister)); + if (nResult >= 0) { + nResult = regmap_update_bits(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), nMask, nValue); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", + __func__, __LINE__, nResult); + pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; + } else + pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; + } + +end: + mutex_unlock(&pTAS2557->dev_lock); + return nResult; +} + +void tas2557_clearIRQ(struct tas2557_priv *pTAS2557) +{ + unsigned int nValue; + int nResult = 0; + + nResult = pTAS2557->read(pTAS2557, TAS2557_FLAGS_1, &nValue); + if (nResult >= 0) + pTAS2557->read(pTAS2557, TAS2557_FLAGS_2, &nValue); + +} + + +void tas2557_enableIRQ(struct tas2557_priv *pTAS2557, bool enable) +{ + if (enable) { + if (!pTAS2557->mbIRQEnable) { + if (gpio_is_valid(pTAS2557->mnGpioINT)) { + enable_irq(pTAS2557->mnIRQ); + /* check after 10 ms */ + schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(10)); + pTAS2557->mbIRQEnable = true; + } + } + } else { + if (gpio_is_valid(pTAS2557->mnGpioINT)) + disable_irq_nosync(pTAS2557->mnIRQ); + pTAS2557->mbIRQEnable = false; + } +} + +static void tas2557_hw_reset(struct tas2557_priv *pTAS2557) +{ + if (gpio_is_valid(pTAS2557->mnResetGPIO)) { + gpio_direction_output(pTAS2557->mnResetGPIO, 0); + msleep(5); + gpio_direction_output(pTAS2557->mnResetGPIO, 1); + msleep(2); + } + + pTAS2557->mnCurrentBook = -1; + pTAS2557->mnCurrentPage = -1; + if (pTAS2557->mnErrCode) + dev_info(pTAS2557->dev, "before reset, ErrCode=0x%x\n", pTAS2557->mnErrCode); + pTAS2557->mnErrCode = 0; +} + +static void irq_work_routine(struct work_struct *work) +{ + int nResult = 0; + unsigned int nDevInt1Status = 0, nDevInt2Status = 0; + unsigned int nDevPowerUpFlag = 0; + int nCounter = 2; + struct tas2557_priv *pTAS2557 = + container_of(work, struct tas2557_priv, irq_work.work); + +#ifdef CONFIG_TAS2557_CODEC + mutex_lock(&pTAS2557->codec_lock); +#endif + +#ifdef CONFIG_TAS2557_MISC + mutex_lock(&pTAS2557->file_lock); +#endif + + if(pTAS2557->mnErrCode & ERROR_FAILSAFE) + goto program; + + if (pTAS2557->mbRuntimeSuspend) { + dev_info(pTAS2557->dev, "%s, Runtime Suspended\n", __func__); + goto end; + } + + if (!pTAS2557->mbPowerUp) { + dev_info(pTAS2557->dev, "%s, device not powered\n", __func__); + goto end; + } + + if ((!pTAS2557->mpFirmware->mnConfigurations) + || (!pTAS2557->mpFirmware->mnPrograms)) { + dev_info(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + goto end; + } + + nResult = tas2557_dev_read(pTAS2557, TAS2557_FLAGS_1, &nDevInt1Status); + if (nResult >= 0) + nResult = tas2557_dev_read(pTAS2557, TAS2557_FLAGS_2, &nDevInt2Status); + + if (nResult < 0) + goto program; + + if (((nDevInt1Status & 0xfc) != 0) || ((nDevInt2Status & 0x0c) != 0)) { + /* in case of INT_OC, INT_UV, INT_OT, INT_BO, INT_CL, INT_CLK1, INT_CLK2 */ + dev_err(pTAS2557->dev, "critical error: 0x%x, 0x%x\n", nDevInt1Status, nDevInt2Status); + if (nDevInt1Status & 0x80) { + pTAS2557->mnErrCode |= ERROR_OVER_CURRENT; + dev_err(pTAS2557->dev, "DEVA SPK over current!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_OVER_CURRENT; + + if (nDevInt1Status & 0x40) { + pTAS2557->mnErrCode |= ERROR_UNDER_VOLTAGE; + dev_err(pTAS2557->dev, "DEVA SPK under voltage!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_UNDER_VOLTAGE; + + if (nDevInt1Status & 0x20) { + pTAS2557->mnErrCode |= ERROR_CLK_HALT; + dev_err(pTAS2557->dev, "DEVA clk halted!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_CLK_HALT; + + if (nDevInt1Status & 0x10) { + pTAS2557->mnErrCode |= ERROR_DIE_OVERTEMP; + dev_err(pTAS2557->dev, "DEVA die over temperature!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_DIE_OVERTEMP; + + if (nDevInt1Status & 0x08) { + pTAS2557->mnErrCode |= ERROR_BROWNOUT; + dev_err(pTAS2557->dev, "DEVA brownout!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_BROWNOUT; + + if (nDevInt1Status & 0x04) { + pTAS2557->mnErrCode |= ERROR_CLK_LOST; + dev_err(pTAS2557->dev, "DEVA clock lost!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_CLK_LOST; + + if (nDevInt2Status & 0x08) { + pTAS2557->mnErrCode |= ERROR_CLK_DET1; + dev_err(pTAS2557->dev, "DEVA clk detection 1!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_CLK_DET1; + + if (nDevInt2Status & 0x04) { + pTAS2557->mnErrCode |= ERROR_CLK_DET2; + dev_err(pTAS2557->dev, "DEVA clk detection 2!\n"); + } else + pTAS2557->mnErrCode &= ~ERROR_CLK_DET2; + + goto program; + } else { + dev_dbg(pTAS2557->dev, "IRQ Status: 0x%x, 0x%x\n", nDevInt1Status, nDevInt2Status); + nCounter = 2; + while (nCounter > 0) { + nResult = tas2557_dev_read(pTAS2557, TAS2557_POWER_UP_FLAG_REG, &nDevPowerUpFlag); + if (nResult < 0) + goto program; + if ((nDevPowerUpFlag & 0xc0) == 0xc0) + break; + nCounter--; + if (nCounter > 0) { + /* in case check pow status just after power on TAS2557 */ + dev_dbg(pTAS2557->dev, "PowSts: 0x%x, check again after 10ms\n", + nDevPowerUpFlag); + msleep(10); + } + } + if ((nDevPowerUpFlag & 0xc0) != 0xc0) { + dev_err(pTAS2557->dev, "%s, Critical ERROR B[%d]_P[%d]_R[%d]= 0x%x\n", + __func__, + TAS2557_BOOK_ID(TAS2557_POWER_UP_FLAG_REG), + TAS2557_PAGE_ID(TAS2557_POWER_UP_FLAG_REG), + TAS2557_PAGE_REG(TAS2557_POWER_UP_FLAG_REG), + nDevPowerUpFlag); + pTAS2557->mnErrCode |= ERROR_CLASSD_PWR; + goto program; + } + pTAS2557->mnErrCode &= ~ERROR_CLASSD_PWR; + + dev_dbg(pTAS2557->dev, "%s: INT1=0x%x, INT2=0x%x; PowerUpFlag=0x%x\n", + __func__, nDevInt1Status, nDevInt2Status, nDevPowerUpFlag); + goto end; + } + +program: + /* hardware reset and reload */ + tas2557_set_program(pTAS2557, pTAS2557->mnCurrentProgram, pTAS2557->mnCurrentConfiguration); + +end: + +#ifdef CONFIG_TAS2557_MISC + mutex_unlock(&pTAS2557->file_lock); +#endif + +#ifdef CONFIG_TAS2557_CODEC + mutex_unlock(&pTAS2557->codec_lock); +#endif +} + +static irqreturn_t tas2557_irq_handler(int irq, void *dev_id) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)dev_id; + + tas2557_enableIRQ(pTAS2557, false); + /* get IRQ status after 100 ms */ + schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(100)); + return IRQ_HANDLED; +} + +static enum hrtimer_restart temperature_timer_func(struct hrtimer *timer) +{ + struct tas2557_priv *pTAS2557 = container_of(timer, struct tas2557_priv, mtimer); + + if (pTAS2557->mbPowerUp) { + schedule_work(&pTAS2557->mtimerwork); + schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(1)); + } + return HRTIMER_NORESTART; +} + +static void timer_work_routine(struct work_struct *work) +{ + struct tas2557_priv *pTAS2557 = container_of(work, struct tas2557_priv, mtimerwork); + int nResult, nTemp, nActTemp; + struct TProgram *pProgram; + static int nAvg; + +#ifdef CONFIG_TAS2557_CODEC + mutex_lock(&pTAS2557->codec_lock); +#endif + +#ifdef CONFIG_TAS2557_MISC + mutex_lock(&pTAS2557->file_lock); +#endif + + if (pTAS2557->mbRuntimeSuspend) { + dev_info(pTAS2557->dev, "%s, Runtime Suspended\n", __func__); + goto end; + } + + if (!pTAS2557->mpFirmware->mnConfigurations) { + dev_info(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + goto end; + } + + pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); + if (!pTAS2557->mbPowerUp + || (pProgram->mnAppMode != TAS2557_APP_TUNINGMODE)) { + dev_info(pTAS2557->dev, "%s, pass, Pow=%d, program=%s\n", + __func__, pTAS2557->mbPowerUp, pProgram->mpName); + goto end; + } + + nResult = tas2557_get_die_temperature(pTAS2557, &nTemp); + if (nResult >= 0) { + nActTemp = (int)(nTemp >> 23); + dev_dbg(pTAS2557->dev, "Die=0x%x, degree=%d\n", nTemp, nActTemp); + if (!pTAS2557->mnDieTvReadCounter) + nAvg = 0; + pTAS2557->mnDieTvReadCounter++; + nAvg += nActTemp; + if (!(pTAS2557->mnDieTvReadCounter % LOW_TEMPERATURE_COUNTER)) { + nAvg /= LOW_TEMPERATURE_COUNTER; + dev_dbg(pTAS2557->dev, "check : avg=%d\n", nAvg); + if (nAvg < -6) { + /* if Die temperature is below -6 degree C */ + if (pTAS2557->mnDevCurrentGain != LOW_TEMPERATURE_GAIN) { + nResult = tas2557_set_DAC_gain(pTAS2557, LOW_TEMPERATURE_GAIN); + if (nResult < 0) + goto end; + pTAS2557->mnDevCurrentGain = LOW_TEMPERATURE_GAIN; + dev_dbg(pTAS2557->dev, "LOW Temp: set gain to %d\n", LOW_TEMPERATURE_GAIN); + } + } else if (nAvg > 5) { + /* if Die temperature is above 5 degree C */ + if (pTAS2557->mnDevCurrentGain != pTAS2557->mnDevGain) { + nResult = tas2557_set_DAC_gain(pTAS2557, pTAS2557->mnDevGain); + if (nResult < 0) + goto end; + pTAS2557->mnDevCurrentGain = pTAS2557->mnDevGain; + dev_dbg(pTAS2557->dev, "LOW Temp: set gain to original\n"); + } + } + nAvg = 0; + } + + if (pTAS2557->mbPowerUp) + hrtimer_start(&pTAS2557->mtimer, + ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); + } + +end: + +#ifdef CONFIG_TAS2557_MISC + mutex_unlock(&pTAS2557->file_lock); +#endif + +#ifdef CONFIG_TAS2557_CODEC + mutex_unlock(&pTAS2557->codec_lock); +#endif +} + +static int tas2557_runtime_suspend(struct tas2557_priv *pTAS2557) +{ + dev_dbg(pTAS2557->dev, "%s\n", __func__); + + pTAS2557->mbRuntimeSuspend = true; + + if (hrtimer_active(&pTAS2557->mtimer)) { + dev_dbg(pTAS2557->dev, "cancel die temp timer\n"); + hrtimer_cancel(&pTAS2557->mtimer); + } + if (work_pending(&pTAS2557->mtimerwork)) { + dev_dbg(pTAS2557->dev, "cancel timer work\n"); + cancel_work_sync(&pTAS2557->mtimerwork); + } + if (delayed_work_pending(&pTAS2557->irq_work)) { + dev_dbg(pTAS2557->dev, "cancel IRQ work\n"); + cancel_delayed_work_sync(&pTAS2557->irq_work); + } + + return 0; +} + +static int tas2557_runtime_resume(struct tas2557_priv *pTAS2557) +{ + struct TProgram *pProgram; + + dev_dbg(pTAS2557->dev, "%s\n", __func__); + if (!pTAS2557->mpFirmware->mpPrograms) { + dev_dbg(pTAS2557->dev, "%s, firmware not loaded\n", __func__); + goto end; + } + + if (pTAS2557->mnCurrentProgram >= pTAS2557->mpFirmware->mnPrograms) { + dev_err(pTAS2557->dev, "%s, firmware corrupted\n", __func__); + goto end; + } + + pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); + if (pTAS2557->mbPowerUp && (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE)) { + if (!hrtimer_active(&pTAS2557->mtimer)) { + dev_dbg(pTAS2557->dev, "%s, start Die Temp check timer\n", __func__); + pTAS2557->mnDieTvReadCounter = 0; + hrtimer_start(&pTAS2557->mtimer, + ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); + } + } + + pTAS2557->mbRuntimeSuspend = false; +end: + + return 0; +} + +static bool tas2557_volatile(struct device *pDev, unsigned int nRegister) +{ + return true; +} + +static bool tas2557_writeable(struct device *pDev, unsigned int nRegister) +{ + return true; +} + +static const struct regmap_config tas2557_i2c_regmap = { + .reg_bits = 8, + .val_bits = 8, + .writeable_reg = tas2557_writeable, + .volatile_reg = tas2557_volatile, + .cache_type = REGCACHE_NONE, + .max_register = 128, +}; + +/* tas2557_i2c_probe : +* platform dependent +* should implement hardware reset functionality +*/ +static int tas2557_i2c_probe(struct i2c_client *pClient, + const struct i2c_device_id *pID) +{ + struct tas2557_priv *pTAS2557; + int nResult = 0; + unsigned int nValue = 0; + const char *pFWName; + + dev_info(&pClient->dev, "%s enter\n", __func__); + + pTAS2557 = devm_kzalloc(&pClient->dev, sizeof(struct tas2557_priv), GFP_KERNEL); + if (!pTAS2557) { + nResult = -ENOMEM; + goto err; + } + + pTAS2557->dev = &pClient->dev; + i2c_set_clientdata(pClient, pTAS2557); + dev_set_drvdata(&pClient->dev, pTAS2557); + + pTAS2557->mpRegmap = devm_regmap_init_i2c(pClient, &tas2557_i2c_regmap); + if (IS_ERR(pTAS2557->mpRegmap)) { + nResult = PTR_ERR(pTAS2557->mpRegmap); + dev_err(&pClient->dev, "Failed to allocate register map: %d\n", + nResult); + goto err; + } + + if (pClient->dev.of_node) + tas2557_parse_dt(&pClient->dev, pTAS2557); + + if (gpio_is_valid(pTAS2557->mnResetGPIO)) { + nResult = gpio_request(pTAS2557->mnResetGPIO, "TAS2557-RESET"); + if (nResult < 0) { + dev_err(pTAS2557->dev, "%s: GPIO %d request error\n", + __func__, pTAS2557->mnResetGPIO); + goto err; + } + tas2557_hw_reset(pTAS2557); + } + + pTAS2557->read = tas2557_dev_read; + pTAS2557->write = tas2557_dev_write; + pTAS2557->bulk_read = tas2557_dev_bulk_read; + pTAS2557->bulk_write = tas2557_dev_bulk_write; + pTAS2557->update_bits = tas2557_dev_update_bits; + pTAS2557->enableIRQ = tas2557_enableIRQ; + pTAS2557->clearIRQ = tas2557_clearIRQ; + pTAS2557->set_config = tas2557_set_config; + pTAS2557->set_calibration = tas2557_set_calibration; + pTAS2557->hw_reset = tas2557_hw_reset; + pTAS2557->runtime_suspend = tas2557_runtime_suspend; + pTAS2557->runtime_resume = tas2557_runtime_resume; + pTAS2557->mnRestart = 0; + + mutex_init(&pTAS2557->dev_lock); + + /* Reset the chip */ + nResult = tas2557_dev_write(pTAS2557, TAS2557_SW_RESET_REG, 0x01); + if (nResult < 0) { + dev_err(&pClient->dev, "I2c fail, %d\n", nResult); + goto err; + } + + msleep(1); + { + + int i; + for(i =0; i<0x10; i++){ + tas2557_dev_read(pTAS2557, i, &nValue); + dev_err(pTAS2557->dev, "address:%x value: %x\n",i, nValue); + } + } + + /* Ti's original codes logic (which firmware binary selected) */ + tas2557_dev_read(pTAS2557, TAS2557_REV_PGID_REG, &nValue); + pTAS2557->mnPGID = nValue; + if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) { + dev_info(pTAS2557->dev, "PG2.1 Silicon found\n"); + pFWName = TAS2557_AAC_FW_NAME; + } else if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) { + dev_info(pTAS2557->dev, "PG1.0 Silicon found\n"); + pFWName = TAS2557_PG1P0_FW_NAME; + } else { + nResult = -ENOTSUPP; + dev_info(pTAS2557->dev, "unsupport Silicon 0x%x\n", pTAS2557->mnPGID); + goto err; + } + + /* Use our codecs logic to select Firmware binary */ + if (pTAS2557->mnSpkType == VENDOR_ID_GOER) + pFWName = TAS2557_GOER_FW_NAME; + else if (pTAS2557->mnSpkType == VENDOR_ID_AAC) + pFWName = TAS2557_AAC_FW_NAME; + else if (pTAS2557->mnSpkType == VENDOR_ID_SSI) + pFWName = TAS2557_SSI_FW_NAME; + else + pFWName = TAS2557_DEFAULT_FW_NAME; + + if (gpio_is_valid(pTAS2557->mnGpioINT)) { + nResult = gpio_request(pTAS2557->mnGpioINT, "TAS2557-IRQ"); + if (nResult < 0) { + dev_err(pTAS2557->dev, + "%s: GPIO %d request INT error\n", + __func__, pTAS2557->mnGpioINT); + goto err; + } + + gpio_direction_input(pTAS2557->mnGpioINT); + pTAS2557->mnIRQ = gpio_to_irq(pTAS2557->mnGpioINT); + dev_dbg(pTAS2557->dev, "irq = %d\n", pTAS2557->mnIRQ); + INIT_DELAYED_WORK(&pTAS2557->irq_work, irq_work_routine); + nResult = request_threaded_irq(pTAS2557->mnIRQ, tas2557_irq_handler, + NULL, IRQF_TRIGGER_HIGH | IRQF_ONESHOT, + pClient->name, pTAS2557); + if (nResult < 0) { + dev_err(pTAS2557->dev, + "request_irq failed, %d\n", nResult); + goto err; + } + disable_irq_nosync(pTAS2557->mnIRQ); + } + + pTAS2557->mpFirmware = devm_kzalloc(&pClient->dev, sizeof(struct TFirmware), GFP_KERNEL); + if (!pTAS2557->mpFirmware) { + nResult = -ENOMEM; + goto err; + } + + pTAS2557->mpCalFirmware = devm_kzalloc(&pClient->dev, sizeof(struct TFirmware), GFP_KERNEL); + if (!pTAS2557->mpCalFirmware) { + nResult = -ENOMEM; + goto err; + } + +#ifdef CONFIG_TAS2557_CODEC + mutex_init(&pTAS2557->codec_lock); + tas2557_register_codec(pTAS2557); +#endif + +#ifdef CONFIG_TAS2557_MISC + mutex_init(&pTAS2557->file_lock); + tas2557_register_misc(pTAS2557); +#endif + +#ifdef ENABLE_TILOAD + tiload_driver_init(pTAS2557); +#endif + dev_dbg(pTAS2557->dev, " firmware name %s\n", pFWName); + hrtimer_init(&pTAS2557->mtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + pTAS2557->mtimer.function = temperature_timer_func; + INIT_WORK(&pTAS2557->mtimerwork, timer_work_routine); + + nResult = request_firmware_nowait(THIS_MODULE, 1, pFWName, + pTAS2557->dev, GFP_KERNEL, pTAS2557, tas2557_fw_ready); + +err: + + return nResult; +} + +static int tas2557_i2c_remove(struct i2c_client *pClient) +{ + struct tas2557_priv *pTAS2557 = i2c_get_clientdata(pClient); + + dev_info(pTAS2557->dev, "%s\n", __func__); + +#ifdef CONFIG_TAS2557_CODEC + tas2557_deregister_codec(pTAS2557); + mutex_destroy(&pTAS2557->codec_lock); +#endif + +#ifdef CONFIG_TAS2557_MISC + tas2557_deregister_misc(pTAS2557); + mutex_destroy(&pTAS2557->file_lock); +#endif + + mutex_destroy(&pTAS2557->dev_lock); + return 0; +} + +static const struct i2c_device_id tas2557_i2c_id[] = { + {"tas2557", 0}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, tas2557_i2c_id); + +#if defined(CONFIG_OF) +static const struct of_device_id tas2557_of_match[] = { + {.compatible = "ti,tas2557"}, + {}, +}; + +MODULE_DEVICE_TABLE(of, tas2557_of_match); +#endif + +static struct i2c_driver tas2557_i2c_driver = { + .driver = { + .name = "tas2557", + .owner = THIS_MODULE, +#if defined(CONFIG_OF) + .of_match_table = of_match_ptr(tas2557_of_match), +#endif + }, + .probe = tas2557_i2c_probe, + .remove = tas2557_i2c_remove, + .id_table = tas2557_i2c_id, +}; + +module_i2c_driver(tas2557_i2c_driver); + +MODULE_AUTHOR("Texas Instruments Inc."); +MODULE_DESCRIPTION("TAS2557 I2C Smart Amplifier driver"); +MODULE_LICENSE("GPL v2"); + +#endif diff --git a/asoc/codecs/tas2557/tas2557.h b/asoc/codecs/tas2557/tas2557.h new file mode 100755 index 000000000000..e46bedc9fbab --- /dev/null +++ b/asoc/codecs/tas2557/tas2557.h @@ -0,0 +1,495 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tas2557.h +** +** Description: +** definitions and data structures for TAS2557 Android Linux driver +** +** ============================================================================= +*/ + +#ifndef _TAS2557_H +#define _TAS2557_H + +#include +#include +#include + +/* Page Control Register */ +#define TAS2557_PAGECTL_REG 0 + +/* Book Control Register (available in page0 of each book) */ +#define TAS2557_BOOKCTL_PAGE 0 +#define TAS2557_BOOKCTL_REG 127 + +/* 0000 0000 0BBB BBBB BPPP PPPP PRRR RRRR */ + +#define TAS2557_REG(book, page, reg) ((((unsigned int)book * 256 * 128) + \ + ((unsigned int)page * 128)) + reg) + +#define TAS2557_BOOK_ID(reg) ((unsigned char)(reg / (256 * 128))) +#define TAS2557_PAGE_ID(reg) ((unsigned char)((reg % (256 * 128)) / 128)) +#define TAS2557_BOOK_REG(reg) ((unsigned char)(reg % (256 * 128))) +#define TAS2557_PAGE_REG(reg) ((unsigned char)((reg % (256 * 128)) % 128)) + +/* Book0, Page0 registers */ +#define TAS2557_SW_RESET_REG TAS2557_REG(0, 0, 1) + +#define TAS2557_REV_PGID_REG TAS2557_REG(0, 0, 3) +#define TAS2557_PG_VERSION_1P0 0x80 +#define TAS2557_PG_VERSION_2P0 0x90 +#define TAS2557_PG_VERSION_2P1 0xa0 + +#define TAS2557_POWER_CTRL1_REG TAS2557_REG(0, 0, 4) +#define TAS2557_POWER_CTRL2_REG TAS2557_REG(0, 0, 5) + +#define TAS2557_SPK_CTRL_REG TAS2557_REG(0, 0, 6) +/* B0P0R6 - TAS2557_SPK_CTRL_REG */ +#define TAS2557_DAC_GAIN_MASK (0xf << 3) +#define TAS2557_DAC_GAIN_SHIFT 0x03 + +#define TAS2557_MUTE_REG TAS2557_REG(0, 0, 7) +#define TAS2557_SNS_CTRL_REG TAS2557_REG(0, 0, 8) +#define TAS2557_ADC_INPUT_SEL_REG TAS2557_REG(0, 0, 9) +#define TAS2557_DBOOST_CTL_REG TAS2557_REG(0, 0, 10) +#define TAS2557_NONAME11_REG TAS2557_REG(0, 0, 11) +#define TAS2557_NONAME12_REG TAS2557_REG(0, 0, 12) +#define TAS2557_NONAME13_REG TAS2557_REG(0, 0, 13) +#define TAS2557_NONAME14_REG TAS2557_REG(0, 0, 14) +#define TAS2557_NONAME15_REG TAS2557_REG(0, 0, 15) +#define TAS2557_NONAME16_REG TAS2557_REG(0, 0, 16) +#define TAS2557_NONAME17_REG TAS2557_REG(0, 0, 17) +#define TAS2557_NONAME18_REG TAS2557_REG(0, 0, 18) +#define TAS2557_SAR_SAMPLING_TIME_REG TAS2557_REG(0, 0, 19) +#define TAS2557_SAR_ADC1_REG TAS2557_REG(0, 0, 20) +#define TAS2557_SAR_ADC2_REG TAS2557_REG(0, 0, 21) /* B0_P0_R0x15*/ +#define TAS2557_CRC_CHECKSUM_REG TAS2557_REG(0, 0, 32) +#define TAS2557_CRC_RESET_REG TAS2557_REG(0, 0, 33) +#define TAS2557_DSP_MODE_SELECT_REG TAS2557_REG(0, 0, 34) +#define TAS2557_SAFE_GUARD_REG TAS2557_REG(0, 0, 37) +#define TAS2557_ASI_CTL1_REG TAS2557_REG(0, 0, 42) +#define TAS2557_CLK_ERR_CTRL TAS2557_REG(0, 0, 44) /* B0_P0_R0x2c*/ +#define TAS2557_CLK_ERR_CTRL2 TAS2557_REG(0, 0, 45) /* B0_P0_R0x2d*/ +#define TAS2557_CLK_ERR_CTRL3 TAS2557_REG(0, 0, 46) /* B0_P0_R0x2e*/ +#define TAS2557_DBOOST_CFG_REG TAS2557_REG(0, 0, 52) +#define TAS2557_POWER_UP_FLAG_REG TAS2557_REG(0, 0, 100) +#define TAS2557_FLAGS_1 TAS2557_REG(0, 0, 104) /* B0_P0_R0x68*/ +#define TAS2557_FLAGS_2 TAS2557_REG(0, 0, 108) /* B0_P0_R0x6c*/ + +/* Book0, Page1 registers */ +#define TAS2557_ASI1_DAC_FORMAT_REG TAS2557_REG(0, 1, 1) +#define TAS2557_ASI1_ADC_FORMAT_REG TAS2557_REG(0, 1, 2) +#define TAS2557_ASI1_OFFSET1_REG TAS2557_REG(0, 1, 3) +#define TAS2557_ASI1_ADC_PATH_REG TAS2557_REG(0, 1, 7) +#define TAS2557_ASI1_DAC_BCLK_REG TAS2557_REG(0, 1, 8) +#define TAS2557_ASI1_DAC_WCLK_REG TAS2557_REG(0, 1, 9) +#define TAS2557_ASI1_ADC_BCLK_REG TAS2557_REG(0, 1, 10) +#define TAS2557_ASI1_ADC_WCLK_REG TAS2557_REG(0, 1, 11) +#define TAS2557_ASI1_DIN_DOUT_MUX_REG TAS2557_REG(0, 1, 12) +#define TAS2557_ASI1_BDIV_CLK_SEL_REG TAS2557_REG(0, 1, 13) +#define TAS2557_ASI1_BDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 14) +#define TAS2557_ASI1_WDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 15) +#define TAS2557_ASI1_DAC_CLKOUT_REG TAS2557_REG(0, 1, 16) +#define TAS2557_ASI1_ADC_CLKOUT_REG TAS2557_REG(0, 1, 17) +#define TAS2557_ASI2_DAC_FORMAT_REG TAS2557_REG(0, 1, 21) +#define TAS2557_ASI2_ADC_FORMAT_REG TAS2557_REG(0, 1, 22) +#define TAS2557_ASI2_OFFSET1_REG TAS2557_REG(0, 1, 23) +#define TAS2557_ASI2_ADC_PATH_REG TAS2557_REG(0, 1, 27) +#define TAS2557_ASI2_DAC_BCLK_REG TAS2557_REG(0, 1, 28) +#define TAS2557_ASI2_DAC_WCLK_REG TAS2557_REG(0, 1, 29) +#define TAS2557_ASI2_ADC_BCLK_REG TAS2557_REG(0, 1, 30) +#define TAS2557_ASI2_ADC_WCLK_REG TAS2557_REG(0, 1, 31) +#define TAS2557_ASI2_DIN_DOUT_MUX_REG TAS2557_REG(0, 1, 32) +#define TAS2557_ASI2_BDIV_CLK_SEL_REG TAS2557_REG(0, 1, 33) +#define TAS2557_ASI2_BDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 34) +#define TAS2557_ASI2_WDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 35) +#define TAS2557_ASI2_DAC_CLKOUT_REG TAS2557_REG(0, 1, 36) +#define TAS2557_ASI2_ADC_CLKOUT_REG TAS2557_REG(0, 1, 37) +#define TAS2557_GPIO1_PIN_REG TAS2557_REG(0, 1, 61) /*B0_P1_R0x3d */ +#define TAS2557_GPIO2_PIN_REG TAS2557_REG(0, 1, 62) /*B0_P1_R0x3e */ +#define TAS2557_GPIO3_PIN_REG TAS2557_REG(0, 1, 63) /*B0_P1_R0x3f */ +#define TAS2557_GPIO4_PIN_REG TAS2557_REG(0, 1, 64) /*B0_P1_R0x40 */ +#define TAS2557_GPIO5_PIN_REG TAS2557_REG(0, 1, 65) +#define TAS2557_GPIO6_PIN_REG TAS2557_REG(0, 1, 66) +#define TAS2557_GPIO7_PIN_REG TAS2557_REG(0, 1, 67) +#define TAS2557_GPIO8_PIN_REG TAS2557_REG(0, 1, 68) +#define TAS2557_GPIO9_PIN_REG TAS2557_REG(0, 1, 69) +#define TAS2557_GPIO10_PIN_REG TAS2557_REG(0, 1, 70) +#define TAS2557_GPI_PIN_REG TAS2557_REG(0, 1, 77) /*B0_P1_R0x4d */ +#define TAS2557_GPIO_HIZ_CTRL1_REG TAS2557_REG(0, 1, 79) +#define TAS2557_GPIO_HIZ_CTRL2_REG TAS2557_REG(0, 1, 80) /*B0_P1_R0x50 */ +#define TAS2557_GPIO_HIZ_CTRL3_REG TAS2557_REG(0, 1, 81) +#define TAS2557_GPIO_HIZ_CTRL4_REG TAS2557_REG(0, 1, 82) +#define TAS2557_GPIO_HIZ_CTRL5_REG TAS2557_REG(0, 1, 83) +#define TAS2557_BIT_BANG_CTRL_REG TAS2557_REG(0, 1, 87) +#define TAS2557_BIT_BANG_OUT1_REG TAS2557_REG(0, 1, 88) +#define TAS2557_BIT_BANG_OUT2_REG TAS2557_REG(0, 1, 89) +#define TAS2557_BIT_BANG_IN1_REG TAS2557_REG(0, 1, 90) +#define TAS2557_BIT_BANG_IN2_REG TAS2557_REG(0, 1, 91) +#define TAS2557_BIT_BANG_IN3_REG TAS2557_REG(0, 1, 92) +#define TAS2557_PDM_IN_CLK_REG TAS2557_REG(0, 1, 94) +#define TAS2557_PDM_IN_PIN_REG TAS2557_REG(0, 1, 95) +#define TAS2557_ASIM_IFACE1_REG TAS2557_REG(0, 1, 98) +#define TAS2557_ASIM_FORMAT_REG TAS2557_REG(0, 1, 99) +#define TAS2557_ASIM_IFACE3_REG TAS2557_REG(0, 1, 100) +#define TAS2557_ASIM_IFACE4_REG TAS2557_REG(0, 1, 101) +#define TAS2557_ASIM_IFACE5_REG TAS2557_REG(0, 1, 102) +#define TAS2557_ASIM_IFACE6_REG TAS2557_REG(0, 1, 103) +#define TAS2557_ASIM_IFACE7_REG TAS2557_REG(0, 1, 104) +#define TAS2557_ASIM_IFACE8_REG TAS2557_REG(0, 1, 105) +#define TAS2557_CLK_HALT_REG TAS2557_REG(0, 1, 106) /* B0_P1_R0x6a */ +#define TAS2557_INT_GEN1_REG TAS2557_REG(0, 1, 108) /* B0_P1_R0x6c */ +#define TAS2557_INT_GEN2_REG TAS2557_REG(0, 1, 109) /* B0_P1_R0x6d */ +#define TAS2557_INT_GEN3_REG TAS2557_REG(0, 1, 110) /* B0_P1_R0x6e */ +#define TAS2557_INT_GEN4_REG TAS2557_REG(0, 1, 111) /* B0_P1_R0x6f */ +#define TAS2557_INT_MODE_REG TAS2557_REG(0, 1, 114) /* B0_P1_R0x72 */ +#define TAS2557_MAIN_CLKIN_REG TAS2557_REG(0, 1, 115) +#define TAS2557_PLL_CLKIN_REG TAS2557_REG(0, 1, 116) +#define TAS2557_CLKOUT_MUX_REG TAS2557_REG(0, 1, 117) +#define TAS2557_CLKOUT_CDIV_REG TAS2557_REG(0, 1, 118) +#define TAS2557_HACK_GP01_REG TAS2557_REG(0, 1, 122) + +#define TAS2557_HACK01_REG TAS2557_REG(0, 2, 10) + +#define TAS2557_ISENSE_THRESHOLD TAS2557_REG(0, 50, 104) +#define TAS2557_BOOSTON_EFFICIENCY TAS2557_REG(0, 51, 16) +#define TAS2557_BOOSTOFF_EFFICIENCY TAS2557_REG(0, 51, 20) +#define TAS2557_BOOST_HEADROOM TAS2557_REG(0, 51, 24) +#define TAS2557_THERMAL_FOLDBACK_REG TAS2557_REG(0, 51, 100) + +#define TAS2557_SA_PG2P1_CHL_CTRL_REG TAS2557_REG(0, 53, 20) /* B0_P0x35_R0x14 */ +#define TAS2557_SA_COEFF_SWAP_REG TAS2557_REG(0, 53, 44) /* B0_P0x35_R0x2c */ + +#define TAS2557_SA_PG1P0_CHL_CTRL_REG TAS2557_REG(0, 58, 120) /* B0_P0x3a_R0x78 */ + +#define TAS2557_TEST_MODE_REG TAS2557_REG(0, 253, 13) /* B0_P0xfd_R0x0d */ +#define TAS2557_BROADCAST_REG TAS2557_REG(0, 253, 54) /* B0_P0xfd_R0x36 */ +#define TAS2557_CRYPTIC_REG TAS2557_REG(0, 253, 71) +#define TAS2557_PG2P1_CALI_R0_REG TAS2557_REG(0x8c, 0x2f, 0x40) +#define TAS2557_PG1P0_CALI_R0_REG TAS2557_REG(0x8c, 0x2f, 0x28) +#define TAS2557_PG2P1_CALI_T_REG TAS2557_REG(0x8c, 0x30, 0x20) +#define TAS2557_PG1P0_CALI_T_REG TAS2557_REG(0x8c, 0x30, 0x08) + +#define TAS2557_DAC_INTERPOL_REG TAS2557_REG(100, 0, 1) +#define TAS2557_SOFT_MUTE_REG TAS2557_REG(100, 0, 7) +#define TAS2557_PLL_P_VAL_REG TAS2557_REG(100, 0, 27) +#define TAS2557_PLL_J_VAL_REG TAS2557_REG(100, 0, 28) +#define TAS2557_PLL_D_VAL_MSB_REG TAS2557_REG(100, 0, 29) +#define TAS2557_PLL_D_VAL_LSB_REG TAS2557_REG(100, 0, 30) +#define TAS2557_CLK_MISC_REG TAS2557_REG(100, 0, 31) +#define TAS2557_PLL_N_VAL_REG TAS2557_REG(100, 0, 32) +#define TAS2557_DAC_MADC_VAL_REG TAS2557_REG(100, 0, 33) +#define TAS2557_ISENSE_DIV_REG TAS2557_REG(100, 0, 42) +#define TAS2557_RAMP_CLK_DIV_MSB_REG TAS2557_REG(100, 0, 43) +#define TAS2557_RAMP_CLK_DIV_LSB_REG TAS2557_REG(100, 0, 44) + +#define TAS2557_DIE_TEMP_REG TAS2557_REG(130, 2, 124) /* B0x82_P0x02_R0x7C */ + +/* Bits */ +/* B0P0R4 - TAS2557_POWER_CTRL1_REG */ +#define TAS2557_SW_SHUTDOWN (0x1 << 0) +#define TAS2557_MADC_POWER_UP (0x1 << 3) +#define TAS2557_MDAC_POWER_UP (0x1 << 4) +#define TAS2557_NDIV_POWER_UP (0x1 << 5) +#define TAS2557_PLL_POWER_UP (0x1 << 6) +#define TAS2557_DSP_POWER_UP (0x1 << 7) + +/* B0P0R5 - TAS2557_POWER_CTRL2_REG */ +#define TAS2557_VSENSE_ENABLE (0x1 << 0) +#define TAS2557_ISENSE_ENABLE (0x1 << 1) +#define TAS2557_BOOST_ENABLE (0x1 << 5) +#define TAS2557_CLASSD_ENABLE (0x1 << 7) + +/* B0P0R7 - TAS2557_MUTE_REG */ +#define TAS2557_CLASSD_MUTE (0x1 << 0) +#define TAS2557_ISENSE_MUTE (0x1 << 1) + +/* B0P253R13 - TAS2557_TEST_MODE_REG */ +#define TAS2557_TEST_MODE_ENABLE (13) +#define TAS2557_TEST_MODE_MASK (0xf << 0) + +/* B0P253R71 - TAS2557_CRYPTIC_REG */ +#define TAS2557_OSC_TRIM_CAP(x) ((x & 0x3f) << 0) +#define TAS2557_DISABLE_ENCRYPTION (0x1 << 6) +#define TAS2557_SL_COMP (0x1 << 7) + +/* B0P1R115/6 - TAS2557_MAIN/PLL_CLKIN_REG */ +#define TAS2557_XXX_CLKIN_GPIO1 (0) +#define TAS2557_XXX_CLKIN_GPIO2 (1) +#define TAS2557_XXX_CLKIN_GPIO3 (2) +#define TAS2557_XXX_CLKIN_GPIO4 (3) +#define TAS2557_XXX_CLKIN_GPIO5 (4) +#define TAS2557_XXX_CLKIN_GPIO6 (5) +#define TAS2557_XXX_CLKIN_GPIO7 (6) +#define TAS2557_XXX_CLKIN_GPIO8 (7) +#define TAS2557_XXX_CLKIN_GPIO9 (8) +#define TAS2557_XXX_CLKIN_GPIO10 (9) +#define TAS2557_XXX_CLKIN_GPI1 (12) +#define TAS2557_XXX_CLKIN_GPI2 (13) +#define TAS2557_XXX_CLKIN_GPI3 (14) +#define TAS2557_NDIV_CLKIN_PLL (15) +#define TAS2557_PLL_CLKIN_INT_OSC (15) + +#define TAS2557_MCLK_CLKIN_SRC_GPIO1 (0) +#define TAS2557_MCLK_CLKIN_SRC_GPIO2 (1) +#define TAS2557_MCLK_CLKIN_SRC_GPIO3 (2) +#define TAS2557_MCLK_CLKIN_SRC_GPIO4 (3) +#define TAS2557_MCLK_CLKIN_SRC_GPIO5 (4) +#define TAS2557_MCLK_CLKIN_SRC_GPIO6 (5) +#define TAS2557_MCLK_CLKIN_SRC_GPIO7 (6) +#define TAS2557_MCLK_CLKIN_SRC_GPIO8 (7) +#define TAS2557_MCLK_CLKIN_SRC_GPIO9 (8) +#define TAS2557_MCLK_CLKIN_SRC_GPIO10 (9) +#define TAS2557_MCLK_CLKIN_SRC_GPI1 (12) +#define TAS2557_MCLK_CLKIN_SRC_GPI2 (13) +#define TAS2557_MCLK_CLKIN_SRC_GPI3 (14) + +#define TAS2557_FORMAT_I2S (0x0 << 5) +#define TAS2557_FORMAT_DSP (0x1 << 5) +#define TAS2557_FORMAT_RIGHT_J (0x2 << 5) +#define TAS2557_FORMAT_LEFT_J (0x3 << 5) +#define TAS2557_FORMAT_MONO_PCM (0x4 << 5) +#define TAS2557_FORMAT_MASK (0x7 << 5) + +#define TAS2557_WORDLENGTH_16BIT (0x0 << 3) +#define TAS2557_WORDLENGTH_20BIT (0x1 << 3) +#define TAS2557_WORDLENGTH_24BIT (0x2 << 3) +#define TAS2557_WORDLENGTH_32BIT (0x3 << 3) +#define TAS2557_WORDLENGTH_MASK TAS2557_WORDLENGTH_32BIT + +/* B100P0R7 - TAS2557_SOFT_MUTE_REG */ +#define TAS2557_PDM_SOFT_MUTE (0x1 << 0) +#define TAS2557_VSENSE_SOFT_MUTE (0x1 << 1) +#define TAS2557_ISENSE_SOFT_MUTE (0x1 << 2) +#define TAS2557_CLASSD_SOFT_MUTE (0x1 << 3) + +/* B100P0R27 - TAS2557_PLL_P_VAL_REG */ +#define TAS2557_PLL_P_VAL_MASK (0x3f << 0) + +/* B100P0R28 - TAS2557_PLL_J_VAL_REG */ +#define TAS2557_PLL_J_VAL_MASK ((unsigned int) (0x7f << 0)) +#define TAS2557_PLL_J_VAL_MASKX 0x00 + +/* B100P0R29-30 - TAS2557_PLL_D_VAL_MSB/LSB_REG */ +#define TAS2557_PLL_D_MSB_VAL(x) ((x >> 8) & 0x3f) +#define TAS2557_PLL_D_LSB_VAL(x) (x & 0xff) + +/* B100P0R31 - TAS2557_CLK_MISC_REG */ +#define TAS2557_DSP_CLK_FROM_PLL (0x1 << 5) + +#define TAS2557_AAC_FW_NAME "tas2557_uCDSP_aac.bin" +#define TAS2557_GOER_FW_NAME "tas2557_uCDSP_goer.bin" +#define TAS2557_SSI_FW_NAME "tas2557_uCDSP_ssi.bin" +#define TAS2557_DEFAULT_FW_NAME "tas2557_uCDSP.bin" + +#define TAS2557_PG1P0_FW_NAME "tas2557_pg1p0_uCDSP.bin" + +#define TAS2557_APP_ROM1MODE 0 +#define TAS2557_APP_ROM2MODE 1 +#define TAS2557_APP_TUNINGMODE 2 +#define TAS2557_APP_ROM1_96KHZ 3 +#define TAS2557_APP_ROM2_96KHZ 4 +#define TAS2557_APP_RAMMODE 5 + +#define TAS2557_BOOST_OFF 0 +#define TAS2557_BOOST_DEVA 1 +#define TAS2557_BOOST_DEVB 2 +#define TAS2557_BOOST_BOTH 3 + +#define ERROR_NONE 0x00000000 +#define ERROR_PLL_ABSENT 0x00000001 +#define ERROR_DEVA_I2C_COMM 0x00000002 +#define ERROR_PRAM_CRCCHK 0x00000008 +#define ERROR_YRAM_CRCCHK 0x00000010 +#define ERROR_CLK_DET2 0x00000020 +#define ERROR_CLK_DET1 0x00000040 +#define ERROR_CLK_LOST 0x00000080 +#define ERROR_BROWNOUT 0x00000100 +#define ERROR_DIE_OVERTEMP 0x00000200 +#define ERROR_CLK_HALT 0x00000400 +#define ERROR_UNDER_VOLTAGE 0x00000800 +#define ERROR_OVER_CURRENT 0x00001000 +#define ERROR_CLASSD_PWR 0x00002000 +#define ERROR_SAFE_GUARD 0x00004000 +#define ERROR_FAILSAFE 0x40000000 + +struct TBlock { + unsigned int mnType; + unsigned char mbPChkSumPresent; + unsigned char mnPChkSum; + unsigned char mbYChkSumPresent; + unsigned char mnYChkSum; + unsigned int mnCommands; + unsigned char *mpData; +}; + +struct TData { + char mpName[64]; + char *mpDescription; + unsigned int mnBlocks; + struct TBlock *mpBlocks; +}; + +struct TProgram { + char mpName[64]; + char *mpDescription; + unsigned char mnAppMode; + unsigned short mnBoost; + struct TData mData; +}; + +struct TPLL { + char mpName[64]; + char *mpDescription; + struct TBlock mBlock; +}; + +struct TConfiguration { + char mpName[64]; + char *mpDescription; + unsigned int mnDevices; + unsigned int mnProgram; + unsigned int mnPLL; + unsigned int mnSamplingRate; + unsigned char mnPLLSrc; + unsigned int mnPLLSrcRate; + struct TData mData; +}; + +struct TCalibration { + char mpName[64]; + char *mpDescription; + unsigned int mnProgram; + unsigned int mnConfiguration; + struct TData mData; +}; + +struct TFirmware { + unsigned int mnFWSize; + unsigned int mnChecksum; + unsigned int mnPPCVersion; + unsigned int mnFWVersion; + unsigned int mnDriverVersion; + unsigned int mnTimeStamp; + char mpDDCName[64]; + char *mpDescription; + unsigned int mnDeviceFamily; + unsigned int mnDevice; + unsigned int mnPLLs; + struct TPLL *mpPLLs; + unsigned int mnPrograms; + struct TProgram *mpPrograms; + unsigned int mnConfigurations; + struct TConfiguration *mpConfigurations; + unsigned int mnCalibrations; + struct TCalibration *mpCalibrations; +}; + +struct tas2557_register { + int book; + int page; + int reg; +}; + +struct tas2557_priv { + struct device *dev; + struct regmap *mpRegmap; + int mnPGID; + int mnResetGPIO; + struct mutex dev_lock; + struct TFirmware *mpFirmware; + struct TFirmware *mpCalFirmware; + unsigned int mnCurrentProgram; + unsigned int mnCurrentSampleRate; + unsigned int mnNewConfiguration; + unsigned int mnCurrentConfiguration; + unsigned int mnCurrentCalibration; + unsigned char mnCurrentBook; + unsigned char mnCurrentPage; + bool mbTILoadActive; + bool mbPowerUp; + bool mbMute; + bool mbLoadConfigurationPrePowerUp; + bool mbLoadCalibrationPostPowerUp; + bool mbCalibrationLoaded; + int (*read)(struct tas2557_priv *pTAS2557, + unsigned int reg, + unsigned int *pValue); + int (*write)(struct tas2557_priv *pTAS2557, + unsigned int reg, + unsigned int Value); + int (*bulk_read)(struct tas2557_priv *pTAS2557, + unsigned int reg, + unsigned char *pData, + unsigned int len); + int (*bulk_write)(struct tas2557_priv *pTAS2557, + unsigned int reg, + unsigned char *pData, + unsigned int len); + int (*update_bits)(struct tas2557_priv *pTAS2557, + unsigned int reg, + unsigned int mask, + unsigned int value); + int (*set_config)(struct tas2557_priv *pTAS2557, + int config); + int (*set_calibration)(struct tas2557_priv *pTAS2557, + int calibration); + void (*clearIRQ)(struct tas2557_priv *pTAS2557); + void (*enableIRQ)(struct tas2557_priv *pTAS2557, bool enable); + void (*hw_reset)(struct tas2557_priv *pTAS2557); + /* device is working, but system is suspended */ + int (*runtime_suspend)(struct tas2557_priv *pTAS2557); + int (*runtime_resume)(struct tas2557_priv *pTAS2557); + + int mnGpioINT; + struct delayed_work irq_work; + unsigned int mnIRQ; + bool mbIRQEnable; + unsigned char mnI2SBits; + + + /* for low temperature check */ + unsigned int mnDevGain; + unsigned int mnDevCurrentGain; + unsigned int mnDieTvReadCounter; + struct hrtimer mtimer; + struct work_struct mtimerwork; + + /* device is working, but system is suspended */ + bool mbRuntimeSuspend; + + unsigned int mnErrCode; + unsigned int mnRestart; + + /* for configurations with maximum TLimit 0x7fffffff, + * bypass calibration update, usually used in factory test + */ + bool mbBypassTMax; + +#ifdef CONFIG_TAS2557_CODEC + struct mutex codec_lock; +#endif + +#ifdef CONFIG_TAS2557_MISC + int mnDBGCmd; + int mnCurrentReg; + struct mutex file_lock; +#endif + int mnSpkType; + struct device_node *spk_id_gpio_p; + + +}; + +#endif /* _TAS2557_H */ diff --git a/asoc/codecs/tas2557/tiload.c b/asoc/codecs/tas2557/tiload.c new file mode 100755 index 000000000000..4cf0ddfa1879 --- /dev/null +++ b/asoc/codecs/tas2557/tiload.c @@ -0,0 +1,428 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tiload.c +** +** Description: +** utility for TAS2557 Android in-system tuning +** +** ============================================================================= +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tiload.h" + +/* enable debug prints in the driver */ +#define DEBUG + +static struct cdev *tiload_cdev; +static int tiload_major; /* Dynamic allocation of Mjr No. */ +static int tiload_opened; /* Dynamic allocation of Mjr No. */ +static struct tas2557_priv *g_TAS2557; +struct class *tiload_class; +static unsigned int magic_num; + +static char gPage; +static char gBook; +/******************************** Debug section *****************************/ + + +/*---------------------------------------------------------------------------- + * Function : tiload_open + * + * Purpose : open method for tiload programming interface + *---------------------------------------------------------------------------- + */ +static int tiload_open(struct inode *in, struct file *filp) +{ + struct tas2557_priv *pTAS2557 = g_TAS2557; + + dev_info(pTAS2557->dev, "%s\n", __func__); + + if (tiload_opened) { + dev_info(pTAS2557->dev, "%s device is already opened\n", "tiload"); + return -EINVAL; + } + filp->private_data = (void *)pTAS2557; + tiload_opened++; + return 0; +} + +/*---------------------------------------------------------------------------- + * Function : tiload_release + * + * Purpose : close method for tiload programming interface + *---------------------------------------------------------------------------- + */ +static int tiload_release(struct inode *in, struct file *filp) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; + + dev_info(pTAS2557->dev, "%s\n", __func__); + filp->private_data = NULL; + tiload_opened--; + return 0; +} + +#define MAX_LENGTH 128 +/*---------------------------------------------------------------------------- + * Function : tiload_read + * + * Purpose : read from codec + *---------------------------------------------------------------------------- + */ +static ssize_t tiload_read(struct file *filp, char __user *buf, + size_t count, loff_t *offset) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; + char *rd_data; + unsigned int nCompositeRegister = 0, Value = 0; + char reg_addr; + size_t size; + int ret = 0; +#ifdef DEBUG + /* int i; */ +#endif + + dev_info(pTAS2557->dev, "%s\n", __func__); + if (count > MAX_LENGTH) { + dev_err(pTAS2557->dev, "Max %d bytes can be read\n", MAX_LENGTH); + return -EINVAL; + } + + /* copy register address from user space */ + size = copy_from_user(®_addr, buf, 1); + if (size != 0) { + dev_err(pTAS2557->dev, "read: copy_from_user failure\n"); + return -EINVAL; + } + + size = count; + + rd_data = kmalloc(MAX_LENGTH + 1, GFP_KERNEL | GFP_DMA); + + if(rd_data == NULL) { + dev_err(pTAS2557->dev, "kmalloc fail \n"); + return -EINVAL; + } + + nCompositeRegister = BPR_REG(gBook, gPage, reg_addr); + if (count == 1) { + ret = + pTAS2557->read(pTAS2557, 0x80000000 | nCompositeRegister, &Value); + if (ret >= 0) + rd_data[0] = (char) Value; + } else if (count > 1) { + ret = + pTAS2557->bulk_read(pTAS2557, 0x80000000 | nCompositeRegister, + rd_data, size); + } + if (ret < 0) + dev_err(pTAS2557->dev, "%s, %d, ret=%d, count=%zu error happen!\n", + __func__, __LINE__, ret, count); + +#ifdef DEBUG + dev_info(pTAS2557->dev, "read size = %d, reg_addr= %x , count = %d\n", + (int) size, reg_addr, (int) count); +/* for (i = 0; i < (int) size; i++) { +* dev_dbg(pTAS2557->dev, "rd_data[%d]=%x\n", i, rd_data[i]); +* } +*/ +#endif + if (size != count) + dev_err(pTAS2557->dev, "read %d registers from the codec\n", (int) size); + + if (copy_to_user(buf, rd_data, size) != 0) { + dev_err(pTAS2557->dev, "copy_to_user failed\n"); + kfree(rd_data); + return -EINVAL; + } + + kfree(rd_data); + return size; +} + +/* + *---------------------------------------------------------------------------- + * Function : tiload_write + * + * Purpose : write to codec + *---------------------------------------------------------------------------- + */ +static ssize_t tiload_write(struct file *filp, const char __user *buf, + size_t count, loff_t *offset) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; + char *wr_data; + char *pData; + size_t size; + unsigned int nCompositeRegister = 0; + unsigned int nRegister; + int ret = 0; +#ifdef DEBUG + /* int i; */ +#endif + dev_info(pTAS2557->dev, "%s\n", __func__); + + if (count > MAX_LENGTH) { + dev_err(pTAS2557->dev, "Max %d bytes can be read\n", MAX_LENGTH); + return -EINVAL; + } + + wr_data = kmalloc(MAX_LENGTH + 1, GFP_KERNEL | GFP_DMA); + if(wr_data == NULL) { + dev_err(pTAS2557->dev, "kmalloc fail \n"); + return -EINVAL; + } + pData = wr_data; + + /* copy buffer from user space */ + size = copy_from_user(wr_data, buf, count); + if (size != 0) { + dev_err(pTAS2557->dev, "copy_from_user failure %d\n", (int) size); + kfree(wr_data); + return -EINVAL; + } +#ifdef DEBUG + dev_info(pTAS2557->dev, "write size = %zu\n", count); +/* for (i = 0; i < (int) count; i++) { +* dev_info(pTAS2557->dev, "wr_data[%d]=%x\n", i, wr_data[i]); +* } +*/ +#endif + nRegister = wr_data[0]; + size = count; + if ((nRegister == 127) && (gPage == 0)) { + gBook = wr_data[1]; + kfree(wr_data); + return size; + } + + if (nRegister == 0) { + gPage = wr_data[1]; + pData++; + count--; + } + + nCompositeRegister = BPR_REG(gBook, gPage, nRegister); + if (count == 2) { + ret = + pTAS2557->write(pTAS2557, 0x80000000 | nCompositeRegister, + pData[1]); + } else if (count > 2) { + ret = + pTAS2557->bulk_write(pTAS2557, 0x80000000 | nCompositeRegister, + &pData[1], count - 1); + } + + if (ret < 0) + dev_err(pTAS2557->dev, "%s, %d, ret=%d, count=%zu, ERROR Happen\n", __func__, + __LINE__, ret, count); + kfree(wr_data); + return size; +} + +static void tiload_route_IO(struct tas2557_priv *pTAS2557, unsigned int bLock) +{ + if (bLock) + pTAS2557->write(pTAS2557, 0xAFFEAFFE, 0xBABEBABE); + else + pTAS2557->write(pTAS2557, 0xBABEBABE, 0xAFFEAFFE); +} + +static long tiload_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; + long num = 0; + void __user *argp = (void __user *) arg; + int val; + struct BPR bpr; + + dev_info(pTAS2557->dev, "%s, cmd=0x%x\n", __func__, cmd); +/* if (_IOC_TYPE(cmd) != TILOAD_IOC_MAGIC) + * return -ENOTTY; + */ + + switch (cmd) { + case TILOAD_IOMAGICNUM_GET: + num = copy_to_user(argp, &magic_num, sizeof(int)); + break; + case TILOAD_IOMAGICNUM_SET: + num = copy_from_user(&magic_num, argp, sizeof(int)); + dev_info(pTAS2557->dev, "TILOAD_IOMAGICNUM_SET\n"); + tiload_route_IO(pTAS2557, magic_num); + break; + case TILOAD_BPR_READ: + break; + case TILOAD_BPR_WRITE: + num = copy_from_user(&bpr, argp, sizeof(struct BPR)); + dev_info(pTAS2557->dev, "TILOAD_BPR_WRITE: 0x%02X, 0x%02X, 0x%02X\n\r", bpr.nBook, + bpr.nPage, bpr.nRegister); + break; + case TILOAD_IOCTL_SET_CHL: + break; + case TILOAD_IOCTL_SET_CONFIG: + num = copy_from_user(&val, argp, sizeof(val)); + pTAS2557->set_config(pTAS2557, val); + break; + case TILOAD_IOCTL_SET_CALIBRATION: + num = copy_from_user(&val, argp, sizeof(val)); + pTAS2557->set_calibration(pTAS2557, val); + break; + default: + break; + } + return num; +} + +#ifdef CONFIG_COMPAT +static long tiload_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; + long nResult = 0; + + switch (cmd) { + case TILOAD_COMPAT_IOMAGICNUM_GET: + dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOMAGICNUM_GET=0x%x\n", + __func__, cmd); + nResult = tiload_ioctl(filp, TILOAD_IOMAGICNUM_GET, + (unsigned long) compat_ptr(arg)); + break; + + case TILOAD_COMPAT_IOMAGICNUM_SET: + dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOMAGICNUM_SET=0x%x\n", + __func__, cmd); + nResult = tiload_ioctl(filp, TILOAD_IOMAGICNUM_SET, + (unsigned long) compat_ptr(arg)); + break; + + case TILOAD_COMPAT_BPR_READ: + dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_BPR_READ=0x%x\n", + __func__, cmd); + nResult = tiload_ioctl(filp, TILOAD_BPR_READ, + (unsigned long) compat_ptr(arg)); + break; + + case TILOAD_COMPAT_BPR_WRITE: + dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_BPR_WRITE=0x%x\n", + __func__, cmd); + nResult = tiload_ioctl(filp, TILOAD_BPR_WRITE, + (unsigned long) compat_ptr(arg)); + break; + + case TILOAD_COMPAT_IOCTL_SET_CHL: + dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOCTL_SET_CHL=0x%x\n", + __func__, cmd); + nResult = tiload_ioctl(filp, TILOAD_IOCTL_SET_CHL, + (unsigned long) compat_ptr(arg)); + break; + + case TILOAD_COMPAT_IOCTL_SET_CONFIG: + dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOCTL_SET_CONFIG=0x%x\n", + __func__, cmd); + nResult = tiload_ioctl(filp, TILOAD_IOCTL_SET_CONFIG, + (unsigned long) compat_ptr(arg)); + break; + + case TILOAD_COMPAT_IOCTL_SET_CALIBRATION: + dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOCTL_SET_CALIBRATION=0x%x\n", + __func__, cmd); + nResult = tiload_ioctl(filp, TILOAD_IOCTL_SET_CALIBRATION, + (unsigned long) compat_ptr(arg)); + break; + + default: + dev_err(pTAS2557->dev, "%s, unsupport compat ioctl=0x%x\n", + __func__, cmd); + break; + } + + return nResult; +} +#endif + +/*********** File operations structure for tiload *************/ +static const struct file_operations tiload_fops = { + .owner = THIS_MODULE, + .open = tiload_open, + .release = tiload_release, + .read = tiload_read, + .write = tiload_write, + .unlocked_ioctl = tiload_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = tiload_compat_ioctl, +#endif +}; + +/*---------------------------------------------------------------------------- + * Function : tiload_driver_init + * + * Purpose : Register a char driver for dynamic tiload programming + *---------------------------------------------------------------------------- + */ +int tiload_driver_init(struct tas2557_priv *pTAS2557) +{ + int result; + dev_t dev = MKDEV(tiload_major, 0); + + g_TAS2557 = pTAS2557; + + dev_info(pTAS2557->dev, "%s\n", __func__); + + result = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME); + if (result < 0) { + dev_err(pTAS2557->dev, "cannot allocate major number %d\n", tiload_major); + return result; + } + tiload_class = class_create(THIS_MODULE, DEVICE_NAME); + tiload_major = MAJOR(dev); + dev_info(pTAS2557->dev, "allocated Major Number: %d\n", tiload_major); + + tiload_cdev = cdev_alloc(); + cdev_init(tiload_cdev, &tiload_fops); + tiload_cdev->owner = THIS_MODULE; + tiload_cdev->ops = &tiload_fops; + + if (device_create(tiload_class, NULL, dev, NULL, "tiload_node") == NULL) + dev_err(pTAS2557->dev, "Device creation failed\n"); + + if (cdev_add(tiload_cdev, dev, 1) < 0) { + dev_err(pTAS2557->dev, "tiload_driver: cdev_add failed\n"); + unregister_chrdev_region(dev, 1); + tiload_cdev = NULL; + return 1; + } + dev_info(pTAS2557->dev, "Registered TiLoad driver, Major number: %d\n", tiload_major); + /* class_device_create(tiload_class, NULL, dev, NULL, DEVICE_NAME, 0); */ + return 0; +} + +MODULE_AUTHOR("Texas Instruments Inc."); +MODULE_DESCRIPTION("Utility for TAS2557 Android in-system tuning"); +MODULE_LICENSE("GPL v2"); diff --git a/asoc/codecs/tas2557/tiload.h b/asoc/codecs/tas2557/tiload.h new file mode 100755 index 000000000000..7468acfa3964 --- /dev/null +++ b/asoc/codecs/tas2557/tiload.h @@ -0,0 +1,65 @@ +/* +** ============================================================================= +** Copyright (c) 2016 Texas Instruments Inc. +** +** This program is free software; you can redistribute it and/or modify it under +** the terms of the GNU General Public License as published by the Free Software +** Foundation; version 2. +** +** This program is distributed in the hope that it will be useful, but WITHOUT +** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +** +** File: +** tiload.h +** +** Description: +** header file for tiload.c +** +** ============================================================================= +*/ + +#ifndef _TILOAD_H +#define _TILOAD_H + +#ifdef CONFIG_COMPAT +#include +#endif + +#include "tas2557.h" + +#define BPR_REG(book, page, reg) (((book * 256 * 128) + \ + (page * 128)) + reg) + +/* typedefs required for the included header files */ +struct BPR { + unsigned char nBook; + unsigned char nPage; + unsigned char nRegister; +}; + +/* defines */ +#define DEVICE_NAME "tiload_node" + +#define TILOAD_IOC_MAGIC 0xE0 +#define TILOAD_IOMAGICNUM_GET _IOR(TILOAD_IOC_MAGIC, 1, int) +#define TILOAD_IOMAGICNUM_SET _IOW(TILOAD_IOC_MAGIC, 2, int) +#define TILOAD_BPR_READ _IOR(TILOAD_IOC_MAGIC, 3, struct BPR) +#define TILOAD_BPR_WRITE _IOW(TILOAD_IOC_MAGIC, 4, struct BPR) +#define TILOAD_IOCTL_SET_CHL _IOW(TILOAD_IOC_MAGIC, 5, int) +#define TILOAD_IOCTL_SET_CONFIG _IOW(TILOAD_IOC_MAGIC, 6, int) +#define TILOAD_IOCTL_SET_CALIBRATION _IOW(TILOAD_IOC_MAGIC, 7, int) + +#ifdef CONFIG_COMPAT +#define TILOAD_COMPAT_IOMAGICNUM_GET _IOR(TILOAD_IOC_MAGIC, 1, compat_int_t) +#define TILOAD_COMPAT_IOMAGICNUM_SET _IOW(TILOAD_IOC_MAGIC, 2, compat_int_t) +#define TILOAD_COMPAT_BPR_READ _IOR(TILOAD_IOC_MAGIC, 3, struct BPR) +#define TILOAD_COMPAT_BPR_WRITE _IOW(TILOAD_IOC_MAGIC, 4, struct BPR) +#define TILOAD_COMPAT_IOCTL_SET_CHL _IOW(TILOAD_IOC_MAGIC, 5, compat_int_t) +#define TILOAD_COMPAT_IOCTL_SET_CONFIG _IOW(TILOAD_IOC_MAGIC, 6, compat_int_t) +#define TILOAD_COMPAT_IOCTL_SET_CALIBRATION _IOW(TILOAD_IOC_MAGIC, 7, compat_int_t) +#endif + +int tiload_driver_init(struct tas2557_priv *pTAS2557); + +#endif diff --git a/config/sm8150auto.conf b/config/sm8150auto.conf index 7f2a9bfa77d2..76fed3ae1bbf 100644 --- a/config/sm8150auto.conf +++ b/config/sm8150auto.conf @@ -41,3 +41,7 @@ CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m CONFIG_VOICE_MHI=m CONFIG_SND_SOC_CS35L41=m CONFIG_SND_SOC_CS35L41_FOR_CEPH=m +CONFIG_SND_SOC_TAS2557=m +CONFIG_TAS2557_REGMAP=m +CONFIG_TAS2557_CODEC=m +CONFIG_TAS2557_MISC=m diff --git a/config/sm8150autoconf.h b/config/sm8150autoconf.h index cfcb56eee838..2685a0bf37ee 100644 --- a/config/sm8150autoconf.h +++ b/config/sm8150autoconf.h @@ -52,3 +52,7 @@ #define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 #define CONFIG_VOICE_MHI 1 #define CONFIG_SND_SOC_CS35L41 1 +#define CONFIG_SND_SOC_TAS2557 1 +#define CONFIG_TAS2557_REGMAP 1 +#define CONFIG_TAS2557_CODEC 1 +#define CONFIG_TAS2557_MISC 1 From 82944dd93ae50a7edee23684e579cf64701b4cab Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 17:38:17 +0530 Subject: [PATCH 086/127] ASoC: Add Support for Elliptic US proximity driver - Extracted from MiCode/vendor_qcom_opensource_audio-kernel at branch 'cepheus-q-oss' Signed-off-by: UtsavBalar1231 --- Makefile | 5 + asoc/msm-pcm-routing-v2.c | 8 +- config/sm8150autoconf.h | 1 + dsp/Kbuild | 9 + dsp/apr_elliptic.c | 452 ++++++ dsp/elliptic/Makefile | 28 + dsp/elliptic/elliptic.c | 800 ++++++++++ dsp/elliptic/elliptic_mixer_controls.c | 1339 +++++++++++++++++ dsp/elliptic/elliptic_sysfs.c | 635 ++++++++ dsp/elliptic/elliptic_version.h | 8 + dsp/elliptic/io_modules/Makefile | 2 + .../io_modules/msm/elliptic_data_msm_io.c | 108 ++ dsp/elliptic/io_modules/userspace/Makefile | 2 + .../userspace/elliptic_data_userspace_ctrl.c | 271 ++++ .../userspace/elliptic_data_userspace_io.c | 149 ++ .../io_modules/userspace_test/Makefile | 2 + .../userspace_test/elliptic_data_io.c | 123 ++ dsp/q6_init.c | 6 + dsp/q6_init.h | 6 + dsp/q6afe.c | 21 + include/dsp/apr_elliptic.h | 41 + include/elliptic/elliptic_data_io.h | 155 ++ include/elliptic/elliptic_device.h | 54 + include/elliptic/elliptic_mixer_controls.h | 188 +++ include/elliptic/elliptic_sysfs.h | 15 + 25 files changed, 4427 insertions(+), 1 deletion(-) create mode 100755 dsp/apr_elliptic.c create mode 100644 dsp/elliptic/Makefile create mode 100755 dsp/elliptic/elliptic.c create mode 100755 dsp/elliptic/elliptic_mixer_controls.c create mode 100755 dsp/elliptic/elliptic_sysfs.c create mode 100755 dsp/elliptic/elliptic_version.h create mode 100644 dsp/elliptic/io_modules/Makefile create mode 100755 dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c create mode 100644 dsp/elliptic/io_modules/userspace/Makefile create mode 100644 dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c create mode 100644 dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c create mode 100644 dsp/elliptic/io_modules/userspace_test/Makefile create mode 100755 dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c create mode 100755 include/dsp/apr_elliptic.h create mode 100644 include/elliptic/elliptic_data_io.h create mode 100644 include/elliptic/elliptic_device.h create mode 100755 include/elliptic/elliptic_mixer_controls.h create mode 100755 include/elliptic/elliptic_sysfs.h diff --git a/Makefile b/Makefile index 1ef6fdb6cab0..f3f129b81427 100644 --- a/Makefile +++ b/Makefile @@ -34,6 +34,11 @@ LINUXINCLUDE += \ -I$(srctree)/techpack/audio/include/uapi \ -I$(srctree)/techpack/audio/include +ifeq ($(CONFIG_ELLIPTIC_ULTRASOUND), y) +LINUXINCLUDE += \ + -I$(srctree)/techpack/audio/include/elliptic +endif + ifeq ($(CONFIG_ARCH_SDM845), y) LINUXINCLUDE += \ -include $(srctree)/techpack/audio/config/sdm845autoconf.h diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index e5ebeb4f89e2..ffb4cc3be9e7 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -39,6 +39,10 @@ #include #include #include +#ifdef CONFIG_ELLIPTIC_ULTRASOUND +#include +#include +#endif #include "msm-pcm-routing-v2.h" #include "msm-pcm-routing-devdep.h" @@ -23931,7 +23935,9 @@ static int msm_routing_probe(struct snd_soc_platform *platform) snd_soc_add_platform_controls(platform, port_multi_channel_map_mixer_controls, ARRAY_SIZE(port_multi_channel_map_mixer_controls)); - +#ifdef CONFIG_ELLIPTIC_ULTRASOUND + elliptic_add_platform_controls(platform); +#endif return 0; } diff --git a/config/sm8150autoconf.h b/config/sm8150autoconf.h index 2685a0bf37ee..2824bd5b6775 100644 --- a/config/sm8150autoconf.h +++ b/config/sm8150autoconf.h @@ -56,3 +56,4 @@ #define CONFIG_TAS2557_REGMAP 1 #define CONFIG_TAS2557_CODEC 1 #define CONFIG_TAS2557_MISC 1 +#define CONFIG_ELLIPTIC_ULTRASOUND 1 diff --git a/dsp/Kbuild b/dsp/Kbuild index 6335d26d2591..50c0d1eb957c 100644 --- a/dsp/Kbuild +++ b/dsp/Kbuild @@ -107,6 +107,15 @@ ifdef CONFIG_SND_SOC_MSM_QDSP6V2_INTF Q6_OBJS += msm_audio_ion.o Q6_OBJS += avtimer.o Q6_OBJS += q6_init.o +ifdef CONFIG_ELLIPTIC_ULTRASOUND + Q6_OBJS += apr_elliptic.o + Q6_OBJS += elliptic/elliptic.o + Q6_OBJS += elliptic/elliptic_sysfs.o + Q6_OBJS += elliptic/elliptic_mixer_controls.o + Q6_OBJS += elliptic/io_modules/msm/elliptic_data_msm_io.o + Q6_OBJS += elliptic/io_modules/userspace/elliptic_data_userspace_io.o + Q6_OBJS += elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.o +endif endif ifdef CONFIG_XT_LOGGING diff --git a/dsp/apr_elliptic.c b/dsp/apr_elliptic.c new file mode 100755 index 000000000000..b3d67edfba09 --- /dev/null +++ b/dsp/apr_elliptic.c @@ -0,0 +1,452 @@ +/** + * Elliptic Labs + */ + +#include +#include +#include +#include +#include +#include +#include "../asoc/msm-pcm-routing-v2.h" +#include +#include +#include +#include +#include +#include + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +enum { + HALL_SLIDER_UP = 4, + HALL_SLIDER_DOWN = 5, + HALL_SLIDING = 6, +}; + +enum driver_sensor_type { + DRIVER_SENSOR_HALL = 35, +}; + +struct driver_sensor_event { + enum driver_sensor_type type; + union { + int32_t event; + int32_t reserved[2]; + }; +}; + + + +static int afe_set_parameter(int port, + int param_id, + int module_id, + struct afe_ultrasound_set_params_t *prot_config, + uint32_t length) +{ + struct afe_port_cmd_set_param_v2 *set_param_v2 = NULL; + uint32_t set_param_v2_size = sizeof(struct afe_port_cmd_set_param_v2); + struct afe_port_cmd_set_param_v3 *set_param_v3 = NULL; + uint32_t set_param_v3_size = sizeof(struct afe_port_cmd_set_param_v3); + struct param_hdr_v3 param_hdr = {0}; + u16 port_id = 0; + int index = 0; + u8 *packed_param_data = NULL; + int packed_data_size = sizeof(union param_hdrs) + length; + int ret = 0; + + pr_debug("[ELUS]: inside %s\n", __func__); + + port_id = q6audio_get_port_id(port); + ret = q6audio_validate_port(port_id); + if (ret < 0) { + pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, + port_id, ret); + return -EINVAL; + } + index = q6audio_get_port_index(port); + + param_hdr.module_id = module_id; + param_hdr.instance_id = INSTANCE_ID_0; + param_hdr.param_id = param_id; + param_hdr.param_size = length; + pr_debug("[ELUS]: param_size %d\n", length); + + packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); + if (packed_param_data == NULL) + return -ENOMEM; + + ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, (u8 *)prot_config, + &packed_data_size); + if (ret) { + pr_err("%s: Failed to pack param header and data, error %d\n", + __func__, ret); + goto fail_cmd; + } + + if (q6common_is_instance_id_supported()) { + set_param_v3_size += packed_data_size; + set_param_v3 = kzalloc(set_param_v3_size, GFP_KERNEL); + if (set_param_v3 == NULL) { + ret = -ENOMEM; + goto fail_cmd; + } + + set_param_v3->apr_hdr.hdr_field = + APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), + APR_PKT_VER); + set_param_v3->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v3) + + packed_data_size; + set_param_v3->apr_hdr.src_port = 0; + set_param_v3->apr_hdr.dest_port = 0; + set_param_v3->apr_hdr.token = index; + set_param_v3->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; + set_param_v3->port_id = port_id; + set_param_v3->payload_size = packed_data_size; + memcpy(&set_param_v3->param_data, packed_param_data, + packed_data_size); + + atomic_set(elus_afe.ptr_state, 1); + ret = apr_send_pkt(*elus_afe.ptr_apr, (uint32_t *) set_param_v3); + } else { + set_param_v2_size += packed_data_size; + set_param_v2 = kzalloc(set_param_v2_size, GFP_KERNEL); + if (set_param_v2 == NULL) { + ret = -ENOMEM; + goto fail_cmd; + } + + set_param_v2->apr_hdr.hdr_field = + APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), + APR_PKT_VER); + set_param_v2->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v2) + + packed_data_size; + set_param_v2->apr_hdr.src_port = 0; + set_param_v2->apr_hdr.dest_port = 0; + set_param_v2->apr_hdr.token = index; + set_param_v2->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; + set_param_v2->port_id = port_id; + set_param_v2->payload_size = packed_data_size; + memcpy(&set_param_v2->param_data, packed_param_data, + packed_data_size); + + atomic_set(elus_afe.ptr_state, 1); + ret = apr_send_pkt(*elus_afe.ptr_apr, (uint32_t *) set_param_v2); + } + if (ret < 0) { + pr_err("%s: Setting param for port %d param[0x%x]failed\n", + __func__, port, param_id); + goto fail_cmd; + } + ret = wait_event_timeout(elus_afe.ptr_wait[index], + (atomic_read(elus_afe.ptr_state) == 0), + msecs_to_jiffies(elus_afe.timeout_ms*10)); + if (!ret) { + pr_err("%s: wait_event timeout\n", __func__); + ret = -EINVAL; + goto fail_cmd; + } + if (atomic_read(elus_afe.ptr_status) != 0) { + pr_err("%s: set param cmd failed\n", __func__); + ret = -EINVAL; + goto fail_cmd; + } + ret = 0; +fail_cmd: + pr_debug("%s param_id %x status %d\n", __func__, param_id, ret); + kfree(set_param_v2); + kfree(set_param_v3); + kfree(packed_param_data); + return ret; +} + + +int32_t ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, + u8 *user_params, int32_t length) { + + int32_t ret = 0; + uint32_t module_id; + + if (port_id == ELLIPTIC_PORT_ID) + module_id = ELLIPTIC_ULTRASOUND_MODULE_TX; + else + module_id = ELLIPTIC_ULTRASOUND_MODULE_RX; + + ret = afe_set_parameter(port_id, + param_id, module_id, + (struct afe_ultrasound_set_params_t *)user_params, + length); + + return ret; +} + +static int32_t process_version_msg(uint32_t *payload, uint32_t payload_size) +{ + struct elliptic_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= ELLIPTIC_VERSION_INFO_SIZE) { + pr_debug("[ELUS]: elliptic_version copied to local AP cache"); + data_block = + elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_VERSION_INFO); + copy_size = min_t(size_t, data_block->size, + (size_t)ELLIPTIC_VERSION_INFO_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_branch_msg(uint32_t *payload, uint32_t payload_size) +{ + struct elliptic_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= ELLIPTIC_BRANCH_INFO_SIZE) { + pr_debug("[ELUS]: elliptic_branch copied to local AP cache"); + data_block = + elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_BRANCH_INFO); + copy_size = min_t(size_t, data_block->size, + (size_t)ELLIPTIC_BRANCH_INFO_MAX_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_tag_msg(uint32_t *payload, uint32_t payload_size) +{ + struct elliptic_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= ELLIPTIC_TAG_INFO_SIZE) { + pr_debug("[ELUS]: elliptic_tag copied to local AP cache"); + data_block = + elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_TAG_INFO); + copy_size = min_t(size_t, data_block->size, + (size_t)ELLIPTIC_TAG_INFO_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_calibration_msg(uint32_t *payload, uint32_t payload_size) +{ + struct elliptic_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= ELLIPTIC_CALIBRATION_DATA_SIZE) { + pr_debug("[ELUS]: calibration_data copied to local AP cache"); + + data_block = elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_CALIBRATION_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)ELLIPTIC_CALIBRATION_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + elliptic_set_calibration_data((u8 *)&payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_calibration_v2_msg(uint32_t *payload, uint32_t payload_size) +{ + struct elliptic_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { + pr_debug("[ELUS]: calibration_data copied to local AP cache"); + + data_block = elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)ELLIPTIC_CALIBRATION_V2_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + elliptic_set_calibration_data((u8 *)&payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_ml_msg(uint32_t *payload, uint32_t payload_size) +{ + struct elliptic_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= ELLIPTIC_ML_DATA_SIZE) { + pr_debug("[ELUS]: ml_data copied to local AP cache"); + + data_block = elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_ML_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)ELLIPTIC_ML_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_diagnostics_msg(uint32_t *payload, uint32_t payload_size) +{ + struct elliptic_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= ELLIPTIC_DIAGNOSTICS_DATA_SIZE) { + pr_debug("[ELUS]: diagnostics_data copied to local AP cache"); + + data_block = elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)ELLIPTIC_DIAGNOSTICS_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_sensorhub_msg(uint32_t *payload, uint32_t payload_size) +{ + int32_t ret = 0; + + pr_err("[ELUS]: %s, paramId:%u, size:%d\n", + __func__, payload[1], payload_size); + + return ret; +} + +int32_t elliptic_process_apr_payload(uint32_t *payload) +{ + uint32_t payload_size = 0; + int32_t ret = -1; + + if (payload[0] == ELLIPTIC_ULTRASOUND_MODULE_TX) { + /* payload format + * payload[0] = Module ID + * payload[1] = Param ID + * payload[2] = LSB - payload size + * MSB - reserved(TBD) + * payload[3] = US data payload starts from here + */ + payload_size = payload[2] & 0xFFFF; + + switch (payload[1]) { + case ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_VERSION: + ret = process_version_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_BUILD_BRANCH: + ret = process_branch_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_TAG: + ret = process_tag_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_DATA: + ret = process_calibration_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA: + ret = process_calibration_v2_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_ML_DATA: + ret = process_ml_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA: + ret = process_diagnostics_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_SENSORHUB: + ret = process_sensorhub_msg(payload, payload_size); + break; + case ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_DATA: + ret = elliptic_data_push( + ELLIPTIC_ALL_DEVICES, + (const char *)&payload[3], + (size_t)payload_size, + ELLIPTIC_DATA_PUSH_FROM_KERNEL); + + if (ret != 0) { + pr_err("[ELUS] : failed to push apr payload to elliptic device"); + return ret; + } + ret = payload_size; + break; + default: + { + pr_err("[ELUS] : elliptic_process_apr_payload, Illegal paramId:%u", payload[1]); + } + break; + } + } else { + pr_debug("[ELUS]: Invalid Ultrasound Module ID %d\n", + payload[0]); + } + return ret; +} + +int elliptic_set_hall_state(int state) +{ + struct driver_sensor_event dse; + int ret = -1; + + dse.type = DRIVER_SENSOR_HALL; + + switch (state) { + case 0: + dse.event = HALL_SLIDER_UP; + break; + case 1: + dse.event = HALL_SLIDER_DOWN; + break; + case 2: + dse.event = HALL_SLIDING; + break; + default: + pr_err("%s Invalid HALL state:%d\n", __func__, state); + return ret; + } + + ret = afe_set_parameter(ELLIPTIC_PORT_ID, + 2, ELLIPTIC_ULTRASOUND_MODULE_TX, + (struct afe_ultrasound_set_params_t *)&dse, + sizeof(dse)); + return ret; +} +EXPORT_SYMBOL(elliptic_set_hall_state); diff --git a/dsp/elliptic/Makefile b/dsp/elliptic/Makefile new file mode 100644 index 000000000000..fa19751f5f0d --- /dev/null +++ b/dsp/elliptic/Makefile @@ -0,0 +1,28 @@ +ccflags-y := -I$(src) -Wall -Werror +IO_MODULE := msm + +# EXTRA_CFLAGS += -DDEBUG + +# Need to add include paths: +LINUXINCLUDE += \ + -I$(srctree)techpack/audio/include/dsp \ + -I$(srctree)techpack/audio/include/uapi \ + -I$(srctree)techpack/aduio/include + +obj-y += elliptic.o +obj-y += elliptic_mixer_controls.o +obj-y += io_modules/$(IO_MODULE)/elliptic_data_$(IO_MODULE)_io.o +obj-y += io_modules/userspace/elliptic_data_userspace_io.o +obj-y += io_modules/userspace/elliptic_data_userspace_ctrl.o +obj-y += elliptic_sysfs.o + +# elliptic_driver-y := elliptic.o +# elliptic_driver-y += io_modules/$(IO_MODULE)/elliptic_data_io.o +# elliptic_driver-y += mixer_controls/$(MIXER_MODULE)/elliptic_mixer_controls.o +# elliptic_driver-y += elliptic_sysfs.o + +# .PHONY: clean +# all: +# make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules +# clean: +# rm *.o *.ko diff --git a/dsp/elliptic/elliptic.c b/dsp/elliptic/elliptic.c new file mode 100755 index 000000000000..2466d6185315 --- /dev/null +++ b/dsp/elliptic/elliptic.c @@ -0,0 +1,800 @@ +/** +* Copyright Elliptic Labs +* +*/ +/* #define DEBUG */ +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +/* Alternative mechanism to load calibration data. +* Read calibration data during driver initialization +* and send message to the DSP +* +* #define ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM 1 +*/ +#ifdef ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM +#include +#include +#include +#endif + +static struct elliptic_device *elliptic_devices; + +/* Global variable for the device class*/ +struct class *elliptic_class; + +typedef uint32_t el_fifo_size_t; + +/* Major number provided by the kernel*/ +static dev_t elliptic_major; + +static struct wakeup_source *wake_source; + + +void elliptic_data_cancel(struct elliptic_data *elliptic_data) +{ + atomic_set(&elliptic_data->abort_io, 1); + wake_up_interruptible(&elliptic_data->fifo_isr_not_empty); +} + +void elliptic_data_reset_debug_counters(struct elliptic_data *elliptic_data) +{ + elliptic_data->isr_fifo_discard = 0; +} + +void elliptic_data_print_debug_counters(struct elliptic_data *elliptic_data) +{ + if (elliptic_data->isr_fifo_discard > 0) { + EL_PRINT_E("isr fifo discarded %u frames", + elliptic_data->isr_fifo_discard); + } + + if (elliptic_data->userspace_read_total != + elliptic_data->isr_write_total) { + EL_PRINT_I("user space reads / isr writes : %u / %u", + elliptic_data->userspace_read_total, + elliptic_data->isr_write_total); + } + + EL_PRINT_I("total isr fifo discarded frame count : %u", + elliptic_data->isr_fifo_discard_total); +} + +void elliptic_data_update_debug_counters(struct elliptic_data + *elliptic_data) +{ + elliptic_data->isr_fifo_discard_total += + elliptic_data->isr_fifo_discard; +} + + +/* spin lock for isr must be held prior to calling */ +static void elliptic_data_flush_isr_fifo(struct elliptic_data + *elliptic_data) +{ + kfifo_reset(&elliptic_data->fifo_isr); +} + +/* spin lock for isr must be held prior to calling */ +static void elliptic_data_isr_fifo_pop(struct elliptic_data + *elliptic_data, size_t size) +{ + unsigned int fifo_result; + static uint8_t temp_buffer[ELLIPTIC_MSG_BUF_SIZE]; + + if (size > ELLIPTIC_MSG_BUF_SIZE) + EL_PRINT_E("pop size %zu too large", size); + + fifo_result = kfifo_out(&elliptic_data->fifo_isr, + temp_buffer, size); + + if (size != fifo_result) + EL_PRINT_E("failed to pop element"); +} + + +int elliptic_notify_gain_change_msg(int component_id, int gaindb) +{ + int32_t msg[3] = {ESCPT_COMPONENT_GAIN_CHANGE, component_id, gaindb}; + + return elliptic_data_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +/* inode refers to the actual file on disk */ +static int device_open(struct inode *inode, struct file *filp) +{ + unsigned int major; + unsigned int minor; + struct elliptic_device *dev; + struct elliptic_data *elliptic_data; + + major = imajor(inode); + minor = iminor(inode); + + if (major != elliptic_major || minor < 0 + || minor >= ELLIPTIC_NUM_DEVICES) { + EL_PRINT_W("no device found with minor=%d and major=%d", + major, minor); + return -ENODEV; /* No such device */ + } + + dev = NULL; + dev = &elliptic_devices[minor]; + filp->private_data = dev; + + if (inode->i_cdev != &dev->cdev) { + EL_PRINT_W("dev pointer mismatch"); + return -ENODEV; /* No such device */ + } + + if (down_interruptible(&dev->sem) != 0) { + EL_PRINT_E("the device has been opened, unable to open lock"); + return -EINVAL; + } + + elliptic_data = &dev->el_data; + spin_lock(&elliptic_data->fifo_isr_spinlock); + elliptic_data_flush_isr_fifo(elliptic_data); + spin_unlock(&elliptic_data->fifo_isr_spinlock); + + atomic_set(&elliptic_data->abort_io, 0); + elliptic_data_reset_debug_counters(elliptic_data); + + EL_PRINT_I("Opened device elliptic%u", minor); + dev->opened = 1; + return 0; +} + + +int elliptic_data_initialize(struct elliptic_data + *elliptic_data, size_t queue_size, + unsigned int wakeup_timeout, int id) +{ + int is_power_of_two; + + is_power_of_two = (queue_size != 0) && !(queue_size & (queue_size - 1)); + + if (is_power_of_two != 1) { + EL_PRINT_E("non power of 2 fifo size"); + return -EINVAL; + } + + if (kfifo_alloc(&elliptic_data->fifo_isr, + queue_size, GFP_KERNEL) != 0) { + EL_PRINT_E("failed to allocate fifo isr"); + return -EINVAL; + } + + atomic_set(&elliptic_data->abort_io, 0); + spin_lock_init(&elliptic_data->fifo_isr_spinlock); + + elliptic_data->wakeup_timeout = wakeup_timeout; + + mutex_init(&elliptic_data->user_buffer_lock); + init_waitqueue_head(&elliptic_data->fifo_isr_not_empty); + + return 0; +} + +int elliptic_data_cleanup(struct elliptic_data *elliptic_data) +{ + spin_unlock(&elliptic_data->fifo_isr_spinlock); + kfifo_free(&elliptic_data->fifo_isr); + return 0; +} + +size_t elliptic_data_pop(struct elliptic_data + *elliptic_data, char __user *user_buffer, size_t buffer_size) +{ + int result; + unsigned long num_copied; + unsigned int fifo_result; + unsigned long flags; + + if (buffer_size < ELLIPTIC_MSG_BUF_SIZE) { + EL_PRINT_E("buffer_size : %lu smaller than %lu", + buffer_size, (size_t)ELLIPTIC_MSG_BUF_SIZE); + return 0; + } + + result = wait_event_interruptible(elliptic_data->fifo_isr_not_empty, + (kfifo_is_empty(&elliptic_data->fifo_isr) == 0) + || (atomic_read(&elliptic_data->abort_io) == 1)); + + if (atomic_read(&elliptic_data->abort_io) == 1) { + atomic_set(&elliptic_data->abort_io, 0); + EL_PRINT_D("pop cancelled"); + return 0; + } + + if (result == 0) { + spin_lock_irqsave(&elliptic_data->fifo_isr_spinlock, flags); + + fifo_result = kfifo_out(&elliptic_data->fifo_isr, + elliptic_data->isr_swap_buffer, ELLIPTIC_MSG_BUF_SIZE); + + spin_unlock_irqrestore(&elliptic_data->fifo_isr_spinlock, + flags); + + if (fifo_result == 0) { + EL_PRINT_E("failed to copy: fifo isr -> swap buffer %u", + fifo_result); + return 0; + } + + mutex_lock(&elliptic_data->user_buffer_lock); + + num_copied = copy_to_user(user_buffer, + elliptic_data->isr_swap_buffer, + ELLIPTIC_MSG_BUF_SIZE); + + mutex_unlock(&elliptic_data->user_buffer_lock); + + if (num_copied != 0) { + EL_PRINT_E("failed copy to user"); + return 0; + } + ++elliptic_data->userspace_read_total; + } else { + if (-ERESTARTSYS == result) + EL_PRINT_I("wait interrupted"); + else + EL_PRINT_E("wait error = %d", result); + + return 0; + } + + return (size_t)ELLIPTIC_MSG_BUF_SIZE; +} + + + +/* push data to specific device or all devices */ +int elliptic_data_push(int deviceid, + const char *buffer, + size_t buffer_size, + elliptic_data_push_t data_source) +{ + size_t available_space; + size_t space_required; + size_t zeros_to_pad; + unsigned int copied_from_user; + int copy_from_user_result; + int err; + int i; + int i_max; + + unsigned long flags; + struct elliptic_device *device; + struct elliptic_data *elliptic_data; + unsigned int fifo_result; + static uint8_t zero_pad_buffer[ELLIPTIC_MSG_BUF_SIZE]; + + err = 0; + fifo_result = 0; + copied_from_user = 0; + copy_from_user_result = 0; + if (buffer_size > ELLIPTIC_MSG_BUF_SIZE) + return -EINVAL; + + zeros_to_pad = ELLIPTIC_MSG_BUF_SIZE - buffer_size; + + i = 0; + i_max = ELLIPTIC_NUM_DEVICES; + + if (deviceid != ELLIPTIC_ALL_DEVICES) { + /* Copy to specific device */ + i = deviceid; + i_max = i + 1; + } + + for (; i < i_max; ++i) { + device = &elliptic_devices[i]; + elliptic_data = &device->el_data; + + if ((!device->opened)) + continue; + + available_space = kfifo_avail(&elliptic_data->fifo_isr); + space_required = ELLIPTIC_MSG_BUF_SIZE; + + spin_lock_irqsave(&elliptic_data->fifo_isr_spinlock, flags); + + if (available_space < space_required) { + + ++elliptic_data->isr_fifo_discard; + elliptic_data_isr_fifo_pop(elliptic_data, + ELLIPTIC_MSG_BUF_SIZE); + } + + if (data_source == ELLIPTIC_DATA_PUSH_FROM_KERNEL) { + fifo_result = kfifo_in(&elliptic_data->fifo_isr, + buffer, buffer_size); + + if (fifo_result == 0) { + spin_unlock_irqrestore( + &elliptic_data->fifo_isr_spinlock, + flags); + continue; + } + } else if (data_source == ELLIPTIC_DATA_PUSH_FROM_USERSPACE) { + copy_from_user_result = kfifo_from_user( + &elliptic_data->fifo_isr, buffer, + buffer_size, &copied_from_user); + + if (-EFAULT == copy_from_user_result) { + spin_unlock_irqrestore( + &elliptic_data->fifo_isr_spinlock, + flags); + continue; + } + } + + + if (zeros_to_pad > 0) { + fifo_result = kfifo_in( + &elliptic_data->fifo_isr, zero_pad_buffer, + zeros_to_pad); + + if (fifo_result == 0) { + elliptic_data_isr_fifo_pop(elliptic_data, + buffer_size); + + spin_unlock_irqrestore( + &elliptic_data->fifo_isr_spinlock, + flags); + + ++elliptic_data->isr_fifo_discard; + continue; + } + } + + + ++elliptic_data->isr_write_total; + spin_unlock_irqrestore( + &elliptic_data->fifo_isr_spinlock, flags); + wake_up_interruptible(&elliptic_data->fifo_isr_not_empty); + __pm_wakeup_event(wake_source, elliptic_data->wakeup_timeout); + } + + return err; +} + +int elliptic_open_port(int portid) +{ + return elliptic_io_open_port(portid); +} + +int elliptic_close_port(int portid) +{ + return elliptic_io_close_port(portid); +} + + +int32_t elliptic_data_write(uint32_t message_id, + const char *data, size_t data_size) +{ + int32_t err_dsp; + /* int32_t err_us; */ + + err_dsp = 0; + err_dsp = elliptic_data_io_write(message_id, data, data_size); + if (err_dsp) + EL_PRINT_E("Failed write to DSP"); + return err_dsp; + + /* + * err_us = 0; + * err_us = elliptic_userspace_ctrl_write(message_id, data, data_size); + * if(err_us){ + * EL_PRINT_E("Failed write to user space"); + *} + * + *return (err_dsp | err_us); + */ +} + + + +/** +* +* @return Number of bytes read. +*/ +static ssize_t device_read(struct file *fp, char __user *buff, + size_t length, loff_t *ppos) +{ + ssize_t bytes_read = 0; + struct elliptic_device *elliptic_device; + struct elliptic_data *elliptic_data; + + elliptic_device = (struct elliptic_device *)fp->private_data; + elliptic_data = (struct elliptic_data *)&elliptic_device->el_data; + + bytes_read = elliptic_data_pop(elliptic_data, buff, length); + + return bytes_read; +} + +/** +* +* @return number of bytes actually written +*/ +static ssize_t device_write(struct file *fp, const char *buff, + size_t length, loff_t *ppos) +{ + ssize_t ret_val; + + ret_val = 0; + if ((buff != NULL) && (length != 0)) + ret_val = elliptic_data_io_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + buff, length); + + return ret_val >= 0 ? (ssize_t)length : 0; +} + + +static long device_ioctl(struct file *fp, unsigned int number, + unsigned long param) +{ + struct elliptic_device *device; + struct elliptic_data *elliptic_data; + int err; + unsigned int mirror_tag, mirror_payload_size; + unsigned char *data_ptr; + + device = (struct elliptic_device *)(fp->private_data); + elliptic_data = &device->el_data; + + switch (number) { + case IOCTL_ELLIPTIC_DATA_IO_CANCEL: + EL_PRINT_D("IOCTL_ELLIPTIC_CANCEL_READ %ld", + param); + elliptic_data_cancel(elliptic_data); + break; + + case IOCTL_ELLIPTIC_DATA_IO_MIRROR: + data_ptr = (unsigned char *)param; + mirror_tag = *(unsigned int *)data_ptr; + mirror_payload_size = *((unsigned int *)data_ptr + 1); + + if ((mirror_tag == MIRROR_TAG) && + (mirror_payload_size != 0) && + (mirror_payload_size <= + (ELLIPTIC_SET_PARAMS_SIZE * 4))) { + + err = elliptic_data_io_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (data_ptr + 8), mirror_payload_size); + + if (err != 0) { + EL_PRINT_E("elliptic_data_io_write failed"); + return err; + } + + } else { + EL_PRINT_E("TAG or Length is not valid"); + } + + break; + + default: + EL_PRINT_W("UNKNOWN IOCTL number=%d", number); + break; + } + + return 0; +} + + +static unsigned int device_poll(struct file *file, + struct poll_table_struct *poll_table) +{ + unsigned int mask; + + struct elliptic_device *device; + struct elliptic_data *elliptic_data; + + mask = 0; + device = (struct elliptic_device *)file->private_data; + elliptic_data = (struct elliptic_data *)&device->el_data; + + poll_wait(file, &elliptic_data->fifo_isr_not_empty, poll_table); + + if (!kfifo_is_empty(&elliptic_data->fifo_isr)) + mask = POLLIN | POLLRDNORM; + + return mask; +} + + +static int device_close(struct inode *inode, struct file *filp) +{ + struct elliptic_device *device; + struct elliptic_data *elliptic_data; + unsigned int minor; + + device = filp->private_data; + elliptic_data = &device->el_data; + minor = iminor(inode); + if (device == NULL) { + EL_PRINT_E("device not found"); + return -ENODEV; + } + + device->opened = 0; + elliptic_data_update_debug_counters(elliptic_data); + elliptic_data_print_debug_counters(elliptic_data); + elliptic_data_cancel(elliptic_data); + up(&device->sem); + + EL_PRINT_I("Closed device elliptic%u", minor); + return 0; +} + +/* defines the file operations provided by the driver */ +static const struct file_operations elliptic_fops = { + .owner = THIS_MODULE, /* prevents unloading when operations are in use*/ + .open = device_open, /*to open the device*/ + .write = device_write, /*to write to the device*/ + .read = device_read, /*to read the device*/ + .poll = device_poll, + .unlocked_ioctl = device_ioctl, /* IOCTL calls */ + .release = device_close, /*to close the device*/ +}; + + +static int elliptic_device_initialize(struct elliptic_device + *elliptic_device, int minor, struct class *class) +{ + int err; + dev_t device_number; + struct device *device; + + BUG_ON(elliptic_device == NULL || class == NULL); + + err = 0; + device = NULL; + device_number = MKDEV(elliptic_major, minor); + /* Memory is to be allocated when the device is opened the first time */ + sema_init(&elliptic_device->sem, 1); + cdev_init(&elliptic_device->cdev, &elliptic_fops); + elliptic_device->cdev.owner = THIS_MODULE; + + err = cdev_add(&elliptic_device->cdev, device_number, 1); + + if (err) { + EL_PRINT_E("error %d while trying to add %s%d", + err, ELLIPTIC_DEVICENAME, minor); + return err; + } + + device = device_create(class, NULL, device_number, + NULL, ELLIPTIC_DEVICENAME "%d", minor); + + if (IS_ERR(device)) { + err = PTR_ERR(device); + EL_PRINT_E("error %d while trying to create %s%d", + err, ELLIPTIC_DEVICENAME, minor); + cdev_del(&elliptic_device->cdev); + return err; + } + + if (err) { + EL_PRINT_E("failed device initialize"); + return err; + } + + return 0; +} + +static void elliptic_device_cleanup(struct elliptic_device *dev, int minor, + struct class *class) + +{ + BUG_ON(dev == NULL || class == NULL); + device_destroy(class, MKDEV(elliptic_major, minor)); + cdev_del(&dev->cdev); + up(&dev->sem); +} + +static void elliptic_driver_cleanup(int devices_to_destroy) +{ + int i; + + if (elliptic_devices) { + elliptic_data_io_cleanup(); + + for (i = 0; i < devices_to_destroy; ++i) { + elliptic_data_cleanup(&elliptic_devices[i].el_data); + elliptic_device_cleanup( + &elliptic_devices[i], i, elliptic_class); + } + + kfree(elliptic_devices); + } + + if (elliptic_class) + class_destroy(elliptic_class); + + unregister_chrdev_region( + MKDEV(elliptic_major, 0), ELLIPTIC_NUM_DEVICES); +} + + + +#ifdef ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM + +#define ELLIPTIC_CALIBRATION_MAX_DATA_SIZE (ELLIPTIC_CALIBRATION_V2_DATA_SIZE + ELLIPTIC_CALIBRATION_DATA_SIZE) +static unsigned char calibration_data[ELLIPTIC_CALIBRATION_MAX_DATA_SIZE]; +static char *calibration_filename = "/persist/audio/elliptic_calibration"; + +/* function to load the calibration from a file (if possible) */ +static size_t load_calibration_data(char *filename) +{ + size_t ret = 0; + int fd; + + mm_segment_t old_fs = get_fs(); + + set_fs(KERNEL_DS); + + fd = sys_open(filename, O_RDONLY, 0); + if (fd >= 0) { + size_t bytes_read = sys_read(fd, calibration_data, ELLIPTIC_CALIBRATION_MAX_DATA_SIZE); + + if (bytes_read == ELLIPTIC_CALIBRATION_DATA_SIZE || + bytes_read == ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { + ret = bytes_read; + } + sys_close(fd); + } + set_fs(old_fs); + return ret; +} + +static int32_t elliptic_send_calibration_to_engine(size_t calib_data_size) +{ + elliptic_set_calibration_data(calibration_data, calib_data_size); + return elliptic_data_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)calibration_data, calib_data_size); +} + +#endif + + +int __init elliptic_driver_init(void) +{ + int err; + int i; + int devices_to_destroy; + dev_t device_number; + + err = alloc_chrdev_region(&device_number, 0, ELLIPTIC_NUM_DEVICES, + ELLIPTIC_DEVICENAME); + + devices_to_destroy = 0; + + if (err < 0) { + EL_PRINT_E("Failed to allocate cdev region"); + return err; + } + + elliptic_major = MAJOR(device_number); + elliptic_class = class_create(THIS_MODULE, "chardev"); + + if (elliptic_class == NULL) { + EL_PRINT_E("Class creation failed"); + goto fail; + } + + err = elliptic_initialize_sysfs(); + + if (err) + goto fail; + + elliptic_devices = (struct elliptic_device *) + kzalloc(sizeof(struct elliptic_device) * ELLIPTIC_NUM_DEVICES, + GFP_KERNEL); + + if (elliptic_devices == NULL) { + err = -ENOMEM; + goto fail; + } + + + for (i = 0; i < ELLIPTIC_NUM_DEVICES; ++i) { + if (elliptic_device_initialize(&elliptic_devices[i], i, + elliptic_class)) { + devices_to_destroy = i; + goto fail; + } + + if (elliptic_data_initialize(&elliptic_devices[i].el_data, + ELLIPTIC_DATA_FIFO_SIZE, ELLIPTIC_WAKEUP_TIMEOUT, i)) { + goto fail; + } + } + + if (elliptic_data_io_initialize()) + goto fail; + + if (elliptic_userspace_io_driver_init()) + goto fail; + + + if (elliptic_userspace_ctrl_driver_init()) + goto fail; + + wake_source = kmalloc(sizeof(struct wakeup_source), GFP_KERNEL); + + if (!wake_source) { + EL_PRINT_E("failed to allocate wake source"); + return -ENOMEM; + } + + wakeup_source_init(wake_source, "elliptic_wake_source"); + +#ifdef ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM + /* Code to send calibration to engine */ + { + size_t calib_data_size = load_calibration_data(calibration_filename); + if (calib_data_size > 0) + elliptic_send_calibration_to_engine(calib_data_size); + } +#endif + return 0; + +fail: + elliptic_driver_cleanup(devices_to_destroy); + return err; +} + +void elliptic_driver_exit(void) +{ + if (wake_source) { + wakeup_source_trash(wake_source); + kfree(wake_source); + } + + elliptic_cleanup_sysfs(); + elliptic_driver_cleanup(ELLIPTIC_NUM_DEVICES); + elliptic_userspace_io_driver_exit(); + elliptic_userspace_ctrl_driver_exit(); +} + +MODULE_AUTHOR("Elliptic Labs"); +MODULE_DESCRIPTION("Providing Interface to UPS data"); +MODULE_LICENSE("GPL"); diff --git a/dsp/elliptic/elliptic_mixer_controls.c b/dsp/elliptic/elliptic_mixer_controls.c new file mode 100755 index 000000000000..5b4afd2b0560 --- /dev/null +++ b/dsp/elliptic/elliptic_mixer_controls.c @@ -0,0 +1,1339 @@ +/** + * Elliptic Labs + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct elliptic_system_configuration { + union { + uint8_t reserved[ELLIPTIC_SYSTEM_CONFIGURATION_SIZE]; + }; +}; + +struct elliptic_system_configuration elliptic_system_configuration; + + +struct elliptic_system_configuration_parameter { + enum elliptic_system_configuration_parameter_type type; + union { + int32_t speaker_scaling[2]; + int32_t sensitivity; + int32_t latency; + int32_t microphone_index; + int32_t operation_mode; + int32_t operation_mode_flags; + int32_t component_gain_change; + int32_t calibration_state; + int32_t engine_version; + int32_t calibration_profile; + int32_t ultrasound_gain; + int32_t log_level; + int32_t custom_setting; + int32_t engine_suspend; + int32_t input_enabled; + int32_t output_enabled; + int32_t external_event; + struct { + int32_t calibration_method; + int32_t calibration_timestamp; + }; + int32_t debug_mode; + int32_t context; + int32_t capture; + int32_t input_channels; + }; +}; + +struct elliptic_system_configuration_parameters_cache + elliptic_system_configuration_cache = { {0}, 0 }; + +static struct elliptic_engine_version_info + elliptic_engine_version_cache = { 0xde, 0xad, 0xbe, 0xef }; + +struct elliptic_engine_calibration_data { + union { + uint8_t reserved[ELLIPTIC_CALIBRATION_DATA_SIZE]; + }; +}; + +static struct elliptic_engine_calibration_data + elliptic_engine_calibration_data_cache = { .reserved = { + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef } }; + +struct elliptic_engine_calibration_v2_data { + union { + uint8_t reserved[ELLIPTIC_CALIBRATION_V2_DATA_SIZE]; + }; +}; + +static struct elliptic_engine_calibration_v2_data + elliptic_engine_calibration_v2_data_cache = { .reserved = { + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +} }; + +struct elliptic_engine_diagnostics_data { + union { + uint8_t reserved[ELLIPTIC_DIAGNOSTICS_DATA_SIZE]; + uint32_t values32[ELLIPTIC_DIAGNOSTICS_DATA_SIZE >> 2]; + }; +}; + +static struct elliptic_engine_diagnostics_data + elliptic_engine_diagnostics_data_cache = { .reserved = {0} }; + +struct elliptic_engine_ml_data { + union { + uint8_t reserved[ELLIPTIC_ML_DATA_SIZE]; + uint32_t u32[ELLIPTIC_ML_DATA_SIZE >> 2]; + }; +}; + +static struct elliptic_engine_ml_data + elliptic_engine_ml_data_cache + = { .reserved = {0} }; + +struct elliptic_engine_sensor_data { + union { + uint8_t reserved[ELLIPTIC_SENSOR_DATA_SIZE]; + uint32_t values32[ELLIPTIC_SENSOR_DATA_SIZE >> 2]; + }; +}; + +static struct elliptic_engine_sensor_data + elliptic_engine_sensor_data_cache = { .reserved = {0} }; + +struct elliptic_engine_branch_info { + char build_branch[ELLIPTIC_BRANCH_INFO_MAX_SIZE]; +}; + +static struct elliptic_engine_branch_info + elliptic_engine_branch_cache = { { 0 } }; + +struct elliptic_engine_tag_info { + char engine_tag[ELLIPTIC_TAG_INFO_SIZE]; +}; + +static struct elliptic_engine_tag_info + elliptic_engine_tag_cache = { { 0 } }; + +static struct elliptic_shared_data_block shared_data_blocks[] = { + { ELLIPTIC_OBJ_ID_CALIBRATION_DATA, ELLIPTIC_CALIBRATION_DATA_SIZE, + &elliptic_engine_calibration_data_cache }, + + { ELLIPTIC_OBJ_ID_VERSION_INFO, ELLIPTIC_VERSION_INFO_SIZE, + &elliptic_engine_version_cache }, + { ELLIPTIC_OBJ_ID_BRANCH_INFO, ELLIPTIC_BRANCH_INFO_MAX_SIZE, + &elliptic_engine_branch_cache }, + { ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA, + ELLIPTIC_CALIBRATION_V2_DATA_SIZE, + &elliptic_engine_calibration_v2_data_cache }, + { ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA, ELLIPTIC_DIAGNOSTICS_DATA_SIZE, + &elliptic_engine_diagnostics_data_cache }, + { ELLIPTIC_OBJ_ID_TAG_INFO, ELLIPTIC_TAG_INFO_SIZE, + &elliptic_engine_tag_cache }, + { ELLIPTIC_OBJ_ID_ML_DATA, + ELLIPTIC_ML_DATA_SIZE, + &elliptic_engine_ml_data_cache }, +}; + +void elliptic_set_calibration_data(uint8_t *calib_data, size_t size) +{ + struct elliptic_shared_data_block *calibration_obj = NULL; + + if (size == ELLIPTIC_CALIBRATION_DATA_SIZE) { + calibration_obj = elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_CALIBRATION_DATA); + memcpy((uint8_t *)&elliptic_engine_calibration_data_cache, + calib_data, size); + } + if (size == ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { + calibration_obj = elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); + memcpy((uint8_t *)&elliptic_engine_calibration_v2_data_cache, + calib_data, size); + } + if (calibration_obj == NULL) { + EL_PRINT_E( + "ell..set_calibration_data() calib=NULL (%zu)", size); + return; + } + memcpy((u8 *)calibration_obj->buffer, calib_data, size); +} + +void elliptic_set_diagnostics_data(uint8_t *diag_data, size_t size) +{ + struct elliptic_shared_data_block *diagnostics_obj = NULL; + + if (size <= ELLIPTIC_DIAGNOSTICS_DATA_SIZE) { + diagnostics_obj = + elliptic_get_shared_obj( + ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); + if (diagnostics_obj == NULL) { + EL_PRINT_E("el..set_diagnostics_data() NULL (%zu)", + size); + return; + } + memcpy((uint8_t *)&elliptic_engine_diagnostics_data_cache, + diag_data, size); + memcpy((u8 *)diagnostics_obj->buffer, diag_data, size); + } +} + +static const size_t NUM_SHARED_RW_OBJS = + sizeof(shared_data_blocks) / sizeof(struct elliptic_shared_data_block); + +struct elliptic_shared_data_block *elliptic_get_shared_obj(uint32_t + object_id) { + + size_t i; + + for (i = 0; i < NUM_SHARED_RW_OBJS; ++i) { + if (shared_data_blocks[i].object_id == object_id) + return &shared_data_blocks[i]; + } + + return NULL; +} + + +static const char * const ultrasound_enable_texts[] = {"Off", "On"}; + +static const struct soc_enum elliptic_enum[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ultrasound_enable_texts), + ultrasound_enable_texts), +}; + +int get_elliptic_calibration_data(uint8_t *caldata, uint32_t max_size) +{ + uint32_t copied; + + copied = ELLIPTIC_CALIBRATION_DATA_SIZE; + if (max_size < ELLIPTIC_CALIBRATION_DATA_SIZE) { + copied = max_size; + EL_PRINT_D("size mismatch : %u vs %u", + (uint32_t)ELLIPTIC_CALIBRATION_DATA_SIZE, max_size); + } + + memcpy(caldata, (uint8_t *)&elliptic_engine_calibration_data_cache, + max_size); + return copied; +} + +int get_elliptic_calibration_v2_data(uint8_t *caldata, uint32_t max_size) +{ + uint32_t copied; + + copied = ELLIPTIC_CALIBRATION_V2_DATA_SIZE; + if (max_size < ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { + copied = max_size; + EL_PRINT_D("size mismatch : %u vs %u", + (uint32_t)ELLIPTIC_CALIBRATION_V2_DATA_SIZE, max_size); + } + + memcpy(caldata, (uint8_t *)&elliptic_engine_calibration_v2_data_cache, + max_size); + return copied; +} + +int get_elliptic_diagnostics_data(uint8_t *diagdata, uint32_t max_size) +{ + uint32_t copied; + + copied = ELLIPTIC_DIAGNOSTICS_DATA_SIZE; + if (max_size < ELLIPTIC_DIAGNOSTICS_DATA_SIZE) { + copied = max_size; + EL_PRINT_D("size mismatch : %u vs %u", + (uint32_t)ELLIPTIC_DIAGNOSTICS_DATA_SIZE, max_size); + } + + memcpy(diagdata, (uint8_t *)&elliptic_engine_diagnostics_data_cache, + max_size); + return copied; +} + + +static uint32_t ultrasound_enable_cache; + +int elliptic_ultrasound_enable_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = ultrasound_enable_cache; + return 0; +} + +int elliptic_ultrasound_enable_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + static bool triggered_engine_info; + int32_t msg[4] = {0, 0, 0, 0}; + + ultrasound_enable_cache = ucontrol->value.integer.value[0]; + + if (!triggered_engine_info && ultrasound_enable_cache) { + triggered_engine_info = true; + elliptic_trigger_version_msg(); + elliptic_trigger_branch_msg(); + elliptic_trigger_tag_msg(); + } + + msg[0] = ultrasound_enable_cache ? 1 : 0; + + return elliptic_data_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +static uint32_t ultrasound_tx_port_cache; + +int elliptic_ultrasound_tx_port_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = ultrasound_tx_port_cache; + return 0; +} + +int elliptic_ultrasound_tx_port_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int ret; + + if (ultrasound_tx_port_cache == ucontrol->value.integer.value[0]) { + EL_PRINT_E("ultrasound_tx_port_set: ignoring duplicate request"); + return 0; + } + + ultrasound_tx_port_cache = ucontrol->value.integer.value[0]; + if (ultrasound_tx_port_cache) + ret = elliptic_open_port(ULTRASOUND_TX_PORT_ID); + else + ret = elliptic_close_port(ULTRASOUND_TX_PORT_ID); + + EL_PRINT_E("ultrasound_tx_port: enable=%d ret=%d", + ultrasound_tx_port_cache, ret); + + return ret; +} + +static uint32_t ultrasound_rx_port_cache; + +int elliptic_ultrasound_rx_port_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = ultrasound_rx_port_cache; + return 0; +} + +int elliptic_ultrasound_rx_port_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int ret; + + if (ultrasound_rx_port_cache == ucontrol->value.integer.value[0]) { + EL_PRINT_E("ultrasound_rx_port_set: ignoring duplicate request"); + return 0; + } + + ultrasound_rx_port_cache = ucontrol->value.integer.value[0]; + if (ultrasound_rx_port_cache) + ret = elliptic_open_port(ULTRASOUND_RX_PORT_ID); + else + ret = elliptic_close_port(ULTRASOUND_RX_PORT_ID); + + EL_PRINT_E("ultrasound_rx_port: enable=%d ret=%d", + ultrasound_tx_port_cache, ret); + + return 0; +} + +int elliptic_ultrasound_rampdown_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + /* Rampdown is a strobe, so always return Off */ + ucontrol->value.integer.value[0] = 0; + return 0; +} + +int elliptic_ultrasound_rampdown_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t msg[4] = {-1, 0, 0, 0}; + + if (ucontrol->value.integer.value[0] == 0) + return 0; + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int elliptic_ultrasound_diagnostics_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + /* Diagnostics is a strobe, so always return Off */ + ucontrol->value.integer.value[0] = 0; + return 0; +} + +int elliptic_ultrasound_request_diagnostics(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t msg[3] = {ESCPT_ENGINE_DIAGNOSTICS, 0, 0}; + + if (ucontrol->value.integer.value[0] == 0) + return 0; + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int elliptic_system_configuration_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &elliptic_system_configuration, + ELLIPTIC_SYSTEM_CONFIGURATION_SIZE); + return 0; +} + +int elliptic_system_configuration_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&elliptic_system_configuration, ucontrol->value.bytes.data, + ELLIPTIC_SYSTEM_CONFIGURATION_SIZE); + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)&elliptic_system_configuration, + ELLIPTIC_SYSTEM_CONFIGURATION_SIZE); +} + +int elliptic_calibration_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, + &elliptic_engine_calibration_data_cache, + ELLIPTIC_CALIBRATION_DATA_SIZE); + return 0; +} + +int elliptic_calibration_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&elliptic_engine_calibration_data_cache, + ucontrol->value.bytes.data, ELLIPTIC_CALIBRATION_DATA_SIZE); + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)&elliptic_engine_calibration_data_cache, + ELLIPTIC_CALIBRATION_DATA_SIZE); +} + +int elliptic_calibration_v2_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct elliptic_shared_data_block *calibration_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); + + if (calibration_obj == NULL) { + EL_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + memcpy(ucontrol->value.bytes.data, + calibration_obj->buffer, + ELLIPTIC_CALIBRATION_V2_DATA_SIZE); + return 0; +} + +int elliptic_calibration_v2_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&elliptic_engine_calibration_v2_data_cache, + ucontrol->value.bytes.data, ELLIPTIC_CALIBRATION_V2_DATA_SIZE); + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)&elliptic_engine_calibration_v2_data_cache, + ELLIPTIC_CALIBRATION_V2_DATA_SIZE); +} + +int elliptic_diagnostics_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, + &elliptic_engine_diagnostics_data_cache, + ELLIPTIC_DIAGNOSTICS_DATA_SIZE); + return 0; +} + +int elliptic_diagnostics_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int elliptic_ml_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct elliptic_shared_data_block *ml_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_ML_DATA); + + if (ml_obj == NULL) { + EL_PRINT_E("ml_obj is NULL"); + return -EINVAL; + } + + memcpy(ucontrol->value.bytes.data, + ml_obj->buffer, + ELLIPTIC_ML_DATA_SIZE); + return 0; +} + +int elliptic_ml_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)ucontrol->value.bytes.data, + ELLIPTIC_ML_DATA_SIZE); +} + +int elliptic_sensor_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, + &elliptic_engine_sensor_data_cache, + ELLIPTIC_SENSOR_DATA_SIZE); + return 0; +} + +int elliptic_sensor_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&elliptic_engine_sensor_data_cache, + ucontrol->value.bytes.data, ELLIPTIC_SENSOR_DATA_SIZE); + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)&elliptic_engine_sensor_data_cache, + ELLIPTIC_SENSOR_DATA_SIZE); +} + +int elliptic_version_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &elliptic_engine_version_cache, + ELLIPTIC_VERSION_INFO_SIZE); + return 0; +} + +int elliptic_version_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int elliptic_branch_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &elliptic_engine_branch_cache, + ELLIPTIC_BRANCH_INFO_MAX_SIZE); + return 0; +} + +int elliptic_branch_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int elliptic_tag_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &elliptic_engine_tag_cache, + ELLIPTIC_TAG_INFO_SIZE); + return 0; +} + +int elliptic_tag_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int elliptic_calibration_param_get( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + + if (mc->reg != ELLIPTIC_CALIBRATION) + return -EINVAL; + + switch (mc->shift) { + case ELLIPTIC_CALIBRATION_STATE: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.calibration_state; + break; + + case ELLIPTIC_CALIBRATION_PROFILE: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.calibration_profile; + break; + + case ELLIPTIC_ULTRASOUND_GAIN: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.ultrasound_gain; + break; + + default: + return -EINVAL; + } + + return 1; +} + +int elliptic_calibration_param_put( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct elliptic_system_configuration_parameter param; + + if (mc->reg != ELLIPTIC_CALIBRATION) + return -EINVAL; + + switch (mc->shift) { + case ELLIPTIC_CALIBRATION_STATE: + elliptic_system_configuration_cache.calibration_state = + ucontrol->value.integer.value[0]; + + param.type = ESCPT_CALIBRATION_STATE; + param.calibration_state = + elliptic_system_configuration_cache.calibration_state; + break; + + case ELLIPTIC_CALIBRATION_PROFILE: + elliptic_system_configuration_cache.calibration_profile = + ucontrol->value.integer.value[0]; + + param.type = ESCPT_CALIBRATION_PROFILE; + param.calibration_profile = + elliptic_system_configuration_cache.calibration_profile; + break; + + case ELLIPTIC_ULTRASOUND_GAIN: + elliptic_system_configuration_cache.ultrasound_gain = + ucontrol->value.integer.value[0]; + param.type = ESCPT_ULTRASOUND_GAIN; + param.ultrasound_gain = + elliptic_system_configuration_cache.ultrasound_gain; + break; + + default: + return -EINVAL; + } + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (u8 *)¶m, sizeof(param)); +} + +int elliptic_system_configuration_param_get( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + + pr_err("%s: reg: %d shift: %d\n", __func__, mc->reg, mc->shift); + + if (mc->reg != ELLIPTIC_SYSTEM_CONFIGURATION) + return -EINVAL; + + if (mc->shift >= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && + mc->shift <= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ + EL_PRINT_E("get ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_%02d", + mc->shift - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0); + ucontrol->value.integer.value[0] = 0; + return 1; + } + + switch (mc->shift) { + case ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.latency; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.sensitivity; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.speaker_scaling[0]; + ucontrol->value.integer.value[1] = + elliptic_system_configuration_cache.speaker_scaling[1]; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.microphone_index; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.operation_mode; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.operation_mode_flags; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.log_level; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.engine_suspend; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.input_enabled; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.output_enabled; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.external_event; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.calibration_method; + case ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.debug_mode; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.context; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.capture; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS: + ucontrol->value.integer.value[0] = + elliptic_system_configuration_cache.input_channels; + break; + + default: + EL_PRINT_E("Invalid mixer control"); + return -EINVAL; + } + + return 1; +} + + + +int elliptic_system_configuration_param_put( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct elliptic_system_configuration_parameter param; + struct timeval tv; + + if (mc->reg != ELLIPTIC_SYSTEM_CONFIGURATION) + return -EINVAL; + + if (mc->shift >= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && + mc->shift <= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ + const size_t csi = + mc->shift - + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0; + EL_PRINT_E("ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_XX csi:%zu", csi); + if (csi >= + ARRAY_SIZE(elliptic_system_configuration_cache.custom_settings)) + return -EINVAL; + EL_PRINT_E("ucontrol->value.integer.value[0]:%ld", ucontrol->value.integer.value[0]); + elliptic_system_configuration_cache.custom_settings[csi] = + ucontrol->value.integer.value[0]; + param.type = ESCPT_ENGINE_CUSTOM_SETTING_0 + csi; + param.custom_setting = ucontrol->value.integer.value[0]; + EL_PRINT_E("calling elliptic_data_write(custom_setting) csi:%zu", csi); + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)¶m, sizeof(param)); + } + + + switch (mc->shift) { + case ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY: + elliptic_system_configuration_cache.latency = + ucontrol->value.integer.value[0]; + param.type = ESCPT_LATENCY; + param.latency = elliptic_system_configuration_cache.latency; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY: + elliptic_system_configuration_cache.sensitivity = + ucontrol->value.integer.value[0]; + param.type = ESCPT_CHANNEL_SENSITIVITY; + param.sensitivity = + elliptic_system_configuration_cache.sensitivity; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING: + elliptic_system_configuration_cache.speaker_scaling[0] = + ucontrol->value.integer.value[0]; + elliptic_system_configuration_cache.speaker_scaling[1] = + ucontrol->value.integer.value[1]; + param.type = ESCPT_SPEAKER_SCALING; + param.speaker_scaling[0] = + elliptic_system_configuration_cache.speaker_scaling[0]; + param.speaker_scaling[1] = + elliptic_system_configuration_cache.speaker_scaling[1]; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: + elliptic_system_configuration_cache.microphone_index = + ucontrol->value.integer.value[0]; + param.type = ESCPT_MICROPHONE_INDEX; + param.microphone_index = + elliptic_system_configuration_cache.microphone_index; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE: + elliptic_system_configuration_cache.operation_mode = + ucontrol->value.integer.value[0]; + param.type = ESCPT_OPERATION_MODE; + param.operation_mode = + elliptic_system_configuration_cache.operation_mode; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: + elliptic_system_configuration_cache.operation_mode_flags = + ucontrol->value.integer.value[0]; + param.type = ESCPT_OPERATION_MODE_FLAGS; + param.operation_mode_flags = + elliptic_system_configuration_cache.operation_mode_flags; + break; + + case ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL: + elliptic_system_configuration_cache.log_level = + ucontrol->value.integer.value[0]; + param.type = ESCPT_LOG_LEVEL; + param.log_level = + elliptic_system_configuration_cache.log_level; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED: + elliptic_system_configuration_cache.input_enabled = + ucontrol->value.integer.value[0]; + param.type = ESCPT_INPUT_ENABLED; + param.input_enabled = + elliptic_system_configuration_cache.input_enabled; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: + elliptic_system_configuration_cache.output_enabled = + ucontrol->value.integer.value[0]; + param.type = ESCPT_OUTPUT_ENABLED; + param.output_enabled = + elliptic_system_configuration_cache.output_enabled; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND: + elliptic_system_configuration_cache.engine_suspend = + ucontrol->value.integer.value[0]; + param.type = ESCPT_SUSPEND; + param.engine_suspend = + elliptic_system_configuration_cache.engine_suspend; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: + elliptic_system_configuration_cache.external_event = + ucontrol->value.integer.value[0]; + param.type = ESCPT_EXTERNAL_EVENT; + param.external_event = + elliptic_system_configuration_cache.external_event; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: + elliptic_system_configuration_cache.calibration_method = + ucontrol->value.integer.value[0]; + param.type = ESCPT_CALIBRATION_METHOD; + param.calibration_method = + elliptic_system_configuration_cache.calibration_method; + do_gettimeofday(&tv); + param.calibration_timestamp = (int32_t)tv.tv_sec; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE: + elliptic_system_configuration_cache.debug_mode = + ucontrol->value.integer.value[0]; + param.type = ESCPT_DEBUG_MODE; + param.debug_mode = + elliptic_system_configuration_cache.debug_mode; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT: + elliptic_system_configuration_cache.context = + ucontrol->value.integer.value[0]; + param.type = ESCPT_CONTEXT; + param.context = + elliptic_system_configuration_cache.context; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE: + elliptic_system_configuration_cache.capture = + ucontrol->value.integer.value[0]; + param.type = ESCPT_CAPTURE; + param.context = + elliptic_system_configuration_cache.capture; + break; + case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS: + elliptic_system_configuration_cache.input_channels = + ucontrol->value.integer.value[0]; + param.type = ESCPT_INPUT_CHANNELS; + param.context = + elliptic_system_configuration_cache.input_channels; + break; + + default: + return -EINVAL; + } + + return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)¶m, sizeof(param)); +} + + +static const struct snd_kcontrol_new ultrasound_filter_mixer_controls[] = { + SOC_ENUM_EXT("Ultrasound Enable", + elliptic_enum[0], + elliptic_ultrasound_enable_get, + elliptic_ultrasound_enable_set), + SOC_ENUM_EXT("Ultrasound RampDown", + elliptic_enum[0], + elliptic_ultrasound_rampdown_get, + elliptic_ultrasound_rampdown_set), + SOC_SINGLE_EXT("Ultrasound Latency", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY, + 10000, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Sensitivity", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY, + 1000000, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_DOUBLE_EXT("Ultrasound Speaker Scaling", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING, + 0, + 1000000, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Microphone Index", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX, + 20, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Mode", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE, + 255, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Mode Flags", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS, + 256, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Calibration Profile", + ELLIPTIC_CALIBRATION, + ELLIPTIC_CALIBRATION_PROFILE, + 256, + 0, + elliptic_calibration_param_get, + elliptic_calibration_param_put), + SOC_SINGLE_EXT("Ultrasound Gain", + ELLIPTIC_CALIBRATION, + ELLIPTIC_ULTRASOUND_GAIN, + 256, + 0, + elliptic_calibration_param_get, + elliptic_calibration_param_put), + + SOC_SINGLE_EXT("Ultrasound Calibration State", + ELLIPTIC_CALIBRATION, + ELLIPTIC_CALIBRATION_STATE, + 256, + 0, + elliptic_calibration_param_get, + elliptic_calibration_param_put), + + SND_SOC_BYTES_EXT("Ultrasound System Configuration", + ELLIPTIC_SYSTEM_CONFIGURATION_SIZE, + elliptic_system_configuration_get, + elliptic_system_configuration_put), + SND_SOC_BYTES_EXT("Ultrasound Calibration Data", + ELLIPTIC_CALIBRATION_DATA_SIZE, + elliptic_calibration_data_get, + elliptic_calibration_data_put), + SND_SOC_BYTES_EXT("Ultrasound Version", + ELLIPTIC_VERSION_INFO_SIZE, + elliptic_version_data_get, + elliptic_version_data_put), + SND_SOC_BYTES_EXT("Ultrasound Branch", + ELLIPTIC_BRANCH_INFO_MAX_SIZE, + elliptic_branch_data_get, + elliptic_branch_data_put), + SND_SOC_BYTES_EXT("Ultrasound Tag", + ELLIPTIC_TAG_INFO_SIZE, + elliptic_tag_data_get, + elliptic_tag_data_put), + SOC_SINGLE_EXT("Ultrasound Log Level", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL, + 7, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + + SND_SOC_BYTES_EXT("Ultrasound Calibration Ext Data", + ELLIPTIC_CALIBRATION_V2_DATA_SIZE, + elliptic_calibration_v2_data_get, + elliptic_calibration_v2_data_put), + + SND_SOC_BYTES_EXT("Ultrasound Diagnostics Data", + ELLIPTIC_DIAGNOSTICS_DATA_SIZE, + elliptic_diagnostics_data_get, + elliptic_diagnostics_data_put), + + SOC_ENUM_EXT("Ultrasound Diagnostics Request", + elliptic_enum[0], + elliptic_ultrasound_diagnostics_get, + elliptic_ultrasound_request_diagnostics), + + SOC_SINGLE_EXT("Ultrasound Custom Setting 0", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 1", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 2", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 3", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 4", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 5", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 6", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 7", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 8", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 9", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 10", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 11", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 12", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 13", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 14", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Custom Setting 15", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15, + ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_ENUM_EXT("Ultrasound Tx Port", + elliptic_enum[0], + elliptic_ultrasound_tx_port_get, + elliptic_ultrasound_tx_port_set), + SOC_ENUM_EXT("Ultrasound Rx Port", + elliptic_enum[0], + elliptic_ultrasound_rx_port_get, + elliptic_ultrasound_rx_port_set), + SOC_SINGLE_EXT("Ultrasound Suspend", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND, + 1, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Input", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED, + 1, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Output", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED, + 1, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Event", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT, + 256, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Calibration Method", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD, + 256, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + + SND_SOC_BYTES_EXT("Ultrasound ML", + ELLIPTIC_ML_DATA_SIZE, + elliptic_ml_data_get, + elliptic_ml_data_put), + + SOC_SINGLE_EXT("Ultrasound Debug Mode", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE, + 256, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SOC_SINGLE_EXT("Ultrasound Context", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT, + ELLIPTIC_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + SND_SOC_BYTES_EXT("Ultrasound Sensor Data", + ELLIPTIC_SENSOR_DATA_SIZE, + elliptic_sensor_data_get, + elliptic_sensor_data_put), + + SOC_SINGLE_EXT("Ultrasound Capture", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE, + 256, + -1, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + + SOC_SINGLE_EXT("Ultrasound Tx Channels", + ELLIPTIC_SYSTEM_CONFIGURATION, + ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS, + 16, + 0, + elliptic_system_configuration_param_get, + elliptic_system_configuration_param_put), + +}; + + + +unsigned int elliptic_add_platform_controls(void *platform) +{ + const unsigned int num_controls = + ARRAY_SIZE(ultrasound_filter_mixer_controls); + + if (platform != NULL) { + snd_soc_add_platform_controls( + (struct snd_soc_platform *)platform, + ultrasound_filter_mixer_controls, + num_controls); + } else { + EL_PRINT_E("pointer is NULL"); + } + + return num_controls; +} +EXPORT_SYMBOL(elliptic_add_platform_controls); + +int elliptic_trigger_version_msg(void) +{ + int32_t msg[3] = {ESCPT_ENGINE_VERSION, 0, 0}; + + return elliptic_data_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int elliptic_trigger_branch_msg(void) +{ + int32_t msg[3] = {ESCPT_BUILD_BRANCH, 0, 0}; + + return elliptic_data_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int elliptic_trigger_tag_msg(void) +{ + int32_t msg[3] = {ESCPT_ENGINE_TAG, 0, 0}; + + return elliptic_data_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int elliptic_trigger_diagnostics_msg(void) +{ + int32_t msg[3] = {ESCPT_ENGINE_DIAGNOSTICS, 0, 0}; + + return elliptic_data_write( + ELLIPTIC_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} diff --git a/dsp/elliptic/elliptic_sysfs.c b/dsp/elliptic/elliptic_sysfs.c new file mode 100755 index 000000000000..882bda0c4b85 --- /dev/null +++ b/dsp/elliptic/elliptic_sysfs.c @@ -0,0 +1,635 @@ +#include +#include +#include +#include +#include +#include +#include +#include "elliptic_version.h" +#include + + +#define ELLIPTIC_DIAGNOSTICS_DATA_SECTION_COUNT 16 +#define ELLIPTIC_CALIBRATION_MAX_DISPLAY_COUNT 96 +#define ELLIPTIC_ML_DISPLAY_COUNT 16 + +static int kobject_create_and_add_failed; +static int sysfs_create_group_failed; + +extern struct elliptic_system_configuration_parameters_cache + elliptic_system_configuration_cache; + +static ssize_t calibration_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct elliptic_shared_data_block *calibration_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_DATA); + + if (calibration_obj == NULL) { + EL_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (count > calibration_obj->size) { + EL_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(calibration_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t calibration_v2_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct elliptic_shared_data_block *calibration_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); + + if (calibration_obj == NULL) { + EL_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (count > calibration_obj->size) { + EL_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(calibration_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t diagnostics_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct elliptic_shared_data_block *diagnostics_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); + + if (diagnostics_obj == NULL) { + EL_PRINT_E("diagnostics_obj is NULL"); + return -EINVAL; + } + + if (count > diagnostics_obj->size) { + EL_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(diagnostics_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t ml_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct elliptic_shared_data_block *ml_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_ML_DATA); + + if (ml_obj == NULL) { + EL_PRINT_E("ml_obj is NULL"); + return -EINVAL; + } + + if (count > ml_obj->size) { + EL_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(ml_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t calibration_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + int i; + uint8_t *caldata; + + struct elliptic_shared_data_block *calibration_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_DATA); + + if (kobject_create_and_add_failed) + EL_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + EL_PRINT_E("sysfs_create_group_failed"); + + if (calibration_obj == NULL) { + EL_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (calibration_obj->size > PAGE_SIZE) { + EL_PRINT_E("calibration_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + caldata = (uint8_t *)calibration_obj->buffer; + length = 0; + if (pretty) { + if (caldata[0] == 0xDE && + caldata[1] == 0xAD) { + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Data: not loaded"); + } else { + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Data: "); + for (i = 0; i < calibration_obj->size; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + } + } else { + for (i = 0; i < calibration_obj->size; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t calibration_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return calibration_show_core(dev, attr, buf, 0); +} + +static ssize_t calibration_v2_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + int i; + uint8_t *caldata; + + struct elliptic_shared_data_block *calibration_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); + + if (kobject_create_and_add_failed) + EL_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + EL_PRINT_E("sysfs_create_group_failed"); + + if (calibration_obj == NULL) { + EL_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (calibration_obj->size > PAGE_SIZE) { + EL_PRINT_E("calibration_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + caldata = (uint8_t *)calibration_obj->buffer; + length = 0; + if (pretty) { + if (caldata[0] == 0xDE && + caldata[1] == 0xAD) { + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Ext Data: not loaded"); + } else { + int j = (ELLIPTIC_CALIBRATION_V2_DATA_SIZE>>2) - 1; + + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Ext Data: "); + for (i = 0; i < ELLIPTIC_CALIBRATION_MAX_DISPLAY_COUNT; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + length += snprintf(buf + length, PAGE_SIZE - length, + "\nTruncated at %d", + ELLIPTIC_CALIBRATION_MAX_DISPLAY_COUNT); + length += snprintf(buf + length, PAGE_SIZE - length, + "\nmisc: %u %u %u %u %u %u %u %u\n", + caldata[j-7], caldata[j-6], caldata[j-5], + caldata[j-4], caldata[j-3], caldata[j-2], + caldata[j-1], caldata[j]); + } + } else { + for (i = 0; i < calibration_obj->size; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t calibration_v2_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return calibration_v2_show_core(dev, attr, buf, 0); +} + +static ssize_t diagnostics_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + uint32_t *data32; + int i; + + struct elliptic_shared_data_block *diagnostics_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); + + if (kobject_create_and_add_failed) + EL_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + EL_PRINT_E("sysfs_create_group_failed"); + + if (diagnostics_obj == NULL) { + EL_PRINT_E("diagnostics_obj is NULL"); + return -EINVAL; + } + + if (diagnostics_obj->size > PAGE_SIZE) { + EL_PRINT_E("diagnostics_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + length = 0; + data32 = (uint32_t *)diagnostics_obj->buffer; + + if (pretty) { + length += snprintf(buf + length, PAGE_SIZE - length, + "Diagnostics:\n counters:\n"); + for (i = 0; i < ELLIPTIC_DIAGNOSTICS_DATA_SECTION_COUNT; i++) + length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", + data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); + } else { + for (i = 0; i < (diagnostics_obj->size >> 4); ++i) + length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", + data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t diagnostics_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return diagnostics_show_core(dev, attr, buf, 0); +} + +static ssize_t ml_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + int i; + uint32_t *mldata; + + struct elliptic_shared_data_block *ml_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_ML_DATA); + + if (kobject_create_and_add_failed) + EL_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + EL_PRINT_E("sysfs_create_group_failed"); + + if (ml_obj == NULL) { + EL_PRINT_E("ml_obj is NULL"); + return -EINVAL; + } + + if (ml_obj->size > PAGE_SIZE) { + EL_PRINT_E("ml_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + mldata = (uint32_t *)ml_obj->buffer; + length = 0; + if (pretty) { + if (mldata[0] == 0x0 && + mldata[1] == 0x0) { + length += snprintf(buf + length, PAGE_SIZE - length, + "ML Data: not loaded"); + } else { + length += snprintf(buf + length, PAGE_SIZE - length, + "ML Data: "); + for (i = 0; i < ELLIPTIC_ML_DISPLAY_COUNT; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%08x ", mldata[i]); + length += snprintf(buf + length, PAGE_SIZE - length, + "\nTruncated at %d", + ELLIPTIC_ML_DISPLAY_COUNT); + } + } else { + int values = ml_obj->size >> 2; + + for (i = 0; i < values; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%08x ", mldata[i]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t ml_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return ml_show_core(dev, attr, buf, 0); +} + + +static ssize_t version_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + struct elliptic_engine_version_info *version_info; + int length; + + struct elliptic_shared_data_block *version_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_VERSION_INFO); + + if (kobject_create_and_add_failed) + EL_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + EL_PRINT_E("sysfs_create_group_failed"); + + if (version_obj == NULL) { + EL_PRINT_E("version_obj is NULL"); + return -EINVAL; + } + + if (version_obj->size > PAGE_SIZE) { + EL_PRINT_E("version_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + version_info = (struct elliptic_engine_version_info *) + version_obj->buffer; + + if (pretty) { + if (version_info->major == 0xDE && + version_info->minor == 0xAD) { + length = snprintf(buf, PAGE_SIZE, "Version: unknown\n"); + } else { + length = snprintf(buf, PAGE_SIZE, "Version: %d.%d.%d.%d\n", + version_info->major, version_info->minor, + version_info->build, version_info->revision); + } + } else { + length = snprintf(buf, PAGE_SIZE, "%d.%d.%d.%d\n", + version_info->major, version_info->minor, + version_info->build, version_info->revision); + } + result = (ssize_t)length; + return result; +} + +static ssize_t version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return version_show_core(dev, attr, buf, 0); +} + + +static ssize_t branch_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + int length; + + struct elliptic_shared_data_block *branch_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_BRANCH_INFO); + + if (branch_obj == NULL) { + EL_PRINT_E("branch_obj not found"); + return 0; + } + + if (branch_obj->size > PAGE_SIZE) { + EL_PRINT_E("branch_obj->size > PAGE_SIZE"); + return -EINVAL; + } + if (pretty) { + length = snprintf(buf, PAGE_SIZE - 1, "Branch: %s\n", + (const char *)(branch_obj->buffer)); + } else { + length = snprintf(buf, PAGE_SIZE - 1, "%s\n", + (const char *)(branch_obj->buffer)); + } + + return (ssize_t)length; +} + +static ssize_t branch_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return branch_show_core(dev, attr, buf, 0); +} + +static ssize_t tag_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + int length; + + struct elliptic_shared_data_block *tag_obj = + elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_TAG_INFO); + + if (tag_obj == NULL) { + EL_PRINT_E("tag_obj not found"); + return 0; + } + + if (tag_obj->size > PAGE_SIZE) { + EL_PRINT_E("tag_obj->size > PAGE_SIZE"); + return -EINVAL; + } + if (pretty) { + length = snprintf(buf, PAGE_SIZE - 1, "Tag: %s\n", + (const char *)(tag_obj->buffer)); + } else { + length = snprintf(buf, PAGE_SIZE - 1, "%s\n", + (const char *)(tag_obj->buffer)); + } + + return (ssize_t)length; +} + +static ssize_t tag_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return tag_show_core(dev, attr, buf, 0); +} + +static ssize_t cache_show(char *buf, int pretty) +{ + struct elliptic_system_configuration_parameters_cache *cache = + &elliptic_system_configuration_cache; + + int length; + + length = snprintf(buf, PAGE_SIZE - 1, "Cache:\n"); + length += snprintf(buf + length, PAGE_SIZE - 1, " mi:%d\n", + cache->microphone_index); + length += snprintf(buf + length, PAGE_SIZE - 1, " om:%d\n", + cache->operation_mode); + length += snprintf(buf + length, PAGE_SIZE - 1, " omf:%d\n", + cache->operation_mode_flags); + length += snprintf(buf + length, PAGE_SIZE - 1, " cs:%d\n", + cache->calibration_state); + length += snprintf(buf + length, PAGE_SIZE - 1, " cp:%d\n", + cache->calibration_profile); + length += snprintf(buf + length, PAGE_SIZE - 1, " ug:%d\n", + cache->ultrasound_gain); + length += snprintf(buf + length, PAGE_SIZE - 1, " ll:%d\n", + cache->log_level); + length += snprintf(buf + length, PAGE_SIZE - 1, " es:%d\n", + cache->engine_suspend); + + return (ssize_t)length; +} + +static ssize_t opmode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int length; + ssize_t result; + + struct elliptic_system_configuration_parameters_cache *cache = + &elliptic_system_configuration_cache; + + length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", + cache->operation_mode); + result = (ssize_t)length; + return result; +} + +static ssize_t opmode_flags_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int length; + ssize_t result; + struct elliptic_system_configuration_parameters_cache *cache = + &elliptic_system_configuration_cache; + + length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", + cache->operation_mode_flags); + result = (ssize_t)length; + return result; +} + +static ssize_t driver_version_show(char *buf) +{ + int length; + + length = snprintf(buf, PAGE_SIZE, "Driver version: %s-%s (%s)\n", + build_name, build_number, build_source_version); + + return (ssize_t)length; +} + +static ssize_t state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int length = 0; + + length += driver_version_show(buf + length); + length += version_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += branch_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += tag_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += calibration_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += calibration_v2_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += diagnostics_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += ml_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += cache_show(buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + return (ssize_t)length; +} + +static struct device_attribute calibration_attr = __ATTR_RW(calibration); +static struct device_attribute version_attr = __ATTR_RO(version); +static struct device_attribute branch_attr = __ATTR_RO(branch); +static struct device_attribute calibration_v2_attr = __ATTR_RW(calibration_v2); +static struct device_attribute diagnostics_attr = __ATTR_RW(diagnostics); +static struct device_attribute state_attr = __ATTR_RO(state); +static struct device_attribute tag_attr = __ATTR_RO(tag); +static struct device_attribute ml_attr = __ATTR_RW(ml); +static struct device_attribute opmode_attr = __ATTR_RO(opmode); +static struct device_attribute opmode_flags_attr = __ATTR_RO(opmode_flags); + +static struct attribute *elliptic_attrs[] = { + &calibration_attr.attr, + &version_attr.attr, + &branch_attr.attr, + &calibration_v2_attr.attr, + &diagnostics_attr.attr, + &state_attr.attr, + &tag_attr.attr, + &ml_attr.attr, + &opmode_attr.attr, + &opmode_flags_attr.attr, + NULL, +}; + +static struct attribute_group elliptic_attr_group = { + .name = ELLIPTIC_SYSFS_ENGINE_FOLDER, + .attrs = elliptic_attrs, +}; + +static struct kobject *elliptic_sysfs_kobj; + +int elliptic_initialize_sysfs(void) +{ + int err; + + elliptic_sysfs_kobj = kobject_create_and_add(ELLIPTIC_SYSFS_ROOT_FOLDER, + kernel_kobj->parent); + + if (!elliptic_sysfs_kobj) { + kobject_create_and_add_failed = 1; + EL_PRINT_E("failed to create kobj"); + return -ENOMEM; + } + + err = sysfs_create_group(elliptic_sysfs_kobj, &elliptic_attr_group); + + if (err) { + sysfs_create_group_failed = 1; + EL_PRINT_E("failed to create sysfs group"); + kobject_put(elliptic_sysfs_kobj); + return -ENOMEM; + } + + return 0; +} + +void elliptic_cleanup_sysfs(void) +{ + kobject_put(elliptic_sysfs_kobj); +} diff --git a/dsp/elliptic/elliptic_version.h b/dsp/elliptic/elliptic_version.h new file mode 100755 index 000000000000..9a463bb351b4 --- /dev/null +++ b/dsp/elliptic/elliptic_version.h @@ -0,0 +1,8 @@ +#ifndef ELLIPTIC_VERSION_H +#define ELLIPTIC_VERSION_H + +#define build_name "Elliptic.LinuxKernelDriver.VendorDLKM.master" +#define build_number "20181016.1" +#define build_source_version "e5e26691554bba9b1438ec3d7e0cc55dfb296bb8" + +#endif //ELLIPTIC_VERSION_H \ No newline at end of file diff --git a/dsp/elliptic/io_modules/Makefile b/dsp/elliptic/io_modules/Makefile new file mode 100644 index 000000000000..66ee789be57f --- /dev/null +++ b/dsp/elliptic/io_modules/Makefile @@ -0,0 +1,2 @@ +# TODO: add config parameter for which io module to build +#obj-y += userspace/ diff --git a/dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c b/dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c new file mode 100755 index 000000000000..f5443903e88e --- /dev/null +++ b/dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c @@ -0,0 +1,108 @@ +/** + * Copyright Elliptic Labs + * + */ + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#define IO_PING_PONG_BUFFER_SIZE 512 +#define AFE_MSM_RX_PSEUDOPORT_ID 0x8001 +#define AFE_MSM_TX_PSEUDOPORT_ID 0x8002 + +struct elliptic_msm_io_device { +}; + +/* static struct elliptic_msm_io_device io_device;*/ + + +int elliptic_data_io_initialize(void) +{ + return 0; +} + +int elliptic_data_io_cleanup(void) +{ + return 0; +} +int elliptic_io_open_port(int portid) +{ + if (portid == ULTRASOUND_RX_PORT_ID) + return afe_start_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); + else + return afe_start_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); +} + +int elliptic_io_close_port(int portid) +{ + if (portid == ULTRASOUND_RX_PORT_ID) + return afe_stop_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); + else + return afe_stop_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); +} + +int32_t elliptic_data_io_write(uint32_t message_id, const char *data, + size_t data_size) +{ + int32_t result = 0; + + /* msm_pcm_routing_acquire_lock(); */ + + result = ultrasound_apr_set_parameter(ELLIPTIC_PORT_ID, + message_id, (u8 *)data, + (int32_t)data_size); + + /* msm_pcm_routing_release_lock();*/ + return result; +} + +int32_t elliptic_data_io_transact(uint32_t message_id, const char *data, + size_t data_size, char *output_data, size_t output_data_size) +{ + pr_err("%s : unimplemented\n", __func__); + return -EINVAL; +} diff --git a/dsp/elliptic/io_modules/userspace/Makefile b/dsp/elliptic/io_modules/userspace/Makefile new file mode 100644 index 000000000000..907ddc20a1d9 --- /dev/null +++ b/dsp/elliptic/io_modules/userspace/Makefile @@ -0,0 +1,2 @@ +# TODO: add config parameter for which io module to build +#obj-y += elliptic_data_io.o diff --git a/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c b/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c new file mode 100644 index 000000000000..93abf6e4c304 --- /dev/null +++ b/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c @@ -0,0 +1,271 @@ +/** + * Copyright Elliptic Labs + * + */ + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +static dev_t elliptic_userspace_ctrl_major; +#define USERSPACE_CTRL_IO_DEVICE_NAME "elliptic_us_ctrl_io" +struct elliptic_userspace_ctrl_device { + struct cdev cdev; + struct semaphore sem; + int ping_pong_idx; + size_t ping_pong_buffer_size[2]; + uint8_t ping_pong_buffer[2][ELLIPTIC_MSG_BUF_SIZE]; + wait_queue_head_t data_available; + struct mutex data_lock; + atomic_t data_state; +}; + + + +static struct elliptic_userspace_ctrl_device ctrl_device; + +static uint8_t *get_ping_buffer(struct elliptic_userspace_ctrl_device *dev, + /*out parameter*/ size_t *data_size) +{ + if (data_size != NULL) + *data_size = dev->ping_pong_buffer_size[dev->ping_pong_idx]; + + return dev->ping_pong_buffer[dev->ping_pong_idx]; +} + +static uint8_t *get_pong_buffer(struct elliptic_userspace_ctrl_device *dev, +/*out parameter*/ size_t *data_size) +{ + if (data_size != NULL) + *data_size = dev->ping_pong_buffer_size[1 - dev->ping_pong_idx]; + + return dev->ping_pong_buffer[1 - dev->ping_pong_idx]; +} + + +static void set_pong_buffer_size(struct elliptic_userspace_ctrl_device *dev, + size_t data_size) +{ + dev->ping_pong_buffer_size[1 - dev->ping_pong_idx] = data_size; +} + +static void swap_ping_pong(struct elliptic_userspace_ctrl_device *dev) +{ + dev->ping_pong_idx = 1 - dev->ping_pong_idx; +} + +static int device_open(struct inode *inode, struct file *filp) +{ + if (inode->i_cdev != &ctrl_device.cdev) { + pr_warn("elliptic : dev pointer mismatch\n"); + return -ENODEV; /* No such device */ + } + + if (down_interruptible(&ctrl_device.sem) != 0) + return -EEXIST; + EL_PRINT_I("Opened device %s", USERSPACE_CTRL_IO_DEVICE_NAME); + return 0; +} + +static ssize_t device_read(struct file *fp, char __user *buff, + size_t user_buf_length, loff_t *ppos) +{ + size_t bytes_read; + unsigned long copy_result; + uint8_t *ping_buffer; + int result; + + if (user_buf_length < ELLIPTIC_MSG_BUF_SIZE) + EL_PRINT_E("user space buffer user_buf_length too small : %zu", + user_buf_length); + + bytes_read = 0; + copy_result = 0; + ping_buffer = NULL; + + result = wait_event_interruptible(ctrl_device.data_available, + atomic_read(&ctrl_device.data_state) != 0); + if (result == 0) { + const int state = atomic_read(&ctrl_device.data_state); + + if (state > 0) { + result = mutex_lock_interruptible( + &ctrl_device.data_lock); + if (result == 0) { + swap_ping_pong(&ctrl_device); + + ping_buffer = get_ping_buffer( + &ctrl_device, &bytes_read); + + if (bytes_read > user_buf_length) { + EL_PRINT_E( + "ping buffer size %zu larger than user buffer", + bytes_read); + goto fail; + } + + copy_result = copy_to_user(buff, ping_buffer, + bytes_read); + if (copy_result > 0) { + EL_PRINT_E("Failed copy to user"); + goto fail; + } + + atomic_set(&ctrl_device.data_state, 0); + + mutex_unlock(&ctrl_device.data_lock); + } else if (result == -EINTR) { + EL_PRINT_E("lock interrupted"); + } else { + EL_PRINT_E("lock error = %d", result); + } + } else { + EL_PRINT_W("state = %d", state); + atomic_set(&ctrl_device.data_state, 0); + } + } else if (result == -ERESTARTSYS) { + EL_PRINT_E("interrupted"); + } else { + EL_PRINT_E("wait_event error = %d", result); + } + return bytes_read; +fail: + atomic_set(&ctrl_device.data_state, 0); + mutex_unlock(&ctrl_device.data_lock); + return 0; +} + +static int device_close(struct inode *inode, struct file *filp) +{ + up(&ctrl_device.sem); + EL_PRINT_I("Closed device %s", USERSPACE_CTRL_IO_DEVICE_NAME); + return 0; +} + +static const struct file_operations +elliptic_userspace_ctrl_fops = { + .owner = THIS_MODULE, + .open = device_open, + .read = device_read, + .release = device_close, +}; + +int elliptic_userspace_ctrl_driver_init(void) +{ + struct device *device; + dev_t device_number; + int err; + + err = alloc_chrdev_region( + &device_number, 0, 1, USERSPACE_CTRL_IO_DEVICE_NAME); + + if (err < 0) { + pr_err("failed to allocate chrdev region\n"); + return err; + } + + elliptic_userspace_ctrl_major = MAJOR(device_number); + + device_number = MKDEV(elliptic_userspace_ctrl_major, 0); + device = device_create( + elliptic_class, NULL, device_number, + NULL, USERSPACE_CTRL_IO_DEVICE_NAME); + + if (IS_ERR(device)) { + unregister_chrdev( + elliptic_userspace_ctrl_major, + USERSPACE_CTRL_IO_DEVICE_NAME); + EL_PRINT_E("Failed to create the device\n"); + return PTR_ERR(device); + } + + cdev_init(&ctrl_device.cdev, &elliptic_userspace_ctrl_fops); + ctrl_device.cdev.owner = THIS_MODULE; + err = cdev_add(&ctrl_device.cdev, device_number, 1); + if (err) { + EL_PRINT_W("error %d while trying to add %s%d", + err, ELLIPTIC_DEVICENAME, 0); + return err; + } + + sema_init(&ctrl_device.sem, 1); + mutex_init(&ctrl_device.data_lock); + init_waitqueue_head(&ctrl_device.data_available); + return 0; +} + +void elliptic_userspace_ctrl_driver_exit(void) +{ + BUG_ON(elliptic_class == NULL); + device_destroy(elliptic_class, MKDEV(elliptic_userspace_ctrl_major, 0)); + cdev_del(&ctrl_device.cdev); + unregister_chrdev(elliptic_userspace_ctrl_major, + USERSPACE_CTRL_IO_DEVICE_NAME); + up(&ctrl_device.sem); +} + +int32_t elliptic_userspace_ctrl_write(uint32_t message_id, + const char *data, size_t data_size){ + uint8_t *pong_buffer; + + if (data_size > ELLIPTIC_MSG_BUF_SIZE) { + EL_PRINT_E("data size : %zu larger than buf size : %zu", + data_size, (size_t)ELLIPTIC_MSG_BUF_SIZE); + + return -EINVAL; + } + mutex_lock(&ctrl_device.data_lock); + + pong_buffer = get_pong_buffer(&ctrl_device, NULL); + set_pong_buffer_size(&ctrl_device, data_size); + + memcpy(pong_buffer, data, data_size); + wake_up_interruptible(&ctrl_device.data_available); + atomic_set(&ctrl_device.data_state, 1); + mutex_unlock(&ctrl_device.data_lock); + + return 0; +} + + diff --git a/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c b/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c new file mode 100644 index 000000000000..7f207d98a644 --- /dev/null +++ b/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c @@ -0,0 +1,149 @@ +/** + * Copyright Elliptic Labs + * + */ + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +static dev_t elliptic_userspace_major; +#define USERSPACE_IO_DEVICE_NAME "elliptic_us_io" +struct elliptic_userspace_device { + struct cdev cdev; + struct semaphore sem; +}; + +static struct elliptic_userspace_device io_device; + +static int device_open(struct inode *inode, struct file *filp) +{ + if (inode->i_cdev != &io_device.cdev) { + pr_warn("elliptic : dev pointer mismatch\n"); + return -ENODEV; /* No such device */ + } + + if (down_interruptible(&io_device.sem) != 0) + return -EEXIST; + EL_PRINT_I("Opened device %s", USERSPACE_IO_DEVICE_NAME); + return 0; +} + +static ssize_t device_write(struct file *fp, const char __user *buff, + size_t length, loff_t *ppos) +{ + int push_result; + + push_result = elliptic_data_push( + ELLIPTIC_ALL_DEVICES, buff, length, ELLIPTIC_DATA_PUSH_FROM_USERSPACE); + + return push_result == 0 ? (ssize_t)length : (ssize_t)(-1); +} + +static int device_close(struct inode *inode, struct file *filp) +{ + up(&io_device.sem); + EL_PRINT_I("Closed device %s", USERSPACE_IO_DEVICE_NAME); + return 0; +} + +static const struct file_operations +elliptic_userspace_fops = { + .owner = THIS_MODULE, + .open = device_open, + .write = device_write, + .release = device_close, +}; + +int elliptic_userspace_io_driver_init(void) +{ + struct device *device; + dev_t device_number; + int err; + + err = alloc_chrdev_region( + &device_number, 0, 1, USERSPACE_IO_DEVICE_NAME); + + if (err < 0) { + pr_err("failed to allocate chrdev region\n"); + return err; + } + + elliptic_userspace_major = MAJOR(device_number); + + device_number = MKDEV(elliptic_userspace_major, 0); + device = device_create( + elliptic_class, NULL, device_number, + NULL, USERSPACE_IO_DEVICE_NAME); + + if (IS_ERR(device)) { + unregister_chrdev( + elliptic_userspace_major, USERSPACE_IO_DEVICE_NAME); + pr_err("Failed to create the device\n"); + return PTR_ERR(device); + } + + cdev_init(&io_device.cdev, &elliptic_userspace_fops); + io_device.cdev.owner = THIS_MODULE; + err = cdev_add(&io_device.cdev, device_number, 1); + if (err) { + EL_PRINT_W("error %d while trying to add %s%d", + err, ELLIPTIC_DEVICENAME, 0); + return err; + } + + sema_init(&io_device.sem, 1); + return 0; +} + +void elliptic_userspace_io_driver_exit(void) +{ + BUG_ON(elliptic_class == NULL); + device_destroy(elliptic_class, MKDEV(elliptic_userspace_major, 0)); + cdev_del(&io_device.cdev); + unregister_chrdev(elliptic_userspace_major, USERSPACE_IO_DEVICE_NAME); + up(&io_device.sem); +} + + diff --git a/dsp/elliptic/io_modules/userspace_test/Makefile b/dsp/elliptic/io_modules/userspace_test/Makefile new file mode 100644 index 000000000000..907ddc20a1d9 --- /dev/null +++ b/dsp/elliptic/io_modules/userspace_test/Makefile @@ -0,0 +1,2 @@ +# TODO: add config parameter for which io module to build +#obj-y += elliptic_data_io.o diff --git a/dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c b/dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c new file mode 100755 index 000000000000..0af53f06b433 --- /dev/null +++ b/dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c @@ -0,0 +1,123 @@ +/** + * Copyright Elliptic Labs + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + + +#define USE_IRQ 11 + +static struct task_struct *simulating_task; +static atomic_t cancel; + +struct elliptic_data_io_state { +}; +#define BUFFER_SIZE 128 + +static int32_t output_buffer[BUFFER_SIZE]; + +irqreturn_t irq_handler(int irq, void *dev_id) +{ + int result; + + result = elliptic_data_push(ELLIPTIC_ALL_DEVICES, + (const char *)output_buffer, BUFFER_SIZE * sizeof(int32_t)); + return 0; +} + + +static void fill_buffer(int32_t *buffer, size_t len, int32_t value) +{ + size_t i; + + for (i = 0; i < len; ++i) + buffer[i] = value; +} + + +int simulating_thread(void *context) +{ + static int32_t count; + int result; + + count = 0; + msleep(100); + + pr_debug("%s\n", __func__); + while (atomic_read(&cancel) == 0) { + if (kthread_should_stop()) + do_exit(0); + + fill_buffer(output_buffer, BUFFER_SIZE, count); + + ++count; + if (result != 0) { + pr_warn("failed to push data\n"); + } + asm("int $0x3B"); /* Corresponding to irq 11 */ + msleep(0); + } + return 0; +} + +int32_t elliptic_data_io_write(uint32_t message_id, const char *data, + size_t data_size) { + return 0; + } + +int32_t elliptic_data_io_transact(uint32_t message_id, const char *data, + size_t data_size, char *output_data, size_t output_data_size) { + return 0; +} + + +void elliptic_data_io_cancel(struct elliptic_data *elliptic_data) +{ + atomic_set(&elliptic_data->abort_io, 1); + wake_up_interruptible(&elliptic_data->fifo_isr_not_empty); +} + + +int elliptic_data_io_initialize(void) +{ + pr_debug("%s\n", __func__); + atomic_set(&cancel, 0); + simulating_task = kthread_run(&simulating_thread, NULL, + "el_simulating_thread"); + + + if (request_irq(USE_IRQ, irq_handler, IRQF_SHARED, "my_device", + (void *)(irq_handler))) { + pr_debug("my_device: cannot register IRQ "); + return -EPERM; + } + + return 0; +} + +int elliptic_data_io_cleanup(void) +{ + free_irq(USE_IRQ, (void *)(irq_handler)); + kthread_stop(simulating_task); + atomic_set(&cancel, 1); + msleep(200); + return 0; +} diff --git a/dsp/q6_init.c b/dsp/q6_init.c index 202955a96040..4e93672d25b9 100644 --- a/dsp/q6_init.c +++ b/dsp/q6_init.c @@ -33,6 +33,9 @@ static int __init audio_q6_init(void) avtimer_init(); msm_mdf_init(); voice_mhi_init(); +#ifdef CONFIG_ELLIPTIC_ULTRASOUND + elliptic_driver_init(); +#endif return 0; } @@ -53,6 +56,9 @@ static void __exit audio_q6_exit(void) audio_cal_exit(); adsp_err_exit(); voice_mhi_exit(); +#ifdef CONFIG_ELLIPTIC_ULTRASOUND + elliptic_driver_exit(); +#endif } module_init(audio_q6_init); diff --git a/dsp/q6_init.h b/dsp/q6_init.h index 5014c37a6c32..d46d665c7622 100644 --- a/dsp/q6_init.h +++ b/dsp/q6_init.h @@ -30,6 +30,9 @@ int avtimer_init(void); int msm_mdf_init(void); void msm_mdf_exit(void); #else +#ifdef CONFIG_ELLIPTIC_ULTRASOUND +int elliptic_driver_init(void); +#endif static inline int msm_mdf_init(void) { return 0; @@ -65,6 +68,9 @@ void q6asm_exit(void); void afe_exit(void); void adm_exit(void); void adsp_err_exit(void); +#ifdef CONFIG_ELLIPTIC_ULTRASOUND +int elliptic_driver_exit(void); +#endif #ifdef CONFIG_VOICE_MHI int voice_mhi_init(void); diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 13a2c6ae7e2f..1198b6ae5a70 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -26,6 +26,9 @@ #include #include #include +#ifdef CONFIG_ELLIPTIC_ULTRASOUND +#include +#endif #include #include "adsp_err.h" #include "q6afecal-hwdep.h" @@ -611,6 +614,13 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) atomic_set(&this_afe.state, 0); atomic_set(&this_afe.status, 0); wake_up(&this_afe.lpass_core_hw_wait); +#ifdef CONFIG_ELLIPTIC_ULTRASOUND + } else if (data->opcode == ULTRASOUND_OPCODE) { + if (NULL != data->payload) + elliptic_process_apr_payload(data->payload); + else + pr_err("[EXPORT_SYMBOLLUS]: payload ptr is Invalid"); +#endif } else if (data->payload_size) { uint32_t *payload; uint16_t port_id = 0; @@ -1742,6 +1752,17 @@ fail_idx: return ret; } +#ifdef CONFIG_ELLIPTIC_ULTRASOUND +afe_ultrasound_state_t elus_afe = { + .ptr_apr= &this_afe.apr, + .ptr_status= &this_afe.status, + .ptr_state= &this_afe.state, + .ptr_wait= this_afe.wait, + .timeout_ms= TIMEOUT_MS, +}; +EXPORT_SYMBOL(elus_afe); +#endif + static void afe_send_cal_spkr_prot_tx(int port_id) { union afe_spkr_prot_config afe_spk_config; diff --git a/include/dsp/apr_elliptic.h b/include/dsp/apr_elliptic.h new file mode 100755 index 000000000000..4219144b6b99 --- /dev/null +++ b/include/dsp/apr_elliptic.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include +#include + +#define ELLIPTIC_SET_PARAMS_SIZE 114 +#define ELLIPTIC_ULTRASOUND_MODULE_TX 0x0F010201 +#define ELLIPTIC_ULTRASOUND_MODULE_RX 0x0FF10202 +#define ULTRASOUND_OPCODE 0x0FF10204 + +/* This need to be updated for all platforms */ +#define ELLIPTIC_PORT_ID SLIMBUS_2_TX + +/** Sequence of Elliptic Labs Ultrasound module parameters */ +struct afe_ultrasound_set_params_t { + uint32_t payload[ELLIPTIC_SET_PARAMS_SIZE]; +} __packed; + +/** Sequence of Elliptic Labs Ultrasound module parameters */ + +/** Elliptic APR public */ + +int32_t ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, + u8 *user_params, int32_t length); + +int32_t elliptic_process_apr_payload(uint32_t *payload); + +int elliptic_notify_gain_change_msg(int component_id, int gaindb); + +typedef struct afe_ultrasound_state { + atomic_t us_apr_state; + void **ptr_apr; + atomic_t *ptr_status; + atomic_t *ptr_state; + wait_queue_head_t *ptr_wait; + int timeout_ms; +} afe_ultrasound_state_t; + +extern afe_ultrasound_state_t elus_afe; diff --git a/include/elliptic/elliptic_data_io.h b/include/elliptic/elliptic_data_io.h new file mode 100644 index 000000000000..43841ed3e044 --- /dev/null +++ b/include/elliptic/elliptic_data_io.h @@ -0,0 +1,155 @@ +/** +* Copyright Elliptic Labs 2015-2016 +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#define ELLIPTIC_DATA_IO_AP_TO_DSP 0 +#define ELLIPTIC_DATA_IO_DSP_TO_AP 1 + +#define ELLIPTIC_DATA_IO_READ_OK 0 +#define ELLIPTIC_DATA_IO_READ_BUSY 1 +#define ELLIPTIC_DATA_IO_READ_CANCEL 2 + +#define ELLIPTIC_MSG_BUF_SIZE 512 + +/* wake source timeout in ms*/ +#define ELLIPTIC_WAKEUP_TIMEOUT 250 + +#define ELLIPTIC_DATA_FIFO_SIZE (PAGE_SIZE) + +#define ULTRASOUND_RX_PORT_ID 0 +#define ULTRASOUND_TX_PORT_ID 1 + +/* Elliptic Labs UltraSound Module */ +#define ELLIPTIC_ULTRASOUND_DISABLE 0 +#define ELLIPTIC_ULTRASOUND_ENABLE 1 +#define ELLIPTIC_ULTRASOUND_SET_PARAMS 2 +#define ELLIPTIC_ULTRASOUND_GET_PARAMS 3 +#define ELLIPTIC_ULTRASOUND_RAMP_DOWN 4 + +/** Param ID definition */ +#define ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_DATA 3 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_DATA 11 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_VERSION 12 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_BUILD_BRANCH 14 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA 15 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_SENSORHUB 16 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA 17 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_TAG 18 +#define ELLIPTIC_ULTRASOUND_PARAM_ID_ML_DATA 19 + +#define ELLIPTIC_DATA_READ_BUSY 0 +#define ELLIPTIC_DATA_READ_OK 1 +#define ELLIPTIC_DATA_READ_CANCEL 2 + +#define ELLIPTIC_ALL_DEVICES -1 +#define ELLIPTIC_DEVICE_0 0 +#define ELLIPTIC_DEVICE_1 1 + +enum elliptic_message_id { + ELLIPTIC_MESSAGE_PAYLOAD, /* Input to AP*/ + ELLIPTIC_MESSAGE_RAW, /* Output from AP*/ + ELLIPTIC_MESSAGE_CALIBRATION, + ELLIPTIC_MESSAGE_CALIBRATION_V2, + ELLIPTIC_MESSAGE_DIAGNOSTICS, + ELLIPTIC_MAX_MESSAGE_IDS +}; + +typedef enum { + ELLIPTIC_DATA_PUSH_FROM_KERNEL, + ELLIPTIC_DATA_PUSH_FROM_USERSPACE +} elliptic_data_push_t; + +struct elliptic_data { + /* wake lock timeout */ + unsigned int wakeup_timeout; + + /* members for top half interrupt handling */ + struct kfifo fifo_isr; + spinlock_t fifo_isr_spinlock; + wait_queue_head_t fifo_isr_not_empty; + struct mutex user_buffer_lock; + + /* buffer to swap data from isr fifo to userspace */ + uint8_t isr_swap_buffer[ELLIPTIC_MSG_BUF_SIZE]; + + atomic_t abort_io; + + /* debug counters, reset between open/close */ + uint32_t isr_fifo_discard; + + /* debug counters, persistent */ + uint32_t isr_fifo_discard_total; + uint32_t userspace_read_total; + uint32_t isr_write_total; + +}; + +/* Elliptic IO module API (implemented by IO module)*/ + +int elliptic_data_io_initialize(void); +int elliptic_data_io_cleanup(void); + +int32_t elliptic_data_io_write(uint32_t message_id, const char *data, + size_t data_size); + +int32_t elliptic_data_io_transact(uint32_t message_id, const char *data, + size_t data_size, char *output_data, size_t output_data_size); + + +/* Elliptic driver API (implemented by main driver)*/ +int elliptic_data_initialize(struct elliptic_data *, + size_t max_queue_size, unsigned int wakeup_timeout, int id); + +int elliptic_data_cleanup(struct elliptic_data *); + +void elliptic_data_reset_debug_counters(struct elliptic_data *); +void elliptic_data_update_debug_counters(struct elliptic_data *); +void elliptic_data_print_debug_counters(struct elliptic_data *); + +/* Called from elliptic device read */ +size_t elliptic_data_pop(struct elliptic_data *, + char __user *buffer, size_t buffer_size); + +/* Used for cancelling a blocking read */ +void elliptic_data_cancel(struct elliptic_data *); + +/* Called from IO module*/ +int elliptic_data_push(int deviceid, const char *buffer, size_t buffer_size, elliptic_data_push_t); + +/* Writes to io module and user space control */ +int32_t elliptic_data_write(uint32_t message_id, + const char *data, size_t data_size); + +/* Opens port */ +int elliptic_open_port(int portid); + +/* Closes port */ +int elliptic_close_port(int portid); + +/* Opens port */ +int elliptic_io_open_port(int portid); + +/* Closes port */ +int elliptic_io_close_port(int portid); + +/* Create device node for userspace io driver*/ +int elliptic_userspace_io_driver_init(void); +void elliptic_userspace_io_driver_exit(void); + +/* Create device node for userspace io driver*/ +int elliptic_userspace_ctrl_driver_init(void); +void elliptic_userspace_ctrl_driver_exit(void); +int32_t elliptic_userspace_ctrl_write(uint32_t message_id, + const char *data, size_t data_size); + diff --git a/include/elliptic/elliptic_device.h b/include/elliptic/elliptic_device.h new file mode 100644 index 000000000000..78159257cead --- /dev/null +++ b/include/elliptic/elliptic_device.h @@ -0,0 +1,54 @@ +/** + * Copyright Elliptic Labs + * + */ + +#pragma once + +#include +#include +#include +#include + +#define ELLIPTIC_DEVICENAME "elliptic" +#define ELLIPTIC_NUM_DEVICES 2 + +#define IOCTL_ELLIPTIC_APP 197 +#define MIRROR_TAG 0x3D0A4842 + +#define IOCTL_ELLIPTIC_DATA_IO_CANCEL \ + _IO(IOCTL_ELLIPTIC_APP, 2) + +#define IOCTL_ELLIPTIC_ACTIVATE_ENGINE \ + _IOW(IOCTL_ELLIPTIC_APP, 3, int) + +#define IOCTL_ELLIPTIC_SET_RAMP_DOWN \ + _IO(IOCTL_ELLIPTIC_APP, 4) + +#define IOCTL_ELLIPTIC_SYSTEM_CONFIGURATION \ + _IOW(IOCTL_ELLIPTIC_APP, 5, int) + +#define IOCTL_ELLIPTIC_DATA_IO_MIRROR \ + _IOW(IOCTL_ELLIPTIC_APP, 117, unsigned char *) + +struct elliptic_device { + int opened; + struct cdev cdev; + struct semaphore sem; + struct elliptic_data el_data; +}; + +extern struct class *elliptic_class; + +#define EL_PRINT_E(string, arg...) \ + pr_err("[ELUS] : (%s) : " string "\n", __func__, ##arg) + +#define EL_PRINT_W(string, arg...) \ + pr_warn("[ELUS] : (%s) : " string "\n", __func__, ##arg) + +#define EL_PRINT_I(string, arg...) \ + pr_info("[ELUS] : (%s) : " string "\n", __func__, ##arg) + +#define EL_PRINT_D(string, arg...) \ + pr_debug("[ELUS] : (%s) : " string "\n", __func__, ##arg) + diff --git a/include/elliptic/elliptic_mixer_controls.h b/include/elliptic/elliptic_mixer_controls.h new file mode 100755 index 000000000000..190f34703a19 --- /dev/null +++ b/include/elliptic/elliptic_mixer_controls.h @@ -0,0 +1,188 @@ +#pragma once +#include +#include +#include +#include + + +#define ELLIPTIC_OBJ_ID_CALIBRATION_DATA 1 +#define ELLIPTIC_OBJ_ID_VERSION_INFO 2 +#define ELLIPTIC_OBJ_ID_BRANCH_INFO 3 +#define ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA 4 +#define ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA 5 +#define ELLIPTIC_OBJ_ID_TAG_INFO 6 +#define ELLIPTIC_OBJ_ID_ML_DATA 7 + +#define ELLIPTIC_SYSTEM_CONFIGURATION_SIZE 96 +#define ELLIPTIC_CALIBRATION_DATA_SIZE 64 +#define ELLIPTIC_CALIBRATION_V2_DATA_SIZE 448 +#define ELLIPTIC_DIAGNOSTICS_DATA_SIZE 448 +#define ELLIPTIC_DIAGNOSTICS_U32_DATA_VALUES (ELLIPTIC_DIAGNOSTICS_DATA_SIZE>>2) +#define ELLIPTIC_SENSOR_DATA_SIZE 68 +#define ELLIPTIC_SENSOR_U32_DATA_VALUES (ELLIPTIC_SENSOR_DATA_SIZE>>2) +#define ELLIPTIC_VERSION_INFO_SIZE 16 +#define ELLIPTIC_BRANCH_INFO_SIZE 32 +#define ELLIPTIC_BRANCH_INFO_MAX_SIZE 128 +#define ELLIPTIC_TAG_INFO_SIZE 32 +#define ELLIPTIC_ML_DATA_SIZE 432 + +#define ELLIPTIC_ULTRASOUND_DISABLE 0 +#define ELLIPTIC_ULTRASOUND_ENABLE 1 +#define ELLIPTIC_ULTRASOUND_SET_PARAMS 2 +#define ELLIPTIC_ULTRASOUND_GET_PARAMS 3 +#define ELLIPTIC_ULTRASOUND_RAMP_DOWN 4 + +/** register */ +#define ELLIPTIC_CALIBRATION 1 +/** bits */ +#define ELLIPTIC_CALIBRATION_STATE 0 +#define ELLIPTIC_CALIBRATION_PROFILE 1 +#define ELLIPTIC_ULTRASOUND_GAIN 2 + +/** custom settings */ +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT 16 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE 0x7FFFFFFF + + +/** register */ +#define ELLIPTIC_SYSTEM_CONFIGURATION 0 +/** bits */ +#define ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY 0 +#define ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY 1 +#define ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING 2 +#define ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX 3 +#define ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE 4 +#define ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS 5 +#define ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL 6 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 7 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1 8 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2 9 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3 10 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4 11 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5 12 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6 13 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7 14 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8 15 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9 16 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10 17 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11 18 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12 19 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13 20 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14 21 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15 22 + +#define ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND 23 +#define ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED 24 +#define ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED 25 +#define ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT 26 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD 27 +#define ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE 28 +#define ELLIPTIC_SYSTEM_CONFIGURATION_NUMBER_OF_RUNS 29 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT 30 +#define ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE 31 +#define ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS 32 + +#define ELLIPTIC_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE 0x7FFFFFFF + + +struct elliptic_engine_version_info { + uint32_t major; + uint32_t minor; + uint32_t build; + uint32_t revision; +}; + +struct elliptic_shared_data_block { + uint32_t object_id; + size_t size; + void *buffer; +}; + +struct elliptic_shared_data_block *elliptic_get_shared_obj(uint32_t + object_id); + +extern unsigned int elliptic_add_platform_controls(void *platform); + +void elliptic_set_calibration_data(uint8_t *calib_data, size_t size); + +enum elliptic_system_configuration_parameter_type { + + ESCPT_SPEAKER_SCALING = 1, + ESCPT_CHANNEL_SENSITIVITY, + ESCPT_LATENCY, + ESCPT_MICROPHONE_INDEX, + ESCPT_OPERATION_MODE, + ESCPT_OPERATION_MODE_FLAGS, + ESCPT_COMPONENT_GAIN_CHANGE, + ESCPT_CALIBRATION_STATE, + ESCPT_ENGINE_VERSION, + ESCPT_CALIBRATION_PROFILE, + ESCPT_ULTRASOUND_GAIN, + ESCPT_LOG_LEVEL, + ESCPT_BUILD_BRANCH, //13 + + ESCPT_FSELECTION, + ESCPT_ENGINE_DIAGNOSTICS, + ESCPT_ENGINE_CUSTOM_SETTING_0, + ESCPT_ENGINE_CUSTOM_SETTING_1, + ESCPT_ENGINE_CUSTOM_SETTING_2, + ESCPT_ENGINE_CUSTOM_SETTING_3, + ESCPT_ENGINE_CUSTOM_SETTING_4, + ESCPT_ENGINE_CUSTOM_SETTING_5, + ESCPT_ENGINE_CUSTOM_SETTING_6, + ESCPT_ENGINE_CUSTOM_SETTING_7, + ESCPT_ENGINE_CUSTOM_SETTING_8, + ESCPT_ENGINE_CUSTOM_SETTING_9, + ESCPT_ENGINE_CUSTOM_SETTING_10, + ESCPT_ENGINE_CUSTOM_SETTING_11, + ESCPT_ENGINE_CUSTOM_SETTING_12, + ESCPT_ENGINE_CUSTOM_SETTING_13, + ESCPT_ENGINE_CUSTOM_SETTING_14, + ESCPT_ENGINE_CUSTOM_SETTING_15, + ESCPT_SUSPEND, // 32 + ESCPT_INPUT_ENABLED, + ESCPT_OUTPUT_ENABLED, + ESCPT_EXTERNAL_EVENT, + ESCPT_ENGINE_TAG, //36 + ESCPT_CALIBRATION_METHOD, + ESCPT_DEBUG_MODE, + ESCPT_NUMBER_OF_RUNS, + ESCPT_CONTEXT, + ESCPT_CAPTURE, + ESCPT_INPUT_CHANNELS, +}; + +struct elliptic_system_configuration_parameters_cache { + int32_t speaker_scaling[2]; + int32_t sensitivity; + int32_t latency; + int32_t microphone_index; + int32_t operation_mode; + int32_t operation_mode_flags; + int32_t component_gain_change; + int32_t calibration_state; + int32_t engine_version; + int32_t calibration_profile; + int32_t ultrasound_gain; + int32_t log_level; + int32_t custom_settings[ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT]; + int32_t engine_suspend; + int32_t input_enabled; + int32_t output_enabled; + int32_t external_event; + int32_t calibration_method; + int32_t debug_mode; + int32_t number_of_runs; + int32_t context; + int32_t capture; + int32_t input_channels; +}; + + +int elliptic_trigger_version_msg(void); + +int elliptic_trigger_branch_msg(void); + +int elliptic_trigger_tag_msg(void); + +int elliptic_trigger_diagnostics_msg(void); diff --git a/include/elliptic/elliptic_sysfs.h b/include/elliptic/elliptic_sysfs.h new file mode 100755 index 000000000000..23f9d19d8ebd --- /dev/null +++ b/include/elliptic/elliptic_sysfs.h @@ -0,0 +1,15 @@ +#pragma once + +#define ELLIPTIC_SYSFS_ENGINE_FOLDER "engine" +#define ELLIPTIC_SYSFS_ROOT_FOLDER "elliptic" +#define ELLIPTIC_SYSFS_CALIBRATION_FILENAME "calibration" +#define ELLIPTIC_SYSFS_VERSION_FILENAME "version" +#define ELLIPTIC_SYSFS_CALIBRATION_V2_FILENAME "calibration_v2" +#define ELLIPTIC_SYSFS_STATE_FILENAME "state" +#define ELLIPTIC_SYSFS_TAG_FILENAME "tag" +#define ELLIPTIC_SYSFS_OPMODE_FILENAME "opmode" +#define ELLIPTIC_SYSFS_OPMODE_FLAGS_FILENAME "opmode_flags" + + +int elliptic_initialize_sysfs(void); +void elliptic_cleanup_sysfs(void); From ede7c4ed9a6d9e67db7b370f631aa7dd2d85a769 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 17:51:21 +0530 Subject: [PATCH 087/127] ASoC: Add Support for MI US proximity driver - Extracted from MiCode/vendor_qcom_opensource_audio-kernel at branch 'cepheus-q-oss' Signed-off-by: UtsavBalar1231 --- Makefile | 5 + asoc/msm-pcm-routing-v2.c | 7 + dsp/Kbuild | 9 + dsp/apr_mius.c | 467 ++++++ dsp/mius/Makefile | 28 + dsp/mius/io_modules/Makefile | 2 + dsp/mius/io_modules/msm/mius_data_msm_io.c | 108 ++ dsp/mius/io_modules/userspace/Makefile | 2 + .../userspace/mius_data_userspace_ctrl.c | 271 ++++ .../userspace/mius_data_userspace_io.c | 149 ++ dsp/mius/io_modules/userspace_test/Makefile | 2 + .../io_modules/userspace_test/mius_data_io.c | 123 ++ dsp/mius/mius.c | 800 ++++++++++ dsp/mius/mius_mixer_controls.c | 1342 +++++++++++++++++ dsp/mius/mius_sysfs.c | 635 ++++++++ dsp/mius/mius_version.h | 8 + dsp/q6_init.c | 6 + dsp/q6_init.h | 6 + dsp/q6afe.c | 24 + include/dsp/apr_mius.h | 41 + include/mius/mius_data_io.h | 155 ++ include/mius/mius_device.h | 54 + include/mius/mius_mixer_controls.h | 187 +++ include/mius/mius_sysfs.h | 15 + 24 files changed, 4446 insertions(+) create mode 100644 dsp/apr_mius.c create mode 100644 dsp/mius/Makefile create mode 100644 dsp/mius/io_modules/Makefile create mode 100644 dsp/mius/io_modules/msm/mius_data_msm_io.c create mode 100644 dsp/mius/io_modules/userspace/Makefile create mode 100644 dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c create mode 100644 dsp/mius/io_modules/userspace/mius_data_userspace_io.c create mode 100644 dsp/mius/io_modules/userspace_test/Makefile create mode 100644 dsp/mius/io_modules/userspace_test/mius_data_io.c create mode 100644 dsp/mius/mius.c create mode 100644 dsp/mius/mius_mixer_controls.c create mode 100644 dsp/mius/mius_sysfs.c create mode 100644 dsp/mius/mius_version.h create mode 100644 include/dsp/apr_mius.h create mode 100644 include/mius/mius_data_io.h create mode 100644 include/mius/mius_device.h create mode 100644 include/mius/mius_mixer_controls.h create mode 100644 include/mius/mius_sysfs.h diff --git a/Makefile b/Makefile index f3f129b81427..540c6d4bb71f 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,11 @@ LINUXINCLUDE += \ -I$(srctree)/techpack/audio/include/elliptic endif +ifeq ($(CONFIG_US_PROXIMITY), y) +LINUXINCLUDE += \ + -I$(srctree)/techpack/audio/include/mius +endif + ifeq ($(CONFIG_ARCH_SDM845), y) LINUXINCLUDE += \ -include $(srctree)/techpack/audio/config/sdm845autoconf.h diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index ffb4cc3be9e7..ab1ed185e4b4 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -43,6 +43,10 @@ #include #include #endif +#ifdef CONFIG_US_PROXIMITY +#include +#include +#endif #include "msm-pcm-routing-v2.h" #include "msm-pcm-routing-devdep.h" @@ -23937,6 +23941,9 @@ static int msm_routing_probe(struct snd_soc_platform *platform) ARRAY_SIZE(port_multi_channel_map_mixer_controls)); #ifdef CONFIG_ELLIPTIC_ULTRASOUND elliptic_add_platform_controls(platform); +#endif +#ifdef CONFIG_US_PROXIMITY + mius_add_platform_controls(platform); #endif return 0; } diff --git a/dsp/Kbuild b/dsp/Kbuild index 50c0d1eb957c..017354e51ca7 100644 --- a/dsp/Kbuild +++ b/dsp/Kbuild @@ -116,6 +116,15 @@ ifdef CONFIG_ELLIPTIC_ULTRASOUND Q6_OBJS += elliptic/io_modules/userspace/elliptic_data_userspace_io.o Q6_OBJS += elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.o endif +ifdef CONFIG_US_PROXIMITY + Q6_OBJS += apr_mius.o + Q6_OBJS += mius/mius.o + Q6_OBJS += mius/mius_sysfs.o + Q6_OBJS += mius/mius_mixer_controls.o + Q6_OBJS += mius/io_modules/msm/mius_data_msm_io.o + Q6_OBJS += mius/io_modules/userspace/mius_data_userspace_io.o + Q6_OBJS += mius/io_modules/userspace/mius_data_userspace_ctrl.o +endif endif ifdef CONFIG_XT_LOGGING diff --git a/dsp/apr_mius.c b/dsp/apr_mius.c new file mode 100644 index 000000000000..d5b3f41ae6d0 --- /dev/null +++ b/dsp/apr_mius.c @@ -0,0 +1,467 @@ +/** + * Mi + */ + +#include +#include +#include +#include +#include +#include +#include "../asoc/msm-pcm-routing-v2.h" +#include +#include +#include +#include +#include +#include + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +enum { + HALL_SLIDER_UP = 4, + HALL_SLIDER_DOWN = 5, + HALL_SLIDING = 6, +}; + +enum driver_sensor_type { + DRIVER_SENSOR_HALL = 35, +}; + +struct driver_sensor_event { + enum driver_sensor_type type; + union { + int32_t event; + int32_t reserved[2]; + }; +}; + + + +static int afe_set_parameter(int port, + int param_id, + int module_id, + struct afe_mi_ultrasound_set_params_t *prot_config, + uint32_t length) +{ + struct afe_port_cmd_set_param_v2 *set_param_v2 = NULL; + uint32_t set_param_v2_size = sizeof(struct afe_port_cmd_set_param_v2); + struct afe_port_cmd_set_param_v3 *set_param_v3 = NULL; + uint32_t set_param_v3_size = sizeof(struct afe_port_cmd_set_param_v3); + struct param_hdr_v3 param_hdr = {0}; + u16 port_id = 0; + int index = 0; + u8 *packed_param_data = NULL; + int packed_data_size = sizeof(union param_hdrs) + length; + int ret = 0; + + pr_debug("[MIUS]: inside %s\n", __func__); + + port_id = q6audio_get_port_id(port); + ret = q6audio_validate_port(port_id); + if (ret < 0) { + pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, + port_id, ret); + return -EINVAL; + } + index = q6audio_get_port_index(port); + + param_hdr.module_id = module_id; + param_hdr.instance_id = INSTANCE_ID_0; + param_hdr.param_id = param_id; + param_hdr.param_size = length; + pr_debug("[MIUS]: param_size %d\n", length); + + packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); + if (packed_param_data == NULL) + return -ENOMEM; + + ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, (u8 *)prot_config, + &packed_data_size); + if (ret) { + pr_err("%s: Failed to pack param header and data, error %d\n", + __func__, ret); + goto fail_cmd; + } + + if (q6common_is_instance_id_supported()) { + set_param_v3_size += packed_data_size; + set_param_v3 = kzalloc(set_param_v3_size, GFP_KERNEL); + if (set_param_v3 == NULL) { + ret = -ENOMEM; + goto fail_cmd; + } + + set_param_v3->apr_hdr.hdr_field = + APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), + APR_PKT_VER); + set_param_v3->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v3) + + packed_data_size; + set_param_v3->apr_hdr.src_port = 0; + set_param_v3->apr_hdr.dest_port = 0; + set_param_v3->apr_hdr.token = index; + set_param_v3->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; + set_param_v3->port_id = port_id; + set_param_v3->payload_size = packed_data_size; + memcpy(&set_param_v3->param_data, packed_param_data, + packed_data_size); + + atomic_set(mius_afe.ptr_state, 1); + ret = apr_send_pkt(*mius_afe.ptr_apr, (uint32_t *) set_param_v3); + } else { + set_param_v2_size += packed_data_size; + set_param_v2 = kzalloc(set_param_v2_size, GFP_KERNEL); + if (set_param_v2 == NULL) { + ret = -ENOMEM; + goto fail_cmd; + } + + set_param_v2->apr_hdr.hdr_field = + APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), + APR_PKT_VER); + set_param_v2->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v2) + + packed_data_size; + set_param_v2->apr_hdr.src_port = 0; + set_param_v2->apr_hdr.dest_port = 0; + set_param_v2->apr_hdr.token = index; + set_param_v2->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; + set_param_v2->port_id = port_id; + set_param_v2->payload_size = packed_data_size; + memcpy(&set_param_v2->param_data, packed_param_data, + packed_data_size); + + atomic_set(mius_afe.ptr_state, 1); + ret = apr_send_pkt(*mius_afe.ptr_apr, (uint32_t *) set_param_v2); + } + if (ret < 0) { + pr_err("%s: Setting param for port %d param[0x%x]failed\n", + __func__, port, param_id); + goto fail_cmd; + } + ret = wait_event_timeout(mius_afe.ptr_wait[index], + (atomic_read(mius_afe.ptr_state) == 0), + msecs_to_jiffies(mius_afe.timeout_ms*10)); + if (!ret) { + pr_err("%s: wait_event timeout\n", __func__); + ret = -EINVAL; + goto fail_cmd; + } + if (atomic_read(mius_afe.ptr_status) != 0) { + pr_err("%s: set param cmd failed\n", __func__); + ret = -EINVAL; + goto fail_cmd; + } + ret = 0; +fail_cmd: + pr_debug("%s param_id %x status %d\n", __func__, param_id, ret); + kfree(set_param_v2); + kfree(set_param_v3); + kfree(packed_param_data); + return ret; +} + + +int32_t mi_ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, + u8 *user_params, int32_t length) { + + int32_t ret = 0; + uint32_t module_id; + + if (port_id == MIUS_PORT_ID) + module_id = MIUS_ULTRASOUND_MODULE_TX; + else + module_id = MIUS_ULTRASOUND_MODULE_RX; + + ret = afe_set_parameter(port_id, + param_id, module_id, + (struct afe_mi_ultrasound_set_params_t *)user_params, + length); + + return ret; +} + +#if 0 +static int32_t process_version_msg(uint32_t *payload, uint32_t payload_size) +{ + struct mius_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= MIUS_VERSION_INFO_SIZE) { + pr_debug("[MIUS]: mius_version copied to local AP cache"); + data_block = + mius_get_shared_obj( + MIUS_OBJ_ID_VERSION_INFO); + copy_size = min_t(size_t, data_block->size, + (size_t)MIUS_VERSION_INFO_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_branch_msg(uint32_t *payload, uint32_t payload_size) +{ + struct mius_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= MIUS_BRANCH_INFO_SIZE) { + pr_debug("[MIUS]: mius_branch copied to local AP cache"); + data_block = + mius_get_shared_obj( + MIUS_OBJ_ID_BRANCH_INFO); + copy_size = min_t(size_t, data_block->size, + (size_t)MIUS_BRANCH_INFO_MAX_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_tag_msg(uint32_t *payload, uint32_t payload_size) +{ + struct mius_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= MIUS_TAG_INFO_SIZE) { + pr_debug("[MIUS]: mius_tag copied to local AP cache"); + data_block = + mius_get_shared_obj( + MIUS_OBJ_ID_TAG_INFO); + copy_size = min_t(size_t, data_block->size, + (size_t)MIUS_TAG_INFO_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_calibration_msg(uint32_t *payload, uint32_t payload_size) +{ + struct mius_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= MIUS_CALIBRATION_DATA_SIZE) { + pr_debug("[MIUS]: calibration_data copied to local AP cache"); + + data_block = mius_get_shared_obj( + MIUS_OBJ_ID_CALIBRATION_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)MIUS_CALIBRATION_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + mius_set_calibration_data((u8 *)&payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_calibration_v2_msg(uint32_t *payload, uint32_t payload_size) +{ + struct mius_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= MIUS_CALIBRATION_V2_DATA_SIZE) { + pr_debug("[MIUS]: calibration_data copied to local AP cache"); + + data_block = mius_get_shared_obj( + MIUS_OBJ_ID_CALIBRATION_V2_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)MIUS_CALIBRATION_V2_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + mius_set_calibration_data((u8 *)&payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_ml_msg(uint32_t *payload, uint32_t payload_size) +{ + struct mius_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= MIUS_ML_DATA_SIZE) { + pr_debug("[MIUS]: ml_data copied to local AP cache"); + + data_block = mius_get_shared_obj( + MIUS_OBJ_ID_ML_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)MIUS_ML_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_diagnostics_msg(uint32_t *payload, uint32_t payload_size) +{ + struct mius_shared_data_block *data_block = NULL; + size_t copy_size = 0; + int32_t ret = -1; + + pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); + + if (payload_size >= MIUS_DIAGNOSTICS_DATA_SIZE) { + pr_debug("[MIUS]: diagnostics_data copied to local AP cache"); + + data_block = mius_get_shared_obj( + MIUS_OBJ_ID_DIAGNOSTICS_DATA); + copy_size = min_t(size_t, data_block->size, + (size_t)MIUS_DIAGNOSTICS_DATA_SIZE); + + memcpy((u8 *)data_block->buffer, + &payload[3], copy_size); + ret = (int32_t)copy_size; + } + return ret; +} + +static int32_t process_sensorhub_msg(uint32_t *payload, uint32_t payload_size) +{ + int32_t ret = 0; + + pr_err("[MIUS]: %s, paramId:%u, size:%d\n", + __func__, payload[1], payload_size); + + return ret; +} + +#endif + +extern int us_afe_callback(int data); +static int ups_event = 0; + +int32_t mius_process_apr_payload(uint32_t *payload) +{ + uint32_t payload_size = 0; + int32_t ret = -1; + + //if (payload[0] == MIUS_ULTRASOUND_MODULE_TX) { + if (true) { + /* payload format + * payload[0] = Module ID + * payload[1] = Param ID + * payload[2] = LSB - payload size + * MSB - reserved(TBD) + * payload[3] = US data payload starts from here + */ + payload_size = payload[2] & 0xFFFF; +#if 0 + switch (payload[1]) { + case MIUS_ULTRASOUND_PARAM_ID_ENGINE_VERSION: + ret = process_version_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_BUILD_BRANCH: + ret = process_branch_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_TAG: + ret = process_tag_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_DATA: + ret = process_calibration_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA: + ret = process_calibration_v2_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_ML_DATA: + ret = process_ml_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA: + ret = process_diagnostics_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_SENSORHUB: + ret = process_sensorhub_msg(payload, payload_size); + break; + case MIUS_ULTRASOUND_PARAM_ID_ENGINE_DATA: +#endif + printk(KERN_DEBUG "[MIUS] mi us payload[3] = %d",(int)payload[3]); + if (payload[3] == 0 || payload[3] == 1) { + ups_event = payload[3]; + ret = (int32_t)us_afe_callback((const uint32_t)payload[3]); + } else { + + ups_event = ups_event ^ 1; + printk(KERN_DEBUG "[MIUS] >> change ups to %d", ups_event); + ret = (int32_t)us_afe_callback((uint32_t)ups_event); + } + + if (ret != 0) { + pr_err("[MIUS] : failed to push apr payload to mius device"); + return ret; + } + ret = payload_size; +#if 0 + break; + default: + { + pr_err("[MIUS] : mius_process_apr_payload, Illegal paramId:%u", payload[1]); + } + break; + } +#endif + } else { + pr_debug("[MIUS]: Invalid Ultrasound Module ID %d\n", + payload[0]); + } + return ret; +} + +int mius_set_hall_state(int state) +{ + struct driver_sensor_event dse; + int ret = -1; + + dse.type = DRIVER_SENSOR_HALL; + + switch (state) { + case 0: + dse.event = HALL_SLIDER_UP; + break; + case 1: + dse.event = HALL_SLIDER_DOWN; + break; + case 2: + dse.event = HALL_SLIDING; + break; + default: + pr_err("%s Invalid HALL state:%d\n", __func__, state); + return ret; + } + + ret = afe_set_parameter(MIUS_PORT_ID, + 2, MIUS_ULTRASOUND_MODULE_TX, + (struct afe_mi_ultrasound_set_params_t *)&dse, + sizeof(dse)); + return ret; +} +EXPORT_SYMBOL(mius_set_hall_state); diff --git a/dsp/mius/Makefile b/dsp/mius/Makefile new file mode 100644 index 000000000000..70f42362235b --- /dev/null +++ b/dsp/mius/Makefile @@ -0,0 +1,28 @@ +ccflags-y := -I$(src) -Wall -Werror +IO_MODULE := msm + +# EXTRA_CFLAGS += -DDEBUG + +# Need to add include paths: +LINUXINCLUDE += \ + -I$(srctree)techpack/audio/include/dsp \ + -I$(srctree)techpack/audio/include/uapi \ + -I$(srctree)techpack/aduio/include + +obj-y += mius.o +obj-y += mius_mixer_controls.o +obj-y += io_modules/$(IO_MODULE)/mius_data_$(IO_MODULE)_io.o +obj-y += io_modules/userspace/mius_data_userspace_io.o +obj-y += io_modules/userspace/mius_data_userspace_ctrl.o +obj-y += mius_sysfs.o + +# mius_driver-y := mius.o +# mius_driver-y += io_modules/$(IO_MODULE)/mius_data_io.o +# mius_driver-y += mixer_controls/$(MIXER_MODULE)/mius_mixer_controls.o +# mius_driver-y += mius_sysfs.o + +# .PHONY: clean +# all: +# make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules +# clean: +# rm *.o *.ko diff --git a/dsp/mius/io_modules/Makefile b/dsp/mius/io_modules/Makefile new file mode 100644 index 000000000000..66ee789be57f --- /dev/null +++ b/dsp/mius/io_modules/Makefile @@ -0,0 +1,2 @@ +# TODO: add config parameter for which io module to build +#obj-y += userspace/ diff --git a/dsp/mius/io_modules/msm/mius_data_msm_io.c b/dsp/mius/io_modules/msm/mius_data_msm_io.c new file mode 100644 index 000000000000..374af6cca12d --- /dev/null +++ b/dsp/mius/io_modules/msm/mius_data_msm_io.c @@ -0,0 +1,108 @@ +/** + * Copyright MI + * + */ + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#define IO_PING_PONG_BUFFER_SIZE 512 +#define AFE_MSM_RX_PSEUDOPORT_ID 0x8001 +#define AFE_MSM_TX_PSEUDOPORT_ID 0x8002 + +struct mius_msm_io_device { +}; + +/* static struct mius_msm_io_device io_device;*/ + + +int mius_data_io_initialize(void) +{ + return 0; +} + +int mius_data_io_cleanup(void) +{ + return 0; +} +int mius_io_open_port(int portid) +{ + if (portid == ULTRASOUND_RX_PORT_ID) + return afe_start_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); + else + return afe_start_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); +} + +int mius_io_close_port(int portid) +{ + if (portid == ULTRASOUND_RX_PORT_ID) + return afe_stop_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); + else + return afe_stop_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); +} + +int32_t mius_data_io_write(uint32_t message_id, const char *data, + size_t data_size) +{ + int32_t result = 0; + + /* msm_pcm_routing_acquire_lock(); */ + + result = mi_ultrasound_apr_set_parameter(MIUS_PORT_ID, + message_id, (u8 *)data, + (int32_t)data_size); + + /* msm_pcm_routing_release_lock();*/ + return result; +} + +int32_t mius_data_io_transact(uint32_t message_id, const char *data, + size_t data_size, char *output_data, size_t output_data_size) +{ + pr_err("%s : unimplemented\n", __func__); + return -EINVAL; +} diff --git a/dsp/mius/io_modules/userspace/Makefile b/dsp/mius/io_modules/userspace/Makefile new file mode 100644 index 000000000000..34d76dde1eb9 --- /dev/null +++ b/dsp/mius/io_modules/userspace/Makefile @@ -0,0 +1,2 @@ +# TODO: add config parameter for which io module to build +#obj-y += mius_data_io.o diff --git a/dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c b/dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c new file mode 100644 index 000000000000..703d22e1052a --- /dev/null +++ b/dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c @@ -0,0 +1,271 @@ +/** + * Copyright MI + * + */ + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +static dev_t mius_userspace_ctrl_major; +#define USERSPACE_CTRL_IO_DEVICE_NAME "mius_us_ctrl_io" +struct mius_userspace_ctrl_device { + struct cdev cdev; + struct semaphore sem; + int ping_pong_idx; + size_t ping_pong_buffer_size[2]; + uint8_t ping_pong_buffer[2][MIUS_MSG_BUF_SIZE]; + wait_queue_head_t data_available; + struct mutex data_lock; + atomic_t data_state; +}; + + + +static struct mius_userspace_ctrl_device ctrl_device; + +static uint8_t *get_ping_buffer(struct mius_userspace_ctrl_device *dev, + /*out parameter*/ size_t *data_size) +{ + if (data_size != NULL) + *data_size = dev->ping_pong_buffer_size[dev->ping_pong_idx]; + + return dev->ping_pong_buffer[dev->ping_pong_idx]; +} + +static uint8_t *get_pong_buffer(struct mius_userspace_ctrl_device *dev, +/*out parameter*/ size_t *data_size) +{ + if (data_size != NULL) + *data_size = dev->ping_pong_buffer_size[1 - dev->ping_pong_idx]; + + return dev->ping_pong_buffer[1 - dev->ping_pong_idx]; +} + + +static void set_pong_buffer_size(struct mius_userspace_ctrl_device *dev, + size_t data_size) +{ + dev->ping_pong_buffer_size[1 - dev->ping_pong_idx] = data_size; +} + +static void swap_ping_pong(struct mius_userspace_ctrl_device *dev) +{ + dev->ping_pong_idx = 1 - dev->ping_pong_idx; +} + +static int device_open(struct inode *inode, struct file *filp) +{ + if (inode->i_cdev != &ctrl_device.cdev) { + pr_warn("mius : dev pointer mismatch\n"); + return -ENODEV; /* No such device */ + } + + if (down_interruptible(&ctrl_device.sem) != 0) + return -EEXIST; + MI_PRINT_I("Opened device %s", USERSPACE_CTRL_IO_DEVICE_NAME); + return 0; +} + +static ssize_t device_read(struct file *fp, char __user *buff, + size_t user_buf_length, loff_t *ppos) +{ + size_t bytes_read; + unsigned long copy_result; + uint8_t *ping_buffer; + int result; + + if (user_buf_length < MIUS_MSG_BUF_SIZE) + MI_PRINT_E("user space buffer user_buf_length too small : %zu", + user_buf_length); + + bytes_read = 0; + copy_result = 0; + ping_buffer = NULL; + + result = wait_event_interruptible(ctrl_device.data_available, + atomic_read(&ctrl_device.data_state) != 0); + if (result == 0) { + const int state = atomic_read(&ctrl_device.data_state); + + if (state > 0) { + result = mutex_lock_interruptible( + &ctrl_device.data_lock); + if (result == 0) { + swap_ping_pong(&ctrl_device); + + ping_buffer = get_ping_buffer( + &ctrl_device, &bytes_read); + + if (bytes_read > user_buf_length) { + MI_PRINT_E( + "ping buffer size %zu larger than user buffer", + bytes_read); + goto fail; + } + + copy_result = copy_to_user(buff, ping_buffer, + bytes_read); + if (copy_result > 0) { + MI_PRINT_E("Failed copy to user"); + goto fail; + } + + atomic_set(&ctrl_device.data_state, 0); + + mutex_unlock(&ctrl_device.data_lock); + } else if (result == -EINTR) { + MI_PRINT_E("lock interrupted"); + } else { + MI_PRINT_E("lock error = %d", result); + } + } else { + MI_PRINT_W("state = %d", state); + atomic_set(&ctrl_device.data_state, 0); + } + } else if (result == -ERESTARTSYS) { + MI_PRINT_E("interrupted"); + } else { + MI_PRINT_E("wait_event error = %d", result); + } + return bytes_read; +fail: + atomic_set(&ctrl_device.data_state, 0); + mutex_unlock(&ctrl_device.data_lock); + return 0; +} + +static int device_close(struct inode *inode, struct file *filp) +{ + up(&ctrl_device.sem); + MI_PRINT_I("Closed device %s", USERSPACE_CTRL_IO_DEVICE_NAME); + return 0; +} + +static const struct file_operations +mius_userspace_ctrl_fops = { + .owner = THIS_MODULE, + .open = device_open, + .read = device_read, + .release = device_close, +}; + +int mius_userspace_ctrl_driver_init(void) +{ + struct device *device; + dev_t device_number; + int err; + + err = alloc_chrdev_region( + &device_number, 0, 1, USERSPACE_CTRL_IO_DEVICE_NAME); + + if (err < 0) { + pr_err("failed to allocate chrdev region\n"); + return err; + } + + mius_userspace_ctrl_major = MAJOR(device_number); + + device_number = MKDEV(mius_userspace_ctrl_major, 0); + device = device_create( + mius_class, NULL, device_number, + NULL, USERSPACE_CTRL_IO_DEVICE_NAME); + + if (IS_ERR(device)) { + unregister_chrdev( + mius_userspace_ctrl_major, + USERSPACE_CTRL_IO_DEVICE_NAME); + MI_PRINT_E("Failed to create the device\n"); + return PTR_ERR(device); + } + + cdev_init(&ctrl_device.cdev, &mius_userspace_ctrl_fops); + ctrl_device.cdev.owner = THIS_MODULE; + err = cdev_add(&ctrl_device.cdev, device_number, 1); + if (err) { + MI_PRINT_W("error %d while trying to add %s%d", + err, MIUS_DEVICENAME, 0); + return err; + } + + sema_init(&ctrl_device.sem, 1); + mutex_init(&ctrl_device.data_lock); + init_waitqueue_head(&ctrl_device.data_available); + return 0; +} + +void mius_userspace_ctrl_driver_exit(void) +{ + BUG_ON(mius_class == NULL); + device_destroy(mius_class, MKDEV(mius_userspace_ctrl_major, 0)); + cdev_del(&ctrl_device.cdev); + unregister_chrdev(mius_userspace_ctrl_major, + USERSPACE_CTRL_IO_DEVICE_NAME); + up(&ctrl_device.sem); +} + +int32_t mius_userspace_ctrl_write(uint32_t message_id, + const char *data, size_t data_size){ + uint8_t *pong_buffer; + + if (data_size > MIUS_MSG_BUF_SIZE) { + MI_PRINT_E("data size : %zu larger than buf size : %zu", + data_size, (size_t)MIUS_MSG_BUF_SIZE); + + return -EINVAL; + } + mutex_lock(&ctrl_device.data_lock); + + pong_buffer = get_pong_buffer(&ctrl_device, NULL); + set_pong_buffer_size(&ctrl_device, data_size); + + memcpy(pong_buffer, data, data_size); + wake_up_interruptible(&ctrl_device.data_available); + atomic_set(&ctrl_device.data_state, 1); + mutex_unlock(&ctrl_device.data_lock); + + return 0; +} + + diff --git a/dsp/mius/io_modules/userspace/mius_data_userspace_io.c b/dsp/mius/io_modules/userspace/mius_data_userspace_io.c new file mode 100644 index 000000000000..540b3c21853b --- /dev/null +++ b/dsp/mius/io_modules/userspace/mius_data_userspace_io.c @@ -0,0 +1,149 @@ +/** + * Copyright MI + * + */ + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +static dev_t mius_userspace_major; +#define USERSPACE_IO_DEVICE_NAME "mius_us_io" +struct mius_userspace_device { + struct cdev cdev; + struct semaphore sem; +}; + +static struct mius_userspace_device io_device; + +static int device_open(struct inode *inode, struct file *filp) +{ + if (inode->i_cdev != &io_device.cdev) { + pr_warn("mius : dev pointer mismatch\n"); + return -ENODEV; /* No such device */ + } + + if (down_interruptible(&io_device.sem) != 0) + return -EEXIST; + MI_PRINT_I("Opened device %s", USERSPACE_IO_DEVICE_NAME); + return 0; +} + +static ssize_t device_write(struct file *fp, const char __user *buff, + size_t length, loff_t *ppos) +{ + int push_result; + + push_result = mius_data_push( + MIUS_ALL_DEVICES, buff, length, MIUS_DATA_PUSH_FROM_USERSPACE); + + return push_result == 0 ? (ssize_t)length : (ssize_t)(-1); +} + +static int device_close(struct inode *inode, struct file *filp) +{ + up(&io_device.sem); + MI_PRINT_I("Closed device %s", USERSPACE_IO_DEVICE_NAME); + return 0; +} + +static const struct file_operations +mius_userspace_fops = { + .owner = THIS_MODULE, + .open = device_open, + .write = device_write, + .release = device_close, +}; + +int mius_userspace_io_driver_init(void) +{ + struct device *device; + dev_t device_number; + int err; + + err = alloc_chrdev_region( + &device_number, 0, 1, USERSPACE_IO_DEVICE_NAME); + + if (err < 0) { + pr_err("failed to allocate chrdev region\n"); + return err; + } + + mius_userspace_major = MAJOR(device_number); + + device_number = MKDEV(mius_userspace_major, 0); + device = device_create( + mius_class, NULL, device_number, + NULL, USERSPACE_IO_DEVICE_NAME); + + if (IS_ERR(device)) { + unregister_chrdev( + mius_userspace_major, USERSPACE_IO_DEVICE_NAME); + pr_err("Failed to create the device\n"); + return PTR_ERR(device); + } + + cdev_init(&io_device.cdev, &mius_userspace_fops); + io_device.cdev.owner = THIS_MODULE; + err = cdev_add(&io_device.cdev, device_number, 1); + if (err) { + MI_PRINT_W("error %d while trying to add %s%d", + err, MIUS_DEVICENAME, 0); + return err; + } + + sema_init(&io_device.sem, 1); + return 0; +} + +void mius_userspace_io_driver_exit(void) +{ + BUG_ON(mius_class == NULL); + device_destroy(mius_class, MKDEV(mius_userspace_major, 0)); + cdev_del(&io_device.cdev); + unregister_chrdev(mius_userspace_major, USERSPACE_IO_DEVICE_NAME); + up(&io_device.sem); +} + + diff --git a/dsp/mius/io_modules/userspace_test/Makefile b/dsp/mius/io_modules/userspace_test/Makefile new file mode 100644 index 000000000000..34d76dde1eb9 --- /dev/null +++ b/dsp/mius/io_modules/userspace_test/Makefile @@ -0,0 +1,2 @@ +# TODO: add config parameter for which io module to build +#obj-y += mius_data_io.o diff --git a/dsp/mius/io_modules/userspace_test/mius_data_io.c b/dsp/mius/io_modules/userspace_test/mius_data_io.c new file mode 100644 index 000000000000..b2c91254e743 --- /dev/null +++ b/dsp/mius/io_modules/userspace_test/mius_data_io.c @@ -0,0 +1,123 @@ +/** + * Copyright MI + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + + +#define USE_IRQ 11 + +static struct task_struct *simulating_task; +static atomic_t cancel; + +struct mius_data_io_state { +}; +#define BUFFER_SIZE 128 + +static int32_t output_buffer[BUFFER_SIZE]; + +irqreturn_t irq_handler(int irq, void *dev_id) +{ + int result; + + result = mius_data_push(MIUS_ALL_DEVICES, + (const char *)output_buffer, BUFFER_SIZE * sizeof(int32_t)); + return 0; +} + + +static void fill_buffer(int32_t *buffer, size_t len, int32_t value) +{ + size_t i; + + for (i = 0; i < len; ++i) + buffer[i] = value; +} + + +int simulating_thread(void *context) +{ + static int32_t count; + int result; + + count = 0; + msleep(100); + + pr_debug("%s\n", __func__); + while (atomic_read(&cancel) == 0) { + if (kthread_should_stop()) + do_exit(0); + + fill_buffer(output_buffer, BUFFER_SIZE, count); + + ++count; + if (result != 0) { + pr_warn("failed to push data\n"); + } + asm("int $0x3B"); /* Corresponding to irq 11 */ + msleep(0); + } + return 0; +} + +int32_t mius_data_io_write(uint32_t message_id, const char *data, + size_t data_size) { + return 0; + } + +int32_t mius_data_io_transact(uint32_t message_id, const char *data, + size_t data_size, char *output_data, size_t output_data_size) { + return 0; +} + + +void mius_data_io_cancel(struct mius_data *mius_data) +{ + atomic_set(&mius_data->abort_io, 1); + wake_up_interruptible(&mius_data->fifo_isr_not_empty); +} + + +int mius_data_io_initialize(void) +{ + pr_debug("%s\n", __func__); + atomic_set(&cancel, 0); + simulating_task = kthread_run(&simulating_thread, NULL, + "el_simulating_thread"); + + + if (request_irq(USE_IRQ, irq_handler, IRQF_SHARED, "my_device", + (void *)(irq_handler))) { + pr_debug("my_device: cannot register IRQ "); + return -EPERM; + } + + return 0; +} + +int mius_data_io_cleanup(void) +{ + free_irq(USE_IRQ, (void *)(irq_handler)); + kthread_stop(simulating_task); + atomic_set(&cancel, 1); + msleep(200); + return 0; +} diff --git a/dsp/mius/mius.c b/dsp/mius/mius.c new file mode 100644 index 000000000000..e3efe8915572 --- /dev/null +++ b/dsp/mius/mius.c @@ -0,0 +1,800 @@ +/** +* Copyright MI +* +*/ +/* #define DEBUG */ +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +/* Alternative mechanism to load calibration data. +* Read calibration data during driver initialization +* and send message to the DSP +* +* #define MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM 1 +*/ +#ifdef MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM +#include +#include +#include +#endif + +static struct mius_device *mius_devices; + +/* Global variable for the device class*/ +struct class *mius_class; + +typedef uint32_t el_fifo_size_t; + +/* Major number provided by the kernel*/ +static dev_t mius_major; + +static struct wakeup_source *wake_source; + + +void mius_data_cancel(struct mius_data *mius_data) +{ + atomic_set(&mius_data->abort_io, 1); + wake_up_interruptible(&mius_data->fifo_isr_not_empty); +} + +void mius_data_reset_debug_counters(struct mius_data *mius_data) +{ + mius_data->isr_fifo_discard = 0; +} + +void mius_data_print_debug_counters(struct mius_data *mius_data) +{ + if (mius_data->isr_fifo_discard > 0) { + MI_PRINT_E("isr fifo discarded %u frames", + mius_data->isr_fifo_discard); + } + + if (mius_data->userspace_read_total != + mius_data->isr_write_total) { + MI_PRINT_I("user space reads / isr writes : %u / %u", + mius_data->userspace_read_total, + mius_data->isr_write_total); + } + + MI_PRINT_I("total isr fifo discarded frame count : %u", + mius_data->isr_fifo_discard_total); +} + +void mius_data_update_debug_counters(struct mius_data + *mius_data) +{ + mius_data->isr_fifo_discard_total += + mius_data->isr_fifo_discard; +} + + +/* spin lock for isr must be held prior to calling */ +static void mius_data_flush_isr_fifo(struct mius_data + *mius_data) +{ + kfifo_reset(&mius_data->fifo_isr); +} + +/* spin lock for isr must be held prior to calling */ +static void mius_data_isr_fifo_pop(struct mius_data + *mius_data, size_t size) +{ + unsigned int fifo_result; + static uint8_t temp_buffer[MIUS_MSG_BUF_SIZE]; + + if (size > MIUS_MSG_BUF_SIZE) + MI_PRINT_E("pop size %zu too large", size); + + fifo_result = kfifo_out(&mius_data->fifo_isr, + temp_buffer, size); + + if (size != fifo_result) + MI_PRINT_E("failed to pop element"); +} + + +int mius_notify_gain_change_msg(int component_id, int gaindb) +{ + int32_t msg[3] = {MSC_COMPONENT_GAIN_CHANGE, component_id, gaindb}; + + return mius_data_write( + MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +/* inode refers to the actual file on disk */ +static int device_open(struct inode *inode, struct file *filp) +{ + unsigned int major; + unsigned int minor; + struct mius_device *dev; + struct mius_data *mius_data; + + major = imajor(inode); + minor = iminor(inode); + + if (major != mius_major || minor < 0 + || minor >= MIUS_NUM_DEVICES) { + MI_PRINT_W("no device found with minor=%d and major=%d", + major, minor); + return -ENODEV; /* No such device */ + } + + dev = NULL; + dev = &mius_devices[minor]; + filp->private_data = dev; + + if (inode->i_cdev != &dev->cdev) { + MI_PRINT_W("dev pointer mismatch"); + return -ENODEV; /* No such device */ + } + + if (down_interruptible(&dev->sem) != 0) { + MI_PRINT_E("the device has been opened, unable to open lock"); + return -EINVAL; + } + + mius_data = &dev->el_data; + spin_lock(&mius_data->fifo_isr_spinlock); + mius_data_flush_isr_fifo(mius_data); + spin_unlock(&mius_data->fifo_isr_spinlock); + + atomic_set(&mius_data->abort_io, 0); + mius_data_reset_debug_counters(mius_data); + + MI_PRINT_I("Opened device mius%u", minor); + dev->opened = 1; + return 0; +} + + +int mius_data_initialize(struct mius_data + *mius_data, size_t queue_size, + unsigned int wakeup_timeout, int id) +{ + int is_power_of_two; + + is_power_of_two = (queue_size != 0) && !(queue_size & (queue_size - 1)); + + if (is_power_of_two != 1) { + MI_PRINT_E("non power of 2 fifo size"); + return -EINVAL; + } + + if (kfifo_alloc(&mius_data->fifo_isr, + queue_size, GFP_KERNEL) != 0) { + MI_PRINT_E("failed to allocate fifo isr"); + return -EINVAL; + } + + atomic_set(&mius_data->abort_io, 0); + spin_lock_init(&mius_data->fifo_isr_spinlock); + + mius_data->wakeup_timeout = wakeup_timeout; + + mutex_init(&mius_data->user_buffer_lock); + init_waitqueue_head(&mius_data->fifo_isr_not_empty); + + return 0; +} + +int mius_data_cleanup(struct mius_data *mius_data) +{ + spin_unlock(&mius_data->fifo_isr_spinlock); + kfifo_free(&mius_data->fifo_isr); + return 0; +} + +size_t mius_data_pop(struct mius_data + *mius_data, char __user *user_buffer, size_t buffer_size) +{ + int result; + unsigned long num_copied; + unsigned int fifo_result; + unsigned long flags; + + if (buffer_size < MIUS_MSG_BUF_SIZE) { + MI_PRINT_E("buffer_size : %lu smaller than %lu", + buffer_size, (size_t)MIUS_MSG_BUF_SIZE); + return 0; + } + + result = wait_event_interruptible(mius_data->fifo_isr_not_empty, + (kfifo_is_empty(&mius_data->fifo_isr) == 0) + || (atomic_read(&mius_data->abort_io) == 1)); + + if (atomic_read(&mius_data->abort_io) == 1) { + atomic_set(&mius_data->abort_io, 0); + MI_PRINT_D("pop cancelled"); + return 0; + } + + if (result == 0) { + spin_lock_irqsave(&mius_data->fifo_isr_spinlock, flags); + + fifo_result = kfifo_out(&mius_data->fifo_isr, + mius_data->isr_swap_buffer, MIUS_MSG_BUF_SIZE); + + spin_unlock_irqrestore(&mius_data->fifo_isr_spinlock, + flags); + + if (fifo_result == 0) { + MI_PRINT_E("failed to copy: fifo isr -> swap buffer %u", + fifo_result); + return 0; + } + + mutex_lock(&mius_data->user_buffer_lock); + + num_copied = copy_to_user(user_buffer, + mius_data->isr_swap_buffer, + MIUS_MSG_BUF_SIZE); + + mutex_unlock(&mius_data->user_buffer_lock); + + if (num_copied != 0) { + MI_PRINT_E("failed copy to user"); + return 0; + } + ++mius_data->userspace_read_total; + } else { + if (-ERESTARTSYS == result) + MI_PRINT_I("wait interrupted"); + else + MI_PRINT_E("wait error = %d", result); + + return 0; + } + + return (size_t)MIUS_MSG_BUF_SIZE; +} + + + +/* push data to specific device or all devices */ +int mius_data_push(int deviceid, + const char *buffer, + size_t buffer_size, + mius_data_push_t data_source) +{ + size_t available_space; + size_t space_required; + size_t zeros_to_pad; + unsigned int copied_from_user; + int copy_from_user_result; + int err; + int i; + int i_max; + + unsigned long flags; + struct mius_device *device; + struct mius_data *mius_data; + unsigned int fifo_result; + static uint8_t zero_pad_buffer[MIUS_MSG_BUF_SIZE]; + + err = 0; + fifo_result = 0; + copied_from_user = 0; + copy_from_user_result = 0; + if (buffer_size > MIUS_MSG_BUF_SIZE) + return -EINVAL; + + zeros_to_pad = MIUS_MSG_BUF_SIZE - buffer_size; + + i = 0; + i_max = MIUS_NUM_DEVICES; + + if (deviceid != MIUS_ALL_DEVICES) { + /* Copy to specific device */ + i = deviceid; + i_max = i + 1; + } + + for (; i < i_max; ++i) { + device = &mius_devices[i]; + mius_data = &device->el_data; + + if ((!device->opened)) + continue; + + available_space = kfifo_avail(&mius_data->fifo_isr); + space_required = MIUS_MSG_BUF_SIZE; + + spin_lock_irqsave(&mius_data->fifo_isr_spinlock, flags); + + if (available_space < space_required) { + + ++mius_data->isr_fifo_discard; + mius_data_isr_fifo_pop(mius_data, + MIUS_MSG_BUF_SIZE); + } + + if (data_source == MIUS_DATA_PUSH_FROM_KERNEL) { + fifo_result = kfifo_in(&mius_data->fifo_isr, + buffer, buffer_size); + + if (fifo_result == 0) { + spin_unlock_irqrestore( + &mius_data->fifo_isr_spinlock, + flags); + continue; + } + } else if (data_source == MIUS_DATA_PUSH_FROM_USERSPACE) { + copy_from_user_result = kfifo_from_user( + &mius_data->fifo_isr, buffer, + buffer_size, &copied_from_user); + + if (-EFAULT == copy_from_user_result) { + spin_unlock_irqrestore( + &mius_data->fifo_isr_spinlock, + flags); + continue; + } + } + + + if (zeros_to_pad > 0) { + fifo_result = kfifo_in( + &mius_data->fifo_isr, zero_pad_buffer, + zeros_to_pad); + + if (fifo_result == 0) { + mius_data_isr_fifo_pop(mius_data, + buffer_size); + + spin_unlock_irqrestore( + &mius_data->fifo_isr_spinlock, + flags); + + ++mius_data->isr_fifo_discard; + continue; + } + } + + + ++mius_data->isr_write_total; + spin_unlock_irqrestore( + &mius_data->fifo_isr_spinlock, flags); + wake_up_interruptible(&mius_data->fifo_isr_not_empty); + __pm_wakeup_event(wake_source, mius_data->wakeup_timeout); + } + + return err; +} + +int mius_open_port(int portid) +{ + return mius_io_open_port(portid); +} + +int mius_close_port(int portid) +{ + return mius_io_close_port(portid); +} + + +int32_t mius_data_write(uint32_t message_id, + const char *data, size_t data_size) +{ + int32_t err_dsp; + /* int32_t err_us; */ + + err_dsp = 0; + err_dsp = mius_data_io_write(message_id, data, data_size); + if (err_dsp) + MI_PRINT_E("Failed write to DSP"); + return err_dsp; + + /* + * err_us = 0; + * err_us = mius_userspace_ctrl_write(message_id, data, data_size); + * if(err_us){ + * MI_PRINT_E("Failed write to user space"); + *} + * + *return (err_dsp | err_us); + */ +} + + + +/** +* +* @return Number of bytes read. +*/ +static ssize_t device_read(struct file *fp, char __user *buff, + size_t length, loff_t *ppos) +{ + ssize_t bytes_read = 0; + struct mius_device *mius_device; + struct mius_data *mius_data; + + mius_device = (struct mius_device *)fp->private_data; + mius_data = (struct mius_data *)&mius_device->el_data; + + bytes_read = mius_data_pop(mius_data, buff, length); + + return bytes_read; +} + +/** +* +* @return number of bytes actually written +*/ +static ssize_t device_write(struct file *fp, const char *buff, + size_t length, loff_t *ppos) +{ + ssize_t ret_val; + + ret_val = 0; + if ((buff != NULL) && (length != 0)) + ret_val = mius_data_io_write(MIUS_ULTRASOUND_SET_PARAMS, + buff, length); + + return ret_val >= 0 ? (ssize_t)length : 0; +} + + +static long device_ioctl(struct file *fp, unsigned int number, + unsigned long param) +{ + struct mius_device *device; + struct mius_data *mius_data; + int err; + unsigned int mirror_tag, mirror_payload_size; + unsigned char *data_ptr; + + device = (struct mius_device *)(fp->private_data); + mius_data = &device->el_data; + + switch (number) { + case IOCTL_MIUS_DATA_IO_CANCEL: + MI_PRINT_D("IOCTL_MIUS_CANCEL_READ %ld", + param); + mius_data_cancel(mius_data); + break; + + case IOCTL_MIUS_DATA_IO_MIRROR: + data_ptr = (unsigned char *)param; + mirror_tag = *(unsigned int *)data_ptr; + mirror_payload_size = *((unsigned int *)data_ptr + 1); + + if ((mirror_tag == MIRROR_TAG) && + (mirror_payload_size != 0) && + (mirror_payload_size <= + (MIUS_SET_PARAMS_SIZE * 4))) { + + err = mius_data_io_write( + MIUS_ULTRASOUND_SET_PARAMS, + (data_ptr + 8), mirror_payload_size); + + if (err != 0) { + MI_PRINT_E("mius_data_io_write failed"); + return err; + } + + } else { + MI_PRINT_E("TAG or Length is not valid"); + } + + break; + + default: + MI_PRINT_W("UNKNOWN IOCTL number=%d", number); + break; + } + + return 0; +} + + +static unsigned int device_poll(struct file *file, + struct poll_table_struct *poll_table) +{ + unsigned int mask; + + struct mius_device *device; + struct mius_data *mius_data; + + mask = 0; + device = (struct mius_device *)file->private_data; + mius_data = (struct mius_data *)&device->el_data; + + poll_wait(file, &mius_data->fifo_isr_not_empty, poll_table); + + if (!kfifo_is_empty(&mius_data->fifo_isr)) + mask = POLLIN | POLLRDNORM; + + return mask; +} + + +static int device_close(struct inode *inode, struct file *filp) +{ + struct mius_device *device; + struct mius_data *mius_data; + unsigned int minor; + + device = filp->private_data; + mius_data = &device->el_data; + minor = iminor(inode); + if (device == NULL) { + MI_PRINT_E("device not found"); + return -ENODEV; + } + + device->opened = 0; + mius_data_update_debug_counters(mius_data); + mius_data_print_debug_counters(mius_data); + mius_data_cancel(mius_data); + up(&device->sem); + + MI_PRINT_I("Closed device mius%u", minor); + return 0; +} + +/* defines the file operations provided by the driver */ +static const struct file_operations mius_fops = { + .owner = THIS_MODULE, /* prevents unloading when operations are in use*/ + .open = device_open, /*to open the device*/ + .write = device_write, /*to write to the device*/ + .read = device_read, /*to read the device*/ + .poll = device_poll, + .unlocked_ioctl = device_ioctl, /* IOCTL calls */ + .release = device_close, /*to close the device*/ +}; + + +static int mius_device_initialize(struct mius_device + *mius_device, int minor, struct class *class) +{ + int err; + dev_t device_number; + struct device *device; + + BUG_ON(mius_device == NULL || class == NULL); + + err = 0; + device = NULL; + device_number = MKDEV(mius_major, minor); + /* Memory is to be allocated when the device is opened the first time */ + sema_init(&mius_device->sem, 1); + cdev_init(&mius_device->cdev, &mius_fops); + mius_device->cdev.owner = THIS_MODULE; + + err = cdev_add(&mius_device->cdev, device_number, 1); + + if (err) { + MI_PRINT_E("error %d while trying to add %s%d", + err, MIUS_DEVICENAME, minor); + return err; + } + + device = device_create(class, NULL, device_number, + NULL, MIUS_DEVICENAME "%d", minor); + + if (IS_ERR(device)) { + err = PTR_ERR(device); + MI_PRINT_E("error %d while trying to create %s%d", + err, MIUS_DEVICENAME, minor); + cdev_del(&mius_device->cdev); + return err; + } + + if (err) { + MI_PRINT_E("failed device initialize"); + return err; + } + + return 0; +} + +static void mius_device_cleanup(struct mius_device *dev, int minor, + struct class *class) + +{ + BUG_ON(dev == NULL || class == NULL); + device_destroy(class, MKDEV(mius_major, minor)); + cdev_del(&dev->cdev); + up(&dev->sem); +} + +static void mius_driver_cleanup(int devices_to_destroy) +{ + int i; + + if (mius_devices) { + mius_data_io_cleanup(); + + for (i = 0; i < devices_to_destroy; ++i) { + mius_data_cleanup(&mius_devices[i].el_data); + mius_device_cleanup( + &mius_devices[i], i, mius_class); + } + + kfree(mius_devices); + } + + if (mius_class) + class_destroy(mius_class); + + unregister_chrdev_region( + MKDEV(mius_major, 0), MIUS_NUM_DEVICES); +} + + + +#ifdef MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM + +#define MIUS_CALIBRATION_MAX_DATA_SIZE (MIUS_CALIBRATION_V2_DATA_SIZE + MIUS_CALIBRATION_DATA_SIZE) +static unsigned char calibration_data[MIUS_CALIBRATION_MAX_DATA_SIZE]; +static char *calibration_filename = "/persist/audio/mius_calibration"; + +/* function to load the calibration from a file (if possible) */ +static size_t load_calibration_data(char *filename) +{ + size_t ret = 0; + int fd; + + mm_segment_t old_fs = get_fs(); + + set_fs(KERNEL_DS); + + fd = sys_open(filename, O_RDONLY, 0); + if (fd >= 0) { + size_t bytes_read = sys_read(fd, calibration_data, MIUS_CALIBRATION_MAX_DATA_SIZE); + + if (bytes_read == MIUS_CALIBRATION_DATA_SIZE || + bytes_read == MIUS_CALIBRATION_V2_DATA_SIZE) { + ret = bytes_read; + } + sys_close(fd); + } + set_fs(old_fs); + return ret; +} + +static int32_t mius_send_calibration_to_engine(size_t calib_data_size) +{ + mius_set_calibration_data(calibration_data, calib_data_size); + return mius_data_write( + MIUS_ULTRASOUND_SET_PARAMS, + (const char *)calibration_data, calib_data_size); +} + +#endif + + +int __init mius_driver_init(void) +{ + int err; + int i; + int devices_to_destroy; + dev_t device_number; + + err = alloc_chrdev_region(&device_number, 0, MIUS_NUM_DEVICES, + MIUS_DEVICENAME); + + devices_to_destroy = 0; + + if (err < 0) { + MI_PRINT_E("Failed to allocate cdev region"); + return err; + } + + mius_major = MAJOR(device_number); + mius_class = class_create(THIS_MODULE, "mius_chardev"); + + if (mius_class == NULL) { + MI_PRINT_E("Class creation failed"); + goto fail; + } + + err = mius_initialize_sysfs(); + + if (err) + goto fail; + + mius_devices = (struct mius_device *) + kzalloc(sizeof(struct mius_device) * MIUS_NUM_DEVICES, + GFP_KERNEL); + + if (mius_devices == NULL) { + err = -ENOMEM; + goto fail; + } + + + for (i = 0; i < MIUS_NUM_DEVICES; ++i) { + if (mius_device_initialize(&mius_devices[i], i, + mius_class)) { + devices_to_destroy = i; + goto fail; + } + + if (mius_data_initialize(&mius_devices[i].el_data, + MIUS_DATA_FIFO_SIZE, MIUS_WAKEUP_TIMEOUT, i)) { + goto fail; + } + } + + if (mius_data_io_initialize()) + goto fail; + + if (mius_userspace_io_driver_init()) + goto fail; + + + if (mius_userspace_ctrl_driver_init()) + goto fail; + + wake_source = kmalloc(sizeof(struct wakeup_source), GFP_KERNEL); + + if (!wake_source) { + MI_PRINT_E("failed to allocate wake source"); + return -ENOMEM; + } + + wakeup_source_init(wake_source, "mius_wake_source"); + +#ifdef MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM + /* Code to send calibration to engine */ + { + size_t calib_data_size = load_calibration_data(calibration_filename); + if (calib_data_size > 0) + mius_send_calibration_to_engine(calib_data_size); + } +#endif + return 0; + +fail: + mius_driver_cleanup(devices_to_destroy); + return err; +} + +void mius_driver_exit(void) +{ + if (wake_source) { + wakeup_source_trash(wake_source); + kfree(wake_source); + } + + mius_cleanup_sysfs(); + mius_driver_cleanup(MIUS_NUM_DEVICES); + mius_userspace_io_driver_exit(); + mius_userspace_ctrl_driver_exit(); +} + +MODULE_AUTHOR("MI"); +MODULE_DESCRIPTION("Providing Interface to UPS data"); +MODULE_LICENSE("GPL"); diff --git a/dsp/mius/mius_mixer_controls.c b/dsp/mius/mius_mixer_controls.c new file mode 100644 index 000000000000..e1529eb544eb --- /dev/null +++ b/dsp/mius/mius_mixer_controls.c @@ -0,0 +1,1342 @@ +/** + * MI + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct mius_system_configuration { + union { + uint8_t reserved[MIUS_SYSTEM_CONFIGURATION_SIZE]; + }; +}; + +struct mius_system_configuration mius_system_configuration; + + +struct mius_system_configuration_parameter { + enum mius_system_configuration_parameter_type type; + union { + int32_t speaker_scaling[2]; + int32_t sensitivity; + int32_t latency; + int32_t microphone_index; + int32_t operation_mode; + int32_t operation_mode_flags; + int32_t component_gain_change; + int32_t calibration_state; + int32_t engine_version; + int32_t calibration_profile; + int32_t ultrasound_gain; + int32_t log_level; + int32_t custom_setting; + int32_t engine_suspend; + int32_t input_enabled; + int32_t output_enabled; + int32_t external_event; + struct { + int32_t calibration_method; + int32_t calibration_timestamp; + }; + int32_t debug_mode; + int32_t context; + int32_t capture; + int32_t input_channels; + }; +}; + +struct mius_system_configuration_parameters_cache + mius_system_configuration_cache = { {0}, 0 }; + +static struct mius_engine_version_info + mius_engine_version_cache = { 0xde, 0xad, 0xbe, 0xef }; + +struct mius_engine_calibration_data { + union { + uint8_t reserved[MIUS_CALIBRATION_DATA_SIZE]; + }; +}; + +static struct mius_engine_calibration_data + mius_engine_calibration_data_cache = { .reserved = { + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef } }; + +struct mius_engine_calibration_v2_data { + union { + uint8_t reserved[MIUS_CALIBRATION_V2_DATA_SIZE]; + }; +}; + +static struct mius_engine_calibration_v2_data + mius_engine_calibration_v2_data_cache = { .reserved = { + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, + +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, +0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, +0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, +0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, +} }; + +struct mius_engine_diagnostics_data { + union { + uint8_t reserved[MIUS_DIAGNOSTICS_DATA_SIZE]; + uint32_t values32[MIUS_DIAGNOSTICS_DATA_SIZE >> 2]; + }; +}; + +static struct mius_engine_diagnostics_data + mius_engine_diagnostics_data_cache = { .reserved = {0} }; + +struct mius_engine_ml_data { + union { + uint8_t reserved[MIUS_ML_DATA_SIZE]; + uint32_t u32[MIUS_ML_DATA_SIZE >> 2]; + }; +}; + +static struct mius_engine_ml_data + mius_engine_ml_data_cache + = { .reserved = {0} }; + +struct mius_engine_sensor_data { + union { + uint8_t reserved[MIUS_SENSOR_DATA_SIZE]; + uint32_t values32[MIUS_SENSOR_DATA_SIZE >> 2]; + }; +}; + +static struct mius_engine_sensor_data + mius_engine_sensor_data_cache = { .reserved = {0} }; + +struct mius_engine_branch_info { + char build_branch[MIUS_BRANCH_INFO_MAX_SIZE]; +}; + +static struct mius_engine_branch_info + mius_engine_branch_cache = { { 0 } }; + +struct mius_engine_tag_info { + char engine_tag[MIUS_TAG_INFO_SIZE]; +}; + +static struct mius_engine_tag_info + mius_engine_tag_cache = { { 0 } }; + +static struct mius_shared_data_block shared_data_blocks[] = { + { MIUS_OBJ_ID_CALIBRATION_DATA, MIUS_CALIBRATION_DATA_SIZE, + &mius_engine_calibration_data_cache }, + + { MIUS_OBJ_ID_VERSION_INFO, MIUS_VERSION_INFO_SIZE, + &mius_engine_version_cache }, + { MIUS_OBJ_ID_BRANCH_INFO, MIUS_BRANCH_INFO_MAX_SIZE, + &mius_engine_branch_cache }, + { MIUS_OBJ_ID_CALIBRATION_V2_DATA, + MIUS_CALIBRATION_V2_DATA_SIZE, + &mius_engine_calibration_v2_data_cache }, + { MIUS_OBJ_ID_DIAGNOSTICS_DATA, MIUS_DIAGNOSTICS_DATA_SIZE, + &mius_engine_diagnostics_data_cache }, + { MIUS_OBJ_ID_TAG_INFO, MIUS_TAG_INFO_SIZE, + &mius_engine_tag_cache }, + { MIUS_OBJ_ID_ML_DATA, + MIUS_ML_DATA_SIZE, + &mius_engine_ml_data_cache }, +}; + +void mius_set_calibration_data(uint8_t *calib_data, size_t size) +{ + struct mius_shared_data_block *calibration_obj = NULL; + + if (size == MIUS_CALIBRATION_DATA_SIZE) { + calibration_obj = mius_get_shared_obj( + MIUS_OBJ_ID_CALIBRATION_DATA); + memcpy((uint8_t *)&mius_engine_calibration_data_cache, + calib_data, size); + } + if (size == MIUS_CALIBRATION_V2_DATA_SIZE) { + calibration_obj = mius_get_shared_obj( + MIUS_OBJ_ID_CALIBRATION_V2_DATA); + memcpy((uint8_t *)&mius_engine_calibration_v2_data_cache, + calib_data, size); + } + if (calibration_obj == NULL) { + MI_PRINT_E( + "ell..set_calibration_data() calib=NULL (%zu)", size); + return; + } + memcpy((u8 *)calibration_obj->buffer, calib_data, size); +} + +void mius_set_diagnostics_data(uint8_t *diag_data, size_t size) +{ + struct mius_shared_data_block *diagnostics_obj = NULL; + + if (size <= MIUS_DIAGNOSTICS_DATA_SIZE) { + diagnostics_obj = + mius_get_shared_obj( + MIUS_OBJ_ID_DIAGNOSTICS_DATA); + if (diagnostics_obj == NULL) { + MI_PRINT_E("el..set_diagnostics_data() NULL (%zu)", + size); + return; + } + memcpy((uint8_t *)&mius_engine_diagnostics_data_cache, + diag_data, size); + memcpy((u8 *)diagnostics_obj->buffer, diag_data, size); + } +} + +static const size_t NUM_SHARED_RW_OBJS = + sizeof(shared_data_blocks) / sizeof(struct mius_shared_data_block); + +struct mius_shared_data_block *mius_get_shared_obj(uint32_t + object_id) { + + size_t i; + + for (i = 0; i < NUM_SHARED_RW_OBJS; ++i) { + if (shared_data_blocks[i].object_id == object_id) + return &shared_data_blocks[i]; + } + + return NULL; +} + + +static const char * const ultrasound_enable_texts[] = {"Off", "On"}; + +static const struct soc_enum mius_enum[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ultrasound_enable_texts), + ultrasound_enable_texts), +}; + +int get_mius_calibration_data(uint8_t *caldata, uint32_t max_size) +{ + uint32_t copied; + + copied = MIUS_CALIBRATION_DATA_SIZE; + if (max_size < MIUS_CALIBRATION_DATA_SIZE) { + copied = max_size; + MI_PRINT_D("size mismatch : %u vs %u", + (uint32_t)MIUS_CALIBRATION_DATA_SIZE, max_size); + } + + memcpy(caldata, (uint8_t *)&mius_engine_calibration_data_cache, + max_size); + return copied; +} + +int get_mius_calibration_v2_data(uint8_t *caldata, uint32_t max_size) +{ + uint32_t copied; + + copied = MIUS_CALIBRATION_V2_DATA_SIZE; + if (max_size < MIUS_CALIBRATION_V2_DATA_SIZE) { + copied = max_size; + MI_PRINT_D("size mismatch : %u vs %u", + (uint32_t)MIUS_CALIBRATION_V2_DATA_SIZE, max_size); + } + + memcpy(caldata, (uint8_t *)&mius_engine_calibration_v2_data_cache, + max_size); + return copied; +} + +int get_mius_diagnostics_data(uint8_t *diagdata, uint32_t max_size) +{ + uint32_t copied; + + copied = MIUS_DIAGNOSTICS_DATA_SIZE; + if (max_size < MIUS_DIAGNOSTICS_DATA_SIZE) { + copied = max_size; + MI_PRINT_D("size mismatch : %u vs %u", + (uint32_t)MIUS_DIAGNOSTICS_DATA_SIZE, max_size); + } + + memcpy(diagdata, (uint8_t *)&mius_engine_diagnostics_data_cache, + max_size); + return copied; +} + + +static uint32_t ultrasound_enable_cache; + +int mius_ultrasound_enable_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = ultrasound_enable_cache; + return 0; +} + +int mius_ultrasound_enable_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + static bool triggered_engine_info; + int32_t msg[4] = {0, 0, 0, 0}; + + ultrasound_enable_cache = ucontrol->value.integer.value[0]; + + if (!triggered_engine_info && ultrasound_enable_cache) { + triggered_engine_info = true; + mius_trigger_version_msg(); + mius_trigger_branch_msg(); + mius_trigger_tag_msg(); + } + + msg[0] = ultrasound_enable_cache ? 1 : 0; + + return mius_data_write( + MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +static uint32_t ultrasound_tx_port_cache; + +int mius_ultrasound_tx_port_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = ultrasound_tx_port_cache; + return 0; +} + +int mius_ultrasound_tx_port_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int ret; + + if (ultrasound_tx_port_cache == ucontrol->value.integer.value[0]) { + MI_PRINT_E("ultrasound_tx_port_set: ignoring duplicate request"); + return 0; + } + + ultrasound_tx_port_cache = ucontrol->value.integer.value[0]; + printk(KERN_DEBUG "[MIUS] Via ULTRASOUND_TX_PORT_ID enable=%d", ultrasound_tx_port_cache); + if (ultrasound_tx_port_cache) + ret = mius_open_port(ULTRASOUND_TX_PORT_ID); + else + ret = mius_close_port(ULTRASOUND_TX_PORT_ID); + + MI_PRINT_E("ultrasound_tx_port: enable=%d ret=%d", + ultrasound_tx_port_cache, ret); + + return ret; +} + +static uint32_t ultrasound_rx_port_cache; + +int mius_ultrasound_rx_port_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = ultrasound_rx_port_cache; + return 0; +} + +int mius_ultrasound_rx_port_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int ret; + + if (ultrasound_rx_port_cache == ucontrol->value.integer.value[0]) { + MI_PRINT_E("mi ultrasound_rx_port_set: ignoring duplicate request"); + return 0; + } + + ultrasound_rx_port_cache = ucontrol->value.integer.value[0]; + printk(KERN_DEBUG "[MIUS] if we are here, it is wrong for mius, enable=%d", + ultrasound_rx_port_cache); + if (ultrasound_rx_port_cache) + ret = mius_open_port(ULTRASOUND_RX_PORT_ID); + else + ret = mius_close_port(ULTRASOUND_RX_PORT_ID); + + MI_PRINT_E("mi ultrasound_rx_port: enable=%d ret=%d", + ultrasound_rx_port_cache, ret); + + return 0; +} + +int mius_ultrasound_rampdown_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + /* Rampdown is a strobe, so always return Off */ + ucontrol->value.integer.value[0] = 0; + return 0; +} + +int mius_ultrasound_rampdown_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t msg[4] = {-1, 0, 0, 0}; + + if (ucontrol->value.integer.value[0] == 0) + return 0; + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int mius_ultrasound_diagnostics_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + /* Diagnostics is a strobe, so always return Off */ + ucontrol->value.integer.value[0] = 0; + return 0; +} + +int mius_ultrasound_request_diagnostics(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t msg[3] = {MSC_ENGINE_DIAGNOSTICS, 0, 0}; + + if (ucontrol->value.integer.value[0] == 0) + return 0; + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int mius_system_configuration_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &mius_system_configuration, + MIUS_SYSTEM_CONFIGURATION_SIZE); + return 0; +} + +int mius_system_configuration_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&mius_system_configuration, ucontrol->value.bytes.data, + MIUS_SYSTEM_CONFIGURATION_SIZE); + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)&mius_system_configuration, + MIUS_SYSTEM_CONFIGURATION_SIZE); +} + +int mius_calibration_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, + &mius_engine_calibration_data_cache, + MIUS_CALIBRATION_DATA_SIZE); + return 0; +} + +int mius_calibration_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&mius_engine_calibration_data_cache, + ucontrol->value.bytes.data, MIUS_CALIBRATION_DATA_SIZE); + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)&mius_engine_calibration_data_cache, + MIUS_CALIBRATION_DATA_SIZE); +} + +int mius_calibration_v2_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct mius_shared_data_block *calibration_obj = + mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_V2_DATA); + + if (calibration_obj == NULL) { + MI_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + memcpy(ucontrol->value.bytes.data, + calibration_obj->buffer, + MIUS_CALIBRATION_V2_DATA_SIZE); + return 0; +} + +int mius_calibration_v2_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&mius_engine_calibration_v2_data_cache, + ucontrol->value.bytes.data, MIUS_CALIBRATION_V2_DATA_SIZE); + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)&mius_engine_calibration_v2_data_cache, + MIUS_CALIBRATION_V2_DATA_SIZE); +} + +int mius_diagnostics_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, + &mius_engine_diagnostics_data_cache, + MIUS_DIAGNOSTICS_DATA_SIZE); + return 0; +} + +int mius_diagnostics_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int mius_ml_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct mius_shared_data_block *ml_obj = + mius_get_shared_obj(MIUS_OBJ_ID_ML_DATA); + + if (ml_obj == NULL) { + MI_PRINT_E("ml_obj is NULL"); + return -EINVAL; + } + + memcpy(ucontrol->value.bytes.data, + ml_obj->buffer, + MIUS_ML_DATA_SIZE); + return 0; +} + +int mius_ml_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)ucontrol->value.bytes.data, + MIUS_ML_DATA_SIZE); +} + +int mius_sensor_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, + &mius_engine_sensor_data_cache, + MIUS_SENSOR_DATA_SIZE); + return 0; +} + +int mius_sensor_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(&mius_engine_sensor_data_cache, + ucontrol->value.bytes.data, MIUS_SENSOR_DATA_SIZE); + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)&mius_engine_sensor_data_cache, + MIUS_SENSOR_DATA_SIZE); +} + +int mius_version_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &mius_engine_version_cache, + MIUS_VERSION_INFO_SIZE); + return 0; +} + +int mius_version_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int mius_branch_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &mius_engine_branch_cache, + MIUS_BRANCH_INFO_MAX_SIZE); + return 0; +} + +int mius_branch_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int mius_tag_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + memcpy(ucontrol->value.bytes.data, &mius_engine_tag_cache, + MIUS_TAG_INFO_SIZE); + return 0; +} + +int mius_tag_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +int mius_calibration_param_get( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + + if (mc->reg != MIUS_CALIBRATION) + return -EINVAL; + + switch (mc->shift) { + case MIUS_CALIBRATION_STATE: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.calibration_state; + break; + + case MIUS_CALIBRATION_PROFILE: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.calibration_profile; + break; + + case MIUS_ULTRASOUND_GAIN: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.ultrasound_gain; + break; + + default: + return -EINVAL; + } + + return 1; +} + +int mius_calibration_param_put( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct mius_system_configuration_parameter param; + + if (mc->reg != MIUS_CALIBRATION) + return -EINVAL; + + switch (mc->shift) { + case MIUS_CALIBRATION_STATE: + mius_system_configuration_cache.calibration_state = + ucontrol->value.integer.value[0]; + + param.type = MSC_CALIBRATION_STATE; + param.calibration_state = + mius_system_configuration_cache.calibration_state; + break; + + case MIUS_CALIBRATION_PROFILE: + mius_system_configuration_cache.calibration_profile = + ucontrol->value.integer.value[0]; + + param.type = MSC_CALIBRATION_PROFILE; + param.calibration_profile = + mius_system_configuration_cache.calibration_profile; + break; + + case MIUS_ULTRASOUND_GAIN: + mius_system_configuration_cache.ultrasound_gain = + ucontrol->value.integer.value[0]; + param.type = MSC_ULTRASOUND_GAIN; + param.ultrasound_gain = + mius_system_configuration_cache.ultrasound_gain; + break; + + default: + return -EINVAL; + } + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (u8 *)¶m, sizeof(param)); +} + +int mius_system_configuration_param_get( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + + pr_err("%s: reg: %d shift: %d\n", __func__, mc->reg, mc->shift); + + if (mc->reg != MIUS_SYSTEM_CONFIGURATION) + return -EINVAL; + + if (mc->shift >= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && + mc->shift <= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ + MI_PRINT_E("get MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_%02d", + mc->shift - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0); + ucontrol->value.integer.value[0] = 0; + return 1; + } + + switch (mc->shift) { + case MIUS_SYSTEM_CONFIGURATION_LATENCY: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.latency; + break; + + case MIUS_SYSTEM_CONFIGURATION_SENSITIVITY: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.sensitivity; + break; + + case MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.speaker_scaling[0]; + ucontrol->value.integer.value[1] = + mius_system_configuration_cache.speaker_scaling[1]; + break; + + case MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.microphone_index; + break; + + case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.operation_mode; + break; + + case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.operation_mode_flags; + break; + + case MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.log_level; + break; + case MIUS_SYSTEM_CONFIGURATION_SUSPEND: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.engine_suspend; + break; + case MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.input_enabled; + break; + case MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.output_enabled; + break; + case MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.external_event; + break; + case MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.calibration_method; + case MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.debug_mode; + break; + case MIUS_SYSTEM_CONFIGURATION_CONTEXT: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.context; + break; + case MIUS_SYSTEM_CONFIGURATION_CAPTURE: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.capture; + break; + case MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS: + ucontrol->value.integer.value[0] = + mius_system_configuration_cache.input_channels; + break; + + default: + MI_PRINT_E("Invalid mixer control"); + return -EINVAL; + } + + return 1; +} + + + +int mius_system_configuration_param_put( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct mius_system_configuration_parameter param; + struct timeval tv; + + if (mc->reg != MIUS_SYSTEM_CONFIGURATION) + return -EINVAL; + + if (mc->shift >= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && + mc->shift <= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ + const size_t csi = + mc->shift - + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0; + MI_PRINT_E("MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_XX csi:%zu", csi); + if (csi >= + ARRAY_SIZE(mius_system_configuration_cache.custom_settings)) + return -EINVAL; + MI_PRINT_E("ucontrol->value.integer.value[0]:%ld", ucontrol->value.integer.value[0]); + mius_system_configuration_cache.custom_settings[csi] = + ucontrol->value.integer.value[0]; + param.type = MSC_ENGINE_CUSTOM_SETTING_0 + csi; + param.custom_setting = ucontrol->value.integer.value[0]; + MI_PRINT_E("calling mius_data_write(custom_setting) csi:%zu", csi); + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)¶m, sizeof(param)); + } + + + switch (mc->shift) { + case MIUS_SYSTEM_CONFIGURATION_LATENCY: + mius_system_configuration_cache.latency = + ucontrol->value.integer.value[0]; + param.type = MSC_LATENCY; + param.latency = mius_system_configuration_cache.latency; + break; + + case MIUS_SYSTEM_CONFIGURATION_SENSITIVITY: + mius_system_configuration_cache.sensitivity = + ucontrol->value.integer.value[0]; + param.type = MSC_CHANNEL_SENSITIVITY; + param.sensitivity = + mius_system_configuration_cache.sensitivity; + break; + + case MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING: + mius_system_configuration_cache.speaker_scaling[0] = + ucontrol->value.integer.value[0]; + mius_system_configuration_cache.speaker_scaling[1] = + ucontrol->value.integer.value[1]; + param.type = MSC_SPEAKER_SCALING; + param.speaker_scaling[0] = + mius_system_configuration_cache.speaker_scaling[0]; + param.speaker_scaling[1] = + mius_system_configuration_cache.speaker_scaling[1]; + break; + + case MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: + mius_system_configuration_cache.microphone_index = + ucontrol->value.integer.value[0]; + param.type = MSC_MICROPHONE_INDEX; + param.microphone_index = + mius_system_configuration_cache.microphone_index; + break; + + case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE: + mius_system_configuration_cache.operation_mode = + ucontrol->value.integer.value[0]; + param.type = MSC_OPERATION_MODE; + param.operation_mode = + mius_system_configuration_cache.operation_mode; + break; + + case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: + mius_system_configuration_cache.operation_mode_flags = + ucontrol->value.integer.value[0]; + param.type = MSC_OPERATION_MODE_FLAGS; + param.operation_mode_flags = + mius_system_configuration_cache.operation_mode_flags; + break; + + case MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL: + mius_system_configuration_cache.log_level = + ucontrol->value.integer.value[0]; + param.type = MSC_LOG_LEVEL; + param.log_level = + mius_system_configuration_cache.log_level; + break; + case MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED: + mius_system_configuration_cache.input_enabled = + ucontrol->value.integer.value[0]; + param.type = MSC_INPUT_ENABLED; + param.input_enabled = + mius_system_configuration_cache.input_enabled; + break; + case MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: + mius_system_configuration_cache.output_enabled = + ucontrol->value.integer.value[0]; + param.type = MSC_OUTPUT_ENABLED; + param.output_enabled = + mius_system_configuration_cache.output_enabled; + break; + case MIUS_SYSTEM_CONFIGURATION_SUSPEND: + mius_system_configuration_cache.engine_suspend = + ucontrol->value.integer.value[0]; + param.type = MSC_SUSPEND; + param.engine_suspend = + mius_system_configuration_cache.engine_suspend; + break; + case MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: + mius_system_configuration_cache.external_event = + ucontrol->value.integer.value[0]; + param.type = MSC_EXTERNAL_EVENT; + param.external_event = + mius_system_configuration_cache.external_event; + break; + case MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: + mius_system_configuration_cache.calibration_method = + ucontrol->value.integer.value[0]; + param.type = MSC_CALIBRATION_METHOD; + param.calibration_method = + mius_system_configuration_cache.calibration_method; + do_gettimeofday(&tv); + param.calibration_timestamp = (int32_t)tv.tv_sec; + break; + case MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE: + mius_system_configuration_cache.debug_mode = + ucontrol->value.integer.value[0]; + param.type = MSC_DEBUG_MODE; + param.debug_mode = + mius_system_configuration_cache.debug_mode; + break; + case MIUS_SYSTEM_CONFIGURATION_CONTEXT: + mius_system_configuration_cache.context = + ucontrol->value.integer.value[0]; + param.type = MSC_CONTEXT; + param.context = + mius_system_configuration_cache.context; + break; + case MIUS_SYSTEM_CONFIGURATION_CAPTURE: + mius_system_configuration_cache.capture = + ucontrol->value.integer.value[0]; + param.type = MSC_CAPTURE; + param.context = + mius_system_configuration_cache.capture; + break; + case MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS: + mius_system_configuration_cache.input_channels = + ucontrol->value.integer.value[0]; + param.type = MSC_INPUT_CHANNELS; + param.context = + mius_system_configuration_cache.input_channels; + break; + + default: + return -EINVAL; + } + + return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, + (const char *)¶m, sizeof(param)); +} + + +static const struct snd_kcontrol_new ultrasound_filter_mixer_controls[] = { + SOC_ENUM_EXT("Mi_Ultrasound Enable", + mius_enum[0], + mius_ultrasound_enable_get, + mius_ultrasound_enable_set), + SOC_ENUM_EXT("Mi_Ultrasound RampDown", + mius_enum[0], + mius_ultrasound_rampdown_get, + mius_ultrasound_rampdown_set), + SOC_SINGLE_EXT("Mi_Ultrasound Latency", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_LATENCY, + 10000, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Sensitivity", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_SENSITIVITY, + 1000000, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_DOUBLE_EXT("Mi_Ultrasound Speaker Scaling", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING, + 0, + 1000000, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Microphone Index", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX, + 20, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Mode", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE, + 255, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Mode Flags", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS, + 256, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Calibration Profile", + MIUS_CALIBRATION, + MIUS_CALIBRATION_PROFILE, + 256, + 0, + mius_calibration_param_get, + mius_calibration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Gain", + MIUS_CALIBRATION, + MIUS_ULTRASOUND_GAIN, + 256, + 0, + mius_calibration_param_get, + mius_calibration_param_put), + + SOC_SINGLE_EXT("Mi_Ultrasound Calibration State", + MIUS_CALIBRATION, + MIUS_CALIBRATION_STATE, + 256, + 0, + mius_calibration_param_get, + mius_calibration_param_put), + + SND_SOC_BYTES_EXT("Mi_Ultrasound System Configuration", + MIUS_SYSTEM_CONFIGURATION_SIZE, + mius_system_configuration_get, + mius_system_configuration_put), + SND_SOC_BYTES_EXT("Mi_Ultrasound Calibration Data", + MIUS_CALIBRATION_DATA_SIZE, + mius_calibration_data_get, + mius_calibration_data_put), + SND_SOC_BYTES_EXT("Mi_Ultrasound Version", + MIUS_VERSION_INFO_SIZE, + mius_version_data_get, + mius_version_data_put), + SND_SOC_BYTES_EXT("Mi_Ultrasound Branch", + MIUS_BRANCH_INFO_MAX_SIZE, + mius_branch_data_get, + mius_branch_data_put), + SND_SOC_BYTES_EXT("Mi_Ultrasound Tag", + MIUS_TAG_INFO_SIZE, + mius_tag_data_get, + mius_tag_data_put), + SOC_SINGLE_EXT("Mi_Ultrasound Log Level", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL, + 7, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + + SND_SOC_BYTES_EXT("Mi_Ultrasound Calibration Ext Data", + MIUS_CALIBRATION_V2_DATA_SIZE, + mius_calibration_v2_data_get, + mius_calibration_v2_data_put), + + SND_SOC_BYTES_EXT("Mi_Ultrasound Diagnostics Data", + MIUS_DIAGNOSTICS_DATA_SIZE, + mius_diagnostics_data_get, + mius_diagnostics_data_put), + + SOC_ENUM_EXT("Mi_Ultrasound Diagnostics Request", + mius_enum[0], + mius_ultrasound_diagnostics_get, + mius_ultrasound_request_diagnostics), + + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 0", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 1", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 2", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 3", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 4", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 5", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 6", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 7", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 8", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 9", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 10", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 11", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 12", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 13", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 14", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 15", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15, + MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_ENUM_EXT("Mi_Ultrasound Tx Port", + mius_enum[0], + mius_ultrasound_tx_port_get, + mius_ultrasound_tx_port_set), + SOC_ENUM_EXT("Mi_Ultrasound Rx Port", + mius_enum[0], + mius_ultrasound_rx_port_get, + mius_ultrasound_rx_port_set), + SOC_SINGLE_EXT("Mi_Ultrasound Suspend", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_SUSPEND, + 1, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Input", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED, + 1, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Output", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED, + 1, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Event", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT, + 256, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Calibration Method", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD, + 256, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + + SND_SOC_BYTES_EXT("Mi_Ultrasound ML", + MIUS_ML_DATA_SIZE, + mius_ml_data_get, + mius_ml_data_put), + + SOC_SINGLE_EXT("Mi_Ultrasound Debug Mode", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE, + 256, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SOC_SINGLE_EXT("Mi_Ultrasound Context", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CONTEXT, + MIUS_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + SND_SOC_BYTES_EXT("Mi_Ultrasound Sensor Data", + MIUS_SENSOR_DATA_SIZE, + mius_sensor_data_get, + mius_sensor_data_put), + + SOC_SINGLE_EXT("Mi_Ultrasound Capture", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_CAPTURE, + 256, + -1, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + + SOC_SINGLE_EXT("Mi_Ultrasound Tx Channels", + MIUS_SYSTEM_CONFIGURATION, + MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS, + 16, + 0, + mius_system_configuration_param_get, + mius_system_configuration_param_put), + +}; + + + +unsigned int mius_add_platform_controls(void *platform) +{ + const unsigned int num_controls = + ARRAY_SIZE(ultrasound_filter_mixer_controls); + + if (platform != NULL) { + snd_soc_add_platform_controls( + (struct snd_soc_platform *)platform, + ultrasound_filter_mixer_controls, + num_controls); + } else { + MI_PRINT_E("pointer is NULL"); + } + + return num_controls; +} +EXPORT_SYMBOL(mius_add_platform_controls); + +int mius_trigger_version_msg(void) +{ + int32_t msg[3] = {MSC_ENGINE_VERSION, 0, 0}; + + return mius_data_write( + MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int mius_trigger_branch_msg(void) +{ + int32_t msg[3] = {MSC_BUILD_BRANCH, 0, 0}; + + return mius_data_write( + MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int mius_trigger_tag_msg(void) +{ + int32_t msg[3] = {MSC_ENGINE_TAG, 0, 0}; + + return mius_data_write( + MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} + +int mius_trigger_diagnostics_msg(void) +{ + int32_t msg[3] = {MSC_ENGINE_DIAGNOSTICS, 0, 0}; + + return mius_data_write( + MIUS_ULTRASOUND_SET_PARAMS, + (const char *)msg, sizeof(msg)); +} diff --git a/dsp/mius/mius_sysfs.c b/dsp/mius/mius_sysfs.c new file mode 100644 index 000000000000..280fd13cae68 --- /dev/null +++ b/dsp/mius/mius_sysfs.c @@ -0,0 +1,635 @@ +#include +#include +#include +#include +#include +#include +#include +#include "mius_version.h" +#include + + +#define MIUS_DIAGNOSTICS_DATA_SECTION_COUNT 16 +#define MIUS_CALIBRATION_MAX_DISPLAY_COUNT 96 +#define MIUS_ML_DISPLAY_COUNT 16 + +static int kobject_create_and_add_failed; +static int sysfs_create_group_failed; + +extern struct mius_system_configuration_parameters_cache + mius_system_configuration_cache; + +static ssize_t calibration_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct mius_shared_data_block *calibration_obj = + mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_DATA); + + if (calibration_obj == NULL) { + MI_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (count > calibration_obj->size) { + MI_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(calibration_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t calibration_v2_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct mius_shared_data_block *calibration_obj = + mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_V2_DATA); + + if (calibration_obj == NULL) { + MI_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (count > calibration_obj->size) { + MI_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(calibration_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t diagnostics_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct mius_shared_data_block *diagnostics_obj = + mius_get_shared_obj(MIUS_OBJ_ID_DIAGNOSTICS_DATA); + + if (diagnostics_obj == NULL) { + MI_PRINT_E("diagnostics_obj is NULL"); + return -EINVAL; + } + + if (count > diagnostics_obj->size) { + MI_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(diagnostics_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t ml_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) { + + ssize_t result; + + struct mius_shared_data_block *ml_obj = + mius_get_shared_obj(MIUS_OBJ_ID_ML_DATA); + + if (ml_obj == NULL) { + MI_PRINT_E("ml_obj is NULL"); + return -EINVAL; + } + + if (count > ml_obj->size) { + MI_PRINT_E("write length %zu larger than buffer", count); + return 0; + } + + memcpy(ml_obj->buffer, buf, count); + result = (ssize_t)count; + return result; +} + +static ssize_t calibration_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + int i; + uint8_t *caldata; + + struct mius_shared_data_block *calibration_obj = + mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_DATA); + + if (kobject_create_and_add_failed) + MI_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + MI_PRINT_E("sysfs_create_group_failed"); + + if (calibration_obj == NULL) { + MI_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (calibration_obj->size > PAGE_SIZE) { + MI_PRINT_E("calibration_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + caldata = (uint8_t *)calibration_obj->buffer; + length = 0; + if (pretty) { + if (caldata[0] == 0xDE && + caldata[1] == 0xAD) { + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Data: not loaded"); + } else { + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Data: "); + for (i = 0; i < calibration_obj->size; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + } + } else { + for (i = 0; i < calibration_obj->size; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t calibration_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return calibration_show_core(dev, attr, buf, 0); +} + +static ssize_t calibration_v2_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + int i; + uint8_t *caldata; + + struct mius_shared_data_block *calibration_obj = + mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_V2_DATA); + + if (kobject_create_and_add_failed) + MI_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + MI_PRINT_E("sysfs_create_group_failed"); + + if (calibration_obj == NULL) { + MI_PRINT_E("calibration_obj is NULL"); + return -EINVAL; + } + + if (calibration_obj->size > PAGE_SIZE) { + MI_PRINT_E("calibration_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + caldata = (uint8_t *)calibration_obj->buffer; + length = 0; + if (pretty) { + if (caldata[0] == 0xDE && + caldata[1] == 0xAD) { + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Ext Data: not loaded"); + } else { + int j = (MIUS_CALIBRATION_V2_DATA_SIZE>>2) - 1; + + length += snprintf(buf + length, PAGE_SIZE - length, + "Calibration Ext Data: "); + for (i = 0; i < MIUS_CALIBRATION_MAX_DISPLAY_COUNT; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + length += snprintf(buf + length, PAGE_SIZE - length, + "\nTruncated at %d", + MIUS_CALIBRATION_MAX_DISPLAY_COUNT); + length += snprintf(buf + length, PAGE_SIZE - length, + "\nmisc: %u %u %u %u %u %u %u %u\n", + caldata[j-7], caldata[j-6], caldata[j-5], + caldata[j-4], caldata[j-3], caldata[j-2], + caldata[j-1], caldata[j]); + } + } else { + for (i = 0; i < calibration_obj->size; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%02x ", caldata[i]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t calibration_v2_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return calibration_v2_show_core(dev, attr, buf, 0); +} + +static ssize_t diagnostics_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + uint32_t *data32; + int i; + + struct mius_shared_data_block *diagnostics_obj = + mius_get_shared_obj(MIUS_OBJ_ID_DIAGNOSTICS_DATA); + + if (kobject_create_and_add_failed) + MI_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + MI_PRINT_E("sysfs_create_group_failed"); + + if (diagnostics_obj == NULL) { + MI_PRINT_E("diagnostics_obj is NULL"); + return -EINVAL; + } + + if (diagnostics_obj->size > PAGE_SIZE) { + MI_PRINT_E("diagnostics_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + length = 0; + data32 = (uint32_t *)diagnostics_obj->buffer; + + if (pretty) { + length += snprintf(buf + length, PAGE_SIZE - length, + "Diagnostics:\n counters:\n"); + for (i = 0; i < MIUS_DIAGNOSTICS_DATA_SECTION_COUNT; i++) + length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", + data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); + } else { + for (i = 0; i < (diagnostics_obj->size >> 4); ++i) + length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", + data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t diagnostics_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return diagnostics_show_core(dev, attr, buf, 0); +} + +static ssize_t ml_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + int length; + int i; + uint32_t *mldata; + + struct mius_shared_data_block *ml_obj = + mius_get_shared_obj(MIUS_OBJ_ID_ML_DATA); + + if (kobject_create_and_add_failed) + MI_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + MI_PRINT_E("sysfs_create_group_failed"); + + if (ml_obj == NULL) { + MI_PRINT_E("ml_obj is NULL"); + return -EINVAL; + } + + if (ml_obj->size > PAGE_SIZE) { + MI_PRINT_E("ml_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + mldata = (uint32_t *)ml_obj->buffer; + length = 0; + if (pretty) { + if (mldata[0] == 0x0 && + mldata[1] == 0x0) { + length += snprintf(buf + length, PAGE_SIZE - length, + "ML Data: not loaded"); + } else { + length += snprintf(buf + length, PAGE_SIZE - length, + "ML Data: "); + for (i = 0; i < MIUS_ML_DISPLAY_COUNT; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%08x ", mldata[i]); + length += snprintf(buf + length, PAGE_SIZE - length, + "\nTruncated at %d", + MIUS_ML_DISPLAY_COUNT); + } + } else { + int values = ml_obj->size >> 2; + + for (i = 0; i < values; ++i) + length += snprintf(buf + length, PAGE_SIZE - length, + "0x%08x ", mldata[i]); + } + length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); + result = (ssize_t)length; + return result; +} + +static ssize_t ml_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return ml_show_core(dev, attr, buf, 0); +} + + +static ssize_t version_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + ssize_t result; + struct mius_engine_version_info *version_info; + int length; + + struct mius_shared_data_block *version_obj = + mius_get_shared_obj(MIUS_OBJ_ID_VERSION_INFO); + + if (kobject_create_and_add_failed) + MI_PRINT_E("kobject_create_and_add_failed"); + + if (sysfs_create_group_failed) + MI_PRINT_E("sysfs_create_group_failed"); + + if (version_obj == NULL) { + MI_PRINT_E("version_obj is NULL"); + return -EINVAL; + } + + if (version_obj->size > PAGE_SIZE) { + MI_PRINT_E("version_obj->size > PAGE_SIZE"); + return -EINVAL; + } + + version_info = (struct mius_engine_version_info *) + version_obj->buffer; + + if (pretty) { + if (version_info->major == 0xDE && + version_info->minor == 0xAD) { + length = snprintf(buf, PAGE_SIZE, "Version: unknown\n"); + } else { + length = snprintf(buf, PAGE_SIZE, "Version: %d.%d.%d.%d\n", + version_info->major, version_info->minor, + version_info->build, version_info->revision); + } + } else { + length = snprintf(buf, PAGE_SIZE, "%d.%d.%d.%d\n", + version_info->major, version_info->minor, + version_info->build, version_info->revision); + } + result = (ssize_t)length; + return result; +} + +static ssize_t version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return version_show_core(dev, attr, buf, 0); +} + + +static ssize_t branch_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + int length; + + struct mius_shared_data_block *branch_obj = + mius_get_shared_obj(MIUS_OBJ_ID_BRANCH_INFO); + + if (branch_obj == NULL) { + MI_PRINT_E("branch_obj not found"); + return 0; + } + + if (branch_obj->size > PAGE_SIZE) { + MI_PRINT_E("branch_obj->size > PAGE_SIZE"); + return -EINVAL; + } + if (pretty) { + length = snprintf(buf, PAGE_SIZE - 1, "Branch: %s\n", + (const char *)(branch_obj->buffer)); + } else { + length = snprintf(buf, PAGE_SIZE - 1, "%s\n", + (const char *)(branch_obj->buffer)); + } + + return (ssize_t)length; +} + +static ssize_t branch_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return branch_show_core(dev, attr, buf, 0); +} + +static ssize_t tag_show_core(struct device *dev, + struct device_attribute *attr, char *buf, int pretty) +{ + int length; + + struct mius_shared_data_block *tag_obj = + mius_get_shared_obj(MIUS_OBJ_ID_TAG_INFO); + + if (tag_obj == NULL) { + MI_PRINT_E("tag_obj not found"); + return 0; + } + + if (tag_obj->size > PAGE_SIZE) { + MI_PRINT_E("tag_obj->size > PAGE_SIZE"); + return -EINVAL; + } + if (pretty) { + length = snprintf(buf, PAGE_SIZE - 1, "Tag: %s\n", + (const char *)(tag_obj->buffer)); + } else { + length = snprintf(buf, PAGE_SIZE - 1, "%s\n", + (const char *)(tag_obj->buffer)); + } + + return (ssize_t)length; +} + +static ssize_t tag_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return tag_show_core(dev, attr, buf, 0); +} + +static ssize_t cache_show(char *buf, int pretty) +{ + struct mius_system_configuration_parameters_cache *cache = + &mius_system_configuration_cache; + + int length; + + length = snprintf(buf, PAGE_SIZE - 1, "Cache:\n"); + length += snprintf(buf + length, PAGE_SIZE - 1, " mi:%d\n", + cache->microphone_index); + length += snprintf(buf + length, PAGE_SIZE - 1, " om:%d\n", + cache->operation_mode); + length += snprintf(buf + length, PAGE_SIZE - 1, " omf:%d\n", + cache->operation_mode_flags); + length += snprintf(buf + length, PAGE_SIZE - 1, " cs:%d\n", + cache->calibration_state); + length += snprintf(buf + length, PAGE_SIZE - 1, " cp:%d\n", + cache->calibration_profile); + length += snprintf(buf + length, PAGE_SIZE - 1, " ug:%d\n", + cache->ultrasound_gain); + length += snprintf(buf + length, PAGE_SIZE - 1, " ll:%d\n", + cache->log_level); + length += snprintf(buf + length, PAGE_SIZE - 1, " es:%d\n", + cache->engine_suspend); + + return (ssize_t)length; +} + +static ssize_t opmode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int length; + ssize_t result; + + struct mius_system_configuration_parameters_cache *cache = + &mius_system_configuration_cache; + + length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", + cache->operation_mode); + result = (ssize_t)length; + return result; +} + +static ssize_t opmode_flags_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int length; + ssize_t result; + struct mius_system_configuration_parameters_cache *cache = + &mius_system_configuration_cache; + + length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", + cache->operation_mode_flags); + result = (ssize_t)length; + return result; +} + +static ssize_t driver_version_show(char *buf) +{ + int length; + + length = snprintf(buf, PAGE_SIZE, "Driver version: %s-%s (%s)\n", + build_name, build_number, build_source_version); + + return (ssize_t)length; +} + +static ssize_t state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int length = 0; + + length += driver_version_show(buf + length); + length += version_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += branch_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += tag_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += calibration_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += calibration_v2_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += diagnostics_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += ml_show_core(dev, attr, buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + length += cache_show(buf + length, 1); + if (length > PAGE_SIZE) + return (ssize_t)0; + return (ssize_t)length; +} + +static struct device_attribute calibration_attr = __ATTR_RW(calibration); +static struct device_attribute version_attr = __ATTR_RO(version); +static struct device_attribute branch_attr = __ATTR_RO(branch); +static struct device_attribute calibration_v2_attr = __ATTR_RW(calibration_v2); +static struct device_attribute diagnostics_attr = __ATTR_RW(diagnostics); +static struct device_attribute state_attr = __ATTR_RO(state); +static struct device_attribute tag_attr = __ATTR_RO(tag); +static struct device_attribute ml_attr = __ATTR_RW(ml); +static struct device_attribute opmode_attr = __ATTR_RO(opmode); +static struct device_attribute opmode_flags_attr = __ATTR_RO(opmode_flags); + +static struct attribute *mius_attrs[] = { + &calibration_attr.attr, + &version_attr.attr, + &branch_attr.attr, + &calibration_v2_attr.attr, + &diagnostics_attr.attr, + &state_attr.attr, + &tag_attr.attr, + &ml_attr.attr, + &opmode_attr.attr, + &opmode_flags_attr.attr, + NULL, +}; + +static struct attribute_group mius_attr_group = { + .name = MIUS_SYSFS_ENGINE_FOLDER, + .attrs = mius_attrs, +}; + +static struct kobject *mius_sysfs_kobj; + +int mius_initialize_sysfs(void) +{ + int err; + + mius_sysfs_kobj = kobject_create_and_add(MIUS_SYSFS_ROOT_FOLDER, + kernel_kobj->parent); + + if (!mius_sysfs_kobj) { + kobject_create_and_add_failed = 1; + MI_PRINT_E("failed to create kobj"); + return -ENOMEM; + } + + err = sysfs_create_group(mius_sysfs_kobj, &mius_attr_group); + + if (err) { + sysfs_create_group_failed = 1; + MI_PRINT_E("failed to create sysfs group"); + kobject_put(mius_sysfs_kobj); + return -ENOMEM; + } + + return 0; +} + +void mius_cleanup_sysfs(void) +{ + kobject_put(mius_sysfs_kobj); +} diff --git a/dsp/mius/mius_version.h b/dsp/mius/mius_version.h new file mode 100644 index 000000000000..ae6be14654ed --- /dev/null +++ b/dsp/mius/mius_version.h @@ -0,0 +1,8 @@ +#ifndef MIUS_VERSION_H +#define MIUS_VERSION_H + +#define build_name "Mi.LinuxKernelDriver.VendorDLKM.master" +#define build_number "20181016.1" +#define build_source_version "e5e26691554bba9b1438ec3d7e0cc55dfb296bb8" + +#endif //MIUS_VERSION_H diff --git a/dsp/q6_init.c b/dsp/q6_init.c index 4e93672d25b9..04a142fa4762 100644 --- a/dsp/q6_init.c +++ b/dsp/q6_init.c @@ -35,6 +35,9 @@ static int __init audio_q6_init(void) voice_mhi_init(); #ifdef CONFIG_ELLIPTIC_ULTRASOUND elliptic_driver_init(); +#endif +#ifdef CONFIG_US_PROXIMITY + mius_driver_init(); #endif return 0; } @@ -59,6 +62,9 @@ static void __exit audio_q6_exit(void) #ifdef CONFIG_ELLIPTIC_ULTRASOUND elliptic_driver_exit(); #endif +#ifdef CONFIG_US_PROXIMITY + mius_driver_exit(); +#endif } module_init(audio_q6_init); diff --git a/dsp/q6_init.h b/dsp/q6_init.h index d46d665c7622..9886a01f7838 100644 --- a/dsp/q6_init.h +++ b/dsp/q6_init.h @@ -33,6 +33,9 @@ void msm_mdf_exit(void); #ifdef CONFIG_ELLIPTIC_ULTRASOUND int elliptic_driver_init(void); #endif +#ifdef CONFIG_US_PROXIMITY +int mius_driver_init(void); +#endif static inline int msm_mdf_init(void) { return 0; @@ -71,6 +74,9 @@ void adsp_err_exit(void); #ifdef CONFIG_ELLIPTIC_ULTRASOUND int elliptic_driver_exit(void); #endif +#ifdef CONFIG_US_PROXIMITY +int mius_driver_exit(void); +#endif #ifdef CONFIG_VOICE_MHI int voice_mhi_init(void); diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 1198b6ae5a70..11b9352737e6 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -29,6 +29,9 @@ #ifdef CONFIG_ELLIPTIC_ULTRASOUND #include #endif +#ifdef CONFIG_US_PROXIMITY +#include +#endif #include #include "adsp_err.h" #include "q6afecal-hwdep.h" @@ -620,6 +623,16 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) elliptic_process_apr_payload(data->payload); else pr_err("[EXPORT_SYMBOLLUS]: payload ptr is Invalid"); +#endif +#ifdef CONFIG_US_PROXIMITY + } else if (data->opcode == MI_ULTRASOUND_OPCODE) { + if (NULL != data->payload) + { + printk(KERN_DEBUG "[MIUS] mi ultrasound afe afe cb"); + mius_process_apr_payload(data->payload); + } + else + pr_err("[EXPORT_SYMBOLLUS]: payload ptr is Invalid"); #endif } else if (data->payload_size) { uint32_t *payload; @@ -1763,6 +1776,17 @@ afe_ultrasound_state_t elus_afe = { EXPORT_SYMBOL(elus_afe); #endif +#ifdef CONFIG_US_PROXIMITY +afe_mi_ultrasound_state_t mius_afe = { + .ptr_apr= &this_afe.apr, + .ptr_status= &this_afe.status, + .ptr_state= &this_afe.state, + .ptr_wait= this_afe.wait, + .timeout_ms= TIMEOUT_MS, +}; +EXPORT_SYMBOL(mius_afe); +#endif + static void afe_send_cal_spkr_prot_tx(int port_id) { union afe_spkr_prot_config afe_spk_config; diff --git a/include/dsp/apr_mius.h b/include/dsp/apr_mius.h new file mode 100644 index 000000000000..8a372ffe65a2 --- /dev/null +++ b/include/dsp/apr_mius.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include +#include + +#define MIUS_SET_PARAMS_SIZE 114 +#define MIUS_ULTRASOUND_MODULE_TX 0x0F010201 +#define MIUS_ULTRASOUND_MODULE_RX 0x0FF10202 +#define MI_ULTRASOUND_OPCODE 0x0FF10208 + +/* This need to be updated for all platforms */ +#define MIUS_PORT_ID SLIMBUS_2_TX + +/** Sequence of MI Ultrasound module parameters */ +struct afe_mi_ultrasound_set_params_t { + uint32_t payload[MIUS_SET_PARAMS_SIZE]; +} __packed; + +/** Sequence of MI Ultrasound module parameters */ + +/** Elliptic APR public */ + +int32_t mi_ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, + u8 *user_params, int32_t length); + +int32_t mius_process_apr_payload(uint32_t *payload); + +int mius_notify_gain_change_msg(int component_id, int gaindb); + +typedef struct afe_mi_ultrasound_state { + atomic_t us_apr_state; + void **ptr_apr; + atomic_t *ptr_status; + atomic_t *ptr_state; + wait_queue_head_t *ptr_wait; + int timeout_ms; +} afe_mi_ultrasound_state_t; + +extern afe_mi_ultrasound_state_t mius_afe; diff --git a/include/mius/mius_data_io.h b/include/mius/mius_data_io.h new file mode 100644 index 000000000000..7894d420e577 --- /dev/null +++ b/include/mius/mius_data_io.h @@ -0,0 +1,155 @@ +/** +* Copyright MI 2015-2016 +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#define MIUS_DATA_IO_AP_TO_DSP 0 +#define MIUS_DATA_IO_DSP_TO_AP 1 + +#define MIUS_DATA_IO_READ_OK 0 +#define MIUS_DATA_IO_READ_BUSY 1 +#define MIUS_DATA_IO_READ_CANCEL 2 + +#define MIUS_MSG_BUF_SIZE 512 + +/* wake source timeout in ms*/ +#define MIUS_WAKEUP_TIMEOUT 250 + +#define MIUS_DATA_FIFO_SIZE (PAGE_SIZE) + +#define ULTRASOUND_RX_PORT_ID 0 +#define ULTRASOUND_TX_PORT_ID 1 + +/* MI UltraSound Module */ +#define MIUS_ULTRASOUND_DISABLE 0 +#define MIUS_ULTRASOUND_ENABLE 1 +#define MIUS_ULTRASOUND_SET_PARAMS 2 +#define MIUS_ULTRASOUND_GET_PARAMS 3 +#define MIUS_ULTRASOUND_RAMP_DOWN 4 + +/** Param ID definition */ +#define MIUS_ULTRASOUND_PARAM_ID_ENGINE_DATA 3 +#define MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_DATA 11 +#define MIUS_ULTRASOUND_PARAM_ID_ENGINE_VERSION 12 +#define MIUS_ULTRASOUND_PARAM_ID_BUILD_BRANCH 14 +#define MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA 15 +#define MIUS_ULTRASOUND_PARAM_ID_SENSORHUB 16 +#define MIUS_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA 17 +#define MIUS_ULTRASOUND_PARAM_ID_TAG 18 +#define MIUS_ULTRASOUND_PARAM_ID_ML_DATA 19 + +#define MIUS_DATA_READ_BUSY 0 +#define MIUS_DATA_READ_OK 1 +#define MIUS_DATA_READ_CANCEL 2 + +#define MIUS_ALL_DEVICES -1 +#define MIUS_DEVICE_0 0 +#define MIUS_DEVICE_1 1 + +enum mius_message_id { + MIUS_MESSAGE_PAYLOAD, /* Input to AP*/ + MIUS_MESSAGE_RAW, /* Output from AP*/ + MIUS_MESSAGE_CALIBRATION, + MIUS_MESSAGE_CALIBRATION_V2, + MIUS_MESSAGE_DIAGNOSTICS, + MIUS_MAX_MESSAGE_IDS +}; + +typedef enum { + MIUS_DATA_PUSH_FROM_KERNEL, + MIUS_DATA_PUSH_FROM_USERSPACE +} mius_data_push_t; + +struct mius_data { + /* wake lock timeout */ + unsigned int wakeup_timeout; + + /* members for top half interrupt handling */ + struct kfifo fifo_isr; + spinlock_t fifo_isr_spinlock; + wait_queue_head_t fifo_isr_not_empty; + struct mutex user_buffer_lock; + + /* buffer to swap data from isr fifo to userspace */ + uint8_t isr_swap_buffer[MIUS_MSG_BUF_SIZE]; + + atomic_t abort_io; + + /* debug counters, reset between open/close */ + uint32_t isr_fifo_discard; + + /* debug counters, persistent */ + uint32_t isr_fifo_discard_total; + uint32_t userspace_read_total; + uint32_t isr_write_total; + +}; + +/* Elliptic IO module API (implemented by IO module)*/ + +int mius_data_io_initialize(void); +int mius_data_io_cleanup(void); + +int32_t mius_data_io_write(uint32_t message_id, const char *data, + size_t data_size); + +int32_t mius_data_io_transact(uint32_t message_id, const char *data, + size_t data_size, char *output_data, size_t output_data_size); + + +/* Elliptic driver API (implemented by main driver)*/ +int mius_data_initialize(struct mius_data *, + size_t max_queue_size, unsigned int wakeup_timeout, int id); + +int mius_data_cleanup(struct mius_data *); + +void mius_data_reset_debug_counters(struct mius_data *); +void mius_data_update_debug_counters(struct mius_data *); +void mius_data_print_debug_counters(struct mius_data *); + +/* Called from mius device read */ +size_t mius_data_pop(struct mius_data *, + char __user *buffer, size_t buffer_size); + +/* Used for cancelling a blocking read */ +void mius_data_cancel(struct mius_data *); + +/* Called from IO module*/ +int mius_data_push(int deviceid, const char *buffer, size_t buffer_size, mius_data_push_t); + +/* Writes to io module and user space control */ +int32_t mius_data_write(uint32_t message_id, + const char *data, size_t data_size); + +/* Opens port */ +int mius_open_port(int portid); + +/* Closes port */ +int mius_close_port(int portid); + +/* Opens port */ +int mius_io_open_port(int portid); + +/* Closes port */ +int mius_io_close_port(int portid); + +/* Create device node for userspace io driver*/ +int mius_userspace_io_driver_init(void); +void mius_userspace_io_driver_exit(void); + +/* Create device node for userspace io driver*/ +int mius_userspace_ctrl_driver_init(void); +void mius_userspace_ctrl_driver_exit(void); +int32_t mius_userspace_ctrl_write(uint32_t message_id, + const char *data, size_t data_size); + diff --git a/include/mius/mius_device.h b/include/mius/mius_device.h new file mode 100644 index 000000000000..215963d8f240 --- /dev/null +++ b/include/mius/mius_device.h @@ -0,0 +1,54 @@ +/** + * Copyright MI + * + */ + +#pragma once + +#include +#include +#include +#include + +#define MIUS_DEVICENAME "mius" +#define MIUS_NUM_DEVICES 2 + +#define IOCTL_MIUS_APP 197 +#define MIRROR_TAG 0x3D0A4842 + +#define IOCTL_MIUS_DATA_IO_CANCEL \ + _IO(IOCTL_MIUS_APP, 2) + +#define IOCTL_MIUS_ACTIVATE_ENGINE \ + _IOW(IOCTL_MIUS_APP, 3, int) + +#define IOCTL_MIUS_SET_RAMP_DOWN \ + _IO(IOCTL_MIUS_APP, 4) + +#define IOCTL_MIUS_SYSTEM_CONFIGURATION \ + _IOW(IOCTL_MIUS_APP, 5, int) + +#define IOCTL_MIUS_DATA_IO_MIRROR \ + _IOW(IOCTL_MIUS_APP, 117, unsigned char *) + +struct mius_device { + int opened; + struct cdev cdev; + struct semaphore sem; + struct mius_data el_data; +}; + +extern struct class *mius_class; + +#define MI_PRINT_E(string, arg...) \ + pr_err("[MIUS] : (%s) : " string "\n", __func__, ##arg) + +#define MI_PRINT_W(string, arg...) \ + pr_warn("[MIUS] : (%s) : " string "\n", __func__, ##arg) + +#define MI_PRINT_I(string, arg...) \ + pr_info("[MIUS] : (%s) : " string "\n", __func__, ##arg) + +#define MI_PRINT_D(string, arg...) \ + pr_debug("[MIUS] : (%s) : " string "\n", __func__, ##arg) + diff --git a/include/mius/mius_mixer_controls.h b/include/mius/mius_mixer_controls.h new file mode 100644 index 000000000000..5be6060d340b --- /dev/null +++ b/include/mius/mius_mixer_controls.h @@ -0,0 +1,187 @@ +#pragma once +#include +#include +#include +#include + + +#define MIUS_OBJ_ID_CALIBRATION_DATA 1 +#define MIUS_OBJ_ID_VERSION_INFO 2 +#define MIUS_OBJ_ID_BRANCH_INFO 3 +#define MIUS_OBJ_ID_CALIBRATION_V2_DATA 4 +#define MIUS_OBJ_ID_DIAGNOSTICS_DATA 5 +#define MIUS_OBJ_ID_TAG_INFO 6 +#define MIUS_OBJ_ID_ML_DATA 7 + +#define MIUS_SYSTEM_CONFIGURATION_SIZE 96 +#define MIUS_CALIBRATION_DATA_SIZE 64 +#define MIUS_CALIBRATION_V2_DATA_SIZE 448 +#define MIUS_DIAGNOSTICS_DATA_SIZE 448 +#define MIUS_DIAGNOSTICS_U32_DATA_VALUES (MIUS_DIAGNOSTICS_DATA_SIZE>>2) +#define MIUS_SENSOR_DATA_SIZE 68 +#define MIUS_SENSOR_U32_DATA_VALUES (MIUS_SENSOR_DATA_SIZE>>2) +#define MIUS_VERSION_INFO_SIZE 16 +#define MIUS_BRANCH_INFO_SIZE 32 +#define MIUS_BRANCH_INFO_MAX_SIZE 128 +#define MIUS_TAG_INFO_SIZE 32 +#define MIUS_ML_DATA_SIZE 432 + +#define MIUS_ULTRASOUND_DISABLE 0 +#define MIUS_ULTRASOUND_ENABLE 1 +#define MIUS_ULTRASOUND_SET_PARAMS 2 +#define MIUS_ULTRASOUND_GET_PARAMS 3 +#define MIUS_ULTRASOUND_RAMP_DOWN 4 + +/** register */ +#define MIUS_CALIBRATION 1 +/** bits */ +#define MIUS_CALIBRATION_STATE 0 +#define MIUS_CALIBRATION_PROFILE 1 +#define MIUS_ULTRASOUND_GAIN 2 + +/** custom settings */ +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT 16 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE 0x7FFFFFFF + +/** register */ +#define MIUS_SYSTEM_CONFIGURATION 0 +/** bits */ +#define MIUS_SYSTEM_CONFIGURATION_LATENCY 0 +#define MIUS_SYSTEM_CONFIGURATION_SENSITIVITY 1 +#define MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING 2 +#define MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX 3 +#define MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE 4 +#define MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS 5 +#define MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL 6 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 7 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1 8 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2 9 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3 10 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4 11 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5 12 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6 13 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7 14 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8 15 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9 16 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10 17 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11 18 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12 19 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13 20 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14 21 +#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15 22 + +#define MIUS_SYSTEM_CONFIGURATION_SUSPEND 23 +#define MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED 24 +#define MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED 25 +#define MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT 26 +#define MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD 27 +#define MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE 28 +#define MIUS_SYSTEM_CONFIGURATION_NUMBER_OF_RUNS 29 +#define MIUS_SYSTEM_CONFIGURATION_CONTEXT 30 +#define MIUS_SYSTEM_CONFIGURATION_CAPTURE 31 +#define MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS 32 + +#define MIUS_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE 0x7FFFFFFF + + +struct mius_engine_version_info { + uint32_t major; + uint32_t minor; + uint32_t build; + uint32_t revision; +}; + +struct mius_shared_data_block { + uint32_t object_id; + size_t size; + void *buffer; +}; + +struct mius_shared_data_block *mius_get_shared_obj(uint32_t + object_id); + +extern unsigned int mius_add_platform_controls(void *platform); + +void mius_set_calibration_data(uint8_t *calib_data, size_t size); + +enum mius_system_configuration_parameter_type { + + MSC_SPEAKER_SCALING = 1, + MSC_CHANNEL_SENSITIVITY, + MSC_LATENCY, + MSC_MICROPHONE_INDEX, + MSC_OPERATION_MODE, + MSC_OPERATION_MODE_FLAGS, + MSC_COMPONENT_GAIN_CHANGE, + MSC_CALIBRATION_STATE, + MSC_ENGINE_VERSION, + MSC_CALIBRATION_PROFILE, + MSC_ULTRASOUND_GAIN, + MSC_LOG_LEVEL, + MSC_BUILD_BRANCH, //13 + + MSC_FSELECTION, + MSC_ENGINE_DIAGNOSTICS, + MSC_ENGINE_CUSTOM_SETTING_0, + MSC_ENGINE_CUSTOM_SETTING_1, + MSC_ENGINE_CUSTOM_SETTING_2, + MSC_ENGINE_CUSTOM_SETTING_3, + MSC_ENGINE_CUSTOM_SETTING_4, + MSC_ENGINE_CUSTOM_SETTING_5, + MSC_ENGINE_CUSTOM_SETTING_6, + MSC_ENGINE_CUSTOM_SETTING_7, + MSC_ENGINE_CUSTOM_SETTING_8, + MSC_ENGINE_CUSTOM_SETTING_9, + MSC_ENGINE_CUSTOM_SETTING_10, + MSC_ENGINE_CUSTOM_SETTING_11, + MSC_ENGINE_CUSTOM_SETTING_12, + MSC_ENGINE_CUSTOM_SETTING_13, + MSC_ENGINE_CUSTOM_SETTING_14, + MSC_ENGINE_CUSTOM_SETTING_15, + MSC_SUSPEND, // 32 + MSC_INPUT_ENABLED, + MSC_OUTPUT_ENABLED, + MSC_EXTERNAL_EVENT, + MSC_ENGINE_TAG, //36 + MSC_CALIBRATION_METHOD, + MSC_DEBUG_MODE, + MSC_NUMBER_OF_RUNS, + MSC_CONTEXT, + MSC_CAPTURE, + MSC_INPUT_CHANNELS, +}; + +struct mius_system_configuration_parameters_cache { + int32_t speaker_scaling[2]; + int32_t sensitivity; + int32_t latency; + int32_t microphone_index; + int32_t operation_mode; + int32_t operation_mode_flags; + int32_t component_gain_change; + int32_t calibration_state; + int32_t engine_version; + int32_t calibration_profile; + int32_t ultrasound_gain; + int32_t log_level; + int32_t custom_settings[MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT]; + int32_t engine_suspend; + int32_t input_enabled; + int32_t output_enabled; + int32_t external_event; + int32_t calibration_method; + int32_t debug_mode; + int32_t number_of_runs; + int32_t context; + int32_t capture; + int32_t input_channels; +}; + + +int mius_trigger_version_msg(void); + +int mius_trigger_branch_msg(void); + +int mius_trigger_tag_msg(void); + +int mius_trigger_diagnostics_msg(void); diff --git a/include/mius/mius_sysfs.h b/include/mius/mius_sysfs.h new file mode 100644 index 000000000000..5f89b35408de --- /dev/null +++ b/include/mius/mius_sysfs.h @@ -0,0 +1,15 @@ +#pragma once + +#define MIUS_SYSFS_ENGINE_FOLDER "engine" +#define MIUS_SYSFS_ROOT_FOLDER "mius" +#define MIUS_SYSFS_CALIBRATION_FILENAME "calibration" +#define MIUS_SYSFS_VERSION_FILENAME "version" +#define MIUS_SYSFS_CALIBRATION_V2_FILENAME "calibration_v2" +#define MIUS_SYSFS_STATE_FILENAME "state" +#define MIUS_SYSFS_TAG_FILENAME "tag" +#define MIUS_SYSFS_OPMODE_FILENAME "opmode" +#define MIUS_SYSFS_OPMODE_FLAGS_FILENAME "opmode_flags" + + +int mius_initialize_sysfs(void); +void mius_cleanup_sysfs(void); From 9651026cc78788a97922b86d11fca965ea145480 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 18:08:27 +0530 Subject: [PATCH 088/127] ASoC: Add Support for msm cirrus playback driver - Extracted from MiCode/vendor_qcom_opensource_audio-kernel at branch 'cepheus-q-oss' Signed-off-by: UtsavBalar1231 --- asoc/msm-pcm-routing-v2.c | 12 + config/sm8150auto.conf | 1 + config/sm8150autoconf.h | 1 + dsp/Kbuild | 4 + dsp/msm-cirrus-playback.c | 1539 ++++++++++++++++++++++ dsp/q6_init.c | 6 + dsp/q6_init.h | 6 + dsp/q6afe.c | 43 + include/dsp/msm-cirrus-playback.h | 184 +++ include/dsp/q6afe-v2.h | 5 + include/uapi/sound/msm-cirrus-playback.h | 119 ++ 11 files changed, 1920 insertions(+) create mode 100755 dsp/msm-cirrus-playback.c create mode 100755 include/dsp/msm-cirrus-playback.h create mode 100755 include/uapi/sound/msm-cirrus-playback.h diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index ab1ed185e4b4..63a90091bb42 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -54,6 +54,10 @@ #include "msm-dolby-dap-config.h" #include "msm-ds2-dap-config.h" +#ifdef CONFIG_MSM_CSPL +#include +#endif + #ifndef CONFIG_DOLBY_DAP #undef DOLBY_ADM_COPP_TOPOLOGY_ID #define DOLBY_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFE @@ -23861,6 +23865,10 @@ static const struct snd_pcm_ops msm_routing_pcm_ops = { .prepare = msm_pcm_routing_prepare, }; +#ifdef CONFIG_MSM_CSPL + extern void msm_crus_pb_add_controls(struct snd_soc_platform *platform); +#endif + /* Not used but frame seems to require it */ static int msm_routing_probe(struct snd_soc_platform *platform) { @@ -23924,6 +23932,10 @@ static int msm_routing_probe(struct snd_soc_platform *platform) msm_routing_be_dai_name_table_mixer_controls, ARRAY_SIZE(msm_routing_be_dai_name_table_mixer_controls)); +#ifdef CONFIG_MSM_CSPL + msm_crus_pb_add_controls(platform); +#endif + snd_soc_add_platform_controls(platform, msm_source_tracking_controls, ARRAY_SIZE(msm_source_tracking_controls)); snd_soc_add_platform_controls(platform, adm_channel_config_controls, diff --git a/config/sm8150auto.conf b/config/sm8150auto.conf index 76fed3ae1bbf..1e11a2615d43 100644 --- a/config/sm8150auto.conf +++ b/config/sm8150auto.conf @@ -45,3 +45,4 @@ CONFIG_SND_SOC_TAS2557=m CONFIG_TAS2557_REGMAP=m CONFIG_TAS2557_CODEC=m CONFIG_TAS2557_MISC=m +CONFIG_MSM_CSPL=y diff --git a/config/sm8150autoconf.h b/config/sm8150autoconf.h index 2824bd5b6775..806fc0ce5822 100644 --- a/config/sm8150autoconf.h +++ b/config/sm8150autoconf.h @@ -57,3 +57,4 @@ #define CONFIG_TAS2557_CODEC 1 #define CONFIG_TAS2557_MISC 1 #define CONFIG_ELLIPTIC_ULTRASOUND 1 +#define CONFIG_MSM_CSPL 1 diff --git a/dsp/Kbuild b/dsp/Kbuild index 017354e51ca7..6fc0e9fba08a 100644 --- a/dsp/Kbuild +++ b/dsp/Kbuild @@ -159,6 +159,10 @@ ifdef CONFIG_MSM_MDF Q6_OBJS += msm_mdf.o endif +ifdef CONFIG_MSM_CSPL + Q6_OBJS += msm-cirrus-playback.o +endif + ifdef CONFIG_VOICE_MHI Q6_OBJS += voice_mhi.o endif diff --git a/dsp/msm-cirrus-playback.c b/dsp/msm-cirrus-playback.c new file mode 100755 index 000000000000..251bce5d9d51 --- /dev/null +++ b/dsp/msm-cirrus-playback.c @@ -0,0 +1,1539 @@ +/* Copyright (c) 2015, 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 +* only version 2 as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +/* includes the file structure, that is, file open read close */ +#include + +/* include the character device, makes cdev avilable */ +#include +#include + +/* includes copy_user vice versa */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "../asoc/msm-pcm-routing-v2.h" +#include +#include +#include +#include +#include + +#undef CONFIG_OF + +#undef pr_info +#undef pr_err +#undef pr_debug +#define pr_debug(fmt, args...) printk(KERN_INFO "[CSPL] " pr_fmt(fmt), ##args) +#define pr_info(fmt, args...) printk(KERN_INFO "[CSPL] " pr_fmt(fmt), ##args) +#define pr_err(fmt, args...) printk(KERN_ERR "[CSPL] " pr_fmt(fmt), ##args) + +#define CRUS_TX_CONFIG "crus_sp_tx%d.bin" +#define CRUS_RX_CONFIG "crus_sp_rx%d.bin" + +#define CIRRUS_RX_GET_IODATA 0x00A1AF09 +#define CIRRUS_TX_GET_IODATA 0x00A1BF09 + +static struct crus_sp_ioctl_header crus_sp_hdr; + +static struct crus_control_t this_ctrl = { + .fb_port_index = 3, + .fb_port = AFE_PORT_ID_QUATERNARY_MI2S_TX, + .ff_port = AFE_PORT_ID_QUATERNARY_MI2S_RX, + .usecase_dt_count = MAX_TUNING_CONFIGS, + .ch_sw_duration = 30, + .ch_sw = 0, + .vol_atten = 0, + .prot_en = false, + .q6afe_rev = 3, // V3 as default +}; + + +static void *crus_gen_afe_get_header(int length, int port, int module, + int param) +{ + struct afe_custom_crus_get_config_v2_t *config = NULL; + int size = sizeof(struct afe_custom_crus_get_config_v2_t); + int index = afe_get_port_index(port); + uint16_t payload_size = sizeof(struct param_hdr_v2) + + length; + + /* Allocate memory for the message */ + config = kzalloc(size, GFP_KERNEL); + if (!config) + return NULL; + + /* Set header section */ + config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, + APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); + config->hdr.pkt_size = size; + config->hdr.src_svc = APR_SVC_AFE; + config->hdr.src_domain = APR_DOMAIN_APPS; + config->hdr.src_port = 0; + config->hdr.dest_svc = APR_SVC_AFE; + config->hdr.dest_domain = APR_DOMAIN_ADSP; + config->hdr.dest_port = 0; + config->hdr.token = index; + config->hdr.opcode = AFE_PORT_CMD_GET_PARAM_V2; + + /* Set param section */ + config->param.port_id = (uint16_t) port; + + config->param.mem_hdr.data_payload_addr_lsw = 0; + config->param.mem_hdr.data_payload_addr_msw = 0; + config->param.mem_hdr.mem_map_handle = 0; + config->param.module_id = (uint32_t) module; + config->param.param_id = (uint32_t) param; + /* max data size of the param_ID/module_ID combination */ + config->param.payload_size = payload_size; + + /* Set data section */ + config->data.module_id = (uint32_t) module; + config->data.param_id = (uint32_t) param; + + /*remove for 855*/ + //config->data.reserved = 0; /* Must be set to 0 */ + /* actual size of the data for the module_ID/param_ID pair */ + config->data.param_size = length; + + return (void *)config; +} + + +static void *crus_gen_afe_set_header(int length, int port, int module, + int param) +{ + struct afe_custom_crus_set_config_v2_t *config = NULL; + int size = sizeof(struct afe_custom_crus_set_config_v2_t) + length; + int index = afe_get_port_index(port); + uint16_t payload_size = sizeof(struct param_hdr_v2) + + length; + + /* Allocate memory for the message */ + config = kzalloc(size, GFP_KERNEL); + if (!config) + return NULL; + + /* Set header section */ + config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, + APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); + config->hdr.pkt_size = size; + config->hdr.src_svc = APR_SVC_AFE; + config->hdr.src_domain = APR_DOMAIN_APPS; + config->hdr.src_port = 0; + config->hdr.dest_svc = APR_SVC_AFE; + config->hdr.dest_domain = APR_DOMAIN_ADSP; + config->hdr.dest_port = 0; + config->hdr.token = index; + config->hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; + + /* Set param section */ + config->param.port_id = (uint16_t) port; + config->param.mem_hdr.data_payload_addr_lsw = 0; + config->param.mem_hdr.data_payload_addr_msw = 0; + config->param.mem_hdr.mem_map_handle = 0; + /* max data size of the param_ID/module_ID combination */ + config->param.payload_size = payload_size; + + /* Set data section */ + config->data.module_id = (uint32_t) module; + config->data.param_id = (uint32_t) param; + + /*remove for 855*/ + //config->data.reserved = 0; /* Must be set to 0 */ + + /* actual size of the data for the module_ID/param_ID pair */ + config->data.param_size = length; + + return (void *)config; +} + +static int crus_afe_get_param(int port, int module, int param, int length, + void *data) +{ + struct afe_custom_crus_get_config_v2_t *config = NULL; + int index = afe_get_port_index(port); + int ret = 0, count = 0; + + pr_info("CRUS_SP: (get_param) module = 0x%08x, port = 0x%08x, param = 0x%08x\n", + module, port, param); + + config = (struct afe_custom_crus_get_config_v2_t *) + crus_gen_afe_get_header(length, port, module, param); + if (config == NULL) { + pr_err("CRUS_SP: Memory allocation failed\n"); + return -ENOMEM; + } + + mutex_lock(&this_ctrl.param_lock); + atomic_set(&this_ctrl.callback_wait, 0); + + this_ctrl.user_buffer = kzalloc(config->param.payload_size + 16, + GFP_KERNEL); + + ret = afe_apr_send_pkt_crus(config, index, 0); + if (ret) + pr_err("CRUS_SP: (get_param) failed with code %d\n", ret); + + /* Wait for afe callback to populate data */ + while (!atomic_read(&this_ctrl.callback_wait)) { + usleep_range(800, 1200); + if (count++ >= 1000) { + pr_err("CRUS_SP: AFE callback timeout\n"); + atomic_set(&this_ctrl.callback_wait, 1); + ret = -EINVAL; + goto exit; + } + } + + /* Copy from dynamic buffer to return buffer */ + memcpy((u8 *)data, &this_ctrl.user_buffer[4], length); + +exit: + kfree(this_ctrl.user_buffer); + mutex_unlock(&this_ctrl.param_lock); + kfree(config); + return ret; +} + + + +static int crus_afe_set_param(int port, int module, int param, int length, + void *data_ptr) +{ + struct afe_custom_crus_set_config_v2_t *config = NULL; + int index = afe_get_port_index(port); + int ret = 0; + + pr_info("CRUS_SP: (set_param) module = 0x%08x, port = 0x%08x, param = 0x%08x\n", + module, port, param); + + config = crus_gen_afe_set_header(length, port, module, param); + if (config == NULL) { + pr_err("CRUS_SP: Memory allocation failed\n"); + return -ENOMEM; + } + + memcpy((u8 *)config + sizeof(struct afe_custom_crus_set_config_v2_t), + (u8 *) data_ptr, length); + + ret = afe_apr_send_pkt_crus(config, index, 1); + if (ret) + pr_err("CRUS_SP: (set_param) failed with code %d\n", ret); + + kfree(config); + return ret; +} + + + +static int crus_afe_get_param_v3(int port, int module_id, + int param_id, uint32_t length, void *data) +{ + struct afe_port_cmd_get_param_v3 afe_get_param; + struct param_hdr_v3 param_hdr; + u16 port_id = 0; + int index = 0; + int ret = 0; + + pr_info("%s: port=0x%x, module=0x%x, param_id=0x%x, size=%d\n", + __func__, port, module_id, param_id, length); + + param_hdr.module_id = module_id; + param_hdr.instance_id = INSTANCE_ID_0; + param_hdr.param_id = param_id; + param_hdr.param_size = length; + + port_id = q6audio_get_port_id(port); + ret = q6audio_validate_port(port_id); + if (ret < 0) { + pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, + port_id, ret); + return -EINVAL; + } + index = q6audio_get_port_index(port); + + //q6afe_get_params_v3 + memset(&afe_get_param, 0, sizeof(afe_get_param)); + afe_get_param.apr_hdr.hdr_field = + APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), + APR_PKT_VER); + afe_get_param.apr_hdr.pkt_size = sizeof(afe_get_param); + afe_get_param.apr_hdr.src_port = 0; + afe_get_param.apr_hdr.dest_port = 0; + afe_get_param.apr_hdr.token = index; + afe_get_param.apr_hdr.opcode = AFE_PORT_CMD_GET_PARAM_V3; + afe_get_param.port_id = port_id; + //if (mem_hdr != NULL) + // afe_get_param.mem_hdr = *mem_hdr; + /* Set param header in command, no payload in V3 */ + afe_get_param.param_hdr = param_hdr; + //q6afe_get_params_v3 end + + mutex_lock(&this_ctrl.param_lock); + atomic_set(&this_ctrl.callback_wait, 0); + this_ctrl.user_buffer = kzalloc(length + 64, + GFP_KERNEL); + atomic_set(cspl_afe.status, 0); + ret = apr_send_pkt(*cspl_afe.apr, (uint32_t *) &afe_get_param); + if (ret < 0) { + pr_err("%s: Setting param for port %d param[0x%x]failed\n", + __func__, port, param_id); + goto fail_cmd; + } + /* Wait for afe callback to populate data */ + while(!atomic_read(&this_ctrl.callback_wait)) + msleep(1); + +#if 0 + for (index = 0; index < length; index ++) + pr_info("[%d]=%d\n", index, this_ctrl.user_buffer[index]); + + pr_info("[5]=%s\n", &this_ctrl.user_buffer[5]); +#endif + /* copy from dynamic buffer to return buffer */ + memcpy((u8*)data, &this_ctrl.user_buffer[5], length); + pr_info("%s: Copied %d bytes data \n", __func__, length); + + ret = 0; +fail_cmd: + pr_info("%s: param_id %x status %d\n", __func__, param_id, ret); + mutex_unlock(&this_ctrl.param_lock); + kfree(this_ctrl.user_buffer); + return ret; +} + +static int crus_afe_set_param_v3(int port, int module_id, + int param_id, uint32_t length, void *data) +{ + struct afe_port_cmd_set_param_v3 *set_param = NULL; + uint32_t set_param_size = sizeof(struct afe_port_cmd_set_param_v3); + struct param_hdr_v3 param_hdr; + u16 port_id = 0; + int index = 0; + u8 *packed_param_data = NULL; + int packed_data_size = sizeof(union param_hdrs) + length; + int ret = 0; + + pr_info("%s: port=0x%x, module=0x%x, param_id=0x%x, size=%d\n", + __func__, port, module_id, param_id, length); + + port_id = q6audio_get_port_id(port); + ret = q6audio_validate_port(port_id); + if (ret < 0) { + pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, + port_id, ret); + return -EINVAL; + } + index = q6audio_get_port_index(port); + + memset(¶m_hdr, 0, sizeof(param_hdr)); + param_hdr.module_id = module_id; + param_hdr.instance_id = INSTANCE_ID_0; + param_hdr.param_id = param_id; + param_hdr.param_size = length; + pr_debug("CRUS: param_size %d\n", length); + + packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); + if (packed_param_data == NULL) + return -ENOMEM; + + ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, (u8 *)data, + &packed_data_size); + if (ret) { + pr_err("%s: Failed to pack param header and data, error %d\n", + __func__, ret); + goto fail_cmd; + } + + set_param_size += packed_data_size; + set_param = kzalloc(set_param_size, GFP_KERNEL); + if (set_param == NULL) { + ret = -ENOMEM; + goto fail_cmd; + } + + set_param->apr_hdr.hdr_field = + APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), + APR_PKT_VER); + set_param->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v3) + + packed_data_size; + set_param->apr_hdr.src_port = 0; + set_param->apr_hdr.dest_port = 0; + set_param->apr_hdr.token = index; + set_param->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; + set_param->port_id = port_id; + set_param->payload_size = packed_data_size; + memcpy(&set_param->param_data, packed_param_data, + packed_data_size); + + atomic_set(cspl_afe.state, 1); + //atomic_set(&this_ctrl.callback_wait, 0); + ret = apr_send_pkt(*cspl_afe.apr, (uint32_t *) set_param); + if (ret < 0) { + pr_err("%s: Setting param for port %d param[0x%x]failed\n", + __func__, port, param_id); + goto fail_cmd; + } + + ret = wait_event_timeout(cspl_afe.wait[index], + (atomic_read(cspl_afe.state) == 0), + msecs_to_jiffies(cspl_afe.timeout_ms*10)); + + if (!ret) { + pr_err("%s: wait_event timeout\n", __func__); + ret = -EINVAL; + goto fail_cmd; + } + + if (atomic_read(cspl_afe.status) != 0) { + pr_err("%s: set param cmd failed\n", __func__); + ret = -EINVAL; + goto fail_cmd; + } + + ret = 0; +fail_cmd: + pr_info("[CSPL]%s param_id %x status %d\n", __func__, param_id, ret); + kfree(set_param); + kfree(packed_param_data); + return ret; +} + +static int crus_afe_send_config(const char *data, int32_t length, + int32_t port, int32_t module) +{ + struct afe_custom_crus_set_config_v2_t *config = NULL; + struct crus_external_config_t *payload = NULL; + int size = sizeof(struct crus_external_config_t); + int chars_to_send, mem_size, sent = 0, ret = 0; + int index = afe_get_port_index(port); + uint32_t param = 0; + + pr_info("CRUS_SP: (send_config) module = 0x%08x, port = 0x%08x\n", + module, port); + + /* Destination settings for message */ + if (port == this_ctrl.ff_port) + param = CRUS_PARAM_RX_SET_EXT_CONFIG; + else if (port == this_ctrl.fb_port) + param = CRUS_PARAM_TX_SET_EXT_CONFIG; + else { + pr_err("CRUS_SP: Received invalid port parameter %d\n", port); + return -EINVAL; + } + + if (length > APR_CHUNK_SIZE) + mem_size = APR_CHUNK_SIZE; + else + mem_size = length; + + config = crus_gen_afe_set_header(size, port, module, param); + if (config == NULL) { + pr_err("CRUS_SP: Memory allocation failed\n"); + return -ENOMEM; + } + + payload = (struct crus_external_config_t *)((u8 *)config + + sizeof(struct afe_custom_crus_set_config_v2_t)); + payload->total_size = (uint32_t)length; + payload->reserved = 0; + payload->config = PAYLOAD_FOLLOWS_CONFIG; + /* ^ This tells the algorithm to expect array */ + /* immediately following the header */ + + /* Send config string in chunks of APR_CHUNK_SIZE bytes */ + while (sent < length) { + chars_to_send = length - sent; + if (chars_to_send > APR_CHUNK_SIZE) { + chars_to_send = APR_CHUNK_SIZE; + payload->done = 0; + } else { + payload->done = 1; + } + + /* Configure per message parameter settings */ + memcpy(payload->data, data + sent, chars_to_send); + payload->chunk_size = chars_to_send; + + /* Send the actual message */ + ret = afe_apr_send_pkt_crus(config, index, 1); + + if (ret) { + pr_err("CRUS_SP: (send_config) failure code %d\n", ret); + break; + } + + sent += chars_to_send; + } + + kfree(config); + return ret; +} + + +static int crus_afe_send_delta(const char *data, uint32_t length) +{ + struct afe_custom_crus_set_config_t *config = NULL; + struct crus_delta_config_t *payload = NULL; + int size = sizeof(struct crus_delta_config_t); + int port = this_ctrl.ff_port; + int param = CRUS_PARAM_RX_SET_DELTA_CONFIG; + int module = CIRRUS_SP; + int chars_to_send, mem_size, sent = 0, ret = 0; + int index = afe_get_port_index(port); + + pr_info("CRUS_SP: (send_delta) module = 0x%08x, port = 0x%08x\n", + module, port); + + if (length > APR_CHUNK_SIZE) + mem_size = APR_CHUNK_SIZE; + else + mem_size = length; + + config = crus_gen_afe_set_header(size, port, module, param); + if (config == NULL) { + pr_err("CRUS_SP: Memory allocation failed\n"); + return -ENOMEM; + } + + payload = (struct crus_delta_config_t *)((u8 *)config + + sizeof(struct afe_custom_crus_set_config_t)); + payload->total_size = length; + payload->index = 0; + payload->reserved = 0; + payload->config = PAYLOAD_FOLLOWS_CONFIG; + /* ^ This tells the algorithm to expect array */ + /* immediately following the header */ + + /* Send config string in chunks of APR_CHUNK_SIZE bytes */ + while (sent < length) { + chars_to_send = length - sent; + if (chars_to_send > APR_CHUNK_SIZE) { + chars_to_send = APR_CHUNK_SIZE; + payload->done = 0; + } else + payload->done = 1; + + /* Configure per message parameter settings */ + memcpy(payload->data, data + sent, chars_to_send); + payload->chunk_size = chars_to_send; + + /* Send the actual message */ + ret = afe_apr_send_pkt_crus(config, index, 1); + + if (ret) { + pr_err("CRUS_SP: (send_delta) failure code %d\n", ret); + break; + } + + sent += chars_to_send; + } + + kfree(config); + return ret; +} + +extern int crus_afe_callback(void* payload, int size) +{ + uint32_t* payload32 = payload; + + pr_debug("%s: module=0x%x size = %d\n", + __func__, (int)payload32[1], size); + + switch(payload32[1]) { + case CIRRUS_SP: + memcpy(this_ctrl.user_buffer, payload32, size); + atomic_set(&this_ctrl.callback_wait, 1); + break; + default: + return -EINVAL; + } + + return 0; +} + + + +int msm_routing_cirrus_fbport_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + this_ctrl.fb_port_index = ucontrol->value.integer.value[0]; + pr_info("%s: %d\n", __func__, this_ctrl.fb_port); + + switch (this_ctrl.fb_port_index) { + case 0: + this_ctrl.fb_port = AFE_PORT_ID_PRIMARY_MI2S_TX; + this_ctrl.ff_port = AFE_PORT_ID_PRIMARY_MI2S_RX; + break; + case 1: + this_ctrl.fb_port = AFE_PORT_ID_SECONDARY_MI2S_TX; + this_ctrl.ff_port = AFE_PORT_ID_SECONDARY_MI2S_RX; + break; + case 2: + this_ctrl.fb_port = AFE_PORT_ID_TERTIARY_MI2S_TX; + this_ctrl.ff_port = AFE_PORT_ID_TERTIARY_MI2S_RX; + break; + case 3: + this_ctrl.fb_port = AFE_PORT_ID_QUATERNARY_MI2S_TX; + this_ctrl.ff_port = AFE_PORT_ID_QUATERNARY_MI2S_RX; + break; + default: + /* Default port to QUATERNARY */ + this_ctrl.fb_port = AFE_PORT_ID_QUATERNARY_MI2S_TX; + this_ctrl.ff_port = AFE_PORT_ID_QUATERNARY_MI2S_RX; + break; + } + return 0; +} + +int msm_routing_cirrus_fbport_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("%s: this_ctrl.fb_port = %d", __func__, this_ctrl.fb_port); + ucontrol->value.integer.value[0] = this_ctrl.fb_port_index; + return 0; +} + +static int msm_routing_crus_sp_enable_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + const int crus_set = ucontrol->value.integer.value[0]; + + + this_ctrl.enable = crus_set; + + return 0; +} + +static int msm_routing_crus_sp_enable_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_info("%s: %d\n", __func__, this_ctrl.enable); + ucontrol->value.integer.value[0] = this_ctrl.enable; + + return 0; +} +static int msm_routing_crus_sp_prot_enable_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_err("CRUS_SP: Cirrus SP Protection Enable is set via DT\n"); + return 0; +} + +static int msm_routing_crus_sp_prot_enable_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = this_ctrl.prot_en ? 1 : 0; + return 0; +} + +static int msm_routing_crus_sp_usecase_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct crus_rx_run_case_ctrl_t case_ctrl; + struct crus_rx_temperature_t rx_temp; + const int crus_set = ucontrol->value.integer.value[0]; + //struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + //uint32_t max_index = e->items; + int buffer[CRUS_MAX_BUFFER_SIZE / 4]; + + if (crus_set >= 4) { + pr_err("CRUS_SP: Config index out of bounds (%d)\n", crus_set); + return -EINVAL; + } + + if(this_ctrl.q6afe_rev == 2) + crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, + CRUS_MAX_BUFFER_SIZE, buffer); + else + crus_afe_get_param_v3(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, + CRUS_MAX_BUFFER_SIZE, buffer); + + memcpy(&rx_temp, buffer, sizeof(rx_temp)); + + this_ctrl.usecase = crus_set; + + case_ctrl.status_l = 1; + case_ctrl.status_r = 1; + case_ctrl.z_l = rx_temp.z_l; + case_ctrl.z_r = rx_temp.z_r; + case_ctrl.checksum_l = rx_temp.z_l + 1; + case_ctrl.checksum_r = rx_temp.z_r + 1; + case_ctrl.atemp = rx_temp.amb_temp_l; + case_ctrl.value = this_ctrl.usecase; + + if (this_ctrl.prot_en) { + if(this_ctrl.q6afe_rev == 2) { + crus_afe_set_param(this_ctrl.fb_port, CIRRUS_SP, + CRUS_PARAM_TX_SET_USECASE, + sizeof(this_ctrl.usecase), + (void *)&this_ctrl.usecase); + } else { + crus_afe_set_param_v3(this_ctrl.fb_port, CIRRUS_SP, + CRUS_PARAM_TX_SET_USECASE, + sizeof(this_ctrl.usecase), + (void *)&this_ctrl.usecase); + } + } + + + + if(this_ctrl.q6afe_rev == 2) { + crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_SET_USECASE, sizeof(case_ctrl), + (void *)&case_ctrl); + } else { + crus_afe_set_param_v3(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_SET_USECASE, sizeof(case_ctrl), + (void *)&case_ctrl); + } + + return 0; +} + +static int msm_routing_crus_sp_usecase_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_info("%s: %d\n", __func__, this_ctrl.usecase); + ucontrol->value.integer.value[0] = this_ctrl.usecase; + + return 0; +} + +static int msm_routing_crus_load_config_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_platform *plat = snd_soc_kcontrol_platform(kcontrol); + const int crus_set = ucontrol->value.integer.value[0]; + char config[CONFIG_FILE_SIZE]; + const struct firmware *firmware; + + pr_debug("%s: %d\n", __func__, crus_set); + this_ctrl.conf_sel = crus_set; + + switch (crus_set) { + case 0: /* "None" */ + break; + case 1: /* Load RX Config */ + snprintf(config, CONFIG_FILE_SIZE, CRUS_RX_CONFIG, + this_ctrl.usecase); + + if (request_firmware(&firmware, config, plat->dev) != 0) { + pr_err("CRUS_SP: Request firmware failed\n"); + return -EINVAL; + } + + pr_info("CRUS_SP: Sending RX config...\n"); + + crus_afe_send_config(firmware->data, firmware->size, + this_ctrl.ff_port, CIRRUS_SP); + release_firmware(firmware); + break; + case 2: /* Load TX Config */ + if (this_ctrl.prot_en == false) + return -EINVAL; + + snprintf(config, CONFIG_FILE_SIZE, CRUS_TX_CONFIG, + this_ctrl.usecase); + + if (request_firmware(&firmware, config, plat->dev) != 0) { + pr_err("CRUS_SP: Request firmware failed\n"); + return -EINVAL; + } + + pr_info("CRUS_SP: Sending TX config...\n"); + + crus_afe_send_config(firmware->data, firmware->size, + this_ctrl.fb_port, CIRRUS_SP); + release_firmware(firmware); + break; + default: + return -EINVAL; + } + + this_ctrl.conf_sel = 0; + + return 0; +} + +static int msm_routing_crus_load_config_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("%s: %d\n", __func__, this_ctrl.conf_sel); + ucontrol->value.integer.value[0] = this_ctrl.conf_sel; + return 0; +} + +static int msm_routing_crus_delta_config_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_platform *plat = snd_soc_kcontrol_platform(kcontrol); + struct crus_single_data_t data; + const int crus_set = ucontrol->value.integer.value[0]; + const struct firmware *firmware; + + switch (crus_set) { + case 0: + break; + case 1: /* Load delta config over AFE */ + this_ctrl.delta_sel = crus_set; + + if (request_firmware(&firmware, "crus_sp_delta_config.bin", + plat->dev) != 0) { + pr_err("CRUS_SP: Request firmware failed\n"); + this_ctrl.delta_sel = 0; + return -EINVAL; + } + + pr_info("CRUS_SP: Sending delta config...\n"); + + crus_afe_send_delta(firmware->data, firmware->size); + release_firmware(firmware); + break; + case 2: /* Run delta transition */ + this_ctrl.delta_sel = crus_set; + data.value = 0; + crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_RUN_DELTA_CONFIG, + sizeof(struct crus_single_data_t), &data); + break; + default: + return -EINVAL; + } + + this_ctrl.delta_sel = 0; + return 0; +} + +static int msm_routing_crus_delta_config_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = this_ctrl.delta_sel; + return 0; +} + +static int msm_routing_crus_vol_attn_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + const int crus_set = ucontrol->value.integer.value[0]; + struct crus_dual_data_t data; + + mutex_lock(&this_ctrl.sp_lock); + + this_ctrl.vol_atten = crus_set; + + switch (crus_set) { + case 0: /* 0dB */ + data.data1 = VOL_ATTN_MAX; + data.data2 = VOL_ATTN_MAX; + break; + case 1: /* -18dB */ + data.data1 = VOL_ATTN_18DB; + data.data2 = VOL_ATTN_18DB; + break; + case 2: /* -24dB */ + data.data1 = VOL_ATTN_24DB; + data.data2 = VOL_ATTN_24DB; + break; + default: + return -EINVAL; + } + + if(this_ctrl.q6afe_rev == 2) { + crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_SET_ATTENUATION, + sizeof(struct crus_dual_data_t), &data); + } else { + crus_afe_set_param_v3(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_SET_ATTENUATION, + sizeof(struct crus_dual_data_t), &data); + } + + mutex_unlock(&this_ctrl.sp_lock); + + return 0; +} + +static int msm_routing_crus_vol_attn_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("Starting Cirrus SP Volume Attenuation Get function call\n"); + ucontrol->value.integer.value[0] = this_ctrl.vol_atten; + + return 0; +} + + +static int msm_routing_crus_chan_swap_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct crus_dual_data_t data; + const int crus_set = ucontrol->value.integer.value[0]; + + switch (crus_set) { + case 0: /* L/R */ + data.data1 = 1; + break; + case 1: /* R/L */ + data.data1 = 2; + break; + default: + return -EINVAL; + } + + data.data2 = this_ctrl.ch_sw_duration; + + mutex_lock(&this_ctrl.sp_lock); + + this_ctrl.ch_sw = crus_set; + + if(this_ctrl.q6afe_rev == 2) + crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_CHANNEL_SWAP, + sizeof(struct crus_dual_data_t), &data); + else + crus_afe_set_param_v3(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_CHANNEL_SWAP, + sizeof(struct crus_dual_data_t), &data); + + mutex_unlock(&this_ctrl.sp_lock); + + return 0; +} + +static int msm_routing_crus_chan_swap_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct crus_single_data_t data; + pr_debug("%s: %d\n", __func__, this_ctrl.ch_sw); + crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, + CRUS_PARAM_RX_GET_CHANNEL_SWAP, + sizeof(struct crus_single_data_t), &data); + + ucontrol->value.integer.value[0] = this_ctrl.ch_sw; + + return 0; +} + +static int msm_routing_crus_chan_swap_dur_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int crus_set = ucontrol->value.integer.value[0]; + + pr_debug("%s: %d\n", __func__, crus_set); + + if ((crus_set < 0) || (crus_set > MAX_CHAN_SWAP_SAMPLES)) { + pr_err("CRUS_SP: Value out of range (%d)\n", crus_set); + return -EINVAL; + } + + if (crus_set < MIN_CHAN_SWAP_SAMPLES) { + pr_info("CRUS_SP: Received %d, round up to min value %d\n", + crus_set, MIN_CHAN_SWAP_SAMPLES); + crus_set = MIN_CHAN_SWAP_SAMPLES; + } + + this_ctrl.ch_sw_duration = crus_set; + + return 0; +} + +static int msm_routing_crus_chan_swap_dur_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("%s: %d\n", __func__, this_ctrl.ch_sw_duration); + + ucontrol->value.integer.value[0] = this_ctrl.ch_sw_duration; + + return 0; +} +static int msm_routing_crus_fail_det(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +static int msm_routing_crus_fail_det_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +static const char * const cirrus_fb_port_text[] = {"PRI_MI2S_RX", + "SEC_MI2S_RX", + "TERT_MI2S_RX", + "QUAT_MI2S_RX", + "QUAT_TDM_RX_0", + "SLIMBUS_0_RX"}; + +static const char * const crus_en_text[] = {"Config SP Disable", + "Config SP Enable"}; + +static const char * const crus_prot_en_text[] = {"Disable", "Enable"}; + +static const char * const crus_conf_load_text[] = {"Idle", "Load RX", + "Load TX"}; + +static const char * const crus_conf_load_no_prot_text[] = {"Idle", "Load"}; + +static const char * const crus_delta_text[] = {"Idle", "Load", "Run"}; + +static const char * const crus_chan_swap_text[] = {"LR", "RL"}; +static const char * crus_sp_usecase_dt_text[MAX_TUNING_CONFIGS] = {"Music", "Voice", "Headset", "Handsfree"}; + +static const char * const crus_vol_attn_text[] = {"0dB", "-18dB", "-24dB"}; + + +static const struct soc_enum cirrus_fb_controls_enum[] = { + SOC_ENUM_SINGLE_EXT(6, cirrus_fb_port_text), +}; + +static const struct soc_enum crus_en_enum[] = { + SOC_ENUM_SINGLE_EXT(2, crus_en_text), +}; + +static const struct soc_enum crus_prot_en_enum[] = { + SOC_ENUM_SINGLE_EXT(2, crus_prot_en_text), +}; + +static struct soc_enum crus_sp_usecase_enum[] = { + SOC_ENUM_SINGLE_EXT(MAX_TUNING_CONFIGS, crus_sp_usecase_dt_text), +}; + +static const struct soc_enum crus_conf_load_enum[] = { + SOC_ENUM_SINGLE_EXT(3, crus_conf_load_text), +}; + +static const struct soc_enum crus_conf_load_no_prot_enum[] = { + SOC_ENUM_SINGLE_EXT(2, crus_conf_load_no_prot_text), +}; + +static const struct soc_enum crus_delta_enum[] = { + SOC_ENUM_SINGLE_EXT(3, crus_delta_text), +}; + +static const struct soc_enum crus_chan_swap_enum[] = { + SOC_ENUM_SINGLE_EXT(2, crus_chan_swap_text), +}; + +static const struct soc_enum crus_vol_attn_enum[] = { + SOC_ENUM_SINGLE_EXT(3, crus_vol_attn_text), +}; +static const struct snd_kcontrol_new crus_protect_controls[] = { + SOC_ENUM_EXT("Cirrus SP FBPort", cirrus_fb_controls_enum[0], + msm_routing_cirrus_fbport_get, msm_routing_cirrus_fbport_put), + SOC_ENUM_EXT("Cirrus SP", crus_en_enum[0], + msm_routing_crus_sp_enable_get, msm_routing_crus_sp_enable_put), + SOC_ENUM_EXT("Cirrus SP Protection", crus_prot_en_enum[0], + msm_routing_crus_sp_prot_enable_get, msm_routing_crus_sp_prot_enable_put), + SOC_ENUM_EXT("Cirrus SP Usecase", crus_sp_usecase_enum[0], + msm_routing_crus_sp_usecase_get, msm_routing_crus_sp_usecase_put), + SOC_ENUM_EXT("Cirrus SP Load Config", crus_conf_load_enum[0], + msm_routing_crus_load_config_get, msm_routing_crus_load_config_put), + SOC_ENUM_EXT("Cirrus SP Delta Config", crus_delta_enum[0], + msm_routing_crus_delta_config_get, msm_routing_crus_delta_config_put), + SOC_ENUM_EXT("Cirrus SP Channel Swap", crus_chan_swap_enum[0], + msm_routing_crus_chan_swap_get, msm_routing_crus_chan_swap_put), + SOC_SINGLE_EXT("Cirrus SP Channel Swap Duration", SND_SOC_NOPM, 0, + MAX_CHAN_SWAP_SAMPLES, 0, msm_routing_crus_chan_swap_dur_get, + msm_routing_crus_chan_swap_dur_put), + SOC_SINGLE_BOOL_EXT("Cirrus SP Failure Detection", 0, + msm_routing_crus_fail_det_get, msm_routing_crus_fail_det), +}; +static const struct snd_kcontrol_new crus_no_protect_controls[] = { + SOC_ENUM_EXT("Cirrus SP FBPort", cirrus_fb_controls_enum[0], + msm_routing_cirrus_fbport_get, msm_routing_cirrus_fbport_put), + SOC_ENUM_EXT("Cirrus SP", crus_en_enum[0], + msm_routing_crus_sp_enable_get, msm_routing_crus_sp_enable_put), + SOC_ENUM_EXT("Cirrus SP Protection", crus_prot_en_enum[0], + msm_routing_crus_sp_prot_enable_get, msm_routing_crus_sp_prot_enable_put), + SOC_ENUM_EXT("Cirrus SP Usecase", crus_sp_usecase_enum[0], + msm_routing_crus_sp_usecase_get, msm_routing_crus_sp_usecase_put), + SOC_ENUM_EXT("Cirrus SP Load Config", crus_conf_load_no_prot_enum[0], + msm_routing_crus_load_config_get, msm_routing_crus_load_config_put), + SOC_ENUM_EXT("Cirrus SP Delta Config", crus_delta_enum[0], + msm_routing_crus_delta_config_get, msm_routing_crus_delta_config_put), + SOC_ENUM_EXT("Cirrus SP Channel Swap", crus_chan_swap_enum[0], + msm_routing_crus_chan_swap_get, msm_routing_crus_chan_swap_put), + SOC_SINGLE_EXT("Cirrus SP Channel Swap Duration", SND_SOC_NOPM, 0, + MAX_CHAN_SWAP_SAMPLES, 0, msm_routing_crus_chan_swap_dur_get, + msm_routing_crus_chan_swap_dur_put), + SOC_ENUM_EXT("Cirrus SP Volume Attenuation", crus_vol_attn_enum[0], + msm_routing_crus_vol_attn_get, msm_routing_crus_vol_attn_put), +}; + +void msm_crus_pb_add_controls(struct snd_soc_platform *platform) +{ + if (this_ctrl.usecase_dt_count == 0) + pr_info("CRUS_SP: Usecase config not specified\n"); + + crus_sp_usecase_enum[0].items = this_ctrl.usecase_dt_count; + crus_sp_usecase_enum[0].texts = crus_sp_usecase_dt_text; + + if (this_ctrl.prot_en) + snd_soc_add_platform_controls(platform, crus_protect_controls, + ARRAY_SIZE(crus_protect_controls)); + else + snd_soc_add_platform_controls(platform, + crus_no_protect_controls, + ARRAY_SIZE(crus_no_protect_controls)); +} + +EXPORT_SYMBOL(msm_crus_pb_add_controls); +int crus_afe_port_start(u16 port_id) +{ + pr_info("%s: 0x%x\n", __func__, port_id); + +//CSPL do not be involved in AFE +#if 0 + struct snd_kcontrol kcontrol; + struct snd_ctl_elem_value ucontrol; + + if (port_id != this_ctrl.ff_port) + return 0; + + this_ctrl.afe_start = true; + pr_info("%s: 0x%x\n", __func__, port_id); + + mutex_lock(&this_ctrl.sp_lock); + msm_routing_crus_sp_usecase_get(&kcontrol, + &ucontrol); + msm_routing_crus_sp_usecase_put(&kcontrol, + &ucontrol); + mutex_unlock(&this_ctrl.sp_lock); +#endif + return 0; +} +EXPORT_SYMBOL(crus_afe_port_start); +int crus_afe_port_close(u16 port_id) +{ + pr_info("%s: 0x%x\n", __func__, port_id); + +//CSPL do not be involved in AFE +#if 0 + if (port_id != this_ctrl.ff_port) + return 0; + + this_ctrl.afe_start = false; + pr_info("%s: 0x%x\n", __func__, port_id); +#endif + return 0; +} +EXPORT_SYMBOL(crus_afe_port_close); +static long crus_sp_shared_ioctl(struct file *f, unsigned int cmd, + void __user *arg) +{ + int result = 0, port; + uint32_t bufsize = 0, size; + void *io_data = NULL; + + pr_info("%s\n", __func__); + + if (copy_from_user(&size, arg, sizeof(size))) { + pr_err("CRUS_SP: copy_from_user (size) failed\n"); + result = -EFAULT; + goto exit; + } + + /* Copy IOCTL header from usermode */ + if (copy_from_user(&crus_sp_hdr, arg, size)) { + pr_err("CRUS_SP: copy_from_user (struct) failed\n"); + result = -EFAULT; + goto exit; + } + + bufsize = crus_sp_hdr.data_length; + io_data = kzalloc(bufsize, GFP_KERNEL); + + switch (cmd) { + case CRUS_SP_IOCTL_GET: + switch (crus_sp_hdr.module_id) { + case CRUS_MODULE_ID_TX: + port = this_ctrl.fb_port; + break; + case CRUS_MODULE_ID_RX: + port = this_ctrl.ff_port; + break; + default: + pr_info("CRUS_SP: Unrecognized port ID (%d)\n", + crus_sp_hdr.module_id); + port = this_ctrl.ff_port; + } + if(this_ctrl.q6afe_rev == 2) + crus_afe_get_param(port, CIRRUS_SP, crus_sp_hdr.param_id, + bufsize, io_data); + else + crus_afe_get_param_v3(port, CIRRUS_SP, crus_sp_hdr.param_id, + bufsize, io_data); + result = copy_to_user(crus_sp_hdr.data, io_data, bufsize); + if (result) { + pr_err("CRUS_SP: copy_to_user failed (%d)\n", result); + result = -EFAULT; + } else + result = bufsize; + break; + case CRUS_SP_IOCTL_SET: + result = copy_from_user(io_data, (void *)crus_sp_hdr.data, + bufsize); + if (result) { + pr_err("CRUS_SP: copy_from_user failed (%d)\n", result); + result = -EFAULT; + goto exit_io; + } + + switch (crus_sp_hdr.module_id) { + case CRUS_MODULE_ID_TX: + port = this_ctrl.fb_port; + break; + case CRUS_MODULE_ID_RX: + port = this_ctrl.ff_port; + break; + default: + pr_info("%s: Unrecognized port ID (%d)\n", __func__, + crus_sp_hdr.module_id); + port = this_ctrl.ff_port; + } + + if(this_ctrl.q6afe_rev == 2) { + crus_afe_set_param(port, CIRRUS_SP, + crus_sp_hdr.param_id, bufsize, io_data); + } else { + crus_afe_set_param_v3(port, CIRRUS_SP, + crus_sp_hdr.param_id, bufsize, io_data); + } + break; + + default: + pr_err("CRUS_SP: Invalid IOCTL, command = %d\n", cmd); + result = -EINVAL; + break; + } + +exit_io: + kfree(io_data); +exit: + return result; +} + +static long crus_sp_ioctl(struct file *f, + unsigned int cmd, unsigned long arg) +{ + pr_info("%s\n", __func__); + + return crus_sp_shared_ioctl(f, cmd, (void __user *)arg); +} + +static long crus_sp_compat_ioctl(struct file *f, + unsigned int cmd, unsigned long arg) +{ + unsigned int cmd64; + + pr_info("%s\n", __func__); + + switch (cmd) { + case CRUS_SP_IOCTL_GET32: + cmd64 = CRUS_SP_IOCTL_GET; + break; + case CRUS_SP_IOCTL_SET32: + cmd64 = CRUS_SP_IOCTL_SET; + break; + default: + pr_err("CRUS_SP: Invalid IOCTL, command = %d\n", cmd); + return -EINVAL; + } + + return crus_sp_shared_ioctl(f, cmd64, compat_ptr(arg)); +} + +static int crus_sp_open(struct inode *inode, struct file *f) +{ + pr_debug("%s\n", __func__); + + atomic_inc(&this_ctrl.count_wait); + return 0; +} + +static int crus_sp_release(struct inode *inode, struct file *f) +{ + atomic_dec(&this_ctrl.count_wait); + return 0; +} + +static ssize_t temperature_left_show(struct device *dev, + struct device_attribute *a, char *buf) +{ + struct crus_rx_temperature_t rx_temp; + static const int material = 250; + static const int scale_factor = 100000; + int buffer[CRUS_MAX_BUFFER_SIZE / 4]; + int out_cal0; + int out_cal1; + int z, r, t; + int temp0; + + crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, + CRUS_MAX_BUFFER_SIZE, buffer); + + memcpy(&rx_temp, buffer, sizeof(rx_temp)); + + out_cal0 = rx_temp.hp_status_l; + out_cal1 = rx_temp.full_status_l; + + z = rx_temp.z_l; + + temp0 = rx_temp.amb_temp_l; + + if ((out_cal0 != 2) || (out_cal1 != 2)) + return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); + + r = rx_temp.temp_l; + t = (material * scale_factor * (r-z) / z) + (temp0 * scale_factor); + + return snprintf(buf, PAGE_SIZE, "%d.%05dc\n", t / scale_factor, + t % scale_factor); +} +static DEVICE_ATTR_RO(temperature_left); + +static ssize_t temperature_right_show(struct device *dev, + struct device_attribute *a, char *buf) +{ + struct crus_rx_temperature_t rx_temp; + static const int material = 250; + static const int scale_factor = 100000; + int buffer[CRUS_MAX_BUFFER_SIZE / 4]; + int out_cal0; + int out_cal1; + int z, r, t; + int temp0; + + crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, + CRUS_MAX_BUFFER_SIZE, buffer); + + memcpy(&rx_temp, buffer, sizeof(rx_temp)); + + out_cal0 = rx_temp.hp_status_r; + out_cal1 = rx_temp.full_status_r; + + z = rx_temp.z_r; + + temp0 = rx_temp.amb_temp_r; + + if ((out_cal0 != 2) || (out_cal1 != 2)) + return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); + + r = rx_temp.temp_r; + t = (material * scale_factor * (r-z) / z) + (temp0 * scale_factor); + + return snprintf(buf, PAGE_SIZE, "%d.%05dc\n", t / scale_factor, + t % scale_factor); +} +static DEVICE_ATTR_RO(temperature_right); + +static ssize_t resistance_left_show(struct device *dev, + struct device_attribute *a, char *buf) +{ + struct crus_rx_temperature_t rx_temp; + static const int scale_factor = 100000000; + static const int amp_factor = 71498; + int buffer[CRUS_MAX_BUFFER_SIZE / 4]; + int out_cal0; + int out_cal1; + int r; + + crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, + CRUS_MAX_BUFFER_SIZE, buffer); + + memcpy(&rx_temp, buffer, sizeof(rx_temp)); + + out_cal0 = rx_temp.hp_status_l; + out_cal1 = rx_temp.full_status_l; + + if ((out_cal0 != 2) || (out_cal1 != 2)) + return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); + + r = rx_temp.temp_l * amp_factor; + + return snprintf(buf, PAGE_SIZE, "%d.%08d ohms\n", r / scale_factor, + r % scale_factor); +} +static DEVICE_ATTR_RO(resistance_left); + +static ssize_t resistance_right_show(struct device *dev, + struct device_attribute *a, char *buf) +{ + struct crus_rx_temperature_t rx_temp; + static const int scale_factor = 100000000; + static const int amp_factor = 71498; + int buffer[CRUS_MAX_BUFFER_SIZE / 4]; + int out_cal0; + int out_cal1; + int r; + + crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, + CRUS_MAX_BUFFER_SIZE, buffer); + + memcpy(&rx_temp, buffer, sizeof(rx_temp)); + + out_cal0 = rx_temp.hp_status_r; + out_cal1 = rx_temp.full_status_r; + + if ((out_cal0 != 2) || (out_cal1 != 2)) + return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); + + r = rx_temp.temp_r * amp_factor; + + return snprintf(buf, PAGE_SIZE, "%d.%08d ohms\n", r / scale_factor, + r % scale_factor); +} +static DEVICE_ATTR_RO(resistance_right); + +static struct attribute *crus_sp_attrs[] = { + &dev_attr_temperature_left.attr, + &dev_attr_temperature_right.attr, + &dev_attr_resistance_left.attr, + &dev_attr_resistance_right.attr, + NULL, +}; + +static const struct attribute_group crus_sp_group = { + .attrs = crus_sp_attrs, +}; + +static const struct attribute_group *crus_sp_groups[] = { + &crus_sp_group, + NULL, +}; + +#ifdef CONFIG_OF +static int msm_cirrus_playback_probe(struct platform_device *pdev) +{ + int i; + + pr_info("CRUS_SP: Initializing platform device\n"); + + this_ctrl.usecase_dt_count = of_property_count_strings(pdev->dev.of_node, + "usecase-names"); + if (this_ctrl.usecase_dt_count <= 0) { + pr_debug("CRUS_SP: Usecase names not found\n"); + this_ctrl.usecase_dt_count = 0; + return 0; + } + + if ((this_ctrl.usecase_dt_count > 0) && + (this_ctrl.usecase_dt_count <= MAX_TUNING_CONFIGS)) + of_property_read_string_array(pdev->dev.of_node, + "usecase-names", + crus_sp_usecase_dt_text, + this_ctrl.usecase_dt_count); + else if (this_ctrl.usecase_dt_count > MAX_TUNING_CONFIGS) { + pr_err("CRUS_SP: Max of %d usecase configs allowed\n", + MAX_TUNING_CONFIGS); + return -EINVAL; + } + + for (i = 0; i < this_ctrl.usecase_dt_count; i++) + pr_info("CRUS_SP: Usecase[%d] = %s\n", i, + crus_sp_usecase_dt_text[i]); + + this_ctrl.prot_en = of_property_read_bool(pdev->dev.of_node, + "protect-en"); + + return 0; +} + +static const struct of_device_id msm_cirrus_playback_dt_match[] = { + {.compatible = "cirrus,msm-cirrus-playback"}, + {} +}; +MODULE_DEVICE_TABLE(of, msm_cirrus_playback_dt_match); + +static struct platform_driver msm_cirrus_playback_driver = { + .driver = { + .name = "msm-cirrus-playback", + .owner = THIS_MODULE, + .of_match_table = msm_cirrus_playback_dt_match, + }, + .probe = msm_cirrus_playback_probe, +}; +#endif + +static const struct file_operations crus_sp_fops = { + .owner = THIS_MODULE, + .open = crus_sp_open, + .release = crus_sp_release, + .unlocked_ioctl = crus_sp_ioctl, + .compat_ioctl = crus_sp_compat_ioctl, +}; + +struct miscdevice crus_sp_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = "msm_cirrus_playback", + .fops = &crus_sp_fops, +}; + +int __init crus_sp_init(void) +{ + pr_info("Initializing misc device\n"); + atomic_set(&this_ctrl.callback_wait, 0); + atomic_set(&this_ctrl.count_wait, 0); + mutex_init(&this_ctrl.param_lock); + mutex_init(&this_ctrl.sp_lock); + + misc_register(&crus_sp_misc); + + if (sysfs_create_groups(&crus_sp_misc.this_device->kobj, + crus_sp_groups)) + pr_err("%s: Could not create sysfs groups\n", __func__); + +#ifdef CONFIG_OF + platform_driver_register(&msm_cirrus_playback_driver); +#endif + return 0; +} + +void __exit crus_sp_exit(void) +{ + pr_debug("%s\n", __func__); + mutex_destroy(&this_ctrl.param_lock); + +#ifdef CONFIG_OF + platform_driver_unregister(&msm_cirrus_playback_driver); +#endif +} + +MODULE_AUTHOR("Cirrus SP"); +MODULE_DESCRIPTION("Providing Interface to Cirrus SP"); +MODULE_LICENSE("GPL"); diff --git a/dsp/q6_init.c b/dsp/q6_init.c index 04a142fa4762..52c62a921aff 100644 --- a/dsp/q6_init.c +++ b/dsp/q6_init.c @@ -31,6 +31,9 @@ static int __init audio_q6_init(void) msm_audio_ion_init(); audio_slimslave_init(); avtimer_init(); +#ifdef CONFIG_MSM_CSPL + crus_sp_init(); +#endif msm_mdf_init(); voice_mhi_init(); #ifdef CONFIG_ELLIPTIC_ULTRASOUND @@ -46,6 +49,9 @@ static void __exit audio_q6_exit(void) { msm_mdf_exit(); avtimer_exit(); +#ifdef CONFIG_MSM_CSPL + crus_sp_exit(); +#endif audio_slimslave_exit(); msm_audio_ion_exit(); core_exit(); diff --git a/dsp/q6_init.h b/dsp/q6_init.h index 9886a01f7838..e2af48054f05 100644 --- a/dsp/q6_init.h +++ b/dsp/q6_init.h @@ -26,6 +26,9 @@ int rtac_init(void); int msm_audio_ion_init(void); int audio_slimslave_init(void); int avtimer_init(void); +#ifdef CONFIG_MSM_CSPL +int crus_sp_init(void); +#endif #ifdef CONFIG_MSM_MDF int msm_mdf_init(void); void msm_mdf_exit(void); @@ -60,6 +63,9 @@ static inline void spk_params_exit(void) #endif void avtimer_exit(void); +#ifdef CONFIG_MSM_CSPL +void crus_sp_exit(void); +#endif void audio_slimslave_exit(void); void msm_audio_ion_exit(void); void rtac_exit(void); diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 11b9352737e6..6406cd0b38c8 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -36,6 +36,10 @@ #include "adsp_err.h" #include "q6afecal-hwdep.h" +#ifdef CONFIG_MSM_CSPL +#include +#endif + #define WAKELOCK_TIMEOUT 5000 enum { AFE_COMMON_RX_CAL = 0, @@ -190,6 +194,17 @@ static int afe_get_cal_hw_delay(int32_t path, struct audio_cal_hw_delay_entry *entry); static int remap_cal_data(struct cal_block_data *cal_block, int cal_index); +#ifdef CONFIG_MSM_CSPL +struct afe_cspl_state cspl_afe = { + .apr= &this_afe.apr, + .status= &this_afe.status, + .state= &this_afe.state, + .wait= this_afe.wait, + .timeout_ms= TIMEOUT_MS, +}; +EXPORT_SYMBOL(cspl_afe); +#endif + int afe_get_spk_initial_cal(void) { return this_afe.initial_cal; @@ -569,6 +584,11 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) uint32_t param_id; uint32_t param_id_pos = 0; +#ifdef CONFIG_MSM_CSPL + if (crus_afe_callback(data->payload, data->payload_size) == 0) + return 0; +#endif + if (!payload || (data->token >= AFE_MAX_PORTS)) { pr_err("%s: Error: size %d payload %pK token %d\n", __func__, data->payload_size, @@ -1037,6 +1057,21 @@ static int afe_apr_send_pkt(void *data, wait_queue_head_t *wait) return ret; } +#ifdef CONFIG_MSM_CSPL +int afe_apr_send_pkt_crus(void *data, int index, int set) +{ + pr_info("[CSPL] %s: index = %d, set=%d, data = %p\n", + __func__, index, set, data); + + if (set) + return afe_apr_send_pkt(data, &this_afe.wait[index]); + else /* get */ + return afe_apr_send_pkt(data, 0); +} + +EXPORT_SYMBOL(afe_apr_send_pkt_crus); +#endif + /* This function shouldn't be called directly. Instead call q6afe_set_params. */ static int q6afe_set_params_v2(u16 port_id, int index, struct mem_mapping_hdr *mem_hdr, @@ -4429,6 +4464,10 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, goto fail_cmd; } ret = afe_send_cmd_port_start(port_id); +#if CONFIG_MSM_CSPL + if (ret == 0) + crus_afe_port_start(port_id); +#endif fail_cmd: mutex_unlock(&this_afe.afe_cmd_lock); @@ -7132,6 +7171,10 @@ int afe_close(int port_id) if (ret) pr_err("%s: AFE close failed %d\n", __func__, ret); +#if CONFIG_MSM_CSPL + crus_afe_port_close(port_id); +#endif + fail_cmd: mutex_unlock(&this_afe.afe_cmd_lock); return ret; diff --git a/include/dsp/msm-cirrus-playback.h b/include/dsp/msm-cirrus-playback.h new file mode 100755 index 000000000000..84094c8d78d8 --- /dev/null +++ b/include/dsp/msm-cirrus-playback.h @@ -0,0 +1,184 @@ +/* Copyright (c) 2015 Cirrus Logic, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef MSM_CIRRUS_PLAYBACK_H +#define MSM_CIRRUS_PLAYBACK_H +#define DEBUG +#include +#include +#include +#include +#include +#include + + +#define MIN_CHAN_SWAP_SAMPLES 48 +#define MAX_CHAN_SWAP_SAMPLES 9600 +#define VOL_ATTN_MAX 0x7FFFFFFF +#define VOL_ATTN_18DB 257698038 +#define VOL_ATTN_24DB 128849019 + +struct afe_cspl_state { + void **apr; + atomic_t *status; + atomic_t *state; + wait_queue_head_t *wait; + int timeout_ms; +}; + +extern struct afe_cspl_state cspl_afe; + +struct afe_custom_crus_set_config_v2_t { + struct apr_hdr hdr; + struct afe_port_cmd_set_param_v2 param; + struct param_hdr_v2 data; +} __packed; + +struct afe_custom_crus_get_config_v2_t { + struct apr_hdr hdr; + struct afe_port_cmd_get_param_v2 param; + struct param_hdr_v2 data; +} __packed; + +struct afe_custom_crus_set_config_t { + struct apr_hdr hdr; + struct afe_port_cmd_set_param_v3 param; + struct param_hdr_v3 data; +} __packed; + +struct afe_custom_crus_get_config_t { + struct apr_hdr hdr; + struct afe_port_cmd_get_param_v3 param; + struct param_hdr_v3 data; +} __packed; + +/* Payload struct for getting or setting one integer value from/to the DSP module */ +struct crus_single_data_t { + int32_t value; +}; + +/* Payload struct for getting or setting two integer values from/to the DSP module */ +struct crus_dual_data_t { + int32_t data1; + int32_t data2; +}; + +/* Payload struct for getting or setting three integer values from/to the DSP module */ +struct crus_triple_data_t { + int32_t data1; + int32_t data2; + int32_t data3; +}; + +/* Payload struct for setting the RX and TX use cases */ +struct crus_rx_run_case_ctrl_t { + int32_t value; + int32_t status_l; + int32_t checksum_l; + int32_t z_l; + int32_t status_r; + int32_t checksum_r; + int32_t z_r; + int32_t atemp; +}; + +/* Payload struct for getting calibration result from DSP module */ +struct cirrus_cal_result_t { + int32_t status_l; + int32_t checksum_l; + int32_t z_l; + int32_t status_r; + int32_t checksum_r; + int32_t z_r; +}; + +#define APR_CHUNK_SIZE 256 + +/* Payload struct for sending an external configuration string to the DSP + * module + */ +struct crus_external_config_t { + uint32_t total_size; + uint32_t chunk_size; + int32_t done; + int32_t reserved; + int32_t config; + char data[APR_CHUNK_SIZE]; +}; +/* Payload struct for sending an external tuning transition string to the DSP + * module + */ +struct crus_delta_config_t { + uint32_t total_size; + uint32_t chunk_size; + int32_t done; + int32_t index; + int32_t reserved; + int32_t config; + char data[APR_CHUNK_SIZE]; +}; + +struct crus_rx_temperature_t { + uint32_t cal_status_l; + uint32_t temp_r; + uint32_t z_r; + uint32_t temp_l; + uint32_t z_l; + uint32_t cal_status_r; + uint32_t amb_temp_l; + uint32_t excur_model_r; + uint32_t excur_model_l; + uint32_t cksum_r; + uint32_t amb_temp_r; + uint32_t cksum_l; + uint32_t hp_status_l; + uint32_t full_status_l; + uint32_t hp_status_r; + uint32_t full_status_r; +}; + +#define CONFIG_FILE_SIZE 128 +#define PAYLOAD_FOLLOWS_CONFIG 4 +#define MAX_TUNING_CONFIGS 4 +#define MIN_CHAN_SWAP_SAMPLES 48 +#define MAX_CHAN_SWAP_SAMPLES 9600 +#define CRUS_MAX_BUFFER_SIZE 384 + +struct crus_control_t { + struct device *device; + int32_t q6afe_rev; + bool afe_start; + bool enable; + bool prot_en; + int32_t fb_port_index; + int32_t fb_port; + int32_t ff_port; + int ch_sw_duration; + int32_t ch_sw; + int32_t vol_atten; + atomic_t callback_wait; + atomic_t count_wait; + struct mutex param_lock; + struct mutex sp_lock; + int32_t* user_buffer; + int32_t usecase; + int32_t config; + int32_t conf_sel; + int32_t delta_sel; + int32_t usecase_dt_count; +}; + +//extern int afe_apr_send_pkt_crus(void *data, int index, int set); + +int crus_afe_callback(void* payload, int size); +void msm_crus_pb_add_controls(struct snd_soc_platform *platform); +#endif /* _MSM_CIRRUS_PLAYBACK_H */ + diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h index 9ffbd110f4fb..731a3553f6fb 100644 --- a/include/dsp/q6afe-v2.h +++ b/include/dsp/q6afe-v2.h @@ -459,6 +459,11 @@ int afe_get_sp_rx_tmax_xmax_logging_data( u16 port_id); int afe_cal_init_hwdep(void *card); int afe_send_port_island_mode(u16 port_id); +#ifdef CONFIG_MSM_CSPL +int afe_apr_send_pkt_crus(void *data, int index, int set); +int crus_afe_port_close(u16 port_id); +int crus_afe_port_start(u16 port_id); +#endif int afe_send_cmd_wakeup_register(void *handle, bool enable); void afe_register_wakeup_irq_callback( void (*afe_cb_wakeup_irq)(void *handle)); diff --git a/include/uapi/sound/msm-cirrus-playback.h b/include/uapi/sound/msm-cirrus-playback.h new file mode 100755 index 000000000000..aca17609f26f --- /dev/null +++ b/include/uapi/sound/msm-cirrus-playback.h @@ -0,0 +1,119 @@ +/* Copyright (c) 2016 Cirrus Logic, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef _UAPI_MSM_CIRRUS_SPK_PR_H +#define _UAPI_MSM_CIRRUS_SPK_PR_H + +#include +#include + + +#define CIRRUS_SP 0x10027053 +#define CIRRUS_SP_ENABLE 0x10002001 + +#define CRUS_MODULE_ID_TX 0x00000002 +#define CRUS_MODULE_ID_RX 0x00000001 + +/* + * CRUS_PARAM_RX/TX_SET_USECASE + * 0 = Music Playback in firmware + * 1 = VOICE Playback in firmware + * 2 = Tuning file loaded using external + * config load command + * + * uses crus_rx_run_case_ctrl for RX apr pckt + * uses crus_single_data_ctrl for TX apr pckt + * + */ +#define CRUS_PARAM_RX_SET_USECASE 0x00A1AF02 +#define CRUS_PARAM_TX_SET_USECASE 0x00A1BF0A +/* + * CRUS_PARAM_RX/TX_SET_CALIB + * Non-zero value to run speaker + * calibration sequence + * + * uses crus_single_data_t apr pckt + */ +#define CRUS_PARAM_RX_SET_CALIB 0x00A1AF03 +#define CRUS_PARAM_TX_SET_CALIB 0x00A1BF03 +/* + * CRUS_PARAM_RX/TX_SET_EXT_CONFIG + * config string loaded from libfirmware + * max of 7K paramters + * + * uses crus_external_config_t apr pckt + */ +#define CRUS_PARAM_RX_SET_EXT_CONFIG 0x00A1AF05 +#define CRUS_PARAM_TX_SET_EXT_CONFIG 0x00A1BF08 +/* + * CRUS_PARAM_RX_GET_TEMP + * get current Temp and calibration data + * + * CRUS_PARAM_TX_GET_TEMP_CAL + * get results of calibration sequence + * + * uses cirrus_cal_result_t apr pckt + */ +#define CRUS_PARAM_RX_GET_TEMP 0x00A1AF07 +#define CRUS_PARAM_TX_GET_TEMP_CAL 0x00A1BF06 +/* + * CRUS_PARAM_RX_SET_DELTA_CONFIG + * load seamless transition config string + * + * CRUS_PARAM_RX_RUN_DELTA_CONFIG + * execute the loaded seamless transition + */ +#define CRUS_PARAM_RX_SET_DELTA_CONFIG 0x00A1AF0D +#define CRUS_PARAM_RX_RUN_DELTA_CONFIG 0x00A1AF0E +/* + * CRUS_PARAM_RX_CHANNEL_SWAP + * initiate l/r channel swap transition + */ +#define CRUS_PARAM_RX_CHANNEL_SWAP 0x00A1AF12 +#define CRUS_PARAM_RX_GET_CHANNEL_SWAP 0x00A1AF13 +/* + * CRUS_PARAM_RX_SET_ATTENUATION + * set volume attenuation in volume control blocks 1 & 2 + */ +#define CRUS_PARAM_RX_SET_ATTENUATION 0x00A1AF0A +#define CRUS_AFE_PARAM_ID_ENABLE 0x00010203 + +#define SPK_PROT_IOCTL_MAGIC 'a' + +#define CRUS_SP_IOCTL_GET _IOWR(SPK_PROT_IOCTL_MAGIC, 219, void *) +#define CRUS_SP_IOCTL_SET _IOWR(SPK_PROT_IOCTL_MAGIC, 220, void *) +#define CRUS_SP_IOCTL_GET_CALIB _IOWR(SPK_PROT_IOCTL_MAGIC, 221, void *) +#define CRUS_SP_IOCTL_SET_CALIB _IOWR(SPK_PROT_IOCTL_MAGIC, 222, void *) +#define CRUS_SP_IOCTL_READ_CALIB_FROM_SLOT _IOWR(SPK_PROT_IOCTL_MAGIC, 223, void *) +#define CRUS_SP_IOCTL_WRITE_CALIB_TO_SLOT _IOWR(SPK_PROT_IOCTL_MAGIC, 224, void *) + +#define CRUS_SP_IOCTL_GET32 _IOWR(SPK_PROT_IOCTL_MAGIC, 219, \ + compat_uptr_t) +#define CRUS_SP_IOCTL_SET32 _IOWR(SPK_PROT_IOCTL_MAGIC, 220, \ + compat_uptr_t) +#define CRUS_SP_IOCTL_GET_CALIB32 _IOWR(SPK_PROT_IOCTL_MAGIC, 221, \ + compat_uptr_t) +#define CRUS_SP_IOCTL_SET_CALIB32 _IOWR(SPK_PROT_IOCTL_MAGIC, 222, \ + compat_uptr_t) +#define CRUS_SP_IOCTL_READ_CALIB_FROM_SLOT32 _IOWR(SPK_PROT_IOCTL_MAGIC, 223, \ + compat_uptr_t) +#define CRUS_SP_IOCTL_WRITE_CALIB_TO_SLOT32 _IOWR(SPK_PROT_IOCTL_MAGIC, 224, \ + compat_uptr_t) + +struct crus_sp_ioctl_header { + uint32_t size; + uint32_t module_id; + uint32_t param_id; + uint32_t data_length; + void *data; +}; + +#endif /* _UAPI_MSM_CIRRUS_SPK_PR_H */ From 8bfa365980289641162d2046914437e5bf6b08b7 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 18:20:39 +0530 Subject: [PATCH 089/127] ASoC: Add Speaker ID platform driver Signed-off-by: UtsavBalar1231 --- asoc/codecs/spk-id.c | 215 +++++++++++++++++++++++++++++++++++++++++++ asoc/codecs/spk-id.h | 32 +++++++ 2 files changed, 247 insertions(+) create mode 100755 asoc/codecs/spk-id.c create mode 100755 asoc/codecs/spk-id.h diff --git a/asoc/codecs/spk-id.c b/asoc/codecs/spk-id.c new file mode 100755 index 000000000000..6de016000efb --- /dev/null +++ b/asoc/codecs/spk-id.c @@ -0,0 +1,215 @@ +/* Copyright (c) 2016, 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#define DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "spk-id.h" + + +struct spk_id_info { + struct pinctrl *pinctrl; + struct pinctrl_state *pull_down; + struct pinctrl_state *pull_up; + struct pinctrl_state *no_pull; + int gpio; + int state; +}; + + +static struct spk_id_info *spk_id_get_info(struct device_node *np) +{ + struct platform_device *pdev; + struct spk_id_info *info; + + if (!np) { + pr_err("%s: device node is null\n", __func__); + return NULL; + } + + pdev = of_find_device_by_node(np); + if (!pdev) { + pr_err("%s: platform device not found!\n", __func__); + return NULL; + } + + info = dev_get_drvdata(&pdev->dev); + if (!info) + dev_err(&pdev->dev, "%s: cannot find spk id info\n", __func__); + + return info; +} + +int spk_id_get_pin_3state(struct device_node *np) +{ + struct spk_id_info *info; + int pu = 0; + int pd = 0; + + info = spk_id_get_info(np); + if (!info) + return -EINVAL; + + if (IS_ERR_OR_NULL(info->pinctrl)) { + pr_err("%s: pin ctrl is invalid:%ld\n", __func__, PTR_ERR(info->pinctrl)); + return -EINVAL; + } + + if (!gpio_is_valid(info->gpio)) { + pr_err("%s: gpio is invalid:%d\n", __func__, info->gpio); + return -EINVAL; + } + + pinctrl_select_state(info->pinctrl, info->pull_down); + msleep(3); + pd = gpio_get_value(info->gpio); + + pinctrl_select_state(info->pinctrl, info->pull_up); + msleep(3); + pu = gpio_get_value(info->gpio); + + + if ((pd == pu) && (pd == 0)) { + pr_info("%s: id pin%d = %d\n", __func__, info->gpio, pd); + pinctrl_select_state(info->pinctrl, info->pull_down); + info->state = PIN_PULL_DOWN; + } else if ((pd == pu) && (pd == 1)) { + pr_info("%s: id pin%d = %d\n", __func__, info->gpio, pd); + pinctrl_select_state(info->pinctrl, info->pull_up); + info->state = PIN_PULL_UP; + } else { + pr_info("%s: id pin%d = 2\n", __func__, info->gpio); + pinctrl_select_state(info->pinctrl, info->no_pull); + info->state = PIN_FLOAT; + } + + return info->state; +} +EXPORT_SYMBOL(spk_id_get_pin_3state); + +static int spk_id_probe(struct platform_device *pdev) +{ + int ret = 0; + struct spk_id_info *info; + + info = devm_kzalloc(&pdev->dev, + sizeof(struct spk_id_info), + GFP_KERNEL); + if (!info) + return -ENOMEM; + + dev_dbg(&pdev->dev, "%s: device %s\n", __func__, pdev->name); + info->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR_OR_NULL(info->pinctrl)) { + dev_err(&pdev->dev, "%s: Cannot get speaker id gpio pinctrl:%ld\n", + __func__, PTR_ERR(info->pinctrl)); + ret = PTR_ERR(info->pinctrl); + goto err_pctrl_get; + } + + info->pull_down = pinctrl_lookup_state( + info->pinctrl, "pull_down"); + if (IS_ERR_OR_NULL(info->pull_down)) { + dev_err(&pdev->dev, "%s: Cannot get pull_down pinctrl state:%ld\n", + __func__, PTR_ERR(info->pull_down)); + ret = PTR_ERR(info->pull_down); + goto err_lookup_state; + } + + info->pull_up = pinctrl_lookup_state( + info->pinctrl, "pull_up"); + if (IS_ERR_OR_NULL(info->pull_up)) { + dev_err(&pdev->dev, "%s: Cannot get pull_up pinctrl state:%ld\n", + __func__, PTR_ERR(info->pull_up)); + ret = PTR_ERR(info->pull_up); + goto err_lookup_state; + } + + info->no_pull = pinctrl_lookup_state( + info->pinctrl, "no_pull"); + if (IS_ERR_OR_NULL(info->no_pull)) { + dev_err(&pdev->dev, "%s: Cannot get no_pull pinctrl state:%ld\n", + __func__, PTR_ERR(info->no_pull)); + ret = PTR_ERR(info->no_pull); + goto err_lookup_state; + } + + info->gpio = of_get_named_gpio(pdev->dev.of_node, + "audio,speaker-id-gpio", 0); + if (gpio_is_valid(info->gpio)) { + ret = gpio_request(info->gpio, "speaker-id"); + if (ret) { + dev_err(&pdev->dev, "%s: Failed to request gpio %d\n", + __func__, info->gpio); + goto err_lookup_state; + } + } + + dev_set_drvdata(&pdev->dev, info); + return 0; + +err_lookup_state: + devm_pinctrl_put(info->pinctrl); +err_pctrl_get: + devm_kfree(&pdev->dev, info); + return ret; +} + +static int spk_id_remove(struct platform_device *pdev) +{ + struct spk_id_info *info; + + info = dev_get_drvdata(&pdev->dev); + + if (info) { + if (info->pinctrl) + devm_pinctrl_put(info->pinctrl); + if (gpio_is_valid(info->gpio)) + gpio_free(info->gpio); + } + + devm_kfree(&pdev->dev, info); + return 0; +} + +static const struct of_device_id spk_id_match[] = { + {.compatible = "audio,speaker-id"}, + {} +}; + +static struct platform_driver spk_id_driver = { + .driver = { + .name = "spk-id", + .owner = THIS_MODULE, + .of_match_table = spk_id_match, + }, + .probe = spk_id_probe, + .remove = spk_id_remove, +}; +//module_platform_driver(spk_id_driver); + +static int __init spk_id_init(void) +{ + return platform_driver_register(&spk_id_driver); +} +module_init(spk_id_init); + + +MODULE_DESCRIPTION("Speaker ID platform driver"); +MODULE_LICENSE("GPL v2"); diff --git a/asoc/codecs/spk-id.h b/asoc/codecs/spk-id.h new file mode 100755 index 000000000000..3e99afd03007 --- /dev/null +++ b/asoc/codecs/spk-id.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2016, 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __SPK_ID_H_ +#define __SPK_ID_H_ + +#include +#include + +#define PIN_PULL_DOWN 0 +#define PIN_PULL_UP 1 +#define PIN_FLOAT 2 + +#define VENDOR_ID_NONE 0 +#define VENDOR_ID_AAC 1 +#define VENDOR_ID_SSI 2 +#define VENDOR_ID_GOER 3 + +#define VENDOR_ID_UNKNOWN 4 + +extern int spk_id_get_pin_3state(struct device_node *np); + +#endif From 505e303e230c4b0c670aeb532e5da5b2ec05adde Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 18:25:45 +0530 Subject: [PATCH 090/127] ASoC: wcd-mbhc: Modify mbhc mic bias control - Initial bringup for headphone jack support - Extracted from MiCode/vendor_qcom_opensource_audio-kernel at branch 'cepheus-q-oss' Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd-mbhc-adc.c | 9 +++------ asoc/codecs/wcd-mbhc-v2.c | 28 +++++----------------------- 2 files changed, 8 insertions(+), 29 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-adc.c b/asoc/codecs/wcd-mbhc-adc.c index 96d1c8266764..cb4a79b9eab9 100644 --- a/asoc/codecs/wcd-mbhc-adc.c +++ b/asoc/codecs/wcd-mbhc-adc.c @@ -503,18 +503,15 @@ static bool wcd_is_special_headset(struct wcd_mbhc *mbhc) static void wcd_mbhc_adc_update_fsm_source(struct wcd_mbhc *mbhc, enum wcd_mbhc_plug_type plug_type) { - bool micbias2; - - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); switch (plug_type) { case MBHC_PLUG_TYPE_HEADPHONE: WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); break; case MBHC_PLUG_TYPE_HEADSET: case MBHC_PLUG_TYPE_ANC_HEADPHONE: - if (!mbhc->is_hs_recording && !micbias2) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); + mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, + MIC_BIAS_2, MICB_PULLUP_ENABLE); break; default: WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index ffe573e33adb..2ea4b10a2ce4 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -214,7 +214,6 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, struct snd_soc_codec *codec = mbhc->codec; bool micbias2 = false; bool micbias1 = false; - u8 fsm_en = 0; pr_debug("%s: event %s (%d)\n", __func__, wcd_mbhc_get_event_string(event), event); @@ -254,13 +253,7 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, MBHC_COMMON_MICB_PRECHARGE, false); out_micb_en: - /* Disable current source if micbias enabled */ - if (mbhc->mbhc_cb->mbhc_micbias_control) { - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - if (fsm_en) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, - 0); - } else { + if (!mbhc->mbhc_cb->mbhc_micbias_control) { mbhc->is_hs_recording = true; wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); } @@ -269,18 +262,6 @@ out_micb_en: mbhc->mbhc_cb->set_cap_mode(codec, micbias1, true); break; case WCD_EVENT_PRE_MICBIAS_2_OFF: - /* - * Before MICBIAS_2 is turned off, if FSM is enabled, - * make sure current source is enabled so as to detect - * button press/release events - */ - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->micbias_enable) { - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - if (fsm_en) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, - 3); - } break; /* MICBIAS usage change */ case WCD_EVENT_POST_DAPM_MICBIAS_2_OFF: @@ -845,6 +826,8 @@ void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, /* Disable HW FSM and current source */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); + mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, + MIC_BIAS_2, MICB_PULLUP_DISABLE); /* Setup for insertion detection */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 1); @@ -975,6 +958,8 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) /* Disable HW FSM */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); + mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, + MIC_BIAS_2, MICB_PULLUP_DISABLE); if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, MBHC_COMMON_MICB_TAIL_CURR, false); @@ -1414,9 +1399,6 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) /* Button Debounce set to 16ms */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_DBNC, 2); - /* Enable micbias ramp */ - if (mbhc->mbhc_cb->mbhc_micb_ramp_control) - mbhc->mbhc_cb->mbhc_micb_ramp_control(codec, true); /* enable bias */ mbhc->mbhc_cb->mbhc_bias(codec, true); /* enable MBHC clock */ From 025ce97a6dd4f0211a27d0341e6fe9176c1624d9 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 18:27:44 +0530 Subject: [PATCH 091/127] ASoC: wcd-mbhc-v2: Set insertion debounce time to 256ms Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd-mbhc-v2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index 2ea4b10a2ce4..28e6d6a265ff 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -1392,8 +1392,8 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) /* Insertion debounce set to 48ms */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_INSREM_DBNC, 4); } else { - /* Insertion debounce set to 96ms */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_INSREM_DBNC, 6); + /* Insertion debounce set to 256ms */ + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_INSREM_DBNC, 9); } /* Button Debounce set to 16ms */ From 139133b23147d28da81d6a1322fea6a393bc5e80 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 18:34:32 +0530 Subject: [PATCH 092/127] ASoC: wcd-mbhc-v2: Add Support for USB-C analog Audio - Extracted from MiCode/vendor_qcom_opensource_audio-kernel at branch 'cepheus-q-oss' Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd-mbhc-v2.c | 317 ++++++++++++++++++++++++++++++++++++-- asoc/codecs/wcd-mbhc-v2.h | 25 +++ asoc/sm8150.c | 243 ++++++++++++++++++++++++++++- 3 files changed, 570 insertions(+), 15 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index 28e6d6a265ff..9cb62a35b6ae 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -34,6 +34,8 @@ #include "wcd-mbhc-adc.h" #include "wcd-mbhc-v2-api.h" +#define CONFIG_AUDIO_UART_DEBUG + void wcd_mbhc_jack_report(struct wcd_mbhc *mbhc, struct snd_soc_jack *jack, int status, int mask) { @@ -795,6 +797,9 @@ void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, * Nothing was reported previously * report a headphone or unsupported */ + if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) + wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); + wcd_mbhc_report_plug(mbhc, 1, SND_JACK_HEADPHONE); } else if (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP) { if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) @@ -811,6 +816,9 @@ void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, if (anc_mic_found) jack_type = SND_JACK_ANC_HEADPHONE; + if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) + wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE); + /* * If Headphone was reported previously, this will * only report the mic line @@ -887,6 +895,8 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) bool micbias1 = false; struct snd_soc_codec *codec = mbhc->codec; enum snd_jack_types jack_type; + struct usbc_ana_audio_config *config = + &mbhc->mbhc_cfg->usbc_analog_cfg; dev_dbg(codec->dev, "%s: enter\n", __func__); WCD_MBHC_RSC_LOCK(mbhc); @@ -1004,6 +1014,12 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 1); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); mbhc->extn_cable_hph_rem = false; + + if (config->usbc_en1_gpio_p) { + msm_cdc_pinctrl_select_sleep_state(config->usbc_en1_gpio_p); + pr_info("wcd_mbhc_swch_irq_handler: switch L/R to usb \n"); + } + wcd_mbhc_report_plug(mbhc, 0, jack_type); if (mbhc->mbhc_cfg->enable_usbc_analog) { @@ -1070,21 +1086,27 @@ int wcd_mbhc_get_button_mask(struct wcd_mbhc *mbhc) switch (btn) { case 0: mask = SND_JACK_BTN_0; + pr_debug("%s() button is 0x%x[hook]", __func__, mask); break; case 1: mask = SND_JACK_BTN_1; + pr_debug("%s() button is 0x%x[volume up]", __func__, mask); break; case 2: mask = SND_JACK_BTN_2; + pr_debug("%s() button is 0x%x[volume down]", __func__, mask); break; case 3: mask = SND_JACK_BTN_3; + pr_debug("%s() button is 0x%x", __func__, mask); break; case 4: mask = SND_JACK_BTN_4; + pr_debug("%s() button is 0x%x", __func__, mask); break; case 5: mask = SND_JACK_BTN_5; + pr_debug("%s() button is 0x%x", __func__, mask); break; default: break; @@ -1361,6 +1383,9 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) * by an external source */ if (mbhc->mbhc_cfg->enable_usbc_analog) { + mbhc->hphl_swh = 0; + mbhc->gnd_swh = 0; + if (mbhc->mbhc_cb->hph_pull_up_control_v2) mbhc->mbhc_cb->hph_pull_up_control_v2(codec, HS_PULLUP_I_OFF); @@ -1558,6 +1583,181 @@ static int wcd_mbhc_set_keycode(struct wcd_mbhc *mbhc) return result; } +static int wcd_mbhc_usb_c_analog_setup_gpios(struct wcd_mbhc *mbhc, + bool active) +{ + int rc = 0; + struct usbc_ana_audio_config *config = + &mbhc->mbhc_cfg->usbc_analog_cfg; + + dev_dbg(mbhc->codec->dev, "%s: setting GPIOs active = %d\n", + __func__, active); + + if (active) { + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MIC_CLAMP_CTL, 2); + mbhc->mbhc_cfg->enable_dual_adc_gpio(mbhc->mbhc_cfg->dual_adc_gpio_node, 0); +#ifdef CONFIG_AUDIO_UART_DEBUG + msm_cdc_pinctrl_select_active_state(config->uart_audio_switch_gpio_p); + dev_dbg(mbhc->codec->dev, "disable uart\n"); +#endif + if (config->usbc_en1_gpio_p) + rc = msm_cdc_pinctrl_select_active_state( + config->usbc_en1_gpio_p); + if (rc == 0 && config->usbc_force_gpio_p) + rc = msm_cdc_pinctrl_select_active_state( + config->usbc_force_gpio_p); + mbhc->usbc_mode = POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER; + + //enable MBHC detect + if (mbhc->mbhc_cb->clk_setup) + mbhc->mbhc_cb->clk_setup(mbhc->codec, true); + /* insertion detected, enable L_DET_EN */ + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); + } else { + /* no delay is required when disabling GPIOs */ + if (config->usbc_en1_gpio_p) + msm_cdc_pinctrl_select_sleep_state( + config->usbc_en1_gpio_p); + if (config->usbc_force_gpio_p) + msm_cdc_pinctrl_select_sleep_state( + config->usbc_force_gpio_p); +#ifdef CONFIG_AUDIO_UART_DEBUG + msm_cdc_pinctrl_select_sleep_state(config->uart_audio_switch_gpio_p); + dev_dbg(mbhc->codec->dev, "enable uart\n"); +#endif + mbhc->mbhc_cfg->enable_dual_adc_gpio(mbhc->mbhc_cfg->dual_adc_gpio_node, 1); + + mbhc->usbc_mode = POWER_SUPPLY_TYPEC_NONE; + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MIC_CLAMP_CTL, 0); + if (mbhc->mbhc_cfg->swap_gnd_mic) + mbhc->mbhc_cfg->swap_gnd_mic(mbhc->codec, false); + } + + return rc; +} + +/* workqueue */ +static void wcd_mbhc_usbc_analog_work_fn(struct work_struct *work) +{ + struct wcd_mbhc *mbhc = + container_of(work, struct wcd_mbhc, usbc_analog_work); + + wcd_mbhc_usb_c_analog_setup_gpios(mbhc, + mbhc->usbc_mode != POWER_SUPPLY_TYPEC_NONE); +} + +/* this callback function is used to process PMI notification */ +static int wcd_mbhc_usb_c_event_changed(struct notifier_block *nb, + unsigned long evt, void *ptr) +{ + int ret; + union power_supply_propval mode; + struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, psy_nb); + struct snd_soc_codec *codec = mbhc->codec; + + if (ptr != mbhc->usb_psy || evt != PSY_EVENT_PROP_CHANGED) + return 0; + + ret = power_supply_get_property(mbhc->usb_psy, + POWER_SUPPLY_PROP_TYPEC_MODE, &mode); + if (ret) { + dev_err(codec->dev, "%s: Unable to read USB TYPEC_MODE: %d\n", + __func__, ret); + return ret; + } + + dev_dbg(codec->dev, "%s: USB change event received\n", + __func__); + dev_dbg(codec->dev, "%s: supply mode %d, expected %d\n", __func__, + mode.intval, POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER); + + switch (mode.intval) { + case POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER: + case POWER_SUPPLY_TYPEC_NONE: + dev_dbg(codec->dev, "%s: usbc_mode: %d; mode.intval: %d\n", + __func__, mbhc->usbc_mode, mode.intval); + + if (mbhc->usbc_mode == mode.intval) + break; /* filter notifications received before */ + mbhc->usbc_mode = mode.intval; + + dev_dbg(codec->dev, "%s: queueing usbc_analog_work\n", + __func__); + schedule_work(&mbhc->usbc_analog_work); + break; + default: + break; + } + return ret; +} + +/* PMI registration code */ +static int wcd_mbhc_usb_c_analog_init(struct wcd_mbhc *mbhc) +{ + int ret = 0; + struct snd_soc_codec *codec = mbhc->codec; + + dev_dbg(mbhc->codec->dev, "%s: usb-c analog setup start\n", __func__); + INIT_WORK(&mbhc->usbc_analog_work, wcd_mbhc_usbc_analog_work_fn); + + mbhc->usb_psy = power_supply_get_by_name("usb"); + if (IS_ERR_OR_NULL(mbhc->usb_psy)) { + dev_err(codec->dev, "%s: could not get USB psy info\n", + __func__); + ret = -EPROBE_DEFER; + if (IS_ERR(mbhc->usb_psy)) + ret = PTR_ERR(mbhc->usb_psy); + mbhc->usb_psy = NULL; + goto err; + } + + ret = wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); + if (ret) { + dev_err(codec->dev, "%s: error while setting USBC ana gpios\n", + __func__); + goto err; + } + +err: + return ret; +} + +static int wcd_mbhc_usb_c_analog_deinit(struct wcd_mbhc *mbhc) +{ + wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); + + /* deregister from PMI */ + power_supply_unreg_notifier(&mbhc->psy_nb); + + return 0; +} + +static int wcd_mbhc_init_gpio(struct wcd_mbhc *mbhc, + struct wcd_mbhc_config *mbhc_cfg, + const char *gpio_dt_str, + int *gpio, struct device_node **gpio_dn) +{ + int rc = 0; + struct snd_soc_codec *codec = mbhc->codec; + struct snd_soc_card *card = codec->component.card; + + dev_dbg(mbhc->codec->dev, "%s: gpio %s\n", __func__, gpio_dt_str); + + *gpio_dn = of_parse_phandle(card->dev->of_node, gpio_dt_str, 0); + + if (!(*gpio_dn)) { + *gpio = of_get_named_gpio(card->dev->of_node, gpio_dt_str, 0); + if (!gpio_is_valid(*gpio)) { + dev_err(card->dev, "%s, property %s not in node %s", + __func__, gpio_dt_str, + card->dev->of_node->full_name); + rc = -EINVAL; + } + } + + return rc; +} + static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, unsigned long mode, void *ptr) { @@ -1580,13 +1780,16 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) { int rc = 0; + struct usbc_ana_audio_config *config; struct snd_soc_codec *codec; struct snd_soc_card *card; const char *usb_c_dt = "qcom,msm-mbhc-usbc-audio-supported"; + const char *fsa4476_dt = "qcom,fsa4476-gpio-support"; if (!mbhc || !mbhc_cfg) return -EINVAL; + config = &mbhc_cfg->usbc_analog_cfg; codec = mbhc->codec; card = codec->component.card; @@ -1614,13 +1817,59 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) dev_dbg(mbhc->codec->dev, "%s: usbc analog enabled\n", __func__); mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD; - mbhc->fsa_np = of_parse_phandle(card->dev->of_node, - "fsa4480-i2c-handle", 0); - if (!mbhc->fsa_np) { - dev_err(card->dev, "%s: fsa4480 i2c node not found\n", + + mbhc_cfg->use_fsa4476_gpio = 0; + if (of_find_property(card->dev->of_node, fsa4476_dt, NULL)) { + rc = of_property_read_u32(card->dev->of_node, fsa4476_dt, + &mbhc_cfg->use_fsa4476_gpio); + if (rc != 0) { + dev_dbg(card->dev, + "%s: %s in dt node is missing or false\n", + __func__, fsa4476_dt); + } + } + + if (mbhc_cfg->use_fsa4476_gpio != 0) { + rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, + "qcom,usbc-analog-en1-gpio", + &config->usbc_en1_gpio, + &config->usbc_en1_gpio_p); + if (rc) + goto err; + + dev_dbg(mbhc->codec->dev, "%s: calling usb_c_analog_init\n", __func__); - rc = -EINVAL; - goto err; + +#ifdef CONFIG_AUDIO_UART_DEBUG + if (of_find_property(card->dev->of_node, + "qcom,uart-audio-sw-gpio", + NULL)) { + rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, + "qcom,uart-audio-sw-gpio", + &config->uart_audio_switch_gpio, + &config->uart_audio_switch_gpio_p); + if (rc) + goto err; + } +#endif + rc = wcd_mbhc_usb_c_analog_init(mbhc); + if (rc) { + rc = EPROBE_DEFER; + goto err; + } + dev_dbg(card->dev, "%s: Using fsa4476 analog gpio switch\n", __func__); + } else { + mbhc->fsa_np = of_parse_phandle(card->dev->of_node, + "fsa4480-i2c-handle", 0); + if (!mbhc->fsa_np) { + dev_err(card->dev, "%s: fsa4480 i2c node not found\n", + __func__); + rc = -EINVAL; + goto err; + } else { + dev_dbg(card->dev, + "%s: Using USB fsa4480 i2c switch\n", __func__); + } } } @@ -1647,20 +1896,54 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) } if (mbhc_cfg->enable_usbc_analog) { - mbhc->fsa_nb.notifier_call = wcd_mbhc_usbc_ana_event_handler; - mbhc->fsa_nb.priority = 0; - rc = fsa4480_reg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); + if (mbhc_cfg->use_fsa4476_gpio == 0) { + mbhc->fsa_nb.notifier_call = wcd_mbhc_usbc_ana_event_handler; + mbhc->fsa_nb.priority = 0; + rc = fsa4480_reg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); + } else { + mbhc->psy_nb.notifier_call = wcd_mbhc_usb_c_event_changed; + mbhc->psy_nb.priority = 0; + rc = power_supply_reg_notifier(&mbhc->psy_nb); + if (rc) { + dev_err(codec->dev, "%s: power supply registration failed\n", + __func__); + goto err; + } + + /* + * as part of the init sequence check if there is a connected + * USB C analog adapter + */ + dev_dbg(mbhc->codec->dev, "%s: verify if USB adapter is already inserted\n", + __func__); + rc = wcd_mbhc_usb_c_event_changed(&mbhc->psy_nb, + PSY_EVENT_PROP_CHANGED, + mbhc->usb_psy); + } } return rc; err: + if (config->usbc_en1_gpio > 0) { + dev_dbg(card->dev, "%s free usb en1 gpio %d\n", + __func__, config->usbc_en1_gpio); + gpio_free(config->usbc_en1_gpio); + config->usbc_en1_gpio = 0; + } + if (config->usbc_en1_gpio_p) + of_node_put(config->usbc_en1_gpio_p); + if (config->usbc_force_gpio_p) + of_node_put(config->usbc_force_gpio_p); dev_dbg(mbhc->codec->dev, "%s: leave %d\n", __func__, rc); + return rc; } EXPORT_SYMBOL(wcd_mbhc_start); void wcd_mbhc_stop(struct wcd_mbhc *mbhc) { + struct usbc_ana_audio_config *config = &mbhc->mbhc_cfg->usbc_analog_cfg; + pr_debug("%s: enter\n", __func__); if (mbhc->current_plug != MBHC_PLUG_TYPE_NONE) { @@ -1685,8 +1968,20 @@ void wcd_mbhc_stop(struct wcd_mbhc *mbhc) mbhc->mbhc_cal = NULL; } - if (mbhc->mbhc_cfg->enable_usbc_analog) - fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); + if (mbhc->mbhc_cfg->enable_usbc_analog) { + if (mbhc->mbhc_cfg->use_fsa4476_gpio == 0) { + fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); + } + + wcd_mbhc_usb_c_analog_deinit(mbhc); + + /* free GPIOs */ + if (config->usbc_en1_gpio > 0) + gpio_free(config->usbc_en1_gpio); + + if (config->usbc_en1_gpio_p) + of_node_put(config->usbc_en1_gpio_p); + } pr_debug("%s: leave\n", __func__); } diff --git a/asoc/codecs/wcd-mbhc-v2.h b/asoc/codecs/wcd-mbhc-v2.h index a20765f56691..f6dc1fec2265 100644 --- a/asoc/codecs/wcd-mbhc-v2.h +++ b/asoc/codecs/wcd-mbhc-v2.h @@ -423,6 +423,21 @@ enum mbhc_moisture_rref { R_184_KOHM, }; +struct usbc_ana_audio_config { + int usbc_en1_gpio; + int usbc_en2_gpio; + int usbc_force_gpio; + int euro_us_hw_switch_gpio; + int uart_audio_switch_gpio; + int subpcb_id_gpio; + struct device_node *usbc_en1_gpio_p; /* used by pinctrl API */ + struct device_node *usbc_en2_gpio_p; /* used by pinctrl API */ + struct device_node *usbc_force_gpio_p; /* used by pinctrl API */ + struct device_node *euro_us_hw_switch_gpio_p; /* used by pinctrl API */ + struct device_node *uart_audio_switch_gpio_p; /* used by pinctrl API */ + struct device_node *subpcb_id_gpio_p; /* used by pinctrl API */ +}; + struct wcd_mbhc_config { bool read_fw_bin; void *calibration; @@ -438,7 +453,11 @@ struct wcd_mbhc_config { int anc_micbias; bool enable_anc_mic_detect; u32 enable_usbc_analog; + struct usbc_ana_audio_config usbc_analog_cfg; + u32 use_fsa4476_gpio; bool moisture_duty_cycle_en; + void (*enable_dual_adc_gpio)(struct device_node *node, bool en); + struct device_node *dual_adc_gpio_node; }; struct wcd_mbhc_intr { @@ -598,6 +617,12 @@ struct wcd_mbhc { unsigned long intr_status; bool is_hph_ocp_pending; + bool usbc_force_pr_mode; + int usbc_mode; + struct notifier_block psy_nb; + struct power_supply *usb_psy; + struct work_struct usbc_analog_work; + struct wcd_mbhc_fn *mbhc_fn; bool force_linein; struct device_node *fsa_np; diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 63453faef3e5..2890cba8f5ed 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -175,10 +175,13 @@ struct msm_pinctrl_info { struct msm_asoc_mach_data { struct snd_info_entry *codec_root; struct msm_pinctrl_info pinctrl_info; + int usbc_en2_gpio; /* used by gpio driver API */ struct device_node *us_euro_gpio_p; /* used by pinctrl API */ + struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */ struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ struct device_node *fsa_handle; + struct device_node *adc2_sel_gpio_p; /* used by pinctrl API */ struct snd_soc_codec *codec; struct work_struct adsp_power_up_work; }; @@ -2954,6 +2957,32 @@ static int msm_hifi_put(struct snd_kcontrol *kcontrol, return 0; } +static int usbhs_direction_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = NULL; + struct snd_soc_card *card = NULL; + struct msm_asoc_mach_data *pdata = NULL; + + ucontrol->value.integer.value[0] = 0; + + codec = snd_soc_kcontrol_codec(kcontrol); + if (codec) { + card = codec->component.card; + if (card) { + pdata = snd_soc_card_get_drvdata(card); + if (pdata){ + if (pdata->usbc_en2_gpio_p) { + ucontrol->value.integer.value[0] = gpio_get_value_cansleep(pdata->usbc_en2_gpio); + } else if (pdata->usbc_en2_gpio > 0) { + ucontrol->value.integer.value[0] = gpio_get_value_cansleep(pdata->usbc_en2_gpio); + } + } + } + } + return 0; +} + static const struct snd_kcontrol_new msm_snd_controls[] = { SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, slim_rx_ch_get, slim_rx_ch_put), @@ -3240,6 +3269,8 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, msm_hifi_put), + SOC_SINGLE_EXT("USB Headset Direction", 0, 0, UINT_MAX, 0, + usbhs_direction_get, NULL), SOC_SINGLE_MULTI_EXT("TDM Slot Map", SND_SOC_NOPM, 0, 255, 0, 4, NULL, tdm_slot_map_put), @@ -3346,6 +3377,60 @@ static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, return 0; } +/* +static int external_amic2_sel_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = amic2_sel_state; + return 0; +} +*/ + +static void external_enable_dual_adc_gpio(struct device_node *np, bool val) +{ + if (!np) { + pr_err("%s: device node is NULL!", __func__); + return; + } + + if (val == 1) { + msm_cdc_pinctrl_select_active_state(np); + pr_info("%s: enable Dual ADC \n", __func__); + } else { + msm_cdc_pinctrl_select_sleep_state(np); + pr_info("%s: disable Dual ADC \n", __func__); + } +} + +static int external_amic2_sel_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); + struct snd_soc_card *card = dapm->card; + struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); + unsigned int val; + + val = ucontrol->value.enumerated.item[0]; + + if (!pdata || !pdata->adc2_sel_gpio_p) { + pr_err("%s: adc2_sel_gpio is invalid\n", __func__); + return -EINVAL; + } + + //TODO: need to fix adc2 amplitude less than 3db issue +// external_enable_dual_adc_gpio(pdata->adc2_sel_gpio_p, !!(val)); + pr_info("external_amic2_sel_put %u \n", val); + + return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); +} + +static const char *const external_AMIC2_enum_text[] = {"default", "Dual_ADC"}; + +static SOC_ENUM_SINGLE_VIRT_DECL(external_AMIC2_enum, external_AMIC2_enum_text); + +static const struct snd_kcontrol_new ext_amc2_mux = + SOC_DAPM_ENUM_EXT("External AMIC2 sel", external_AMIC2_enum, + snd_soc_dapm_get_enum_double, external_amic2_sel_put); static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, @@ -3394,6 +3479,19 @@ static const struct snd_soc_dapm_widget msm_dapm_widgets_tavil[] = { SND_SOC_DAPM_MIC("Digital Mic3", NULL), SND_SOC_DAPM_MIC("Digital Mic4", NULL), SND_SOC_DAPM_MIC("Digital Mic5", NULL), + SND_SOC_DAPM_MIC("Headset Mic2", NULL), +}; + +static const struct snd_soc_dapm_widget msm_dualadc_dapm_widgets[] = { + SND_SOC_DAPM_MUX("External AMIC2 Mux", SND_SOC_NOPM, 0, 0, &ext_amc2_mux), + SND_SOC_DAPM_INPUT("AMIC2_EXT_0"), + SND_SOC_DAPM_INPUT("AMIC2_EXT_1"), +}; + +static const struct snd_soc_dapm_route msm_dualadc_dapm_routes[] = { + {"AMIC2", NULL, "External AMIC2 Mux"}, + {"External AMIC2 Mux", "default", "AMIC2_EXT_0"}, + {"External AMIC2 Mux", "Dual_ADC", "AMIC2_EXT_1"}, }; static inline int param_is_mask(int p) @@ -3874,10 +3972,108 @@ static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - if (!pdata->fsa_handle) - return false; + struct pinctrl_state *en2_pinctrl_active; + struct pinctrl_state *en2_pinctrl_sleep; + int value = 0; + bool ret = 0; + int oldv; - return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP); + if (wcd_mbhc_cfg.use_fsa4476_gpio != 0) { + if (!pdata->usbc_en2_gpio_p) { + if (active) { + /* if active and usbc_en2_gpio undefined, get pin */ + pdata->usbc_en2_gpio_p = devm_pinctrl_get(card->dev); + if (IS_ERR_OR_NULL(pdata->usbc_en2_gpio_p)) { + dev_err(card->dev, + "%s: Can't get EN2 gpio pinctrl:%ld\n", + __func__, + PTR_ERR(pdata->usbc_en2_gpio_p)); + pdata->usbc_en2_gpio_p = NULL; + return false; + } + } else + /* if not active and usbc_en2_gpio undefined, return */ + return false; + } + + pdata->usbc_en2_gpio = of_get_named_gpio(card->dev->of_node, + "qcom,usbc-analog-en2-gpio", 0); + if (!gpio_is_valid(pdata->usbc_en2_gpio)) { + dev_err(card->dev, "%s, property %s not in node %s", + __func__, "qcom,usbc-analog-en2-gpio", + card->dev->of_node->full_name); + return false; + } + + en2_pinctrl_active = pinctrl_lookup_state( + pdata->usbc_en2_gpio_p, "aud_active"); + if (IS_ERR_OR_NULL(en2_pinctrl_active)) { + dev_err(card->dev, + "%s: Cannot get aud_active pinctrl state:%ld\n", + __func__, PTR_ERR(en2_pinctrl_active)); + ret = false; + goto err_lookup_state; + } + + en2_pinctrl_sleep = pinctrl_lookup_state( + pdata->usbc_en2_gpio_p, "aud_sleep"); + if (IS_ERR_OR_NULL(en2_pinctrl_sleep)) { + dev_err(card->dev, + "%s: Cannot get aud_sleep pinctrl state:%ld\n", + __func__, PTR_ERR(en2_pinctrl_sleep)); + ret = false; + goto err_lookup_state; + } + + /* if active and usbc_en2_gpio_p defined, swap using usbc_en2_gpio_p */ + if (active) { + dev_dbg(codec->dev, "%s: enter\n", __func__); + oldv = tavil_mb_pull_down(codec, true, 0); + if (wcd_mbhc_cfg.usbc_analog_cfg.euro_us_hw_switch_gpio_p) { + value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); + if (value) + msm_cdc_pinctrl_select_sleep_state( + wcd_mbhc_cfg.usbc_analog_cfg.euro_us_hw_switch_gpio_p); + else + msm_cdc_pinctrl_select_active_state( + wcd_mbhc_cfg.usbc_analog_cfg.euro_us_hw_switch_gpio_p); + } + else if (pdata->usbc_en2_gpio_p) { + value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); + if (value) + pinctrl_select_state(pdata->usbc_en2_gpio_p, + en2_pinctrl_sleep); + else + pinctrl_select_state(pdata->usbc_en2_gpio_p, + en2_pinctrl_active); + } else if (pdata->usbc_en2_gpio >= 0) { + value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); + gpio_set_value_cansleep(pdata->usbc_en2_gpio, !value); + } + tavil_mb_pull_down(codec, false, oldv); + pr_info("%s: swap select switch %d to %d\n", __func__, + value, !value); + ret = true; + } else { + /* if not active, release usbc_en2_gpio_p pin */ + pinctrl_select_state(pdata->usbc_en2_gpio_p, + en2_pinctrl_sleep); + } + } else { + if (!pdata->fsa_handle) + return false; + + return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP); + } + + +err_lookup_state: + if (wcd_mbhc_cfg.use_fsa4476_gpio != 0) { + devm_pinctrl_put(pdata->usbc_en2_gpio_p); + pdata->usbc_en2_gpio_p = NULL; + } + + return ret; } static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) @@ -4150,6 +4346,15 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) ARRAY_SIZE(wcd_audio_paths)); } + if (pdata->adc2_sel_gpio_p) { + pr_info("add the External AMIC2 Mux\n"); + snd_soc_dapm_new_controls(dapm, msm_dualadc_dapm_widgets, + ARRAY_SIZE(msm_dualadc_dapm_widgets)); + + snd_soc_dapm_add_routes(dapm, msm_dualadc_dapm_routes, + ARRAY_SIZE(msm_dualadc_dapm_routes)); + } + snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); @@ -4170,6 +4375,12 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) snd_soc_dapm_ignore_suspend(dapm, "WDMA3_OUT"); if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { + if (pdata->adc2_sel_gpio_p) { + snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC2_EXT_0"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC2_EXT_1"); + snd_soc_dapm_ignore_suspend(dapm, "Headset Mic2"); + } snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); @@ -7767,6 +7978,26 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) platform_set_drvdata(pdev, card); snd_soc_card_set_drvdata(card, pdata); + pdata->adc2_sel_gpio_p = of_parse_phandle(pdev->dev.of_node, + "qcom,adc2-switch-gpio", 0); + if (!pdata->adc2_sel_gpio_p) { + dev_err(&pdev->dev, "property %s not detected in node %s", + "qcom,adc2-switch-gpio", + pdev->dev.of_node->full_name); + } + + wcd_mbhc_cfg.dual_adc_gpio_node = pdata->adc2_sel_gpio_p; + wcd_mbhc_cfg.enable_dual_adc_gpio = external_enable_dual_adc_gpio; + pr_info("pdata->adc2_sel_gpio_p = %lx\n", (unsigned long)pdata->adc2_sel_gpio_p); + + pdata->usbc_en2_gpio = of_get_named_gpio(card->dev->of_node, + "qcom,usbc-analog-en2-gpio", 0); + if (!gpio_is_valid(pdata->usbc_en2_gpio)) { + dev_err(card->dev, "%s, property %s not in node %s", + __func__, "qcom,usbc-analog-en2-gpio", + card->dev->of_node->full_name); + } + ret = snd_soc_of_parse_card_name(card, "qcom,model"); if (ret) { dev_err(&pdev->dev, "parse card name failed, err:%d\n", @@ -7870,9 +8101,13 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node, "fsa4480-i2c-handle", 0); - if (!pdata->fsa_handle) + if (!pdata->fsa_handle) { dev_dbg(&pdev->dev, "property %s not detected in node %s\n", "fsa4480-i2c-handle", pdev->dev.of_node->full_name); + } else { + dev_dbg(&pdev->dev, "property %s is detected in node %s\n", + "fsa4480-i2c-handle", pdev->dev.of_node->full_name); + } /* Parse pinctrl info from devicetree */ ret = msm_get_pinctrl(pdev); From bf2920c7beee8ffe289444796f4712be4dcb9ba6 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 18:41:36 +0530 Subject: [PATCH 093/127] ASoC: wcd934x: Bringup tavil micbias support Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd934x/wcd934x-mbhc.c | 22 +++++++++ asoc/codecs/wcd934x/wcd934x-mbhc.h | 12 +++++ asoc/codecs/wcd934x/wcd934x.c | 77 ++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/asoc/codecs/wcd934x/wcd934x-mbhc.c b/asoc/codecs/wcd934x/wcd934x-mbhc.c index 3aa8fe7aea1c..e411aac3441c 100644 --- a/asoc/codecs/wcd934x/wcd934x-mbhc.c +++ b/asoc/codecs/wcd934x/wcd934x-mbhc.c @@ -987,6 +987,28 @@ int tavil_mbhc_get_impedance(struct wcd934x_mbhc *wcd934x_mbhc, } EXPORT_SYMBOL(tavil_mbhc_get_impedance); + +int tavil_mb_pull_down(struct snd_soc_codec *codec, bool active, + int value) +{ + int oldv = 0; + + if (active) { + oldv = snd_soc_read(codec, WCD934X_ANA_MICB2); + snd_soc_update_bits(codec, WCD934X_ANA_MBHC_ELECT, + 0x80, 0x00); + snd_soc_update_bits(codec, WCD934X_ANA_MICB2, 0xC0, 0xC0); + } else { + snd_soc_write(codec, WCD934X_ANA_MICB2, value); + snd_soc_update_bits(codec, WCD934X_ANA_MBHC_ELECT, + 0x80, 0x80); + } + + return oldv; +} +EXPORT_SYMBOL(tavil_mb_pull_down); + + /* * tavil_mbhc_hs_detect: starts mbhc insertion/removal functionality * @codec: handle to snd_soc_codec * diff --git a/asoc/codecs/wcd934x/wcd934x-mbhc.h b/asoc/codecs/wcd934x/wcd934x-mbhc.h index 53c886da0f6b..7995017f2e0d 100644 --- a/asoc/codecs/wcd934x/wcd934x-mbhc.h +++ b/asoc/codecs/wcd934x/wcd934x-mbhc.h @@ -47,6 +47,10 @@ extern int tavil_mbhc_post_ssr_init(struct wcd934x_mbhc *mbhc, struct snd_soc_codec *codec); extern int tavil_mbhc_get_impedance(struct wcd934x_mbhc *wcd934x_mbhc, uint32_t *zl, uint32_t *zr); + +extern int tavil_mb_pull_down(struct snd_soc_codec *codec, bool active, + int value); + #else static inline int tavil_mbhc_init(struct wcd934x_mbhc **mbhc, struct snd_soc_codec *codec, @@ -79,6 +83,14 @@ static inline int tavil_mbhc_get_impedance(struct wcd934x_mbhc *wcd934x_mbhc, *zr = 0; return -EINVAL; } + + +static inline int tavil_mb_pull_down(struct snd_soc_codec *codec, bool active, + int value) +{ + return 0; +} + #endif #endif /* __WCD934X_MBHC_H__ */ diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c index 300ffbc68d42..865ae424bac3 100644 --- a/asoc/codecs/wcd934x/wcd934x.c +++ b/asoc/codecs/wcd934x/wcd934x.c @@ -644,6 +644,7 @@ struct tavil_priv { struct platform_device *pdev_child_devices [WCD934X_CHILD_DEVICES_MAX]; int child_count; + int micbias_num; struct regulator *micb_load; int micb_load_low; int micb_load_high; @@ -5674,10 +5675,25 @@ static int tavil_compander_put(struct snd_kcontrol *kcontrol, /* Set Gain Source Select based on compander enable/disable */ snd_soc_update_bits(codec, WCD934X_HPH_L_EN, 0x20, (value ? 0x00:0x20)); + /* Disable Compander Clock */ + snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CFG0, 0x02, 0x00); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x04, 0x04); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x02, 0x02); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x02, 0x00); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x01, 0x00); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x04, 0x00); break; case COMPANDER_2: snd_soc_update_bits(codec, WCD934X_HPH_R_EN, 0x20, (value ? 0x00:0x20)); + /* Disable Compander Clock */ + snd_soc_update_bits(codec, WCD934X_CDC_RX2_RX_PATH_CFG0, 0x02, 0x00); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x04, 0x04); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x02, 0x02); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x02, 0x00); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x01, 0x00); + snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x04, 0x00); + break; case COMPANDER_3: case COMPANDER_4: @@ -6025,6 +6041,62 @@ static int tavil_mad_input_put(struct snd_kcontrol *kcontrol, return 0; } +static const char *const tavil_micbias_text[] = { + "OFF", "MICBIAS1", "MICBIAS2", "MICBIAS3", "MICBIAS4" +}; + +static const struct soc_enum tavil_micbias_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tavil_micbias_text), + tavil_micbias_text); + +static int tavil_micb_status_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = priv->micbias_num;; + + dev_dbg(codec->dev, "%s: tavil_micbias_num = %s\n", __func__, + tavil_micbias_text[priv->micbias_num]); + + return 0; +} + +static int tavil_micb_status_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); + u8 tavil_micbias_num; + + tavil_micbias_num = ucontrol->value.integer.value[0]; + + if (tavil_micbias_num >= sizeof(tavil_micbias_text)/ + sizeof(tavil_micbias_text[0])) { + dev_err(codec->dev, + "%s: tavil_micbias_num = %d out of bounds\n", + __func__, tavil_micbias_num); + return -EINVAL; + } + priv->micbias_num = tavil_micbias_num; + + if (tavil_micbias_num == 0) { + tavil_codec_enable_standalone_micbias(codec, 1, false); + tavil_codec_enable_standalone_micbias(codec, 2, false); + tavil_codec_enable_standalone_micbias(codec, 3, false); + tavil_codec_enable_standalone_micbias(codec, 4, false); + dev_err(codec->dev, "====>PFT: %s: turn off all micbias.\n", __func__); + } else { + tavil_codec_enable_standalone_micbias(codec, tavil_micbias_num, true); + dev_err(codec->dev, "====>PFT: %s: turn on micbias %d.\n", + __func__, tavil_micbias_num); + } + + return 0; +} + + static int tavil_ear_pa_gain_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -6524,6 +6596,10 @@ static const struct snd_kcontrol_new tavil_snd_controls[] = { SOC_ENUM_EXT("MAD Input", tavil_conn_mad_enum, tavil_mad_input_get, tavil_mad_input_put), + SOC_ENUM_EXT("Mic Bias", tavil_micbias_enum, + tavil_micb_status_get, tavil_micb_status_put), + + SOC_SINGLE_EXT("DMIC1_CLK_PIN_MODE", SND_SOC_NOPM, 17, 1, 0, tavil_dmic_pin_mode_get, tavil_dmic_pin_mode_put), @@ -11145,6 +11221,7 @@ static int tavil_probe(struct platform_device *pdev) tavil->swr.plat_data.clk = tavil_swrm_clock; tavil->swr.plat_data.handle_irq = tavil_swrm_handle_irq; tavil->swr.spkr_gain_offset = WCD934X_RX_GAIN_OFFSET_0_DB; + tavil->micbias_num = 0; /* Register for Clock */ wcd_ext_clk = clk_get(tavil->wcd9xxx->dev, "wcd_clk"); From 818945a3acbab519b08863f8e01d64e69d168a6f Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 18:51:47 +0530 Subject: [PATCH 094/127] ASoC: wcd934x: Boost HPH volume Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd934x/wcd934x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c index 865ae424bac3..02f8b88ee0d3 100644 --- a/asoc/codecs/wcd934x/wcd934x.c +++ b/asoc/codecs/wcd934x/wcd934x.c @@ -6400,8 +6400,8 @@ static const struct snd_kcontrol_new tavil_snd_controls[] = { SOC_ENUM_EXT("SPKR Right Boost Max State", tavil_spkr_boost_stage_enum, tavil_spkr_right_boost_stage_get, tavil_spkr_right_boost_stage_put), - SOC_SINGLE_TLV("HPHL Volume", WCD934X_HPH_L_EN, 0, 20, 1, line_gain), - SOC_SINGLE_TLV("HPHR Volume", WCD934X_HPH_R_EN, 0, 20, 1, line_gain), + SOC_SINGLE_TLV("HPHL Volume", WCD934X_HPH_L_EN, 0, 24, 1, line_gain), + SOC_SINGLE_TLV("HPHR Volume", WCD934X_HPH_R_EN, 0, 24, 1, line_gain), SOC_SINGLE_TLV("LINEOUT1 Volume", WCD934X_DIFF_LO_LO1_COMPANDER, 3, 16, 1, line_gain), SOC_SINGLE_TLV("LINEOUT2 Volume", WCD934X_DIFF_LO_LO2_COMPANDER, From f56dd9c2d483ace18f427ea7fe8f62f681fc0ce8 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:51:26 +0530 Subject: [PATCH 095/127] ASoC: wcd9xxx-common-v2: set hph mode on hph class-h state Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd9xxx-common-v2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/asoc/codecs/wcd9xxx-common-v2.c b/asoc/codecs/wcd9xxx-common-v2.c index 478c0c6d72e6..934519c9adee 100644 --- a/asoc/codecs/wcd9xxx-common-v2.c +++ b/asoc/codecs/wcd9xxx-common-v2.c @@ -794,6 +794,7 @@ static void wcd_clsh_state_hph_ear(struct snd_soc_codec *codec, wcd_clsh_set_gain_path(codec, mode); wcd_clsh_set_flyback_mode(codec, mode); wcd_clsh_set_buck_mode(codec, mode); + wcd_clsh_set_hph_mode(codec, mode); } } else { if (req_state == WCD_CLSH_STATE_EAR) { From 86aea8ba5034864558a9b4eb2fbd95edc0597e00 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:05:19 +0530 Subject: [PATCH 096/127] ASoC: wcd-dsp-mgr: Import WDSP firmware load changes Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd-dsp-mgr.c | 80 +++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/asoc/codecs/wcd-dsp-mgr.c b/asoc/codecs/wcd-dsp-mgr.c index b45a9b3b7516..402c8c85290a 100644 --- a/asoc/codecs/wcd-dsp-mgr.c +++ b/asoc/codecs/wcd-dsp-mgr.c @@ -85,6 +85,7 @@ static char *wdsp_get_cmpnt_type_string(enum wdsp_cmpnt_type); #define WDSP_SSR_STATUS_READY \ (WDSP_SSR_STATUS_WDSP_READY | WDSP_SSR_STATUS_CDC_READY) #define WDSP_SSR_READY_WAIT_TIMEOUT (10 * HZ) +#define WDSP_FW_LOAD_RETRY_COUNT 5 enum wdsp_ssr_type { @@ -383,7 +384,7 @@ static int wdsp_download_segments(struct wdsp_mgr_priv *wdsp, struct wdsp_img_segment *seg = NULL; enum wdsp_event_type pre, post; long status; - int ret; + int ret, retry_cnt = 0; ctl = WDSP_GET_COMPONENT(wdsp, WDSP_CMPNT_CONTROL); @@ -402,6 +403,7 @@ static int wdsp_download_segments(struct wdsp_mgr_priv *wdsp, ret = wdsp_get_segment_list(ctl->cdev, wdsp->img_fname, type, wdsp->seg_list, &wdsp->base_addr); + pr_info("%s: downloading wdsp firmware: %s.\n", __func__, wdsp->img_fname); if (ret < 0 || list_empty(wdsp->seg_list)) { WDSP_ERR(wdsp, "Error %d to get image segments for type %d", @@ -414,11 +416,23 @@ static int wdsp_download_segments(struct wdsp_mgr_priv *wdsp, /* Notify all components that image is about to be downloaded */ wdsp_broadcast_event_upseq(wdsp, pre, NULL); - /* Go through the list of segments and download one by one */ + /* + * Go through the list of segments and download one by one. + * For each segment that fails to dlownload retry for + * WDSP_FW_LOAD_RETRY_COUNT times + */ list_for_each_entry(seg, wdsp->seg_list, list) { - ret = wdsp_load_each_segment(wdsp, seg); - if (ret) + retry_cnt = WDSP_FW_LOAD_RETRY_COUNT; + do { + ret = wdsp_load_each_segment(wdsp, seg); + } while (ret < 0 && --retry_cnt > 0); + + if (ret < 0) { + WDSP_ERR(wdsp, + "Failed to download, error %d\n", + ret); goto dload_error; + } } /* Flush the list before setting status and notifying components */ @@ -433,7 +447,24 @@ done: dload_error: wdsp_flush_segment_list(wdsp->seg_list); - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_DLOAD_FAILED, NULL); + + /* + * code sections are downloaded at driver load and during SSR. + * Even if code section download fails, do not treat this + * as error to allow retry of code section download upon + * enable_dsp request. Since status flag is not set upon + * code section download failure, enable_dsp can check this + * and retry. + */ + if (type == WDSP_ELF_FLAG_RE) { + /* Notify all components that image is downloaded */ + wdsp_broadcast_event_downseq(wdsp, post, NULL); + ret = 0; + } else { + wdsp_broadcast_event_downseq(wdsp, + WDSP_EVENT_DLOAD_FAILED, NULL); + } + return ret; } @@ -482,19 +513,29 @@ static void wdsp_load_fw_image(struct work_struct *work) static int wdsp_enable_dsp(struct wdsp_mgr_priv *wdsp) { - int ret; - - /* Make sure wdsp is in good state */ - if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_CODE_DLOADED)) { - WDSP_ERR(wdsp, "WDSP in invalid state 0x%x", wdsp->status); - return -EINVAL; - } + int ret, retry_cnt = WDSP_FW_LOAD_RETRY_COUNT; /* * Acquire SSR mutex lock to make sure enablement of DSP * does not race with SSR handling. */ WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); + + /* Make sure wdsp is in good state */ + if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_CODE_DLOADED)) { + WDSP_ERR(wdsp, "WDSP in invalid state 0x%x", wdsp->status); + /* + * Since DSP state indicates that code sections are + * not downloaded. Try to download them again now. + */ + ret = wdsp_init_and_dload_code_sections(wdsp); + if (ret < 0) { + WDSP_ERR(wdsp, "Retry code dload failed %d", + ret); + goto done; + } + } +retry: /* Download the read-write sections of image */ ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_WRITE); if (ret < 0) { @@ -509,6 +550,15 @@ static int wdsp_enable_dsp(struct wdsp_mgr_priv *wdsp) if (ret < 0) { WDSP_ERR(wdsp, "Failed to boot dsp, err = %d", ret); WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_DATA_DLOADED); + if (retry_cnt-- >= 0) { + ret = wdsp_init_and_dload_code_sections(wdsp); + if (ret < 0) { + WDSP_ERR(wdsp, "Retry code dload failed %d", + ret); + goto done; + } + goto retry; + } goto done; } @@ -1065,6 +1115,9 @@ static void wdsp_mgr_debugfs_init(struct wdsp_mgr_priv *wdsp) debugfs_create_bool("panic_on_error", 0644, wdsp->entry, &wdsp->panic_on_error); + + debugfs_create_u32("wdsp_status", S_IRUGO, + wdsp->entry, &wdsp->status); } static void wdsp_mgr_debugfs_remove(struct wdsp_mgr_priv *wdsp) @@ -1203,6 +1256,9 @@ static int wdsp_mgr_parse_dt_entries(struct wdsp_mgr_priv *wdsp) return ret; } + wdsp->img_fname = "cpe_intl"; + pr_info("%s: using global wdsp fw: %s.\n", __func__, wdsp->img_fname); + ret = of_count_phandle_with_args(dev->of_node, "qcom,wdsp-components", NULL); From 44d272628e7629b92c5d54e1c103ee7aa7feac82 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:11:14 +0530 Subject: [PATCH 097/127] ASoC: wcd-spi: Return I/O error if WCD SPI suspended Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd-spi.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/asoc/codecs/wcd-spi.c b/asoc/codecs/wcd-spi.c index 7a56d6fdbc69..d9a5567f7341 100644 --- a/asoc/codecs/wcd-spi.c +++ b/asoc/codecs/wcd-spi.c @@ -1045,6 +1045,12 @@ static int wcd_spi_bus_gwrite(void *context, const void *reg, return -EINVAL; } + if (wcd_spi_is_suspended(wcd_spi)) { + dev_err(&spi->dev, + "%s: SPI suspended, cannot enable clk\n", + __func__); + return -EIO; + } memset(tx_buf, 0, WCD_SPI_CMD_IRW_LEN); tx_buf[0] = WCD_SPI_CMD_IRW; tx_buf[1] = *((u8 *)reg); @@ -1093,6 +1099,12 @@ static int wcd_spi_bus_read(void *context, const void *reg, __func__, reg_len, val_len); return -EINVAL; } + if (wcd_spi_is_suspended(wcd_spi)) { + dev_err(&spi->dev, + "%s: SPI suspended, cannot enable clk\n", + __func__); + return -EIO; + } memset(tx_buf, 0, WCD_SPI_CMD_IRR_LEN); tx_buf[0] = WCD_SPI_CMD_IRR; From c8423f7c4d0944e45b2bd577183cc6249d309348 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:21:11 +0530 Subject: [PATCH 098/127] ASoC: dsp: Add AFE_PORT_ID_PSEUDOPORT_01 routing support Signed-off-by: UtsavBalar1231 --- dsp/q6audio-v2.c | 3 +++ include/dsp/q6afe-v2.h | 2 ++ 2 files changed, 5 insertions(+) diff --git a/dsp/q6audio-v2.c b/dsp/q6audio-v2.c index 773cef67bb1f..e72ec1977c37 100644 --- a/dsp/q6audio-v2.c +++ b/dsp/q6audio-v2.c @@ -356,6 +356,8 @@ int q6audio_get_port_index(u16 port_id) return IDX_RT_PROXY_PORT_002_RX; case RT_PROXY_PORT_002_TX: return IDX_RT_PROXY_PORT_002_TX; + case AFE_PORT_ID_PSEUDOPORT_01: + return IDX_AFE_PORT_ID_PSEUDOPORT_01; default: return -EINVAL; } } @@ -1093,6 +1095,7 @@ int q6audio_validate_port(u16 port_id) case AFE_PORT_ID_RX_CODEC_DMA_RX_7: case RT_PROXY_PORT_002_RX: case RT_PROXY_PORT_002_TX: + case AFE_PORT_ID_PSEUDOPORT_01: { ret = 0; break; diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h index 731a3553f6fb..fde67d96d48d 100644 --- a/include/dsp/q6afe-v2.h +++ b/include/dsp/q6afe-v2.h @@ -268,6 +268,8 @@ enum { /* IDX 189 -> 190 */ IDX_RT_PROXY_PORT_002_RX, IDX_RT_PROXY_PORT_002_TX, + + IDX_AFE_PORT_ID_PSEUDOPORT_01, AFE_MAX_PORTS }; From 3c5f7ca7be85bbdde6e97b90fe5c46472c8cd710 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:18:43 +0530 Subject: [PATCH 099/127] ASoC: dsp: set channel_mode as 1 for ADM_TOPOLOGY_ID_AUDIO_RX_FVSAM topology Signed-off-by: UtsavBalar1231 --- dsp/q6adm.c | 5 ++++- include/dsp/apr_audio-v2.h | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dsp/q6adm.c b/dsp/q6adm.c index 89e25a9c9671..a7896a093c79 100644 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -2923,8 +2923,11 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, this_adm.ffecns_port_id); } - if (topology == VPM_TX_VOICE_SMECNS_V2_COPP_TOPOLOGY) + if (topology == VPM_TX_VOICE_SMECNS_V2_COPP_TOPOLOGY || + topology == ADM_TOPOLOGY_ID_AUDIO_RX_FVSAM) { + pr_debug("%s: set channel_mode as 1 for topology=%d\n", __func__, topology); channel_mode = 1; + } /* * Routing driver reuses the same adm for streams with the same diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h index 6a4a5bc95ed6..e5aec5bcf4e7 100644 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -5085,6 +5085,7 @@ struct afe_param_id_lpass_core_shared_clk_cfg { #define ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX 0x10015002 #define ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE 0x10028000 #define VPM_TX_DM_FLUENCE_EF_COPP_TOPOLOGY 0x10000005 +#define ADM_TOPOLOGY_ID_AUDIO_RX_FVSAM 0x1000FFF0 /* Memory map regions command payload used by the * #ASM_CMD_SHARED_MEM_MAP_REGIONS ,#ADM_CMD_SHARED_MEM_MAP_REGIONS @@ -11381,7 +11382,7 @@ struct afe_clk_set { * for enable and disable clock. * "clk_freq_in_hz", "clk_attri", and "clk_root" * are ignored in disable clock case. - * @values  + * @values * - 0 -- Disabled * - 1 -- Enabled @tablebulletend */ From 4037a7252642c21ea568d5e7cf815451c3982eb2 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:54:41 +0530 Subject: [PATCH 100/127] ASoC: dsp: q6afe: Remove payload size check on param_id_pos Signed-off-by: UtsavBalar1231 --- dsp/q6afe.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 6406cd0b38c8..54da7bd33081 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -582,7 +582,6 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) { uint32_t *payload = data->payload; uint32_t param_id; - uint32_t param_id_pos = 0; #ifdef CONFIG_MSM_CSPL if (crus_afe_callback(data->payload, data->payload_size) == 0) @@ -600,18 +599,9 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) data->payload_size)) return 0; - if (data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) - param_id_pos = 4; - else - param_id_pos = 3; - - if (data->payload_size >= param_id_pos * sizeof(uint32_t)) - param_id = payload[param_id_pos - 1]; - else { - pr_err("%s: Error: size %d is less than expected\n", - __func__, data->payload_size); - return -EINVAL; - } + param_id = (data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) ? + payload[3] : + payload[2]; if (param_id == AFE_PARAM_ID_DEV_TIMING_STATS) { av_dev_drift_afe_cb_handler(data->opcode, data->payload, From 4970ca0a144d62ae2ef12614e72a57e4da581bfd Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:51:24 +0530 Subject: [PATCH 101/127] ASoC: dsp: q6afe: don't validate payload size check before memory copy Signed-off-by: UtsavBalar1231 --- dsp/q6afe.c | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 54da7bd33081..7306ab39b80e 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -324,11 +324,6 @@ static void av_dev_drift_afe_cb_handler(uint32_t opcode, uint32_t *payload, switch (opcode) { case AFE_PORT_CMDRSP_GET_PARAM_V2: expected_size += sizeof(struct param_hdr_v1); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } /* Repack response to add IID */ this_afe.av_dev_drift_resp.status = payload[0]; this_afe.av_dev_drift_resp.pdata.module_id = payload[1]; @@ -340,11 +335,6 @@ static void av_dev_drift_afe_cb_handler(uint32_t opcode, uint32_t *payload, break; case AFE_PORT_CMDRSP_GET_PARAM_V3: expected_size += sizeof(struct param_hdr_v3); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } memcpy(&this_afe.av_dev_drift_resp, payload, sizeof(this_afe.av_dev_drift_resp)); break; @@ -375,11 +365,6 @@ static int32_t sp_make_afe_callback(uint32_t opcode, uint32_t *payload, /* Set command specific details */ switch (opcode) { case AFE_PORT_CMDRSP_GET_PARAM_V2: - if (payload_size < (5 * sizeof(uint32_t))) { - pr_err("%s: Error: size %d is less than expected\n", - __func__, payload_size); - return -EINVAL; - } expected_size += sizeof(struct param_hdr_v1); param_hdr.module_id = payload[1]; param_hdr.instance_id = INSTANCE_ID_0; @@ -388,11 +373,6 @@ static int32_t sp_make_afe_callback(uint32_t opcode, uint32_t *payload, data_start = &payload[4]; break; case AFE_PORT_CMDRSP_GET_PARAM_V3: - if (payload_size < (6 * sizeof(uint32_t))) { - pr_err("%s: Error: size %d is less than expected\n", - __func__, payload_size); - return -EINVAL; - } expected_size += sizeof(struct param_hdr_v3); memcpy(¶m_hdr, &payload[1], sizeof(struct param_hdr_v3)); data_start = &payload[5]; @@ -650,11 +630,6 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) payload = data->payload; if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size < (2 * sizeof(uint32_t))) { - pr_err("%s: Error: size %d is less than expected\n", - __func__, data->payload_size); - return -EINVAL; - } pr_debug("%s:opcode = 0x%x cmd = 0x%x status = 0x%x token=%d\n", __func__, data->opcode, payload[0], payload[1], data->token); From a3a7bc0542f42b7f4a7967c2b55fec81535767cc Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 22:09:19 +0530 Subject: [PATCH 102/127] ASoC: msm-pcm-routing-v2: Fix external EC reference for AUDIO_REF_EC_UL10 MUX Signed-off-by: UtsavBalar1231 --- asoc/msm-pcm-routing-v2.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 63a90091bb42..741f541e4228 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -92,6 +92,8 @@ static int msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S16_LE; static int msm_ec_ref_sampling_rate = 48000; static uint32_t voc_session_id = ALL_SESSION_VSID; static int msm_route_ext_ec_ref; +static int wakeup_ext_ec_ref = 0; +static int voip_ext_ec_common_ref = 0; static bool is_custom_stereo_on; static bool is_ds2_on; static bool swap_ch; @@ -3836,9 +3838,16 @@ static const struct snd_kcontrol_new ec_ref_param_controls[] = { static int msm_routing_ec_ref_rx_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s: ec_ref_rx = %d", __func__, msm_route_ec_ref_rx); + struct snd_soc_dapm_widget *widget = + snd_soc_dapm_kcontrol_widget(kcontrol); + + pr_debug("%s: wakeup_ext_ec_ref = %d, voip_ext_ec_common_ref = %d", + __func__, wakeup_ext_ec_ref, voip_ext_ec_common_ref); mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = msm_route_ec_ref_rx; + if (!strncmp(widget->name, "AUDIO_REF_EC_UL10 MUX", strlen("AUDIO_REF_EC_UL10 MUX"))) + ucontrol->value.integer.value[0] = voip_ext_ec_common_ref; + else + ucontrol->value.integer.value[0] = wakeup_ext_ec_ref; mutex_unlock(&routing_lock); return 0; } @@ -3851,6 +3860,7 @@ static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol, snd_soc_dapm_kcontrol_widget(kcontrol); struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; struct snd_soc_dapm_update *update = NULL; + bool state = true; mutex_lock(&routing_lock); @@ -3858,6 +3868,7 @@ static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol, case 0: msm_route_ec_ref_rx = 0; ec_ref_port_id = AFE_PORT_INVALID; + state = false; break; case 1: msm_route_ec_ref_rx = 1; @@ -4004,14 +4015,28 @@ static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol, pr_err("%s EC ref rx %ld not valid\n", __func__, ucontrol->value.integer.value[0]); ec_ref_port_id = AFE_PORT_INVALID; + state = false; break; } - adm_ec_ref_rx_id(ec_ref_port_id); pr_debug("%s: msm_route_ec_ref_rx = %d\n", __func__, msm_route_ec_ref_rx); - mutex_unlock(&routing_lock); - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, + + if (!strncmp(widget->name, "AUDIO_REF_EC_UL10 MUX", strlen("AUDIO_REF_EC_UL10 MUX"))) + voip_ext_ec_common_ref = msm_route_ec_ref_rx; + else + wakeup_ext_ec_ref = msm_route_ec_ref_rx; + pr_debug("%s: state %d, wakeup_ext_ec_ref %d, voip_ext_ec_common_ref %d\n", __func__, + state, wakeup_ext_ec_ref, voip_ext_ec_common_ref); + + if (state || (!state && wakeup_ext_ec_ref == 0 && voip_ext_ec_common_ref == 0)) { + pr_info("%s: update state!\n", __func__); + adm_ec_ref_rx_id(ec_ref_port_id); + mutex_unlock(&routing_lock); + snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, msm_route_ec_ref_rx, e, update); + } else { + mutex_unlock(&routing_lock); + } return 0; } From c57ba2dbafa5c25060ef7ec497da396e23930f65 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:58:04 +0530 Subject: [PATCH 103/127] ASoC: msm-compress-q6-v2: Set decoder output to 24 bit Signed-off-by: UtsavBalar1231 --- asoc/msm-compress-q6-v2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c index 26731e180d20..bd38c7329bba 100644 --- a/asoc/msm-compress-q6-v2.c +++ b/asoc/msm-compress-q6-v2.c @@ -1291,7 +1291,7 @@ static int msm_compr_configure_dsp_for_playback struct snd_compr_runtime *runtime = cstream->runtime; struct msm_compr_audio *prtd = runtime->private_data; struct snd_soc_pcm_runtime *soc_prtd = cstream->private_data; - uint16_t bits_per_sample = 16; + uint16_t bits_per_sample = 24; int dir = IN, ret = 0; struct audio_client *ac = prtd->audio_client; uint32_t stream_index; @@ -2253,7 +2253,7 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) unsigned long flags; int stream_id; uint32_t stream_index; - uint16_t bits_per_sample = 16; + uint16_t bits_per_sample = 24; spin_lock_irqsave(&prtd->lock, flags); if (atomic_read(&prtd->error)) { From 8161ba565a469b869a6872fcbe15b866c027e750 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:58:45 +0530 Subject: [PATCH 104/127] ASoC: msm-dai-fe: Add Support for packed 24 bit Signed-off-by: UtsavBalar1231 --- asoc/msm-dai-fe.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c index 8020929f680a..6709a22c4d93 100644 --- a/asoc/msm-dai-fe.c +++ b/asoc/msm-dai-fe.c @@ -959,7 +959,8 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { .aif_name = "QUAT_MI2S_UL_HL", .rates = SNDRV_PCM_RATE_8000_48000, .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 2, .rate_min = 8000, @@ -975,6 +976,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { .aif_name = "QUAT_MI2S_DL_HL", .rates = SNDRV_PCM_RATE_8000_384000, .formats = SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE, .channels_min = 1, .channels_max = 8, From e2f30e900dc81e2da19ffeac37294bd148f8fe7f Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:37:10 +0530 Subject: [PATCH 105/127] ASoC: sm8150: modify button configuration Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 2890cba8f5ed..212307e8454f 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -643,9 +643,9 @@ static struct wcd_mbhc_config wcd_mbhc_cfg = { .swap_gnd_mic = NULL, .hs_ext_micbias = true, .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, + .key_code[1] = BTN_1, + .key_code[2] = BTN_2, + .key_code[3] = 0, .key_code[4] = 0, .key_code[5] = 0, .key_code[6] = 0, @@ -4522,13 +4522,13 @@ static void *def_wcd_mbhc_cal(void) (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; + btn_high[1] = 260; + btn_high[2] = 750; + btn_high[3] = 750; + btn_high[4] = 750; + btn_high[5] = 750; + btn_high[6] = 750; + btn_high[7] = 750; return wcd_mbhc_cal; } From a9d5acb1b014a4af80d271bdbe51444ec02f9c8e Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:56:11 +0530 Subject: [PATCH 106/127] ASoC: sm8150: Fix mi2s clock frequency Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 212307e8454f..1ccf1374a80f 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -5272,6 +5272,10 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) __func__, ret_pinctrl); } } + + snd_soc_codec_set_sysclk(rtd->codec_dai->codec, 0, 0, + mi2s_clk[index].clk_freq_in_hz, + SND_SOC_CLOCK_IN); clk_off: if (ret < 0) msm_mi2s_set_sclk(substream, false); From e5e50f16be96e9b02ea28169204c8e51da34ff0f Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:31:30 +0530 Subject: [PATCH 107/127] ASoC: sm8150: Disable LPASS_BE_QUAT_MI2S_RX route - Reserved for tfa98xx, cirrus and tas codecs Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 1ccf1374a80f..a8a7a35f0e6a 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -6998,6 +6998,7 @@ static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { .ops = &msm_mi2s_be_ops, .ignore_suspend = 1, }, +/* { .name = LPASS_BE_QUAT_MI2S_RX, .stream_name = "Quaternary MI2S Playback", @@ -7013,6 +7014,7 @@ static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { .ignore_suspend = 1, .ignore_pmdown_time = 1, }, +*/ { .name = LPASS_BE_QUAT_MI2S_TX, .stream_name = "Quaternary MI2S Capture", From 3d8219dc740e3ce543043cabb767061774e1d12a Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:41:26 +0530 Subject: [PATCH 108/127] ASoC: sm8150: Add snd-soc-dummy codec dai link support Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index a8a7a35f0e6a..61cbe1235793 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -6144,6 +6144,36 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA17, }, + { + .name = "Quaternary MI2S_RX Hostless Playback", + .stream_name = "Quaternary MI2S_RX Hostless Playback", + .cpu_dai_name = "QUAT_MI2S_RX_HOSTLESS", + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_playback = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, + { + .name = "Quaternary MI2S_TX Hostless Capture", + .stream_name = "Quaternary MI2S_TX Hostless Capture", + .cpu_dai_name = "QUAT_MI2S_TX_HOSTLESS", + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, { .name = "MultiMedia30 Playback", .stream_name = "MultiMedia30", From 710bc5c78d76b9e7465c74708c87b50aaa47881b Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:22:48 +0530 Subject: [PATCH 109/127] ASoC: sm8150: Add tas2557 codec dai link support Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 61cbe1235793..90716282f14e 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -7091,6 +7091,24 @@ static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { }; +static struct snd_soc_dai_link quat_mi2s_rx_tas2557_dai_links[] = { + { + .name = LPASS_BE_QUAT_MI2S_RX, + .stream_name = "Quaternary MI2S Playback", + .cpu_dai_name = "msm-dai-q6-mi2s.3", + .platform_name = "msm-pcm-routing", + .codec_name = "tas2557.1-004c", + .codec_dai_name = "tas2557 ASI1", + .no_pcm = 1, + .dpcm_playback = 1, + .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, + .be_hw_params_fixup = msm_be_hw_params_fixup, + .ops = &msm_mi2s_be_ops, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + }, +}; + static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { /* Primary AUX PCM Backend DAI Links */ { @@ -7253,6 +7271,7 @@ static struct snd_soc_dai_link msm_tavil_dai_links[ ARRAY_SIZE(msm_wcn_be_dai_links) + ARRAY_SIZE(ext_disp_be_dai_link) + ARRAY_SIZE(msm_mi2s_be_dai_links) + + ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links) + ARRAY_SIZE(msm_auxpcm_be_dai_links)]; static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) @@ -7677,6 +7696,11 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) msm_mi2s_be_dai_links, sizeof(msm_mi2s_be_dai_links)); total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); + + memcpy(msm_tavil_dai_links + total_links, + quat_mi2s_rx_tas2557_dai_links, + sizeof(quat_mi2s_rx_tas2557_dai_links)); + total_links += ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links); } ret = of_property_read_u32(dev->of_node, From 176a7165f0410e18111d5c989bfaa936eff33ee6 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:21:36 +0530 Subject: [PATCH 110/127] ASoC: sm8150: Add cs35l41 codec dai link support Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 90716282f14e..93b3da6a9e46 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -7109,6 +7109,24 @@ static struct snd_soc_dai_link quat_mi2s_rx_tas2557_dai_links[] = { }, }; +static struct snd_soc_dai_link quat_mi2s_rx_cs35l41_dai_links[] = { + { + .name = LPASS_BE_QUAT_MI2S_RX, + .stream_name = "Quaternary MI2S Playback", + .cpu_dai_name = "msm-dai-q6-mi2s.3", + .platform_name = "msm-pcm-routing", + .codec_name = CS35L41_CODEC_NAME, + .codec_dai_name = "cs35l41-pcm", + .no_pcm = 1, + .dpcm_playback = 1, + .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, + .be_hw_params_fixup = msm_be_hw_params_fixup, + .ops = &msm_mi2s_be_ops, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + }, +}; + static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { /* Primary AUX PCM Backend DAI Links */ { @@ -7272,6 +7290,7 @@ static struct snd_soc_dai_link msm_tavil_dai_links[ ARRAY_SIZE(ext_disp_be_dai_link) + ARRAY_SIZE(msm_mi2s_be_dai_links) + ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links) + + ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links) + ARRAY_SIZE(msm_auxpcm_be_dai_links)]; static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) @@ -7701,6 +7720,11 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) quat_mi2s_rx_tas2557_dai_links, sizeof(quat_mi2s_rx_tas2557_dai_links)); total_links += ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links); + + memcpy(msm_tavil_dai_links + total_links, + quat_mi2s_rx_cs35l41_dai_links, + sizeof(quat_mi2s_rx_cs35l41_dai_links)); + total_links += ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links); } ret = of_property_read_u32(dev->of_node, From 4b00b0f551afcdf9c6bed8e5d3f499d6f31900d8 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 20:28:28 +0530 Subject: [PATCH 111/127] ASoC: sm8150: Add tfa9874 codec dai link support Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 93b3da6a9e46..8c9f10ab8705 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -7127,6 +7127,24 @@ static struct snd_soc_dai_link quat_mi2s_rx_cs35l41_dai_links[] = { }, }; +static struct snd_soc_dai_link quat_mi2s_rx_tfa9874_dai_links[] = { + { + .name = LPASS_BE_QUAT_MI2S_RX, + .stream_name = "Quaternary MI2S Playback", + .cpu_dai_name = "msm-dai-q6-mi2s.3", + .platform_name = "msm-pcm-routing", + .codec_name = "tfa98xx.1-0034", + .codec_dai_name = "tfa98xx-aif-1-34", + .no_pcm = 1, + .dpcm_playback = 1, + .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, + .be_hw_params_fixup = msm_be_hw_params_fixup, + .ops = &msm_mi2s_be_ops, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + }, +}; + static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { /* Primary AUX PCM Backend DAI Links */ { @@ -7291,6 +7309,7 @@ static struct snd_soc_dai_link msm_tavil_dai_links[ ARRAY_SIZE(msm_mi2s_be_dai_links) + ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links) + ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links) + + ARRAY_SIZE(quat_mi2s_rx_tfa9874_dai_links) + ARRAY_SIZE(msm_auxpcm_be_dai_links)]; static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) @@ -7725,6 +7744,11 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) quat_mi2s_rx_cs35l41_dai_links, sizeof(quat_mi2s_rx_cs35l41_dai_links)); total_links += ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links); + + memcpy(msm_tavil_dai_links + total_links, + quat_mi2s_rx_tfa9874_dai_links, + sizeof(quat_mi2s_rx_tfa9874_dai_links)); + total_links += ARRAY_SIZE(quat_mi2s_rx_tfa9874_dai_links); } ret = of_property_read_u32(dev->of_node, From eac04ccf1737241a1190b8e58fdcf26d8d3f16eb Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Thu, 27 Aug 2020 10:43:02 +0530 Subject: [PATCH 112/127] ASoC: sm8150: copy dai links based on device soc id Signed-off-by: UtsavBalar1231 --- asoc/sm8150.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 8c9f10ab8705..6dca81573a55 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -39,6 +39,7 @@ #include "codecs/wcd9360/wcd9360.h" #include "codecs/wsa881x.h" #include "codecs/wcd-mbhc-v2.h" +#include #define DRV_NAME "sm8150-asoc-snd" @@ -7735,20 +7736,24 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) sizeof(msm_mi2s_be_dai_links)); total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - memcpy(msm_tavil_dai_links + total_links, - quat_mi2s_rx_tas2557_dai_links, - sizeof(quat_mi2s_rx_tas2557_dai_links)); - total_links += ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links); - - memcpy(msm_tavil_dai_links + total_links, - quat_mi2s_rx_cs35l41_dai_links, - sizeof(quat_mi2s_rx_cs35l41_dai_links)); - total_links += ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links); - - memcpy(msm_tavil_dai_links + total_links, - quat_mi2s_rx_tfa9874_dai_links, - sizeof(quat_mi2s_rx_tfa9874_dai_links)); - total_links += ARRAY_SIZE(quat_mi2s_rx_tfa9874_dai_links); + if (get_hw_version_platform() == HARDWARE_PLATFORM_ANDROMEDA) { + memcpy(msm_tavil_dai_links + total_links, + quat_mi2s_rx_tas2557_dai_links, + sizeof(quat_mi2s_rx_tas2557_dai_links)); + total_links += ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links); + } else if (get_hw_version_platform() == HARDWARE_PLATFORM_CEPHEUS || + get_hw_version_platform() == HARDWARE_PLATFORM_HERCULES) { + memcpy(msm_tavil_dai_links + total_links, + quat_mi2s_rx_cs35l41_dai_links, + sizeof(quat_mi2s_rx_cs35l41_dai_links)); + total_links += ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links); + } else if (get_hw_version_platform() == HARDWARE_PLATFORM_DAVINCI || + get_hw_version_platform() == HARDWARE_PLATFORM_RAPHAEL) { + memcpy(msm_tavil_dai_links + total_links, + quat_mi2s_rx_tfa9874_dai_links, + sizeof(quat_mi2s_rx_tfa9874_dai_links)); + total_links += ARRAY_SIZE(quat_mi2s_rx_tfa9874_dai_links); + } } ret = of_property_read_u32(dev->of_node, From e73edbeecce9467c685684a241ed7f6508f86565 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Thu, 27 Aug 2020 10:46:08 +0530 Subject: [PATCH 113/127] Squashed 'asoc/codecs/tfa98xx/' content from commit 37440d98 git-subtree-dir: asoc/codecs/tfa98xx git-subtree-split: 37440d98e3c3ef0afd1f1a7e6d93f502b4b1f456 --- .gitignore | 99 + inc/config.h | 37 + inc/dbgprint.h | 156 + inc/spk-id.h | 33 + inc/tfa.h | 50 + inc/tfa1_tfafieldnames.h | 911 +++++ inc/tfa2_tfafieldnames_N1C.h | 1533 ++++++++ inc/tfa9872_device_genregs_POR.h | 131 + inc/tfa9872_tfafieldnames.h | 1228 +++++++ inc/tfa9873_tfafieldnames.h | 934 +++++ inc/tfa9873_tfafieldnames_B0.h | 933 +++++ inc/tfa9874_tfafieldnames.h | 843 +++++ inc/tfa9878_tfafieldnames.h | 980 +++++ inc/tfa9887_tfafieldnames.h | 72 + inc/tfa9890_tfafieldnames.h | 87 + inc/tfa9891_genregs.h | 1136 ++++++ inc/tfa9891_tfafieldnames.h | 526 +++ inc/tfa9894_tfafieldnames.h | 1079 ++++++ inc/tfa9894_tfafieldnames_N2.h | 1130 ++++++ inc/tfa9896_tfafieldnames.h | 930 +++++ inc/tfa98xx.h | 190 + inc/tfa98xx_genregs_N1C.h | 3866 ++++++++++++++++++++ inc/tfa98xx_parameters.h | 736 ++++ inc/tfa98xx_tfafieldnames.h | 149 + inc/tfa9912_device_genregs.h | 266 ++ inc/tfa9912_tfafieldnames.h | 1776 +++++++++ inc/tfa_container.h | 359 ++ inc/tfa_device.h | 296 ++ inc/tfa_dsp_fw.h | 162 + inc/tfa_ext.h | 51 + inc/tfa_internal.h | 40 + inc/tfa_platform_interface_definition.h | 100 + inc/tfa_service.h | 1015 ++++++ src/tfa98xx.c | 4368 +++++++++++++++++++++++ src/tfa_container.c | 2374 ++++++++++++ src/tfa_dsp.c | 4265 ++++++++++++++++++++++ src/tfa_init.c | 1934 ++++++++++ src/tfa_internal.h | 33 + 38 files changed, 34808 insertions(+) create mode 100644 .gitignore create mode 100644 inc/config.h create mode 100644 inc/dbgprint.h create mode 100755 inc/spk-id.h create mode 100644 inc/tfa.h create mode 100644 inc/tfa1_tfafieldnames.h create mode 100644 inc/tfa2_tfafieldnames_N1C.h create mode 100644 inc/tfa9872_device_genregs_POR.h create mode 100644 inc/tfa9872_tfafieldnames.h create mode 100644 inc/tfa9873_tfafieldnames.h create mode 100644 inc/tfa9873_tfafieldnames_B0.h create mode 100644 inc/tfa9874_tfafieldnames.h create mode 100644 inc/tfa9878_tfafieldnames.h create mode 100644 inc/tfa9887_tfafieldnames.h create mode 100644 inc/tfa9890_tfafieldnames.h create mode 100644 inc/tfa9891_genregs.h create mode 100644 inc/tfa9891_tfafieldnames.h create mode 100644 inc/tfa9894_tfafieldnames.h create mode 100644 inc/tfa9894_tfafieldnames_N2.h create mode 100644 inc/tfa9896_tfafieldnames.h create mode 100644 inc/tfa98xx.h create mode 100644 inc/tfa98xx_genregs_N1C.h create mode 100644 inc/tfa98xx_parameters.h create mode 100644 inc/tfa98xx_tfafieldnames.h create mode 100644 inc/tfa9912_device_genregs.h create mode 100644 inc/tfa9912_tfafieldnames.h create mode 100644 inc/tfa_container.h create mode 100644 inc/tfa_device.h create mode 100644 inc/tfa_dsp_fw.h create mode 100644 inc/tfa_ext.h create mode 100755 inc/tfa_internal.h create mode 100755 inc/tfa_platform_interface_definition.h create mode 100644 inc/tfa_service.h create mode 100644 src/tfa98xx.c create mode 100644 src/tfa_container.c create mode 100644 src/tfa_dsp.c create mode 100644 src/tfa_init.c create mode 100644 src/tfa_internal.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..be731895371b --- /dev/null +++ b/.gitignore @@ -0,0 +1,99 @@ +# +# NOTE! Don't add files that are generated in specific +# subdirectories here. Add them in the ".gitignore" file +# in that subdirectory instead. +# +# NOTE! Please use 'git ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# Normal rules +# +.* +*.o +*.o.* +*.a +*.s +*.ko +*.so +*.so.dbg +*.mod.c +*.i +*.lst +*.symtypes +*.order +modules.builtin +*.elf +*.bin +*.gz +*.bz2 +*.lzma +*.xz +*.lz4 +*.lzo +*.patch +*.gcno +*.dll + +# +# Top-level generic files +# +/tags +/TAGS +/linux +/vmlinux +/vmlinuz +/System.map +/Module.markers +Module.symvers + +# +# Debian directory (make deb-pkg) +# +/debian/ + +# +# git files that we don't want to ignore even it they are dot-files +# +!.gitignore +!.mailmap + +# +# Generated include files +# +include/config +include/generated +arch/*/include/generated + +# stgit generated dirs +patches-* + +# quilt's files +patches +series + +# cscope files +cscope.* +ncscope.* + +# gnu global files +GPATH +GRTAGS +GSYMS +GTAGS + +*.orig +*~ +\#*# + +# +# Leavings from module signing +# +extra_certificates +signing_key.priv +signing_key.x509 +x509.genkey + +# Kconfig presets +all.config + diff --git a/inc/config.h b/inc/config.h new file mode 100644 index 000000000000..018886f814ca --- /dev/null +++ b/inc/config.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + + +/* + Linux kernel specific definitions used by code shared with + Linux/Windows user space. +*/ + +#ifndef __CONFIG_LINUX_KERNEL_INC__ +#define __CONFIG_LINUX_KERNEL_INC__ + +#include +#include +#include +#include +#include + +#define _ASSERT(e) +#define PRINT_ASSERT(e)if ((e)) printk(KERN_ERR "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) + +#if defined(CONFIG_TRACING) && defined(DEBUG) + #define tfa98xx_trace_printk(...) trace_printk(__VA_ARGS__) +#else + #define tfa98xx_trace_printk(...) +#endif + +#endif /* __CONFIG_LINUX_KERNEL_INC__ */ + diff --git a/inc/dbgprint.h b/inc/dbgprint.h new file mode 100644 index 000000000000..b9b4558a7141 --- /dev/null +++ b/inc/dbgprint.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +#ifndef _DBGPRINT_H +# define _DBGPRINT_H + +/* Debugging macro's. */ +# ifndef ASSERT +//#define ASSERT +# endif + //TODO wwwim +# ifndef _ASSERT + #define _ASSERT(e) +# endif + +# ifndef PREFIX +# define PREFIX "tfa98xx: " +# define DRIVER_NAME "tfa98xx" +# endif + +#ifdef __KERNEL__ + +# ifdef DEBUG +# define _DEBUG(level, fmt, va...) do {\ + if (unlikely(debug >= (level))) \ + printk(KERN_INFO PREFIX "%s:%d: "fmt, __func__, __LINE__, ##va); \ + } while (0) + +# else +# define _DEBUG(level, fmt, va...) do {} while (0) +# endif + +# define MSG(fmt, va...) printk(KERN_INFO PREFIX "%s:%d: "fmt, __func__, __LINE__, ##va) +# define _ERRORMSG(fmt, va...) printk(KERN_ERR PREFIX "ERROR %s:%d: "fmt, __func__, __LINE__, ##va) + + +# define DEBUG0(x...) MSG(x) +# define DEBUG1(x...) _DEBUG(1, x) +# define DEBUG2(x...) _DEBUG(2, x) +# define DEBUG3(x...) _DEBUG(3, x) +# define ERRORMSG(x...) _ERRORMSG(x) +# define PRINT(x...) printk(x) +# define PRINT_ERROR(x...) printk(KERN_INFO PREFIX " **ERROR** " x) +# define PRINT_ASSERT(e)if ((e)) printk(KERN_ERR "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) + +# define PRINT_ENTRY DEBUG2("+[%s]\n", __func__) +# define PRINT_EXIT DEBUG2("-[%s]\n", __func__) + +# ifdef ASSERT +# define assert(cond, action) do { if (unlikely(!(cond))) { DEBUG0("Assert: %s\n", #cond); action; } } while (0) +# else +# define assert(cond, action) do { } while (0) +# endif + +#else /* __KERNEL__ */ +#if defined(WIN32) || defined(_X64) +#include +/* user mode */ +# ifdef DEBUG +# define _DEBUGMSG(level, fmt, ...) printf(PREFIX "%s:%d: "fmt, __func__, __LINE__, __VA_ARGS__); +# else +# define _DEBUGMSG(level, fmt, ...) do {} while (0) +# endif + +# define _ERRORMSG(fmt, ...) printf(PREFIX "%s:%s:%d: "fmt, __FILE__, __func__, __LINE__, __VA_ARGS__) + +# define DEBUG0(...) MSG(__VA_ARGS__) +# define DEBUG1(...) _DEBUGMSG(1, __VA_ARGS__) +# define DEBUG2(...) _DEBUGMSG(2, __VA_ARGS__) +# define DEBUG3(...) _DEBUGMSG(3, __VA_ARGS__) +# define ERRORMSG(fmt, ...) _ERRORMSG(fmt, __VA_ARGS__) +# define PRINT(...) printf(__VA_ARGS__) +/* +# define PRINT(...) { FILE *stream; \ + if((stream = freopen("tfa_tfa.txt", "ab+", stdout)) == NULL) exit(-1); \ + printf(__VA_ARGS__); \ + freopen( "CON", "ab+", stdout ); \ + } +*/ +# define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__) +# define PRINT_FILE(file, ...) fprintf(file, __VA_ARGS__) +# define PRINT_ASSERT(e)if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) +//# define PRINT_ASSERT(e) if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) %s\n",__FUNCTION__,__FILE__,__LINE__, Tfa98xx_GetErrorString(e)) + +#elif defined(__CODE_RED) +#include "app_global.h" +# ifdef DEBUG +# define _DEBUG(level, fmt, va...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, va)) +//printf(PREFIX "%s:%d: "fmt,__func__,__LINE__,##va); +# else +# define _DEBUG(level, fmt, va...) do {} while (0) +# endif + +# define MSG(fmt, ...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, __VA_ARGS__)) +//printf(PREFIX "%s:%s:%d: "fmt,__FILE__,__func__,__LINE__,##va) +//TB_TRACE_INF(TbTracePfx2(APP_PFX,TB_FUNC,"path=%s, chan=%u, muted=%s, vol=%d\n", +// path->isRecording ? "recording" : "playback", +// i, +// channelVol.currentMuteValue ? "YES" : "NO", +// channelVol.currentVolumeValue +// )); +//# define _ERRORMSG(fmt,va...) TB_TRACE_INF(TbTracePfx2("tfa",TB_FUNC,va)) +# define ERRORMSG(...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, __VA_ARGS__)) +//fprintf(stderr, PREFIX "ERROR %s:%s:%d: "fmt,__FILE__,__func__,__LINE__, ##va) + +# define DEBUG0(x...) MSG(x) +# define DEBUG1(x...) _DEBUG(1, x) +# define DEBUG2(x...) _DEBUG(2, x) +# define DEBUG3(x...) _DEBUG(3, x) +//# define ERRORMSG(x...) _ERRORMSG(x) +# define PRINT(x...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, x)) +//printf(x) +# define PRINT_ERROR(x...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, x)) +//fprintf(stderr,__VA_ARGS__) +# define PRINT_FILE(file, x...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, x)) +//fprintf(file,__VA_ARGS__) +# define PRINT_ASSERT(e) +//TB_TRACE_INF(TbTracePfx2("tfa",TB_FUNC,Tfa98xx_GetErrorString(e))) +//if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) %s\n",__FUNCTION__,__FILE__,__LINE__, Tfa98xx_GetErrorString(e)) +#else +#include +/* user mode */ +# ifdef DEBUG +# define _DEBUG(level, fmt, va...) printf(PREFIX "%s:%d: "fmt, __func__, __LINE__, ##va); +# else +# define _DEBUG(level, fmt, va...) do {} while (0) +# endif + +# define MSG(fmt, va...) printf(PREFIX "%s:%s:%d: "fmt, __FILE__, __func__, __LINE__, ##va) +# define _ERRORMSG(fmt, va...) fprintf(stderr, PREFIX "ERROR %s:%s:%d: "fmt, __FILE__, __func__, __LINE__, ##va) + +# define DEBUG0(x...) MSG(x) +# define DEBUG1(x...) _DEBUG(1, x) +# define DEBUG2(x...) _DEBUG(2, x) +# define DEBUG3(x...) _DEBUG(3, x) +# define ERRORMSG(x...) _ERRORMSG(x) +# define PRINT(x...) printf(x) +# define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__) +# define PRINT_FILE(file, ...) fprintf(file, __VA_ARGS__) +# define PRINT_ASSERT(e)if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) +//# define PRINT_ASSERT(e) if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) %s\n",__FUNCTION__,__FILE__,__LINE__, Tfa98xx_GetErrorString(e)) + + +#endif /* WIN32 */ + +#endif /* user */ + +#endif /* _DBGPRINT_H --------------- */ diff --git a/inc/spk-id.h b/inc/spk-id.h new file mode 100755 index 000000000000..2416f89bd23f --- /dev/null +++ b/inc/spk-id.h @@ -0,0 +1,33 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2019 XiaoMi, Inc. + * + * 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __SPK_ID_H_ +#define __SPK_ID_H_ + +#include +#include + +#define PIN_PULL_DOWN 0 +#define PIN_PULL_UP 1 +#define PIN_FLOAT 2 + +#define VENDOR_ID_NONE 0 +#define VENDOR_ID_AAC 1 +#define VENDOR_ID_SSI 2 +#define VENDOR_ID_GOER 3 + +#define VENDOR_ID_UNKNOWN 4 + +extern int spk_id_get_pin_3state(struct device_node *np); + +#endif diff --git a/inc/tfa.h b/inc/tfa.h new file mode 100644 index 000000000000..10e8cb94c86d --- /dev/null +++ b/inc/tfa.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +#ifndef TFA_H_ +#define TFA_H_ + +/* set the limit for the container file length */ +#define TFA_MAX_CNT_LENGTH (256*1024) + +extern struct tfa_device **devs; + +/** + * tfa error return codes + */ +enum tfa_error { + tfa_error_ok, /**< no error */ + tfa_error_device, /**< no response from device */ + tfa_error_bad_param,/**< parameter no accepted */ + tfa_error_noclock, /**< required clock not present */ + tfa_error_timeout, /**< a timeout occurred */ + tfa_error_dsp, /**< a DSP error was returned */ + tfa_error_container,/**< no or wrong container file */ + tfa_error_max /**< impossible value, max enum */ +}; + +enum Tfa98xx_Error tfa_write_filters(struct tfa_device *tfa, int prof_idx); + +struct tfa_device **tfa_devs_create(int count); +void tfa_devs_destroy(int count); + +struct tfa_device **tfa_get_device_struct(void); + +/*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ +#ifdef __KERNEL__ +int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep, u8 pcm_format); +#else +int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep); +#endif +void tfa_lp_mode_interrupt(struct tfa_device *tfa); +void tfa_adapt_noisemode(struct tfa_device *tfa); + +#endif /* TFA_H_ */ diff --git a/inc/tfa1_tfafieldnames.h b/inc/tfa1_tfafieldnames.h new file mode 100644 index 000000000000..c0b6d64abe82 --- /dev/null +++ b/inc/tfa1_tfafieldnames.h @@ -0,0 +1,911 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: Tfa1_TfaFieldnames.h + * This file was generated automatically on 03/20/2015 at 01:55:46 PM. + * Source file: TFA9897N1B_I2C_list_URT_Source_v34.xls + */ +#define TFA9897_I2CVERSION 34 +typedef enum Tfa1BfEnumList { + TFA1_BF_VDDS = 0x0000, /*!< Power-on-reset flag */ + TFA1_BF_PLLS = 0x0010, /*!< PLL lock */ + TFA1_BF_OTDS = 0x0020, /*!< Over Temperature Protection alarm */ + TFA1_BF_OVDS = 0x0030, /*!< Over Voltage Protection alarm */ + TFA1_BF_UVDS = 0x0040, /*!< Under Voltage Protection alarm */ + TFA1_BF_OCDS = 0x0050, /*!< Over Current Protection alarm */ + TFA1_BF_CLKS = 0x0060, /*!< Clocks stable flag */ + TFA1_BF_CLIPS = 0x0070, /*!< Amplifier clipping */ + TFA1_BF_MTPB = 0x0080, /*!< MTP busy */ + TFA1_BF_NOCLK = 0x0090, /*!< Flag lost clock from clock generation unit */ + TFA1_BF_SPKS = 0x00a0, /*!< Speaker error flag */ + TFA1_BF_ACS = 0x00b0, /*!< Cold Start flag */ + TFA1_BF_SWS = 0x00c0, /*!< Flag Engage */ + TFA1_BF_WDS = 0x00d0, /*!< Flag watchdog reset */ + TFA1_BF_AMPS = 0x00e0, /*!< Amplifier is enabled by manager */ + TFA1_BF_AREFS = 0x00f0, /*!< References are enabled by manager */ + TFA1_BF_BATS = 0x0109, /*!< Battery voltage readout; 0 .. 5.5 [V] */ + TFA1_BF_TEMPS = 0x0208, /*!< Temperature readout from the temperature sensor */ + TFA1_BF_REV = 0x030b, /*!< Device type number is B97 */ + TFA1_BF_RCV = 0x0420, /*!< Enable Receiver Mode */ + TFA1_BF_CHS12 = 0x0431, /*!< Channel Selection TDM input for Coolflux */ + TFA1_BF_INPLVL = 0x0450, /*!< Input level selection control */ + TFA1_BF_CHSA = 0x0461, /*!< Input selection for amplifier */ + TFA1_BF_I2SDOE = 0x04b0, /*!< Enable data output */ + TFA1_BF_AUDFS = 0x04c3, /*!< Audio sample rate setting */ + TFA1_BF_BSSCR = 0x0501, /*!< Protection Attack Time */ + TFA1_BF_BSST = 0x0523, /*!< ProtectionThreshold */ + TFA1_BF_BSSRL = 0x0561, /*!< Protection Maximum Reduction */ + TFA1_BF_BSSRR = 0x0582, /*!< Battery Protection Release Time */ + TFA1_BF_BSSHY = 0x05b1, /*!< Battery Protection Hysteresis */ + TFA1_BF_BSSR = 0x05e0, /*!< battery voltage for I2C read out only */ + TFA1_BF_BSSBY = 0x05f0, /*!< bypass clipper battery protection */ + TFA1_BF_DPSA = 0x0600, /*!< Enable dynamic powerstage activation */ + TFA1_BF_CFSM = 0x0650, /*!< Soft mute in CoolFlux */ + TFA1_BF_BSSS = 0x0670, /*!< BatSenseSteepness */ + TFA1_BF_VOL = 0x0687, /*!< volume control (in CoolFlux) */ + TFA1_BF_DCVO = 0x0702, /*!< Boost Voltage */ + TFA1_BF_DCMCC = 0x0733, /*!< Max boost coil current - step of 175 mA */ + TFA1_BF_DCIE = 0x07a0, /*!< Adaptive boost mode */ + TFA1_BF_DCSR = 0x07b0, /*!< Soft RampUp/Down mode for DCDC controller */ + TFA1_BF_DCPAVG = 0x07c0, /*!< ctrl_peak2avg for analog part of DCDC */ + TFA1_BF_TROS = 0x0800, /*!< Select external temperature also the ext_temp will be put on the temp read out */ + TFA1_BF_EXTTS = 0x0818, /*!< external temperature setting to be given by host */ + TFA1_BF_PWDN = 0x0900, /*!< Device Mode */ + TFA1_BF_I2CR = 0x0910, /*!< I2C Reset */ + TFA1_BF_CFE = 0x0920, /*!< Enable CoolFlux */ + TFA1_BF_AMPE = 0x0930, /*!< Enable Amplifier */ + TFA1_BF_DCA = 0x0940, /*!< EnableBoost */ + TFA1_BF_SBSL = 0x0950, /*!< Coolflux configured */ + TFA1_BF_AMPC = 0x0960, /*!< Selection on how Amplifier is enabled */ + TFA1_BF_DCDIS = 0x0970, /*!< DCDC not connected */ + TFA1_BF_PSDR = 0x0980, /*!< IDDQ test amplifier */ + TFA1_BF_DCCV = 0x0991, /*!< Coil Value */ + TFA1_BF_CCFD = 0x09b0, /*!< Selection CoolFlux Clock */ + TFA1_BF_INTPAD = 0x09c1, /*!< INT pad configuration control */ + TFA1_BF_IPLL = 0x09e0, /*!< PLL input reference clock selection */ + TFA1_BF_MTPK = 0x0b07, /*!< 5Ah, 90d To access KEY1_Protected registers (Default for engineering) */ + TFA1_BF_CVFDLY = 0x0c25, /*!< Fractional delay adjustment between current and voltage sense */ + TFA1_BF_TDMPRF = 0x1011, /*!< TDM_usecase */ + TFA1_BF_TDMEN = 0x1030, /*!< TDM interface control */ + TFA1_BF_TDMCKINV = 0x1040, /*!< TDM clock inversion */ + TFA1_BF_TDMFSLN = 0x1053, /*!< TDM FS length */ + TFA1_BF_TDMFSPOL = 0x1090, /*!< TDM FS polarity */ + TFA1_BF_TDMSAMSZ = 0x10a4, /*!< TDM Sample Size for all tdm sinks/sources */ + TFA1_BF_TDMSLOTS = 0x1103, /*!< Number of slots */ + TFA1_BF_TDMSLLN = 0x1144, /*!< Slot length */ + TFA1_BF_TDMBRMG = 0x1194, /*!< Bits remaining */ + TFA1_BF_TDMDDEL = 0x11e0, /*!< Data delay */ + TFA1_BF_TDMDADJ = 0x11f0, /*!< Data adjustment */ + TFA1_BF_TDMTXFRM = 0x1201, /*!< TXDATA format */ + TFA1_BF_TDMUUS0 = 0x1221, /*!< TXDATA format unused slot sd0 */ + TFA1_BF_TDMUUS1 = 0x1241, /*!< TXDATA format unused slot sd1 */ + TFA1_BF_TDMSI0EN = 0x1270, /*!< TDM sink0 enable */ + TFA1_BF_TDMSI1EN = 0x1280, /*!< TDM sink1 enable */ + TFA1_BF_TDMSI2EN = 0x1290, /*!< TDM sink2 enable */ + TFA1_BF_TDMSO0EN = 0x12a0, /*!< TDM source0 enable */ + TFA1_BF_TDMSO1EN = 0x12b0, /*!< TDM source1 enable */ + TFA1_BF_TDMSO2EN = 0x12c0, /*!< TDM source2 enable */ + TFA1_BF_TDMSI0IO = 0x12d0, /*!< tdm_sink0_io */ + TFA1_BF_TDMSI1IO = 0x12e0, /*!< tdm_sink1_io */ + TFA1_BF_TDMSI2IO = 0x12f0, /*!< tdm_sink2_io */ + TFA1_BF_TDMSO0IO = 0x1300, /*!< tdm_source0_io */ + TFA1_BF_TDMSO1IO = 0x1310, /*!< tdm_source1_io */ + TFA1_BF_TDMSO2IO = 0x1320, /*!< tdm_source2_io */ + TFA1_BF_TDMSI0SL = 0x1333, /*!< sink0_slot [GAIN IN] */ + TFA1_BF_TDMSI1SL = 0x1373, /*!< sink1_slot [CH1 IN] */ + TFA1_BF_TDMSI2SL = 0x13b3, /*!< sink2_slot [CH2 IN] */ + TFA1_BF_TDMSO0SL = 0x1403, /*!< source0_slot [GAIN OUT] */ + TFA1_BF_TDMSO1SL = 0x1443, /*!< source1_slot [Voltage Sense] */ + TFA1_BF_TDMSO2SL = 0x1483, /*!< source2_slot [Current Sense] */ + TFA1_BF_NBCK = 0x14c3, /*!< NBCK */ + TFA1_BF_INTOVDDS = 0x2000, /*!< flag_por_int_out */ + TFA1_BF_INTOPLLS = 0x2010, /*!< flag_pll_lock_int_out */ + TFA1_BF_INTOOTDS = 0x2020, /*!< flag_otpok_int_out */ + TFA1_BF_INTOOVDS = 0x2030, /*!< flag_ovpok_int_out */ + TFA1_BF_INTOUVDS = 0x2040, /*!< flag_uvpok_int_out */ + TFA1_BF_INTOOCDS = 0x2050, /*!< flag_ocp_alarm_int_out */ + TFA1_BF_INTOCLKS = 0x2060, /*!< flag_clocks_stable_int_out */ + TFA1_BF_INTOCLIPS = 0x2070, /*!< flag_clip_int_out */ + TFA1_BF_INTOMTPB = 0x2080, /*!< mtp_busy_int_out */ + TFA1_BF_INTONOCLK = 0x2090, /*!< flag_lost_clk_int_out */ + TFA1_BF_INTOSPKS = 0x20a0, /*!< flag_cf_speakererror_int_out */ + TFA1_BF_INTOACS = 0x20b0, /*!< flag_cold_started_int_out */ + TFA1_BF_INTOSWS = 0x20c0, /*!< flag_engage_int_out */ + TFA1_BF_INTOWDS = 0x20d0, /*!< flag_watchdog_reset_int_out */ + TFA1_BF_INTOAMPS = 0x20e0, /*!< flag_enbl_amp_int_out */ + TFA1_BF_INTOAREFS = 0x20f0, /*!< flag_enbl_ref_int_out */ + TFA1_BF_INTOACK = 0x2201, /*!< Interrupt status register output - Corresponding flag */ + TFA1_BF_INTIVDDS = 0x2300, /*!< flag_por_int_in */ + TFA1_BF_INTIPLLS = 0x2310, /*!< flag_pll_lock_int_in */ + TFA1_BF_INTIOTDS = 0x2320, /*!< flag_otpok_int_in */ + TFA1_BF_INTIOVDS = 0x2330, /*!< flag_ovpok_int_in */ + TFA1_BF_INTIUVDS = 0x2340, /*!< flag_uvpok_int_in */ + TFA1_BF_INTIOCDS = 0x2350, /*!< flag_ocp_alarm_int_in */ + TFA1_BF_INTICLKS = 0x2360, /*!< flag_clocks_stable_int_in */ + TFA1_BF_INTICLIPS = 0x2370, /*!< flag_clip_int_in */ + TFA1_BF_INTIMTPB = 0x2380, /*!< mtp_busy_int_in */ + TFA1_BF_INTINOCLK = 0x2390, /*!< flag_lost_clk_int_in */ + TFA1_BF_INTISPKS = 0x23a0, /*!< flag_cf_speakererror_int_in */ + TFA1_BF_INTIACS = 0x23b0, /*!< flag_cold_started_int_in */ + TFA1_BF_INTISWS = 0x23c0, /*!< flag_engage_int_in */ + TFA1_BF_INTIWDS = 0x23d0, /*!< flag_watchdog_reset_int_in */ + TFA1_BF_INTIAMPS = 0x23e0, /*!< flag_enbl_amp_int_in */ + TFA1_BF_INTIAREFS = 0x23f0, /*!< flag_enbl_ref_int_in */ + TFA1_BF_INTIACK = 0x2501, /*!< Interrupt register input */ + TFA1_BF_INTENVDDS = 0x2600, /*!< flag_por_int_enable */ + TFA1_BF_INTENPLLS = 0x2610, /*!< flag_pll_lock_int_enable */ + TFA1_BF_INTENOTDS = 0x2620, /*!< flag_otpok_int_enable */ + TFA1_BF_INTENOVDS = 0x2630, /*!< flag_ovpok_int_enable */ + TFA1_BF_INTENUVDS = 0x2640, /*!< flag_uvpok_int_enable */ + TFA1_BF_INTENOCDS = 0x2650, /*!< flag_ocp_alarm_int_enable */ + TFA1_BF_INTENCLKS = 0x2660, /*!< flag_clocks_stable_int_enable */ + TFA1_BF_INTENCLIPS = 0x2670, /*!< flag_clip_int_enable */ + TFA1_BF_INTENMTPB = 0x2680, /*!< mtp_busy_int_enable */ + TFA1_BF_INTENNOCLK = 0x2690, /*!< flag_lost_clk_int_enable */ + TFA1_BF_INTENSPKS = 0x26a0, /*!< flag_cf_speakererror_int_enable */ + TFA1_BF_INTENACS = 0x26b0, /*!< flag_cold_started_int_enable */ + TFA1_BF_INTENSWS = 0x26c0, /*!< flag_engage_int_enable */ + TFA1_BF_INTENWDS = 0x26d0, /*!< flag_watchdog_reset_int_enable */ + TFA1_BF_INTENAMPS = 0x26e0, /*!< flag_enbl_amp_int_enable */ + TFA1_BF_INTENAREFS = 0x26f0, /*!< flag_enbl_ref_int_enable */ + TFA1_BF_INTENACK = 0x2801, /*!< Interrupt enable register */ + TFA1_BF_INTPOLVDDS = 0x2900, /*!< flag_por_int_pol */ + TFA1_BF_INTPOLPLLS = 0x2910, /*!< flag_pll_lock_int_pol */ + TFA1_BF_INTPOLOTDS = 0x2920, /*!< flag_otpok_int_pol */ + TFA1_BF_INTPOLOVDS = 0x2930, /*!< flag_ovpok_int_pol */ + TFA1_BF_INTPOLUVDS = 0x2940, /*!< flag_uvpok_int_pol */ + TFA1_BF_INTPOLOCDS = 0x2950, /*!< flag_ocp_alarm_int_pol */ + TFA1_BF_INTPOLCLKS = 0x2960, /*!< flag_clocks_stable_int_pol */ + TFA1_BF_INTPOLCLIPS = 0x2970, /*!< flag_clip_int_pol */ + TFA1_BF_INTPOLMTPB = 0x2980, /*!< mtp_busy_int_pol */ + TFA1_BF_INTPOLNOCLK = 0x2990, /*!< flag_lost_clk_int_pol */ + TFA1_BF_INTPOLSPKS = 0x29a0, /*!< flag_cf_speakererror_int_pol */ + TFA1_BF_INTPOLACS = 0x29b0, /*!< flag_cold_started_int_pol */ + TFA1_BF_INTPOLSWS = 0x29c0, /*!< flag_engage_int_pol */ + TFA1_BF_INTPOLWDS = 0x29d0, /*!< flag_watchdog_reset_int_pol */ + TFA1_BF_INTPOLAMPS = 0x29e0, /*!< flag_enbl_amp_int_pol */ + TFA1_BF_INTPOLAREFS = 0x29f0, /*!< flag_enbl_ref_int_pol */ + TFA1_BF_INTPOLACK = 0x2b01, /*!< Interrupt status flags polarity register */ + TFA1_BF_CLIP = 0x4900, /*!< Bypass clip control */ + TFA1_BF_CIMTP = 0x62b0, /*!< start copying all the data from i2cregs_mtp to mtp [Key 2 protected] */ + TFA1_BF_RST = 0x7000, /*!< Reset CoolFlux DSP */ + TFA1_BF_DMEM = 0x7011, /*!< Target memory for access */ + TFA1_BF_AIF = 0x7030, /*!< Autoincrement-flag for memory-address */ + TFA1_BF_CFINT = 0x7040, /*!< Interrupt CoolFlux DSP */ + TFA1_BF_REQ = 0x7087, /*!< request for access (8 channels) */ + TFA1_BF_REQCMD = 0x7080, /*!< Firmware event request rpc command */ + TFA1_BF_REQRST = 0x7090, /*!< Firmware event request reset restart */ + TFA1_BF_REQMIPS = 0x70a0, /*!< Firmware event request short on mips */ + TFA1_BF_REQMUTED = 0x70b0, /*!< Firmware event request mute sequence ready */ + TFA1_BF_REQVOL = 0x70c0, /*!< Firmware event request volume ready */ + TFA1_BF_REQDMG = 0x70d0, /*!< Firmware event request speaker damage detected */ + TFA1_BF_REQCAL = 0x70e0, /*!< Firmware event request calibration completed */ + TFA1_BF_REQRSV = 0x70f0, /*!< Firmware event request reserved */ + TFA1_BF_MADD = 0x710f, /*!< memory-address to be accessed */ + TFA1_BF_MEMA = 0x720f, /*!< activate memory access (24- or 32-bits data is written/read to/from memory */ + TFA1_BF_ERR = 0x7307, /*!< Coolflux error flags */ + TFA1_BF_ACK = 0x7387, /*!< acknowledge of requests (8 channels) */ + TFA1_BF_MTPOTC = 0x8000, /*!< Calibration schedule (key2 protected) */ + TFA1_BF_MTPEX = 0x8010, /*!< (key2 protected) */ +} Tfa1BfEnumList_t; +#define TFA1_NAMETABLE static tfaBfName_t Tfa1DatasheetNames[] = {\ + { 0x0, "VDDS"}, /* Power-on-reset flag , */\ + { 0x10, "PLLS"}, /* PLL lock , */\ + { 0x20, "OTDS"}, /* Over Temperature Protection alarm , */\ + { 0x30, "OVDS"}, /* Over Voltage Protection alarm , */\ + { 0x40, "UVDS"}, /* Under Voltage Protection alarm , */\ + { 0x50, "OCDS"}, /* Over Current Protection alarm , */\ + { 0x60, "CLKS"}, /* Clocks stable flag , */\ + { 0x70, "CLIPS"}, /* Amplifier clipping , */\ + { 0x80, "MTPB"}, /* MTP busy , */\ + { 0x90, "NOCLK"}, /* Flag lost clock from clock generation unit , */\ + { 0xa0, "SPKS"}, /* Speaker error flag , */\ + { 0xb0, "ACS"}, /* Cold Start flag , */\ + { 0xc0, "SWS"}, /* Flag Engage , */\ + { 0xd0, "WDS"}, /* Flag watchdog reset , */\ + { 0xe0, "AMPS"}, /* Amplifier is enabled by manager , */\ + { 0xf0, "AREFS"}, /* References are enabled by manager , */\ + { 0x109, "BATS"}, /* Battery voltage readout; 0 .. 5.5 [V] , */\ + { 0x208, "TEMPS"}, /* Temperature readout from the temperature sensor , */\ + { 0x30b, "REV"}, /* Device type number is B97 , */\ + { 0x420, "RCV"}, /* Enable Receiver Mode , */\ + { 0x431, "CHS12"}, /* Channel Selection TDM input for Coolflux , */\ + { 0x450, "INPLVL"}, /* Input level selection control , */\ + { 0x461, "CHSA"}, /* Input selection for amplifier , */\ + { 0x4b0, "I2SDOE"}, /* Enable data output , */\ + { 0x4c3, "AUDFS"}, /* Audio sample rate setting , */\ + { 0x501, "SSCR"}, /* Protection Attack Time , */\ + { 0x523, "SST"}, /* ProtectionThreshold , */\ + { 0x561, "SSRL"}, /* Protection Maximum Reduction , */\ + { 0x582, "SSRR"}, /* Battery Protection Release Time , */\ + { 0x5b1, "SSHY"}, /* Battery Protection Hysteresis , */\ + { 0x5e0, "SSR"}, /* battery voltage for I2C read out only , */\ + { 0x5f0, "SSBY"}, /* bypass clipper battery protection , */\ + { 0x600, "DPSA"}, /* Enable dynamic powerstage activation , */\ + { 0x650, "CFSM"}, /* Soft mute in CoolFlux , */\ + { 0x670, "SSS"}, /* BatSenseSteepness , */\ + { 0x687, "VOL"}, /* volume control (in CoolFlux) , */\ + { 0x702, "DCVO"}, /* Boost Voltage , */\ + { 0x733, "DCMCC"}, /* Max boost coil current - step of 175 mA , */\ + { 0x7a0, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7b0, "DCSR"}, /* Soft RampUp/Down mode for DCDC controller , */\ + { 0x7c0, "DCPAVG"}, /* ctrl_peak2avg for analog part of DCDC , */\ + { 0x800, "TROS"}, /* Select external temperature also the ext_temp will be put on the temp read out , */\ + { 0x818, "EXTTS"}, /* external temperature setting to be given by host , */\ + { 0x900, "PWDN"}, /* Device Mode , */\ + { 0x910, "I2CR"}, /* I2C Reset , */\ + { 0x920, "CFE"}, /* Enable CoolFlux , */\ + { 0x930, "AMPE"}, /* Enable Amplifier , */\ + { 0x940, "DCA"}, /* EnableBoost , */\ + { 0x950, "SBSL"}, /* Coolflux configured , */\ + { 0x960, "AMPC"}, /* Selection on how Amplifier is enabled , */\ + { 0x970, "DCDIS"}, /* DCDC not connected , */\ + { 0x980, "PSDR"}, /* IDDQ test amplifier , */\ + { 0x991, "DCCV"}, /* Coil Value , */\ + { 0x9b0, "CCFD"}, /* Selection CoolFlux Clock , */\ + { 0x9c1, "INTPAD"}, /* INT pad configuration control , */\ + { 0x9e0, "IPLL"}, /* PLL input reference clock selection , */\ + { 0xb07, "MTPK"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0xc25, "CVFDLY"}, /* Fractional delay adjustment between current and voltage sense, */\ + { 0x1011, "TDMPRF"}, /* TDM_usecase , */\ + { 0x1030, "TDMEN"}, /* TDM interface control , */\ + { 0x1040, "TDMCKINV"}, /* TDM clock inversion , */\ + { 0x1053, "TDMFSLN"}, /* TDM FS length , */\ + { 0x1090, "TDMFSPOL"}, /* TDM FS polarity , */\ + { 0x10a4, "TDMSAMSZ"}, /* TDM Sample Size for all tdm sinks/sources , */\ + { 0x1103, "TDMSLOTS"}, /* Number of slots , */\ + { 0x1144, "TDMSLLN"}, /* Slot length , */\ + { 0x1194, "TDMBRMG"}, /* Bits remaining , */\ + { 0x11e0, "TDMDDEL"}, /* Data delay , */\ + { 0x11f0, "TDMDADJ"}, /* Data adjustment , */\ + { 0x1201, "TDMTXFRM"}, /* TXDATA format , */\ + { 0x1221, "TDMUUS0"}, /* TXDATA format unused slot sd0 , */\ + { 0x1241, "TDMUUS1"}, /* TXDATA format unused slot sd1 , */\ + { 0x1270, "TDMSI0EN"}, /* TDM sink0 enable , */\ + { 0x1280, "TDMSI1EN"}, /* TDM sink1 enable , */\ + { 0x1290, "TDMSI2EN"}, /* TDM sink2 enable , */\ + { 0x12a0, "TDMSO0EN"}, /* TDM source0 enable , */\ + { 0x12b0, "TDMSO1EN"}, /* TDM source1 enable , */\ + { 0x12c0, "TDMSO2EN"}, /* TDM source2 enable , */\ + { 0x12d0, "TDMSI0IO"}, /* tdm_sink0_io , */\ + { 0x12e0, "TDMSI1IO"}, /* tdm_sink1_io , */\ + { 0x12f0, "TDMSI2IO"}, /* tdm_sink2_io , */\ + { 0x1300, "TDMSO0IO"}, /* tdm_source0_io , */\ + { 0x1310, "TDMSO1IO"}, /* tdm_source1_io , */\ + { 0x1320, "TDMSO2IO"}, /* tdm_source2_io , */\ + { 0x1333, "TDMSI0SL"}, /* sink0_slot [GAIN IN] , */\ + { 0x1373, "TDMSI1SL"}, /* sink1_slot [CH1 IN] , */\ + { 0x13b3, "TDMSI2SL"}, /* sink2_slot [CH2 IN] , */\ + { 0x1403, "TDMSO0SL"}, /* source0_slot [GAIN OUT] , */\ + { 0x1443, "TDMSO1SL"}, /* source1_slot [Voltage Sense] , */\ + { 0x1483, "TDMSO2SL"}, /* source2_slot [Current Sense] , */\ + { 0x14c3, "NBCK"}, /* NBCK , */\ + { 0x2000, "INTOVDDS"}, /* flag_por_int_out , */\ + { 0x2010, "INTOPLLS"}, /* flag_pll_lock_int_out , */\ + { 0x2020, "INTOOTDS"}, /* flag_otpok_int_out , */\ + { 0x2030, "INTOOVDS"}, /* flag_ovpok_int_out , */\ + { 0x2040, "INTOUVDS"}, /* flag_uvpok_int_out , */\ + { 0x2050, "INTOOCDS"}, /* flag_ocp_alarm_int_out , */\ + { 0x2060, "INTOCLKS"}, /* flag_clocks_stable_int_out , */\ + { 0x2070, "INTOCLIPS"}, /* flag_clip_int_out , */\ + { 0x2080, "INTOMTPB"}, /* mtp_busy_int_out , */\ + { 0x2090, "INTONOCLK"}, /* flag_lost_clk_int_out , */\ + { 0x20a0, "INTOSPKS"}, /* flag_cf_speakererror_int_out , */\ + { 0x20b0, "INTOACS"}, /* flag_cold_started_int_out , */\ + { 0x20c0, "INTOSWS"}, /* flag_engage_int_out , */\ + { 0x20d0, "INTOWDS"}, /* flag_watchdog_reset_int_out , */\ + { 0x20e0, "INTOAMPS"}, /* flag_enbl_amp_int_out , */\ + { 0x20f0, "INTOAREFS"}, /* flag_enbl_ref_int_out , */\ + { 0x2201, "INTOACK"}, /* Interrupt status register output - Corresponding flag, */\ + { 0x2300, "INTIVDDS"}, /* flag_por_int_in , */\ + { 0x2310, "INTIPLLS"}, /* flag_pll_lock_int_in , */\ + { 0x2320, "INTIOTDS"}, /* flag_otpok_int_in , */\ + { 0x2330, "INTIOVDS"}, /* flag_ovpok_int_in , */\ + { 0x2340, "INTIUVDS"}, /* flag_uvpok_int_in , */\ + { 0x2350, "INTIOCDS"}, /* flag_ocp_alarm_int_in , */\ + { 0x2360, "INTICLKS"}, /* flag_clocks_stable_int_in , */\ + { 0x2370, "INTICLIPS"}, /* flag_clip_int_in , */\ + { 0x2380, "INTIMTPB"}, /* mtp_busy_int_in , */\ + { 0x2390, "INTINOCLK"}, /* flag_lost_clk_int_in , */\ + { 0x23a0, "INTISPKS"}, /* flag_cf_speakererror_int_in , */\ + { 0x23b0, "INTIACS"}, /* flag_cold_started_int_in , */\ + { 0x23c0, "INTISWS"}, /* flag_engage_int_in , */\ + { 0x23d0, "INTIWDS"}, /* flag_watchdog_reset_int_in , */\ + { 0x23e0, "INTIAMPS"}, /* flag_enbl_amp_int_in , */\ + { 0x23f0, "INTIAREFS"}, /* flag_enbl_ref_int_in , */\ + { 0x2501, "INTIACK"}, /* Interrupt register input , */\ + { 0x2600, "INTENVDDS"}, /* flag_por_int_enable , */\ + { 0x2610, "INTENPLLS"}, /* flag_pll_lock_int_enable , */\ + { 0x2620, "INTENOTDS"}, /* flag_otpok_int_enable , */\ + { 0x2630, "INTENOVDS"}, /* flag_ovpok_int_enable , */\ + { 0x2640, "INTENUVDS"}, /* flag_uvpok_int_enable , */\ + { 0x2650, "INTENOCDS"}, /* flag_ocp_alarm_int_enable , */\ + { 0x2660, "INTENCLKS"}, /* flag_clocks_stable_int_enable , */\ + { 0x2670, "INTENCLIPS"}, /* flag_clip_int_enable , */\ + { 0x2680, "INTENMTPB"}, /* mtp_busy_int_enable , */\ + { 0x2690, "INTENNOCLK"}, /* flag_lost_clk_int_enable , */\ + { 0x26a0, "INTENSPKS"}, /* flag_cf_speakererror_int_enable , */\ + { 0x26b0, "INTENACS"}, /* flag_cold_started_int_enable , */\ + { 0x26c0, "INTENSWS"}, /* flag_engage_int_enable , */\ + { 0x26d0, "INTENWDS"}, /* flag_watchdog_reset_int_enable , */\ + { 0x26e0, "INTENAMPS"}, /* flag_enbl_amp_int_enable , */\ + { 0x26f0, "INTENAREFS"}, /* flag_enbl_ref_int_enable , */\ + { 0x2801, "INTENACK"}, /* Interrupt enable register , */\ + { 0x2900, "INTPOLVDDS"}, /* flag_por_int_pol , */\ + { 0x2910, "INTPOLPLLS"}, /* flag_pll_lock_int_pol , */\ + { 0x2920, "INTPOLOTDS"}, /* flag_otpok_int_pol , */\ + { 0x2930, "INTPOLOVDS"}, /* flag_ovpok_int_pol , */\ + { 0x2940, "INTPOLUVDS"}, /* flag_uvpok_int_pol , */\ + { 0x2950, "INTPOLOCDS"}, /* flag_ocp_alarm_int_pol , */\ + { 0x2960, "INTPOLCLKS"}, /* flag_clocks_stable_int_pol , */\ + { 0x2970, "INTPOLCLIPS"}, /* flag_clip_int_pol , */\ + { 0x2980, "INTPOLMTPB"}, /* mtp_busy_int_pol , */\ + { 0x2990, "INTPOLNOCLK"}, /* flag_lost_clk_int_pol , */\ + { 0x29a0, "INTPOLSPKS"}, /* flag_cf_speakererror_int_pol , */\ + { 0x29b0, "INTPOLACS"}, /* flag_cold_started_int_pol , */\ + { 0x29c0, "INTPOLSWS"}, /* flag_engage_int_pol , */\ + { 0x29d0, "INTPOLWDS"}, /* flag_watchdog_reset_int_pol , */\ + { 0x29e0, "INTPOLAMPS"}, /* flag_enbl_amp_int_pol , */\ + { 0x29f0, "INTPOLAREFS"}, /* flag_enbl_ref_int_pol , */\ + { 0x2b01, "INTPOLACK"}, /* Interrupt status flags polarity register , */\ + { 0x4900, "CLIP"}, /* Bypass clip control , */\ + { 0x62b0, "CIMTP"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ + { 0x7000, "RST"}, /* Reset CoolFlux DSP , */\ + { 0x7011, "DMEM"}, /* Target memory for access , */\ + { 0x7030, "AIF"}, /* Autoincrement-flag for memory-address , */\ + { 0x7040, "CFINT"}, /* Interrupt CoolFlux DSP , */\ + { 0x7087, "REQ"}, /* request for access (8 channels) , */\ + { 0x7080, "REQCMD"}, /* Firmware event request rpc command , */\ + { 0x7090, "REQRST"}, /* Firmware event request reset restart , */\ + { 0x70a0, "REQMIPS"}, /* Firmware event request short on mips , */\ + { 0x70b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ + { 0x70c0, "REQVOL"}, /* Firmware event request volume ready , */\ + { 0x70d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ + { 0x70e0, "REQCAL"}, /* Firmware event request calibration completed , */\ + { 0x70f0, "REQRSV"}, /* Firmware event request reserved , */\ + { 0x710f, "MADD"}, /* memory-address to be accessed , */\ + { 0x720f, "MEMA"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ + { 0x7307, "ERR"}, /* Coolflux error flags , */\ + { 0x7387, "ACK"}, /* acknowledge of requests (8 channels) , */\ + { 0x7380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ + { 0x7390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ + { 0x73a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ + { 0x73b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x73c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ + { 0x73d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x73e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ + { 0x73f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ + { 0x8000, "MTPOTC"}, /* Calibration schedule (key2 protected) , */\ + { 0x8010, "MTPEX"}, /* (key2 protected) , */\ + { 0x8045, "SWPROFIL" },\ + { 0x80a5, "SWVSTEP" },\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA1_BITNAMETABLE static tfaBfName_t Tfa1BitNames[] = {\ + { 0x0, "flag_por"}, /* Power-on-reset flag , */\ + { 0x10, "flag_pll_lock"}, /* PLL lock , */\ + { 0x20, "flag_otpok"}, /* Over Temperature Protection alarm , */\ + { 0x30, "flag_ovpok"}, /* Over Voltage Protection alarm , */\ + { 0x40, "flag_uvpok"}, /* Under Voltage Protection alarm , */\ + { 0x50, "flag_ocp_alarm"}, /* Over Current Protection alarm , */\ + { 0x60, "flag_clocks_stable"}, /* Clocks stable flag , */\ + { 0x70, "flag_clip"}, /* Amplifier clipping , */\ + { 0x80, "mtp_busy"}, /* MTP busy , */\ + { 0x90, "flag_lost_clk"}, /* Flag lost clock from clock generation unit , */\ + { 0xa0, "flag_cf_speakererror"}, /* Speaker error flag , */\ + { 0xb0, "flag_cold_started"}, /* Cold Start flag , */\ + { 0xc0, "flag_engage"}, /* Flag Engage , */\ + { 0xd0, "flag_watchdog_reset"}, /* Flag watchdog reset , */\ + { 0xe0, "flag_enbl_amp"}, /* Amplifier is enabled by manager , */\ + { 0xf0, "flag_enbl_ref"}, /* References are enabled by manager , */\ + { 0x109, "bat_adc"}, /* Battery voltage readout; 0 .. 5.5 [V] , */\ + { 0x208, "temp_adc"}, /* Temperature readout from the temperature sensor , */\ + { 0x30b, "rev_reg"}, /* Device type number is B97 , */\ + { 0x420, "ctrl_rcv"}, /* Enable Receiver Mode , */\ + { 0x431, "chan_sel"}, /* Channel Selection TDM input for Coolflux , */\ + { 0x450, "input_level"}, /* Input level selection control , */\ + { 0x461, "vamp_sel"}, /* Input selection for amplifier , */\ + { 0x4c3, "audio_fs"}, /* Audio sample rate setting , */\ + { 0x501, "vbat_prot_attacktime"}, /* Protection Attack Time , */\ + { 0x523, "vbat_prot_thlevel"}, /* ProtectionThreshold , */\ + { 0x561, "vbat_prot_max_reduct"}, /* Protection Maximum Reduction , */\ + { 0x582, "vbat_prot_release_t"}, /* Battery Protection Release Time , */\ + { 0x5b1, "vbat_prot_hysterese"}, /* Battery Protection Hysteresis , */\ + { 0x5d0, "reset_min_vbat"}, /* reset clipper , */\ + { 0x5e0, "sel_vbat"}, /* battery voltage for I2C read out only , */\ + { 0x5f0, "bypass_clipper"}, /* bypass clipper battery protection , */\ + { 0x600, "dpsa"}, /* Enable dynamic powerstage activation , */\ + { 0x650, "cf_mute"}, /* Soft mute in CoolFlux , */\ + { 0x670, "batsense_steepness"}, /* BatSenseSteepness , */\ + { 0x687, "vol"}, /* volume control (in CoolFlux) , */\ + { 0x702, "boost_volt"}, /* Boost Voltage , */\ + { 0x733, "boost_cur"}, /* Max boost coil current - step of 175 mA , */\ + { 0x7a0, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7b0, "boost_speed"}, /* Soft RampUp/Down mode for DCDC controller , */\ + { 0x7c0, "boost_peak2avg"}, /* ctrl_peak2avg for analog part of DCDC , */\ + { 0x800, "ext_temp_sel"}, /* Select external temperature also the ext_temp will be put on the temp read out , */\ + { 0x818, "ext_temp"}, /* external temperature setting to be given by host , */\ + { 0x8b2, "dcdc_synchronisation"}, /* DCDC synchronisation off + 7 positions , */\ + { 0x900, "powerdown"}, /* Device Mode , */\ + { 0x910, "reset"}, /* I2C Reset , */\ + { 0x920, "enbl_coolflux"}, /* Enable CoolFlux , */\ + { 0x930, "enbl_amplifier"}, /* Enable Amplifier , */\ + { 0x940, "enbl_boost"}, /* EnableBoost , */\ + { 0x950, "coolflux_configured"}, /* Coolflux configured , */\ + { 0x960, "sel_enbl_amplifier"}, /* Selection on how Amplifier is enabled , */\ + { 0x970, "dcdcoff_mode"}, /* DCDC not connected , */\ + { 0x980, "iddqtest"}, /* IDDQ test amplifier , */\ + { 0x991, "coil_value"}, /* Coil Value , */\ + { 0x9b0, "sel_cf_clock"}, /* Selection CoolFlux Clock , */\ + { 0x9c1, "int_pad_io"}, /* INT pad configuration control , */\ + { 0x9e0, "sel_fs_bck"}, /* PLL input reference clock selection , */\ + { 0x9f0, "sel_scl_cf_clock"}, /* Coolflux sub-system clock , */\ + { 0xb07, "mtpkey2"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0xc00, "enbl_volt_sense"}, /* Voltage sense enabling control bit , */\ + { 0xc10, "vsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ + { 0xc25, "vi_frac_delay"}, /* Fractional delay adjustment between current and voltage sense, */\ + { 0xc80, "sel_voltsense_out"}, /* TDM output data selection control , */\ + { 0xc90, "vsense_bypass_avg"}, /* Voltage Sense Average Block Bypass , */\ + { 0xd05, "cf_frac_delay"}, /* Fractional delay adjustment between current and voltage sense by firmware, */\ + { 0xe00, "bypass_dcdc_curr_prot"}, /* Control to switch off dcdc current reduction with bat protection, */\ + { 0xe80, "disable_clock_sh_prot"}, /* disable clock_sh protection , */\ + { 0xe96, "reserve_reg_1_15_9"}, /* , */\ + { 0x1011, "tdm_usecase"}, /* TDM_usecase , */\ + { 0x1030, "tdm_enable"}, /* TDM interface control , */\ + { 0x1040, "tdm_clk_inversion"}, /* TDM clock inversion , */\ + { 0x1053, "tdm_fs_ws_length"}, /* TDM FS length , */\ + { 0x1090, "tdm_fs_ws_polarity"}, /* TDM FS polarity , */\ + { 0x10a4, "tdm_sample_size"}, /* TDM Sample Size for all tdm sinks/sources , */\ + { 0x1103, "tdm_nb_of_slots"}, /* Number of slots , */\ + { 0x1144, "tdm_slot_length"}, /* Slot length , */\ + { 0x1194, "tdm_bits_remaining"}, /* Bits remaining , */\ + { 0x11e0, "tdm_data_delay"}, /* Data delay , */\ + { 0x11f0, "tdm_data_adjustment"}, /* Data adjustment , */\ + { 0x1201, "tdm_txdata_format"}, /* TXDATA format , */\ + { 0x1221, "tdm_txdata_format_unused_slot_sd0"}, /* TXDATA format unused slot sd0 , */\ + { 0x1241, "tdm_txdata_format_unused_slot_sd1"}, /* TXDATA format unused slot sd1 , */\ + { 0x1270, "tdm_sink0_enable"}, /* TDM sink0 enable , */\ + { 0x1280, "tdm_sink1_enable"}, /* TDM sink1 enable , */\ + { 0x1290, "tdm_sink2_enable"}, /* TDM sink2 enable , */\ + { 0x12a0, "tdm_source0_enable"}, /* TDM source0 enable , */\ + { 0x12b0, "tdm_source1_enable"}, /* TDM source1 enable , */\ + { 0x12c0, "tdm_source2_enable"}, /* TDM source2 enable , */\ + { 0x12d0, "tdm_sink0_io"}, /* tdm_sink0_io , */\ + { 0x12e0, "tdm_sink1_io"}, /* tdm_sink1_io , */\ + { 0x12f0, "tdm_sink2_io"}, /* tdm_sink2_io , */\ + { 0x1300, "tdm_source0_io"}, /* tdm_source0_io , */\ + { 0x1310, "tdm_source1_io"}, /* tdm_source1_io , */\ + { 0x1320, "tdm_source2_io"}, /* tdm_source2_io , */\ + { 0x1333, "tdm_sink0_slot"}, /* sink0_slot [GAIN IN] , */\ + { 0x1373, "tdm_sink1_slot"}, /* sink1_slot [CH1 IN] , */\ + { 0x13b3, "tdm_sink2_slot"}, /* sink2_slot [CH2 IN] , */\ + { 0x1403, "tdm_source0_slot"}, /* source0_slot [GAIN OUT] , */\ + { 0x1443, "tdm_source1_slot"}, /* source1_slot [Voltage Sense] , */\ + { 0x1483, "tdm_source2_slot"}, /* source2_slot [Current Sense] , */\ + { 0x14c3, "tdm_nbck"}, /* NBCK , */\ + { 0x1500, "flag_tdm_lut_error"}, /* TDM LUT error flag , */\ + { 0x1512, "flag_tdm_status"}, /* TDM interface status bits , */\ + { 0x1540, "flag_tdm_error"}, /* TDM interface error indicator , */\ + { 0x2000, "flag_por_int_out"}, /* flag_por_int_out , */\ + { 0x2010, "flag_pll_lock_int_out"}, /* flag_pll_lock_int_out , */\ + { 0x2020, "flag_otpok_int_out"}, /* flag_otpok_int_out , */\ + { 0x2030, "flag_ovpok_int_out"}, /* flag_ovpok_int_out , */\ + { 0x2040, "flag_uvpok_int_out"}, /* flag_uvpok_int_out , */\ + { 0x2050, "flag_ocp_alarm_int_out"}, /* flag_ocp_alarm_int_out , */\ + { 0x2060, "flag_clocks_stable_int_out"}, /* flag_clocks_stable_int_out , */\ + { 0x2070, "flag_clip_int_out"}, /* flag_clip_int_out , */\ + { 0x2080, "mtp_busy_int_out"}, /* mtp_busy_int_out , */\ + { 0x2090, "flag_lost_clk_int_out"}, /* flag_lost_clk_int_out , */\ + { 0x20a0, "flag_cf_speakererror_int_out"}, /* flag_cf_speakererror_int_out , */\ + { 0x20b0, "flag_cold_started_int_out"}, /* flag_cold_started_int_out , */\ + { 0x20c0, "flag_engage_int_out"}, /* flag_engage_int_out , */\ + { 0x20d0, "flag_watchdog_reset_int_out"}, /* flag_watchdog_reset_int_out , */\ + { 0x20e0, "flag_enbl_amp_int_out"}, /* flag_enbl_amp_int_out , */\ + { 0x20f0, "flag_enbl_ref_int_out"}, /* flag_enbl_ref_int_out , */\ + { 0x2100, "flag_voutcomp_int_out"}, /* flag_voutcomp_int_out , */\ + { 0x2110, "flag_voutcomp93_int_out"}, /* flag_voutcomp93_int_out , */\ + { 0x2120, "flag_voutcomp86_int_out"}, /* flag_voutcomp86_int_out , */\ + { 0x2130, "flag_hiz_int_out"}, /* flag_hiz_int_out , */\ + { 0x2140, "flag_ocpokbst_int_out"}, /* flag_ocpokbst_int_out , */\ + { 0x2150, "flag_peakcur_int_out"}, /* flag_peakcur_int_out , */\ + { 0x2160, "flag_ocpokap_int_out"}, /* flag_ocpokap_int_out , */\ + { 0x2170, "flag_ocpokan_int_out"}, /* flag_ocpokan_int_out , */\ + { 0x2180, "flag_ocpokbp_int_out"}, /* flag_ocpokbp_int_out , */\ + { 0x2190, "flag_ocpokbn_int_out"}, /* flag_ocpokbn_int_out , */\ + { 0x21a0, "flag_adc10_ready_int_out"}, /* flag_adc10_ready_int_out , */\ + { 0x21b0, "flag_clipa_high_int_out"}, /* flag_clipa_high_int_out , */\ + { 0x21c0, "flag_clipa_low_int_out"}, /* flag_clipa_low_int_out , */\ + { 0x21d0, "flag_clipb_high_int_out"}, /* flag_clipb_high_int_out , */\ + { 0x21e0, "flag_clipb_low_int_out"}, /* flag_clipb_low_int_out , */\ + { 0x21f0, "flag_tdm_error_int_out"}, /* flag_tdm_error_int_out , */\ + { 0x2201, "interrupt_out3"}, /* Interrupt status register output - Corresponding flag, */\ + { 0x2300, "flag_por_int_in"}, /* flag_por_int_in , */\ + { 0x2310, "flag_pll_lock_int_in"}, /* flag_pll_lock_int_in , */\ + { 0x2320, "flag_otpok_int_in"}, /* flag_otpok_int_in , */\ + { 0x2330, "flag_ovpok_int_in"}, /* flag_ovpok_int_in , */\ + { 0x2340, "flag_uvpok_int_in"}, /* flag_uvpok_int_in , */\ + { 0x2350, "flag_ocp_alarm_int_in"}, /* flag_ocp_alarm_int_in , */\ + { 0x2360, "flag_clocks_stable_int_in"}, /* flag_clocks_stable_int_in , */\ + { 0x2370, "flag_clip_int_in"}, /* flag_clip_int_in , */\ + { 0x2380, "mtp_busy_int_in"}, /* mtp_busy_int_in , */\ + { 0x2390, "flag_lost_clk_int_in"}, /* flag_lost_clk_int_in , */\ + { 0x23a0, "flag_cf_speakererror_int_in"}, /* flag_cf_speakererror_int_in , */\ + { 0x23b0, "flag_cold_started_int_in"}, /* flag_cold_started_int_in , */\ + { 0x23c0, "flag_engage_int_in"}, /* flag_engage_int_in , */\ + { 0x23d0, "flag_watchdog_reset_int_in"}, /* flag_watchdog_reset_int_in , */\ + { 0x23e0, "flag_enbl_amp_int_in"}, /* flag_enbl_amp_int_in , */\ + { 0x23f0, "flag_enbl_ref_int_in"}, /* flag_enbl_ref_int_in , */\ + { 0x2400, "flag_voutcomp_int_in"}, /* flag_voutcomp_int_in , */\ + { 0x2410, "flag_voutcomp93_int_in"}, /* flag_voutcomp93_int_in , */\ + { 0x2420, "flag_voutcomp86_int_in"}, /* flag_voutcomp86_int_in , */\ + { 0x2430, "flag_hiz_int_in"}, /* flag_hiz_int_in , */\ + { 0x2440, "flag_ocpokbst_int_in"}, /* flag_ocpokbst_int_in , */\ + { 0x2450, "flag_peakcur_int_in"}, /* flag_peakcur_int_in , */\ + { 0x2460, "flag_ocpokap_int_in"}, /* flag_ocpokap_int_in , */\ + { 0x2470, "flag_ocpokan_int_in"}, /* flag_ocpokan_int_in , */\ + { 0x2480, "flag_ocpokbp_int_in"}, /* flag_ocpokbp_int_in , */\ + { 0x2490, "flag_ocpokbn_int_in"}, /* flag_ocpokbn_int_in , */\ + { 0x24a0, "flag_adc10_ready_int_in"}, /* flag_adc10_ready_int_in , */\ + { 0x24b0, "flag_clipa_high_int_in"}, /* flag_clipa_high_int_in , */\ + { 0x24c0, "flag_clipa_low_int_in"}, /* flag_clipa_low_int_in , */\ + { 0x24d0, "flag_clipb_high_int_in"}, /* flag_clipb_high_int_in , */\ + { 0x24e0, "flag_clipb_low_int_in"}, /* flag_clipb_low_int_in , */\ + { 0x24f0, "flag_tdm_error_int_in"}, /* flag_tdm_error_int_in , */\ + { 0x2501, "interrupt_in3"}, /* Interrupt register input , */\ + { 0x2600, "flag_por_int_enable"}, /* flag_por_int_enable , */\ + { 0x2610, "flag_pll_lock_int_enable"}, /* flag_pll_lock_int_enable , */\ + { 0x2620, "flag_otpok_int_enable"}, /* flag_otpok_int_enable , */\ + { 0x2630, "flag_ovpok_int_enable"}, /* flag_ovpok_int_enable , */\ + { 0x2640, "flag_uvpok_int_enable"}, /* flag_uvpok_int_enable , */\ + { 0x2650, "flag_ocp_alarm_int_enable"}, /* flag_ocp_alarm_int_enable , */\ + { 0x2660, "flag_clocks_stable_int_enable"}, /* flag_clocks_stable_int_enable , */\ + { 0x2670, "flag_clip_int_enable"}, /* flag_clip_int_enable , */\ + { 0x2680, "mtp_busy_int_enable"}, /* mtp_busy_int_enable , */\ + { 0x2690, "flag_lost_clk_int_enable"}, /* flag_lost_clk_int_enable , */\ + { 0x26a0, "flag_cf_speakererror_int_enable"}, /* flag_cf_speakererror_int_enable , */\ + { 0x26b0, "flag_cold_started_int_enable"}, /* flag_cold_started_int_enable , */\ + { 0x26c0, "flag_engage_int_enable"}, /* flag_engage_int_enable , */\ + { 0x26d0, "flag_watchdog_reset_int_enable"}, /* flag_watchdog_reset_int_enable , */\ + { 0x26e0, "flag_enbl_amp_int_enable"}, /* flag_enbl_amp_int_enable , */\ + { 0x26f0, "flag_enbl_ref_int_enable"}, /* flag_enbl_ref_int_enable , */\ + { 0x2700, "flag_voutcomp_int_enable"}, /* flag_voutcomp_int_enable , */\ + { 0x2710, "flag_voutcomp93_int_enable"}, /* flag_voutcomp93_int_enable , */\ + { 0x2720, "flag_voutcomp86_int_enable"}, /* flag_voutcomp86_int_enable , */\ + { 0x2730, "flag_hiz_int_enable"}, /* flag_hiz_int_enable , */\ + { 0x2740, "flag_ocpokbst_int_enable"}, /* flag_ocpokbst_int_enable , */\ + { 0x2750, "flag_peakcur_int_enable"}, /* flag_peakcur_int_enable , */\ + { 0x2760, "flag_ocpokap_int_enable"}, /* flag_ocpokap_int_enable , */\ + { 0x2770, "flag_ocpokan_int_enable"}, /* flag_ocpokan_int_enable , */\ + { 0x2780, "flag_ocpokbp_int_enable"}, /* flag_ocpokbp_int_enable , */\ + { 0x2790, "flag_ocpokbn_int_enable"}, /* flag_ocpokbn_int_enable , */\ + { 0x27a0, "flag_adc10_ready_int_enable"}, /* flag_adc10_ready_int_enable , */\ + { 0x27b0, "flag_clipa_high_int_enable"}, /* flag_clipa_high_int_enable , */\ + { 0x27c0, "flag_clipa_low_int_enable"}, /* flag_clipa_low_int_enable , */\ + { 0x27d0, "flag_clipb_high_int_enable"}, /* flag_clipb_high_int_enable , */\ + { 0x27e0, "flag_clipb_low_int_enable"}, /* flag_clipb_low_int_enable , */\ + { 0x27f0, "flag_tdm_error_int_enable"}, /* flag_tdm_error_int_enable , */\ + { 0x2801, "interrupt_enable3"}, /* Interrupt enable register , */\ + { 0x2900, "flag_por_int_pol"}, /* flag_por_int_pol , */\ + { 0x2910, "flag_pll_lock_int_pol"}, /* flag_pll_lock_int_pol , */\ + { 0x2920, "flag_otpok_int_pol"}, /* flag_otpok_int_pol , */\ + { 0x2930, "flag_ovpok_int_pol"}, /* flag_ovpok_int_pol , */\ + { 0x2940, "flag_uvpok_int_pol"}, /* flag_uvpok_int_pol , */\ + { 0x2950, "flag_ocp_alarm_int_pol"}, /* flag_ocp_alarm_int_pol , */\ + { 0x2960, "flag_clocks_stable_int_pol"}, /* flag_clocks_stable_int_pol , */\ + { 0x2970, "flag_clip_int_pol"}, /* flag_clip_int_pol , */\ + { 0x2980, "mtp_busy_int_pol"}, /* mtp_busy_int_pol , */\ + { 0x2990, "flag_lost_clk_int_pol"}, /* flag_lost_clk_int_pol , */\ + { 0x29a0, "flag_cf_speakererror_int_pol"}, /* flag_cf_speakererror_int_pol , */\ + { 0x29b0, "flag_cold_started_int_pol"}, /* flag_cold_started_int_pol , */\ + { 0x29c0, "flag_engage_int_pol"}, /* flag_engage_int_pol , */\ + { 0x29d0, "flag_watchdog_reset_int_pol"}, /* flag_watchdog_reset_int_pol , */\ + { 0x29e0, "flag_enbl_amp_int_pol"}, /* flag_enbl_amp_int_pol , */\ + { 0x29f0, "flag_enbl_ref_int_pol"}, /* flag_enbl_ref_int_pol , */\ + { 0x2a00, "flag_voutcomp_int_pol"}, /* flag_voutcomp_int_pol , */\ + { 0x2a10, "flag_voutcomp93_int_pol"}, /* flag_voutcomp93_int_pol , */\ + { 0x2a20, "flag_voutcomp86_int_pol"}, /* flag_voutcomp86_int_pol , */\ + { 0x2a30, "flag_hiz_int_pol"}, /* flag_hiz_int_pol , */\ + { 0x2a40, "flag_ocpokbst_int_pol"}, /* flag_ocpokbst_int_pol , */\ + { 0x2a50, "flag_peakcur_int_pol"}, /* flag_peakcur_int_pol , */\ + { 0x2a60, "flag_ocpokap_int_pol"}, /* flag_ocpokap_int_pol , */\ + { 0x2a70, "flag_ocpokan_int_pol"}, /* flag_ocpokan_int_pol , */\ + { 0x2a80, "flag_ocpokbp_int_pol"}, /* flag_ocpokbp_int_pol , */\ + { 0x2a90, "flag_ocpokbn_int_pol"}, /* flag_ocpokbn_int_pol , */\ + { 0x2aa0, "flag_adc10_ready_int_pol"}, /* flag_adc10_ready_int_pol , */\ + { 0x2ab0, "flag_clipa_high_int_pol"}, /* flag_clipa_high_int_pol , */\ + { 0x2ac0, "flag_clipa_low_int_pol"}, /* flag_clipa_low_int_pol , */\ + { 0x2ad0, "flag_clipb_high_int_pol"}, /* flag_clipb_high_int_pol , */\ + { 0x2ae0, "flag_clipb_low_int_pol"}, /* flag_clipb_low_int_pol , */\ + { 0x2af0, "flag_tdm_error_int_pol"}, /* flag_tdm_error_int_pol , */\ + { 0x2b01, "status_polarity3"}, /* Interrupt status flags polarity register , */\ + { 0x3000, "flag_voutcomp"}, /* flag_voutcomp, indication Vset is larger than Vbat, */\ + { 0x3010, "flag_voutcomp93"}, /* flag_voutcomp93, indication Vset is larger than 1.07* Vbat, */\ + { 0x3020, "flag_voutcomp86"}, /* flag_voutcomp86, indication Vset is larger than 1.14* Vbat, */\ + { 0x3030, "flag_hiz"}, /* flag_hiz, indication Vbst is larger than Vbat , */\ + { 0x3040, "flag_ocpokbst"}, /* flag_ocpokbst, indication no over current in boost converter pmos switch, */\ + { 0x3050, "flag_peakcur"}, /* flag_peakcur, indication current is max in dcdc converter, */\ + { 0x3060, "flag_ocpokap"}, /* flag_ocpokap, indication no over current in amplifier "a" pmos output stage, */\ + { 0x3070, "flag_ocpokan"}, /* flag_ocpokan, indication no over current in amplifier "a" nmos output stage, */\ + { 0x3080, "flag_ocpokbp"}, /* flag_ocpokbp, indication no over current in amplifier "b" pmos output stage, */\ + { 0x3090, "flag_ocpokbn"}, /* flag_ocpokbn, indication no over current in amplifier"b" nmos output stage, */\ + { 0x30a0, "flag_adc10_ready"}, /* flag_adc10_ready, indication adc10 is ready , */\ + { 0x30b0, "flag_clipa_high"}, /* flag_clipa_high, indication pmos amplifier "a" is clipping, */\ + { 0x30c0, "flag_clipa_low"}, /* flag_clipa_low, indication nmos amplifier "a" is clipping, */\ + { 0x30d0, "flag_clipb_high"}, /* flag_clipb_high, indication pmos amplifier "b" is clipping, */\ + { 0x30e0, "flag_clipb_low"}, /* flag_clipb_low, indication nmos amplifier "b" is clipping, */\ + { 0x310f, "mtp_man_data_out"}, /* single word read from MTP (manual copy) , */\ + { 0x3200, "key01_locked"}, /* key01_locked, indication key 1 is locked , */\ + { 0x3210, "key02_locked"}, /* key02_locked, indication key 2 is locked , */\ + { 0x3225, "mtp_ecc_tcout"}, /* mtp_ecc_tcout , */\ + { 0x3280, "mtpctrl_valid_test_rd"}, /* mtp test readout for read , */\ + { 0x3290, "mtpctrl_valid_test_wr"}, /* mtp test readout for write , */\ + { 0x32a0, "flag_in_alarm_state"}, /* Alarm state , */\ + { 0x32b0, "mtp_ecc_err2"}, /* two or more bit errors detected in MTP, can not reconstruct value, */\ + { 0x32c0, "mtp_ecc_err1"}, /* one bit error detected in MTP, reconstructed value, */\ + { 0x32d0, "mtp_mtp_hvf"}, /* high voltage ready flag for MTP , */\ + { 0x32f0, "mtp_zero_check_fail"}, /* zero check failed (tbd) for MTP , */\ + { 0x3309, "data_adc10_tempbat"}, /* data_adc10_tempbat[9;0], adc 10 data output for testing, */\ + { 0x400f, "hid_code"}, /* 5A6Bh, 23147d to access registers (Default for engineering), */\ + { 0x4100, "bypass_hp"}, /* Bypass_High Pass Filter , */\ + { 0x4110, "hard_mute"}, /* Hard Mute , */\ + { 0x4120, "soft_mute"}, /* Soft Mute , */\ + { 0x4134, "pwm_delay"}, /* PWM DelayBits to set the delay , */\ + { 0x4180, "pwm_shape"}, /* PWM Shape , */\ + { 0x4190, "pwm_bitlength"}, /* PWM Bitlength in noise shaper , */\ + { 0x4203, "drive"}, /* Drive bits to select amount of power stage amplifier, */\ + { 0x4240, "reclock_pwm"}, /* , */\ + { 0x4250, "reclock_voltsense"}, /* , */\ + { 0x4281, "dpsalevel"}, /* DPSA Threshold level , */\ + { 0x42a1, "dpsa_release"}, /* DPSA Release time , */\ + { 0x42c0, "coincidence"}, /* Prevent simultaneously switching of output stage , */\ + { 0x42d0, "kickback"}, /* Prevent double pulses of output stage , */\ + { 0x4306, "drivebst"}, /* Drive bits to select the powertransistor sections boost converter, */\ + { 0x43a0, "ocptestbst"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0);For new ocp (ctrl_reversebst is 1);, */\ + { 0x43d0, "test_abistfft_enbl"}, /* FFT coolflux , */\ + { 0x43f0, "test_bcontrol"}, /* test _bcontrol , */\ + { 0x4400, "reversebst"}, /* OverCurrent Protection selection of power stage boost converter, */\ + { 0x4410, "sensetest"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0x4420, "enbl_engagebst"}, /* Enable power stage dcdc controller , */\ + { 0x4470, "enbl_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x4480, "enbl_voutcomp"}, /* Enable vout comparators , */\ + { 0x4490, "enbl_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x44a0, "enbl_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x44b0, "enbl_hizcom"}, /* Enable hiz comparator , */\ + { 0x44c0, "enbl_peakcur"}, /* Enable peak current , */\ + { 0x44d0, "bypass_ovpglitch"}, /* Bypass OVP Glitch Filter , */\ + { 0x44e0, "enbl_windac"}, /* Enable window dac , */\ + { 0x44f0, "enbl_powerbst"}, /* Enable line of the powerstage , */\ + { 0x4507, "ocp_thr"}, /* ocp_thr threshold level for OCP , */\ + { 0x4580, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0x4590, "bypass_ovp"}, /* Bypass OVP , */\ + { 0x45a0, "bypass_uvp"}, /* Bypass UVP , */\ + { 0x45b0, "bypass_otp"}, /* Bypass OTP , */\ + { 0x45c0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0x45d0, "bypass_ocpcounter"}, /* BypassOCPCounter , */\ + { 0x45e0, "bypass_lost_clk"}, /* Bypasslost_clk detector , */\ + { 0x45f0, "vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0x4600, "bypass_gc"}, /* bypass_gc, bypasses the CS gain correction , */\ + { 0x4610, "cs_gain_control"}, /* gain control by means of MTP or i2c; 0 is MTP , */\ + { 0x4627, "cs_gain"}, /* + / - 128 steps in steps of 1/4 percent 2's compliment, */\ + { 0x46a0, "bypass_lp"}, /* bypass Low-Pass filter in temperature sensor , */\ + { 0x46b0, "bypass_pwmcounter"}, /* bypass_pwmcounter , */\ + { 0x46c0, "cs_negfixed"}, /* does not switch to neg , */\ + { 0x46d2, "cs_neghyst"}, /* switches to neg depending on level , */\ + { 0x4700, "switch_fb"}, /* switch_fb , */\ + { 0x4713, "se_hyst"}, /* se_hyst , */\ + { 0x4754, "se_level"}, /* se_level , */\ + { 0x47a5, "ktemp"}, /* temperature compensation trimming , */\ + { 0x4800, "cs_negin"}, /* negin , */\ + { 0x4810, "cs_sein"}, /* cs_sein , */\ + { 0x4820, "cs_coincidence"}, /* Coincidence current sense , */\ + { 0x4830, "iddqtestbst"}, /* for iddq testing in powerstage of boost convertor , */\ + { 0x4840, "coincidencebst"}, /* Switch protection on to prevent simultaneously switching power stages bst and amp, */\ + { 0x4876, "delay_se_neg"}, /* delay of se and neg , */\ + { 0x48e1, "cs_ttrack"}, /* sample & hold track time , */\ + { 0x4900, "bypass_clip"}, /* Bypass clip control , */\ + { 0x4920, "cf_cgate_off"}, /* to disable clock gating in the coolflux , */\ + { 0x4940, "clipfast"}, /* clock switch for battery protection clipper, it switches back to old frequency, */\ + { 0x4950, "cs_8ohm"}, /* 8 ohm mode for current sense (gain mode) , */\ + { 0x4974, "delay_clock_sh"}, /* delay_sh, tunes S7H delay , */\ + { 0x49c0, "inv_clksh"}, /* Invert the sample/hold clock for current sense ADC, */\ + { 0x49d0, "inv_neg"}, /* Invert neg signal , */\ + { 0x49e0, "inv_se"}, /* Invert se signal , */\ + { 0x49f0, "setse"}, /* switches between Single Ende and differential mode; 1 is single ended, */\ + { 0x4a12, "adc10_sel"}, /* select the input to convert the 10b ADC , */\ + { 0x4a60, "adc10_reset"}, /* Global asynchronous reset (active HIGH) 10 bit ADC, */\ + { 0x4a81, "adc10_test"}, /* Test mode selection signal 10 bit ADC , */\ + { 0x4aa0, "bypass_lp_vbat"}, /* lp filter in batt sensor , */\ + { 0x4ae0, "dc_offset"}, /* switch offset control on/off, is decimator offset control, */\ + { 0x4af0, "tsense_hibias"}, /* bit to set the biasing in temp sensor to high , */\ + { 0x4b00, "adc13_iset"}, /* Micadc Setting of current consumption. Debug use only, */\ + { 0x4b14, "adc13_gain"}, /* Micadc gain setting (2-compl) , */\ + { 0x4b61, "adc13_slowdel"}, /* Micadc Delay setting for internal clock. Debug use only, */\ + { 0x4b83, "adc13_offset"}, /* Micadc ADC offset setting , */\ + { 0x4bc0, "adc13_bsoinv"}, /* Micadc bit stream output invert mode for test , */\ + { 0x4bd0, "adc13_resonator_enable"}, /* Micadc Give extra SNR with less stability. Debug use only, */\ + { 0x4be0, "testmicadc"}, /* Mux at input of MICADC for test purpose , */\ + { 0x4c0f, "abist_offset"}, /* offset control for ABIST testing , */\ + { 0x4d05, "windac"}, /* for testing direct control windac , */\ + { 0x4dc3, "pwm_dcc_cnt"}, /* control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0x4e04, "slopecur"}, /* for testing direct control slopecur , */\ + { 0x4e50, "ctrl_dem"}, /* dyn element matching control, rest of codes are optional, */\ + { 0x4ed0, "enbl_pwm_dcc"}, /* to enable direct control of pwm duty cycle , */\ + { 0x5007, "gain"}, /* Gain setting of the gain multiplier , */\ + { 0x5081, "sourceb"}, /* Set OUTB to , */\ + { 0x50a1, "sourcea"}, /* Set OUTA to , */\ + { 0x50c1, "sourcebst"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0x50e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0x5104, "pulselengthbst"}, /* pulse length setting test input for boost converter, */\ + { 0x5150, "bypasslatchbst"}, /* bypass_latch in boost converter , */\ + { 0x5160, "invertbst"}, /* invert pwmbst test signal , */\ + { 0x5174, "pulselength"}, /* pulse length setting test input for amplifier , */\ + { 0x51c0, "bypasslatch"}, /* bypass_latch in PWM source selection module , */\ + { 0x51d0, "invertb"}, /* invert pwmb test signal , */\ + { 0x51e0, "inverta"}, /* invert pwma test signal , */\ + { 0x51f0, "bypass_ctrlloop"}, /* bypass_ctrlloop bypasses the control loop of the amplifier, */\ + { 0x5210, "test_rdsona"}, /* tbd for rdson testing , */\ + { 0x5220, "test_rdsonb"}, /* tbd for rdson testing , */\ + { 0x5230, "test_rdsonbst"}, /* tbd for rdson testing , */\ + { 0x5240, "test_cvia"}, /* tbd for rdson testing , */\ + { 0x5250, "test_cvib"}, /* tbd for rdson testing , */\ + { 0x5260, "test_cvibst"}, /* tbd for rdson testing , */\ + { 0x5306, "digimuxa_sel"}, /* DigimuxA input selection control (see Digimux list for details), */\ + { 0x5376, "digimuxb_sel"}, /* DigimuxB input selection control (see Digimux list for details), */\ + { 0x5400, "hs_mode"}, /* hs_mode, high speed mode I2C bus , */\ + { 0x5412, "test_parametric_io"}, /* test_parametric_io for testing pads , */\ + { 0x5440, "enbl_ringo"}, /* enbl_ringo, for test purpose to check with ringo , */\ + { 0x5456, "digimuxc_sel"}, /* DigimuxC input selection control (see Digimux list for details), */\ + { 0x54c0, "dio_ehs"}, /* Slew control for DIO in output mode , */\ + { 0x54d0, "gainio_ehs"}, /* Slew control for GAINIO in output mode , */\ + { 0x550d, "enbl_amp"}, /* enbl_amp for testing to enable all analoge blocks in amplifier, */\ + { 0x5600, "use_direct_ctrls"}, /* use_direct_ctrls, to overrule several functions direct for testing, */\ + { 0x5610, "rst_datapath"}, /* rst_datapath, datapath reset , */\ + { 0x5620, "rst_cgu"}, /* rst_cgu, cgu reset , */\ + { 0x5637, "enbl_ref"}, /* for testing to enable all analoge blocks in references, */\ + { 0x56b0, "enbl_engage"}, /* Enable output stage amplifier , */\ + { 0x56c0, "use_direct_clk_ctrl"}, /* use_direct_clk_ctrl, to overrule several functions direct for testing, */\ + { 0x56d0, "use_direct_pll_ctrl"}, /* use_direct_pll_ctrl, to overrule several functions direct for testing, */\ + { 0x56e0, "use_direct_ctrls_2"}, /* use_direct_sourseamp_ctrls, to overrule several functions direct for testing, */\ + { 0x5707, "anamux"}, /* Anamux control , */\ + { 0x57c0, "ocptest"}, /* ctrl_ocptest, deactivates the over current protection in the power stages of the amplifier. The ocp flag signals stay active., */\ + { 0x57e0, "otptest"}, /* otptest, test mode otp amplifier , */\ + { 0x57f0, "reverse"}, /* 1: Normal mode, slope is controlled , */\ + { 0x5813, "pll_selr"}, /* pll_selr , */\ + { 0x5854, "pll_selp"}, /* pll_selp , */\ + { 0x58a5, "pll_seli"}, /* pll_seli , */\ + { 0x5950, "pll_mdec_msb"}, /* most significant bits of pll_mdec[16] , */\ + { 0x5960, "pll_ndec_msb"}, /* most significant bits of pll_ndec[9] , */\ + { 0x5970, "pll_frm"}, /* pll_frm , */\ + { 0x5980, "pll_directi"}, /* pll_directi , */\ + { 0x5990, "pll_directo"}, /* pll_directo , */\ + { 0x59a0, "enbl_pll"}, /* enbl_pll , */\ + { 0x59f0, "pll_bypass"}, /* pll_bypass , */\ + { 0x5a0f, "tsig_freq"}, /* tsig_freq, internal sinus test generator, frequency control, */\ + { 0x5b02, "tsig_freq_msb"}, /* select internal sinus test generator, frequency control msb bits, */\ + { 0x5b30, "inject_tsig"}, /* inject_tsig, control bit to switch to internal sinus test generator, */\ + { 0x5b44, "adc10_prog_sample"}, /* control ADC10 , */\ + { 0x5c0f, "pll_mdec"}, /* bits 15..0 of pll_mdec[16;0] , */\ + { 0x5d06, "pll_pdec"}, /* pll_pdec , */\ + { 0x5d78, "pll_ndec"}, /* bits 8..0 of pll_ndec[9;0] , */\ + { 0x6007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0x6185, "mtp_ecc_tcin"}, /* Mtp_ecc_tcin , */\ + { 0x6203, "mtp_man_address_in"}, /* address from I2C regs for writing one word single mtp, */\ + { 0x6260, "mtp_ecc_eeb"}, /* enable code bit generation (active low!) , */\ + { 0x6270, "mtp_ecc_ecb"}, /* enable correction signal (active low!) , */\ + { 0x6280, "man_copy_mtp_to_iic"}, /* start copying single word from mtp to i2cregs_mtp , */\ + { 0x6290, "man_copy_iic_to_mtp"}, /* start copying single word from i2cregs_mtp to mtp [Key 1 protected], */\ + { 0x62a0, "auto_copy_mtp_to_iic"}, /* start copying all the data from mtp to i2cregs_mtp, */\ + { 0x62b0, "auto_copy_iic_to_mtp"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ + { 0x62d2, "mtp_speed_mode"}, /* Speed mode , */\ + { 0x6340, "mtp_direct_enable"}, /* mtp_direct_enable (key1 protected) , */\ + { 0x6350, "mtp_direct_wr"}, /* mtp_direct_wr (key1 protected) , */\ + { 0x6360, "mtp_direct_rd"}, /* mtp_direct_rd (key1 protected) , */\ + { 0x6370, "mtp_direct_rst"}, /* mtp_direct_rst (key1 protected) , */\ + { 0x6380, "mtp_direct_ers"}, /* mtp_direct_ers (key1 protected) , */\ + { 0x6390, "mtp_direct_prg"}, /* mtp_direct_prg (key1 protected) , */\ + { 0x63a0, "mtp_direct_epp"}, /* mtp_direct_epp (key1 protected) , */\ + { 0x63b4, "mtp_direct_test"}, /* mtp_direct_test (key1 protected) , */\ + { 0x640f, "mtp_man_data_in"}, /* single word to be written to MTP (manual copy) , */\ + { 0x7000, "cf_rst_dsp"}, /* Reset CoolFlux DSP , */\ + { 0x7011, "cf_dmem"}, /* Target memory for access , */\ + { 0x7030, "cf_aif"}, /* Autoincrement-flag for memory-address , */\ + { 0x7040, "cf_int"}, /* Interrupt CoolFlux DSP , */\ + { 0x7087, "cf_req"}, /* request for access (8 channels) , */\ + { 0x710f, "cf_madd"}, /* memory-address to be accessed , */\ + { 0x720f, "cf_mema"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ + { 0x7307, "cf_err"}, /* Coolflux error flags , */\ + { 0x7387, "cf_ack"}, /* acknowledge of requests (8 channels) , */\ + { 0x8000, "calibration_onetime"}, /* Calibration schedule (key2 protected) , */\ + { 0x8010, "calibr_ron_done"}, /* (key2 protected) , */\ + { 0x8105, "calibr_vout_offset"}, /* calibr_vout_offset (DCDCoffset) 2's compliment (key1 protected), */\ + { 0x8163, "calibr_delta_gain"}, /* delta gain for vamp (alpha) 2's compliment (key1 protected), */\ + { 0x81a5, "calibr_offs_amp"}, /* offset for vamp (Ampoffset) 2's compliment (key1 protected), */\ + { 0x8207, "calibr_gain_cs"}, /* gain current sense (Imeasalpha) 2's compliment (key1 protected), */\ + { 0x8284, "calibr_temp_offset"}, /* temperature offset 2's compliment (key1 protected), */\ + { 0x82d2, "calibr_temp_gain"}, /* temperature gain 2's compliment (key1 protected) , */\ + { 0x830f, "calibr_ron"}, /* Ron resistance of coil (key1 protected) , */\ + { 0x8505, "type_bits_HW"}, /* Key1_Protected_MTP5 , */\ + { 0x8601, "type_bits_1_0_SW"}, /* MTP-control SW , */\ + { 0x8681, "type_bits_8_9_SW"}, /* MTP-control SW , */\ + { 0x870f, "type_bits2_SW"}, /* MTP-control SW2 , */\ + { 0x8806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0x8870, "htol_iic_addr_en"}, /* HTOL_I2C_Address_Enable , */\ + { 0x8881, "ctrl_ovp_response"}, /* OVP response control , */\ + { 0x88a0, "disable_ovp_alarm_state"}, /* OVP alarm state control , */\ + { 0x88b0, "enbl_stretch_ovp"}, /* OVP alram strech control , */\ + { 0x88c0, "cf_debug_mode"}, /* Coolflux debug mode , */\ + { 0x8a0f, "production_data1"}, /* (key1 protected) , */\ + { 0x8b0f, "production_data2"}, /* (key1 protected) , */\ + { 0x8c0f, "production_data3"}, /* (key1 protected) , */\ + { 0x8d0f, "production_data4"}, /* (key1 protected) , */\ + { 0x8e0f, "production_data5"}, /* (key1 protected) , */\ + { 0x8f0f, "production_data6"}, /* (key1 protected) , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa1_irq { + tfa1_irq_vdds = 0, + tfa1_irq_plls = 1, + tfa1_irq_ds = 2, + tfa1_irq_vds = 3, + tfa1_irq_uvds = 4, + tfa1_irq_cds = 5, + tfa1_irq_clks = 6, + tfa1_irq_clips = 7, + tfa1_irq_mtpb = 8, + tfa1_irq_clk = 9, + tfa1_irq_spks = 10, + tfa1_irq_acs = 11, + tfa1_irq_sws = 12, + tfa1_irq_wds = 13, + tfa1_irq_amps = 14, + tfa1_irq_arefs = 15, + tfa1_irq_ack = 32, + tfa1_irq_max = 33, + tfa1_irq_all = -1 /* all irqs */}; + +#define TFA1_IRQ_NAMETABLE static tfaIrqName_t Tfa1IrqNames[] = {\ + { 0, "VDDS"},\ + { 1, "PLLS"},\ + { 2, "DS"},\ + { 3, "VDS"},\ + { 4, "UVDS"},\ + { 5, "CDS"},\ + { 6, "CLKS"},\ + { 7, "CLIPS"},\ + { 8, "MTPB"},\ + { 9, "CLK"},\ + { 10, "SPKS"},\ + { 11, "ACS"},\ + { 12, "SWS"},\ + { 13, "WDS"},\ + { 14, "AMPS"},\ + { 15, "AREFS"},\ + { 16, "16"},\ + { 17, "17"},\ + { 18, "18"},\ + { 19, "19"},\ + { 20, "20"},\ + { 21, "21"},\ + { 22, "22"},\ + { 23, "23"},\ + { 24, "24"},\ + { 25, "25"},\ + { 26, "26"},\ + { 27, "27"},\ + { 28, "28"},\ + { 29, "29"},\ + { 30, "30"},\ + { 31, "31"},\ + { 32, "ACK"},\ + { 33, "33"},\ +}; diff --git a/inc/tfa2_tfafieldnames_N1C.h b/inc/tfa2_tfafieldnames_N1C.h new file mode 100644 index 000000000000..8272eddd28d6 --- /dev/null +++ b/inc/tfa2_tfafieldnames_N1C.h @@ -0,0 +1,1533 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: Tfa98xx_TfaFieldnames.h + * This file was generated automatically on 09/01/15 at 09:40:28. + * Source file: TFA9888_N1C_I2C_regmap_V1.xlsx + */ +#define TFA9888_I2CVERSION 18 +typedef enum Tfa2BfEnumList { + TFA2_BF_PWDN = 0x0000, /*!< Powerdown selection */ + TFA2_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ + TFA2_BF_CFE = 0x0020, /*!< Enable CoolFlux */ + TFA2_BF_AMPE = 0x0030, /*!< Activate Amplifier */ + TFA2_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ + TFA2_BF_SBSL = 0x0050, /*!< Coolflux configured */ + TFA2_BF_AMPC = 0x0060, /*!< CoolFlux controls amplifier */ + TFA2_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA2_BF_FSSSEL = 0x0091, /*!< Audio sample reference */ + TFA2_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ + TFA2_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ + TFA2_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ + TFA2_BF_MANSCONF = 0x0120, /*!< I2C configured */ + TFA2_BF_MANCOLD = 0x0130, /*!< Execute cold start */ + TFA2_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ + TFA2_BF_MANROBOD = 0x0150, /*!< Reaction on BOD */ + TFA2_BF_BODE = 0x0160, /*!< BOD Enable */ + TFA2_BF_BODHYS = 0x0170, /*!< BOD Hysteresis */ + TFA2_BF_BODFILT = 0x0181, /*!< BOD filter */ + TFA2_BF_BODTHLVL = 0x01a1, /*!< BOD threshold */ + TFA2_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ + TFA2_BF_RCVNS = 0x01e0, /*!< Noise shaper selection */ + TFA2_BF_MANWDE = 0x01f0, /*!< Watchdog manager reaction */ + TFA2_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ + TFA2_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA2_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ + TFA2_BF_BYPHVBF = 0x02b0, /*!< Bypass HVBAT filter */ + TFA2_BF_LDOBYP = 0x02c0, /*!< Receiver LDO bypass */ + TFA2_BF_REV = 0x030f, /*!< Revision info */ + TFA2_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ + TFA2_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ + TFA2_BF_SSLEFTE = 0x0500, /*!< Enable left channel */ + TFA2_BF_SSRIGHTE = 0x0510, /*!< Enable right channel */ + TFA2_BF_VSLEFTE = 0x0520, /*!< Voltage sense left */ + TFA2_BF_VSRIGHTE = 0x0530, /*!< Voltage sense right */ + TFA2_BF_CSLEFTE = 0x0540, /*!< Current sense left */ + TFA2_BF_CSRIGHTE = 0x0550, /*!< Current sense right */ + TFA2_BF_SSPDME = 0x0560, /*!< Sub-system PDM */ + TFA2_BF_STGAIN = 0x0d18, /*!< Side tone gain */ + TFA2_BF_PDMSMUTE = 0x0da0, /*!< Side tone soft mute */ + TFA2_BF_SWVSTEP = 0x0e06, /*!< Register for the host SW to record the current active vstep */ + TFA2_BF_VDDS = 0x1000, /*!< POR */ + TFA2_BF_PLLS = 0x1010, /*!< PLL lock */ + TFA2_BF_OTDS = 0x1020, /*!< OTP alarm */ + TFA2_BF_OVDS = 0x1030, /*!< OVP alarm */ + TFA2_BF_UVDS = 0x1040, /*!< UVP alarm */ + TFA2_BF_CLKS = 0x1050, /*!< Clocks stable */ + TFA2_BF_MTPB = 0x1060, /*!< MTP busy */ + TFA2_BF_NOCLK = 0x1070, /*!< Lost clock */ + TFA2_BF_SPKS = 0x1080, /*!< Speaker error */ + TFA2_BF_ACS = 0x1090, /*!< Cold Start */ + TFA2_BF_SWS = 0x10a0, /*!< Amplifier engage */ + TFA2_BF_WDS = 0x10b0, /*!< Watchdog */ + TFA2_BF_AMPS = 0x10c0, /*!< Amplifier enable */ + TFA2_BF_AREFS = 0x10d0, /*!< References enable */ + TFA2_BF_ADCCR = 0x10e0, /*!< Control ADC */ + TFA2_BF_BODNOK = 0x10f0, /*!< BOD */ + TFA2_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA2_BF_DCDCA = 0x1110, /*!< DCDC active */ + TFA2_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos */ + TFA2_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ + TFA2_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ + TFA2_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ + TFA2_BF_STMUTEB = 0x1170, /*!< side tone (un)mute busy */ + TFA2_BF_STMUTE = 0x1180, /*!< side tone mute state */ + TFA2_BF_TDMLUTER = 0x1190, /*!< TDM LUT error */ + TFA2_BF_TDMSTAT = 0x11a2, /*!< TDM status bits */ + TFA2_BF_TDMERR = 0x11d0, /*!< TDM error */ + TFA2_BF_HAPTIC = 0x11e0, /*!< Status haptic driver */ + TFA2_BF_OCPOAPL = 0x1200, /*!< OCPOK pmos A left */ + TFA2_BF_OCPOANL = 0x1210, /*!< OCPOK nmos A left */ + TFA2_BF_OCPOBPL = 0x1220, /*!< OCPOK pmos B left */ + TFA2_BF_OCPOBNL = 0x1230, /*!< OCPOK nmos B left */ + TFA2_BF_CLIPAHL = 0x1240, /*!< Clipping A left to Vddp */ + TFA2_BF_CLIPALL = 0x1250, /*!< Clipping A left to gnd */ + TFA2_BF_CLIPBHL = 0x1260, /*!< Clipping B left to Vddp */ + TFA2_BF_CLIPBLL = 0x1270, /*!< Clipping B left to gnd */ + TFA2_BF_OCPOAPRC = 0x1280, /*!< OCPOK pmos A RCV */ + TFA2_BF_OCPOANRC = 0x1290, /*!< OCPOK nmos A RCV */ + TFA2_BF_OCPOBPRC = 0x12a0, /*!< OCPOK pmos B RCV */ + TFA2_BF_OCPOBNRC = 0x12b0, /*!< OCPOK nmos B RCV */ + TFA2_BF_RCVLDOR = 0x12c0, /*!< RCV LDO regulates */ + TFA2_BF_RCVLDOBR = 0x12d0, /*!< Receiver LDO ready */ + TFA2_BF_OCDSL = 0x12e0, /*!< OCP left amplifier */ + TFA2_BF_CLIPSL = 0x12f0, /*!< Amplifier left clipping */ + TFA2_BF_OCPOAPR = 0x1300, /*!< OCPOK pmos A right */ + TFA2_BF_OCPOANR = 0x1310, /*!< OCPOK nmos A right */ + TFA2_BF_OCPOBPR = 0x1320, /*!< OCPOK pmos B right */ + TFA2_BF_OCPOBNR = 0x1330, /*!< OCPOK nmos B right */ + TFA2_BF_CLIPAHR = 0x1340, /*!< Clipping A right to Vddp */ + TFA2_BF_CLIPALR = 0x1350, /*!< Clipping A right to gnd */ + TFA2_BF_CLIPBHR = 0x1360, /*!< Clipping B left to Vddp */ + TFA2_BF_CLIPBLR = 0x1370, /*!< Clipping B right to gnd */ + TFA2_BF_OCDSR = 0x1380, /*!< OCP right amplifier */ + TFA2_BF_CLIPSR = 0x1390, /*!< Amplifier right clipping */ + TFA2_BF_OCPOKMC = 0x13a0, /*!< OCPOK MICVDD */ + TFA2_BF_MANALARM = 0x13b0, /*!< Alarm state */ + TFA2_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ + TFA2_BF_MANWAIT2 = 0x13d0, /*!< Wait CF config */ + TFA2_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ + TFA2_BF_MANOPER = 0x13f0, /*!< Operating state */ + TFA2_BF_SPKSL = 0x1400, /*!< Left speaker status */ + TFA2_BF_SPKSR = 0x1410, /*!< Right speaker status */ + TFA2_BF_CLKOOR = 0x1420, /*!< External clock status */ + TFA2_BF_MANSTATE = 0x1433, /*!< Device manager status */ + TFA2_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA2_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA2_BF_TDMUC = 0x2003, /*!< Usecase setting */ + TFA2_BF_TDME = 0x2040, /*!< Enable interface */ + TFA2_BF_TDMMODE = 0x2050, /*!< Slave/master */ + TFA2_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ + TFA2_BF_TDMFSLN = 0x2073, /*!< FS length (master mode only) */ + TFA2_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ + TFA2_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ + TFA2_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ + TFA2_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ + TFA2_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ + TFA2_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ + TFA2_BF_TDMADJ = 0x21f0, /*!< data adjustment */ + TFA2_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ + TFA2_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ + TFA2_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ + TFA2_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots GAINIO */ + TFA2_BF_TDMTXUS1 = 0x22b1, /*!< Format unused slots DIO1 */ + TFA2_BF_TDMTXUS2 = 0x22d1, /*!< Format unused slots DIO2 */ + TFA2_BF_TDMLE = 0x2310, /*!< Control audio left */ + TFA2_BF_TDMRE = 0x2320, /*!< Control audio right */ + TFA2_BF_TDMVSRE = 0x2340, /*!< Control voltage sense right */ + TFA2_BF_TDMCSRE = 0x2350, /*!< Control current sense right */ + TFA2_BF_TDMVSLE = 0x2360, /*!< Voltage sense left control */ + TFA2_BF_TDMCSLE = 0x2370, /*!< Current sense left control */ + TFA2_BF_TDMCFRE = 0x2380, /*!< DSP out right control */ + TFA2_BF_TDMCFLE = 0x2390, /*!< DSP out left control */ + TFA2_BF_TDMCF3E = 0x23a0, /*!< AEC ref left control */ + TFA2_BF_TDMCF4E = 0x23b0, /*!< AEC ref right control */ + TFA2_BF_TDMPD1E = 0x23c0, /*!< PDM 1 control */ + TFA2_BF_TDMPD2E = 0x23d0, /*!< PDM 2 control */ + TFA2_BF_TDMLIO = 0x2421, /*!< IO audio left */ + TFA2_BF_TDMRIO = 0x2441, /*!< IO audio right */ + TFA2_BF_TDMVSRIO = 0x2481, /*!< IO voltage sense right */ + TFA2_BF_TDMCSRIO = 0x24a1, /*!< IO current sense right */ + TFA2_BF_TDMVSLIO = 0x24c1, /*!< IO voltage sense left */ + TFA2_BF_TDMCSLIO = 0x24e1, /*!< IO current sense left */ + TFA2_BF_TDMCFRIO = 0x2501, /*!< IO dspout right */ + TFA2_BF_TDMCFLIO = 0x2521, /*!< IO dspout left */ + TFA2_BF_TDMCF3IO = 0x2541, /*!< IO AEC ref left control */ + TFA2_BF_TDMCF4IO = 0x2561, /*!< IO AEC ref right control */ + TFA2_BF_TDMPD1IO = 0x2581, /*!< IO pdm1 */ + TFA2_BF_TDMPD2IO = 0x25a1, /*!< IO pdm2 */ + TFA2_BF_TDMLS = 0x2643, /*!< Position audio left */ + TFA2_BF_TDMRS = 0x2683, /*!< Position audio right */ + TFA2_BF_TDMVSRS = 0x2703, /*!< Position voltage sense right */ + TFA2_BF_TDMCSRS = 0x2743, /*!< Position current sense right */ + TFA2_BF_TDMVSLS = 0x2783, /*!< Position voltage sense left */ + TFA2_BF_TDMCSLS = 0x27c3, /*!< Position current sense left */ + TFA2_BF_TDMCFRS = 0x2803, /*!< Position dspout right */ + TFA2_BF_TDMCFLS = 0x2843, /*!< Position dspout left */ + TFA2_BF_TDMCF3S = 0x2883, /*!< Position AEC ref left control */ + TFA2_BF_TDMCF4S = 0x28c3, /*!< Position AEC ref right control */ + TFA2_BF_TDMPD1S = 0x2903, /*!< Position pdm1 */ + TFA2_BF_TDMPD2S = 0x2943, /*!< Position pdm2 */ + TFA2_BF_PDMSM = 0x3100, /*!< PDM control */ + TFA2_BF_PDMSTSEL = 0x3111, /*!< Side tone input */ + TFA2_BF_PDMLSEL = 0x3130, /*!< PDM data selection for left channel during PDM direct mode */ + TFA2_BF_PDMRSEL = 0x3140, /*!< PDM data selection for right channel during PDM direct mode */ + TFA2_BF_MICVDDE = 0x3150, /*!< Enable MICVDD */ + TFA2_BF_PDMCLRAT = 0x3201, /*!< PDM BCK/Fs ratio */ + TFA2_BF_PDMGAIN = 0x3223, /*!< PDM gain */ + TFA2_BF_PDMOSEL = 0x3263, /*!< PDM output selection - RE/FE data combination */ + TFA2_BF_SELCFHAPD = 0x32a0, /*!< Select the source for haptic data output (not for customer) */ + TFA2_BF_HAPTIME = 0x3307, /*!< Duration (ms) */ + TFA2_BF_HAPLEVEL = 0x3387, /*!< DC value (FFS) */ + TFA2_BF_GPIODIN = 0x3403, /*!< Receiving value */ + TFA2_BF_GPIOCTRL = 0x3500, /*!< GPIO master control over GPIO1/2 ports (not for customer) */ + TFA2_BF_GPIOCONF = 0x3513, /*!< Configuration */ + TFA2_BF_GPIODOUT = 0x3553, /*!< Transmitting value */ + TFA2_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA2_BF_ISTPLLS = 0x4010, /*!< Status PLL lock */ + TFA2_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA2_BF_ISTOVDS = 0x4030, /*!< Status OVP alarm */ + TFA2_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA2_BF_ISTCLKS = 0x4050, /*!< Status clocks stable */ + TFA2_BF_ISTMTPB = 0x4060, /*!< Status MTP busy */ + TFA2_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA2_BF_ISTSPKS = 0x4080, /*!< Status speaker error */ + TFA2_BF_ISTACS = 0x4090, /*!< Status cold start */ + TFA2_BF_ISTSWS = 0x40a0, /*!< Status amplifier engage */ + TFA2_BF_ISTWDS = 0x40b0, /*!< Status watchdog */ + TFA2_BF_ISTAMPS = 0x40c0, /*!< Status amplifier enable */ + TFA2_BF_ISTAREFS = 0x40d0, /*!< Status Ref enable */ + TFA2_BF_ISTADCCR = 0x40e0, /*!< Status Control ADC */ + TFA2_BF_ISTBODNOK = 0x40f0, /*!< Status BOD */ + TFA2_BF_ISTBSTCU = 0x4100, /*!< Status DCDC current limiting */ + TFA2_BF_ISTBSTHI = 0x4110, /*!< Status DCDC active */ + TFA2_BF_ISTBSTOC = 0x4120, /*!< Status DCDC OCP */ + TFA2_BF_ISTBSTPKCUR = 0x4130, /*!< Status bst peakcur */ + TFA2_BF_ISTBSTVC = 0x4140, /*!< Status DCDC level 1x */ + TFA2_BF_ISTBST86 = 0x4150, /*!< Status DCDC level 1.14x */ + TFA2_BF_ISTBST93 = 0x4160, /*!< Status DCDC level 1.07x */ + TFA2_BF_ISTRCVLD = 0x4170, /*!< Status rcvldop ready */ + TFA2_BF_ISTOCPL = 0x4180, /*!< Status ocp alarm left */ + TFA2_BF_ISTOCPR = 0x4190, /*!< Status ocp alarm right */ + TFA2_BF_ISTMWSRC = 0x41a0, /*!< Status Waits HW I2C settings */ + TFA2_BF_ISTMWCFC = 0x41b0, /*!< Status waits CF config */ + TFA2_BF_ISTMWSMU = 0x41c0, /*!< Status Audio mute sequence */ + TFA2_BF_ISTCFMER = 0x41d0, /*!< Status cfma error */ + TFA2_BF_ISTCFMAC = 0x41e0, /*!< Status cfma ack */ + TFA2_BF_ISTCLKOOR = 0x41f0, /*!< Status flag_clk_out_of_range */ + TFA2_BF_ISTTDMER = 0x4200, /*!< Status tdm error */ + TFA2_BF_ISTCLPL = 0x4210, /*!< Status clip left */ + TFA2_BF_ISTCLPR = 0x4220, /*!< Status clip right */ + TFA2_BF_ISTOCPM = 0x4230, /*!< Status mic ocpok */ + TFA2_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA2_BF_ICLPLLS = 0x4410, /*!< Clear PLL lock */ + TFA2_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA2_BF_ICLOVDS = 0x4430, /*!< Clear OVP alarm */ + TFA2_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA2_BF_ICLCLKS = 0x4450, /*!< Clear clocks stable */ + TFA2_BF_ICLMTPB = 0x4460, /*!< Clear mtp busy */ + TFA2_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA2_BF_ICLSPKS = 0x4480, /*!< Clear speaker error */ + TFA2_BF_ICLACS = 0x4490, /*!< Clear cold started */ + TFA2_BF_ICLSWS = 0x44a0, /*!< Clear amplifier engage */ + TFA2_BF_ICLWDS = 0x44b0, /*!< Clear watchdog */ + TFA2_BF_ICLAMPS = 0x44c0, /*!< Clear enbl amp */ + TFA2_BF_ICLAREFS = 0x44d0, /*!< Clear ref enable */ + TFA2_BF_ICLADCCR = 0x44e0, /*!< Clear control ADC */ + TFA2_BF_ICLBODNOK = 0x44f0, /*!< Clear BOD */ + TFA2_BF_ICLBSTCU = 0x4500, /*!< Clear DCDC current limiting */ + TFA2_BF_ICLBSTHI = 0x4510, /*!< Clear DCDC active */ + TFA2_BF_ICLBSTOC = 0x4520, /*!< Clear DCDC OCP */ + TFA2_BF_ICLBSTPC = 0x4530, /*!< Clear bst peakcur */ + TFA2_BF_ICLBSTVC = 0x4540, /*!< Clear DCDC level 1x */ + TFA2_BF_ICLBST86 = 0x4550, /*!< Clear DCDC level 1.14x */ + TFA2_BF_ICLBST93 = 0x4560, /*!< Clear DCDC level 1.07x */ + TFA2_BF_ICLRCVLD = 0x4570, /*!< Clear rcvldop ready */ + TFA2_BF_ICLOCPL = 0x4580, /*!< Clear ocp alarm left */ + TFA2_BF_ICLOCPR = 0x4590, /*!< Clear ocp alarm right */ + TFA2_BF_ICLMWSRC = 0x45a0, /*!< Clear wait HW I2C settings */ + TFA2_BF_ICLMWCFC = 0x45b0, /*!< Clear wait cf config */ + TFA2_BF_ICLMWSMU = 0x45c0, /*!< Clear audio mute sequence */ + TFA2_BF_ICLCFMER = 0x45d0, /*!< Clear cfma err */ + TFA2_BF_ICLCFMAC = 0x45e0, /*!< Clear cfma ack */ + TFA2_BF_ICLCLKOOR = 0x45f0, /*!< Clear flag_clk_out_of_range */ + TFA2_BF_ICLTDMER = 0x4600, /*!< Clear tdm error */ + TFA2_BF_ICLCLPL = 0x4610, /*!< Clear clip left */ + TFA2_BF_ICLCLPR = 0x4620, /*!< Clear clip right */ + TFA2_BF_ICLOCPM = 0x4630, /*!< Clear mic ocpok */ + TFA2_BF_IEVDDS = 0x4800, /*!< Enable por */ + TFA2_BF_IEPLLS = 0x4810, /*!< Enable pll lock */ + TFA2_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA2_BF_IEOVDS = 0x4830, /*!< Enable OVP alarm */ + TFA2_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA2_BF_IECLKS = 0x4850, /*!< Enable clocks stable */ + TFA2_BF_IEMTPB = 0x4860, /*!< Enable mtp busy */ + TFA2_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA2_BF_IESPKS = 0x4880, /*!< Enable speaker error */ + TFA2_BF_IEACS = 0x4890, /*!< Enable cold started */ + TFA2_BF_IESWS = 0x48a0, /*!< Enable amplifier engage */ + TFA2_BF_IEWDS = 0x48b0, /*!< Enable watchdog */ + TFA2_BF_IEAMPS = 0x48c0, /*!< Enable enbl amp */ + TFA2_BF_IEAREFS = 0x48d0, /*!< Enable ref enable */ + TFA2_BF_IEADCCR = 0x48e0, /*!< Enable Control ADC */ + TFA2_BF_IEBODNOK = 0x48f0, /*!< Enable BOD */ + TFA2_BF_IEBSTCU = 0x4900, /*!< Enable DCDC current limiting */ + TFA2_BF_IEBSTHI = 0x4910, /*!< Enable DCDC active */ + TFA2_BF_IEBSTOC = 0x4920, /*!< Enable DCDC OCP */ + TFA2_BF_IEBSTPC = 0x4930, /*!< Enable bst peakcur */ + TFA2_BF_IEBSTVC = 0x4940, /*!< Enable DCDC level 1x */ + TFA2_BF_IEBST86 = 0x4950, /*!< Enable DCDC level 1.14x */ + TFA2_BF_IEBST93 = 0x4960, /*!< Enable DCDC level 1.07x */ + TFA2_BF_IERCVLD = 0x4970, /*!< Enable rcvldop ready */ + TFA2_BF_IEOCPL = 0x4980, /*!< Enable ocp alarm left */ + TFA2_BF_IEOCPR = 0x4990, /*!< Enable ocp alarm right */ + TFA2_BF_IEMWSRC = 0x49a0, /*!< Enable waits HW I2C settings */ + TFA2_BF_IEMWCFC = 0x49b0, /*!< Enable man wait cf config */ + TFA2_BF_IEMWSMU = 0x49c0, /*!< Enable man Audio mute sequence */ + TFA2_BF_IECFMER = 0x49d0, /*!< Enable cfma err */ + TFA2_BF_IECFMAC = 0x49e0, /*!< Enable cfma ack */ + TFA2_BF_IECLKOOR = 0x49f0, /*!< Enable flag_clk_out_of_range */ + TFA2_BF_IETDMER = 0x4a00, /*!< Enable tdm error */ + TFA2_BF_IECLPL = 0x4a10, /*!< Enable clip left */ + TFA2_BF_IECLPR = 0x4a20, /*!< Enable clip right */ + TFA2_BF_IEOCPM1 = 0x4a30, /*!< Enable mic ocpok */ + TFA2_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ + TFA2_BF_IPOPLLS = 0x4c10, /*!< Polarity pll lock */ + TFA2_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA2_BF_IPOOVDS = 0x4c30, /*!< Polarity OVP alarm */ + TFA2_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA2_BF_IPOCLKS = 0x4c50, /*!< Polarity clocks stable */ + TFA2_BF_IPOMTPB = 0x4c60, /*!< Polarity mtp busy */ + TFA2_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA2_BF_IPOSPKS = 0x4c80, /*!< Polarity speaker error */ + TFA2_BF_IPOACS = 0x4c90, /*!< Polarity cold started */ + TFA2_BF_IPOSWS = 0x4ca0, /*!< Polarity amplifier engage */ + TFA2_BF_IPOWDS = 0x4cb0, /*!< Polarity watchdog */ + TFA2_BF_IPOAMPS = 0x4cc0, /*!< Polarity enbl amp */ + TFA2_BF_IPOAREFS = 0x4cd0, /*!< Polarity ref enable */ + TFA2_BF_IPOADCCR = 0x4ce0, /*!< Polarity Control ADC */ + TFA2_BF_IPOBODNOK = 0x4cf0, /*!< Polarity BOD */ + TFA2_BF_IPOBSTCU = 0x4d00, /*!< Polarity DCDC current limiting */ + TFA2_BF_IPOBSTHI = 0x4d10, /*!< Polarity DCDC active */ + TFA2_BF_IPOBSTOC = 0x4d20, /*!< Polarity DCDC OCP */ + TFA2_BF_IPOBSTPC = 0x4d30, /*!< Polarity bst peakcur */ + TFA2_BF_IPOBSTVC = 0x4d40, /*!< Polarity DCDC level 1x */ + TFA2_BF_IPOBST86 = 0x4d50, /*!< Polarity DCDC level 1.14x */ + TFA2_BF_IPOBST93 = 0x4d60, /*!< Polarity DCDC level 1.07x */ + TFA2_BF_IPORCVLD = 0x4d70, /*!< Polarity rcvldop ready */ + TFA2_BF_IPOOCPL = 0x4d80, /*!< Polarity ocp alarm left */ + TFA2_BF_IPOOCPR = 0x4d90, /*!< Polarity ocp alarm right */ + TFA2_BF_IPOMWSRC = 0x4da0, /*!< Polarity waits HW I2C settings */ + TFA2_BF_IPOMWCFC = 0x4db0, /*!< Polarity man wait cf config */ + TFA2_BF_IPOMWSMU = 0x4dc0, /*!< Polarity man audio mute sequence */ + TFA2_BF_IPOCFMER = 0x4dd0, /*!< Polarity cfma err */ + TFA2_BF_IPOCFMAC = 0x4de0, /*!< Polarity cfma ack */ + TFA2_BF_IPCLKOOR = 0x4df0, /*!< Polarity flag_clk_out_of_range */ + TFA2_BF_IPOTDMER = 0x4e00, /*!< Polarity tdm error */ + TFA2_BF_IPOCLPL = 0x4e10, /*!< Polarity clip left */ + TFA2_BF_IPOCLPR = 0x4e20, /*!< Polarity clip right */ + TFA2_BF_IPOOCPM = 0x4e30, /*!< Polarity mic ocpok */ + TFA2_BF_BSSCR = 0x5001, /*!< Battery protection attack Time */ + TFA2_BF_BSST = 0x5023, /*!< Battery protection threshold voltage level */ + TFA2_BF_BSSRL = 0x5061, /*!< Battery protection maximum reduction */ + TFA2_BF_BSSRR = 0x5082, /*!< Battery protection release time */ + TFA2_BF_BSSHY = 0x50b1, /*!< Battery protection hysteresis */ + TFA2_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA2_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ + TFA2_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ + TFA2_BF_INTSMUTE = 0x5110, /*!< Soft mute HW */ + TFA2_BF_CFSML = 0x5120, /*!< Soft mute FW left */ + TFA2_BF_CFSMR = 0x5130, /*!< Soft mute FW right */ + TFA2_BF_HPFBYPL = 0x5140, /*!< Bypass HPF left */ + TFA2_BF_HPFBYPR = 0x5150, /*!< Bypass HPF right */ + TFA2_BF_DPSAL = 0x5160, /*!< Enable DPSA left */ + TFA2_BF_DPSAR = 0x5170, /*!< Enable DPSA right */ + TFA2_BF_VOL = 0x5187, /*!< FW volume control for primary audio channel */ + TFA2_BF_HNDSFRCV = 0x5200, /*!< Selection receiver */ + TFA2_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ + TFA2_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ + TFA2_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ + TFA2_BF_SLOPESET = 0x52e1, /*!< Set slope */ + TFA2_BF_VOLSEC = 0x5a07, /*!< FW volume control for secondary audio channel */ + TFA2_BF_SWPROFIL = 0x5a87, /*!< Software profile data */ + TFA2_BF_DCVO = 0x7002, /*!< Boost voltage */ + TFA2_BF_DCMCC = 0x7033, /*!< Max coil current */ + TFA2_BF_DCCV = 0x7071, /*!< Coil Value */ + TFA2_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ + TFA2_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ + TFA2_BF_DCSYNCP = 0x70b2, /*!< DCDC synchronization off + 7 positions */ + TFA2_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ + TFA2_BF_RST = 0x9000, /*!< Reset */ + TFA2_BF_DMEM = 0x9011, /*!< Target memory */ + TFA2_BF_AIF = 0x9030, /*!< Auto increment */ + TFA2_BF_CFINT = 0x9040, /*!< Interrupt - auto clear */ + TFA2_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ + TFA2_BF_REQ = 0x9087, /*!< request for access (8 channels) */ + TFA2_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ + TFA2_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ + TFA2_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ + TFA2_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ + TFA2_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ + TFA2_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ + TFA2_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ + TFA2_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ + TFA2_BF_MADD = 0x910f, /*!< Memory address */ + TFA2_BF_MEMA = 0x920f, /*!< Activate memory access */ + TFA2_BF_ERR = 0x9307, /*!< Error flags */ + TFA2_BF_ACK = 0x9387, /*!< Acknowledge of requests */ + TFA2_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ + TFA2_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ + TFA2_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ + TFA2_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ + TFA2_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ + TFA2_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ + TFA2_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ + TFA2_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ + TFA2_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ + TFA2_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA2_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA2_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ + TFA2_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA2_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA2_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA2_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA2_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA2_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA2_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA2_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA2_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA2_BF_R25CL = 0xf40f, /*!< Ron resistance of left channel speaker coil */ + TFA2_BF_R25CR = 0xf50f, /*!< Ron resistance of right channel speaker coil */ +} Tfa2BfEnumList_t; +#define TFA2_NAMETABLE static tfaBfName_t Tfa2DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown selection , */\ + { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ + { 0x20, "CFE"}, /* Enable CoolFlux , */\ + { 0x30, "AMPE"}, /* Activate Amplifier , */\ + { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ + { 0x50, "SBSL"}, /* Coolflux configured , */\ + { 0x60, "AMPC"}, /* CoolFlux controls amplifier , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0x91, "FSSSEL"}, /* Audio sample reference , */\ + { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xc0, "TSTOCP"}, /* OCP testing control , */\ + { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ + { 0x120, "MANSCONF"}, /* I2C configured , */\ + { 0x130, "MANCOLD"}, /* Execute cold start , */\ + { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ + { 0x150, "MANROBOD"}, /* Reaction on BOD , */\ + { 0x160, "BODE"}, /* BOD Enable , */\ + { 0x170, "BODHYS"}, /* BOD Hysteresis , */\ + { 0x181, "BODFILT"}, /* BOD filter , */\ + { 0x1a1, "BODTHLVL"}, /* BOD threshold , */\ + { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1e0, "RCVNS"}, /* Noise shaper selection , */\ + { 0x1f0, "MANWDE"}, /* Watchdog manager reaction , */\ + { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ + { 0x2b0, "BYPHVBF"}, /* Bypass HVBAT filter , */\ + { 0x2c0, "LDOBYP"}, /* Receiver LDO bypass , */\ + { 0x30f, "REV"}, /* Revision info , */\ + { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ + { 0x500, "SSLEFTE"}, /* Enable left channel , */\ + { 0x510, "SSRIGHTE"}, /* Enable right channel , */\ + { 0x520, "VSLEFTE"}, /* Voltage sense left , */\ + { 0x530, "VSRIGHTE"}, /* Voltage sense right , */\ + { 0x540, "CSLEFTE"}, /* Current sense left , */\ + { 0x550, "CSRIGHTE"}, /* Current sense right , */\ + { 0x560, "SSPDME"}, /* Sub-system PDM , */\ + { 0xd18, "STGAIN"}, /* Side tone gain , */\ + { 0xda0, "PDMSMUTE"}, /* Side tone soft mute , */\ + { 0xe06, "SWVSTEP"}, /* Register for the host SW to record the current active vstep, */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "PLLS"}, /* PLL lock , */\ + { 0x1020, "OTDS"}, /* OTP alarm , */\ + { 0x1030, "OVDS"}, /* OVP alarm , */\ + { 0x1040, "UVDS"}, /* UVP alarm , */\ + { 0x1050, "CLKS"}, /* Clocks stable , */\ + { 0x1060, "MTPB"}, /* MTP busy , */\ + { 0x1070, "NOCLK"}, /* Lost clock , */\ + { 0x1080, "SPKS"}, /* Speaker error , */\ + { 0x1090, "ACS"}, /* Cold Start , */\ + { 0x10a0, "SWS"}, /* Amplifier engage , */\ + { 0x10b0, "WDS"}, /* Watchdog , */\ + { 0x10c0, "AMPS"}, /* Amplifier enable , */\ + { 0x10d0, "AREFS"}, /* References enable , */\ + { 0x10e0, "ADCCR"}, /* Control ADC , */\ + { 0x10f0, "BODNOK"}, /* BOD , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active , */\ + { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos , */\ + { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1170, "STMUTEB"}, /* side tone (un)mute busy , */\ + { 0x1180, "STMUTE"}, /* side tone mute state , */\ + { 0x1190, "TDMLUTER"}, /* TDM LUT error , */\ + { 0x11a2, "TDMSTAT"}, /* TDM status bits , */\ + { 0x11d0, "TDMERR"}, /* TDM error , */\ + { 0x11e0, "HAPTIC"}, /* Status haptic driver , */\ + { 0x1200, "OCPOAPL"}, /* OCPOK pmos A left , */\ + { 0x1210, "OCPOANL"}, /* OCPOK nmos A left , */\ + { 0x1220, "OCPOBPL"}, /* OCPOK pmos B left , */\ + { 0x1230, "OCPOBNL"}, /* OCPOK nmos B left , */\ + { 0x1240, "CLIPAHL"}, /* Clipping A left to Vddp , */\ + { 0x1250, "CLIPALL"}, /* Clipping A left to gnd , */\ + { 0x1260, "CLIPBHL"}, /* Clipping B left to Vddp , */\ + { 0x1270, "CLIPBLL"}, /* Clipping B left to gnd , */\ + { 0x1280, "OCPOAPRC"}, /* OCPOK pmos A RCV , */\ + { 0x1290, "OCPOANRC"}, /* OCPOK nmos A RCV , */\ + { 0x12a0, "OCPOBPRC"}, /* OCPOK pmos B RCV , */\ + { 0x12b0, "OCPOBNRC"}, /* OCPOK nmos B RCV , */\ + { 0x12c0, "RCVLDOR"}, /* RCV LDO regulates , */\ + { 0x12d0, "RCVLDOBR"}, /* Receiver LDO ready , */\ + { 0x12e0, "OCDSL"}, /* OCP left amplifier , */\ + { 0x12f0, "CLIPSL"}, /* Amplifier left clipping , */\ + { 0x1300, "OCPOAPR"}, /* OCPOK pmos A right , */\ + { 0x1310, "OCPOANR"}, /* OCPOK nmos A right , */\ + { 0x1320, "OCPOBPR"}, /* OCPOK pmos B right , */\ + { 0x1330, "OCPOBNR"}, /* OCPOK nmos B right , */\ + { 0x1340, "CLIPAHR"}, /* Clipping A right to Vddp , */\ + { 0x1350, "CLIPALR"}, /* Clipping A right to gnd , */\ + { 0x1360, "CLIPBHR"}, /* Clipping B left to Vddp , */\ + { 0x1370, "CLIPBLR"}, /* Clipping B right to gnd , */\ + { 0x1380, "OCDSR"}, /* OCP right amplifier , */\ + { 0x1390, "CLIPSR"}, /* Amplifier right clipping , */\ + { 0x13a0, "OCPOKMC"}, /* OCPOK MICVDD , */\ + { 0x13b0, "MANALARM"}, /* Alarm state , */\ + { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ + { 0x13d0, "MANWAIT2"}, /* Wait CF config , */\ + { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x13f0, "MANOPER"}, /* Operating state , */\ + { 0x1400, "SPKSL"}, /* Left speaker status , */\ + { 0x1410, "SPKSR"}, /* Right speaker status , */\ + { 0x1420, "CLKOOR"}, /* External clock status , */\ + { 0x1433, "MANSTATE"}, /* Device manager status , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x2003, "TDMUC"}, /* Usecase setting , */\ + { 0x2040, "TDME"}, /* Enable interface , */\ + { 0x2050, "TDMMODE"}, /* Slave/master , */\ + { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2073, "TDMFSLN"}, /* FS length (master mode only) , */\ + { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ + { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ + { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ + { 0x21f0, "TDMADJ"}, /* data adjustment , */\ + { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x2291, "TDMTXUS0"}, /* Format unused slots GAINIO , */\ + { 0x22b1, "TDMTXUS1"}, /* Format unused slots DIO1 , */\ + { 0x22d1, "TDMTXUS2"}, /* Format unused slots DIO2 , */\ + { 0x2310, "TDMLE"}, /* Control audio left , */\ + { 0x2320, "TDMRE"}, /* Control audio right , */\ + { 0x2340, "TDMVSRE"}, /* Control voltage sense right , */\ + { 0x2350, "TDMCSRE"}, /* Control current sense right , */\ + { 0x2360, "TDMVSLE"}, /* Voltage sense left control , */\ + { 0x2370, "TDMCSLE"}, /* Current sense left control , */\ + { 0x2380, "TDMCFRE"}, /* DSP out right control , */\ + { 0x2390, "TDMCFLE"}, /* DSP out left control , */\ + { 0x23a0, "TDMCF3E"}, /* AEC ref left control , */\ + { 0x23b0, "TDMCF4E"}, /* AEC ref right control , */\ + { 0x23c0, "TDMPD1E"}, /* PDM 1 control , */\ + { 0x23d0, "TDMPD2E"}, /* PDM 2 control , */\ + { 0x2421, "TDMLIO"}, /* IO audio left , */\ + { 0x2441, "TDMRIO"}, /* IO audio right , */\ + { 0x2481, "TDMVSRIO"}, /* IO voltage sense right , */\ + { 0x24a1, "TDMCSRIO"}, /* IO current sense right , */\ + { 0x24c1, "TDMVSLIO"}, /* IO voltage sense left , */\ + { 0x24e1, "TDMCSLIO"}, /* IO current sense left , */\ + { 0x2501, "TDMCFRIO"}, /* IO dspout right , */\ + { 0x2521, "TDMCFLIO"}, /* IO dspout left , */\ + { 0x2541, "TDMCF3IO"}, /* IO AEC ref left control , */\ + { 0x2561, "TDMCF4IO"}, /* IO AEC ref right control , */\ + { 0x2581, "TDMPD1IO"}, /* IO pdm1 , */\ + { 0x25a1, "TDMPD2IO"}, /* IO pdm2 , */\ + { 0x2643, "TDMLS"}, /* Position audio left , */\ + { 0x2683, "TDMRS"}, /* Position audio right , */\ + { 0x2703, "TDMVSRS"}, /* Position voltage sense right , */\ + { 0x2743, "TDMCSRS"}, /* Position current sense right , */\ + { 0x2783, "TDMVSLS"}, /* Position voltage sense left , */\ + { 0x27c3, "TDMCSLS"}, /* Position current sense left , */\ + { 0x2803, "TDMCFRS"}, /* Position dspout right , */\ + { 0x2843, "TDMCFLS"}, /* Position dspout left , */\ + { 0x2883, "TDMCF3S"}, /* Position AEC ref left control , */\ + { 0x28c3, "TDMCF4S"}, /* Position AEC ref right control , */\ + { 0x2903, "TDMPD1S"}, /* Position pdm1 , */\ + { 0x2943, "TDMPD2S"}, /* Position pdm2 , */\ + { 0x3100, "PDMSM"}, /* PDM control , */\ + { 0x3111, "PDMSTSEL"}, /* Side tone input , */\ + { 0x3130, "PDMLSEL"}, /* PDM data selection for left channel during PDM direct mode, */\ + { 0x3140, "PDMRSEL"}, /* PDM data selection for right channel during PDM direct mode, */\ + { 0x3150, "MICVDDE"}, /* Enable MICVDD , */\ + { 0x3201, "PDMCLRAT"}, /* PDM BCK/Fs ratio , */\ + { 0x3223, "PDMGAIN"}, /* PDM gain , */\ + { 0x3263, "PDMOSEL"}, /* PDM output selection - RE/FE data combination , */\ + { 0x32a0, "SELCFHAPD"}, /* Select the source for haptic data output (not for customer), */\ + { 0x3307, "HAPTIME"}, /* Duration (ms) , */\ + { 0x3387, "HAPLEVEL"}, /* DC value (FFS) , */\ + { 0x3403, "GPIODIN"}, /* Receiving value , */\ + { 0x3500, "GPIOCTRL"}, /* GPIO master control over GPIO1/2 ports (not for customer), */\ + { 0x3513, "GPIOCONF"}, /* Configuration , */\ + { 0x3553, "GPIODOUT"}, /* Transmitting value , */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTPLLS"}, /* Status PLL lock , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOVDS"}, /* Status OVP alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTCLKS"}, /* Status clocks stable , */\ + { 0x4060, "ISTMTPB"}, /* Status MTP busy , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4080, "ISTSPKS"}, /* Status speaker error , */\ + { 0x4090, "ISTACS"}, /* Status cold start , */\ + { 0x40a0, "ISTSWS"}, /* Status amplifier engage , */\ + { 0x40b0, "ISTWDS"}, /* Status watchdog , */\ + { 0x40c0, "ISTAMPS"}, /* Status amplifier enable , */\ + { 0x40d0, "ISTAREFS"}, /* Status Ref enable , */\ + { 0x40e0, "ISTADCCR"}, /* Status Control ADC , */\ + { 0x40f0, "ISTBODNOK"}, /* Status BOD , */\ + { 0x4100, "ISTBSTCU"}, /* Status DCDC current limiting , */\ + { 0x4110, "ISTBSTHI"}, /* Status DCDC active , */\ + { 0x4120, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4130, "ISTBSTPKCUR"}, /* Status bst peakcur , */\ + { 0x4140, "ISTBSTVC"}, /* Status DCDC level 1x , */\ + { 0x4150, "ISTBST86"}, /* Status DCDC level 1.14x , */\ + { 0x4160, "ISTBST93"}, /* Status DCDC level 1.07x , */\ + { 0x4170, "ISTRCVLD"}, /* Status rcvldop ready , */\ + { 0x4180, "ISTOCPL"}, /* Status ocp alarm left , */\ + { 0x4190, "ISTOCPR"}, /* Status ocp alarm right , */\ + { 0x41a0, "ISTMWSRC"}, /* Status Waits HW I2C settings , */\ + { 0x41b0, "ISTMWCFC"}, /* Status waits CF config , */\ + { 0x41c0, "ISTMWSMU"}, /* Status Audio mute sequence , */\ + { 0x41d0, "ISTCFMER"}, /* Status cfma error , */\ + { 0x41e0, "ISTCFMAC"}, /* Status cfma ack , */\ + { 0x41f0, "ISTCLKOOR"}, /* Status flag_clk_out_of_range , */\ + { 0x4200, "ISTTDMER"}, /* Status tdm error , */\ + { 0x4210, "ISTCLPL"}, /* Status clip left , */\ + { 0x4220, "ISTCLPR"}, /* Status clip right , */\ + { 0x4230, "ISTOCPM"}, /* Status mic ocpok , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLPLLS"}, /* Clear PLL lock , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOVDS"}, /* Clear OVP alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLCLKS"}, /* Clear clocks stable , */\ + { 0x4460, "ICLMTPB"}, /* Clear mtp busy , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4480, "ICLSPKS"}, /* Clear speaker error , */\ + { 0x4490, "ICLACS"}, /* Clear cold started , */\ + { 0x44a0, "ICLSWS"}, /* Clear amplifier engage , */\ + { 0x44b0, "ICLWDS"}, /* Clear watchdog , */\ + { 0x44c0, "ICLAMPS"}, /* Clear enbl amp , */\ + { 0x44d0, "ICLAREFS"}, /* Clear ref enable , */\ + { 0x44e0, "ICLADCCR"}, /* Clear control ADC , */\ + { 0x44f0, "ICLBODNOK"}, /* Clear BOD , */\ + { 0x4500, "ICLBSTCU"}, /* Clear DCDC current limiting , */\ + { 0x4510, "ICLBSTHI"}, /* Clear DCDC active , */\ + { 0x4520, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4530, "ICLBSTPC"}, /* Clear bst peakcur , */\ + { 0x4540, "ICLBSTVC"}, /* Clear DCDC level 1x , */\ + { 0x4550, "ICLBST86"}, /* Clear DCDC level 1.14x , */\ + { 0x4560, "ICLBST93"}, /* Clear DCDC level 1.07x , */\ + { 0x4570, "ICLRCVLD"}, /* Clear rcvldop ready , */\ + { 0x4580, "ICLOCPL"}, /* Clear ocp alarm left , */\ + { 0x4590, "ICLOCPR"}, /* Clear ocp alarm right , */\ + { 0x45a0, "ICLMWSRC"}, /* Clear wait HW I2C settings , */\ + { 0x45b0, "ICLMWCFC"}, /* Clear wait cf config , */\ + { 0x45c0, "ICLMWSMU"}, /* Clear audio mute sequence , */\ + { 0x45d0, "ICLCFMER"}, /* Clear cfma err , */\ + { 0x45e0, "ICLCFMAC"}, /* Clear cfma ack , */\ + { 0x45f0, "ICLCLKOOR"}, /* Clear flag_clk_out_of_range , */\ + { 0x4600, "ICLTDMER"}, /* Clear tdm error , */\ + { 0x4610, "ICLCLPL"}, /* Clear clip left , */\ + { 0x4620, "ICLCLPR"}, /* Clear clip right , */\ + { 0x4630, "ICLOCPM"}, /* Clear mic ocpok , */\ + { 0x4800, "IEVDDS"}, /* Enable por , */\ + { 0x4810, "IEPLLS"}, /* Enable pll lock , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOVDS"}, /* Enable OVP alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IECLKS"}, /* Enable clocks stable , */\ + { 0x4860, "IEMTPB"}, /* Enable mtp busy , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4880, "IESPKS"}, /* Enable speaker error , */\ + { 0x4890, "IEACS"}, /* Enable cold started , */\ + { 0x48a0, "IESWS"}, /* Enable amplifier engage , */\ + { 0x48b0, "IEWDS"}, /* Enable watchdog , */\ + { 0x48c0, "IEAMPS"}, /* Enable enbl amp , */\ + { 0x48d0, "IEAREFS"}, /* Enable ref enable , */\ + { 0x48e0, "IEADCCR"}, /* Enable Control ADC , */\ + { 0x48f0, "IEBODNOK"}, /* Enable BOD , */\ + { 0x4900, "IEBSTCU"}, /* Enable DCDC current limiting , */\ + { 0x4910, "IEBSTHI"}, /* Enable DCDC active , */\ + { 0x4920, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4930, "IEBSTPC"}, /* Enable bst peakcur , */\ + { 0x4940, "IEBSTVC"}, /* Enable DCDC level 1x , */\ + { 0x4950, "IEBST86"}, /* Enable DCDC level 1.14x , */\ + { 0x4960, "IEBST93"}, /* Enable DCDC level 1.07x , */\ + { 0x4970, "IERCVLD"}, /* Enable rcvldop ready , */\ + { 0x4980, "IEOCPL"}, /* Enable ocp alarm left , */\ + { 0x4990, "IEOCPR"}, /* Enable ocp alarm right , */\ + { 0x49a0, "IEMWSRC"}, /* Enable waits HW I2C settings , */\ + { 0x49b0, "IEMWCFC"}, /* Enable man wait cf config , */\ + { 0x49c0, "IEMWSMU"}, /* Enable man Audio mute sequence , */\ + { 0x49d0, "IECFMER"}, /* Enable cfma err , */\ + { 0x49e0, "IECFMAC"}, /* Enable cfma ack , */\ + { 0x49f0, "IECLKOOR"}, /* Enable flag_clk_out_of_range , */\ + { 0x4a00, "IETDMER"}, /* Enable tdm error , */\ + { 0x4a10, "IECLPL"}, /* Enable clip left , */\ + { 0x4a20, "IECLPR"}, /* Enable clip right , */\ + { 0x4a30, "IEOCPM1"}, /* Enable mic ocpok , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ + { 0x4c10, "IPOPLLS"}, /* Polarity pll lock , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOVDS"}, /* Polarity OVP alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOCLKS"}, /* Polarity clocks stable , */\ + { 0x4c60, "IPOMTPB"}, /* Polarity mtp busy , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x4c80, "IPOSPKS"}, /* Polarity speaker error , */\ + { 0x4c90, "IPOACS"}, /* Polarity cold started , */\ + { 0x4ca0, "IPOSWS"}, /* Polarity amplifier engage , */\ + { 0x4cb0, "IPOWDS"}, /* Polarity watchdog , */\ + { 0x4cc0, "IPOAMPS"}, /* Polarity enbl amp , */\ + { 0x4cd0, "IPOAREFS"}, /* Polarity ref enable , */\ + { 0x4ce0, "IPOADCCR"}, /* Polarity Control ADC , */\ + { 0x4cf0, "IPOBODNOK"}, /* Polarity BOD , */\ + { 0x4d00, "IPOBSTCU"}, /* Polarity DCDC current limiting , */\ + { 0x4d10, "IPOBSTHI"}, /* Polarity DCDC active , */\ + { 0x4d20, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4d30, "IPOBSTPC"}, /* Polarity bst peakcur , */\ + { 0x4d40, "IPOBSTVC"}, /* Polarity DCDC level 1x , */\ + { 0x4d50, "IPOBST86"}, /* Polarity DCDC level 1.14x , */\ + { 0x4d60, "IPOBST93"}, /* Polarity DCDC level 1.07x , */\ + { 0x4d70, "IPORCVLD"}, /* Polarity rcvldop ready , */\ + { 0x4d80, "IPOOCPL"}, /* Polarity ocp alarm left , */\ + { 0x4d90, "IPOOCPR"}, /* Polarity ocp alarm right , */\ + { 0x4da0, "IPOMWSRC"}, /* Polarity waits HW I2C settings , */\ + { 0x4db0, "IPOMWCFC"}, /* Polarity man wait cf config , */\ + { 0x4dc0, "IPOMWSMU"}, /* Polarity man audio mute sequence , */\ + { 0x4dd0, "IPOCFMER"}, /* Polarity cfma err , */\ + { 0x4de0, "IPOCFMAC"}, /* Polarity cfma ack , */\ + { 0x4df0, "IPCLKOOR"}, /* Polarity flag_clk_out_of_range , */\ + { 0x4e00, "IPOTDMER"}, /* Polarity tdm error , */\ + { 0x4e10, "IPOCLPL"}, /* Polarity clip left , */\ + { 0x4e20, "IPOCLPR"}, /* Polarity clip right , */\ + { 0x4e30, "IPOOCPM"}, /* Polarity mic ocpok , */\ + { 0x5001, "BSSCR"}, /* Battery protection attack Time , */\ + { 0x5023, "BSST"}, /* Battery protection threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery protection maximum reduction , */\ + { 0x5082, "BSSRR"}, /* Battery protection release time , */\ + { 0x50b1, "BSSHY"}, /* Battery protection hysteresis , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ + { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ + { 0x5110, "INTSMUTE"}, /* Soft mute HW , */\ + { 0x5120, "CFSML"}, /* Soft mute FW left , */\ + { 0x5130, "CFSMR"}, /* Soft mute FW right , */\ + { 0x5140, "HPFBYPL"}, /* Bypass HPF left , */\ + { 0x5150, "HPFBYPR"}, /* Bypass HPF right , */\ + { 0x5160, "DPSAL"}, /* Enable DPSA left , */\ + { 0x5170, "DPSAR"}, /* Enable DPSA right , */\ + { 0x5187, "VOL"}, /* FW volume control for primary audio channel , */\ + { 0x5200, "HNDSFRCV"}, /* Selection receiver , */\ + { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ + { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ + { 0x52e1, "SLOPESET"}, /* Set slope , */\ + { 0x5a07, "VOLSEC"}, /* FW volume control for secondary audio channel , */\ + { 0x5a87, "SWPROFIL"}, /* Software profile data , */\ + { 0x7002, "DCVO"}, /* Boost voltage , */\ + { 0x7033, "DCMCC"}, /* Max coil current , */\ + { 0x7071, "DCCV"}, /* Coil Value , */\ + { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ + { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ + { 0x70b2, "DCSYNCP"}, /* DCDC synchronization off + 7 positions , */\ + { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ + { 0x9000, "RST"}, /* Reset , */\ + { 0x9011, "DMEM"}, /* Target memory , */\ + { 0x9030, "AIF"}, /* Auto increment , */\ + { 0x9040, "CFINT"}, /* Interrupt - auto clear , */\ + { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ + { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ + { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ + { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ + { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ + { 0x910f, "MADD"}, /* Memory address , */\ + { 0x920f, "MEMA"}, /* Activate memory access , */\ + { 0x9307, "ERR"}, /* Error flags , */\ + { 0x9387, "ACK"}, /* Acknowledge of requests , */\ + { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ + { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf40f, "R25CL"}, /* Ron resistance of left channel speaker coil , */\ + { 0xf50f, "R25CR"}, /* Ron resistance of right channel speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA2_BITNAMETABLE static tfaBfName_t Tfa2BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown selection , */\ + { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ + { 0x20, "enbl_coolflux"}, /* Enable CoolFlux , */\ + { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ + { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ + { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ + { 0x60, "sel_enbl_amplifier"}, /* CoolFlux controls amplifier , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0x91, "fs_pulse_sel"}, /* Audio sample reference , */\ + { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xc0, "test_ocp"}, /* OCP testing control , */\ + { 0x101, "vamp_sel"}, /* Amplifier input selection , */\ + { 0x120, "src_set_configured"}, /* I2C configured , */\ + { 0x130, "execute_cold_start"}, /* Execute cold start , */\ + { 0x140, "enbl_osc1m_auto_off"}, /* Internal osc off at PWDN , */\ + { 0x150, "man_enbl_brown_out"}, /* Reaction on BOD , */\ + { 0x160, "enbl_bod"}, /* BOD Enable , */\ + { 0x170, "enbl_bod_hyst"}, /* BOD Hysteresis , */\ + { 0x181, "bod_delay"}, /* BOD filter , */\ + { 0x1a1, "bod_lvlsel"}, /* BOD threshold , */\ + { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x1e0, "pwm_sel_rcv_ns"}, /* Noise shaper selection , */\ + { 0x1f0, "man_enbl_watchdog"}, /* Watchdog manager reaction , */\ + { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ + { 0x2b0, "bypass_hvbat_filter"}, /* Bypass HVBAT filter , */\ + { 0x2c0, "ctrl_rcvldop_bypass"}, /* Receiver LDO bypass , */\ + { 0x30f, "device_rev"}, /* Revision info , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ + { 0x500, "enbl_spkr_ss_left"}, /* Enable left channel , */\ + { 0x510, "enbl_spkr_ss_right"}, /* Enable right channel , */\ + { 0x520, "enbl_volsense_left"}, /* Voltage sense left , */\ + { 0x530, "enbl_volsense_right"}, /* Voltage sense right , */\ + { 0x540, "enbl_cursense_left"}, /* Current sense left , */\ + { 0x550, "enbl_cursense_right"}, /* Current sense right , */\ + { 0x560, "enbl_pdm_ss"}, /* Sub-system PDM , */\ + { 0xd00, "side_tone_gain_sel"}, /* PDM side tone gain selector , */\ + { 0xd18, "side_tone_gain"}, /* Side tone gain , */\ + { 0xda0, "mute_side_tone"}, /* Side tone soft mute , */\ + { 0xe06, "ctrl_digtoana"}, /* Register for the host SW to record the current active vstep, */\ + { 0xe70, "enbl_cmfb_left"}, /* Current sense common mode feedback control for left channel, */\ + { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_pll_lock"}, /* PLL lock , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm , */\ + { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ + { 0x1050, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1060, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1070, "flag_lost_clk"}, /* Lost clock , */\ + { 0x1080, "flag_cf_speakererror"}, /* Speaker error , */\ + { 0x1090, "flag_cold_started"}, /* Cold Start , */\ + { 0x10a0, "flag_engage"}, /* Amplifier engage , */\ + { 0x10b0, "flag_watchdog_reset"}, /* Watchdog , */\ + { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ + { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x10f0, "flag_bod_vddd_nok"}, /* BOD , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active , */\ + { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos , */\ + { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1170, "flag_soft_mute_busy"}, /* side tone (un)mute busy , */\ + { 0x1180, "flag_soft_mute_state"}, /* side tone mute state , */\ + { 0x1190, "flag_tdm_lut_error"}, /* TDM LUT error , */\ + { 0x11a2, "flag_tdm_status"}, /* TDM status bits , */\ + { 0x11d0, "flag_tdm_error"}, /* TDM error , */\ + { 0x11e0, "flag_haptic_busy"}, /* Status haptic driver , */\ + { 0x1200, "flag_ocpokap_left"}, /* OCPOK pmos A left , */\ + { 0x1210, "flag_ocpokan_left"}, /* OCPOK nmos A left , */\ + { 0x1220, "flag_ocpokbp_left"}, /* OCPOK pmos B left , */\ + { 0x1230, "flag_ocpokbn_left"}, /* OCPOK nmos B left , */\ + { 0x1240, "flag_clipa_high_left"}, /* Clipping A left to Vddp , */\ + { 0x1250, "flag_clipa_low_left"}, /* Clipping A left to gnd , */\ + { 0x1260, "flag_clipb_high_left"}, /* Clipping B left to Vddp , */\ + { 0x1270, "flag_clipb_low_left"}, /* Clipping B left to gnd , */\ + { 0x1280, "flag_ocpokap_rcv"}, /* OCPOK pmos A RCV , */\ + { 0x1290, "flag_ocpokan_rcv"}, /* OCPOK nmos A RCV , */\ + { 0x12a0, "flag_ocpokbp_rcv"}, /* OCPOK pmos B RCV , */\ + { 0x12b0, "flag_ocpokbn_rcv"}, /* OCPOK nmos B RCV , */\ + { 0x12c0, "flag_rcvldop_ready"}, /* RCV LDO regulates , */\ + { 0x12d0, "flag_rcvldop_bypassready"}, /* Receiver LDO ready , */\ + { 0x12e0, "flag_ocp_alarm_left"}, /* OCP left amplifier , */\ + { 0x12f0, "flag_clip_left"}, /* Amplifier left clipping , */\ + { 0x1300, "flag_ocpokap_right"}, /* OCPOK pmos A right , */\ + { 0x1310, "flag_ocpokan_right"}, /* OCPOK nmos A right , */\ + { 0x1320, "flag_ocpokbp_right"}, /* OCPOK pmos B right , */\ + { 0x1330, "flag_ocpokbn_right"}, /* OCPOK nmos B right , */\ + { 0x1340, "flag_clipa_high_right"}, /* Clipping A right to Vddp , */\ + { 0x1350, "flag_clipa_low_right"}, /* Clipping A right to gnd , */\ + { 0x1360, "flag_clipb_high_right"}, /* Clipping B left to Vddp , */\ + { 0x1370, "flag_clipb_low_right"}, /* Clipping B right to gnd , */\ + { 0x1380, "flag_ocp_alarm_right"}, /* OCP right amplifier , */\ + { 0x1390, "flag_clip_right"}, /* Amplifier right clipping , */\ + { 0x13a0, "flag_mic_ocpok"}, /* OCPOK MICVDD , */\ + { 0x13b0, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ + { 0x13d0, "flag_man_wait_cf_config"}, /* Wait CF config , */\ + { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ + { 0x1400, "flag_cf_speakererror_left"}, /* Left speaker status , */\ + { 0x1410, "flag_cf_speakererror_right"}, /* Right speaker status , */\ + { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x1433, "man_state"}, /* Device manager status , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x2003, "tdm_usecase"}, /* Usecase setting , */\ + { 0x2040, "tdm_enable"}, /* Enable interface , */\ + { 0x2050, "tdm_mode"}, /* Slave/master , */\ + { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2073, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ + { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ + { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ + { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ + { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots GAINIO , */\ + { 0x22b1, "tdm_txdata_format_unused_slot_sd1"}, /* Format unused slots DIO1 , */\ + { 0x22d1, "tdm_txdata_format_unused_slot_sd2"}, /* Format unused slots DIO2 , */\ + { 0x2300, "tdm_sink0_enable"}, /* Control gainin (not used in DSP) , */\ + { 0x2310, "tdm_sink1_enable"}, /* Control audio left , */\ + { 0x2320, "tdm_sink2_enable"}, /* Control audio right , */\ + { 0x2330, "tdm_source0_enable"}, /* Control gainout (not used in DSP) , */\ + { 0x2340, "tdm_source1_enable"}, /* Control voltage sense right , */\ + { 0x2350, "tdm_source2_enable"}, /* Control current sense right , */\ + { 0x2360, "tdm_source3_enable"}, /* Voltage sense left control , */\ + { 0x2370, "tdm_source4_enable"}, /* Current sense left control , */\ + { 0x2380, "tdm_source5_enable"}, /* DSP out right control , */\ + { 0x2390, "tdm_source6_enable"}, /* DSP out left control , */\ + { 0x23a0, "tdm_source7_enable"}, /* AEC ref left control , */\ + { 0x23b0, "tdm_source8_enable"}, /* AEC ref right control , */\ + { 0x23c0, "tdm_source9_enable"}, /* PDM 1 control , */\ + { 0x23d0, "tdm_source10_enable"}, /* PDM 2 control , */\ + { 0x2401, "tdm_sink0_io"}, /* IO gainin (not used in DSP) , */\ + { 0x2421, "tdm_sink1_io"}, /* IO audio left , */\ + { 0x2441, "tdm_sink2_io"}, /* IO audio right , */\ + { 0x2461, "tdm_source0_io"}, /* IO gainout (not used in DSP) , */\ + { 0x2481, "tdm_source1_io"}, /* IO voltage sense right , */\ + { 0x24a1, "tdm_source2_io"}, /* IO current sense right , */\ + { 0x24c1, "tdm_source3_io"}, /* IO voltage sense left , */\ + { 0x24e1, "tdm_source4_io"}, /* IO current sense left , */\ + { 0x2501, "tdm_source5_io"}, /* IO dspout right , */\ + { 0x2521, "tdm_source6_io"}, /* IO dspout left , */\ + { 0x2541, "tdm_source7_io"}, /* IO AEC ref left control , */\ + { 0x2561, "tdm_source8_io"}, /* IO AEC ref right control , */\ + { 0x2581, "tdm_source9_io"}, /* IO pdm1 , */\ + { 0x25a1, "tdm_source10_io"}, /* IO pdm2 , */\ + { 0x2603, "tdm_sink0_slot"}, /* Position gainin (not used in DSP) , */\ + { 0x2643, "tdm_sink1_slot"}, /* Position audio left , */\ + { 0x2683, "tdm_sink2_slot"}, /* Position audio right , */\ + { 0x26c3, "tdm_source0_slot"}, /* Position gainout (not used in DSP) , */\ + { 0x2703, "tdm_source1_slot"}, /* Position voltage sense right , */\ + { 0x2743, "tdm_source2_slot"}, /* Position current sense right , */\ + { 0x2783, "tdm_source3_slot"}, /* Position voltage sense left , */\ + { 0x27c3, "tdm_source4_slot"}, /* Position current sense left , */\ + { 0x2803, "tdm_source5_slot"}, /* Position dspout right , */\ + { 0x2843, "tdm_source6_slot"}, /* Position dspout left , */\ + { 0x2883, "tdm_source7_slot"}, /* Position AEC ref left control , */\ + { 0x28c3, "tdm_source8_slot"}, /* Position AEC ref right control , */\ + { 0x2903, "tdm_source9_slot"}, /* Position pdm1 , */\ + { 0x2943, "tdm_source10_slot"}, /* Position pdm2 , */\ + { 0x3100, "pdm_mode"}, /* PDM control , */\ + { 0x3111, "pdm_side_tone_sel"}, /* Side tone input , */\ + { 0x3130, "pdm_left_sel"}, /* PDM data selection for left channel during PDM direct mode, */\ + { 0x3140, "pdm_right_sel"}, /* PDM data selection for right channel during PDM direct mode, */\ + { 0x3150, "enbl_micvdd"}, /* Enable MICVDD , */\ + { 0x3160, "bypass_micvdd_ocp"}, /* Bypass control for the MICVDD OCP flag processing , */\ + { 0x3201, "pdm_nbck"}, /* PDM BCK/Fs ratio , */\ + { 0x3223, "pdm_gain"}, /* PDM gain , */\ + { 0x3263, "sel_pdm_out_data"}, /* PDM output selection - RE/FE data combination , */\ + { 0x32a0, "sel_cf_haptic_data"}, /* Select the source for haptic data output (not for customer), */\ + { 0x3307, "haptic_duration"}, /* Duration (ms) , */\ + { 0x3387, "haptic_data"}, /* DC value (FFS) , */\ + { 0x3403, "gpio_datain"}, /* Receiving value , */\ + { 0x3500, "gpio_ctrl"}, /* GPIO master control over GPIO1/2 ports (not for customer), */\ + { 0x3513, "gpio_dir"}, /* Configuration , */\ + { 0x3553, "gpio_dataout"}, /* Transmitting value , */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_pll_lock"}, /* Status PLL lock , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ovpok"}, /* Status OVP alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_clocks_stable"}, /* Status clocks stable , */\ + { 0x4060, "int_out_flag_mtp_busy"}, /* Status MTP busy , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4080, "int_out_flag_cf_speakererror"}, /* Status speaker error , */\ + { 0x4090, "int_out_flag_cold_started"}, /* Status cold start , */\ + { 0x40a0, "int_out_flag_engage"}, /* Status amplifier engage , */\ + { 0x40b0, "int_out_flag_watchdog_reset"}, /* Status watchdog , */\ + { 0x40c0, "int_out_flag_enbl_amp"}, /* Status amplifier enable , */\ + { 0x40d0, "int_out_flag_enbl_ref"}, /* Status Ref enable , */\ + { 0x40e0, "int_out_flag_adc10_ready"}, /* Status Control ADC , */\ + { 0x40f0, "int_out_flag_bod_vddd_nok"}, /* Status BOD , */\ + { 0x4100, "int_out_flag_bst_bstcur"}, /* Status DCDC current limiting , */\ + { 0x4110, "int_out_flag_bst_hiz"}, /* Status DCDC active , */\ + { 0x4120, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4130, "int_out_flag_bst_peakcur"}, /* Status bst peakcur , */\ + { 0x4140, "int_out_flag_bst_voutcomp"}, /* Status DCDC level 1x , */\ + { 0x4150, "int_out_flag_bst_voutcomp86"}, /* Status DCDC level 1.14x , */\ + { 0x4160, "int_out_flag_bst_voutcomp93"}, /* Status DCDC level 1.07x , */\ + { 0x4170, "int_out_flag_rcvldop_ready"}, /* Status rcvldop ready , */\ + { 0x4180, "int_out_flag_ocp_alarm_left"}, /* Status ocp alarm left , */\ + { 0x4190, "int_out_flag_ocp_alarm_right"}, /* Status ocp alarm right , */\ + { 0x41a0, "int_out_flag_man_wait_src_settings"}, /* Status Waits HW I2C settings , */\ + { 0x41b0, "int_out_flag_man_wait_cf_config"}, /* Status waits CF config , */\ + { 0x41c0, "int_out_flag_man_start_mute_audio"}, /* Status Audio mute sequence , */\ + { 0x41d0, "int_out_flag_cfma_err"}, /* Status cfma error , */\ + { 0x41e0, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ + { 0x41f0, "int_out_flag_clk_out_of_range"}, /* Status flag_clk_out_of_range , */\ + { 0x4200, "int_out_flag_tdm_error"}, /* Status tdm error , */\ + { 0x4210, "int_out_flag_clip_left"}, /* Status clip left , */\ + { 0x4220, "int_out_flag_clip_right"}, /* Status clip right , */\ + { 0x4230, "int_out_flag_mic_ocpok"}, /* Status mic ocpok , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_pll_lock"}, /* Clear PLL lock , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ovpok"}, /* Clear OVP alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_clocks_stable"}, /* Clear clocks stable , */\ + { 0x4460, "int_in_flag_mtp_busy"}, /* Clear mtp busy , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4480, "int_in_flag_cf_speakererror"}, /* Clear speaker error , */\ + { 0x4490, "int_in_flag_cold_started"}, /* Clear cold started , */\ + { 0x44a0, "int_in_flag_engage"}, /* Clear amplifier engage , */\ + { 0x44b0, "int_in_flag_watchdog_reset"}, /* Clear watchdog , */\ + { 0x44c0, "int_in_flag_enbl_amp"}, /* Clear enbl amp , */\ + { 0x44d0, "int_in_flag_enbl_ref"}, /* Clear ref enable , */\ + { 0x44e0, "int_in_flag_adc10_ready"}, /* Clear control ADC , */\ + { 0x44f0, "int_in_flag_bod_vddd_nok"}, /* Clear BOD , */\ + { 0x4500, "int_in_flag_bst_bstcur"}, /* Clear DCDC current limiting , */\ + { 0x4510, "int_in_flag_bst_hiz"}, /* Clear DCDC active , */\ + { 0x4520, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4530, "int_in_flag_bst_peakcur"}, /* Clear bst peakcur , */\ + { 0x4540, "int_in_flag_bst_voutcomp"}, /* Clear DCDC level 1x , */\ + { 0x4550, "int_in_flag_bst_voutcomp86"}, /* Clear DCDC level 1.14x , */\ + { 0x4560, "int_in_flag_bst_voutcomp93"}, /* Clear DCDC level 1.07x , */\ + { 0x4570, "int_in_flag_rcvldop_ready"}, /* Clear rcvldop ready , */\ + { 0x4580, "int_in_flag_ocp_alarm_left"}, /* Clear ocp alarm left , */\ + { 0x4590, "int_in_flag_ocp_alarm_right"}, /* Clear ocp alarm right , */\ + { 0x45a0, "int_in_flag_man_wait_src_settings"}, /* Clear wait HW I2C settings , */\ + { 0x45b0, "int_in_flag_man_wait_cf_config"}, /* Clear wait cf config , */\ + { 0x45c0, "int_in_flag_man_start_mute_audio"}, /* Clear audio mute sequence , */\ + { 0x45d0, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ + { 0x45e0, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ + { 0x45f0, "int_in_flag_clk_out_of_range"}, /* Clear flag_clk_out_of_range , */\ + { 0x4600, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ + { 0x4610, "int_in_flag_clip_left"}, /* Clear clip left , */\ + { 0x4620, "int_in_flag_clip_right"}, /* Clear clip right , */\ + { 0x4630, "int_in_flag_mic_ocpok"}, /* Clear mic ocpok , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ + { 0x4810, "int_enable_flag_pll_lock"}, /* Enable pll lock , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ovpok"}, /* Enable OVP alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_clocks_stable"}, /* Enable clocks stable , */\ + { 0x4860, "int_enable_flag_mtp_busy"}, /* Enable mtp busy , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4880, "int_enable_flag_cf_speakererror"}, /* Enable speaker error , */\ + { 0x4890, "int_enable_flag_cold_started"}, /* Enable cold started , */\ + { 0x48a0, "int_enable_flag_engage"}, /* Enable amplifier engage , */\ + { 0x48b0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog , */\ + { 0x48c0, "int_enable_flag_enbl_amp"}, /* Enable enbl amp , */\ + { 0x48d0, "int_enable_flag_enbl_ref"}, /* Enable ref enable , */\ + { 0x48e0, "int_enable_flag_adc10_ready"}, /* Enable Control ADC , */\ + { 0x48f0, "int_enable_flag_bod_vddd_nok"}, /* Enable BOD , */\ + { 0x4900, "int_enable_flag_bst_bstcur"}, /* Enable DCDC current limiting , */\ + { 0x4910, "int_enable_flag_bst_hiz"}, /* Enable DCDC active , */\ + { 0x4920, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4930, "int_enable_flag_bst_peakcur"}, /* Enable bst peakcur , */\ + { 0x4940, "int_enable_flag_bst_voutcomp"}, /* Enable DCDC level 1x , */\ + { 0x4950, "int_enable_flag_bst_voutcomp86"}, /* Enable DCDC level 1.14x , */\ + { 0x4960, "int_enable_flag_bst_voutcomp93"}, /* Enable DCDC level 1.07x , */\ + { 0x4970, "int_enable_flag_rcvldop_ready"}, /* Enable rcvldop ready , */\ + { 0x4980, "int_enable_flag_ocp_alarm_left"}, /* Enable ocp alarm left , */\ + { 0x4990, "int_enable_flag_ocp_alarm_right"}, /* Enable ocp alarm right , */\ + { 0x49a0, "int_enable_flag_man_wait_src_settings"}, /* Enable waits HW I2C settings , */\ + { 0x49b0, "int_enable_flag_man_wait_cf_config"}, /* Enable man wait cf config , */\ + { 0x49c0, "int_enable_flag_man_start_mute_audio"}, /* Enable man Audio mute sequence , */\ + { 0x49d0, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ + { 0x49e0, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ + { 0x49f0, "int_enable_flag_clk_out_of_range"}, /* Enable flag_clk_out_of_range , */\ + { 0x4a00, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ + { 0x4a10, "int_enable_flag_clip_left"}, /* Enable clip left , */\ + { 0x4a20, "int_enable_flag_clip_right"}, /* Enable clip right , */\ + { 0x4a30, "int_enable_flag_mic_ocpok"}, /* Enable mic ocpok , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ + { 0x4c10, "int_polarity_flag_pll_lock"}, /* Polarity pll lock , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ovpok"}, /* Polarity OVP alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_clocks_stable"}, /* Polarity clocks stable , */\ + { 0x4c60, "int_polarity_flag_mtp_busy"}, /* Polarity mtp busy , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x4c80, "int_polarity_flag_cf_speakererror"}, /* Polarity speaker error , */\ + { 0x4c90, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ + { 0x4ca0, "int_polarity_flag_engage"}, /* Polarity amplifier engage , */\ + { 0x4cb0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog , */\ + { 0x4cc0, "int_polarity_flag_enbl_amp"}, /* Polarity enbl amp , */\ + { 0x4cd0, "int_polarity_flag_enbl_ref"}, /* Polarity ref enable , */\ + { 0x4ce0, "int_polarity_flag_adc10_ready"}, /* Polarity Control ADC , */\ + { 0x4cf0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity BOD , */\ + { 0x4d00, "int_polarity_flag_bst_bstcur"}, /* Polarity DCDC current limiting , */\ + { 0x4d10, "int_polarity_flag_bst_hiz"}, /* Polarity DCDC active , */\ + { 0x4d20, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4d30, "int_polarity_flag_bst_peakcur"}, /* Polarity bst peakcur , */\ + { 0x4d40, "int_polarity_flag_bst_voutcomp"}, /* Polarity DCDC level 1x , */\ + { 0x4d50, "int_polarity_flag_bst_voutcomp86"}, /* Polarity DCDC level 1.14x , */\ + { 0x4d60, "int_polarity_flag_bst_voutcomp93"}, /* Polarity DCDC level 1.07x , */\ + { 0x4d70, "int_polarity_flag_rcvldop_ready"}, /* Polarity rcvldop ready , */\ + { 0x4d80, "int_polarity_flag_ocp_alarm_left"}, /* Polarity ocp alarm left , */\ + { 0x4d90, "int_polarity_flag_ocp_alarm_right"}, /* Polarity ocp alarm right , */\ + { 0x4da0, "int_polarity_flag_man_wait_src_settings"}, /* Polarity waits HW I2C settings , */\ + { 0x4db0, "int_polarity_flag_man_wait_cf_config"}, /* Polarity man wait cf config , */\ + { 0x4dc0, "int_polarity_flag_man_start_mute_audio"}, /* Polarity man audio mute sequence , */\ + { 0x4dd0, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ + { 0x4de0, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ + { 0x4df0, "int_polarity_flag_clk_out_of_range"}, /* Polarity flag_clk_out_of_range , */\ + { 0x4e00, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ + { 0x4e10, "int_polarity_flag_clip_left"}, /* Polarity clip left , */\ + { 0x4e20, "int_polarity_flag_clip_right"}, /* Polarity clip right , */\ + { 0x4e30, "int_polarity_flag_mic_ocpok"}, /* Polarity mic ocpok , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery protection attack Time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery protection threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery protection maximum reduction , */\ + { 0x5082, "vbat_prot_release_time"}, /* Battery protection release time , */\ + { 0x50b1, "vbat_prot_hysterese"}, /* Battery protection hysteresis , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ + { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ + { 0x5110, "soft_mute"}, /* Soft mute HW , */\ + { 0x5120, "cf_mute_left"}, /* Soft mute FW left , */\ + { 0x5130, "cf_mute_right"}, /* Soft mute FW right , */\ + { 0x5140, "bypass_hp_left"}, /* Bypass HPF left , */\ + { 0x5150, "bypass_hp_right"}, /* Bypass HPF right , */\ + { 0x5160, "enbl_dpsa_left"}, /* Enable DPSA left , */\ + { 0x5170, "enbl_dpsa_right"}, /* Enable DPSA right , */\ + { 0x5187, "cf_volume"}, /* FW volume control for primary audio channel , */\ + { 0x5200, "ctrl_rcv"}, /* Selection receiver , */\ + { 0x5210, "ctrl_rcv_fb_100k"}, /* Selection of feedback resistor for receiver mode (not for customer), */\ + { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ + { 0x5257, "gain"}, /* Amplifier gain , */\ + { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x52e1, "ctrl_slope"}, /* Set slope , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ + { 0x5340, "clipfast"}, /* Clock selection for HW clipper for battery protection, */\ + { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ + { 0x5360, "enbl_low_latency"}, /* CF low latency outputs for add module , */\ + { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ + { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5420, "fb_hz"}, /* Feedback resistor set to high ohmic , */\ + { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ + { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5581, "dpsa_drive"}, /* Control of the number of power stage sections, total of 4 sections. Each section is 1/4 of the total power stages., */\ + { 0x560a, "enbl_amp_left"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually - Left channel, */\ + { 0x56b0, "enbl_engage_left"}, /* Enables/engage power stage and control loop - left channel, */\ + { 0x570a, "enbl_amp_right"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually - Right channel, */\ + { 0x57b0, "enbl_engage_right"}, /* Enables/engage power stage and control loop - right channel, */\ + { 0x5800, "hard_mute_left"}, /* Hard mute - PWM module left , */\ + { 0x5810, "hard_mute_right"}, /* Hard mute - PWM module right , */\ + { 0x5820, "pwm_shape"}, /* PWM shape , */\ + { 0x5830, "pwm_bitlength"}, /* PWM bit length in noise shaper , */\ + { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ + { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ + { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ + { 0x58b0, "enbl_pwm_phase_shift_left"}, /* Control for pwm phase shift, inverted function - left channel, */\ + { 0x58c0, "enbl_pwm_phase_shift_right"}, /* Control for pwm phase shift - right channel , */\ + { 0x5900, "ctrl_rcvldop_pulldown"}, /* Pulldown of LDO (2.7V) , */\ + { 0x5910, "ctrl_rcvldop_test_comp"}, /* Enable testing of LDO comparator , */\ + { 0x5920, "ctrl_rcvldop_test_loadedldo"}, /* Load connected to rcvldo , */\ + { 0x5930, "enbl_rcvldop"}, /* Enables the LDO (2.7) , */\ + { 0x5a07, "cf_volume_sec"}, /* FW volume control for secondary audio channel , */\ + { 0x5a87, "sw_profile"}, /* Software profile data , */\ + { 0x7002, "boost_volt"}, /* Boost voltage , */\ + { 0x7033, "boost_cur"}, /* Max coil current , */\ + { 0x7071, "bst_coil_value"}, /* Coil Value , */\ + { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x70b2, "dcdc_synchronisation"}, /* DCDC synchronization off + 7 positions , */\ + { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ + { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ + { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7332, "bst_freq"}, /* DCDC bost frequency control , */\ + { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ + { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ + { 0x8040, "cs_dc_offset"}, /* Current sense decimator offset control , */\ + { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8110, "invertpwm_left"}, /* Current sense common mode feedback pwm invert control for left channel, */\ + { 0x8122, "cmfb_gain_left"}, /* Current sense common mode feedback control gain for left channel, */\ + { 0x8154, "cmfb_offset_left"}, /* Current sense common mode feedback control offset for left channel, */\ + { 0x8200, "enbl_cmfb_right"}, /* Current sense common mode feedback control for right channel, */\ + { 0x8210, "invertpwm_right"}, /* Current sense common mode feedback pwm invert control for right channel, */\ + { 0x8222, "cmfb_gain_right"}, /* Current sense common mode feedback control gain for right channel, */\ + { 0x8254, "cmfb_offset_right"}, /* Current sense common mode feedback control offset for right channel, */\ + { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ + { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ + { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ + { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ + { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ + { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8600, "enbl_cs_adc_left"}, /* Enable current sense ADC , */\ + { 0x8610, "enbl_cs_inn1_left"}, /* Enable connection of current sense negative1 , */\ + { 0x8630, "enbl_cs_inp1_left"}, /* Enable connection of current sense positive1 , */\ + { 0x8650, "enbl_cs_ldo_left"}, /* Enable current sense LDO , */\ + { 0x8660, "enbl_cs_nofloating_n_left"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8670, "enbl_cs_nofloating_p_left"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8680, "enbl_cs_vbatldo_left"}, /* Enable of current sense LDO , */\ + { 0x8700, "enbl_cs_adc_right"}, /* Enable current sense ADC , */\ + { 0x8710, "enbl_cs_inn1_right"}, /* Enable connection of current sense negative1 , */\ + { 0x8730, "enbl_cs_inp1_right"}, /* Enable connection of current sense positive1 , */\ + { 0x8750, "enbl_cs_ldo_right"}, /* Enable current sense LDO , */\ + { 0x8760, "enbl_cs_nofloating_n_right"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8770, "enbl_cs_nofloating_p_right"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8780, "enbl_cs_vbatldo_right"}, /* Enable of current sense LDO , */\ + { 0x8800, "volsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ + { 0x8810, "volsense_dc_offset"}, /* Voltage sense decimator offset control , */\ + { 0x9000, "cf_rst_dsp"}, /* Reset , */\ + { 0x9011, "cf_dmem"}, /* Target memory , */\ + { 0x9030, "cf_aif"}, /* Auto increment , */\ + { 0x9040, "cf_int"}, /* Interrupt - auto clear , */\ + { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ + { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ + { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ + { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ + { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ + { 0x910f, "cf_madd"}, /* Memory address , */\ + { 0x920f, "cf_mema"}, /* Activate memory access , */\ + { 0x9307, "cf_err"}, /* Error flags , */\ + { 0x9387, "cf_ack"}, /* Acknowledge of requests , */\ + { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ + { 0x980f, "ivt_addr0_msb"}, /* Coolflux interrupt vector table address0 MSB , */\ + { 0x990f, "ivt_addr0_lsb"}, /* Coolflux interrupt vector table address0 LSB , */\ + { 0x9a0f, "ivt_addr1_msb"}, /* Coolflux interrupt vector table address1 MSB , */\ + { 0x9b0f, "ivt_addr1_lsb"}, /* Coolflux interrupt vector table address1 LSB , */\ + { 0x9c0f, "ivt_addr2_msb"}, /* Coolflux interrupt vector table address2 MSB , */\ + { 0x9d0f, "ivt_addr2_lsb"}, /* Coolflux interrupt vector table address2 LSB , */\ + { 0x9e0f, "ivt_addr3_msb"}, /* Coolflux interrupt vector table address3 MSB , */\ + { 0x9f0f, "ivt_addr3_lsb"}, /* Coolflux interrupt vector table address3 LSB , */\ + { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ + { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ + { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0xc3d0, "test_abistfft_enbl"}, /* FFT Coolflux , */\ + { 0xc3e0, "test_pwr_switch"}, /* Test mode for digital power switches core sw/mem sw/micvdd sw, */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc660, "bypass_diosw_ovp"}, /* Bypass ovp for memory switch diosw , */\ + { 0xc670, "enbl_powerswitch"}, /* Vddd core power switch control - overrules the manager control, */\ + { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to GPIO1 (see Digimux list for details), */\ + { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to GPIO2 (see Digimux list for details), */\ + { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to GPIO3 (see Digimux list for details), */\ + { 0xc887, "digimuxd_sel"}, /* DigimuxD input selection control routed to GPIO4 (see Digimux list for details), */\ + { 0xc901, "dio1_ehs"}, /* Speed/load setting for DIO1 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc921, "dio2_ehs"}, /* Speed/load setting for DIO2 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc941, "gainio_ehs"}, /* Speed/load setting for GAINIO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc961, "pdmo_ehs"}, /* Speed/load setting for PDMO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9a1, "tdo_ehs"}, /* Speed/load setting for TDO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xca40, "enbl_anamux5"}, /* Enable anamux5 , */\ + { 0xca50, "enbl_anamux6"}, /* Enable anamux6 , */\ + { 0xca60, "enbl_anamux7"}, /* Enable anamux7 , */\ + { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xcb54, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ + { 0xcba4, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ + { 0xcc04, "anamux5"}, /* Anamux selection control - anamux on TEST5 , */\ + { 0xcc54, "anamux6"}, /* Anamux selection control - anamux on TEST6 , */\ + { 0xcca4, "anamux7"}, /* Anamux selection control - anamux on TEST7 , */\ + { 0xcd05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ + { 0xcd64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ + { 0xcdb3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ + { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ + { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ + { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ + { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ + { 0xcec0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ + { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ + { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ + { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ + { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ + { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ + { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ + { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd243, "tsig_gain_left"}, /* Test signal gain for left channel , */\ + { 0xd283, "tsig_gain_right"}, /* Test signal gain for right channel , */\ + { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd506, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd570, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf163, "calibr_gain_left"}, /* HW gain module - left channel (2's complement) , */\ + { 0xf1a5, "calibr_offset_left"}, /* Offset for amplifier, HW gain module - left channel (2's complement), */\ + { 0xf203, "calibr_gain_right"}, /* HW gain module - right channel (2's complement) , */\ + { 0xf245, "calibr_offset_right"}, /* Offset for amplifier, HW gain module - right channel (2's complement), */\ + { 0xf2a3, "calibr_rcvldop_trim"}, /* Trimming of LDO (2.7V) , */\ + { 0xf307, "calibr_gain_cs_left"}, /* Current sense gain - left channel (signed two's complement format), */\ + { 0xf387, "calibr_gain_cs_right"}, /* Current sense gain - right channel (signed two's complement format), */\ + { 0xf40f, "calibr_R25C_L"}, /* Ron resistance of left channel speaker coil , */\ + { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of right channel speaker coil , */\ + { 0xf606, "ctrl_offset_a_left"}, /* Offset of left amplifier level shifter A , */\ + { 0xf686, "ctrl_offset_b_left"}, /* Offset of left amplifier level shifter B , */\ + { 0xf706, "ctrl_offset_a_right"}, /* Offset of right amplifier level shifter A , */\ + { 0xf786, "ctrl_offset_b_right"}, /* Offset of right amplifier level shifter B , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ + { 0xf910, "mtp_lock_enbl_coolflux"}, /* Disable function enbl_coolflux , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Disable programming of max dcdc boost voltage , */\ + { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf987, "type_bits_fw"}, /* MTP-control FW - See Firmware I2C API document for details, */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ + { 0xff05, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa2_irq { + tfa2_irq_stvdds = 0, + tfa2_irq_stplls = 1, + tfa2_irq_stotds = 2, + tfa2_irq_stovds = 3, + tfa2_irq_stuvds = 4, + tfa2_irq_stclks = 5, + tfa2_irq_stmtpb = 6, + tfa2_irq_stnoclk = 7, + tfa2_irq_stspks = 8, + tfa2_irq_stacs = 9, + tfa2_irq_stsws = 10, + tfa2_irq_stwds = 11, + tfa2_irq_stamps = 12, + tfa2_irq_starefs = 13, + tfa2_irq_stadccr = 14, + tfa2_irq_stbodnok = 15, + tfa2_irq_stbstcu = 16, + tfa2_irq_stbsthi = 17, + tfa2_irq_stbstoc = 18, + tfa2_irq_stbstpkcur = 19, + tfa2_irq_stbstvc = 20, + tfa2_irq_stbst86 = 21, + tfa2_irq_stbst93 = 22, + tfa2_irq_strcvld = 23, + tfa2_irq_stocpl = 24, + tfa2_irq_stocpr = 25, + tfa2_irq_stmwsrc = 26, + tfa2_irq_stmwcfc = 27, + tfa2_irq_stmwsmu = 28, + tfa2_irq_stcfmer = 29, + tfa2_irq_stcfmac = 30, + tfa2_irq_stclkoor = 31, + tfa2_irq_sttdmer = 32, + tfa2_irq_stclpl = 33, + tfa2_irq_stclpr = 34, + tfa2_irq_stocpm = 35, + tfa2_irq_max = 36, + tfa2_irq_all = -1 /* all irqs */}; + +#define TFA2_IRQ_NAMETABLE static tfaIrqName_t Tfa2IrqNames[] = {\ + { 0, "STVDDS"},\ + { 1, "STPLLS"},\ + { 2, "STOTDS"},\ + { 3, "STOVDS"},\ + { 4, "STUVDS"},\ + { 5, "STCLKS"},\ + { 6, "STMTPB"},\ + { 7, "STNOCLK"},\ + { 8, "STSPKS"},\ + { 9, "STACS"},\ + { 10, "STSWS"},\ + { 11, "STWDS"},\ + { 12, "STAMPS"},\ + { 13, "STAREFS"},\ + { 14, "STADCCR"},\ + { 15, "STBODNOK"},\ + { 16, "STBSTCU"},\ + { 17, "STBSTHI"},\ + { 18, "STBSTOC"},\ + { 19, "STBSTPKCUR"},\ + { 20, "STBSTVC"},\ + { 21, "STBST86"},\ + { 22, "STBST93"},\ + { 23, "STRCVLD"},\ + { 24, "STOCPL"},\ + { 25, "STOCPR"},\ + { 26, "STMWSRC"},\ + { 27, "STMWCFC"},\ + { 28, "STMWSMU"},\ + { 29, "STCFMER"},\ + { 30, "STCFMAC"},\ + { 31, "STCLKOOR"},\ + { 32, "STTDMER"},\ + { 33, "STCLPL"},\ + { 34, "STCLPR"},\ + { 35, "STOCPM"},\ + { 36, "36"},\ +}; diff --git a/inc/tfa9872_device_genregs_POR.h b/inc/tfa9872_device_genregs_POR.h new file mode 100644 index 000000000000..2d41845e5be2 --- /dev/null +++ b/inc/tfa9872_device_genregs_POR.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/** Filename: Tfa98xx_device_genregs.h + * This file was generated automatically on 08/11/16 at 07:44:41. + * Source file: TFA9872N1B2_DefaultI2CSettings - V1.xlsx + */ + +#ifndef _TFA9872_DEVICE_GENREGS_H +#define _TFA9872_DEVICE_GENREGS_H + + +#define TFA9872_SYS_CONTROL0 0x00 +#define TFA9872_SYS_CONTROL1 0x01 +#define TFA9872_SYS_CONTROL2 0x02 +#define TFA9872_DEVICE_REVISION 0x03 +#define TFA9872_CLOCK_CONTROL 0x04 +#define TFA9872_CLOCK_GATING_CONTROL 0x05 +#define TFA9872_SIDE_TONE_CONFIG 0x0d +#define TFA9872_STATUS_FLAGS0 0x10 +#define TFA9872_STATUS_FLAGS1 0x11 +#define TFA9872_STATUS_FLAGS3 0x13 +#define TFA9872_STATUS_FLAGS4 0x14 +#define TFA9872_BATTERY_VOLTAGE 0x15 +#define TFA9872_TEMPERATURE 0x16 +#define TFA9872_VDDP_VOLTAGE 0x17 +#define TFA9872_TDM_CONFIG0 0x20 +#define TFA9872_TDM_CONFIG1 0x21 +#define TFA9872_TDM_CONFIG2 0x22 +#define TFA9872_TDM_CONFIG3 0x23 +#define TFA9872_TDM_CONFIG6 0x26 +#define TFA9872_TDM_CONFIG7 0x27 +#define TFA9872_PDM_CONFIG0 0x31 +#define TFA9872_INTERRUPT_OUT_REG1 0x40 +#define TFA9872_INTERRUPT_OUT_REG2 0x41 +#define TFA9872_INTERRUPT_OUT_REG3 0x42 +#define TFA9872_INTERRUPT_IN_REG1 0x44 +#define TFA9872_INTERRUPT_IN_REG2 0x45 +#define TFA9872_INTERRUPT_IN_REG3 0x46 +#define TFA9872_INTERRUPT_ENABLE_REG1 0x48 +#define TFA9872_INTERRUPT_ENABLE_REG2 0x49 +#define TFA9872_INTERRUPT_ENABLE_REG3 0x4a +#define TFA9872_STATUS_POLARITY_REG1 0x4c +#define TFA9872_STATUS_POLARITY_REG2 0x4d +#define TFA9872_STATUS_POLARITY_REG3 0x4e +#define TFA9872_BAT_PROT_CONFIG 0x50 +#define TFA9872_AUDIO_CONTROL 0x51 +#define TFA9872_AMPLIFIER_CONFIG 0x52 +#define TFA9872_PGA_CONTROL0 0x60 +#define TFA9872_GAIN_ATT 0x61 +#define TFA9872_TDM_SOURCE_CTRL 0x68 +#define TFA9872_SAM_CTRL 0x69 +#define TFA9872_STATUS_FLAGS5 0x6e +#define TFA9872_CURSENSE_COMP 0x6f +#define TFA9872_DCDC_CONTROL0 0x70 +#define TFA9872_DCDC_CONTROL4 0x74 +#define TFA9872_DCDC_CONTROL5 0x75 +#define TFA9872_MTPKEY2_REG 0xa1 +#define TFA9872_MTP_STATUS 0xa2 +#define TFA9872_KEY_PROTECTED_MTP_CONTROL 0xa3 +#define TFA9872_MTP_DATA_OUT_MSB 0xa5 +#define TFA9872_MTP_DATA_OUT_LSB 0xa6 +#define TFA9872_TEMP_SENSOR_CONFIG 0xb1 +#define TFA9872_SOFTWARE_PROFILE 0xee +#define TFA9872_SOFTWARE_VSTEP 0xef +#define TFA9872_KEY2_PROTECTED_MTP0 0xf0 +#define TFA9872_KEY2_PROTECTED_MTP5 0xf5 +#define TFA9872_SYS_CONTROL0_POR 0x0001 +#define TFA9872_SYS_CONTROL1_POR 0x0000 +#define TFA9872_SYS_CONTROL2_POR 0x2828 +#define TFA9872_DEVICE_REVISION_POR 0x3b72 +#define TFA9872_CLOCK_CONTROL_POR 0x0000 +#define TFA9872_CLOCK_GATING_CONTROL_POR 0x1f6a +#define TFA9872_SIDE_TONE_CONFIG_POR 0x0ebe +#define TFA9872_STATUS_FLAGS0_POR 0x001d +#define TFA9872_STATUS_FLAGS1_POR 0x0004 +#define TFA9872_STATUS_FLAGS3_POR 0x000f +#define TFA9872_STATUS_FLAGS4_POR 0x0000 +#define TFA9872_BATTERY_VOLTAGE_POR 0x03ff +#define TFA9872_TEMPERATURE_POR 0x0100 +#define TFA9872_VDDP_VOLTAGE_POR 0x0000 +#define TFA9872_TDM_CONFIG0_POR 0x2890 +#define TFA9872_TDM_CONFIG1_POR 0xc1f1 +#define TFA9872_TDM_CONFIG2_POR 0x045c +#define TFA9872_TDM_CONFIG3_POR 0x0003 +#define TFA9872_TDM_CONFIG6_POR 0x0010 +#define TFA9872_TDM_CONFIG7_POR 0x0001 +#define TFA9872_PDM_CONFIG0_POR 0x0000 +#define TFA9872_INTERRUPT_OUT_REG1_POR 0x0081 +#define TFA9872_INTERRUPT_OUT_REG2_POR 0x0000 +#define TFA9872_INTERRUPT_OUT_REG3_POR 0x0000 +#define TFA9872_INTERRUPT_IN_REG1_POR 0x0000 +#define TFA9872_INTERRUPT_IN_REG2_POR 0x0000 +#define TFA9872_INTERRUPT_IN_REG3_POR 0x0000 +#define TFA9872_INTERRUPT_ENABLE_REG1_POR 0x0001 +#define TFA9872_INTERRUPT_ENABLE_REG2_POR 0x0000 +#define TFA9872_INTERRUPT_ENABLE_REG3_POR 0x0000 +#define TFA9872_STATUS_POLARITY_REG1_POR 0x74e3 +#define TFA9872_STATUS_POLARITY_REG2_POR 0x967b +#define TFA9872_STATUS_POLARITY_REG3_POR 0x0085 +#define TFA9872_BAT_PROT_CONFIG_POR 0x8091 +#define TFA9872_AUDIO_CONTROL_POR 0x0080 +#define TFA9872_AMPLIFIER_CONFIG_POR 0x7a08 +#define TFA9872_PGA_CONTROL0_POR 0x0000 +#define TFA9872_GAIN_ATT_POR 0x0000 +#define TFA9872_TDM_SOURCE_CTRL_POR 0x0400 +#define TFA9872_SAM_CTRL_POR 0x0000 +#define TFA9872_STATUS_FLAGS5_POR 0x0007 +#define TFA9872_CURSENSE_COMP_POR 0x02e4 +#define TFA9872_DCDC_CONTROL0_POR 0x06e6 +#define TFA9872_DCDC_CONTROL4_POR 0xd913 +#define TFA9872_DCDC_CONTROL5_POR 0x118a +#define TFA9872_MTPKEY2_REG_POR 0x0000 +#define TFA9872_MTP_STATUS_POR 0x0003 +#define TFA9872_KEY_PROTECTED_MTP_CONTROL_POR 0x0000 +#define TFA9872_MTP_DATA_OUT_MSB_POR 0x0000 +#define TFA9872_MTP_DATA_OUT_LSB_POR 0x0000 +#define TFA9872_TEMP_SENSOR_CONFIG_POR 0x0000 +#define TFA9872_SOFTWARE_PROFILE_POR 0x0000 +#define TFA9872_SOFTWARE_VSTEP_POR 0x0000 +#define TFA9872_KEY2_PROTECTED_MTP0_POR 0x0000 +#define TFA9872_KEY2_PROTECTED_MTP5_POR 0x0000 + +#endif /* _TFA9872_DEVICE_GENREGS_H */ diff --git a/inc/tfa9872_tfafieldnames.h b/inc/tfa9872_tfafieldnames.h new file mode 100644 index 000000000000..619cffdd9115 --- /dev/null +++ b/inc/tfa9872_tfafieldnames.h @@ -0,0 +1,1228 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9872_tfaFieldnames.h + * This file was generated automatically on 09/28/18 at 11:21:43. + * Source file: TFA9872N1B2_DefaultI2CSettings -v25.xlsx + */ + +#ifndef _TFA9872_TFAFIELDNAMES_H +#define _TFA9872_TFAFIELDNAMES_H + +#define TFA9872_I2CVERSION_N1A 26 +#define TFA9872_I2CVERSION_N1B 29 +#define TFA9872_I2CVERSION_N1B2 25 + +typedef enum Tfa9872BfEnumList { + TFA9872_BF_PWDN = 0x0000, /*!< Powerdown selection */ + TFA9872_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ + TFA9872_BF_AMPE = 0x0030, /*!< Activate Amplifier */ + TFA9872_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ + TFA9872_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9872_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ + TFA9872_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ + TFA9872_BF_MANSCONF = 0x0120, /*!< I2C configured */ + TFA9872_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ + TFA9872_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ + TFA9872_BF_RCVNS = 0x01e0, /*!< Noise shaper selection */ + TFA9872_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ + TFA9872_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9872_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ + TFA9872_BF_BYPHVBF = 0x02b0, /*!< Bypass HVBAT filter */ + TFA9872_BF_REV = 0x030f, /*!< Revision info */ + TFA9872_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ + TFA9872_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ + TFA9872_BF_SSE = 0x0510, /*!< Enable speaker path */ + TFA9872_BF_VSE = 0x0530, /*!< Voltage sense */ + TFA9872_BF_CSE = 0x0550, /*!< Current sense */ + TFA9872_BF_SSPDME = 0x0560, /*!< Sub-system PDM */ + TFA9872_BF_PGAE = 0x0580, /*!< Enable PGA chop clock */ + TFA9872_BF_SSTDME = 0x0590, /*!< Sub-system TDM */ + TFA9872_BF_SSPBSTE = 0x05a0, /*!< Sub-system boost */ + TFA9872_BF_SSADCE = 0x05b0, /*!< Sub-system ADC */ + TFA9872_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ + TFA9872_BF_STGAIN = 0x0d18, /*!< Side tone gain */ + TFA9872_BF_STSMUTE = 0x0da0, /*!< Side tone soft mute */ + TFA9872_BF_ST1C = 0x0db0, /*!< side tone one s complement */ + TFA9872_BF_VDDS = 0x1000, /*!< POR */ + TFA9872_BF_PLLS = 0x1010, /*!< PLL lock */ + TFA9872_BF_OTDS = 0x1020, /*!< OTP alarm */ + TFA9872_BF_OVDS = 0x1030, /*!< OVP alarm */ + TFA9872_BF_UVDS = 0x1040, /*!< UVP alarm */ + TFA9872_BF_CLKS = 0x1050, /*!< Clocks stable */ + TFA9872_BF_MTPB = 0x1060, /*!< MTP busy */ + TFA9872_BF_NOCLK = 0x1070, /*!< Lost clock */ + TFA9872_BF_SWS = 0x10a0, /*!< Amplifier engage */ + TFA9872_BF_AMPS = 0x10c0, /*!< Amplifier enable */ + TFA9872_BF_AREFS = 0x10d0, /*!< References enable */ + TFA9872_BF_ADCCR = 0x10e0, /*!< Control ADC */ + TFA9872_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9872_BF_DCDCA = 0x1110, /*!< DCDC active */ + TFA9872_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos */ + TFA9872_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ + TFA9872_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ + TFA9872_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ + TFA9872_BF_STMUTEB = 0x1170, /*!< side tone (un)mute busy */ + TFA9872_BF_STMUTE = 0x1180, /*!< side tone mute state */ + TFA9872_BF_TDMLUTER = 0x1190, /*!< TDM LUT error */ + TFA9872_BF_TDMSTAT = 0x11a2, /*!< TDM status bits */ + TFA9872_BF_TDMERR = 0x11d0, /*!< TDM error */ + TFA9872_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ + TFA9872_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ + TFA9872_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ + TFA9872_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ + TFA9872_BF_CLIPAH = 0x1340, /*!< Clipping A to Vddp */ + TFA9872_BF_CLIPAL = 0x1350, /*!< Clipping A to gnd */ + TFA9872_BF_CLIPBH = 0x1360, /*!< Clipping B to Vddp */ + TFA9872_BF_CLIPBL = 0x1370, /*!< Clipping B to gnd */ + TFA9872_BF_OCDS = 0x1380, /*!< OCP amplifier */ + TFA9872_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ + TFA9872_BF_OCPOKMC = 0x13a0, /*!< OCPOK MICVDD */ + TFA9872_BF_MANALARM = 0x13b0, /*!< Alarm state */ + TFA9872_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ + TFA9872_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ + TFA9872_BF_MANOPER = 0x13f0, /*!< Operating state */ + TFA9872_BF_CLKOOR = 0x1420, /*!< External clock status */ + TFA9872_BF_MANSTATE = 0x1433, /*!< Device manager status */ + TFA9872_BF_DCMODE = 0x1471, /*!< DCDC mode status bits */ + TFA9872_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9872_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9872_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/9.5 V) */ + TFA9872_BF_TDME = 0x2040, /*!< Enable interface */ + TFA9872_BF_TDMMODE = 0x2050, /*!< Slave/master */ + TFA9872_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ + TFA9872_BF_TDMFSLN = 0x2073, /*!< FS length (master mode only) */ + TFA9872_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ + TFA9872_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ + TFA9872_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ + TFA9872_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ + TFA9872_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ + TFA9872_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ + TFA9872_BF_TDMADJ = 0x21f0, /*!< data adjustment */ + TFA9872_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ + TFA9872_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ + TFA9872_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ + TFA9872_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ + TFA9872_BF_TDMSPKE = 0x2300, /*!< Control audio tdm channel in 0 (spkr + dcdc) */ + TFA9872_BF_TDMDCE = 0x2310, /*!< Control audio tdm channel in 1 (dcdc) */ + TFA9872_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ + TFA9872_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ + TFA9872_BF_TDMSPKS = 0x2603, /*!< tdm slot for sink 0 (speaker + dcdc) */ + TFA9872_BF_TDMDCS = 0x2643, /*!< tdm slot for sink 1 (dcdc) */ + TFA9872_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ + TFA9872_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ + TFA9872_BF_PDMSTSEL = 0x3111, /*!< Side tone input */ + TFA9872_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9872_BF_ISTPLLS = 0x4010, /*!< Status PLL lock */ + TFA9872_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9872_BF_ISTOVDS = 0x4030, /*!< Status OVP alarm */ + TFA9872_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9872_BF_ISTCLKS = 0x4050, /*!< Status clocks stable */ + TFA9872_BF_ISTMTPB = 0x4060, /*!< Status MTP busy */ + TFA9872_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9872_BF_ISTSWS = 0x40a0, /*!< Status amplifier engage */ + TFA9872_BF_ISTAMPS = 0x40c0, /*!< Status amplifier enable */ + TFA9872_BF_ISTAREFS = 0x40d0, /*!< Status Ref enable */ + TFA9872_BF_ISTADCCR = 0x40e0, /*!< Status Control ADC */ + TFA9872_BF_ISTBSTCU = 0x4100, /*!< Status DCDC current limiting */ + TFA9872_BF_ISTBSTHI = 0x4110, /*!< Status DCDC active */ + TFA9872_BF_ISTBSTOC = 0x4120, /*!< Status DCDC OCP */ + TFA9872_BF_ISTBSTPKCUR = 0x4130, /*!< Status bst peakcur */ + TFA9872_BF_ISTBSTVC = 0x4140, /*!< Status DCDC level 1x */ + TFA9872_BF_ISTBST86 = 0x4150, /*!< Status DCDC level 1.14x */ + TFA9872_BF_ISTBST93 = 0x4160, /*!< Status DCDC level 1.07x */ + TFA9872_BF_ISTOCPR = 0x4190, /*!< Status ocp alarm */ + TFA9872_BF_ISTMWSRC = 0x41a0, /*!< Status Waits HW I2C settings */ + TFA9872_BF_ISTMWSMU = 0x41c0, /*!< Status Audio mute sequence */ + TFA9872_BF_ISTCLKOOR = 0x41f0, /*!< Status flag_clk_out_of_range */ + TFA9872_BF_ISTTDMER = 0x4200, /*!< Status tdm error */ + TFA9872_BF_ISTCLPR = 0x4220, /*!< Status clip */ + TFA9872_BF_ISTLP0 = 0x4240, /*!< Status low power mode0 */ + TFA9872_BF_ISTLP1 = 0x4250, /*!< Status low power mode1 */ + TFA9872_BF_ISTLA = 0x4260, /*!< Status low noise detection */ + TFA9872_BF_ISTVDDPH = 0x4270, /*!< Status VDDP greater than VBAT */ + TFA9872_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9872_BF_ICLPLLS = 0x4410, /*!< Clear PLL lock */ + TFA9872_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9872_BF_ICLOVDS = 0x4430, /*!< Clear OVP alarm */ + TFA9872_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9872_BF_ICLCLKS = 0x4450, /*!< Clear clocks stable */ + TFA9872_BF_ICLMTPB = 0x4460, /*!< Clear mtp busy */ + TFA9872_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9872_BF_ICLSWS = 0x44a0, /*!< Clear amplifier engage */ + TFA9872_BF_ICLAMPS = 0x44c0, /*!< Clear enbl amp */ + TFA9872_BF_ICLAREFS = 0x44d0, /*!< Clear ref enable */ + TFA9872_BF_ICLADCCR = 0x44e0, /*!< Clear control ADC */ + TFA9872_BF_ICLBSTCU = 0x4500, /*!< Clear DCDC current limiting */ + TFA9872_BF_ICLBSTHI = 0x4510, /*!< Clear DCDC active */ + TFA9872_BF_ICLBSTOC = 0x4520, /*!< Clear DCDC OCP */ + TFA9872_BF_ICLBSTPC = 0x4530, /*!< Clear bst peakcur */ + TFA9872_BF_ICLBSTVC = 0x4540, /*!< Clear DCDC level 1x */ + TFA9872_BF_ICLBST86 = 0x4550, /*!< Clear DCDC level 1.14x */ + TFA9872_BF_ICLBST93 = 0x4560, /*!< Clear DCDC level 1.07x */ + TFA9872_BF_ICLOCPR = 0x4590, /*!< Clear ocp alarm */ + TFA9872_BF_ICLMWSRC = 0x45a0, /*!< Clear wait HW I2C settings */ + TFA9872_BF_ICLMWSMU = 0x45c0, /*!< Clear audio mute sequence */ + TFA9872_BF_ICLCLKOOR = 0x45f0, /*!< Clear flag_clk_out_of_range */ + TFA9872_BF_ICLTDMER = 0x4600, /*!< Clear tdm error */ + TFA9872_BF_ICLCLPR = 0x4620, /*!< Clear clip */ + TFA9872_BF_ICLLP0 = 0x4640, /*!< Clear low power mode0 */ + TFA9872_BF_ICLLP1 = 0x4650, /*!< Clear low power mode1 */ + TFA9872_BF_ICLLA = 0x4660, /*!< Clear low noise detection */ + TFA9872_BF_ICLVDDPH = 0x4670, /*!< Clear VDDP greater then VBAT */ + TFA9872_BF_IEVDDS = 0x4800, /*!< Enable por */ + TFA9872_BF_IEPLLS = 0x4810, /*!< Enable pll lock */ + TFA9872_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9872_BF_IEOVDS = 0x4830, /*!< Enable OVP alarm */ + TFA9872_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9872_BF_IECLKS = 0x4850, /*!< Enable clocks stable */ + TFA9872_BF_IEMTPB = 0x4860, /*!< Enable mtp busy */ + TFA9872_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9872_BF_IESWS = 0x48a0, /*!< Enable amplifier engage */ + TFA9872_BF_IEAMPS = 0x48c0, /*!< Enable enbl amp */ + TFA9872_BF_IEAREFS = 0x48d0, /*!< Enable ref enable */ + TFA9872_BF_IEADCCR = 0x48e0, /*!< Enable Control ADC */ + TFA9872_BF_IEBSTCU = 0x4900, /*!< Enable DCDC current limiting */ + TFA9872_BF_IEBSTHI = 0x4910, /*!< Enable DCDC active */ + TFA9872_BF_IEBSTOC = 0x4920, /*!< Enable DCDC OCP */ + TFA9872_BF_IEBSTPC = 0x4930, /*!< Enable bst peakcur */ + TFA9872_BF_IEBSTVC = 0x4940, /*!< Enable DCDC level 1x */ + TFA9872_BF_IEBST86 = 0x4950, /*!< Enable DCDC level 1.14x */ + TFA9872_BF_IEBST93 = 0x4960, /*!< Enable DCDC level 1.07x */ + TFA9872_BF_IEOCPR = 0x4990, /*!< Enable ocp alarm */ + TFA9872_BF_IEMWSRC = 0x49a0, /*!< Enable waits HW I2C settings */ + TFA9872_BF_IEMWSMU = 0x49c0, /*!< Enable man Audio mute sequence */ + TFA9872_BF_IECLKOOR = 0x49f0, /*!< Enable flag_clk_out_of_range */ + TFA9872_BF_IETDMER = 0x4a00, /*!< Enable tdm error */ + TFA9872_BF_IECLPR = 0x4a20, /*!< Enable clip */ + TFA9872_BF_IELP0 = 0x4a40, /*!< Enable low power mode0 */ + TFA9872_BF_IELP1 = 0x4a50, /*!< Enable low power mode1 */ + TFA9872_BF_IELA = 0x4a60, /*!< Enable low noise detection */ + TFA9872_BF_IEVDDPH = 0x4a70, /*!< Enable VDDP greater tehn VBAT */ + TFA9872_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ + TFA9872_BF_IPOPLLS = 0x4c10, /*!< Polarity pll lock */ + TFA9872_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9872_BF_IPOOVDS = 0x4c30, /*!< Polarity OVP alarm */ + TFA9872_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9872_BF_IPOCLKS = 0x4c50, /*!< Polarity clocks stable */ + TFA9872_BF_IPOMTPB = 0x4c60, /*!< Polarity mtp busy */ + TFA9872_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9872_BF_IPOSWS = 0x4ca0, /*!< Polarity amplifier engage */ + TFA9872_BF_IPOAMPS = 0x4cc0, /*!< Polarity enbl amp */ + TFA9872_BF_IPOAREFS = 0x4cd0, /*!< Polarity ref enable */ + TFA9872_BF_IPOADCCR = 0x4ce0, /*!< Polarity Control ADC */ + TFA9872_BF_IPOBSTCU = 0x4d00, /*!< Polarity DCDC current limiting */ + TFA9872_BF_IPOBSTHI = 0x4d10, /*!< Polarity DCDC active */ + TFA9872_BF_IPOBSTOC = 0x4d20, /*!< Polarity DCDC OCP */ + TFA9872_BF_IPOBSTPC = 0x4d30, /*!< Polarity bst peakcur */ + TFA9872_BF_IPOBSTVC = 0x4d40, /*!< Polarity DCDC level 1x */ + TFA9872_BF_IPOBST86 = 0x4d50, /*!< Polarity DCDC level 1.14x */ + TFA9872_BF_IPOBST93 = 0x4d60, /*!< Polarity DCDC level 1.07x */ + TFA9872_BF_IPOOCPR = 0x4d90, /*!< Polarity ocp alarm */ + TFA9872_BF_IPOMWSRC = 0x4da0, /*!< Polarity waits HW I2C settings */ + TFA9872_BF_IPOMWSMU = 0x4dc0, /*!< Polarity man audio mute sequence */ + TFA9872_BF_IPCLKOOR = 0x4df0, /*!< Polarity flag_clk_out_of_range */ + TFA9872_BF_IPOTDMER = 0x4e00, /*!< Polarity tdm error */ + TFA9872_BF_IPOCLPR = 0x4e20, /*!< Polarity clip right */ + TFA9872_BF_IPOLP0 = 0x4e40, /*!< Polarity low power mode0 */ + TFA9872_BF_IPOLP1 = 0x4e50, /*!< Polarity low power mode1 */ + TFA9872_BF_IPOLA = 0x4e60, /*!< Polarity low noise mode */ + TFA9872_BF_IPOVDDPH = 0x4e70, /*!< Polarity VDDP greater than VBAT */ + TFA9872_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time */ + TFA9872_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ + TFA9872_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ + TFA9872_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9872_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ + TFA9872_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ + TFA9872_BF_INTSMUTE = 0x5110, /*!< Soft mute HW */ + TFA9872_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ + TFA9872_BF_DPSA = 0x5170, /*!< Enable DPSA */ + TFA9872_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ + TFA9872_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ + TFA9872_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ + TFA9872_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ + TFA9872_BF_PGAGAIN = 0x6081, /*!< PGA gain selection */ + TFA9872_BF_PGALPE = 0x60b0, /*!< Lowpass enable */ + TFA9872_BF_LPM0BYP = 0x6110, /*!< bypass low power idle mode */ + TFA9872_BF_TDMDCG = 0x6123, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ + TFA9872_BF_TDMSPKG = 0x6163, /*!< Total gain depending on INPLEV setting (channel 0) */ + TFA9872_BF_STIDLEEN = 0x61b0, /*!< enable idle feature for channel 1 */ + TFA9872_BF_LNMODE = 0x62e1, /*!< ctrl select mode */ + TFA9872_BF_LPM1MODE = 0x64e1, /*!< low power mode control */ + TFA9872_BF_LPM1DIS = 0x65c0, /*!< low power mode1 detector control */ + TFA9872_BF_TDMSRCMAP = 0x6801, /*!< tdm source mapping */ + TFA9872_BF_TDMSRCAS = 0x6821, /*!< Sensed value A */ + TFA9872_BF_TDMSRCBS = 0x6841, /*!< Sensed value B */ + TFA9872_BF_ANCSEL = 0x6881, /*!< anc input */ + TFA9872_BF_ANC1C = 0x68a0, /*!< ANC one s complement */ + TFA9872_BF_SAMMODE = 0x6901, /*!< sam enable */ + TFA9872_BF_SAMSEL = 0x6920, /*!< sam source */ + TFA9872_BF_PDMOSELH = 0x6931, /*!< pdm out value when pdm_clk is higth */ + TFA9872_BF_PDMOSELL = 0x6951, /*!< pdm out value when pdm_clk is low */ + TFA9872_BF_SAMOSEL = 0x6970, /*!< ram output on mode sam and audio */ + TFA9872_BF_LP0 = 0x6e00, /*!< low power mode 0 detection */ + TFA9872_BF_LP1 = 0x6e10, /*!< low power mode 1 detection */ + TFA9872_BF_LA = 0x6e20, /*!< low amplitude detection */ + TFA9872_BF_VDDPH = 0x6e30, /*!< vddp greater than vbat */ + TFA9872_BF_DELCURCOMP = 0x6f02, /*!< delay to allign compensation signal with current sense signal */ + TFA9872_BF_SIGCURCOMP = 0x6f40, /*!< polarity of compensation for current sense */ + TFA9872_BF_ENCURCOMP = 0x6f50, /*!< enable current sense compensation */ + TFA9872_BF_SELCLPPWM = 0x6f60, /*!< Select pwm clip flag */ + TFA9872_BF_LVLCLPPWM = 0x6f72, /*!< set the amount of pwm pulse that may be skipped before clip-flag is triggered */ + TFA9872_BF_DCVOS = 0x7002, /*!< Second boost voltage level */ + TFA9872_BF_DCMCC = 0x7033, /*!< Max coil current */ + TFA9872_BF_DCCV = 0x7071, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ + TFA9872_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ + TFA9872_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ + TFA9872_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ + TFA9872_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ + TFA9872_BF_DCVOF = 0x7402, /*!< 1st boost voltage level */ + TFA9872_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ + TFA9872_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9872_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ + TFA9872_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9872_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9872_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ + TFA9872_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9872_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9872_BF_CMTPI = 0xa350, /*!< Start copying all the data from mtp to I2C mtp registers */ + TFA9872_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ + TFA9872_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9872_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9872_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9872_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9872_BF_SWPROFIL = 0xee0f, /*!< Software profile data */ + TFA9872_BF_SWVSTEP = 0xef0f, /*!< Software vstep information */ + TFA9872_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9872_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9872_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9872_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9872_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9872_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9872_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ +} Tfa9872BfEnumList_t; +#define TFA9872_NAMETABLE static tfaBfName_t Tfa9872DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown selection , */\ + { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ + { 0x30, "AMPE"}, /* Activate Amplifier , */\ + { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xc0, "TSTOCP"}, /* OCP testing control , */\ + { 0x120, "MANSCONF"}, /* I2C configured , */\ + { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ + { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1e0, "RCVNS"}, /* Noise shaper selection , */\ + { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ + { 0x2b0, "BYPHVBF"}, /* Bypass HVBAT filter , */\ + { 0x30f, "REV"}, /* Revision info , */\ + { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ + { 0x510, "SSE"}, /* Enable speaker path , */\ + { 0x530, "VSE"}, /* Voltage sense , */\ + { 0x550, "CSE"}, /* Current sense , */\ + { 0x560, "SSPDME"}, /* Sub-system PDM , */\ + { 0x580, "PGAE"}, /* Enable PGA chop clock , */\ + { 0x590, "SSTDME"}, /* Sub-system TDM , */\ + { 0x5a0, "SSPBSTE"}, /* Sub-system boost , */\ + { 0x5b0, "SSADCE"}, /* Sub-system ADC , */\ + { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ + { 0xd18, "STGAIN"}, /* Side tone gain , */\ + { 0xda0, "STSMUTE"}, /* Side tone soft mute , */\ + { 0xdb0, "ST1C"}, /* side tone one s complement , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "PLLS"}, /* PLL lock , */\ + { 0x1020, "OTDS"}, /* OTP alarm , */\ + { 0x1030, "OVDS"}, /* OVP alarm , */\ + { 0x1040, "UVDS"}, /* UVP alarm , */\ + { 0x1050, "CLKS"}, /* Clocks stable , */\ + { 0x1060, "MTPB"}, /* MTP busy , */\ + { 0x1070, "NOCLK"}, /* Lost clock , */\ + { 0x10a0, "SWS"}, /* Amplifier engage , */\ + { 0x10c0, "AMPS"}, /* Amplifier enable , */\ + { 0x10d0, "AREFS"}, /* References enable , */\ + { 0x10e0, "ADCCR"}, /* Control ADC , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active , */\ + { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos , */\ + { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1170, "STMUTEB"}, /* side tone (un)mute busy , */\ + { 0x1180, "STMUTE"}, /* side tone mute state , */\ + { 0x1190, "TDMLUTER"}, /* TDM LUT error , */\ + { 0x11a2, "TDMSTAT"}, /* TDM status bits , */\ + { 0x11d0, "TDMERR"}, /* TDM error , */\ + { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ + { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ + { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ + { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ + { 0x1340, "CLIPAH"}, /* Clipping A to Vddp , */\ + { 0x1350, "CLIPAL"}, /* Clipping A to gnd , */\ + { 0x1360, "CLIPBH"}, /* Clipping B to Vddp , */\ + { 0x1370, "CLIPBL"}, /* Clipping B to gnd , */\ + { 0x1380, "OCDS"}, /* OCP amplifier , */\ + { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ + { 0x13a0, "OCPOKMC"}, /* OCPOK MICVDD , */\ + { 0x13b0, "MANALARM"}, /* Alarm state , */\ + { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ + { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x13f0, "MANOPER"}, /* Operating state , */\ + { 0x1420, "CLKOOR"}, /* External clock status , */\ + { 0x1433, "MANSTATE"}, /* Device manager status , */\ + { 0x1471, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/9.5 V) , */\ + { 0x2040, "TDME"}, /* Enable interface , */\ + { 0x2050, "TDMMODE"}, /* Slave/master , */\ + { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2073, "TDMFSLN"}, /* FS length (master mode only) , */\ + { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ + { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ + { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ + { 0x21f0, "TDMADJ"}, /* data adjustment , */\ + { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ + { 0x2300, "TDMSPKE"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ + { 0x2310, "TDMDCE"}, /* Control audio tdm channel in 1 (dcdc) , */\ + { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "TDMSPKS"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ + { 0x2643, "TDMDCS"}, /* tdm slot for sink 1 (dcdc) , */\ + { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x3111, "PDMSTSEL"}, /* Side tone input , */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTPLLS"}, /* Status PLL lock , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOVDS"}, /* Status OVP alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTCLKS"}, /* Status clocks stable , */\ + { 0x4060, "ISTMTPB"}, /* Status MTP busy , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x40a0, "ISTSWS"}, /* Status amplifier engage , */\ + { 0x40c0, "ISTAMPS"}, /* Status amplifier enable , */\ + { 0x40d0, "ISTAREFS"}, /* Status Ref enable , */\ + { 0x40e0, "ISTADCCR"}, /* Status Control ADC , */\ + { 0x4100, "ISTBSTCU"}, /* Status DCDC current limiting , */\ + { 0x4110, "ISTBSTHI"}, /* Status DCDC active , */\ + { 0x4120, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4130, "ISTBSTPKCUR"}, /* Status bst peakcur , */\ + { 0x4140, "ISTBSTVC"}, /* Status DCDC level 1x , */\ + { 0x4150, "ISTBST86"}, /* Status DCDC level 1.14x , */\ + { 0x4160, "ISTBST93"}, /* Status DCDC level 1.07x , */\ + { 0x4190, "ISTOCPR"}, /* Status ocp alarm , */\ + { 0x41a0, "ISTMWSRC"}, /* Status Waits HW I2C settings , */\ + { 0x41c0, "ISTMWSMU"}, /* Status Audio mute sequence , */\ + { 0x41f0, "ISTCLKOOR"}, /* Status flag_clk_out_of_range , */\ + { 0x4200, "ISTTDMER"}, /* Status tdm error , */\ + { 0x4220, "ISTCLPR"}, /* Status clip , */\ + { 0x4240, "ISTLP0"}, /* Status low power mode0 , */\ + { 0x4250, "ISTLP1"}, /* Status low power mode1 , */\ + { 0x4260, "ISTLA"}, /* Status low noise detection , */\ + { 0x4270, "ISTVDDPH"}, /* Status VDDP greater than VBAT , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLPLLS"}, /* Clear PLL lock , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOVDS"}, /* Clear OVP alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLCLKS"}, /* Clear clocks stable , */\ + { 0x4460, "ICLMTPB"}, /* Clear mtp busy , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x44a0, "ICLSWS"}, /* Clear amplifier engage , */\ + { 0x44c0, "ICLAMPS"}, /* Clear enbl amp , */\ + { 0x44d0, "ICLAREFS"}, /* Clear ref enable , */\ + { 0x44e0, "ICLADCCR"}, /* Clear control ADC , */\ + { 0x4500, "ICLBSTCU"}, /* Clear DCDC current limiting , */\ + { 0x4510, "ICLBSTHI"}, /* Clear DCDC active , */\ + { 0x4520, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4530, "ICLBSTPC"}, /* Clear bst peakcur , */\ + { 0x4540, "ICLBSTVC"}, /* Clear DCDC level 1x , */\ + { 0x4550, "ICLBST86"}, /* Clear DCDC level 1.14x , */\ + { 0x4560, "ICLBST93"}, /* Clear DCDC level 1.07x , */\ + { 0x4590, "ICLOCPR"}, /* Clear ocp alarm , */\ + { 0x45a0, "ICLMWSRC"}, /* Clear wait HW I2C settings , */\ + { 0x45c0, "ICLMWSMU"}, /* Clear audio mute sequence , */\ + { 0x45f0, "ICLCLKOOR"}, /* Clear flag_clk_out_of_range , */\ + { 0x4600, "ICLTDMER"}, /* Clear tdm error , */\ + { 0x4620, "ICLCLPR"}, /* Clear clip , */\ + { 0x4640, "ICLLP0"}, /* Clear low power mode0 , */\ + { 0x4650, "ICLLP1"}, /* Clear low power mode1 , */\ + { 0x4660, "ICLLA"}, /* Clear low noise detection , */\ + { 0x4670, "ICLVDDPH"}, /* Clear VDDP greater then VBAT , */\ + { 0x4800, "IEVDDS"}, /* Enable por , */\ + { 0x4810, "IEPLLS"}, /* Enable pll lock , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOVDS"}, /* Enable OVP alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IECLKS"}, /* Enable clocks stable , */\ + { 0x4860, "IEMTPB"}, /* Enable mtp busy , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x48a0, "IESWS"}, /* Enable amplifier engage , */\ + { 0x48c0, "IEAMPS"}, /* Enable enbl amp , */\ + { 0x48d0, "IEAREFS"}, /* Enable ref enable , */\ + { 0x48e0, "IEADCCR"}, /* Enable Control ADC , */\ + { 0x4900, "IEBSTCU"}, /* Enable DCDC current limiting , */\ + { 0x4910, "IEBSTHI"}, /* Enable DCDC active , */\ + { 0x4920, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4930, "IEBSTPC"}, /* Enable bst peakcur , */\ + { 0x4940, "IEBSTVC"}, /* Enable DCDC level 1x , */\ + { 0x4950, "IEBST86"}, /* Enable DCDC level 1.14x , */\ + { 0x4960, "IEBST93"}, /* Enable DCDC level 1.07x , */\ + { 0x4990, "IEOCPR"}, /* Enable ocp alarm , */\ + { 0x49a0, "IEMWSRC"}, /* Enable waits HW I2C settings , */\ + { 0x49c0, "IEMWSMU"}, /* Enable man Audio mute sequence , */\ + { 0x49f0, "IECLKOOR"}, /* Enable flag_clk_out_of_range , */\ + { 0x4a00, "IETDMER"}, /* Enable tdm error , */\ + { 0x4a20, "IECLPR"}, /* Enable clip , */\ + { 0x4a40, "IELP0"}, /* Enable low power mode0 , */\ + { 0x4a50, "IELP1"}, /* Enable low power mode1 , */\ + { 0x4a60, "IELA"}, /* Enable low noise detection , */\ + { 0x4a70, "IEVDDPH"}, /* Enable VDDP greater tehn VBAT , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ + { 0x4c10, "IPOPLLS"}, /* Polarity pll lock , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOVDS"}, /* Polarity OVP alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOCLKS"}, /* Polarity clocks stable , */\ + { 0x4c60, "IPOMTPB"}, /* Polarity mtp busy , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x4ca0, "IPOSWS"}, /* Polarity amplifier engage , */\ + { 0x4cc0, "IPOAMPS"}, /* Polarity enbl amp , */\ + { 0x4cd0, "IPOAREFS"}, /* Polarity ref enable , */\ + { 0x4ce0, "IPOADCCR"}, /* Polarity Control ADC , */\ + { 0x4d00, "IPOBSTCU"}, /* Polarity DCDC current limiting , */\ + { 0x4d10, "IPOBSTHI"}, /* Polarity DCDC active , */\ + { 0x4d20, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4d30, "IPOBSTPC"}, /* Polarity bst peakcur , */\ + { 0x4d40, "IPOBSTVC"}, /* Polarity DCDC level 1x , */\ + { 0x4d50, "IPOBST86"}, /* Polarity DCDC level 1.14x , */\ + { 0x4d60, "IPOBST93"}, /* Polarity DCDC level 1.07x , */\ + { 0x4d90, "IPOOCPR"}, /* Polarity ocp alarm , */\ + { 0x4da0, "IPOMWSRC"}, /* Polarity waits HW I2C settings , */\ + { 0x4dc0, "IPOMWSMU"}, /* Polarity man audio mute sequence , */\ + { 0x4df0, "IPCLKOOR"}, /* Polarity flag_clk_out_of_range , */\ + { 0x4e00, "IPOTDMER"}, /* Polarity tdm error , */\ + { 0x4e20, "IPOCLPR"}, /* Polarity clip right , */\ + { 0x4e40, "IPOLP0"}, /* Polarity low power mode0 , */\ + { 0x4e50, "IPOLP1"}, /* Polarity low power mode1 , */\ + { 0x4e60, "IPOLA"}, /* Polarity low noise mode , */\ + { 0x4e70, "IPOVDDPH"}, /* Polarity VDDP greater than VBAT , */\ + { 0x5001, "BSSCR"}, /* Battery Safeguard attack time , */\ + { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ + { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ + { 0x5110, "INTSMUTE"}, /* Soft mute HW , */\ + { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ + { 0x5170, "DPSA"}, /* Enable DPSA , */\ + { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ + { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ + { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ + { 0x6081, "PGAGAIN"}, /* PGA gain selection , */\ + { 0x60b0, "PGALPE"}, /* Lowpass enable , */\ + { 0x6110, "LPM0BYP"}, /* bypass low power idle mode , */\ + { 0x6123, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x6163, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x61b0, "STIDLEEN"}, /* enable idle feature for channel 1 , */\ + { 0x62e1, "LNMODE"}, /* ctrl select mode , */\ + { 0x64e1, "LPM1MODE"}, /* low power mode control , */\ + { 0x65c0, "LPM1DIS"}, /* low power mode1 detector control , */\ + { 0x6801, "TDMSRCMAP"}, /* tdm source mapping , */\ + { 0x6821, "TDMSRCAS"}, /* Sensed value A , */\ + { 0x6841, "TDMSRCBS"}, /* Sensed value B , */\ + { 0x6881, "ANCSEL"}, /* anc input , */\ + { 0x68a0, "ANC1C"}, /* ANC one s complement , */\ + { 0x6901, "SAMMODE"}, /* sam enable , */\ + { 0x6920, "SAMSEL"}, /* sam source , */\ + { 0x6931, "PDMOSELH"}, /* pdm out value when pdm_clk is higth , */\ + { 0x6951, "PDMOSELL"}, /* pdm out value when pdm_clk is low , */\ + { 0x6970, "SAMOSEL"}, /* ram output on mode sam and audio , */\ + { 0x6e00, "LP0"}, /* low power mode 0 detection , */\ + { 0x6e10, "LP1"}, /* low power mode 1 detection , */\ + { 0x6e20, "LA"}, /* low amplitude detection , */\ + { 0x6e30, "VDDPH"}, /* vddp greater than vbat , */\ + { 0x6f02, "DELCURCOMP"}, /* delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "SIGCURCOMP"}, /* polarity of compensation for current sense , */\ + { 0x6f50, "ENCURCOMP"}, /* enable current sense compensation , */\ + { 0x6f60, "SELCLPPWM"}, /* Select pwm clip flag , */\ + { 0x6f72, "LVLCLPPWM"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7002, "DCVOS"}, /* Second boost voltage level , */\ + { 0x7033, "DCMCC"}, /* Max coil current , */\ + { 0x7071, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ + { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ + { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ + { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7402, "DCVOF"}, /* 1st boost voltage level , */\ + { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa350, "CMTPI"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xee0f, "SWPROFIL"}, /* Software profile data , */\ + { 0xef0f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9872_BITNAMETABLE static tfaBfName_t Tfa9872BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown selection , */\ + { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ + { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ + { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xc0, "test_ocp"}, /* OCP testing control , */\ + { 0x120, "src_set_configured"}, /* I2C configured , */\ + { 0x140, "enbl_osc1m_auto_off"}, /* Internal osc off at PWDN , */\ + { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ + { 0x2b0, "bypass_hvbat_filter"}, /* Bypass HVBAT filter , */\ + { 0x2d0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ + { 0x30f, "device_rev"}, /* Revision info , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ + { 0x510, "enbl_spkr_ss"}, /* Enable speaker path , */\ + { 0x530, "enbl_volsense"}, /* Voltage sense , */\ + { 0x550, "enbl_cursense"}, /* Current sense , */\ + { 0x560, "enbl_pdm_ss"}, /* Sub-system PDM , */\ + { 0x580, "enbl_pga_chop"}, /* Enable PGA chop clock , */\ + { 0x590, "enbl_tdm_ss"}, /* Sub-system TDM , */\ + { 0x5a0, "enbl_bst_ss"}, /* Sub-system boost , */\ + { 0x5b0, "enbl_adc_ss"}, /* Sub-system ADC , */\ + { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ + { 0xd18, "side_tone_gain"}, /* Side tone gain , */\ + { 0xda0, "mute_side_tone"}, /* Side tone soft mute , */\ + { 0xdb0, "side_tone_1scomplement"}, /* side tone one s complement , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_pll_lock"}, /* PLL lock , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm , */\ + { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ + { 0x1050, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1060, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1070, "flag_lost_clk"}, /* Lost clock , */\ + { 0x10a0, "flag_engage"}, /* Amplifier engage , */\ + { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ + { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active , */\ + { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos , */\ + { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1170, "flag_soft_mute_busy"}, /* side tone (un)mute busy , */\ + { 0x1180, "flag_soft_mute_state"}, /* side tone mute state , */\ + { 0x1190, "flag_tdm_lut_error"}, /* TDM LUT error , */\ + { 0x11a2, "flag_tdm_status"}, /* TDM status bits , */\ + { 0x11d0, "flag_tdm_error"}, /* TDM error , */\ + { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1340, "flag_clipa_high"}, /* Clipping A to Vddp , */\ + { 0x1350, "flag_clipa_low"}, /* Clipping A to gnd , */\ + { 0x1360, "flag_clipb_high"}, /* Clipping B to Vddp , */\ + { 0x1370, "flag_clipb_low"}, /* Clipping B to gnd , */\ + { 0x1380, "flag_ocp_alarm"}, /* OCP amplifier , */\ + { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ + { 0x13b0, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ + { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ + { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x1433, "man_state"}, /* Device manager status , */\ + { 0x1471, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/9.5 V) , */\ + { 0x2040, "tdm_enable"}, /* Enable interface , */\ + { 0x2050, "tdm_mode"}, /* Slave/master , */\ + { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2073, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ + { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ + { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ + { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ + { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ + { 0x2300, "tdm_sink0_enable"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ + { 0x2310, "tdm_sink1_enable"}, /* Control audio tdm channel in 1 (dcdc) , */\ + { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "tdm_sink0_slot"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ + { 0x2643, "tdm_sink1_slot"}, /* tdm slot for sink 1 (dcdc) , */\ + { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x3111, "pdm_side_tone_sel"}, /* Side tone input , */\ + { 0x3201, "pdm_nbck"}, /* PDM BCK/Fs ratio , */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_pll_lock"}, /* Status PLL lock , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ovpok"}, /* Status OVP alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_clocks_stable"}, /* Status clocks stable , */\ + { 0x4060, "int_out_flag_mtp_busy"}, /* Status MTP busy , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x40a0, "int_out_flag_engage"}, /* Status amplifier engage , */\ + { 0x40c0, "int_out_flag_enbl_amp"}, /* Status amplifier enable , */\ + { 0x40d0, "int_out_flag_enbl_ref"}, /* Status Ref enable , */\ + { 0x40e0, "int_out_flag_adc10_ready"}, /* Status Control ADC , */\ + { 0x4100, "int_out_flag_bst_bstcur"}, /* Status DCDC current limiting , */\ + { 0x4110, "int_out_flag_bst_hiz"}, /* Status DCDC active , */\ + { 0x4120, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4130, "int_out_flag_bst_peakcur"}, /* Status bst peakcur , */\ + { 0x4140, "int_out_flag_bst_voutcomp"}, /* Status DCDC level 1x , */\ + { 0x4150, "int_out_flag_bst_voutcomp86"}, /* Status DCDC level 1.14x , */\ + { 0x4160, "int_out_flag_bst_voutcomp93"}, /* Status DCDC level 1.07x , */\ + { 0x4190, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ + { 0x41a0, "int_out_flag_man_wait_src_settings"}, /* Status Waits HW I2C settings , */\ + { 0x41c0, "int_out_flag_man_start_mute_audio"}, /* Status Audio mute sequence , */\ + { 0x41f0, "int_out_flag_clk_out_of_range"}, /* Status flag_clk_out_of_range , */\ + { 0x4200, "int_out_flag_tdm_error"}, /* Status tdm error , */\ + { 0x4220, "int_out_flag_clip"}, /* Status clip , */\ + { 0x4240, "int_out_flag_lp_detect_mode0"}, /* Status low power mode0 , */\ + { 0x4250, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 , */\ + { 0x4260, "int_out_flag_low_amplitude"}, /* Status low noise detection , */\ + { 0x4270, "int_out_flag_vddp_gt_vbat"}, /* Status VDDP greater than VBAT , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_pll_lock"}, /* Clear PLL lock , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ovpok"}, /* Clear OVP alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_clocks_stable"}, /* Clear clocks stable , */\ + { 0x4460, "int_in_flag_mtp_busy"}, /* Clear mtp busy , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x44a0, "int_in_flag_engage"}, /* Clear amplifier engage , */\ + { 0x44c0, "int_in_flag_enbl_amp"}, /* Clear enbl amp , */\ + { 0x44d0, "int_in_flag_enbl_ref"}, /* Clear ref enable , */\ + { 0x44e0, "int_in_flag_adc10_ready"}, /* Clear control ADC , */\ + { 0x4500, "int_in_flag_bst_bstcur"}, /* Clear DCDC current limiting , */\ + { 0x4510, "int_in_flag_bst_hiz"}, /* Clear DCDC active , */\ + { 0x4520, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4530, "int_in_flag_bst_peakcur"}, /* Clear bst peakcur , */\ + { 0x4540, "int_in_flag_bst_voutcomp"}, /* Clear DCDC level 1x , */\ + { 0x4550, "int_in_flag_bst_voutcomp86"}, /* Clear DCDC level 1.14x , */\ + { 0x4560, "int_in_flag_bst_voutcomp93"}, /* Clear DCDC level 1.07x , */\ + { 0x4590, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ + { 0x45a0, "int_in_flag_man_wait_src_settings"}, /* Clear wait HW I2C settings , */\ + { 0x45c0, "int_in_flag_man_start_mute_audio"}, /* Clear audio mute sequence , */\ + { 0x45f0, "int_in_flag_clk_out_of_range"}, /* Clear flag_clk_out_of_range , */\ + { 0x4600, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ + { 0x4620, "int_in_flag_clip"}, /* Clear clip , */\ + { 0x4640, "int_in_flag_lp_detect_mode0"}, /* Clear low power mode0 , */\ + { 0x4650, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 , */\ + { 0x4660, "int_in_flag_low_amplitude"}, /* Clear low noise detection , */\ + { 0x4670, "int_in_flag_vddp_gt_vbat"}, /* Clear VDDP greater then VBAT , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ + { 0x4810, "int_enable_flag_pll_lock"}, /* Enable pll lock , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ovpok"}, /* Enable OVP alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_clocks_stable"}, /* Enable clocks stable , */\ + { 0x4860, "int_enable_flag_mtp_busy"}, /* Enable mtp busy , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x48a0, "int_enable_flag_engage"}, /* Enable amplifier engage , */\ + { 0x48c0, "int_enable_flag_enbl_amp"}, /* Enable enbl amp , */\ + { 0x48d0, "int_enable_flag_enbl_ref"}, /* Enable ref enable , */\ + { 0x48e0, "int_enable_flag_adc10_ready"}, /* Enable Control ADC , */\ + { 0x4900, "int_enable_flag_bst_bstcur"}, /* Enable DCDC current limiting , */\ + { 0x4910, "int_enable_flag_bst_hiz"}, /* Enable DCDC active , */\ + { 0x4920, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4930, "int_enable_flag_bst_peakcur"}, /* Enable bst peakcur , */\ + { 0x4940, "int_enable_flag_bst_voutcomp"}, /* Enable DCDC level 1x , */\ + { 0x4950, "int_enable_flag_bst_voutcomp86"}, /* Enable DCDC level 1.14x , */\ + { 0x4960, "int_enable_flag_bst_voutcomp93"}, /* Enable DCDC level 1.07x , */\ + { 0x4990, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ + { 0x49a0, "int_enable_flag_man_wait_src_settings"}, /* Enable waits HW I2C settings , */\ + { 0x49c0, "int_enable_flag_man_start_mute_audio"}, /* Enable man Audio mute sequence , */\ + { 0x49f0, "int_enable_flag_clk_out_of_range"}, /* Enable flag_clk_out_of_range , */\ + { 0x4a00, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ + { 0x4a20, "int_enable_flag_clip"}, /* Enable clip , */\ + { 0x4a40, "int_enable_flag_lp_detect_mode0"}, /* Enable low power mode0 , */\ + { 0x4a50, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 , */\ + { 0x4a60, "int_enable_flag_low_amplitude"}, /* Enable low noise detection , */\ + { 0x4a70, "int_enable_flag_vddp_gt_vbat"}, /* Enable VDDP greater tehn VBAT , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ + { 0x4c10, "int_polarity_flag_pll_lock"}, /* Polarity pll lock , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ovpok"}, /* Polarity OVP alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_clocks_stable"}, /* Polarity clocks stable , */\ + { 0x4c60, "int_polarity_flag_mtp_busy"}, /* Polarity mtp busy , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x4ca0, "int_polarity_flag_engage"}, /* Polarity amplifier engage , */\ + { 0x4cc0, "int_polarity_flag_enbl_amp"}, /* Polarity enbl amp , */\ + { 0x4cd0, "int_polarity_flag_enbl_ref"}, /* Polarity ref enable , */\ + { 0x4ce0, "int_polarity_flag_adc10_ready"}, /* Polarity Control ADC , */\ + { 0x4d00, "int_polarity_flag_bst_bstcur"}, /* Polarity DCDC current limiting , */\ + { 0x4d10, "int_polarity_flag_bst_hiz"}, /* Polarity DCDC active , */\ + { 0x4d20, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4d30, "int_polarity_flag_bst_peakcur"}, /* Polarity bst peakcur , */\ + { 0x4d40, "int_polarity_flag_bst_voutcomp"}, /* Polarity DCDC level 1x , */\ + { 0x4d50, "int_polarity_flag_bst_voutcomp86"}, /* Polarity DCDC level 1.14x , */\ + { 0x4d60, "int_polarity_flag_bst_voutcomp93"}, /* Polarity DCDC level 1.07x , */\ + { 0x4d90, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ + { 0x4da0, "int_polarity_flag_man_wait_src_settings"}, /* Polarity waits HW I2C settings , */\ + { 0x4dc0, "int_polarity_flag_man_start_mute_audio"}, /* Polarity man audio mute sequence , */\ + { 0x4df0, "int_polarity_flag_clk_out_of_range"}, /* Polarity flag_clk_out_of_range , */\ + { 0x4e00, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ + { 0x4e20, "int_polarity_flag_clip"}, /* Polarity clip right , */\ + { 0x4e40, "int_polarity_flag_lp_detect_mode0"}, /* Polarity low power mode0 , */\ + { 0x4e50, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 , */\ + { 0x4e60, "int_polarity_flag_low_amplitude"}, /* Polarity low noise mode , */\ + { 0x4e70, "int_polarity_flag_vddp_gt_vbat"}, /* Polarity VDDP greater than VBAT , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ + { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ + { 0x5110, "soft_mute"}, /* Soft mute HW , */\ + { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ + { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ + { 0x5257, "gain"}, /* Amplifier gain , */\ + { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ + { 0x5340, "clipfast"}, /* Clock selection for HW clipper for Battery Safeguard, */\ + { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ + { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ + { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5420, "fb_hz"}, /* Feedback resistor set to high ohmic , */\ + { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ + { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5582, "dpsa_drive"}, /* Drive setting (bin. coded) , */\ + { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ + { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ + { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ + { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5820, "pwm_shape"}, /* PWM shape , */\ + { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ + { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ + { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ + { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ + { 0x6081, "pga_gain_set"}, /* PGA gain selection , */\ + { 0x60b0, "pga_lowpass_enable"}, /* Lowpass enable , */\ + { 0x60c0, "pga_pwr_enable"}, /* Power enable, directcontrol mode only , */\ + { 0x60d0, "pga_switch_enable"}, /* Switch enable, directcontrol mode only , */\ + { 0x60e0, "pga_switch_aux_enable"}, /* Switch enable aux, directcontrol mode only , */\ + { 0x6100, "force_idle"}, /* force low power in idle mode , */\ + { 0x6110, "bypass_idle"}, /* bypass low power idle mode , */\ + { 0x6123, "ctrl_attl"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x6163, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x61a0, "idle_cnt"}, /* idle counter , */\ + { 0x61b0, "enbl_idle_ch1"}, /* enable idle feature for channel 1 , */\ + { 0x6265, "zero_lvl"}, /* low noise gain switch zero trigger level , */\ + { 0x62c1, "ctrl_fb_classd"}, /* class D gain ctrl_fb_50k ctrl_fb_100k , */\ + { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ + { 0x6305, "threshold_lvl"}, /* low noise gain switch trigger level , */\ + { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 zero crossing detection level , */\ + { 0x64e1, "lpm1_mode"}, /* low power mode control , */\ + { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 amplitude trigger level , */\ + { 0x6565, "lpm1_hold_time"}, /* low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ + { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ + { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ + { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ + { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ + { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtred vs unfiltered compare , */\ + { 0x6801, "tdm_source_mapping"}, /* tdm source mapping , */\ + { 0x6821, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ + { 0x6841, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ + { 0x6881, "pdm_anc_sel"}, /* anc input , */\ + { 0x68a0, "anc_1scomplement"}, /* ANC one s complement , */\ + { 0x6901, "sam_mode"}, /* sam enable , */\ + { 0x6920, "sam_src"}, /* sam source , */\ + { 0x6931, "pdmdat_h_sel"}, /* pdm out value when pdm_clk is higth , */\ + { 0x6951, "pdmdat_l_sel"}, /* pdm out value when pdm_clk is low , */\ + { 0x6970, "sam_spkr_sel"}, /* ram output on mode sam and audio , */\ + { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ + { 0x6b00, "disable_auto_engage"}, /* disable auto engange , */\ + { 0x6b10, "sel_tdm_data_valid"}, /* select tdm valid for speaker subsystem , */\ + { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x6c69, "spare_out"}, /* spare_out , */\ + { 0x6d0f, "spare_in"}, /* spare_in , */\ + { 0x6e00, "flag_lp_detect_mode0"}, /* low power mode 0 detection , */\ + { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ + { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ + { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ + { 0x6f02, "cursense_comp_delay"}, /* delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "cursense_comp_sign"}, /* polarity of compensation for current sense , */\ + { 0x6f50, "enbl_cursense_comp"}, /* enable current sense compensation , */\ + { 0x6f60, "sel_clip_pwms"}, /* Select pwm clip flag , */\ + { 0x6f72, "pwms_clip_lvl"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7002, "scnd_boost_voltage"}, /* Second boost voltage level , */\ + { 0x7033, "boost_cur"}, /* Max coil current , */\ + { 0x7071, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ + { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ + { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7402, "frst_boost_voltage"}, /* 1st boost voltage level , */\ + { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x74f0, "ignore_flag_voutcomp86"}, /* Ignore flag_voutcomp86 , */\ + { 0x7502, "track_decay"}, /* DCDC Boost decay speed after a peak value, effective only when boost_track is set to 1, */\ + { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x7620, "pga_test_ldo_bypass"}, /* bypass internal PGA LDO , */\ + { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ + { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ + { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8200, "enbl_cmfb"}, /* Current sense common mode feedback control , */\ + { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8222, "cmfb_gain"}, /* Current sense common mode feedback control gain , */\ + { 0x8254, "cmfb_offset"}, /* Current sense common mode feedback control offset , */\ + { 0x82a0, "cs_sam_set"}, /* Enable SAM input for current sense , */\ + { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ + { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ + { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ + { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ + { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ + { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ + { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ + { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ + { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ + { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ + { 0x8760, "enbl_cs_nofloating_n"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8770, "enbl_cs_nofloating_p"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ + { 0x8800, "volsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ + { 0x8810, "vol_cur_sense_dc_offset"}, /* voltage and current sense decimator offset control, */\ + { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ + { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ + { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc5b0, "pga_test_enable"}, /* Enable PGA test mode , */\ + { 0xc5c0, "pga_test_offset_enable"}, /* Enable PGA test offset , */\ + { 0xc5d0, "pga_test_shortinput_enable"}, /* Enable PGA test shortinput , */\ + { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ + { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ + { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to PDMDAT (see Digimux list for details), */\ + { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xcb54, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ + { 0xcba4, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ + { 0xcd05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ + { 0xcd64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ + { 0xcdb3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ + { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ + { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ + { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ + { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ + { 0xcec0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ + { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ + { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ + { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ + { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ + { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ + { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ + { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd283, "tsig_gain"}, /* Test signal gain , */\ + { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xd621, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ + { 0xd641, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ + { 0xd661, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ + { 0xd701, "pdmdat_ehs"}, /* Speed/load setting for PDMDAT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd740, "bck_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd750, "datai_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd760, "pdmclk_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd800, "source_in_testmode"}, /* tdm source in test mode (return only current and voltage sense), */\ + { 0xd810, "gainatt_feedback"}, /* gainatt feedback to tdm , */\ + { 0xd822, "test_parametric_io"}, /* test io parametric , */\ + { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ + { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ + { 0xd880, "bst_dcmbst"}, /* dcm boost , */\ + { 0xd890, "pdm_loopback"}, /* pdm loop back to tdm , */\ + { 0xd8a1, "force_pga_clock"}, /* force pga clock , */\ + { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ + { 0xee0f, "sw_profile"}, /* Software profile data , */\ + { 0xef0f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf163, "spare_mpt1_9_6"}, /* HW gain module - left channel (2's complement) , */\ + { 0xf1a5, "spare_mpt1_15_10"}, /* Offset for amplifier, HW gain module - left channel (2's complement), */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf2a3, "spare_mpt2_13_10"}, /* Trimming of LDO (2.7V) , */\ + { 0xf307, "spare_mpt3_7_0"}, /* SPARE , */\ + { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf40f, "spare_mtp4_15_0"}, /* SPARE , */\ + { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ + { 0xf606, "spare_mpt6_6_0"}, /* SPARE , */\ + { 0xf686, "spare_mpt6_14_8"}, /* Offset of left amplifier level shifter B , */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ + { 0xf910, "disable_sam_mode"}, /* Disable same mode , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Disable programming of max dcdc boost voltage , */\ + { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf980, "mtp_enbl_amp_in_state_alarm"}, /* Enbl_amp in alarm state , */\ + { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* pwm delay clock auto gating , */\ + { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* ocpclock auto gating , */\ + { 0xf9b0, "mtp_gate_cgu_clock_for_test"}, /* cgu test clock control , */\ + { 0xf9c3, "spare_mtp9_15_12"}, /* MTP-control FW - See Firmware I2C API document for details, */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ + { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa9872_irq { + tfa9872_irq_stvdds = 0, + tfa9872_irq_stplls = 1, + tfa9872_irq_stotds = 2, + tfa9872_irq_stovds = 3, + tfa9872_irq_stuvds = 4, + tfa9872_irq_stclks = 5, + tfa9872_irq_stmtpb = 6, + tfa9872_irq_stnoclk = 7, + tfa9872_irq_stsws = 10, + tfa9872_irq_stamps = 12, + tfa9872_irq_starefs = 13, + tfa9872_irq_stadccr = 14, + tfa9872_irq_stbstcu = 16, + tfa9872_irq_stbsthi = 17, + tfa9872_irq_stbstoc = 18, + tfa9872_irq_stbstpkcur = 19, + tfa9872_irq_stbstvc = 20, + tfa9872_irq_stbst86 = 21, + tfa9872_irq_stbst93 = 22, + tfa9872_irq_stocpr = 25, + tfa9872_irq_stmwsrc = 26, + tfa9872_irq_stmwsmu = 28, + tfa9872_irq_stclkoor = 31, + tfa9872_irq_sttdmer = 32, + tfa9872_irq_stclpr = 34, + tfa9872_irq_stlp0 = 36, + tfa9872_irq_stlp1 = 37, + tfa9872_irq_stla = 38, + tfa9872_irq_stvddph = 39, + tfa9872_irq_max = 40, + tfa9872_irq_all = -1 /* all irqs */}; + +#define TFA9872_IRQ_NAMETABLE static tfaIrqName_t Tfa9872IrqNames[] = {\ + { 0, "STVDDS"},\ + { 1, "STPLLS"},\ + { 2, "STOTDS"},\ + { 3, "STOVDS"},\ + { 4, "STUVDS"},\ + { 5, "STCLKS"},\ + { 6, "STMTPB"},\ + { 7, "STNOCLK"},\ + { 8, "8"},\ + { 9, "9"},\ + { 10, "STSWS"},\ + { 11, "11"},\ + { 12, "STAMPS"},\ + { 13, "STAREFS"},\ + { 14, "STADCCR"},\ + { 15, "15"},\ + { 16, "STBSTCU"},\ + { 17, "STBSTHI"},\ + { 18, "STBSTOC"},\ + { 19, "STBSTPKCUR"},\ + { 20, "STBSTVC"},\ + { 21, "STBST86"},\ + { 22, "STBST93"},\ + { 23, "23"},\ + { 24, "24"},\ + { 25, "STOCPR"},\ + { 26, "STMWSRC"},\ + { 27, "27"},\ + { 28, "STMWSMU"},\ + { 29, "29"},\ + { 30, "30"},\ + { 31, "STCLKOOR"},\ + { 32, "STTDMER"},\ + { 33, "33"},\ + { 34, "STCLPR"},\ + { 35, "35"},\ + { 36, "STLP0"},\ + { 37, "STLP1"},\ + { 38, "STLA"},\ + { 39, "STVDDPH"},\ + { 40, "40"},\ +}; +#endif /* _TFA9872_TFAFIELDNAMES_H */ diff --git a/inc/tfa9873_tfafieldnames.h b/inc/tfa9873_tfafieldnames.h new file mode 100644 index 000000000000..0bd8b999dbb3 --- /dev/null +++ b/inc/tfa9873_tfafieldnames.h @@ -0,0 +1,934 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9873_tfaFieldnames.h + * This file was generated automatically on 10/21/19 at 17:03:34. + * Source file: TFA9873_PRB4_N1A0_I2C_RegisterMap.xlsx + */ + +#ifndef _TFA9873_TFAFIELDNAMES_H +#define _TFA9873_TFAFIELDNAMES_H + + +#define TFA9873_I2CVERSION 28 + +typedef enum Tfa9873BfEnumList { + TFA9873_BF_PWDN = 0x0000, /*!< Powerdown selection */ + TFA9873_BF_I2CR = 0x0010, /*!< I2C reset - auto clear */ + TFA9873_BF_AMPE = 0x0030, /*!< Activate amplifier */ + TFA9873_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ + TFA9873_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9873_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ + TFA9873_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ + TFA9873_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ + TFA9873_BF_ENPLLSYNC = 0x00e0, /*!< Manager control for enabling synchronisation with PLL FS */ + TFA9873_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ + TFA9873_BF_MANSCONF = 0x0120, /*!< I2C configured */ + TFA9873_BF_MUTETO = 0x0160, /*!< Time out SB mute sequence */ + TFA9873_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ + TFA9873_BF_DISFCRBST = 0x01f0, /*!< Disable boost control with FRCBST */ + TFA9873_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ + TFA9873_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9873_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ + TFA9873_BF_REV = 0x030f, /*!< Device revision information */ + TFA9873_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ + TFA9873_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ + TFA9873_BF_MANAOOSC = 0x0460, /*!< Internal osc off in power down mode */ + TFA9873_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ + TFA9873_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ + TFA9873_BF_AUTOFROSEL = 0x04a0, /*!< Override automatic OSC selection mechanism */ + TFA9873_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ + TFA9873_BF_FRCCLKSPKR = 0x0510, /*!< Force active the speaker sub-system clock when in idle power */ + TFA9873_BF_BSTCLKLP = 0x0520, /*!< Boost clock control in low power mode1 */ + TFA9873_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ + TFA9873_BF_CLKCHKLO = 0x0707, /*!< Clock check low threshold */ + TFA9873_BF_CLKCHKHI = 0x0787, /*!< Clock check higher threshold */ + TFA9873_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ + TFA9873_BF_VDDS = 0x1000, /*!< POR */ + TFA9873_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register, clear on read) */ + TFA9873_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register, clear on read) */ + TFA9873_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register, clear on read) */ + TFA9873_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register, clear on read) */ + TFA9873_BF_MANALARM = 0x1050, /*!< Alarm state */ + TFA9873_BF_CLKS = 0x1060, /*!< Clocks stable */ + TFA9873_BF_MTPB = 0x1070, /*!< MTP busy */ + TFA9873_BF_NOCLK = 0x1080, /*!< Lost clock (sticky register, clear on read) */ + TFA9873_BF_TDMERR = 0x10a0, /*!< TDM error */ + TFA9873_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9873_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ + TFA9873_BF_DCDCPC = 0x1120, /*!< Indicates current is max in DC-to-DC converter */ + TFA9873_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ + TFA9873_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ + TFA9873_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ + TFA9873_BF_PLLS = 0x1160, /*!< PLL lock */ + TFA9873_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ + TFA9873_BF_CLKOOR = 0x11c0, /*!< External clock status */ + TFA9873_BF_SWS = 0x11d0, /*!< Amplifier engage */ + TFA9873_BF_AMPS = 0x11e0, /*!< Amplifier enable */ + TFA9873_BF_AREFS = 0x11f0, /*!< References enable */ + TFA9873_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ + TFA9873_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ + TFA9873_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ + TFA9873_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ + TFA9873_BF_OVDS = 0x1380, /*!< OVP alarm */ + TFA9873_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ + TFA9873_BF_ADCCR = 0x13a0, /*!< Control ADC */ + TFA9873_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ + TFA9873_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ + TFA9873_BF_MANOPER = 0x13f0, /*!< Operating state */ + TFA9873_BF_TDMSTAT = 0x1402, /*!< TDM status bits */ + TFA9873_BF_MANSTATE = 0x1433, /*!< Device manager status */ + TFA9873_BF_AMPSTE = 0x1473, /*!< Amplifier control status */ + TFA9873_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ + TFA9873_BF_WAITSYNC = 0x14d0, /*!< CGU and PLL synchronisation status flag from CGU */ + TFA9873_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9873_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9873_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ + TFA9873_BF_TDME = 0x2000, /*!< Enable interface */ + TFA9873_BF_TDMSLOTS = 0x2013, /*!< N-slots in Frame */ + TFA9873_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ + TFA9873_BF_TDMFSLN = 0x2073, /*!< FS length */ + TFA9873_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ + TFA9873_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ + TFA9873_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ + TFA9873_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ + TFA9873_BF_TDMDEL = 0x21e0, /*!< Data delay to FS */ + TFA9873_BF_TDMADJ = 0x21f0, /*!< Data adjustment */ + TFA9873_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ + TFA9873_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ + TFA9873_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ + TFA9873_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ + TFA9873_BF_TDMSPKE = 0x2300, /*!< Control audio TDM channel in 0 */ + TFA9873_BF_TDMDCE = 0x2310, /*!< Control audio TDM channel in 1 */ + TFA9873_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ + TFA9873_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ + TFA9873_BF_TDMSPKS = 0x2603, /*!< TDM slot for sink 0 */ + TFA9873_BF_TDMDCS = 0x2643, /*!< TDM slot for sink 1 */ + TFA9873_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ + TFA9873_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ + TFA9873_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9873_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ + TFA9873_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9873_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ + TFA9873_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9873_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ + TFA9873_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ + TFA9873_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9873_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9873_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ + TFA9873_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9873_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ + TFA9873_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9873_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ + TFA9873_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ + TFA9873_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9873_BF_IEVDDS = 0x4800, /*!< Enable POR */ + TFA9873_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ + TFA9873_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9873_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ + TFA9873_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9873_BF_IEMANALARM = 0x4850, /*!< Enable manager alarm state */ + TFA9873_BF_IETDMER = 0x4860, /*!< Enable TDM error */ + TFA9873_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9873_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ + TFA9873_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ + TFA9873_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9873_BF_IPOOCPR = 0x4c30, /*!< Polarity OCP alarm */ + TFA9873_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9873_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ + TFA9873_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ + TFA9873_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9873_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ + TFA9873_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ + TFA9873_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ + TFA9873_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9873_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ + TFA9873_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ + TFA9873_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ + TFA9873_BF_DPSA = 0x5170, /*!< Enable DPSA */ + TFA9873_BF_BYHWCLIP = 0x5240, /*!< Bypass hardware clipper */ + TFA9873_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ + TFA9873_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ + TFA9873_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ + TFA9873_BF_BYPDLYLINE = 0x52f0, /*!< Bypass the interpolator delay line */ + TFA9873_BF_TDMSPKG = 0x5f63, /*!< Total gain depending on INPLEV setting (channel 0) */ + TFA9873_BF_IPM = 0x60e1, /*!< Idle power mode control */ + TFA9873_BF_LNMODE = 0x62e1, /*!< Ctrl select mode */ + TFA9873_BF_LPM1MODE = 0x64e1, /*!< Low power mode control */ + TFA9873_BF_TDMSRCMAP = 0x6802, /*!< TDM source mapping */ + TFA9873_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ + TFA9873_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ + TFA9873_BF_TDMSRCACLIP = 0x6871, /*!< Clip information (analog /digital) for source0 */ + TFA9873_BF_TDMSRCBCLIP = 0x6891, /*!< Clip information (analog /digital) for source1 */ + TFA9873_BF_LP0 = 0x6e00, /*!< Idle power mode */ + TFA9873_BF_LP1 = 0x6e10, /*!< Low power mode 1 detection */ + TFA9873_BF_LA = 0x6e20, /*!< Low amplitude detection */ + TFA9873_BF_VDDPH = 0x6e30, /*!< Vddp greater than Vbat */ + TFA9873_BF_DELCURCOMP = 0x6f02, /*!< Delay to allign compensation signal with current sense signal */ + TFA9873_BF_SIGCURCOMP = 0x6f40, /*!< Polarity of compensation for current sense */ + TFA9873_BF_ENCURCOMP = 0x6f50, /*!< Enable current sense compensation */ + TFA9873_BF_LVLCLPPWM = 0x6f72, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ + TFA9873_BF_DCMCC = 0x7003, /*!< Max coil current */ + TFA9873_BF_DCCV = 0x7041, /*!< Slope compensation current, represents LxF (inductance x frequency) */ + TFA9873_BF_DCIE = 0x7060, /*!< Adaptive boost mode */ + TFA9873_BF_DCSR = 0x7070, /*!< Soft ramp up/down */ + TFA9873_BF_DCOVL = 0x7085, /*!< Threshold level to activate active overshoot control */ + TFA9873_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ + TFA9873_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ + TFA9873_BF_DCDYFSW = 0x7420, /*!< Disables the dynamic frequency switching due to flag_voutcomp86/93 */ + TFA9873_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ + TFA9873_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9873_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ + TFA9873_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ + TFA9873_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9873_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9873_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ + TFA9873_BF_ENBSTFLT = 0x7620, /*!< Enable the boost filter */ + TFA9873_BF_DCVOF = 0x7635, /*!< First boost voltage level */ + TFA9873_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ + TFA9873_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ + TFA9873_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9873_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9873_BF_MTPADDR = 0xa302, /*!< MTP address from I2C register for read/writing mtp in manual single word mode */ + TFA9873_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9873_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9873_BF_MTPWRMSB = 0xa70f, /*!< MSB word of write data for MTP manual write */ + TFA9873_BF_MTPWRLSB = 0xa80f, /*!< LSB word of write data for MTP manual write */ + TFA9873_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9873_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9873_BF_PLLINSI = 0xcd05, /*!< PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1 */ + TFA9873_BF_PLLINSP = 0xcd64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9873_BF_PLLINSR = 0xcdb3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9873_BF_PLLBDSEL = 0xcdf0, /*!< PLL bandwidth selection control, USE WITH CAUTION */ + TFA9873_BF_PLLNDEC = 0xce09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873_BF_PLLMDECM = 0xcea0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873_BF_PLLBP = 0xceb0, /*!< PLL bypass control during functional mode */ + TFA9873_BF_PLLDI = 0xcec0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873_BF_PLLDO = 0xced0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873_BF_PLLCLKSTB = 0xcee0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873_BF_PLLFRM = 0xcef0, /*!< PLL free running mode control in functional mode */ + TFA9873_BF_PLLMDECL = 0xcf0f, /*!< Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1 */ + TFA9873_BF_PLLPDEC = 0xd006, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873_BF_PLLDCTRL = 0xd070, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ + TFA9873_BF_PLLLIMOFF = 0xd090, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ + TFA9873_BF_PLLSTRTM = 0xd0a2, /*!< PLL startup time selection control */ + TFA9873_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ + TFA9873_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ + TFA9873_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9873_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9873_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9873_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9873_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9873_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9873_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ +} Tfa9873BfEnumList_t; +#define TFA9873_NAMETABLE static tfaBfName_t Tfa9873DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown selection , */\ + { 0x10, "I2CR"}, /* I2C reset - auto clear , */\ + { 0x30, "AMPE"}, /* Activate amplifier , */\ + { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0x90, "FSSSEL"}, /* Audio sample reference , */\ + { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xc0, "TSTOCP"}, /* OCP testing control , */\ + { 0xe0, "ENPLLSYNC"}, /* Manager control for enabling synchronisation with PLL FS, */\ + { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ + { 0x120, "MANSCONF"}, /* I2C configured , */\ + { 0x160, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ + { 0x1f0, "DISFCRBST"}, /* Disable boost control with FRCBST , */\ + { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ + { 0x30f, "REV"}, /* Device revision information , */\ + { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ + { 0x460, "MANAOOSC"}, /* Internal osc off in power down mode , */\ + { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "AUTOFROSEL"}, /* Override automatic OSC selection mechanism , */\ + { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "FRCCLKSPKR"}, /* Force active the speaker sub-system clock when in idle power, */\ + { 0x520, "BSTCLKLP"}, /* Boost clock control in low power mode1 , */\ + { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ + { 0x707, "CLKCHKLO"}, /* Clock check low threshold , */\ + { 0x787, "CLKCHKHI"}, /* Clock check higher threshold , */\ + { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1020, "OTDS"}, /* OTP alarm (sticky register, clear on read) , */\ + { 0x1030, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1040, "UVDS"}, /* UVP alarm (sticky register, clear on read) , */\ + { 0x1050, "MANALARM"}, /* Alarm state , */\ + { 0x1060, "CLKS"}, /* Clocks stable , */\ + { 0x1070, "MTPB"}, /* MTP busy , */\ + { 0x1080, "NOCLK"}, /* Lost clock (sticky register, clear on read) , */\ + { 0x10a0, "TDMERR"}, /* TDM error , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "DCDCPC"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1160, "PLLS"}, /* PLL lock , */\ + { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ + { 0x11c0, "CLKOOR"}, /* External clock status , */\ + { 0x11d0, "SWS"}, /* Amplifier engage , */\ + { 0x11e0, "AMPS"}, /* Amplifier enable , */\ + { 0x11f0, "AREFS"}, /* References enable , */\ + { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ + { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ + { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ + { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ + { 0x1380, "OVDS"}, /* OVP alarm , */\ + { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ + { 0x13a0, "ADCCR"}, /* Control ADC , */\ + { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ + { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x13f0, "MANOPER"}, /* Operating state , */\ + { 0x1402, "TDMSTAT"}, /* TDM status bits , */\ + { 0x1433, "MANSTATE"}, /* Device manager status , */\ + { 0x1473, "AMPSTE"}, /* Amplifier control status , */\ + { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x14d0, "WAITSYNC"}, /* CGU and PLL synchronisation status flag from CGU , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2000, "TDME"}, /* Enable interface , */\ + { 0x2013, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2073, "TDMFSLN"}, /* FS length , */\ + { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ + { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ + { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x21e0, "TDMDEL"}, /* Data delay to FS , */\ + { 0x21f0, "TDMADJ"}, /* Data adjustment , */\ + { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ + { 0x2300, "TDMSPKE"}, /* Control audio TDM channel in 0 , */\ + { 0x2310, "TDMDCE"}, /* Control audio TDM channel in 1 , */\ + { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "TDMSPKS"}, /* TDM slot for sink 0 , */\ + { 0x2643, "TDMDCS"}, /* TDM slot for sink 1 , */\ + { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ + { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ + { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4800, "IEVDDS"}, /* Enable POR , */\ + { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IEMANALARM"}, /* Enable manager alarm state , */\ + { 0x4860, "IETDMER"}, /* Enable TDM error , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ + { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOCPR"}, /* Polarity OCP alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ + { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ + { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ + { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ + { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ + { 0x5170, "DPSA"}, /* Enable DPSA , */\ + { 0x5240, "BYHWCLIP"}, /* Bypass hardware clipper , */\ + { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ + { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ + { 0x52f0, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ + { 0x5f63, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x60e1, "IPM"}, /* Idle power mode control , */\ + { 0x62e1, "LNMODE"}, /* Ctrl select mode , */\ + { 0x64e1, "LPM1MODE"}, /* Low power mode control , */\ + { 0x6802, "TDMSRCMAP"}, /* TDM source mapping , */\ + { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ + { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ + { 0x6871, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ + { 0x6891, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ + { 0x6e00, "LP0"}, /* Idle power mode , */\ + { 0x6e10, "LP1"}, /* Low power mode 1 detection , */\ + { 0x6e20, "LA"}, /* Low amplitude detection , */\ + { 0x6e30, "VDDPH"}, /* Vddp greater than Vbat , */\ + { 0x6f02, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ + { 0x6f50, "ENCURCOMP"}, /* Enable current sense compensation , */\ + { 0x6f72, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7003, "DCMCC"}, /* Max coil current , */\ + { 0x7041, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ + { 0x7060, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7070, "DCSR"}, /* Soft ramp up/down , */\ + { 0x7085, "DCOVL"}, /* Threshold level to activate active overshoot control, */\ + { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ + { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7420, "DCDYFSW"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ + { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7620, "ENBSTFLT"}, /* Enable the boost filter , */\ + { 0x7635, "DCVOF"}, /* First boost voltage level , */\ + { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ + { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "MTPADDR"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "MTPWRMSB"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "MTPWRLSB"}, /* LSB word of write data for MTP manual write , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xcd05, "PLLINSI"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ + { 0xcd64, "PLLINSP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdb3, "PLLINSR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdf0, "PLLBDSEL"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ + { 0xce09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcea0, "PLLMDECM"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xceb0, "PLLBP"}, /* PLL bypass control during functional mode , */\ + { 0xcec0, "PLLDI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xced0, "PLLDO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcee0, "PLLCLKSTB"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcef0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ + { 0xcf0f, "PLLMDECL"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ + { 0xd006, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd070, "PLLDCTRL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xd090, "PLLLIMOFF"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xd0a2, "PLLSTRTM"}, /* PLL startup time selection control , */\ + { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ + { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9873_BITNAMETABLE static tfaBfName_t Tfa9873BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown selection , */\ + { 0x10, "reset"}, /* I2C reset - auto clear , */\ + { 0x30, "enbl_amplifier"}, /* Activate amplifier , */\ + { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ + { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xc0, "test_ocp"}, /* OCP testing control , */\ + { 0xd0, "sel_man_wait_time"}, /* Manager wait time selection control , */\ + { 0xe0, "enbl_pll_synchronisation"}, /* Manager control for enabling synchronisation with PLL FS, */\ + { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ + { 0x120, "src_set_configured"}, /* I2C configured , */\ + { 0x160, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ + { 0x1f0, "disable_frcbst"}, /* Disable boost control with FRCBST , */\ + { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ + { 0x30f, "device_rev"}, /* Device revision information , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ + { 0x460, "enbl_osc_auto_off"}, /* Internal osc off in power down mode , */\ + { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "override_auto_sel_osc"}, /* Override automatic OSC selection mechanism , */\ + { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "force_spkr_clk"}, /* Force active the speaker sub-system clock when in idle power, */\ + { 0x520, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ + { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ + { 0x707, "clkchk_th_lo"}, /* Clock check low threshold , */\ + { 0x787, "clkchk_th_hi"}, /* Clock check higher threshold , */\ + { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register, clear on read) , */\ + { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register, clear on read) , */\ + { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1080, "flag_lost_clk"}, /* Lost clock (sticky register, clear on read) , */\ + { 0x10a0, "flag_tdm_error"}, /* TDM error , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ + { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ + { 0x11c0, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ + { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ + { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ + { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ + { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ + { 0x1402, "flag_tdm_status"}, /* TDM status bits , */\ + { 0x1433, "man_state"}, /* Device manager status , */\ + { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ + { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x14d0, "flag_waiting_for_sync"}, /* CGU and PLL synchronisation status flag from CGU , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2000, "tdm_enable"}, /* Enable interface , */\ + { 0x2013, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ + { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ + { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x21e0, "tdm_data_delay"}, /* Data delay to FS , */\ + { 0x21f0, "tdm_data_adjustment"}, /* Data adjustment , */\ + { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ + { 0x2300, "tdm_sink0_enable"}, /* Control audio TDM channel in 0 , */\ + { 0x2310, "tdm_sink1_enable"}, /* Control audio TDM channel in 1 , */\ + { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ + { 0x2643, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ + { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ + { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ + { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ + { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable manager alarm state , */\ + { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ + { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity OCP alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ + { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ + { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ + { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ + { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0x5240, "bypasshwclip"}, /* Bypass hardware clipper , */\ + { 0x5257, "gain"}, /* Amplifier gain , */\ + { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ + { 0x52f0, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA release time , */\ + { 0x5350, "bypass_lp"}, /* Bypass the low pass filter inside temperature sensor, */\ + { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x5463, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit DAC , */\ + { 0x5500, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5513, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5552, "dpsa_drive"}, /* Drive setting (binary coded) , */\ + { 0x5581, "ctrlloop_vstress_select"}, /* GO2 capacitor stress selector for control loop , */\ + { 0x5600, "ref_iref_enbl"}, /* Enable of reference current for OCP , */\ + { 0x5631, "ref_irefdist_set_ctrl"}, /* Scaling of reference current for OCP , */\ + { 0x5652, "ref_irefdist_test_enbl"}, /* Enable of test-function of distribution of reference current, used for OCP. When enabled, the current will to to anamux iso powerstages. Using e.g. 011 it will add the current of powerstage P and N., */\ + { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ + { 0x57b0, "enbl_engage"}, /* Enables/engage the control stage , */\ + { 0x57c0, "enbl_engage_pst"}, /* Enables/engage the power stage , */\ + { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clock PWM is 1/(K*2048*fs), */\ + { 0x5890, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ + { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ + { 0x5900, "sel_pwm_freq"}, /* Control for selection for PWM switching frequency , */\ + { 0x5910, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ + { 0x5f63, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x6005, "idle_power_cal_offset"}, /* Idle power mode detector ctrl cal_offset from gain module , */\ + { 0x6065, "idle_power_zero_lvl"}, /* IIdle power mode zero crossing detection level , */\ + { 0x60e1, "idle_power_mode"}, /* Idle power mode control , */\ + { 0x6105, "idle_power_threshold_lvl"}, /* Idle power mode amplitude trigger level , */\ + { 0x6165, "idle_power_hold_time"}, /* Idle power mode detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x61c0, "disable_idle_power_mode"}, /* Idle power mode detector control , */\ + { 0x6265, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ + { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ + { 0x62e1, "lownoisegain_mode"}, /* Ctrl select mode , */\ + { 0x6305, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ + { 0x6365, "hold_time"}, /* Low noise gain switch ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x6405, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x6465, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ + { 0x64e1, "lpm1_mode"}, /* Low power mode control , */\ + { 0x6505, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ + { 0x6565, "lpm1_hold_time"}, /* Low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x65c0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ + { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC Number of zero current flags to count before going to PFM mode, */\ + { 0x6631, "pfm2pwm_cnt_max"}, /* Number of pulses in PFM mode before going to PWM mode, */\ + { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x66d2, "pfmfreq_limit"}, /* Lowest PFM frequency limit , */\ + { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ + { 0x6713, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ + { 0x6750, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ + { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ + { 0x6802, "tdm_source_mapping"}, /* TDM source mapping , */\ + { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ + { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ + { 0x6871, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ + { 0x6891, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ + { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ + { 0x6b00, "disable_auto_engage"}, /* Disable auto engange , */\ + { 0x6b10, "disable_engage"}, /* Disable engange , */\ + { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x6c69, "spare_out"}, /* spare_out , */\ + { 0x6d0f, "spare_in"}, /* spare_in , */\ + { 0x6e00, "flag_idle_power_mode"}, /* Idle power mode , */\ + { 0x6e10, "flag_lp_detect_mode1"}, /* Low power mode 1 detection , */\ + { 0x6e20, "flag_low_amplitude"}, /* Low amplitude detection , */\ + { 0x6e30, "flag_vddp_gt_vbat"}, /* Vddp greater than Vbat , */\ + { 0x6f02, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ + { 0x6f50, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ + { 0x6f72, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7003, "boost_cur"}, /* Max coil current , */\ + { 0x7041, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ + { 0x7060, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7070, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x7085, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ + { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current DAC , */\ + { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7290, "enbl_bst_windac"}, /* Enable window DAC , */\ + { 0x72a5, "bst_windac"}, /* For testing direct control windac , */\ + { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7350, "disable_artf654484_fix"}, /* Disables the fix for artf654484 (loss of efficiency when Vbst is close to Vbat), */\ + { 0x7420, "disable_dynamic_freq"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ + { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ + { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7620, "enbl_bst_filter"}, /* Enable the boost filter , */\ + { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ + { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ + { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ + { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ + { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ + { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ + { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ + { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ + { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ + { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ + { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ + { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ + { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ + { 0x8887, "vs_gain"}, /* Voltage sense gain , */\ + { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ + { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ + { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ + { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ + { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ + { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ + { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ + { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ + { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ + { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ + { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ + { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ + { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ + { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ + { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_protected registers (default for engineering), */\ + { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xb200, "bypass_ovpglitchfilter"}, /* Bypass glitch filter on over voltage protection signal from analog, */\ + { 0xb210, "enbl_ovp_alarm_state"}, /* Allow manager to go into alarm state when OVP (only when ctrl_vpalarm is 0), */\ + { 0xb220, "amp_in_tristate_when_ovp"}, /* Brings amplifier in tristate when OVP (only when ctrl_enbl_ovp_alarm_state is 0) , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ + { 0xc0f0, "enbl_fro"}, /* Enables FRO8M in I2C direct control mode only , */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc376, "pulselength"}, /* Pulse length setting test input for amplifier (PWM clock 2048/4096 Fs), */\ + { 0xc3e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert PWMbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old OCP (ctrl_reversebst is 0), For new OCP (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ + { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ + { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ + { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 (see Digimux list for details), */\ + { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on VSN/TEST3 , */\ + { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on VSP/TEST4 , */\ + { 0xcd05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ + { 0xcd64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdb3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ + { 0xce09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcea0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xceb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ + { 0xcec0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xced0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcee0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcef0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ + { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ + { 0xd006, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd070, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xd090, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xd0a2, "sel_pll_startup_time"}, /* PLL startup time selection control , */\ + { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xd202, "tsig_freq_msb"}, /* Internal sinus test generator, frequency control msb bits, */\ + { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd283, "tsig_gain"}, /* Test signal gain , */\ + { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd800, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ + { 0xd810, "gainatt_tdm_feedback"}, /* GainAtt feedback to TDM , */\ + { 0xd822, "test_parametric_io"}, /* Test io parametric , */\ + { 0xd861, "test_spare_out1"}, /* Test spare out 1 , */\ + { 0xd880, "bst_dcmbst"}, /* DCM boost , */\ + { 0xd890, "railclamp_disable"}, /* ESD rail clamp control, controls amp and boost rail clamp for ESD, */\ + { 0xd8c3, "test_spare_out2"}, /* Test spare out 1 , */\ + { 0xd900, "enbl_frocal"}, /* Enable FRO calibration , */\ + { 0xd910, "start_fro_calibration"}, /* Start FRO8 Calibration , */\ + { 0xd920, "enbl_irefcal"}, /* Enable IREF calibration , */\ + { 0xd930, "start_iref_calibration"}, /* Start IREF Calibration , */\ + { 0xda00, "fro_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ + { 0xda15, "fro_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ + { 0xda80, "iref_calibration_done"}, /* IREF Calibration done - Read Only , */\ + { 0xda94, "iref_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ + { 0xdae0, "iref_calibration_error"}, /* IREF Calibration done - Read Only , */\ + { 0xe00f, "sw_profile"}, /* Software profile data , */\ + { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf307, "calibr_gain_vs1"}, /* Voltage sense gain when external voltage sensing input is selected, */\ + { 0xf387, "calibr_gain_vs2"}, /* Voltage sense gain when internal voltage sensing input is selected, */\ + { 0xf407, "vs_trim1"}, /* VS Trimming when external voltage sensing input is selected, */\ + { 0xf487, "vs_trim2"}, /* VS Trimming when internal voltage sensing input is selected, */\ + { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ + { 0xf607, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ + { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ + { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ + { 0xff05, "fro_trim"}, /* 8 MHz oscillator trim code , */\ + { 0xff61, "fro_shortnwell"}, /* Short 4 or 6 n-well resistors , */\ + { 0xff81, "fro_boost"}, /* Self bias current selection , */\ + { 0xffa4, "calibr_iref_trim"}, /* Trimming control of reference current for OCP , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa9873_irq { + tfa9873_irq_stvdds = 0, + tfa9873_irq_stbstoc = 1, + tfa9873_irq_stotds = 2, + tfa9873_irq_stocpr = 3, + tfa9873_irq_stuvds = 4, + tfa9873_irq_stmanalarm = 5, + tfa9873_irq_sttdmer = 6, + tfa9873_irq_stnoclk = 7, + tfa9873_irq_max = 8, + tfa9873_irq_all = -1 /* all irqs */}; + +#define TFA9873_IRQ_NAMETABLE static tfaIrqName_t Tfa9873IrqNames[] = {\ + { 0, "STVDDS"},\ + { 1, "STBSTOC"},\ + { 2, "STOTDS"},\ + { 3, "STOCPR"},\ + { 4, "STUVDS"},\ + { 5, "STMANALARM"},\ + { 6, "STTDMER"},\ + { 7, "STNOCLK"},\ + { 8, "8"},\ +}; +#endif /* _TFA9873_TFAFIELDNAMES_H */ diff --git a/inc/tfa9873_tfafieldnames_B0.h b/inc/tfa9873_tfafieldnames_B0.h new file mode 100644 index 000000000000..1d2dbe6b0001 --- /dev/null +++ b/inc/tfa9873_tfafieldnames_B0.h @@ -0,0 +1,933 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + + +#ifndef _TFA9873_TFAFIELDNAMES_B0_H +#define _TFA9873_TFAFIELDNAMES_B0_H + + +#define TFA9873B0_I2CVERSION 16 + +typedef enum Tfa9873B0BfEnumList { + TFA9873B0_BF_PWDN = 0x0000, /*!< Powerdown selection */ + TFA9873B0_BF_I2CR = 0x0010, /*!< I2C reset - auto clear */ + TFA9873B0_BF_AMPE = 0x0030, /*!< Activate amplifier */ + TFA9873B0_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ + TFA9873B0_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9873B0_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ + TFA9873B0_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ + TFA9873B0_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ + TFA9873B0_BF_ENPLLSYNC = 0x00e0, /*!< Manager control for enabling synchronisation with PLL FS */ + TFA9873B0_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ + TFA9873B0_BF_MANSCONF = 0x0120, /*!< I2C configured */ + TFA9873B0_BF_MUTETO = 0x0160, /*!< Time out SB mute sequence */ + TFA9873B0_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ + TFA9873B0_BF_DISFCRBST = 0x01f0, /*!< Disable boost control with FRCBST */ + TFA9873B0_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ + TFA9873B0_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9873B0_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ + TFA9873B0_BF_REV = 0x030f, /*!< Device revision information */ + TFA9873B0_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ + TFA9873B0_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ + TFA9873B0_BF_MANAOOSC = 0x0460, /*!< Internal osc off in power down mode */ + TFA9873B0_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ + TFA9873B0_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ + TFA9873B0_BF_AUTOFROSEL = 0x04a0, /*!< Override automatic OSC selection mechanism */ + TFA9873B0_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ + TFA9873B0_BF_FRCCLKSPKR = 0x0510, /*!< Force active the speaker sub-system clock when in idle power */ + TFA9873B0_BF_BSTCLKLP = 0x0520, /*!< Boost clock control in low power mode1 */ + TFA9873B0_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ + TFA9873B0_BF_CLKCHKLO = 0x0707, /*!< Clock check low threshold */ + TFA9873B0_BF_CLKCHKHI = 0x0787, /*!< Clock check higher threshold */ + TFA9873B0_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ + TFA9873B0_BF_VDDS = 0x1000, /*!< POR */ + TFA9873B0_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register, clear on read) */ + TFA9873B0_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register, clear on read) */ + TFA9873B0_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register, clear on read) */ + TFA9873B0_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register, clear on read) */ + TFA9873B0_BF_MANALARM = 0x1050, /*!< Alarm state */ + TFA9873B0_BF_CLKS = 0x1060, /*!< Clocks stable */ + TFA9873B0_BF_MTPB = 0x1070, /*!< MTP busy */ + TFA9873B0_BF_NOCLK = 0x1080, /*!< Lost clock (sticky register, clear on read) */ + TFA9873B0_BF_TDMERR = 0x10a0, /*!< TDM error */ + TFA9873B0_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9873B0_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ + TFA9873B0_BF_DCDCPC = 0x1120, /*!< Indicates current is max in DC-to-DC converter */ + TFA9873B0_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ + TFA9873B0_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ + TFA9873B0_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ + TFA9873B0_BF_PLLS = 0x1160, /*!< PLL lock */ + TFA9873B0_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ + TFA9873B0_BF_CLKOOR = 0x11c0, /*!< External clock status */ + TFA9873B0_BF_SWS = 0x11d0, /*!< Amplifier engage */ + TFA9873B0_BF_AMPS = 0x11e0, /*!< Amplifier enable */ + TFA9873B0_BF_AREFS = 0x11f0, /*!< References enable */ + TFA9873B0_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ + TFA9873B0_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ + TFA9873B0_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ + TFA9873B0_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ + TFA9873B0_BF_OVDS = 0x1380, /*!< OVP alarm */ + TFA9873B0_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ + TFA9873B0_BF_ADCCR = 0x13a0, /*!< Control ADC */ + TFA9873B0_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ + TFA9873B0_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ + TFA9873B0_BF_MANOPER = 0x13f0, /*!< Operating state */ + TFA9873B0_BF_TDMSTAT = 0x1402, /*!< TDM status bits */ + TFA9873B0_BF_MANSTATE = 0x1433, /*!< Device manager status */ + TFA9873B0_BF_AMPSTE = 0x1473, /*!< Amplifier control status */ + TFA9873B0_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ + TFA9873B0_BF_WAITSYNC = 0x14d0, /*!< CGU and PLL synchronisation status flag from CGU */ + TFA9873B0_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9873B0_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9873B0_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ + TFA9873B0_BF_TDME = 0x2000, /*!< Enable interface */ + TFA9873B0_BF_TDMSLOTS = 0x2013, /*!< N-slots in Frame */ + TFA9873B0_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ + TFA9873B0_BF_TDMFSLN = 0x2073, /*!< FS length */ + TFA9873B0_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ + TFA9873B0_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ + TFA9873B0_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ + TFA9873B0_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ + TFA9873B0_BF_TDMDEL = 0x21e0, /*!< Data delay to FS */ + TFA9873B0_BF_TDMADJ = 0x21f0, /*!< Data adjustment */ + TFA9873B0_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ + TFA9873B0_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ + TFA9873B0_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ + TFA9873B0_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ + TFA9873B0_BF_TDMSPKE = 0x2300, /*!< Control audio TDM channel in 0 */ + TFA9873B0_BF_TDMDCE = 0x2310, /*!< Control audio TDM channel in 1 */ + TFA9873B0_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ + TFA9873B0_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ + TFA9873B0_BF_TDMSPKS = 0x2603, /*!< TDM slot for sink 0 */ + TFA9873B0_BF_TDMDCS = 0x2643, /*!< TDM slot for sink 1 */ + TFA9873B0_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ + TFA9873B0_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ + TFA9873B0_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9873B0_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ + TFA9873B0_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9873B0_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ + TFA9873B0_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9873B0_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ + TFA9873B0_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ + TFA9873B0_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9873B0_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9873B0_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ + TFA9873B0_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9873B0_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ + TFA9873B0_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9873B0_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ + TFA9873B0_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ + TFA9873B0_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9873B0_BF_IEVDDS = 0x4800, /*!< Enable POR */ + TFA9873B0_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ + TFA9873B0_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9873B0_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ + TFA9873B0_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9873B0_BF_IEMANALARM = 0x4850, /*!< Enable manager alarm state */ + TFA9873B0_BF_IETDMER = 0x4860, /*!< Enable TDM error */ + TFA9873B0_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9873B0_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ + TFA9873B0_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ + TFA9873B0_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9873B0_BF_IPOOCPR = 0x4c30, /*!< Polarity OCP alarm */ + TFA9873B0_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9873B0_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ + TFA9873B0_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ + TFA9873B0_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9873B0_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ + TFA9873B0_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ + TFA9873B0_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ + TFA9873B0_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9873B0_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ + TFA9873B0_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ + TFA9873B0_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ + TFA9873B0_BF_DPSA = 0x5170, /*!< Enable DPSA */ + TFA9873B0_BF_BYHWCLIP = 0x5240, /*!< Bypass hardware clipper */ + TFA9873B0_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ + TFA9873B0_BF_BYPDLYLINE = 0x52f0, /*!< Bypass the interpolator delay line */ + TFA9873B0_BF_SLOPEE = 0x55a0, /*!< Enables slope control */ + TFA9873B0_BF_SLOPESET = 0x55b0, /*!< Slope speed setting */ + TFA9873B0_BF_PWMFREQ = 0x5900, /*!< Control for selection for PWM switching frequency */ + TFA9873B0_BF_TDMSPKG = 0x5f63, /*!< Total gain depending on INPLEV setting (channel 0) */ + TFA9873B0_BF_IPM = 0x60e1, /*!< Idle power mode control */ + TFA9873B0_BF_LNMODE = 0x62e1, /*!< Ctrl select mode */ + TFA9873B0_BF_LPM1MODE = 0x64e1, /*!< Low power mode control */ + TFA9873B0_BF_TDMSRCMAP = 0x6802, /*!< TDM source mapping */ + TFA9873B0_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ + TFA9873B0_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ + TFA9873B0_BF_TDMSRCACLIP = 0x6871, /*!< Clip information (analog /digital) for source0 */ + TFA9873B0_BF_TDMSRCBCLIP = 0x6891, /*!< Clip information (analog /digital) for source1 */ + TFA9873B0_BF_LP0 = 0x6e00, /*!< Idle power mode */ + TFA9873B0_BF_LP1 = 0x6e10, /*!< Low power mode 1 detection */ + TFA9873B0_BF_LA = 0x6e20, /*!< Low amplitude detection */ + TFA9873B0_BF_VDDPH = 0x6e30, /*!< Vddp greater than Vbat */ + TFA9873B0_BF_DELCURCOMP = 0x6f02, /*!< Delay to allign compensation signal with current sense signal */ + TFA9873B0_BF_SIGCURCOMP = 0x6f40, /*!< Polarity of compensation for current sense */ + TFA9873B0_BF_ENCURCOMP = 0x6f50, /*!< Enable current sense compensation */ + TFA9873B0_BF_LVLCLPPWM = 0x6f72, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ + TFA9873B0_BF_DCMCC = 0x7003, /*!< Max coil current */ + TFA9873B0_BF_DCCV = 0x7041, /*!< Slope compensation current, represents LxF (inductance x frequency) */ + TFA9873B0_BF_DCIE = 0x7060, /*!< Adaptive boost mode */ + TFA9873B0_BF_DCSR = 0x7070, /*!< Soft ramp up/down */ + TFA9873B0_BF_DCOVL = 0x7085, /*!< Threshold level to activate active overshoot control */ + TFA9873B0_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ + TFA9873B0_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ + TFA9873B0_BF_DCDYFSW = 0x7420, /*!< Disables the dynamic frequency switching due to flag_voutcomp86/93 */ + TFA9873B0_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ + TFA9873B0_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9873B0_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ + TFA9873B0_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ + TFA9873B0_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9873B0_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9873B0_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ + TFA9873B0_BF_ENBSTFLT = 0x7620, /*!< Enable the boost filter */ + TFA9873B0_BF_DCVOF = 0x7635, /*!< First boost voltage level */ + TFA9873B0_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ + TFA9873B0_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ + TFA9873B0_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9873B0_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9873B0_BF_MTPADDR = 0xa302, /*!< MTP address from I2C register for read/writing mtp in manual single word mode */ + TFA9873B0_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9873B0_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9873B0_BF_MTPWRMSB = 0xa70f, /*!< MSB word of write data for MTP manual write */ + TFA9873B0_BF_MTPWRLSB = 0xa80f, /*!< LSB word of write data for MTP manual write */ + TFA9873B0_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9873B0_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9873B0_BF_PLLINSI = 0xcd05, /*!< PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1 */ + TFA9873B0_BF_PLLINSP = 0xcd64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9873B0_BF_PLLINSR = 0xcdb3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9873B0_BF_PLLBDSEL = 0xcdf0, /*!< PLL bandwidth selection control, USE WITH CAUTION */ + TFA9873B0_BF_PLLNDEC = 0xce09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873B0_BF_PLLMDECM = 0xcea0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873B0_BF_PLLBP = 0xceb0, /*!< PLL bypass control during functional mode */ + TFA9873B0_BF_PLLDI = 0xcec0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873B0_BF_PLLDO = 0xced0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873B0_BF_PLLCLKSTB = 0xcee0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873B0_BF_PLLFRM = 0xcef0, /*!< PLL free running mode control in functional mode */ + TFA9873B0_BF_PLLMDECL = 0xcf0f, /*!< Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1 */ + TFA9873B0_BF_PLLPDEC = 0xd006, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9873B0_BF_PLLDCTRL = 0xd070, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ + TFA9873B0_BF_PLLLIMOFF = 0xd090, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ + TFA9873B0_BF_PLLSTRTM = 0xd0a2, /*!< PLL startup time selection control */ + TFA9873B0_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ + TFA9873B0_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ + TFA9873B0_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9873B0_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9873B0_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9873B0_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9873B0_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9873B0_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9873B0_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ +} Tfa9873B0BfEnumList_t; +#define TFA9873B0_NAMETABLE static tfaBfName_t Tfa9873B0DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown selection , */\ + { 0x10, "I2CR"}, /* I2C reset - auto clear , */\ + { 0x30, "AMPE"}, /* Activate amplifier , */\ + { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0x90, "FSSSEL"}, /* Audio sample reference , */\ + { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xc0, "TSTOCP"}, /* OCP testing control , */\ + { 0xe0, "ENPLLSYNC"}, /* Manager control for enabling synchronisation with PLL FS, */\ + { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ + { 0x120, "MANSCONF"}, /* I2C configured , */\ + { 0x160, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ + { 0x1f0, "DISFCRBST"}, /* Disable boost control with FRCBST , */\ + { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ + { 0x30f, "REV"}, /* Device revision information , */\ + { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ + { 0x460, "MANAOOSC"}, /* Internal osc off in power down mode , */\ + { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "AUTOFROSEL"}, /* Override automatic OSC selection mechanism , */\ + { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "FRCCLKSPKR"}, /* Force active the speaker sub-system clock when in idle power, */\ + { 0x520, "BSTCLKLP"}, /* Boost clock control in low power mode1 , */\ + { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ + { 0x707, "CLKCHKLO"}, /* Clock check low threshold , */\ + { 0x787, "CLKCHKHI"}, /* Clock check higher threshold , */\ + { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1020, "OTDS"}, /* OTP alarm (sticky register, clear on read) , */\ + { 0x1030, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1040, "UVDS"}, /* UVP alarm (sticky register, clear on read) , */\ + { 0x1050, "MANALARM"}, /* Alarm state , */\ + { 0x1060, "CLKS"}, /* Clocks stable , */\ + { 0x1070, "MTPB"}, /* MTP busy , */\ + { 0x1080, "NOCLK"}, /* Lost clock (sticky register, clear on read) , */\ + { 0x10a0, "TDMERR"}, /* TDM error , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "DCDCPC"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1160, "PLLS"}, /* PLL lock , */\ + { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ + { 0x11c0, "CLKOOR"}, /* External clock status , */\ + { 0x11d0, "SWS"}, /* Amplifier engage , */\ + { 0x11e0, "AMPS"}, /* Amplifier enable , */\ + { 0x11f0, "AREFS"}, /* References enable , */\ + { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ + { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ + { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ + { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ + { 0x1380, "OVDS"}, /* OVP alarm , */\ + { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ + { 0x13a0, "ADCCR"}, /* Control ADC , */\ + { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ + { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x13f0, "MANOPER"}, /* Operating state , */\ + { 0x1402, "TDMSTAT"}, /* TDM status bits , */\ + { 0x1433, "MANSTATE"}, /* Device manager status , */\ + { 0x1473, "AMPSTE"}, /* Amplifier control status , */\ + { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x14d0, "WAITSYNC"}, /* CGU and PLL synchronisation status flag from CGU , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2000, "TDME"}, /* Enable interface , */\ + { 0x2013, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2073, "TDMFSLN"}, /* FS length , */\ + { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ + { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ + { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x21e0, "TDMDEL"}, /* Data delay to FS , */\ + { 0x21f0, "TDMADJ"}, /* Data adjustment , */\ + { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ + { 0x2300, "TDMSPKE"}, /* Control audio TDM channel in 0 , */\ + { 0x2310, "TDMDCE"}, /* Control audio TDM channel in 1 , */\ + { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "TDMSPKS"}, /* TDM slot for sink 0 , */\ + { 0x2643, "TDMDCS"}, /* TDM slot for sink 1 , */\ + { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ + { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ + { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4800, "IEVDDS"}, /* Enable POR , */\ + { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IEMANALARM"}, /* Enable manager alarm state , */\ + { 0x4860, "IETDMER"}, /* Enable TDM error , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ + { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOCPR"}, /* Polarity OCP alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ + { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ + { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ + { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ + { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ + { 0x5170, "DPSA"}, /* Enable DPSA , */\ + { 0x5240, "BYHWCLIP"}, /* Bypass hardware clipper , */\ + { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x52f0, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ + { 0x55a0, "SLOPEE"}, /* Enables slope control , */\ + { 0x55b0, "SLOPESET"}, /* Slope speed setting , */\ + { 0x5900, "PWMFREQ"}, /* Control for selection for PWM switching frequency , */\ + { 0x5f63, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x60e1, "IPM"}, /* Idle power mode control , */\ + { 0x62e1, "LNMODE"}, /* Ctrl select mode , */\ + { 0x64e1, "LPM1MODE"}, /* Low power mode control , */\ + { 0x6802, "TDMSRCMAP"}, /* TDM source mapping , */\ + { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ + { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ + { 0x6871, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ + { 0x6891, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ + { 0x6e00, "LP0"}, /* Idle power mode , */\ + { 0x6e10, "LP1"}, /* Low power mode 1 detection , */\ + { 0x6e20, "LA"}, /* Low amplitude detection , */\ + { 0x6e30, "VDDPH"}, /* Vddp greater than Vbat , */\ + { 0x6f02, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ + { 0x6f50, "ENCURCOMP"}, /* Enable current sense compensation , */\ + { 0x6f72, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7003, "DCMCC"}, /* Max coil current , */\ + { 0x7041, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ + { 0x7060, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7070, "DCSR"}, /* Soft ramp up/down , */\ + { 0x7085, "DCOVL"}, /* Threshold level to activate active overshoot control, */\ + { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ + { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7420, "DCDYFSW"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ + { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7620, "ENBSTFLT"}, /* Enable the boost filter , */\ + { 0x7635, "DCVOF"}, /* First boost voltage level , */\ + { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ + { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "MTPADDR"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "MTPWRMSB"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "MTPWRLSB"}, /* LSB word of write data for MTP manual write , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xcd05, "PLLINSI"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ + { 0xcd64, "PLLINSP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdb3, "PLLINSR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdf0, "PLLBDSEL"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ + { 0xce09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcea0, "PLLMDECM"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xceb0, "PLLBP"}, /* PLL bypass control during functional mode , */\ + { 0xcec0, "PLLDI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xced0, "PLLDO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcee0, "PLLCLKSTB"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcef0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ + { 0xcf0f, "PLLMDECL"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ + { 0xd006, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd070, "PLLDCTRL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xd090, "PLLLIMOFF"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xd0a2, "PLLSTRTM"}, /* PLL startup time selection control , */\ + { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ + { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9873B0_BITNAMETABLE static tfaBfName_t Tfa9873B0BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown selection , */\ + { 0x10, "reset"}, /* I2C reset - auto clear , */\ + { 0x30, "enbl_amplifier"}, /* Activate amplifier , */\ + { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ + { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xc0, "test_ocp"}, /* OCP testing control , */\ + { 0xd0, "sel_man_wait_time"}, /* Manager wait time selection control , */\ + { 0xe0, "enbl_pll_synchronisation"}, /* Manager control for enabling synchronisation with PLL FS, */\ + { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ + { 0x120, "src_set_configured"}, /* I2C configured , */\ + { 0x160, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ + { 0x1f0, "disable_frcbst"}, /* Disable boost control with FRCBST , */\ + { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ + { 0x30f, "device_rev"}, /* Device revision information , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ + { 0x460, "enbl_osc_auto_off"}, /* Internal osc off in power down mode , */\ + { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "override_auto_sel_osc"}, /* Override automatic OSC selection mechanism , */\ + { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "force_spkr_clk"}, /* Force active the speaker sub-system clock when in idle power, */\ + { 0x520, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ + { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ + { 0x707, "clkchk_th_lo"}, /* Clock check low threshold , */\ + { 0x787, "clkchk_th_hi"}, /* Clock check higher threshold , */\ + { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register, clear on read) , */\ + { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register, clear on read) , */\ + { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1080, "flag_lost_clk"}, /* Lost clock (sticky register, clear on read) , */\ + { 0x10a0, "flag_tdm_error"}, /* TDM error , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ + { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ + { 0x11c0, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ + { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ + { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ + { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ + { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ + { 0x1402, "flag_tdm_status"}, /* TDM status bits , */\ + { 0x1433, "man_state"}, /* Device manager status , */\ + { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ + { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x14d0, "flag_waiting_for_sync"}, /* CGU and PLL synchronisation status flag from CGU , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2000, "tdm_enable"}, /* Enable interface , */\ + { 0x2013, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ + { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ + { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x21e0, "tdm_data_delay"}, /* Data delay to FS , */\ + { 0x21f0, "tdm_data_adjustment"}, /* Data adjustment , */\ + { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ + { 0x2300, "tdm_sink0_enable"}, /* Control audio TDM channel in 0 , */\ + { 0x2310, "tdm_sink1_enable"}, /* Control audio TDM channel in 1 , */\ + { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ + { 0x2643, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ + { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ + { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ + { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ + { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable manager alarm state , */\ + { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ + { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity OCP alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ + { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ + { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ + { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ + { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0x5240, "bypasshwclip"}, /* Bypass hardware clipper , */\ + { 0x5257, "gain"}, /* Amplifier gain , */\ + { 0x52f0, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA release time , */\ + { 0x5350, "bypass_lp"}, /* Bypass the low pass filter inside temperature sensor, */\ + { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x5463, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit DAC , */\ + { 0x54a1, "ref_amp_irefdist_set_ctrl"}, /* Scaling of reference current for amplifier OCP , */\ + { 0x5500, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5513, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5552, "dpsa_drive"}, /* Drive setting (binary coded) , */\ + { 0x5581, "ctrlloop_vstress_select"}, /* GO2 capacitor stress selector for control loop , */\ + { 0x55a0, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x55b0, "ctrl_slope"}, /* Slope speed setting , */\ + { 0x5600, "ref_iref_enbl"}, /* Enable of reference current for OCP , */\ + { 0x5652, "ref_irefdist_test_enbl"}, /* Enable of test-function of distribution of reference current, used for OCP. When enabled, the current will to to anamux iso powerstages. Using e.g. 011 it will add the current of powerstage P and N., */\ + { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ + { 0x57b0, "enbl_engage"}, /* Enables/engage the control stage , */\ + { 0x57c0, "enbl_engage_pst"}, /* Enables/engage the power stage , */\ + { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clock PWM is 1/(K*2048*fs), */\ + { 0x5890, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ + { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ + { 0x5900, "sel_pwm_freq"}, /* Control for selection for PWM switching frequency , */\ + { 0x5910, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ + { 0x5f63, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x6005, "idle_power_cal_offset"}, /* Idle power mode detector ctrl cal_offset from gain module , */\ + { 0x6065, "idle_power_zero_lvl"}, /* IIdle power mode zero crossing detection level , */\ + { 0x60e1, "idle_power_mode"}, /* Idle power mode control , */\ + { 0x6105, "idle_power_threshold_lvl"}, /* Idle power mode amplitude trigger level , */\ + { 0x6165, "idle_power_hold_time"}, /* Idle power mode detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x61c0, "disable_idle_power_mode"}, /* Idle power mode detector control , */\ + { 0x6265, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ + { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ + { 0x62e1, "lownoisegain_mode"}, /* Ctrl select mode , */\ + { 0x6305, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ + { 0x6365, "hold_time"}, /* Low noise gain switch ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x6405, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x6465, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ + { 0x64e1, "lpm1_mode"}, /* Low power mode control , */\ + { 0x6505, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ + { 0x6565, "lpm1_hold_time"}, /* Low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x65c0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ + { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC Number of zero current flags to count before going to PFM mode, */\ + { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x66d2, "pfmfreq_limit"}, /* Lowest PFM frequency limit , */\ + { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ + { 0x6713, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ + { 0x6750, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ + { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ + { 0x6802, "tdm_source_mapping"}, /* TDM source mapping , */\ + { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ + { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ + { 0x6871, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ + { 0x6891, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ + { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ + { 0x6b00, "disable_auto_engage"}, /* Disable auto engange , */\ + { 0x6b10, "disable_engage"}, /* Disable engange , */\ + { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x6c69, "spare_out"}, /* spare_out , */\ + { 0x6d0f, "spare_in"}, /* spare_in , */\ + { 0x6e00, "flag_idle_power_mode"}, /* Idle power mode , */\ + { 0x6e10, "flag_lp_detect_mode1"}, /* Low power mode 1 detection , */\ + { 0x6e20, "flag_low_amplitude"}, /* Low amplitude detection , */\ + { 0x6e30, "flag_vddp_gt_vbat"}, /* Vddp greater than Vbat , */\ + { 0x6f02, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ + { 0x6f50, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ + { 0x6f72, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7003, "boost_cur"}, /* Max coil current , */\ + { 0x7041, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ + { 0x7060, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7070, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x7085, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ + { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current DAC , */\ + { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7290, "enbl_bst_windac"}, /* Enable window DAC , */\ + { 0x72a5, "bst_windac"}, /* For testing direct control windac , */\ + { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7350, "disable_artf654484_fix"}, /* Disables the fix for artf654484 (loss of efficiency when Vbst is close to Vbat), */\ + { 0x7360, "disable_artf676996_fix"}, /* Disables the fix for artf676996 (OCP booster triggered when Vtrgt is just above Vbat), */\ + { 0x7371, "ref_bst_irefdist_set_ctrl"}, /* Scaling of reference current for booster OCP , */\ + { 0x7420, "disable_dynamic_freq"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ + { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ + { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7620, "enbl_bst_filter"}, /* Enable the boost filter , */\ + { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ + { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ + { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ + { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ + { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ + { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ + { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ + { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ + { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ + { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ + { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ + { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ + { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ + { 0x8887, "vs_gain"}, /* Voltage sense gain , */\ + { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ + { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ + { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ + { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ + { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ + { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ + { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ + { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ + { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ + { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ + { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ + { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ + { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ + { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ + { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_protected registers (default for engineering), */\ + { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xb200, "bypass_ovpglitchfilter"}, /* Bypass glitch filter on over voltage protection signal from analog, */\ + { 0xb210, "enbl_ovp_alarm_state"}, /* Allow manager to go into alarm state when OVP (only when ctrl_vpalarm is 0), */\ + { 0xb220, "amp_in_tristate_when_ovp"}, /* Brings amplifier in tristate when OVP (only when ctrl_enbl_ovp_alarm_state is 0) , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ + { 0xc0f0, "enbl_fro"}, /* Enables FRO8M in I2C direct control mode only , */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc376, "pulselength"}, /* Pulse length setting test input for amplifier (PWM clock 2048/4096 Fs), */\ + { 0xc3e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert PWMbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old OCP (ctrl_reversebst is 0), For new OCP (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ + { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ + { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ + { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 (see Digimux list for details), */\ + { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on VSN/TEST3 , */\ + { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on VSP/TEST4 , */\ + { 0xcd05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ + { 0xcd64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdb3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ + { 0xce09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcea0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xceb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ + { 0xcec0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xced0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcee0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcef0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ + { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ + { 0xd006, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd070, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xd090, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xd0a2, "sel_pll_startup_time"}, /* PLL startup time selection control , */\ + { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xd202, "tsig_freq_msb"}, /* Internal sinus test generator, frequency control msb bits, */\ + { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd283, "tsig_gain"}, /* Test signal gain , */\ + { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd800, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ + { 0xd810, "gainatt_tdm_feedback"}, /* GainAtt feedback to TDM , */\ + { 0xd822, "test_parametric_io"}, /* Test io parametric , */\ + { 0xd861, "test_spare_out1"}, /* Test spare out 1 , */\ + { 0xd880, "bst_dcmbst"}, /* DCM boost , */\ + { 0xd8c3, "test_spare_out2"}, /* Test spare out 1 , */\ + { 0xd900, "enbl_frocal"}, /* Enable FRO calibration , */\ + { 0xd910, "start_fro_calibration"}, /* Start FRO8 Calibration , */\ + { 0xd920, "enbl_irefcal"}, /* Enable IREF calibration , */\ + { 0xd930, "start_iref_calibration"}, /* Start IREF Calibration , */\ + { 0xda00, "fro_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ + { 0xda15, "fro_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ + { 0xda80, "iref_calibration_done"}, /* IREF Calibration done - Read Only , */\ + { 0xda94, "iref_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ + { 0xdae0, "iref_calibration_error"}, /* IREF Calibration done - Read Only , */\ + { 0xe00f, "sw_profile"}, /* Software profile data , */\ + { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf307, "calibr_gain_vs1"}, /* Voltage sense gain when external voltage sensing input is selected, */\ + { 0xf387, "calibr_gain_vs2"}, /* Voltage sense gain when internal voltage sensing input is selected, */\ + { 0xf407, "vs_trim1"}, /* VS Trimming when external voltage sensing input is selected, */\ + { 0xf487, "vs_trim2"}, /* VS Trimming when internal voltage sensing input is selected, */\ + { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ + { 0xf607, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ + { 0xf910, "mtp_pll_lut_sel"}, /* PLL lookup table selection control , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ + { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ + { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ + { 0xff05, "fro_trim"}, /* 8 MHz oscillator trim code , */\ + { 0xff61, "fro_shortnwell"}, /* Short 4 or 6 n-well resistors , */\ + { 0xff81, "fro_boost"}, /* Self bias current selection , */\ + { 0xffa4, "calibr_iref_trim"}, /* Trimming control of reference current for OCP , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; +#if 0 +enum tfa9873_irq { + tfa9873_irq_stvdds = 0, + tfa9873_irq_stbstoc = 1, + tfa9873_irq_stotds = 2, + tfa9873_irq_stocpr = 3, + tfa9873_irq_stuvds = 4, + tfa9873_irq_stmanalarm = 5, + tfa9873_irq_sttdmer = 6, + tfa9873_irq_stnoclk = 7, + tfa9873_irq_max = 8, + tfa9873_irq_all = -1 /* all irqs */}; +#endif// +#define TFA9873_IRQ_NAMETABLE static tfaIrqName_t Tfa9873IrqNames[] = {\ + { 0, "STVDDS"},\ + { 1, "STBSTOC"},\ + { 2, "STOTDS"},\ + { 3, "STOCPR"},\ + { 4, "STUVDS"},\ + { 5, "STMANALARM"},\ + { 6, "STTDMER"},\ + { 7, "STNOCLK"},\ + { 8, "8"},\ +}; +#endif /* _TFA9873_TFAFIELDNAMES_B0_H */ diff --git a/inc/tfa9874_tfafieldnames.h b/inc/tfa9874_tfafieldnames.h new file mode 100644 index 000000000000..d32dd40f73cd --- /dev/null +++ b/inc/tfa9874_tfafieldnames.h @@ -0,0 +1,843 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9874_tfaFieldnames_last.h + * This file was generated automatically on 09/28/18 at 11:20:52. + * Source file: TFA9874N1C0_DefaultI2CSettings.xlsx + */ + +#ifndef _TFA9874_TFAFIELDNAMES_H +#define _TFA9874_TFAFIELDNAMES_H + + +#define TFA9874_I2CVERSION 1.16 + +typedef enum Tfa9874BfEnumList { + TFA9874_BF_PWDN = 0x0000, /*!< Powerdown selection */ + TFA9874_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ + TFA9874_BF_AMPE = 0x0030, /*!< Activate Amplifier */ + TFA9874_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ + TFA9874_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9874_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ + TFA9874_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ + TFA9874_BF_MANSCONF = 0x0120, /*!< I2C configured */ + TFA9874_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ + TFA9874_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ + TFA9874_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ + TFA9874_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ + TFA9874_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9874_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ + TFA9874_BF_REV = 0x030f, /*!< Revision info */ + TFA9874_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ + TFA9874_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ + TFA9874_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ + TFA9874_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ + TFA9874_BF_VDDS = 0x1000, /*!< POR */ + TFA9874_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register , clear on read) */ + TFA9874_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register , clear on read) */ + TFA9874_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register , clear on read) */ + TFA9874_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register , clear on read) */ + TFA9874_BF_MANALARM = 0x1050, /*!< Alarm state */ + TFA9874_BF_TDMERR = 0x1060, /*!< TDM error */ + TFA9874_BF_NOCLK = 0x1070, /*!< Lost clock (sticky register , clear on read) */ + TFA9874_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9874_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register , clear on read) */ + TFA9874_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ + TFA9874_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ + TFA9874_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ + TFA9874_BF_PLLS = 0x1160, /*!< PLL lock */ + TFA9874_BF_CLKS = 0x1170, /*!< Clocks stable */ + TFA9874_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ + TFA9874_BF_TDMSTAT = 0x1192, /*!< TDM status bits */ + TFA9874_BF_MTPB = 0x11c0, /*!< MTP busy */ + TFA9874_BF_SWS = 0x11d0, /*!< Amplifier engage */ + TFA9874_BF_AMPS = 0x11e0, /*!< Amplifier enable */ + TFA9874_BF_AREFS = 0x11f0, /*!< References enable */ + TFA9874_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ + TFA9874_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ + TFA9874_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ + TFA9874_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ + TFA9874_BF_OVDS = 0x1380, /*!< OVP alarm */ + TFA9874_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ + TFA9874_BF_ADCCR = 0x13a0, /*!< Control ADC */ + TFA9874_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ + TFA9874_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ + TFA9874_BF_MANOPER = 0x13f0, /*!< Operating state */ + TFA9874_BF_CLKOOR = 0x1420, /*!< External clock status */ + TFA9874_BF_MANSTATE = 0x1433, /*!< Device manager status */ + TFA9874_BF_DCMODE = 0x1471, /*!< DCDC mode status bits */ + TFA9874_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9874_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9874_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ + TFA9874_BF_TDME = 0x2040, /*!< Enable interface */ + TFA9874_BF_TDMMODE = 0x2050, /*!< Slave/master */ + TFA9874_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ + TFA9874_BF_TDMFSLN = 0x2073, /*!< FS length (master mode only) */ + TFA9874_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ + TFA9874_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ + TFA9874_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ + TFA9874_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ + TFA9874_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ + TFA9874_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ + TFA9874_BF_TDMADJ = 0x21f0, /*!< data adjustment */ + TFA9874_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ + TFA9874_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ + TFA9874_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ + TFA9874_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ + TFA9874_BF_TDMSPKE = 0x2300, /*!< Control audio tdm channel in 0 (spkr + dcdc) */ + TFA9874_BF_TDMDCE = 0x2310, /*!< Control audio tdm channel in 1 (dcdc) */ + TFA9874_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ + TFA9874_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ + TFA9874_BF_TDMSPKS = 0x2603, /*!< tdm slot for sink 0 (speaker + dcdc) */ + TFA9874_BF_TDMDCS = 0x2643, /*!< tdm slot for sink 1 (dcdc) */ + TFA9874_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ + TFA9874_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ + TFA9874_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9874_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ + TFA9874_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9874_BF_ISTOCPR = 0x4030, /*!< Status ocp alarm */ + TFA9874_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9874_BF_ISTMANALARM = 0x4050, /*!< Status nanager Alarm state */ + TFA9874_BF_ISTTDMER = 0x4060, /*!< Status tdm error */ + TFA9874_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9874_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9874_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ + TFA9874_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9874_BF_ICLOCPR = 0x4430, /*!< Clear ocp alarm */ + TFA9874_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9874_BF_ICLMANALARM = 0x4450, /*!< clear nanager Alarm state */ + TFA9874_BF_ICLTDMER = 0x4460, /*!< Clear tdm error */ + TFA9874_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9874_BF_IEVDDS = 0x4800, /*!< Enable por */ + TFA9874_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ + TFA9874_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9874_BF_IEOCPR = 0x4830, /*!< Enable ocp alarm */ + TFA9874_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9874_BF_IEMANALARM = 0x4850, /*!< Enable nanager Alarm state */ + TFA9874_BF_IETDMER = 0x4860, /*!< Enable tdm error */ + TFA9874_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9874_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ + TFA9874_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ + TFA9874_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9874_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ + TFA9874_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9874_BF_IPOMANALARM = 0x4c50, /*!< Polarity nanager Alarm state */ + TFA9874_BF_IPOTDMER = 0x4c60, /*!< Polarity tdm error */ + TFA9874_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9874_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time */ + TFA9874_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ + TFA9874_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ + TFA9874_BF_VBATFLTL = 0x5080, /*!< vbat filter limit */ + TFA9874_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9874_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ + TFA9874_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ + TFA9874_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ + TFA9874_BF_DPSA = 0x5170, /*!< Enable DPSA */ + TFA9874_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ + TFA9874_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ + TFA9874_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ + TFA9874_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ + TFA9874_BF_TDMDCG = 0x6123, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ + TFA9874_BF_TDMSPKG = 0x6163, /*!< Total gain depending on INPLEV setting (channel 0) */ + TFA9874_BF_LNMODE = 0x62e1, /*!< ctrl select mode */ + TFA9874_BF_LPM1MODE = 0x64e1, /*!< low power mode control */ + TFA9874_BF_TDMSRCMAP = 0x6802, /*!< tdm source mapping */ + TFA9874_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ + TFA9874_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ + TFA9874_BF_TDMSRCACLIP = 0x6871, /*!< clip information (analog /digital) for source0 */ + TFA9874_BF_TDMSRCBCLIP = 0x6891, /*!< clip information (analog /digital) for source1 */ + TFA9874_BF_LP1 = 0x6e10, /*!< low power mode 1 detection */ + TFA9874_BF_LA = 0x6e20, /*!< low amplitude detection */ + TFA9874_BF_VDDPH = 0x6e30, /*!< vddp greater than vbat */ + TFA9874_BF_DELCURCOMP = 0x6f02, /*!< delay to allign compensation signal with current sense signal */ + TFA9874_BF_SIGCURCOMP = 0x6f40, /*!< polarity of compensation for current sense */ + TFA9874_BF_ENCURCOMP = 0x6f50, /*!< enable current sense compensation */ + TFA9874_BF_LVLCLPPWM = 0x6f72, /*!< set the amount of pwm pulse that may be skipped before clip-flag is triggered */ + TFA9874_BF_DCMCC = 0x7033, /*!< Max coil current */ + TFA9874_BF_DCCV = 0x7071, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ + TFA9874_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ + TFA9874_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ + TFA9874_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ + TFA9874_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ + TFA9874_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ + TFA9874_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9874_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ + TFA9874_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ + TFA9874_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9874_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9874_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ + TFA9874_BF_DCVOF = 0x7635, /*!< First boost voltage level */ + TFA9874_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ + TFA9874_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ + TFA9874_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9874_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9874_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ + TFA9874_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9874_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9874_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9874_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9874_BF_SWPROFIL = 0xee0f, /*!< Software profile data */ + TFA9874_BF_SWVSTEP = 0xef0f, /*!< Software vstep information */ + TFA9874_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9874_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9874_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9874_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9874_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9874_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9874_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ +} Tfa9874BfEnumList_t; +#define TFA9874_NAMETABLE static tfaBfName_t Tfa9874DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown selection , */\ + { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ + { 0x30, "AMPE"}, /* Activate Amplifier , */\ + { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xc0, "TSTOCP"}, /* OCP testing control , */\ + { 0x120, "MANSCONF"}, /* I2C configured , */\ + { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ + { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ + { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ + { 0x30f, "REV"}, /* Revision info , */\ + { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ + { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ + { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ + { 0x1020, "OTDS"}, /* OTP alarm (sticky register , clear on read) , */\ + { 0x1030, "OCDS"}, /* OCP amplifier (sticky register , clear on read), */\ + { 0x1040, "UVDS"}, /* UVP alarm (sticky register , clear on read) , */\ + { 0x1050, "MANALARM"}, /* Alarm state , */\ + { 0x1060, "TDMERR"}, /* TDM error , */\ + { 0x1070, "NOCLK"}, /* Lost clock (sticky register , clear on read) , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active (sticky register , clear on read) , */\ + { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1160, "PLLS"}, /* PLL lock , */\ + { 0x1170, "CLKS"}, /* Clocks stable , */\ + { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ + { 0x1192, "TDMSTAT"}, /* TDM status bits , */\ + { 0x11c0, "MTPB"}, /* MTP busy , */\ + { 0x11d0, "SWS"}, /* Amplifier engage , */\ + { 0x11e0, "AMPS"}, /* Amplifier enable , */\ + { 0x11f0, "AREFS"}, /* References enable , */\ + { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ + { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ + { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ + { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ + { 0x1380, "OVDS"}, /* OVP alarm , */\ + { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ + { 0x13a0, "ADCCR"}, /* Control ADC , */\ + { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ + { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x13f0, "MANOPER"}, /* Operating state , */\ + { 0x1420, "CLKOOR"}, /* External clock status , */\ + { 0x1433, "MANSTATE"}, /* Device manager status , */\ + { 0x1471, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2040, "TDME"}, /* Enable interface , */\ + { 0x2050, "TDMMODE"}, /* Slave/master , */\ + { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2073, "TDMFSLN"}, /* FS length (master mode only) , */\ + { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ + { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ + { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ + { 0x21f0, "TDMADJ"}, /* data adjustment , */\ + { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ + { 0x2300, "TDMSPKE"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ + { 0x2310, "TDMDCE"}, /* Control audio tdm channel in 1 (dcdc) , */\ + { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "TDMSPKS"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ + { 0x2643, "TDMDCS"}, /* tdm slot for sink 1 (dcdc) , */\ + { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOCPR"}, /* Status ocp alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTMANALARM"}, /* Status nanager Alarm state , */\ + { 0x4060, "ISTTDMER"}, /* Status tdm error , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOCPR"}, /* Clear ocp alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLMANALARM"}, /* clear nanager Alarm state , */\ + { 0x4460, "ICLTDMER"}, /* Clear tdm error , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4800, "IEVDDS"}, /* Enable por , */\ + { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOCPR"}, /* Enable ocp alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IEMANALARM"}, /* Enable nanager Alarm state , */\ + { 0x4860, "IETDMER"}, /* Enable tdm error , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ + { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOMANALARM"}, /* Polarity nanager Alarm state , */\ + { 0x4c60, "IPOTDMER"}, /* Polarity tdm error , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x5001, "BSSCR"}, /* Battery Safeguard attack time , */\ + { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ + { 0x5080, "VBATFLTL"}, /* vbat filter limit , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ + { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ + { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ + { 0x5170, "DPSA"}, /* Enable DPSA , */\ + { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ + { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ + { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ + { 0x6123, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x6163, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x62e1, "LNMODE"}, /* ctrl select mode , */\ + { 0x64e1, "LPM1MODE"}, /* low power mode control , */\ + { 0x6802, "TDMSRCMAP"}, /* tdm source mapping , */\ + { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ + { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ + { 0x6871, "TDMSRCACLIP"}, /* clip information (analog /digital) for source0 , */\ + { 0x6891, "TDMSRCBCLIP"}, /* clip information (analog /digital) for source1 , */\ + { 0x6e10, "LP1"}, /* low power mode 1 detection , */\ + { 0x6e20, "LA"}, /* low amplitude detection , */\ + { 0x6e30, "VDDPH"}, /* vddp greater than vbat , */\ + { 0x6f02, "DELCURCOMP"}, /* delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "SIGCURCOMP"}, /* polarity of compensation for current sense , */\ + { 0x6f50, "ENCURCOMP"}, /* enable current sense compensation , */\ + { 0x6f72, "LVLCLPPWM"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7033, "DCMCC"}, /* Max coil current , */\ + { 0x7071, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ + { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ + { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ + { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7635, "DCVOF"}, /* First boost voltage level , */\ + { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ + { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xee0f, "SWPROFIL"}, /* Software profile data , */\ + { 0xef0f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9874_BITNAMETABLE static tfaBfName_t Tfa9874BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown selection , */\ + { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ + { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ + { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xc0, "test_ocp"}, /* OCP testing control , */\ + { 0x120, "src_set_configured"}, /* I2C configured , */\ + { 0x140, "enbl_osc1m_auto_off"}, /* Internal osc off at PWDN , */\ + { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ + { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ + { 0x2d0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ + { 0x30f, "device_rev"}, /* Revision info , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ + { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ + { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register , clear on read) , */\ + { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register , clear on read), */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register , clear on read) , */\ + { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x1060, "flag_tdm_error"}, /* TDM error , */\ + { 0x1070, "flag_lost_clk"}, /* Lost clock (sticky register , clear on read) , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register , clear on read) , */\ + { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ + { 0x1170, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ + { 0x1192, "flag_tdm_status"}, /* TDM status bits , */\ + { 0x11c0, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ + { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ + { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ + { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ + { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ + { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x1433, "man_state"}, /* Device manager status , */\ + { 0x1471, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2040, "tdm_enable"}, /* Enable interface , */\ + { 0x2050, "tdm_mode"}, /* Slave/master , */\ + { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2073, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ + { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ + { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ + { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ + { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ + { 0x2300, "tdm_sink0_enable"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ + { 0x2310, "tdm_sink1_enable"}, /* Control audio tdm channel in 1 (dcdc) , */\ + { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "tdm_sink0_slot"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ + { 0x2643, "tdm_sink1_slot"}, /* tdm slot for sink 1 (dcdc) , */\ + { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_man_alarm_state"}, /* Status nanager Alarm state , */\ + { 0x4060, "int_out_flag_tdm_error"}, /* Status tdm error , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_man_alarm_state"}, /* clear nanager Alarm state , */\ + { 0x4460, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ + { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable nanager Alarm state , */\ + { 0x4860, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ + { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity nanager Alarm state , */\ + { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ + { 0x5080, "vbat_flt_limit"}, /* vbat filter limit , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ + { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ + { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ + { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ + { 0x5257, "gain"}, /* Amplifier gain , */\ + { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ + { 0x5340, "clipfast"}, /* Clock selection for HW clipper for Battery Safeguard, */\ + { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ + { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ + { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ + { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5582, "dpsa_drive"}, /* Drive setting (bin. coded) , */\ + { 0x5690, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ + { 0x56a1, "enbl_odd_up_even_down"}, /* Control for PWM reference sawtooth generartion , */\ + { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ + { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ + { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ + { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5820, "pwm_shape"}, /* PWM shape , */\ + { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ + { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ + { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ + { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ + { 0x6123, "ctrl_attl"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x6163, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x6265, "zero_lvl"}, /* low noise gain switch zero trigger level , */\ + { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ + { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ + { 0x6305, "threshold_lvl"}, /* low noise gain switch trigger level , */\ + { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 zero crossing detection level , */\ + { 0x64e1, "lpm1_mode"}, /* low power mode control , */\ + { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 amplitude trigger level , */\ + { 0x6565, "lpm1_hold_time"}, /* low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ + { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ + { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ + { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ + { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ + { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtred vs unfiltered compare , */\ + { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ + { 0x6802, "tdm_source_mapping"}, /* tdm source mapping , */\ + { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ + { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ + { 0x6871, "tdm_source0_clip_sel"}, /* clip information (analog /digital) for source0 , */\ + { 0x6891, "tdm_source1_clip_sel"}, /* clip information (analog /digital) for source1 , */\ + { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ + { 0x6b00, "disable_auto_engage"}, /* disable auto engange , */\ + { 0x6b10, "disable_engage"}, /* disable engange , */\ + { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x6c69, "spare_out"}, /* spare_out , */\ + { 0x6d0f, "spare_in"}, /* spare_in , */\ + { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ + { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ + { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ + { 0x6f02, "cursense_comp_delay"}, /* delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "cursense_comp_sign"}, /* polarity of compensation for current sense , */\ + { 0x6f50, "enbl_cursense_comp"}, /* enable current sense compensation , */\ + { 0x6f72, "pwms_clip_lvl"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7033, "boost_cur"}, /* Max coil current , */\ + { 0x7071, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ + { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ + { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7360, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ + { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ + { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ + { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ + { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ + { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ + { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ + { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ + { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ + { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ + { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ + { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ + { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ + { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ + { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ + { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ + { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ + { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ + { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ + { 0x8801, "volsense_pwm_sel"}, /* Voltage sense source selection control , */\ + { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ + { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ + { 0x8870, "vs_igen_supply"}, /* Switch internal supply of current generator , */\ + { 0x8887, "vs_gain"}, /* voltage sense gain , */\ + { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ + { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ + { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ + { 0x8d10, "vs_classd_tran_skip"}, /* Skip voltage sense connection during a classD amplifier transition, */\ + { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ + { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ + { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ + { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ + { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ + { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ + { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ + { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ + { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ + { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ + { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ + { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0c0, "use_direct_vs_ctrls"}, /* voltage sense Direct control to overrule several functions for testing, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ + { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ + { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ + { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ + { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ + { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to PDMDAT (see Digimux list for details), */\ + { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ + { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ + { 0xcd05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ + { 0xcd64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ + { 0xcdb3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ + { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ + { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ + { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ + { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ + { 0xcec0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ + { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ + { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ + { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ + { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ + { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ + { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ + { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd283, "tsig_gain"}, /* Test signal gain , */\ + { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xd621, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ + { 0xd641, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ + { 0xd661, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ + { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd800, "source_in_testmode"}, /* tdm source in test mode (return only current and voltage sense), */\ + { 0xd810, "gainatt_feedback"}, /* gainatt feedback to tdm , */\ + { 0xd822, "test_parametric_io"}, /* test io parametric , */\ + { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ + { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ + { 0xd880, "bst_dcmbst"}, /* dcm boost , */\ + { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ + { 0xee0f, "sw_profile"}, /* Software profile data , */\ + { 0xef0f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf169, "spare_mpt1_15_6"}, /* SPARE , */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf2a5, "spare_mtp2_15_10"}, /* SPARE , */\ + { 0xf307, "calibr_gain_vs"}, /* Voltage sense gain , */\ + { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf407, "spare_mtp4_15_0"}, /* SPARE , */\ + { 0xf487, "vs_trim"}, /* VS Trimming , */\ + { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ + { 0xf60f, "spare_mpt6_6_0"}, /* SPARE , */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf770, "spare_mtp7_07"}, /* SPARE , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf7f0, "spare_mtp7_15"}, /* SPARE , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ + { 0xf910, "spare_mtp9_1"}, /* SPARE , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ + { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf980, "spare_mtp9_8"}, /* SPARE , */\ + { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* pwm delay clock auto gating , */\ + { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* ocpclock auto gating , */\ + { 0xf9b0, "mtp_gate_cgu_clock_for_test"}, /* cgu test clock control , */\ + { 0xf9c0, "mtp_tdm_pad_sel"}, /* tdm pad selection , */\ + { 0xf9d2, "spare_mtp9_15_12"}, /* MTP-control FW - See Firmware I2C API document for details, */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ + { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ + { 0xff87, "spare_mtp7_15_08"}, /* SPARE , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa9874_irq { + tfa9874_irq_stvdds = 0, + tfa9874_irq_stbstoc = 1, + tfa9874_irq_stotds = 2, + tfa9874_irq_stocpr = 3, + tfa9874_irq_stuvds = 4, + tfa9874_irq_stmanalarm = 5, + tfa9874_irq_sttdmer = 6, + tfa9874_irq_stnoclk = 7, + tfa9874_irq_max = 8, + tfa9874_irq_all = -1 /* all irqs */}; + +#define TFA9874_IRQ_NAMETABLE static tfaIrqName_t Tfa9874IrqNames[] = {\ + { 0, "STVDDS"},\ + { 1, "STBSTOC"},\ + { 2, "STOTDS"},\ + { 3, "STOCPR"},\ + { 4, "STUVDS"},\ + { 5, "STMANALARM"},\ + { 6, "STTDMER"},\ + { 7, "STNOCLK"},\ + { 8, "8"},\ +}; +#endif /* _TFA9874_TFAFIELDNAMES_H */ diff --git a/inc/tfa9878_tfafieldnames.h b/inc/tfa9878_tfafieldnames.h new file mode 100644 index 000000000000..c604703f0a6c --- /dev/null +++ b/inc/tfa9878_tfafieldnames.h @@ -0,0 +1,980 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9878_tfaFieldnames.h + * This file was generated automatically on 06/28/19 at 10:22:32. + * Source file: TFA9878_PRB3_N1A1_DefaultI2CSettings.xlsx + */ + +#ifndef _TFA9878_TFAFIELDNAMES_H +#define _TFA9878_TFAFIELDNAMES_H + + +#define TFA9878_I2CVERSION 12 + +typedef enum Tfa9878BfEnumList { + TFA9878_BF_PWDN = 0x0000, /*!< Powerdown selection */ + TFA9878_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ + TFA9878_BF_AMPE = 0x0030, /*!< Activate Amplifier */ + TFA9878_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ + TFA9878_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9878_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ + TFA9878_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ + TFA9878_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ + TFA9878_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ + TFA9878_BF_MANSCONF = 0x0120, /*!< I2C configured */ + TFA9878_BF_DCINSEL = 0x0131, /*!< VAMP_OUT2 input selection */ + TFA9878_BF_MUTETO = 0x0160, /*!< Time out SB mute sequence */ + TFA9878_BF_MANROBOD = 0x0170, /*!< Reaction on BOD */ + TFA9878_BF_BODE = 0x0180, /*!< Enable BOD (only in direct control mode) */ + TFA9878_BF_BODHYS = 0x0190, /*!< Enable Hysteresis of BOD */ + TFA9878_BF_BODFILT = 0x01a1, /*!< BOD filter */ + TFA9878_BF_BODTHLVL = 0x01c1, /*!< BOD threshold */ + TFA9878_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ + TFA9878_BF_DISFCRBST = 0x01f0, /*!< disable boost control with FRCBST */ + TFA9878_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ + TFA9878_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9878_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ + TFA9878_BF_AMPINPSEL = 0x02b1, /*!< amp input selection */ + TFA9878_BF_PDMRATE = 0x02d0, /*!< Pdm rate */ + TFA9878_BF_REV = 0x030f, /*!< Revision info */ + TFA9878_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ + TFA9878_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ + TFA9878_BF_SWCLKSEL = 0x0432, /*!< Sound Wire clock frequnecy */ + TFA9878_BF_MANAOOSC = 0x0460, /*!< Internal osc off at PWDN */ + TFA9878_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ + TFA9878_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ + TFA9878_BF_AUTOFROSEL = 0x04a0, /*!< override automatic OSC selection mechanism */ + TFA9878_BF_SWFRSYNC = 0x04b0, /*!< Selection SW signal reference for Stream Synchronization */ + TFA9878_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ + TFA9878_BF_FRCCLKSPKR = 0x0510, /*!< force active the speaker sub-system clock when in idle power */ + TFA9878_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ + TFA9878_BF_CLKCHKLO = 0x0707, /*!< Clock check Low Threshold */ + TFA9878_BF_CLKCHKHI = 0x0787, /*!< Clock check Higher Threshold */ + TFA9878_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ + TFA9878_BF_VDDS = 0x1000, /*!< POR */ + TFA9878_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register , clear on read) */ + TFA9878_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register , clear on read) */ + TFA9878_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register , clear on read) */ + TFA9878_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register , clear on read) */ + TFA9878_BF_MANALARM = 0x1050, /*!< Alarm state */ + TFA9878_BF_CLKS = 0x1060, /*!< Clocks stable */ + TFA9878_BF_MTPB = 0x1070, /*!< MTP busy */ + TFA9878_BF_NOCLK = 0x1080, /*!< Lost clock (sticky register , clear on read) */ + TFA9878_BF_BODNOK = 0x1090, /*!< BOD Flag - VDD NOT OK */ + TFA9878_BF_TDMERR = 0x10a0, /*!< TDM error */ + TFA9878_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9878_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register , clear on read) */ + TFA9878_BF_DCDCPC = 0x1120, /*!< Indicates current is max in DC-to-DC converter */ + TFA9878_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ + TFA9878_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ + TFA9878_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ + TFA9878_BF_PLLS = 0x1160, /*!< PLL lock */ + TFA9878_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ + TFA9878_BF_CLKOOR = 0x11c0, /*!< External clock status */ + TFA9878_BF_SWS = 0x11d0, /*!< Amplifier engage */ + TFA9878_BF_AMPS = 0x11e0, /*!< Amplifier enable */ + TFA9878_BF_AREFS = 0x11f0, /*!< References enable */ + TFA9878_BF_OCPOAP = 0x1300, /*!< OCPOK pmos B */ + TFA9878_BF_OCPOAN = 0x1310, /*!< OCPOK pmos A */ + TFA9878_BF_OCPOBP = 0x1320, /*!< OCPOK nmos B */ + TFA9878_BF_OCPOBN = 0x1330, /*!< OCPOK nmos A */ + TFA9878_BF_OVDS = 0x1380, /*!< OVP alarm */ + TFA9878_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ + TFA9878_BF_ADCCR = 0x13a0, /*!< Control ADC */ + TFA9878_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ + TFA9878_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ + TFA9878_BF_MANOPER = 0x13f0, /*!< Operating state */ + TFA9878_BF_TDMSTAT = 0x1402, /*!< TDM status bits */ + TFA9878_BF_MANSTATE = 0x1433, /*!< Device manager status */ + TFA9878_BF_AMPSTE = 0x1473, /*!< Amplifier control status */ + TFA9878_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ + TFA9878_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9878_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9878_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ + TFA9878_BF_TDME = 0x2000, /*!< Enable interface */ + TFA9878_BF_TDMSLOTS = 0x2013, /*!< N-slots in Frame */ + TFA9878_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ + TFA9878_BF_TDMFSLN = 0x2073, /*!< FS length */ + TFA9878_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ + TFA9878_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ + TFA9878_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ + TFA9878_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ + TFA9878_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ + TFA9878_BF_TDMADJ = 0x21f0, /*!< data adjustment */ + TFA9878_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ + TFA9878_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ + TFA9878_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ + TFA9878_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ + TFA9878_BF_TDMSPKE = 0x2300, /*!< Control audio tdm channel in 0 */ + TFA9878_BF_TDMDCE = 0x2310, /*!< Control audio tdm channel in 1 */ + TFA9878_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ + TFA9878_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ + TFA9878_BF_TDMSPKS = 0x2603, /*!< tdm slot for sink 0 */ + TFA9878_BF_TDMDCS = 0x2643, /*!< tdm slot for sink 1 */ + TFA9878_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ + TFA9878_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ + TFA9878_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9878_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ + TFA9878_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9878_BF_ISTOCPR = 0x4030, /*!< Status ocp alarm */ + TFA9878_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9878_BF_ISTMANALARM = 0x4050, /*!< Status nanager Alarm state */ + TFA9878_BF_ISTTDMER = 0x4060, /*!< Status tdm error */ + TFA9878_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9878_BF_ISTBODNOK = 0x4080, /*!< Status BOD event */ + TFA9878_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9878_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ + TFA9878_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9878_BF_ICLOCPR = 0x4430, /*!< Clear ocp alarm */ + TFA9878_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9878_BF_ICLMANALARM = 0x4450, /*!< Clear manager Alarm state */ + TFA9878_BF_ICLTDMER = 0x4460, /*!< Clear tdm error */ + TFA9878_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9878_BF_ICLBODNOK = 0x4480, /*!< Clear BOD event */ + TFA9878_BF_IEVDDS = 0x4800, /*!< Enable por */ + TFA9878_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ + TFA9878_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9878_BF_IEOCPR = 0x4830, /*!< Enable ocp alarm */ + TFA9878_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9878_BF_IEMANALARM = 0x4850, /*!< Enable nanager Alarm state */ + TFA9878_BF_IETDMER = 0x4860, /*!< Enable tdm error */ + TFA9878_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9878_BF_IEBODNOK = 0x4880, /*!< Enable BOD trigger */ + TFA9878_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ + TFA9878_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ + TFA9878_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9878_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ + TFA9878_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9878_BF_IPOMANALARM = 0x4c50, /*!< Polarity nanager Alarm state */ + TFA9878_BF_IPOTDMER = 0x4c60, /*!< Polarity tdm error */ + TFA9878_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9878_BF_IPOBODNOK = 0x4c80, /*!< Polarity BOD trigger */ + TFA9878_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time (with K = 1 at sample rate fs of 32kHz, 44,1 kHz or 48kHz ; with K = 2 at sample rate fs 16 kHz . With K =0.5 at sample rate of 96 kHz) */ + TFA9878_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ + TFA9878_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ + TFA9878_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9878_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ + TFA9878_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ + TFA9878_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ + TFA9878_BF_DPSA = 0x5170, /*!< Enable DPSA */ + TFA9878_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ + TFA9878_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ + TFA9878_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ + TFA9878_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ + TFA9878_BF_BYPDLYLINE = 0x52f0, /*!< Bypass the interpolator delay line */ + TFA9878_BF_TDMDCG = 0x5f23, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ + TFA9878_BF_TDMSPKG = 0x5f63, /*!< Total gain depending on INPLEV setting (channel 0) */ + TFA9878_BF_IPM = 0x60e1, /*!< Idle power mode control */ + TFA9878_BF_LNMODE = 0x62e1, /*!< ctrl select mode */ + TFA9878_BF_LPM1MODE = 0x64e1, /*!< low power mode control */ + TFA9878_BF_TDMSRCMAP = 0x6802, /*!< tdm source mapping */ + TFA9878_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ + TFA9878_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ + TFA9878_BF_TDMSRCACLIP = 0x6871, /*!< clip information (analog /digital) for source0 */ + TFA9878_BF_TDMSRCBCLIP = 0x6891, /*!< clip information (analog /digital) for source1 */ + TFA9878_BF_LP0 = 0x6e00, /*!< Idle power mode */ + TFA9878_BF_LP1 = 0x6e10, /*!< low power mode 1 detection */ + TFA9878_BF_LA = 0x6e20, /*!< low amplitude detection */ + TFA9878_BF_VDDPH = 0x6e30, /*!< vddp greater than vbat */ + TFA9878_BF_DELCURCOMP = 0x6f02, /*!< delay to allign compensation signal with current sense signal */ + TFA9878_BF_SIGCURCOMP = 0x6f40, /*!< polarity of compensation for current sense */ + TFA9878_BF_ENCURCOMP = 0x6f50, /*!< enable current sense compensation */ + TFA9878_BF_LVLCLPPWM = 0x6f72, /*!< set the amount of pwm pulse that may be skipped before clip-flag is triggered */ + TFA9878_BF_DCMCC = 0x7003, /*!< Max coil current */ + TFA9878_BF_DCCV = 0x7041, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ + TFA9878_BF_DCIE = 0x7060, /*!< Adaptive boost mode */ + TFA9878_BF_DCSR = 0x7070, /*!< Soft ramp up/down */ + TFA9878_BF_DCOVL = 0x7085, /*!< Threshold level to activate active overshoot control */ + TFA9878_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ + TFA9878_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ + TFA9878_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ + TFA9878_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9878_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ + TFA9878_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ + TFA9878_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9878_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9878_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ + TFA9878_BF_DCVOF = 0x7635, /*!< First boost voltage level */ + TFA9878_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ + TFA9878_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ + TFA9878_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9878_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9878_BF_MTPADDR = 0xa302, /*!< MTP address from I2C register for read/writing mtp in manual single word mode */ + TFA9878_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9878_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9878_BF_MTPWRMSB = 0xa70f, /*!< MSB word of write data for MTP manual write */ + TFA9878_BF_MTPWRLSB = 0xa80f, /*!< LSB word of write data for MTP manual write */ + TFA9878_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9878_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9878_BF_PLLINSI = 0xcd05, /*!< PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9878_BF_PLLINSP = 0xcd64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9878_BF_PLLINSR = 0xcdb3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9878_BF_PLLBDSEL = 0xcdf0, /*!< PLL bandwidth selection control, USE WITH CAUTION */ + TFA9878_BF_PLLNDEC = 0xce09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9878_BF_PLLMDECM = 0xcea0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9878_BF_PLLBP = 0xceb0, /*!< PLL bypass control during functional mode */ + TFA9878_BF_PLLDI = 0xcec0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9878_BF_PLLDO = 0xced0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9878_BF_PLLCLKSTB = 0xcee0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9878_BF_PLLFRM = 0xcef0, /*!< PLL free running mode control in functional mode */ + TFA9878_BF_PLLMDECL = 0xcf0f, /*!< Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9878_BF_PLLPDEC = 0xd006, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9878_BF_PLLDCTRL = 0xd070, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ + TFA9878_BF_PLLLIMOFF = 0xd090, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ + TFA9878_BF_PLLSTRTM = 0xd0a2, /*!< PLL startup time selection control */ + TFA9878_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ + TFA9878_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ + TFA9878_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9878_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9878_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9878_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9878_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9878_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9878_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ +} Tfa9878BfEnumList_t; +#define TFA9878_NAMETABLE static tfaBfName_t Tfa9878DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown selection , */\ + { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ + { 0x30, "AMPE"}, /* Activate Amplifier , */\ + { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0x90, "FSSSEL"}, /* Audio sample reference , */\ + { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xc0, "TSTOCP"}, /* OCP testing control , */\ + { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ + { 0x120, "MANSCONF"}, /* I2C configured , */\ + { 0x131, "DCINSEL"}, /* VAMP_OUT2 input selection , */\ + { 0x160, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x170, "MANROBOD"}, /* Reaction on BOD , */\ + { 0x180, "BODE"}, /* Enable BOD (only in direct control mode) , */\ + { 0x190, "BODHYS"}, /* Enable Hysteresis of BOD , */\ + { 0x1a1, "BODFILT"}, /* BOD filter , */\ + { 0x1c1, "BODTHLVL"}, /* BOD threshold , */\ + { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ + { 0x1f0, "DISFCRBST"}, /* disable boost control with FRCBST , */\ + { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ + { 0x2b1, "AMPINPSEL"}, /* amp input selection , */\ + { 0x2d0, "PDMRATE"}, /* Pdm rate , */\ + { 0x30f, "REV"}, /* Revision info , */\ + { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ + { 0x432, "SWCLKSEL"}, /* Sound Wire clock frequnecy , */\ + { 0x460, "MANAOOSC"}, /* Internal osc off at PWDN , */\ + { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "AUTOFROSEL"}, /* override automatic OSC selection mechanism , */\ + { 0x4b0, "SWFRSYNC"}, /* Selection SW signal reference for Stream Synchronization , */\ + { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "FRCCLKSPKR"}, /* force active the speaker sub-system clock when in idle power, */\ + { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ + { 0x707, "CLKCHKLO"}, /* Clock check Low Threshold , */\ + { 0x787, "CLKCHKHI"}, /* Clock check Higher Threshold , */\ + { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ + { 0x1020, "OTDS"}, /* OTP alarm (sticky register , clear on read) , */\ + { 0x1030, "OCDS"}, /* OCP amplifier (sticky register , clear on read), */\ + { 0x1040, "UVDS"}, /* UVP alarm (sticky register , clear on read) , */\ + { 0x1050, "MANALARM"}, /* Alarm state , */\ + { 0x1060, "CLKS"}, /* Clocks stable , */\ + { 0x1070, "MTPB"}, /* MTP busy , */\ + { 0x1080, "NOCLK"}, /* Lost clock (sticky register , clear on read) , */\ + { 0x1090, "BODNOK"}, /* BOD Flag - VDD NOT OK , */\ + { 0x10a0, "TDMERR"}, /* TDM error , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active (sticky register , clear on read) , */\ + { 0x1120, "DCDCPC"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1160, "PLLS"}, /* PLL lock , */\ + { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ + { 0x11c0, "CLKOOR"}, /* External clock status , */\ + { 0x11d0, "SWS"}, /* Amplifier engage , */\ + { 0x11e0, "AMPS"}, /* Amplifier enable , */\ + { 0x11f0, "AREFS"}, /* References enable , */\ + { 0x1300, "OCPOAP"}, /* OCPOK pmos B , */\ + { 0x1310, "OCPOAN"}, /* OCPOK pmos A , */\ + { 0x1320, "OCPOBP"}, /* OCPOK nmos B , */\ + { 0x1330, "OCPOBN"}, /* OCPOK nmos A , */\ + { 0x1380, "OVDS"}, /* OVP alarm , */\ + { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ + { 0x13a0, "ADCCR"}, /* Control ADC , */\ + { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ + { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x13f0, "MANOPER"}, /* Operating state , */\ + { 0x1402, "TDMSTAT"}, /* TDM status bits , */\ + { 0x1433, "MANSTATE"}, /* Device manager status , */\ + { 0x1473, "AMPSTE"}, /* Amplifier control status , */\ + { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2000, "TDME"}, /* Enable interface , */\ + { 0x2013, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2073, "TDMFSLN"}, /* FS length , */\ + { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ + { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ + { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ + { 0x21f0, "TDMADJ"}, /* data adjustment , */\ + { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ + { 0x2300, "TDMSPKE"}, /* Control audio tdm channel in 0 , */\ + { 0x2310, "TDMDCE"}, /* Control audio tdm channel in 1 , */\ + { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "TDMSPKS"}, /* tdm slot for sink 0 , */\ + { 0x2643, "TDMDCS"}, /* tdm slot for sink 1 , */\ + { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOCPR"}, /* Status ocp alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTMANALARM"}, /* Status nanager Alarm state , */\ + { 0x4060, "ISTTDMER"}, /* Status tdm error , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4080, "ISTBODNOK"}, /* Status BOD event , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOCPR"}, /* Clear ocp alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLMANALARM"}, /* Clear manager Alarm state , */\ + { 0x4460, "ICLTDMER"}, /* Clear tdm error , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4480, "ICLBODNOK"}, /* Clear BOD event , */\ + { 0x4800, "IEVDDS"}, /* Enable por , */\ + { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOCPR"}, /* Enable ocp alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IEMANALARM"}, /* Enable nanager Alarm state , */\ + { 0x4860, "IETDMER"}, /* Enable tdm error , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4880, "IEBODNOK"}, /* Enable BOD trigger , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ + { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOMANALARM"}, /* Polarity nanager Alarm state , */\ + { 0x4c60, "IPOTDMER"}, /* Polarity tdm error , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x4c80, "IPOBODNOK"}, /* Polarity BOD trigger , */\ + { 0x5001, "BSSCR"}, /* Battery Safeguard attack time (with K = 1 at sample rate fs of 32kHz, 44,1 kHz or 48kHz ; with K = 2 at sample rate fs 16 kHz . With K =0.5 at sample rate of 96 kHz), */\ + { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ + { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ + { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ + { 0x5170, "DPSA"}, /* Enable DPSA , */\ + { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ + { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ + { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ + { 0x52f0, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ + { 0x5f23, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x5f63, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x60e1, "IPM"}, /* Idle power mode control , */\ + { 0x62e1, "LNMODE"}, /* ctrl select mode , */\ + { 0x64e1, "LPM1MODE"}, /* low power mode control , */\ + { 0x6802, "TDMSRCMAP"}, /* tdm source mapping , */\ + { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ + { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ + { 0x6871, "TDMSRCACLIP"}, /* clip information (analog /digital) for source0 , */\ + { 0x6891, "TDMSRCBCLIP"}, /* clip information (analog /digital) for source1 , */\ + { 0x6e00, "LP0"}, /* Idle power mode , */\ + { 0x6e10, "LP1"}, /* low power mode 1 detection , */\ + { 0x6e20, "LA"}, /* low amplitude detection , */\ + { 0x6e30, "VDDPH"}, /* vddp greater than vbat , */\ + { 0x6f02, "DELCURCOMP"}, /* delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "SIGCURCOMP"}, /* polarity of compensation for current sense , */\ + { 0x6f50, "ENCURCOMP"}, /* enable current sense compensation , */\ + { 0x6f72, "LVLCLPPWM"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7003, "DCMCC"}, /* Max coil current , */\ + { 0x7041, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7060, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7070, "DCSR"}, /* Soft ramp up/down , */\ + { 0x7085, "DCOVL"}, /* Threshold level to activate active overshoot control, */\ + { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ + { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7635, "DCVOF"}, /* First boost voltage level , */\ + { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ + { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "MTPADDR"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "MTPWRMSB"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "MTPWRLSB"}, /* LSB word of write data for MTP manual write , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xcd05, "PLLINSI"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcd64, "PLLINSP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdb3, "PLLINSR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdf0, "PLLBDSEL"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ + { 0xce09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcea0, "PLLMDECM"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xceb0, "PLLBP"}, /* PLL bypass control during functional mode , */\ + { 0xcec0, "PLLDI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xced0, "PLLDO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcee0, "PLLCLKSTB"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcef0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ + { 0xcf0f, "PLLMDECL"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd006, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd070, "PLLDCTRL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xd090, "PLLLIMOFF"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xd0a2, "PLLSTRTM"}, /* PLL startup time selection control , */\ + { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ + { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9878_BITNAMETABLE static tfaBfName_t Tfa9878BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown selection , */\ + { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ + { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ + { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ + { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xc0, "test_ocp"}, /* OCP testing control , */\ + { 0xd0, "sel_man_wait_time"}, /* Manager wait time selection control , */\ + { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ + { 0x120, "src_set_configured"}, /* I2C configured , */\ + { 0x131, "vamp_sel2"}, /* VAMP_OUT2 input selection , */\ + { 0x160, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x170, "man_enbl_brown"}, /* Reaction on BOD , */\ + { 0x180, "bod_enbl"}, /* Enable BOD (only in direct control mode) , */\ + { 0x190, "bod_hyst_enbl"}, /* Enable Hysteresis of BOD , */\ + { 0x1a1, "bod_delay_set"}, /* BOD filter , */\ + { 0x1c1, "bod_lvl_set"}, /* BOD threshold , */\ + { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ + { 0x1f0, "disable_frcbst"}, /* disable boost control with FRCBST , */\ + { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ + { 0x2b1, "amp_input_sel"}, /* amp input selection , */\ + { 0x2d0, "pdm_rate"}, /* Pdm rate , */\ + { 0x30f, "device_rev"}, /* Revision info , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ + { 0x432, "sw_clk_sel"}, /* Sound Wire clock frequnecy , */\ + { 0x460, "enbl_osc_auto_off"}, /* Internal osc off at PWDN , */\ + { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "override_auto_sel_osc"}, /* override automatic OSC selection mechanism , */\ + { 0x4b0, "sw_sync_sel"}, /* Selection SW signal reference for Stream Synchronization , */\ + { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "force_spkr_clk"}, /* force active the speaker sub-system clock when in idle power, */\ + { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ + { 0x707, "clkchk_th_lo"}, /* Clock check Low Threshold , */\ + { 0x787, "clkchk_th_hi"}, /* Clock check Higher Threshold , */\ + { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register , clear on read) , */\ + { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register , clear on read), */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register , clear on read) , */\ + { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1080, "flag_lost_clk"}, /* Lost clock (sticky register , clear on read) , */\ + { 0x1090, "flag_bod_vddd_nok"}, /* BOD Flag - VDD NOT OK , */\ + { 0x10a0, "flag_tdm_error"}, /* TDM error , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register , clear on read) , */\ + { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ + { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ + { 0x11c0, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ + { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ + { 0x1300, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1310, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1320, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1330, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ + { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ + { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ + { 0x1402, "flag_tdm_status"}, /* TDM status bits , */\ + { 0x1433, "man_state"}, /* Device manager status , */\ + { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ + { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x2000, "tdm_enable"}, /* Enable interface , */\ + { 0x2013, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ + { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ + { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ + { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ + { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ + { 0x2300, "tdm_sink0_enable"}, /* Control audio tdm channel in 0 , */\ + { 0x2310, "tdm_sink1_enable"}, /* Control audio tdm channel in 1 , */\ + { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ + { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ + { 0x2603, "tdm_sink0_slot"}, /* tdm slot for sink 0 , */\ + { 0x2643, "tdm_sink1_slot"}, /* tdm slot for sink 1 , */\ + { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ + { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_man_alarm_state"}, /* Status nanager Alarm state , */\ + { 0x4060, "int_out_flag_tdm_error"}, /* Status tdm error , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4080, "int_out_flag_bod_vddd_nok"}, /* Status BOD event , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager Alarm state , */\ + { 0x4460, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4480, "int_in_flag_bod_vddd_nok"}, /* Clear BOD event , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ + { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable nanager Alarm state , */\ + { 0x4860, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4880, "int_enable_flag_bod_vddd_nok"}, /* Enable BOD trigger , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ + { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity nanager Alarm state , */\ + { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x4c80, "int_polarity_flag_bod_vddd_nok"}, /* Polarity BOD trigger , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time (with K = 1 at sample rate fs of 32kHz, 44,1 kHz or 48kHz ; with K = 2 at sample rate fs 16 kHz . With K =0.5 at sample rate of 96 kHz), */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ + { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ + { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ + { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ + { 0x5257, "gain"}, /* Amplifier gain , */\ + { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ + { 0x52f0, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ + { 0x5350, "bypass_lp"}, /* Bypass the low pass filter inside temperature sensor, */\ + { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ + { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x5463, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ + { 0x5500, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5513, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5552, "dpsa_drive"}, /* Drive setting (bin. coded) , */\ + { 0x5600, "ref_iref_enbl"}, /* Enable of reference current for OCP , */\ + { 0x5631, "ref_irefdist_set_ctrl"}, /* Scaling of reference current for OCP , */\ + { 0x5652, "ref_irefdist_test_enbl"}, /* Enable of test-function of distribution of reference current, used for OCP. When enabled, the current will to to anamux iso powerstages. Using e.g. 011 it will add the current of powerstage P and N., */\ + { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ + { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ + { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ + { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ + { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ + { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ + { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ + { 0x5900, "pwm_clk_sel"}, /* Control for selection for PWM delay line source , */\ + { 0x5910, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ + { 0x5f23, "ctrl_attl"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x5f63, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x6005, "idle_power_cal_offset"}, /* Idle power mode detector ctrl cal_offset from gain module , */\ + { 0x6065, "idle_power_zero_lvl"}, /* IIdle power mode zero crossing detection level , */\ + { 0x60e1, "idle_power_mode"}, /* Idle power mode control , */\ + { 0x6105, "idle_power_threshold_lvl"}, /* Idle power mode amplitude trigger level , */\ + { 0x6165, "idle_power_hold_time"}, /* Idle power mode detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x61c0, "disable_idle_power_mode"}, /* Idle power mode detector control , */\ + { 0x6265, "zero_lvl"}, /* low noise gain switch zero trigger level , */\ + { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ + { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ + { 0x6305, "threshold_lvl"}, /* low noise gain switch trigger level , */\ + { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 zero crossing detection level , */\ + { 0x64e1, "lpm1_mode"}, /* low power mode control , */\ + { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 amplitude trigger level , */\ + { 0x6565, "lpm1_hold_time"}, /* low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ + { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ + { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ + { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ + { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ + { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtred vs unfiltered compare , */\ + { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ + { 0x6802, "tdm_source_mapping"}, /* tdm source mapping , */\ + { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ + { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ + { 0x6871, "tdm_source0_clip_sel"}, /* clip information (analog /digital) for source0 , */\ + { 0x6891, "tdm_source1_clip_sel"}, /* clip information (analog /digital) for source1 , */\ + { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ + { 0x6b00, "disable_auto_engage"}, /* disable auto engange , */\ + { 0x6b10, "disable_engage"}, /* disable engange , */\ + { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x6c69, "spare_out"}, /* spare_out , */\ + { 0x6d0f, "spare_in"}, /* spare_in , */\ + { 0x6e00, "flag_idle_power_mode"}, /* Idle power mode , */\ + { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ + { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ + { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ + { 0x6f02, "cursense_comp_delay"}, /* delay to allign compensation signal with current sense signal, */\ + { 0x6f40, "cursense_comp_sign"}, /* polarity of compensation for current sense , */\ + { 0x6f50, "enbl_cursense_comp"}, /* enable current sense compensation , */\ + { 0x6f72, "pwms_clip_lvl"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7003, "boost_cur"}, /* Max coil current , */\ + { 0x7041, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7060, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7070, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x7085, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ + { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ + { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ + { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7360, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ + { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ + { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ + { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ + { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ + { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ + { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ + { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ + { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ + { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ + { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ + { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ + { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ + { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ + { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ + { 0x8887, "vs_gain"}, /* voltage sense gain , */\ + { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ + { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ + { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ + { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ + { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ + { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ + { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ + { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ + { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ + { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ + { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ + { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ + { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ + { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ + { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0c0, "use_direct_vs_ctrls"}, /* voltage sense Direct control to overrule several functions for testing, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ + { 0xc0f0, "enbl_fro"}, /* Enables FRO8M in I2C direct control mode only , */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs ), */\ + { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ + { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ + { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ + { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 (see Digimux list for details), */\ + { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xc9d1, "sw_hs_mode"}, /* Speed/load setting for SW IO cell, clk or data mode range (see SWMF IO cell datasheet), */\ + { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xcac0, "open_frcbst_ensw_switch"}, /* Save test2 configuration before enable anamux2 (open test2 switch and save test2 setting) , */\ + { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on FRCBST/TEST2 , */\ + { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on VSN/TEST3 , */\ + { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on VSP/TEST4 , */\ + { 0xcd05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcd64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdb3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcdf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ + { 0xce09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcea0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xceb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ + { 0xcec0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xced0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcee0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcef0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ + { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd006, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xd070, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xd090, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xd0a2, "sel_pll_startup_time"}, /* PLL startup time selection control , */\ + { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ + { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd283, "tsig_gain"}, /* Test signal gain , */\ + { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ + { 0xd800, "source_in_testmode"}, /* tdm source in test mode (return only current and voltage sense), */\ + { 0xd810, "gainatt_tdm_feedback"}, /* gainatt feedback to tdm , */\ + { 0xd822, "test_parametric_io"}, /* test io parametric , */\ + { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ + { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ + { 0xd880, "bst_dcmbst"}, /* dcm boost , */\ + { 0xd890, "gainatt_sw_feedback"}, /* gainatt feedback to sw , */\ + { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ + { 0xd900, "enbl_frocal"}, /* Enable FRO calibration , */\ + { 0xd910, "start_fro_calibration"}, /* Start FRO8 Calibration , */\ + { 0xd920, "enbl_irefcal"}, /* Enable IREF calibration , */\ + { 0xd930, "start_iref_calibration"}, /* Start IREF Calibration , */\ + { 0xda00, "fro_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ + { 0xda15, "fro_auto_trim_val"}, /* Calibration value from Auto Calibration block, to be written into MTP - Read Only, */\ + { 0xda80, "iref_calibration_done"}, /* IREF Calibration done - Read Only , */\ + { 0xda94, "iref_auto_trim_val"}, /* Calibration value from Auto Calibration block, to be written into MTP - Read Only, */\ + { 0xdae0, "iref_calibration_error"}, /* IREF Calibration done - Read Only , */\ + { 0xe00f, "sw_profile"}, /* Software profile data , */\ + { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf169, "spare_mtp1_15_6"}, /* SPARE , */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf2a4, "optimal_pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ + { 0xf2f0, "enbl_optimal_pwm_delay"}, /* optimized pwm delay function enabled , */\ + { 0xf307, "calibr_gain_vs1"}, /* Voltage sense gain when external voltage sensing input is selected, */\ + { 0xf387, "calibr_gain_vs2"}, /* Voltage sense gain when internal voltage sensing input is selected, */\ + { 0xf407, "vs_trim1"}, /* VS Trimming when external voltage sensing input is selected, */\ + { 0xf487, "vs_trim2"}, /* VS Trimming when internal voltage sensing input is selected, */\ + { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ + { 0xf607, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf687, "spare_mpt6_15_06"}, /* SPARE , */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf770, "spare_mtp7_07"}, /* SPARE , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf7f0, "spare_mtp7_15"}, /* SPARE , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ + { 0xf910, "spare_mtp9_1"}, /* SPARE , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ + { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf980, "spare_mtp9_8"}, /* SPARE , */\ + { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* pwm delay clock auto gating , */\ + { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* ocpclock auto gating , */\ + { 0xf9b0, "mtp_gate_cgu_clock_for_test"}, /* cgu test clock control , */\ + { 0xf9c0, "mtp_tdm_pad_sel"}, /* tdm pad selection , */\ + { 0xf9d2, "spare_mtp9_15_12"}, /* MTP-control FW - See Firmware I2C API document for details, */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ + { 0xff05, "fro_trim"}, /* 8 MHz oscillator trim code , */\ + { 0xff61, "fro_shortnwell"}, /* Short 4 or 6 n-well resistors , */\ + { 0xff81, "fro_boost"}, /* Self bias current selection , */\ + { 0xffa4, "calibr_iref_trim"}, /* Trimming control of reference current for OCP , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa9878_irq { + tfa9878_irq_stvdds = 0, + tfa9878_irq_stbstoc = 1, + tfa9878_irq_stotds = 2, + tfa9878_irq_stocpr = 3, + tfa9878_irq_stuvds = 4, + tfa9878_irq_stmanalarm = 5, + tfa9878_irq_sttdmer = 6, + tfa9878_irq_stnoclk = 7, + tfa9878_irq_stbodnok = 8, + tfa9878_irq_max = 9, + tfa9878_irq_all = -1 /* all irqs */}; + +#define TFA9878_IRQ_NAMETABLE static tfaIrqName_t Tfa9878IrqNames[] = {\ + { 0, "STVDDS"},\ + { 1, "STBSTOC"},\ + { 2, "STOTDS"},\ + { 3, "STOCPR"},\ + { 4, "STUVDS"},\ + { 5, "STMANALARM"},\ + { 6, "STTDMER"},\ + { 7, "STNOCLK"},\ + { 8, "STBODNOK"},\ + { 9, "9"},\ +}; +#endif /* _TFA9878_TFAFIELDNAMES_H */ diff --git a/inc/tfa9887_tfafieldnames.h b/inc/tfa9887_tfafieldnames.h new file mode 100644 index 000000000000..ad3d8c0209d9 --- /dev/null +++ b/inc/tfa9887_tfafieldnames.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: Tfa9887_TfaFieldnames.h + * This file was generated automatically on 04/14/15 at 10:23:40. + * Source file: TFA9897N1B_I2C_list_URT_source_v34_87Only.xls + */ +#define TFA9887_I2CVERSION 34 +#define TFA9895_I2CVERSION 34 +#define TFA9887_NAMETABLE static tfaBfName_t Tfa9887DatasheetNames[] = {\ + { 0x402, "I2SF"}, /* I2SFormat data 1 input: , */\ + { 0x431, "CHS12"}, /* ChannelSelection data1 input (In CoolFlux) , */\ + { 0x450, "CHS3"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ + { 0x461, "CHSA"}, /* Input selection for amplifier , */\ + { 0x4b0, "I2SDOE"}, /* Enable data output , */\ + { 0x4c3, "I2SSR"}, /* sample rate setting , */\ + { 0x500, "BSSBY"}, /* , */\ + { 0x511, "BSSCR"}, /* 00 = 0.56 dB/Sample , */\ + { 0x532, "BSST"}, /* 000 = 2.92V , */\ + { 0x5f0, "I2SDOC"}, /* selection data out , */\ + { 0xa02, "DOLS"}, /* Output selection dataout left channel , */\ + { 0xa32, "DORS"}, /* Output selection dataout right channel , */\ + { 0xa62, "SPKL"}, /* Selection speaker induction , */\ + { 0xa91, "SPKR"}, /* Selection speaker impedance , */\ + { 0xab3, "DCFG"}, /* DCDC speaker current compensation gain , */\ + { 0x4134, "PWMDEL"}, /* PWM DelayBits to set the delay , */\ + { 0x4180, "PWMSH"}, /* PWM Shape , */\ + { 0x4190, "PWMRE"}, /* PWM Bitlength in noise shaper , */\ + { 0x48e1, "TCC"}, /* sample & hold track time: , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9887_BITNAMETABLE static tfaBfName_t Tfa9887BitNames[] = {\ + { 0x402, "i2s_seti"}, /* I2SFormat data 1 input: , */\ + { 0x431, "chan_sel1"}, /* ChannelSelection data1 input (In CoolFlux) , */\ + { 0x450, "lr_sw_i2si2"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ + { 0x461, "input_sel"}, /* Input selection for amplifier , */\ + { 0x4b0, "enbl_datao"}, /* Enable data output , */\ + { 0x4c3, "i2s_fs"}, /* sample rate setting , */\ + { 0x500, "bypass_clipper"}, /* , */\ + { 0x511, "vbat_prot_attacktime[1:0]"}, /* 00 = 0.56 dB/Sample , */\ + { 0x532, "vbat_prot_thlevel[2:0]"}, /* 000 = 2.92V , */\ + { 0x5d0, "reset_min_vbat"}, /* to reset the clipper via I2C in case the CF is bypassed, */\ + { 0x5f0, "datao_sel"}, /* selection data out , */\ + { 0xa02, "sel_i2so_l"}, /* Output selection dataout left channel , */\ + { 0xa32, "sel_i2so_r"}, /* Output selection dataout right channel , */\ + { 0xa62, "ctrl_spkr_coil"}, /* Selection speaker induction , */\ + { 0xa91, "ctrl_spr_res"}, /* Selection speaker impedance , */\ + { 0xab3, "ctrl_dcdc_spkr_i_comp_gain"}, /* DCDC speaker current compensation gain , */\ + { 0xaf0, "ctrl_dcdc_spkr_i_comp_sign"}, /* DCDC speaker current compensation sign , */\ + { 0x4100, "bypass_hp"}, /* bypass_hp, to bypass the hp filter byhind the CoolFlux, */\ + { 0x4110, "hard_mute"}, /* hard mute setting in HW , */\ + { 0x4120, "soft_mute"}, /* Soft mute setting in HW , */\ + { 0x4134, "PWM_Delay[4:0]"}, /* PWM DelayBits to set the delay , */\ + { 0x4180, "PWM_Shape"}, /* PWM Shape , */\ + { 0x4190, "PWM_BitLength"}, /* PWM Bitlength in noise shaper , */\ + { 0x4800, "ctrl_negin"}, /* , */\ + { 0x4810, "ctrl_cs_sein"}, /* , */\ + { 0x4820, "ctrl_coincidencecs"}, /* HIGH => Prevent dcdc switching during clk_cs_clksh, */\ + { 0x4876, "delay_se_neg[6:0]"}, /* delayshiftse2 , */\ + { 0x48e1, "ctrl_cs_ttrack[1:0]"}, /* sample & hold track time: , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + diff --git a/inc/tfa9890_tfafieldnames.h b/inc/tfa9890_tfafieldnames.h new file mode 100644 index 000000000000..be41fabd0720 --- /dev/null +++ b/inc/tfa9890_tfafieldnames.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: Tfa9890_TfaFieldnames.h + * This file was generated automatically on 04/07/15 at 14:46:37. + * Source file: TFA9897N1B_I2C_list_URT_source_v34_90Only.xls + */ +#define TFA9890_I2CVERSION 34 +#define TFA9890_NAMETABLE static tfaBfName_t Tfa9890DatasheetNames[] = {\ + { 0x402, "I2SF"}, /* I2SFormat data 1 input: , */\ + { 0x431, "CHS12"}, /* ChannelSelection data1 input (In CoolFlux) , */\ + { 0x450, "CHS3"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ + { 0x461, "CHSA"}, /* Input selection for amplifier , */\ + { 0x481, "I2SDOC"}, /* selection data out , */\ + { 0x4a0, "DISP"}, /* idp protection , */\ + { 0x4b0, "I2SDOE"}, /* Enable data output , */\ + { 0x4c3, "I2SSR"}, /* sample rate setting , */\ + { 0x732, "DCMCC"}, /* Max boost coil current - step of 500 mA , */\ + { 0x9c0, "CCFD"}, /* Selection CoolFlux Clock , */\ + { 0x9d0, "ISEL"}, /* selection input 1 or 2 , */\ + { 0xa02, "DOLS"}, /* Output selection dataout left channel , */\ + { 0xa32, "DORS"}, /* Output selection dataout right channel , */\ + { 0xa62, "SPKL"}, /* Selection speaker induction , */\ + { 0xa91, "SPKR"}, /* Selection speaker impedance , */\ + { 0xab3, "DCFG"}, /* DCDC speaker current compensation gain , */\ + { 0xf00, "VDDD"}, /* mask flag_por for interupt generation , */\ + { 0xf10, "OTDD"}, /* mask flag_otpok for interupt generation , */\ + { 0xf20, "OVDD"}, /* mask flag_ovpok for interupt generation , */\ + { 0xf30, "UVDD"}, /* mask flag_uvpok for interupt generation , */\ + { 0xf40, "OCDD"}, /* mask flag_ocp_alarm for interupt generation , */\ + { 0xf50, "CLKD"}, /* mask flag_clocks_stable for interupt generation , */\ + { 0xf60, "DCCD"}, /* mask flag_pwrokbst for interupt generation , */\ + { 0xf70, "SPKD"}, /* mask flag_cf_speakererror for interupt generation , */\ + { 0xf80, "WDD"}, /* mask flag_watchdog_reset for interupt generation , */\ + { 0xf90, "LCLK"}, /* mask flag_lost_clk for interupt generation , */\ + { 0xfe0, "INT"}, /* enabling interrupt , */\ + { 0xff0, "INTP"}, /* Setting polarity interupt , */\ + { 0x8f0f, "VERSION"}, /* (key1 protected) , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9890_BITNAMETABLE static tfaBfName_t Tfa9890BitNames[] = {\ + { 0x402, "i2s_seti"}, /* I2SFormat data 1 input: , */\ + { 0x431, "chan_sel1"}, /* ChannelSelection data1 input (In CoolFlux) , */\ + { 0x450, "lr_sw_i2si2"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ + { 0x461, "input_sel"}, /* Input selection for amplifier , */\ + { 0x481, "datao_sel"}, /* selection data out , */\ + { 0x4a0, "disable_idp"}, /* idp protection , */\ + { 0x4b0, "enbl_datao"}, /* Enable data output , */\ + { 0x4c3, "i2s_fs"}, /* sample rate setting , */\ + { 0x732, "ctrl_bstcur"}, /* Max boost coil current - step of 500 mA , */\ + { 0x9c0, "sel_cf_clk"}, /* Selection CoolFlux Clock , */\ + { 0x9d0, "intf_sel"}, /* selection input 1 or 2 , */\ + { 0xa02, "sel_i2so_l"}, /* Output selection dataout left channel , */\ + { 0xa32, "sel_i2so_r"}, /* Output selection dataout right channel , */\ + { 0xa62, "ctrl_spkr_coil"}, /* Selection speaker induction , */\ + { 0xa91, "ctrl_spr_res"}, /* Selection speaker impedance , */\ + { 0xab3, "ctrl_dcdc_spkr_i_comp_gain"}, /* DCDC speaker current compensation gain , */\ + { 0xaf0, "ctrl_dcdc_spkr_i_comp_sign"}, /* DCDC speaker current compensation sign , */\ + { 0xf00, "flag_por_mask"}, /* mask flag_por for interupt generation , */\ + { 0xf10, "flag_otpok_mask"}, /* mask flag_otpok for interupt generation , */\ + { 0xf20, "flag_ovpok_mask"}, /* mask flag_ovpok for interupt generation , */\ + { 0xf30, "flag_uvpok_mask"}, /* mask flag_uvpok for interupt generation , */\ + { 0xf40, "flag_ocp_alarm_mask"}, /* mask flag_ocp_alarm for interupt generation , */\ + { 0xf50, "flag_clocks_stable_mask"}, /* mask flag_clocks_stable for interupt generation , */\ + { 0xf60, "flag_pwrokbst_mask"}, /* mask flag_pwrokbst for interupt generation , */\ + { 0xf70, "flag_cf_speakererror_mask"}, /* mask flag_cf_speakererror for interupt generation , */\ + { 0xf80, "flag_watchdog_reset_mask"}, /* mask flag_watchdog_reset for interupt generation , */\ + { 0xf90, "flag_lost_clk_mask"}, /* mask flag_lost_clk for interupt generation , */\ + { 0xfe0, "enable_interrupt"}, /* enabling interrupt , */\ + { 0xff0, "invert_int_polarity"}, /* Setting polarity interupt , */\ + { 0x4700, "switch_fb"}, /* switch_fb , */\ + { 0x4713, "se_hyst"}, /* se_hyst , */\ + { 0x4754, "se_level"}, /* se_level , */\ + { 0x47a5, "ktemp"}, /* temperature compensation trimming , */\ + { 0x8f0f, "production_data6"}, /* (key1 protected) , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + diff --git a/inc/tfa9891_genregs.h b/inc/tfa9891_genregs.h new file mode 100644 index 000000000000..e4b0529fb559 --- /dev/null +++ b/inc/tfa9891_genregs.h @@ -0,0 +1,1136 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: Tfa98xx_genregs.h + * This file was generated automatically on 07/01/15 at 10:25:08. + * Source file: TFA9891_I2C_list_V11.xls + */ + +#ifndef TFA9891_GENREGS_H +#define TFA9891_GENREGS_H + + +#define TFA98XX_STATUSREG 0x00 +#define TFA98XX_BATTERYVOLTAGE 0x01 +#define TFA9891_TEMPERATURE 0x02 +#define TFA98XX_REVISIONNUMBER 0x03 +#define TFA98XX_I2SREG 0x04 +#define TFA98XX_BAT_PROT 0x05 +#define TFA98XX_AUDIO_CTR 0x06 +#define TFA98XX_DCDCBOOST 0x07 +#define TFA98XX_SPKR_CALIBRATION 0x08 +#define TFA98XX_SYS_CTRL 0x09 +#define TFA98XX_I2S_SEL_REG 0x0a +#define TFA98XX_HIDDEN_MTP_KEY2 0x0b +#define TFA98XX_INTERRUPT_REG 0x0f +#define TFA98XX_PDM_CTRL 0x10 +#define TFA98XX_PDM_OUT_CTRL 0x11 +#define TFA98XX_PDM_DS4_R 0x12 +#define TFA98XX_PDM_DS4_L 0x13 +#define TFA98XX_CTRL_SAAM_PGA 0x22 +#define TFA98XX_MISC_CTRL 0x25 +#define TFA98XX_CURRENTSENSE1 0x46 +#define TFA98XX_CURRENTSENSE4 0x49 +#define TFA98XX_HIDDEN_MTP_CTRL_REG3 0x62 +#define TFA9891_CF_CONTROLS 0x70 +#define TFA9891_CF_MAD 0x71 +#define TFA9891_CF_MEM 0x72 +#define TFA9891_CF_STATUS 0x73 +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP 0x80 + +/* + * (0x00)-StatusReg + */ + +/* + * POR + */ +#define TFA98XX_STATUSREG_VDDS (0x1<<0) +#define TFA98XX_STATUSREG_VDDS_POS 0 +#define TFA98XX_STATUSREG_VDDS_LEN 1 +#define TFA98XX_STATUSREG_VDDS_MAX 1 +#define TFA98XX_STATUSREG_VDDS_MSK 0x1 + +/* + * PLL_LOCK + */ +#define TFA98XX_STATUSREG_PLLS (0x1<<1) +#define TFA98XX_STATUSREG_PLLS_POS 1 +#define TFA98XX_STATUSREG_PLLS_LEN 1 +#define TFA98XX_STATUSREG_PLLS_MAX 1 +#define TFA98XX_STATUSREG_PLLS_MSK 0x2 + +/* + * flag_otpok + */ +#define TFA98XX_STATUSREG_OTDS (0x1<<2) +#define TFA98XX_STATUSREG_OTDS_POS 2 +#define TFA98XX_STATUSREG_OTDS_LEN 1 +#define TFA98XX_STATUSREG_OTDS_MAX 1 +#define TFA98XX_STATUSREG_OTDS_MSK 0x4 + +/* + * flag_ovpok + */ +#define TFA98XX_STATUSREG_OVDS (0x1<<3) +#define TFA98XX_STATUSREG_OVDS_POS 3 +#define TFA98XX_STATUSREG_OVDS_LEN 1 +#define TFA98XX_STATUSREG_OVDS_MAX 1 +#define TFA98XX_STATUSREG_OVDS_MSK 0x8 + +/* + * flag_uvpok + */ +#define TFA98XX_STATUSREG_UVDS (0x1<<4) +#define TFA98XX_STATUSREG_UVDS_POS 4 +#define TFA98XX_STATUSREG_UVDS_LEN 1 +#define TFA98XX_STATUSREG_UVDS_MAX 1 +#define TFA98XX_STATUSREG_UVDS_MSK 0x10 + +/* + * flag_OCP_alarm + */ +#define TFA98XX_STATUSREG_OCDS (0x1<<5) +#define TFA98XX_STATUSREG_OCDS_POS 5 +#define TFA98XX_STATUSREG_OCDS_LEN 1 +#define TFA98XX_STATUSREG_OCDS_MAX 1 +#define TFA98XX_STATUSREG_OCDS_MSK 0x20 + +/* + * flag_clocks_stable + */ +#define TFA98XX_STATUSREG_CLKS (0x1<<6) +#define TFA98XX_STATUSREG_CLKS_POS 6 +#define TFA98XX_STATUSREG_CLKS_LEN 1 +#define TFA98XX_STATUSREG_CLKS_MAX 1 +#define TFA98XX_STATUSREG_CLKS_MSK 0x40 + +/* + * CLIP + */ +#define TFA98XX_STATUSREG_CLIPS (0x1<<7) +#define TFA98XX_STATUSREG_CLIPS_POS 7 +#define TFA98XX_STATUSREG_CLIPS_LEN 1 +#define TFA98XX_STATUSREG_CLIPS_MAX 1 +#define TFA98XX_STATUSREG_CLIPS_MSK 0x80 + +/* + * mtp_busy + */ +#define TFA98XX_STATUSREG_MTPB (0x1<<8) +#define TFA98XX_STATUSREG_MTPB_POS 8 +#define TFA98XX_STATUSREG_MTPB_LEN 1 +#define TFA98XX_STATUSREG_MTPB_MAX 1 +#define TFA98XX_STATUSREG_MTPB_MSK 0x100 + +/* + * flag_pwrokbst + */ +#define TFA98XX_STATUSREG_DCCS (0x1<<9) +#define TFA98XX_STATUSREG_DCCS_POS 9 +#define TFA98XX_STATUSREG_DCCS_LEN 1 +#define TFA98XX_STATUSREG_DCCS_MAX 1 +#define TFA98XX_STATUSREG_DCCS_MSK 0x200 + +/* + * flag_cf_speakererror + */ +#define TFA98XX_STATUSREG_SPKS (0x1<<10) +#define TFA98XX_STATUSREG_SPKS_POS 10 +#define TFA98XX_STATUSREG_SPKS_LEN 1 +#define TFA98XX_STATUSREG_SPKS_MAX 1 +#define TFA98XX_STATUSREG_SPKS_MSK 0x400 + +/* + * flag_cold_started + */ +#define TFA98XX_STATUSREG_ACS (0x1<<11) +#define TFA98XX_STATUSREG_ACS_POS 11 +#define TFA98XX_STATUSREG_ACS_LEN 1 +#define TFA98XX_STATUSREG_ACS_MAX 1 +#define TFA98XX_STATUSREG_ACS_MSK 0x800 + +/* + * flag_engage + */ +#define TFA98XX_STATUSREG_SWS (0x1<<12) +#define TFA98XX_STATUSREG_SWS_POS 12 +#define TFA98XX_STATUSREG_SWS_LEN 1 +#define TFA98XX_STATUSREG_SWS_MAX 1 +#define TFA98XX_STATUSREG_SWS_MSK 0x1000 + +/* + * flag_watchdog_reset + */ +#define TFA98XX_STATUSREG_WDS (0x1<<13) +#define TFA98XX_STATUSREG_WDS_POS 13 +#define TFA98XX_STATUSREG_WDS_LEN 1 +#define TFA98XX_STATUSREG_WDS_MAX 1 +#define TFA98XX_STATUSREG_WDS_MSK 0x2000 + +/* + * flag_enbl_amp + */ +#define TFA98XX_STATUSREG_AMPS (0x1<<14) +#define TFA98XX_STATUSREG_AMPS_POS 14 +#define TFA98XX_STATUSREG_AMPS_LEN 1 +#define TFA98XX_STATUSREG_AMPS_MAX 1 +#define TFA98XX_STATUSREG_AMPS_MSK 0x4000 + +/* + * flag_enbl_ref + */ +#define TFA98XX_STATUSREG_AREFS (0x1<<15) +#define TFA98XX_STATUSREG_AREFS_POS 15 +#define TFA98XX_STATUSREG_AREFS_LEN 1 +#define TFA98XX_STATUSREG_AREFS_MAX 1 +#define TFA98XX_STATUSREG_AREFS_MSK 0x8000 + +/* + * (0x01)-BatteryVoltage + */ + +/* + * bat_adc + */ +#define TFA98XX_BATTERYVOLTAGE_BATS (0x3ff<<0) +#define TFA98XX_BATTERYVOLTAGE_BATS_POS 0 +#define TFA98XX_BATTERYVOLTAGE_BATS_LEN 10 +#define TFA98XX_BATTERYVOLTAGE_BATS_MAX 1023 +#define TFA98XX_BATTERYVOLTAGE_BATS_MSK 0x3ff + + +/* + * (0x02)-Temperature + */ + +/* + * temp_adc + */ +#define TFA9891_TEMPERATURE_TEMPS (0x1ff<<0) +#define TFA9891_TEMPERATURE_TEMPS_POS 0 +#define TFA9891_TEMPERATURE_TEMPS_LEN 9 +#define TFA9891_TEMPERATURE_TEMPS_MAX 511 +#define TFA9891_TEMPERATURE_TEMPS_MSK 0x1ff + + +/* + * (0x03)-RevisionNumber + */ + +/* + * rev_reg + */ +#define TFA98XX_REVISIONNUMBER_REV (0xff<<0) +#define TFA98XX_REVISIONNUMBER_REV_POS 0 +#define TFA98XX_REVISIONNUMBER_REV_LEN 8 +#define TFA98XX_REVISIONNUMBER_REV_MAX 255 +#define TFA98XX_REVISIONNUMBER_REV_MSK 0xff + + +/* + * (0x04)-I2SReg + */ + +/* + * i2s_seti + */ +#define TFA98XX_I2SREG_I2SF (0x7<<0) +#define TFA98XX_I2SREG_I2SF_POS 0 +#define TFA98XX_I2SREG_I2SF_LEN 3 +#define TFA98XX_I2SREG_I2SF_MAX 7 +#define TFA98XX_I2SREG_I2SF_MSK 0x7 + +/* + * chan_sel1 + */ +#define TFA98XX_I2SREG_CHS12 (0x3<<3) +#define TFA98XX_I2SREG_CHS12_POS 3 +#define TFA98XX_I2SREG_CHS12_LEN 2 +#define TFA98XX_I2SREG_CHS12_MAX 3 +#define TFA98XX_I2SREG_CHS12_MSK 0x18 + +/* + * lr_sw_i2si2 + */ +#define TFA98XX_I2SREG_CHS3 (0x1<<5) +#define TFA98XX_I2SREG_CHS3_POS 5 +#define TFA98XX_I2SREG_CHS3_LEN 1 +#define TFA98XX_I2SREG_CHS3_MAX 1 +#define TFA98XX_I2SREG_CHS3_MSK 0x20 + +/* + * input_sel + */ +#define TFA98XX_I2SREG_CHSA (0x3<<6) +#define TFA98XX_I2SREG_CHSA_POS 6 +#define TFA98XX_I2SREG_CHSA_LEN 2 +#define TFA98XX_I2SREG_CHSA_MAX 3 +#define TFA98XX_I2SREG_CHSA_MSK 0xc0 + +/* + * datao_sel + */ +#define TFA98XX_I2SREG_I2SDOC (0x3<<8) +#define TFA98XX_I2SREG_I2SDOC_POS 8 +#define TFA98XX_I2SREG_I2SDOC_LEN 2 +#define TFA98XX_I2SREG_I2SDOC_MAX 3 +#define TFA98XX_I2SREG_I2SDOC_MSK 0x300 + +/* + * disable_idp + */ +#define TFA98XX_I2SREG_DISP (0x1<<10) +#define TFA98XX_I2SREG_DISP_POS 10 +#define TFA98XX_I2SREG_DISP_LEN 1 +#define TFA98XX_I2SREG_DISP_MAX 1 +#define TFA98XX_I2SREG_DISP_MSK 0x400 + +/* + * enbl_datao + */ +#define TFA98XX_I2SREG_I2SDOE (0x1<<11) +#define TFA98XX_I2SREG_I2SDOE_POS 11 +#define TFA98XX_I2SREG_I2SDOE_LEN 1 +#define TFA98XX_I2SREG_I2SDOE_MAX 1 +#define TFA98XX_I2SREG_I2SDOE_MSK 0x800 + +/* + * i2s_fs + */ +#define TFA98XX_I2SREG_I2SSR (0xf<<12) +#define TFA98XX_I2SREG_I2SSR_POS 12 +#define TFA98XX_I2SREG_I2SSR_LEN 4 +#define TFA98XX_I2SREG_I2SSR_MAX 15 +#define TFA98XX_I2SREG_I2SSR_MSK 0xf000 + + +/* + * (0x05)-bat_prot + */ + +/* + * vbat_prot_attacktime + */ +#define TFA98XX_BAT_PROT_BSSCR (0x3<<0) +#define TFA98XX_BAT_PROT_BSSCR_POS 0 +#define TFA98XX_BAT_PROT_BSSCR_LEN 2 +#define TFA98XX_BAT_PROT_BSSCR_MAX 3 +#define TFA98XX_BAT_PROT_BSSCR_MSK 0x3 + +/* + * vbat_prot_thlevel + */ +#define TFA98XX_BAT_PROT_BSST (0xf<<2) +#define TFA98XX_BAT_PROT_BSST_POS 2 +#define TFA98XX_BAT_PROT_BSST_LEN 4 +#define TFA98XX_BAT_PROT_BSST_MAX 15 +#define TFA98XX_BAT_PROT_BSST_MSK 0x3c + +/* + * vbat_prot_max_reduct + */ +#define TFA98XX_BAT_PROT_BSSRL (0x3<<6) +#define TFA98XX_BAT_PROT_BSSRL_POS 6 +#define TFA98XX_BAT_PROT_BSSRL_LEN 2 +#define TFA98XX_BAT_PROT_BSSRL_MAX 3 +#define TFA98XX_BAT_PROT_BSSRL_MSK 0xc0 + +/* + * vbat_prot_release_t + */ +#define TFA98XX_BAT_PROT_BSSRR (0x7<<8) +#define TFA98XX_BAT_PROT_BSSRR_POS 8 +#define TFA98XX_BAT_PROT_BSSRR_LEN 3 +#define TFA98XX_BAT_PROT_BSSRR_MAX 7 +#define TFA98XX_BAT_PROT_BSSRR_MSK 0x700 + +/* + * vbat_prot_hysterese + */ +#define TFA98XX_BAT_PROT_BSSHY (0x3<<11) +#define TFA98XX_BAT_PROT_BSSHY_POS 11 +#define TFA98XX_BAT_PROT_BSSHY_LEN 2 +#define TFA98XX_BAT_PROT_BSSHY_MAX 3 +#define TFA98XX_BAT_PROT_BSSHY_MSK 0x1800 + +/* + * sel_vbat + */ +#define TFA98XX_BAT_PROT_BSSR (0x1<<14) +#define TFA98XX_BAT_PROT_BSSR_POS 14 +#define TFA98XX_BAT_PROT_BSSR_LEN 1 +#define TFA98XX_BAT_PROT_BSSR_MAX 1 +#define TFA98XX_BAT_PROT_BSSR_MSK 0x4000 + +/* + * bypass_clipper + */ +#define TFA98XX_BAT_PROT_BSSBY (0x1<<15) +#define TFA98XX_BAT_PROT_BSSBY_POS 15 +#define TFA98XX_BAT_PROT_BSSBY_LEN 1 +#define TFA98XX_BAT_PROT_BSSBY_MAX 1 +#define TFA98XX_BAT_PROT_BSSBY_MSK 0x8000 + + +/* + * (0x06)-audio_ctr + */ + +/* + * dpsa + */ +#define TFA98XX_AUDIO_CTR_DPSA (0x1<<0) +#define TFA98XX_AUDIO_CTR_DPSA_POS 0 +#define TFA98XX_AUDIO_CTR_DPSA_LEN 1 +#define TFA98XX_AUDIO_CTR_DPSA_MAX 1 +#define TFA98XX_AUDIO_CTR_DPSA_MSK 0x1 + +/* + * ctrl_slope + */ +#define TFA98XX_AUDIO_CTR_AMPSL (0xf<<1) +#define TFA98XX_AUDIO_CTR_AMPSL_POS 1 +#define TFA98XX_AUDIO_CTR_AMPSL_LEN 4 +#define TFA98XX_AUDIO_CTR_AMPSL_MAX 15 +#define TFA98XX_AUDIO_CTR_AMPSL_MSK 0x1e + +/* + * cf_mute + */ +#define TFA98XX_AUDIO_CTR_CFSM (0x1<<5) +#define TFA98XX_AUDIO_CTR_CFSM_POS 5 +#define TFA98XX_AUDIO_CTR_CFSM_LEN 1 +#define TFA98XX_AUDIO_CTR_CFSM_MAX 1 +#define TFA98XX_AUDIO_CTR_CFSM_MSK 0x20 + +/* + * ctrl_batsensesteepness + */ +#define TFA98XX_AUDIO_CTR_BSSS (0x1<<7) +#define TFA98XX_AUDIO_CTR_BSSS_POS 7 +#define TFA98XX_AUDIO_CTR_BSSS_LEN 1 +#define TFA98XX_AUDIO_CTR_BSSS_MAX 1 +#define TFA98XX_AUDIO_CTR_BSSS_MSK 0x80 + +/* + * vol + */ +#define TFA98XX_AUDIO_CTR_VOL (0xff<<8) +#define TFA98XX_AUDIO_CTR_VOL_POS 8 +#define TFA98XX_AUDIO_CTR_VOL_LEN 8 +#define TFA98XX_AUDIO_CTR_VOL_MAX 255 +#define TFA98XX_AUDIO_CTR_VOL_MSK 0xff00 + + +/* + * (0x07)-DCDCboost + */ + +/* + * ctrl_bstvolt + */ +#define TFA98XX_DCDCBOOST_DCVO (0x7<<0) +#define TFA98XX_DCDCBOOST_DCVO_POS 0 +#define TFA98XX_DCDCBOOST_DCVO_LEN 3 +#define TFA98XX_DCDCBOOST_DCVO_MAX 7 +#define TFA98XX_DCDCBOOST_DCVO_MSK 0x7 + +/* + * ctrl_bstcur + */ +#define TFA98XX_DCDCBOOST_DCMCC (0x7<<3) +#define TFA98XX_DCDCBOOST_DCMCC_POS 3 +#define TFA98XX_DCDCBOOST_DCMCC_LEN 3 +#define TFA98XX_DCDCBOOST_DCMCC_MAX 7 +#define TFA98XX_DCDCBOOST_DCMCC_MSK 0x38 + +/* + * boost_intel + */ +#define TFA98XX_DCDCBOOST_DCIE (0x1<<10) +#define TFA98XX_DCDCBOOST_DCIE_POS 10 +#define TFA98XX_DCDCBOOST_DCIE_LEN 1 +#define TFA98XX_DCDCBOOST_DCIE_MAX 1 +#define TFA98XX_DCDCBOOST_DCIE_MSK 0x400 + +/* + * boost_speed + */ +#define TFA98XX_DCDCBOOST_DCSR (0x1<<11) +#define TFA98XX_DCDCBOOST_DCSR_POS 11 +#define TFA98XX_DCDCBOOST_DCSR_LEN 1 +#define TFA98XX_DCDCBOOST_DCSR_MAX 1 +#define TFA98XX_DCDCBOOST_DCSR_MSK 0x800 + + +/* + * (0x08)-spkr_calibration + */ + +/* + * ext_temp_sel + */ +#define TFA98XX_SPKR_CALIBRATION_TROS (0x1<<0) +#define TFA98XX_SPKR_CALIBRATION_TROS_POS 0 +#define TFA98XX_SPKR_CALIBRATION_TROS_LEN 1 +#define TFA98XX_SPKR_CALIBRATION_TROS_MAX 1 +#define TFA98XX_SPKR_CALIBRATION_TROS_MSK 0x1 + +/* + * ext_temp + */ +#define TFA98XX_SPKR_CALIBRATION_EXTTS (0x1ff<<1) +#define TFA98XX_SPKR_CALIBRATION_EXTTS_POS 1 +#define TFA98XX_SPKR_CALIBRATION_EXTTS_LEN 9 +#define TFA98XX_SPKR_CALIBRATION_EXTTS_MAX 511 +#define TFA98XX_SPKR_CALIBRATION_EXTTS_MSK 0x3fe + + +/* + * (0x09)-sys_ctrl + */ + +/* + * PowerDown + */ +#define TFA98XX_SYS_CTRL_PWDN (0x1<<0) +#define TFA98XX_SYS_CTRL_PWDN_POS 0 +#define TFA98XX_SYS_CTRL_PWDN_LEN 1 +#define TFA98XX_SYS_CTRL_PWDN_MAX 1 +#define TFA98XX_SYS_CTRL_PWDN_MSK 0x1 + +/* + * reset + */ +#define TFA98XX_SYS_CTRL_I2CR (0x1<<1) +#define TFA98XX_SYS_CTRL_I2CR_POS 1 +#define TFA98XX_SYS_CTRL_I2CR_LEN 1 +#define TFA98XX_SYS_CTRL_I2CR_MAX 1 +#define TFA98XX_SYS_CTRL_I2CR_MSK 0x2 + +/* + * enbl_coolflux + */ +#define TFA98XX_SYS_CTRL_CFE (0x1<<2) +#define TFA98XX_SYS_CTRL_CFE_POS 2 +#define TFA98XX_SYS_CTRL_CFE_LEN 1 +#define TFA98XX_SYS_CTRL_CFE_MAX 1 +#define TFA98XX_SYS_CTRL_CFE_MSK 0x4 + +/* + * enbl_amplifier + */ +#define TFA98XX_SYS_CTRL_AMPE (0x1<<3) +#define TFA98XX_SYS_CTRL_AMPE_POS 3 +#define TFA98XX_SYS_CTRL_AMPE_LEN 1 +#define TFA98XX_SYS_CTRL_AMPE_MAX 1 +#define TFA98XX_SYS_CTRL_AMPE_MSK 0x8 + +/* + * enbl_boost + */ +#define TFA98XX_SYS_CTRL_DCA (0x1<<4) +#define TFA98XX_SYS_CTRL_DCA_POS 4 +#define TFA98XX_SYS_CTRL_DCA_LEN 1 +#define TFA98XX_SYS_CTRL_DCA_MAX 1 +#define TFA98XX_SYS_CTRL_DCA_MSK 0x10 + +/* + * cf_configured + */ +#define TFA98XX_SYS_CTRL_SBSL (0x1<<5) +#define TFA98XX_SYS_CTRL_SBSL_POS 5 +#define TFA98XX_SYS_CTRL_SBSL_LEN 1 +#define TFA98XX_SYS_CTRL_SBSL_MAX 1 +#define TFA98XX_SYS_CTRL_SBSL_MSK 0x20 + +/* + * sel_enbl_amplifier + */ +#define TFA98XX_SYS_CTRL_AMPC (0x1<<6) +#define TFA98XX_SYS_CTRL_AMPC_POS 6 +#define TFA98XX_SYS_CTRL_AMPC_LEN 1 +#define TFA98XX_SYS_CTRL_AMPC_MAX 1 +#define TFA98XX_SYS_CTRL_AMPC_MSK 0x40 + +/* + * dcdcoff_mode + */ +#define TFA98XX_SYS_CTRL_DCDIS (0x1<<7) +#define TFA98XX_SYS_CTRL_DCDIS_POS 7 +#define TFA98XX_SYS_CTRL_DCDIS_LEN 1 +#define TFA98XX_SYS_CTRL_DCDIS_MAX 1 +#define TFA98XX_SYS_CTRL_DCDIS_MSK 0x80 + +/* + * cttr_iddqtest + */ +#define TFA98XX_SYS_CTRL_PSDR (0x1<<8) +#define TFA98XX_SYS_CTRL_PSDR_POS 8 +#define TFA98XX_SYS_CTRL_PSDR_LEN 1 +#define TFA98XX_SYS_CTRL_PSDR_MAX 1 +#define TFA98XX_SYS_CTRL_PSDR_MSK 0x100 + +/* + * ctrl_coil_value + */ +#define TFA98XX_SYS_CTRL_DCCV (0x3<<9) +#define TFA98XX_SYS_CTRL_DCCV_POS 9 +#define TFA98XX_SYS_CTRL_DCCV_LEN 2 +#define TFA98XX_SYS_CTRL_DCCV_MAX 3 +#define TFA98XX_SYS_CTRL_DCCV_MSK 0x600 + +/* + * ctrl_sel_cf_clock + */ +#define TFA98XX_SYS_CTRL_CCFD (0x3<<11) +#define TFA98XX_SYS_CTRL_CCFD_POS 11 +#define TFA98XX_SYS_CTRL_CCFD_LEN 2 +#define TFA98XX_SYS_CTRL_CCFD_MAX 3 +#define TFA98XX_SYS_CTRL_CCFD_MSK 0x1800 + +/* + * intf_sel + */ +#define TFA98XX_SYS_CTRL_ISEL (0x1<<13) +#define TFA98XX_SYS_CTRL_ISEL_POS 13 +#define TFA98XX_SYS_CTRL_ISEL_LEN 1 +#define TFA98XX_SYS_CTRL_ISEL_MAX 1 +#define TFA98XX_SYS_CTRL_ISEL_MSK 0x2000 + +/* + * sel_ws_bck + */ +#define TFA98XX_SYS_CTRL_IPLL (0x1<<14) +#define TFA98XX_SYS_CTRL_IPLL_POS 14 +#define TFA98XX_SYS_CTRL_IPLL_LEN 1 +#define TFA98XX_SYS_CTRL_IPLL_MAX 1 +#define TFA98XX_SYS_CTRL_IPLL_MSK 0x4000 + + +/* + * (0x0a)-I2S_sel_reg + */ + +/* + * sel_i2so_l + */ +#define TFA98XX_I2S_SEL_REG_DOLS (0x7<<0) +#define TFA98XX_I2S_SEL_REG_DOLS_POS 0 +#define TFA98XX_I2S_SEL_REG_DOLS_LEN 3 +#define TFA98XX_I2S_SEL_REG_DOLS_MAX 7 +#define TFA98XX_I2S_SEL_REG_DOLS_MSK 0x7 + +/* + * sel_i2so_r + */ +#define TFA98XX_I2S_SEL_REG_DORS (0x7<<3) +#define TFA98XX_I2S_SEL_REG_DORS_POS 3 +#define TFA98XX_I2S_SEL_REG_DORS_LEN 3 +#define TFA98XX_I2S_SEL_REG_DORS_MAX 7 +#define TFA98XX_I2S_SEL_REG_DORS_MSK 0x38 + +/* + * ctrl_spkr_coil + */ +#define TFA98XX_I2S_SEL_REG_SPKL (0x7<<6) +#define TFA98XX_I2S_SEL_REG_SPKL_POS 6 +#define TFA98XX_I2S_SEL_REG_SPKL_LEN 3 +#define TFA98XX_I2S_SEL_REG_SPKL_MAX 7 +#define TFA98XX_I2S_SEL_REG_SPKL_MSK 0x1c0 + +/* + * ctrl_spr_res + */ +#define TFA98XX_I2S_SEL_REG_SPKR (0x3<<9) +#define TFA98XX_I2S_SEL_REG_SPKR_POS 9 +#define TFA98XX_I2S_SEL_REG_SPKR_LEN 2 +#define TFA98XX_I2S_SEL_REG_SPKR_MAX 3 +#define TFA98XX_I2S_SEL_REG_SPKR_MSK 0x600 + +/* + * ctrl_dcdc_spkr_i_comp_gain + */ +#define TFA98XX_I2S_SEL_REG_DCFG (0xf<<11) +#define TFA98XX_I2S_SEL_REG_DCFG_POS 11 +#define TFA98XX_I2S_SEL_REG_DCFG_LEN 4 +#define TFA98XX_I2S_SEL_REG_DCFG_MAX 15 +#define TFA98XX_I2S_SEL_REG_DCFG_MSK 0x7800 + + +/* + * (0x0b)-Hidden_mtp_key2 + */ + +/* + * MTP_key2 + */ +#define TFA98XX_HIDDEN_MTP_KEY2_MTPK (0xff<<0) +#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_POS 0 +#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_LEN 8 +#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_MAX 255 +#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_MSK 0xff + + +/* + * (0x0f)-interrupt_reg + */ + +/* + * flag_por_mask + */ +#define TFA98XX_INTERRUPT_REG_VDDD (0x1<<0) +#define TFA98XX_INTERRUPT_REG_VDDD_POS 0 +#define TFA98XX_INTERRUPT_REG_VDDD_LEN 1 +#define TFA98XX_INTERRUPT_REG_VDDD_MAX 1 +#define TFA98XX_INTERRUPT_REG_VDDD_MSK 0x1 + +/* + * flag_otpok_mask + */ +#define TFA98XX_INTERRUPT_REG_OTDD (0x1<<1) +#define TFA98XX_INTERRUPT_REG_OTDD_POS 1 +#define TFA98XX_INTERRUPT_REG_OTDD_LEN 1 +#define TFA98XX_INTERRUPT_REG_OTDD_MAX 1 +#define TFA98XX_INTERRUPT_REG_OTDD_MSK 0x2 + +/* + * flag_ovpok_mask + */ +#define TFA98XX_INTERRUPT_REG_OVDD (0x1<<2) +#define TFA98XX_INTERRUPT_REG_OVDD_POS 2 +#define TFA98XX_INTERRUPT_REG_OVDD_LEN 1 +#define TFA98XX_INTERRUPT_REG_OVDD_MAX 1 +#define TFA98XX_INTERRUPT_REG_OVDD_MSK 0x4 + +/* + * flag_uvpok_mask + */ +#define TFA98XX_INTERRUPT_REG_UVDD (0x1<<3) +#define TFA98XX_INTERRUPT_REG_UVDD_POS 3 +#define TFA98XX_INTERRUPT_REG_UVDD_LEN 1 +#define TFA98XX_INTERRUPT_REG_UVDD_MAX 1 +#define TFA98XX_INTERRUPT_REG_UVDD_MSK 0x8 + +/* + * flag_ocp_alarm_mask + */ +#define TFA98XX_INTERRUPT_REG_OCDD (0x1<<4) +#define TFA98XX_INTERRUPT_REG_OCDD_POS 4 +#define TFA98XX_INTERRUPT_REG_OCDD_LEN 1 +#define TFA98XX_INTERRUPT_REG_OCDD_MAX 1 +#define TFA98XX_INTERRUPT_REG_OCDD_MSK 0x10 + +/* + * flag_clocks_stable_mask + */ +#define TFA98XX_INTERRUPT_REG_CLKD (0x1<<5) +#define TFA98XX_INTERRUPT_REG_CLKD_POS 5 +#define TFA98XX_INTERRUPT_REG_CLKD_LEN 1 +#define TFA98XX_INTERRUPT_REG_CLKD_MAX 1 +#define TFA98XX_INTERRUPT_REG_CLKD_MSK 0x20 + +/* + * flag_pwrokbst_mask + */ +#define TFA98XX_INTERRUPT_REG_DCCD (0x1<<6) +#define TFA98XX_INTERRUPT_REG_DCCD_POS 6 +#define TFA98XX_INTERRUPT_REG_DCCD_LEN 1 +#define TFA98XX_INTERRUPT_REG_DCCD_MAX 1 +#define TFA98XX_INTERRUPT_REG_DCCD_MSK 0x40 + +/* + * flag_cf_speakererror_mask + */ +#define TFA98XX_INTERRUPT_REG_SPKD (0x1<<7) +#define TFA98XX_INTERRUPT_REG_SPKD_POS 7 +#define TFA98XX_INTERRUPT_REG_SPKD_LEN 1 +#define TFA98XX_INTERRUPT_REG_SPKD_MAX 1 +#define TFA98XX_INTERRUPT_REG_SPKD_MSK 0x80 + +/* + * flag_watchdog_reset_mask + */ +#define TFA98XX_INTERRUPT_REG_WDD (0x1<<8) +#define TFA98XX_INTERRUPT_REG_WDD_POS 8 +#define TFA98XX_INTERRUPT_REG_WDD_LEN 1 +#define TFA98XX_INTERRUPT_REG_WDD_MAX 1 +#define TFA98XX_INTERRUPT_REG_WDD_MSK 0x100 + +/* + * enable_interrupt + */ +#define TFA98XX_INTERRUPT_REG_INT (0x1<<14) +#define TFA98XX_INTERRUPT_REG_INT_POS 14 +#define TFA98XX_INTERRUPT_REG_INT_LEN 1 +#define TFA98XX_INTERRUPT_REG_INT_MAX 1 +#define TFA98XX_INTERRUPT_REG_INT_MSK 0x4000 + +/* + * invert_int_polarity + */ +#define TFA98XX_INTERRUPT_REG_INTP (0x1<<15) +#define TFA98XX_INTERRUPT_REG_INTP_POS 15 +#define TFA98XX_INTERRUPT_REG_INTP_LEN 1 +#define TFA98XX_INTERRUPT_REG_INTP_MAX 1 +#define TFA98XX_INTERRUPT_REG_INTP_MSK 0x8000 + + +/* + * (0x10)-pdm_ctrl + */ + +/* + * pdm_i2s_input + */ +#define TFA98XX_PDM_CTRL_PDMSEL (0x1<<0) +#define TFA98XX_PDM_CTRL_PDMSEL_POS 0 +#define TFA98XX_PDM_CTRL_PDMSEL_LEN 1 +#define TFA98XX_PDM_CTRL_PDMSEL_MAX 1 +#define TFA98XX_PDM_CTRL_PDMSEL_MSK 0x1 + +/* + * I2S_master_ena + */ +#define TFA98XX_PDM_CTRL_I2SMOUTEN (0x1<<1) +#define TFA98XX_PDM_CTRL_I2SMOUTEN_POS 1 +#define TFA98XX_PDM_CTRL_I2SMOUTEN_LEN 1 +#define TFA98XX_PDM_CTRL_I2SMOUTEN_MAX 1 +#define TFA98XX_PDM_CTRL_I2SMOUTEN_MSK 0x2 + +/* + * pdm_out_sel_r + */ +#define TFA98XX_PDM_CTRL_PDMORSEL (0x3<<2) +#define TFA98XX_PDM_CTRL_PDMORSEL_POS 2 +#define TFA98XX_PDM_CTRL_PDMORSEL_LEN 2 +#define TFA98XX_PDM_CTRL_PDMORSEL_MAX 3 +#define TFA98XX_PDM_CTRL_PDMORSEL_MSK 0xc + +/* + * pdm_out_sel_l + */ +#define TFA98XX_PDM_CTRL_PDMOLSEL (0x3<<4) +#define TFA98XX_PDM_CTRL_PDMOLSEL_POS 4 +#define TFA98XX_PDM_CTRL_PDMOLSEL_LEN 2 +#define TFA98XX_PDM_CTRL_PDMOLSEL_MAX 3 +#define TFA98XX_PDM_CTRL_PDMOLSEL_MSK 0x30 + +/* + * micdat_out_sel + */ +#define TFA98XX_PDM_CTRL_PADSEL (0x3<<6) +#define TFA98XX_PDM_CTRL_PADSEL_POS 6 +#define TFA98XX_PDM_CTRL_PADSEL_LEN 2 +#define TFA98XX_PDM_CTRL_PADSEL_MAX 3 +#define TFA98XX_PDM_CTRL_PADSEL_MSK 0xc0 + + +/* + * (0x11)-pdm_out_ctrl + */ + +/* + * secure_dly + */ +#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN (0x1<<0) +#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_POS 0 +#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_LEN 1 +#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_MAX 1 +#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_MSK 0x1 + +/* + * d_out_valid_rf_mux + */ +#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF (0x1<<1) +#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_POS 1 +#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_LEN 1 +#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_MAX 1 +#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_MSK 0x2 + +/* + * Speak_As_Mic_en + */ +#define TFA98XX_PDM_OUT_CTRL_SAAMEN (0x1<<4) +#define TFA98XX_PDM_OUT_CTRL_SAAMEN_POS 4 +#define TFA98XX_PDM_OUT_CTRL_SAAMEN_LEN 1 +#define TFA98XX_PDM_OUT_CTRL_SAAMEN_MAX 1 +#define TFA98XX_PDM_OUT_CTRL_SAAMEN_MSK 0x10 + +/* + * speak_as_mic_lp_mode + */ +#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN (0x1<<5) +#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_POS 5 +#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_LEN 1 +#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_MAX 1 +#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_MSK 0x20 + +/* + * pdm_out_rate + */ +#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN (0x1<<6) +#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_POS 6 +#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_LEN 1 +#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_MAX 1 +#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_MSK 0x40 + + +/* + * (0x12)-pdm_ds4_r + */ + +/* + * ds4_g1_r + */ +#define TFA98XX_PDM_DS4_R_PDMORG1 (0xf<<0) +#define TFA98XX_PDM_DS4_R_PDMORG1_POS 0 +#define TFA98XX_PDM_DS4_R_PDMORG1_LEN 4 +#define TFA98XX_PDM_DS4_R_PDMORG1_MAX 15 +#define TFA98XX_PDM_DS4_R_PDMORG1_MSK 0xf + +/* + * ds4_g2_r + */ +#define TFA98XX_PDM_DS4_R_PDMORG2 (0xf<<4) +#define TFA98XX_PDM_DS4_R_PDMORG2_POS 4 +#define TFA98XX_PDM_DS4_R_PDMORG2_LEN 4 +#define TFA98XX_PDM_DS4_R_PDMORG2_MAX 15 +#define TFA98XX_PDM_DS4_R_PDMORG2_MSK 0xf0 + + +/* + * (0x13)-pdm_ds4_l + */ + +/* + * ds4_g1_l + */ +#define TFA98XX_PDM_DS4_L_PDMOLG1 (0xf<<0) +#define TFA98XX_PDM_DS4_L_PDMOLG1_POS 0 +#define TFA98XX_PDM_DS4_L_PDMOLG1_LEN 4 +#define TFA98XX_PDM_DS4_L_PDMOLG1_MAX 15 +#define TFA98XX_PDM_DS4_L_PDMOLG1_MSK 0xf + +/* + * ds4_g2_l + */ +#define TFA98XX_PDM_DS4_L_PDMOLG2 (0xf<<4) +#define TFA98XX_PDM_DS4_L_PDMOLG2_POS 4 +#define TFA98XX_PDM_DS4_L_PDMOLG2_LEN 4 +#define TFA98XX_PDM_DS4_L_PDMOLG2_MAX 15 +#define TFA98XX_PDM_DS4_L_PDMOLG2_MSK 0xf0 + + +/* + * (0x22)-ctrl_saam_pga + */ + +/* + * Ctrl_saam_pga_gain + */ +#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN (0x7<<0) +#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_POS 0 +#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_LEN 3 +#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_MAX 7 +#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_MSK 0x7 + +/* + * ctrl_saam_pga_src + */ +#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL (0x1<<5) +#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_POS 5 +#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_LEN 1 +#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_MAX 1 +#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_MSK 0x20 + + +/* + * (0x25)-misc_ctrl + */ + +/* + * pll_fcco + */ +#define TFA98XX_MISC_CTRL_PLLCCOSEL (0x1<<0) +#define TFA98XX_MISC_CTRL_PLLCCOSEL_POS 0 +#define TFA98XX_MISC_CTRL_PLLCCOSEL_LEN 1 +#define TFA98XX_MISC_CTRL_PLLCCOSEL_MAX 1 +#define TFA98XX_MISC_CTRL_PLLCCOSEL_MSK 0x1 + + +/* + * (0x46)-CurrentSense1 + */ + +/* + * bypass_gc + */ +#define TFA98XX_CURRENTSENSE1_CSBYPGC (0x1<<0) +#define TFA98XX_CURRENTSENSE1_CSBYPGC_POS 0 +#define TFA98XX_CURRENTSENSE1_CSBYPGC_LEN 1 +#define TFA98XX_CURRENTSENSE1_CSBYPGC_MAX 1 +#define TFA98XX_CURRENTSENSE1_CSBYPGC_MSK 0x1 + + +/* + * (0x49)-CurrentSense4 + */ + +/* + * ctrl_bypassclip + */ +#define TFA98XX_CURRENTSENSE4_CLIP (0x1<<0) +#define TFA98XX_CURRENTSENSE4_CLIP_POS 0 +#define TFA98XX_CURRENTSENSE4_CLIP_LEN 1 +#define TFA98XX_CURRENTSENSE4_CLIP_MAX 1 +#define TFA98XX_CURRENTSENSE4_CLIP_MSK 0x1 + +/* + * ctrl_bypassclip2 + */ +#define TFA98XX_CURRENTSENSE4_CLIP2 (0x1<<1) +#define TFA98XX_CURRENTSENSE4_CLIP2_POS 1 +#define TFA98XX_CURRENTSENSE4_CLIP2_LEN 1 +#define TFA98XX_CURRENTSENSE4_CLIP2_MAX 1 +#define TFA98XX_CURRENTSENSE4_CLIP2_MSK 0x2 + + +/* + * (0x62)-Hidden_mtp_ctrl_reg3 + */ + + +/* + * (0x70)-cf_controls + */ + +/* + * cf_rst_dsp + */ +#define TFA98XX_CF_CONTROLS_RST (0x1<<0) +#define TFA98XX_CF_CONTROLS_RST_POS 0 +#define TFA98XX_CF_CONTROLS_RST_LEN 1 +#define TFA98XX_CF_CONTROLS_RST_MAX 1 +#define TFA98XX_CF_CONTROLS_RST_MSK 0x1 + +/* + * cf_dmem + */ +#define TFA98XX_CF_CONTROLS_DMEM (0x3<<1) +#define TFA98XX_CF_CONTROLS_DMEM_POS 1 +#define TFA98XX_CF_CONTROLS_DMEM_LEN 2 +#define TFA98XX_CF_CONTROLS_DMEM_MAX 3 +#define TFA98XX_CF_CONTROLS_DMEM_MSK 0x6 + +/* + * cf_aif + */ +#define TFA98XX_CF_CONTROLS_AIF (0x1<<3) +#define TFA98XX_CF_CONTROLS_AIF_POS 3 +#define TFA98XX_CF_CONTROLS_AIF_LEN 1 +#define TFA98XX_CF_CONTROLS_AIF_MAX 1 +#define TFA98XX_CF_CONTROLS_AIF_MSK 0x8 + +/* + * cf_int + */ +#define TFA98XX_CF_CONTROLS_CFINT (0x1<<4) +#define TFA98XX_CF_CONTROLS_CFINT_POS 4 +#define TFA98XX_CF_CONTROLS_CFINT_LEN 1 +#define TFA98XX_CF_CONTROLS_CFINT_MAX 1 +#define TFA98XX_CF_CONTROLS_CFINT_MSK 0x10 + +/* + * cf_req + */ +#define TFA98XX_CF_CONTROLS_REQ (0xff<<8) +#define TFA98XX_CF_CONTROLS_REQ_POS 8 +#define TFA98XX_CF_CONTROLS_REQ_LEN 8 +#define TFA98XX_CF_CONTROLS_REQ_MAX 255 +#define TFA98XX_CF_CONTROLS_REQ_MSK 0xff00 + + +/* + * (0x71)-cf_mad + */ + +/* + * cf_madd + */ +#define TFA9891_CF_MAD_MADD (0xffff<<0) +#define TFA9891_CF_MAD_MADD_POS 0 +#define TFA9891_CF_MAD_MADD_LEN 16 +#define TFA9891_CF_MAD_MADD_MAX 65535 +#define TFA9891_CF_MAD_MADD_MSK 0xffff + + +/* + * (0x72)-cf_mem + */ + +/* + * cf_mema + */ +#define TFA9891_CF_MEM_MEMA (0xffff<<0) +#define TFA9891_CF_MEM_MEMA_POS 0 +#define TFA9891_CF_MEM_MEMA_LEN 16 +#define TFA9891_CF_MEM_MEMA_MAX 65535 +#define TFA9891_CF_MEM_MEMA_MSK 0xffff + + +/* + * (0x73)-cf_status + */ + +/* + * cf_err + */ +#define TFA9891_CF_STATUS_ERR (0xff<<0) +#define TFA9891_CF_STATUS_ERR_POS 0 +#define TFA9891_CF_STATUS_ERR_LEN 8 +#define TFA9891_CF_STATUS_ERR_MAX 255 +#define TFA9891_CF_STATUS_ERR_MSK 0xff + +/* + * cf_ack + */ +#define TFA9891_CF_STATUS_ACK (0xff<<8) +#define TFA9891_CF_STATUS_ACK_POS 8 +#define TFA9891_CF_STATUS_ACK_LEN 8 +#define TFA9891_CF_STATUS_ACK_MAX 255 +#define TFA9891_CF_STATUS_ACK_MSK 0xff00 + + +/* + * (0x80)-Key2Protected_spkr_cal_mtp + */ + +/* + * calibration_onetime + */ +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC (0x1<<0) +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_POS 0 +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_LEN 1 +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_MAX 1 +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_MSK 0x1 + +/* + * calibr_ron_done + */ +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX (0x1<<1) +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_POS 1 +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_LEN 1 +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_MAX 1 +#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_MSK 0x2 + +#endif /* TFA9891_GENREGS_H */ diff --git a/inc/tfa9891_tfafieldnames.h b/inc/tfa9891_tfafieldnames.h new file mode 100644 index 000000000000..01aa437007ca --- /dev/null +++ b/inc/tfa9891_tfafieldnames.h @@ -0,0 +1,526 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/* + * tfa9891_tfafieldnames.h + * + * Created on: Jul 16, 2015 + * Author: wim + */ + +#ifndef TFA_INC_TFA9891_TFAFIELDNAMES_H_ +#define TFA_INC_TFA9891_TFAFIELDNAMES_H_ + +/** Filename: Tfa9891_TfaFieldnames.h + * This file was generated automatically on 07/16/15 at 15:00:02. + * Source file: TFA9891_I2C_list_V13.xls + */ + +#define TFA9891_I2CVERSION 13 + + +#define TFA9891_NAMETABLE static tfaBfName_t Tfa9891DatasheetNames[] = {\ + { 0x0, "VDDS"}, /* POR , */\ + { 0x10, "PLLS"}, /* PLL , */\ + { 0x20, "OTDS"}, /* OTP , */\ + { 0x30, "OVDS"}, /* OVP , */\ + { 0x40, "UVDS"}, /* UVP , */\ + { 0x50, "OCDS"}, /* OCP , */\ + { 0x60, "CLKS"}, /* Clocks , */\ + { 0x70, "CLIPS"}, /* CLIP , */\ + { 0x80, "MTPB"}, /* MTP , */\ + { 0x90, "DCCS"}, /* BOOST , */\ + { 0xa0, "SPKS"}, /* Speaker , */\ + { 0xb0, "ACS"}, /* cold start flag , */\ + { 0xc0, "SWS"}, /* flag engage , */\ + { 0xd0, "WDS"}, /* flag watchdog reset , */\ + { 0xe0, "AMPS"}, /* amplifier is enabled by manager , */\ + { 0xf0, "AREFS"}, /* references are enabled by manager , */\ + { 0x109, "BATS"}, /* Battery voltage readout; 0[V]..5.5[V] , */\ + { 0x208, "TEMPS"}, /* Temperature readout , */\ + { 0x307, "REV"}, /* Device Revision , */\ + { 0x402, "I2SF"}, /* I2SFormat data 1 input , */\ + { 0x431, "CHS12"}, /* ChannelSelection data1 input (In CoolFlux) , */\ + { 0x450, "CHS3"}, /* Channel Selection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ + { 0x461, "CHSA"}, /* Input selection for amplifier , */\ + { 0x481, "I2SDOC"}, /* Selection for I2S data out , */\ + { 0x4a0, "DISP"}, /* idp protection , */\ + { 0x4b0, "I2SDOE"}, /* Enable data output , */\ + { 0x4c3, "I2SSR"}, /* sample rate setting , */\ + { 0x501, "BSSCR"}, /* ProtectionAttackTime , */\ + { 0x523, "BSST"}, /* ProtectionThreshold , */\ + { 0x561, "BSSRL"}, /* ProtectionMaximumReduction , */\ + { 0x582, "BSSRR"}, /* Protection Release Timer , */\ + { 0x5b1, "BSSHY"}, /* ProtectionHysterese , */\ + { 0x5e0, "BSSR"}, /* battery voltage for I2C read out only , */\ + { 0x5f0, "BSSBY"}, /* bypass clipper battery protection , */\ + { 0x600, "DPSA"}, /* Enable dynamic powerstage activation , */\ + { 0x613, "AMPSL"}, /* control slope , */\ + { 0x650, "CFSM"}, /* Soft mute in CoolFlux , */\ + { 0x670, "BSSS"}, /* batsensesteepness , */\ + { 0x687, "VOL"}, /* volume control (in CoolFlux) , */\ + { 0x702, "DCVO"}, /* Boost voltage , */\ + { 0x732, "DCMCC"}, /* Max boost coil current , */\ + { 0x7a0, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7b0, "DCSR"}, /* Soft RampUp/Down mode for DCDC controller , */\ + { 0x800, "TROS"}, /* select external temperature also the ext_temp will be put on the temp read out , */\ + { 0x818, "EXTTS"}, /* external temperature setting to be given by host , */\ + { 0x900, "PWDN"}, /* ON/OFF , */\ + { 0x910, "I2CR"}, /* I2CReset , */\ + { 0x920, "CFE"}, /* EnableCoolFlux , */\ + { 0x930, "AMPE"}, /* EnableAmplifier , */\ + { 0x940, "DCA"}, /* EnableBoost , */\ + { 0x950, "SBSL"}, /* Coolflux configured , */\ + { 0x960, "AMPC"}, /* Selection on how AmplifierEnabling , */\ + { 0x970, "DCDIS"}, /* DCDC not connected , */\ + { 0x980, "PSDR"}, /* Iddq test amplifier , */\ + { 0x991, "DCCV"}, /* Coil Value , */\ + { 0x9b1, "CCFD"}, /* Selection CoolFluxClock , */\ + { 0x9d0, "ISEL"}, /* Interface Selection , */\ + { 0x9e0, "IPLL"}, /* selection input PLL for lock , */\ + { 0xa02, "DOLS"}, /* Output selection dataout left channel , */\ + { 0xa32, "DORS"}, /* Output selection dataout right channel , */\ + { 0xa62, "SPKL"}, /* Selection speaker induction , */\ + { 0xa91, "SPKR"}, /* Selection speaker impedance , */\ + { 0xab3, "DCFG"}, /* DCDC speaker current compensation gain , */\ + { 0xb07, "MTPK"}, /* MTP KEY2 register , */\ + { 0xf00, "VDDD"}, /* mask flag_por for interupt generation , */\ + { 0xf10, "OTDD"}, /* mask flag_otpok for interupt generation , */\ + { 0xf20, "OVDD"}, /* mask flag_ovpok for interupt generation , */\ + { 0xf30, "UVDD"}, /* mask flag_uvpok for interupt generation , */\ + { 0xf40, "OCDD"}, /* mask flag_ocp_alarm for interupt generation , */\ + { 0xf50, "CLKD"}, /* mask flag_clocks_stable for interupt generation , */\ + { 0xf60, "DCCD"}, /* mask flag_pwrokbst for interupt generation , */\ + { 0xf70, "SPKD"}, /* mask flag_cf_speakererror for interupt generation , */\ + { 0xf80, "WDD"}, /* mask flag_watchdog_reset for interupt generation , */\ + { 0xfe0, "INT"}, /* enabling interrupt , */\ + { 0xff0, "INTP"}, /* Setting polarity interupt , */\ + { 0x1000, "PDMSEL"}, /* Audio input interface mode , */\ + { 0x1010, "I2SMOUTEN"}, /* I2S Master enable (CLK and WS pads) , */\ + { 0x1021, "PDMORSEL"}, /* PDM Output right channel source selection , */\ + { 0x1041, "PDMOLSEL"}, /* PDM Output Left/Mono channel source selection , */\ + { 0x1061, "PADSEL"}, /* Output interface mode and ball selection , */\ + { 0x1100, "PDMOSDEN"}, /* Secure delay Cell , */\ + { 0x1110, "PDMOSDCF"}, /* Rising Falling Resync control Mux , */\ + { 0x1140, "SAAMEN"}, /* Speaker As a Mic feature ON/OFF , */\ + { 0x1150, "SAAMLPEN"}, /* speaker_as_mic low power mode (only in PDM_out mode), */\ + { 0x1160, "PDMOINTEN"}, /* PDM output interpolation ratio , */\ + { 0x1203, "PDMORG1"}, /* PDM Interpolator Right Channel DS4 G1 Gain Value , */\ + { 0x1243, "PDMORG2"}, /* PDM Interpolator Right Channel DS4 G2 Gain Value , */\ + { 0x1303, "PDMOLG1"}, /* PDM Interpolator Left Channel DS4 G1 Gain Value , */\ + { 0x1343, "PDMOLG2"}, /* PDM Interpolator Left Channel DS4 G2 Gain Value , */\ + { 0x2202, "SAAMGAIN"}, /* pga gain , */\ + { 0x2250, "SAAMPGACTRL"}, /* 0 = active input common mode voltage source at the attenuator/PGA level, */\ + { 0x2500, "PLLCCOSEL"}, /* pll cco frequency , */\ + { 0x4600, "CSBYPGC"}, /* bypass_gc, bypasses the CS gain correction , */\ + { 0x4900, "CLIP"}, /* Bypass clip control (function depending on digimux clip_x), */\ + { 0x4910, "CLIP2"}, /* Bypass clip control (function depending on digimux clip_x), */\ + { 0x62b0, "CIMTP"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ + { 0x7000, "RST"}, /* Reset CoolFlux DSP , */\ + { 0x7011, "DMEM"}, /* Target memory for access , */\ + { 0x7030, "AIF"}, /* Autoincrement-flag for memory-address , */\ + { 0x7040, "CFINT"}, /* Interrupt CoolFlux DSP , */\ + { 0x7087, "REQ"}, /* request for access (8 channels) , */\ + { 0x710f, "MADD"}, /* memory-address to be accessed , */\ + { 0x720f, "MEMA"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ + { 0x7307, "ERR"}, /* cf error Flags , */\ + { 0x7387, "ACK"}, /* acknowledge of requests (8 channels")" , */\ + { 0x8000, "MTPOTC"}, /* Calibration schedule (key2 protected) , */\ + { 0x8010, "MTPEX"}, /* (key2 protected) calibration of Ron has been executed, */\ + { 0x8045, "SWPROFIL" },\ + { 0x80a5, "SWVSTEP" },\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9891_BITNAMETABLE static tfaBfName_t Tfa9891BitNames[] = {\ + { 0x0, "POR"}, /* POR , */\ + { 0x10, "PLL_LOCK"}, /* PLL , */\ + { 0x20, "flag_otpok"}, /* OTP , */\ + { 0x30, "flag_ovpok"}, /* OVP , */\ + { 0x40, "flag_uvpok"}, /* UVP , */\ + { 0x50, "flag_OCP_alarm"}, /* OCP , */\ + { 0x60, "flag_clocks_stable"}, /* Clocks , */\ + { 0x70, "CLIP"}, /* CLIP , */\ + { 0x80, "mtp_busy"}, /* MTP , */\ + { 0x90, "flag_pwrokbst"}, /* BOOST , */\ + { 0xa0, "flag_cf_speakererror"}, /* Speaker , */\ + { 0xb0, "flag_cold_started"}, /* cold start flag , */\ + { 0xc0, "flag_engage"}, /* flag engage , */\ + { 0xd0, "flag_watchdog_reset"}, /* flag watchdog reset , */\ + { 0xe0, "flag_enbl_amp"}, /* amplifier is enabled by manager , */\ + { 0xf0, "flag_enbl_ref"}, /* references are enabled by manager , */\ + { 0x109, "bat_adc"}, /* Battery voltage readout; 0[V]..5.5[V] , */\ + { 0x208, "temp_adc"}, /* Temperature readout , */\ + { 0x307, "rev_reg"}, /* Device Revision , */\ + { 0x402, "i2s_seti"}, /* I2SFormat data 1 input , */\ + { 0x431, "chan_sel1"}, /* ChannelSelection data1 input (In CoolFlux) , */\ + { 0x450, "lr_sw_i2si2"}, /* Channel Selection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ + { 0x461, "input_sel"}, /* Input selection for amplifier , */\ + { 0x481, "datao_sel"}, /* Selection for I2S data out , */\ + { 0x4a0, "disable_idp"}, /* idp protection , */\ + { 0x4b0, "enbl_datao"}, /* Enable data output , */\ + { 0x4c3, "i2s_fs"}, /* sample rate setting , */\ + { 0x501, "vbat_prot_attacktime"}, /* ProtectionAttackTime , */\ + { 0x523, "vbat_prot_thlevel"}, /* ProtectionThreshold , */\ + { 0x561, "vbat_prot_max_reduct"}, /* ProtectionMaximumReduction , */\ + { 0x582, "vbat_prot_release_t"}, /* Protection Release Timer , */\ + { 0x5b1, "vbat_prot_hysterese"}, /* ProtectionHysterese , */\ + { 0x5d0, "reset_min_vbat"}, /* reset clipper , */\ + { 0x5e0, "sel_vbat"}, /* battery voltage for I2C read out only , */\ + { 0x5f0, "bypass_clipper"}, /* bypass clipper battery protection , */\ + { 0x600, "dpsa"}, /* Enable dynamic powerstage activation , */\ + { 0x613, "ctrl_slope"}, /* control slope , */\ + { 0x650, "cf_mute"}, /* Soft mute in CoolFlux , */\ + { 0x660, "sel_other_vamp"}, /* Input selection for the second channel of the DCDC inteligent mode detector, */\ + { 0x670, "ctrl_batsensesteepness"}, /* batsensesteepness , */\ + { 0x687, "vol"}, /* volume control (in CoolFlux) , */\ + { 0x702, "ctrl_bstvolt"}, /* Boost voltage , */\ + { 0x732, "ctrl_bstcur"}, /* Max boost coil current , */\ + { 0x761, "ctrl_slopebst_1_0"}, /* Setting for the slope of the boost converter power stage, */\ + { 0x781, "ctrl_slopebst_3_2"}, /* Setting for the part of the power transistor voltage to be used in peak current mode control, */\ + { 0x7a0, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7b0, "boost_speed"}, /* Soft RampUp/Down mode for DCDC controller , */\ + { 0x7c1, "ctrl_delay_comp_dcdc"}, /* delay compensation in current patg compared to delay in the audio path (relative) , */\ + { 0x7e0, "boost_input"}, /* Selection intelligent boost detector input , */\ + { 0x7f0, "ctrl_supplysense"}, /* ADC10 input selection , */\ + { 0x800, "ext_temp_sel"}, /* select external temperature also the ext_temp will be put on the temp read out , */\ + { 0x818, "ext_temp"}, /* external temperature setting to be given by host , */\ + { 0x8a0, "ctrl_spk_coilpvp_bst"}, /* Peak voltage protection boost converter , */\ + { 0x8b2, "ctrl_dcdc_synchronisation"}, /* DCDC synchronisation off + 7 positions , */\ + { 0x8e0, "ctrl_cs_samplevalid"}, /* sample valid moment for CS in single sample moment mode, */\ + { 0x900, "PowerDown"}, /* ON/OFF , */\ + { 0x910, "reset"}, /* I2CReset , */\ + { 0x920, "enbl_coolflux"}, /* EnableCoolFlux , */\ + { 0x930, "enbl_amplifier"}, /* EnableAmplifier , */\ + { 0x940, "enbl_boost"}, /* EnableBoost , */\ + { 0x950, "cf_configured"}, /* Coolflux configured , */\ + { 0x960, "sel_enbl_amplifier"}, /* Selection on how AmplifierEnabling , */\ + { 0x970, "dcdcoff_mode"}, /* DCDC not connected , */\ + { 0x980, "cttr_iddqtest"}, /* Iddq test amplifier , */\ + { 0x991, "ctrl_coil_value"}, /* Coil Value , */\ + { 0x9b1, "ctrl_sel_cf_clock"}, /* Selection CoolFluxClock , */\ + { 0x9d0, "intf_sel"}, /* Interface Selection , */\ + { 0x9e0, "sel_ws_bck"}, /* selection input PLL for lock , */\ + { 0xa02, "sel_i2so_l"}, /* Output selection dataout left channel , */\ + { 0xa32, "sel_i2so_r"}, /* Output selection dataout right channel , */\ + { 0xa62, "ctrl_spkr_coil"}, /* Selection speaker induction , */\ + { 0xa91, "ctrl_spr_res"}, /* Selection speaker impedance , */\ + { 0xab3, "ctrl_dcdc_spkr_i_comp_gain"}, /* DCDC speaker current compensation gain , */\ + { 0xaf0, "ctrl_dcdc_spkr_i_comp_sign"}, /* DCDC speaker current compensation sign , */\ + { 0xb07, "MTP_key2"}, /* MTP KEY2 register , */\ + { 0xc0c, "clk_sync_delay"}, /* Delay count for clock synchronisation , */\ + { 0xcf0, "enbl_clk_sync"}, /* Enable CGU clock synchronisation , */\ + { 0xd0c, "adc_sync_delay"}, /* Delay count for ADC synchronisation , */\ + { 0xdf0, "enable_adc_sync"}, /* Enable ADC synchronisation , */\ + { 0xe00, "bypass_dcdc_curr_prot"}, /* to switch off dcdc reduction with bat prot , */\ + { 0xe24, "ctrl_digtoana6_2"}, /* for extra connections digital to analog , */\ + { 0xe70, "switch_on_icomp"}, /* icomp dem switch , */\ + { 0xe87, "reserve_reg_1_7_0"}, /* reserved , */\ + { 0xf00, "flag_por_mask"}, /* mask flag_por for interupt generation , */\ + { 0xf10, "flag_otpok_mask"}, /* mask flag_otpok for interupt generation , */\ + { 0xf20, "flag_ovpok_mask"}, /* mask flag_ovpok for interupt generation , */\ + { 0xf30, "flag_uvpok_mask"}, /* mask flag_uvpok for interupt generation , */\ + { 0xf40, "flag_ocp_alarm_mask"}, /* mask flag_ocp_alarm for interupt generation , */\ + { 0xf50, "flag_clocks_stable_mask"}, /* mask flag_clocks_stable for interupt generation , */\ + { 0xf60, "flag_pwrokbst_mask"}, /* mask flag_pwrokbst for interupt generation , */\ + { 0xf70, "flag_cf_speakererror_mask"}, /* mask flag_cf_speakererror for interupt generation , */\ + { 0xf80, "flag_watchdog_reset_mask"}, /* mask flag_watchdog_reset for interupt generation , */\ + { 0xf90, "flag_lost_clk_mask"}, /* mask flag_lost_clk for interupt generation , */\ + { 0xfe0, "enable_interrupt"}, /* enabling interrupt , */\ + { 0xff0, "invert_int_polarity"}, /* Setting polarity interupt , */\ + { 0x1000, "pdm_i2s_input"}, /* Audio input interface mode , */\ + { 0x1010, "I2S_master_ena"}, /* I2S Master enable (CLK and WS pads) , */\ + { 0x1021, "pdm_out_sel_r"}, /* PDM Output right channel source selection , */\ + { 0x1041, "pdm_out_sel_l"}, /* PDM Output Left/Mono channel source selection , */\ + { 0x1061, "micdat_out_sel"}, /* Output interface mode and ball selection , */\ + { 0x1100, "secure_dly"}, /* Secure delay Cell , */\ + { 0x1110, "d_out_valid_rf_mux"}, /* Rising Falling Resync control Mux , */\ + { 0x1140, "Speak_As_Mic_en"}, /* Speaker As a Mic feature ON/OFF , */\ + { 0x1150, "speak_as_mic_lp_mode"}, /* speaker_as_mic low power mode (only in PDM_out mode), */\ + { 0x1160, "pdm_out_rate"}, /* PDM output interpolation ratio , */\ + { 0x1203, "ds4_g1_r"}, /* PDM Interpolator Right Channel DS4 G1 Gain Value , */\ + { 0x1243, "ds4_g2_r"}, /* PDM Interpolator Right Channel DS4 G2 Gain Value , */\ + { 0x1303, "ds4_g1_l"}, /* PDM Interpolator Left Channel DS4 G1 Gain Value , */\ + { 0x1343, "ds4_g2_l"}, /* PDM Interpolator Left Channel DS4 G2 Gain Value , */\ + { 0x1400, "clk_secure_dly"}, /* Secure delay Cell on clock path , */\ + { 0x1410, "data_secure_dly"}, /* Secure delay Cell enable on PDM data path , */\ + { 0x2202, "Ctrl_saam_pga_gain"}, /* pga gain , */\ + { 0x2250, "ctrl_saam_pga_src"}, /* 0 = active input common mode voltage source at the attenuator/PGA level, */\ + { 0x2300, "flag_saam_spare"}, /* spare flag , */\ + { 0x2400, "ctrl_saam_pga_tm"}, /* enables PGA test mode , */\ + { 0x2500, "pll_fcco"}, /* pll cco frequency , */\ + { 0x3000, "flag_hi_small"}, /* positive small window dcdc converter , */\ + { 0x3010, "flag_hi_large"}, /* positive large window dcdc converter , */\ + { 0x3020, "flag_lo_small"}, /* negative small window dcdc converter , */\ + { 0x3030, "flag_lo_large"}, /* negative large window dcdc converter , */\ + { 0x3040, "flag_voutcomp"}, /* flag_voutcomp, indication Vset is larger than Vbat, */\ + { 0x3050, "flag_voutcomp93"}, /* flag_voutcomp93, indication Vset is larger than 1.07* Vbat , */\ + { 0x3060, "flag_voutcomp86"}, /* flag_voutcomp86, indication Vset is larger than 1.14* Vbat , */\ + { 0x3070, "flag_hiz"}, /* flag_hiz, indication Vbst is larger than Vbat , */\ + { 0x3080, "flag_hi_peak"}, /* flag_hi_peak, indication hi_peak , */\ + { 0x3090, "flag_ocpokbst"}, /* flag_ocpokbst, indication no over current in boost converter pmos switch, */\ + { 0x30a0, "flag_peakcur"}, /* flag_peakcur, indication current is max in dcdc converter, */\ + { 0x30b0, "flag_ocpokap"}, /* flag_ocpokap, indication no over current in amplifier "a" pmos output stage, */\ + { 0x30c0, "flag_ocpokan"}, /* flag_ocpokan, indication no over current in amplifier "a" nmos output stage, */\ + { 0x30d0, "flag_ocpokbp"}, /* flag_ocpokbp, indication no over current in amplifier "b" pmos output stage, */\ + { 0x30e0, "flag_ocpokbn"}, /* flag_ocpokbn, indication no over current in amplifier"b" nmos output stage, */\ + { 0x30f0, "lost_clk"}, /* lost_clk, lost clock indication CGU , */\ + { 0x310f, "mtp_man_data_out"}, /* single word read from MTP (manual copy) , */\ + { 0x3200, "key01_locked"}, /* key01_locked, indication key 1 is locked , */\ + { 0x3210, "key02_locked"}, /* key02_locked, indication key 2 is locked , */\ + { 0x3225, "mtp_ecc_tcout"}, /* mtp_ecc_tcout , */\ + { 0x3280, "mtpctrl_valid_test_rd"}, /* mtp test readout for read , */\ + { 0x3290, "mtpctrl_valid_test_wr"}, /* mtp test readout for write , */\ + { 0x32a0, "flag_in_alarm_state"}, /* alarm state , */\ + { 0x32b0, "mtp_ecc_err2"}, /* two or more bit errors detected in MTP, can not reconstruct value, */\ + { 0x32c0, "mtp_ecc_err1"}, /* one bit error detected in MTP, reconstructed value, */\ + { 0x32d0, "mtp_mtp_hvf"}, /* high voltage ready flag for MTP , */\ + { 0x32f0, "mtp_zero_check_fail"}, /* zero check failed (tbd) for MTP , */\ + { 0x3300, "flag_adc10_ready"}, /* flag_adc10_ready, indication adc10 is ready , */\ + { 0x3310, "flag_clipa_high"}, /* flag_clipa_high, indication pmos amplifier "a" is clipping, */\ + { 0x3320, "flag_clipa_low"}, /* flag_clipa_low, indication nmos amplifier "a" is clipping, */\ + { 0x3330, "flag_clipb_high"}, /* flag_clipb_high, indication pmos amplifier "b" is clipping, */\ + { 0x3340, "flag_clipb_low"}, /* flag_clipb_low, indication nmos amplifier "b" is clipping, */\ + { 0x3359, "data_adc10_tempbat"}, /* adc 10 data output for testing , */\ + { 0x33f0, "flag_vddd_comp_nok"}, /* power switch flag 2 for testing , */\ + { 0x400f, "hid_code"}, /* hidden code , */\ + { 0x4100, "bypass_hp"}, /* Bypass_High Pass Filter , */\ + { 0x4110, "hard_mute"}, /* Hard Mute , */\ + { 0x4120, "soft_mute"}, /* Soft Mute , */\ + { 0x4134, "PWM_Delay"}, /* PWM DelayBits to set the delay , */\ + { 0x4180, "PWM_Shape"}, /* PWM Shape , */\ + { 0x4190, "PWM_BitLength"}, /* PWM Bitlength in noise shaper , */\ + { 0x4207, "ctrl_drive"}, /* drive bits to select amount of power stages amplifier, */\ + { 0x4281, "dpsalevel"}, /* DPSA Threshold level , */\ + { 0x42a1, "dpsa_release"}, /* DPSA Release time , */\ + { 0x42c0, "ctrl_coincidence"}, /* Prevent simultaneously switching of output stage , */\ + { 0x42d0, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x42e0, "ctrl_test_sdeltaoffset"}, /* ctrl_test_sdeltaoffset , */\ + { 0x42f0, "ctrl_test_sdeltaclk"}, /* ctrl_test_sdeltaclk , */\ + { 0x4309, "ctrl_drivebst"}, /* Drive bits to select the powertransistor sections boost converter, */\ + { 0x43a0, "ctrl_ocptestbst"}, /* Boost OCP. , */\ + { 0x43c0, "enbl_hi_peak"}, /* enable for high peak comparator , */\ + { 0x43d0, "test_abistfft_enbl"}, /* FFT coolflux , */\ + { 0x43e0, "ctrl_sensetest_amp"}, /* sensetest amplifier , */\ + { 0x43f0, "test_bcontrol"}, /* test _bcontrol , */\ + { 0x4400, "ctrl_reversebst"}, /* OverCurrent Protection selection of power stage boost converter, */\ + { 0x4410, "ctrl_sensetest"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0x4420, "enbl_engagebst"}, /* Enable power stage dcdc controller , */\ + { 0x4430, "enbl_hi_small"}, /* Enable bit of hi (small) comparator , */\ + { 0x4440, "enbl_hi_large"}, /* Enable bit of hi (large) comparator , */\ + { 0x4450, "enbl_lo_small"}, /* Enable bit of lo (small) comparator , */\ + { 0x4460, "enbl_lo_large"}, /* Enable bit of lo (large) comparator , */\ + { 0x4470, "enbl_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x4480, "enbl_voutcomp"}, /* Enable vout comparators , */\ + { 0x4490, "enbl_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x44a0, "enbl_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x44b0, "enbl_hizcom"}, /* Enable hiz comparator , */\ + { 0x44c0, "enbl_pcdac"}, /* Enable peak current dac , */\ + { 0x44d0, "enbl_pccomp"}, /* Enable peak current comparator , */\ + { 0x44e0, "enbl_windac"}, /* Enable window dac , */\ + { 0x44f0, "enbl_powerbst"}, /* Enable line of the powerstage , */\ + { 0x4507, "ocp_thr"}, /* ocp_thr threshold level for OCP , */\ + { 0x4580, "bypass_glitchfilter"}, /* Bypass glitchfilter , */\ + { 0x4590, "bypass_ovp"}, /* Bypass OVP , */\ + { 0x45a0, "bypass_uvp"}, /* Bypass UVP , */\ + { 0x45b0, "bypass_otp"}, /* Bypass OTP , */\ + { 0x45c0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0x45d0, "bypass_ocpcounter"}, /* BypassOCPCounter , */\ + { 0x45e0, "bypass_lost_clk"}, /* Bypasslost_clk detector , */\ + { 0x45f0, "vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0x4600, "bypass_gc"}, /* bypass_gc, bypasses the CS gain correction , */\ + { 0x4610, "cs_gain_control"}, /* gain control by means of MTP or i2c , */\ + { 0x4627, "cs_gain"}, /* + / - 128 steps in steps of 1/4 % 2's compliment , */\ + { 0x46a0, "bypass_lp"}, /* bypass Low-Pass filter in temperature sensor , */\ + { 0x46b0, "bypass_pwmcounter"}, /* bypass_pwmcounter , */\ + { 0x46c0, "ctrl_cs_negfixed"}, /* does not switch to neg , */\ + { 0x46d2, "ctrl_cs_neghyst"}, /* switches to neg depending on level , */\ + { 0x4700, "switch_fb"}, /* switch_fb , */\ + { 0x4713, "se_hyst"}, /* se_hyst , */\ + { 0x4754, "se_level"}, /* se_level , */\ + { 0x47a5, "ktemp"}, /* temperature compensation trimming , */\ + { 0x4800, "ctrl_negin"}, /* negin , */\ + { 0x4810, "ctrl_cs_sein"}, /* cs_sein , */\ + { 0x4820, "ctrl_coincidencecs"}, /* Coincidence current sense , */\ + { 0x4830, "ctrl_iddqtestbst"}, /* for iddq testing in powerstage of boost convertor , */\ + { 0x4840, "ctrl_coincidencebst"}, /* Switch protection on to prevent simultaniously switching power stages bst and amp, */\ + { 0x4851, "clock_sh_sel"}, /* Clock SH selection , */\ + { 0x4876, "delay_se_neg"}, /* delay of se and neg , */\ + { 0x48e1, "ctrl_cs_ttrack"}, /* sample & hold track time , */\ + { 0x4900, "ctrl_bypassclip"}, /* Bypass clip control (function depending on digimux clip_x), */\ + { 0x4910, "ctrl_bypassclip2"}, /* Bypass clip control (function depending on digimux clip_x), */\ + { 0x4920, "ctrl_clkgateCFoff"}, /* to disable clock gating in the coolflux , */\ + { 0x4930, "ctrl_testabst"}, /* testabst , */\ + { 0x4940, "ctrl_clipfast"}, /* clock switch for battery protection clipper, it switches back to old frequency, */\ + { 0x4950, "ctrl_cs_8ohm"}, /* 8 ohm mode for current sense (gain mode) , */\ + { 0x4960, "reserved"}, /* reserved , */\ + { 0x4974, "delay_clock_sh"}, /* delay_sh, tunes S7H delay , */\ + { 0x49c0, "inv_clksh"}, /* Invert the sample/hold clock for current sense ADC, */\ + { 0x49d0, "inv_neg"}, /* Invert neg signal , */\ + { 0x49e0, "inv_se"}, /* Invert se signal , */\ + { 0x49f0, "setse"}, /* switches between Single Ende and differentail mode, */\ + { 0x4a12, "ctrl_adc10_sel"}, /* select the input to convert the 10b ADC , */\ + { 0x4a60, "ctrl_adc10_reset"}, /* Global asynchronous reset (active HIGH) 10 bit ADC, */\ + { 0x4a81, "ctrl_adc10_test"}, /* Test mode selection signal 10 bit ADC , */\ + { 0x4aa0, "ctrl_bypass_lp_vbat"}, /* lp filter in batt sensor , */\ + { 0x4ae0, "ctrl_dc_offset"}, /* switch offset control on/off, is decimator offset control, */\ + { 0x4af0, "ctrl_tsense_hibias"}, /* bit to set the biasing in temp sensor to high , */\ + { 0x4b00, "ctrl_adc13_iset"}, /* Micadc Setting of current consumption. Debug use only, */\ + { 0x4b14, "ctrl_adc13_gain"}, /* Micadc gain setting (2-compl) , */\ + { 0x4b61, "ctrl_adc13_slowdel"}, /* Micadc Delay setting for internal clock. Debug use only, */\ + { 0x4b83, "ctrl_adc13_offset"}, /* Micadc ADC offset setting , */\ + { 0x4bc0, "ctrl_adc13_bsoinv"}, /* Micadc bit stream output invert mode for test , */\ + { 0x4bd0, "ctrl_adc13_resonator_enable"}, /* Micadc Give extra SNR with less stability. Debug use only, */\ + { 0x4be0, "ctrl_testmicadc"}, /* Mux at input of MICADC for test purpose , */\ + { 0x4c0f, "ctrl_offset"}, /* offset control for ABIST testing , */\ + { 0x4d05, "ctrl_windac"}, /* for testing direct control windac , */\ + { 0x4d65, "ctrl_peakcur"}, /* Control peakcur , */\ + { 0x4dc3, "pwm_dcc_cnt"}, /* control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0x4e04, "ctrl_slopecur"}, /* for testing direct control slopecur , */\ + { 0x4e53, "ctrl_dem"}, /* dyn element matching control, rest of codes are optional, */\ + { 0x4e93, "ctrl_demmismatch"}, /* dyn element matching add offset , */\ + { 0x4ed0, "enbl_pwm_dcc"}, /* to enable direct control of pwm duty cycle , */\ + { 0x5007, "gain"}, /* gain setting of the gain multiplier gain need to increase with factor 1.41 (3dB), */\ + { 0x5081, "ctrl_sourceb"}, /* Set OUTB to , */\ + { 0x50a1, "ctrl_sourcea"}, /* Set OUTA to , */\ + { 0x50c1, "ctrl_sourcebst"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0x50e1, "ctrl_test_mono"}, /* ABIST mode to add both amplifier halfs as stereo or one amplifier half as mono, */\ + { 0x5104, "pulselengthbst"}, /* pulselength setting test input for boost converter , */\ + { 0x5150, "ctrl_bypasslatchbst"}, /* bypass_latch in boost converter , */\ + { 0x5160, "invertbst"}, /* invert pwmbst test signal , */\ + { 0x5174, "pulselength"}, /* pulselength setting test input for amplifier , */\ + { 0x51c0, "ctrl_bypasslatch"}, /* bypass_latch in boost convert , */\ + { 0x51d0, "invertb"}, /* invert pwmb test signal , */\ + { 0x51e0, "inverta"}, /* invert pwma test signal , */\ + { 0x51f0, "ctrl_bypass_ctrlloop"}, /* bypass_ctrlloop bypasses the control loop of the amplifier, */\ + { 0x5200, "ctrl_test_discrete"}, /* tbd for rdson testing , */\ + { 0x5210, "ctrl_test_rdsona"}, /* tbd for rdson testing , */\ + { 0x5220, "ctrl_test_rdsonb"}, /* tbd for rdson testing , */\ + { 0x5230, "ctrl_test_rdsonbst"}, /* tbd for rdson testing , */\ + { 0x5240, "ctrl_test_cvia"}, /* tbd for rdson testing , */\ + { 0x5250, "ctrl_test_cvib"}, /* tbd for rdson testing , */\ + { 0x5260, "ctrl_test_cvibst"}, /* tbd for rdson testing , */\ + { 0x5290, "test_bypass_pwmdiscretea"}, /* for testing ( ABIST) , */\ + { 0x52a0, "test_bypass_pwmdiscreteb"}, /* for testing ( ABIST) , */\ + { 0x52b0, "ctrl_clipc_forcehigh"}, /* test signal for clipcontrol , */\ + { 0x52c0, "ctrl_clipc_forcelow"}, /* test signal for clipcontrol , */\ + { 0x52d0, "ctrl_test_sdelta"}, /* for testing ( ABIST) , */\ + { 0x52e0, "ctrl_test_swhvp"}, /* for testing ( ABIST) , */\ + { 0x52f0, "test_gain_reduction"}, /* test gain reduction , */\ + { 0x5303, "ctrl_digimux_out_test1"}, /* Digimux TEST1 out , */\ + { 0x5343, "ctrl_digimux_out_test2"}, /* Digimux TEST2 out. output flag_clipa_low depending on cntr_bypassclip setting, */\ + { 0x5383, "ctrl_digimux_out_data1"}, /* Digimux DATA1 out (output flag_clipb_high depending on cntr_bypassclip setting), */\ + { 0x53c3, "ctrl_digimux_out_data3"}, /* Digimux DATA3 out (output flag_clipx_x depending on cntr_bypassclip setting), */\ + { 0x5400, "hs_mode"}, /* hs_mode, high speed mode I2C bus , */\ + { 0x5412, "test_parametric_io"}, /* test_parametric_io for testing pads , */\ + { 0x5440, "enbl_ringo"}, /* enbl_ringo, for test purpose to check with ringo , */\ + { 0x5480, "ctrl_cliplevel"}, /* Clip level , */\ + { 0x5491, "ctrl_anamux_sel"}, /* anamux selection , */\ + { 0x54b0, "test_vdddsw_dio"}, /* to overrule the power switches for memory , */\ + { 0x54c0, "ctrl_bypass_diosw_ovp"}, /* To disable the overvoltage protection of vddd_dio_sw, */\ + { 0x54d0, "test_vddd_sw"}, /* test vdd sw , */\ + { 0x54e0, "test_vddd_sw_comp"}, /* test vdd sw comp , */\ + { 0x550e, "enbl_amp"}, /* enbl_amp for testing to enable all analoge blocks in amplifier, */\ + { 0x55f0, "fr_fsp"}, /* extr free running clock mode for testing , */\ + { 0x5600, "use_direct_ctrls"}, /* use_direct_ctrls, to overrule several functions direct for testing, */\ + { 0x5610, "rst_datapath"}, /* rst_datapath, datapath reset , */\ + { 0x5620, "rst_cgu"}, /* rst_cgu, cgu reset , */\ + { 0x5637, "enbl_ref"}, /* for testing to enable all analoge blocks in references, */\ + { 0x56b0, "enbl_engage"}, /* Enable output stage amplifier , */\ + { 0x56c0, "use_direct_clk_ctrl"}, /* use_direct_clk_ctrl, to overrule several functions direct for testing, */\ + { 0x56d0, "use_direct_pll_ctrl"}, /* use_direct_pll_ctrl, to overrule several functions direct for test, */\ + { 0x56e0, "use_direct_ctrls_2"}, /* use_direct_sourseamp_ctrls, to overrule several functions direct for testing, */\ + { 0x5707, "ctrl_anamux_out_test1"}, /* Anamux control , */\ + { 0x5782, "ctrl_zero"}, /* Bandwith control feedbackloop , */\ + { 0x57b0, "enbl_ldo_stress"}, /* LDO stress function frinch capacitors , */\ + { 0x57c0, "ctrl_ocptest"}, /* ctrl_ocptest, deactivates the over current protection in the power stages of the amplifier. The ocp flag signals stay active., */\ + { 0x57e0, "ctrl_otptest"}, /* otptest, test mode otp amplifier , */\ + { 0x57f0, "ctrl_reverse"}, /* CTRL revers , */\ + { 0x5802, "pll_mdec_msb"}, /* most significant bits pll_mdec , */\ + { 0x5833, "pll_selr"}, /* pll_selr , */\ + { 0x5874, "pll_selp"}, /* pll_selp , */\ + { 0x58c3, "pll_seli"}, /* pll_seli , */\ + { 0x5900, "pll_psel"}, /* pll_psel , */\ + { 0x5910, "use_direct_pll_psel"}, /* use_direct_pll_psel , */\ + { 0x5923, "nbck"}, /* NBCK , */\ + { 0x5960, "auto_nbck"}, /* AUTO_NBCK , */\ + { 0x5970, "pll_frm"}, /* pll_frm , */\ + { 0x5980, "pll_directi"}, /* pll_directi , */\ + { 0x5990, "pll_directo"}, /* pll_directo , */\ + { 0x59a0, "enbl_PLL"}, /* enbl_PLL , */\ + { 0x59b0, "sel_clkout"}, /* SEL_CLKOUT , */\ + { 0x59e0, "fr_lost_clk"}, /* fr_lost_clk , */\ + { 0x59f0, "pll_bypass"}, /* pll_bypass , */\ + { 0x5a0f, "tsig_freq"}, /* tsig_freq, internal sinus test generator, frequency control, */\ + { 0x5b02, "tsig_freq_msb"}, /* select internal sinus test generator, frequency control msb bits, */\ + { 0x5b30, "inject_tsig"}, /* inject_tsig, control bit to switch to internal sinus test generator, */\ + { 0x5b44, "ctrl_adc10_prog_sample"}, /* control ADC10 , */\ + { 0x5c01, "pll_ndec_msb"}, /* most significant bits of pll_ndec , */\ + { 0x5c2d, "pll_mdec"}, /* bits 13..0 of pll_mdec , */\ + { 0x5d06, "pll_pdec"}, /* pll_pdec , */\ + { 0x5d87, "pll_ndec"}, /* bits 7..0 of pll_ndec , */\ + { 0x5e00, "pdm_ch_sel_reg"}, /* PDM channel selection , */\ + { 0x5e10, "pdm_iis_rst_reg"}, /* PDM Interface reset , */\ + { 0x5e20, "clk_src_sel_reg"}, /* WS Source Selection , */\ + { 0x5e70, "pdm_resync_bypass"}, /* PDM resynchronization bypass , */\ + { 0x6007, "MTP_key1"}, /* MTP Key1 , */\ + { 0x6185, "mtp_ecc_tcin"}, /* Mtp_ecc_tcin , */\ + { 0x6203, "mtp_man_address_in"}, /* address from i2cregs for writing one word single mtp, */\ + { 0x6260, "mtp_ecc_eeb"}, /* enable code bit generation (active low!) , */\ + { 0x6270, "mtp_ecc_ecb"}, /* enable correction signal (active low!) , */\ + { 0x6280, "man_copy_mtp_to_iic"}, /* start copying single word from mtp to i2cregs_mtp , */\ + { 0x6290, "man_copy_iic_to_mtp"}, /* start copying single word from i2cregs_mtp to mtp [Key 1 protected], */\ + { 0x62a0, "auto_copy_mtp_to_iic"}, /* start copying all the data from mtp to i2cregs_mtp, */\ + { 0x62b0, "auto_copy_iic_to_mtp"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ + { 0x62d2, "mtp_speed_mode"}, /* Speed mode , */\ + { 0x6340, "mtp_dircet_enable"}, /* mtp_direct_enable (key1 protected) , */\ + { 0x6350, "mtp_direct_wr"}, /* mtp_direct_wr (key1 protected) direct value for mtp pin wr. To be enabled via iic2mtp_mtp_direct_enable, */\ + { 0x6360, "mtp_direct_rd"}, /* mtp_direct_rd (key1 protected) direct value for mtp pin rd. To be enabled via iic2mtp_mtp_direct_enable, */\ + { 0x6370, "mtp_direct_rst"}, /* mtp_direct_rst (key1 protected) direct value for mtp pin rst. To be enabled via iic2mtp_mtp_direct_enable, */\ + { 0x6380, "mtp_direct_ers"}, /* mtp_direct_ers (key1 protected) direct value for mtp pin ers. To be enabled via iic2mtp_mtp_direct_enable, */\ + { 0x6390, "mtp_direct_prg"}, /* mtp_direct_prg (key1 protected) direct value for mtp pin prg. To be enabled via iic2mtp_mtp_direct_enable, */\ + { 0x63a0, "mtp_direct_epp"}, /* mtp_direct_epp (key1 protected) direct value for mtp pin epp. To be enabled via iic2mtp_mtp_direct_enable, */\ + { 0x63b4, "mtp_direct_test"}, /* mtp_direct_test (key1 protected) , */\ + { 0x640f, "mtp_man_data_in"}, /* single wordt be written to MTP (manual copy) , */\ + { 0x7000, "cf_rst_dsp"}, /* Reset CoolFlux DSP , */\ + { 0x7011, "cf_dmem"}, /* Target memory for access , */\ + { 0x7030, "cf_aif"}, /* Autoincrement-flag for memory-address , */\ + { 0x7040, "cf_int"}, /* Interrupt CoolFlux DSP , */\ + { 0x7087, "cf_req"}, /* request for access (8 channels) , */\ + { 0x710f, "cf_madd"}, /* memory-address to be accessed , */\ + { 0x720f, "cf_mema"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ + { 0x7307, "cf_err"}, /* cf error Flags , */\ + { 0x7387, "cf_ack"}, /* acknowledge of requests (8 channels")" , */\ + { 0x8000, "calibration_onetime"}, /* Calibration schedule (key2 protected) , */\ + { 0x8010, "calibr_ron_done"}, /* (key2 protected) calibration of Ron has been executed, */\ + { 0x8105, "calibr_vout_offset"}, /* calibr_vout_offset (DCDCoffset) 2's compliment (key1 protected), */\ + { 0x8163, "calibr_delta_gain"}, /* delta gain for vamp (alpha) 2's compliment (key1 protected), */\ + { 0x81a5, "calibr_offs_amp"}, /* offset for vamp (Ampoffset) 2's compliment (key1 protected), */\ + { 0x8207, "calibr_gain_cs"}, /* gain current sense (Imeasalpha) 2's compliment (key1 protected), */\ + { 0x8284, "calibr_temp_offset"}, /* temperature offset 2's compliment (key1 protected), */\ + { 0x82d2, "calibr_temp_gain"}, /* temperature gain 2's compliment (key1 protected) , */\ + { 0x830f, "calibr_ron"}, /* Ron resistance of coil (key1 protected) , */\ + { 0x8406, "ctrl_offset_a"}, /* Offset of amplifier level shifter , */\ + { 0x8486, "ctrl_offset_b"}, /* Offset of amplifier level shifter , */\ + { 0x850f, "type_bits_HW"}, /* HW Bits , */\ + { 0x860f, "type_bits1_SW"}, /* MTP-control SW1 , */\ + { 0x870f, "type_bits2_SW"}, /* MTP-control SW2 , */\ + { 0x8a0f, "production_data1"}, /* (key1 protected) , */\ + { 0x8b0f, "production_data2"}, /* (key1 protected) , */\ + { 0x8c0f, "production_data3"}, /* (key1 protected) , */\ + { 0x8d0f, "production_data4"}, /* (key1 protected) , */\ + { 0x8e0f, "production_data5"}, /* (key1 protected) , */\ + { 0x8f0f, "production_data6"}, /* (key1 protected) , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + + +#endif /* TFA_INC_TFA9891_TFAFIELDNAMES_H_ */ diff --git a/inc/tfa9894_tfafieldnames.h b/inc/tfa9894_tfafieldnames.h new file mode 100644 index 000000000000..69a60edeb261 --- /dev/null +++ b/inc/tfa9894_tfafieldnames.h @@ -0,0 +1,1079 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9894_tfaFieldnames_N1Last.h + * This file was generated automatically on 09/28/18 at 11:24:56. + * Source file: TFA9894_N1A1_I2C_RegisterMap.xlsx + */ + +#ifndef _TFA9894_TFAFIELDNAMES_H +#define _TFA9894_TFAFIELDNAMES_H + + +#define TFA9894_I2CVERSION 17.0 + +typedef enum Tfa9894BfEnumList { + TFA9894_BF_PWDN = 0x0000, /*!< Powerdown control */ + TFA9894_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ + TFA9894_BF_CFE = 0x0020, /*!< Enable CoolFlux DSP */ + TFA9894_BF_AMPE = 0x0030, /*!< Enable Amplifier */ + TFA9894_BF_DCA = 0x0040, /*!< Enable DCDC Boost converter */ + TFA9894_BF_SBSL = 0x0050, /*!< Coolflux configured */ + TFA9894_BF_AMPC = 0x0060, /*!< CoolFlux control over amplifier */ + TFA9894_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9894_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ + TFA9894_BF_BYPOCP = 0x00a0, /*!< Bypass OCP */ + TFA9894_BF_TSTOCP = 0x00b0, /*!< OCP testing control */ + TFA9894_BF_BSSS = 0x00c0, /*!< Vbat protection steepness */ + TFA9894_BF_HPFBYP = 0x00d0, /*!< Bypass High Pass Filter */ + TFA9894_BF_DPSA = 0x00e0, /*!< Enable DPSA */ + TFA9894_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ + TFA9894_BF_MANSCONF = 0x0120, /*!< Device I2C settings configured */ + TFA9894_BF_MANCOLD = 0x0130, /*!< Execute cold start */ + TFA9894_BF_MANROBOD = 0x0140, /*!< Reaction on BOD */ + TFA9894_BF_BODE = 0x0150, /*!< Enable BOD (only in direct control mode) */ + TFA9894_BF_BODHYS = 0x0160, /*!< Enable Hysteresis of BOD */ + TFA9894_BF_BODFILT = 0x0171, /*!< BOD filter */ + TFA9894_BF_BODTHLVL = 0x0191, /*!< BOD threshold */ + TFA9894_BF_MUTETO = 0x01b0, /*!< Time out SB mute sequence */ + TFA9894_BF_MANWDE = 0x01c0, /*!< Watchdog enable */ + TFA9894_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ + TFA9894_BF_FAIMVBGOVRRL = 0x01f0, /*!< Overrule the enabling of VBG for faim erase/write access */ + TFA9894_BF_AUDFS = 0x0203, /*!< Audio sample rate Fs */ + TFA9894_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9894_BF_FRACTDEL = 0x0255, /*!< Current sense fractional delay */ + TFA9894_BF_TDMPRES = 0x02b1, /*!< Control for HW manager */ + TFA9894_BF_AMPOCRT = 0x02d2, /*!< Amplifier on-off criteria for shutdown */ + TFA9894_BF_REV = 0x030f, /*!< Revision info */ + TFA9894_BF_REFCKEXT = 0x0401, /*!< PLL external reference clock */ + TFA9894_BF_REFCKSEL = 0x0420, /*!< PLL internal reference clock */ + TFA9894_BF_MCLKSEL = 0x0432, /*!< Master Clock Selection */ + TFA9894_BF_MANAOOSC = 0x0460, /*!< Internal OSC1M off at PWDN */ + TFA9894_BF_ACKCLDDIS = 0x0470, /*!< Automatic PLL reference clock selection for cold start */ + TFA9894_BF_SPKSSEN = 0x0510, /*!< Enable speaker sub-system */ + TFA9894_BF_MTPSSEN = 0x0520, /*!< Enable FAIM sub-system */ + TFA9894_BF_WDTCLKEN = 0x0530, /*!< Enable Coolflux watchdog clock */ + TFA9894_BF_VDDS = 0x1000, /*!< POR */ + TFA9894_BF_PLLS = 0x1010, /*!< PLL Lock */ + TFA9894_BF_OTDS = 0x1020, /*!< OTP alarm */ + TFA9894_BF_OVDS = 0x1030, /*!< OVP alarm */ + TFA9894_BF_UVDS = 0x1040, /*!< UVP alarm */ + TFA9894_BF_OCDS = 0x1050, /*!< OCP amplifier (sticky register, clear on read) */ + TFA9894_BF_CLKS = 0x1060, /*!< Clocks stable */ + TFA9894_BF_MTPB = 0x1070, /*!< MTP busy */ + TFA9894_BF_NOCLK = 0x1080, /*!< Lost clock */ + TFA9894_BF_ACS = 0x1090, /*!< Cold Start */ + TFA9894_BF_WDS = 0x10a0, /*!< Watchdog */ + TFA9894_BF_SWS = 0x10b0, /*!< Amplifier engage */ + TFA9894_BF_AMPS = 0x10c0, /*!< Amplifier enable */ + TFA9894_BF_AREFS = 0x10d0, /*!< References enable */ + TFA9894_BF_ADCCR = 0x10e0, /*!< Control ADC */ + TFA9894_BF_BODNOK = 0x10f0, /*!< BOD Flag - VDD NOT OK */ + TFA9894_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9894_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ + TFA9894_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos (sticky register, clear on read) */ + TFA9894_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ + TFA9894_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ + TFA9894_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ + TFA9894_BF_SPKS = 0x1170, /*!< Speaker status */ + TFA9894_BF_CLKOOR = 0x1180, /*!< External clock status */ + TFA9894_BF_MANALARM = 0x1190, /*!< Alarm state */ + TFA9894_BF_TDMERR = 0x11a0, /*!< TDM error */ + TFA9894_BF_TDMLUTER = 0x11b0, /*!< TDM lookup table error */ + TFA9894_BF_OCPOAP = 0x1200, /*!< OCPOK pmos A */ + TFA9894_BF_OCPOAN = 0x1210, /*!< OCPOK nmos A */ + TFA9894_BF_OCPOBP = 0x1220, /*!< OCPOK pmos B */ + TFA9894_BF_OCPOBN = 0x1230, /*!< OCPOK nmos B */ + TFA9894_BF_CLIPS = 0x1240, /*!< Amplifier clipping */ + TFA9894_BF_MANMUTE = 0x1250, /*!< Audio mute sequence */ + TFA9894_BF_MANOPER = 0x1260, /*!< Device in Operating state */ + TFA9894_BF_LP1 = 0x1270, /*!< Low power MODE1 detection */ + TFA9894_BF_LA = 0x1280, /*!< Low amplitude detection */ + TFA9894_BF_VDDPH = 0x1290, /*!< VDDP greater than VBAT flag */ + TFA9894_BF_TDMSTAT = 0x1402, /*!< TDM Status bits */ + TFA9894_BF_MANSTATE = 0x1433, /*!< Device Manager status */ + TFA9894_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ + TFA9894_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9894_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9894_BF_VDDPS = 0x1709, /*!< IC VDDP voltage (1023*VDDP/13V) */ + TFA9894_BF_TDME = 0x2000, /*!< Enable interface */ + TFA9894_BF_TDMSPKE = 0x2010, /*!< Control audio tdm channel in sink0 */ + TFA9894_BF_TDMDCE = 0x2020, /*!< Control audio tdm channel in sink1 */ + TFA9894_BF_TDMCSE = 0x2030, /*!< Source 0 enable */ + TFA9894_BF_TDMVSE = 0x2040, /*!< Source 1 enable */ + TFA9894_BF_TDMCFE = 0x2050, /*!< Source 2 enable */ + TFA9894_BF_TDMCF2E = 0x2060, /*!< Source 3 enable */ + TFA9894_BF_TDMCLINV = 0x2070, /*!< Reception data to BCK clock */ + TFA9894_BF_TDMFSPOL = 0x2080, /*!< FS polarity */ + TFA9894_BF_TDMDEL = 0x2090, /*!< Data delay to FS */ + TFA9894_BF_TDMADJ = 0x20a0, /*!< Data adjustment */ + TFA9894_BF_TDMOOMP = 0x20b1, /*!< Received audio compression */ + TFA9894_BF_TDMNBCK = 0x2103, /*!< TDM NBCK - Bit clock to FS ratio */ + TFA9894_BF_TDMFSLN = 0x2143, /*!< FS length (master mode only) */ + TFA9894_BF_TDMSLOTS = 0x2183, /*!< N-slots in Frame */ + TFA9894_BF_TDMTXDFO = 0x21c1, /*!< Format unused bits */ + TFA9894_BF_TDMTXUS0 = 0x21e1, /*!< Format unused slots DATAO */ + TFA9894_BF_TDMSLLN = 0x2204, /*!< N-bits in slot */ + TFA9894_BF_TDMBRMG = 0x2254, /*!< N-bits remaining */ + TFA9894_BF_TDMSSIZE = 0x22a4, /*!< Sample size per slot */ + TFA9894_BF_TDMSPKS = 0x2303, /*!< TDM slot for sink 0 */ + TFA9894_BF_TDMDCS = 0x2343, /*!< TDM slot for sink 1 */ + TFA9894_BF_TDMCFSEL = 0x2381, /*!< TDM Source 2 data selection */ + TFA9894_BF_TDMCF2SEL = 0x23a1, /*!< TDM Source 3 data selection */ + TFA9894_BF_TDMCSS = 0x2403, /*!< Slot Position of source 0 data */ + TFA9894_BF_TDMVSS = 0x2443, /*!< Slot Position of source 1 data */ + TFA9894_BF_TDMCFS = 0x2483, /*!< Slot Position of source 2 data */ + TFA9894_BF_TDMCF2S = 0x24c3, /*!< Slot Position of source 3 data */ + TFA9894_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9894_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ + TFA9894_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9894_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ + TFA9894_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9894_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ + TFA9894_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ + TFA9894_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9894_BF_ISTCFMER = 0x4080, /*!< Status cfma error */ + TFA9894_BF_ISTCFMAC = 0x4090, /*!< Status cfma ack */ + TFA9894_BF_ISTSPKS = 0x40a0, /*!< Status coolflux speaker error */ + TFA9894_BF_ISTACS = 0x40b0, /*!< Status cold started */ + TFA9894_BF_ISTWDS = 0x40c0, /*!< Status watchdog reset */ + TFA9894_BF_ISTBODNOK = 0x40d0, /*!< Status brown out detect */ + TFA9894_BF_ISTLP1 = 0x40e0, /*!< Status low power mode1 detect */ + TFA9894_BF_ISTCLKOOR = 0x40f0, /*!< Status clock out of range */ + TFA9894_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9894_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ + TFA9894_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9894_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ + TFA9894_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9894_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ + TFA9894_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ + TFA9894_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9894_BF_ICLCFMER = 0x4480, /*!< Clear cfma err */ + TFA9894_BF_ICLCFMAC = 0x4490, /*!< Clear cfma ack */ + TFA9894_BF_ICLSPKS = 0x44a0, /*!< Clear coolflux speaker error */ + TFA9894_BF_ICLACS = 0x44b0, /*!< Clear cold started */ + TFA9894_BF_ICLWDS = 0x44c0, /*!< Clear watchdog reset */ + TFA9894_BF_ICLBODNOK = 0x44d0, /*!< Clear brown out detect */ + TFA9894_BF_ICLLP1 = 0x44e0, /*!< Clear low power mode1 detect */ + TFA9894_BF_ICLCLKOOR = 0x44f0, /*!< Clear clock out of range */ + TFA9894_BF_IEVDDS = 0x4800, /*!< Enable POR */ + TFA9894_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ + TFA9894_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9894_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ + TFA9894_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9894_BF_IEMANALARM = 0x4850, /*!< Enable Manager Alarm state */ + TFA9894_BF_IETDMER = 0x4860, /*!< Enable TDM error */ + TFA9894_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9894_BF_IECFMER = 0x4880, /*!< Enable cfma err */ + TFA9894_BF_IECFMAC = 0x4890, /*!< Enable cfma ack */ + TFA9894_BF_IESPKS = 0x48a0, /*!< Enable coolflux speaker error */ + TFA9894_BF_IEACS = 0x48b0, /*!< Enable cold started */ + TFA9894_BF_IEWDS = 0x48c0, /*!< Enable watchdog reset */ + TFA9894_BF_IEBODNOK = 0x48d0, /*!< Enable brown out detect */ + TFA9894_BF_IELP1 = 0x48e0, /*!< Enable low power mode1 detect */ + TFA9894_BF_IECLKOOR = 0x48f0, /*!< Enable clock out of range */ + TFA9894_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ + TFA9894_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ + TFA9894_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9894_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ + TFA9894_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9894_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ + TFA9894_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ + TFA9894_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9894_BF_IPOCFMER = 0x4c80, /*!< Polarity cfma err */ + TFA9894_BF_IPOCFMAC = 0x4c90, /*!< Polarity cfma ack */ + TFA9894_BF_IPOSPKS = 0x4ca0, /*!< Polarity coolflux speaker error */ + TFA9894_BF_IPOACS = 0x4cb0, /*!< Polarity cold started */ + TFA9894_BF_IPOWDS = 0x4cc0, /*!< Polarity watchdog reset */ + TFA9894_BF_IPOBODNOK = 0x4cd0, /*!< Polarity brown out detect */ + TFA9894_BF_IPOLP1 = 0x4ce0, /*!< Polarity low power mode1 detect */ + TFA9894_BF_IPOCLKOOR = 0x4cf0, /*!< Polarity clock out of range */ + TFA9894_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ + TFA9894_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ + TFA9894_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ + TFA9894_BF_BSSRR = 0x5082, /*!< Battery safeguard release time */ + TFA9894_BF_BSSHY = 0x50b1, /*!< Battery Safeguard hysteresis */ + TFA9894_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9894_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ + TFA9894_BF_CFSM = 0x5130, /*!< Coolflux firmware soft mute control */ + TFA9894_BF_VOL = 0x5187, /*!< CF firmware volume control */ + TFA9894_BF_CLIPCTRL = 0x5202, /*!< Clip control setting */ + TFA9894_BF_SLOPEE = 0x5230, /*!< Enables slope control */ + TFA9894_BF_SLOPESET = 0x5240, /*!< Slope speed setting (binary coded) */ + TFA9894_BF_AMPGAIN = 0x5287, /*!< Amplifier gain */ + TFA9894_BF_TDMDCG = 0x5703, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ + TFA9894_BF_TDMSPKG = 0x5743, /*!< Total gain depending on INPLEV setting (channel 0) */ + TFA9894_BF_DCINSEL = 0x5781, /*!< VAMP_OUT2 input selection */ + TFA9894_BF_LNMODE = 0x5881, /*!< Low noise gain mode control */ + TFA9894_BF_LPM1MODE = 0x5ac1, /*!< Low power mode control */ + TFA9894_BF_TDMSRCMAP = 0x5d02, /*!< TDM source mapping */ + TFA9894_BF_TDMSRCAS = 0x5d31, /*!< Sensed value A */ + TFA9894_BF_TDMSRCBS = 0x5d51, /*!< Sensed value B */ + TFA9894_BF_TDMSRCACLIP = 0x5d71, /*!< Clip information (analog /digital) for source0 */ + TFA9894_BF_TDMSRCBCLIP = 0x5d91, /*!< Clip information (analog /digital) for source1 */ + TFA9894_BF_DELCURCOMP = 0x6102, /*!< Delay to allign compensation signal with current sense signal */ + TFA9894_BF_SIGCURCOMP = 0x6130, /*!< Polarity of compensation for current sense */ + TFA9894_BF_ENCURCOMP = 0x6140, /*!< Enable current sense compensation */ + TFA9894_BF_LVLCLPPWM = 0x6152, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ + TFA9894_BF_DCVOF = 0x7005, /*!< First Boost Voltage Level */ + TFA9894_BF_DCVOS = 0x7065, /*!< Second Boost Voltage Level */ + TFA9894_BF_DCMCC = 0x70c3, /*!< Max Coil Current */ + TFA9894_BF_DCCV = 0x7101, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ + TFA9894_BF_DCIE = 0x7120, /*!< Adaptive boost mode */ + TFA9894_BF_DCSR = 0x7130, /*!< Soft ramp up/down */ + TFA9894_BF_DCDIS = 0x7140, /*!< DCDC on/off */ + TFA9894_BF_DCPWM = 0x7150, /*!< DCDC PWM only mode */ + TFA9894_BF_DCTRACK = 0x7160, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ + TFA9894_BF_DCENVSEL = 0x7170, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ + TFA9894_BF_DCTRIP = 0x7204, /*!< 1st adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9894_BF_DCTRIP2 = 0x7254, /*!< 2nd adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9894_BF_DCTRIPT = 0x72a4, /*!< Track adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9894_BF_DCTRIPHYSTE = 0x72f0, /*!< Enable hysteresis on booster trip levels */ + TFA9894_BF_DCHOLD = 0x7304, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ + TFA9894_BF_RST = 0x9000, /*!< Reset for Coolflux DSP */ + TFA9894_BF_DMEM = 0x9011, /*!< Target memory for CFMA using I2C interface */ + TFA9894_BF_AIF = 0x9030, /*!< Auto increment */ + TFA9894_BF_CFINT = 0x9040, /*!< Coolflux Interrupt - auto clear */ + TFA9894_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ + TFA9894_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ + TFA9894_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ + TFA9894_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ + TFA9894_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ + TFA9894_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ + TFA9894_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ + TFA9894_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ + TFA9894_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ + TFA9894_BF_MADD = 0x910f, /*!< CF memory address */ + TFA9894_BF_MEMA = 0x920f, /*!< Activate memory access */ + TFA9894_BF_ERR = 0x9307, /*!< CF error flags */ + TFA9894_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ + TFA9894_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ + TFA9894_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ + TFA9894_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ + TFA9894_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ + TFA9894_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ + TFA9894_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ + TFA9894_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ + TFA9894_BF_MTPK = 0xa107, /*!< KEY2 to access KEY2 protected registers, customer key */ + TFA9894_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9894_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9894_BF_CMTPI = 0xa350, /*!< Start copying all the data from mtp to I2C mtp registers - auto clear */ + TFA9894_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp - auto clear */ + TFA9894_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9894_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9894_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9894_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9894_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ + TFA9894_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ + TFA9894_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9894_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9894_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9894_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9894_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9894_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9894_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ +} Tfa9894BfEnumList_t; +#define TFA9894_NAMETABLE static tfaBfName_t Tfa9894DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown control , */\ + { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ + { 0x20, "CFE"}, /* Enable CoolFlux DSP , */\ + { 0x30, "AMPE"}, /* Enable Amplifier , */\ + { 0x40, "DCA"}, /* Enable DCDC Boost converter , */\ + { 0x50, "SBSL"}, /* Coolflux configured , */\ + { 0x60, "AMPC"}, /* CoolFlux control over amplifier , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0x90, "FSSSEL"}, /* Audio sample reference , */\ + { 0xa0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xb0, "TSTOCP"}, /* OCP testing control , */\ + { 0xc0, "BSSS"}, /* Vbat protection steepness , */\ + { 0xd0, "HPFBYP"}, /* Bypass High Pass Filter , */\ + { 0xe0, "DPSA"}, /* Enable DPSA , */\ + { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ + { 0x120, "MANSCONF"}, /* Device I2C settings configured , */\ + { 0x130, "MANCOLD"}, /* Execute cold start , */\ + { 0x140, "MANROBOD"}, /* Reaction on BOD , */\ + { 0x150, "BODE"}, /* Enable BOD (only in direct control mode) , */\ + { 0x160, "BODHYS"}, /* Enable Hysteresis of BOD , */\ + { 0x171, "BODFILT"}, /* BOD filter , */\ + { 0x191, "BODTHLVL"}, /* BOD threshold , */\ + { 0x1b0, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1c0, "MANWDE"}, /* Watchdog enable , */\ + { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ + { 0x1f0, "FAIMVBGOVRRL"}, /* Overrule the enabling of VBG for faim erase/write access, */\ + { 0x203, "AUDFS"}, /* Audio sample rate Fs , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* Current sense fractional delay , */\ + { 0x2b1, "TDMPRES"}, /* Control for HW manager , */\ + { 0x2d2, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x30f, "REV"}, /* Revision info , */\ + { 0x401, "REFCKEXT"}, /* PLL external reference clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal reference clock , */\ + { 0x432, "MCLKSEL"}, /* Master Clock Selection , */\ + { 0x460, "MANAOOSC"}, /* Internal OSC1M off at PWDN , */\ + { 0x470, "ACKCLDDIS"}, /* Automatic PLL reference clock selection for cold start, */\ + { 0x510, "SPKSSEN"}, /* Enable speaker sub-system , */\ + { 0x520, "MTPSSEN"}, /* Enable FAIM sub-system , */\ + { 0x530, "WDTCLKEN"}, /* Enable Coolflux watchdog clock , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "PLLS"}, /* PLL Lock , */\ + { 0x1020, "OTDS"}, /* OTP alarm , */\ + { 0x1030, "OVDS"}, /* OVP alarm , */\ + { 0x1040, "UVDS"}, /* UVP alarm , */\ + { 0x1050, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1060, "CLKS"}, /* Clocks stable , */\ + { 0x1070, "MTPB"}, /* MTP busy , */\ + { 0x1080, "NOCLK"}, /* Lost clock , */\ + { 0x1090, "ACS"}, /* Cold Start , */\ + { 0x10a0, "WDS"}, /* Watchdog , */\ + { 0x10b0, "SWS"}, /* Amplifier engage , */\ + { 0x10c0, "AMPS"}, /* Amplifier enable , */\ + { 0x10d0, "AREFS"}, /* References enable , */\ + { 0x10e0, "ADCCR"}, /* Control ADC , */\ + { 0x10f0, "BODNOK"}, /* BOD Flag - VDD NOT OK , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1170, "SPKS"}, /* Speaker status , */\ + { 0x1180, "CLKOOR"}, /* External clock status , */\ + { 0x1190, "MANALARM"}, /* Alarm state , */\ + { 0x11a0, "TDMERR"}, /* TDM error , */\ + { 0x11b0, "TDMLUTER"}, /* TDM lookup table error , */\ + { 0x1200, "OCPOAP"}, /* OCPOK pmos A , */\ + { 0x1210, "OCPOAN"}, /* OCPOK nmos A , */\ + { 0x1220, "OCPOBP"}, /* OCPOK pmos B , */\ + { 0x1230, "OCPOBN"}, /* OCPOK nmos B , */\ + { 0x1240, "CLIPS"}, /* Amplifier clipping , */\ + { 0x1250, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x1260, "MANOPER"}, /* Device in Operating state , */\ + { 0x1270, "LP1"}, /* Low power MODE1 detection , */\ + { 0x1280, "LA"}, /* Low amplitude detection , */\ + { 0x1290, "VDDPH"}, /* VDDP greater than VBAT flag , */\ + { 0x1402, "TDMSTAT"}, /* TDM Status bits , */\ + { 0x1433, "MANSTATE"}, /* Device Manager status , */\ + { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ + { 0x2000, "TDME"}, /* Enable interface , */\ + { 0x2010, "TDMSPKE"}, /* Control audio tdm channel in sink0 , */\ + { 0x2020, "TDMDCE"}, /* Control audio tdm channel in sink1 , */\ + { 0x2030, "TDMCSE"}, /* Source 0 enable , */\ + { 0x2040, "TDMVSE"}, /* Source 1 enable , */\ + { 0x2050, "TDMCFE"}, /* Source 2 enable , */\ + { 0x2060, "TDMCF2E"}, /* Source 3 enable , */\ + { 0x2070, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2080, "TDMFSPOL"}, /* FS polarity , */\ + { 0x2090, "TDMDEL"}, /* Data delay to FS , */\ + { 0x20a0, "TDMADJ"}, /* Data adjustment , */\ + { 0x20b1, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2103, "TDMNBCK"}, /* TDM NBCK - Bit clock to FS ratio , */\ + { 0x2143, "TDMFSLN"}, /* FS length (master mode only) , */\ + { 0x2183, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x21c1, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x21e1, "TDMTXUS0"}, /* Format unused slots DATAO , */\ + { 0x2204, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2254, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x22a4, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2303, "TDMSPKS"}, /* TDM slot for sink 0 , */\ + { 0x2343, "TDMDCS"}, /* TDM slot for sink 1 , */\ + { 0x2381, "TDMCFSEL"}, /* TDM Source 2 data selection , */\ + { 0x23a1, "TDMCF2SEL"}, /* TDM Source 3 data selection , */\ + { 0x2403, "TDMCSS"}, /* Slot Position of source 0 data , */\ + { 0x2443, "TDMVSS"}, /* Slot Position of source 1 data , */\ + { 0x2483, "TDMCFS"}, /* Slot Position of source 2 data , */\ + { 0x24c3, "TDMCF2S"}, /* Slot Position of source 3 data , */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ + { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4080, "ISTCFMER"}, /* Status cfma error , */\ + { 0x4090, "ISTCFMAC"}, /* Status cfma ack , */\ + { 0x40a0, "ISTSPKS"}, /* Status coolflux speaker error , */\ + { 0x40b0, "ISTACS"}, /* Status cold started , */\ + { 0x40c0, "ISTWDS"}, /* Status watchdog reset , */\ + { 0x40d0, "ISTBODNOK"}, /* Status brown out detect , */\ + { 0x40e0, "ISTLP1"}, /* Status low power mode1 detect , */\ + { 0x40f0, "ISTCLKOOR"}, /* Status clock out of range , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ + { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4480, "ICLCFMER"}, /* Clear cfma err , */\ + { 0x4490, "ICLCFMAC"}, /* Clear cfma ack , */\ + { 0x44a0, "ICLSPKS"}, /* Clear coolflux speaker error , */\ + { 0x44b0, "ICLACS"}, /* Clear cold started , */\ + { 0x44c0, "ICLWDS"}, /* Clear watchdog reset , */\ + { 0x44d0, "ICLBODNOK"}, /* Clear brown out detect , */\ + { 0x44e0, "ICLLP1"}, /* Clear low power mode1 detect , */\ + { 0x44f0, "ICLCLKOOR"}, /* Clear clock out of range , */\ + { 0x4800, "IEVDDS"}, /* Enable POR , */\ + { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IEMANALARM"}, /* Enable Manager Alarm state , */\ + { 0x4860, "IETDMER"}, /* Enable TDM error , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4880, "IECFMER"}, /* Enable cfma err , */\ + { 0x4890, "IECFMAC"}, /* Enable cfma ack , */\ + { 0x48a0, "IESPKS"}, /* Enable coolflux speaker error , */\ + { 0x48b0, "IEACS"}, /* Enable cold started , */\ + { 0x48c0, "IEWDS"}, /* Enable watchdog reset , */\ + { 0x48d0, "IEBODNOK"}, /* Enable brown out detect , */\ + { 0x48e0, "IELP1"}, /* Enable low power mode1 detect , */\ + { 0x48f0, "IECLKOOR"}, /* Enable clock out of range , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ + { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ + { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x4c80, "IPOCFMER"}, /* Polarity cfma err , */\ + { 0x4c90, "IPOCFMAC"}, /* Polarity cfma ack , */\ + { 0x4ca0, "IPOSPKS"}, /* Polarity coolflux speaker error , */\ + { 0x4cb0, "IPOACS"}, /* Polarity cold started , */\ + { 0x4cc0, "IPOWDS"}, /* Polarity watchdog reset , */\ + { 0x4cd0, "IPOBODNOK"}, /* Polarity brown out detect , */\ + { 0x4ce0, "IPOLP1"}, /* Polarity low power mode1 detect , */\ + { 0x4cf0, "IPOCLKOOR"}, /* Polarity clock out of range , */\ + { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ + { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ + { 0x5082, "BSSRR"}, /* Battery safeguard release time , */\ + { 0x50b1, "BSSHY"}, /* Battery Safeguard hysteresis , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ + { 0x5130, "CFSM"}, /* Coolflux firmware soft mute control , */\ + { 0x5187, "VOL"}, /* CF firmware volume control , */\ + { 0x5202, "CLIPCTRL"}, /* Clip control setting , */\ + { 0x5230, "SLOPEE"}, /* Enables slope control , */\ + { 0x5240, "SLOPESET"}, /* Slope speed setting (binary coded) , */\ + { 0x5287, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x5703, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x5743, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x5781, "DCINSEL"}, /* VAMP_OUT2 input selection , */\ + { 0x5881, "LNMODE"}, /* Low noise gain mode control , */\ + { 0x5ac1, "LPM1MODE"}, /* Low power mode control , */\ + { 0x5d02, "TDMSRCMAP"}, /* TDM source mapping , */\ + { 0x5d31, "TDMSRCAS"}, /* Sensed value A , */\ + { 0x5d51, "TDMSRCBS"}, /* Sensed value B , */\ + { 0x5d71, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ + { 0x5d91, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ + { 0x6102, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6130, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ + { 0x6140, "ENCURCOMP"}, /* Enable current sense compensation , */\ + { 0x6152, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7005, "DCVOF"}, /* First Boost Voltage Level , */\ + { 0x7065, "DCVOS"}, /* Second Boost Voltage Level , */\ + { 0x70c3, "DCMCC"}, /* Max Coil Current , */\ + { 0x7101, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7120, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7130, "DCSR"}, /* Soft ramp up/down , */\ + { 0x7140, "DCDIS"}, /* DCDC on/off , */\ + { 0x7150, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7160, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7170, "DCENVSEL"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7204, "DCTRIP"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7254, "DCTRIP2"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x72a4, "DCTRIPT"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x72f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7304, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x9000, "RST"}, /* Reset for Coolflux DSP , */\ + { 0x9011, "DMEM"}, /* Target memory for CFMA using I2C interface , */\ + { 0x9030, "AIF"}, /* Auto increment , */\ + { 0x9040, "CFINT"}, /* Coolflux Interrupt - auto clear , */\ + { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ + { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ + { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ + { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ + { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ + { 0x910f, "MADD"}, /* CF memory address , */\ + { 0x920f, "MEMA"}, /* Activate memory access , */\ + { 0x9307, "ERR"}, /* CF error flags , */\ + { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ + { 0xa107, "MTPK"}, /* KEY2 to access KEY2 protected registers, customer key, */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa350, "CMTPI"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ + { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ + { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9894_BITNAMETABLE static tfaBfName_t Tfa9894BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown control , */\ + { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ + { 0x20, "enbl_coolflux"}, /* Enable CoolFlux DSP , */\ + { 0x30, "enbl_amplifier"}, /* Enable Amplifier , */\ + { 0x40, "enbl_boost"}, /* Enable DCDC Boost converter , */\ + { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ + { 0x60, "sel_enbl_amplifier"}, /* CoolFlux control over amplifier , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ + { 0xa0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xb0, "test_ocp"}, /* OCP testing control , */\ + { 0xc0, "batsense_steepness"}, /* Vbat protection steepness , */\ + { 0xd0, "bypass_hp"}, /* Bypass High Pass Filter , */\ + { 0xe0, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0xf0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ + { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ + { 0x120, "src_set_configured"}, /* Device I2C settings configured , */\ + { 0x130, "execute_cold_start"}, /* Execute cold start , */\ + { 0x140, "man_enbl_brown_out"}, /* Reaction on BOD , */\ + { 0x150, "bod_enbl"}, /* Enable BOD (only in direct control mode) , */\ + { 0x160, "bod_hyst_enbl"}, /* Enable Hysteresis of BOD , */\ + { 0x171, "bod_delay_set"}, /* BOD filter , */\ + { 0x191, "bod_lvl_set"}, /* BOD threshold , */\ + { 0x1b0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x1c0, "man_enbl_watchdog"}, /* Watchdog enable , */\ + { 0x1d0, "disable_engage"}, /* Disable Engage , */\ + { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ + { 0x1f0, "faim_enable_vbg"}, /* Overrule the enabling of VBG for faim erase/write access, */\ + { 0x203, "audio_fs"}, /* Audio sample rate Fs , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* Current sense fractional delay , */\ + { 0x2b1, "use_tdm_presence"}, /* Control for HW manager , */\ + { 0x2d2, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x30f, "device_rev"}, /* Revision info , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external reference clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal reference clock , */\ + { 0x432, "mclk_sel"}, /* Master Clock Selection , */\ + { 0x460, "enbl_osc1m_auto_off"}, /* Internal OSC1M off at PWDN , */\ + { 0x470, "disable_auto_sel_refclk"}, /* Automatic PLL reference clock selection for cold start, */\ + { 0x510, "enbl_spkr_ss"}, /* Enable speaker sub-system , */\ + { 0x520, "enbl_faim_ss"}, /* Enable FAIM sub-system , */\ + { 0x530, "enbl_wdt_clk"}, /* Enable Coolflux watchdog clock , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* Hidden code to enable access to hidden register. (0x5A6B/23147 default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_pll_lock"}, /* PLL Lock , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm , */\ + { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ + { 0x1050, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1080, "flag_lost_clk"}, /* Lost clock , */\ + { 0x1090, "flag_cold_started"}, /* Cold Start , */\ + { 0x10a0, "flag_watchdog_reset"}, /* Watchdog , */\ + { 0x10b0, "flag_engage"}, /* Amplifier engage , */\ + { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ + { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x10f0, "flag_bod_vddd_nok"}, /* BOD Flag - VDD NOT OK , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1170, "flag_cf_speakererror"}, /* Speaker status , */\ + { 0x1180, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x1190, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x11a0, "flag_tdm_error"}, /* TDM error , */\ + { 0x11b0, "flag_tdm_lut_error"}, /* TDM lookup table error , */\ + { 0x1200, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1210, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1220, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1230, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1240, "flag_clip"}, /* Amplifier clipping , */\ + { 0x1250, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x1260, "flag_man_operating_state"}, /* Device in Operating state , */\ + { 0x1270, "flag_lp_detect_mode1"}, /* Low power MODE1 detection , */\ + { 0x1280, "flag_low_amplitude"}, /* Low amplitude detection , */\ + { 0x1290, "flag_vddp_gt_vbat"}, /* VDDP greater than VBAT flag , */\ + { 0x1402, "tdm_status"}, /* TDM Status bits , */\ + { 0x1433, "man_state"}, /* Device Manager status , */\ + { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ + { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ + { 0x2000, "tdm_enable"}, /* Enable interface , */\ + { 0x2010, "tdm_sink0_enable"}, /* Control audio tdm channel in sink0 , */\ + { 0x2020, "tdm_sink1_enable"}, /* Control audio tdm channel in sink1 , */\ + { 0x2030, "tdm_source0_enable"}, /* Source 0 enable , */\ + { 0x2040, "tdm_source1_enable"}, /* Source 1 enable , */\ + { 0x2050, "tdm_source2_enable"}, /* Source 2 enable , */\ + { 0x2060, "tdm_source3_enable"}, /* Source 3 enable , */\ + { 0x2070, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2080, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x2090, "tdm_data_delay"}, /* Data delay to FS , */\ + { 0x20a0, "tdm_data_adjustment"}, /* Data adjustment , */\ + { 0x20b1, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2103, "tdm_nbck"}, /* TDM NBCK - Bit clock to FS ratio , */\ + { 0x2143, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ + { 0x2183, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x21c1, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x21e1, "tdm_txdata_format_unused_slot"}, /* Format unused slots DATAO , */\ + { 0x2204, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2254, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x22a4, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2303, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ + { 0x2343, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ + { 0x2381, "tdm_source2_sel"}, /* TDM Source 2 data selection , */\ + { 0x23a1, "tdm_source3_sel"}, /* TDM Source 3 data selection , */\ + { 0x2403, "tdm_source0_slot"}, /* Slot Position of source 0 data , */\ + { 0x2443, "tdm_source1_slot"}, /* Slot Position of source 1 data , */\ + { 0x2483, "tdm_source2_slot"}, /* Slot Position of source 2 data , */\ + { 0x24c3, "tdm_source3_slot"}, /* Slot Position of source 3 data , */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ + { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4080, "int_out_flag_cfma_err"}, /* Status cfma error , */\ + { 0x4090, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ + { 0x40a0, "int_out_flag_cf_speakererror"}, /* Status coolflux speaker error , */\ + { 0x40b0, "int_out_flag_cold_started"}, /* Status cold started , */\ + { 0x40c0, "int_out_flag_watchdog_reset"}, /* Status watchdog reset , */\ + { 0x40d0, "int_out_flag_bod_vddd_nok"}, /* Status brown out detect , */\ + { 0x40e0, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 detect , */\ + { 0x40f0, "int_out_flag_clk_out_of_range"}, /* Status clock out of range , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ + { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4480, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ + { 0x4490, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ + { 0x44a0, "int_in_flag_cf_speakererror"}, /* Clear coolflux speaker error , */\ + { 0x44b0, "int_in_flag_cold_started"}, /* Clear cold started , */\ + { 0x44c0, "int_in_flag_watchdog_reset"}, /* Clear watchdog reset , */\ + { 0x44d0, "int_in_flag_bod_vddd_nok"}, /* Clear brown out detect , */\ + { 0x44e0, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 detect , */\ + { 0x44f0, "int_in_flag_clk_out_of_range"}, /* Clear clock out of range , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ + { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable Manager Alarm state , */\ + { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4880, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ + { 0x4890, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ + { 0x48a0, "int_enable_flag_cf_speakererror"}, /* Enable coolflux speaker error , */\ + { 0x48b0, "int_enable_flag_cold_started"}, /* Enable cold started , */\ + { 0x48c0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog reset , */\ + { 0x48d0, "int_enable_flag_bod_vddd_nok"}, /* Enable brown out detect , */\ + { 0x48e0, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 detect , */\ + { 0x48f0, "int_enable_flag_clk_out_of_range"}, /* Enable clock out of range , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ + { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ + { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x4c80, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ + { 0x4c90, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ + { 0x4ca0, "int_polarity_flag_cf_speakererror"}, /* Polarity coolflux speaker error , */\ + { 0x4cb0, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ + { 0x4cc0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog reset , */\ + { 0x4cd0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity brown out detect , */\ + { 0x4ce0, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 detect , */\ + { 0x4cf0, "int_polarity_flag_clk_out_of_range"}, /* Polarity clock out of range , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ + { 0x5082, "vbat_prot_release_time"}, /* Battery safeguard release time , */\ + { 0x50b1, "vbat_prot_hysterese"}, /* Battery Safeguard hysteresis , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ + { 0x5130, "cf_mute"}, /* Coolflux firmware soft mute control , */\ + { 0x5187, "cf_volume"}, /* CF firmware volume control , */\ + { 0x5202, "ctrl_cc"}, /* Clip control setting , */\ + { 0x5230, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x5240, "ctrl_slope"}, /* Slope speed setting (binary coded) , */\ + { 0x5287, "gain"}, /* Amplifier gain , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ + { 0x5340, "clipfast"}, /* Clock selection for HW clipper for battery safeguard, */\ + { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ + { 0x5360, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ + { 0x5370, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5380, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5390, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x53a3, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ + { 0x5400, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5413, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5452, "dpsa_drive"}, /* Drive setting (binary coded) , */\ + { 0x550a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ + { 0x55b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ + { 0x55c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ + { 0x5600, "pwm_shape"}, /* PWM shape , */\ + { 0x5614, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ + { 0x5660, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ + { 0x5670, "reclock_voltsense"}, /* Reclock the voltage sense PWM signal , */\ + { 0x5680, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ + { 0x5690, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ + { 0x56a1, "enbl_odd_up_even_down"}, /* Control for PWM reference sawtooth generartion , */\ + { 0x5703, "ctrl_att_dcdc"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x5743, "ctrl_att_spkr"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x5781, "vamp_sel2"}, /* VAMP_OUT2 input selection , */\ + { 0x5805, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ + { 0x5861, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ + { 0x5881, "lownoisegain_mode"}, /* Low noise gain mode control , */\ + { 0x5905, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ + { 0x5965, "hold_time"}, /* Low noise mode hold time before entering into low noise mode, */\ + { 0x5a05, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x5a65, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ + { 0x5ac1, "lpm1_mode"}, /* Low power mode control , */\ + { 0x5b05, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ + { 0x5b65, "lpm1_hold_time"}, /* Low power mode hold time before entering into low power mode, */\ + { 0x5bc0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ + { 0x5c00, "enbl_minion"}, /* Enables minion (small) power stage , */\ + { 0x5c13, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ + { 0x5c50, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ + { 0x5c61, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ + { 0x5d02, "tdm_source_mapping"}, /* TDM source mapping , */\ + { 0x5d31, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ + { 0x5d51, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ + { 0x5d71, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ + { 0x5d91, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ + { 0x5e02, "rst_min_vbat_delay"}, /* Delay for reseting the min_vbat value inside HW Clipper (number of Fs pulses), */\ + { 0x5e30, "rst_min_vbat_sel"}, /* Control for selecting reset signal for min_bat , */\ + { 0x5f00, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5f12, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x5f42, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x5f78, "spare_out"}, /* Spare out register , */\ + { 0x600f, "spare_in"}, /* Spare IN , */\ + { 0x6102, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6130, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ + { 0x6140, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ + { 0x6152, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7005, "frst_boost_voltage"}, /* First Boost Voltage Level , */\ + { 0x7065, "scnd_boost_voltage"}, /* Second Boost Voltage Level , */\ + { 0x70c3, "boost_cur"}, /* Max Coil Current , */\ + { 0x7101, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7120, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7130, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x7140, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x7150, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7160, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7170, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7180, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ + { 0x7204, "boost_trip_lvl_1st"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7254, "boost_trip_lvl_2nd"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x72a4, "boost_trip_lvl_track"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x72f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7304, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x7350, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ + { 0x7361, "dcdc_ctrl_maxzercnt"}, /* Number of zero current flags to count before going to pfm mode, */\ + { 0x7386, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x73f0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x7404, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7451, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7474, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x74c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x74e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x74f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7500, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7510, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7520, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7530, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7540, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x7550, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7560, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7570, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7580, "enbl_bst_windac"}, /* Enable window dac , */\ + { 0x7595, "bst_windac"}, /* For testing direct control windac , */\ + { 0x7600, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7611, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7631, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7650, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7660, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ + { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ + { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ + { 0x8040, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8050, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8060, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8105, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP) * signal, */\ + { 0x8164, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ + { 0x81b0, "enbl_cs_adc"}, /* Enable current sense ADC , */\ + { 0x81c0, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ + { 0x81d0, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ + { 0x81e0, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x81f0, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ + { 0x8200, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ + { 0x8210, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ + { 0x8220, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8231, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ + { 0x8250, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8263, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ + { 0x82a0, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x82b4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ + { 0x8300, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ + { 0x8310, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8320, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8330, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8340, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8350, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if enbl_cs_ldo is high, */\ + { 0x8364, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8800, "ctrl_vs_igen_supply"}, /* Control for selecting supply for VS current generator, */\ + { 0x8810, "ctrl_vs_force_div2"}, /* Select input resistive divider gain , */\ + { 0x8820, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ + { 0x8901, "volsense_pwm_sel"}, /* Voltage sense source selection control , */\ + { 0x8920, "vs_gain_control"}, /* Voltage sense gain control , */\ + { 0x8930, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ + { 0x8940, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ + { 0x8950, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ + { 0x8960, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ + { 0x8970, "vs_classd_tran_skip"}, /* Skip voltage sense connection during a classD amplifier transition, */\ + { 0x8987, "vs_gain"}, /* Voltage sense gain , */\ + { 0x8a00, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ + { 0x8a10, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ + { 0x8a20, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ + { 0x8a30, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if enbl_cs_ldo is high, */\ + { 0x8a44, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ + { 0x8a90, "enbl_vs_adc"}, /* Enable voltage sense ADC , */\ + { 0x8aa0, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ + { 0x8ab0, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ + { 0x8ac0, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ + { 0x8ad0, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ + { 0x8ae0, "enbl_vs_ldo"}, /* Enable voltage sense LDO , */\ + { 0x8af0, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO , */\ + { 0x9000, "cf_rst_dsp"}, /* Reset for Coolflux DSP , */\ + { 0x9011, "cf_dmem"}, /* Target memory for CFMA using I2C interface , */\ + { 0x9030, "cf_aif"}, /* Auto increment , */\ + { 0x9040, "cf_int"}, /* Coolflux Interrupt - auto clear , */\ + { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ + { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ + { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ + { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ + { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ + { 0x910f, "cf_madd"}, /* CF memory address , */\ + { 0x920f, "cf_mema"}, /* Activate memory access , */\ + { 0x9307, "cf_err"}, /* CF error flags , */\ + { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ + { 0xa007, "mtpkey1"}, /* KEY1 To access KEY1 protected registers 0x5A/90d (default for engineering), */\ + { 0xa107, "mtpkey2"}, /* KEY2 to access KEY2 protected registers, customer key, */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from MTP to I2C mtp register - auto clear, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp - auto clear, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ + { 0xa400, "faim_set_clkws"}, /* Sets the FaIM controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the FaIM are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the FaIM are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb000, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb010, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb020, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb030, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb040, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb050, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb060, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb070, "disable_main_ctrl_change_prot"}, /* Disable main control change protection , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ + { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ + { 0xc3d0, "test_abistfft_enbl"}, /* Enable ABIST with FFT on Coolflux DSP , */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc530, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc540, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc550, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc560, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ + { 0xc570, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc583, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc5c0, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc607, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO , */\ + { 0xc687, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT , */\ + { 0xc707, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 , */\ + { 0xc800, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xc810, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xc820, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xc830, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xc844, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xc894, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xc903, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ + { 0xc943, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ + { 0xca05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ + { 0xca64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ + { 0xcab3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ + { 0xcaf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ + { 0xcb09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ + { 0xcba0, "pll_mdec_msb"}, /* MSB of PLL_mdec - I2C direct PLL control mode only, */\ + { 0xcbb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ + { 0xcbc0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ + { 0xcbd0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ + { 0xcbe0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ + { 0xcbf0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ + { 0xcc0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ + { 0xcd06, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ + { 0xce0f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xcf02, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ + { 0xcf33, "tsig_gain"}, /* Test signal gain , */\ + { 0xd000, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd011, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd032, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd064, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd0b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd0c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd109, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd201, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ + { 0xd221, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ + { 0xd241, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ + { 0xd301, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ + { 0xd321, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ + { 0xd340, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xd407, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd480, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xd491, "sel_wdt_clk"}, /* Watch dog clock divider settings , */\ + { 0xd4b0, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd500, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ + { 0xd510, "gainatt_feedback"}, /* Gainatt feedback to tdm , */\ + { 0xd522, "test_parametric_io"}, /* Test IO parametric , */\ + { 0xd550, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ + { 0xd561, "test_spare_out1"}, /* Test spare out 1 , */\ + { 0xd580, "bst_dcmbst"}, /* DCM boost , */\ + { 0xd593, "test_spare_out2"}, /* Test spare out 2 , */\ + { 0xe00f, "sw_profile"}, /* Software profile data , */\ + { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf163, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf307, "calibr_gain_vs"}, /* Voltage sense gain , */\ + { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf40f, "mtpdata4"}, /* MTP4 data , */\ + { 0xf50f, "calibr_R25C"}, /* Ron resistance of speaker coil , */\ + { 0xf60f, "mtpdata6"}, /* MTP6 data , */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable functionality of dcdcoff_mode bit , */\ + { 0xf910, "mtp_lock_enbl_coolflux"}, /* Disable functionality of enbl_coolflux bit , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ + { 0xf940, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ + { 0xf950, "mtp_gate_cgu_clock_for_test"}, /* CGU test clock control , */\ + { 0xf987, "type_bits_fw"}, /* MTP control for firmware features - See Firmware I2C API document for details, */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE , */\ + { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa9894_irq { + tfa9894_irq_max = -1, + tfa9894_irq_all = -1 /* all irqs */}; + +#define TFA9894_IRQ_NAMETABLE static tfaIrqName_t Tfa9894IrqNames[] = {\ +}; +#endif /* _TFA9894_TFAFIELDNAMES_H */ diff --git a/inc/tfa9894_tfafieldnames_N2.h b/inc/tfa9894_tfafieldnames_N2.h new file mode 100644 index 000000000000..35ac496abeeb --- /dev/null +++ b/inc/tfa9894_tfafieldnames_N2.h @@ -0,0 +1,1130 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9894_tfaFieldnames_N2.h + * This file was generated automatically on 09/28/18 at 12:19:41. + * Source file: TFA9894_N2A1_I2C_RegisterMap.xlsx + */ + +#ifndef _TFA9894_TFAFIELDNAMES_N2_H +#define _TFA9894_TFAFIELDNAMES_N2_H + + +#define TFA9894N2_I2CVERSION 25.0 + +typedef enum Tfa9894N2BfEnumList { + TFA9894N2_BF_PWDN = 0x0000, /*!< Powerdown control */ + TFA9894N2_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ + TFA9894N2_BF_CFE = 0x0020, /*!< Enable CoolFlux DSP */ + TFA9894N2_BF_AMPE = 0x0030, /*!< Enable Amplifier */ + TFA9894N2_BF_DCA = 0x0040, /*!< Enable DCDC Boost converter */ + TFA9894N2_BF_SBSL = 0x0050, /*!< Coolflux configured */ + TFA9894N2_BF_AMPC = 0x0060, /*!< CoolFlux control over amplifier */ + TFA9894N2_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9894N2_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ + TFA9894N2_BF_BYPOCP = 0x00a0, /*!< Bypass OCP */ + TFA9894N2_BF_TSTOCP = 0x00b0, /*!< OCP testing control */ + TFA9894N2_BF_BSSS = 0x00c0, /*!< Vbat protection steepness */ + TFA9894N2_BF_HPFBYP = 0x00d0, /*!< Bypass High Pass Filter */ + TFA9894N2_BF_DPSA = 0x00e0, /*!< Enable DPSA */ + TFA9894N2_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ + TFA9894N2_BF_MANSCONF = 0x0120, /*!< Device I2C settings configured */ + TFA9894N2_BF_MANCOLD = 0x0130, /*!< Execute cold start */ + TFA9894N2_BF_MANROBOD = 0x0140, /*!< Reaction on BOD */ + TFA9894N2_BF_BODE = 0x0150, /*!< Enable BOD (only in direct control mode) */ + TFA9894N2_BF_BODHYS = 0x0160, /*!< Enable Hysteresis of BOD */ + TFA9894N2_BF_BODFILT = 0x0171, /*!< BOD filter */ + TFA9894N2_BF_BODTHLVL = 0x0191, /*!< BOD threshold */ + TFA9894N2_BF_MUTETO = 0x01b0, /*!< Time out SB mute sequence */ + TFA9894N2_BF_MANWDE = 0x01c0, /*!< Watchdog enable */ + TFA9894N2_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ + TFA9894N2_BF_FAIMVBGOVRRL = 0x01f0, /*!< Overrule the enabling of VBG for faim erase/write access */ + TFA9894N2_BF_AUDFS = 0x0203, /*!< Audio sample rate Fs */ + TFA9894N2_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9894N2_BF_FRACTDEL = 0x0255, /*!< Current sense fractional delay */ + TFA9894N2_BF_TDMPRES = 0x02b1, /*!< Control for HW manager */ + TFA9894N2_BF_AMPOCRT = 0x02d2, /*!< Amplifier on-off criteria for shutdown */ + TFA9894N2_BF_REV = 0x030f, /*!< Revision info */ + TFA9894N2_BF_REFCKEXT = 0x0401, /*!< PLL external reference clock */ + TFA9894N2_BF_REFCKSEL = 0x0420, /*!< PLL internal reference clock */ + TFA9894N2_BF_MCLKSEL = 0x0432, /*!< Master Clock Selection */ + TFA9894N2_BF_MANAOOSC = 0x0460, /*!< Internal OSC1M off at PWDN */ + TFA9894N2_BF_ACKCLDDIS = 0x0470, /*!< Automatic PLL reference clock selection for cold start */ + TFA9894N2_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ + TFA9894N2_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ + TFA9894N2_BF_PLLSTUP = 0x04a0, /*!< PLL startup time configuration */ + TFA9894N2_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ + TFA9894N2_BF_SPKSSEN = 0x0510, /*!< Enable speaker sub-system */ + TFA9894N2_BF_MTPSSEN = 0x0520, /*!< Enable FAIM sub-system */ + TFA9894N2_BF_WDTCLKEN = 0x0530, /*!< Enable Coolflux watchdog clock */ + TFA9894N2_BF_VDDS = 0x1000, /*!< POR */ + TFA9894N2_BF_PLLS = 0x1010, /*!< PLL Lock */ + TFA9894N2_BF_OTDS = 0x1020, /*!< OTP alarm */ + TFA9894N2_BF_OVDS = 0x1030, /*!< OVP alarm */ + TFA9894N2_BF_UVDS = 0x1040, /*!< UVP alarm */ + TFA9894N2_BF_OCDS = 0x1050, /*!< OCP amplifier (sticky register, clear on read) */ + TFA9894N2_BF_CLKS = 0x1060, /*!< Clocks stable */ + TFA9894N2_BF_MTPB = 0x1070, /*!< MTP busy */ + TFA9894N2_BF_NOCLK = 0x1080, /*!< Lost clock */ + TFA9894N2_BF_ACS = 0x1090, /*!< Cold Start */ + TFA9894N2_BF_WDS = 0x10a0, /*!< Watchdog */ + TFA9894N2_BF_SWS = 0x10b0, /*!< Amplifier engage */ + TFA9894N2_BF_AMPS = 0x10c0, /*!< Amplifier enable */ + TFA9894N2_BF_AREFS = 0x10d0, /*!< References enable */ + TFA9894N2_BF_ADCCR = 0x10e0, /*!< Control ADC */ + TFA9894N2_BF_BODNOK = 0x10f0, /*!< BOD Flag - VDD NOT OK */ + TFA9894N2_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9894N2_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ + TFA9894N2_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos (sticky register, clear on read) */ + TFA9894N2_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ + TFA9894N2_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ + TFA9894N2_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ + TFA9894N2_BF_SPKS = 0x1170, /*!< Speaker status */ + TFA9894N2_BF_CLKOOR = 0x1180, /*!< External clock status */ + TFA9894N2_BF_MANALARM = 0x1190, /*!< Alarm state */ + TFA9894N2_BF_TDMERR = 0x11a0, /*!< TDM error */ + TFA9894N2_BF_TDMLUTER = 0x11b0, /*!< TDM lookup table error */ + TFA9894N2_BF_NOAUDCLK = 0x11c0, /*!< Lost Audio clock */ + TFA9894N2_BF_OCPOAP = 0x1200, /*!< OCPOK pmos A */ + TFA9894N2_BF_OCPOAN = 0x1210, /*!< OCPOK nmos A */ + TFA9894N2_BF_OCPOBP = 0x1220, /*!< OCPOK pmos B */ + TFA9894N2_BF_OCPOBN = 0x1230, /*!< OCPOK nmos B */ + TFA9894N2_BF_CLIPS = 0x1240, /*!< Amplifier clipping */ + TFA9894N2_BF_MANMUTE = 0x1250, /*!< Audio mute sequence */ + TFA9894N2_BF_MANOPER = 0x1260, /*!< Device in Operating state */ + TFA9894N2_BF_LP1 = 0x1270, /*!< Low power MODE1 detection */ + TFA9894N2_BF_LA = 0x1280, /*!< Low amplitude detection */ + TFA9894N2_BF_VDDPH = 0x1290, /*!< VDDP greater than VBAT flag */ + TFA9894N2_BF_TDMSTAT = 0x1302, /*!< TDM Status bits */ + TFA9894N2_BF_MANSTATE = 0x1333, /*!< Device Manager status */ + TFA9894N2_BF_DCMODE = 0x13b1, /*!< DCDC mode status bits */ + TFA9894N2_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9894N2_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9894N2_BF_VDDPS = 0x1709, /*!< IC VDDP voltage (1023*VDDP/13V) */ + TFA9894N2_BF_TDME = 0x2000, /*!< Enable interface */ + TFA9894N2_BF_TDMSPKE = 0x2010, /*!< Control audio tdm channel in sink0 */ + TFA9894N2_BF_TDMDCE = 0x2020, /*!< Control audio tdm channel in sink1 */ + TFA9894N2_BF_TDMCSE = 0x2030, /*!< Source 0 enable */ + TFA9894N2_BF_TDMVSE = 0x2040, /*!< Source 1 enable */ + TFA9894N2_BF_TDMCFE = 0x2050, /*!< Source 2 enable */ + TFA9894N2_BF_TDMCF2E = 0x2060, /*!< Source 3 enable */ + TFA9894N2_BF_TDMCLINV = 0x2070, /*!< Reception data to BCK clock */ + TFA9894N2_BF_TDMFSPOL = 0x2080, /*!< FS polarity */ + TFA9894N2_BF_TDMDEL = 0x2090, /*!< Data delay to FS */ + TFA9894N2_BF_TDMADJ = 0x20a0, /*!< Data adjustment */ + TFA9894N2_BF_TDMOOMP = 0x20b1, /*!< Received audio compression */ + TFA9894N2_BF_TDMNBCK = 0x2103, /*!< TDM NBCK - Bit clock to FS ratio */ + TFA9894N2_BF_TDMFSLN = 0x2143, /*!< FS length (master mode only) */ + TFA9894N2_BF_TDMSLOTS = 0x2183, /*!< N-slots in Frame */ + TFA9894N2_BF_TDMTXDFO = 0x21c1, /*!< Format unused bits */ + TFA9894N2_BF_TDMTXUS0 = 0x21e1, /*!< Format unused slots DATAO */ + TFA9894N2_BF_TDMSLLN = 0x2204, /*!< N-bits in slot */ + TFA9894N2_BF_TDMBRMG = 0x2254, /*!< N-bits remaining */ + TFA9894N2_BF_TDMSSIZE = 0x22a4, /*!< Sample size per slot */ + TFA9894N2_BF_TDMSPKS = 0x2303, /*!< TDM slot for sink 0 */ + TFA9894N2_BF_TDMDCS = 0x2343, /*!< TDM slot for sink 1 */ + TFA9894N2_BF_TDMCFSEL = 0x2381, /*!< TDM Source 2 data selection */ + TFA9894N2_BF_TDMCF2SEL = 0x23a1, /*!< TDM Source 3 data selection */ + TFA9894N2_BF_TDMCSS = 0x2403, /*!< Slot position of source 0 data */ + TFA9894N2_BF_TDMVSS = 0x2443, /*!< Slot position of source 1 data */ + TFA9894N2_BF_TDMCFS = 0x2483, /*!< Slot position of source 2 data */ + TFA9894N2_BF_TDMCF2S = 0x24c3, /*!< Slot position of source 3 data */ + TFA9894N2_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9894N2_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ + TFA9894N2_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9894N2_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ + TFA9894N2_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9894N2_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ + TFA9894N2_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ + TFA9894N2_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9894N2_BF_ISTCFMER = 0x4080, /*!< Status cfma error */ + TFA9894N2_BF_ISTCFMAC = 0x4090, /*!< Status cfma ack */ + TFA9894N2_BF_ISTSPKS = 0x40a0, /*!< Status coolflux speaker error */ + TFA9894N2_BF_ISTACS = 0x40b0, /*!< Status cold started */ + TFA9894N2_BF_ISTWDS = 0x40c0, /*!< Status watchdog reset */ + TFA9894N2_BF_ISTBODNOK = 0x40d0, /*!< Status brown out detect */ + TFA9894N2_BF_ISTLP1 = 0x40e0, /*!< Status low power mode1 detect */ + TFA9894N2_BF_ISTCLKOOR = 0x40f0, /*!< Status clock out of range */ + TFA9894N2_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9894N2_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ + TFA9894N2_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9894N2_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ + TFA9894N2_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9894N2_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ + TFA9894N2_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ + TFA9894N2_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9894N2_BF_ICLCFMER = 0x4480, /*!< Clear cfma err */ + TFA9894N2_BF_ICLCFMAC = 0x4490, /*!< Clear cfma ack */ + TFA9894N2_BF_ICLSPKS = 0x44a0, /*!< Clear coolflux speaker error */ + TFA9894N2_BF_ICLACS = 0x44b0, /*!< Clear cold started */ + TFA9894N2_BF_ICLWDS = 0x44c0, /*!< Clear watchdog reset */ + TFA9894N2_BF_ICLBODNOK = 0x44d0, /*!< Clear brown out detect */ + TFA9894N2_BF_ICLLP1 = 0x44e0, /*!< Clear low power mode1 detect */ + TFA9894N2_BF_ICLCLKOOR = 0x44f0, /*!< Clear clock out of range */ + TFA9894N2_BF_IEVDDS = 0x4800, /*!< Enable POR */ + TFA9894N2_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ + TFA9894N2_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9894N2_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ + TFA9894N2_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9894N2_BF_IEMANALARM = 0x4850, /*!< Enable Manager Alarm state */ + TFA9894N2_BF_IETDMER = 0x4860, /*!< Enable TDM error */ + TFA9894N2_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9894N2_BF_IECFMER = 0x4880, /*!< Enable cfma err */ + TFA9894N2_BF_IECFMAC = 0x4890, /*!< Enable cfma ack */ + TFA9894N2_BF_IESPKS = 0x48a0, /*!< Enable coolflux speaker error */ + TFA9894N2_BF_IEACS = 0x48b0, /*!< Enable cold started */ + TFA9894N2_BF_IEWDS = 0x48c0, /*!< Enable watchdog reset */ + TFA9894N2_BF_IEBODNOK = 0x48d0, /*!< Enable brown out detect */ + TFA9894N2_BF_IELP1 = 0x48e0, /*!< Enable low power mode1 detect */ + TFA9894N2_BF_IECLKOOR = 0x48f0, /*!< Enable clock out of range */ + TFA9894N2_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ + TFA9894N2_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ + TFA9894N2_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9894N2_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ + TFA9894N2_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9894N2_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ + TFA9894N2_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ + TFA9894N2_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9894N2_BF_IPOCFMER = 0x4c80, /*!< Polarity cfma err */ + TFA9894N2_BF_IPOCFMAC = 0x4c90, /*!< Polarity cfma ack */ + TFA9894N2_BF_IPOSPKS = 0x4ca0, /*!< Polarity coolflux speaker error */ + TFA9894N2_BF_IPOACS = 0x4cb0, /*!< Polarity cold started */ + TFA9894N2_BF_IPOWDS = 0x4cc0, /*!< Polarity watchdog reset */ + TFA9894N2_BF_IPOBODNOK = 0x4cd0, /*!< Polarity brown out detect */ + TFA9894N2_BF_IPOLP1 = 0x4ce0, /*!< Polarity low power mode1 detect */ + TFA9894N2_BF_IPOCLKOOR = 0x4cf0, /*!< Polarity clock out of range */ + TFA9894N2_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ + TFA9894N2_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ + TFA9894N2_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ + TFA9894N2_BF_BSSRR = 0x5082, /*!< Battery safeguard release time */ + TFA9894N2_BF_BSSHY = 0x50b1, /*!< Battery Safeguard hysteresis */ + TFA9894N2_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9894N2_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ + TFA9894N2_BF_CFSM = 0x5130, /*!< Coolflux firmware soft mute control */ + TFA9894N2_BF_VOL = 0x5187, /*!< CF firmware volume control */ + TFA9894N2_BF_CLIPCTRL = 0x5202, /*!< Clip control setting */ + TFA9894N2_BF_SLOPEE = 0x5230, /*!< Enables slope control */ + TFA9894N2_BF_SLOPESET = 0x5240, /*!< Slope speed setting (binary coded) */ + TFA9894N2_BF_BYPDLYLINE = 0x5250, /*!< Bypass the interpolator delay line */ + TFA9894N2_BF_AMPGAIN = 0x5287, /*!< Amplifier gain */ + TFA9894N2_BF_TDMDCG = 0x5703, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ + TFA9894N2_BF_TDMSPKG = 0x5743, /*!< Total gain depending on INPLEV setting (channel 0) */ + TFA9894N2_BF_DCINSEL = 0x5781, /*!< VAMP_OUT2 input selection */ + TFA9894N2_BF_LNMODE = 0x5881, /*!< Low noise gain mode control */ + TFA9894N2_BF_LPM1MODE = 0x5ac1, /*!< Low power mode control */ + TFA9894N2_BF_TDMSRCMAP = 0x5d02, /*!< TDM source mapping */ + TFA9894N2_BF_TDMSRCAS = 0x5d31, /*!< Sensed value A */ + TFA9894N2_BF_TDMSRCBS = 0x5d51, /*!< Sensed value B */ + TFA9894N2_BF_TDMSRCACLIP = 0x5d71, /*!< Clip information (analog /digital) for source0 */ + TFA9894N2_BF_TDMSRCBCLIP = 0x5d91, /*!< Clip information (analog /digital) for source1 */ + TFA9894N2_BF_DELCURCOMP = 0x6102, /*!< Delay to allign compensation signal with current sense signal */ + TFA9894N2_BF_SIGCURCOMP = 0x6130, /*!< Polarity of compensation for current sense */ + TFA9894N2_BF_ENCURCOMP = 0x6140, /*!< Enable current sense compensation */ + TFA9894N2_BF_LVLCLPPWM = 0x6152, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ + TFA9894N2_BF_DCVOF = 0x7005, /*!< First Boost Voltage Level */ + TFA9894N2_BF_DCVOS = 0x7065, /*!< Second Boost Voltage Level */ + TFA9894N2_BF_DCMCC = 0x70c3, /*!< Max Coil Current */ + TFA9894N2_BF_DCCV = 0x7101, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ + TFA9894N2_BF_DCIE = 0x7120, /*!< Adaptive boost mode */ + TFA9894N2_BF_DCSR = 0x7130, /*!< Soft ramp up/down */ + TFA9894N2_BF_DCDIS = 0x7140, /*!< DCDC on/off */ + TFA9894N2_BF_DCPWM = 0x7150, /*!< DCDC PWM only mode */ + TFA9894N2_BF_DCTRACK = 0x7160, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ + TFA9894N2_BF_DCENVSEL = 0x7170, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ + TFA9894N2_BF_OVSCTLVL = 0x7195, /*!< Threshold level to activate active overshoot control */ + TFA9894N2_BF_DCTRIP = 0x7204, /*!< 1st adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9894N2_BF_DCTRIP2 = 0x7254, /*!< 2nd adaptive boost trip levels, effective only when DCIE is set to 1 */ + TFA9894N2_BF_DCTRIPT = 0x72a4, /*!< Track adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9894N2_BF_DCTRIPHYSTE = 0x72f0, /*!< Enable hysteresis on booster trip levels */ + TFA9894N2_BF_DCHOLD = 0x7304, /*!< Hold time / Hysteresis for DCDC booster, effective only when boost_intelligent is set to 1 */ + TFA9894N2_BF_RST = 0x9000, /*!< Reset for Coolflux DSP */ + TFA9894N2_BF_DMEM = 0x9011, /*!< Target memory for CFMA using I2C interface */ + TFA9894N2_BF_AIF = 0x9030, /*!< Auto increment */ + TFA9894N2_BF_CFINT = 0x9040, /*!< Coolflux Interrupt - auto clear */ + TFA9894N2_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ + TFA9894N2_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ + TFA9894N2_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ + TFA9894N2_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ + TFA9894N2_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ + TFA9894N2_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ + TFA9894N2_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ + TFA9894N2_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ + TFA9894N2_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ + TFA9894N2_BF_MADD = 0x910f, /*!< CF memory address */ + TFA9894N2_BF_MEMA = 0x920f, /*!< Activate memory access */ + TFA9894N2_BF_ERR = 0x9307, /*!< CF error flags */ + TFA9894N2_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ + TFA9894N2_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ + TFA9894N2_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ + TFA9894N2_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ + TFA9894N2_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ + TFA9894N2_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ + TFA9894N2_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ + TFA9894N2_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ + TFA9894N2_BF_MTPK = 0xa107, /*!< KEY2 to access KEY2 protected registers, customer key */ + TFA9894N2_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9894N2_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9894N2_BF_CMTPI = 0xa350, /*!< Start copying all the data from mtp to I2C mtp registers - auto clear */ + TFA9894N2_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp - auto clear */ + TFA9894N2_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9894N2_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9894N2_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9894N2_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9894N2_BF_PLLINSELI = 0xca05, /*!< PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9894N2_BF_PLLINSELP = 0xca64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9894N2_BF_PLLINSELR = 0xcab3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ + TFA9894N2_BF_PLLNDEC = 0xcb09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9894N2_BF_PLLMDECMSB = 0xcba0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9894N2_BF_PLLBYPASS = 0xcbb0, /*!< PLL bypass control during functional mode */ + TFA9894N2_BF_PLLDIRECTI = 0xcbc0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9894N2_BF_PLLDIRECTO = 0xcbd0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9894N2_BF_PLLFRMSTBL = 0xcbe0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9894N2_BF_PLLFRM = 0xcbf0, /*!< PLL free running mode control in functional mode */ + TFA9894N2_BF_PLLMDECLSB = 0xcc0f, /*!< Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9894N2_BF_PLLPDEC = 0xcd06, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ + TFA9894N2_BF_DIRECTPLL = 0xcd70, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ + TFA9894N2_BF_DIRECTCLK = 0xcd80, /*!< Enabled CGU clock divider direct control mode */ + TFA9894N2_BF_PLLLIM = 0xcd90, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ + TFA9894N2_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ + TFA9894N2_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ + TFA9894N2_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9894N2_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9894N2_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9894N2_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9894N2_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9894N2_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9894N2_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ +} Tfa9894N2BfEnumList_t; +#define TFA9894N2_NAMETABLE static tfaBfName_t Tfa9894N2DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown control , */\ + { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ + { 0x20, "CFE"}, /* Enable CoolFlux DSP , */\ + { 0x30, "AMPE"}, /* Enable Amplifier , */\ + { 0x40, "DCA"}, /* Enable DCDC Boost converter , */\ + { 0x50, "SBSL"}, /* Coolflux configured , */\ + { 0x60, "AMPC"}, /* CoolFlux control over amplifier , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0x90, "FSSSEL"}, /* Audio sample reference , */\ + { 0xa0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xb0, "TSTOCP"}, /* OCP testing control , */\ + { 0xc0, "BSSS"}, /* Vbat protection steepness , */\ + { 0xd0, "HPFBYP"}, /* Bypass High Pass Filter , */\ + { 0xe0, "DPSA"}, /* Enable DPSA , */\ + { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ + { 0x120, "MANSCONF"}, /* Device I2C settings configured , */\ + { 0x130, "MANCOLD"}, /* Execute cold start , */\ + { 0x140, "MANROBOD"}, /* Reaction on BOD , */\ + { 0x150, "BODE"}, /* Enable BOD (only in direct control mode) , */\ + { 0x160, "BODHYS"}, /* Enable Hysteresis of BOD , */\ + { 0x171, "BODFILT"}, /* BOD filter , */\ + { 0x191, "BODTHLVL"}, /* BOD threshold , */\ + { 0x1b0, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1c0, "MANWDE"}, /* Watchdog enable , */\ + { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ + { 0x1f0, "FAIMVBGOVRRL"}, /* Overrule the enabling of VBG for faim erase/write access, */\ + { 0x203, "AUDFS"}, /* Audio sample rate Fs , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* Current sense fractional delay , */\ + { 0x2b1, "TDMPRES"}, /* Control for HW manager , */\ + { 0x2d2, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x30f, "REV"}, /* Revision info , */\ + { 0x401, "REFCKEXT"}, /* PLL external reference clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal reference clock , */\ + { 0x432, "MCLKSEL"}, /* Master Clock Selection , */\ + { 0x460, "MANAOOSC"}, /* Internal OSC1M off at PWDN , */\ + { 0x470, "ACKCLDDIS"}, /* Automatic PLL reference clock selection for cold start, */\ + { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "PLLSTUP"}, /* PLL startup time configuration , */\ + { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "SPKSSEN"}, /* Enable speaker sub-system , */\ + { 0x520, "MTPSSEN"}, /* Enable FAIM sub-system , */\ + { 0x530, "WDTCLKEN"}, /* Enable Coolflux watchdog clock , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "PLLS"}, /* PLL Lock , */\ + { 0x1020, "OTDS"}, /* OTP alarm , */\ + { 0x1030, "OVDS"}, /* OVP alarm , */\ + { 0x1040, "UVDS"}, /* UVP alarm , */\ + { 0x1050, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1060, "CLKS"}, /* Clocks stable , */\ + { 0x1070, "MTPB"}, /* MTP busy , */\ + { 0x1080, "NOCLK"}, /* Lost clock , */\ + { 0x1090, "ACS"}, /* Cold Start , */\ + { 0x10a0, "WDS"}, /* Watchdog , */\ + { 0x10b0, "SWS"}, /* Amplifier engage , */\ + { 0x10c0, "AMPS"}, /* Amplifier enable , */\ + { 0x10d0, "AREFS"}, /* References enable , */\ + { 0x10e0, "ADCCR"}, /* Control ADC , */\ + { 0x10f0, "BODNOK"}, /* BOD Flag - VDD NOT OK , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1170, "SPKS"}, /* Speaker status , */\ + { 0x1180, "CLKOOR"}, /* External clock status , */\ + { 0x1190, "MANALARM"}, /* Alarm state , */\ + { 0x11a0, "TDMERR"}, /* TDM error , */\ + { 0x11b0, "TDMLUTER"}, /* TDM lookup table error , */\ + { 0x11c0, "NOAUDCLK"}, /* Lost Audio clock , */\ + { 0x1200, "OCPOAP"}, /* OCPOK pmos A , */\ + { 0x1210, "OCPOAN"}, /* OCPOK nmos A , */\ + { 0x1220, "OCPOBP"}, /* OCPOK pmos B , */\ + { 0x1230, "OCPOBN"}, /* OCPOK nmos B , */\ + { 0x1240, "CLIPS"}, /* Amplifier clipping , */\ + { 0x1250, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x1260, "MANOPER"}, /* Device in Operating state , */\ + { 0x1270, "LP1"}, /* Low power MODE1 detection , */\ + { 0x1280, "LA"}, /* Low amplitude detection , */\ + { 0x1290, "VDDPH"}, /* VDDP greater than VBAT flag , */\ + { 0x1302, "TDMSTAT"}, /* TDM Status bits , */\ + { 0x1333, "MANSTATE"}, /* Device Manager status , */\ + { 0x13b1, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ + { 0x2000, "TDME"}, /* Enable interface , */\ + { 0x2010, "TDMSPKE"}, /* Control audio tdm channel in sink0 , */\ + { 0x2020, "TDMDCE"}, /* Control audio tdm channel in sink1 , */\ + { 0x2030, "TDMCSE"}, /* Source 0 enable , */\ + { 0x2040, "TDMVSE"}, /* Source 1 enable , */\ + { 0x2050, "TDMCFE"}, /* Source 2 enable , */\ + { 0x2060, "TDMCF2E"}, /* Source 3 enable , */\ + { 0x2070, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2080, "TDMFSPOL"}, /* FS polarity , */\ + { 0x2090, "TDMDEL"}, /* Data delay to FS , */\ + { 0x20a0, "TDMADJ"}, /* Data adjustment , */\ + { 0x20b1, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2103, "TDMNBCK"}, /* TDM NBCK - Bit clock to FS ratio , */\ + { 0x2143, "TDMFSLN"}, /* FS length (master mode only) , */\ + { 0x2183, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x21c1, "TDMTXDFO"}, /* Format unused bits , */\ + { 0x21e1, "TDMTXUS0"}, /* Format unused slots DATAO , */\ + { 0x2204, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2254, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x22a4, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2303, "TDMSPKS"}, /* TDM slot for sink 0 , */\ + { 0x2343, "TDMDCS"}, /* TDM slot for sink 1 , */\ + { 0x2381, "TDMCFSEL"}, /* TDM Source 2 data selection , */\ + { 0x23a1, "TDMCF2SEL"}, /* TDM Source 3 data selection , */\ + { 0x2403, "TDMCSS"}, /* Slot position of source 0 data , */\ + { 0x2443, "TDMVSS"}, /* Slot position of source 1 data , */\ + { 0x2483, "TDMCFS"}, /* Slot position of source 2 data , */\ + { 0x24c3, "TDMCF2S"}, /* Slot position of source 3 data , */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ + { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4080, "ISTCFMER"}, /* Status cfma error , */\ + { 0x4090, "ISTCFMAC"}, /* Status cfma ack , */\ + { 0x40a0, "ISTSPKS"}, /* Status coolflux speaker error , */\ + { 0x40b0, "ISTACS"}, /* Status cold started , */\ + { 0x40c0, "ISTWDS"}, /* Status watchdog reset , */\ + { 0x40d0, "ISTBODNOK"}, /* Status brown out detect , */\ + { 0x40e0, "ISTLP1"}, /* Status low power mode1 detect , */\ + { 0x40f0, "ISTCLKOOR"}, /* Status clock out of range , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ + { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4480, "ICLCFMER"}, /* Clear cfma err , */\ + { 0x4490, "ICLCFMAC"}, /* Clear cfma ack , */\ + { 0x44a0, "ICLSPKS"}, /* Clear coolflux speaker error , */\ + { 0x44b0, "ICLACS"}, /* Clear cold started , */\ + { 0x44c0, "ICLWDS"}, /* Clear watchdog reset , */\ + { 0x44d0, "ICLBODNOK"}, /* Clear brown out detect , */\ + { 0x44e0, "ICLLP1"}, /* Clear low power mode1 detect , */\ + { 0x44f0, "ICLCLKOOR"}, /* Clear clock out of range , */\ + { 0x4800, "IEVDDS"}, /* Enable POR , */\ + { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IEMANALARM"}, /* Enable Manager Alarm state , */\ + { 0x4860, "IETDMER"}, /* Enable TDM error , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4880, "IECFMER"}, /* Enable cfma err , */\ + { 0x4890, "IECFMAC"}, /* Enable cfma ack , */\ + { 0x48a0, "IESPKS"}, /* Enable coolflux speaker error , */\ + { 0x48b0, "IEACS"}, /* Enable cold started , */\ + { 0x48c0, "IEWDS"}, /* Enable watchdog reset , */\ + { 0x48d0, "IEBODNOK"}, /* Enable brown out detect , */\ + { 0x48e0, "IELP1"}, /* Enable low power mode1 detect , */\ + { 0x48f0, "IECLKOOR"}, /* Enable clock out of range , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ + { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ + { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x4c80, "IPOCFMER"}, /* Polarity cfma err , */\ + { 0x4c90, "IPOCFMAC"}, /* Polarity cfma ack , */\ + { 0x4ca0, "IPOSPKS"}, /* Polarity coolflux speaker error , */\ + { 0x4cb0, "IPOACS"}, /* Polarity cold started , */\ + { 0x4cc0, "IPOWDS"}, /* Polarity watchdog reset , */\ + { 0x4cd0, "IPOBODNOK"}, /* Polarity brown out detect , */\ + { 0x4ce0, "IPOLP1"}, /* Polarity low power mode1 detect , */\ + { 0x4cf0, "IPOCLKOOR"}, /* Polarity clock out of range , */\ + { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ + { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ + { 0x5082, "BSSRR"}, /* Battery safeguard release time , */\ + { 0x50b1, "BSSHY"}, /* Battery Safeguard hysteresis , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ + { 0x5130, "CFSM"}, /* Coolflux firmware soft mute control , */\ + { 0x5187, "VOL"}, /* CF firmware volume control , */\ + { 0x5202, "CLIPCTRL"}, /* Clip control setting , */\ + { 0x5230, "SLOPEE"}, /* Enables slope control , */\ + { 0x5240, "SLOPESET"}, /* Slope speed setting (binary coded) , */\ + { 0x5250, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ + { 0x5287, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x5703, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x5743, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x5781, "DCINSEL"}, /* VAMP_OUT2 input selection , */\ + { 0x5881, "LNMODE"}, /* Low noise gain mode control , */\ + { 0x5ac1, "LPM1MODE"}, /* Low power mode control , */\ + { 0x5d02, "TDMSRCMAP"}, /* TDM source mapping , */\ + { 0x5d31, "TDMSRCAS"}, /* Sensed value A , */\ + { 0x5d51, "TDMSRCBS"}, /* Sensed value B , */\ + { 0x5d71, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ + { 0x5d91, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ + { 0x6102, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6130, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ + { 0x6140, "ENCURCOMP"}, /* Enable current sense compensation , */\ + { 0x6152, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7005, "DCVOF"}, /* First Boost Voltage Level , */\ + { 0x7065, "DCVOS"}, /* Second Boost Voltage Level , */\ + { 0x70c3, "DCMCC"}, /* Max Coil Current , */\ + { 0x7101, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7120, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7130, "DCSR"}, /* Soft ramp up/down , */\ + { 0x7140, "DCDIS"}, /* DCDC on/off , */\ + { 0x7150, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7160, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7170, "DCENVSEL"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7195, "OVSCTLVL"}, /* Threshold level to activate active overshoot control, */\ + { 0x7204, "DCTRIP"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7254, "DCTRIP2"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x72a4, "DCTRIPT"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x72f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7304, "DCHOLD"}, /* Hold time / Hysteresis for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x9000, "RST"}, /* Reset for Coolflux DSP , */\ + { 0x9011, "DMEM"}, /* Target memory for CFMA using I2C interface , */\ + { 0x9030, "AIF"}, /* Auto increment , */\ + { 0x9040, "CFINT"}, /* Coolflux Interrupt - auto clear , */\ + { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ + { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ + { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ + { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ + { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ + { 0x910f, "MADD"}, /* CF memory address , */\ + { 0x920f, "MEMA"}, /* Activate memory access , */\ + { 0x9307, "ERR"}, /* CF error flags , */\ + { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ + { 0xa107, "MTPK"}, /* KEY2 to access KEY2 protected registers, customer key, */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa350, "CMTPI"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ + { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xca05, "PLLINSELI"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xca64, "PLLINSELP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcab3, "PLLINSELR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcb09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcba0, "PLLMDECMSB"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbb0, "PLLBYPASS"}, /* PLL bypass control during functional mode , */\ + { 0xcbc0, "PLLDIRECTI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbd0, "PLLDIRECTO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbe0, "PLLFRMSTBL"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbf0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ + { 0xcc0f, "PLLMDECLSB"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcd06, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcd70, "DIRECTPLL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xcd80, "DIRECTCLK"}, /* Enabled CGU clock divider direct control mode , */\ + { 0xcd90, "PLLLIM"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ + { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9894N2_BITNAMETABLE static tfaBfName_t Tfa9894N2BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown control , */\ + { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ + { 0x20, "enbl_coolflux"}, /* Enable CoolFlux DSP , */\ + { 0x30, "enbl_amplifier"}, /* Enable Amplifier , */\ + { 0x40, "enbl_boost"}, /* Enable DCDC Boost converter , */\ + { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ + { 0x60, "sel_enbl_amplifier"}, /* CoolFlux control over amplifier , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ + { 0xa0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xb0, "test_ocp"}, /* OCP testing control , */\ + { 0xc0, "batsense_steepness"}, /* Vbat protection steepness , */\ + { 0xd0, "bypass_hp"}, /* Bypass High Pass Filter , */\ + { 0xe0, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0xf0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ + { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ + { 0x120, "src_set_configured"}, /* Device I2C settings configured , */\ + { 0x130, "execute_cold_start"}, /* Execute cold start , */\ + { 0x140, "man_enbl_brown_out"}, /* Reaction on BOD , */\ + { 0x150, "bod_enbl"}, /* Enable BOD (only in direct control mode) , */\ + { 0x160, "bod_hyst_enbl"}, /* Enable Hysteresis of BOD , */\ + { 0x171, "bod_delay_set"}, /* BOD filter , */\ + { 0x191, "bod_lvl_set"}, /* BOD threshold , */\ + { 0x1b0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x1c0, "man_enbl_watchdog"}, /* Watchdog enable , */\ + { 0x1d0, "disable_engage"}, /* Disable Engage , */\ + { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ + { 0x1f0, "faim_enable_vbg"}, /* Overrule the enabling of VBG for faim erase/write access, */\ + { 0x203, "audio_fs"}, /* Audio sample rate Fs , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* Current sense fractional delay , */\ + { 0x2b1, "use_tdm_presence"}, /* Control for HW manager , */\ + { 0x2d2, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x30f, "device_rev"}, /* Revision info , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external reference clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal reference clock , */\ + { 0x432, "mclk_sel"}, /* Master Clock Selection , */\ + { 0x460, "enbl_osc1m_auto_off"}, /* Internal OSC1M off at PWDN , */\ + { 0x470, "disable_auto_sel_refclk"}, /* Automatic PLL reference clock selection for cold start, */\ + { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ + { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ + { 0x4a0, "pll_slow_startup"}, /* PLL startup time configuration , */\ + { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ + { 0x510, "enbl_spkr_ss"}, /* Enable speaker sub-system , */\ + { 0x520, "enbl_faim_ss"}, /* Enable FAIM sub-system , */\ + { 0x530, "enbl_wdt_clk"}, /* Enable Coolflux watchdog clock , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* Hidden code to enable access to hidden register. (0x5A6B/23147 default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_pll_lock"}, /* PLL Lock , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm , */\ + { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ + { 0x1050, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ + { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1080, "flag_lost_clk"}, /* Lost clock , */\ + { 0x1090, "flag_cold_started"}, /* Cold Start , */\ + { 0x10a0, "flag_watchdog_reset"}, /* Watchdog , */\ + { 0x10b0, "flag_engage"}, /* Amplifier engage , */\ + { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ + { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x10f0, "flag_bod_vddd_nok"}, /* BOD Flag - VDD NOT OK , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ + { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ + { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1170, "flag_cf_speakererror"}, /* Speaker status , */\ + { 0x1180, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x1190, "flag_man_alarm_state"}, /* Alarm state , */\ + { 0x11a0, "flag_tdm_error"}, /* TDM error , */\ + { 0x11b0, "flag_tdm_lut_error"}, /* TDM lookup table error , */\ + { 0x11c0, "flag_lost_audio_clk"}, /* Lost Audio clock , */\ + { 0x1200, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1210, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1220, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1230, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1240, "flag_clip"}, /* Amplifier clipping , */\ + { 0x1250, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x1260, "flag_man_operating_state"}, /* Device in Operating state , */\ + { 0x1270, "flag_lp_detect_mode1"}, /* Low power MODE1 detection , */\ + { 0x1280, "flag_low_amplitude"}, /* Low amplitude detection , */\ + { 0x1290, "flag_vddp_gt_vbat"}, /* VDDP greater than VBAT flag , */\ + { 0x1302, "tdm_status"}, /* TDM Status bits , */\ + { 0x1333, "man_state"}, /* Device Manager status , */\ + { 0x1373, "amp_ctrl_state"}, /* Amplifier control status , */\ + { 0x13b1, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ + { 0x2000, "tdm_enable"}, /* Enable interface , */\ + { 0x2010, "tdm_sink0_enable"}, /* Control audio tdm channel in sink0 , */\ + { 0x2020, "tdm_sink1_enable"}, /* Control audio tdm channel in sink1 , */\ + { 0x2030, "tdm_source0_enable"}, /* Source 0 enable , */\ + { 0x2040, "tdm_source1_enable"}, /* Source 1 enable , */\ + { 0x2050, "tdm_source2_enable"}, /* Source 2 enable , */\ + { 0x2060, "tdm_source3_enable"}, /* Source 3 enable , */\ + { 0x2070, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2080, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x2090, "tdm_data_delay"}, /* Data delay to FS , */\ + { 0x20a0, "tdm_data_adjustment"}, /* Data adjustment , */\ + { 0x20b1, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2103, "tdm_nbck"}, /* TDM NBCK - Bit clock to FS ratio , */\ + { 0x2143, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ + { 0x2183, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x21c1, "tdm_txdata_format"}, /* Format unused bits , */\ + { 0x21e1, "tdm_txdata_format_unused_slot"}, /* Format unused slots DATAO , */\ + { 0x2204, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2254, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x22a4, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2303, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ + { 0x2343, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ + { 0x2381, "tdm_source2_sel"}, /* TDM Source 2 data selection , */\ + { 0x23a1, "tdm_source3_sel"}, /* TDM Source 3 data selection , */\ + { 0x2403, "tdm_source0_slot"}, /* Slot position of source 0 data , */\ + { 0x2443, "tdm_source1_slot"}, /* Slot position of source 1 data , */\ + { 0x2483, "tdm_source2_slot"}, /* Slot position of source 2 data , */\ + { 0x24c3, "tdm_source3_slot"}, /* Slot position of source 3 data , */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ + { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4080, "int_out_flag_cfma_err"}, /* Status cfma error , */\ + { 0x4090, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ + { 0x40a0, "int_out_flag_cf_speakererror"}, /* Status coolflux speaker error , */\ + { 0x40b0, "int_out_flag_cold_started"}, /* Status cold started , */\ + { 0x40c0, "int_out_flag_watchdog_reset"}, /* Status watchdog reset , */\ + { 0x40d0, "int_out_flag_bod_vddd_nok"}, /* Status brown out detect , */\ + { 0x40e0, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 detect , */\ + { 0x40f0, "int_out_flag_clk_out_of_range"}, /* Status clock out of range , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ + { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4480, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ + { 0x4490, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ + { 0x44a0, "int_in_flag_cf_speakererror"}, /* Clear coolflux speaker error , */\ + { 0x44b0, "int_in_flag_cold_started"}, /* Clear cold started , */\ + { 0x44c0, "int_in_flag_watchdog_reset"}, /* Clear watchdog reset , */\ + { 0x44d0, "int_in_flag_bod_vddd_nok"}, /* Clear brown out detect , */\ + { 0x44e0, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 detect , */\ + { 0x44f0, "int_in_flag_clk_out_of_range"}, /* Clear clock out of range , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ + { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable Manager Alarm state , */\ + { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4880, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ + { 0x4890, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ + { 0x48a0, "int_enable_flag_cf_speakererror"}, /* Enable coolflux speaker error , */\ + { 0x48b0, "int_enable_flag_cold_started"}, /* Enable cold started , */\ + { 0x48c0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog reset , */\ + { 0x48d0, "int_enable_flag_bod_vddd_nok"}, /* Enable brown out detect , */\ + { 0x48e0, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 detect , */\ + { 0x48f0, "int_enable_flag_clk_out_of_range"}, /* Enable clock out of range , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ + { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ + { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x4c80, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ + { 0x4c90, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ + { 0x4ca0, "int_polarity_flag_cf_speakererror"}, /* Polarity coolflux speaker error , */\ + { 0x4cb0, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ + { 0x4cc0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog reset , */\ + { 0x4cd0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity brown out detect , */\ + { 0x4ce0, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 detect , */\ + { 0x4cf0, "int_polarity_flag_clk_out_of_range"}, /* Polarity clock out of range , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ + { 0x5082, "vbat_prot_release_time"}, /* Battery safeguard release time , */\ + { 0x50b1, "vbat_prot_hysterese"}, /* Battery Safeguard hysteresis , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ + { 0x5130, "cf_mute"}, /* Coolflux firmware soft mute control , */\ + { 0x5187, "cf_volume"}, /* CF firmware volume control , */\ + { 0x5202, "ctrl_cc"}, /* Clip control setting , */\ + { 0x5230, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x5240, "ctrl_slope"}, /* Slope speed setting (binary coded) , */\ + { 0x5250, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ + { 0x5287, "gain"}, /* Amplifier gain , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ + { 0x5340, "clipfast"}, /* Clock selection for HW clipper for battery safeguard, */\ + { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ + { 0x5360, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ + { 0x5370, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5380, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5390, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x53a3, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ + { 0x5400, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5413, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5452, "dpsa_drive"}, /* Drive setting (binary coded) , */\ + { 0x550a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ + { 0x55b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ + { 0x55c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ + { 0x5600, "pwm_shape"}, /* PWM shape , */\ + { 0x5614, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ + { 0x5660, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ + { 0x5670, "reclock_voltsense"}, /* Reclock the voltage sense PWM signal , */\ + { 0x5680, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ + { 0x5690, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ + { 0x56a1, "enbl_odd_up_even_down"}, /* Control for PWM reference sawtooth generartion , */\ + { 0x5703, "ctrl_att_dcdc"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ + { 0x5743, "ctrl_att_spkr"}, /* Total gain depending on INPLEV setting (channel 0), */\ + { 0x5781, "vamp_sel2"}, /* VAMP_OUT2 input selection , */\ + { 0x5805, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ + { 0x5861, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ + { 0x5881, "lownoisegain_mode"}, /* Low noise gain mode control , */\ + { 0x5905, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ + { 0x5965, "hold_time"}, /* Low noise mode hold time before entering into low noise mode, */\ + { 0x5a05, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x5a65, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ + { 0x5ac1, "lpm1_mode"}, /* Low power mode control , */\ + { 0x5b05, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ + { 0x5b65, "lpm1_hold_time"}, /* Low power mode hold time before entering into low power mode, */\ + { 0x5bc0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ + { 0x5c00, "enbl_minion"}, /* Enables minion (small) power stage , */\ + { 0x5c13, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ + { 0x5c50, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ + { 0x5c61, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ + { 0x5d02, "tdm_source_mapping"}, /* TDM source mapping , */\ + { 0x5d31, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ + { 0x5d51, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ + { 0x5d71, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ + { 0x5d91, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ + { 0x5e02, "rst_min_vbat_delay"}, /* Delay for reseting the min_vbat value inside HW Clipper (number of Fs pulses), */\ + { 0x5e30, "rst_min_vbat_sel"}, /* Control for selecting reset signal for min_bat , */\ + { 0x5f00, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5f12, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x5f42, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x5f78, "spare_out"}, /* Spare out register , */\ + { 0x600f, "spare_in"}, /* Spare IN , */\ + { 0x6102, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ + { 0x6130, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ + { 0x6140, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ + { 0x6152, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ + { 0x7005, "frst_boost_voltage"}, /* First Boost Voltage Level , */\ + { 0x7065, "scnd_boost_voltage"}, /* Second Boost Voltage Level , */\ + { 0x70c3, "boost_cur"}, /* Max Coil Current , */\ + { 0x7101, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7120, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7130, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x7140, "dcdcoff_mode"}, /* DCDC on/off , */\ + { 0x7150, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7160, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7170, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x7180, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ + { 0x7195, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ + { 0x7204, "boost_trip_lvl_1st"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x7254, "boost_trip_lvl_2nd"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ + { 0x72a4, "boost_trip_lvl_track"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x72f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ + { 0x7304, "boost_hold_time"}, /* Hold time / Hysteresis for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x7350, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ + { 0x7361, "dcdc_ctrl_maxzercnt"}, /* Number of zero current flags to count before going to pfm mode, */\ + { 0x7386, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x73f0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x7404, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7451, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7474, "bst_slopecur"}, /* For testing direct control slope current , */\ + { 0x74c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x74e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x74f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7500, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ + { 0x7510, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ + { 0x7520, "enbl_bst_peakcur"}, /* Enable peak current , */\ + { 0x7530, "enbl_bst_power"}, /* Enable line of the powerstage , */\ + { 0x7540, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x7550, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ + { 0x7560, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x7570, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x7580, "enbl_bst_windac"}, /* Enable window dac , */\ + { 0x7595, "bst_windac"}, /* For testing direct control windac , */\ + { 0x7600, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7611, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7631, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7650, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7660, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ + { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ + { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ + { 0x8040, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8050, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8060, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8105, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP) * signal, */\ + { 0x8164, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ + { 0x81b0, "enbl_cs_adc"}, /* Enable current sense ADC , */\ + { 0x81c0, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ + { 0x81d0, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ + { 0x81e0, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x81f0, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ + { 0x8200, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ + { 0x8210, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ + { 0x8220, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8231, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ + { 0x8250, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x8263, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ + { 0x82a0, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x82b4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ + { 0x8300, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ + { 0x8310, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8320, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8330, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8340, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8350, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if enbl_cs_ldo is high, */\ + { 0x8364, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8800, "ctrl_vs_igen_supply"}, /* Control for selecting supply for VS current generator, */\ + { 0x8810, "ctrl_vs_force_div2"}, /* Select input resistive divider gain , */\ + { 0x8820, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ + { 0x8901, "volsense_pwm_sel"}, /* Voltage sense source selection control , */\ + { 0x8920, "vs_gain_control"}, /* Voltage sense gain control , */\ + { 0x8930, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ + { 0x8940, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ + { 0x8950, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ + { 0x8960, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ + { 0x8970, "vs_classd_tran_skip"}, /* Skip voltage sense connection during a classD amplifier transition, */\ + { 0x8987, "vs_gain"}, /* Voltage sense gain , */\ + { 0x8a00, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ + { 0x8a10, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ + { 0x8a20, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ + { 0x8a30, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if enbl_cs_ldo is high, */\ + { 0x8a44, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ + { 0x8a90, "enbl_vs_adc"}, /* Enable voltage sense ADC , */\ + { 0x8aa0, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ + { 0x8ab0, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ + { 0x8ac0, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ + { 0x8ad0, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ + { 0x8ae0, "enbl_vs_ldo"}, /* Enable voltage sense LDO , */\ + { 0x8af0, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO , */\ + { 0x9000, "cf_rst_dsp"}, /* Reset for Coolflux DSP , */\ + { 0x9011, "cf_dmem"}, /* Target memory for CFMA using I2C interface , */\ + { 0x9030, "cf_aif"}, /* Auto increment , */\ + { 0x9040, "cf_int"}, /* Coolflux Interrupt - auto clear , */\ + { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ + { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ + { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ + { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ + { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ + { 0x910f, "cf_madd"}, /* CF memory address , */\ + { 0x920f, "cf_mema"}, /* Activate memory access , */\ + { 0x9307, "cf_err"}, /* CF error flags , */\ + { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ + { 0xa007, "mtpkey1"}, /* KEY1 To access KEY1 protected registers 0x5A/90d (default for engineering), */\ + { 0xa107, "mtpkey2"}, /* KEY2 to access KEY2 protected registers, customer key, */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from MTP to I2C mtp register - auto clear, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp - auto clear, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ + { 0xa400, "faim_set_clkws"}, /* Sets the FaIM controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the FaIM are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the FaIM are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb000, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb010, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb020, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb030, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb040, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb050, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb060, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb070, "disable_main_ctrl_change_prot"}, /* Disable main control change protection , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ + { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ + { 0xc0f0, "enbl_osc"}, /* Enables OSC in I2C direct control mode only , */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ + { 0xc3d0, "test_abistfft_enbl"}, /* Enable ABIST with FFT on Coolflux DSP , */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost Converter Over Current Protection , */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc530, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc540, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc550, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc560, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ + { 0xc570, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc583, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc5c0, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc607, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO , */\ + { 0xc687, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT , */\ + { 0xc707, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 , */\ + { 0xc800, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xc810, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xc820, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xc830, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xc844, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xc894, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xc903, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ + { 0xc943, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ + { 0xca05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xca64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcab3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ + { 0xcaf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ + { 0xcb09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcba0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ + { 0xcbc0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbd0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbe0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcbf0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ + { 0xcc0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcd06, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ + { 0xcd70, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ + { 0xcd80, "use_direct_clk_ctrl"}, /* Enabled CGU clock divider direct control mode , */\ + { 0xcd90, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ + { 0xce0f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xcf02, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ + { 0xcf33, "tsig_gain"}, /* Test signal gain , */\ + { 0xd000, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd011, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd032, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd064, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd0b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd0c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd109, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd201, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ + { 0xd301, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ + { 0xd321, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ + { 0xd340, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xd407, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd480, "enbl_clk_out_of_range"}, /* Clock out of range , */\ + { 0xd491, "sel_wdt_clk"}, /* Watch dog clock divider settings , */\ + { 0xd4b0, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd500, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ + { 0xd510, "gainatt_feedback"}, /* Gainatt feedback to tdm , */\ + { 0xd522, "test_parametric_io"}, /* Test IO parametric , */\ + { 0xd550, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ + { 0xd561, "test_spare_out1"}, /* Test spare out 1 , */\ + { 0xd580, "bst_dcmbst"}, /* DCM boost , */\ + { 0xd593, "test_spare_out2"}, /* Test spare out 2 , */\ + { 0xe00f, "sw_profile"}, /* Software profile data , */\ + { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf163, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf307, "calibr_gain_vs"}, /* Voltage sense gain , */\ + { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf40f, "mtpdata4"}, /* MTP4 data , */\ + { 0xf50f, "calibr_R25C"}, /* Ron resistance of speaker coil , */\ + { 0xf60f, "mtpdata6"}, /* MTP6 data , */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable functionality of dcdcoff_mode bit , */\ + { 0xf910, "mtp_lock_enbl_coolflux"}, /* Disable functionality of enbl_coolflux bit , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ + { 0xf940, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ + { 0xf987, "type_bits_fw"}, /* MTP control for firmware features - See Firmware I2C API document for details, */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE , */\ + { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; +#if 0 +enum tfa9894_irq { + tfa9894_irq_max = -1, + tfa9894_irq_all = -1 /* all irqs */}; +#endif// +#define TFA9894_IRQ_NAMETABLE static tfaIrqName_t Tfa9894IrqNames[] = {\ +}; +#endif /* _TFA9894_TFAFIELDNAMES_H */ diff --git a/inc/tfa9896_tfafieldnames.h b/inc/tfa9896_tfafieldnames.h new file mode 100644 index 000000000000..7a70eded87d6 --- /dev/null +++ b/inc/tfa9896_tfafieldnames.h @@ -0,0 +1,930 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9896_tfafieldnames.h + * This file was generated automatically on 08/15/16 at 09:43:38. + * Source file: TFA9896_N1B1_I2C_regmap_V16.xlsx + */ + +#ifndef _TFA9896_TFAFIELDNAMES_H +#define _TFA9896_TFAFIELDNAMES_H + + +#define TFA9896_I2CVERSION 16 + +typedef enum TFA9896BfEnumList { + TFA9896_BF_VDDS = 0x0000, /*!< Power-on-reset flag (auto clear by reading) */ + TFA9896_BF_PLLS = 0x0010, /*!< PLL lock to programmed frequency */ + TFA9896_BF_OTDS = 0x0020, /*!< Over Temperature Protection alarm */ + TFA9896_BF_OVDS = 0x0030, /*!< Over Voltage Protection alarm */ + TFA9896_BF_UVDS = 0x0040, /*!< Under Voltage Protection alarm */ + TFA9896_BF_OCDS = 0x0050, /*!< Over Current Protection alarm */ + TFA9896_BF_CLKS = 0x0060, /*!< Clocks stable flag */ + TFA9896_BF_CLIPS = 0x0070, /*!< Amplifier clipping */ + TFA9896_BF_MTPB = 0x0080, /*!< MTP busy copying data to/from I2C registers */ + TFA9896_BF_NOCLK = 0x0090, /*!< lost clock detection (reference input clock) */ + TFA9896_BF_SPKS = 0x00a0, /*!< Speaker error */ + TFA9896_BF_ACS = 0x00b0, /*!< Cold Start required */ + TFA9896_BF_SWS = 0x00c0, /*!< Amplifier engage (Amp Switching) */ + TFA9896_BF_WDS = 0x00d0, /*!< watchdog reset (activates reset) */ + TFA9896_BF_AMPS = 0x00e0, /*!< Amplifier is enabled by manager */ + TFA9896_BF_AREFS = 0x00f0, /*!< References are enabled by manager */ + TFA9896_BF_BATS = 0x0109, /*!< Battery voltage from ADC readout */ + TFA9896_BF_TEMPS = 0x0208, /*!< Temperature readout from the temperature sensor ( C) */ + TFA9896_BF_REV = 0x030f, /*!< Device revision information */ + TFA9896_BF_RCV = 0x0420, /*!< Enable receiver mode */ + TFA9896_BF_CHS12 = 0x0431, /*!< Channel Selection TDM input for Coolflux */ + TFA9896_BF_INPLVL = 0x0450, /*!< Input level selection attenuator ( */ + TFA9896_BF_CHSA = 0x0461, /*!< Input selection for amplifier */ + TFA9896_BF_AUDFS = 0x04c3, /*!< Audio sample rate setting */ + TFA9896_BF_BSSCR = 0x0501, /*!< Batteery protection attack time */ + TFA9896_BF_BSST = 0x0523, /*!< Battery protection threshold level */ + TFA9896_BF_BSSRL = 0x0561, /*!< Battery protection maximum reduction */ + TFA9896_BF_BSSRR = 0x0582, /*!< Battery protection release time */ + TFA9896_BF_BSSHY = 0x05b1, /*!< Battery Protection Hysteresis */ + TFA9896_BF_BSSR = 0x05e0, /*!< Battery voltage value for read out (only) */ + TFA9896_BF_BSSBY = 0x05f0, /*!< Bypass clipper battery protection */ + TFA9896_BF_DPSA = 0x0600, /*!< Enable dynamic powerstage activation (DPSA) */ + TFA9896_BF_ATTEN = 0x0613, /*!< Gain attenuation setting */ + TFA9896_BF_CFSM = 0x0650, /*!< Soft mute in CoolFlux */ + TFA9896_BF_BSSS = 0x0670, /*!< Battery sense steepness */ + TFA9896_BF_VOL = 0x0687, /*!< Coolflux volume control */ + TFA9896_BF_DCVO2 = 0x0702, /*!< Second Boost Voltage */ + TFA9896_BF_DCMCC = 0x0733, /*!< Max boost coil current - step of 175 mA */ + TFA9896_BF_DCVO1 = 0x0772, /*!< First Boost Voltage */ + TFA9896_BF_DCIE = 0x07a0, /*!< Adaptive boost mode */ + TFA9896_BF_DCSR = 0x07b0, /*!< Soft Rampup/down mode for DCDC controller */ + TFA9896_BF_DCPAVG = 0x07c0, /*!< ctrl_peak2avg for analog part of DCDC */ + TFA9896_BF_DCPWM = 0x07d0, /*!< DCDC PWM only mode */ + TFA9896_BF_TROS = 0x0800, /*!< Selection ambient temperature for speaker calibration */ + TFA9896_BF_EXTTS = 0x0818, /*!< External temperature for speaker calibration (C) */ + TFA9896_BF_PWDN = 0x0900, /*!< powerdown selection */ + TFA9896_BF_I2CR = 0x0910, /*!< All I2C registers reset to default */ + TFA9896_BF_CFE = 0x0920, /*!< Enable CoolFlux */ + TFA9896_BF_AMPE = 0x0930, /*!< Enable Amplifier */ + TFA9896_BF_DCA = 0x0940, /*!< Enable DCDC Boost converter */ + TFA9896_BF_SBSL = 0x0950, /*!< Coolflux configured */ + TFA9896_BF_AMPC = 0x0960, /*!< Selection if Coolflux enables amplifier */ + TFA9896_BF_DCDIS = 0x0970, /*!< DCDC boost converter not connected */ + TFA9896_BF_PSDR = 0x0980, /*!< IDDQ amplifier test selection */ + TFA9896_BF_INTPAD = 0x09c1, /*!< INT pad (interrupt bump output) configuration */ + TFA9896_BF_IPLL = 0x09e0, /*!< PLL input reference clock selection */ + TFA9896_BF_DCTRIP = 0x0a04, /*!< Adaptive boost trip levels (effective only when boost_intel is set to 1) */ + TFA9896_BF_DCHOLD = 0x0a54, /*!< Hold time for DCDC booster (effective only when boost_intel is set to 1) */ + TFA9896_BF_MTPK = 0x0b07, /*!< KEY2 to access key2 protected registers (default for engineering) */ + TFA9896_BF_CVFDLY = 0x0c25, /*!< Fractional delay adjustment between current and voltage sense */ + TFA9896_BF_OPENMTP = 0x0ec0, /*!< Enable programming of the MTP memory */ + TFA9896_BF_TDMPRF = 0x1011, /*!< TDM usecase selection control */ + TFA9896_BF_TDMEN = 0x1030, /*!< TDM interface enable */ + TFA9896_BF_TDMCKINV = 0x1040, /*!< TDM clock inversion, receive on */ + TFA9896_BF_TDMFSLN = 0x1053, /*!< TDM FS length */ + TFA9896_BF_TDMFSPOL = 0x1090, /*!< TDM FS polarity (start frame) */ + TFA9896_BF_TDMSAMSZ = 0x10a4, /*!< TDM sample size for all TDM sinks and sources */ + TFA9896_BF_TDMSLOTS = 0x1103, /*!< TDM number of slots */ + TFA9896_BF_TDMSLLN = 0x1144, /*!< TDM slot length */ + TFA9896_BF_TDMBRMG = 0x1194, /*!< TDM bits remaining after the last slot */ + TFA9896_BF_TDMDDEL = 0x11e0, /*!< TDM data delay */ + TFA9896_BF_TDMDADJ = 0x11f0, /*!< TDM data adjustment */ + TFA9896_BF_TDMTXFRM = 0x1201, /*!< TDM TXDATA format */ + TFA9896_BF_TDMUUS0 = 0x1221, /*!< TDM TXDATA format unused slot SD0 */ + TFA9896_BF_TDMUUS1 = 0x1241, /*!< TDM TXDATA format unused slot SD1 */ + TFA9896_BF_TDMSI0EN = 0x1270, /*!< TDM sink0 enable */ + TFA9896_BF_TDMSI1EN = 0x1280, /*!< TDM sink1 enable */ + TFA9896_BF_TDMSI2EN = 0x1290, /*!< TDM sink2 enable */ + TFA9896_BF_TDMSO0EN = 0x12a0, /*!< TDM source0 enable */ + TFA9896_BF_TDMSO1EN = 0x12b0, /*!< TDM source1 enable */ + TFA9896_BF_TDMSO2EN = 0x12c0, /*!< TDM source2 enable */ + TFA9896_BF_TDMSI0IO = 0x12d0, /*!< TDM sink0 IO selection */ + TFA9896_BF_TDMSI1IO = 0x12e0, /*!< TDM sink1 IO selection */ + TFA9896_BF_TDMSI2IO = 0x12f0, /*!< TDM sink2 IO selection */ + TFA9896_BF_TDMSO0IO = 0x1300, /*!< TDM source0 IO selection */ + TFA9896_BF_TDMSO1IO = 0x1310, /*!< TDM source1 IO selection */ + TFA9896_BF_TDMSO2IO = 0x1320, /*!< TDM source2 IO selection */ + TFA9896_BF_TDMSI0SL = 0x1333, /*!< TDM sink0 slot position [GAIN IN] */ + TFA9896_BF_TDMSI1SL = 0x1373, /*!< TDM sink1 slot position [CH1 IN] */ + TFA9896_BF_TDMSI2SL = 0x13b3, /*!< TDM sink2 slot position [CH2 IN] */ + TFA9896_BF_TDMSO0SL = 0x1403, /*!< TDM source0 slot position [GAIN OUT] */ + TFA9896_BF_TDMSO1SL = 0x1443, /*!< TDM source1 slot position [Voltage Sense] */ + TFA9896_BF_TDMSO2SL = 0x1483, /*!< TDM source2 slot position [Current Sense] */ + TFA9896_BF_NBCK = 0x14c3, /*!< TDM NBCK bit clock ratio */ + TFA9896_BF_INTOVDDS = 0x2000, /*!< flag_por_int_out */ + TFA9896_BF_INTOPLLS = 0x2010, /*!< flag_pll_lock_int_out */ + TFA9896_BF_INTOOTDS = 0x2020, /*!< flag_otpok_int_out */ + TFA9896_BF_INTOOVDS = 0x2030, /*!< flag_ovpok_int_out */ + TFA9896_BF_INTOUVDS = 0x2040, /*!< flag_uvpok_int_out */ + TFA9896_BF_INTOOCDS = 0x2050, /*!< flag_ocp_alarm_int_out */ + TFA9896_BF_INTOCLKS = 0x2060, /*!< flag_clocks_stable_int_out */ + TFA9896_BF_INTOCLIPS = 0x2070, /*!< flag_clip_int_out */ + TFA9896_BF_INTOMTPB = 0x2080, /*!< mtp_busy_int_out */ + TFA9896_BF_INTONOCLK = 0x2090, /*!< flag_lost_clk_int_out */ + TFA9896_BF_INTOSPKS = 0x20a0, /*!< flag_cf_speakererror_int_out */ + TFA9896_BF_INTOACS = 0x20b0, /*!< flag_cold_started_int_out */ + TFA9896_BF_INTOSWS = 0x20c0, /*!< flag_engage_int_out */ + TFA9896_BF_INTOWDS = 0x20d0, /*!< flag_watchdog_reset_int_out */ + TFA9896_BF_INTOAMPS = 0x20e0, /*!< flag_enbl_amp_int_out */ + TFA9896_BF_INTOAREFS = 0x20f0, /*!< flag_enbl_ref_int_out */ + TFA9896_BF_INTOERR = 0x2200, /*!< flag_cfma_err_int_out */ + TFA9896_BF_INTOACK = 0x2210, /*!< flag_cfma_ack_int_out */ + TFA9896_BF_INTIVDDS = 0x2300, /*!< flag_por_int_in */ + TFA9896_BF_INTIPLLS = 0x2310, /*!< flag_pll_lock_int_in */ + TFA9896_BF_INTIOTDS = 0x2320, /*!< flag_otpok_int_in */ + TFA9896_BF_INTIOVDS = 0x2330, /*!< flag_ovpok_int_in */ + TFA9896_BF_INTIUVDS = 0x2340, /*!< flag_uvpok_int_in */ + TFA9896_BF_INTIOCDS = 0x2350, /*!< flag_ocp_alarm_int_in */ + TFA9896_BF_INTICLKS = 0x2360, /*!< flag_clocks_stable_int_in */ + TFA9896_BF_INTICLIPS = 0x2370, /*!< flag_clip_int_in */ + TFA9896_BF_INTIMTPB = 0x2380, /*!< mtp_busy_int_in */ + TFA9896_BF_INTINOCLK = 0x2390, /*!< flag_lost_clk_int_in */ + TFA9896_BF_INTISPKS = 0x23a0, /*!< flag_cf_speakererror_int_in */ + TFA9896_BF_INTIACS = 0x23b0, /*!< flag_cold_started_int_in */ + TFA9896_BF_INTISWS = 0x23c0, /*!< flag_engage_int_in */ + TFA9896_BF_INTIWDS = 0x23d0, /*!< flag_watchdog_reset_int_in */ + TFA9896_BF_INTIAMPS = 0x23e0, /*!< flag_enbl_amp_int_in */ + TFA9896_BF_INTIAREFS = 0x23f0, /*!< flag_enbl_ref_int_in */ + TFA9896_BF_INTIERR = 0x2500, /*!< flag_cfma_err_int_in */ + TFA9896_BF_INTIACK = 0x2510, /*!< flag_cfma_ack_int_in */ + TFA9896_BF_INTENVDDS = 0x2600, /*!< flag_por_int_enable */ + TFA9896_BF_INTENPLLS = 0x2610, /*!< flag_pll_lock_int_enable */ + TFA9896_BF_INTENOTDS = 0x2620, /*!< flag_otpok_int_enable */ + TFA9896_BF_INTENOVDS = 0x2630, /*!< flag_ovpok_int_enable */ + TFA9896_BF_INTENUVDS = 0x2640, /*!< flag_uvpok_int_enable */ + TFA9896_BF_INTENOCDS = 0x2650, /*!< flag_ocp_alarm_int_enable */ + TFA9896_BF_INTENCLKS = 0x2660, /*!< flag_clocks_stable_int_enable */ + TFA9896_BF_INTENCLIPS = 0x2670, /*!< flag_clip_int_enable */ + TFA9896_BF_INTENMTPB = 0x2680, /*!< mtp_busy_int_enable */ + TFA9896_BF_INTENNOCLK = 0x2690, /*!< flag_lost_clk_int_enable */ + TFA9896_BF_INTENSPKS = 0x26a0, /*!< flag_cf_speakererror_int_enable */ + TFA9896_BF_INTENACS = 0x26b0, /*!< flag_cold_started_int_enable */ + TFA9896_BF_INTENSWS = 0x26c0, /*!< flag_engage_int_enable */ + TFA9896_BF_INTENWDS = 0x26d0, /*!< flag_watchdog_reset_int_enable */ + TFA9896_BF_INTENAMPS = 0x26e0, /*!< flag_enbl_amp_int_enable */ + TFA9896_BF_INTENAREFS = 0x26f0, /*!< flag_enbl_ref_int_enable */ + TFA9896_BF_INTENERR = 0x2800, /*!< flag_cfma_err_int_enable */ + TFA9896_BF_INTENACK = 0x2810, /*!< flag_cfma_ack_int_enable */ + TFA9896_BF_INTPOLVDDS = 0x2900, /*!< flag_por_int_pol */ + TFA9896_BF_INTPOLPLLS = 0x2910, /*!< flag_pll_lock_int_pol */ + TFA9896_BF_INTPOLOTDS = 0x2920, /*!< flag_otpok_int_pol */ + TFA9896_BF_INTPOLOVDS = 0x2930, /*!< flag_ovpok_int_pol */ + TFA9896_BF_INTPOLUVDS = 0x2940, /*!< flag_uvpok_int_pol */ + TFA9896_BF_INTPOLOCDS = 0x2950, /*!< flag_ocp_alarm_int_pol */ + TFA9896_BF_INTPOLCLKS = 0x2960, /*!< flag_clocks_stable_int_pol */ + TFA9896_BF_INTPOLCLIPS = 0x2970, /*!< flag_clip_int_pol */ + TFA9896_BF_INTPOLMTPB = 0x2980, /*!< mtp_busy_int_pol */ + TFA9896_BF_INTPOLNOCLK = 0x2990, /*!< flag_lost_clk_int_pol */ + TFA9896_BF_INTPOLSPKS = 0x29a0, /*!< flag_cf_speakererror_int_pol */ + TFA9896_BF_INTPOLACS = 0x29b0, /*!< flag_cold_started_int_pol */ + TFA9896_BF_INTPOLSWS = 0x29c0, /*!< flag_engage_int_pol */ + TFA9896_BF_INTPOLWDS = 0x29d0, /*!< flag_watchdog_reset_int_pol */ + TFA9896_BF_INTPOLAMPS = 0x29e0, /*!< flag_enbl_amp_int_pol */ + TFA9896_BF_INTPOLAREFS = 0x29f0, /*!< flag_enbl_ref_int_pol */ + TFA9896_BF_INTPOLERR = 0x2b00, /*!< flag_cfma_err_int_pol */ + TFA9896_BF_INTPOLACK = 0x2b10, /*!< flag_cfma_ack_int_pol */ + TFA9896_BF_CLIP = 0x4900, /*!< Bypass clip control */ + TFA9896_BF_CIMTP = 0x62b0, /*!< Start copying data from I2C mtp registers to mtp */ + TFA9896_BF_RST = 0x7000, /*!< Reset CoolFlux DSP */ + TFA9896_BF_DMEM = 0x7011, /*!< Target memory for access */ + TFA9896_BF_AIF = 0x7030, /*!< Auto increment flag for memory-address */ + TFA9896_BF_CFINT = 0x7040, /*!< CF Interrupt - auto clear */ + TFA9896_BF_REQ = 0x7087, /*!< CF request for accessing the 8 channels */ + TFA9896_BF_MADD = 0x710f, /*!< Memory address */ + TFA9896_BF_MEMA = 0x720f, /*!< Activate memory access */ + TFA9896_BF_ERR = 0x7307, /*!< CF error flags */ + TFA9896_BF_ACK = 0x7387, /*!< CF acknowledgement of the requests channels */ + TFA9896_BF_MTPOTC = 0x8000, /*!< Calibration schedule selection */ + TFA9896_BF_MTPEX = 0x8010, /*!< Calibration of RON status bit */ +} TFA9896BfEnumList_t; +#define TFA9896_NAMETABLE static tfaBfName_t Tfa9896DatasheetNames[] = {\ + { 0x0, "VDDS"}, /* Power-on-reset flag (auto clear by reading) , */\ + { 0x10, "PLLS"}, /* PLL lock to programmed frequency , */\ + { 0x20, "OTDS"}, /* Over Temperature Protection alarm , */\ + { 0x30, "OVDS"}, /* Over Voltage Protection alarm , */\ + { 0x40, "UVDS"}, /* Under Voltage Protection alarm , */\ + { 0x50, "OCDS"}, /* Over Current Protection alarm , */\ + { 0x60, "CLKS"}, /* Clocks stable flag , */\ + { 0x70, "CLIPS"}, /* Amplifier clipping , */\ + { 0x80, "MTPB"}, /* MTP busy copying data to/from I2C registers , */\ + { 0x90, "NOCLK"}, /* lost clock detection (reference input clock) , */\ + { 0xa0, "SPKS"}, /* Speaker error , */\ + { 0xb0, "ACS"}, /* Cold Start required , */\ + { 0xc0, "SWS"}, /* Amplifier engage (Amp Switching) , */\ + { 0xd0, "WDS"}, /* watchdog reset (activates reset) , */\ + { 0xe0, "AMPS"}, /* Amplifier is enabled by manager , */\ + { 0xf0, "AREFS"}, /* References are enabled by manager , */\ + { 0x109, "BATS"}, /* Battery voltage from ADC readout , */\ + { 0x208, "TEMPS"}, /* Temperature readout from the temperature sensor ( C), */\ + { 0x30f, "REV"}, /* Device revision information , */\ + { 0x420, "RCV"}, /* Enable receiver mode , */\ + { 0x431, "CHS12"}, /* Channel Selection TDM input for Coolflux , */\ + { 0x450, "INPLVL"}, /* Input level selection attenuator ( , */\ + { 0x461, "CHSA"}, /* Input selection for amplifier , */\ + { 0x4c3, "AUDFS"}, /* Audio sample rate setting , */\ + { 0x501, "BSSCR"}, /* Batteery protection attack time , */\ + { 0x523, "BSST"}, /* Battery protection threshold level , */\ + { 0x561, "BSSRL"}, /* Battery protection maximum reduction , */\ + { 0x582, "BSSRR"}, /* Battery protection release time , */\ + { 0x5b1, "BSSHY"}, /* Battery Protection Hysteresis , */\ + { 0x5e0, "BSSR"}, /* Battery voltage value for read out (only) , */\ + { 0x5f0, "BSSBY"}, /* Bypass clipper battery protection , */\ + { 0x600, "DPSA"}, /* Enable dynamic powerstage activation (DPSA) , */\ + { 0x613, "ATTEN"}, /* Gain attenuation setting , */\ + { 0x650, "CFSM"}, /* Soft mute in CoolFlux , */\ + { 0x670, "BSSS"}, /* Battery sense steepness , */\ + { 0x687, "VOL"}, /* Coolflux volume control , */\ + { 0x702, "DCVO2"}, /* Second Boost Voltage , */\ + { 0x733, "DCMCC"}, /* Max boost coil current - step of 175 mA , */\ + { 0x772, "DCVO1"}, /* First Boost Voltage , */\ + { 0x7a0, "DCIE"}, /* Adaptive boost mode , */\ + { 0x7b0, "DCSR"}, /* Soft Rampup/down mode for DCDC controller , */\ + { 0x7c0, "DCPAVG"}, /* ctrl_peak2avg for analog part of DCDC , */\ + { 0x7d0, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x800, "TROS"}, /* Selection ambient temperature for speaker calibration , */\ + { 0x818, "EXTTS"}, /* External temperature for speaker calibration (C) , */\ + { 0x900, "PWDN"}, /* powerdown selection , */\ + { 0x910, "I2CR"}, /* All I2C registers reset to default , */\ + { 0x920, "CFE"}, /* Enable CoolFlux , */\ + { 0x930, "AMPE"}, /* Enable Amplifier , */\ + { 0x940, "DCA"}, /* Enable DCDC Boost converter , */\ + { 0x950, "SBSL"}, /* Coolflux configured , */\ + { 0x960, "AMPC"}, /* Selection if Coolflux enables amplifier , */\ + { 0x970, "DCDIS"}, /* DCDC boost converter not connected , */\ + { 0x980, "PSDR"}, /* IDDQ amplifier test selection , */\ + { 0x9c1, "INTPAD"}, /* INT pad (interrupt bump output) configuration , */\ + { 0x9e0, "IPLL"}, /* PLL input reference clock selection , */\ + { 0xa04, "DCTRIP"}, /* Adaptive boost trip levels (effective only when boost_intel is set to 1), */\ + { 0xa54, "DCHOLD"}, /* Hold time for DCDC booster (effective only when boost_intel is set to 1), */\ + { 0xb07, "MTPK"}, /* KEY2 to access key2 protected registers (default for engineering), */\ + { 0xc25, "CVFDLY"}, /* Fractional delay adjustment between current and voltage sense, */\ + { 0xec0, "OPENMTP"}, /* Enable programming of the MTP memory , */\ + { 0x1011, "TDMPRF"}, /* TDM usecase selection control , */\ + { 0x1030, "TDMEN"}, /* TDM interface enable , */\ + { 0x1040, "TDMCKINV"}, /* TDM clock inversion, receive on , */\ + { 0x1053, "TDMFSLN"}, /* TDM FS length , */\ + { 0x1090, "TDMFSPOL"}, /* TDM FS polarity (start frame) , */\ + { 0x10a4, "TDMSAMSZ"}, /* TDM sample size for all TDM sinks and sources , */\ + { 0x1103, "TDMSLOTS"}, /* TDM number of slots , */\ + { 0x1144, "TDMSLLN"}, /* TDM slot length , */\ + { 0x1194, "TDMBRMG"}, /* TDM bits remaining after the last slot , */\ + { 0x11e0, "TDMDDEL"}, /* TDM data delay , */\ + { 0x11f0, "TDMDADJ"}, /* TDM data adjustment , */\ + { 0x1201, "TDMTXFRM"}, /* TDM TXDATA format , */\ + { 0x1221, "TDMUUS0"}, /* TDM TXDATA format unused slot SD0 , */\ + { 0x1241, "TDMUUS1"}, /* TDM TXDATA format unused slot SD1 , */\ + { 0x1270, "TDMSI0EN"}, /* TDM sink0 enable , */\ + { 0x1280, "TDMSI1EN"}, /* TDM sink1 enable , */\ + { 0x1290, "TDMSI2EN"}, /* TDM sink2 enable , */\ + { 0x12a0, "TDMSO0EN"}, /* TDM source0 enable , */\ + { 0x12b0, "TDMSO1EN"}, /* TDM source1 enable , */\ + { 0x12c0, "TDMSO2EN"}, /* TDM source2 enable , */\ + { 0x12d0, "TDMSI0IO"}, /* TDM sink0 IO selection , */\ + { 0x12e0, "TDMSI1IO"}, /* TDM sink1 IO selection , */\ + { 0x12f0, "TDMSI2IO"}, /* TDM sink2 IO selection , */\ + { 0x1300, "TDMSO0IO"}, /* TDM source0 IO selection , */\ + { 0x1310, "TDMSO1IO"}, /* TDM source1 IO selection , */\ + { 0x1320, "TDMSO2IO"}, /* TDM source2 IO selection , */\ + { 0x1333, "TDMSI0SL"}, /* TDM sink0 slot position [GAIN IN] , */\ + { 0x1373, "TDMSI1SL"}, /* TDM sink1 slot position [CH1 IN] , */\ + { 0x13b3, "TDMSI2SL"}, /* TDM sink2 slot position [CH2 IN] , */\ + { 0x1403, "TDMSO0SL"}, /* TDM source0 slot position [GAIN OUT] , */\ + { 0x1443, "TDMSO1SL"}, /* TDM source1 slot position [Voltage Sense] , */\ + { 0x1483, "TDMSO2SL"}, /* TDM source2 slot position [Current Sense] , */\ + { 0x14c3, "NBCK"}, /* TDM NBCK bit clock ratio , */\ + { 0x2000, "INTOVDDS"}, /* flag_por_int_out , */\ + { 0x2010, "INTOPLLS"}, /* flag_pll_lock_int_out , */\ + { 0x2020, "INTOOTDS"}, /* flag_otpok_int_out , */\ + { 0x2030, "INTOOVDS"}, /* flag_ovpok_int_out , */\ + { 0x2040, "INTOUVDS"}, /* flag_uvpok_int_out , */\ + { 0x2050, "INTOOCDS"}, /* flag_ocp_alarm_int_out , */\ + { 0x2060, "INTOCLKS"}, /* flag_clocks_stable_int_out , */\ + { 0x2070, "INTOCLIPS"}, /* flag_clip_int_out , */\ + { 0x2080, "INTOMTPB"}, /* mtp_busy_int_out , */\ + { 0x2090, "INTONOCLK"}, /* flag_lost_clk_int_out , */\ + { 0x20a0, "INTOSPKS"}, /* flag_cf_speakererror_int_out , */\ + { 0x20b0, "INTOACS"}, /* flag_cold_started_int_out , */\ + { 0x20c0, "INTOSWS"}, /* flag_engage_int_out , */\ + { 0x20d0, "INTOWDS"}, /* flag_watchdog_reset_int_out , */\ + { 0x20e0, "INTOAMPS"}, /* flag_enbl_amp_int_out , */\ + { 0x20f0, "INTOAREFS"}, /* flag_enbl_ref_int_out , */\ + { 0x2200, "INTOERR"}, /* flag_cfma_err_int_out , */\ + { 0x2210, "INTOACK"}, /* flag_cfma_ack_int_out , */\ + { 0x2300, "INTIVDDS"}, /* flag_por_int_in , */\ + { 0x2310, "INTIPLLS"}, /* flag_pll_lock_int_in , */\ + { 0x2320, "INTIOTDS"}, /* flag_otpok_int_in , */\ + { 0x2330, "INTIOVDS"}, /* flag_ovpok_int_in , */\ + { 0x2340, "INTIUVDS"}, /* flag_uvpok_int_in , */\ + { 0x2350, "INTIOCDS"}, /* flag_ocp_alarm_int_in , */\ + { 0x2360, "INTICLKS"}, /* flag_clocks_stable_int_in , */\ + { 0x2370, "INTICLIPS"}, /* flag_clip_int_in , */\ + { 0x2380, "INTIMTPB"}, /* mtp_busy_int_in , */\ + { 0x2390, "INTINOCLK"}, /* flag_lost_clk_int_in , */\ + { 0x23a0, "INTISPKS"}, /* flag_cf_speakererror_int_in , */\ + { 0x23b0, "INTIACS"}, /* flag_cold_started_int_in , */\ + { 0x23c0, "INTISWS"}, /* flag_engage_int_in , */\ + { 0x23d0, "INTIWDS"}, /* flag_watchdog_reset_int_in , */\ + { 0x23e0, "INTIAMPS"}, /* flag_enbl_amp_int_in , */\ + { 0x23f0, "INTIAREFS"}, /* flag_enbl_ref_int_in , */\ + { 0x2500, "INTIERR"}, /* flag_cfma_err_int_in , */\ + { 0x2510, "INTIACK"}, /* flag_cfma_ack_int_in , */\ + { 0x2600, "INTENVDDS"}, /* flag_por_int_enable , */\ + { 0x2610, "INTENPLLS"}, /* flag_pll_lock_int_enable , */\ + { 0x2620, "INTENOTDS"}, /* flag_otpok_int_enable , */\ + { 0x2630, "INTENOVDS"}, /* flag_ovpok_int_enable , */\ + { 0x2640, "INTENUVDS"}, /* flag_uvpok_int_enable , */\ + { 0x2650, "INTENOCDS"}, /* flag_ocp_alarm_int_enable , */\ + { 0x2660, "INTENCLKS"}, /* flag_clocks_stable_int_enable , */\ + { 0x2670, "INTENCLIPS"}, /* flag_clip_int_enable , */\ + { 0x2680, "INTENMTPB"}, /* mtp_busy_int_enable , */\ + { 0x2690, "INTENNOCLK"}, /* flag_lost_clk_int_enable , */\ + { 0x26a0, "INTENSPKS"}, /* flag_cf_speakererror_int_enable , */\ + { 0x26b0, "INTENACS"}, /* flag_cold_started_int_enable , */\ + { 0x26c0, "INTENSWS"}, /* flag_engage_int_enable , */\ + { 0x26d0, "INTENWDS"}, /* flag_watchdog_reset_int_enable , */\ + { 0x26e0, "INTENAMPS"}, /* flag_enbl_amp_int_enable , */\ + { 0x26f0, "INTENAREFS"}, /* flag_enbl_ref_int_enable , */\ + { 0x2800, "INTENERR"}, /* flag_cfma_err_int_enable , */\ + { 0x2810, "INTENACK"}, /* flag_cfma_ack_int_enable , */\ + { 0x2900, "INTPOLVDDS"}, /* flag_por_int_pol , */\ + { 0x2910, "INTPOLPLLS"}, /* flag_pll_lock_int_pol , */\ + { 0x2920, "INTPOLOTDS"}, /* flag_otpok_int_pol , */\ + { 0x2930, "INTPOLOVDS"}, /* flag_ovpok_int_pol , */\ + { 0x2940, "INTPOLUVDS"}, /* flag_uvpok_int_pol , */\ + { 0x2950, "INTPOLOCDS"}, /* flag_ocp_alarm_int_pol , */\ + { 0x2960, "INTPOLCLKS"}, /* flag_clocks_stable_int_pol , */\ + { 0x2970, "INTPOLCLIPS"}, /* flag_clip_int_pol , */\ + { 0x2980, "INTPOLMTPB"}, /* mtp_busy_int_pol , */\ + { 0x2990, "INTPOLNOCLK"}, /* flag_lost_clk_int_pol , */\ + { 0x29a0, "INTPOLSPKS"}, /* flag_cf_speakererror_int_pol , */\ + { 0x29b0, "INTPOLACS"}, /* flag_cold_started_int_pol , */\ + { 0x29c0, "INTPOLSWS"}, /* flag_engage_int_pol , */\ + { 0x29d0, "INTPOLWDS"}, /* flag_watchdog_reset_int_pol , */\ + { 0x29e0, "INTPOLAMPS"}, /* flag_enbl_amp_int_pol , */\ + { 0x29f0, "INTPOLAREFS"}, /* flag_enbl_ref_int_pol , */\ + { 0x2b00, "INTPOLERR"}, /* flag_cfma_err_int_pol , */\ + { 0x2b10, "INTPOLACK"}, /* flag_cfma_ack_int_pol , */\ + { 0x4900, "CLIP"}, /* Bypass clip control , */\ + { 0x62b0, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0x7000, "RST"}, /* Reset CoolFlux DSP , */\ + { 0x7011, "DMEM"}, /* Target memory for access , */\ + { 0x7030, "AIF"}, /* Auto increment flag for memory-address , */\ + { 0x7040, "CFINT"}, /* CF Interrupt - auto clear , */\ + { 0x7087, "REQ"}, /* CF request for accessing the 8 channels , */\ + { 0x710f, "MADD"}, /* Memory address , */\ + { 0x720f, "MEMA"}, /* Activate memory access , */\ + { 0x7307, "ERR"}, /* CF error flags , */\ + { 0x7387, "ACK"}, /* CF acknowledgement of the requests channels , */\ + { 0x8000, "MTPOTC"}, /* Calibration schedule selection , */\ + { 0x8010, "MTPEX"}, /* Calibration of RON status bit , */\ + { 0x8045, "SWPROFIL" },\ + { 0x80a5, "SWVSTEP" },\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9896_BITNAMETABLE static tfaBfName_t Tfa9896BitNames[] = {\ + { 0x0, "flag_por"}, /* Power-on-reset flag (auto clear by reading) , */\ + { 0x10, "flag_pll_lock"}, /* PLL lock to programmed frequency , */\ + { 0x20, "flag_otpok"}, /* Over Temperature Protection alarm , */\ + { 0x30, "flag_ovpok"}, /* Over Voltage Protection alarm , */\ + { 0x40, "flag_uvpok"}, /* Under Voltage Protection alarm , */\ + { 0x50, "flag_ocp_alarm"}, /* Over Current Protection alarm , */\ + { 0x60, "flag_clocks_stable"}, /* Clocks stable flag , */\ + { 0x70, "flag_clip"}, /* Amplifier clipping , */\ + { 0x80, "mtp_busy"}, /* MTP busy copying data to/from I2C registers , */\ + { 0x90, "flag_lost_clk"}, /* lost clock detection (reference input clock) , */\ + { 0xa0, "flag_cf_speakererror"}, /* Speaker error , */\ + { 0xb0, "flag_cold_started"}, /* Cold Start required , */\ + { 0xc0, "flag_engage"}, /* Amplifier engage (Amp Switching) , */\ + { 0xd0, "flag_watchdog_reset"}, /* watchdog reset (activates reset) , */\ + { 0xe0, "flag_enbl_amp"}, /* Amplifier is enabled by manager , */\ + { 0xf0, "flag_enbl_ref"}, /* References are enabled by manager , */\ + { 0x109, "bat_adc"}, /* Battery voltage from ADC readout , */\ + { 0x208, "temp_adc"}, /* Temperature readout from the temperature sensor ( C), */\ + { 0x30f, "device_rev"}, /* Device revision information , */\ + { 0x420, "ctrl_rcv"}, /* Enable receiver mode , */\ + { 0x431, "chan_sel"}, /* Channel Selection TDM input for Coolflux , */\ + { 0x450, "input_level"}, /* Input level selection attenuator ( , */\ + { 0x461, "vamp_sel"}, /* Input selection for amplifier , */\ + { 0x4c3, "audio_fs"}, /* Audio sample rate setting , */\ + { 0x501, "vbat_prot_attacktime"}, /* Batteery protection attack time , */\ + { 0x523, "vbat_prot_thlevel"}, /* Battery protection threshold level , */\ + { 0x561, "vbat_prot_max_reduct"}, /* Battery protection maximum reduction , */\ + { 0x582, "vbat_prot_release_t"}, /* Battery protection release time , */\ + { 0x5b1, "vbat_prot_hysterese"}, /* Battery Protection Hysteresis , */\ + { 0x5d0, "reset_min_vbat"}, /* Battery supply safeguard clipper reset ( if CF_DSP is bypassed), */\ + { 0x5e0, "sel_vbat"}, /* Battery voltage value for read out (only) , */\ + { 0x5f0, "bypass_clipper"}, /* Bypass clipper battery protection , */\ + { 0x600, "dpsa"}, /* Enable dynamic powerstage activation (DPSA) , */\ + { 0x613, "ctrl_att"}, /* Gain attenuation setting , */\ + { 0x650, "cf_mute"}, /* Soft mute in CoolFlux , */\ + { 0x670, "batsense_steepness"}, /* Battery sense steepness , */\ + { 0x687, "vol"}, /* Coolflux volume control , */\ + { 0x702, "scnd_boost_voltage"}, /* Second Boost Voltage , */\ + { 0x733, "boost_cur"}, /* Max boost coil current - step of 175 mA , */\ + { 0x772, "frst_boost_voltage"}, /* First Boost Voltage , */\ + { 0x7a0, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x7b0, "boost_speed"}, /* Soft Rampup/down mode for DCDC controller , */\ + { 0x7c0, "boost_peak2avg"}, /* ctrl_peak2avg for analog part of DCDC , */\ + { 0x7d0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7e0, "ignore_flag_voutcomp86"}, /* Ignore flag_voutcomp86 (flag from analog) , */\ + { 0x800, "ext_temp_sel"}, /* Selection ambient temperature for speaker calibration , */\ + { 0x818, "ext_temp"}, /* External temperature for speaker calibration (C) , */\ + { 0x900, "powerdown"}, /* powerdown selection , */\ + { 0x910, "reset"}, /* All I2C registers reset to default , */\ + { 0x920, "enbl_coolflux"}, /* Enable CoolFlux , */\ + { 0x930, "enbl_amplifier"}, /* Enable Amplifier , */\ + { 0x940, "enbl_boost"}, /* Enable DCDC Boost converter , */\ + { 0x950, "coolflux_configured"}, /* Coolflux configured , */\ + { 0x960, "sel_enbl_amplifier"}, /* Selection if Coolflux enables amplifier , */\ + { 0x970, "dcdcoff_mode"}, /* DCDC boost converter not connected , */\ + { 0x980, "iddqtest"}, /* IDDQ amplifier test selection , */\ + { 0x9c1, "int_pad_io"}, /* INT pad (interrupt bump output) configuration , */\ + { 0x9e0, "sel_fs_bck"}, /* PLL input reference clock selection , */\ + { 0x9f0, "sel_scl_cf_clock"}, /* Coolflux sub-system clock selection , */\ + { 0xa04, "boost_trip_lvl"}, /* Adaptive boost trip levels (effective only when boost_intel is set to 1), */\ + { 0xa54, "boost_hold_time"}, /* Hold time for DCDC booster (effective only when boost_intel is set to 1), */\ + { 0xaa1, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0xb07, "mtpkey2"}, /* KEY2 to access key2 protected registers (default for engineering), */\ + { 0xc00, "enbl_volt_sense"}, /* Voltage sense enabling control bit , */\ + { 0xc10, "vsense_pwm_sel"}, /* Voltage sense source selection , */\ + { 0xc25, "vi_frac_delay"}, /* Fractional delay adjustment between current and voltage sense, */\ + { 0xc80, "sel_voltsense_out"}, /* TDM output data selection for AEC , */\ + { 0xc90, "vsense_bypass_avg"}, /* Voltage sense average block bypass , */\ + { 0xd05, "cf_frac_delay"}, /* Fractional delay adjustment between current and voltage sense by firmware, */\ + { 0xe00, "bypass_dcdc_curr_prot"}, /* Control to switch off dcdc current reduction with bat protection, */\ + { 0xe10, "bypass_ocp"}, /* Bypass OCP (digital IP block) , */\ + { 0xe20, "ocptest"}, /* ocptest (analog IP block) enable , */\ + { 0xe80, "disable_clock_sh_prot"}, /* Disable clock_sh protection , */\ + { 0xe92, "reserve_reg_15_09"}, /* Spare control bits for future usage , */\ + { 0xec0, "unprotect_mtp"}, /* Enable programming of the MTP memory , */\ + { 0xed2, "reserve_reg_15_13"}, /* Spare control bits for future usage , */\ + { 0xf00, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode forcing each 50us a pwm pulse , */\ + { 0xf11, "dcdc_ctrl_maxzercnt"}, /* DCDC number of zero current flags required to go to pfm mode, */\ + { 0xf36, "dcdc_vbat_delta_detect"}, /* DCDC threshold required on a delta Vbat (in PFM mode) switching to PWM mode, */\ + { 0xfa0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x1011, "tdm_usecase"}, /* TDM usecase selection control , */\ + { 0x1030, "tdm_enable"}, /* TDM interface enable , */\ + { 0x1040, "tdm_clk_inversion"}, /* TDM clock inversion, receive on , */\ + { 0x1053, "tdm_fs_ws_length"}, /* TDM FS length , */\ + { 0x1090, "tdm_fs_ws_polarity"}, /* TDM FS polarity (start frame) , */\ + { 0x10a4, "tdm_sample_size"}, /* TDM sample size for all TDM sinks and sources , */\ + { 0x1103, "tdm_nb_of_slots"}, /* TDM number of slots , */\ + { 0x1144, "tdm_slot_length"}, /* TDM slot length , */\ + { 0x1194, "tdm_bits_remaining"}, /* TDM bits remaining after the last slot , */\ + { 0x11e0, "tdm_data_delay"}, /* TDM data delay , */\ + { 0x11f0, "tdm_data_adjustment"}, /* TDM data adjustment , */\ + { 0x1201, "tdm_txdata_format"}, /* TDM TXDATA format , */\ + { 0x1221, "tdm_txdata_format_unused_slot_sd0"}, /* TDM TXDATA format unused slot SD0 , */\ + { 0x1241, "tdm_txdata_format_unused_slot_sd1"}, /* TDM TXDATA format unused slot SD1 , */\ + { 0x1270, "tdm_sink0_enable"}, /* TDM sink0 enable , */\ + { 0x1280, "tdm_sink1_enable"}, /* TDM sink1 enable , */\ + { 0x1290, "tdm_sink2_enable"}, /* TDM sink2 enable , */\ + { 0x12a0, "tdm_source0_enable"}, /* TDM source0 enable , */\ + { 0x12b0, "tdm_source1_enable"}, /* TDM source1 enable , */\ + { 0x12c0, "tdm_source2_enable"}, /* TDM source2 enable , */\ + { 0x12d0, "tdm_sink0_io"}, /* TDM sink0 IO selection , */\ + { 0x12e0, "tdm_sink1_io"}, /* TDM sink1 IO selection , */\ + { 0x12f0, "tdm_sink2_io"}, /* TDM sink2 IO selection , */\ + { 0x1300, "tdm_source0_io"}, /* TDM source0 IO selection , */\ + { 0x1310, "tdm_source1_io"}, /* TDM source1 IO selection , */\ + { 0x1320, "tdm_source2_io"}, /* TDM source2 IO selection , */\ + { 0x1333, "tdm_sink0_slot"}, /* TDM sink0 slot position [GAIN IN] , */\ + { 0x1373, "tdm_sink1_slot"}, /* TDM sink1 slot position [CH1 IN] , */\ + { 0x13b3, "tdm_sink2_slot"}, /* TDM sink2 slot position [CH2 IN] , */\ + { 0x1403, "tdm_source0_slot"}, /* TDM source0 slot position [GAIN OUT] , */\ + { 0x1443, "tdm_source1_slot"}, /* TDM source1 slot position [Voltage Sense] , */\ + { 0x1483, "tdm_source2_slot"}, /* TDM source2 slot position [Current Sense] , */\ + { 0x14c3, "tdm_nbck"}, /* TDM NBCK bit clock ratio , */\ + { 0x1500, "flag_tdm_lut_error"}, /* TDM LUT error flag , */\ + { 0x1512, "flag_tdm_status"}, /* TDM interface status bits , */\ + { 0x1540, "flag_tdm_error"}, /* TDM interface error indicator , */\ + { 0x1551, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x2000, "flag_por_int_out"}, /* flag_por_int_out , */\ + { 0x2010, "flag_pll_lock_int_out"}, /* flag_pll_lock_int_out , */\ + { 0x2020, "flag_otpok_int_out"}, /* flag_otpok_int_out , */\ + { 0x2030, "flag_ovpok_int_out"}, /* flag_ovpok_int_out , */\ + { 0x2040, "flag_uvpok_int_out"}, /* flag_uvpok_int_out , */\ + { 0x2050, "flag_ocp_alarm_int_out"}, /* flag_ocp_alarm_int_out , */\ + { 0x2060, "flag_clocks_stable_int_out"}, /* flag_clocks_stable_int_out , */\ + { 0x2070, "flag_clip_int_out"}, /* flag_clip_int_out , */\ + { 0x2080, "mtp_busy_int_out"}, /* mtp_busy_int_out , */\ + { 0x2090, "flag_lost_clk_int_out"}, /* flag_lost_clk_int_out , */\ + { 0x20a0, "flag_cf_speakererror_int_out"}, /* flag_cf_speakererror_int_out , */\ + { 0x20b0, "flag_cold_started_int_out"}, /* flag_cold_started_int_out , */\ + { 0x20c0, "flag_engage_int_out"}, /* flag_engage_int_out , */\ + { 0x20d0, "flag_watchdog_reset_int_out"}, /* flag_watchdog_reset_int_out , */\ + { 0x20e0, "flag_enbl_amp_int_out"}, /* flag_enbl_amp_int_out , */\ + { 0x20f0, "flag_enbl_ref_int_out"}, /* flag_enbl_ref_int_out , */\ + { 0x2100, "flag_voutcomp_int_out"}, /* flag_voutcomp_int_out , */\ + { 0x2110, "flag_voutcomp93_int_out"}, /* flag_voutcomp93_int_out , */\ + { 0x2120, "flag_voutcomp86_int_out"}, /* flag_voutcomp86_int_out , */\ + { 0x2130, "flag_hiz_int_out"}, /* flag_hiz_int_out , */\ + { 0x2140, "flag_ocpokbst_int_out"}, /* flag_ocpokbst_int_out , */\ + { 0x2150, "flag_peakcur_int_out"}, /* flag_peakcur_int_out , */\ + { 0x2160, "flag_ocpokap_int_out"}, /* flag_ocpokap_int_out , */\ + { 0x2170, "flag_ocpokan_int_out"}, /* flag_ocpokan_int_out , */\ + { 0x2180, "flag_ocpokbp_int_out"}, /* flag_ocpokbp_int_out , */\ + { 0x2190, "flag_ocpokbn_int_out"}, /* flag_ocpokbn_int_out , */\ + { 0x21a0, "flag_adc10_ready_int_out"}, /* flag_adc10_ready_int_out , */\ + { 0x21b0, "flag_clipa_high_int_out"}, /* flag_clipa_high_int_out , */\ + { 0x21c0, "flag_clipa_low_int_out"}, /* flag_clipa_low_int_out , */\ + { 0x21d0, "flag_clipb_high_int_out"}, /* flag_clipb_high_int_out , */\ + { 0x21e0, "flag_clipb_low_int_out"}, /* flag_clipb_low_int_out , */\ + { 0x21f0, "flag_tdm_error_int_out"}, /* flag_tdm_error_int_out , */\ + { 0x2200, "flag_cfma_err_int_out"}, /* flag_cfma_err_int_out , */\ + { 0x2210, "flag_cfma_ack_int_out"}, /* flag_cfma_ack_int_out , */\ + { 0x2300, "flag_por_int_in"}, /* flag_por_int_in , */\ + { 0x2310, "flag_pll_lock_int_in"}, /* flag_pll_lock_int_in , */\ + { 0x2320, "flag_otpok_int_in"}, /* flag_otpok_int_in , */\ + { 0x2330, "flag_ovpok_int_in"}, /* flag_ovpok_int_in , */\ + { 0x2340, "flag_uvpok_int_in"}, /* flag_uvpok_int_in , */\ + { 0x2350, "flag_ocp_alarm_int_in"}, /* flag_ocp_alarm_int_in , */\ + { 0x2360, "flag_clocks_stable_int_in"}, /* flag_clocks_stable_int_in , */\ + { 0x2370, "flag_clip_int_in"}, /* flag_clip_int_in , */\ + { 0x2380, "mtp_busy_int_in"}, /* mtp_busy_int_in , */\ + { 0x2390, "flag_lost_clk_int_in"}, /* flag_lost_clk_int_in , */\ + { 0x23a0, "flag_cf_speakererror_int_in"}, /* flag_cf_speakererror_int_in , */\ + { 0x23b0, "flag_cold_started_int_in"}, /* flag_cold_started_int_in , */\ + { 0x23c0, "flag_engage_int_in"}, /* flag_engage_int_in , */\ + { 0x23d0, "flag_watchdog_reset_int_in"}, /* flag_watchdog_reset_int_in , */\ + { 0x23e0, "flag_enbl_amp_int_in"}, /* flag_enbl_amp_int_in , */\ + { 0x23f0, "flag_enbl_ref_int_in"}, /* flag_enbl_ref_int_in , */\ + { 0x2400, "flag_voutcomp_int_in"}, /* flag_voutcomp_int_in , */\ + { 0x2410, "flag_voutcomp93_int_in"}, /* flag_voutcomp93_int_in , */\ + { 0x2420, "flag_voutcomp86_int_in"}, /* flag_voutcomp86_int_in , */\ + { 0x2430, "flag_hiz_int_in"}, /* flag_hiz_int_in , */\ + { 0x2440, "flag_ocpokbst_int_in"}, /* flag_ocpokbst_int_in , */\ + { 0x2450, "flag_peakcur_int_in"}, /* flag_peakcur_int_in , */\ + { 0x2460, "flag_ocpokap_int_in"}, /* flag_ocpokap_int_in , */\ + { 0x2470, "flag_ocpokan_int_in"}, /* flag_ocpokan_int_in , */\ + { 0x2480, "flag_ocpokbp_int_in"}, /* flag_ocpokbp_int_in , */\ + { 0x2490, "flag_ocpokbn_int_in"}, /* flag_ocpokbn_int_in , */\ + { 0x24a0, "flag_adc10_ready_int_in"}, /* flag_adc10_ready_int_in , */\ + { 0x24b0, "flag_clipa_high_int_in"}, /* flag_clipa_high_int_in , */\ + { 0x24c0, "flag_clipa_low_int_in"}, /* flag_clipa_low_int_in , */\ + { 0x24d0, "flag_clipb_high_int_in"}, /* flag_clipb_high_int_in , */\ + { 0x24e0, "flag_clipb_low_int_in"}, /* flag_clipb_low_int_in , */\ + { 0x24f0, "flag_tdm_error_int_in"}, /* flag_tdm_error_int_in , */\ + { 0x2500, "flag_cfma_err_int_in"}, /* flag_cfma_err_int_in , */\ + { 0x2510, "flag_cfma_ack_int_in"}, /* flag_cfma_ack_int_in , */\ + { 0x2600, "flag_por_int_enable"}, /* flag_por_int_enable , */\ + { 0x2610, "flag_pll_lock_int_enable"}, /* flag_pll_lock_int_enable , */\ + { 0x2620, "flag_otpok_int_enable"}, /* flag_otpok_int_enable , */\ + { 0x2630, "flag_ovpok_int_enable"}, /* flag_ovpok_int_enable , */\ + { 0x2640, "flag_uvpok_int_enable"}, /* flag_uvpok_int_enable , */\ + { 0x2650, "flag_ocp_alarm_int_enable"}, /* flag_ocp_alarm_int_enable , */\ + { 0x2660, "flag_clocks_stable_int_enable"}, /* flag_clocks_stable_int_enable , */\ + { 0x2670, "flag_clip_int_enable"}, /* flag_clip_int_enable , */\ + { 0x2680, "mtp_busy_int_enable"}, /* mtp_busy_int_enable , */\ + { 0x2690, "flag_lost_clk_int_enable"}, /* flag_lost_clk_int_enable , */\ + { 0x26a0, "flag_cf_speakererror_int_enable"}, /* flag_cf_speakererror_int_enable , */\ + { 0x26b0, "flag_cold_started_int_enable"}, /* flag_cold_started_int_enable , */\ + { 0x26c0, "flag_engage_int_enable"}, /* flag_engage_int_enable , */\ + { 0x26d0, "flag_watchdog_reset_int_enable"}, /* flag_watchdog_reset_int_enable , */\ + { 0x26e0, "flag_enbl_amp_int_enable"}, /* flag_enbl_amp_int_enable , */\ + { 0x26f0, "flag_enbl_ref_int_enable"}, /* flag_enbl_ref_int_enable , */\ + { 0x2700, "flag_voutcomp_int_enable"}, /* flag_voutcomp_int_enable , */\ + { 0x2710, "flag_voutcomp93_int_enable"}, /* flag_voutcomp93_int_enable , */\ + { 0x2720, "flag_voutcomp86_int_enable"}, /* flag_voutcomp86_int_enable , */\ + { 0x2730, "flag_hiz_int_enable"}, /* flag_hiz_int_enable , */\ + { 0x2740, "flag_ocpokbst_int_enable"}, /* flag_ocpokbst_int_enable , */\ + { 0x2750, "flag_peakcur_int_enable"}, /* flag_peakcur_int_enable , */\ + { 0x2760, "flag_ocpokap_int_enable"}, /* flag_ocpokap_int_enable , */\ + { 0x2770, "flag_ocpokan_int_enable"}, /* flag_ocpokan_int_enable , */\ + { 0x2780, "flag_ocpokbp_int_enable"}, /* flag_ocpokbp_int_enable , */\ + { 0x2790, "flag_ocpokbn_int_enable"}, /* flag_ocpokbn_int_enable , */\ + { 0x27a0, "flag_adc10_ready_int_enable"}, /* flag_adc10_ready_int_enable , */\ + { 0x27b0, "flag_clipa_high_int_enable"}, /* flag_clipa_high_int_enable , */\ + { 0x27c0, "flag_clipa_low_int_enable"}, /* flag_clipa_low_int_enable , */\ + { 0x27d0, "flag_clipb_high_int_enable"}, /* flag_clipb_high_int_enable , */\ + { 0x27e0, "flag_clipb_low_int_enable"}, /* flag_clipb_low_int_enable , */\ + { 0x27f0, "flag_tdm_error_int_enable"}, /* flag_tdm_error_int_enable , */\ + { 0x2800, "flag_cfma_err_int_enable"}, /* flag_cfma_err_int_enable , */\ + { 0x2810, "flag_cfma_ack_int_enable"}, /* flag_cfma_ack_int_enable , */\ + { 0x2900, "flag_por_int_pol"}, /* flag_por_int_pol , */\ + { 0x2910, "flag_pll_lock_int_pol"}, /* flag_pll_lock_int_pol , */\ + { 0x2920, "flag_otpok_int_pol"}, /* flag_otpok_int_pol , */\ + { 0x2930, "flag_ovpok_int_pol"}, /* flag_ovpok_int_pol , */\ + { 0x2940, "flag_uvpok_int_pol"}, /* flag_uvpok_int_pol , */\ + { 0x2950, "flag_ocp_alarm_int_pol"}, /* flag_ocp_alarm_int_pol , */\ + { 0x2960, "flag_clocks_stable_int_pol"}, /* flag_clocks_stable_int_pol , */\ + { 0x2970, "flag_clip_int_pol"}, /* flag_clip_int_pol , */\ + { 0x2980, "mtp_busy_int_pol"}, /* mtp_busy_int_pol , */\ + { 0x2990, "flag_lost_clk_int_pol"}, /* flag_lost_clk_int_pol , */\ + { 0x29a0, "flag_cf_speakererror_int_pol"}, /* flag_cf_speakererror_int_pol , */\ + { 0x29b0, "flag_cold_started_int_pol"}, /* flag_cold_started_int_pol , */\ + { 0x29c0, "flag_engage_int_pol"}, /* flag_engage_int_pol , */\ + { 0x29d0, "flag_watchdog_reset_int_pol"}, /* flag_watchdog_reset_int_pol , */\ + { 0x29e0, "flag_enbl_amp_int_pol"}, /* flag_enbl_amp_int_pol , */\ + { 0x29f0, "flag_enbl_ref_int_pol"}, /* flag_enbl_ref_int_pol , */\ + { 0x2a00, "flag_voutcomp_int_pol"}, /* flag_voutcomp_int_pol , */\ + { 0x2a10, "flag_voutcomp93_int_pol"}, /* flag_voutcomp93_int_pol , */\ + { 0x2a20, "flag_voutcomp86_int_pol"}, /* flag_voutcomp86_int_pol , */\ + { 0x2a30, "flag_hiz_int_pol"}, /* flag_hiz_int_pol , */\ + { 0x2a40, "flag_ocpokbst_int_pol"}, /* flag_ocpokbst_int_pol , */\ + { 0x2a50, "flag_peakcur_int_pol"}, /* flag_peakcur_int_pol , */\ + { 0x2a60, "flag_ocpokap_int_pol"}, /* flag_ocpokap_int_pol , */\ + { 0x2a70, "flag_ocpokan_int_pol"}, /* flag_ocpokan_int_pol , */\ + { 0x2a80, "flag_ocpokbp_int_pol"}, /* flag_ocpokbp_int_pol , */\ + { 0x2a90, "flag_ocpokbn_int_pol"}, /* flag_ocpokbn_int_pol , */\ + { 0x2aa0, "flag_adc10_ready_int_pol"}, /* flag_adc10_ready_int_pol , */\ + { 0x2ab0, "flag_clipa_high_int_pol"}, /* flag_clipa_high_int_pol , */\ + { 0x2ac0, "flag_clipa_low_int_pol"}, /* flag_clipa_low_int_pol , */\ + { 0x2ad0, "flag_clipb_high_int_pol"}, /* flag_clipb_high_int_pol , */\ + { 0x2ae0, "flag_clipb_low_int_pol"}, /* flag_clipb_low_int_pol , */\ + { 0x2af0, "flag_tdm_error_int_pol"}, /* flag_tdm_error_int_pol , */\ + { 0x2b00, "flag_cfma_err_int_pol"}, /* flag_cfma_err_int_pol , */\ + { 0x2b10, "flag_cfma_ack_int_pol"}, /* flag_cfma_ack_int_pol , */\ + { 0x3000, "flag_voutcomp"}, /* Status flag_voutcomp, indication Vset is larger than Vbat, */\ + { 0x3010, "flag_voutcomp93"}, /* Status flag_voutcomp93, indication Vset is larger than 1.07 x Vbat, */\ + { 0x3020, "flag_voutcomp86"}, /* Status flag voutcomp86, indication Vset is larger than 1.14 x Vbat, */\ + { 0x3030, "flag_hiz"}, /* Status flag_hiz, indication Vbst is larger than Vbat, */\ + { 0x3040, "flag_ocpokbst"}, /* Status flag_ocpokbst, indication no over current in boost converter PMOS switch, */\ + { 0x3050, "flag_peakcur"}, /* Status flag_peakcur, indication current is max in dcdc converter, */\ + { 0x3060, "flag_ocpokap"}, /* Status flag_ocpokap, indication no over current in amplifier A PMOS output stage, */\ + { 0x3070, "flag_ocpokan"}, /* Status flag_ocpokan, indication no over current in amplifier A NMOS output stage, */\ + { 0x3080, "flag_ocpokbp"}, /* Status flag_ocpokbp, indication no over current in amplifier B PMOS output stage, */\ + { 0x3090, "flag_ocpokbn"}, /* Status flag_ocpokbn, indication no over current in amplifier B NMOS output stage, */\ + { 0x30a0, "flag_adc10_ready"}, /* Status flag_adc10_ready, indication adc10 is ready, */\ + { 0x30b0, "flag_clipa_high"}, /* Status flag_clipa_high, indication pmos amplifier A is clipping, */\ + { 0x30c0, "flag_clipa_low"}, /* Status flag_clipa_low, indication nmos amplifier A is clipping, */\ + { 0x30d0, "flag_clipb_high"}, /* Status flag_clipb_high, indication pmos amplifier B is clipping, */\ + { 0x30e0, "flag_clipb_low"}, /* Status flag_clipb_low, indication nmos amplifier B is clipping, */\ + { 0x310f, "mtp_man_data_out"}, /* MTP manual read out data , */\ + { 0x3200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0x3210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0x3225, "mtp_ecc_tcout"}, /* MTP error correction test data out , */\ + { 0x3280, "mtpctrl_valid_test_rd"}, /* MTP test readout for read , */\ + { 0x3290, "mtpctrl_valid_test_wr"}, /* MTP test readout for write , */\ + { 0x32a0, "flag_in_alarm_state"}, /* Flag alarm state , */\ + { 0x32b0, "mtp_ecc_err2"}, /* Two or more bit errors detected in MTP, can not reconstruct value, */\ + { 0x32c0, "mtp_ecc_err1"}, /* One bit error detected in MTP, reconstructed value, */\ + { 0x32d0, "mtp_mtp_hvf"}, /* High voltage ready flag for MTP , */\ + { 0x32f0, "mtp_zero_check_fail"}, /* Zero check failed for MTP , */\ + { 0x3309, "data_adc10_tempbat"}, /* ADC10 data output for testing battery voltage and temperature, */\ + { 0x400f, "hid_code"}, /* 5A6Bh, 23147d to access hidden registers (default for engineering), */\ + { 0x4100, "bypass_hp"}, /* Bypass High Pass Filter , */\ + { 0x4110, "hard_mute"}, /* Hard Mute , */\ + { 0x4120, "soft_mute"}, /* Soft Mute , */\ + { 0x4134, "pwm_delay"}, /* PWM delay setting , */\ + { 0x4180, "pwm_shape"}, /* PWM Shape , */\ + { 0x4190, "pwm_bitlength"}, /* PWM Bitlength in noise shaper , */\ + { 0x4203, "drive"}, /* Drive bits to select number of amplifier power stages, */\ + { 0x4240, "reclock_pwm"}, /* Control for enabling reclocking of PWM signal , */\ + { 0x4250, "reclock_voltsense"}, /* Control for enabling reclocking of voltage sense signal, */\ + { 0x4281, "dpsalevel"}, /* DPSA threshold level , */\ + { 0x42a1, "dpsa_release"}, /* DPSA release time , */\ + { 0x42c0, "coincidence"}, /* Prevent simultaneously switching of output stage , */\ + { 0x42d0, "kickback"}, /* Prevent double pulses of output stage , */\ + { 0x4306, "drivebst"}, /* Drive bits to select the power transistor sections boost converter, */\ + { 0x4370, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x4381, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x43a0, "ocptestbst"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0); For new ocp (ctrl_reversebst is 1), */\ + { 0x43d0, "test_abistfft_enbl"}, /* FFT Coolflux , */\ + { 0x43e0, "bst_dcmbst"}, /* DCM mode control for DCDC during I2C direct control mode, */\ + { 0x43f0, "test_bcontrol"}, /* test_bcontrol , */\ + { 0x4400, "reversebst"}, /* OverCurrent Protection selection of power stage boost converter, */\ + { 0x4410, "sensetest"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0x4420, "enbl_engagebst"}, /* Enable power stage of dcdc controller , */\ + { 0x4470, "enbl_slopecur"}, /* Enable bit of max-current dac , */\ + { 0x4480, "enbl_voutcomp"}, /* Enable vout comparators , */\ + { 0x4490, "enbl_voutcomp93"}, /* Enable vout-93 comparators , */\ + { 0x44a0, "enbl_voutcomp86"}, /* Enable vout-86 comparators , */\ + { 0x44b0, "enbl_hizcom"}, /* Enable hiz comparator , */\ + { 0x44c0, "enbl_peakcur"}, /* Enable peak current , */\ + { 0x44d0, "bypass_ovpglitch"}, /* Bypass OVP Glitch Filter , */\ + { 0x44e0, "enbl_windac"}, /* Enable window dac , */\ + { 0x44f0, "enbl_powerbst"}, /* Enable line of the powerstage , */\ + { 0x4507, "ocp_thr"}, /* OCP threshold level , */\ + { 0x4580, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0x4590, "bypass_ovp"}, /* Bypass OVP , */\ + { 0x45a0, "bypass_uvp"}, /* Bypass UVP , */\ + { 0x45b0, "bypass_otp"}, /* Bypass OTP , */\ + { 0x45d0, "bypass_ocpcounter"}, /* Bypass OCP counter , */\ + { 0x45e0, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0x45f0, "vpalarm"}, /* vpalarm (UVP/OUP handling) , */\ + { 0x4600, "bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x4610, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x4627, "cs_gain"}, /* Current sense gain , */\ + { 0x46a0, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ + { 0x46b0, "bypass_pwmcounter"}, /* Bypass PWM Counter , */\ + { 0x46c0, "cs_negfixed"}, /* Current sense does not switch to neg , */\ + { 0x46d2, "cs_neghyst"}, /* Current sense switches to neg depending on hyseteris level, */\ + { 0x4700, "switch_fb"}, /* Current sense control switch_fb , */\ + { 0x4713, "se_hyst"}, /* Current sense control se_hyst , */\ + { 0x4754, "se_level"}, /* Current sense control se_level , */\ + { 0x47a5, "ktemp"}, /* Current sense control temperature compensation trimming, */\ + { 0x4800, "cs_negin"}, /* Current sense control negin , */\ + { 0x4810, "cs_sein"}, /* Current sense control cs_sein , */\ + { 0x4820, "cs_coincidence"}, /* Coincidence current sense , */\ + { 0x4830, "iddqtestbst"}, /* IDDQ testing in powerstage of DCDC boost converter, */\ + { 0x4840, "coincidencebst"}, /* Switch protection on to prevent simultaneously switching power stages bst and amp, */\ + { 0x4876, "delay_se_neg"}, /* delay of se and neg , */\ + { 0x48e1, "cs_ttrack"}, /* Sample and hold track time , */\ + { 0x4900, "bypass_clip"}, /* Bypass clip control , */\ + { 0x4920, "cf_cgate_off"}, /* Disable clock gating in the coolflux , */\ + { 0x4940, "clipfast"}, /* Clock selection for HW clipper for battery safeguard, */\ + { 0x4950, "cs_8ohm"}, /* 8 ohm mode for current sense (gain mode) , */\ + { 0x4974, "delay_clock_sh"}, /* delay_sh, tunes S7H delay , */\ + { 0x49c0, "inv_clksh"}, /* Invert the sample/hold clock for current sense ADC, */\ + { 0x49d0, "inv_neg"}, /* Invert neg signal , */\ + { 0x49e0, "inv_se"}, /* Invert se signal , */\ + { 0x49f0, "setse"}, /* Switches between Single Ended and differential mode; 1 is single ended, */\ + { 0x4a12, "adc10_sel"}, /* Select the input to convert the 10b ADC , */\ + { 0x4a60, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0x4a81, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0x4aa0, "bypass_lp_vbat"}, /* LP filter in batt sensor , */\ + { 0x4ae0, "dc_offset"}, /* Current sense decimator offset control , */\ + { 0x4af0, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ + { 0x4b00, "adc13_iset"}, /* MICADC setting of current consumption (debug use only), */\ + { 0x4b14, "adc13_gain"}, /* MICADC gain setting (two's complement format) , */\ + { 0x4b61, "adc13_slowdel"}, /* MICADC delay setting for internal clock (debug use only), */\ + { 0x4b83, "adc13_offset"}, /* MICADC offset setting , */\ + { 0x4bc0, "adc13_bsoinv"}, /* MICADC bit stream output invert mode for test , */\ + { 0x4bd0, "adc13_resonator_enable"}, /* MICADC give extra SNR with less stability (debug use only), */\ + { 0x4be0, "testmicadc"}, /* Mux at input of MICADC for test purpose , */\ + { 0x4c0f, "abist_offset"}, /* Offset control for ABIST testing , */\ + { 0x4d05, "windac"}, /* For testing direct control windac , */\ + { 0x4dc3, "pwm_dcc_cnt"}, /* control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0x4e04, "slopecur"}, /* For testing direct control slopecur , */\ + { 0x4e50, "ctrl_dem"}, /* Dynamic element matching control, rest of codes are optional, */\ + { 0x4ed0, "enbl_pwm_dcc"}, /* Enable direct control of pwm duty cycle , */\ + { 0x4f00, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x4f10, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x4f20, "bst_ctrl_azbst"}, /* Control of auto-zeroing of zero current comparator, */\ + { 0x5007, "gain"}, /* Gain setting of the gain multiplier , */\ + { 0x5081, "sourceb"}, /* PWM OUTB selection control , */\ + { 0x50a1, "sourcea"}, /* PWM OUTA selection control , */\ + { 0x50c1, "sourcebst"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0x50e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0x5104, "pulselengthbst"}, /* Pulse length setting test input for boost converter, */\ + { 0x5150, "bypasslatchbst"}, /* Bypass latch in boost converter , */\ + { 0x5160, "invertbst"}, /* Invert pwmbst test signal , */\ + { 0x5174, "pulselength"}, /* Pulse length setting test input for amplifier , */\ + { 0x51c0, "bypasslatch"}, /* Bypass latch in PWM source selection module , */\ + { 0x51d0, "invertb"}, /* invert pwmb test signal , */\ + { 0x51e0, "inverta"}, /* invert pwma test signal , */\ + { 0x51f0, "bypass_ctrlloop"}, /* bypass_ctrlloop bypasses the control loop of the amplifier, */\ + { 0x5210, "test_rdsona"}, /* tbd for rdson testing , */\ + { 0x5220, "test_rdsonb"}, /* tbd for rdson testing , */\ + { 0x5230, "test_rdsonbst"}, /* tbd for rdson testing , */\ + { 0x5240, "test_cvia"}, /* tbd for rdson testing , */\ + { 0x5250, "test_cvib"}, /* tbd for rdson testing , */\ + { 0x5260, "test_cvibst"}, /* tbd for rdson testing , */\ + { 0x5306, "digimuxa_sel"}, /* DigimuxA input selection control (see Digimux list for details), */\ + { 0x5376, "digimuxb_sel"}, /* DigimuxB input selection control (see Digimux list for details), */\ + { 0x5400, "hs_mode"}, /* I2C high speed mode selection control , */\ + { 0x5412, "test_parametric_io"}, /* Control for parametric tests of IO cells , */\ + { 0x5440, "enbl_ringo"}, /* Enable ring oscillator control, for test purpose to check with ringo, */\ + { 0x5456, "digimuxc_sel"}, /* DigimuxC input selection control (see Digimux list for details), */\ + { 0x54c0, "dio_ehs"}, /* Slew control for DIO in output mode , */\ + { 0x54d0, "gainio_ehs"}, /* Slew control for GAINIO in output mode , */\ + { 0x550d, "enbl_amp"}, /* enbl_amp for testing to enable all analoge blocks in amplifier, */\ + { 0x5600, "use_direct_ctrls"}, /* Use direct controls to overrule several functions for testing - I2C direct control mode, */\ + { 0x5610, "rst_datapath"}, /* Reset datapath during direct control mode , */\ + { 0x5620, "rst_cgu"}, /* Reset CGU during durect control mode , */\ + { 0x5637, "enbl_ref"}, /* For testing to enable all analoge blocks in references, */\ + { 0x56b0, "enbl_engage"}, /* Enable output stage amplifier , */\ + { 0x56c0, "use_direct_clk_ctrl"}, /* use_direct_clk_ctrl, to overrule several functions direct for testing, */\ + { 0x56d0, "use_direct_pll_ctrl"}, /* use_direct_pll_ctrl, to overrule several functions direct for testing, */\ + { 0x5707, "anamux"}, /* Anamux control , */\ + { 0x57e0, "otptest"}, /* otptest, test mode otp amplifier , */\ + { 0x57f0, "reverse"}, /* 1b = Normal mode, slope is controlled , */\ + { 0x5813, "pll_selr"}, /* PLL pll_selr , */\ + { 0x5854, "pll_selp"}, /* PLL pll_selp , */\ + { 0x58a5, "pll_seli"}, /* PLL pll_seli , */\ + { 0x5950, "pll_mdec_msb"}, /* Most significant bits of pll_mdec[16] , */\ + { 0x5960, "pll_ndec_msb"}, /* Most significant bits of pll_ndec[9] , */\ + { 0x5970, "pll_frm"}, /* PLL pll_frm , */\ + { 0x5980, "pll_directi"}, /* PLL pll_directi , */\ + { 0x5990, "pll_directo"}, /* PLL pll_directo , */\ + { 0x59a0, "enbl_pll"}, /* PLL enbl_pll , */\ + { 0x59f0, "pll_bypass"}, /* PLL bypass , */\ + { 0x5a0f, "tsig_freq"}, /* Internal sinus test generator frequency control LSB bits, */\ + { 0x5b02, "tsig_freq_msb"}, /* Select internal sine wave generator, frequency control MSB bits, */\ + { 0x5b30, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0x5b44, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0x5c0f, "pll_mdec"}, /* PLL MDEC - I2C direct PLL control mode only , */\ + { 0x5d06, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ + { 0x5d78, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ + { 0x6007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0x6185, "mtp_ecc_tcin"}, /* MTP ECC TCIN data , */\ + { 0x6203, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0x6260, "mtp_ecc_eeb"}, /* Enable code bit generation (active low!) , */\ + { 0x6270, "mtp_ecc_ecb"}, /* Enable correction signal (active low!) , */\ + { 0x6280, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0x6290, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0x62a0, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0x62b0, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0x62d2, "mtp_speed_mode"}, /* MTP speed mode , */\ + { 0x6340, "mtp_direct_enable"}, /* mtp_direct_enable , */\ + { 0x6350, "mtp_direct_wr"}, /* mtp_direct_wr , */\ + { 0x6360, "mtp_direct_rd"}, /* mtp_direct_rd , */\ + { 0x6370, "mtp_direct_rst"}, /* mtp_direct_rst , */\ + { 0x6380, "mtp_direct_ers"}, /* mtp_direct_ers , */\ + { 0x6390, "mtp_direct_prg"}, /* mtp_direct_prg , */\ + { 0x63a0, "mtp_direct_epp"}, /* mtp_direct_epp , */\ + { 0x63b4, "mtp_direct_test"}, /* mtp_direct_test , */\ + { 0x640f, "mtp_man_data_in"}, /* Write data for MTP manual write , */\ + { 0x7000, "cf_rst_dsp"}, /* Reset CoolFlux DSP , */\ + { 0x7011, "cf_dmem"}, /* Target memory for access , */\ + { 0x7030, "cf_aif"}, /* Auto increment flag for memory-address , */\ + { 0x7040, "cf_int"}, /* CF Interrupt - auto clear , */\ + { 0x7087, "cf_req"}, /* CF request for accessing the 8 channels , */\ + { 0x710f, "cf_madd"}, /* Memory address , */\ + { 0x720f, "cf_mema"}, /* Activate memory access , */\ + { 0x7307, "cf_err"}, /* CF error flags , */\ + { 0x7387, "cf_ack"}, /* CF acknowledgement of the requests channels , */\ + { 0x8000, "calibration_onetime"}, /* Calibration schedule selection , */\ + { 0x8010, "calibr_ron_done"}, /* Calibration of RON status bit , */\ + { 0x8105, "calibr_vout_offset"}, /* calibr_vout_offset (DCDCoffset) 2's compliment (key1 protected), */\ + { 0x8163, "calibr_delta_gain"}, /* delta gain for vamp (alpha) 2's compliment (key1 protected), */\ + { 0x81a5, "calibr_offs_amp"}, /* offset for vamp (Ampoffset) 2's compliment (key1 protected), */\ + { 0x8207, "calibr_gain_cs"}, /* gain current sense (Imeasalpha) 2's compliment (key1 protected), */\ + { 0x8284, "calibr_temp_offset"}, /* temperature offset 2's compliment (key1 protected), */\ + { 0x82d2, "calibr_temp_gain"}, /* temperature gain 2's compliment (key1 protected) , */\ + { 0x830f, "calibr_ron"}, /* calibration value of the RON resistance of the coil, */\ + { 0x8505, "type_bits_hw"}, /* bit0 = disable function dcdcoff_mode ($09[7]) , */\ + { 0x8601, "type_bits_1_0_sw"}, /* MTP control SW , */\ + { 0x8681, "type_bits_9_8_sw"}, /* MTP control SW , */\ + { 0x870f, "type_bits2_sw"}, /* MTP-control SW2 , */\ + { 0x8806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0x8870, "htol_iic_addr_en"}, /* HTOL I2C_Address_Enable , */\ + { 0x8881, "ctrl_ovp_response"}, /* OVP response control , */\ + { 0x88a0, "disable_ovp_alarm_state"}, /* OVP alarm state control , */\ + { 0x88b0, "enbl_stretch_ovp"}, /* OVP alram strech control , */\ + { 0x88c0, "cf_debug_mode"}, /* Coolflux debug mode , */\ + { 0x8a0f, "production_data1"}, /* production_data1 , */\ + { 0x8b0f, "production_data2"}, /* production_data2 , */\ + { 0x8c0f, "production_data3"}, /* production_data3 , */\ + { 0x8d0f, "production_data4"}, /* production_data4 , */\ + { 0x8e0f, "production_data5"}, /* production_data5 , */\ + { 0x8f0f, "production_data6"}, /* production_data6 , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum TFA9896_irq { + TFA9896_irq_vdds = 0, + TFA9896_irq_plls = 1, + TFA9896_irq_ds = 2, + TFA9896_irq_vds = 3, + TFA9896_irq_uvds = 4, + TFA9896_irq_cds = 5, + TFA9896_irq_clks = 6, + TFA9896_irq_clips = 7, + TFA9896_irq_mtpb = 8, + TFA9896_irq_clk = 9, + TFA9896_irq_spks = 10, + TFA9896_irq_acs = 11, + TFA9896_irq_sws = 12, + TFA9896_irq_wds = 13, + TFA9896_irq_amps = 14, + TFA9896_irq_arefs = 15, + TFA9896_irq_err = 32, + TFA9896_irq_ack = 33, + TFA9896_irq_max = 34, + TFA9896_irq_all = -1 /* all irqs */}; + +#define TFA9896_IRQ_NAMETABLE static tfaIrqName_t TFA9896IrqNames[] = {\ + { 0, "VDDS"},\ + { 1, "PLLS"},\ + { 2, "DS"},\ + { 3, "VDS"},\ + { 4, "UVDS"},\ + { 5, "CDS"},\ + { 6, "CLKS"},\ + { 7, "CLIPS"},\ + { 8, "MTPB"},\ + { 9, "CLK"},\ + { 10, "SPKS"},\ + { 11, "ACS"},\ + { 12, "SWS"},\ + { 13, "WDS"},\ + { 14, "AMPS"},\ + { 15, "AREFS"},\ + { 16, "16"},\ + { 17, "17"},\ + { 18, "18"},\ + { 19, "19"},\ + { 20, "20"},\ + { 21, "21"},\ + { 22, "22"},\ + { 23, "23"},\ + { 24, "24"},\ + { 25, "25"},\ + { 26, "26"},\ + { 27, "27"},\ + { 28, "28"},\ + { 29, "29"},\ + { 30, "30"},\ + { 31, "31"},\ + { 32, "ERR"},\ + { 33, "ACK"},\ + { 34, "34"},\ +}; +#endif /* _TFA9896_TFAFIELDNAMES_H */ diff --git a/inc/tfa98xx.h b/inc/tfa98xx.h new file mode 100644 index 000000000000..eb748d44fcef --- /dev/null +++ b/inc/tfa98xx.h @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef __TFA98XX_INC__ +#define __TFA98XX_INC__ + +#include +#include +#include +#include + +#include "tfa_device.h" +#include "tfa_container.h" +#include "config.h" + +/* max. length of a alsa mixer control name */ +#define MAX_CONTROL_NAME 48 + +#define TFA98XX_MAX_REGISTER 0xff + +#define TFA98XX_FLAG_SKIP_INTERRUPTS (1 << 0) +#define TFA98XX_FLAG_SAAM_AVAILABLE (1 << 1) +#define TFA98XX_FLAG_STEREO_DEVICE (1 << 2) +#define TFA98XX_FLAG_MULTI_MIC_INPUTS (1 << 3) +#define TFA98XX_FLAG_TAPDET_AVAILABLE (1 << 4) +#define TFA98XX_FLAG_CALIBRATION_CTL (1 << 5) +#define TFA98XX_FLAG_REMOVE_PLOP_NOISE (1 << 6) +#define TFA98XX_FLAG_LP_MODES (1 << 7) +#define TFA98XX_FLAG_TDM_DEVICE (1 << 8) +#define TFA98XX_FLAG_ADAPT_NOISE_MODE (1 << 9) + +#define TFA98XX_NUM_RATES 9 + +/* DSP init status */ +enum tfa98xx_dsp_init_state { + TFA98XX_DSP_INIT_STOPPED, /* DSP not running */ + TFA98XX_DSP_INIT_RECOVER, /* DSP error detected at runtime */ + TFA98XX_DSP_INIT_FAIL, /* DSP init failed */ + TFA98XX_DSP_INIT_PENDING, /* DSP start requested */ + TFA98XX_DSP_INIT_DONE, /* DSP running */ + TFA98XX_DSP_INIT_INVALIDATED, /* DSP was running, requires re-init */ +}; + +enum tfa98xx_dsp_fw_state { + TFA98XX_DSP_FW_NONE = 0, + TFA98XX_DSP_FW_PENDING, + TFA98XX_DSP_FW_FAIL, + TFA98XX_DSP_FW_OK, +}; + +enum tfa98xx_misc_device_id { + MISC_DEVICE_TFA98XX_REG, + MISC_DEVICE_TFA98XX_RW, + MISC_DEVICE_TFA98XX_RPC, + MISC_DEVICE_TFA98XX_PROFILE, + MISC_DEVICE_TFA98XX_IOCTL, + MISC_DEVICE_MAX +}; + +struct tfa98xx_miscdevice_info { + char devicename[255]; + struct file_operations operations; +}; + +enum TFA_DEVICE_TYPE { + TFA_DEVICE_TYPE_9894, + TFA_DEVICE_TYPE_9874_PRIMARY, + TFA_DEVICE_TYPE_9874_SECONDARY, + TFA_DEVICE_TYPE_MAX +}; + +enum TFA_DEVICE_MUTE { + TFA98XX_DEVICE_MUTE_OFF = 0, + TFA98XX_DEVICE_MUTE_ON, +}; + +enum { + IOCTL_CMD_GET_MEMTRACK_DATA = 0, + IOCTL_CMD_GET_CNT_VERSION, +}; + +enum { + MEMTRACK_ITEM_SPEAKER_F0 = 0, + MEMTRACK_ITEM_SPEAKER_TEMPERATURE, + MEMTRACK_ITEM_SPEAKER_IMPEDANCE, + MEMTRACK_ITEM_MAX +}; + +struct livedata_cfg { + int address; + int track; + int scaler; +}; + +struct tfa98xx_firmware { + void *base; + struct tfa98xx_device *dev; + char name[9]; //TODO get length from tfa parameter defs +}; + +struct tfa98xx_baseprofile { + char basename[MAX_CONTROL_NAME]; /* profile basename */ + int len; /* profile length */ + int item_id; /* profile id */ + int sr_rate_sup[TFA98XX_NUM_RATES]; /* sample rates supported by this profile */ + struct list_head list; /* list of all profiles */ +}; +enum tfa_reset_polarity { + LOW = 0, + HIGH = 1 +}; +struct tfa98xx { + struct regmap *regmap; + struct i2c_client *i2c; + struct regulator *vdd; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec; +#else + struct snd_soc_codec *codec; +#endif + struct workqueue_struct *tfa98xx_wq; + struct delayed_work init_work; + struct delayed_work monitor_work; + struct delayed_work interrupt_work; + struct delayed_work tapdet_work; + struct delayed_work nmodeupdate_work; + struct mutex dsp_lock; + int dsp_init; + int dsp_fw_state; + int sysclk; + int rst_gpio; + u16 rev; + int audio_mode; + struct tfa98xx_firmware fw; + char *fw_name; + int rate; + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ + u8 pcm_format; + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ + wait_queue_head_t wq; + struct device *dev; + unsigned int init_count; + int pstream; + int cstream; + struct input_dev *input; + bool tapdet_enabled; /* service enabled */ + bool tapdet_open; /* device file opened */ + unsigned int tapdet_profiles; /* tapdet profile bitfield */ + bool tapdet_poll; /* tapdet running on polling mode */ + + unsigned int rate_constraint_list[TFA98XX_NUM_RATES]; + struct snd_pcm_hw_constraint_list rate_constraint; + + int reset_gpio; + int power_gpio; + int irq_gpio; + enum tfa_reset_polarity reset_polarity; + struct list_head list; + struct tfa_device *tfa; + int vstep; + int profile; + int prof_vsteps[TFACONT_MAXPROFS]; /* store vstep per profile (single device) */ + +#ifdef CONFIG_DEBUG_FS + struct dentry *dbg_dir; +#endif + u8 reg; + unsigned int flags; + bool set_mtp_cal; + uint16_t cal_data; + enum TFA_DEVICE_MUTE tfa_mute_mode; + + struct device_node *spk_id_gpio_p; + + struct miscdevice tfa98xx_reg; + struct miscdevice tfa98xx_rw; + struct miscdevice tfa98xx_rpc; + struct miscdevice tfa98xx_profile; + struct miscdevice tfa98xx_control; +}; + + +#endif /* __TFA98XX_INC__ */ diff --git a/inc/tfa98xx_genregs_N1C.h b/inc/tfa98xx_genregs_N1C.h new file mode 100644 index 000000000000..190991ddea18 --- /dev/null +++ b/inc/tfa98xx_genregs_N1C.h @@ -0,0 +1,3866 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: Tfa98xx_genregs.h + * This file was generated automatically on 09/01/15 at 09:40:23. + * Source file: TFA9888_N1C_I2C_regmap_V1.xlsx + */ + +#ifndef TFA2_GENREGS_H +#define TFA2_GENREGS_H + + +#define TFA98XX_SYS_CONTROL0 0x00 +#define TFA98XX_SYS_CONTROL1 0x01 +#define TFA98XX_SYS_CONTROL2 0x02 +#define TFA98XX_DEVICE_REVISION 0x03 +#define TFA98XX_CLOCK_CONTROL 0x04 +#define TFA98XX_CLOCK_GATING_CONTROL 0x05 +#define TFA98XX_SIDE_TONE_CONFIG 0x0d +#define TFA98XX_CTRL_DIGTOANA_REG 0x0e +#define TFA98XX_STATUS_FLAGS0 0x10 +#define TFA98XX_STATUS_FLAGS1 0x11 +#define TFA98XX_STATUS_FLAGS2 0x12 +#define TFA98XX_STATUS_FLAGS3 0x13 +#define TFA98XX_STATUS_FLAGS4 0x14 +#define TFA98XX_BATTERY_VOLTAGE 0x15 +#define TFA98XX_TEMPERATURE 0x16 +#define TFA98XX_TDM_CONFIG0 0x20 +#define TFA98XX_TDM_CONFIG1 0x21 +#define TFA98XX_TDM_CONFIG2 0x22 +#define TFA98XX_TDM_CONFIG3 0x23 +#define TFA98XX_TDM_CONFIG4 0x24 +#define TFA98XX_TDM_CONFIG5 0x25 +#define TFA98XX_TDM_CONFIG6 0x26 +#define TFA98XX_TDM_CONFIG7 0x27 +#define TFA98XX_TDM_CONFIG8 0x28 +#define TFA98XX_TDM_CONFIG9 0x29 +#define TFA98XX_PDM_CONFIG0 0x31 +#define TFA98XX_PDM_CONFIG1 0x32 +#define TFA98XX_HAPTIC_DRIVER_CONFIG 0x33 +#define TFA98XX_GPIO_DATAIN_REG 0x34 +#define TFA98XX_GPIO_CONFIG 0x35 +#define TFA98XX_INTERRUPT_OUT_REG1 0x40 +#define TFA98XX_INTERRUPT_OUT_REG2 0x41 +#define TFA98XX_INTERRUPT_OUT_REG3 0x42 +#define TFA98XX_INTERRUPT_IN_REG1 0x44 +#define TFA98XX_INTERRUPT_IN_REG2 0x45 +#define TFA98XX_INTERRUPT_IN_REG3 0x46 +#define TFA98XX_INTERRUPT_ENABLE_REG1 0x48 +#define TFA98XX_INTERRUPT_ENABLE_REG2 0x49 +#define TFA98XX_INTERRUPT_ENABLE_REG3 0x4a +#define TFA98XX_STATUS_POLARITY_REG1 0x4c +#define TFA98XX_STATUS_POLARITY_REG2 0x4d +#define TFA98XX_STATUS_POLARITY_REG3 0x4e +#define TFA98XX_BAT_PROT_CONFIG 0x50 +#define TFA98XX_AUDIO_CONTROL 0x51 +#define TFA98XX_AMPLIFIER_CONFIG 0x52 +#define TFA98XX_AUDIO_CONTROL2 0x5a +#define TFA98XX_DCDC_CONTROL0 0x70 +#define TFA98XX_CF_CONTROLS 0x90 +#define TFA98XX_CF_MAD 0x91 +#define TFA98XX_CF_MEM 0x92 +#define TFA98XX_CF_STATUS 0x93 +#define TFA98XX_MTPKEY2_REG 0xa1 +#define TFA98XX_MTP_STATUS 0xa2 +#define TFA98XX_KEY_PROTECTED_MTP_CONTROL 0xa3 +#define TFA98XX_MTP_DATA_OUT_MSB 0xa5 +#define TFA98XX_MTP_DATA_OUT_LSB 0xa6 +#define TFA98XX_TEMP_SENSOR_CONFIG 0xb1 +#define TFA98XX_KEY2_PROTECTED_MTP0 0xf0 +#define TFA98XX_KEY1_PROTECTED_MTP4 0xf4 +#define TFA98XX_KEY1_PROTECTED_MTP5 0xf5 + +/* + * (0x00)-sys_control0 + */ + +/* + * powerdown + */ +#define TFA98XX_SYS_CONTROL0_PWDN (0x1<<0) +#define TFA98XX_SYS_CONTROL0_PWDN_POS 0 +#define TFA98XX_SYS_CONTROL0_PWDN_LEN 1 +#define TFA98XX_SYS_CONTROL0_PWDN_MAX 1 +#define TFA98XX_SYS_CONTROL0_PWDN_MSK 0x1 + +/* + * reset + */ +#define TFA98XX_SYS_CONTROL0_I2CR (0x1<<1) +#define TFA98XX_SYS_CONTROL0_I2CR_POS 1 +#define TFA98XX_SYS_CONTROL0_I2CR_LEN 1 +#define TFA98XX_SYS_CONTROL0_I2CR_MAX 1 +#define TFA98XX_SYS_CONTROL0_I2CR_MSK 0x2 + +/* + * enbl_coolflux + */ +#define TFA98XX_SYS_CONTROL0_CFE (0x1<<2) +#define TFA98XX_SYS_CONTROL0_CFE_POS 2 +#define TFA98XX_SYS_CONTROL0_CFE_LEN 1 +#define TFA98XX_SYS_CONTROL0_CFE_MAX 1 +#define TFA98XX_SYS_CONTROL0_CFE_MSK 0x4 + +/* + * enbl_amplifier + */ +#define TFA98XX_SYS_CONTROL0_AMPE (0x1<<3) +#define TFA98XX_SYS_CONTROL0_AMPE_POS 3 +#define TFA98XX_SYS_CONTROL0_AMPE_LEN 1 +#define TFA98XX_SYS_CONTROL0_AMPE_MAX 1 +#define TFA98XX_SYS_CONTROL0_AMPE_MSK 0x8 + +/* + * enbl_boost + */ +#define TFA98XX_SYS_CONTROL0_DCA (0x1<<4) +#define TFA98XX_SYS_CONTROL0_DCA_POS 4 +#define TFA98XX_SYS_CONTROL0_DCA_LEN 1 +#define TFA98XX_SYS_CONTROL0_DCA_MAX 1 +#define TFA98XX_SYS_CONTROL0_DCA_MSK 0x10 + +/* + * coolflux_configured + */ +#define TFA98XX_SYS_CONTROL0_SBSL (0x1<<5) +#define TFA98XX_SYS_CONTROL0_SBSL_POS 5 +#define TFA98XX_SYS_CONTROL0_SBSL_LEN 1 +#define TFA98XX_SYS_CONTROL0_SBSL_MAX 1 +#define TFA98XX_SYS_CONTROL0_SBSL_MSK 0x20 + +/* + * sel_enbl_amplifier + */ +#define TFA98XX_SYS_CONTROL0_AMPC (0x1<<6) +#define TFA98XX_SYS_CONTROL0_AMPC_POS 6 +#define TFA98XX_SYS_CONTROL0_AMPC_LEN 1 +#define TFA98XX_SYS_CONTROL0_AMPC_MAX 1 +#define TFA98XX_SYS_CONTROL0_AMPC_MSK 0x40 + +/* + * int_pad_io + */ +#define TFA98XX_SYS_CONTROL0_INTP (0x3<<7) +#define TFA98XX_SYS_CONTROL0_INTP_POS 7 +#define TFA98XX_SYS_CONTROL0_INTP_LEN 2 +#define TFA98XX_SYS_CONTROL0_INTP_MAX 3 +#define TFA98XX_SYS_CONTROL0_INTP_MSK 0x180 + +/* + * fs_pulse_sel + */ +#define TFA98XX_SYS_CONTROL0_FSSSEL (0x3<<9) +#define TFA98XX_SYS_CONTROL0_FSSSEL_POS 9 +#define TFA98XX_SYS_CONTROL0_FSSSEL_LEN 2 +#define TFA98XX_SYS_CONTROL0_FSSSEL_MAX 3 +#define TFA98XX_SYS_CONTROL0_FSSSEL_MSK 0x600 + +/* + * bypass_ocp + */ +#define TFA98XX_SYS_CONTROL0_BYPOCP (0x1<<11) +#define TFA98XX_SYS_CONTROL0_BYPOCP_POS 11 +#define TFA98XX_SYS_CONTROL0_BYPOCP_LEN 1 +#define TFA98XX_SYS_CONTROL0_BYPOCP_MAX 1 +#define TFA98XX_SYS_CONTROL0_BYPOCP_MSK 0x800 + +/* + * test_ocp + */ +#define TFA98XX_SYS_CONTROL0_TSTOCP (0x1<<12) +#define TFA98XX_SYS_CONTROL0_TSTOCP_POS 12 +#define TFA98XX_SYS_CONTROL0_TSTOCP_LEN 1 +#define TFA98XX_SYS_CONTROL0_TSTOCP_MAX 1 +#define TFA98XX_SYS_CONTROL0_TSTOCP_MSK 0x1000 + + +/* + * (0x01)-sys_control1 + */ + +/* + * vamp_sel + */ +#define TFA98XX_SYS_CONTROL1_AMPINSEL (0x3<<0) +#define TFA98XX_SYS_CONTROL1_AMPINSEL_POS 0 +#define TFA98XX_SYS_CONTROL1_AMPINSEL_LEN 2 +#define TFA98XX_SYS_CONTROL1_AMPINSEL_MAX 3 +#define TFA98XX_SYS_CONTROL1_AMPINSEL_MSK 0x3 + +/* + * src_set_configured + */ +#define TFA98XX_SYS_CONTROL1_MANSCONF (0x1<<2) +#define TFA98XX_SYS_CONTROL1_MANSCONF_POS 2 +#define TFA98XX_SYS_CONTROL1_MANSCONF_LEN 1 +#define TFA98XX_SYS_CONTROL1_MANSCONF_MAX 1 +#define TFA98XX_SYS_CONTROL1_MANSCONF_MSK 0x4 + +/* + * execute_cold_start + */ +#define TFA98XX_SYS_CONTROL1_MANCOLD (0x1<<3) +#define TFA98XX_SYS_CONTROL1_MANCOLD_POS 3 +#define TFA98XX_SYS_CONTROL1_MANCOLD_LEN 1 +#define TFA98XX_SYS_CONTROL1_MANCOLD_MAX 1 +#define TFA98XX_SYS_CONTROL1_MANCOLD_MSK 0x8 + +/* + * enbl_osc1m_auto_off + */ +#define TFA98XX_SYS_CONTROL1_MANAOOSC (0x1<<4) +#define TFA98XX_SYS_CONTROL1_MANAOOSC_POS 4 +#define TFA98XX_SYS_CONTROL1_MANAOOSC_LEN 1 +#define TFA98XX_SYS_CONTROL1_MANAOOSC_MAX 1 +#define TFA98XX_SYS_CONTROL1_MANAOOSC_MSK 0x10 + +/* + * man_enbl_brown_out + */ +#define TFA98XX_SYS_CONTROL1_MANROBOD (0x1<<5) +#define TFA98XX_SYS_CONTROL1_MANROBOD_POS 5 +#define TFA98XX_SYS_CONTROL1_MANROBOD_LEN 1 +#define TFA98XX_SYS_CONTROL1_MANROBOD_MAX 1 +#define TFA98XX_SYS_CONTROL1_MANROBOD_MSK 0x20 + +/* + * enbl_bod + */ +#define TFA98XX_SYS_CONTROL1_BODE (0x1<<6) +#define TFA98XX_SYS_CONTROL1_BODE_POS 6 +#define TFA98XX_SYS_CONTROL1_BODE_LEN 1 +#define TFA98XX_SYS_CONTROL1_BODE_MAX 1 +#define TFA98XX_SYS_CONTROL1_BODE_MSK 0x40 + +/* + * enbl_bod_hyst + */ +#define TFA98XX_SYS_CONTROL1_BODHYS (0x1<<7) +#define TFA98XX_SYS_CONTROL1_BODHYS_POS 7 +#define TFA98XX_SYS_CONTROL1_BODHYS_LEN 1 +#define TFA98XX_SYS_CONTROL1_BODHYS_MAX 1 +#define TFA98XX_SYS_CONTROL1_BODHYS_MSK 0x80 + +/* + * bod_delay + */ +#define TFA98XX_SYS_CONTROL1_BODFILT (0x3<<8) +#define TFA98XX_SYS_CONTROL1_BODFILT_POS 8 +#define TFA98XX_SYS_CONTROL1_BODFILT_LEN 2 +#define TFA98XX_SYS_CONTROL1_BODFILT_MAX 3 +#define TFA98XX_SYS_CONTROL1_BODFILT_MSK 0x300 + +/* + * bod_lvlsel + */ +#define TFA98XX_SYS_CONTROL1_BODTHLVL (0x3<<10) +#define TFA98XX_SYS_CONTROL1_BODTHLVL_POS 10 +#define TFA98XX_SYS_CONTROL1_BODTHLVL_LEN 2 +#define TFA98XX_SYS_CONTROL1_BODTHLVL_MAX 3 +#define TFA98XX_SYS_CONTROL1_BODTHLVL_MSK 0xc00 + +/* + * disable_mute_time_out + */ +#define TFA98XX_SYS_CONTROL1_MUTETO (0x1<<13) +#define TFA98XX_SYS_CONTROL1_MUTETO_POS 13 +#define TFA98XX_SYS_CONTROL1_MUTETO_LEN 1 +#define TFA98XX_SYS_CONTROL1_MUTETO_MAX 1 +#define TFA98XX_SYS_CONTROL1_MUTETO_MSK 0x2000 + +/* + * pwm_sel_rcv_ns + */ +#define TFA98XX_SYS_CONTROL1_RCVNS (0x1<<14) +#define TFA98XX_SYS_CONTROL1_RCVNS_POS 14 +#define TFA98XX_SYS_CONTROL1_RCVNS_LEN 1 +#define TFA98XX_SYS_CONTROL1_RCVNS_MAX 1 +#define TFA98XX_SYS_CONTROL1_RCVNS_MSK 0x4000 + +/* + * man_enbl_watchdog + */ +#define TFA98XX_SYS_CONTROL1_MANWDE (0x1<<15) +#define TFA98XX_SYS_CONTROL1_MANWDE_POS 15 +#define TFA98XX_SYS_CONTROL1_MANWDE_LEN 1 +#define TFA98XX_SYS_CONTROL1_MANWDE_MAX 1 +#define TFA98XX_SYS_CONTROL1_MANWDE_MSK 0x8000 + + +/* + * (0x02)-sys_control2 + */ + +/* + * audio_fs + */ +#define TFA98XX_SYS_CONTROL2_AUDFS (0xf<<0) +#define TFA98XX_SYS_CONTROL2_AUDFS_POS 0 +#define TFA98XX_SYS_CONTROL2_AUDFS_LEN 4 +#define TFA98XX_SYS_CONTROL2_AUDFS_MAX 15 +#define TFA98XX_SYS_CONTROL2_AUDFS_MSK 0xf + +/* + * input_level + */ +#define TFA98XX_SYS_CONTROL2_INPLEV (0x1<<4) +#define TFA98XX_SYS_CONTROL2_INPLEV_POS 4 +#define TFA98XX_SYS_CONTROL2_INPLEV_LEN 1 +#define TFA98XX_SYS_CONTROL2_INPLEV_MAX 1 +#define TFA98XX_SYS_CONTROL2_INPLEV_MSK 0x10 + +/* + * cs_frac_delay + */ +#define TFA98XX_SYS_CONTROL2_FRACTDEL (0x3f<<5) +#define TFA98XX_SYS_CONTROL2_FRACTDEL_POS 5 +#define TFA98XX_SYS_CONTROL2_FRACTDEL_LEN 6 +#define TFA98XX_SYS_CONTROL2_FRACTDEL_MAX 63 +#define TFA98XX_SYS_CONTROL2_FRACTDEL_MSK 0x7e0 + +/* + * bypass_hvbat_filter + */ +#define TFA98XX_SYS_CONTROL2_BYPHVBF (0x1<<11) +#define TFA98XX_SYS_CONTROL2_BYPHVBF_POS 11 +#define TFA98XX_SYS_CONTROL2_BYPHVBF_LEN 1 +#define TFA98XX_SYS_CONTROL2_BYPHVBF_MAX 1 +#define TFA98XX_SYS_CONTROL2_BYPHVBF_MSK 0x800 + +/* + * ctrl_rcvldop_bypass + */ +#define TFA98XX_SYS_CONTROL2_LDOBYP (0x1<<12) +#define TFA98XX_SYS_CONTROL2_LDOBYP_POS 12 +#define TFA98XX_SYS_CONTROL2_LDOBYP_LEN 1 +#define TFA98XX_SYS_CONTROL2_LDOBYP_MAX 1 +#define TFA98XX_SYS_CONTROL2_LDOBYP_MSK 0x1000 + + +/* + * (0x03)-device_revision + */ + +/* + * device_rev + */ +#define TFA98XX_DEVICE_REVISION_REV (0xffff<<0) +#define TFA98XX_DEVICE_REVISION_REV_POS 0 +#define TFA98XX_DEVICE_REVISION_REV_LEN 16 +#define TFA98XX_DEVICE_REVISION_REV_MAX 65535 +#define TFA98XX_DEVICE_REVISION_REV_MSK 0xffff + + +/* + * (0x04)-clock_control + */ + +/* + * pll_clkin_sel + */ +#define TFA98XX_CLOCK_CONTROL_REFCKEXT (0x3<<0) +#define TFA98XX_CLOCK_CONTROL_REFCKEXT_POS 0 +#define TFA98XX_CLOCK_CONTROL_REFCKEXT_LEN 2 +#define TFA98XX_CLOCK_CONTROL_REFCKEXT_MAX 3 +#define TFA98XX_CLOCK_CONTROL_REFCKEXT_MSK 0x3 + +/* + * pll_clkin_sel_osc + */ +#define TFA98XX_CLOCK_CONTROL_REFCKSEL (0x1<<2) +#define TFA98XX_CLOCK_CONTROL_REFCKSEL_POS 2 +#define TFA98XX_CLOCK_CONTROL_REFCKSEL_LEN 1 +#define TFA98XX_CLOCK_CONTROL_REFCKSEL_MAX 1 +#define TFA98XX_CLOCK_CONTROL_REFCKSEL_MSK 0x4 + + +/* + * (0x05)-clock_gating_control + */ + +/* + * enbl_spkr_ss_left + */ +#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE (0x1<<0) +#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_POS 0 +#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_LEN 1 +#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_MAX 1 +#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_MSK 0x1 + +/* + * enbl_spkr_ss_right + */ +#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE (0x1<<1) +#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_POS 1 +#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_LEN 1 +#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_MAX 1 +#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_MSK 0x2 + +/* + * enbl_volsense_left + */ +#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE (0x1<<2) +#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_POS 2 +#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_LEN 1 +#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_MAX 1 +#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_MSK 0x4 + +/* + * enbl_volsense_right + */ +#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE (0x1<<3) +#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_POS 3 +#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_LEN 1 +#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_MAX 1 +#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_MSK 0x8 + +/* + * enbl_cursense_left + */ +#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE (0x1<<4) +#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_POS 4 +#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_LEN 1 +#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_MAX 1 +#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_MSK 0x10 + +/* + * enbl_cursense_right + */ +#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE (0x1<<5) +#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_POS 5 +#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_LEN 1 +#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_MAX 1 +#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_MSK 0x20 + +/* + * enbl_pdm_ss + */ +#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME (0x1<<6) +#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_POS 6 +#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_LEN 1 +#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_MAX 1 +#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_MSK 0x40 + + +/* + * (0x0d)-side_tone_config + */ + +/* + * side_tone_gain + */ +#define TFA98XX_SIDE_TONE_CONFIG_STGAIN (0x1ff<<1) +#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_POS 1 +#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_LEN 9 +#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_MAX 511 +#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_MSK 0x3fe + +/* + * mute_side_tone + */ +#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE (0x1<<10) +#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_POS 10 +#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_LEN 1 +#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_MAX 1 +#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_MSK 0x400 + + +/* + * (0x0e)-ctrl_digtoana_reg + */ + +/* + * ctrl_digtoana + */ +#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP (0x7f<<0) +#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_POS 0 +#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_LEN 7 +#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_MAX 127 +#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_MSK 0x7f + + +/* + * (0x10)-status_flags0 + */ + +/* + * flag_por + */ +#define TFA98XX_STATUS_FLAGS0_VDDS (0x1<<0) +#define TFA98XX_STATUS_FLAGS0_VDDS_POS 0 +#define TFA98XX_STATUS_FLAGS0_VDDS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_VDDS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_VDDS_MSK 0x1 + +/* + * flag_pll_lock + */ +#define TFA98XX_STATUS_FLAGS0_PLLS (0x1<<1) +#define TFA98XX_STATUS_FLAGS0_PLLS_POS 1 +#define TFA98XX_STATUS_FLAGS0_PLLS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_PLLS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_PLLS_MSK 0x2 + +/* + * flag_otpok + */ +#define TFA98XX_STATUS_FLAGS0_OTDS (0x1<<2) +#define TFA98XX_STATUS_FLAGS0_OTDS_POS 2 +#define TFA98XX_STATUS_FLAGS0_OTDS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_OTDS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_OTDS_MSK 0x4 + +/* + * flag_ovpok + */ +#define TFA98XX_STATUS_FLAGS0_OVDS (0x1<<3) +#define TFA98XX_STATUS_FLAGS0_OVDS_POS 3 +#define TFA98XX_STATUS_FLAGS0_OVDS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_OVDS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_OVDS_MSK 0x8 + +/* + * flag_uvpok + */ +#define TFA98XX_STATUS_FLAGS0_UVDS (0x1<<4) +#define TFA98XX_STATUS_FLAGS0_UVDS_POS 4 +#define TFA98XX_STATUS_FLAGS0_UVDS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_UVDS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_UVDS_MSK 0x10 + +/* + * flag_clocks_stable + */ +#define TFA98XX_STATUS_FLAGS0_CLKS (0x1<<6) +#define TFA98XX_STATUS_FLAGS0_CLKS_POS 5 +#define TFA98XX_STATUS_FLAGS0_CLKS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_CLKS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_CLKS_MSK 0x20 + +/* + * flag_mtp_busy + */ +#define TFA98XX_STATUS_FLAGS0_MTPB (0x1<<7) +#define TFA98XX_STATUS_FLAGS0_MTPB_POS 7 +#define TFA98XX_STATUS_FLAGS0_MTPB_LEN 1 +#define TFA98XX_STATUS_FLAGS0_MTPB_MAX 1 +#define TFA98XX_STATUS_FLAGS0_MTPB_MSK 0x40 + +/* + * flag_lost_clk + */ +#define TFA98XX_STATUS_FLAGS0_NOCLK (0x1<<8) +#define TFA98XX_STATUS_FLAGS0_NOCLK_POS 8 +#define TFA98XX_STATUS_FLAGS0_NOCLK_LEN 1 +#define TFA98XX_STATUS_FLAGS0_NOCLK_MAX 1 +#define TFA98XX_STATUS_FLAGS0_NOCLK_MSK 0x80 + +#if 0 +/* + * flag_cf_speakererror + */ +#define TFA98XX_STATUS_FLAGS0_SPKS (0x1<<8) +#define TFA98XX_STATUS_FLAGS0_SPKS_POS 8 +#define TFA98XX_STATUS_FLAGS0_SPKS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_SPKS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_SPKS_MSK 0x100 +#endif + +/* + * flag_cold_started + */ +#define TFA98XX_STATUS_FLAGS0_ACS (0x1<<9) +#define TFA98XX_STATUS_FLAGS0_ACS_POS 9 +#define TFA98XX_STATUS_FLAGS0_ACS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_ACS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_ACS_MSK 0x200 + +/* + * flag_engage + */ +#define TFA98XX_STATUS_FLAGS0_SWS (0x1<<11) +#define TFA98XX_STATUS_FLAGS0_SWS_POS 11 +#define TFA98XX_STATUS_FLAGS0_SWS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_SWS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_SWS_MSK 0x400 + +/* + * flag_watchdog_reset + */ +#define TFA98XX_STATUS_FLAGS0_WDS (0x1<<10) +#define TFA98XX_STATUS_FLAGS0_WDS_POS 10 +#define TFA98XX_STATUS_FLAGS0_WDS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_WDS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_WDS_MSK 0x800 + +/* + * flag_enbl_amp + */ +#define TFA98XX_STATUS_FLAGS0_AMPS (0x1<<12) +#define TFA98XX_STATUS_FLAGS0_AMPS_POS 12 +#define TFA98XX_STATUS_FLAGS0_AMPS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_AMPS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_AMPS_MSK 0x1000 + +/* + * flag_enbl_ref + */ +#define TFA98XX_STATUS_FLAGS0_AREFS (0x1<<13) +#define TFA98XX_STATUS_FLAGS0_AREFS_POS 13 +#define TFA98XX_STATUS_FLAGS0_AREFS_LEN 1 +#define TFA98XX_STATUS_FLAGS0_AREFS_MAX 1 +#define TFA98XX_STATUS_FLAGS0_AREFS_MSK 0x2000 + +/* + * flag_adc10_ready + */ +#define TFA98XX_STATUS_FLAGS0_ADCCR (0x1<<14) +#define TFA98XX_STATUS_FLAGS0_ADCCR_POS 14 +#define TFA98XX_STATUS_FLAGS0_ADCCR_LEN 1 +#define TFA98XX_STATUS_FLAGS0_ADCCR_MAX 1 +#define TFA98XX_STATUS_FLAGS0_ADCCR_MSK 0x4000 + +/* + * flag_bod_vddd_nok + */ +#define TFA98XX_STATUS_FLAGS0_BODNOK (0x1<<15) +#define TFA98XX_STATUS_FLAGS0_BODNOK_POS 15 +#define TFA98XX_STATUS_FLAGS0_BODNOK_LEN 1 +#define TFA98XX_STATUS_FLAGS0_BODNOK_MAX 1 +#define TFA98XX_STATUS_FLAGS0_BODNOK_MSK 0x8000 + + +/* + * (0x11)-status_flags1 + */ + +/* + * flag_bst_bstcur + */ +#define TFA98XX_STATUS_FLAGS1_DCIL (0x1<<0) +#define TFA98XX_STATUS_FLAGS1_DCIL_POS 0 +#define TFA98XX_STATUS_FLAGS1_DCIL_LEN 1 +#define TFA98XX_STATUS_FLAGS1_DCIL_MAX 1 +#define TFA98XX_STATUS_FLAGS1_DCIL_MSK 0x1 + +/* + * flag_bst_hiz + */ +#define TFA98XX_STATUS_FLAGS1_DCDCA (0x1<<1) +#define TFA98XX_STATUS_FLAGS1_DCDCA_POS 1 +#define TFA98XX_STATUS_FLAGS1_DCDCA_LEN 1 +#define TFA98XX_STATUS_FLAGS1_DCDCA_MAX 1 +#define TFA98XX_STATUS_FLAGS1_DCDCA_MSK 0x2 + +/* + * flag_bst_ocpok + */ +#define TFA98XX_STATUS_FLAGS1_DCOCPOK (0x1<<2) +#define TFA98XX_STATUS_FLAGS1_DCOCPOK_POS 2 +#define TFA98XX_STATUS_FLAGS1_DCOCPOK_LEN 1 +#define TFA98XX_STATUS_FLAGS1_DCOCPOK_MAX 1 +#define TFA98XX_STATUS_FLAGS1_DCOCPOK_MSK 0x4 + +/* + * flag_bst_voutcomp + */ +#define TFA98XX_STATUS_FLAGS1_DCHVBAT (0x1<<4) +#define TFA98XX_STATUS_FLAGS1_DCHVBAT_POS 4 +#define TFA98XX_STATUS_FLAGS1_DCHVBAT_LEN 1 +#define TFA98XX_STATUS_FLAGS1_DCHVBAT_MAX 1 +#define TFA98XX_STATUS_FLAGS1_DCHVBAT_MSK 0x10 + +/* + * flag_bst_voutcomp86 + */ +#define TFA98XX_STATUS_FLAGS1_DCH114 (0x1<<5) +#define TFA98XX_STATUS_FLAGS1_DCH114_POS 5 +#define TFA98XX_STATUS_FLAGS1_DCH114_LEN 1 +#define TFA98XX_STATUS_FLAGS1_DCH114_MAX 1 +#define TFA98XX_STATUS_FLAGS1_DCH114_MSK 0x20 + +/* + * flag_bst_voutcomp93 + */ +#define TFA98XX_STATUS_FLAGS1_DCH107 (0x1<<6) +#define TFA98XX_STATUS_FLAGS1_DCH107_POS 6 +#define TFA98XX_STATUS_FLAGS1_DCH107_LEN 1 +#define TFA98XX_STATUS_FLAGS1_DCH107_MAX 1 +#define TFA98XX_STATUS_FLAGS1_DCH107_MSK 0x40 + +/* + * flag_soft_mute_busy + */ +#define TFA98XX_STATUS_FLAGS1_STMUTEB (0x1<<7) +#define TFA98XX_STATUS_FLAGS1_STMUTEB_POS 7 +#define TFA98XX_STATUS_FLAGS1_STMUTEB_LEN 1 +#define TFA98XX_STATUS_FLAGS1_STMUTEB_MAX 1 +#define TFA98XX_STATUS_FLAGS1_STMUTEB_MSK 0x80 + +/* + * flag_soft_mute_state + */ +#define TFA98XX_STATUS_FLAGS1_STMUTE (0x1<<8) +#define TFA98XX_STATUS_FLAGS1_STMUTE_POS 8 +#define TFA98XX_STATUS_FLAGS1_STMUTE_LEN 1 +#define TFA98XX_STATUS_FLAGS1_STMUTE_MAX 1 +#define TFA98XX_STATUS_FLAGS1_STMUTE_MSK 0x100 + +/* + * flag_tdm_lut_error + */ +#define TFA98XX_STATUS_FLAGS1_TDMLUTER (0x1<<9) +#define TFA98XX_STATUS_FLAGS1_TDMLUTER_POS 9 +#define TFA98XX_STATUS_FLAGS1_TDMLUTER_LEN 1 +#define TFA98XX_STATUS_FLAGS1_TDMLUTER_MAX 1 +#define TFA98XX_STATUS_FLAGS1_TDMLUTER_MSK 0x200 + +/* + * flag_tdm_status + */ +#define TFA98XX_STATUS_FLAGS1_TDMSTAT (0x7<<10) +#define TFA98XX_STATUS_FLAGS1_TDMSTAT_POS 10 +#define TFA98XX_STATUS_FLAGS1_TDMSTAT_LEN 3 +#define TFA98XX_STATUS_FLAGS1_TDMSTAT_MAX 7 +#define TFA98XX_STATUS_FLAGS1_TDMSTAT_MSK 0x1c00 + +/* + * flag_tdm_error + */ +#define TFA98XX_STATUS_FLAGS1_TDMERR (0x1<<13) +#define TFA98XX_STATUS_FLAGS1_TDMERR_POS 13 +#define TFA98XX_STATUS_FLAGS1_TDMERR_LEN 1 +#define TFA98XX_STATUS_FLAGS1_TDMERR_MAX 1 +#define TFA98XX_STATUS_FLAGS1_TDMERR_MSK 0x2000 + +/* + * flag_haptic_busy + */ +#define TFA98XX_STATUS_FLAGS1_HAPTIC (0x1<<14) +#define TFA98XX_STATUS_FLAGS1_HAPTIC_POS 14 +#define TFA98XX_STATUS_FLAGS1_HAPTIC_LEN 1 +#define TFA98XX_STATUS_FLAGS1_HAPTIC_MAX 1 +#define TFA98XX_STATUS_FLAGS1_HAPTIC_MSK 0x4000 + + +/* + * (0x12)-status_flags2 + */ + +/* + * flag_ocpokap_left + */ +#define TFA98XX_STATUS_FLAGS2_OCPOAPL (0x1<<0) +#define TFA98XX_STATUS_FLAGS2_OCPOAPL_POS 0 +#define TFA98XX_STATUS_FLAGS2_OCPOAPL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOAPL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOAPL_MSK 0x1 + +/* + * flag_ocpokan_left + */ +#define TFA98XX_STATUS_FLAGS2_OCPOANL (0x1<<1) +#define TFA98XX_STATUS_FLAGS2_OCPOANL_POS 1 +#define TFA98XX_STATUS_FLAGS2_OCPOANL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOANL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOANL_MSK 0x2 + +/* + * flag_ocpokbp_left + */ +#define TFA98XX_STATUS_FLAGS2_OCPOBPL (0x1<<2) +#define TFA98XX_STATUS_FLAGS2_OCPOBPL_POS 2 +#define TFA98XX_STATUS_FLAGS2_OCPOBPL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBPL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBPL_MSK 0x4 + +/* + * flag_ocpokbn_left + */ +#define TFA98XX_STATUS_FLAGS2_OCPOBNL (0x1<<3) +#define TFA98XX_STATUS_FLAGS2_OCPOBNL_POS 3 +#define TFA98XX_STATUS_FLAGS2_OCPOBNL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBNL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBNL_MSK 0x8 + +/* + * flag_clipa_high_left + */ +#define TFA98XX_STATUS_FLAGS2_CLIPAHL (0x1<<4) +#define TFA98XX_STATUS_FLAGS2_CLIPAHL_POS 4 +#define TFA98XX_STATUS_FLAGS2_CLIPAHL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_CLIPAHL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_CLIPAHL_MSK 0x10 + +/* + * flag_clipa_low_left + */ +#define TFA98XX_STATUS_FLAGS2_CLIPALL (0x1<<5) +#define TFA98XX_STATUS_FLAGS2_CLIPALL_POS 5 +#define TFA98XX_STATUS_FLAGS2_CLIPALL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_CLIPALL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_CLIPALL_MSK 0x20 + +/* + * flag_clipb_high_left + */ +#define TFA98XX_STATUS_FLAGS2_CLIPBHL (0x1<<6) +#define TFA98XX_STATUS_FLAGS2_CLIPBHL_POS 6 +#define TFA98XX_STATUS_FLAGS2_CLIPBHL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_CLIPBHL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_CLIPBHL_MSK 0x40 + +/* + * flag_clipb_low_left + */ +#define TFA98XX_STATUS_FLAGS2_CLIPBLL (0x1<<7) +#define TFA98XX_STATUS_FLAGS2_CLIPBLL_POS 7 +#define TFA98XX_STATUS_FLAGS2_CLIPBLL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_CLIPBLL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_CLIPBLL_MSK 0x80 + +/* + * flag_ocpokap_rcv + */ +#define TFA98XX_STATUS_FLAGS2_OCPOAPRC (0x1<<8) +#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_POS 8 +#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_MSK 0x100 + +/* + * flag_ocpokan_rcv + */ +#define TFA98XX_STATUS_FLAGS2_OCPOANRC (0x1<<9) +#define TFA98XX_STATUS_FLAGS2_OCPOANRC_POS 9 +#define TFA98XX_STATUS_FLAGS2_OCPOANRC_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOANRC_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOANRC_MSK 0x200 + +/* + * flag_ocpokbp_rcv + */ +#define TFA98XX_STATUS_FLAGS2_OCPOBPRC (0x1<<10) +#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_POS 10 +#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_MSK 0x400 + +/* + * flag_ocpokbn_rcv + */ +#define TFA98XX_STATUS_FLAGS2_OCPOBNRC (0x1<<11) +#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_POS 11 +#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_MSK 0x800 + +/* + * flag_rcvldop_ready + */ +#define TFA98XX_STATUS_FLAGS2_RCVLDOR (0x1<<12) +#define TFA98XX_STATUS_FLAGS2_RCVLDOR_POS 12 +#define TFA98XX_STATUS_FLAGS2_RCVLDOR_LEN 1 +#define TFA98XX_STATUS_FLAGS2_RCVLDOR_MAX 1 +#define TFA98XX_STATUS_FLAGS2_RCVLDOR_MSK 0x1000 + +/* + * flag_rcvldop_bypassready + */ +#define TFA98XX_STATUS_FLAGS2_RCVLDOBR (0x1<<13) +#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_POS 13 +#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_LEN 1 +#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_MAX 1 +#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_MSK 0x2000 + +/* + * flag_ocp_alarm_left + */ +#define TFA98XX_STATUS_FLAGS2_OCDSL (0x1<<14) +#define TFA98XX_STATUS_FLAGS2_OCDSL_POS 14 +#define TFA98XX_STATUS_FLAGS2_OCDSL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_OCDSL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_OCDSL_MSK 0x4000 + +/* + * flag_clip_left + */ +#define TFA98XX_STATUS_FLAGS2_CLIPSL (0x1<<15) +#define TFA98XX_STATUS_FLAGS2_CLIPSL_POS 15 +#define TFA98XX_STATUS_FLAGS2_CLIPSL_LEN 1 +#define TFA98XX_STATUS_FLAGS2_CLIPSL_MAX 1 +#define TFA98XX_STATUS_FLAGS2_CLIPSL_MSK 0x8000 + + +/* + * (0x13)-status_flags3 + */ + +/* + * flag_ocpokap_right + */ +#define TFA98XX_STATUS_FLAGS3_OCPOAPR (0x1<<0) +#define TFA98XX_STATUS_FLAGS3_OCPOAPR_POS 0 +#define TFA98XX_STATUS_FLAGS3_OCPOAPR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_OCPOAPR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_OCPOAPR_MSK 0x1 + +/* + * flag_ocpokan_right + */ +#define TFA98XX_STATUS_FLAGS3_OCPOANR (0x1<<1) +#define TFA98XX_STATUS_FLAGS3_OCPOANR_POS 1 +#define TFA98XX_STATUS_FLAGS3_OCPOANR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_OCPOANR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_OCPOANR_MSK 0x2 + +/* + * flag_ocpokbp_right + */ +#define TFA98XX_STATUS_FLAGS3_OCPOBPR (0x1<<2) +#define TFA98XX_STATUS_FLAGS3_OCPOBPR_POS 2 +#define TFA98XX_STATUS_FLAGS3_OCPOBPR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_OCPOBPR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_OCPOBPR_MSK 0x4 + +/* + * flag_ocpokbn_right + */ +#define TFA98XX_STATUS_FLAGS3_OCPOBNR (0x1<<3) +#define TFA98XX_STATUS_FLAGS3_OCPOBNR_POS 3 +#define TFA98XX_STATUS_FLAGS3_OCPOBNR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_OCPOBNR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_OCPOBNR_MSK 0x8 + +/* + * flag_clipa_high_right + */ +#define TFA98XX_STATUS_FLAGS3_CLIPAHR (0x1<<4) +#define TFA98XX_STATUS_FLAGS3_CLIPAHR_POS 4 +#define TFA98XX_STATUS_FLAGS3_CLIPAHR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_CLIPAHR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_CLIPAHR_MSK 0x10 + +/* + * flag_clipa_low_right + */ +#define TFA98XX_STATUS_FLAGS3_CLIPALR (0x1<<5) +#define TFA98XX_STATUS_FLAGS3_CLIPALR_POS 5 +#define TFA98XX_STATUS_FLAGS3_CLIPALR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_CLIPALR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_CLIPALR_MSK 0x20 + +/* + * flag_clipb_high_right + */ +#define TFA98XX_STATUS_FLAGS3_CLIPBHR (0x1<<6) +#define TFA98XX_STATUS_FLAGS3_CLIPBHR_POS 6 +#define TFA98XX_STATUS_FLAGS3_CLIPBHR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_CLIPBHR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_CLIPBHR_MSK 0x40 + +/* + * flag_clipb_low_right + */ +#define TFA98XX_STATUS_FLAGS3_CLIPBLR (0x1<<7) +#define TFA98XX_STATUS_FLAGS3_CLIPBLR_POS 7 +#define TFA98XX_STATUS_FLAGS3_CLIPBLR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_CLIPBLR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_CLIPBLR_MSK 0x80 + +/* + * flag_ocp_alarm_right + */ +#define TFA98XX_STATUS_FLAGS3_OCDSR (0x1<<8) +#define TFA98XX_STATUS_FLAGS3_OCDSR_POS 8 +#define TFA98XX_STATUS_FLAGS3_OCDSR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_OCDSR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_OCDSR_MSK 0x100 + +/* + * flag_clip_right + */ +#define TFA98XX_STATUS_FLAGS3_CLIPSR (0x1<<9) +#define TFA98XX_STATUS_FLAGS3_CLIPSR_POS 9 +#define TFA98XX_STATUS_FLAGS3_CLIPSR_LEN 1 +#define TFA98XX_STATUS_FLAGS3_CLIPSR_MAX 1 +#define TFA98XX_STATUS_FLAGS3_CLIPSR_MSK 0x200 + +/* + * flag_mic_ocpok + */ +#define TFA98XX_STATUS_FLAGS3_OCPOKMC (0x1<<10) +#define TFA98XX_STATUS_FLAGS3_OCPOKMC_POS 10 +#define TFA98XX_STATUS_FLAGS3_OCPOKMC_LEN 1 +#define TFA98XX_STATUS_FLAGS3_OCPOKMC_MAX 1 +#define TFA98XX_STATUS_FLAGS3_OCPOKMC_MSK 0x400 + +/* + * flag_man_alarm_state + */ +#define TFA98XX_STATUS_FLAGS3_MANALARM (0x1<<11) +#define TFA98XX_STATUS_FLAGS3_MANALARM_POS 11 +#define TFA98XX_STATUS_FLAGS3_MANALARM_LEN 1 +#define TFA98XX_STATUS_FLAGS3_MANALARM_MAX 1 +#define TFA98XX_STATUS_FLAGS3_MANALARM_MSK 0x800 + +/* + * flag_man_wait_src_settings + */ +#define TFA98XX_STATUS_FLAGS3_MANWAIT1 (0x1<<12) +#define TFA98XX_STATUS_FLAGS3_MANWAIT1_POS 12 +#define TFA98XX_STATUS_FLAGS3_MANWAIT1_LEN 1 +#define TFA98XX_STATUS_FLAGS3_MANWAIT1_MAX 1 +#define TFA98XX_STATUS_FLAGS3_MANWAIT1_MSK 0x1000 + +/* + * flag_man_wait_cf_config + */ +#define TFA98XX_STATUS_FLAGS3_MANWAIT2 (0x1<<13) +#define TFA98XX_STATUS_FLAGS3_MANWAIT2_POS 13 +#define TFA98XX_STATUS_FLAGS3_MANWAIT2_LEN 1 +#define TFA98XX_STATUS_FLAGS3_MANWAIT2_MAX 1 +#define TFA98XX_STATUS_FLAGS3_MANWAIT2_MSK 0x2000 + +/* + * flag_man_start_mute_audio + */ +#define TFA98XX_STATUS_FLAGS3_MANMUTE (0x1<<14) +#define TFA98XX_STATUS_FLAGS3_MANMUTE_POS 14 +#define TFA98XX_STATUS_FLAGS3_MANMUTE_LEN 1 +#define TFA98XX_STATUS_FLAGS3_MANMUTE_MAX 1 +#define TFA98XX_STATUS_FLAGS3_MANMUTE_MSK 0x4000 + +/* + * flag_man_operating_state + */ +#define TFA98XX_STATUS_FLAGS3_MANOPER (0x1<<15) +#define TFA98XX_STATUS_FLAGS3_MANOPER_POS 15 +#define TFA98XX_STATUS_FLAGS3_MANOPER_LEN 1 +#define TFA98XX_STATUS_FLAGS3_MANOPER_MAX 1 +#define TFA98XX_STATUS_FLAGS3_MANOPER_MSK 0x8000 + + +/* + * (0x14)-status_flags4 + */ + +/* + * flag_cf_speakererror_left + */ +#define TFA98XX_STATUS_FLAGS4_SPKSL (0x1<<0) +#define TFA98XX_STATUS_FLAGS4_SPKSL_POS 0 +#define TFA98XX_STATUS_FLAGS4_SPKSL_LEN 1 +#define TFA98XX_STATUS_FLAGS4_SPKSL_MAX 1 +#define TFA98XX_STATUS_FLAGS4_SPKSL_MSK 0x1 + +/* + * flag_cf_speakererror_right + */ +#define TFA98XX_STATUS_FLAGS4_SPKSR (0x1<<1) +#define TFA98XX_STATUS_FLAGS4_SPKSR_POS 1 +#define TFA98XX_STATUS_FLAGS4_SPKSR_LEN 1 +#define TFA98XX_STATUS_FLAGS4_SPKSR_MAX 1 +#define TFA98XX_STATUS_FLAGS4_SPKSR_MSK 0x2 + +/* + * flag_clk_out_of_range + */ +#define TFA98XX_STATUS_FLAGS4_CLKOOR (0x1<<2) +#define TFA98XX_STATUS_FLAGS4_CLKOOR_POS 2 +#define TFA98XX_STATUS_FLAGS4_CLKOOR_LEN 1 +#define TFA98XX_STATUS_FLAGS4_CLKOOR_MAX 1 +#define TFA98XX_STATUS_FLAGS4_CLKOOR_MSK 0x4 + +/* + * man_state + */ +#define TFA98XX_STATUS_FLAGS4_MANSTATE (0xf<<3) +#define TFA98XX_STATUS_FLAGS4_MANSTATE_POS 3 +#define TFA98XX_STATUS_FLAGS4_MANSTATE_LEN 4 +#define TFA98XX_STATUS_FLAGS4_MANSTATE_MAX 15 +#define TFA98XX_STATUS_FLAGS4_MANSTATE_MSK 0x78 + + +/* + * (0x15)-battery_voltage + */ + +/* + * bat_adc + */ +#define TFA98XX_BATTERY_VOLTAGE_BATS (0x3ff<<0) +#define TFA98XX_BATTERY_VOLTAGE_BATS_POS 0 +#define TFA98XX_BATTERY_VOLTAGE_BATS_LEN 10 +#define TFA98XX_BATTERY_VOLTAGE_BATS_MAX 1023 +#define TFA98XX_BATTERY_VOLTAGE_BATS_MSK 0x3ff + + +/* + * (0x16)-temperature + */ + +/* + * temp_adc + */ +#define TFA98XX_TEMPERATURE_TEMPS (0x1ff<<0) +#define TFA98XX_TEMPERATURE_TEMPS_POS 0 +#define TFA98XX_TEMPERATURE_TEMPS_LEN 9 +#define TFA98XX_TEMPERATURE_TEMPS_MAX 511 +#define TFA98XX_TEMPERATURE_TEMPS_MSK 0x1ff + + +/* + * (0x20)-tdm_config0 + */ + +/* + * tdm_usecase + */ +#define TFA98XX_TDM_CONFIG0_TDMUC (0xf<<0) +#define TFA98XX_TDM_CONFIG0_TDMUC_POS 0 +#define TFA98XX_TDM_CONFIG0_TDMUC_LEN 4 +#define TFA98XX_TDM_CONFIG0_TDMUC_MAX 15 +#define TFA98XX_TDM_CONFIG0_TDMUC_MSK 0xf + +/* + * tdm_enable + */ +#define TFA98XX_TDM_CONFIG0_TDME (0x1<<4) +#define TFA98XX_TDM_CONFIG0_TDME_POS 4 +#define TFA98XX_TDM_CONFIG0_TDME_LEN 1 +#define TFA98XX_TDM_CONFIG0_TDME_MAX 1 +#define TFA98XX_TDM_CONFIG0_TDME_MSK 0x10 + +/* + * tdm_mode + */ +#define TFA98XX_TDM_CONFIG0_TDMMODE (0x1<<5) +#define TFA98XX_TDM_CONFIG0_TDMMODE_POS 5 +#define TFA98XX_TDM_CONFIG0_TDMMODE_LEN 1 +#define TFA98XX_TDM_CONFIG0_TDMMODE_MAX 1 +#define TFA98XX_TDM_CONFIG0_TDMMODE_MSK 0x20 + +/* + * tdm_clk_inversion + */ +#define TFA98XX_TDM_CONFIG0_TDMCLINV (0x1<<6) +#define TFA98XX_TDM_CONFIG0_TDMCLINV_POS 6 +#define TFA98XX_TDM_CONFIG0_TDMCLINV_LEN 1 +#define TFA98XX_TDM_CONFIG0_TDMCLINV_MAX 1 +#define TFA98XX_TDM_CONFIG0_TDMCLINV_MSK 0x40 + +/* + * tdm_fs_ws_length + */ +#define TFA98XX_TDM_CONFIG0_TDMFSLN (0xf<<7) +#define TFA98XX_TDM_CONFIG0_TDMFSLN_POS 7 +#define TFA98XX_TDM_CONFIG0_TDMFSLN_LEN 4 +#define TFA98XX_TDM_CONFIG0_TDMFSLN_MAX 15 +#define TFA98XX_TDM_CONFIG0_TDMFSLN_MSK 0x780 + +/* + * tdm_fs_ws_polarity + */ +#define TFA98XX_TDM_CONFIG0_TDMFSPOL (0x1<<11) +#define TFA98XX_TDM_CONFIG0_TDMFSPOL_POS 11 +#define TFA98XX_TDM_CONFIG0_TDMFSPOL_LEN 1 +#define TFA98XX_TDM_CONFIG0_TDMFSPOL_MAX 1 +#define TFA98XX_TDM_CONFIG0_TDMFSPOL_MSK 0x800 + +/* + * tdm_nbck + */ +#define TFA98XX_TDM_CONFIG0_TDMNBCK (0xf<<12) +#define TFA98XX_TDM_CONFIG0_TDMNBCK_POS 12 +#define TFA98XX_TDM_CONFIG0_TDMNBCK_LEN 4 +#define TFA98XX_TDM_CONFIG0_TDMNBCK_MAX 15 +#define TFA98XX_TDM_CONFIG0_TDMNBCK_MSK 0xf000 + + +/* + * (0x21)-tdm_config1 + */ + +/* + * tdm_nb_of_slots + */ +#define TFA98XX_TDM_CONFIG1_TDMSLOTS (0xf<<0) +#define TFA98XX_TDM_CONFIG1_TDMSLOTS_POS 0 +#define TFA98XX_TDM_CONFIG1_TDMSLOTS_LEN 4 +#define TFA98XX_TDM_CONFIG1_TDMSLOTS_MAX 15 +#define TFA98XX_TDM_CONFIG1_TDMSLOTS_MSK 0xf + +/* + * tdm_slot_length + */ +#define TFA98XX_TDM_CONFIG1_TDMSLLN (0x1f<<4) +#define TFA98XX_TDM_CONFIG1_TDMSLLN_POS 4 +#define TFA98XX_TDM_CONFIG1_TDMSLLN_LEN 5 +#define TFA98XX_TDM_CONFIG1_TDMSLLN_MAX 31 +#define TFA98XX_TDM_CONFIG1_TDMSLLN_MSK 0x1f0 + +/* + * tdm_bits_remaining + */ +#define TFA98XX_TDM_CONFIG1_TDMBRMG (0x1f<<9) +#define TFA98XX_TDM_CONFIG1_TDMBRMG_POS 9 +#define TFA98XX_TDM_CONFIG1_TDMBRMG_LEN 5 +#define TFA98XX_TDM_CONFIG1_TDMBRMG_MAX 31 +#define TFA98XX_TDM_CONFIG1_TDMBRMG_MSK 0x3e00 + +/* + * tdm_data_delay + */ +#define TFA98XX_TDM_CONFIG1_TDMDEL (0x1<<14) +#define TFA98XX_TDM_CONFIG1_TDMDEL_POS 14 +#define TFA98XX_TDM_CONFIG1_TDMDEL_LEN 1 +#define TFA98XX_TDM_CONFIG1_TDMDEL_MAX 1 +#define TFA98XX_TDM_CONFIG1_TDMDEL_MSK 0x4000 + +/* + * tdm_data_adjustment + */ +#define TFA98XX_TDM_CONFIG1_TDMADJ (0x1<<15) +#define TFA98XX_TDM_CONFIG1_TDMADJ_POS 15 +#define TFA98XX_TDM_CONFIG1_TDMADJ_LEN 1 +#define TFA98XX_TDM_CONFIG1_TDMADJ_MAX 1 +#define TFA98XX_TDM_CONFIG1_TDMADJ_MSK 0x8000 + + +/* + * (0x22)-tdm_config2 + */ + +/* + * tdm_audio_sample_compression + */ +#define TFA98XX_TDM_CONFIG2_TDMOOMP (0x3<<0) +#define TFA98XX_TDM_CONFIG2_TDMOOMP_POS 0 +#define TFA98XX_TDM_CONFIG2_TDMOOMP_LEN 2 +#define TFA98XX_TDM_CONFIG2_TDMOOMP_MAX 3 +#define TFA98XX_TDM_CONFIG2_TDMOOMP_MSK 0x3 + +/* + * tdm_sample_size + */ +#define TFA98XX_TDM_CONFIG2_TDMSSIZE (0x1f<<2) +#define TFA98XX_TDM_CONFIG2_TDMSSIZE_POS 2 +#define TFA98XX_TDM_CONFIG2_TDMSSIZE_LEN 5 +#define TFA98XX_TDM_CONFIG2_TDMSSIZE_MAX 31 +#define TFA98XX_TDM_CONFIG2_TDMSSIZE_MSK 0x7c + +/* + * tdm_txdata_format + */ +#define TFA98XX_TDM_CONFIG2_TDMTXDFO (0x3<<7) +#define TFA98XX_TDM_CONFIG2_TDMTXDFO_POS 7 +#define TFA98XX_TDM_CONFIG2_TDMTXDFO_LEN 2 +#define TFA98XX_TDM_CONFIG2_TDMTXDFO_MAX 3 +#define TFA98XX_TDM_CONFIG2_TDMTXDFO_MSK 0x180 + +/* + * tdm_txdata_format_unused_slot_sd0 + */ +#define TFA98XX_TDM_CONFIG2_TDMTXUS0 (0x3<<9) +#define TFA98XX_TDM_CONFIG2_TDMTXUS0_POS 9 +#define TFA98XX_TDM_CONFIG2_TDMTXUS0_LEN 2 +#define TFA98XX_TDM_CONFIG2_TDMTXUS0_MAX 3 +#define TFA98XX_TDM_CONFIG2_TDMTXUS0_MSK 0x600 + +/* + * tdm_txdata_format_unused_slot_sd1 + */ +#define TFA98XX_TDM_CONFIG2_TDMTXUS1 (0x3<<11) +#define TFA98XX_TDM_CONFIG2_TDMTXUS1_POS 11 +#define TFA98XX_TDM_CONFIG2_TDMTXUS1_LEN 2 +#define TFA98XX_TDM_CONFIG2_TDMTXUS1_MAX 3 +#define TFA98XX_TDM_CONFIG2_TDMTXUS1_MSK 0x1800 + +/* + * tdm_txdata_format_unused_slot_sd2 + */ +#define TFA98XX_TDM_CONFIG2_TDMTXUS2 (0x3<<13) +#define TFA98XX_TDM_CONFIG2_TDMTXUS2_POS 13 +#define TFA98XX_TDM_CONFIG2_TDMTXUS2_LEN 2 +#define TFA98XX_TDM_CONFIG2_TDMTXUS2_MAX 3 +#define TFA98XX_TDM_CONFIG2_TDMTXUS2_MSK 0x6000 + + +/* + * (0x23)-tdm_config3 + */ + +/* + * tdm_sink1_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMLE (0x1<<1) +#define TFA98XX_TDM_CONFIG3_TDMLE_POS 1 +#define TFA98XX_TDM_CONFIG3_TDMLE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMLE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMLE_MSK 0x2 + +/* + * tdm_sink2_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMRE (0x1<<2) +#define TFA98XX_TDM_CONFIG3_TDMRE_POS 2 +#define TFA98XX_TDM_CONFIG3_TDMRE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMRE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMRE_MSK 0x4 + +/* + * tdm_source1_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMVSRE (0x1<<4) +#define TFA98XX_TDM_CONFIG3_TDMVSRE_POS 4 +#define TFA98XX_TDM_CONFIG3_TDMVSRE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMVSRE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMVSRE_MSK 0x10 + +/* + * tdm_source2_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMCSRE (0x1<<5) +#define TFA98XX_TDM_CONFIG3_TDMCSRE_POS 5 +#define TFA98XX_TDM_CONFIG3_TDMCSRE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMCSRE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMCSRE_MSK 0x20 + +/* + * tdm_source3_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMVSLE (0x1<<6) +#define TFA98XX_TDM_CONFIG3_TDMVSLE_POS 6 +#define TFA98XX_TDM_CONFIG3_TDMVSLE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMVSLE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMVSLE_MSK 0x40 + +/* + * tdm_source4_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMCSLE (0x1<<7) +#define TFA98XX_TDM_CONFIG3_TDMCSLE_POS 7 +#define TFA98XX_TDM_CONFIG3_TDMCSLE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMCSLE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMCSLE_MSK 0x80 + +/* + * tdm_source5_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMCFRE (0x1<<8) +#define TFA98XX_TDM_CONFIG3_TDMCFRE_POS 8 +#define TFA98XX_TDM_CONFIG3_TDMCFRE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMCFRE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMCFRE_MSK 0x100 + +/* + * tdm_source6_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMCFLE (0x1<<9) +#define TFA98XX_TDM_CONFIG3_TDMCFLE_POS 9 +#define TFA98XX_TDM_CONFIG3_TDMCFLE_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMCFLE_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMCFLE_MSK 0x200 + +/* + * tdm_source7_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMCF3E (0x1<<10) +#define TFA98XX_TDM_CONFIG3_TDMCF3E_POS 10 +#define TFA98XX_TDM_CONFIG3_TDMCF3E_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMCF3E_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMCF3E_MSK 0x400 + +/* + * tdm_source8_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMCF4E (0x1<<11) +#define TFA98XX_TDM_CONFIG3_TDMCF4E_POS 11 +#define TFA98XX_TDM_CONFIG3_TDMCF4E_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMCF4E_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMCF4E_MSK 0x800 + +/* + * tdm_source9_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMPD1E (0x1<<12) +#define TFA98XX_TDM_CONFIG3_TDMPD1E_POS 12 +#define TFA98XX_TDM_CONFIG3_TDMPD1E_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMPD1E_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMPD1E_MSK 0x1000 + +/* + * tdm_source10_enable + */ +#define TFA98XX_TDM_CONFIG3_TDMPD2E (0x1<<13) +#define TFA98XX_TDM_CONFIG3_TDMPD2E_POS 13 +#define TFA98XX_TDM_CONFIG3_TDMPD2E_LEN 1 +#define TFA98XX_TDM_CONFIG3_TDMPD2E_MAX 1 +#define TFA98XX_TDM_CONFIG3_TDMPD2E_MSK 0x2000 + + +/* + * (0x24)-tdm_config4 + */ + +/* + * tdm_sink1_io + */ +#define TFA98XX_TDM_CONFIG4_TDMLIO (0x3<<2) +#define TFA98XX_TDM_CONFIG4_TDMLIO_POS 2 +#define TFA98XX_TDM_CONFIG4_TDMLIO_LEN 2 +#define TFA98XX_TDM_CONFIG4_TDMLIO_MAX 3 +#define TFA98XX_TDM_CONFIG4_TDMLIO_MSK 0xc + +/* + * tdm_sink2_io + */ +#define TFA98XX_TDM_CONFIG4_TDMRIO (0x3<<4) +#define TFA98XX_TDM_CONFIG4_TDMRIO_POS 4 +#define TFA98XX_TDM_CONFIG4_TDMRIO_LEN 2 +#define TFA98XX_TDM_CONFIG4_TDMRIO_MAX 3 +#define TFA98XX_TDM_CONFIG4_TDMRIO_MSK 0x30 + +/* + * tdm_source1_io + */ +#define TFA98XX_TDM_CONFIG4_TDMVSRIO (0x3<<8) +#define TFA98XX_TDM_CONFIG4_TDMVSRIO_POS 8 +#define TFA98XX_TDM_CONFIG4_TDMVSRIO_LEN 2 +#define TFA98XX_TDM_CONFIG4_TDMVSRIO_MAX 3 +#define TFA98XX_TDM_CONFIG4_TDMVSRIO_MSK 0x300 + +/* + * tdm_source2_io + */ +#define TFA98XX_TDM_CONFIG4_TDMCSRIO (0x3<<10) +#define TFA98XX_TDM_CONFIG4_TDMCSRIO_POS 10 +#define TFA98XX_TDM_CONFIG4_TDMCSRIO_LEN 2 +#define TFA98XX_TDM_CONFIG4_TDMCSRIO_MAX 3 +#define TFA98XX_TDM_CONFIG4_TDMCSRIO_MSK 0xc00 + +/* + * tdm_source3_io + */ +#define TFA98XX_TDM_CONFIG4_TDMVSLIO (0x3<<12) +#define TFA98XX_TDM_CONFIG4_TDMVSLIO_POS 12 +#define TFA98XX_TDM_CONFIG4_TDMVSLIO_LEN 2 +#define TFA98XX_TDM_CONFIG4_TDMVSLIO_MAX 3 +#define TFA98XX_TDM_CONFIG4_TDMVSLIO_MSK 0x3000 + +/* + * tdm_source4_io + */ +#define TFA98XX_TDM_CONFIG4_TDMCSLIO (0x3<<14) +#define TFA98XX_TDM_CONFIG4_TDMCSLIO_POS 14 +#define TFA98XX_TDM_CONFIG4_TDMCSLIO_LEN 2 +#define TFA98XX_TDM_CONFIG4_TDMCSLIO_MAX 3 +#define TFA98XX_TDM_CONFIG4_TDMCSLIO_MSK 0xc000 + + +/* + * (0x25)-tdm_config5 + */ + +/* + * tdm_source5_io + */ +#define TFA98XX_TDM_CONFIG5_TDMCFRIO (0x3<<0) +#define TFA98XX_TDM_CONFIG5_TDMCFRIO_POS 0 +#define TFA98XX_TDM_CONFIG5_TDMCFRIO_LEN 2 +#define TFA98XX_TDM_CONFIG5_TDMCFRIO_MAX 3 +#define TFA98XX_TDM_CONFIG5_TDMCFRIO_MSK 0x3 + +/* + * tdm_source6_io + */ +#define TFA98XX_TDM_CONFIG5_TDMCFLIO (0x3<<2) +#define TFA98XX_TDM_CONFIG5_TDMCFLIO_POS 2 +#define TFA98XX_TDM_CONFIG5_TDMCFLIO_LEN 2 +#define TFA98XX_TDM_CONFIG5_TDMCFLIO_MAX 3 +#define TFA98XX_TDM_CONFIG5_TDMCFLIO_MSK 0xc + +/* + * tdm_source7_io + */ +#define TFA98XX_TDM_CONFIG5_TDMCF3IO (0x3<<4) +#define TFA98XX_TDM_CONFIG5_TDMCF3IO_POS 4 +#define TFA98XX_TDM_CONFIG5_TDMCF3IO_LEN 2 +#define TFA98XX_TDM_CONFIG5_TDMCF3IO_MAX 3 +#define TFA98XX_TDM_CONFIG5_TDMCF3IO_MSK 0x30 + +/* + * tdm_source8_io + */ +#define TFA98XX_TDM_CONFIG5_TDMCF4IO (0x3<<6) +#define TFA98XX_TDM_CONFIG5_TDMCF4IO_POS 6 +#define TFA98XX_TDM_CONFIG5_TDMCF4IO_LEN 2 +#define TFA98XX_TDM_CONFIG5_TDMCF4IO_MAX 3 +#define TFA98XX_TDM_CONFIG5_TDMCF4IO_MSK 0xc0 + +/* + * tdm_source9_io + */ +#define TFA98XX_TDM_CONFIG5_TDMPD1IO (0x3<<8) +#define TFA98XX_TDM_CONFIG5_TDMPD1IO_POS 8 +#define TFA98XX_TDM_CONFIG5_TDMPD1IO_LEN 2 +#define TFA98XX_TDM_CONFIG5_TDMPD1IO_MAX 3 +#define TFA98XX_TDM_CONFIG5_TDMPD1IO_MSK 0x300 + +/* + * tdm_source10_io + */ +#define TFA98XX_TDM_CONFIG5_TDMPD2IO (0x3<<10) +#define TFA98XX_TDM_CONFIG5_TDMPD2IO_POS 10 +#define TFA98XX_TDM_CONFIG5_TDMPD2IO_LEN 2 +#define TFA98XX_TDM_CONFIG5_TDMPD2IO_MAX 3 +#define TFA98XX_TDM_CONFIG5_TDMPD2IO_MSK 0xc00 + + +/* + * (0x26)-tdm_config6 + */ + +/* + * tdm_sink1_slot + */ +#define TFA98XX_TDM_CONFIG6_TDMLS (0xf<<4) +#define TFA98XX_TDM_CONFIG6_TDMLS_POS 4 +#define TFA98XX_TDM_CONFIG6_TDMLS_LEN 4 +#define TFA98XX_TDM_CONFIG6_TDMLS_MAX 15 +#define TFA98XX_TDM_CONFIG6_TDMLS_MSK 0xf0 + +/* + * tdm_sink2_slot + */ +#define TFA98XX_TDM_CONFIG6_TDMRS (0xf<<8) +#define TFA98XX_TDM_CONFIG6_TDMRS_POS 8 +#define TFA98XX_TDM_CONFIG6_TDMRS_LEN 4 +#define TFA98XX_TDM_CONFIG6_TDMRS_MAX 15 +#define TFA98XX_TDM_CONFIG6_TDMRS_MSK 0xf00 + + +/* + * (0x27)-tdm_config7 + */ + +/* + * tdm_source1_slot + */ +#define TFA98XX_TDM_CONFIG7_TDMVSRS (0xf<<0) +#define TFA98XX_TDM_CONFIG7_TDMVSRS_POS 0 +#define TFA98XX_TDM_CONFIG7_TDMVSRS_LEN 4 +#define TFA98XX_TDM_CONFIG7_TDMVSRS_MAX 15 +#define TFA98XX_TDM_CONFIG7_TDMVSRS_MSK 0xf + +/* + * tdm_source2_slot + */ +#define TFA98XX_TDM_CONFIG7_TDMCSRS (0xf<<4) +#define TFA98XX_TDM_CONFIG7_TDMCSRS_POS 4 +#define TFA98XX_TDM_CONFIG7_TDMCSRS_LEN 4 +#define TFA98XX_TDM_CONFIG7_TDMCSRS_MAX 15 +#define TFA98XX_TDM_CONFIG7_TDMCSRS_MSK 0xf0 + +/* + * tdm_source3_slot + */ +#define TFA98XX_TDM_CONFIG7_TDMVSLS (0xf<<8) +#define TFA98XX_TDM_CONFIG7_TDMVSLS_POS 8 +#define TFA98XX_TDM_CONFIG7_TDMVSLS_LEN 4 +#define TFA98XX_TDM_CONFIG7_TDMVSLS_MAX 15 +#define TFA98XX_TDM_CONFIG7_TDMVSLS_MSK 0xf00 + +/* + * tdm_source4_slot + */ +#define TFA98XX_TDM_CONFIG7_TDMCSLS (0xf<<12) +#define TFA98XX_TDM_CONFIG7_TDMCSLS_POS 12 +#define TFA98XX_TDM_CONFIG7_TDMCSLS_LEN 4 +#define TFA98XX_TDM_CONFIG7_TDMCSLS_MAX 15 +#define TFA98XX_TDM_CONFIG7_TDMCSLS_MSK 0xf000 + + +/* + * (0x28)-tdm_config8 + */ + +/* + * tdm_source5_slot + */ +#define TFA98XX_TDM_CONFIG8_TDMCFRS (0xf<<0) +#define TFA98XX_TDM_CONFIG8_TDMCFRS_POS 0 +#define TFA98XX_TDM_CONFIG8_TDMCFRS_LEN 4 +#define TFA98XX_TDM_CONFIG8_TDMCFRS_MAX 15 +#define TFA98XX_TDM_CONFIG8_TDMCFRS_MSK 0xf + +/* + * tdm_source6_slot + */ +#define TFA98XX_TDM_CONFIG8_TDMCFLS (0xf<<4) +#define TFA98XX_TDM_CONFIG8_TDMCFLS_POS 4 +#define TFA98XX_TDM_CONFIG8_TDMCFLS_LEN 4 +#define TFA98XX_TDM_CONFIG8_TDMCFLS_MAX 15 +#define TFA98XX_TDM_CONFIG8_TDMCFLS_MSK 0xf0 + +/* + * tdm_source7_slot + */ +#define TFA98XX_TDM_CONFIG8_TDMCF3S (0xf<<8) +#define TFA98XX_TDM_CONFIG8_TDMCF3S_POS 8 +#define TFA98XX_TDM_CONFIG8_TDMCF3S_LEN 4 +#define TFA98XX_TDM_CONFIG8_TDMCF3S_MAX 15 +#define TFA98XX_TDM_CONFIG8_TDMCF3S_MSK 0xf00 + +/* + * tdm_source8_slot + */ +#define TFA98XX_TDM_CONFIG8_TDMCF4S (0xf<<12) +#define TFA98XX_TDM_CONFIG8_TDMCF4S_POS 12 +#define TFA98XX_TDM_CONFIG8_TDMCF4S_LEN 4 +#define TFA98XX_TDM_CONFIG8_TDMCF4S_MAX 15 +#define TFA98XX_TDM_CONFIG8_TDMCF4S_MSK 0xf000 + + +/* + * (0x29)-tdm_config9 + */ + +/* + * tdm_source9_slot + */ +#define TFA98XX_TDM_CONFIG9_TDMPD1S (0xf<<0) +#define TFA98XX_TDM_CONFIG9_TDMPD1S_POS 0 +#define TFA98XX_TDM_CONFIG9_TDMPD1S_LEN 4 +#define TFA98XX_TDM_CONFIG9_TDMPD1S_MAX 15 +#define TFA98XX_TDM_CONFIG9_TDMPD1S_MSK 0xf + +/* + * tdm_source10_slot + */ +#define TFA98XX_TDM_CONFIG9_TDMPD2S (0xf<<4) +#define TFA98XX_TDM_CONFIG9_TDMPD2S_POS 4 +#define TFA98XX_TDM_CONFIG9_TDMPD2S_LEN 4 +#define TFA98XX_TDM_CONFIG9_TDMPD2S_MAX 15 +#define TFA98XX_TDM_CONFIG9_TDMPD2S_MSK 0xf0 + + +/* + * (0x31)-pdm_config0 + */ + +/* + * pdm_mode + */ +#define TFA98XX_PDM_CONFIG0_PDMSM (0x1<<0) +#define TFA98XX_PDM_CONFIG0_PDMSM_POS 0 +#define TFA98XX_PDM_CONFIG0_PDMSM_LEN 1 +#define TFA98XX_PDM_CONFIG0_PDMSM_MAX 1 +#define TFA98XX_PDM_CONFIG0_PDMSM_MSK 0x1 + +/* + * pdm_side_tone_sel + */ +#define TFA98XX_PDM_CONFIG0_PDMSTSEL (0x3<<1) +#define TFA98XX_PDM_CONFIG0_PDMSTSEL_POS 1 +#define TFA98XX_PDM_CONFIG0_PDMSTSEL_LEN 2 +#define TFA98XX_PDM_CONFIG0_PDMSTSEL_MAX 3 +#define TFA98XX_PDM_CONFIG0_PDMSTSEL_MSK 0x6 + +/* + * pdm_left_sel + */ +#define TFA98XX_PDM_CONFIG0_PDMLSEL (0x1<<3) +#define TFA98XX_PDM_CONFIG0_PDMLSEL_POS 3 +#define TFA98XX_PDM_CONFIG0_PDMLSEL_LEN 1 +#define TFA98XX_PDM_CONFIG0_PDMLSEL_MAX 1 +#define TFA98XX_PDM_CONFIG0_PDMLSEL_MSK 0x8 + +/* + * pdm_right_sel + */ +#define TFA98XX_PDM_CONFIG0_PDMRSEL (0x1<<4) +#define TFA98XX_PDM_CONFIG0_PDMRSEL_POS 4 +#define TFA98XX_PDM_CONFIG0_PDMRSEL_LEN 1 +#define TFA98XX_PDM_CONFIG0_PDMRSEL_MAX 1 +#define TFA98XX_PDM_CONFIG0_PDMRSEL_MSK 0x10 + +/* + * enbl_micvdd + */ +#define TFA98XX_PDM_CONFIG0_MICVDDE (0x1<<5) +#define TFA98XX_PDM_CONFIG0_MICVDDE_POS 5 +#define TFA98XX_PDM_CONFIG0_MICVDDE_LEN 1 +#define TFA98XX_PDM_CONFIG0_MICVDDE_MAX 1 +#define TFA98XX_PDM_CONFIG0_MICVDDE_MSK 0x20 + + +/* + * (0x32)-pdm_config1 + */ + +/* + * pdm_nbck + */ +#define TFA98XX_PDM_CONFIG1_PDMCLRAT (0x3<<0) +#define TFA98XX_PDM_CONFIG1_PDMCLRAT_POS 0 +#define TFA98XX_PDM_CONFIG1_PDMCLRAT_LEN 2 +#define TFA98XX_PDM_CONFIG1_PDMCLRAT_MAX 3 +#define TFA98XX_PDM_CONFIG1_PDMCLRAT_MSK 0x3 + +/* + * pdm_gain + */ +#define TFA98XX_PDM_CONFIG1_PDMGAIN (0xf<<2) +#define TFA98XX_PDM_CONFIG1_PDMGAIN_POS 2 +#define TFA98XX_PDM_CONFIG1_PDMGAIN_LEN 4 +#define TFA98XX_PDM_CONFIG1_PDMGAIN_MAX 15 +#define TFA98XX_PDM_CONFIG1_PDMGAIN_MSK 0x3c + +/* + * sel_pdm_out_data + */ +#define TFA98XX_PDM_CONFIG1_PDMOSEL (0xf<<6) +#define TFA98XX_PDM_CONFIG1_PDMOSEL_POS 6 +#define TFA98XX_PDM_CONFIG1_PDMOSEL_LEN 4 +#define TFA98XX_PDM_CONFIG1_PDMOSEL_MAX 15 +#define TFA98XX_PDM_CONFIG1_PDMOSEL_MSK 0x3c0 + +/* + * sel_cf_haptic_data + */ +#define TFA98XX_PDM_CONFIG1_SELCFHAPD (0x1<<10) +#define TFA98XX_PDM_CONFIG1_SELCFHAPD_POS 10 +#define TFA98XX_PDM_CONFIG1_SELCFHAPD_LEN 1 +#define TFA98XX_PDM_CONFIG1_SELCFHAPD_MAX 1 +#define TFA98XX_PDM_CONFIG1_SELCFHAPD_MSK 0x400 + + +/* + * (0x33)-haptic_driver_config + */ + +/* + * haptic_duration + */ +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME (0xff<<0) +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_POS 0 +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_LEN 8 +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_MAX 255 +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_MSK 0xff + +/* + * haptic_data + */ +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL (0xff<<8) +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_POS 8 +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_LEN 8 +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_MAX 255 +#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_MSK 0xff00 + + +/* + * (0x34)-gpio_datain_reg + */ + +/* + * gpio_datain + */ +#define TFA98XX_GPIO_DATAIN_REG_GPIODIN (0xf<<0) +#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_POS 0 +#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_LEN 4 +#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_MAX 15 +#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_MSK 0xf + + +/* + * (0x35)-gpio_config + */ + +/* + * gpio_ctrl + */ +#define TFA98XX_GPIO_CONFIG_GPIOCTRL (0x1<<0) +#define TFA98XX_GPIO_CONFIG_GPIOCTRL_POS 0 +#define TFA98XX_GPIO_CONFIG_GPIOCTRL_LEN 1 +#define TFA98XX_GPIO_CONFIG_GPIOCTRL_MAX 1 +#define TFA98XX_GPIO_CONFIG_GPIOCTRL_MSK 0x1 + +/* + * gpio_dir + */ +#define TFA98XX_GPIO_CONFIG_GPIOCONF (0xf<<1) +#define TFA98XX_GPIO_CONFIG_GPIOCONF_POS 1 +#define TFA98XX_GPIO_CONFIG_GPIOCONF_LEN 4 +#define TFA98XX_GPIO_CONFIG_GPIOCONF_MAX 15 +#define TFA98XX_GPIO_CONFIG_GPIOCONF_MSK 0x1e + +/* + * gpio_dataout + */ +#define TFA98XX_GPIO_CONFIG_GPIODOUT (0xf<<5) +#define TFA98XX_GPIO_CONFIG_GPIODOUT_POS 5 +#define TFA98XX_GPIO_CONFIG_GPIODOUT_LEN 4 +#define TFA98XX_GPIO_CONFIG_GPIODOUT_MAX 15 +#define TFA98XX_GPIO_CONFIG_GPIODOUT_MSK 0x1e0 + + +/* + * (0x40)-interrupt_out_reg1 + */ + +/* + * int_out_flag_por + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS (0x1<<0) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_POS 0 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_MSK 0x1 + +/* + * int_out_flag_pll_lock + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS (0x1<<1) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_POS 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_MSK 0x2 + +/* + * int_out_flag_otpok + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS (0x1<<2) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_POS 2 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_MSK 0x4 + +/* + * int_out_flag_ovpok + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS (0x1<<3) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_POS 3 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_MSK 0x8 + +/* + * int_out_flag_uvpok + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS (0x1<<4) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_POS 4 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_MSK 0x10 + +/* + * int_out_flag_clocks_stable + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS (0x1<<5) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_POS 5 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_MSK 0x20 + +/* + * int_out_flag_mtp_busy + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB (0x1<<6) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_POS 6 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_MSK 0x40 + +/* + * int_out_flag_lost_clk + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK (0x1<<7) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_POS 7 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_MSK 0x80 + +/* + * int_out_flag_cf_speakererror + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS (0x1<<8) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_POS 8 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_MSK 0x100 + +/* + * int_out_flag_cold_started + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS (0x1<<9) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_POS 9 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_MSK 0x200 + +/* + * int_out_flag_engage + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS (0x1<<10) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_POS 10 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_MSK 0x400 + +/* + * int_out_flag_watchdog_reset + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS (0x1<<11) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_POS 11 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_MSK 0x800 + +/* + * int_out_flag_enbl_amp + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS (0x1<<12) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_POS 12 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_MSK 0x1000 + +/* + * int_out_flag_enbl_ref + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS (0x1<<13) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_POS 13 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_MSK 0x2000 + +/* + * int_out_flag_adc10_ready + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR (0x1<<14) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_POS 14 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_MSK 0x4000 + +/* + * int_out_flag_bod_vddd_nok + */ +#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK (0x1<<15) +#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_POS 15 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_MSK 0x8000 + + +/* + * (0x41)-interrupt_out_reg2 + */ + +/* + * int_out_flag_bst_bstcur + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU (0x1<<0) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_POS 0 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_MSK 0x1 + +/* + * int_out_flag_bst_hiz + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI (0x1<<1) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_POS 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_MSK 0x2 + +/* + * int_out_flag_bst_ocpok + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC (0x1<<2) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_POS 2 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_MSK 0x4 + +/* + * int_out_flag_bst_peakcur + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR (0x1<<3) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_POS 3 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_MSK 0x8 + +/* + * int_out_flag_bst_voutcomp + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC (0x1<<4) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_POS 4 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_MSK 0x10 + +/* + * int_out_flag_bst_voutcomp86 + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86 (0x1<<5) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_POS 5 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_MSK 0x20 + +/* + * int_out_flag_bst_voutcomp93 + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93 (0x1<<6) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_POS 6 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_MSK 0x40 + +/* + * int_out_flag_rcvldop_ready + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD (0x1<<7) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_POS 7 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_MSK 0x80 + +/* + * int_out_flag_ocp_alarm_left + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL (0x1<<8) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_POS 8 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_MSK 0x100 + +/* + * int_out_flag_ocp_alarm_right + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR (0x1<<9) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_POS 9 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_MSK 0x200 + +/* + * int_out_flag_man_wait_src_settings + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC (0x1<<10) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_POS 10 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_MSK 0x400 + +/* + * int_out_flag_man_wait_cf_config + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC (0x1<<11) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_POS 11 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_MSK 0x800 + +/* + * int_out_flag_man_start_mute_audio + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU (0x1<<12) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_POS 12 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_MSK 0x1000 + +/* + * int_out_flag_cfma_err + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER (0x1<<13) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_POS 13 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_MSK 0x2000 + +/* + * int_out_flag_cfma_ack + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC (0x1<<14) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_POS 14 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_MSK 0x4000 + +/* + * int_out_flag_clk_out_of_range + */ +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR (0x1<<15) +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_POS 15 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_MSK 0x8000 + + +/* + * (0x42)-interrupt_out_reg3 + */ + +/* + * int_out_flag_tdm_error + */ +#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER (0x1<<0) +#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_POS 0 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_MSK 0x1 + +/* + * int_out_flag_clip_left + */ +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL (0x1<<1) +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_POS 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_MSK 0x2 + +/* + * int_out_flag_clip_right + */ +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR (0x1<<2) +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_POS 2 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_MSK 0x4 + +/* + * int_out_flag_mic_ocpok + */ +#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM (0x1<<3) +#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_POS 3 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_LEN 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_MAX 1 +#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_MSK 0x8 + + +/* + * (0x44)-interrupt_in_reg1 + */ + +/* + * int_in_flag_por + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS (0x1<<0) +#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_POS 0 +#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_MSK 0x1 + +/* + * int_in_flag_pll_lock + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS (0x1<<1) +#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_POS 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_MSK 0x2 + +/* + * int_in_flag_otpok + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS (0x1<<2) +#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_POS 2 +#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_MSK 0x4 + +/* + * int_in_flag_ovpok + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS (0x1<<3) +#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_POS 3 +#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_MSK 0x8 + +/* + * int_in_flag_uvpok + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS (0x1<<4) +#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_POS 4 +#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_MSK 0x10 + +/* + * int_in_flag_clocks_stable + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS (0x1<<5) +#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_POS 5 +#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_MSK 0x20 + +/* + * int_in_flag_mtp_busy + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB (0x1<<6) +#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_POS 6 +#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_MSK 0x40 + +/* + * int_in_flag_lost_clk + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK (0x1<<7) +#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_POS 7 +#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_MSK 0x80 + +/* + * int_in_flag_cf_speakererror + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS (0x1<<8) +#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_POS 8 +#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_MSK 0x100 + +/* + * int_in_flag_cold_started + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLACS (0x1<<9) +#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_POS 9 +#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_MSK 0x200 + +/* + * int_in_flag_engage + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS (0x1<<10) +#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_POS 10 +#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_MSK 0x400 + +/* + * int_in_flag_watchdog_reset + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS (0x1<<11) +#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_POS 11 +#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_MSK 0x800 + +/* + * int_in_flag_enbl_amp + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS (0x1<<12) +#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_POS 12 +#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_MSK 0x1000 + +/* + * int_in_flag_enbl_ref + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS (0x1<<13) +#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_POS 13 +#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_MSK 0x2000 + +/* + * int_in_flag_adc10_ready + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR (0x1<<14) +#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_POS 14 +#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_MSK 0x4000 + +/* + * int_in_flag_bod_vddd_nok + */ +#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK (0x1<<15) +#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_POS 15 +#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_MSK 0x8000 + + +/* + * (0x45)-interrupt_in_reg2 + */ + +/* + * int_in_flag_bst_bstcur + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU (0x1<<0) +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_POS 0 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_MSK 0x1 + +/* + * int_in_flag_bst_hiz + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI (0x1<<1) +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_POS 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_MSK 0x2 + +/* + * int_in_flag_bst_ocpok + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC (0x1<<2) +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_POS 2 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_MSK 0x4 + +/* + * int_in_flag_bst_peakcur + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC (0x1<<3) +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_POS 3 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_MSK 0x8 + +/* + * int_in_flag_bst_voutcomp + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC (0x1<<4) +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_POS 4 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_MSK 0x10 + +/* + * int_in_flag_bst_voutcomp86 + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86 (0x1<<5) +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_POS 5 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_MSK 0x20 + +/* + * int_in_flag_bst_voutcomp93 + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93 (0x1<<6) +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_POS 6 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_MSK 0x40 + +/* + * int_in_flag_rcvldop_ready + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD (0x1<<7) +#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_POS 7 +#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_MSK 0x80 + +/* + * int_in_flag_ocp_alarm_left + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL (0x1<<8) +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_POS 8 +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_MSK 0x100 + +/* + * int_in_flag_ocp_alarm_right + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR (0x1<<9) +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_POS 9 +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_MSK 0x200 + +/* + * int_in_flag_man_wait_src_settings + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC (0x1<<10) +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_POS 10 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_MSK 0x400 + +/* + * int_in_flag_man_wait_cf_config + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC (0x1<<11) +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_POS 11 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_MSK 0x800 + +/* + * int_in_flag_man_start_mute_audio + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU (0x1<<12) +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_POS 12 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_MSK 0x1000 + +/* + * int_in_flag_cfma_err + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER (0x1<<13) +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_POS 13 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_MSK 0x2000 + +/* + * int_in_flag_cfma_ack + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC (0x1<<14) +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_POS 14 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_MSK 0x4000 + +/* + * int_in_flag_clk_out_of_range + */ +#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR (0x1<<15) +#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_POS 15 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_MSK 0x8000 + + +/* + * (0x46)-interrupt_in_reg3 + */ + +/* + * int_in_flag_tdm_error + */ +#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER (0x1<<0) +#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_POS 0 +#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_MSK 0x1 + +/* + * int_in_flag_clip_left + */ +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL (0x1<<1) +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_POS 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_MSK 0x2 + +/* + * int_in_flag_clip_right + */ +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR (0x1<<2) +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_POS 2 +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_MSK 0x4 + +/* + * int_in_flag_mic_ocpok + */ +#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM (0x1<<3) +#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_POS 3 +#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_LEN 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_MAX 1 +#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_MSK 0x8 + + +/* + * (0x48)-interrupt_enable_reg1 + */ + +/* + * int_enable_flag_por + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS (0x1<<0) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_POS 0 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_MSK 0x1 + +/* + * int_enable_flag_pll_lock + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS (0x1<<1) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_POS 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_MSK 0x2 + +/* + * int_enable_flag_otpok + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS (0x1<<2) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_POS 2 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_MSK 0x4 + +/* + * int_enable_flag_ovpok + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS (0x1<<3) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_POS 3 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_MSK 0x8 + +/* + * int_enable_flag_uvpok + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS (0x1<<4) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_POS 4 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_MSK 0x10 + +/* + * int_enable_flag_clocks_stable + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS (0x1<<5) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_POS 5 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_MSK 0x20 + +/* + * int_enable_flag_mtp_busy + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB (0x1<<6) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_POS 6 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_MSK 0x40 + +/* + * int_enable_flag_lost_clk + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK (0x1<<7) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_POS 7 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_MSK 0x80 + +/* + * int_enable_flag_cf_speakererror + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS (0x1<<8) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_POS 8 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_MSK 0x100 + +/* + * int_enable_flag_cold_started + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS (0x1<<9) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_POS 9 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_MSK 0x200 + +/* + * int_enable_flag_engage + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS (0x1<<10) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_POS 10 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_MSK 0x400 + +/* + * int_enable_flag_watchdog_reset + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS (0x1<<11) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_POS 11 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_MSK 0x800 + +/* + * int_enable_flag_enbl_amp + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS (0x1<<12) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_POS 12 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_MSK 0x1000 + +/* + * int_enable_flag_enbl_ref + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS (0x1<<13) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_POS 13 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_MSK 0x2000 + +/* + * int_enable_flag_adc10_ready + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR (0x1<<14) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_POS 14 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_MSK 0x4000 + +/* + * int_enable_flag_bod_vddd_nok + */ +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK (0x1<<15) +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_POS 15 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_MSK 0x8000 + + +/* + * (0x49)-interrupt_enable_reg2 + */ + +/* + * int_enable_flag_bst_bstcur + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU (0x1<<0) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_POS 0 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_MSK 0x1 + +/* + * int_enable_flag_bst_hiz + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI (0x1<<1) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_POS 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_MSK 0x2 + +/* + * int_enable_flag_bst_ocpok + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC (0x1<<2) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_POS 2 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_MSK 0x4 + +/* + * int_enable_flag_bst_peakcur + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC (0x1<<3) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_POS 3 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_MSK 0x8 + +/* + * int_enable_flag_bst_voutcomp + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC (0x1<<4) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_POS 4 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_MSK 0x10 + +/* + * int_enable_flag_bst_voutcomp86 + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86 (0x1<<5) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_POS 5 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_MSK 0x20 + +/* + * int_enable_flag_bst_voutcomp93 + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93 (0x1<<6) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_POS 6 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_MSK 0x40 + +/* + * int_enable_flag_rcvldop_ready + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD (0x1<<7) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_POS 7 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_MSK 0x80 + +/* + * int_enable_flag_ocp_alarm_left + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL (0x1<<8) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_POS 8 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_MSK 0x100 + +/* + * int_enable_flag_ocp_alarm_right + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR (0x1<<9) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_POS 9 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_MSK 0x200 + +/* + * int_enable_flag_man_wait_src_settings + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC (0x1<<10) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_POS 10 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_MSK 0x400 + +/* + * int_enable_flag_man_wait_cf_config + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC (0x1<<11) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_POS 11 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_MSK 0x800 + +/* + * int_enable_flag_man_start_mute_audio + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU (0x1<<12) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_POS 12 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_MSK 0x1000 + +/* + * int_enable_flag_cfma_err + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER (0x1<<13) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_POS 13 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_MSK 0x2000 + +/* + * int_enable_flag_cfma_ack + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC (0x1<<14) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_POS 14 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_MSK 0x4000 + +/* + * int_enable_flag_clk_out_of_range + */ +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR (0x1<<15) +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_POS 15 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_MSK 0x8000 + + +/* + * (0x4a)-interrupt_enable_reg3 + */ + +/* + * int_enable_flag_tdm_error + */ +#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER (0x1<<0) +#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_POS 0 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_MSK 0x1 + +/* + * int_enable_flag_clip_left + */ +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL (0x1<<1) +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_POS 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_MSK 0x2 + +/* + * int_enable_flag_clip_right + */ +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR (0x1<<2) +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_POS 2 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_MSK 0x4 + +/* + * int_enable_flag_mic_ocpok + */ +#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1 (0x1<<3) +#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_POS 3 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_LEN 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_MAX 1 +#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_MSK 0x8 + + +/* + * (0x4c)-status_polarity_reg1 + */ + +/* + * int_polarity_flag_por + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS (0x1<<0) +#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_POS 0 +#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_MSK 0x1 + +/* + * int_polarity_flag_pll_lock + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS (0x1<<1) +#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_POS 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_MSK 0x2 + +/* + * int_polarity_flag_otpok + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS (0x1<<2) +#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_POS 2 +#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_MSK 0x4 + +/* + * int_polarity_flag_ovpok + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS (0x1<<3) +#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_POS 3 +#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_MSK 0x8 + +/* + * int_polarity_flag_uvpok + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS (0x1<<4) +#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_POS 4 +#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_MSK 0x10 + +/* + * int_polarity_flag_clocks_stable + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS (0x1<<5) +#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_POS 5 +#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_MSK 0x20 + +/* + * int_polarity_flag_mtp_busy + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB (0x1<<6) +#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_POS 6 +#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_MSK 0x40 + +/* + * int_polarity_flag_lost_clk + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK (0x1<<7) +#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_POS 7 +#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_MSK 0x80 + +/* + * int_polarity_flag_cf_speakererror + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS (0x1<<8) +#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_POS 8 +#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_MSK 0x100 + +/* + * int_polarity_flag_cold_started + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOACS (0x1<<9) +#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_POS 9 +#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_MSK 0x200 + +/* + * int_polarity_flag_engage + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS (0x1<<10) +#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_POS 10 +#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_MSK 0x400 + +/* + * int_polarity_flag_watchdog_reset + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS (0x1<<11) +#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_POS 11 +#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_MSK 0x800 + +/* + * int_polarity_flag_enbl_amp + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS (0x1<<12) +#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_POS 12 +#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_MSK 0x1000 + +/* + * int_polarity_flag_enbl_ref + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS (0x1<<13) +#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_POS 13 +#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_MSK 0x2000 + +/* + * int_polarity_flag_adc10_ready + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR (0x1<<14) +#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_POS 14 +#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_MSK 0x4000 + +/* + * int_polarity_flag_bod_vddd_nok + */ +#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK (0x1<<15) +#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_POS 15 +#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_MSK 0x8000 + + +/* + * (0x4d)-status_polarity_reg2 + */ + +/* + * int_polarity_flag_bst_bstcur + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU (0x1<<0) +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_POS 0 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_MSK 0x1 + +/* + * int_polarity_flag_bst_hiz + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI (0x1<<1) +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_POS 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_MSK 0x2 + +/* + * int_polarity_flag_bst_ocpok + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC (0x1<<2) +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_POS 2 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_MSK 0x4 + +/* + * int_polarity_flag_bst_peakcur + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC (0x1<<3) +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_POS 3 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_MSK 0x8 + +/* + * int_polarity_flag_bst_voutcomp + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC (0x1<<4) +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_POS 4 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_MSK 0x10 + +/* + * int_polarity_flag_bst_voutcomp86 + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86 (0x1<<5) +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_POS 5 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_MSK 0x20 + +/* + * int_polarity_flag_bst_voutcomp93 + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93 (0x1<<6) +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_POS 6 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_MSK 0x40 + +/* + * int_polarity_flag_rcvldop_ready + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD (0x1<<7) +#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_POS 7 +#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_MSK 0x80 + +/* + * int_polarity_flag_ocp_alarm_left + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL (0x1<<8) +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_POS 8 +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_MSK 0x100 + +/* + * int_polarity_flag_ocp_alarm_right + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR (0x1<<9) +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_POS 9 +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_MSK 0x200 + +/* + * int_polarity_flag_man_wait_src_settings + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC (0x1<<10) +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_POS 10 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_MSK 0x400 + +/* + * int_polarity_flag_man_wait_cf_config + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC (0x1<<11) +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_POS 11 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_MSK 0x800 + +/* + * int_polarity_flag_man_start_mute_audio + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU (0x1<<12) +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_POS 12 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_MSK 0x1000 + +/* + * int_polarity_flag_cfma_err + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER (0x1<<13) +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_POS 13 +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_MSK 0x2000 + +/* + * int_polarity_flag_cfma_ack + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC (0x1<<14) +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_POS 14 +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_MSK 0x4000 + +/* + * int_polarity_flag_clk_out_of_range + */ +#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR (0x1<<15) +#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_POS 15 +#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_MSK 0x8000 + + +/* + * (0x4e)-status_polarity_reg3 + */ + +/* + * int_polarity_flag_tdm_error + */ +#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER (0x1<<0) +#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_POS 0 +#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_MSK 0x1 + +/* + * int_polarity_flag_clip_left + */ +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL (0x1<<1) +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_POS 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_MSK 0x2 + +/* + * int_polarity_flag_clip_right + */ +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR (0x1<<2) +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_POS 2 +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_MSK 0x4 + +/* + * int_polarity_flag_mic_ocpok + */ +#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM (0x1<<3) +#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_POS 3 +#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_LEN 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_MAX 1 +#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_MSK 0x8 + + +/* + * (0x50)-bat_prot_config + */ + +/* + * vbat_prot_attack_time + */ +#define TFA98XX_BAT_PROT_CONFIG_BSSCR (0x3<<0) +#define TFA98XX_BAT_PROT_CONFIG_BSSCR_POS 0 +#define TFA98XX_BAT_PROT_CONFIG_BSSCR_LEN 2 +#define TFA98XX_BAT_PROT_CONFIG_BSSCR_MAX 3 +#define TFA98XX_BAT_PROT_CONFIG_BSSCR_MSK 0x3 + +/* + * vbat_prot_thlevel + */ +#define TFA98XX_BAT_PROT_CONFIG_BSST (0xf<<2) +#define TFA98XX_BAT_PROT_CONFIG_BSST_POS 2 +#define TFA98XX_BAT_PROT_CONFIG_BSST_LEN 4 +#define TFA98XX_BAT_PROT_CONFIG_BSST_MAX 15 +#define TFA98XX_BAT_PROT_CONFIG_BSST_MSK 0x3c + +/* + * vbat_prot_max_reduct + */ +#define TFA98XX_BAT_PROT_CONFIG_BSSRL (0x3<<6) +#define TFA98XX_BAT_PROT_CONFIG_BSSRL_POS 6 +#define TFA98XX_BAT_PROT_CONFIG_BSSRL_LEN 2 +#define TFA98XX_BAT_PROT_CONFIG_BSSRL_MAX 3 +#define TFA98XX_BAT_PROT_CONFIG_BSSRL_MSK 0xc0 + +/* + * vbat_prot_release_time + */ +#define TFA98XX_BAT_PROT_CONFIG_BSSRR (0x7<<8) +#define TFA98XX_BAT_PROT_CONFIG_BSSRR_POS 8 +#define TFA98XX_BAT_PROT_CONFIG_BSSRR_LEN 3 +#define TFA98XX_BAT_PROT_CONFIG_BSSRR_MAX 7 +#define TFA98XX_BAT_PROT_CONFIG_BSSRR_MSK 0x700 + +/* + * vbat_prot_hysterese + */ +#define TFA98XX_BAT_PROT_CONFIG_BSSHY (0x3<<11) +#define TFA98XX_BAT_PROT_CONFIG_BSSHY_POS 11 +#define TFA98XX_BAT_PROT_CONFIG_BSSHY_LEN 2 +#define TFA98XX_BAT_PROT_CONFIG_BSSHY_MAX 3 +#define TFA98XX_BAT_PROT_CONFIG_BSSHY_MSK 0x1800 + +/* + * sel_vbat + */ +#define TFA98XX_BAT_PROT_CONFIG_BSSR (0x1<<14) +#define TFA98XX_BAT_PROT_CONFIG_BSSR_POS 14 +#define TFA98XX_BAT_PROT_CONFIG_BSSR_LEN 1 +#define TFA98XX_BAT_PROT_CONFIG_BSSR_MAX 1 +#define TFA98XX_BAT_PROT_CONFIG_BSSR_MSK 0x4000 + +/* + * bypass_clipper + */ +#define TFA98XX_BAT_PROT_CONFIG_BSSBY (0x1<<15) +#define TFA98XX_BAT_PROT_CONFIG_BSSBY_POS 15 +#define TFA98XX_BAT_PROT_CONFIG_BSSBY_LEN 1 +#define TFA98XX_BAT_PROT_CONFIG_BSSBY_MAX 1 +#define TFA98XX_BAT_PROT_CONFIG_BSSBY_MSK 0x8000 + + +/* + * (0x51)-audio_control + */ + +/* + * batsense_steepness + */ +#define TFA98XX_AUDIO_CONTROL_BSSS (0x1<<0) +#define TFA98XX_AUDIO_CONTROL_BSSS_POS 0 +#define TFA98XX_AUDIO_CONTROL_BSSS_LEN 1 +#define TFA98XX_AUDIO_CONTROL_BSSS_MAX 1 +#define TFA98XX_AUDIO_CONTROL_BSSS_MSK 0x1 + +/* + * soft_mute + */ +#define TFA98XX_AUDIO_CONTROL_INTSMUTE (0x1<<1) +#define TFA98XX_AUDIO_CONTROL_INTSMUTE_POS 1 +#define TFA98XX_AUDIO_CONTROL_INTSMUTE_LEN 1 +#define TFA98XX_AUDIO_CONTROL_INTSMUTE_MAX 1 +#define TFA98XX_AUDIO_CONTROL_INTSMUTE_MSK 0x2 + +/* + * cf_mute_left + */ +#define TFA98XX_AUDIO_CONTROL_CFSML (0x1<<2) +#define TFA98XX_AUDIO_CONTROL_CFSML_POS 2 +#define TFA98XX_AUDIO_CONTROL_CFSML_LEN 1 +#define TFA98XX_AUDIO_CONTROL_CFSML_MAX 1 +#define TFA98XX_AUDIO_CONTROL_CFSML_MSK 0x4 + +/* + * cf_mute_right + */ +#define TFA98XX_AUDIO_CONTROL_CFSMR (0x1<<3) +#define TFA98XX_AUDIO_CONTROL_CFSMR_POS 3 +#define TFA98XX_AUDIO_CONTROL_CFSMR_LEN 1 +#define TFA98XX_AUDIO_CONTROL_CFSMR_MAX 1 +#define TFA98XX_AUDIO_CONTROL_CFSMR_MSK 0x8 + +/* + * bypass_hp_left + */ +#define TFA98XX_AUDIO_CONTROL_HPFBYPL (0x1<<4) +#define TFA98XX_AUDIO_CONTROL_HPFBYPL_POS 4 +#define TFA98XX_AUDIO_CONTROL_HPFBYPL_LEN 1 +#define TFA98XX_AUDIO_CONTROL_HPFBYPL_MAX 1 +#define TFA98XX_AUDIO_CONTROL_HPFBYPL_MSK 0x10 + +/* + * bypass_hp_right + */ +#define TFA98XX_AUDIO_CONTROL_HPFBYPR (0x1<<5) +#define TFA98XX_AUDIO_CONTROL_HPFBYPR_POS 5 +#define TFA98XX_AUDIO_CONTROL_HPFBYPR_LEN 1 +#define TFA98XX_AUDIO_CONTROL_HPFBYPR_MAX 1 +#define TFA98XX_AUDIO_CONTROL_HPFBYPR_MSK 0x20 + +/* + * enbl_dpsa_left + */ +#define TFA98XX_AUDIO_CONTROL_DPSAL (0x1<<6) +#define TFA98XX_AUDIO_CONTROL_DPSAL_POS 6 +#define TFA98XX_AUDIO_CONTROL_DPSAL_LEN 1 +#define TFA98XX_AUDIO_CONTROL_DPSAL_MAX 1 +#define TFA98XX_AUDIO_CONTROL_DPSAL_MSK 0x40 + +/* + * enbl_dpsa_right + */ +#define TFA98XX_AUDIO_CONTROL_DPSAR (0x1<<7) +#define TFA98XX_AUDIO_CONTROL_DPSAR_POS 7 +#define TFA98XX_AUDIO_CONTROL_DPSAR_LEN 1 +#define TFA98XX_AUDIO_CONTROL_DPSAR_MAX 1 +#define TFA98XX_AUDIO_CONTROL_DPSAR_MSK 0x80 + +/* + * cf_volume + */ +#define TFA98XX_AUDIO_CONTROL_VOL (0xff<<8) +#define TFA98XX_AUDIO_CONTROL_VOL_POS 8 +#define TFA98XX_AUDIO_CONTROL_VOL_LEN 8 +#define TFA98XX_AUDIO_CONTROL_VOL_MAX 255 +#define TFA98XX_AUDIO_CONTROL_VOL_MSK 0xff00 + + +/* + * (0x52)-amplifier_config + */ + +/* + * ctrl_rcv + */ +#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV (0x1<<0) +#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_POS 0 +#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_LEN 1 +#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_MAX 1 +#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_MSK 0x1 + +/* + * ctrl_cc + */ +#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL (0x7<<2) +#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_POS 2 +#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_LEN 3 +#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_MAX 7 +#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_MSK 0x1c + +/* + * gain + */ +#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN (0xff<<5) +#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_POS 5 +#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_LEN 8 +#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_MAX 255 +#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_MSK 0x1fe0 + +/* + * ctrl_slopectrl + */ +#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE (0x1<<13) +#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_POS 13 +#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_LEN 1 +#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_MAX 1 +#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_MSK 0x2000 + +/* + * ctrl_slope + */ +#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET (0x3<<14) +#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_POS 14 +#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_LEN 2 +#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_MAX 3 +#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_MSK 0xc000 + + +/* + * (0x5a)-audio_control2 + */ + +/* + * cf_volume_sec + */ +#define TFA98XX_AUDIO_CONTROL2_VOLSEC (0xff<<0) +#define TFA98XX_AUDIO_CONTROL2_VOLSEC_POS 0 +#define TFA98XX_AUDIO_CONTROL2_VOLSEC_LEN 8 +#define TFA98XX_AUDIO_CONTROL2_VOLSEC_MAX 255 +#define TFA98XX_AUDIO_CONTROL2_VOLSEC_MSK 0xff + +/* + * sw_profile + */ +#define TFA98XX_AUDIO_CONTROL2_SWPROFIL (0xff<<8) +#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_POS 8 +#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_LEN 8 +#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_MAX 255 +#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_MSK 0xff00 + + +/* + * (0x70)-dcdc_control0 + */ + +/* + * boost_volt + */ +#define TFA98XX_DCDC_CONTROL0_DCVO (0x7<<0) +#define TFA98XX_DCDC_CONTROL0_DCVO_POS 0 +#define TFA98XX_DCDC_CONTROL0_DCVO_LEN 3 +#define TFA98XX_DCDC_CONTROL0_DCVO_MAX 7 +#define TFA98XX_DCDC_CONTROL0_DCVO_MSK 0x7 + +/* + * boost_cur + */ +#define TFA98XX_DCDC_CONTROL0_DCMCC (0xf<<3) +#define TFA98XX_DCDC_CONTROL0_DCMCC_POS 3 +#define TFA98XX_DCDC_CONTROL0_DCMCC_LEN 4 +#define TFA98XX_DCDC_CONTROL0_DCMCC_MAX 15 +#define TFA98XX_DCDC_CONTROL0_DCMCC_MSK 0x78 + +/* + * bst_coil_value + */ +#define TFA98XX_DCDC_CONTROL0_DCCV (0x3<<7) +#define TFA98XX_DCDC_CONTROL0_DCCV_POS 7 +#define TFA98XX_DCDC_CONTROL0_DCCV_LEN 2 +#define TFA98XX_DCDC_CONTROL0_DCCV_MAX 3 +#define TFA98XX_DCDC_CONTROL0_DCCV_MSK 0x180 + +/* + * boost_intel + */ +#define TFA98XX_DCDC_CONTROL0_DCIE (0x1<<9) +#define TFA98XX_DCDC_CONTROL0_DCIE_POS 9 +#define TFA98XX_DCDC_CONTROL0_DCIE_LEN 1 +#define TFA98XX_DCDC_CONTROL0_DCIE_MAX 1 +#define TFA98XX_DCDC_CONTROL0_DCIE_MSK 0x200 + +/* + * boost_speed + */ +#define TFA98XX_DCDC_CONTROL0_DCSR (0x1<<10) +#define TFA98XX_DCDC_CONTROL0_DCSR_POS 10 +#define TFA98XX_DCDC_CONTROL0_DCSR_LEN 1 +#define TFA98XX_DCDC_CONTROL0_DCSR_MAX 1 +#define TFA98XX_DCDC_CONTROL0_DCSR_MSK 0x400 + +/* + * dcdc_synchronisation + */ +#define TFA98XX_DCDC_CONTROL0_DCSYNCP (0x7<<11) +#define TFA98XX_DCDC_CONTROL0_DCSYNCP_POS 11 +#define TFA98XX_DCDC_CONTROL0_DCSYNCP_LEN 3 +#define TFA98XX_DCDC_CONTROL0_DCSYNCP_MAX 7 +#define TFA98XX_DCDC_CONTROL0_DCSYNCP_MSK 0x3800 + +/* + * dcdcoff_mode + */ +#define TFA98XX_DCDC_CONTROL0_DCDIS (0x1<<14) +#define TFA98XX_DCDC_CONTROL0_DCDIS_POS 14 +#define TFA98XX_DCDC_CONTROL0_DCDIS_LEN 1 +#define TFA98XX_DCDC_CONTROL0_DCDIS_MAX 1 +#define TFA98XX_DCDC_CONTROL0_DCDIS_MSK 0x4000 + + +/* + * (0x90)-cf_controls + */ + +/* + * cf_rst_dsp + */ +#define TFA98XX_CF_CONTROLS_RST (0x1<<0) +#define TFA98XX_CF_CONTROLS_RST_POS 0 +#define TFA98XX_CF_CONTROLS_RST_LEN 1 +#define TFA98XX_CF_CONTROLS_RST_MAX 1 +#define TFA98XX_CF_CONTROLS_RST_MSK 0x1 + +/* + * cf_dmem + */ +#define TFA98XX_CF_CONTROLS_DMEM (0x3<<1) +#define TFA98XX_CF_CONTROLS_DMEM_POS 1 +#define TFA98XX_CF_CONTROLS_DMEM_LEN 2 +#define TFA98XX_CF_CONTROLS_DMEM_MAX 3 +#define TFA98XX_CF_CONTROLS_DMEM_MSK 0x6 + +/* + * cf_aif + */ +#define TFA98XX_CF_CONTROLS_AIF (0x1<<3) +#define TFA98XX_CF_CONTROLS_AIF_POS 3 +#define TFA98XX_CF_CONTROLS_AIF_LEN 1 +#define TFA98XX_CF_CONTROLS_AIF_MAX 1 +#define TFA98XX_CF_CONTROLS_AIF_MSK 0x8 + +/* + * cf_int + */ +#define TFA98XX_CF_CONTROLS_CFINT (0x1<<4) +#define TFA98XX_CF_CONTROLS_CFINT_POS 4 +#define TFA98XX_CF_CONTROLS_CFINT_LEN 1 +#define TFA98XX_CF_CONTROLS_CFINT_MAX 1 +#define TFA98XX_CF_CONTROLS_CFINT_MSK 0x10 + +/* + * cf_cgate_off + */ +#define TFA98XX_CF_CONTROLS_CFCGATE (0x1<<5) +#define TFA98XX_CF_CONTROLS_CFCGATE_POS 5 +#define TFA98XX_CF_CONTROLS_CFCGATE_LEN 1 +#define TFA98XX_CF_CONTROLS_CFCGATE_MAX 1 +#define TFA98XX_CF_CONTROLS_CFCGATE_MSK 0x20 + +/* + * cf_req_cmd + */ +#define TFA98XX_CF_CONTROLS_REQCMD (0x1<<8) +#define TFA98XX_CF_CONTROLS_REQCMD_POS 8 +#define TFA98XX_CF_CONTROLS_REQCMD_LEN 1 +#define TFA98XX_CF_CONTROLS_REQCMD_MAX 1 +#define TFA98XX_CF_CONTROLS_REQCMD_MSK 0x100 + +/* + * cf_req_reset + */ +#define TFA98XX_CF_CONTROLS_REQRST (0x1<<9) +#define TFA98XX_CF_CONTROLS_REQRST_POS 9 +#define TFA98XX_CF_CONTROLS_REQRST_LEN 1 +#define TFA98XX_CF_CONTROLS_REQRST_MAX 1 +#define TFA98XX_CF_CONTROLS_REQRST_MSK 0x200 + +/* + * cf_req_mips + */ +#define TFA98XX_CF_CONTROLS_REQMIPS (0x1<<10) +#define TFA98XX_CF_CONTROLS_REQMIPS_POS 10 +#define TFA98XX_CF_CONTROLS_REQMIPS_LEN 1 +#define TFA98XX_CF_CONTROLS_REQMIPS_MAX 1 +#define TFA98XX_CF_CONTROLS_REQMIPS_MSK 0x400 + +/* + * cf_req_mute_ready + */ +#define TFA98XX_CF_CONTROLS_REQMUTED (0x1<<11) +#define TFA98XX_CF_CONTROLS_REQMUTED_POS 11 +#define TFA98XX_CF_CONTROLS_REQMUTED_LEN 1 +#define TFA98XX_CF_CONTROLS_REQMUTED_MAX 1 +#define TFA98XX_CF_CONTROLS_REQMUTED_MSK 0x800 + +/* + * cf_req_volume_ready + */ +#define TFA98XX_CF_CONTROLS_REQVOL (0x1<<12) +#define TFA98XX_CF_CONTROLS_REQVOL_POS 12 +#define TFA98XX_CF_CONTROLS_REQVOL_LEN 1 +#define TFA98XX_CF_CONTROLS_REQVOL_MAX 1 +#define TFA98XX_CF_CONTROLS_REQVOL_MSK 0x1000 + +/* + * cf_req_damage + */ +#define TFA98XX_CF_CONTROLS_REQDMG (0x1<<13) +#define TFA98XX_CF_CONTROLS_REQDMG_POS 13 +#define TFA98XX_CF_CONTROLS_REQDMG_LEN 1 +#define TFA98XX_CF_CONTROLS_REQDMG_MAX 1 +#define TFA98XX_CF_CONTROLS_REQDMG_MSK 0x2000 + +/* + * cf_req_calibrate_ready + */ +#define TFA98XX_CF_CONTROLS_REQCAL (0x1<<14) +#define TFA98XX_CF_CONTROLS_REQCAL_POS 14 +#define TFA98XX_CF_CONTROLS_REQCAL_LEN 1 +#define TFA98XX_CF_CONTROLS_REQCAL_MAX 1 +#define TFA98XX_CF_CONTROLS_REQCAL_MSK 0x4000 + +/* + * cf_req_reserved + */ +#define TFA98XX_CF_CONTROLS_REQRSV (0x1<<15) +#define TFA98XX_CF_CONTROLS_REQRSV_POS 15 +#define TFA98XX_CF_CONTROLS_REQRSV_LEN 1 +#define TFA98XX_CF_CONTROLS_REQRSV_MAX 1 +#define TFA98XX_CF_CONTROLS_REQRSV_MSK 0x8000 + + +/* + * (0x91)-cf_mad + */ + +/* + * cf_madd + */ +#define TFA98XX_CF_MAD_MADD (0xffff<<0) +#define TFA98XX_CF_MAD_MADD_POS 0 +#define TFA98XX_CF_MAD_MADD_LEN 16 +#define TFA98XX_CF_MAD_MADD_MAX 65535 +#define TFA98XX_CF_MAD_MADD_MSK 0xffff + + +/* + * (0x92)-cf_mem + */ + +/* + * cf_mema + */ +#define TFA98XX_CF_MEM_MEMA (0xffff<<0) +#define TFA98XX_CF_MEM_MEMA_POS 0 +#define TFA98XX_CF_MEM_MEMA_LEN 16 +#define TFA98XX_CF_MEM_MEMA_MAX 65535 +#define TFA98XX_CF_MEM_MEMA_MSK 0xffff + + +/* + * (0x93)-cf_status + */ + +/* + * cf_err + */ +#define TFA98XX_CF_STATUS_ERR (0xff<<0) +#define TFA98XX_CF_STATUS_ERR_POS 0 +#define TFA98XX_CF_STATUS_ERR_LEN 8 +#define TFA98XX_CF_STATUS_ERR_MAX 255 +#define TFA98XX_CF_STATUS_ERR_MSK 0xff + +/* + * cf_ack_cmd + */ +#define TFA98XX_CF_STATUS_ACKCMD (0x1<<8) +#define TFA98XX_CF_STATUS_ACKCMD_POS 8 +#define TFA98XX_CF_STATUS_ACKCMD_LEN 1 +#define TFA98XX_CF_STATUS_ACKCMD_MAX 1 +#define TFA98XX_CF_STATUS_ACKCMD_MSK 0x100 + +/* + * cf_ack_reset + */ +#define TFA98XX_CF_STATUS_ACKRST (0x1<<9) +#define TFA98XX_CF_STATUS_ACKRST_POS 9 +#define TFA98XX_CF_STATUS_ACKRST_LEN 1 +#define TFA98XX_CF_STATUS_ACKRST_MAX 1 +#define TFA98XX_CF_STATUS_ACKRST_MSK 0x200 + +/* + * cf_ack_mips + */ +#define TFA98XX_CF_STATUS_ACKMIPS (0x1<<10) +#define TFA98XX_CF_STATUS_ACKMIPS_POS 10 +#define TFA98XX_CF_STATUS_ACKMIPS_LEN 1 +#define TFA98XX_CF_STATUS_ACKMIPS_MAX 1 +#define TFA98XX_CF_STATUS_ACKMIPS_MSK 0x400 + +/* + * cf_ack_mute_ready + */ +#define TFA98XX_CF_STATUS_ACKMUTED (0x1<<11) +#define TFA98XX_CF_STATUS_ACKMUTED_POS 11 +#define TFA98XX_CF_STATUS_ACKMUTED_LEN 1 +#define TFA98XX_CF_STATUS_ACKMUTED_MAX 1 +#define TFA98XX_CF_STATUS_ACKMUTED_MSK 0x800 + +/* + * cf_ack_volume_ready + */ +#define TFA98XX_CF_STATUS_ACKVOL (0x1<<12) +#define TFA98XX_CF_STATUS_ACKVOL_POS 12 +#define TFA98XX_CF_STATUS_ACKVOL_LEN 1 +#define TFA98XX_CF_STATUS_ACKVOL_MAX 1 +#define TFA98XX_CF_STATUS_ACKVOL_MSK 0x1000 + +/* + * cf_ack_damage + */ +#define TFA98XX_CF_STATUS_ACKDMG (0x1<<13) +#define TFA98XX_CF_STATUS_ACKDMG_POS 13 +#define TFA98XX_CF_STATUS_ACKDMG_LEN 1 +#define TFA98XX_CF_STATUS_ACKDMG_MAX 1 +#define TFA98XX_CF_STATUS_ACKDMG_MSK 0x2000 + +/* + * cf_ack_calibrate_ready + */ +#define TFA98XX_CF_STATUS_ACKCAL (0x1<<14) +#define TFA98XX_CF_STATUS_ACKCAL_POS 14 +#define TFA98XX_CF_STATUS_ACKCAL_LEN 1 +#define TFA98XX_CF_STATUS_ACKCAL_MAX 1 +#define TFA98XX_CF_STATUS_ACKCAL_MSK 0x4000 + +/* + * cf_ack_reserved + */ +#define TFA98XX_CF_STATUS_ACKRSV (0x1<<15) +#define TFA98XX_CF_STATUS_ACKRSV_POS 15 +#define TFA98XX_CF_STATUS_ACKRSV_LEN 1 +#define TFA98XX_CF_STATUS_ACKRSV_MAX 1 +#define TFA98XX_CF_STATUS_ACKRSV_MSK 0x8000 + + +/* + * (0xa1)-mtpkey2_reg + */ + +/* + * mtpkey2 + */ +#define TFA98XX_MTPKEY2_REG_MTPK (0xff<<0) +#define TFA98XX_MTPKEY2_REG_MTPK_POS 0 +#define TFA98XX_MTPKEY2_REG_MTPK_LEN 8 +#define TFA98XX_MTPKEY2_REG_MTPK_MAX 255 +#define TFA98XX_MTPKEY2_REG_MTPK_MSK 0xff + + +/* + * (0xa2)-mtp_status + */ + +/* + * key01_locked + */ +#define TFA98XX_MTP_STATUS_KEY1LOCKED (0x1<<0) +#define TFA98XX_MTP_STATUS_KEY1LOCKED_POS 0 +#define TFA98XX_MTP_STATUS_KEY1LOCKED_LEN 1 +#define TFA98XX_MTP_STATUS_KEY1LOCKED_MAX 1 +#define TFA98XX_MTP_STATUS_KEY1LOCKED_MSK 0x1 + +/* + * key02_locked + */ +#define TFA98XX_MTP_STATUS_KEY2LOCKED (0x1<<1) +#define TFA98XX_MTP_STATUS_KEY2LOCKED_POS 1 +#define TFA98XX_MTP_STATUS_KEY2LOCKED_LEN 1 +#define TFA98XX_MTP_STATUS_KEY2LOCKED_MAX 1 +#define TFA98XX_MTP_STATUS_KEY2LOCKED_MSK 0x2 + + +/* + * (0xa3)-KEY_protected_mtp_control + */ + +/* + * auto_copy_iic_to_mtp + */ +#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP (0x1<<6) +#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_POS 6 +#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_LEN 1 +#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_MAX 1 +#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_MSK 0x40 + + +/* + * (0xa5)-mtp_data_out_msb + */ + +/* + * mtp_man_data_out_msb + */ +#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB (0xffff<<0) +#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_POS 0 +#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_LEN 16 +#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_MAX 65535 +#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_MSK 0xffff + + +/* + * (0xa6)-mtp_data_out_lsb + */ + +/* + * mtp_man_data_out_lsb + */ +#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB (0xffff<<0) +#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_POS 0 +#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_LEN 16 +#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_MAX 65535 +#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_MSK 0xffff + + +/* + * (0xb1)-temp_sensor_config + */ + +/* + * ext_temp + */ +#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS (0x1ff<<0) +#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_POS 0 +#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_LEN 9 +#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_MAX 511 +#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_MSK 0x1ff + +/* + * ext_temp_sel + */ +#define TFA98XX_TEMP_SENSOR_CONFIG_TROS (0x1<<9) +#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_POS 9 +#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_LEN 1 +#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_MAX 1 +#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_MSK 0x200 + + +/* + * (0xf0)-KEY2_protected_MTP0 + */ + +/* + * calibration_onetime + */ +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC (0x1<<0) +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_POS 0 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_LEN 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MAX 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MSK 0x1 + +/* + * calibr_ron_done + */ +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX (0x1<<1) +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_POS 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_LEN 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MAX 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK 0x2 + +/* + * calibr_dcdc_api_calibrate + */ +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI (0x1<<2) +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_POS 2 +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_LEN 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_MAX 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_MSK 0x4 + +/* + * calibr_dcdc_delta_sign + */ +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB (0x1<<3) +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_POS 3 +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_LEN 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_MAX 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_MSK 0x8 + +/* + * calibr_dcdc_delta + */ +#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF (0x7<<4) +#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_POS 4 +#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_LEN 3 +#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_MAX 7 +#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_MSK 0x70 + + +/* + * (0xf4)-KEY1_protected_MTP4 + */ + + +/* + * (0xf5)-KEY1_protected_MTP5 + */ + +#endif /* TFA98XX_GENREGS_H */ diff --git a/inc/tfa98xx_parameters.h b/inc/tfa98xx_parameters.h new file mode 100644 index 000000000000..dba720d8bdc5 --- /dev/null +++ b/inc/tfa98xx_parameters.h @@ -0,0 +1,736 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/* + * tfa98xx_parameters.h + * + * Created on: Jul 22, 2013 + * Author: NLV02095 + */ + +#ifndef TFA98XXPARAMETERS_H_ +#define TFA98XXPARAMETERS_H_ + +//#include "config.h" +// workaround for Visual Studio: +// fatal error C1083: Cannot open include file: 'config.h': No such file or directory +#ifdef __KERNEL__ +#include +#else +#include +#endif + +#include "tfa_service.h" + +#if (defined(WIN32) || defined(_X64)) +/* These warnings are disabled because it is only given by Windows and there is no easy fix */ +#pragma warning(disable:4200) +#pragma warning(disable:4214) +#endif + +/* + * profiles & volumesteps + * + */ +#define TFA_MAX_PROFILES (64) +#define TFA_MAX_VSTEPS (64) +#define TFA_MAX_VSTEP_MSG_MARKER (100) /* This marker is used to indicate if all msgs need to be written to the device */ +#define TFA_MAX_MSGS (10) + +// the pack pragma is required to make that the size in memory +// matches the actual variable lenghts +// This is to assure that the binary files can be transported between +// different platforms. +#pragma pack(push, 1) + +/* + * typedef for 24 bit value using 3 bytes + */ +typedef struct uint24 { + uint8_t b[3]; +} uint24_t; +/* + * the generic header + * all char types are in ASCII + */ +typedef struct TfaHeader { + uint16_t id; + char version[2]; // "V_" : V=version, vv=subversion + char subversion[2]; // "vv" : vv=subversion + uint16_t size; // data size in bytes following CRC + uint32_t CRC; // 32-bits CRC for following data + char customer[8]; // “name of customer†+ char application[8]; // “application name†+ char type[8]; // “application type name†+} TfaHeader_t; + +typedef enum TfaSamplerate { + fs_8k, // 8kHz + fs_11k025, // 11.025kHz + fs_12k, // 12kHz + fs_16k, // 16kHz + fs_22k05, // 22.05kHz + fs_24k, // 24kHz + fs_32k, // 32kHz + fs_44k1, // 44.1kHz + fs_48k, // 48kHz + fs_96k, // 96kHz + fs_count // Should always be last item. +} TfaSamplerate_t; + +// Keep in sync with TfaSamplerate_t ! +static const int TfaSamplerateHz[fs_count] = { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 96000 }; + + +/* + * coolflux direct memory access + */ +typedef struct TfaDspMem { + uint8_t type; /* 0--3: p, x, y, iomem */ + uint16_t address; /* target address */ + uint8_t size; /* data size in words */ + int words[]; /* payload in signed 32bit integer (two's complement) */ +} TfaDspMem_t; + +/* + * the biquad coefficients for the API together with index in filter + * the biquad_index is the actual index in the equalizer +1 + */ +#define BIQUAD_COEFF_SIZE 6 + +/* +* Output fixed point coeffs structure +*/ +typedef struct { + int a2; + int a1; + int b2; + int b1; + int b0; +} TfaBiquad_t; + +typedef struct TfaBiquadOld { + uint8_t bytes[BIQUAD_COEFF_SIZE*sizeof(uint24_t)]; +} TfaBiquadOld_t; + +typedef struct TfaBiquadFloat { + float headroom; + float b0; + float b1; + float b2; + float a1; + float a2; +} TfaBiquadFloat_t; + +/* +* EQ filter definitions +* Note: This is not in line with smartstudio (JV: 12/12/2016) +*/ +typedef enum TfaFilterType { + fCustom, //User defined biquad coefficients + fFlat, //Vary only gain + fLowpass, //2nd order Butterworth low pass + fHighpass, //2nd order Butterworth high pass + fLowshelf, + fHighshelf, + fNotch, + fPeak, + fBandpass, + f1stLP, + f1stHP, + fElliptic +} TfaFilterType_t; + +/* + * filter parameters for biquad (re-)calculation + */ +typedef struct TfaFilter { + TfaBiquadOld_t biquad; + uint8_t enabled; + uint8_t type; // (== enum FilterTypes, assure 8bits length) + float frequency; + float Q; + float gain; +} TfaFilter_t ; //8 * float + int32 + byte == 37 + +/* + * biquad params for calculation +*/ + +#define TFA_BQ_EQ_INDEX 0 +#define TFA_BQ_ANTI_ALIAS_INDEX 10 +#define TFA_BQ_INTEGRATOR_INDEX 13 + +/* +* Loudspeaker Compensation filter definitions +*/ +typedef struct TfaLsCompensationFilter { + TfaBiquad_t biquad; + uint8_t lsCompOn; // Loudspeaker compensation on/off; when 'off', the DSP code doesn't apply the bwExt => bwExtOn GUI flag should be gray to avoid confusion + uint8_t bwExtOn; // Bandwidth extension on/off + float fRes; // [Hz] speaker resonance frequency + float Qt; // Speaker resonance Q-factor + float fBwExt; // [Hz] Band width extension frequency + float samplingFreq;// [Hz] Sampling frequency +} TfaLsCompensationFilter_t; + +/* +* Anti Aliasing Elliptic filter definitions +*/ +typedef struct TfaAntiAliasFilter { + TfaBiquad_t biquad; /**< Output results fixed point coeffs */ + uint8_t enabled; + float cutOffFreq; // cut off frequency + float samplingFreq; // sampling frequency + float rippleDb; // range: [0.1 3.0] + float rolloff; // range: [-1.0 1.0] +} TfaAntiAliasFilter_t; + +/** +* Integrator filter input definitions +*/ +typedef struct TfaIntegratorFilter { + TfaBiquad_t biquad; /**< Output results fixed point coeffs */ + uint8_t type; /**< Butterworth filter type: high or low pass */ + float cutOffFreq; /**< cut off frequency in Hertz; range: [100.0 4000.0] */ + float samplingFreq; /**< sampling frequency in Hertz */ + float leakage; /**< leakage factor; range [0.0 1.0] */ +} TfaIntegratorFilter_t; + + +typedef struct TfaEqFilter { + TfaBiquad_t biquad; + uint8_t enabled; + uint8_t type; // (== enum FilterTypes, assure 8bits length) + float cutOffFreq; // cut off frequency, // range: [100.0 4000.0] + float samplingFreq; // sampling frequency + float Q; // range: [0.5 5.0] + float gainDb; // range: [-10.0 10.0] +} TfaEqFilter_t ; //8 * float + int32 + byte == 37 + +typedef struct TfaContAntiAlias { + int8_t index; /**< index determines destination type; anti-alias, integrator,eq */ + uint8_t type; + float cutOffFreq; // cut off frequency + float samplingFreq; + float rippleDb; // integrator leakage + float rolloff; + uint8_t bytes[5*3]; // payload 5*24buts coeffs +} TfaContAntiAlias_t; + +typedef struct TfaContIntegrator { + int8_t index; /**< index determines destination type; anti-alias, integrator,eq */ + uint8_t type; + float cutOffFreq; // cut off frequency + float samplingFreq; + float leakage; // integrator leakage + float reserved; + uint8_t bytes[5*3]; // payload 5*24buts coeffs +} TfaContIntegrator_t; + +typedef struct TfaContEq { + int8_t index; + uint8_t type; // (== enum FilterTypes, assure 8bits length) + float cutOffFreq; // cut off frequency, // range: [100.0 4000.0] + float samplingFreq; // sampling frequency + float Q; // range: [0.5 5.0] + float gainDb; // range: [-10.0 10.0] + uint8_t bytes[5*3]; // payload 5*24buts coeffs +} TfaContEq_t ; //8 * float + int32 + byte == 37 + +typedef union TfaContBiquad { + TfaContEq_t eq; + TfaContAntiAlias_t aa; + TfaContIntegrator_t in; +} TfaContBiquad_t; + +#define TFA_BQ_EQ_INDEX 0 +#define TFA_BQ_ANTI_ALIAS_INDEX 10 +#define TFA_BQ_INTEGRATOR_INDEX 13 +#define TFA98XX_MAX_EQ 10 + +typedef struct TfaEqualizer { + TfaFilter_t filter[TFA98XX_MAX_EQ]; +} TfaEqualizer_t; + +/* + * files + */ +#define HDR(c1, c2) (c2<<8|c1) // little endian +typedef enum TfaHeaderType { + paramsHdr = HDR('P', 'M'), /* containter file */ + volstepHdr = HDR('V', 'P'), + patchHdr = HDR('P', 'A'), + speakerHdr = HDR('S', 'P'), + presetHdr = HDR('P', 'R'), + configHdr = HDR('C', 'O'), + equalizerHdr = HDR('E', 'Q'), + drcHdr = HDR('D', 'R'), + msgHdr = HDR('M', 'G'), /* generic message */ + infoHdr = HDR('I', 'N') +} TfaHeaderType_t; + +/* + * equalizer file + */ +#define TFA_EQ_VERSION '1' +#define TFA_EQ_SUBVERSION "00" +typedef struct TfaEqualizerFile { + TfaHeader_t hdr; + uint8_t samplerate; // ==enum samplerates, assure 8 bits + TfaFilter_t filter[TFA98XX_MAX_EQ];// note: API index counts from 1..10 +} TfaEqualizerFile_t; + +/* + * patch file + */ +#define TFA_PA_VERSION '1' +#define TFA_PA_SUBVERSION "00" +typedef struct TfaPatchFile { + TfaHeader_t hdr; + uint8_t data[]; +} TfaPatch_t; + +/* + * generic message file + * - the payload of this file includes the opcode and is send straight to the DSP + */ +#define TFA_MG_VERSION '3' +#define TFA_MG_SUBVERSION "00" +typedef struct TfaMsgFile { + TfaHeader_t hdr; + uint8_t data[]; +} TfaMsgFile_t; + +/* + * NOTE the tfa98xx API defines the enum Tfa98xx_config_type that defines + * the subtypes as decribes below. + * tfa98xx_dsp_config_parameter_type() can be used to get the + * supported type for the active device.. + */ +/* + * config file V1 sub 1 + */ +#define TFA_CO_VERSION '1' +#define TFA_CO3_VERSION '3' +#define TFA_CO_SUBVERSION1 "01" +typedef struct TfaConfigS1File { + TfaHeader_t hdr; + uint8_t data[55*3]; +} TfaConfigS1_t; + +/* + * config file V1 sub 2 + */ +#define TFA_CO_SUBVERSION2 "02" +typedef struct TfaConfigS2File { + TfaHeader_t hdr; + uint8_t data[67*3]; +} TfaConfigS2_t; + +/* + * config file V1 sub 3 + */ +#define TFA_CO_SUBVERSION3 "03" +typedef struct TfaConfigS3File { + TfaHeader_t hdr; + uint8_t data[67*3]; +} TfaConfigS3_t; + +/* + * config file V1.0 + */ +#define TFA_CO_SUBVERSION "00" +typedef struct TfaConfigFile { + TfaHeader_t hdr; + uint8_t data[]; +} TfaConfig_t; + +/* + * preset file + */ +#define TFA_PR_VERSION '1' +#define TFA_PR_SUBVERSION "00" +typedef struct TfaPresetFile { + TfaHeader_t hdr; + uint8_t data[]; +} TfaPreset_t; + +/* + * drc file + */ +#define TFA_DR_VERSION '1' +#define TFA_DR_SUBVERSION "00" +typedef struct TfaDrcFile { + TfaHeader_t hdr; + uint8_t data[]; +} TfaDrc_t; + +/* + * drc file + * for tfa 2 there is also a xml-version + */ +#define TFA_DR3_VERSION '3' +#define TFA_DR3_SUBVERSION "00" +typedef struct TfaDrcFile2 { + TfaHeader_t hdr; + uint8_t version[3]; + uint8_t data[]; +} TfaDrc2_t; + +/* + * volume step structures + */ +// VP01 +#define TFA_VP1_VERSION '1' +#define TFA_VP1_SUBVERSION "01" +typedef struct TfaVolumeStep1 { + float attenuation; // IEEE single float + uint8_t preset[TFA98XX_PRESET_LENGTH]; +} TfaVolumeStep1_t; + +// VP02 +#define TFA_VP2_VERSION '2' +#define TFA_VP2_SUBVERSION "01" +typedef struct TfaVolumeStep2 { + float attenuation; // IEEE single float + uint8_t preset[TFA98XX_PRESET_LENGTH]; + TfaFilter_t filter[TFA98XX_MAX_EQ];// note: API index counts from 1..10 +} TfaVolumeStep2_t; + +/* + * volumestep file + */ +#define TFA_VP_VERSION '1' +#define TFA_VP_SUBVERSION "00" +typedef struct TfaVolumeStepFile { + TfaHeader_t hdr; + uint8_t vsteps; // can also be calulated from size+type + uint8_t samplerate; // ==enum samplerates, assure 8 bits + uint8_t payload; //start of variable length contents:N times volsteps +} TfaVolumeStepFile_t; +/* + * volumestep2 file + */ +typedef struct TfaVolumeStep2File { + TfaHeader_t hdr; + uint8_t vsteps; // can also be calulated from size+type + uint8_t samplerate; // ==enum samplerates, assure 8 bits + TfaVolumeStep2_t vstep[]; //start of variable length contents:N times volsteps +} TfaVolumeStep2File_t; + +/* + * volumestepMax2 file + */ +typedef struct TfaVolumeStepMax2File { + TfaHeader_t hdr; + uint8_t version[3]; + uint8_t NrOfVsteps; + uint8_t vstepsBin[]; +} TfaVolumeStepMax2File_t; + +/* + * volumestepMax2 file + * This volumestep should ONLY be used for the use of bin2hdr! + * This can only be used to find the messagetype of the vstep (without header) + */ +typedef struct TfaVolumeStepMax2_1File { + uint8_t version[3]; + uint8_t NrOfVsteps; + uint8_t vstepsBin[]; +} TfaVolumeStepMax2_1File_t; + +struct TfaVolumeStepRegisterInfo { + uint8_t NrOfRegisters; + uint16_t registerInfo[]; +}; + +struct TfaVolumeStepMessageInfo { + uint8_t NrOfMessages; + uint8_t MessageType; + uint24_t MessageLength; + uint8_t CmdId[3]; + uint8_t ParameterData[]; +}; +/**************************old v2 *************************************************/ + +/* + * subv 00 volumestep file + */ +typedef struct TfaOldHeader { + uint16_t id; + char version[2]; // "V_" : V=version, vv=subversion + char subversion[2]; // "vv" : vv=subversion + uint16_t size; // data size in bytes following CRC + uint32_t CRC; // 32-bits CRC for following data +} TfaOldHeader_t; + +typedef struct TfaOldFilter { + double bq[5]; + int32_t type; + double frequency; + double Q; + double gain; + uint8_t enabled; +} TfaOldFilter_t; + +typedef struct TfaOldVolumeStep2 { + float attenuation; // IEEE single float + uint8_t preset[TFA98XX_PRESET_LENGTH]; + TfaOldFilter_t eq[10]; +} TfaOldVolumeStep2_t; + +typedef struct TfaOldVolumeStepFile { + TfaOldHeader_t hdr; + TfaOldVolumeStep2_t step[]; +} TfaOldVolumeStep2File_t; +/**************************end old v2 *************************************************/ + +/* + * speaker file header + */ +struct TfaSpkHeader { + struct TfaHeader hdr; + char name[8]; // speaker nick name (e.g. “dumboâ€) + char vendor[16]; + char type[8]; + // dimensions (mm) + uint8_t height; + uint8_t width; + uint8_t depth; + uint16_t ohm; +}; + +/* + * speaker file + */ +#define TFA_SP_VERSION '1' +#define TFA_SP_SUBVERSION "00" +typedef struct TfaSpeakerFile { + TfaHeader_t hdr; + char name[8]; // speaker nick name (e.g. “dumboâ€) + char vendor[16]; + char type[8]; + // dimensions (mm) + uint8_t height; + uint8_t width; + uint8_t depth; + uint8_t ohm_primary; + uint8_t ohm_secondary; + uint8_t data[]; //payload TFA98XX_SPEAKERPARAMETER_LENGTH +} TfaSpeakerFile_t; + +#define TFA_VP3_VERSION '3' +#define TFA_VP3_SUBVERSION "00" + +struct TfaFWVer { + uint8_t Major; + uint8_t minor; + uint8_t minor_update:6; + uint8_t Update:2; +}; + +struct TfaFWMsg { + struct TfaFWVer fwVersion; + struct TfaMsg payload; +}; + +typedef struct TfaLiveData { + char name[25]; + char addrs[25]; + int tracker; + int scalefactor; +} TfaLiveData_t; + +#define TFA_SP3_VERSION '3' +#define TFA_SP3_SUBVERSION "00" +struct TfaSpeakerFileMax2 { + TfaHeader_t hdr; + char name[8]; // speaker nick name (e.g. “dumboâ€) + char vendor[16]; + char type[8]; + // dimensions (mm) + uint8_t height; + uint8_t width; + uint8_t depth; + uint8_t ohm_primary; + uint8_t ohm_secondary; + struct TfaFWMsg FWmsg; //payload including FW ver and Cmd ID +}; + +/* + * parameter container file + */ +/* + * descriptors + * Note 1: append new DescriptorType at the end + * Note 2: add new descriptors to dsc_name[] in tfaContUtil.c + */ +typedef enum TfaDescriptorType { + dscDevice, // device list + dscProfile, // profile list + dscRegister, // register patch + dscString, // ascii, zero terminated string + dscFile, // filename + file contents + dscPatch, // patch file + dscMarker, // marker to indicate end of a list + dscMode, + dscSetInputSelect, + dscSetOutputSelect, + dscSetProgramConfig, + dscSetLagW, + dscSetGains, + dscSetvBatFactors, + dscSetSensesCal, + dscSetSensesDelay, + dscBitfield, + dscDefault, // used to reset bitfields to there default values + dscLiveData, + dscLiveDataString, + dscGroup, + dscCmd, + dscSetMBDrc, + dscFilter, + dscNoInit, + dscFeatures, + dscCfMem, // coolflux memory x,y,io + dscSetFwkUseCase, + dscSetVddpConfig, + dsc_last // trailer +} TfaDescriptorType_t; + +#define TFA_BITFIELDDSCMSK 0x7fffffff +typedef struct TfaDescPtr { + uint32_t offset:24; + uint32_t type:8; // (== enum TfaDescriptorType, assure 8bits length) +} TfaDescPtr_t; + +/* + * generic file descriptor + */ +typedef struct TfaFileDsc { + TfaDescPtr_t name; + uint32_t size; // file data length in bytes + uint8_t data[]; //payload +} TfaFileDsc_t; + + +/* + * device descriptor list + */ +typedef struct TfaDeviceList { + uint8_t length; // nr of items in the list + uint8_t bus; // bus + uint8_t dev; // device + uint8_t func; // subfunction or subdevice + uint32_t devid; // device hw fw id + TfaDescPtr_t name; // device name + TfaDescPtr_t list[]; // items list +} TfaDeviceList_t; + +/* + * profile descriptor list + */ +typedef struct TfaProfileList { + uint32_t length:8; // nr of items in the list + name + uint32_t group:8; // profile group number + uint32_t ID:16; // profile ID + TfaDescPtr_t name; // profile name + TfaDescPtr_t list[]; // items list (lenght-1 items) +} TfaProfileList_t; +#define TFA_PROFID 0x1234 + +/* + * livedata descriptor list + */ +typedef struct TfaLiveDataList { + uint32_t length:8; // nr of items in the list + uint32_t ID:24; // profile ID + TfaDescPtr_t name; // livedata name + TfaDescPtr_t list[]; // items list +} TfaLiveDataList_t; +#define TFA_LIVEDATAID 0x5678 + +/* + * Bitfield descriptor + */ +typedef struct TfaBitfield { + uint16_t value; + uint16_t field; // ==datasheet defined, 16 bits +} TfaBitfield_t; + +/* + * Bitfield enumuration bits descriptor + */ +typedef struct TfaBfEnum { + unsigned int len:4; // this is the actual length-1 + unsigned int pos:4; + unsigned int address:8; +} TfaBfEnum_t; + +/* + * Register patch descriptor + */ +typedef struct TfaRegpatch { + uint8_t address; // register address + uint16_t value; // value to write + uint16_t mask; // mask of bits to write +} TfaRegpatch_t; + +/* + * Mode descriptor + */ +typedef struct TfaUseCase { + int value; // mode value, maps to enum Tfa98xx_Mode +} TfaMode_t; + +/* + * NoInit descriptor + */ +typedef struct TfaNoInit { + uint8_t value; // noInit value +} TfaNoInit_t; + +/* + * Features descriptor + */ +typedef struct TfaFeatures { + uint16_t value[3]; // features value +} TfaFeatures_t; + + +/* + * the container file + * - the size field is 32bits long (generic=16) + * - all char types are in ASCII + */ +#define TFA_PM_VERSION '1' +#define TFA_PM3_VERSION '3' +#define TFA_PM_SUBVERSION '1' +typedef struct TfaContainer { + char id[2]; // "XX" : XX=type + char version[2]; // "V_" : V=version, vv=subversion + char subversion[2]; // "vv" : vv=subversion + uint32_t size; // data size in bytes following CRC + uint32_t CRC; // 32-bits CRC for following data + uint16_t rev; // "extra chars for rev nr" + char customer[8]; // “name of customer†+ char application[8]; // “application name†+ char type[8]; // “application type name†+ uint16_t ndev; // "nr of device lists" + uint16_t nprof; // "nr of profile lists" + uint16_t nliveData; // "nr of livedata lists" + TfaDescPtr_t index[]; // start of item index table +} TfaContainer_t; + +#pragma pack(pop) + +#endif /* TFA98XXPARAMETERS_H_ */ diff --git a/inc/tfa98xx_tfafieldnames.h b/inc/tfa98xx_tfafieldnames.h new file mode 100644 index 000000000000..0bac6717ecc0 --- /dev/null +++ b/inc/tfa98xx_tfafieldnames.h @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +typedef struct TfaBfName { + unsigned short bfEnum; + char *bfName; +} tfaBfName_t; + +typedef struct TfaIrqName { + unsigned short irqEnum; + char *irqName; +} tfaIrqName_t; + +#include "tfa1_tfafieldnames.h" +#include "tfa2_tfafieldnames_N1C.h" +/* diffs for specific devices */ +#include "tfa9887_tfafieldnames.h" +#include "tfa9890_tfafieldnames.h" +#include "tfa9891_tfafieldnames.h" +#include "tfa9872_tfafieldnames.h" +#include "tfa9912_tfafieldnames.h" +#include "tfa9896_tfafieldnames.h" +#include "tfa9873_tfafieldnames.h" +#include "tfa9873_tfafieldnames_B0.h" +#include "tfa9874_tfafieldnames.h" +#include "tfa9878_tfafieldnames.h" +#include "tfa9894_tfafieldnames.h" +#include "tfa9894_tfafieldnames_N2.h" + +/* missing 'common' defs break the build but unused in TFA1 context */ +#define TFA1_BF_AMPINSEL -1 +#define TFA1_BF_MANSCONF -1 +#define TFA1_BF_MANCOLD -1 +#define TFA1_BF_INTSMUTE -1 +#define TFA1_BF_CFSMR -1 +#define TFA1_BF_CFSML -1 +#define TFA1_BF_DCMCCAPI -1 +#define TFA1_BF_DCMCCSB -1 +#define TFA1_BF_USERDEF -1 +#define TFA1_BF_MANSTATE -1 +#define TFA1_BF_MANOPER -1 +#define TFA1_BF_REFCKSEL -1 +#define TFA1_BF_VOLSEC -1 +#define TFA1_BF_FRACTDEL -1 +#define TFA1_BF_ACKDMG -1 +#define TFA1_BF_SSRIGHTE -1 +#define TFA1_BF_SSLEFTE -1 +#define TFA1_BF_R25CL -1 +#define TFA1_BF_R25CR -1 +#define TFA1_BF_SWPROFIL 0x8045 /*!< profile save */ +#define TFA1_BF_SWVSTEP 0x80a5 /*!< vstep save */ + +#define TFA1_BF_TDMNBCK -1 +#define TFA1_BF_TDMSSIZE -1 + +/* missing 'common' defs break the build */ +#define TFA2_BF_CFSM -1 + + +/* MTP access uses registers + * defs are derived from corresponding bitfield names as used in the BF macros + */ +#define MTPKEY2 MTPK /* unlock key2 MTPK */ +#define MTP0 MTPOTC /* MTP data */ +#define MTP_CONTROL CIMTP /* copy i2c to mtp */ + +/* interrupt enable register uses HW name in TFA2 */ +#define TFA2_BF_INTENVDDS TFA2_BF_IEVDDS + + +/* TFA9891 specific bit field names */ +#define TFA1_BF_SAAMGAIN 0x2202 +#define TFA2_BF_SAAMGAIN -1 + +/* TFA9872 specific bit field names */ +#define TFA2_BF_IELP0 TFA9872_BF_IELP0 +#define TFA2_BF_ISTLP0 TFA9872_BF_ISTLP0 +#define TFA2_BF_IPOLP0 TFA9872_BF_IPOLP0 +#define TFA2_BF_IELP1 TFA9872_BF_IELP1 +#define TFA2_BF_ISTLP1 TFA9872_BF_ISTLP1 +#define TFA2_BF_IPOLP1 TFA9872_BF_IPOLP1 +#define TFA2_BF_LP0 TFA9872_BF_LP0 +#define TFA2_BF_LP1 TFA9872_BF_LP1 +#define TFA2_BF_R25C TFA9872_BF_R25C +#define TFA2_BF_SAMMODE TFA9872_BF_SAMMODE + +/* interrupt bit field names of TFA2 and TFA1 do not match */ +#define TFA1_BF_IEACS TFA1_BF_INTENACS +#define TFA1_BF_IPOACS TFA1_BF_INTPOLACS +#define TFA1_BF_ISTACS TFA1_BF_INTOACS +#define TFA1_BF_ISTVDDS TFA1_BF_INTOVDDS +#define TFA1_BF_ICLVDDS TFA1_BF_INTIVDDS +#define TFA1_BF_IPOVDDS TFA1_BF_INTPOLVDDS +#define TFA1_BF_IENOCLK TFA1_BF_INTENNOCLK +#define TFA1_BF_ISTNOCLK TFA1_BF_INTONOCLK +#define TFA1_BF_IPONOCLK TFA1_BF_INTPOLNOCLK + +/* interrupt bit fields not available on TFA1 */ +#define TFA1_BF_IECLKOOR -1 +#define TFA1_BF_ISTCLKOOR -1 +#define TFA1_BF_IEMWSRC -1 +#define TFA1_BF_ISTMWSRC -1 +#define TFA1_BF_IPOMWSRC -1 +#define TFA1_BF_IEMWSMU -1 +#define TFA1_BF_ISTMWSMU -1 +#define TFA1_BF_IPOMWSMU -1 +#define TFA1_BF_IEMWCFC -1 +#define TFA1_BF_ISTMWCFC -1 +#define TFA1_BF_IPOMWCFC -1 +#define TFA1_BF_CLKOOR -1 +#define TFA1_BF_MANWAIT1 -1 +#define TFA1_BF_MANWAIT2 -1 +#define TFA1_BF_MANMUTE -1 +#define TFA1_BF_IPCLKOOR -1 +#define TFA1_BF_ICLCLKOOR -1 +#define TFA1_BF_IPOSWS -1 +#define TFA1_BF_IESWS -1 +#define TFA1_BF_ISTSWS -1 +#define TFA1_BF_IESPKS -1 +#define TFA1_BF_ISTSPKS -1 +#define TFA1_BF_IPOSPKS -1 +#define TFA1_BF_IECLKS -1 +#define TFA1_BF_ISTCLKS -1 +#define TFA1_BF_IPOCLKS -1 +#define TFA1_BF_IEAMPS -1 +#define TFA1_BF_ISTAMPS -1 +#define TFA1_BF_IPOAMPS -1 +#define TFA1_BF_IELP0 -1 +#define TFA1_BF_ISTLP0 -1 +#define TFA1_BF_IPOLP0 -1 +#define TFA1_BF_IELP1 -1 +#define TFA1_BF_ISTLP1 -1 +#define TFA1_BF_IPOLP1 -1 +#define TFA1_BF_LP0 -1 +#define TFA1_BF_LP1 -1 +#define TFA1_BF_R25C -1 +#define TFA1_BF_SAMMODE -1 + +/* TDM STATUS fields not available on TFA1 */ +#define TFA1_BF_TDMLUTER -1 +#define TFA1_BF_TDMERR -1 diff --git a/inc/tfa9912_device_genregs.h b/inc/tfa9912_device_genregs.h new file mode 100644 index 000000000000..6bf315c06eaa --- /dev/null +++ b/inc/tfa9912_device_genregs.h @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9912_device_genregs.h + * This file was generated automatically on 04/19/17 at 12:26:46. + * Source file: TFA9912_N1A_I2C_regmap_V1.39.xlsx + */ + +#ifndef _TFA9912_DEVICE_GENREGS_H +#define _TFA9912_DEVICE_GENREGS_H + + +#define TFA99XX_SYS_CONTROL0 0x00 +#define TFA99XX_SYS_CONTROL1 0x01 +#define TFA99XX_SYS_CONTROL2 0x02 +#define TFA99XX_DEVICE_REVISION 0x03 +#define TFA99XX_CLOCK_CONTROL 0x04 +#define TFA99XX_CLOCK_GATING_CONTROL 0x05 +#define TFA99XX_HW_PATH_CFG 0x06 +#define TFA99XX_CLKCHK_TH 0x07 +#define TFA99XX_AMP_CTRL 0x08 +#define TFA99XX_SIDE_TONE_CONFIG 0x0d +#define TFA99XX_CTRL_DIGTOANA_REG 0x0e +#define TFA99XX_STATUS_FLAGS0 0x10 +#define TFA99XX_STATUS_FLAGS1 0x11 +#define TFA99XX_STATUS_FLAGS3 0x13 +#define TFA99XX_STATUS_FLAGS4 0x14 +#define TFA99XX_BATTERY_VOLTAGE 0x15 +#define TFA99XX_TEMPERATURE 0x16 +#define TFA99XX_VDDP_VOLTAGE 0x17 +#define TFA99XX_TDM_CONFIG0 0x20 +#define TFA99XX_TDM_CONFIG1 0x21 +#define TFA99XX_TDM_CONFIG2 0x22 +#define TFA99XX_TDM_CONFIG3 0x23 +#define TFA99XX_TDM_CONFIG4 0x24 +#define TFA99XX_TDM_CONFIG5 0x25 +#define TFA99XX_TDM_CONFIG6 0x26 +#define TFA99XX_TDM_CONFIG7 0x27 +#define TFA99XX_TDM_CONFIG8 0x28 +#define TFA99XX_TDM_CONFIG9 0x29 +#define TFA99XX_PDM_CONFIG0 0x31 +#define TFA99XX_PDM_CONFIG1 0x32 +#define TFA99XX_INTERRUPT_OUT_REG1 0x40 +#define TFA99XX_INTERRUPT_OUT_REG2 0x41 +#define TFA99XX_INTERRUPT_OUT_REG3 0x42 +#define TFA99XX_INTERRUPT_IN_REG1 0x44 +#define TFA99XX_INTERRUPT_IN_REG2 0x45 +#define TFA99XX_INTERRUPT_IN_REG3 0x46 +#define TFA99XX_INTERRUPT_ENABLE_REG1 0x48 +#define TFA99XX_INTERRUPT_ENABLE_REG2 0x49 +#define TFA99XX_INTERRUPT_ENABLE_REG3 0x4a +#define TFA99XX_STATUS_POLARITY_REG1 0x4c +#define TFA99XX_STATUS_POLARITY_REG2 0x4d +#define TFA99XX_STATUS_POLARITY_REG3 0x4e +#define TFA99XX_BAT_PROT_CONFIG 0x50 +#define TFA99XX_AUDIO_CONTROL 0x51 +#define TFA99XX_AMPLIFIER_CONFIG 0x52 +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL0 0x53 +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL1 0x54 +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL2 0x55 +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL4 0x57 +#define TFA99XX_KEY1_PROTECTED_PWM_CONFIG 0x58 +#define TFA99XX_CF_TAP_STATUS_0 0x5c +#define TFA99XX_CF_TAP_STATUS_1 0x5d +#define TFA99XX_TAP_CONTROL 0x5f +#define TFA99XX_PGA_CONTROL0 0x60 +#define TFA99XX_GAIN_ATT 0x61 +#define TFA99XX_LOW_NOISE_GAIN1 0x62 +#define TFA99XX_LOW_NOISE_GAIN2 0x63 +#define TFA99XX_MODE1_DETECTOR1 0x64 +#define TFA99XX_MODE1_DETECTOR2 0x65 +#define TFA99XX_BST_PFM_CTRL 0x66 +#define TFA99XX_LOW_POWER_CTRL 0x67 +#define TFA99XX_TDM_SOURCE_CTRL 0x68 +#define TFA99XX_SAM_CTRL 0x69 +#define TFA99XX_RST_MIN_VBAT_CTRL 0x6a +#define TFA99XX_SYS_CONTROL3 0x6b +#define TFA99XX_STATUS_FLAGS5 0x6e +#define TFA99XX_DCDC_CONTROL0 0x70 +#define TFA99XX_KEY1_PROTECTED_DCDC_CONTROL3 0x73 +#define TFA99XX_DCDC_CONTROL4 0x74 +#define TFA99XX_DCDC_CONTROL5 0x75 +#define TFA99XX_DCDC_CONTROL6 0x76 +#define TFA99XX_KEY2_PROTECTED_DCDC_CONTROL7 0x77 +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG0 0x80 +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG2 0x82 +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG3 0x83 +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG4 0x84 +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG5 0x85 +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG7 0x87 +#define TFA99XX_KEY2_PROTECTED_VOLSENSE_CONFIG 0x88 +#define TFA99XX_CURSENSE_CONFIG 0x89 +#define TFA99XX_CF_CONTROLS 0x90 +#define TFA99XX_CF_MAD 0x91 +#define TFA99XX_CF_MEM 0x92 +#define TFA99XX_CF_STATUS 0x93 +#define TFA99XX_MTPKEY1_REG 0xa0 +#define TFA99XX_MTPKEY2_REG 0xa1 +#define TFA99XX_MTP_STATUS 0xa2 +#define TFA99XX_KEY_PROTECTED_MTP_CONTROL 0xa3 +#define TFA99XX_KEY1_PROTECTED_FAIM_CONTROL 0xa4 +#define TFA99XX_MTP_DATA_OUT_MSB 0xa5 +#define TFA99XX_MTP_DATA_OUT_LSB 0xa6 +#define TFA99XX_KEY1_PROTECTED_PROTECTION_CONFIG 0xb0 +#define TFA99XX_TEMP_SENSOR_CONFIG 0xb1 +#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL0 0xc0 +#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL1 0xc1 +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG0 0xc3 +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG1 0xc4 +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG2 0xc5 +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG3 0xc6 +#define TFA99XX_KEY1_PROTECTED_DIGIMUX_CONTROL1 0xc8 +#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL0 0xca +#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL1 0xcb +#define TFA99XX_KEY1_PROTECTED_PLL_TEST0 0xcd +#define TFA99XX_KEY1_PROTECTED_PLL_TEST3 0xd0 +#define TFA99XX_KEY1_PROTECTED_TSIG_CONTROL1 0xd2 +#define TFA99XX_KEY1_PROTECTED_ADC10_CONTROL 0xd3 +#define TFA99XX_KEY1_PROTECTED_ADC10_DATA 0xd4 +#define TFA99XX_KEY2_PROTECTED_CTRL_DIGTOANA 0xd5 +#define TFA99XX_KEY1_PROTECTED_CLKDIV_CONTROL 0xd6 +#define TFA99XX_KEY1_PROTECTED_IO_CONFIG2 0xd7 +#define TFA99XX_KEY1_PROTECTED_TEST_CTRL1 0xd8 +#define TFA99XX_KEY1_PROTECTED_MODE_OVERRULE 0xd9 +#define TFA99XX_KEY1_PROTECTED_FRO8_CALIB_CTRL 0xed +#define TFA99XX_SOFTWARE_PROFILE 0xee +#define TFA99XX_SOFTWARE_VSTEP 0xef +#define TFA99XX_KEY2_PROTECTED_MTP0 0xf0 +#define TFA99XX_KEY1_PROTECTED_MTP2 0xf2 +#define TFA99XX_KEY2_PROTECTED_MTP4 0xf4 +#define TFA99XX_KEY1_PROTECTED_MTP6 0xf6 +#define TFA99XX_KEY1_PROTECTED_MTP7 0xf7 +#define TFA99XX_KEY1_PROTECTED_MTP9 0xf9 +#define TFA99XX_KEY1_PROTECTED_MTPF 0xff +#define TFA99XX_SYS_CONTROL0_POR +#define TFA99XX_SYS_CONTROL1_POR +#define TFA99XX_SYS_CONTROL2_POR +#define TFA99XX_DEVICE_REVISION_POR +#define TFA99XX_CLOCK_CONTROL_POR +#define TFA99XX_CLOCK_GATING_CONTROL_POR +#define TFA99XX_HW_PATH_CFG_POR +#define TFA99XX_CLKCHK_TH_POR +#define TFA99XX_AMP_CTRL_POR +#define TFA99XX_SIDE_TONE_CONFIG_POR +#define TFA99XX_CTRL_DIGTOANA_REG_POR +#define TFA99XX_STATUS_FLAGS0_POR +#define TFA99XX_STATUS_FLAGS1_POR +#define TFA99XX_STATUS_FLAGS3_POR +#define TFA99XX_STATUS_FLAGS4_POR +#define TFA99XX_BATTERY_VOLTAGE_POR +#define TFA99XX_TEMPERATURE_POR +#define TFA99XX_VDDP_VOLTAGE_POR +#define TFA99XX_TDM_CONFIG0_POR +#define TFA99XX_TDM_CONFIG1_POR +#define TFA99XX_TDM_CONFIG2_POR +#define TFA99XX_TDM_CONFIG3_POR +#define TFA99XX_TDM_CONFIG4_POR +#define TFA99XX_TDM_CONFIG5_POR +#define TFA99XX_TDM_CONFIG6_POR +#define TFA99XX_TDM_CONFIG7_POR +#define TFA99XX_TDM_CONFIG8_POR +#define TFA99XX_TDM_CONFIG9_POR +#define TFA99XX_PDM_CONFIG0_POR +#define TFA99XX_PDM_CONFIG1_POR +#define TFA99XX_INTERRUPT_OUT_REG1_POR +#define TFA99XX_INTERRUPT_OUT_REG2_POR +#define TFA99XX_INTERRUPT_OUT_REG3_POR +#define TFA99XX_INTERRUPT_IN_REG1_POR +#define TFA99XX_INTERRUPT_IN_REG2_POR +#define TFA99XX_INTERRUPT_IN_REG3_POR +#define TFA99XX_INTERRUPT_ENABLE_REG1_POR +#define TFA99XX_INTERRUPT_ENABLE_REG2_POR +#define TFA99XX_INTERRUPT_ENABLE_REG3_POR +#define TFA99XX_STATUS_POLARITY_REG1_POR +#define TFA99XX_STATUS_POLARITY_REG2_POR +#define TFA99XX_STATUS_POLARITY_REG3_POR +#define TFA99XX_BAT_PROT_CONFIG_POR +#define TFA99XX_AUDIO_CONTROL_POR +#define TFA99XX_AMPLIFIER_CONFIG_POR +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL0_POR +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL1_POR +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL2_POR +#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL4_POR +#define TFA99XX_KEY1_PROTECTED_PWM_CONFIG_POR +#define TFA99XX_CF_TAP_STATUS_0_POR +#define TFA99XX_CF_TAP_STATUS_1_POR +#define TFA99XX_TAP_CONTROL_POR +#define TFA99XX_PGA_CONTROL0_POR +#define TFA99XX_GAIN_ATT_POR +#define TFA99XX_LOW_NOISE_GAIN1_POR +#define TFA99XX_LOW_NOISE_GAIN2_POR +#define TFA99XX_MODE1_DETECTOR1_POR +#define TFA99XX_MODE1_DETECTOR2_POR +#define TFA99XX_BST_PFM_CTRL_POR +#define TFA99XX_LOW_POWER_CTRL_POR +#define TFA99XX_TDM_SOURCE_CTRL_POR +#define TFA99XX_SAM_CTRL_POR +#define TFA99XX_RST_MIN_VBAT_CTRL_POR +#define TFA99XX_SYS_CONTROL3_POR +#define TFA99XX_STATUS_FLAGS5_POR +#define TFA99XX_DCDC_CONTROL0_POR +#define TFA99XX_KEY1_PROTECTED_DCDC_CONTROL3_POR +#define TFA99XX_DCDC_CONTROL4_POR +#define TFA99XX_DCDC_CONTROL5_POR +#define TFA99XX_DCDC_CONTROL6_POR +#define TFA99XX_KEY2_PROTECTED_DCDC_CONTROL7_POR +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG0_POR +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG2_POR +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG3_POR +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG4_POR +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG5_POR +#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG7_POR +#define TFA99XX_KEY2_PROTECTED_VOLSENSE_CONFIG_POR +#define TFA99XX_CURSENSE_CONFIG_POR +#define TFA99XX_CF_CONTROLS_POR +#define TFA99XX_CF_MAD_POR +#define TFA99XX_CF_MEM_POR +#define TFA99XX_CF_STATUS_POR +#define TFA99XX_MTPKEY1_REG_POR +#define TFA99XX_MTPKEY2_REG_POR +#define TFA99XX_MTP_STATUS_POR +#define TFA99XX_KEY_PROTECTED_MTP_CONTROL_POR +#define TFA99XX_KEY1_PROTECTED_FAIM_CONTROL_POR +#define TFA99XX_MTP_DATA_OUT_MSB_POR +#define TFA99XX_MTP_DATA_OUT_LSB_POR +#define TFA99XX_KEY1_PROTECTED_PROTECTION_CONFIG_POR +#define TFA99XX_TEMP_SENSOR_CONFIG_POR +#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL0_POR +#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL1_POR +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG0_POR +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG1_POR +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG2_POR +#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG3_POR +#define TFA99XX_KEY1_PROTECTED_DIGIMUX_CONTROL1_POR +#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL0_POR +#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL1_POR +#define TFA99XX_KEY1_PROTECTED_PLL_TEST0_POR +#define TFA99XX_KEY1_PROTECTED_PLL_TEST3_POR +#define TFA99XX_KEY1_PROTECTED_TSIG_CONTROL1_POR +#define TFA99XX_KEY1_PROTECTED_ADC10_CONTROL_POR +#define TFA99XX_KEY1_PROTECTED_ADC10_DATA_POR +#define TFA99XX_KEY2_PROTECTED_CTRL_DIGTOANA_POR +#define TFA99XX_KEY1_PROTECTED_CLKDIV_CONTROL_POR +#define TFA99XX_KEY1_PROTECTED_IO_CONFIG2_POR +#define TFA99XX_KEY1_PROTECTED_TEST_CTRL1_POR +#define TFA99XX_KEY1_PROTECTED_MODE_OVERRULE_POR +#define TFA99XX_KEY1_PROTECTED_FRO8_CALIB_CTRL_POR +#define TFA99XX_SOFTWARE_PROFILE_POR +#define TFA99XX_SOFTWARE_VSTEP_POR +#define TFA99XX_KEY2_PROTECTED_MTP0_POR +#define TFA99XX_KEY1_PROTECTED_MTP2_POR +#define TFA99XX_KEY2_PROTECTED_MTP4_POR +#define TFA99XX_KEY1_PROTECTED_MTP6_POR +#define TFA99XX_KEY1_PROTECTED_MTP7_POR +#define TFA99XX_KEY1_PROTECTED_MTP9_POR +#define TFA99XX_KEY1_PROTECTED_MTPF_POR + +#endif /* _TFA9912_DEVICE_GENREGS_H */ diff --git a/inc/tfa9912_tfafieldnames.h b/inc/tfa9912_tfafieldnames.h new file mode 100644 index 000000000000..fc65b684a9e6 --- /dev/null +++ b/inc/tfa9912_tfafieldnames.h @@ -0,0 +1,1776 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/** Filename: tfa9912_tfaFieldnames.h + * This file was generated automatically on 09/28/18 at 12:00:21. + * Source file: TFA9912_N1A_I2C_regmap_V1.43.xlsx + */ + +#ifndef _TFA9912_TFAFIELDNAMES_H +#define _TFA9912_TFAFIELDNAMES_H + + +#define TFA9912_I2CVERSION 1.43 + +typedef enum Tfa9912BfEnumList { + TFA9912_BF_PWDN = 0x0000, /*!< Powerdown selection */ + TFA9912_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ + TFA9912_BF_CFE = 0x0020, /*!< Enable CoolFlux */ + TFA9912_BF_AMPE = 0x0030, /*!< Enables the Amplifier */ + TFA9912_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ + TFA9912_BF_SBSL = 0x0050, /*!< Coolflux configured */ + TFA9912_BF_AMPC = 0x0060, /*!< CoolFlux controls amplifier */ + TFA9912_BF_INTP = 0x0071, /*!< Interrupt config */ + TFA9912_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ + TFA9912_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ + TFA9912_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ + TFA9912_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ + TFA9912_BF_MANSCONF = 0x0120, /*!< I2C configured */ + TFA9912_BF_MANCOLD = 0x0130, /*!< Execute cold start */ + TFA9912_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ + TFA9912_BF_MANROBOD = 0x0150, /*!< Reaction on BOD */ + TFA9912_BF_BODE = 0x0160, /*!< BOD Enable */ + TFA9912_BF_BODHYS = 0x0170, /*!< BOD Hysteresis */ + TFA9912_BF_BODFILT = 0x0181, /*!< BOD filter */ + TFA9912_BF_BODTHLVL = 0x01a1, /*!< BOD threshold */ + TFA9912_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ + TFA9912_BF_RCVNS = 0x01e0, /*!< Noise shaper selection */ + TFA9912_BF_MANWDE = 0x01f0, /*!< Watchdog enable */ + TFA9912_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ + TFA9912_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ + TFA9912_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ + TFA9912_BF_BYPHVBF = 0x02b0, /*!< Bypass HVBAT filter */ + TFA9912_BF_TDMC = 0x02c0, /*!< TDM Compatibility with TFA9872 */ + TFA9912_BF_ENBLADC10 = 0x02e0, /*!< ADC10 Enable - I2C direct mode */ + TFA9912_BF_REV = 0x030f, /*!< Revision info */ + TFA9912_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ + TFA9912_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ + TFA9912_BF_ENCFCKSEL = 0x0430, /*!< Coolflux DSP clock scaling, low power mode */ + TFA9912_BF_CFCKSEL = 0x0441, /*!< Coolflux DSP clock scaler selection for low power mode */ + TFA9912_BF_TDMINFSEL = 0x0460, /*!< TDM clock selection */ + TFA9912_BF_DISBLAUTOCLKSEL = 0x0470, /*!< Disable Automatic dsp clock source selection */ + TFA9912_BF_SELCLKSRC = 0x0480, /*!< I2C selection of DSP clock when auto select is disabled */ + TFA9912_BF_SELTIMSRC = 0x0490, /*!< I2C selection of Watchdog and Timer clock */ + TFA9912_BF_SSLEFTE = 0x0500, /*!< */ + TFA9912_BF_SPKSSEN = 0x0510, /*!< Enable speaker path */ + TFA9912_BF_VSLEFTE = 0x0520, /*!< */ + TFA9912_BF_VSRIGHTE = 0x0530, /*!< Voltage sense */ + TFA9912_BF_CSLEFTE = 0x0540, /*!< */ + TFA9912_BF_CSRIGHTE = 0x0550, /*!< Current sense */ + TFA9912_BF_SSPDME = 0x0560, /*!< Sub-system PDM */ + TFA9912_BF_PGALE = 0x0570, /*!< Enable PGA chop clock for left channel */ + TFA9912_BF_PGARE = 0x0580, /*!< Enable PGA chop clock */ + TFA9912_BF_SSTDME = 0x0590, /*!< Sub-system TDM */ + TFA9912_BF_SSPBSTE = 0x05a0, /*!< Sub-system boost */ + TFA9912_BF_SSADCE = 0x05b0, /*!< Sub-system ADC */ + TFA9912_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ + TFA9912_BF_SSCFTIME = 0x05d0, /*!< CF Sub-system timer */ + TFA9912_BF_SSCFWDTE = 0x05e0, /*!< CF Sub-system WDT */ + TFA9912_BF_FAIMVBGOVRRL = 0x05f0, /*!< Over rule of vbg for FaIM access */ + TFA9912_BF_SAMSPKSEL = 0x0600, /*!< Input selection for TAP/SAM */ + TFA9912_BF_PDM2IISEN = 0x0610, /*!< PDM2IIS Bridge enable */ + TFA9912_BF_TAPRSTBYPASS = 0x0620, /*!< Tap decimator reset bypass - Bypass the decimator reset from tapdec */ + TFA9912_BF_CARDECISEL0 = 0x0631, /*!< Cardec input 0 sel */ + TFA9912_BF_CARDECISEL1 = 0x0651, /*!< Cardec input sel */ + TFA9912_BF_TAPDECSEL = 0x0670, /*!< Select TAP/Cardec for TAP */ + TFA9912_BF_COMPCOUNT = 0x0680, /*!< Comparator o/p filter selection */ + TFA9912_BF_STARTUPMODE = 0x0691, /*!< Startup Mode Selection */ + TFA9912_BF_AUTOTAP = 0x06b0, /*!< Enable auto tap switching */ + TFA9912_BF_COMPINITIME = 0x06c1, /*!< Comparator initialization time to be used in Tap Machine */ + TFA9912_BF_ANAPINITIME = 0x06e1, /*!< Analog initialization time to be used in Tap Machine */ + TFA9912_BF_CCHKTH = 0x0707, /*!< Clock check Higher Threshold */ + TFA9912_BF_CCHKTL = 0x0787, /*!< Clock check Higher Threshold */ + TFA9912_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ + TFA9912_BF_AMPTCRR = 0x0832, /*!< Amplifier on-off criteria for tap mode entry */ + TFA9912_BF_STGS = 0x0d00, /*!< PDM side tone gain selector */ + TFA9912_BF_STGAIN = 0x0d18, /*!< Side tone gain */ + TFA9912_BF_STSMUTE = 0x0da0, /*!< Side tone soft mute */ + TFA9912_BF_ST1C = 0x0db0, /*!< side tone one s complement */ + TFA9912_BF_CMFBEL = 0x0e80, /*!< CMFB enable left */ + TFA9912_BF_VDDS = 0x1000, /*!< POR */ + TFA9912_BF_PLLS = 0x1010, /*!< PLL lock */ + TFA9912_BF_OTDS = 0x1020, /*!< OTP alarm */ + TFA9912_BF_OVDS = 0x1030, /*!< OVP alarm */ + TFA9912_BF_UVDS = 0x1040, /*!< UVP alarm */ + TFA9912_BF_CLKS = 0x1050, /*!< Clocks stable */ + TFA9912_BF_MTPB = 0x1060, /*!< MTP busy */ + TFA9912_BF_NOCLK = 0x1070, /*!< Lost clock */ + TFA9912_BF_ACS = 0x1090, /*!< Cold Start */ + TFA9912_BF_SWS = 0x10a0, /*!< Amplifier engage */ + TFA9912_BF_WDS = 0x10b0, /*!< Watchdog */ + TFA9912_BF_AMPS = 0x10c0, /*!< Amplifier enable */ + TFA9912_BF_AREFS = 0x10d0, /*!< References enable */ + TFA9912_BF_ADCCR = 0x10e0, /*!< Control ADC */ + TFA9912_BF_BODNOK = 0x10f0, /*!< BOD */ + TFA9912_BF_DCIL = 0x1100, /*!< DCDC current limiting */ + TFA9912_BF_DCDCA = 0x1110, /*!< DCDC active */ + TFA9912_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos */ + TFA9912_BF_DCPEAKCUR = 0x1130, /*!< Indicates current is max in DC-to-DC converter */ + TFA9912_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ + TFA9912_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ + TFA9912_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ + TFA9912_BF_STMUTEB = 0x1170, /*!< side tone (un)mute busy */ + TFA9912_BF_STMUTE = 0x1180, /*!< side tone mute state */ + TFA9912_BF_TDMLUTER = 0x1190, /*!< TDM LUT error */ + TFA9912_BF_TDMSTAT = 0x11a2, /*!< TDM status bits */ + TFA9912_BF_TDMERR = 0x11d0, /*!< TDM error */ + TFA9912_BF_HAPTIC = 0x11e0, /*!< Status haptic driver */ + TFA9912_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ + TFA9912_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ + TFA9912_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ + TFA9912_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ + TFA9912_BF_CLIPAH = 0x1340, /*!< Clipping A to Vddp */ + TFA9912_BF_CLIPAL = 0x1350, /*!< Clipping A to gnd */ + TFA9912_BF_CLIPBH = 0x1360, /*!< Clipping B to Vddp */ + TFA9912_BF_CLIPBL = 0x1370, /*!< Clipping B to gnd */ + TFA9912_BF_OCDS = 0x1380, /*!< OCP amplifier */ + TFA9912_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ + TFA9912_BF_TCMPTRG = 0x13a0, /*!< Status Tap comparator triggered */ + TFA9912_BF_TAPDET = 0x13b0, /*!< Status Tap detected */ + TFA9912_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ + TFA9912_BF_MANWAIT2 = 0x13d0, /*!< Wait CF config */ + TFA9912_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ + TFA9912_BF_MANOPER = 0x13f0, /*!< Operating state */ + TFA9912_BF_SPKSL = 0x1400, /*!< Left speaker status */ + TFA9912_BF_SPKS = 0x1410, /*!< Speaker status */ + TFA9912_BF_CLKOOR = 0x1420, /*!< External clock status */ + TFA9912_BF_MANSTATE = 0x1433, /*!< Device manager status */ + TFA9912_BF_DCMODE = 0x1471, /*!< DCDC mode status bits */ + TFA9912_BF_DSPCLKSRC = 0x1490, /*!< DSP clock source selected by manager */ + TFA9912_BF_STARTUPMODSTAT = 0x14a1, /*!< Startup Mode Selected by Manager(Read Only) */ + TFA9912_BF_TSPMSTATE = 0x14c3, /*!< Tap Machine State */ + TFA9912_BF_BATS = 0x1509, /*!< Battery voltage (V) */ + TFA9912_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ + TFA9912_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ + TFA9912_BF_DCILCF = 0x17a0, /*!< DCDC current limiting for DSP */ + TFA9912_BF_TDMUC = 0x2000, /*!< Mode setting */ + TFA9912_BF_DIO4SEL = 0x2011, /*!< DIO4 Input selection */ + TFA9912_BF_TDME = 0x2040, /*!< Enable TDM interface */ + TFA9912_BF_TDMMODE = 0x2050, /*!< Slave/master */ + TFA9912_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ + TFA9912_BF_TDMFSLN = 0x2073, /*!< FS length */ + TFA9912_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ + TFA9912_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ + TFA9912_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ + TFA9912_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ + TFA9912_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ + TFA9912_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ + TFA9912_BF_TDMADJ = 0x21f0, /*!< data adjustment */ + TFA9912_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ + TFA9912_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ + TFA9912_BF_TDMTXDFO = 0x2271, /*!< Format unused bits in a slot */ + TFA9912_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots GAINIO */ + TFA9912_BF_TDMTXUS1 = 0x22b1, /*!< Format unused slots DIO1 */ + TFA9912_BF_TDMTXUS2 = 0x22d1, /*!< Format unused slots DIO2 */ + TFA9912_BF_TDMGIE = 0x2300, /*!< Control gain (channel in 0) */ + TFA9912_BF_TDMDCE = 0x2310, /*!< Control audio left (channel in 1 ) */ + TFA9912_BF_TDMSPKE = 0x2320, /*!< Control audio right (channel in 2 ) */ + TFA9912_BF_TDMCSE = 0x2330, /*!< Current sense */ + TFA9912_BF_TDMVSE = 0x2340, /*!< Voltage sense */ + TFA9912_BF_TDMGOE = 0x2350, /*!< DSP Gainout */ + TFA9912_BF_TDMCF2E = 0x2360, /*!< DSP 2 */ + TFA9912_BF_TDMCF3E = 0x2370, /*!< DSP 3 */ + TFA9912_BF_TDMCFE = 0x2380, /*!< DSP */ + TFA9912_BF_TDMES6 = 0x2390, /*!< Loopback of Audio left (channel 1) */ + TFA9912_BF_TDMES7 = 0x23a0, /*!< Loopback of Audio right (channel 2) */ + TFA9912_BF_TDMCF4E = 0x23b0, /*!< AEC ref right control */ + TFA9912_BF_TDMPD1E = 0x23c0, /*!< PDM 1 control */ + TFA9912_BF_TDMPD2E = 0x23d0, /*!< PDM 2 control */ + TFA9912_BF_TDMGIN = 0x2401, /*!< IO gainin */ + TFA9912_BF_TDMLIO = 0x2421, /*!< IO audio left */ + TFA9912_BF_TDMRIO = 0x2441, /*!< IO audio right */ + TFA9912_BF_TDMCSIO = 0x2461, /*!< IO Current Sense */ + TFA9912_BF_TDMVSIO = 0x2481, /*!< IO voltage sense */ + TFA9912_BF_TDMGOIO = 0x24a1, /*!< IO gain out */ + TFA9912_BF_TDMCFIO2 = 0x24c1, /*!< IO DSP 2 */ + TFA9912_BF_TDMCFIO3 = 0x24e1, /*!< IO DSP 3 */ + TFA9912_BF_TDMCFIO = 0x2501, /*!< IO DSP */ + TFA9912_BF_TDMLPB6 = 0x2521, /*!< IO Source 6 */ + TFA9912_BF_TDMLPB7 = 0x2541, /*!< IO Source 7 */ + TFA9912_BF_TDMGS = 0x2603, /*!< Control gainin */ + TFA9912_BF_TDMDCS = 0x2643, /*!< tdm slot for audio left (channel 1) */ + TFA9912_BF_TDMSPKS = 0x2683, /*!< tdm slot for audio right (channel 2) */ + TFA9912_BF_TDMCSS = 0x26c3, /*!< Slot Position of Current Sense Out */ + TFA9912_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense */ + TFA9912_BF_TDMCGOS = 0x2743, /*!< Slot Position of GAIN out */ + TFA9912_BF_TDMCF2S = 0x2783, /*!< Slot Position DSPout2 */ + TFA9912_BF_TDMCF3S = 0x27c3, /*!< Slot Position DSPout3 */ + TFA9912_BF_TDMCFS = 0x2803, /*!< Slot Position of DSPout */ + TFA9912_BF_TDMEDAT6S = 0x2843, /*!< Slot Position of loopback channel left */ + TFA9912_BF_TDMEDAT7S = 0x2883, /*!< Slot Position of loopback channel right */ + TFA9912_BF_TDMTXUS3 = 0x2901, /*!< Format unused slots D3 */ + TFA9912_BF_PDMSM = 0x3100, /*!< PDM control */ + TFA9912_BF_PDMSTSEL = 0x3110, /*!< PDM Decimator input selection */ + TFA9912_BF_PDMSTENBL = 0x3120, /*!< Side tone input enable */ + TFA9912_BF_PDMLSEL = 0x3130, /*!< PDM data selection for left channel during PDM direct mode */ + TFA9912_BF_PDMRSEL = 0x3140, /*!< PDM data selection for right channel during PDM direct mode */ + TFA9912_BF_MICVDDE = 0x3150, /*!< Enable MICVDD */ + TFA9912_BF_PDMCLRAT = 0x3201, /*!< PDM BCK/Fs ratio */ + TFA9912_BF_PDMGAIN = 0x3223, /*!< PDM gain */ + TFA9912_BF_PDMOSEL = 0x3263, /*!< PDM output selection - RE/FE data combination */ + TFA9912_BF_SELCFHAPD = 0x32a0, /*!< Select the source for haptic data output (not for customer) */ + TFA9912_BF_ISTVDDS = 0x4000, /*!< Status POR */ + TFA9912_BF_ISTPLLS = 0x4010, /*!< Status PLL lock */ + TFA9912_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ + TFA9912_BF_ISTOVDS = 0x4030, /*!< Status OVP alarm */ + TFA9912_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ + TFA9912_BF_ISTCLKS = 0x4050, /*!< Status clocks stable */ + TFA9912_BF_ISTMTPB = 0x4060, /*!< Status MTP busy */ + TFA9912_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ + TFA9912_BF_ISTSPKS = 0x4080, /*!< Status speaker error */ + TFA9912_BF_ISTACS = 0x4090, /*!< Status cold start */ + TFA9912_BF_ISTSWS = 0x40a0, /*!< Status amplifier engage */ + TFA9912_BF_ISTWDS = 0x40b0, /*!< Status watchdog */ + TFA9912_BF_ISTAMPS = 0x40c0, /*!< Status amplifier enable */ + TFA9912_BF_ISTAREFS = 0x40d0, /*!< Status Ref enable */ + TFA9912_BF_ISTADCCR = 0x40e0, /*!< Status Control ADC */ + TFA9912_BF_ISTBODNOK = 0x40f0, /*!< Status BOD */ + TFA9912_BF_ISTBSTCU = 0x4100, /*!< Status DCDC current limiting */ + TFA9912_BF_ISTBSTHI = 0x4110, /*!< Status DCDC active */ + TFA9912_BF_ISTBSTOC = 0x4120, /*!< Status DCDC OCP */ + TFA9912_BF_ISTBSTPKCUR = 0x4130, /*!< Status bst peakcur */ + TFA9912_BF_ISTBSTVC = 0x4140, /*!< Status DCDC level 1x */ + TFA9912_BF_ISTBST86 = 0x4150, /*!< Status DCDC level 1.14x */ + TFA9912_BF_ISTBST93 = 0x4160, /*!< Status DCDC level 1.07x */ + TFA9912_BF_ISTRCVLD = 0x4170, /*!< Status rcvldop ready */ + TFA9912_BF_ISTOCPL = 0x4180, /*!< Status ocp alarm left */ + TFA9912_BF_ISTOCPR = 0x4190, /*!< Status ocp alarm */ + TFA9912_BF_ISTMWSRC = 0x41a0, /*!< Status Waits HW I2C settings */ + TFA9912_BF_ISTMWCFC = 0x41b0, /*!< Status waits CF config */ + TFA9912_BF_ISTMWSMU = 0x41c0, /*!< Status Audio mute sequence */ + TFA9912_BF_ISTCFMER = 0x41d0, /*!< Status cfma error */ + TFA9912_BF_ISTCFMAC = 0x41e0, /*!< Status cfma ack */ + TFA9912_BF_ISTCLKOOR = 0x41f0, /*!< Status flag_clk_out_of_range */ + TFA9912_BF_ISTTDMER = 0x4200, /*!< Status tdm error */ + TFA9912_BF_ISTCLPL = 0x4210, /*!< Status clip left */ + TFA9912_BF_ISTCLPR = 0x4220, /*!< Status clip */ + TFA9912_BF_ISTOCPM = 0x4230, /*!< Status mic ocpok */ + TFA9912_BF_ISTLP1 = 0x4250, /*!< Status low power mode1 */ + TFA9912_BF_ISTLA = 0x4260, /*!< Status low amplitude detection */ + TFA9912_BF_ISTVDDP = 0x4270, /*!< Status VDDP greater than VBAT */ + TFA9912_BF_ISTTAPDET = 0x4280, /*!< Status Tap detected */ + TFA9912_BF_ISTAUDMOD = 0x4290, /*!< Status Audio Mode activated */ + TFA9912_BF_ISTSAMMOD = 0x42a0, /*!< Status SAM Mode activated */ + TFA9912_BF_ISTTAPMOD = 0x42b0, /*!< Status Tap Mode Activated */ + TFA9912_BF_ISTTAPTRG = 0x42c0, /*!< Status Tap comparator triggered */ + TFA9912_BF_ICLVDDS = 0x4400, /*!< Clear POR */ + TFA9912_BF_ICLPLLS = 0x4410, /*!< Clear PLL lock */ + TFA9912_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ + TFA9912_BF_ICLOVDS = 0x4430, /*!< Clear OVP alarm */ + TFA9912_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ + TFA9912_BF_ICLCLKS = 0x4450, /*!< Clear clocks stable */ + TFA9912_BF_ICLMTPB = 0x4460, /*!< Clear mtp busy */ + TFA9912_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ + TFA9912_BF_ICLSPKS = 0x4480, /*!< Clear speaker error */ + TFA9912_BF_ICLACS = 0x4490, /*!< Clear cold started */ + TFA9912_BF_ICLSWS = 0x44a0, /*!< Clear amplifier engage */ + TFA9912_BF_ICLWDS = 0x44b0, /*!< Clear watchdog */ + TFA9912_BF_ICLAMPS = 0x44c0, /*!< Clear enbl amp */ + TFA9912_BF_ICLAREFS = 0x44d0, /*!< Clear ref enable */ + TFA9912_BF_ICLADCCR = 0x44e0, /*!< Clear control ADC */ + TFA9912_BF_ICLBODNOK = 0x44f0, /*!< Clear BOD */ + TFA9912_BF_ICLBSTCU = 0x4500, /*!< Clear DCDC current limiting */ + TFA9912_BF_ICLBSTHI = 0x4510, /*!< Clear DCDC active */ + TFA9912_BF_ICLBSTOC = 0x4520, /*!< Clear DCDC OCP */ + TFA9912_BF_ICLBSTPC = 0x4530, /*!< Clear bst peakcur */ + TFA9912_BF_ICLBSTVC = 0x4540, /*!< Clear DCDC level 1x */ + TFA9912_BF_ICLBST86 = 0x4550, /*!< Clear DCDC level 1.14x */ + TFA9912_BF_ICLBST93 = 0x4560, /*!< Clear DCDC level 1.07x */ + TFA9912_BF_ICLRCVLD = 0x4570, /*!< Clear rcvldop ready */ + TFA9912_BF_ICLOCPL = 0x4580, /*!< Clear ocp alarm left */ + TFA9912_BF_ICLOCPR = 0x4590, /*!< Clear ocp alarm */ + TFA9912_BF_ICLMWSRC = 0x45a0, /*!< Clear wait HW I2C settings */ + TFA9912_BF_ICLMWCFC = 0x45b0, /*!< Clear wait cf config */ + TFA9912_BF_ICLMWSMU = 0x45c0, /*!< Clear audio mute sequence */ + TFA9912_BF_ICLCFMER = 0x45d0, /*!< Clear cfma err */ + TFA9912_BF_ICLCFMAC = 0x45e0, /*!< Clear cfma ack */ + TFA9912_BF_ICLCLKOOR = 0x45f0, /*!< Clear flag_clk_out_of_range */ + TFA9912_BF_ICLTDMER = 0x4600, /*!< Clear tdm error */ + TFA9912_BF_ICLCLPL = 0x4610, /*!< Clear clip left */ + TFA9912_BF_ICLCLP = 0x4620, /*!< Clear clip */ + TFA9912_BF_ICLOCPM = 0x4630, /*!< Clear mic ocpok */ + TFA9912_BF_ICLLP1 = 0x4650, /*!< Clear low power mode1 */ + TFA9912_BF_ICLLA = 0x4660, /*!< Clear low amplitude detection */ + TFA9912_BF_ICLVDDP = 0x4670, /*!< Clear VDDP greater then VBAT */ + TFA9912_BF_ICLTAPDET = 0x4680, /*!< Clear Tap detected */ + TFA9912_BF_ICLAUDMOD = 0x4690, /*!< Clear Audio Mode activated */ + TFA9912_BF_ICLSAMMOD = 0x46a0, /*!< Clear SAM Mode activated */ + TFA9912_BF_ICLTAPMOD = 0x46b0, /*!< Clear Tap Mode Activated */ + TFA9912_BF_ICLTAPTRG = 0x46c0, /*!< Clear Comparator Interrupt */ + TFA9912_BF_IEVDDS = 0x4800, /*!< Enable por */ + TFA9912_BF_IEPLLS = 0x4810, /*!< Enable pll lock */ + TFA9912_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ + TFA9912_BF_IEOVDS = 0x4830, /*!< Enable OVP alarm */ + TFA9912_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ + TFA9912_BF_IECLKS = 0x4850, /*!< Enable clocks stable */ + TFA9912_BF_IEMTPB = 0x4860, /*!< Enable mtp busy */ + TFA9912_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ + TFA9912_BF_IESPKS = 0x4880, /*!< Enable speaker error */ + TFA9912_BF_IEACS = 0x4890, /*!< Enable cold started */ + TFA9912_BF_IESWS = 0x48a0, /*!< Enable amplifier engage */ + TFA9912_BF_IEWDS = 0x48b0, /*!< Enable watchdog */ + TFA9912_BF_IEAMPS = 0x48c0, /*!< Enable enbl amp */ + TFA9912_BF_IEAREFS = 0x48d0, /*!< Enable ref enable */ + TFA9912_BF_IEADCCR = 0x48e0, /*!< Enable Control ADC */ + TFA9912_BF_IEBODNOK = 0x48f0, /*!< Enable BOD */ + TFA9912_BF_IEBSTCU = 0x4900, /*!< Enable DCDC current limiting */ + TFA9912_BF_IEBSTHI = 0x4910, /*!< Enable DCDC active */ + TFA9912_BF_IEBSTOC = 0x4920, /*!< Enable DCDC OCP */ + TFA9912_BF_IEBSTPC = 0x4930, /*!< Enable bst peakcur */ + TFA9912_BF_IEBSTVC = 0x4940, /*!< Enable DCDC level 1x */ + TFA9912_BF_IEBST86 = 0x4950, /*!< Enable DCDC level 1.14x */ + TFA9912_BF_IEBST93 = 0x4960, /*!< Enable DCDC level 1.07x */ + TFA9912_BF_IERCVLD = 0x4970, /*!< Enable rcvldop ready */ + TFA9912_BF_IEOCPL = 0x4980, /*!< Enable ocp alarm left */ + TFA9912_BF_IEOCPR = 0x4990, /*!< Enable ocp alarm */ + TFA9912_BF_IEMWSRC = 0x49a0, /*!< Enable waits HW I2C settings */ + TFA9912_BF_IEMWCFC = 0x49b0, /*!< Enable man wait cf config */ + TFA9912_BF_IEMWSMU = 0x49c0, /*!< Enable man Audio mute sequence */ + TFA9912_BF_IECFMER = 0x49d0, /*!< Enable cfma err */ + TFA9912_BF_IECFMAC = 0x49e0, /*!< Enable cfma ack */ + TFA9912_BF_IECLKOOR = 0x49f0, /*!< Enable flag_clk_out_of_range */ + TFA9912_BF_IETDMER = 0x4a00, /*!< Enable tdm error */ + TFA9912_BF_IECLPL = 0x4a10, /*!< Enable clip left */ + TFA9912_BF_IECLPR = 0x4a20, /*!< Enable clip */ + TFA9912_BF_IEOCPM1 = 0x4a30, /*!< Enable mic ocpok */ + TFA9912_BF_IELP1 = 0x4a50, /*!< Enable low power mode1 */ + TFA9912_BF_IELA = 0x4a60, /*!< Enable low amplitude detection */ + TFA9912_BF_IEVDDP = 0x4a70, /*!< Enable VDDP greater than VBAT */ + TFA9912_BF_IETAPDET = 0x4a80, /*!< Enable Tap detected */ + TFA9912_BF_IEAUDMOD = 0x4a90, /*!< Enable Audio Mode activated */ + TFA9912_BF_IESAMMOD = 0x4aa0, /*!< Enable SAM Mode activated */ + TFA9912_BF_IETAPMOD = 0x4ab0, /*!< Enable Tap Mode Activated */ + TFA9912_BF_IETAPTRG = 0x4ac0, /*!< Enable comparator interrupt */ + TFA9912_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ + TFA9912_BF_IPOPLLS = 0x4c10, /*!< Polarity pll lock */ + TFA9912_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ + TFA9912_BF_IPOOVDS = 0x4c30, /*!< Polarity OVP alarm */ + TFA9912_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ + TFA9912_BF_IPOCLKS = 0x4c50, /*!< Polarity clocks stable */ + TFA9912_BF_IPOMTPB = 0x4c60, /*!< Polarity mtp busy */ + TFA9912_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ + TFA9912_BF_IPOSPKS = 0x4c80, /*!< Polarity speaker error */ + TFA9912_BF_IPOACS = 0x4c90, /*!< Polarity cold started */ + TFA9912_BF_IPOSWS = 0x4ca0, /*!< Polarity amplifier engage */ + TFA9912_BF_IPOWDS = 0x4cb0, /*!< Polarity watchdog */ + TFA9912_BF_IPOAMPS = 0x4cc0, /*!< Polarity enbl amp */ + TFA9912_BF_IPOAREFS = 0x4cd0, /*!< Polarity ref enable */ + TFA9912_BF_IPOADCCR = 0x4ce0, /*!< Polarity Control ADC */ + TFA9912_BF_IPOBODNOK = 0x4cf0, /*!< Polarity BOD */ + TFA9912_BF_IPOBSTCU = 0x4d00, /*!< Polarity DCDC current limiting */ + TFA9912_BF_IPOBSTHI = 0x4d10, /*!< Polarity DCDC active */ + TFA9912_BF_IPOBSTOC = 0x4d20, /*!< Polarity DCDC OCP */ + TFA9912_BF_IPOBSTPC = 0x4d30, /*!< Polarity bst peakcur */ + TFA9912_BF_IPOBSTVC = 0x4d40, /*!< Polarity DCDC level 1x */ + TFA9912_BF_IPOBST86 = 0x4d50, /*!< Polarity DCDC level 1.14x */ + TFA9912_BF_IPOBST93 = 0x4d60, /*!< Polarity DCDC level 1.07x */ + TFA9912_BF_IPORCVLD = 0x4d70, /*!< Polarity rcvldop ready */ + TFA9912_BF_IPOOCPL = 0x4d80, /*!< Polarity ocp alarm left */ + TFA9912_BF_IPOOCPR = 0x4d90, /*!< Polarity ocp alarm */ + TFA9912_BF_IPOMWSRC = 0x4da0, /*!< Polarity waits HW I2C settings */ + TFA9912_BF_IPOMWCFC = 0x4db0, /*!< Polarity man wait cf config */ + TFA9912_BF_IPOMWSMU = 0x4dc0, /*!< Polarity man audio mute sequence */ + TFA9912_BF_IPOCFMER = 0x4dd0, /*!< Polarity cfma err */ + TFA9912_BF_IPOCFMAC = 0x4de0, /*!< Polarity cfma ack */ + TFA9912_BF_IPOCLKOOR = 0x4df0, /*!< Polarity flag_clk_out_of_range */ + TFA9912_BF_IPOTDMER = 0x4e00, /*!< Polarity tdm error */ + TFA9912_BF_IPOCLPL = 0x4e10, /*!< Polarity clip left */ + TFA9912_BF_IPOCLPR = 0x4e20, /*!< Polarity clip */ + TFA9912_BF_IPOOCPM = 0x4e30, /*!< Polarity mic ocpok */ + TFA9912_BF_IPOLP1 = 0x4e50, /*!< Polarity low power mode1 */ + TFA9912_BF_IPOLA = 0x4e60, /*!< Polarity low amplitude detection */ + TFA9912_BF_IPOVDDP = 0x4e70, /*!< Polarity VDDP greater than VBAT */ + TFA9912_BF_IPOLTAPDET = 0x4e80, /*!< PolarityTap detected */ + TFA9912_BF_IPOLAUDMOD = 0x4e90, /*!< PolarityAudio Mode activated */ + TFA9912_BF_IPOLSAMMOD = 0x4ea0, /*!< PolaritySAM Mode activated */ + TFA9912_BF_IPOLTAPMOD = 0x4eb0, /*!< Polarity Tap Mode Activated */ + TFA9912_BF_IPOLTAPTRG = 0x4ec0, /*!< PolarityTap Comparator Trigger */ + TFA9912_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time */ + TFA9912_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ + TFA9912_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ + TFA9912_BF_BSSRR = 0x5082, /*!< Battery Safeguard release time */ + TFA9912_BF_BSSHY = 0x50b1, /*!< Battery Safeguard hysteresis */ + TFA9912_BF_BSSAC = 0x50d0, /*!< Reset clipper - Auto clear */ + TFA9912_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ + TFA9912_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ + TFA9912_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ + TFA9912_BF_INTSMUTE = 0x5110, /*!< Soft mute HW */ + TFA9912_BF_CFSML = 0x5120, /*!< Soft mute FW left */ + TFA9912_BF_CFSM = 0x5130, /*!< Soft mute FW */ + TFA9912_BF_HPFBYPL = 0x5140, /*!< Bypass HPF left */ + TFA9912_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ + TFA9912_BF_DPSAL = 0x5160, /*!< Enable DPSA left */ + TFA9912_BF_DPSA = 0x5170, /*!< Enable DPSA */ + TFA9912_BF_VOL = 0x5187, /*!< FW volume control for primary audio channel */ + TFA9912_BF_HNDSFRCV = 0x5200, /*!< Selection receiver */ + TFA9912_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ + TFA9912_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ + TFA9912_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ + TFA9912_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ + TFA9912_BF_CFTAPPAT = 0x5c07, /*!< Coolflux tap pattern */ + TFA9912_BF_TAPDBGINFO = 0x5c83, /*!< Reserved */ + TFA9912_BF_TATPSTAT1 = 0x5d0f, /*!< Tap Status 1 from CF FW */ + TFA9912_BF_TCOMPTHR = 0x5f03, /*!< Comparator threshold (in uV) */ + TFA9912_BF_PGAGAIN = 0x6081, /*!< PGA gain selection */ + TFA9912_BF_TDMSPKG = 0x6123, /*!< System gain (INPLEV 0) */ + TFA9912_BF_LPM1LVL = 0x6505, /*!< low power mode1 detector ctrl threshold for low_audio_lvl */ + TFA9912_BF_LPM1HLD = 0x6565, /*!< Low power mode1 detector, ctrl hold time before low audio is reckoned to be low audio */ + TFA9912_BF_LPM1DIS = 0x65c0, /*!< low power mode1 detector control */ + TFA9912_BF_DCDIS = 0x6630, /*!< DCDC */ + TFA9912_BF_TDMSRCMAP = 0x6801, /*!< tdm source mapping */ + TFA9912_BF_TDMSRCAS = 0x6821, /*!< frame a selection */ + TFA9912_BF_TDMSRCBS = 0x6841, /*!< frame b selection */ + TFA9912_BF_ANC1C = 0x68a0, /*!< ANC one s complement */ + TFA9912_BF_SAMMODE = 0x6901, /*!< Sam mode */ + TFA9912_BF_DCMCC = 0x7033, /*!< Max coil current */ + TFA9912_BF_DCCV = 0x7071, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ + TFA9912_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ + TFA9912_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ + TFA9912_BF_DCINSEL = 0x70c1, /*!< DCDC IIR input Selection */ + TFA9912_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ + TFA9912_BF_DCTRIP = 0x7504, /*!< Adaptive boost trip levels 1, effective only when boost_intelligent is set to 1 */ + TFA9912_BF_DCTRIP2 = 0x7554, /*!< Adaptive boost trip level 2, effective only when boost_intelligent is set to 1 */ + TFA9912_BF_DCTRIPT = 0x75a4, /*!< Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ + TFA9912_BF_DCVOF = 0x7635, /*!< First boost voltage level */ + TFA9912_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ + TFA9912_BF_RST = 0x9000, /*!< Reset */ + TFA9912_BF_DMEM = 0x9011, /*!< Target memory */ + TFA9912_BF_AIF = 0x9030, /*!< Auto increment */ + TFA9912_BF_CFINT = 0x9040, /*!< Interrupt - auto clear */ + TFA9912_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ + TFA9912_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ + TFA9912_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ + TFA9912_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ + TFA9912_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ + TFA9912_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ + TFA9912_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ + TFA9912_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ + TFA9912_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ + TFA9912_BF_MADD = 0x910f, /*!< Memory address */ + TFA9912_BF_MEMA = 0x920f, /*!< Activate memory access */ + TFA9912_BF_ERR = 0x9307, /*!< Error flags */ + TFA9912_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ + TFA9912_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ + TFA9912_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ + TFA9912_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ + TFA9912_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ + TFA9912_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ + TFA9912_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ + TFA9912_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ + TFA9912_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ + TFA9912_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ + TFA9912_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ + TFA9912_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ + TFA9912_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ + TFA9912_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ + TFA9912_BF_EXTTS = 0xb108, /*!< External temperature (C) */ + TFA9912_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ + TFA9912_BF_SWPROFIL = 0xee0f, /*!< Software profile data */ + TFA9912_BF_SWVSTEP = 0xef0f, /*!< Software vstep information */ + TFA9912_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ + TFA9912_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ + TFA9912_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ + TFA9912_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ + TFA9912_BF_DCMCCCL = 0xf042, /*!< Calibration delta current limit DCDC */ + TFA9912_BF_USERDEF = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ + TFA9912_BF_R25C = 0xf40f, /*!< Ron resistance of speaker coil */ +} Tfa9912BfEnumList_t; +#define TFA9912_NAMETABLE static tfaBfName_t Tfa9912DatasheetNames[] = {\ + { 0x0, "PWDN"}, /* Powerdown selection , */\ + { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ + { 0x20, "CFE"}, /* Enable CoolFlux , */\ + { 0x30, "AMPE"}, /* Enables the Amplifier , */\ + { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ + { 0x50, "SBSL"}, /* Coolflux configured , */\ + { 0x60, "AMPC"}, /* CoolFlux controls amplifier , */\ + { 0x71, "INTP"}, /* Interrupt config , */\ + { 0x90, "FSSSEL"}, /* Audio sample reference , */\ + { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ + { 0xc0, "TSTOCP"}, /* OCP testing control , */\ + { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ + { 0x120, "MANSCONF"}, /* I2C configured , */\ + { 0x130, "MANCOLD"}, /* Execute cold start , */\ + { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ + { 0x150, "MANROBOD"}, /* Reaction on BOD , */\ + { 0x160, "BODE"}, /* BOD Enable , */\ + { 0x170, "BODHYS"}, /* BOD Hysteresis , */\ + { 0x181, "BODFILT"}, /* BOD filter , */\ + { 0x1a1, "BODTHLVL"}, /* BOD threshold , */\ + { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ + { 0x1e0, "RCVNS"}, /* Noise shaper selection , */\ + { 0x1f0, "MANWDE"}, /* Watchdog enable , */\ + { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ + { 0x240, "INPLEV"}, /* TDM output attenuation , */\ + { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ + { 0x2b0, "BYPHVBF"}, /* Bypass HVBAT filter , */\ + { 0x2c0, "TDMC"}, /* TDM Compatibility with TFA9872 , */\ + { 0x2e0, "ENBLADC10"}, /* ADC10 Enable - I2C direct mode , */\ + { 0x30f, "REV"}, /* Revision info , */\ + { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ + { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ + { 0x430, "ENCFCKSEL"}, /* Coolflux DSP clock scaling, low power mode , */\ + { 0x441, "CFCKSEL"}, /* Coolflux DSP clock scaler selection for low power mode, */\ + { 0x460, "TDMINFSEL"}, /* TDM clock selection , */\ + { 0x470, "DISBLAUTOCLKSEL"}, /* Disable Automatic dsp clock source selection , */\ + { 0x480, "SELCLKSRC"}, /* I2C selection of DSP clock when auto select is disabled, */\ + { 0x490, "SELTIMSRC"}, /* I2C selection of Watchdog and Timer clock , */\ + { 0x500, "SSLEFTE"}, /* , */\ + { 0x510, "SPKSSEN"}, /* Enable speaker path , */\ + { 0x520, "VSLEFTE"}, /* , */\ + { 0x530, "VSRIGHTE"}, /* Voltage sense , */\ + { 0x540, "CSLEFTE"}, /* , */\ + { 0x550, "CSRIGHTE"}, /* Current sense , */\ + { 0x560, "SSPDME"}, /* Sub-system PDM , */\ + { 0x570, "PGALE"}, /* Enable PGA chop clock for left channel , */\ + { 0x580, "PGARE"}, /* Enable PGA chop clock , */\ + { 0x590, "SSTDME"}, /* Sub-system TDM , */\ + { 0x5a0, "SSPBSTE"}, /* Sub-system boost , */\ + { 0x5b0, "SSADCE"}, /* Sub-system ADC , */\ + { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ + { 0x5d0, "SSCFTIME"}, /* CF Sub-system timer , */\ + { 0x5e0, "SSCFWDTE"}, /* CF Sub-system WDT , */\ + { 0x5f0, "FAIMVBGOVRRL"}, /* Over rule of vbg for FaIM access , */\ + { 0x600, "SAMSPKSEL"}, /* Input selection for TAP/SAM , */\ + { 0x610, "PDM2IISEN"}, /* PDM2IIS Bridge enable , */\ + { 0x620, "TAPRSTBYPASS"}, /* Tap decimator reset bypass - Bypass the decimator reset from tapdec, */\ + { 0x631, "CARDECISEL0"}, /* Cardec input 0 sel , */\ + { 0x651, "CARDECISEL1"}, /* Cardec input sel , */\ + { 0x670, "TAPDECSEL"}, /* Select TAP/Cardec for TAP , */\ + { 0x680, "COMPCOUNT"}, /* Comparator o/p filter selection , */\ + { 0x691, "STARTUPMODE"}, /* Startup Mode Selection , */\ + { 0x6b0, "AUTOTAP"}, /* Enable auto tap switching , */\ + { 0x6c1, "COMPINITIME"}, /* Comparator initialization time to be used in Tap Machine, */\ + { 0x6e1, "ANAPINITIME"}, /* Analog initialization time to be used in Tap Machine, */\ + { 0x707, "CCHKTH"}, /* Clock check Higher Threshold , */\ + { 0x787, "CCHKTL"}, /* Clock check Higher Threshold , */\ + { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x832, "AMPTCRR"}, /* Amplifier on-off criteria for tap mode entry , */\ + { 0xd00, "STGS"}, /* PDM side tone gain selector , */\ + { 0xd18, "STGAIN"}, /* Side tone gain , */\ + { 0xda0, "STSMUTE"}, /* Side tone soft mute , */\ + { 0xdb0, "ST1C"}, /* side tone one s complement , */\ + { 0xe80, "CMFBEL"}, /* CMFB enable left , */\ + { 0x1000, "VDDS"}, /* POR , */\ + { 0x1010, "PLLS"}, /* PLL lock , */\ + { 0x1020, "OTDS"}, /* OTP alarm , */\ + { 0x1030, "OVDS"}, /* OVP alarm , */\ + { 0x1040, "UVDS"}, /* UVP alarm , */\ + { 0x1050, "CLKS"}, /* Clocks stable , */\ + { 0x1060, "MTPB"}, /* MTP busy , */\ + { 0x1070, "NOCLK"}, /* Lost clock , */\ + { 0x1090, "ACS"}, /* Cold Start , */\ + { 0x10a0, "SWS"}, /* Amplifier engage , */\ + { 0x10b0, "WDS"}, /* Watchdog , */\ + { 0x10c0, "AMPS"}, /* Amplifier enable , */\ + { 0x10d0, "AREFS"}, /* References enable , */\ + { 0x10e0, "ADCCR"}, /* Control ADC , */\ + { 0x10f0, "BODNOK"}, /* BOD , */\ + { 0x1100, "DCIL"}, /* DCDC current limiting , */\ + { 0x1110, "DCDCA"}, /* DCDC active , */\ + { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos , */\ + { 0x1130, "DCPEAKCUR"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ + { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ + { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ + { 0x1170, "STMUTEB"}, /* side tone (un)mute busy , */\ + { 0x1180, "STMUTE"}, /* side tone mute state , */\ + { 0x1190, "TDMLUTER"}, /* TDM LUT error , */\ + { 0x11a2, "TDMSTAT"}, /* TDM status bits , */\ + { 0x11d0, "TDMERR"}, /* TDM error , */\ + { 0x11e0, "HAPTIC"}, /* Status haptic driver , */\ + { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ + { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ + { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ + { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ + { 0x1340, "CLIPAH"}, /* Clipping A to Vddp , */\ + { 0x1350, "CLIPAL"}, /* Clipping A to gnd , */\ + { 0x1360, "CLIPBH"}, /* Clipping B to Vddp , */\ + { 0x1370, "CLIPBL"}, /* Clipping B to gnd , */\ + { 0x1380, "OCDS"}, /* OCP amplifier , */\ + { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ + { 0x13a0, "TCMPTRG"}, /* Status Tap comparator triggered , */\ + { 0x13b0, "TAPDET"}, /* Status Tap detected , */\ + { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ + { 0x13d0, "MANWAIT2"}, /* Wait CF config , */\ + { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ + { 0x13f0, "MANOPER"}, /* Operating state , */\ + { 0x1400, "SPKSL"}, /* Left speaker status , */\ + { 0x1410, "SPKS"}, /* Speaker status , */\ + { 0x1420, "CLKOOR"}, /* External clock status , */\ + { 0x1433, "MANSTATE"}, /* Device manager status , */\ + { 0x1471, "DCMODE"}, /* DCDC mode status bits , */\ + { 0x1490, "DSPCLKSRC"}, /* DSP clock source selected by manager , */\ + { 0x14a1, "STARTUPMODSTAT"}, /* Startup Mode Selected by Manager(Read Only) , */\ + { 0x14c3, "TSPMSTATE"}, /* Tap Machine State , */\ + { 0x1509, "BATS"}, /* Battery voltage (V) , */\ + { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ + { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x17a0, "DCILCF"}, /* DCDC current limiting for DSP , */\ + { 0x2000, "TDMUC"}, /* Mode setting , */\ + { 0x2011, "DIO4SEL"}, /* DIO4 Input selection , */\ + { 0x2040, "TDME"}, /* Enable TDM interface , */\ + { 0x2050, "TDMMODE"}, /* Slave/master , */\ + { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ + { 0x2073, "TDMFSLN"}, /* FS length , */\ + { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ + { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ + { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ + { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ + { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ + { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ + { 0x21f0, "TDMADJ"}, /* data adjustment , */\ + { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ + { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ + { 0x2271, "TDMTXDFO"}, /* Format unused bits in a slot , */\ + { 0x2291, "TDMTXUS0"}, /* Format unused slots GAINIO , */\ + { 0x22b1, "TDMTXUS1"}, /* Format unused slots DIO1 , */\ + { 0x22d1, "TDMTXUS2"}, /* Format unused slots DIO2 , */\ + { 0x2300, "TDMGIE"}, /* Control gain (channel in 0) , */\ + { 0x2310, "TDMDCE"}, /* Control audio left (channel in 1 ) , */\ + { 0x2320, "TDMSPKE"}, /* Control audio right (channel in 2 ) , */\ + { 0x2330, "TDMCSE"}, /* Current sense , */\ + { 0x2340, "TDMVSE"}, /* Voltage sense , */\ + { 0x2350, "TDMGOE"}, /* DSP Gainout , */\ + { 0x2360, "TDMCF2E"}, /* DSP 2 , */\ + { 0x2370, "TDMCF3E"}, /* DSP 3 , */\ + { 0x2380, "TDMCFE"}, /* DSP , */\ + { 0x2390, "TDMES6"}, /* Loopback of Audio left (channel 1) , */\ + { 0x23a0, "TDMES7"}, /* Loopback of Audio right (channel 2) , */\ + { 0x23b0, "TDMCF4E"}, /* AEC ref right control , */\ + { 0x23c0, "TDMPD1E"}, /* PDM 1 control , */\ + { 0x23d0, "TDMPD2E"}, /* PDM 2 control , */\ + { 0x2401, "TDMGIN"}, /* IO gainin , */\ + { 0x2421, "TDMLIO"}, /* IO audio left , */\ + { 0x2441, "TDMRIO"}, /* IO audio right , */\ + { 0x2461, "TDMCSIO"}, /* IO Current Sense , */\ + { 0x2481, "TDMVSIO"}, /* IO voltage sense , */\ + { 0x24a1, "TDMGOIO"}, /* IO gain out , */\ + { 0x24c1, "TDMCFIO2"}, /* IO DSP 2 , */\ + { 0x24e1, "TDMCFIO3"}, /* IO DSP 3 , */\ + { 0x2501, "TDMCFIO"}, /* IO DSP , */\ + { 0x2521, "TDMLPB6"}, /* IO Source 6 , */\ + { 0x2541, "TDMLPB7"}, /* IO Source 7 , */\ + { 0x2603, "TDMGS"}, /* Control gainin , */\ + { 0x2643, "TDMDCS"}, /* tdm slot for audio left (channel 1) , */\ + { 0x2683, "TDMSPKS"}, /* tdm slot for audio right (channel 2) , */\ + { 0x26c3, "TDMCSS"}, /* Slot Position of Current Sense Out , */\ + { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense , */\ + { 0x2743, "TDMCGOS"}, /* Slot Position of GAIN out , */\ + { 0x2783, "TDMCF2S"}, /* Slot Position DSPout2 , */\ + { 0x27c3, "TDMCF3S"}, /* Slot Position DSPout3 , */\ + { 0x2803, "TDMCFS"}, /* Slot Position of DSPout , */\ + { 0x2843, "TDMEDAT6S"}, /* Slot Position of loopback channel left , */\ + { 0x2883, "TDMEDAT7S"}, /* Slot Position of loopback channel right , */\ + { 0x2901, "TDMTXUS3"}, /* Format unused slots D3 , */\ + { 0x3100, "PDMSM"}, /* PDM control , */\ + { 0x3110, "PDMSTSEL"}, /* PDM Decimator input selection , */\ + { 0x3120, "PDMSTENBL"}, /* Side tone input enable , */\ + { 0x3130, "PDMLSEL"}, /* PDM data selection for left channel during PDM direct mode, */\ + { 0x3140, "PDMRSEL"}, /* PDM data selection for right channel during PDM direct mode, */\ + { 0x3150, "MICVDDE"}, /* Enable MICVDD , */\ + { 0x3201, "PDMCLRAT"}, /* PDM BCK/Fs ratio , */\ + { 0x3223, "PDMGAIN"}, /* PDM gain , */\ + { 0x3263, "PDMOSEL"}, /* PDM output selection - RE/FE data combination , */\ + { 0x32a0, "SELCFHAPD"}, /* Select the source for haptic data output (not for customer), */\ + { 0x4000, "ISTVDDS"}, /* Status POR , */\ + { 0x4010, "ISTPLLS"}, /* Status PLL lock , */\ + { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ + { 0x4030, "ISTOVDS"}, /* Status OVP alarm , */\ + { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ + { 0x4050, "ISTCLKS"}, /* Status clocks stable , */\ + { 0x4060, "ISTMTPB"}, /* Status MTP busy , */\ + { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ + { 0x4080, "ISTSPKS"}, /* Status speaker error , */\ + { 0x4090, "ISTACS"}, /* Status cold start , */\ + { 0x40a0, "ISTSWS"}, /* Status amplifier engage , */\ + { 0x40b0, "ISTWDS"}, /* Status watchdog , */\ + { 0x40c0, "ISTAMPS"}, /* Status amplifier enable , */\ + { 0x40d0, "ISTAREFS"}, /* Status Ref enable , */\ + { 0x40e0, "ISTADCCR"}, /* Status Control ADC , */\ + { 0x40f0, "ISTBODNOK"}, /* Status BOD , */\ + { 0x4100, "ISTBSTCU"}, /* Status DCDC current limiting , */\ + { 0x4110, "ISTBSTHI"}, /* Status DCDC active , */\ + { 0x4120, "ISTBSTOC"}, /* Status DCDC OCP , */\ + { 0x4130, "ISTBSTPKCUR"}, /* Status bst peakcur , */\ + { 0x4140, "ISTBSTVC"}, /* Status DCDC level 1x , */\ + { 0x4150, "ISTBST86"}, /* Status DCDC level 1.14x , */\ + { 0x4160, "ISTBST93"}, /* Status DCDC level 1.07x , */\ + { 0x4170, "ISTRCVLD"}, /* Status rcvldop ready , */\ + { 0x4180, "ISTOCPL"}, /* Status ocp alarm left , */\ + { 0x4190, "ISTOCPR"}, /* Status ocp alarm , */\ + { 0x41a0, "ISTMWSRC"}, /* Status Waits HW I2C settings , */\ + { 0x41b0, "ISTMWCFC"}, /* Status waits CF config , */\ + { 0x41c0, "ISTMWSMU"}, /* Status Audio mute sequence , */\ + { 0x41d0, "ISTCFMER"}, /* Status cfma error , */\ + { 0x41e0, "ISTCFMAC"}, /* Status cfma ack , */\ + { 0x41f0, "ISTCLKOOR"}, /* Status flag_clk_out_of_range , */\ + { 0x4200, "ISTTDMER"}, /* Status tdm error , */\ + { 0x4210, "ISTCLPL"}, /* Status clip left , */\ + { 0x4220, "ISTCLPR"}, /* Status clip , */\ + { 0x4230, "ISTOCPM"}, /* Status mic ocpok , */\ + { 0x4250, "ISTLP1"}, /* Status low power mode1 , */\ + { 0x4260, "ISTLA"}, /* Status low amplitude detection , */\ + { 0x4270, "ISTVDDP"}, /* Status VDDP greater than VBAT , */\ + { 0x4280, "ISTTAPDET"}, /* Status Tap detected , */\ + { 0x4290, "ISTAUDMOD"}, /* Status Audio Mode activated , */\ + { 0x42a0, "ISTSAMMOD"}, /* Status SAM Mode activated , */\ + { 0x42b0, "ISTTAPMOD"}, /* Status Tap Mode Activated , */\ + { 0x42c0, "ISTTAPTRG"}, /* Status Tap comparator triggered , */\ + { 0x4400, "ICLVDDS"}, /* Clear POR , */\ + { 0x4410, "ICLPLLS"}, /* Clear PLL lock , */\ + { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ + { 0x4430, "ICLOVDS"}, /* Clear OVP alarm , */\ + { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ + { 0x4450, "ICLCLKS"}, /* Clear clocks stable , */\ + { 0x4460, "ICLMTPB"}, /* Clear mtp busy , */\ + { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ + { 0x4480, "ICLSPKS"}, /* Clear speaker error , */\ + { 0x4490, "ICLACS"}, /* Clear cold started , */\ + { 0x44a0, "ICLSWS"}, /* Clear amplifier engage , */\ + { 0x44b0, "ICLWDS"}, /* Clear watchdog , */\ + { 0x44c0, "ICLAMPS"}, /* Clear enbl amp , */\ + { 0x44d0, "ICLAREFS"}, /* Clear ref enable , */\ + { 0x44e0, "ICLADCCR"}, /* Clear control ADC , */\ + { 0x44f0, "ICLBODNOK"}, /* Clear BOD , */\ + { 0x4500, "ICLBSTCU"}, /* Clear DCDC current limiting , */\ + { 0x4510, "ICLBSTHI"}, /* Clear DCDC active , */\ + { 0x4520, "ICLBSTOC"}, /* Clear DCDC OCP , */\ + { 0x4530, "ICLBSTPC"}, /* Clear bst peakcur , */\ + { 0x4540, "ICLBSTVC"}, /* Clear DCDC level 1x , */\ + { 0x4550, "ICLBST86"}, /* Clear DCDC level 1.14x , */\ + { 0x4560, "ICLBST93"}, /* Clear DCDC level 1.07x , */\ + { 0x4570, "ICLRCVLD"}, /* Clear rcvldop ready , */\ + { 0x4580, "ICLOCPL"}, /* Clear ocp alarm left , */\ + { 0x4590, "ICLOCPR"}, /* Clear ocp alarm , */\ + { 0x45a0, "ICLMWSRC"}, /* Clear wait HW I2C settings , */\ + { 0x45b0, "ICLMWCFC"}, /* Clear wait cf config , */\ + { 0x45c0, "ICLMWSMU"}, /* Clear audio mute sequence , */\ + { 0x45d0, "ICLCFMER"}, /* Clear cfma err , */\ + { 0x45e0, "ICLCFMAC"}, /* Clear cfma ack , */\ + { 0x45f0, "ICLCLKOOR"}, /* Clear flag_clk_out_of_range , */\ + { 0x4600, "ICLTDMER"}, /* Clear tdm error , */\ + { 0x4610, "ICLCLPL"}, /* Clear clip left , */\ + { 0x4620, "ICLCLP"}, /* Clear clip , */\ + { 0x4630, "ICLOCPM"}, /* Clear mic ocpok , */\ + { 0x4650, "ICLLP1"}, /* Clear low power mode1 , */\ + { 0x4660, "ICLLA"}, /* Clear low amplitude detection , */\ + { 0x4670, "ICLVDDP"}, /* Clear VDDP greater then VBAT , */\ + { 0x4680, "ICLTAPDET"}, /* Clear Tap detected , */\ + { 0x4690, "ICLAUDMOD"}, /* Clear Audio Mode activated , */\ + { 0x46a0, "ICLSAMMOD"}, /* Clear SAM Mode activated , */\ + { 0x46b0, "ICLTAPMOD"}, /* Clear Tap Mode Activated , */\ + { 0x46c0, "ICLTAPTRG"}, /* Clear Comparator Interrupt , */\ + { 0x4800, "IEVDDS"}, /* Enable por , */\ + { 0x4810, "IEPLLS"}, /* Enable pll lock , */\ + { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ + { 0x4830, "IEOVDS"}, /* Enable OVP alarm , */\ + { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ + { 0x4850, "IECLKS"}, /* Enable clocks stable , */\ + { 0x4860, "IEMTPB"}, /* Enable mtp busy , */\ + { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ + { 0x4880, "IESPKS"}, /* Enable speaker error , */\ + { 0x4890, "IEACS"}, /* Enable cold started , */\ + { 0x48a0, "IESWS"}, /* Enable amplifier engage , */\ + { 0x48b0, "IEWDS"}, /* Enable watchdog , */\ + { 0x48c0, "IEAMPS"}, /* Enable enbl amp , */\ + { 0x48d0, "IEAREFS"}, /* Enable ref enable , */\ + { 0x48e0, "IEADCCR"}, /* Enable Control ADC , */\ + { 0x48f0, "IEBODNOK"}, /* Enable BOD , */\ + { 0x4900, "IEBSTCU"}, /* Enable DCDC current limiting , */\ + { 0x4910, "IEBSTHI"}, /* Enable DCDC active , */\ + { 0x4920, "IEBSTOC"}, /* Enable DCDC OCP , */\ + { 0x4930, "IEBSTPC"}, /* Enable bst peakcur , */\ + { 0x4940, "IEBSTVC"}, /* Enable DCDC level 1x , */\ + { 0x4950, "IEBST86"}, /* Enable DCDC level 1.14x , */\ + { 0x4960, "IEBST93"}, /* Enable DCDC level 1.07x , */\ + { 0x4970, "IERCVLD"}, /* Enable rcvldop ready , */\ + { 0x4980, "IEOCPL"}, /* Enable ocp alarm left , */\ + { 0x4990, "IEOCPR"}, /* Enable ocp alarm , */\ + { 0x49a0, "IEMWSRC"}, /* Enable waits HW I2C settings , */\ + { 0x49b0, "IEMWCFC"}, /* Enable man wait cf config , */\ + { 0x49c0, "IEMWSMU"}, /* Enable man Audio mute sequence , */\ + { 0x49d0, "IECFMER"}, /* Enable cfma err , */\ + { 0x49e0, "IECFMAC"}, /* Enable cfma ack , */\ + { 0x49f0, "IECLKOOR"}, /* Enable flag_clk_out_of_range , */\ + { 0x4a00, "IETDMER"}, /* Enable tdm error , */\ + { 0x4a10, "IECLPL"}, /* Enable clip left , */\ + { 0x4a20, "IECLPR"}, /* Enable clip , */\ + { 0x4a30, "IEOCPM1"}, /* Enable mic ocpok , */\ + { 0x4a50, "IELP1"}, /* Enable low power mode1 , */\ + { 0x4a60, "IELA"}, /* Enable low amplitude detection , */\ + { 0x4a70, "IEVDDP"}, /* Enable VDDP greater than VBAT , */\ + { 0x4a80, "IETAPDET"}, /* Enable Tap detected , */\ + { 0x4a90, "IEAUDMOD"}, /* Enable Audio Mode activated , */\ + { 0x4aa0, "IESAMMOD"}, /* Enable SAM Mode activated , */\ + { 0x4ab0, "IETAPMOD"}, /* Enable Tap Mode Activated , */\ + { 0x4ac0, "IETAPTRG"}, /* Enable comparator interrupt , */\ + { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ + { 0x4c10, "IPOPLLS"}, /* Polarity pll lock , */\ + { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ + { 0x4c30, "IPOOVDS"}, /* Polarity OVP alarm , */\ + { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ + { 0x4c50, "IPOCLKS"}, /* Polarity clocks stable , */\ + { 0x4c60, "IPOMTPB"}, /* Polarity mtp busy , */\ + { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ + { 0x4c80, "IPOSPKS"}, /* Polarity speaker error , */\ + { 0x4c90, "IPOACS"}, /* Polarity cold started , */\ + { 0x4ca0, "IPOSWS"}, /* Polarity amplifier engage , */\ + { 0x4cb0, "IPOWDS"}, /* Polarity watchdog , */\ + { 0x4cc0, "IPOAMPS"}, /* Polarity enbl amp , */\ + { 0x4cd0, "IPOAREFS"}, /* Polarity ref enable , */\ + { 0x4ce0, "IPOADCCR"}, /* Polarity Control ADC , */\ + { 0x4cf0, "IPOBODNOK"}, /* Polarity BOD , */\ + { 0x4d00, "IPOBSTCU"}, /* Polarity DCDC current limiting , */\ + { 0x4d10, "IPOBSTHI"}, /* Polarity DCDC active , */\ + { 0x4d20, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ + { 0x4d30, "IPOBSTPC"}, /* Polarity bst peakcur , */\ + { 0x4d40, "IPOBSTVC"}, /* Polarity DCDC level 1x , */\ + { 0x4d50, "IPOBST86"}, /* Polarity DCDC level 1.14x , */\ + { 0x4d60, "IPOBST93"}, /* Polarity DCDC level 1.07x , */\ + { 0x4d70, "IPORCVLD"}, /* Polarity rcvldop ready , */\ + { 0x4d80, "IPOOCPL"}, /* Polarity ocp alarm left , */\ + { 0x4d90, "IPOOCPR"}, /* Polarity ocp alarm , */\ + { 0x4da0, "IPOMWSRC"}, /* Polarity waits HW I2C settings , */\ + { 0x4db0, "IPOMWCFC"}, /* Polarity man wait cf config , */\ + { 0x4dc0, "IPOMWSMU"}, /* Polarity man audio mute sequence , */\ + { 0x4dd0, "IPOCFMER"}, /* Polarity cfma err , */\ + { 0x4de0, "IPOCFMAC"}, /* Polarity cfma ack , */\ + { 0x4df0, "IPOCLKOOR"}, /* Polarity flag_clk_out_of_range , */\ + { 0x4e00, "IPOTDMER"}, /* Polarity tdm error , */\ + { 0x4e10, "IPOCLPL"}, /* Polarity clip left , */\ + { 0x4e20, "IPOCLPR"}, /* Polarity clip , */\ + { 0x4e30, "IPOOCPM"}, /* Polarity mic ocpok , */\ + { 0x4e50, "IPOLP1"}, /* Polarity low power mode1 , */\ + { 0x4e60, "IPOLA"}, /* Polarity low amplitude detection , */\ + { 0x4e70, "IPOVDDP"}, /* Polarity VDDP greater than VBAT , */\ + { 0x4e80, "IPOLTAPDET"}, /* PolarityTap detected , */\ + { 0x4e90, "IPOLAUDMOD"}, /* PolarityAudio Mode activated , */\ + { 0x4ea0, "IPOLSAMMOD"}, /* PolaritySAM Mode activated , */\ + { 0x4eb0, "IPOLTAPMOD"}, /* Polarity Tap Mode Activated , */\ + { 0x4ec0, "IPOLTAPTRG"}, /* PolarityTap Comparator Trigger , */\ + { 0x5001, "BSSCR"}, /* Battery Safeguard attack time , */\ + { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ + { 0x5082, "BSSRR"}, /* Battery Safeguard release time , */\ + { 0x50b1, "BSSHY"}, /* Battery Safeguard hysteresis , */\ + { 0x50d0, "BSSAC"}, /* Reset clipper - Auto clear , */\ + { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ + { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ + { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ + { 0x5110, "INTSMUTE"}, /* Soft mute HW , */\ + { 0x5120, "CFSML"}, /* Soft mute FW left , */\ + { 0x5130, "CFSM"}, /* Soft mute FW , */\ + { 0x5140, "HPFBYPL"}, /* Bypass HPF left , */\ + { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ + { 0x5160, "DPSAL"}, /* Enable DPSA left , */\ + { 0x5170, "DPSA"}, /* Enable DPSA , */\ + { 0x5187, "VOL"}, /* FW volume control for primary audio channel , */\ + { 0x5200, "HNDSFRCV"}, /* Selection receiver , */\ + { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ + { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ + { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ + { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ + { 0x5c07, "CFTAPPAT"}, /* Coolflux tap pattern , */\ + { 0x5c83, "TAPDBGINFO"}, /* Reserved , */\ + { 0x5d0f, "TATPSTAT1"}, /* Tap Status 1 from CF FW , */\ + { 0x5f03, "TCOMPTHR"}, /* Comparator threshold (in uV) , */\ + { 0x6081, "PGAGAIN"}, /* PGA gain selection , */\ + { 0x6123, "TDMSPKG"}, /* System gain (INPLEV 0) , */\ + { 0x6505, "LPM1LVL"}, /* low power mode1 detector ctrl threshold for low_audio_lvl , */\ + { 0x6565, "LPM1HLD"}, /* Low power mode1 detector, ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x65c0, "LPM1DIS"}, /* low power mode1 detector control , */\ + { 0x6630, "DCDIS"}, /* DCDC , */\ + { 0x6801, "TDMSRCMAP"}, /* tdm source mapping , */\ + { 0x6821, "TDMSRCAS"}, /* frame a selection , */\ + { 0x6841, "TDMSRCBS"}, /* frame b selection , */\ + { 0x68a0, "ANC1C"}, /* ANC one s complement , */\ + { 0x6901, "SAMMODE"}, /* Sam mode , */\ + { 0x7033, "DCMCC"}, /* Max coil current , */\ + { 0x7071, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ + { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ + { 0x70c1, "DCINSEL"}, /* DCDC IIR input Selection , */\ + { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ + { 0x7504, "DCTRIP"}, /* Adaptive boost trip levels 1, effective only when boost_intelligent is set to 1, */\ + { 0x7554, "DCTRIP2"}, /* Adaptive boost trip level 2, effective only when boost_intelligent is set to 1, */\ + { 0x75a4, "DCTRIPT"}, /* Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x7635, "DCVOF"}, /* First boost voltage level , */\ + { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ + { 0x9000, "RST"}, /* Reset , */\ + { 0x9011, "DMEM"}, /* Target memory , */\ + { 0x9030, "AIF"}, /* Auto increment , */\ + { 0x9040, "CFINT"}, /* Interrupt - auto clear , */\ + { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ + { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ + { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ + { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ + { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ + { 0x910f, "MADD"}, /* Memory address , */\ + { 0x920f, "MEMA"}, /* Activate memory access , */\ + { 0x9307, "ERR"}, /* Error flags , */\ + { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ + { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ + { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ + { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ + { 0xb108, "EXTTS"}, /* External temperature (C) , */\ + { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ + { 0xee0f, "SWPROFIL"}, /* Software profile data , */\ + { 0xef0f, "SWVSTEP"}, /* Software vstep information , */\ + { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ + { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ + { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ + { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "DCMCCCL"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "USERDEF"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf40f, "R25C"}, /* Ron resistance of speaker coil , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +#define TFA9912_BITNAMETABLE static tfaBfName_t Tfa9912BitNames[] = {\ + { 0x0, "powerdown"}, /* Powerdown selection , */\ + { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ + { 0x20, "enbl_coolflux"}, /* Enable CoolFlux , */\ + { 0x30, "enbl_amplifier"}, /* Enables the Amplifier , */\ + { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ + { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ + { 0x60, "sel_enbl_amplifier"}, /* CoolFlux controls amplifier , */\ + { 0x71, "int_pad_io"}, /* Interrupt config , */\ + { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ + { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ + { 0xc0, "test_ocp"}, /* OCP testing control , */\ + { 0x101, "vamp_sel"}, /* Amplifier input selection , */\ + { 0x120, "src_set_configured"}, /* I2C configured , */\ + { 0x130, "execute_cold_start"}, /* Execute cold start , */\ + { 0x140, "enbl_fro8m_auto_off"}, /* Internal osc off at PWDN , */\ + { 0x150, "man_enbl_brown_out"}, /* Reaction on BOD , */\ + { 0x160, "enbl_bod"}, /* BOD Enable , */\ + { 0x170, "enbl_bod_hyst"}, /* BOD Hysteresis , */\ + { 0x181, "bod_delay"}, /* BOD filter , */\ + { 0x1a1, "bod_lvlsel"}, /* BOD threshold , */\ + { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ + { 0x1e0, "pwm_sel_rcv_ns"}, /* Noise shaper selection , */\ + { 0x1f0, "man_enbl_watchdog"}, /* Watchdog enable , */\ + { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ + { 0x240, "input_level"}, /* TDM output attenuation , */\ + { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ + { 0x2b0, "bypass_hvbat_filter"}, /* Bypass HVBAT filter , */\ + { 0x2c0, "tdm_tfa9872_compatible"}, /* TDM Compatibility with TFA9872 , */\ + { 0x2d0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ + { 0x2e0, "enbl_adc10"}, /* ADC10 Enable - I2C direct mode , */\ + { 0x30f, "device_rev"}, /* Revision info , */\ + { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ + { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ + { 0x430, "cf_clock_scaling"}, /* Coolflux DSP clock scaling, low power mode , */\ + { 0x441, "sel_cf_clock"}, /* Coolflux DSP clock scaler selection for low power mode, */\ + { 0x460, "tdm_intf_sel"}, /* TDM clock selection , */\ + { 0x470, "disable_auto_sel_refclk"}, /* Disable Automatic dsp clock source selection , */\ + { 0x480, "sel_clk_src"}, /* I2C selection of DSP clock when auto select is disabled, */\ + { 0x490, "wdt_tim_clk_src"}, /* I2C selection of Watchdog and Timer clock , */\ + { 0x510, "enbl_spkr_ss"}, /* Enable speaker path , */\ + { 0x530, "enbl_volsense"}, /* Voltage sense , */\ + { 0x550, "enbl_cursense"}, /* Current sense , */\ + { 0x560, "enbl_pdm_ss"}, /* Sub-system PDM , */\ + { 0x580, "enbl_pga_chop"}, /* Enable PGA chop clock , */\ + { 0x590, "enbl_tdm_ss"}, /* Sub-system TDM , */\ + { 0x5a0, "enbl_bst_ss"}, /* Sub-system boost , */\ + { 0x5b0, "enbl_adc10_ss"}, /* Sub-system ADC , */\ + { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ + { 0x5d0, "enbl_tim_clk"}, /* CF Sub-system timer , */\ + { 0x5e0, "enbl_wdt_clk"}, /* CF Sub-system WDT , */\ + { 0x5f0, "faim_enable_vbg"}, /* Over rule of vbg for FaIM access , */\ + { 0x600, "aux_spkr_sel"}, /* Input selection for TAP/SAM , */\ + { 0x620, "bypass_tapdec_reset"}, /* Tap decimator reset bypass - Bypass the decimator reset from tapdec, */\ + { 0x631, "car_dec_in_sel0"}, /* Cardec input 0 sel , */\ + { 0x651, "car_dec_in_sel1"}, /* Cardec input sel , */\ + { 0x670, "tapdec_sel"}, /* Select TAP/Cardec for TAP , */\ + { 0x680, "comp_count"}, /* Comparator o/p filter selection , */\ + { 0x691, "startup_mode"}, /* Startup Mode Selection , */\ + { 0x6b0, "enable_auto_tap_switching"}, /* Enable auto tap switching , */\ + { 0x6c1, "comp_init_time"}, /* Comparator initialization time to be used in Tap Machine, */\ + { 0x6e1, "ana_init_time"}, /* Analog initialization time to be used in Tap Machine, */\ + { 0x707, "clkchk_th_hi"}, /* Clock check Higher Threshold , */\ + { 0x787, "clkchk_th_lo"}, /* Clock check Higher Threshold , */\ + { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ + { 0x832, "ctrl_on2tap_criterion"}, /* Amplifier on-off criteria for tap mode entry , */\ + { 0xd00, "side_tone_gain_sel"}, /* PDM side tone gain selector , */\ + { 0xd18, "side_tone_gain"}, /* Side tone gain , */\ + { 0xda0, "mute_side_tone"}, /* Side tone soft mute , */\ + { 0xdb0, "side_tone_1scomplement"}, /* side tone one s complement , */\ + { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ + { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ + { 0x1000, "flag_por"}, /* POR , */\ + { 0x1010, "flag_pll_lock"}, /* PLL lock , */\ + { 0x1020, "flag_otpok"}, /* OTP alarm , */\ + { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ + { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ + { 0x1050, "flag_clocks_stable"}, /* Clocks stable , */\ + { 0x1060, "flag_mtp_busy"}, /* MTP busy , */\ + { 0x1070, "flag_lost_clk"}, /* Lost clock , */\ + { 0x1090, "flag_cold_started"}, /* Cold Start , */\ + { 0x10a0, "flag_engage"}, /* Amplifier engage , */\ + { 0x10b0, "flag_watchdog_reset"}, /* Watchdog , */\ + { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ + { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ + { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ + { 0x10f0, "flag_bod_vddd_nok"}, /* BOD , */\ + { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ + { 0x1110, "flag_bst_hiz"}, /* DCDC active , */\ + { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos , */\ + { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ + { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ + { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ + { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ + { 0x1170, "flag_soft_mute_busy"}, /* side tone (un)mute busy , */\ + { 0x1180, "flag_soft_mute_state"}, /* side tone mute state , */\ + { 0x1190, "flag_tdm_lut_error"}, /* TDM LUT error , */\ + { 0x11a2, "flag_tdm_status"}, /* TDM status bits , */\ + { 0x11d0, "flag_tdm_error"}, /* TDM error , */\ + { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ + { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ + { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ + { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ + { 0x1340, "flag_clipa_high"}, /* Clipping A to Vddp , */\ + { 0x1350, "flag_clipa_low"}, /* Clipping A to gnd , */\ + { 0x1360, "flag_clipb_high"}, /* Clipping B to Vddp , */\ + { 0x1370, "flag_clipb_low"}, /* Clipping B to gnd , */\ + { 0x1380, "flag_ocp_alarm"}, /* OCP amplifier , */\ + { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ + { 0x13a0, "flag_tap_comp_trig"}, /* Status Tap comparator triggered , */\ + { 0x13b0, "flag_cf_tapdetected"}, /* Status Tap detected , */\ + { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ + { 0x13d0, "flag_man_wait_cf_config"}, /* Wait CF config , */\ + { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ + { 0x1410, "flag_cf_speakererror"}, /* Speaker status , */\ + { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ + { 0x1433, "man_state"}, /* Device manager status , */\ + { 0x1471, "status_bst_mode"}, /* DCDC mode status bits , */\ + { 0x1490, "man_dsp_clk_src"}, /* DSP clock source selected by manager , */\ + { 0x14a1, "man_startup_mode"}, /* Startup Mode Selected by Manager(Read Only) , */\ + { 0x14c3, "tap_machine_state"}, /* Tap Machine State , */\ + { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ + { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ + { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ + { 0x17a0, "flag_bst_bstcur_cf"}, /* DCDC current limiting for DSP , */\ + { 0x2000, "tdm_usecase"}, /* Mode setting , */\ + { 0x2011, "dio4_input_sel"}, /* DIO4 Input selection , */\ + { 0x2040, "tdm_enable"}, /* Enable TDM interface , */\ + { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ + { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ + { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ + { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ + { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ + { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ + { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ + { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ + { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ + { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ + { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ + { 0x2271, "tdm_txdata_format"}, /* Format unused bits in a slot , */\ + { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots GAINIO , */\ + { 0x22b1, "tdm_txdata_format_unused_slot_sd1"}, /* Format unused slots DIO1 , */\ + { 0x22d1, "tdm_txdata_format_unused_slot_sd2"}, /* Format unused slots DIO2 , */\ + { 0x2300, "tdm_sink0_enable"}, /* Control gain (channel in 0) , */\ + { 0x2310, "tdm_sink1_enable"}, /* Control audio left (channel in 1 ) , */\ + { 0x2320, "tdm_sink2_enable"}, /* Control audio right (channel in 2 ) , */\ + { 0x2330, "tdm_source0_enable"}, /* Current sense , */\ + { 0x2340, "tdm_source1_enable"}, /* Voltage sense , */\ + { 0x2350, "tdm_source2_enable"}, /* DSP Gainout , */\ + { 0x2360, "tdm_source3_enable"}, /* DSP 2 , */\ + { 0x2370, "tdm_source4_enable"}, /* DSP 3 , */\ + { 0x2380, "tdm_source5_enable"}, /* DSP , */\ + { 0x2390, "tdm_source6_enable"}, /* Loopback of Audio left (channel 1) , */\ + { 0x23a0, "tdm_source7_enable"}, /* Loopback of Audio right (channel 2) , */\ + { 0x2401, "tdm_sink0_io"}, /* IO gainin , */\ + { 0x2421, "tdm_sink1_io"}, /* IO audio left , */\ + { 0x2441, "tdm_sink2_io"}, /* IO audio right , */\ + { 0x2461, "tdm_source0_io"}, /* IO Current Sense , */\ + { 0x2481, "tdm_source1_io"}, /* IO voltage sense , */\ + { 0x24a1, "tdm_source2_io"}, /* IO gain out , */\ + { 0x24c1, "tdm_source3_io"}, /* IO DSP 2 , */\ + { 0x24e1, "tdm_source4_io"}, /* IO DSP 3 , */\ + { 0x2501, "tdm_source5_io"}, /* IO DSP , */\ + { 0x2521, "tdm_source6_io"}, /* IO Source 6 , */\ + { 0x2541, "tdm_source7_io"}, /* IO Source 7 , */\ + { 0x2603, "tdm_sink0_slot"}, /* Control gainin , */\ + { 0x2643, "tdm_sink1_slot"}, /* tdm slot for audio left (channel 1) , */\ + { 0x2683, "tdm_sink2_slot"}, /* tdm slot for audio right (channel 2) , */\ + { 0x26c3, "tdm_source0_slot"}, /* Slot Position of Current Sense Out , */\ + { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense , */\ + { 0x2743, "tdm_source2_slot"}, /* Slot Position of GAIN out , */\ + { 0x2783, "tdm_source3_slot"}, /* Slot Position DSPout2 , */\ + { 0x27c3, "tdm_source4_slot"}, /* Slot Position DSPout3 , */\ + { 0x2803, "tdm_source5_slot"}, /* Slot Position of DSPout , */\ + { 0x2843, "tdm_source6_slot"}, /* Slot Position of loopback channel left , */\ + { 0x2883, "tdm_source7_slot"}, /* Slot Position of loopback channel right , */\ + { 0x2901, "tdm_txdata_format_unused_slot_sd3"}, /* Format unused slots D3 , */\ + { 0x3100, "pdm_mode"}, /* PDM control , */\ + { 0x3110, "pdm_input_sel"}, /* PDM Decimator input selection , */\ + { 0x3120, "enbl_pdm_side_tone"}, /* Side tone input enable , */\ + { 0x3201, "pdm_nbck"}, /* PDM BCK/Fs ratio , */\ + { 0x4000, "int_out_flag_por"}, /* Status POR , */\ + { 0x4010, "int_out_flag_pll_lock"}, /* Status PLL lock , */\ + { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ + { 0x4030, "int_out_flag_ovpok"}, /* Status OVP alarm , */\ + { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ + { 0x4050, "int_out_flag_clocks_stable"}, /* Status clocks stable , */\ + { 0x4060, "int_out_flag_mtp_busy"}, /* Status MTP busy , */\ + { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ + { 0x4080, "int_out_flag_cf_speakererror"}, /* Status speaker error , */\ + { 0x4090, "int_out_flag_cold_started"}, /* Status cold start , */\ + { 0x40a0, "int_out_flag_engage"}, /* Status amplifier engage , */\ + { 0x40b0, "int_out_flag_watchdog_reset"}, /* Status watchdog , */\ + { 0x40c0, "int_out_flag_enbl_amp"}, /* Status amplifier enable , */\ + { 0x40d0, "int_out_flag_enbl_ref"}, /* Status Ref enable , */\ + { 0x40e0, "int_out_flag_adc10_ready"}, /* Status Control ADC , */\ + { 0x40f0, "int_out_flag_bod_vddd_nok"}, /* Status BOD , */\ + { 0x4100, "int_out_flag_bst_bstcur"}, /* Status DCDC current limiting , */\ + { 0x4110, "int_out_flag_bst_hiz"}, /* Status DCDC active , */\ + { 0x4120, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ + { 0x4130, "int_out_flag_bst_peakcur"}, /* Status bst peakcur , */\ + { 0x4140, "int_out_flag_bst_voutcomp"}, /* Status DCDC level 1x , */\ + { 0x4150, "int_out_flag_bst_voutcomp86"}, /* Status DCDC level 1.14x , */\ + { 0x4160, "int_out_flag_bst_voutcomp93"}, /* Status DCDC level 1.07x , */\ + { 0x4190, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ + { 0x41a0, "int_out_flag_man_wait_src_settings"}, /* Status Waits HW I2C settings , */\ + { 0x41b0, "int_out_flag_man_wait_cf_config"}, /* Status waits CF config , */\ + { 0x41c0, "int_out_flag_man_start_mute_audio"}, /* Status Audio mute sequence , */\ + { 0x41d0, "int_out_flag_cfma_err"}, /* Status cfma error , */\ + { 0x41e0, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ + { 0x41f0, "int_out_flag_clk_out_of_range"}, /* Status flag_clk_out_of_range , */\ + { 0x4200, "int_out_flag_tdm_error"}, /* Status tdm error , */\ + { 0x4220, "int_out_flag_clip"}, /* Status clip , */\ + { 0x4250, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 , */\ + { 0x4260, "int_out_flag_low_amplitude"}, /* Status low amplitude detection , */\ + { 0x4270, "int_out_flag_vddp_gt_vbat"}, /* Status VDDP greater than VBAT , */\ + { 0x4280, "int_out_newtap"}, /* Status Tap detected , */\ + { 0x4290, "int_out_audiomodeactive"}, /* Status Audio Mode activated , */\ + { 0x42a0, "int_out_sammodeactive"}, /* Status SAM Mode activated , */\ + { 0x42b0, "int_out_tapmodeactive"}, /* Status Tap Mode Activated , */\ + { 0x42c0, "int_out_flag_tap_comp_trig"}, /* Status Tap comparator triggered , */\ + { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ + { 0x4410, "int_in_flag_pll_lock"}, /* Clear PLL lock , */\ + { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ + { 0x4430, "int_in_flag_ovpok"}, /* Clear OVP alarm , */\ + { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ + { 0x4450, "int_in_flag_clocks_stable"}, /* Clear clocks stable , */\ + { 0x4460, "int_in_flag_mtp_busy"}, /* Clear mtp busy , */\ + { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ + { 0x4480, "int_in_flag_cf_speakererror"}, /* Clear speaker error , */\ + { 0x4490, "int_in_flag_cold_started"}, /* Clear cold started , */\ + { 0x44a0, "int_in_flag_engage"}, /* Clear amplifier engage , */\ + { 0x44b0, "int_in_flag_watchdog_reset"}, /* Clear watchdog , */\ + { 0x44c0, "int_in_flag_enbl_amp"}, /* Clear enbl amp , */\ + { 0x44d0, "int_in_flag_enbl_ref"}, /* Clear ref enable , */\ + { 0x44e0, "int_in_flag_adc10_ready"}, /* Clear control ADC , */\ + { 0x44f0, "int_in_flag_bod_vddd_nok"}, /* Clear BOD , */\ + { 0x4500, "int_in_flag_bst_bstcur"}, /* Clear DCDC current limiting , */\ + { 0x4510, "int_in_flag_bst_hiz"}, /* Clear DCDC active , */\ + { 0x4520, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ + { 0x4530, "int_in_flag_bst_peakcur"}, /* Clear bst peakcur , */\ + { 0x4540, "int_in_flag_bst_voutcomp"}, /* Clear DCDC level 1x , */\ + { 0x4550, "int_in_flag_bst_voutcomp86"}, /* Clear DCDC level 1.14x , */\ + { 0x4560, "int_in_flag_bst_voutcomp93"}, /* Clear DCDC level 1.07x , */\ + { 0x4590, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ + { 0x45a0, "int_in_flag_man_wait_src_settings"}, /* Clear wait HW I2C settings , */\ + { 0x45b0, "int_in_flag_man_wait_cf_config"}, /* Clear wait cf config , */\ + { 0x45c0, "int_in_flag_man_start_mute_audio"}, /* Clear audio mute sequence , */\ + { 0x45d0, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ + { 0x45e0, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ + { 0x45f0, "int_in_flag_clk_out_of_range"}, /* Clear flag_clk_out_of_range , */\ + { 0x4600, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ + { 0x4620, "int_in_flag_clip"}, /* Clear clip , */\ + { 0x4650, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 , */\ + { 0x4660, "int_in_flag_low_amplitude"}, /* Clear low amplitude detection , */\ + { 0x4670, "int_in_flag_vddp_gt_vbat"}, /* Clear VDDP greater then VBAT , */\ + { 0x4680, "int_in_newtap"}, /* Clear Tap detected , */\ + { 0x4690, "int_in_audiomodeactive"}, /* Clear Audio Mode activated , */\ + { 0x46a0, "int_in_sammodeactive"}, /* Clear SAM Mode activated , */\ + { 0x46b0, "int_in_tapmodeactive"}, /* Clear Tap Mode Activated , */\ + { 0x46c0, "int_in_flag_tap_comp_trig"}, /* Clear Comparator Interrupt , */\ + { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ + { 0x4810, "int_enable_flag_pll_lock"}, /* Enable pll lock , */\ + { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ + { 0x4830, "int_enable_flag_ovpok"}, /* Enable OVP alarm , */\ + { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ + { 0x4850, "int_enable_flag_clocks_stable"}, /* Enable clocks stable , */\ + { 0x4860, "int_enable_flag_mtp_busy"}, /* Enable mtp busy , */\ + { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ + { 0x4880, "int_enable_flag_cf_speakererror"}, /* Enable speaker error , */\ + { 0x4890, "int_enable_flag_cold_started"}, /* Enable cold started , */\ + { 0x48a0, "int_enable_flag_engage"}, /* Enable amplifier engage , */\ + { 0x48b0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog , */\ + { 0x48c0, "int_enable_flag_enbl_amp"}, /* Enable enbl amp , */\ + { 0x48d0, "int_enable_flag_enbl_ref"}, /* Enable ref enable , */\ + { 0x48e0, "int_enable_flag_adc10_ready"}, /* Enable Control ADC , */\ + { 0x48f0, "int_enable_flag_bod_vddd_nok"}, /* Enable BOD , */\ + { 0x4900, "int_enable_flag_bst_bstcur"}, /* Enable DCDC current limiting , */\ + { 0x4910, "int_enable_flag_bst_hiz"}, /* Enable DCDC active , */\ + { 0x4920, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ + { 0x4930, "int_enable_flag_bst_peakcur"}, /* Enable bst peakcur , */\ + { 0x4940, "int_enable_flag_bst_voutcomp"}, /* Enable DCDC level 1x , */\ + { 0x4950, "int_enable_flag_bst_voutcomp86"}, /* Enable DCDC level 1.14x , */\ + { 0x4960, "int_enable_flag_bst_voutcomp93"}, /* Enable DCDC level 1.07x , */\ + { 0x4990, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ + { 0x49a0, "int_enable_flag_man_wait_src_settings"}, /* Enable waits HW I2C settings , */\ + { 0x49b0, "int_enable_flag_man_wait_cf_config"}, /* Enable man wait cf config , */\ + { 0x49c0, "int_enable_flag_man_start_mute_audio"}, /* Enable man Audio mute sequence , */\ + { 0x49d0, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ + { 0x49e0, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ + { 0x49f0, "int_enable_flag_clk_out_of_range"}, /* Enable flag_clk_out_of_range , */\ + { 0x4a00, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ + { 0x4a20, "int_enable_flag_clip"}, /* Enable clip , */\ + { 0x4a50, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 , */\ + { 0x4a60, "int_enable_flag_low_amplitude"}, /* Enable low amplitude detection , */\ + { 0x4a70, "int_enable_flag_vddp_gt_vbat"}, /* Enable VDDP greater than VBAT , */\ + { 0x4a80, "int_enable_newtap"}, /* Enable Tap detected , */\ + { 0x4a90, "int_enable_audiomodeactive"}, /* Enable Audio Mode activated , */\ + { 0x4aa0, "int_enable_sammodeactive"}, /* Enable SAM Mode activated , */\ + { 0x4ab0, "int_enable_tapmodeactive"}, /* Enable Tap Mode Activated , */\ + { 0x4ac0, "int_enable_flag_tap_comp_trig"}, /* Enable comparator interrupt , */\ + { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ + { 0x4c10, "int_polarity_flag_pll_lock"}, /* Polarity pll lock , */\ + { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ + { 0x4c30, "int_polarity_flag_ovpok"}, /* Polarity OVP alarm , */\ + { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ + { 0x4c50, "int_polarity_flag_clocks_stable"}, /* Polarity clocks stable , */\ + { 0x4c60, "int_polarity_flag_mtp_busy"}, /* Polarity mtp busy , */\ + { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ + { 0x4c80, "int_polarity_flag_cf_speakererror"}, /* Polarity speaker error , */\ + { 0x4c90, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ + { 0x4ca0, "int_polarity_flag_engage"}, /* Polarity amplifier engage , */\ + { 0x4cb0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog , */\ + { 0x4cc0, "int_polarity_flag_enbl_amp"}, /* Polarity enbl amp , */\ + { 0x4cd0, "int_polarity_flag_enbl_ref"}, /* Polarity ref enable , */\ + { 0x4ce0, "int_polarity_flag_adc10_ready"}, /* Polarity Control ADC , */\ + { 0x4cf0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity BOD , */\ + { 0x4d00, "int_polarity_flag_bst_bstcur"}, /* Polarity DCDC current limiting , */\ + { 0x4d10, "int_polarity_flag_bst_hiz"}, /* Polarity DCDC active , */\ + { 0x4d20, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ + { 0x4d30, "int_polarity_flag_bst_peakcur"}, /* Polarity bst peakcur , */\ + { 0x4d40, "int_polarity_flag_bst_voutcomp"}, /* Polarity DCDC level 1x , */\ + { 0x4d50, "int_polarity_flag_bst_voutcomp86"}, /* Polarity DCDC level 1.14x , */\ + { 0x4d60, "int_polarity_flag_bst_voutcomp93"}, /* Polarity DCDC level 1.07x , */\ + { 0x4d90, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ + { 0x4da0, "int_polarity_flag_man_wait_src_settings"}, /* Polarity waits HW I2C settings , */\ + { 0x4db0, "int_polarity_flag_man_wait_cf_config"}, /* Polarity man wait cf config , */\ + { 0x4dc0, "int_polarity_flag_man_start_mute_audio"}, /* Polarity man audio mute sequence , */\ + { 0x4dd0, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ + { 0x4de0, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ + { 0x4df0, "int_polarity_flag_clk_out_of_range"}, /* Polarity flag_clk_out_of_range , */\ + { 0x4e00, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ + { 0x4e20, "int_polarity_flag_clip"}, /* Polarity clip , */\ + { 0x4e50, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 , */\ + { 0x4e60, "int_polarity_flag_low_amplitude"}, /* Polarity low amplitude detection , */\ + { 0x4e70, "int_polarity_flag_vddp_gt_vbat"}, /* Polarity VDDP greater than VBAT , */\ + { 0x4e80, "int_polarity_newtap"}, /* PolarityTap detected , */\ + { 0x4e90, "int_polarity_audiomodeactive"}, /* PolarityAudio Mode activated , */\ + { 0x4ea0, "int_polarity_sammodeactive"}, /* PolaritySAM Mode activated , */\ + { 0x4eb0, "int_polarity_tapmodeactive"}, /* Polarity Tap Mode Activated , */\ + { 0x4ec0, "int_polarity_flag_tap_comp_trig"}, /* PolarityTap Comparator Trigger , */\ + { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time , */\ + { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ + { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ + { 0x5082, "vbat_prot_release_time"}, /* Battery Safeguard release time , */\ + { 0x50b1, "vbat_prot_hysterese"}, /* Battery Safeguard hysteresis , */\ + { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ + { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ + { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ + { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ + { 0x5110, "soft_mute"}, /* Soft mute HW , */\ + { 0x5130, "cf_mute"}, /* Soft mute FW , */\ + { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ + { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ + { 0x5187, "cf_volume"}, /* FW volume control for primary audio channel , */\ + { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ + { 0x5257, "gain"}, /* Amplifier gain , */\ + { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ + { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ + { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ + { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ + { 0x5340, "clipfast"}, /* Clock selection for HW clipper for Battery Safeguard, */\ + { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ + { 0x5360, "enbl_low_latency"}, /* CF low latency outputs for add module , */\ + { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ + { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ + { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ + { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ + { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ + { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ + { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ + { 0x5582, "dpsa_drive"}, /* Drive setting (bin. coded) - I2C direct mode , */\ + { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually , */\ + { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop - I2C direct mode, */\ + { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ + { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ + { 0x5820, "pwm_shape"}, /* PWM shape , */\ + { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clock is 1/(k*2048*fs), */\ + { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ + { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ + { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ + { 0x5c07, "flag_cf_tap_pattern"}, /* Coolflux tap pattern , */\ + { 0x5c83, "tap_debug_info"}, /* Reserved , */\ + { 0x5d0f, "tap_status_1"}, /* Tap Status 1 from CF FW , */\ + { 0x5f03, "tap_comp_threshold"}, /* Comparator threshold (in uV) , */\ + { 0x6081, "pga_gain_set"}, /* PGA gain selection , */\ + { 0x60b0, "pga_lowpass_enable"}, /* Lowpass enable , */\ + { 0x60c0, "pga_pwr_enable"}, /* PGA power enable , */\ + { 0x60d0, "pga_switch_enable"}, /* PGA switch enable , */\ + { 0x60e0, "pga_switch_aux_enable"}, /* Switch enable aux , */\ + { 0x6123, "ctrl_att"}, /* System gain (INPLEV 0) , */\ + { 0x6265, "zero_lvl"}, /* ctrl threshold for zero X-ing , */\ + { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ + { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ + { 0x6305, "threshold_lvl"}, /* ctrl threshold for low_audio_lvl , */\ + { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ + { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 detector ctrl threshold for zero X-ing , */\ + { 0x64e1, "lpm1_mode"}, /* low power mode1 detector ctrl select mode , */\ + { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 detector ctrl threshold for low_audio_lvl , */\ + { 0x6565, "lpm1_hold_time"}, /* Low power mode1 detector, ctrl hold time before low audio is reckoned to be low audio, */\ + { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ + { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ + { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ + { 0x6630, "dcdcoff_mode"}, /* DCDC , */\ + { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ + { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ + { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage - direct ctrl , */\ + { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ + { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtered vs unfiltered compare , */\ + { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ + { 0x6801, "tdm_source_mapping"}, /* tdm source mapping , */\ + { 0x6821, "tdm_sourcea_frame_sel"}, /* frame a selection , */\ + { 0x6841, "tdm_sourceb_frame_sel"}, /* frame b selection , */\ + { 0x6901, "sam_mode"}, /* Sam mode , */\ + { 0x6931, "pdmdat_h_sel"}, /* pdm out value when pdm_clk is higth , */\ + { 0x6951, "pdmdat_l_sel"}, /* pdm out value when pdm_clk is low , */\ + { 0x6970, "cs_sam_set"}, /* Enable SAM input for current sense - I2C Direct Mode, */\ + { 0x6980, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ + { 0x6990, "sam_spkr_sel"}, /* SAM o/p sel during SAM and audio , */\ + { 0x6b00, "disable_engage"}, /* Disable auto engage , */\ + { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ + { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ + { 0x6c60, "sel_clip_pwms"}, /* To select clip-flags , */\ + { 0x6c72, "pwms_clip_lvl"}, /* To set the amount of pwm pulse that may be skipped before clip-flag is triggered. , */\ + { 0x6ca5, "spare_out"}, /* spare_out , */\ + { 0x6d0f, "spare_in"}, /* spare_in , */\ + { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ + { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ + { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ + { 0x7033, "boost_cur"}, /* Max coil current , */\ + { 0x7071, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ + { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ + { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ + { 0x70c1, "dcdc_sel"}, /* DCDC IIR input Selection , */\ + { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ + { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ + { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ + { 0x7174, "bst_slopecur"}, /* For testing direct control slope current - I2C direct mode, */\ + { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ + { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ + { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ + { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller - I2C direct mode, */\ + { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator - I2C direct mode , */\ + { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ + { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current - I2C direct mode , */\ + { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage - I2C direct mode , */\ + { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac - I2C direct mode , */\ + { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators - I2C direct mode , */\ + { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators - I2C direct mode , */\ + { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators - I2C direct mode , */\ + { 0x7290, "enbl_bst_windac"}, /* Enable window dac - I2C direct mode , */\ + { 0x72a5, "bst_windac"}, /* for testing direct control windac - I2C direct mode, */\ + { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ + { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ + { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ + { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ + { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ + { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ + { 0x74f0, "ignore_flag_voutcomp86"}, /* Ignore flag_voutcomp86 , */\ + { 0x7504, "boost_trip_lvl_1st"}, /* Adaptive boost trip levels 1, effective only when boost_intelligent is set to 1, */\ + { 0x7554, "boost_trip_lvl_2nd"}, /* Adaptive boost trip level 2, effective only when boost_intelligent is set to 1, */\ + { 0x75a4, "boost_trip_lvl_track"}, /* Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ + { 0x7602, "track_decay"}, /* DCDC Boost decay speed after a peak value, effective only when boost_track is set to 1, */\ + { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ + { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ + { 0x7720, "pga_test_ldo_bypass"}, /* bypass internal PGA LDO , */\ + { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ + { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ + { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ + { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ + { 0x8087, "cs_gain"}, /* Current sense gain , */\ + { 0x8200, "enbl_cmfb"}, /* Current sense common mode feedback control , */\ + { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ + { 0x8222, "cmfb_gain"}, /* Current sense common mode feedback control gain , */\ + { 0x8256, "cmfb_offset"}, /* Current sense common mode feedback control offset , */\ + { 0x8305, "cs_ktemp"}, /* First order temperature compensation coefficient , */\ + { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ + { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ + { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ + { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ + { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ + { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ + { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ + { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ + { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ + { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ + { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ + { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ + { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ + { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC - I2C direct mode , */\ + { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 - I2C direct mode, */\ + { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 - I2C direct mode, */\ + { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ + { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 - I2C direct mode, */\ + { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO - I2C direct mode , */\ + { 0x8760, "enbl_cs_nofloating_n"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8770, "enbl_cs_nofloating_p"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ + { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO -- I2C direct mode , */\ + { 0x8800, "volsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ + { 0x8810, "vol_cur_sense_dc_offset"}, /* voltage and current sense decimator offset control, */\ + { 0x8902, "cursense_comp_delay"}, /* To align compensation signal with current sense signal, */\ + { 0x8930, "cursense_comp_sign"}, /* To change polarity of compensation for current sense compensation, */\ + { 0x8940, "enbl_cursense_comp"}, /* To enable current sense compensation , */\ + { 0x9000, "cf_rst_dsp"}, /* Reset , */\ + { 0x9011, "cf_dmem"}, /* Target memory , */\ + { 0x9030, "cf_aif"}, /* Auto increment , */\ + { 0x9040, "cf_int"}, /* Interrupt - auto clear , */\ + { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ + { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ + { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ + { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ + { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ + { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ + { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ + { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ + { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ + { 0x910f, "cf_madd"}, /* Memory address , */\ + { 0x920f, "cf_mema"}, /* Activate memory access , */\ + { 0x9307, "cf_err"}, /* Error flags , */\ + { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ + { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ + { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ + { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ + { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ + { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ + { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ + { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ + { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ + { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ + { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ + { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ + { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ + { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ + { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ + { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ + { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ + { 0xa400, "faim_set_clkws"}, /* Sets the FaIM controller clock wait state register, */\ + { 0xa410, "faim_sel_evenrows"}, /* All even rows of the FaIM are selected, active high, */\ + { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the FaIM are selected, all rows in combination with sel_evenrows, */\ + { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ + { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ + { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ + { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ + { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ + { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ + { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ + { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ + { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ + { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ + { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ + { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ + { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ + { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ + { 0xb108, "ext_temp"}, /* External temperature (C) , */\ + { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ + { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ + { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ + { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ + { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually - - I2C direct mode, */\ + { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ + { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ + { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ + { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ + { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high - I2C direct mode, */\ + { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ + { 0xc130, "tap_comp_enable"}, /* Tap Comparator enable control - I2C direct mode , */\ + { 0xc140, "tap_comp_switch_enable"}, /* Tap Comparator Switch enable control - I2C direct mode, */\ + { 0xc150, "tap_comp_switch_aux_enable"}, /* Tap Comparator Switch enable control - I2C direct mode, */\ + { 0xc161, "tap_comp_test_enable"}, /* Comparator threshold - fine value , */\ + { 0xc180, "curdist_enable"}, /* Enable control - I2C direct mode , */\ + { 0xc190, "vbg2i_enbl"}, /* Enable control - I2C direct mode , */\ + { 0xc1a0, "bg_filt_bypass_enbl"}, /* Enable control , */\ + { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ + { 0xc300, "bypasslatch"}, /* Bypass latch , */\ + { 0xc311, "sourcea"}, /* Set OUTA to , */\ + { 0xc331, "sourceb"}, /* Set OUTB to , */\ + { 0xc350, "inverta"}, /* Invert pwma test signal , */\ + { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ + { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ + { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ + { 0xc3d0, "test_abistfft_enbl"}, /* FFT Coolflux , */\ + { 0xc3e0, "test_pwr_switch"}, /* Test mode for digital power switches core sw/mem sw/micvdd sw, */\ + { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ + { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ + { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ + { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ + { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ + { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ + { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ + { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ + { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ + { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ + { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ + { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ + { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ + { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ + { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ + { 0xc560, "bypass_fro8"}, /* Bypass fro8 with pdm_clk , */\ + { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ + { 0xc5b0, "pga_test_enable"}, /* Enable PGA test mode , */\ + { 0xc5c0, "pga_test_offset_enable"}, /* Enable PGA test offset , */\ + { 0xc5d0, "pga_test_shortinput_enable"}, /* Enable PGA test short input , */\ + { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ + { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ + { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ + { 0xc660, "enbl_powerswitch"}, /* Vddd core power switch control - overrules the manager control, */\ + { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DIO4 (see Digimux list for details), */\ + { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to DIO3 (see Digimux list for details), */\ + { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to TDO (see Digimux list for details), */\ + { 0xc901, "dio1_ehs"}, /* Speed/load setting for DIO1 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc921, "dio2_ehs"}, /* Speed/load setting for DIO2 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc941, "dio3_ehs"}, /* Speed/load setting for DIO3 cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc961, "dio4_ehs"}, /* Speed/load setting for DIO4 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc981, "spdmo_ehs"}, /* Speed/load setting for PDMO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9a1, "tdo_ehs"}, /* Speed/load setting for TDM IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ + { 0xc9c0, "int_ehs"}, /* Slew Rate INT IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ + { 0xc9d0, "pdmclk_ehs"}, /* Slew RateBCK2/PDMCLK IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ + { 0xc9e0, "fs2_ehs"}, /* Slew Rate DS2 IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ + { 0xc9f0, "hs_mode"}, /* I2C high speed mode control , */\ + { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ + { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ + { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ + { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ + { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ + { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ + { 0xcb54, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ + { 0xcba4, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ + { 0xcc05, "pll_seli_lbw"}, /* PLL SELI - Low B/W PLL control mode or I2C direct PLL control mode only, */\ + { 0xcc64, "pll_selp_lbw"}, /* PLL SELP - Low B/W PLL control mode or I2C direct PLL control mode only, */\ + { 0xccb3, "pll_selr_lbw"}, /* PLL SELR - Low B/W PLL control mode or I2C direct PLL control mode only, */\ + { 0xccf0, "sel_user_pll_bw"}, /* PLL Low Bandwidth Mode control , */\ + { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ + { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ + { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ + { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ + { 0xcec0, "enbl_fro8"}, /* Enables FRO8M in I2C direct control mode only , */\ + { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ + { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ + { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ + { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ + { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ + { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ + { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ + { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ + { 0xd283, "tsig_gain"}, /* Test signal gain , */\ + { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ + { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ + { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ + { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ + { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ + { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ + { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ + { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ + { 0xd580, "enbl_clk_range_chk"}, /* Clock out of range , */\ + { 0xd601, "clkdiv_dsp_sel"}, /* DSP clock divider selection in direct clock control mode, */\ + { 0xd621, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ + { 0xd641, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ + { 0xd661, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ + { 0xd681, "dsp_tap_clk"}, /* Dsp clock frequency selection in TAP mode; , */\ + { 0xd6a1, "sel_wdt_clk"}, /* Watch dog clock post divider value , */\ + { 0xd6c1, "sel_tim_clk"}, /* Timer clock post divider value , */\ + { 0xd700, "ads1_ehs"}, /* Slew Rate ADS1 IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ + { 0xd710, "ads2_ehs"}, /* Slew Rate ADS2 IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ + { 0xd822, "test_parametric_io"}, /* test io parametric , */\ + { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ + { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ + { 0xd880, "bst_dcmbst"}, /* dcm boost - I2C direct mode , */\ + { 0xd8a1, "force_pga_clock"}, /* force pga clock , */\ + { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ + { 0xd900, "overrules_usercase"}, /* Overrule Mode control use , */\ + { 0xd910, "ovr_switch_ref"}, /* Overrule Value , */\ + { 0xd920, "ovr_enbl_pll"}, /* Overrule Value , */\ + { 0xd930, "ovr_switch_amp"}, /* Overrule Value , */\ + { 0xd940, "ovr_enbl_clk_cs"}, /* Overrule Value , */\ + { 0xd951, "ovr_sel_clk_cs"}, /* CS clock selection overrule , */\ + { 0xd970, "ovr_switch_cs"}, /* Overrule Value , */\ + { 0xd980, "ovr_enbl_csvs_ss"}, /* Overrule Value , */\ + { 0xd990, "ovr_enbl_comp"}, /* Overrule Value , */\ + { 0xed00, "enbl_fro8cal"}, /* Enable FRO calibration , */\ + { 0xed10, "start_fro8_calibration"}, /* Start FRO8 Calibration , */\ + { 0xed20, "fro8_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ + { 0xed45, "fro8_auto_trim_val"}, /* Calibration value from Auto Calibration block, to be written into MTP - Read Only, */\ + { 0xee0f, "sw_profile"}, /* Software profile data , */\ + { 0xef0f, "sw_vstep"}, /* Software vstep information , */\ + { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ + { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ + { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ + { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ + { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ + { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ + { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ + { 0xf163, "spare_mtp1_9_6"}, /* HW gain module - left channel (2's complement) , */\ + { 0xf1a5, "spare_mtp1_15_10"}, /* Offset for amplifier, HW gain module - left channel (2's complement), */\ + { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ + { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ + { 0xf2a3, "spare_mtp2_13_10"}, /* Trimming of LDO (2.7V) , */\ + { 0xf307, "spare_mtp3_7_0"}, /* SPARE , */\ + { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ + { 0xf40f, "calibr_R25C"}, /* Ron resistance of speaker coil , */\ + { 0xf50f, "spare_mtp5_15_0"}, /* SPARE , */\ + { 0xf600, "mtp_lock_enbl_coolflux"}, /* Disable function dcdcoff_mode , */\ + { 0xf610, "mtp_pwm_delay_enbl_clk_auto_gating"}, /* Auto clock gating on pwm_delay , */\ + { 0xf620, "mtp_ocp_enbl_clk_auto_gating"}, /* Auto clock gating on module ocp , */\ + { 0xf630, "mtp_disable_clk_a_gating"}, /* Disable clock_a gating , */\ + { 0xf642, "spare_mtp6_6_3"}, /* SPARE , */\ + { 0xf686, "spare_mtp6_14_8"}, /* Offset of left amplifier level shifter B , */\ + { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ + { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ + { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ + { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ + { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ + { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ + { 0xf910, "disable_sam_mode"}, /* Disable sam mode , */\ + { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ + { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Disable programming of max dcdc boost voltage , */\ + { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ + { 0xf987, "type_bits_fw"}, /* MTP-control FW - See Firmware I2C API document for details, */\ + { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ + { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ + { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ + { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ + { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ + { 0xff05, "fro8_trim"}, /* 8 MHz oscillator trim code , */\ + { 0xff61, "fro8_short_nwell_r"}, /* Short 4 or 6 n-well resistors , */\ + { 0xff81, "fro8_boost_i"}, /* Self bias current selection , */\ + { 0xffff, "Unknown bitfield enum" } /* not found */\ +}; + +enum tfa9912_irq { + tfa9912_irq_stvdds = 0, + tfa9912_irq_stplls = 1, + tfa9912_irq_stotds = 2, + tfa9912_irq_stovds = 3, + tfa9912_irq_stuvds = 4, + tfa9912_irq_stclks = 5, + tfa9912_irq_stmtpb = 6, + tfa9912_irq_stnoclk = 7, + tfa9912_irq_stspks = 8, + tfa9912_irq_stacs = 9, + tfa9912_irq_stsws = 10, + tfa9912_irq_stwds = 11, + tfa9912_irq_stamps = 12, + tfa9912_irq_starefs = 13, + tfa9912_irq_stadccr = 14, + tfa9912_irq_stbodnok = 15, + tfa9912_irq_stbstcu = 16, + tfa9912_irq_stbsthi = 17, + tfa9912_irq_stbstoc = 18, + tfa9912_irq_stbstpkcur = 19, + tfa9912_irq_stbstvc = 20, + tfa9912_irq_stbst86 = 21, + tfa9912_irq_stbst93 = 22, + tfa9912_irq_strcvld = 23, + tfa9912_irq_stocpl = 24, + tfa9912_irq_stocpr = 25, + tfa9912_irq_stmwsrc = 26, + tfa9912_irq_stmwcfc = 27, + tfa9912_irq_stmwsmu = 28, + tfa9912_irq_stcfmer = 29, + tfa9912_irq_stcfmac = 30, + tfa9912_irq_stclkoor = 31, + tfa9912_irq_sttdmer = 32, + tfa9912_irq_stclpl = 33, + tfa9912_irq_stclpr = 34, + tfa9912_irq_stocpm = 35, + tfa9912_irq_stlp1 = 37, + tfa9912_irq_stla = 38, + tfa9912_irq_stvddp = 39, + tfa9912_irq_sttapdet = 40, + tfa9912_irq_staudmod = 41, + tfa9912_irq_stsammod = 42, + tfa9912_irq_sttapmod = 43, + tfa9912_irq_sttaptrg = 44, + tfa9912_irq_max = 45, + tfa9912_irq_all = -1 /* all irqs */}; + +#define TFA9912_IRQ_NAMETABLE static tfaIrqName_t Tfa9912IrqNames[] = {\ + { 0, "STVDDS"},\ + { 1, "STPLLS"},\ + { 2, "STOTDS"},\ + { 3, "STOVDS"},\ + { 4, "STUVDS"},\ + { 5, "STCLKS"},\ + { 6, "STMTPB"},\ + { 7, "STNOCLK"},\ + { 8, "STSPKS"},\ + { 9, "STACS"},\ + { 10, "STSWS"},\ + { 11, "STWDS"},\ + { 12, "STAMPS"},\ + { 13, "STAREFS"},\ + { 14, "STADCCR"},\ + { 15, "STBODNOK"},\ + { 16, "STBSTCU"},\ + { 17, "STBSTHI"},\ + { 18, "STBSTOC"},\ + { 19, "STBSTPKCUR"},\ + { 20, "STBSTVC"},\ + { 21, "STBST86"},\ + { 22, "STBST93"},\ + { 23, "STRCVLD"},\ + { 24, "STOCPL"},\ + { 25, "STOCPR"},\ + { 26, "STMWSRC"},\ + { 27, "STMWCFC"},\ + { 28, "STMWSMU"},\ + { 29, "STCFMER"},\ + { 30, "STCFMAC"},\ + { 31, "STCLKOOR"},\ + { 32, "STTDMER"},\ + { 33, "STCLPL"},\ + { 34, "STCLPR"},\ + { 35, "STOCPM"},\ + { 36, "36"},\ + { 37, "STLP1"},\ + { 38, "STLA"},\ + { 39, "STVDDP"},\ + { 40, "STTAPDET"},\ + { 41, "STAUDMOD"},\ + { 42, "STSAMMOD"},\ + { 43, "STTAPMOD"},\ + { 44, "STTAPTRG"},\ + { 45, "45"},\ +}; +#endif /* _TFA9912_TFAFIELDNAMES_H */ diff --git a/inc/tfa_container.h b/inc/tfa_container.h new file mode 100644 index 000000000000..578cebb3535c --- /dev/null +++ b/inc/tfa_container.h @@ -0,0 +1,359 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/* + * tfaContainer.h + * + * Created on: Sep 11, 2013 + * Author: wim + */ + +#ifndef TFACONTAINER_H_ +#define TFACONTAINER_H_ + +/* static limits */ +#define TFACONT_MAXDEVS (4) /* maximum nr of devices */ +#define TFACONT_MAXPROFS (16) /* maximum nr of profiles */ + +#include "tfa98xx_parameters.h" + +/** +* Pass the container buffer, initialize and allocate internal memory. +* +* @param cnt pointer to the start of the buffer holding the container file +* @param length of the data in bytes +* @return +* - tfa_error_ok if normal +* - tfa_error_container invalid container data +* - tfa_error_bad_param invalid parameter +* +*/ +enum tfa_error tfa_load_cnt(void *cnt, int length); + +/** + * Return the descriptor string + * @param cnt pointer to the container struct + * @param dsc pointer to Tfa descriptor + * @return descriptor string + */ +char *tfaContGetString(TfaContainer_t *cnt, TfaDescPtr_t *dsc); + +/** + * Gets the string for the given command type number + * @param type number representing a command + * @return string of a command + */ +char *tfaContGetCommandString(uint32_t type); + +/** + * get the device type from the patch in this devicelist + * - find the patch file for this devidx + * - return the devid from the patch or 0 if not found + * @param cnt pointer to container file + * @param dev_idx device index + * @return descriptor string + */ +int tfa_cnt_get_devid(TfaContainer_t *cnt, int dev_idx); + +/** + * Get the slave for the device if it exists. + * @param tfa the device struct pointer + * @param slave_addr the index of the device + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContGetSlave(struct tfa_device *tfa, uint8_t *slave_addr); + +void tfaContSetSlave(uint8_t slave_addr); + +/** + * Get the index for a skave address. + * @param tfa the device struct pointer + * @return the device index + */ +int tfa_cont_get_idx(struct tfa_device *tfa); + +/** + * Write reg and bitfield items in the devicelist to the target. + * @param tfa the device struct pointer + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContWriteRegsDev(struct tfa_device *tfa); + +/** + * Write reg and bitfield items in the profilelist to the target. + * @param tfa the device struct pointer + * @param prof_idx the profile index + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContWriteRegsProf(struct tfa_device *tfa, int prof_idx); + +/** + * Write a patchfile in the devicelist to the target. + * @param tfa the device struct pointer + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContWritePatch(struct tfa_device *tfa); + +/** + * Write all param files in the devicelist to the target. + * @param tfa the device struct pointer + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContWriteFiles(struct tfa_device *tfa); + +/** + * Get sample rate from passed profile index + * @param tfa the device struct pointer + * @param prof_idx the index of the profile + * @return sample rate value + */ +unsigned int tfa98xx_get_profile_sr(struct tfa_device *tfa, unsigned int prof_idx); + +/** + * Get the device name string + * @param cnt the pointer to the container struct + * @param dev_idx the index of the device + * @return device name string or error string if not found + */ +char *tfaContDeviceName(TfaContainer_t *cnt, int dev_idx); + +/** + * Get the application name from the container file application field + * @param tfa the device struct pointer + * @param name the input stringbuffer with size: sizeof(application field)+1 + * @return actual string length + */ +int tfa_cnt_get_app_name(struct tfa_device *tfa, char *name); + +/** + * Get profile index of the calibration profile + * @param tfa the device struct pointer + * @return profile index, -2 if no calibration profile is found or -1 on error + */ +int tfaContGetCalProfile(struct tfa_device *tfa); + +/** + * Is the profile a tap profile ? + * @param tfa the device struct pointer + * @param prof_idx the index of the profile + * @return 1 if the profile is a tap profile or 0 if not + */ +int tfaContIsTapProfile(struct tfa_device *tfa, int prof_idx); + +/** + * Get the name of the profile at certain index for a device in the container file + * @param cnt the pointer to the container struct + * @param dev_idx the index of the device + * @param prof_idx the index of the profile + * @return profile name string or error string if not found + */ +char *tfaContProfileName(TfaContainer_t *cnt, int dev_idx, int prof_idx); + +/** + * Process all items in the profilelist + * NOTE an error return during processing will leave the device muted + * @param tfa the device struct pointer + * @param prof_idx index of the profile + * @param vstep_idx index of the vstep + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContWriteProfile(struct tfa_device *tfa, int prof_idx, int vstep_idx); + +/** + * Specify the speaker configurations (cmd id) (Left, right, both, none) + * @param dev_idx index of the device + * @param configuration name string of the configuration + */ +void tfa98xx_set_spkr_select(int dev_idx, char *configuration); + +enum Tfa98xx_Error tfa_cont_write_filterbank(struct tfa_device *tfa, TfaFilter_t *filter); + +/** + * Write all param files in the profilelist to the target + * this is used during startup when maybe ACS is set + * @param tfa the device struct pointer + * @param prof_idx the index of the profile + * @param vstep_idx the index of the vstep + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContWriteFilesProf(struct tfa_device *tfa, int prof_idx, int vstep_idx); +enum Tfa98xx_Error tfaContWriteFilesVstep(struct tfa_device *tfa, int prof_idx, int vstep_idx); +enum Tfa98xx_Error tfaContWriteDrcFile(struct tfa_device *tfa, int size, uint8_t data[]); + +/** + * Get the device list dsc from the tfaContainer + * @param cont pointer to the tfaContainer + * @param dev_idx the index of the device + * @return device list pointer + */ +TfaDeviceList_t *tfaContGetDevList(TfaContainer_t *cont, int dev_idx); + +/** + * Get the Nth profile for the Nth device + * @param cont pointer to the tfaContainer + * @param dev_idx the index of the device + * @param prof_idx the index of the profile + * @return profile list pointer + */ +TfaProfileList_t *tfaContGetDevProfList(TfaContainer_t *cont, int dev_idx, int prof_idx); + +/** + * Get the number of profiles for device from contaienr + * @param cont pointer to the tfaContainer + * @param dev_idx the index of the device + * @return device list pointer + */ +int tfa_cnt_get_dev_nprof(struct tfa_device *tfa); + + +/** + * Get the Nth livedata for the Nth device + * @param cont pointer to the tfaContainer + * @param dev_idx the index of the device + * @param livedata_idx the index of the livedata + * @return livedata list pointer + */ +TfaLiveDataList_t *tfaContGetDevLiveDataList(TfaContainer_t *cont, int dev_idx, int livedata_idx); + +/** + * Check CRC for container + * @param cont pointer to the tfaContainer + * @return error value 0 on error + */ +int tfaContCrcCheckContainer(TfaContainer_t *cont); + +/** + * Get the device list pointer + * @param cnt pointer to the container struct + * @param dev_idx the index of the device + * @return pointer to device list + */ +TfaDeviceList_t *tfaContDevice(TfaContainer_t *cnt, int dev_idx); + +/** + * Return the pointer to the first profile in a list from the tfaContainer + * @param cont pointer to the tfaContainer + * @return pointer to first profile in profile list + */ +TfaProfileList_t *tfaContGet1stProfList(TfaContainer_t *cont); + +/** + * Return the pointer to the next profile in a list + * @param prof is the pointer to the profile list + * @return profile list pointer + */ +TfaProfileList_t *tfaContNextProfile(TfaProfileList_t *prof); + +/** + * Return the pointer to the first livedata in a list from the tfaContainer + * @param cont pointer to the tfaContainer + * @return pointer to first livedata in profile list + */ +TfaLiveDataList_t *tfaContGet1stLiveDataList(TfaContainer_t *cont); + +/** + * Return the pointer to the next livedata in a list + * @param livedata_idx is the pointer to the livedata list + * @return livedata list pointer + */ +TfaLiveDataList_t *tfaContNextLiveData(TfaLiveDataList_t *livedata_idx); + +/** + * Write a bit field + * @param tfa the device struct pointer + * @param bf bitfield to write + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaRunWriteBitfield(struct tfa_device *tfa, TfaBitfield_t bf); + +/** + * Write a parameter file to the device + * @param tfa the device struct pointer + * @param file filedescriptor pointer + * @param vstep_idx index to vstep + * @param vstep_msg_idx index to vstep message + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaContWriteFile(struct tfa_device *tfa, TfaFileDsc_t *file, int vstep_idx, int vstep_msg_idx); + +/** + * Get the max volume step associated with Nth profile for the Nth device + * @param tfa the device struct pointer + * @param prof_idx profile index + * @return the number of vsteps + */ +int tfacont_get_max_vstep(struct tfa_device *tfa, int prof_idx); + +/** + * Get the file contents associated with the device or profile + * Search within the device tree, if not found, search within the profile + * tree. There can only be one type of file within profile or device. + * @param tfa the device struct pointer + * @param prof_idx I2C profile index in the device + * @param type file type + * @return 0 NULL if file type is not found + * @return 1 file contents + */ +TfaFileDsc_t *tfacont_getfiledata(struct tfa_device *tfa, int prof_idx, enum TfaHeaderType type); + +/** + * Dump the contents of the file header + * @param hdr pointer to file header data + */ +void tfaContShowHeader(TfaHeader_t *hdr); + +/** + * Read a bit field + * @param tfa the device struct pointer + * @param bf bitfield to read out + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfaRunReadBitfield(struct tfa_device *tfa, TfaBitfield_t *bf); + +/** + * Get hw feature bits from container file + * @param tfa the device struct pointer + * @param hw_feature_register pointer to where hw features are stored + */ +void get_hw_features_from_cnt(struct tfa_device *tfa, int *hw_feature_register); + +/** + * Get sw feature bits from container file + * @param tfa the device struct pointer + * @param sw_feature_register pointer to where sw features are stored + */ +void get_sw_features_from_cnt(struct tfa_device *tfa, int sw_feature_register[2]); + +/** + * Factory trimming for the Boost converter + * check if there is a correction needed + * @param tfa the device struct pointer + */ +enum Tfa98xx_Error tfa98xx_factory_trimmer(struct tfa_device *tfa); + +/** + * Search for filters settings and if found then write them to the device + * @param tfa the device struct pointer + * @param prof_idx profile to look in + * @return Tfa98xx_Error + */ +enum Tfa98xx_Error tfa_set_filters(struct tfa_device *tfa, int prof_idx); + +/** + * Get the firmware version from the patch in the container file + * @param tfa the device struct pointer + * @return firmware version + */ +int tfa_cnt_get_patch_version(struct tfa_device *tfa); + +int tfa_tib_dsp_msgmulti(struct tfa_device *tfa, int length, const char *buffer); + +#endif /* TFACONTAINER_H_ */ diff --git a/inc/tfa_device.h b/inc/tfa_device.h new file mode 100644 index 000000000000..f220c6e2228f --- /dev/null +++ b/inc/tfa_device.h @@ -0,0 +1,296 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +/**\file + * + * The tfa_device interface controls a single I2C device instance by + * referencing to the device specific context provided by means of the + * tfa_device structure pointer. + * Multiple instances of tfa_device structures will be created and maintained + * by the caller. + * + * The API is functionally grouped as: + * - tfa_dev basic codec interface to probe, start/stop and control the device state + * - access to internal MTP storage + * - abstraction for interrupt bits and handling + * - container reading support + */ +#ifndef __TFA_DEVICE_H__ +#define __TFA_DEVICE_H__ + +#include "config.h" + +struct tfa_device; + +/* + * hw/sw feature bit settings in MTP + */ +enum featureSupport { + supportNotSet, /**< default means not set yet */ + supportNo, /**< no support */ + supportYes /**< supported */ +}; +/* + * supported Digital Audio Interfaces bitmap + */ +enum Tfa98xx_DAI { + Tfa98xx_DAI_I2S = 0x01, /**< I2S only */ + Tfa98xx_DAI_TDM = 0x02, /**< TDM, I2S */ + Tfa98xx_DAI_PDM = 0x04, /**< PDM */ + }; + +/* + * device ops function structure + */ +struct tfa_device_ops { + enum Tfa98xx_Error (*dsp_msg)(struct tfa_device *tfa, int length, const char *buf); + enum Tfa98xx_Error (*dsp_msg_read)(struct tfa_device *tfa, int length, unsigned char *bytes); + enum Tfa98xx_Error (*reg_read)(struct tfa_device *tfa, unsigned char subaddress, unsigned short *value); + enum Tfa98xx_Error (*reg_write)(struct tfa_device *tfa, unsigned char subaddress, unsigned short value); + enum Tfa98xx_Error (*mem_read)(struct tfa_device *tfa, unsigned int start_offset, int num_words, int *pValues); + enum Tfa98xx_Error (*mem_write)(struct tfa_device *tfa, unsigned short address, int value, int memtype); + + enum Tfa98xx_Error (*tfa_init)(struct tfa_device *tfa); /**< init typically for loading optimal settings */ + enum Tfa98xx_Error (*dsp_reset)(struct tfa_device *tfa, int state); /**< reset the coolflux dsp */ + enum Tfa98xx_Error (*dsp_system_stable)(struct tfa_device *tfa, int *ready); /**< ready when clocks are stable to allow DSP subsystem access */ + enum Tfa98xx_Error (*dsp_write_tables)(struct tfa_device *tfa, int sample_rate); /**< write the device/type specific delaytables */ + enum Tfa98xx_Error (*auto_copy_mtp_to_iic)(struct tfa_device *tfa); /**< Set auto_copy_mtp_to_iic */ + enum Tfa98xx_Error (*factory_trimmer)(struct tfa_device *tfa); /**< Factory trimming for the Boost converter */ + int (*set_swprof)(struct tfa_device *tfa, unsigned short new_value); /**< Set the sw profile in the struct and the hw register */ + int (*get_swprof)(struct tfa_device *tfa); /**< Get the sw profile from the hw register */ + int (*set_swvstep)(struct tfa_device *tfa, unsigned short new_value); /**< Set the sw vstep in the struct and the hw register */ + int (*get_swvstep)(struct tfa_device *tfa); /**< Get the sw vstep from the hw register */ + int (*get_mtpb)(struct tfa_device *tfa); /**< get status of MTB busy bit*/ + enum Tfa98xx_Error (*set_mute)(struct tfa_device *tfa, int mute); /**< set mute */ + enum Tfa98xx_Error (*faim_protect)(struct tfa_device *tfa, int state); /**< Protect FAIM from being corrupted */ + enum Tfa98xx_Error (*set_osc_powerdown)(struct tfa_device *tfa, int state); /**< Allow to change internal osc. gating settings */ + enum Tfa98xx_Error (*update_lpm)(struct tfa_device *tfa, int state); /**< Allow to change lowpowermode settings */ +}; + +/** + * Device states and modifier flags to allow a device/type independent fine + * grained control of the internal state.\n + * Values below 0x10 are referred to as base states which can be or-ed with + * state modifiers, from 0x10 and higher. + * + */ +enum tfa_state { + TFA_STATE_UNKNOWN, /**< unknown or invalid */ + TFA_STATE_POWERDOWN, /**< PLL in powerdown, Algo is up/warm */ + TFA_STATE_INIT_HW, /**< load I2C/PLL hardware setting (~wait2srcsettings) */ + TFA_STATE_INIT_CF, /**< coolflux HW access possible (~initcf) */ + TFA_STATE_INIT_FW, /**< DSP framework active (~patch loaded) */ + TFA_STATE_OPERATING, /**< Amp and Algo running */ + TFA_STATE_FAULT, /**< An alarm or error occurred */ + TFA_STATE_RESET, /**< I2C reset and ACS set */ + /* --sticky state modifiers-- */ + TFA_STATE_MUTE = 0x10, /**< Algo & Amp mute */ + TFA_STATE_UNMUTE = 0x20, /**< Algo & Amp unmute */ + TFA_STATE_CLOCK_ALWAYS = 0x40, /**< PLL connect to internal oscillator */ + TFA_STATE_CLOCK_AUDIO = 0x80, /**< PLL connect to audio clock (BCK/FS) */ + TFA_STATE_LOW_POWER = 0x100, /**< lowest possible power state */ +}; + +/** + * This is the main tfa device context structure, it will carry all information + * that is needed to handle a single I2C device instance. + * All functions dealing with the device will need access to the fields herein. + */ +struct tfa_device { + int dev_idx; /**< device container index */ + int in_use; + int buffer_size; /**< lowest level max buffer size */ + int has_msg; /**< support direct dsp messaging */ + unsigned char slave_address; /**< I2C slave address (not shifted) */ + unsigned short rev; /**< full revid of this device */ + unsigned char tfa_family; /**< tfa1/tfa2 */ + enum featureSupport supportDrc; + enum featureSupport supportFramework; + enum featureSupport support_saam; + int sw_feature_bits[2]; /**< cached copy of sw feature bits */ + int hw_feature_bits; /**< cached copy of hw feature bits */ + int profile; /**< active profile */ + int vstep; /**< active vstep */ + unsigned char spkr_count; + unsigned char spkr_select; + unsigned char support_tcoef;/**< legacy tfa9887, will be removed */ + enum Tfa98xx_DAI daimap; /**< supported audio interface types */ + int mohm[3]; /**< speaker calibration values in milli ohms -1 is error */ + struct tfa_device_ops dev_ops; + uint16_t interrupt_enable[3]; + uint16_t interrupt_status[3]; + int ext_dsp; /**< respond to external DSP: -1:none, 0:no_dsp, 1:cold, 2:warm */ + int bus; /* TODO fix ext_dsp and bus handling */ + int tfadsp_event; /**< enum tfadsp_event_en is for external registry */ + int verbose; /**< verbosity level for debug print output */ + enum tfa_state state; /**< last known state or-ed with optional state_modifier */ + struct TfaContainer *cnt;/**< the loaded container file */ + struct TfaVolumeStepRegisterInfo *p_regInfo; /**< remember vstep for partial updates */ + int partial_enable; /**< enable partial updates */ + void *data; /**< typically pointing to Linux driver structure owning this device */ + int convert_dsp32; /**< convert 24 bit DSP messages to 32 bit */ + int sync_iv_delay; /**< synchronize I/V delay at cold start */ + int is_probus_device; /**< probus device: device without internal DSP */ + int advance_keys_handling; + int needs_reset; /**< add the reset trigger for SetAlgoParams and SetMBDrc commands */ + struct kmem_cache *cachep; /**< Memory allocator handle */ + char fw_itf_ver[4]; /* Firmware ITF version */ +}; + +/** + * The tfa_dev_probe is called before accessing any device accessing functions. + * Access to the tfa device register 3 is attempted and will record the + * returned id for further use. If no device responds the function will abort. + * The recorded id will by used by the query functions to fill the remaining + * relevant data fields of the device structure. + * Data such as MTP features that requires device access will only be read when + * explicitly called and the result will be then cached in the struct. + * + * A structure pointer passed to this device needs to refer to existing memory + * space allocated by the caller. + * + * @param slave = I2C slave address of the target device (not shifted) + * @param tfa struct = points to memory that holds the context for this device + * instance + * + * @return + * - 0 if the I2C device responded to a read of register address 3\n + * when the device responds but with an unknown id a warning will be printed + * - -1 if no response from the I2C device + * + */ +int tfa_dev_probe(int slave, struct tfa_device *tfa); + +/** + * Start this instance at the profile and vstep as provided. + * The profile and vstep will be loaded first in case the current value differs + * from the requested values. + * Note that this call will not change the mute state of the tfa, which means + * that of this instance was called in muted state the caller will have to + * unmute in order to get audio. + * + * @param tfa struct = pointer to context of this device instance + * @param profile the selected profile to run + * @param vstep the selected vstep to use + * @return tfa_error enum + */ +/*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ +#ifdef __KERNEL__ +enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep, u8 pcm_format); +#else +enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep); +#endif +/*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ + +/** + * Stop audio for this instance as gracefully as possible. + * Audio will be muted and the PLL will be shutdown together with any other + * device/type specific settings needed to prevent audio artifacts or + * workarounds. + * + * Note that this call will change state of the tfa to mute and powered down. + * + * @param tfa struct = pointer to context of this device instance + * @return tfa_error enum + */ +enum tfa_error tfa_dev_stop(struct tfa_device *tfa); + +/** + * This interface allows a device/type independent fine grained control of the + * internal state of the instance. + * Whenever a base state is requested an attempt is made to actively bring the device + * into this state. However this may depend on external conditions beyond control of + * this software layer. Therefore in case the state cannot be set an erro will + * be returned and the current state remains unchanged. + * The base states, lower values below 0x10, are all mutually exclusive, they higher ones + * can also function as a sticky modifier which means for example that operating + * state could be in either muted or unmuted state. Or in case of init_cf it can be + * internal clock (always) or external audio clock. + * This function is intended to be used for device mute/unmute synchronization + * when called from higher layers. Mostly internal calls will use this to control + * the startup and profile transitions in a device/type independent way. + * + * @param tfa struct = pointer to context of this device instance + * @param state struct = desired device state after function return + * @return tfa_error enum + */ +enum tfa_error tfa_dev_set_state(struct tfa_device *tfa, enum tfa_state state, int is_calibration); + +/** + * Retrieve the current state of this instance in an active way. + * The state field in tfa structure will reflect the result unless an error is + * returned. + * Note that the hardware state may change on external events an as such this + * field should be treated as volatile. + * + * @param tfa struct = pointer to context of this device instance + * @return tfa_error enum + * + */ +enum tfa_state tfa_dev_get_state(struct tfa_device *tfa); + +/*****************************************************************************/ +/*****************************************************************************/ +/** + * MTP support functions + */ +enum tfa_mtp { + TFA_MTP_OTC, /**< */ + TFA_MTP_EX, /**< */ + TFA_MTP_RE25, /**< */ + TFA_MTP_RE25_PRIM, /**< */ + TFA_MTP_RE25_SEC, /**< */ + TFA_MTP_LOCK, /**< */ +}; + +/** + * + */ +int tfa_dev_mtp_get(struct tfa_device *tfa, enum tfa_mtp item); + +/** + * + */ +enum tfa_error tfa_dev_mtp_set(struct tfa_device *tfa, enum tfa_mtp item, int value); + + +//irq +/* tfa2 interrupt support + * !!! enum tfa9912_irq !!!*/ +/* + * interrupt bit function to clear + */ +int tfa_irq_clear(struct tfa_device *tfa, int bit); +/* + * return state of irq or -1 if illegal bit + */ +int tfa_irq_get(struct tfa_device *tfa, int bit); +/* + * interrupt bit function that operates on the shadow regs in the handle + */ +int tfa_irq_ena(struct tfa_device *tfa, int bit, int state); +/* + * interrupt bit function that sets the polarity + */ +int tfa_irq_set_pol(struct tfa_device *tfa, int bit, int state); + +/* + * mask interrupts by disabling them + */ +int tfa_irq_mask(struct tfa_device *tfa); +/* + * unmask interrupts by enabling them again + */ +int tfa_irq_unmask(struct tfa_device *tfa); +//cnt read +//debug? + +#endif /* __TFA_DEVICE_H__ */ diff --git a/inc/tfa_dsp_fw.h b/inc/tfa_dsp_fw.h new file mode 100644 index 000000000000..62e0edd7d8ff --- /dev/null +++ b/inc/tfa_dsp_fw.h @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef TFA98XX_INTERNALS_H +#define TFA98XX_INTERNALS_H + +#include "config.h" + +#include "tfa_service.h" //TODO cleanup for enum Tfa98xx_Status_ID +/* + * tfadsp_fw_api.c + */ +/** + * Return a text version of the firmware status ID code + * @param status the given status ID code + * @return the firmware status ID string + */ +const char *tfadsp_fw_status_string(enum Tfa98xx_Status_ID status); +int tfadsp_fw_start(struct tfa_device *tfa, int prof_idx, int vstep_idx); +int tfadsp_fw_get_api_version(struct tfa_device *tfa, uint8_t *buffer); +#define FW_MAXTAG 150 +int tfadsp_fw_get_tag(struct tfa_device *tfa, uint8_t *buffer); +int tfadsp_fw_get_status_change(struct tfa_device *tfa, uint8_t *buffer); +int tfadsp_fw_set_re25(struct tfa_device *tfa, int prim, int sec); +int tfadsp_fw_get_re25(struct tfa_device *tfa, uint8_t *buffer); + +/* + * the order matches the ACK bits order in TFA98XX_CF_STATUS + */ +enum tfa_fw_event { /* not all available on each device */ + tfa_fw_i2c_cmd_ack, + tfa_fw_reset_start, + tfa_fw_short_on_mips, + tfa_fw_soft_mute_ready, + tfa_fw_volume_ready, + tfa_fw_error_damage, + tfa_fw_calibrate_done, + tfa_fw_max +}; + +/* the following type mappings are compiler specific */ +#define subaddress_t unsigned char + +/* module Ids */ +#define MODULE_FRAMEWORK 0 +#define MODULE_SPEAKERBOOST 1 +#define MODULE_BIQUADFILTERBANK 2 +#define MODULE_TAPTRIGGER 5 +#define MODULE_SETRE 9 + +/* RPC commands */ +/* SET */ +#define FW_PAR_ID_SET_MEMORY 0x03 +#define FW_PAR_ID_SET_SENSES_DELAY 0x04 +#define FW_PAR_ID_SETSENSESCAL 0x05 +#define FW_PAR_ID_SET_INPUT_SELECTOR 0x06 +#define FW_PAR_ID_SET_OUTPUT_SELECTOR 0x08 +#define FW_PAR_ID_SET_PROGRAM_CONFIG 0x09 +#define FW_PAR_ID_SET_GAINS 0x0A +#define FW_PAR_ID_SET_MEMTRACK 0x0B +#define FW_PAR_ID_SET_FWKUSECASE 0x11 +#define TFA1_FW_PAR_ID_SET_CURRENT_DELAY 0x03 +#define TFA1_FW_PAR_ID_SET_CURFRAC_DELAY 0x06 +/* GET */ +#define FW_PAR_ID_GET_MEMORY 0x83 +#define FW_PAR_ID_GLOBAL_GET_INFO 0x84 +#define FW_PAR_ID_GET_FEATURE_INFO 0x85 +#define FW_PAR_ID_GET_MEMTRACK 0x8B +#define FW_PAR_ID_GET_TAG 0xFF +#define FW_PAR_ID_GET_API_VERSION 0xFE +#define FW_PAR_ID_GET_STATUS_CHANGE 0x8D + +/* Load a full model into SpeakerBoost. */ +/* SET */ +#define SB_PARAM_SET_ALGO_PARAMS 0x00 +#define SB_PARAM_SET_LAGW 0x01 +#define SB_PARAM_SET_ALGO_PARAMS_WITHOUT_RESET 0x02 +#define SB_PARAM_SET_RE25C 0x05 +#define SB_PARAM_SET_LSMODEL 0x06 +#define SB_PARAM_SET_MBDRC 0x07 +#define SB_PARAM_SET_MBDRC_WITHOUT_RESET 0x08 +#define SB_PARAM_SET_EXCURSION_FILTERS 0x0A +#define SB_PARAM_SET_DRC 0x0F +/* GET */ +#define SB_PARAM_GET_ALGO_PARAMS 0x80 +#define SB_PARAM_GET_LAGW 0x81 +#define SB_PARAM_GET_RE25C 0x85 +#define SB_PARAM_GET_LSMODEL 0x86 +#define SB_PARAM_GET_MBDRC 0x87 +#define SB_PARAM_GET_MBDRC_DYNAMICS 0x89 +#define SB_PARAM_GET_EXCURSION_FILTERS 0x8A +#define SB_PARAM_GET_TAG 0xFF + +#define SB_PARAM_SET_EQ 0x0A /* 2 Equaliser Filters. */ +#define SB_PARAM_SET_PRESET 0x0D /* Load a preset */ +#define SB_PARAM_SET_CONFIG 0x0E /* Load a config */ +#define SB_PARAM_SET_AGCINS 0x10 +#define SB_PARAM_SET_CURRENT_DELAY 0x03 +#define SB_PARAM_GET_STATE 0xC0 +#define SB_PARAM_GET_XMODEL 0xC1 /* Gets current Excursion Model. */ +#define SB_PARAM_GET_XMODEL_COEFFS 0x8C /* Get coefficients for XModel */ +#define SB_PARAM_GET_EXCURSION_FILTERS 0x8A /* Get excursion filters */ +#define SB_PARAM_SET_EXCURSION_FILTERS 0x0A /* Set excursion filters */ + +/* SET: TAPTRIGGER */ +#define TAP_PARAM_SET_ALGO_PARAMS 0x01 +#define TAP_PARAM_SET_DECIMATION_PARAMS 0x02 + +/* GET: TAPTRIGGER*/ +#define TAP_PARAM_GET_ALGO_PARAMS 0x81 +#define TAP_PARAM_GET_TAP_RESULTS 0x84 + +/* sets the speaker calibration impedance (@25 degrees celsius) */ +#define SB_PARAM_SET_RE0 0x89 + +#define BFB_PAR_ID_SET_COEFS 0x00 +#define BFB_PAR_ID_GET_COEFS 0x80 +#define BFB_PAR_ID_GET_CONFIG 0x81 + +/* for compatibility */ +#define FW_PARAM_GET_STATE FW_PAR_ID_GLOBAL_GET_INFO +#define FW_PARAM_GET_FEATURE_BITS FW_PAR_ID_GET_FEATURE_BITS + +/* RPC Status results */ +#define STATUS_OK 0 +#define STATUS_INVALID_MODULE_ID 2 +#define STATUS_INVALID_PARAM_ID 3 +#define STATUS_INVALID_INFO_ID 4 + +/* the maximum message length in the communication with the DSP */ +#define TFA2_MAX_PARAM_SIZE (507*3) /* TFA2 */ +#define TFA1_MAX_PARAM_SIZE (145*3) /* TFA1 */ + +#define ROUND_DOWN(a, n) (((a)/(n))*(n)) + +/* feature bits */ +#define FEATURE1_TCOEF 0x100 /* bit8 set means tCoefA expected */ +#define FEATURE1_DRC 0x200 /* bit9 NOT set means DRC expected */ + +/* DSP firmware xmem defines */ +#define TFA1_FW_XMEM_CALIBRATION_DONE 231 +#define TFA2_FW_XMEM_CALIBRATION_DONE 516 +#define TFA1_FW_XMEM_COUNT_BOOT 0xa1 +#define TFA2_FW_XMEM_COUNT_BOOT 512 +#define TFA2_FW_XMEM_CMD_COUNT 520 + +/* note that the following defs rely on the handle variable */ +#define TFA_FW_XMEM_CALIBRATION_DONE TFA_FAM_FW(tfa, XMEM_CALIBRATION_DONE) +#define TFA_FW_XMEM_COUNT_BOOT TFA_FAM_FW(tfa, XMEM_COUNT_BOOT) +#define TFA_FW_XMEM_CMD_COUNT TFA_FAM_FW(tfa, XMEM_CMD_COUNT) + +#define TFA2_FW_ReZ_SCALE 65536 +#define TFA1_FW_ReZ_SCALE 16384 + +#endif /* TFA98XX_INTERNALS_H */ diff --git a/inc/tfa_ext.h b/inc/tfa_ext.h new file mode 100644 index 000000000000..d5f425b54a07 --- /dev/null +++ b/inc/tfa_ext.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/* + * tfa_ext.h + * + * Created on: Jun 8, 2016 + * Author: wim + */ + +#ifndef TFA_SRC_TFA_EXT_H_ +#define TFA_SRC_TFA_EXT_H_ + +#include "tfa_device.h" + +/* + * events + */ +/** Maximum value for enumerator */ +#define LVM_MAXENUM (0xffff) +/** +This enum type specifies the different events that may trigger a callback. +*/ +enum tfadsp_event_en { + TFADSP_CMD_ACK = 1, /**< Command handling is completed */ + TFADSP_SOFT_MUTE_READY = 8, /**< Muting completed */ + TFADSP_VOLUME_READY = 16, /**< Volume change completed */ + TFADSP_DAMAGED_SPEAKER = 32, /**< Damaged speaker was detected */ + TFADSP_CALIBRATE_DONE = 64, /**< Calibration is completed */ + TFADSP_SPARSESIG_DETECTED = 128, /**< Sparse signal detected */ + TFADSP_CMD_READY = 256, /**< Ready to receive commands */ + TFADSP_EXT_PWRUP = 0x8000,/**< DSP API has started, powered up */ + TFADSP_EXT_PWRDOWN = 0x8001,/**< DSP API stopped, power down */ + TFADSP_EVENT_DUMMY = LVM_MAXENUM +}; + +typedef int (*tfa_event_handler_t)(struct tfa_device *tfa, enum tfadsp_event_en tfadsp_event); +typedef int (*dsp_send_message_t)(struct tfa_device *tfa, int length, const char *buf); +typedef int (*dsp_read_message_t)(struct tfa_device *tfa, int length, char *buf); +typedef int (*dsp_write_reg_t)(struct tfa_device *tfa, unsigned char subaddress, unsigned short value); + +int tfa_ext_register(dsp_write_reg_t tfa_write_reg, dsp_send_message_t tfa_send_message, dsp_read_message_t tfa_read_message, tfa_event_handler_t *tfa_event_handler); + +#endif /* TFA_SRC_TFA_EXT_H_ */ diff --git a/inc/tfa_internal.h b/inc/tfa_internal.h new file mode 100755 index 000000000000..8bf1eac7ec89 --- /dev/null +++ b/inc/tfa_internal.h @@ -0,0 +1,40 @@ +/* + * Copyright 2014-2017 NXP Semiconductors + * Copyright (C) 2019 XiaoMi, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + internal functions for TFA layer (not shared with SRV and HAL layer!) +*/ + +#ifndef __TFA_INTERNAL_H__ +#define __TFA_INTERNAL_H__ + +#include "tfa_dsp_fw.h" +#include "tfa_ext.h" + +#if __GNUC__ >= 4 + #define TFA_INTERNAL __attribute__ ((visibility("hidden"))) +#else + #define TFA_INTERNAL +#endif + +#define TFA98XX_GENERIC_SLAVE_ADDRESS 0x1C + +TFA_INTERNAL enum Tfa98xx_Error tfa98xx_check_rpc_status(struct tfa_device *tfa, int *pRpcStatus); +TFA_INTERNAL enum Tfa98xx_Error tfa98xx_wait_result(struct tfa_device *tfa, int waitRetryCount); + +#endif /* __TFA_INTERNAL_H__ */ + diff --git a/inc/tfa_platform_interface_definition.h b/inc/tfa_platform_interface_definition.h new file mode 100755 index 000000000000..5da87c95c231 --- /dev/null +++ b/inc/tfa_platform_interface_definition.h @@ -0,0 +1,100 @@ +/* + * Copyright 2015-2018 NXP Semiconductors + * Copyright (C) 2019 XiaoMi, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _TFA_PLATFORM_INTERFACE_DEFINITION_H_ +#define _TFA_PLATFORM_INTERFACE_DEFINITION_H_ + +#define AFE_MODULE_ID_TFADSP_RX (0x1000B911) +#define AFE_MODULE_ID_TFADSP_TX (0x1000B912) +#define AFE_PARAM_ID_TFADSP_TX_SET_ENABLE (0x1000B920) +#define AFE_PARAM_ID_TFADSP_RX_CFG (0x1000B921) +#define AFE_PARAM_ID_TFADSP_RX_GET_RESULT (0x1000B922) +#define AFE_PARAM_ID_TFADSP_RX_SET_BYPASS (0x1000B923) + + + +#define TFA_USING_QUATERNARY_MI2S + + +#if defined(TFA_USING_SECONDARY_MI2S) + /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, + AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ + #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_SECONDARY_MI2S_RX) + #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_SECONDARY_MI2S_TX) + + #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "SEC_MI2S_RX" + #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "SEC_MI2S_TX" + #define PLATFORM_RX_VI_FB_MUX_NAME "SECONDARY_MI2S_RX_VI_FB_MUX" + #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_SECONDARY_MI2S_TX + #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_SECONDARY_MI2S_RX + + #define TFA_TX_HOSTLESS_CODEC_NAME "Secondary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_STREAM_NAME "Secondary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_CPU_DAI_NAME "SEC_MI2S_TX_HOSTLESS" + +#elif defined(TFA_USING_TERTIARY_MI2S) + /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, + AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ + #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_TERTIARY_MI2S_RX) + #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_TERTIARY_MI2S_TX) + + #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "TERT_MI2S_RX" + #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "TERT_MI2S_TX" + #define PLATFORM_RX_VI_FB_MUX_NAME "TERTIARY_MI2S_RX_VI_FB_MUX" + #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_TERTIARY_MI2S_TX + #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_TERTIARY_MI2S_RX + + #define TFA_TX_HOSTLESS_CODEC_NAME "Tertiary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_STREAM_NAME "Tertiary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_CPU_DAI_NAME "TERT_MI2S_TX_HOSTLESS" + +#elif defined(TFA_USING_QUATERNARY_MI2S) + /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, + AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ + #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_QUATERNARY_MI2S_RX) + #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_QUATERNARY_MI2S_TX) + + #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "QUAT_MI2S_RX" + #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "QUAT_MI2S_TX" + #define PLATFORM_RX_VI_FB_MUX_NAME "QUATERNARY_MI2S_RX_VI_FB_MUX" + #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_QUATERNARY_MI2S_TX + #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_QUATERNARY_MI2S_RX + + #define TFA_TX_HOSTLESS_CODEC_NAME "Quaternary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_STREAM_NAME "Quaternary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_CPU_DAI_NAME "QUAT_MI2S_TX_HOSTLESS" + +#elif defined(TFA_USING_QUINARY_MI2S) + /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, + AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ + #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_QUINARY_MI2S_RX) + #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_QUINARY_MI2S_TX) + + #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "QUIN_MI2S_RX" + #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "QUIN_MI2S_TX" + #define PLATFORM_RX_VI_FB_MUX_NAME "QUINARY_MI2S_RX_VI_FB_MUX" + #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_QUINARY_MI2S_TX + #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_QUINARY_MI2S_RX + + #define TFA_TX_HOSTLESS_CODEC_NAME "Quinary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_STREAM_NAME "Quinary MI2S_TX Hostless" + #define TFA_TX_HOSTLESS_CPU_DAI_NAME "QUIN_MI2S_TX_HOSTLESS" + +#else + #error you should define which mi2s will be used for TFA device. +#endif +#endif /* _TFA_PLATFORM_INTERFACE_DEFINITION_H_ */ diff --git a/inc/tfa_service.h b/inc/tfa_service.h new file mode 100644 index 000000000000..9cb5f757ad6d --- /dev/null +++ b/inc/tfa_service.h @@ -0,0 +1,1015 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + + +#ifndef TFA_SERVICE_H +#define TFA_SERVICE_H + +//#include "config.h" +// workaround for Visual Studio: +// fatal error C1083: Cannot open include file: 'config.h': No such file or directory +#ifdef __KERNEL__ +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" { +#include "TFA_I2C.h" +#endif + +/* Linux kernel module defines TFA98XX_GIT_VERSIONS in the linux_driver/Makefile */ +#ifdef TFA98XX_GIT_VERSIONS + #define TFA98XX_API_REV_STR "v6.7.4"/*TFA98XX_GIT_VERSIONS*/ +#else + #define TFA98XX_API_REV_STR "v6.7.4" +#endif + +#include "tfa_device.h" + +/* + * data previously defined in Tfa9888_dsp.h + */ +#define MEMTRACK_MAX_WORDS 150 +#define LSMODEL_MAX_WORDS 150 +#define TFA98XX_MAXTAG (150) +#define FW_VAR_API_VERSION (521) + +/* Indexes and scaling factors of GetLSmodel */ +#define tfa9888_fs_IDX 128 +#define tfa9888_leakageFactor_IDX 130 +#define tfa9888_ReCorrection_IDX 131 +#define tfa9888_Bl_IDX 132 +#define ReZ_IDX 147 + +#define tfa9872_leakageFactor_IDX 128 +#define tfa9872_ReCorrection_IDX 129 +#define tfa9872_Bl_IDX 130 + +#define fs_SCALE (double)1 +#define leakageFactor_SCALE (double)8388608 +#define ReCorrection_SCALE (double)8388608 +#define Bl_SCALE (double)2097152 +#define tCoef_SCALE (double)8388608 + +/* ---------------------------- Max1 ---------------------------- */ +/* Headroom applied to the main input signal */ +#define SPKRBST_HEADROOM 7 +/* Exponent used for AGC Gain related variables */ +#define SPKRBST_AGCGAIN_EXP SPKRBST_HEADROOM +#define SPKRBST_TEMPERATURE_EXP 9 +/* Exponent used for Gain Corection related variables */ +#define SPKRBST_LIMGAIN_EXP 4 +#define SPKRBST_TIMECTE_EXP 1 +#define DSP_MAX_GAIN_EXP 7 +/* -------------------------------------------------------------- */ + +/* speaker related parameters */ +#define TFA2_SPEAKERPARAMETER_LENGTH (3*151) /* MAX2=450 */ +#define TFA1_SPEAKERPARAMETER_LENGTH (3*141) /* MAX1=423 */ + +/* vstep related parameters */ +#define TFA2_ALGOPARAMETER_LENGTH (3*304) /* N1B = (304) 305 is including the cmd-id */ +#define TFA72_ALGOPARAMETER_LENGTH_MONO (3*183) +#define TFA72_ALGOPARAMETER_LENGTH_STEREO (3*356) +#define TFA2_MBDRCPARAMETER_LENGTH (3*152) /* 154 is including the cmd-id */ +#define TFA72_MBDRCPARAMETER_LENGTH (3*98) +#define TFA1_PRESET_LENGTH 87 +#define TFA1_DRC_LENGTH 381 /* 127 words */ +#define TFA2_FILTERCOEFSPARAMETER_LENGTH (3*168) /* 170 is including the cmd-id */ +#define TFA72_FILTERCOEFSPARAMETER_LENGTH (3*156) + +/* Maximum number of retries for DSP result + * Keep this value low! + * If certain calls require longer wait conditions, the + * application should poll, not the API + * The total wait time depends on device settings. Those + * are application specific. + */ +#define TFA98XX_WAITRESULT_NTRIES 40 +#define TFA98XX_WAITRESULT_NTRIES_LONG 2000 + +/* following lengths are in bytes */ +#define TFA98XX_PRESET_LENGTH 87 +#define TFA98XX_CONFIG_LENGTH 201 +#define TFA98XX_DRC_LENGTH 381 /* 127 words */ + +typedef unsigned char Tfa98xx_Config_t[TFA98XX_CONFIG_LENGTH]; +typedef unsigned char Tfa98xx_Preset_t[TFA98XX_PRESET_LENGTH]; +typedef unsigned char Tfa98xx_DrcParameters_t[TFA98XX_DRC_LENGTH]; + +/* Type containing all the possible errors that can occur + * + */ +enum Tfa98xx_Error { + Tfa98xx_Error_Ok = 0, + Tfa98xx_Error_Device, /* 1. Currently only used to keep in sync with tfa_error */ + Tfa98xx_Error_Bad_Parameter, /* 2. */ + Tfa98xx_Error_Fail, /* 3. generic failure, avoid mislead message */ + Tfa98xx_Error_NoClock, /* 4. no clock detected */ + Tfa98xx_Error_StateTimedOut, /* 5. */ + Tfa98xx_Error_DSP_not_running, /* 6. communication with the DSP failed */ + Tfa98xx_Error_AmpOn, /* 7. amp is still running */ + Tfa98xx_Error_NotOpen, /* 8. the given handle is not open */ + Tfa98xx_Error_InUse, /* 9. too many handles */ + Tfa98xx_Error_Buffer_too_small, /* 10. if a buffer is too small */ + /* the expected response did not occur within the expected time */ + Tfa98xx_Error_RpcBase = 100, + Tfa98xx_Error_RpcBusy = 101, + Tfa98xx_Error_RpcModId = 102, + Tfa98xx_Error_RpcParamId = 103, + Tfa98xx_Error_RpcInvalidCC = 104, + Tfa98xx_Error_RpcInvalidSeq = 105, + Tfa98xx_Error_RpcInvalidParam = 106, + Tfa98xx_Error_RpcBufferOverflow = 107, + Tfa98xx_Error_RpcCalibBusy = 108, + Tfa98xx_Error_RpcCalibFailed = 109, + Tfa98xx_Error_Not_Implemented, + Tfa98xx_Error_Not_Supported, + Tfa98xx_Error_I2C_Fatal, /* Fatal I2C error occurred */ + /* Nonfatal I2C error, and retry count reached */ + Tfa98xx_Error_I2C_NonFatal, + Tfa98xx_Error_Other = 1000 +}; + +/* + * Type containing all the possible msg returns DSP can give + * //TODO move to tfa_dsp_fw.h + */ +enum Tfa98xx_Status_ID { + Tfa98xx_DSP_Not_Running = -1, /* No response from DSP */ + Tfa98xx_I2C_Req_Done = 0, /* Request executed correctly and result, if any, is available for download */ + Tfa98xx_I2C_Req_Busy = 1, /* Request is being processed, just wait for result */ + Tfa98xx_I2C_Req_Invalid_M_ID = 2, /* Provided M-ID does not fit in valid rang [0..2] */ + Tfa98xx_I2C_Req_Invalid_P_ID = 3, /* Provided P-ID isn�t valid in the given M-ID context */ + Tfa98xx_I2C_Req_Invalid_CC = 4, /* Invalid channel configuration bits (SC|DS|DP|DC) combination */ + Tfa98xx_I2C_Req_Invalid_Seq = 5, /* Invalid sequence of commands, in case the DSP expects some commands in a specific order */ + Tfa98xx_I2C_Req_Invalid_Param = 6, /* Generic error */ + Tfa98xx_I2C_Req_Buffer_Overflow = 7, /* I2C buffer has overflowed: host has sent too many parameters, memory integrity is not guaranteed */ + Tfa98xx_I2C_Req_Calib_Busy = 8, /* Calibration not finished */ + Tfa98xx_I2C_Req_Calib_Failed = 9 /* Calibration failed */ +}; + +/* + * speaker as microphone + */ +enum Tfa98xx_saam { + Tfa98xx_saam_none, /*< SAAM feature not available */ + Tfa98xx_saam /*< SAAM feature available */ +}; + +/* + * config file subtypes + */ +enum Tfa98xx_config_type { + Tfa98xx_config_generic, + Tfa98xx_config_sub1, + Tfa98xx_config_sub2, + Tfa98xx_config_sub3, +}; + +enum Tfa98xx_AmpInputSel { + Tfa98xx_AmpInputSel_I2SLeft, + Tfa98xx_AmpInputSel_I2SRight, + Tfa98xx_AmpInputSel_DSP +}; + +enum Tfa98xx_OutputSel { + Tfa98xx_I2SOutputSel_CurrentSense, + Tfa98xx_I2SOutputSel_DSP_Gain, + Tfa98xx_I2SOutputSel_DSP_AEC, + Tfa98xx_I2SOutputSel_Amp, + Tfa98xx_I2SOutputSel_DataI3R, + Tfa98xx_I2SOutputSel_DataI3L, + Tfa98xx_I2SOutputSel_DcdcFFwdCur, +}; + +enum Tfa98xx_StereoGainSel { + Tfa98xx_StereoGainSel_Left, + Tfa98xx_StereoGainSel_Right +}; + +#define TFA98XX_MAXPATCH_LENGTH (3*1024) + +/* the number of biquads supported */ +#define TFA98XX_BIQUAD_NUM 10 + +enum Tfa98xx_Channel { + Tfa98xx_Channel_L, + Tfa98xx_Channel_R, + Tfa98xx_Channel_L_R, + Tfa98xx_Channel_Stereo +}; + +enum Tfa98xx_Mode { + Tfa98xx_Mode_Normal = 0, + Tfa98xx_Mode_RCV +}; + +enum Tfa98xx_Mute { + Tfa98xx_Mute_Off, + Tfa98xx_Mute_Digital, + Tfa98xx_Mute_Amplifier +}; + +enum Tfa98xx_SpeakerBoostStatusFlags { + Tfa98xx_SpeakerBoost_Activity = 0, /* Input signal activity. */ + Tfa98xx_SpeakerBoost_S_Ctrl, /* S Control triggers the limiter */ + Tfa98xx_SpeakerBoost_Muted, /* 1 when signal is muted */ + Tfa98xx_SpeakerBoost_X_Ctrl, /* X Control triggers the limiter */ + Tfa98xx_SpeakerBoost_T_Ctrl, /* T Control triggers the limiter */ + Tfa98xx_SpeakerBoost_NewModel, /* New model is available */ + Tfa98xx_SpeakerBoost_VolumeRdy, /* 0:stable vol, 1:still smoothing */ + Tfa98xx_SpeakerBoost_Damaged, /* Speaker Damage detected */ + Tfa98xx_SpeakerBoost_SignalClipping /* input clipping detected */ +}; + +struct Tfa98xx_DrcStateInfo { + float GRhighDrc1[2]; + float GRhighDrc2[2]; + float GRmidDrc1[2]; + float GRmidDrc2[2]; + float GRlowDrc1[2]; + float GRlowDrc2[2]; + float GRpostDrc1[2]; + float GRpostDrc2[2]; + float GRblDrc[2]; +}; +struct Tfa98xx_StateInfo { + /* SpeakerBoost State */ + float agcGain; /* Current AGC Gain value */ + float limGain; /* Current Limiter Gain value */ + float sMax; /* Current Clip/Lim threshold */ + int T; /* Current Speaker Temperature value */ + int statusFlag; /* Masked bit word */ + float X1; /* estimated excursion caused by Spkrboost gain ctrl */ + float X2; /* estimated excursion caused by manual gain setting */ + float Re; /* Loudspeaker blocked resistance */ + /* Framework state */ + /* increments each time a MIPS problem is detected on the DSP */ + int shortOnMips; + struct Tfa98xx_DrcStateInfo drcState; /* DRC state, when enabled */ +}; + +typedef struct TfaMsg { + uint8_t msg_size; + unsigned char cmdId[3]; + int data[9]; +} TfaMsg_t; + +typedef struct tfa_vstep_msg { + int fw_version; + uint8_t no_of_vsteps; + uint16_t reg_no; + uint8_t *msg_reg; + uint8_t msg_no; + uint32_t algo_param_length; + uint8_t *msg_algo_param; + uint32_t filter_coef_length; + uint8_t *msg_filter_coef; + uint32_t mbdrc_length; + uint8_t *msg_mbdrc; +} tfa_vstep_msg_t; + +typedef struct TfaGroup { + uint8_t msg_size; + uint8_t profileId[64]; +} TfaGroup_t; + + +struct Tfa98xx_Memtrack_data { + int length; + float mValues[MEMTRACK_MAX_WORDS]; + int mAdresses[MEMTRACK_MAX_WORDS]; + int trackers[MEMTRACK_MAX_WORDS]; + int scalingFactor[MEMTRACK_MAX_WORDS]; +}; + +/* possible memory values for DMEM in CF_CONTROLs */ +enum Tfa98xx_DMEM { + Tfa98xx_DMEM_ERR = -1, + Tfa98xx_DMEM_PMEM = 0, + Tfa98xx_DMEM_XMEM = 1, + Tfa98xx_DMEM_YMEM = 2, + Tfa98xx_DMEM_IOMEM = 3, +}; + +/** + * lookup the device type and return the family type + */ +int tfa98xx_dev2family(int dev_type); + +/** + * register definition structure + */ +struct regdef { + unsigned char offset; /**< subaddress offset */ + unsigned short pwronDefault; /**< register contents after poweron */ + unsigned short pwronTestmask; /**< mask of bits not test */ + char *name; /**< short register name */ +}; + +enum Tfa98xx_DMEM tfa98xx_filter_mem(struct tfa_device *tfa, int filter_index, unsigned short *address, int channel); + +/** + * Load the default HW settings in the device + * @param tfa the device struct pointer + */ +enum Tfa98xx_Error tfa98xx_init(struct tfa_device *tfa); + +/** + * If needed, this function can be used to get a text version of the status ID code + * @param status the given status ID code + * @return the I2C status ID string + */ +const char *tfa98xx_get_i2c_status_id_string(int status); + +/* control the powerdown bit + * @param tfa the device struct pointer + * @param powerdown must be 1 or 0 + */ +enum Tfa98xx_Error tfa98xx_powerdown(struct tfa_device *tfa, int powerdown); + +/* indicates on which channel of DATAI2 the gain from the IC is set + * @param tfa the device struct pointer + * @param gain_sel, see Tfa98xx_StereoGainSel_t + */ +enum Tfa98xx_Error tfa98xx_select_stereo_gain_channel(struct tfa_device *tfa, + enum Tfa98xx_StereoGainSel gain_sel); + +/** + * set the mtp with user controllable values + * @param tfa the device struct pointer + * @param value to be written + * @param mask to be applied toi the bits affected + */ +enum Tfa98xx_Error tfa98xx_set_mtp(struct tfa_device *tfa, uint16_t value, uint16_t mask); +enum Tfa98xx_Error tfa98xx_get_mtp(struct tfa_device *tfa, uint16_t *value); + +/** + * lock or unlock KEY2 + * lock = 1 will lock + * lock = 0 will unlock + * note that on return all the hidden key will be off + */ +void tfa98xx_key2(struct tfa_device *tfa, int lock); + +int tfa_calibrate(struct tfa_device *tfa); +void tfa98xx_set_exttemp(struct tfa_device *tfa, short ext_temp); +short tfa98xx_get_exttemp(struct tfa_device *tfa); + +/* control the volume of the DSP + * @param vol volume in bit field. It must be between 0 and 255 + */ +enum Tfa98xx_Error tfa98xx_set_volume_level(struct tfa_device *tfa, + unsigned short vol); + +/* set the input channel to use + * @param channel see Tfa98xx_Channel_t enumeration + */ +enum Tfa98xx_Error tfa98xx_select_channel(struct tfa_device *tfa, + enum Tfa98xx_Channel channel); + +/* set the mode for normal or receiver mode + * @param mode see Tfa98xx_Mode enumeration + */ +enum Tfa98xx_Error tfa98xx_select_mode(struct tfa_device *tfa, enum Tfa98xx_Mode mode); + +/* mute/unmute the audio + * @param mute see Tfa98xx_Mute_t enumeration + */ +enum Tfa98xx_Error tfa98xx_set_mute(struct tfa_device *tfa, + enum Tfa98xx_Mute mute); + +/* + * tfa_supported_speakers - required for SmartStudio initialization + * returns the number of the supported speaker count + */ +enum Tfa98xx_Error tfa_supported_speakers(struct tfa_device *tfa, int *spkr_count); + +/** +* Return the tfa revision +*/ +void tfa98xx_rev(int *major, int *minor, int *revision); + +/* + * Return the feature bits from MTP and cnt file for comparison + */ +enum Tfa98xx_Error +tfa98xx_compare_features(struct tfa_device *tfa, int features_from_MTP[3], int features_from_cnt[3]); + +/* + * return feature bits + */ +enum Tfa98xx_Error +tfa98xx_dsp_get_sw_feature_bits(struct tfa_device *tfa, int features[2]); +enum Tfa98xx_Error +tfa98xx_dsp_get_hw_feature_bits(struct tfa_device *tfa, int *features); + +/* + * tfa98xx_supported_saam + * returns the speaker as microphone feature + * @param saam enum pointer + * @return error code + */ +enum Tfa98xx_Error tfa98xx_supported_saam(struct tfa_device *tfa, enum Tfa98xx_saam *saam); + +/* load the tables to the DSP + * called after patch load is done + * @return error code + */ +enum Tfa98xx_Error tfa98xx_dsp_write_tables(struct tfa_device *tfa, int sample_rate); + + +/* set or clear DSP reset signal + * @param new state + * @return error code + */ +enum Tfa98xx_Error tfa98xx_dsp_reset(struct tfa_device *tfa, int state); + +/* check the state of the DSP subsystem + * return ready = 1 when clocks are stable to allow safe DSP subsystem access + * @param tfa the device struct pointer + * @param ready pointer to state flag, non-zero if clocks are not stable + * @return error code + */ +enum Tfa98xx_Error tfa98xx_dsp_system_stable(struct tfa_device *tfa, int *ready); + +enum Tfa98xx_Error tfa98xx_auto_copy_mtp_to_iic(struct tfa_device *tfa); + +/** + * check the state of the DSP coolflux + * @param tfa the device struct pointer + * @return the value of CFE + */ +int tfa_cf_enabled(struct tfa_device *tfa); + +/* The following functions can only be called when the DSP is running + * - I2S clock must be active, + * - IC must be in operating mode + */ + +/** + * patch the ROM code of the DSP + * @param tfa the device struct pointer + * @param patchLength the number of bytes of patchBytes + * @param patchBytes pointer to the bytes to patch + */ +enum Tfa98xx_Error tfa_dsp_patch(struct tfa_device *tfa, + int patchLength, + const unsigned char *patchBytes); + +/** + * load explicitly the speaker parameters in case of free speaker, + * or when using a saved speaker model + */ +enum Tfa98xx_Error tfa98xx_dsp_write_speaker_parameters( + struct tfa_device *tfa, + int length, + const unsigned char *pSpeakerBytes); + +/** + * read the speaker parameters as used by the SpeakerBoost processing + */ +enum Tfa98xx_Error tfa98xx_dsp_read_speaker_parameters( + struct tfa_device *tfa, + int length, + unsigned char *pSpeakerBytes); + +/** + * read the current status of the DSP, typically used for development, + * not essential to be used in a product + */ +enum Tfa98xx_Error tfa98xx_dsp_get_state_info( + struct tfa_device *tfa, + unsigned char bytes[], + unsigned int *statesize); + +/** + * Check whether the DSP supports DRC + * pbSupportDrc=1 when DSP supports DRC, + * pbSupportDrc=0 when DSP doesn't support it + */ +enum Tfa98xx_Error tfa98xx_dsp_support_drc(struct tfa_device *tfa, + int *pbSupportDrc); + +enum Tfa98xx_Error +tfa98xx_dsp_support_framework(struct tfa_device *tfa, int *pbSupportFramework); + +/** + * read the speaker excursion model as used by SpeakerBoost processing + */ +enum Tfa98xx_Error tfa98xx_dsp_read_excursion_model( + struct tfa_device *tfa, + int length, + unsigned char *pSpeakerBytes); + +/** + * load all the parameters for a preset from a file + */ +enum Tfa98xx_Error tfa98xx_dsp_write_preset(struct tfa_device *tfa, + int length, const unsigned char + *pPresetBytes); + +/** + * wrapper for dsp_msg that adds opcode and only writes + */ +enum Tfa98xx_Error tfa_dsp_cmd_id_write(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int num_bytes, + const unsigned char data[]); + +/** + * wrapper for dsp_msg that writes opcode and reads back the data + */ +enum Tfa98xx_Error tfa_dsp_cmd_id_write_read(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int num_bytes, + unsigned char data[]); + +/** + * wrapper for dsp_msg that adds opcode and 3 bytes required for coefs + */ +enum Tfa98xx_Error tfa_dsp_cmd_id_coefs(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int num_bytes, + unsigned char data[]); + +/** + * wrapper for dsp_msg that adds opcode and 3 bytes required for MBDrcDynamics + */ +enum Tfa98xx_Error tfa_dsp_cmd_id_MBDrc_dynamics(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int index_subband, + int num_bytes, unsigned char data[]); + +/** + * Disable a certain biquad. + * @param tfa the device struct pointer + * @param biquad_index: 1-10 of the biquad that needs to be adressed +*/ +enum Tfa98xx_Error Tfa98xx_DspBiquad_Disable(struct tfa_device *tfa, + int biquad_index); + +/** + * fill the calibration value as milli ohms in the struct + * assume that the device has been calibrated + */ +enum Tfa98xx_Error +tfa_dsp_get_calibration_impedance(struct tfa_device *tfa); + +/* + * return the mohm value + */ +int tfa_get_calibration_info(struct tfa_device *tfa, int channel); + +/* + * return sign extended tap pattern + */ +int tfa_get_tap_pattern(struct tfa_device *tfa); + +/** + * Reads a number of words from dsp memory + * @param tfa the device struct pointer + * @param subaddress write address to set in address register + * @param pValue pointer to read data +*/ +enum Tfa98xx_Error tfa98xx_read_register16(struct tfa_device *tfa, + unsigned char subaddress, + unsigned short *pValue); + +/** + * Reads a number of words from dsp memory + * @param tfa the device struct pointer + * @param subaddress write address to set in address register + * @param value value to write int the memory +*/ +enum Tfa98xx_Error tfa98xx_write_register16(struct tfa_device *tfa, + unsigned char subaddress, + unsigned short value); + +/** + * Intialise the dsp + * @param tfa the device struct pointer + * @return tfa error enum +*/ +enum Tfa98xx_Error +tfa98xx_init_dsp(struct tfa_device *tfa); + +/** + * Get the status of the external DSP + * @param tfa the device struct pointer + * @return status +*/ +int tfa98xx_get_dsp_status(struct tfa_device *tfa); + +/** + * Write a command message (RPC) to the dsp + * @param tfa the device struct pointer + * @param num_bytes command buffer size in bytes + * @param command_buffer + * @return tfa error enum +*/ +enum Tfa98xx_Error +tfa98xx_write_dsp(struct tfa_device *tfa, int num_bytes, const char *command_buffer); + +/** + * Read the result from the last message from the dsp + * @param tfa the device struct pointer + * @param num_bytes result buffer size in bytes + * @param result_buffer + * @return tfa error enum +*/ +enum Tfa98xx_Error +tfa98xx_read_dsp(struct tfa_device *tfa, int num_bytes, unsigned char *result_buffer); + +/** + * Write a command message (RPC) to the dsp and return the result + * @param tfa the device struct pointer + * @param command_length command buffer size in bytes + * @param command_buffer command buffer + * @param result_length result buffer size in bytes + * @param result_buffer result buffer + * @return tfa error enum +*/ +enum Tfa98xx_Error +tfa98xx_writeread_dsp(struct tfa_device *tfa, int command_length, void *command_buffer, + int result_length, void *result_buffer); + +/** + * Reads a number of words from dsp memory + * @param tfa the device struct pointer + * @param start_offset offset from where to start reading + * @param num_words number of words to read + * @param pValues pointer to read data +*/ +enum Tfa98xx_Error tfa98xx_dsp_read_mem(struct tfa_device *tfa, + unsigned int start_offset, + int num_words, int *pValues); +/** + * Write a value to dsp memory + * @param tfa the device struct pointer + * @param address write address to set in address register + * @param value value to write int the memory + * @param memtype type of memory to write to +*/ +enum Tfa98xx_Error tfa98xx_dsp_write_mem_word(struct tfa_device *tfa, + unsigned short address, int value, int memtype); + +/** + * Read data from dsp memory + * @param tfa the device struct pointer + * @param subaddress write address to set in address register + * @param num_bytes number of bytes to read from dsp + * @param data the unsigned char buffer to read data into +*/ +enum Tfa98xx_Error tfa98xx_read_data(struct tfa_device *tfa, + unsigned char subaddress, + int num_bytes, unsigned char data[]); + +/** + * Write all the bytes specified by num_bytes and data to dsp memory + * @param tfa the device struct pointer + * @param subaddress the subaddress to write to + * @param num_bytes number of bytes to write + * @param data actual data to write +*/ +enum Tfa98xx_Error tfa98xx_write_data(struct tfa_device *tfa, + unsigned char subaddress, + int num_bytes, + const unsigned char data[]); + +enum Tfa98xx_Error tfa98xx_write_raw(struct tfa_device *tfa, + int num_bytes, + const unsigned char data[]); + +/* support for converting error codes into text */ +const char *tfa98xx_get_error_string(enum Tfa98xx_Error error); + +/** + * convert signed 24 bit integers to 32bit aligned bytes + * input: data contains "num_bytes/3" int24 elements + * output: bytes contains "num_bytes" byte elements + * @param num_data length of the input data array + * @param data input data as integer array + * @param bytes output data as unsigned char array +*/ +void tfa98xx_convert_data2bytes(int num_data, const int data[], + unsigned char bytes[]); + +/** + * convert memory bytes to signed 24 bit integers + * input: bytes contains "num_bytes" byte elements + * output: data contains "num_bytes/3" int24 elements + * @param num_bytes length of the input data array + * @param bytes input data as unsigned char array + * @param data output data as integer array +*/ +void tfa98xx_convert_bytes2data(int num_bytes, const unsigned char bytes[], + int data[]); + +/** + * Read a part of the dsp memory + * @param tfa the device struct pointer + * @param memoryType indicator to the memory type + * @param offset from where to start reading + * @param length the number of bytes to read + * @param bytes output data as unsigned char array +*/ +enum Tfa98xx_Error tfa98xx_dsp_get_memory(struct tfa_device *tfa, int memoryType, + int offset, int length, unsigned char bytes[]); + +/** + * Write a value to the dsp memory + * @param tfa the device struct pointer + * @param memoryType indicator to the memory type + * @param offset from where to start writing + * @param length the number of bytes to write + * @param value the value to write to the dsp +*/ +enum Tfa98xx_Error tfa98xx_dsp_set_memory(struct tfa_device *tfa, int memoryType, + int offset, int length, int value); + +enum Tfa98xx_Error tfa98xx_dsp_write_config(struct tfa_device *tfa, int length, const unsigned char *p_config_bytes); +enum Tfa98xx_Error tfa98xx_dsp_write_drc(struct tfa_device *tfa, int length, const unsigned char *p_drc_bytes); + +/** + * write/read raw msg functions : + * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. + * The functions will return immediately and do not not wait for DSP reponse. + * @param tfa the device struct pointer + * @param length length of the character buffer to write + * @param buf character buffer to write +*/ +enum Tfa98xx_Error tfa_dsp_msg(struct tfa_device *tfa, int length, const char *buf); + + +/** + * The wrapper functions to call the dsp msg, register and memory function for tfa or probus + */ +enum Tfa98xx_Error dsp_msg(struct tfa_device *tfa, int length, const char *buf); +enum Tfa98xx_Error dsp_msg_read(struct tfa_device *tfa, int length, unsigned char *bytes); +enum Tfa98xx_Error reg_write(struct tfa_device *tfa, unsigned char subaddress, unsigned short value); +enum Tfa98xx_Error reg_read(struct tfa_device *tfa, unsigned char subaddress, unsigned short *value); +enum Tfa98xx_Error mem_write(struct tfa_device *tfa, unsigned short address, int value, int memtype); +enum Tfa98xx_Error mem_read(struct tfa_device *tfa, unsigned int start_offset, int num_words, int *pValues); + +enum Tfa98xx_Error dsp_partial_coefficients(struct tfa_device *tfa, uint8_t *prev, uint8_t *next); +int is_94_N2_device(struct tfa_device *tfa); +/** + * write/read raw msg functions: + * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. + * The functions will return immediately and do not not wait for DSP reponse. + * An ID is added to modify the command-ID + * @param tfa the device struct pointer + * @param length length of the character buffer to write + * @param buf character buffer to write + * @param cmdid command identifier +*/ +enum Tfa98xx_Error tfa_dsp_msg_id(struct tfa_device *tfa, int length, const char *buf, uint8_t cmdid[3]); + +/** + * write raw dsp msg functions + * @param tfa the device struct pointer + * @param length length of the character buffer to write + * @param buffer character buffer to write +*/ +enum Tfa98xx_Error tfa_dsp_msg_write(struct tfa_device *tfa, int length, const char *buffer); + +/** + * write raw dsp msg functions + * @param tfa the device struct pointer + * @param length length of the character buffer to write + * @param buffer character buffer to write + * @param cmdid command identifier +*/ +enum Tfa98xx_Error tfa_dsp_msg_write_id(struct tfa_device *tfa, int length, const char *buffer, uint8_t cmdid[3]); + +/** + * status function used by tfa_dsp_msg() to retrieve command/msg status: + * return a <0 status of the DSP did not ACK. + * @param tfa the device struct pointer + * @param pRpcStatus status for remote processor communication +*/ +enum Tfa98xx_Error tfa_dsp_msg_status(struct tfa_device *tfa, int *pRpcStatus); + +/** + * Read a message from dsp + * @param tfa the device struct pointer + * @param length number of bytes of the message + * @param bytes pointer to unsigned char buffer +*/ +enum Tfa98xx_Error tfa_dsp_msg_read(struct tfa_device *tfa, int length, unsigned char *bytes); + +int tfa_set_bf(struct tfa_device *tfa, const uint16_t bf, const uint16_t value); +int tfa_set_bf_volatile(struct tfa_device *tfa, const uint16_t bf, const uint16_t value); + +/** + * Get the value of a given bitfield + * @param tfa the device struct pointer + * @param bf the value indicating which bitfield + */ +int tfa_get_bf(struct tfa_device *tfa, const uint16_t bf); + +/** + * Set the value of a given bitfield + * @param bf the value indicating which bitfield + * @param bf_value the value of the bitfield + * @param p_reg_value a pointer to the register where to write the bitfield value + */ +int tfa_set_bf_value(const uint16_t bf, const uint16_t bf_value, uint16_t *p_reg_value); + +uint16_t tfa_get_bf_value(const uint16_t bf, const uint16_t reg_value); +int tfa_write_reg(struct tfa_device *tfa, const uint16_t bf, const uint16_t reg_value); +int tfa_read_reg(struct tfa_device *tfa, const uint16_t bf); + +/* bitfield */ +/** + * get the datasheet or bitfield name corresponding to the bitfield number + * @param num is the number for which to get the bitfield name + * @param rev is the device type + */ +char *tfaContBfName(uint16_t num, unsigned short rev); + +/** + * get the datasheet name corresponding to the bitfield number + * @param num is the number for which to get the bitfield name + * @param rev is the device type + */ +char *tfaContDsName(uint16_t num, unsigned short rev); + +/** + * get the bitfield name corresponding to the bitfield number + * @param num is the number for which to get the bitfield name + * @param rev is the device type + */ +char *tfaContBitName(uint16_t num, unsigned short rev); + +/** + * get the bitfield number corresponding to the bitfield name + * @param name is the bitfield name for which to get the bitfield number + * @param rev is the device type + */ +uint16_t tfaContBfEnum(const char *name, unsigned short rev); + +/** +* get the bitfield number corresponding to the bitfield name, checks for all devices +* @param name is the bitfield name for which to get the bitfield number + */ +uint16_t tfaContBfEnumAny(const char *name); + +#define TFA_FAM(tfa, fieldname) ((tfa->tfa_family == 1) ? TFA1_BF_##fieldname : TFA2_BF_##fieldname) +#define TFA_FAM_FW(tfa, fwname) ((tfa->tfa_family == 1) ? TFA1_FW_##fwname : TFA2_FW_##fwname) + +/* set/get bit fields to HW register*/ +#define TFA_SET_BF(tfa, fieldname, value) tfa_set_bf(tfa, TFA_FAM(tfa, fieldname), value) +#define TFA_SET_BF_VOLATILE(tfa, fieldname, value) tfa_set_bf_volatile(tfa, TFA_FAM(tfa, fieldname), value) +#define TFA_GET_BF(tfa, fieldname) tfa_get_bf(tfa, TFA_FAM(tfa, fieldname)) + +/* set/get bit field in variable */ +#define TFA_SET_BF_VALUE(tfa, fieldname, bf_value, p_reg_value) tfa_set_bf_value(TFA_FAM(tfa, fieldname), bf_value, p_reg_value) +#define TFA_GET_BF_VALUE(tfa, fieldname, reg_value) tfa_get_bf_value(TFA_FAM(tfa, fieldname), reg_value) + +/* write/read registers using a bit field name to determine the register address */ +#define TFA_WRITE_REG(tfa, fieldname, value) tfa_write_reg(tfa, TFA_FAM(tfa, fieldname), value) +#define TFA_READ_REG(tfa, fieldname) tfa_read_reg(tfa, TFA_FAM(tfa, fieldname)) + +/* FOR CALIBRATION RETRIES */ +#define TFA98XX_API_WAITRESULT_NTRIES 3000 // defined in API + +/** + * run the startup/init sequence and set ACS bit + * @param tfa the device struct pointer + * @param state the cold start state that is requested + */ +enum Tfa98xx_Error tfaRunColdboot(struct tfa_device *tfa, int state); +enum Tfa98xx_Error tfaRunMute(struct tfa_device *tfa); +enum Tfa98xx_Error tfaRunUnmute(struct tfa_device *tfa); + +/** + * wait for calibrateDone + * @param tfa the device struct pointer + * @param calibrateDone pointer to status of calibration + */ +enum Tfa98xx_Error tfaRunWaitCalibration(struct tfa_device *tfa, int *calibrateDone); + +/** + * run the startup/init sequence and set ACS bit + * @param tfa the device struct pointer + * @param profile the profile that should be loaded + */ +enum Tfa98xx_Error tfaRunColdStartup(struct tfa_device *tfa, int profile); + +/** + * this will load the patch witch will implicitly start the DSP + * if no patch is available the DPS is started immediately + * @param tfa the device struct pointer + */ +enum Tfa98xx_Error tfaRunStartDSP(struct tfa_device *tfa); + +/** + * start the clocks and wait until the AMP is switching + * on return the DSP sub system will be ready for loading + * @param tfa the device struct pointer + * @param profile the profile that should be loaded on startup + */ +enum Tfa98xx_Error tfaRunStartup(struct tfa_device *tfa, int profile); + +/** + * start the maximus speakerboost algorithm + * this implies a full system startup when the system was not already started + * @param tfa the device struct pointer + * @param force indicates wether a full system startup should be allowed + * @param profile the profile that should be loaded + */ +enum Tfa98xx_Error tfaRunSpeakerBoost(struct tfa_device *tfa, int force, int profile); + +/** + * Startup the device and write all files from device and profile section + * @param tfa the device struct pointer + * @param force indicates wether a full system startup should be allowed + * @param profile the profile that should be loaded on speaker startup + */ +enum Tfa98xx_Error tfaRunSpeakerStartup(struct tfa_device *tfa, int force, int profile); + +/** + * Run calibration + * @param tfa the device struct pointer + */ +enum Tfa98xx_Error tfaRunSpeakerCalibration(struct tfa_device *tfa); + +/** + * startup all devices. all step until patch loading is handled + * @param tfa the device struct pointer + */ +int tfaRunStartupAll(struct tfa_device *tfa); + +/** + * powerup the coolflux subsystem and wait for it + * @param tfa the device struct pointer + */ +enum Tfa98xx_Error tfa_cf_powerup(struct tfa_device *tfa); + +/* + * print the current device manager state + * @param tfa the device struct pointer + */ +enum Tfa98xx_Error show_current_state(struct tfa_device *tfa); + +/** + * Init registers and coldboot dsp + * @param tfa the device struct pointer + */ +int tfa_reset(struct tfa_device *tfa); + +/** + * Get profile from a register + * @param tfa the device struct pointer + */ +int tfa_dev_get_swprof(struct tfa_device *tfa); + +/** + * Save profile in a register + */ +int tfa_dev_set_swprof(struct tfa_device *tfa, unsigned short new_value); + +int tfa_dev_get_swvstep(struct tfa_device *tfa); + +int tfa_dev_set_swvstep(struct tfa_device *tfa, unsigned short new_value); + +int tfa_needs_reset(struct tfa_device *tfa); + +int tfa_is_cold(struct tfa_device *tfa); + +void tfa_set_query_info(struct tfa_device *tfa); + +int tfa_get_pga_gain(struct tfa_device *tfa); +int tfa_set_pga_gain(struct tfa_device *tfa, uint16_t value); +int tfa_get_noclk(struct tfa_device *tfa); + +/** + * Status of used for monitoring + * @param tfa the device struct pointer + * @return tfa error enum + */ + +enum Tfa98xx_Error tfa_status(struct tfa_device *tfa); + +/* + * function overload for flag_mtp_busy + */ +int tfa_dev_get_mtpb(struct tfa_device *tfa); + +enum Tfa98xx_Error tfaGetFwApiVersion(struct tfa_device *tfa, unsigned char *pFirmwareVersion); +#ifdef __cplusplus +} +#endif +#endif /* TFA_SERVICE_H */ diff --git a/src/tfa98xx.c b/src/tfa98xx.c new file mode 100644 index 000000000000..546f4f806149 --- /dev/null +++ b/src/tfa98xx.c @@ -0,0 +1,4368 @@ +/* + * tfa98xx.c tfa98xx codec module + * + * + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +#define pr_fmt(fmt) "%s(): " fmt, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "tfa98xx.h" +#include "tfa.h" +#include "tfa_dsp_fw.h" + + /* required for enum tfa9912_irq */ +#include "tfa98xx_tfafieldnames.h" + +#include "spk-id.h" + +#define TFA98XX_VERSION TFA98XX_API_REV_STR + +#define I2C_RETRIES 50 +#define I2C_RETRY_DELAY 5 /* ms */ + +/* Change volume selection behavior: + * Uncomment following line to generate a profile change when updating + * a volume control (also changes to the profile of the modified volume + * control) + */ + /*#define TFA98XX_ALSA_CTRL_PROF_CHG_ON_VOL 1 + */ + + /* Supported rates and data formats */ +#define TFA98XX_RATES SNDRV_PCM_RATE_8000_48000 +#define TFA98XX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) + +#define TF98XX_MAX_DSP_START_TRY_COUNT 10 + +#define TFA98XX_AAC_FW_NAME "tfa98xx_aac.cnt" +#define TFA98XX_GOER_FW_NAME "tfa98xx_goer.cnt" + +/* data accessible by all instances */ +static struct kmem_cache *tfa98xx_cache; /* Memory pool used for DSP messages */ +/* Mutex protected data */ +static DEFINE_MUTEX(tfa98xx_mutex); +static LIST_HEAD(tfa98xx_device_list); +static int tfa98xx_device_count; +static int tfa98xx_sync_count; +static LIST_HEAD(profile_list); /* list of user selectable profiles */ +static int tfa98xx_mixer_profiles; /* number of user selectable profiles */ +static int tfa98xx_mixer_profile; /* current mixer profile */ +static struct snd_kcontrol_new *tfa98xx_controls; +static TfaContainer_t *tfa98xx_container; + +static int tfa98xx_kmsg_regs; +static int tfa98xx_ftrace_regs; + +static char *fw_name = "tfa98xx.cnt"; +module_param(fw_name, charp, 0644); +MODULE_PARM_DESC(fw_name, "TFA98xx DSP firmware (container file) name."); + +static int trace_level; +module_param(trace_level, int, 0444); +MODULE_PARM_DESC(trace_level, "TFA98xx debug trace level (0=off, bits:1=verbose,2=regdmesg,3=regftrace,4=timing)."); + +static char *dflt_prof_name = ""; +module_param(dflt_prof_name, charp, 0444); + +static int no_start; +module_param(no_start, int, 0444); +MODULE_PARM_DESC(no_start, "do not start the work queue; for debugging via user\n"); + +static int no_reset; +module_param(no_reset, int, 0444); +MODULE_PARM_DESC(no_reset, "do not use the reset line; for debugging via user\n"); + +static int pcm_no_constraint; +module_param(pcm_no_constraint, int, 0444); +MODULE_PARM_DESC(pcm_no_constraint, "do not use constraints for PCM parameters\n"); + +static void tfa98xx_tapdet_check_update(struct tfa98xx *tfa98xx); +static int tfa98xx_get_fssel(unsigned int rate); +static void tfa98xx_interrupt_enable(struct tfa98xx *tfa98xx, bool enable); + +static int get_profile_from_list(char *buf, int id); +static int get_profile_id_for_sr(int id, unsigned int rate); + +struct tfa98xx_rate { + unsigned int rate; + unsigned int fssel; +}; + +static const struct tfa98xx_rate rate_to_fssel[] = { + { 8000, 0 }, + { 11025, 1 }, + { 12000, 2 }, + { 16000, 3 }, + { 22050, 4 }, + { 24000, 5 }, + { 32000, 6 }, + { 44100, 7 }, + { 48000, 8 }, +}; + +int nxp_spk_id_get(struct device_node *np) +{ + int id = VENDOR_ID_UNKNOWN; + int state = 3; + + /*state = spk_id_get_pin_3state(np); + if (state < 0) { + pr_err("%s: Can not get id pin state, %d\n", __func__, state); + return VENDOR_ID_NONE; + }*/ + + switch (state) { + case PIN_PULL_DOWN: + id = VENDOR_ID_GOER; + break; + case PIN_PULL_UP: + id = VENDOR_ID_UNKNOWN; + break; + case PIN_FLOAT: + id = VENDOR_ID_AAC; + break; + default: + id = VENDOR_ID_NONE; + break; + } + return id; +} + +static int nxp_vendor_id_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = VENDOR_ID_NONE; + + if (tfa98xx->spk_id_gpio_p) + ucontrol->value.integer.value[0] = nxp_spk_id_get(tfa98xx->spk_id_gpio_p); + return 0; +} + +static const char *const nxp_vendor_id_text[] = {"None", "AAC", "SSI", "GOER", "Unknown"}; + +static const struct soc_enum nxp_vendor_id[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(nxp_vendor_id_text), nxp_vendor_id_text), +}; + +const struct snd_kcontrol_new nxp_spk_id_controls[] = { + SOC_ENUM_EXT("SPK ID", nxp_vendor_id, nxp_vendor_id_get, NULL), +}; + +static inline char *tfa_cont_profile_name(struct tfa98xx *tfa98xx, int prof_idx) +{ + if (tfa98xx->tfa->cnt == NULL) + return NULL; + return tfaContProfileName(tfa98xx->tfa->cnt, tfa98xx->tfa->dev_idx, prof_idx); +} + +static enum tfa_error tfa98xx_write_re25(struct tfa_device *tfa, int value) +{ + enum tfa_error err; + + /* clear MTPEX */ + err = tfa_dev_mtp_set(tfa, TFA_MTP_EX, 0); + if (err == tfa_error_ok) { + /* set RE25 in shadow regiser */ + err = tfa_dev_mtp_set(tfa, TFA_MTP_RE25_PRIM, value); + } + if (err == tfa_error_ok) { + /* set MTPEX to copy RE25 into MTP */ + err = tfa_dev_mtp_set(tfa, TFA_MTP_EX, 2); + } + + return err; +} + +/* Wrapper for tfa start */ +static enum tfa_error tfa98xx_tfa_start(struct tfa98xx *tfa98xx, int next_profile, int vstep) +{ + enum tfa_error err; + ktime_t start_time, stop_time; + u64 delta_time; + + start_time = ktime_get_boottime(); + + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ +#ifdef __KERNEL__ + err = tfa_dev_start(tfa98xx->tfa, next_profile, vstep, tfa98xx->pcm_format); +#else + err = tfa_dev_start(tfa98xx->tfa, next_profile, vstep); +#endif + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ + + if (trace_level & 8) { + stop_time = ktime_get_boottime(); + delta_time = ktime_to_ns(ktime_sub(stop_time, start_time)); + do_div(delta_time, 1000); + dev_dbg(&tfa98xx->i2c->dev, "tfa_dev_start(%d,%d) time = %lld us\n", + next_profile, vstep, delta_time); + } + + if ((err == tfa_error_ok) && (tfa98xx->set_mtp_cal)) { + enum tfa_error err_cal; + + err_cal = tfa98xx_write_re25(tfa98xx->tfa, tfa98xx->cal_data); + if (err_cal != tfa_error_ok) { + pr_err("Error, setting calibration value in mtp, err=%d\n", err_cal); + } else { + tfa98xx->set_mtp_cal = false; + pr_debug("Calibration value (%d) set in mtp\n", + tfa98xx->cal_data); + } + } + + /* Check and update tap-detection state (in case of profile change) */ + tfa98xx_tapdet_check_update(tfa98xx); + + /* Remove sticky bit by reading it once */ + tfa_get_noclk(tfa98xx->tfa); + + /* A cold start erases the configuration, including interrupts setting. + * Restore it if required + */ + tfa98xx_interrupt_enable(tfa98xx, true); + + return err; +} + +static int tfa98xx_input_open(struct input_dev *dev) +{ + struct tfa98xx *tfa98xx = input_get_drvdata(dev); + + dev_dbg(tfa98xx->codec->dev, "opening device file\n"); + + /* note: open function is called only once by the framework. + * No need to count number of open file instances. + */ + if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) { + dev_dbg(&tfa98xx->i2c->dev, + "DSP not loaded, cannot start tap-detection\n"); + return -EIO; + } + + /* enable tap-detection service */ + tfa98xx->tapdet_open = true; + tfa98xx_tapdet_check_update(tfa98xx); + + return 0; +} + +static void tfa98xx_input_close(struct input_dev *dev) +{ + struct tfa98xx *tfa98xx = input_get_drvdata(dev); + + dev_dbg(tfa98xx->codec->dev, "closing device file\n"); + + /* Note: close function is called if the device is unregistered */ + + /* disable tap-detection service */ + tfa98xx->tapdet_open = false; + tfa98xx_tapdet_check_update(tfa98xx); +} + +static int tfa98xx_register_inputdev(struct tfa98xx *tfa98xx) +{ + int err; + struct input_dev *input; + + input = input_allocate_device(); + + if (!input) { + dev_err(tfa98xx->codec->dev, "Unable to allocate input device\n"); + return -ENOMEM; + } + + input->evbit[0] = BIT_MASK(EV_KEY); + input->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_0); + input->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1); + input->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2); + input->keybit[BIT_WORD(BTN_3)] |= BIT_MASK(BTN_3); + input->keybit[BIT_WORD(BTN_4)] |= BIT_MASK(BTN_4); + input->keybit[BIT_WORD(BTN_5)] |= BIT_MASK(BTN_5); + input->keybit[BIT_WORD(BTN_6)] |= BIT_MASK(BTN_6); + input->keybit[BIT_WORD(BTN_7)] |= BIT_MASK(BTN_7); + input->keybit[BIT_WORD(BTN_8)] |= BIT_MASK(BTN_8); + input->keybit[BIT_WORD(BTN_9)] |= BIT_MASK(BTN_9); + + input->open = tfa98xx_input_open; + input->close = tfa98xx_input_close; + + input->name = "tfa98xx-tapdetect"; + + input->id.bustype = BUS_I2C; + input_set_drvdata(input, tfa98xx); + + err = input_register_device(input); + if (err) { + dev_err(tfa98xx->codec->dev, "Unable to register input device\n"); + goto err_free_dev; + } + + dev_dbg(tfa98xx->codec->dev, "Input device for tap-detection registered: %s\n", + input->name); + tfa98xx->input = input; + return 0; + +err_free_dev: + input_free_device(input); + return err; +} + +/* + * Check if an input device for tap-detection can and shall be registered. + * Register it if appropriate. + * If already registered, check if still relevant and remove it if necessary. + * unregister: true to request inputdev unregistration. + */ +static void __tfa98xx_inputdev_check_register(struct tfa98xx *tfa98xx, bool unregister) +{ + bool tap_profile = false; + unsigned int i; + + for (i = 0; i < tfa_cnt_get_dev_nprof(tfa98xx->tfa); i++) { + if (strstr(tfa_cont_profile_name(tfa98xx, i), ".tap")) { + tap_profile = true; + tfa98xx->tapdet_profiles |= 1 << i; + dev_info(tfa98xx->codec->dev, + "found a tap-detection profile (%d - %s)\n", + i, tfa_cont_profile_name(tfa98xx, i)); + } + } + + /* Check for device support: + * - at device level + * - at container (profile) level + */ + if (!(tfa98xx->flags & TFA98XX_FLAG_TAPDET_AVAILABLE) || + !tap_profile || + unregister) { + /* No input device supported or required */ + if (tfa98xx->input) { + input_unregister_device(tfa98xx->input); + tfa98xx->input = NULL; + } + return; + } + + /* input device required */ + if (tfa98xx->input) + dev_info(tfa98xx->codec->dev, "Input device already registered, skipping\n"); + else + tfa98xx_register_inputdev(tfa98xx); +} + +static void tfa98xx_inputdev_check_register(struct tfa98xx *tfa98xx) +{ + __tfa98xx_inputdev_check_register(tfa98xx, false); +} + +static void tfa98xx_inputdev_unregister(struct tfa98xx *tfa98xx) +{ + __tfa98xx_inputdev_check_register(tfa98xx, true); +} + +#ifdef CONFIG_DEBUG_FS +/* OTC reporting + * Returns the MTP0 OTC bit value + */ +static int tfa98xx_dbgfs_otc_get(void *data, u64 *val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + int value; + + mutex_lock(&tfa98xx->dsp_lock); + value = tfa_dev_mtp_get(tfa98xx->tfa, TFA_MTP_OTC); + mutex_unlock(&tfa98xx->dsp_lock); + + if (value < 0) { + pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, value); + return -EIO; + } + + *val = value; + pr_debug("[0x%x] OTC : %d\n", tfa98xx->i2c->addr, value); + + return 0; +} + +static int tfa98xx_dbgfs_otc_set(void *data, u64 val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + enum tfa_error err; + + if (val != 0 && val != 1) { + pr_err("[0x%x] Unexpected value %llu\n", tfa98xx->i2c->addr, val); + return -EINVAL; + } + + mutex_lock(&tfa98xx->dsp_lock); + err = tfa_dev_mtp_set(tfa98xx->tfa, TFA_MTP_OTC, val); + mutex_unlock(&tfa98xx->dsp_lock); + + if (err != tfa_error_ok) { + pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, err); + return -EIO; + } + + pr_debug("[0x%x] OTC < %llu\n", tfa98xx->i2c->addr, val); + + return 0; +} + +static int tfa98xx_dbgfs_mtpex_get(void *data, u64 *val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + int value; + + mutex_lock(&tfa98xx->dsp_lock); + value = tfa_dev_mtp_get(tfa98xx->tfa, TFA_MTP_EX); + mutex_unlock(&tfa98xx->dsp_lock); + + if (value < 0) { + pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, value); + return -EIO; + } + + + *val = value; + pr_debug("[0x%x] MTPEX : %d\n", tfa98xx->i2c->addr, value); + + return 0; +} + +static int tfa98xx_dbgfs_mtpex_set(void *data, u64 val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + enum tfa_error err; + + if (val != 0) { + pr_err("[0x%x] Can only clear MTPEX (0 value expected)\n", tfa98xx->i2c->addr); + return -EINVAL; + } + + mutex_lock(&tfa98xx->dsp_lock); + err = tfa_dev_mtp_set(tfa98xx->tfa, TFA_MTP_EX, val); + mutex_unlock(&tfa98xx->dsp_lock); + + if (err != tfa_error_ok) { + pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, err); + return -EIO; + } + + pr_debug("[0x%x] MTPEX < 0\n", tfa98xx->i2c->addr); + + return 0; +} + +static int tfa98xx_dbgfs_temp_get(void *data, u64 *val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + + mutex_lock(&tfa98xx->dsp_lock); + *val = tfa98xx_get_exttemp(tfa98xx->tfa); + mutex_unlock(&tfa98xx->dsp_lock); + + pr_debug("[0x%x] TEMP : %llu\n", tfa98xx->i2c->addr, *val); + + return 0; +} + +static int tfa98xx_dbgfs_temp_set(void *data, u64 val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + + mutex_lock(&tfa98xx->dsp_lock); + tfa98xx_set_exttemp(tfa98xx->tfa, (short)val); + mutex_unlock(&tfa98xx->dsp_lock); + + pr_debug("[0x%x] TEMP < %llu\n", tfa98xx->i2c->addr, val); + + return 0; +} + +static ssize_t tfa98xx_dbgfs_start_set(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct i2c_client *i2c = file->private_data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + enum tfa_error ret; + char buf[32]; + const char ref[] = "please calibrate now"; + int buf_size, cal_profile = 0; + + /* check string length, and account for eol */ + if (count > sizeof(ref) + 1 || count < (sizeof(ref) - 1)) + return -EINVAL; + + buf_size = min(count, (size_t)(sizeof(buf) - 1)); + if (copy_from_user(buf, user_buf, buf_size)) + return -EFAULT; + buf[buf_size] = 0; + + /* Compare string, excluding the trailing \0 and the potentials eol */ + if (strncmp(buf, ref, sizeof(ref) - 1)) + return -EINVAL; + + mutex_lock(&tfa98xx->dsp_lock); + ret = tfa_calibrate(tfa98xx->tfa); + if (ret == tfa_error_ok) { + cal_profile = tfaContGetCalProfile(tfa98xx->tfa); + if (cal_profile < 0) { + pr_warn("[0x%x] Calibration profile not found\n", + tfa98xx->i2c->addr); + } + + ret = tfa98xx_tfa_start(tfa98xx, cal_profile, tfa98xx->vstep); + } + if (ret == tfa_error_ok) + tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); + mutex_unlock(&tfa98xx->dsp_lock); + + if (ret) { + pr_info("[0x%x] Calibration start failed (%d)\n", tfa98xx->i2c->addr, ret); + return -EIO; + } else { + pr_debug("[0x%x] Calibration started\n", tfa98xx->i2c->addr); + } + + return count; +} + +static ssize_t tfa98xx_dbgfs_r_read(struct file *file, + char __user *user_buf, size_t count, + loff_t *ppos) +{ + struct i2c_client *i2c = file->private_data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + char *str; + uint16_t status; + int ret; + + mutex_lock(&tfa98xx->dsp_lock); + + /* Need to ensure DSP is access-able, use mtp read access for this + * purpose + */ + ret = tfa98xx_get_mtp(tfa98xx->tfa, &status); + if (ret) { + ret = -EIO; + pr_err("[0x%x] MTP read failed\n", tfa98xx->i2c->addr); + goto r_c_err; + } + + ret = tfaRunSpeakerCalibration(tfa98xx->tfa); + if (ret) { + ret = -EIO; + pr_err("[0x%x] calibration failed\n", tfa98xx->i2c->addr); + goto r_c_err; + } + + str = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!str) { + ret = -ENOMEM; + pr_err("[0x%x] memory allocation failed\n", tfa98xx->i2c->addr); + goto r_c_err; + } + + if (tfa98xx->tfa->spkr_count > 1) { + ret = snprintf(str, PAGE_SIZE, + "Prim:%d mOhms, Sec:%d mOhms\n", + tfa98xx->tfa->mohm[0], + tfa98xx->tfa->mohm[1]); + } else { + ret = snprintf(str, PAGE_SIZE, + "Prim:%d mOhms\n", + tfa98xx->tfa->mohm[0]); + } + + pr_debug("[0x%x] calib_done: %s", tfa98xx->i2c->addr, str); + + if (ret < 0) + goto r_err; + + ret = simple_read_from_buffer(user_buf, count, ppos, str, ret); + +r_err: + kfree(str); +r_c_err: + mutex_unlock(&tfa98xx->dsp_lock); + return ret; +} + +static ssize_t tfa98xx_dbgfs_version_read(struct file *file, + char __user *user_buf, size_t count, + loff_t *ppos) +{ + char str[] = TFA98XX_VERSION "\n"; + int ret; + + ret = simple_read_from_buffer(user_buf, count, ppos, str, sizeof(str)); + + return ret; +} + +static ssize_t tfa98xx_dbgfs_dsp_state_get(struct file *file, + char __user *user_buf, size_t count, + loff_t *ppos) +{ + struct i2c_client *i2c = file->private_data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + int ret = 0; + char *str; + + switch (tfa98xx->dsp_init) { + case TFA98XX_DSP_INIT_STOPPED: + str = "Stopped\n"; + break; + case TFA98XX_DSP_INIT_RECOVER: + str = "Recover requested\n"; + break; + case TFA98XX_DSP_INIT_FAIL: + str = "Failed init\n"; + break; + case TFA98XX_DSP_INIT_PENDING: + str = "Pending init\n"; + break; + case TFA98XX_DSP_INIT_DONE: + str = "Init complete\n"; + break; + default: + str = "Invalid\n"; + } + + pr_debug("[0x%x] dsp_state : %s\n", tfa98xx->i2c->addr, str); + + ret = simple_read_from_buffer(user_buf, count, ppos, str, strlen(str)); + return ret; +} + +static ssize_t tfa98xx_dbgfs_dsp_state_set(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct i2c_client *i2c = file->private_data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + enum tfa_error ret; + char buf[32]; + const char start_cmd[] = "start"; + const char stop_cmd[] = "stop"; + const char mon_start_cmd[] = "monitor start"; + const char mon_stop_cmd[] = "monitor stop"; + int buf_size; + + buf_size = min(count, (size_t)(sizeof(buf) - 1)); + if (copy_from_user(buf, user_buf, buf_size)) + return -EFAULT; + buf[buf_size] = 0; + + /* Compare strings, excluding the trailing \0 */ + if (!strncmp(buf, start_cmd, sizeof(start_cmd) - 1)) { + pr_info("[0x%x] Manual triggering of dsp start...\n", tfa98xx->i2c->addr); + mutex_lock(&tfa98xx->dsp_lock); + ret = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); + mutex_unlock(&tfa98xx->dsp_lock); + pr_debug("[0x%x] tfa_dev_start complete: %d\n", tfa98xx->i2c->addr, ret); + } else if (!strncmp(buf, stop_cmd, sizeof(stop_cmd) - 1)) { + pr_info("[0x%x] Manual triggering of dsp stop...\n", tfa98xx->i2c->addr); + mutex_lock(&tfa98xx->dsp_lock); + ret = tfa_dev_stop(tfa98xx->tfa); + mutex_unlock(&tfa98xx->dsp_lock); + pr_debug("[0x%x] tfa_dev_stop complete: %d\n", tfa98xx->i2c->addr, ret); + } else if (!strncmp(buf, mon_start_cmd, sizeof(mon_start_cmd) - 1)) { + pr_info("[0x%x] Manual start of monitor thread...\n", tfa98xx->i2c->addr); + queue_delayed_work(tfa98xx->tfa98xx_wq, + &tfa98xx->monitor_work, HZ); + } else if (!strncmp(buf, mon_stop_cmd, sizeof(mon_stop_cmd) - 1)) { + pr_info("[0x%x] Manual stop of monitor thread...\n", tfa98xx->i2c->addr); + cancel_delayed_work_sync(&tfa98xx->monitor_work); + } else { + return -EINVAL; + } + + return count; +} + +static ssize_t tfa98xx_dbgfs_fw_state_get(struct file *file, + char __user *user_buf, size_t count, + loff_t *ppos) +{ + struct i2c_client *i2c = file->private_data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + char *str; + + switch (tfa98xx->dsp_fw_state) { + case TFA98XX_DSP_FW_NONE: + str = "None\n"; + break; + case TFA98XX_DSP_FW_PENDING: + str = "Pending\n"; + break; + case TFA98XX_DSP_FW_FAIL: + str = "Fail\n"; + break; + case TFA98XX_DSP_FW_OK: + str = "Ok\n"; + break; + default: + str = "Invalid\n"; + } + + pr_debug("[0x%x] fw_state : %s", tfa98xx->i2c->addr, str); + + return simple_read_from_buffer(user_buf, count, ppos, str, strlen(str)); +} + +#ifdef TFA_NON_DSP_SOLUTION +extern int send_tfa_cal_apr(void *buf, int cmd_size, bool bRead); +#else +int send_tfa_cal_apr(void *buf, int cmd_size, bool bRead) +{ + return 0; +} +#endif + +static ssize_t tfa98xx_dbgfs_rpc_read(struct file *file, + char __user *user_buf, size_t count, + loff_t *ppos) +{ + struct i2c_client *i2c = file->private_data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + int ret = 0; + uint8_t *buffer; + enum Tfa98xx_Error error; + + if (tfa98xx->tfa == NULL) { + pr_debug("[0x%x] dsp is not available\n", tfa98xx->i2c->addr); + return -ENODEV; + } + + if (count == 0) + return 0; + + buffer = kmalloc(count, GFP_KERNEL); + if (buffer == NULL) { + pr_debug("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); + return -ENOMEM; + } + + mutex_lock(&tfa98xx->dsp_lock); + + if (tfa98xx->tfa->is_probus_device) { + error = send_tfa_cal_apr(buffer, count, true); + } else { + error = dsp_msg_read(tfa98xx->tfa, count, buffer); + } + mutex_unlock(&tfa98xx->dsp_lock); + if (error != Tfa98xx_Error_Ok) { + pr_debug("[0x%x] dsp_msg_read error: %d\n", tfa98xx->i2c->addr, error); + kfree(buffer); + return -EFAULT; + } + + ret = copy_to_user(user_buf, buffer, count); + kfree(buffer); + if (ret) + return -EFAULT; + + *ppos += count; + return count; +} + +static ssize_t tfa98xx_dbgfs_rpc_send(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct i2c_client *i2c = file->private_data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + TfaFileDsc_t *msg_file; + enum Tfa98xx_Error error; + int err = 0; + + if (tfa98xx->tfa == NULL) { + pr_debug("[0x%x] dsp is not available\n", tfa98xx->i2c->addr); + return -ENODEV; + } + + if (count == 0) + return 0; + + /* msg_file.name is not used */ + msg_file = kmalloc(count + sizeof(TfaFileDsc_t), GFP_KERNEL); + if (msg_file == NULL) { + pr_debug("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); + return -ENOMEM; + } + + msg_file->size = count; + if (copy_from_user(msg_file->data, user_buf, count)) + return -EFAULT; + + if (tfa98xx->tfa->is_probus_device) { + mutex_lock(&tfa98xx->dsp_lock); + error = send_tfa_cal_apr(msg_file->data, msg_file->size, false); + if (error != Tfa98xx_Error_Ok) { + pr_debug("[0x%x] dsp_msg error: %d\n", tfa98xx->i2c->addr, error); + err = -EIO; + } + mutex_unlock(&tfa98xx->dsp_lock); + + mdelay(2); + } else { + mutex_lock(&tfa98xx->dsp_lock); + + if ((msg_file->data[0] == 'M') && (msg_file->data[1] == 'G')) { + error = tfaContWriteFile(tfa98xx->tfa, msg_file, 0, 0); /* int vstep_idx, int vstep_msg_idx both 0 */ + if (error != Tfa98xx_Error_Ok) { + pr_debug("[0x%x] tfaContWriteFile error: %d\n", tfa98xx->i2c->addr, error); + err = -EIO; + } + } else { + error = dsp_msg(tfa98xx->tfa, msg_file->size, msg_file->data); + if (error != Tfa98xx_Error_Ok) { + pr_debug("[0x%x] dsp_msg error: %d\n", tfa98xx->i2c->addr, error); + err = -EIO; + } + } + mutex_unlock(&tfa98xx->dsp_lock); + } + + kfree(msg_file); + + if (err) + return err; + return count; +} +/* -- RPC */ + +static int tfa98xx_dbgfs_pga_gain_get(void *data, u64 *val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + unsigned int value; + + value = tfa_get_pga_gain(tfa98xx->tfa); + if (value < 0) + return -EINVAL; + + *val = value; + return 0; +} + +static int tfa98xx_dbgfs_pga_gain_set(void *data, u64 val) +{ + struct i2c_client *i2c = (struct i2c_client *)data; + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + uint16_t value; + int err; + + value = val & 0xffff; + if (value > 7) + return -EINVAL; + + err = tfa_set_pga_gain(tfa98xx->tfa, value); + if (err < 0) + return -EINVAL; + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_calib_otc_fops, tfa98xx_dbgfs_otc_get, + tfa98xx_dbgfs_otc_set, "%llu\n"); +DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_calib_mtpex_fops, tfa98xx_dbgfs_mtpex_get, + tfa98xx_dbgfs_mtpex_set, "%llu\n"); +DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_calib_temp_fops, tfa98xx_dbgfs_temp_get, + tfa98xx_dbgfs_temp_set, "%llu\n"); + +DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_pga_gain_fops, tfa98xx_dbgfs_pga_gain_get, + tfa98xx_dbgfs_pga_gain_set, "%llu\n"); + +static const struct file_operations tfa98xx_dbgfs_calib_start_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .write = tfa98xx_dbgfs_start_set, + .llseek = default_llseek, +}; + +static const struct file_operations tfa98xx_dbgfs_r_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .read = tfa98xx_dbgfs_r_read, + .llseek = default_llseek, +}; + +static const struct file_operations tfa98xx_dbgfs_version_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .read = tfa98xx_dbgfs_version_read, + .llseek = default_llseek, +}; + +static const struct file_operations tfa98xx_dbgfs_dsp_state_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .read = tfa98xx_dbgfs_dsp_state_get, + .write = tfa98xx_dbgfs_dsp_state_set, + .llseek = default_llseek, +}; + +static const struct file_operations tfa98xx_dbgfs_fw_state_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .read = tfa98xx_dbgfs_fw_state_get, + .llseek = default_llseek, +}; + +static const struct file_operations tfa98xx_dbgfs_rpc_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .read = tfa98xx_dbgfs_rpc_read, + .write = tfa98xx_dbgfs_rpc_send, + .llseek = default_llseek, +}; + +static void tfa98xx_debug_init(struct tfa98xx *tfa98xx, struct i2c_client *i2c) +{ + char name[50]; + + scnprintf(name, MAX_CONTROL_NAME, "%s-%x", i2c->name, i2c->addr); + tfa98xx->dbg_dir = debugfs_create_dir(name, NULL); + debugfs_create_file("OTC", 0666, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_calib_otc_fops); + debugfs_create_file("MTPEX", 0666, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_calib_mtpex_fops); + debugfs_create_file("TEMP", 0666, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_calib_temp_fops); + debugfs_create_file("calibrate", 0666, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_calib_start_fops); + debugfs_create_file("R", 0444, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_r_fops); + debugfs_create_file("version", 0444, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_version_fops); + debugfs_create_file("dsp-state", 0666, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_dsp_state_fops); + debugfs_create_file("fw-state", 0666, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_fw_state_fops); + debugfs_create_file("rpc", 0666, tfa98xx->dbg_dir, + i2c, &tfa98xx_dbgfs_rpc_fops); + + if (tfa98xx->flags & TFA98XX_FLAG_SAAM_AVAILABLE) { + dev_dbg(tfa98xx->dev, "Adding pga_gain debug interface\n"); + debugfs_create_file("pga_gain", 0444, tfa98xx->dbg_dir, + tfa98xx->i2c, + &tfa98xx_dbgfs_pga_gain_fops); + } +} + +static void tfa98xx_debug_remove(struct tfa98xx *tfa98xx) +{ + debugfs_remove_recursive(tfa98xx->dbg_dir); +} +#endif + + +/* copies the profile basename (i.e. part until .) into buf */ +static void get_profile_basename(char *buf, char *profile) +{ + int cp_len = 0, idx = 0; + char *pch; + + pch = strchr(profile, '.'); + idx = pch - profile; + cp_len = (pch != NULL) ? idx : (int)strlen(profile); + memcpy(buf, profile, cp_len); + buf[cp_len] = 0; +} + +/* return the profile name accociated with id from the profile list */ +static int get_profile_from_list(char *buf, int id) +{ + struct tfa98xx_baseprofile *bprof; + + list_for_each_entry(bprof, &profile_list, list) { + if (bprof->item_id == id) { + strcpy(buf, bprof->basename); + return 0; + } + } + + return -1; +} + +/* search for the profile in the profile list */ +static int is_profile_in_list(char *profile, int len) +{ + struct tfa98xx_baseprofile *bprof; + + list_for_each_entry(bprof, &profile_list, list) { + + if ((len == bprof->len) && (strncmp(bprof->basename, profile, len) == 0)) + return 1; + } + + return 0; +} + +/* + * for the profile with id, look if the requested samplerate is + * supported, if found return the (container)profile for this + * samplerate, on error or if not found return -1 + */ +static int get_profile_id_for_sr(int id, unsigned int rate) +{ + int idx = 0; + struct tfa98xx_baseprofile *bprof; + + list_for_each_entry(bprof, &profile_list, list) { + if (id == bprof->item_id) { + idx = tfa98xx_get_fssel(rate); + if (idx < 0) { + /* samplerate not supported */ + return -1; + } + + return bprof->sr_rate_sup[idx]; + } + } + + /* profile not found */ + return -1; +} + +static int get_profile_id_by_name(char *profile, int len) +{ + struct tfa98xx_baseprofile *bprof; + int prof_index = -1; + + list_for_each_entry(bprof, &profile_list, list) { + if (strncmp(profile, bprof->basename, len) == 0) { + prof_index = bprof->item_id; + break; + } + } + + return prof_index; +} + +/* check if this profile is a calibration profile */ +static int is_calibration_profile(char *profile) +{ + if (strstr(profile, ".cal") != NULL) + return 1; + return 0; +} + +/* + * adds the (container)profile index of the samplerate found in + * the (container)profile to a fixed samplerate table in the (mixer)profile + */ +static int add_sr_to_profile(struct tfa98xx *tfa98xx, char *basename, int len, int profile) +{ + struct tfa98xx_baseprofile *bprof; + int idx = 0; + unsigned int sr = 0; + + list_for_each_entry(bprof, &profile_list, list) { + if ((len == bprof->len) && (strncmp(bprof->basename, basename, len) == 0)) { + /* add supported samplerate for this profile */ + sr = tfa98xx_get_profile_sr(tfa98xx->tfa, profile); + if (!sr) { + pr_err("unable to identify supported sample rate for %s\n", bprof->basename); + return -1; + } + + /* get the index for this samplerate */ + idx = tfa98xx_get_fssel(sr); + if (idx < 0 || idx >= TFA98XX_NUM_RATES) { + pr_err("invalid index for samplerate %d\n", idx); + return -1; + } + + /* enter the (container)profile for this samplerate at the corresponding index */ + bprof->sr_rate_sup[idx] = profile; + + pr_debug("added profile:samplerate = [%d:%d] for mixer profile: %s\n", profile, sr, bprof->basename); + } + } + + return 0; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0) +static struct snd_soc_codec *snd_soc_kcontrol_codec(struct snd_kcontrol *kcontrol) +{ + return snd_kcontrol_chip(kcontrol); +} +#endif + +static int tfa98xx_get_vstep(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + int mixer_profile = kcontrol->private_value; + int ret = 0; + int profile; + + profile = get_profile_id_for_sr(mixer_profile, tfa98xx->rate); + if (profile < 0) { + pr_err("tfa98xx: tfa98xx_get_vstep: invalid profile %d (mixer_profile=%d, rate=%d)\n", profile, mixer_profile, tfa98xx->rate); + return -EINVAL; + } + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + int vstep = tfa98xx->prof_vsteps[profile]; + + ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = + tfacont_get_max_vstep(tfa98xx->tfa, profile) + - vstep - 1; + } + mutex_unlock(&tfa98xx_mutex); + + return ret; +} + +static int tfa98xx_set_vstep(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + int mixer_profile = kcontrol->private_value; + int profile; + int err = 0; + int change = 0; + + pr_debug("%s no_start=%d\n", __func__, no_start); + if (no_start != 0) + return 0; + + profile = get_profile_id_for_sr(mixer_profile, tfa98xx->rate); + if (profile < 0) { + pr_err("tfa98xx: tfa98xx_set_vstep: invalid profile %d (mixer_profile=%d, rate=%d)\n", profile, mixer_profile, tfa98xx->rate); + return -EINVAL; + } + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + int vstep, vsteps; + int ready = 0; + int new_vstep; + int value = ucontrol->value.integer.value[tfa98xx->tfa->dev_idx]; + + vstep = tfa98xx->prof_vsteps[profile]; + vsteps = tfacont_get_max_vstep(tfa98xx->tfa, profile); + + if (vstep == vsteps - value - 1) + continue; + + new_vstep = vsteps - value - 1; + + if (new_vstep < 0) + new_vstep = 0; + + tfa98xx->prof_vsteps[profile] = new_vstep; + +#ifndef TFA98XX_ALSA_CTRL_PROF_CHG_ON_VOL + if (profile == tfa98xx->profile) { +#endif + /* this is the active profile, program the new vstep */ + tfa98xx->vstep = new_vstep; + mutex_lock(&tfa98xx->dsp_lock); + tfa98xx_dsp_system_stable(tfa98xx->tfa, &ready); + + if (ready) { + err = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); + if (err) { + pr_err("Write vstep error: %d\n", err); + } else { + pr_debug("Succesfully changed vstep index!\n"); + change = 1; + } + } + + mutex_unlock(&tfa98xx->dsp_lock); +#ifndef TFA98XX_ALSA_CTRL_PROF_CHG_ON_VOL + } +#endif + pr_debug("%d: vstep:%d, (control value: %d) - profile %d\n", + tfa98xx->tfa->dev_idx, new_vstep, value, profile); + } + + if (change) { + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + mutex_lock(&tfa98xx->dsp_lock); + tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); + mutex_unlock(&tfa98xx->dsp_lock); + } + } + + mutex_unlock(&tfa98xx_mutex); + + return change; +} + +static int tfa98xx_info_vstep(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + + int mixer_profile = tfa98xx_mixer_profile; + int profile = get_profile_id_for_sr(mixer_profile, tfa98xx->rate); + + if (profile < 0) { + pr_err("tfa98xx: tfa98xx_info_vstep: invalid profile %d (mixer_profile=%d, rate=%d)\n", profile, mixer_profile, tfa98xx->rate); + return -EINVAL; + } + + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + mutex_lock(&tfa98xx_mutex); + uinfo->count = tfa98xx_device_count; + mutex_unlock(&tfa98xx_mutex); + uinfo->value.integer.min = 0; + uinfo->value.integer.max = max(0, tfacont_get_max_vstep(tfa98xx->tfa, profile) - 1); + pr_debug("vsteps count: %d [prof=%d]\n", tfacont_get_max_vstep(tfa98xx->tfa, profile), + profile); + return 0; +} + +static int tfa98xx_get_profile(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + mutex_lock(&tfa98xx_mutex); + ucontrol->value.integer.value[0] = tfa98xx_mixer_profile; + mutex_unlock(&tfa98xx_mutex); + + return 0; +} + +static int tfa98xx_set_profile(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + int change = 0; + int new_profile; + int prof_idx; + int profile_count = tfa98xx_mixer_profiles; + int profile = tfa98xx_mixer_profile; + + if (no_start != 0) + return 0; + + new_profile = ucontrol->value.integer.value[0]; + if (new_profile == profile) + return 0; + + if ((new_profile < 0) || (new_profile >= profile_count)) { + pr_err("not existing profile (%d)\n", new_profile); + return -EINVAL; + } + + /* get the container profile for the requested sample rate */ + prof_idx = get_profile_id_for_sr(new_profile, tfa98xx->rate); + if (prof_idx < 0) { + pr_err("tfa98xx: sample rate [%d] not supported for this mixer profile [%d].\n", tfa98xx->rate, new_profile); + return 0; + } + pr_debug("selected container profile [%d]\n", prof_idx); + + /* update mixer profile */ + tfa98xx_mixer_profile = new_profile; + + /* modified by jiangtao.zeng begin. */ + /* we are updating profile index only if the device is not in operating mode, and will be start in tfa98xx_mute() later. + if the device in operating mode, we will apply new profile now. */ + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + int err; + int ready = 0; + + /* update 'real' profile (container profile) */ + tfa98xx->profile = prof_idx; + tfa98xx->vstep = tfa98xx->prof_vsteps[prof_idx]; + if (!tfa98xx->tfa->is_probus_device) { + /* Don't call tfa_dev_start() if there is no clock. */ + mutex_lock(&tfa98xx->dsp_lock); + tfa98xx_dsp_system_stable(tfa98xx->tfa, &ready); + if (ready && (tfa_dev_get_state(tfa98xx->tfa) == TFA_STATE_OPERATING)) { + /* Also re-enables the interrupts */ + err = tfa98xx_tfa_start(tfa98xx, prof_idx, tfa98xx->vstep); + if (err) { + pr_info("Write profile error: %d\n", err); + } else { + pr_debug("Changed to profile %d (vstep = %d)\n", + prof_idx, tfa98xx->vstep); + change = 1; + } + } + mutex_unlock(&tfa98xx->dsp_lock); + /* Flag DSP as invalidated as the profile change may invalidate the + * current DSP configuration. That way, further stream start can + * trigger a tfa_dev_start. + */ + tfa98xx->dsp_init = TFA98XX_DSP_INIT_INVALIDATED; + } + } + + if (change) { + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + mutex_lock(&tfa98xx->dsp_lock); + tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); + mutex_unlock(&tfa98xx->dsp_lock); + } + } + + mutex_unlock(&tfa98xx_mutex); + + /* modified by jiangtao.zeng end. */ + + return change; +} + +static int tfa98xx_info_profile(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + char profile_name[MAX_CONTROL_NAME] = { 0 }; + int count = tfa98xx_mixer_profiles, err = -1; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; + uinfo->count = 1; + uinfo->value.enumerated.items = count; + + if (uinfo->value.enumerated.item >= count) + uinfo->value.enumerated.item = count - 1; + + err = get_profile_from_list(profile_name, uinfo->value.enumerated.item); + if (err != 0) + return -EINVAL; + + strcpy(uinfo->value.enumerated.name, profile_name); + + return 0; +} + +static int tfa98xx_info_stop_ctl(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; + mutex_lock(&tfa98xx_mutex); + uinfo->count = tfa98xx_device_count; + mutex_unlock(&tfa98xx_mutex); + uinfo->value.integer.min = 0; + uinfo->value.integer.max = 1; + + return 0; +} + +static int tfa98xx_get_stop_ctl(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct tfa98xx *tfa98xx; + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = 0; + } + mutex_unlock(&tfa98xx_mutex); + + return 0; +} + +static int tfa98xx_set_stop_ctl(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct tfa98xx *tfa98xx; + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + int ready = 0; + int i = tfa98xx->tfa->dev_idx; + + pr_debug("%d: %ld\n", i, ucontrol->value.integer.value[i]); + + tfa98xx_dsp_system_stable(tfa98xx->tfa, &ready); + + if ((ucontrol->value.integer.value[i] != 0) && ready) { + cancel_delayed_work_sync(&tfa98xx->monitor_work); + + cancel_delayed_work_sync(&tfa98xx->init_work); + if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) + continue; + + mutex_lock(&tfa98xx->dsp_lock); + tfa_dev_stop(tfa98xx->tfa); + tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; + mutex_unlock(&tfa98xx->dsp_lock); + } + + ucontrol->value.integer.value[i] = 0; + } + mutex_unlock(&tfa98xx_mutex); + + return 1; +} + +static int tfa98xx_info_PAmute(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + mutex_lock(&tfa98xx_mutex); + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = tfa98xx_device_count; + uinfo->value.integer.min = TFA98XX_DEVICE_MUTE_OFF; + uinfo->value.integer.max = TFA98XX_DEVICE_MUTE_ON; + mutex_unlock(&tfa98xx_mutex); + + return 0; +} + +static int tfa98xx_get_PAmute(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct tfa98xx *tfa98xx = NULL; + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = tfa98xx->tfa_mute_mode; + } + mutex_unlock(&tfa98xx_mutex); + + return 0; +} + +static int tfa98xx_set_PAmute(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct tfa98xx *tfa98xx = NULL; + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + if (ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] != TFA98XX_DEVICE_MUTE_OFF) { + tfa98xx->tfa_mute_mode = TFA98XX_DEVICE_MUTE_ON; + } else { + tfa98xx->tfa_mute_mode = TFA98XX_DEVICE_MUTE_OFF; + } + } + mutex_unlock(&tfa98xx_mutex); + + return 1; +} + +static int tfa98xx_info_cal_ctl(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + mutex_lock(&tfa98xx_mutex); + uinfo->count = tfa98xx_device_count; + mutex_unlock(&tfa98xx_mutex); + uinfo->value.integer.min = 0; + uinfo->value.integer.max = 0xffff; /* 16 bit value */ + + return 0; +} + +static int tfa98xx_set_cal_ctl(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct tfa98xx *tfa98xx; + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + enum tfa_error err; + int i = tfa98xx->tfa->dev_idx; + + tfa98xx->cal_data = (uint16_t)ucontrol->value.integer.value[i]; + + mutex_lock(&tfa98xx->dsp_lock); + err = tfa98xx_write_re25(tfa98xx->tfa, tfa98xx->cal_data); + tfa98xx->set_mtp_cal = (err != tfa_error_ok); + if (tfa98xx->set_mtp_cal == false) { + pr_debug("Calibration value (%d) set in mtp\n", + tfa98xx->cal_data); + } + mutex_unlock(&tfa98xx->dsp_lock); + } + mutex_unlock(&tfa98xx_mutex); + + return 1; +} + +static int tfa98xx_get_cal_ctl(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct tfa98xx *tfa98xx; + + mutex_lock(&tfa98xx_mutex); + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + mutex_lock(&tfa98xx->dsp_lock); + ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = tfa_dev_mtp_get(tfa98xx->tfa, TFA_MTP_RE25_PRIM); + mutex_unlock(&tfa98xx->dsp_lock); + } + mutex_unlock(&tfa98xx_mutex); + + return 0; +} + +#ifdef TFA_NON_DSP_SOLUTION +static atomic_t g_bypass; +static atomic_t g_Tx_enable; +extern int send_tfa_cal_set_bypass(void *buf, int cmd_size); +extern int send_tfa_cal_set_tx_enable(void *buf, int cmd_size); + +/*************bypass control***************/ +static int tfa987x_algo_get_status(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t ret = 0; + + ucontrol->value.integer.value[0] = atomic_read(&g_bypass); + return ret; +} + +static int tfa987x_algo_set_status(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t ret = 0; + u8 buff[56] = {0}, *ptr = buff; + ((int32_t *)buff)[0] = ucontrol->value.integer.value[0]; + atomic_set(&g_bypass, ((int32_t *)buff)[0]); + ret = send_tfa_cal_set_bypass(ptr, 4); + return ret; +} + +static int tfa987x_algo_set_tx_enable(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t ret = 0; + u8 buff[56] = {0}, *ptr = buff; + ((int32_t *)buff)[0] = ucontrol->value.integer.value[0]; + atomic_set(&g_Tx_enable, ((int32_t *)buff)[0]); + ret = send_tfa_cal_set_tx_enable(ptr, 4); + return ret; +} + +static int tfa987x_algo_get_tx_status(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int32_t ret = 0; + + ucontrol->value.integer.value[0] = atomic_read(&g_Tx_enable); + return ret; +} + +static const char *tfa987x_algo_text[] = { + "DISABLE", "ENABLE" +}; + +static const char *tfa987x_tx_text[] = { + "DISABLE", "ENABLE" +}; + +static const struct soc_enum tfa987x_algo_enum[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tfa987x_algo_text), tfa987x_algo_text) +}; + +static const struct soc_enum tfa987x_tx_enum[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tfa987x_tx_text), tfa987x_tx_text) +}; + +const struct snd_kcontrol_new tfa987x_algo_controls[] = { + SOC_ENUM_EXT("TFA987X_ALGO_STATUS", tfa987x_algo_enum[0], tfa987x_algo_get_status, tfa987x_algo_set_status), + SOC_ENUM_EXT("TFA987X_TX_ENABLE", tfa987x_tx_enum[0], tfa987x_algo_get_tx_status, tfa987x_algo_set_tx_enable) +}; +#endif + +static int tfa98xx_create_controls(struct tfa98xx *tfa98xx) +{ + int prof, nprof, mix_index = 0; + int nr_controls = 0, id = 0; + char *name; + struct tfa98xx_baseprofile *bprofile; + int ret = 0; + + /* Create the following controls: + * - enum control to select the active profile + * - one volume control for each profile hosting a vstep + * - Stop control on TFA1 devices + */ + + nr_controls = 2; /* Profile and stop control */ + + if (tfa98xx->flags & TFA98XX_FLAG_CALIBRATION_CTL) + nr_controls += 1; /* calibration */ + + /* allocate the tfa98xx_controls base on the nr of profiles */ + nprof = tfa_cnt_get_dev_nprof(tfa98xx->tfa); + for (prof = 0; prof < nprof; prof++) { + if (tfacont_get_max_vstep(tfa98xx->tfa, prof)) + nr_controls++; /* Playback Volume control */ + } + if (tfa98xx->tfa->tfa_family == 2) { + nr_controls++; /* Playback Volume control */ + } + + tfa98xx_controls = devm_kzalloc(tfa98xx->codec->dev, + nr_controls * sizeof(tfa98xx_controls[0]), GFP_KERNEL); + if (!tfa98xx_controls) + return -ENOMEM; + + /* Create a mixer item for selecting the active profile */ + name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); + if (!name) + return -ENOMEM; + scnprintf(name, MAX_CONTROL_NAME, "%s Profile", tfa98xx->fw.name); + tfa98xx_controls[mix_index].name = name; + tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; + tfa98xx_controls[mix_index].info = tfa98xx_info_profile; + tfa98xx_controls[mix_index].get = tfa98xx_get_profile; + tfa98xx_controls[mix_index].put = tfa98xx_set_profile; + // tfa98xx_controls[mix_index].private_value = profs; /* save number of profiles */ + mix_index++; + /* add new mixer control item 'SmartPA Mute' for MAX2 device. */ + if (tfa98xx->tfa->tfa_family == 2) { + tfa98xx_controls[mix_index].name = "SmartPA Mute"; + tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; + tfa98xx_controls[mix_index].info = tfa98xx_info_PAmute; + tfa98xx_controls[mix_index].get = tfa98xx_get_PAmute; + tfa98xx_controls[mix_index].put = tfa98xx_set_PAmute; + mix_index++; + } + + /* create mixer items for each profile that has volume */ + for (prof = 0; prof < nprof; prof++) { + /* create an new empty profile */ + bprofile = devm_kzalloc(tfa98xx->codec->dev, sizeof(*bprofile), GFP_KERNEL); + if (!bprofile) + return -ENOMEM; + + bprofile->len = 0; + bprofile->item_id = -1; + INIT_LIST_HEAD(&bprofile->list); + + /* copy profile name into basename until the . */ + get_profile_basename(bprofile->basename, tfa_cont_profile_name(tfa98xx, prof)); + bprofile->len = strlen(bprofile->basename); + + /* + * search the profile list for a profile with basename, if it is not found then + * add it to the list and add a new mixer control (if it has vsteps) + * also, if it is a calibration profile, do not add it to the list + */ + if ((is_profile_in_list(bprofile->basename, bprofile->len) == 0) && + is_calibration_profile(tfa_cont_profile_name(tfa98xx, prof)) == 0) { + /* the profile is not present, add it to the list */ + list_add(&bprofile->list, &profile_list); + bprofile->item_id = id++; + + pr_debug("profile added [%d]: %s\n", bprofile->item_id, bprofile->basename); + + if (tfacont_get_max_vstep(tfa98xx->tfa, prof)) { + name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); + if (!name) + return -ENOMEM; + + scnprintf(name, MAX_CONTROL_NAME, "%s %s Playback Volume", + tfa98xx->fw.name, bprofile->basename); + + tfa98xx_controls[mix_index].name = name; + tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; + tfa98xx_controls[mix_index].info = tfa98xx_info_vstep; + tfa98xx_controls[mix_index].get = tfa98xx_get_vstep; + tfa98xx_controls[mix_index].put = tfa98xx_set_vstep; + tfa98xx_controls[mix_index].private_value = bprofile->item_id; /* save profile index */ + mix_index++; + } + } + + /* look for the basename profile in the list of mixer profiles and add the + container profile index to the supported samplerates of this mixer profile */ + add_sr_to_profile(tfa98xx, bprofile->basename, bprofile->len, prof); + } + + /* set the number of user selectable profiles in the mixer */ + tfa98xx_mixer_profiles = id; + + /* Create a mixer item for stop control on TFA1 */ + name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); + if (!name) + return -ENOMEM; + + scnprintf(name, MAX_CONTROL_NAME, "%s Stop", tfa98xx->fw.name); + tfa98xx_controls[mix_index].name = name; + tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; + tfa98xx_controls[mix_index].info = tfa98xx_info_stop_ctl; + tfa98xx_controls[mix_index].get = tfa98xx_get_stop_ctl; + tfa98xx_controls[mix_index].put = tfa98xx_set_stop_ctl; + mix_index++; + + if (tfa98xx->flags & TFA98XX_FLAG_CALIBRATION_CTL) { + name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); + if (!name) + return -ENOMEM; + + scnprintf(name, MAX_CONTROL_NAME, "%s Calibration", tfa98xx->fw.name); + tfa98xx_controls[mix_index].name = name; + tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; + tfa98xx_controls[mix_index].info = tfa98xx_info_cal_ctl; + tfa98xx_controls[mix_index].get = tfa98xx_get_cal_ctl; + tfa98xx_controls[mix_index].put = tfa98xx_set_cal_ctl; + mix_index++; + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + return snd_soc_add_component_controls(tfa98xx->codec, + tfa98xx_controls, mix_index); +#else + return snd_soc_add_codec_controls(tfa98xx->codec, + tfa98xx_controls, mix_index); +#endif + +#ifdef TFA_NON_DSP_SOLUTION + ret = snd_soc_add_codec_controls(tfa98xx->codec, tfa987x_algo_controls, ARRAY_SIZE(tfa987x_algo_controls)); + pr_info("create tfa987x_algo_controls ret=%d", ret); +#endif + if (!ret) { + ret = snd_soc_add_codec_controls(tfa98xx->codec, + nxp_spk_id_controls, ARRAY_SIZE(nxp_spk_id_controls)); + } + + return ret; +} + +static void *tfa98xx_devm_kstrdup(struct device *dev, char *buf) +{ + char *str = devm_kzalloc(dev, strlen(buf) + 1, GFP_KERNEL); + + if (!str) + return str; + memcpy(str, buf, strlen(buf)); + return str; +} + +static int tfa98xx_append_i2c_address(struct device *dev, + struct i2c_client *i2c, + struct snd_soc_dapm_widget *widgets, + int num_widgets, + struct snd_soc_dai_driver *dai_drv, + int num_dai) +{ + char buf[50]; + int i; + int i2cbus = i2c->adapter->nr; + int addr = i2c->addr; + + if (dai_drv && num_dai > 0) + for (i = 0; i < num_dai; i++) { + memset(buf, 0x00, sizeof(buf)); + snprintf(buf, 50, "%s-%x-%x", dai_drv[i].name, i2cbus, + addr); + dai_drv[i].name = tfa98xx_devm_kstrdup(dev, buf); + + memset(buf, 0x00, sizeof(buf)); + snprintf(buf, 50, "%s-%x-%x", + dai_drv[i].playback.stream_name, + i2cbus, addr); + dai_drv[i].playback.stream_name = tfa98xx_devm_kstrdup(dev, buf); + + memset(buf, 0x00, sizeof(buf)); + snprintf(buf, 50, "%s-%x-%x", + dai_drv[i].capture.stream_name, + i2cbus, addr); + dai_drv[i].capture.stream_name = tfa98xx_devm_kstrdup(dev, buf); + } + + /* the idea behind this is convert: + * SND_SOC_DAPM_AIF_IN("AIF IN", "AIF Playback", 0, SND_SOC_NOPM, 0, 0), + * into: + * SND_SOC_DAPM_AIF_IN("AIF IN", "AIF Playback-2-36", 0, SND_SOC_NOPM, 0, 0), + */ + if (widgets && num_widgets > 0) + for (i = 0; i < num_widgets; i++) { + if (!widgets[i].sname) + continue; + if ((widgets[i].id == snd_soc_dapm_aif_in) + || (widgets[i].id == snd_soc_dapm_aif_out)) { + snprintf(buf, 50, "%s-%x-%x", widgets[i].sname, + i2cbus, addr); + widgets[i].sname = tfa98xx_devm_kstrdup(dev, buf); + } + } + + return 0; +} + +static struct snd_soc_dapm_widget tfa98xx_dapm_widgets_common[] = { + /* Stream widgets */ + SND_SOC_DAPM_AIF_IN("AIF IN", "AIF Playback", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_OUT("AIF OUT", "AIF Capture", 0, SND_SOC_NOPM, 0, 0), + + SND_SOC_DAPM_OUTPUT("OUTL"), + SND_SOC_DAPM_INPUT("AEC Loopback"), +}; + +static struct snd_soc_dapm_widget tfa98xx_dapm_widgets_stereo[] = { + SND_SOC_DAPM_OUTPUT("OUTR"), +}; + +static struct snd_soc_dapm_widget tfa98xx_dapm_widgets_saam[] = { + SND_SOC_DAPM_INPUT("SAAM MIC"), +}; + +static struct snd_soc_dapm_widget tfa9888_dapm_inputs[] = { + SND_SOC_DAPM_INPUT("DMIC1"), + SND_SOC_DAPM_INPUT("DMIC2"), + SND_SOC_DAPM_INPUT("DMIC3"), + SND_SOC_DAPM_INPUT("DMIC4"), +}; + +static const struct snd_soc_dapm_route tfa98xx_dapm_routes_common[] = { + { "OUTL", NULL, "AIF IN" }, + { "AIF OUT", NULL, "AEC Loopback" }, +}; + +static const struct snd_soc_dapm_route tfa98xx_dapm_routes_saam[] = { + { "AIF OUT", NULL, "SAAM MIC" }, +}; + +static const struct snd_soc_dapm_route tfa98xx_dapm_routes_stereo[] = { + { "OUTR", NULL, "AIF IN" }, +}; + +static const struct snd_soc_dapm_route tfa9888_input_dapm_routes[] = { + { "AIF OUT", NULL, "DMIC1" }, + { "AIF OUT", NULL, "DMIC2" }, + { "AIF OUT", NULL, "DMIC3" }, + { "AIF OUT", NULL, "DMIC4" }, +}; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) +static struct snd_soc_dapm_context *snd_soc_codec_get_dapm(struct snd_soc_codec *codec) +{ + return &codec->dapm; +} +#endif + +static void tfa98xx_add_widgets(struct tfa98xx *tfa98xx) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(tfa98xx->codec); +#else + struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(tfa98xx->codec); +#endif + struct snd_soc_dapm_widget *widgets; + unsigned int num_dapm_widgets = ARRAY_SIZE(tfa98xx_dapm_widgets_common); + + widgets = devm_kzalloc(&tfa98xx->i2c->dev, + sizeof(struct snd_soc_dapm_widget) * + ARRAY_SIZE(tfa98xx_dapm_widgets_common), + GFP_KERNEL); + if (!widgets) + return; + memcpy(widgets, tfa98xx_dapm_widgets_common, + sizeof(struct snd_soc_dapm_widget) * + ARRAY_SIZE(tfa98xx_dapm_widgets_common)); + + tfa98xx_append_i2c_address(&tfa98xx->i2c->dev, + tfa98xx->i2c, + widgets, + num_dapm_widgets, + NULL, + 0); + + snd_soc_dapm_new_controls(dapm, widgets, + ARRAY_SIZE(tfa98xx_dapm_widgets_common)); + snd_soc_dapm_add_routes(dapm, tfa98xx_dapm_routes_common, + ARRAY_SIZE(tfa98xx_dapm_routes_common)); + + if (tfa98xx->flags & TFA98XX_FLAG_STEREO_DEVICE) { + snd_soc_dapm_new_controls(dapm, tfa98xx_dapm_widgets_stereo, + ARRAY_SIZE(tfa98xx_dapm_widgets_stereo)); + snd_soc_dapm_add_routes(dapm, tfa98xx_dapm_routes_stereo, + ARRAY_SIZE(tfa98xx_dapm_routes_stereo)); + } + + if (tfa98xx->flags & TFA98XX_FLAG_MULTI_MIC_INPUTS) { + snd_soc_dapm_new_controls(dapm, tfa9888_dapm_inputs, + ARRAY_SIZE(tfa9888_dapm_inputs)); + snd_soc_dapm_add_routes(dapm, tfa9888_input_dapm_routes, + ARRAY_SIZE(tfa9888_input_dapm_routes)); + } + + if (tfa98xx->flags & TFA98XX_FLAG_SAAM_AVAILABLE) { + snd_soc_dapm_new_controls(dapm, tfa98xx_dapm_widgets_saam, + ARRAY_SIZE(tfa98xx_dapm_widgets_saam)); + snd_soc_dapm_add_routes(dapm, tfa98xx_dapm_routes_saam, + ARRAY_SIZE(tfa98xx_dapm_routes_saam)); + } +} + +/* I2C wrapper functions */ +enum Tfa98xx_Error tfa98xx_write_register16(struct tfa_device *tfa, + unsigned char subaddress, + unsigned short value) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + struct tfa98xx *tfa98xx; + int ret; + int retries = I2C_RETRIES; + + if (tfa == NULL) { + pr_err("No device available\n"); + return Tfa98xx_Error_Fail; + } + + tfa98xx = (struct tfa98xx *)tfa->data; + if (!tfa98xx || !tfa98xx->regmap) { + pr_err("No tfa98xx regmap available\n"); + return Tfa98xx_Error_Bad_Parameter; + } +retry: + ret = regmap_write(tfa98xx->regmap, subaddress, value); + if (ret < 0) { + pr_warn("i2c error, retries left: %d\n", retries); + if (retries) { + retries--; + msleep(I2C_RETRY_DELAY); + goto retry; + } + return Tfa98xx_Error_Fail; + } + if (tfa98xx_kmsg_regs) + dev_dbg(&tfa98xx->i2c->dev, " WR reg=0x%02x, val=0x%04x %s\n", + subaddress, value, + ret < 0 ? "Error!!" : ""); + + if (tfa98xx_ftrace_regs) + tfa98xx_trace_printk("\tWR reg=0x%02x, val=0x%04x %s\n", + subaddress, value, + ret < 0 ? "Error!!" : ""); + return error; +} + +enum Tfa98xx_Error tfa98xx_read_register16(struct tfa_device *tfa, + unsigned char subaddress, + unsigned short *val) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + struct tfa98xx *tfa98xx; + unsigned int value; + int retries = I2C_RETRIES; + int ret; + + if (tfa == NULL) { + pr_err("No device available\n"); + return Tfa98xx_Error_Fail; + } + + tfa98xx = (struct tfa98xx *)tfa->data; + if (!tfa98xx || !tfa98xx->regmap) { + pr_err("No tfa98xx regmap available\n"); + return Tfa98xx_Error_Bad_Parameter; + } +retry: + ret = regmap_read(tfa98xx->regmap, subaddress, &value); + if (ret < 0) { + pr_warn("i2c error at subaddress 0x%x, retries left: %d\n", subaddress, retries); + if (retries) { + retries--; + msleep(I2C_RETRY_DELAY); + goto retry; + } + return Tfa98xx_Error_Fail; + } + *val = value & 0xffff; + + if (tfa98xx_kmsg_regs) + dev_dbg(&tfa98xx->i2c->dev, "RD reg=0x%02x, val=0x%04x %s\n", + subaddress, *val, + ret < 0 ? "Error!!" : ""); + if (tfa98xx_ftrace_regs) + tfa98xx_trace_printk("\tRD reg=0x%02x, val=0x%04x %s\n", + subaddress, *val, + ret < 0 ? "Error!!" : ""); + + return error; +} + + +/* + * init external dsp + */ +enum Tfa98xx_Error + tfa98xx_init_dsp(struct tfa_device *tfa) +{ + return Tfa98xx_Error_Not_Supported; +} + +int tfa98xx_get_dsp_status(struct tfa_device *tfa) +{ + return 0; +} + +/* + * write external dsp message + */ +enum Tfa98xx_Error + tfa98xx_write_dsp(struct tfa_device *tfa, int num_bytes, const char *command_buffer) +{ + return Tfa98xx_Error_Not_Supported; +} + +/* + * read external dsp message + */ +enum Tfa98xx_Error + tfa98xx_read_dsp(struct tfa_device *tfa, int num_bytes, unsigned char *result_buffer) +{ + return Tfa98xx_Error_Not_Supported; +} +/* + * write/read external dsp message + */ +enum Tfa98xx_Error + tfa98xx_writeread_dsp(struct tfa_device *tfa, int command_length, void *command_buffer, + int result_length, void *result_buffer) +{ + return Tfa98xx_Error_Not_Supported; +} + +enum Tfa98xx_Error tfa98xx_read_data(struct tfa_device *tfa, + unsigned char reg, + int len, unsigned char value[]) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + struct tfa98xx *tfa98xx; + struct i2c_client *tfa98xx_client; + int err; + int tries = 0; + unsigned char *reg_buf = NULL; + struct i2c_msg msgs[] = { + { + .flags = 0, + .len = 1, + .buf = NULL, + }, { + .flags = I2C_M_RD, + .len = len, + .buf = value, + }, + }; + reg_buf = (unsigned char *)kmalloc(sizeof(reg), GFP_DMA); //GRP_KERNEL also works, + if (!reg_buf) { + return -ENOMEM; + } + + *reg_buf = reg; + msgs[0].buf = reg_buf; + + if (tfa == NULL) { + pr_err("No device available\n"); + return Tfa98xx_Error_Fail; + } + + tfa98xx = (struct tfa98xx *)tfa->data; + if (tfa98xx->i2c) { + tfa98xx_client = tfa98xx->i2c; + msgs[0].addr = tfa98xx_client->addr; + msgs[1].addr = tfa98xx_client->addr; + + do { + err = i2c_transfer(tfa98xx_client->adapter, msgs, + ARRAY_SIZE(msgs)); + if (err != ARRAY_SIZE(msgs)) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != ARRAY_SIZE(msgs)) && (++tries < I2C_RETRIES)); + + if (err != ARRAY_SIZE(msgs)) { + dev_err(&tfa98xx_client->dev, "read transfer error %d\n", + err); + error = Tfa98xx_Error_Fail; + } + + if (tfa98xx_kmsg_regs) + dev_dbg(&tfa98xx_client->dev, "RD-DAT reg=0x%02x, len=%d\n", + reg, len); + if (tfa98xx_ftrace_regs) + tfa98xx_trace_printk("\t\tRD-DAT reg=0x%02x, len=%d\n", + reg, len); + } else { + pr_err("No device available\n"); + error = Tfa98xx_Error_Fail; + } + kfree(reg_buf); + return error; +} + +enum Tfa98xx_Error tfa98xx_write_raw(struct tfa_device *tfa, + int len, + const unsigned char data[]) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + struct tfa98xx *tfa98xx; + int ret; + int retries = I2C_RETRIES; + + + if (tfa == NULL) { + pr_err("No device available\n"); + return Tfa98xx_Error_Fail; + } + + tfa98xx = (struct tfa98xx *)tfa->data; + +retry: + ret = i2c_master_send(tfa98xx->i2c, data, len); + if (ret < 0) { + pr_warn("i2c error, retries left: %d\n", retries); + if (retries) { + retries--; + msleep(I2C_RETRY_DELAY); + goto retry; + } + } + + if (ret == len) { + if (tfa98xx_kmsg_regs) + dev_dbg(&tfa98xx->i2c->dev, " WR-RAW len=%d\n", len); + if (tfa98xx_ftrace_regs) + tfa98xx_trace_printk("\t\tWR-RAW len=%d\n", len); + return Tfa98xx_Error_Ok; + } + pr_err(" WR-RAW (len=%d) Error I2C send size mismatch %d\n", len, ret); + error = Tfa98xx_Error_Fail; + + return error; +} + +/* Interrupts management */ + +static void tfa98xx_interrupt_enable_tfa2(struct tfa98xx *tfa98xx, bool enable) +{ + /* Only for 0x72 we need to enable NOCLK interrupts */ + if (tfa98xx->flags & TFA98XX_FLAG_REMOVE_PLOP_NOISE) + tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_stnoclk, enable); + + if (tfa98xx->flags & TFA98XX_FLAG_LP_MODES) { + tfa_irq_ena(tfa98xx->tfa, 36, enable); /* FIXME: IELP0 does not excist for 9912 */ + tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_stclpr, enable); + } +} + +/* Check if tap-detection can and shall be enabled. + * Configure SPK interrupt accordingly or setup polling mode + * Tap-detection shall be active if: + * - the service is enabled (tapdet_open), AND + * - the current profile is a tap-detection profile + * On TFA1 familiy of devices, activating tap-detection means enabling the SPK + * interrupt if available. + * We also update the tapdet_enabled and tapdet_poll variables. + */ +static void tfa98xx_tapdet_check_update(struct tfa98xx *tfa98xx) +{ + unsigned int enable = false; + + /* Support tap-detection on TFA1 family of devices */ + if ((tfa98xx->flags & TFA98XX_FLAG_TAPDET_AVAILABLE) == 0) + return; + + if (tfa98xx->tapdet_open && + (tfa98xx->tapdet_profiles & (1 << tfa98xx->profile))) + enable = true; + + if (!gpio_is_valid(tfa98xx->irq_gpio)) { + /* interrupt not available, setup polling mode */ + tfa98xx->tapdet_poll = true; + if (enable) + queue_delayed_work(tfa98xx->tfa98xx_wq, + &tfa98xx->tapdet_work, HZ / 10); + else + cancel_delayed_work_sync(&tfa98xx->tapdet_work); + dev_dbg(tfa98xx->codec->dev, + "Polling for tap-detection: %s (%d; 0x%x, %d)\n", + enable ? "enabled" : "disabled", + tfa98xx->tapdet_open, tfa98xx->tapdet_profiles, + tfa98xx->profile); + + } else { + dev_dbg(tfa98xx->codec->dev, + "Interrupt for tap-detection: %s (%d; 0x%x, %d)\n", + enable ? "enabled" : "disabled", + tfa98xx->tapdet_open, tfa98xx->tapdet_profiles, + tfa98xx->profile); + /* enabled interrupt */ + tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_sttapdet, enable); + } + + /* check disabled => enabled transition to clear pending events */ + if (!tfa98xx->tapdet_enabled && enable) { + /* clear pending event if any */ + tfa_irq_clear(tfa98xx->tfa, tfa9912_irq_sttapdet); + } + + if (!tfa98xx->tapdet_poll) + tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_sttapdet, 1); /* enable again */ +} + +/* global enable / disable interrupts */ +static void tfa98xx_interrupt_enable(struct tfa98xx *tfa98xx, bool enable) +{ + if (tfa98xx->flags & TFA98XX_FLAG_SKIP_INTERRUPTS) + return; + + if (tfa98xx->tfa->tfa_family == 2) + tfa98xx_interrupt_enable_tfa2(tfa98xx, enable); +} + +/* Firmware management */ +static void tfa98xx_container_loaded(const struct firmware *cont, void *context) +{ + TfaContainer_t *container; + struct tfa98xx *tfa98xx = context; + enum tfa_error tfa_err; + int container_size; + int ret; + + tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_FAIL; + + if (!cont) { + pr_err("Failed to read %s\n", fw_name); + return; + } + + pr_debug("loaded %s - size: %zu\n", fw_name, cont->size); + + if (tfa98xx_container == NULL) { + container = kzalloc(cont->size, GFP_KERNEL); + if (container == NULL) { + pr_err("Error allocating memory\n"); + return; + } + + container_size = cont->size; + memcpy(container, cont->data, container_size); + + pr_debug("%.2s%.2s\n", container->version, container->subversion); + pr_debug("%.8s\n", container->customer); + pr_debug("%.8s\n", container->application); + pr_debug("%.8s\n", container->type); + pr_debug("%d ndev\n", container->ndev); + pr_debug("%d nprof\n", container->nprof); + + tfa_err = tfa_load_cnt(container, container_size); + if (tfa_err != tfa_error_ok) { + kfree(container); + dev_err(tfa98xx->dev, "Cannot load container file, aborting\n"); + return; + } + + tfa98xx_container = container; + } else { + pr_debug("container file already loaded...\n"); + container = tfa98xx_container; + } + + tfa98xx->tfa->cnt = container; + + /* + i2c transaction limited to 64k + (Documentation/i2c/writing-clients) + */ + tfa98xx->tfa->buffer_size = 65536; + + if (tfa_dev_probe(tfa98xx->i2c->addr, tfa98xx->tfa) != 0) { + dev_err(tfa98xx->dev, "Failed to probe TFA98xx @ 0x%.2x\n", tfa98xx->i2c->addr); + return; + } + + /* once the device without internal DSP, we should be using DSP HAL to send msg to host DSP. */ + if (tfa98xx->tfa->is_probus_device == 1) { + tfa98xx->tfa->has_msg = 1; + } else { + tfa98xx->tfa->has_msg = 0; + } + + tfa98xx->tfa->dev_idx = tfa_cont_get_idx(tfa98xx->tfa); + if (tfa98xx->tfa->dev_idx < 0) { + dev_err(tfa98xx->dev, "Failed to find TFA98xx @ 0x%.2x in container file\n", tfa98xx->i2c->addr); + return; + } + + /* Enable debug traces */ + tfa98xx->tfa->verbose = trace_level & 1; + + /* prefix is the application name from the cnt */ + tfa_cnt_get_app_name(tfa98xx->tfa, tfa98xx->fw.name); + + /* set default profile/vstep */ + tfa98xx->profile = 0; + tfa98xx->vstep = 0; + + /* Override default profile if requested */ + if (strcmp(dflt_prof_name, "")) { + unsigned int i; + int nprof = tfa_cnt_get_dev_nprof(tfa98xx->tfa); + + for (i = 0; i < nprof; i++) { + if (strcmp(tfa_cont_profile_name(tfa98xx, i), + dflt_prof_name) == 0) { + tfa98xx->profile = i; + dev_info(tfa98xx->dev, + "changing default profile to %s (%d)\n", + dflt_prof_name, tfa98xx->profile); + break; + } + } + if (i >= nprof) + dev_info(tfa98xx->dev, + "Default profile override failed (%s profile not found)\n", + dflt_prof_name); + } + + tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_OK; + pr_debug("Firmware init complete\n"); + + if (no_start != 0) + return; + + /* Only controls for master device */ + if (tfa98xx->tfa->dev_idx == 0) + tfa98xx_create_controls(tfa98xx); + + tfa98xx_inputdev_check_register(tfa98xx); + + if (tfa_is_cold(tfa98xx->tfa) == 0) { + pr_debug("Warning: device 0x%.2x is still warm\n", tfa98xx->i2c->addr); + tfa_reset(tfa98xx->tfa); + } + + /* Preload settings using internal clock on TFA2 */ + if ((tfa98xx->tfa->tfa_family == 2) && (tfa98xx->tfa->is_probus_device == 0)) { + mutex_lock(&tfa98xx->dsp_lock); + ret = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); + if (ret == Tfa98xx_Error_Not_Supported) + tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_FAIL; + + /* we should be power-down device when parameter is loaded. */ + tfa_dev_stop(tfa98xx->tfa); + tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; + + mutex_unlock(&tfa98xx->dsp_lock); + } + tfa98xx_interrupt_enable(tfa98xx, true); +} + +static int tfa98xx_load_container(struct tfa98xx *tfa98xx) +{ + const struct firmware *firmware; + int rc = 0; + + tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_PENDING; + mutex_lock(&tfa98xx_mutex); + rc = request_firmware(&firmware, fw_name, tfa98xx->dev); + if (rc < 0) { + mutex_unlock(&tfa98xx_mutex); + return rc; + } + tfa98xx_container_loaded(firmware, tfa98xx); + release_firmware(firmware); + mutex_unlock(&tfa98xx_mutex); + + return rc; +} + + +static void tfa98xx_tapdet(struct tfa98xx *tfa98xx) +{ + unsigned int tap_pattern; + int btn; + + /* check tap pattern (BTN_0 is "error" wrong tap indication */ + tap_pattern = tfa_get_tap_pattern(tfa98xx->tfa); + switch (tap_pattern) { + case 0xffffffff: + pr_info("More than 4 taps detected! (flagTapPattern = -1)\n"); + btn = BTN_0; + break; + case 0xfffffffe: + case 0xfe: + pr_info("Illegal tap detected!\n"); + btn = BTN_0; + break; + case 0: + pr_info("Unrecognized pattern! (flagTapPattern = 0)\n"); + btn = BTN_0; + break; + default: + pr_info("Detected pattern: %d\n", tap_pattern); + btn = BTN_0 + tap_pattern; + break; + } + + input_report_key(tfa98xx->input, btn, 1); + input_report_key(tfa98xx->input, btn, 0); + input_sync(tfa98xx->input); + + /* acknowledge event done by clearing interrupt */ + +} + +static void tfa98xx_tapdet_work(struct work_struct *work) +{ + struct tfa98xx *tfa98xx; + + //TODO check is this is still needed for tap polling + tfa98xx = container_of(work, struct tfa98xx, tapdet_work.work); + + if (tfa_irq_get(tfa98xx->tfa, tfa9912_irq_sttapdet)) + tfa98xx_tapdet(tfa98xx); + + queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->tapdet_work, HZ / 10); +} +static void tfa98xx_nmode_update_work(struct work_struct *work) +{ + struct tfa98xx *tfa98xx; + + //MCH_TO_TEST, checking if noise mode update is required or not + tfa98xx = container_of(work, struct tfa98xx, nmodeupdate_work.work); + mutex_lock(&tfa98xx->dsp_lock); + tfa_adapt_noisemode(tfa98xx->tfa); + mutex_unlock(&tfa98xx->dsp_lock); + queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->nmodeupdate_work, 5 * HZ); +} +static void tfa98xx_monitor(struct work_struct *work) +{ +#if 0 + struct tfa98xx *tfa98xx; + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + tfa98xx = container_of(work, struct tfa98xx, monitor_work.work); + + /* Check for tap-detection - bypass monitor if it is active */ + if (!tfa98xx->input) { + mutex_lock(&tfa98xx->dsp_lock); + error = tfa_status(tfa98xx->tfa); + mutex_unlock(&tfa98xx->dsp_lock); + if (error == Tfa98xx_Error_DSP_not_running) { + if (tfa98xx->dsp_init == TFA98XX_DSP_INIT_DONE) { + tfa98xx->dsp_init = TFA98XX_DSP_INIT_RECOVER; + queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->init_work, 0); + } + } + } + + /* reschedule */ + queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->monitor_work, 5 * HZ); +#endif +} + +static void tfa98xx_dsp_init(struct tfa98xx *tfa98xx) +{ + int ret; + bool failed = false; + bool reschedule = false; + bool sync = false; + + if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) { + pr_debug("%s Skipping tfa_dev_start (no FW: %d)\n", __func__, tfa98xx->dsp_fw_state); + return; + } + + if (tfa98xx->dsp_init == TFA98XX_DSP_INIT_DONE) { + pr_debug("%s Stream already started, skipping DSP power-on\n", __func__); + return; + } + + mutex_lock(&tfa98xx->dsp_lock); + + tfa98xx->dsp_init = TFA98XX_DSP_INIT_PENDING; + + pr_debug("[NXP] %s init_count=%d\n", __func__, tfa98xx->init_count); + if (tfa98xx->init_count < TF98XX_MAX_DSP_START_TRY_COUNT) { + /* directly try to start DSP */ + ret = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); + if (ret == Tfa98xx_Error_Not_Supported) { + tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_FAIL; + dev_err(&tfa98xx->i2c->dev, "Failed starting device\n"); + failed = true; + } else if (ret != Tfa98xx_Error_Ok) { + /* It may fail as we may not have a valid clock at that + * time, so re-schedule and re-try later. + */ + dev_err(&tfa98xx->i2c->dev, + "tfa_dev_start failed! (err %d) - %d\n", + ret, tfa98xx->init_count); + reschedule = true; + } else { + sync = true; + + /* Subsystem ready, tfa init complete */ + tfa98xx->dsp_init = TFA98XX_DSP_INIT_DONE; + dev_dbg(&tfa98xx->i2c->dev, + "tfa_dev_start success (%d)\n", + tfa98xx->init_count); + /* cancel other pending init works */ + cancel_delayed_work(&tfa98xx->init_work); + tfa98xx->init_count = 0; + } + } else { + /* exceeded max number ot start tentatives, cancel start */ + dev_err(&tfa98xx->i2c->dev, + "Failed starting device (%d)\n", + tfa98xx->init_count); + failed = true; + } + if (reschedule) { + /* reschedule this init work for later */ + queue_delayed_work(tfa98xx->tfa98xx_wq, + &tfa98xx->init_work, + msecs_to_jiffies(5)); + tfa98xx->init_count++; + } + if (failed) { + tfa98xx->dsp_init = TFA98XX_DSP_INIT_FAIL; + /* cancel other pending init works */ + cancel_delayed_work(&tfa98xx->init_work); + tfa98xx->init_count = 0; + } + mutex_unlock(&tfa98xx->dsp_lock); + + if (sync) { + /* check if all devices have started */ + bool do_sync; + + mutex_lock(&tfa98xx_mutex); + + if (tfa98xx_sync_count < tfa98xx_device_count) + tfa98xx_sync_count++; + + do_sync = (tfa98xx_sync_count >= tfa98xx_device_count); + mutex_unlock(&tfa98xx_mutex); + + /* when all devices have started then unmute */ + if (do_sync) { + tfa98xx_sync_count = 0; + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + mutex_lock(&tfa98xx->dsp_lock); + tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); + + /* + * start monitor thread to check IC status bit + * periodically, and re-init IC to recover if + * needed. + */ + if (tfa98xx->tfa->tfa_family == 1) + queue_delayed_work(tfa98xx->tfa98xx_wq, + &tfa98xx->monitor_work, + 1 * HZ); + mutex_unlock(&tfa98xx->dsp_lock); + } + + } + } + + + return; +} + + +static void tfa98xx_dsp_init_work(struct work_struct *work) +{ + struct tfa98xx *tfa98xx = container_of(work, struct tfa98xx, init_work.work); + + tfa98xx_dsp_init(tfa98xx); +} + +static void tfa98xx_interrupt(struct work_struct *work) +{ + struct tfa98xx *tfa98xx = container_of(work, struct tfa98xx, interrupt_work.work); + + if (tfa98xx->flags & TFA98XX_FLAG_TAPDET_AVAILABLE) { + /* check for tap interrupt */ + if (tfa_irq_get(tfa98xx->tfa, tfa9912_irq_sttapdet)) { + tfa98xx_tapdet(tfa98xx); + + /* clear interrupt */ + tfa_irq_clear(tfa98xx->tfa, tfa9912_irq_sttapdet); + } + } /* TFA98XX_FLAG_TAPDET_AVAILABLE */ + + if (tfa98xx->flags & TFA98XX_FLAG_REMOVE_PLOP_NOISE) { + int start_triggered; + + mutex_lock(&tfa98xx->dsp_lock); + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ + start_triggered = tfa_plop_noise_interrupt(tfa98xx->tfa, tfa98xx->profile, tfa98xx->vstep, tfa98xx->pcm_format); + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ + /* Only enable when the return value is 1, otherwise the interrupt is triggered twice */ + if (start_triggered) + tfa98xx_interrupt_enable(tfa98xx, true); + mutex_unlock(&tfa98xx->dsp_lock); + } /* TFA98XX_FLAG_REMOVE_PLOP_NOISE */ + + if (tfa98xx->flags & TFA98XX_FLAG_LP_MODES) { + tfa_lp_mode_interrupt(tfa98xx->tfa); + } /* TFA98XX_FLAG_LP_MODES */ + + /* unmask interrupts masked in IRQ handler */ + tfa_irq_unmask(tfa98xx->tfa); +} + +static int tfa98xx_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec = dai->component; + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else + struct snd_soc_codec *codec = dai->codec; + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + unsigned int sr; + int len, prof, nprof, idx = 0; + char *basename; + + /* + * Support CODEC to CODEC links, + * these are called with a NULL runtime pointer. + */ + if (!substream->runtime) + return 0; + + if (pcm_no_constraint != 0) + return 0; + + if (no_start != 0) + return 0; + + if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) { + dev_info(codec->dev, "Container file not loaded\n"); + return -EINVAL; + } + + basename = kzalloc(MAX_CONTROL_NAME, GFP_KERNEL); + if (!basename) + return -ENOMEM; + + /* copy profile name into basename until the . */ + get_profile_basename(basename, tfa_cont_profile_name(tfa98xx, tfa98xx->profile)); + len = strlen(basename); + + /* loop over all profiles and get the supported samples rate(s) from + * the profiles with the same basename + */ + nprof = tfa_cnt_get_dev_nprof(tfa98xx->tfa); + tfa98xx->rate_constraint.list = &tfa98xx->rate_constraint_list[0]; + tfa98xx->rate_constraint.count = 0; + for (prof = 0; prof < nprof; prof++) { + if (strncmp(basename, tfa_cont_profile_name(tfa98xx, prof), len) == 0) { + /* Check which sample rate is supported with current profile, + * and enforce this. + */ + sr = tfa98xx_get_profile_sr(tfa98xx->tfa, prof); + if (!sr) + dev_info(codec->dev, "Unable to identify supported sample rate\n"); + + if (tfa98xx->rate_constraint.count >= TFA98XX_NUM_RATES) { + dev_err(codec->dev, "too many sample rates\n"); + } else { + tfa98xx->rate_constraint_list[idx++] = sr; + tfa98xx->rate_constraint.count += 1; + } + } + } + + kfree(basename); + +/* as QUALCOMM FAE suggested, we don't need to calling 'snd_pcm_hw_constraint_list' on QUALCOMM platform. */ + return 0; +} + +static int tfa98xx_set_dai_sysclk(struct snd_soc_dai *codec_dai, + int clk_id, unsigned int freq, int dir) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec_dai->component); +#else + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec_dai->codec); +#endif + tfa98xx->sysclk = freq; + return 0; +} + +static int tfa98xx_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, + unsigned int rx_mask, int slots, int slot_width) +{ + pr_debug("\n"); + return 0; +} + +static int tfa98xx_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(dai->component); + struct snd_soc_component *codec = dai->component; +#else + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(dai->codec); + struct snd_soc_codec *codec = dai->codec; +#endif + pr_debug("fmt=0x%x\n", fmt); + + /* Supported mode: regular I2S, slave, or PDM */ + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { + dev_err(codec->dev, "Invalid Codec master mode\n"); + return -EINVAL; + } + break; + case SND_SOC_DAIFMT_PDM: + break; + default: + dev_err(codec->dev, "Unsupported DAI format %d\n", + fmt & SND_SOC_DAIFMT_FORMAT_MASK); + return -EINVAL; + } + + tfa98xx->audio_mode = fmt & SND_SOC_DAIFMT_FORMAT_MASK; + + return 0; +} + +static int tfa98xx_get_fssel(unsigned int rate) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(rate_to_fssel); i++) { + if (rate_to_fssel[i].rate == rate) { + return rate_to_fssel[i].fssel; + } + } + return -EINVAL; +} + +static int tfa98xx_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec = dai->component; + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else + struct snd_soc_codec *codec = dai->codec; + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + unsigned int rate; + int prof_idx; + + /* Supported */ + rate = params_rate(params); + pr_debug("Requested rate: %d, sample size: %d, physical size: %d\n", + rate, snd_pcm_format_width(params_format(params)), + snd_pcm_format_physical_width(params_format(params))); + + if (no_start != 0) + return 0; + /* check if samplerate is supported for this mixer profile */ + prof_idx = get_profile_id_for_sr(tfa98xx_mixer_profile, rate); + if (prof_idx < 0) { + pr_err("tfa98xx: invalid sample rate %d.\n", rate); + return -EINVAL; + } + pr_debug("mixer profile:container profile = [%d:%d]\n", tfa98xx_mixer_profile, prof_idx); + + + /* update 'real' profile (container profile) */ + tfa98xx->profile = prof_idx; + + /* update to new rate */ + tfa98xx->rate = rate; + + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ + tfa98xx->pcm_format = snd_pcm_format_width(params_format(params)); + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ + + return 0; +} + +#ifdef TFA_NON_DSP_SOLUTION +extern int send_tfa_cal_in_band(void *buf, int cmd_size); +static uint8_t bytes[3*3+1] = {0}; + +enum Tfa98xx_Error tfa98xx_adsp_send_calib_values(void) +{ + struct tfa98xx *tfa98xx; + int ret = 0; + int value = 0, nr, dsp_cal_value = 0; + + /* if the calibration value was sent to host DSP, we clear flag only (stereo case). */ + if ((tfa98xx_device_count > 1) && (tfa98xx_device_count == bytes[0])) { + bytes[0] = 0; + return Tfa98xx_Error_Ok; + } + + nr = 4; + /* read calibrated impendance from all devices. */ + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + struct tfa_device *tfa = tfa98xx->tfa; + + if (TFA_GET_BF(tfa, MTPEX) == 1) { + value = tfa_dev_mtp_get(tfa, TFA_MTP_RE25); + dsp_cal_value = (value * 65536) / 1000; + + bytes[nr++] = (uint8_t)((dsp_cal_value >> 16) & 0xff); + bytes[nr++] = (uint8_t)((dsp_cal_value >> 8) & 0xff); + bytes[nr++] = (uint8_t)(dsp_cal_value & 0xff); + bytes[0] += 1; + } + } + + /*for mono case, we will copy primary channel data to secondary channel. */ + if (tfa98xx_device_count == 1) { + memcpy(&bytes[7], &bytes[4], sizeof(char)*3); + } + + /* we will send it to host DSP algorithm once calibraion value loaded from all device. */ + if (tfa98xx_device_count == bytes[0]) { + bytes[1] = 0x00; + bytes[2] = 0x81; + bytes[3] = 0x05; + + ret = send_tfa_cal_in_band(&bytes[1], sizeof(bytes) - 1); + msleep(10); + + /* for mono case, we should clear flag here. */ + if (tfa98xx_device_count == 1) + bytes[0] = 0; + + } else { + ret = Tfa98xx_Error_Bad_Parameter; + } + + return ret; +} + +static int tfa98xx_send_mute_cmd(void) +{ + uint8_t cmd[9] = {0x04, 0x81, 0x04, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff}; + + return send_tfa_cal_in_band(&cmd[0], sizeof(cmd)); +} +#endif + +static int tfa98xx_mute(struct snd_soc_dai *dai, int mute, int stream) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + struct snd_soc_component *codec = dai->component; + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else + struct snd_soc_codec *codec = dai->codec; + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + dev_dbg(&tfa98xx->i2c->dev, "%s: state: %d\n", __func__, mute); + + if (no_start) + return 0; + + if (tfa98xx->tfa_mute_mode == TFA98XX_DEVICE_MUTE_ON) + return 0; + + if (mute) { + /* stop DSP only when both playback and capture streams + * are deactivated + */ + if (stream == SNDRV_PCM_STREAM_PLAYBACK) + tfa98xx->pstream = 0; + else + tfa98xx->cstream = 0; + if (tfa98xx->pstream != 0 || tfa98xx->cstream != 0) + return 0; + + mutex_lock(&tfa98xx_mutex); + tfa98xx_sync_count = 0; + mutex_unlock(&tfa98xx_mutex); + + cancel_delayed_work_sync(&tfa98xx->monitor_work); + + cancel_delayed_work_sync(&tfa98xx->init_work); + if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) + return 0; + mutex_lock(&tfa98xx->dsp_lock); +#ifdef TFA_NON_DSP_SOLUTION + tfa98xx_send_mute_cmd(); + msleep(60); +#endif + tfa_dev_stop(tfa98xx->tfa); + tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; + mutex_unlock(&tfa98xx->dsp_lock); + if (tfa98xx->flags & TFA98XX_FLAG_ADAPT_NOISE_MODE) + cancel_delayed_work_sync(&tfa98xx->nmodeupdate_work); + } else { + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { + tfa98xx->pstream = 1; +#ifdef TFA_NON_DSP_SOLUTION + if (tfa98xx->tfa->is_probus_device) { + tfa98xx_adsp_send_calib_values(); + } +#endif + } else { + tfa98xx->cstream = 1; + } + + /* Start DSP with async mode.*/ + if (tfa98xx->dsp_init != TFA98XX_DSP_INIT_PENDING) + queue_delayed_work(tfa98xx->tfa98xx_wq, + &tfa98xx->init_work, 0); + + if (tfa98xx->flags & TFA98XX_FLAG_ADAPT_NOISE_MODE) + queue_delayed_work(tfa98xx->tfa98xx_wq, + &tfa98xx->nmodeupdate_work, + 0); + } + + return 0; +} + +static const struct snd_soc_dai_ops tfa98xx_dai_ops = { + .startup = tfa98xx_startup, + .set_fmt = tfa98xx_set_fmt, + .set_sysclk = tfa98xx_set_dai_sysclk, + .set_tdm_slot = tfa98xx_set_tdm_slot, + .hw_params = tfa98xx_hw_params, + .mute_stream = tfa98xx_mute, +}; + +static struct snd_soc_dai_driver tfa98xx_dai[] = { + { + .name = "tfa98xx-aif", + .id = 1, + .playback = { + .stream_name = "AIF Playback", + .channels_min = 1, + .channels_max = 4, + .rates = TFA98XX_RATES, + .formats = TFA98XX_FORMATS, + }, + .capture = { + .stream_name = "AIF Capture", + .channels_min = 1, + .channels_max = 4, + .rates = TFA98XX_RATES, + .formats = TFA98XX_FORMATS, + }, + .ops = &tfa98xx_dai_ops, +/* .symmetric_rates = 1, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + .symmetric_channels = 1, + .symmetric_samplebits = 1, +#endif*/ + }, +}; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) +static int tfa98xx_probe(struct snd_soc_component *codec) +{ + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else +static int tfa98xx_probe(struct snd_soc_codec *codec) +{ + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + int ret; + + pr_debug("\n"); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + snd_soc_component_init_regmap(codec, tfa98xx->regmap); +#endif + /* setup work queue, will be used to initial DSP on first boot up */ + tfa98xx->tfa98xx_wq = create_singlethread_workqueue("tfa98xx"); + if (!tfa98xx->tfa98xx_wq) + return -ENOMEM; + + INIT_DELAYED_WORK(&tfa98xx->init_work, tfa98xx_dsp_init_work); + INIT_DELAYED_WORK(&tfa98xx->monitor_work, tfa98xx_monitor); + INIT_DELAYED_WORK(&tfa98xx->interrupt_work, tfa98xx_interrupt); + INIT_DELAYED_WORK(&tfa98xx->tapdet_work, tfa98xx_tapdet_work); + INIT_DELAYED_WORK(&tfa98xx->nmodeupdate_work, tfa98xx_nmode_update_work); + + tfa98xx->codec = codec; + + ret = tfa98xx_load_container(tfa98xx); + pr_debug("Container loading requested: %d\n", ret); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0) + codec->control_data = tfa98xx->regmap; + ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_REGMAP); + if (ret != 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; + } +#endif + tfa98xx_add_widgets(tfa98xx); + + dev_info(codec->dev, "tfa98xx codec registered (%s)", + tfa98xx->fw.name); + + return ret; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) +static void tfa98xx_remove(struct snd_soc_component *codec) +{ + struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); +#else +static int tfa98xx_remove(struct snd_soc_codec *codec) +{ + struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); +#endif + pr_debug("\n"); + + tfa98xx_interrupt_enable(tfa98xx, false); + + tfa98xx_inputdev_unregister(tfa98xx); + + cancel_delayed_work_sync(&tfa98xx->interrupt_work); + cancel_delayed_work_sync(&tfa98xx->monitor_work); + cancel_delayed_work_sync(&tfa98xx->init_work); + cancel_delayed_work_sync(&tfa98xx->tapdet_work); + cancel_delayed_work_sync(&tfa98xx->nmodeupdate_work); + + if (tfa98xx->tfa98xx_wq) + destroy_workqueue(tfa98xx->tfa98xx_wq); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + return; +#else + return 0; +#endif +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) && (KERNEL_VERSION(4, 18, 0) > LINUX_VERSION_CODE) +static struct regmap *tfa98xx_get_regmap(struct device *dev) +{ + struct tfa98xx *tfa98xx = dev_get_drvdata(dev); + + return tfa98xx->regmap; +} +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) +static struct snd_soc_component_driver soc_codec_dev_tfa98xx = { +#else +static struct snd_soc_codec_driver soc_codec_dev_tfa98xx = { +#endif + .probe = tfa98xx_probe, + .remove = tfa98xx_remove, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) && (KERNEL_VERSION(4, 18, 0) > LINUX_VERSION_CODE) + .get_regmap = tfa98xx_get_regmap, +#endif +}; + + +static bool tfa98xx_writeable_register(struct device *dev, unsigned int reg) +{ + /* enable read access for all registers */ + return 1; +} + +static bool tfa98xx_readable_register(struct device *dev, unsigned int reg) +{ + /* enable read access for all registers */ + return 1; +} + +static bool tfa98xx_volatile_register(struct device *dev, unsigned int reg) +{ + /* enable read access for all registers */ + return 1; +} + +static const struct regmap_config tfa98xx_regmap = { + .reg_bits = 8, + .val_bits = 16, + + .max_register = TFA98XX_MAX_REGISTER, + .writeable_reg = tfa98xx_writeable_register, + .readable_reg = tfa98xx_readable_register, + .volatile_reg = tfa98xx_volatile_register, + .cache_type = REGCACHE_NONE, +}; + +static void tfa98xx_irq_tfa2(struct tfa98xx *tfa98xx) +{ + /* + * mask interrupts + * will be unmasked after handling interrupts in workqueue + */ + tfa_irq_mask(tfa98xx->tfa); + queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->interrupt_work, 0); +} + + +static irqreturn_t tfa98xx_irq(int irq, void *data) +{ + struct tfa98xx *tfa98xx = data; + + if (tfa98xx->tfa->tfa_family == 2) + tfa98xx_irq_tfa2(tfa98xx); + + return IRQ_HANDLED; +} + +static int tfa98xx_ext_reset(struct tfa98xx *tfa98xx) +{ + if (tfa98xx && gpio_is_valid(tfa98xx->reset_gpio)) { + int reset = tfa98xx->reset_polarity; + + gpio_set_value_cansleep(tfa98xx->reset_gpio, reset); + mdelay(10); + gpio_set_value_cansleep(tfa98xx->reset_gpio, !reset); + mdelay(10); + } + return 0; +} + +static int tfa98xx_parse_dt(struct device *dev, struct tfa98xx *tfa98xx, + struct device_node *np) { + u32 value; + int ret; + + tfa98xx->reset_gpio = of_get_named_gpio(np, "reset-gpio", 0); + if (tfa98xx->reset_gpio < 0) + dev_dbg(dev, "No reset GPIO provided, will not HW reset device\n"); + + tfa98xx->irq_gpio = of_get_named_gpio(np, "irq-gpio", 0); + if (tfa98xx->irq_gpio < 0) + dev_dbg(dev, "No IRQ GPIO provided.\n"); + ret = of_property_read_u32(np, "reset-polarity", &value); + if (ret < 0) + { + tfa98xx->reset_polarity = HIGH; + } else { + tfa98xx->reset_polarity = (value == 0) ? LOW : HIGH; + } + dev_dbg(dev, "reset-polarity:%d\n", tfa98xx->reset_polarity); + return 0; +} + +static ssize_t tfa98xx_reg_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct tfa98xx *tfa98xx = dev_get_drvdata(dev); + + if (count != 1) { + pr_debug("invalid register address"); + return -EINVAL; + } + + tfa98xx->reg = buf[0]; + + return 1; +} + +static ssize_t tfa98xx_rw_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct tfa98xx *tfa98xx = dev_get_drvdata(dev); + u8 *data; + int ret; + int retries = I2C_RETRIES; + + data = kmalloc(count + 1, GFP_KERNEL); + if (data == NULL) { + pr_debug("can not allocate memory\n"); + return -ENOMEM; + } + + data[0] = tfa98xx->reg; + memcpy(&data[1], buf, count); + +retry: + ret = i2c_master_send(tfa98xx->i2c, data, count + 1); + if (ret < 0) { + pr_warn("i2c error, retries left: %d\n", retries); + if (retries) { + retries--; + msleep(I2C_RETRY_DELAY); + goto retry; + } + } + + kfree(data); + + /* the number of data bytes written without the register address */ + return ((ret > 1) ? count : -EIO); +} + +static ssize_t tfa98xx_rw_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct tfa98xx *tfa98xx = dev_get_drvdata(dev); + struct i2c_msg msgs[] = { + { + .addr = tfa98xx->i2c->addr, + .flags = 0, + .len = 1, + .buf = &tfa98xx->reg, + }, + { + .addr = tfa98xx->i2c->addr, + .flags = I2C_M_RD, + .len = count, + .buf = buf, + }, + }; + int ret; + int retries = I2C_RETRIES; +retry: + ret = i2c_transfer(tfa98xx->i2c->adapter, msgs, ARRAY_SIZE(msgs)); + if (ret < 0) { + pr_warn("i2c error, retries left: %d\n", retries); + if (retries) { + retries--; + msleep(I2C_RETRY_DELAY); + goto retry; + } + return ret; + } + /* ret contains the number of i2c transaction */ + /* return the number of bytes read */ + return ((ret > 1) ? count : -EIO); +} + +static struct bin_attribute dev_attr_rw = { + .attr = { + .name = "rw", + .mode = 0600, + }, + .size = 0, + .read = tfa98xx_rw_read, + .write = tfa98xx_rw_write, +}; + +static struct bin_attribute dev_attr_reg = { + .attr = { + .name = "reg", + .mode = 0200, + }, + .size = 0, + .read = NULL, + .write = tfa98xx_reg_write, +}; + +static int tfa98xx_misc_device_profile_open(struct inode *inode, struct file *file) +{ + struct tfa98xx *tfa98xx = container_of(file->private_data, + struct tfa98xx, tfa98xx_profile); + if (tfa98xx) { + file->private_data = tfa98xx; + return 0; + } else { + file->private_data = NULL; + return -EINVAL; + } +} + +static ssize_t tfa98xx_misc_device_profile_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct tfa98xx *tfa98xx = file->private_data; + char name[100] = { 0 }; + int ret = 0; + int profileID = 0; + + + if (tfa98xx == NULL) { + pr_err("%s tfa98xx is NULL.\n", __func__); + return -EINVAL; + } + memset(name, 0x00, sizeof(name)); + ret = copy_from_user(name, user_buf, count); + + /* search profile name and return ID. */ + profileID = get_profile_id_by_name(name, strlen(name)); + if (profileID < 0) { + pr_err("didn't find profile from list.\n"); + return 0; + } else { + int prof_idx = get_profile_id_for_sr(profileID, tfa98xx->rate); + + if (prof_idx < 0) { + pr_err("sample rate [%d] not supported for this profile(%d).\n", tfa98xx->rate, profileID); + return 0; + } else { + tfa98xx_mixer_profile = profileID; + tfa98xx->profile = prof_idx; + tfa98xx->vstep = tfa98xx->prof_vsteps[prof_idx]; + } + } + + return count; +} + +static int tfa98xx_misc_device_reg_open(struct inode *inode, struct file *file) +{ + struct tfa98xx *tfa98xx = container_of(file->private_data, + struct tfa98xx, tfa98xx_reg); + if (tfa98xx) { + file->private_data = tfa98xx; + return 0; + } else { + file->private_data = NULL; + return -EINVAL; + } +} + +static ssize_t tfa98xx_misc_device_reg_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct tfa98xx *tfa98xx = file->private_data; + u8 address = 0; + int ret = 0; + + if (tfa98xx == NULL) { + pr_err("tfa98xx is NULL.\n"); + return -EINVAL; + } + + if (count != 1) { + pr_err("invalid register address\n"); + return -EINVAL; + } + + ret = copy_from_user(&address, user_buf, count); + if (ret) { + pr_err("copy data from user space failed.\n"); + } + + tfa98xx->reg = address; + + return count; +} + +static int tfa98xx_misc_device_rw_open(struct inode *inode, struct file *file) +{ + struct tfa98xx *tfa98xx = container_of(file->private_data, + struct tfa98xx, tfa98xx_rw); + if (tfa98xx) { + file->private_data = tfa98xx; + return 0; + } else { + file->private_data = NULL; + return -EINVAL; + } +} + +static ssize_t tfa98xx_misc_device_rw_read(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct tfa98xx *tfa98xx = file->private_data; + struct i2c_msg msgs[] = { + { + .addr = tfa98xx->i2c->addr, + .flags = 0, + .len = 1, + .buf = &tfa98xx->reg, + }, + { + .addr = tfa98xx->i2c->addr, + .flags = I2C_M_RD, + .len = count, + .buf = NULL, + }, + }; + + u8 *data; + int ret; + int retries = I2C_RETRIES; + + data = kmalloc(count+1, GFP_KERNEL); + if (data == NULL) { + pr_debug("can not allocate memory\n"); + return -ENOMEM; + } + + msgs[1].buf = data; + +retry: + ret = i2c_transfer(tfa98xx->i2c->adapter, msgs, ARRAY_SIZE(msgs)); + + if (ret < 0) { + pr_warn("i2c error, retries left: %d\n", retries); + if (retries) { + retries--; + msleep(I2C_RETRY_DELAY); + goto retry; + } + + kfree(data); + return ret; + } else if (ret > 1) { + int ret_cpy = copy_to_user(user_buf, data, count); + + if (ret_cpy) { + pr_err("copy to user space failed.\n"); + } + } + + /* ret contains the number of i2c transaction */ + /* return the number of bytes read */ + kfree(data); + return ((ret > 1) ? count : -EIO); +} + +static ssize_t tfa98xx_misc_device_rw_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct tfa98xx *tfa98xx = file->private_data; + u8 *data; + int ret; + int retries = I2C_RETRIES; + + data = kmalloc(count+1, GFP_KERNEL); + if (data == NULL) { + pr_debug("can not allocate memory\n"); + return -ENOMEM; + } + + data[0] = tfa98xx->reg; + if (copy_from_user(&data[1], user_buf, count)) { + pr_err("copy to user space failed.\n"); + } + + +retry: + ret = i2c_master_send(tfa98xx->i2c, data, count+1); + if (ret < 0) { + pr_warn("i2c error, retries left: %d\n", retries); + if (retries) { + retries--; + msleep(I2C_RETRY_DELAY); + goto retry; + } + } + + kfree(data); + + /* the number of data bytes written without the register address */ + return ((ret > 1) ? count : -EIO); +} + +static int tfa98xx_misc_device_rpc_open(struct inode *inode, struct file *file) +{ + struct tfa98xx *tfa98xx = container_of(file->private_data, + struct tfa98xx, tfa98xx_rpc); + if (tfa98xx) { + file->private_data = tfa98xx; + return 0; + } else { + file->private_data = NULL; + return -EINVAL; + } +} + +static ssize_t tfa98xx_misc_device_rpc_read(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct tfa98xx *tfa98xx = file->private_data; + uint8_t *buffer = NULL; + int ret = 0; + + buffer = kmalloc(count, GFP_KERNEL); + if (buffer == NULL) { + pr_err("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); + return -ENOMEM; + } + + mutex_lock(&tfa98xx->dsp_lock); + + ret = send_tfa_cal_apr(buffer, count, true); + + mutex_unlock(&tfa98xx->dsp_lock); + if (ret) { + pr_err("[0x%x] dsp_msg_read error: %d\n", tfa98xx->i2c->addr, ret); + kfree(buffer); + return -EFAULT; + } + + ret = copy_to_user(user_buf, buffer, count); + kfree(buffer); + if (ret) + return -EFAULT; + + *ppos += count; + return count; +} + +static ssize_t tfa98xx_misc_device_rpc_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct tfa98xx *tfa98xx = file->private_data; + uint8_t *buffer; + int err = 0; + + if (count == 0) + return 0; + + /* msg_file.name is not used */ + buffer = kmalloc(count, GFP_KERNEL); + if (buffer == NULL) { + pr_err("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); + return -ENOMEM; + } + if (copy_from_user(buffer, user_buf, count)) + return -EFAULT; + + mutex_lock(&tfa98xx->dsp_lock); + + err = send_tfa_cal_apr(buffer, count, false); + if (err) { + pr_err("[0x%x] dsp_msg error: %d\n", tfa98xx->i2c->addr, err); + } + + mdelay(2); + + mutex_unlock(&tfa98xx->dsp_lock); + + kfree(buffer); + + if (err) + return err; + return count; +} + +enum Tfa98xx_Error tfa98xx_read_data_from_hostdsp(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int num_bytes, + unsigned char data[]) +{ + int error; + unsigned char buffer[3]; + int nr = 0; + + if (num_bytes <= 0) + return Tfa98xx_Error_Fail; + + if ((tfa->cnt->ndev == 1) && + (param_id == SB_PARAM_GET_RE25C || + param_id == SB_PARAM_GET_LSMODEL || + param_id == SB_PARAM_GET_ALGO_PARAMS)) { + + /* Modifying the ID for GetRe25C */ + buffer[nr++] = 4; + } else { + buffer[nr++] = tfa->spkr_select; + } + buffer[nr++] = module_id + 128; + buffer[nr++] = param_id; + + error = send_tfa_cal_apr(buffer, sizeof(buffer), false); + if (error) + return Tfa98xx_Error_Bad_Parameter; + mdelay(5); + + /* read the data from the dsp */ + error = send_tfa_cal_apr(data, sizeof(num_bytes), true); + if (error) + return Tfa98xx_Error_Bad_Parameter; + return Tfa98xx_Error_Ok; +} + +static uint8_t send_to_dsp_count; +static int tfa98xx_read_memtrack_data(struct tfa98xx *tfa98xx, int *pLivedata) +{ + enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; + /* the buffer is for stereo usecase. */ + char buffer[(2 + (MEMTRACK_ITEM_MAX * 2)) * 3] = {0}; + int item_bytes = MEMTRACK_ITEM_MAX * 3; /* mono case by default.*/ + + enum TFA_DEVICE_TYPE pri_devcie = TFA_DEVICE_TYPE_MAX; + enum TFA_DEVICE_TYPE sec_devcie = TFA_DEVICE_TYPE_MAX; + /* TFA device memory map. */ + struct livedata_cfg livedata_table[TFA_DEVICE_TYPE_MAX][MEMTRACK_ITEM_MAX] = { + /* for TFA9894 device */ + { + {0x6fc, 0x02, 0x0001}, /* fRes_P */ + {0x705, 0x02, 0x4000}, /* T_P */ + {0x70b, 0x02, 0x10000}, /* ReT_P */ + }, + + /* for TFA9874 primary channel */ + { + {0x310, 0x02, 0x0001}, /* fRes_P */ + {0x319, 0x02, 0x4000}, /* T_P */ + {0x31f, 0x02, 0x10000}, /* ReT_P */ + }, + + /* for TFA9874 secondary channel */ + { + {0x64c, 0x02, 0x0001}, /* fRes_S */ + {0x655, 0x02, 0x4000}, /* T_S */ + {0x65b, 0x02, 0x10000}, /* ReT_S */ + }, + }; + + pr_debug("entry tfa_family=%d rev=0x%x\n", tfa98xx->tfa->tfa_family, tfa98xx->tfa->rev); + mutex_lock(&tfa98xx->dsp_lock); + switch (tfa98xx->tfa->rev & 0xff) { + case 0x74: + pri_devcie = TFA_DEVICE_TYPE_9874_PRIMARY; + sec_devcie = TFA_DEVICE_TYPE_9874_SECONDARY; + break; + case 0x94: + pri_devcie = TFA_DEVICE_TYPE_9894; + break; + default: + pr_err("Un-support device type 0x%x\n", tfa98xx->tfa->rev); + ret = Tfa98xx_Error_Device; + goto err; + } + + /* check DSP status. we can read memtrack data once DSP is running. */ + if ((TFA_GET_BF(tfa98xx->tfa, MANSTATE) != 9) || (TFA_GET_BF(tfa98xx->tfa, CFE) == 0)) { + pr_err("The DSP is not running.\n"); + ret = Tfa98xx_Error_DSP_not_running; + goto err; + } + + if (tfa98xx->tfa->tfa_family == 2) { + int i = 0, j = 0; + + /* step 1: set livedata items. */ + memset(&buffer[0], 0x00, sizeof(buffer)); + + /* For every item take the tracker and add this infront of the adress */ + if (tfa98xx->tfa->is_probus_device) { /* for none-dsp device. */ + /* because our algorithm can support mono/stereo use case. + if device count is more than 1, we will build stereo struct and send to dsp next time. */ + if ((tfa98xx_device_count > 1) && (send_to_dsp_count == 0)) { + send_to_dsp_count++; + ret = Tfa98xx_Error_Ok; + goto err; + } + } + + /* build primary channel struct. */ + for (i = 0; i < MEMTRACK_ITEM_MAX*3; i += 3) { + buffer[i+6] = (uint8_t)(livedata_table[pri_devcie][j].track & 0xff); + buffer[i+7] = (uint8_t)((livedata_table[pri_devcie][j].address >> 8) & 0xff); + buffer[i+8] = (uint8_t)(livedata_table[pri_devcie][j].address & 0xff); + j++; + } + + /* build secondary channel struct. */ + if (tfa98xx_device_count > 1) { + j = 0; + for (i = MEMTRACK_ITEM_MAX*3; i < MEMTRACK_ITEM_MAX*6; i += 3) { + buffer[i+6] = (uint8_t)(livedata_table[sec_devcie][j].track & 0xff); + buffer[i+7] = (uint8_t)((livedata_table[sec_devcie][j].address >> 8) & 0xff); + buffer[i+8] = (uint8_t)(livedata_table[sec_devcie][j].address & 0xff); + j++; + } + + item_bytes *= 2; /* re-calculate item length for stereo usecase. */ + } + + /* copy the msg_id to buffer */ + buffer[0] = 0; + buffer[1] = MODULE_FRAMEWORK + 128; + buffer[2] = FW_PAR_ID_SET_MEMTRACK; + + /* Then copy the length (number of memtrack items) */ + buffer[3] = (uint8_t) ((item_bytes >> 16) & 0xffff); + buffer[4] = (uint8_t) ((item_bytes >> 8) & 0xff); + buffer[5] = (uint8_t) (item_bytes & 0xff); + + pr_info("send command to dsp to build memtrack structure.\n"); + /* send command to host dsp. */ + if (tfa98xx->tfa->is_probus_device) { + send_tfa_cal_apr(buffer, item_bytes + 6, false); + send_to_dsp_count = 0; + mdelay(5); + } else { + ret = dsp_msg(tfa98xx->tfa, item_bytes + 6, buffer); + } + + if (Tfa98xx_Error_Ok == ret) { + /* step 2: read livedata from dsp. */ + memset(&buffer[0], 0x00, sizeof(buffer)); + + /*Length = nr of items * 3 bytes (24bit dsp) + 3 bytes for Elapsed time (first 3 bytes)*/ + if (tfa98xx->tfa->is_probus_device) { + ret = tfa98xx_read_data_from_hostdsp(tfa98xx->tfa, MODULE_FRAMEWORK, FW_PAR_ID_GET_MEMTRACK, item_bytes+3, buffer); + } else { + ret = tfa_dsp_cmd_id_write_read(tfa98xx->tfa, MODULE_FRAMEWORK, FW_PAR_ID_GET_MEMTRACK, item_bytes+3, buffer); + } + + pr_debug("read memtrack data. ret=%d\n", ret); + + if (Tfa98xx_Error_Ok == ret) { + /* Skip the first 3 bytes (this is the Elapsed time, not memtrack data) */ + tfa98xx_convert_bytes2data(item_bytes, &buffer[3], pLivedata); + } else { + pr_err("get memtrack data failed from device.\n"); + ret = Tfa98xx_Error_Other; + } + } else { + pr_err("set memtrack item failed.\n"); + ret = Tfa98xx_Error_Other; + } + } else { + pr_err("The funciton doesn't support other device family(%d).\n", tfa98xx->tfa->tfa_family); + ret = Tfa98xx_Error_Other; + } + +err: + mutex_unlock(&tfa98xx->dsp_lock); + return ret; +} + +static int tfa98xx_misc_device_control_open(struct inode *inode, struct file *file) +{ + struct tfa98xx *tfa98xx = container_of(file->private_data, + struct tfa98xx, tfa98xx_control); + if (tfa98xx) { + file->private_data = tfa98xx; + return 0; + } else { + file->private_data = NULL; + return -EINVAL; + } +} + +static long tfa98xx_misc_device_control_ioctl(struct file *file, + unsigned int cmd, + unsigned long arg) +{ + struct tfa98xx *tfa98xx = NULL; + int result = 0; + + //pr_info("entry cmd=%d arg=%p\n", cmd, (void*)arg); + if (!arg) { + pr_err("arg is NULL!\n"); + return -EINVAL; + } + + switch (cmd) { + case IOCTL_CMD_GET_MEMTRACK_DATA: { + int livedata[MEMTRACK_ITEM_MAX * 2]; + int livedata_length_bytes = 0; + void *pUserData = (void *)arg; + + list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { + /* clear buffer and read livedata from dsp.*/ + memset((char *)(&livedata[0]), 0x00, sizeof(livedata)); + + /* copy data to user spcace. if copied is successed, + will be returned actual size to user space. */ + livedata_length_bytes = sizeof(int) * MEMTRACK_ITEM_MAX; + if ((tfa98xx->tfa->is_probus_device) && (tfa98xx_device_count > 1)) { + /* for stereo usecase, if the condition is true, we have already got livedata from host DSP. + otherwise, we don't need do anything. */ + if (send_to_dsp_count == 0) { + livedata_length_bytes *= 2; + } else { + livedata_length_bytes = 0; + } + } + + if (livedata_length_bytes != 0) { + result = copy_to_user((void __user *)pUserData, &livedata[0], livedata_length_bytes); + if (result) { + pr_err("copy to user space failed(%d).\n", result); + result = -EINVAL; + break; + } else { + result += livedata_length_bytes; + } + pUserData += livedata_length_bytes; + } + } + break; + } + case IOCTL_CMD_GET_CNT_VERSION: { + void *pUserData = (void *)arg; + + if (tfa98xx_container != NULL) { + result = copy_to_user((void __user *)pUserData, tfa98xx_container->type, strlen(tfa98xx_container->type)); + if (result) { + pr_err("copy to user space failed(%d).\n", result); + } else { + result = strlen(tfa98xx_container->type); + } + } else { + pr_err("get cnt version failed.\n"); + result = -EINVAL; + } + break; + } + default: + result = -EINVAL; + pr_err("un-supported command. (%d)\n", cmd); + break; + } + + return result; +} + +#ifdef CONFIG_COMPAT +static long tfa98xx_misc_device_control_compat_ioctl(struct file *file, + unsigned int cmd, + unsigned long arg) +{ + if (!arg) { + pr_err("%s No data send to driver!\n", __func__); + return -EINVAL; + } + + return tfa98xx_misc_device_control_ioctl(file, cmd, arg); +} +#endif + + +static const struct tfa98xx_miscdevice_info miscdevice_info[MISC_DEVICE_MAX] = { + { + .devicename = "tfa_reg", + .operations.owner = THIS_MODULE, + .operations.open = tfa98xx_misc_device_reg_open, + .operations.write = tfa98xx_misc_device_reg_write, + }, + { + .devicename = "tfa_rw", + .operations.owner = THIS_MODULE, + .operations.open = tfa98xx_misc_device_rw_open, + .operations.read = tfa98xx_misc_device_rw_read, + .operations.write = tfa98xx_misc_device_rw_write, + }, + { + .devicename = "tfa_rpc", + .operations.owner = THIS_MODULE, + .operations.open = tfa98xx_misc_device_rpc_open, + .operations.read = tfa98xx_misc_device_rpc_read, + .operations.write = tfa98xx_misc_device_rpc_write, + }, + { + .devicename = "tfa_profile", + .operations.owner = THIS_MODULE, + .operations.open = tfa98xx_misc_device_profile_open, + .operations.write = tfa98xx_misc_device_profile_write, + }, + { + .devicename = "tfa_control", + .operations.owner = THIS_MODULE, + .operations.open = tfa98xx_misc_device_control_open, + .operations.unlocked_ioctl = tfa98xx_misc_device_control_ioctl, +#ifdef CONFIG_COMPAT + .operations.compat_ioctl = tfa98xx_misc_device_control_compat_ioctl, +#endif + }, +}; + +int tfa98xx_init_misc_device(struct tfa98xx *tfa98xx) +{ + int ret = 0; + + pr_debug("entry\n"); + if (tfa98xx == NULL) { + pr_err("tfa98xx is NULL.\n"); + return -EINVAL; + } + + /* create device node "tfa_reg_X" for write sub address. */ + tfa98xx->tfa98xx_reg.minor = MISC_DYNAMIC_MINOR; + tfa98xx->tfa98xx_reg.name = miscdevice_info[MISC_DEVICE_TFA98XX_REG].devicename; + tfa98xx->tfa98xx_reg.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_REG].operations; + ret = misc_register(&tfa98xx->tfa98xx_reg); + if (ret) { + pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_reg.name); + } + + /* create device node "tfa_rw_X" for read/write i2c device. */ + tfa98xx->tfa98xx_rw.minor = MISC_DYNAMIC_MINOR; + tfa98xx->tfa98xx_rw.name = miscdevice_info[MISC_DEVICE_TFA98XX_RW].devicename; + tfa98xx->tfa98xx_rw.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_RW].operations; + ret = misc_register(&tfa98xx->tfa98xx_rw); + if (ret) { + pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_rw.name); + } + + /* create device node "tfa_rpc_X" for switching profile. */ + tfa98xx->tfa98xx_rpc.minor = MISC_DYNAMIC_MINOR; + tfa98xx->tfa98xx_rpc.name = miscdevice_info[MISC_DEVICE_TFA98XX_RPC].devicename; + tfa98xx->tfa98xx_rpc.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_RPC].operations; + ret = misc_register(&tfa98xx->tfa98xx_rpc); + if (ret) { + pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_rpc.name); + } + + /* create device node "tfa_profile_X" for switching profile. */ + tfa98xx->tfa98xx_profile.minor = MISC_DYNAMIC_MINOR; + tfa98xx->tfa98xx_profile.name = miscdevice_info[MISC_DEVICE_TFA98XX_PROFILE].devicename; + tfa98xx->tfa98xx_profile.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_PROFILE].operations; + ret = misc_register(&tfa98xx->tfa98xx_profile); + if (ret) { + pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_profile.name); + } + + /* create device node "tfa_control_X" for IO control. */ + tfa98xx->tfa98xx_control.minor = MISC_DYNAMIC_MINOR; + tfa98xx->tfa98xx_control.name = miscdevice_info[MISC_DEVICE_TFA98XX_IOCTL].devicename; + tfa98xx->tfa98xx_control.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_IOCTL].operations; + ret = misc_register(&tfa98xx->tfa98xx_control); + if (ret) { + pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_control.name); + } + + if (ret == 0) + pr_info("register misc device successed.\n"); + return ret; +} + +void tfa98xx_remove_misc_device(struct tfa98xx *tfa98xx) +{ + if (tfa98xx == NULL) { + pr_err("tfa98xx is NULL.\n"); + return; + } + + misc_deregister(&tfa98xx->tfa98xx_reg); + misc_deregister(&tfa98xx->tfa98xx_rw); + misc_deregister(&tfa98xx->tfa98xx_rpc); + misc_deregister(&tfa98xx->tfa98xx_profile); + misc_deregister(&tfa98xx->tfa98xx_control); + return; +} + +static int tfa98xx_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct snd_soc_dai_driver *dai; + struct tfa98xx *tfa98xx; + struct device_node *np = i2c->dev.of_node; + int irq_flags; + unsigned int reg; + int ret; + int spk_name; + + pr_debug("addr=0x%x\n", i2c->addr); + + if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) { + dev_err(&i2c->dev, "check_functionality failed\n"); + return -EIO; + } + + tfa98xx = devm_kzalloc(&i2c->dev, sizeof(struct tfa98xx), GFP_KERNEL); + if (tfa98xx == NULL) + return -ENOMEM; + + tfa98xx->dev = &i2c->dev; + tfa98xx->i2c = i2c; + tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; + tfa98xx->rate = 48000; /* init to the default sample rate (48kHz) */ + tfa98xx->tfa = NULL; + tfa98xx->tfa_mute_mode = TFA98XX_DEVICE_MUTE_OFF; /* the mute mode is disabled by default. */ + tfa98xx->regmap = devm_regmap_init_i2c(i2c, &tfa98xx_regmap); + if (IS_ERR(tfa98xx->regmap)) { + ret = PTR_ERR(tfa98xx->regmap); + dev_err(&i2c->dev, "Failed to allocate register map: %d\n", + ret); + return ret; + } + + i2c_set_clientdata(i2c, tfa98xx); + mutex_init(&tfa98xx->dsp_lock); + init_waitqueue_head(&tfa98xx->wq); + + if (np) { + ret = tfa98xx_parse_dt(&i2c->dev, tfa98xx, np); + if (ret) { + dev_err(&i2c->dev, "Failed to parse DT node\n"); + return ret; + } + if (no_start) + tfa98xx->irq_gpio = -1; + if (no_reset) + tfa98xx->reset_gpio = -1; + } else { + tfa98xx->reset_gpio = -1; + tfa98xx->irq_gpio = -1; + } + + if (gpio_is_valid(tfa98xx->reset_gpio)) { + ret = devm_gpio_request_one(&i2c->dev, tfa98xx->reset_gpio, + GPIOF_OUT_INIT_LOW, "TFA98XX_RST"); + if (ret) + return ret; + } + + if (gpio_is_valid(tfa98xx->irq_gpio)) { + ret = devm_gpio_request_one(&i2c->dev, tfa98xx->irq_gpio, + GPIOF_DIR_IN, "TFA98XX_INT"); + if (ret) + return ret; + } + + tfa98xx->spk_id_gpio_p = of_parse_phandle(np, + "nxp,spk-id-pin", 0); + + if (!tfa98xx->spk_id_gpio_p) { + dev_err(&i2c->dev, "property %s not detected in node %s", + "nxp,spk-id-pin", np->full_name); + } else { + spk_name = nxp_spk_id_get(tfa98xx->spk_id_gpio_p); + if (spk_name == VENDOR_ID_AAC) { + fw_name = TFA98XX_AAC_FW_NAME; + } + + if (spk_name == VENDOR_ID_GOER) { + fw_name = TFA98XX_GOER_FW_NAME; + } + + dev_err(&i2c->dev, "spk is %d, fw_name =%s\n", spk_name, fw_name); + } + + /* Power up! */ + tfa98xx_ext_reset(tfa98xx); + + if ((no_start == 0) && (no_reset == 0)) { + ret = regmap_read(tfa98xx->regmap, 0x03, ®); + if (ret < 0) { + dev_err(&i2c->dev, "Failed to read Revision register: %d\n", + ret); + return -EIO; + } + switch (reg & 0xff) { + case 0x72: /* tfa9872 */ + pr_info("TFA9872 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; + tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; + tfa98xx->flags |= TFA98XX_FLAG_REMOVE_PLOP_NOISE; + /* tfa98xx->flags |= TFA98XX_FLAG_LP_MODES; */ + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + break; + case 0x73: /* tfa9873 */ + pr_info("TFA9873 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; + tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + tfa98xx->flags |= TFA98XX_FLAG_ADAPT_NOISE_MODE; /***MCH_TO_TEST***/ + break; + case 0x74: /* tfa9874 */ + pr_info("TFA9874 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; + tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + break; + case 0x78: /* tfa9878 */ + pr_info("TFA9878 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; + tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + break; + case 0x88: /* tfa9888 */ + pr_info("TFA9888 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_STEREO_DEVICE; + tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + break; + case 0x13: /* tfa9912 */ + pr_info("TFA9912 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + /* tfa98xx->flags |= TFA98XX_FLAG_TAPDET_AVAILABLE; */ + break; + case 0x94: /* tfa9894 */ + pr_info("TFA9894 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + break; + case 0x80: /* tfa9890 */ + case 0x81: /* tfa9890 */ + pr_info("TFA9890 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + break; + case 0x92: /* tfa9891 */ + pr_info("TFA9891 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_SAAM_AVAILABLE; + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + break; + case 0x12: /* tfa9895 */ + pr_info("TFA9895 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + break; + case 0x97: + pr_info("TFA9897 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + break; + case 0x96: + pr_info("TFA9896 detected\n"); + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; + break; + default: + pr_info("Unsupported device revision (0x%x)\n", reg & 0xff); + return -EINVAL; + } + } + + tfa98xx->tfa = devm_kzalloc(&i2c->dev, sizeof(struct tfa_device), GFP_KERNEL); + if (tfa98xx->tfa == NULL) + return -ENOMEM; + + tfa98xx->tfa->data = (void *)tfa98xx; + tfa98xx->tfa->cachep = tfa98xx_cache; + + /* Modify the stream names, by appending the i2c device address. + * This is used with multicodec, in order to discriminate the devices. + * Stream names appear in the dai definition and in the stream . + * We create copies of original structures because each device will + * have its own instance of this structure, with its own address. + */ + dai = devm_kzalloc(&i2c->dev, sizeof(tfa98xx_dai), GFP_KERNEL); + if (!dai) + return -ENOMEM; + memcpy(dai, tfa98xx_dai, sizeof(tfa98xx_dai)); + + tfa98xx_append_i2c_address(&i2c->dev, + i2c, + NULL, + 0, + dai, + ARRAY_SIZE(tfa98xx_dai)); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_codec_dev_tfa98xx, dai, + ARRAY_SIZE(tfa98xx_dai)); +#else + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_tfa98xx, dai, + ARRAY_SIZE(tfa98xx_dai)); +#endif + if (ret < 0) { + dev_err(&i2c->dev, "Failed to register TFA98xx: %d\n", ret); + return ret; + } + + if (gpio_is_valid(tfa98xx->irq_gpio) && + !(tfa98xx->flags & TFA98XX_FLAG_SKIP_INTERRUPTS)) { + /* register irq handler */ + irq_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT; + ret = devm_request_threaded_irq(&i2c->dev, + gpio_to_irq(tfa98xx->irq_gpio), + NULL, tfa98xx_irq, irq_flags, + "tfa98xx", tfa98xx); + if (ret != 0) { + dev_err(&i2c->dev, "Failed to request IRQ %d: %d\n", + gpio_to_irq(tfa98xx->irq_gpio), ret); + return ret; + } + } else { + dev_info(&i2c->dev, "Skipping IRQ registration\n"); + /* disable feature support if gpio was invalid */ + tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; + } + +#ifdef CONFIG_DEBUG_FS + if (no_start == 0) + tfa98xx_debug_init(tfa98xx, i2c); +#endif + /* Register the sysfs files for climax backdoor access */ + ret = device_create_bin_file(&i2c->dev, &dev_attr_rw); + if (ret) + dev_info(&i2c->dev, "error creating sysfs files\n"); + ret = device_create_bin_file(&i2c->dev, &dev_attr_reg); + if (ret) + dev_info(&i2c->dev, "error creating sysfs files\n"); + if (tfa98xx_device_count == 0) + tfa98xx_init_misc_device(tfa98xx); + pr_info("%s Probe completed successfully!\n", __func__); + + INIT_LIST_HEAD(&tfa98xx->list); + + mutex_lock(&tfa98xx_mutex); + tfa98xx_device_count++; + list_add(&tfa98xx->list, &tfa98xx_device_list); + mutex_unlock(&tfa98xx_mutex); + + return 0; +} + +static int tfa98xx_i2c_remove(struct i2c_client *i2c) +{ + struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); + + pr_debug("addr=0x%x\n", i2c->addr); + + tfa98xx_interrupt_enable(tfa98xx, false); + + cancel_delayed_work_sync(&tfa98xx->interrupt_work); + cancel_delayed_work_sync(&tfa98xx->monitor_work); + cancel_delayed_work_sync(&tfa98xx->init_work); + cancel_delayed_work_sync(&tfa98xx->tapdet_work); + cancel_delayed_work_sync(&tfa98xx->nmodeupdate_work); + + device_remove_bin_file(&i2c->dev, &dev_attr_reg); + device_remove_bin_file(&i2c->dev, &dev_attr_rw); +#ifdef CONFIG_DEBUG_FS + tfa98xx_debug_remove(tfa98xx); +#endif + tfa98xx_remove_misc_device(tfa98xx); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) + snd_soc_unregister_component(&i2c->dev); +#else + snd_soc_unregister_codec(&i2c->dev); +#endif + if (gpio_is_valid(tfa98xx->irq_gpio)) + devm_gpio_free(&i2c->dev, tfa98xx->irq_gpio); + if (gpio_is_valid(tfa98xx->reset_gpio)) + devm_gpio_free(&i2c->dev, tfa98xx->reset_gpio); + + mutex_lock(&tfa98xx_mutex); + list_del(&tfa98xx->list); + tfa98xx_device_count--; + if (tfa98xx_device_count == 0) { + kfree(tfa98xx_container); + tfa98xx_container = NULL; + } + mutex_unlock(&tfa98xx_mutex); + + return 0; +} + +static const struct i2c_device_id tfa98xx_i2c_id[] = { + { "tfa98xx", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tfa98xx_i2c_id); + +#ifdef CONFIG_OF +static struct of_device_id tfa98xx_dt_match[] = { + {.compatible = "tfa,tfa98xx" }, + {.compatible = "tfa,tfa9872" }, + {.compatible = "tfa,tfa9873" }, + {.compatible = "tfa,tfa9874" }, + {.compatible = "tfa,tfa9878" }, + {.compatible = "tfa,tfa9888" }, + {.compatible = "tfa,tfa9890" }, + {.compatible = "tfa,tfa9891" }, + {.compatible = "tfa,tfa9894" }, + {.compatible = "tfa,tfa9895" }, + {.compatible = "tfa,tfa9896" }, + {.compatible = "tfa,tfa9897" }, + {.compatible = "tfa,tfa9912" }, + { }, +}; +#endif + +static struct i2c_driver tfa98xx_i2c_driver = { + .driver = { + .name = "tfa98xx", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(tfa98xx_dt_match), + .probe_type = PROBE_PREFER_ASYNCHRONOUS, + }, + .probe = tfa98xx_i2c_probe, + .remove = tfa98xx_i2c_remove, + .id_table = tfa98xx_i2c_id, +}; + +static int __init tfa98xx_i2c_init(void) +{ + int ret = 0; + + pr_info("TFA98XX driver version %s\n", TFA98XX_VERSION); + + /* Enable debug traces */ + tfa98xx_kmsg_regs = trace_level & 2; + tfa98xx_ftrace_regs = trace_level & 4; + + /* Initialize kmem_cache */ + tfa98xx_cache = kmem_cache_create("tfa98xx_cache", /* Cache name /proc/slabinfo */ + PAGE_SIZE, /* Structure size, we should fit in single page */ + 0, /* Structure alignment */ + (SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT | + SLAB_MEM_SPREAD), /* Cache property */ + NULL); /* Object constructor */ + if (!tfa98xx_cache) { + pr_err("tfa98xx can't create memory pool\n"); + ret = -ENOMEM; + } + + ret = i2c_add_driver(&tfa98xx_i2c_driver); + + return ret; +} +module_init(tfa98xx_i2c_init); + +static void __exit tfa98xx_i2c_exit(void) +{ + i2c_del_driver(&tfa98xx_i2c_driver); + kmem_cache_destroy(tfa98xx_cache); +} +module_exit(tfa98xx_i2c_exit); + +MODULE_DESCRIPTION("ASoC TFA98XX driver"); +MODULE_LICENSE("GPL"); diff --git a/src/tfa_container.c b/src/tfa_container.c new file mode 100644 index 000000000000..66ee1323f762 --- /dev/null +++ b/src/tfa_container.c @@ -0,0 +1,2374 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +#include "dbgprint.h" +#include "tfa_container.h" +#include "tfa.h" +#include "tfa98xx_tfafieldnames.h" +#include "tfa_internal.h" + + /* defines */ +#define MODULE_BIQUADFILTERBANK 2 +#define BIQUAD_COEFF_SIZE 6 + +/* module globals */ +static uint8_t gslave_address; /* This is used to SET the slave with the --slave option */ + +static int float_to_int(uint32_t x) +{ + unsigned int e = (0x7F + 31) - ((*(unsigned *)&x & 0x7F800000) >> 23); + unsigned int m = 0x80000000 | (*(unsigned *)&x << 8); + + return -(int)((m >> e) & -(e < 32)); +} + +/* + * check the container file +*/ +enum tfa_error tfa_load_cnt(void *cnt, int length) +{ + TfaContainer_t *cntbuf = (TfaContainer_t *)cnt; + + if (length > TFA_MAX_CNT_LENGTH) { + pr_err("incorrect length\n"); + return tfa_error_container; + } + + if (HDR(cntbuf->id[0], cntbuf->id[1]) == 0) { + pr_err("header is 0\n"); + return tfa_error_container; + } + + if ((HDR(cntbuf->id[0], cntbuf->id[1])) != paramsHdr) { + pr_err("wrong header type: 0x%02x 0x%02x\n", cntbuf->id[0], cntbuf->id[1]); + return tfa_error_container; + } + + if (cntbuf->size == 0) { + pr_err("data size is 0\n"); + return tfa_error_container; + } + + /* check CRC */ + if (tfaContCrcCheckContainer(cntbuf)) { + pr_err("CRC error\n"); + return tfa_error_container; + } + + /* check sub version level */ + if ((cntbuf->subversion[1] != TFA_PM_SUBVERSION) && + (cntbuf->subversion[0] != '0')) { + pr_err("container sub-version not supported: %c%c\n", + cntbuf->subversion[0], cntbuf->subversion[1]); + return tfa_error_container; + } + + return tfa_error_ok; +} + +/* + * Dump the contents of the file header + */ +void tfaContShowHeader(TfaHeader_t *hdr) +{ + char _id[2]; + + pr_debug("File header\n"); + + _id[1] = hdr->id >> 8; + _id[0] = hdr->id & 0xff; + pr_debug("\tid:%.2s version:%.2s subversion:%.2s\n", _id, + hdr->version, hdr->subversion); + pr_debug("\tsize:%d CRC:0x%08x\n", hdr->size, hdr->CRC); + pr_debug("\tcustomer:%.8s application:%.8s type:%.8s\n", hdr->customer, + hdr->application, hdr->type); +} + +/* + * return device list dsc from index + */ +TfaDeviceList_t *tfaContGetDevList(TfaContainer_t *cont, int dev_idx) +{ + uint8_t *base = (uint8_t *)cont; + + if (cont == NULL) + return NULL; + + if ((dev_idx < 0) || (dev_idx >= cont->ndev)) + return NULL; + + if (cont->index[dev_idx].type != dscDevice) + return NULL; + + base += cont->index[dev_idx].offset; + return (TfaDeviceList_t *)base; +} + +/* + * get the Nth profile for the Nth device + */ +TfaProfileList_t *tfaContGetDevProfList(TfaContainer_t *cont, int devIdx, int profIdx) +{ + TfaDeviceList_t *dev; + int idx, hit; + uint8_t *base = (uint8_t *)cont; + + dev = tfaContGetDevList(cont, devIdx); + if (dev) { + for (idx = 0, hit = 0; idx < dev->length; idx++) { + if (dev->list[idx].type == dscProfile) { + if (profIdx == hit++) + return (TfaProfileList_t *)(dev->list[idx].offset + base); + } + } + } + + return NULL; +} + +/* + * get the number of profiles for the Nth device + */ +int tfa_cnt_get_dev_nprof(struct tfa_device *tfa) +{ + TfaDeviceList_t *dev; + int idx, nprof = 0; + + if (tfa->cnt == NULL) + return 0; + + if ((tfa->dev_idx < 0) || (tfa->dev_idx >= tfa->cnt->ndev)) + return 0; + + dev = tfaContGetDevList(tfa->cnt, tfa->dev_idx); + if (dev) { + for (idx = 0; idx < dev->length; idx++) { + if (dev->list[idx].type == dscProfile) { + nprof++; + } + } + } + + return nprof; +} + +/* + * get the Nth lifedata for the Nth device + */ +TfaLiveDataList_t *tfaContGetDevLiveDataList(TfaContainer_t *cont, int devIdx, + int lifeDataIdx) +{ + TfaDeviceList_t *dev; + int idx, hit; + uint8_t *base = (uint8_t *)cont; + + dev = tfaContGetDevList(cont, devIdx); + if (dev) { + for (idx = 0, hit = 0; idx < dev->length; idx++) { + if (dev->list[idx].type == dscLiveData) { + if (lifeDataIdx == hit++) + return (TfaLiveDataList_t *) + (dev->list[idx].offset + base); + } + } + } + + return NULL; +} + +/* + * Get the max volume step associated with Nth profile for the Nth device + */ +int tfacont_get_max_vstep(struct tfa_device *tfa, int prof_idx) +{ + TfaVolumeStep2File_t *vp; + struct TfaVolumeStepMax2File *vp3; + int vstep_count = 0; + + vp = (TfaVolumeStep2File_t *)tfacont_getfiledata(tfa, prof_idx, volstepHdr); + if (vp == NULL) + return 0; + /* check the header type to load different NrOfVStep appropriately */ + if (tfa->tfa_family == 2) { + /* this is actually tfa2, so re-read the buffer*/ + vp3 = (struct TfaVolumeStepMax2File *) + tfacont_getfiledata(tfa, prof_idx, volstepHdr); + if (vp3) { + vstep_count = vp3->NrOfVsteps; + } + } else { + /* this is max1*/ + if (vp) { + vstep_count = vp->vsteps; + } + } + return vstep_count; +} + +/** + * Get the file contents associated with the device or profile + * Search within the device tree, if not found, search within the profile + * tree. There can only be one type of file within profile or device. + */ +TfaFileDsc_t *tfacont_getfiledata(struct tfa_device *tfa, int prof_idx, enum TfaHeaderType type) +{ + TfaDeviceList_t *dev; + TfaProfileList_t *prof; + TfaFileDsc_t *file; + TfaHeader_t *hdr; + unsigned int i; + + if (tfa->cnt == NULL) { + pr_err("invalid pointer to container file\n"); + return NULL; + } + + dev = tfaContGetDevList(tfa->cnt, tfa->dev_idx); + if (dev == NULL) { + pr_err("invalid pointer to container file device list\n"); + return NULL; + } + + /* process the device list until a file type is encountered */ + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == dscFile) { + file = (TfaFileDsc_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); + if (file != NULL) { + hdr = (TfaHeader_t *)file->data; + /* check for file type */ + if (hdr->id == type) { + return (TfaFileDsc_t *)&file->data; + } + } + } + } + + /* File not found in device tree. + * So, look in the profile list until the file type is encountered + */ + prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + if (prof == NULL) { + pr_err("invalid pointer to container file profile list\n"); + return NULL; + } + + for (i = 0; i < prof->length; i++) { + if (prof->list[i].type == dscFile) { + file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + if (file != NULL) { + hdr = (TfaHeader_t *)file->data; + if (hdr != NULL) { + /* check for file type */ + if (hdr->id == type) { + return (TfaFileDsc_t *)&file->data; + } + } + } + } + } + + if (tfa->verbose) + pr_debug("%s: no file found of type %d\n", __func__, type); + + return NULL; +} + +/* + * write a parameter file to the device + */ +static enum Tfa98xx_Error tfaContWriteVstep(struct tfa_device *tfa, TfaVolumeStep2File_t *vp, int vstep) +{ + enum Tfa98xx_Error err; + unsigned short vol; + + if (vstep < vp->vsteps) { + /* vol = (unsigned short)(voldB / (-0.5f)); */ + vol = (unsigned short)(-2 * float_to_int(*((uint32_t *)&vp->vstep[vstep].attenuation))); + if (vol > 255) /* restricted to 8 bits */ + vol = 255; + + err = tfa98xx_set_volume_level(tfa, vol); + if (err != Tfa98xx_Error_Ok) + return err; + + err = tfa98xx_dsp_write_preset(tfa, sizeof(vp->vstep[0].preset), vp->vstep[vstep].preset); + if (err != Tfa98xx_Error_Ok) + return err; + err = tfa_cont_write_filterbank(tfa, vp->vstep[vstep].filter); + + } else { + pr_err("Incorrect volume given. The value vstep[%d] >= %d\n", vstep, vp->vsteps); + err = Tfa98xx_Error_Bad_Parameter; + } + + if (tfa->verbose) pr_debug("vstep[%d][%d]\n", tfa->dev_idx, vstep); + + return err; +} + +static struct TfaVolumeStepMessageInfo * +tfaContGetmsgInfoFromReg(struct TfaVolumeStepRegisterInfo *regInfo) +{ + char *p = (char *)regInfo; + + p += sizeof(regInfo->NrOfRegisters) + (regInfo->NrOfRegisters * sizeof(uint32_t)); + return (struct TfaVolumeStepMessageInfo *) p; +} + +static int +tfaContGetmsgLen(struct TfaVolumeStepMessageInfo *msgInfo) +{ + return (msgInfo->MessageLength.b[0] << 16) + (msgInfo->MessageLength.b[1] << 8) + msgInfo->MessageLength.b[2]; +} + +static struct TfaVolumeStepMessageInfo * +tfaContGetNextmsgInfo(struct TfaVolumeStepMessageInfo *msgInfo) +{ + char *p = (char *)msgInfo; + int msgLen = tfaContGetmsgLen(msgInfo); + int type = msgInfo->MessageType; + + p += sizeof(msgInfo->MessageType) + sizeof(msgInfo->MessageLength); + if (type == 3) + p += msgLen; + else + p += msgLen * 3; + + return (struct TfaVolumeStepMessageInfo *) p; +} + +static struct TfaVolumeStepRegisterInfo* +tfaContGetNextRegFromEndInfo(struct TfaVolumeStepMessageInfo *msgInfo) +{ + char *p = (char *)msgInfo; + + p += sizeof(msgInfo->NrOfMessages); + return (struct TfaVolumeStepRegisterInfo *) p; + +} + +static struct TfaVolumeStepRegisterInfo* +tfaContGetRegForVstep(TfaVolumeStepMax2File_t *vp, int idx) +{ + int i, j, nrMessage; + + struct TfaVolumeStepRegisterInfo *regInfo + = (struct TfaVolumeStepRegisterInfo *) vp->vstepsBin; + struct TfaVolumeStepMessageInfo *msgInfo = NULL; + + for (i = 0; i < idx; i++) { + msgInfo = tfaContGetmsgInfoFromReg(regInfo); + nrMessage = msgInfo->NrOfMessages; + + for (j = 0; j < nrMessage; j++) { + msgInfo = tfaContGetNextmsgInfo(msgInfo); + } + regInfo = tfaContGetNextRegFromEndInfo(msgInfo); + } + + return regInfo; +} + +#pragma pack(push, 1) +struct tfa_partial_msg_block { + uint8_t offset; + uint16_t change; + uint8_t update[16][3]; +}; +#pragma pack(pop) + +static enum Tfa98xx_Error tfaContWriteVstepMax2_One(struct tfa_device *tfa, struct TfaVolumeStepMessageInfo *new_msg, + struct TfaVolumeStepMessageInfo *old_msg, int enable_partial_update) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int len = (tfaContGetmsgLen(new_msg) - 1) * 3; + char *buf = (char *)new_msg->ParameterData; + uint8_t *partial = NULL; + uint8_t cmdid[3]; + int use_partial_coeff = 0; + + if (enable_partial_update) { + if (new_msg->MessageType != old_msg->MessageType) { + pr_debug("Message type differ - Disable Partial Update\n"); + enable_partial_update = 0; + } else if (tfaContGetmsgLen(new_msg) != tfaContGetmsgLen(old_msg)) { + pr_debug("Message Length differ - Disable Partial Update\n"); + enable_partial_update = 0; + } + } + + if ((enable_partial_update) && (new_msg->MessageType == 1)) { + /* No patial updates for message type 1 (Coefficients) */ + enable_partial_update = 0; + if ((tfa->rev & 0xff) == 0x88) { + use_partial_coeff = 1; + } else if ((tfa->rev & 0xff) == 0x13) { + use_partial_coeff = 1; + } + } + + /* Change Message Len to the actual buffer len */ + memcpy(cmdid, new_msg->CmdId, sizeof(cmdid)); + + /* The algoparams and mbdrc msg id will be changed to the reset type when SBSL=0 + * if SBSL=1 the msg will remain unchanged. It's up to the tuning engineer to choose the 'without_reset' + * types inside the vstep. In other words: the reset msg is applied during SBSL==0 else it remains unchanged. + */ + if (tfa_needs_reset(tfa) == 1) { + if (new_msg->MessageType == 0) { + cmdid[2] = SB_PARAM_SET_ALGO_PARAMS; + if (tfa->verbose) + pr_debug("P-ID for SetAlgoParams modified!\n"); + } else if (new_msg->MessageType == 2) { + cmdid[2] = SB_PARAM_SET_MBDRC; + if (tfa->verbose) + pr_debug("P-ID for SetMBDrc modified!\n"); + } + } + + /* + * +sizeof(struct tfa_partial_msg_block) will allow to fit one + * additonnal partial block If the partial update goes over the len of + * a regular message ,we can safely write our block and check afterward + * that we are over the size of a usual update + */ + if (enable_partial_update) { + partial = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + if (!partial) + pr_debug("Partial update memory error - Disabling\n"); + } + + if (partial) { + uint8_t offset = 0, i = 0; + uint16_t *change; + uint8_t *n = new_msg->ParameterData; + uint8_t *o = old_msg->ParameterData; + uint8_t *p = partial; + uint8_t *trim = partial; + + /* set dspFiltersReset */ + *p++ = 0x02; + *p++ = 0x00; + *p++ = 0x00; + + while ((o < (old_msg->ParameterData + len)) && + (p < (partial + len - 3))) { + if ((offset == 0xff) || + (memcmp(n, o, 3 * sizeof(uint8_t)))) { + *p++ = offset; + change = (uint16_t *)p; + *change = 0; + p += 2; + + for (i = 0; + (i < 16) && (o < (old_msg->ParameterData + len)); + i++, n += 3, o += 3) { + if (memcmp(n, o, 3 * sizeof(uint8_t))) { + *change |= BIT(i); + memcpy(p, n, 3); + p += 3; + trim = p; + } + } + + offset = 0; + *change = cpu_to_be16(*change); + } else { + n += 3; + o += 3; + offset++; + } + } + + if (trim == partial) { + pr_debug("No Change in message - discarding %d bytes\n", len); + len = 0; + + } else if (trim < (partial + len - 3)) { + pr_debug("Using partial update: %d -> %d bytes\n", len, (int)(trim - partial + 3)); + + /* Add the termination marker */ + memset(trim, 0x00, 3); + trim += 3; + + /* Signal This will be a partial update */ + cmdid[2] |= BIT(6); + buf = (char *)partial; + len = (int)(trim - partial); + } else { + pr_debug("Partial too big - use regular update\n"); + } + } + + if (use_partial_coeff) { + err = dsp_partial_coefficients(tfa, old_msg->ParameterData, new_msg->ParameterData); + } else if (len) { + uint8_t *buffer; + + if (tfa->verbose) + pr_debug("Command-ID used: 0x%02x%02x%02x\n", cmdid[0], cmdid[1], cmdid[2]); + + buffer = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + if (buffer == NULL) { + err = Tfa98xx_Error_Fail; + } else { + memcpy(&buffer[0], cmdid, 3); + memcpy(&buffer[3], buf, len); + err = dsp_msg(tfa, 3 + len, (char *)buffer); + kmem_cache_free(tfa->cachep, buffer); + } + } + + if (partial) + kmem_cache_free(tfa->cachep, partial); + + return err; +} + +static enum Tfa98xx_Error tfaContWriteVstepMax2(struct tfa_device *tfa, TfaVolumeStepMax2File_t *vp, int vstep_idx, int vstep_msg_idx) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + struct TfaVolumeStepRegisterInfo *regInfo = NULL; + struct TfaVolumeStepMessageInfo *msgInfo = NULL, *p_msgInfo = NULL; + TfaBitfield_t bitF; + int i, nrMessages, enp = tfa->partial_enable; + + if (vstep_idx >= vp->NrOfVsteps) { + pr_debug("Volumestep %d is not available\n", vstep_idx); + return Tfa98xx_Error_Bad_Parameter; + } + + if (tfa->p_regInfo == NULL) { + if (tfa->verbose) + pr_debug("Inital vstep write\n"); + enp = 0; + } + + regInfo = tfaContGetRegForVstep(vp, vstep_idx); + + msgInfo = tfaContGetmsgInfoFromReg(regInfo); + nrMessages = msgInfo->NrOfMessages; + + if (enp) { + p_msgInfo = tfaContGetmsgInfoFromReg(tfa->p_regInfo); + if (nrMessages != p_msgInfo->NrOfMessages) { + pr_debug("Message different - Disable partial update\n"); + enp = 0; + } + } + + for (i = 0; i < nrMessages; i++) { + /* Messagetype(3) is Smartstudio Info! Dont send this! */ + if (msgInfo->MessageType == 3) { + /* MessageLength is in bytes */ + msgInfo = tfaContGetNextmsgInfo(msgInfo); + if (enp) + p_msgInfo = tfaContGetNextmsgInfo(p_msgInfo); + continue; + } + + /* If no vstepMsgIndex is passed on, all message needs to be send */ + if ((vstep_msg_idx >= TFA_MAX_VSTEP_MSG_MARKER) || (vstep_msg_idx == i)) { + err = tfaContWriteVstepMax2_One(tfa, msgInfo, p_msgInfo, enp); + if (err != Tfa98xx_Error_Ok) { + /* + * Force a full update for the next write + * As the current status of the DSP is unknown + */ + tfa->p_regInfo = NULL; + return err; + } + } + + msgInfo = tfaContGetNextmsgInfo(msgInfo); + if (enp) + p_msgInfo = tfaContGetNextmsgInfo(p_msgInfo); + } + + tfa->p_regInfo = regInfo; + + for (i = 0; i < regInfo->NrOfRegisters * 2; i++) { + /* Byte swap the datasheetname */ + bitF.field = (uint16_t)(regInfo->registerInfo[i] >> 8) | (regInfo->registerInfo[i] << 8); + i++; + bitF.value = (uint16_t)regInfo->registerInfo[i] >> 8; + err = tfaRunWriteBitfield(tfa, bitF); + if (err != Tfa98xx_Error_Ok) + return err; + } + + /* Save the current vstep */ + tfa_dev_set_swvstep(tfa, (unsigned short)vstep_idx); + + return err; +} + +/* + * Write DRC message to the dsp + * If needed modify the cmd-id + */ + +enum Tfa98xx_Error tfaContWriteDrcFile(struct tfa_device *tfa, int size, uint8_t data[]) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + uint8_t *msg = NULL; + + msg = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + if (msg == NULL) + return Tfa98xx_Error_Fail; + memcpy(msg, data, size); + + if (TFA_GET_BF(tfa, SBSL) == 0) { + /* Only do this when not set already */ + if (msg[2] != SB_PARAM_SET_MBDRC) { + msg[2] = SB_PARAM_SET_MBDRC; + + if (tfa->verbose) { + pr_debug("P-ID for SetMBDrc modified!: "); + pr_debug("Command-ID used: 0x%02x%02x%02x\n", + msg[0], msg[1], msg[2]); + } + } + } + + /* Send cmdId + payload to dsp */ + err = dsp_msg(tfa, size, (const char *)msg); + + kmem_cache_free(tfa->cachep, msg); + + return err; +} + + +/* + * write a parameter file to the device + * The VstepIndex and VstepMsgIndex are only used to write a specific msg from the vstep file. + */ +enum Tfa98xx_Error tfaContWriteFile(struct tfa_device *tfa, TfaFileDsc_t *file, int vstep_idx, int vstep_msg_idx) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaHeader_t *hdr = (TfaHeader_t *)file->data; + TfaHeaderType_t type; + int size, i; + char subVerString[8] = { 0 }; + int subversion = 0; + + if (tfa->verbose) { + tfaContShowHeader(hdr); + } + + type = (TfaHeaderType_t)hdr->id; + if ((type == msgHdr) || ((type == volstepHdr) && (tfa->tfa_family == 2))) + { + subVerString[0] = hdr->subversion[0]; + subVerString[1] = hdr->subversion[1]; + subVerString[2] = '\0'; + + sscanf(subVerString, "%d", &subversion); + + if ((subversion > 0) && + (((hdr->customer[0]) == 'A') && ((hdr->customer[1]) == 'P') && + ((hdr->customer[2]) == 'I') && ((hdr->customer[3]) == 'V'))) + { + if (tfa->is_probus_device) + { + /* Temporary workaround (example: For climax --calibrate scenario for probus devices) */ + err = tfaGetFwApiVersion(tfa, (unsigned char *)&tfa->fw_itf_ver[0]); + if (err) { + pr_debug("[%s] cannot get FWAPI error = %d\n", __func__, err); + return err; + } + for (i = 0; i < 3; i++) + { + if (tfa->fw_itf_ver[i] != hdr->customer[i + 4]) //+4 to skip "?PIV" string part in the .msg file. + { + ERRORMSG("Error: tfaContWriteFile: Expected FW API version = %d.%d.%d, Msg File version: %d.%d.%d\n", + tfa->fw_itf_ver[0], + tfa->fw_itf_ver[1], + tfa->fw_itf_ver[2], + hdr->customer[4], + hdr->customer[5], + hdr->customer[6]); + return Tfa98xx_Error_Bad_Parameter; + } + } + } else if ((tfa->fw_itf_ver[2] != hdr->customer[4]) || (tfa->fw_itf_ver[1] != hdr->customer[5]) || ((tfa->fw_itf_ver[0] >> 6) & 0x03) != hdr->customer[6]) + { + + ERRORMSG("Error: tfaContWriteFile: Expected FW API version = %d.%d.%d, Msg File version: %d.%d.%d\n", + (tfa->fw_itf_ver[2]) & 0xff, + (tfa->fw_itf_ver[1]) & 0xff, + (tfa->fw_itf_ver[0] >> 6) & 0x03, + hdr->customer[4], + hdr->customer[5], + hdr->customer[6]); + return Tfa98xx_Error_Bad_Parameter; + } + } + } + + switch (type) { + case msgHdr: /* generic DSP message */ + size = hdr->size - sizeof(TfaMsgFile_t); + err = dsp_msg(tfa, size, (const char *)((TfaMsgFile_t *)hdr)->data); + break; + case volstepHdr: + if (tfa->tfa_family == 2) { + err = tfaContWriteVstepMax2(tfa, (TfaVolumeStepMax2File_t *)hdr, vstep_idx, vstep_msg_idx); + } else { + err = tfaContWriteVstep(tfa, (TfaVolumeStep2File_t *)hdr, vstep_idx); + } + break; + case speakerHdr: + if (tfa->tfa_family == 2) { + /* Remove header and xml_id */ + size = hdr->size - sizeof(struct TfaSpkHeader) - sizeof(struct TfaFWVer); + + err = dsp_msg(tfa, size, + (const char *)(((TfaSpeakerFile_t *)hdr)->data + (sizeof(struct TfaFWVer)))); + } else { + size = hdr->size - sizeof(TfaSpeakerFile_t); + err = tfa98xx_dsp_write_speaker_parameters(tfa, size, + (const unsigned char *)((TfaSpeakerFile_t *)hdr)->data); + } + break; + case presetHdr: + size = hdr->size - sizeof(TfaPreset_t); + err = tfa98xx_dsp_write_preset(tfa, size, (const unsigned char *)((TfaPreset_t *)hdr)->data); + break; + case equalizerHdr: + err = tfa_cont_write_filterbank(tfa, ((TfaEqualizerFile_t *)hdr)->filter); + break; + case patchHdr: + size = hdr->size - sizeof(TfaPatch_t); // size is total length + err = tfa_dsp_patch(tfa, size, (const unsigned char *)((TfaPatch_t *)hdr)->data); + break; + case configHdr: + size = hdr->size - sizeof(TfaConfig_t); + err = tfa98xx_dsp_write_config(tfa, size, (const unsigned char *)((TfaConfig_t *)hdr)->data); + break; + case drcHdr: + if (hdr->version[0] == TFA_DR3_VERSION) { + /* Size is total size - hdrsize(36) - xmlversion(3) */ + size = hdr->size - sizeof(TfaDrc2_t); + err = tfaContWriteDrcFile(tfa, size, ((TfaDrc2_t *)hdr)->data); + } else { + /* + * The DRC file is split as: + * 36 bytes for generic header (customer, application, and type) + * 127x3 (381) bytes first block contains the device and sample rate + * independent settings + * 127x3 (381) bytes block the device and sample rate specific values. + * The second block can always be recalculated from the first block, + * if vlsCal and the sample rate are known. + */ + //size = hdr->size - sizeof(TfaDrc_t); + size = 381; /* fixed size for first block */ + + //+381 is done to only send the second part of the drc block + err = tfa98xx_dsp_write_drc(tfa, size, ((const unsigned char *)((TfaDrc_t *)hdr)->data + 381)); + } + break; + case infoHdr: + /* Ignore */ + break; + default: + pr_err("Header is of unknown type: 0x%x\n", type); + return Tfa98xx_Error_Bad_Parameter; + } + + return err; +} + +/** + * get the 1st of this dsc type this devicelist + */ +static TfaDescPtr_t *tfa_cnt_get_dsc(TfaContainer_t *cnt, TfaDescriptorType_t type, int dev_idx) +{ + TfaDeviceList_t *dev = tfaContDevice(cnt, dev_idx); + TfaDescPtr_t *_this; + int i; + + if (!dev) { + return NULL; + } + /* process the list until a the type is encountered */ + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == (uint32_t)type) { + _this = (TfaDescPtr_t *)(dev->list[i].offset + (uint8_t *)cnt); + return _this; + } + + } + + return NULL; +} + +/** + * get the device type from the patch in this devicelist + * - find the patch file for this devidx + * - return the devid from the patch or 0 if not found + */ +int tfa_cnt_get_devid(TfaContainer_t *cnt, int dev_idx) +{ + TfaPatch_t *patchfile; + TfaDescPtr_t *patchdsc; + uint8_t *patchheader; + unsigned short devid, checkaddress; + int checkvalue; + + patchdsc = tfa_cnt_get_dsc(cnt, dscPatch, dev_idx); + if (!patchdsc) /* no patch for this device, assume non-i2c */ + return 0; + patchdsc += 2; /* first the filename dsc and filesize, so skip them */ + patchfile = (TfaPatch_t *)patchdsc; + + patchheader = patchfile->data; + + checkaddress = (patchheader[1] << 8) + patchheader[2]; + checkvalue = + (patchheader[3] << 16) + (patchheader[4] << 8) + patchheader[5]; + + devid = patchheader[0]; + + if (checkaddress == 0xFFFF && checkvalue != 0xFFFFFF && checkvalue != 0) { + devid = patchheader[5] << 8 | patchheader[0]; /* full revid */ + } + + return devid; +} + +/** + * get the firmware version from the patch in this devicelist + */ +int tfa_cnt_get_patch_version(struct tfa_device *tfa) +{ + TfaPatch_t *patchfile; + TfaDescPtr_t *patchdsc; + uint8_t *data; + int size, version; + + if (tfa->cnt == NULL) + return -1; + + patchdsc = tfa_cnt_get_dsc(tfa->cnt, dscPatch, tfa->dev_idx); + patchdsc += 2; /* first the filename dsc and filesize, so skip them */ + patchfile = (TfaPatch_t *)patchdsc; + + size = patchfile->hdr.size - sizeof(TfaPatch_t); + data = patchfile->data; + + version = (data[size - 3] << 16) + (data[size - 2] << 8) + data[size - 1]; + + return version; +} + + +/* + * get the slave for the device if it exists + */ +enum Tfa98xx_Error tfaContGetSlave(struct tfa_device *tfa, uint8_t *slave_addr) +{ + TfaDeviceList_t *dev = NULL; + + /* Make sure the cnt file is loaded */ + if (tfa->cnt != NULL) { + dev = tfaContDevice(tfa->cnt, tfa->dev_idx); + } + + if (dev == NULL) { + /* Check if slave argument is used! */ + if (gslave_address == 0) { + return Tfa98xx_Error_Bad_Parameter; + } else { + *slave_addr = gslave_address; + return Tfa98xx_Error_Ok; + } + } + + *slave_addr = dev->dev; + return Tfa98xx_Error_Ok; +} + +/* If no container file is given, we can always have used the slave argument */ +void tfaContSetSlave(uint8_t slave_addr) +{ + gslave_address = slave_addr; +} + +/* + * lookup slave and return device index + */ +int tfa_cont_get_idx(struct tfa_device *tfa) +{ + TfaDeviceList_t *dev = NULL; + int i; + + for (i = 0; i < tfa->cnt->ndev; i++) { + dev = tfaContDevice(tfa->cnt, i); + if (dev->dev == tfa->slave_address) + break; + + } + if (i == tfa->cnt->ndev) + return -1; + + return i; +} + +/* + * write a bit field + */ +enum Tfa98xx_Error tfaRunWriteBitfield(struct tfa_device *tfa, TfaBitfield_t bf) +{ + enum Tfa98xx_Error error; + uint16_t value; + union { + uint16_t field; + TfaBfEnum_t Enum; + } bfUni; + + value = bf.value; + bfUni.field = bf.field; +#ifdef TFA_DEBUG + if (tfa->verbose) + pr_debug("bitfield: %s=0x%x (0x%x[%d..%d]=0x%x)\n", tfaContBfName(bfUni.field, tfa->rev), value, + bfUni.Enum.address, bfUni.Enum.pos, bfUni.Enum.pos + bfUni.Enum.len, value); +#endif + error = tfa_set_bf(tfa, bfUni.field, value); + + return error; +} + +/* + * read a bit field + */ +enum Tfa98xx_Error tfaRunReadBitfield(struct tfa_device *tfa, TfaBitfield_t *bf) +{ + enum Tfa98xx_Error error; + union { + uint16_t field; + TfaBfEnum_t Enum; + } bfUni; + uint16_t regvalue, msk; + + bfUni.field = bf->field; + + error = reg_read(tfa, (unsigned char)(bfUni.Enum.address), ®value); + if (error) return error; + + msk = ((1 << (bfUni.Enum.len + 1)) - 1) << bfUni.Enum.pos; + + regvalue &= msk; + bf->value = regvalue >> bfUni.Enum.pos; + + return error; +} + +/* + dsp mem direct write + */ +static enum Tfa98xx_Error tfaRunWriteDspMem(struct tfa_device *tfa, TfaDspMem_t *cfmem) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int i; + + for (i = 0; i < cfmem->size; i++) { + if (tfa->verbose) + pr_debug("dsp mem (%d): 0x%02x=0x%04x\n", cfmem->type, cfmem->address, cfmem->words[i]); + + error = mem_write(tfa, cfmem->address++, cfmem->words[i], cfmem->type); + if (error) return error; + } + + return error; +} + +/* + * write filter payload to DSP + * note that the data is in an aligned union for all filter variants + * the aa data is used but it's the same for all of them + */ +static enum Tfa98xx_Error tfaRunWriteFilter(struct tfa_device *tfa, TfaContBiquad_t *bq) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + enum Tfa98xx_DMEM dmem; + uint16_t address; + uint8_t data[3 * 3 + sizeof(bq->aa.bytes)]; + int i, channel = 0, runs = 1; + int8_t saved_index = bq->aa.index; /* This is used to set back the index */ + + /* Channel=1 is primary, Channel=2 is secondary*/ + if (bq->aa.index > 100) { + bq->aa.index -= 100; + channel = 2; + } else if (bq->aa.index > 50) { + bq->aa.index -= 50; + channel = 1; + } else if ((tfa->rev & 0xff) == 0x88) { + runs = 2; + } + + if (tfa->verbose) { + if (channel == 2) + pr_debug("filter[%d,S]", bq->aa.index); + else if (channel == 1) + pr_debug("filter[%d,P]", bq->aa.index); + else + pr_debug("filter[%d]", bq->aa.index); + } + + for (i = 0; i < runs; i++) { + if (runs == 2) + channel++; + + /* get the target address for the filter on this device */ + dmem = tfa98xx_filter_mem(tfa, bq->aa.index, &address, channel); + if (dmem == Tfa98xx_DMEM_ERR) { + if (tfa->verbose) { + pr_debug("Warning: XFilter settings are applied via msg file (ini filter[x] format is skipped).\n"); + } + /* Dont exit with an error here, We could continue without problems */ + return Tfa98xx_Error_Ok; + } + + /* send a DSP memory message that targets the devices specific memory for the filter + * msg params: which_mem, start_offset, num_words + */ + memset(data, 0, 3 * 3); + data[2] = dmem; /* output[0] = which_mem */ + data[4] = address >> 8; /* output[1] = start_offset */ + data[5] = address & 0xff; + data[8] = sizeof(bq->aa.bytes) / 3; /*output[2] = num_words */ + memcpy(&data[9], bq->aa.bytes, sizeof(bq->aa.bytes)); /* payload */ + + if (tfa->tfa_family == 2) { + error = tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, FW_PAR_ID_SET_MEMORY, sizeof(data), data); + } else { + error = tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, 4 /* param */, sizeof(data), data); + } + } + +#ifdef TFA_DEBUG + if (tfa->verbose) { + if (bq->aa.index == 13) { + pr_debug("=%d,%.0f,%.2f\n", + bq->in.type, bq->in.cutOffFreq, bq->in.leakage); + } else if (bq->aa.index >= 10 && bq->aa.index <= 12) { + pr_debug("=%d,%.0f,%.1f,%.1f\n", bq->aa.type, + bq->aa.cutOffFreq, bq->aa.rippleDb, bq->aa.rolloff); + } else { + pr_debug("= unsupported filter index\n"); + } + } +#endif + + /* Because we can load the same filters multiple times + * For example: When we switch profile we re-write in operating mode. + * We then need to remember the index (primary, secondary or both) + */ + bq->aa.index = saved_index; + + return error; +} + +/* + * write the register based on the input address, value and mask + * only the part that is masked will be updated + */ +static enum Tfa98xx_Error tfaRunWriteRegister(struct tfa_device *tfa, TfaRegpatch_t *reg) +{ + enum Tfa98xx_Error error; + uint16_t value, newvalue; + + if (tfa->verbose) + pr_debug("register: 0x%02x=0x%04x (msk=0x%04x)\n", reg->address, reg->value, reg->mask); + + error = reg_read(tfa, reg->address, &value); + if (error) return error; + + value &= ~reg->mask; + newvalue = reg->value & reg->mask; + + value |= newvalue; + error = reg_write(tfa, reg->address, value); + + return error; + +} + +// write reg and bitfield items in the devicelist to the target +enum Tfa98xx_Error tfaContWriteRegsDev(struct tfa_device *tfa) +{ + TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); + TfaBitfield_t *bitF; + int i; + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + if (!dev) { + return Tfa98xx_Error_Bad_Parameter; + } + + /* process the list until a patch, file of profile is encountered */ + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == dscPatch || + dev->list[i].type == dscFile || + dev->list[i].type == dscProfile) break; + + if (dev->list[i].type == dscBitfield) { + bitF = (TfaBitfield_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); + err = tfaRunWriteBitfield(tfa, *bitF); + } + if (dev->list[i].type == dscRegister) { + err = tfaRunWriteRegister(tfa, (TfaRegpatch_t *)(dev->list[i].offset + (char *)tfa->cnt)); + } + + if (err) break; + } + + return err; +} + +// write reg and bitfield items in the profilelist the target +enum Tfa98xx_Error tfaContWriteRegsProf(struct tfa_device *tfa, int prof_idx) +{ + TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + TfaBitfield_t *bitf; + unsigned int i; + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + if (!prof) { + return Tfa98xx_Error_Bad_Parameter; + } + + if (tfa->verbose) + pr_debug("----- profile: %s (%d) -----\n", tfaContGetString(tfa->cnt, &prof->name), prof_idx); + + /* process the list until the end of the profile or the default section */ + for (i = 0; i < prof->length; i++) { + /* We only want to write the values before the default section when we switch profile */ + if (prof->list[i].type == dscDefault) + break; + + if (prof->list[i].type == dscBitfield) { + bitf = (TfaBitfield_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + err = tfaRunWriteBitfield(tfa, *bitf); + } + if (prof->list[i].type == dscRegister) { + err = tfaRunWriteRegister(tfa, (TfaRegpatch_t *)(prof->list[i].offset + (char *)tfa->cnt)); + } + if (err) break; + } + return err; +} + +// write patchfile in the devicelist to the target +enum Tfa98xx_Error tfaContWritePatch(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); + TfaFileDsc_t *file; + TfaPatch_t *patchfile; + int size, i; + + if (!dev) { + return Tfa98xx_Error_Bad_Parameter; + } + /* process the list until a patch is encountered */ + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == dscPatch) { + file = (TfaFileDsc_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); + patchfile = (TfaPatch_t *)&file->data; + if (tfa->verbose) tfaContShowHeader(&patchfile->hdr); + size = patchfile->hdr.size - sizeof(TfaPatch_t); // size is total length + err = tfa_dsp_patch(tfa, size, (const unsigned char *)patchfile->data); + if (err) return err; + } + } + + return Tfa98xx_Error_Ok; +} + +/** + * Create a buffer which can be used to send to the dsp. + */ +static void create_dsp_buffer_msg(struct tfa_device *tfa, TfaMsg_t *msg, char *buffer, int *size) +{ + int i, nr = 0; + + (void)tfa; + + /* Copy cmdId. Remember that the cmdId is reversed */ + buffer[nr++] = msg->cmdId[2]; + buffer[nr++] = msg->cmdId[1]; + buffer[nr++] = msg->cmdId[0]; + + /* Copy the data to the buffer */ + for (i = 0; i < msg->msg_size; i++) { + buffer[nr++] = (uint8_t)((msg->data[i] >> 16) & 0xffff); + buffer[nr++] = (uint8_t)((msg->data[i] >> 8) & 0xff); + buffer[nr++] = (uint8_t)(msg->data[i] & 0xff); + } + + *size = nr; +} + +// write all param files in the devicelist to the target +enum Tfa98xx_Error tfaContWriteFiles(struct tfa_device *tfa) +{ + TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); + TfaFileDsc_t *file; + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + char buffer[(MEMTRACK_MAX_WORDS * 3) + 3] = { 0 }; //every word requires 3 and 3 is the msg + int i, size = 0; + + if (!dev) { + return Tfa98xx_Error_Bad_Parameter; + } + /* process the list and write all files */ + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == dscFile) { + file = (TfaFileDsc_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); + if (tfaContWriteFile(tfa, file, 0, TFA_MAX_VSTEP_MSG_MARKER)) { + return Tfa98xx_Error_Bad_Parameter; + } + } + + if (dev->list[i].type == dscSetInputSelect || + dev->list[i].type == dscSetOutputSelect || + dev->list[i].type == dscSetProgramConfig || + dev->list[i].type == dscSetLagW || + dev->list[i].type == dscSetGains || + dev->list[i].type == dscSetvBatFactors || + dev->list[i].type == dscSetSensesCal || + dev->list[i].type == dscSetSensesDelay || + dev->list[i].type == dscSetMBDrc || + dev->list[i].type == dscSetFwkUseCase || + dev->list[i].type == dscSetVddpConfig) { + create_dsp_buffer_msg(tfa, (TfaMsg_t *) + (dev->list[i].offset + (char *)tfa->cnt), buffer, &size); + if (tfa->verbose) { + pr_debug("command: %s=0x%02x%02x%02x\n", + tfaContGetCommandString(dev->list[i].type), + (unsigned char)buffer[0], (unsigned char)buffer[1], (unsigned char)buffer[2]); + } + + err = dsp_msg(tfa, size, buffer); + } + + if (dev->list[i].type == dscCmd) { + size = *(uint16_t *)(dev->list[i].offset + (char *)tfa->cnt); + + err = dsp_msg(tfa, size, dev->list[i].offset + 2 + (char *)tfa->cnt); + if (tfa->verbose) { + const char *cmd_id = dev->list[i].offset + 2 + (char *)tfa->cnt; + + pr_debug("Writing cmd=0x%02x%02x%02x\n", (uint8_t)cmd_id[0], (uint8_t)cmd_id[1], (uint8_t)cmd_id[2]); + } + } + if (err != Tfa98xx_Error_Ok) + break; + + if (dev->list[i].type == dscCfMem) { + err = tfaRunWriteDspMem(tfa, (TfaDspMem_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt)); + } + + if (err != Tfa98xx_Error_Ok) + break; + } + + return err; +} + +/* + * write all param files in the profilelist to the target + * this is used during startup when maybe ACS is set + */ +enum Tfa98xx_Error tfaContWriteFilesProf(struct tfa_device *tfa, int prof_idx, int vstep_idx) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + char buffer[(MEMTRACK_MAX_WORDS * 3) + 3] = { 0 }; //every word requires 3 and 3 is the msg + unsigned int i; + TfaFileDsc_t *file; + TfaPatch_t *patchfile; + int size; + + if (!prof) { + return Tfa98xx_Error_Bad_Parameter; + } + + /* process the list and write all files */ + for (i = 0; i < prof->length; i++) { + switch (prof->list[i].type) { + case dscFile: + file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + err = tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER); + break; + case dscPatch: + file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + patchfile = (TfaPatch_t *)&file->data; + if (tfa->verbose) tfaContShowHeader(&patchfile->hdr); + size = patchfile->hdr.size - sizeof(TfaPatch_t); // size is total length + err = tfa_dsp_patch(tfa, size, (const unsigned char *)patchfile->data); + break; + case dscCfMem: + err = tfaRunWriteDspMem(tfa, (TfaDspMem_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt)); + break; + case dscSetInputSelect: + case dscSetOutputSelect: + case dscSetProgramConfig: + case dscSetLagW: + case dscSetGains: + case dscSetvBatFactors: + case dscSetSensesCal: + case dscSetSensesDelay: + case dscSetMBDrc: + case dscSetFwkUseCase: + case dscSetVddpConfig: + create_dsp_buffer_msg(tfa, (TfaMsg_t *) + (prof->list[i].offset + (uint8_t *)tfa->cnt), buffer, &size); + if (tfa->verbose) { + pr_debug("command: %s=0x%02x%02x%02x\n", + tfaContGetCommandString(prof->list[i].type), + (unsigned char)buffer[0], (unsigned char)buffer[1], (unsigned char)buffer[2]); + } + + err = dsp_msg(tfa, size, buffer); + break; + case dscCmd: + size = *(uint16_t *)(prof->list[i].offset + (char *)tfa->cnt); + + err = dsp_msg(tfa, size, prof->list[i].offset + 2 + (char *)tfa->cnt); + if (tfa->verbose) { + const char *cmd_id = prof->list[i].offset + 2 + (char *)tfa->cnt; + + pr_debug("Writing cmd=0x%02x%02x%02x\n", (uint8_t)cmd_id[0], (uint8_t)cmd_id[1], (uint8_t)cmd_id[2]); + } + break; + default: + /* ignore any other type */ + break; + } + } + + return err; +} + +static enum Tfa98xx_Error tfaContWriteItem(struct tfa_device *tfa, TfaDescPtr_t *dsc) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaRegpatch_t *reg; + TfaMode_t *cas; + TfaBitfield_t *bitf; + + // When no DSP should only write to HW registers. + if (tfa->ext_dsp == 0 && !(dsc->type == dscBitfield || dsc->type == dscRegister)) { + return Tfa98xx_Error_Ok; + } + + switch (dsc->type) { + case dscDefault: + case dscDevice: // ignore + case dscProfile: // profile list + break; + case dscRegister: // register patch + reg = (TfaRegpatch_t *)(dsc->offset + (uint8_t *)tfa->cnt); + return tfaRunWriteRegister(tfa, reg); + //pr_debug("$0x%2x=0x%02x,0x%02x\n", reg->address, reg->mask, reg->value); + break; + case dscString: // ascii: zero terminated string + pr_debug(";string: %s\n", tfaContGetString(tfa->cnt, dsc)); + break; + case dscFile: // filename + file contents + case dscPatch: + break; + case dscMode: + cas = (TfaMode_t *)(dsc->offset + (uint8_t *)tfa->cnt); + if (cas->value == Tfa98xx_Mode_RCV) + tfa98xx_select_mode(tfa, Tfa98xx_Mode_RCV); + else + tfa98xx_select_mode(tfa, Tfa98xx_Mode_Normal); + break; + case dscCfMem: + err = tfaRunWriteDspMem(tfa, (TfaDspMem_t *)(dsc->offset + (uint8_t *)tfa->cnt)); + break; + case dscBitfield: + bitf = (TfaBitfield_t *)(dsc->offset + (uint8_t *)tfa->cnt); + return tfaRunWriteBitfield(tfa, *bitf); + break; + case dscFilter: + return tfaRunWriteFilter(tfa, (TfaContBiquad_t *)(dsc->offset + (uint8_t *)tfa->cnt)); + break; + } + + return err; +} + +static unsigned int tfa98xx_sr_from_field(unsigned int field) +{ + switch (field) { + case 0: + return 8000; + case 1: + return 11025; + case 2: + return 12000; + case 3: + return 16000; + case 4: + return 22050; + case 5: + return 24000; + case 6: + return 32000; + case 7: + return 44100; + case 8: + return 48000; + default: + return 0; + } +} + +enum Tfa98xx_Error tfa_write_filters(struct tfa_device *tfa, int prof_idx) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + unsigned int i; + int status; + + if (!prof) { + return Tfa98xx_Error_Bad_Parameter; + } + + if (tfa->verbose) { + pr_debug("----- profile: %s (%d) -----\n", tfaContGetString(tfa->cnt, &prof->name), prof_idx); + pr_debug("Waiting for CLKS...\n"); + } + + for (i = 10; i > 0; i--) { + err = tfa98xx_dsp_system_stable(tfa, &status); + if (status) + break; + else + msleep_interruptible(10); + } + + if (i == 0) { + if (tfa->verbose) + pr_err("Unable to write filters, CLKS=0\n"); + + return Tfa98xx_Error_StateTimedOut; + } + + /* process the list until the end of the profile or the default section */ + for (i = 0; i < prof->length; i++) { + if (prof->list[i].type == dscFilter) { + if (tfaContWriteItem(tfa, &prof->list[i]) != Tfa98xx_Error_Ok) + return Tfa98xx_Error_Bad_Parameter; + } + } + + return err; +} + +unsigned int tfa98xx_get_profile_sr(struct tfa_device *tfa, unsigned int prof_idx) +{ + TfaBitfield_t *bitf; + unsigned int i; + TfaDeviceList_t *dev; + TfaProfileList_t *prof; + int fs_profile = -1; + + dev = tfaContDevice(tfa->cnt, tfa->dev_idx); + if (!dev) + return 0; + + prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + if (!prof) + return 0; + + /* Check profile fields first */ + for (i = 0; i < prof->length; i++) { + if (prof->list[i].type == dscDefault) + break; + + /* check for profile settingd (AUDFS) */ + if (prof->list[i].type == dscBitfield) { + bitf = (TfaBitfield_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + if (bitf->field == TFA_FAM(tfa, AUDFS)) { + fs_profile = bitf->value; + break; + } + } + } + + if (tfa->verbose) + pr_debug("%s - profile fs: 0x%x = %dHz (%d - %d)\n", + __func__, fs_profile, + tfa98xx_sr_from_field(fs_profile), + tfa->dev_idx, prof_idx); + + if (fs_profile != -1) + return tfa98xx_sr_from_field(fs_profile); + + /* Check for container default setting */ + /* process the list until a patch, file of profile is encountered */ + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == dscPatch || + dev->list[i].type == dscFile || + dev->list[i].type == dscProfile) + break; + + if (dev->list[i].type == dscBitfield) { + bitf = (TfaBitfield_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); + if (bitf->field == TFA_FAM(tfa, AUDFS)) { + fs_profile = bitf->value; + break; + } + } + /* Ignore register case */ + } + + if (tfa->verbose) + pr_debug("%s - default fs: 0x%x = %dHz (%d - %d)\n", + __func__, fs_profile, + tfa98xx_sr_from_field(fs_profile), + tfa->dev_idx, prof_idx); + + if (fs_profile != -1) + return tfa98xx_sr_from_field(fs_profile); + + return 48000; /* default of HW */ +} + +static enum Tfa98xx_Error get_sample_rate_info(struct tfa_device *tfa, TfaProfileList_t *prof, TfaProfileList_t *previous_prof, int fs_previous_profile) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaBitfield_t *bitf; + unsigned int i; + int fs_default_profile = 8; /* default is 48kHz */ + int fs_next_profile = 8; /* default is 48kHz */ + + + /* ---------- default settings previous profile ---------- */ + for (i = 0; i < previous_prof->length; i++) { + /* Search for the default section */ + if (i == 0) { + while (previous_prof->list[i].type != dscDefault && i < previous_prof->length) { + i++; + } + i++; + } + + /* Only if we found the default section search for AUDFS */ + if (i < previous_prof->length) { + if (previous_prof->list[i].type == dscBitfield) { + bitf = (TfaBitfield_t *)(previous_prof->list[i].offset + (uint8_t *)tfa->cnt); + if (bitf->field == TFA_FAM(tfa, AUDFS)) { + fs_default_profile = bitf->value; + break; + } + } + } + } + + /* ---------- settings next profile ---------- */ + for (i = 0; i < prof->length; i++) { + /* We only want to write the values before the default section */ + if (prof->list[i].type == dscDefault) + break; + /* search for AUDFS */ + if (prof->list[i].type == dscBitfield) { + bitf = (TfaBitfield_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + if (bitf->field == TFA_FAM(tfa, AUDFS)) { + fs_next_profile = bitf->value; + break; + } + } + } + + /* Enable if needed for debugging! + if (tfa->verbose) { + pr_debug("sample rate from the previous profile: %d\n", fs_previous_profile); + pr_debug("sample rate in the default section: %d\n", fs_default_profile); + pr_debug("sample rate for the next profile: %d\n", fs_next_profile); + } + */ + + if (fs_next_profile != fs_default_profile) { + if (tfa->verbose) + pr_debug("Writing delay tables for AUDFS=%d\n", fs_next_profile); + + /* If the AUDFS from the next profile is not the same as + * the AUDFS from the default we need to write new delay tables + */ + err = tfa98xx_dsp_write_tables(tfa, fs_next_profile); + } else if (fs_default_profile != fs_previous_profile) { + if (tfa->verbose) + pr_debug("Writing delay tables for AUDFS=%d\n", fs_default_profile); + + /* But if we do not have a new AUDFS in the next profile and + * the AUDFS from the default profile is not the same as the AUDFS + * from the previous profile we also need to write new delay tables + */ + err = tfa98xx_dsp_write_tables(tfa, fs_default_profile); + } + + return err; +} + +/* + * process all items in the profilelist + * NOTE an error return during processing will leave the device muted + * + */ +enum Tfa98xx_Error tfaContWriteProfile(struct tfa_device *tfa, int prof_idx, int vstep_idx) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + TfaProfileList_t *previous_prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, tfa_dev_get_swprof(tfa)); + char buffer[(MEMTRACK_MAX_WORDS * 4) + 4] = { 0 }; //every word requires 3 or 4 bytes, and 3 or 4 is the msg + unsigned int i, k = 0, j = 0, tries = 0; + TfaFileDsc_t *file; + int size = 0, ready, fs_previous_profile = 8; /* default fs is 48kHz*/ + + if (!prof || !previous_prof) { + pr_err("Error trying to get the (previous) swprofile\n"); + return Tfa98xx_Error_Bad_Parameter; + } + + if (tfa->verbose) { + tfa98xx_trace_printk("device:%s profile:%s vstep:%d\n", tfaContDeviceName(tfa->cnt, tfa->dev_idx), + tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx), vstep_idx); + } + + /* We only make a power cycle when the profiles are not in the same group */ + if (prof->group == previous_prof->group && prof->group != 0) { + if (tfa->verbose) { + pr_debug("The new profile (%s) is in the same group as the current profile (%s)\n", + tfaContGetString(tfa->cnt, &prof->name), tfaContGetString(tfa->cnt, &previous_prof->name)); + } + } else { + /* mute */ + err = tfaRunMute(tfa); + if (err) return err; + + /* Get current sample rate before we start switching */ + fs_previous_profile = TFA_GET_BF(tfa, AUDFS); + + /* clear SBSL to make sure we stay in initCF state */ + if (tfa->tfa_family == 2) { + TFA_SET_BF_VOLATILE(tfa, SBSL, 0); + } + + /* When we switch profile we first power down the subsystem + * This should only be done when we are in operating mode + */ + if (((tfa->tfa_family == 2) && (TFA_GET_BF(tfa, MANSTATE) >= 6)) || (tfa->tfa_family != 2)) { + err = tfa98xx_powerdown(tfa, 1); + if (err) return err; + + /* Wait until we are in PLL powerdown */ + do { + err = tfa98xx_dsp_system_stable(tfa, &ready); + if (!ready) + break; + else + msleep_interruptible(10); /* wait 10ms to avoid busload */ + tries++; + } while (tries <= 100); + + if (tries > 100) { + pr_debug("Wait for PLL powerdown timed out!\n"); + return Tfa98xx_Error_StateTimedOut; + } + } else { + pr_debug("No need to go to powerdown now\n"); + } + } + + /* set all bitfield settings */ + /* First set all default settings */ + if (tfa->verbose) { + pr_debug("---------- default settings profile: %s (%d) ----------\n", + tfaContGetString(tfa->cnt, &previous_prof->name), tfa_dev_get_swprof(tfa)); + } + + err = show_current_state(tfa); + + /* Loop profile length */ + for (i = 0; i < previous_prof->length; i++) { + /* Search for the default section */ + if (i == 0) { + while (previous_prof->list[i].type != dscDefault && i < previous_prof->length) { + i++; + } + i++; + } + + /* Only if we found the default section try writing the items */ + if (i < previous_prof->length) { + if (tfaContWriteItem(tfa, &previous_prof->list[i]) != Tfa98xx_Error_Ok) + return Tfa98xx_Error_Bad_Parameter; + } + } + + if (tfa->verbose) + pr_debug("---------- new settings profile: %s (%d) ----------\n", + tfaContGetString(tfa->cnt, &prof->name), prof_idx); + + /* set new settings */ + for (i = 0; i < prof->length; i++) { + /* Remember where we currently are with writing items*/ + j = i; + + /* We only want to write the values before the default section when we switch profile */ + /* process and write all non-file items */ + switch (prof->list[i].type) { + case dscFile: + case dscPatch: + case dscSetInputSelect: + case dscSetOutputSelect: + case dscSetProgramConfig: + case dscSetLagW: + case dscSetGains: + case dscSetvBatFactors: + case dscSetSensesCal: + case dscSetSensesDelay: + case dscSetMBDrc: + case dscSetFwkUseCase: + case dscSetVddpConfig: + case dscCmd: + case dscFilter: + case dscDefault: + /* When one of these files are found, we exit */ + i = prof->length; + break; + default: + err = tfaContWriteItem(tfa, &prof->list[i]); + if (err != Tfa98xx_Error_Ok) + return Tfa98xx_Error_Bad_Parameter; + break; + } + } + + if (prof->group != previous_prof->group || prof->group == 0) { + if (tfa->tfa_family == 2) + TFA_SET_BF_VOLATILE(tfa, MANSCONF, 1); + + /* Leave powerdown state */ + err = tfa_cf_powerup(tfa); + if (err) return err; + + err = show_current_state(tfa); + + if (tfa->tfa_family == 2) { + /* Reset SBSL to 0 (workaround of enbl_powerswitch=0) */ + TFA_SET_BF_VOLATILE(tfa, SBSL, 0); + /* Sending commands to DSP we need to make sure RST is 0 (otherwise we get no response)*/ + TFA_SET_BF(tfa, RST, 0); + } + } + + /* Check if there are sample rate changes */ + err = get_sample_rate_info(tfa, prof, previous_prof, fs_previous_profile); + if (err) return err; + + + /* Write files from previous profile (default section) + * Should only be used for the patch&trap patch (file) + */ + if (tfa->ext_dsp != 0) { + if (tfa->tfa_family == 2) { + for (i = 0; i < previous_prof->length; i++) { + /* Search for the default section */ + if (i == 0) { + while (previous_prof->list[i].type != dscDefault && i < previous_prof->length) { + i++; + } + i++; + } + + /* Only if we found the default section try writing the file */ + if (i < previous_prof->length) { + if (previous_prof->list[i].type == dscFile || previous_prof->list[i].type == dscPatch) { + /* Only write this once */ + if (tfa->verbose && k == 0) { + pr_debug("---------- files default profile: %s (%d) ----------\n", + tfaContGetString(tfa->cnt, &previous_prof->name), prof_idx); + k++; + } + file = (TfaFileDsc_t *)(previous_prof->list[i].offset + (uint8_t *)tfa->cnt); + err = tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER); + } + } + } + } + + if (tfa->verbose) { + pr_debug("---------- files new profile: %s (%d) ----------\n", + tfaContGetString(tfa->cnt, &prof->name), prof_idx); + } + } + + /* write everything until end or the default section starts + * Start where we currenly left */ + for (i = j; i < prof->length; i++) { + /* We only want to write the values before the default section when we switch profile */ + + if (prof->list[i].type == dscDefault) { + break; + } + + switch (prof->list[i].type) { + case dscFile: + case dscPatch: + /* For tiberius stereo 1 device does not have a dsp! */ + if (tfa->ext_dsp != 0) { + file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + err = tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER); + } + break; + case dscSetInputSelect: + case dscSetOutputSelect: + case dscSetProgramConfig: + case dscSetLagW: + case dscSetGains: + case dscSetvBatFactors: + case dscSetSensesCal: + case dscSetSensesDelay: + case dscSetMBDrc: + case dscSetFwkUseCase: + case dscSetVddpConfig: + /* For tiberius stereo 1 device does not have a dsp! */ + if (tfa->ext_dsp != 0) { + create_dsp_buffer_msg(tfa, (TfaMsg_t *) + (prof->list[i].offset + (char *)tfa->cnt), buffer, &size); + err = dsp_msg(tfa, size, buffer); + + if (tfa->verbose) { + pr_debug("command: %s=0x%02x%02x%02x\n", + tfaContGetCommandString(prof->list[i].type), + (unsigned char)buffer[0], (unsigned char)buffer[1], (unsigned char)buffer[2]); + } + } + break; + case dscCmd: + /* For tiberius stereo 1 device does not have a dsp! */ + if (tfa->ext_dsp != 0) { + size = *(uint16_t *)(prof->list[i].offset + (char *)tfa->cnt); + err = dsp_msg(tfa, size, prof->list[i].offset + 2 + (char *)tfa->cnt); + if (tfa->verbose) { + const char *cmd_id = prof->list[i].offset + 2 + (char *)tfa->cnt; + + pr_debug("Writing cmd=0x%02x%02x%02x\n", (uint8_t)cmd_id[0], (uint8_t)cmd_id[1], (uint8_t)cmd_id[2]); + } + } + break; + default: + /* This allows us to write bitfield, registers or xmem after files */ + if (tfaContWriteItem(tfa, &prof->list[i]) != Tfa98xx_Error_Ok) { + return Tfa98xx_Error_Bad_Parameter; + } + break; + } + + if (err != Tfa98xx_Error_Ok) { + return err; + } + } + + if ((prof->group != previous_prof->group || prof->group == 0) && (tfa->tfa_family == 2)) { + if (TFA_GET_BF(tfa, REFCKSEL) == 0) { + /* set SBSL to go to operation mode */ + TFA_SET_BF_VOLATILE(tfa, SBSL, 1); + } + } + + return err; +} + +/* + * process only vstep in the profilelist + * + */ +enum Tfa98xx_Error tfaContWriteFilesVstep(struct tfa_device *tfa, int prof_idx, int vstep_idx) +{ + TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + unsigned int i; + TfaFileDsc_t *file; + TfaHeader_t *hdr; + TfaHeaderType_t type; + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + if (!prof) + return Tfa98xx_Error_Bad_Parameter; + + if (tfa->verbose) + tfa98xx_trace_printk("device:%s profile:%s vstep:%d\n", tfaContDeviceName(tfa->cnt, tfa->dev_idx), + tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx), vstep_idx); + + /* write vstep file only! */ + for (i = 0; i < prof->length; i++) { + if (prof->list[i].type == dscFile) { + file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); + hdr = (TfaHeader_t *)file->data; + type = (TfaHeaderType_t)hdr->id; + + switch (type) { + case volstepHdr: + if (tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER)) + return Tfa98xx_Error_Bad_Parameter; + break; + default: + break; + } + } + } + + return err; +} + +char *tfaContGetString(TfaContainer_t *cnt, TfaDescPtr_t *dsc) +{ + if (dsc->type != dscString) + return "Undefined string"; + + return dsc->offset + (char *)cnt; +} + +char *tfaContGetCommandString(uint32_t type) +{ + if (type == dscSetInputSelect) + return "SetInputSelector"; + else if (type == dscSetOutputSelect) + return "SetOutputSelector"; + else if (type == dscSetProgramConfig) + return "SetProgramConfig"; + else if (type == dscSetLagW) + return "SetLagW"; + else if (type == dscSetGains) + return "SetGains"; + else if (type == dscSetvBatFactors) + return "SetvBatFactors"; + else if (type == dscSetSensesCal) + return "SetSensesCal"; + else if (type == dscSetSensesDelay) + return "SetSensesDelay"; + else if (type == dscSetMBDrc) + return "SetMBDrc"; + else if (type == dscSetFwkUseCase) + return "SetFwkUseCase"; + else if (type == dscSetVddpConfig) + return "SetVddpConfig"; + else if (type == dscFilter) + return "filter"; + else + return "Undefined string"; +} + +/* + * Get the name of the device at a certain index in the container file + * return device name + */ +char *tfaContDeviceName(TfaContainer_t *cnt, int dev_idx) +{ + TfaDeviceList_t *dev; + + dev = tfaContDevice(cnt, dev_idx); + if (dev == NULL) + return "!ERROR!"; + + return tfaContGetString(cnt, &dev->name); +} + +/* + * Get the application name from the container file application field + * note that the input stringbuffer should be sizeof(application field)+1 + * + */ +int tfa_cnt_get_app_name(struct tfa_device *tfa, char *name) +{ + unsigned int i; + int len = 0; + + for (i = 0; i < sizeof(tfa->cnt->application); i++) { + if (isalnum(tfa->cnt->application[i])) /* copy char if valid */ + name[len++] = tfa->cnt->application[i]; + if (tfa->cnt->application[i] == '\0') + break; + } + name[len++] = '\0'; + + return len; +} + +/* + * Get profile index of the calibration profile. + * Returns: (profile index) if found, (-2) if no + * calibration profile is found or (-1) on error + */ +int tfaContGetCalProfile(struct tfa_device *tfa) +{ + int prof, cal_idx = -2; + + if ((tfa->dev_idx < 0) || (tfa->dev_idx >= tfa->cnt->ndev)) + return -1; + + /* search for the calibration profile in the list of profiles */ + for (prof = 0; prof < tfa->cnt->nprof; prof++) { + if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, prof), ".cal") != NULL) { + cal_idx = prof; + pr_debug("Using calibration profile: '%s'\n", tfaContProfileName(tfa->cnt, tfa->dev_idx, prof)); + break; + } + } + + return cal_idx; +} + +/** + * Is the profile a tap profile + */ +int tfaContIsTapProfile(struct tfa_device *tfa, int prof_idx) +{ + if ((tfa->dev_idx < 0) || (tfa->dev_idx >= tfa->cnt->ndev)) + return -1; + + /* Check if next profile is tap profile */ + if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx), ".tap") != NULL) { + pr_debug("Using Tap profile: '%s'\n", tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx)); + return 1; + } + + return 0; +} + +/* + * Get the name of the profile at certain index for a device in the container file + * return profile name + */ +char *tfaContProfileName(TfaContainer_t *cnt, int dev_idx, int prof_idx) +{ + TfaProfileList_t *prof = NULL; + + /* the Nth profiles for this device */ + prof = tfaContGetDevProfList(cnt, dev_idx, prof_idx); + + /* If the index is out of bound */ + if (prof == NULL) + return "NONE"; + + return tfaContGetString(cnt, &prof->name); +} + +/* + * return 1st profile list + */ +TfaProfileList_t *tfaContGet1stProfList(TfaContainer_t *cont) +{ + TfaProfileList_t *prof; + uint8_t *b = (uint8_t *)cont; + + int maxdev = 0; + TfaDeviceList_t *dev; + + // get nr of devlists + maxdev = cont->ndev; + // get last devlist + dev = tfaContGetDevList(cont, maxdev - 1); + if (dev == NULL) + return NULL; + // the 1st profile starts after the last device list + b = (uint8_t *)dev + sizeof(TfaDeviceList_t) + dev->length * (sizeof(TfaDescPtr_t)); + prof = (TfaProfileList_t *)b; + return prof; +} + +/* + * return 1st livedata list + */ +TfaLiveDataList_t *tfaContGet1stLiveDataList(TfaContainer_t *cont) +{ + TfaLiveDataList_t *ldata; + TfaProfileList_t *prof; + TfaDeviceList_t *dev; + uint8_t *b = (uint8_t *)cont; + int maxdev, maxprof; + + // get nr of devlists+1 + maxdev = cont->ndev; + // get nr of proflists + maxprof = cont->nprof; + + // get last devlist + dev = tfaContGetDevList(cont, maxdev - 1); + // the 1st livedata starts after the last device list + b = (uint8_t *)dev + sizeof(TfaDeviceList_t) + + dev->length * (sizeof(TfaDescPtr_t)); + + while (maxprof != 0) { + // get last proflist + prof = (TfaProfileList_t *)b; + b += sizeof(TfaProfileList_t) + + ((prof->length - 1) * (sizeof(TfaDescPtr_t))); + maxprof--; + } + + /* Else the marker falls off */ + b += 4; //bytes + + ldata = (TfaLiveDataList_t *)b; + return ldata; +} + +/* + * return the device list pointer + */ +TfaDeviceList_t *tfaContDevice(TfaContainer_t *cnt, int dev_idx) +{ + return tfaContGetDevList(cnt, dev_idx); +} + +/* + * return the next profile: + * - assume that all profiles are adjacent + * - calculate the total length of the input + * - the input profile + its length is the next profile + */ +TfaProfileList_t *tfaContNextProfile(TfaProfileList_t *prof) +{ + uint8_t *this, *next; /* byte pointers for byte pointer arithmetic */ + TfaProfileList_t *nextprof; + int listlength; /* total length of list in bytes */ + + if (prof == NULL) + return NULL; + + if (prof->ID != TFA_PROFID) + return NULL; /* invalid input */ + + this = (uint8_t *)prof; + /* nr of items in the list, length includes name dsc so - 1*/ + listlength = (prof->length - 1) * sizeof(TfaDescPtr_t); + /* the sizeof(TfaProfileList_t) includes the list[0] length */ + next = this + listlength + sizeof(TfaProfileList_t);// - sizeof(TfaDescPtr_t); + nextprof = (TfaProfileList_t *)next; + + if (nextprof->ID != TFA_PROFID) + return NULL; + + return nextprof; +} + +/* + * return the next livedata + */ +TfaLiveDataList_t *tfaContNextLiveData(TfaLiveDataList_t *livedata) +{ + TfaLiveDataList_t *nextlivedata = (TfaLiveDataList_t *)((char *)livedata + (livedata->length * 4) + + sizeof(TfaLiveDataList_t) - 4); + + if (nextlivedata->ID == TFA_LIVEDATAID) + return nextlivedata; + + return NULL; +} + +/* + * check CRC for container + * CRC is calculated over the bytes following the CRC field + * + * return non zero value on error + */ +int tfaContCrcCheckContainer(TfaContainer_t *cont) +{ + uint8_t *base; + size_t size; + uint32_t crc; + + base = (uint8_t *)&cont->CRC + 4; // ptr to bytes following the CRC field + size = (size_t)(cont->size - (base - (uint8_t *)cont)); // nr of bytes following the CRC field + crc = ~crc32_le(~0u, base, size); + + return crc != cont->CRC; +} + +static void get_all_features_from_cnt(struct tfa_device *tfa, int *hw_feature_register, int sw_feature_register[2]) +{ + TfaFeatures_t *features; + int i; + + TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); + + /* Init values in case no keyword is defined in cnt file: */ + *hw_feature_register = -1; + sw_feature_register[0] = -1; + sw_feature_register[1] = -1; + + if (dev == NULL) + return; + + // process the device list + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == dscFeatures) { + features = (TfaFeatures_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); + *hw_feature_register = features->value[0]; + sw_feature_register[0] = features->value[1]; + sw_feature_register[1] = features->value[2]; + break; + } + } +} + +/* wrapper function */ +void get_hw_features_from_cnt(struct tfa_device *tfa, int *hw_feature_register) +{ + int sw_feature_register[2]; + + get_all_features_from_cnt(tfa, hw_feature_register, sw_feature_register); +} + +/* wrapper function */ +void get_sw_features_from_cnt(struct tfa_device *tfa, int sw_feature_register[2]) +{ + int hw_feature_register; + + get_all_features_from_cnt(tfa, &hw_feature_register, sw_feature_register); +} + +enum Tfa98xx_Error tfa98xx_factory_trimmer(struct tfa_device *tfa) +{ + return (tfa->dev_ops.factory_trimmer)(tfa); +} + +enum Tfa98xx_Error tfa_set_filters(struct tfa_device *tfa, int prof_idx) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); + unsigned int i; + + if (!prof) + return Tfa98xx_Error_Bad_Parameter; + + /* If we are in powerdown there is no need to set filters */ + if (TFA_GET_BF(tfa, PWDN) == 1) + return Tfa98xx_Error_Ok; + + /* loop the profile to find filter settings */ + for (i = 0; i < prof->length; i++) { + /* We only want to write the values before the default section */ + if (prof->list[i].type == dscDefault) + break; + + /* write all filter settings */ + if (prof->list[i].type == dscFilter) { + if (tfaContWriteItem(tfa, &prof->list[i]) != Tfa98xx_Error_Ok) + return err; + } + } + + return err; +} + +int tfa_tib_dsp_msgmulti(struct tfa_device *tfa, int length, const char *buffer) +{ + uint8_t *buf = (uint8_t *)buffer; + static uint8_t *blob = NULL, *blobptr; /* TODO: not multi-thread safe */ + static int total; /* TODO: not multi-thread safe */ + int post_len = 0; + + /* checks for 24b_BE or 32_LE */ + int len_word_in_bytes = (tfa->convert_dsp32) ? 4 : 3; + /* TODO: get rid of these magic constants max size should depend on the tfa device type */ + int tfadsp_max_msg_size = (tfa->convert_dsp32) ? 5336 : 4000; + + /* No data found*/ + if (length == -1 && blob == NULL) { + return -1; + } + + if (length == -1) { + int i; + /* set last length field to zero */ + for (i = total; i < (total + len_word_in_bytes); i++) { + blob[i] = 0; + } + total += len_word_in_bytes; + memcpy(buf, blob, total); + + kfree(blob); + blob = NULL; /* Set to NULL pointer, otherwise no new malloc is done! */ + return total; + } + + if (blob == NULL) { + if (tfa->verbose) + pr_debug("%s, Creating the multi-message\n\n", __func__); + + blob = kmalloc(tfadsp_max_msg_size, GFP_KERNEL); + /* add command ID for multi-msg = 0x008015 */ + if (tfa->convert_dsp32) { + blob[0] = 0x15; + blob[1] = 0x80; + blob[2] = 0x0; + blob[3] = 0x0; + } else { + blob[0] = 0x0; + blob[1] = 0x80; + blob[2] = 0x15; + } + blobptr = blob; + blobptr += len_word_in_bytes; + total = len_word_in_bytes; + } + + if (tfa->verbose) { + pr_debug("%s, id:0x%02x%02x%02x, length:%d\n", __func__, buf[0], buf[1], buf[2], length); + } + + /* check total message size after concatination */ + post_len = total + length + (2 * len_word_in_bytes); + if (post_len > tfadsp_max_msg_size) { + //pr_debug("New multi-message too large! (%d >= %d (max.)), current length: %d\n", post_len, tfadsp_max_msg_size, total); + return Tfa98xx_Error_Buffer_too_small; + } + + /* add length field (length in words) to the multi message */ + if (tfa->convert_dsp32) { + *blobptr++ = (uint8_t)((length / len_word_in_bytes) & 0xff); /* lsb */ + *blobptr++ = (uint8_t)(((length / len_word_in_bytes) & 0xff00) >> 8); /* msb */ + *blobptr++ = 0x0; + *blobptr++ = 0x0; + } else { + *blobptr++ = 0x0; + *blobptr++ = (uint8_t)(((length / len_word_in_bytes) & 0xff00) >> 8); /* msb */ + *blobptr++ = (uint8_t)((length / len_word_in_bytes) & 0xff); /* lsb */ + } + memcpy(blobptr, buf, length); + blobptr += length; + total += (length + len_word_in_bytes); + + /* SetRe25 message is always the last message of the multi-msg */ + if (tfa->convert_dsp32) { + if (buf[1] == 0x81 && buf[0] == SB_PARAM_SET_RE25C) { + return 1; /* 1 means last message is done! */ + } + } else { + if (buf[1] == 0x81 && buf[2] == SB_PARAM_SET_RE25C) { + return 1; /* 1 means last message is done! */ + } + } + + return 0; +} diff --git a/src/tfa_dsp.c b/src/tfa_dsp.c new file mode 100644 index 000000000000..9940944ef5b3 --- /dev/null +++ b/src/tfa_dsp.c @@ -0,0 +1,4265 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +#include "dbgprint.h" +#include "tfa_container.h" +#include "tfa.h" +#include "tfa98xx_tfafieldnames.h" +#include "tfa_internal.h" + +#ifdef __KERNEL__ + #ifdef pr_fmt + #undef pr_fmt + #endif + #define pr_fmt(fmt) "%s(): " fmt, __func__ +#endif + +/* handle macro for bitfield */ +#define TFA_MK_BF(reg, pos, len) ((reg<<8)|(pos<<4)|(len-1)) + +/* abstract family for register */ +#define FAM_TFA98XX_CF_CONTROLS (TFA_FAM(tfa, RST) >> 8) +#define FAM_TFA98XX_CF_MEM (TFA_FAM(tfa, MEMA) >> 8) +#define FAM_TFA98XX_MTP0 (TFA_FAM(tfa, MTPOTC) >> 8) +#define FAM_TFA98xx_INT_EN (TFA_FAM(tfa, INTENVDDS) >> 8) + +#define CF_STATUS_I2C_CMD_ACK 0x01 + +/* Defines below are used for irq function (this removed the genregs include) */ +#define TFA98XX_INTERRUPT_ENABLE_REG1 0x48 +#define TFA98XX_INTERRUPT_IN_REG1 0x44 +#define TFA98XX_INTERRUPT_OUT_REG1 0x40 +#define TFA98XX_STATUS_POLARITY_REG1 0x4c +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK 0x2 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MSK 0x1 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_POS 1 +#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_POS 0 +#define MIN_BATT_LEVEL 640 +#define MAX_BATT_LEVEL 670 +void tfanone_ops(struct tfa_device_ops *ops); +void tfa9872_ops(struct tfa_device_ops *ops); +void tfa9873_ops(struct tfa_device_ops *ops); +void tfa9874_ops(struct tfa_device_ops *ops); +void tfa9878_ops(struct tfa_device_ops *ops); +void tfa9912_ops(struct tfa_device_ops *ops); +void tfa9888_ops(struct tfa_device_ops *ops); +void tfa9891_ops(struct tfa_device_ops *ops); +void tfa9897_ops(struct tfa_device_ops *ops); +void tfa9896_ops(struct tfa_device_ops *ops); +void tfa9890_ops(struct tfa_device_ops *ops); +void tfa9895_ops(struct tfa_device_ops *ops); +void tfa9894_ops(struct tfa_device_ops *ops); + +#ifndef MIN +#define MIN(A, B) (A < B?A:B) +#endif + +/* retry values */ +#define CFSTABLE_TRIES 10 +#define AMPOFFWAIT_TRIES 50 +#define MTPBWAIT_TRIES 50 +#define MTPEX_WAIT_NTRIES 50 + +/* calibration done executed */ +#define TFA_MTPEX_POS TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_POS /**/ + +int tfa_get_calibration_info(struct tfa_device *tfa, int channel) +{ + return tfa->mohm[channel]; +} + +/* return sign extended tap pattern */ +int tfa_get_tap_pattern(struct tfa_device *tfa) +{ + int value = tfa_get_bf(tfa, TFA9912_BF_CFTAPPAT); + int bitshift; + uint8_t field_len = 1 + (TFA9912_BF_CFTAPPAT & 0x0f); /* length of bitfield */ + + bitshift = 8 * sizeof(int) - field_len; + /* signextend */ + value = (value << bitshift) >> bitshift; + + return value; +} +/* + * interrupt bit function to clear + */ +int tfa_irq_clear(struct tfa_device *tfa, enum tfa9912_irq bit) +{ + unsigned char reg; + + /* make bitfield enum */ + if (bit == tfa9912_irq_all) { + /* operate on all bits */ + for (reg = TFA98XX_INTERRUPT_IN_REG1; reg < TFA98XX_INTERRUPT_IN_REG1 + 3; reg++) + reg_write(tfa, reg, 0xffff); /* all bits */ + } else if (bit < tfa9912_irq_max) { + reg = (unsigned char)(TFA98XX_INTERRUPT_IN_REG1 + (bit >> 4)); + reg_write(tfa, reg, 1 << (bit & 0x0f)); /* only this bit */ + } else + return -1; + + return 0; +} +/* + * return state of irq or -1 if illegal bit + */ +int tfa_irq_get(struct tfa_device *tfa, enum tfa9912_irq bit) +{ + uint16_t value; + int reg, mask; + + if (bit < tfa9912_irq_max) { + /* only this bit */ + reg = TFA98XX_INTERRUPT_OUT_REG1 + (bit >> 4); + mask = 1 << (bit & 0x0f); + reg_read(tfa, (unsigned char)reg, &value); + } else + return -1; + + return (value & mask) != 0; +} +/* + * interrupt bit function that operates on the shadow regs in the handle + */ + +int tfa_irq_ena(struct tfa_device *tfa, enum tfa9912_irq bit, int state) +{ + uint16_t value, new_value; + int reg = 0, mask; + /* */ + if (bit == tfa9912_irq_all) { + /* operate on all bits */ + for (reg = TFA98XX_INTERRUPT_ENABLE_REG1; reg <= TFA98XX_INTERRUPT_ENABLE_REG1 + tfa9912_irq_max / 16; reg++) { + reg_write(tfa, (unsigned char)reg, state ? 0xffff : 0); /* all bits */ + tfa->interrupt_enable[reg - TFA98XX_INTERRUPT_ENABLE_REG1] = state ? 0xffff : 0; /* all bits */ + } + } else if (bit < tfa9912_irq_max) { + /* only this bit */ + reg = TFA98XX_INTERRUPT_ENABLE_REG1 + (bit >> 4); + mask = 1 << (bit & 0x0f); + reg_read(tfa, (unsigned char)reg, &value); + if (state) //set + new_value = (uint16_t)(value | mask); + else // clear + new_value = value & ~mask; + if (new_value != value) { + reg_write(tfa, (unsigned char)reg, new_value); /* only this bit */ + tfa->interrupt_enable[reg - TFA98XX_INTERRUPT_ENABLE_REG1] = new_value; + } + } else + return -1; + + return 0; +} + +/* + * mask interrupts by disabling them + */ +int tfa_irq_mask(struct tfa_device *tfa) +{ + int reg; + + /* operate on all bits */ + for (reg = TFA98XX_INTERRUPT_ENABLE_REG1; reg <= TFA98XX_INTERRUPT_ENABLE_REG1 + tfa9912_irq_max / 16; reg++) + reg_write(tfa, (unsigned char)reg, 0); + + return 0; +} + +/* + * unmask interrupts by enabling them again + */ +int tfa_irq_unmask(struct tfa_device *tfa) +{ + int reg; + + /* operate on all bits */ + for (reg = TFA98XX_INTERRUPT_ENABLE_REG1; reg <= TFA98XX_INTERRUPT_ENABLE_REG1 + tfa9912_irq_max / 16; reg++) + reg_write(tfa, (unsigned char)reg, tfa->interrupt_enable[reg - TFA98XX_INTERRUPT_ENABLE_REG1]); + + return 0; +} + +/* + * interrupt bit function that sets the polarity + */ + +int tfa_irq_set_pol(struct tfa_device *tfa, enum tfa9912_irq bit, int state) +{ + uint16_t value, new_value; + int reg = 0, mask; + + if (bit == tfa9912_irq_all) { + /* operate on all bits */ + for (reg = TFA98XX_STATUS_POLARITY_REG1; reg <= TFA98XX_STATUS_POLARITY_REG1 + tfa9912_irq_max / 16; reg++) { + reg_write(tfa, (unsigned char)reg, state ? 0xffff : 0); /* all bits */ + } + } else if (bit < tfa9912_irq_max) { + /* only this bit */ + reg = TFA98XX_STATUS_POLARITY_REG1 + (bit >> 4); + mask = 1 << (bit & 0x0f); + reg_read(tfa, (unsigned char)reg, &value); + if (state) /* Active High */ + new_value = (uint16_t)(value | mask); + else /* Active Low */ + new_value = value & ~mask; + if (new_value != value) { + reg_write(tfa, (unsigned char)reg, new_value); /* only this bit */ + } + } else + return -1; + + return 0; +} + +/* + * set device info and register device ops + */ +void tfa_set_query_info(struct tfa_device *tfa) +{ + /* invalidate device struct cached values */ + tfa->hw_feature_bits = -1; + tfa->sw_feature_bits[0] = -1; + tfa->sw_feature_bits[1] = -1; + tfa->profile = -1; + tfa->vstep = -1; + /* defaults */ + tfa->is_probus_device = 0; + tfa->advance_keys_handling = 0; /*artf65038*/ + tfa->tfa_family = 1; + tfa->daimap = Tfa98xx_DAI_I2S; /* all others */ + tfa->spkr_count = 1; + tfa->spkr_select = 0; + tfa->support_tcoef = supportYes; + tfa->supportDrc = supportNotSet; + tfa->support_saam = supportNotSet; + tfa->ext_dsp = -1; /* respond to external DSP: -1:none, 0:no_dsp, 1:cold, 2:warm */ + tfa->bus = 0; + tfa->partial_enable = 0; + tfa->convert_dsp32 = 0; + tfa->sync_iv_delay = 0; + + /* TODO use the getfeatures() for retrieving the features [artf103523] + tfa->supportDrc = supportNotSet;*/ + + switch (tfa->rev & 0xff) { + case 0: /* tfanone : non-i2c external DSP device */ + /* e.g. qc adsp */ + tfa->supportDrc = supportYes; + tfa->tfa_family = 0; + tfa->spkr_count = 0; + tfa->daimap = 0; + tfanone_ops(&tfa->dev_ops); /* register device operations via tfa hal*/ + tfa->bus = 1; + break; + case 0x72: + /* tfa9872 */ + tfa->supportDrc = supportYes; + tfa->tfa_family = 2; + tfa->spkr_count = 1; + tfa->is_probus_device = 1; + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9872_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x73: + /* tfa9873 */ + tfa->supportDrc = supportYes; + tfa->tfa_family = 2; + tfa->spkr_count = 1; + tfa->is_probus_device = 1; + tfa->advance_keys_handling = 1; /*artf65038*/ + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9873_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x74: + /* tfa9874 */ + tfa->supportDrc = supportYes; + tfa->tfa_family = 2; + tfa->spkr_count = 1; + tfa->is_probus_device = 1; + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9874_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x78: + /* tfa9878 */ + tfa->supportDrc = supportYes; + tfa->tfa_family = 2; + tfa->spkr_count = 1; + tfa->is_probus_device = 1; + tfa->advance_keys_handling = 1; /*artf65038*/ + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9878_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x88: + /* tfa9888 */ + tfa->tfa_family = 2; + tfa->spkr_count = 2; + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9888_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x97: + /* tfa9897 */ + tfa->supportDrc = supportNo; + tfa->spkr_count = 1; + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9897_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x96: + /* tfa9896 */ + tfa->supportDrc = supportNo; + tfa->spkr_count = 1; + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9896_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x92: + /* tfa9891 */ + tfa->spkr_count = 1; + tfa->daimap = (Tfa98xx_DAI_PDM | Tfa98xx_DAI_I2S); + tfa9891_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x91: + /* tfa9890B */ + tfa->spkr_count = 1; + tfa->daimap = (Tfa98xx_DAI_PDM | Tfa98xx_DAI_I2S); + break; + case 0x80: + case 0x81: + /* tfa9890 */ + tfa->spkr_count = 1; + tfa->daimap = Tfa98xx_DAI_I2S; + tfa->supportDrc = supportNo; + tfa->supportFramework = supportNo; + tfa9890_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x12: + /* tfa9895 */ + tfa->spkr_count = 1; + tfa->daimap = Tfa98xx_DAI_I2S; + tfa9895_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x13: + /* tfa9912 */ + tfa->tfa_family = 2; + tfa->spkr_count = 1; + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9912_ops(&tfa->dev_ops); /* register device operations */ + break; + case 0x94: + /* tfa9894 */ + tfa->tfa_family = 2; + tfa->spkr_count = 1; + tfa->daimap = Tfa98xx_DAI_TDM; + tfa9894_ops(&tfa->dev_ops); /* register device operations */ + break; + + default: + pr_err("unknown device type : 0x%02x\n", tfa->rev); + _ASSERT(0); + break; + } +} + +/* + * lookup the device type and return the family type + */ +int tfa98xx_dev2family(int dev_type) +{ + /* only look at the die ID part (lsb byte) */ + switch (dev_type & 0xff) { + case 0x12: + case 0x80: + case 0x81: + case 0x91: + case 0x92: + case 0x97: + case 0x96: + return 1; + case 0x88: + case 0x72: + case 0x73: + case 0x13: + case 0x74: + case 0x78: + case 0x94: + return 2; + case 0x50: + return 3; + default: + return 0; + } +} + +/* + * return the target address for the filter on this device + + filter_index: + [0..9] reserved for EQ (not deployed, calc. is available) + [10..12] anti-alias filter + [13] integrator filter + + */ +enum Tfa98xx_DMEM tfa98xx_filter_mem(struct tfa_device *tfa, int filter_index, unsigned short *address, int channel) +{ + enum Tfa98xx_DMEM dmem = -1; + int idx; + unsigned short bq_table[7][4] = { + /* index: 10, 11, 12, 13 */ + {346, 351, 356, 288}, //87 BRA_MAX_MRA4-2_7.00 + {346, 351, 356, 288}, //90 BRA_MAX_MRA6_9.02 + {467, 472, 477, 409}, //95 BRA_MAX_MRA7_10.02 + {406, 411, 416, 348}, //97 BRA_MAX_MRA9_12.01 + {467, 472, 477, 409}, //91 BRA_MAX_MRAA_13.02 + {8832, 8837, 8842, 8847}, //88 part1 + {8853, 8858, 8863, 8868} //88 part2 + /* Since the 88 is stereo we have 2 parts. + * Every index has 5 values except index 13 this one has 6 values + */ + }; + + if ((filter_index >= 10) && (filter_index <= 13)) { + dmem = Tfa98xx_DMEM_YMEM; /* for all devices */ + idx = filter_index - 10; + + switch (tfa->rev & 0xff) { // only compare lower byte + case 0x12: + *address = bq_table[2][idx]; + break; + case 0x97: + *address = bq_table[3][idx]; + break; + case 0x96: + *address = bq_table[3][idx]; + break; + case 0x80: + case 0x81: // for the RAM version + case 0x91: + *address = bq_table[1][idx]; + break; + case 0x92: + *address = bq_table[4][idx]; + break; + case 0x88: + /* Channel 1 = primary, 2 = secondary */ + if (channel == 1) + *address = bq_table[5][idx]; + else + *address = bq_table[6][idx]; + break; + case 0x72: + case 0x73: + case 0x74: + case 0x78: + case 0x13: + default: + /* unsupported case, possibly intermediate version */ + return -1; + _ASSERT(0); + } + } + return dmem; +} + +/************************ query functions ********************************************************/ +/** +* return revision +* Used by the LTT +*/ +void tfa98xx_rev(int *major, int *minor, int *revision) +{ + char version_str[] = TFA98XX_API_REV_STR; + + sscanf(version_str, "v%d.%d.%d", major, minor, revision); +} + +/** + * tfa_supported_speakers + * returns the number of the supported speaker count + */ +enum Tfa98xx_Error tfa_supported_speakers(struct tfa_device *tfa, int *spkr_count) +{ + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + else + *spkr_count = tfa->spkr_count; + + return Tfa98xx_Error_Ok; +} + +/* + * tfa98xx_supported_saam + * returns the supportedspeaker as microphone feature + */ +enum Tfa98xx_Error tfa98xx_supported_saam(struct tfa_device *tfa, enum Tfa98xx_saam *saam) +{ + int features; + enum Tfa98xx_Error error; + + if (tfa->support_saam == supportNotSet) { + error = tfa98xx_dsp_get_hw_feature_bits(tfa, &features); + if (error != Tfa98xx_Error_Ok) + return error; + tfa->support_saam = + (features & 0x8000) ? supportYes : supportNo; /* SAAM is bit15 */ + } + *saam = tfa->support_saam == supportYes ? Tfa98xx_saam : Tfa98xx_saam_none; + + return Tfa98xx_Error_Ok; +} + +/* + * tfa98xx_compare_features + * Obtains features_from_MTP and features_from_cnt + */ +enum Tfa98xx_Error tfa98xx_compare_features(struct tfa_device *tfa, int features_from_MTP[3], int features_from_cnt[3]) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + uint32_t value; + uint16_t mtpbf; + unsigned char bytes[3 * 2]; + int status; + + tfa98xx_dsp_system_stable(tfa, &status); + if (!status) + return Tfa98xx_Error_NoClock; // Only test when we have a clock. + + /* Set proper MTP location per device: */ + if (tfa->tfa_family == 1) { + mtpbf = 0x850f; /* MTP5 for tfa1,16 bits */ + } else { + mtpbf = 0xf907; /* MTP9 for tfa2, 8 bits */ + } + + /* Read HW features from MTP: */ + value = tfa_read_reg(tfa, mtpbf) & 0xffff; + features_from_MTP[0] = tfa->hw_feature_bits = value; + + /* Read SW features: */ + error = tfa_dsp_cmd_id_write_read(tfa, MODULE_FRAMEWORK, FW_PAR_ID_GET_FEATURE_INFO, sizeof(bytes), bytes); + if (error != Tfa98xx_Error_Ok) + return error; /* old ROM code may respond with Tfa98xx_Error_RpcParamId */ + + tfa98xx_convert_bytes2data(sizeof(bytes), bytes, &features_from_MTP[1]); + + /* check if feature bits from MTP match feature bits from cnt file: */ + get_hw_features_from_cnt(tfa, &features_from_cnt[0]); + get_sw_features_from_cnt(tfa, &features_from_cnt[1]); + + return error; +} + +/********************************* device specific ops ************************************************/ +/* the wrapper for DspReset, in case of full */ +enum Tfa98xx_Error tfa98xx_dsp_reset(struct tfa_device *tfa, int state) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + error = (tfa->dev_ops.dsp_reset)(tfa, state); + + return error; +} + +/* the ops wrapper for tfa98xx_dsp_SystemStable */ +enum Tfa98xx_Error tfa98xx_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + enum Tfa98xx_Error error = (tfa->dev_ops.dsp_system_stable)(tfa, ready); + + pr_debug("%s error=%d ready=%d\n", __func__, error, *ready); + return error; +} + +/* the ops wrapper for tfa98xx_dsp_system_stable */ +enum Tfa98xx_Error tfa98xx_auto_copy_mtp_to_iic(struct tfa_device *tfa) +{ + return (tfa->dev_ops.auto_copy_mtp_to_iic)(tfa); +} + +/* the ops wrapper for tfa98xx_faim_protect */ +enum Tfa98xx_Error tfa98xx_faim_protect(struct tfa_device *tfa, int state) +{ + return (tfa->dev_ops.faim_protect)(tfa, state); +} + +/* + * bring the device into a state similar to reset + */ +enum Tfa98xx_Error tfa98xx_init(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + uint16_t value = 0; + + /* reset all i2C registers to default + * Write the register directly to avoid the read in the bitfield function. + * The I2CR bit may overwrite the full register because it is reset anyway. + * This will save a reg read transaction. + */ + TFA_SET_BF_VALUE(tfa, I2CR, 1, &value); + TFA_WRITE_REG(tfa, I2CR, value); + + /* Put DSP in reset */ + tfa98xx_dsp_reset(tfa, 1); /* in pair of tfaRunStartDSP() */ + + /* some other registers must be set for optimal amplifier behaviour + * This is implemented in a file specific for the type number + */ + if (tfa->dev_ops.tfa_init) + error = (tfa->dev_ops.tfa_init)(tfa); + + return error; +} + +enum Tfa98xx_Error tfa98xx_dsp_write_tables(struct tfa_device *tfa, int sample_rate) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + error = (tfa->dev_ops.dsp_write_tables)(tfa, sample_rate); + + return error; +} + +/** Set internal oscillator into power down mode. +* +* @param[in] tfa device description structure +* @param[in] state new state 0 - oscillator is on, 1 oscillator is off. +* +* @return Tfa98xx_Error_Ok when successfull, error otherwise. +*/ +enum Tfa98xx_Error tfa98xx_set_osc_powerdown(struct tfa_device *tfa, int state) +{ + if (tfa->dev_ops.set_osc_powerdown) { + return tfa->dev_ops.set_osc_powerdown(tfa, state); + } + + return Tfa98xx_Error_Not_Implemented; +} + +/** update low power mode of the device. +* +* @param[in] tfa device description structure +* @param[in] state new state 0 - LPMODE is on, 1 LPMODE is off. +* +* @return Tfa98xx_Error_Ok when successfull, error otherwise. +*/ +enum Tfa98xx_Error tfa98xx_update_lpm(struct tfa_device *tfa, int state) +{ + if (tfa->dev_ops.update_lpm) { + return tfa->dev_ops.update_lpm(tfa, state); + } + + return Tfa98xx_Error_Not_Implemented; +} +/** Check presence of powerswitch=1 in configuration and optimal setting. +* +* @param[in] tfa device description structure +* +* @return -1 when error, 0 or 1 depends on switch settings. +*/ +int tfa98xx_powerswitch_is_enabled(struct tfa_device *tfa) +{ + uint16_t value; + enum Tfa98xx_Error ret; + + if (((tfa->rev & 0xff) == 0x13) || ((tfa->rev & 0xff) == 0x88)) { + ret = reg_read(tfa, 0xc6, &value); + if (ret != Tfa98xx_Error_Ok) { + return -1; + } + /* PLMA5539: Check actual value of powerswitch. TODO: regmap v1.40 should make this bit public. */ + + return (int)(value & (1u << 6)); + } + + return 1; +} + +/********************* new tfa2 *********************************************************************/ +/* newly added messaging for tfa2 tfa1? */ +enum Tfa98xx_Error tfa98xx_dsp_get_memory(struct tfa_device *tfa, int memoryType, + int offset, int length, unsigned char bytes[]) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + char msg[4 * 3]; + int nr = 0; + + msg[nr++] = 8; + msg[nr++] = MODULE_FRAMEWORK + 128; + msg[nr++] = FW_PAR_ID_GET_MEMORY; + + msg[nr++] = 0; + msg[nr++] = 0; + msg[nr++] = (char)memoryType; + + msg[nr++] = 0; + msg[nr++] = (offset >> 8) & 0xff; + msg[nr++] = offset & 0xff; + + msg[nr++] = 0; + msg[nr++] = (length >> 8) & 0xff; + msg[nr++] = length & 0xff; + + /* send msg */ + error = dsp_msg(tfa, nr, (char *)msg); + + if (error != Tfa98xx_Error_Ok) + return error; + + /* read the data from the device (length * 3) */ + error = dsp_msg_read(tfa, length * 3, bytes); + + return error; +} + +enum Tfa98xx_Error tfa98xx_dsp_set_memory(struct tfa_device *tfa, int memoryType, + int offset, int length, int value) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int nr = 0; + char msg[5 * 3]; + + msg[nr++] = 8; + msg[nr++] = MODULE_FRAMEWORK + 128; + msg[nr++] = FW_PAR_ID_SET_MEMORY; + + msg[nr++] = 0; + msg[nr++] = 0; + msg[nr++] = (char)memoryType; + + msg[nr++] = 0; + msg[nr++] = (offset >> 8) & 0xff; + msg[nr++] = offset & 0xff; + + msg[nr++] = 0; + msg[nr++] = (length >> 8) & 0xff; + msg[nr++] = length & 0xff; + + msg[nr++] = (value >> 16) & 0xff; + msg[nr++] = (value >> 8) & 0xff; + msg[nr++] = value & 0xff; + + /* send msg */ + error = dsp_msg(tfa, nr, (char *)msg); + + return error; +} +/****************************** calibration support **************************/ +/* + * get/set the mtp with user controllable values + * + * check if the relevant clocks are available + */ +enum Tfa98xx_Error tfa98xx_get_mtp(struct tfa_device *tfa, uint16_t *value) +{ + int status; + int result; + + /* not possible if PLL in powerdown */ + if (TFA_GET_BF(tfa, PWDN)) { + pr_debug("PLL in powerdown\n"); + return Tfa98xx_Error_NoClock; + } + tfa98xx_dsp_system_stable(tfa, &status); + if (status == 0) { + pr_debug("PLL not running\n"); + return Tfa98xx_Error_NoClock; + } + + result = TFA_READ_REG(tfa, MTP0); + if (result < 0) { + return -result; + } + *value = (uint16_t)result; + + return Tfa98xx_Error_Ok; +} + +/* + * lock or unlock KEY2 + * lock = 1 will lock + * lock = 0 will unlock + * + * note that on return all the hidden key will be off + */ +void tfa98xx_key2(struct tfa_device *tfa, int lock) +{ + /* unhide lock registers */ + reg_write(tfa, (tfa->tfa_family == 1) ? 0x40 : 0x0F, 0x5A6B); + /* lock/unlock key2 MTPK */ + TFA_WRITE_REG(tfa, MTPKEY2, lock ? 0 : 0x5A); + /* unhide lock registers */ + if (!tfa->advance_keys_handling) /*artf65038*/ + reg_write(tfa, (tfa->tfa_family == 1) ? 0x40 : 0x0F, 0); +} +void tfa2_manual_mtp_cpy(struct tfa_device *tfa, uint16_t reg_row_to_keep, uint16_t reg_row_to_set, uint8_t row)///MCH_TO_TEST +{ + uint16_t value; + int loop = 0; + enum Tfa98xx_Error error; + /* Assure FAIM is enabled (enable it when neccesery) */ + if (tfa->is_probus_device) + { + error = tfa98xx_faim_protect(tfa, 1); + if (tfa->verbose) { + pr_debug("FAIM enabled (err:%d).\n", error); + } + } + reg_read(tfa, (unsigned char)reg_row_to_keep, &value); + if (!row) + { + reg_write(tfa, 0xA7, value); + reg_write(tfa, 0xA8, reg_row_to_set); + } else + { + reg_write(tfa, 0xA7, reg_row_to_set); + reg_write(tfa, 0xA8, value); + } + reg_write(tfa, 0xA3, 0x10 | row); + if (tfa->is_probus_device) + { + /* Assure FAIM is enabled (enable it when neccesery) */ + for (loop = 0; loop < 100 /*x10ms*/; loop++) { + msleep_interruptible(10); /* wait 10ms to avoid busload */ + if (tfa_dev_get_mtpb(tfa) == 0) + break; + } + error = tfa98xx_faim_protect(tfa, 0); + if (tfa->verbose) { + pr_debug("FAIM disabled (err:%d).\n", error); + } + } +} + +enum Tfa98xx_Error tfa98xx_set_mtp(struct tfa_device *tfa, uint16_t value, uint16_t mask) +{ + unsigned short mtp_old, mtp_new; + int loop, status; + enum Tfa98xx_Error error; + + error = tfa98xx_get_mtp(tfa, &mtp_old); + + if (error != Tfa98xx_Error_Ok) + return error; + + mtp_new = (value & mask) | (mtp_old & ~mask); + + if (mtp_old == mtp_new) /* no change */ { + if (tfa->verbose) + pr_info("No change in MTP. Value not written!\n"); + return Tfa98xx_Error_Ok; + } + error = tfa98xx_update_lpm(tfa, 1); + if (error) { + return error; + } + /* Assure FAIM is enabled (enable it when neccesery) */ + error = tfa98xx_faim_protect(tfa, 1); + if (error) { + return error; + } + if (tfa->verbose) { + pr_debug("MTP clock enabled.\n"); + } + + /* assure that the clock is up, else we can't write MTP */ + error = tfa98xx_dsp_system_stable(tfa, &status); + if (error) { + return error; + } + if (status == 0) { + return Tfa98xx_Error_NoClock; + } + + tfa98xx_key2(tfa, 0); /* unlock */ + TFA_WRITE_REG(tfa, MTP0, mtp_new); /* write to i2c shadow reg */ + /* CIMTP=1 start copying all the data from i2c regs_mtp to mtp*/ + if (tfa->tfa_family == 2) + tfa2_manual_mtp_cpy(tfa, 0xF1, mtp_new, 0); + else + TFA_SET_BF(tfa, CIMTP, 1); + /* wait until MTP write is done */ + error = Tfa98xx_Error_StateTimedOut; + for (loop = 0; loop < 100 /*x10ms*/; loop++) { + msleep_interruptible(10); /* wait 10ms to avoid busload */ + if (tfa_dev_get_mtpb(tfa) == 0) { + error = Tfa98xx_Error_Ok; + break; + } + } + tfa98xx_key2(tfa, 1); /* lock */ + /* MTP setting failed due to timeout ?*/ + if (error) { + tfa98xx_faim_protect(tfa, 0); + return error; + } + + /* Disable the FAIM, if this is neccessary */ + error = tfa98xx_faim_protect(tfa, 0); + if (error) { + return error; + } + if (tfa->verbose) { + pr_debug("MTP clock disabled.\n"); + } + error = tfa98xx_update_lpm(tfa, 0); + if (error) { + return error; + } + return error; +} +/* + * clear mtpex + * set ACS + * start tfa + */ +int tfa_calibrate(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error; + + /* clear mtpex */ + error = tfa98xx_set_mtp(tfa, 0, TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK); + if (error) + return error; + + /* set RST=1 to put the DSP in Reset */ + TFA_SET_BF(tfa, RST, 1); + + /* set ACS/coldboot state */ + error = tfaRunColdboot(tfa, 1); + + /* start tfa by playing */ + return error; +} + +static short twos(short x) +{ + return (x < 0) ? x + 512 : x; +} + +void tfa98xx_set_exttemp(struct tfa_device *tfa, short ext_temp) +{ + if ((-256 <= ext_temp) && (ext_temp <= 255)) { + /* make twos complement */ + pr_debug("Using ext temp %d C\n", twos(ext_temp)); + TFA_SET_BF(tfa, TROS, 1); + TFA_SET_BF(tfa, EXTTS, twos(ext_temp)); + } else { + pr_debug("Clearing ext temp settings\n"); + TFA_SET_BF(tfa, TROS, 0); + } +} +short tfa98xx_get_exttemp(struct tfa_device *tfa) +{ + short ext_temp = (short)TFA_GET_BF(tfa, EXTTS); + + return (twos(ext_temp)); +} + +/************************** tfa simple bitfield interfacing ***************************************/ +/* convenience functions */ +enum Tfa98xx_Error tfa98xx_set_volume_level(struct tfa_device *tfa, unsigned short vol) +{ + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + if (vol > 255) /* restricted to 8 bits */ + vol = 255; + + /* 0x00 -> 0.0 dB + * 0x01 -> -0.5 dB + * ... + * 0xFE -> -127dB + * 0xFF -> muted + */ + + /* volume value is in the top 8 bits of the register */ + return -TFA_SET_BF(tfa, VOL, (uint16_t)vol); +} + +static enum Tfa98xx_Error +tfa98xx_set_mute_tfa2(struct tfa_device *tfa, enum Tfa98xx_Mute mute) +{ + enum Tfa98xx_Error error; + + if (tfa->dev_ops.set_mute == NULL) + return Tfa98xx_Error_Not_Supported; + + switch (mute) { + case Tfa98xx_Mute_Off: + error = tfa->dev_ops.set_mute(tfa, 0); + TFA_SET_BF(tfa, AMPE, 1); + break; + case Tfa98xx_Mute_Amplifier: + case Tfa98xx_Mute_Digital: + error = tfa->dev_ops.set_mute(tfa, 1); + TFA_SET_BF(tfa, AMPE, 0); + break; + default: + return Tfa98xx_Error_Bad_Parameter; + } + + return error; +} + +static enum Tfa98xx_Error +tfa98xx_set_mute_tfa1(struct tfa_device *tfa, enum Tfa98xx_Mute mute) +{ + enum Tfa98xx_Error error; + unsigned short audioctrl_value; + unsigned short sysctrl_value; + int value; + + value = TFA_READ_REG(tfa, CFSM); /* audio control register */ + if (value < 0) + return -value; + audioctrl_value = (unsigned short)value; + value = TFA_READ_REG(tfa, AMPE); /* system control register */ + if (value < 0) + return -value; + sysctrl_value = (unsigned short)value; + + switch (mute) { + case Tfa98xx_Mute_Off: + /* previous state can be digital or amplifier mute, + * clear the cf_mute and set the enbl_amplifier bits + * + * To reduce PLOP at power on it is needed to switch the + * amplifier on with the DCDC in follower mode + * (enbl_boost = 0 ?). + * This workaround is also needed when toggling the + * powerdown bit! + */ + TFA_SET_BF_VALUE(tfa, CFSM, 0, &audioctrl_value); + TFA_SET_BF_VALUE(tfa, AMPE, 1, &sysctrl_value); + TFA_SET_BF_VALUE(tfa, DCA, 1, &sysctrl_value); + break; + case Tfa98xx_Mute_Digital: + /* expect the amplifier to run */ + /* set the cf_mute bit */ + TFA_SET_BF_VALUE(tfa, CFSM, 1, &audioctrl_value); + /* set the enbl_amplifier bit */ + TFA_SET_BF_VALUE(tfa, AMPE, 1, &sysctrl_value); + /* clear active mode */ + TFA_SET_BF_VALUE(tfa, DCA, 0, &sysctrl_value); + break; + case Tfa98xx_Mute_Amplifier: + /* clear the cf_mute bit */ + TFA_SET_BF_VALUE(tfa, CFSM, 0, &audioctrl_value); + /* clear the enbl_amplifier bit and active mode */ + TFA_SET_BF_VALUE(tfa, AMPE, 0, &sysctrl_value); + TFA_SET_BF_VALUE(tfa, DCA, 0, &sysctrl_value); + break; + default: + return Tfa98xx_Error_Bad_Parameter; + } + + error = -TFA_WRITE_REG(tfa, CFSM, audioctrl_value); + if (error) + return error; + error = -TFA_WRITE_REG(tfa, AMPE, sysctrl_value); + return error; +} + +enum Tfa98xx_Error + tfa98xx_set_mute(struct tfa_device *tfa, enum Tfa98xx_Mute mute) +{ + if (tfa->in_use == 0) { + pr_err("device is not opened\n"); + return Tfa98xx_Error_NotOpen; + } + + if (tfa->tfa_family == 1) + return tfa98xx_set_mute_tfa1(tfa, mute); + else + return tfa98xx_set_mute_tfa2(tfa, mute); +} + +/****************** patching **********************************************************/ +static enum Tfa98xx_Error +tfa98xx_process_patch_file(struct tfa_device *tfa, int length, + const unsigned char *bytes) +{ + unsigned short size; + int index = 0; + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + while (index < length) { + size = bytes[index] + bytes[index + 1] * 256; + index += 2; + if ((index + size) > length) { + /* outside the buffer, error in the input data */ + return Tfa98xx_Error_Bad_Parameter; + } + + if (size > tfa->buffer_size) { + /* too big, must fit buffer */ + return Tfa98xx_Error_Bad_Parameter; + } + + error = tfa98xx_write_raw(tfa, size, &bytes[index]); + if (error != Tfa98xx_Error_Ok) + break; + index += size; + } + return error; +} + + + +/* the patch contains a header with the following + * IC revision register: 1 byte, 0xFF means don't care + * XMEM address to check: 2 bytes, big endian, 0xFFFF means don't care + * XMEM value to expect: 3 bytes, big endian + */ +static enum Tfa98xx_Error +tfa98xx_check_ic_rom_version(struct tfa_device *tfa, const unsigned char patchheader[]) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short checkrev, revid; + unsigned char lsb_revid; + unsigned short checkaddress; + int checkvalue; + int value = 0; + int status; + + checkrev = patchheader[0]; + lsb_revid = tfa->rev & 0xff; /* only compare lower byte */ + + if ((checkrev != 0xFF) && (checkrev != lsb_revid)) + return Tfa98xx_Error_Not_Supported; + + checkaddress = (patchheader[1] << 8) + patchheader[2]; + checkvalue = + (patchheader[3] << 16) + (patchheader[4] << 8) + patchheader[5]; + if (checkaddress != 0xFFFF) { + /* before reading XMEM, check if we can access the DSP */ + error = tfa98xx_dsp_system_stable(tfa, &status); + if (error == Tfa98xx_Error_Ok) { + if (!status) { + /* DSP subsys not running */ + error = Tfa98xx_Error_DSP_not_running; + } + } + /* read register to check the correct ROM version */ + if (error == Tfa98xx_Error_Ok) { + error = mem_read(tfa, checkaddress, 1, &value); + } + if (error == Tfa98xx_Error_Ok) { + if (value != checkvalue) { + pr_err("patch file romid type check failed [0x%04x]: expected 0x%02x, actual 0x%02x\n", + checkaddress, value, checkvalue); + error = Tfa98xx_Error_Not_Supported; + } + } + } else { /* == 0xffff */ + /* check if the revid subtype is in there */ + if (checkvalue != 0xFFFFFF && checkvalue != 0) { + revid = patchheader[5] << 8 | patchheader[0]; /* full revid */ + if (revid != tfa->rev) { + pr_err("patch file device type check failed: expected 0x%02x, actual 0x%02x\n", + tfa->rev, revid); + return Tfa98xx_Error_Not_Supported; + } + } + } + + return error; +} + + +#define PATCH_HEADER_LENGTH 6 +enum Tfa98xx_Error + tfa_dsp_patch(struct tfa_device *tfa, int patchLength, + const unsigned char *patchBytes) +{ + enum Tfa98xx_Error error; + int status; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + if (patchLength < PATCH_HEADER_LENGTH) + return Tfa98xx_Error_Bad_Parameter; + + error = tfa98xx_check_ic_rom_version(tfa, patchBytes); + if (Tfa98xx_Error_Ok != error) { + return error; + } + + /* for non-dsp solution, we don't need to check ACS. */ + if (tfa->is_probus_device == 0) { + tfa98xx_dsp_system_stable(tfa, &status); + if (!status) + return Tfa98xx_Error_NoClock; // Only test when we have a clock. + /******MCH_TO_TEST**************/ + if (error == Tfa98xx_Error_Ok) { + error = tfaRunColdboot(tfa, 1); + if (error) + return Tfa98xx_Error_DSP_not_running; + } + /**************************/ + error = + tfa98xx_process_patch_file(tfa, patchLength - PATCH_HEADER_LENGTH, + patchBytes + PATCH_HEADER_LENGTH); + + } + return error; +} + +/****************** end patching **********************************************************/ + +TFA_INTERNAL enum Tfa98xx_Error +tfa98xx_wait_result(struct tfa_device *tfa, int wait_retry_count) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int cf_status; /* the contents of the CF_STATUS register */ + int tries = 0; + + do { + cf_status = TFA_GET_BF(tfa, ACK); + if (cf_status < 0) + error = -cf_status; + tries++; + } + // i2c_cmd_ack + /* don't wait forever, DSP is pretty quick to respond (< 1ms) */ + while ((error == Tfa98xx_Error_Ok) && ((cf_status & CF_STATUS_I2C_CMD_ACK) == 0) + && (tries < wait_retry_count)); + if (tries >= wait_retry_count) { + /* something wrong with communication with DSP */ + error = Tfa98xx_Error_DSP_not_running; + } + return error; +} + +/* + * * support functions for data conversion + */ + /** + convert memory bytes to signed 24 bit integers + input: bytes contains "num_bytes" byte elements + output: data contains "num_bytes/3" int24 elements + */ +void tfa98xx_convert_bytes2data(int num_bytes, const unsigned char bytes[], + int data[]) +{ + int i; /* index for data */ + int k; /* index for bytes */ + int d; + int num_data = num_bytes / 3; + + _ASSERT((num_bytes % 3) == 0); + for (i = 0, k = 0; i < num_data; ++i, k += 3) { + d = (bytes[k] << 16) | (bytes[k + 1] << 8) | (bytes[k + 2]); + _ASSERT(d >= 0); + _ASSERT(d < (1 << 24)); /* max 24 bits in use */ + if (bytes[k] & 0x80) /* sign bit was set */ + d = -((1 << 24) - d); + + data[i] = d; + } +} + + +/** + convert signed 32 bit integers to 24 bit aligned bytes + input: data contains "num_data" int elements + output: bytes contains "3 * num_data" byte elements +*/ +void tfa98xx_convert_data2bytes(int num_data, const int data[], + unsigned char bytes[]) +{ + int i; /* index for data */ + int k; /* index for bytes */ + int d; + /* note: cannot just take the lowest 3 bytes from the 32 bit + * integer, because also need to take care of clipping any + * value > 2&23 */ + for (i = 0, k = 0; i < num_data; ++i, k += 3) { + if (data[i] >= 0) + d = MIN(data[i], (1 << 23) - 1); + else { + /* 2's complement */ + d = (1 << 24) - MIN(-data[i], 1 << 23); + } + _ASSERT(d >= 0); + _ASSERT(d < (1 << 24)); /* max 24 bits in use */ + bytes[k] = (d >> 16) & 0xFF; /* MSB */ + bytes[k + 1] = (d >> 8) & 0xFF; + bytes[k + 2] = (d) & 0xFF; /* LSB */ + } +} + +/* + * DSP RPC message support functions + * depending on framework to be up and running + * need base i2c of memaccess (tfa1=0x70/tfa2=0x90) + */ + + + /* write dsp messages in function tfa_dsp_msg() */ + /* note the 'old' write_parameter() was more efficient because all i2c was in one burst transaction */ + + //TODO properly handle bitfields: state should be restored! (now it will change eg dmesg field to xmem) +enum Tfa98xx_Error tfa_dsp_msg_write(struct tfa_device *tfa, int length, const char *buffer) +{ + int offset = 0; + int chunk_size = ROUND_DOWN(tfa->buffer_size, 3); /* XMEM word size */ + int remaining_bytes = length; + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + uint16_t cfctl; + int value; + + value = TFA_READ_REG(tfa, DMEM); + if (value < 0) { + error = -value; + return error; + } + cfctl = (uint16_t)value; + /* assume no I2C errors from here */ + + TFA_SET_BF_VALUE(tfa, DMEM, (uint16_t)Tfa98xx_DMEM_XMEM, &cfctl); /* set cf ctl to DMEM */ + TFA_SET_BF_VALUE(tfa, AIF, 0, &cfctl); /* set to autoincrement */ + TFA_WRITE_REG(tfa, DMEM, cfctl); + + /* xmem[1] is start of message + * direct write to register to save cycles avoiding read-modify-write + */ + TFA_WRITE_REG(tfa, MADD, 1); + + /* due to autoincrement in cf_ctrl, next write will happen at + * the next address */ + while ((error == Tfa98xx_Error_Ok) && (remaining_bytes > 0)) { + if (remaining_bytes < chunk_size) + chunk_size = remaining_bytes; + /* else chunk_size remains at initialize value above */ + error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, + chunk_size, (const unsigned char *)buffer + offset); + remaining_bytes -= chunk_size; + offset += chunk_size; + } + + /* notify the DSP */ + if (error == Tfa98xx_Error_Ok) { + /* cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */ + /* set the cf_req1 and cf_int bit */ + TFA_SET_BF_VALUE(tfa, REQCMD, 0x01, &cfctl); /* bit 0 */ + TFA_SET_BF_VALUE(tfa, CFINT, 1, &cfctl); + error = -TFA_WRITE_REG(tfa, CFINT, cfctl); + } + + return error; +} + +enum Tfa98xx_Error tfa_dsp_msg_write_id(struct tfa_device *tfa, int length, const char *buffer, uint8_t cmdid[3]) +{ + int offset = 0; + int chunk_size = ROUND_DOWN(tfa->buffer_size, 3); /* XMEM word size */ + int remaining_bytes = length; + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + uint16_t cfctl; + int value; + + value = TFA_READ_REG(tfa, DMEM); + if (value < 0) { + error = -value; + return error; + } + cfctl = (uint16_t)value; + /* assume no I2C errors from here */ + + TFA_SET_BF_VALUE(tfa, DMEM, (uint16_t)Tfa98xx_DMEM_XMEM, &cfctl); /* set cf ctl to DMEM */ + TFA_SET_BF_VALUE(tfa, AIF, 0, &cfctl); /* set to autoincrement */ + TFA_WRITE_REG(tfa, DMEM, cfctl); + + /* xmem[1] is start of message + * direct write to register to save cycles avoiding read-modify-write + */ + TFA_WRITE_REG(tfa, MADD, 1); + + /* write cmd-id */ + error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, 3, (const unsigned char *)cmdid); + + /* due to autoincrement in cf_ctrl, next write will happen at + * the next address */ + while ((error == Tfa98xx_Error_Ok) && (remaining_bytes > 0)) { + if (remaining_bytes < chunk_size) + chunk_size = remaining_bytes; + /* else chunk_size remains at initialize value above */ + error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, + chunk_size, (const unsigned char *)buffer + offset); + remaining_bytes -= chunk_size; + offset += chunk_size; + } + + /* notify the DSP */ + if (error == Tfa98xx_Error_Ok) { + /* cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */ + /* set the cf_req1 and cf_int bit */ + TFA_SET_BF_VALUE(tfa, REQCMD, 0x01, &cfctl); /* bit 0 */ + TFA_SET_BF_VALUE(tfa, CFINT, 1, &cfctl); + error = -TFA_WRITE_REG(tfa, CFINT, cfctl); + } + + return error; +} + +/* +* status function used by tfa_dsp_msg() to retrieve command/msg status: +* return a <0 status of the DSP did not ACK. +*/ +enum Tfa98xx_Error tfa_dsp_msg_status(struct tfa_device *tfa, int *pRpcStatus) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + error = tfa98xx_wait_result(tfa, 2); /* 2 is only one try */ + if (error == Tfa98xx_Error_DSP_not_running) { + *pRpcStatus = -1; + return Tfa98xx_Error_Ok; + } else if (error != Tfa98xx_Error_Ok) + return error; + + error = tfa98xx_check_rpc_status(tfa, pRpcStatus); + + return error; +} + +const char *tfa98xx_get_i2c_status_id_string(int status) +{ + const char *p_id_str; + + switch (status) + { + case Tfa98xx_DSP_Not_Running: + p_id_str = "No response from DSP"; + break; + case Tfa98xx_I2C_Req_Done: + p_id_str = "Ok"; + break; + case Tfa98xx_I2C_Req_Busy: + p_id_str = "Request is being processed"; + break; + case Tfa98xx_I2C_Req_Invalid_M_ID: + p_id_str = "Provided M-ID does not fit in valid rang [0..2]"; + break; + case Tfa98xx_I2C_Req_Invalid_P_ID: + p_id_str = "Provided P-ID is not valid in the given M-ID context"; + break; + case Tfa98xx_I2C_Req_Invalid_CC: + p_id_str = "Invalid channel configuration bits (SC|DS|DP|DC) combination"; + break; + case Tfa98xx_I2C_Req_Invalid_Seq: + p_id_str = "Invalid sequence of commands, in case the DSP expects some commands in a specific order"; + break; + case Tfa98xx_I2C_Req_Invalid_Param: + p_id_str = "Generic error, invalid parameter"; + break; + case Tfa98xx_I2C_Req_Buffer_Overflow: + p_id_str = "I2C buffer has overflowed: host has sent too many parameters, memory integrity is not guaranteed"; + break; + case Tfa98xx_I2C_Req_Calib_Busy: + p_id_str = "Calibration not completed"; + break; + case Tfa98xx_I2C_Req_Calib_Failed: + p_id_str = "Calibration failed"; + break; + + default: + p_id_str = "Unspecified error"; + } + + return p_id_str; +} + +enum Tfa98xx_Error tfa_dsp_msg_read(struct tfa_device *tfa, int length, unsigned char *bytes) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int burst_size; /* number of words per burst size */ + int bytes_per_word = 3; + int num_bytes; + int offset = 0; + unsigned short start_offset = 2; /* msg starts @xmem[2] ,[1]=cmd */ + + if (length > TFA2_MAX_PARAM_SIZE) + return Tfa98xx_Error_Bad_Parameter; + + TFA_SET_BF(tfa, DMEM, (uint16_t)Tfa98xx_DMEM_XMEM); + error = -TFA_WRITE_REG(tfa, MADD, start_offset); + if (error != Tfa98xx_Error_Ok) + return error; + + num_bytes = length; /* input param */ + while (num_bytes > 0) { + burst_size = ROUND_DOWN(tfa->buffer_size, bytes_per_word); + if (num_bytes < burst_size) + burst_size = num_bytes; + error = tfa98xx_read_data(tfa, FAM_TFA98XX_CF_MEM, burst_size, bytes + offset); + if (error != Tfa98xx_Error_Ok) + return error; + + num_bytes -= burst_size; + offset += burst_size; + } + + return error; +} + +enum Tfa98xx_Error dsp_msg(struct tfa_device *tfa, int length24, const char *buf24) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int lastmessage = 0; + uint8_t *blob; + int i; + int *intbuf = NULL; + char *buf = (char *)buf24; + int length = length24; + + if (tfa->convert_dsp32) { + int idx = 0; + + length = 4 * length24 / 3; + intbuf = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + buf = (char *)intbuf; + + /* convert 24 bit DSP messages to a 32 bit integer */ + for (i = 0; i < length24; i += 3) { + int tmp = (buf24[i] << 16) + (buf24[i + 1] << 8) + buf24[i + 2]; + /* Sign extend to 32-bit from 24-bit */ + intbuf[idx++] = ((int32_t)tmp << 8) >> 8; + } + } + + /* Only create multi-msg when the dsp is cold */ + if (tfa->ext_dsp == 1) { + /* Creating the multi-msg */ + error = tfa_tib_dsp_msgmulti(tfa, length, buf); + if (error == Tfa98xx_Error_Fail) + return Tfa98xx_Error_Fail; + + /* if the buffer is full we need to send the existing message and add the current message */ + if (error == Tfa98xx_Error_Buffer_too_small) { + int len; + + /* (a) send the existing (full) message */ + blob = kmalloc(64 * 1024, GFP_KERNEL); // max length is 64k + len = tfa_tib_dsp_msgmulti(tfa, -1, (const char *)blob); + if (tfa->verbose) { + pr_debug("Multi-message buffer full. Sending multi-message, length=%d\n", len); + } + if (tfa->has_msg == 0) /* via i2c */ { + /* Send tot the target selected */ + error = (tfa->dev_ops.dsp_msg)(tfa, len, (const char *)blob); + } else { /* via msg hal */ + error = tfa98xx_write_dsp(tfa, len, (const char *)blob); + } + kfree(blob); + + /* (b) add the current DSP message to a new multi-message */ + error = tfa_tib_dsp_msgmulti(tfa, length, buf); + if (error == Tfa98xx_Error_Fail) { + return Tfa98xx_Error_Fail; + } + } + + lastmessage = error; + + /* When the lastmessage is done we can send the multi-msg to the target */ + if (lastmessage == 1) { + + /* Get the full multi-msg data */ + blob = kmalloc(64 * 1024, GFP_KERNEL); //max length is 64k + length = tfa_tib_dsp_msgmulti(tfa, -1, (const char *)blob); + + if (tfa->verbose) + pr_debug("Last message for the multi-message received. Multi-message length=%d\n", length); + + if (tfa->has_msg == 0) /* via i2c */ { + /* Send tot the target selected */ + error = (tfa->dev_ops.dsp_msg)(tfa, length, (const char *)blob); + } else { /* via msg hal */ + error = tfa98xx_write_dsp(tfa, length, (const char *)blob); + } + + kfree(blob); /* Free the kmalloc blob */ + lastmessage = 0; /* reset to be able to re-start */ + } + } else { + if (tfa->has_msg == 0) /* via i2c */ { + error = (tfa->dev_ops.dsp_msg)(tfa, length, buf); + } else { /* via msg hal */ + error = tfa98xx_write_dsp(tfa, length, (const char *)buf); + } + } + + if (error != Tfa98xx_Error_Ok) + error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ + + /* DSP verbose has argument 0x04 */ + if ((tfa->verbose & 0x04) != 0) { + pr_debug("DSP w [%d]: ", length); + for (i = 0; i < length; i++) + pr_debug("0x%02x ", (uint8_t)buf[i]); + pr_debug("\n"); + } + + if (tfa->convert_dsp32) { + kmem_cache_free(tfa->cachep, intbuf); + } + + return error; +} + +enum Tfa98xx_Error dsp_msg_read(struct tfa_device *tfa, int length24, unsigned char *bytes24) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int i; + int length = length24; + unsigned char *bytes = bytes24; + + if (tfa->convert_dsp32) { + length = 4 * length24 / 3; + bytes = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + } + + if (tfa->has_msg == 0) /* via i2c */ { + error = (tfa->dev_ops.dsp_msg_read)(tfa, length, bytes); + } else { /* via msg hal */ + error = tfa98xx_read_dsp(tfa, length, bytes); + } + + if (error != Tfa98xx_Error_Ok) + error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ + + /* DSP verbose has argument 0x04 */ + if ((tfa->verbose & 0x04) != 0) { + pr_debug("DSP R [%d]: ", length); + for (i = 0; i < length; i++) + pr_debug("0x%02x ", (uint8_t)bytes[i]); + pr_debug("\n"); + } + + if (tfa->convert_dsp32) { + int idx = 0; + + /* convert 32 bit LE to 24 bit BE */ + for (i = 0; i < length; i += 4) { + bytes24[idx++] = bytes[i + 2]; + bytes24[idx++] = bytes[i + 1]; + bytes24[idx++] = bytes[i + 0]; + } + + kmem_cache_free(tfa->cachep, bytes); + } + + return error; +} + +enum Tfa98xx_Error reg_read(struct tfa_device *tfa, unsigned char subaddress, unsigned short *value) +{ + enum Tfa98xx_Error error; + + error = (tfa->dev_ops.reg_read)(tfa, subaddress, value); + if (error != Tfa98xx_Error_Ok) + error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ + + return error; +} + +enum Tfa98xx_Error reg_write(struct tfa_device *tfa, unsigned char subaddress, unsigned short value) +{ + enum Tfa98xx_Error error; + + error = (tfa->dev_ops.reg_write)(tfa, subaddress, value); + if (error != Tfa98xx_Error_Ok) + error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ + + return error; +} + +enum Tfa98xx_Error mem_read(struct tfa_device *tfa, unsigned int start_offset, int num_words, int *pValues) +{ + enum Tfa98xx_Error error; + + error = (tfa->dev_ops.mem_read)(tfa, start_offset, num_words, pValues); + if (error != Tfa98xx_Error_Ok) + error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ + + return error; +} + +enum Tfa98xx_Error mem_write(struct tfa_device *tfa, unsigned short address, int value, int memtype) +{ + enum Tfa98xx_Error error; + + error = (tfa->dev_ops.mem_write)(tfa, address, value, memtype); + if (error != Tfa98xx_Error_Ok) + error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ + + return error; +} + + +/* + * write/read raw msg functions : + * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. + * The functions will return immediately and do not not wait for DSP reponse. + */ +#define MAX_WORDS (300) +enum Tfa98xx_Error tfa_dsp_msg(struct tfa_device *tfa, int length, const char *buf) +{ + enum Tfa98xx_Error error; + int tries, rpc_status = Tfa98xx_I2C_Req_Done; + + /* write the message and notify the DSP */ + error = tfa_dsp_msg_write(tfa, length, buf); + if (error != Tfa98xx_Error_Ok) + return error; + + /* get the result from the DSP (polling) */ + for (tries = TFA98XX_WAITRESULT_NTRIES; tries > 0; tries--) { + error = tfa_dsp_msg_status(tfa, &rpc_status); + if (error == Tfa98xx_Error_Ok && rpc_status == Tfa98xx_I2C_Req_Done) + break; + /* If the rpc status is a specific error we want to know it. + * If it is busy or not running it should retry + */ + if (rpc_status != Tfa98xx_I2C_Req_Busy && rpc_status != Tfa98xx_DSP_Not_Running) + break; + } + + if (rpc_status != Tfa98xx_I2C_Req_Done) { + /* DSP RPC call returned an error */ + error = (enum Tfa98xx_Error) (rpc_status + Tfa98xx_Error_RpcBase); + pr_debug("DSP msg status: %d (%s)\n", rpc_status, tfa98xx_get_i2c_status_id_string(rpc_status)); + } + return error; +} + +/** + * write/read raw msg functions: + * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. + * The functions will return immediately and do not not wait for DSP reponse. + * An ID is added to modify the command-ID + */ +enum Tfa98xx_Error tfa_dsp_msg_id(struct tfa_device *tfa, int length, const char *buf, uint8_t cmdid[3]) +{ + enum Tfa98xx_Error error; + int tries, rpc_status = Tfa98xx_I2C_Req_Done; + + /* write the message and notify the DSP */ + error = tfa_dsp_msg_write_id(tfa, length, buf, cmdid); + if (error != Tfa98xx_Error_Ok) + return error; + + /* get the result from the DSP (polling) */ + for (tries = TFA98XX_WAITRESULT_NTRIES; tries > 0; tries--) { + error = tfa_dsp_msg_status(tfa, &rpc_status); + if (error == Tfa98xx_Error_Ok && rpc_status == Tfa98xx_I2C_Req_Done) + break; + } + + if (rpc_status != Tfa98xx_I2C_Req_Done) { + /* DSP RPC call returned an error */ + error = (enum Tfa98xx_Error) (rpc_status + Tfa98xx_Error_RpcBase); + pr_debug("DSP msg status: %d (%s)\n", rpc_status, tfa98xx_get_i2c_status_id_string(rpc_status)); + } + return error; +} + +/* read the return code for the RPC call */ +TFA_INTERNAL enum Tfa98xx_Error +tfa98xx_check_rpc_status(struct tfa_device *tfa, int *pRpcStatus) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + /* the value to sent to the * CF_CONTROLS register: cf_req=00000000, + * cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */ + unsigned short cf_ctrl = 0x0002; + /* memory address to be accessed (0: Status, 1: ID, 2: parameters) */ + unsigned short cf_mad = 0x0000; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + if (pRpcStatus == NULL) + return Tfa98xx_Error_Bad_Parameter; + + /* 1) write DMEM=XMEM to the DSP XMEM */ + { + /* minimize the number of I2C transactions by making use of the autoincrement in I2C */ + unsigned char buffer[4]; + /* first the data for CF_CONTROLS */ + buffer[0] = (unsigned char)((cf_ctrl >> 8) & 0xFF); + buffer[1] = (unsigned char)(cf_ctrl & 0xFF); + /* write the contents of CF_MAD which is the subaddress following CF_CONTROLS */ + buffer[2] = (unsigned char)((cf_mad >> 8) & 0xFF); + buffer[3] = (unsigned char)(cf_mad & 0xFF); + error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_CONTROLS, sizeof(buffer), buffer); + } + if (error == Tfa98xx_Error_Ok) { + /* read 1 word (24 bit) from XMEM */ + error = tfa98xx_dsp_read_mem(tfa, 0, 1, pRpcStatus); + } + + return error; +} + +/***************************** xmem only **********************************/ +enum Tfa98xx_Error + tfa98xx_dsp_read_mem(struct tfa_device *tfa, + unsigned int start_offset, int num_words, int *pValues) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned char *bytes; + int burst_size; /* number of words per burst size */ + const int bytes_per_word = 3; + int dmem; + int num_bytes; + int *p; + + bytes = (unsigned char *)kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + if (bytes == NULL) + return Tfa98xx_Error_Fail; + + /* If no offset is given, assume XMEM! */ + if (((start_offset >> 16) & 0xf) > 0) + dmem = (start_offset >> 16) & 0xf; + else + dmem = Tfa98xx_DMEM_XMEM; + + /* Remove offset from adress */ + start_offset = start_offset & 0xffff; + num_bytes = num_words * bytes_per_word; + p = pValues; + + TFA_SET_BF(tfa, DMEM, (uint16_t)dmem); + error = -TFA_WRITE_REG(tfa, MADD, (unsigned short)start_offset); + if (error != Tfa98xx_Error_Ok) + goto tfa98xx_dsp_read_mem_exit; + + for (; num_bytes > 0;) { + burst_size = ROUND_DOWN(tfa->buffer_size, bytes_per_word); + if (num_bytes < burst_size) + burst_size = num_bytes; + + _ASSERT(burst_size <= sizeof(bytes)); + error = tfa98xx_read_data(tfa, FAM_TFA98XX_CF_MEM, burst_size, bytes); + if (error != Tfa98xx_Error_Ok) + goto tfa98xx_dsp_read_mem_exit; + + tfa98xx_convert_bytes2data(burst_size, bytes, p); + + num_bytes -= burst_size; + p += burst_size / bytes_per_word; + } + +tfa98xx_dsp_read_mem_exit: + kmem_cache_free(tfa->cachep, bytes); + + return error; +} + + +enum Tfa98xx_Error + tfa98xx_dsp_write_mem_word(struct tfa_device *tfa, unsigned short address, int value, int memtype) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned char bytes[3]; + + TFA_SET_BF(tfa, DMEM, (uint16_t)memtype); + + error = -TFA_WRITE_REG(tfa, MADD, address); + if (error != Tfa98xx_Error_Ok) + return error; + + tfa98xx_convert_data2bytes(1, &value, bytes); + error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, 3, bytes); + + return error; +} + +enum Tfa98xx_Error tfa_cont_write_filterbank(struct tfa_device *tfa, TfaFilter_t *filter) +{ + unsigned char biquad_index; + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + for (biquad_index = 0; biquad_index < 10; biquad_index++) { + if (filter[biquad_index].enabled) { + error = tfa_dsp_cmd_id_write(tfa, MODULE_BIQUADFILTERBANK, + biquad_index + 1, //start @1 + sizeof(filter[biquad_index].biquad.bytes), + filter[biquad_index].biquad.bytes); + } else { + error = Tfa98xx_DspBiquad_Disable(tfa, biquad_index + 1); + } + if (error) return error; + + } + + return error; +} + +enum Tfa98xx_Error + Tfa98xx_DspBiquad_Disable(struct tfa_device *tfa, int biquad_index) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int coeff_buffer[BIQUAD_COEFF_SIZE]; + unsigned char bytes[3 + BIQUAD_COEFF_SIZE * 3]; + int nr = 0; + + if (biquad_index > TFA98XX_BIQUAD_NUM) + return Tfa98xx_Error_Bad_Parameter; + if (biquad_index < 1) + return Tfa98xx_Error_Bad_Parameter; + + /* make opcode */ + bytes[nr++] = 0; + bytes[nr++] = MODULE_BIQUADFILTERBANK + 128; + bytes[nr++] = (unsigned char)biquad_index; + + + /* set in correct order and format for the DSP */ + coeff_buffer[0] = (int)-8388608; /* -1.0f */ + coeff_buffer[1] = 0; + coeff_buffer[2] = 0; + coeff_buffer[3] = 0; + coeff_buffer[4] = 0; + coeff_buffer[5] = 0; + + /* convert to packed 24 */ + tfa98xx_convert_data2bytes(BIQUAD_COEFF_SIZE, coeff_buffer, &bytes[nr]); + nr += BIQUAD_COEFF_SIZE * 3; + + error = dsp_msg(tfa, nr, (char *)bytes); + + return error; +} + +/* wrapper for dsp_msg that adds opcode */ +enum Tfa98xx_Error tfa_dsp_cmd_id_write(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int num_bytes, + const unsigned char data[]) +{ + enum Tfa98xx_Error error; + unsigned char *buffer; + int nr = 0; + + buffer = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + if (buffer == NULL) + return Tfa98xx_Error_Fail; + + buffer[nr++] = tfa->spkr_select; + buffer[nr++] = module_id + 128; + buffer[nr++] = param_id; + + memcpy(&buffer[nr], data, num_bytes); + nr += num_bytes; + + error = dsp_msg(tfa, nr, (char *)buffer); + + kmem_cache_free(tfa->cachep, buffer); + + return error; +} + +/* wrapper for dsp_msg that adds opcode */ +/* this is as the former tfa98xx_dsp_get_param() */ +enum Tfa98xx_Error tfa_dsp_cmd_id_write_read(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int num_bytes, + unsigned char data[]) +{ + enum Tfa98xx_Error error; + unsigned char buffer[3]; + int nr = 0; + + if (num_bytes <= 0) { + pr_debug("Error: The number of READ bytes is smaller or equal to 0!\n"); + return Tfa98xx_Error_Fail; + } + + if ((tfa->is_probus_device) && (tfa->cnt->ndev == 1) && + (param_id == SB_PARAM_GET_RE25C || + param_id == SB_PARAM_GET_LSMODEL || + param_id == SB_PARAM_GET_ALGO_PARAMS)) { + /* Modifying the ID for GetRe25C */ + buffer[nr++] = 4; + } else { + buffer[nr++] = tfa->spkr_select; + } + buffer[nr++] = module_id + 128; + buffer[nr++] = param_id; + + error = dsp_msg(tfa, nr, (char *)buffer); + if (error != Tfa98xx_Error_Ok) + return error; + + /* read the data from the dsp */ + error = dsp_msg_read(tfa, num_bytes, data); + return error; +} + +/* wrapper for dsp_msg that adds opcode and 3 bytes required for coefs */ +enum Tfa98xx_Error tfa_dsp_cmd_id_coefs(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int num_bytes, + unsigned char data[]) +{ + enum Tfa98xx_Error error; + unsigned char buffer[2 * 3]; + int nr = 0; + + buffer[nr++] = tfa->spkr_select; + buffer[nr++] = module_id + 128; + buffer[nr++] = param_id; + + buffer[nr++] = 0; + buffer[nr++] = 0; + buffer[nr++] = 0; + + error = dsp_msg(tfa, nr, (char *)buffer); + if (error != Tfa98xx_Error_Ok) + return error; + + /* read the data from the dsp */ + error = dsp_msg_read(tfa, num_bytes, data); + + return error; +} + +/* wrapper for dsp_msg that adds opcode and 3 bytes required for MBDrcDynamics */ +enum Tfa98xx_Error tfa_dsp_cmd_id_MBDrc_dynamics(struct tfa_device *tfa, + unsigned char module_id, + unsigned char param_id, int index_subband, + int num_bytes, unsigned char data[]) +{ + enum Tfa98xx_Error error; + unsigned char buffer[2 * 3]; + int nr = 0; + + buffer[nr++] = tfa->spkr_select; + buffer[nr++] = module_id + 128; + buffer[nr++] = param_id; + + buffer[nr++] = 0; + buffer[nr++] = 0; + buffer[nr++] = (unsigned char)index_subband; + + error = dsp_msg(tfa, nr, (char *)buffer); + if (error != Tfa98xx_Error_Ok) + return error; + + /* read the data from the dsp */ + error = dsp_msg_read(tfa, num_bytes, data); + + return error; +} + +enum Tfa98xx_Error + tfa98xx_dsp_write_preset(struct tfa_device *tfa, int length, + const unsigned char *p_preset_bytes) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + if (p_preset_bytes != NULL) { + /* by design: keep the data opaque and no + * interpreting/calculation */ + error = tfa_dsp_cmd_id_write(tfa, MODULE_SPEAKERBOOST, + SB_PARAM_SET_PRESET, length, + p_preset_bytes); + } else { + error = Tfa98xx_Error_Bad_Parameter; + } + return error; +} + +/* + * get features from MTP + */ +enum Tfa98xx_Error + tfa98xx_dsp_get_hw_feature_bits(struct tfa_device *tfa, int *features) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + uint32_t value; + uint16_t mtpbf; + + /* return the cache data if it's valid */ + if (tfa->hw_feature_bits != -1) { + *features = tfa->hw_feature_bits; + } else { + /* for tfa1 check if we have clock */ + if (tfa->tfa_family == 1) { + int status; + + tfa98xx_dsp_system_stable(tfa, &status); + if (!status) { + get_hw_features_from_cnt(tfa, features); + /* skip reading MTP: */ + return (*features == -1) ? Tfa98xx_Error_Fail : Tfa98xx_Error_Ok; + } + mtpbf = 0x850f; /* MTP5 for tfa1,16 bits */ + } else + mtpbf = 0xf907; /* MTP9 for tfa2, 8 bits */ + value = tfa_read_reg(tfa, mtpbf) & 0xffff; + *features = tfa->hw_feature_bits = value; + } + + return error; +} + +enum Tfa98xx_Error + tfa98xx_dsp_get_sw_feature_bits(struct tfa_device *tfa, int features[2]) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + const int byte_size = 2 * 3; + unsigned char bytes[2 * 3]; + + /* return the cache data if it's valid */ + if (tfa->sw_feature_bits[0] != -1) { + features[0] = tfa->sw_feature_bits[0]; + features[1] = tfa->sw_feature_bits[1]; + } else { + /* for tfa1 check if we have clock */ + if (tfa->tfa_family == 1) { + int status; + + tfa98xx_dsp_system_stable(tfa, &status); + if (!status) { + get_sw_features_from_cnt(tfa, features); + /* skip reading MTP: */ + return (features[0] == -1) ? Tfa98xx_Error_Fail : Tfa98xx_Error_Ok; + } + } + error = tfa_dsp_cmd_id_write_read(tfa, MODULE_FRAMEWORK, + FW_PAR_ID_GET_FEATURE_INFO, byte_size, bytes); + + if (error != Tfa98xx_Error_Ok) { + /* old ROM code may respond with Tfa98xx_Error_RpcParamId */ + return error; + } + + tfa98xx_convert_bytes2data(byte_size, bytes, features); + } + return error; +} + +enum Tfa98xx_Error tfa98xx_dsp_get_state_info(struct tfa_device *tfa, unsigned char bytes[], unsigned int *statesize) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int bSupportFramework = 0; + unsigned int stateSize = 9; + + err = tfa98xx_dsp_support_framework(tfa, &bSupportFramework); + if (err == Tfa98xx_Error_Ok) { + if (bSupportFramework) { + err = tfa_dsp_cmd_id_write_read(tfa, MODULE_FRAMEWORK, + FW_PARAM_GET_STATE, 3 * stateSize, bytes); + } else { + /* old ROM code, ask SpeakerBoost and only do first portion */ + stateSize = 8; + err = tfa_dsp_cmd_id_write_read(tfa, MODULE_SPEAKERBOOST, + SB_PARAM_GET_STATE, 3 * stateSize, bytes); + } + } + + *statesize = stateSize; + + return err; +} + +enum Tfa98xx_Error tfa98xx_dsp_support_drc(struct tfa_device *tfa, int *pbSupportDrc) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + *pbSupportDrc = 0; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + if (tfa->supportDrc != supportNotSet) { + *pbSupportDrc = (tfa->supportDrc == supportYes); + } else { + int featureBits[2]; + + error = tfa98xx_dsp_get_sw_feature_bits(tfa, featureBits); + if (error == Tfa98xx_Error_Ok) { + /* easy case: new API available */ + /* bit=0 means DRC enabled */ + *pbSupportDrc = (featureBits[0] & FEATURE1_DRC) == 0; + } else if (error == Tfa98xx_Error_RpcParamId) { + /* older ROM code, doesn't support it */ + *pbSupportDrc = 0; + error = Tfa98xx_Error_Ok; + } + /* else some other error, return transparently */ + /* pbSupportDrc only changed when error == Tfa98xx_Error_Ok */ + + if (error == Tfa98xx_Error_Ok) { + tfa->supportDrc = *pbSupportDrc ? supportYes : supportNo; + } + } + return error; +} + +enum Tfa98xx_Error + tfa98xx_dsp_support_framework(struct tfa_device *tfa, int *pbSupportFramework) +{ + int featureBits[2] = { 0, 0 }; + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + _ASSERT(pbSupportFramework != 0); + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + if (tfa->supportFramework != supportNotSet) { + if (tfa->supportFramework == supportNo) + *pbSupportFramework = 0; + else + *pbSupportFramework = 1; + } else { + error = tfa98xx_dsp_get_sw_feature_bits(tfa, featureBits); + if (error == Tfa98xx_Error_Ok) { + *pbSupportFramework = 1; + tfa->supportFramework = supportYes; + } else { + *pbSupportFramework = 0; + tfa->supportFramework = supportNo; + error = Tfa98xx_Error_Ok; + } + } + + /* *pbSupportFramework only changed when error == Tfa98xx_Error_Ok */ + return error; +} + +enum Tfa98xx_Error + tfa98xx_dsp_write_speaker_parameters(struct tfa_device *tfa, + int length, const unsigned char *p_speaker_bytes) +{ + enum Tfa98xx_Error error; + int bSupportDrc; + + if (p_speaker_bytes != NULL) { + /* by design: keep the data opaque and no + * interpreting/calculation */ + /* Use long WaitResult retry count */ + error = tfa_dsp_cmd_id_write( + tfa, + MODULE_SPEAKERBOOST, + SB_PARAM_SET_LSMODEL, length, + p_speaker_bytes); + } else { + error = Tfa98xx_Error_Bad_Parameter; + } + + if (error != Tfa98xx_Error_Ok) + return error; + + error = tfa98xx_dsp_support_drc(tfa, &bSupportDrc); + if (error != Tfa98xx_Error_Ok) + return error; + + if (bSupportDrc) { + /* Need to set AgcGainInsert back to PRE, + * as the SetConfig forces it to POST */ + uint8_t bytes[3] = { 0, 0, 0 }; + + error = tfa_dsp_cmd_id_write(tfa, + MODULE_SPEAKERBOOST, + SB_PARAM_SET_AGCINS, + 3, + bytes); + } + + return error; +} + +enum Tfa98xx_Error + tfa98xx_dsp_write_config(struct tfa_device *tfa, int length, + const unsigned char *p_config_bytes) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int bSupportDrc; + + error = tfa_dsp_cmd_id_write(tfa, + MODULE_SPEAKERBOOST, + SB_PARAM_SET_CONFIG, length, + p_config_bytes); + if (error != Tfa98xx_Error_Ok) + return error; + + error = tfa98xx_dsp_support_drc(tfa, &bSupportDrc); + if (error != Tfa98xx_Error_Ok) + return error; + + if (bSupportDrc) { + /* Need to set AgcGainInsert back to PRE, + * as the SetConfig forces it to POST */ + uint8_t bytes[3] = { 0, 0, 0 }; + + error = tfa_dsp_cmd_id_write(tfa, + MODULE_SPEAKERBOOST, + SB_PARAM_SET_AGCINS, + 3, + bytes); + } + + return error; +} + +/* load all the parameters for the DRC settings from a file */ +enum Tfa98xx_Error tfa98xx_dsp_write_drc(struct tfa_device *tfa, + int length, const unsigned char *p_drc_bytes) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + if (p_drc_bytes != NULL) { + error = tfa_dsp_cmd_id_write(tfa, + MODULE_SPEAKERBOOST, + SB_PARAM_SET_DRC, length, + p_drc_bytes); + + } else { + error = Tfa98xx_Error_Bad_Parameter; + } + return error; +} + +enum Tfa98xx_Error tfa98xx_powerdown(struct tfa_device *tfa, int powerdown) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + error = TFA_SET_BF(tfa, PWDN, (uint16_t)powerdown); + + if (powerdown) { + /* Workaround for ticket PLMA5337 */ + if (tfa->tfa_family == 2) { + TFA_SET_BF_VOLATILE(tfa, AMPE, 0); + } + } + + return error; +} + +enum Tfa98xx_Error + tfa98xx_select_mode(struct tfa_device *tfa, enum Tfa98xx_Mode mode) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + if (error == Tfa98xx_Error_Ok) { + switch (mode) { + + default: + error = Tfa98xx_Error_Bad_Parameter; + } + } + + return error; +} + +int tfa_set_bf(struct tfa_device *tfa, const uint16_t bf, const uint16_t value) +{ + enum Tfa98xx_Error err; + uint16_t regvalue, msk, oldvalue; + + /* + * bitfield enum: + * - 0..3 : len + * - 4..7 : pos + * - 8..15 : address + */ + uint8_t len = bf & 0x0f; + uint8_t pos = (bf >> 4) & 0x0f; + uint8_t address = (bf >> 8) & 0xff; + + err = reg_read(tfa, address, ®value); + if (err) { + pr_err("Error getting bf :%d\n", -err); + return -err; + } + + oldvalue = regvalue; + msk = ((1 << (len + 1)) - 1) << pos; + regvalue &= ~msk; + regvalue |= value << pos; + + /* Only write when the current register value is not the same as the new value */ + if (oldvalue != regvalue) { + err = reg_write(tfa, address, regvalue); + if (err) { + pr_err("Error setting bf :%d\n", -err); + return -err; + } + } + + return 0; +} + +int tfa_set_bf_volatile(struct tfa_device *tfa, const uint16_t bf, const uint16_t value) +{ + enum Tfa98xx_Error err; + uint16_t regvalue, msk; + + /* + * bitfield enum: + * - 0..3 : len + * - 4..7 : pos + * - 8..15 : address + */ + uint8_t len = bf & 0x0f; + uint8_t pos = (bf >> 4) & 0x0f; + uint8_t address = (bf >> 8) & 0xff; + + err = reg_read(tfa, address, ®value); + if (err) { + pr_err("Error getting bf :%d\n", -err); + return -err; + } + + msk = ((1 << (len + 1)) - 1) << pos; + regvalue &= ~msk; + regvalue |= value << pos; + + err = reg_write(tfa, address, regvalue); + if (err) { + pr_err("Error setting bf :%d\n", -err); + return -err; + } + + return 0; +} + +int tfa_get_bf(struct tfa_device *tfa, const uint16_t bf) +{ + enum Tfa98xx_Error err; + uint16_t regvalue, msk; + uint16_t value; + + /* + * bitfield enum: + * - 0..3 : len + * - 4..7 : pos + * - 8..15 : address + */ + uint8_t len = bf & 0x0f; + uint8_t pos = (bf >> 4) & 0x0f; + uint8_t address = (bf >> 8) & 0xff; + + err = reg_read(tfa, address, ®value); + if (err) { + pr_err("Error getting bf :%d\n", -err); + return -err; + } + + msk = ((1 << (len + 1)) - 1) << pos; + regvalue &= msk; + value = regvalue >> pos; + + return value; +} + +int tfa_set_bf_value(const uint16_t bf, const uint16_t bf_value, uint16_t *p_reg_value) +{ + uint16_t regvalue, msk; + + /* + * bitfield enum: + * - 0..3 : len + * - 4..7 : pos + * - 8..15 : address + */ + uint8_t len = bf & 0x0f; + uint8_t pos = (bf >> 4) & 0x0f; + + regvalue = *p_reg_value; + + msk = ((1 << (len + 1)) - 1) << pos; + regvalue &= ~msk; + regvalue |= bf_value << pos; + + *p_reg_value = regvalue; + + return 0; +} + +uint16_t tfa_get_bf_value(const uint16_t bf, const uint16_t reg_value) +{ + uint16_t msk, value; + + /* + * bitfield enum: + * - 0..3 : len + * - 4..7 : pos + * - 8..15 : address + */ + uint8_t len = bf & 0x0f; + uint8_t pos = (bf >> 4) & 0x0f; + + msk = ((1 << (len + 1)) - 1) << pos; + value = (reg_value & msk) >> pos; + + return value; +} + + +int tfa_write_reg(struct tfa_device *tfa, const uint16_t bf, const uint16_t reg_value) +{ + enum Tfa98xx_Error err; + + /* bitfield enum - 8..15 : address */ + uint8_t address = (bf >> 8) & 0xff; + + err = reg_write(tfa, address, reg_value); + if (err) + return -err; + + return 0; +} + +int tfa_read_reg(struct tfa_device *tfa, const uint16_t bf) +{ + enum Tfa98xx_Error err; + uint16_t regvalue; + + /* bitfield enum - 8..15 : address */ + uint8_t address = (bf >> 8) & 0xff; + + err = reg_read(tfa, address, ®value); + if (err) + return -err; + + return regvalue; +} + +/* + * powerup the coolflux subsystem and wait for it + */ +enum Tfa98xx_Error tfa_cf_powerup(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int tries, status; + + /* power on the sub system */ + TFA_SET_BF_VOLATILE(tfa, PWDN, 0); + + // wait until everything is stable, in case clock has been off + if (tfa->verbose) + pr_info("Waiting for DSP system stable...\n"); + for (tries = CFSTABLE_TRIES; tries > 0; tries--) { + err = tfa98xx_dsp_system_stable(tfa, &status); + _ASSERT(err == Tfa98xx_Error_Ok); + if (status) + break; + else + msleep_interruptible(10); /* wait 10ms to avoid busload */ + } + if (tries == 0) {// timedout + pr_err("DSP subsystem start timed out\n"); + return Tfa98xx_Error_StateTimedOut; + } + + return err; +} + +/* + * Enable/Disable the I2S output for TFA1 devices + * without TDM interface + */ +static enum Tfa98xx_Error tfa98xx_aec_output(struct tfa_device *tfa, int enable) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + if ((tfa->daimap & Tfa98xx_DAI_TDM) == Tfa98xx_DAI_TDM) + return err; + + if (tfa->tfa_family == 1) + err = -tfa_set_bf(tfa, TFA1_BF_I2SDOE, (enable != 0)); + else { + pr_err("I2SDOE on unsupported family\n"); + err = Tfa98xx_Error_Not_Supported; + } + + return err; +} + +/* + * Print the current state of the hardware manager + * Device manager status information, man_state from TFA9888_N1B_I2C_regmap_V12 + */ +int is_94_N2_device(struct tfa_device *tfa) +{ + return ((((tfa->rev) & 0xff) == 0x94) && (((tfa->rev >> 8) & 0xff) > 0x1a)); +} +enum Tfa98xx_Error show_current_state(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int manstate = -1; + + if (tfa->tfa_family == 2 && tfa->verbose) { + if (is_94_N2_device(tfa)) + manstate = tfa_get_bf(tfa, TFA9894N2_BF_MANSTATE); + else + manstate = TFA_GET_BF(tfa, MANSTATE); + if (manstate < 0) + return -manstate; + + pr_debug("Current HW manager state: "); + + switch (manstate) { + case 0: pr_debug("power_down_state\n"); + break; + case 1: pr_debug("wait_for_source_settings_state\n"); + break; + case 2: pr_debug("connnect_pll_input_state\n"); + break; + case 3: pr_debug("disconnect_pll_input_state\n"); + break; + case 4: pr_debug("enable_pll_state\n"); + break; + case 5: pr_debug("enable_cgu_state\n"); + break; + case 6: pr_debug("init_cf_state\n"); + break; + case 7: pr_debug("enable_amplifier_state\n"); + break; + case 8: pr_debug("alarm_state\n"); + break; + case 9: pr_debug("operating_state\n"); + break; + case 10: pr_debug("mute_audio_state\n"); + break; + case 11: pr_debug("disable_cgu_pll_state\n"); + break; + default: + pr_debug("Unable to find current state\n"); + break; + } + } + + return err; +} + +enum Tfa98xx_Error tfaGetFwApiVersion(struct tfa_device *tfa, unsigned char *pFirmwareVersion) +{ + enum Tfa98xx_Error err = 0; + char cmd_buf[4]; + int cmd_len, res_len; + + if (tfa == NULL) + return Tfa98xx_Error_Bad_Parameter; + if (!tfa->is_probus_device) + { + err = mem_read(tfa, FW_VAR_API_VERSION, 1, (int *)pFirmwareVersion); + if (err) { + pr_debug("%s Error: Unable to get API Version from DSP\n", __func__); + return err; + } + } else + { + cmd_len = 0x03; + + /* GetAPI: Command is 0x00 0x80 0xFE */ + cmd_buf[0] = 0x00; + cmd_buf[1] = 0x80; + cmd_buf[2] = 0xFE; + + /* Write the command.*/ + + err = tfa98xx_write_dsp(tfa, cmd_len, (const char *)cmd_buf); + + /* Read the API Value.*/ + if (err == 0) + { + res_len = 3; + err = tfa98xx_read_dsp(tfa, res_len, (unsigned char *)pFirmwareVersion); + + } + } + return err; + +} + + +/* + * start the speakerboost algorithm + * this implies a full system startup when the system was not already started + * + */ +enum Tfa98xx_Error tfaRunSpeakerBoost(struct tfa_device *tfa, int force, int profile) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int value; + + if (force) { + err = tfaRunColdStartup(tfa, profile); + if (err) return err; + } + + /* Returns 1 when device is "cold" and 0 when device is warm */ + value = tfa_is_cold(tfa); + + pr_debug("Startup of device [%s] is a %sstart\n", tfaContDeviceName(tfa->cnt, tfa->dev_idx), value ? "cold" : "warm"); + /* cold start and not tap profile */ + if (value) { + /* Run startup and write all files */ + err = tfaRunSpeakerStartup(tfa, force, profile); + if (err) { + pr_err("tfaRunSpeakerStartup error %d\n", err); + return err; + } + /* Save the current profile and set the vstep to 0 */ + /* This needs to be overwriten even in CF bypass */ + tfa_dev_set_swprof(tfa, (unsigned short)profile); + tfa_dev_set_swvstep(tfa, 0); + + /* Synchonize I/V delay on 96/97 at cold start */ + if ((tfa->tfa_family == 1) && (tfa->daimap == Tfa98xx_DAI_TDM)) + tfa->sync_iv_delay = 1; + } + + return err; +} + +enum Tfa98xx_Error tfaRunSpeakerStartup(struct tfa_device *tfa, int force, int profile) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + pr_debug("%s force=%d profile=%d\n", __func__, force, profile); + if (!force) { // in case of force CF already runnning + err = tfaRunStartup(tfa, profile); + PRINT_ASSERT(err); + if (err) + return err; + + /* Startup with CF in bypass then return here */ + if (tfa_cf_enabled(tfa) == 0) + return err; + + /* respond to external DSP: -1:none, 0:no_dsp, 1:cold, 2:warm */ + if (tfa->ext_dsp == -1) { + err = tfaRunStartDSP(tfa); + if (err) + return err; + } + } + + /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1 */ + tfa98xx_auto_copy_mtp_to_iic(tfa); + + err = tfaGetFwApiVersion(tfa, (unsigned char *)&tfa->fw_itf_ver[0]); + if (err) { + pr_debug("[%s] cannot get FWAPI error = %d\n", __func__, err); + return err; + } + /* write all the files from the device list */ + err = tfaContWriteFiles(tfa); + if (err) { + pr_debug("[%s] tfaContWriteFiles error = %d\n", __func__, err); + return err; + } + + /* write all the files from the profile list (use volumstep 0) */ + err = tfaContWriteFilesProf(tfa, profile, 0); + if (err) { + pr_debug("[%s] tfaContWriteFilesProf error = %d\n", __func__, err); + return err; + } + + return err; +} + +/* + * Run calibration + */ +enum Tfa98xx_Error tfaRunSpeakerCalibration(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int calibrateDone; + + /* return if there is no audio running */ + if ((tfa->tfa_family == 2) && TFA_GET_BF(tfa, NOCLK)) + return Tfa98xx_Error_NoClock; + + /* When MTPOTC is set (cal=once) unlock key2 */ + if (TFA_GET_BF(tfa, MTPOTC) == 1) { + tfa98xx_key2(tfa, 0); + } + + /* await calibration, this should return ok */ + err = tfaRunWaitCalibration(tfa, &calibrateDone); + if (err == Tfa98xx_Error_Ok) { + err = tfa_dsp_get_calibration_impedance(tfa); + PRINT_ASSERT(err); + } + + /* When MTPOTC is set (cal=once) re-lock key2 */ + if (TFA_GET_BF(tfa, MTPOTC) == 1) { + tfa98xx_key2(tfa, 1); + } + + return err; +} + +enum Tfa98xx_Error tfaRunColdboot(struct tfa_device *tfa, int state) +{ +#define CF_CONTROL 0x8100 + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int tries = 10; + + /* repeat set ACS bit until set as requested */ + while (state != TFA_GET_BF(tfa, ACS)) { + /* set colstarted in CF_CONTROL to force ACS */ + err = mem_write(tfa, CF_CONTROL, state, Tfa98xx_DMEM_IOMEM); + PRINT_ASSERT(err); + + if (tries-- == 0) { + pr_debug("coldboot (ACS) did not %s\n", state ? "set" : "clear"); + return Tfa98xx_Error_Other; + } + } + + return err; +} + + + +/* + * load the patch if any + * else tell no loaded + */ +static enum Tfa98xx_Error tfa_run_load_patch(struct tfa_device *tfa) +{ + return tfaContWritePatch(tfa); +} + +/* + * this will load the patch witch will implicitly start the DSP + * if no patch is available the DPS is started immediately + */ +enum Tfa98xx_Error tfaRunStartDSP(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + err = tfa_run_load_patch(tfa); + if (err) { /* patch load is fatal so return immediately*/ + return err; + } + + /* Clear count_boot, should be reset to 0 before the DSP reset is released */ + err = mem_write(tfa, 512, 0, Tfa98xx_DMEM_XMEM); + PRINT_ASSERT(err); + + /* Reset DSP once for sure after initializing */ + if (err == Tfa98xx_Error_Ok) { + err = tfa98xx_dsp_reset(tfa, 0); + PRINT_ASSERT(err); + } + + /* Sample rate is needed to set the correct tables */ + err = tfa98xx_dsp_write_tables(tfa, TFA_GET_BF(tfa, AUDFS)); + PRINT_ASSERT(err); + + return err; +} + +/* + * start the clocks and wait until the AMP is switching + * on return the DSP sub system will be ready for loading + */ +enum Tfa98xx_Error tfaRunStartup(struct tfa_device *tfa, int profile) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); + int i, noinit = 0, audfs = 0, fractdel = 0; + + if (dev == NULL) + return Tfa98xx_Error_Fail; + + if (dev->bus) /* no i2c device, do nothing */ + return Tfa98xx_Error_Ok; + + /* process the device list to see if the user implemented the noinit */ + for (i = 0; i < dev->length; i++) { + if (dev->list[i].type == dscNoInit) { + noinit = 1; + break; + } + } + + if (!noinit) { + /* Read AUDFS & FRACTDEL prior to (re)init. */ + audfs = TFA_GET_BF(tfa, AUDFS); + fractdel = TFA_GET_BF(tfa, FRACTDEL); + /* load the optimal TFA98XX in HW settings */ + err = tfa98xx_init(tfa); + PRINT_ASSERT(err); + + /* Restore audfs & fractdel after coldboot, so we can calibrate with correct fs setting. + * in case something else was given in cnt file, profile below will apply this. */ + TFA_SET_BF(tfa, AUDFS, audfs); + TFA_SET_BF(tfa, FRACTDEL, fractdel); + } else { + pr_debug("\nWarning: No init keyword found in the cnt file. Init is skipped!\n"); + } + + /* I2S settings to define the audio input properties + * these must be set before the subsys is up */ + // this will run the list until a non-register item is encountered + err = tfaContWriteRegsDev(tfa); // write device register settings + PRINT_ASSERT(err); + // also write register the settings from the default profile + // NOTE we may still have ACS=1 so we can switch sample rate here + err = tfaContWriteRegsProf(tfa, profile); + PRINT_ASSERT(err); + + /* Factory trimming for the Boost converter */ + tfa98xx_factory_trimmer(tfa); + + /* Go to the initCF state */ + tfa_dev_set_state(tfa, TFA_STATE_INIT_CF, strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, profile), ".cal") != NULL); + + err = show_current_state(tfa); + + return err; +} + +/* + * run the startup/init sequence and set ACS bit + */ +enum Tfa98xx_Error tfaRunColdStartup(struct tfa_device *tfa, int profile) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + err = tfaRunStartup(tfa, profile); + PRINT_ASSERT(err); + if (err) + return err; + + if (!tfa->is_probus_device) { + /* force cold boot */ + err = tfaRunColdboot(tfa, 1); // set ACS + PRINT_ASSERT(err); + if (err) + return err; + } + + /* start */ + err = tfaRunStartDSP(tfa); + PRINT_ASSERT(err); + + return err; +} + +/* + * + */ +enum Tfa98xx_Error tfaRunMute(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int status; + int tries = 0; + + /* signal the TFA98XX to mute */ + if (tfa->tfa_family == 1) { + err = tfa98xx_set_mute(tfa, Tfa98xx_Mute_Amplifier); + + if (err == Tfa98xx_Error_Ok) { + /* now wait for the amplifier to turn off */ + do { + status = TFA_GET_BF(tfa, SWS); + if (status != 0) + msleep_interruptible(10); /* wait 10ms to avoid busload */ + else + break; + tries++; + } while (tries < AMPOFFWAIT_TRIES); + + + if (tfa->verbose) + pr_debug("-------------------- muted --------------------\n"); + + /*The amplifier is always switching*/ + if (tries == AMPOFFWAIT_TRIES) + return Tfa98xx_Error_Other; + } + } + + return err; +} +/* + * + */ +enum Tfa98xx_Error tfaRunUnmute(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + /* signal the TFA98XX to mute */ + err = tfa98xx_set_mute(tfa, Tfa98xx_Mute_Off); + + if (tfa->verbose) + pr_debug("-------------------unmuted ------------------\n"); + + return err; +} + +static void individual_calibration_results(struct tfa_device *tfa) +{ + int value_P, value_S; + + /* Read the calibration result in xmem (529=primary channel) (530=secondary channel) */ + mem_read(tfa, 529, 1, &value_P); + mem_read(tfa, 530, 1, &value_S); + + if (value_P != 1 && value_S != 1) + pr_debug("Calibration failed on both channels!\n"); + else if (value_P != 1) { + pr_debug("Calibration failed on Primary (Left) channel!\n"); + TFA_SET_BF_VOLATILE(tfa, SSLEFTE, 0); /* Disable the sound for the left speaker */ + } else if (value_S != 1) { + pr_debug("Calibration failed on Secondary (Right) channel!\n"); + TFA_SET_BF_VOLATILE(tfa, SSRIGHTE, 0); /* Disable the sound for the right speaker */ + } + + TFA_SET_BF_VOLATILE(tfa, AMPINSEL, 0); /* Set amplifier input to TDM */ + TFA_SET_BF_VOLATILE(tfa, SBSL, 1); +} + +/* + * wait for calibrateDone + */ +enum Tfa98xx_Error tfaRunWaitCalibration(struct tfa_device *tfa, int *calibrateDone) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int tries = 0, mtp_busy = 1, tries_mtp_busy = 0; + + *calibrateDone = 0; + + /* in case of calibrate once wait for MTPEX */ + if (TFA_GET_BF(tfa, MTPOTC)) { + // Check if MTP_busy is clear! + while (tries_mtp_busy < MTPBWAIT_TRIES) + { + mtp_busy = tfa_dev_get_mtpb(tfa); + if (mtp_busy == 1) + msleep_interruptible(10); /* wait 10ms to avoid busload */ + else + break; + tries_mtp_busy++; + } + + if (tries_mtp_busy < MTPBWAIT_TRIES) { + /* Because of the msleep TFA98XX_API_WAITRESULT_NTRIES is way to long! + * Setting this to 25 will take it atleast 25*50ms = 1.25 sec + */ + while ((*calibrateDone == 0) && (tries < MTPEX_WAIT_NTRIES)) { + *calibrateDone = TFA_GET_BF(tfa, MTPEX); + if (*calibrateDone == 1) + break; + msleep_interruptible(50); /* wait 50ms to avoid busload */ + tries++; + } + + if (tries >= MTPEX_WAIT_NTRIES) { + tries = TFA98XX_API_WAITRESULT_NTRIES; + } + } else { + pr_err("MTP bussy after %d tries\n", MTPBWAIT_TRIES); + } + } + + /* poll xmem for calibrate always + * calibrateDone = 0 means "calibrating", + * calibrateDone = -1 (or 0xFFFFFF) means "fails" + * calibrateDone = 1 means calibration done + */ + while ((*calibrateDone != 1) && (tries < TFA98XX_API_WAITRESULT_NTRIES)) { + err = mem_read(tfa, TFA_FW_XMEM_CALIBRATION_DONE, 1, calibrateDone); + if (*calibrateDone == -1) + break; + tries++; + } + + if (*calibrateDone != 1) { + pr_err("Calibration failed!\n"); + err = Tfa98xx_Error_Bad_Parameter; + } else if (tries == TFA98XX_API_WAITRESULT_NTRIES) { + pr_debug("Calibration has timedout!\n"); + err = Tfa98xx_Error_StateTimedOut; + } else if (tries_mtp_busy == 1000) { + pr_err("Calibrate Failed: MTP_busy stays high!\n"); + err = Tfa98xx_Error_StateTimedOut; + } + + /* Give reason why calibration failed! */ + if (err != Tfa98xx_Error_Ok) { + if ((tfa->tfa_family == 2) && (TFA_GET_BF(tfa, REFCKSEL) == 1)) { + pr_err("Unable to calibrate the device with the internal clock!\n"); + } + } + + /* Check which speaker calibration failed. Only for 88C */ + if ((err != Tfa98xx_Error_Ok) && ((tfa->rev & 0x0FFF) == 0xc88)) { + individual_calibration_results(tfa); + } + + return err; +} + +/* + * tfa_dev_start will only do the basics: Going from powerdown to operating or a profile switch. + * for calibrating or akoustic shock handling use the tfa98xxCalibration function. + */ +/*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ +#ifdef __KERNEL__ +enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep, u8 pcm_format) +#else +enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep) +#endif +/*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int active_profile = -1; + + pr_debug("entry...\n"); + /* Get currentprofile */ + active_profile = tfa_dev_get_swprof(tfa); + if (active_profile == 0xff) + active_profile = -1; + + /* TfaRun_SpeakerBoost implies un-mute */ + pr_debug("Active_profile:%s, next_profile:%s\n", + tfaContProfileName(tfa->cnt, tfa->dev_idx, active_profile), + tfaContProfileName(tfa->cnt, tfa->dev_idx, next_profile)); + + err = show_current_state(tfa); + + if (tfa->tfa_family == 1) { /* TODO move this to ini file */ + /* Enable I2S output on TFA1 devices without TDM */ + err = tfa98xx_aec_output(tfa, 1); + if (err != Tfa98xx_Error_Ok) + goto error_exit; + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ +#ifdef __KERNEL__ + if ((tfa->tfa_family == 2) && (tfa->daimap & Tfa98xx_DAI_TDM)) { + //TFA_SET_BF(tfa, TDMSRCMAP, 2); /*the TDMSRCMAP should be set in cnt file.*/ + /* we should remove below settings from cnt file, otherwise will be overwrite by cnt file later.*/ + if (pcm_format == 16) { + TFA_SET_BF(tfa, TDMNBCK, 0); + TFA_SET_BF(tfa, TDMSLLN, 15); + TFA_SET_BF(tfa, TDMSSIZE, 15); + } else if ((24 == pcm_format) || (pcm_format == 32)) { + TFA_SET_BF(tfa, TDMNBCK, 2); + TFA_SET_BF(tfa, TDMSLLN, 31); + TFA_SET_BF(tfa, TDMSSIZE, 31); + } else { + err = Tfa98xx_Error_Bad_Parameter; + goto error_exit; + } + } +#endif + /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ + + } + + if (tfa->bus != 0) { /* non i2c */ +#ifndef __KERNEL__ + tfadsp_fw_start(tfa, next_profile, vstep); +#endif /* __KERNEL__ */ + } else { + /* Check if we need coldstart or ACS is set */ + err = show_current_state(tfa); + err = tfaRunSpeakerBoost(tfa, 0, next_profile); + if (err != Tfa98xx_Error_Ok) + goto error_exit; + + /* Make sure internal oscillator is running for DSP devices (non-dsp and max1 this is no-op) */ + tfa98xx_set_osc_powerdown(tfa, 0); + +#if 0 + tfa_dev_set_state(tfa, TFA_STATE_OPERATING | TFA_STATE_MUTE, 0); +#else + tfa_dev_set_state(tfa, TFA_STATE_OPERATING, 0); +#endif + pr_debug("[NXP] %s after implemented tfa_dev_set_state()\n", __func__); + } + active_profile = tfa_dev_get_swprof(tfa); + + /* Profile switching */ + if ((next_profile != active_profile && active_profile >= 0)) { + err = tfaContWriteProfile(tfa, next_profile, vstep); + if (err != Tfa98xx_Error_Ok) { + pr_err("tfaContWriteProfile failed %d\n", err); + goto error_exit; + } + } + + /* If the profile contains the .standby suffix go to powerdown + * else we should be in operating state + */ + if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, next_profile), ".standby") != NULL) { + tfa_dev_set_swprof(tfa, (unsigned short)next_profile); + tfa_dev_set_swvstep(tfa, (unsigned short)tfa->vstep); + goto error_exit; + } + + err = show_current_state(tfa); + +#ifndef __KERNEL__ + /* get current vstep*/ + tfa->vstep = tfa_dev_get_swvstep(tfa); +#endif + if ((TFA_GET_BF(tfa, CFE) != 0) && (vstep != tfa->vstep) && (vstep != -1)) { + err = tfaContWriteFilesVstep(tfa, next_profile, vstep); + if (err != Tfa98xx_Error_Ok) { + pr_err("tfaContWriteFilesVstep failed %d\n", err); + goto error_exit; + } + pr_debug("after implemented tfaContWriteFilesVstep()\n"); + } + + /* Always search and apply filters after a startup */ + err = tfa_set_filters(tfa, next_profile); + if (err != Tfa98xx_Error_Ok) { + pr_err("tfaContWriteFilesVstep failed %d\n", err); + goto error_exit; + } + + tfa_dev_set_swprof(tfa, (unsigned short)next_profile); + tfa_dev_set_swvstep(tfa, (unsigned short)vstep); + + /* PLMA5539: Gives information about current setting of powerswitch */ + if (tfa->verbose) { + if (!tfa98xx_powerswitch_is_enabled(tfa)) + pr_info("Device start without powerswitch enabled!\n"); + } + +error_exit: + pr_debug("[NXP] %s end...\n", __func__); + show_current_state(tfa); + if (err != Tfa98xx_Error_Ok) { + pr_err("TFA98xx Error code is %d\n", err); + return tfa_error_max; + } + return tfa_error_ok; +} + +enum tfa_error tfa_dev_stop(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int manstate = 0, retry = 0; + + /* mute */ + tfaRunMute(tfa); + + /* Make sure internal oscillator is not running for DSP devices (non-dsp and max1 this is no-op) */ + tfa98xx_set_osc_powerdown(tfa, 1); + + /* powerdown CF */ + err = tfa98xx_powerdown(tfa, 1); + if (err != Tfa98xx_Error_Ok) + goto error_exit; + + /* disable I2S output on TFA1 devices without TDM */ + err = tfa98xx_aec_output(tfa, 0); + + /* added by nxp34663 beging. */ + /* we should ensure the state machine in powerdown mode here. */ + manstate = TFA_GET_BF(tfa, MANSTATE); + while ((manstate >= 4) && (retry < 100)) { + pr_debug("%s waitting state machine goto powerdown. MANSTATE=%d\n", __func__, manstate); + msleep_interruptible(10); + manstate = TFA_GET_BF(tfa, MANSTATE); + retry++; + } + /* added by nxp34663 end. */ +error_exit: + if (err != Tfa98xx_Error_Ok) { + pr_err("TFA98xx Error code is %d\n", err); + return tfa_error_max; + } + + return tfa_error_ok; +} + +/* + * int registers and coldboot dsp + */ +int tfa_reset(struct tfa_device *tfa) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + int state = -1; + int retry_cnt = 0; + + /* Check device state. Print warning if reset is done from other state than powerdown (when verbose) */ + state = tfa_dev_get_state(tfa); + if (tfa->verbose) { + if (((tfa->tfa_family == 1) && state != TFA_STATE_RESET) || + ((tfa->tfa_family == 2) && state != TFA_STATE_POWERDOWN)) { + pr_info("WARNING: Device reset should be performed in POWERDOWN state\n"); + } + } + + /* Split TFA1 behavior from TFA2*/ + if (tfa->tfa_family == 1) { + err = TFA_SET_BF(tfa, I2CR, 1); + if (err) + return err; + err = tfa98xx_powerdown(tfa, 0); + if (err) + return err; + err = tfa_cf_powerup(tfa); + if (err) + return err; + err = tfaRunColdboot(tfa, 1); + if (err) + return err; + err = TFA_SET_BF(tfa, I2CR, 1); + } else { + /* Probus devices needs extra protection to ensure proper reset + behavior, this step is valid only in state other than powerdown */ + if (tfa->is_probus_device && state != TFA_STATE_POWERDOWN) { + err = TFA_SET_BF_VOLATILE(tfa, AMPE, 0); + if (err) + return err; + err = tfa98xx_powerdown(tfa, 1); + if (err) + return err; + } + + err = TFA_SET_BF_VOLATILE(tfa, I2CR, 1); + if (err) + return err; + + /* Restore MANSCONF to POR state */ + err = TFA_SET_BF_VOLATILE(tfa, MANSCONF, 0); + if (err) + return err; + + /* reset all i2C registers to default */ + err = -TFA_SET_BF(tfa, I2CR, 1); + PRINT_ASSERT(err); + + /* Probus devices HW are already reseted here, + Last step is to send init message to softDSP */ + if (tfa->is_probus_device) { + if (tfa->ext_dsp > 0) { + err = tfa98xx_init_dsp(tfa); + /* ext_dsp status from warm to cold after reset */ + if (tfa->ext_dsp == 2) { + tfa->ext_dsp = 1; + } + } + } else { + /* Restore MANCOLD to POR state */ + TFA_SET_BF_VOLATILE(tfa, MANCOLD, 1); + + /* Coolflux has to be powered on to ensure proper ACS + bit state */ + + /* Powerup CF to access CF io */ + err = tfa98xx_powerdown(tfa, 0); + if (err) + return err; + + /* For clock */ + err = tfa_cf_powerup(tfa); + if (err) + return err; + + /* Force cold boot */ + err = tfaRunColdboot(tfa, 1); /* Set ACS */ + if (err) + return err; + + /* Set PWDN = 1, this will transfer device into powerdown state */ + err = TFA_SET_BF_VOLATILE(tfa, PWDN, 1); + if (err) + return err; + + /* 88 needs SBSL on top of PWDN bit to start transition, + for 92 and 94 this doesn't matter */ + err = TFA_SET_BF_VOLATILE(tfa, SBSL, 1); + if (err) + return err; + + /* Powerdown state should be reached within 1ms */ + for (retry_cnt = 0; retry_cnt < TFA98XX_WAITRESULT_NTRIES; retry_cnt++) { + if (is_94_N2_device(tfa)) + state = tfa_get_bf(tfa, TFA9894N2_BF_MANSTATE); + else + state = TFA_GET_BF(tfa, MANSTATE); + if (state < 0) { + return err; + } + + /* Check for MANSTATE=Powerdown (0) */ + if (state == 0) + break; + msleep_interruptible(2); + } + + /* Reset all I2C registers to default values, + now device state is consistent, same as after powerup */ + err = TFA_SET_BF(tfa, I2CR, 1); + } + } + + return err; +} + +/* + * Write all the bytes specified by num_bytes and data + */ +enum Tfa98xx_Error + tfa98xx_write_data(struct tfa_device *tfa, + unsigned char subaddress, int num_bytes, + const unsigned char data[]) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + /* subaddress followed by data */ + const int bytes2write = num_bytes + 1; + unsigned char *write_data; + + if (num_bytes > TFA2_MAX_PARAM_SIZE) + return Tfa98xx_Error_Bad_Parameter; + + write_data = (unsigned char *)kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + if (write_data == NULL) + return Tfa98xx_Error_Fail; + + write_data[0] = subaddress; + memcpy(&write_data[1], data, num_bytes); + + error = tfa98xx_write_raw(tfa, bytes2write, write_data); + + kmem_cache_free(tfa->cachep, write_data); + return error; +} + +/* + * fill the calibration value as milli ohms in the struct + * + * assume that the device has been calibrated + */ +enum Tfa98xx_Error tfa_dsp_get_calibration_impedance(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned char bytes[3 * 2] = { 0 }; + int nr_bytes, i, data[2], calibrateDone, spkr_count = 0, cal_idx = 0; + unsigned int scaled_data; + int tries = 0; + + error = tfa_supported_speakers(tfa, &spkr_count); + + if (tfa_dev_mtp_get(tfa, TFA_MTP_OTC) && tfa_dev_mtp_get(tfa, TFA_MTP_EX)) { + pr_debug("Getting calibration values from MTP\n"); + + if ((tfa->rev & 0xFF) == 0x88) { + for (i = 0; i < spkr_count; i++) { + if (i == 0) + tfa->mohm[i] = tfa_dev_mtp_get(tfa, TFA_MTP_RE25_PRIM); + else + tfa->mohm[i] = tfa_dev_mtp_get(tfa, TFA_MTP_RE25_SEC); + } + } else { + tfa->mohm[0] = tfa_dev_mtp_get(tfa, TFA_MTP_RE25); + } + + } else if ((tfa_dev_mtp_get(tfa, TFA_MTP_OTC) == 0) && (tfa_dev_mtp_get(tfa, TFA_MTP_EX) == 0)) { + pr_debug("Getting calibration values from Speakerboost\n"); + + /* Make sure the calibrateDone bit is set before getting the values from speakerboost! + * This does not work for 72 (because the dsp cannot set this bit) + */ + if (!tfa->is_probus_device) { + /* poll xmem for calibrate always + * calibrateDone = 0 means "calibrating", + * calibrateDone = -1 (or 0xFFFFFF) means "fails" + * calibrateDone = 1 means calibration done + */ + calibrateDone = 0; + while ((calibrateDone != 1) && (tries < TFA98XX_API_WAITRESULT_NTRIES)) { + error = mem_read(tfa, TFA_FW_XMEM_CALIBRATION_DONE, 1, &calibrateDone); + if ((calibrateDone == 1) || (Tfa98xx_Error_Ok != error)) + break; + tries++; + } + + if (calibrateDone == 1) + pr_debug("Calibration successed!!!\n"); + else if ((calibrateDone != 1) || (Tfa98xx_Error_Ok != error)) { + pr_err("Calibration failed! calibrateDone=%d error=%d\n", calibrateDone, error); + error = Tfa98xx_Error_Bad_Parameter; + } else if (tries == TFA98XX_API_WAITRESULT_NTRIES) { + pr_debug("Calibration has timedout!\n"); + error = Tfa98xx_Error_StateTimedOut; + } + } else { + /* dsp inside of TFA device. */ + calibrateDone = 1; + } + /* SoftDSP interface differs from hw-dsp interfaces */ + if (tfa->is_probus_device && tfa->cnt->ndev > 1) { + spkr_count = tfa->cnt->ndev; + } + + if (calibrateDone == 1) { + nr_bytes = spkr_count * 3; + error = tfa_dsp_cmd_id_write_read(tfa, MODULE_SPEAKERBOOST, SB_PARAM_GET_RE25C, nr_bytes, bytes); + if (error == Tfa98xx_Error_Ok) { + tfa98xx_convert_bytes2data(nr_bytes, bytes, data); + + for (i = 0; i < spkr_count; i++) { + + /* for probus devices, calibration values coming from soft-dsp speakerboost, + are ordered in a different way. Re-align to standard representation. */ + cal_idx = i; + if ((tfa->is_probus_device && tfa->dev_idx >= 1)) { + cal_idx = 0; + } + + /* signed data has a limit of 30 Ohm */ + scaled_data = data[i]; + + if (tfa->tfa_family == 2) + tfa->mohm[cal_idx] = (scaled_data * 1000) / TFA2_FW_ReZ_SCALE; + else + tfa->mohm[cal_idx] = (scaled_data * 1000) / TFA1_FW_ReZ_SCALE; + } + } + } + } else { + for (i = 0; i < spkr_count; i++) { + tfa->mohm[i] = 0; + } + pr_err("Please run calibration command first.\n"); + error = Tfa98xx_Error_Bad_Parameter; + } + + return error; +} + +/* start count from 1, 0 is invalid */ +int tfa_dev_get_swprof(struct tfa_device *tfa) +{ + return (tfa->dev_ops.get_swprof)(tfa); +} + +int tfa_dev_set_swprof(struct tfa_device *tfa, unsigned short new_value) +{ + return (tfa->dev_ops.set_swprof)(tfa, new_value + 1); +} + +/* same value for all channels + * start count from 1, 0 is invalid */ +int tfa_dev_get_swvstep(struct tfa_device *tfa) +{ + return (tfa->dev_ops.get_swvstep)(tfa); +} + +int tfa_dev_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + return (tfa->dev_ops.set_swvstep)(tfa, new_value + 1); +} + +/* + function overload for MTPB + */ +int tfa_dev_get_mtpb(struct tfa_device *tfa) +{ + return (tfa->dev_ops.get_mtpb)(tfa); +} + +int tfa_is_cold(struct tfa_device *tfa) +{ + int value; + + /* + * check for cold boot status + */ + if (tfa->is_probus_device) { + if (tfa->ext_dsp > 0) { + if (tfa->ext_dsp == 2) + value = 0; // warm + else /* no dsp or cold */ + value = 1; // cold + } else { + value = (TFA_GET_BF(tfa, MANSCONF) == 0); + } + } else { + value = TFA_GET_BF(tfa, ACS); + } + + return value; +} + +int tfa_needs_reset(struct tfa_device *tfa) +{ + int value; + + /* checks if the DSP commands SetAlgoParams and SetMBDrc + * need a DSP reset (now: at coldstart or during calibration) + */ + if (tfa_is_cold(tfa) == 1 || tfa->needs_reset == 1) + value = 1; + else + value = 0; + + return value; +} + +int tfa_cf_enabled(struct tfa_device *tfa) +{ + int value; + + /* For 72 there is no CF */ + if (tfa->is_probus_device) { + value = (tfa->ext_dsp != 0); + } else { + value = TFA_GET_BF(tfa, CFE); + } + + return value; +} + +#define NR_COEFFS 6 +#define NR_BIQUADS 28 +#define BQ_SIZE (3 * NR_COEFFS) +#define DSP_MSG_OVERHEAD 27 + +#pragma pack(push, 1) +struct dsp_msg_all_coeff { + uint8_t select_eq[3]; + uint8_t biquad[NR_BIQUADS][NR_COEFFS][3]; +}; +#pragma pack(pop) + +/* number of biquads for each equalizer */ +static const int eq_biquads[] = { + 10, 10, 2, 2, 2, 2 +}; + +#define NR_EQ (int)(sizeof(eq_biquads) / sizeof(int)) + +enum Tfa98xx_Error dsp_partial_coefficients(struct tfa_device *tfa, uint8_t *prev, uint8_t *next) +{ + uint8_t bq, eq; + int eq_offset; + int new_cost, old_cost; + uint32_t eq_biquad_mask[NR_EQ]; + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + struct dsp_msg_all_coeff *data1 = (struct dsp_msg_all_coeff *)prev; + struct dsp_msg_all_coeff *data2 = (struct dsp_msg_all_coeff *)next; + + old_cost = DSP_MSG_OVERHEAD + 3 + sizeof(struct dsp_msg_all_coeff); + new_cost = 0; + + eq_offset = 0; + for (eq = 0; eq < NR_EQ; eq++) { + uint8_t *eq1 = &data1->biquad[eq_offset][0][0]; + uint8_t *eq2 = &data2->biquad[eq_offset][0][0]; + + eq_biquad_mask[eq] = 0; + + if (memcmp(eq1, eq2, BQ_SIZE*eq_biquads[eq]) != 0) { + int nr_bq = 0; + int bq_sz, eq_sz; + + for (bq = 0; bq < eq_biquads[eq]; bq++) { + uint8_t *bq1 = &eq1[bq*BQ_SIZE]; + uint8_t *bq2 = &eq2[bq*BQ_SIZE]; + + if (memcmp(bq1, bq2, BQ_SIZE) != 0) { + eq_biquad_mask[eq] |= (1 << bq); + nr_bq++; + } + } + + bq_sz = (2 * 3 + BQ_SIZE) * nr_bq; + eq_sz = 2 * 3 + BQ_SIZE * eq_biquads[eq]; + + /* dsp message i2c transaction overhead */ + bq_sz += DSP_MSG_OVERHEAD * nr_bq; + eq_sz += DSP_MSG_OVERHEAD; + + if (bq_sz >= eq_sz) { + eq_biquad_mask[eq] = 0xffffffff; + + new_cost += eq_sz; + + } else { + new_cost += bq_sz; + } + } + pr_debug("eq_biquad_mask[%d] = 0x%.8x\n", eq, eq_biquad_mask[eq]); + + eq_offset += eq_biquads[eq]; + } + + pr_debug("cost for writing all coefficients = %d\n", old_cost); + pr_debug("cost for writing changed coefficients = %d\n", new_cost); + + if (new_cost >= old_cost) { + const int buffer_sz = 3 + sizeof(struct dsp_msg_all_coeff); + uint8_t *buffer; + + buffer = kmalloc(buffer_sz, GFP_KERNEL); + if (buffer == NULL) + return Tfa98xx_Error_Fail; + + /* cmd id */ + buffer[0] = 0x00; + buffer[1] = 0x82; + buffer[2] = 0x00; + + /* parameters */ + memcpy(&buffer[3], data2, sizeof(struct dsp_msg_all_coeff)); + + err = dsp_msg(tfa, buffer_sz, (const char *)buffer); + + kfree(buffer); + if (err) + return err; + + } else { + eq_offset = 0; + for (eq = 0; eq < NR_EQ; eq++) { + uint8_t *eq2 = &data2->biquad[eq_offset][0][0]; + + if (eq_biquad_mask[eq] == 0xffffffff) { + const int msg_sz = 6 + BQ_SIZE * eq_biquads[eq]; + uint8_t *msg; + + msg = kmalloc(msg_sz, GFP_KERNEL); + if (msg == NULL) + return Tfa98xx_Error_Fail; + + /* cmd id */ + msg[0] = 0x00; + msg[1] = 0x82; + msg[2] = 0x00; + + /* select eq and bq */ + msg[3] = 0x00; + msg[4] = eq + 1; + msg[5] = 0x00; /* all biquads */ + + /* biquad parameters */ + memcpy(&msg[6], eq2, BQ_SIZE * eq_biquads[eq]); + + err = dsp_msg(tfa, msg_sz, (const char *)msg); + + kfree(msg); + if (err) + return err; + + } else if (eq_biquad_mask[eq] != 0) { + for (bq = 0; bq < eq_biquads[eq]; bq++) { + + if (eq_biquad_mask[eq] & (1 << bq)) { + uint8_t *bq2 = &eq2[bq*BQ_SIZE]; + const int msg_sz = 6 + BQ_SIZE; + uint8_t *msg; + + msg = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); + if (msg == NULL) + return Tfa98xx_Error_Fail; + + /* cmd id */ + msg[0] = 0x00; + msg[1] = 0x82; + msg[2] = 0x00; + + /* select eq and bq*/ + msg[3] = 0x00; + msg[4] = eq + 1; + msg[5] = bq + 1; + + /* biquad parameters */ + memcpy(&msg[6], bq2, BQ_SIZE); + + err = dsp_msg(tfa, msg_sz, (const char *)msg); + + kmem_cache_free(tfa->cachep, msg); + if (err) + return err; + } + } + } + eq_offset += eq_biquads[eq]; + } + } + + return err; +} + +/* fill context info */ +int tfa_dev_probe(int slave, struct tfa_device *tfa) +{ + uint16_t rev; + + tfa->slave_address = (unsigned char)slave; + + /* read revid via low level hal, register 3 */ + if (tfa98xx_read_register16(tfa, 3, &rev) != Tfa98xx_Error_Ok) { + PRINT("\nError: Unable to read revid from slave:0x%02x\n", slave); + return -1; + } + + tfa->rev = rev; + tfa->dev_idx = -1; + tfa->state = TFA_STATE_UNKNOWN; + tfa->p_regInfo = NULL; + + tfa_set_query_info(tfa); + + tfa->in_use = 1; + + return 0; +} + +enum tfa_error tfa_dev_set_state(struct tfa_device *tfa, enum tfa_state state, int is_calibration) +{ + enum tfa_error err = tfa_error_ok; + int loop = 50, ready = 0; + int count; + + /* Base states */ + /* Do not change the order of setting bits as this is important! */ + switch (state & 0x0f) { + case TFA_STATE_POWERDOWN: /* PLL in powerdown, Algo up */ + break; + case TFA_STATE_INIT_HW: /* load I2C/PLL hardware setting (~wait2srcsettings) */ + break; + case TFA_STATE_INIT_CF: /* coolflux HW access possible (~initcf) */ + /* Start with SBSL=0 to stay in initCF state */ + if (!tfa->is_probus_device) + TFA_SET_BF(tfa, SBSL, 0); + + /* We want to leave Wait4SrcSettings state for max2 */ + if (tfa->tfa_family == 2) + TFA_SET_BF(tfa, MANSCONF, 1); + + /* And finally set PWDN to 0 to leave powerdown state */ + TFA_SET_BF(tfa, PWDN, 0); + + /* Make sure the DSP is running! */ + do { + + if (tfa98xx_dsp_system_stable(tfa, &ready) != Tfa98xx_Error_Ok) + return tfa_error_max; + + if (ready) + break; + } while (loop--); + if (((!tfa->is_probus_device) && (is_calibration)) || ((tfa->rev & 0xff) == 0x13)) + { + /* Enable FAIM when clock is stable, to avoid MTP corruption */ + err = (enum tfa_error)tfa98xx_faim_protect(tfa, 1); + if (tfa->verbose) { + pr_debug("FAIM enabled (err:%d).\n", err); + } + } + break; + case TFA_STATE_INIT_FW: /* DSP framework active (~patch loaded) */ + break; + case TFA_STATE_OPERATING: /* Amp and Algo running */ + /* Depending on our previous state we need to set 3 bits */ + TFA_SET_BF(tfa, PWDN, 0); /* Coming from state 0 */ + TFA_SET_BF(tfa, MANSCONF, 1); /* Coming from state 1 */ + pr_debug("tfa->is_probus_device=%d is_calibration=%d\n", tfa->is_probus_device, is_calibration); + /* we should set AMPE as 1 for NON-DSP device, otherwise will be setting SBSL as 1 */ + if (tfa->is_probus_device) { + TFA_SET_BF(tfa, AMPE, 1); /* Coming from state 6 */ + } else { + TFA_SET_BF(tfa, SBSL, 1); /* Coming from state 6 */ + } + + /* + * Disable MTP clock to protect memory. + * However in case of calibration wait for DSP! (This should be case only during calibration). + */ + if ((TFA_GET_BF(tfa, MTPOTC) == 1) && (tfa->tfa_family == 2) && is_calibration) { + count = MTPEX_WAIT_NTRIES * 4; /* Calibration takes a lot of time */ + while ((TFA_GET_BF(tfa, MTPEX) != 1) && count) { + msleep_interruptible(10); + count--; + } + } + if (((!tfa->is_probus_device) && (is_calibration)) || ((tfa->rev & 0xff) == 0x13)) + { + err = (enum tfa_error)tfa98xx_faim_protect(tfa, 0); + if (tfa->verbose) { + pr_debug("FAIM disabled (err:%d).\n", err); + } + } + /* Synchonize I/V delay on 96/97 at cold start */ + if (tfa->sync_iv_delay) { + if (tfa->verbose) + pr_debug("syncing I/V delay for %x\n", + (tfa->rev & 0xff)); + + /* wait for ACS to be cleared */ + count = 10; + while ((TFA_GET_BF(tfa, ACS) == 1) && + (count-- > 0)) { + msleep_interruptible(1); + } + + tfa98xx_dsp_reset(tfa, 1); + tfa98xx_dsp_reset(tfa, 0); + tfa->sync_iv_delay = 0; + } + break; + case TFA_STATE_FAULT: /* An alarm or error occurred */ + break; + case TFA_STATE_RESET: /* I2C reset and ACS set */ + tfa98xx_init(tfa); + break; + default: + if (state & 0x0f) + return tfa_error_bad_param; + } + + /* state modifiers */ + + if (state & TFA_STATE_MUTE) + tfa98xx_set_mute(tfa, Tfa98xx_Mute_Amplifier); + + if (state & TFA_STATE_UNMUTE) + tfa98xx_set_mute(tfa, Tfa98xx_Mute_Off); + + tfa->state = state; + + return tfa_error_ok; +} + +enum tfa_state tfa_dev_get_state(struct tfa_device *tfa) +{ + int cold = 0; + int manstate; + + /* different per family type */ + if (tfa->tfa_family == 1) { + cold = TFA_GET_BF(tfa, ACS); + if (cold && TFA_GET_BF(tfa, PWDN)) + tfa->state = TFA_STATE_RESET; + else if (!cold && TFA_GET_BF(tfa, SWS)) + tfa->state = TFA_STATE_OPERATING; + } else /* family 2 */ { + if (is_94_N2_device(tfa)) + manstate = tfa_get_bf(tfa, TFA9894N2_BF_MANSTATE); + else + manstate = TFA_GET_BF(tfa, MANSTATE); + switch (manstate) { + case 0: + tfa->state = TFA_STATE_POWERDOWN; + break; + case 8: /* if dsp reset if off assume framework is running */ + tfa->state = TFA_GET_BF(tfa, RST) ? TFA_STATE_INIT_CF : TFA_STATE_INIT_FW; + break; + case 9: + tfa->state = TFA_STATE_OPERATING; + break; + default: + break; + } + } + + return tfa->state; +} + +int tfa_dev_mtp_get(struct tfa_device *tfa, enum tfa_mtp item) +{ + int value = 0; + + switch (item) { + case TFA_MTP_OTC: + value = TFA_GET_BF(tfa, MTPOTC); + break; + case TFA_MTP_EX: + value = TFA_GET_BF(tfa, MTPEX); + break; + case TFA_MTP_RE25: + case TFA_MTP_RE25_PRIM: + if (tfa->tfa_family == 2) { + if ((tfa->rev & 0xFF) == 0x88) + value = TFA_GET_BF(tfa, R25CL); + else if ((tfa->rev & 0xFF) == 0x13) + value = tfa_get_bf(tfa, TFA9912_BF_R25C); + else + value = TFA_GET_BF(tfa, R25C); + } else { + reg_read(tfa, 0x83, (unsigned short *)&value); + } + break; + case TFA_MTP_RE25_SEC: + if ((tfa->rev & 0xFF) == 0x88) { + value = TFA_GET_BF(tfa, R25CR); + } else { + pr_debug("Error: Current device has no secondary Re25 channel\n"); + } + break; + case TFA_MTP_LOCK: + break; + } + + return value; +} + +enum tfa_error tfa_dev_mtp_set(struct tfa_device *tfa, enum tfa_mtp item, int value) +{ + enum Tfa98xx_Error err = Tfa98xx_Error_Ok; + + switch (item) { + case TFA_MTP_OTC: + err = tfa98xx_set_mtp(tfa, (uint16_t)value, TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MSK); + break; + case TFA_MTP_EX: + err = tfa98xx_set_mtp(tfa, (uint16_t)value, TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK); + break; + case TFA_MTP_RE25: + case TFA_MTP_RE25_PRIM: + if (tfa->tfa_family == 2) { + tfa98xx_key2(tfa, 0); /* unlock */ + if ((tfa->rev & 0xFF) == 0x88) + TFA_SET_BF(tfa, R25CL, (uint16_t)value); + else + { + if (tfa->is_probus_device == 1 && TFA_GET_BF(tfa, MTPOTC) == 1) + tfa2_manual_mtp_cpy(tfa, 0xF4, value, 2); + TFA_SET_BF(tfa, R25C, (uint16_t)value); + } + tfa98xx_key2(tfa, 1); /* lock */ + } + break; + case TFA_MTP_RE25_SEC: + if ((tfa->rev & 0xFF) == 0x88) { + TFA_SET_BF(tfa, R25CR, (uint16_t)value); + } else { + pr_debug("Error: Current device has no secondary Re25 channel\n"); + err = Tfa98xx_Error_Bad_Parameter; + } + break; + case TFA_MTP_LOCK: + break; + } + + if (err != Tfa98xx_Error_Ok) { + pr_err("TFA98xx Error code is %d\n", err); + return tfa_error_max; + } + return tfa_error_ok; +} + +int tfa_get_pga_gain(struct tfa_device *tfa) +{ + return TFA_GET_BF(tfa, SAAMGAIN); +} + +int tfa_set_pga_gain(struct tfa_device *tfa, uint16_t value) +{ + + return TFA_SET_BF(tfa, SAAMGAIN, value); +} + +int tfa_get_noclk(struct tfa_device *tfa) +{ + return TFA_GET_BF(tfa, NOCLK); +} + + +enum Tfa98xx_Error tfa_status(struct tfa_device *tfa) +{ + int value; + uint16_t val; + + /* + * check IC status bits: cold start + * and DSP watch dog bit to re init + */ + value = TFA_READ_REG(tfa, VDDS); /* STATUSREG */ + if (value < 0) + return -value; + val = (uint16_t)value; + + /* pr_debug("SYS_STATUS0: 0x%04x\n", val); */ + if (TFA_GET_BF_VALUE(tfa, ACS, val) || + TFA_GET_BF_VALUE(tfa, WDS, val)) { + + if (TFA_GET_BF_VALUE(tfa, ACS, val)) + pr_err("ERROR: ACS\n"); + if (TFA_GET_BF_VALUE(tfa, WDS, val)) + pr_err("ERROR: WDS\n"); + + return Tfa98xx_Error_DSP_not_running; + } + + if (TFA_GET_BF_VALUE(tfa, SPKS, val)) + pr_err("ERROR: SPKS\n"); + if (!TFA_GET_BF_VALUE(tfa, SWS, val)) + pr_err("ERROR: SWS\n"); + + /* Check secondary errors */ + if (!TFA_GET_BF_VALUE(tfa, CLKS, val) || + !TFA_GET_BF_VALUE(tfa, UVDS, val) || + !TFA_GET_BF_VALUE(tfa, OVDS, val) || + !TFA_GET_BF_VALUE(tfa, OTDS, val) || + !TFA_GET_BF_VALUE(tfa, PLLS, val) || + (!(tfa->daimap & Tfa98xx_DAI_TDM) && + !TFA_GET_BF_VALUE(tfa, VDDS, val))) + pr_err("Misc errors detected: STATUS_FLAG0 = 0x%x\n", val); + + if ((tfa->daimap & Tfa98xx_DAI_TDM) && (tfa->tfa_family == 2)) { + value = TFA_READ_REG(tfa, TDMERR); /* STATUS_FLAGS1 */ + if (value < 0) + return -value; + val = (uint16_t)value; + if (TFA_GET_BF_VALUE(tfa, TDMERR, val) || + TFA_GET_BF_VALUE(tfa, TDMLUTER, val)) + pr_err("TDM related errors: STATUS_FLAG1 = 0x%x\n", val); + } + + return Tfa98xx_Error_Ok; +} +#define NR_OF_BATS 10 +void tfa_adapt_noisemode(struct tfa_device *tfa) +{ + int i, avbatt; + long total_bats = 0; + + if ((tfa_get_bf(tfa, 0x5900) == 0) || (tfa_get_bf(tfa, TFA9873_BF_LP1) == 1)) + { + if (tfa->verbose) + pr_debug("Adapting low noise mode is not needed, condition not fulfilled!\n"); + return; + } + if (tfa->verbose) + pr_debug("Adapting low noise mode\n"); + + for (i = 0; i < NR_OF_BATS; i++) { + int bat = TFA_GET_BF(tfa, BATS); + + if (tfa->verbose) + pr_debug("bats[%d]=%d\n", i, bat); + total_bats += bat; + msleep_interruptible(5); + } + + avbatt = (int)(total_bats / NR_OF_BATS); + + if (avbatt <= MIN_BATT_LEVEL && !tfa_get_bf(tfa, TFA9873_BF_LNMODE))//640 corresponds to 3.4 volt, MCH_TO_TEST + { + tfa_set_bf(tfa, TFA9873_BF_LNMODE, 1); + pr_debug("\navbatt= %d--Applying high noise gain\n", avbatt); + } else if (avbatt > MAX_BATT_LEVEL && tfa_get_bf(tfa, TFA9873_BF_LNMODE)) + { + tfa_set_bf(tfa, TFA9873_BF_LNMODE, 0); + pr_debug("\navbatt= %d--Applying automatic noise gain\n", avbatt); + } + + +} + +#ifdef __KERNEL__ +int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep, u8 pcm_format) +#else +int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep) +#endif +{ + enum tfa_error err; + int no_clk = 0; + + /* Remove sticky bit by reading it once */ + TFA_GET_BF(tfa, NOCLK); + + /* No clock detected */ + if (tfa_irq_get(tfa, tfa9912_irq_stnoclk)) { + no_clk = TFA_GET_BF(tfa, NOCLK); + + /* Detect for clock is lost! (clock is not stable) */ + if (no_clk == 1) { + /* Clock is lost. Set I2CR to remove POP noise */ + pr_info("No clock detected. Resetting the I2CR to avoid pop on 72!\n"); +#ifdef __KERNEL__ + err = tfa_dev_start(tfa, profile, vstep, pcm_format); +#else + err = tfa_dev_start(tfa, profile, vstep); +#endif + if (err != tfa_error_ok) { + pr_err("Error loading i2c registers (tfa_dev_start), err=%d\n", err); + } else { + pr_info("Setting i2c registers after I2CR succesfull\n"); + tfa_dev_set_state(tfa, TFA_STATE_UNMUTE, 0); + } + + /* Remove sticky bit by reading it once */ + tfa_get_noclk(tfa); + + /* This is only for SAAM on the 72. + Since the NOCLK interrupt is only enabled for 72 this is the place + However: Not tested yet! But also does not harm normal flow! + */ + if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, profile), ".saam")) { + pr_info("Powering down from a SAAM profile, workaround PLMA4766 used!\n"); + TFA_SET_BF(tfa, PWDN, 1); + TFA_SET_BF(tfa, AMPE, 0); + TFA_SET_BF(tfa, SAMMODE, 0); + } + } + + /* If clk is stable set polarity to check for LOW (no clock)*/ + tfa_irq_set_pol(tfa, tfa9912_irq_stnoclk, (no_clk == 0)); + + /* clear interrupt */ + tfa_irq_clear(tfa, tfa9912_irq_stnoclk); + } + + /* return no_clk to know we called tfa_dev_start */ + return no_clk; +} + +void tfa_lp_mode_interrupt(struct tfa_device *tfa) +{ + const int irq_stclp0 = 36; /* FIXME: this 72 interrupt does not excist for 9912 */ + int lp0, lp1; + + if (tfa_irq_get(tfa, irq_stclp0)) { + lp0 = TFA_GET_BF(tfa, LP0); + if (lp0 > 0) { + pr_info("lowpower mode 0 detected\n"); + } else { + pr_info("lowpower mode 0 not detected\n"); + } + + tfa_irq_set_pol(tfa, irq_stclp0, (lp0 == 0)); + + /* clear interrupt */ + tfa_irq_clear(tfa, irq_stclp0); + } + + if (tfa_irq_get(tfa, tfa9912_irq_stclpr)) { + lp1 = TFA_GET_BF(tfa, LP1); + if (lp1 > 0) { + pr_info("lowpower mode 1 detected\n"); + } else { + pr_info("lowpower mode 1 not detected\n"); + } + + tfa_irq_set_pol(tfa, tfa9912_irq_stclpr, (lp1 == 0)); + + /* clear interrupt */ + tfa_irq_clear(tfa, tfa9912_irq_stclpr); + } +} diff --git a/src/tfa_init.c b/src/tfa_init.c new file mode 100644 index 000000000000..54ed275cccf6 --- /dev/null +++ b/src/tfa_init.c @@ -0,0 +1,1934 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +#include "dbgprint.h" +#include "tfa_service.h" +#include "tfa_internal.h" +#include "tfa_container.h" +#include "tfa98xx_tfafieldnames.h" + + /* The CurrentSense4 registers are not in the datasheet */ +#define TFA98XX_CURRENTSENSE4_CTRL_CLKGATECFOFF (1<<2) +#define TFA98XX_CURRENTSENSE4 0x49 + +/***********************************************************************************/ +/* GLOBAL (Defaults) */ +/***********************************************************************************/ +static enum Tfa98xx_Error no_overload_function_available(struct tfa_device *tfa, int not_used) +{ + (void)tfa; + (void)not_used; + + return Tfa98xx_Error_Ok; +} + +static enum Tfa98xx_Error no_overload_function_available2(struct tfa_device *tfa) +{ + (void)tfa; + + return Tfa98xx_Error_Ok; +} + +/* tfa98xx_dsp_system_stable +* return: *ready = 1 when clocks are stable to allow DSP subsystem access +*/ +static enum Tfa98xx_Error tfa_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short status; + int value; + + /* check the contents of the STATUS register */ + value = TFA_READ_REG(tfa, AREFS); + if (value < 0) { + error = -value; + *ready = 0; + _ASSERT(error); /* an error here can be fatal */ + return error; + } + status = (unsigned short)value; + + /* check AREFS and CLKS: not ready if either is clear */ + *ready = !((TFA_GET_BF_VALUE(tfa, AREFS, status) == 0) + || (TFA_GET_BF_VALUE(tfa, CLKS, status) == 0)); + + return error; +} + +/* tfa98xx_toggle_mtp_clock + * Allows to stop clock for MTP/FAim needed for PLMA5505 */ +static enum Tfa98xx_Error tfa_faim_protect(struct tfa_device *tfa, int state) +{ + (void)tfa; + (void)state; + + return Tfa98xx_Error_Ok; +} + +/** Set internal oscillator into power down mode. + * + * This function is a worker for tfa98xx_set_osc_powerdown(). + * + * @param[in] tfa device description structure + * @param[in] state new state 0 - oscillator is on, 1 oscillator is off. + * + * @return Tfa98xx_Error_Ok when successfull, error otherwise. + */ +static enum Tfa98xx_Error tfa_set_osc_powerdown(struct tfa_device *tfa, int state) +{ + /* This function has no effect in general case, only for tfa9912 */ + (void)tfa; + (void)state; + + return Tfa98xx_Error_Ok; +} +static enum Tfa98xx_Error tfa_update_lpm(struct tfa_device *tfa, int state) +{ + /* This function has no effect in general case, only for tfa9912 */ + (void)tfa; + (void)state; + + return Tfa98xx_Error_Ok; +} +static enum Tfa98xx_Error tfa_dsp_reset(struct tfa_device *tfa, int state) +{ + /* generic function */ + TFA_SET_BF_VOLATILE(tfa, RST, (uint16_t)state); + + return Tfa98xx_Error_Ok; +} + +int tfa_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int mtpk, active_value = tfa->profile; + + /* Also set the new value in the struct */ + tfa->profile = new_value - 1; + + /* for TFA1 devices */ + /* it's in MTP shadow, so unlock if not done already */ + mtpk = TFA_GET_BF(tfa, MTPK); /* get current key */ + TFA_SET_BF_VOLATILE(tfa, MTPK, 0x5a); + TFA_SET_BF_VOLATILE(tfa, SWPROFIL, new_value); /* set current profile */ + TFA_SET_BF_VOLATILE(tfa, MTPK, (uint16_t)mtpk); /* restore key */ + + return active_value; +} + +static int tfa_get_swprofile(struct tfa_device *tfa) +{ + return /*TFA_GET_BF(tfa, SWPROFIL) - 1*/tfa->profile; +} + +static int tfa_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + int mtpk, active_value = tfa->vstep; + + /* Also set the new value in the struct */ + tfa->vstep = new_value - 1; + + /* for TFA1 devices */ + /* it's in MTP shadow, so unlock if not done already */ + mtpk = TFA_GET_BF(tfa, MTPK); /* get current key */ + TFA_SET_BF_VOLATILE(tfa, MTPK, 0x5a); + TFA_SET_BF_VOLATILE(tfa, SWVSTEP, new_value); /* set current vstep */ + TFA_SET_BF_VOLATILE(tfa, MTPK, (uint16_t)mtpk); /* restore key */ + + return active_value; +} + +static int tfa_get_swvstep(struct tfa_device *tfa) +{ + int value = 0; + /* Set the new value in the hw register */ + value = TFA_GET_BF(tfa, SWVSTEP); + + /* Also set the new value in the struct */ + tfa->vstep = value - 1; + + return value - 1; /* invalid if 0 */ +} + +static int tfa_get_mtpb(struct tfa_device *tfa) +{ + + int value = 0; + + /* Set the new value in the hw register */ + value = TFA_GET_BF(tfa, MTPB); + + return value; +} + +static enum Tfa98xx_Error +tfa_set_mute_nodsp(struct tfa_device *tfa, int mute) +{ + (void)tfa; + (void)mute; + + return Tfa98xx_Error_Ok; +} + +void set_ops_defaults(struct tfa_device_ops *ops) +{ + /* defaults */ + ops->reg_read = tfa98xx_read_register16; + ops->reg_write = tfa98xx_write_register16; + ops->mem_read = tfa98xx_dsp_read_mem; + ops->mem_write = tfa98xx_dsp_write_mem_word; + ops->dsp_msg = tfa_dsp_msg; + ops->dsp_msg_read = tfa_dsp_msg_read; + ops->dsp_write_tables = no_overload_function_available; + ops->dsp_reset = tfa_dsp_reset; + ops->dsp_system_stable = tfa_dsp_system_stable; + ops->auto_copy_mtp_to_iic = no_overload_function_available2; + ops->factory_trimmer = no_overload_function_available2; + ops->set_swprof = tfa_set_swprofile; + ops->get_swprof = tfa_get_swprofile; + ops->set_swvstep = tfa_set_swvstep; + ops->get_swvstep = tfa_get_swvstep; + ops->get_mtpb = tfa_get_mtpb; + ops->set_mute = tfa_set_mute_nodsp; + ops->faim_protect = tfa_faim_protect; + ops->set_osc_powerdown = tfa_set_osc_powerdown; + ops->update_lpm = tfa_update_lpm; +} + +/***********************************************************************************/ +/* no TFA + * external DSP SB instance */ + /***********************************************************************************/ +static short tfanone_swvstep, swprof; //TODO emulate in hal plugin +static enum Tfa98xx_Error tfanone_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + (void)tfa; /* suppress warning */ + *ready = 1; /* assume always ready */ + + return Tfa98xx_Error_Ok; +} + +static int tfanone_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int active_value = tfa_dev_get_swprof(tfa); + + /* Set the new value in the struct */ + tfa->profile = new_value - 1; + + /* Set the new value in the hw register */ + swprof = new_value; + + return active_value; +} + +static int tfanone_get_swprofile(struct tfa_device *tfa) +{ + (void)tfa; /* suppress warning */ + return swprof; +} + +static int tfanone_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + /* Set the new value in the struct */ + tfa->vstep = new_value - 1; + + /* Set the new value in the hw register */ + tfanone_swvstep = new_value; + + return new_value; +} + +static int tfanone_get_swvstep(struct tfa_device *tfa) +{ + (void)tfa; /* suppress warning */ + return tfanone_swvstep; +} + +void tfanone_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->dsp_system_stable = tfanone_dsp_system_stable; + ops->set_swprof = tfanone_set_swprofile; + ops->get_swprof = tfanone_get_swprofile; + ops->set_swvstep = tfanone_set_swvstep; + ops->get_swvstep = tfanone_get_swvstep; + +} + +/***********************************************************************************/ +/* TFA9912 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9912_faim_protect(struct tfa_device *tfa, int status) +{ + enum Tfa98xx_Error ret = Tfa98xx_Error_Fail; + + if (tfa) { + if (status == 0 || status == 1) { + ret = -(tfa_set_bf(tfa, TFA9912_BF_SSFAIME, (uint16_t)status)); + } + } + + return ret; +} + +static enum Tfa98xx_Error tfa9912_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short value, xor; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* Unlock keys to write settings */ + error = reg_write(tfa, 0x0F, 0x5A6B); + error = reg_read(tfa, 0xFB, &value); + xor = value ^ 0x005A; + error = reg_write(tfa, 0xA0, xor); + + /* The optimal settings */ + if (tfa->rev == 0x1a13) { + + /* ----- generated code start ----- */ + /* ----- version 1.43 ----- */ + reg_write(tfa, 0x00, 0x0255); //POR=0x0245 + reg_write(tfa, 0x01, 0x838a); //POR=0x83ca + reg_write(tfa, 0x02, 0x2dc8); //POR=0x2828 + reg_write(tfa, 0x05, 0x762a); //POR=0x766a + reg_write(tfa, 0x22, 0x543c); //POR=0x545c + reg_write(tfa, 0x26, 0x0100); //POR=0x0010 + reg_write(tfa, 0x51, 0x0000); //POR=0x0080 + reg_write(tfa, 0x52, 0x551c); //POR=0x1afc + reg_write(tfa, 0x53, 0x003e); //POR=0x001e + reg_write(tfa, 0x61, 0x000c); //POR=0x0018 + reg_write(tfa, 0x63, 0x0a96); //POR=0x0a9a + reg_write(tfa, 0x65, 0x0a82); //POR=0x0a8b + reg_write(tfa, 0x66, 0x0701); //POR=0x0700 + reg_write(tfa, 0x6c, 0x00d5); //POR=0x02d5 + reg_write(tfa, 0x70, 0x26f8); //POR=0x06e0 + reg_write(tfa, 0x71, 0x3074); //POR=0x2074 + reg_write(tfa, 0x75, 0x4484); //POR=0x4585 + reg_write(tfa, 0x76, 0x72ea); //POR=0x54a2 + reg_write(tfa, 0x83, 0x0716); //POR=0x0617 + reg_write(tfa, 0x89, 0x0013); //POR=0x0014 + reg_write(tfa, 0xb0, 0x4c08); //POR=0x4c00 + reg_write(tfa, 0xc6, 0x004e); //POR=0x000e /* PLMA5539: Please make sure bit 6 is always on! */ + /* ----- generated code end ----- */ + + /* PLMA5505: MTP key open makes vulanable for MTP corruption */ + tfa9912_faim_protect(tfa, 0); + } else { + pr_info("Warning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); + } + + return error; +} + +static enum Tfa98xx_Error tfa9912_factory_trimmer(struct tfa_device *tfa) +{ + unsigned short currentValue, delta; + int result; + + /* Factory trimming for the Boost converter */ + /* check if there is a correction needed */ + result = TFA_GET_BF(tfa, DCMCCAPI); + if (result) { + /* Get currentvalue of DCMCC and the Delta value */ + currentValue = (unsigned short)TFA_GET_BF(tfa, DCMCC); + delta = (unsigned short)TFA_GET_BF(tfa, USERDEF); + + /* check the sign bit (+/-) */ + result = TFA_GET_BF(tfa, DCMCCSB); + if (result == 0) { + /* Do not exceed the maximum value of 15 */ + if (currentValue + delta < 15) { + TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue + delta); + if (tfa->verbose) + pr_debug("Max coil current is set to: %d\n", currentValue + delta); + } else { + TFA_SET_BF_VOLATILE(tfa, DCMCC, 15); + if (tfa->verbose) + pr_debug("Max coil current is set to: 15\n"); + } + } else if (result == 1) { + /* Do not exceed the minimum value of 0 */ + if (currentValue - delta > 0) { + TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue - delta); + if (tfa->verbose) + pr_debug("Max coil current is set to: %d\n", currentValue - delta); + } else { + TFA_SET_BF_VOLATILE(tfa, DCMCC, 0); + if (tfa->verbose) + pr_debug("Max coil current is set to: 0\n"); + } + } + } + + return Tfa98xx_Error_Ok; +} + +static enum Tfa98xx_Error tfa9912_auto_copy_mtp_to_iic(struct tfa_device *tfa) +{ + /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1. Workaround for 72, 88 and 9912/9892(see PLMA5290) */ + return reg_write(tfa, 0xA3, 0x20); +} + +static int tfa9912_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int active_value = tfa_dev_get_swprof(tfa); + + /* Set the new value in the struct */ + tfa->profile = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9912_BF_SWPROFIL, new_value); + + return active_value; +} + +static int tfa9912_get_swprofile(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9912_BF_SWPROFIL) - 1; +} + +static int tfa9912_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + /* Set the new value in the struct */ + tfa->vstep = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9912_BF_SWVSTEP, new_value); + + return new_value; +} + +static int tfa9912_get_swvstep(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9912_BF_SWVSTEP) - 1; +} + +static enum Tfa98xx_Error +tfa9912_set_mute(struct tfa_device *tfa, int mute) +{ + tfa_set_bf(tfa, TFA9912_BF_CFSM, (const uint16_t)mute); + + return Tfa98xx_Error_Ok; +} + +/* Maksimum value for combination of boost_voltage and vout calibration offset (see PLMA5322, PLMA5528). */ +#define TFA9912_VBOOST_MAX 57 +#define TFA9912_CALIBR_BOOST_MAX 63 +#define TFA9912_DCDCCNT6_REG (TFA9912_BF_DCVOF >> 8) +#define TFA9912_CALIBR_REG 0xf1 + +static uint16_t tfa9912_vboost_fixup(struct tfa_device *tfa, uint16_t dcdc_cnt6) +{ + unsigned short cal_offset; + unsigned short boost_v_1st, boost_v_2nd; + uint16_t new_dcdc_cnt6; + + /* Get current calibr_vout_offset, this register is not supported by bitfields */ + reg_read(tfa, TFA9912_CALIBR_REG, &cal_offset); + cal_offset = (cal_offset & 0x001f); + new_dcdc_cnt6 = dcdc_cnt6; + + /* Get current boost_volatage values */ + boost_v_1st = tfa_get_bf_value(TFA9912_BF_DCVOF, new_dcdc_cnt6); + boost_v_2nd = tfa_get_bf_value(TFA9912_BF_DCVOS, new_dcdc_cnt6); + + /* Check boost voltages */ + if (boost_v_1st > TFA9912_VBOOST_MAX) + boost_v_1st = TFA9912_VBOOST_MAX; + + if (boost_v_2nd > TFA9912_VBOOST_MAX) + boost_v_2nd = TFA9912_VBOOST_MAX; + + /* Recalculate values, max for the sum is TFA9912_CALIBR_BOOST_MAX */ + if (boost_v_1st + cal_offset > TFA9912_CALIBR_BOOST_MAX) + boost_v_1st = TFA9912_CALIBR_BOOST_MAX - cal_offset; + + if (boost_v_2nd + cal_offset > TFA9912_CALIBR_BOOST_MAX) + boost_v_2nd = TFA9912_CALIBR_BOOST_MAX - cal_offset; + + tfa_set_bf_value(TFA9912_BF_DCVOF, boost_v_1st, &new_dcdc_cnt6); + tfa_set_bf_value(TFA9912_BF_DCVOS, boost_v_2nd, &new_dcdc_cnt6); + + /* Change register value only when it's neccesary */ + if (new_dcdc_cnt6 != dcdc_cnt6) { + if (tfa->verbose) + pr_debug("tfa9912: V boost fixup applied. Old 0x%04x, new 0x%04x\n", + dcdc_cnt6, new_dcdc_cnt6); + dcdc_cnt6 = new_dcdc_cnt6; + } + + return dcdc_cnt6; +} + +/* PLMA5322, PLMA5528 - Limit values of DCVOS and DCVOF to range specified in datasheet. */ +enum Tfa98xx_Error tfa9912_reg_write(struct tfa_device *tfa, unsigned char subaddress, unsigned short value) +{ + if (subaddress == TFA9912_DCDCCNT6_REG) { + /* Correct V boost (first and secondary) to ensure 12V is not exceeded. */ + value = tfa9912_vboost_fixup(tfa, value); + } + + return tfa98xx_write_register16(tfa, subaddress, value); +} + +/** Set internal oscillator into power down mode for TFA9912. +* +* This function is a worker for tfa98xx_set_osc_powerdown(). +* +* @param[in] tfa device description structure +* @param[in] state new state 0 - oscillator is on, 1 oscillator is off. +* +* @return Tfa98xx_Error_Ok when successfull, error otherwise. +*/ +static enum Tfa98xx_Error tfa9912_set_osc_powerdown(struct tfa_device *tfa, int state) +{ + if (state == 1 || state == 0) { + return -tfa_set_bf(tfa, TFA9912_BF_MANAOOSC, (uint16_t)state); + } + + return Tfa98xx_Error_Bad_Parameter; +} +/** update low power mode of the device. +* +* @param[in] tfa device description structure +* @param[in] state State of the low power mode1 detector control +* 0 - low power mode1 detector control enabled, +* 1 - low power mode1 detector control disabled(low power mode is also disabled). +* +* @return Tfa98xx_Error_Ok when successfull, error otherwise. +*/ +static enum Tfa98xx_Error tfa9912_update_lpm(struct tfa_device *tfa, int state) +{ + if (state == 1 || state == 0) { + return -tfa_set_bf(tfa, TFA9912_BF_LPM1DIS, (uint16_t)state); + } + return Tfa98xx_Error_Bad_Parameter; +} + +void tfa9912_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9912_specific; + /* PLMA5322, PLMA5528 - Limits values of DCVOS and DCVOF. */ + ops->reg_write = tfa9912_reg_write; + ops->factory_trimmer = tfa9912_factory_trimmer; + ops->auto_copy_mtp_to_iic = tfa9912_auto_copy_mtp_to_iic; + ops->set_swprof = tfa9912_set_swprofile; + ops->get_swprof = tfa9912_get_swprofile; + ops->set_swvstep = tfa9912_set_swvstep; + ops->get_swvstep = tfa9912_get_swvstep; + ops->set_mute = tfa9912_set_mute; + ops->faim_protect = tfa9912_faim_protect; + ops->set_osc_powerdown = tfa9912_set_osc_powerdown; + ops->update_lpm = tfa9912_update_lpm; +} + +/***********************************************************************************/ +/* TFA9872 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9872_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + uint16_t MANAOOSC = 0x0140; /* version 17 */ + unsigned short value, xor; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* Unlock key 1 and 2 */ + error = reg_write(tfa, 0x0F, 0x5A6B); + error = reg_read(tfa, 0xFB, &value); + xor = value ^ 0x005A; + error = reg_write(tfa, 0xA0, xor); + tfa98xx_key2(tfa, 0); + + switch (tfa->rev) { + case 0x1a72: + case 0x2a72: + /* ----- generated code start ----- */ + /* ----- version 26 ----- */ + reg_write(tfa, 0x00, 0x1801); //POR=0x0001 + reg_write(tfa, 0x02, 0x2dc8); //POR=0x2028 + reg_write(tfa, 0x20, 0x0890); //POR=0x2890 + reg_write(tfa, 0x22, 0x043c); //POR=0x045c + reg_write(tfa, 0x51, 0x0000); //POR=0x0080 + reg_write(tfa, 0x52, 0x1a1c); //POR=0x7ae8 + reg_write(tfa, 0x58, 0x161c); //POR=0x101c + reg_write(tfa, 0x61, 0x0198); //POR=0x0000 + reg_write(tfa, 0x65, 0x0a8b); //POR=0x0a9a + reg_write(tfa, 0x70, 0x07f5); //POR=0x06e6 + reg_write(tfa, 0x74, 0xcc84); //POR=0xd823 + reg_write(tfa, 0x82, 0x01ed); //POR=0x000d + reg_write(tfa, 0x83, 0x0014); //POR=0x0013 + reg_write(tfa, 0x84, 0x0021); //POR=0x0020 + reg_write(tfa, 0x85, 0x0001); //POR=0x0003 + /* ----- generated code end ----- */ + break; + case 0x1b72: + case 0x2b72: + case 0x3b72: + /* ----- generated code start ----- */ + /* ----- version 25.00 ----- */ + reg_write(tfa, 0x02, 0x2dc8); //POR=0x2828 + reg_write(tfa, 0x20, 0x0890); //POR=0x2890 + reg_write(tfa, 0x22, 0x043c); //POR=0x045c + reg_write(tfa, 0x23, 0x0001); //POR=0x0003 + reg_write(tfa, 0x51, 0x0000); //POR=0x0080 + reg_write(tfa, 0x52, 0x5a1c); //POR=0x7a08 + reg_write(tfa, 0x61, 0x0198); //POR=0x0000 + reg_write(tfa, 0x63, 0x0a9a); //POR=0x0a93 + reg_write(tfa, 0x65, 0x0a82); //POR=0x0a8d + reg_write(tfa, 0x6f, 0x01e3); //POR=0x02e4 + reg_write(tfa, 0x70, 0x06fd); //POR=0x06e6 + reg_write(tfa, 0x71, 0x307e); //POR=0x207e + reg_write(tfa, 0x74, 0xcc84); //POR=0xd913 + reg_write(tfa, 0x75, 0x1132); //POR=0x118a + reg_write(tfa, 0x82, 0x01ed); //POR=0x000d + reg_write(tfa, 0x83, 0x001a); //POR=0x0013 + /* ----- generated code end ----- */ + break; + default: + pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); + break; + } + + /* Turn off the osc1m to save power: PLMA4928 */ + error = tfa_set_bf(tfa, MANAOOSC, 1); + + /* Bypass OVP by setting bit 3 from register 0xB0 (bypass_ovp=1): PLMA5258 */ + error = reg_read(tfa, 0xB0, &value); + value |= 1 << 3; + error = reg_write(tfa, 0xB0, value); + + return error; +} + +static enum Tfa98xx_Error tfa9872_auto_copy_mtp_to_iic(struct tfa_device *tfa) +{ + /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1. Workaround for 72 and 88 (see PLMA5290) */ + return reg_write(tfa, 0xA3, 0x20); +} + +static int tfa9872_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int active_value = tfa_dev_get_swprof(tfa); + + /* Set the new value in the struct */ + tfa->profile = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9872_BF_SWPROFIL, new_value); + + return active_value; +} + +static int tfa9872_get_swprofile(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9872_BF_SWPROFIL) - 1; +} + +static int tfa9872_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + + /* Set the new value in the struct */ + tfa->vstep = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9872_BF_SWVSTEP, new_value); + + return new_value; +} + +static int tfa9872_get_swvstep(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9872_BF_SWVSTEP) - 1; +} + +void tfa9872_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9872_specific; + ops->auto_copy_mtp_to_iic = tfa9872_auto_copy_mtp_to_iic; + ops->set_swprof = tfa9872_set_swprofile; + ops->get_swprof = tfa9872_get_swprofile; + ops->set_swvstep = tfa9872_set_swvstep; + ops->get_swvstep = tfa9872_get_swvstep; + ops->set_mute = tfa_set_mute_nodsp; +} + +/***********************************************************************************/ +/* TFA9873 */ +/***********************************************************************************/ + +static int tfa9873_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int active_value = tfa_dev_get_swprof(tfa); + + /* Set the new value in the struct */ + tfa->profile = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9873_BF_SWPROFIL, new_value); + + return active_value; +} + +static int tfa9873_get_swprofile(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9873_BF_SWPROFIL) - 1; +} + +static int tfa9873_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + + /* Set the new value in the struct */ + tfa->vstep = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9873_BF_SWVSTEP, new_value); + + return new_value; +} + +static int tfa9873_get_swvstep(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9873_BF_SWVSTEP) - 1; +} + +/* tfa98xx_dsp_system_stable +* return: *ready = 1 when clocks are stable to allow DSP subsystem access +*/ +static enum Tfa98xx_Error tfa9873_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + /* check CLKS: ready if set */ + *ready = tfa_get_bf(tfa, TFA9873_BF_CLKS) == 1; + + return error; +} + +static int tfa9873_get_mtpb(struct tfa_device *tfa) +{ + + int value; + + value = tfa_get_bf(tfa, TFA9873_BF_MTPB); + return value; +} +static enum Tfa98xx_Error tfa9873_faim_protect(struct tfa_device *tfa, int status) +{ + enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; + /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ + ret = tfa_set_bf_volatile(tfa, TFA9873_BF_OPENMTP, (uint16_t)(status)); + return ret; +} +static enum Tfa98xx_Error tfa9873_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short value, xor; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* Unlock key 1 and 2 */ + error = reg_write(tfa, 0x0F, 0x5A6B); + error = reg_read(tfa, 0xFB, &value); + xor = value ^ 0x005A; + error = reg_write(tfa, 0xA0, xor); + tfa98xx_key2(tfa, 0); + + switch (tfa->rev) { + case 0x0a73: + /* Initial revision ID */ + /* ----- generated code start ----- */ + /* ----- version 28 ----- */ + reg_write(tfa, 0x02, 0x0628); //POR=0x0008 + reg_write(tfa, 0x4c, 0x00e9); //POR=0x00ff + reg_write(tfa, 0x52, 0x17d0); //POR=0x57d0 + reg_write(tfa, 0x56, 0x0011); //POR=0x0019 + reg_write(tfa, 0x58, 0x0200); //POR=0x0210 + reg_write(tfa, 0x59, 0x0001); //POR=0x0000 + reg_write(tfa, 0x5f, 0x0180); //POR=0x0100 + reg_write(tfa, 0x61, 0x0183); //POR=0x0a82 + reg_write(tfa, 0x63, 0x055a); //POR=0x0a9a + reg_write(tfa, 0x65, 0x0542); //POR=0x0a82 + reg_write(tfa, 0x6f, 0x00a3); //POR=0x0085 + reg_write(tfa, 0x70, 0xa3fb); //POR=0x23fb + reg_write(tfa, 0x71, 0x007e); //POR=0x107e + reg_write(tfa, 0x83, 0x009a); //POR=0x0799 + reg_write(tfa, 0x84, 0x0211); //POR=0x0011 + reg_write(tfa, 0x85, 0x0382); //POR=0x0380 + reg_write(tfa, 0x8c, 0x0210); //POR=0x0010 + reg_write(tfa, 0xd5, 0x0000); //POR=0x0100 + /* ----- generated code end ----- */ + break; + case 0x0b73: + /* ----- generated code start ----- */ + /* ----- version 16 ----- */ + reg_write(tfa, 0x02, 0x0628); //POR=0x0008 + reg_write(tfa, 0x61, 0x0183); //POR=0x0182 + reg_write(tfa, 0x63, 0x005a); //POR=0x055a + reg_write(tfa, 0x6f, 0x0082); //POR=0x00a5 + reg_write(tfa, 0x70, 0xa3eb); //POR=0x23fb + reg_write(tfa, 0x73, 0x0187); //POR=0x0107 + reg_write(tfa, 0x83, 0x071c); //POR=0x0799 + reg_write(tfa, 0x85, 0x0380); //POR=0x0382 + reg_write(tfa, 0xd5, 0x004d); //POR=0x014d + /* ----- generated code end ----- */ + break; + case 0x1a73: + break; + default: + pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); + break; + } + error = tfa_set_bf_volatile(tfa, TFA9873_BF_FSSYNCEN, 0); + pr_info("info : disabled FS synchronisation!\n"); + return error; +} +void tfa9873_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9873_specific; + ops->set_swprof = tfa9873_set_swprofile; + ops->get_swprof = tfa9873_get_swprofile; + ops->set_swvstep = tfa9873_set_swvstep; + ops->get_swvstep = tfa9873_get_swvstep; + ops->dsp_system_stable = tfa9873_dsp_system_stable; + ops->faim_protect = tfa9873_faim_protect; + ops->get_mtpb = tfa9873_get_mtpb; + ops->set_mute = tfa_set_mute_nodsp; +} + +/***********************************************************************************/ +/* TFA9874 */ +/***********************************************************************************/ + +static enum Tfa98xx_Error tfa9874_faim_protect(struct tfa_device *tfa, int status) +{ + enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; + /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ + ret = tfa_set_bf_volatile(tfa, TFA9874_BF_OPENMTP, (uint16_t)(status)); + return ret; +} + + +static enum Tfa98xx_Error tfa9874_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short value, xor; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* Unlock key 1 and 2 */ + error = reg_write(tfa, 0x0F, 0x5A6B); + error = reg_read(tfa, 0xFB, &value); + xor = value ^ 0x005A; + error = reg_write(tfa, 0xA0, xor); + tfa98xx_key2(tfa, 0); + + switch (tfa->rev) { + case 0x0a74: /* Initial revision ID */ + /* ----- generated code start ----- */ + /* V25 */ + reg_write(tfa, 0x02, 0x22a8); //POR=0x25c8 + reg_write(tfa, 0x51, 0x0020); //POR=0x0000 + reg_write(tfa, 0x52, 0x57dc); //POR=0x56dc + reg_write(tfa, 0x58, 0x16a4); //POR=0x1614 + reg_write(tfa, 0x61, 0x0110); //POR=0x0198 + reg_write(tfa, 0x66, 0x0701); //POR=0x0700 + reg_write(tfa, 0x6f, 0x00a3); //POR=0x01a3 + reg_write(tfa, 0x70, 0x07f8); //POR=0x06f8 + reg_write(tfa, 0x73, 0x0007); //POR=0x0005 + reg_write(tfa, 0x74, 0x5068); //POR=0xcc80 + reg_write(tfa, 0x75, 0x0d28); //POR=0x1138 + reg_write(tfa, 0x83, 0x0594); //POR=0x061a + reg_write(tfa, 0x84, 0x0001); //POR=0x0021 + reg_write(tfa, 0x85, 0x0001); //POR=0x0003 + reg_write(tfa, 0x88, 0x0000); //POR=0x0002 + reg_write(tfa, 0xc4, 0x2001); //POR=0x0001 + /* ----- generated code end ----- */ + break; + case 0x0b74: + /* ----- generated code start ----- */ + /* V1.6 */ + reg_write(tfa, 0x02, 0x22a8); //POR=0x25c8 + reg_write(tfa, 0x51, 0x0020); //POR=0x0000 + reg_write(tfa, 0x52, 0x57dc); //POR=0x56dc + reg_write(tfa, 0x58, 0x16a4); //POR=0x1614 + reg_write(tfa, 0x61, 0x0110); //POR=0x0198 + reg_write(tfa, 0x66, 0x0701); //POR=0x0700 + reg_write(tfa, 0x6f, 0x00a3); //POR=0x01a3 + reg_write(tfa, 0x70, 0x07f8); //POR=0x06f8 + reg_write(tfa, 0x73, 0x0047); //POR=0x0045 + reg_write(tfa, 0x74, 0x5068); //POR=0xcc80 + reg_write(tfa, 0x75, 0x0d28); //POR=0x1138 + reg_write(tfa, 0x83, 0x0595); //POR=0x061a + reg_write(tfa, 0x84, 0x0001); //POR=0x0021 + reg_write(tfa, 0x85, 0x0001); //POR=0x0003 + reg_write(tfa, 0x88, 0x0000); //POR=0x0002 + reg_write(tfa, 0xc4, 0x2001); //POR=0x0001 + /* ----- generated code end ----- */ + break; + case 0x0c74: + /* ----- generated code start ----- */ + /* V1.16 */ + reg_write(tfa, 0x02, 0x22c8); //POR=0x25c8 + reg_write(tfa, 0x52, 0x57dc); //POR=0x56dc + reg_write(tfa, 0x53, 0x003e); //POR=0x001e + reg_write(tfa, 0x56, 0x0400); //POR=0x0600 + reg_write(tfa, 0x61, 0x0110); //POR=0x0198 + reg_write(tfa, 0x6f, 0x00a5); //POR=0x01a3 + reg_write(tfa, 0x70, 0x07f8); //POR=0x06f8 + reg_write(tfa, 0x73, 0x0047); //POR=0x0045 + reg_write(tfa, 0x74, 0x5098); //POR=0xcc80 + reg_write(tfa, 0x75, 0x8d28); //POR=0x1138 + reg_write(tfa, 0x80, 0x0000); //POR=0x0003 + reg_write(tfa, 0x83, 0x0799); //POR=0x061a + reg_write(tfa, 0x84, 0x0081); //POR=0x0021 + /* ----- generated code end ----- */ + break; + default: + pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); + break; + } + + return error; +} + +static int tfa9874_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int active_value = tfa_dev_get_swprof(tfa); + + /* Set the new value in the struct */ + tfa->profile = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9874_BF_SWPROFIL, new_value); + + return active_value; +} + +static int tfa9874_get_swprofile(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9874_BF_SWPROFIL) - 1; +} + +static int tfa9874_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + + /* Set the new value in the struct */ + tfa->vstep = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9874_BF_SWVSTEP, new_value); + + return new_value; +} + +static int tfa9874_get_swvstep(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9874_BF_SWVSTEP) - 1; +} + +/* tfa98xx_dsp_system_stable +* return: *ready = 1 when clocks are stable to allow DSP subsystem access +*/ +static enum Tfa98xx_Error tfa9874_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + /* check CLKS: ready if set */ + *ready = tfa_get_bf(tfa, TFA9874_BF_CLKS) == 1; + + return error; +} + +static int tfa9874_get_mtpb(struct tfa_device *tfa) +{ + + int value; + + value = tfa_get_bf(tfa, TFA9874_BF_MTPB); + return value; +} + +void tfa9874_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9874_specific; + ops->set_swprof = tfa9874_set_swprofile; + ops->get_swprof = tfa9874_get_swprofile; + ops->set_swvstep = tfa9874_set_swvstep; + ops->get_swvstep = tfa9874_get_swvstep; + ops->dsp_system_stable = tfa9874_dsp_system_stable; + ops->faim_protect = tfa9874_faim_protect; + ops->get_mtpb = tfa9874_get_mtpb; + ops->set_mute = tfa_set_mute_nodsp; +} +/***********************************************************************************/ +/* TFA9878 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9878_faim_protect(struct tfa_device *tfa, int status) +{ + enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; + /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ + ret = tfa_set_bf_volatile(tfa, TFA9878_BF_OPENMTP, (uint16_t)(status)); + return ret; +} + + +static enum Tfa98xx_Error tfa9878_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short value, xor; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* Unlock key 1 and 2 */ + error = reg_write(tfa, 0x0F, 0x5A6B); + error = reg_read(tfa, 0xFB, &value); + xor = value ^ 0x005A; + error = reg_write(tfa, 0xA0, xor); + tfa98xx_key2(tfa, 0); + + switch (tfa->rev) { + case 0x0a78: /* Initial revision ID */ +/* ----- generated code start ----- */ +/* ----- version 28 ----- */ + reg_write(tfa, 0x01, 0x2e18); //POR=0x2e88 + reg_write(tfa, 0x02, 0x0628); //POR=0x0008 + reg_write(tfa, 0x04, 0x0240); //POR=0x0340 + reg_write(tfa, 0x52, 0x587c); //POR=0x57dc + reg_write(tfa, 0x61, 0x0183); //POR=0x0a82 + reg_write(tfa, 0x63, 0x055a); //POR=0x0a9a + reg_write(tfa, 0x65, 0x0542); //POR=0x0a82 + reg_write(tfa, 0x71, 0x303e); //POR=0x307e + reg_write(tfa, 0x83, 0x009a); //POR=0x0799 + /* ----- generated code end ----- */ + + + break; + case 0x1a78: /* Initial revision ID */ + /* ----- generated code start ----- */ + /* ----- version 12 ----- */ + reg_write(tfa, 0x01, 0x2e18); //POR=0x2e88 + reg_write(tfa, 0x02, 0x0628); //POR=0x0008 + reg_write(tfa, 0x04, 0x0241); //POR=0x0340 + reg_write(tfa, 0x52, 0x587c); //POR=0x57dc + reg_write(tfa, 0x61, 0x0183); //POR=0x0a82 + reg_write(tfa, 0x63, 0x055a); //POR=0x0a9a + reg_write(tfa, 0x65, 0x0542); //POR=0x0a82 + reg_write(tfa, 0x70, 0xb7ff); //POR=0x37ff + reg_write(tfa, 0x71, 0x303e); //POR=0x307e + reg_write(tfa, 0x83, 0x009a); //POR=0x0799 + reg_write(tfa, 0x84, 0x0211); //POR=0x0011 + reg_write(tfa, 0x8c, 0x0210); //POR=0x0010 + reg_write(tfa, 0xce, 0x2202); //POR=0xa202 + reg_write(tfa, 0xd5, 0x0000); //POR=0x0100 + /* ----- generated code end ----- */ + + break; + default: + pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); + break; + } + + return error; +} + +static int tfa9878_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int active_value = tfa_dev_get_swprof(tfa); + + /* Set the new value in the struct */ + tfa->profile = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9878_BF_SWPROFIL, new_value); + + return active_value; +} + +static int tfa9878_get_swprofile(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9878_BF_SWPROFIL) - 1; +} + +static int tfa9878_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + + /* Set the new value in the struct */ + tfa->vstep = new_value - 1; + + /* Set the new value in the hw register */ + tfa_set_bf_volatile(tfa, TFA9878_BF_SWVSTEP, new_value); + + return new_value; +} + +static int tfa9878_get_swvstep(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9878_BF_SWVSTEP) - 1; +} + +/* tfa98xx_dsp_system_stable +* return: *ready = 1 when clocks are stable to allow DSP subsystem access +*/ +static enum Tfa98xx_Error tfa9878_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + /* check CLKS: ready if set */ + *ready = tfa_get_bf(tfa, TFA9878_BF_CLKS) == 1; + + return error; +} + +static int tfa9878_get_mtpb(struct tfa_device *tfa) +{ + + int value; + + value = tfa_get_bf(tfa, TFA9878_BF_MTPB); + return value; +} + +void tfa9878_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9878_specific; + ops->set_swprof = tfa9878_set_swprofile; + ops->get_swprof = tfa9878_get_swprofile; + ops->set_swvstep = tfa9878_set_swvstep; + ops->get_swvstep = tfa9878_get_swvstep; + ops->dsp_system_stable = tfa9878_dsp_system_stable; + ops->faim_protect = tfa9878_faim_protect; + ops->get_mtpb = tfa9878_get_mtpb; + ops->set_mute = tfa_set_mute_nodsp; +} +/***********************************************************************************/ +/* TFA9888 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9888_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short value, xor; + int patch_version; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* Unlock keys to write settings */ + error = reg_write(tfa, 0x0F, 0x5A6B); + error = reg_read(tfa, 0xFB, &value); + xor = value ^ 0x005A; + error = reg_write(tfa, 0xA0, xor); + + /* Only N1C2 is supported */ + /* ----- generated code start ----- */ + /* --------- Version v1 ---------- */ + if (tfa->rev == 0x2c88) { + reg_write(tfa, 0x00, 0x164d); //POR=0x064d + reg_write(tfa, 0x01, 0x828b); //POR=0x92cb + reg_write(tfa, 0x02, 0x1dc8); //POR=0x1828 + reg_write(tfa, 0x0e, 0x0080); //POR=0x0000 + reg_write(tfa, 0x20, 0x089e); //POR=0x0890 + reg_write(tfa, 0x22, 0x543c); //POR=0x545c + reg_write(tfa, 0x23, 0x0006); //POR=0x0000 + reg_write(tfa, 0x24, 0x0014); //POR=0x0000 + reg_write(tfa, 0x25, 0x000a); //POR=0x0000 + reg_write(tfa, 0x26, 0x0100); //POR=0x0000 + reg_write(tfa, 0x28, 0x1000); //POR=0x0000 + reg_write(tfa, 0x51, 0x0000); //POR=0x00c0 + reg_write(tfa, 0x52, 0xfafe); //POR=0xbaf6 + reg_write(tfa, 0x70, 0x3ee4); //POR=0x3ee6 + reg_write(tfa, 0x71, 0x1074); //POR=0x3074 + reg_write(tfa, 0x83, 0x0014); //POR=0x0013 + /* ----- generated code end ----- */ + } else { + pr_info("Warning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); + } + + patch_version = tfa_cnt_get_patch_version(tfa); + if (patch_version >= 0x060401) + tfa->partial_enable = 1; + + return error; +} + +static enum Tfa98xx_Error tfa9888_tfa_dsp_write_tables(struct tfa_device *tfa, int sample_rate) +{ + unsigned char buffer[15] = { 0 }; + int size = 15 * sizeof(char); + + /* Write the fractional delay in the hardware register 'cs_frac_delay' */ + switch (sample_rate) { + case 0: /* 8kHz */ + TFA_SET_BF(tfa, FRACTDEL, 40); + break; + case 1: /* 11.025KHz */ + TFA_SET_BF(tfa, FRACTDEL, 38); + break; + case 2: /* 12kHz */ + TFA_SET_BF(tfa, FRACTDEL, 37); + break; + case 3: /* 16kHz */ + TFA_SET_BF(tfa, FRACTDEL, 59); + break; + case 4: /* 22.05KHz */ + TFA_SET_BF(tfa, FRACTDEL, 56); + break; + case 5: /* 24kHz */ + TFA_SET_BF(tfa, FRACTDEL, 56); + break; + case 6: /* 32kHz */ + TFA_SET_BF(tfa, FRACTDEL, 52); + break; + case 7: /* 44.1kHz */ + TFA_SET_BF(tfa, FRACTDEL, 48); + break; + case 8: + default:/* 48kHz */ + TFA_SET_BF(tfa, FRACTDEL, 46); + break; + } + + /* First copy the msg_id to the buffer */ + buffer[0] = (uint8_t)0; + buffer[1] = (uint8_t)MODULE_FRAMEWORK + 128; + buffer[2] = (uint8_t)FW_PAR_ID_SET_SENSES_DELAY; + + /* Required for all FS exept 8kHz (8kHz is all zero) */ + if (sample_rate != 0) { + buffer[5] = 1; /* Vdelay_P */ + buffer[8] = 0; /* Idelay_P */ + buffer[11] = 1; /* Vdelay_S */ + buffer[14] = 0; /* Idelay_S */ + } + + /* send SetSensesDelay msg */ + return dsp_msg(tfa, size, (char *)buffer); +} + +static enum Tfa98xx_Error tfa9888_auto_copy_mtp_to_iic(struct tfa_device *tfa) +{ + /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1. Workaround for 72 and 88 (see PLMA5290) */ + return reg_write(tfa, 0xA3, 0x20); +} + +static enum Tfa98xx_Error tfa9888_factory_trimmer(struct tfa_device *tfa) +{ + unsigned short currentValue, delta; + int result; + + /* Factory trimming for the Boost converter */ + /* check if there is a correction needed */ + result = TFA_GET_BF(tfa, DCMCCAPI); + if (result) { + /* Get currentvalue of DCMCC and the Delta value */ + currentValue = (unsigned short)TFA_GET_BF(tfa, DCMCC); + delta = (unsigned short)TFA_GET_BF(tfa, USERDEF); + + /* check the sign bit (+/-) */ + result = TFA_GET_BF(tfa, DCMCCSB); + if (result == 0) { + /* Do not exceed the maximum value of 15 */ + if (currentValue + delta < 15) { + TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue + delta); + if (tfa->verbose) + pr_debug("Max coil current is set to: %d\n", currentValue + delta); + } else { + TFA_SET_BF_VOLATILE(tfa, DCMCC, 15); + if (tfa->verbose) + pr_debug("Max coil current is set to: 15\n"); + } + } else if (result == 1) { + /* Do not exceed the minimum value of 0 */ + if (currentValue - delta > 0) { + TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue - delta); + if (tfa->verbose) + pr_debug("Max coil current is set to: %d\n", currentValue - delta); + } else { + TFA_SET_BF_VOLATILE(tfa, DCMCC, 0); + if (tfa->verbose) + pr_debug("Max coil current is set to: 0\n"); + } + } + } + + return Tfa98xx_Error_Ok; +} + +static enum Tfa98xx_Error +tfa9888_set_mute(struct tfa_device *tfa, int mute) +{ + TFA_SET_BF(tfa, CFSMR, (const uint16_t)mute); + TFA_SET_BF(tfa, CFSML, (const uint16_t)mute); + + return Tfa98xx_Error_Ok; +} + +void tfa9888_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9888_specific; + ops->dsp_write_tables = tfa9888_tfa_dsp_write_tables; + ops->auto_copy_mtp_to_iic = tfa9888_auto_copy_mtp_to_iic; + ops->factory_trimmer = tfa9888_factory_trimmer; + ops->set_mute = tfa9888_set_mute; +} + +/***********************************************************************************/ +/* TFA9896 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9896_faim_protect(struct tfa_device *tfa, int status) +{ + enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; + + if ((tfa->rev == 0x2b96) || (tfa->rev == 0x3b96)) { + ret = tfa_set_bf_volatile(tfa, TFA9896_BF_OPENMTP, (uint16_t)status); + } + + return ret; +} + +/***********************************************************************************/ +/* TFA9896 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9896_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short check_value; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* all i2C registers must already set to default POR value */ + + /* $48:[3] - 1 ==> 0; iddqtestbst - default value changed. + * When Iddqtestbst is set to "0", the slewrate is reduced. + * This will lower the overshoot on IN-B to avoid NMOS damage of booster. + */ + if (tfa->rev == 0x1b96) { + /* ----- generated code start v17 ----- */ + reg_write(tfa, 0x06, 0x000b); //POR=0x0001 + reg_write(tfa, 0x07, 0x3e7f); //POR=0x1e7f + reg_write(tfa, 0x0a, 0x0d8a); //POR=0x0592 + reg_write(tfa, 0x48, 0x0300); //POR=0x0308 + reg_write(tfa, 0x88, 0x0100); //POR=0x0000 + /* ----- generated code end ----- */ + } else if (tfa->rev == 0x2b96) { + /* ----- generated code start ----- v1*/ + reg_write(tfa, 0x06, 0x000b); //POR=0x0001 + reg_write(tfa, 0x07, 0x3e7f); //POR=0x1e7f + reg_write(tfa, 0x0a, 0x0d8a); //POR=0x0592 + reg_write(tfa, 0x48, 0x0300); //POR=0x0308 + reg_write(tfa, 0x88, 0x0100); //POR=0x0000 + /* ----- generated code end ----- */ + } else if (tfa->rev == 0x3b96) { + /* ----- generated code start ----- v1*/ + reg_write(tfa, 0x06, 0x000b); //POR=0x0001 + reg_write(tfa, 0x07, 0x3e7f); //POR=0x1e7f + reg_write(tfa, 0x0a, 0x0d8a); //POR=0x0592 + reg_write(tfa, 0x48, 0x0300); //POR=0x0308 + reg_write(tfa, 0x88, 0x0100); //POR=0x0000 + /* ----- generated code end ----- */ + } + /* $49:[0] - 1 ==> 0; CLIP - default value changed. 0 means CLIPPER on */ + error = reg_read(tfa, 0x49, &check_value); + check_value &= ~0x1; + error = reg_write(tfa, 0x49, check_value); + return error; +} + +/* +* the int24 values for the vsfw delay table +*/ +static unsigned char tfa9896_vsfwdelay_table[] = { + 0, 0, 2, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ + 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ + 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ + 0, 0, 2, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ + 0, 0, 2, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ + 0, 0, 2, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ + 0, 0, 2, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ + 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ + 0, 0, 3 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ +}; + +/* +* TODO make this tfa98xx +* Note that the former products write this table via the patch +* so moving this to the tfa98xx API requires also updating all patches +*/ +static enum Tfa98xx_Error tfa9896_dsp_write_vsfwdelay_table(struct tfa_device *tfa) +{ + return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURRENT_DELAY, sizeof(tfa9896_vsfwdelay_table), tfa9896_vsfwdelay_table); +} + +/* +* The int24 values for the fracdelay table +* For now applicable only for 8 and 48 kHz +*/ +static unsigned char tfa9896_cvfracdelay_table[] = { + 0, 0, 51, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ + 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ + 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ + 0, 0, 38, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ + 0, 0, 34, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ + 0, 0, 33, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ + 0, 0, 11, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ + 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ + 0, 0, 62 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ +}; + +static enum Tfa98xx_Error tfa9896_dsp_write_cvfracdelay_table(struct tfa_device *tfa) +{ + return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURFRAC_DELAY, sizeof(tfa9896_cvfracdelay_table), tfa9896_cvfracdelay_table); +} + +static enum Tfa98xx_Error tfa9896_tfa_dsp_write_tables(struct tfa_device *tfa, int sample_rate) +{ + enum Tfa98xx_Error error; + + /* Not used for max1! */ + (void)sample_rate; + + error = tfa9896_dsp_write_vsfwdelay_table(tfa); + if (error == Tfa98xx_Error_Ok) { + error = tfa9896_dsp_write_cvfracdelay_table(tfa); + } + + return error; +} + +void tfa9896_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9896_specific; + ops->dsp_write_tables = tfa9896_tfa_dsp_write_tables; + ops->faim_protect = tfa9896_faim_protect; +} + +/***********************************************************************************/ +/* TFA9897 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9897_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short check_value; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* all i2C registers must already set to default POR value */ + + /* $48:[3] - 1 ==> 0; iddqtestbst - default value changed. + * When Iddqtestbst is set to "0", the slewrate is reduced. + * This will lower the overshoot on IN-B to avoid NMOS damage of booster */ + error = reg_write(tfa, 0x48, 0x0300); /* POR value = 0x308 */ + + /* $49:[0] - 1 ==> 0; CLIP - default value changed. 0 means CLIPPER on */ + error = reg_read(tfa, 0x49, &check_value); + check_value &= ~0x1; + error = reg_write(tfa, 0x49, check_value); + + return error; +} + +/* +* the int24 values for the vsfw delay table +*/ +static unsigned char tfa9897_vsfwdelay_table[] = { + 0, 0, 2, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ + 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ + 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ + 0, 0, 2, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ + 0, 0, 2, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ + 0, 0, 2, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ + 0, 0, 2, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ + 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ + 0, 0, 3 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ +}; + +/* +* TODO make this tfa98xx +* Note that the former products write this table via the patch +* so moving this to the tfa98xx API requires also updating all patches +*/ +static enum Tfa98xx_Error tfa9897_dsp_write_vsfwdelay_table(struct tfa_device *tfa) +{ + return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURRENT_DELAY, sizeof(tfa9897_vsfwdelay_table), tfa9897_vsfwdelay_table); +} + +/* +* The int24 values for the fracdelay table +* For now applicable only for 8 and 48 kHz +*/ +static unsigned char tfa9897_cvfracdelay_table[] = { + 0, 0, 51, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ + 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ + 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ + 0, 0, 38, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ + 0, 0, 34, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ + 0, 0, 33, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ + 0, 0, 11, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ + 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ + 0, 0, 62 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ +}; + +static enum Tfa98xx_Error tfa9897_dsp_write_cvfracdelay_table(struct tfa_device *tfa) +{ + return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURFRAC_DELAY, sizeof(tfa9897_cvfracdelay_table), tfa9897_cvfracdelay_table); +} + +static enum Tfa98xx_Error tfa9897_tfa_dsp_write_tables(struct tfa_device *tfa, int sample_rate) +{ + enum Tfa98xx_Error error; + + /* Not used for max1! */ + (void)sample_rate; + + error = tfa9897_dsp_write_vsfwdelay_table(tfa); + if (error == Tfa98xx_Error_Ok) { + error = tfa9897_dsp_write_cvfracdelay_table(tfa); + } + + return error; +} + +void tfa9897_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9897_specific; + ops->dsp_write_tables = tfa9897_tfa_dsp_write_tables; +} + +/***********************************************************************************/ +/* TFA9895 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9895_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + int result; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* all i2C registers are already set to default */ + + result = TFA_SET_BF(tfa, AMPE, 1); + if (result < 0) + return -result; + + /* some other registers must be set for optimal amplifier behaviour */ + reg_write(tfa, 0x05, 0x13AB); + reg_write(tfa, 0x06, 0x001F); + /* peak voltage protection is always on, but may be written */ + reg_write(tfa, 0x08, 0x3C4E); + /*TFA98XX_SYSCTRL_DCA=0*/ + reg_write(tfa, 0x09, 0x024D); + reg_write(tfa, 0x41, 0x0308); + error = reg_write(tfa, 0x49, 0x0E82); + + return error; +} + +void tfa9895_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9895_specific; +} + +/***********************************************************************************/ +/* TFA9891 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9891_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* ----- generated code start ----- */ + /* ----- version 18.0 ----- */ + reg_write(tfa, 0x09, 0x025d); //POR=0x024d + reg_write(tfa, 0x10, 0x0018); //POR=0x0024 + reg_write(tfa, 0x22, 0x0003); //POR=0x0023 + reg_write(tfa, 0x25, 0x0001); //POR=0x0000 + reg_write(tfa, 0x46, 0x0000); //POR=0x4000 + reg_write(tfa, 0x55, 0x3ffb); //POR=0x7fff + /* ----- generated code end ----- */ + + return error; +} + +void tfa9891_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9891_specific; +} + +/***********************************************************************************/ +/* TFA9890 */ +/***********************************************************************************/ +static enum Tfa98xx_Error tfa9890_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short regRead = 0; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + + /* all i2C registers are already set to default for N1C2 */ + + /* some PLL registers must be set optimal for amplifier behaviour */ + error = reg_write(tfa, 0x40, 0x5a6b); + if (error) + return error; + reg_read(tfa, 0x59, ®Read); + regRead |= 0x3; + reg_write(tfa, 0x59, regRead); + error = reg_write(tfa, 0x40, 0x0000); + error = reg_write(tfa, 0x47, 0x7BE1); + + return error; +} + +/* +* Disable clock gating +*/ +static enum Tfa98xx_Error tfa9890_clockgating(struct tfa_device *tfa, int on) +{ + enum Tfa98xx_Error error; + unsigned short value; + + /* for TFA9890 temporarily disable clock gating when dsp reset is used */ + error = reg_read(tfa, TFA98XX_CURRENTSENSE4, &value); + if (error) return error; + + if (Tfa98xx_Error_Ok == error) { + if (on) /* clock gating on - clear the bit */ + value &= ~TFA98XX_CURRENTSENSE4_CTRL_CLKGATECFOFF; + else /* clock gating off - set the bit */ + value |= TFA98XX_CURRENTSENSE4_CTRL_CLKGATECFOFF; + + error = reg_write(tfa, TFA98XX_CURRENTSENSE4, value); + } + + return error; +} + +/* +* Tfa9890_DspReset will deal with clock gating control in order +* to reset the DSP for warm state restart +*/ +static enum Tfa98xx_Error tfa9890_dsp_reset(struct tfa_device *tfa, int state) +{ + enum Tfa98xx_Error error; + + /* for TFA9890 temporarily disable clock gating + when dsp reset is used */ + tfa9890_clockgating(tfa, 0); + + TFA_SET_BF(tfa, RST, (uint16_t)state); + + /* clock gating restore */ + error = tfa9890_clockgating(tfa, 1); + + return error; +} + +/* + * Tfa9890_DspSystemStable will compensate for the wrong behavior of CLKS + * to determine if the DSP subsystem is ready for patch and config loading. + * + * A MTP calibration register is checked for non-zero. + * + * Note: This only works after i2c reset as this will clear the MTP contents. + * When we are configured then the DSP communication will synchronize access. + * + */ +static enum Tfa98xx_Error tfa9890_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short status, mtp0; + int result, tries; + + /* check the contents of the STATUS register */ + result = TFA_READ_REG(tfa, AREFS); + if (result < 0) { + error = -result; + goto errorExit; + } + status = (unsigned short)result; + + /* if AMPS is set then we were already configured and running + * no need to check further + */ + *ready = (TFA_GET_BF_VALUE(tfa, AMPS, status) == 1); + if (*ready) /* if ready go back */ + return error; /* will be Tfa98xx_Error_Ok */ + + /* check AREFS and CLKS: not ready if either is clear */ + *ready = !((TFA_GET_BF_VALUE(tfa, AREFS, status) == 0) + || (TFA_GET_BF_VALUE(tfa, CLKS, status) == 0)); + if (!*ready) /* if not ready go back */ + return error; /* will be Tfa98xx_Error_Ok */ + + /* check MTPB + * mtpbusy will be active when the subsys copies MTP to I2C + * 2 times retry avoids catching this short mtpbusy active period + */ + for (tries = 2; tries > 0; tries--) { + result = TFA_GET_BF(tfa, MTPB);/*TODO_MTPB*/ + if (result < 0) { + error = -result; + goto errorExit; + } + status = (unsigned short)result; + + /* check the contents of the STATUS register */ + *ready = (result == 0); + if (*ready) /* if ready go on */ + break; + } + if (tries == 0) /* ready will be 0 if retries exausted */ + return Tfa98xx_Error_Ok; + + /* check the contents of MTP register for non-zero, + * this indicates that the subsys is ready */ + + error = reg_read(tfa, 0x84, &mtp0); + if (error) + goto errorExit; + + *ready = (mtp0 != 0); /* The MTP register written? */ + + return error; + +errorExit: + *ready = 0; + return error; +} + +void tfa9890_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9890_specific; + ops->dsp_reset = tfa9890_dsp_reset; + ops->dsp_system_stable = tfa9890_dsp_system_stable; +} + +/***********************************************************************************/ +/* TFA9894 */ +/***********************************************************************************/ +static int tfa9894_set_swprofile(struct tfa_device *tfa, unsigned short new_value) +{ + int active_value = tfa_dev_get_swprof(tfa); + + /* Set the new value in the struct */ + tfa->profile = new_value - 1; + tfa_set_bf_volatile(tfa, TFA9894_BF_SWPROFIL, new_value); + return active_value; +} + +static int tfa9894_get_swprofile(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9894_BF_SWPROFIL) - 1; +} + +static int tfa9894_set_swvstep(struct tfa_device *tfa, unsigned short new_value) +{ + /* Set the new value in the struct */ + tfa->vstep = new_value - 1; + tfa_set_bf_volatile(tfa, TFA9894_BF_SWVSTEP, new_value); + return new_value; +} + +static int tfa9894_get_swvstep(struct tfa_device *tfa) +{ + return tfa_get_bf(tfa, TFA9894_BF_SWVSTEP) - 1; +} + +static int tfa9894_get_mtpb(struct tfa_device *tfa) +{ + int value = 0; + + value = tfa_get_bf(tfa, TFA9894_BF_MTPB); + return value; +} + +/** Set internal oscillator into power down mode for TFA9894. +* +* This function is a worker for tfa98xx_set_osc_powerdown(). +* +* @param[in] tfa device description structure +* @param[in] state new state 0 - oscillator is on, 1 oscillator is off. +* +* @return Tfa98xx_Error_Ok when successfull, error otherwise. +*/ +static enum Tfa98xx_Error tfa9894_set_osc_powerdown(struct tfa_device *tfa, int state) +{ + if (state == 1 || state == 0) { + return -tfa_set_bf(tfa, TFA9894_BF_MANAOOSC, (uint16_t)state); + } + + return Tfa98xx_Error_Bad_Parameter; +} + +static enum Tfa98xx_Error tfa9894_faim_protect(struct tfa_device *tfa, int status) +{ + enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; + /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ + ret = tfa_set_bf_volatile(tfa, TFA9894_BF_OPENMTP, (uint16_t)(status)); + return ret; +} + +static enum Tfa98xx_Error tfa9894_specific(struct tfa_device *tfa) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + unsigned short value, xor; + + if (tfa->in_use == 0) + return Tfa98xx_Error_NotOpen; + if (tfa->verbose) + if (is_94_N2_device(tfa)) + pr_debug("check_correct\n"); + /* Unlock keys to write settings */ + error = reg_write(tfa, 0x0F, 0x5A6B); + error = reg_read(tfa, 0xFB, &value); + xor = value ^ 0x005A; + error = reg_write(tfa, 0xA0, xor); + pr_debug("Device REFID:%x\n", tfa->rev); + /* The optimal settings */ + if (tfa->rev == 0x0a94) { + /* V36 */ + /* ----- generated code start ----- */ + reg_write(tfa, 0x00, 0xa245); //POR=0x8245 + reg_write(tfa, 0x02, 0x51e8); //POR=0x55c8 + reg_write(tfa, 0x52, 0xbe17); //POR=0xb617 + reg_write(tfa, 0x57, 0x0344); //POR=0x0366 + reg_write(tfa, 0x61, 0x0033); //POR=0x0073 + reg_write(tfa, 0x71, 0x00cf); //POR=0x018d + reg_write(tfa, 0x72, 0x34a9); //POR=0x44e8 + reg_write(tfa, 0x73, 0x3808); //POR=0x3806 + reg_write(tfa, 0x76, 0x0067); //POR=0x0065 + reg_write(tfa, 0x80, 0x0000); //POR=0x0003 + reg_write(tfa, 0x81, 0x5715); //POR=0x561a + reg_write(tfa, 0x82, 0x0104); //POR=0x0044 + /* ----- generated code end ----- */ + } else if (tfa->rev == 0x1a94) { + /* V17 */ + /* ----- generated code start ----- */ + reg_write(tfa, 0x00, 0xa245); //POR=0x8245 + reg_write(tfa, 0x01, 0x15da); //POR=0x11ca + reg_write(tfa, 0x02, 0x5288); //POR=0x55c8 + reg_write(tfa, 0x52, 0xbe17); //POR=0xb617 + reg_write(tfa, 0x53, 0x0dbe); //POR=0x0d9e + reg_write(tfa, 0x56, 0x05c3); //POR=0x07c3 + reg_write(tfa, 0x57, 0x0344); //POR=0x0366 + reg_write(tfa, 0x61, 0x0032); //POR=0x0073 + reg_write(tfa, 0x71, 0x00cf); //POR=0x018d + reg_write(tfa, 0x72, 0x34a9); //POR=0x44e8 + reg_write(tfa, 0x73, 0x38c8); //POR=0x3806 + reg_write(tfa, 0x76, 0x0067); //POR=0x0065 + reg_write(tfa, 0x80, 0x0000); //POR=0x0003 + reg_write(tfa, 0x81, 0x5799); //POR=0x561a + reg_write(tfa, 0x82, 0x0104); //POR=0x0044 + /* ----- generated code end ----- */ + + } else if (tfa->rev == 0x2a94 || tfa->rev == 0x3a94) { + /* ----- generated code start ----- */ + /* ----- version 25.00 ----- */ + reg_write(tfa, 0x01, 0x15da); //POR=0x11ca + reg_write(tfa, 0x02, 0x51e8); //POR=0x55c8 + reg_write(tfa, 0x04, 0x0200); //POR=0x0000 + reg_write(tfa, 0x52, 0xbe17); //POR=0xb617 + reg_write(tfa, 0x53, 0x0dbe); //POR=0x0d9e + reg_write(tfa, 0x57, 0x0344); //POR=0x0366 + reg_write(tfa, 0x61, 0x0032); //POR=0x0073 + reg_write(tfa, 0x71, 0x6ecf); //POR=0x6f8d + reg_write(tfa, 0x72, 0xb4a9); //POR=0x44e8 + reg_write(tfa, 0x73, 0x38c8); //POR=0x3806 + reg_write(tfa, 0x76, 0x0067); //POR=0x0065 + reg_write(tfa, 0x80, 0x0000); //POR=0x0003 + reg_write(tfa, 0x81, 0x5799); //POR=0x561a + reg_write(tfa, 0x82, 0x0104); //POR=0x0044 + /* ----- generated code end ----- */ + } + return error; +} + +static enum Tfa98xx_Error +tfa9894_set_mute(struct tfa_device *tfa, int mute) +{ + tfa_set_bf(tfa, TFA9894_BF_CFSM, (const uint16_t)mute); + return Tfa98xx_Error_Ok; +} + +static enum Tfa98xx_Error tfa9894_dsp_system_stable(struct tfa_device *tfa, int *ready) +{ + enum Tfa98xx_Error error = Tfa98xx_Error_Ok; + + /* check CLKS: ready if set */ + *ready = tfa_get_bf(tfa, TFA9894_BF_CLKS) == 1; + + return error; +} + +void tfa9894_ops(struct tfa_device_ops *ops) +{ + /* Set defaults for ops */ + set_ops_defaults(ops); + + ops->tfa_init = tfa9894_specific; + ops->dsp_system_stable = tfa9894_dsp_system_stable; + ops->set_mute = tfa9894_set_mute; + ops->faim_protect = tfa9894_faim_protect; + ops->get_mtpb = tfa9894_get_mtpb; + ops->set_swprof = tfa9894_set_swprofile; + ops->get_swprof = tfa9894_get_swprofile; + ops->set_swvstep = tfa9894_set_swvstep; + ops->get_swvstep = tfa9894_get_swvstep; + //ops->auto_copy_mtp_to_iic = tfa9894_auto_copy_mtp_to_iic; + ops->set_osc_powerdown = tfa9894_set_osc_powerdown; +} diff --git a/src/tfa_internal.h b/src/tfa_internal.h new file mode 100644 index 000000000000..45c6f3f5bcda --- /dev/null +++ b/src/tfa_internal.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. + * Copyright 2020 GOODIX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/* + internal functions for TFA layer (not shared with SRV and HAL layer!) +*/ + +#ifndef __TFA_INTERNAL_H__ +#define __TFA_INTERNAL_H__ + +#include "tfa_dsp_fw.h" +#include "tfa_ext.h" + +#if __GNUC__ >= 4 + #define TFA_INTERNAL __attribute__ ((visibility("hidden"))) +#else + #define TFA_INTERNAL +#endif + +#define TFA98XX_GENERIC_SLAVE_ADDRESS 0x1C + +TFA_INTERNAL enum Tfa98xx_Error tfa98xx_check_rpc_status(struct tfa_device *tfa, int *pRpcStatus); +TFA_INTERNAL enum Tfa98xx_Error tfa98xx_wait_result(struct tfa_device *tfa, int waitRetryCount); + +#endif /* __TFA_INTERNAL_H__ */ + From 924e6993d4b00073878f37d60cae3d84f21a8712 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 21:54:42 +0530 Subject: [PATCH 114/127] ASoC: Add Support for tfa98xx driver Signed-off-by: UtsavBalar1231 --- Android.mk | 2 + asoc/codecs/Kbuild | 1 + asoc/codecs/tfa98xx/Kbuild | 115 +++++++++++++++++++++++++++++++++++++ config/sm8150auto.conf | 1 + config/sm8150autoconf.h | 1 + 5 files changed, 120 insertions(+) create mode 100755 asoc/codecs/tfa98xx/Kbuild diff --git a/Android.mk b/Android.mk index 40d7448ec3e6..b2278bc2e8d0 100644 --- a/Android.mk +++ b/Android.mk @@ -13,6 +13,7 @@ $(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module $(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers) $(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers) $(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd934x/Module.symvers) +$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/tfa98xx/Module.symvers) include $(MY_LOCAL_PATH)/include/uapi/Android.mk include $(MY_LOCAL_PATH)/ipc/Android.mk @@ -24,6 +25,7 @@ include $(MY_LOCAL_PATH)/asoc/codecs/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/wcd934x/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/cs35l41/Android.mk include $(MY_LOCAL_PATH)/asoc/codecs/tas2557/Android.mk +include $(MY_LOCAL_PATH)/asoc/codecs/tfa98xx/Android.mk endif ifeq ($(call is-board-platform-in-list, atoll),true) diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild index 8b308313fc87..920a546ad596 100644 --- a/asoc/codecs/Kbuild +++ b/asoc/codecs/Kbuild @@ -211,6 +211,7 @@ ifeq ($(KERNEL_BUILD), 1) obj-y += wcd937x/ obj-y += cs35l41/ obj-y += tas2557/ + obj-y += tfa98xx/ endif ifeq ($(CONFIG_SND_SOC_GCOV), y) diff --git a/asoc/codecs/tfa98xx/Kbuild b/asoc/codecs/tfa98xx/Kbuild new file mode 100755 index 000000000000..189ccceec48e --- /dev/null +++ b/asoc/codecs/tfa98xx/Kbuild @@ -0,0 +1,115 @@ +# We can build either as part of a standalone Kernel build or as +# an external module. Determine which mechanism is being used +ifeq ($(MODNAME),) + KERNEL_BUILD := 1 +else + KERNEL_BUILD := 0 +endif + + + +ifeq ($(KERNEL_BUILD), 1) + # These are configurable via Kconfig for kernel-based builds + # Need to explicitly configure for Android-based builds + AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.14 + AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio +endif + +ifeq ($(KERNEL_BUILD), 0) + ifeq ($(CONFIG_ARCH_SM8150), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif + ifeq ($(CONFIG_ARCH_SM6150), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif + + ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) + include $(AUDIO_ROOT)/config/sm8150auto.conf + export + INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h + endif +endif + +# As per target team, build is done as follows: +# Defconfig : build with default flags +# Slub : defconfig + CONFIG_SLUB_DEBUG := y + +# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y +# Perf : Using appropriate msmXXXX-perf_defconfig +# +# Shipment builds (user variants) should not have any debug feature +# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds +# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since +# there is no other way to identify defconfig builds, QTI internal +# representation of perf builds (identified using the string 'perf'), +# is used to identify if the build is a slub or defconfig one. This +# way no critical debug feature will be enabled for perf and shipment +# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT +# config. + +############ UAPI ############ +UAPI_DIR := uapi +UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) + +############ COMMON ############ +COMMON_DIR := include +COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) +TFA_INC := -I$(AUDIO_ROOT)/asoc/codecs/tfa98xx/inc + +# for TFA9874 Amplifer +ifdef CONFIG_SND_SOC_TFA9874 + TFA98XX_OBJS += src/tfa98xx.o + TFA98XX_OBJS += src/tfa_container.o + TFA98XX_OBJS += src/tfa_dsp.o + TFA98XX_OBJS += src/tfa_init.o +endif + +LINUX_INC += -Iinclude/linux + +INCS += $(COMMON_INC) \ + $(UAPI_INC) \ + $(TFA_INC) + +EXTRA_CFLAGS += -I$(src)/inc + +CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ + -DANI_LITTLE_BIT_ENDIAN \ + -DDOT11F_LITTLE_ENDIAN_HOST \ + -DANI_COMPILER_TYPE_GCC \ + -DANI_OS_TYPE_ANDROID=6 \ + -DPTT_SOCK_SVC_ENABLE \ + -Wall\ + -Werror\ + -D__linux__ \ + -DTFA_NON_DSP_SOLUTION + +KBUILD_CPPFLAGS += $(CDEFINES) + +# Currently, for versions of gcc which support it, the kernel Makefile +# is disabling the maybe-uninitialized warning. Re-enable it for the +# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it +# will override the kernel settings. +ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) +EXTRA_CFLAGS += -Wmaybe-uninitialized +endif +#EXTRA_CFLAGS += -Wmissing-prototypes + +ifeq ($(call cc-option-yn, -Wheader-guard),y) +EXTRA_CFLAGS += -Wheader-guard +endif + +ifeq ($(KERNEL_BUILD), 0) +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers +KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers +endif + +# Module information used by KBuild framework +obj-$(CONFIG_SND_SOC_TFA9874) += tfa98xx_dlkm.o +tfa98xx_dlkm-y := $(TFA98XX_OBJS) +# inject some build related information diff --git a/config/sm8150auto.conf b/config/sm8150auto.conf index 1e11a2615d43..d470c0561cb4 100644 --- a/config/sm8150auto.conf +++ b/config/sm8150auto.conf @@ -46,3 +46,4 @@ CONFIG_TAS2557_REGMAP=m CONFIG_TAS2557_CODEC=m CONFIG_TAS2557_MISC=m CONFIG_MSM_CSPL=y +CONFIG_SND_SOC_TFA9874=m diff --git a/config/sm8150autoconf.h b/config/sm8150autoconf.h index 806fc0ce5822..36f0cd45333b 100644 --- a/config/sm8150autoconf.h +++ b/config/sm8150autoconf.h @@ -58,3 +58,4 @@ #define CONFIG_TAS2557_MISC 1 #define CONFIG_ELLIPTIC_ULTRASOUND 1 #define CONFIG_MSM_CSPL 1 +#define CONFIG_SND_SOC_TFA9874 1 From 049ee57979e3c0150d1f3529ed1b973128665afd Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 19:28:12 +0530 Subject: [PATCH 115/127] ASoC: Add non DSP stereo support for tfa98xx Signed-off-by: UtsavBalar1231 --- asoc/msm-dai-q6-v2.c | 18 +++ asoc/msm-pcm-routing-v2.c | 31 +++++ asoc/sm8150.c | 27 +++++ config/sm8150auto.conf | 1 + config/sm8150autoconf.h | 1 + dsp/Kbuild | 4 + dsp/q6afe.c | 243 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 325 insertions(+) diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index 7aae0dbe83f5..bc7cea790238 100644 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -28,6 +28,9 @@ #include #include "msm-dai-q6-v2.h" #include "codecs/core.h" +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI +#include "codecs/tfa98xx/inc/tfa_platform_interface_definition.h" +#endif #define MSM_DAI_PRI_AUXPCM_DT_DEV_ID 1 #define MSM_DAI_SEC_AUXPCM_DT_DEV_ID 2 @@ -5057,7 +5060,16 @@ static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream, &mi2s_dai_data->rx_dai : &mi2s_dai_data->tx_dai); struct msm_dai_q6_dai_data *dai_data = &mi2s_dai_config->mi2s_dai_data; struct afe_param_id_i2s_cfg *i2s = &dai_data->port_config.i2s; +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + u16 port_id = 0; + if (msm_mi2s_get_port_id(dai->id, substream->stream, + &port_id) != 0) { + dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", + __func__, port_id); + return -EINVAL; + } +#endif dai_data->channels = params_channels(params); switch (dai_data->channels) { case 15: @@ -5243,6 +5255,12 @@ static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream, mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask) && test_bit(STATUS_PORT_STARTED, mi2s_dai_data->tx_dai.mi2s_dai_data.hwfree_status))) { +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + if (AFE_PORT_ID_TFADSP_RX == port_id || + AFE_PORT_ID_TFADSP_TX == port_id) { + dev_dbg(dai->dev, "%s, port_id = 0x%x\n", __func__, port_id); + } else +#endif if ((mi2s_dai_data->tx_dai.mi2s_dai_data.rate != mi2s_dai_data->rx_dai.mi2s_dai_data.rate) || (mi2s_dai_data->rx_dai.mi2s_dai_data.bitwidth != diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 741f541e4228..9ab530867440 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -53,6 +53,9 @@ #include "msm-qti-pp-config.h" #include "msm-dolby-dap-config.h" #include "msm-ds2-dap-config.h" +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI +#include "codecs/tfa98xx/inc/tfa_platform_interface_definition.h" +#endif #ifdef CONFIG_MSM_CSPL #include @@ -18192,7 +18195,11 @@ static const char * const wsa_rx_0_vi_fb_tx_rch_mux_text[] = { }; static const char * const mi2s_rx_vi_fb_tx_mux_text[] = { +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + "ZERO", PLATFORM_RX_VI_FB_TX_MUX_TEXT +#else "ZERO", "SENARY_TX" +#endif }; static const char * const int4_mi2s_rx_vi_fb_tx_mono_mux_text[] = { @@ -18221,7 +18228,11 @@ static const int wsa_rx_0_vi_fb_tx_rch_value[] = { static const int mi2s_rx_vi_fb_tx_value[] = { +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + MSM_BACKEND_DAI_MAX, PLATFORM_RX_VI_FB_TX_VALUE +#else MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SENARY_MI2S_TX +#endif }; static const int int4_mi2s_rx_vi_fb_tx_mono_ch_value[] = { @@ -18253,7 +18264,11 @@ static const struct soc_enum wsa_rx_0_vi_fb_rch_mux_enum = wsa_rx_0_vi_fb_tx_rch_mux_text, wsa_rx_0_vi_fb_tx_rch_value); static const struct soc_enum mi2s_rx_vi_fb_mux_enum = +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + SOC_VALUE_ENUM_DOUBLE(0, PLATFORM_RX_VI_FB_MUX_ENUM, 0, 0, +#else SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_PRI_MI2S_RX, 0, 0, +#endif ARRAY_SIZE(mi2s_rx_vi_fb_tx_mux_text), mi2s_rx_vi_fb_tx_mux_text, mi2s_rx_vi_fb_tx_value); @@ -18290,7 +18305,11 @@ static const struct snd_kcontrol_new wsa_rx_0_vi_fb_rch_mux = spkr_prot_put_vi_rch_port); static const struct snd_kcontrol_new mi2s_rx_vi_fb_mux = +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + SOC_DAPM_ENUM_EXT(PLATFORM_RX_VI_FB_MUX_NAME, +#else SOC_DAPM_ENUM_EXT("PRI_MI2S_RX_VI_FB_MUX", +#endif mi2s_rx_vi_fb_mux_enum, spkr_prot_get_vi_lch_port, spkr_prot_put_vi_lch_port); @@ -19660,7 +19679,11 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { &wsa_rx_0_vi_fb_lch_mux), SND_SOC_DAPM_MUX("WSA_RX_0_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0, &wsa_rx_0_vi_fb_rch_mux), +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + SND_SOC_DAPM_MUX(PLATFORM_RX_VI_FB_MUX_NAME, SND_SOC_NOPM, 0, 0, +#else SND_SOC_DAPM_MUX("PRI_MI2S_RX_VI_FB_MUX", SND_SOC_NOPM, 0, 0, +#endif &mi2s_rx_vi_fb_mux), SND_SOC_DAPM_MUX("INT4_MI2S_RX_VI_FB_MONO_CH_MUX", SND_SOC_NOPM, 0, 0, &int4_mi2s_rx_vi_fb_mono_ch_mux), @@ -23078,14 +23101,22 @@ static const struct snd_soc_dapm_route intercon[] = { {"SLIM0_RX_VI_FB_RCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, {"WSA_RX_0_VI_FB_LCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, {"WSA_RX_0_VI_FB_RCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + {PLATFORM_RX_VI_FB_MUX_NAME, PLATFORM_RX_VI_FB_TX_MUX_TEXT, PLATFORM_RX_VI_FB_TX_MUX_TEXT}, +#else {"PRI_MI2S_RX_VI_FB_MUX", "SENARY_TX", "SENARY_TX"}, +#endif {"INT4_MI2S_RX_VI_FB_MONO_CH_MUX", "INT5_MI2S_TX", "INT5_MI2S_TX"}, {"INT4_MI2S_RX_VI_FB_STEREO_CH_MUX", "INT5_MI2S_TX", "INT5_MI2S_TX"}, {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"}, {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_RCH_MUX"}, {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_LCH_MUX"}, {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_RCH_MUX"}, +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + {PLATFORM_RX_VI_FB_RX_MUX_TEXT, NULL, PLATFORM_RX_VI_FB_MUX_NAME}, +#else {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_VI_FB_MUX"}, +#endif {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_VI_FB_MONO_CH_MUX"}, {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_VI_FB_STEREO_CH_MUX"}, {"PRI_TDM_TX_0", NULL, "BE_IN"}, diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 6dca81573a55..c3d7e4723166 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -40,6 +40,9 @@ #include "codecs/wsa881x.h" #include "codecs/wcd-mbhc-v2.h" #include +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI +#include "codecs/tfa98xx/inc/tfa_platform_interface_definition.h" +#endif #define DRV_NAME "sm8150-asoc-snd" @@ -475,7 +478,11 @@ static struct dev_config mi2s_tx_cfg[] = { [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, +#else [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, +#endif [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, }; @@ -6040,6 +6047,25 @@ static struct snd_soc_dai_link msm_pahu_fe_dai_links[] = { }; static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = { +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + { + .name = TFA_TX_HOSTLESS_CODEC_NAME, + .stream_name = TFA_TX_HOSTLESS_STREAM_NAME, + .cpu_dai_name = TFA_TX_HOSTLESS_CPU_DAI_NAME, + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + /* this dailink has playback support */ + .ignore_pmdown_time = 1, + /* This dainlink has MI2S support */ + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, +#else { .name = LPASS_BE_SLIMBUS_4_TX, .stream_name = "Slimbus4 Capture", @@ -6053,6 +6079,7 @@ static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = { .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, .ignore_suspend = 1, }, +#endif /* Ultrasound RX DAI Link */ { .name = "SLIMBUS_2 Hostless Playback", diff --git a/config/sm8150auto.conf b/config/sm8150auto.conf index d470c0561cb4..45a38d541146 100644 --- a/config/sm8150auto.conf +++ b/config/sm8150auto.conf @@ -47,3 +47,4 @@ CONFIG_TAS2557_CODEC=m CONFIG_TAS2557_MISC=m CONFIG_MSM_CSPL=y CONFIG_SND_SOC_TFA9874=m +CONFIG_SND_SOC_TFA9874_FOR_DAVI=m diff --git a/config/sm8150autoconf.h b/config/sm8150autoconf.h index 36f0cd45333b..30a6cdcf3ffe 100644 --- a/config/sm8150autoconf.h +++ b/config/sm8150autoconf.h @@ -59,3 +59,4 @@ #define CONFIG_ELLIPTIC_ULTRASOUND 1 #define CONFIG_MSM_CSPL 1 #define CONFIG_SND_SOC_TFA9874 1 +#define CONFIG_SND_SOC_TFA9874_FOR_DAVI 1 diff --git a/dsp/Kbuild b/dsp/Kbuild index 6fc0e9fba08a..bf2b49075560 100644 --- a/dsp/Kbuild +++ b/dsp/Kbuild @@ -185,6 +185,10 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ -Werror\ -D__linux__ +ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + CDEFINES += -DCONFIG_SND_SOC_TFA9874_FOR_DAVI +endif + KBUILD_CPPFLAGS += $(CDEFINES) # Currently, for versions of gcc which support it, the kernel Makefile diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 7306ab39b80e..885df4662f06 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -35,6 +35,9 @@ #include #include "adsp_err.h" #include "q6afecal-hwdep.h" +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI +#include "../asoc/codecs/tfa98xx/inc/tfa_platform_interface_definition.h" +#endif #ifdef CONFIG_MSM_CSPL #include @@ -169,6 +172,10 @@ struct afe_ctl { u32 island_mode[AFE_MAX_PORTS]; struct vad_config vad_cfg[AFE_MAX_PORTS]; struct work_struct afe_dc_work; +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + struct rtac_cal_block_data tfa_cal; + atomic_t tfa_state; +#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ struct notifier_block event_notifier; /* FTM spk params */ uint32_t initial_cal; @@ -587,6 +594,24 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) av_dev_drift_afe_cb_handler(data->opcode, data->payload, data->payload_size); } else { + +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + if (atomic_read(&this_afe.tfa_state) == 1 && + data->payload_size == sizeof(uint32_t)) { + + atomic_set(&this_afe.status, payload[0]); + if (payload[0]) + atomic_set(&this_afe.state, -1); + else + atomic_set(&this_afe.state, 0); + + atomic_set(&this_afe.tfa_state, 0); + wake_up(&this_afe.wait[data->token]); + + return 0; + } +#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ + if (sp_make_afe_callback(data->opcode, data->payload, data->payload_size)) return -EINVAL; @@ -1697,6 +1722,15 @@ static int afe_spk_prot_prepare(int src_port, int dst_port, int param_id, case AFE_PARAM_ID_SP_V2_EX_VI_FTM_CFG: param_info.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI; break; +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + case AFE_PARAM_ID_TFADSP_RX_CFG: + case AFE_PARAM_ID_TFADSP_RX_SET_BYPASS: + param_info.module_id = AFE_MODULE_ID_TFADSP_RX; + break; + case AFE_PARAM_ID_TFADSP_TX_SET_ENABLE: + param_info.module_id = AFE_MODULE_ID_TFADSP_TX; + break; +#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ default: pr_err("%s: default case 0x%x\n", __func__, param_id); goto fail_cmd; @@ -8564,6 +8598,211 @@ static void afe_release_uevent_data(struct kobject *kobj) kfree(data); } +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + +int send_tfa_cal_apr(void *buf, int cmd_size, bool bRead) +{ + int32_t result, port_id = AFE_PORT_ID_TFADSP_RX; + uint32_t port_index = 0, payload_size = 0; + size_t len; + struct rtac_cal_block_data *tfa_cal = &(this_afe.tfa_cal); + struct mem_mapping_hdr mem_hdr; + struct param_hdr_v3 param_hdr; + + pr_debug("%s\n", __func__); + + memset(&mem_hdr, 0x00, sizeof(mem_hdr)); + memset(¶m_hdr, 0x00, sizeof(param_hdr)); + + if (0 == tfa_cal->map_data.dma_buf ) { + /*Minimal chunk size is 4K*/ + tfa_cal->map_data.map_size = SZ_4K; + result = msm_audio_ion_alloc(&(tfa_cal->map_data.dma_buf), + tfa_cal->map_data.map_size, + &(tfa_cal->cal_data.paddr), + &len, + &(tfa_cal->cal_data.kvaddr)); + if (result < 0) { + pr_err("%s: allocate buffer failed! ret = %d\n", + __func__, result); + goto err; + } + pr_debug("%s: paddr 0x%pK, kvaddr 0x%pK, map_size 0x%x\n", + __func__, + &tfa_cal->cal_data.paddr, + tfa_cal->cal_data.kvaddr, + tfa_cal->map_data.map_size); + } + + if (0 == tfa_cal->map_data.map_handle ) { + result = afe_map_rtac_block(tfa_cal); + if (result < 0) { + pr_err("%s: map buffer failed! ret = %d\n", + __func__, result); + goto err; + } + } + + port_index = q6audio_get_port_index(port_id); + if (port_index >= AFE_MAX_PORTS) { + pr_err("%s: Invalid AFE port = 0x%x\n", __func__, port_id); + goto err; + } + + if (cmd_size > (SZ_4K - sizeof(struct param_hdr_v3))) { + pr_err("%s: Invalid payload size = %d\n", __func__, cmd_size); + result = -EINVAL; + goto err; + } + + /* Pack message header with data */ + param_hdr.module_id = AFE_MODULE_ID_TFADSP_RX; + param_hdr.instance_id = INSTANCE_ID_0; + param_hdr.param_size = cmd_size; + + if (!bRead) { + param_hdr.param_id = AFE_PARAM_ID_TFADSP_RX_CFG; + + q6common_pack_pp_params(tfa_cal->cal_data.kvaddr, + ¶m_hdr, + buf, + &payload_size); + tfa_cal->cal_data.size = payload_size; + } + else { + param_hdr.param_id = AFE_PARAM_ID_TFADSP_RX_GET_RESULT; + tfa_cal->cal_data.size = cmd_size + sizeof(struct param_hdr_v3) ; + } + + /*Send/Get package to/from ADSP*/ + mem_hdr.data_payload_addr_lsw = + lower_32_bits(tfa_cal->cal_data.paddr); + mem_hdr.data_payload_addr_msw = + msm_audio_populate_upper_32_bits(tfa_cal->cal_data.paddr); + mem_hdr.mem_map_handle = + tfa_cal->map_data.map_handle; + + pr_debug("%s: Sending tfa_cal port = 0x%x, cal size = %zd, cal addr = 0x%pK\n", + __func__, port_id, tfa_cal->cal_data.size, &tfa_cal->cal_data.paddr); + + result = afe_q6_interface_prepare(); + if (result != 0) { + pr_err("%s: Q6 interface prepare failed %d\n", __func__, result); + goto err; + } + + if (!bRead) { + if (q6common_is_instance_id_supported()) + result = q6afe_set_params_v3(port_id, port_index, &mem_hdr, NULL, payload_size); + else + result = q6afe_set_params_v2(port_id, port_index, &mem_hdr, NULL, payload_size); + } else { + int8_t *resp = (int8_t *)tfa_cal->cal_data.kvaddr; + + atomic_set(&this_afe.tfa_state, 1); + if (q6common_is_instance_id_supported()){ + result = q6afe_get_params_v3(port_id, port_index, &mem_hdr, ¶m_hdr); + resp += sizeof(struct param_hdr_v3); + } + else { + result = q6afe_get_params_v2(port_id, port_index, &mem_hdr, ¶m_hdr); + resp += sizeof(struct param_hdr_v1); + } + + if (result) { + pr_err("%s: get response from port 0x%x failed %d\n", __func__, port_id, result); + goto err; + } + else { + /*Copy response data to command buffer*/ + memcpy(buf, resp, cmd_size); + } + } + +err: + return result; +} +EXPORT_SYMBOL(send_tfa_cal_apr); + +void send_tfa_cal_unmap_memory(void) +{ + int result = 0; + + if (this_afe.tfa_cal.map_data.map_handle) { + result = afe_unmap_rtac_block(&this_afe.tfa_cal.map_data.map_handle); + + /*Force to remap after unmap failed*/ + if (result) + this_afe.tfa_cal.map_data.map_handle = 0; + } +} +EXPORT_SYMBOL(send_tfa_cal_unmap_memory); + +int send_tfa_cal_in_band(void *buf, int cmd_size) +{ + union afe_spkr_prot_config afe_spk_config; + int32_t port_id = AFE_PORT_ID_TFADSP_RX; + + if (cmd_size > sizeof(afe_spk_config)) + return -EINVAL; + + memcpy(&afe_spk_config, buf, cmd_size); + + if (afe_spk_prot_prepare(port_id, 0, + AFE_PARAM_ID_TFADSP_RX_CFG, + &afe_spk_config)) { + pr_err("%s: AFE_PARAM_ID_TFADSP_RX_CFG failed\n", + __func__); + } + + return 0; +} +EXPORT_SYMBOL(send_tfa_cal_in_band); + +int send_tfa_cal_set_bypass(void *buf, int cmd_size) +{ + union afe_spkr_prot_config afe_spk_config; + int32_t port_id = AFE_PORT_ID_TFADSP_RX; + + if (cmd_size > sizeof(afe_spk_config)) + return -EINVAL; + + memcpy(&afe_spk_config, buf, cmd_size); + + if (afe_spk_prot_prepare(port_id, 0, + AFE_PARAM_ID_TFADSP_RX_SET_BYPASS, + &afe_spk_config)) { + pr_err("%s: AFE_PARAM_ID_TFADSP_RX_SET_BYPASS failed\n", + __func__); + } + + return 0; +} +EXPORT_SYMBOL(send_tfa_cal_set_bypass); + +int send_tfa_cal_set_tx_enable(void *buf, int cmd_size) +{ + union afe_spkr_prot_config afe_spk_config; + int32_t port_id = AFE_PORT_ID_TFADSP_TX; + + if (cmd_size > sizeof(afe_spk_config)) + return -EINVAL; + + memcpy(&afe_spk_config, buf, cmd_size); + + if (afe_spk_prot_prepare(port_id, 0, + AFE_PARAM_ID_TFADSP_TX_SET_ENABLE, + &afe_spk_config)) { + pr_err("%s: AFE_PARAM_ID_TFADSP_TX_SET_ENABLE failed\n", + __func__); + } + + return 0; +} +EXPORT_SYMBOL(send_tfa_cal_set_tx_enable); + +#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ + int __init afe_init(void) { int i = 0, ret; @@ -8622,6 +8861,10 @@ int __init afe_init(void) void afe_exit(void) { +#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI + afe_unmap_rtac_block(&this_afe.tfa_cal.map_data.map_handle); +#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ + if (this_afe.apr) { apr_reset(this_afe.apr); atomic_set(&this_afe.state, 0); From 93989512fda74b46d3dfdf035a7613e7aaa42e3b Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Sat, 22 Jun 2019 17:25:39 +0530 Subject: [PATCH 116/127] SoC: Fix symbolic links - Correct them for in-kernel compilation Signed-off-by: UtsavBalar1231 --- include/soc/internal.h | 2 +- soc/core.h | 2 +- soc/pinctrl-utils.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/soc/internal.h b/include/soc/internal.h index ad0a98dfc101..2bc065526db0 120000 --- a/include/soc/internal.h +++ b/include/soc/internal.h @@ -1 +1 @@ -../../../../../../kernel/msm-4.14/drivers/base/regmap/internal.h \ No newline at end of file +../../../../drivers/base/regmap/internal.h \ No newline at end of file diff --git a/soc/core.h b/soc/core.h index b9f94ca74f63..8a2fa90df8cb 120000 --- a/soc/core.h +++ b/soc/core.h @@ -1 +1 @@ -../../../../../kernel/msm-4.14/drivers/pinctrl/core.h \ No newline at end of file +../../../drivers/pinctrl/core.h \ No newline at end of file diff --git a/soc/pinctrl-utils.h b/soc/pinctrl-utils.h index 0f74549b32c1..9aab5f24bd14 120000 --- a/soc/pinctrl-utils.h +++ b/soc/pinctrl-utils.h @@ -1 +1 @@ -../../../../../kernel/msm-4.14/drivers/pinctrl/pinctrl-utils.h \ No newline at end of file +../../../drivers/pinctrl/pinctrl-utils.h \ No newline at end of file From 5cef2eab6a0f4263eb0efd05b732896ecb8828d5 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Sat, 22 Jun 2019 17:12:03 +0530 Subject: [PATCH 117/127] ASoC: Remove -Werror definations Signed-off-by: UtsavBalar1231 --- asoc/Kbuild | 1 - asoc/codecs/Kbuild | 1 - dsp/Kbuild | 1 - 3 files changed, 3 deletions(-) diff --git a/asoc/Kbuild b/asoc/Kbuild index 2ee3a7bb2e35..f77b4732f57f 100644 --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -183,7 +183,6 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ -DANI_OS_TYPE_ANDROID=6 \ -DPTT_SOCK_SVC_ENABLE \ -Wall\ - -Werror\ -D__linux__ ifdef CONFIG_SND_SOC_CS35L41_FOR_CEPH diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild index 920a546ad596..4afb9fd27ca4 100644 --- a/asoc/codecs/Kbuild +++ b/asoc/codecs/Kbuild @@ -179,7 +179,6 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ -DANI_OS_TYPE_ANDROID=6 \ -DPTT_SOCK_SVC_ENABLE \ -Wall\ - -Werror\ -D__linux__ KBUILD_CPPFLAGS += $(CDEFINES) diff --git a/dsp/Kbuild b/dsp/Kbuild index bf2b49075560..1298ab03e8ce 100644 --- a/dsp/Kbuild +++ b/dsp/Kbuild @@ -182,7 +182,6 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ -DANI_OS_TYPE_ANDROID=6 \ -DPTT_SOCK_SVC_ENABLE \ -Wall\ - -Werror\ -D__linux__ ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI From dd89a28a5fd089bcbd1fa6ea240b800586966d3e Mon Sep 17 00:00:00 2001 From: Albert I Date: Wed, 14 Aug 2019 17:46:38 +0530 Subject: [PATCH 118/127] techpack/audio: codecs: Fix potential buffer overflows * detected by Clang 9+'s -Wfortify-source. [Adapted to techpack/audio] Signed-off-by: Albert I Signed-off-by: UtsavisGreat Signed-off-by: UtsavBalar1231 --- asoc/codecs/wcd_cpe_core.c | 4 ++-- asoc/codecs/wsa881x.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/asoc/codecs/wcd_cpe_core.c b/asoc/codecs/wcd_cpe_core.c index 2e154e701c8c..d64a74978ce9 100644 --- a/asoc/codecs/wcd_cpe_core.c +++ b/asoc/codecs/wcd_cpe_core.c @@ -1978,8 +1978,8 @@ struct wcd_cpe_core *wcd_cpe_init(const char *img_fname, } card = codec->component.card->snd_card; - snprintf(proc_name, (sizeof("cpe") + sizeof("_state") + - sizeof(id) - 2), "%s%d%s", cpe_name, id, state_name); + snprintf(proc_name, sizeof(proc_name), + "%s%d%s", cpe_name, id, state_name); entry = snd_info_create_card_entry(card, proc_name, card->proc_root); if (entry) { diff --git a/asoc/codecs/wsa881x.c b/asoc/codecs/wsa881x.c index 8c4d01251945..74378644d123 100644 --- a/asoc/codecs/wsa881x.c +++ b/asoc/codecs/wsa881x.c @@ -415,7 +415,7 @@ static ssize_t wsa881x_swrslave_reg_show(char __user *ubuf, size_t count, continue; swr_read(dbgwsa881x->swr_slave, devnum, i, ®_val, 1); - len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i, + len = snprintf(tmp_buf, sizeof(tmp_buf), "0x%.3x: 0x%.2x\n", i, (reg_val & 0xFF)); if (len < 0) { pr_err("%s: fail to fill the buffer\n", __func__); From abf0f5c23dd814bda965c5b30b084d3192e99033 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Wed, 31 Jul 2019 17:52:44 +0530 Subject: [PATCH 119/127] techpack: audio: Remove build timestamp injection This causes parts of the audio module to be rebuilt during every incremental build, even if there are no changes: CC techpack/audio/ipc/apr.o - due to command line change CC techpack/audio/ipc/apr_v2.o - due to command line change CC techpack/audio/ipc/apr_tal_rpmsg.o - due to command line change CC techpack/audio/ipc/wcd-dsp-glink.o - due to command line change We're only experiencing this issue in techpack/audio/ipc at the moment, but kill the timestamp injection in all the audio components to eliminate the possibility of encountering this issue again in the future. This is harmless since the injected BUILD_TIMESTAMP macro is never used. Signed-off-by: Danny Lin Signed-off-by: UtsavBalar1231 --- 4.0/asoc/Kbuild | 1 - 4.0/asoc/codecs/Kbuild | 1 - 4.0/asoc/codecs/bolero/Kbuild | 1 - 4.0/asoc/codecs/wcd937x/Kbuild | 1 - 4.0/asoc/codecs/wcd938x/Kbuild | 1 - 4.0/dsp/Kbuild | 1 - 4.0/dsp/codecs/Kbuild | 1 - 4.0/ipc/Kbuild | 1 - 4.0/soc/Kbuild | 1 - asoc/Kbuild | 1 - asoc/codecs/Kbuild | 1 - asoc/codecs/aqt1000/Kbuild | 1 - asoc/codecs/bolero/Kbuild | 1 - asoc/codecs/cs35l41/Kbuild | 1 - asoc/codecs/csra66x0/Kbuild | 1 - asoc/codecs/ep92/Kbuild | 1 - asoc/codecs/msm_sdw/Kbuild | 1 - asoc/codecs/sdm660_cdc/Kbuild | 1 - asoc/codecs/tas2557/Kbuild | 1 - asoc/codecs/wcd934x/Kbuild | 1 - asoc/codecs/wcd9360/Kbuild | 1 - asoc/codecs/wcd937x/Kbuild | 1 - dsp/Kbuild | 1 - dsp/codecs/Kbuild | 1 - ipc/Kbuild | 1 - soc/Kbuild | 1 - 26 files changed, 26 deletions(-) diff --git a/4.0/asoc/Kbuild b/4.0/asoc/Kbuild index e3c8f487cf71..f064a6f6c98a 100644 --- a/4.0/asoc/Kbuild +++ b/4.0/asoc/Kbuild @@ -248,4 +248,3 @@ obj-$(CONFIG_SND_SOC_CPE) += cpe_lsm_dlkm.o cpe_lsm_dlkm-y := $(CPE_LSM_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/asoc/codecs/Kbuild b/4.0/asoc/codecs/Kbuild index e138c9129c08..745065179a1c 100644 --- a/4.0/asoc/codecs/Kbuild +++ b/4.0/asoc/codecs/Kbuild @@ -252,4 +252,3 @@ obj-$(CONFIG_SND_SOC_MSM_HDMI_CODEC_RX) += hdmi_dlkm.o hdmi_dlkm-y := $(HDMICODEC_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/asoc/codecs/bolero/Kbuild b/4.0/asoc/codecs/bolero/Kbuild index 74d46e5ceae2..0997fc4699d1 100644 --- a/4.0/asoc/codecs/bolero/Kbuild +++ b/4.0/asoc/codecs/bolero/Kbuild @@ -166,4 +166,3 @@ obj-$(CONFIG_RX_MACRO) += rx_macro_dlkm.o rx_macro_dlkm-y := $(RX_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/asoc/codecs/wcd937x/Kbuild b/4.0/asoc/codecs/wcd937x/Kbuild index 1c36fbbc1765..9ef043d596b7 100644 --- a/4.0/asoc/codecs/wcd937x/Kbuild +++ b/4.0/asoc/codecs/wcd937x/Kbuild @@ -130,4 +130,3 @@ obj-$(CONFIG_SND_SOC_WCD937X_SLAVE) += wcd937x_slave_dlkm.o wcd937x_slave_dlkm-y := $(WCD937X_SLAVE_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/asoc/codecs/wcd938x/Kbuild b/4.0/asoc/codecs/wcd938x/Kbuild index 2c915a6c8cb3..337feb02d1ef 100644 --- a/4.0/asoc/codecs/wcd938x/Kbuild +++ b/4.0/asoc/codecs/wcd938x/Kbuild @@ -133,4 +133,3 @@ obj-$(CONFIG_SND_SOC_WCD938X_SLAVE) += wcd938x_slave_dlkm.o wcd938x_slave_dlkm-y := $(WCD938X_SLAVE_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/dsp/Kbuild b/4.0/dsp/Kbuild index 62dd6c7e1d45..ed00b157a4f2 100644 --- a/4.0/dsp/Kbuild +++ b/4.0/dsp/Kbuild @@ -253,4 +253,3 @@ obj-$(CONFIG_MSM_QDSP6_NOTIFIER) += q6_notifier_dlkm.o q6_notifier_dlkm-y := $(QDSP6_NOTIFIER_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/dsp/codecs/Kbuild b/4.0/dsp/codecs/Kbuild index d2fd0d49472c..a68c00b8d406 100644 --- a/4.0/dsp/codecs/Kbuild +++ b/4.0/dsp/codecs/Kbuild @@ -165,4 +165,3 @@ obj-$(CONFIG_MSM_QDSP6V2_CODECS) += native_dlkm.o native_dlkm-y := $(NATIVE_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/ipc/Kbuild b/4.0/ipc/Kbuild index 1a16892f0fe3..e71da4eb80c2 100644 --- a/4.0/ipc/Kbuild +++ b/4.0/ipc/Kbuild @@ -182,4 +182,3 @@ obj-$(CONFIG_WCD_DSP_GLINK) += wglink_dlkm.o wglink_dlkm-y := $(WDSP_GLINK) # inject some build related information -CDEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/4.0/soc/Kbuild b/4.0/soc/Kbuild index 5165d0bfdbfb..87102079e9ae 100644 --- a/4.0/soc/Kbuild +++ b/4.0/soc/Kbuild @@ -183,4 +183,3 @@ obj-$(CONFIG_WCD_SPI_AC) += wcd_spi_acc_ctl_dlkm.o wcd_spi_acc_ctl_dlkm-y := $(WCD_SPI_ACC_CTL_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/Kbuild b/asoc/Kbuild index f77b4732f57f..149b86b096d7 100644 --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -246,4 +246,3 @@ obj-$(CONFIG_SND_SOC_CPE) += cpe_lsm_dlkm.o cpe_lsm_dlkm-y := $(CPE_LSM_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild index 4afb9fd27ca4..a74325bad381 100644 --- a/asoc/codecs/Kbuild +++ b/asoc/codecs/Kbuild @@ -249,4 +249,3 @@ obj-$(CONFIG_SND_SOC_MSM_HDMI_CODEC_RX) += hdmi_dlkm.o hdmi_dlkm-y := $(HDMICODEC_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/aqt1000/Kbuild b/asoc/codecs/aqt1000/Kbuild index 5b05798b2688..9de949aab15f 100644 --- a/asoc/codecs/aqt1000/Kbuild +++ b/asoc/codecs/aqt1000/Kbuild @@ -121,4 +121,3 @@ obj-$(CONFIG_SND_SOC_AQT1000) += aqt1000_cdc_dlkm.o aqt1000_cdc_dlkm-y := $(AQT1000_CDC_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/bolero/Kbuild b/asoc/codecs/bolero/Kbuild index 16766416244b..1ee35c873473 100644 --- a/asoc/codecs/bolero/Kbuild +++ b/asoc/codecs/bolero/Kbuild @@ -145,4 +145,3 @@ obj-$(CONFIG_RX_MACRO) += rx_macro_dlkm.o rx_macro_dlkm-y := $(RX_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/cs35l41/Kbuild b/asoc/codecs/cs35l41/Kbuild index d13b2a6fcf3e..aa7e59a9130f 100755 --- a/asoc/codecs/cs35l41/Kbuild +++ b/asoc/codecs/cs35l41/Kbuild @@ -114,4 +114,3 @@ obj-$(CONFIG_SND_SOC_CS35L41) += cs35l41_dlkm.o cs35l41_dlkm-y := $(CS35L41_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/csra66x0/Kbuild b/asoc/codecs/csra66x0/Kbuild index 4b1a3ba1a715..06ecab23b658 100644 --- a/asoc/codecs/csra66x0/Kbuild +++ b/asoc/codecs/csra66x0/Kbuild @@ -106,4 +106,3 @@ obj-$(CONFIG_SND_SOC_CSRA66X0) += csra66x0_dlkm.o csra66x0_dlkm-y := $(CSRA66X0_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/ep92/Kbuild b/asoc/codecs/ep92/Kbuild index af1fd083662c..f5d18168947b 100644 --- a/asoc/codecs/ep92/Kbuild +++ b/asoc/codecs/ep92/Kbuild @@ -107,4 +107,3 @@ obj-$(CONFIG_SND_SOC_EP92) += ep92_dlkm.o ep92_dlkm-y := $(EP92_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/msm_sdw/Kbuild b/asoc/codecs/msm_sdw/Kbuild index dd95afdec255..99edad0fef2d 100644 --- a/asoc/codecs/msm_sdw/Kbuild +++ b/asoc/codecs/msm_sdw/Kbuild @@ -121,4 +121,3 @@ obj-$(CONFIG_SND_SOC_MSM_SDW) += msm_sdw_dlkm.o msm_sdw_dlkm-y := $(MSM_SDW_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/sdm660_cdc/Kbuild b/asoc/codecs/sdm660_cdc/Kbuild index 6d929205f012..6dacbb80f5b5 100644 --- a/asoc/codecs/sdm660_cdc/Kbuild +++ b/asoc/codecs/sdm660_cdc/Kbuild @@ -127,4 +127,3 @@ obj-$(CONFIG_SND_SOC_DIGITAL_CDC) += digital_cdc_dlkm.o digital_cdc_dlkm-y := $(DIGITAL_CDC_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/tas2557/Kbuild b/asoc/codecs/tas2557/Kbuild index 3be6f37c47b9..a65c9fb25b19 100755 --- a/asoc/codecs/tas2557/Kbuild +++ b/asoc/codecs/tas2557/Kbuild @@ -115,4 +115,3 @@ obj-$(CONFIG_SND_SOC_TAS2557) += tas2557_dlkm.o tas2557_dlkm-y := $(TAS2557_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/wcd934x/Kbuild b/asoc/codecs/wcd934x/Kbuild index bc872eef98a5..33cf0fba3144 100644 --- a/asoc/codecs/wcd934x/Kbuild +++ b/asoc/codecs/wcd934x/Kbuild @@ -142,4 +142,3 @@ obj-$(CONFIG_SND_SOC_WCD934X) += wcd934x_dlkm.o wcd934x_dlkm-y := $(WCD934X_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/wcd9360/Kbuild b/asoc/codecs/wcd9360/Kbuild index 8753c005bee0..de239832ae8b 100644 --- a/asoc/codecs/wcd9360/Kbuild +++ b/asoc/codecs/wcd9360/Kbuild @@ -111,4 +111,3 @@ obj-$(CONFIG_SND_SOC_WCD9360) += wcd9360_dlkm.o wcd9360_dlkm-y := $(WCD9360_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/asoc/codecs/wcd937x/Kbuild b/asoc/codecs/wcd937x/Kbuild index bfc6f4fd5e6e..42c2defb1018 100644 --- a/asoc/codecs/wcd937x/Kbuild +++ b/asoc/codecs/wcd937x/Kbuild @@ -119,4 +119,3 @@ obj-$(CONFIG_SND_SOC_WCD937X_SLAVE) += wcd937x_slave_dlkm.o wcd937x_slave_dlkm-y := $(WCD937X_SLAVE_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/dsp/Kbuild b/dsp/Kbuild index 1298ab03e8ce..75c58f80abbd 100644 --- a/dsp/Kbuild +++ b/dsp/Kbuild @@ -242,4 +242,3 @@ obj-$(CONFIG_MSM_QDSP6_NOTIFIER) += q6_notifier_dlkm.o q6_notifier_dlkm-y := $(QDSP6_NOTIFIER_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/dsp/codecs/Kbuild b/dsp/codecs/Kbuild index 6139e52c5bd7..f551325915ad 100644 --- a/dsp/codecs/Kbuild +++ b/dsp/codecs/Kbuild @@ -164,4 +164,3 @@ obj-$(CONFIG_MSM_QDSP6V2_CODECS) += native_dlkm.o native_dlkm-y := $(NATIVE_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/ipc/Kbuild b/ipc/Kbuild index a1376fdcfd7f..edc3b3bf5615 100644 --- a/ipc/Kbuild +++ b/ipc/Kbuild @@ -164,4 +164,3 @@ obj-$(CONFIG_WCD_DSP_GLINK) += wglink_dlkm.o wglink_dlkm-y := $(WDSP_GLINK) # inject some build related information -CDEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" diff --git a/soc/Kbuild b/soc/Kbuild index 157b81d6efc3..4de44c62a307 100644 --- a/soc/Kbuild +++ b/soc/Kbuild @@ -175,4 +175,3 @@ obj-$(CONFIG_SOUNDWIRE_MSTR_CTRL) += swr_ctrl_dlkm.o swr_ctrl_dlkm-y := $(SWR_CTRL_OBJS) # inject some build related information -DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\" From 400052ff4b10c089b64c183d870c65a1afab9992 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Sun, 8 Sep 2019 17:55:20 +0530 Subject: [PATCH 120/127] ASoC: sm8150: Split sa8155 driver into separate config option There's no need to compile the sa8155 driver when targeting sm8150 mobile devices. Signed-off-by: Danny Lin Signed-off-by: UtsavisGreat --- asoc/Kbuild | 6 +++++- asoc/machine_815x_init.c | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/asoc/Kbuild b/asoc/Kbuild index 149b86b096d7..8575f3f31487 100644 --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -115,11 +115,15 @@ endif # for SM8150 sound card driver ifdef CONFIG_SND_SOC_SM8150 - MACHINE_OBJS += sa8155.o MACHINE_OBJS += sm8150.o MACHINE_OBJS += machine_815x_init.o endif +# for SA8155 sound card driver +ifdef CONFIG_SND_SOC_SA8155 + MACHINE_OBJS += sa8155.o +endif + # for SM6150 sound card driver ifdef CONFIG_SND_SOC_SM6150 MACHINE_OBJS += sm6150.o diff --git a/asoc/machine_815x_init.c b/asoc/machine_815x_init.c index ab1bdc1f6d29..911294707ff0 100644 --- a/asoc/machine_815x_init.c +++ b/asoc/machine_815x_init.c @@ -19,14 +19,18 @@ GNU General Public License for more details. static int __init audio_machine_815x_init(void) { sm8150_init(); +#ifdef CONFIG_SND_SOC_SA8155 sa8155_init(); +#endif return 0; } static void audio_machine_815x_exit(void) { sm8150_exit(); +#ifdef CONFIG_SND_SOC_SA8155 sa8155_exit(); +#endif } module_init(audio_machine_815x_init); From 1982ccb0cc1693c46670ae43ba317bf0a1c57fff Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Sat, 22 Jun 2019 17:15:37 +0530 Subject: [PATCH 121/127] ASoC: dsp: elliptic: Fix No newline at end of elliptic_version.h Signed-off-by: UtsavBalar1231 --- dsp/elliptic/elliptic_version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsp/elliptic/elliptic_version.h b/dsp/elliptic/elliptic_version.h index 9a463bb351b4..1c8eb9af005d 100755 --- a/dsp/elliptic/elliptic_version.h +++ b/dsp/elliptic/elliptic_version.h @@ -5,4 +5,4 @@ #define build_number "20181016.1" #define build_source_version "e5e26691554bba9b1438ec3d7e0cc55dfb296bb8" -#endif //ELLIPTIC_VERSION_H \ No newline at end of file +#endif //ELLIPTIC_VERSION_H From def573c99dc5836140a49d6178fdd810eef96dc9 Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Wed, 26 Aug 2020 22:44:57 +0530 Subject: [PATCH 122/127] config: sm8150: Build all modules in-kernel Signed-off-by: UtsavBalar1231 --- config/sm8150auto.conf | 98 +++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/config/sm8150auto.conf b/config/sm8150auto.conf index 45a38d541146..a26daf0fb511 100644 --- a/config/sm8150auto.conf +++ b/config/sm8150auto.conf @@ -1,50 +1,50 @@ -CONFIG_PINCTRL_WCD=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD9360=m -CONFIG_SND_SOC_WCD_DSP_MGR=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_SND_SOC_WCD_CPE=m -CONFIG_SOUNDWIRE_WCD_CTRL=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_SM8150=m -CONFIG_MSM_GLINK_SPI_XPRT=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_SOUNDWIRE=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_VOICE_MHI=m -CONFIG_SND_SOC_CS35L41=m -CONFIG_SND_SOC_CS35L41_FOR_CEPH=m -CONFIG_SND_SOC_TAS2557=m -CONFIG_TAS2557_REGMAP=m -CONFIG_TAS2557_CODEC=m -CONFIG_TAS2557_MISC=m +CONFIG_PINCTRL_WCD=y +CONFIG_AUDIO_EXT_CLK=y +CONFIG_SND_SOC_WCD9XXX_V2=y +CONFIG_SND_SOC_WCD_MBHC=y +CONFIG_SND_SOC_WSA881X=y +CONFIG_SND_SOC_WCD9360=y +CONFIG_SND_SOC_WCD_DSP_MGR=y +CONFIG_SND_SOC_WCD_SPI=y +CONFIG_SND_SOC_WCD934X=y +CONFIG_SND_SOC_WCD934X_MBHC=y +CONFIG_SND_SOC_WCD934X_DSD=y +CONFIG_SND_SOC_WCD_CPE=y +CONFIG_SOUNDWIRE_WCD_CTRL=y +CONFIG_WCD9XXX_CODEC_CORE=y +CONFIG_MSM_CDC_PINCTRL=y +CONFIG_MSM_QDSP6V2_CODECS=y +CONFIG_MSM_ULTRASOUND=y +CONFIG_MSM_QDSP6_APRV2_RPMSG=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_REGMAP_SWR=y +CONFIG_MSM_QDSP6_SSR=y +CONFIG_MSM_QDSP6_PDR=y +CONFIG_MSM_QDSP6_NOTIFIER=y +CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y +CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y +CONFIG_SND_SOC_SM8150=y +CONFIG_MSM_GLINK_SPI_XPRT=y +CONFIG_WCD_DSP_GLINK=y +CONFIG_SOUNDWIRE=y +CONFIG_SND_SOC_QDSP6V2=y +CONFIG_SND_SOC_WCD_MBHC_ADC=y +CONFIG_QTI_PP=y +CONFIG_SND_HWDEP_ROUTING=y +CONFIG_DTS_EAGLE=y +CONFIG_DOLBY_DS2=y +CONFIG_DOLBY_LICENSE=y +CONFIG_DTS_SRS_TM=y +CONFIG_SND_SOC_MSM_STUB=y +CONFIG_MSM_AVTIMER=y +CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y +CONFIG_VOICE_MHI=y +CONFIG_SND_SOC_CS35L41=y +CONFIG_SND_SOC_CS35L41_FOR_CEPH=y +CONFIG_SND_SOC_TAS2557=y +CONFIG_TAS2557_REGMAP=y +CONFIG_TAS2557_CODEC=y +CONFIG_TAS2557_MISC=y CONFIG_MSM_CSPL=y -CONFIG_SND_SOC_TFA9874=m -CONFIG_SND_SOC_TFA9874_FOR_DAVI=m +CONFIG_SND_SOC_TFA9874=y +CONFIG_SND_SOC_TFA9874_FOR_DAVI=y From cfc01019a9970a2eae98613bc3cc58ac80ccfddb Mon Sep 17 00:00:00 2001 From: Miguel de Dios Date: Thu, 1 Nov 2018 10:31:33 -0700 Subject: [PATCH 123/127] ASoC: msm-dai-q6-v2: Mark msm-dai-q6 drivers as sync probe. Bug: 115776306 Bug: 77146523 Change-Id: I31d533a62e2dbfbc27aea8bf8794cf4c5d201c9a Signed-off-by: Miguel de Dios Signed-off-by: UtsavBalar1231 --- asoc/msm-dai-q6-v2.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index bc7cea790238..4c043edafc27 100644 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -6344,6 +6344,7 @@ static struct platform_driver msm_dai_q6_dev = { .name = "msm-dai-q6-dev", .owner = THIS_MODULE, .of_match_table = msm_dai_q6_dev_dt_match, + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; @@ -6381,6 +6382,7 @@ static struct platform_driver msm_dai_q6 = { .name = "msm-dai-q6", .owner = THIS_MODULE, .of_match_table = msm_dai_q6_dt_match, + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; @@ -6708,6 +6710,7 @@ static struct platform_driver msm_dai_tdm_q6 = { .name = "msm-dai-tdm", .owner = THIS_MODULE, .of_match_table = msm_dai_tdm_dt_match, + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; @@ -10363,6 +10366,7 @@ static struct platform_driver msm_dai_q6_tdm_driver = { .name = "msm-dai-q6-tdm", .owner = THIS_MODULE, .of_match_table = msm_dai_q6_tdm_dev_dt_match, + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; From f8b9894ed9ae15c532c3ae18cd8e98912a6ec16f Mon Sep 17 00:00:00 2001 From: Thierry Strudel Date: Wed, 26 Aug 2020 22:43:58 +0530 Subject: [PATCH 124/127] ASoC: sm8150: do not export all the variables This patch fixes an issue with all the functions defined in scripts/Makefile.lib gets called everytime when this makefile is included thus causing the build to slow down. Bug: 118818737 Change-Id: I4929e64d53a0bc865b12a27cce37520be52c9744 Signed-off-by: Thierry Strudel Signed-off-by: UtsavBalar1231 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 540c6d4bb71f..7368626a898d 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ export endif ifeq ($(CONFIG_ARCH_SM8150), y) include $(srctree)/techpack/audio/config/sm8150auto.conf -export +export $(shell sed 's/=.*//' $(srctree)/techpack/audio/config/sm8150auto.conf) endif ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) include $(srctree)/techpack/audio/config/sm8150auto.conf From 28575f95d895872774ce1f3bbd6cf474fafedb62 Mon Sep 17 00:00:00 2001 From: GuaiYiHu Date: Tue, 12 Nov 2019 17:47:44 +0800 Subject: [PATCH 125/127] ASoC: Avoid spk_id_get duplicate defination Change-Id: I03e0e05434d3998e921acdfc1b36d2916a3dcd67 Signed-off-by: UtsavBalar1231 --- asoc/codecs/cs35l41/cs35l41.c | 6 +++--- asoc/codecs/tas2557/tas2557-codec.c | 2 +- asoc/codecs/tas2557/tas2557-core.c | 4 ++-- asoc/codecs/tas2557/tas2557-core.h | 2 +- include/uapi/sound/cs35l41.h | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/asoc/codecs/cs35l41/cs35l41.c b/asoc/codecs/cs35l41/cs35l41.c index edaddf38335d..25db86058e47 100755 --- a/asoc/codecs/cs35l41/cs35l41.c +++ b/asoc/codecs/cs35l41/cs35l41.c @@ -215,7 +215,7 @@ static int vendor_id_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[0] = VENDOR_ID_NONE; if (cs35l41->pdata.spk_id_gpio_p) - ucontrol->value.integer.value[0] = spk_id_get(cs35l41->pdata.spk_id_gpio_p); + ucontrol->value.integer.value[0] = cs35l41_spk_id_get(cs35l41->pdata.spk_id_gpio_p); return 0; } @@ -1646,7 +1646,7 @@ static struct snd_soc_codec_driver soc_codec_dev_cs35l41 = { .idle_bias_off = true, }; -int spk_id_get(struct device_node *np) +int cs35l41_spk_id_get(struct device_node *np) { int id; int state; @@ -1742,7 +1742,7 @@ static int cs35l41_handle_of_data(struct device *dev, "cirrus,spk-id-pin", np->full_name); pdata->mnSpkType = VENDOR_ID_NONE; } else { - pdata->mnSpkType = spk_id_get(pdata->spk_id_gpio_p); + pdata->mnSpkType = cs35l41_spk_id_get(pdata->spk_id_gpio_p); } dev_info(dev, "spk is is %d", pdata->mnSpkType); diff --git a/asoc/codecs/tas2557/tas2557-codec.c b/asoc/codecs/tas2557/tas2557-codec.c index 06de3fd7bc43..5aec1fe87c67 100755 --- a/asoc/codecs/tas2557/tas2557-codec.c +++ b/asoc/codecs/tas2557/tas2557-codec.c @@ -330,7 +330,7 @@ static int vendor_id_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[0] = VENDOR_ID_NONE; if (pTAS2557->spk_id_gpio_p) - ucontrol->value.integer.value[0] = spk_id_get(pTAS2557->spk_id_gpio_p); + ucontrol->value.integer.value[0] = tas2557_spk_id_get(pTAS2557->spk_id_gpio_p); return 0; } diff --git a/asoc/codecs/tas2557/tas2557-core.c b/asoc/codecs/tas2557/tas2557-core.c index cc385b2cdaa4..d95c46ec9a80 100755 --- a/asoc/codecs/tas2557/tas2557-core.c +++ b/asoc/codecs/tas2557/tas2557-core.c @@ -2051,7 +2051,7 @@ end: return bFound; } -int spk_id_get(struct device_node *np) +int tas2557_spk_id_get(struct device_node *np) { int id; int state; @@ -2092,7 +2092,7 @@ int tas2557_parse_dt(struct device *dev, struct tas2557_priv *pTAS2557) "ti,spk-id-pin", np->full_name); pTAS2557->mnSpkType = VENDOR_ID_NONE; } else { - pTAS2557->mnSpkType = spk_id_get(pTAS2557->spk_id_gpio_p); + pTAS2557->mnSpkType = tas2557_spk_id_get(pTAS2557->spk_id_gpio_p); } dev_dbg(pTAS2557->dev, "spk is is %d", pTAS2557->mnSpkType); diff --git a/asoc/codecs/tas2557/tas2557-core.h b/asoc/codecs/tas2557/tas2557-core.h index 5081d5bb4364..4d72ddadefbc 100755 --- a/asoc/codecs/tas2557/tas2557-core.h +++ b/asoc/codecs/tas2557/tas2557-core.h @@ -76,6 +76,6 @@ int tas2557_parse_dt(struct device *dev, struct tas2557_priv *pTAS2557); int tas2557_get_DAC_gain(struct tas2557_priv *pTAS2557, unsigned char *pnGain); int tas2557_set_DAC_gain(struct tas2557_priv *pTAS2557, unsigned int nGain); int tas2557_configIRQ(struct tas2557_priv *pTAS2557); -int spk_id_get(struct device_node *np); +int tas2557_spk_id_get(struct device_node *np); #endif /* _TAS2557_CORE_H */ diff --git a/include/uapi/sound/cs35l41.h b/include/uapi/sound/cs35l41.h index a3f7e537f6b8..7a2fb19d825d 100755 --- a/include/uapi/sound/cs35l41.h +++ b/include/uapi/sound/cs35l41.h @@ -79,5 +79,5 @@ struct cs35l41_private { int cs35l41_probe(struct cs35l41_private *cs35l41, struct cs35l41_platform_data *pdata); -int spk_id_get(struct device_node *np); +int cs35l41_spk_id_get(struct device_node *np); #endif /* __CS35L41_H */ From d79a2f5a4f39ed595ee30f29fe336ccc0ef910cb Mon Sep 17 00:00:00 2001 From: Demon000 Date: Thu, 27 Aug 2020 10:48:38 +0530 Subject: [PATCH 126/127] techpack: audio: Remove Android.mk files find * -type f -name "Android.mk" -delete Signed-off-by: UtsavBalar1231 --- 4.0/asoc/Android.mk | 97 ------------------- 4.0/asoc/codecs/Android.mk | 145 ----------------------------- 4.0/asoc/codecs/bolero/Android.mk | 94 ------------------- 4.0/asoc/codecs/wcd937x/Android.mk | 61 ------------ 4.0/asoc/codecs/wcd938x/Android.mk | 69 -------------- 4.0/dsp/Android.mk | 104 --------------------- 4.0/dsp/codecs/Android.mk | 66 ------------- 4.0/include/uapi/Android.mk | 30 ------ 4.0/ipc/Android.mk | 81 ---------------- 4.0/soc/Android.mk | 103 -------------------- Android.mk | 83 ----------------- asoc/Android.mk | 93 ------------------ asoc/codecs/Android.mk | 137 --------------------------- asoc/codecs/aqt1000/Android.mk | 41 -------- asoc/codecs/bolero/Android.mk | 82 ---------------- asoc/codecs/cs35l41/Android.mk | 55 ----------- asoc/codecs/ep92/Android.mk | 50 ---------- asoc/codecs/msm_sdw/Android.mk | 53 ----------- asoc/codecs/sdm660_cdc/Android.mk | 53 ----------- asoc/codecs/tas2557/Android.mk | 55 ----------- asoc/codecs/wcd934x/Android.mk | 66 ------------- asoc/codecs/wcd9360/Android.mk | 50 ---------- asoc/codecs/wcd937x/Android.mk | 57 ------------ dsp/Android.mk | 98 ------------------- dsp/codecs/Android.mk | 66 ------------- include/uapi/Android.mk | 29 ------ ipc/Android.mk | 73 --------------- soc/Android.mk | 101 -------------------- 28 files changed, 2092 deletions(-) delete mode 100644 4.0/asoc/Android.mk delete mode 100644 4.0/asoc/codecs/Android.mk delete mode 100644 4.0/asoc/codecs/bolero/Android.mk delete mode 100644 4.0/asoc/codecs/wcd937x/Android.mk delete mode 100644 4.0/asoc/codecs/wcd938x/Android.mk delete mode 100644 4.0/dsp/Android.mk delete mode 100644 4.0/dsp/codecs/Android.mk delete mode 100644 4.0/include/uapi/Android.mk delete mode 100644 4.0/ipc/Android.mk delete mode 100644 4.0/soc/Android.mk delete mode 100644 Android.mk delete mode 100644 asoc/Android.mk delete mode 100644 asoc/codecs/Android.mk delete mode 100644 asoc/codecs/aqt1000/Android.mk delete mode 100644 asoc/codecs/bolero/Android.mk delete mode 100755 asoc/codecs/cs35l41/Android.mk delete mode 100644 asoc/codecs/ep92/Android.mk delete mode 100644 asoc/codecs/msm_sdw/Android.mk delete mode 100644 asoc/codecs/sdm660_cdc/Android.mk delete mode 100755 asoc/codecs/tas2557/Android.mk delete mode 100644 asoc/codecs/wcd934x/Android.mk delete mode 100644 asoc/codecs/wcd9360/Android.mk delete mode 100644 asoc/codecs/wcd937x/Android.mk delete mode 100644 dsp/Android.mk delete mode 100644 dsp/codecs/Android.mk delete mode 100644 include/uapi/Android.mk delete mode 100644 ipc/Android.mk delete mode 100644 soc/Android.mk diff --git a/4.0/asoc/Android.mk b/4.0/asoc/Android.mk deleted file mode 100644 index 9d866f997644..000000000000 --- a/4.0/asoc/Android.mk +++ /dev/null @@ -1,97 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -TARGET := msmnile -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -TARGET := talos -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -TARGET := trinket -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -TARGET := kona -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -TARGET := lito -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -TARGET := atoll -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=platform_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_platform.ko -LOCAL_MODULE_KBUILD_NAME := platform_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, ),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_cpe_lsm.ko -LOCAL_MODULE_KBUILD_NAME := cpe_lsm_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_machine_$(TARGET).ko -LOCAL_MODULE_KBUILD_NAME := machine_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/asoc/codecs/Android.mk b/4.0/asoc/codecs/Android.mk deleted file mode 100644 index 593510245f69..000000000000 --- a/4.0/asoc/codecs/Android.mk +++ /dev/null @@ -1,145 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd_core_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_core.ko -LOCAL_MODULE_KBUILD_NAME := wcd_core_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9xxx.ko -LOCAL_MODULE_KBUILD_NAME := wcd9xxx_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, ),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_cpe.ko -LOCAL_MODULE_KBUILD_NAME := wcd_cpe_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_spi.ko -LOCAL_MODULE_KBUILD_NAME := wcd_spi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -ifeq ($(call is-board-platform-in-list, ),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9335.ko -LOCAL_MODULE_KBUILD_NAME := wcd9335_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa881x.ko -LOCAL_MODULE_KBUILD_NAME := wsa881x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_mbhc.ko -LOCAL_MODULE_KBUILD_NAME := mbhc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -############################################################ -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_stub.ko -LOCAL_MODULE_KBUILD_NAME := stub_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################## -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_hdmi.ko -LOCAL_MODULE_KBUILD_NAME := hdmi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/asoc/codecs/bolero/Android.mk b/4.0/asoc/codecs/bolero/Android.mk deleted file mode 100644 index 47791b4eb1be..000000000000 --- a/4.0/asoc/codecs/bolero/Android.mk +++ /dev/null @@ -1,94 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=bolero_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_bolero_cdc.ko -LOCAL_MODULE_KBUILD_NAME := bolero_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa_macro.ko -LOCAL_MODULE_KBUILD_NAME := wsa_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_va_macro.ko -LOCAL_MODULE_KBUILD_NAME := va_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_tx_macro.ko -LOCAL_MODULE_KBUILD_NAME := tx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_rx_macro.ko -LOCAL_MODULE_KBUILD_NAME := rx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/asoc/codecs/wcd937x/Android.mk b/4.0/asoc/codecs/wcd937x/Android.mk deleted file mode 100644 index 183c78dfe2d7..000000000000 --- a/4.0/asoc/codecs/wcd937x/Android.mk +++ /dev/null @@ -1,61 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd937x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x_slave.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_slave_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/asoc/codecs/wcd938x/Android.mk b/4.0/asoc/codecs/wcd938x/Android.mk deleted file mode 100644 index 87f16620ed13..000000000000 --- a/4.0/asoc/codecs/wcd938x/Android.mk +++ /dev/null @@ -1,69 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,kona lito atoll $(MSMSTEPPE)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd938x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd938x.ko -LOCAL_MODULE_KBUILD_NAME := wcd938x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd938x_slave.ko -LOCAL_MODULE_KBUILD_NAME := wcd938x_slave_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/dsp/Android.mk b/4.0/dsp/Android.mk deleted file mode 100644 index 172fbee3f895..000000000000 --- a/4.0/dsp/Android.mk +++ /dev/null @@ -1,104 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform, kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform, lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform, atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) atoll kona lito),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=q6_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6.ko -LOCAL_MODULE_KBUILD_NAME := q6_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_adsp_loader.ko -LOCAL_MODULE_KBUILD_NAME := adsp_loader_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_notifier.ko -LOCAL_MODULE_KBUILD_NAME := q6_notifier_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -############################################################ -ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_usf.ko -LOCAL_MODULE_KBUILD_NAME := usf_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################## -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_pdr.ko -LOCAL_MODULE_KBUILD_NAME := q6_pdr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/dsp/codecs/Android.mk b/4.0/dsp/codecs/Android.mk deleted file mode 100644 index 48e3b8568f6e..000000000000 --- a/4.0/dsp/codecs/Android.mk +++ /dev/null @@ -1,66 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) atoll kona lito),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=native_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_native.ko -LOCAL_MODULE_KBUILD_NAME := native_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/include/uapi/Android.mk b/4.0/include/uapi/Android.mk deleted file mode 100644 index f19a6c20337e..000000000000 --- a/4.0/include/uapi/Android.mk +++ /dev/null @@ -1,30 +0,0 @@ -# Use this by setting -# LOCAL_HEADER_LIBRARIES := audio_kernel_headers - -LOCAL_PATH := $(call my-dir) -MYLOCAL_PATH := $(LOCAL_PATH) - -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/include - -AUDIO_KERNEL_HEADERS := $(call all-named-files-under,*.h,linux) $(call all-named-files-under,*.h,sound) - -HEADER_INSTALL_DIR := kernel/msm-$(TARGET_KERNEL_VERSION)/scripts - -BUILD_ROOT_RELATIVE := ../../../../../../../ - -include $(CLEAR_VARS) -LOCAL_MODULE := audio_kernel_headers -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_PREBUILT_INT_KERNEL) -LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr - -GEN := $(addprefix $(UAPI_OUT)/,$(AUDIO_KERNEL_HEADERS)) -$(GEN): $(KERNEL_USR) -$(GEN): PRIVATE_PATH := $(MYLOCAL_PATH) -$(GEN): PRIVATE_CUSTOM_TOOL = $(shell cd $(PRODUCT_OUT)/obj/KERNEL_OBJ; $(BUILD_ROOT_RELATIVE)$(HEADER_INSTALL_DIR)/headers_install.sh $(BUILD_ROOT_RELATIVE)$(dir $@) $(BUILD_ROOT_RELATIVE)$(subst $(UAPI_OUT),$(MYLOCAL_PATH),$(dir $@)) $(notdir $@)) -$(GEN): $(addprefix $(MYLOCAL_PATH)/,$(AUDIO_KERNEL_HEADERS)) - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES := $(GEN) -LOCAL_EXPORT_C_INCLUDE_DIRS := $(UAPI_OUT) - -include $(BUILD_HEADER_LIBRARY) diff --git a/4.0/ipc/Android.mk b/4.0/ipc/Android.mk deleted file mode 100644 index 25b98dd09d9b..000000000000 --- a/4.0/ipc/Android.mk +++ /dev/null @@ -1,81 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) atoll kona lito),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=apr_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_apr.ko -LOCAL_MODULE_KBUILD_NAME := apr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET)),true) -ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wglink.ko -LOCAL_MODULE_KBUILD_NAME := wglink_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -endif -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/4.0/soc/Android.mk b/4.0/soc/Android.mk deleted file mode 100644 index 83101fceaded..000000000000 --- a/4.0/soc/Android.mk +++ /dev/null @@ -1,103 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=soc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) atoll kona lito),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_lpi.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_lpi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) kona), true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_wcd.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_wcd_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr.ko -LOCAL_MODULE_KBUILD_NAME := swr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr_ctrl.ko -LOCAL_MODULE_KBUILD_NAME := swr_ctrl_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, $(MSMSTEPPE) kona lito atoll),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_snd_event.ko -LOCAL_MODULE_KBUILD_NAME := snd_event_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/Android.mk b/Android.mk deleted file mode 100644 index b2278bc2e8d0..000000000000 --- a/Android.mk +++ /dev/null @@ -1,83 +0,0 @@ -# Android makefile for audio kernel modules -MY_LOCAL_PATH := $(call my-dir) - -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) $(TRINKET)),true) -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/include - -$(shell mkdir -p $(UAPI_OUT)/linux;) -$(shell mkdir -p $(UAPI_OUT)/sound;) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/codecs/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd934x/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/tfa98xx/Module.symvers) - -include $(MY_LOCAL_PATH)/include/uapi/Android.mk -include $(MY_LOCAL_PATH)/ipc/Android.mk -include $(MY_LOCAL_PATH)/dsp/Android.mk -include $(MY_LOCAL_PATH)/dsp/codecs/Android.mk -include $(MY_LOCAL_PATH)/soc/Android.mk -include $(MY_LOCAL_PATH)/asoc/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/wcd934x/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/cs35l41/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/tas2557/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/tfa98xx/Android.mk -endif - -ifeq ($(call is-board-platform-in-list, atoll),true) -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/include - -$(shell mkdir -p $(UAPI_OUT)/linux;) -$(shell mkdir -p $(UAPI_OUT)/sound;) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/ipc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/codecs/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/soc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/Module.symvers) - -include $(MY_LOCAL_PATH)/4.0/include/uapi/Android.mk -include $(MY_LOCAL_PATH)/4.0/ipc/Android.mk -include $(MY_LOCAL_PATH)/4.0/dsp/Android.mk -include $(MY_LOCAL_PATH)/4.0/dsp/codecs/Android.mk -include $(MY_LOCAL_PATH)/4.0/soc/Android.mk -include $(MY_LOCAL_PATH)/4.0/asoc/Android.mk -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/Android.mk -endif - -ifeq ($(call is-board-platform-in-list,sdm670 msmnile),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/aqt1000/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/aqt1000/Android.mk -endif - -ifeq ($(call is-board-platform-in-list, $(MSMSTEPPE) $(TRINKET)),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/bolero/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/bolero/Android.mk -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd937x/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/wcd937x/Android.mk -endif - -ifeq ($(call is-board-platform-in-list, atoll),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/bolero/Module.symvers) -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/bolero/Android.mk -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/wcd937x/Module.symvers) -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/wcd937x/Android.mk -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/wcd938x/Module.symvers) -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/wcd938x/Android.mk -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/sdm660_cdc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/msm_sdw/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/sdm660_cdc/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/msm_sdw/Android.mk -endif - -ifeq ($(call is-board-platform-in-list,msmnile),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd9360/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/wcd9360/Android.mk -endif diff --git a/asoc/Android.mk b/asoc/Android.mk deleted file mode 100644 index 3a495a5e3fa7..000000000000 --- a/asoc/Android.mk +++ /dev/null @@ -1,93 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -TARGET := sdm845 -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -TARGET := sdm660 -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -TARGET := sdm670 -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -TARGET := msmnile -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll),true) -TARGET := talos -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -TARGET := trinket -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=platform_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_platform.ko -LOCAL_MODULE_KBUILD_NAME := platform_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605 $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_cpe_lsm.ko -LOCAL_MODULE_KBUILD_NAME := cpe_lsm_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_machine_$(TARGET).ko -LOCAL_MODULE_KBUILD_NAME := machine_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/Android.mk b/asoc/codecs/Android.mk deleted file mode 100644 index d2b787ae412f..000000000000 --- a/asoc/codecs/Android.mk +++ /dev/null @@ -1,137 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd_core_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_core.ko -LOCAL_MODULE_KBUILD_NAME := wcd_core_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9xxx.ko -LOCAL_MODULE_KBUILD_NAME := wcd9xxx_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,sdm670 sdm660 qcs605 $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_cpe.ko -LOCAL_MODULE_KBUILD_NAME := wcd_cpe_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_spi.ko -LOCAL_MODULE_KBUILD_NAME := wcd_spi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605 $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9335.ko -LOCAL_MODULE_KBUILD_NAME := wcd9335_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa881x.ko -LOCAL_MODULE_KBUILD_NAME := wsa881x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_stub.ko -LOCAL_MODULE_KBUILD_NAME := stub_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_mbhc.ko -LOCAL_MODULE_KBUILD_NAME := mbhc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_hdmi.ko -LOCAL_MODULE_KBUILD_NAME := hdmi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/aqt1000/Android.mk b/asoc/codecs/aqt1000/Android.mk deleted file mode 100644 index ac26f6d52469..000000000000 --- a/asoc/codecs/aqt1000/Android.mk +++ /dev/null @@ -1,41 +0,0 @@ -# Android makefile for audio kernel modules - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,sdm670),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=aqt1000_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_aqt1000_cdc.ko -LOCAL_MODULE_KBUILD_NAME := aqt1000_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/bolero/Android.mk b/asoc/codecs/bolero/Android.mk deleted file mode 100644 index ab7224434aa4..000000000000 --- a/asoc/codecs/bolero/Android.mk +++ /dev/null @@ -1,82 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=bolero_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_bolero_cdc.ko -LOCAL_MODULE_KBUILD_NAME := bolero_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa_macro.ko -LOCAL_MODULE_KBUILD_NAME := wsa_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_va_macro.ko -LOCAL_MODULE_KBUILD_NAME := va_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_tx_macro.ko -LOCAL_MODULE_KBUILD_NAME := tx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_rx_macro.ko -LOCAL_MODULE_KBUILD_NAME := rx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/cs35l41/Android.mk b/asoc/codecs/cs35l41/Android.mk deleted file mode 100755 index 9b2b116f0487..000000000000 --- a/asoc/codecs/cs35l41/Android.mk +++ /dev/null @@ -1,55 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - #AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=cs35l41_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_cs35l41.ko -LOCAL_MODULE_KBUILD_NAME := cs35l41_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/ep92/Android.mk b/asoc/codecs/ep92/Android.mk deleted file mode 100644 index c2ac0599f7d8..000000000000 --- a/asoc/codecs/ep92/Android.mk +++ /dev/null @@ -1,50 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,qcs405),true) -AUDIO_SELECT := CONFIG_SND_SOC_QCS405=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,qcs405),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=ep92_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_ep92.ko -LOCAL_MODULE_KBUILD_NAME := ep92_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/msm_sdw/Android.mk b/asoc/codecs/msm_sdw/Android.mk deleted file mode 100644 index e073cccbb8da..000000000000 --- a/asoc/codecs/msm_sdw/Android.mk +++ /dev/null @@ -1,53 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=msm_sdw_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_msm_sdw.ko -LOCAL_MODULE_KBUILD_NAME := msm_sdw_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/sdm660_cdc/Android.mk b/asoc/codecs/sdm660_cdc/Android.mk deleted file mode 100644 index 17c4c4f80b26..000000000000 --- a/asoc/codecs/sdm660_cdc/Android.mk +++ /dev/null @@ -1,53 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm660 sdm670 qcs605),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=analog_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_analog_cdc.ko -LOCAL_MODULE_KBUILD_NAME := analog_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_digital_cdc.ko -LOCAL_MODULE_KBUILD_NAME := digital_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/tas2557/Android.mk b/asoc/codecs/tas2557/Android.mk deleted file mode 100755 index 279ede3ee009..000000000000 --- a/asoc/codecs/tas2557/Android.mk +++ /dev/null @@ -1,55 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - #AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=tas2557_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_tas2557.ko -LOCAL_MODULE_KBUILD_NAME := tas2557_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/wcd934x/Android.mk b/asoc/codecs/wcd934x/Android.mk deleted file mode 100644 index af4f17b04cd2..000000000000 --- a/asoc/codecs/wcd934x/Android.mk +++ /dev/null @@ -1,66 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd934x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd934x.ko -LOCAL_MODULE_KBUILD_NAME := wcd934x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/wcd9360/Android.mk b/asoc/codecs/wcd9360/Android.mk deleted file mode 100644 index 492061265f26..000000000000 --- a/asoc/codecs/wcd9360/Android.mk +++ /dev/null @@ -1,50 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd9360_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9360.ko -LOCAL_MODULE_KBUILD_NAME := wcd9360_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/asoc/codecs/wcd937x/Android.mk b/asoc/codecs/wcd937x/Android.mk deleted file mode 100644 index dec151ad0438..000000000000 --- a/asoc/codecs/wcd937x/Android.mk +++ /dev/null @@ -1,57 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd937x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x_slave.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_slave_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/dsp/Android.mk b/dsp/Android.mk deleted file mode 100644 index 54a355aab636..000000000000 --- a/dsp/Android.mk +++ /dev/null @@ -1,98 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=q6_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6.ko -LOCAL_MODULE_KBUILD_NAME := q6_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_usf.ko -LOCAL_MODULE_KBUILD_NAME := usf_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_adsp_loader.ko -LOCAL_MODULE_KBUILD_NAME := adsp_loader_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_notifier.ko -LOCAL_MODULE_KBUILD_NAME := q6_notifier_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_pdr.ko -LOCAL_MODULE_KBUILD_NAME := q6_pdr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/dsp/codecs/Android.mk b/dsp/codecs/Android.mk deleted file mode 100644 index 5adda956426f..000000000000 --- a/dsp/codecs/Android.mk +++ /dev/null @@ -1,66 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) atoll $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=native_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_native.ko -LOCAL_MODULE_KBUILD_NAME := native_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/include/uapi/Android.mk b/include/uapi/Android.mk deleted file mode 100644 index b8c209adaa0e..000000000000 --- a/include/uapi/Android.mk +++ /dev/null @@ -1,29 +0,0 @@ -# Use this by setting -# LOCAL_HEADER_LIBRARIES := audio_kernel_headers - -LOCAL_PATH := $(call my-dir) -MYLOCAL_PATH := $(LOCAL_PATH) - -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/include - -AUDIO_KERNEL_HEADERS := $(call all-named-files-under,*.h,linux) $(call all-named-files-under,*.h,sound) - -HEADER_INSTALL_DIR := kernel/msm-$(TARGET_KERNEL_VERSION)/scripts - -BUILD_ROOT_RELATIVE := ../../../../../../../ - -include $(CLEAR_VARS) -LOCAL_MODULE := audio_kernel_headers -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_PREBUILT_INT_KERNEL) - -GEN := $(addprefix $(UAPI_OUT)/,$(AUDIO_KERNEL_HEADERS)) -$(GEN): $(KERNEL_USR) -$(GEN): PRIVATE_PATH := $(MYLOCAL_PATH) -$(GEN): PRIVATE_CUSTOM_TOOL = $(shell cd $(PRODUCT_OUT)/obj/KERNEL_OBJ; $(BUILD_ROOT_RELATIVE)$(HEADER_INSTALL_DIR)/headers_install.sh $(BUILD_ROOT_RELATIVE)$(dir $@) $(BUILD_ROOT_RELATIVE)$(subst $(UAPI_OUT),$(MYLOCAL_PATH),$(dir $@)) $(notdir $@)) -$(GEN): $(addprefix $(MYLOCAL_PATH)/,$(AUDIO_KERNEL_HEADERS)) - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES := $(GEN) -LOCAL_EXPORT_C_INCLUDE_DIRS := $(UAPI_OUT) - -include $(BUILD_HEADER_LIBRARY) diff --git a/ipc/Android.mk b/ipc/Android.mk deleted file mode 100644 index af0fbef6eb3f..000000000000 --- a/ipc/Android.mk +++ /dev/null @@ -1,73 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) atoll $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=apr_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_apr.ko -LOCAL_MODULE_KBUILD_NAME := apr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wglink.ko -LOCAL_MODULE_KBUILD_NAME := wglink_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/soc/Android.mk b/soc/Android.mk deleted file mode 100644 index 5e4beb3d3192..000000000000 --- a/soc/Android.mk +++ /dev/null @@ -1,101 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) $(TRINKET) atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=soc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605 $(MSMSTEPPE) atoll),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_lpi.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_lpi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_wcd.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_wcd_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr.ko -LOCAL_MODULE_KBUILD_NAME := swr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr_ctrl.ko -LOCAL_MODULE_KBUILD_NAME := swr_ctrl_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, $(MSMSTEPPE) atoll $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_snd_event.ko -LOCAL_MODULE_KBUILD_NAME := snd_event_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### - -endif # DLKM check -endif # supported target check From 3aab74e8d13c483f32f0a15811699fe8f37a8cae Mon Sep 17 00:00:00 2001 From: UtsavBalar1231 Date: Thu, 27 Aug 2020 10:56:37 +0530 Subject: [PATCH 127/127] techpack: Remove audio-kernel subtree from source Signed-off-by: UtsavBalar1231 --- techpack/audio/4.0/asoc/Android.mk | 97 - techpack/audio/4.0/asoc/Kbuild | 250 - techpack/audio/4.0/asoc/codecs/Android.mk | 145 - techpack/audio/4.0/asoc/codecs/Kbuild | 254 - .../audio/4.0/asoc/codecs/audio-ext-clk-up.c | 629 - .../audio/4.0/asoc/codecs/audio-ext-clk-up.h | 12 - .../audio/4.0/asoc/codecs/audio-ext-clk.c | 341 - .../audio/4.0/asoc/codecs/bolero/Android.mk | 94 - techpack/audio/4.0/asoc/codecs/bolero/Kbuild | 168 - .../asoc/codecs/bolero/bolero-cdc-registers.h | 838 - .../asoc/codecs/bolero/bolero-cdc-regmap.c | 871 - .../asoc/codecs/bolero/bolero-cdc-tables.c | 978 - .../4.0/asoc/codecs/bolero/bolero-cdc-utils.c | 172 - .../audio/4.0/asoc/codecs/bolero/bolero-cdc.c | 1514 - .../audio/4.0/asoc/codecs/bolero/bolero-cdc.h | 221 - .../4.0/asoc/codecs/bolero/bolero-clk-rsc.c | 768 - .../4.0/asoc/codecs/bolero/bolero-clk-rsc.h | 52 - .../audio/4.0/asoc/codecs/bolero/internal.h | 107 - .../audio/4.0/asoc/codecs/bolero/rx-macro.c | 4074 -- .../audio/4.0/asoc/codecs/bolero/tx-macro.c | 3267 -- .../audio/4.0/asoc/codecs/bolero/va-macro.c | 3389 -- .../audio/4.0/asoc/codecs/bolero/wsa-macro.c | 3199 -- .../audio/4.0/asoc/codecs/bolero/wsa-macro.h | 38 - techpack/audio/4.0/asoc/codecs/cpe_cmi.h | 484 - techpack/audio/4.0/asoc/codecs/cpe_err.h | 158 - .../audio/4.0/asoc/codecs/msm-cdc-pinctrl.c | 334 - .../audio/4.0/asoc/codecs/msm-cdc-supply.c | 566 - .../audio/4.0/asoc/codecs/msm_hdmi_codec_rx.c | 848 - techpack/audio/4.0/asoc/codecs/msm_stub.c | 81 - techpack/audio/4.0/asoc/codecs/wcd-clsh.c | 588 - techpack/audio/4.0/asoc/codecs/wcd-dsp-mgr.c | 1327 - .../audio/4.0/asoc/codecs/wcd-dsp-utils.c | 224 - .../audio/4.0/asoc/codecs/wcd-dsp-utils.h | 43 - techpack/audio/4.0/asoc/codecs/wcd-irq.c | 183 - techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c | 1141 - techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.h | 27 - .../audio/4.0/asoc/codecs/wcd-mbhc-legacy.c | 1029 - .../audio/4.0/asoc/codecs/wcd-mbhc-legacy.h | 18 - techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c | 2031 - .../audio/4.0/asoc/codecs/wcd-spi-registers.h | 35 - techpack/audio/4.0/asoc/codecs/wcd-spi.c | 1674 - .../audio/4.0/asoc/codecs/wcd9335_registers.h | 1340 - .../audio/4.0/asoc/codecs/wcd937x/Android.mk | 61 - techpack/audio/4.0/asoc/codecs/wcd937x/Kbuild | 132 - .../audio/4.0/asoc/codecs/wcd937x/internal.h | 178 - .../4.0/asoc/codecs/wcd937x/wcd937x-mbhc.c | 1130 - .../4.0/asoc/codecs/wcd937x/wcd937x-mbhc.h | 66 - .../asoc/codecs/wcd937x/wcd937x-registers.h | 438 - .../4.0/asoc/codecs/wcd937x/wcd937x-regmap.c | 464 - .../4.0/asoc/codecs/wcd937x/wcd937x-tables.c | 422 - .../audio/4.0/asoc/codecs/wcd937x/wcd937x.c | 3037 -- .../audio/4.0/asoc/codecs/wcd937x/wcd937x.h | 19 - .../4.0/asoc/codecs/wcd937x/wcd937x_slave.c | 144 - .../audio/4.0/asoc/codecs/wcd938x/Android.mk | 69 - techpack/audio/4.0/asoc/codecs/wcd938x/Kbuild | 135 - .../audio/4.0/asoc/codecs/wcd938x/internal.h | 195 - .../4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c | 1145 - .../4.0/asoc/codecs/wcd938x/wcd938x-mbhc.h | 69 - .../asoc/codecs/wcd938x/wcd938x-registers.h | 502 - .../4.0/asoc/codecs/wcd938x/wcd938x-regmap.c | 515 - .../4.0/asoc/codecs/wcd938x/wcd938x-slave.c | 417 - .../4.0/asoc/codecs/wcd938x/wcd938x-tables.c | 474 - .../audio/4.0/asoc/codecs/wcd938x/wcd938x.c | 3897 -- .../audio/4.0/asoc/codecs/wcd938x/wcd938x.h | 30 - .../audio/4.0/asoc/codecs/wcd9xxx-common-v2.c | 1359 - .../audio/4.0/asoc/codecs/wcd9xxx-core-init.c | 47 - techpack/audio/4.0/asoc/codecs/wcd9xxx-core.c | 1807 - techpack/audio/4.0/asoc/codecs/wcd9xxx-irq.c | 894 - .../audio/4.0/asoc/codecs/wcd9xxx-resmgr-v2.c | 686 - techpack/audio/4.0/asoc/codecs/wcd9xxx-rst.c | 435 - .../audio/4.0/asoc/codecs/wcd9xxx-slimslave.c | 576 - .../audio/4.0/asoc/codecs/wcd9xxx-soc-init.c | 37 - .../audio/4.0/asoc/codecs/wcd9xxx-utils.c | 1224 - .../audio/4.0/asoc/codecs/wcd9xxx-utils.h | 32 - techpack/audio/4.0/asoc/codecs/wcd_cmi_api.h | 35 - techpack/audio/4.0/asoc/codecs/wcd_cpe_core.c | 4591 --- techpack/audio/4.0/asoc/codecs/wcd_cpe_core.h | 235 - .../audio/4.0/asoc/codecs/wcd_cpe_services.c | 2719 -- .../audio/4.0/asoc/codecs/wcd_cpe_services.h | 171 - techpack/audio/4.0/asoc/codecs/wcdcal-hwdep.c | 215 - .../audio/4.0/asoc/codecs/wsa881x-registers.h | 170 - .../audio/4.0/asoc/codecs/wsa881x-regmap.c | 258 - .../audio/4.0/asoc/codecs/wsa881x-tables.c | 163 - .../4.0/asoc/codecs/wsa881x-temp-sensor.c | 187 - .../4.0/asoc/codecs/wsa881x-temp-sensor.h | 35 - techpack/audio/4.0/asoc/codecs/wsa881x.c | 1643 - techpack/audio/4.0/asoc/codecs/wsa881x.h | 48 - techpack/audio/4.0/asoc/device_event.h | 12 - techpack/audio/4.0/asoc/kona-port-config.h | 76 - techpack/audio/4.0/asoc/kona.c | 8314 ----- .../audio/4.0/asoc/msm-audio-effects-q6-v2.c | 1482 - techpack/audio/4.0/asoc/msm-compress-q6-v2.c | 5416 --- techpack/audio/4.0/asoc/msm-cpe-lsm.c | 3348 -- techpack/audio/4.0/asoc/msm-dai-fe.c | 2901 -- techpack/audio/4.0/asoc/msm-dai-q6-hdmi-v2.c | 692 - techpack/audio/4.0/asoc/msm-dai-q6-v2.c | 13157 ------- techpack/audio/4.0/asoc/msm-dai-q6-v2.h | 104 - techpack/audio/4.0/asoc/msm-dai-slim.c | 655 - techpack/audio/4.0/asoc/msm-dai-stub-v2.c | 386 - techpack/audio/4.0/asoc/msm-dolby-common.h | 259 - .../audio/4.0/asoc/msm-dolby-dap-config.h | 78 - techpack/audio/4.0/asoc/msm-ds2-dap-config.c | 2196 -- techpack/audio/4.0/asoc/msm-ds2-dap-config.h | 143 - techpack/audio/4.0/asoc/msm-lsm-client.c | 3207 -- techpack/audio/4.0/asoc/msm-pcm-afe-v2.c | 917 - techpack/audio/4.0/asoc/msm-pcm-afe-v2.h | 41 - techpack/audio/4.0/asoc/msm-pcm-dtmf-v2.c | 589 - .../audio/4.0/asoc/msm-pcm-host-voice-v2.c | 1526 - techpack/audio/4.0/asoc/msm-pcm-hostless.c | 73 - techpack/audio/4.0/asoc/msm-pcm-loopback-v2.c | 1492 - techpack/audio/4.0/asoc/msm-pcm-q6-noirq.c | 1418 - techpack/audio/4.0/asoc/msm-pcm-q6-v2.c | 2817 -- techpack/audio/4.0/asoc/msm-pcm-q6-v2.h | 127 - .../audio/4.0/asoc/msm-pcm-routing-devdep.c | 131 - .../audio/4.0/asoc/msm-pcm-routing-devdep.h | 27 - techpack/audio/4.0/asoc/msm-pcm-routing-v2.c | 31021 ---------------- techpack/audio/4.0/asoc/msm-pcm-routing-v2.h | 652 - techpack/audio/4.0/asoc/msm-pcm-voice-v2.c | 853 - techpack/audio/4.0/asoc/msm-pcm-voice-v2.h | 34 - techpack/audio/4.0/asoc/msm-pcm-voip-v2.c | 1701 - techpack/audio/4.0/asoc/msm-qti-pp-config.c | 1717 - techpack/audio/4.0/asoc/msm-qti-pp-config.h | 94 - techpack/audio/4.0/asoc/msm-slim-dma.h | 36 - .../4.0/asoc/msm-transcode-loopback-q6-v2.c | 1645 - techpack/audio/4.0/asoc/platform_init.c | 60 - techpack/audio/4.0/asoc/platform_init.h | 59 - techpack/audio/4.0/asoc/sm6150.c | 9260 ----- techpack/audio/4.0/config/atollauto.conf | 42 - techpack/audio/4.0/config/atollautoconf.h | 46 - techpack/audio/4.0/config/gvmauto.conf | 15 - techpack/audio/4.0/config/gvmautoconf.h | 27 - techpack/audio/4.0/config/konaauto.conf | 38 - techpack/audio/4.0/config/konaautoconf.h | 42 - techpack/audio/4.0/config/litoauto.conf | 36 - techpack/audio/4.0/config/litoautoconf.h | 40 - techpack/audio/4.0/config/qcs405auto.conf | 39 - techpack/audio/4.0/config/qcs405autoconf.h | 43 - techpack/audio/4.0/config/sa8155auto.conf | 15 - techpack/audio/4.0/config/sa8155autoconf.h | 19 - .../audio/4.0/config/sdxpoorwillsauto.conf | 29 - .../audio/4.0/config/sdxpoorwillsautoconf.h | 34 - techpack/audio/4.0/config/sm6150auto.conf | 50 - techpack/audio/4.0/config/sm6150autoconf.h | 55 - techpack/audio/4.0/config/sm8150auto.conf | 40 - techpack/audio/4.0/config/sm8150autoconf.h | 44 - techpack/audio/4.0/dsp/Android.mk | 104 - techpack/audio/4.0/dsp/Kbuild | 255 - techpack/audio/4.0/dsp/adsp-loader.c | 459 - techpack/audio/4.0/dsp/adsp_err.c | 165 - techpack/audio/4.0/dsp/adsp_err.h | 13 - techpack/audio/4.0/dsp/audio_cal_utils.c | 1070 - techpack/audio/4.0/dsp/audio_calibration.c | 627 - techpack/audio/4.0/dsp/audio_notifier.c | 636 - techpack/audio/4.0/dsp/audio_pdr.c | 175 - techpack/audio/4.0/dsp/audio_pdr.h | 98 - techpack/audio/4.0/dsp/audio_slimslave.c | 168 - techpack/audio/4.0/dsp/audio_ssr.c | 52 - techpack/audio/4.0/dsp/audio_ssr.h | 70 - techpack/audio/4.0/dsp/avtimer.c | 640 - techpack/audio/4.0/dsp/codecs/Android.mk | 66 - techpack/audio/4.0/dsp/codecs/Kbuild | 167 - techpack/audio/4.0/dsp/codecs/aac_in.c | 704 - techpack/audio/4.0/dsp/codecs/amrnb_in.c | 397 - techpack/audio/4.0/dsp/codecs/amrwb_in.c | 395 - techpack/audio/4.0/dsp/codecs/audio_aac.c | 480 - techpack/audio/4.0/dsp/codecs/audio_alac.c | 433 - techpack/audio/4.0/dsp/codecs/audio_amrnb.c | 230 - techpack/audio/4.0/dsp/codecs/audio_amrwb.c | 226 - .../audio/4.0/dsp/codecs/audio_amrwbplus.c | 401 - techpack/audio/4.0/dsp/codecs/audio_ape.c | 358 - techpack/audio/4.0/dsp/codecs/audio_evrc.c | 188 - .../audio/4.0/dsp/codecs/audio_g711alaw.c | 389 - .../audio/4.0/dsp/codecs/audio_g711mlaw.c | 389 - .../4.0/dsp/codecs/audio_hwacc_effects.c | 773 - techpack/audio/4.0/dsp/codecs/audio_mp3.c | 192 - .../audio/4.0/dsp/codecs/audio_multi_aac.c | 534 - techpack/audio/4.0/dsp/codecs/audio_native.c | 69 - techpack/audio/4.0/dsp/codecs/audio_qcelp.c | 195 - techpack/audio/4.0/dsp/codecs/audio_utils.c | 953 - techpack/audio/4.0/dsp/codecs/audio_utils.h | 149 - .../audio/4.0/dsp/codecs/audio_utils_aio.c | 2152 -- .../audio/4.0/dsp/codecs/audio_utils_aio.h | 220 - techpack/audio/4.0/dsp/codecs/audio_wma.c | 349 - techpack/audio/4.0/dsp/codecs/audio_wmapro.c | 422 - techpack/audio/4.0/dsp/codecs/evrc_in.c | 404 - techpack/audio/4.0/dsp/codecs/g711alaw_in.c | 376 - techpack/audio/4.0/dsp/codecs/g711mlaw_in.c | 379 - .../audio/4.0/dsp/codecs/q6audio_common.h | 28 - techpack/audio/4.0/dsp/codecs/q6audio_v2.c | 105 - .../audio/4.0/dsp/codecs/q6audio_v2_aio.c | 230 - techpack/audio/4.0/dsp/codecs/qcelp_in.c | 404 - techpack/audio/4.0/dsp/digital-cdc-rsc-mgr.c | 100 - .../audio/4.0/dsp/msm-audio-event-notify.c | 74 - .../audio/4.0/dsp/msm-dts-srs-tm-config.c | 374 - techpack/audio/4.0/dsp/msm_audio_ion.c | 872 - techpack/audio/4.0/dsp/msm_audio_ion_vm.c | 961 - techpack/audio/4.0/dsp/msm_mdf.c | 724 - techpack/audio/4.0/dsp/q6_init.c | 54 - techpack/audio/4.0/dsp/q6_init.h | 98 - techpack/audio/4.0/dsp/q6adm.c | 5498 --- techpack/audio/4.0/dsp/q6afe.c | 9449 ----- techpack/audio/4.0/dsp/q6afecal-hwdep.c | 226 - techpack/audio/4.0/dsp/q6afecal-hwdep.h | 45 - techpack/audio/4.0/dsp/q6asm.c | 11331 ------ techpack/audio/4.0/dsp/q6audio-v2.c | 1220 - techpack/audio/4.0/dsp/q6common.c | 177 - techpack/audio/4.0/dsp/q6core.c | 1948 - techpack/audio/4.0/dsp/q6lsm.c | 2804 -- techpack/audio/4.0/dsp/q6usm.c | 1475 - techpack/audio/4.0/dsp/q6usm.h | 119 - techpack/audio/4.0/dsp/q6voice.c | 10175 ----- techpack/audio/4.0/dsp/rtac.c | 2084 -- techpack/audio/4.0/dsp/sp_params.c | 425 - techpack/audio/4.0/dsp/usf.c | 2466 -- techpack/audio/4.0/dsp/usf.h | 290 - techpack/audio/4.0/dsp/usfcdev.c | 405 - techpack/audio/4.0/dsp/usfcdev.h | 20 - techpack/audio/4.0/dsp/voice_mhi.c | 622 - techpack/audio/4.0/include/Kbuild | 2 - techpack/audio/4.0/include/asoc/core.h | 553 - techpack/audio/4.0/include/asoc/cpe_core.h | 188 - .../audio/4.0/include/asoc/msm-cdc-pinctrl.h | 52 - .../audio/4.0/include/asoc/msm-cdc-supply.h | 53 - techpack/audio/4.0/include/asoc/pdata.h | 199 - techpack/audio/4.0/include/asoc/wcd-clsh.h | 105 - techpack/audio/4.0/include/asoc/wcd-irq.h | 57 - .../audio/4.0/include/asoc/wcd-mbhc-v2-api.h | 52 - techpack/audio/4.0/include/asoc/wcd-mbhc-v2.h | 612 - .../4.0/include/asoc/wcd934x_registers.h | 1840 - .../4.0/include/asoc/wcd9xxx-common-v2.h | 228 - techpack/audio/4.0/include/asoc/wcd9xxx-irq.h | 82 - .../audio/4.0/include/asoc/wcd9xxx-regmap.h | 60 - .../4.0/include/asoc/wcd9xxx-resmgr-v2.h | 85 - .../4.0/include/asoc/wcd9xxx-slimslave.h | 111 - .../4.0/include/asoc/wcd9xxx_registers.h | 23 - .../audio/4.0/include/asoc/wcdcal-hwdep.h | 32 - techpack/audio/4.0/include/dsp/apr_audio-v2.h | 12771 ------- .../audio/4.0/include/dsp/audio_cal_utils.h | 98 - .../audio/4.0/include/dsp/audio_calibration.h | 33 - .../audio/4.0/include/dsp/audio_notifier.h | 97 - .../4.0/include/dsp/digital-cdc-rsc-mgr.h | 32 - .../4.0/include/dsp/msm-audio-effects-q6-v2.h | 47 - .../4.0/include/dsp/msm-audio-event-notify.h | 61 - .../4.0/include/dsp/msm-dts-srs-tm-config.h | 34 - .../audio/4.0/include/dsp/msm_audio_ion.h | 33 - techpack/audio/4.0/include/dsp/msm_mdf.h | 36 - techpack/audio/4.0/include/dsp/q6adm-v2.h | 230 - techpack/audio/4.0/include/dsp/q6afe-v2.h | 538 - techpack/audio/4.0/include/dsp/q6asm-v2.h | 756 - techpack/audio/4.0/include/dsp/q6audio-v2.h | 29 - techpack/audio/4.0/include/dsp/q6common.h | 18 - techpack/audio/4.0/include/dsp/q6core.h | 310 - techpack/audio/4.0/include/dsp/q6lsm.h | 304 - techpack/audio/4.0/include/dsp/q6voice.h | 2149 -- techpack/audio/4.0/include/dsp/rtac.h | 90 - techpack/audio/4.0/include/dsp/sp_params.h | 19 - techpack/audio/4.0/include/dsp/voice_mhi.h | 24 - techpack/audio/4.0/include/ipc/apr.h | 189 - techpack/audio/4.0/include/ipc/apr_tal.h | 85 - techpack/audio/4.0/include/ipc/apr_us.h | 185 - techpack/audio/4.0/include/ipc/aprv2_vm.h | 108 - techpack/audio/4.0/include/soc/internal.h | 287 - techpack/audio/4.0/include/soc/snd_event.h | 79 - techpack/audio/4.0/include/soc/soundwire.h | 350 - techpack/audio/4.0/include/soc/swr-common.h | 45 - techpack/audio/4.0/include/soc/swr-wcd.h | 48 - techpack/audio/4.0/include/soc/wcd-spi-ac.h | 36 - techpack/audio/4.0/include/uapi/Android.mk | 30 - techpack/audio/4.0/include/uapi/Kbuild | 6 - techpack/audio/4.0/include/uapi/linux/Kbuild | 21 - .../audio/4.0/include/uapi/linux/avtimer.h | 10 - .../audio/4.0/include/uapi/linux/mfd/Kbuild | 1 - .../4.0/include/uapi/linux/mfd/wcd9xxx/Kbuild | 2 - .../linux/mfd/wcd9xxx/wcd9320_registers.h | 1399 - .../linux/mfd/wcd9xxx/wcd9xxx_registers.h | 361 - .../audio/4.0/include/uapi/linux/msm_audio.h | 466 - .../4.0/include/uapi/linux/msm_audio_aac.h | 76 - .../4.0/include/uapi/linux/msm_audio_ac3.h | 41 - .../4.0/include/uapi/linux/msm_audio_alac.h | 24 - .../4.0/include/uapi/linux/msm_audio_amrnb.h | 34 - .../4.0/include/uapi/linux/msm_audio_amrwb.h | 18 - .../include/uapi/linux/msm_audio_amrwbplus.h | 18 - .../4.0/include/uapi/linux/msm_audio_ape.h | 26 - .../uapi/linux/msm_audio_calibration.h | 808 - .../4.0/include/uapi/linux/msm_audio_g711.h | 17 - .../include/uapi/linux/msm_audio_g711_dec.h | 16 - .../4.0/include/uapi/linux/msm_audio_mvs.h | 155 - .../4.0/include/uapi/linux/msm_audio_qcp.h | 37 - .../4.0/include/uapi/linux/msm_audio_sbc.h | 36 - .../include/uapi/linux/msm_audio_voicememo.h | 66 - .../4.0/include/uapi/linux/msm_audio_wma.h | 33 - .../4.0/include/uapi/linux/msm_audio_wmapro.h | 22 - .../include/uapi/linux/wcd-spi-ac-params.h | 52 - techpack/audio/4.0/include/uapi/sound/Kbuild | 8 - .../4.0/include/uapi/sound/audio_effects.h | 365 - .../4.0/include/uapi/sound/audio_slimslave.h | 18 - .../4.0/include/uapi/sound/devdep_params.h | 74 - .../audio/4.0/include/uapi/sound/lsm_params.h | 315 - .../4.0/include/uapi/sound/msmcal-hwdep.h | 40 - .../4.0/include/uapi/sound/voice_params.h | 14 - .../4.0/include/uapi/sound/wcd-dsp-glink.h | 60 - techpack/audio/4.0/ipc/Android.mk | 81 - techpack/audio/4.0/ipc/Kbuild | 184 - techpack/audio/4.0/ipc/apr.c | 1248 - techpack/audio/4.0/ipc/apr_tal_rpmsg.c | 317 - techpack/audio/4.0/ipc/apr_v2.c | 74 - techpack/audio/4.0/ipc/apr_v3.c | 72 - techpack/audio/4.0/ipc/apr_vm.c | 1479 - techpack/audio/4.0/ipc/wcd-dsp-glink.c | 775 - techpack/audio/4.0/soc/Android.mk | 103 - techpack/audio/4.0/soc/Kbuild | 185 - techpack/audio/4.0/soc/core.h | 260 - techpack/audio/4.0/soc/pinctrl-lpi.c | 956 - techpack/audio/4.0/soc/pinctrl-utils.h | 43 - techpack/audio/4.0/soc/pinctrl-wcd.c | 428 - techpack/audio/4.0/soc/regmap-swr.c | 208 - techpack/audio/4.0/soc/snd_event.c | 494 - techpack/audio/4.0/soc/soundwire.c | 1123 - techpack/audio/4.0/soc/swr-mstr-ctrl.c | 3735 -- techpack/audio/4.0/soc/swr-mstr-ctrl.h | 192 - techpack/audio/4.0/soc/swr-wcd-ctrl.c | 1956 - techpack/audio/4.0/soc/swr-wcd-ctrl.h | 109 - techpack/audio/4.0/soc/swrm_registers.h | 249 - techpack/audio/4.0/soc/wcd-spi-ac.c | 991 - techpack/audio/4.0/soc/wcd_spi_ctl_v01.c | 129 - techpack/audio/4.0/soc/wcd_spi_ctl_v01.h | 62 - techpack/audio/Android.mk | 83 - techpack/audio/Makefile | 78 - techpack/audio/Makefile.am | 79 - techpack/audio/NOTICE | 24 - techpack/audio/asoc/Android.mk | 93 - techpack/audio/asoc/Kbuild | 259 - techpack/audio/asoc/codecs/Android.mk | 137 - techpack/audio/asoc/codecs/Kbuild | 252 - techpack/audio/asoc/codecs/Kbuild.bk | 214 - techpack/audio/asoc/codecs/aqt1000/Android.mk | 41 - techpack/audio/asoc/codecs/aqt1000/Kbuild | 123 - .../audio/asoc/codecs/aqt1000/aqt1000-api.h | 28 - .../audio/asoc/codecs/aqt1000/aqt1000-clsh.c | 805 - .../audio/asoc/codecs/aqt1000/aqt1000-clsh.h | 115 - .../audio/asoc/codecs/aqt1000/aqt1000-core.c | 646 - .../asoc/codecs/aqt1000/aqt1000-internal.h | 170 - .../audio/asoc/codecs/aqt1000/aqt1000-irq.c | 289 - .../audio/asoc/codecs/aqt1000/aqt1000-irq.h | 46 - .../audio/asoc/codecs/aqt1000/aqt1000-mbhc.c | 1058 - .../audio/asoc/codecs/aqt1000/aqt1000-mbhc.h | 71 - .../codecs/aqt1000/aqt1000-reg-defaults.h | 1616 - .../asoc/codecs/aqt1000/aqt1000-registers.h | 881 - .../asoc/codecs/aqt1000/aqt1000-regmap.c | 110 - .../asoc/codecs/aqt1000/aqt1000-routing.h | 174 - .../audio/asoc/codecs/aqt1000/aqt1000-utils.c | 199 - .../audio/asoc/codecs/aqt1000/aqt1000-utils.h | 22 - techpack/audio/asoc/codecs/aqt1000/aqt1000.c | 3470 -- techpack/audio/asoc/codecs/aqt1000/aqt1000.h | 229 - techpack/audio/asoc/codecs/aqt1000/pdata.h | 40 - techpack/audio/asoc/codecs/audio-ext-clk-up.c | 624 - techpack/audio/asoc/codecs/audio-ext-clk-up.h | 20 - techpack/audio/asoc/codecs/audio-ext-clk.c | 348 - techpack/audio/asoc/codecs/bolero/Android.mk | 82 - techpack/audio/asoc/codecs/bolero/Kbuild | 147 - .../asoc/codecs/bolero/bolero-cdc-registers.h | 840 - .../asoc/codecs/bolero/bolero-cdc-regmap.c | 862 - .../asoc/codecs/bolero/bolero-cdc-tables.c | 768 - .../asoc/codecs/bolero/bolero-cdc-utils.c | 186 - .../audio/asoc/codecs/bolero/bolero-cdc.c | 1010 - .../audio/asoc/codecs/bolero/bolero-cdc.h | 127 - techpack/audio/asoc/codecs/bolero/internal.h | 96 - techpack/audio/asoc/codecs/bolero/rx-macro.c | 3747 -- techpack/audio/asoc/codecs/bolero/tx-macro.c | 1991 - techpack/audio/asoc/codecs/bolero/va-macro.c | 1669 - techpack/audio/asoc/codecs/bolero/wsa-macro.c | 3100 -- techpack/audio/asoc/codecs/bolero/wsa-macro.h | 46 - techpack/audio/asoc/codecs/core.h | 444 - techpack/audio/asoc/codecs/cpe_cmi.h | 492 - techpack/audio/asoc/codecs/cpe_core.h | 194 - techpack/audio/asoc/codecs/cpe_err.h | 166 - techpack/audio/asoc/codecs/cs35l41/Android.mk | 55 - techpack/audio/asoc/codecs/cs35l41/Kbuild | 116 - techpack/audio/asoc/codecs/cs35l41/Kconfig | 1066 - techpack/audio/asoc/codecs/cs35l41/Makefile | 433 - .../audio/asoc/codecs/cs35l41/cs35l41-i2c.c | 124 - .../audio/asoc/codecs/cs35l41/cs35l41-spi.c | 115 - .../asoc/codecs/cs35l41/cs35l41-tables.c | 946 - techpack/audio/asoc/codecs/cs35l41/cs35l41.c | 2081 -- techpack/audio/asoc/codecs/cs35l41/cs35l41.h | 765 - .../audio/asoc/codecs/cs35l41/cs35l41.txt | 184 - techpack/audio/asoc/codecs/cs35l41/wm_adsp.c | 5113 --- techpack/audio/asoc/codecs/cs35l41/wm_adsp.h | 196 - techpack/audio/asoc/codecs/cs35l41/wmfw.h | 202 - techpack/audio/asoc/codecs/csra66x0/Kbuild | 108 - .../audio/asoc/codecs/csra66x0/csra66x0.c | 1040 - .../audio/asoc/codecs/csra66x0/csra66x0.h | 230 - techpack/audio/asoc/codecs/ep92/Android.mk | 50 - techpack/audio/asoc/codecs/ep92/Kbuild | 109 - techpack/audio/asoc/codecs/ep92/ep92.c | 1618 - techpack/audio/asoc/codecs/ep92/ep92.h | 216 - techpack/audio/asoc/codecs/msm-cdc-pinctrl.c | 259 - techpack/audio/asoc/codecs/msm-cdc-pinctrl.h | 53 - techpack/audio/asoc/codecs/msm-cdc-supply.c | 548 - techpack/audio/asoc/codecs/msm-cdc-supply.h | 56 - .../audio/asoc/codecs/msm_hdmi_codec_rx.c | 768 - techpack/audio/asoc/codecs/msm_sdw/Android.mk | 53 - techpack/audio/asoc/codecs/msm_sdw/Kbuild | 123 - .../asoc/codecs/msm_sdw/msm-sdw-tables.c | 319 - techpack/audio/asoc/codecs/msm_sdw/msm_sdw.h | 203 - .../audio/asoc/codecs/msm_sdw/msm_sdw_cdc.c | 2097 -- .../asoc/codecs/msm_sdw/msm_sdw_cdc_utils.c | 211 - .../asoc/codecs/msm_sdw/msm_sdw_registers.h | 126 - .../asoc/codecs/msm_sdw/msm_sdw_regmap.c | 161 - techpack/audio/asoc/codecs/msm_stub.c | 88 - techpack/audio/asoc/codecs/pdata.h | 201 - .../audio/asoc/codecs/sdm660_cdc/Android.mk | 53 - techpack/audio/asoc/codecs/sdm660_cdc/Kbuild | 129 - .../codecs/sdm660_cdc/msm-analog-cdc-regmap.h | 186 - .../asoc/codecs/sdm660_cdc/msm-analog-cdc.c | 4667 --- .../asoc/codecs/sdm660_cdc/msm-analog-cdc.h | 273 - .../asoc/codecs/sdm660_cdc/msm-cdc-common.h | 67 - .../sdm660_cdc/msm-digital-cdc-regmap.c | 452 - .../asoc/codecs/sdm660_cdc/msm-digital-cdc.c | 2224 -- .../asoc/codecs/sdm660_cdc/msm-digital-cdc.h | 116 - .../asoc/codecs/sdm660_cdc/sdm660-cdc-irq.c | 418 - .../asoc/codecs/sdm660_cdc/sdm660-cdc-irq.h | 35 - .../codecs/sdm660_cdc/sdm660-cdc-registers.h | 603 - techpack/audio/asoc/codecs/spk-id.c | 215 - techpack/audio/asoc/codecs/spk-id.h | 33 - techpack/audio/asoc/codecs/tas2557/Android.mk | 55 - techpack/audio/asoc/codecs/tas2557/Kbuild | 117 - .../audio/asoc/codecs/tas2557/tas2557-codec.c | 668 - .../audio/asoc/codecs/tas2557/tas2557-codec.h | 31 - .../audio/asoc/codecs/tas2557/tas2557-core.c | 2137 -- .../audio/asoc/codecs/tas2557/tas2557-core.h | 82 - .../audio/asoc/codecs/tas2557/tas2557-misc.c | 603 - .../audio/asoc/codecs/tas2557/tas2557-misc.h | 58 - .../asoc/codecs/tas2557/tas2557-regmap.c | 936 - techpack/audio/asoc/codecs/tas2557/tas2557.h | 496 - techpack/audio/asoc/codecs/tas2557/tiload.c | 428 - techpack/audio/asoc/codecs/tas2557/tiload.h | 66 - techpack/audio/asoc/codecs/tfa98xx/.gitignore | 99 - techpack/audio/asoc/codecs/tfa98xx/Android.mk | 55 - techpack/audio/asoc/codecs/tfa98xx/Kbuild | 115 - .../audio/asoc/codecs/tfa98xx/inc/config.h | 37 - .../audio/asoc/codecs/tfa98xx/inc/dbgprint.h | 156 - .../audio/asoc/codecs/tfa98xx/inc/spk-id.h | 33 - techpack/audio/asoc/codecs/tfa98xx/inc/tfa.h | 50 - .../codecs/tfa98xx/inc/tfa1_tfafieldnames.h | 911 - .../tfa98xx/inc/tfa2_tfafieldnames_N1C.h | 1533 - .../tfa98xx/inc/tfa9872_device_genregs_POR.h | 131 - .../tfa98xx/inc/tfa9872_tfafieldnames.h | 1228 - .../tfa98xx/inc/tfa9873_tfafieldnames.h | 934 - .../tfa98xx/inc/tfa9873_tfafieldnames_B0.h | 933 - .../tfa98xx/inc/tfa9874_tfafieldnames.h | 843 - .../tfa98xx/inc/tfa9878_tfafieldnames.h | 980 - .../tfa98xx/inc/tfa9887_tfafieldnames.h | 72 - .../tfa98xx/inc/tfa9890_tfafieldnames.h | 87 - .../asoc/codecs/tfa98xx/inc/tfa9891_genregs.h | 1136 - .../tfa98xx/inc/tfa9891_tfafieldnames.h | 526 - .../tfa98xx/inc/tfa9894_tfafieldnames.h | 1079 - .../tfa98xx/inc/tfa9894_tfafieldnames_N2.h | 1130 - .../tfa98xx/inc/tfa9896_tfafieldnames.h | 930 - .../audio/asoc/codecs/tfa98xx/inc/tfa98xx.h | 190 - .../codecs/tfa98xx/inc/tfa98xx_genregs_N1C.h | 3866 -- .../codecs/tfa98xx/inc/tfa98xx_parameters.h | 736 - .../tfa98xx/inc/tfa98xx_tfafieldnames.h | 149 - .../tfa98xx/inc/tfa9912_device_genregs.h | 266 - .../tfa98xx/inc/tfa9912_tfafieldnames.h | 1776 - .../asoc/codecs/tfa98xx/inc/tfa_container.h | 359 - .../asoc/codecs/tfa98xx/inc/tfa_device.h | 296 - .../asoc/codecs/tfa98xx/inc/tfa_dsp_fw.h | 162 - .../audio/asoc/codecs/tfa98xx/inc/tfa_ext.h | 51 - .../asoc/codecs/tfa98xx/inc/tfa_internal.h | 40 - .../inc/tfa_platform_interface_definition.h | 100 - .../asoc/codecs/tfa98xx/inc/tfa_service.h | 1018 - .../audio/asoc/codecs/tfa98xx/inc/versions.h | 5 - .../audio/asoc/codecs/tfa98xx/src/tfa98xx.c | 4419 --- .../asoc/codecs/tfa98xx/src/tfa_container.c | 2374 -- .../audio/asoc/codecs/tfa98xx/src/tfa_dsp.c | 4265 --- .../audio/asoc/codecs/tfa98xx/src/tfa_init.c | 1933 - .../asoc/codecs/tfa98xx/src/tfa_internal.h | 33 - techpack/audio/asoc/codecs/wcd-clsh.c | 580 - techpack/audio/asoc/codecs/wcd-clsh.h | 104 - techpack/audio/asoc/codecs/wcd-dsp-mgr.c | 1395 - techpack/audio/asoc/codecs/wcd-dsp-utils.c | 232 - techpack/audio/asoc/codecs/wcd-dsp-utils.h | 51 - techpack/audio/asoc/codecs/wcd-irq.c | 191 - techpack/audio/asoc/codecs/wcd-mbhc-adc.c | 1131 - techpack/audio/asoc/codecs/wcd-mbhc-adc.h | 35 - techpack/audio/asoc/codecs/wcd-mbhc-legacy.c | 1037 - techpack/audio/asoc/codecs/wcd-mbhc-legacy.h | 26 - techpack/audio/asoc/codecs/wcd-mbhc-v2-api.h | 60 - techpack/audio/asoc/codecs/wcd-mbhc-v2.c | 2308 -- techpack/audio/asoc/codecs/wcd-mbhc-v2.h | 646 - .../audio/asoc/codecs/wcd-spi-registers.h | 43 - techpack/audio/asoc/codecs/wcd-spi.c | 1592 - techpack/audio/asoc/codecs/wcd9335-regmap.c | 1611 - techpack/audio/asoc/codecs/wcd9335-tables.c | 1325 - techpack/audio/asoc/codecs/wcd9335.c | 14393 ------- techpack/audio/asoc/codecs/wcd9335.h | 238 - techpack/audio/asoc/codecs/wcd9335_irq.h | 55 - .../audio/asoc/codecs/wcd9335_registers.h | 1348 - techpack/audio/asoc/codecs/wcd934x/Android.mk | 66 - techpack/audio/asoc/codecs/wcd934x/Kbuild | 144 - .../audio/asoc/codecs/wcd934x/wcd934x-dsd.c | 772 - .../audio/asoc/codecs/wcd934x/wcd934x-dsd.h | 97 - .../asoc/codecs/wcd934x/wcd934x-dsp-cntl.c | 1490 - .../asoc/codecs/wcd934x/wcd934x-dsp-cntl.h | 125 - .../audio/asoc/codecs/wcd934x/wcd934x-mbhc.c | 1184 - .../audio/asoc/codecs/wcd934x/wcd934x-mbhc.h | 97 - .../asoc/codecs/wcd934x/wcd934x-regmap.c | 1956 - .../asoc/codecs/wcd934x/wcd934x-routing.h | 1306 - .../asoc/codecs/wcd934x/wcd934x-tables.c | 2155 -- techpack/audio/asoc/codecs/wcd934x/wcd934x.c | 11370 ------ techpack/audio/asoc/codecs/wcd934x/wcd934x.h | 233 - .../audio/asoc/codecs/wcd934x/wcd934x_irq.h | 56 - techpack/audio/asoc/codecs/wcd9360/Android.mk | 50 - techpack/audio/asoc/codecs/wcd9360/Kbuild | 113 - .../asoc/codecs/wcd9360/wcd9360-defaults.h | 2231 -- .../asoc/codecs/wcd9360/wcd9360-dsp-cntl.c | 1357 - .../asoc/codecs/wcd9360/wcd9360-dsp-cntl.h | 120 - .../audio/asoc/codecs/wcd9360/wcd9360-irq.h | 56 - .../asoc/codecs/wcd9360/wcd9360-regmap.c | 110 - .../asoc/codecs/wcd9360/wcd9360-routing.h | 882 - techpack/audio/asoc/codecs/wcd9360/wcd9360.c | 8101 ---- techpack/audio/asoc/codecs/wcd9360/wcd9360.h | 180 - techpack/audio/asoc/codecs/wcd937x/Android.mk | 57 - techpack/audio/asoc/codecs/wcd937x/Kbuild | 121 - techpack/audio/asoc/codecs/wcd937x/internal.h | 185 - .../audio/asoc/codecs/wcd937x/wcd937x-mbhc.c | 1137 - .../audio/asoc/codecs/wcd937x/wcd937x-mbhc.h | 74 - .../asoc/codecs/wcd937x/wcd937x-registers.h | 446 - .../asoc/codecs/wcd937x/wcd937x-regmap.c | 472 - .../asoc/codecs/wcd937x/wcd937x-tables.c | 430 - techpack/audio/asoc/codecs/wcd937x/wcd937x.c | 2889 -- techpack/audio/asoc/codecs/wcd937x/wcd937x.h | 27 - .../audio/asoc/codecs/wcd937x/wcd937x_slave.c | 152 - .../audio/asoc/codecs/wcd9xxx-common-v2.c | 1369 - .../audio/asoc/codecs/wcd9xxx-common-v2.h | 236 - .../audio/asoc/codecs/wcd9xxx-core-init.c | 55 - techpack/audio/asoc/codecs/wcd9xxx-core.c | 1751 - techpack/audio/asoc/codecs/wcd9xxx-irq.c | 897 - techpack/audio/asoc/codecs/wcd9xxx-irq.h | 37 - techpack/audio/asoc/codecs/wcd9xxx-regmap.h | 73 - .../audio/asoc/codecs/wcd9xxx-resmgr-v2.c | 694 - .../audio/asoc/codecs/wcd9xxx-resmgr-v2.h | 93 - techpack/audio/asoc/codecs/wcd9xxx-rst.c | 602 - .../audio/asoc/codecs/wcd9xxx-slimslave.c | 608 - .../audio/asoc/codecs/wcd9xxx-slimslave.h | 122 - techpack/audio/asoc/codecs/wcd9xxx-soc-init.c | 45 - techpack/audio/asoc/codecs/wcd9xxx-utils.c | 1239 - techpack/audio/asoc/codecs/wcd9xxx-utils.h | 40 - techpack/audio/asoc/codecs/wcd_cmi_api.h | 43 - techpack/audio/asoc/codecs/wcd_cpe_core.c | 4598 --- techpack/audio/asoc/codecs/wcd_cpe_core.h | 243 - techpack/audio/asoc/codecs/wcd_cpe_services.c | 2727 -- techpack/audio/asoc/codecs/wcd_cpe_services.h | 179 - techpack/audio/asoc/codecs/wcdcal-hwdep.c | 226 - techpack/audio/asoc/codecs/wcdcal-hwdep.h | 40 - techpack/audio/asoc/codecs/wsa881x-analog.c | 1444 - techpack/audio/asoc/codecs/wsa881x-analog.h | 50 - .../asoc/codecs/wsa881x-registers-analog.h | 206 - .../audio/asoc/codecs/wsa881x-registers.h | 178 - .../audio/asoc/codecs/wsa881x-regmap-analog.c | 498 - techpack/audio/asoc/codecs/wsa881x-regmap.c | 266 - .../audio/asoc/codecs/wsa881x-tables-analog.c | 170 - techpack/audio/asoc/codecs/wsa881x-tables.c | 171 - .../audio/asoc/codecs/wsa881x-temp-sensor.c | 196 - .../audio/asoc/codecs/wsa881x-temp-sensor.h | 43 - techpack/audio/asoc/codecs/wsa881x.c | 1649 - techpack/audio/asoc/codecs/wsa881x.h | 56 - techpack/audio/asoc/device_event.h | 20 - techpack/audio/asoc/machine_815x_init.c | 40 - techpack/audio/asoc/machine_815x_init.h | 23 - techpack/audio/asoc/msm-audio-effects-q6-v2.c | 1424 - techpack/audio/asoc/msm-compress-q6-v2.c | 4723 --- techpack/audio/asoc/msm-cpe-lsm.c | 3356 -- techpack/audio/asoc/msm-dai-fe.c | 2832 -- techpack/audio/asoc/msm-dai-q6-hdmi-v2.c | 612 - techpack/audio/asoc/msm-dai-q6-v2.c | 11415 ------ techpack/audio/asoc/msm-dai-q6-v2.h | 97 - techpack/audio/asoc/msm-dai-slim.c | 663 - techpack/audio/asoc/msm-dai-stub-v2.c | 392 - techpack/audio/asoc/msm-dolby-common.h | 266 - techpack/audio/asoc/msm-dolby-dap-config.h | 85 - techpack/audio/asoc/msm-ds2-dap-config.c | 2204 -- techpack/audio/asoc/msm-ds2-dap-config.h | 150 - techpack/audio/asoc/msm-lsm-client.c | 3033 -- techpack/audio/asoc/msm-pcm-afe-v2.c | 922 - techpack/audio/asoc/msm-pcm-afe-v2.h | 49 - techpack/audio/asoc/msm-pcm-dtmf-v2.c | 591 - techpack/audio/asoc/msm-pcm-host-voice-v2.c | 1533 - techpack/audio/asoc/msm-pcm-hostless.c | 80 - techpack/audio/asoc/msm-pcm-loopback-v2.c | 808 - techpack/audio/asoc/msm-pcm-q6-noirq.c | 1416 - techpack/audio/asoc/msm-pcm-q6-v2.c | 2259 -- techpack/audio/asoc/msm-pcm-q6-v2.h | 139 - techpack/audio/asoc/msm-pcm-routing-devdep.c | 139 - techpack/audio/asoc/msm-pcm-routing-devdep.h | 35 - techpack/audio/asoc/msm-pcm-routing-v2.c | 24246 ------------ techpack/audio/asoc/msm-pcm-routing-v2.h | 607 - techpack/audio/asoc/msm-pcm-voice-v2.c | 842 - techpack/audio/asoc/msm-pcm-voice-v2.h | 42 - techpack/audio/asoc/msm-pcm-voip-v2.c | 1708 - techpack/audio/asoc/msm-qti-pp-config.c | 1686 - techpack/audio/asoc/msm-qti-pp-config.h | 101 - techpack/audio/asoc/msm-slim-dma.h | 44 - .../audio/asoc/msm-transcode-loopback-q6-v2.c | 1555 - techpack/audio/asoc/msm8998.c | 7483 ---- techpack/audio/asoc/platform_init.c | 69 - techpack/audio/asoc/platform_init.h | 58 - techpack/audio/asoc/qcs405.c | 8645 ----- techpack/audio/asoc/sa8155.c | 7218 ---- techpack/audio/asoc/sdm660-common.c | 5589 --- techpack/audio/asoc/sdm660-common.h | 154 - techpack/audio/asoc/sdm660-ext-dai-links.c | 1999 - techpack/audio/asoc/sdm660-external.c | 1951 - techpack/audio/asoc/sdm660-external.h | 56 - techpack/audio/asoc/sdm660-internal.c | 3185 -- techpack/audio/asoc/sdm660-internal.h | 32 - techpack/audio/asoc/sdm845.c | 7124 ---- techpack/audio/asoc/sm6150.c | 9281 ----- techpack/audio/asoc/sm8150.c | 8332 ----- techpack/audio/config/qcs405auto.conf | 39 - techpack/audio/config/qcs405autoconf.h | 51 - techpack/audio/config/sdm660auto.conf | 51 - techpack/audio/config/sdm660autoconf.h | 64 - techpack/audio/config/sdm670auto.conf | 50 - techpack/audio/config/sdm670auto_static.conf | 50 - techpack/audio/config/sdm670autoconf.h | 63 - techpack/audio/config/sdm845auto.conf | 37 - techpack/audio/config/sdm845autoconf.h | 50 - techpack/audio/config/sdxpoorwillsauto.conf | 29 - techpack/audio/config/sdxpoorwillsautoconf.h | 42 - techpack/audio/config/sm6150auto.conf | 48 - techpack/audio/config/sm6150autoconf.h | 61 - techpack/audio/config/sm8150auto.conf | 48 - techpack/audio/config/sm8150autoconf.h | 61 - techpack/audio/config/trinketauto.conf | 52 - techpack/audio/config/trinketautoconf.h | 64 - techpack/audio/dsp/Android.mk | 98 - techpack/audio/dsp/Kbuild | 241 - techpack/audio/dsp/adsp-loader.c | 362 - techpack/audio/dsp/adsp_err.c | 173 - techpack/audio/dsp/adsp_err.h | 21 - techpack/audio/dsp/apr_elliptic.c | 452 - techpack/audio/dsp/apr_mius.c | 467 - techpack/audio/dsp/audio_cal_utils.c | 1078 - techpack/audio/dsp/audio_calibration.c | 635 - techpack/audio/dsp/audio_notifier.c | 643 - techpack/audio/dsp/audio_pdr.c | 182 - techpack/audio/dsp/audio_pdr.h | 106 - techpack/audio/dsp/audio_slimslave.c | 175 - techpack/audio/dsp/audio_ssr.c | 59 - techpack/audio/dsp/audio_ssr.h | 78 - techpack/audio/dsp/avtimer.c | 586 - techpack/audio/dsp/codecs/Android.mk | 66 - techpack/audio/dsp/codecs/Kbuild | 166 - techpack/audio/dsp/codecs/aac_in.c | 713 - techpack/audio/dsp/codecs/amrnb_in.c | 405 - techpack/audio/dsp/codecs/amrwb_in.c | 403 - techpack/audio/dsp/codecs/audio_aac.c | 480 - techpack/audio/dsp/codecs/audio_alac.c | 443 - techpack/audio/dsp/codecs/audio_amrnb.c | 230 - techpack/audio/dsp/codecs/audio_amrwb.c | 235 - techpack/audio/dsp/codecs/audio_amrwbplus.c | 401 - techpack/audio/dsp/codecs/audio_ape.c | 367 - techpack/audio/dsp/codecs/audio_evrc.c | 188 - techpack/audio/dsp/codecs/audio_g711alaw.c | 398 - techpack/audio/dsp/codecs/audio_g711mlaw.c | 398 - .../audio/dsp/codecs/audio_hwacc_effects.c | 781 - techpack/audio/dsp/codecs/audio_mp3.c | 192 - techpack/audio/dsp/codecs/audio_multi_aac.c | 534 - techpack/audio/dsp/codecs/audio_native.c | 75 - techpack/audio/dsp/codecs/audio_qcelp.c | 195 - techpack/audio/dsp/codecs/audio_utils.c | 959 - techpack/audio/dsp/codecs/audio_utils.h | 158 - techpack/audio/dsp/codecs/audio_utils_aio.c | 2150 -- techpack/audio/dsp/codecs/audio_utils_aio.h | 230 - techpack/audio/dsp/codecs/audio_wma.c | 349 - techpack/audio/dsp/codecs/audio_wmapro.c | 422 - techpack/audio/dsp/codecs/evrc_in.c | 413 - techpack/audio/dsp/codecs/g711alaw_in.c | 385 - techpack/audio/dsp/codecs/g711mlaw_in.c | 388 - techpack/audio/dsp/codecs/q6audio_common.h | 37 - techpack/audio/dsp/codecs/q6audio_v2.c | 106 - techpack/audio/dsp/codecs/q6audio_v2_aio.c | 232 - techpack/audio/dsp/codecs/qcelp_in.c | 413 - techpack/audio/dsp/elliptic/Makefile | 28 - techpack/audio/dsp/elliptic/elliptic.c | 800 - .../dsp/elliptic/elliptic_mixer_controls.c | 1339 - techpack/audio/dsp/elliptic/elliptic_sysfs.c | 635 - .../audio/dsp/elliptic/elliptic_version.h | 8 - .../audio/dsp/elliptic/io_modules/Makefile | 2 - .../io_modules/msm/elliptic_data_msm_io.c | 109 - .../elliptic/io_modules/userspace/Makefile | 2 - .../userspace/elliptic_data_userspace_ctrl.c | 272 - .../userspace/elliptic_data_userspace_io.c | 150 - .../io_modules/userspace_test/Makefile | 2 - .../userspace_test/elliptic_data_io.c | 124 - techpack/audio/dsp/mius/Makefile | 28 - techpack/audio/dsp/mius/io_modules/Makefile | 2 - .../mius/io_modules/msm/mius_data_msm_io.c | 109 - .../dsp/mius/io_modules/userspace/Makefile | 2 - .../userspace/mius_data_userspace_ctrl.c | 272 - .../userspace/mius_data_userspace_io.c | 150 - .../mius/io_modules/userspace_test/Makefile | 2 - .../io_modules/userspace_test/mius_data_io.c | 124 - techpack/audio/dsp/mius/mius.c | 801 - techpack/audio/dsp/mius/mius_mixer_controls.c | 1342 - techpack/audio/dsp/mius/mius_sysfs.c | 635 - techpack/audio/dsp/mius/mius_version.h | 8 - techpack/audio/dsp/msm-audio-event-notify.c | 81 - techpack/audio/dsp/msm-cirrus-playback.c | 1540 - techpack/audio/dsp/msm-dts-srs-tm-config.c | 381 - techpack/audio/dsp/msm_audio_ion.c | 879 - techpack/audio/dsp/msm_mdf.c | 728 - techpack/audio/dsp/q6_init.c | 80 - techpack/audio/dsp/q6_init.h | 106 - techpack/audio/dsp/q6adm.c | 5201 --- techpack/audio/dsp/q6afe.c | 9077 ----- techpack/audio/dsp/q6afecal-hwdep.c | 235 - techpack/audio/dsp/q6afecal-hwdep.h | 53 - techpack/audio/dsp/q6asm.c | 11137 ------ techpack/audio/dsp/q6audio-v2.c | 1110 - techpack/audio/dsp/q6common.c | 184 - techpack/audio/dsp/q6core.c | 1662 - techpack/audio/dsp/q6lsm.c | 2726 -- techpack/audio/dsp/q6usm.c | 1483 - techpack/audio/dsp/q6usm.h | 127 - techpack/audio/dsp/q6voice.c | 10086 ----- techpack/audio/dsp/rtac.c | 2068 - techpack/audio/dsp/sp_params.c | 434 - techpack/audio/dsp/usf.c | 2474 -- techpack/audio/dsp/usf.h | 298 - techpack/audio/dsp/usfcdev.c | 413 - techpack/audio/dsp/usfcdev.h | 28 - techpack/audio/dsp/voice_mhi.c | 628 - techpack/audio/include/Kbuild | 2 - techpack/audio/include/asoc/wcd-irq.h | 63 - .../audio/include/asoc/wcd934x_registers.h | 1848 - .../audio/include/asoc/wcd9360-registers.h | 1158 - .../audio/include/asoc/wcd9xxx_registers.h | 31 - techpack/audio/include/dsp/apr_audio-v2.h | 12396 ------ techpack/audio/include/dsp/apr_elliptic.h | 41 - techpack/audio/include/dsp/apr_mius.h | 41 - techpack/audio/include/dsp/audio_cal_utils.h | 106 - .../audio/include/dsp/audio_calibration.h | 41 - techpack/audio/include/dsp/audio_notifier.h | 105 - .../include/dsp/msm-audio-effects-q6-v2.h | 55 - .../include/dsp/msm-audio-event-notify.h | 68 - .../audio/include/dsp/msm-cirrus-playback.h | 185 - .../audio/include/dsp/msm-dts-srs-tm-config.h | 41 - techpack/audio/include/dsp/msm_audio_ion.h | 41 - techpack/audio/include/dsp/msm_mdf.h | 44 - techpack/audio/include/dsp/q6adm-v2.h | 219 - techpack/audio/include/dsp/q6afe-v2.h | 518 - techpack/audio/include/dsp/q6asm-v2.h | 751 - techpack/audio/include/dsp/q6audio-v2.h | 36 - techpack/audio/include/dsp/q6common.h | 25 - techpack/audio/include/dsp/q6core.h | 231 - techpack/audio/include/dsp/q6lsm.h | 306 - techpack/audio/include/dsp/q6voice.h | 2118 -- techpack/audio/include/dsp/rtac.h | 99 - techpack/audio/include/dsp/sp_params.h | 28 - techpack/audio/include/dsp/voice_mhi.h | 30 - .../audio/include/elliptic/elliptic_data_io.h | 156 - .../audio/include/elliptic/elliptic_device.h | 55 - .../elliptic/elliptic_mixer_controls.h | 188 - .../audio/include/elliptic/elliptic_sysfs.h | 15 - techpack/audio/include/ipc/apr.h | 193 - techpack/audio/include/ipc/apr_tal.h | 93 - techpack/audio/include/ipc/apr_us.h | 193 - techpack/audio/include/mius/mius_data_io.h | 156 - techpack/audio/include/mius/mius_device.h | 55 - .../audio/include/mius/mius_mixer_controls.h | 187 - techpack/audio/include/mius/mius_sysfs.h | 15 - techpack/audio/include/soc/internal.h | 1 - techpack/audio/include/soc/snd_event.h | 79 - techpack/audio/include/soc/soundwire.h | 350 - techpack/audio/include/soc/swr-wcd.h | 50 - techpack/audio/include/uapi/Android.mk | 29 - techpack/audio/include/uapi/Kbuild | 6 - techpack/audio/include/uapi/linux/Kbuild | 20 - techpack/audio/include/uapi/linux/avtimer.h | 10 - techpack/audio/include/uapi/linux/mfd/Kbuild | 1 - .../include/uapi/linux/mfd/wcd9xxx/Kbuild | 2 - .../linux/mfd/wcd9xxx/wcd9320_registers.h | 1399 - .../linux/mfd/wcd9xxx/wcd9xxx_registers.h | 361 - techpack/audio/include/uapi/linux/msm_audio.h | 475 - .../audio/include/uapi/linux/msm_audio_aac.h | 76 - .../audio/include/uapi/linux/msm_audio_ac3.h | 41 - .../audio/include/uapi/linux/msm_audio_alac.h | 24 - .../include/uapi/linux/msm_audio_amrnb.h | 34 - .../include/uapi/linux/msm_audio_amrwb.h | 18 - .../include/uapi/linux/msm_audio_amrwbplus.h | 18 - .../audio/include/uapi/linux/msm_audio_ape.h | 26 - .../uapi/linux/msm_audio_calibration.h | 808 - .../audio/include/uapi/linux/msm_audio_g711.h | 17 - .../include/uapi/linux/msm_audio_g711_dec.h | 16 - .../audio/include/uapi/linux/msm_audio_mvs.h | 155 - .../audio/include/uapi/linux/msm_audio_qcp.h | 37 - .../audio/include/uapi/linux/msm_audio_sbc.h | 36 - .../include/uapi/linux/msm_audio_voicememo.h | 66 - .../audio/include/uapi/linux/msm_audio_wma.h | 33 - .../include/uapi/linux/msm_audio_wmapro.h | 22 - techpack/audio/include/uapi/sound/Kbuild | 8 - .../audio/include/uapi/sound/audio_effects.h | 365 - .../include/uapi/sound/audio_slimslave.h | 18 - techpack/audio/include/uapi/sound/cs35l41.h | 84 - .../audio/include/uapi/sound/devdep_params.h | 66 - .../audio/include/uapi/sound/lsm_params.h | 315 - .../include/uapi/sound/msm-cirrus-playback.h | 120 - .../audio/include/uapi/sound/msmcal-hwdep.h | 40 - .../audio/include/uapi/sound/voice_params.h | 14 - .../audio/include/uapi/sound/wcd-dsp-glink.h | 60 - techpack/audio/ipc/Android.mk | 73 - techpack/audio/ipc/Kbuild | 166 - techpack/audio/ipc/apr.c | 1254 - techpack/audio/ipc/apr_tal_rpmsg.c | 303 - techpack/audio/ipc/apr_v2.c | 82 - techpack/audio/ipc/apr_v3.c | 74 - techpack/audio/ipc/wcd-dsp-glink.c | 781 - techpack/audio/soc/Android.mk | 101 - techpack/audio/soc/Kbuild | 177 - techpack/audio/soc/core.h | 1 - techpack/audio/soc/pinctrl-lpi.c | 794 - techpack/audio/soc/pinctrl-utils.h | 1 - techpack/audio/soc/pinctrl-wcd.c | 435 - techpack/audio/soc/regmap-swr.c | 216 - techpack/audio/soc/snd_event.c | 494 - techpack/audio/soc/soundwire.c | 1130 - techpack/audio/soc/swr-mstr-ctrl.c | 2752 -- techpack/audio/soc/swr-mstr-ctrl.h | 178 - techpack/audio/soc/swr-wcd-ctrl.c | 1963 - techpack/audio/soc/swr-wcd-ctrl.h | 116 - techpack/audio/soc/swrm_port_config.h | 70 - techpack/audio/soc/swrm_registers.h | 248 - 835 files changed, 716249 deletions(-) delete mode 100644 techpack/audio/4.0/asoc/Android.mk delete mode 100644 techpack/audio/4.0/asoc/Kbuild delete mode 100644 techpack/audio/4.0/asoc/codecs/Android.mk delete mode 100644 techpack/audio/4.0/asoc/codecs/Kbuild delete mode 100644 techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.c delete mode 100644 techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.h delete mode 100644 techpack/audio/4.0/asoc/codecs/audio-ext-clk.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/Android.mk delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/Kbuild delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-registers.h delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-regmap.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-tables.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-utils.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.h delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.h delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/internal.h delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/rx-macro.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/tx-macro.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/va-macro.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.c delete mode 100644 techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.h delete mode 100644 techpack/audio/4.0/asoc/codecs/cpe_cmi.h delete mode 100644 techpack/audio/4.0/asoc/codecs/cpe_err.h delete mode 100644 techpack/audio/4.0/asoc/codecs/msm-cdc-pinctrl.c delete mode 100644 techpack/audio/4.0/asoc/codecs/msm-cdc-supply.c delete mode 100644 techpack/audio/4.0/asoc/codecs/msm_hdmi_codec_rx.c delete mode 100644 techpack/audio/4.0/asoc/codecs/msm_stub.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-clsh.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-dsp-mgr.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-irq.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-spi-registers.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd-spi.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9335_registers.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/Android.mk delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/Kbuild delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/internal.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-registers.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-regmap.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-tables.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x_slave.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/Android.mk delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/Kbuild delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/internal.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-registers.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-regmap.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-slave.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-tables.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-common-v2.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-core-init.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-core.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-irq.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-resmgr-v2.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-rst.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-slimslave.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-soc-init.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd_cmi_api.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd_cpe_core.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd_cpe_core.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd_cpe_services.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wcd_cpe_services.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wcdcal-hwdep.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wsa881x-registers.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wsa881x-regmap.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wsa881x-tables.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.h delete mode 100644 techpack/audio/4.0/asoc/codecs/wsa881x.c delete mode 100644 techpack/audio/4.0/asoc/codecs/wsa881x.h delete mode 100644 techpack/audio/4.0/asoc/device_event.h delete mode 100644 techpack/audio/4.0/asoc/kona-port-config.h delete mode 100644 techpack/audio/4.0/asoc/kona.c delete mode 100644 techpack/audio/4.0/asoc/msm-audio-effects-q6-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-compress-q6-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-cpe-lsm.c delete mode 100644 techpack/audio/4.0/asoc/msm-dai-fe.c delete mode 100644 techpack/audio/4.0/asoc/msm-dai-q6-hdmi-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-dai-q6-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-dai-q6-v2.h delete mode 100644 techpack/audio/4.0/asoc/msm-dai-slim.c delete mode 100644 techpack/audio/4.0/asoc/msm-dai-stub-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-dolby-common.h delete mode 100644 techpack/audio/4.0/asoc/msm-dolby-dap-config.h delete mode 100644 techpack/audio/4.0/asoc/msm-ds2-dap-config.c delete mode 100644 techpack/audio/4.0/asoc/msm-ds2-dap-config.h delete mode 100644 techpack/audio/4.0/asoc/msm-lsm-client.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-afe-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-afe-v2.h delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-dtmf-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-host-voice-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-hostless.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-loopback-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-q6-noirq.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-q6-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-q6-v2.h delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-routing-devdep.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-routing-devdep.h delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-routing-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-routing-v2.h delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-voice-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-voice-v2.h delete mode 100644 techpack/audio/4.0/asoc/msm-pcm-voip-v2.c delete mode 100644 techpack/audio/4.0/asoc/msm-qti-pp-config.c delete mode 100644 techpack/audio/4.0/asoc/msm-qti-pp-config.h delete mode 100644 techpack/audio/4.0/asoc/msm-slim-dma.h delete mode 100644 techpack/audio/4.0/asoc/msm-transcode-loopback-q6-v2.c delete mode 100644 techpack/audio/4.0/asoc/platform_init.c delete mode 100644 techpack/audio/4.0/asoc/platform_init.h delete mode 100644 techpack/audio/4.0/asoc/sm6150.c delete mode 100644 techpack/audio/4.0/config/atollauto.conf delete mode 100644 techpack/audio/4.0/config/atollautoconf.h delete mode 100644 techpack/audio/4.0/config/gvmauto.conf delete mode 100644 techpack/audio/4.0/config/gvmautoconf.h delete mode 100644 techpack/audio/4.0/config/konaauto.conf delete mode 100644 techpack/audio/4.0/config/konaautoconf.h delete mode 100644 techpack/audio/4.0/config/litoauto.conf delete mode 100644 techpack/audio/4.0/config/litoautoconf.h delete mode 100644 techpack/audio/4.0/config/qcs405auto.conf delete mode 100644 techpack/audio/4.0/config/qcs405autoconf.h delete mode 100644 techpack/audio/4.0/config/sa8155auto.conf delete mode 100644 techpack/audio/4.0/config/sa8155autoconf.h delete mode 100644 techpack/audio/4.0/config/sdxpoorwillsauto.conf delete mode 100644 techpack/audio/4.0/config/sdxpoorwillsautoconf.h delete mode 100644 techpack/audio/4.0/config/sm6150auto.conf delete mode 100644 techpack/audio/4.0/config/sm6150autoconf.h delete mode 100644 techpack/audio/4.0/config/sm8150auto.conf delete mode 100644 techpack/audio/4.0/config/sm8150autoconf.h delete mode 100644 techpack/audio/4.0/dsp/Android.mk delete mode 100644 techpack/audio/4.0/dsp/Kbuild delete mode 100644 techpack/audio/4.0/dsp/adsp-loader.c delete mode 100644 techpack/audio/4.0/dsp/adsp_err.c delete mode 100644 techpack/audio/4.0/dsp/adsp_err.h delete mode 100644 techpack/audio/4.0/dsp/audio_cal_utils.c delete mode 100644 techpack/audio/4.0/dsp/audio_calibration.c delete mode 100644 techpack/audio/4.0/dsp/audio_notifier.c delete mode 100644 techpack/audio/4.0/dsp/audio_pdr.c delete mode 100644 techpack/audio/4.0/dsp/audio_pdr.h delete mode 100644 techpack/audio/4.0/dsp/audio_slimslave.c delete mode 100644 techpack/audio/4.0/dsp/audio_ssr.c delete mode 100644 techpack/audio/4.0/dsp/audio_ssr.h delete mode 100644 techpack/audio/4.0/dsp/avtimer.c delete mode 100644 techpack/audio/4.0/dsp/codecs/Android.mk delete mode 100644 techpack/audio/4.0/dsp/codecs/Kbuild delete mode 100644 techpack/audio/4.0/dsp/codecs/aac_in.c delete mode 100644 techpack/audio/4.0/dsp/codecs/amrnb_in.c delete mode 100644 techpack/audio/4.0/dsp/codecs/amrwb_in.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_aac.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_alac.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_amrnb.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_amrwb.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_amrwbplus.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_ape.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_evrc.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_g711alaw.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_g711mlaw.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_hwacc_effects.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_mp3.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_multi_aac.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_native.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_qcelp.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_utils.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_utils.h delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_utils_aio.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_utils_aio.h delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_wma.c delete mode 100644 techpack/audio/4.0/dsp/codecs/audio_wmapro.c delete mode 100644 techpack/audio/4.0/dsp/codecs/evrc_in.c delete mode 100644 techpack/audio/4.0/dsp/codecs/g711alaw_in.c delete mode 100644 techpack/audio/4.0/dsp/codecs/g711mlaw_in.c delete mode 100644 techpack/audio/4.0/dsp/codecs/q6audio_common.h delete mode 100644 techpack/audio/4.0/dsp/codecs/q6audio_v2.c delete mode 100644 techpack/audio/4.0/dsp/codecs/q6audio_v2_aio.c delete mode 100644 techpack/audio/4.0/dsp/codecs/qcelp_in.c delete mode 100644 techpack/audio/4.0/dsp/digital-cdc-rsc-mgr.c delete mode 100644 techpack/audio/4.0/dsp/msm-audio-event-notify.c delete mode 100644 techpack/audio/4.0/dsp/msm-dts-srs-tm-config.c delete mode 100644 techpack/audio/4.0/dsp/msm_audio_ion.c delete mode 100644 techpack/audio/4.0/dsp/msm_audio_ion_vm.c delete mode 100644 techpack/audio/4.0/dsp/msm_mdf.c delete mode 100644 techpack/audio/4.0/dsp/q6_init.c delete mode 100644 techpack/audio/4.0/dsp/q6_init.h delete mode 100644 techpack/audio/4.0/dsp/q6adm.c delete mode 100644 techpack/audio/4.0/dsp/q6afe.c delete mode 100644 techpack/audio/4.0/dsp/q6afecal-hwdep.c delete mode 100644 techpack/audio/4.0/dsp/q6afecal-hwdep.h delete mode 100644 techpack/audio/4.0/dsp/q6asm.c delete mode 100644 techpack/audio/4.0/dsp/q6audio-v2.c delete mode 100644 techpack/audio/4.0/dsp/q6common.c delete mode 100644 techpack/audio/4.0/dsp/q6core.c delete mode 100644 techpack/audio/4.0/dsp/q6lsm.c delete mode 100644 techpack/audio/4.0/dsp/q6usm.c delete mode 100644 techpack/audio/4.0/dsp/q6usm.h delete mode 100644 techpack/audio/4.0/dsp/q6voice.c delete mode 100644 techpack/audio/4.0/dsp/rtac.c delete mode 100644 techpack/audio/4.0/dsp/sp_params.c delete mode 100644 techpack/audio/4.0/dsp/usf.c delete mode 100644 techpack/audio/4.0/dsp/usf.h delete mode 100644 techpack/audio/4.0/dsp/usfcdev.c delete mode 100644 techpack/audio/4.0/dsp/usfcdev.h delete mode 100644 techpack/audio/4.0/dsp/voice_mhi.c delete mode 100644 techpack/audio/4.0/include/Kbuild delete mode 100644 techpack/audio/4.0/include/asoc/core.h delete mode 100644 techpack/audio/4.0/include/asoc/cpe_core.h delete mode 100644 techpack/audio/4.0/include/asoc/msm-cdc-pinctrl.h delete mode 100644 techpack/audio/4.0/include/asoc/msm-cdc-supply.h delete mode 100644 techpack/audio/4.0/include/asoc/pdata.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd-clsh.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd-irq.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd-mbhc-v2-api.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd-mbhc-v2.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd934x_registers.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd9xxx-common-v2.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd9xxx-irq.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd9xxx-regmap.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd9xxx-resmgr-v2.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd9xxx-slimslave.h delete mode 100644 techpack/audio/4.0/include/asoc/wcd9xxx_registers.h delete mode 100644 techpack/audio/4.0/include/asoc/wcdcal-hwdep.h delete mode 100644 techpack/audio/4.0/include/dsp/apr_audio-v2.h delete mode 100644 techpack/audio/4.0/include/dsp/audio_cal_utils.h delete mode 100644 techpack/audio/4.0/include/dsp/audio_calibration.h delete mode 100644 techpack/audio/4.0/include/dsp/audio_notifier.h delete mode 100644 techpack/audio/4.0/include/dsp/digital-cdc-rsc-mgr.h delete mode 100644 techpack/audio/4.0/include/dsp/msm-audio-effects-q6-v2.h delete mode 100644 techpack/audio/4.0/include/dsp/msm-audio-event-notify.h delete mode 100644 techpack/audio/4.0/include/dsp/msm-dts-srs-tm-config.h delete mode 100644 techpack/audio/4.0/include/dsp/msm_audio_ion.h delete mode 100644 techpack/audio/4.0/include/dsp/msm_mdf.h delete mode 100644 techpack/audio/4.0/include/dsp/q6adm-v2.h delete mode 100644 techpack/audio/4.0/include/dsp/q6afe-v2.h delete mode 100644 techpack/audio/4.0/include/dsp/q6asm-v2.h delete mode 100644 techpack/audio/4.0/include/dsp/q6audio-v2.h delete mode 100644 techpack/audio/4.0/include/dsp/q6common.h delete mode 100644 techpack/audio/4.0/include/dsp/q6core.h delete mode 100644 techpack/audio/4.0/include/dsp/q6lsm.h delete mode 100644 techpack/audio/4.0/include/dsp/q6voice.h delete mode 100644 techpack/audio/4.0/include/dsp/rtac.h delete mode 100644 techpack/audio/4.0/include/dsp/sp_params.h delete mode 100644 techpack/audio/4.0/include/dsp/voice_mhi.h delete mode 100644 techpack/audio/4.0/include/ipc/apr.h delete mode 100644 techpack/audio/4.0/include/ipc/apr_tal.h delete mode 100644 techpack/audio/4.0/include/ipc/apr_us.h delete mode 100644 techpack/audio/4.0/include/ipc/aprv2_vm.h delete mode 100644 techpack/audio/4.0/include/soc/internal.h delete mode 100644 techpack/audio/4.0/include/soc/snd_event.h delete mode 100644 techpack/audio/4.0/include/soc/soundwire.h delete mode 100644 techpack/audio/4.0/include/soc/swr-common.h delete mode 100644 techpack/audio/4.0/include/soc/swr-wcd.h delete mode 100644 techpack/audio/4.0/include/soc/wcd-spi-ac.h delete mode 100644 techpack/audio/4.0/include/uapi/Android.mk delete mode 100644 techpack/audio/4.0/include/uapi/Kbuild delete mode 100644 techpack/audio/4.0/include/uapi/linux/Kbuild delete mode 100644 techpack/audio/4.0/include/uapi/linux/avtimer.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/mfd/Kbuild delete mode 100644 techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/Kbuild delete mode 100644 techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_aac.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_ac3.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_alac.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_amrnb.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_amrwb.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_amrwbplus.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_ape.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_calibration.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_g711.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_g711_dec.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_mvs.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_qcp.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_sbc.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_voicememo.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_wma.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/msm_audio_wmapro.h delete mode 100644 techpack/audio/4.0/include/uapi/linux/wcd-spi-ac-params.h delete mode 100644 techpack/audio/4.0/include/uapi/sound/Kbuild delete mode 100644 techpack/audio/4.0/include/uapi/sound/audio_effects.h delete mode 100644 techpack/audio/4.0/include/uapi/sound/audio_slimslave.h delete mode 100644 techpack/audio/4.0/include/uapi/sound/devdep_params.h delete mode 100644 techpack/audio/4.0/include/uapi/sound/lsm_params.h delete mode 100644 techpack/audio/4.0/include/uapi/sound/msmcal-hwdep.h delete mode 100644 techpack/audio/4.0/include/uapi/sound/voice_params.h delete mode 100644 techpack/audio/4.0/include/uapi/sound/wcd-dsp-glink.h delete mode 100644 techpack/audio/4.0/ipc/Android.mk delete mode 100644 techpack/audio/4.0/ipc/Kbuild delete mode 100644 techpack/audio/4.0/ipc/apr.c delete mode 100644 techpack/audio/4.0/ipc/apr_tal_rpmsg.c delete mode 100644 techpack/audio/4.0/ipc/apr_v2.c delete mode 100644 techpack/audio/4.0/ipc/apr_v3.c delete mode 100644 techpack/audio/4.0/ipc/apr_vm.c delete mode 100644 techpack/audio/4.0/ipc/wcd-dsp-glink.c delete mode 100644 techpack/audio/4.0/soc/Android.mk delete mode 100644 techpack/audio/4.0/soc/Kbuild delete mode 100644 techpack/audio/4.0/soc/core.h delete mode 100644 techpack/audio/4.0/soc/pinctrl-lpi.c delete mode 100644 techpack/audio/4.0/soc/pinctrl-utils.h delete mode 100644 techpack/audio/4.0/soc/pinctrl-wcd.c delete mode 100644 techpack/audio/4.0/soc/regmap-swr.c delete mode 100644 techpack/audio/4.0/soc/snd_event.c delete mode 100644 techpack/audio/4.0/soc/soundwire.c delete mode 100644 techpack/audio/4.0/soc/swr-mstr-ctrl.c delete mode 100644 techpack/audio/4.0/soc/swr-mstr-ctrl.h delete mode 100644 techpack/audio/4.0/soc/swr-wcd-ctrl.c delete mode 100644 techpack/audio/4.0/soc/swr-wcd-ctrl.h delete mode 100644 techpack/audio/4.0/soc/swrm_registers.h delete mode 100644 techpack/audio/4.0/soc/wcd-spi-ac.c delete mode 100644 techpack/audio/4.0/soc/wcd_spi_ctl_v01.c delete mode 100644 techpack/audio/4.0/soc/wcd_spi_ctl_v01.h delete mode 100644 techpack/audio/Android.mk delete mode 100644 techpack/audio/Makefile delete mode 100644 techpack/audio/Makefile.am delete mode 100644 techpack/audio/NOTICE delete mode 100644 techpack/audio/asoc/Android.mk delete mode 100644 techpack/audio/asoc/Kbuild delete mode 100644 techpack/audio/asoc/codecs/Android.mk delete mode 100644 techpack/audio/asoc/codecs/Kbuild delete mode 100755 techpack/audio/asoc/codecs/Kbuild.bk delete mode 100644 techpack/audio/asoc/codecs/aqt1000/Android.mk delete mode 100644 techpack/audio/asoc/codecs/aqt1000/Kbuild delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-api.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.c delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-core.c delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-internal.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.c delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.c delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-reg-defaults.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-registers.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-regmap.c delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-routing.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.c delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000.c delete mode 100644 techpack/audio/asoc/codecs/aqt1000/aqt1000.h delete mode 100644 techpack/audio/asoc/codecs/aqt1000/pdata.h delete mode 100644 techpack/audio/asoc/codecs/audio-ext-clk-up.c delete mode 100644 techpack/audio/asoc/codecs/audio-ext-clk-up.h delete mode 100644 techpack/audio/asoc/codecs/audio-ext-clk.c delete mode 100644 techpack/audio/asoc/codecs/bolero/Android.mk delete mode 100644 techpack/audio/asoc/codecs/bolero/Kbuild delete mode 100644 techpack/audio/asoc/codecs/bolero/bolero-cdc-registers.h delete mode 100644 techpack/audio/asoc/codecs/bolero/bolero-cdc-regmap.c delete mode 100644 techpack/audio/asoc/codecs/bolero/bolero-cdc-tables.c delete mode 100644 techpack/audio/asoc/codecs/bolero/bolero-cdc-utils.c delete mode 100644 techpack/audio/asoc/codecs/bolero/bolero-cdc.c delete mode 100644 techpack/audio/asoc/codecs/bolero/bolero-cdc.h delete mode 100644 techpack/audio/asoc/codecs/bolero/internal.h delete mode 100644 techpack/audio/asoc/codecs/bolero/rx-macro.c delete mode 100644 techpack/audio/asoc/codecs/bolero/tx-macro.c delete mode 100644 techpack/audio/asoc/codecs/bolero/va-macro.c delete mode 100644 techpack/audio/asoc/codecs/bolero/wsa-macro.c delete mode 100644 techpack/audio/asoc/codecs/bolero/wsa-macro.h delete mode 100644 techpack/audio/asoc/codecs/core.h delete mode 100644 techpack/audio/asoc/codecs/cpe_cmi.h delete mode 100644 techpack/audio/asoc/codecs/cpe_core.h delete mode 100644 techpack/audio/asoc/codecs/cpe_err.h delete mode 100755 techpack/audio/asoc/codecs/cs35l41/Android.mk delete mode 100755 techpack/audio/asoc/codecs/cs35l41/Kbuild delete mode 100755 techpack/audio/asoc/codecs/cs35l41/Kconfig delete mode 100755 techpack/audio/asoc/codecs/cs35l41/Makefile delete mode 100755 techpack/audio/asoc/codecs/cs35l41/cs35l41-i2c.c delete mode 100755 techpack/audio/asoc/codecs/cs35l41/cs35l41-spi.c delete mode 100755 techpack/audio/asoc/codecs/cs35l41/cs35l41-tables.c delete mode 100755 techpack/audio/asoc/codecs/cs35l41/cs35l41.c delete mode 100755 techpack/audio/asoc/codecs/cs35l41/cs35l41.h delete mode 100755 techpack/audio/asoc/codecs/cs35l41/cs35l41.txt delete mode 100755 techpack/audio/asoc/codecs/cs35l41/wm_adsp.c delete mode 100755 techpack/audio/asoc/codecs/cs35l41/wm_adsp.h delete mode 100755 techpack/audio/asoc/codecs/cs35l41/wmfw.h delete mode 100644 techpack/audio/asoc/codecs/csra66x0/Kbuild delete mode 100644 techpack/audio/asoc/codecs/csra66x0/csra66x0.c delete mode 100644 techpack/audio/asoc/codecs/csra66x0/csra66x0.h delete mode 100644 techpack/audio/asoc/codecs/ep92/Android.mk delete mode 100644 techpack/audio/asoc/codecs/ep92/Kbuild delete mode 100644 techpack/audio/asoc/codecs/ep92/ep92.c delete mode 100644 techpack/audio/asoc/codecs/ep92/ep92.h delete mode 100644 techpack/audio/asoc/codecs/msm-cdc-pinctrl.c delete mode 100644 techpack/audio/asoc/codecs/msm-cdc-pinctrl.h delete mode 100644 techpack/audio/asoc/codecs/msm-cdc-supply.c delete mode 100644 techpack/audio/asoc/codecs/msm-cdc-supply.h delete mode 100644 techpack/audio/asoc/codecs/msm_hdmi_codec_rx.c delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/Android.mk delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/Kbuild delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/msm-sdw-tables.c delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/msm_sdw.h delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc.c delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc_utils.c delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/msm_sdw_registers.h delete mode 100644 techpack/audio/asoc/codecs/msm_sdw/msm_sdw_regmap.c delete mode 100644 techpack/audio/asoc/codecs/msm_stub.c delete mode 100644 techpack/audio/asoc/codecs/pdata.h delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/Android.mk delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/Kbuild delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.c delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.h delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/msm-cdc-common.h delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.c delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.h delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.c delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.h delete mode 100644 techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-registers.h delete mode 100755 techpack/audio/asoc/codecs/spk-id.c delete mode 100755 techpack/audio/asoc/codecs/spk-id.h delete mode 100755 techpack/audio/asoc/codecs/tas2557/Android.mk delete mode 100755 techpack/audio/asoc/codecs/tas2557/Kbuild delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557-codec.c delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557-codec.h delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557-core.c delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557-core.h delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557-misc.c delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557-misc.h delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557-regmap.c delete mode 100755 techpack/audio/asoc/codecs/tas2557/tas2557.h delete mode 100755 techpack/audio/asoc/codecs/tas2557/tiload.c delete mode 100755 techpack/audio/asoc/codecs/tas2557/tiload.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/.gitignore delete mode 100755 techpack/audio/asoc/codecs/tfa98xx/Android.mk delete mode 100755 techpack/audio/asoc/codecs/tfa98xx/Kbuild delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/config.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/dbgprint.h delete mode 100755 techpack/audio/asoc/codecs/tfa98xx/inc/spk-id.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa1_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa2_tfafieldnames_N1C.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_device_genregs_POR.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames_B0.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9874_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9878_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9887_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9890_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_genregs.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames_N2.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9896_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_genregs_N1C.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_parameters.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_device_genregs.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_tfafieldnames.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa_container.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa_device.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa_dsp_fw.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa_ext.h delete mode 100755 techpack/audio/asoc/codecs/tfa98xx/inc/tfa_internal.h delete mode 100755 techpack/audio/asoc/codecs/tfa98xx/inc/tfa_platform_interface_definition.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/inc/tfa_service.h delete mode 100755 techpack/audio/asoc/codecs/tfa98xx/inc/versions.h delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/src/tfa98xx.c delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/src/tfa_container.c delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/src/tfa_dsp.c delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/src/tfa_init.c delete mode 100644 techpack/audio/asoc/codecs/tfa98xx/src/tfa_internal.h delete mode 100644 techpack/audio/asoc/codecs/wcd-clsh.c delete mode 100644 techpack/audio/asoc/codecs/wcd-clsh.h delete mode 100644 techpack/audio/asoc/codecs/wcd-dsp-mgr.c delete mode 100644 techpack/audio/asoc/codecs/wcd-dsp-utils.c delete mode 100644 techpack/audio/asoc/codecs/wcd-dsp-utils.h delete mode 100644 techpack/audio/asoc/codecs/wcd-irq.c delete mode 100644 techpack/audio/asoc/codecs/wcd-mbhc-adc.c delete mode 100644 techpack/audio/asoc/codecs/wcd-mbhc-adc.h delete mode 100644 techpack/audio/asoc/codecs/wcd-mbhc-legacy.c delete mode 100644 techpack/audio/asoc/codecs/wcd-mbhc-legacy.h delete mode 100644 techpack/audio/asoc/codecs/wcd-mbhc-v2-api.h delete mode 100644 techpack/audio/asoc/codecs/wcd-mbhc-v2.c delete mode 100644 techpack/audio/asoc/codecs/wcd-mbhc-v2.h delete mode 100644 techpack/audio/asoc/codecs/wcd-spi-registers.h delete mode 100644 techpack/audio/asoc/codecs/wcd-spi.c delete mode 100644 techpack/audio/asoc/codecs/wcd9335-regmap.c delete mode 100644 techpack/audio/asoc/codecs/wcd9335-tables.c delete mode 100644 techpack/audio/asoc/codecs/wcd9335.c delete mode 100644 techpack/audio/asoc/codecs/wcd9335.h delete mode 100644 techpack/audio/asoc/codecs/wcd9335_irq.h delete mode 100644 techpack/audio/asoc/codecs/wcd9335_registers.h delete mode 100644 techpack/audio/asoc/codecs/wcd934x/Android.mk delete mode 100644 techpack/audio/asoc/codecs/wcd934x/Kbuild delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.c delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.h delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.h delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.c delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.h delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-regmap.c delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-routing.h delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x-tables.c delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x.c delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x.h delete mode 100644 techpack/audio/asoc/codecs/wcd934x/wcd934x_irq.h delete mode 100644 techpack/audio/asoc/codecs/wcd9360/Android.mk delete mode 100644 techpack/audio/asoc/codecs/wcd9360/Kbuild delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360-defaults.h delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.c delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.h delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360-irq.h delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360-regmap.c delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360-routing.h delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360.c delete mode 100644 techpack/audio/asoc/codecs/wcd9360/wcd9360.h delete mode 100644 techpack/audio/asoc/codecs/wcd937x/Android.mk delete mode 100644 techpack/audio/asoc/codecs/wcd937x/Kbuild delete mode 100644 techpack/audio/asoc/codecs/wcd937x/internal.h delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.c delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.h delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x-registers.h delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x-regmap.c delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x-tables.c delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x.c delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x.h delete mode 100644 techpack/audio/asoc/codecs/wcd937x/wcd937x_slave.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-common-v2.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-common-v2.h delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-core-init.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-core.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-irq.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-irq.h delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-regmap.h delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.h delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-rst.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-slimslave.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-slimslave.h delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-soc-init.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-utils.c delete mode 100644 techpack/audio/asoc/codecs/wcd9xxx-utils.h delete mode 100644 techpack/audio/asoc/codecs/wcd_cmi_api.h delete mode 100644 techpack/audio/asoc/codecs/wcd_cpe_core.c delete mode 100644 techpack/audio/asoc/codecs/wcd_cpe_core.h delete mode 100644 techpack/audio/asoc/codecs/wcd_cpe_services.c delete mode 100644 techpack/audio/asoc/codecs/wcd_cpe_services.h delete mode 100644 techpack/audio/asoc/codecs/wcdcal-hwdep.c delete mode 100644 techpack/audio/asoc/codecs/wcdcal-hwdep.h delete mode 100644 techpack/audio/asoc/codecs/wsa881x-analog.c delete mode 100644 techpack/audio/asoc/codecs/wsa881x-analog.h delete mode 100644 techpack/audio/asoc/codecs/wsa881x-registers-analog.h delete mode 100644 techpack/audio/asoc/codecs/wsa881x-registers.h delete mode 100644 techpack/audio/asoc/codecs/wsa881x-regmap-analog.c delete mode 100644 techpack/audio/asoc/codecs/wsa881x-regmap.c delete mode 100644 techpack/audio/asoc/codecs/wsa881x-tables-analog.c delete mode 100644 techpack/audio/asoc/codecs/wsa881x-tables.c delete mode 100644 techpack/audio/asoc/codecs/wsa881x-temp-sensor.c delete mode 100644 techpack/audio/asoc/codecs/wsa881x-temp-sensor.h delete mode 100644 techpack/audio/asoc/codecs/wsa881x.c delete mode 100644 techpack/audio/asoc/codecs/wsa881x.h delete mode 100644 techpack/audio/asoc/device_event.h delete mode 100644 techpack/audio/asoc/machine_815x_init.c delete mode 100644 techpack/audio/asoc/machine_815x_init.h delete mode 100644 techpack/audio/asoc/msm-audio-effects-q6-v2.c delete mode 100644 techpack/audio/asoc/msm-compress-q6-v2.c delete mode 100644 techpack/audio/asoc/msm-cpe-lsm.c delete mode 100644 techpack/audio/asoc/msm-dai-fe.c delete mode 100644 techpack/audio/asoc/msm-dai-q6-hdmi-v2.c delete mode 100644 techpack/audio/asoc/msm-dai-q6-v2.c delete mode 100644 techpack/audio/asoc/msm-dai-q6-v2.h delete mode 100644 techpack/audio/asoc/msm-dai-slim.c delete mode 100644 techpack/audio/asoc/msm-dai-stub-v2.c delete mode 100644 techpack/audio/asoc/msm-dolby-common.h delete mode 100644 techpack/audio/asoc/msm-dolby-dap-config.h delete mode 100644 techpack/audio/asoc/msm-ds2-dap-config.c delete mode 100644 techpack/audio/asoc/msm-ds2-dap-config.h delete mode 100644 techpack/audio/asoc/msm-lsm-client.c delete mode 100644 techpack/audio/asoc/msm-pcm-afe-v2.c delete mode 100644 techpack/audio/asoc/msm-pcm-afe-v2.h delete mode 100644 techpack/audio/asoc/msm-pcm-dtmf-v2.c delete mode 100644 techpack/audio/asoc/msm-pcm-host-voice-v2.c delete mode 100644 techpack/audio/asoc/msm-pcm-hostless.c delete mode 100644 techpack/audio/asoc/msm-pcm-loopback-v2.c delete mode 100644 techpack/audio/asoc/msm-pcm-q6-noirq.c delete mode 100644 techpack/audio/asoc/msm-pcm-q6-v2.c delete mode 100644 techpack/audio/asoc/msm-pcm-q6-v2.h delete mode 100644 techpack/audio/asoc/msm-pcm-routing-devdep.c delete mode 100644 techpack/audio/asoc/msm-pcm-routing-devdep.h delete mode 100644 techpack/audio/asoc/msm-pcm-routing-v2.c delete mode 100644 techpack/audio/asoc/msm-pcm-routing-v2.h delete mode 100644 techpack/audio/asoc/msm-pcm-voice-v2.c delete mode 100644 techpack/audio/asoc/msm-pcm-voice-v2.h delete mode 100644 techpack/audio/asoc/msm-pcm-voip-v2.c delete mode 100644 techpack/audio/asoc/msm-qti-pp-config.c delete mode 100644 techpack/audio/asoc/msm-qti-pp-config.h delete mode 100644 techpack/audio/asoc/msm-slim-dma.h delete mode 100644 techpack/audio/asoc/msm-transcode-loopback-q6-v2.c delete mode 100644 techpack/audio/asoc/msm8998.c delete mode 100644 techpack/audio/asoc/platform_init.c delete mode 100644 techpack/audio/asoc/platform_init.h delete mode 100644 techpack/audio/asoc/qcs405.c delete mode 100644 techpack/audio/asoc/sa8155.c delete mode 100644 techpack/audio/asoc/sdm660-common.c delete mode 100644 techpack/audio/asoc/sdm660-common.h delete mode 100644 techpack/audio/asoc/sdm660-ext-dai-links.c delete mode 100644 techpack/audio/asoc/sdm660-external.c delete mode 100644 techpack/audio/asoc/sdm660-external.h delete mode 100644 techpack/audio/asoc/sdm660-internal.c delete mode 100644 techpack/audio/asoc/sdm660-internal.h delete mode 100644 techpack/audio/asoc/sdm845.c delete mode 100644 techpack/audio/asoc/sm6150.c delete mode 100644 techpack/audio/asoc/sm8150.c delete mode 100644 techpack/audio/config/qcs405auto.conf delete mode 100644 techpack/audio/config/qcs405autoconf.h delete mode 100644 techpack/audio/config/sdm660auto.conf delete mode 100644 techpack/audio/config/sdm660autoconf.h delete mode 100644 techpack/audio/config/sdm670auto.conf delete mode 100644 techpack/audio/config/sdm670auto_static.conf delete mode 100644 techpack/audio/config/sdm670autoconf.h delete mode 100644 techpack/audio/config/sdm845auto.conf delete mode 100644 techpack/audio/config/sdm845autoconf.h delete mode 100644 techpack/audio/config/sdxpoorwillsauto.conf delete mode 100644 techpack/audio/config/sdxpoorwillsautoconf.h delete mode 100644 techpack/audio/config/sm6150auto.conf delete mode 100644 techpack/audio/config/sm6150autoconf.h delete mode 100644 techpack/audio/config/sm8150auto.conf delete mode 100644 techpack/audio/config/sm8150autoconf.h delete mode 100644 techpack/audio/config/trinketauto.conf delete mode 100644 techpack/audio/config/trinketautoconf.h delete mode 100644 techpack/audio/dsp/Android.mk delete mode 100644 techpack/audio/dsp/Kbuild delete mode 100644 techpack/audio/dsp/adsp-loader.c delete mode 100644 techpack/audio/dsp/adsp_err.c delete mode 100644 techpack/audio/dsp/adsp_err.h delete mode 100755 techpack/audio/dsp/apr_elliptic.c delete mode 100644 techpack/audio/dsp/apr_mius.c delete mode 100644 techpack/audio/dsp/audio_cal_utils.c delete mode 100644 techpack/audio/dsp/audio_calibration.c delete mode 100644 techpack/audio/dsp/audio_notifier.c delete mode 100644 techpack/audio/dsp/audio_pdr.c delete mode 100644 techpack/audio/dsp/audio_pdr.h delete mode 100644 techpack/audio/dsp/audio_slimslave.c delete mode 100644 techpack/audio/dsp/audio_ssr.c delete mode 100644 techpack/audio/dsp/audio_ssr.h delete mode 100644 techpack/audio/dsp/avtimer.c delete mode 100644 techpack/audio/dsp/codecs/Android.mk delete mode 100644 techpack/audio/dsp/codecs/Kbuild delete mode 100644 techpack/audio/dsp/codecs/aac_in.c delete mode 100644 techpack/audio/dsp/codecs/amrnb_in.c delete mode 100644 techpack/audio/dsp/codecs/amrwb_in.c delete mode 100644 techpack/audio/dsp/codecs/audio_aac.c delete mode 100644 techpack/audio/dsp/codecs/audio_alac.c delete mode 100644 techpack/audio/dsp/codecs/audio_amrnb.c delete mode 100644 techpack/audio/dsp/codecs/audio_amrwb.c delete mode 100644 techpack/audio/dsp/codecs/audio_amrwbplus.c delete mode 100644 techpack/audio/dsp/codecs/audio_ape.c delete mode 100644 techpack/audio/dsp/codecs/audio_evrc.c delete mode 100644 techpack/audio/dsp/codecs/audio_g711alaw.c delete mode 100644 techpack/audio/dsp/codecs/audio_g711mlaw.c delete mode 100644 techpack/audio/dsp/codecs/audio_hwacc_effects.c delete mode 100644 techpack/audio/dsp/codecs/audio_mp3.c delete mode 100644 techpack/audio/dsp/codecs/audio_multi_aac.c delete mode 100644 techpack/audio/dsp/codecs/audio_native.c delete mode 100644 techpack/audio/dsp/codecs/audio_qcelp.c delete mode 100644 techpack/audio/dsp/codecs/audio_utils.c delete mode 100644 techpack/audio/dsp/codecs/audio_utils.h delete mode 100644 techpack/audio/dsp/codecs/audio_utils_aio.c delete mode 100644 techpack/audio/dsp/codecs/audio_utils_aio.h delete mode 100644 techpack/audio/dsp/codecs/audio_wma.c delete mode 100644 techpack/audio/dsp/codecs/audio_wmapro.c delete mode 100644 techpack/audio/dsp/codecs/evrc_in.c delete mode 100644 techpack/audio/dsp/codecs/g711alaw_in.c delete mode 100644 techpack/audio/dsp/codecs/g711mlaw_in.c delete mode 100644 techpack/audio/dsp/codecs/q6audio_common.h delete mode 100644 techpack/audio/dsp/codecs/q6audio_v2.c delete mode 100644 techpack/audio/dsp/codecs/q6audio_v2_aio.c delete mode 100644 techpack/audio/dsp/codecs/qcelp_in.c delete mode 100644 techpack/audio/dsp/elliptic/Makefile delete mode 100755 techpack/audio/dsp/elliptic/elliptic.c delete mode 100755 techpack/audio/dsp/elliptic/elliptic_mixer_controls.c delete mode 100755 techpack/audio/dsp/elliptic/elliptic_sysfs.c delete mode 100755 techpack/audio/dsp/elliptic/elliptic_version.h delete mode 100644 techpack/audio/dsp/elliptic/io_modules/Makefile delete mode 100755 techpack/audio/dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c delete mode 100644 techpack/audio/dsp/elliptic/io_modules/userspace/Makefile delete mode 100644 techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c delete mode 100644 techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c delete mode 100644 techpack/audio/dsp/elliptic/io_modules/userspace_test/Makefile delete mode 100755 techpack/audio/dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c delete mode 100644 techpack/audio/dsp/mius/Makefile delete mode 100644 techpack/audio/dsp/mius/io_modules/Makefile delete mode 100644 techpack/audio/dsp/mius/io_modules/msm/mius_data_msm_io.c delete mode 100644 techpack/audio/dsp/mius/io_modules/userspace/Makefile delete mode 100644 techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c delete mode 100644 techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_io.c delete mode 100644 techpack/audio/dsp/mius/io_modules/userspace_test/Makefile delete mode 100644 techpack/audio/dsp/mius/io_modules/userspace_test/mius_data_io.c delete mode 100644 techpack/audio/dsp/mius/mius.c delete mode 100644 techpack/audio/dsp/mius/mius_mixer_controls.c delete mode 100644 techpack/audio/dsp/mius/mius_sysfs.c delete mode 100644 techpack/audio/dsp/mius/mius_version.h delete mode 100644 techpack/audio/dsp/msm-audio-event-notify.c delete mode 100755 techpack/audio/dsp/msm-cirrus-playback.c delete mode 100644 techpack/audio/dsp/msm-dts-srs-tm-config.c delete mode 100644 techpack/audio/dsp/msm_audio_ion.c delete mode 100644 techpack/audio/dsp/msm_mdf.c delete mode 100644 techpack/audio/dsp/q6_init.c delete mode 100644 techpack/audio/dsp/q6_init.h delete mode 100644 techpack/audio/dsp/q6adm.c delete mode 100644 techpack/audio/dsp/q6afe.c delete mode 100644 techpack/audio/dsp/q6afecal-hwdep.c delete mode 100644 techpack/audio/dsp/q6afecal-hwdep.h delete mode 100644 techpack/audio/dsp/q6asm.c delete mode 100644 techpack/audio/dsp/q6audio-v2.c delete mode 100644 techpack/audio/dsp/q6common.c delete mode 100644 techpack/audio/dsp/q6core.c delete mode 100644 techpack/audio/dsp/q6lsm.c delete mode 100644 techpack/audio/dsp/q6usm.c delete mode 100644 techpack/audio/dsp/q6usm.h delete mode 100644 techpack/audio/dsp/q6voice.c delete mode 100644 techpack/audio/dsp/rtac.c delete mode 100644 techpack/audio/dsp/sp_params.c delete mode 100644 techpack/audio/dsp/usf.c delete mode 100644 techpack/audio/dsp/usf.h delete mode 100644 techpack/audio/dsp/usfcdev.c delete mode 100644 techpack/audio/dsp/usfcdev.h delete mode 100644 techpack/audio/dsp/voice_mhi.c delete mode 100644 techpack/audio/include/Kbuild delete mode 100644 techpack/audio/include/asoc/wcd-irq.h delete mode 100644 techpack/audio/include/asoc/wcd934x_registers.h delete mode 100644 techpack/audio/include/asoc/wcd9360-registers.h delete mode 100644 techpack/audio/include/asoc/wcd9xxx_registers.h delete mode 100644 techpack/audio/include/dsp/apr_audio-v2.h delete mode 100755 techpack/audio/include/dsp/apr_elliptic.h delete mode 100644 techpack/audio/include/dsp/apr_mius.h delete mode 100644 techpack/audio/include/dsp/audio_cal_utils.h delete mode 100644 techpack/audio/include/dsp/audio_calibration.h delete mode 100644 techpack/audio/include/dsp/audio_notifier.h delete mode 100644 techpack/audio/include/dsp/msm-audio-effects-q6-v2.h delete mode 100644 techpack/audio/include/dsp/msm-audio-event-notify.h delete mode 100755 techpack/audio/include/dsp/msm-cirrus-playback.h delete mode 100644 techpack/audio/include/dsp/msm-dts-srs-tm-config.h delete mode 100644 techpack/audio/include/dsp/msm_audio_ion.h delete mode 100644 techpack/audio/include/dsp/msm_mdf.h delete mode 100644 techpack/audio/include/dsp/q6adm-v2.h delete mode 100644 techpack/audio/include/dsp/q6afe-v2.h delete mode 100644 techpack/audio/include/dsp/q6asm-v2.h delete mode 100644 techpack/audio/include/dsp/q6audio-v2.h delete mode 100644 techpack/audio/include/dsp/q6common.h delete mode 100644 techpack/audio/include/dsp/q6core.h delete mode 100644 techpack/audio/include/dsp/q6lsm.h delete mode 100644 techpack/audio/include/dsp/q6voice.h delete mode 100644 techpack/audio/include/dsp/rtac.h delete mode 100644 techpack/audio/include/dsp/sp_params.h delete mode 100644 techpack/audio/include/dsp/voice_mhi.h delete mode 100644 techpack/audio/include/elliptic/elliptic_data_io.h delete mode 100644 techpack/audio/include/elliptic/elliptic_device.h delete mode 100755 techpack/audio/include/elliptic/elliptic_mixer_controls.h delete mode 100755 techpack/audio/include/elliptic/elliptic_sysfs.h delete mode 100644 techpack/audio/include/ipc/apr.h delete mode 100644 techpack/audio/include/ipc/apr_tal.h delete mode 100644 techpack/audio/include/ipc/apr_us.h delete mode 100644 techpack/audio/include/mius/mius_data_io.h delete mode 100644 techpack/audio/include/mius/mius_device.h delete mode 100644 techpack/audio/include/mius/mius_mixer_controls.h delete mode 100644 techpack/audio/include/mius/mius_sysfs.h delete mode 120000 techpack/audio/include/soc/internal.h delete mode 100644 techpack/audio/include/soc/snd_event.h delete mode 100644 techpack/audio/include/soc/soundwire.h delete mode 100644 techpack/audio/include/soc/swr-wcd.h delete mode 100644 techpack/audio/include/uapi/Android.mk delete mode 100644 techpack/audio/include/uapi/Kbuild delete mode 100644 techpack/audio/include/uapi/linux/Kbuild delete mode 100644 techpack/audio/include/uapi/linux/avtimer.h delete mode 100644 techpack/audio/include/uapi/linux/mfd/Kbuild delete mode 100644 techpack/audio/include/uapi/linux/mfd/wcd9xxx/Kbuild delete mode 100644 techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h delete mode 100644 techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_aac.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_ac3.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_alac.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_amrnb.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_amrwb.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_amrwbplus.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_ape.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_calibration.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_g711.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_g711_dec.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_mvs.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_qcp.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_sbc.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_voicememo.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_wma.h delete mode 100644 techpack/audio/include/uapi/linux/msm_audio_wmapro.h delete mode 100644 techpack/audio/include/uapi/sound/Kbuild delete mode 100644 techpack/audio/include/uapi/sound/audio_effects.h delete mode 100644 techpack/audio/include/uapi/sound/audio_slimslave.h delete mode 100755 techpack/audio/include/uapi/sound/cs35l41.h delete mode 100644 techpack/audio/include/uapi/sound/devdep_params.h delete mode 100644 techpack/audio/include/uapi/sound/lsm_params.h delete mode 100755 techpack/audio/include/uapi/sound/msm-cirrus-playback.h delete mode 100644 techpack/audio/include/uapi/sound/msmcal-hwdep.h delete mode 100644 techpack/audio/include/uapi/sound/voice_params.h delete mode 100644 techpack/audio/include/uapi/sound/wcd-dsp-glink.h delete mode 100644 techpack/audio/ipc/Android.mk delete mode 100644 techpack/audio/ipc/Kbuild delete mode 100644 techpack/audio/ipc/apr.c delete mode 100644 techpack/audio/ipc/apr_tal_rpmsg.c delete mode 100644 techpack/audio/ipc/apr_v2.c delete mode 100644 techpack/audio/ipc/apr_v3.c delete mode 100644 techpack/audio/ipc/wcd-dsp-glink.c delete mode 100644 techpack/audio/soc/Android.mk delete mode 100644 techpack/audio/soc/Kbuild delete mode 120000 techpack/audio/soc/core.h delete mode 100644 techpack/audio/soc/pinctrl-lpi.c delete mode 120000 techpack/audio/soc/pinctrl-utils.h delete mode 100644 techpack/audio/soc/pinctrl-wcd.c delete mode 100644 techpack/audio/soc/regmap-swr.c delete mode 100644 techpack/audio/soc/snd_event.c delete mode 100644 techpack/audio/soc/soundwire.c delete mode 100644 techpack/audio/soc/swr-mstr-ctrl.c delete mode 100644 techpack/audio/soc/swr-mstr-ctrl.h delete mode 100644 techpack/audio/soc/swr-wcd-ctrl.c delete mode 100644 techpack/audio/soc/swr-wcd-ctrl.h delete mode 100644 techpack/audio/soc/swrm_port_config.h delete mode 100644 techpack/audio/soc/swrm_registers.h diff --git a/techpack/audio/4.0/asoc/Android.mk b/techpack/audio/4.0/asoc/Android.mk deleted file mode 100644 index 9d866f997644..000000000000 --- a/techpack/audio/4.0/asoc/Android.mk +++ /dev/null @@ -1,97 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -TARGET := msmnile -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -TARGET := talos -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -TARGET := trinket -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -TARGET := kona -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -TARGET := lito -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -TARGET := atoll -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=platform_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_platform.ko -LOCAL_MODULE_KBUILD_NAME := platform_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, ),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_cpe_lsm.ko -LOCAL_MODULE_KBUILD_NAME := cpe_lsm_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_machine_$(TARGET).ko -LOCAL_MODULE_KBUILD_NAME := machine_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/asoc/Kbuild b/techpack/audio/4.0/asoc/Kbuild deleted file mode 100644 index f064a6f6c98a..000000000000 --- a/techpack/audio/4.0/asoc/Kbuild +++ /dev/null @@ -1,250 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM8150), y) - ifdef CONFIG_SND_SOC_SA8155 - include $(AUDIO_ROOT)/config/sa8155auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sa8155autoconf.h - else - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - endif - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif - ifeq ($(CONFIG_QTI_GVM), y) - include $(AUDIO_ROOT)/config/gvmauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ ASoC Drivers ############ - -# for SM8150 sound card driver -ifdef CONFIG_SND_SOC_SM8150 - MACHINE_OBJS += sm8150.o - MACHINE_OBJS += machine_815x_init.o -endif - -# for SM6150 sound card driver -ifdef CONFIG_SND_SOC_SM6150 - MACHINE_OBJS += sm6150.o -endif - -# for qcs405 sound card driver -ifdef CONFIG_SND_SOC_QCS405 - MACHINE_OBJS += qcs405.o -endif - -# for KONA sound card driver -ifdef CONFIG_SND_SOC_KONA - MACHINE_OBJS += kona.o -endif - -ifdef CONFIG_SND_SOC_LITO - MACHINE_OBJS += kona.o -endif - -# for ATOLL soound card driver -ifdef CONFIG_SND_SOC_ATOLL - MACHINE_OBJS += kona.o -endif - -# for sa8155 sound card driver -ifdef CONFIG_SND_SOC_SA8155 - MACHINE_OBJS += sa8155.o -endif - -ifdef CONFIG_SND_SOC_CPE - CPE_LSM_OBJS += msm-cpe-lsm.o -endif - -ifdef CONFIG_SND_SOC_QDSP6V2 - PLATFORM_OBJS += msm-audio-effects-q6-v2.o - PLATFORM_OBJS += msm-compress-q6-v2.o - PLATFORM_OBJS += msm-dai-fe.o - PLATFORM_OBJS += msm-dai-q6-hdmi-v2.o - PLATFORM_OBJS += msm-dai-q6-v2.o - PLATFORM_OBJS += msm-dai-stub-v2.o - PLATFORM_OBJS += msm-lsm-client.o - PLATFORM_OBJS += msm-pcm-afe-v2.o - PLATFORM_OBJS += msm-pcm-dtmf-v2.o - PLATFORM_OBJS += msm-pcm-hostless.o - PLATFORM_OBJS += msm-pcm-host-voice-v2.o - PLATFORM_OBJS += msm-pcm-loopback-v2.o - PLATFORM_OBJS += msm-pcm-q6-noirq.o - PLATFORM_OBJS += msm-pcm-q6-v2.o - PLATFORM_OBJS += msm-pcm-routing-v2.o - PLATFORM_OBJS += msm-pcm-voice-v2.o - PLATFORM_OBJS += msm-pcm-voip-v2.o - PLATFORM_OBJS += msm-transcode-loopback-q6-v2.o - PLATFORM_OBJS += platform_init.o -endif -ifdef CONFIG_WCD9XXX_CODEC_CORE - PLATFORM_OBJS += msm-dai-slim.o -endif -ifdef CONFIG_DOLBY_DS2 - PLATFORM_OBJS += msm-ds2-dap-config.o -endif -ifdef CONFIG_DOLBY_LICENSE - PLATFORM_OBJS += msm-ds2-dap-config.o -endif -ifdef CONFIG_SND_HWDEP_ROUTING - PLATFORM_OBJS += msm-pcm-routing-devdep.o -endif -ifdef CONFIG_QTI_PP - PLATFORM_OBJS += msm-qti-pp-config.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/wcd934x/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/wcd937x/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/wcd938x/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd934x/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd937x/Module.symvers - endif -endif -ifeq ($(KERNEL_BUILD), 1) - obj-y += codecs/ -endif -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_QDSP6V2) += platform_dlkm.o -platform_dlkm-y := $(PLATFORM_OBJS) - -obj-$(CONFIG_SND_SOC_SM8150) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_SM6150) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_ATOLL) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_QCS405) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_KONA) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_LITO) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_SA8155) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_CPE) += cpe_lsm_dlkm.o -cpe_lsm_dlkm-y := $(CPE_LSM_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/asoc/codecs/Android.mk b/techpack/audio/4.0/asoc/codecs/Android.mk deleted file mode 100644 index 593510245f69..000000000000 --- a/techpack/audio/4.0/asoc/codecs/Android.mk +++ /dev/null @@ -1,145 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd_core_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_core.ko -LOCAL_MODULE_KBUILD_NAME := wcd_core_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9xxx.ko -LOCAL_MODULE_KBUILD_NAME := wcd9xxx_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, ),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_cpe.ko -LOCAL_MODULE_KBUILD_NAME := wcd_cpe_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_spi.ko -LOCAL_MODULE_KBUILD_NAME := wcd_spi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -ifeq ($(call is-board-platform-in-list, ),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9335.ko -LOCAL_MODULE_KBUILD_NAME := wcd9335_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa881x.ko -LOCAL_MODULE_KBUILD_NAME := wsa881x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_mbhc.ko -LOCAL_MODULE_KBUILD_NAME := mbhc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -############################################################ -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_stub.ko -LOCAL_MODULE_KBUILD_NAME := stub_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################## -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_hdmi.ko -LOCAL_MODULE_KBUILD_NAME := hdmi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/asoc/codecs/Kbuild b/techpack/audio/4.0/asoc/codecs/Kbuild deleted file mode 100644 index 745065179a1c..000000000000 --- a/techpack/audio/4.0/asoc/codecs/Kbuild +++ /dev/null @@ -1,254 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.19 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM8150), y) - ifdef CONFIG_SND_SOC_SA8155 - include $(AUDIO_ROOT)/config/sa8155auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sa8155autoconf.h - else - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - endif - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif - ifeq ($(CONFIG_QTI_GVM), y) - include $(AUDIO_ROOT)/config/gvmauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ ASoC Codecs ############ -ifdef CONFIG_WCD9XXX_CODEC_CORE - CORE_OBJS += wcd9xxx-rst.o - CORE_OBJS += wcd9xxx-core-init.o - CORE_OBJS += wcd9xxx-core.o - CORE_OBJS += wcd9xxx-irq.o - CORE_OBJS += wcd9xxx-slimslave.o - CORE_OBJS += wcd9xxx-utils.o - CORE_OBJS += wcd9335-regmap.o - CORE_OBJS += wcd9335-tables.o - CORE_OBJS += msm-cdc-pinctrl.o - CORE_OBJS += msm-cdc-supply.o - CORE_OBJS += wcd934x/wcd934x-regmap.o - CORE_OBJS += wcd934x/wcd934x-tables.o -endif - -ifdef CONFIG_WCD9XXX_CODEC_CORE_V2 - CORE_OBJS += wcd9xxx-core-init.o - CORE_OBJS += msm-cdc-pinctrl.o - CORE_OBJS += msm-cdc-supply.o -endif - -ifdef CONFIG_SND_SOC_WCD9XXX_V2 -ifdef CONFIG_WCD9XXX_CODEC_CORE - WCD9XXX_OBJS += wcd9xxx-common-v2.o - WCD9XXX_OBJS += wcd9xxx-resmgr-v2.o -else - WCD9XXX_OBJS += wcd-clsh.o -endif - WCD9XXX_OBJS += wcdcal-hwdep.o - WCD9XXX_OBJS += wcd9xxx-soc-init.o - WCD9XXX_OBJS += wcd-dsp-utils.o - WCD9XXX_OBJS += wcd-dsp-mgr.o - WCD9XXX_OBJS += audio-ext-clk-up.o -endif - -ifdef CONFIG_SND_SOC_WCD9335 - WCD9335_OBJS += wcd9335.o -endif - -ifdef CONFIG_SND_SOC_WSA881X - WSA881X_OBJS += wsa881x.o - WSA881X_OBJS += wsa881x-tables.o - WSA881X_OBJS += wsa881x-regmap.o - WSA881X_OBJS += wsa881x-temp-sensor.o -endif - -ifdef CONFIG_SND_SOC_MSM_STUB - STUB_OBJS += msm_stub.o -endif -ifdef CONFIG_SND_SOC_WCD_SPI - SPI_OBJS += wcd-spi.o -endif - -ifdef CONFIG_SND_SOC_WCD_CPE - WCD_CPE_OBJS += wcd_cpe_core.o - WCD_CPE_OBJS += wcd_cpe_services.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC - MBHC_OBJS += wcd-mbhc-v2.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC_ADC - MBHC_OBJS += wcd-mbhc-adc.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC_LEGACY - MBHC_OBJS += wcd-mbhc-legacy.o -endif - -ifdef CONFIG_SND_SOC_MSM_HDMI_CODEC_RX - HDMICODEC_OBJS += msm_hdmi_codec_rx.o -endif - -ifdef CONFIG_SND_SOC_WCD_IRQ - CORE_OBJS += wcd-irq.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/soc/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers - endif -endif - -ifeq ($(KERNEL_BUILD), 1) - obj-y += wcd934x/ - obj-y += wcd937x/ - obj-y += wcd938x/ - obj-y += bolero/ -endif -# Module information used by KBuild framework -obj-$(CONFIG_WCD9XXX_CODEC_CORE) += wcd_core_dlkm.o -obj-$(CONFIG_WCD9XXX_CODEC_CORE_V2) += wcd_core_dlkm.o -wcd_core_dlkm-y := $(CORE_OBJS) - -obj-$(CONFIG_SND_SOC_WCD9XXX_V2) += wcd9xxx_dlkm.o -wcd9xxx_dlkm-y := $(WCD9XXX_OBJS) - -obj-$(CONFIG_SND_SOC_WCD9335) += wcd9335_dlkm.o -wcd9335_dlkm-y := $(WCD9335_OBJS) - -obj-$(CONFIG_SND_SOC_WSA881X) += wsa881x_dlkm.o -wsa881x_dlkm-y := $(WSA881X_OBJS) - -obj-$(CONFIG_SND_SOC_MSM_STUB) += stub_dlkm.o -stub_dlkm-y := $(STUB_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_CPE) += wcd_cpe_dlkm.o -wcd_cpe_dlkm-y := $(WCD_CPE_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_SPI) += wcd_spi_dlkm.o -wcd_spi_dlkm-y := $(SPI_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_MBHC) += mbhc_dlkm.o -mbhc_dlkm-y := $(MBHC_OBJS) - -obj-$(CONFIG_SND_SOC_MSM_HDMI_CODEC_RX) += hdmi_dlkm.o -hdmi_dlkm-y := $(HDMICODEC_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.c b/techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.c deleted file mode 100644 index 804d72075c84..000000000000 --- a/techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.c +++ /dev/null @@ -1,629 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "../../../drivers/clk/qcom/common.h" -#include -#include -#include -#include -#include "audio-ext-clk-up.h" - -enum { - AUDIO_EXT_CLK_PMI, - AUDIO_EXT_CLK_LNBB2, - AUDIO_EXT_CLK_LPASS, - AUDIO_EXT_CLK_LPASS2, - AUDIO_EXT_CLK_LPASS3, - AUDIO_EXT_CLK_LPASS4, - AUDIO_EXT_CLK_LPASS5, - AUDIO_EXT_CLK_LPASS6, - AUDIO_EXT_CLK_LPASS7, - AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE, - AUDIO_EXT_CLK_LPASS8, - AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE, - AUDIO_EXT_CLK_LPASS_MAX, - AUDIO_EXT_CLK_EXTERNAL_PLL = AUDIO_EXT_CLK_LPASS_MAX, - AUDIO_EXT_CLK_MAX, -}; - -struct pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *sleep; - struct pinctrl_state *active; - char __iomem *base; -}; - -struct audio_ext_clk { - struct pinctrl_info pnctrl_info; - struct clk_fixed_factor fact; -}; - -struct audio_ext_clk_priv { - struct device *dev; - int clk_src; - struct afe_clk_set clk_cfg; - struct audio_ext_clk audio_clk; - const char *clk_name; - uint32_t lpass_core_hwvote_client_handle; - uint32_t lpass_audio_hwvote_client_handle; -}; - -static inline struct audio_ext_clk_priv *to_audio_clk(struct clk_hw *hw) -{ - return container_of(hw, struct audio_ext_clk_priv, audio_clk.fact.hw); -} - -static int audio_ext_clk_prepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - int ret; - - if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && - (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { - clk_priv->clk_cfg.enable = 1; - trace_printk("%s: vote for %d clock\n", - __func__, clk_priv->clk_src); - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); - if (ret < 0) { - pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", - __func__); - return ret; - } - } - - if (pnctrl_info->pinctrl) { - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->active); - if (ret) { - pr_err("%s: active state select failed with %d\n", - __func__, ret); - return -EIO; - } - } - - if (pnctrl_info->base) - iowrite32(1, pnctrl_info->base); - return 0; -} - -static void audio_ext_clk_unprepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - int ret; - - if (pnctrl_info->pinctrl) { - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) { - pr_err("%s: active state select failed with %d\n", - __func__, ret); - return; - } - } - - if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && - (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { - clk_priv->clk_cfg.enable = 0; - trace_printk("%s: unvote for %d clock\n", - __func__, clk_priv->clk_src); - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); - if (ret < 0) - pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", - __func__, ret); - } - - if (pnctrl_info->base) - iowrite32(0, pnctrl_info->base); -} - -static u8 audio_ext_clk_get_parent(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - int num_parents = clk_hw_get_num_parents(hw); - const char * const *parent_names = hw->init->parent_names; - u8 i = 0, ret = hw->init->num_parents + 1; - - if ((clk_priv->clk_src == AUDIO_EXT_CLK_PMI) && clk_priv->clk_name) { - for (i = 0; i < num_parents; i++) { - if (!strcmp(parent_names[i], clk_priv->clk_name)) - ret = i; - } - pr_debug("%s: parent index = %u\n", __func__, ret); - return ret; - } else - return 0; -} - -static int lpass_hw_vote_prepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - int ret; - - if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { - trace_printk("%s: vote for %d clock\n", - __func__, clk_priv->clk_src); - ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_MACRO_BLOCK, - "LPASS_HW_MACRO", - &clk_priv->lpass_core_hwvote_client_handle); - if (ret < 0) { - pr_err("%s lpass core hw vote failed %d\n", - __func__, ret); - return ret; - } - } - - if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE) { - trace_printk("%s: vote for %d clock\n", - __func__, clk_priv->clk_src); - ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_DCODEC_BLOCK, - "LPASS_HW_DCODEC", - &clk_priv->lpass_audio_hwvote_client_handle); - if (ret < 0) { - pr_err("%s lpass audio hw vote failed %d\n", - __func__, ret); - return ret; - } - } - - return 0; -} - -static void lpass_hw_vote_unprepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - int ret = 0; - - if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { - trace_printk("%s: unvote for %d clock\n", - __func__, clk_priv->clk_src); - ret = afe_unvote_lpass_core_hw( - AFE_LPASS_CORE_HW_MACRO_BLOCK, - clk_priv->lpass_core_hwvote_client_handle); - if (ret < 0) { - pr_err("%s lpass core hw vote failed %d\n", - __func__, ret); - } - } - - if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE) { - trace_printk("%s: unvote for %d clock\n", - __func__, clk_priv->clk_src); - ret = afe_unvote_lpass_core_hw( - AFE_LPASS_CORE_HW_DCODEC_BLOCK, - clk_priv->lpass_audio_hwvote_client_handle); - if (ret < 0) { - pr_err("%s lpass audio hw unvote failed %d\n", - __func__, ret); - } - } -} - -static const struct clk_ops audio_ext_clk_ops = { - .prepare = audio_ext_clk_prepare, - .unprepare = audio_ext_clk_unprepare, - .get_parent = audio_ext_clk_get_parent, -}; - -static const struct clk_ops lpass_hw_vote_ops = { - .prepare = lpass_hw_vote_prepare, - .unprepare = lpass_hw_vote_unprepare, -}; - -static const char * const audio_ext_pmi_div_clk[] = { - "qpnp_clkdiv_1", - "pms405_div_clk1", - "pm6150_div_clk1", - "pm6125_div_clk1", -}; - -static int audio_ext_clk_dummy_prepare(struct clk_hw *hw) -{ - return 0; -} - -static void audio_ext_clk_dummy_unprepare(struct clk_hw *hw) -{ - -} - -static const struct clk_ops audio_ext_clk_dummy_ops = { - .prepare = audio_ext_clk_dummy_prepare, - .unprepare = audio_ext_clk_dummy_unprepare, -}; - -static struct audio_ext_clk audio_clk_array[] = { - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_ext_pmi_clk", - .parent_names = audio_ext_pmi_div_clk, - .num_parents = - ARRAY_SIZE(audio_ext_pmi_div_clk), - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_ext_pmi_lnbb_clk", - .parent_names = (const char *[]) - { "ln_bb_clk2" }, - .num_parents = 1, - .ops = &audio_ext_clk_dummy_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk2", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk3", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk4", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk5", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk6", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk7", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .hw.init = &(struct clk_init_data){ - .name = "lpass_hw_vote_clk", - .ops = &lpass_hw_vote_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk8", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .hw.init = &(struct clk_init_data){ - .name = "lpass_audio_hw_vote_clk", - .ops = &lpass_hw_vote_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_external_pll_clk", - .ops = &audio_ext_clk_ops, - }, - }, - }, -}; - -static int audio_get_pinctrl(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev); - struct pinctrl_info *pnctrl_info; - struct pinctrl *pinctrl; - int ret; - u32 reg; - - pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - if (pnctrl_info->pinctrl) { - dev_err(dev, "%s: already requested before\n", - __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(dev); - if (IS_ERR_OR_NULL(pinctrl)) { - dev_err(dev, "%s: Unable to get pinctrl handle\n", - __func__); - return -EINVAL; - } - pnctrl_info->pinctrl = pinctrl; - /* get all state handles from Device Tree */ - pnctrl_info->sleep = pinctrl_lookup_state(pinctrl, "sleep"); - if (IS_ERR(pnctrl_info->sleep)) { - dev_err(dev, "%s: could not get sleep pinstate\n", - __func__); - goto err; - } - pnctrl_info->active = pinctrl_lookup_state(pinctrl, "active"); - if (IS_ERR(pnctrl_info->active)) { - dev_err(dev, "%s: could not get active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) { - dev_err(dev, "%s: Disable TLMM pins failed with %d\n", - __func__, ret); - goto err; - } - - ret = of_property_read_u32(dev->of_node, "qcom,mclk-clk-reg", ®); - if (ret < 0) { - dev_dbg(dev, "%s: miss mclk reg\n", __func__); - } else { - pnctrl_info->base = ioremap(reg, sizeof(u32)); - if (pnctrl_info->base == NULL) { - dev_err(dev, "%s ioremap failed\n", __func__); - goto err; - } - } - - return 0; - -err: - devm_pinctrl_put(pnctrl_info->pinctrl); - return -EINVAL; -} - -static int audio_put_pinctrl(struct platform_device *pdev) -{ - struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev); - struct pinctrl_info *pnctrl_info = NULL; - - pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - if (pnctrl_info && pnctrl_info->pinctrl) { - devm_pinctrl_put(pnctrl_info->pinctrl); - pnctrl_info->pinctrl = NULL; - } - - return 0; -} - -static int audio_get_clk_data(struct platform_device *pdev) -{ - int ret; - struct clk *audio_clk; - struct clk_hw *clkhw; - struct clk_onecell_data *clk_data; - struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev); - - clk_data = devm_kzalloc(&pdev->dev, sizeof(*clk_data), GFP_KERNEL); - if (!clk_data) - return -ENOMEM; - - clk_data->clk_num = 1; - clk_data->clks = devm_kzalloc(&pdev->dev, - sizeof(struct clk *), - GFP_KERNEL); - if (!clk_data->clks) - return -ENOMEM; - - clkhw = &clk_priv->audio_clk.fact.hw; - audio_clk = devm_clk_register(&pdev->dev, clkhw); - if (IS_ERR(audio_clk)) { - dev_err(&pdev->dev, - "%s: clock register failed for clk_src = %d\\n", - __func__, clk_priv->clk_src); - ret = PTR_ERR(audio_clk); - return ret; - } - clk_data->clks[0] = audio_clk; - - ret = of_clk_add_provider(pdev->dev.of_node, - of_clk_src_onecell_get, clk_data); - if (ret) - dev_err(&pdev->dev, "%s: clock add failed for clk_src = %d\n", - __func__, clk_priv->clk_src); - - return ret; -} - -static int audio_ref_clk_probe(struct platform_device *pdev) -{ - int ret; - struct audio_ext_clk_priv *clk_priv; - u32 clk_freq = 0, clk_id = 0, clk_src = 0, use_pinctrl = 0; - - clk_priv = devm_kzalloc(&pdev->dev, sizeof(*clk_priv), GFP_KERNEL); - if (!clk_priv) - return -ENOMEM; - - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-ext-clk-src", - &clk_src); - if (ret) { - dev_err(&pdev->dev, "%s: could not get clk source, ret = %d\n", - __func__, ret); - return ret; - } - - if (clk_src >= AUDIO_EXT_CLK_MAX) { - dev_err(&pdev->dev, "%s: Invalid clk source = %d\n", - __func__, clk_src); - return -EINVAL; - } - clk_priv->clk_name = NULL; - clk_priv->clk_src = clk_src; - memcpy(&clk_priv->audio_clk, &audio_clk_array[clk_src], - sizeof(struct audio_ext_clk)); - - /* Init lpass clk default values */ - clk_priv->clk_cfg.clk_set_minor_version = - Q6AFE_LPASS_CLK_CONFIG_API_VERSION; - clk_priv->clk_cfg.clk_id = Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR; - clk_priv->clk_cfg.clk_freq_in_hz = Q6AFE_LPASS_OSR_CLK_9_P600_MHZ; - clk_priv->clk_cfg.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; - - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-lpass-ext-clk-freq", - &clk_freq); - if (!ret) - clk_priv->clk_cfg.clk_freq_in_hz = clk_freq; - - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-lpass-clk-id", - &clk_id); - if (!ret) - clk_priv->clk_cfg.clk_id = clk_id; - - dev_dbg(&pdev->dev, "%s: ext-clk freq: %d, lpass clk_id: %d, clk_src: %d\n", - __func__, clk_priv->clk_cfg.clk_freq_in_hz, - clk_priv->clk_cfg.clk_id, clk_priv->clk_src); - platform_set_drvdata(pdev, clk_priv); - - ret = of_property_read_string(pdev->dev.of_node, "pmic-clock-names", - &clk_priv->clk_name); - if (ret) - dev_dbg(&pdev->dev, "%s: could not find pmic clock names\n", - __func__); - /* - * property qcom,use-pinctrl to be defined in DTSI to val 1 - * for clock nodes using pinctrl - */ - of_property_read_u32(pdev->dev.of_node, "qcom,use-pinctrl", - &use_pinctrl); - dev_dbg(&pdev->dev, "%s: use-pinctrl : %d\n", - __func__, use_pinctrl); - - if (use_pinctrl) { - ret = audio_get_pinctrl(pdev); - if (ret) { - dev_err(&pdev->dev, "%s: Parsing PMI pinctrl failed\n", - __func__); - return ret; - } - } - - ret = audio_get_clk_data(pdev); - if (ret) { - dev_err(&pdev->dev, "%s: clk_init is failed\n", - __func__); - audio_put_pinctrl(pdev); - return ret; - } - return 0; -} - -static int audio_ref_clk_remove(struct platform_device *pdev) -{ - audio_put_pinctrl(pdev); - - return 0; -} - -static const struct of_device_id audio_ref_clk_match[] = { - {.compatible = "qcom,audio-ref-clk"}, - {} -}; -MODULE_DEVICE_TABLE(of, audio_ref_clk_match); - -static struct platform_driver audio_ref_clk_driver = { - .driver = { - .name = "audio-ref-clk", - .owner = THIS_MODULE, - .of_match_table = audio_ref_clk_match, - .suppress_bind_attrs = true, - }, - .probe = audio_ref_clk_probe, - .remove = audio_ref_clk_remove, -}; - -int audio_ref_clk_platform_init(void) -{ - return platform_driver_register(&audio_ref_clk_driver); -} - -void audio_ref_clk_platform_exit(void) -{ - platform_driver_unregister(&audio_ref_clk_driver); -} - -MODULE_DESCRIPTION("Audio Ref Up Clock module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.h b/techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.h deleted file mode 100644 index e7c195405ed4..000000000000 --- a/techpack/audio/4.0/asoc/codecs/audio-ext-clk-up.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. - */ - -#ifndef __AUDIO_EXT_CLK_UP_H_ -#define __AUDIO_EXT_CLK_UP_H_ - -int audio_ref_clk_platform_init(void); -void audio_ref_clk_platform_exit(void); - -#endif diff --git a/techpack/audio/4.0/asoc/codecs/audio-ext-clk.c b/techpack/audio/4.0/asoc/codecs/audio-ext-clk.c deleted file mode 100644 index adcd7a6ee6b0..000000000000 --- a/techpack/audio/4.0/asoc/codecs/audio-ext-clk.c +++ /dev/null @@ -1,341 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2017, 2019 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio-ext-clk-up.h" - -struct pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *sleep; - struct pinctrl_state *active; -}; - -struct audio_ext_ap_clk { - bool enabled; - int gpio; - struct clk c; -}; - -struct audio_ext_pmi_clk { - int gpio; - struct clk c; -}; - -struct audio_ext_ap_clk2 { - bool enabled; - struct pinctrl_info pnctrl_info; - struct clk c; -}; - -static struct afe_clk_set clk2_config = { - Q6AFE_LPASS_CLK_CONFIG_API_VERSION, - Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR, - Q6AFE_LPASS_IBIT_CLK_11_P2896_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, -}; - -static inline struct audio_ext_ap_clk *to_audio_ap_clk(struct clk *clk) -{ - return container_of(clk, struct audio_ext_ap_clk, c); -} - -static int audio_ext_clk_prepare(struct clk *clk) -{ - struct audio_ext_ap_clk *audio_clk = to_audio_ap_clk(clk); - - pr_debug("%s: gpio: %d\n", __func__, audio_clk->gpio); - if (gpio_is_valid(audio_clk->gpio)) - return gpio_direction_output(audio_clk->gpio, 1); - return 0; -} - -static void audio_ext_clk_unprepare(struct clk *clk) -{ - struct audio_ext_ap_clk *audio_clk = to_audio_ap_clk(clk); - - pr_debug("%s: gpio: %d\n", __func__, audio_clk->gpio); - if (gpio_is_valid(audio_clk->gpio)) - gpio_direction_output(audio_clk->gpio, 0); -} - -static inline struct audio_ext_ap_clk2 *to_audio_ap_clk2(struct clk *clk) -{ - return container_of(clk, struct audio_ext_ap_clk2, c); -} - -static int audio_ext_clk2_prepare(struct clk *clk) -{ - struct audio_ext_ap_clk2 *audio_clk2 = to_audio_ap_clk2(clk); - struct pinctrl_info *pnctrl_info = &audio_clk2->pnctrl_info; - int ret; - - - if (!pnctrl_info->pinctrl || !pnctrl_info->active) - return 0; - - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->active); - if (ret) { - pr_err("%s: active state select failed with %d\n", - __func__, ret); - return -EIO; - } - - clk2_config.enable = 1; - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk2_config); - if (ret < 0) { - pr_err("%s: failed to set clock, ret = %d\n", __func__, ret); - return -EINVAL; - } - - return 0; -} - -static void audio_ext_clk2_unprepare(struct clk *clk) -{ - struct audio_ext_ap_clk2 *audio_clk2 = to_audio_ap_clk2(clk); - struct pinctrl_info *pnctrl_info = &audio_clk2->pnctrl_info; - int ret; - - if (!pnctrl_info->pinctrl || !pnctrl_info->sleep) - return; - - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) - pr_err("%s: sleep state select failed with %d\n", - __func__, ret); - - clk2_config.enable = 0; - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk2_config); - if (ret < 0) - pr_err("%s: failed to reset clock, ret = %d\n", __func__, ret); -} - -static const struct clk_ops audio_ext_ap_clk_ops = { - .prepare = audio_ext_clk_prepare, - .unprepare = audio_ext_clk_unprepare, -}; - -static const struct clk_ops audio_ext_ap_clk2_ops = { - .prepare = audio_ext_clk2_prepare, - .unprepare = audio_ext_clk2_unprepare, -}; - -static struct audio_ext_pmi_clk audio_pmi_clk = { - .gpio = -EINVAL, - .c = { - .dbg_name = "audio_ext_pmi_clk", - .ops = &clk_ops_dummy, - CLK_INIT(audio_pmi_clk.c), - }, -}; - -static struct audio_ext_pmi_clk audio_pmi_lnbb_clk = { - .gpio = -EINVAL, - .c = { - .dbg_name = "audio_ext_pmi_lnbb_clk", - .ops = &clk_ops_dummy, - CLK_INIT(audio_pmi_lnbb_clk.c), - }, -}; - -static struct audio_ext_ap_clk audio_ap_clk = { - .gpio = -EINVAL, - .c = { - .dbg_name = "audio_ext_ap_clk", - .ops = &audio_ext_ap_clk_ops, - CLK_INIT(audio_ap_clk.c), - }, -}; - -static struct audio_ext_ap_clk2 audio_ap_clk2 = { - .c = { - .dbg_name = "audio_ext_ap_clk2", - .ops = &audio_ext_ap_clk2_ops, - CLK_INIT(audio_ap_clk2.c), - }, -}; - -static struct clk_lookup audio_ref_clock[] = { - CLK_LIST(audio_ap_clk), - CLK_LIST(audio_pmi_clk), - CLK_LIST(audio_pmi_lnbb_clk), - CLK_LIST(audio_ap_clk2), -}; - -static int audio_get_pinctrl(struct platform_device *pdev) -{ - struct pinctrl_info *pnctrl_info; - struct pinctrl *pinctrl; - int ret; - - pnctrl_info = &audio_ap_clk2.pnctrl_info; - - if (pnctrl_info->pinctrl) { - dev_dbg(&pdev->dev, "%s: already requested before\n", - __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(pinctrl)) { - dev_dbg(&pdev->dev, "%s: Unable to get pinctrl handle\n", - __func__); - return -EINVAL; - } - pnctrl_info->pinctrl = pinctrl; - /* get all state handles from Device Tree */ - pnctrl_info->sleep = pinctrl_lookup_state(pinctrl, "sleep"); - if (IS_ERR(pnctrl_info->sleep)) { - dev_err(&pdev->dev, "%s: could not get sleep pinstate\n", - __func__); - goto err; - } - pnctrl_info->active = pinctrl_lookup_state(pinctrl, "active"); - if (IS_ERR(pnctrl_info->active)) { - dev_err(&pdev->dev, "%s: could not get active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) { - dev_err(&pdev->dev, "%s: Disable TLMM pins failed with %d\n", - __func__, ret); - goto err; - } - return 0; - -err: - devm_pinctrl_put(pnctrl_info->pinctrl); - return -EINVAL; -} - -static int audio_ref_clk_probe(struct platform_device *pdev) -{ - int clk_gpio; - int ret; - struct clk *audio_clk; - - clk_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,audio-ref-clk-gpio", 0); - if (clk_gpio > 0) { - ret = gpio_request(clk_gpio, "EXT_CLK"); - if (ret) { - dev_err(&pdev->dev, - "Request ext clk gpio failed %d, err:%d\n", - clk_gpio, ret); - goto err; - } - if (of_property_read_bool(pdev->dev.of_node, - "qcom,node_has_rpm_clock")) { - audio_clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(audio_clk)) { - dev_err(&pdev->dev, "Failed to get RPM div clk\n"); - ret = PTR_ERR(audio_clk); - goto err_gpio; - } - audio_pmi_clk.c.parent = audio_clk; - audio_pmi_clk.gpio = clk_gpio; - } else - audio_ap_clk.gpio = clk_gpio; - - } else { - if (of_property_read_bool(pdev->dev.of_node, - "qcom,node_has_rpm_clock")) { - audio_clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(audio_clk)) { - dev_err(&pdev->dev, "Failed to get lnbbclk2\n"); - ret = PTR_ERR(audio_clk); - goto err; - } - audio_pmi_lnbb_clk.c.parent = audio_clk; - audio_pmi_lnbb_clk.gpio = -EINVAL; - } - } - - ret = audio_get_pinctrl(pdev); - if (ret) - dev_dbg(&pdev->dev, "%s: Parsing pinctrl failed\n", - __func__); - - ret = of_msm_clock_register(pdev->dev.of_node, audio_ref_clock, - ARRAY_SIZE(audio_ref_clock)); - if (ret) { - dev_err(&pdev->dev, "%s: audio ref clock register failed\n", - __func__); - goto err_gpio; - } - - return 0; - -err_gpio: - gpio_free(clk_gpio); - -err: - return ret; -} - -static int audio_ref_clk_remove(struct platform_device *pdev) -{ - struct pinctrl_info *pnctrl_info = &audio_ap_clk2.pnctrl_info; - - if (audio_pmi_clk.gpio > 0) - gpio_free(audio_pmi_clk.gpio); - else if (audio_ap_clk.gpio > 0) - gpio_free(audio_ap_clk.gpio); - - if (pnctrl_info->pinctrl) { - devm_pinctrl_put(pnctrl_info->pinctrl); - pnctrl_info->pinctrl = NULL; - } - - return 0; -} - -static const struct of_device_id audio_ref_clk_match[] = { - {.compatible = "qcom,audio-ref-clk"}, - {} -}; -MODULE_DEVICE_TABLE(of, audio_ref_clk_match); - -static struct platform_driver audio_ref_clk_driver = { - .driver = { - .name = "audio-ref-clk", - .owner = THIS_MODULE, - .of_match_table = audio_ref_clk_match, - .suppress_bind_attrs = true, - }, - .probe = audio_ref_clk_probe, - .remove = audio_ref_clk_remove, -}; - -int audio_ref_clk_platform_init(void) -{ - return platform_driver_register(&audio_ref_clk_driver); -} - -void audio_ref_clk_platform_exit(void) -{ - platform_driver_unregister(&audio_ref_clk_driver); -} - -MODULE_DESCRIPTION("Audio Ref Clock module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/bolero/Android.mk b/techpack/audio/4.0/asoc/codecs/bolero/Android.mk deleted file mode 100644 index 47791b4eb1be..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/Android.mk +++ /dev/null @@ -1,94 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=bolero_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_bolero_cdc.ko -LOCAL_MODULE_KBUILD_NAME := bolero_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa_macro.ko -LOCAL_MODULE_KBUILD_NAME := wsa_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_va_macro.ko -LOCAL_MODULE_KBUILD_NAME := va_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_tx_macro.ko -LOCAL_MODULE_KBUILD_NAME := tx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_rx_macro.ko -LOCAL_MODULE_KBUILD_NAME := rx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/asoc/codecs/bolero/Kbuild b/techpack/audio/4.0/asoc/codecs/bolero/Kbuild deleted file mode 100644 index 0997fc4699d1..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/Kbuild +++ /dev/null @@ -1,168 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.19 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ BOLERO ############ - -# for BOLERO Codec -ifdef CONFIG_SND_SOC_BOLERO - BOLERO_OBJS += bolero-cdc.o - BOLERO_OBJS += bolero-cdc-utils.o - BOLERO_OBJS += bolero-cdc-regmap.o - BOLERO_OBJS += bolero-cdc-tables.o - BOLERO_OBJS += bolero-clk-rsc.o -endif - -ifdef CONFIG_WSA_MACRO - WSA_OBJS += wsa-macro.o -endif - -ifdef CONFIG_VA_MACRO - VA_OBJS += va-macro.o -endif - -ifdef CONFIG_TX_MACRO - TX_OBJS += tx-macro.o -endif - -ifdef CONFIG_RX_MACRO - RX_OBJS += rx-macro.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/ipc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/soc/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers - endif -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_BOLERO) += bolero_cdc_dlkm.o -bolero_cdc_dlkm-y := $(BOLERO_OBJS) - -obj-$(CONFIG_WSA_MACRO) += wsa_macro_dlkm.o -wsa_macro_dlkm-y := $(WSA_OBJS) - -obj-$(CONFIG_VA_MACRO) += va_macro_dlkm.o -va_macro_dlkm-y := $(VA_OBJS) - -obj-$(CONFIG_TX_MACRO) += tx_macro_dlkm.o -tx_macro_dlkm-y := $(TX_OBJS) - -obj-$(CONFIG_RX_MACRO) += rx_macro_dlkm.o -rx_macro_dlkm-y := $(RX_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-registers.h b/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-registers.h deleted file mode 100644 index edfc784e31de..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-registers.h +++ /dev/null @@ -1,838 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _BOLERO_CDC_REGISTERS_H -#define _BOLERO_CDC_REGISTERS_H - -#define TX_START_OFFSET 0x0000 - -#define BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL (TX_START_OFFSET + 0x0000) -#define BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL (TX_START_OFFSET + 0x0004) -#define BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL (TX_START_OFFSET + 0x0008) -#define BOLERO_CDC_TX_TOP_CSR_TOP_CFG0 (TX_START_OFFSET + 0x0080) -#define BOLERO_CDC_TX_TOP_CSR_ANC_CFG (TX_START_OFFSET + 0x0084) -#define BOLERO_CDC_TX_TOP_CSR_SWR_CTRL (TX_START_OFFSET + 0x0088) -#define BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK (TX_START_OFFSET + 0x0090) -#define BOLERO_CDC_TX_TOP_CSR_DEBUG_BUS (TX_START_OFFSET + 0x0094) -#define BOLERO_CDC_TX_TOP_CSR_DEBUG_EN (TX_START_OFFSET + 0x0098) -#define BOLERO_CDC_TX_TOP_CSR_TX_I2S_CTL (TX_START_OFFSET + 0x00A4) -#define BOLERO_CDC_TX_TOP_CSR_I2S_CLK (TX_START_OFFSET + 0x00A8) -#define BOLERO_CDC_TX_TOP_CSR_I2S_RESET (TX_START_OFFSET + 0x00AC) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL (TX_START_OFFSET + 0x00C0) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL (TX_START_OFFSET + 0x00C4) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL (TX_START_OFFSET + 0x00C8) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL (TX_START_OFFSET + 0x00CC) -#define BOLERO_CDC_TX_TOP_CSR_SWR_AMIC0_CTL (TX_START_OFFSET + 0x00D0) -#define BOLERO_CDC_TX_TOP_CSR_SWR_AMIC1_CTL (TX_START_OFFSET + 0x00D4) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 (TX_START_OFFSET + 0x0100) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 (TX_START_OFFSET + 0x0104) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0 (TX_START_OFFSET + 0x0108) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1 (TX_START_OFFSET + 0x010C) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0 (TX_START_OFFSET + 0x0110) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1 (TX_START_OFFSET + 0x0114) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0 (TX_START_OFFSET + 0x0118) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1 (TX_START_OFFSET + 0x011C) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0 (TX_START_OFFSET + 0x0120) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1 (TX_START_OFFSET + 0x0124) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0 (TX_START_OFFSET + 0x0128) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1 (TX_START_OFFSET + 0x012C) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0 (TX_START_OFFSET + 0x0130) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1 (TX_START_OFFSET + 0x0134) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0 (TX_START_OFFSET + 0x0138) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1 (TX_START_OFFSET + 0x013C) -#define BOLERO_CDC_TX_ANC0_CLK_RESET_CTL (TX_START_OFFSET + 0x0200) -#define BOLERO_CDC_TX_ANC0_MODE_1_CTL (TX_START_OFFSET + 0x0204) -#define BOLERO_CDC_TX_ANC0_MODE_2_CTL (TX_START_OFFSET + 0x0208) -#define BOLERO_CDC_TX_ANC0_FF_SHIFT (TX_START_OFFSET + 0x020C) -#define BOLERO_CDC_TX_ANC0_FB_SHIFT (TX_START_OFFSET + 0x0210) -#define BOLERO_CDC_TX_ANC0_LPF_FF_A_CTL (TX_START_OFFSET + 0x0214) -#define BOLERO_CDC_TX_ANC0_LPF_FF_B_CTL (TX_START_OFFSET + 0x0218) -#define BOLERO_CDC_TX_ANC0_LPF_FB_CTL (TX_START_OFFSET + 0x021C) -#define BOLERO_CDC_TX_ANC0_SMLPF_CTL (TX_START_OFFSET + 0x0220) -#define BOLERO_CDC_TX_ANC0_DCFLT_SHIFT_CTL (TX_START_OFFSET + 0x0224) -#define BOLERO_CDC_TX_ANC0_IIR_ADAPT_CTL (TX_START_OFFSET + 0x0228) -#define BOLERO_CDC_TX_ANC0_IIR_COEFF_1_CTL (TX_START_OFFSET + 0x022C) -#define BOLERO_CDC_TX_ANC0_IIR_COEFF_2_CTL (TX_START_OFFSET + 0x0230) -#define BOLERO_CDC_TX_ANC0_FF_A_GAIN_CTL (TX_START_OFFSET + 0x0234) -#define BOLERO_CDC_TX_ANC0_FF_B_GAIN_CTL (TX_START_OFFSET + 0x0238) -#define BOLERO_CDC_TX_ANC0_FB_GAIN_CTL (TX_START_OFFSET + 0x023C) -#define BOLERO_CDC_TX0_TX_PATH_CTL (TX_START_OFFSET + 0x0400) -#define BOLERO_CDC_TX0_TX_PATH_CFG0 (TX_START_OFFSET + 0x0404) -#define BOLERO_CDC_TX0_TX_PATH_CFG1 (TX_START_OFFSET + 0x0408) -#define BOLERO_CDC_TX0_TX_VOL_CTL (TX_START_OFFSET + 0x040C) -#define BOLERO_CDC_TX0_TX_PATH_SEC0 (TX_START_OFFSET + 0x0410) -#define BOLERO_CDC_TX0_TX_PATH_SEC1 (TX_START_OFFSET + 0x0414) -#define BOLERO_CDC_TX0_TX_PATH_SEC2 (TX_START_OFFSET + 0x0418) -#define BOLERO_CDC_TX0_TX_PATH_SEC3 (TX_START_OFFSET + 0x041C) -#define BOLERO_CDC_TX0_TX_PATH_SEC4 (TX_START_OFFSET + 0x0420) -#define BOLERO_CDC_TX0_TX_PATH_SEC5 (TX_START_OFFSET + 0x0424) -#define BOLERO_CDC_TX0_TX_PATH_SEC6 (TX_START_OFFSET + 0x0428) -#define BOLERO_CDC_TX0_TX_PATH_SEC7 (TX_START_OFFSET + 0x042C) -#define BOLERO_CDC_TX1_TX_PATH_CTL (TX_START_OFFSET + 0x0480) -#define BOLERO_CDC_TX1_TX_PATH_CFG0 (TX_START_OFFSET + 0x0484) -#define BOLERO_CDC_TX1_TX_PATH_CFG1 (TX_START_OFFSET + 0x0488) -#define BOLERO_CDC_TX1_TX_VOL_CTL (TX_START_OFFSET + 0x048C) -#define BOLERO_CDC_TX1_TX_PATH_SEC0 (TX_START_OFFSET + 0x0490) -#define BOLERO_CDC_TX1_TX_PATH_SEC1 (TX_START_OFFSET + 0x0494) -#define BOLERO_CDC_TX1_TX_PATH_SEC2 (TX_START_OFFSET + 0x0498) -#define BOLERO_CDC_TX1_TX_PATH_SEC3 (TX_START_OFFSET + 0x049C) -#define BOLERO_CDC_TX1_TX_PATH_SEC4 (TX_START_OFFSET + 0x04A0) -#define BOLERO_CDC_TX1_TX_PATH_SEC5 (TX_START_OFFSET + 0x04A4) -#define BOLERO_CDC_TX1_TX_PATH_SEC6 (TX_START_OFFSET + 0x04A8) -#define BOLERO_CDC_TX2_TX_PATH_CTL (TX_START_OFFSET + 0x0500) -#define BOLERO_CDC_TX2_TX_PATH_CFG0 (TX_START_OFFSET + 0x0504) -#define BOLERO_CDC_TX2_TX_PATH_CFG1 (TX_START_OFFSET + 0x0508) -#define BOLERO_CDC_TX2_TX_VOL_CTL (TX_START_OFFSET + 0x050C) -#define BOLERO_CDC_TX2_TX_PATH_SEC0 (TX_START_OFFSET + 0x0510) -#define BOLERO_CDC_TX2_TX_PATH_SEC1 (TX_START_OFFSET + 0x0514) -#define BOLERO_CDC_TX2_TX_PATH_SEC2 (TX_START_OFFSET + 0x0518) -#define BOLERO_CDC_TX2_TX_PATH_SEC3 (TX_START_OFFSET + 0x051C) -#define BOLERO_CDC_TX2_TX_PATH_SEC4 (TX_START_OFFSET + 0x0520) -#define BOLERO_CDC_TX2_TX_PATH_SEC5 (TX_START_OFFSET + 0x0524) -#define BOLERO_CDC_TX2_TX_PATH_SEC6 (TX_START_OFFSET + 0x0528) -#define BOLERO_CDC_TX3_TX_PATH_CTL (TX_START_OFFSET + 0x0580) -#define BOLERO_CDC_TX3_TX_PATH_CFG0 (TX_START_OFFSET + 0x0584) -#define BOLERO_CDC_TX3_TX_PATH_CFG1 (TX_START_OFFSET + 0x0588) -#define BOLERO_CDC_TX3_TX_VOL_CTL (TX_START_OFFSET + 0x058C) -#define BOLERO_CDC_TX3_TX_PATH_SEC0 (TX_START_OFFSET + 0x0590) -#define BOLERO_CDC_TX3_TX_PATH_SEC1 (TX_START_OFFSET + 0x0594) -#define BOLERO_CDC_TX3_TX_PATH_SEC2 (TX_START_OFFSET + 0x0598) -#define BOLERO_CDC_TX3_TX_PATH_SEC3 (TX_START_OFFSET + 0x059C) -#define BOLERO_CDC_TX3_TX_PATH_SEC4 (TX_START_OFFSET + 0x05A0) -#define BOLERO_CDC_TX3_TX_PATH_SEC5 (TX_START_OFFSET + 0x05A4) -#define BOLERO_CDC_TX3_TX_PATH_SEC6 (TX_START_OFFSET + 0x05A8) -#define BOLERO_CDC_TX4_TX_PATH_CTL (TX_START_OFFSET + 0x0600) -#define BOLERO_CDC_TX4_TX_PATH_CFG0 (TX_START_OFFSET + 0x0604) -#define BOLERO_CDC_TX4_TX_PATH_CFG1 (TX_START_OFFSET + 0x0608) -#define BOLERO_CDC_TX4_TX_VOL_CTL (TX_START_OFFSET + 0x060C) -#define BOLERO_CDC_TX4_TX_PATH_SEC0 (TX_START_OFFSET + 0x0610) -#define BOLERO_CDC_TX4_TX_PATH_SEC1 (TX_START_OFFSET + 0x0614) -#define BOLERO_CDC_TX4_TX_PATH_SEC2 (TX_START_OFFSET + 0x0618) -#define BOLERO_CDC_TX4_TX_PATH_SEC3 (TX_START_OFFSET + 0x061C) -#define BOLERO_CDC_TX4_TX_PATH_SEC4 (TX_START_OFFSET + 0x0620) -#define BOLERO_CDC_TX4_TX_PATH_SEC5 (TX_START_OFFSET + 0x0624) -#define BOLERO_CDC_TX4_TX_PATH_SEC6 (TX_START_OFFSET + 0x0628) -#define BOLERO_CDC_TX5_TX_PATH_CTL (TX_START_OFFSET + 0x0680) -#define BOLERO_CDC_TX5_TX_PATH_CFG0 (TX_START_OFFSET + 0x0684) -#define BOLERO_CDC_TX5_TX_PATH_CFG1 (TX_START_OFFSET + 0x0688) -#define BOLERO_CDC_TX5_TX_VOL_CTL (TX_START_OFFSET + 0x068C) -#define BOLERO_CDC_TX5_TX_PATH_SEC0 (TX_START_OFFSET + 0x0690) -#define BOLERO_CDC_TX5_TX_PATH_SEC1 (TX_START_OFFSET + 0x0694) -#define BOLERO_CDC_TX5_TX_PATH_SEC2 (TX_START_OFFSET + 0x0698) -#define BOLERO_CDC_TX5_TX_PATH_SEC3 (TX_START_OFFSET + 0x069C) -#define BOLERO_CDC_TX5_TX_PATH_SEC4 (TX_START_OFFSET + 0x06A0) -#define BOLERO_CDC_TX5_TX_PATH_SEC5 (TX_START_OFFSET + 0x06A4) -#define BOLERO_CDC_TX5_TX_PATH_SEC6 (TX_START_OFFSET + 0x06A8) -#define BOLERO_CDC_TX6_TX_PATH_CTL (TX_START_OFFSET + 0x0700) -#define BOLERO_CDC_TX6_TX_PATH_CFG0 (TX_START_OFFSET + 0x0704) -#define BOLERO_CDC_TX6_TX_PATH_CFG1 (TX_START_OFFSET + 0x0708) -#define BOLERO_CDC_TX6_TX_VOL_CTL (TX_START_OFFSET + 0x070C) -#define BOLERO_CDC_TX6_TX_PATH_SEC0 (TX_START_OFFSET + 0x0710) -#define BOLERO_CDC_TX6_TX_PATH_SEC1 (TX_START_OFFSET + 0x0714) -#define BOLERO_CDC_TX6_TX_PATH_SEC2 (TX_START_OFFSET + 0x0718) -#define BOLERO_CDC_TX6_TX_PATH_SEC3 (TX_START_OFFSET + 0x071C) -#define BOLERO_CDC_TX6_TX_PATH_SEC4 (TX_START_OFFSET + 0x0720) -#define BOLERO_CDC_TX6_TX_PATH_SEC5 (TX_START_OFFSET + 0x0724) -#define BOLERO_CDC_TX6_TX_PATH_SEC6 (TX_START_OFFSET + 0x0728) -#define BOLERO_CDC_TX7_TX_PATH_CTL (TX_START_OFFSET + 0x0780) -#define BOLERO_CDC_TX7_TX_PATH_CFG0 (TX_START_OFFSET + 0x0784) -#define BOLERO_CDC_TX7_TX_PATH_CFG1 (TX_START_OFFSET + 0x0788) -#define BOLERO_CDC_TX7_TX_VOL_CTL (TX_START_OFFSET + 0x078C) -#define BOLERO_CDC_TX7_TX_PATH_SEC0 (TX_START_OFFSET + 0x0790) -#define BOLERO_CDC_TX7_TX_PATH_SEC1 (TX_START_OFFSET + 0x0794) -#define BOLERO_CDC_TX7_TX_PATH_SEC2 (TX_START_OFFSET + 0x0798) -#define BOLERO_CDC_TX7_TX_PATH_SEC3 (TX_START_OFFSET + 0x079C) -#define BOLERO_CDC_TX7_TX_PATH_SEC4 (TX_START_OFFSET + 0x07A0) -#define BOLERO_CDC_TX7_TX_PATH_SEC5 (TX_START_OFFSET + 0x07A4) -#define BOLERO_CDC_TX7_TX_PATH_SEC6 (TX_START_OFFSET + 0x07A8) -#define TX_MAX_OFFSET (TX_START_OFFSET + 0x07A8) - -#define BOLERO_CDC_TX_MACRO_MAX 0x1EB /* 7A8/4 = 1EA + 1 */ - -#define RX_START_OFFSET 0x1000 -#define BOLERO_CDC_RX_TOP_TOP_CFG0 (RX_START_OFFSET + 0x0000) -#define BOLERO_CDC_RX_TOP_SWR_CTRL (RX_START_OFFSET + 0x0008) -#define BOLERO_CDC_RX_TOP_DEBUG (RX_START_OFFSET + 0x000C) -#define BOLERO_CDC_RX_TOP_DEBUG_BUS (RX_START_OFFSET + 0x0010) -#define BOLERO_CDC_RX_TOP_DEBUG_EN0 (RX_START_OFFSET + 0x0014) -#define BOLERO_CDC_RX_TOP_DEBUG_EN1 (RX_START_OFFSET + 0x0018) -#define BOLERO_CDC_RX_TOP_DEBUG_EN2 (RX_START_OFFSET + 0x001C) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB (RX_START_OFFSET + 0x0020) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB (RX_START_OFFSET + 0x0024) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_LUT (RX_START_OFFSET + 0x0028) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB (RX_START_OFFSET + 0x002C) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB (RX_START_OFFSET + 0x0030) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB (RX_START_OFFSET + 0x0034) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB (RX_START_OFFSET + 0x0038) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_LUT (RX_START_OFFSET + 0x003C) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB (RX_START_OFFSET + 0x0040) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB (RX_START_OFFSET + 0x0044) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG0 (RX_START_OFFSET + 0x0070) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG1 (RX_START_OFFSET + 0x0074) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2 (RX_START_OFFSET + 0x0078) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG3 (RX_START_OFFSET + 0x007C) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG0 (RX_START_OFFSET + 0x0080) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG1 (RX_START_OFFSET + 0x0084) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2 (RX_START_OFFSET + 0x0088) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG3 (RX_START_OFFSET + 0x008C) -#define BOLERO_CDC_RX_TOP_RX_I2S_CTL (RX_START_OFFSET + 0x0090) -#define BOLERO_CDC_RX_TOP_TX_I2S2_CTL (RX_START_OFFSET + 0x0094) -#define BOLERO_CDC_RX_TOP_I2S_CLK (RX_START_OFFSET + 0x0098) -#define BOLERO_CDC_RX_TOP_I2S_RESET (RX_START_OFFSET + 0x009C) -#define BOLERO_CDC_RX_TOP_I2S_MUX (RX_START_OFFSET + 0x00A0) -#define BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL (RX_START_OFFSET + 0x0100) -#define BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL \ - (RX_START_OFFSET + 0x0104) -#define BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL (RX_START_OFFSET + 0x0108) -#define BOLERO_CDC_RX_CLK_RST_CTRL_DSD_CONTROL (RX_START_OFFSET + 0x010C) -#define BOLERO_CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL \ - (RX_START_OFFSET + 0x0110) -#define BOLERO_CDC_RX_SOFTCLIP_CRC (RX_START_OFFSET + 0x0140) -#define BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL (RX_START_OFFSET + 0x0144) -#define BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0 (RX_START_OFFSET + 0x0180) -#define BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1 (RX_START_OFFSET + 0x0184) -#define BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0 (RX_START_OFFSET + 0x0188) -#define BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1 (RX_START_OFFSET + 0x018C) -#define BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0 (RX_START_OFFSET + 0x0190) -#define BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1 (RX_START_OFFSET + 0x0194) -#define BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4 (RX_START_OFFSET + 0x0198) -#define BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5 (RX_START_OFFSET + 0x019C) -#define BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 (RX_START_OFFSET + 0x01A0) -#define BOLERO_CDC_RX_CLSH_CRC (RX_START_OFFSET + 0x0200) -#define BOLERO_CDC_RX_CLSH_DLY_CTRL (RX_START_OFFSET + 0x0204) -#define BOLERO_CDC_RX_CLSH_DECAY_CTRL (RX_START_OFFSET + 0x0208) -#define BOLERO_CDC_RX_CLSH_HPH_V_PA (RX_START_OFFSET + 0x020C) -#define BOLERO_CDC_RX_CLSH_EAR_V_PA (RX_START_OFFSET + 0x0210) -#define BOLERO_CDC_RX_CLSH_HPH_V_HD (RX_START_OFFSET + 0x0214) -#define BOLERO_CDC_RX_CLSH_EAR_V_HD (RX_START_OFFSET + 0x0218) -#define BOLERO_CDC_RX_CLSH_K1_MSB (RX_START_OFFSET + 0x021C) -#define BOLERO_CDC_RX_CLSH_K1_LSB (RX_START_OFFSET + 0x0220) -#define BOLERO_CDC_RX_CLSH_K2_MSB (RX_START_OFFSET + 0x0224) -#define BOLERO_CDC_RX_CLSH_K2_LSB (RX_START_OFFSET + 0x0228) -#define BOLERO_CDC_RX_CLSH_IDLE_CTRL (RX_START_OFFSET + 0x022C) -#define BOLERO_CDC_RX_CLSH_IDLE_HPH (RX_START_OFFSET + 0x0230) -#define BOLERO_CDC_RX_CLSH_IDLE_EAR (RX_START_OFFSET + 0x0234) -#define BOLERO_CDC_RX_CLSH_TEST0 (RX_START_OFFSET + 0x0238) -#define BOLERO_CDC_RX_CLSH_TEST1 (RX_START_OFFSET + 0x023C) -#define BOLERO_CDC_RX_CLSH_OVR_VREF (RX_START_OFFSET + 0x0240) -#define BOLERO_CDC_RX_CLSH_CLSG_CTL (RX_START_OFFSET + 0x0244) -#define BOLERO_CDC_RX_CLSH_CLSG_CFG1 (RX_START_OFFSET + 0x0248) -#define BOLERO_CDC_RX_CLSH_CLSG_CFG2 (RX_START_OFFSET + 0x024C) -#define BOLERO_CDC_RX_BCL_VBAT_PATH_CTL (RX_START_OFFSET + 0x0280) -#define BOLERO_CDC_RX_BCL_VBAT_CFG (RX_START_OFFSET + 0x0284) -#define BOLERO_CDC_RX_BCL_VBAT_ADC_CAL1 (RX_START_OFFSET + 0x0288) -#define BOLERO_CDC_RX_BCL_VBAT_ADC_CAL2 (RX_START_OFFSET + 0x028C) -#define BOLERO_CDC_RX_BCL_VBAT_ADC_CAL3 (RX_START_OFFSET + 0x0290) -#define BOLERO_CDC_RX_BCL_VBAT_PK_EST1 (RX_START_OFFSET + 0x0294) -#define BOLERO_CDC_RX_BCL_VBAT_PK_EST2 (RX_START_OFFSET + 0x0298) -#define BOLERO_CDC_RX_BCL_VBAT_PK_EST3 (RX_START_OFFSET + 0x029C) -#define BOLERO_CDC_RX_BCL_VBAT_RF_PROC1 (RX_START_OFFSET + 0x02A0) -#define BOLERO_CDC_RX_BCL_VBAT_RF_PROC2 (RX_START_OFFSET + 0x02A4) -#define BOLERO_CDC_RX_BCL_VBAT_TAC1 (RX_START_OFFSET + 0x02A8) -#define BOLERO_CDC_RX_BCL_VBAT_TAC2 (RX_START_OFFSET + 0x02AC) -#define BOLERO_CDC_RX_BCL_VBAT_TAC3 (RX_START_OFFSET + 0x02B0) -#define BOLERO_CDC_RX_BCL_VBAT_TAC4 (RX_START_OFFSET + 0x02B4) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD1 (RX_START_OFFSET + 0x02B8) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD2 (RX_START_OFFSET + 0x02BC) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD3 (RX_START_OFFSET + 0x02C0) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD4 (RX_START_OFFSET + 0x02C4) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD5 (RX_START_OFFSET + 0x02C8) -#define BOLERO_CDC_RX_BCL_VBAT_DEBUG1 (RX_START_OFFSET + 0x02CC) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD_MON (RX_START_OFFSET + 0x02D0) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL (RX_START_OFFSET + 0x02D4) -#define BOLERO_CDC_RX_BCL_VBAT_BAN (RX_START_OFFSET + 0x02D8) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1 (RX_START_OFFSET + 0x02DC) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2 (RX_START_OFFSET + 0x02E0) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3 (RX_START_OFFSET + 0x02E4) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4 (RX_START_OFFSET + 0x02E8) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5 (RX_START_OFFSET + 0x02EC) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6 (RX_START_OFFSET + 0x02F0) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7 (RX_START_OFFSET + 0x02F4) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8 (RX_START_OFFSET + 0x02F8) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9 (RX_START_OFFSET + 0x02FC) -#define BOLERO_CDC_RX_BCL_VBAT_ATTN1 (RX_START_OFFSET + 0x0300) -#define BOLERO_CDC_RX_BCL_VBAT_ATTN2 (RX_START_OFFSET + 0x0304) -#define BOLERO_CDC_RX_BCL_VBAT_ATTN3 (RX_START_OFFSET + 0x0308) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1 (RX_START_OFFSET + 0x030C) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL2 (RX_START_OFFSET + 0x0310) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1 (RX_START_OFFSET + 0x0314) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2 (RX_START_OFFSET + 0x0318) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3 (RX_START_OFFSET + 0x031C) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG4 (RX_START_OFFSET + 0x0320) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_ST (RX_START_OFFSET + 0x0324) -#define BOLERO_CDC_RX_INTR_CTRL_CFG (RX_START_OFFSET + 0x0340) -#define BOLERO_CDC_RX_INTR_CTRL_CLR_COMMIT (RX_START_OFFSET + 0x0344) -#define BOLERO_CDC_RX_INTR_CTRL_PIN1_MASK0 (RX_START_OFFSET + 0x0360) -#define BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0 (RX_START_OFFSET + 0x0368) -#define BOLERO_CDC_RX_INTR_CTRL_PIN1_CLEAR0 (RX_START_OFFSET + 0x0370) -#define BOLERO_CDC_RX_INTR_CTRL_PIN2_MASK0 (RX_START_OFFSET + 0x0380) -#define BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0 (RX_START_OFFSET + 0x0388) -#define BOLERO_CDC_RX_INTR_CTRL_PIN2_CLEAR0 (RX_START_OFFSET + 0x0390) -#define BOLERO_CDC_RX_INTR_CTRL_LEVEL0 (RX_START_OFFSET + 0x03C0) -#define BOLERO_CDC_RX_INTR_CTRL_BYPASS0 (RX_START_OFFSET + 0x03C8) -#define BOLERO_CDC_RX_INTR_CTRL_SET0 (RX_START_OFFSET + 0x03D0) -#define BOLERO_CDC_RX_RX0_RX_PATH_CTL (RX_START_OFFSET + 0x0400) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG0 (RX_START_OFFSET + 0x0404) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG1 (RX_START_OFFSET + 0x0408) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG2 (RX_START_OFFSET + 0x040C) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG3 (RX_START_OFFSET + 0x0410) -#define BOLERO_CDC_RX_RX0_RX_VOL_CTL (RX_START_OFFSET + 0x0414) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL (RX_START_OFFSET + 0x0418) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_CFG (RX_START_OFFSET + 0x041C) -#define BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL (RX_START_OFFSET + 0x0420) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC1 (RX_START_OFFSET + 0x0424) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC2 (RX_START_OFFSET + 0x0428) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC3 (RX_START_OFFSET + 0x042C) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC4 (RX_START_OFFSET + 0x0430) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC7 (RX_START_OFFSET + 0x0434) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC0 (RX_START_OFFSET + 0x0438) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC1 (RX_START_OFFSET + 0x043C) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL (RX_START_OFFSET + 0x0440) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA1 (RX_START_OFFSET + 0x0444) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA2 (RX_START_OFFSET + 0x0448) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA3 (RX_START_OFFSET + 0x044C) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA4 (RX_START_OFFSET + 0x0450) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA5 (RX_START_OFFSET + 0x0454) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA6 (RX_START_OFFSET + 0x0458) -#define BOLERO_CDC_RX_RX1_RX_PATH_CTL (RX_START_OFFSET + 0x0480) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG0 (RX_START_OFFSET + 0x0484) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG1 (RX_START_OFFSET + 0x0488) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG2 (RX_START_OFFSET + 0x048C) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG3 (RX_START_OFFSET + 0x0490) -#define BOLERO_CDC_RX_RX1_RX_VOL_CTL (RX_START_OFFSET + 0x0494) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_CTL (RX_START_OFFSET + 0x0498) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_CFG (RX_START_OFFSET + 0x049C) -#define BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL (RX_START_OFFSET + 0x04A0) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC1 (RX_START_OFFSET + 0x04A4) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC2 (RX_START_OFFSET + 0x04A8) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC3 (RX_START_OFFSET + 0x04AC) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC4 (RX_START_OFFSET + 0x04B0) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC7 (RX_START_OFFSET + 0x04B4) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC0 (RX_START_OFFSET + 0x04B8) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC1 (RX_START_OFFSET + 0x04BC) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL (RX_START_OFFSET + 0x04C0) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA1 (RX_START_OFFSET + 0x04C4) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA2 (RX_START_OFFSET + 0x04C8) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA3 (RX_START_OFFSET + 0x04CC) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA4 (RX_START_OFFSET + 0x04D0) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA5 (RX_START_OFFSET + 0x04D4) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA6 (RX_START_OFFSET + 0x04D8) -#define BOLERO_CDC_RX_RX2_RX_PATH_CTL (RX_START_OFFSET + 0x0500) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG0 (RX_START_OFFSET + 0x0504) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG1 (RX_START_OFFSET + 0x0508) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG2 (RX_START_OFFSET + 0x050C) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG3 (RX_START_OFFSET + 0x0510) -#define BOLERO_CDC_RX_RX2_RX_VOL_CTL (RX_START_OFFSET + 0x0514) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_CTL (RX_START_OFFSET + 0x0518) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_CFG (RX_START_OFFSET + 0x051C) -#define BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL (RX_START_OFFSET + 0x0520) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC0 (RX_START_OFFSET + 0x0524) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC1 (RX_START_OFFSET + 0x0528) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC2 (RX_START_OFFSET + 0x052C) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC3 (RX_START_OFFSET + 0x0530) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC4 (RX_START_OFFSET + 0x0534) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC5 (RX_START_OFFSET + 0x0538) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC6 (RX_START_OFFSET + 0x053C) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC7 (RX_START_OFFSET + 0x0540) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC0 (RX_START_OFFSET + 0x0544) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC1 (RX_START_OFFSET + 0x0548) -#define BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL (RX_START_OFFSET + 0x054C) -#define BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL (RX_START_OFFSET + 0x0780) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG0 (RX_START_OFFSET + 0x0784) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG1 (RX_START_OFFSET + 0x0788) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG2 (RX_START_OFFSET + 0x078C) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG3 (RX_START_OFFSET + 0x0790) -#define BOLERO_CDC_RX_COMPANDER0_CTL0 (RX_START_OFFSET + 0x0800) -#define BOLERO_CDC_RX_COMPANDER0_CTL1 (RX_START_OFFSET + 0x0804) -#define BOLERO_CDC_RX_COMPANDER0_CTL2 (RX_START_OFFSET + 0x0808) -#define BOLERO_CDC_RX_COMPANDER0_CTL3 (RX_START_OFFSET + 0x080C) -#define BOLERO_CDC_RX_COMPANDER0_CTL4 (RX_START_OFFSET + 0x0810) -#define BOLERO_CDC_RX_COMPANDER0_CTL5 (RX_START_OFFSET + 0x0814) -#define BOLERO_CDC_RX_COMPANDER0_CTL6 (RX_START_OFFSET + 0x0818) -#define BOLERO_CDC_RX_COMPANDER0_CTL7 (RX_START_OFFSET + 0x081C) -#define BOLERO_CDC_RX_COMPANDER1_CTL0 (RX_START_OFFSET + 0x0840) -#define BOLERO_CDC_RX_COMPANDER1_CTL1 (RX_START_OFFSET + 0x0844) -#define BOLERO_CDC_RX_COMPANDER1_CTL2 (RX_START_OFFSET + 0x0848) -#define BOLERO_CDC_RX_COMPANDER1_CTL3 (RX_START_OFFSET + 0x084C) -#define BOLERO_CDC_RX_COMPANDER1_CTL4 (RX_START_OFFSET + 0x0850) -#define BOLERO_CDC_RX_COMPANDER1_CTL5 (RX_START_OFFSET + 0x0854) -#define BOLERO_CDC_RX_COMPANDER1_CTL6 (RX_START_OFFSET + 0x0858) -#define BOLERO_CDC_RX_COMPANDER1_CTL7 (RX_START_OFFSET + 0x085C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL \ - (RX_START_OFFSET + 0x0A00) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL \ - (RX_START_OFFSET + 0x0A04) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL \ - (RX_START_OFFSET + 0x0A08) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL \ - (RX_START_OFFSET + 0x0A0C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL \ - (RX_START_OFFSET + 0x0A10) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL \ - (RX_START_OFFSET + 0x0A14) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL \ - (RX_START_OFFSET + 0x0A18) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL \ - (RX_START_OFFSET + 0x0A1C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL \ - (RX_START_OFFSET + 0x0A20) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL (RX_START_OFFSET + 0x0A24) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL \ - (RX_START_OFFSET + 0x0A28) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL \ - (RX_START_OFFSET + 0x0A2C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL \ - (RX_START_OFFSET + 0x0A30) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL \ - (RX_START_OFFSET + 0x0A80) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL \ - (RX_START_OFFSET + 0x0A84) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL \ - (RX_START_OFFSET + 0x0A88) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL \ - (RX_START_OFFSET + 0x0A8C) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL \ - (RX_START_OFFSET + 0x0A90) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL \ - (RX_START_OFFSET + 0x0A94) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL \ - (RX_START_OFFSET + 0x0A98) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL \ - (RX_START_OFFSET + 0x0A9C) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL \ - (RX_START_OFFSET + 0x0AA0) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_CTL (RX_START_OFFSET + 0x0AA4) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL \ - (RX_START_OFFSET + 0x0AA8) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL \ - (RX_START_OFFSET + 0x0AAC) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL \ - (RX_START_OFFSET + 0x0AB0) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0 (RX_START_OFFSET + 0x0B00) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1 (RX_START_OFFSET + 0x0B04) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2 (RX_START_OFFSET + 0x0B08) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3 (RX_START_OFFSET + 0x0B0C) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0 (RX_START_OFFSET + 0x0B10) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1 (RX_START_OFFSET + 0x0B14) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2 (RX_START_OFFSET + 0x0B18) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3 (RX_START_OFFSET + 0x0B1C) -#define BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL \ - (RX_START_OFFSET + 0x0B40) -#define BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1 \ - (RX_START_OFFSET + 0x0B44) -#define BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL \ - (RX_START_OFFSET + 0x0B50) -#define BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1 \ - (RX_START_OFFSET + 0x0B54) -#define BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL \ - (RX_START_OFFSET + 0x0C00) -#define BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 (RX_START_OFFSET + 0x0C04) -#define BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL \ - (RX_START_OFFSET + 0x0C40) -#define BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0 (RX_START_OFFSET + 0x0C44) -#define BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL \ - (RX_START_OFFSET + 0x0C80) -#define BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0 (RX_START_OFFSET + 0x0C84) -#define BOLERO_CDC_RX_EC_ASRC0_CLK_RST_CTL (RX_START_OFFSET + 0x0D00) -#define BOLERO_CDC_RX_EC_ASRC0_CTL0 (RX_START_OFFSET + 0x0D04) -#define BOLERO_CDC_RX_EC_ASRC0_CTL1 (RX_START_OFFSET + 0x0D08) -#define BOLERO_CDC_RX_EC_ASRC0_FIFO_CTL (RX_START_OFFSET + 0x0D0C) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB \ - (RX_START_OFFSET + 0x0D10) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB \ - (RX_START_OFFSET + 0x0D14) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB \ - (RX_START_OFFSET + 0x0D18) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB \ - (RX_START_OFFSET + 0x0D1C) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO (RX_START_OFFSET + 0x0D20) -#define BOLERO_CDC_RX_EC_ASRC1_CLK_RST_CTL (RX_START_OFFSET + 0x0D40) -#define BOLERO_CDC_RX_EC_ASRC1_CTL0 (RX_START_OFFSET + 0x0D44) -#define BOLERO_CDC_RX_EC_ASRC1_CTL1 (RX_START_OFFSET + 0x0D48) -#define BOLERO_CDC_RX_EC_ASRC1_FIFO_CTL (RX_START_OFFSET + 0x0D4C) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB \ - (RX_START_OFFSET + 0x0D50) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB \ - (RX_START_OFFSET + 0x0D54) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB \ - (RX_START_OFFSET + 0x0D58) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB \ - (RX_START_OFFSET + 0x0D5C) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO (RX_START_OFFSET + 0x0D60) -#define BOLERO_CDC_RX_EC_ASRC2_CLK_RST_CTL (RX_START_OFFSET + 0x0D80) -#define BOLERO_CDC_RX_EC_ASRC2_CTL0 (RX_START_OFFSET + 0x0D84) -#define BOLERO_CDC_RX_EC_ASRC2_CTL1 (RX_START_OFFSET + 0x0D88) -#define BOLERO_CDC_RX_EC_ASRC2_FIFO_CTL (RX_START_OFFSET + 0x0D8C) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB \ - (RX_START_OFFSET + 0x0D90) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB \ - (RX_START_OFFSET + 0x0D94) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB \ - (RX_START_OFFSET + 0x0D98) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB \ - (RX_START_OFFSET + 0x0D9C) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO (RX_START_OFFSET + 0x0DA0) -#define BOLERO_CDC_RX_DSD0_PATH_CTL (RX_START_OFFSET + 0x0F00) -#define BOLERO_CDC_RX_DSD0_CFG0 (RX_START_OFFSET + 0x0F04) -#define BOLERO_CDC_RX_DSD0_CFG1 (RX_START_OFFSET + 0x0F08) -#define BOLERO_CDC_RX_DSD0_CFG2 (RX_START_OFFSET + 0x0F0C) -#define BOLERO_CDC_RX_DSD1_PATH_CTL (RX_START_OFFSET + 0x0F80) -#define BOLERO_CDC_RX_DSD1_CFG0 (RX_START_OFFSET + 0x0F84) -#define BOLERO_CDC_RX_DSD1_CFG1 (RX_START_OFFSET + 0x0F88) -#define BOLERO_CDC_RX_DSD1_CFG2 (RX_START_OFFSET + 0x0F8C) -#define RX_MAX_OFFSET (RX_START_OFFSET + 0x0F8C) - -#define BOLERO_CDC_RX_MACRO_MAX 0x3E4 /* F8C/4 = 3E3 + 1 */ - -/* WSA - macro#2 */ -#define WSA_START_OFFSET 0x2000 -#define BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL \ - (WSA_START_OFFSET + 0x0000) -#define BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL \ - (WSA_START_OFFSET + 0x0004) -#define BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL (WSA_START_OFFSET + 0x0008) -#define BOLERO_CDC_WSA_TOP_TOP_CFG0 (WSA_START_OFFSET + 0x0080) -#define BOLERO_CDC_WSA_TOP_TOP_CFG1 (WSA_START_OFFSET + 0x0084) -#define BOLERO_CDC_WSA_TOP_FREQ_MCLK (WSA_START_OFFSET + 0x0088) -#define BOLERO_CDC_WSA_TOP_DEBUG_BUS_SEL (WSA_START_OFFSET + 0x008C) -#define BOLERO_CDC_WSA_TOP_DEBUG_EN0 (WSA_START_OFFSET + 0x0090) -#define BOLERO_CDC_WSA_TOP_DEBUG_EN1 (WSA_START_OFFSET + 0x0094) -#define BOLERO_CDC_WSA_TOP_DEBUG_DSM_LB (WSA_START_OFFSET + 0x0098) -#define BOLERO_CDC_WSA_TOP_RX_I2S_CTL (WSA_START_OFFSET + 0x009C) -#define BOLERO_CDC_WSA_TOP_TX_I2S_CTL (WSA_START_OFFSET + 0x00A0) -#define BOLERO_CDC_WSA_TOP_I2S_CLK (WSA_START_OFFSET + 0x00A4) -#define BOLERO_CDC_WSA_TOP_I2S_RESET (WSA_START_OFFSET + 0x00A8) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 (WSA_START_OFFSET + 0x0100) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1 (WSA_START_OFFSET + 0x0104) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0 (WSA_START_OFFSET + 0x0108) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1 (WSA_START_OFFSET + 0x010C) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0 (WSA_START_OFFSET + 0x0110) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_EC_CFG0 (WSA_START_OFFSET + 0x0114) -#define BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0 (WSA_START_OFFSET + 0x0118) -/* VBAT registers */ -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL (WSA_START_OFFSET + 0x0180) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG (WSA_START_OFFSET + 0x0184) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL1 (WSA_START_OFFSET + 0x0188) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL2 (WSA_START_OFFSET + 0x018C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL3 (WSA_START_OFFSET + 0x0190) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST1 (WSA_START_OFFSET + 0x0194) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST2 (WSA_START_OFFSET + 0x0198) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST3 (WSA_START_OFFSET + 0x019C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC1 (WSA_START_OFFSET + 0x01A0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC2 (WSA_START_OFFSET + 0x01A4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC1 (WSA_START_OFFSET + 0x01A8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC2 (WSA_START_OFFSET + 0x01AC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC3 (WSA_START_OFFSET + 0x01B0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC4 (WSA_START_OFFSET + 0x01B4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD1 (WSA_START_OFFSET + 0x01B8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD2 (WSA_START_OFFSET + 0x01BC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD3 (WSA_START_OFFSET + 0x01C0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD4 (WSA_START_OFFSET + 0x01C4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD5 (WSA_START_OFFSET + 0x01C8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DEBUG1 (WSA_START_OFFSET + 0x01CC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD_MON \ - (WSA_START_OFFSET + 0x01D0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL \ - (WSA_START_OFFSET + 0x01D4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BAN (WSA_START_OFFSET + 0x01D8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1 \ - (WSA_START_OFFSET + 0x01DC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2 \ - (WSA_START_OFFSET + 0x01E0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3 \ - (WSA_START_OFFSET + 0x01E4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4 \ - (WSA_START_OFFSET + 0x01E8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5 \ - (WSA_START_OFFSET + 0x01EC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6 \ - (WSA_START_OFFSET + 0x01F0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7 \ - (WSA_START_OFFSET + 0x01F4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8 \ - (WSA_START_OFFSET + 0x01F8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9 \ - (WSA_START_OFFSET + 0x01FC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN1 (WSA_START_OFFSET + 0x0200) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN2 (WSA_START_OFFSET + 0x0204) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN3 (WSA_START_OFFSET + 0x0208) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1 \ - (WSA_START_OFFSET + 0x020C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL2 \ - (WSA_START_OFFSET + 0x0210) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1 \ - (WSA_START_OFFSET + 0x0214) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2 \ - (WSA_START_OFFSET + 0x0218) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3 \ - (WSA_START_OFFSET + 0x021C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4 \ - (WSA_START_OFFSET + 0x0220) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST (WSA_START_OFFSET + 0x0224) -#define BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x0244) -#define BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x0248) -#define BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x0264) -#define BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x0268) -#define BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x0284) -#define BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x0288) -#define BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x02A4) -#define BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x02A8) -#define BOLERO_CDC_WSA_INTR_CTRL_CFG (WSA_START_OFFSET + 0x0340) -#define BOLERO_CDC_WSA_INTR_CTRL_CLR_COMMIT (WSA_START_OFFSET + 0x0344) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN1_MASK0 (WSA_START_OFFSET + 0x0360) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0 (WSA_START_OFFSET + 0x0368) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN1_CLEAR0 (WSA_START_OFFSET + 0x0370) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN2_MASK0 (WSA_START_OFFSET + 0x0380) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0 (WSA_START_OFFSET + 0x0388) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN2_CLEAR0 (WSA_START_OFFSET + 0x0390) -#define BOLERO_CDC_WSA_INTR_CTRL_LEVEL0 (WSA_START_OFFSET + 0x03C0) -#define BOLERO_CDC_WSA_INTR_CTRL_BYPASS0 (WSA_START_OFFSET + 0x03C8) -#define BOLERO_CDC_WSA_INTR_CTRL_SET0 (WSA_START_OFFSET + 0x03D0) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CTL (WSA_START_OFFSET + 0x0400) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG0 (WSA_START_OFFSET + 0x0404) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG1 (WSA_START_OFFSET + 0x0408) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG2 (WSA_START_OFFSET + 0x040C) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG3 (WSA_START_OFFSET + 0x0410) -#define BOLERO_CDC_WSA_RX0_RX_VOL_CTL (WSA_START_OFFSET + 0x0414) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL (WSA_START_OFFSET + 0x0418) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG (WSA_START_OFFSET + 0x041C) -#define BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL (WSA_START_OFFSET + 0x0420) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC0 (WSA_START_OFFSET + 0x0424) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC1 (WSA_START_OFFSET + 0x0428) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC2 (WSA_START_OFFSET + 0x042C) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC3 (WSA_START_OFFSET + 0x0430) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC5 (WSA_START_OFFSET + 0x0438) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC6 (WSA_START_OFFSET + 0x043C) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC7 (WSA_START_OFFSET + 0x0440) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0 (WSA_START_OFFSET + 0x0444) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC1 (WSA_START_OFFSET + 0x0448) -#define BOLERO_CDC_WSA_RX0_RX_PATH_DSMDEM_CTL (WSA_START_OFFSET + 0x044C) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CTL (WSA_START_OFFSET + 0x0480) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG0 (WSA_START_OFFSET + 0x0484) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG1 (WSA_START_OFFSET + 0x0488) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG2 (WSA_START_OFFSET + 0x048C) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG3 (WSA_START_OFFSET + 0x0490) -#define BOLERO_CDC_WSA_RX1_RX_VOL_CTL (WSA_START_OFFSET + 0x0494) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL (WSA_START_OFFSET + 0x0498) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG (WSA_START_OFFSET + 0x049C) -#define BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL (WSA_START_OFFSET + 0x04A0) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC0 (WSA_START_OFFSET + 0x04A4) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC1 (WSA_START_OFFSET + 0x04A8) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC2 (WSA_START_OFFSET + 0x04AC) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC3 (WSA_START_OFFSET + 0x04B0) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC5 (WSA_START_OFFSET + 0x04B8) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC6 (WSA_START_OFFSET + 0x04BC) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC7 (WSA_START_OFFSET + 0x04C0) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0 (WSA_START_OFFSET + 0x04C4) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC1 (WSA_START_OFFSET + 0x04C8) -#define BOLERO_CDC_WSA_RX1_RX_PATH_DSMDEM_CTL (WSA_START_OFFSET + 0x04CC) -#define BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL (WSA_START_OFFSET + 0x0500) -#define BOLERO_CDC_WSA_BOOST0_BOOST_CTL (WSA_START_OFFSET + 0x0504) -#define BOLERO_CDC_WSA_BOOST0_BOOST_CFG1 (WSA_START_OFFSET + 0x0508) -#define BOLERO_CDC_WSA_BOOST0_BOOST_CFG2 (WSA_START_OFFSET + 0x050C) -#define BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL (WSA_START_OFFSET + 0x0540) -#define BOLERO_CDC_WSA_BOOST1_BOOST_CTL (WSA_START_OFFSET + 0x0544) -#define BOLERO_CDC_WSA_BOOST1_BOOST_CFG1 (WSA_START_OFFSET + 0x0548) -#define BOLERO_CDC_WSA_BOOST1_BOOST_CFG2 (WSA_START_OFFSET + 0x054C) -#define BOLERO_CDC_WSA_COMPANDER0_CTL0 (WSA_START_OFFSET + 0x0580) -#define BOLERO_CDC_WSA_COMPANDER0_CTL1 (WSA_START_OFFSET + 0x0584) -#define BOLERO_CDC_WSA_COMPANDER0_CTL2 (WSA_START_OFFSET + 0x0588) -#define BOLERO_CDC_WSA_COMPANDER0_CTL3 (WSA_START_OFFSET + 0x058C) -#define BOLERO_CDC_WSA_COMPANDER0_CTL4 (WSA_START_OFFSET + 0x0590) -#define BOLERO_CDC_WSA_COMPANDER0_CTL5 (WSA_START_OFFSET + 0x0594) -#define BOLERO_CDC_WSA_COMPANDER0_CTL6 (WSA_START_OFFSET + 0x0598) -#define BOLERO_CDC_WSA_COMPANDER0_CTL7 (WSA_START_OFFSET + 0x059C) -#define BOLERO_CDC_WSA_COMPANDER1_CTL0 (WSA_START_OFFSET + 0x05C0) -#define BOLERO_CDC_WSA_COMPANDER1_CTL1 (WSA_START_OFFSET + 0x05C4) -#define BOLERO_CDC_WSA_COMPANDER1_CTL2 (WSA_START_OFFSET + 0x05C8) -#define BOLERO_CDC_WSA_COMPANDER1_CTL3 (WSA_START_OFFSET + 0x05CC) -#define BOLERO_CDC_WSA_COMPANDER1_CTL4 (WSA_START_OFFSET + 0x05D0) -#define BOLERO_CDC_WSA_COMPANDER1_CTL5 (WSA_START_OFFSET + 0x05D4) -#define BOLERO_CDC_WSA_COMPANDER1_CTL6 (WSA_START_OFFSET + 0x05D8) -#define BOLERO_CDC_WSA_COMPANDER1_CTL7 (WSA_START_OFFSET + 0x05DC) -#define BOLERO_CDC_WSA_SOFTCLIP0_CRC (WSA_START_OFFSET + 0x0600) -#define BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL (WSA_START_OFFSET + 0x0604) -#define BOLERO_CDC_WSA_SOFTCLIP1_CRC (WSA_START_OFFSET + 0x0640) -#define BOLERO_CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL (WSA_START_OFFSET + 0x0644) -#define BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL \ - (WSA_START_OFFSET + 0x0680) -#define BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 (WSA_START_OFFSET + 0x0684) -#define BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL \ - (WSA_START_OFFSET + 0x06C0) -#define BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0 (WSA_START_OFFSET + 0x06C4) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL (WSA_START_OFFSET + 0x0700) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_CTL0 (WSA_START_OFFSET + 0x0704) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_CTL1 (WSA_START_OFFSET + 0x0708) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_FIFO_CTL (WSA_START_OFFSET + 0x070C) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB \ - (WSA_START_OFFSET + 0x0710) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB \ - (WSA_START_OFFSET + 0x0714) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB \ - (WSA_START_OFFSET + 0x0718) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB \ - (WSA_START_OFFSET + 0x071C) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO (WSA_START_OFFSET + 0x0720) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL (WSA_START_OFFSET + 0x0740) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_CTL0 (WSA_START_OFFSET + 0x0744) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_CTL1 (WSA_START_OFFSET + 0x0748) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_FIFO_CTL (WSA_START_OFFSET + 0x074C) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB \ - (WSA_START_OFFSET + 0x0750) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB \ - (WSA_START_OFFSET + 0x0754) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB \ - (WSA_START_OFFSET + 0x0758) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB \ - (WSA_START_OFFSET + 0x075C) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO (WSA_START_OFFSET + 0x0760) -#define WSA_MAX_OFFSET (WSA_START_OFFSET + 0x0760) - -#define BOLERO_CDC_WSA_MACRO_MAX 0x1D9 /* 0x760/4 = 0x1D8 + 1 registers */ - -/* VA macro registers */ -#define VA_START_OFFSET 0x3000 -#define BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL (VA_START_OFFSET + 0x0000) -#define BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL \ - (VA_START_OFFSET + 0x0004) -#define BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL (VA_START_OFFSET + 0x0008) -#define BOLERO_CDC_VA_TOP_CSR_TOP_CFG0 (VA_START_OFFSET + 0x0080) -#define BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL (VA_START_OFFSET + 0x0084) -#define BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL (VA_START_OFFSET + 0x0088) -#define BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL (VA_START_OFFSET + 0x008C) -#define BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL (VA_START_OFFSET + 0x0090) -#define BOLERO_CDC_VA_TOP_CSR_DMIC_CFG (VA_START_OFFSET + 0x0094) -#define BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS (VA_START_OFFSET + 0x009C) -#define BOLERO_CDC_VA_TOP_CSR_DEBUG_EN (VA_START_OFFSET + 0x00A0) -#define BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL (VA_START_OFFSET + 0x00A4) -#define BOLERO_CDC_VA_TOP_CSR_I2S_CLK (VA_START_OFFSET + 0x00A8) -#define BOLERO_CDC_VA_TOP_CSR_I2S_RESET (VA_START_OFFSET + 0x00AC) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_0 (VA_START_OFFSET + 0x00C0) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_1 (VA_START_OFFSET + 0x00C4) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_2 (VA_START_OFFSET + 0x00C8) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_3 (VA_START_OFFSET + 0x00CC) -#define VA_TOP_MAX_OFFSET (VA_START_OFFSET + 0x00CC) - -#define BOLERO_CDC_VA_MACRO_TOP_MAX 0x34 /* 0x0CC/4 = 0x33 + 1 = 0x34 */ - -#define BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL0 (VA_START_OFFSET + 0x00D0) -#define BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL1 (VA_START_OFFSET + 0x00D4) -#define BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL2 (VA_START_OFFSET + 0x00D8) -#define BOLERO_CDC_VA_TOP_CSR_SWR_CTRL (VA_START_OFFSET + 0x00DC) - -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0 (VA_START_OFFSET + 0x0100) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1 (VA_START_OFFSET + 0x0104) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0 (VA_START_OFFSET + 0x0108) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1 (VA_START_OFFSET + 0x010C) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0 (VA_START_OFFSET + 0x0110) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1 (VA_START_OFFSET + 0x0114) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0 (VA_START_OFFSET + 0x0118) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1 (VA_START_OFFSET + 0x011C) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0 (VA_START_OFFSET + 0x0120) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1 (VA_START_OFFSET + 0x0124) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0 (VA_START_OFFSET + 0x0128) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1 (VA_START_OFFSET + 0x012C) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0 (VA_START_OFFSET + 0x0130) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1 (VA_START_OFFSET + 0x0134) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0 (VA_START_OFFSET + 0x0138) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1 (VA_START_OFFSET + 0x013C) - -#define BOLERO_CDC_VA_TX0_TX_PATH_CTL (VA_START_OFFSET + 0x0400) -#define BOLERO_CDC_VA_TX0_TX_PATH_CFG0 (VA_START_OFFSET + 0x0404) -#define BOLERO_CDC_VA_TX0_TX_PATH_CFG1 (VA_START_OFFSET + 0x0408) -#define BOLERO_CDC_VA_TX0_TX_VOL_CTL (VA_START_OFFSET + 0x040C) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC0 (VA_START_OFFSET + 0x0410) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC1 (VA_START_OFFSET + 0x0414) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC2 (VA_START_OFFSET + 0x0418) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC3 (VA_START_OFFSET + 0x041C) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC4 (VA_START_OFFSET + 0x0420) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC5 (VA_START_OFFSET + 0x0424) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC6 (VA_START_OFFSET + 0x0428) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC7 (VA_START_OFFSET + 0x042C) -#define BOLERO_CDC_VA_TX1_TX_PATH_CTL (VA_START_OFFSET + 0x0480) -#define BOLERO_CDC_VA_TX1_TX_PATH_CFG0 (VA_START_OFFSET + 0x0484) -#define BOLERO_CDC_VA_TX1_TX_PATH_CFG1 (VA_START_OFFSET + 0x0488) -#define BOLERO_CDC_VA_TX1_TX_VOL_CTL (VA_START_OFFSET + 0x048C) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC0 (VA_START_OFFSET + 0x0490) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC1 (VA_START_OFFSET + 0x0494) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC2 (VA_START_OFFSET + 0x0498) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC3 (VA_START_OFFSET + 0x049C) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC4 (VA_START_OFFSET + 0x04A0) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC5 (VA_START_OFFSET + 0x04A4) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC6 (VA_START_OFFSET + 0x04A8) -#define BOLERO_CDC_VA_TX2_TX_PATH_CTL (VA_START_OFFSET + 0x0500) -#define BOLERO_CDC_VA_TX2_TX_PATH_CFG0 (VA_START_OFFSET + 0x0504) -#define BOLERO_CDC_VA_TX2_TX_PATH_CFG1 (VA_START_OFFSET + 0x0508) -#define BOLERO_CDC_VA_TX2_TX_VOL_CTL (VA_START_OFFSET + 0x050C) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC0 (VA_START_OFFSET + 0x0510) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC1 (VA_START_OFFSET + 0x0514) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC2 (VA_START_OFFSET + 0x0518) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC3 (VA_START_OFFSET + 0x051C) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC4 (VA_START_OFFSET + 0x0520) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC5 (VA_START_OFFSET + 0x0524) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC6 (VA_START_OFFSET + 0x0528) -#define BOLERO_CDC_VA_TX3_TX_PATH_CTL (VA_START_OFFSET + 0x0580) -#define BOLERO_CDC_VA_TX3_TX_PATH_CFG0 (VA_START_OFFSET + 0x0584) -#define BOLERO_CDC_VA_TX3_TX_PATH_CFG1 (VA_START_OFFSET + 0x0588) -#define BOLERO_CDC_VA_TX3_TX_VOL_CTL (VA_START_OFFSET + 0x058C) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC0 (VA_START_OFFSET + 0x0590) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC1 (VA_START_OFFSET + 0x0594) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC2 (VA_START_OFFSET + 0x0598) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC3 (VA_START_OFFSET + 0x059C) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC4 (VA_START_OFFSET + 0x05A0) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC5 (VA_START_OFFSET + 0x05A4) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC6 (VA_START_OFFSET + 0x05A8) -#define BOLERO_CDC_VA_TX4_TX_PATH_CTL (VA_START_OFFSET + 0x0600) -#define BOLERO_CDC_VA_TX4_TX_PATH_CFG0 (VA_START_OFFSET + 0x0604) -#define BOLERO_CDC_VA_TX4_TX_PATH_CFG1 (VA_START_OFFSET + 0x0608) -#define BOLERO_CDC_VA_TX4_TX_VOL_CTL (VA_START_OFFSET + 0x060C) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC0 (VA_START_OFFSET + 0x0610) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC1 (VA_START_OFFSET + 0x0614) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC2 (VA_START_OFFSET + 0x0618) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC3 (VA_START_OFFSET + 0x061C) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC4 (VA_START_OFFSET + 0x0620) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC5 (VA_START_OFFSET + 0x0624) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC6 (VA_START_OFFSET + 0x0628) -#define BOLERO_CDC_VA_TX5_TX_PATH_CTL (VA_START_OFFSET + 0x0680) -#define BOLERO_CDC_VA_TX5_TX_PATH_CFG0 (VA_START_OFFSET + 0x0684) -#define BOLERO_CDC_VA_TX5_TX_PATH_CFG1 (VA_START_OFFSET + 0x0688) -#define BOLERO_CDC_VA_TX5_TX_VOL_CTL (VA_START_OFFSET + 0x068C) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC0 (VA_START_OFFSET + 0x0690) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC1 (VA_START_OFFSET + 0x0694) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC2 (VA_START_OFFSET + 0x0698) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC3 (VA_START_OFFSET + 0x069C) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC4 (VA_START_OFFSET + 0x06A0) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC5 (VA_START_OFFSET + 0x06A4) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC6 (VA_START_OFFSET + 0x06A8) -#define BOLERO_CDC_VA_TX6_TX_PATH_CTL (VA_START_OFFSET + 0x0700) -#define BOLERO_CDC_VA_TX6_TX_PATH_CFG0 (VA_START_OFFSET + 0x0704) -#define BOLERO_CDC_VA_TX6_TX_PATH_CFG1 (VA_START_OFFSET + 0x0708) -#define BOLERO_CDC_VA_TX6_TX_VOL_CTL (VA_START_OFFSET + 0x070C) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC0 (VA_START_OFFSET + 0x0710) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC1 (VA_START_OFFSET + 0x0714) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC2 (VA_START_OFFSET + 0x0718) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC3 (VA_START_OFFSET + 0x071C) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC4 (VA_START_OFFSET + 0x0720) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC5 (VA_START_OFFSET + 0x0724) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC6 (VA_START_OFFSET + 0x0728) -#define BOLERO_CDC_VA_TX7_TX_PATH_CTL (VA_START_OFFSET + 0x0780) -#define BOLERO_CDC_VA_TX7_TX_PATH_CFG0 (VA_START_OFFSET + 0x0784) -#define BOLERO_CDC_VA_TX7_TX_PATH_CFG1 (VA_START_OFFSET + 0x0788) -#define BOLERO_CDC_VA_TX7_TX_VOL_CTL (VA_START_OFFSET + 0x078C) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC0 (VA_START_OFFSET + 0x0790) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC1 (VA_START_OFFSET + 0x0794) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC2 (VA_START_OFFSET + 0x0798) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC3 (VA_START_OFFSET + 0x079C) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC4 (VA_START_OFFSET + 0x07A0) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC5 (VA_START_OFFSET + 0x07A4) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC6 (VA_START_OFFSET + 0x07A8) -#define VA_MAX_OFFSET (VA_START_OFFSET + 0x07A8) - -#define BOLERO_CDC_VA_MACRO_MAX 0x1EB /* 7A8/4 = 1EA + 1 = 1EB */ - -#define BOLERO_CDC_MAX_REGISTER VA_MAX_OFFSET - -#define BOLERO_REG(reg) (((reg) & 0x0FFF)/4) - -#endif diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-regmap.c b/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-regmap.c deleted file mode 100644 index 7fe04e71ec0e..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-regmap.c +++ /dev/null @@ -1,871 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018, 2020, The Linux Foundation. All rights reserved. - */ - -#include -#include "bolero-cdc.h" -#include "internal.h" - -static const struct reg_default bolero_defaults[] = { - /* TX Macro */ - { BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, 0x00 }, - { BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00 }, - { BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_TOP_CFG0, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_ANC_CFG, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_DEBUG_BUS, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_DEBUG_EN, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_TX_I2S_CTL, 0x0C}, - { BOLERO_CDC_TX_TOP_CSR_I2S_CLK, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_I2S_RESET, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_AMIC0_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_AMIC1_CTL, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1, 0x00}, - { BOLERO_CDC_TX_ANC0_CLK_RESET_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_MODE_1_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_MODE_2_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FF_SHIFT, 0x00}, - { BOLERO_CDC_TX_ANC0_FB_SHIFT, 0x00}, - { BOLERO_CDC_TX_ANC0_LPF_FF_A_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_LPF_FF_B_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_LPF_FB_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_SMLPF_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_DCFLT_SHIFT_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_IIR_ADAPT_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_IIR_COEFF_1_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_IIR_COEFF_2_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FF_A_GAIN_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FF_B_GAIN_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FB_GAIN_CTL, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX0_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX0_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX0_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX0_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX0_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX0_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC7, 0x25}, - { BOLERO_CDC_TX1_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX1_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX1_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX1_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX1_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX1_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX1_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX2_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX2_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX2_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX2_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX2_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX2_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX3_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX3_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX3_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX3_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX3_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX3_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX4_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX4_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX4_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX4_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX4_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX4_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX5_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX5_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX5_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX5_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX5_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX5_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX6_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX6_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX6_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX6_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX6_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX6_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX7_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX7_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX7_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX7_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX7_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX7_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC6, 0x00}, - - /* RX Macro */ - { BOLERO_CDC_RX_TOP_TOP_CFG0, 0x00}, - { BOLERO_CDC_RX_TOP_SWR_CTRL, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_BUS, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_EN0, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_EN1, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_EN2, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_LUT, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_LUT, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG0, 0x11}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG1, 0x20}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2, 0x00}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG3, 0x00}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG0, 0x11}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG1, 0x20}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2, 0x00}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG3, 0x00}, - { BOLERO_CDC_RX_TOP_RX_I2S_CTL, 0x0C}, - { BOLERO_CDC_RX_TOP_TX_I2S2_CTL, 0x0C}, - { BOLERO_CDC_RX_TOP_I2S_CLK, 0x0C}, - { BOLERO_CDC_RX_TOP_I2S_RESET, 0x00}, - { BOLERO_CDC_RX_TOP_I2S_MUX, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_DSD_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL, 0x08}, - { BOLERO_CDC_RX_SOFTCLIP_CRC, 0x00}, - { BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x38}, - { BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5, 0x00}, - { BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00}, - { BOLERO_CDC_RX_CLSH_CRC, 0x00}, - { BOLERO_CDC_RX_CLSH_DLY_CTRL, 0x03}, - { BOLERO_CDC_RX_CLSH_DECAY_CTRL, 0x02}, - { BOLERO_CDC_RX_CLSH_HPH_V_PA, 0x1C}, - { BOLERO_CDC_RX_CLSH_EAR_V_PA, 0x39}, - { BOLERO_CDC_RX_CLSH_HPH_V_HD, 0x0C}, - { BOLERO_CDC_RX_CLSH_EAR_V_HD, 0x0C}, - { BOLERO_CDC_RX_CLSH_K1_MSB, 0x01}, - { BOLERO_CDC_RX_CLSH_K1_LSB, 0x00}, - { BOLERO_CDC_RX_CLSH_K2_MSB, 0x00}, - { BOLERO_CDC_RX_CLSH_K2_LSB, 0x80}, - { BOLERO_CDC_RX_CLSH_IDLE_CTRL, 0x00}, - { BOLERO_CDC_RX_CLSH_IDLE_HPH, 0x00}, - { BOLERO_CDC_RX_CLSH_IDLE_EAR, 0x00}, - { BOLERO_CDC_RX_CLSH_TEST0, 0x07}, - { BOLERO_CDC_RX_CLSH_TEST1, 0x00}, - { BOLERO_CDC_RX_CLSH_OVR_VREF, 0x00}, - { BOLERO_CDC_RX_CLSH_CLSG_CTL, 0x02}, - { BOLERO_CDC_RX_CLSH_CLSG_CFG1, 0x9A}, - { BOLERO_CDC_RX_CLSH_CLSG_CFG2, 0x10}, - { BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_CFG, 0x10}, - { BOLERO_CDC_RX_BCL_VBAT_ADC_CAL1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_ADC_CAL2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_ADC_CAL3, 0x04}, - { BOLERO_CDC_RX_BCL_VBAT_PK_EST1, 0xE0}, - { BOLERO_CDC_RX_BCL_VBAT_PK_EST2, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_PK_EST3, 0x40}, - { BOLERO_CDC_RX_BCL_VBAT_RF_PROC1, 0x2A}, - { BOLERO_CDC_RX_BCL_VBAT_RF_PROC1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_TAC1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_TAC2, 0x18}, - { BOLERO_CDC_RX_BCL_VBAT_TAC3, 0x18}, - { BOLERO_CDC_RX_BCL_VBAT_TAC4, 0x03}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD1, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD3, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD4, 0x64}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD5, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_DEBUG1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD_MON, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BAN, 0x0C}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, 0x77}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, 0x4B}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_ATTN1, 0x04}, - { BOLERO_CDC_RX_BCL_VBAT_ATTN2, 0x08}, - { BOLERO_CDC_RX_BCL_VBAT_ATTN3, 0x0C}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0xE0}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG4, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_ST, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_CFG, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_CLR_COMMIT, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN1_MASK0, 0xFF}, - { BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN1_CLEAR0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN2_MASK0, 0xFF}, - { BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN2_CLEAR0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_LEVEL0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_BYPASS0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_SET0, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC4, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL, 0x08}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA1, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA2, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA3, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA4, 0x55}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA5, 0x55}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA6, 0x55}, - { BOLERO_CDC_RX_RX1_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC4, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL, 0x08}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA1, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA2, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA3, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA4, 0x55}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA5, 0x55}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA6, 0x55}, - { BOLERO_CDC_RX_RX2_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_RX_RX2_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC0, 0x04}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC4, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC5, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC6, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL, 0x00}, - { BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG0, 0x07}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG1, 0x3C}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG2, 0x00}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG3, 0x00}, - { BOLERO_CDC_RX_COMPANDER0_CTL0, 0x60}, - { BOLERO_CDC_RX_COMPANDER0_CTL1, 0xDB}, - { BOLERO_CDC_RX_COMPANDER0_CTL2, 0xFF}, - { BOLERO_CDC_RX_COMPANDER0_CTL3, 0x35}, - { BOLERO_CDC_RX_COMPANDER0_CTL4, 0xFF}, - { BOLERO_CDC_RX_COMPANDER0_CTL5, 0x00}, - { BOLERO_CDC_RX_COMPANDER0_CTL6, 0x01}, - { BOLERO_CDC_RX_COMPANDER0_CTL7, 0x28}, - { BOLERO_CDC_RX_COMPANDER1_CTL0, 0x60}, - { BOLERO_CDC_RX_COMPANDER1_CTL1, 0xDB}, - { BOLERO_CDC_RX_COMPANDER1_CTL2, 0xFF}, - { BOLERO_CDC_RX_COMPANDER1_CTL3, 0x35}, - { BOLERO_CDC_RX_COMPANDER1_CTL4, 0xFF}, - { BOLERO_CDC_RX_COMPANDER1_CTL5, 0x00}, - { BOLERO_CDC_RX_COMPANDER1_CTL6, 0x01}, - { BOLERO_CDC_RX_COMPANDER1_CTL7, 0x28}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL, 0x40}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_CTL, 0x40}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0x00}, - { BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00}, - { BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_RX_EC_ASRC0_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_CTL0, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_CTL1, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_FIFO_CTL, 0xA8}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_CTL0, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_CTL1, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_FIFO_CTL, 0xA8}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_CTL0, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_CTL1, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_FIFO_CTL, 0xA8}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO, 0x00}, - { BOLERO_CDC_RX_DSD0_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_DSD0_CFG0, 0x00}, - { BOLERO_CDC_RX_DSD0_CFG1, 0x62}, - { BOLERO_CDC_RX_DSD0_CFG2, 0x96}, - { BOLERO_CDC_RX_DSD1_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_DSD1_CFG0, 0x00}, - { BOLERO_CDC_RX_DSD1_CFG1, 0x62}, - { BOLERO_CDC_RX_DSD1_CFG2, 0x96}, - - /* WSA Macro */ - { BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, - { BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, - { BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 0x00}, - { BOLERO_CDC_WSA_TOP_TOP_CFG0, 0x00}, - { BOLERO_CDC_WSA_TOP_TOP_CFG1, 0x00}, - { BOLERO_CDC_WSA_TOP_FREQ_MCLK, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_BUS_SEL, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_EN0, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_EN1, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_DSM_LB, 0x88}, - { BOLERO_CDC_WSA_TOP_RX_I2S_CTL, 0x0C}, - { BOLERO_CDC_WSA_TOP_TX_I2S_CTL, 0x0C}, - { BOLERO_CDC_WSA_TOP_I2S_CLK, 0x02}, - { BOLERO_CDC_WSA_TOP_I2S_RESET, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_EC_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, 0x10}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL3, 0x04}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST1, 0xE0}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST2, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST3, 0x40}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC1, 0x2A}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC2, 0x18}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC3, 0x18}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC4, 0x03}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD1, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD3, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD4, 0x64}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD5, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DEBUG1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD_MON, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BAN, 0x0C}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2, 0x77}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5, 0x4B}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN1, 0x04}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN2, 0x08}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN3, 0x0C}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1, 0xE0}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST, 0x00}, - { BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_CFG, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_CLR_COMMIT, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN1_MASK0, 0xFF}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN1_CLEAR0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN2_MASK0, 0xFF}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN2_CLEAR0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_LEVEL0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_BYPASS0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_SET0, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC0, 0x04}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC5, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC6, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_DSMDEM_CTL, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC0, 0x04}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC5, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC6, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_DSMDEM_CTL, 0x00}, - { BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0xD0}, - { BOLERO_CDC_WSA_BOOST0_BOOST_CFG1, 0x89}, - { BOLERO_CDC_WSA_BOOST0_BOOST_CFG2, 0x04}, - { BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0xD0}, - { BOLERO_CDC_WSA_BOOST1_BOOST_CFG1, 0x89}, - { BOLERO_CDC_WSA_BOOST1_BOOST_CFG2, 0x04}, - { BOLERO_CDC_WSA_COMPANDER0_CTL0, 0x60}, - { BOLERO_CDC_WSA_COMPANDER0_CTL1, 0xDB}, - { BOLERO_CDC_WSA_COMPANDER0_CTL2, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x35}, - { BOLERO_CDC_WSA_COMPANDER0_CTL4, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER0_CTL5, 0x00}, - { BOLERO_CDC_WSA_COMPANDER0_CTL6, 0x01}, - { BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x28}, - { BOLERO_CDC_WSA_COMPANDER1_CTL0, 0x60}, - { BOLERO_CDC_WSA_COMPANDER1_CTL1, 0xDB}, - { BOLERO_CDC_WSA_COMPANDER1_CTL2, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x35}, - { BOLERO_CDC_WSA_COMPANDER1_CTL4, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER1_CTL5, 0x00}, - { BOLERO_CDC_WSA_COMPANDER1_CTL6, 0x01}, - { BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x28}, - { BOLERO_CDC_WSA_SOFTCLIP0_CRC, 0x00}, - { BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38}, - { BOLERO_CDC_WSA_SOFTCLIP1_CRC, 0x00}, - { BOLERO_CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38}, - { BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_CTL0, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_CTL1, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_FIFO_CTL, 0xA8}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_CTL0, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_CTL1, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_FIFO_CTL, 0xA8}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO, 0x00}, - - /* VA macro */ - { BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, - { BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, - { BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, 0x80}, - { BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DEBUG_EN, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL, 0x0C}, - { BOLERO_CDC_VA_TOP_CSR_I2S_CLK, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_I2S_RESET, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_0, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_1, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_2, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_3, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL0, 0xEE}, - { BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL1, 0xEE}, - { BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL2, 0xEE}, - { BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x06}, - - /* VA core */ - { BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX0_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX0_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX0_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC7, 0x25}, - { BOLERO_CDC_VA_TX1_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX1_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX1_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX1_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX2_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX2_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX2_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX3_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX3_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX3_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX4_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX4_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX4_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX5_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX5_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX5_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX6_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX6_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX6_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX7_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX7_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX7_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC6, 0x00}, -}; - -static bool bolero_is_readable_register(struct device *dev, - unsigned int reg) -{ - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 reg_offset; - int macro_id; - u8 *reg_tbl = NULL; - - if (!priv) - return false; - - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg); - if (macro_id < 0 || !priv->macros_supported[macro_id]) - return false; - - reg_tbl = bolero_reg_access[macro_id]; - reg_offset = (reg - macro_id_base_offset[macro_id])/4; - - if (reg_tbl) - return (reg_tbl[reg_offset] & RD_REG); - - return false; -} - -static bool bolero_is_writeable_register(struct device *dev, - unsigned int reg) -{ - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 reg_offset; - int macro_id; - const u8 *reg_tbl = NULL; - - if (!priv) - return false; - - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg); - if (macro_id < 0 || !priv->macros_supported[macro_id]) - return false; - - reg_tbl = bolero_reg_access[macro_id]; - reg_offset = (reg - macro_id_base_offset[macro_id])/4; - - if (reg_tbl) - return (reg_tbl[reg_offset] & WR_REG); - - return false; -} - -static bool bolero_is_volatile_register(struct device *dev, - unsigned int reg) -{ - /* Update volatile list for rx/tx macros */ - switch (reg) { - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_0: - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_1: - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_2: - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_3: - case BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL: - case BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL: - case BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL: - case BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL: - case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL: - case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL: - case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL: - case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL: - case BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL: - case BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST: - case BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0: - case BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0: - case BOLERO_CDC_WSA_COMPANDER0_CTL6: - case BOLERO_CDC_WSA_COMPANDER1_CTL6: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: - case BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB: - case BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB: - case BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB: - case BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB: - case BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB: - case BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB: - case BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB: - case BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB: - case BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2: - case BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2: - case BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL: - case BOLERO_CDC_RX_BCL_VBAT_DECODE_ST: - case BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0: - case BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0: - case BOLERO_CDC_RX_COMPANDER0_CTL6: - case BOLERO_CDC_RX_COMPANDER1_CTL6: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO: - return true; - } - return false; -} - -const struct regmap_config bolero_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .reg_stride = 4, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = bolero_defaults, - .num_reg_defaults = ARRAY_SIZE(bolero_defaults), - .max_register = BOLERO_CDC_MAX_REGISTER, - .writeable_reg = bolero_is_writeable_register, - .volatile_reg = bolero_is_volatile_register, - .readable_reg = bolero_is_readable_register, -}; diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-tables.c b/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-tables.c deleted file mode 100644 index 5d0d353566cb..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-tables.c +++ /dev/null @@ -1,978 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018 The Linux Foundation. All rights reserved. - */ - -#include -#include "bolero-cdc.h" -#include "internal.h" - -u8 bolero_tx_reg_access[BOLERO_CDC_TX_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_ANC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_AMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_AMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_CLK_RESET_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_MODE_1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_MODE_2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_SHIFT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FB_SHIFT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FF_A_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FF_B_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FB_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_SMLPF_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_DCFLT_SHIFT_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_ADAPT_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_COEFF_1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_COEFF_2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_A_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_B_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FB_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC6)] = RD_WR_REG, -}; - -u8 bolero_tx_reg_access_v2[BOLERO_CDC_TX_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_ANC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_AMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_AMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_CLK_RESET_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_MODE_1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_MODE_2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_SHIFT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FB_SHIFT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FF_A_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FF_B_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FB_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_SMLPF_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_DCFLT_SHIFT_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_ADAPT_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_COEFF_1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_COEFF_2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_A_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_B_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FB_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC6)] = RD_WR_REG, -}; - -u8 bolero_rx_reg_access[BOLERO_CDC_RX_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_RX_TOP_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_SWR_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_EN0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_EN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_EN2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_LUT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_LUT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_RX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_TX_I2S2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_I2S_MUX)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_DSD_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SOFTCLIP_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_DLY_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_DECAY_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_HPH_V_PA)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_EAR_V_PA)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_HPH_V_HD)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_EAR_V_HD)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K1_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K1_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K2_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K2_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_IDLE_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_IDLE_HPH)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_IDLE_EAR)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_TEST0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_TEST1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_OVR_VREF)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CLSG_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CLSG_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CLSG_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ADC_CAL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ADC_CAL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ADC_CAL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PK_EST1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PK_EST2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PK_EST3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_RF_PROC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_RF_PROC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DEBUG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD_MON)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BAN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ATTN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ATTN2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ATTN3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_ST)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_CLR_COMMIT)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN1_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN1_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN2_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN2_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_LEVEL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_BYPASS0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_SET0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL)] = - RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL)] = - RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_CFG2)] = RD_WR_REG, -}; - -u8 bolero_va_reg_access[BOLERO_CDC_VA_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_1)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_3)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC6)] = RD_WR_REG, -}; - -u8 bolero_va_top_reg_access[BOLERO_CDC_VA_MACRO_TOP_MAX] = { - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_1)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_3)] = RD_REG, -}; - -u8 bolero_va_reg_access_v2[BOLERO_CDC_VA_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_1)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_3)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC6)] = RD_WR_REG, -}; - -u8 bolero_va_reg_access_v3[BOLERO_CDC_VA_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_1)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_3)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_SWR_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC6)] = RD_WR_REG, -}; - -u8 bolero_wsa_reg_access[BOLERO_CDC_WSA_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_TOP_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_FREQ_MCLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_BUS_SEL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_EN0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_EN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_DSM_LB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_RX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_EC_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DEBUG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD_MON)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BAN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_CLR_COMMIT)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN1_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN1_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN2_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN2_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_LEVEL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_BYPASS0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_SET0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_DSMDEM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_DSMDEM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP0_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP1_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO)] = RD_REG, -}; - -u8 *bolero_reg_access[MAX_MACRO] = { - [TX_MACRO] = bolero_tx_reg_access, - [RX_MACRO] = bolero_rx_reg_access, - [WSA_MACRO] = bolero_wsa_reg_access, - [VA_MACRO] = bolero_va_reg_access, -}; diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-utils.c b/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-utils.c deleted file mode 100644 index f2e4ec47f967..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc-utils.c +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "bolero-cdc.h" -#include "internal.h" - -#define REG_BYTES 2 -#define VAL_BYTES 1 - -const u16 macro_id_base_offset[MAX_MACRO] = { - TX_START_OFFSET, - RX_START_OFFSET, - WSA_START_OFFSET, - VA_START_OFFSET, -}; - -int bolero_get_macro_id(bool va_no_dec_flag, u16 reg) -{ - if (reg >= TX_START_OFFSET - && reg <= TX_MAX_OFFSET) - return TX_MACRO; - if (reg >= RX_START_OFFSET - && reg <= RX_MAX_OFFSET) - return RX_MACRO; - if (reg >= WSA_START_OFFSET - && reg <= WSA_MAX_OFFSET) - return WSA_MACRO; - if (!va_no_dec_flag && - (reg >= VA_START_OFFSET && - reg <= VA_MAX_OFFSET)) - return VA_MACRO; - if (va_no_dec_flag && - (reg >= VA_START_OFFSET && - reg <= VA_TOP_MAX_OFFSET)) - return VA_MACRO; - - return -EINVAL; -} - -static int regmap_bus_read(void *context, const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 *reg_p; - u16 __reg; - int macro_id, i; - u8 temp = 0; - int ret = -EINVAL; - - if (!priv) { - dev_err(dev, "%s: priv is NULL\n", __func__); - return ret; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return ret; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return ret; - } - - reg_p = (u16 *)reg; - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg_p[0]); - if (macro_id < 0 || !priv->macros_supported[macro_id]) - return 0; - - mutex_lock(&priv->io_lock); - for (i = 0; i < val_size; i++) { - __reg = (reg_p[0] + i * 4) - macro_id_base_offset[macro_id]; - ret = priv->read_dev(priv, macro_id, __reg, &temp); - if (ret < 0) { - dev_err_ratelimited(dev, - "%s: Codec read failed (%d), reg: 0x%x, size:%zd\n", - __func__, ret, reg_p[0] + i * 4, val_size); - break; - } - ((u8 *)val)[i] = temp; - dev_dbg(dev, "%s: Read 0x%02x from reg 0x%x\n", - __func__, temp, reg_p[0] + i * 4); - } - mutex_unlock(&priv->io_lock); - - return ret; -} - -static int regmap_bus_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_size) -{ - struct device *dev = context; - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 *reg_p; - u16 __reg; - int macro_id, i; - int ret = -EINVAL; - - if (!priv) { - dev_err(dev, "%s: priv is NULL\n", __func__); - return ret; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return ret; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return ret; - } - - reg_p = (u16 *)reg; - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg_p[0]); - if (macro_id < 0 || !priv->macros_supported[macro_id]) - return 0; - - mutex_lock(&priv->io_lock); - for (i = 0; i < val_size; i++) { - __reg = (reg_p[0] + i * 4) - macro_id_base_offset[macro_id]; - ret = priv->write_dev(priv, macro_id, __reg, ((u8 *)val)[i]); - if (ret < 0) { - dev_err_ratelimited(dev, - "%s: Codec write failed (%d), reg:0x%x, size:%zd\n", - __func__, ret, reg_p[0] + i * 4, val_size); - break; - } - dev_dbg(dev, "Write %02x to reg 0x%x\n", ((u8 *)val)[i], - reg_p[0] + i * 4); - } - mutex_unlock(&priv->io_lock); - return ret; -} - -static int regmap_bus_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct bolero_priv *priv = dev_get_drvdata(dev); - - if (!priv) - return -EINVAL; - - if (count < REG_BYTES) { - dev_err(dev, "%s: count %zd bytes < %d, not supported\n", - __func__, count, REG_BYTES); - return -EINVAL; - } - - return regmap_bus_gather_write(context, data, REG_BYTES, - data + REG_BYTES, - count - REG_BYTES); -} - -static struct regmap_bus regmap_bus_config = { - .write = regmap_bus_write, - .gather_write = regmap_bus_gather_write, - .read = regmap_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -struct regmap *bolero_regmap_init(struct device *dev, - const struct regmap_config *config) -{ - return devm_regmap_init(dev, ®map_bus_config, dev, config); -} diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.c b/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.c deleted file mode 100644 index a09bbaec5f56..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.c +++ /dev/null @@ -1,1514 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "bolero-cdc.h" -#include "internal.h" -#include "bolero-clk-rsc.h" - -#define BOLERO_VERSION_ENTRY_SIZE 32 -#define BOLERO_CDC_STRING_LEN 80 - -static struct snd_soc_codec_driver bolero; - -/* pm runtime auto suspend timer in msecs */ -#define BOLERO_AUTO_SUSPEND_DELAY 100 /* delay in msec */ - -/* MCLK_MUX table for all macros */ -static u16 bolero_mclk_mux_tbl[MAX_MACRO][MCLK_MUX_MAX] = { - {TX_MACRO, VA_MACRO}, - {TX_MACRO, RX_MACRO}, - {TX_MACRO, WSA_MACRO}, - {TX_MACRO, VA_MACRO}, -}; - -static bool bolero_is_valid_codec_dev(struct device *dev); - -int bolero_set_port_map(struct snd_soc_codec *codec, - u32 size, void *data) -{ - struct bolero_priv *priv = NULL; - struct swr_mstr_port_map *map = NULL; - u16 idx; - - if (!codec || (size == 0) || !data) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - if (!bolero_is_valid_codec_dev(priv->dev)) { - dev_err(priv->dev, "%s: invalid codec\n", __func__); - return -EINVAL; - } - map = (struct swr_mstr_port_map *)data; - - for (idx = 0; idx < size; idx++) { - if (priv->macro_params[map->id].set_port_map) - priv->macro_params[map->id].set_port_map(codec, - map->uc, - SWR_MSTR_PORT_LEN, - map->swr_port_params); - map += 1; - } - - return 0; -} -EXPORT_SYMBOL(bolero_set_port_map); - -static void bolero_ahb_write_device(char __iomem *io_base, - u16 reg, u8 value) -{ - u32 temp = (u32)(value) & 0x000000FF; - - iowrite32(temp, io_base + reg); -} - -static void bolero_ahb_read_device(char __iomem *io_base, - u16 reg, u8 *value) -{ - u32 temp; - - temp = ioread32(io_base + reg); - *value = (u8)temp; -} - -static int __bolero_reg_read(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 *val) -{ - int ret = 0; - - mutex_lock(&priv->clk_lock); - if (!priv->dev_up) { - dev_dbg_ratelimited(priv->dev, - "%s: SSR in progress, exit\n", __func__); - ret = -EINVAL; - goto ssr_err; - } - - if (priv->macro_params[VA_MACRO].dev) { - pm_runtime_get_sync(priv->macro_params[VA_MACRO].dev); - if (!bolero_check_core_votes(priv->macro_params[VA_MACRO].dev)) - goto ssr_err; - } - - if (priv->version < BOLERO_VERSION_2_0) { - /* Request Clk before register access */ - ret = bolero_clk_rsc_request_clock( - priv->macro_params[macro_id].dev, - priv->macro_params[macro_id].default_clk_id, - priv->macro_params[macro_id].clk_id_req, - true); - if (ret < 0) { - dev_err_ratelimited(priv->dev, - "%s: Failed to enable clock, ret:%d\n", - __func__, ret); - goto err; - } - } - - bolero_ahb_read_device( - priv->macro_params[macro_id].io_base, reg, val); - - if (priv->version < BOLERO_VERSION_2_0) - bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev, - priv->macro_params[macro_id].default_clk_id, - priv->macro_params[macro_id].clk_id_req, - false); - -err: - if (priv->macro_params[VA_MACRO].dev) { - pm_runtime_mark_last_busy(priv->macro_params[VA_MACRO].dev); - pm_runtime_put_autosuspend(priv->macro_params[VA_MACRO].dev); - } -ssr_err: - mutex_unlock(&priv->clk_lock); - return ret; -} - -static int __bolero_reg_write(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 val) -{ - int ret = 0; - - mutex_lock(&priv->clk_lock); - if (!priv->dev_up) { - dev_dbg_ratelimited(priv->dev, - "%s: SSR in progress, exit\n", __func__); - ret = -EINVAL; - goto ssr_err; - } - if (priv->macro_params[VA_MACRO].dev) { - pm_runtime_get_sync(priv->macro_params[VA_MACRO].dev); - if (!bolero_check_core_votes(priv->macro_params[VA_MACRO].dev)) - goto ssr_err; - } - - if (priv->version < BOLERO_VERSION_2_0) { - /* Request Clk before register access */ - ret = bolero_clk_rsc_request_clock( - priv->macro_params[macro_id].dev, - priv->macro_params[macro_id].default_clk_id, - priv->macro_params[macro_id].clk_id_req, - true); - if (ret < 0) { - dev_err_ratelimited(priv->dev, - "%s: Failed to enable clock, ret:%d\n", - __func__, ret); - goto err; - } - } - - bolero_ahb_write_device( - priv->macro_params[macro_id].io_base, reg, val); - - if (priv->version < BOLERO_VERSION_2_0) - bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev, - priv->macro_params[macro_id].default_clk_id, - priv->macro_params[macro_id].clk_id_req, - false); - -err: - if (priv->macro_params[VA_MACRO].dev) { - pm_runtime_mark_last_busy(priv->macro_params[VA_MACRO].dev); - pm_runtime_put_autosuspend(priv->macro_params[VA_MACRO].dev); - } -ssr_err: - mutex_unlock(&priv->clk_lock); - return ret; -} - -static int bolero_cdc_update_wcd_event(void *handle, u16 event, u32 data) -{ - struct bolero_priv *priv = (struct bolero_priv *)handle; - - if (!priv) { - pr_err("%s:Invalid bolero priv handle\n", __func__); - return -EINVAL; - } - - switch (event) { - case WCD_BOLERO_EVT_RX_MUTE: - if (priv->macro_params[RX_MACRO].event_handler) - priv->macro_params[RX_MACRO].event_handler(priv->codec, - BOLERO_MACRO_EVT_RX_MUTE, data); - break; - case WCD_BOLERO_EVT_IMPED_TRUE: - if (priv->macro_params[RX_MACRO].event_handler) - priv->macro_params[RX_MACRO].event_handler(priv->codec, - BOLERO_MACRO_EVT_IMPED_TRUE, data); - break; - case WCD_BOLERO_EVT_IMPED_FALSE: - if (priv->macro_params[RX_MACRO].event_handler) - priv->macro_params[RX_MACRO].event_handler(priv->codec, - BOLERO_MACRO_EVT_IMPED_FALSE, data); - break; - case WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST: - if (priv->macro_params[RX_MACRO].event_handler) - priv->macro_params[RX_MACRO].event_handler( - priv->codec, - BOLERO_MACRO_EVT_RX_COMPANDER_SOFT_RST, data); - break; - case WCD_BOLERO_EVT_BCS_CLK_OFF: - if (priv->macro_params[TX_MACRO].event_handler) - priv->macro_params[TX_MACRO].event_handler( - priv->codec, - BOLERO_MACRO_EVT_BCS_CLK_OFF, data); - break; - default: - dev_err(priv->dev, "%s: Invalid event %d trigger from wcd\n", - __func__, event); - return -EINVAL; - } - return 0; -} - -static int bolero_cdc_register_notifier(void *handle, - struct notifier_block *nblock, - bool enable) -{ - struct bolero_priv *priv = (struct bolero_priv *)handle; - - if (!priv) { - pr_err("%s: bolero priv is null\n", __func__); - return -EINVAL; - } - if (enable) - return blocking_notifier_chain_register(&priv->notifier, - nblock); - - return blocking_notifier_chain_unregister(&priv->notifier, - nblock); -} - -static void bolero_cdc_notifier_call(struct bolero_priv *priv, - u32 data) -{ - dev_dbg(priv->dev, "%s: notifier call, data:%d\n", __func__, data); - blocking_notifier_call_chain(&priv->notifier, - data, (void *)priv->wcd_dev); -} - -static bool bolero_is_valid_child_dev(struct device *dev) -{ - if (of_device_is_compatible(dev->parent->of_node, "qcom,bolero-codec")) - return true; - - return false; -} - -static bool bolero_is_valid_codec_dev(struct device *dev) -{ - if (of_device_is_compatible(dev->of_node, "qcom,bolero-codec")) - return true; - - return false; -} - -/** - * bolero_clear_amic_tx_hold - clears AMIC register on analog codec - * - * @dev: bolero device ptr. - * - */ -void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n) -{ - struct bolero_priv *priv; - u16 event; - u16 amic = 0; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return; - } - - if (!bolero_is_valid_codec_dev(dev)) { - pr_err("%s: invalid codec\n", __func__); - return; - } - priv = dev_get_drvdata(dev); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return; - } - event = BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR; - if (adc_n == BOLERO_ADC0) - amic = 0x1; - else if (adc_n == BOLERO_ADC1) - amic = 0x2; - else if (adc_n == BOLERO_ADC2) - amic = 0x2; - else if (adc_n == BOLERO_ADC3) - amic = 0x3; - else - return; - - bolero_cdc_notifier_call(priv, (amic << 0x10 | event)); -} -EXPORT_SYMBOL(bolero_clear_amic_tx_hold); - -/** - * bolero_get_device_ptr - Get child or macro device ptr - * - * @dev: bolero device ptr. - * @macro_id: ID of macro calling this API. - * - * Returns dev ptr on success or NULL on error. - */ -struct device *bolero_get_device_ptr(struct device *dev, u16 macro_id) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return NULL; - } - - if (!bolero_is_valid_codec_dev(dev)) { - pr_err("%s: invalid codec\n", __func__); - return NULL; - } - priv = dev_get_drvdata(dev); - if (!priv || (macro_id >= MAX_MACRO)) { - dev_err(dev, "%s: priv is null or invalid macro\n", __func__); - return NULL; - } - - return priv->macro_params[macro_id].dev; -} -EXPORT_SYMBOL(bolero_get_device_ptr); - -/** - * bolero_get_rsc_clk_device_ptr - Get rsc clk device ptr - * - * @dev: bolero device ptr. - * - * Returns dev ptr on success or NULL on error. - */ -struct device *bolero_get_rsc_clk_device_ptr(struct device *dev) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return NULL; - } - - if (!bolero_is_valid_codec_dev(dev)) { - pr_err("%s: invalid codec\n", __func__); - return NULL; - } - priv = dev_get_drvdata(dev); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return NULL; - } - - return priv->clk_dev; -} -EXPORT_SYMBOL(bolero_get_rsc_clk_device_ptr); - -static int bolero_copy_dais_from_macro(struct bolero_priv *priv) -{ - struct snd_soc_dai_driver *dai_ptr; - u16 macro_idx; - - /* memcpy into bolero_dais all macro dais */ - if (!priv->bolero_dais) - priv->bolero_dais = devm_kzalloc(priv->dev, - priv->num_dais * - sizeof( - struct snd_soc_dai_driver), - GFP_KERNEL); - if (!priv->bolero_dais) - return -ENOMEM; - - dai_ptr = priv->bolero_dais; - - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (priv->macro_params[macro_idx].dai_ptr) { - memcpy(dai_ptr, - priv->macro_params[macro_idx].dai_ptr, - priv->macro_params[macro_idx].num_dais * - sizeof(struct snd_soc_dai_driver)); - dai_ptr += priv->macro_params[macro_idx].num_dais; - } - } - return 0; -} - -/** - * bolero_register_res_clk - Registers rsc clk driver to bolero - * - * @dev: rsc clk device ptr. - * @rsc_clk_cb: event handler callback for notifications like SSR - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_register_res_clk(struct device *dev, rsc_clk_cb_t rsc_clk_cb) -{ - struct bolero_priv *priv; - - if (!dev || !rsc_clk_cb) { - pr_err("%s: dev or rsc_clk_cb is null\n", __func__); - return -EINVAL; - } - if (!bolero_is_valid_child_dev(dev)) { - dev_err(dev, "%s: child device :%pK not added yet\n", - __func__, dev); - return -EINVAL; - } - priv = dev_get_drvdata(dev->parent); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return -EINVAL; - } - - priv->clk_dev = dev; - priv->rsc_clk_cb = rsc_clk_cb; - - return 0; -} -EXPORT_SYMBOL(bolero_register_res_clk); - -/** - * bolero_unregister_res_clk - Unregisters rsc clk driver from bolero - * - * @dev: resource clk device ptr. - */ -void bolero_unregister_res_clk(struct device *dev) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return; - } - if (!bolero_is_valid_child_dev(dev)) { - dev_err(dev, "%s: child device :%pK not added\n", - __func__, dev); - return; - } - priv = dev_get_drvdata(dev->parent); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return; - } - - priv->clk_dev = NULL; - priv->rsc_clk_cb = NULL; -} -EXPORT_SYMBOL(bolero_unregister_res_clk); - -static u8 bolero_dmic_clk_div_get(struct snd_soc_codec *codec, - int mode) -{ - struct bolero_priv* priv = snd_soc_codec_get_drvdata(codec); - int macro = (mode ? VA_MACRO : TX_MACRO); - int ret = 0; - - if (priv->macro_params[macro].clk_div_get) { - ret = priv->macro_params[macro].clk_div_get(codec); - if (ret > 0) - return ret; - } - - return 1; -} - -int bolero_dmic_clk_enable(struct snd_soc_codec *codec, - u32 dmic, u32 tx_mode, bool enable) -{ - struct bolero_priv* priv = snd_soc_codec_get_drvdata(codec); - u8 dmic_clk_en = 0x01; - u16 dmic_clk_reg = 0; - s32 *dmic_clk_cnt = NULL; - u8 *dmic_clk_div = NULL; - u8 freq_change_mask = 0; - u8 clk_div = 0; - - dev_dbg(codec->dev, "%s: enable: %d, tx_mode:%d, dmic: %d\n", - __func__, enable, tx_mode, dmic); - - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(priv->dmic_0_1_clk_cnt); - dmic_clk_div = &(priv->dmic_0_1_clk_div); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL; - freq_change_mask = 0x01; - break; - case 2: - case 3: - dmic_clk_cnt = &(priv->dmic_2_3_clk_cnt); - dmic_clk_div = &(priv->dmic_2_3_clk_div); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL; - freq_change_mask = 0x02; - break; - case 4: - case 5: - dmic_clk_cnt = &(priv->dmic_4_5_clk_cnt); - dmic_clk_div = &(priv->dmic_4_5_clk_div); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL; - freq_change_mask = 0x04; - break; - case 6: - case 7: - dmic_clk_cnt = &(priv->dmic_6_7_clk_cnt); - dmic_clk_div = &(priv->dmic_6_7_clk_div); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL; - freq_change_mask = 0x08; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - } - dev_dbg(codec->dev, "%s: DMIC%d dmic_clk_cnt %d\n", - __func__, dmic, *dmic_clk_cnt); - if (enable) { - clk_div = bolero_dmic_clk_div_get(codec, tx_mode); - (*dmic_clk_cnt)++; - if (*dmic_clk_cnt == 1) { - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - 0x80, 0x00); - snd_soc_update_bits(codec, dmic_clk_reg, - 0x0E, clk_div << 0x1); - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, dmic_clk_en); - } else { - if (*dmic_clk_div > clk_div) { - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - freq_change_mask, freq_change_mask); - snd_soc_update_bits(codec, dmic_clk_reg, - 0x0E, clk_div << 0x1); - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - freq_change_mask, 0x00); - } else { - clk_div = *dmic_clk_div; - } - } - *dmic_clk_div = clk_div; - } else { - (*dmic_clk_cnt)--; - if (*dmic_clk_cnt == 0) { - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, 0); - clk_div = 0; - snd_soc_update_bits(codec, dmic_clk_reg, - 0x0E, clk_div << 0x1); - } else { - clk_div = bolero_dmic_clk_div_get(codec, tx_mode); - if (*dmic_clk_div > clk_div) { - clk_div = bolero_dmic_clk_div_get(codec, !tx_mode); - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - freq_change_mask, freq_change_mask); - snd_soc_update_bits(codec, dmic_clk_reg, - 0x0E, clk_div << 0x1); - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - freq_change_mask, 0x00); - } else { - clk_div = *dmic_clk_div; - } - } - *dmic_clk_div = clk_div; - } - - return 0; -} -EXPORT_SYMBOL(bolero_dmic_clk_enable); - -/** - * bolero_register_macro - Registers macro to bolero - * - * @dev: macro device ptr. - * @macro_id: ID of macro calling this API. - * @ops: macro params to register. - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_register_macro(struct device *dev, u16 macro_id, - struct macro_ops *ops) -{ - struct bolero_priv *priv; - int ret = -EINVAL; - - if (!dev || !ops) { - pr_err("%s: dev or ops is null\n", __func__); - return -EINVAL; - } - if (!bolero_is_valid_child_dev(dev)) { - dev_err(dev, "%s: child device for macro:%d not added yet\n", - __func__, macro_id); - return -EINVAL; - } - priv = dev_get_drvdata(dev->parent); - if (!priv || (macro_id >= MAX_MACRO)) { - dev_err(dev, "%s: priv is null or invalid macro\n", __func__); - return -EINVAL; - } - - priv->macro_params[macro_id].clk_id_req = ops->clk_id_req; - priv->macro_params[macro_id].default_clk_id = ops->default_clk_id; - priv->macro_params[macro_id].init = ops->init; - priv->macro_params[macro_id].exit = ops->exit; - priv->macro_params[macro_id].io_base = ops->io_base; - priv->macro_params[macro_id].num_dais = ops->num_dais; - priv->macro_params[macro_id].dai_ptr = ops->dai_ptr; - priv->macro_params[macro_id].event_handler = ops->event_handler; - priv->macro_params[macro_id].set_port_map = ops->set_port_map; - priv->macro_params[macro_id].dev = dev; - priv->current_mclk_mux_macro[macro_id] = - bolero_mclk_mux_tbl[macro_id][MCLK_MUX0]; - if (macro_id == TX_MACRO) { - priv->macro_params[macro_id].reg_wake_irq = ops->reg_wake_irq; - priv->macro_params[macro_id].clk_switch = ops->clk_switch; - priv->macro_params[macro_id].reg_evt_listener = - ops->reg_evt_listener; - priv->macro_params[macro_id].clk_enable = ops->clk_enable; - } - if (macro_id == TX_MACRO || macro_id == VA_MACRO) - priv->macro_params[macro_id].clk_div_get = ops->clk_div_get; - - if (priv->version == BOLERO_VERSION_2_1) { - if (macro_id == VA_MACRO) - priv->macro_params[macro_id].reg_wake_irq = - ops->reg_wake_irq; - } - priv->num_dais += ops->num_dais; - priv->num_macros_registered++; - priv->macros_supported[macro_id] = true; - - dev_dbg(dev, "%s: register macro successful:%d\n", macro_id); - - if (priv->num_macros_registered == priv->num_macros) { - ret = bolero_copy_dais_from_macro(priv); - if (ret < 0) { - dev_err(dev, "%s: copy_dais failed\n", __func__); - return ret; - } - if (priv->macros_supported[TX_MACRO] == false) { - bolero_mclk_mux_tbl[WSA_MACRO][MCLK_MUX0] = WSA_MACRO; - priv->current_mclk_mux_macro[WSA_MACRO] = WSA_MACRO; - bolero_mclk_mux_tbl[VA_MACRO][MCLK_MUX0] = VA_MACRO; - priv->current_mclk_mux_macro[VA_MACRO] = VA_MACRO; - } - ret = snd_soc_register_codec(dev->parent, &bolero, - priv->bolero_dais, priv->num_dais); - if (ret < 0) { - dev_err(dev, "%s: register codec failed\n", __func__); - return ret; - } - } - return 0; -} -EXPORT_SYMBOL(bolero_register_macro); - -/** - * bolero_unregister_macro - De-Register macro from bolero - * - * @dev: macro device ptr. - * @macro_id: ID of macro calling this API. - * - */ -void bolero_unregister_macro(struct device *dev, u16 macro_id) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return; - } - if (!bolero_is_valid_child_dev(dev)) { - dev_err(dev, "%s: macro:%d not in valid registered macro-list\n", - __func__, macro_id); - return; - } - priv = dev_get_drvdata(dev->parent); - if (!priv || (macro_id >= MAX_MACRO)) { - dev_err(dev, "%s: priv is null or invalid macro\n", __func__); - return; - } - - priv->macro_params[macro_id].init = NULL; - priv->macro_params[macro_id].num_dais = 0; - priv->macro_params[macro_id].dai_ptr = NULL; - priv->macro_params[macro_id].event_handler = NULL; - priv->macro_params[macro_id].dev = NULL; - if (macro_id == TX_MACRO) { - priv->macro_params[macro_id].reg_wake_irq = NULL; - priv->macro_params[macro_id].clk_switch = NULL; - priv->macro_params[macro_id].reg_evt_listener = NULL; - priv->macro_params[macro_id].clk_enable = NULL; - } - if (macro_id == TX_MACRO || macro_id == VA_MACRO) - priv->macro_params[macro_id].clk_div_get = NULL; - - priv->num_dais -= priv->macro_params[macro_id].num_dais; - priv->num_macros_registered--; - - /* UNREGISTER CODEC HERE */ - if (priv->num_macros - 1 == priv->num_macros_registered) - snd_soc_unregister_codec(dev->parent); -} -EXPORT_SYMBOL(bolero_unregister_macro); - -void bolero_wsa_pa_on(struct device *dev) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return; - } - if (!bolero_is_valid_child_dev(dev)) { - dev_err(dev, "%s: not a valid child dev\n", - __func__); - return; - } - priv = dev_get_drvdata(dev->parent); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return; - } - - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_PA_ON_POST_FSCLK); -} -EXPORT_SYMBOL(bolero_wsa_pa_on); - -int bolero_get_version(struct device *dev) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return -EINVAL; - } - if (!bolero_is_valid_child_dev(dev)) { - dev_err(dev, "%s: child device for macro not added yet\n", - __func__); - return -EINVAL; - } - priv = dev_get_drvdata(dev->parent); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return -EINVAL; - } - return priv->version; -} -EXPORT_SYMBOL(bolero_get_version); - -static ssize_t bolero_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct bolero_priv *priv; - char buffer[BOLERO_VERSION_ENTRY_SIZE]; - int len = 0; - - priv = (struct bolero_priv *) entry->private_data; - if (!priv) { - pr_err("%s: bolero priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->version) { - case BOLERO_VERSION_1_0: - len = snprintf(buffer, sizeof(buffer), "BOLERO_1_0\n"); - break; - case BOLERO_VERSION_1_1: - len = snprintf(buffer, sizeof(buffer), "BOLERO_1_1\n"); - break; - case BOLERO_VERSION_1_2: - len = snprintf(buffer, sizeof(buffer), "BOLERO_1_2\n"); - break; - case BOLERO_VERSION_2_1: - len = snprintf(buffer, sizeof(buffer), "BOLERO_2_1\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static int bolero_ssr_enable(struct device *dev, void *data) -{ - struct bolero_priv *priv = data; - int macro_idx; - - if (priv->initial_boot) { - priv->initial_boot = false; - return 0; - } - - if (priv->rsc_clk_cb) - priv->rsc_clk_cb(priv->clk_dev, BOLERO_MACRO_EVT_SSR_UP); - - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (priv->macro_params[macro_idx].event_handler) - priv->macro_params[macro_idx].event_handler( - priv->codec, - BOLERO_MACRO_EVT_CLK_RESET, 0x0); - } - - if (priv->rsc_clk_cb) - priv->rsc_clk_cb(priv->clk_dev, BOLERO_MACRO_EVT_SSR_GFMUX_UP); - - trace_printk("%s: clk count reset\n", __func__); - regcache_cache_only(priv->regmap, false); - mutex_lock(&priv->clk_lock); - priv->dev_up = true; - mutex_unlock(&priv->clk_lock); - regcache_mark_dirty(priv->regmap); - bolero_clk_rsc_enable_all_clocks(priv->clk_dev, true); - regcache_sync(priv->regmap); - /* Add a 100usec sleep to ensure last register write is done */ - usleep_range(100,110); - bolero_clk_rsc_enable_all_clocks(priv->clk_dev, false); - trace_printk("%s: regcache_sync done\n", __func__); - /* call ssr event for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (!priv->macro_params[macro_idx].event_handler) - continue; - priv->macro_params[macro_idx].event_handler(priv->codec, - BOLERO_MACRO_EVT_SSR_UP, 0x0); - } - trace_printk("%s: SSR up events processed by all macros\n", __func__); - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_SSR_UP); - return 0; -} - -static void bolero_ssr_disable(struct device *dev, void *data) -{ - struct bolero_priv *priv = data; - int macro_idx; - - if (!priv->dev_up) { - dev_err_ratelimited(priv->dev, - "%s: already disabled\n", __func__); - return; - } - - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_PA_OFF_PRE_SSR); - regcache_cache_only(priv->regmap, true); - - mutex_lock(&priv->clk_lock); - priv->dev_up = false; - mutex_unlock(&priv->clk_lock); - if (priv->rsc_clk_cb) - priv->rsc_clk_cb(priv->clk_dev, BOLERO_MACRO_EVT_SSR_DOWN); - /* call ssr event for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (!priv->macro_params[macro_idx].event_handler) - continue; - priv->macro_params[macro_idx].event_handler(priv->codec, - BOLERO_MACRO_EVT_SSR_DOWN, 0x0); - } - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_SSR_DOWN); -} - -static struct snd_info_entry_ops bolero_info_ops = { - .read = bolero_version_read, -}; - -static const struct snd_event_ops bolero_ssr_ops = { - .enable = bolero_ssr_enable, - .disable = bolero_ssr_disable, -}; - -/* - * bolero_info_create_codec_entry - creates bolero module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates bolero module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int bolero_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct bolero_priv *priv; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (priv->entry) { - dev_dbg(priv->dev, - "%s:bolero module already created\n", __func__); - return 0; - } - card = codec->component.card; - priv->entry = snd_info_create_subdir(codec_root->module, - "bolero", codec_root); - if (!priv->entry) { - dev_dbg(codec->dev, "%s: failed to create bolero entry\n", - __func__); - return -ENOMEM; - } - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - priv->entry); - if (!version_entry) { - dev_err(codec->dev, "%s: failed to create bolero version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = priv; - version_entry->size = BOLERO_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &bolero_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - priv->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(bolero_info_create_codec_entry); - -/** - * bolero_register_wake_irq - Register wake irq of Tx macro - * - * @codec: codec ptr. - * @ipc_wakeup: bool to identify ipc_wakeup to be used or HW interrupt line. - * - * Return: 0 on success or negative error code on failure. - */ -int bolero_register_wake_irq(struct snd_soc_codec *codec, u32 ipc_wakeup) -{ - struct bolero_priv *priv = NULL; - - if (!codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - if (!bolero_is_valid_codec_dev(priv->dev)) { - dev_err(codec->dev, "%s: invalid codec\n", __func__); - return -EINVAL; - } - - if (priv->version == BOLERO_VERSION_2_1) { - if (priv->macro_params[VA_MACRO].reg_wake_irq) - priv->macro_params[VA_MACRO].reg_wake_irq( - codec, ipc_wakeup); - } else { - if (priv->macro_params[TX_MACRO].reg_wake_irq) - priv->macro_params[TX_MACRO].reg_wake_irq( - codec, ipc_wakeup); - } - - return 0; -} -EXPORT_SYMBOL(bolero_register_wake_irq); - -/** - * bolero_tx_clk_switch - Switch tx macro clock - * - * @codec: pointer to codec instance. - * - * @clk_src: 0 for TX_RCG and 1 for VA_RCG 994 - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_tx_clk_switch(struct snd_soc_codec *codec, int clk_src) -{ - struct bolero_priv *priv = NULL; - int ret = 0; - - if (!codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - if (!bolero_is_valid_codec_dev(priv->dev)) { - dev_err(codec->dev, "%s: invalid codec\n", __func__); - return -EINVAL; - } - - if (priv->macro_params[TX_MACRO].clk_switch) - ret = priv->macro_params[TX_MACRO].clk_switch(codec, clk_src); - - return ret; -} -EXPORT_SYMBOL(bolero_tx_clk_switch); - -/** - * bolero_tx_mclk_enable - Enable/Disable TX Macro mclk - * - * @component: pointer to codec component instance. - * @enable: set true to enable, otherwise false. - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_tx_mclk_enable(struct snd_soc_codec *codec, - bool enable) -{ - struct bolero_priv *priv = NULL; - int ret = 0; - - if (!codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - if (!bolero_is_valid_codec_dev(priv->dev)) { - dev_err(codec->dev, "%s: invalid codec\n", __func__); - return -EINVAL; - } - - if (priv->macro_params[TX_MACRO].clk_enable) - ret = priv->macro_params[TX_MACRO].clk_enable(codec, - enable); - - return ret; -} -EXPORT_SYMBOL(bolero_tx_mclk_enable); - -/** - * bolero_register_event_listener - Register/Deregister to event listener - * - * @codec: pointer to codec component instance. - * @enable: when set to 1 registers to event listener otherwise, derigisters - * from the event listener - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_register_event_listener(struct snd_soc_codec *codec, - bool enable) -{ - struct bolero_priv *priv = NULL; - int ret = 0; - - if (!codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - if (!bolero_is_valid_codec_dev(priv->dev)) { - dev_err(codec->dev, "%s: invalid codec\n", __func__); - return -EINVAL; - } - - if (priv->macro_params[TX_MACRO].reg_evt_listener) - ret = priv->macro_params[TX_MACRO].reg_evt_listener(codec, - enable); - - return ret; -} -EXPORT_SYMBOL(bolero_register_event_listener); - -static int bolero_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct bolero_priv *priv = dev_get_drvdata(codec->dev); - int macro_idx, ret = 0; - - snd_soc_codec_init_regmap(codec, priv->regmap); - - if (!priv->version) { - /* - * In order for the ADIE RTC to differentiate between targets - * version info is used. - * Assign 1.0 for target with only one macro - * Assign 1.1 for target with two macros - * Assign 1.2 for target with more than two macros - */ - if (priv->num_macros_registered == 1) - priv->version = BOLERO_VERSION_1_0; - else if (priv->num_macros_registered == 2) - priv->version = BOLERO_VERSION_1_1; - else if (priv->num_macros_registered > 2) - priv->version = BOLERO_VERSION_1_2; - } - - /* Assign bolero version 2.1 for bolero 2.1 */ - if ((snd_soc_read(codec, - BOLERO_CDC_VA_TOP_CSR_CORE_ID_0) == 0x2) && - (snd_soc_read(codec, - BOLERO_CDC_VA_TOP_CSR_CORE_ID_1) == 0xE)) - priv->version = BOLERO_VERSION_2_1; - - /* call init for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (priv->macro_params[macro_idx].init) { - ret = priv->macro_params[macro_idx].init(codec); - if (ret < 0) { - dev_err(codec->dev, - "%s: init for macro %d failed\n", - __func__, macro_idx); - goto err; - } - } - } - priv->codec = codec; - - ret = snd_event_client_register(priv->dev, &bolero_ssr_ops, priv); - if (!ret) { - snd_event_notify(priv->dev, SND_EVENT_UP); - } else { - dev_err(codec->dev, - "%s: Registration with SND event FWK failed ret = %d\n", - __func__, ret); - goto err; - } - - dev_dbg(codec->dev, "%s: bolero soc codec probe success\n", __func__); -err: - return ret; -} - -static int bolero_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct bolero_priv *priv = dev_get_drvdata(codec->dev); - int macro_idx; - - snd_event_client_deregister(priv->dev); - /* call exit for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) - if (priv->macro_params[macro_idx].exit) - priv->macro_params[macro_idx].exit(codec); - - return 0; -} - -static struct regmap *bolero_get_regmap(struct device *dev) -{ - struct bolero_priv *priv = dev_get_drvdata(dev); - - return priv->regmap; -} - -static struct snd_soc_codec_driver bolero = { - .probe = bolero_soc_codec_probe, - .remove = bolero_soc_codec_remove, - .get_regmap = bolero_get_regmap, -}; - -static void bolero_add_child_devices(struct work_struct *work) -{ - struct bolero_priv *priv; - bool split_codec = false; - struct platform_device *pdev; - struct device_node *node; - int ret = 0, count = 0; - struct wcd_ctrl_platform_data *platdata = NULL; - char plat_dev_name[BOLERO_CDC_STRING_LEN] = ""; - - priv = container_of(work, struct bolero_priv, - bolero_add_child_devices_work); - if (!priv) { - pr_err("%s: Memory for bolero priv does not exist\n", - __func__); - return; - } - if (!priv->dev || !priv->dev->of_node) { - dev_err(priv->dev, "%s: DT node for bolero does not exist\n", - __func__); - return; - } - - platdata = &priv->plat_data; - priv->child_count = 0; - - for_each_available_child_of_node(priv->dev->of_node, node) { - split_codec = false; - if (of_find_property(node, "qcom,split-codec", NULL)) { - split_codec = true; - dev_dbg(priv->dev, "%s: split codec slave exists\n", - __func__); - } - - strlcpy(plat_dev_name, node->name, - (BOLERO_CDC_STRING_LEN - 1)); - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = priv->dev; - pdev->dev.of_node = node; - - priv->dev->platform_data = platdata; - if (split_codec) - priv->wcd_dev = &pdev->dev; - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - platform_device_put(pdev); - goto fail_pdev_add; - } - - if (priv->child_count < BOLERO_CDC_CHILD_DEVICES_MAX) - priv->pdev_child_devices[priv->child_count++] = pdev; - else - goto err; - } - return; -fail_pdev_add: - for (count = 0; count < priv->child_count; count++) - platform_device_put(priv->pdev_child_devices[count]); -err: - return; -} - -static int bolero_probe(struct platform_device *pdev) -{ - struct bolero_priv *priv; - u32 num_macros = 0; - int ret; - struct clk *lpass_core_hw_vote = NULL; - struct clk *lpass_audio_hw_vote = NULL; - - priv = devm_kzalloc(&pdev->dev, sizeof(struct bolero_priv), - GFP_KERNEL); - if (!priv) - return -ENOMEM; - ret = of_property_read_u32(pdev->dev.of_node, "qcom,num-macros", - &num_macros); - if (ret) { - dev_err(&pdev->dev, - "%s:num-macros property not found\n", - __func__); - return ret; - } - priv->num_macros = num_macros; - if (priv->num_macros > MAX_MACRO) { - dev_err(&pdev->dev, - "%s:num_macros(%d) > MAX_MACRO(%d) than supported\n", - __func__, priv->num_macros, MAX_MACRO); - return -EINVAL; - } - priv->va_without_decimation = of_property_read_bool(pdev->dev.of_node, - "qcom,va-without-decimation"); - if (priv->va_without_decimation) - bolero_reg_access[VA_MACRO] = bolero_va_top_reg_access; - - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,bolero-version", &priv->version); - if (ret) { - dev_dbg(&pdev->dev, "%s:bolero version not specified\n", - __func__); - ret = 0; - } - if (priv->version == BOLERO_VERSION_2_1) { - bolero_reg_access[TX_MACRO] = bolero_tx_reg_access_v2; - bolero_reg_access[VA_MACRO] = bolero_va_reg_access_v2; - } else if (priv->version == BOLERO_VERSION_2_0) { - bolero_reg_access[VA_MACRO] = bolero_va_reg_access_v3; - } - - priv->dev = &pdev->dev; - priv->dev_up = true; - priv->initial_boot = true; - priv->regmap = bolero_regmap_init(priv->dev, - &bolero_regmap_config); - if (IS_ERR_OR_NULL((void *)(priv->regmap))) { - dev_err(&pdev->dev, "%s:regmap init failed\n", __func__); - return -EINVAL; - } - priv->read_dev = __bolero_reg_read; - priv->write_dev = __bolero_reg_write; - - priv->plat_data.handle = (void *) priv; - priv->plat_data.update_wcd_event = bolero_cdc_update_wcd_event; - priv->plat_data.register_notifier = bolero_cdc_register_notifier; - - priv->core_hw_vote_count = 0; - priv->core_audio_vote_count = 0; - - dev_set_drvdata(&pdev->dev, priv); - mutex_init(&priv->io_lock); - mutex_init(&priv->clk_lock); - mutex_init(&priv->vote_lock); - INIT_WORK(&priv->bolero_add_child_devices_work, - bolero_add_child_devices); - schedule_work(&priv->bolero_add_child_devices_work); - - /* Register LPASS core hw vote */ - lpass_core_hw_vote = devm_clk_get(&pdev->dev, "lpass_core_hw_vote"); - if (IS_ERR(lpass_core_hw_vote)) { - ret = PTR_ERR(lpass_core_hw_vote); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_core_hw_vote", ret); - lpass_core_hw_vote = NULL; - ret = 0; - } - priv->lpass_core_hw_vote = lpass_core_hw_vote; - - /* Register LPASS audio hw vote */ - lpass_audio_hw_vote = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote"); - if (IS_ERR(lpass_audio_hw_vote)) { - ret = PTR_ERR(lpass_audio_hw_vote); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_audio_hw_vote", ret); - lpass_audio_hw_vote = NULL; - ret = 0; - } - priv->lpass_audio_hw_vote = lpass_audio_hw_vote; - - return 0; -} - -static int bolero_remove(struct platform_device *pdev) -{ - struct bolero_priv *priv = dev_get_drvdata(&pdev->dev); - - if (!priv) - return -EINVAL; - - of_platform_depopulate(&pdev->dev); - mutex_destroy(&priv->io_lock); - mutex_destroy(&priv->clk_lock); - mutex_destroy(&priv->vote_lock); - return 0; -} - -#ifdef CONFIG_PM -int bolero_runtime_resume(struct device *dev) -{ - struct bolero_priv *priv = dev_get_drvdata(dev->parent); - int ret = 0; - - mutex_lock(&priv->vote_lock); - if (priv->lpass_core_hw_vote == NULL) { - dev_dbg(dev, "%s: Invalid lpass core hw node\n", __func__); - goto audio_vote; - } - - if (priv->core_hw_vote_count == 0) { - ret = digital_cdc_rsc_mgr_hw_vote_enable(priv->lpass_core_hw_vote); - if (ret < 0) { - dev_err(dev, "%s:lpass core hw enable failed\n", - __func__); - goto audio_vote; - } - } - priv->core_hw_vote_count++; - trace_printk("%s: hw vote count %d\n", - __func__, priv->core_hw_vote_count); - -audio_vote: - if (priv->lpass_audio_hw_vote == NULL) { - dev_dbg(dev, "%s: Invalid lpass audio hw node\n", __func__); - goto done; - } - - if (priv->core_audio_vote_count == 0) { - ret = digital_cdc_rsc_mgr_hw_vote_enable(priv->lpass_audio_hw_vote); - if (ret < 0) { - dev_err(dev, "%s:lpass audio hw enable failed\n", - __func__); - goto done; - } - } - priv->core_audio_vote_count++; - trace_printk("%s: audio vote count %d\n", - __func__, priv->core_audio_vote_count); - -done: - mutex_unlock(&priv->vote_lock); - pm_runtime_set_autosuspend_delay(priv->dev, BOLERO_AUTO_SUSPEND_DELAY); - return 0; -} -EXPORT_SYMBOL(bolero_runtime_resume); - -int bolero_runtime_suspend(struct device *dev) -{ - struct bolero_priv *priv = dev_get_drvdata(dev->parent); - - mutex_lock(&priv->vote_lock); - if (priv->lpass_core_hw_vote != NULL) { - if (--priv->core_hw_vote_count == 0) - digital_cdc_rsc_mgr_hw_vote_disable( - priv->lpass_core_hw_vote); - if (priv->core_hw_vote_count < 0) - priv->core_hw_vote_count = 0; - } else { - dev_dbg(dev, "%s: Invalid lpass core hw node\n", - __func__); - } - trace_printk("%s: hw vote count %d\n", - __func__, priv->core_hw_vote_count); - - if (priv->lpass_audio_hw_vote != NULL) { - if (--priv->core_audio_vote_count == 0) - digital_cdc_rsc_mgr_hw_vote_disable( - priv->lpass_audio_hw_vote); - if (priv->core_audio_vote_count < 0) - priv->core_audio_vote_count = 0; - } else { - dev_dbg(dev, "%s: Invalid lpass audio hw node\n", - __func__); - } - trace_printk("%s: audio vote count %d\n", - __func__, priv->core_audio_vote_count); - - mutex_unlock(&priv->vote_lock); - return 0; -} -EXPORT_SYMBOL(bolero_runtime_suspend); -#endif /* CONFIG_PM */ - -bool bolero_check_core_votes(struct device *dev) -{ - struct bolero_priv *priv = dev_get_drvdata(dev->parent); - bool ret = true; - - mutex_lock(&priv->vote_lock); - if ((priv->lpass_core_hw_vote && !priv->core_hw_vote_count) || - (priv->lpass_audio_hw_vote && !priv->core_audio_vote_count)) - ret = false; - mutex_unlock(&priv->vote_lock); - - return ret; -} -EXPORT_SYMBOL(bolero_check_core_votes); - -static const struct of_device_id bolero_dt_match[] = { - {.compatible = "qcom,bolero-codec"}, - {} -}; -MODULE_DEVICE_TABLE(of, bolero_dt_match); - -static struct platform_driver bolero_drv = { - .driver = { - .name = "bolero-codec", - .owner = THIS_MODULE, - .of_match_table = bolero_dt_match, - .suppress_bind_attrs = true, - }, - .probe = bolero_probe, - .remove = bolero_remove, -}; - -static int bolero_drv_init(void) -{ - return platform_driver_register(&bolero_drv); -} - -static void bolero_drv_exit(void) -{ - platform_driver_unregister(&bolero_drv); -} - -static int __init bolero_init(void) -{ - bolero_drv_init(); - bolero_clk_rsc_mgr_init(); - return 0; -} -module_init(bolero_init); - -static void __exit bolero_exit(void) -{ - bolero_clk_rsc_mgr_exit(); - bolero_drv_exit(); -} -module_exit(bolero_exit); - -MODULE_DESCRIPTION("Bolero driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.h b/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.h deleted file mode 100644 index 1c4dc9c6d018..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-cdc.h +++ /dev/null @@ -1,221 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#ifndef BOLERO_CDC_H -#define BOLERO_CDC_H - -#include -#include - -#define BOLERO_VERSION_1_0 0x0001 -#define BOLERO_VERSION_1_1 0x0002 -#define BOLERO_VERSION_1_2 0x0003 -#define BOLERO_VERSION_2_0 0x0004 -#define BOLERO_VERSION_2_1 0x0005 - -enum { - START_MACRO, - TX_MACRO = START_MACRO, - RX_MACRO, - WSA_MACRO, - VA_MACRO, - MAX_MACRO -}; - -enum mclk_mux { - MCLK_MUX0, - MCLK_MUX1, - MCLK_MUX_MAX -}; - -enum { - BOLERO_ADC0 = 1, - BOLERO_ADC1, - BOLERO_ADC2, - BOLERO_ADC3, - BOLERO_ADC_MAX -}; - -enum { - CLK_SRC_TX_RCG = 0, - CLK_SRC_VA_RCG, -}; - -enum { - BOLERO_MACRO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ - BOLERO_MACRO_EVT_IMPED_TRUE, /* for imped true */ - BOLERO_MACRO_EVT_IMPED_FALSE, /* for imped false */ - BOLERO_MACRO_EVT_SSR_DOWN, - BOLERO_MACRO_EVT_SSR_UP, - BOLERO_MACRO_EVT_WAIT_VA_CLK_RESET, - BOLERO_MACRO_EVT_CLK_RESET, - BOLERO_MACRO_EVT_REG_WAKE_IRQ, - BOLERO_MACRO_EVT_RX_COMPANDER_SOFT_RST, - BOLERO_MACRO_EVT_BCS_CLK_OFF, - BOLERO_MACRO_EVT_SSR_GFMUX_UP, -}; - -enum { - DMIC_TX = 0, - DMIC_VA = 1, - -}; - -enum { - DMIC0 = 0, - DMIC1, - DMIC2, - DMIC3, - DMIC4, - DMIC5, - DMIC6, - DMIC7, - DMIC_MAX -}; - -struct macro_ops { - int (*init)(struct snd_soc_codec *codec); - int (*exit)(struct snd_soc_codec *codec); - u16 num_dais; - struct device *dev; - struct snd_soc_dai_driver *dai_ptr; - int (*mclk_fn)(struct device *dev, bool enable); - int (*event_handler)(struct snd_soc_codec *codec, u16 event, - u32 data); - int (*reg_wake_irq)(struct snd_soc_codec *codec, u32 data); - int (*set_port_map)(struct snd_soc_codec *codec, u32 uc, - u32 size, void *data); - int (*clk_div_get)(struct snd_soc_codec *codec); - int (*clk_switch)(struct snd_soc_codec *codec, int clk_src); - int (*reg_evt_listener)(struct snd_soc_codec *codec, bool en); - int (*clk_enable)(struct snd_soc_codec *c, bool en); - char __iomem *io_base; - u16 clk_id_req; - u16 default_clk_id; -}; - -typedef int (*rsc_clk_cb_t)(struct device *dev, u16 event); - -#if IS_ENABLED(CONFIG_SND_SOC_BOLERO) -int bolero_register_res_clk(struct device *dev, rsc_clk_cb_t cb); -void bolero_unregister_res_clk(struct device *dev); -int bolero_register_macro(struct device *dev, u16 macro_id, - struct macro_ops *ops); -void bolero_unregister_macro(struct device *dev, u16 macro_id); -struct device *bolero_get_device_ptr(struct device *dev, u16 macro_id); -struct device *bolero_get_rsc_clk_device_ptr(struct device *dev); -int bolero_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -int bolero_register_wake_irq(struct snd_soc_codec *codec, u32 data); -void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n); -int bolero_runtime_resume(struct device *dev); -int bolero_runtime_suspend(struct device *dev); -int bolero_set_port_map(struct snd_soc_codec *codec, u32 size, void *data); -int bolero_tx_clk_switch(struct snd_soc_codec *codec, int clk_src); -int bolero_register_event_listener(struct snd_soc_codec *codec, - bool enable); -void bolero_wsa_pa_on(struct device *dev); -bool bolero_check_core_votes(struct device *dev); -int bolero_tx_mclk_enable(struct snd_soc_codec *c, bool enable); -int bolero_get_version(struct device *dev); -int bolero_dmic_clk_enable(struct snd_soc_codec *codec, - u32 dmic, u32 tx_mode, bool enable); -#else -static inline int bolero_register_res_clk(struct device *dev, rsc_clk_cb_t cb) -{ - return 0; -} -static inline void bolero_unregister_res_clk(struct device *dev) -{ -} - -static inline int bolero_register_macro(struct device *dev, - u16 macro_id, - struct macro_ops *ops) -{ - return 0; -} - -static inline void bolero_unregister_macro(struct device *dev, u16 macro_id) -{ -} - -static inline struct device *bolero_get_device_ptr(struct device *dev, - u16 macro_id) -{ - return NULL; -} - -static int bolero_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} - -static inline void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n) -{ -} - -static inline int bolero_register_wake_irq(struct snd_soc_codec *codec, - u32 data) -{ - return 0; -} - -static inline int bolero_runtime_resume(struct device *dev) -{ - return 0; -} - -static int bolero_runtime_suspend(struct device *dev) -{ - return 0; -} - -static inline int bolero_set_port_map(struct snd_soc_codec codec, - u32 size, void *data) -{ - return 0; -} - -static inline int bolero_tx_clk_switch(struct snd_soc_codec *codec, - int clk_src) -{ - return 0; -} - -static inline int bolero_register_event_listener( - struct snd_soc_codec *codec, - bool enable) -{ - return 0; -} - -static void bolero_wsa_pa_on(struct device *dev) -{ -} - -static inline bool bolero_check_core_votes(struct device *dev) -{ - return false; -} - -static int bolero_get_version(struct device *dev) -{ - return 0; -} - -static int bolero_dmic_clk_enable(struct snd_soc_codec *codec, - u32 dmic, u32 tx_mode, bool enable) -{ - return 0; -} -static int bolero_tx_mclk_enable(struct snd_soc_codec *c, bool enable) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_BOLERO */ -#endif /* BOLERO_CDC_H */ diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.c b/techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.c deleted file mode 100644 index b134819e0c16..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.c +++ /dev/null @@ -1,768 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "bolero-cdc.h" -#include "bolero-clk-rsc.h" - -#define DRV_NAME "bolero-clk-rsc" -#define BOLERO_CLK_NAME_LENGTH 30 -#define NPL_CLK_OFFSET (TX_NPL_CLK - TX_CORE_CLK) - -static char clk_src_name[MAX_CLK][BOLERO_CLK_NAME_LENGTH] = { - "tx_core_clk", - "rx_core_clk", - "wsa_core_clk", - "va_core_clk", - "tx_npl_clk", - "rx_npl_clk", - "wsa_npl_clk", - "va_npl_clk", -}; - -struct bolero_clk_rsc { - struct device *dev; - struct mutex rsc_clk_lock; - struct mutex fs_gen_lock; - struct clk *clk[MAX_CLK]; - int clk_cnt[MAX_CLK]; - int reg_seq_en_cnt; - int va_tx_clk_cnt; - bool dev_up; - bool dev_up_gfmux; - u32 num_fs_reg; - u32 *fs_gen_seq; - int default_clk_id[MAX_CLK]; - struct regmap *regmap; - char __iomem *rx_clk_muxsel; - char __iomem *wsa_clk_muxsel; - char __iomem *va_clk_muxsel; -}; - -static int bolero_clk_rsc_cb(struct device *dev, u16 event) -{ - struct bolero_clk_rsc *priv; - - if (!dev) { - pr_err("%s: Invalid device pointer\n", - __func__); - return -EINVAL; - } - - priv = dev_get_drvdata(dev); - if (!priv) { - pr_err("%s: Invalid clk rsc priviate data\n", - __func__); - return -EINVAL; - } - - mutex_lock(&priv->rsc_clk_lock); - if (event == BOLERO_MACRO_EVT_SSR_UP) { - priv->dev_up = true; - } else if (event == BOLERO_MACRO_EVT_SSR_DOWN) { - priv->dev_up = false; - priv->dev_up_gfmux = false; - } else if (event == BOLERO_MACRO_EVT_SSR_GFMUX_UP) { - priv->dev_up_gfmux = true; - } - mutex_unlock(&priv->rsc_clk_lock); - - return 0; -} - -static char __iomem *bolero_clk_rsc_get_clk_muxsel(struct bolero_clk_rsc *priv, - int clk_id) -{ - switch (clk_id) { - case RX_CORE_CLK: - return priv->rx_clk_muxsel; - case WSA_CORE_CLK: - return priv->wsa_clk_muxsel; - case VA_CORE_CLK: - return priv->va_clk_muxsel; - case TX_CORE_CLK: - default: - dev_err_ratelimited(priv->dev, "%s: Invalid case\n", __func__); - break; - } - - return NULL; -} - -int bolero_rsc_clk_reset(struct device *dev, int clk_id) -{ - struct device *clk_dev = NULL; - struct bolero_clk_rsc *priv = NULL; - int count = 0; - - if (!dev) { - pr_err("%s: dev is null %d\n", __func__); - return -EINVAL; - } - - if (clk_id < 0 || clk_id >= MAX_CLK - NPL_CLK_OFFSET) { - pr_err("%s: Invalid clk_id: %d\n", - __func__, clk_id); - return -EINVAL; - } - - clk_dev = bolero_get_rsc_clk_device_ptr(dev->parent); - if (!clk_dev) { - pr_err("%s: Invalid rsc clk device\n", __func__); - return -EINVAL; - } - - priv = dev_get_drvdata(clk_dev); - if (!priv) { - pr_err("%s: Invalid rsc clk priviate data\n", __func__); - return -EINVAL; - } - mutex_lock(&priv->rsc_clk_lock); - while (__clk_is_enabled(priv->clk[clk_id])) { - clk_disable_unprepare(priv->clk[clk_id + NPL_CLK_OFFSET]); - clk_disable_unprepare(priv->clk[clk_id]); - count++; - } - dev_dbg(priv->dev, - "%s: clock reset after ssr, count %d\n", __func__, count); - - trace_printk("%s: clock reset after ssr, count %d\n", __func__, count); - while (count--) { - clk_prepare_enable(priv->clk[clk_id]); - clk_prepare_enable(priv->clk[clk_id + NPL_CLK_OFFSET]); - } - mutex_unlock(&priv->rsc_clk_lock); - return 0; -} -EXPORT_SYMBOL(bolero_rsc_clk_reset); - -void bolero_clk_rsc_enable_all_clocks(struct device *dev, bool enable) -{ - struct device *clk_dev = NULL; - struct bolero_clk_rsc *priv = NULL; - int i = 0; - - if (!dev) { - pr_err("%s: dev is null %d\n", __func__); - return; - } - - clk_dev = bolero_get_rsc_clk_device_ptr(dev->parent); - if (!clk_dev) { - pr_err("%s: Invalid rsc clk device\n", __func__); - return; - } - - priv = dev_get_drvdata(clk_dev); - if (!priv) { - pr_err("%s: Invalid rsc clk private data\n", __func__); - return; - } - mutex_lock(&priv->rsc_clk_lock); - for (i = 0; i < MAX_CLK - NPL_CLK_OFFSET; i++) { - if (enable) { - if (priv->clk[i]) - clk_prepare_enable(priv->clk[i]); - if (priv->clk[i + NPL_CLK_OFFSET]) - clk_prepare_enable( - priv->clk[i + NPL_CLK_OFFSET]); - } else { - if (priv->clk[i + NPL_CLK_OFFSET]) - clk_disable_unprepare( - priv->clk[i + NPL_CLK_OFFSET]); - if (priv->clk[i]) - clk_disable_unprepare(priv->clk[i]); - } - } - mutex_unlock(&priv->rsc_clk_lock); - return; -} -EXPORT_SYMBOL(bolero_clk_rsc_enable_all_clocks); - -static int bolero_clk_rsc_mux0_clk_request(struct bolero_clk_rsc *priv, - int clk_id, - bool enable) -{ - int ret = 0; - - if (enable) { - /* Enable Requested Core clk */ - if (priv->clk_cnt[clk_id] == 0) { - ret = clk_prepare_enable(priv->clk[clk_id]); - if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", - __func__, clk_id); - goto done; - } - if (priv->clk[clk_id + NPL_CLK_OFFSET]) { - ret = clk_prepare_enable( - priv->clk[clk_id + NPL_CLK_OFFSET]); - if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", - __func__, - clk_id + NPL_CLK_OFFSET); - goto err; - } - } - } - priv->clk_cnt[clk_id]++; - } else { - if (priv->clk_cnt[clk_id] <= 0) { - dev_err_ratelimited(priv->dev, "%s: clk_id: %d is already disabled\n", - __func__, clk_id); - priv->clk_cnt[clk_id] = 0; - goto done; - } - priv->clk_cnt[clk_id]--; - if (priv->clk_cnt[clk_id] == 0) { - if (priv->clk[clk_id + NPL_CLK_OFFSET]) - clk_disable_unprepare( - priv->clk[clk_id + NPL_CLK_OFFSET]); - clk_disable_unprepare(priv->clk[clk_id]); - } - } - return ret; - -err: - clk_disable_unprepare(priv->clk[clk_id]); -done: - return ret; -} - -static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv, - int clk_id, - bool enable) -{ - char __iomem *clk_muxsel = NULL; - int ret = 0; - int default_clk_id = priv->default_clk_id[clk_id]; - u32 muxsel = 0; - - clk_muxsel = bolero_clk_rsc_get_clk_muxsel(priv, clk_id); - if (!clk_muxsel) { - ret = -EINVAL; - goto done; - } - - if (enable) { - if (priv->clk_cnt[clk_id] == 0) { - if (clk_id != VA_CORE_CLK) { - ret = bolero_clk_rsc_mux0_clk_request(priv, - default_clk_id, - true); - if (ret < 0) - goto done; - } - - ret = clk_prepare_enable(priv->clk[clk_id]); - if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", - __func__, clk_id); - goto err_clk; - } - if (priv->clk[clk_id + NPL_CLK_OFFSET]) { - ret = clk_prepare_enable( - priv->clk[clk_id + NPL_CLK_OFFSET]); - if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", - __func__, - clk_id + NPL_CLK_OFFSET); - goto err_npl_clk; - } - } - - /* - * Temp SW workaround to address a glitch issue of - * VA GFMux instance responsible for switching from - * TX MCLK to VA MCLK. This configuration would be taken - * care in DSP itself - */ - if (clk_id != VA_CORE_CLK) { - if (priv->dev_up_gfmux) { - iowrite32(0x1, clk_muxsel); - muxsel = ioread32(clk_muxsel); - trace_printk("%s: muxsel value after enable: %d\n", - __func__, muxsel); - } - bolero_clk_rsc_mux0_clk_request(priv, - default_clk_id, - false); - } - } - priv->clk_cnt[clk_id]++; - } else { - if (priv->clk_cnt[clk_id] <= 0) { - dev_err_ratelimited(priv->dev, "%s: clk_id: %d is already disabled\n", - __func__, clk_id); - priv->clk_cnt[clk_id] = 0; - goto done; - } - priv->clk_cnt[clk_id]--; - if (priv->clk_cnt[clk_id] == 0) { - if (clk_id != VA_CORE_CLK) { - ret = bolero_clk_rsc_mux0_clk_request(priv, - default_clk_id, true); - - if (!ret) { - /* - * Temp SW workaround to address a glitch issue - * of VA GFMux instance responsible for - * switching from TX MCLK to VA MCLK. - * This configuration would be taken - * care in DSP itself. - */ - if (priv->dev_up_gfmux) { - iowrite32(0x0, clk_muxsel); - muxsel = ioread32(clk_muxsel); - trace_printk("%s: muxsel value after disable: %d\n", - __func__, muxsel); - } - } - } - if (priv->clk[clk_id + NPL_CLK_OFFSET]) - clk_disable_unprepare( - priv->clk[clk_id + NPL_CLK_OFFSET]); - clk_disable_unprepare(priv->clk[clk_id]); - - if (clk_id != VA_CORE_CLK) { - if (!ret) - bolero_clk_rsc_mux0_clk_request(priv, - default_clk_id, false); - } - } - } - return ret; - -err_npl_clk: - clk_disable_unprepare(priv->clk[clk_id]); - -err_clk: - if (clk_id != VA_CORE_CLK) - bolero_clk_rsc_mux0_clk_request(priv, default_clk_id, false); -done: - return ret; -} - -static int bolero_clk_rsc_check_and_update_va_clk(struct bolero_clk_rsc *priv, - bool mux_switch, - int clk_id, - bool enable) -{ - int ret = 0; - - if (enable) { - if (clk_id == VA_CORE_CLK && mux_switch) { - /* - * Handle the following usecase scenarios during enable - * 1. VA only, Active clk is VA_CORE_CLK - * 2. record -> record + VA, Active clk is TX_CORE_CLK - */ - if (priv->clk_cnt[TX_CORE_CLK] == 0) { - ret = bolero_clk_rsc_mux1_clk_request(priv, - VA_CORE_CLK, enable); - if (ret < 0) - goto err; - } else { - ret = bolero_clk_rsc_mux0_clk_request(priv, - TX_CORE_CLK, enable); - if (ret < 0) - goto err; - priv->va_tx_clk_cnt++; - } - } else if ((priv->clk_cnt[TX_CORE_CLK] > 0) && - (priv->clk_cnt[VA_CORE_CLK] > 0)) { - /* - * Handle following concurrency scenario during enable - * 1. VA-> Record+VA, Increment TX CLK and Disable VA - * 2. VA-> Playback+VA, Increment TX CLK and Disable VA - */ - while (priv->clk_cnt[VA_CORE_CLK] > 0) { - ret = bolero_clk_rsc_mux0_clk_request(priv, - TX_CORE_CLK, true); - if (ret < 0) - goto err; - - bolero_clk_rsc_mux1_clk_request(priv, - VA_CORE_CLK, false); - priv->va_tx_clk_cnt++; - } - } - } else { - if (clk_id == VA_CORE_CLK && mux_switch) { - /* - * Handle the following usecase scenarios during disable - * 1. VA only, disable VA_CORE_CLK - * 2. Record + VA -> Record, decrement TX CLK count - */ - if (priv->clk_cnt[VA_CORE_CLK]) { - bolero_clk_rsc_mux1_clk_request(priv, - VA_CORE_CLK, enable); - } else if (priv->va_tx_clk_cnt) { - bolero_clk_rsc_mux0_clk_request(priv, - TX_CORE_CLK, enable); - priv->va_tx_clk_cnt--; - } - } else if (priv->va_tx_clk_cnt == priv->clk_cnt[TX_CORE_CLK]) { - /* - * Handle the following usecase scenarios during disable - * Record+VA-> VA: enable VA CLK, decrement TX CLK count - */ - while (priv->va_tx_clk_cnt) { - ret = bolero_clk_rsc_mux1_clk_request(priv, - VA_CORE_CLK, true); - if (ret < 0) - goto err; - - bolero_clk_rsc_mux0_clk_request(priv, - TX_CORE_CLK, false); - priv->va_tx_clk_cnt--; - } - } - } - -err: - return ret; -} - -/** - * bolero_clk_rsc_fs_gen_request - request to enable/disable fs generation - * sequence - * - * @dev: Macro device pointer - * @enable: enable or disable flag - */ -void bolero_clk_rsc_fs_gen_request(struct device *dev, bool enable) -{ - int i; - struct regmap *regmap; - struct device *clk_dev = NULL; - struct bolero_clk_rsc *priv = NULL; - - if (!dev) { - pr_err("%s: dev is null %d\n", __func__); - return; - } - clk_dev = bolero_get_rsc_clk_device_ptr(dev->parent); - if (!clk_dev) { - pr_err("%s: Invalid rsc clk device\n", __func__); - return; - } - priv = dev_get_drvdata(clk_dev); - if (!priv) { - pr_err("%s: Invalid rsc clk priviate data\n", __func__); - return; - } - regmap = dev_get_regmap(priv->dev->parent, NULL); - if (!regmap) { - pr_err("%s: regmap is null\n", __func__); - return; - } - mutex_lock(&priv->fs_gen_lock); - if (enable) { - if (priv->reg_seq_en_cnt++ == 0) { - for (i = 0; i < (priv->num_fs_reg * 2); i += 2) { - dev_dbg(priv->dev, "%s: Register: %d, value: %d\n", - __func__, priv->fs_gen_seq[i], - priv->fs_gen_seq[i + 1]); - regmap_update_bits(regmap, - priv->fs_gen_seq[i], - priv->fs_gen_seq[i + 1], - priv->fs_gen_seq[i + 1]); - } - } - } else { - if (priv->reg_seq_en_cnt <= 0) { - dev_err_ratelimited(priv->dev, "%s: req_seq_cnt: %d is already disabled\n", - __func__, priv->reg_seq_en_cnt); - priv->reg_seq_en_cnt = 0; - mutex_unlock(&priv->fs_gen_lock); - return; - } - if (--priv->reg_seq_en_cnt == 0) { - for (i = ((priv->num_fs_reg - 1) * 2); i >= 0; i -= 2) { - dev_dbg(priv->dev, "%s: Register: %d, value: %d\n", - __func__, priv->fs_gen_seq[i], - priv->fs_gen_seq[i + 1]); - regmap_update_bits(regmap, priv->fs_gen_seq[i], - priv->fs_gen_seq[i + 1], 0x0); - } - } - } - mutex_unlock(&priv->fs_gen_lock); -} -EXPORT_SYMBOL(bolero_clk_rsc_fs_gen_request); - -/** - * bolero_clk_rsc_request_clock - request for clock to - * enable/disable - * - * @dev: Macro device pointer. - * @default_clk_id: mux0 Core clock ID input. - * @clk_id_req: Core clock ID requested to enable/disable - * @enable: enable or disable clock flag - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_clk_rsc_request_clock(struct device *dev, - int default_clk_id, - int clk_id_req, - bool enable) -{ - int ret = 0; - struct device *clk_dev = NULL; - struct bolero_clk_rsc *priv = NULL; - bool mux_switch = false; - - if (!dev) { - pr_err("%s: dev is null %d\n", __func__); - return -EINVAL; - } - if ((clk_id_req < 0 || clk_id_req >= MAX_CLK) && - (default_clk_id < 0 || default_clk_id >= MAX_CLK)) { - pr_err("%s: Invalid clk_id_req: %d or default_clk_id: %d\n", - __func__, clk_id_req, default_clk_id); - return -EINVAL; - } - clk_dev = bolero_get_rsc_clk_device_ptr(dev->parent); - if (!clk_dev) { - pr_err("%s: Invalid rsc clk device\n", __func__); - return -EINVAL; - } - priv = dev_get_drvdata(clk_dev); - if (!priv) { - pr_err("%s: Invalid rsc clk priviate data\n", __func__); - return -EINVAL; - } - - mutex_lock(&priv->rsc_clk_lock); - if (!priv->dev_up && enable) { - dev_err_ratelimited(priv->dev, "%s: SSR is in progress..\n", - __func__); - trace_printk("%s: SSR is in progress..\n", __func__); - ret = -EINVAL; - goto err; - } - priv->default_clk_id[clk_id_req] = default_clk_id; - if (default_clk_id != clk_id_req) - mux_switch = true; - - if (mux_switch) { - if (clk_id_req != VA_CORE_CLK) { - ret = bolero_clk_rsc_mux1_clk_request(priv, clk_id_req, - enable); - if (ret < 0) - goto err; - } - } else { - ret = bolero_clk_rsc_mux0_clk_request(priv, clk_id_req, enable); - if (ret < 0) - goto err; - } - - ret = bolero_clk_rsc_check_and_update_va_clk(priv, mux_switch, - clk_id_req, - enable); - if (ret < 0) - goto err; - - dev_dbg(priv->dev, "%s: clk_cnt: %d for requested clk: %d, enable: %d\n", - __func__, priv->clk_cnt[clk_id_req], clk_id_req, - enable); - trace_printk("%s: clk_cnt: %d for requested clk: %d, enable: %d\n", - __func__, priv->clk_cnt[clk_id_req], clk_id_req, - enable); - - mutex_unlock(&priv->rsc_clk_lock); - - return 0; - -err: - mutex_unlock(&priv->rsc_clk_lock); - return ret; -} -EXPORT_SYMBOL(bolero_clk_rsc_request_clock); - - -static int bolero_clk_rsc_probe(struct platform_device *pdev) -{ - int ret = 0, fs_gen_size, i, j; - const char **clk_name_array; - int clk_cnt; - struct clk *clk; - struct bolero_clk_rsc *priv = NULL; - u32 muxsel = 0; - - priv = devm_kzalloc(&pdev->dev, sizeof(struct bolero_clk_rsc), - GFP_KERNEL); - if (!priv) - return -ENOMEM; - - /* Get clk fs gen sequence from device tree */ - if (!of_find_property(pdev->dev.of_node, "qcom,fs-gen-sequence", - &fs_gen_size)) { - dev_err(&pdev->dev, "%s: unable to find qcom,fs-gen-sequence property\n", - __func__); - ret = -EINVAL; - goto err; - } - priv->num_fs_reg = fs_gen_size/(2 * sizeof(u32)); - priv->fs_gen_seq = devm_kzalloc(&pdev->dev, fs_gen_size, GFP_KERNEL); - if (!priv->fs_gen_seq) { - ret = -ENOMEM; - goto err; - } - dev_dbg(&pdev->dev, "%s: num_fs_reg %d\n", __func__, priv->num_fs_reg); - /* Parse fs-gen-sequence */ - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,fs-gen-sequence", - priv->fs_gen_seq, - priv->num_fs_reg * 2); - if (ret < 0) { - dev_err(&pdev->dev, "%s: unable to parse fs-gen-sequence, ret = %d\n", - __func__, ret); - goto err; - } - - /* Get clk details from device tree */ - clk_cnt = of_property_count_strings(pdev->dev.of_node, "clock-names"); - if (clk_cnt <= 0 || clk_cnt > MAX_CLK) { - dev_err(&pdev->dev, "%s: Invalid number of clocks %d", - __func__, clk_cnt); - ret = -EINVAL; - goto err; - } - clk_name_array = devm_kzalloc(&pdev->dev, clk_cnt * sizeof(char *), - GFP_KERNEL); - if (!clk_name_array) { - ret = -ENOMEM; - goto err; - } - - ret = of_property_read_string_array(pdev->dev.of_node, "clock-names", - clk_name_array, clk_cnt); - - for (i = 0; i < MAX_CLK; i++) { - priv->clk[i] = NULL; - for (j = 0; j < clk_cnt; j++) { - if (!strcmp(clk_src_name[i], clk_name_array[j])) { - clk = devm_clk_get(&pdev->dev, clk_src_name[i]); - if (IS_ERR(clk)) { - ret = PTR_ERR(clk); - dev_err(&pdev->dev, "%s: clk get failed for %s with ret %d\n", - __func__, clk_src_name[i], ret); - goto err; - } - priv->clk[i] = clk; - dev_dbg(&pdev->dev, "%s: clk get success for clk name %s\n", - __func__, clk_src_name[i]); - } - } - } - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,rx_mclk_mode_muxsel", &muxsel); - if (ret) { - dev_dbg(&pdev->dev, "%s: could not find qcom,rx_mclk_mode_muxsel entry in dt\n", - __func__); - } else { - priv->rx_clk_muxsel = devm_ioremap(&pdev->dev, muxsel, 0x4); - if (!priv->rx_clk_muxsel) { - dev_err(&pdev->dev, "%s: ioremap failed for rx muxsel\n", - __func__); - return -ENOMEM; - } - } - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa_mclk_mode_muxsel", &muxsel); - if (ret) { - dev_dbg(&pdev->dev, "%s: could not find qcom,wsa_mclk_mode_muxsel entry in dt\n", - __func__); - } else { - priv->wsa_clk_muxsel = devm_ioremap(&pdev->dev, muxsel, 0x4); - if (!priv->wsa_clk_muxsel) { - dev_err(&pdev->dev, "%s: ioremap failed for wsa muxsel\n", - __func__); - return -ENOMEM; - } - } - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,va_mclk_mode_muxsel", &muxsel); - if (ret) { - dev_dbg(&pdev->dev, "%s: could not find qcom,va_mclk_mode_muxsel entry in dt\n", - __func__); - } else { - priv->va_clk_muxsel = devm_ioremap(&pdev->dev, muxsel, 0x4); - if (!priv->va_clk_muxsel) { - dev_err(&pdev->dev, "%s: ioremap failed for va muxsel\n", - __func__); - return -ENOMEM; - } - } - - ret = bolero_register_res_clk(&pdev->dev, bolero_clk_rsc_cb); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Failed to register cb %d", - __func__, ret); - goto err; - } - priv->dev = &pdev->dev; - priv->dev_up = true; - priv->dev_up_gfmux = true; - mutex_init(&priv->rsc_clk_lock); - mutex_init(&priv->fs_gen_lock); - dev_set_drvdata(&pdev->dev, priv); - -err: - return ret; -} - -static int bolero_clk_rsc_remove(struct platform_device *pdev) -{ - struct bolero_clk_rsc *priv = dev_get_drvdata(&pdev->dev); - - bolero_unregister_res_clk(&pdev->dev); - of_platform_depopulate(&pdev->dev); - if (!priv) - return -EINVAL; - mutex_destroy(&priv->rsc_clk_lock); - mutex_destroy(&priv->fs_gen_lock); - - return 0; -} - -static const struct of_device_id bolero_clk_rsc_dt_match[] = { - {.compatible = "qcom,bolero-clk-rsc-mngr"}, - {} -}; -MODULE_DEVICE_TABLE(of, bolero_clk_rsc_dt_match); - -static struct platform_driver bolero_clk_rsc_mgr = { - .driver = { - .name = "bolero-clk-rsc-mngr", - .owner = THIS_MODULE, - .of_match_table = bolero_clk_rsc_dt_match, - .suppress_bind_attrs = true, - }, - .probe = bolero_clk_rsc_probe, - .remove = bolero_clk_rsc_remove, -}; - -int bolero_clk_rsc_mgr_init(void) -{ - return platform_driver_register(&bolero_clk_rsc_mgr); -} - -void bolero_clk_rsc_mgr_exit(void) -{ - platform_driver_unregister(&bolero_clk_rsc_mgr); -} -MODULE_DESCRIPTION("Bolero clock resource manager driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.h b/techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.h deleted file mode 100644 index cc8ee395ba4d..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/bolero-clk-rsc.h +++ /dev/null @@ -1,52 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - */ - -#ifndef BOLERO_CLK_RSC_H -#define BOLERO_CLK_RSC_H - -#include -#include - -#if IS_ENABLED(CONFIG_SND_SOC_BOLERO) -int bolero_clk_rsc_mgr_init(void); -void bolero_clk_rsc_mgr_exit(void); -void bolero_clk_rsc_fs_gen_request(struct device *dev, - bool enable); -int bolero_clk_rsc_request_clock(struct device *dev, - int default_clk_id, - int clk_id_req, - bool enable); -int bolero_rsc_clk_reset(struct device *dev, int clk_id); -void bolero_clk_rsc_enable_all_clocks(struct device *dev, bool enable); -#else -static inline void bolero_clk_rsc_fs_gen_request(struct device *dev, - bool enable) -{ -} -static inline int bolero_clk_rsc_mgr_init(void) -{ - return 0; -} -static inline void bolero_clk_rsc_mgr_exit(void) -{ -} -static inline int bolero_clk_rsc_request_clock(struct device *dev, - int default_clk_id, - int clk_id_req, - bool enable) -{ - return 0; -} -static inline int bolero_rsc_clk_reset(struct device *dev, int clk_id) -{ - return 0; -} -static inline void bolero_clk_rsc_enable_all_clocks(struct device *dev, - bool enable) -{ - return; -} -#endif /* CONFIG_SND_SOC_BOLERO */ -#endif /* BOLERO_CLK_RSC_H */ diff --git a/techpack/audio/4.0/asoc/codecs/bolero/internal.h b/techpack/audio/4.0/asoc/codecs/bolero/internal.h deleted file mode 100644 index 6ef7083f749d..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/internal.h +++ /dev/null @@ -1,107 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#ifndef _BOLERO_INTERNAL_H -#define _BOLERO_INTERNAL_H - -#include "bolero-cdc-registers.h" - -#define BOLERO_CDC_CHILD_DEVICES_MAX 6 - -/* from bolero to WCD events */ -enum { - BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR = 1, - BOLERO_WCD_EVT_PA_OFF_PRE_SSR, - BOLERO_WCD_EVT_SSR_DOWN, - BOLERO_WCD_EVT_SSR_UP, - BOLERO_WCD_EVT_PA_ON_POST_FSCLK, -}; - -enum { - REG_NO_ACCESS, - RD_REG, - WR_REG, - RD_WR_REG -}; - -/* from WCD to bolero events */ -enum { - WCD_BOLERO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ - WCD_BOLERO_EVT_IMPED_TRUE, /* for imped true */ - WCD_BOLERO_EVT_IMPED_FALSE, /* for imped false */ - WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST, - WCD_BOLERO_EVT_BCS_CLK_OFF, -}; - -struct wcd_ctrl_platform_data { - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -struct bolero_priv { - struct device *dev; - struct snd_soc_codec *codec; - struct regmap *regmap; - struct mutex io_lock; - struct mutex clk_lock; - struct mutex vote_lock; - bool va_without_decimation; - bool macros_supported[MAX_MACRO]; - bool dev_up; - bool initial_boot; - struct macro_ops macro_params[MAX_MACRO]; - struct snd_soc_dai_driver *bolero_dais; - u16 num_dais; - u16 num_macros_registered; - u16 num_macros; - u16 current_mclk_mux_macro[MAX_MACRO]; - struct work_struct bolero_add_child_devices_work; - u32 version; - struct clk *lpass_core_hw_vote; - struct clk *lpass_audio_hw_vote; - int core_hw_vote_count; - int core_audio_vote_count; - - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - - int (*read_dev)(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 *val); - int (*write_dev)(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 val); - struct platform_device *pdev_child_devices - [BOLERO_CDC_CHILD_DEVICES_MAX]; - u16 child_count; - struct wcd_ctrl_platform_data plat_data; - struct device *wcd_dev; - struct blocking_notifier_head notifier; - struct device *clk_dev; - rsc_clk_cb_t rsc_clk_cb; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - s32 dmic_6_7_clk_cnt; - u8 dmic_0_1_clk_div; - u8 dmic_2_3_clk_div; - u8 dmic_4_5_clk_div; - u8 dmic_6_7_clk_div; -}; - -struct regmap *bolero_regmap_init(struct device *dev, - const struct regmap_config *config); -int bolero_get_macro_id(bool va_no_dec_flag, u16 reg); - -extern const struct regmap_config bolero_regmap_config; -extern u8 *bolero_reg_access[MAX_MACRO]; -extern u8 bolero_va_top_reg_access[BOLERO_CDC_VA_MACRO_TOP_MAX]; -extern u8 bolero_va_reg_access_v2[BOLERO_CDC_VA_MACRO_MAX]; -extern u8 bolero_va_reg_access_v3[BOLERO_CDC_VA_MACRO_MAX]; -extern u8 bolero_tx_reg_access_v2[BOLERO_CDC_TX_MACRO_MAX]; -extern const u16 macro_id_base_offset[MAX_MACRO]; - -#endif diff --git a/techpack/audio/4.0/asoc/codecs/bolero/rx-macro.c b/techpack/audio/4.0/asoc/codecs/bolero/rx-macro.c deleted file mode 100644 index cfba3d5b9a02..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/rx-macro.c +++ /dev/null @@ -1,4074 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" -#include "bolero-clk-rsc.h" - -#define AUTO_SUSPEND_DELAY 50 /* delay in msec */ -#define RX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\ - SNDRV_PCM_RATE_384000) -/* Fractional Rates */ -#define RX_MACRO_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800) - -#define RX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) - -#define RX_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_48000) -#define RX_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_352P8KHZ 352800 - -#define RX_MACRO_MAX_OFFSET 0x1000 - -#define RX_MACRO_MAX_DMA_CH_PER_PORT 2 -#define RX_SWR_STRING_LEN 80 -#define RX_MACRO_CHILD_DEVICES_MAX 3 - -#define RX_MACRO_INTERP_MUX_NUM_INPUTS 3 -#define RX_MACRO_SIDETONE_IIR_COEFF_MAX 5 - -#define STRING(name) #name -#define RX_MACRO_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define RX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define RX_MACRO_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -#define RX_MACRO_RX_PATH_OFFSET 0x80 -#define RX_MACRO_COMP_OFFSET 0x40 - -#define MAX_IMPED_PARAMS 6 - -#define RX_MACRO_EC_MIX_TX0_MASK 0xf0 -#define RX_MACRO_EC_MIX_TX1_MASK 0x0f -#define RX_MACRO_EC_MIX_TX2_MASK 0x0f - -#define COMP_MAX_COEFF 25 - -struct wcd_imped_val { - u32 imped_val; - u8 index; -}; - -static const struct wcd_imped_val imped_index[] = { - {4, 0}, - {5, 1}, - {6, 2}, - {7, 3}, - {8, 4}, - {9, 5}, - {10, 6}, - {11, 7}, - {12, 8}, - {13, 9}, -}; - -struct comp_coeff_val { - u8 lsb; - u8 msb; -}; - -enum { - HPH_ULP, - HPH_LOHIFI, - HPH_MODE_MAX, -}; - -static const struct comp_coeff_val - comp_coeff_table [HPH_MODE_MAX][COMP_MAX_COEFF] = { - { - {0x40, 0x00}, - {0x4C, 0x00}, - {0x5A, 0x00}, - {0x6B, 0x00}, - {0x7F, 0x00}, - {0x97, 0x00}, - {0xB3, 0x00}, - {0xD5, 0x00}, - {0xFD, 0x00}, - {0x2D, 0x01}, - {0x66, 0x01}, - {0xA7, 0x01}, - {0xF8, 0x01}, - {0x57, 0x02}, - {0xC7, 0x02}, - {0x4B, 0x03}, - {0xE9, 0x03}, - {0xA3, 0x04}, - {0x7D, 0x05}, - {0x90, 0x06}, - {0xD1, 0x07}, - {0x49, 0x09}, - {0x00, 0x0B}, - {0x01, 0x0D}, - {0x59, 0x0F}, - }, - { - {0x40, 0x00}, - {0x4C, 0x00}, - {0x5A, 0x00}, - {0x6B, 0x00}, - {0x80, 0x00}, - {0x98, 0x00}, - {0xB4, 0x00}, - {0xD5, 0x00}, - {0xFE, 0x00}, - {0x2E, 0x01}, - {0x66, 0x01}, - {0xA9, 0x01}, - {0xF8, 0x01}, - {0x56, 0x02}, - {0xC4, 0x02}, - {0x4F, 0x03}, - {0xF0, 0x03}, - {0xAE, 0x04}, - {0x8B, 0x05}, - {0x8E, 0x06}, - {0xBC, 0x07}, - {0x56, 0x09}, - {0x0F, 0x0B}, - {0x13, 0x0D}, - {0x6F, 0x0F}, - }, -}; - -struct rx_macro_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -static const struct rx_macro_reg_mask_val imped_table[][MAX_IMPED_PARAMS] = { - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01}, - }, -}; - -enum { - INTERP_HPHL, - INTERP_HPHR, - INTERP_AUX, - INTERP_MAX -}; - -enum { - RX_MACRO_RX0, - RX_MACRO_RX1, - RX_MACRO_RX2, - RX_MACRO_RX3, - RX_MACRO_RX4, - RX_MACRO_RX5, - RX_MACRO_PORTS_MAX -}; - -enum { - RX_MACRO_COMP1, /* HPH_L */ - RX_MACRO_COMP2, /* HPH_R */ - RX_MACRO_COMP_MAX -}; - -enum { - RX_MACRO_EC0_MUX = 0, - RX_MACRO_EC1_MUX, - RX_MACRO_EC2_MUX, - RX_MACRO_EC_MUX_MAX, -}; - -enum { - INTn_1_INP_SEL_ZERO = 0, - INTn_1_INP_SEL_DEC0, - INTn_1_INP_SEL_DEC1, - INTn_1_INP_SEL_IIR0, - INTn_1_INP_SEL_IIR1, - INTn_1_INP_SEL_RX0, - INTn_1_INP_SEL_RX1, - INTn_1_INP_SEL_RX2, - INTn_1_INP_SEL_RX3, - INTn_1_INP_SEL_RX4, - INTn_1_INP_SEL_RX5, -}; - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_RX2, - INTn_2_INP_SEL_RX3, - INTn_2_INP_SEL_RX4, - INTn_2_INP_SEL_RX5, -}; - -enum { - INTERP_MAIN_PATH, - INTERP_MIX_PATH, -}; - -/* Codec supports 2 IIR filters */ -enum { - IIR0 = 0, - IIR1, - IIR_MAX, -}; - -/* Each IIR has 5 Filter Stages */ -enum { - BAND1 = 0, - BAND2, - BAND3, - BAND4, - BAND5, - BAND_MAX, -}; - -struct rx_macro_idle_detect_config { - u8 hph_idle_thr; - u8 hph_idle_detect_en; -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -static struct interp_sample_rate sr_val_tbl[] = { - {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5}, - {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA}, - {176400, 0xB}, {352800, 0xC}, -}; - -struct rx_macro_bcl_pmic_params { - u8 id; - u8 sid; - u8 ppid; -}; - -static int rx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai); -static int rx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot); -static int rx_macro_digital_mute(struct snd_soc_dai *dai, int mute); -static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int rx_macro_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int rx_macro_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int rx_macro_enable_interp_clk(struct snd_soc_codec *codec, - int event, int interp_idx); - -/* Hold instance to soundwire platform device */ -struct rx_swr_ctrl_data { - struct platform_device *rx_swr_pdev; -}; - -struct rx_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*core_vote)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -enum { - RX_MACRO_AIF_INVALID = 0, - RX_MACRO_AIF1_PB, - RX_MACRO_AIF2_PB, - RX_MACRO_AIF3_PB, - RX_MACRO_AIF4_PB, - RX_MACRO_AIF_ECHO, - RX_MACRO_MAX_DAIS, -}; - -enum { - RX_MACRO_AIF1_CAP = 0, - RX_MACRO_AIF2_CAP, - RX_MACRO_AIF3_CAP, - RX_MACRO_MAX_AIF_CAP_DAIS -}; -/* - * @dev: rx macro device pointer - * @comp_enabled: compander enable mixer value set - * @prim_int_users: Users of interpolator - * @rx_mclk_users: RX MCLK users count - * @vi_feed_value: VI sense mask - * @swr_clk_lock: to lock swr master clock operations - * @swr_ctrl_data: SoundWire data structure - * @swr_plat_data: Soundwire platform data - * @rx_macro_add_child_devices_work: work for adding child devices - * @rx_swr_gpio_p: used by pinctrl API - * @codec: codec handle - */ -struct rx_macro_priv { - struct device *dev; - int comp_enabled[RX_MACRO_COMP_MAX]; - /* Main path clock users count */ - int main_clk_users[INTERP_MAX]; - int rx_port_value[RX_MACRO_PORTS_MAX]; - u16 prim_int_users[INTERP_MAX]; - int rx_mclk_users; - int swr_clk_users; - bool dapm_mclk_enable; - bool reset_swr; - int clsh_users; - int rx_mclk_cnt; - bool is_native_on; - bool is_ear_mode_on; - bool dev_up; - bool hph_pwr_mode; - bool hph_hd2_mode; - struct mutex mclk_lock; - struct mutex swr_clk_lock; - struct rx_swr_ctrl_data *swr_ctrl_data; - struct rx_swr_ctrl_platform_data swr_plat_data; - struct work_struct rx_macro_add_child_devices_work; - struct device_node *rx_swr_gpio_p; - struct snd_soc_codec *codec; - unsigned long active_ch_mask[RX_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[RX_MACRO_MAX_DAIS]; - u16 bit_width[RX_MACRO_MAX_DAIS]; - char __iomem *rx_io_base; - char __iomem *rx_mclk_mode_muxsel; - struct rx_macro_idle_detect_config idle_det_cfg; - u8 sidetone_coeff_array[IIR_MAX][BAND_MAX] - [RX_MACRO_SIDETONE_IIR_COEFF_MAX * 4]; - - struct platform_device *pdev_child_devices - [RX_MACRO_CHILD_DEVICES_MAX]; - int child_count; - int is_softclip_on; - int is_aux_hpf_on; - int softclip_clk_users; - struct rx_macro_bcl_pmic_params bcl_pmic_params; - u16 clk_id; - u16 default_clk_id; -}; - -static struct snd_soc_dai_driver rx_macro_dai[]; -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -static const char * const rx_int_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5" -}; - -static const char * const rx_prim_mix_text[] = { - "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2", - "RX3", "RX4", "RX5" -}; - -static const char * const rx_sidetone_mix_text[] = { - "ZERO", "SRC0", "SRC1", "SRC_SUM" -}; - -static const char * const iir_inp_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", - "RX0", "RX1", "RX2", "RX3", "RX4", "RX5" -}; - -static const char * const rx_int_dem_inp_mux_text[] = { - "NORMAL_DSM_OUT", "CLSH_DSM_OUT", -}; - -static const char * const rx_int0_1_interp_mux_text[] = { - "ZERO", "RX INT0_1 MIX1", -}; - -static const char * const rx_int1_1_interp_mux_text[] = { - "ZERO", "RX INT1_1 MIX1", -}; - -static const char * const rx_int2_1_interp_mux_text[] = { - "ZERO", "RX INT2_1 MIX1", -}; - -static const char * const rx_int0_2_interp_mux_text[] = { - "ZERO", "RX INT0_2 MUX", -}; - -static const char * const rx_int1_2_interp_mux_text[] = { - "ZERO", "RX INT1_2 MUX", -}; - -static const char * const rx_int2_2_interp_mux_text[] = { - "ZERO", "RX INT2_2 MUX", -}; - -static const char *const rx_macro_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB" -}; - -static const char *const rx_macro_ear_mode_text[] = {"OFF", "ON"}; -static const struct soc_enum rx_macro_ear_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_ear_mode_text); - -static const char *const rx_macro_hph_hd2_mode_text[] = {"OFF", "ON"}; -static const struct soc_enum rx_macro_hph_hd2_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_hd2_mode_text); - -static const char *const rx_macro_hph_pwr_mode_text[] = {"ULP", "LOHIFI"}; -static const struct soc_enum rx_macro_hph_pwr_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_pwr_mode_text); - -static const char * const rx_macro_vbat_bcl_gsm_mode_text[] = {"OFF", "ON"}; -static const struct soc_enum rx_macro_vbat_bcl_gsm_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_vbat_bcl_gsm_mode_text); - -static const struct snd_kcontrol_new rx_int2_1_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("RX AUX VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const char * const hph_idle_detect_text[] = {"OFF", "ON"}; - -static SOC_ENUM_SINGLE_EXT_DECL(hph_idle_detect_enum, hph_idle_detect_text); - -RX_MACRO_DAPM_ENUM(rx_int0_2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, - rx_int_mix_mux_text); -RX_MACRO_DAPM_ENUM(rx_int1_2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, - rx_int_mix_mux_text); -RX_MACRO_DAPM_ENUM(rx_int2_2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, - rx_int_mix_mux_text); - - -RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 4, - rx_prim_mix_text); - -RX_MACRO_DAPM_ENUM(rx_int0_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2, - rx_sidetone_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4, - rx_sidetone_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6, - rx_sidetone_mix_text); - -RX_MACRO_DAPM_ENUM(iir0_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir0_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir0_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir0_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0, - iir_inp_mux_text); - -RX_MACRO_DAPM_ENUM(rx_int0_1_interp, SND_SOC_NOPM, 0, - rx_int0_1_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_interp, SND_SOC_NOPM, 0, - rx_int1_1_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_interp, SND_SOC_NOPM, 0, - rx_int2_1_interp_mux_text); - -RX_MACRO_DAPM_ENUM(rx_int0_2_interp, SND_SOC_NOPM, 0, - rx_int0_2_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int1_2_interp, SND_SOC_NOPM, 0, - rx_int1_2_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int2_2_interp, SND_SOC_NOPM, 0, - rx_int2_2_interp_mux_text); - -RX_MACRO_DAPM_ENUM_EXT(rx_int0_dem_inp, BOLERO_CDC_RX_RX0_RX_PATH_CFG1, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - rx_macro_int_dem_inp_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_int1_dem_inp, BOLERO_CDC_RX_RX1_RX_PATH_CFG1, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - rx_macro_int_dem_inp_mux_put); - -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx0, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx1, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx2, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx3, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx4, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx5, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); - -static const char * const rx_echo_mux_text[] = { - "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2" -}; - -static const struct soc_enum rx_mix_tx2_mux_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5, 0, 4, - rx_echo_mux_text); - -static const struct snd_kcontrol_new rx_mix_tx2_mux = - SOC_DAPM_ENUM("RX MIX TX2_MUX Mux", rx_mix_tx2_mux_enum); - -static const struct soc_enum rx_mix_tx1_mux_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0, 4, - rx_echo_mux_text); - -static const struct snd_kcontrol_new rx_mix_tx1_mux = - SOC_DAPM_ENUM("RX MIX TX1_MUX Mux", rx_mix_tx1_mux_enum); - -static const struct soc_enum rx_mix_tx0_mux_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 4, 4, - rx_echo_mux_text); - -static const struct snd_kcontrol_new rx_mix_tx0_mux = - SOC_DAPM_ENUM("RX MIX TX0_MUX Mux", rx_mix_tx0_mux_enum); - -static struct snd_soc_dai_ops rx_macro_dai_ops = { - .hw_params = rx_macro_hw_params, - .get_channel_map = rx_macro_get_channel_map, - .digital_mute = rx_macro_digital_mute, -}; - -static struct snd_soc_dai_driver rx_macro_dai[] = { - { - .name = "rx_macro_rx1", - .id = RX_MACRO_AIF1_PB, - .playback = { - .stream_name = "RX_MACRO_AIF1 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_rx2", - .id = RX_MACRO_AIF2_PB, - .playback = { - .stream_name = "RX_MACRO_AIF2 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_rx3", - .id = RX_MACRO_AIF3_PB, - .playback = { - .stream_name = "RX_MACRO_AIF3 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_rx4", - .id = RX_MACRO_AIF4_PB, - .playback = { - .stream_name = "RX_MACRO_AIF4 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_echo", - .id = RX_MACRO_AIF_ECHO, - .capture = { - .stream_name = "RX_AIF_ECHO Capture", - .rates = RX_MACRO_ECHO_RATES, - .formats = RX_MACRO_ECHO_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 3, - }, - .ops = &rx_macro_dai_ops, - }, -}; - -static int get_impedance_index(int imped) -{ - int i = 0; - - if (imped < imped_index[i].imped_val) { - pr_debug("%s, detected impedance is less than %d Ohm\n", - __func__, imped_index[i].imped_val); - i = 0; - goto ret; - } - if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) { - pr_debug("%s, detected impedance is greater than %d Ohm\n", - __func__, - imped_index[ARRAY_SIZE(imped_index) - 1].imped_val); - i = ARRAY_SIZE(imped_index) - 1; - goto ret; - } - for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) { - if (imped >= imped_index[i].imped_val && - imped < imped_index[i + 1].imped_val) - break; - } -ret: - pr_debug("%s: selected impedance index = %d\n", - __func__, imped_index[i].index); - return imped_index[i].index; -} - -/* - * rx_macro_wcd_clsh_imped_config - - * This function updates HPHL and HPHR gain settings - * according to the impedance value. - * - * @codec: codec pointer handle - * @imped: impedance value of HPHL/R - * @reset: bool variable to reset registers when teardown - */ -static void rx_macro_wcd_clsh_imped_config(struct snd_soc_codec *codec, - int imped, bool reset) -{ - int i; - int index = 0; - int table_size; - - static const struct rx_macro_reg_mask_val - (*imped_table_ptr)[MAX_IMPED_PARAMS]; - - table_size = ARRAY_SIZE(imped_table); - imped_table_ptr = imped_table; - /* reset = 1, which means request is to reset the register values */ - if (reset) { - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, 0); - return; - } - index = get_impedance_index(imped); - if (index >= (ARRAY_SIZE(imped_index) - 1)) { - pr_debug("%s, impedance not in range = %d\n", __func__, imped); - return; - } - if (index >= table_size) { - pr_debug("%s, impedance index not in range = %d\n", __func__, - index); - return; - } - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, - imped_table_ptr[index][i].val); -} - -static bool rx_macro_get_data(struct snd_soc_codec *codec, - struct device **rx_dev, - struct rx_macro_priv **rx_priv, - const char *func_name) -{ - *rx_dev = bolero_get_device_ptr(codec->dev, RX_MACRO); - - if (!(*rx_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - - *rx_priv = dev_get_drvdata((*rx_dev)); - if (!(*rx_priv)) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - - if (!(*rx_priv)->codec) { - dev_err(codec->dev, - "%s: tx_priv codec is not initialized!\n", func_name); - return false; - } - - return true; -} - -static int rx_macro_set_port_map(struct snd_soc_codec *codec, - u32 usecase, u32 size, void *data) -{ - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - struct swrm_port_config port_cfg; - int ret = 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - memset(&port_cfg, 0, sizeof(port_cfg)); - port_cfg.uc = usecase; - port_cfg.size = size; - port_cfg.params = data; - - if (rx_priv->swr_ctrl_data) - ret = swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_SET_PORT_MAP, &port_cfg); - - return ret; -} - -static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val = 0; - unsigned short look_ahead_dly_reg = - BOLERO_CDC_RX_RX0_RX_PATH_CFG0; - - val = ucontrol->value.enumerated.item[0]; - if (val >= e->items) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - if (e->reg == BOLERO_CDC_RX_RX0_RX_PATH_CFG1) - look_ahead_dly_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0; - else if (e->reg == BOLERO_CDC_RX_RX1_RX_PATH_CFG1) - look_ahead_dly_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0; - - /* Set Look Ahead Delay */ - snd_soc_update_bits(codec, look_ahead_dly_reg, - 0x08, (val ? 0x08 : 0x00)); - /* Set DEM INP Select */ - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int rx_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_1_mix1_inp = 0; - u32 j = 0, port = 0; - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u16 int_fs_reg = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - u8 inp0_sel = 0, inp1_sel = 0, inp2_sel = 0; - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id], - RX_MACRO_PORTS_MAX) { - int_1_mix1_inp = port; - if ((int_1_mix1_inp < RX_MACRO_RX0) || - (int_1_mix1_inp > RX_MACRO_PORTS_MAX)) { - pr_err("%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0; - - /* - * Loop through all interpolator MUX inputs and find out - * to which interpolator input, the rx port - * is connected - */ - for (j = 0; j < INTERP_MAX; j++) { - int_mux_cfg1 = int_mux_cfg0 + 4; - - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - inp0_sel = int_mux_cfg0_val & 0x0F; - inp1_sel = (int_mux_cfg0_val >> 4) & 0x0F; - inp2_sel = (int_mux_cfg1_val >> 4) & 0x0F; - if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || - (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || - (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) { - int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - 0x80 * j; - pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_1\n", - __func__, dai->id, j); - pr_debug("%s: set INT%u_1 sample rate to %u\n", - __func__, j, sample_rate); - /* sample_rate is in Hz */ - snd_soc_update_bits(codec, int_fs_reg, - 0x0F, rate_reg_val); - } - int_mux_cfg0 += 8; - } - } - - return 0; -} - -static int rx_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_2_inp = 0; - u32 j = 0, port = 0; - u16 int_mux_cfg1 = 0, int_fs_reg = 0; - u8 int_mux_cfg1_val = 0; - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id], - RX_MACRO_PORTS_MAX) { - int_2_inp = port; - if ((int_2_inp < RX_MACRO_RX0) || - (int_2_inp > RX_MACRO_PORTS_MAX)) { - pr_err("%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg1 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1; - for (j = 0; j < INTERP_MAX; j++) { - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) & - 0x0F; - if (int_mux_cfg1_val == int_2_inp + - INTn_2_INP_SEL_RX0) { - int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + - 0x80 * j; - pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_2\n", - __func__, dai->id, j); - pr_debug("%s: set INT%u_2 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, - 0x0F, rate_reg_val); - } - int_mux_cfg1 += 8; - } - } - return 0; -} - -static bool rx_macro_is_fractional_sample_rate(u32 sample_rate) -{ - switch (sample_rate) { - case SAMPLING_RATE_44P1KHZ: - case SAMPLING_RATE_88P2KHZ: - case SAMPLING_RATE_176P4KHZ: - case SAMPLING_RATE_352P8KHZ: - return true; - default: - return false; - } - return false; -} - -static int rx_macro_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - int rate_val = 0; - int i = 0, ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - - for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) { - if (sample_rate == sr_val_tbl[i].sample_rate) { - rate_val = sr_val_tbl[i].rate_val; - if (rx_macro_is_fractional_sample_rate(sample_rate)) - rx_priv->is_native_on = true; - else - rx_priv->is_native_on = false; - break; - } - } - if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) { - dev_err(codec->dev, "%s: Unsupported sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - } - - ret = rx_macro_set_prim_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - ret = rx_macro_set_mix_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - - return ret; -} - -static int rx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct snd_soc_codec *codec = dai->codec; - int ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = rx_macro_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - pr_err("%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - rx_priv->bit_width[dai->id] = params_width(params); - break; - case SNDRV_PCM_STREAM_CAPTURE: - default: - break; - } - return 0; -} - -static int rx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - unsigned int temp = 0, ch_mask = 0; - u16 val = 0, mask = 0, cnt = 0, i = 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case RX_MACRO_AIF1_PB: - case RX_MACRO_AIF2_PB: - case RX_MACRO_AIF3_PB: - case RX_MACRO_AIF4_PB: - for_each_set_bit(temp, &rx_priv->active_ch_mask[dai->id], - RX_MACRO_PORTS_MAX) { - ch_mask |= (1 << temp); - if (++i == RX_MACRO_MAX_DMA_CH_PER_PORT) - break; - } - /* - * CDC_DMA_RX_0 port drives RX0/RX1 -- ch_mask 0x1/0x2/0x3 - * CDC_DMA_RX_1 port drives RX2/RX3 -- ch_mask 0x1/0x2/0x3 - * CDC_DMA_RX_2 port drives RX4 -- ch_mask 0x1 - * CDC_DMA_RX_3 port drives RX5 -- ch_mask 0x1 - * AIFn can pair to any CDC_DMA_RX_n port. - * In general, below convention is used:: - * CDC_DMA_RX_0(AIF1)/CDC_DMA_RX_1(AIF2)/ - * CDC_DMA_RX_2(AIF3)/CDC_DMA_RX_3(AIF4) - * Above is reflected in machine driver BE dailink - */ - if (ch_mask & 0x0C) - ch_mask = ch_mask >> 2; - if ((ch_mask & 0x10) || (ch_mask & 0x20)) - ch_mask = 0x1; - *rx_slot = ch_mask; - *rx_num = rx_priv->active_ch_cnt[dai->id]; - dev_dbg(rx_priv->dev, - "%s: dai->id:%d, ch_mask:0x%x, active_ch_cnt:%d active_mask: 0x%x\n", - __func__, dai->id, *rx_slot, *rx_num, rx_priv->active_ch_mask[dai->id]); - break; - case RX_MACRO_AIF_ECHO: - val = snd_soc_read(codec, - BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4); - if (val & RX_MACRO_EC_MIX_TX0_MASK) { - mask |= 0x1; - cnt++; - } - if (val & RX_MACRO_EC_MIX_TX1_MASK) { - mask |= 0x2; - cnt++; - } - val = snd_soc_read(codec, - BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5); - if (val & RX_MACRO_EC_MIX_TX2_MASK) { - mask |= 0x4; - cnt++; - } - *tx_slot = mask; - *tx_num = cnt; - break; - default: - dev_err(rx_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static int rx_macro_digital_mute(struct snd_soc_dai *dai, int mute) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - uint16_t j = 0, reg = 0, mix_reg = 0, dsm_reg = 0; - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - - if (mute) - return 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case RX_MACRO_AIF1_PB: - case RX_MACRO_AIF2_PB: - case RX_MACRO_AIF3_PB: - case RX_MACRO_AIF4_PB: - for (j = 0; j < INTERP_MAX; j++) { - reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - (j * RX_MACRO_RX_PATH_OFFSET); - mix_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + - (j * RX_MACRO_RX_PATH_OFFSET); - dsm_reg = BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL + - (j * RX_MACRO_RX_PATH_OFFSET); - if (j == INTERP_AUX) - dsm_reg = BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL; - int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0 + j * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, - int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, - int_mux_cfg1); - if (snd_soc_read(codec, dsm_reg) & 0x01) { - if (int_mux_cfg0_val || (int_mux_cfg1_val & 0xF0)) - snd_soc_update_bits(codec, - reg, 0x20, 0x20); - if (int_mux_cfg1_val & 0x0F) { - snd_soc_update_bits(codec, - reg, 0x20, 0x20); - snd_soc_update_bits(codec, - mix_reg, 0x20, 0x20); - } - } - } - break; - default: - break; - } - return 0; -} - -static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv, - bool mclk_enable, bool dapm) -{ - struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(rx_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, rx_priv->rx_mclk_users); - - mutex_lock(&rx_priv->mclk_lock); - if (mclk_enable) { - if (rx_priv->rx_mclk_users == 0) { - if (rx_priv->is_native_on) - rx_priv->clk_id = RX_CORE_CLK; - ret = bolero_clk_rsc_request_clock(rx_priv->dev, - rx_priv->default_clk_id, - rx_priv->clk_id, - true); - if (ret < 0) { - dev_err(rx_priv->dev, - "%s: rx request clock enable failed\n", - __func__); - goto exit; - } - bolero_clk_rsc_fs_gen_request(rx_priv->dev, - true); - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - RX_START_OFFSET, - RX_MAX_OFFSET); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x02, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - } - rx_priv->rx_mclk_users++; - } else { - if (rx_priv->rx_mclk_users <= 0) { - dev_err(rx_priv->dev, "%s: clock already disabled\n", - __func__); - rx_priv->rx_mclk_users = 0; - goto exit; - } - rx_priv->rx_mclk_users--; - if (rx_priv->rx_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - bolero_clk_rsc_fs_gen_request(rx_priv->dev, - false); - bolero_clk_rsc_request_clock(rx_priv->dev, - rx_priv->default_clk_id, - rx_priv->clk_id, - false); - rx_priv->clk_id = rx_priv->default_clk_id; - } - } -exit: - trace_printk("%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, rx_priv->rx_mclk_users); - mutex_unlock(&rx_priv->mclk_lock); - return ret; -} - -static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - int mclk_freq = MCLK_FREQ; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(rx_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (rx_priv->is_native_on) - mclk_freq = MCLK_FREQ_NATIVE; - if (rx_priv->swr_ctrl_data) - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_CLK_FREQ, &mclk_freq); - ret = rx_macro_mclk_enable(rx_priv, 1, true); - if (ret) - rx_priv->dapm_mclk_enable = false; - else - rx_priv->dapm_mclk_enable = true; - break; - case SND_SOC_DAPM_POST_PMD: - if (rx_priv->dapm_mclk_enable) - ret = rx_macro_mclk_enable(rx_priv, 0, true); - break; - default: - dev_err(rx_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int rx_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - u16 reg = 0, reg_mix = 0, rx_idx = 0, mute = 0x0, val = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - int ret = 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_RX_MUTE: - rx_idx = data >> 0x10; - mute = data & 0xffff; - val = mute ? 0x10 : 0x00; - reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (rx_idx * - RX_MACRO_RX_PATH_OFFSET); - reg_mix = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + (rx_idx * - RX_MACRO_RX_PATH_OFFSET); - snd_soc_update_bits(codec, reg, 0x10, val); - snd_soc_update_bits(codec, reg_mix, 0x10, val); - break; - case BOLERO_MACRO_EVT_RX_COMPANDER_SOFT_RST: - rx_idx = data >> 0x10; - if (rx_idx == INTERP_AUX) - goto done; - reg = BOLERO_CDC_RX_COMPANDER0_CTL0 + - (rx_idx * RX_MACRO_COMP_OFFSET); - snd_soc_write(codec, reg, - snd_soc_read(codec, reg)); - break; - case BOLERO_MACRO_EVT_IMPED_TRUE: - rx_macro_wcd_clsh_imped_config(codec, data, true); - break; - case BOLERO_MACRO_EVT_IMPED_FALSE: - rx_macro_wcd_clsh_imped_config(codec, data, false); - break; - case BOLERO_MACRO_EVT_SSR_DOWN: - trace_printk("%s, enter SSR down\n", __func__); - rx_priv->dev_up = false; - if (rx_priv->swr_ctrl_data) { - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - } - if ((!pm_runtime_enabled(rx_dev) || - !pm_runtime_suspended(rx_dev))) { - ret = bolero_runtime_suspend(rx_dev); - if (!ret) { - pm_runtime_disable(rx_dev); - pm_runtime_set_suspended(rx_dev); - pm_runtime_enable(rx_dev); - } - } - break; - case BOLERO_MACRO_EVT_SSR_UP: - trace_printk("%s, enter SSR up\n", __func__); - rx_priv->dev_up = true; - /* reset swr after ssr/pdr */ - rx_priv->reset_swr = true; - /* enable&disable RX_CORE_CLK to reset GFMUX reg */ - ret = bolero_clk_rsc_request_clock(rx_priv->dev, - rx_priv->default_clk_id, - RX_CORE_CLK, true); - if (ret < 0) - dev_err_ratelimited(rx_priv->dev, - "%s, failed to enable clk, ret:%d\n", - __func__, ret); - else - bolero_clk_rsc_request_clock(rx_priv->dev, - rx_priv->default_clk_id, - RX_CORE_CLK, false); - - if (rx_priv->swr_ctrl_data) - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - break; - case BOLERO_MACRO_EVT_CLK_RESET: - bolero_rsc_clk_reset(rx_dev, RX_CORE_CLK); - break; - } -done: - return ret; -} - -static int rx_macro_find_playback_dai_id_for_port(int port_id, - struct rx_macro_priv *rx_priv) -{ - int i = 0; - - for (i = RX_MACRO_AIF1_PB; i < RX_MACRO_MAX_DAIS; i++) { - if (test_bit(port_id, &rx_priv->active_ch_mask[i])) - return i; - } - - return -EINVAL; -} - -static int rx_macro_set_idle_detect_thr(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp, int path_type) -{ - int port_id[4] = { 0, 0, 0, 0 }; - int *port_ptr = NULL; - int num_ports = 0; - int bit_width = 0, i = 0; - int mux_reg = 0, mux_reg_val = 0; - int dai_id = 0, idle_thr = 0; - - if ((interp != INTERP_HPHL) && (interp != INTERP_HPHR)) - return 0; - - if (!rx_priv->idle_det_cfg.hph_idle_detect_en) - return 0; - - port_ptr = &port_id[0]; - num_ports = 0; - - /* - * Read interpolator MUX input registers and find - * which cdc_dma port is connected and store the port - * numbers in port_id array. - */ - if (path_type == INTERP_MIX_PATH) { - mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1 + - 2 * interp; - mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f; - - if ((mux_reg_val >= INTn_2_INP_SEL_RX0) && - (mux_reg_val <= INTn_2_INP_SEL_RX5)) { - *port_ptr++ = mux_reg_val - 1; - num_ports++; - } - } - - if (path_type == INTERP_MAIN_PATH) { - mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0 + - 2 * (interp - 1); - mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f; - i = RX_MACRO_INTERP_MUX_NUM_INPUTS; - - while (i) { - if ((mux_reg_val >= INTn_1_INP_SEL_RX0) && - (mux_reg_val <= INTn_1_INP_SEL_RX5)) { - *port_ptr++ = mux_reg_val - - INTn_1_INP_SEL_RX0; - num_ports++; - } - mux_reg_val = (snd_soc_read(codec, mux_reg) & - 0xf0) >> 4; - mux_reg += 1; - i--; - } - } - - dev_dbg(codec->dev, "%s: num_ports: %d, ports[%d %d %d %d]\n", - __func__, num_ports, port_id[0], port_id[1], - port_id[2], port_id[3]); - - i = 0; - while (num_ports) { - dai_id = rx_macro_find_playback_dai_id_for_port(port_id[i++], - rx_priv); - - if ((dai_id >= 0) && (dai_id < RX_MACRO_MAX_DAIS)) { - dev_dbg(codec->dev, "%s: dai_id: %d bit_width: %d\n", - __func__, dai_id, - rx_priv->bit_width[dai_id]); - - if (rx_priv->bit_width[dai_id] > bit_width) - bit_width = rx_priv->bit_width[dai_id]; - } - num_ports--; - } - - switch (bit_width) { - case 16: - idle_thr = 0xff; /* F16 */ - break; - case 24: - case 32: - idle_thr = 0x03; /* F22 */ - break; - default: - idle_thr = 0x00; - break; - } - - dev_dbg(codec->dev, "%s: (new) idle_thr: %d, (cur) idle_thr: %d\n", - __func__, idle_thr, rx_priv->idle_det_cfg.hph_idle_thr); - - if ((rx_priv->idle_det_cfg.hph_idle_thr == 0) || - (idle_thr < rx_priv->idle_det_cfg.hph_idle_thr)) { - snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, idle_thr); - rx_priv->idle_det_cfg.hph_idle_thr = idle_thr; - } - - return 0; -} - -static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg = 0, mix_reg = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - if (w->shift >= INTERP_MAX) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - } - - gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL + - (w->shift * RX_MACRO_RX_PATH_OFFSET); - mix_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + - (w->shift * RX_MACRO_RX_PATH_OFFSET); - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift, - INTERP_MIX_PATH); - rx_macro_enable_interp_clk(codec, event, w->shift); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, gain_reg, - snd_soc_read(codec, gain_reg)); - break; - case SND_SOC_DAPM_POST_PMD: - /* Clk Disable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x00); - rx_macro_enable_interp_clk(codec, event, w->shift); - /* Reset enable and disable */ - snd_soc_update_bits(codec, mix_reg, 0x40, 0x40); - snd_soc_update_bits(codec, mix_reg, 0x40, 0x00); - break; - } - - return 0; -} - -static bool rx_macro_adie_lb(struct snd_soc_codec *codec, - int interp_idx) -{ - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - u8 int_n_inp0 = 0, int_n_inp1 = 0, int_n_inp2 = 0; - - int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - - int_n_inp0 = int_mux_cfg0_val & 0x0F; - if (int_n_inp0 == INTn_1_INP_SEL_DEC0 || - int_n_inp0 == INTn_1_INP_SEL_DEC1 || - int_n_inp0 == INTn_1_INP_SEL_IIR0 || - int_n_inp0 == INTn_1_INP_SEL_IIR1) - return true; - - int_n_inp1 = int_mux_cfg0_val >> 4; - if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || - int_n_inp1 == INTn_1_INP_SEL_DEC1 || - int_n_inp1 == INTn_1_INP_SEL_IIR0 || - int_n_inp1 == INTn_1_INP_SEL_IIR1) - return true; - - int_n_inp2 = int_mux_cfg1_val >> 4; - if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || - int_n_inp2 == INTn_1_INP_SEL_DEC1 || - int_n_inp2 == INTn_1_INP_SEL_IIR0 || - int_n_inp2 == INTn_1_INP_SEL_IIR1) - return true; - - return false; -} - -static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg = 0; - u16 reg = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (w->shift >= INTERP_MAX) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - } - - reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (w->shift * - RX_MACRO_RX_PATH_OFFSET); - gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_CTL + (w->shift * - RX_MACRO_RX_PATH_OFFSET); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift, - INTERP_MAIN_PATH); - rx_macro_enable_interp_clk(codec, event, w->shift); - if (rx_macro_adie_lb(codec, w->shift)) - snd_soc_update_bits(codec, - reg, 0x20, 0x20); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, gain_reg, - snd_soc_read(codec, gain_reg)); - break; - case SND_SOC_DAPM_POST_PMD: - rx_macro_enable_interp_clk(codec, event, w->shift); - break; - } - - return 0; -} - -static int rx_macro_config_compander(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp_n, int event) -{ - int comp = 0; - u16 comp_ctl0_reg = 0, rx_path_cfg0_reg = 0, rx_path_cfg3_reg = 0; - u16 rx0_path_ctl_reg = 0; - u8 pcm_rate = 0, val = 0; - - /* AUX does not have compander */ - if (interp_n == INTERP_AUX) - return 0; - - comp = interp_n; - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, rx_priv->comp_enabled[comp]); - - if (!rx_priv->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 + - (comp * RX_MACRO_COMP_OFFSET); - rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 + - (comp * RX_MACRO_RX_PATH_OFFSET); - rx_path_cfg3_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG3 + - (comp * RX_MACRO_RX_PATH_OFFSET); - rx0_path_ctl_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - (comp * RX_MACRO_RX_PATH_OFFSET); - pcm_rate = (snd_soc_read(codec, rx0_path_ctl_reg) - & 0x0F); - if (pcm_rate < 0x06) - val = 0x03; - else if (pcm_rate < 0x08) - val = 0x01; - else if (pcm_rate < 0x0B) - val = 0x02; - else - val = 0x00; - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, rx_path_cfg3_reg, 0x03, val); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - snd_soc_update_bits(codec, rx_path_cfg3_reg, - 0x03, 0x03); - } - - return 0; -} - -static int rx_macro_load_compander_coeff(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp_n, int event) -{ - int comp = 0; - u16 comp_coeff_lsb_reg = 0, comp_coeff_msb_reg = 0; - int i = 0; - int hph_pwr_mode = HPH_LOHIFI; - - if (!rx_priv->comp_enabled[comp]) - return 0; - - if (interp_n == INTERP_HPHL) { - comp_coeff_lsb_reg = BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB; - comp_coeff_msb_reg = BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB; - } else if (interp_n == INTERP_HPHR) { - comp_coeff_lsb_reg = BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB; - comp_coeff_msb_reg = BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB; - } else { - /* compander coefficients are loaded only for hph path */ - return 0; - } - - comp = interp_n; - hph_pwr_mode = rx_priv->hph_pwr_mode; - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, rx_priv->comp_enabled[comp]); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Load Compander Coeff */ - for (i = 0; i < COMP_MAX_COEFF; i++) { - snd_soc_write(codec, comp_coeff_lsb_reg, - comp_coeff_table[hph_pwr_mode][i].lsb); - snd_soc_write(codec, comp_coeff_msb_reg, - comp_coeff_table[hph_pwr_mode][i].msb); - } - } - - return 0; -} - -static void rx_macro_enable_softclip_clk(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - bool enable) -{ - if (enable) { - if (rx_priv->softclip_clk_users == 0) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_CRC, - 0x01, 0x01); - rx_priv->softclip_clk_users++; - } else { - rx_priv->softclip_clk_users--; - if (rx_priv->softclip_clk_users == 0) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_CRC, - 0x01, 0x00); - } -} - -static int rx_macro_config_softclip(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int event) -{ - dev_dbg(codec->dev, "%s: event %d, enabled %d\n", - __func__, event, rx_priv->is_softclip_on); - - if (!rx_priv->is_softclip_on) - return 0; - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Softclip clock */ - rx_macro_enable_softclip_clk(codec, rx_priv, true); - /* Enable Softclip control */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x01); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x00); - rx_macro_enable_softclip_clk(codec, rx_priv, false); - } - - return 0; -} - -static int rx_macro_config_aux_hpf(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int event) -{ - dev_dbg(codec->dev, "%s: event %d, enabled %d\n", - __func__, event, rx_priv->is_aux_hpf_on); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Update Aux HPF control */ - if (!rx_priv->is_aux_hpf_on) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_RX2_RX_PATH_CFG1, 0x04, 0x00); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - /* Reset to default (HPF=ON) */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_RX2_RX_PATH_CFG1, 0x04, 0x04); - } - - return 0; -} - - -static inline void -rx_macro_enable_clsh_block(struct rx_macro_priv *rx_priv, bool enable) -{ - if ((enable && ++rx_priv->clsh_users == 1) || - (!enable && --rx_priv->clsh_users == 0)) - snd_soc_update_bits(rx_priv->codec, - BOLERO_CDC_RX_CLSH_CRC, 0x01, - (u8) enable); - if (rx_priv->clsh_users < 0) - rx_priv->clsh_users = 0; - dev_dbg(rx_priv->dev, "%s: clsh_users %d, enable %d", __func__, - rx_priv->clsh_users, enable); -} - -static int rx_macro_config_classh(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp_n, int event) -{ - if (SND_SOC_DAPM_EVENT_OFF(event)) { - rx_macro_enable_clsh_block(rx_priv, false); - return 0; - } - - if (!SND_SOC_DAPM_EVENT_ON(event)) - return 0; - - rx_macro_enable_clsh_block(rx_priv, true); - if (interp_n == INTERP_HPHL || - interp_n == INTERP_HPHR) { - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_MSB, - 0x0F, 0x00); - } - switch (interp_n) { - case INTERP_HPHL: - if (rx_priv->is_ear_mode_on) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_CLSH_HPH_V_PA, - 0x3F, 0x39); - else - snd_soc_update_bits(codec, - BOLERO_CDC_RX_CLSH_HPH_V_PA, - 0x3F, 0x1C); - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL, - 0x07, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG0, - 0x40, 0x40); - break; - case INTERP_HPHR: - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_HPH_V_PA, - 0x3F, 0x1C); - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL, - 0x07, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG0, - 0x40, 0x40); - break; - case INTERP_AUX: - snd_soc_update_bits(codec, - BOLERO_CDC_RX_RX2_RX_PATH_CFG0, - 0x08, 0x08); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG0, - 0x10, 0x10); - break; - } - - return 0; -} - -static void rx_macro_hd2_control(struct snd_soc_codec *codec, - u16 interp_idx, int event) -{ - u16 hd2_scale_reg = 0; - u16 hd2_enable_reg = 0; - - switch (interp_idx) { - case INTERP_HPHL: - hd2_scale_reg = BOLERO_CDC_RX_RX0_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0; - break; - case INTERP_HPHR: - hd2_scale_reg = BOLERO_CDC_RX_RX1_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0; - break; - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x14); - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04); - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00); - } -} - -static int rx_macro_hph_idle_detect_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct rx_macro_priv *rx_priv = NULL; - struct device *rx_dev = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - rx_priv->idle_det_cfg.hph_idle_detect_en; - - return 0; -} - -static int rx_macro_hph_idle_detect_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct rx_macro_priv *rx_priv = NULL; - struct device *rx_dev = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->idle_det_cfg.hph_idle_detect_en = - ucontrol->value.integer.value[0]; - - return 0; -} - -static int rx_macro_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->comp_enabled[comp]; - return 0; -} - -static int rx_macro_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, rx_priv->comp_enabled[comp], value); - rx_priv->comp_enabled[comp] = value; - - return 0; -} - -static int rx_macro_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - rx_priv->rx_port_value[widget->shift]; - return 0; -} - -static int rx_macro_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - u32 rx_port_value = ucontrol->value.integer.value[0]; - u32 aif_rst = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - aif_rst = rx_priv->rx_port_value[widget->shift]; - if (!rx_port_value) { - if (aif_rst == 0) { - dev_err(rx_dev, "%s:AIF reset already\n", __func__); - return 0; - } - if (aif_rst > RX_MACRO_AIF4_PB) { - dev_err(rx_dev, "%s: Invalid AIF reset\n", __func__); - return 0; - } - } - rx_priv->rx_port_value[widget->shift] = rx_port_value; - - dev_dbg(rx_dev, "%s: mux input: %d, mux output: %d, aif_rst: %d\n", - __func__, rx_port_value, widget->shift, aif_rst); - - switch (rx_port_value) { - case 0: - if (rx_priv->active_ch_cnt[aif_rst]) { - clear_bit(widget->shift, - &rx_priv->active_ch_mask[aif_rst]); - rx_priv->active_ch_cnt[aif_rst]--; - } - break; - case 1: - case 2: - case 3: - case 4: - set_bit(widget->shift, - &rx_priv->active_ch_mask[rx_port_value]); - rx_priv->active_ch_cnt[rx_port_value]++; - break; - default: - dev_err(codec->dev, - "%s:Invalid AIF_ID for RX_MACRO MUX %d\n", - __func__, rx_port_value); - goto err; - } - - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - return 0; -err: - return -EINVAL; -} - -static int rx_macro_get_ear_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->is_ear_mode_on; - return 0; -} - -static int rx_macro_put_ear_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->is_ear_mode_on = - (!ucontrol->value.integer.value[0] ? false : true); - return 0; -} - -static int rx_macro_get_hph_hd2_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->hph_hd2_mode; - return 0; -} - -static int rx_macro_put_hph_hd2_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->hph_hd2_mode = ucontrol->value.integer.value[0]; - return 0; -} - -static int rx_macro_get_hph_pwr_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->hph_pwr_mode; - return 0; -} - -static int rx_macro_put_hph_pwr_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->hph_pwr_mode = ucontrol->value.integer.value[0]; - return 0; -} - -static int rx_macro_vbat_bcl_gsm_mode_func_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ucontrol->value.integer.value[0] = - ((snd_soc_read(codec, BOLERO_CDC_RX_BCL_VBAT_CFG) & 0x04) ? - 1 : 0); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int rx_macro_vbat_bcl_gsm_mode_func_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - /* Set Vbat register configuration for GSM mode bit based on value */ - if (ucontrol->value.integer.value[0]) - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x04, 0x04); - else - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x04, 0x00); - - return 0; -} - -static int rx_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->is_softclip_on; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int rx_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->is_softclip_on = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: soft clip enable = %d\n", __func__, - rx_priv->is_softclip_on); - - return 0; -} - -static int rx_macro_aux_hpf_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->is_aux_hpf_on; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int rx_macro_aux_hpf_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->is_aux_hpf_on = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: aux hpf enable = %d\n", __func__, - rx_priv->is_aux_hpf_on); - - return 0; -} - - -static int rx_macro_enable_vbat(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Enable clock for VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x10); - /* Enable VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x01); - /* Update interpolator with 384K path */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x80, 0x80); - /* Update DSM FS rate */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, - 0x02, 0x02); - /* Use attenuation mode */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x02, 0x00); - /* BCL block needs softclip clock to be enabled */ - rx_macro_enable_softclip_clk(codec, rx_priv, true); - /* Enable VBAT at channel level */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x02, 0x02); - /* Set the ATTK1 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - /* Set the ATTK2 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - /* Set the ATTK3 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x80, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, - 0x02, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x02, 0x02); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x02, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - rx_macro_enable_softclip_clk(codec, rx_priv, false); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x00); - break; - default: - dev_err(rx_dev, "%s: Invalid event %d\n", __func__, event); - break; - } - return 0; -} - -static void rx_macro_idle_detect_control(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp, int event) -{ - int reg = 0, mask = 0, val = 0; - - if (!rx_priv->idle_det_cfg.hph_idle_detect_en) - return; - - if (interp == INTERP_HPHL) { - reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL; - mask = 0x01; - val = 0x01; - } - if (interp == INTERP_HPHR) { - reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL; - mask = 0x02; - val = 0x02; - } - - if (reg && SND_SOC_DAPM_EVENT_ON(event)) - snd_soc_update_bits(codec, reg, mask, val); - - if (reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, reg, mask, 0x00); - rx_priv->idle_det_cfg.hph_idle_thr = 0; - snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, 0x0); - } -} - -static void rx_macro_hphdelay_lutbypass(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - u16 interp_idx, int event) -{ - u16 hph_lut_bypass_reg = 0; - u16 hph_comp_ctrl7 = 0; - - switch (interp_idx) { - case INTERP_HPHL: - hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHL_COMP_LUT; - hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER0_CTL7; - break; - case INTERP_HPHR: - hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHR_COMP_LUT; - hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER1_CTL7; - break; - default: - break; - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) { - if (interp_idx == INTERP_HPHL) { - if (rx_priv->is_ear_mode_on) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_RX0_RX_PATH_CFG1, - 0x02, 0x02); - else - snd_soc_update_bits(codec, - hph_lut_bypass_reg, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, - hph_lut_bypass_reg, - 0x80, 0x80); - } - if (rx_priv->hph_pwr_mode) - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x00); - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG1, - 0x02, 0x00); - snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x00); - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x20); - } -} - -static int rx_macro_enable_interp_clk(struct snd_soc_codec *codec, - int event, int interp_idx) -{ - u16 main_reg = 0, dsm_reg = 0, rx_cfg2_reg = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - main_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - (interp_idx * RX_MACRO_RX_PATH_OFFSET); - dsm_reg = BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL + - (interp_idx * RX_MACRO_RX_PATH_OFFSET); - if (interp_idx == INTERP_AUX) - dsm_reg = BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL; - rx_cfg2_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG2 + - (interp_idx * RX_MACRO_RX_PATH_OFFSET); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - if (rx_priv->main_clk_users[interp_idx] == 0) { - /* Main path PGA mute enable */ - snd_soc_update_bits(codec, main_reg, 0x10, 0x10); - snd_soc_update_bits(codec, dsm_reg, 0x01, 0x01); - snd_soc_update_bits(codec, rx_cfg2_reg, 0x03, 0x03); - rx_macro_load_compander_coeff(codec, rx_priv, - interp_idx, event); - rx_macro_idle_detect_control(codec, rx_priv, - interp_idx, event); - if (rx_priv->hph_hd2_mode) - rx_macro_hd2_control(codec, interp_idx, event); - rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx, - event); - rx_macro_config_compander(codec, rx_priv, - interp_idx, event); - if (interp_idx == INTERP_AUX) { - rx_macro_config_softclip(codec, rx_priv, - event); - rx_macro_config_aux_hpf(codec, rx_priv, - event); - } - rx_macro_config_classh(codec, rx_priv, - interp_idx, event); - } - rx_priv->main_clk_users[interp_idx]++; - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - rx_priv->main_clk_users[interp_idx]--; - if (rx_priv->main_clk_users[interp_idx] <= 0) { - rx_priv->main_clk_users[interp_idx] = 0; - /* Main path PGA mute enable */ - snd_soc_update_bits(codec, main_reg, - 0x10, 0x10); - /* Clk Disable */ - snd_soc_update_bits(codec, dsm_reg, 0x01, 0x00); - snd_soc_update_bits(codec, main_reg, 0x20, 0x00); - /* Reset enable and disable */ - snd_soc_update_bits(codec, main_reg, 0x40, 0x40); - snd_soc_update_bits(codec, main_reg, 0x40, 0x00); - /* Reset rate to 48K*/ - snd_soc_update_bits(codec, main_reg, 0x0F, 0x04); - snd_soc_update_bits(codec, rx_cfg2_reg, 0x03, 0x00); - rx_macro_config_classh(codec, rx_priv, - interp_idx, event); - rx_macro_config_compander(codec, rx_priv, - interp_idx, event); - if (interp_idx == INTERP_AUX) { - rx_macro_config_softclip(codec, rx_priv, - event); - rx_macro_config_aux_hpf(codec, rx_priv, - event); - } - rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx, - event); - if (rx_priv->hph_hd2_mode) - rx_macro_hd2_control(codec, interp_idx, event); - rx_macro_idle_detect_control(codec, rx_priv, - interp_idx, event); - } - } - - dev_dbg(codec->dev, "%s event %d main_clk_users %d\n", - __func__, event, rx_priv->main_clk_users[interp_idx]); - - return rx_priv->main_clk_users[interp_idx]; -} - -static int rx_macro_enable_rx_path_clk(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 sidetone_reg = 0, fs_reg = 0; - - dev_dbg(codec->dev, "%s %d %d\n", __func__, event, w->shift); - sidetone_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG1 + - RX_MACRO_RX_PATH_OFFSET * (w->shift); - fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - RX_MACRO_RX_PATH_OFFSET * (w->shift); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - rx_macro_enable_interp_clk(codec, event, w->shift); - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x10); - snd_soc_update_bits(codec, fs_reg, - 0x20, 0x20); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x00); - rx_macro_enable_interp_clk(codec, event, w->shift); - break; - default: - break; - }; - return 0; -} - -static void rx_macro_restore_iir_coeff(struct rx_macro_priv *rx_priv, int iir_idx, - int band_idx) -{ - u16 reg_add = 0, coeff_idx = 0, idx = 0; - struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL); - - if (regmap == NULL) { - dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__); - return; - } - - regmap_write(regmap, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - reg_add = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx; - - /* 5 coefficients per band and 4 writes per coefficient */ - for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX; - coeff_idx++) { - /* Four 8 bit values(one 32 bit) per coefficient */ - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - } -} - -static int rx_macro_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - /* IIR filter band registers are at integer multiples of 0x80 */ - u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx; - - ucontrol->value.integer.value[0] = (snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0; - - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0]); - return 0; -} - -static int rx_macro_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - bool iir_band_en_status = 0; - int value = ucontrol->value.integer.value[0]; - u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_macro_restore_iir_coeff(rx_priv, iir_idx, band_idx); - - /* Mask first 5 bits, 6-8 are reserved */ - snd_soc_update_bits(codec, iir_reg, (1 << band_idx), - (value << band_idx)); - - iir_band_en_status = ((snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0); - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, iir_band_en_status); - return 0; -} - -static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - int coeff_idx) -{ - uint32_t value = 0; - - /* Address does not automatically update if reading */ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t)) & 0x7F); - - value |= snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx)); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 1) & 0x7F); - - value |= (snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 0x80 * iir_idx)) << 8); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 2) & 0x7F); - - value |= (snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 0x80 * iir_idx)) << 16); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 3) & 0x7F); - - /* Mask bits top 2 bits since they are reserved */ - value |= ((snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) & 0x3F) << 24); - - return value; -} - -static int rx_macro_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - get_iir_band_coeff(codec, iir_idx, band_idx, 0); - ucontrol->value.integer.value[1] = - get_iir_band_coeff(codec, iir_idx, band_idx, 1); - ucontrol->value.integer.value[2] = - get_iir_band_coeff(codec, iir_idx, band_idx, 2); - ucontrol->value.integer.value[3] = - get_iir_band_coeff(codec, iir_idx, band_idx, 3); - ucontrol->value.integer.value[4] = - get_iir_band_coeff(codec, iir_idx, band_idx, 4); - - dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[1], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[2], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[3], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[4]); - return 0; -} - -static void set_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - uint32_t value) -{ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value & 0xFF)); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value >> 8) & 0xFF); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value >> 16) & 0xFF); - - /* Mask top 2 bits, 7-8 are reserved */ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value >> 24) & 0x3F); -} - -static int rx_macro_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int coeff_idx, idx = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - /* - * Mask top bit it is reserved - * Updates addr automatically for each B2 write - */ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - /* Store the coefficients in sidetone coeff array */ - for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX; - coeff_idx++) { - uint32_t value = ucontrol->value.integer.value[coeff_idx]; - - set_iir_band_coeff(codec, iir_idx, band_idx, value); - - /* Four 8 bit values(one 32 bit) per coefficient */ - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value & 0xFF); - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 8) & 0xFF; - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 16) & 0xFF; - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 24) & 0xFF; - } - - pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 0), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 1), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 2), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 3), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 4)); - return 0; -} - -static int rx_macro_set_iir_gain(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: /* fall through */ - case SND_SOC_DAPM_PRE_PMD: - if (strnstr(w->name, "IIR0", sizeof("IIR0"))) { - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL)); - } else { - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL)); - } - break; - } - return 0; -} - -static const struct snd_kcontrol_new rx_macro_snd_controls[] = { - SOC_SINGLE_SX_TLV("RX_RX0 Digital Volume", - BOLERO_CDC_RX_RX0_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX1 Digital Volume", - BOLERO_CDC_RX_RX1_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX2 Digital Volume", - BOLERO_CDC_RX_RX2_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX0 Mix Digital Volume", - BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX1 Mix Digital Volume", - BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX2 Mix Digital Volume", - BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - - SOC_SINGLE_EXT("RX_COMP1 Switch", SND_SOC_NOPM, RX_MACRO_COMP1, 1, 0, - rx_macro_get_compander, rx_macro_set_compander), - SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0, - rx_macro_get_compander, rx_macro_set_compander), - - SOC_ENUM_EXT("HPH Idle Detect", hph_idle_detect_enum, - rx_macro_hph_idle_detect_get, rx_macro_hph_idle_detect_put), - - SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum, - rx_macro_get_ear_mode, rx_macro_put_ear_mode), - - SOC_ENUM_EXT("RX_HPH HD2 Mode", rx_macro_hph_hd2_mode_enum, - rx_macro_get_hph_hd2_mode, rx_macro_put_hph_hd2_mode), - - SOC_ENUM_EXT("RX_HPH_PWR_MODE", rx_macro_hph_pwr_mode_enum, - rx_macro_get_hph_pwr_mode, rx_macro_put_hph_pwr_mode), - - SOC_ENUM_EXT("RX_GSM mode Enable", rx_macro_vbat_bcl_gsm_mode_enum, - rx_macro_vbat_bcl_gsm_mode_func_get, - rx_macro_vbat_bcl_gsm_mode_func_put), - SOC_SINGLE_EXT("RX_Softclip Enable", SND_SOC_NOPM, 0, 1, 0, - rx_macro_soft_clip_enable_get, - rx_macro_soft_clip_enable_put), - SOC_SINGLE_EXT("AUX_HPF Enable", SND_SOC_NOPM, 0, 1, 0, - rx_macro_aux_hpf_mode_get, - rx_macro_aux_hpf_mode_put), - - SOC_SINGLE_SX_TLV("IIR0 INP0 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP1 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP2 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP3 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP0 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP1 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP2 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP3 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - - SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - - SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), -}; - -static int rx_macro_enable_echo(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - u16 val = 0, ec_hq_reg = 0; - int ec_tx = 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(rx_dev, "%s %d %s\n", __func__, event, w->name); - - val = snd_soc_read(codec, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4); - if (!(strcmp(w->name, "RX MIX TX0 MUX"))) - ec_tx = ((val & 0xf0) >> 0x4) - 1; - else if (!(strcmp(w->name, "RX MIX TX1 MUX"))) - ec_tx = (val & 0x0f) - 1; - - val = snd_soc_read(codec, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5); - if (!(strcmp(w->name, "RX MIX TX2 MUX"))) - ec_tx = (val & 0x0f) - 1; - - if (ec_tx < 0 || (ec_tx >= RX_MACRO_EC_MUX_MAX)) { - dev_err(rx_dev, "%s: EC mix control not set correctly\n", - __func__); - return -EINVAL; - } - ec_hq_reg = BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL + - 0x40 * ec_tx; - snd_soc_update_bits(codec, ec_hq_reg, 0x01, 0x01); - ec_hq_reg = BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 + - 0x40 * ec_tx; - /* default set to 48k */ - snd_soc_update_bits(codec, ec_hq_reg, 0x1E, 0x08); - - return 0; -} - -static const struct snd_soc_dapm_widget rx_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("RX AIF1 PB", "RX_MACRO_AIF1 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("RX AIF2 PB", "RX_MACRO_AIF2 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("RX AIF3 PB", "RX_MACRO_AIF3 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("RX AIF4 PB", "RX_MACRO_AIF4 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_OUT("RX AIF_ECHO", "RX_AIF_ECHO Capture", 0, - SND_SOC_NOPM, 0, 0), - - RX_MACRO_DAPM_MUX("RX_MACRO RX0 MUX", RX_MACRO_RX0, rx_macro_rx0), - RX_MACRO_DAPM_MUX("RX_MACRO RX1 MUX", RX_MACRO_RX1, rx_macro_rx1), - RX_MACRO_DAPM_MUX("RX_MACRO RX2 MUX", RX_MACRO_RX2, rx_macro_rx2), - RX_MACRO_DAPM_MUX("RX_MACRO RX3 MUX", RX_MACRO_RX3, rx_macro_rx3), - RX_MACRO_DAPM_MUX("RX_MACRO RX4 MUX", RX_MACRO_RX4, rx_macro_rx4), - RX_MACRO_DAPM_MUX("RX_MACRO RX5 MUX", RX_MACRO_RX5, rx_macro_rx5), - - SND_SOC_DAPM_MIXER("RX_RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX5", SND_SOC_NOPM, 0, 0, NULL, 0), - - RX_MACRO_DAPM_MUX("IIR0 INP0 MUX", 0, iir0_inp0), - RX_MACRO_DAPM_MUX("IIR0 INP1 MUX", 0, iir0_inp1), - RX_MACRO_DAPM_MUX("IIR0 INP2 MUX", 0, iir0_inp2), - RX_MACRO_DAPM_MUX("IIR0 INP3 MUX", 0, iir0_inp3), - RX_MACRO_DAPM_MUX("IIR1 INP0 MUX", 0, iir1_inp0), - RX_MACRO_DAPM_MUX("IIR1 INP1 MUX", 0, iir1_inp1), - RX_MACRO_DAPM_MUX("IIR1 INP2 MUX", 0, iir1_inp2), - RX_MACRO_DAPM_MUX("IIR1 INP3 MUX", 0, iir1_inp3), - - SND_SOC_DAPM_MUX_E("RX MIX TX0 MUX", SND_SOC_NOPM, - RX_MACRO_EC0_MUX, 0, - &rx_mix_tx0_mux, rx_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX MIX TX1 MUX", SND_SOC_NOPM, - RX_MACRO_EC1_MUX, 0, - &rx_mix_tx1_mux, rx_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX MIX TX2 MUX", SND_SOC_NOPM, - RX_MACRO_EC2_MUX, 0, - &rx_mix_tx2_mux, rx_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("IIR0", BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL, - 4, 0, NULL, 0, rx_macro_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER_E("IIR1", BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL, - 4, 0, NULL, 0, rx_macro_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER("SRC0", BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SRC1", BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - - RX_MACRO_DAPM_MUX("RX INT0 DEM MUX", 0, rx_int0_dem_inp), - RX_MACRO_DAPM_MUX("RX INT1 DEM MUX", 0, rx_int1_dem_inp), - - SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int0_2_mux, rx_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int1_2_mux, rx_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0, - &rx_int2_2_mux, rx_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP0", 0, rx_int0_1_mix_inp0), - RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP1", 0, rx_int0_1_mix_inp1), - RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP2", 0, rx_int0_1_mix_inp2), - RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP0", 0, rx_int1_1_mix_inp0), - RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP1", 0, rx_int1_1_mix_inp1), - RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP2", 0, rx_int1_1_mix_inp2), - RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP0", 0, rx_int2_1_mix_inp0), - RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP1", 0, rx_int2_1_mix_inp1), - RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP2", 0, rx_int2_1_mix_inp2), - - SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int0_1_interp_mux, rx_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int1_1_interp_mux, rx_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0, - &rx_int2_1_interp_mux, rx_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - RX_MACRO_DAPM_MUX("RX INT0_2 INTERP", 0, rx_int0_2_interp), - RX_MACRO_DAPM_MUX("RX INT1_2 INTERP", 0, rx_int1_2_interp), - RX_MACRO_DAPM_MUX("RX INT2_2 INTERP", 0, rx_int2_2_interp), - - SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL, - 0, &rx_int0_mix2_inp_mux, rx_macro_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR, - 0, &rx_int1_mix2_inp_mux, rx_macro_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_AUX, - 0, &rx_int2_mix2_inp_mux, rx_macro_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("RX INT2_1 VBAT", SND_SOC_NOPM, - 0, 0, rx_int2_1_vbat_mix_switch, - ARRAY_SIZE(rx_int2_1_vbat_mix_switch), - rx_macro_enable_vbat, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_OUTPUT("HPHL_OUT"), - SND_SOC_DAPM_OUTPUT("HPHR_OUT"), - SND_SOC_DAPM_OUTPUT("AUX_OUT"), - - SND_SOC_DAPM_INPUT("RX_TX DEC0_INP"), - SND_SOC_DAPM_INPUT("RX_TX DEC1_INP"), - SND_SOC_DAPM_INPUT("RX_TX DEC2_INP"), - SND_SOC_DAPM_INPUT("RX_TX DEC3_INP"), - - SND_SOC_DAPM_SUPPLY_S("RX_MCLK", 0, SND_SOC_NOPM, 0, 0, - rx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route rx_audio_map[] = { - {"RX AIF1 PB", NULL, "RX_MCLK"}, - {"RX AIF2 PB", NULL, "RX_MCLK"}, - {"RX AIF3 PB", NULL, "RX_MCLK"}, - {"RX AIF4 PB", NULL, "RX_MCLK"}, - - {"RX_MACRO RX0 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX1 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX2 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX3 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX4 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX5 MUX", "AIF1_PB", "RX AIF1 PB"}, - - {"RX_MACRO RX0 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX1 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX2 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX3 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX4 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX5 MUX", "AIF2_PB", "RX AIF2 PB"}, - - {"RX_MACRO RX0 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX1 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX2 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX3 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX4 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX5 MUX", "AIF3_PB", "RX AIF3 PB"}, - - {"RX_MACRO RX0 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX1 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX2 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX3 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX4 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX5 MUX", "AIF4_PB", "RX AIF4 PB"}, - - {"RX_RX0", NULL, "RX_MACRO RX0 MUX"}, - {"RX_RX1", NULL, "RX_MACRO RX1 MUX"}, - {"RX_RX2", NULL, "RX_MACRO RX2 MUX"}, - {"RX_RX3", NULL, "RX_MACRO RX3 MUX"}, - {"RX_RX4", NULL, "RX_MACRO RX4 MUX"}, - {"RX_RX5", NULL, "RX_MACRO RX5 MUX"}, - - {"RX INT0_1 MIX1 INP0", "RX0", "RX_RX0"}, - {"RX INT0_1 MIX1 INP0", "RX1", "RX_RX1"}, - {"RX INT0_1 MIX1 INP0", "RX2", "RX_RX2"}, - {"RX INT0_1 MIX1 INP0", "RX3", "RX_RX3"}, - {"RX INT0_1 MIX1 INP0", "RX4", "RX_RX4"}, - {"RX INT0_1 MIX1 INP0", "RX5", "RX_RX5"}, - {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT0_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"}, - {"RX INT0_1 MIX1 INP1", "RX0", "RX_RX0"}, - {"RX INT0_1 MIX1 INP1", "RX1", "RX_RX1"}, - {"RX INT0_1 MIX1 INP1", "RX2", "RX_RX2"}, - {"RX INT0_1 MIX1 INP1", "RX3", "RX_RX3"}, - {"RX INT0_1 MIX1 INP1", "RX4", "RX_RX4"}, - {"RX INT0_1 MIX1 INP1", "RX5", "RX_RX5"}, - {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT0_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"}, - {"RX INT0_1 MIX1 INP2", "RX0", "RX_RX0"}, - {"RX INT0_1 MIX1 INP2", "RX1", "RX_RX1"}, - {"RX INT0_1 MIX1 INP2", "RX2", "RX_RX2"}, - {"RX INT0_1 MIX1 INP2", "RX3", "RX_RX3"}, - {"RX INT0_1 MIX1 INP2", "RX4", "RX_RX4"}, - {"RX INT0_1 MIX1 INP2", "RX5", "RX_RX5"}, - {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT0_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"}, - - {"RX INT1_1 MIX1 INP0", "RX0", "RX_RX0"}, - {"RX INT1_1 MIX1 INP0", "RX1", "RX_RX1"}, - {"RX INT1_1 MIX1 INP0", "RX2", "RX_RX2"}, - {"RX INT1_1 MIX1 INP0", "RX3", "RX_RX3"}, - {"RX INT1_1 MIX1 INP0", "RX4", "RX_RX4"}, - {"RX INT1_1 MIX1 INP0", "RX5", "RX_RX5"}, - {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT1_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"}, - {"RX INT1_1 MIX1 INP1", "RX0", "RX_RX0"}, - {"RX INT1_1 MIX1 INP1", "RX1", "RX_RX1"}, - {"RX INT1_1 MIX1 INP1", "RX2", "RX_RX2"}, - {"RX INT1_1 MIX1 INP1", "RX3", "RX_RX3"}, - {"RX INT1_1 MIX1 INP1", "RX4", "RX_RX4"}, - {"RX INT1_1 MIX1 INP1", "RX5", "RX_RX5"}, - {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT1_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"}, - {"RX INT1_1 MIX1 INP2", "RX0", "RX_RX0"}, - {"RX INT1_1 MIX1 INP2", "RX1", "RX_RX1"}, - {"RX INT1_1 MIX1 INP2", "RX2", "RX_RX2"}, - {"RX INT1_1 MIX1 INP2", "RX3", "RX_RX3"}, - {"RX INT1_1 MIX1 INP2", "RX4", "RX_RX4"}, - {"RX INT1_1 MIX1 INP2", "RX5", "RX_RX5"}, - {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT1_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"}, - - {"RX INT2_1 MIX1 INP0", "RX0", "RX_RX0"}, - {"RX INT2_1 MIX1 INP0", "RX1", "RX_RX1"}, - {"RX INT2_1 MIX1 INP0", "RX2", "RX_RX2"}, - {"RX INT2_1 MIX1 INP0", "RX3", "RX_RX3"}, - {"RX INT2_1 MIX1 INP0", "RX4", "RX_RX4"}, - {"RX INT2_1 MIX1 INP0", "RX5", "RX_RX5"}, - {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT2_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"}, - {"RX INT2_1 MIX1 INP1", "RX0", "RX_RX0"}, - {"RX INT2_1 MIX1 INP1", "RX1", "RX_RX1"}, - {"RX INT2_1 MIX1 INP1", "RX2", "RX_RX2"}, - {"RX INT2_1 MIX1 INP1", "RX3", "RX_RX3"}, - {"RX INT2_1 MIX1 INP1", "RX4", "RX_RX4"}, - {"RX INT2_1 MIX1 INP1", "RX5", "RX_RX5"}, - {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT2_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"}, - {"RX INT2_1 MIX1 INP2", "RX0", "RX_RX0"}, - {"RX INT2_1 MIX1 INP2", "RX1", "RX_RX1"}, - {"RX INT2_1 MIX1 INP2", "RX2", "RX_RX2"}, - {"RX INT2_1 MIX1 INP2", "RX3", "RX_RX3"}, - {"RX INT2_1 MIX1 INP2", "RX4", "RX_RX4"}, - {"RX INT2_1 MIX1 INP2", "RX5", "RX_RX5"}, - {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"}, - {"RX INT2_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"}, - - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"}, - - {"RX MIX TX0 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX AIF_ECHO", NULL, "RX MIX TX0 MUX"}, - {"RX AIF_ECHO", NULL, "RX MIX TX1 MUX"}, - {"RX AIF_ECHO", NULL, "RX MIX TX2 MUX"}, - {"RX AIF_ECHO", NULL, "RX_MCLK"}, - - /* Mixing path INT0 */ - {"RX INT0_2 MUX", "RX0", "RX_RX0"}, - {"RX INT0_2 MUX", "RX1", "RX_RX1"}, - {"RX INT0_2 MUX", "RX2", "RX_RX2"}, - {"RX INT0_2 MUX", "RX3", "RX_RX3"}, - {"RX INT0_2 MUX", "RX4", "RX_RX4"}, - {"RX INT0_2 MUX", "RX5", "RX_RX5"}, - {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"}, - - /* Mixing path INT1 */ - {"RX INT1_2 MUX", "RX0", "RX_RX0"}, - {"RX INT1_2 MUX", "RX1", "RX_RX1"}, - {"RX INT1_2 MUX", "RX2", "RX_RX2"}, - {"RX INT1_2 MUX", "RX3", "RX_RX3"}, - {"RX INT1_2 MUX", "RX4", "RX_RX4"}, - {"RX INT1_2 MUX", "RX5", "RX_RX5"}, - {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"}, - {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"}, - - /* Mixing path INT2 */ - {"RX INT2_2 MUX", "RX0", "RX_RX0"}, - {"RX INT2_2 MUX", "RX1", "RX_RX1"}, - {"RX INT2_2 MUX", "RX2", "RX_RX2"}, - {"RX INT2_2 MUX", "RX3", "RX_RX3"}, - {"RX INT2_2 MUX", "RX4", "RX_RX4"}, - {"RX INT2_2 MUX", "RX5", "RX_RX5"}, - {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"}, - {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"}, - - {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"}, - {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"}, - {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"}, - {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"}, - {"HPHL_OUT", NULL, "RX INT0 DEM MUX"}, - {"HPHL_OUT", NULL, "RX_MCLK"}, - - {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"}, - {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"}, - {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"}, - {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"}, - {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX2"}, - {"HPHR_OUT", NULL, "RX INT1 DEM MUX"}, - {"HPHR_OUT", NULL, "RX_MCLK"}, - - {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"}, - - {"RX INT2_1 VBAT", "RX AUX VBAT Enable", "RX INT2_1 INTERP"}, - {"RX INT2 SEC MIX", NULL, "RX INT2_1 VBAT"}, - - {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"}, - {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"}, - {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"}, - {"AUX_OUT", NULL, "RX INT2 MIX2"}, - {"AUX_OUT", NULL, "RX_MCLK"}, - - {"IIR0", NULL, "RX_MCLK"}, - {"IIR0", NULL, "IIR0 INP0 MUX"}, - {"IIR0 INP0 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP0 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP0 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP0 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP0 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP0 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP0 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP0 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP0 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP0 MUX", "RX5", "RX_RX5"}, - {"IIR0", NULL, "IIR0 INP1 MUX"}, - {"IIR0 INP1 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP1 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP1 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP1 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP1 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP1 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP1 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP1 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP1 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP1 MUX", "RX5", "RX_RX5"}, - {"IIR0", NULL, "IIR0 INP2 MUX"}, - {"IIR0 INP2 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP2 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP2 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP2 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP2 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP2 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP2 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP2 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP2 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP2 MUX", "RX5", "RX_RX5"}, - {"IIR0", NULL, "IIR0 INP3 MUX"}, - {"IIR0 INP3 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP3 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP3 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP3 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP3 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP3 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP3 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP3 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP3 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP3 MUX", "RX5", "RX_RX5"}, - - {"IIR1", NULL, "RX_MCLK"}, - {"IIR1", NULL, "IIR1 INP0 MUX"}, - {"IIR1 INP0 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP0 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP0 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP0 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP0 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP0 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP0 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP0 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP0 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP0 MUX", "RX5", "RX_RX5"}, - {"IIR1", NULL, "IIR1 INP1 MUX"}, - {"IIR1 INP1 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP1 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP1 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP1 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP1 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP1 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP1 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP1 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP1 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP1 MUX", "RX5", "RX_RX5"}, - {"IIR1", NULL, "IIR1 INP2 MUX"}, - {"IIR1 INP2 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP2 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP2 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP2 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP2 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP2 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP2 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP2 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP2 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP2 MUX", "RX5", "RX_RX5"}, - {"IIR1", NULL, "IIR1 INP3 MUX"}, - {"IIR1 INP3 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP3 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP3 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP3 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP3 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP3 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP3 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP3 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP3 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP3 MUX", "RX5", "RX_RX5"}, - - {"SRC0", NULL, "IIR0"}, - {"SRC1", NULL, "IIR1"}, - {"RX INT0 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT0 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT1 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT1 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT2 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT2 MIX2 INP", "SRC1", "SRC1"}, -}; - -static int rx_macro_core_vote(void *handle, bool enable) -{ - struct rx_macro_priv *rx_priv = (struct rx_macro_priv *) handle; - - if (rx_priv == NULL) { - pr_err("%s: rx priv data is NULL\n", __func__); - return -EINVAL; - } - if (enable) { - pm_runtime_get_sync(rx_priv->dev); - pm_runtime_put_autosuspend(rx_priv->dev); - pm_runtime_mark_last_busy(rx_priv->dev); - } - - if (bolero_check_core_votes(rx_priv->dev)) - return 0; - else - return -EINVAL; -} - -static int rx_swrm_clock(void *handle, bool enable) -{ - struct rx_macro_priv *rx_priv = (struct rx_macro_priv *) handle; - struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&rx_priv->swr_clk_lock); - - trace_printk("%s: swrm clock %s\n", - __func__, (enable ? "enable" : "disable")); - dev_dbg(rx_priv->dev, "%s: swrm clock %s\n", - __func__, (enable ? "enable" : "disable")); - if (enable) { - pm_runtime_get_sync(rx_priv->dev); - if (rx_priv->swr_clk_users == 0) { - ret = msm_cdc_pinctrl_select_active_state( - rx_priv->rx_swr_gpio_p); - if (ret < 0) { - dev_err(rx_priv->dev, - "%s: rx swr pinctrl enable failed\n", - __func__); - pm_runtime_mark_last_busy(rx_priv->dev); - pm_runtime_put_autosuspend(rx_priv->dev); - goto exit; - } - ret = rx_macro_mclk_enable(rx_priv, 1, true); - if (ret < 0) { - msm_cdc_pinctrl_select_sleep_state( - rx_priv->rx_swr_gpio_p); - dev_err(rx_priv->dev, - "%s: rx request clock enable failed\n", - __func__); - pm_runtime_mark_last_busy(rx_priv->dev); - pm_runtime_put_autosuspend(rx_priv->dev); - goto exit; - } - if (rx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - if (rx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x00); - rx_priv->reset_swr = false; - } - pm_runtime_mark_last_busy(rx_priv->dev); - pm_runtime_put_autosuspend(rx_priv->dev); - rx_priv->swr_clk_users++; - } else { - if (rx_priv->swr_clk_users <= 0) { - dev_err(rx_priv->dev, - "%s: rx swrm clock users already reset\n", - __func__); - rx_priv->swr_clk_users = 0; - goto exit; - } - rx_priv->swr_clk_users--; - if (rx_priv->swr_clk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - rx_macro_mclk_enable(rx_priv, 0, true); - ret = msm_cdc_pinctrl_select_sleep_state( - rx_priv->rx_swr_gpio_p); - if (ret < 0) { - dev_err(rx_priv->dev, - "%s: rx swr pinctrl disable failed\n", - __func__); - goto exit; - } - } - } - trace_printk("%s: swrm clock users %d\n", - __func__, rx_priv->swr_clk_users); - dev_dbg(rx_priv->dev, "%s: swrm clock users %d\n", - __func__, rx_priv->swr_clk_users); -exit: - mutex_unlock(&rx_priv->swr_clk_lock); - return ret; -} - -static const struct rx_macro_reg_mask_val rx_macro_reg_init[] = { - {BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x07, 0x02}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x07, 0x02}, - {BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x07, 0x02}, - {BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x03, 0x02}, - {BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x03, 0x02}, - {BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x03, 0x02}, -}; - -static void rx_macro_init_bcl_pmic_reg(struct snd_soc_codec *codec) -{ - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return; - } - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return; - - switch (rx_priv->bcl_pmic_params.id) { - case 0: - /* Enable ID0 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x02, 0x02); - /* Update MC_SID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0x0F, - rx_priv->bcl_pmic_params.sid); - /* Update MC_PPID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2, 0xFF, - rx_priv->bcl_pmic_params.ppid); - break; - case 1: - /* Enable ID1 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x01, 0x01); - /* Update MC_SID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3, 0x0F, - rx_priv->bcl_pmic_params.sid); - /* Update MC_PPID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0xFF, - rx_priv->bcl_pmic_params.ppid); - break; - default: - dev_err(rx_dev, "%s: PMIC ID is invalid %d\n", - __func__, rx_priv->bcl_pmic_params.id); - break; - } -} - -static int rx_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - int i; - - rx_dev = bolero_get_device_ptr(codec->dev, RX_MACRO); - if (!rx_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - rx_priv = dev_get_drvdata(rx_dev); - if (!rx_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - - ret = snd_soc_dapm_new_controls(dapm, rx_macro_dapm_widgets, - ARRAY_SIZE(rx_macro_dapm_widgets)); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add controls\n", __func__); - return ret; - } - ret = snd_soc_dapm_add_routes(dapm, rx_audio_map, - ARRAY_SIZE(rx_audio_map)); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add routes\n", __func__); - return ret; - } - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add widgets\n", __func__); - return ret; - } - ret = snd_soc_add_codec_controls(codec, rx_macro_snd_controls, - ARRAY_SIZE(rx_macro_snd_controls)); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__); - return ret; - } - rx_priv->dev_up = true; - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF2 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF3 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF4 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "AUX_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC0_INP"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC1_INP"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC2_INP"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC3_INP"); - snd_soc_dapm_sync(dapm); - - for (i = 0; i < ARRAY_SIZE(rx_macro_reg_init); i++) - snd_soc_update_bits(codec, - rx_macro_reg_init[i].reg, - rx_macro_reg_init[i].mask, - rx_macro_reg_init[i].val); - - rx_priv->codec = codec; - rx_macro_init_bcl_pmic_reg(codec); - - return 0; -} - -static int rx_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->codec = NULL; - - return 0; -} - -static void rx_macro_add_child_devices(struct work_struct *work) -{ - struct rx_macro_priv *rx_priv = NULL; - struct platform_device *pdev = NULL; - struct device_node *node = NULL; - struct rx_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL; - int ret = 0; - u16 count = 0, ctrl_num = 0; - struct rx_swr_ctrl_platform_data *platdata = NULL; - char plat_dev_name[RX_SWR_STRING_LEN] = ""; - bool rx_swr_master_node = false; - - rx_priv = container_of(work, struct rx_macro_priv, - rx_macro_add_child_devices_work); - if (!rx_priv) { - pr_err("%s: Memory for rx_priv does not exist\n", - __func__); - return; - } - - if (!rx_priv->dev) { - pr_err("%s: RX device does not exist\n", __func__); - return; - } - - if(!rx_priv->dev->of_node) { - dev_err(rx_priv->dev, - "%s: DT node for RX dev does not exist\n", __func__); - return; - } - - platdata = &rx_priv->swr_plat_data; - rx_priv->child_count = 0; - - for_each_available_child_of_node(rx_priv->dev->of_node, node) { - rx_swr_master_node = false; - if (strnstr(node->name, "rx_swr_master", - strlen("rx_swr_master")) != NULL) - rx_swr_master_node = true; - - if(rx_swr_master_node) - strlcpy(plat_dev_name, "rx_swr_ctrl", - (RX_SWR_STRING_LEN - 1)); - else - strlcpy(plat_dev_name, node->name, - (RX_SWR_STRING_LEN - 1)); - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(rx_priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = rx_priv->dev; - pdev->dev.of_node = node; - - if (rx_swr_master_node) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (rx_swr_master_node) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct rx_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - ret = -ENOMEM; - goto fail_pdev_add; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].rx_swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - rx_priv->swr_ctrl_data = swr_ctrl_data; - } - if (rx_priv->child_count < RX_MACRO_CHILD_DEVICES_MAX) - rx_priv->pdev_child_devices[ - rx_priv->child_count++] = pdev; - else - goto err; - } - return; -fail_pdev_add: - for (count = 0; count < rx_priv->child_count; count++) - platform_device_put(rx_priv->pdev_child_devices[count]); -err: - return; -} - -static void rx_macro_init_ops(struct macro_ops *ops, char __iomem *rx_io_base) -{ - memset(ops, 0, sizeof(struct macro_ops)); - ops->init = rx_macro_init; - ops->exit = rx_macro_deinit; - ops->io_base = rx_io_base; - ops->dai_ptr = rx_macro_dai; - ops->num_dais = ARRAY_SIZE(rx_macro_dai); - ops->event_handler = rx_macro_event_handler; - ops->set_port_map = rx_macro_set_port_map; -} - -static int rx_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops = {0}; - struct rx_macro_priv *rx_priv = NULL; - u32 rx_base_addr = 0, muxsel = 0; - char __iomem *rx_io_base = NULL, *muxsel_io = NULL; - int ret = 0; - u8 bcl_pmic_params[3]; - u32 default_clk_id = 0; - u32 is_used_rx_swr_gpio = 1; - const char *is_used_rx_swr_gpio_dt = "qcom,is-used-swr-gpio"; - - rx_priv = devm_kzalloc(&pdev->dev, sizeof(struct rx_macro_priv), - GFP_KERNEL); - if (!rx_priv) - return -ENOMEM; - - rx_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &rx_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - ret = of_property_read_u32(pdev->dev.of_node, "qcom,rx_mclk_mode_muxsel", - &muxsel); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - ret = of_property_read_u32(pdev->dev.of_node, "qcom,default-clk-id", - &default_clk_id); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "qcom,default-clk-id"); - default_clk_id = RX_CORE_CLK; - } - if (of_find_property(pdev->dev.of_node, is_used_rx_swr_gpio_dt, - NULL)) { - ret = of_property_read_u32(pdev->dev.of_node, - is_used_rx_swr_gpio_dt, - &is_used_rx_swr_gpio); - if (ret) { - dev_err(&pdev->dev, "%s: error reading %s in dt\n", - __func__, is_used_rx_swr_gpio_dt); - is_used_rx_swr_gpio = 1; - } - } - rx_priv->rx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,rx-swr-gpios", 0); - if (!rx_priv->rx_swr_gpio_p && is_used_rx_swr_gpio) { - dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n", - __func__); - return -EINVAL; - } - if (msm_cdc_pinctrl_get_state(rx_priv->rx_swr_gpio_p) < 0 && - is_used_rx_swr_gpio) { - dev_err(&pdev->dev, "%s: failed to get swr pin state\n", - __func__); - return -EPROBE_DEFER; - } - - rx_io_base = devm_ioremap(&pdev->dev, rx_base_addr, - RX_MACRO_MAX_OFFSET); - if (!rx_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -ENOMEM; - } - rx_priv->rx_io_base = rx_io_base; - muxsel_io = devm_ioremap(&pdev->dev, muxsel, 0x4); - if (!muxsel_io) { - dev_err(&pdev->dev, "%s: ioremap failed for muxsel\n", - __func__); - return -ENOMEM; - } - rx_priv->rx_mclk_mode_muxsel = muxsel_io; - rx_priv->reset_swr = true; - INIT_WORK(&rx_priv->rx_macro_add_child_devices_work, - rx_macro_add_child_devices); - rx_priv->swr_plat_data.handle = (void *) rx_priv; - rx_priv->swr_plat_data.read = NULL; - rx_priv->swr_plat_data.write = NULL; - rx_priv->swr_plat_data.bulk_write = NULL; - rx_priv->swr_plat_data.clk = rx_swrm_clock; - rx_priv->swr_plat_data.core_vote = rx_macro_core_vote; - rx_priv->swr_plat_data.handle_irq = NULL; - - ret = of_property_read_u8_array(pdev->dev.of_node, - "qcom,rx-bcl-pmic-params", bcl_pmic_params, - sizeof(bcl_pmic_params)); - if (ret) { - dev_dbg(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "qcom,rx-bcl-pmic-params"); - } else { - rx_priv->bcl_pmic_params.id = bcl_pmic_params[0]; - rx_priv->bcl_pmic_params.sid = bcl_pmic_params[1]; - rx_priv->bcl_pmic_params.ppid = bcl_pmic_params[2]; - } - rx_priv->clk_id = default_clk_id; - rx_priv->default_clk_id = default_clk_id; - ops.clk_id_req = rx_priv->clk_id; - ops.default_clk_id = default_clk_id; - - rx_priv->is_aux_hpf_on = 1; - - dev_set_drvdata(&pdev->dev, rx_priv); - mutex_init(&rx_priv->mclk_lock); - mutex_init(&rx_priv->swr_clk_lock); - rx_macro_init_ops(&ops, rx_io_base); - - ret = bolero_register_macro(&pdev->dev, RX_MACRO, &ops); - if (ret) { - dev_err(&pdev->dev, - "%s: register macro failed\n", __func__); - goto err_reg_macro; - } - schedule_work(&rx_priv->rx_macro_add_child_devices_work); - pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - pm_suspend_ignore_children(&pdev->dev, true); - pm_runtime_enable(&pdev->dev); - - return 0; - -err_reg_macro: - mutex_destroy(&rx_priv->mclk_lock); - mutex_destroy(&rx_priv->swr_clk_lock); - return ret; -} - -static int rx_macro_remove(struct platform_device *pdev) -{ - struct rx_macro_priv *rx_priv = NULL; - u16 count = 0; - - rx_priv = dev_get_drvdata(&pdev->dev); - - if (!rx_priv) - return -EINVAL; - - for (count = 0; count < rx_priv->child_count && - count < RX_MACRO_CHILD_DEVICES_MAX; count++) - platform_device_unregister(rx_priv->pdev_child_devices[count]); - - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - bolero_unregister_macro(&pdev->dev, RX_MACRO); - mutex_destroy(&rx_priv->mclk_lock); - mutex_destroy(&rx_priv->swr_clk_lock); - kfree(rx_priv->swr_ctrl_data); - return 0; -} - -static const struct of_device_id rx_macro_dt_match[] = { - {.compatible = "qcom,rx-macro"}, - {} -}; - -static const struct dev_pm_ops bolero_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - pm_runtime_force_suspend, - pm_runtime_force_resume - ) - SET_RUNTIME_PM_OPS( - bolero_runtime_suspend, - bolero_runtime_resume, - NULL - ) -}; - -static struct platform_driver rx_macro_driver = { - .driver = { - .name = "rx_macro", - .owner = THIS_MODULE, - .pm = &bolero_dev_pm_ops, - .of_match_table = rx_macro_dt_match, - .suppress_bind_attrs = true, - }, - .probe = rx_macro_probe, - .remove = rx_macro_remove, -}; - -module_platform_driver(rx_macro_driver); - -MODULE_DESCRIPTION("RX macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/bolero/tx-macro.c b/techpack/audio/4.0/asoc/codecs/bolero/tx-macro.c deleted file mode 100644 index 70605c715f0a..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/tx-macro.c +++ /dev/null @@ -1,3267 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" -#include "bolero-clk-rsc.h" - -#define AUTO_SUSPEND_DELAY 50 /* delay in msec */ -#define TX_MACRO_MAX_OFFSET 0x1000 - -#define NUM_DECIMATORS 8 - -#define TX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define TX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED 0 -#define TX_MACRO_MCLK_FREQ 9600000 -#define TX_MACRO_TX_PATH_OFFSET 0x80 -#define TX_MACRO_SWR_MIC_MUX_SEL_MASK 0xF -#define TX_MACRO_ADC_MUX_CFG_OFFSET 0x8 -#define TX_MACRO_ADC_MODE_CFG0_SHIFT 1 - -#define TX_MACRO_DMIC_UNMUTE_DELAY_MS 40 -#define TX_MACRO_AMIC_UNMUTE_DELAY_MS 100 -#define TX_MACRO_DMIC_HPF_DELAY_MS 300 -#define TX_MACRO_AMIC_HPF_DELAY_MS 300 - -static int tx_unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS; -module_param(tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path"); - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -static int tx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai); -static int tx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot); - -#define TX_MACRO_SWR_STRING_LEN 80 -#define TX_MACRO_CHILD_DEVICES_MAX 3 - -/* Hold instance to soundwire platform device */ -struct tx_macro_swr_ctrl_data { - struct platform_device *tx_swr_pdev; -}; - -struct tx_macro_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*core_vote)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -enum { - TX_MACRO_AIF_INVALID = 0, - TX_MACRO_AIF1_CAP, - TX_MACRO_AIF2_CAP, - TX_MACRO_AIF3_CAP, - TX_MACRO_MAX_DAIS -}; - -enum { - TX_MACRO_DEC0, - TX_MACRO_DEC1, - TX_MACRO_DEC2, - TX_MACRO_DEC3, - TX_MACRO_DEC4, - TX_MACRO_DEC5, - TX_MACRO_DEC6, - TX_MACRO_DEC7, - TX_MACRO_DEC_MAX, -}; - -enum { - TX_MACRO_CLK_DIV_2, - TX_MACRO_CLK_DIV_3, - TX_MACRO_CLK_DIV_4, - TX_MACRO_CLK_DIV_6, - TX_MACRO_CLK_DIV_8, - TX_MACRO_CLK_DIV_16, -}; - -enum { - MSM_DMIC, - SWR_MIC, - ANC_FB_TUNE1 -}; - -enum { - TX_MCLK, - VA_MCLK, -}; - -struct tx_macro_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -struct tx_mute_work { - struct tx_macro_priv *tx_priv; - u32 decimator; - struct delayed_work dwork; -}; - -struct hpf_work { - struct tx_macro_priv *tx_priv; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -struct tx_macro_priv { - struct device *dev; - bool dec_active[NUM_DECIMATORS]; - int tx_mclk_users; - int swr_clk_users; - bool dapm_mclk_enable; - bool reset_swr; - struct mutex mclk_lock; - struct mutex swr_clk_lock; - struct snd_soc_codec *codec; - struct device_node *tx_swr_gpio_p; - struct tx_macro_swr_ctrl_data *swr_ctrl_data; - struct tx_macro_swr_ctrl_platform_data swr_plat_data; - struct work_struct tx_macro_add_child_devices_work; - struct hpf_work tx_hpf_work[NUM_DECIMATORS]; - struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS]; - u16 dmic_clk_div; - u32 version; - u32 is_used_tx_swr_gpio; - unsigned long active_ch_mask[TX_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS]; - char __iomem *tx_io_base; - struct platform_device *pdev_child_devices - [TX_MACRO_CHILD_DEVICES_MAX]; - int child_count; - int tx_swr_clk_cnt; - int va_swr_clk_cnt; - int va_clk_status; - int tx_clk_status; - bool bcs_enable; - int dec_mode[NUM_DECIMATORS]; - bool bcs_clk_en; - bool hs_slow_insert_complete; - int amic_sample_rate; -}; - -static bool tx_macro_get_data(struct snd_soc_codec *codec, - struct device **tx_dev, - struct tx_macro_priv **tx_priv, - const char *func_name) -{ - *tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO); - if (!(*tx_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - - *tx_priv = dev_get_drvdata((*tx_dev)); - if (!(*tx_priv)) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - - if (!(*tx_priv)->codec) { - dev_err(codec->dev, - "%s: tx_priv->codec not initialized!\n", func_name); - return false; - } - - return true; -} - -static int tx_macro_mclk_enable(struct tx_macro_priv *tx_priv, - bool mclk_enable) -{ - struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(tx_priv->dev, "%s: mclk_enable = %u,clk_users= %d\n", - __func__, mclk_enable, tx_priv->tx_mclk_users); - - mutex_lock(&tx_priv->mclk_lock); - if (mclk_enable) { - ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - true); - if (ret < 0) { - dev_err_ratelimited(tx_priv->dev, - "%s: request clock enable failed\n", - __func__); - goto exit; - } - bolero_clk_rsc_fs_gen_request(tx_priv->dev, - true); - if (tx_priv->tx_mclk_users == 0) { - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - TX_START_OFFSET, - TX_MAX_OFFSET); - /* 9.6MHz MCLK, set value 0x00 if other frequency */ - regmap_update_bits(regmap, - BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - } - tx_priv->tx_mclk_users++; - } else { - if (tx_priv->tx_mclk_users <= 0) { - dev_err(tx_priv->dev, "%s: clock already disabled\n", - __func__); - tx_priv->tx_mclk_users = 0; - goto exit; - } - tx_priv->tx_mclk_users--; - if (tx_priv->tx_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - } - - bolero_clk_rsc_fs_gen_request(tx_priv->dev, - false); - bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - } -exit: - mutex_unlock(&tx_priv->mclk_lock); - return ret; -} - -static int __tx_macro_mclk_enable(struct snd_soc_codec *codec, - bool enable) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - return tx_macro_mclk_enable(tx_priv, enable); -} - -static int tx_macro_va_swr_clk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - if (SND_SOC_DAPM_EVENT_ON(event)) - ++tx_priv->va_swr_clk_cnt; - if (SND_SOC_DAPM_EVENT_OFF(event)) - --tx_priv->va_swr_clk_cnt; - - return 0; -} - -static int tx_macro_tx_swr_clk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - if (SND_SOC_DAPM_EVENT_ON(event)) - ++tx_priv->tx_swr_clk_cnt; - if (SND_SOC_DAPM_EVENT_OFF(event)) - --tx_priv->tx_swr_clk_cnt; - - return 0; -} - -static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - dev_dbg(tx_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = tx_macro_mclk_enable(tx_priv, 1); - if (ret) - tx_priv->dapm_mclk_enable = false; - else - tx_priv->dapm_mclk_enable = true; - break; - case SND_SOC_DAPM_POST_PMD: - if (tx_priv->dapm_mclk_enable) - ret = tx_macro_mclk_enable(tx_priv, 0); - break; - default: - dev_err(tx_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int tx_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - int ret = 0; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_SSR_DOWN: - trace_printk("%s, enter SSR down\n", __func__); - if (tx_priv->swr_ctrl_data) { - swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - } - if ((!pm_runtime_enabled(tx_dev) || - !pm_runtime_suspended(tx_dev))) { - ret = bolero_runtime_suspend(tx_dev); - if (!ret) { - pm_runtime_disable(tx_dev); - pm_runtime_set_suspended(tx_dev); - pm_runtime_enable(tx_dev); - } - } - break; - case BOLERO_MACRO_EVT_SSR_UP: - trace_printk("%s, enter SSR up\n", __func__); - /* reset swr after ssr/pdr */ - tx_priv->reset_swr = true; - if (tx_priv->swr_ctrl_data) - swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - break; - case BOLERO_MACRO_EVT_CLK_RESET: - bolero_rsc_clk_reset(tx_dev, TX_CORE_CLK); - break; - case BOLERO_MACRO_EVT_BCS_CLK_OFF: - if (tx_priv->bcs_clk_en) - snd_soc_update_bits(codec, - BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, data << 6); - if (data) - tx_priv->hs_slow_insert_complete = true; - else - tx_priv->hs_slow_insert_complete = false; - break; - } - return 0; -} - -static int tx_macro_reg_wake_irq(struct snd_soc_codec *codec, - u32 data) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - u32 ipc_wakeup = data; - int ret = 0; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - if (tx_priv->swr_ctrl_data) - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_REGISTER_WAKE_IRQ, &ipc_wakeup); - - return ret; -} - -static int is_amic_enabled(struct snd_soc_codec *codec, int decimator) -{ - u16 adc_mux_reg = 0, adc_reg = 0; - u16 adc_n = BOLERO_ADC_MAX; - bool ret = false; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return ret; - adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - TX_MACRO_ADC_MUX_CFG_OFFSET * decimator; - if (snd_soc_read(codec, adc_mux_reg) & SWR_MIC) { - if (tx_priv->version == BOLERO_VERSION_2_1) - return true; - adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - TX_MACRO_ADC_MUX_CFG_OFFSET * decimator; - adc_n = snd_soc_read(codec, adc_reg) & - TX_MACRO_SWR_MIC_MUX_SEL_MASK; - if (adc_n < BOLERO_ADC_MAX) - return true; - } - - return ret; -} - -static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work = NULL; - struct hpf_work *hpf_work = NULL; - struct tx_macro_priv *tx_priv = NULL; - struct snd_soc_codec *codec = NULL; - u16 dec_cfg_reg = 0, hpf_gate_reg = 0; - u8 hpf_cut_off_freq = 0; - u16 adc_reg = 0, adc_n = 0; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - tx_priv = hpf_work->tx_priv; - codec = tx_priv->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 + - TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 + - TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - - dev_dbg(codec->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - if (is_amic_enabled(codec, hpf_work->decimator)) { - adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - TX_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator; - adc_n = snd_soc_read(codec, adc_reg) & - TX_MACRO_SWR_MIC_MUX_SEL_MASK; - /* analog mic clear TX hold */ - bolero_clear_amic_tx_hold(codec->dev, adc_n); - snd_soc_update_bits(codec, - dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x03, 0x02); - /* Add delay between toggle hpf gate based on sample rate */ - switch(tx_priv->amic_sample_rate) { - case 8000: - usleep_range(125, 130); - break; - case 16000: - usleep_range(62, 65); - break; - case 32000: - usleep_range(31, 32); - break; - case 48000: - usleep_range(20, 21); - break; - case 96000: - usleep_range(10, 11); - break; - case 192000: - usleep_range(5, 6); - break; - default: - usleep_range(125, 130); - } - snd_soc_update_bits(codec, hpf_gate_reg, - 0x03, 0x01); - } else { - snd_soc_update_bits(codec, - dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x00); - } -} - -static void tx_macro_mute_update_callback(struct work_struct *work) -{ - struct tx_mute_work *tx_mute_dwork = NULL; - struct snd_soc_codec *codec = NULL; - struct tx_macro_priv *tx_priv = NULL; - struct delayed_work *delayed_work = NULL; - u16 tx_vol_ctl_reg = 0; - u8 decimator = 0; - - delayed_work = to_delayed_work(work); - tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork); - tx_priv = tx_mute_dwork->tx_priv; - codec = tx_priv->codec; - decimator = tx_mute_dwork->decimator; - - tx_vol_ctl_reg = - BOLERO_CDC_TX0_TX_PATH_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n", - __func__, decimator); -} - -static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val = 0; - u16 mic_sel_reg = 0; - u16 dmic_clk_reg = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - val = ucontrol->value.enumerated.item[0]; - if (val > e->items - 1) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - switch (e->reg) { - case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0: - mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0: - mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0: - mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0: - mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0: - mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0: - mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0: - mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0: - mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0; - break; - default: - dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n", - __func__, e->reg); - return -EINVAL; - } - if (strnstr(widget->name, "SMIC", strlen(widget->name))) { - if (val != 0) { - if (val < 5) { - snd_soc_update_bits(codec, mic_sel_reg, - 1 << 7, 0x0 << 7); - } else { - snd_soc_update_bits(codec, - mic_sel_reg, - 1 << 7, 0x1 << 7); - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - 0x80, 0x00); - dmic_clk_reg = - BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL + - ((val - 5)/2) * 4; - snd_soc_update_bits(codec, - dmic_clk_reg, - 0x0E, tx_priv->dmic_clk_div << 0x1); - } - } - } else { - /* DMIC selected */ - if (val != 0) - snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, 1 << 7); - } - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - if (enable) { - set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); - tx_priv->active_ch_cnt[dai_id]++; - } else { - tx_priv->active_ch_cnt[dai_id]--; - clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); - } - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} - -static inline int tx_macro_path_get(const char *wname, - unsigned int *path_num) -{ - int ret = 0; - char *widget_name = NULL; - char *w_name = NULL; - char *path_num_char = NULL; - char *path_name = NULL; - - widget_name = kstrndup(wname, 10, GFP_KERNEL); - if (!widget_name) - return -EINVAL; - - w_name = widget_name; - - path_name = strsep(&widget_name, " "); - if (!path_name) { - pr_err("%s: Invalid widget name = %s\n", - __func__, widget_name); - ret = -EINVAL; - goto err; - } - path_num_char = strpbrk(path_name, "01234567"); - if (!path_num_char) { - pr_err("%s: tx path index not found\n", - __func__); - ret = -EINVAL; - goto err; - } - ret = kstrtouint(path_num_char, 10, path_num); - if (ret < 0) - pr_err("%s: Invalid tx path = %s\n", - __func__, w_name); - -err: - kfree(w_name); - return ret; -} - -static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct tx_macro_priv *tx_priv = NULL; - struct device *tx_dev = NULL; - int ret = 0; - int path = 0; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - ret = tx_macro_path_get(kcontrol->id.name, &path); - if (ret) - return ret; - - ucontrol->value.integer.value[0] = tx_priv->dec_mode[path]; - - return 0; -} - -static int tx_macro_dec_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct tx_macro_priv *tx_priv = NULL; - struct device *tx_dev = NULL; - int value = ucontrol->value.integer.value[0]; - int ret = 0; - int path = 0; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - ret = tx_macro_path_get(kcontrol->id.name, &path); - if (ret) - return ret; - - tx_priv->dec_mode[path] = value; - - return 0; -} - -static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct tx_macro_priv *tx_priv = NULL; - struct device *tx_dev = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = tx_priv->bcs_enable; - - return 0; -} - -static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct tx_macro_priv *tx_priv = NULL; - struct device *tx_dev = NULL; - int value = ucontrol->value.integer.value[0]; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - tx_priv->bcs_enable = value; - - return 0; -} - -static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - unsigned int dmic = 0; - int ret = 0; - char *wname = NULL; - - wname = strpbrk(w->name, "01234567"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: event %d DMIC%d\n", - __func__, event, dmic); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - bolero_dmic_clk_enable(codec, dmic, DMIC_TX, true); - break; - case SND_SOC_DAPM_POST_PMD: - bolero_dmic_clk_enable(codec, dmic, DMIC_TX, false); - break; - } - - return 0; -} - -static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - unsigned int decimator = 0; - u16 tx_vol_ctl_reg = 0; - u16 dec_cfg_reg = 0; - u16 hpf_gate_reg = 0; - u16 tx_gain_ctl_reg = 0; - u16 tx_fs_reg = 0; - u8 hpf_cut_off_freq = 0; - int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS; - int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - u16 adc_mux_reg = 0, adc_reg = 0, adc_n = 0; - u16 dmic_clk_reg = 0; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - decimator = w->shift; - - dev_dbg(codec->dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 + - TX_MACRO_TX_PATH_OFFSET * decimator; - dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 + - TX_MACRO_TX_PATH_OFFSET * decimator; - tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - - tx_priv->amic_sample_rate = (snd_soc_read(codec, tx_fs_reg) & 0x0F); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - TX_MACRO_ADC_MUX_CFG_OFFSET * decimator; - if (snd_soc_read(codec, adc_mux_reg) & SWR_MIC) { - adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - TX_MACRO_ADC_MUX_CFG_OFFSET * decimator; - adc_n = snd_soc_read(codec, adc_reg) & - TX_MACRO_SWR_MIC_MUX_SEL_MASK; - if (adc_n >= BOLERO_ADC_MAX) { - dmic_clk_reg = - BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL + - ((adc_n - 5) / 2) * 4; - snd_soc_update_bits(codec, - dmic_clk_reg, - 0x0E, tx_priv->dmic_clk_div << 0x1); - } - } - snd_soc_update_bits(codec, - dec_cfg_reg, 0x06, tx_priv->dec_mode[decimator] << - TX_MACRO_ADC_MODE_CFG0_SHIFT); - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x20); - if (!is_amic_enabled(codec, decimator)) { - snd_soc_update_bits(codec, - hpf_gate_reg, 0x01, 0x00); - /* - * Minimum 1 clk cycle delay is required as per HW spec - */ - usleep_range(1000, 1010); - } - hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - - if (is_amic_enabled(codec, decimator)) { - hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS; - unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS; - } - if (tx_unmute_delay < unmute_delay) - tx_unmute_delay = unmute_delay; - /* schedule work queue to Remove Mute */ - queue_delayed_work(system_freezable_wq, - &tx_priv->tx_mute_dwork[decimator].dwork, - msecs_to_jiffies(tx_unmute_delay)); - if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) { - schedule_delayed_work( - &tx_priv->tx_hpf_work[decimator].dwork, - msecs_to_jiffies(hpf_delay)); - snd_soc_update_bits(codec, - hpf_gate_reg, 0x03, 0x02); - if (!is_amic_enabled(codec, decimator)) - snd_soc_update_bits(codec, - hpf_gate_reg, 0x03, 0x00); - snd_soc_update_bits(codec, - hpf_gate_reg, 0x03, 0x01); - /* - * 6ms delay is required as per HW spec - */ - usleep_range(6000, 6010); - } - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, - tx_gain_ctl_reg)); - if (tx_priv->bcs_enable) { - snd_soc_update_bits(codec, dec_cfg_reg, - 0x01, 0x01); - tx_priv->bcs_clk_en = true; - if (tx_priv->hs_slow_insert_complete) - snd_soc_update_bits(codec, - BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x40); - } - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &tx_priv->tx_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - if (is_amic_enabled(codec, decimator)) - snd_soc_update_bits(codec, - hpf_gate_reg, - 0x03, 0x02); - else - snd_soc_update_bits(codec, - hpf_gate_reg, - 0x03, 0x03); - /* - * Minimum 1 clk cycle delay is required - * as per HW spec - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x03, 0x01); - } - } - cancel_delayed_work_sync( - &tx_priv->tx_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x00); - snd_soc_update_bits(codec, - dec_cfg_reg, 0x06, 0x00); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - if (tx_priv->bcs_enable) { - snd_soc_update_bits(codec, dec_cfg_reg, - 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x00); - tx_priv->bcs_clk_en = false; - } - break; - } - return 0; -} - -static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return 0; -} - -static int tx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - int tx_fs_rate = -EINVAL; - struct snd_soc_codec *codec = dai->codec; - u32 decimator = 0; - u32 sample_rate = 0; - u16 tx_fs_reg = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - sample_rate = params_rate(params); - switch (sample_rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - case 384000: - tx_fs_rate = 7; - break; - default: - dev_err(codec->dev, "%s: Invalid TX sample rate: %d\n", - __func__, params_rate(params)); - return -EINVAL; - } - for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id], - TX_MACRO_DEC_MAX) { - if (decimator >= 0) { - tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - dev_dbg(codec->dev, "%s: set DEC%u rate to %u\n", - __func__, decimator, sample_rate); - snd_soc_update_bits(codec, tx_fs_reg, 0x0F, - tx_fs_rate); - } else { - dev_err(codec->dev, - "%s: ERROR: Invalid decimator: %d\n", - __func__, decimator); - return -EINVAL; - } - } - return 0; -} - -static int tx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case TX_MACRO_AIF1_CAP: - case TX_MACRO_AIF2_CAP: - case TX_MACRO_AIF3_CAP: - *tx_slot = tx_priv->active_ch_mask[dai->id]; - *tx_num = tx_priv->active_ch_cnt[dai->id]; - break; - default: - dev_err(tx_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static struct snd_soc_dai_ops tx_macro_dai_ops = { - .hw_params = tx_macro_hw_params, - .get_channel_map = tx_macro_get_channel_map, -}; - -static struct snd_soc_dai_driver tx_macro_dai[] = { - { - .name = "tx_macro_tx1", - .id = TX_MACRO_AIF1_CAP, - .capture = { - .stream_name = "TX_AIF1 Capture", - .rates = TX_MACRO_RATES, - .formats = TX_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &tx_macro_dai_ops, - }, - { - .name = "tx_macro_tx2", - .id = TX_MACRO_AIF2_CAP, - .capture = { - .stream_name = "TX_AIF2 Capture", - .rates = TX_MACRO_RATES, - .formats = TX_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &tx_macro_dai_ops, - }, - { - .name = "tx_macro_tx3", - .id = TX_MACRO_AIF3_CAP, - .capture = { - .stream_name = "TX_AIF3 Capture", - .rates = TX_MACRO_RATES, - .formats = TX_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &tx_macro_dai_ops, - }, -}; - -#define STRING(name) #name -#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define TX_MACRO_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -static const char * const adc_mux_text[] = { - "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1" -}; - -TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1, - 0, adc_mux_text); - - -static const char * const dmic_mux_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", - "DMIC4", "DMIC5", "DMIC6", "DMIC7" -}; - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -static const char * const smic_mux_text[] = { - "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0", - "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4", - "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7" -}; - -TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -static const char * const smic_mux_text_v2[] = { - "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3", - "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7", - "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11" -}; - -TX_MACRO_DAPM_ENUM_EXT(tx_smic0_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic1_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic2_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic3_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic4_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic5_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic6_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic7_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -static const char * const dec_mode_mux_text[] = { - "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF", -}; - -static const struct soc_enum dec_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dec_mode_mux_text), - dec_mode_mux_text); - -static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new tx_aif1_cap_mixer_v2[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new tx_aif2_cap_mixer_v2[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new tx_aif3_cap_mixer_v2[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_common[] = { - SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0), - - SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0), - - SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0), - - TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0), - TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1), - TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2), - TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3), - - TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0_v2), - TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1_v2), - TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2_v2), - TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3_v2), - - SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0, - tx_macro_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("TX SWR_MIC0"), - SND_SOC_DAPM_INPUT("TX SWR_MIC1"), - SND_SOC_DAPM_INPUT("TX SWR_MIC2"), - SND_SOC_DAPM_INPUT("TX SWR_MIC3"), - SND_SOC_DAPM_INPUT("TX SWR_MIC4"), - SND_SOC_DAPM_INPUT("TX SWR_MIC5"), - SND_SOC_DAPM_INPUT("TX SWR_MIC6"), - SND_SOC_DAPM_INPUT("TX SWR_MIC7"), - SND_SOC_DAPM_INPUT("TX SWR_MIC8"), - SND_SOC_DAPM_INPUT("TX SWR_MIC9"), - SND_SOC_DAPM_INPUT("TX SWR_MIC10"), - SND_SOC_DAPM_INPUT("TX SWR_MIC11"), - - SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM, - TX_MACRO_DEC0, 0, - &tx_dec0_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM, - TX_MACRO_DEC1, 0, - &tx_dec1_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM, - TX_MACRO_DEC2, 0, - &tx_dec2_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM, - TX_MACRO_DEC3, 0, - &tx_dec3_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v2[] = { - SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, - TX_MACRO_AIF1_CAP, 0, - tx_aif1_cap_mixer_v2, ARRAY_SIZE(tx_aif1_cap_mixer_v2)), - - SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, - TX_MACRO_AIF2_CAP, 0, - tx_aif2_cap_mixer_v2, ARRAY_SIZE(tx_aif2_cap_mixer_v2)), - - SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, - TX_MACRO_AIF3_CAP, 0, - tx_aif3_cap_mixer_v2, ARRAY_SIZE(tx_aif3_cap_mixer_v2)), - - SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_tx_swr_clk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = { - SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, - TX_MACRO_AIF1_CAP, 0, - tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)), - - SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, - TX_MACRO_AIF2_CAP, 0, - tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)), - - SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, - TX_MACRO_AIF3_CAP, 0, - tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)), - - TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4), - TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5), - TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6), - TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7), - - TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4_v3), - TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5_v3), - TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6_v3), - TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7_v3), - - SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM, - TX_MACRO_DEC4, 0, - &tx_dec4_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM, - TX_MACRO_DEC5, 0, - &tx_dec5_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM, - TX_MACRO_DEC6, 0, - &tx_dec6_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM, - TX_MACRO_DEC7, 0, - &tx_dec7_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_tx_swr_clk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_va_swr_clk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0), - - SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0), - - SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0), - - SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0, - tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)), - - SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0, - tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)), - - SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0, - tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)), - - - TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0), - TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1), - TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2), - TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3), - TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4), - TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5), - TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6), - TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7), - - TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0), - TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1), - TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2), - TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3), - TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4), - TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5), - TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6), - TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7), - - SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0, - tx_macro_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("TX SWR_ADC0"), - SND_SOC_DAPM_INPUT("TX SWR_ADC1"), - SND_SOC_DAPM_INPUT("TX SWR_ADC2"), - SND_SOC_DAPM_INPUT("TX SWR_ADC3"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC0"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC1"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC2"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC3"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC4"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC5"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC6"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC7"), - - SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM, - TX_MACRO_DEC0, 0, - &tx_dec0_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM, - TX_MACRO_DEC1, 0, - &tx_dec1_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM, - TX_MACRO_DEC2, 0, - &tx_dec2_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM, - TX_MACRO_DEC3, 0, - &tx_dec3_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM, - TX_MACRO_DEC4, 0, - &tx_dec4_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM, - TX_MACRO_DEC5, 0, - &tx_dec5_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM, - TX_MACRO_DEC6, 0, - &tx_dec6_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM, - TX_MACRO_DEC7, 0, - &tx_dec7_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_tx_swr_clk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_va_swr_clk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route tx_audio_map_common[] = { - {"TX_AIF1 CAP", NULL, "TX_MCLK"}, - {"TX_AIF2 CAP", NULL, "TX_MCLK"}, - {"TX_AIF3 CAP", NULL, "TX_MCLK"}, - - {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"}, - {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"}, - {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"}, - - {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - - {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - - {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - - {"TX DEC0 MUX", NULL, "TX_MCLK"}, - {"TX DEC1 MUX", NULL, "TX_MCLK"}, - {"TX DEC2 MUX", NULL, "TX_MCLK"}, - {"TX DEC3 MUX", NULL, "TX_MCLK"}, - - {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"}, - {"TX DMIC MUX0", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX0", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX0", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX0", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX0", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX0", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX0", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX0", "DMIC7", "TX DMIC7"}, - - {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"}, - {"TX SMIC MUX0", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX0", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX0", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX0", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX0", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX0", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX0", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX0", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX0", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX0", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX0", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX0", "SWR_MIC11", "TX SWR_MIC11"}, - - {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"}, - {"TX DMIC MUX1", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX1", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX1", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX1", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX1", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX1", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX1", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX1", "DMIC7", "TX DMIC7"}, - - {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"}, - {"TX SMIC MUX1", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX1", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX1", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX1", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX1", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX1", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX1", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX1", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX1", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX1", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX1", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX1", "SWR_MIC11", "TX SWR_MIC11"}, - - {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"}, - {"TX DMIC MUX2", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX2", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX2", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX2", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX2", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX2", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX2", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX2", "DMIC7", "TX DMIC7"}, - - {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"}, - {"TX SMIC MUX2", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX2", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX2", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX2", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX2", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX2", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX2", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX2", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX2", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX2", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX2", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX2", "SWR_MIC11", "TX SWR_MIC11"}, - - {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"}, - {"TX DMIC MUX3", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX3", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX3", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX3", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX3", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX3", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX3", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX3", "DMIC7", "TX DMIC7"}, - - {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"}, - {"TX SMIC MUX3", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX3", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX3", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX3", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX3", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX3", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX3", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX3", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX3", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX3", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX3", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX3", "SWR_MIC11", "TX SWR_MIC11"}, -}; - -static const struct snd_soc_dapm_route tx_audio_map_v3[] = { - {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX DEC4 MUX", NULL, "TX_MCLK"}, - {"TX DEC5 MUX", NULL, "TX_MCLK"}, - {"TX DEC6 MUX", NULL, "TX_MCLK"}, - {"TX DEC7 MUX", NULL, "TX_MCLK"}, - - {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"}, - {"TX DMIC MUX4", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX4", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX4", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX4", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX4", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX4", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX4", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX4", "DMIC7", "TX DMIC7"}, - - {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"}, - {"TX SMIC MUX4", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX4", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX4", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX4", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX4", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX4", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX4", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX4", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX4", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX4", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX4", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX4", "SWR_MIC11", "TX SWR_MIC11"}, - - {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"}, - {"TX DMIC MUX5", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX5", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX5", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX5", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX5", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX5", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX5", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX5", "DMIC7", "TX DMIC7"}, - - {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"}, - {"TX SMIC MUX5", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX5", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX5", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX5", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX5", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX5", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX5", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX5", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX5", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX5", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX5", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX5", "SWR_MIC11", "TX SWR_MIC11"}, - - {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"}, - {"TX DMIC MUX6", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX6", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX6", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX6", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX6", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX6", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX6", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX6", "DMIC7", "TX DMIC7"}, - - {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"}, - {"TX SMIC MUX6", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX6", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX6", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX6", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX6", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX6", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX6", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX6", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX6", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX6", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX6", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX6", "SWR_MIC11", "TX SWR_MIC11"}, - - {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"}, - {"TX DMIC MUX7", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX7", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX7", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX7", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX7", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX7", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX7", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX7", "DMIC7", "TX DMIC7"}, - - {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"}, - {"TX SMIC MUX7", "SWR_MIC0", "TX SWR_MIC0"}, - {"TX SMIC MUX7", "SWR_MIC1", "TX SWR_MIC1"}, - {"TX SMIC MUX7", "SWR_MIC2", "TX SWR_MIC2"}, - {"TX SMIC MUX7", "SWR_MIC3", "TX SWR_MIC3"}, - {"TX SMIC MUX7", "SWR_MIC4", "TX SWR_MIC4"}, - {"TX SMIC MUX7", "SWR_MIC5", "TX SWR_MIC5"}, - {"TX SMIC MUX7", "SWR_MIC6", "TX SWR_MIC6"}, - {"TX SMIC MUX7", "SWR_MIC7", "TX SWR_MIC7"}, - {"TX SMIC MUX7", "SWR_MIC8", "TX SWR_MIC8"}, - {"TX SMIC MUX7", "SWR_MIC9", "TX SWR_MIC9"}, - {"TX SMIC MUX7", "SWR_MIC10", "TX SWR_MIC10"}, - {"TX SMIC MUX7", "SWR_MIC11", "TX SWR_MIC11"}, - - {"TX SMIC MUX0", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX1", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX2", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX3", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX4", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX5", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX6", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX7", NULL, "TX_SWR_CLK"}, -}; - -static const struct snd_soc_dapm_route tx_audio_map[] = { - {"TX_AIF1 CAP", NULL, "TX_MCLK"}, - {"TX_AIF2 CAP", NULL, "TX_MCLK"}, - {"TX_AIF3 CAP", NULL, "TX_MCLK"}, - - {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"}, - {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"}, - {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"}, - - {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX DEC0 MUX", NULL, "TX_MCLK"}, - {"TX DEC1 MUX", NULL, "TX_MCLK"}, - {"TX DEC2 MUX", NULL, "TX_MCLK"}, - {"TX DEC3 MUX", NULL, "TX_MCLK"}, - {"TX DEC4 MUX", NULL, "TX_MCLK"}, - {"TX DEC5 MUX", NULL, "TX_MCLK"}, - {"TX DEC6 MUX", NULL, "TX_MCLK"}, - {"TX DEC7 MUX", NULL, "TX_MCLK"}, - - {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"}, - {"TX DMIC MUX0", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX0", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX0", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX0", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX0", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX0", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX0", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX0", "DMIC7", "TX DMIC7"}, - - {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"}, - {"TX SMIC MUX0", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"}, - {"TX DMIC MUX1", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX1", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX1", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX1", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX1", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX1", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX1", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX1", "DMIC7", "TX DMIC7"}, - - {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"}, - {"TX SMIC MUX1", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"}, - {"TX DMIC MUX2", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX2", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX2", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX2", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX2", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX2", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX2", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX2", "DMIC7", "TX DMIC7"}, - - {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"}, - {"TX SMIC MUX2", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"}, - {"TX DMIC MUX3", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX3", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX3", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX3", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX3", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX3", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX3", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX3", "DMIC7", "TX DMIC7"}, - - {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"}, - {"TX SMIC MUX3", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"}, - {"TX DMIC MUX4", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX4", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX4", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX4", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX4", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX4", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX4", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX4", "DMIC7", "TX DMIC7"}, - - {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"}, - {"TX SMIC MUX4", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"}, - {"TX DMIC MUX5", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX5", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX5", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX5", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX5", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX5", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX5", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX5", "DMIC7", "TX DMIC7"}, - - {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"}, - {"TX SMIC MUX5", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"}, - {"TX DMIC MUX6", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX6", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX6", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX6", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX6", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX6", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX6", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX6", "DMIC7", "TX DMIC7"}, - - {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"}, - {"TX SMIC MUX6", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"}, - {"TX DMIC MUX7", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX7", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX7", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX7", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX7", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX7", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX7", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX7", "DMIC7", "TX DMIC7"}, - - {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"}, - {"TX SMIC MUX7", NULL, "TX_SWR_CLK"}, - {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"}, -}; - -static const struct snd_kcontrol_new tx_macro_snd_controls_common[] = { - SOC_SINGLE_SX_TLV("TX_DEC0 Volume", - BOLERO_CDC_TX0_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC1 Volume", - BOLERO_CDC_TX1_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC2 Volume", - BOLERO_CDC_TX2_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC3 Volume", - BOLERO_CDC_TX3_TX_VOL_CTL, - 0, -84, 40, digital_gain), - - SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0, - tx_macro_get_bcs, tx_macro_set_bcs), -}; - -static const struct snd_kcontrol_new tx_macro_snd_controls_v3[] = { - SOC_SINGLE_SX_TLV("TX_DEC4 Volume", - BOLERO_CDC_TX4_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC5 Volume", - BOLERO_CDC_TX5_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC6 Volume", - BOLERO_CDC_TX6_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC7 Volume", - BOLERO_CDC_TX7_TX_VOL_CTL, - 0, -84, 40, digital_gain), - - SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), -}; - -static const struct snd_kcontrol_new tx_macro_snd_controls[] = { - SOC_SINGLE_SX_TLV("TX_DEC0 Volume", - BOLERO_CDC_TX0_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC1 Volume", - BOLERO_CDC_TX1_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC2 Volume", - BOLERO_CDC_TX2_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC3 Volume", - BOLERO_CDC_TX3_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC4 Volume", - BOLERO_CDC_TX4_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC5 Volume", - BOLERO_CDC_TX5_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC6 Volume", - BOLERO_CDC_TX6_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC7 Volume", - BOLERO_CDC_TX7_TX_VOL_CTL, - 0, -84, 40, digital_gain), - - SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum, - tx_macro_dec_mode_get, tx_macro_dec_mode_put), - - SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0, - tx_macro_get_bcs, tx_macro_set_bcs), -}; - -static int tx_macro_register_event_listener(struct snd_soc_codec *codec, - bool enable) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - int ret = 0; - - if (!codec) - return -EINVAL; - - tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO); - if (!tx_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - tx_priv = dev_get_drvdata(tx_dev); - if (!tx_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - if (tx_priv->swr_ctrl_data && - (!tx_priv->tx_swr_clk_cnt || !tx_priv->va_swr_clk_cnt)) { - if (enable) { - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_REGISTER_WAKEUP, NULL); - msm_cdc_pinctrl_set_wakeup_capable( - tx_priv->tx_swr_gpio_p, false); - } else { - msm_cdc_pinctrl_set_wakeup_capable( - tx_priv->tx_swr_gpio_p, true); - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEREGISTER_WAKEUP, NULL); - } - } - - return ret; -} - -static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv, - struct regmap *regmap, int clk_type, - bool enable) -{ - int ret = 0, clk_tx_ret = 0; - - trace_printk("%s: clock type %s, enable: %s tx_mclk_users: %d\n", - __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"), - (enable ? "enable" : "disable"), tx_priv->tx_mclk_users); - dev_dbg(tx_priv->dev, - "%s: clock type %s, enable: %s tx_mclk_users: %d\n", - __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"), - (enable ? "enable" : "disable"), tx_priv->tx_mclk_users); - - if (enable) { - if (tx_priv->swr_clk_users == 0) { - trace_printk("%s: tx swr clk users 0\n", __func__); - ret = msm_cdc_pinctrl_select_active_state( - tx_priv->tx_swr_gpio_p); - if (ret < 0) { - dev_err_ratelimited(tx_priv->dev, - "%s: tx swr pinctrl enable failed\n", - __func__); - goto exit; - } - } - - clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - true); - if (clk_type == TX_MCLK) { - trace_printk("%s: requesting TX_MCLK\n", __func__); - ret = tx_macro_mclk_enable(tx_priv, 1); - if (ret < 0) { - if (tx_priv->swr_clk_users == 0) - msm_cdc_pinctrl_select_sleep_state( - tx_priv->tx_swr_gpio_p); - dev_err_ratelimited(tx_priv->dev, - "%s: request clock enable failed\n", - __func__); - goto done; - } - } - if (clk_type == VA_MCLK) { - trace_printk("%s: requesting VA_MCLK\n", __func__); - ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - VA_CORE_CLK, - true); - if (ret < 0) { - if (tx_priv->swr_clk_users == 0) - msm_cdc_pinctrl_select_sleep_state( - tx_priv->tx_swr_gpio_p); - dev_err_ratelimited(tx_priv->dev, - "%s: swr request clk failed\n", - __func__); - goto done; - } - bolero_clk_rsc_fs_gen_request(tx_priv->dev, - true); - if (tx_priv->tx_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - } - tx_priv->tx_mclk_users++; - } - if (tx_priv->swr_clk_users == 0) { - dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n", - __func__, tx_priv->reset_swr); - trace_printk("%s: reset_swr: %d\n", - __func__, tx_priv->reset_swr); - if (tx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - if (tx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x00); - tx_priv->reset_swr = false; - } - if (!clk_tx_ret) - ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - tx_priv->swr_clk_users++; - } else { - if (tx_priv->swr_clk_users <= 0) { - dev_err_ratelimited(tx_priv->dev, - "tx swrm clock users already 0\n"); - tx_priv->swr_clk_users = 0; - return 0; - } - clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - true); - tx_priv->swr_clk_users--; - if (tx_priv->swr_clk_users == 0) - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - if (clk_type == TX_MCLK) - tx_macro_mclk_enable(tx_priv, 0); - if (clk_type == VA_MCLK) { - if (tx_priv->tx_mclk_users <= 0) { - dev_err(tx_priv->dev, "%s: clock already disabled\n", - __func__); - tx_priv->tx_mclk_users = 0; - return 0; - } - tx_priv->tx_mclk_users--; - if (tx_priv->tx_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - } - - bolero_clk_rsc_fs_gen_request(tx_priv->dev, - false); - ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - VA_CORE_CLK, - false); - if (ret < 0) { - dev_err_ratelimited(tx_priv->dev, - "%s: swr request clk failed\n", - __func__); - goto done; - } - } - if (!clk_tx_ret) - ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - if (tx_priv->swr_clk_users == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - tx_priv->tx_swr_gpio_p); - if (ret < 0) { - dev_err_ratelimited(tx_priv->dev, - "%s: tx swr pinctrl disable failed\n", - __func__); - goto exit; - } - } - } - return 0; - -done: - if (!clk_tx_ret) - bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); -exit: - trace_printk("%s: exit\n", __func__); - return ret; -} - -static int tx_macro_clk_div_get(struct snd_soc_codec *codec) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - return tx_priv->dmic_clk_div; -} - -static int tx_macro_clk_switch(struct snd_soc_codec *codec, int clk_src) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - int ret = 0; - - if (!codec) - return -EINVAL; - - tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO); - if (!tx_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - tx_priv = dev_get_drvdata(tx_dev); - if (!tx_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - if (tx_priv->swr_ctrl_data) { - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - } - - return ret; -} - -static int tx_macro_core_vote(void *handle, bool enable) -{ - struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle; - - if (tx_priv == NULL) { - pr_err("%s: tx priv data is NULL\n", __func__); - return -EINVAL; - } - if (enable) { - pm_runtime_get_sync(tx_priv->dev); - pm_runtime_put_autosuspend(tx_priv->dev); - pm_runtime_mark_last_busy(tx_priv->dev); - } - - if (bolero_check_core_votes(tx_priv->dev)) - return 0; - else - return -EINVAL; -} - -static int tx_macro_swrm_clock(void *handle, bool enable) -{ - struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle; - struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&tx_priv->swr_clk_lock); - trace_printk("%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n", - __func__, - (enable ? "enable" : "disable"), - tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt); - dev_dbg(tx_priv->dev, - "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n", - __func__, (enable ? "enable" : "disable"), - tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt); - - if (enable) { - pm_runtime_get_sync(tx_priv->dev); - if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt) { - ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap, - VA_MCLK, enable); - if (ret) { - pm_runtime_mark_last_busy(tx_priv->dev); - pm_runtime_put_autosuspend(tx_priv->dev); - goto done; - } - tx_priv->va_clk_status++; - } else { - ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap, - TX_MCLK, enable); - if (ret) { - pm_runtime_mark_last_busy(tx_priv->dev); - pm_runtime_put_autosuspend(tx_priv->dev); - goto done; - } - tx_priv->tx_clk_status++; - } - pm_runtime_mark_last_busy(tx_priv->dev); - pm_runtime_put_autosuspend(tx_priv->dev); - } else { - if (tx_priv->va_clk_status && !tx_priv->tx_clk_status) { - ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap, - VA_MCLK, enable); - if (ret) - goto done; - --tx_priv->va_clk_status; - } else if (!tx_priv->va_clk_status && tx_priv->tx_clk_status) { - ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap, - TX_MCLK, enable); - if (ret) - goto done; - --tx_priv->tx_clk_status; - } else if (tx_priv->va_clk_status && tx_priv->tx_clk_status) { - if (!tx_priv->va_swr_clk_cnt && tx_priv->tx_swr_clk_cnt) { - ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap, - VA_MCLK, enable); - if (ret) - goto done; - --tx_priv->va_clk_status; - } else { - ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap, - TX_MCLK, enable); - if (ret) - goto done; - --tx_priv->tx_clk_status; - } - - } else { - dev_dbg(tx_priv->dev, - "%s: Both clocks are disabled\n", __func__); - } - } - - trace_printk("%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n", - __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status, - tx_priv->va_clk_status); - dev_dbg(tx_priv->dev, - "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n", - __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status, - tx_priv->va_clk_status); -done: - mutex_unlock(&tx_priv->swr_clk_lock); - return ret; -} - -static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, - struct tx_macro_priv *tx_priv) -{ - u32 div_factor = TX_MACRO_CLK_DIV_2; - u32 mclk_rate = TX_MACRO_MCLK_FREQ; - - if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) - goto undefined_rate; - - div_factor = mclk_rate / dmic_sample_rate; - - switch (div_factor) { - case 2: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2; - break; - case 3: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3; - break; - case 4: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4; - break; - case 6: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6; - break; - case 8: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8; - break; - case 16: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16; - break; - default: - /* Any other DIV factor is invalid */ - goto undefined_rate; - } - - /* Valid dmic DIV factors */ - dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - - return dmic_sample_rate; - -undefined_rate: - dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n", - __func__, dmic_sample_rate, mclk_rate); - dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED; - - return dmic_sample_rate; -} - -static const struct tx_macro_reg_mask_val tx_macro_reg_init[] = { - {BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x0A}, -}; -static int tx_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret = 0, i = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO); - if (!tx_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - tx_priv = dev_get_drvdata(tx_dev); - if (!tx_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - tx_priv->version = bolero_get_version(tx_dev); - if (tx_priv->version >= BOLERO_VERSION_2_0) { - ret = snd_soc_dapm_new_controls(dapm, - tx_macro_dapm_widgets_common, - ARRAY_SIZE(tx_macro_dapm_widgets_common)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add controls\n", - __func__); - return ret; - } - if (tx_priv->version == BOLERO_VERSION_2_1) - ret = snd_soc_dapm_new_controls(dapm, - tx_macro_dapm_widgets_v2, - ARRAY_SIZE(tx_macro_dapm_widgets_v2)); - else if (tx_priv->version == BOLERO_VERSION_2_0) - ret = snd_soc_dapm_new_controls(dapm, - tx_macro_dapm_widgets_v3, - ARRAY_SIZE(tx_macro_dapm_widgets_v3)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add controls\n", - __func__); - return ret; - } - } else { - ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets, - ARRAY_SIZE(tx_macro_dapm_widgets)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add controls\n", __func__); - return ret; - } - } - - if (tx_priv->version >= BOLERO_VERSION_2_0) { - ret = snd_soc_dapm_add_routes(dapm, - tx_audio_map_common, - ARRAY_SIZE(tx_audio_map_common)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add routes\n", - __func__); - return ret; - } - if (tx_priv->version == BOLERO_VERSION_2_0) - ret = snd_soc_dapm_add_routes(dapm, - tx_audio_map_v3, - ARRAY_SIZE(tx_audio_map_v3)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add routes\n", - __func__); - return ret; - } - } else { - ret = snd_soc_dapm_add_routes(dapm, tx_audio_map, - ARRAY_SIZE(tx_audio_map)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add routes\n", - __func__); - return ret; - } - } - - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add widgets\n", __func__); - return ret; - } - - if (tx_priv->version >= BOLERO_VERSION_2_0) { - ret = snd_soc_add_codec_controls(codec, - tx_macro_snd_controls_common, - ARRAY_SIZE(tx_macro_snd_controls_common)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add snd_ctls\n", - __func__); - return ret; - } - if (tx_priv->version == BOLERO_VERSION_2_0) - ret = snd_soc_add_codec_controls(codec, - tx_macro_snd_controls_v3, - ARRAY_SIZE(tx_macro_snd_controls_v3)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add snd_ctls\n", - __func__); - return ret; - } - } else { - ret = snd_soc_add_codec_controls(codec, - tx_macro_snd_controls, - ARRAY_SIZE(tx_macro_snd_controls)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add snd_ctls\n", - __func__); - return ret; - } - } - - snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "TX_AIF3 Capture"); - if (tx_priv->version >= BOLERO_VERSION_2_0) { - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC0"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC1"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC2"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC3"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC4"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC5"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC6"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC7"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC8"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC9"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC10"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC11"); - } else { - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC0"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC6"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC7"); - } - snd_soc_dapm_sync(dapm); - - for (i = 0; i < NUM_DECIMATORS; i++) { - tx_priv->tx_hpf_work[i].tx_priv = tx_priv; - tx_priv->tx_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork, - tx_macro_tx_hpf_corner_freq_callback); - } - - for (i = 0; i < NUM_DECIMATORS; i++) { - tx_priv->tx_mute_dwork[i].tx_priv = tx_priv; - tx_priv->tx_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork, - tx_macro_mute_update_callback); - } - tx_priv->codec = codec; - - for (i = 0; i < ARRAY_SIZE(tx_macro_reg_init); i++) - snd_soc_update_bits(codec, - tx_macro_reg_init[i].reg, - tx_macro_reg_init[i].mask, - tx_macro_reg_init[i].val); - - if (tx_priv->version == BOLERO_VERSION_2_1) - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0xF0, 0xA0); - else if (tx_priv->version == BOLERO_VERSION_2_0) - snd_soc_update_bits(codec, - BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0xF0, 0xA0); - - return 0; -} - -static int tx_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - tx_priv->codec = NULL; - return 0; -} - -static void tx_macro_add_child_devices(struct work_struct *work) -{ - struct tx_macro_priv *tx_priv = NULL; - struct platform_device *pdev = NULL; - struct device_node *node = NULL; - struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL; - int ret = 0; - u16 count = 0, ctrl_num = 0; - struct tx_macro_swr_ctrl_platform_data *platdata = NULL; - char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = ""; - bool tx_swr_master_node = false; - - tx_priv = container_of(work, struct tx_macro_priv, - tx_macro_add_child_devices_work); - if (!tx_priv) { - pr_err("%s: Memory for tx_priv does not exist\n", - __func__); - return; - } - - if (!tx_priv->dev) { - pr_err("%s: tx dev does not exist\n", __func__); - return; - } - - if (!tx_priv->dev->of_node) { - dev_err(tx_priv->dev, - "%s: DT node for tx_priv does not exist\n", __func__); - return; - } - - platdata = &tx_priv->swr_plat_data; - tx_priv->child_count = 0; - - for_each_available_child_of_node(tx_priv->dev->of_node, node) { - tx_swr_master_node = false; - if (strnstr(node->name, "tx_swr_master", - strlen("tx_swr_master")) != NULL) - tx_swr_master_node = true; - - if (tx_swr_master_node) - strlcpy(plat_dev_name, "tx_swr_ctrl", - (TX_MACRO_SWR_STRING_LEN - 1)); - else - strlcpy(plat_dev_name, node->name, - (TX_MACRO_SWR_STRING_LEN - 1)); - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = tx_priv->dev; - pdev->dev.of_node = node; - - if (tx_swr_master_node) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (tx_swr_master_node) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct tx_macro_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - ret = -ENOMEM; - goto fail_pdev_add; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - tx_priv->swr_ctrl_data = swr_ctrl_data; - } - if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX) - tx_priv->pdev_child_devices[ - tx_priv->child_count++] = pdev; - else - goto err; - } - return; -fail_pdev_add: - for (count = 0; count < tx_priv->child_count; count++) - platform_device_put(tx_priv->pdev_child_devices[count]); -err: - return; -} - -static int tx_macro_set_port_map(struct snd_soc_codec *codec, - u32 usecase, u32 size, void *data) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - struct swrm_port_config port_cfg; - int ret = 0; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - memset(&port_cfg, 0, sizeof(port_cfg)); - port_cfg.uc = usecase; - port_cfg.size = size; - port_cfg.params = data; - - if (tx_priv->swr_ctrl_data) - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_SET_PORT_MAP, &port_cfg); - - return ret; -} - -static void tx_macro_init_ops(struct macro_ops *ops, - char __iomem *tx_io_base) -{ - memset(ops, 0, sizeof(struct macro_ops)); - ops->init = tx_macro_init; - ops->exit = tx_macro_deinit; - ops->io_base = tx_io_base; - ops->dai_ptr = tx_macro_dai; - ops->num_dais = ARRAY_SIZE(tx_macro_dai); - ops->event_handler = tx_macro_event_handler; - ops->reg_wake_irq = tx_macro_reg_wake_irq; - ops->set_port_map = tx_macro_set_port_map; - ops->clk_div_get = tx_macro_clk_div_get; - ops->clk_switch = tx_macro_clk_switch; - ops->reg_evt_listener = tx_macro_register_event_listener; - ops->clk_enable = __tx_macro_mclk_enable; -} - -static int tx_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops = {0}; - struct tx_macro_priv *tx_priv = NULL; - u32 tx_base_addr = 0, sample_rate = 0; - char __iomem *tx_io_base = NULL; - int ret = 0; - const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate"; - u32 is_used_tx_swr_gpio = 1; - const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio"; - - tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv), - GFP_KERNEL); - if (!tx_priv) - return -ENOMEM; - platform_set_drvdata(pdev, tx_priv); - - tx_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &tx_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - dev_set_drvdata(&pdev->dev, tx_priv); - if (of_find_property(pdev->dev.of_node, is_used_tx_swr_gpio_dt, - NULL)) { - ret = of_property_read_u32(pdev->dev.of_node, - is_used_tx_swr_gpio_dt, - &is_used_tx_swr_gpio); - if (ret) { - dev_err(&pdev->dev, "%s: error reading %s in dt\n", - __func__, is_used_tx_swr_gpio_dt); - is_used_tx_swr_gpio = 1; - } - } - tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,tx-swr-gpios", 0); - if (!tx_priv->tx_swr_gpio_p && is_used_tx_swr_gpio) { - dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n", - __func__); - return -EINVAL; - } - if (msm_cdc_pinctrl_get_state(tx_priv->tx_swr_gpio_p) < 0 && - is_used_tx_swr_gpio) { - dev_err(&pdev->dev, "%s: failed to get swr pin state\n", - __func__); - return -EPROBE_DEFER; - } - - tx_io_base = devm_ioremap(&pdev->dev, - tx_base_addr, TX_MACRO_MAX_OFFSET); - if (!tx_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -ENOMEM; - } - tx_priv->tx_io_base = tx_io_base; - ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate, - &sample_rate); - if (ret) { - dev_err(&pdev->dev, - "%s: could not find sample_rate entry in dt\n", - __func__); - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2; - } else { - if (tx_macro_validate_dmic_sample_rate( - sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED) - return -EINVAL; - } - if (is_used_tx_swr_gpio) { - tx_priv->reset_swr = true; - INIT_WORK(&tx_priv->tx_macro_add_child_devices_work, - tx_macro_add_child_devices); - tx_priv->swr_plat_data.handle = (void *) tx_priv; - tx_priv->swr_plat_data.read = NULL; - tx_priv->swr_plat_data.write = NULL; - tx_priv->swr_plat_data.bulk_write = NULL; - tx_priv->swr_plat_data.clk = tx_macro_swrm_clock; - tx_priv->swr_plat_data.core_vote = tx_macro_core_vote; - tx_priv->swr_plat_data.handle_irq = NULL; - mutex_init(&tx_priv->swr_clk_lock); - } - tx_priv->is_used_tx_swr_gpio = is_used_tx_swr_gpio; - mutex_init(&tx_priv->mclk_lock); - tx_macro_init_ops(&ops, tx_io_base); - ops.clk_id_req = TX_CORE_CLK; - ops.default_clk_id = TX_CORE_CLK; - ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops); - if (ret) { - dev_err(&pdev->dev, - "%s: register macro failed\n", __func__); - goto err_reg_macro; - } - if (is_used_tx_swr_gpio) - schedule_work(&tx_priv->tx_macro_add_child_devices_work); - pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - pm_suspend_ignore_children(&pdev->dev, true); - pm_runtime_enable(&pdev->dev); - - return 0; -err_reg_macro: - mutex_destroy(&tx_priv->mclk_lock); - if (is_used_tx_swr_gpio) - mutex_destroy(&tx_priv->swr_clk_lock); - return ret; -} - -static int tx_macro_remove(struct platform_device *pdev) -{ - struct tx_macro_priv *tx_priv = NULL; - u16 count = 0; - - tx_priv = platform_get_drvdata(pdev); - - if (!tx_priv) - return -EINVAL; - - if (tx_priv->is_used_tx_swr_gpio) { - if (tx_priv->swr_ctrl_data) - kfree(tx_priv->swr_ctrl_data); - for (count = 0; count < tx_priv->child_count && - count < TX_MACRO_CHILD_DEVICES_MAX; count++) - platform_device_unregister( - tx_priv->pdev_child_devices[count]); - } - - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - mutex_destroy(&tx_priv->mclk_lock); - if (tx_priv->is_used_tx_swr_gpio) - mutex_destroy(&tx_priv->swr_clk_lock); - bolero_unregister_macro(&pdev->dev, TX_MACRO); - return 0; -} - - -static const struct of_device_id tx_macro_dt_match[] = { - {.compatible = "qcom,tx-macro"}, - {} -}; - -static const struct dev_pm_ops bolero_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - pm_runtime_force_suspend, - pm_runtime_force_resume - ) - SET_RUNTIME_PM_OPS( - bolero_runtime_suspend, - bolero_runtime_resume, - NULL - ) -}; - -static struct platform_driver tx_macro_driver = { - .driver = { - .name = "tx_macro", - .owner = THIS_MODULE, - .pm = &bolero_dev_pm_ops, - .of_match_table = tx_macro_dt_match, - .suppress_bind_attrs = true, - }, - .probe = tx_macro_probe, - .remove = tx_macro_remove, -}; - -module_platform_driver(tx_macro_driver); - -MODULE_DESCRIPTION("TX macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/bolero/va-macro.c b/techpack/audio/4.0/asoc/codecs/bolero/va-macro.c deleted file mode 100644 index 2cd43116e7eb..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/va-macro.c +++ /dev/null @@ -1,3389 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" -#include "bolero-clk-rsc.h" - -/* pm runtime auto suspend timer in msecs */ -#define VA_AUTO_SUSPEND_DELAY 100 /* delay in msec */ -#define VA_MACRO_MAX_OFFSET 0x1000 - -#define VA_MACRO_NUM_DECIMATORS 8 - -#define VA_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define VA_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED 0 -#define VA_MACRO_MCLK_FREQ 9600000 -#define VA_MACRO_TX_PATH_OFFSET 0x80 -#define VA_MACRO_TX_DMIC_CLK_DIV_MASK 0x0E -#define VA_MACRO_TX_DMIC_CLK_DIV_SHFT 0x01 -#define VA_MACRO_SWR_MIC_MUX_SEL_MASK 0xF -#define VA_MACRO_ADC_MUX_CFG_OFFSET 0x8 -#define VA_MACRO_ADC_MODE_CFG0_SHIFT 1 - -#define BOLERO_CDC_VA_TX_DMIC_UNMUTE_DELAY_MS 40 -#define BOLERO_CDC_VA_TX_AMIC_UNMUTE_DELAY_MS 100 -#define BOLERO_CDC_VA_TX_DMIC_HPF_DELAY_MS 300 -#define BOLERO_CDC_VA_TX_AMIC_HPF_DELAY_MS 300 -#define MAX_RETRY_ATTEMPTS 500 -#define VA_MACRO_SWR_STRING_LEN 80 -#define VA_MACRO_CHILD_DEVICES_MAX 3 - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); -static int va_tx_unmute_delay = BOLERO_CDC_VA_TX_DMIC_UNMUTE_DELAY_MS; -module_param(va_tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(va_tx_unmute_delay, "delay to unmute the tx path"); - -enum { - VA_MACRO_AIF_INVALID = 0, - VA_MACRO_AIF1_CAP, - VA_MACRO_AIF2_CAP, - VA_MACRO_AIF3_CAP, - VA_MACRO_MAX_DAIS, -}; - -enum { - VA_MACRO_DEC0, - VA_MACRO_DEC1, - VA_MACRO_DEC2, - VA_MACRO_DEC3, - VA_MACRO_DEC4, - VA_MACRO_DEC5, - VA_MACRO_DEC6, - VA_MACRO_DEC7, - VA_MACRO_DEC_MAX, -}; - -enum { - VA_MACRO_CLK_DIV_2, - VA_MACRO_CLK_DIV_3, - VA_MACRO_CLK_DIV_4, - VA_MACRO_CLK_DIV_6, - VA_MACRO_CLK_DIV_8, - VA_MACRO_CLK_DIV_16, -}; - -enum { - MSM_DMIC, - SWR_MIC, -}; - -enum { - TX_MCLK, - VA_MCLK, -}; - -struct va_mute_work { - struct va_macro_priv *va_priv; - u32 decimator; - struct delayed_work dwork; -}; - -struct hpf_work { - struct va_macro_priv *va_priv; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -/* Hold instance to soundwire platform device */ -struct va_macro_swr_ctrl_data { - struct platform_device *va_swr_pdev; -}; - -struct va_macro_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*core_vote)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -struct va_macro_priv { - struct device *dev; - bool dec_active[VA_MACRO_NUM_DECIMATORS]; - bool va_without_decimation; - struct clk *lpass_audio_hw_vote; - struct mutex mclk_lock; - struct mutex swr_clk_lock; - struct snd_soc_codec *codec; - struct hpf_work va_hpf_work[VA_MACRO_NUM_DECIMATORS]; - struct va_mute_work va_mute_dwork[VA_MACRO_NUM_DECIMATORS]; - unsigned long active_ch_mask[VA_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[VA_MACRO_MAX_DAIS]; - u16 dmic_clk_div; - u16 va_mclk_users; - int swr_clk_users; - bool reset_swr; - struct device_node *va_swr_gpio_p; - struct va_macro_swr_ctrl_data *swr_ctrl_data; - struct va_macro_swr_ctrl_platform_data swr_plat_data; - struct work_struct va_macro_add_child_devices_work; - int child_count; - u16 mclk_mux_sel; - char __iomem *va_io_base; - char __iomem *va_island_mode_muxsel; - struct platform_device *pdev_child_devices - [VA_MACRO_CHILD_DEVICES_MAX]; - struct regulator *micb_supply; - u32 micb_voltage; - u32 micb_current; - u32 version; - u32 is_used_va_swr_gpio; - int micb_users; - u16 default_clk_id; - u16 clk_id; - int tx_swr_clk_cnt; - int va_swr_clk_cnt; - int va_clk_status; - int tx_clk_status; - bool lpi_enable; - bool register_event_listener; - int dec_mode[VA_MACRO_NUM_DECIMATORS]; -}; - -static bool va_macro_get_data(struct snd_soc_codec *codec, - struct device **va_dev, - struct va_macro_priv **va_priv, - const char *func_name) -{ - *va_dev = bolero_get_device_ptr(codec->dev, VA_MACRO); - if (!(*va_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - *va_priv = dev_get_drvdata((*va_dev)); - if (!(*va_priv) || !(*va_priv)->codec) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - return true; -} - -static int va_macro_clk_div_get(struct snd_soc_codec *codec) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - if ((va_priv->version == BOLERO_VERSION_2_1) - && !va_priv->lpi_enable - && (va_priv->dmic_clk_div == VA_MACRO_CLK_DIV_16)) - return VA_MACRO_CLK_DIV_8; - - return va_priv->dmic_clk_div; -} - -static int va_macro_mclk_enable(struct va_macro_priv *va_priv, - bool mclk_enable, bool dapm) -{ - struct regmap *regmap = dev_get_regmap(va_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(va_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(va_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, va_priv->va_mclk_users); - - mutex_lock(&va_priv->mclk_lock); - if (mclk_enable) { - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - va_priv->clk_id, - true); - if (ret < 0) { - dev_err(va_priv->dev, - "%s: va request clock en failed\n", - __func__); - goto exit; - } - bolero_clk_rsc_fs_gen_request(va_priv->dev, - true); - if (va_priv->va_mclk_users == 0) { - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - VA_START_OFFSET, - VA_MAX_OFFSET); - } - va_priv->va_mclk_users++; - } else { - if (va_priv->va_mclk_users <= 0) { - dev_err(va_priv->dev, "%s: clock already disabled\n", - __func__); - va_priv->va_mclk_users = 0; - goto exit; - } - va_priv->va_mclk_users--; - bolero_clk_rsc_fs_gen_request(va_priv->dev, - false); - bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - va_priv->clk_id, - false); - } -exit: - mutex_unlock(&va_priv->mclk_lock); - return ret; -} - -static int va_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int retry_cnt = MAX_RETRY_ATTEMPTS; - int ret = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_WAIT_VA_CLK_RESET: - while ((va_priv->va_mclk_users != 0) && (retry_cnt != 0)) { - dev_dbg_ratelimited(va_dev, "%s:retry_cnt: %d\n", - __func__, retry_cnt); - /* - * Userspace takes 10 seconds to close - * the session when pcm_start fails due to concurrency - * with PDR/SSR. Loop and check every 20ms till 10 - * seconds for va_mclk user count to get reset to 0 - * which ensures userspace teardown is done and SSR - * powerup seq can proceed. - */ - msleep(20); - retry_cnt--; - } - if (retry_cnt == 0) - dev_err(va_dev, - "%s: va_mclk_users is non-zero still, audio SSR fail!!\n", - __func__); - break; - case BOLERO_MACRO_EVT_SSR_UP: - trace_printk("%s, enter SSR up\n", __func__); - /* enable&disable VA_CORE_CLK to reset GFMUX reg */ - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - VA_CORE_CLK, true); - if (ret < 0) - dev_err_ratelimited(va_priv->dev, - "%s, failed to enable clk, ret:%d\n", - __func__, ret); - else - bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - VA_CORE_CLK, false); - /* reset swr after ssr/pdr */ - va_priv->reset_swr = true; - if (va_priv->swr_ctrl_data) - swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - break; - case BOLERO_MACRO_EVT_CLK_RESET: - bolero_rsc_clk_reset(va_dev, VA_CORE_CLK); - break; - case BOLERO_MACRO_EVT_SSR_DOWN: - if (va_priv->swr_ctrl_data) { - swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - } - if ((!pm_runtime_enabled(va_dev) || - !pm_runtime_suspended(va_dev))) { - ret = bolero_runtime_suspend(va_dev); - if (!ret) { - pm_runtime_disable(va_dev); - pm_runtime_set_suspended(va_dev); - pm_runtime_enable(va_dev); - } - } - break; - default: - break; - } - return 0; -} - -static int va_macro_swr_clk_event_v2(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - va_priv->va_swr_clk_cnt++; - break; - case SND_SOC_DAPM_POST_PMD: - va_priv->va_swr_clk_cnt--; - break; - default: - break; - } - return 0; -} - -static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int clk_src = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, "%s: event = %d, lpi_enable = %d\n", - __func__, event, va_priv->lpi_enable); - - if (!va_priv->lpi_enable) - return ret; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_VA_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - } - msm_cdc_pinctrl_set_wakeup_capable( - va_priv->va_swr_gpio_p, false); - break; - case SND_SOC_DAPM_POST_PMD: - msm_cdc_pinctrl_set_wakeup_capable( - va_priv->va_swr_gpio_p, true); - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_TX_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - } - break; - default: - dev_err(va_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, "%s: event = %d, lpi_enable = %d\n", - __func__, event, va_priv->lpi_enable); - - if (!va_priv->lpi_enable) - return ret; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (va_priv->lpass_audio_hw_vote) { - ret = digital_cdc_rsc_mgr_hw_vote_enable( - va_priv->lpass_audio_hw_vote); - if (ret) - dev_err(va_dev, - "%s: lpass audio hw enable failed\n", - __func__); - } - if (!ret) - if (bolero_tx_clk_switch(codec, CLK_SRC_VA_RCG)) - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - if (va_priv->lpi_enable) { - bolero_register_event_listener(codec, true); - va_priv->register_event_listener = true; - } - break; - case SND_SOC_DAPM_POST_PMD: - if (va_priv->register_event_listener) { - va_priv->register_event_listener = false; - bolero_register_event_listener(codec, false); - } - if (bolero_tx_clk_switch(codec, CLK_SRC_TX_RCG)) - dev_dbg(va_dev, "%s: clock switch failed\n",__func__); - if (va_priv->lpass_audio_hw_vote) - clk_disable_unprepare(va_priv->lpass_audio_hw_vote); - break; - default: - dev_err(va_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int va_macro_tx_swr_clk_event_v2(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (SND_SOC_DAPM_EVENT_ON(event)) - ++va_priv->tx_swr_clk_cnt; - if (SND_SOC_DAPM_EVENT_OFF(event)) - --va_priv->tx_swr_clk_cnt; - - return 0; -} - -static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int clk_src = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - TX_CORE_CLK, - true); - if (!ret) - va_priv->tx_clk_status++; - - if (va_priv->lpi_enable) - ret = va_macro_mclk_enable(va_priv, 1, true); - else - ret = bolero_tx_mclk_enable(codec, 1); - break; - case SND_SOC_DAPM_POST_PMD: - if (va_priv->lpi_enable) { - if (va_priv->version == BOLERO_VERSION_2_1) { - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_TX_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, - "%s: clock switch failed\n", - __func__); - } - } else if (bolero_tx_clk_switch(codec, - CLK_SRC_TX_RCG)) { - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - } - va_macro_mclk_enable(va_priv, 0, true); - } else { - bolero_tx_mclk_enable(codec, 0); - } - - if (va_priv->tx_clk_status > 0) { - bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - TX_CORE_CLK, - false); - va_priv->tx_clk_status--; - } - break; - default: - dev_err(va_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int va_macro_tx_va_mclk_enable(struct va_macro_priv *va_priv, - struct regmap *regmap, int clk_type, - bool enable) -{ - int ret = 0, clk_tx_ret = 0; - - dev_dbg(va_priv->dev, - "%s: clock type %s, enable: %s tx_mclk_users: %d\n", - __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"), - (enable ? "enable" : "disable"), va_priv->va_mclk_users); - - if (enable) { - if (va_priv->swr_clk_users == 0) - msm_cdc_pinctrl_select_active_state( - va_priv->va_swr_gpio_p); - clk_tx_ret = bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - true); - if (clk_type == TX_MCLK) { - ret = bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - true); - if (ret < 0) { - if (va_priv->swr_clk_users == 0) - msm_cdc_pinctrl_select_sleep_state( - va_priv->va_swr_gpio_p); - dev_err_ratelimited(va_priv->dev, - "%s: swr request clk failed\n", - __func__); - goto done; - } - bolero_clk_rsc_fs_gen_request(va_priv->dev, - true); - } - if (clk_type == VA_MCLK) { - ret = va_macro_mclk_enable(va_priv, 1, true); - if (ret < 0) { - if (va_priv->swr_clk_users == 0) - msm_cdc_pinctrl_select_sleep_state( - va_priv->va_swr_gpio_p); - dev_err_ratelimited(va_priv->dev, - "%s: request clock enable failed\n", - __func__); - goto done; - } - } - if (va_priv->swr_clk_users == 0) { - dev_dbg(va_priv->dev, "%s: reset_swr: %d\n", - __func__, va_priv->reset_swr); - if (va_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - if (va_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x00); - va_priv->reset_swr = false; - } - if (!clk_tx_ret) - ret = bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - va_priv->swr_clk_users++; - } else { - if (va_priv->swr_clk_users <= 0) { - dev_err_ratelimited(va_priv->dev, - "va swrm clock users already 0\n"); - va_priv->swr_clk_users = 0; - return 0; - } - clk_tx_ret = bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - true); - va_priv->swr_clk_users--; - if (va_priv->swr_clk_users == 0) - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - if (clk_type == VA_MCLK) - va_macro_mclk_enable(va_priv, 0, true); - if (clk_type == TX_MCLK) { - bolero_clk_rsc_fs_gen_request(va_priv->dev, - false); - ret = bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - if (ret < 0) { - dev_err_ratelimited(va_priv->dev, - "%s: swr request clk failed\n", - __func__); - goto done; - } - } - if (!clk_tx_ret) - ret = bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - if (va_priv->swr_clk_users == 0) - msm_cdc_pinctrl_select_sleep_state( - va_priv->va_swr_gpio_p); - } - return 0; - -done: - if (!clk_tx_ret) - bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - return ret; -} - -static int va_macro_core_vote(void *handle, bool enable) -{ - struct va_macro_priv *va_priv = (struct va_macro_priv *) handle; - - if (va_priv == NULL) { - pr_err("%s: va priv data is NULL\n", __func__); - return -EINVAL; - } - if (enable) { - pm_runtime_get_sync(va_priv->dev); - pm_runtime_put_autosuspend(va_priv->dev); - pm_runtime_mark_last_busy(va_priv->dev); - } - - if (bolero_check_core_votes(va_priv->dev)) - return 0; - else - return -EINVAL; -} - -static int va_macro_swrm_clock(void *handle, bool enable) -{ - struct va_macro_priv *va_priv = (struct va_macro_priv *) handle; - struct regmap *regmap = dev_get_regmap(va_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(va_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&va_priv->swr_clk_lock); - dev_dbg(va_priv->dev, - "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n", - __func__, (enable ? "enable" : "disable"), - va_priv->tx_swr_clk_cnt, va_priv->va_swr_clk_cnt); - - if (enable) { - pm_runtime_get_sync(va_priv->dev); - if (va_priv->va_swr_clk_cnt && !va_priv->tx_swr_clk_cnt) { - ret = va_macro_tx_va_mclk_enable(va_priv, regmap, - VA_MCLK, enable); - if (ret) { - pm_runtime_mark_last_busy(va_priv->dev); - pm_runtime_put_autosuspend(va_priv->dev); - goto done; - } - va_priv->va_clk_status++; - } else { - ret = va_macro_tx_va_mclk_enable(va_priv, regmap, - TX_MCLK, enable); - if (ret) { - pm_runtime_mark_last_busy(va_priv->dev); - pm_runtime_put_autosuspend(va_priv->dev); - goto done; - } - va_priv->tx_clk_status++; - } - pm_runtime_mark_last_busy(va_priv->dev); - pm_runtime_put_autosuspend(va_priv->dev); - } else { - if (va_priv->va_clk_status && !va_priv->tx_clk_status) { - ret = va_macro_tx_va_mclk_enable(va_priv, regmap, - VA_MCLK, enable); - if (ret) - goto done; - --va_priv->va_clk_status; - } else if (!va_priv->va_clk_status && va_priv->tx_clk_status) { - ret = va_macro_tx_va_mclk_enable(va_priv, regmap, - TX_MCLK, enable); - if (ret) - goto done; - --va_priv->tx_clk_status; - } else if (va_priv->va_clk_status && va_priv->tx_clk_status) { - if (!va_priv->va_swr_clk_cnt && va_priv->tx_swr_clk_cnt) { - ret = va_macro_tx_va_mclk_enable(va_priv, regmap, - VA_MCLK, enable); - if (ret) - goto done; - --va_priv->va_clk_status; - } else { - ret = va_macro_tx_va_mclk_enable(va_priv, regmap, - TX_MCLK, enable); - if (ret) - goto done; - --va_priv->tx_clk_status; - } - - } else { - dev_dbg(va_priv->dev, - "%s: Both clocks are disabled\n", __func__); - } - } - dev_dbg(va_priv->dev, - "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n", - __func__, va_priv->swr_clk_users, va_priv->tx_clk_status, - va_priv->va_clk_status); -done: - mutex_unlock(&va_priv->swr_clk_lock); - return ret; -} - -static int is_amic_enabled(struct snd_soc_codec *codec, int decimator) -{ - u16 adc_mux_reg = 0, adc_reg = 0; - u16 adc_n = BOLERO_ADC_MAX; - bool ret = false; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return ret; - adc_mux_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1 + - VA_MACRO_ADC_MUX_CFG_OFFSET * decimator; - if (snd_soc_read(codec, adc_mux_reg) & SWR_MIC) { - if (va_priv->version == BOLERO_VERSION_2_1) - return true; - adc_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0 + - VA_MACRO_ADC_MUX_CFG_OFFSET * decimator; - adc_n = snd_soc_read(codec, adc_reg) & - VA_MACRO_SWR_MIC_MUX_SEL_MASK; - if (adc_n < BOLERO_ADC_MAX) - return true; - } - - return ret; -} - -static void va_macro_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work; - struct hpf_work *hpf_work; - struct va_macro_priv *va_priv; - struct snd_soc_codec *codec; - u16 dec_cfg_reg, hpf_gate_reg; - u8 hpf_cut_off_freq; - u16 adc_reg = 0, adc_n = 0; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - va_priv = hpf_work->va_priv; - codec = va_priv->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = BOLERO_CDC_VA_TX0_TX_PATH_CFG0 + - VA_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - hpf_gate_reg = BOLERO_CDC_VA_TX0_TX_PATH_SEC2 + - VA_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - - dev_dbg(va_priv->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - if (is_amic_enabled(codec, hpf_work->decimator)) { - adc_reg = BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0 + - VA_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator; - adc_n = snd_soc_read(codec, adc_reg) & - VA_MACRO_SWR_MIC_MUX_SEL_MASK; - /* analog mic clear TX hold */ - bolero_clear_amic_tx_hold(codec->dev, adc_n); - snd_soc_update_bits(codec, - dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x03, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x03, 0x01); - } else { - snd_soc_update_bits(codec, - dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x00); - } -} - -static void va_macro_mute_update_callback(struct work_struct *work) -{ - struct va_mute_work *va_mute_dwork; - struct snd_soc_codec *codec = NULL; - struct va_macro_priv *va_priv; - struct delayed_work *delayed_work; - u16 tx_vol_ctl_reg, decimator; - - delayed_work = to_delayed_work(work); - va_mute_dwork = container_of(delayed_work, struct va_mute_work, dwork); - va_priv = va_mute_dwork->va_priv; - codec = va_priv->codec; - decimator = va_mute_dwork->decimator; - - tx_vol_ctl_reg = - BOLERO_CDC_VA_TX0_TX_PATH_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - dev_dbg(va_priv->dev, "%s: decimator %u unmute\n", - __func__, decimator); -} - -static int va_macro_put_dec_enum(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - u16 mic_sel_reg, dmic_clk_reg; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - val = ucontrol->value.enumerated.item[0]; - if (val > e->items - 1) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - switch (e->reg) { - case BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX0_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX1_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX2_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX3_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX4_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX5_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX6_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX7_TX_PATH_CFG0; - break; - default: - dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n", - __func__, e->reg); - return -EINVAL; - } - if (strnstr(widget->name, "SMIC", strlen(widget->name))) { - if (val != 0) { - if (val < 5) { - snd_soc_update_bits(codec, - mic_sel_reg, - 1 << 7, 0x0 << 7); - } else { - snd_soc_update_bits(codec, - mic_sel_reg, - 1 << 7, 0x1 << 7); - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - 0x80, 0x00); - dmic_clk_reg = - BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL + - ((val - 5)/2) * 4; - snd_soc_update_bits(codec, - dmic_clk_reg, - 0x0E, va_priv->dmic_clk_div << 0x1); - } - } - } else { - /* DMIC selected */ - if (val != 0) - snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, 1 << 7); - } - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int va_macro_lpi_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = va_priv->lpi_enable; - - return 0; -} - -static int va_macro_lpi_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - va_priv->lpi_enable = ucontrol->value.integer.value[0]; - - return 0; -} - -static int va_macro_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (test_bit(dec_id, &va_priv->active_ch_mask[dai_id])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int va_macro_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (enable) { - set_bit(dec_id, &va_priv->active_ch_mask[dai_id]); - va_priv->active_ch_cnt[dai_id]++; - } else { - clear_bit(dec_id, &va_priv->active_ch_mask[dai_id]); - va_priv->active_ch_cnt[dai_id]--; - } - - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} - -static int va_macro_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - unsigned int dmic = 0; - int ret = 0; - char *wname; - - wname = strpbrk(w->name, "01234567"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: event %d DMIC%d\n", - __func__, event, dmic); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - bolero_dmic_clk_enable(codec, dmic, DMIC_VA, true); - break; - case SND_SOC_DAPM_POST_PMD: - bolero_dmic_clk_enable(codec, dmic, DMIC_VA, false); - break; - } - - return 0; -} - -static int va_macro_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - unsigned int decimator; - u16 tx_vol_ctl_reg, dec_cfg_reg, hpf_gate_reg; - u16 tx_gain_ctl_reg; - u8 hpf_cut_off_freq; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int hpf_delay = BOLERO_CDC_VA_TX_DMIC_HPF_DELAY_MS; - int unmute_delay = BOLERO_CDC_VA_TX_DMIC_UNMUTE_DELAY_MS; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - decimator = w->shift; - - dev_dbg(va_dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = BOLERO_CDC_VA_TX0_TX_PATH_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - hpf_gate_reg = BOLERO_CDC_VA_TX0_TX_PATH_SEC2 + - VA_MACRO_TX_PATH_OFFSET * decimator; - dec_cfg_reg = BOLERO_CDC_VA_TX0_TX_PATH_CFG0 + - VA_MACRO_TX_PATH_OFFSET * decimator; - tx_gain_ctl_reg = BOLERO_CDC_VA_TX0_TX_VOL_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, - dec_cfg_reg, 0x06, va_priv->dec_mode[decimator] << - VA_MACRO_ADC_MODE_CFG0_SHIFT); - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, - tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - /* Enable TX CLK */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x20); - if (!(is_amic_enabled(codec, decimator) < BOLERO_ADC_MAX)) { - snd_soc_update_bits(codec, - hpf_gate_reg, 0x01, 0x00); - /* - * Minimum 1 clk cycle delay is required as per HW spec - */ - usleep_range(1000, 1010); - } - hpf_cut_off_freq = (snd_soc_read( - codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - va_priv->va_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - if (is_amic_enabled(codec, decimator)) { - hpf_delay = BOLERO_CDC_VA_TX_AMIC_HPF_DELAY_MS; - unmute_delay = BOLERO_CDC_VA_TX_AMIC_UNMUTE_DELAY_MS; - if (va_tx_unmute_delay < unmute_delay) - va_tx_unmute_delay = unmute_delay; - } - snd_soc_update_bits(codec, - hpf_gate_reg, 0x03, 0x02); - if (!is_amic_enabled(codec, decimator)) - snd_soc_update_bits(codec, - hpf_gate_reg, 0x03, 0x00); - /* - * Minimum 1 clk cycle delay is required as per HW spec - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, - hpf_gate_reg, 0x03, 0x01); - /* - * 6ms delay is required as per HW spec - */ - usleep_range(6000, 6010); - /* schedule work queue to Remove Mute */ - queue_delayed_work(system_freezable_wq, - &va_priv->va_mute_dwork[decimator].dwork, - msecs_to_jiffies(va_tx_unmute_delay)); - if (va_priv->va_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) - queue_delayed_work(system_freezable_wq, - &va_priv->va_hpf_work[decimator].dwork, - msecs_to_jiffies(hpf_delay)); - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, tx_gain_ctl_reg)); - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - va_priv->va_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &va_priv->va_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, - dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - if (is_amic_enabled(codec, decimator)) - snd_soc_update_bits(codec, - hpf_gate_reg, - 0x03, 0x02); - else - snd_soc_update_bits(codec, - hpf_gate_reg, - 0x03, 0x03); - /* - * Minimum 1 clk cycle delay is required - * as per HW spec - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x03, 0x01); - } - } - cancel_delayed_work_sync( - &va_priv->va_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - /* Disable TX CLK */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x00); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - break; - } - return 0; -} - -static int va_macro_enable_tx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int ret = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (va_priv->tx_clk_status > 0) { - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - TX_CORE_CLK, - false); - va_priv->tx_clk_status--; - } - break; - case SND_SOC_DAPM_PRE_PMD: - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - TX_CORE_CLK, - true); - if (!ret) - va_priv->tx_clk_status++; - break; - default: - dev_err(va_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - break; - } - - return ret; -} - -static int va_macro_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int ret = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (!va_priv->micb_supply) { - dev_err(va_dev, - "%s:regulator not provided in dtsi\n", __func__); - return -EINVAL; - } - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (va_priv->micb_users++ > 0) - return 0; - ret = regulator_set_voltage(va_priv->micb_supply, - va_priv->micb_voltage, - va_priv->micb_voltage); - if (ret) { - dev_err(va_dev, "%s: Setting voltage failed, err = %d\n", - __func__, ret); - return ret; - } - ret = regulator_set_load(va_priv->micb_supply, - va_priv->micb_current); - if (ret) { - dev_err(va_dev, "%s: Setting current failed, err = %d\n", - __func__, ret); - return ret; - } - ret = regulator_enable(va_priv->micb_supply); - if (ret) { - dev_err(va_dev, "%s: regulator enable failed, err = %d\n", - __func__, ret); - return ret; - } - break; - case SND_SOC_DAPM_POST_PMD: - if (--va_priv->micb_users > 0) - return 0; - if (va_priv->micb_users < 0) { - va_priv->micb_users = 0; - dev_dbg(va_dev, "%s: regulator already disabled\n", - __func__); - return 0; - } - ret = regulator_disable(va_priv->micb_supply); - if (ret) { - dev_err(va_dev, "%s: regulator disable failed, err = %d\n", - __func__, ret); - return ret; - } - regulator_set_voltage(va_priv->micb_supply, 0, - va_priv->micb_voltage); - regulator_set_load(va_priv->micb_supply, 0); - break; - } - return 0; -} - -static inline int va_macro_path_get(const char *wname, - unsigned int *path_num) -{ - int ret = 0; - char *widget_name = NULL; - char *w_name = NULL; - char *path_num_char = NULL; - char *path_name = NULL; - - widget_name = kstrndup(wname, 10, GFP_KERNEL); - if (!widget_name) - return -EINVAL; - - w_name = widget_name; - - path_name = strsep(&widget_name, " "); - if (!path_name) { - pr_err("%s: Invalid widget name = %s\n", - __func__, widget_name); - ret = -EINVAL; - goto err; - } - path_num_char = strpbrk(path_name, "01234567"); - if (!path_num_char) { - pr_err("%s: va path index not found\n", - __func__); - ret = -EINVAL; - goto err; - } - ret = kstrtouint(path_num_char, 10, path_num); - if (ret < 0) - pr_err("%s: Invalid tx path = %s\n", - __func__, w_name); - -err: - kfree(w_name); - return ret; -} - -static int va_macro_dec_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct va_macro_priv *priv = NULL; - struct device *va_dev = NULL; - int ret = 0; - int path = 0; - - if (!va_macro_get_data(codec, &va_dev, &priv, __func__)) - return -EINVAL; - - ret = va_macro_path_get(kcontrol->id.name, &path); - if (ret) - return ret; - - ucontrol->value.integer.value[0] = priv->dec_mode[path]; - - return 0; -} - -static int va_macro_dec_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct va_macro_priv *priv = NULL; - struct device *va_dev = NULL; - int value = ucontrol->value.integer.value[0]; - int ret = 0; - int path = 0; - - if (!va_macro_get_data(codec, &va_dev, &priv, __func__)) - return -EINVAL; - - ret = va_macro_path_get(kcontrol->id.name, &path); - if (ret) - return ret; - - priv->dec_mode[path] = value; - - return 0; -} - -static int va_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - int tx_fs_rate = -EINVAL; - struct snd_soc_codec *codec = dai->codec; - u32 decimator, sample_rate; - u16 tx_fs_reg = 0; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - sample_rate = params_rate(params); - switch (sample_rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - case 384000: - tx_fs_rate = 7; - break; - default: - dev_err(va_dev, "%s: Invalid TX sample rate: %d\n", - __func__, params_rate(params)); - return -EINVAL; - } - for_each_set_bit(decimator, &va_priv->active_ch_mask[dai->id], - VA_MACRO_DEC_MAX) { - if (decimator >= 0) { - tx_fs_reg = BOLERO_CDC_VA_TX0_TX_PATH_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - dev_dbg(va_dev, "%s: set DEC%u rate to %u\n", - __func__, decimator, sample_rate); - snd_soc_update_bits(codec, tx_fs_reg, 0x0F, - tx_fs_rate); - } else { - dev_err(va_dev, - "%s: ERROR: Invalid decimator: %d\n", - __func__, decimator); - return -EINVAL; - } - } - return 0; -} - -static int va_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case VA_MACRO_AIF1_CAP: - case VA_MACRO_AIF2_CAP: - case VA_MACRO_AIF3_CAP: - *tx_slot = va_priv->active_ch_mask[dai->id]; - *tx_num = va_priv->active_ch_cnt[dai->id]; - break; - default: - dev_err(va_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static struct snd_soc_dai_ops va_macro_dai_ops = { - .hw_params = va_macro_hw_params, - .get_channel_map = va_macro_get_channel_map, -}; - -static struct snd_soc_dai_driver va_macro_dai[] = { - { - .name = "va_macro_tx1", - .id = VA_MACRO_AIF1_CAP, - .capture = { - .stream_name = "VA_AIF1 Capture", - .rates = VA_MACRO_RATES, - .formats = VA_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &va_macro_dai_ops, - }, - { - .name = "va_macro_tx2", - .id = VA_MACRO_AIF2_CAP, - .capture = { - .stream_name = "VA_AIF2 Capture", - .rates = VA_MACRO_RATES, - .formats = VA_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &va_macro_dai_ops, - }, - { - .name = "va_macro_tx3", - .id = VA_MACRO_AIF3_CAP, - .capture = { - .stream_name = "VA_AIF3 Capture", - .rates = VA_MACRO_RATES, - .formats = VA_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &va_macro_dai_ops, - }, -}; - -#define STRING(name) #name -#define VA_MACRO_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define VA_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define VA_MACRO_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -static const char * const adc_mux_text[] = { - "MSM_DMIC", "SWR_MIC" -}; - -VA_MACRO_DAPM_ENUM(va_dec0, BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec1, BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec2, BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec3, BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec4, BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec5, BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec6, BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec7, BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1, - 0, adc_mux_text); - -static const char * const dmic_mux_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", - "DMIC4", "DMIC5", "DMIC6", "DMIC7" -}; - -VA_MACRO_DAPM_ENUM_EXT(va_dmic0, BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic1, BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic2, BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic3, BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic4, BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic5, BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic6, BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic7, BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -static const char * const smic_mux_text[] = { - "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", - "SWR_DMIC0", "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", - "SWR_DMIC4", "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7" -}; - -VA_MACRO_DAPM_ENUM_EXT(va_smic0, BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic1, BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic2, BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic3, BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic4, BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic5, BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic6, BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic7, BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -static const char * const smic_mux_text_v2[] = { - "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3", - "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7", - "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11" -}; - -VA_MACRO_DAPM_ENUM_EXT(va_smic0_v2, BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic1_v2, BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic2_v3, BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic3_v3, BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0, - 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -static const struct snd_kcontrol_new va_aif1_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, VA_MACRO_DEC4, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, VA_MACRO_DEC5, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, VA_MACRO_DEC6, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, VA_MACRO_DEC7, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif2_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, VA_MACRO_DEC4, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, VA_MACRO_DEC5, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, VA_MACRO_DEC6, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, VA_MACRO_DEC7, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif3_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, VA_MACRO_DEC4, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, VA_MACRO_DEC5, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, VA_MACRO_DEC6, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, VA_MACRO_DEC7, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif1_cap_mixer_v2[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif2_cap_mixer_v2[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif3_cap_mixer_v2[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif1_cap_mixer_v3[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif2_cap_mixer_v3[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif3_cap_mixer_v3[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets_common[] = { - SND_SOC_DAPM_AIF_OUT_E("VA_AIF1 CAP", "VA_AIF1 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF1_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_AIF_OUT_E("VA_AIF2 CAP", "VA_AIF2 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF2_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_AIF_OUT_E("VA_AIF3 CAP", "VA_AIF3 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF3_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - VA_MACRO_DAPM_MUX("VA DMIC MUX0", 0, va_dmic0), - VA_MACRO_DAPM_MUX("VA DMIC MUX1", 0, va_dmic1), - - VA_MACRO_DAPM_MUX("VA SMIC MUX0", 0, va_smic0_v2), - VA_MACRO_DAPM_MUX("VA SMIC MUX1", 0, va_smic1_v2), - - SND_SOC_DAPM_INPUT("VA SWR_MIC0"), - SND_SOC_DAPM_INPUT("VA SWR_MIC1"), - SND_SOC_DAPM_INPUT("VA SWR_MIC2"), - SND_SOC_DAPM_INPUT("VA SWR_MIC3"), - SND_SOC_DAPM_INPUT("VA SWR_MIC4"), - SND_SOC_DAPM_INPUT("VA SWR_MIC5"), - SND_SOC_DAPM_INPUT("VA SWR_MIC6"), - SND_SOC_DAPM_INPUT("VA SWR_MIC7"), - SND_SOC_DAPM_INPUT("VA SWR_MIC8"), - SND_SOC_DAPM_INPUT("VA SWR_MIC9"), - SND_SOC_DAPM_INPUT("VA SWR_MIC10"), - SND_SOC_DAPM_INPUT("VA SWR_MIC11"), - - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0, - va_macro_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC0", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC1", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC2", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC3", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC4", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC5", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC6", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC7", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC0 MUX", SND_SOC_NOPM, VA_MACRO_DEC0, 0, - &va_dec0_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC1 MUX", SND_SOC_NOPM, VA_MACRO_DEC1, 0, - &va_dec1_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_MCLK", -1, SND_SOC_NOPM, 0, 0, - va_macro_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v2[] = { - SND_SOC_DAPM_MIXER("VA_AIF1_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF1_CAP, 0, - va_aif1_cap_mixer_v2, ARRAY_SIZE(va_aif1_cap_mixer_v2)), - - SND_SOC_DAPM_MIXER("VA_AIF2_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF2_CAP, 0, - va_aif2_cap_mixer_v2, ARRAY_SIZE(va_aif2_cap_mixer_v2)), - - SND_SOC_DAPM_MIXER("VA_AIF3_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF3_CAP, 0, - va_aif3_cap_mixer_v2, ARRAY_SIZE(va_aif3_cap_mixer_v2)), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, - va_macro_swr_pwr_event_v2, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - va_macro_tx_swr_clk_event_v2, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - va_macro_swr_clk_event_v2, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v3[] = { - SND_SOC_DAPM_MIXER("VA_AIF1_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF1_CAP, 0, - va_aif1_cap_mixer_v3, ARRAY_SIZE(va_aif1_cap_mixer_v3)), - - SND_SOC_DAPM_MIXER("VA_AIF2_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF2_CAP, 0, - va_aif2_cap_mixer_v3, ARRAY_SIZE(va_aif2_cap_mixer_v3)), - - SND_SOC_DAPM_MIXER("VA_AIF3_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF3_CAP, 0, - va_aif3_cap_mixer_v3, ARRAY_SIZE(va_aif3_cap_mixer_v3)), - - VA_MACRO_DAPM_MUX("VA DMIC MUX2", 0, va_dmic2), - VA_MACRO_DAPM_MUX("VA DMIC MUX3", 0, va_dmic3), - - VA_MACRO_DAPM_MUX("VA SMIC MUX2", 0, va_smic2_v3), - VA_MACRO_DAPM_MUX("VA SMIC MUX3", 0, va_smic3_v3), - - SND_SOC_DAPM_MUX_E("VA DEC2 MUX", SND_SOC_NOPM, VA_MACRO_DEC2, 0, - &va_dec2_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC3 MUX", SND_SOC_NOPM, VA_MACRO_DEC3, 0, - &va_dec3_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, - va_macro_swr_pwr_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_OUT_E("VA_AIF1 CAP", "VA_AIF1 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF1_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_AIF_OUT_E("VA_AIF2 CAP", "VA_AIF2 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF2_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_AIF_OUT_E("VA_AIF3 CAP", "VA_AIF3 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF3_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_MIXER("VA_AIF1_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF1_CAP, 0, - va_aif1_cap_mixer, ARRAY_SIZE(va_aif1_cap_mixer)), - - SND_SOC_DAPM_MIXER("VA_AIF2_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF2_CAP, 0, - va_aif2_cap_mixer, ARRAY_SIZE(va_aif2_cap_mixer)), - - SND_SOC_DAPM_MIXER("VA_AIF3_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF3_CAP, 0, - va_aif3_cap_mixer, ARRAY_SIZE(va_aif3_cap_mixer)), - - VA_MACRO_DAPM_MUX("VA DMIC MUX0", 0, va_dmic0), - VA_MACRO_DAPM_MUX("VA DMIC MUX1", 0, va_dmic1), - VA_MACRO_DAPM_MUX("VA DMIC MUX2", 0, va_dmic2), - VA_MACRO_DAPM_MUX("VA DMIC MUX3", 0, va_dmic3), - VA_MACRO_DAPM_MUX("VA DMIC MUX4", 0, va_dmic4), - VA_MACRO_DAPM_MUX("VA DMIC MUX5", 0, va_dmic5), - VA_MACRO_DAPM_MUX("VA DMIC MUX6", 0, va_dmic6), - VA_MACRO_DAPM_MUX("VA DMIC MUX7", 0, va_dmic7), - - VA_MACRO_DAPM_MUX("VA SMIC MUX0", 0, va_smic0), - VA_MACRO_DAPM_MUX("VA SMIC MUX1", 0, va_smic1), - VA_MACRO_DAPM_MUX("VA SMIC MUX2", 0, va_smic2), - VA_MACRO_DAPM_MUX("VA SMIC MUX3", 0, va_smic3), - VA_MACRO_DAPM_MUX("VA SMIC MUX4", 0, va_smic4), - VA_MACRO_DAPM_MUX("VA SMIC MUX5", 0, va_smic5), - VA_MACRO_DAPM_MUX("VA SMIC MUX6", 0, va_smic6), - VA_MACRO_DAPM_MUX("VA SMIC MUX7", 0, va_smic7), - - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0, - va_macro_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC0", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC1", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC2", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC3", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC4", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC5", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC6", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC7", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("VA SWR_ADC0"), - SND_SOC_DAPM_INPUT("VA SWR_ADC1"), - SND_SOC_DAPM_INPUT("VA SWR_ADC2"), - SND_SOC_DAPM_INPUT("VA SWR_ADC3"), - SND_SOC_DAPM_INPUT("VA SWR_MIC0"), - SND_SOC_DAPM_INPUT("VA SWR_MIC1"), - SND_SOC_DAPM_INPUT("VA SWR_MIC2"), - SND_SOC_DAPM_INPUT("VA SWR_MIC3"), - SND_SOC_DAPM_INPUT("VA SWR_MIC4"), - SND_SOC_DAPM_INPUT("VA SWR_MIC5"), - SND_SOC_DAPM_INPUT("VA SWR_MIC6"), - SND_SOC_DAPM_INPUT("VA SWR_MIC7"), - - SND_SOC_DAPM_MUX_E("VA DEC0 MUX", SND_SOC_NOPM, VA_MACRO_DEC0, 0, - &va_dec0_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC1 MUX", SND_SOC_NOPM, VA_MACRO_DEC1, 0, - &va_dec1_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC2 MUX", SND_SOC_NOPM, VA_MACRO_DEC2, 0, - &va_dec2_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v2[] = { - SND_SOC_DAPM_MIXER("VA_AIF1_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF1_CAP, 0, - va_aif1_cap_mixer_v2, ARRAY_SIZE(va_aif1_cap_mixer_v2)), - - SND_SOC_DAPM_MIXER("VA_AIF2_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF2_CAP, 0, - va_aif2_cap_mixer_v2, ARRAY_SIZE(va_aif2_cap_mixer_v2)), - - SND_SOC_DAPM_MIXER("VA_AIF3_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF3_CAP, 0, - va_aif3_cap_mixer_v2, ARRAY_SIZE(va_aif3_cap_mixer_v2)), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, - va_macro_swr_pwr_event_v2, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, - va_macro_tx_swr_clk_event_v2, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v3[] = { - SND_SOC_DAPM_MIXER("VA_AIF1_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF1_CAP, 0, - va_aif1_cap_mixer_v3, ARRAY_SIZE(va_aif1_cap_mixer_v3)), - - SND_SOC_DAPM_MIXER("VA_AIF2_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF2_CAP, 0, - va_aif2_cap_mixer_v3, ARRAY_SIZE(va_aif2_cap_mixer_v3)), - - SND_SOC_DAPM_MIXER("VA_AIF3_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF3_CAP, 0, - va_aif3_cap_mixer_v3, ARRAY_SIZE(va_aif3_cap_mixer_v3)), - - VA_MACRO_DAPM_MUX("VA DMIC MUX2", 0, va_dmic2), - VA_MACRO_DAPM_MUX("VA DMIC MUX3", 0, va_dmic3), - - VA_MACRO_DAPM_MUX("VA SMIC MUX2", 0, va_smic2_v3), - VA_MACRO_DAPM_MUX("VA SMIC MUX3", 0, va_smic3_v3), - - SND_SOC_DAPM_MUX_E("VA DEC2 MUX", SND_SOC_NOPM, VA_MACRO_DEC2, 0, - &va_dec2_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC3 MUX", SND_SOC_NOPM, VA_MACRO_DEC3, 0, - &va_dec3_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, - va_macro_swr_pwr_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_OUT_E("VA_AIF1 CAP", "VA_AIF1 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF1_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_AIF_OUT_E("VA_AIF2 CAP", "VA_AIF2 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF2_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_AIF_OUT_E("VA_AIF3 CAP", "VA_AIF3 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF3_CAP, 0, - va_macro_enable_tx, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_MIXER("VA_AIF1_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF1_CAP, 0, - va_aif1_cap_mixer, ARRAY_SIZE(va_aif1_cap_mixer)), - - SND_SOC_DAPM_MIXER("VA_AIF2_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF2_CAP, 0, - va_aif2_cap_mixer, ARRAY_SIZE(va_aif2_cap_mixer)), - - SND_SOC_DAPM_MIXER("VA_AIF3_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF3_CAP, 0, - va_aif3_cap_mixer, ARRAY_SIZE(va_aif3_cap_mixer)), - - VA_MACRO_DAPM_MUX("VA DMIC MUX0", 0, va_dmic0), - VA_MACRO_DAPM_MUX("VA DMIC MUX1", 0, va_dmic1), - VA_MACRO_DAPM_MUX("VA DMIC MUX2", 0, va_dmic2), - VA_MACRO_DAPM_MUX("VA DMIC MUX3", 0, va_dmic3), - VA_MACRO_DAPM_MUX("VA DMIC MUX4", 0, va_dmic4), - VA_MACRO_DAPM_MUX("VA DMIC MUX5", 0, va_dmic5), - VA_MACRO_DAPM_MUX("VA DMIC MUX6", 0, va_dmic6), - VA_MACRO_DAPM_MUX("VA DMIC MUX7", 0, va_dmic7), - - VA_MACRO_DAPM_MUX("VA SMIC MUX0", 0, va_smic0), - VA_MACRO_DAPM_MUX("VA SMIC MUX1", 0, va_smic1), - VA_MACRO_DAPM_MUX("VA SMIC MUX2", 0, va_smic2), - VA_MACRO_DAPM_MUX("VA SMIC MUX3", 0, va_smic3), - VA_MACRO_DAPM_MUX("VA SMIC MUX4", 0, va_smic4), - VA_MACRO_DAPM_MUX("VA SMIC MUX5", 0, va_smic5), - VA_MACRO_DAPM_MUX("VA SMIC MUX6", 0, va_smic6), - VA_MACRO_DAPM_MUX("VA SMIC MUX7", 0, va_smic7), - - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0, - va_macro_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC0", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC1", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC2", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC3", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC4", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC5", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC6", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC7", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("VA SWR_ADC0"), - SND_SOC_DAPM_INPUT("VA SWR_ADC1"), - SND_SOC_DAPM_INPUT("VA SWR_ADC2"), - SND_SOC_DAPM_INPUT("VA SWR_ADC3"), - SND_SOC_DAPM_INPUT("VA SWR_MIC0"), - SND_SOC_DAPM_INPUT("VA SWR_MIC1"), - SND_SOC_DAPM_INPUT("VA SWR_MIC2"), - SND_SOC_DAPM_INPUT("VA SWR_MIC3"), - SND_SOC_DAPM_INPUT("VA SWR_MIC4"), - SND_SOC_DAPM_INPUT("VA SWR_MIC5"), - SND_SOC_DAPM_INPUT("VA SWR_MIC6"), - SND_SOC_DAPM_INPUT("VA SWR_MIC7"), - - SND_SOC_DAPM_MUX_E("VA DEC0 MUX", SND_SOC_NOPM, VA_MACRO_DEC0, 0, - &va_dec0_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC1 MUX", SND_SOC_NOPM, VA_MACRO_DEC1, 0, - &va_dec1_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC2 MUX", SND_SOC_NOPM, VA_MACRO_DEC2, 0, - &va_dec2_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC3 MUX", SND_SOC_NOPM, VA_MACRO_DEC3, 0, - &va_dec3_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC4 MUX", SND_SOC_NOPM, VA_MACRO_DEC4, 0, - &va_dec4_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC5 MUX", SND_SOC_NOPM, VA_MACRO_DEC5, 0, - &va_dec5_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC6 MUX", SND_SOC_NOPM, VA_MACRO_DEC6, 0, - &va_dec6_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC7 MUX", SND_SOC_NOPM, VA_MACRO_DEC7, 0, - &va_dec7_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, - va_macro_swr_pwr_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_MCLK", -1, SND_SOC_NOPM, 0, 0, - va_macro_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget va_macro_wod_dapm_widgets[] = { - SND_SOC_DAPM_SUPPLY_S("VA_MCLK", -1, SND_SOC_NOPM, 0, 0, - va_macro_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route va_audio_map_common[] = { - {"VA_AIF1 CAP", NULL, "VA_MCLK"}, - {"VA_AIF2 CAP", NULL, "VA_MCLK"}, - {"VA_AIF3 CAP", NULL, "VA_MCLK"}, - - {"VA_AIF1 CAP", NULL, "VA_AIF1_CAP Mixer"}, - {"VA_AIF2 CAP", NULL, "VA_AIF2_CAP Mixer"}, - {"VA_AIF3 CAP", NULL, "VA_AIF3_CAP Mixer"}, - - {"VA_AIF1_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - - {"VA_AIF2_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - - {"VA_AIF3_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - - {"VA DEC0 MUX", "MSM_DMIC", "VA DMIC MUX0"}, - {"VA DMIC MUX0", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX0", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX0", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX0", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX0", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX0", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX0", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX0", "DMIC7", "VA DMIC7"}, - - {"VA DEC0 MUX", "SWR_MIC", "VA SMIC MUX0"}, - {"VA SMIC MUX0", "SWR_MIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX0", "SWR_MIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX0", "SWR_MIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX0", "SWR_MIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX0", "SWR_MIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX0", "SWR_MIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX0", "SWR_MIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX0", "SWR_MIC7", "VA SWR_MIC7"}, - {"VA SMIC MUX0", "SWR_MIC8", "VA SWR_MIC8"}, - {"VA SMIC MUX0", "SWR_MIC9", "VA SWR_MIC9"}, - {"VA SMIC MUX0", "SWR_MIC10", "VA SWR_MIC10"}, - {"VA SMIC MUX0", "SWR_MIC11", "VA SWR_MIC11"}, - - {"VA DEC1 MUX", "MSM_DMIC", "VA DMIC MUX1"}, - {"VA DMIC MUX1", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX1", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX1", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX1", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX1", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX1", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX1", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX1", "DMIC7", "VA DMIC7"}, - - {"VA DEC1 MUX", "SWR_MIC", "VA SMIC MUX1"}, - {"VA SMIC MUX1", "SWR_MIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX1", "SWR_MIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX1", "SWR_MIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX1", "SWR_MIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX1", "SWR_MIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX1", "SWR_MIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX1", "SWR_MIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX1", "SWR_MIC7", "VA SWR_MIC7"}, - {"VA SMIC MUX1", "SWR_MIC8", "VA SWR_MIC8"}, - {"VA SMIC MUX1", "SWR_MIC9", "VA SWR_MIC9"}, - {"VA SMIC MUX1", "SWR_MIC10", "VA SWR_MIC10"}, - {"VA SMIC MUX1", "SWR_MIC11", "VA SWR_MIC11"}, - - {"VA SWR_MIC0", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC1", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC2", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC3", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC4", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC5", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC6", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC7", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC8", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC9", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC10", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC11", NULL, "VA_SWR_PWR"}, - -}; - -static const struct snd_soc_dapm_route va_audio_map_v3[] = { - {"VA_AIF1_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - - {"VA_AIF2_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - - {"VA_AIF3_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - - {"VA DEC2 MUX", "MSM_DMIC", "VA DMIC MUX2"}, - {"VA DMIC MUX2", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX2", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX2", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX2", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX2", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX2", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX2", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX2", "DMIC7", "VA DMIC7"}, - - {"VA DEC2 MUX", "SWR_MIC", "VA SMIC MUX2"}, - {"VA SMIC MUX2", "SWR_MIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX2", "SWR_MIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX2", "SWR_MIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX2", "SWR_MIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX2", "SWR_MIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX2", "SWR_MIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX2", "SWR_MIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX2", "SWR_MIC7", "VA SWR_MIC7"}, - {"VA SMIC MUX2", "SWR_MIC8", "VA SWR_MIC8"}, - {"VA SMIC MUX2", "SWR_MIC9", "VA SWR_MIC9"}, - {"VA SMIC MUX2", "SWR_MIC10", "VA SWR_MIC10"}, - {"VA SMIC MUX2", "SWR_MIC11", "VA SWR_MIC11"}, - - {"VA DEC3 MUX", "MSM_DMIC", "VA DMIC MUX3"}, - {"VA DMIC MUX3", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX3", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX3", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX3", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX3", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX3", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX3", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX3", "DMIC7", "VA DMIC7"}, - - {"VA DEC3 MUX", "SWR_MIC", "VA SMIC MUX3"}, - {"VA SMIC MUX3", "SWR_MIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX3", "SWR_MIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX3", "SWR_MIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX3", "SWR_MIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX3", "SWR_MIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX3", "SWR_MIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX3", "SWR_MIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX3", "SWR_MIC7", "VA SWR_MIC7"}, - {"VA SMIC MUX3", "SWR_MIC8", "VA SWR_MIC8"}, - {"VA SMIC MUX3", "SWR_MIC9", "VA SWR_MIC9"}, - {"VA SMIC MUX3", "SWR_MIC10", "VA SWR_MIC10"}, - {"VA SMIC MUX3", "SWR_MIC11", "VA SWR_MIC11"}, -}; - -static const struct snd_soc_dapm_route va_audio_map_v2[] = { - {"VA_AIF1 CAP", NULL, "VA_SWR_CLK"}, - {"VA_AIF2 CAP", NULL, "VA_SWR_CLK"}, - {"VA_AIF3 CAP", NULL, "VA_SWR_CLK"}, -}; - -static const struct snd_soc_dapm_route va_audio_map[] = { - {"VA_AIF1 CAP", NULL, "VA_MCLK"}, - {"VA_AIF2 CAP", NULL, "VA_MCLK"}, - {"VA_AIF3 CAP", NULL, "VA_MCLK"}, - - {"VA_AIF1 CAP", NULL, "VA_AIF1_CAP Mixer"}, - {"VA_AIF2 CAP", NULL, "VA_AIF2_CAP Mixer"}, - {"VA_AIF3 CAP", NULL, "VA_AIF3_CAP Mixer"}, - - {"VA_AIF1_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC4", "VA DEC4 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC5", "VA DEC5 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC6", "VA DEC6 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC7", "VA DEC7 MUX"}, - - {"VA_AIF2_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC4", "VA DEC4 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC5", "VA DEC5 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC6", "VA DEC6 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC7", "VA DEC7 MUX"}, - - {"VA_AIF3_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC4", "VA DEC4 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC5", "VA DEC5 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC6", "VA DEC6 MUX"}, - {"VA_AIF3_CAP Mixer", "DEC7", "VA DEC7 MUX"}, - - {"VA DEC0 MUX", "MSM_DMIC", "VA DMIC MUX0"}, - {"VA DMIC MUX0", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX0", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX0", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX0", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX0", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX0", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX0", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX0", "DMIC7", "VA DMIC7"}, - - {"VA DEC0 MUX", "SWR_MIC", "VA SMIC MUX0"}, - {"VA SMIC MUX0", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX0", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX0", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX0", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX0", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX0", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX0", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX0", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX0", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX0", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX0", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX0", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC1 MUX", "MSM_DMIC", "VA DMIC MUX1"}, - {"VA DMIC MUX1", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX1", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX1", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX1", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX1", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX1", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX1", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX1", "DMIC7", "VA DMIC7"}, - - {"VA DEC1 MUX", "SWR_MIC", "VA SMIC MUX1"}, - {"VA SMIC MUX1", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX1", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX1", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX1", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX1", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX1", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX1", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX1", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX1", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX1", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX1", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX1", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC2 MUX", "MSM_DMIC", "VA DMIC MUX2"}, - {"VA DMIC MUX2", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX2", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX2", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX2", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX2", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX2", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX2", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX2", "DMIC7", "VA DMIC7"}, - - {"VA DEC2 MUX", "SWR_MIC", "VA SMIC MUX2"}, - {"VA SMIC MUX2", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX2", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX2", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX2", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX2", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX2", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX2", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX2", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX2", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX2", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX2", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX2", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC3 MUX", "MSM_DMIC", "VA DMIC MUX3"}, - {"VA DMIC MUX3", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX3", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX3", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX3", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX3", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX3", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX3", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX3", "DMIC7", "VA DMIC7"}, - - {"VA DEC3 MUX", "SWR_MIC", "VA SMIC MUX3"}, - {"VA SMIC MUX3", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX3", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX3", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX3", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX3", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX3", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX3", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX3", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX3", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX3", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX3", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX3", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC4 MUX", "MSM_DMIC", "VA DMIC MUX4"}, - {"VA DMIC MUX4", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX4", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX4", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX4", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX4", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX4", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX4", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX4", "DMIC7", "VA DMIC7"}, - - {"VA DEC4 MUX", "SWR_MIC", "VA SMIC MUX4"}, - {"VA SMIC MUX4", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX4", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX4", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX4", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX4", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX4", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX4", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX4", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX4", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX4", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX4", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX4", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC5 MUX", "MSM_DMIC", "VA DMIC MUX5"}, - {"VA DMIC MUX5", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX5", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX5", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX5", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX5", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX5", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX5", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX5", "DMIC7", "VA DMIC7"}, - - {"VA DEC5 MUX", "SWR_MIC", "VA SMIC MUX5"}, - {"VA SMIC MUX5", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX5", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX5", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX5", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX5", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX5", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX5", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX5", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX5", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX5", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX5", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX5", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC6 MUX", "MSM_DMIC", "VA DMIC MUX6"}, - {"VA DMIC MUX6", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX6", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX6", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX6", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX6", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX6", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX6", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX6", "DMIC7", "VA DMIC7"}, - - {"VA DEC6 MUX", "SWR_MIC", "VA SMIC MUX6"}, - {"VA SMIC MUX6", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX6", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX6", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX6", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX6", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX6", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX6", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX6", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX6", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX6", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX6", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX6", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC7 MUX", "MSM_DMIC", "VA DMIC MUX7"}, - {"VA DMIC MUX7", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX7", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX7", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX7", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX7", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX7", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX7", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX7", "DMIC7", "VA DMIC7"}, - - {"VA DEC7 MUX", "SWR_MIC", "VA SMIC MUX7"}, - {"VA SMIC MUX7", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX7", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX7", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX7", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX7", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX7", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX7", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX7", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX7", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX7", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX7", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX7", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA SWR_ADC0", NULL, "VA_SWR_PWR"}, - {"VA SWR_ADC1", NULL, "VA_SWR_PWR"}, - {"VA SWR_ADC2", NULL, "VA_SWR_PWR"}, - {"VA SWR_ADC3", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC0", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC1", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC2", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC3", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC4", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC5", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC6", NULL, "VA_SWR_PWR"}, - {"VA SWR_MIC7", NULL, "VA_SWR_PWR"}, -}; - -static const char * const dec_mode_mux_text[] = { - "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF", -}; - -static const struct soc_enum dec_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dec_mode_mux_text), - dec_mode_mux_text); - -static const struct snd_kcontrol_new va_macro_snd_controls[] = { - SOC_SINGLE_SX_TLV("VA_DEC0 Volume", - BOLERO_CDC_VA_TX0_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC1 Volume", - BOLERO_CDC_VA_TX1_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC2 Volume", - BOLERO_CDC_VA_TX2_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC3 Volume", - BOLERO_CDC_VA_TX3_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC4 Volume", - BOLERO_CDC_VA_TX4_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC5 Volume", - BOLERO_CDC_VA_TX5_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC6 Volume", - BOLERO_CDC_VA_TX6_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC7 Volume", - BOLERO_CDC_VA_TX7_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_EXT("LPI Enable", 0, 0, 1, 0, - va_macro_lpi_get, va_macro_lpi_put), - - SOC_ENUM_EXT("VA_DEC0 MODE", dec_mode_mux_enum, - va_macro_dec_mode_get, va_macro_dec_mode_put), - - SOC_ENUM_EXT("VA_DEC1 MODE", dec_mode_mux_enum, - va_macro_dec_mode_get, va_macro_dec_mode_put), - - SOC_ENUM_EXT("VA_DEC2 MODE", dec_mode_mux_enum, - va_macro_dec_mode_get, va_macro_dec_mode_put), - - SOC_ENUM_EXT("VA_DEC3 MODE", dec_mode_mux_enum, - va_macro_dec_mode_get, va_macro_dec_mode_put), -}; - -static const struct snd_kcontrol_new va_macro_snd_controls_common[] = { - SOC_SINGLE_SX_TLV("VA_DEC0 Volume", - BOLERO_CDC_VA_TX0_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC1 Volume", - BOLERO_CDC_VA_TX1_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_EXT("LPI Enable", 0, 0, 1, 0, - va_macro_lpi_get, va_macro_lpi_put), -}; - -static const struct snd_kcontrol_new va_macro_snd_controls_v3[] = { - SOC_SINGLE_SX_TLV("VA_DEC2 Volume", - BOLERO_CDC_VA_TX2_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC3 Volume", - BOLERO_CDC_VA_TX3_TX_VOL_CTL, - 0, -84, 40, digital_gain), -}; - -static int va_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, - struct va_macro_priv *va_priv) -{ - u32 div_factor; - u32 mclk_rate = VA_MACRO_MCLK_FREQ; - - if (dmic_sample_rate == VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) - goto undefined_rate; - - div_factor = mclk_rate / dmic_sample_rate; - - switch (div_factor) { - case 2: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_2; - break; - case 3: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_3; - break; - case 4: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_4; - break; - case 6: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_6; - break; - case 8: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_8; - break; - case 16: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_16; - break; - default: - /* Any other DIV factor is invalid */ - goto undefined_rate; - } - - /* Valid dmic DIV factors */ - dev_dbg(va_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - - return dmic_sample_rate; - -undefined_rate: - dev_dbg(va_priv->dev, "%s: Invalid rate %d, for mclk %d\n", - __func__, dmic_sample_rate, mclk_rate); - dmic_sample_rate = VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED; - - return dmic_sample_rate; -} - -static int va_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret, i; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - va_dev = bolero_get_device_ptr(codec->dev, VA_MACRO); - if (!va_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - va_priv = dev_get_drvdata(va_dev); - if (!va_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - - va_priv->lpi_enable = false; - va_priv->register_event_listener = false; - - if (va_priv->va_without_decimation) { - ret = snd_soc_dapm_new_controls(dapm, va_macro_wod_dapm_widgets, - ARRAY_SIZE(va_macro_wod_dapm_widgets)); - if (ret < 0) { - dev_err(va_dev, - "%s: Failed to add without dec controls\n", - __func__); - return ret; - } - va_priv->codec = codec; - return 0; - } - - va_priv->version = bolero_get_version(va_dev); - if (va_priv->version >= BOLERO_VERSION_2_0) { - ret = snd_soc_dapm_new_controls(dapm, - va_macro_dapm_widgets_common, - ARRAY_SIZE(va_macro_dapm_widgets_common)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add controls\n", - __func__); - return ret; - } - if (va_priv->version == BOLERO_VERSION_2_1) - ret = snd_soc_dapm_new_controls(dapm, - va_macro_dapm_widgets_v2, - ARRAY_SIZE(va_macro_dapm_widgets_v2)); - else if (va_priv->version == BOLERO_VERSION_2_0) - ret = snd_soc_dapm_new_controls(dapm, - va_macro_dapm_widgets_v3, - ARRAY_SIZE(va_macro_dapm_widgets_v3)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add controls\n", - __func__); - return ret; - } - } else { - ret = snd_soc_dapm_new_controls(dapm, va_macro_dapm_widgets, - ARRAY_SIZE(va_macro_dapm_widgets)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add controls\n", - __func__); - return ret; - } - } - - if (va_priv->version >= BOLERO_VERSION_2_0) { - ret = snd_soc_dapm_add_routes(dapm, - va_audio_map_common, - ARRAY_SIZE(va_audio_map_common)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add routes\n", - __func__); - return ret; - } - if (va_priv->version == BOLERO_VERSION_2_0) { - ret = snd_soc_dapm_add_routes(dapm, - va_audio_map_v3, - ARRAY_SIZE(va_audio_map_v3)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add routes\n", - __func__); - return ret; - } - } - if (va_priv->version == BOLERO_VERSION_2_1) { - ret = snd_soc_dapm_add_routes(dapm, - va_audio_map_v2, - ARRAY_SIZE(va_audio_map_v2)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add routes\n", - __func__); - return ret; - } - } - } else { - ret = snd_soc_dapm_add_routes(dapm, va_audio_map, - ARRAY_SIZE(va_audio_map)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add routes\n", - __func__); - return ret; - } - } - - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add widgets\n", __func__); - return ret; - } - if (va_priv->version >= BOLERO_VERSION_2_0) { - ret = snd_soc_add_codec_controls(codec, - va_macro_snd_controls_common, - ARRAY_SIZE(va_macro_snd_controls_common)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add snd_ctls\n", - __func__); - return ret; - } - if (va_priv->version == BOLERO_VERSION_2_0) - ret = snd_soc_add_codec_controls(codec, - va_macro_snd_controls_v3, - ARRAY_SIZE(va_macro_snd_controls_v3)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add snd_ctls\n", - __func__); - return ret; - } - } else { - ret = snd_soc_add_codec_controls(codec, - va_macro_snd_controls, - ARRAY_SIZE(va_macro_snd_controls)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add snd_ctls\n", - __func__); - return ret; - } - } - - snd_soc_dapm_ignore_suspend(dapm, "VA_AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "VA_AIF2 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "VA_AIF3 Capture"); - if (va_priv->version >= BOLERO_VERSION_2_0) { - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC0"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC1"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC2"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC3"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC4"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC5"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC6"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC7"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC8"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC9"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC10"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC11"); - } else { - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC0"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC1"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC2"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC3"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC0"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC1"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC2"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC3"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC4"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC5"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC6"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC7"); - } - snd_soc_dapm_sync(dapm); - - for (i = 0; i < VA_MACRO_NUM_DECIMATORS; i++) { - va_priv->va_hpf_work[i].va_priv = va_priv; - va_priv->va_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&va_priv->va_hpf_work[i].dwork, - va_macro_tx_hpf_corner_freq_callback); - } - - for (i = 0; i < VA_MACRO_NUM_DECIMATORS; i++) { - va_priv->va_mute_dwork[i].va_priv = va_priv; - va_priv->va_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&va_priv->va_mute_dwork[i].dwork, - va_macro_mute_update_callback); - } - va_priv->codec = codec; - - if (va_priv->version == BOLERO_VERSION_2_1) { - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL0, 0xEE, 0xCC); - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL1, 0xEE, 0xCC); - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_SWR_MIC_CTL2, 0xEE, 0xCC); - } - - return 0; -} - -static int va_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - va_priv->codec = NULL; - return 0; -} - -static void va_macro_add_child_devices(struct work_struct *work) -{ - struct va_macro_priv *va_priv = NULL; - struct platform_device *pdev = NULL; - struct device_node *node = NULL; - struct va_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL; - int ret = 0; - u16 count = 0, ctrl_num = 0; - struct va_macro_swr_ctrl_platform_data *platdata = NULL; - char plat_dev_name[VA_MACRO_SWR_STRING_LEN] = ""; - bool va_swr_master_node = false; - - va_priv = container_of(work, struct va_macro_priv, - va_macro_add_child_devices_work); - if (!va_priv) { - pr_err("%s: Memory for va_priv does not exist\n", - __func__); - return; - } - - if (!va_priv->dev) { - pr_err("%s: VA dev does not exist\n", __func__); - return; - } - - if (!va_priv->dev->of_node) { - dev_err(va_priv->dev, - "%s: DT node for va_priv does not exist\n", __func__); - return; - } - - platdata = &va_priv->swr_plat_data; - va_priv->child_count = 0; - - for_each_available_child_of_node(va_priv->dev->of_node, node) { - va_swr_master_node = false; - if (strnstr(node->name, "va_swr_master", - strlen("va_swr_master")) != NULL) - va_swr_master_node = true; - - if (va_swr_master_node) - strlcpy(plat_dev_name, "va_swr_ctrl", - (VA_MACRO_SWR_STRING_LEN - 1)); - else - strlcpy(plat_dev_name, node->name, - (VA_MACRO_SWR_STRING_LEN - 1)); - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(va_priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = va_priv->dev; - pdev->dev.of_node = node; - - if (va_swr_master_node) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (va_swr_master_node) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct va_macro_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - ret = -ENOMEM; - goto fail_pdev_add; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].va_swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - va_priv->swr_ctrl_data = swr_ctrl_data; - } - if (va_priv->child_count < VA_MACRO_CHILD_DEVICES_MAX) - va_priv->pdev_child_devices[ - va_priv->child_count++] = pdev; - else - goto err; - } - return; -fail_pdev_add: - for (count = 0; count < va_priv->child_count; count++) - platform_device_put(va_priv->pdev_child_devices[count]); -err: - return; -} - -static int va_macro_set_port_map(struct snd_soc_codec *codec, - u32 usecase, u32 size, void *data) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - struct swrm_port_config port_cfg; - int ret = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - memset(&port_cfg, 0, sizeof(port_cfg)); - port_cfg.uc = usecase; - port_cfg.size = size; - port_cfg.params = data; - - if (va_priv->swr_ctrl_data) - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_SET_PORT_MAP, &port_cfg); - - return ret; -} - -static int va_macro_reg_wake_irq(struct snd_soc_codec *codec, - u32 data) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - u32 ipc_wakeup = data; - int ret = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (va_priv->swr_ctrl_data) - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REGISTER_WAKE_IRQ, &ipc_wakeup); - - return ret; -} - -static void va_macro_init_ops(struct macro_ops *ops, - char __iomem *va_io_base, - bool va_without_decimation) -{ - memset(ops, 0, sizeof(struct macro_ops)); - if (!va_without_decimation) { - ops->dai_ptr = va_macro_dai; - ops->num_dais = ARRAY_SIZE(va_macro_dai); - } else { - ops->dai_ptr = NULL; - ops->num_dais = 0; - } - ops->init = va_macro_init; - ops->exit = va_macro_deinit; - ops->io_base = va_io_base; - ops->event_handler = va_macro_event_handler; - ops->set_port_map = va_macro_set_port_map; - ops->reg_wake_irq = va_macro_reg_wake_irq; - ops->clk_div_get = va_macro_clk_div_get; -} - -static int va_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops; - struct va_macro_priv *va_priv; - u32 va_base_addr, sample_rate = 0; - char __iomem *va_io_base; - bool va_without_decimation = false; - const char *micb_supply_str = "va-vdd-micb-supply"; - const char *micb_supply_str1 = "va-vdd-micb"; - const char *micb_voltage_str = "qcom,va-vdd-micb-voltage"; - const char *micb_current_str = "qcom,va-vdd-micb-current"; - int ret = 0; - const char *dmic_sample_rate = "qcom,va-dmic-sample-rate"; - u32 default_clk_id = 0; - struct clk *lpass_audio_hw_vote = NULL; - u32 is_used_va_swr_gpio = 0; - const char *is_used_va_swr_gpio_dt = "qcom,is-used-swr-gpio"; - - va_priv = devm_kzalloc(&pdev->dev, sizeof(struct va_macro_priv), - GFP_KERNEL); - if (!va_priv) - return -ENOMEM; - - va_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &va_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - va_without_decimation = of_property_read_bool(pdev->dev.parent->of_node, - "qcom,va-without-decimation"); - - va_priv->va_without_decimation = va_without_decimation; - ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate, - &sample_rate); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %d entry in dt\n", - __func__, sample_rate); - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_2; - } else { - if (va_macro_validate_dmic_sample_rate( - sample_rate, va_priv) == VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED) - return -EINVAL; - } - - if (of_find_property(pdev->dev.of_node, is_used_va_swr_gpio_dt, - NULL)) { - ret = of_property_read_u32(pdev->dev.of_node, - is_used_va_swr_gpio_dt, - &is_used_va_swr_gpio); - if (ret) { - dev_err(&pdev->dev, "%s: error reading %s in dt\n", - __func__, is_used_va_swr_gpio_dt); - is_used_va_swr_gpio = 0; - } - } - va_priv->va_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,va-swr-gpios", 0); - if (!va_priv->va_swr_gpio_p && is_used_va_swr_gpio) { - dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n", - __func__); - return -EINVAL; - } - if ((msm_cdc_pinctrl_get_state(va_priv->va_swr_gpio_p) < 0) && - is_used_va_swr_gpio) { - dev_err(&pdev->dev, "%s: failed to get swr pin state\n", - __func__); - return -EPROBE_DEFER; - } - - va_io_base = devm_ioremap(&pdev->dev, va_base_addr, - VA_MACRO_MAX_OFFSET); - if (!va_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -EINVAL; - } - va_priv->va_io_base = va_io_base; - - lpass_audio_hw_vote = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote"); - if (IS_ERR(lpass_audio_hw_vote)) { - ret = PTR_ERR(lpass_audio_hw_vote); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_audio_hw_vote", ret); - lpass_audio_hw_vote = NULL; - ret = 0; - } - va_priv->lpass_audio_hw_vote = lpass_audio_hw_vote; - - if (of_parse_phandle(pdev->dev.of_node, micb_supply_str, 0)) { - va_priv->micb_supply = devm_regulator_get(&pdev->dev, - micb_supply_str1); - if (IS_ERR(va_priv->micb_supply)) { - ret = PTR_ERR(va_priv->micb_supply); - dev_err(&pdev->dev, - "%s:Failed to get micbias supply for VA Mic %d\n", - __func__, ret); - return ret; - } - ret = of_property_read_u32(pdev->dev.of_node, - micb_voltage_str, - &va_priv->micb_voltage); - if (ret) { - dev_err(&pdev->dev, - "%s:Looking up %s property in node %s failed\n", - __func__, micb_voltage_str, - pdev->dev.of_node->full_name); - return ret; - } - ret = of_property_read_u32(pdev->dev.of_node, - micb_current_str, - &va_priv->micb_current); - if (ret) { - dev_err(&pdev->dev, - "%s:Looking up %s property in node %s failed\n", - __func__, micb_current_str, - pdev->dev.of_node->full_name); - return ret; - } - } - ret = of_property_read_u32(pdev->dev.of_node, "qcom,default-clk-id", - &default_clk_id); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "qcom,default-clk-id"); - default_clk_id = VA_CORE_CLK; - } - va_priv->clk_id = VA_CORE_CLK; - va_priv->default_clk_id = default_clk_id; - - if (is_used_va_swr_gpio) { - va_priv->reset_swr = true; - INIT_WORK(&va_priv->va_macro_add_child_devices_work, - va_macro_add_child_devices); - va_priv->swr_plat_data.handle = (void *) va_priv; - va_priv->swr_plat_data.read = NULL; - va_priv->swr_plat_data.write = NULL; - va_priv->swr_plat_data.bulk_write = NULL; - va_priv->swr_plat_data.clk = va_macro_swrm_clock; - va_priv->swr_plat_data.core_vote = va_macro_core_vote; - va_priv->swr_plat_data.handle_irq = NULL; - mutex_init(&va_priv->swr_clk_lock); - } - va_priv->is_used_va_swr_gpio = is_used_va_swr_gpio; - - mutex_init(&va_priv->mclk_lock); - dev_set_drvdata(&pdev->dev, va_priv); - va_macro_init_ops(&ops, va_io_base, va_without_decimation); - ops.clk_id_req = va_priv->default_clk_id; - ops.default_clk_id = va_priv->default_clk_id; - ret = bolero_register_macro(&pdev->dev, VA_MACRO, &ops); - if (ret < 0) { - dev_err(&pdev->dev, "%s: register macro failed\n", __func__); - goto reg_macro_fail; - } - if (is_used_va_swr_gpio) - schedule_work(&va_priv->va_macro_add_child_devices_work); - pm_runtime_set_autosuspend_delay(&pdev->dev, VA_AUTO_SUSPEND_DELAY); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - pm_suspend_ignore_children(&pdev->dev, true); - pm_runtime_enable(&pdev->dev); - return ret; - -reg_macro_fail: - mutex_destroy(&va_priv->mclk_lock); - if (is_used_va_swr_gpio) - mutex_destroy(&va_priv->swr_clk_lock); - return ret; -} - -static int va_macro_remove(struct platform_device *pdev) -{ - struct va_macro_priv *va_priv; - int count = 0; - - va_priv = dev_get_drvdata(&pdev->dev); - - if (!va_priv) - return -EINVAL; - if (va_priv->is_used_va_swr_gpio) { - if (va_priv->swr_ctrl_data) - kfree(va_priv->swr_ctrl_data); - for (count = 0; count < va_priv->child_count && - count < VA_MACRO_CHILD_DEVICES_MAX; count++) - platform_device_unregister( - va_priv->pdev_child_devices[count]); - } - - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - bolero_unregister_macro(&pdev->dev, VA_MACRO); - mutex_destroy(&va_priv->mclk_lock); - if (va_priv->is_used_va_swr_gpio) - mutex_destroy(&va_priv->swr_clk_lock); - return 0; -} - - -static const struct of_device_id va_macro_dt_match[] = { - {.compatible = "qcom,va-macro"}, - {} -}; - -static const struct dev_pm_ops bolero_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - pm_runtime_force_suspend, - pm_runtime_force_resume - ) - SET_RUNTIME_PM_OPS( - bolero_runtime_suspend, - bolero_runtime_resume, - NULL - ) -}; - -static struct platform_driver va_macro_driver = { - .driver = { - .name = "va_macro", - .owner = THIS_MODULE, - .pm = &bolero_dev_pm_ops, - .of_match_table = va_macro_dt_match, - .suppress_bind_attrs = true, - }, - .probe = va_macro_probe, - .remove = va_macro_remove, -}; - -module_platform_driver(va_macro_driver); - -MODULE_DESCRIPTION("VA macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.c b/techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.c deleted file mode 100644 index 18f78e2357e9..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.c +++ /dev/null @@ -1,3199 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" -#include "wsa-macro.h" -#include "bolero-clk-rsc.h" - -#define AUTO_SUSPEND_DELAY 50 /* delay in msec */ -#define WSA_MACRO_MAX_OFFSET 0x1000 - -#define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define WSA_MACRO_RX_MIX_RATES (SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define WSA_MACRO_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) - -#define WSA_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_48000) -#define WSA_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define NUM_INTERPOLATORS 2 - -#define WSA_MACRO_MUX_INP_SHFT 0x3 -#define WSA_MACRO_MUX_INP_MASK1 0x07 -#define WSA_MACRO_MUX_INP_MASK2 0x38 -#define WSA_MACRO_MUX_CFG_OFFSET 0x8 -#define WSA_MACRO_MUX_CFG1_OFFSET 0x4 -#define WSA_MACRO_RX_COMP_OFFSET 0x40 -#define WSA_MACRO_RX_SOFTCLIP_OFFSET 0x40 -#define WSA_MACRO_RX_PATH_OFFSET 0x80 -#define WSA_MACRO_RX_PATH_CFG3_OFFSET 0x10 -#define WSA_MACRO_RX_PATH_DSMDEM_OFFSET 0x4C -#define WSA_MACRO_FS_RATE_MASK 0x0F -#define WSA_MACRO_EC_MIX_TX0_MASK 0x03 -#define WSA_MACRO_EC_MIX_TX1_MASK 0x18 - -#define WSA_MACRO_MAX_DMA_CH_PER_PORT 0x2 - -enum { - WSA_MACRO_RX0 = 0, - WSA_MACRO_RX1, - WSA_MACRO_RX_MIX, - WSA_MACRO_RX_MIX0 = WSA_MACRO_RX_MIX, - WSA_MACRO_RX_MIX1, - WSA_MACRO_RX_MAX, -}; - -enum { - WSA_MACRO_TX0 = 0, - WSA_MACRO_TX1, - WSA_MACRO_TX_MAX, -}; - -enum { - WSA_MACRO_EC0_MUX = 0, - WSA_MACRO_EC1_MUX, - WSA_MACRO_EC_MUX_MAX, -}; - -enum { - WSA_MACRO_COMP1, /* SPK_L */ - WSA_MACRO_COMP2, /* SPK_R */ - WSA_MACRO_COMP_MAX -}; - -enum { - WSA_MACRO_SOFTCLIP0, /* RX0 */ - WSA_MACRO_SOFTCLIP1, /* RX1 */ - WSA_MACRO_SOFTCLIP_MAX -}; - -enum { - INTn_1_INP_SEL_ZERO = 0, - INTn_1_INP_SEL_RX0, - INTn_1_INP_SEL_RX1, - INTn_1_INP_SEL_RX2, - INTn_1_INP_SEL_RX3, - INTn_1_INP_SEL_DEC0, - INTn_1_INP_SEL_DEC1, -}; - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_RX2, - INTn_2_INP_SEL_RX3, -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -/* - * Structure used to update codec - * register defaults after reset - */ -struct wsa_macro_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -static struct interp_sample_rate int_prim_sample_rate_val[] = { - {8000, 0x0}, /* 8K */ - {16000, 0x1}, /* 16K */ - {24000, -EINVAL},/* 24K */ - {32000, 0x3}, /* 32K */ - {48000, 0x4}, /* 48K */ - {96000, 0x5}, /* 96K */ - {192000, 0x6}, /* 192K */ - {384000, 0x7}, /* 384K */ - {44100, 0x8}, /* 44.1K */ -}; - -static struct interp_sample_rate int_mix_sample_rate_val[] = { - {48000, 0x4}, /* 48K */ - {96000, 0x5}, /* 96K */ - {192000, 0x6}, /* 192K */ -}; - -#define WSA_MACRO_SWR_STRING_LEN 80 - -static int wsa_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai); -static int wsa_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot); -static int wsa_macro_digital_mute(struct snd_soc_dai *dai, int mute); -/* Hold instance to soundwire platform device */ -struct wsa_macro_swr_ctrl_data { - struct platform_device *wsa_swr_pdev; -}; - -struct wsa_macro_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*core_vote)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -struct wsa_macro_bcl_pmic_params { - u8 id; - u8 sid; - u8 ppid; -}; - -enum { - WSA_MACRO_AIF_INVALID = 0, - WSA_MACRO_AIF1_PB, - WSA_MACRO_AIF_MIX1_PB, - WSA_MACRO_AIF_VI, - WSA_MACRO_AIF_ECHO, - WSA_MACRO_MAX_DAIS, -}; - -#define WSA_MACRO_CHILD_DEVICES_MAX 3 - -/* - * @dev: wsa macro device pointer - * @comp_enabled: compander enable mixer value set - * @ec_hq: echo HQ enable mixer value set - * @prim_int_users: Users of interpolator - * @wsa_mclk_users: WSA MCLK users count - * @swr_clk_users: SWR clk users count - * @vi_feed_value: VI sense mask - * @mclk_lock: to lock mclk operations - * @swr_clk_lock: to lock swr master clock operations - * @swr_ctrl_data: SoundWire data structure - * @swr_plat_data: Soundwire platform data - * @wsa_macro_add_child_devices_work: work for adding child devices - * @wsa_swr_gpio_p: used by pinctrl API - * @codec: codec handle - * @rx_0_count: RX0 interpolation users - * @rx_1_count: RX1 interpolation users - * @active_ch_mask: channel mask for all AIF DAIs - * @active_ch_cnt: channel count of all AIF DAIs - * @rx_port_value: mixer ctl value of WSA RX MUXes - * @wsa_io_base: Base address of WSA macro addr space - */ -struct wsa_macro_priv { - struct device *dev; - int comp_enabled[WSA_MACRO_COMP_MAX]; - int ec_hq[WSA_MACRO_RX1 + 1]; - u16 prim_int_users[WSA_MACRO_RX1 + 1]; - u16 wsa_mclk_users; - u16 swr_clk_users; - bool dapm_mclk_enable; - bool reset_swr; - unsigned int vi_feed_value; - struct mutex mclk_lock; - struct mutex swr_clk_lock; - struct wsa_macro_swr_ctrl_data *swr_ctrl_data; - struct wsa_macro_swr_ctrl_platform_data swr_plat_data; - struct work_struct wsa_macro_add_child_devices_work; - struct device_node *wsa_swr_gpio_p; - struct snd_soc_codec *codec; - int rx_0_count; - int rx_1_count; - unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS]; - int rx_port_value[WSA_MACRO_RX_MAX]; - char __iomem *wsa_io_base; - struct platform_device *pdev_child_devices - [WSA_MACRO_CHILD_DEVICES_MAX]; - int child_count; - int ear_spkr_gain; - int spkr_gain_offset; - int spkr_mode; - int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; - int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; - struct wsa_macro_bcl_pmic_params bcl_pmic_params; - char __iomem *mclk_mode_muxsel; - u16 default_clk_id; - int wsa_digital_mute_status[WSA_MACRO_RX_MAX]; -}; - -static int wsa_macro_config_ear_spkr_gain(struct snd_soc_codec *codec, - struct wsa_macro_priv *wsa_priv, - int event, int gain_reg); -static struct snd_soc_dai_driver wsa_macro_dai[]; -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -static const char *const rx_text[] = { - "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "DEC0", "DEC1" -}; - -static const char *const rx_mix_text[] = { - "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1" -}; - -static const char *const rx_mix_ec_text[] = { - "ZERO", "RX_MIX_TX0", "RX_MIX_TX1" -}; - -static const char *const rx_mux_text[] = { - "ZERO", "AIF1_PB", "AIF_MIX1_PB" -}; - -static const char *const rx_sidetone_mix_text[] = { - "ZERO", "SRC0" -}; - -static const char * const wsa_macro_ear_spkr_pa_gain_text[] = { - "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", - "G_4_DB", "G_5_DB", "G_6_DB" -}; - -static const char * const wsa_macro_speaker_boost_stage_text[] = { - "NO_MAX_STATE", "MAX_STATE_1", "MAX_STATE_2" -}; - -static const char * const wsa_macro_vbat_bcl_gsm_mode_text[] = { - "OFF", "ON" -}; - -static const struct snd_kcontrol_new wsa_int0_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("WSA RX0 VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new wsa_int1_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("WSA RX1 VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_ear_spkr_pa_gain_enum, - wsa_macro_ear_spkr_pa_gain_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_spkr_boost_stage_enum, - wsa_macro_speaker_boost_stage_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_vbat_bcl_gsm_mode_enum, - wsa_macro_vbat_bcl_gsm_mode_text); - -/* RX INT0 */ -static const struct soc_enum rx0_prim_inp0_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, - 0, 7, rx_text); - -static const struct soc_enum rx0_prim_inp1_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, - 3, 7, rx_text); - -static const struct soc_enum rx0_prim_inp2_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, - 3, 7, rx_text); - -static const struct soc_enum rx0_mix_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, - 0, 5, rx_mix_text); - -static const struct soc_enum rx0_sidetone_mix_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text); - -static const struct snd_kcontrol_new rx0_prim_inp0_mux = - SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum); - -static const struct snd_kcontrol_new rx0_prim_inp1_mux = - SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum); - -static const struct snd_kcontrol_new rx0_prim_inp2_mux = - SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum); - -static const struct snd_kcontrol_new rx0_mix_mux = - SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum); - -static const struct snd_kcontrol_new rx0_sidetone_mix_mux = - SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum); - -/* RX INT1 */ -static const struct soc_enum rx1_prim_inp0_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, - 0, 7, rx_text); - -static const struct soc_enum rx1_prim_inp1_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, - 3, 7, rx_text); - -static const struct soc_enum rx1_prim_inp2_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, - 3, 7, rx_text); - -static const struct soc_enum rx1_mix_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, - 0, 5, rx_mix_text); - -static const struct snd_kcontrol_new rx1_prim_inp0_mux = - SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum); - -static const struct snd_kcontrol_new rx1_prim_inp1_mux = - SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum); - -static const struct snd_kcontrol_new rx1_prim_inp2_mux = - SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum); - -static const struct snd_kcontrol_new rx1_mix_mux = - SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum); - -static const struct soc_enum rx_mix_ec0_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, - 0, 3, rx_mix_ec_text); - -static const struct soc_enum rx_mix_ec1_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, - 3, 3, rx_mix_ec_text); - -static const struct snd_kcontrol_new rx_mix_ec0_mux = - SOC_DAPM_ENUM("WSA RX_MIX EC0_Mux", rx_mix_ec0_enum); - -static const struct snd_kcontrol_new rx_mix_ec1_mux = - SOC_DAPM_ENUM("WSA RX_MIX EC1_Mux", rx_mix_ec1_enum); - -static struct snd_soc_dai_ops wsa_macro_dai_ops = { - .hw_params = wsa_macro_hw_params, - .get_channel_map = wsa_macro_get_channel_map, - .digital_mute = wsa_macro_digital_mute, -}; - -static struct snd_soc_dai_driver wsa_macro_dai[] = { - { - .name = "wsa_macro_rx1", - .id = WSA_MACRO_AIF1_PB, - .playback = { - .stream_name = "WSA_AIF1 Playback", - .rates = WSA_MACRO_RX_RATES, - .formats = WSA_MACRO_RX_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &wsa_macro_dai_ops, - }, - { - .name = "wsa_macro_rx_mix", - .id = WSA_MACRO_AIF_MIX1_PB, - .playback = { - .stream_name = "WSA_AIF_MIX1 Playback", - .rates = WSA_MACRO_RX_MIX_RATES, - .formats = WSA_MACRO_RX_FORMATS, - .rate_max = 192000, - .rate_min = 48000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &wsa_macro_dai_ops, - }, - { - .name = "wsa_macro_vifeedback", - .id = WSA_MACRO_AIF_VI, - .capture = { - .stream_name = "WSA_AIF_VI Capture", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, - .formats = WSA_MACRO_RX_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &wsa_macro_dai_ops, - }, - { - .name = "wsa_macro_echo", - .id = WSA_MACRO_AIF_ECHO, - .capture = { - .stream_name = "WSA_AIF_ECHO Capture", - .rates = WSA_MACRO_ECHO_RATES, - .formats = WSA_MACRO_ECHO_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &wsa_macro_dai_ops, - }, -}; - -static const struct wsa_macro_reg_mask_val wsa_macro_spkr_default[] = { - {BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x58}, -}; - -static const struct wsa_macro_reg_mask_val wsa_macro_spkr_mode1[] = { - {BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x80, 0x00}, - {BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x80, 0x00}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x01, 0x00}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x44}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x44}, -}; - -static bool wsa_macro_get_data(struct snd_soc_codec *codec, - struct device **wsa_dev, - struct wsa_macro_priv **wsa_priv, - const char *func_name) -{ - *wsa_dev = bolero_get_device_ptr(codec->dev, WSA_MACRO); - if (!(*wsa_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - *wsa_priv = dev_get_drvdata((*wsa_dev)); - if (!(*wsa_priv) || !(*wsa_priv)->codec) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - return true; -} - -static int wsa_macro_set_port_map(struct snd_soc_codec *codec, - u32 usecase, u32 size, void *data) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - struct swrm_port_config port_cfg; - int ret = 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - memset(&port_cfg, 0, sizeof(port_cfg)); - port_cfg.uc = usecase; - port_cfg.size = size; - port_cfg.params = data; - - if (wsa_priv->swr_ctrl_data) - ret = swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_SET_PORT_MAP, &port_cfg); - - return ret; -} - -/** - * wsa_macro_set_spkr_gain_offset - offset the speaker path - * gain with the given offset value. - * - * @codec: codec instance - * @offset: Indicates speaker path gain offset value. - * - * Returns 0 on success or -EINVAL on error. - */ -int wsa_macro_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return -EINVAL; - } - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->spkr_gain_offset = offset; - return 0; -} -EXPORT_SYMBOL(wsa_macro_set_spkr_gain_offset); - -/** - * wsa_macro_set_spkr_mode - Configures speaker compander and smartboost - * settings based on speaker mode. - * - * @codec: codec instance - * @mode: Indicates speaker configuration mode. - * - * Returns 0 on success or -EINVAL on error. - */ -int wsa_macro_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - int i; - const struct wsa_macro_reg_mask_val *regs; - int size; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return -EINVAL; - } - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (mode) { - case WSA_MACRO_SPKR_MODE_1: - regs = wsa_macro_spkr_mode1; - size = ARRAY_SIZE(wsa_macro_spkr_mode1); - break; - default: - regs = wsa_macro_spkr_default; - size = ARRAY_SIZE(wsa_macro_spkr_default); - break; - } - - wsa_priv->spkr_mode = mode; - for (i = 0; i < size; i++) - snd_soc_update_bits(codec, regs[i].reg, - regs[i].mask, regs[i].val); - return 0; -} -EXPORT_SYMBOL(wsa_macro_set_spkr_mode); - -static int wsa_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai, - u8 int_prim_fs_rate_reg_val, - u32 sample_rate) -{ - u8 int_1_mix1_inp; - u32 j, port; - u16 int_mux_cfg0, int_mux_cfg1; - u16 int_fs_reg; - u8 int_mux_cfg0_val, int_mux_cfg1_val; - u8 inp0_sel, inp1_sel, inp2_sel; - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - for_each_set_bit(port, &wsa_priv->active_ch_mask[dai->id], - WSA_MACRO_RX_MAX) { - int_1_mix1_inp = port; - if ((int_1_mix1_inp < WSA_MACRO_RX0) || - (int_1_mix1_inp > WSA_MACRO_RX_MIX1)) { - dev_err(wsa_dev, - "%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg0 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0; - - /* - * Loop through all interpolator MUX inputs and find out - * to which interpolator input, the cdc_dma rx port - * is connected - */ - for (j = 0; j < NUM_INTERPOLATORS; j++) { - int_mux_cfg1 = int_mux_cfg0 + WSA_MACRO_MUX_CFG1_OFFSET; - - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - inp0_sel = int_mux_cfg0_val & WSA_MACRO_MUX_INP_MASK1; - inp1_sel = (int_mux_cfg0_val >> - WSA_MACRO_MUX_INP_SHFT) & - WSA_MACRO_MUX_INP_MASK1; - inp2_sel = (int_mux_cfg1_val >> - WSA_MACRO_MUX_INP_SHFT) & - WSA_MACRO_MUX_INP_MASK1; - if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || - (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || - (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) { - int_fs_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - WSA_MACRO_RX_PATH_OFFSET * j; - dev_dbg(wsa_dev, - "%s: AIF_PB DAI(%d) connected to INT%u_1\n", - __func__, dai->id, j); - dev_dbg(wsa_dev, - "%s: set INT%u_1 sample rate to %u\n", - __func__, j, sample_rate); - /* sample_rate is in Hz */ - snd_soc_update_bits(codec, int_fs_reg, - WSA_MACRO_FS_RATE_MASK, - int_prim_fs_rate_reg_val); - } - int_mux_cfg0 += WSA_MACRO_MUX_CFG_OFFSET; - } - } - - return 0; -} - -static int wsa_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai, - u8 int_mix_fs_rate_reg_val, - u32 sample_rate) -{ - u8 int_2_inp; - u32 j, port; - u16 int_mux_cfg1, int_fs_reg; - u8 int_mux_cfg1_val; - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - - for_each_set_bit(port, &wsa_priv->active_ch_mask[dai->id], - WSA_MACRO_RX_MAX) { - int_2_inp = port; - if ((int_2_inp < WSA_MACRO_RX0) || - (int_2_inp > WSA_MACRO_RX_MIX1)) { - dev_err(wsa_dev, - "%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg1 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1; - for (j = 0; j < NUM_INTERPOLATORS; j++) { - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) & - WSA_MACRO_MUX_INP_MASK1; - if (int_mux_cfg1_val == int_2_inp + - INTn_2_INP_SEL_RX0) { - int_fs_reg = - BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL + - WSA_MACRO_RX_PATH_OFFSET * j; - - dev_dbg(wsa_dev, - "%s: AIF_PB DAI(%d) connected to INT%u_2\n", - __func__, dai->id, j); - dev_dbg(wsa_dev, - "%s: set INT%u_2 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, - WSA_MACRO_FS_RATE_MASK, - int_mix_fs_rate_reg_val); - } - int_mux_cfg1 += WSA_MACRO_MUX_CFG_OFFSET; - } - } - return 0; -} - -static int wsa_macro_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - int rate_val = 0; - int i, ret; - - /* set mixing path rate */ - for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) { - if (sample_rate == - int_mix_sample_rate_val[i].sample_rate) { - rate_val = - int_mix_sample_rate_val[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || - (rate_val < 0)) - goto prim_rate; - ret = wsa_macro_set_mix_interpolator_rate(dai, - (u8) rate_val, sample_rate); -prim_rate: - /* set primary path sample rate */ - for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) { - if (sample_rate == - int_prim_sample_rate_val[i].sample_rate) { - rate_val = - int_prim_sample_rate_val[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || - (rate_val < 0)) - return -EINVAL; - ret = wsa_macro_set_prim_interpolator_rate(dai, - (u8) rate_val, sample_rate); - return ret; -} - -static int wsa_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct snd_soc_codec *codec = dai->codec; - int ret; - - dev_dbg(codec->dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = wsa_macro_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - dev_err(codec->dev, - "%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - break; - case SNDRV_PCM_STREAM_CAPTURE: - default: - break; - } - return 0; -} - -static int wsa_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - u16 val = 0, mask = 0, cnt = 0, temp = 0;; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv = dev_get_drvdata(wsa_dev); - if (!wsa_priv) - return -EINVAL; - - switch (dai->id) { - case WSA_MACRO_AIF_VI: - *tx_slot = wsa_priv->active_ch_mask[dai->id]; - *tx_num = wsa_priv->active_ch_cnt[dai->id]; - break; - case WSA_MACRO_AIF1_PB: - case WSA_MACRO_AIF_MIX1_PB: - for_each_set_bit(temp, &wsa_priv->active_ch_mask[dai->id], - WSA_MACRO_RX_MAX) { - mask |= (1 << temp); - if (++cnt == WSA_MACRO_MAX_DMA_CH_PER_PORT) - break; - } - if (mask & 0x0C) - mask = mask >> 0x2; - *rx_slot = mask; - *rx_num = cnt; - break; - case WSA_MACRO_AIF_ECHO: - val = snd_soc_read(codec, - BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); - if (val & WSA_MACRO_EC_MIX_TX1_MASK) { - mask |= 0x2; - cnt++; - } - if (val & WSA_MACRO_EC_MIX_TX0_MASK) { - mask |= 0x1; - cnt++; - } - *tx_slot = mask; - *tx_num = cnt; - break; - default: - dev_err(wsa_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static int wsa_macro_digital_mute(struct snd_soc_dai *dai, int mute) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - uint16_t j = 0, reg = 0, mix_reg = 0, dsm_reg = 0; - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - - if (mute) - return 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case WSA_MACRO_AIF1_PB: - case WSA_MACRO_AIF_MIX1_PB: - for (j = 0; j < NUM_INTERPOLATORS; j++) { - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - (j * WSA_MACRO_RX_PATH_OFFSET); - mix_reg = BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL + - (j * WSA_MACRO_RX_PATH_OFFSET); - dsm_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - (j * WSA_MACRO_RX_PATH_OFFSET) + - WSA_MACRO_RX_PATH_DSMDEM_OFFSET; - int_mux_cfg0 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + j * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, - int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, - int_mux_cfg1); - if (snd_soc_read(codec, dsm_reg) & 0x01) { - if (int_mux_cfg0_val || (int_mux_cfg1_val & 0x38)) - snd_soc_update_bits(codec, reg, - 0x20, 0x20); - if (int_mux_cfg1_val & 0x07) { - snd_soc_update_bits(codec, reg, - 0x20, 0x20); - snd_soc_update_bits(codec, - mix_reg, 0x20, 0x20); - } - } - } - bolero_wsa_pa_on(wsa_dev); - break; - default: - break; - } - return 0; -} -static int wsa_macro_mclk_enable(struct wsa_macro_priv *wsa_priv, - bool mclk_enable, bool dapm) -{ - struct regmap *regmap = dev_get_regmap(wsa_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(wsa_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(wsa_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, wsa_priv->wsa_mclk_users); - - mutex_lock(&wsa_priv->mclk_lock); - if (mclk_enable) { - if (wsa_priv->wsa_mclk_users == 0) { - ret = bolero_clk_rsc_request_clock(wsa_priv->dev, - wsa_priv->default_clk_id, - wsa_priv->default_clk_id, - true); - if (ret < 0) { - dev_err_ratelimited(wsa_priv->dev, - "%s: wsa request clock enable failed\n", - __func__); - goto exit; - } - bolero_clk_rsc_fs_gen_request(wsa_priv->dev, - true); - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - WSA_START_OFFSET, - WSA_MAX_OFFSET); - /* 9.6MHz MCLK, set value 0x00 if other frequency */ - regmap_update_bits(regmap, - BOLERO_CDC_WSA_TOP_FREQ_MCLK, 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - } - wsa_priv->wsa_mclk_users++; - } else { - if (wsa_priv->wsa_mclk_users <= 0) { - dev_err(wsa_priv->dev, "%s: clock already disabled\n", - __func__); - wsa_priv->wsa_mclk_users = 0; - goto exit; - } - wsa_priv->wsa_mclk_users--; - if (wsa_priv->wsa_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - bolero_clk_rsc_fs_gen_request(wsa_priv->dev, - false); - - bolero_clk_rsc_request_clock(wsa_priv->dev, - wsa_priv->default_clk_id, - wsa_priv->default_clk_id, - false); - } - } -exit: - mutex_unlock(&wsa_priv->mclk_lock); - return ret; -} - -static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(wsa_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = wsa_macro_mclk_enable(wsa_priv, 1, true); - if (ret) - wsa_priv->dapm_mclk_enable = false; - else - wsa_priv->dapm_mclk_enable = true; - break; - case SND_SOC_DAPM_POST_PMD: - if (wsa_priv->dapm_mclk_enable) - wsa_macro_mclk_enable(wsa_priv, 0, true); - break; - default: - dev_err(wsa_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int wsa_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int ret = 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_SSR_DOWN: - trace_printk("%s, enter SSR down\n", __func__); - if (wsa_priv->swr_ctrl_data) { - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - } - if ((!pm_runtime_enabled(wsa_dev) || - !pm_runtime_suspended(wsa_dev))) { - ret = bolero_runtime_suspend(wsa_dev); - if (!ret) { - pm_runtime_disable(wsa_dev); - pm_runtime_set_suspended(wsa_dev); - pm_runtime_enable(wsa_dev); - } - } - break; - case BOLERO_MACRO_EVT_SSR_UP: - trace_printk("%s, enter SSR up\n", __func__); - /* reset swr after ssr/pdr */ - wsa_priv->reset_swr = true; - /* enable&disable WSA_CORE_CLK to reset GFMUX reg */ - ret = bolero_clk_rsc_request_clock(wsa_priv->dev, - wsa_priv->default_clk_id, - WSA_CORE_CLK, true); - if (ret < 0) - dev_err_ratelimited(wsa_priv->dev, - "%s, failed to enable clk, ret:%d\n", - __func__, ret); - else - bolero_clk_rsc_request_clock(wsa_priv->dev, - wsa_priv->default_clk_id, - WSA_CORE_CLK, false); - if (wsa_priv->swr_ctrl_data) - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - break; - case BOLERO_MACRO_EVT_CLK_RESET: - bolero_rsc_clk_reset(wsa_dev, WSA_CORE_CLK); - break; - } - return 0; -} - -static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - dev_dbg(wsa_dev, "%s: spkr1 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - } - if (test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - dev_dbg(wsa_dev, "%s: spkr2 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - /* Disable V&I sensing */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - dev_dbg(wsa_dev, "%s: spkr1 disabled\n", __func__); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - } - if (test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - /* Disable V&I sensing */ - dev_dbg(wsa_dev, "%s: spkr2 disabled\n", __func__); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - } - break; - } - - return 0; -} - -static int wsa_macro_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg; - int offset_val = 0; - int val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - switch (w->reg) { - case BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL: - gain_reg = BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL; - break; - case BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL: - gain_reg = BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL; - break; - default: - dev_err(codec->dev, "%s: No gain register avail for %s\n", - __func__, w->name); - return 0; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - w->reg, 0x20, 0x00); - break; - } - - return 0; -} - -static void wsa_macro_hd2_control(struct snd_soc_codec *codec, - u16 reg, int event) -{ - u16 hd2_scale_reg; - u16 hd2_enable_reg = 0; - - if (reg == BOLERO_CDC_WSA_RX0_RX_PATH_CTL) { - hd2_scale_reg = BOLERO_CDC_WSA_RX0_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CFG0; - } - if (reg == BOLERO_CDC_WSA_RX1_RX_PATH_CTL) { - hd2_scale_reg = BOLERO_CDC_WSA_RX1_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_WSA_RX1_RX_PATH_CFG0; - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x10); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x01); - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04); - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00); - } -} - -static int wsa_macro_enable_swr(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ch_cnt; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (!(strnstr(w->name, "RX0", sizeof("WSA_RX0"))) && - !wsa_priv->rx_0_count) - wsa_priv->rx_0_count++; - if (!(strnstr(w->name, "RX1", sizeof("WSA_RX1"))) && - !wsa_priv->rx_1_count) - wsa_priv->rx_1_count++; - ch_cnt = wsa_priv->rx_0_count + wsa_priv->rx_1_count; - - if (wsa_priv->swr_ctrl_data) { - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_UP, NULL); - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (!(strnstr(w->name, "RX0", sizeof("WSA_RX0"))) && - wsa_priv->rx_0_count) - wsa_priv->rx_0_count--; - if (!(strnstr(w->name, "RX1", sizeof("WSA_RX1"))) && - wsa_priv->rx_1_count) - wsa_priv->rx_1_count--; - ch_cnt = wsa_priv->rx_0_count + wsa_priv->rx_1_count; - - if (wsa_priv->swr_ctrl_data) - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - break; - } - dev_dbg(wsa_priv->dev, "%s: current swr ch cnt: %d\n", - __func__, wsa_priv->rx_0_count + wsa_priv->rx_1_count); - - return 0; -} - -static int wsa_macro_config_compander(struct snd_soc_codec *codec, - int comp, int event) -{ - u16 comp_ctl0_reg, rx_path_cfg0_reg; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, wsa_priv->comp_enabled[comp]); - - if (!wsa_priv->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = BOLERO_CDC_WSA_COMPANDER0_CTL0 + - (comp * WSA_MACRO_RX_COMP_OFFSET); - rx_path_cfg0_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CFG0 + - (comp * WSA_MACRO_RX_PATH_OFFSET); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -static void wsa_macro_enable_softclip_clk(struct snd_soc_codec *codec, - struct wsa_macro_priv *wsa_priv, - int path, - bool enable) -{ - u16 softclip_clk_reg = BOLERO_CDC_WSA_SOFTCLIP0_CRC + - (path * WSA_MACRO_RX_SOFTCLIP_OFFSET); - u8 softclip_mux_mask = (1 << path); - u8 softclip_mux_value = (1 << path); - - dev_dbg(codec->dev, "%s: path %d, enable %d\n", - __func__, path, enable); - if (enable) { - if (wsa_priv->softclip_clk_users[path] == 0) { - snd_soc_update_bits(codec, - softclip_clk_reg, 0x01, 0x01); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, - softclip_mux_mask, softclip_mux_value); - } - wsa_priv->softclip_clk_users[path]++; - } else { - wsa_priv->softclip_clk_users[path]--; - if (wsa_priv->softclip_clk_users[path] == 0) { - snd_soc_update_bits(codec, - softclip_clk_reg, 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, - softclip_mux_mask, 0x00); - } - } -} - -static int wsa_macro_config_softclip(struct snd_soc_codec *codec, - int path, int event) -{ - u16 softclip_ctrl_reg = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int softclip_path = 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - if (path == WSA_MACRO_COMP1) - softclip_path = WSA_MACRO_SOFTCLIP0; - else if (path == WSA_MACRO_COMP2) - softclip_path = WSA_MACRO_SOFTCLIP1; - - dev_dbg(codec->dev, "%s: event %d path %d, enabled %d\n", - __func__, event, softclip_path, - wsa_priv->is_softclip_on[softclip_path]); - - if (!wsa_priv->is_softclip_on[softclip_path]) - return 0; - - softclip_ctrl_reg = BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL + - (softclip_path * WSA_MACRO_RX_SOFTCLIP_OFFSET); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Softclip clock and mux */ - wsa_macro_enable_softclip_clk(codec, wsa_priv, softclip_path, - true); - /* Enable Softclip control */ - snd_soc_update_bits(codec, softclip_ctrl_reg, 0x01, 0x01); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, softclip_ctrl_reg, 0x01, 0x00); - wsa_macro_enable_softclip_clk(codec, wsa_priv, - softclip_path, false); - } - - return 0; -} - -static bool wsa_macro_adie_lb(struct snd_soc_codec *codec, - int interp_idx) -{ - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - u8 int_n_inp0 = 0, int_n_inp1 = 0, int_n_inp2 = 0; - - int_mux_cfg0 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - - int_n_inp0 = int_mux_cfg0_val & 0x0F; - if (int_n_inp0 == INTn_1_INP_SEL_DEC0 || - int_n_inp0 == INTn_1_INP_SEL_DEC1) - return true; - - int_n_inp1 = int_mux_cfg0_val >> 4; - if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || - int_n_inp1 == INTn_1_INP_SEL_DEC1) - return true; - - int_n_inp2 = int_mux_cfg1_val >> 4; - if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || - int_n_inp2 == INTn_1_INP_SEL_DEC1) - return true; - - return false; -} - -static int wsa_macro_enable_main_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - u16 reg = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - WSA_MACRO_RX_PATH_OFFSET * w->shift; - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (wsa_macro_adie_lb(codec, w->shift)) { - snd_soc_update_bits(codec, - reg, 0x20, 0x20); - bolero_wsa_pa_on(wsa_dev); - } - break; - default: - break; - } - return 0; -} - -static int wsa_macro_interp_get_primary_reg(u16 reg, u16 *ind) -{ - u16 prim_int_reg = 0; - - switch (reg) { - case BOLERO_CDC_WSA_RX0_RX_PATH_CTL: - case BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL: - prim_int_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL; - *ind = 0; - break; - case BOLERO_CDC_WSA_RX1_RX_PATH_CTL: - case BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL: - prim_int_reg = BOLERO_CDC_WSA_RX1_RX_PATH_CTL; - *ind = 1; - break; - } - - return prim_int_reg; -} - -static int wsa_macro_enable_prim_interpolator( - struct snd_soc_codec *codec, - u16 reg, int event) -{ - u16 prim_int_reg; - u16 ind = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - prim_int_reg = wsa_macro_interp_get_primary_reg(reg, &ind); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wsa_priv->prim_int_users[ind]++; - if (wsa_priv->prim_int_users[ind] == 1) { - snd_soc_update_bits(codec, - prim_int_reg + WSA_MACRO_RX_PATH_CFG3_OFFSET, - 0x03, 0x03); - snd_soc_update_bits(codec, prim_int_reg, - 0x10, 0x10); - wsa_macro_hd2_control(codec, prim_int_reg, event); - snd_soc_update_bits(codec, - prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, - 0x1, 0x1); - } - if ((reg != prim_int_reg) && - ((snd_soc_read(codec, prim_int_reg)) & 0x10)) - snd_soc_update_bits(codec, reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - wsa_priv->prim_int_users[ind]--; - if (wsa_priv->prim_int_users[ind] == 0) { - snd_soc_update_bits(codec, prim_int_reg, - 1 << 0x5, 0 << 0x5); - snd_soc_update_bits(codec, - prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, - 0x1, 0x0); - snd_soc_update_bits(codec, prim_int_reg, - 0x40, 0x40); - snd_soc_update_bits(codec, prim_int_reg, - 0x40, 0x00); - wsa_macro_hd2_control(codec, prim_int_reg, event); - } - break; - } - - dev_dbg(codec->dev, "%s: primary interpolator: INT%d, users: %d\n", - __func__, ind, wsa_priv->prim_int_users[ind]); - return 0; -} - -static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg; - u16 reg; - int val; - int offset_val = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (!(strcmp(w->name, "WSA_RX INT0 INTERP"))) { - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL; - gain_reg = BOLERO_CDC_WSA_RX0_RX_VOL_CTL; - } else if (!(strcmp(w->name, "WSA_RX INT1 INTERP"))) { - reg = BOLERO_CDC_WSA_RX1_RX_PATH_CTL; - gain_reg = BOLERO_CDC_WSA_RX1_RX_VOL_CTL; - } else { - dev_err(codec->dev, "%s: Interpolator reg not found\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Reset if needed */ - wsa_macro_enable_prim_interpolator(codec, reg, event); - break; - case SND_SOC_DAPM_POST_PMU: - wsa_macro_config_compander(codec, w->shift, event); - wsa_macro_config_softclip(codec, w->shift, event); - /* apply gain after int clk is enabled */ - if ((wsa_priv->spkr_gain_offset == - WSA_MACRO_GAIN_OFFSET_M1P5_DB) && - (wsa_priv->comp_enabled[WSA_MACRO_COMP1] || - wsa_priv->comp_enabled[WSA_MACRO_COMP2]) && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL || - gain_reg == BOLERO_CDC_WSA_RX1_RX_VOL_CTL)) { - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX0_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX1_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - wsa_macro_config_ear_spkr_gain(codec, wsa_priv, - event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - wsa_macro_config_compander(codec, w->shift, event); - wsa_macro_config_softclip(codec, w->shift, event); - wsa_macro_enable_prim_interpolator(codec, reg, event); - if ((wsa_priv->spkr_gain_offset == - WSA_MACRO_GAIN_OFFSET_M1P5_DB) && - (wsa_priv->comp_enabled[WSA_MACRO_COMP1] || - wsa_priv->comp_enabled[WSA_MACRO_COMP2]) && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL || - gain_reg == BOLERO_CDC_WSA_RX1_RX_VOL_CTL)) { - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX0_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX1_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - wsa_macro_config_ear_spkr_gain(codec, wsa_priv, - event, gain_reg); - break; - } - - return 0; -} - -static int wsa_macro_config_ear_spkr_gain(struct snd_soc_codec *codec, - struct wsa_macro_priv *wsa_priv, - int event, int gain_reg) -{ - int comp_gain_offset, val; - - switch (wsa_priv->spkr_mode) { - /* Compander gain in WSA_MACRO_SPKR_MODE1 case is 12 dB */ - case WSA_MACRO_SPKR_MODE_1: - comp_gain_offset = -12; - break; - /* Default case compander gain is 15 dB */ - default: - comp_gain_offset = -15; - break; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* Apply ear spkr gain only if compander is enabled */ - if (wsa_priv->comp_enabled[WSA_MACRO_COMP1] && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL) && - (wsa_priv->ear_spkr_gain != 0)) { - /* For example, val is -8(-12+5-1) for 4dB of gain */ - val = comp_gain_offset + wsa_priv->ear_spkr_gain - 1; - snd_soc_write(codec, gain_reg, val); - - dev_dbg(wsa_priv->dev, "%s: RX0 Volume %d dB\n", - __func__, val); - } - break; - case SND_SOC_DAPM_POST_PMD: - /* - * Reset RX0 volume to 0 dB if compander is enabled and - * ear_spkr_gain is non-zero. - */ - if (wsa_priv->comp_enabled[WSA_MACRO_COMP1] && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL) && - (wsa_priv->ear_spkr_gain != 0)) { - snd_soc_write(codec, gain_reg, 0x0); - - dev_dbg(wsa_priv->dev, "%s: Reset RX0 Volume to 0 dB\n", - __func__); - } - break; - } - - return 0; -} - -static int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 boost_path_ctl, boost_path_cfg1; - u16 reg, reg_mix; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (!strcmp(w->name, "WSA_RX INT0 CHAIN")) { - boost_path_ctl = BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL; - boost_path_cfg1 = BOLERO_CDC_WSA_RX0_RX_PATH_CFG1; - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL; - reg_mix = BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL; - } else if (!strcmp(w->name, "WSA_RX INT1 CHAIN")) { - boost_path_ctl = BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL; - boost_path_cfg1 = BOLERO_CDC_WSA_RX1_RX_PATH_CFG1; - reg = BOLERO_CDC_WSA_RX1_RX_PATH_CTL; - reg_mix = BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL; - } else { - dev_err(codec->dev, "%s: unknown widget: %s\n", - __func__, w->name); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x01); - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x10); - if ((snd_soc_read(codec, reg_mix)) & 0x10) - snd_soc_update_bits(codec, reg_mix, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, reg, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x00); - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x00); - break; - } - - return 0; -} - - -static int wsa_macro_enable_vbat(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - u16 vbat_path_cfg = 0; - int softclip_path = 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - if (!strcmp(w->name, "WSA_RX INT0 VBAT")) { - vbat_path_cfg = BOLERO_CDC_WSA_RX0_RX_PATH_CFG1; - softclip_path = WSA_MACRO_SOFTCLIP0; - } else if (!strcmp(w->name, "WSA_RX INT1 VBAT")) { - vbat_path_cfg = BOLERO_CDC_WSA_RX1_RX_PATH_CFG1; - softclip_path = WSA_MACRO_SOFTCLIP1; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Enable clock for VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL, 0x10, 0x10); - /* Enable VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, 0x01, 0x01); - /* Update interpolator with 384K path */ - snd_soc_update_bits(codec, vbat_path_cfg, 0x80, 0x80); - /* Use attenuation mode */ - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x02, 0x00); - /* - * BCL block needs softclip clock and mux config to be enabled - */ - wsa_macro_enable_softclip_clk(codec, wsa_priv, softclip_path, - true); - /* Enable VBAT at channel level */ - snd_soc_update_bits(codec, vbat_path_cfg, 0x02, 0x02); - /* Set the ATTK1 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - /* Set the ATTK2 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - /* Set the ATTK3 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, vbat_path_cfg, 0x80, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x02, 0x02); - snd_soc_update_bits(codec, vbat_path_cfg, 0x02, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - wsa_macro_enable_softclip_clk(codec, wsa_priv, softclip_path, - false); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL, 0x10, 0x00); - break; - default: - dev_err(wsa_dev, "%s: Invalid event %d\n", __func__, event); - break; - } - return 0; -} - -static int wsa_macro_enable_echo(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - u16 val, ec_tx = 0, ec_hq_reg; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(wsa_dev, "%s %d %s\n", __func__, event, w->name); - - val = snd_soc_read(codec, BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); - if (!(strcmp(w->name, "WSA RX_MIX EC0_MUX"))) - ec_tx = (val & 0x07) - 1; - else - ec_tx = ((val & 0x38) >> 0x3) - 1; - - if (ec_tx < 0 || ec_tx >= (WSA_MACRO_RX1 + 1)) { - dev_err(wsa_dev, "%s: EC mix control not set correctly\n", - __func__); - return -EINVAL; - } - if (wsa_priv->ec_hq[ec_tx]) { - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, - 0x1 << ec_tx, 0x1 << ec_tx); - ec_hq_reg = BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL + - 0x40 * ec_tx; - snd_soc_update_bits(codec, ec_hq_reg, 0x01, 0x01); - ec_hq_reg = BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 + - 0x40 * ec_tx; - /* default set to 48k */ - snd_soc_update_bits(codec, ec_hq_reg, 0x1E, 0x08); - } - - return 0; -} - -static int wsa_macro_get_ec_hq(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int ec_tx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->ec_hq[ec_tx]; - return 0; -} - -static int wsa_macro_set_ec_hq(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int ec_tx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(wsa_dev, "%s: enable current %d, new %d\n", - __func__, wsa_priv->ec_hq[ec_tx], value); - wsa_priv->ec_hq[ec_tx] = value; - - return 0; -} - -static int wsa_macro_get_rx_mute_status(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int wsa_rx_shift = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - wsa_priv->wsa_digital_mute_status[wsa_rx_shift]; - return 0; -} - -static int wsa_macro_set_rx_mute_status(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int value = ucontrol->value.integer.value[0]; - int wsa_rx_shift = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (wsa_rx_shift) { - case 0: - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX0_RX_PATH_CTL, - 0x10, value << 4); - break; - case 1: - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX1_RX_PATH_CTL, - 0x10, value << 4); - break; - case 2: - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL, - 0x10, value << 4); - break; - case 3: - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL, - 0x10, value << 4); - break; - default: - pr_err("%s: invalid argument rx_shift = %d\n", __func__, - wsa_rx_shift); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: WSA Digital Mute RX %d Enable %d\n", - __func__, wsa_rx_shift, value); - wsa_priv->wsa_digital_mute_status[wsa_rx_shift] = value; - return 0; -} - -static int wsa_macro_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->comp_enabled[comp]; - return 0; -} - -static int wsa_macro_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, wsa_priv->comp_enabled[comp], value); - wsa_priv->comp_enabled[comp] = value; - - return 0; -} - -static int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->ear_spkr_gain; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->ear_spkr_gain = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: gain = %d\n", __func__, - wsa_priv->ear_spkr_gain); - - return 0; -} - -static int wsa_macro_spkr_left_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, BOLERO_CDC_WSA_BOOST0_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_spkr_left_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - /* bolero does not need to limit the boost levels */ - - return 0; -} - -static int wsa_macro_spkr_right_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, BOLERO_CDC_WSA_BOOST1_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_spkr_right_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - /* bolero does not need to limit the boost levels */ - - return 0; -} - -static int wsa_macro_rx_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - wsa_priv->rx_port_value[widget->shift]; - return 0; -} - -static int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - u32 rx_port_value = ucontrol->value.integer.value[0]; - u32 bit_input = 0; - u32 aif_rst; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - aif_rst = wsa_priv->rx_port_value[widget->shift]; - if (!rx_port_value) { - if (aif_rst == 0) { - dev_err(wsa_dev, "%s: AIF reset already\n", __func__); - return 0; - } - if (aif_rst >= WSA_MACRO_RX_MAX) { - dev_err(wsa_dev, "%s: Invalid AIF reset\n", __func__); - return 0; - } - } - wsa_priv->rx_port_value[widget->shift] = rx_port_value; - - bit_input = widget->shift; - - dev_dbg(wsa_dev, - "%s: mux input: %d, mux output: %d, bit: %d\n", - __func__, rx_port_value, widget->shift, bit_input); - - switch (rx_port_value) { - case 0: - if (wsa_priv->active_ch_cnt[aif_rst]) { - clear_bit(bit_input, - &wsa_priv->active_ch_mask[aif_rst]); - wsa_priv->active_ch_cnt[aif_rst]--; - } - break; - case 1: - case 2: - set_bit(bit_input, - &wsa_priv->active_ch_mask[rx_port_value]); - wsa_priv->active_ch_cnt[rx_port_value]++; - break; - default: - dev_err(wsa_dev, - "%s: Invalid AIF_ID for WSA RX MUX %d\n", - __func__, rx_port_value); - return -EINVAL; - } - - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - return 0; -} - -static int wsa_macro_vbat_bcl_gsm_mode_func_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ucontrol->value.integer.value[0] = - ((snd_soc_read(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG) & 0x04) ? - 1 : 0); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_vbat_bcl_gsm_mode_func_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - /* Set Vbat register configuration for GSM mode bit based on value */ - if (ucontrol->value.integer.value[0]) - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x04, 0x04); - else - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x04, 0x00); - - return 0; -} - -static int wsa_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int path = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->is_softclip_on[path]; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int path = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->is_softclip_on[path] = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: soft clip enable for %d: %d\n", __func__, - path, wsa_priv->is_softclip_on[path]); - - return 0; -} - -static const struct snd_kcontrol_new wsa_macro_snd_controls[] = { - SOC_ENUM_EXT("EAR SPKR PA Gain", wsa_macro_ear_spkr_pa_gain_enum, - wsa_macro_ear_spkr_pa_gain_get, - wsa_macro_ear_spkr_pa_gain_put), - SOC_ENUM_EXT("SPKR Left Boost Max State", - wsa_macro_spkr_boost_stage_enum, - wsa_macro_spkr_left_boost_stage_get, - wsa_macro_spkr_left_boost_stage_put), - SOC_ENUM_EXT("SPKR Right Boost Max State", - wsa_macro_spkr_boost_stage_enum, - wsa_macro_spkr_right_boost_stage_get, - wsa_macro_spkr_right_boost_stage_put), - SOC_ENUM_EXT("GSM mode Enable", wsa_macro_vbat_bcl_gsm_mode_enum, - wsa_macro_vbat_bcl_gsm_mode_func_get, - wsa_macro_vbat_bcl_gsm_mode_func_put), - SOC_SINGLE_EXT("WSA_Softclip0 Enable", SND_SOC_NOPM, - WSA_MACRO_SOFTCLIP0, 1, 0, - wsa_macro_soft_clip_enable_get, - wsa_macro_soft_clip_enable_put), - SOC_SINGLE_EXT("WSA_Softclip1 Enable", SND_SOC_NOPM, - WSA_MACRO_SOFTCLIP1, 1, 0, - wsa_macro_soft_clip_enable_get, - wsa_macro_soft_clip_enable_put), - SOC_SINGLE_SX_TLV("WSA_RX0 Digital Volume", - BOLERO_CDC_WSA_RX0_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("WSA_RX1 Digital Volume", - BOLERO_CDC_WSA_RX1_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_EXT("WSA_RX0 Digital Mute", SND_SOC_NOPM, WSA_MACRO_RX0, 1, - 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_RX1 Digital Mute", SND_SOC_NOPM, WSA_MACRO_RX1, 1, - 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_RX0_MIX Digital Mute", SND_SOC_NOPM, - WSA_MACRO_RX_MIX0, 1, 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_RX1_MIX Digital Mute", SND_SOC_NOPM, - WSA_MACRO_RX_MIX1, 1, 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_COMP1 Switch", SND_SOC_NOPM, WSA_MACRO_COMP1, 1, 0, - wsa_macro_get_compander, wsa_macro_set_compander), - SOC_SINGLE_EXT("WSA_COMP2 Switch", SND_SOC_NOPM, WSA_MACRO_COMP2, 1, 0, - wsa_macro_get_compander, wsa_macro_set_compander), - SOC_SINGLE_EXT("WSA_RX0 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX0, - 1, 0, wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), - SOC_SINGLE_EXT("WSA_RX1 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX1, - 1, 0, wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), -}; - -static const struct soc_enum rx_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_mux_text), rx_mux_text); - -static const struct snd_kcontrol_new rx_mux[WSA_MACRO_RX_MAX] = { - SOC_DAPM_ENUM_EXT("WSA RX0 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), - SOC_DAPM_ENUM_EXT("WSA RX1 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), - SOC_DAPM_ENUM_EXT("WSA RX_MIX0 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), - SOC_DAPM_ENUM_EXT("WSA RX_MIX1 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), -}; - -static int wsa_macro_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 spk_tx_id = mixer->shift; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - if (test_bit(spk_tx_id, &wsa_priv->active_ch_mask[dai_id])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - return 0; -} - -static int wsa_macro_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 spk_tx_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->vi_feed_value = ucontrol->value.integer.value[0]; - - if (enable) { - if (spk_tx_id == WSA_MACRO_TX0 && - !test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - set_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]++; - } - if (spk_tx_id == WSA_MACRO_TX1 && - !test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - set_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]++; - } - } else { - if (spk_tx_id == WSA_MACRO_TX0 && - test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - clear_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]--; - } - if (spk_tx_id == WSA_MACRO_TX1 && - test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - clear_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]--; - } - } - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); - - return 0; -} - -static const struct snd_kcontrol_new aif_vi_mixer[] = { - SOC_SINGLE_EXT("WSA_SPKR_VI_1", SND_SOC_NOPM, WSA_MACRO_TX0, 1, 0, - wsa_macro_vi_feed_mixer_get, - wsa_macro_vi_feed_mixer_put), - SOC_SINGLE_EXT("WSA_SPKR_VI_2", SND_SOC_NOPM, WSA_MACRO_TX1, 1, 0, - wsa_macro_vi_feed_mixer_get, - wsa_macro_vi_feed_mixer_put), -}; - -static const struct snd_soc_dapm_widget wsa_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("WSA AIF_MIX1 PB", "WSA_AIF_MIX1 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_OUT_E("WSA AIF_VI", "WSA_AIF_VI Capture", 0, - SND_SOC_NOPM, WSA_MACRO_AIF_VI, 0, - wsa_macro_enable_vi_feedback, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT("WSA AIF_ECHO", "WSA_AIF_ECHO Capture", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_MIXER("WSA_AIF_VI Mixer", SND_SOC_NOPM, WSA_MACRO_AIF_VI, - 0, aif_vi_mixer, ARRAY_SIZE(aif_vi_mixer)), - SND_SOC_DAPM_MUX_E("WSA RX_MIX EC0_MUX", SND_SOC_NOPM, - WSA_MACRO_EC0_MUX, 0, - &rx_mix_ec0_mux, wsa_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA RX_MIX EC1_MUX", SND_SOC_NOPM, - WSA_MACRO_EC1_MUX, 0, - &rx_mix_ec1_mux, wsa_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("WSA RX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX0, 0, - &rx_mux[WSA_MACRO_RX0]), - SND_SOC_DAPM_MUX("WSA RX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX1, 0, - &rx_mux[WSA_MACRO_RX1]), - SND_SOC_DAPM_MUX("WSA RX_MIX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 0, - &rx_mux[WSA_MACRO_RX_MIX0]), - SND_SOC_DAPM_MUX("WSA RX_MIX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 0, - &rx_mux[WSA_MACRO_RX_MIX1]), - - SND_SOC_DAPM_MIXER("WSA RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA RX_MIX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA RX_MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0, - &rx0_prim_inp0_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0, - &rx0_prim_inp1_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0, - &rx0_prim_inp2_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL, - 0, 0, &rx0_mix_mux, wsa_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0, - &rx1_prim_inp0_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0, - &rx1_prim_inp1_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0, - &rx1_prim_inp2_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL, - 0, 0, &rx1_mix_mux, wsa_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 MIX", SND_SOC_NOPM, - 0, 0, NULL, 0, wsa_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 MIX", SND_SOC_NOPM, - 1, 0, NULL, 0, wsa_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_MIXER("WSA_RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA_RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("WSA_RX0 INT0 SIDETONE MIX", - BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 4, 0, - &rx0_sidetone_mix_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_INPUT("WSA SRC0_INP"), - - SND_SOC_DAPM_INPUT("WSA_TX DEC0_INP"), - SND_SOC_DAPM_INPUT("WSA_TX DEC1_INP"), - - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 INTERP", SND_SOC_NOPM, - WSA_MACRO_COMP1, 0, NULL, 0, wsa_macro_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 INTERP", SND_SOC_NOPM, - WSA_MACRO_COMP2, 0, NULL, 0, wsa_macro_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, wsa_macro_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, wsa_macro_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 VBAT", SND_SOC_NOPM, - 0, 0, wsa_int0_vbat_mix_switch, - ARRAY_SIZE(wsa_int0_vbat_mix_switch), - wsa_macro_enable_vbat, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 VBAT", SND_SOC_NOPM, - 0, 0, wsa_int1_vbat_mix_switch, - ARRAY_SIZE(wsa_int1_vbat_mix_switch), - wsa_macro_enable_vbat, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("VIINPUT_WSA"), - - SND_SOC_DAPM_OUTPUT("WSA_SPK1 OUT"), - SND_SOC_DAPM_OUTPUT("WSA_SPK2 OUT"), - - SND_SOC_DAPM_SUPPLY_S("WSA_MCLK", 0, SND_SOC_NOPM, 0, 0, - wsa_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route wsa_audio_map[] = { - /* VI Feedback */ - {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_1", "VIINPUT_WSA"}, - {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_2", "VIINPUT_WSA"}, - {"WSA AIF_VI", NULL, "WSA_AIF_VI Mixer"}, - {"WSA AIF_VI", NULL, "WSA_MCLK"}, - - {"WSA RX_MIX EC0_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, - {"WSA RX_MIX EC1_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, - {"WSA RX_MIX EC0_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, - {"WSA RX_MIX EC1_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, - {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC0_MUX"}, - {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC1_MUX"}, - {"WSA AIF_ECHO", NULL, "WSA_MCLK"}, - - {"WSA AIF1 PB", NULL, "WSA_MCLK"}, - {"WSA AIF_MIX1 PB", NULL, "WSA_MCLK"}, - - {"WSA RX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, - {"WSA RX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, - {"WSA RX_MIX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, - {"WSA RX_MIX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, - - {"WSA RX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - {"WSA RX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - {"WSA RX_MIX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - {"WSA RX_MIX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - - {"WSA RX0", NULL, "WSA RX0 MUX"}, - {"WSA RX1", NULL, "WSA RX1 MUX"}, - {"WSA RX_MIX0", NULL, "WSA RX_MIX0 MUX"}, - {"WSA RX_MIX1", NULL, "WSA RX_MIX1 MUX"}, - - {"WSA_RX0 INP0", "RX0", "WSA RX0"}, - {"WSA_RX0 INP0", "RX1", "WSA RX1"}, - {"WSA_RX0 INP0", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 INP0", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX0 INP0", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX0 INP0", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP0"}, - - {"WSA_RX0 INP1", "RX0", "WSA RX0"}, - {"WSA_RX0 INP1", "RX1", "WSA RX1"}, - {"WSA_RX0 INP1", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 INP1", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX0 INP1", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX0 INP1", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP1"}, - - {"WSA_RX0 INP2", "RX0", "WSA RX0"}, - {"WSA_RX0 INP2", "RX1", "WSA RX1"}, - {"WSA_RX0 INP2", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 INP2", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX0 INP2", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX0 INP2", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP2"}, - - {"WSA_RX0 MIX INP", "RX0", "WSA RX0"}, - {"WSA_RX0 MIX INP", "RX1", "WSA RX1"}, - {"WSA_RX0 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX0 MIX INP"}, - - {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX INT0 MIX"}, - {"WSA_RX INT0 INTERP", NULL, "WSA_RX INT0 SEC MIX"}, - {"WSA_RX0 INT0 SIDETONE MIX", "SRC0", "WSA SRC0_INP"}, - {"WSA_RX INT0 INTERP", NULL, "WSA_RX0 INT0 SIDETONE MIX"}, - {"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 INTERP"}, - - {"WSA_RX INT0 VBAT", "WSA RX0 VBAT Enable", "WSA_RX INT0 INTERP"}, - {"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 VBAT"}, - - {"WSA_SPK1 OUT", NULL, "WSA_RX INT0 CHAIN"}, - {"WSA_SPK1 OUT", NULL, "WSA_MCLK"}, - - {"WSA_RX1 INP0", "RX0", "WSA RX0"}, - {"WSA_RX1 INP0", "RX1", "WSA RX1"}, - {"WSA_RX1 INP0", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 INP0", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX1 INP0", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX1 INP0", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP0"}, - - {"WSA_RX1 INP1", "RX0", "WSA RX0"}, - {"WSA_RX1 INP1", "RX1", "WSA RX1"}, - {"WSA_RX1 INP1", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 INP1", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX1 INP1", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX1 INP1", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP1"}, - - {"WSA_RX1 INP2", "RX0", "WSA RX0"}, - {"WSA_RX1 INP2", "RX1", "WSA RX1"}, - {"WSA_RX1 INP2", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 INP2", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX1 INP2", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX1 INP2", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP2"}, - - {"WSA_RX1 MIX INP", "RX0", "WSA RX0"}, - {"WSA_RX1 MIX INP", "RX1", "WSA RX1"}, - {"WSA_RX1 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX1 MIX INP"}, - - {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX INT1 MIX"}, - {"WSA_RX INT1 INTERP", NULL, "WSA_RX INT1 SEC MIX"}, - - {"WSA_RX INT1 VBAT", "WSA RX1 VBAT Enable", "WSA_RX INT1 INTERP"}, - {"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 VBAT"}, - - {"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 INTERP"}, - {"WSA_SPK2 OUT", NULL, "WSA_RX INT1 CHAIN"}, - {"WSA_SPK2 OUT", NULL, "WSA_MCLK"}, -}; - -static const struct wsa_macro_reg_mask_val wsa_macro_reg_init[] = { - {BOLERO_CDC_WSA_BOOST0_BOOST_CFG1, 0x3F, 0x12}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CFG2, 0x1C, 0x08}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x1E, 0x18}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CFG1, 0x3F, 0x12}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CFG2, 0x1C, 0x08}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x1E, 0x18}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0x70, 0x58}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0x70, 0x58}, - {BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 0x08, 0x08}, - {BOLERO_CDC_WSA_RX1_RX_PATH_CFG1, 0x08, 0x08}, - {BOLERO_CDC_WSA_TOP_TOP_CFG1, 0x02, 0x02}, - {BOLERO_CDC_WSA_TOP_TOP_CFG1, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX0_RX_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX1_RX_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x01, 0x01}, -}; - -static void wsa_macro_init_bcl_pmic_reg(struct snd_soc_codec *codec) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return; - } - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return; - - switch (wsa_priv->bcl_pmic_params.id) { - case 0: - /* Enable ID0 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1, 0x02, 0x02); - /* Update MC_SID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1, 0x0F, - wsa_priv->bcl_pmic_params.sid); - /* Update MC_PPID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2, 0xFF, - wsa_priv->bcl_pmic_params.ppid); - break; - case 1: - /* Enable ID1 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1, 0x01, 0x01); - /* Update MC_SID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3, 0x0F, - wsa_priv->bcl_pmic_params.sid); - /* Update MC_PPID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4, 0xFF, - wsa_priv->bcl_pmic_params.ppid); - break; - default: - dev_err(wsa_dev, "%s: PMIC ID is invalid %d\n", - __func__, wsa_priv->bcl_pmic_params.id); - break; - } -} - -static void wsa_macro_init_reg(struct snd_soc_codec *codec) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(wsa_macro_reg_init); i++) - snd_soc_update_bits(codec, - wsa_macro_reg_init[i].reg, - wsa_macro_reg_init[i].mask, - wsa_macro_reg_init[i].val); - - wsa_macro_init_bcl_pmic_reg(codec); -} - -static int wsa_macro_core_vote(void *handle, bool enable) -{ - struct wsa_macro_priv *wsa_priv = (struct wsa_macro_priv *) handle; - - if (wsa_priv == NULL) { - pr_err("%s: wsa priv data is NULL\n", __func__); - return -EINVAL; - } - if (enable) { - pm_runtime_get_sync(wsa_priv->dev); - pm_runtime_put_autosuspend(wsa_priv->dev); - pm_runtime_mark_last_busy(wsa_priv->dev); - } - - if (bolero_check_core_votes(wsa_priv->dev)) - return 0; - else - return -EINVAL; -} - -static int wsa_swrm_clock(void *handle, bool enable) -{ - struct wsa_macro_priv *wsa_priv = (struct wsa_macro_priv *) handle; - struct regmap *regmap = dev_get_regmap(wsa_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(wsa_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&wsa_priv->swr_clk_lock); - - trace_printk("%s: %s swrm clock %s\n", - dev_name(wsa_priv->dev), __func__, - (enable ? "enable" : "disable")); - dev_dbg(wsa_priv->dev, "%s: swrm clock %s\n", - __func__, (enable ? "enable" : "disable")); - if (enable) { - pm_runtime_get_sync(wsa_priv->dev); - if (wsa_priv->swr_clk_users == 0) { - ret = msm_cdc_pinctrl_select_active_state( - wsa_priv->wsa_swr_gpio_p); - if (ret < 0) { - dev_err_ratelimited(wsa_priv->dev, - "%s: wsa swr pinctrl enable failed\n", - __func__); - pm_runtime_mark_last_busy(wsa_priv->dev); - pm_runtime_put_autosuspend(wsa_priv->dev); - goto exit; - } - ret = wsa_macro_mclk_enable(wsa_priv, 1, true); - if (ret < 0) { - msm_cdc_pinctrl_select_sleep_state( - wsa_priv->wsa_swr_gpio_p); - dev_err_ratelimited(wsa_priv->dev, - "%s: wsa request clock enable failed\n", - __func__); - pm_runtime_mark_last_busy(wsa_priv->dev); - pm_runtime_put_autosuspend(wsa_priv->dev); - goto exit; - } - if (wsa_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - if (wsa_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x00); - wsa_priv->reset_swr = false; - } - wsa_priv->swr_clk_users++; - pm_runtime_mark_last_busy(wsa_priv->dev); - pm_runtime_put_autosuspend(wsa_priv->dev); - } else { - if (wsa_priv->swr_clk_users <= 0) { - dev_err(wsa_priv->dev, "%s: clock already disabled\n", - __func__); - wsa_priv->swr_clk_users = 0; - goto exit; - } - wsa_priv->swr_clk_users--; - if (wsa_priv->swr_clk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - wsa_macro_mclk_enable(wsa_priv, 0, true); - ret = msm_cdc_pinctrl_select_sleep_state( - wsa_priv->wsa_swr_gpio_p); - if (ret < 0) { - dev_err_ratelimited(wsa_priv->dev, - "%s: wsa swr pinctrl disable failed\n", - __func__); - goto exit; - } - } - } - trace_printk("%s: %s swrm clock users: %d\n", - dev_name(wsa_priv->dev), __func__, - wsa_priv->swr_clk_users); - dev_dbg(wsa_priv->dev, "%s: swrm clock users %d\n", - __func__, wsa_priv->swr_clk_users); -exit: - mutex_unlock(&wsa_priv->swr_clk_lock); - return ret; -} - -static int wsa_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - wsa_dev = bolero_get_device_ptr(codec->dev, WSA_MACRO); - if (!wsa_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - wsa_priv = dev_get_drvdata(wsa_dev); - if (!wsa_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - - ret = snd_soc_dapm_new_controls(dapm, wsa_macro_dapm_widgets, - ARRAY_SIZE(wsa_macro_dapm_widgets)); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add controls\n", __func__); - return ret; - } - - ret = snd_soc_dapm_add_routes(dapm, wsa_audio_map, - ARRAY_SIZE(wsa_audio_map)); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add routes\n", __func__); - return ret; - } - - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add widgets\n", __func__); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, wsa_macro_snd_controls, - ARRAY_SIZE(wsa_macro_snd_controls)); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add snd_ctls\n", __func__); - return ret; - } - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_MIX1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_VI Capture"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_ECHO Capture"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA"); - snd_soc_dapm_ignore_suspend(dapm, "WSA SRC0_INP"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_TX DEC0_INP"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_TX DEC1_INP"); - snd_soc_dapm_sync(dapm); - - wsa_priv->codec = codec; - wsa_priv->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_0_DB; - wsa_macro_init_reg(codec); - - return 0; -} - -static int wsa_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->codec = NULL; - - return 0; -} - -static void wsa_macro_add_child_devices(struct work_struct *work) -{ - struct wsa_macro_priv *wsa_priv; - struct platform_device *pdev; - struct device_node *node; - struct wsa_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp; - int ret; - u16 count = 0, ctrl_num = 0; - struct wsa_macro_swr_ctrl_platform_data *platdata; - char plat_dev_name[WSA_MACRO_SWR_STRING_LEN]; - - wsa_priv = container_of(work, struct wsa_macro_priv, - wsa_macro_add_child_devices_work); - if (!wsa_priv) { - pr_err("%s: Memory for wsa_priv does not exist\n", - __func__); - return; - } - if (!wsa_priv->dev || !wsa_priv->dev->of_node) { - dev_err(wsa_priv->dev, - "%s: DT node for wsa_priv does not exist\n", __func__); - return; - } - - platdata = &wsa_priv->swr_plat_data; - wsa_priv->child_count = 0; - - for_each_available_child_of_node(wsa_priv->dev->of_node, node) { - if (strnstr(node->name, "wsa_swr_master", - strlen("wsa_swr_master")) != NULL) - strlcpy(plat_dev_name, "wsa_swr_ctrl", - (WSA_MACRO_SWR_STRING_LEN - 1)); - else if (strnstr(node->name, "msm_cdc_pinctrl", - strlen("msm_cdc_pinctrl")) != NULL) - strlcpy(plat_dev_name, node->name, - (WSA_MACRO_SWR_STRING_LEN - 1)); - else - continue; - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(wsa_priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = wsa_priv->dev; - pdev->dev.of_node = node; - - if (strnstr(node->name, "wsa_swr_master", - strlen("wsa_swr_master")) != NULL) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (!strcmp(node->name, "wsa_swr_master")) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct wsa_macro_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - dev_err(&pdev->dev, "out of memory\n"); - ret = -ENOMEM; - goto err; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].wsa_swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - wsa_priv->swr_ctrl_data = swr_ctrl_data; - } - if (wsa_priv->child_count < WSA_MACRO_CHILD_DEVICES_MAX) - wsa_priv->pdev_child_devices[ - wsa_priv->child_count++] = pdev; - else - goto err; - } - - return; -fail_pdev_add: - for (count = 0; count < wsa_priv->child_count; count++) - platform_device_put(wsa_priv->pdev_child_devices[count]); -err: - return; -} - -static void wsa_macro_init_ops(struct macro_ops *ops, - char __iomem *wsa_io_base) -{ - memset(ops, 0, sizeof(struct macro_ops)); - ops->init = wsa_macro_init; - ops->exit = wsa_macro_deinit; - ops->io_base = wsa_io_base; - ops->dai_ptr = wsa_macro_dai; - ops->num_dais = ARRAY_SIZE(wsa_macro_dai); - ops->event_handler = wsa_macro_event_handler; - ops->set_port_map = wsa_macro_set_port_map; -} - -static int wsa_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops; - struct wsa_macro_priv *wsa_priv; - u32 wsa_base_addr, default_clk_id; - char __iomem *wsa_io_base; - int ret = 0; - u8 bcl_pmic_params[3]; - u32 is_used_wsa_swr_gpio = 1; - const char *is_used_wsa_swr_gpio_dt = "qcom,is-used-swr-gpio"; - - wsa_priv = devm_kzalloc(&pdev->dev, sizeof(struct wsa_macro_priv), - GFP_KERNEL); - if (!wsa_priv) - return -ENOMEM; - - wsa_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &wsa_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - if (of_find_property(pdev->dev.of_node, is_used_wsa_swr_gpio_dt, - NULL)) { - ret = of_property_read_u32(pdev->dev.of_node, - is_used_wsa_swr_gpio_dt, - &is_used_wsa_swr_gpio); - if (ret) { - dev_err(&pdev->dev, "%s: error reading %s in dt\n", - __func__, is_used_wsa_swr_gpio_dt); - is_used_wsa_swr_gpio = 1; - } - } - wsa_priv->wsa_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-swr-gpios", 0); - if (!wsa_priv->wsa_swr_gpio_p && is_used_wsa_swr_gpio) { - dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n", - __func__); - return -EINVAL; - } - if (msm_cdc_pinctrl_get_state(wsa_priv->wsa_swr_gpio_p) < 0 && - is_used_wsa_swr_gpio) { - dev_err(&pdev->dev, "%s: failed to get swr pin state\n", - __func__); - return -EPROBE_DEFER; - } - - wsa_io_base = devm_ioremap(&pdev->dev, - wsa_base_addr, WSA_MACRO_MAX_OFFSET); - if (!wsa_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -EINVAL; - } - wsa_priv->wsa_io_base = wsa_io_base; - wsa_priv->reset_swr = true; - INIT_WORK(&wsa_priv->wsa_macro_add_child_devices_work, - wsa_macro_add_child_devices); - wsa_priv->swr_plat_data.handle = (void *) wsa_priv; - wsa_priv->swr_plat_data.read = NULL; - wsa_priv->swr_plat_data.write = NULL; - wsa_priv->swr_plat_data.bulk_write = NULL; - wsa_priv->swr_plat_data.clk = wsa_swrm_clock; - wsa_priv->swr_plat_data.core_vote = wsa_macro_core_vote; - wsa_priv->swr_plat_data.handle_irq = NULL; - - ret = of_property_read_u32(pdev->dev.of_node, "qcom,default-clk-id", - &default_clk_id); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "qcom,mux0-clk-id"); - default_clk_id = WSA_CORE_CLK; - } - - ret = of_property_read_u8_array(pdev->dev.of_node, - "qcom,wsa-bcl-pmic-params", bcl_pmic_params, - sizeof(bcl_pmic_params)); - if (ret) { - dev_dbg(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "qcom,wsa-bcl-pmic-params"); - } else { - wsa_priv->bcl_pmic_params.id = bcl_pmic_params[0]; - wsa_priv->bcl_pmic_params.sid = bcl_pmic_params[1]; - wsa_priv->bcl_pmic_params.ppid = bcl_pmic_params[2]; - } - wsa_priv->default_clk_id = default_clk_id; - - dev_set_drvdata(&pdev->dev, wsa_priv); - mutex_init(&wsa_priv->mclk_lock); - mutex_init(&wsa_priv->swr_clk_lock); - wsa_macro_init_ops(&ops, wsa_io_base); - ops.clk_id_req = wsa_priv->default_clk_id; - ops.default_clk_id = wsa_priv->default_clk_id; - ret = bolero_register_macro(&pdev->dev, WSA_MACRO, &ops); - if (ret < 0) { - dev_err(&pdev->dev, "%s: register macro failed\n", __func__); - goto reg_macro_fail; - } - schedule_work(&wsa_priv->wsa_macro_add_child_devices_work); - pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - pm_suspend_ignore_children(&pdev->dev, true); - pm_runtime_enable(&pdev->dev); - - return ret; -reg_macro_fail: - mutex_destroy(&wsa_priv->mclk_lock); - mutex_destroy(&wsa_priv->swr_clk_lock); - return ret; -} - -static int wsa_macro_remove(struct platform_device *pdev) -{ - struct wsa_macro_priv *wsa_priv; - u16 count = 0; - - wsa_priv = dev_get_drvdata(&pdev->dev); - - if (!wsa_priv) - return -EINVAL; - - for (count = 0; count < wsa_priv->child_count && - count < WSA_MACRO_CHILD_DEVICES_MAX; count++) - platform_device_unregister(wsa_priv->pdev_child_devices[count]); - - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - bolero_unregister_macro(&pdev->dev, WSA_MACRO); - mutex_destroy(&wsa_priv->mclk_lock); - mutex_destroy(&wsa_priv->swr_clk_lock); - return 0; -} - -static const struct of_device_id wsa_macro_dt_match[] = { - {.compatible = "qcom,wsa-macro"}, - {} -}; - -static const struct dev_pm_ops bolero_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - pm_runtime_force_suspend, - pm_runtime_force_resume - ) - SET_RUNTIME_PM_OPS( - bolero_runtime_suspend, - bolero_runtime_resume, - NULL - ) -}; - -static struct platform_driver wsa_macro_driver = { - .driver = { - .name = "wsa_macro", - .owner = THIS_MODULE, - .pm = &bolero_dev_pm_ops, - .of_match_table = wsa_macro_dt_match, - .suppress_bind_attrs = true, - }, - .probe = wsa_macro_probe, - .remove = wsa_macro_remove, -}; - -module_platform_driver(wsa_macro_driver); - -MODULE_DESCRIPTION("WSA macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.h b/techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.h deleted file mode 100644 index f93793ae9fc4..000000000000 --- a/techpack/audio/4.0/asoc/codecs/bolero/wsa-macro.h +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ -#ifndef WSA_MACRO_H -#define WSA_MACRO_H - -/* - * Selects compander and smart boost settings - * for a given speaker mode - */ -enum { - WSA_MACRO_SPKR_MODE_DEFAULT, - WSA_MACRO_SPKR_MODE_1, /* COMP Gain = 12dB, Smartboost Max = 5.5V */ -}; - -/* Rx path gain offsets */ -enum { - WSA_MACRO_GAIN_OFFSET_M1P5_DB, - WSA_MACRO_GAIN_OFFSET_0_DB, -}; - - -#if IS_ENABLED(CONFIG_WSA_MACRO) -extern int wsa_macro_set_spkr_mode(struct snd_soc_codec *codec, int mode); -extern int wsa_macro_set_spkr_gain_offset(struct snd_soc_codec *codec, - int offset); -#else /* CONFIG_WSA_MACRO */ -static inline int wsa_macro_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - return 0; -} -static inline int wsa_macro_set_spkr_gain_offset(struct snd_soc_codec *codec, - int offset); -{ - return 0; -} -#endif /* CONFIG_WSA_MACRO */ -#endif diff --git a/techpack/audio/4.0/asoc/codecs/cpe_cmi.h b/techpack/audio/4.0/asoc/codecs/cpe_cmi.h deleted file mode 100644 index cd94c71826cb..000000000000 --- a/techpack/audio/4.0/asoc/codecs/cpe_cmi.h +++ /dev/null @@ -1,484 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. - */ - -#ifndef __CPE_CMI_H__ -#define __CPE_CMI_H__ - -#include - -#define CPE_AFE_PORT_1_TX 1 -#define CPE_AFE_PORT_3_TX 3 -#define CPE_AFE_PORT_ID_2_OUT 0x02 -#define CMI_INBAND_MESSAGE_SIZE 127 - -/* - * Multiple mad types can be supported at once. - * these values can be OR'ed to form the set of - * supported mad types - */ -#define MAD_TYPE_AUDIO (1 << 0) -#define MAD_TYPE_BEACON (1 << 1) -#define MAD_TYPE_ULTRASND (1 << 2) - -/* Core service command opcodes */ -#define CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC (0x3001) -#define CPE_CORE_SVC_CMDRSP_SHARED_MEM_ALLOC (0x3002) -#define CPE_CORE_SVC_CMD_SHARED_MEM_DEALLOC (0x3003) -#define CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ (0x3004) -#define CPE_CORE_SVC_EVENT_SYSTEM_BOOT (0x3005) -/* core service command opcodes for WCD9335 */ -#define CPE_CORE_SVC_CMD_CFG_CLK_PLAN (0x3006) -#define CPE_CORE_SVC_CMD_CLK_FREQ_REQUEST (0x3007) - -#define CPE_BOOT_SUCCESS 0x00 -#define CPE_BOOT_FAILED 0x01 - -#define CPE_CORE_VERSION_SYSTEM_BOOT_EVENT 0x01 - -/* LSM Service command opcodes */ -#define CPE_LSM_SESSION_CMD_OPEN_TX (0x2000) -#define CPE_LSM_SESSION_CMD_SET_PARAMS (0x2001) -#define CPE_LSM_SESSION_CMD_REGISTER_SOUND_MODEL (0x2002) -#define CPE_LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL (0x2003) -#define CPE_LSM_SESSION_CMD_START (0x2004) -#define CPE_LSM_SESSION_CMD_STOP (0x2005) -#define CPE_LSM_SESSION_EVENT_DETECTION_STATUS_V2 (0x2006) -#define CPE_LSM_SESSION_CMD_CLOSE_TX (0x2007) -#define CPE_LSM_SESSION_CMD_SHARED_MEM_ALLOC (0x2008) -#define CPE_LSM_SESSION_CMDRSP_SHARED_MEM_ALLOC (0x2009) -#define CPE_LSM_SESSION_CMD_SHARED_MEM_DEALLOC (0x200A) -#define CPE_LSM_SESSION_CMD_TX_BUFF_OUTPUT_CONFIG (0x200f) -#define CPE_LSM_SESSION_CMD_OPEN_TX_V2 (0x200D) -#define CPE_LSM_SESSION_CMD_SET_PARAMS_V2 (0x200E) - -/* LSM Service module and param IDs */ -#define CPE_LSM_MODULE_ID_VOICE_WAKEUP (0x00012C00) -#define CPE_LSM_MODULE_ID_VOICE_WAKEUP_V2 (0x00012C0D) -#define CPE_LSM_MODULE_FRAMEWORK (0x00012C0E) - -#define CPE_LSM_PARAM_ID_ENDPOINT_DETECT_THRESHOLD (0x00012C01) -#define CPE_LSM_PARAM_ID_OPERATION_MODE (0x00012C02) -#define CPE_LSM_PARAM_ID_GAIN (0x00012C03) -#define CPE_LSM_PARAM_ID_CONNECT_TO_PORT (0x00012C04) -#define CPE_LSM_PARAM_ID_MIN_CONFIDENCE_LEVELS (0x00012C07) - -/* LSM LAB command opcodes */ -#define CPE_LSM_SESSION_CMD_EOB 0x0000200B -#define CPE_LSM_MODULE_ID_LAB 0x00012C08 -/* used for enable/disable lab*/ -#define CPE_LSM_PARAM_ID_LAB_ENABLE 0x00012C09 -/* used for T in LAB config DSP internal buffer*/ -#define CPE_LSM_PARAM_ID_LAB_CONFIG 0x00012C0A -#define CPE_LSM_PARAM_ID_REGISTER_SOUND_MODEL (0x00012C14) -#define CPE_LSM_PARAM_ID_DEREGISTER_SOUND_MODEL (0x00012C15) -#define CPE_LSM_PARAM_ID_MEDIA_FMT (0x00012C1E) - -/* AFE Service command opcodes */ -#define CPE_AFE_PORT_CMD_START (0x1001) -#define CPE_AFE_PORT_CMD_STOP (0x1002) -#define CPE_AFE_PORT_CMD_SUSPEND (0x1003) -#define CPE_AFE_PORT_CMD_RESUME (0x1004) -#define CPE_AFE_PORT_CMD_SHARED_MEM_ALLOC (0x1005) -#define CPE_AFE_PORT_CMDRSP_SHARED_MEM_ALLOC (0x1006) -#define CPE_AFE_PORT_CMD_SHARED_MEM_DEALLOC (0x1007) -#define CPE_AFE_PORT_CMD_GENERIC_CONFIG (0x1008) -#define CPE_AFE_SVC_CMD_LAB_MODE (0x1009) - -/* AFE Service module and param IDs */ -#define CPE_AFE_CMD_SET_PARAM (0x1000) -#define CPE_AFE_MODULE_ID_SW_MAD (0x0001022D) -#define CPE_AFE_PARAM_ID_SW_MAD_CFG (0x0001022E) -#define CPE_AFE_PARAM_ID_SVM_MODEL (0x0001022F) - -#define CPE_AFE_MODULE_HW_MAD (0x00010230) -#define CPE_AFE_PARAM_ID_HW_MAD_CTL (0x00010232) -#define CPE_AFE_PARAM_ID_HW_MAD_CFG (0x00010231) - -#define CPE_AFE_MODULE_AUDIO_DEV_INTERFACE (0x0001020C) -#define CPE_AFE_PARAM_ID_GENERIC_PORT_CONFIG (0x00010253) - -#define CPE_CMI_BASIC_RSP_OPCODE (0x0001) -#define CPE_HDR_MAX_PLD_SIZE (0x7F) - -#define CMI_OBM_FLAG_IN_BAND 0 -#define CMI_OBM_FLAG_OUT_BAND 1 - -#define CMI_SHMEM_ALLOC_FAILED 0xff - -/* - * Future Service ID's can be added one line - * before the CMI_CPE_SERVICE_ID_MAX - */ -enum { - CMI_CPE_SERVICE_ID_MIN = 0, - CMI_CPE_CORE_SERVICE_ID, - CMI_CPE_AFE_SERVICE_ID, - CMI_CPE_LSM_SERVICE_ID, - CMI_CPE_SERVICE_ID_MAX, -}; - -#define CPE_LSM_SESSION_ID_MAX 2 - -#define IS_VALID_SESSION_ID(s_id) \ - (s_id <= CPE_LSM_SESSION_ID_MAX) - -#define IS_VALID_SERVICE_ID(s_id) \ - (s_id > CMI_CPE_SERVICE_ID_MIN && \ - s_id < CMI_CPE_SERVICE_ID_MAX) - -#define IS_VALID_PLD_SIZE(p_size) \ - (p_size <= CPE_HDR_MAX_PLD_SIZE) - -#define CMI_HDR_SET_OPCODE(hdr, cmd) (hdr->opcode = cmd) - - -#define CMI_HDR_SET(hdr_info, mask, shift, value) \ - (hdr_info = (((hdr_info) & ~(mask)) | \ - ((value << shift) & mask))) - -#define SVC_ID_SHIFT 4 -#define SVC_ID_MASK (0x07 << SVC_ID_SHIFT) - -#define SESSION_ID_SHIFT 0 -#define SESSION_ID_MASK (0x0F << SESSION_ID_SHIFT) - -#define PAYLD_SIZE_SHIFT 0 -#define PAYLD_SIZE_MASK (0x7F << PAYLD_SIZE_SHIFT) - -#define OBM_FLAG_SHIFT 7 -#define OBM_FLAG_MASK (1 << OBM_FLAG_SHIFT) - -#define VERSION_SHIFT 7 -#define VERSION_MASK (1 << VERSION_SHIFT) - -#define CMI_HDR_SET_SERVICE(hdr, s_id) \ - CMI_HDR_SET(hdr->hdr_info, SVC_ID_MASK,\ - SVC_ID_SHIFT, s_id) -#define CMI_HDR_GET_SERVICE(hdr) \ - ((hdr->hdr_info >> SVC_ID_SHIFT) & \ - (SVC_ID_MASK >> SVC_ID_SHIFT)) - - -#define CMI_HDR_SET_SESSION(hdr, s_id) \ - CMI_HDR_SET(hdr->hdr_info, SESSION_ID_MASK,\ - SESSION_ID_SHIFT, s_id) - -#define CMI_HDR_GET_SESSION_ID(hdr) \ - ((hdr->hdr_info >> SESSION_ID_SHIFT) & \ - (SESSION_ID_MASK >> SESSION_ID_SHIFT)) - -#define CMI_GET_HEADER(msg) ((struct cmi_hdr *)(msg)) -#define CMI_GET_PAYLOAD(msg) ((void *)(CMI_GET_HEADER(msg) + 1)) -#define CMI_GET_OPCODE(msg) (CMI_GET_HEADER(msg)->opcode) - -#define CMI_HDR_SET_VERSION(hdr, ver) \ - CMI_HDR_SET(hdr->hdr_info, VERSION_MASK, \ - VERSION_SHIFT, ver) - -#define CMI_HDR_SET_PAYLOAD_SIZE(hdr, p_size) \ - CMI_HDR_SET(hdr->pld_info, PAYLD_SIZE_MASK, \ - PAYLD_SIZE_SHIFT, p_size) - -#define CMI_HDR_GET_PAYLOAD_SIZE(hdr) \ - ((hdr->pld_info >> PAYLD_SIZE_SHIFT) & \ - (PAYLD_SIZE_MASK >> PAYLD_SIZE_SHIFT)) - -#define CMI_HDR_SET_OBM(hdr, obm_flag) \ - CMI_HDR_SET(hdr->pld_info, OBM_FLAG_MASK, \ - OBM_FLAG_SHIFT, obm_flag) - -#define CMI_HDR_GET_OBM_FLAG(hdr) \ - ((hdr->pld_info >> OBM_FLAG_SHIFT) & \ - (OBM_FLAG_MASK >> OBM_FLAG_SHIFT)) - -struct cmi_hdr { - /* - * bits 0:3 is session id - * bits 4:6 is service id - * bit 7 is the version flag - */ - u8 hdr_info; - - /* - * bits 0:6 is payload size in case of in-band message - * bits 0:6 is size (OBM message size) - * bit 7 is the OBM flag - */ - u8 pld_info; - - /* 16 bit command opcode */ - u16 opcode; -} __packed; - -union cpe_addr { - u64 msw_lsw; - void *kvaddr; -} __packed; - -struct cmi_obm { - u32 version; - u32 size; - union cpe_addr data_ptr; - u32 mem_handle; -} __packed; - -struct cmi_obm_msg { - struct cmi_hdr hdr; - struct cmi_obm pld; -} __packed; - -struct cmi_core_svc_event_system_boot { - u8 status; - u8 version; - u16 sfr_buff_size; - u32 sfr_buff_address; -} __packed; - -struct cmi_core_svc_cmd_shared_mem_alloc { - u32 size; -} __packed; - -struct cmi_core_svc_cmdrsp_shared_mem_alloc { - u32 addr; -} __packed; - -struct cmi_core_svc_cmd_clk_freq_request { - u32 clk_freq; -} __packed; - -struct cmi_msg_transport { - u32 size; - u32 addr; -} __packed; - -struct cmi_basic_rsp_result { - u8 status; -} __packed; - -struct cpe_lsm_cmd_open_tx { - struct cmi_hdr hdr; - u16 app_id; - u16 reserved; - u32 sampling_rate; -} __packed; - -struct cpe_lsm_cmd_open_tx_v2 { - struct cmi_hdr hdr; - u32 topology_id; -} __packed; - -struct cpe_cmd_shmem_alloc { - struct cmi_hdr hdr; - u32 size; -} __packed; - -struct cpe_cmdrsp_shmem_alloc { - struct cmi_hdr hdr; - u32 addr; -} __packed; - -struct cpe_cmd_shmem_dealloc { - struct cmi_hdr hdr; - u32 addr; -} __packed; - -struct cpe_lsm_event_detect_v2 { - struct cmi_hdr hdr; - u8 detection_status; - u8 size; - u8 payload[0]; -} __packed; - -struct cpe_lsm_psize_res { - u16 param_size; - u16 reserved; -} __packed; - -union cpe_lsm_param_size { - u32 param_size; - struct cpe_lsm_psize_res sr; -} __packed; - -struct cpe_param_data { - u32 module_id; - u32 param_id; - union cpe_lsm_param_size p_size; -} __packed; - -struct cpe_lsm_param_epd_thres { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u32 epd_begin; - u32 epd_end; -} __packed; - -struct cpe_lsm_param_gain { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u16 gain; - u16 reserved; -} __packed; - -struct cpe_afe_hw_mad_ctrl { - struct cpe_param_data param; - u32 minor_version; - u16 mad_type; - u16 mad_enable; -} __packed; - -struct cpe_afe_port_cfg { - struct cpe_param_data param; - u32 minor_version; - u16 bit_width; - u16 num_channels; - u32 sample_rate; -} __packed; - -struct cpe_afe_cmd_port_cfg { - struct cmi_hdr hdr; - u8 bit_width; - u8 num_channels; - u16 buffer_size; - u32 sample_rate; -} __packed; - -struct cpe_afe_params { - struct cmi_hdr hdr; - struct cpe_afe_hw_mad_ctrl hw_mad_ctrl; - struct cpe_afe_port_cfg port_cfg; -} __packed; - -struct cpe_afe_svc_cmd_mode { - struct cmi_hdr hdr; - u8 mode; -} __packed; - -struct cpe_lsm_param_opmode { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u16 mode; - u16 reserved; -} __packed; - -struct cpe_lsm_param_connectport { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u16 afe_port_id; - u16 reserved; -} __packed; - -/* - * This cannot be sent to CPE as is, - * need to append the conf_levels dynamically - */ -struct cpe_lsm_conf_level { - struct cmi_hdr hdr; - struct cpe_param_data param; - u8 num_active_models; -} __packed; - -struct cpe_lsm_output_format_cfg { - struct cmi_hdr hdr; - u8 format; - u8 packing; - u8 data_path_events; -} __packed; - -struct cpe_lsm_lab_enable { - struct cpe_param_data param; - u16 enable; - u16 reserved; -} __packed; - -struct cpe_lsm_control_lab { - struct cmi_hdr hdr; - struct cpe_lsm_lab_enable lab_enable; -} __packed; - -struct cpe_lsm_lab_config { - struct cpe_param_data param; - u32 minor_ver; - u32 latency; -} __packed; - -struct cpe_lsm_lab_latency_config { - struct cmi_hdr hdr; - struct cpe_lsm_lab_config latency_cfg; -} __packed; - -struct cpe_lsm_media_fmt_param { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u32 sample_rate; - u16 num_channels; - u16 bit_width; -} __packed; - - -#define CPE_PARAM_LSM_LAB_LATENCY_SIZE (\ - sizeof(struct cpe_lsm_lab_latency_config) - \ - sizeof(struct cmi_hdr)) -#define PARAM_SIZE_LSM_LATENCY_SIZE (\ - sizeof(struct cpe_lsm_lab_config) - \ - sizeof(struct cpe_param_data)) -#define CPE_PARAM_SIZE_LSM_LAB_CONTROL (\ - sizeof(struct cpe_lsm_control_lab) - \ - sizeof(struct cmi_hdr)) -#define PARAM_SIZE_LSM_CONTROL_SIZE (sizeof(struct cpe_lsm_lab_enable) - \ - sizeof(struct cpe_param_data)) -#define PARAM_SIZE_AFE_HW_MAD_CTRL (sizeof(struct cpe_afe_hw_mad_ctrl) - \ - sizeof(struct cpe_param_data)) -#define PARAM_SIZE_AFE_PORT_CFG (sizeof(struct cpe_afe_port_cfg) - \ - sizeof(struct cpe_param_data)) -#define CPE_AFE_PARAM_PAYLOAD_SIZE (sizeof(struct cpe_afe_params) - \ - sizeof(struct cmi_hdr)) - -#define OPEN_CMD_PAYLOAD_SIZE (sizeof(struct cpe_lsm_cmd_open_tx) - \ - sizeof(struct cmi_hdr)) -#define OPEN_V2_CMD_PAYLOAD_SIZE (sizeof(struct cpe_lsm_cmd_open_tx_v2) - \ - sizeof(struct cmi_hdr)) -#define SHMEM_ALLOC_CMD_PLD_SIZE (sizeof(struct cpe_cmd_shmem_alloc) - \ - sizeof(struct cmi_hdr)) - -#define SHMEM_DEALLOC_CMD_PLD_SIZE (sizeof(struct cpe_cmd_shmem_dealloc) - \ - sizeof(struct cmi_hdr)) -#define OUT_FMT_CFG_CMD_PAYLOAD_SIZE ( \ - sizeof(struct cpe_lsm_output_format_cfg) - \ - sizeof(struct cmi_hdr)) - -#define CPE_AFE_CMD_PORT_CFG_PAYLOAD_SIZE \ - (sizeof(struct cpe_afe_cmd_port_cfg) - \ - sizeof(struct cmi_hdr)) - -#define CPE_AFE_CMD_MODE_PAYLOAD_SIZE \ - (sizeof(struct cpe_afe_svc_cmd_mode) - \ - sizeof(struct cmi_hdr)) -#define CPE_CMD_EPD_THRES_PLD_SIZE (sizeof(struct cpe_lsm_param_epd_thres) - \ - sizeof(struct cmi_hdr)) -#define CPE_EPD_THRES_PARAM_SIZE ((CPE_CMD_EPD_THRES_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#define CPE_CMD_OPMODE_PLD_SIZE (sizeof(struct cpe_lsm_param_opmode) - \ - sizeof(struct cmi_hdr)) -#define CPE_OPMODE_PARAM_SIZE ((CPE_CMD_OPMODE_PLD_SIZE) -\ - sizeof(struct cpe_param_data)) -#define CPE_CMD_CONNECTPORT_PLD_SIZE \ - (sizeof(struct cpe_lsm_param_connectport) - \ - sizeof(struct cmi_hdr)) -#define CPE_CONNECTPORT_PARAM_SIZE ((CPE_CMD_CONNECTPORT_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#define CPE_CMD_GAIN_PLD_SIZE (sizeof(struct cpe_lsm_param_gain) - \ - sizeof(struct cmi_hdr)) -#define CPE_GAIN_PARAM_SIZE ((CPE_CMD_GAIN_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#define CPE_MEDIA_FMT_PLD_SIZE (sizeof(struct cpe_lsm_media_fmt_param) - \ - sizeof(struct cmi_hdr)) -#define CPE_MEDIA_FMT_PARAM_SIZE ((CPE_MEDIA_FMT_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#endif /* __CPE_CMI_H__ */ diff --git a/techpack/audio/4.0/asoc/codecs/cpe_err.h b/techpack/audio/4.0/asoc/codecs/cpe_err.h deleted file mode 100644 index 29ea92292646..000000000000 --- a/techpack/audio/4.0/asoc/codecs/cpe_err.h +++ /dev/null @@ -1,158 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. - */ - -#ifndef __CPE_ERR__ -#define __CPE_ERR__ - -#include - -/* ERROR CODES */ -/* Success. The operation completed with no errors. */ -#define CPE_EOK 0x00000000 -/* General failure. */ -#define CPE_EFAILED 0x00000001 -/* Bad operation parameter. */ -#define CPE_EBADPARAM 0x00000002 -/* Unsupported routine or operation. */ -#define CPE_EUNSUPPORTED 0x00000003 -/* Unsupported version. */ -#define CPE_EVERSION 0x00000004 -/* Unexpected problem encountered. */ -#define CPE_EUNEXPECTED 0x00000005 -/* Unhandled problem occurred. */ -#define CPE_EPANIC 0x00000006 -/* Unable to allocate resource. */ -#define CPE_ENORESOURCE 0x00000007 -/* Invalid handle. */ -#define CPE_EHANDLE 0x00000008 -/* Operation is already processed. */ -#define CPE_EALREADY 0x00000009 -/* Operation is not ready to be processed. */ -#define CPE_ENOTREADY 0x0000000A -/* Operation is pending completion. */ -#define CPE_EPENDING 0x0000000B -/* Operation could not be accepted or processed. */ -#define CPE_EBUSY 0x0000000C -/* Operation aborted due to an error. */ -#define CPE_EABORTED 0x0000000D -/* Operation preempted by a higher priority. */ -#define CPE_EPREEMPTED 0x0000000E -/* Operation requests intervention to complete. */ -#define CPE_ECONTINUE 0x0000000F -/* Operation requests immediate intervention to complete. */ -#define CPE_EIMMEDIATE 0x00000010 -/* Operation is not implemented. */ -#define CPE_ENOTIMPL 0x00000011 -/* Operation needs more data or resources. */ -#define CPE_ENEEDMORE 0x00000012 -/* Operation does not have memory. */ -#define CPE_ENOMEMORY 0x00000014 -/* Item does not exist. */ -#define CPE_ENOTEXIST 0x00000015 -/* Operation is finished. */ -#define CPE_ETERMINATED 0x00000016 -/* Max count for adsp error code sent to HLOS*/ -#define CPE_ERR_MAX (CPE_ETERMINATED + 1) - - -/* ERROR STRING */ -/* Success. The operation completed with no errors. */ -#define CPE_EOK_STR "CPE_EOK" -/* General failure. */ -#define CPE_EFAILED_STR "CPE_EFAILED" -/* Bad operation parameter. */ -#define CPE_EBADPARAM_STR "CPE_EBADPARAM" -/* Unsupported routine or operation. */ -#define CPE_EUNSUPPORTED_STR "CPE_EUNSUPPORTED" -/* Unsupported version. */ -#define CPE_EVERSION_STR "CPE_EVERSION" -/* Unexpected problem encountered. */ -#define CPE_EUNEXPECTED_STR "CPE_EUNEXPECTED" -/* Unhandled problem occurred. */ -#define CPE_EPANIC_STR "CPE_EPANIC" -/* Unable to allocate resource. */ -#define CPE_ENORESOURCE_STR "CPE_ENORESOURCE" -/* Invalid handle. */ -#define CPE_EHANDLE_STR "CPE_EHANDLE" -/* Operation is already processed. */ -#define CPE_EALREADY_STR "CPE_EALREADY" -/* Operation is not ready to be processed. */ -#define CPE_ENOTREADY_STR "CPE_ENOTREADY" -/* Operation is pending completion. */ -#define CPE_EPENDING_STR "CPE_EPENDING" -/* Operation could not be accepted or processed. */ -#define CPE_EBUSY_STR "CPE_EBUSY" -/* Operation aborted due to an error. */ -#define CPE_EABORTED_STR "CPE_EABORTED" -/* Operation preempted by a higher priority. */ -#define CPE_EPREEMPTED_STR "CPE_EPREEMPTED" -/* Operation requests intervention to complete. */ -#define CPE_ECONTINUE_STR "CPE_ECONTINUE" -/* Operation requests immediate intervention to complete. */ -#define CPE_EIMMEDIATE_STR "CPE_EIMMEDIATE" -/* Operation is not implemented. */ -#define CPE_ENOTIMPL_STR "CPE_ENOTIMPL" -/* Operation needs more data or resources. */ -#define CPE_ENEEDMORE_STR "CPE_ENEEDMORE" -/* Operation does not have memory. */ -#define CPE_ENOMEMORY_STR "CPE_ENOMEMORY" -/* Item does not exist. */ -#define CPE_ENOTEXIST_STR "CPE_ENOTEXIST" -/* Operation is finished. */ -#define CPE_ETERMINATED_STR "CPE_ETERMINATED" -/* Unexpected error code. */ -#define CPE_ERR_MAX_STR "CPE_ERR_MAX" - - -struct cpe_err_code { - int lnx_err_code; - char *cpe_err_str; -}; - - -static struct cpe_err_code cpe_err_code_info[CPE_ERR_MAX+1] = { - { 0, CPE_EOK_STR}, - { -ENOTRECOVERABLE, CPE_EFAILED_STR}, - { -EINVAL, CPE_EBADPARAM_STR}, - { -EOPNOTSUPP, CPE_EUNSUPPORTED_STR}, - { -ENOPROTOOPT, CPE_EVERSION_STR}, - { -ENOTRECOVERABLE, CPE_EUNEXPECTED_STR}, - { -ENOTRECOVERABLE, CPE_EPANIC_STR}, - { -ENOSPC, CPE_ENORESOURCE_STR}, - { -EBADR, CPE_EHANDLE_STR}, - { -EALREADY, CPE_EALREADY_STR}, - { -EPERM, CPE_ENOTREADY_STR}, - { -EINPROGRESS, CPE_EPENDING_STR}, - { -EBUSY, CPE_EBUSY_STR}, - { -ECANCELED, CPE_EABORTED_STR}, - { -EAGAIN, CPE_EPREEMPTED_STR}, - { -EAGAIN, CPE_ECONTINUE_STR}, - { -EAGAIN, CPE_EIMMEDIATE_STR}, - { -EAGAIN, CPE_ENOTIMPL_STR}, - { -ENODATA, CPE_ENEEDMORE_STR}, - { -EADV, CPE_ERR_MAX_STR}, - { -ENOMEM, CPE_ENOMEMORY_STR}, - { -ENODEV, CPE_ENOTEXIST_STR}, - { -EADV, CPE_ETERMINATED_STR}, - { -EADV, CPE_ERR_MAX_STR}, -}; - -static inline int cpe_err_get_lnx_err_code(u32 cpe_error) -{ - if (cpe_error > CPE_ERR_MAX) - return cpe_err_code_info[CPE_ERR_MAX].lnx_err_code; - else - return cpe_err_code_info[cpe_error].lnx_err_code; -} - -static inline char *cpe_err_get_err_str(u32 cpe_error) -{ - if (cpe_error > CPE_ERR_MAX) - return cpe_err_code_info[CPE_ERR_MAX].cpe_err_str; - else - return cpe_err_code_info[cpe_error].cpe_err_str; -} - -#endif diff --git a/techpack/audio/4.0/asoc/codecs/msm-cdc-pinctrl.c b/techpack/audio/4.0/asoc/codecs/msm-cdc-pinctrl.c deleted file mode 100644 index 638108fe7197..000000000000 --- a/techpack/audio/4.0/asoc/codecs/msm-cdc-pinctrl.c +++ /dev/null @@ -1,334 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_GPIOS 16 - -struct msm_cdc_pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *pinctrl_active; - struct pinctrl_state *pinctrl_sleep; - int gpio; - bool state; - char __iomem *chip_wakeup_register[MAX_GPIOS]; - u32 chip_wakeup_maskbit[MAX_GPIOS]; - u32 count; - u32 wakeup_reg_count; - bool wakeup_capable; - bool chip_wakeup_reg; -}; - -static struct msm_cdc_pinctrl_info *msm_cdc_pinctrl_get_gpiodata( - struct device_node *np) -{ - struct platform_device *pdev; - struct msm_cdc_pinctrl_info *gpio_data; - - if (!np) { - pr_err("%s: device node is null\n", __func__); - return NULL; - } - - pdev = of_find_device_by_node(np); - if (!pdev) { - pr_err("%s: platform device not found!\n", __func__); - return NULL; - } - - gpio_data = dev_get_drvdata(&pdev->dev); - if (!gpio_data) - dev_err(&pdev->dev, "%s: cannot find cdc gpio info\n", - __func__); - - return gpio_data; -} - -/* - * msm_cdc_get_gpio_state: select pinctrl sleep state - * @np: pointer to struct device_node - * - * Returns error code for failure and GPIO value on success - */ -int msm_cdc_get_gpio_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - int value = -EINVAL; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return value; - - if (gpio_is_valid(gpio_data->gpio)) - value = gpio_get_value_cansleep(gpio_data->gpio); - - return value; -} -EXPORT_SYMBOL(msm_cdc_get_gpio_state); - -/* - * msm_cdc_pinctrl_select_sleep_state: select pinctrl sleep state - * @np: pointer to struct device_node - * - * Returns error code for failure - */ -int msm_cdc_pinctrl_select_sleep_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return -EINVAL; - - if (!gpio_data->pinctrl_sleep) { - pr_err("%s: pinctrl sleep state is null\n", __func__); - return -EINVAL; - } - gpio_data->state = false; - - return pinctrl_select_state(gpio_data->pinctrl, - gpio_data->pinctrl_sleep); -} -EXPORT_SYMBOL(msm_cdc_pinctrl_select_sleep_state); - -/* - * msm_cdc_pinctrl_select_active_state: select pinctrl active state - * @np: pointer to struct device_node - * - * Returns error code for failure - */ -int msm_cdc_pinctrl_select_active_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return -EINVAL; - - if (!gpio_data->pinctrl_active) { - pr_err("%s: pinctrl active state is null\n", __func__); - return -EINVAL; - } - gpio_data->state = true; - - return pinctrl_select_state(gpio_data->pinctrl, - gpio_data->pinctrl_active); -} -EXPORT_SYMBOL(msm_cdc_pinctrl_select_active_state); - -/* - * msm_cdc_pinctrl_get_state: get curren pinctrl state - * @np: pointer to struct device_node - * - * Returns 0 for sleep state, 1 for active state, - * error code for failure - */ -int msm_cdc_pinctrl_get_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return -EINVAL; - - return gpio_data->state; -} -EXPORT_SYMBOL(msm_cdc_pinctrl_get_state); - -/* - * msm_cdc_pinctrl_set_wakeup_capable: Set a pinctrl to wakeup capable - * @np: pointer to struct device_node - * @enable: wakeup capable when set to true - * - * Returns 0 for success and error code for failure - */ -int msm_cdc_pinctrl_set_wakeup_capable(struct device_node *np, bool enable) -{ - struct msm_cdc_pinctrl_info *gpio_data; - int ret = 0; - u32 i = 0, temp = 0; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return -EINVAL; - if (gpio_data->chip_wakeup_reg) { - for (i = 0; i < gpio_data->wakeup_reg_count; i++) { - temp = ioread32(gpio_data->chip_wakeup_register[i]); - if (enable) - temp |= (1 << - gpio_data->chip_wakeup_maskbit[i]); - else - temp &= ~(1 << - gpio_data->chip_wakeup_maskbit[i]); - iowrite32(temp, gpio_data->chip_wakeup_register[i]); - } - } - return ret; -} -EXPORT_SYMBOL(msm_cdc_pinctrl_set_wakeup_capable); - -static int msm_cdc_pinctrl_probe(struct platform_device *pdev) -{ - int ret = 0; - struct msm_cdc_pinctrl_info *gpio_data; - u32 chip_wakeup_reg[MAX_GPIOS] = {0}; - u32 chip_wakeup_default_val[MAX_GPIOS] = {0}; - u32 i = 0, temp = 0; - int count = 0; - - gpio_data = devm_kzalloc(&pdev->dev, - sizeof(struct msm_cdc_pinctrl_info), - GFP_KERNEL); - if (!gpio_data) - return -ENOMEM; - - gpio_data->pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(gpio_data->pinctrl)) { - dev_err(&pdev->dev, "%s: Cannot get cdc gpio pinctrl:%ld\n", - __func__, PTR_ERR(gpio_data->pinctrl)); - ret = PTR_ERR(gpio_data->pinctrl); - goto err_pctrl_get; - } - - gpio_data->pinctrl_active = pinctrl_lookup_state( - gpio_data->pinctrl, "aud_active"); - if (IS_ERR_OR_NULL(gpio_data->pinctrl_active)) { - dev_err(&pdev->dev, "%s: Cannot get aud_active pinctrl state:%ld\n", - __func__, PTR_ERR(gpio_data->pinctrl_active)); - ret = PTR_ERR(gpio_data->pinctrl_active); - goto err_lookup_state; - } - - gpio_data->pinctrl_sleep = pinctrl_lookup_state( - gpio_data->pinctrl, "aud_sleep"); - if (IS_ERR_OR_NULL(gpio_data->pinctrl_sleep)) { - dev_err(&pdev->dev, "%s: Cannot get aud_sleep pinctrl state:%ld\n", - __func__, PTR_ERR(gpio_data->pinctrl_sleep)); - ret = PTR_ERR(gpio_data->pinctrl_sleep); - goto err_lookup_state; - } - /* skip setting to sleep state for LPI_TLMM GPIOs */ - if (!of_property_read_bool(pdev->dev.of_node, "qcom,lpi-gpios")) { - /* Set pinctrl state to aud_sleep by default */ - ret = pinctrl_select_state(gpio_data->pinctrl, - gpio_data->pinctrl_sleep); - if (ret) - dev_err(&pdev->dev, "%s: set cdc gpio sleep state fail: %d\n", - __func__, ret); - } - - - count = of_property_count_u32_elems(pdev->dev.of_node, "qcom,chip-wakeup-reg"); - if (count <= 0) - goto cdc_rst; - if (!of_property_read_u32_array(pdev->dev.of_node, "qcom,chip-wakeup-reg", - chip_wakeup_reg, count)) { - if (of_property_read_u32_array(pdev->dev.of_node, - "qcom,chip-wakeup-maskbit", - gpio_data->chip_wakeup_maskbit, count)) { - dev_err(&pdev->dev, - "chip-wakeup-maskbit needed if chip-wakeup-reg is defined!\n"); - goto cdc_rst; - } - gpio_data->chip_wakeup_reg = true; - for (i = 0; i < count; i++) { - gpio_data->chip_wakeup_register[i] = - devm_ioremap(&pdev->dev, chip_wakeup_reg[i], 0x4); - } - if (!of_property_read_u32_array(pdev->dev.of_node, - "qcom,chip-wakeup-default-val", - chip_wakeup_default_val, count)) { - for (i = 0; i < count; i++) { - temp = ioread32(gpio_data->chip_wakeup_register[i]); - if (chip_wakeup_default_val[i]) - temp |= (1 << - gpio_data->chip_wakeup_maskbit[i]); - else - temp &= ~(1 << - gpio_data->chip_wakeup_maskbit[i]); - iowrite32(temp, gpio_data->chip_wakeup_register[i]); - } - } - gpio_data->wakeup_reg_count = count; - } - -cdc_rst: - gpio_data->gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,cdc-rst-n-gpio", 0); - if (gpio_is_valid(gpio_data->gpio)) { - ret = gpio_request(gpio_data->gpio, "MSM_CDC_RESET"); - if (ret) { - dev_err(&pdev->dev, "%s: Failed to request gpio %d\n", - __func__, gpio_data->gpio); - goto err_lookup_state; - } - } - - dev_set_drvdata(&pdev->dev, gpio_data); - return 0; - -err_lookup_state: - devm_pinctrl_put(gpio_data->pinctrl); -err_pctrl_get: - devm_kfree(&pdev->dev, gpio_data); - return ret; -} - -static int msm_cdc_pinctrl_remove(struct platform_device *pdev) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = dev_get_drvdata(&pdev->dev); - - /* to free the requested gpio before exiting */ - if (gpio_data) { - if (gpio_is_valid(gpio_data->gpio)) - gpio_free(gpio_data->gpio); - - if (gpio_data->pinctrl) - devm_pinctrl_put(gpio_data->pinctrl); - } - - devm_kfree(&pdev->dev, gpio_data); - - return 0; -} - -static const struct of_device_id msm_cdc_pinctrl_match[] = { - {.compatible = "qcom,msm-cdc-pinctrl"}, - {} -}; - -static struct platform_driver msm_cdc_pinctrl_driver = { - .driver = { - .name = "msm-cdc-pinctrl", - .owner = THIS_MODULE, - .of_match_table = msm_cdc_pinctrl_match, - .suppress_bind_attrs = true, - }, - .probe = msm_cdc_pinctrl_probe, - .remove = msm_cdc_pinctrl_remove, -}; - -int msm_cdc_pinctrl_drv_init(void) -{ - return platform_driver_register(&msm_cdc_pinctrl_driver); -} - -void msm_cdc_pinctrl_drv_exit(void) -{ - platform_driver_unregister(&msm_cdc_pinctrl_driver); -} -MODULE_DESCRIPTION("MSM CODEC pin control platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/msm-cdc-supply.c b/techpack/audio/4.0/asoc/codecs/msm-cdc-supply.c deleted file mode 100644 index 220da9dc10f7..000000000000 --- a/techpack/audio/4.0/asoc/codecs/msm-cdc-supply.c +++ /dev/null @@ -1,566 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -#define CODEC_DT_MAX_PROP_SIZE 40 - -static int msm_cdc_dt_parse_vreg_info(struct device *dev, - struct cdc_regulator *cdc_vreg, - const char *name, bool is_ond) -{ - char prop_name[CODEC_DT_MAX_PROP_SIZE]; - struct device_node *regulator_node = NULL; - const __be32 *prop; - int len, rc; - u32 prop_val; - - /* Parse supply name */ - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "%s-supply", name); - - regulator_node = of_parse_phandle(dev->of_node, prop_name, 0); - if (!regulator_node) { - dev_err(dev, "%s: Looking up %s property in node %s failed", - __func__, prop_name, dev->of_node->full_name); - rc = -EINVAL; - goto done; - } - cdc_vreg->name = name; - cdc_vreg->ondemand = is_ond; - - /* Parse supply - voltage */ - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "qcom,%s-voltage", name); - prop = of_get_property(dev->of_node, prop_name, &len); - if (!prop || (len != (2 * sizeof(__be32)))) { - dev_err(dev, "%s: %s %s property\n", __func__, - prop ? "invalid format" : "no", prop_name); - rc = -EINVAL; - goto done; - } else { - cdc_vreg->min_uV = be32_to_cpup(&prop[0]); - cdc_vreg->max_uV = be32_to_cpup(&prop[1]); - } - - /* Parse supply - current */ - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "qcom,%s-current", name); - rc = of_property_read_u32(dev->of_node, prop_name, &prop_val); - if (rc) { - dev_err(dev, "%s: Looking up %s property in node %s failed", - __func__, prop_name, dev->of_node->full_name); - goto done; - } - cdc_vreg->optimum_uA = prop_val; - - dev_info(dev, "%s: %s: vol=[%d %d]uV, curr=[%d]uA, ond %d\n", - __func__, cdc_vreg->name, cdc_vreg->min_uV, cdc_vreg->max_uV, - cdc_vreg->optimum_uA, cdc_vreg->ondemand); - -done: - return rc; -} - -static int msm_cdc_parse_supplies(struct device *dev, - struct cdc_regulator *cdc_reg, - const char *sup_list, int sup_cnt, - bool is_ond) -{ - int idx, rc = 0; - const char *name = NULL; - - for (idx = 0; idx < sup_cnt; idx++) { - rc = of_property_read_string_index(dev->of_node, sup_list, idx, - &name); - if (rc) { - dev_err(dev, "%s: read string %s[%d] error (%d)\n", - __func__, sup_list, idx, rc); - goto done; - } - - dev_dbg(dev, "%s: Found cdc supply %s as part of %s\n", - __func__, name, sup_list); - - rc = msm_cdc_dt_parse_vreg_info(dev, &cdc_reg[idx], name, - is_ond); - if (rc) { - dev_err(dev, "%s: parse %s vreg info failed (%d)\n", - __func__, name, rc); - goto done; - } - } - -done: - return rc; -} - -static int msm_cdc_check_supply_param(struct device *dev, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - if (!dev) { - pr_err("%s: device is NULL\n", __func__); - return -ENODEV; - } - - if (!cdc_vreg || (num_supplies <= 0)) { - dev_err(dev, "%s: supply check failed: vreg: %pK, num_supplies: %d\n", - __func__, cdc_vreg, num_supplies); - return -EINVAL; - } - - return 0; -} - -/* - * msm_cdc_disable_ondemand_supply: - * Disable codec ondemand supply - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * @supply_name: Ondemand supply name to be enabled - * - * Return error code if supply disable is failed - */ -int msm_cdc_disable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, - char *supply_name) -{ - int rc, i; - - if ((!supply_name) || (!supplies)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand && - !strcmp(cdc_vreg[i].name, supply_name)) { - rc = regulator_disable(supplies[i].consumer); - if (rc) - dev_err(dev, "%s: failed to disable supply %s, err:%d\n", - __func__, supplies[i].supply, rc); - break; - } - } - if (i == num_supplies) { - dev_err(dev, "%s: not able to find supply %s\n", - __func__, supply_name); - rc = -EINVAL; - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_disable_ondemand_supply); - -/* - * msm_cdc_enable_ondemand_supply: - * Enable codec ondemand supply - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * @supply_name: Ondemand supply name to be enabled - * - * Return error code if supply enable is failed - */ -int msm_cdc_enable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, - char *supply_name) -{ - int rc, i; - - if ((!supply_name) || (!supplies)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand && - !strcmp(cdc_vreg[i].name, supply_name)) { - rc = regulator_enable(supplies[i].consumer); - if (rc) - dev_err(dev, "%s: failed to enable supply %s, rc: %d\n", - __func__, supplies[i].supply, rc); - break; - } - } - if (i == num_supplies) { - dev_err(dev, "%s: not able to find supply %s\n", - __func__, supply_name); - rc = -EINVAL; - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_enable_ondemand_supply); - -/* - * msm_cdc_disable_static_supplies: - * Disable codec static supplies - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply disable is failed - */ -int msm_cdc_disable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - int rc, i; - - if ((!dev) || (!supplies) || (!cdc_vreg)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand) - continue; - - rc = regulator_disable(supplies[i].consumer); - if (rc) - dev_err(dev, "%s: failed to disable supply %s, err:%d\n", - __func__, supplies[i].supply, rc); - else - dev_dbg(dev, "%s: disabled regulator %s\n", - __func__, supplies[i].supply); - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_disable_static_supplies); - -/* - * msm_cdc_release_supplies: - * Release codec power supplies - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply disable is failed - */ -int msm_cdc_release_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - int rc = 0; - int i; - - if ((!dev) || (!supplies) || (!cdc_vreg)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - msm_cdc_disable_static_supplies(dev, supplies, cdc_vreg, - num_supplies); - for (i = 0; i < num_supplies; i++) { - if (regulator_count_voltages(supplies[i].consumer) < 0) - continue; - - regulator_set_voltage(supplies[i].consumer, 0, - cdc_vreg[i].max_uV); - regulator_set_load(supplies[i].consumer, 0); - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_release_supplies); - -/* - * msm_cdc_enable_static_supplies: - * Enable codec static supplies - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply enable is failed - */ -int msm_cdc_enable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - int rc, i; - - if ((!dev) || (!supplies) || (!cdc_vreg)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand) - continue; - - rc = regulator_enable(supplies[i].consumer); - if (rc) { - dev_err(dev, "%s: failed to enable supply %s, rc: %d\n", - __func__, supplies[i].supply, rc); - break; - } - } - - while (rc && i--) - if (!cdc_vreg[i].ondemand) - regulator_disable(supplies[i].consumer); - - return rc; -} -EXPORT_SYMBOL(msm_cdc_enable_static_supplies); - -/* - * msm_cdc_init_supplies: - * Initialize codec static supplies - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply init is failed - */ -int msm_cdc_init_supplies(struct device *dev, - struct regulator_bulk_data **supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - return msm_cdc_init_supplies_v2(dev, supplies, cdc_vreg, - num_supplies, false); -} -EXPORT_SYMBOL(msm_cdc_init_supplies); - -/* - * msm_cdc_init_supplies_v2: - * Initialize codec static supplies. - * Initialize codec dynamic supplies based on vote_regulator_on_demand - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * @vote_regulator_on_demand: initialize codec dynamic supplies at runtime - * - * Return error code if supply init is failed - */ -int msm_cdc_init_supplies_v2(struct device *dev, - struct regulator_bulk_data **supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, u32 vote_regulator_on_demand) -{ - struct regulator_bulk_data *vsup; - int rc; - int i; - - if (!dev || !cdc_vreg) { - pr_err("%s: device pointer or dce_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - vsup = devm_kcalloc(dev, num_supplies, - sizeof(struct regulator_bulk_data), - GFP_KERNEL); - if (!vsup) - return -ENOMEM; - - for (i = 0; i < num_supplies; i++) { - if (!cdc_vreg[i].name) { - dev_err(dev, "%s: supply name not defined\n", - __func__); - rc = -EINVAL; - goto err_supply; - } - vsup[i].supply = cdc_vreg[i].name; - } - - rc = devm_regulator_bulk_get(dev, num_supplies, vsup); - if (rc) { - dev_err(dev, "%s: failed to get supplies (%d)\n", - __func__, rc); - goto err_supply; - } - - /* Set voltage and current on regulators */ - for (i = 0; i < num_supplies; i++) { - if (regulator_count_voltages(vsup[i].consumer) < 0) - continue; - - if (cdc_vreg[i].ondemand && vote_regulator_on_demand) - continue; - - rc = regulator_set_voltage(vsup[i].consumer, - cdc_vreg[i].min_uV, - cdc_vreg[i].max_uV); - if (rc) { - dev_err(dev, "%s: set regulator voltage failed for %s, err:%d\n", - __func__, vsup[i].supply, rc); - goto err_supply; - } - rc = regulator_set_load(vsup[i].consumer, - cdc_vreg[i].optimum_uA); - if (rc < 0) { - dev_err(dev, "%s: set regulator optimum mode failed for %s, err:%d\n", - __func__, vsup[i].supply, rc); - goto err_supply; - } - } - - *supplies = vsup; - - return 0; - -err_supply: - return rc; -} -EXPORT_SYMBOL(msm_cdc_init_supplies_v2); - -/* - * msm_cdc_get_power_supplies: - * Get codec power supplies from device tree. - * Allocate memory to hold regulator data for - * all power supplies. - * - * @dev: pointer to codec device - * @cdc_vreg: pointer to codec regulator - * @total_num_supplies: total number of supplies read from DT - * - * Return error code if supply disable is failed - */ -int msm_cdc_get_power_supplies(struct device *dev, - struct cdc_regulator **cdc_vreg, - int *total_num_supplies) -{ - const char *static_prop_name = "qcom,cdc-static-supplies"; - const char *ond_prop_name = "qcom,cdc-on-demand-supplies"; - const char *cp_prop_name = "qcom,cdc-cp-supplies"; - int static_sup_cnt = 0; - int ond_sup_cnt = 0; - int cp_sup_cnt = 0; - int num_supplies = 0; - struct cdc_regulator *cdc_reg; - int rc; - - if (!dev) { - pr_err("%s: device pointer is NULL\n", __func__); - return -EINVAL; - } - static_sup_cnt = of_property_count_strings(dev->of_node, - static_prop_name); - if (static_sup_cnt < 0) { - dev_err(dev, "%s: Failed to get static supplies(%d)\n", - __func__, static_sup_cnt); - rc = static_sup_cnt; - goto err_supply_cnt; - } - ond_sup_cnt = of_property_count_strings(dev->of_node, ond_prop_name); - if (ond_sup_cnt < 0) - ond_sup_cnt = 0; - - cp_sup_cnt = of_property_count_strings(dev->of_node, - cp_prop_name); - if (cp_sup_cnt < 0) - cp_sup_cnt = 0; - - num_supplies = static_sup_cnt + ond_sup_cnt + cp_sup_cnt; - if (num_supplies <= 0) { - dev_err(dev, "%s: supply count is 0 or negative\n", __func__); - rc = -EINVAL; - goto err_supply_cnt; - } - - cdc_reg = devm_kcalloc(dev, num_supplies, - sizeof(struct cdc_regulator), - GFP_KERNEL); - if (!cdc_reg) { - rc = -ENOMEM; - goto err_mem_alloc; - } - - rc = msm_cdc_parse_supplies(dev, cdc_reg, static_prop_name, - static_sup_cnt, false); - if (rc) { - dev_err(dev, "%s: failed to parse static supplies(%d)\n", - __func__, rc); - goto err_sup; - } - - rc = msm_cdc_parse_supplies(dev, &cdc_reg[static_sup_cnt], - ond_prop_name, ond_sup_cnt, - true); - if (rc) { - dev_err(dev, "%s: failed to parse demand supplies(%d)\n", - __func__, rc); - goto err_sup; - } - - rc = msm_cdc_parse_supplies(dev, - &cdc_reg[static_sup_cnt + ond_sup_cnt], - cp_prop_name, cp_sup_cnt, true); - if (rc) { - dev_err(dev, "%s: failed to parse cp supplies(%d)\n", - __func__, rc); - goto err_sup; - } - - *cdc_vreg = cdc_reg; - *total_num_supplies = num_supplies; - - return 0; - -err_sup: -err_supply_cnt: -err_mem_alloc: - return rc; -} -EXPORT_SYMBOL(msm_cdc_get_power_supplies); diff --git a/techpack/audio/4.0/asoc/codecs/msm_hdmi_codec_rx.c b/techpack/audio/4.0/asoc/codecs/msm_hdmi_codec_rx.c deleted file mode 100644 index ff1ce2a442bd..000000000000 --- a/techpack/audio/4.0/asoc/codecs/msm_hdmi_codec_rx.c +++ /dev/null @@ -1,848 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MSM_EXT_DISP_PCM_RATES SNDRV_PCM_RATE_48000 -#define AUD_EXT_DISP_ACK_DISCONNECT (AUDIO_ACK_CONNECT ^ AUDIO_ACK_CONNECT) -#define AUD_EXT_DISP_ACK_CONNECT (AUDIO_ACK_CONNECT) -#define AUD_EXT_DISP_ACK_ENABLE (AUDIO_ACK_SET_ENABLE | AUDIO_ACK_ENABLE) - -#define SOC_EXT_DISP_AUDIO_TYPE(index) \ - static SOC_ENUM_SINGLE_DECL(ext_disp_audio_type##index, SND_SOC_NOPM, \ - index, ext_disp_audio_type_text) -#define SOC_EXT_DISP_AUDIO_ACK_STATE(index) \ - static SOC_ENUM_SINGLE_DECL(ext_disp_audio_ack_state##index, \ - SND_SOC_NOPM, index, ext_disp_audio_ack_text) - -#define SWITCH_DP_CODEC(codec_info, codec_data, dai_id) \ - codec_info.type = EXT_DISPLAY_TYPE_DP; \ - codec_info.ctrl_id = codec_data->ctl[dai_id]; \ - codec_info.stream_id = codec_data->stream[dai_id]; \ - msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, \ - &codec_info) - -enum { - DP_CONTROLLER0 = 0, - DP_CONTROLLER_MAX, -}; - -enum { - DP_STREAM0 = 0, - DP_STREAM1, - DP_STREAM_MAX, -}; - -/* - * Dai id cannot be zero, if component has more than one dai and dai id - * is used to differentiate between them - */ -enum { - DP_DAI1 = 1, - DP_DAI2, - HDMI_DAI, - DP_DAI_MAX, -}; - -static const char *const ext_disp_audio_type_text[] = {"None", "HDMI", "DP"}; -static const char *const ext_disp_audio_ack_text[] = {"Disconnect", "Connect", - "Ack_Enable"}; - -SOC_EXT_DISP_AUDIO_TYPE(1); -SOC_EXT_DISP_AUDIO_ACK_STATE(1); -SOC_EXT_DISP_AUDIO_TYPE(2); -SOC_EXT_DISP_AUDIO_ACK_STATE(2); - -struct msm_ext_disp_audio_codec_rx_data { - struct platform_device *ext_disp_core_pdev; - struct msm_ext_disp_audio_codec_ops ext_disp_ops; - struct mutex dp_ops_lock; - int cable_status[DP_DAI_MAX]; - int stream[DP_DAI_MAX]; - int ctl[DP_DAI_MAX]; -}; - -static int msm_ext_disp_edid_ctl_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - struct msm_ext_disp_audio_edid_blk edid_blk; - int rc = 0; - struct msm_ext_disp_codec_id codec_info; - int dai_id = kcontrol->private_value; - - codec_data = snd_soc_codec_get_drvdata(codec); - - if (!codec_data) { - dev_err(codec->dev, "%s: codec_data is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) { - dev_dbg(codec->dev, "%s: get_audio_edid_blk() is NULL\n", - __func__); - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = 0; - mutex_unlock(&codec_data->dp_ops_lock); - return 0; - } - - rc = codec_data->ext_disp_ops.get_audio_edid_blk( - codec_data->ext_disp_core_pdev, &edid_blk); - mutex_unlock(&codec_data->dp_ops_lock); - if (rc >= 0) { - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = edid_blk.audio_data_blk_size + - edid_blk.spk_alloc_data_blk_size; - } - - dev_dbg(codec->dev, "%s: count: %d\n", __func__, uinfo->count); - - return rc; -} - -static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - struct msm_ext_disp_audio_edid_blk edid_blk; - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - int dai_id = kcontrol->private_value; - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data || !codec_data->ext_disp_ops.get_audio_edid_blk) { - dev_err(codec->dev, "%s: codec_data or get_audio_edid_blk() is NULL\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) { - dev_err(codec->dev, "%s: codec_data or get_audio_edid_blk() is NULL\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return -EINVAL; - } - - rc = codec_data->ext_disp_ops.get_audio_edid_blk( - codec_data->ext_disp_core_pdev, &edid_blk); - mutex_unlock(&codec_data->dp_ops_lock); - if (rc >= 0) { - if (sizeof(ucontrol->value.bytes.data) < - (edid_blk.audio_data_blk_size + - edid_blk.spk_alloc_data_blk_size)) { - dev_err(codec->dev, - "%s: Not enough memory to copy EDID data\n", - __func__); - return -ENOMEM; - } - - memcpy(ucontrol->value.bytes.data, - edid_blk.audio_data_blk, - edid_blk.audio_data_blk_size); - memcpy((ucontrol->value.bytes.data + - edid_blk.audio_data_blk_size), - edid_blk.spk_alloc_data_blk, - edid_blk.spk_alloc_data_blk_size); - - dev_dbg(codec->dev, "%s: data_blk_size:%d, spk_alloc_data_blk_size:%d\n", - __func__, edid_blk.audio_data_blk_size, - edid_blk.spk_alloc_data_blk_size); - } - - return rc; -} - -static int msm_ext_disp_audio_type_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - enum msm_ext_disp_cable_state cable_state; - enum msm_ext_disp_type disp_type; - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l; - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, "%s: codec_data is NULL\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - - if (!codec_data->ext_disp_ops.get_audio_edid_blk || - !codec_data->ext_disp_ops.get_intf_id || rc) { - dev_err(codec->dev, "%s: get_audio_edid_blk() or get_intf_id is NULL\n", - __func__); - rc = -EINVAL; - goto cable_err; - } - - cable_state = codec_data->ext_disp_ops.cable_status( - codec_data->ext_disp_core_pdev, 1); - if (cable_state < 0) { - dev_err(codec->dev, "%s: Error retrieving cable state from ext_disp, err:%d\n", - __func__, cable_state); - rc = cable_state; - goto cable_err; - } - - codec_data->cable_status[dai_id] = cable_state; - if (cable_state == EXT_DISPLAY_CABLE_DISCONNECT) { - dev_err(codec->dev, "%s: Display cable disconnected\n", - __func__); - ucontrol->value.integer.value[0] = 0; - rc = 0; - goto cable_err; - } - - disp_type = codec_data->ext_disp_ops.get_intf_id( - codec_data->ext_disp_core_pdev); - mutex_unlock(&codec_data->dp_ops_lock); - if (disp_type >= 0) { - switch (disp_type) { - case EXT_DISPLAY_TYPE_DP: - ucontrol->value.integer.value[0] = 2; - rc = 0; - break; - case EXT_DISPLAY_TYPE_HDMI: - ucontrol->value.integer.value[0] = 1; - rc = 0; - break; - default: - rc = -EINVAL; - dev_err(codec->dev, "%s: Invalid disp_type:%d\n", - __func__, disp_type); - goto done; - } - dev_dbg(codec->dev, "%s: Display type: %d\n", - __func__, disp_type); - } else { - dev_err(codec->dev, "%s: Error retrieving disp_type from ext_disp, err:%d\n", - __func__, disp_type); - rc = disp_type; - } - return rc; - -cable_err: - mutex_unlock(&codec_data->dp_ops_lock); -done: - return rc; -} - -static int msm_ext_disp_audio_ack_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - u32 ack_state = 0; - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l; - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, - "%s: codec_data is NULL\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - - if (!codec_data->ext_disp_ops.acknowledge || rc) { - dev_err(codec->dev, - "%s: codec_data ops acknowledge() is NULL\n", - __func__); - rc = -EINVAL; - goto err; - } - - switch (ucontrol->value.enumerated.item[0]) { - case 0: - ack_state = AUD_EXT_DISP_ACK_DISCONNECT; - break; - case 1: - ack_state = AUD_EXT_DISP_ACK_CONNECT; - break; - case 2: - ack_state = AUD_EXT_DISP_ACK_ENABLE; - break; - default: - rc = -EINVAL; - dev_err(codec->dev, - "%s: invalid value %d for mixer ctl\n", - __func__, ucontrol->value.enumerated.item[0]); - goto err; - } - dev_dbg(codec->dev, "%s: control %d, ack set value 0x%x\n", - __func__, ucontrol->value.enumerated.item[0], ack_state); - - rc = codec_data->ext_disp_ops.acknowledge( - codec_data->ext_disp_core_pdev, ack_state); - mutex_unlock(&codec_data->dp_ops_lock); - if (rc < 0) { - dev_err(codec->dev, "%s: error from acknowledge(), err:%d\n", - __func__, rc); - } - return rc; - -err: - mutex_unlock(&codec_data->dp_ops_lock); - return rc; -} - -static int msm_ext_disp_audio_device_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - int rc = 0; - int dai_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (dai_id < 0 || dai_id > DP_DAI2) { - dev_err(codec->dev, - "%s: invalid dai id: %d\n", __func__, dai_id); - rc = -EINVAL; - goto done; - } - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, - "%s: codec_data or ops acknowledge() is NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - ucontrol->value.integer.value[0] = codec_data->ctl[dai_id]; - ucontrol->value.integer.value[1] = codec_data->stream[dai_id]; - -done: - return rc; -} - -static int msm_ext_disp_audio_device_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - int rc = 0; - int dai_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (dai_id < 0 || dai_id > DP_DAI2) { - dev_err(codec->dev, - "%s: invalid dai id: %d\n", __func__, dai_id); - rc = -EINVAL; - goto done; - } - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, - "%s: codec_data or ops acknowledge() is NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - if ((ucontrol->value.integer.value[0] > (DP_CONTROLLER_MAX - 1)) || - (ucontrol->value.integer.value[1] > (DP_STREAM_MAX - 1)) || - (ucontrol->value.integer.value[0] < 0) || - (ucontrol->value.integer.value[1] < 0)) { - dev_err(codec->dev, - "%s: DP audio control index invalid\n", - __func__); - rc = -EINVAL; - goto done; - } - - mutex_lock(&codec_data->dp_ops_lock); - codec_data->ctl[dai_id] = ucontrol->value.integer.value[0]; - codec_data->stream[dai_id] = ucontrol->value.integer.value[1]; - mutex_unlock(&codec_data->dp_ops_lock); - -done: - return rc; -} - -static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_VOLATILE, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "HDMI EDID", - .info = msm_ext_disp_edid_ctl_info, - .get = msm_ext_disp_edid_get, - .private_value = HDMI_DAI, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_VOLATILE, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "Display Port EDID", - .info = msm_ext_disp_edid_ctl_info, - .get = msm_ext_disp_edid_get, - .private_value = DP_DAI1, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_VOLATILE, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "Display Port1 EDID", - .info = msm_ext_disp_edid_ctl_info, - .get = msm_ext_disp_edid_get, - .private_value = DP_DAI2, - }, - SOC_ENUM_EXT("External Display Type", - ext_disp_audio_type1, - msm_ext_disp_audio_type_get, NULL), - SOC_ENUM_EXT("External Display1 Type", - ext_disp_audio_type2, - msm_ext_disp_audio_type_get, NULL), - SOC_ENUM_EXT("External Display Audio Ack", - ext_disp_audio_ack_state1, - NULL, msm_ext_disp_audio_ack_set), - SOC_ENUM_EXT("External Display1 Audio Ack", - ext_disp_audio_ack_state2, - NULL, msm_ext_disp_audio_ack_set), - - SOC_SINGLE_MULTI_EXT("External Display Audio Device", - SND_SOC_NOPM, DP_DAI1, DP_STREAM_MAX - 1, 0, 2, - msm_ext_disp_audio_device_get, - msm_ext_disp_audio_device_set), - SOC_SINGLE_MULTI_EXT("External Display1 Audio Device", - SND_SOC_NOPM, DP_DAI2, DP_STREAM_MAX - 1, 0, 2, - msm_ext_disp_audio_device_get, - msm_ext_disp_audio_device_set), -}; - -static int msm_ext_disp_audio_codec_rx_dai_startup( - struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int ret = 0, rc = 0; - struct msm_ext_disp_codec_id codec_info; - struct msm_ext_disp_audio_codec_rx_data *codec_data = - dev_get_drvdata(dai->codec->dev); - - if (!codec_data) { - dev_err(dai->dev, "%s() codec_data is null\n", - __func__); - return -EINVAL; - } - - dev_dbg(dai->codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai->id], codec_data->stream[dai->id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai->id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - - if (!codec_data->ext_disp_ops.cable_status || rc) { - dev_err(dai->dev, "%s() cable_status is null\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return -EINVAL; - } - - codec_data->cable_status[dai->id] = - codec_data->ext_disp_ops.cable_status( - codec_data->ext_disp_core_pdev, 1); - mutex_unlock(&codec_data->dp_ops_lock); - if (codec_data->cable_status[dai->id] < 0) { - dev_err(dai->dev, - "%s() ext disp core is not ready (ret val = %d)\n", - __func__, codec_data->cable_status[dai->id]); - ret = codec_data->cable_status[dai->id]; - } else if (!codec_data->cable_status[dai->id]) { - dev_err(dai->dev, - "%s() ext disp cable is not connected (ret val = %d)\n", - __func__, codec_data->cable_status[dai->id]); - ret = -ENODEV; - } - - return ret; -} - -static int msm_ext_disp_audio_codec_rx_dai_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - u32 channel_allocation = 0; - u32 level_shift = 0; /* 0dB */ - bool down_mix = 0; - u32 num_channels = params_channels(params); - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - struct msm_ext_disp_audio_setup_params audio_setup_params = {0}; - - struct msm_ext_disp_audio_codec_rx_data *codec_data = - dev_get_drvdata(dai->codec->dev); - - if (!codec_data) { - dev_err(dai->dev, "%s() codec_data is null\n", - __func__); - return -EINVAL; - } - - dev_dbg(dai->codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai->id], codec_data->stream[dai->id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai->id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - - if (!codec_data->ext_disp_ops.audio_info_setup || rc) { - dev_err(dai->dev, "%s: audio_info_setup is null\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return -EINVAL; - } - mutex_unlock(&codec_data->dp_ops_lock); - - if (codec_data->cable_status[dai->id] < 0) { - dev_err_ratelimited(dai->dev, - "%s() ext disp core is not ready (ret val = %d)\n", - __func__, codec_data->cable_status[dai->id]); - return codec_data->cable_status[dai->id]; - } else if (!codec_data->cable_status[dai->id]) { - dev_err_ratelimited(dai->dev, - "%s() ext disp cable is not connected (ret val = %d)\n", - __func__, codec_data->cable_status[dai->id]); - return -ENODEV; - } - - /*refer to HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4*/ - switch (num_channels) { - case 2: - channel_allocation = 0; - break; - case 3: - channel_allocation = 0x02;/*default to FL/FR/FC*/ - audio_setup_params.sample_present = 0x3; - break; - case 4: - channel_allocation = 0x06;/*default to FL/FR/FC/RC*/ - audio_setup_params.sample_present = 0x7; - break; - case 5: - channel_allocation = 0x0A;/*default to FL/FR/FC/RR/RL*/ - audio_setup_params.sample_present = 0x7; - break; - case 6: - channel_allocation = 0x0B; - audio_setup_params.sample_present = 0x7; - break; - case 7: - channel_allocation = 0x12;/*default to FL/FR/FC/RL/RR/RRC/RLC*/ - audio_setup_params.sample_present = 0xf; - break; - case 8: - channel_allocation = 0x13; - audio_setup_params.sample_present = 0xf; - break; - default: - dev_err(dai->dev, "invalid Channels = %u\n", num_channels); - return -EINVAL; - } - - dev_dbg(dai->dev, - "%s() num_ch %u samplerate %u channel_allocation = %u\n", - __func__, num_channels, params_rate(params), - channel_allocation); - - audio_setup_params.sample_rate_hz = params_rate(params); - audio_setup_params.num_of_channels = num_channels; - audio_setup_params.channel_allocation = channel_allocation; - audio_setup_params.level_shift = level_shift; - audio_setup_params.down_mix = down_mix; - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai->id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if (rc) - goto end; - rc = codec_data->ext_disp_ops.audio_info_setup( - codec_data->ext_disp_core_pdev, &audio_setup_params); -end: - mutex_unlock(&codec_data->dp_ops_lock); - if (rc < 0) { - dev_err_ratelimited(dai->dev, - "%s() ext disp core is not ready, rc: %d\n", - __func__, rc); - } - - return rc; -} - -static void msm_ext_disp_audio_codec_rx_dai_shutdown( - struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_ext_disp_codec_id codec_info; - - struct msm_ext_disp_audio_codec_rx_data *codec_data = - dev_get_drvdata(dai->codec->dev); - - if (!codec_data) { - dev_err(dai->dev, "%s() codec_data is null\n", - __func__); - return; - } - - dev_dbg(dai->codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai->id], codec_data->stream[dai->id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai->id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - - if (!codec_data->ext_disp_ops.teardown_done || - !codec_data->ext_disp_ops.cable_status || rc) { - dev_err(dai->dev, "%s: teardown_done or cable_status is null\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return; - } - - rc = codec_data->ext_disp_ops.cable_status( - codec_data->ext_disp_core_pdev, 0); - if (rc < 0) { - dev_err(dai->dev, - "%s: ext disp core had problems releasing audio flag\n", - __func__); - } - - codec_data->ext_disp_ops.teardown_done( - codec_data->ext_disp_core_pdev); - mutex_unlock(&codec_data->dp_ops_lock); -} - -static int msm_ext_disp_audio_codec_rx_probe(struct snd_soc_codec *codec) -{ - struct msm_ext_disp_audio_codec_rx_data *codec_data; - struct device_node *of_node_parent = NULL; - - codec_data = kzalloc(sizeof(struct msm_ext_disp_audio_codec_rx_data), - GFP_KERNEL); - - if (!codec_data) { - dev_err(codec->dev, "%s(): fail to allocate dai data\n", - __func__); - return -ENOMEM; - } - - of_node_parent = of_get_parent(codec->dev->of_node); - if (!of_node_parent) { - dev_err(codec->dev, "%s(): Parent device tree node not found\n", - __func__); - kfree(codec_data); - return -ENODEV; - } - - codec_data->ext_disp_core_pdev = of_find_device_by_node(of_node_parent); - if (!codec_data->ext_disp_core_pdev) { - dev_err(codec->dev, "%s(): can't get parent pdev\n", __func__); - kfree(codec_data); - return -ENODEV; - } - - if (msm_ext_disp_register_audio_codec(codec_data->ext_disp_core_pdev, - &codec_data->ext_disp_ops)) { - dev_err(codec->dev, "%s(): can't register with ext disp core", - __func__); - kfree(codec_data); - return -ENODEV; - } - - mutex_init(&codec_data->dp_ops_lock); - dev_set_drvdata(codec->dev, codec_data); - - dev_dbg(codec->dev, "%s(): registered %s with ext disp core\n", - __func__, codec->component.name); - - return 0; -} - -static int msm_ext_disp_audio_codec_rx_remove(struct snd_soc_codec *codec) -{ - struct msm_ext_disp_audio_codec_rx_data *codec_data; - - codec_data = dev_get_drvdata(codec->dev); - mutex_destroy(&codec_data->dp_ops_lock); - kfree(codec_data); - - return 0; -} - -static struct snd_soc_dai_ops msm_ext_disp_audio_codec_rx_dai_ops = { - .startup = msm_ext_disp_audio_codec_rx_dai_startup, - .hw_params = msm_ext_disp_audio_codec_rx_dai_hw_params, - .shutdown = msm_ext_disp_audio_codec_rx_dai_shutdown -}; - -static struct snd_soc_dai_driver msm_ext_disp_audio_codec_rx_dais[] = { - { - .name = "msm_hdmi_audio_codec_rx_dai", - .id = HDMI_DAI, - .playback = { - .stream_name = "HDMI Playback", - .channels_min = 1, - .channels_max = 8, - .rate_min = 48000, - .rate_max = 48000, - .rates = MSM_EXT_DISP_PCM_RATES, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .ops = &msm_ext_disp_audio_codec_rx_dai_ops, - }, - { - .name = "msm_dp_audio_codec_rx_dai", - .id = DP_DAI1, - .playback = { - .stream_name = "Display Port Playback", - .channels_min = 1, - .channels_max = 8, - .rate_min = 48000, - .rate_max = 192000, - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - }, - .ops = &msm_ext_disp_audio_codec_rx_dai_ops, - }, - { - .name = "msm_dp_audio_codec_rx1_dai", - .id = DP_DAI2, - .playback = { - .stream_name = "Display Port1 Playback", - .channels_min = 1, - .channels_max = 8, - .rate_min = 48000, - .rate_max = 192000, - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - }, - .ops = &msm_ext_disp_audio_codec_rx_dai_ops, - }, -}; - -static struct snd_soc_codec_driver msm_ext_disp_audio_codec_rx_soc_driver = { - .probe = msm_ext_disp_audio_codec_rx_probe, - .remove = msm_ext_disp_audio_codec_rx_remove, - .component_driver = { - .controls = msm_ext_disp_codec_rx_controls, - .num_controls = ARRAY_SIZE(msm_ext_disp_codec_rx_controls), - }, -}; - -static int msm_ext_disp_audio_codec_rx_plat_probe( - struct platform_device *pdev) -{ - dev_dbg(&pdev->dev, "%s(): dev name %s\n", __func__, - dev_name(&pdev->dev)); - - return snd_soc_register_codec(&pdev->dev, - &msm_ext_disp_audio_codec_rx_soc_driver, - msm_ext_disp_audio_codec_rx_dais, - ARRAY_SIZE(msm_ext_disp_audio_codec_rx_dais)); -} - -static int msm_ext_disp_audio_codec_rx_plat_remove( - struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} -static const struct of_device_id msm_ext_disp_audio_codec_rx_dt_match[] = { - { .compatible = "qcom,msm-ext-disp-audio-codec-rx", }, - {} -}; -MODULE_DEVICE_TABLE(of, msm_ext_disp_audio_codec_rx_dt_match); - -static struct platform_driver msm_ext_disp_audio_codec_rx_driver = { - .driver = { - .name = "msm-ext-disp-audio-codec-rx", - .owner = THIS_MODULE, - .of_match_table = msm_ext_disp_audio_codec_rx_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_ext_disp_audio_codec_rx_plat_probe, - .remove = msm_ext_disp_audio_codec_rx_plat_remove, -}; - -static int __init msm_ext_disp_audio_codec_rx_init(void) -{ - int rc = 0; - - rc = platform_driver_register(&msm_ext_disp_audio_codec_rx_driver); - if (rc) { - pr_err("%s: failed to register ext disp codec driver err:%d\n", - __func__, rc); - } - - return rc; -} -module_init(msm_ext_disp_audio_codec_rx_init); - -static void __exit msm_ext_disp_audio_codec_rx_exit(void) -{ - platform_driver_unregister(&msm_ext_disp_audio_codec_rx_driver); -} -module_exit(msm_ext_disp_audio_codec_rx_exit); - -MODULE_DESCRIPTION("MSM External Display Audio CODEC Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/msm_stub.c b/techpack/audio/4.0/asoc/codecs/msm_stub.c deleted file mode 100644 index 12a03c375948..000000000000 --- a/techpack/audio/4.0/asoc/codecs/msm_stub.c +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2011-2014, 2017-2019 The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include - -/* A dummy driver useful only to advertise hardware parameters */ -static struct snd_soc_dai_driver msm_stub_dais[] = { - { - .name = "msm-stub-rx", - .playback = { /* Support maximum range */ - .stream_name = "Playback", - .channels_min = 1, - .channels_max = 8, - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - }, - { - .name = "msm-stub-tx", - .capture = { /* Support maximum range */ - .stream_name = "Record", - .channels_min = 1, - .channels_max = 8, - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - }, - }, -}; - -static struct snd_soc_codec_driver soc_msm_stub = {}; - -static int msm_stub_dev_probe(struct platform_device *pdev) -{ - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - - return snd_soc_register_codec(&pdev->dev, - &soc_msm_stub, msm_stub_dais, ARRAY_SIZE(msm_stub_dais)); -} - -static int msm_stub_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} -static const struct of_device_id msm_stub_codec_dt_match[] = { - { .compatible = "qcom,msm-stub-codec", }, - {} -}; - -static struct platform_driver msm_stub_driver = { - .driver = { - .name = "msm-stub-codec", - .owner = THIS_MODULE, - .of_match_table = msm_stub_codec_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_stub_dev_probe, - .remove = msm_stub_dev_remove, -}; - -static int __init msm_stub_init(void) -{ - return platform_driver_register(&msm_stub_driver); -} -module_init(msm_stub_init); - -static void __exit msm_stub_exit(void) -{ - platform_driver_unregister(&msm_stub_driver); -} -module_exit(msm_stub_exit); - -MODULE_DESCRIPTION("Generic MSM CODEC driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-clsh.c b/techpack/audio/4.0/asoc/codecs/wcd-clsh.c deleted file mode 100644 index 94ef94415e91..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-clsh.c +++ /dev/null @@ -1,588 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -#define WCD_USLEEP_RANGE 50 - -static void (*clsh_state_fp[NUM_CLSH_STATES])(struct snd_soc_codec *, - struct wcd_clsh_cdc_info *, - u8 req_state, bool en, int mode); - -static const char *mode_to_str(int mode) -{ - switch (mode) { - case CLS_H_NORMAL: - return WCD_CLSH_STRINGIFY(CLS_H_NORMAL); - case CLS_H_HIFI: - return WCD_CLSH_STRINGIFY(CLS_H_HIFI); - case CLS_H_LOHIFI: - return WCD_CLSH_STRINGIFY(CLS_H_LOHIFI); - case CLS_H_LP: - return WCD_CLSH_STRINGIFY(CLS_H_LP); - case CLS_H_ULP: - return WCD_CLSH_STRINGIFY(CLS_H_ULP); - case CLS_AB: - return WCD_CLSH_STRINGIFY(CLS_AB); - case CLS_AB_HIFI: - return WCD_CLSH_STRINGIFY(CLS_AB_HIFI); - case CLS_AB_LP: - return WCD_CLSH_STRINGIFY(CLS_AB_LP); - case CLS_AB_LOHIFI: - return WCD_CLSH_STRINGIFY(CLS_AB_LOHIFI); - default: - return WCD_CLSH_STRINGIFY(CLS_H_INVALID); - }; -} - -static const char *state_to_str(u8 state, char *buf, size_t buflen) -{ - int i; - int cnt = 0; - /* - * This array of strings should match with enum wcd_clsh_state_bit. - */ - static const char *const states[] = { - "STATE_EAR", - "STATE_HPH_L", - "STATE_HPH_R", - "STATE_AUX", - }; - - if (state == WCD_CLSH_STATE_IDLE) { - snprintf(buf, buflen, "[STATE_IDLE]"); - goto done; - } - - buf[0] = '\0'; - for (i = 0; i < ARRAY_SIZE(states); i++) { - if (!(state & (1 << i))) - continue; - cnt = snprintf(buf, buflen - cnt - 1, "%s%s%s", buf, - buf[0] == '\0' ? "[" : "|", - states[i]); - } - if (cnt > 0) - strlcat(buf + cnt, "]", buflen); - -done: - if (buf[0] == '\0') - snprintf(buf, buflen, "[STATE_UNKNOWN]"); - return buf; -} - -static inline int wcd_clsh_get_int_mode(struct wcd_clsh_cdc_info *clsh_d, - int clsh_state) -{ - int mode; - - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_AUX)) - mode = CLS_NONE; - else - mode = clsh_d->interpolator_modes[ffs(clsh_state)]; - - return mode; -} - -static inline void wcd_clsh_set_int_mode(struct wcd_clsh_cdc_info *clsh_d, - int clsh_state, int mode) -{ - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_AUX)) - return; - - clsh_d->interpolator_modes[ffs(clsh_state)] = mode; -} - -static inline void wcd_clsh_set_buck_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB_LOHIFI) - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x08, 0x08); /* set to HIFI */ - else - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x08, 0x00); /* set to default */ -} - -static inline void wcd_clsh_set_flyback_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB_LOHIFI) { - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x80); - } else { - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x04, 0x00); /* set to Default */ - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x70); - } -} - -static inline void wcd_clsh_force_iq_ctl(struct snd_soc_codec *codec, - int mode, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, 0xA0); - /* 100usec delay is needed as per HW requirement */ - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_3, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_2, - 0xFF, 0x1C); - if (mode == CLS_H_LOHIFI || mode == CLS_AB_LOHIFI) { - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x20); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0xC0); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x02); - } - } else { - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x00); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0x80); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x06); - } -} - -static void wcd_clsh_buck_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - int mode, - bool enable) -{ - /* enable/disable buck */ - if ((enable && (++clsh_d->buck_users == 1)) || - (!enable && (--clsh_d->buck_users == 0))) { - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - (1 << 7), (enable << 7)); - /* - * 500us sleep is required after buck enable/disable - * as per HW requirement - */ - usleep_range(500, 510); - if (mode == CLS_H_LOHIFI || mode == CLS_H_ULP || - mode == CLS_H_HIFI || mode == CLS_H_LP) - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_3, - 0x02, 0x00); - - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_2, 0xFF, 0x3A); - /* 500usec delay is needed as per HW requirement */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); - } - dev_dbg(codec->dev, "%s: buck_users %d, enable %d, mode: %s\n", - __func__, clsh_d->buck_users, enable, mode_to_str(mode)); -} - -static void wcd_clsh_flyback_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - int mode, - bool enable) -{ - /* enable/disable flyback */ - if ((enable && (++clsh_d->flyback_users == 1)) || - (!enable && (--clsh_d->flyback_users == 0))) { - snd_soc_update_bits(codec, - WCD9XXX_FLYBACK_VNEG_CTRL_1, - 0xE0, 0xE0); - snd_soc_update_bits(codec, - WCD9XXX_ANA_RX_SUPPLIES, - (1 << 6), (enable << 6)); - /* - * 100us sleep is required after flyback enable/disable - * as per HW requirement - */ - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, 0xE0); - /* 500usec delay is needed as per HW requirement */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); - } - dev_dbg(codec->dev, "%s: flyback_users %d, enable %d, mode: %s\n", - __func__, clsh_d->flyback_users, enable, mode_to_str(mode)); -} - -/* - * Function: wcd_clsh_set_hph_mode - * Params: soc component, hph mode class - * Description: - * This function updates class H mode configuration based on - * the input mode. - */ -void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec, - int mode) -{ - u8 val = 0; - - switch (mode) { - case CLS_H_NORMAL: - val = 0x00; - break; - case CLS_AB: - case CLS_H_ULP: - val = 0x0C; - break; - case CLS_AB_HIFI: - case CLS_H_HIFI: - val = 0x08; - break; - case CLS_H_LP: - case CLS_H_LOHIFI: - case CLS_AB_LP: - case CLS_AB_LOHIFI: - val = 0x04; - break; - default: - dev_err(codec->dev, "%s:Invalid mode %d\n", __func__, mode); - return; - }; - - snd_soc_update_bits(codec, WCD9XXX_ANA_HPH, 0x0C, val); -} -EXPORT_SYMBOL(wcd_clsh_set_hph_mode); - -static void wcd_clsh_set_flyback_current(struct snd_soc_codec *codec, int mode) -{ - - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0x0F, 0x0A); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0xF0, 0xA0); - /* Sleep needed to avoid click and pop as per HW requirement */ - usleep_range(100, 110); -} - -static void wcd_clsh_set_buck_regulator_mode(struct snd_soc_codec *codec, - int mode) -{ - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x02, 0x00); -} - -static void wcd_clsh_state_ear_aux(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_aux(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_st(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_r(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_dbg(codec->dev, "%s: Normal mode not applicable for hph_r\n", - __func__); - return; - } - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode, true); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - /* buck and flyback set to default mode and disable */ - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_hph_l(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_dbg(codec->dev, "%s: Normal mode not applicable for hph_l\n", - __func__); - return; - } - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode, true); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - /* set buck and flyback to Default Mode */ - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_aux(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - } else { - wcd_clsh_buck_ctrl(codec, clsh_d, mode, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode, true); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - /* set buck and flyback to Default Mode */ - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_err(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - char msg[128]; - - dev_err(codec->dev, - "%s Wrong request for class H state machine requested to %s %s\n", - __func__, is_enable ? "enable" : "disable", - state_to_str(req_state, msg, sizeof(msg))); -} - -/* - * Function: wcd_clsh_is_state_valid - * Params: state - * Description: - * Provides information on valid states of Class H configuration - */ -static bool wcd_clsh_is_state_valid(u8 state) -{ - switch (state) { - case WCD_CLSH_STATE_IDLE: - case WCD_CLSH_STATE_EAR: - case WCD_CLSH_STATE_HPHL: - case WCD_CLSH_STATE_HPHR: - case WCD_CLSH_STATE_HPH_ST: - case WCD_CLSH_STATE_AUX: - case WCD_CLSH_STATE_HPHL_AUX: - case WCD_CLSH_STATE_HPHR_AUX: - case WCD_CLSH_STATE_HPH_ST_AUX: - case WCD_CLSH_STATE_EAR_AUX: - case WCD_CLSH_STATE_HPHL_EAR: - case WCD_CLSH_STATE_HPHR_EAR: - case WCD_CLSH_STATE_HPH_ST_EAR: - return true; - default: - return false; - }; -} - -/* - * Function: wcd_cls_h_fsm - * Params: codec, cdc_clsh_d, req_state, req_type, clsh_event - * Description: - * This function handles PRE DAC and POST DAC conditions of different devices - * and updates class H configuration of different combination of devices - * based on validity of their states. cdc_clsh_d will contain current - * class h state information - */ -void wcd_cls_h_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode) -{ - u8 old_state, new_state; - char msg0[128], msg1[128]; - - switch (clsh_event) { - case WCD_CLSH_EVENT_PRE_DAC: - old_state = cdc_clsh_d->state; - new_state = old_state | req_state; - - if (!wcd_clsh_is_state_valid(new_state)) { - dev_err(codec->dev, - "%s: Class-H not a valid new state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, int_mode); - (*clsh_state_fp[new_state]) (codec, cdc_clsh_d, req_state, - CLSH_REQ_ENABLE, int_mode); - dev_dbg(codec->dev, - "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, sizeof(msg1))); - break; - case WCD_CLSH_EVENT_POST_PA: - old_state = cdc_clsh_d->state; - new_state = old_state & (~req_state); - if (new_state < NUM_CLSH_STATES) { - if (!wcd_clsh_is_state_valid(old_state)) { - dev_err(codec->dev, - "%s:Invalid old state:%s\n", - __func__, - state_to_str(old_state, msg0, - sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, - sizeof(msg0))); - return; - } - (*clsh_state_fp[old_state]) (codec, cdc_clsh_d, - req_state, CLSH_REQ_DISABLE, - int_mode); - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, CLS_NONE); - dev_dbg(codec->dev, "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, - sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, - sizeof(msg1))); - } - break; - }; -} -EXPORT_SYMBOL(wcd_cls_h_fsm); - -/* - * wcd_cls_h_init: Called to init clsh info - * - * @clsh: pointer for clsh state information. - */ -void wcd_cls_h_init(struct wcd_clsh_cdc_info *clsh) -{ - int i; - - clsh->state = WCD_CLSH_STATE_IDLE; - - for (i = 0; i < NUM_CLSH_STATES; i++) - clsh_state_fp[i] = wcd_clsh_state_err; - - clsh_state_fp[WCD_CLSH_STATE_EAR] = wcd_clsh_state_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHL] = wcd_clsh_state_hph_l; - clsh_state_fp[WCD_CLSH_STATE_HPHR] = wcd_clsh_state_hph_r; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST] = wcd_clsh_state_hph_st; - clsh_state_fp[WCD_CLSH_STATE_AUX] = wcd_clsh_state_aux; - clsh_state_fp[WCD_CLSH_STATE_HPHL_AUX] = wcd_clsh_state_hph_aux; - clsh_state_fp[WCD_CLSH_STATE_HPHR_AUX] = wcd_clsh_state_hph_aux; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_AUX] = - wcd_clsh_state_hph_aux; - clsh_state_fp[WCD_CLSH_STATE_EAR_AUX] = wcd_clsh_state_ear_aux; - clsh_state_fp[WCD_CLSH_STATE_HPHL_EAR] = wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHR_EAR] = wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_EAR] = wcd_clsh_state_hph_ear; - /* Set interpolaotr modes to NONE */ - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_EAR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHL, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_AUX, CLS_NONE); - clsh->flyback_users = 0; - clsh->buck_users = 0; -} -EXPORT_SYMBOL(wcd_cls_h_init); - -MODULE_DESCRIPTION("WCD Class-H Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-dsp-mgr.c b/techpack/audio/4.0/asoc/codecs/wcd-dsp-mgr.c deleted file mode 100644 index a6acc2da62ad..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-dsp-mgr.c +++ /dev/null @@ -1,1327 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-dsp-utils.h" - -/* Forward declarations */ -static char *wdsp_get_cmpnt_type_string(enum wdsp_cmpnt_type); - -/* Component related macros */ -#define WDSP_GET_COMPONENT(wdsp, x) ((x >= WDSP_CMPNT_TYPE_MAX || x < 0) ? \ - NULL : (&(wdsp->cmpnts[x]))) -#define WDSP_GET_CMPNT_TYPE_STR(x) wdsp_get_cmpnt_type_string(x) - -/* - * These #defines indicate the bit number in status field - * for each of the status. If bit is set, it indicates - * the status as done, else if bit is not set, it indicates - * the status is either failed or not done. - */ -#define WDSP_STATUS_INITIALIZED BIT(0) -#define WDSP_STATUS_CODE_DLOADED BIT(1) -#define WDSP_STATUS_DATA_DLOADED BIT(2) -#define WDSP_STATUS_BOOTED BIT(3) - -/* Helper macros for printing wdsp messages */ -#define WDSP_ERR(wdsp, fmt, ...) \ - dev_err(wdsp->mdev, "%s: " fmt "\n", __func__, ##__VA_ARGS__) -#define WDSP_DBG(wdsp, fmt, ...) \ - dev_dbg(wdsp->mdev, "%s: " fmt "\n", __func__, ##__VA_ARGS__) - -/* Helper macros for locking */ -#define WDSP_MGR_MUTEX_LOCK(wdsp, lock) \ -{ \ - WDSP_DBG(wdsp, "mutex_lock(%s)", \ - __stringify_1(lock)); \ - mutex_lock(&lock); \ -} - -#define WDSP_MGR_MUTEX_UNLOCK(wdsp, lock) \ -{ \ - WDSP_DBG(wdsp, "mutex_unlock(%s)", \ - __stringify_1(lock)); \ - mutex_unlock(&lock); \ -} - -/* Helper macros for using status mask */ -#define WDSP_SET_STATUS(wdsp, state) \ -{ \ - wdsp->status |= state; \ - WDSP_DBG(wdsp, "set 0x%lx, new_state = 0x%x", \ - state, wdsp->status); \ -} - -#define WDSP_CLEAR_STATUS(wdsp, state) \ -{ \ - wdsp->status &= (~state); \ - WDSP_DBG(wdsp, "clear 0x%lx, new_state = 0x%x", \ - state, wdsp->status); \ -} - -#define WDSP_STATUS_IS_SET(wdsp, state) (wdsp->status & state) - -/* SSR relate status macros */ -#define WDSP_SSR_STATUS_WDSP_READY BIT(0) -#define WDSP_SSR_STATUS_CDC_READY BIT(1) -#define WDSP_SSR_STATUS_READY \ - (WDSP_SSR_STATUS_WDSP_READY | WDSP_SSR_STATUS_CDC_READY) -#define WDSP_SSR_READY_WAIT_TIMEOUT (10 * HZ) - -enum wdsp_ssr_type { - - /* Init value, indicates there is no SSR in progress */ - WDSP_SSR_TYPE_NO_SSR = 0, - - /* - * Indicates WDSP crashed. The manager driver internally - * decides when to perform WDSP restart based on the - * users of wdsp. Hence there is no explicit WDSP_UP. - */ - WDSP_SSR_TYPE_WDSP_DOWN, - - /* Indicates codec hardware is down */ - WDSP_SSR_TYPE_CDC_DOWN, - - /* Indicates codec hardware is up, trigger to restart WDSP */ - WDSP_SSR_TYPE_CDC_UP, -}; - -struct wdsp_cmpnt { - - /* OF node of the phandle */ - struct device_node *np; - - /* - * Child component's dev_name, should be set in DT for the child's - * phandle if child's dev->of_node does not match the phandle->of_node - */ - const char *cdev_name; - - /* Child component's device node */ - struct device *cdev; - - /* Private data that component may want back on callbacks */ - void *priv_data; - - /* Child ops */ - struct wdsp_cmpnt_ops *ops; -}; - -struct wdsp_ramdump_data { - - /* Ramdump device */ - void *rd_dev; - - /* DMA address of the dump */ - dma_addr_t rd_addr; - - /* Virtual address of the dump */ - void *rd_v_addr; - - /* Data provided through error interrupt */ - struct wdsp_err_signal_arg err_data; -}; - -struct wdsp_mgr_priv { - - /* Manager driver's struct device pointer */ - struct device *mdev; - - /* Match struct for component framework */ - struct component_match *match; - - /* Manager's ops/function callbacks */ - struct wdsp_mgr_ops *ops; - - /* Array to store information for all expected components */ - struct wdsp_cmpnt cmpnts[WDSP_CMPNT_TYPE_MAX]; - - /* The filename of image to be downloaded */ - const char *img_fname; - - /* Keeps track of current state of manager driver */ - u32 status; - - /* Work to load the firmware image after component binding */ - struct work_struct load_fw_work; - - /* List of segments in image to be downloaded */ - struct list_head *seg_list; - - /* Base address of the image in memory */ - u32 base_addr; - - /* Instances using dsp */ - int dsp_users; - - /* Lock for serializing ops called by components */ - struct mutex api_mutex; - - struct wdsp_ramdump_data dump_data; - - /* SSR related */ - enum wdsp_ssr_type ssr_type; - struct mutex ssr_mutex; - struct work_struct ssr_work; - u16 ready_status; - struct completion ready_compl; - - /* Debugfs related */ - struct dentry *entry; - bool panic_on_error; -}; - -static char *wdsp_get_ssr_type_string(enum wdsp_ssr_type type) -{ - switch (type) { - case WDSP_SSR_TYPE_NO_SSR: - return "NO_SSR"; - case WDSP_SSR_TYPE_WDSP_DOWN: - return "WDSP_DOWN"; - case WDSP_SSR_TYPE_CDC_DOWN: - return "CDC_DOWN"; - case WDSP_SSR_TYPE_CDC_UP: - return "CDC_UP"; - default: - pr_err("%s: Invalid ssr_type %d\n", - __func__, type); - return "Invalid"; - } -} - -static char *wdsp_get_cmpnt_type_string(enum wdsp_cmpnt_type type) -{ - switch (type) { - case WDSP_CMPNT_CONTROL: - return "control"; - case WDSP_CMPNT_IPC: - return "ipc"; - case WDSP_CMPNT_TRANSPORT: - return "transport"; - default: - pr_err("%s: Invalid component type %d\n", - __func__, type); - return "Invalid"; - } -} - -static void __wdsp_clr_ready_locked(struct wdsp_mgr_priv *wdsp, - u16 value) -{ - wdsp->ready_status &= ~(value); - WDSP_DBG(wdsp, "ready_status = 0x%x", wdsp->ready_status); -} - -static void __wdsp_set_ready_locked(struct wdsp_mgr_priv *wdsp, - u16 value, bool mark_complete) -{ - wdsp->ready_status |= value; - WDSP_DBG(wdsp, "ready_status = 0x%x", wdsp->ready_status); - - if (mark_complete && - wdsp->ready_status == WDSP_SSR_STATUS_READY) { - WDSP_DBG(wdsp, "marking ready completion"); - complete(&wdsp->ready_compl); - } -} - -static void wdsp_broadcast_event_upseq(struct wdsp_mgr_priv *wdsp, - enum wdsp_event_type event, - void *data) -{ - struct wdsp_cmpnt *cmpnt; - int i; - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if (cmpnt && cmpnt->ops && cmpnt->ops->event_handler) - cmpnt->ops->event_handler(cmpnt->cdev, cmpnt->priv_data, - event, data); - } -} - -static void wdsp_broadcast_event_downseq(struct wdsp_mgr_priv *wdsp, - enum wdsp_event_type event, - void *data) -{ - struct wdsp_cmpnt *cmpnt; - int i; - - for (i = WDSP_CMPNT_TYPE_MAX - 1; i >= 0; i--) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if (cmpnt && cmpnt->ops && cmpnt->ops->event_handler) - cmpnt->ops->event_handler(cmpnt->cdev, cmpnt->priv_data, - event, data); - } -} - -static int wdsp_unicast_event(struct wdsp_mgr_priv *wdsp, - enum wdsp_cmpnt_type type, - enum wdsp_event_type event, - void *data) -{ - struct wdsp_cmpnt *cmpnt; - int ret; - - cmpnt = WDSP_GET_COMPONENT(wdsp, type); - if (cmpnt && cmpnt->ops && cmpnt->ops->event_handler) { - ret = cmpnt->ops->event_handler(cmpnt->cdev, cmpnt->priv_data, - event, data); - } else { - WDSP_ERR(wdsp, "not valid event_handler for %s", - WDSP_GET_CMPNT_TYPE_STR(type)); - ret = -EINVAL; - } - - return ret; -} - -static void wdsp_deinit_components(struct wdsp_mgr_priv *wdsp) -{ - struct wdsp_cmpnt *cmpnt; - int i; - - for (i = WDSP_CMPNT_TYPE_MAX - 1; i >= 0; i--) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if (cmpnt && cmpnt->ops && cmpnt->ops->deinit) - cmpnt->ops->deinit(cmpnt->cdev, cmpnt->priv_data); - } -} - -static int wdsp_init_components(struct wdsp_mgr_priv *wdsp) -{ - struct wdsp_cmpnt *cmpnt; - int fail_idx = WDSP_CMPNT_TYPE_MAX; - int i, ret = 0; - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - - /* Init is allowed to be NULL */ - if (!cmpnt->ops || !cmpnt->ops->init) - continue; - ret = cmpnt->ops->init(cmpnt->cdev, cmpnt->priv_data); - if (ret) { - WDSP_ERR(wdsp, "Init failed (%d) for component %s", - ret, WDSP_GET_CMPNT_TYPE_STR(i)); - fail_idx = i; - break; - } - } - - if (fail_idx < WDSP_CMPNT_TYPE_MAX) { - /* Undo init for already initialized components */ - for (i = fail_idx - 1; i >= 0; i--) { - struct wdsp_cmpnt *cmpnt = WDSP_GET_COMPONENT(wdsp, i); - - if (cmpnt->ops && cmpnt->ops->deinit) - cmpnt->ops->deinit(cmpnt->cdev, - cmpnt->priv_data); - } - } else { - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_INIT, NULL); - } - - return ret; -} - -static int wdsp_load_each_segment(struct wdsp_mgr_priv *wdsp, - struct wdsp_img_segment *seg) -{ - struct wdsp_img_section img_section; - int ret; - - WDSP_DBG(wdsp, - "base_addr 0x%x, split_fname %s, load_addr 0x%x, size 0x%zx", - wdsp->base_addr, seg->split_fname, seg->load_addr, seg->size); - - if (seg->load_addr < wdsp->base_addr) { - WDSP_ERR(wdsp, "Invalid addr 0x%x, base_addr = 0x%x", - seg->load_addr, wdsp->base_addr); - return -EINVAL; - } - - img_section.addr = seg->load_addr - wdsp->base_addr; - img_section.size = seg->size; - img_section.data = seg->data; - - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_TRANSPORT, - WDSP_EVENT_DLOAD_SECTION, - &img_section); - if (ret < 0) - WDSP_ERR(wdsp, - "Failed, err = %d for base_addr = 0x%x split_fname = %s, load_addr = 0x%x, size = 0x%zx", - ret, wdsp->base_addr, seg->split_fname, - seg->load_addr, seg->size); - return ret; -} - -static int wdsp_download_segments(struct wdsp_mgr_priv *wdsp, - unsigned int type) -{ - struct wdsp_cmpnt *ctl; - struct wdsp_img_segment *seg = NULL; - enum wdsp_event_type pre, post; - long status; - int ret; - - ctl = WDSP_GET_COMPONENT(wdsp, WDSP_CMPNT_CONTROL); - - if (type == WDSP_ELF_FLAG_RE) { - pre = WDSP_EVENT_PRE_DLOAD_CODE; - post = WDSP_EVENT_POST_DLOAD_CODE; - status = WDSP_STATUS_CODE_DLOADED; - } else if (type == WDSP_ELF_FLAG_WRITE) { - pre = WDSP_EVENT_PRE_DLOAD_DATA; - post = WDSP_EVENT_POST_DLOAD_DATA; - status = WDSP_STATUS_DATA_DLOADED; - } else { - WDSP_ERR(wdsp, "Invalid type %u", type); - return -EINVAL; - } - - ret = wdsp_get_segment_list(ctl->cdev, wdsp->img_fname, - type, wdsp->seg_list, &wdsp->base_addr); - if (ret < 0 || - list_empty(wdsp->seg_list)) { - WDSP_ERR(wdsp, "Error %d to get image segments for type %d", - ret, type); - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_DLOAD_FAILED, - NULL); - goto done; - } - - /* Notify all components that image is about to be downloaded */ - wdsp_broadcast_event_upseq(wdsp, pre, NULL); - - /* Go through the list of segments and download one by one */ - list_for_each_entry(seg, wdsp->seg_list, list) { - ret = wdsp_load_each_segment(wdsp, seg); - if (ret) - goto dload_error; - } - - /* Flush the list before setting status and notifying components */ - wdsp_flush_segment_list(wdsp->seg_list); - - WDSP_SET_STATUS(wdsp, status); - - /* Notify all components that image is downloaded */ - wdsp_broadcast_event_downseq(wdsp, post, NULL); -done: - return ret; - -dload_error: - wdsp_flush_segment_list(wdsp->seg_list); - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_DLOAD_FAILED, NULL); - return ret; -} - -static int wdsp_init_and_dload_code_sections(struct wdsp_mgr_priv *wdsp) -{ - int ret; - bool is_initialized; - - is_initialized = WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_INITIALIZED); - - if (!is_initialized) { - /* Components are not initialized yet, initialize them */ - ret = wdsp_init_components(wdsp); - if (ret < 0) { - WDSP_ERR(wdsp, "INIT failed, err = %d", ret); - goto done; - } - WDSP_SET_STATUS(wdsp, WDSP_STATUS_INITIALIZED); - } - - /* Download the read-execute sections of image */ - ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_RE); - if (ret < 0) { - WDSP_ERR(wdsp, "Error %d to download code sections", ret); - goto done; - } -done: - return ret; -} - -static void wdsp_load_fw_image(struct work_struct *work) -{ - struct wdsp_mgr_priv *wdsp; - int ret; - - wdsp = container_of(work, struct wdsp_mgr_priv, load_fw_work); - if (!wdsp) { - pr_err("%s: Invalid private_data\n", __func__); - return; - } - - ret = wdsp_init_and_dload_code_sections(wdsp); - if (ret < 0) - WDSP_ERR(wdsp, "dload code sections failed, err = %d", ret); -} - -static int wdsp_enable_dsp(struct wdsp_mgr_priv *wdsp) -{ - int ret; - - /* Make sure wdsp is in good state */ - if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_CODE_DLOADED)) { - WDSP_ERR(wdsp, "WDSP in invalid state 0x%x", wdsp->status); - return -EINVAL; - } - - /* - * Acquire SSR mutex lock to make sure enablement of DSP - * does not race with SSR handling. - */ - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - /* Download the read-write sections of image */ - ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_WRITE); - if (ret < 0) { - WDSP_ERR(wdsp, "Data section download failed, err = %d", ret); - goto done; - } - - wdsp_broadcast_event_upseq(wdsp, WDSP_EVENT_PRE_BOOTUP, NULL); - - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_CONTROL, - WDSP_EVENT_DO_BOOT, NULL); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to boot dsp, err = %d", ret); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_DATA_DLOADED); - goto done; - } - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_BOOTUP, NULL); - WDSP_SET_STATUS(wdsp, WDSP_STATUS_BOOTED); -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - return ret; -} - -static int wdsp_disable_dsp(struct wdsp_mgr_priv *wdsp) -{ - int ret; - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - - /* - * If Disable happened while SSR is in progress, then set the SSR - * ready status indicating WDSP is now ready. Ignore the disable - * event here and let the SSR handler go through shutdown. - */ - if (wdsp->ssr_type != WDSP_SSR_TYPE_NO_SSR) { - __wdsp_set_ready_locked(wdsp, WDSP_SSR_STATUS_WDSP_READY, true); - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - return 0; - } - - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - - /* Make sure wdsp is in good state */ - if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_BOOTED)) { - WDSP_ERR(wdsp, "wdsp in invalid state 0x%x", wdsp->status); - ret = -EINVAL; - goto done; - } - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_PRE_SHUTDOWN, NULL); - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_CONTROL, - WDSP_EVENT_DO_SHUTDOWN, NULL); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to shutdown dsp, err = %d", ret); - goto done; - } - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_SHUTDOWN, NULL); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_BOOTED); - - /* Data sections are to be downloaded per boot */ - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_DATA_DLOADED); -done: - return ret; -} - -static int wdsp_register_cmpnt_ops(struct device *wdsp_dev, - struct device *cdev, - void *priv_data, - struct wdsp_cmpnt_ops *ops) -{ - struct wdsp_mgr_priv *wdsp; - struct wdsp_cmpnt *cmpnt; - int i, ret; - - if (!wdsp_dev || !cdev || !ops) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if ((cdev->of_node && cdev->of_node == cmpnt->np) || - (cmpnt->cdev_name && - !strcmp(dev_name(cdev), cmpnt->cdev_name))) { - break; - } - } - - if (i == WDSP_CMPNT_TYPE_MAX) { - WDSP_ERR(wdsp, "Failed to register component dev %s", - dev_name(cdev)); - ret = -EINVAL; - goto done; - } - - cmpnt->cdev = cdev; - cmpnt->ops = ops; - cmpnt->priv_data = priv_data; -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); - return 0; -} - -static struct device *wdsp_get_dev_for_cmpnt(struct device *wdsp_dev, - enum wdsp_cmpnt_type type) -{ - struct wdsp_mgr_priv *wdsp; - struct wdsp_cmpnt *cmpnt; - - if (!wdsp_dev || type >= WDSP_CMPNT_TYPE_MAX) - return NULL; - - wdsp = dev_get_drvdata(wdsp_dev); - cmpnt = WDSP_GET_COMPONENT(wdsp, type); - - return cmpnt->cdev; -} - -static int wdsp_get_devops_for_cmpnt(struct device *wdsp_dev, - enum wdsp_cmpnt_type type, - void *data) -{ - struct wdsp_mgr_priv *wdsp; - int ret = 0; - - if (!wdsp_dev || type >= WDSP_CMPNT_TYPE_MAX) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - ret = wdsp_unicast_event(wdsp, type, - WDSP_EVENT_GET_DEVOPS, data); - if (ret) - WDSP_ERR(wdsp, "get_dev_ops failed for cmpnt type %d", - type); - return ret; -} - -static void wdsp_collect_ramdumps(struct wdsp_mgr_priv *wdsp) -{ - struct wdsp_img_section img_section; - struct wdsp_err_signal_arg *data = &wdsp->dump_data.err_data; - struct ramdump_segment rd_seg; - int ret = 0; - - if (wdsp->ssr_type != WDSP_SSR_TYPE_WDSP_DOWN || - !data->mem_dumps_enabled) { - WDSP_DBG(wdsp, "cannot dump memory, ssr_type %s, dumps %s", - wdsp_get_ssr_type_string(wdsp->ssr_type), - !(data->mem_dumps_enabled) ? "disabled" : "enabled"); - goto done; - } - - if (data->dump_size == 0 || - data->remote_start_addr < wdsp->base_addr) { - WDSP_ERR(wdsp, "Invalid start addr 0x%x or dump_size 0x%zx", - data->remote_start_addr, data->dump_size); - goto done; - } - - if (!wdsp->dump_data.rd_dev) { - WDSP_ERR(wdsp, "Ramdump device is not setup"); - goto done; - } - - WDSP_DBG(wdsp, "base_addr 0x%x, dump_start_addr 0x%x, dump_size 0x%zx", - wdsp->base_addr, data->remote_start_addr, data->dump_size); - - /* Allocate memory for dumps */ - wdsp->dump_data.rd_v_addr = dma_alloc_coherent(wdsp->mdev, - data->dump_size, - &wdsp->dump_data.rd_addr, - GFP_KERNEL); - if (!wdsp->dump_data.rd_v_addr) - goto done; - - img_section.addr = data->remote_start_addr - wdsp->base_addr; - img_section.size = data->dump_size; - img_section.data = wdsp->dump_data.rd_v_addr; - - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_TRANSPORT, - WDSP_EVENT_READ_SECTION, - &img_section); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to read dumps, size 0x%zx at addr 0x%x", - img_section.size, img_section.addr); - goto err_read_dumps; - } - - /* - * If panic_on_error flag is explicitly set through the debugfs, - * then cause a BUG here to aid debugging. - */ - BUG_ON(wdsp->panic_on_error); - - rd_seg.address = (unsigned long) wdsp->dump_data.rd_v_addr; - rd_seg.size = img_section.size; - rd_seg.v_address = wdsp->dump_data.rd_v_addr; - - ret = do_ramdump(wdsp->dump_data.rd_dev, &rd_seg, 1); - if (ret < 0) - WDSP_ERR(wdsp, "do_ramdump failed with error %d", ret); - -err_read_dumps: - dma_free_coherent(wdsp->mdev, data->dump_size, - wdsp->dump_data.rd_v_addr, wdsp->dump_data.rd_addr); -done: - return; -} - -static void wdsp_ssr_work_fn(struct work_struct *work) -{ - struct wdsp_mgr_priv *wdsp; - int ret; - - wdsp = container_of(work, struct wdsp_mgr_priv, ssr_work); - if (!wdsp) { - pr_err("%s: Invalid private_data\n", __func__); - return; - } - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - - /* Issue ramdumps and shutdown only if DSP is currently booted */ - if (WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_BOOTED)) { - wdsp_collect_ramdumps(wdsp); - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_CONTROL, - WDSP_EVENT_DO_SHUTDOWN, NULL); - if (ret < 0) - WDSP_ERR(wdsp, "Failed WDSP shutdown, err = %d", ret); - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_SHUTDOWN, - NULL); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_BOOTED); - } - - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - ret = wait_for_completion_timeout(&wdsp->ready_compl, - WDSP_SSR_READY_WAIT_TIMEOUT); - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - if (ret == 0) { - WDSP_ERR(wdsp, "wait_for_ready timed out, status = 0x%x", - wdsp->ready_status); - goto done; - } - - /* Data sections are to downloaded per WDSP boot */ - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_DATA_DLOADED); - - /* - * Even though code section could possible be retained on DSP - * crash, go ahead and still re-download just to avoid any - * memory corruption from previous crash. - */ - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_CODE_DLOADED); - - /* If codec restarted, then all components must be re-initialized */ - if (wdsp->ssr_type == WDSP_SSR_TYPE_CDC_UP) { - wdsp_deinit_components(wdsp); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_INITIALIZED); - } - - ret = wdsp_init_and_dload_code_sections(wdsp); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to dload code sections err = %d", - ret); - goto done; - } - - /* SSR handling is finished, mark SSR type as NO_SSR */ - wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR; -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); -} - -static int wdsp_ssr_handler(struct wdsp_mgr_priv *wdsp, void *arg, - enum wdsp_ssr_type ssr_type) -{ - enum wdsp_ssr_type current_ssr_type; - struct wdsp_err_signal_arg *err_data; - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - - current_ssr_type = wdsp->ssr_type; - WDSP_DBG(wdsp, "Current ssr_type %s, handling ssr_type %s", - wdsp_get_ssr_type_string(current_ssr_type), - wdsp_get_ssr_type_string(ssr_type)); - wdsp->ssr_type = ssr_type; - - if (arg) { - err_data = (struct wdsp_err_signal_arg *) arg; - memcpy(&wdsp->dump_data.err_data, err_data, - sizeof(*err_data)); - } else { - memset(&wdsp->dump_data.err_data, 0, - sizeof(wdsp->dump_data.err_data)); - } - - switch (ssr_type) { - - case WDSP_SSR_TYPE_WDSP_DOWN: - __wdsp_clr_ready_locked(wdsp, WDSP_SSR_STATUS_WDSP_READY); - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_PRE_SHUTDOWN, - NULL); - reinit_completion(&wdsp->ready_compl); - schedule_work(&wdsp->ssr_work); - break; - - case WDSP_SSR_TYPE_CDC_DOWN: - __wdsp_clr_ready_locked(wdsp, WDSP_SSR_STATUS_CDC_READY); - /* - * If DSP is booted when CDC_DOWN is received, it needs - * to be shutdown. - */ - if (WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_BOOTED)) { - __wdsp_clr_ready_locked(wdsp, - WDSP_SSR_STATUS_WDSP_READY); - wdsp_broadcast_event_downseq(wdsp, - WDSP_EVENT_PRE_SHUTDOWN, - NULL); - } - reinit_completion(&wdsp->ready_compl); - schedule_work(&wdsp->ssr_work); - break; - - case WDSP_SSR_TYPE_CDC_UP: - __wdsp_set_ready_locked(wdsp, WDSP_SSR_STATUS_CDC_READY, true); - break; - - default: - WDSP_ERR(wdsp, "undefined ssr_type %d\n", ssr_type); - /* Revert back the ssr_type for undefined events */ - wdsp->ssr_type = current_ssr_type; - break; - } - - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - - return 0; -} - -#ifdef CONFIG_DEBUG_FS -static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg) -{ - struct wdsp_err_signal_arg *err_data; - int ret = 0; - - /* If there is no SSR, set the SSR type to collect ramdumps */ - if (wdsp->ssr_type == WDSP_SSR_TYPE_NO_SSR) { - wdsp->ssr_type = WDSP_SSR_TYPE_WDSP_DOWN; - } else { - WDSP_DBG(wdsp, "SSR handling is running, skip debug ramdump"); - ret = 0; - goto done; - } - - if (arg) { - err_data = (struct wdsp_err_signal_arg *) arg; - memcpy(&wdsp->dump_data.err_data, err_data, - sizeof(*err_data)); - } else { - WDSP_DBG(wdsp, "Invalid input, arg is NULL"); - ret = -EINVAL; - goto done; - } - wdsp_collect_ramdumps(wdsp); - wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR; -done: - return ret; -} -static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg) -{ - int ret = 0; - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - ret = __wdsp_dbg_dump_locked(wdsp, arg); - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - - return ret; -} -#else -static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg) -{ - return 0; -} - -static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg) -{ - return 0; -} -#endif - -static int wdsp_signal_handler(struct device *wdsp_dev, - enum wdsp_signal signal, void *arg) -{ - struct wdsp_mgr_priv *wdsp; - int ret; - - if (!wdsp_dev) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - -#ifdef CONFIG_DEBUG_FS - if (signal != WDSP_DEBUG_DUMP_INTERNAL) - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); -#else - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); -#endif - - WDSP_DBG(wdsp, "Raised signal %d", signal); - - switch (signal) { - case WDSP_IPC1_INTR: - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_IPC, - WDSP_EVENT_IPC1_INTR, NULL); - break; - case WDSP_ERR_INTR: - ret = wdsp_ssr_handler(wdsp, arg, WDSP_SSR_TYPE_WDSP_DOWN); - break; - case WDSP_CDC_DOWN_SIGNAL: - ret = wdsp_ssr_handler(wdsp, arg, WDSP_SSR_TYPE_CDC_DOWN); - break; - case WDSP_CDC_UP_SIGNAL: - ret = wdsp_ssr_handler(wdsp, arg, WDSP_SSR_TYPE_CDC_UP); - break; - case WDSP_DEBUG_DUMP: - ret = wdsp_debug_dump_handler(wdsp, arg); - break; - case WDSP_DEBUG_DUMP_INTERNAL: - ret = __wdsp_dbg_dump_locked(wdsp, arg); - break; - default: - ret = -EINVAL; - break; - } - - if (ret < 0) - WDSP_ERR(wdsp, "handling signal %d failed with error %d", - signal, ret); - -#ifdef CONFIG_DEBUG_FS - if (signal != WDSP_DEBUG_DUMP_INTERNAL) - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); -#else - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); -#endif - - return ret; -} - -static int wdsp_vote_for_dsp(struct device *wdsp_dev, - bool vote) -{ - struct wdsp_mgr_priv *wdsp; - int ret = 0; - - if (!wdsp_dev) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); - WDSP_DBG(wdsp, "request %s, current users = %d", - vote ? "enable" : "disable", wdsp->dsp_users); - - if (vote) { - wdsp->dsp_users++; - if (wdsp->dsp_users == 1) - ret = wdsp_enable_dsp(wdsp); - } else { - if (wdsp->dsp_users == 0) - goto done; - - wdsp->dsp_users--; - if (wdsp->dsp_users == 0) - ret = wdsp_disable_dsp(wdsp); - } - - if (ret < 0) - WDSP_DBG(wdsp, "wdsp %s failed, err = %d", - vote ? "enable" : "disable", ret); - -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); - return ret; -} - -static int wdsp_suspend(struct device *wdsp_dev) -{ - struct wdsp_mgr_priv *wdsp; - int rc = 0, i; - - if (!wdsp_dev) { - pr_err("%s: Invalid handle to device\n", __func__); - return -EINVAL; - } - - wdsp = dev_get_drvdata(wdsp_dev); - - for (i = WDSP_CMPNT_TYPE_MAX - 1; i >= 0; i--) { - rc = wdsp_unicast_event(wdsp, i, WDSP_EVENT_SUSPEND, NULL); - if (rc < 0) { - WDSP_ERR(wdsp, "component %s failed to suspend\n", - WDSP_GET_CMPNT_TYPE_STR(i)); - break; - } - } - - return rc; -} - -static int wdsp_resume(struct device *wdsp_dev) -{ - struct wdsp_mgr_priv *wdsp; - int rc = 0, i; - - if (!wdsp_dev) { - pr_err("%s: Invalid handle to device\n", __func__); - return -EINVAL; - } - - wdsp = dev_get_drvdata(wdsp_dev); - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - rc = wdsp_unicast_event(wdsp, i, WDSP_EVENT_RESUME, NULL); - if (rc < 0) { - WDSP_ERR(wdsp, "component %s failed to resume\n", - WDSP_GET_CMPNT_TYPE_STR(i)); - break; - } - } - - return rc; -} - -static struct wdsp_mgr_ops wdsp_ops = { - .register_cmpnt_ops = wdsp_register_cmpnt_ops, - .get_dev_for_cmpnt = wdsp_get_dev_for_cmpnt, - .get_devops_for_cmpnt = wdsp_get_devops_for_cmpnt, - .signal_handler = wdsp_signal_handler, - .vote_for_dsp = wdsp_vote_for_dsp, - .suspend = wdsp_suspend, - .resume = wdsp_resume, -}; - -static int wdsp_mgr_compare_of(struct device *dev, void *data) -{ - struct wdsp_cmpnt *cmpnt = data; - - /* - * First try to match based on of_node, if of_node is not - * present, try to match on the dev_name - */ - return ((dev->of_node && dev->of_node == cmpnt->np) || - (cmpnt->cdev_name && - !strcmp(dev_name(dev), cmpnt->cdev_name))); -} - -static void wdsp_mgr_debugfs_init(struct wdsp_mgr_priv *wdsp) -{ - wdsp->entry = debugfs_create_dir("wdsp_mgr", NULL); - if (IS_ERR_OR_NULL(wdsp->entry)) - return; - - debugfs_create_bool("panic_on_error", 0644, - wdsp->entry, &wdsp->panic_on_error); -} - -static void wdsp_mgr_debugfs_remove(struct wdsp_mgr_priv *wdsp) -{ - debugfs_remove_recursive(wdsp->entry); - wdsp->entry = NULL; -} - -static int wdsp_mgr_bind(struct device *dev) -{ - struct wdsp_mgr_priv *wdsp = dev_get_drvdata(dev); - struct wdsp_cmpnt *cmpnt; - int ret, idx; - - wdsp->ops = &wdsp_ops; - - /* Setup ramdump device */ - wdsp->dump_data.rd_dev = create_ramdump_device("wdsp", dev); - if (!wdsp->dump_data.rd_dev) - dev_info(dev, "%s: create_ramdump_device failed\n", __func__); - - ret = component_bind_all(dev, wdsp->ops); - if (ret < 0) { - WDSP_ERR(wdsp, "component_bind_all failed %d\n", ret); - return ret; - } - - /* Make sure all components registered ops */ - for (idx = 0; idx < WDSP_CMPNT_TYPE_MAX; idx++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, idx); - if (!cmpnt->cdev || !cmpnt->ops) { - WDSP_ERR(wdsp, "%s did not register ops\n", - WDSP_GET_CMPNT_TYPE_STR(idx)); - ret = -EINVAL; - component_unbind_all(dev, wdsp->ops); - break; - } - } - - wdsp_mgr_debugfs_init(wdsp); - - /* Schedule the work to download image if binding was successful. */ - if (!ret) - schedule_work(&wdsp->load_fw_work); - - return ret; -} - -static void wdsp_mgr_unbind(struct device *dev) -{ - struct wdsp_mgr_priv *wdsp = dev_get_drvdata(dev); - struct wdsp_cmpnt *cmpnt; - int idx; - - cancel_work_sync(&wdsp->load_fw_work); - - component_unbind_all(dev, wdsp->ops); - - wdsp_mgr_debugfs_remove(wdsp); - - if (wdsp->dump_data.rd_dev) { - destroy_ramdump_device(wdsp->dump_data.rd_dev); - wdsp->dump_data.rd_dev = NULL; - } - - /* Clear all status bits */ - wdsp->status = 0x00; - - /* clean up the components */ - for (idx = 0; idx < WDSP_CMPNT_TYPE_MAX; idx++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, idx); - cmpnt->cdev = NULL; - cmpnt->ops = NULL; - cmpnt->priv_data = NULL; - } -} - -static const struct component_master_ops wdsp_master_ops = { - .bind = wdsp_mgr_bind, - .unbind = wdsp_mgr_unbind, -}; - -static void *wdsp_mgr_parse_phandle(struct wdsp_mgr_priv *wdsp, - int index) -{ - struct device *mdev = wdsp->mdev; - struct device_node *np; - struct wdsp_cmpnt *cmpnt = NULL; - struct of_phandle_args pargs; - u32 value; - int ret; - - ret = of_parse_phandle_with_fixed_args(mdev->of_node, - "qcom,wdsp-components", 1, - index, &pargs); - if (ret) { - WDSP_ERR(wdsp, "parse_phandle at index %d failed %d", - index, ret); - return NULL; - } - - np = pargs.np; - value = pargs.args[0]; - - if (value >= WDSP_CMPNT_TYPE_MAX) { - WDSP_ERR(wdsp, "invalid phandle_arg to of_node %s", np->name); - goto done; - } - - cmpnt = WDSP_GET_COMPONENT(wdsp, value); - if (cmpnt->np || cmpnt->cdev_name) { - WDSP_ERR(wdsp, "cmpnt %d already added", value); - cmpnt = NULL; - goto done; - } - - cmpnt->np = np; - of_property_read_string(np, "qcom,wdsp-cmpnt-dev-name", - &cmpnt->cdev_name); -done: - of_node_put(np); - return cmpnt; -} - -static int wdsp_mgr_parse_dt_entries(struct wdsp_mgr_priv *wdsp) -{ - struct device *dev = wdsp->mdev; - void *match_data; - int ph_idx, ret; - - ret = of_property_read_string(dev->of_node, "qcom,img-filename", - &wdsp->img_fname); - if (ret < 0) { - WDSP_ERR(wdsp, "Reading property %s failed, error = %d", - "qcom,img-filename", ret); - return ret; - } - - ret = of_count_phandle_with_args(dev->of_node, - "qcom,wdsp-components", - NULL); - if (ret == -ENOENT) { - WDSP_ERR(wdsp, "Property %s not defined in DT", - "qcom,wdsp-components"); - goto done; - } else if (ret != WDSP_CMPNT_TYPE_MAX * 2) { - WDSP_ERR(wdsp, "Invalid phandle + arg count %d, expected %d", - ret, WDSP_CMPNT_TYPE_MAX * 2); - ret = -EINVAL; - goto done; - } - - ret = 0; - - for (ph_idx = 0; ph_idx < WDSP_CMPNT_TYPE_MAX; ph_idx++) { - - match_data = wdsp_mgr_parse_phandle(wdsp, ph_idx); - if (!match_data) { - WDSP_ERR(wdsp, "component not found at idx %d", ph_idx); - ret = -EINVAL; - goto done; - } - - component_match_add(dev, &wdsp->match, - wdsp_mgr_compare_of, match_data); - } - -done: - return ret; -} - -static int wdsp_mgr_probe(struct platform_device *pdev) -{ - struct wdsp_mgr_priv *wdsp; - struct device *mdev = &pdev->dev; - int ret; - - wdsp = devm_kzalloc(mdev, sizeof(*wdsp), GFP_KERNEL); - if (!wdsp) - return -ENOMEM; - wdsp->mdev = mdev; - wdsp->seg_list = devm_kzalloc(mdev, sizeof(struct list_head), - GFP_KERNEL); - if (!wdsp->seg_list) { - devm_kfree(mdev, wdsp); - return -ENOMEM; - } - - ret = wdsp_mgr_parse_dt_entries(wdsp); - if (ret) - goto err_dt_parse; - - INIT_WORK(&wdsp->load_fw_work, wdsp_load_fw_image); - INIT_LIST_HEAD(wdsp->seg_list); - mutex_init(&wdsp->api_mutex); - mutex_init(&wdsp->ssr_mutex); - wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR; - wdsp->ready_status = WDSP_SSR_STATUS_READY; - INIT_WORK(&wdsp->ssr_work, wdsp_ssr_work_fn); - init_completion(&wdsp->ready_compl); - arch_setup_dma_ops(wdsp->mdev, 0, 0, NULL, 0); - dev_set_drvdata(mdev, wdsp); - - ret = component_master_add_with_match(mdev, &wdsp_master_ops, - wdsp->match); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to add master, err = %d", ret); - goto err_master_add; - } - - return 0; - -err_master_add: - mutex_destroy(&wdsp->api_mutex); - mutex_destroy(&wdsp->ssr_mutex); -err_dt_parse: - devm_kfree(mdev, wdsp->seg_list); - devm_kfree(mdev, wdsp); - dev_set_drvdata(mdev, NULL); - - return ret; -} - -static int wdsp_mgr_remove(struct platform_device *pdev) -{ - struct device *mdev = &pdev->dev; - struct wdsp_mgr_priv *wdsp = dev_get_drvdata(mdev); - - component_master_del(mdev, &wdsp_master_ops); - - mutex_destroy(&wdsp->api_mutex); - mutex_destroy(&wdsp->ssr_mutex); - devm_kfree(mdev, wdsp->seg_list); - devm_kfree(mdev, wdsp); - dev_set_drvdata(mdev, NULL); - - return 0; -}; - -static const struct of_device_id wdsp_mgr_dt_match[] = { - {.compatible = "qcom,wcd-dsp-mgr" }, - { } -}; - -static struct platform_driver wdsp_mgr_driver = { - .driver = { - .name = "wcd-dsp-mgr", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(wdsp_mgr_dt_match), - .suppress_bind_attrs = true, - }, - .probe = wdsp_mgr_probe, - .remove = wdsp_mgr_remove, -}; - -int wcd_dsp_mgr_init(void) -{ - return platform_driver_register(&wdsp_mgr_driver); -} - -void wcd_dsp_mgr_exit(void) -{ - platform_driver_unregister(&wdsp_mgr_driver); -} - -MODULE_DESCRIPTION("WCD DSP manager driver"); -MODULE_DEVICE_TABLE(of, wdsp_mgr_dt_match); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.c b/techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.c deleted file mode 100644 index c157ab1c32ee..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.c +++ /dev/null @@ -1,224 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include "wcd-dsp-utils.h" - -static bool wdsp_is_valid_elf_hdr(const struct elf32_hdr *ehdr, - size_t fw_size) -{ - if (fw_size < sizeof(*ehdr)) { - pr_err("%s: Firmware too small\n", __func__); - goto elf_check_fail; - } - - if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) { - pr_err("%s: Not an ELF file\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) { - pr_err("%s: Not an executable image\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_phnum == 0) { - pr_err("%s: no segments to load\n", __func__); - goto elf_check_fail; - } - - if (sizeof(struct elf32_phdr) * ehdr->e_phnum + - sizeof(struct elf32_hdr) > fw_size) { - pr_err("%s: Too small MDT file\n", __func__); - goto elf_check_fail; - } - - return true; - -elf_check_fail: - return false; -} - -static int wdsp_add_segment_to_list(struct device *dev, - const char *img_fname, - const struct elf32_phdr *phdr, - int phdr_idx, - struct list_head *seg_list) -{ - struct wdsp_img_segment *seg; - int ret = 0; - - /* Do not load segments with zero size */ - if (phdr->p_filesz == 0 || phdr->p_memsz == 0) - goto done; - - seg = kzalloc(sizeof(*seg), GFP_KERNEL); - if (!seg) { - ret = -ENOMEM; - goto done; - } - - snprintf(seg->split_fname, sizeof(seg->split_fname), - "%s.b%02d", img_fname, phdr_idx); - ret = request_firmware(&seg->split_fw, seg->split_fname, dev); - if (ret < 0) { - dev_err(dev, "%s: firmware %s not found\n", - __func__, seg->split_fname); - goto bad_seg; - } - - if (phdr->p_filesz != seg->split_fw->size) { - dev_err(dev, - "%s: %s size mismatch, phdr_size: 0x%x fw_size: 0x%zx", - __func__, seg->split_fname, phdr->p_filesz, - seg->split_fw->size); - ret = -EINVAL; - goto bad_elf; - } - - seg->load_addr = phdr->p_paddr; - seg->size = phdr->p_filesz; - seg->data = (u8 *) seg->split_fw->data; - - list_add_tail(&seg->list, seg_list); -done: - return ret; -bad_elf: - release_firmware(seg->split_fw); -bad_seg: - kfree(seg); - return ret; -} - -/* - * wdsp_flush_segment_list: Flush the list of segments - * @seg_list: List of segments to be flushed - * This API will traverse through the list of segments provided in - * seg_list, release the firmware for each segment and delete the - * segment from the list. - */ -void wdsp_flush_segment_list(struct list_head *seg_list) -{ - struct wdsp_img_segment *seg, *next; - - list_for_each_entry_safe(seg, next, seg_list, list) { - release_firmware(seg->split_fw); - list_del(&seg->list); - kfree(seg); - } -} -EXPORT_SYMBOL(wdsp_flush_segment_list); - -/* - * wdsp_get_segment_list: Get the list of requested segments - * @dev: struct device pointer of caller - * @img_fname: Image name for the mdt and split firmware files - * @segment_type: Requested segment type, should be either - * WDSP_ELF_FLAG_RE or WDSP_ELF_FLAG_WRITE - * @seg_list: An initialized head for list of segmented to be returned - * @entry_point: Pointer to return the entry point of the image - * This API will parse the mdt file for img_fname and create - * an struct wdsp_img_segment for each segment that matches segment_type - * and add this structure to list pointed by seg_list - */ -int wdsp_get_segment_list(struct device *dev, - const char *img_fname, - unsigned int segment_type, - struct list_head *seg_list, - u32 *entry_point) -{ - const struct firmware *fw; - const struct elf32_hdr *ehdr; - const struct elf32_phdr *phdr; - const u8 *elf_ptr; - char mdt_name[WDSP_IMG_NAME_LEN_MAX]; - int ret, phdr_idx; - bool segment_match; - - if (!dev) { - ret = -EINVAL; - pr_err("%s: Invalid device handle\n", __func__); - goto done; - } - - if (!img_fname || !seg_list || !entry_point) { - ret = -EINVAL; - dev_err(dev, "%s: Invalid input params\n", - __func__); - goto done; - } - - if (segment_type != WDSP_ELF_FLAG_RE && - segment_type != WDSP_ELF_FLAG_WRITE) { - dev_err(dev, "%s: Invalid request for segment_type %d\n", - __func__, segment_type); - ret = -EINVAL; - goto done; - } - - snprintf(mdt_name, sizeof(mdt_name), "%s.mdt", img_fname); - ret = request_firmware(&fw, mdt_name, dev); - if (ret < 0) { - dev_err(dev, "%s: firmware %s not found\n", - __func__, mdt_name); - goto done; - } - - ehdr = (struct elf32_hdr *) fw->data; - *entry_point = ehdr->e_entry; - if (!wdsp_is_valid_elf_hdr(ehdr, fw->size)) { - dev_err(dev, "%s: fw mdt %s is invalid\n", - __func__, mdt_name); - ret = -EINVAL; - goto bad_elf; - } - - elf_ptr = fw->data + sizeof(*ehdr); - for (phdr_idx = 0; phdr_idx < ehdr->e_phnum; phdr_idx++) { - phdr = (struct elf32_phdr *) elf_ptr; - segment_match = false; - - switch (segment_type) { - case WDSP_ELF_FLAG_RE: - /* - * Flag can be READ or EXECUTE or both but - * WRITE flag should not be set. - */ - if ((phdr->p_flags & segment_type) && - !(phdr->p_flags & WDSP_ELF_FLAG_WRITE)) - segment_match = true; - break; - case WDSP_ELF_FLAG_WRITE: - /* - * If WRITE flag is set, other flags do not - * matter. - */ - if (phdr->p_flags & segment_type) - segment_match = true; - break; - } - - if (segment_match) { - ret = wdsp_add_segment_to_list(dev, img_fname, phdr, - phdr_idx, seg_list); - if (ret < 0) { - wdsp_flush_segment_list(seg_list); - goto bad_elf; - } - } - elf_ptr = elf_ptr + sizeof(*phdr); - } - -bad_elf: - release_firmware(fw); -done: - return ret; -} -EXPORT_SYMBOL(wdsp_get_segment_list); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.h b/techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.h deleted file mode 100644 index 3fb42e458397..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-dsp-utils.h +++ /dev/null @@ -1,43 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - */ - -#ifndef __WCD_DSP_UTILS_H__ -#define __WCD_DSP_UTILS_H__ - -#define WDSP_IMG_NAME_LEN_MAX 64 - -#define WDSP_ELF_FLAG_EXECUTE (1 << 0) -#define WDSP_ELF_FLAG_WRITE (1 << 1) -#define WDSP_ELF_FLAG_READ (1 << 2) - -#define WDSP_ELF_FLAG_RE (WDSP_ELF_FLAG_READ | WDSP_ELF_FLAG_EXECUTE) - -struct wdsp_img_segment { - - /* Firmware for the slit image */ - const struct firmware *split_fw; - - /* Name of the split firmware file */ - char split_fname[WDSP_IMG_NAME_LEN_MAX]; - - /* Address where the segment is to be loaded */ - u32 load_addr; - - /* Buffer to hold the data to be loaded */ - u8 *data; - - /* Size of the data to be loaded */ - size_t size; - - /* List node pointing to next segment */ - struct list_head list; -}; - -int wdsp_get_segment_list(struct device *dev, const char *img_fname, - unsigned int segment_type, struct list_head *seg_list, - u32 *entry_point); -void wdsp_flush_segment_list(struct list_head *seg_list); - -#endif /* __WCD_DSP_UTILS_H__ */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd-irq.c b/techpack/audio/4.0/asoc/codecs/wcd-irq.c deleted file mode 100644 index 490913d9d424..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-irq.c +++ /dev/null @@ -1,183 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int wcd_map_irq(struct wcd_irq_info *irq_info, int irq) -{ - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return -EINVAL; - } - return regmap_irq_get_virq(irq_info->irq_chip, irq); -} - -/** - * wcd_request_irq: Request a thread handler for the given IRQ - * @irq_info: pointer to IRQ info structure - * @irq: irq number - * @name: name for the IRQ thread - * @handler: irq handler - * @data: data pointer - * - * Returns 0 on success or error on failure - */ -int wcd_request_irq(struct wcd_irq_info *irq_info, int irq, const char *name, - irq_handler_t handler, void *data) -{ - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return -EINVAL; - } - irq = wcd_map_irq(irq_info, irq); - if (irq < 0) - return irq; - - return request_threaded_irq(irq, NULL, handler, - IRQF_ONESHOT | IRQF_TRIGGER_RISING, - name, data); -} -EXPORT_SYMBOL(wcd_request_irq); - -/** - * wcd_free_irq: Free the IRQ resources allocated during request_irq - * @irq_info: pointer to IRQ info structure - * @irq: irq number - * @data: data pointer - */ -void wcd_free_irq(struct wcd_irq_info *irq_info, int irq, void *data) -{ - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return; - } - - irq = wcd_map_irq(irq_info, irq); - if (irq < 0) - return; - - free_irq(irq, data); -} -EXPORT_SYMBOL(wcd_free_irq); - -/** - * wcd_enable_irq: Enable the given IRQ - * @irq_info: pointer to IRQ info structure - * @irq: irq number - */ -void wcd_enable_irq(struct wcd_irq_info *irq_info, int irq) -{ - if (!irq_info) - pr_err("%s: Null IRQ handle\n", __func__); - else - enable_irq(wcd_map_irq(irq_info, irq)); -} -EXPORT_SYMBOL(wcd_enable_irq); - -/** - * wcd_disable_irq: Disable the given IRQ - * @irq_info: pointer to IRQ info structure - * @irq: irq number - */ -void wcd_disable_irq(struct wcd_irq_info *irq_info, int irq) -{ - if (!irq_info) - pr_err("%s: Null IRQ handle\n", __func__); - else - disable_irq_nosync(wcd_map_irq(irq_info, irq)); -} -EXPORT_SYMBOL(wcd_disable_irq); - -static void wcd_irq_chip_disable(struct irq_data *data) -{ -} - -static void wcd_irq_chip_enable(struct irq_data *data) -{ -} - -static struct irq_chip wcd_irq_chip = { - .name = NULL, - .irq_disable = wcd_irq_chip_disable, - .irq_enable = wcd_irq_chip_enable, -}; - -static struct lock_class_key wcd_irq_lock_class; - -static int wcd_irq_chip_map(struct irq_domain *irqd, unsigned int virq, - irq_hw_number_t hw) -{ - irq_set_chip_and_handler(virq, &wcd_irq_chip, handle_simple_irq); - irq_set_lockdep_class(virq, &wcd_irq_lock_class); - irq_set_nested_thread(virq, 1); - irq_set_noprobe(virq); - - return 0; -} - -static const struct irq_domain_ops wcd_domain_ops = { - .map = wcd_irq_chip_map, -}; - -/** - * wcd_irq_init: Initializes IRQ module - * @irq_info: pointer to IRQ info structure - * - * Returns 0 on success or error on failure - */ -int wcd_irq_init(struct wcd_irq_info *irq_info, struct irq_domain **virq) -{ - int ret = 0; - - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return -EINVAL; - } - - wcd_irq_chip.name = irq_info->codec_name; - - *virq = irq_domain_add_linear(NULL, 1, &wcd_domain_ops, NULL); - if (!(*virq)) { - pr_err("%s: Failed to add IRQ domain\n", __func__); - return -EINVAL; - } - - ret = devm_regmap_add_irq_chip(irq_info->dev, irq_info->regmap, - irq_create_mapping(*virq, 0), - IRQF_ONESHOT, 0, irq_info->wcd_regmap_irq_chip, - &irq_info->irq_chip); - if (ret) - pr_err("%s: Failed to add IRQs: %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(wcd_irq_init); - -/** - * wcd_irq_exit: Uninitialize regmap IRQ and free IRQ resources - * @irq_info: pointer to IRQ info structure - * - * Returns 0 on success or error on failure - */ -int wcd_irq_exit(struct wcd_irq_info *irq_info, struct irq_domain *virq) -{ - if (!irq_info) { - pr_err("%s: Null pointer handle\n", __func__); - return -EINVAL; - } - - regmap_del_irq_chip(irq_find_mapping(virq, 0), irq_info->irq_chip); - - return 0; -} -EXPORT_SYMBOL(wcd_irq_exit); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c deleted file mode 100644 index 7db02eddaea5..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c +++ /dev/null @@ -1,1141 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-mbhc-adc.h" -#include -#include - -#define WCD_MBHC_ADC_HS_THRESHOLD_MV 1700 -#define WCD_MBHC_ADC_HPH_THRESHOLD_MV 75 -#define WCD_MBHC_ADC_MICBIAS_MV 1800 -#define WCD_MBHC_FAKE_INS_RETRY 4 - -static int wcd_mbhc_get_micbias(struct wcd_mbhc *mbhc) -{ - int micbias = 0; - u8 vout_ctl = 0; - - /* Read MBHC Micbias (Mic Bias2) voltage */ - WCD_MBHC_REG_READ(WCD_MBHC_MICB2_VOUT, vout_ctl); - - /* Formula for getting micbias from vout - * micbias = 1.0V + VOUT_CTL * 50mV - */ - micbias = 1000 + (vout_ctl * 50); - pr_debug("%s: vout_ctl: %d, micbias: %d\n", - __func__, vout_ctl, micbias); - - return micbias; -} - -static int wcd_get_voltage_from_adc(u8 val, int micbias) -{ - /* Formula for calculating voltage from ADC - * Voltage = ADC_RESULT*12.5mV*V_MICBIAS/1.8 - */ - return ((val * 125 * micbias)/(WCD_MBHC_ADC_MICBIAS_MV * 10)); -} - -static int wcd_measure_adc_continuous(struct wcd_mbhc *mbhc) -{ - u8 adc_result = 0; - int output_mv = 0; - int retry = 3; - u8 adc_en = 0; - - pr_debug("%s: enter\n", __func__); - - /* Pre-requisites for ADC continuous measurement */ - /* Read legacy electircal detection and disable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0x00); - /* Set ADC to continuous measurement */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 1); - /* Read ADC Enable bit to restore after adc measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_EN, adc_en); - /* Disable ADC_ENABLE bit */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - /* Disable MBHC FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the MUX selection to IN2P */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, MUX_CTL_IN2P); - /* Enable MBHC FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - /* Enable ADC_ENABLE bit */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 1); - - while (retry--) { - /* wait for 3 msec before reading ADC result */ - usleep_range(3000, 3100); - - /* Read ADC result */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_RESULT, adc_result); - } - - /* Restore ADC Enable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, adc_en); - /* Get voltage from ADC result */ - output_mv = wcd_get_voltage_from_adc(adc_result, - wcd_mbhc_get_micbias(mbhc)); - pr_debug("%s: adc_result: 0x%x, output_mv: %d\n", - __func__, adc_result, output_mv); - - return output_mv; -} - -static int wcd_measure_adc_once(struct wcd_mbhc *mbhc, int mux_ctl) -{ - u8 adc_timeout = 0; - u8 adc_complete = 0; - u8 adc_result = 0; - int retry = 6; - int ret = 0; - int output_mv = 0; - u8 adc_en = 0; - - pr_debug("%s: enter\n", __func__); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - /* Read ADC Enable bit to restore after adc measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_EN, adc_en); - /* Trigger ADC one time measurement */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the appropriate MUX selection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, mux_ctl); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 1); - - while (retry--) { - /* wait for 600usec to get adc results */ - usleep_range(600, 610); - - /* check for ADC Timeout */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_TIMEOUT, adc_timeout); - if (adc_timeout) - continue; - - /* Read ADC complete bit */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_COMPLETE, adc_complete); - if (!adc_complete) - continue; - - /* Read ADC result */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_RESULT, adc_result); - - pr_debug("%s: ADC result: 0x%x\n", __func__, adc_result); - /* Get voltage from ADC result */ - output_mv = wcd_get_voltage_from_adc(adc_result, - wcd_mbhc_get_micbias(mbhc)); - break; - } - - /* Restore ADC Enable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, adc_en); - - if (retry <= 0) { - pr_err("%s: adc complete: %d, adc timeout: %d\n", - __func__, adc_complete, adc_timeout); - ret = -EINVAL; - } else { - pr_debug("%s: adc complete: %d, adc timeout: %d output_mV: %d\n", - __func__, adc_complete, adc_timeout, output_mv); - ret = output_mv; - } - - pr_debug("%s: leave\n", __func__); - - return ret; -} - -static bool wcd_mbhc_adc_detect_anc_plug_type(struct wcd_mbhc *mbhc) -{ - bool anc_mic_found = false; - u16 fsm_en = 0; - u8 det = 0; - unsigned long retry = 0; - int valid_plug_cnt = 0, invalid_plug_cnt = 0; - int ret = 0; - u8 elect_ctl = 0; - u8 adc_mode = 0; - u8 vref = 0; - int vref_mv[] = {1650, 1500, 1600, 1700}; - - if (mbhc->mbhc_cfg->anc_micbias < MIC_BIAS_1 || - mbhc->mbhc_cfg->anc_micbias > MIC_BIAS_4) - return false; - - if (!mbhc->mbhc_cb->mbhc_micbias_control) - return false; - - /* Disable Detection done for ADC operation */ - WCD_MBHC_REG_READ(WCD_MBHC_DETECTION_DONE, det); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - - /* Mask ADC COMPLETE interrupt */ - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_ENABLE); - - /* Read legacy electircal detection and disable */ - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0x00); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 1); - WCD_MBHC_REG_READ(WCD_MBHC_ADC_MODE, adc_mode); - - /* - * wait for button debounce time 20ms. If 4-pole plug is inserted - * into 5-pole jack, then there will be a button press interrupt - * during anc plug detection. In that case though Hs_comp_res is 0, - * it should not be declared as ANC plug type - */ - usleep_range(20000, 20100); - - /* - * After enabling FSM, to handle slow insertion scenarios, - * check IN3 voltage is below the Vref - */ - WCD_MBHC_REG_READ(WCD_MBHC_HS_VREF, vref); - - do { - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto done; - } - pr_debug("%s: Retry attempt %lu\n", __func__, retry + 1); - ret = wcd_measure_adc_once(mbhc, MUX_CTL_IN3P); - /* TODO - check the logic */ - if (ret && (ret < vref_mv[vref])) - valid_plug_cnt++; - else - invalid_plug_cnt++; - retry++; - } while (retry < ANC_DETECT_RETRY_CNT); - - pr_debug("%s: valid: %d, invalid: %d\n", __func__, valid_plug_cnt, - invalid_plug_cnt); - - /* decision logic */ - if (valid_plug_cnt > invalid_plug_cnt) - anc_mic_found = true; -done: - /* Restore ADC mode */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, adc_mode); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the MUX selection to AUTO */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, MUX_CTL_AUTO); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, fsm_en); - /* Restore detection done */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, det); - - /* Restore electrical detection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_DISABLE); - pr_debug("%s: anc mic %sfound\n", __func__, - anc_mic_found ? "" : "not "); - - return anc_mic_found; -} - -/* To determine if cross connection occurred */ -static int wcd_check_cross_conn(struct wcd_mbhc *mbhc) -{ - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_NONE; - int hphl_adc_res = 0, hphr_adc_res = 0; - u8 fsm_en = 0; - int ret = 0; - u8 adc_mode = 0; - u8 elect_ctl = 0; - u8 adc_en = 0; - - pr_debug("%s: enter\n", __func__); - /* Check for button press and plug detection */ - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - return -EINVAL; - } - - /* If PA is enabled, dont check for cross-connection */ - if (mbhc->mbhc_cb->hph_pa_on_status) - if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) - return -EINVAL; - - /* Read legacy electircal detection and disable */ - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0x00); - - /* Read and set ADC to single measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_MODE, adc_mode); - /* Read ADC Enable bit to restore after adc measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_EN, adc_en); - /* Read FSM status */ - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - - /* Get adc result for HPH L */ - hphl_adc_res = wcd_measure_adc_once(mbhc, MUX_CTL_HPH_L); - if (hphl_adc_res < 0) { - pr_err("%s: hphl_adc_res adc measurement failed\n", __func__); - ret = hphl_adc_res; - goto done; - } - - /* Get adc result for HPH R in mV */ - hphr_adc_res = wcd_measure_adc_once(mbhc, MUX_CTL_HPH_R); - if (hphr_adc_res < 0) { - pr_err("%s: hphr_adc_res adc measurement failed\n", __func__); - ret = hphr_adc_res; - goto done; - } - - if (hphl_adc_res > 100 || hphr_adc_res > 100) { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Cross connection identified\n", __func__); - } else { - pr_debug("%s: No Cross connection found\n", __func__); - } - -done: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the MUX selection to Auto */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, MUX_CTL_AUTO); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - - /* Restore ADC Enable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, adc_en); - - /* Restore ADC mode */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, adc_mode); - - /* Restore FSM state */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, fsm_en); - - /* Restore electrical detection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - - pr_debug("%s: leave, plug type: %d\n", __func__, plug_type); - - return (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP) ? true : false; -} - -static int wcd_mbhc_adc_get_spl_hs_thres(struct wcd_mbhc *mbhc) -{ - int hs_threshold, micbias_mv; - - micbias_mv = wcd_mbhc_get_micbias(mbhc); - if (mbhc->hs_thr && mbhc->micb_mv != WCD_MBHC_ADC_MICBIAS_MV) { - if (mbhc->micb_mv == micbias_mv) - hs_threshold = mbhc->hs_thr; - else - hs_threshold = (mbhc->hs_thr * - micbias_mv) / mbhc->micb_mv; - } else { - hs_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV * - micbias_mv) / WCD_MBHC_ADC_MICBIAS_MV); - } - return hs_threshold; -} - -static int wcd_mbhc_adc_get_hs_thres(struct wcd_mbhc *mbhc) -{ - int hs_threshold, micbias_mv; - - micbias_mv = wcd_mbhc_get_micbias(mbhc); - if (mbhc->hs_thr) { - if (mbhc->micb_mv == micbias_mv) - hs_threshold = mbhc->hs_thr; - else - hs_threshold = (mbhc->hs_thr * - micbias_mv) / mbhc->micb_mv; - } else { - hs_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV * - micbias_mv) / WCD_MBHC_ADC_MICBIAS_MV); - } - return hs_threshold; -} - -static int wcd_mbhc_adc_get_hph_thres(struct wcd_mbhc *mbhc) -{ - int hph_threshold, micbias_mv; - - micbias_mv = wcd_mbhc_get_micbias(mbhc); - if (mbhc->hph_thr) { - if (mbhc->micb_mv == micbias_mv) - hph_threshold = mbhc->hph_thr; - else - hph_threshold = (mbhc->hph_thr * - micbias_mv) / mbhc->micb_mv; - } else { - hph_threshold = ((WCD_MBHC_ADC_HPH_THRESHOLD_MV * - micbias_mv) / WCD_MBHC_ADC_MICBIAS_MV); - } - return hph_threshold; -} - -static bool wcd_mbhc_adc_check_for_spl_headset(struct wcd_mbhc *mbhc, - int *spl_hs_cnt) -{ - bool spl_hs = false; - int output_mv = 0; - int adc_threshold = 0, adc_hph_threshold = 0; - - pr_debug("%s: enter\n", __func__); - if (!mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - goto exit; - - /* Bump up MB2 to 2.7V */ - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, true); - usleep_range(10000, 10100); - - /* - * Use ADC single mode to minimize the chance of missing out - * btn press/relesae for HEADSET type during correct work. - */ - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - adc_threshold = wcd_mbhc_adc_get_spl_hs_thres(mbhc); - adc_hph_threshold = wcd_mbhc_adc_get_hph_thres(mbhc); - - if (output_mv > adc_threshold || output_mv < adc_hph_threshold) { - spl_hs = false; - } else { - spl_hs = true; - if (spl_hs_cnt) - *spl_hs_cnt += 1; - } - - /* MB2 back to 1.8v if the type is not special headset */ - if (spl_hs_cnt && (*spl_hs_cnt != WCD_MBHC_SPL_HS_CNT)) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, false); - /* Add 10ms delay for micbias to settle */ - usleep_range(10000, 10100); - } - - if (spl_hs) - pr_debug("%s: Detected special HS (%d)\n", __func__, spl_hs); - -exit: - pr_debug("%s: leave\n", __func__); - return spl_hs; -} - -static bool wcd_is_special_headset(struct wcd_mbhc *mbhc) -{ - int delay = 0; - bool ret = false; - bool is_spl_hs = false; - int output_mv = 0; - int adc_threshold = 0; - - /* - * Increase micbias to 2.7V to detect headsets with - * threshold on microphone - */ - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - pr_debug("%s: callback fn micb_ctrl_thr_mic not defined\n", - __func__); - return false; - } else if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - ret = mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - MIC_BIAS_2, true); - if (ret) { - pr_err("%s: mbhc_micb_ctrl_thr_mic failed, ret: %d\n", - __func__, ret); - return false; - } - } - adc_threshold = wcd_mbhc_adc_get_spl_hs_thres(mbhc); - - while (!is_spl_hs) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - break; - } - delay += 50; - /* Wait for 50ms for FSM to update result */ - msleep(50); - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - if (output_mv <= adc_threshold) { - pr_debug("%s: Special headset detected in %d msecs\n", - __func__, delay); - is_spl_hs = true; - } - - if (delay == SPECIAL_HS_DETECT_TIME_MS) { - pr_debug("%s: Spl headset not found in 2 sec\n", - __func__); - break; - } - } - if (is_spl_hs) { - pr_debug("%s: Headset with threshold found\n", __func__); - mbhc->micbias_enable = true; - ret = true; - } - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, MIC_BIAS_2, - false); - pr_debug("%s: leave, micb_enable: %d\n", __func__, - mbhc->micbias_enable); - - return ret; -} - -static void wcd_mbhc_adc_update_fsm_source(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - bool micbias2; - - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); - switch (plug_type) { - case MBHC_PLUG_TYPE_HEADPHONE: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - break; - case MBHC_PLUG_TYPE_HEADSET: - case MBHC_PLUG_TYPE_ANC_HEADPHONE: - if (!mbhc->is_hs_recording && !micbias2) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - break; - default: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - break; - - }; -} - -/* should be called under interrupt context that hold suspend */ -static void wcd_schedule_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: scheduling correct_swch_plug\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - mbhc->hs_detect_work_stop = false; - mbhc->mbhc_cb->lock_sleep(mbhc, true); - schedule_work(work); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_cancel_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: Canceling correct_plug_swch\n", __func__); - mbhc->hs_detect_work_stop = true; - WCD_MBHC_RSC_UNLOCK(mbhc); - if (cancel_work_sync(work)) { - pr_debug("%s: correct_plug_swch is canceled\n", - __func__); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } - WCD_MBHC_RSC_LOCK(mbhc); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_mbhc_adc_detect_plug_type(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, false); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - - if (mbhc->mbhc_cb->mbhc_micbias_control) { - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_ENABLE); - } else { - pr_err("%s: Mic Bias is not enabled\n", __func__); - return; - } - - /* Re-initialize button press completion object */ - reinit_completion(&mbhc->btn_press_compl); - wcd_schedule_hs_detect_plug(mbhc, &mbhc->correct_plug_swch); - pr_debug("%s: leave\n", __func__); -} - -static void wcd_micbias_disable(struct wcd_mbhc *mbhc) -{ - if (mbhc->micbias_enable) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) - mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); - mbhc->micbias_enable = false; - } -} - -static int wcd_mbhc_get_plug_from_adc(struct wcd_mbhc *mbhc, int adc_result) - -{ - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID; - u32 hph_thr = 0, hs_thr = 0; - - hs_thr = wcd_mbhc_adc_get_hs_thres(mbhc); - hph_thr = wcd_mbhc_adc_get_hph_thres(mbhc); - - if (adc_result < hph_thr) - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - else if (adc_result > hs_thr) - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - else - plug_type = MBHC_PLUG_TYPE_HEADSET; - pr_debug("%s: plug type is %d found\n", __func__, plug_type); - - return plug_type; -} - -static void wcd_correct_swch_plug(struct work_struct *work) -{ - struct wcd_mbhc *mbhc; - struct snd_soc_codec *codec; - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID; - unsigned long timeout; - bool wrk_complete = false; - int pt_gnd_mic_swap_cnt = 0; - int no_gnd_mic_swap_cnt = 0; - bool is_pa_on = false, spl_hs = false, spl_hs_reported = false; - int ret = 0; - int spl_hs_count = 0; - int output_mv = 0; - int cross_conn; - int try = 0; - int hs_threshold, micbias_mv; - - pr_debug("%s: enter\n", __func__); - - mbhc = container_of(work, struct wcd_mbhc, correct_plug_swch); - codec = mbhc->codec; - - micbias_mv = wcd_mbhc_get_micbias(mbhc); - hs_threshold = wcd_mbhc_adc_get_hs_thres(mbhc); - - WCD_MBHC_RSC_LOCK(mbhc); - /* Mask ADC COMPLETE interrupt */ - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_RSC_UNLOCK(mbhc); - - /* Check for cross connection */ - do { - cross_conn = wcd_check_cross_conn(mbhc); - try++; - } while (try < mbhc->swap_thr); - - if (cross_conn > 0) { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: cross connection found, Plug type %d\n", - __func__, plug_type); - goto correct_plug_type; - } - /* Find plug type */ - output_mv = wcd_measure_adc_continuous(mbhc); - plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv); - - /* - * Report plug type if it is either headset or headphone - * else start the 3 sec loop - */ - if ((plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE) && - (!wcd_swch_level_remove(mbhc))) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - - /* - * Set DETECTION_DONE bit for HEADSET and ANC_HEADPHONE, - * so that btn press/release interrupt can be generated. - */ - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET || - mbhc->current_plug == MBHC_PLUG_TYPE_ANC_HEADPHONE) { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 1); - } - -correct_plug_type: - /* - * Callback to disable BCS slow insertion detection - */ - if (plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE) - if (mbhc->mbhc_cb->bcs_enable) - mbhc->mbhc_cb->bcs_enable(mbhc, false); - - timeout = jiffies + msecs_to_jiffies(HS_DETECT_PLUG_TIME_MS); - while (!time_after(jiffies, timeout)) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_micbias_disable(mbhc); - goto exit; - } - - /* allow sometime and re-check stop requested again */ - msleep(20); - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_micbias_disable(mbhc); - goto exit; - } - - msleep(180); - /* - * Use ADC single mode to minimize the chance of missing out - * btn press/release for HEADSET type during correct work. - */ - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - - /* - * instead of hogging system by contineous polling, wait for - * sometime and re-check stop request again. - */ - plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv); - - if ((output_mv > hs_threshold) && - (spl_hs_count < WCD_MBHC_SPL_HS_CNT)) { - spl_hs = wcd_mbhc_adc_check_for_spl_headset(mbhc, - &spl_hs_count); - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - - if (spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - hs_threshold = (hs_threshold * - wcd_mbhc_get_micbias(mbhc)) / micbias_mv; - spl_hs = true; - mbhc->micbias_enable = true; - } - } - - if (mbhc->mbhc_cb->hph_pa_on_status) - is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec); - - if ((output_mv <= hs_threshold) && - (!is_pa_on)) { - /* Check for cross connection*/ - ret = wcd_check_cross_conn(mbhc); - if (ret < 0) - continue; - else if (ret > 0) { - pt_gnd_mic_swap_cnt++; - no_gnd_mic_swap_cnt = 0; - if (pt_gnd_mic_swap_cnt < - mbhc->swap_thr) { - continue; - } else if (pt_gnd_mic_swap_cnt > - mbhc->swap_thr) { - /* - * This is due to GND/MIC switch didn't - * work, Report unsupported plug. - */ - pr_debug("%s: switch did not work\n", - __func__); - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - goto report; - } else { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - } - } else { - no_gnd_mic_swap_cnt++; - pt_gnd_mic_swap_cnt = 0; - plug_type = wcd_mbhc_get_plug_from_adc( - mbhc, output_mv); - if ((no_gnd_mic_swap_cnt < - mbhc->swap_thr) && - (spl_hs_count != WCD_MBHC_SPL_HS_CNT)) { - continue; - } else { - no_gnd_mic_swap_cnt = 0; - } - } - if ((pt_gnd_mic_swap_cnt == mbhc->swap_thr) && - (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { - /* - * if switch is toggled, check again, - * otherwise report unsupported plug - */ - if (mbhc->mbhc_cfg->swap_gnd_mic && - mbhc->mbhc_cfg->swap_gnd_mic(codec, - true)) { - pr_debug("%s: US_EU gpio present,flip switch\n" - , __func__); - continue; - } - } - } - - if (output_mv > hs_threshold) { - pr_debug("%s: cable is extension cable\n", __func__); - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - wrk_complete = true; - } else { - pr_debug("%s: cable might be headset: %d\n", __func__, - plug_type); - if (plug_type != MBHC_PLUG_TYPE_GND_MIC_SWAP) { - plug_type = wcd_mbhc_get_plug_from_adc( - mbhc, output_mv); - if (!spl_hs_reported && - spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - spl_hs_reported = true; - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, - plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - continue; - } else if (spl_hs_reported) - continue; - /* - * Report headset only if not already reported - * and if there is not button press without - * release - */ - if ((mbhc->current_plug != - MBHC_PLUG_TYPE_HEADSET) && - (mbhc->current_plug != - MBHC_PLUG_TYPE_ANC_HEADPHONE) && - !wcd_swch_level_remove(mbhc)) { - pr_debug("%s: cable is %s headset\n", - __func__, - ((spl_hs_count == - WCD_MBHC_SPL_HS_CNT) ? - "special ":"")); - goto report; - } - } - wrk_complete = false; - } - } - if ((plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE)) - if (mbhc->mbhc_cb->bcs_enable) - mbhc->mbhc_cb->bcs_enable(mbhc, true); - if (!wrk_complete) { - /* - * If plug_tye is headset, we might have already reported either - * in detect_plug-type or in above while loop, no need to report - * again - */ - if ((plug_type == MBHC_PLUG_TYPE_HEADSET) || - (plug_type == MBHC_PLUG_TYPE_ANC_HEADPHONE)) { - pr_debug("%s: plug_type:0x%x already reported\n", - __func__, mbhc->current_plug); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - goto enable_supply; - } - } - if (plug_type == MBHC_PLUG_TYPE_HIGH_HPH) { - if (wcd_is_special_headset(mbhc)) { - pr_debug("%s: Special headset found %d\n", - __func__, plug_type); - plug_type = MBHC_PLUG_TYPE_HEADSET; - } else { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_ISRC_EN, 1); - } - } - -report: - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto exit; - } - - pr_debug("%s: Valid plug found, plug type %d wrk_cmpt %d btn_intr %d\n", - __func__, plug_type, wrk_complete, - mbhc->btn_press_intr); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); -enable_supply: - /* - * Set DETECTION_DONE bit for HEADSET and ANC_HEADPHONE, - * so that btn press/release interrupt can be generated. - * For other plug type, clear the bit. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_ANC_HEADPHONE) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 1); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - - if (mbhc->mbhc_cb->mbhc_micbias_control) - wcd_mbhc_adc_update_fsm_source(mbhc, plug_type); -exit: - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_DISABLE); - - /* - * If plug type is corrected from special headset to headphone, - * clear the micbias enable flag, set micbias back to 1.8V and - * disable micbias. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE && - mbhc->micbias_enable) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(codec); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - - if (mbhc->mbhc_cfg->detect_extn_cable && - ((plug_type == MBHC_PLUG_TYPE_HEADPHONE) || - (plug_type == MBHC_PLUG_TYPE_HEADSET)) && - !mbhc->hs_detect_work_stop) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, true); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - - /* - * Enable ADC COMPLETE interrupt for HEADPHONE. - * Btn release may happen after the correct work, ADC COMPLETE - * interrupt needs to be captured to correct plug type. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - true); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, true); - - mbhc->mbhc_cb->lock_sleep(mbhc, false); - pr_debug("%s: leave\n", __func__); -} - -static irqreturn_t wcd_mbhc_adc_hs_rem_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - unsigned long timeout; - int adc_threshold, output_mv, retry = 0; - bool hphpa_on = false; - u8 moisture_status = 0; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - - timeout = jiffies + - msecs_to_jiffies(WCD_FAKE_REMOVAL_MIN_PERIOD_MS); - adc_threshold = wcd_mbhc_adc_get_hs_thres(mbhc); - - do { - retry++; - /* - * read output_mv every 10ms to look for - * any change in IN2_P - */ - usleep_range(10000, 10100); - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - - pr_debug("%s: Check for fake removal: output_mv %d\n", - __func__, output_mv); - if ((output_mv <= adc_threshold) && - retry > FAKE_REM_RETRY_ATTEMPTS) { - pr_debug("%s: headset is NOT actually removed\n", - __func__); - goto exit; - } - } while (!time_after(jiffies, timeout)); - - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto exit; - } - - if (mbhc->mbhc_cfg->moisture_en) { - if (mbhc->mbhc_cb->hph_pa_on_status) - if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) { - hphpa_on = true; - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_HPH_PA_EN, 0); - } - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1); - /* wait for 50ms to get moisture status */ - usleep_range(50000, 50100); - - WCD_MBHC_REG_READ(WCD_MBHC_MOISTURE_STATUS, moisture_status); - } - - if (mbhc->mbhc_cfg->moisture_en && !moisture_status) { - pr_debug("%s: moisture present in jack\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); - else if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE); - else if (mbhc->current_plug == MBHC_PLUG_TYPE_GND_MIC_SWAP) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_UNSUPPORTED); - else if (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_LINEOUT); - } else { - /* - * ADC COMPLETE and ELEC_REM interrupts are both enabled for - * HEADPHONE, need to reject the ADC COMPLETE interrupt which - * follows ELEC_REM one when HEADPHONE is removed. - */ - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) - mbhc->extn_cable_hph_rem = true; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - wcd_mbhc_elec_hs_report_unplug(mbhc); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - - if (hphpa_on) { - hphpa_on = false; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 3); - } - } -exit: - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_adc_hs_ins_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - u8 clamp_state = 0; - u8 clamp_retry = WCD_MBHC_FAKE_INS_RETRY; - - pr_debug("%s: enter\n", __func__); - - /* - * ADC COMPLETE and ELEC_REM interrupts are both enabled for HEADPHONE, - * need to reject the ADC COMPLETE interrupt which follows ELEC_REM one - * when HEADPHONE is removed. - */ - if (mbhc->extn_cable_hph_rem == true) { - mbhc->extn_cable_hph_rem = false; - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; - } - - do { - WCD_MBHC_REG_READ(WCD_MBHC_IN2P_CLAMP_STATE, clamp_state); - if (clamp_state) { - pr_debug("%s: fake insertion irq, leave\n", __func__); - return IRQ_HANDLED; - } - /* - * check clamp for 120ms but at 30ms chunks to leave - * room for other interrupts to be processed - */ - usleep_range(30000, 30100); - } while (--clamp_retry); - - WCD_MBHC_RSC_LOCK(mbhc); - /* - * If current plug is headphone then there is no chance to - * get ADC complete interrupt, so connected cable should be - * headset not headphone. - */ - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 1); - wcd_mbhc_find_plug_and_report(mbhc, MBHC_PLUG_TYPE_HEADSET); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; - } - - if (!mbhc->mbhc_cfg->detect_extn_cable) { - pr_debug("%s: Returning as Extension cable feature not enabled\n", - __func__); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; - } - - pr_debug("%s: Disable electrical headset insertion interrupt\n", - __func__); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_ISRC_EN, 0); - mbhc->is_extn_cable = true; - mbhc->btn_press_intr = false; - mbhc->force_linein = false; - wcd_mbhc_adc_detect_plug_type(mbhc); - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static struct wcd_mbhc_fn mbhc_fn = { - .wcd_mbhc_hs_ins_irq = wcd_mbhc_adc_hs_ins_irq, - .wcd_mbhc_hs_rem_irq = wcd_mbhc_adc_hs_rem_irq, - .wcd_mbhc_detect_plug_type = wcd_mbhc_adc_detect_plug_type, - .wcd_mbhc_detect_anc_plug_type = wcd_mbhc_adc_detect_anc_plug_type, - .wcd_cancel_hs_detect_plug = wcd_cancel_hs_detect_plug, -}; - -/* Function: wcd_mbhc_adc_init - * @mbhc: MBHC function pointer - * Description: Initialize MBHC ADC related function pointers to MBHC structure - */ -void wcd_mbhc_adc_init(struct wcd_mbhc *mbhc) -{ - if (!mbhc) { - pr_err("%s: mbhc is NULL\n", __func__); - return; - } - mbhc->mbhc_fn = &mbhc_fn; - INIT_WORK(&mbhc->correct_plug_swch, wcd_correct_swch_plug); -} -EXPORT_SYMBOL(wcd_mbhc_adc_init); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.h b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.h deleted file mode 100644 index 97fd12d8a08c..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.h +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD_MBHC_ADC_H__ -#define __WCD_MBHC_ADC_H__ - -#include - -enum wcd_mbhc_adc_mux_ctl { - MUX_CTL_AUTO = 0, - MUX_CTL_IN2P, - MUX_CTL_IN3P, - MUX_CTL_IN4P, - MUX_CTL_HPH_L, - MUX_CTL_HPH_R, - MUX_CTL_NONE, -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_MBHC_ADC) -void wcd_mbhc_adc_init(struct wcd_mbhc *mbhc); -#else -static inline void wcd_mbhc_adc_init(struct wcd_mbhc *mbhc) -{ - -} -#endif -#endif /* __WCD_MBHC_ADC_H__ */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.c b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.c deleted file mode 100644 index 524db6fc1e72..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.c +++ /dev/null @@ -1,1029 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2018, 2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-mbhc-legacy.h" -#include - -static int det_extn_cable_en; -module_param(det_extn_cable_en, int, 0664); -MODULE_PARM_DESC(det_extn_cable_en, "enable/disable extn cable detect"); - -static bool wcd_mbhc_detect_anc_plug_type(struct wcd_mbhc *mbhc) -{ - bool anc_mic_found = false; - u16 val, hs_comp_res, btn_status = 0; - unsigned long retry = 0; - int valid_plug_cnt = 0, invalid_plug_cnt = 0; - int btn_status_cnt = 0; - bool is_check_btn_press = false; - - - if (mbhc->mbhc_cfg->anc_micbias < MIC_BIAS_1 || - mbhc->mbhc_cfg->anc_micbias > MIC_BIAS_4) - return false; - - if (!mbhc->mbhc_cb->mbhc_micbias_control) - return false; - - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, val); - - if (val) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_ENABLE); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, 0x2); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - /* - * wait for button debounce time 20ms. If 4-pole plug is inserted - * into 5-pole jack, then there will be a button press interrupt - * during anc plug detection. In that case though Hs_comp_res is 0, - * it should not be declared as ANC plug type - */ - usleep_range(20000, 20100); - - /* - * After enabling FSM, to handle slow insertion scenarios, - * check hs_comp_result for few times to see if the IN3 voltage - * is below the Vref - */ - do { - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto exit; - } - pr_debug("%s: Retry attempt %lu\n", __func__, retry + 1); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - - if (!hs_comp_res) { - valid_plug_cnt++; - is_check_btn_press = true; - } else - invalid_plug_cnt++; - /* Wait 1ms before taking another reading */ - usleep_range(1000, 1100); - - WCD_MBHC_REG_READ(WCD_MBHC_FSM_STATUS, btn_status); - if (btn_status) - btn_status_cnt++; - - retry++; - } while (retry < ANC_DETECT_RETRY_CNT); - - pr_debug("%s: valid: %d, invalid: %d, btn_status_cnt: %d\n", - __func__, valid_plug_cnt, invalid_plug_cnt, btn_status_cnt); - - /* decision logic */ - if ((valid_plug_cnt > invalid_plug_cnt) && is_check_btn_press && - (btn_status_cnt == 0)) - anc_mic_found = true; -exit: - if (!val) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 0); - - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_DISABLE); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, 0x0); - pr_debug("%s: anc mic %sfound\n", __func__, - anc_mic_found ? "" : "not "); - return anc_mic_found; -} - -/* To determine if cross connection occurred */ -static int wcd_check_cross_conn(struct wcd_mbhc *mbhc) -{ - u16 swap_res = 0; - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_NONE; - s16 reg1 = 0; - bool hphl_sch_res = 0, hphr_sch_res = 0; - - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - return -EINVAL; - } - - /* If PA is enabled, dont check for cross-connection */ - if (mbhc->mbhc_cb->hph_pa_on_status) - if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) - return false; - - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, reg1); - /* - * Check if there is any cross connection, - * Micbias and schmitt trigger (HPHL-HPHR) - * needs to be enabled. For some codecs like wcd9335, - * pull-up will already be enabled when this function - * is called for cross-connection identification. No - * need to enable micbias in that case. - */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 2); - - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_RESULT, swap_res); - pr_debug("%s: swap_res%x\n", __func__, swap_res); - - /* - * Read reg hphl and hphr schmitt result with cross connection - * bit. These bits will both be "0" in case of cross connection - * otherwise, they stay at 1 - */ - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch_res); - WCD_MBHC_REG_READ(WCD_MBHC_HPHR_SCHMT_RESULT, hphr_sch_res); - if (!(hphl_sch_res || hphr_sch_res)) { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Cross connection identified\n", __func__); - } else { - pr_debug("%s: No Cross connection found\n", __func__); - } - - /* Disable schmitt trigger and restore micbias */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, reg1); - pr_debug("%s: leave, plug type: %d\n", __func__, plug_type); - - return (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP) ? true : false; -} - -static bool wcd_is_special_headset(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - int delay = 0, rc; - bool ret = false; - u16 hs_comp_res; - bool is_spl_hs = false; - - /* - * Increase micbias to 2.7V to detect headsets with - * threshold on microphone - */ - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - pr_debug("%s: callback fn micb_ctrl_thr_mic not defined\n", - __func__); - return false; - } else if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - rc = mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(codec, - MIC_BIAS_2, true); - if (rc) { - pr_err("%s: Micbias control for thr mic failed, rc: %d\n", - __func__, rc); - return false; - } - } - - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - - pr_debug("%s: special headset, start register writes\n", __func__); - - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - while (!is_spl_hs) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - break; - } - delay = delay + 50; - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) { - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - true); - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_SET_VAL, - true); - } - /* Wait for 50msec for MICBIAS to settle down */ - msleep(50); - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, true); - /* Wait for 50msec for FSM to update result values */ - msleep(50); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - if (!(hs_comp_res)) { - pr_debug("%s: Special headset detected in %d msecs\n", - __func__, (delay * 2)); - is_spl_hs = true; - } - if (delay == SPECIAL_HS_DETECT_TIME_MS) { - pr_debug("%s: Spl headset didn't get detect in 4 sec\n", - __func__); - break; - } - } - if (is_spl_hs) { - pr_debug("%s: Headset with threshold found\n", __func__); - mbhc->micbias_enable = true; - ret = true; - } - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - false); - if (mbhc->mbhc_cb->set_micbias_value && !mbhc->micbias_enable) - mbhc->mbhc_cb->set_micbias_value(codec); - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, false); - - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(codec, MIC_BIAS_2, - false); - - pr_debug("%s: leave, micb_enable: %d\n", __func__, - mbhc->micbias_enable); - return ret; -} - -static void wcd_mbhc_update_fsm_source(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - bool micbias2; - - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); - switch (plug_type) { - case MBHC_PLUG_TYPE_HEADPHONE: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - break; - case MBHC_PLUG_TYPE_HEADSET: - case MBHC_PLUG_TYPE_ANC_HEADPHONE: - if (!mbhc->is_hs_recording && !micbias2) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - break; - default: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - break; - - }; -} - -static void wcd_enable_mbhc_supply(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - - struct snd_soc_codec *codec = mbhc->codec; - - /* - * Do not disable micbias if recording is going on or - * headset is inserted on the other side of the extn - * cable. If headset has been detected current source - * needs to be kept enabled for button detection to work. - * If the accessory type is invalid or unsupported, we - * dont need to enable either of them. - */ - if (det_extn_cable_en && mbhc->is_extn_cable && - mbhc->mbhc_cb && mbhc->mbhc_cb->extn_use_mb && - mbhc->mbhc_cb->extn_use_mb(codec)) { - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE || - plug_type == MBHC_PLUG_TYPE_HEADSET) - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - } else { - if (plug_type == MBHC_PLUG_TYPE_HEADSET) { - if (mbhc->is_hs_recording || mbhc->micbias_enable) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - } else if ((test_bit(WCD_MBHC_EVENT_PA_HPHL, - &mbhc->event_state)) || - (test_bit(WCD_MBHC_EVENT_PA_HPHR, - &mbhc->event_state))) { - wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_PULLUP); - } else { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - } - } else if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - } else { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_NONE); - } - } -} - -static bool wcd_mbhc_check_for_spl_headset(struct wcd_mbhc *mbhc, - int *spl_hs_cnt) -{ - u16 hs_comp_res_1_8v = 0, hs_comp_res_2_7v = 0; - bool spl_hs = false; - - if (!mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - goto done; - - if (!spl_hs_cnt) { - pr_err("%s: spl_hs_cnt is NULL\n", __func__); - goto done; - } - /* Read back hs_comp_res @ 1.8v Micbias */ - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res_1_8v); - if (!hs_comp_res_1_8v) { - spl_hs = false; - goto done; - } - - /* Bump up MB2 to 2.7v */ - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, true); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - usleep_range(10000, 10100); - - /* Read back HS_COMP_RESULT */ - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res_2_7v); - if (!hs_comp_res_2_7v && hs_comp_res_1_8v) - spl_hs = true; - - if (spl_hs) - *spl_hs_cnt += 1; - - /* MB2 back to 1.8v */ - if (*spl_hs_cnt != WCD_MBHC_SPL_HS_CNT) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - usleep_range(10000, 10100); - } - - if (spl_hs) - pr_debug("%s: Detected special HS (%d)\n", __func__, spl_hs); - -done: - return spl_hs; -} - -/* should be called under interrupt context that hold suspend */ -static void wcd_schedule_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: scheduling correct_swch_plug\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - mbhc->hs_detect_work_stop = false; - mbhc->mbhc_cb->lock_sleep(mbhc, true); - schedule_work(work); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_cancel_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: Canceling correct_plug_swch\n", __func__); - mbhc->hs_detect_work_stop = true; - WCD_MBHC_RSC_UNLOCK(mbhc); - if (cancel_work_sync(work)) { - pr_debug("%s: correct_plug_swch is canceled\n", - __func__); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } - WCD_MBHC_RSC_LOCK(mbhc); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_mbhc_detect_plug_type(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - bool micbias1 = false; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, false); - - if (mbhc->mbhc_cb->micbias_enable_status) - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, true); - - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_ENABLE); - else - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - - /* Re-initialize button press completion object */ - reinit_completion(&mbhc->btn_press_compl); - wcd_schedule_hs_detect_plug(mbhc, &mbhc->correct_plug_swch); - pr_debug("%s: leave\n", __func__); -} - -static void wcd_correct_swch_plug(struct work_struct *work) -{ - struct wcd_mbhc *mbhc; - struct snd_soc_codec *codec; - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID; - unsigned long timeout; - u16 hs_comp_res = 0, hphl_sch = 0, mic_sch = 0, btn_result = 0; - bool wrk_complete = false; - int pt_gnd_mic_swap_cnt = 0; - int no_gnd_mic_swap_cnt = 0; - bool is_pa_on = false, spl_hs = false, spl_hs_reported = false; - bool micbias2 = false; - bool micbias1 = false; - int ret = 0; - int rc, spl_hs_count = 0; - int cross_conn; - int try = 0; - - pr_debug("%s: enter\n", __func__); - - mbhc = container_of(work, struct wcd_mbhc, correct_plug_swch); - codec = mbhc->codec; - - /* - * Enable micbias/pullup for detection in correct work. - * This work will get scheduled from detect_plug_type which - * will already request for pullup/micbias. If the pullup/micbias - * is handled with ref-counts by individual codec drivers, there is - * no need to enabale micbias/pullup here - */ - - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - - /* Enable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - /* - * Check for any button press interrupts before starting 3-sec - * loop. - */ - rc = wait_for_completion_timeout(&mbhc->btn_press_compl, - msecs_to_jiffies(WCD_MBHC_BTN_PRESS_COMPL_TIMEOUT_MS)); - - WCD_MBHC_REG_READ(WCD_MBHC_BTN_RESULT, btn_result); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - - if (!rc) { - pr_debug("%s No btn press interrupt\n", __func__); - if (!btn_result && !hs_comp_res) - plug_type = MBHC_PLUG_TYPE_HEADSET; - else if (!btn_result && hs_comp_res) - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - else - plug_type = MBHC_PLUG_TYPE_INVALID; - } else { - if (!btn_result && !hs_comp_res) - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - else - plug_type = MBHC_PLUG_TYPE_INVALID; - } - - do { - cross_conn = wcd_check_cross_conn(mbhc); - try++; - } while (try < mbhc->swap_thr); - - /* - * Check for cross connection 4 times. - * Consider the result of the fourth iteration. - */ - if (cross_conn > 0) { - pr_debug("%s: cross con found, start polling\n", - __func__); - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Plug found, plug type is %d\n", - __func__, plug_type); - goto correct_plug_type; - } - - if ((plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE) && - (!wcd_swch_level_remove(mbhc))) { - WCD_MBHC_RSC_LOCK(mbhc); - if (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, - 0); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - -correct_plug_type: - - timeout = jiffies + msecs_to_jiffies(HS_DETECT_PLUG_TIME_MS); - while (!time_after(jiffies, timeout)) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_NONE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - mbhc->micbias_enable) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) - mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); - mbhc->micbias_enable = false; - } - goto exit; - } - if (mbhc->btn_press_intr) { - wcd_cancel_btn_work(mbhc); - mbhc->btn_press_intr = false; - } - /* Toggle FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - - /* allow sometime and re-check stop requested again */ - msleep(20); - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_NONE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - mbhc->micbias_enable) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) - mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); - mbhc->micbias_enable = false; - } - goto exit; - } - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - - pr_debug("%s: hs_comp_res: %x\n", __func__, hs_comp_res); - if (mbhc->mbhc_cb->hph_pa_on_status) - is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(codec); - - /* - * instead of hogging system by contineous polling, wait for - * sometime and re-check stop request again. - */ - msleep(180); - if (hs_comp_res && (spl_hs_count < WCD_MBHC_SPL_HS_CNT)) { - spl_hs = wcd_mbhc_check_for_spl_headset(mbhc, - &spl_hs_count); - - if (spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - hs_comp_res = 0; - spl_hs = true; - mbhc->micbias_enable = true; - } - } - - if ((!hs_comp_res) && (!is_pa_on)) { - /* Check for cross connection*/ - ret = wcd_check_cross_conn(mbhc); - if (ret < 0) { - continue; - } else if (ret > 0) { - pt_gnd_mic_swap_cnt++; - no_gnd_mic_swap_cnt = 0; - if (pt_gnd_mic_swap_cnt < - mbhc->swap_thr) { - continue; - } else if (pt_gnd_mic_swap_cnt > - mbhc->swap_thr) { - /* - * This is due to GND/MIC switch didn't - * work, Report unsupported plug. - */ - pr_debug("%s: switch didn't work\n", - __func__); - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - goto report; - } else { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - } - } else { - no_gnd_mic_swap_cnt++; - pt_gnd_mic_swap_cnt = 0; - plug_type = MBHC_PLUG_TYPE_HEADSET; - if ((no_gnd_mic_swap_cnt < - GND_MIC_SWAP_THRESHOLD) && - (spl_hs_count != WCD_MBHC_SPL_HS_CNT)) { - continue; - } else { - no_gnd_mic_swap_cnt = 0; - } - } - if ((pt_gnd_mic_swap_cnt == mbhc->swap_thr) && - (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { - /* - * if switch is toggled, check again, - * otherwise report unsupported plug - */ - if (mbhc->mbhc_cfg->swap_gnd_mic && - mbhc->mbhc_cfg->swap_gnd_mic(codec, - true)) { - pr_debug("%s: US_EU gpio present,flip switch\n" - , __func__); - continue; - } - } - } - - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); - WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); - if (hs_comp_res && !(hphl_sch || mic_sch)) { - pr_debug("%s: cable is extension cable\n", __func__); - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - wrk_complete = true; - } else { - pr_debug("%s: cable might be headset: %d\n", __func__, - plug_type); - if (!(plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { - plug_type = MBHC_PLUG_TYPE_HEADSET; - if (!spl_hs_reported && - spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - spl_hs_reported = true; - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, - plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - continue; - } else if (spl_hs_reported) - continue; - /* - * Report headset only if not already reported - * and if there is not button press without - * release - */ - if (((mbhc->current_plug != - MBHC_PLUG_TYPE_HEADSET) && - (mbhc->current_plug != - MBHC_PLUG_TYPE_ANC_HEADPHONE)) && - !wcd_swch_level_remove(mbhc) && - !mbhc->btn_press_intr) { - pr_debug("%s: cable is %sheadset\n", - __func__, - ((spl_hs_count == - WCD_MBHC_SPL_HS_CNT) ? - "special ":"")); - goto report; - } - } - wrk_complete = false; - } - } - if (!wrk_complete && mbhc->btn_press_intr) { - pr_debug("%s: Can be slow insertion of headphone\n", __func__); - wcd_cancel_btn_work(mbhc); - /* Report as headphone only if previously - * not reported as lineout - */ - if (!mbhc->force_linein) - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - } - /* - * If plug_tye is headset, we might have already reported either in - * detect_plug-type or in above while loop, no need to report again - */ - if (!wrk_complete && ((plug_type == MBHC_PLUG_TYPE_HEADSET) || - (plug_type == MBHC_PLUG_TYPE_ANC_HEADPHONE))) { - pr_debug("%s: plug_type:0x%x already reported\n", - __func__, mbhc->current_plug); - goto enable_supply; - } - - if (plug_type == MBHC_PLUG_TYPE_HIGH_HPH && - (!det_extn_cable_en)) { - if (wcd_is_special_headset(mbhc)) { - pr_debug("%s: Special headset found %d\n", - __func__, plug_type); - plug_type = MBHC_PLUG_TYPE_HEADSET; - goto report; - } - } - -report: - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto exit; - } - if (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP && mbhc->btn_press_intr) { - pr_debug("%s: insertion of headphone with swap\n", __func__); - wcd_cancel_btn_work(mbhc); - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - } - pr_debug("%s: Valid plug found, plug type %d wrk_cmpt %d btn_intr %d\n", - __func__, plug_type, wrk_complete, - mbhc->btn_press_intr); - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); -enable_supply: - if (mbhc->mbhc_cb->mbhc_micbias_control) - wcd_mbhc_update_fsm_source(mbhc, plug_type); - else - wcd_enable_mbhc_supply(mbhc, plug_type); -exit: - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_DISABLE); - - /* - * If plug type is corrected from special headset to headphone, - * clear the micbias enable flag, set micbias back to 1.8V and - * disable micbias. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE && - mbhc->micbias_enable) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(codec); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - - if (mbhc->mbhc_cb->micbias_enable_status) { - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); - } - - if (mbhc->mbhc_cfg->detect_extn_cable && - ((plug_type == MBHC_PLUG_TYPE_HEADPHONE) || - (plug_type == MBHC_PLUG_TYPE_HEADSET)) && - !mbhc->hs_detect_work_stop) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, true); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, micbias2); - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, true); - - mbhc->mbhc_cb->lock_sleep(mbhc, false); - pr_debug("%s: leave\n", __func__); -} - -static irqreturn_t wcd_mbhc_hs_rem_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - u8 hs_comp_result = 0, hphl_sch = 0, mic_sch = 0; - static u16 hphl_trigerred; - static u16 mic_trigerred; - unsigned long timeout; - bool removed = true; - int retry = 0; - bool hphpa_on = false; - u8 moisture_status = 0; - - pr_debug("%s: enter\n", __func__); - - WCD_MBHC_RSC_LOCK(mbhc); - - timeout = jiffies + - msecs_to_jiffies(WCD_FAKE_REMOVAL_MIN_PERIOD_MS); - do { - retry++; - /* - * read the result register every 10ms to look for - * any change in HS_COMP_RESULT bit - */ - usleep_range(10000, 10100); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_result); - pr_debug("%s: Check result reg for fake removal: hs_comp_res %x\n", - __func__, hs_comp_result); - if ((!hs_comp_result) && - retry > FAKE_REM_RETRY_ATTEMPTS) { - removed = false; - break; - } - } while (!time_after(jiffies, timeout)); - - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto exit; - } - pr_debug("%s: headset %s actually removed\n", __func__, - removed ? "" : "not "); - - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); - WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_result); - - if (removed) { - if (mbhc->mbhc_cfg->moisture_en) { - if (mbhc->mbhc_cb->hph_pa_on_status) - if ( - mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) { - hphpa_on = true; - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_HPHL_PA_EN, 0); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_HPH_PA_EN, 0); - } - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1); - /* wait for 50ms to get moisture status */ - usleep_range(50000, 50100); - - WCD_MBHC_REG_READ( - WCD_MBHC_MOISTURE_STATUS, moisture_status); - } - - if (mbhc->mbhc_cfg->moisture_en && !moisture_status) { - pr_debug("%s: moisture present in jack\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_MECH_DETECTION_TYPE, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_HEADSET); - else if (mbhc->current_plug == - MBHC_PLUG_TYPE_HEADPHONE) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_HEADPHONE); - else if (mbhc->current_plug == - MBHC_PLUG_TYPE_GND_MIC_SWAP) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_UNSUPPORTED); - else if (mbhc->current_plug == - MBHC_PLUG_TYPE_HIGH_HPH) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_LINEOUT); - } else { - if (!(hphl_sch && mic_sch && hs_comp_result)) { - /* - * extension cable is still plugged in - * report it as LINEOUT device - */ - goto report_unplug; - } else { - if (!mic_sch) { - mic_trigerred++; - pr_debug( - "%s: Removal MIC trigerred %d\n", - __func__, mic_trigerred); - } - if (!hphl_sch) { - hphl_trigerred++; - pr_debug( - "%s: Removal HPHL trigerred %d\n", - __func__, hphl_trigerred); - } - if (mic_trigerred && hphl_trigerred) { - /* - * extension cable is still plugged in - * report it as LINEOUT device - */ - goto report_unplug; - } - } - } - } -exit: - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; - -report_unplug: - wcd_mbhc_elec_hs_report_unplug(mbhc); - if (hphpa_on) { - hphpa_on = false; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_PA_EN, 1); - } - hphl_trigerred = 0; - mic_trigerred = 0; - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_hs_ins_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - bool detection_type = 0, hphl_sch = 0, mic_sch = 0; - u16 elect_result = 0; - static u16 hphl_trigerred; - static u16 mic_trigerred; - - pr_debug("%s: enter\n", __func__); - if (!mbhc->mbhc_cfg->detect_extn_cable) { - pr_debug("%s: Returning as Extension cable feature not enabled\n", - __func__); - return IRQ_HANDLED; - } - WCD_MBHC_RSC_LOCK(mbhc); - - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_DETECTION_TYPE, detection_type); - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_RESULT, elect_result); - - pr_debug("%s: detection_type %d, elect_result %x\n", __func__, - detection_type, elect_result); - if (detection_type) { - /* check if both Left and MIC Schmitt triggers are triggered */ - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); - WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); - if (hphl_sch && mic_sch) { - /* Go for plug type determination */ - pr_debug("%s: Go for plug type determination\n", - __func__); - goto determine_plug; - - } else { - if (mic_sch) { - mic_trigerred++; - pr_debug("%s: Insertion MIC trigerred %d\n", - __func__, mic_trigerred); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_ELECT_SCHMT_ISRC, - 0); - msleep(20); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_ELECT_SCHMT_ISRC, - 1); - } - if (hphl_sch) { - hphl_trigerred++; - pr_debug("%s: Insertion HPHL trigerred %d\n", - __func__, hphl_trigerred); - } - if (mic_trigerred && hphl_trigerred) { - /* Go for plug type determination */ - pr_debug("%s: Go for plug type determination\n", - __func__); - goto determine_plug; - } - } - } - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; - -determine_plug: - /* - * Disable HPHL trigger and MIC Schmitt triggers. - * Setup for insertion detection. - */ - pr_debug("%s: Disable insertion interrupt\n", __func__); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - false); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); - hphl_trigerred = 0; - mic_trigerred = 0; - mbhc->is_extn_cable = true; - mbhc->btn_press_intr = false; - wcd_mbhc_detect_plug_type(mbhc); - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static struct wcd_mbhc_fn mbhc_fn = { - .wcd_mbhc_hs_ins_irq = wcd_mbhc_hs_ins_irq, - .wcd_mbhc_hs_rem_irq = wcd_mbhc_hs_rem_irq, - .wcd_mbhc_detect_plug_type = wcd_mbhc_detect_plug_type, - .wcd_mbhc_detect_anc_plug_type = wcd_mbhc_detect_anc_plug_type, - .wcd_cancel_hs_detect_plug = wcd_cancel_hs_detect_plug, -}; - -/* Function: wcd_mbhc_legacy_init - * @mbhc: MBHC function pointer - * Description: Initialize MBHC legacy based function pointers to MBHC structure - */ -void wcd_mbhc_legacy_init(struct wcd_mbhc *mbhc) -{ - if (!mbhc) { - pr_err("%s: mbhc is NULL\n", __func__); - return; - } - mbhc->mbhc_fn = &mbhc_fn; - INIT_WORK(&mbhc->correct_plug_swch, wcd_correct_swch_plug); -} -EXPORT_SYMBOL(wcd_mbhc_legacy_init); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.h b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.h deleted file mode 100644 index 314bb1332cbc..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-legacy.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD_MBHC_LEGACY_H__ -#define __WCD_MBHC_LEGACY_H__ - -#include -#include - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_MBHC_LEGACY) -void wcd_mbhc_legacy_init(struct wcd_mbhc *mbhc); -#else -static inline void wcd_mbhc_legacy_init(struct wcd_mbhc *mbhc) -{ -} -#endif - -#endif /* __WCD_MBHC_LEGACY_H__ */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c deleted file mode 100644 index 0f3d74bd03ac..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c +++ /dev/null @@ -1,2031 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-mbhc-legacy.h" -#include "wcd-mbhc-adc.h" -#include - -void wcd_mbhc_jack_report(struct wcd_mbhc *mbhc, - struct snd_soc_jack *jack, int status, int mask) -{ - snd_soc_jack_report(jack, status, mask); -} -EXPORT_SYMBOL(wcd_mbhc_jack_report); - -static void __hphocp_off_report(struct wcd_mbhc *mbhc, u32 jack_status, - int irq) -{ - struct snd_soc_codec *codec = mbhc->codec; - - dev_dbg(codec->dev, "%s: clear ocp status %x\n", - __func__, jack_status); - - if (mbhc->hph_status & jack_status) { - mbhc->hph_status &= ~jack_status; - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, WCD_MBHC_JACK_MASK); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 1); - /* - * reset retry counter as PA is turned off signifying - * start of new OCP detection session - */ - if (mbhc->intr_ids->hph_left_ocp) - mbhc->hphlocp_cnt = 0; - else - mbhc->hphrocp_cnt = 0; - mbhc->mbhc_cb->irq_control(codec, irq, true); - } -} - -static void hphrocp_off_report(struct wcd_mbhc *mbhc, u32 jack_status) -{ - __hphocp_off_report(mbhc, SND_JACK_OC_HPHR, - mbhc->intr_ids->hph_right_ocp); -} - -static void hphlocp_off_report(struct wcd_mbhc *mbhc, u32 jack_status) -{ - __hphocp_off_report(mbhc, SND_JACK_OC_HPHL, - mbhc->intr_ids->hph_left_ocp); -} - -static void wcd_program_hs_vref(struct wcd_mbhc *mbhc) -{ - struct wcd_mbhc_plug_type_cfg *plug_type_cfg; - struct snd_soc_codec *codec = mbhc->codec; - u32 reg_val; - - plug_type_cfg = WCD_MBHC_CAL_PLUG_TYPE_PTR(mbhc->mbhc_cfg->calibration); - reg_val = ((plug_type_cfg->v_hs_max - HS_VREF_MIN_VAL) / 100); - - dev_dbg(codec->dev, "%s: reg_val = %x\n", __func__, reg_val); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_VREF, reg_val); -} - -static void wcd_program_btn_threshold(const struct wcd_mbhc *mbhc, bool micbias) -{ - struct wcd_mbhc_btn_detect_cfg *btn_det; - struct snd_soc_codec *codec = mbhc->codec; - struct snd_soc_card *card = codec->component.card; - s16 *btn_low, *btn_high; - - if (mbhc->mbhc_cfg->calibration == NULL) { - dev_err(card->dev, "%s: calibration data is NULL\n", __func__); - return; - } - - btn_det = WCD_MBHC_CAL_BTN_DET_PTR(mbhc->mbhc_cfg->calibration); - btn_low = btn_det->_v_btn_low; - btn_high = ((void *)&btn_det->_v_btn_low) + - (sizeof(btn_det->_v_btn_low[0]) * btn_det->num_btn); - - mbhc->mbhc_cb->set_btn_thr(codec, btn_low, btn_high, btn_det->num_btn, - micbias); -} - -void wcd_enable_curr_micbias(const struct wcd_mbhc *mbhc, - const enum wcd_mbhc_cs_mb_en_flag cs_mb_en) -{ - - /* - * Some codecs handle micbias/pullup enablement in codec - * drivers itself and micbias is not needed for regular - * plug type detection. So if micbias_control callback function - * is defined, just return. - */ - if (mbhc->mbhc_cb->mbhc_micbias_control) - return; - - pr_debug("%s: enter, cs_mb_en: %d\n", __func__, cs_mb_en); - - switch (cs_mb_en) { - case WCD_MBHC_EN_CS: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - /* Program Button threshold registers as per CS */ - wcd_program_btn_threshold(mbhc, false); - break; - case WCD_MBHC_EN_MB: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - - /* Disable PULL_UP_EN & enable MICBIAS */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 2); - /* Program Button threshold registers as per MICBIAS */ - wcd_program_btn_threshold(mbhc, true); - break; - case WCD_MBHC_EN_PULLUP: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 1); - /* Program Button threshold registers as per MICBIAS */ - wcd_program_btn_threshold(mbhc, true); - break; - case WCD_MBHC_EN_NONE: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - break; - default: - pr_debug("%s: Invalid parameter", __func__); - break; - } - - pr_debug("%s: exit\n", __func__); -} -EXPORT_SYMBOL(wcd_enable_curr_micbias); - -static const char *wcd_mbhc_get_event_string(int event) -{ - switch (event) { - case WCD_EVENT_PRE_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_MICBIAS_2_OFF); - case WCD_EVENT_POST_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_MICBIAS_2_OFF); - case WCD_EVENT_PRE_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_MICBIAS_2_ON); - case WCD_EVENT_POST_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_MICBIAS_2_ON); - case WCD_EVENT_PRE_HPHL_PA_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHL_PA_ON); - case WCD_EVENT_POST_HPHL_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_HPHL_PA_OFF); - case WCD_EVENT_PRE_HPHR_PA_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHR_PA_ON); - case WCD_EVENT_POST_HPHR_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_HPHR_PA_OFF); - case WCD_EVENT_PRE_HPHR_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHR_PA_OFF); - case WCD_EVENT_PRE_HPHL_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHL_PA_OFF); - case WCD_EVENT_POST_DAPM_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_DAPM_MICBIAS_2_ON); - case WCD_EVENT_PRE_DAPM_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_DAPM_MICBIAS_2_ON); - case WCD_EVENT_POST_DAPM_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_DAPM_MICBIAS_2_OFF); - case WCD_EVENT_PRE_DAPM_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_DAPM_MICBIAS_2_OFF); - case WCD_EVENT_OCP_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_OCP_OFF); - case WCD_EVENT_OCP_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_OCP_ON); - case WCD_EVENT_INVALID: - default: - return WCD_MBHC_STRINGIFY(WCD_EVENT_INVALID); - } -} - -static int wcd_event_notify(struct notifier_block *self, unsigned long val, - void *data) -{ - struct wcd_mbhc *mbhc = (struct wcd_mbhc *)data; - enum wcd_notify_event event = (enum wcd_notify_event)val; - struct snd_soc_codec *codec = mbhc->codec; - bool micbias2 = false; - bool micbias1 = false; - u8 fsm_en = 0; - - pr_debug("%s: event %s (%d)\n", __func__, - wcd_mbhc_get_event_string(event), event); - if (mbhc->mbhc_cb->micbias_enable_status) { - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - } - switch (event) { - /* MICBIAS usage change */ - case WCD_EVENT_POST_DAPM_MICBIAS_2_ON: - mbhc->is_hs_recording = true; - pr_debug("%s: is_capture: %d\n", __func__, - mbhc->is_hs_recording); - break; - case WCD_EVENT_POST_MICBIAS_2_ON: - if (!mbhc->micbias_enable) - goto out_micb_en; - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) { - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - true); - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_SET_VAL, - true); - /* - * Special headset needs MICBIAS as 2.7V so wait for - * 50 msec for the MICBIAS to reach 2.7 volts. - */ - msleep(50); - } - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, true); - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - false); -out_micb_en: - /* Disable current source if micbias enabled */ - if (mbhc->mbhc_cb->mbhc_micbias_control) { - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - if (fsm_en) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, - 0); - } else { - mbhc->is_hs_recording = true; - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - } - /* configure cap settings properly when micbias is enabled */ - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, true); - break; - case WCD_EVENT_PRE_MICBIAS_2_OFF: - /* - * Before MICBIAS_2 is turned off, if FSM is enabled, - * make sure current source is enabled so as to detect - * button press/release events - */ - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->micbias_enable) { - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - if (fsm_en) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, - 3); - } - break; - /* MICBIAS usage change */ - case WCD_EVENT_POST_DAPM_MICBIAS_2_OFF: - mbhc->is_hs_recording = false; - pr_debug("%s: is_capture: %d\n", __func__, - mbhc->is_hs_recording); - break; - case WCD_EVENT_POST_MICBIAS_2_OFF: - if (!mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->is_hs_recording = false; - if (mbhc->micbias_enable) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - break; - } - - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, false); - if (mbhc->mbhc_cb->set_micbias_value && !mbhc->micbias_enable) - mbhc->mbhc_cb->set_micbias_value(codec); - /* Enable PULL UP if PA's are enabled */ - if ((test_bit(WCD_MBHC_EVENT_PA_HPHL, &mbhc->event_state)) || - (test_bit(WCD_MBHC_EVENT_PA_HPHR, - &mbhc->event_state))) - /* enable pullup and cs, disable mb */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); - else - /* enable current source and disable mb, pullup*/ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - - /* configure cap settings properly when micbias is disabled */ - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); - break; - case WCD_EVENT_PRE_HPHL_PA_OFF: - mutex_lock(&mbhc->hphl_pa_lock); - break; - case WCD_EVENT_POST_HPHL_PA_OFF: - clear_bit(WCD_MBHC_HPHL_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - if (mbhc->hph_status & SND_JACK_OC_HPHL) - hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); - clear_bit(WCD_MBHC_EVENT_PA_HPHL, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - mutex_unlock(&mbhc->hphl_pa_lock); - clear_bit(WCD_MBHC_ANC0_OFF_ACK, &mbhc->hph_anc_state); - break; - case WCD_EVENT_PRE_HPHR_PA_OFF: - mutex_lock(&mbhc->hphr_pa_lock); - break; - case WCD_EVENT_POST_HPHR_PA_OFF: - clear_bit(WCD_MBHC_HPHR_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - if (mbhc->hph_status & SND_JACK_OC_HPHR) - hphrocp_off_report(mbhc, SND_JACK_OC_HPHR); - clear_bit(WCD_MBHC_EVENT_PA_HPHR, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - mutex_unlock(&mbhc->hphr_pa_lock); - clear_bit(WCD_MBHC_ANC1_OFF_ACK, &mbhc->hph_anc_state); - break; - case WCD_EVENT_PRE_HPHL_PA_ON: - set_bit(WCD_MBHC_EVENT_PA_HPHL, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, enable pullup & cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); - break; - case WCD_EVENT_PRE_HPHR_PA_ON: - set_bit(WCD_MBHC_EVENT_PA_HPHR, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, enable pullup & cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); - break; - case WCD_EVENT_OCP_OFF: - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - false); - break; - case WCD_EVENT_OCP_ON: - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - true); - break; - default: - break; - } - return 0; -} - -int wcd_cancel_btn_work(struct wcd_mbhc *mbhc) -{ - int r; - - r = cancel_delayed_work_sync(&mbhc->mbhc_btn_dwork); - /* - * if scheduled mbhc.mbhc_btn_dwork is canceled from here, - * we have to unlock from here instead btn_work - */ - if (r) - mbhc->mbhc_cb->lock_sleep(mbhc, false); - return r; -} -EXPORT_SYMBOL(wcd_cancel_btn_work); - -bool wcd_swch_level_remove(struct wcd_mbhc *mbhc) -{ - u16 result2 = 0; - - WCD_MBHC_REG_READ(WCD_MBHC_SWCH_LEVEL_REMOVE, result2); - return (result2) ? true : false; -} -EXPORT_SYMBOL(wcd_swch_level_remove); - -static void wcd_mbhc_clr_and_turnon_hph_padac(struct wcd_mbhc *mbhc) -{ - bool pa_turned_on = false; - u8 wg_time = 0; - - WCD_MBHC_REG_READ(WCD_MBHC_HPH_CNP_WG_TIME, wg_time); - wg_time += 1; - - mutex_lock(&mbhc->hphr_pa_lock); - if (test_and_clear_bit(WCD_MBHC_HPHR_PA_OFF_ACK, - &mbhc->hph_pa_dac_state)) { - pr_debug("%s: HPHR clear flag and enable PA\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_PA_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_OCP_DET_EN, 1); - pa_turned_on = true; - } - mutex_unlock(&mbhc->hphr_pa_lock); - mutex_lock(&mbhc->hphl_pa_lock); - if (test_and_clear_bit(WCD_MBHC_HPHL_PA_OFF_ACK, - &mbhc->hph_pa_dac_state)) { - pr_debug("%s: HPHL clear flag and enable PA\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_OCP_DET_EN, 1); - pa_turned_on = true; - } - mutex_unlock(&mbhc->hphl_pa_lock); - - if (pa_turned_on) { - pr_debug("%s: PA was turned on by MBHC and not by DAPM\n", - __func__); - usleep_range(wg_time * 1000, wg_time * 1000 + 50); - } - - if (test_and_clear_bit(WCD_MBHC_ANC0_OFF_ACK, - &mbhc->hph_anc_state)) { - usleep_range(20000, 20100); - pr_debug("%s: HPHL ANC clear flag and enable ANC_EN\n", - __func__); - if (mbhc->mbhc_cb->update_anc_state) - mbhc->mbhc_cb->update_anc_state(mbhc->codec, true, 0); - } - - if (test_and_clear_bit(WCD_MBHC_ANC1_OFF_ACK, - &mbhc->hph_anc_state)) { - usleep_range(20000, 20100); - pr_debug("%s: HPHR ANC clear flag and enable ANC_EN\n", - __func__); - if (mbhc->mbhc_cb->update_anc_state) - mbhc->mbhc_cb->update_anc_state(mbhc->codec, true, 1); - } - -} - -static bool wcd_mbhc_is_hph_pa_on(struct wcd_mbhc *mbhc) -{ - bool hph_pa_on = false; - - WCD_MBHC_REG_READ(WCD_MBHC_HPH_PA_EN, hph_pa_on); - - return (hph_pa_on) ? true : false; -} - -static void wcd_mbhc_set_and_turnoff_hph_padac(struct wcd_mbhc *mbhc) -{ - u8 wg_time = 0; - - WCD_MBHC_REG_READ(WCD_MBHC_HPH_CNP_WG_TIME, wg_time); - wg_time += 1; - - /* If headphone PA is on, check if userspace receives - * removal event to sync-up PA's state - */ - if (wcd_mbhc_is_hph_pa_on(mbhc)) { - pr_debug("%s PA is on, setting PA_OFF_ACK\n", __func__); - set_bit(WCD_MBHC_HPHL_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - set_bit(WCD_MBHC_HPHR_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_OCP_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_OCP_DET_EN, 0); - } else { - pr_debug("%s PA is off\n", __func__); - } - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 0); - usleep_range(wg_time * 1000, wg_time * 1000 + 50); - - - if (mbhc->mbhc_cb->is_anc_on && mbhc->mbhc_cb->is_anc_on(mbhc)) { - usleep_range(20000, 20100); - pr_debug("%s ANC is on, setting ANC_OFF_ACK\n", __func__); - set_bit(WCD_MBHC_ANC0_OFF_ACK, &mbhc->hph_anc_state); - set_bit(WCD_MBHC_ANC1_OFF_ACK, &mbhc->hph_anc_state); - if (mbhc->mbhc_cb->update_anc_state) { - mbhc->mbhc_cb->update_anc_state(mbhc->codec, false, 0); - mbhc->mbhc_cb->update_anc_state(mbhc->codec, false, 1); - } else { - pr_debug("%s ANC is off\n", __func__); - } - } -} - -int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - *zl = mbhc->zl; - *zr = mbhc->zr; - - if (*zl && *zr) - return 0; - else - return -EINVAL; -} -EXPORT_SYMBOL(wcd_mbhc_get_impedance); - -void wcd_mbhc_hs_elec_irq(struct wcd_mbhc *mbhc, int irq_type, - bool enable) -{ - int irq; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (irq_type == WCD_MBHC_ELEC_HS_INS) - irq = mbhc->intr_ids->mbhc_hs_ins_intr; - else if (irq_type == WCD_MBHC_ELEC_HS_REM) - irq = mbhc->intr_ids->mbhc_hs_rem_intr; - else { - pr_debug("%s: irq_type: %d, enable: %d\n", - __func__, irq_type, enable); - return; - } - - pr_debug("%s: irq: %d, enable: %d, intr_status:%lu\n", - __func__, irq, enable, mbhc->intr_status); - if ((test_bit(irq_type, &mbhc->intr_status)) != enable) { - mbhc->mbhc_cb->irq_control(mbhc->codec, irq, enable); - if (enable) - set_bit(irq_type, &mbhc->intr_status); - else - clear_bit(irq_type, &mbhc->intr_status); - } -} -EXPORT_SYMBOL(wcd_mbhc_hs_elec_irq); - -void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, - enum snd_jack_types jack_type) -{ - struct snd_soc_codec *codec = mbhc->codec; - bool is_pa_on = false; - u8 fsm_en = 0; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - pr_debug("%s: enter insertion %d hph_status %x\n", - __func__, insertion, mbhc->hph_status); - if (!insertion) { - /* Report removal */ - mbhc->hph_status &= ~jack_type; - /* - * cancel possibly scheduled btn work and - * report release if we reported button press - */ - if (wcd_cancel_btn_work(mbhc)) { - pr_debug("%s: button press is canceled\n", __func__); - } else if (mbhc->buttons_pressed) { - pr_debug("%s: release of button press%d\n", - __func__, jack_type); - wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, 0, - mbhc->buttons_pressed); - mbhc->buttons_pressed &= - ~WCD_MBHC_JACK_BUTTON_MASK; - } - - if (mbhc->micbias_enable) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(codec); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - - mbhc->hph_type = WCD_MBHC_HPH_NONE; - mbhc->zl = mbhc->zr = 0; - pr_debug("%s: Reporting removal %d(%x)\n", __func__, - jack_type, mbhc->hph_status); - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, WCD_MBHC_JACK_MASK); - wcd_mbhc_set_and_turnoff_hph_padac(mbhc); - hphrocp_off_report(mbhc, SND_JACK_OC_HPHR); - hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); - mbhc->current_plug = MBHC_PLUG_TYPE_NONE; - mbhc->force_linein = false; - } else { - /* - * Report removal of current jack type. - * Headphone to headset shouldn't report headphone - * removal. - */ - if (mbhc->mbhc_cfg->detect_extn_cable && - (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH || - jack_type == SND_JACK_LINEOUT) && - (mbhc->hph_status && mbhc->hph_status != jack_type)) { - - if (mbhc->micbias_enable && - mbhc->hph_status == SND_JACK_HEADSET) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value( - codec); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - mbhc->hph_type = WCD_MBHC_HPH_NONE; - mbhc->zl = mbhc->zr = 0; - if (!mbhc->force_linein) { - pr_debug("%s: Reporting removal (%x)\n", - __func__, mbhc->hph_status); - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - 0, WCD_MBHC_JACK_MASK); - } - if (mbhc->hph_status == SND_JACK_LINEOUT) { - - pr_debug("%s: Enable micbias\n", __func__); - /* Disable current source and enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - pr_debug("%s: set up elec removal detection\n", - __func__); - usleep_range(200, 210); - wcd_mbhc_hs_elec_irq(mbhc, - WCD_MBHC_ELEC_HS_REM, - true); - } - mbhc->hph_status &= ~(SND_JACK_HEADSET | - SND_JACK_LINEOUT | - SND_JACK_ANC_HEADPHONE | - SND_JACK_UNSUPPORTED); - } - - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET && - jack_type == SND_JACK_HEADPHONE) - mbhc->hph_status &= ~SND_JACK_HEADSET; - - /* Report insertion */ - if (jack_type == SND_JACK_HEADPHONE) - mbhc->current_plug = MBHC_PLUG_TYPE_HEADPHONE; - else if (jack_type == SND_JACK_UNSUPPORTED) - mbhc->current_plug = MBHC_PLUG_TYPE_GND_MIC_SWAP; - else if (jack_type == SND_JACK_HEADSET) { - mbhc->current_plug = MBHC_PLUG_TYPE_HEADSET; - mbhc->jiffies_atreport = jiffies; - } else if (jack_type == SND_JACK_LINEOUT) { - mbhc->current_plug = MBHC_PLUG_TYPE_HIGH_HPH; - } else if (jack_type == SND_JACK_ANC_HEADPHONE) - mbhc->current_plug = MBHC_PLUG_TYPE_ANC_HEADPHONE; - - if (mbhc->mbhc_cb->hph_pa_on_status) - is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(codec); - - if (mbhc->impedance_detect && - mbhc->mbhc_cb->compute_impedance && - (mbhc->mbhc_cfg->linein_th != 0) && - (!is_pa_on)) { - /* Set MUX_CTL to AUTO for Z-det */ - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, - MUX_CTL_AUTO); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - mbhc->mbhc_cb->compute_impedance(mbhc, - &mbhc->zl, &mbhc->zr); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, - fsm_en); - if ((mbhc->zl > mbhc->mbhc_cfg->linein_th) && - (mbhc->zr > mbhc->mbhc_cfg->linein_th) && - (jack_type == SND_JACK_HEADPHONE)) { - jack_type = SND_JACK_LINEOUT; - mbhc->force_linein = true; - mbhc->current_plug = MBHC_PLUG_TYPE_HIGH_HPH; - if (mbhc->hph_status) { - mbhc->hph_status &= ~(SND_JACK_HEADSET | - SND_JACK_LINEOUT | - SND_JACK_UNSUPPORTED); - wcd_mbhc_jack_report(mbhc, - &mbhc->headset_jack, - mbhc->hph_status, - WCD_MBHC_JACK_MASK); - } - pr_debug("%s: Marking jack type as SND_JACK_LINEOUT\n", - __func__); - } - } - - /* Do not calculate impedance again for lineout - * as during playback pa is on and impedance values - * will not be correct resulting in lineout detected - * as headphone. - */ - if ((is_pa_on) && mbhc->force_linein == true) { - jack_type = SND_JACK_LINEOUT; - mbhc->current_plug = MBHC_PLUG_TYPE_HIGH_HPH; - if (mbhc->hph_status) { - mbhc->hph_status &= ~(SND_JACK_HEADSET | - SND_JACK_LINEOUT | - SND_JACK_UNSUPPORTED); - wcd_mbhc_jack_report(mbhc, - &mbhc->headset_jack, - mbhc->hph_status, - WCD_MBHC_JACK_MASK); - } - } - - mbhc->hph_status |= jack_type; - - if (jack_type == SND_JACK_HEADPHONE && - mbhc->mbhc_cb->mbhc_micb_ramp_control) - mbhc->mbhc_cb->mbhc_micb_ramp_control(codec, false); - - pr_debug("%s: Reporting insertion %d(%x)\n", __func__, - jack_type, mbhc->hph_status); - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - (mbhc->hph_status | SND_JACK_MECHANICAL), - WCD_MBHC_JACK_MASK); - wcd_mbhc_clr_and_turnon_hph_padac(mbhc); - } - pr_debug("%s: leave hph_status %x\n", __func__, mbhc->hph_status); -} -EXPORT_SYMBOL(wcd_mbhc_report_plug); - -void wcd_mbhc_elec_hs_report_unplug(struct wcd_mbhc *mbhc) -{ - /* cancel pending button press */ - if (wcd_cancel_btn_work(mbhc)) - pr_debug("%s: button press is canceled\n", __func__); - /* cancel correct work function */ - if (mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) - mbhc->mbhc_fn->wcd_cancel_hs_detect_plug(mbhc, - &mbhc->correct_plug_swch); - else - pr_info("%s: hs_detect_plug work not cancelled\n", __func__); - - pr_debug("%s: Report extension cable\n", __func__); - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - /* - * If PA is enabled HPHL schmitt trigger can - * be unreliable, make sure to disable it - */ - if (test_bit(WCD_MBHC_EVENT_PA_HPHL, - &mbhc->event_state)) - wcd_mbhc_set_and_turnoff_hph_padac(mbhc); - /* - * Disable HPHL trigger and MIC Schmitt triggers. - * Setup for insertion detection. - */ - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, - false); - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_NONE); - /* Disable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 3); - - /* Set the detection type appropriately */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 1); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - true); -} -EXPORT_SYMBOL(wcd_mbhc_elec_hs_report_unplug); - -void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - bool anc_mic_found = false; - enum snd_jack_types jack_type; - - if (mbhc->deinit_in_progress) { - pr_info("%s: mbhc deinit in progess: ignore report\n", __func__); - return; - } - - pr_debug("%s: enter current_plug(%d) new_plug(%d)\n", - __func__, mbhc->current_plug, plug_type); - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (mbhc->current_plug == plug_type) { - pr_debug("%s: cable already reported, exit\n", __func__); - goto exit; - } - - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - /* - * Nothing was reported previously - * report a headphone or unsupported - */ - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_HEADPHONE); - } else if (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP) { - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE); - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_UNSUPPORTED); - } else if (plug_type == MBHC_PLUG_TYPE_HEADSET) { - if (mbhc->mbhc_cfg->enable_anc_mic_detect && - mbhc->mbhc_fn->wcd_mbhc_detect_anc_plug_type) - anc_mic_found = - mbhc->mbhc_fn->wcd_mbhc_detect_anc_plug_type(mbhc); - jack_type = SND_JACK_HEADSET; - if (anc_mic_found) - jack_type = SND_JACK_ANC_HEADPHONE; - - /* - * If Headphone was reported previously, this will - * only report the mic line - */ - wcd_mbhc_report_plug(mbhc, 1, jack_type); - } else if (plug_type == MBHC_PLUG_TYPE_HIGH_HPH) { - if (mbhc->mbhc_cfg->detect_extn_cable) { - /* High impedance device found. Report as LINEOUT */ - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - pr_debug("%s: setup mic trigger for further detection\n", - __func__); - - /* Disable HW FSM and current source */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - /* Setup for insertion detection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, - 1); - /* - * Enable HPHL trigger and MIC Schmitt triggers - * and request for elec insertion interrupts - */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, - 3); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - true); - } else { - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - } - } else { - WARN(1, "Unexpected current plug_type %d, plug_type %d\n", - mbhc->current_plug, plug_type); - } -exit: - pr_debug("%s: leave\n", __func__); -} -EXPORT_SYMBOL(wcd_mbhc_find_plug_and_report); - -static bool wcd_mbhc_moisture_detect(struct wcd_mbhc *mbhc, bool detection_type) -{ - bool ret = false; - - if (!mbhc->mbhc_cfg->moisture_en && - !mbhc->mbhc_cfg->moisture_duty_cycle_en) - return ret; - - if (!mbhc->mbhc_cb->mbhc_get_moisture_status || - !mbhc->mbhc_cb->mbhc_moisture_polling_ctrl || - !mbhc->mbhc_cb->mbhc_moisture_detect_en) - return ret; - - if (mbhc->mbhc_cb->mbhc_get_moisture_status(mbhc)) { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_GND_DET_EN, 0); - mbhc->mbhc_cb->mbhc_moisture_polling_ctrl(mbhc, true); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, - detection_type); - ret = true; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - if (mbhc->mbhc_cfg->gnd_det_en) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_GND_DET_EN, 1); - } else { - mbhc->mbhc_cb->mbhc_moisture_polling_ctrl(mbhc, false); - mbhc->mbhc_cb->mbhc_moisture_detect_en(mbhc, false); - } - - return ret; -} - -static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) -{ - bool detection_type = 0; - bool micbias1 = false; - struct snd_soc_codec *codec = mbhc->codec; - enum snd_jack_types jack_type; - - dev_dbg(codec->dev, "%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - mbhc->in_swch_irq_handler = true; - - /* cancel pending button press */ - if (wcd_cancel_btn_work(mbhc)) - pr_debug("%s: button press is canceled\n", __func__); - - WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type); - - /* Set the detection type appropriately */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, - !detection_type); - - pr_debug("%s: mbhc->current_plug: %d detection_type: %d\n", __func__, - mbhc->current_plug, detection_type); - if (mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) - mbhc->mbhc_fn->wcd_cancel_hs_detect_plug(mbhc, - &mbhc->correct_plug_swch); - else - pr_info("%s: hs_detect_plug work not cancelled\n", __func__); - - /* Enable micbias ramp */ - if (mbhc->mbhc_cb->mbhc_micb_ramp_control) - mbhc->mbhc_cb->mbhc_micb_ramp_control(codec, true); - - if (mbhc->mbhc_cb->micbias_enable_status) - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - - if ((mbhc->current_plug == MBHC_PLUG_TYPE_NONE) && - detection_type) { - - /* If moisture is present, then enable polling, disable - * moisture detection and wait for interrupt - */ - if (wcd_mbhc_moisture_detect(mbhc, detection_type)) - goto done; - - /* Make sure MASTER_BIAS_CTL is enabled */ - mbhc->mbhc_cb->mbhc_bias(codec, true); - - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_TAIL_CURR, true); - - if (!mbhc->mbhc_cfg->hs_ext_micbias && - mbhc->mbhc_cb->micb_internal) - /* - * Enable Tx2 RBias if the headset - * is using internal micbias - */ - mbhc->mbhc_cb->micb_internal(codec, 1, true); - - /* Remove micbias pulldown */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_PULLDOWN_CTRL, 0); - /* Apply trim if needed on the device */ - if (mbhc->mbhc_cb->trim_btn_reg) - mbhc->mbhc_cb->trim_btn_reg(codec); - /* Enable external voltage source to micbias if present */ - if (mbhc->mbhc_cb->enable_mb_source) - mbhc->mbhc_cb->enable_mb_source(mbhc, true); - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - if (mbhc->mbhc_fn) - mbhc->mbhc_fn->wcd_mbhc_detect_plug_type(mbhc); - } else if ((mbhc->current_plug != MBHC_PLUG_TYPE_NONE) - && !detection_type) { - /* Disable external voltage source to micbias if present */ - if (mbhc->mbhc_cb->enable_mb_source) - mbhc->mbhc_cb->enable_mb_source(mbhc, false); - /* Disable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_TAIL_CURR, false); - - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); - - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - switch (mbhc->current_plug) { - case MBHC_PLUG_TYPE_HEADPHONE: - jack_type = SND_JACK_HEADPHONE; - break; - case MBHC_PLUG_TYPE_GND_MIC_SWAP: - jack_type = SND_JACK_UNSUPPORTED; - break; - case MBHC_PLUG_TYPE_HEADSET: - /* make sure to turn off Rbias */ - if (mbhc->mbhc_cb->micb_internal) - mbhc->mbhc_cb->micb_internal(codec, 1, false); - /* Pulldown micbias */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_PULLDOWN_CTRL, 1); - jack_type = SND_JACK_HEADSET; - break; - case MBHC_PLUG_TYPE_HIGH_HPH: - if (mbhc->mbhc_detection_logic == WCD_DETECTION_ADC) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_ISRC_EN, 0); - mbhc->is_extn_cable = false; - jack_type = SND_JACK_LINEOUT; - break; - case MBHC_PLUG_TYPE_ANC_HEADPHONE: - jack_type = SND_JACK_ANC_HEADPHONE; - break; - default: - pr_info("%s: Invalid current plug: %d\n", - __func__, mbhc->current_plug); - jack_type = SND_JACK_UNSUPPORTED; - break; - } - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); - mbhc->extn_cable_hph_rem = false; - wcd_mbhc_report_plug(mbhc, 0, jack_type); - - if (mbhc->mbhc_cfg->enable_usbc_analog) { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - if (mbhc->mbhc_cb->clk_setup) - mbhc->mbhc_cb->clk_setup(mbhc->codec, false); - } - - if (mbhc->mbhc_cfg->moisture_en || - mbhc->mbhc_cfg->moisture_duty_cycle_en) { - if (mbhc->mbhc_cb->mbhc_moisture_polling_ctrl) - mbhc->mbhc_cb->mbhc_moisture_polling_ctrl(mbhc, - false); - if (mbhc->mbhc_cb->mbhc_moisture_detect_en) - mbhc->mbhc_cb->mbhc_moisture_detect_en(mbhc, - false); - } - - } else if (!detection_type) { - /* Disable external voltage source to micbias if present */ - if (mbhc->mbhc_cb->enable_mb_source) - mbhc->mbhc_cb->enable_mb_source(mbhc, false); - /* Disable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->extn_cable_hph_rem = false; - } - -done: - mbhc->in_swch_irq_handler = false; - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); -} - -static irqreturn_t wcd_mbhc_mech_plug_detect_irq(int irq, void *data) -{ - int r = IRQ_HANDLED; - struct wcd_mbhc *mbhc = data; - - pr_debug("%s: enter\n", __func__); - if (mbhc == NULL) { - pr_err("%s: NULL irq data\n", __func__); - return IRQ_NONE; - } - if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) { - pr_warn("%s: failed to hold suspend\n", __func__); - r = IRQ_NONE; - } else { - /* Call handler */ - wcd_mbhc_swch_irq_handler(mbhc); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } - pr_debug("%s: leave %d\n", __func__, r); - return r; -} - -int wcd_mbhc_get_button_mask(struct wcd_mbhc *mbhc) -{ - int mask = 0; - int btn; - - btn = mbhc->mbhc_cb->map_btn_code_to_num(mbhc->codec); - - switch (btn) { - case 0: - mask = SND_JACK_BTN_0; - break; - case 1: - mask = SND_JACK_BTN_1; - break; - case 2: - mask = SND_JACK_BTN_2; - break; - case 3: - mask = SND_JACK_BTN_3; - break; - case 4: - mask = SND_JACK_BTN_4; - break; - case 5: - mask = SND_JACK_BTN_5; - break; - default: - break; - } - - return mask; -} -EXPORT_SYMBOL(wcd_mbhc_get_button_mask); - -static void wcd_btn_lpress_fn(struct work_struct *work) -{ - struct delayed_work *dwork; - struct wcd_mbhc *mbhc; - s16 btn_result = 0; - - pr_debug("%s: Enter\n", __func__); - - dwork = to_delayed_work(work); - mbhc = container_of(dwork, struct wcd_mbhc, mbhc_btn_dwork); - - WCD_MBHC_REG_READ(WCD_MBHC_BTN_RESULT, btn_result); - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) { - pr_debug("%s: Reporting long button press event, btn_result: %d\n", - __func__, btn_result); - wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, - mbhc->buttons_pressed, mbhc->buttons_pressed); - } - pr_debug("%s: leave\n", __func__); - mbhc->mbhc_cb->lock_sleep(mbhc, false); -} - -static bool wcd_mbhc_fw_validate(const void *data, size_t size) -{ - u32 cfg_offset; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - struct firmware_cal fw; - - fw.data = (void *)data; - fw.size = size; - - if (fw.size < WCD_MBHC_CAL_MIN_SIZE) - return false; - - /* - * Previous check guarantees that there is enough fw data up - * to num_btn - */ - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(fw.data); - cfg_offset = (u32) ((void *) btn_cfg - (void *) fw.data); - if (fw.size < (cfg_offset + WCD_MBHC_CAL_BTN_SZ(btn_cfg))) - return false; - - return true; -} - -static irqreturn_t wcd_mbhc_btn_press_handler(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - int mask; - unsigned long msec_val; - - pr_debug("%s: enter\n", __func__); - complete(&mbhc->btn_press_compl); - WCD_MBHC_RSC_LOCK(mbhc); - wcd_cancel_btn_work(mbhc); - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto done; - } - - mbhc->is_btn_press = true; - msec_val = jiffies_to_msecs(jiffies - mbhc->jiffies_atreport); - pr_debug("%s: msec_val = %ld\n", __func__, msec_val); - if (msec_val < MBHC_BUTTON_PRESS_THRESHOLD_MIN) { - pr_debug("%s: Too short, ignore button press\n", __func__); - goto done; - } - - /* If switch interrupt already kicked in, ignore button press */ - if (mbhc->in_swch_irq_handler) { - pr_debug("%s: Swtich level changed, ignore button press\n", - __func__); - goto done; - } - mask = wcd_mbhc_get_button_mask(mbhc); - if (mask == SND_JACK_BTN_0) - mbhc->btn_press_intr = true; - - if (mbhc->current_plug != MBHC_PLUG_TYPE_HEADSET) { - pr_debug("%s: Plug isn't headset, ignore button press\n", - __func__); - goto done; - } - mbhc->buttons_pressed |= mask; - mbhc->mbhc_cb->lock_sleep(mbhc, true); - if (schedule_delayed_work(&mbhc->mbhc_btn_dwork, - msecs_to_jiffies(400)) == 0) { - WARN(1, "Button pressed twice without release event\n"); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } -done: - pr_debug("%s: leave\n", __func__); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - int ret; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto exit; - } - - if (mbhc->is_btn_press) { - mbhc->is_btn_press = false; - } else { - pr_debug("%s: This release is for fake btn press\n", __func__); - goto exit; - } - - /* - * If current plug is headphone then there is no chance to - * get btn release interrupt, so connected cable should be - * headset not headphone. - * For ADC MBHC, ADC_COMPLETE interrupt will be generated - * in this case. So skip the check here. - */ - if (mbhc->mbhc_detection_logic == WCD_DETECTION_LEGACY && - mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_mbhc_find_plug_and_report(mbhc, MBHC_PLUG_TYPE_HEADSET); - goto exit; - - } - if (mbhc->buttons_pressed & WCD_MBHC_JACK_BUTTON_MASK) { - ret = wcd_cancel_btn_work(mbhc); - if (ret == 0) { - pr_debug("%s: Reporting long button release event\n", - __func__); - wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, - 0, mbhc->buttons_pressed); - } else { - if (mbhc->in_swch_irq_handler) { - pr_debug("%s: Switch irq kicked in, ignore\n", - __func__); - } else { - pr_debug("%s: Reporting btn press\n", - __func__); - wcd_mbhc_jack_report(mbhc, - &mbhc->button_jack, - mbhc->buttons_pressed, - mbhc->buttons_pressed); - pr_debug("%s: Reporting btn release\n", - __func__); - wcd_mbhc_jack_report(mbhc, - &mbhc->button_jack, - 0, mbhc->buttons_pressed); - } - } - mbhc->buttons_pressed &= ~WCD_MBHC_JACK_BUTTON_MASK; - } -exit: - pr_debug("%s: leave\n", __func__); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_hphl_ocp_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - int val; - - pr_debug("%s: received HPHL OCP irq\n", __func__); - if (mbhc) { - if (mbhc->mbhc_cb->hph_register_recovery) { - if (mbhc->mbhc_cb->hph_register_recovery(mbhc)) { - WCD_MBHC_REG_READ(WCD_MBHC_HPHR_OCP_STATUS, - val); - if ((val != -EINVAL) && val) - mbhc->is_hph_ocp_pending = true; - goto done; - } - } - - if (mbhc->hphlocp_cnt < OCP_ATTEMPT) { - mbhc->hphlocp_cnt++; - pr_debug("%s: retry, hphlocp_cnt: %d\n", __func__, - mbhc->hphlocp_cnt); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 1); - } else { - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - false); - mbhc->hph_status |= SND_JACK_OC_HPHL; - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, - WCD_MBHC_JACK_MASK); - } - } else { - pr_err("%s: Bad wcd9xxx_spmi private data\n", __func__); - } -done: - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_hphr_ocp_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - - pr_debug("%s: received HPHR OCP irq\n", __func__); - - if (!mbhc) { - pr_err("%s: Bad mbhc private data\n", __func__); - goto done; - } - - if (mbhc->is_hph_ocp_pending) { - mbhc->is_hph_ocp_pending = false; - goto done; - } - - if (mbhc->mbhc_cb->hph_register_recovery) { - if (mbhc->mbhc_cb->hph_register_recovery(mbhc)) - /* register corruption, hence reset registers */ - goto done; - } - if (mbhc->hphrocp_cnt < OCP_ATTEMPT) { - mbhc->hphrocp_cnt++; - pr_debug("%s: retry, hphrocp_cnt: %d\n", __func__, - mbhc->hphrocp_cnt); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 1); - } else { - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_right_ocp, - false); - mbhc->hph_status |= SND_JACK_OC_HPHR; - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, WCD_MBHC_JACK_MASK); - } -done: - return IRQ_HANDLED; -} - -static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) -{ - int ret = 0; - struct snd_soc_codec *codec = mbhc->codec; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - - /* enable HS detection */ - if (mbhc->mbhc_cb->hph_pull_up_control_v2) - mbhc->mbhc_cb->hph_pull_up_control_v2(codec, - HS_PULLUP_I_DEFAULT); - else if (mbhc->mbhc_cb->hph_pull_up_control) - mbhc->mbhc_cb->hph_pull_up_control(codec, I_DEFAULT); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_L_DET_PULL_UP_CTRL, 3); - - /* Configure for moisture detection when duty cycle is not enabled. - * Otherwise disable moisture detection. - */ - if (mbhc->mbhc_cfg->moisture_en && mbhc->mbhc_cb->mbhc_moisture_config - && !mbhc->mbhc_cfg->moisture_duty_cycle_en) - mbhc->mbhc_cb->mbhc_moisture_config(mbhc); - else if (mbhc->mbhc_cfg->moisture_duty_cycle_en && - mbhc->mbhc_cb->mbhc_moisture_detect_en) - mbhc->mbhc_cb->mbhc_moisture_detect_en(mbhc, false); - - /* - * For USB analog we need to override the switch configuration. - * Also, disable hph_l pull-up current source as HS_DET_L is driven - * by an external source - */ - if (mbhc->mbhc_cfg->enable_usbc_analog) { - if (mbhc->mbhc_cb->hph_pull_up_control_v2) - mbhc->mbhc_cb->hph_pull_up_control_v2(codec, - HS_PULLUP_I_OFF); - else if (mbhc->mbhc_cb->hph_pull_up_control) - mbhc->mbhc_cb->hph_pull_up_control(codec, I_OFF); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_L_DET_PULL_UP_CTRL, - 0); - } - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PLUG_TYPE, mbhc->hphl_swh); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_GND_PLUG_TYPE, mbhc->gnd_swh); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_SW_HPH_LP_100K_TO_GND, 1); - if (mbhc->mbhc_cfg->gnd_det_en && mbhc->mbhc_cb->mbhc_gnd_det_ctrl) - mbhc->mbhc_cb->mbhc_gnd_det_ctrl(codec, true); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL, 1); - - /* - * Disable L_DET for USB-C analog audio to avoid spurious interrupts - * when a non-audio accessory is inserted. L_DET_EN sets to 1 when FSA - * I2C driver notifies that ANALOG_AUDIO_ADAPTER is inserted - */ - if (mbhc->mbhc_cfg->enable_usbc_analog) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - - if (mbhc->mbhc_cfg->enable_usbc_analog) { - /* Insertion debounce set to 48ms */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_INSREM_DBNC, 4); - } else { - /* Insertion debounce set to 96ms */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_INSREM_DBNC, 6); - } - - /* Button Debounce set to 16ms */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_DBNC, 2); - - /* enable bias */ - mbhc->mbhc_cb->mbhc_bias(codec, true); - /* enable MBHC clock */ - if (mbhc->mbhc_cb->clk_setup) { - if (mbhc->mbhc_cfg->enable_usbc_analog) - mbhc->mbhc_cb->clk_setup(codec, false); - else - mbhc->mbhc_cb->clk_setup(codec, true); - } - - /* program HS_VREF value */ - wcd_program_hs_vref(mbhc); - - wcd_program_btn_threshold(mbhc, false); - - - reinit_completion(&mbhc->btn_press_compl); - - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return ret; -} - -static void wcd_mbhc_fw_read(struct work_struct *work) -{ - struct delayed_work *dwork; - struct wcd_mbhc *mbhc; - struct snd_soc_codec *codec; - const struct firmware *fw; - struct firmware_cal *fw_data = NULL; - int ret = -1, retry = 0; - bool use_default_cal = false; - - dwork = to_delayed_work(work); - mbhc = container_of(dwork, struct wcd_mbhc, mbhc_firmware_dwork); - codec = mbhc->codec; - - while (retry < FW_READ_ATTEMPTS) { - retry++; - pr_debug("%s:Attempt %d to request MBHC firmware\n", - __func__, retry); - if (mbhc->mbhc_cb->get_hwdep_fw_cal) - fw_data = mbhc->mbhc_cb->get_hwdep_fw_cal(mbhc, - WCD9XXX_MBHC_CAL); - if (!fw_data) - ret = request_firmware(&fw, "wcd9320/wcd9320_mbhc.bin", - codec->dev); - /* - * if request_firmware and hwdep cal both fail then - * sleep for 4sec for the userspace to send data to kernel - * retry for few times before bailing out - */ - if ((ret != 0) && !fw_data) { - usleep_range(FW_READ_TIMEOUT, FW_READ_TIMEOUT + - WCD_MBHC_USLEEP_RANGE_MARGIN_US); - } else { - pr_debug("%s: MBHC Firmware read successful\n", - __func__); - break; - } - } - if (!fw_data) - pr_debug("%s: using request_firmware\n", __func__); - else - pr_debug("%s: using hwdep cal\n", __func__); - - if (ret != 0 && !fw_data) { - pr_err("%s: Cannot load MBHC firmware use default cal\n", - __func__); - use_default_cal = true; - } - if (!use_default_cal) { - const void *data; - size_t size; - - if (fw_data) { - data = fw_data->data; - size = fw_data->size; - } else { - data = fw->data; - size = fw->size; - } - if (wcd_mbhc_fw_validate(data, size) == false) { - pr_err("%s: Invalid MBHC cal data size use default cal\n", - __func__); - if (!fw_data) - release_firmware(fw); - } else { - if (fw_data) { - mbhc->mbhc_cfg->calibration = - (void *)fw_data->data; - mbhc->mbhc_cal = fw_data; - } else { - mbhc->mbhc_cfg->calibration = - (void *)fw->data; - mbhc->mbhc_fw = fw; - } - } - - } - - (void) wcd_mbhc_initialise(mbhc); -} - -static int wcd_mbhc_set_keycode(struct wcd_mbhc *mbhc) -{ - enum snd_jack_types type; - int i, ret, result = 0; - int *btn_key_code; - - btn_key_code = mbhc->mbhc_cfg->key_code; - - for (i = 0 ; i < WCD_MBHC_KEYCODE_NUM ; i++) { - if (btn_key_code[i] != 0) { - switch (i) { - case 0: - type = SND_JACK_BTN_0; - break; - case 1: - type = SND_JACK_BTN_1; - break; - case 2: - type = SND_JACK_BTN_2; - break; - case 3: - type = SND_JACK_BTN_3; - break; - case 4: - type = SND_JACK_BTN_4; - break; - case 5: - type = SND_JACK_BTN_5; - break; - default: - WARN_ONCE(1, "Wrong button number:%d\n", i); - result = -1; - return result; - } - ret = snd_jack_set_key(mbhc->button_jack.jack, - type, - btn_key_code[i]); - if (ret) { - pr_err("%s: Failed to set code for %d\n", - __func__, btn_key_code[i]); - result = -1; - return result; - } - input_set_capability( - mbhc->button_jack.jack->input_dev, - EV_KEY, btn_key_code[i]); - pr_debug("%s: set btn%d key code:%d\n", __func__, - i, btn_key_code[i]); - } - } - if (btn_key_code[0]) - mbhc->is_btn_already_regd = true; - return result; -} - -static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, - unsigned long mode, void *ptr) -{ - struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, fsa_nb); - - if (!mbhc) - return -EINVAL; - - dev_dbg(mbhc->codec->dev, "%s: mode = %lu\n", __func__, mode); - - if (mode == POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER) { - if (mbhc->mbhc_cb->clk_setup) - mbhc->mbhc_cb->clk_setup(mbhc->codec, true); - /* insertion detected, enable L_DET_EN */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - } - return 0; -} - -int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) -{ - int rc = 0; - struct snd_soc_codec *codec; - struct snd_soc_card *card; - const char *usb_c_dt = "qcom,msm-mbhc-usbc-audio-supported"; - - if (!mbhc || !mbhc_cfg) - return -EINVAL; - - codec = mbhc->codec; - card = codec->component.card; - - /* update the mbhc config */ - mbhc->mbhc_cfg = mbhc_cfg; - - dev_dbg(mbhc->codec->dev, "%s: enter\n", __func__); - - /* check if USB C analog is defined on device tree */ - mbhc_cfg->enable_usbc_analog = 0; - if (of_find_property(card->dev->of_node, usb_c_dt, NULL)) { - rc = of_property_read_u32(card->dev->of_node, usb_c_dt, - &mbhc_cfg->enable_usbc_analog); - } - if (mbhc_cfg->enable_usbc_analog == 0 || rc != 0) { - dev_dbg(card->dev, - "%s: %s in dt node is missing or false\n", - __func__, usb_c_dt); - dev_dbg(card->dev, - "%s: skipping USB c analog configuration\n", __func__); - } - - /* Parse fsa switch handle */ - if (mbhc_cfg->enable_usbc_analog) { - dev_dbg(mbhc->codec->dev, "%s: usbc analog enabled\n", - __func__); - mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD; - mbhc->fsa_np = of_parse_phandle(card->dev->of_node, - "fsa4480-i2c-handle", 0); - if (!mbhc->fsa_np) { - dev_err(card->dev, "%s: fsa4480 i2c node not found\n", - __func__); - rc = -EINVAL; - goto err; - } - } - - /* Set btn key code */ - if ((!mbhc->is_btn_already_regd) && wcd_mbhc_set_keycode(mbhc)) - pr_err("Set btn key code error!!!\n"); - - if (!mbhc->mbhc_cfg->read_fw_bin || - (mbhc->mbhc_cfg->read_fw_bin && mbhc->mbhc_fw) || - (mbhc->mbhc_cfg->read_fw_bin && mbhc->mbhc_cal)) { - rc = wcd_mbhc_initialise(mbhc); - if (rc) { - dev_err(card->dev, "%s: wcd mbhc initialize failed\n", - __func__); - goto err; - } - } else { - if (!mbhc->mbhc_fw || !mbhc->mbhc_cal) - schedule_delayed_work(&mbhc->mbhc_firmware_dwork, - usecs_to_jiffies(FW_READ_TIMEOUT)); - else - pr_err("%s: Skipping to read mbhc fw, 0x%pK %pK\n", - __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); - } - - if (mbhc_cfg->enable_usbc_analog) { - mbhc->fsa_nb.notifier_call = wcd_mbhc_usbc_ana_event_handler; - mbhc->fsa_nb.priority = 0; - rc = fsa4480_reg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); - } - - return rc; -err: - dev_dbg(mbhc->codec->dev, "%s: leave %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(wcd_mbhc_start); - -void wcd_mbhc_stop(struct wcd_mbhc *mbhc) -{ - pr_debug("%s: enter\n", __func__); - - if (mbhc->current_plug != MBHC_PLUG_TYPE_NONE) { - if (mbhc->mbhc_cb && mbhc->mbhc_cb->skip_imped_detect) - mbhc->mbhc_cb->skip_imped_detect(mbhc->codec); - } - mbhc->current_plug = MBHC_PLUG_TYPE_NONE; - mbhc->hph_status = 0; - if (mbhc->mbhc_cb && mbhc->mbhc_cb->irq_control) { - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - false); - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_right_ocp, - false); - } - if (mbhc->mbhc_fw || mbhc->mbhc_cal) { - cancel_delayed_work_sync(&mbhc->mbhc_firmware_dwork); - if (!mbhc->mbhc_cal) - release_firmware(mbhc->mbhc_fw); - mbhc->mbhc_fw = NULL; - mbhc->mbhc_cal = NULL; - } - - if (mbhc->mbhc_cfg->enable_usbc_analog) - fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); - - pr_debug("%s: leave\n", __func__); -} -EXPORT_SYMBOL(wcd_mbhc_stop); - -/* - * wcd_mbhc_init : initialize MBHC internal structures. - * - * NOTE: mbhc->mbhc_cfg is not YET configure so shouldn't be used - */ -int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_codec *codec, - const struct wcd_mbhc_cb *mbhc_cb, - const struct wcd_mbhc_intr *mbhc_cdc_intr_ids, - struct wcd_mbhc_register *wcd_mbhc_regs, - bool impedance_det_en) -{ - int ret = 0; - int hph_swh = 0; - int gnd_swh = 0; - u32 hph_moist_config[3]; - struct snd_soc_card *card = codec->component.card; - const char *hph_switch = "qcom,msm-mbhc-hphl-swh"; - const char *gnd_switch = "qcom,msm-mbhc-gnd-swh"; - const char *hs_thre = "qcom,msm-mbhc-hs-mic-max-threshold-mv"; - const char *hph_thre = "qcom,msm-mbhc-hs-mic-min-threshold-mv"; - - pr_debug("%s: enter\n", __func__); - - ret = of_property_read_u32(card->dev->of_node, hph_switch, &hph_swh); - if (ret) { - dev_err(card->dev, - "%s: missing %s in dt node\n", __func__, hph_switch); - goto err; - } - - ret = of_property_read_u32(card->dev->of_node, gnd_switch, &gnd_swh); - if (ret) { - dev_err(card->dev, - "%s: missing %s in dt node\n", __func__, gnd_switch); - goto err; - } - - ret = of_property_read_u32(card->dev->of_node, hs_thre, - &(mbhc->hs_thr)); - if (ret) - dev_dbg(card->dev, - "%s: missing %s in dt node\n", __func__, hs_thre); - - ret = of_property_read_u32(card->dev->of_node, hph_thre, - &(mbhc->hph_thr)); - if (ret) - dev_dbg(card->dev, - "%s: missing %s in dt node\n", __func__, hph_thre); - - ret = of_property_read_u32_array(card->dev->of_node, - "qcom,msm-mbhc-moist-cfg", - hph_moist_config, 3); - if (ret) { - dev_dbg(card->dev, "%s: no qcom,msm-mbhc-moist-cfg in DT\n", - __func__); - mbhc->moist_vref = V_45_MV; - mbhc->moist_iref = I_3P0_UA; - mbhc->moist_rref = R_24_KOHM; - } else { - mbhc->moist_vref = hph_moist_config[0]; - mbhc->moist_iref = hph_moist_config[1]; - mbhc->moist_rref = hph_moist_config[2]; - } - - mbhc->in_swch_irq_handler = false; - mbhc->current_plug = MBHC_PLUG_TYPE_NONE; - mbhc->is_btn_press = false; - mbhc->codec = codec; - mbhc->intr_ids = mbhc_cdc_intr_ids; - mbhc->impedance_detect = impedance_det_en; - mbhc->hphl_swh = hph_swh; - mbhc->gnd_swh = gnd_swh; - mbhc->micbias_enable = false; - mbhc->mbhc_cb = mbhc_cb; - mbhc->btn_press_intr = false; - mbhc->is_hs_recording = false; - mbhc->is_extn_cable = false; - mbhc->extn_cable_hph_rem = false; - mbhc->hph_type = WCD_MBHC_HPH_NONE; - mbhc->wcd_mbhc_regs = wcd_mbhc_regs; - mbhc->swap_thr = GND_MIC_SWAP_THRESHOLD; - - if (mbhc->intr_ids == NULL) { - pr_err("%s: Interrupt mapping not provided\n", __func__); - return -EINVAL; - } - if (!mbhc->wcd_mbhc_regs) { - dev_err(codec->dev, "%s: mbhc registers are not defined\n", - __func__); - return -EINVAL; - } - - /* Check if IRQ and other required callbacks are defined or not */ - if (!mbhc_cb || !mbhc_cb->request_irq || !mbhc_cb->irq_control || - !mbhc_cb->free_irq || !mbhc_cb->map_btn_code_to_num || - !mbhc_cb->lock_sleep || !mbhc_cb->mbhc_bias || - !mbhc_cb->set_btn_thr) { - dev_err(codec->dev, "%s: required mbhc callbacks are not defined\n", - __func__); - return -EINVAL; - } - - /* No need to create new sound card jacks if is is already created */ - if (mbhc->headset_jack.jack == NULL) { - ret = snd_soc_card_jack_new(codec->component.card, - "Headset Jack", WCD_MBHC_JACK_MASK, - &mbhc->headset_jack, NULL, 0); - if (ret) { - pr_err("%s: Failed to create new jack\n", __func__); - return ret; - } - - ret = snd_soc_card_jack_new(codec->component.card, - "Button Jack", - WCD_MBHC_JACK_BUTTON_MASK, - &mbhc->button_jack, NULL, 0); - if (ret) { - pr_err("Failed to create new jack\n"); - return ret; - } - - ret = snd_jack_set_key(mbhc->button_jack.jack, - SND_JACK_BTN_0, - KEY_MEDIA); - if (ret) { - pr_err("%s: Failed to set code for btn-0\n", - __func__); - return ret; - } - - INIT_DELAYED_WORK(&mbhc->mbhc_firmware_dwork, - wcd_mbhc_fw_read); - INIT_DELAYED_WORK(&mbhc->mbhc_btn_dwork, wcd_btn_lpress_fn); - } - mutex_init(&mbhc->hphl_pa_lock); - mutex_init(&mbhc->hphr_pa_lock); - init_completion(&mbhc->btn_press_compl); - - /* Register event notifier */ - mbhc->nblock.notifier_call = wcd_event_notify; - if (mbhc->mbhc_cb->register_notifier) { - ret = mbhc->mbhc_cb->register_notifier(mbhc, &mbhc->nblock, - true); - if (ret) { - pr_err("%s: Failed to register notifier %d\n", - __func__, ret); - return ret; - } - } - - init_waitqueue_head(&mbhc->wait_btn_press); - mutex_init(&mbhc->codec_resource_lock); - - switch (mbhc->mbhc_detection_logic) { - case WCD_DETECTION_LEGACY: - wcd_mbhc_legacy_init(mbhc); - break; - case WCD_DETECTION_ADC: - wcd_mbhc_adc_init(mbhc); - break; - default: - pr_err("%s: Unknown detection logic type %d\n", - __func__, mbhc->mbhc_detection_logic); - break; - } - - if (!mbhc->mbhc_fn || - !mbhc->mbhc_fn->wcd_mbhc_hs_ins_irq || - !mbhc->mbhc_fn->wcd_mbhc_hs_rem_irq || - !mbhc->mbhc_fn->wcd_mbhc_detect_plug_type || - !mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) { - pr_err("%s: mbhc function pointer is NULL\n", __func__); - goto err_mbhc_sw_irq; - } - ret = mbhc->mbhc_cb->request_irq(codec, mbhc->intr_ids->mbhc_sw_intr, - wcd_mbhc_mech_plug_detect_irq, - "mbhc sw intr", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d, ret = %d\n", __func__, - mbhc->intr_ids->mbhc_sw_intr, ret); - goto err_mbhc_sw_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_btn_press_intr, - wcd_mbhc_btn_press_handler, - "Button Press detect", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_btn_press_intr); - goto err_btn_press_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_btn_release_intr, - wcd_mbhc_release_handler, - "Button Release detect", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_btn_release_intr); - goto err_btn_release_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_hs_ins_intr, - mbhc->mbhc_fn->wcd_mbhc_hs_ins_irq, - "Elect Insert", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_hs_ins_intr); - goto err_mbhc_hs_ins_irq; - } - mbhc->mbhc_cb->irq_control(codec, mbhc->intr_ids->mbhc_hs_ins_intr, - false); - clear_bit(WCD_MBHC_ELEC_HS_INS, &mbhc->intr_status); - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_hs_rem_intr, - mbhc->mbhc_fn->wcd_mbhc_hs_rem_irq, - "Elect Remove", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_hs_rem_intr); - goto err_mbhc_hs_rem_irq; - } - mbhc->mbhc_cb->irq_control(codec, mbhc->intr_ids->mbhc_hs_rem_intr, - false); - clear_bit(WCD_MBHC_ELEC_HS_REM, &mbhc->intr_status); - - ret = mbhc->mbhc_cb->request_irq(codec, mbhc->intr_ids->hph_left_ocp, - wcd_mbhc_hphl_ocp_irq, "HPH_L OCP detect", - mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->hph_left_ocp); - goto err_hphl_ocp_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, mbhc->intr_ids->hph_right_ocp, - wcd_mbhc_hphr_ocp_irq, "HPH_R OCP detect", - mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->hph_right_ocp); - goto err_hphr_ocp_irq; - } - - mbhc->deinit_in_progress = false; - pr_debug("%s: leave ret %d\n", __func__, ret); - return ret; - -err_hphr_ocp_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->hph_left_ocp, mbhc); -err_hphl_ocp_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_rem_intr, mbhc); -err_mbhc_hs_rem_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_ins_intr, mbhc); -err_mbhc_hs_ins_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_release_intr, - mbhc); -err_btn_release_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_press_intr, - mbhc); -err_btn_press_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_sw_intr, mbhc); -err_mbhc_sw_irq: - if (mbhc->mbhc_cb->register_notifier) - mbhc->mbhc_cb->register_notifier(mbhc, &mbhc->nblock, false); - mutex_destroy(&mbhc->codec_resource_lock); -err: - pr_debug("%s: leave ret %d\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(wcd_mbhc_init); - -void wcd_mbhc_deinit(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_sw_intr, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_press_intr, - mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_release_intr, - mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_ins_intr, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_rem_intr, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->hph_left_ocp, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->hph_right_ocp, mbhc); - if (mbhc->mbhc_cb && mbhc->mbhc_cb->register_notifier) - mbhc->mbhc_cb->register_notifier(mbhc, &mbhc->nblock, false); - if (mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) { - WCD_MBHC_RSC_LOCK(mbhc); - mbhc->mbhc_fn->wcd_cancel_hs_detect_plug(mbhc, - &mbhc->correct_plug_swch); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - mutex_destroy(&mbhc->codec_resource_lock); - mutex_destroy(&mbhc->hphl_pa_lock); - mutex_destroy(&mbhc->hphr_pa_lock); -} -EXPORT_SYMBOL(wcd_mbhc_deinit); - -static int __init mbhc_init(void) -{ - return 0; -} - -static void __exit mbhc_exit(void) -{ -} - -module_init(mbhc_init); -module_exit(mbhc_exit); - -MODULE_DESCRIPTION("wcd MBHC v2 module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-spi-registers.h b/techpack/audio/4.0/asoc/codecs/wcd-spi-registers.h deleted file mode 100644 index e0d9612af015..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-spi-registers.h +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. - */ - -#ifndef __WCD_SPI_REGISTERS_H__ -#define __WCD_SPI_REGISTERS_H__ - -#include - -#define WCD_SPI_SLAVE_SANITY (0x00) -#define WCD_SPI_SLAVE_DEVICE_ID (0x04) -#define WCD_SPI_SLAVE_STATUS (0x08) -#define WCD_SPI_SLAVE_CONFIG (0x0c) -#define WCD_SPI_SLAVE_SW_RESET (0x10) -#define WCD_SPI_SLAVE_IRQ_STATUS (0x14) -#define WCD_SPI_SLAVE_IRQ_EN (0x18) -#define WCD_SPI_SLAVE_IRQ_CLR (0x1c) -#define WCD_SPI_SLAVE_IRQ_FORCE (0x20) -#define WCD_SPI_SLAVE_TX (0x24) -#define WCD_SPI_SLAVE_TEST_BUS_DATA (0x2c) -#define WCD_SPI_SLAVE_TEST_BUS_CTRL (0x30) -#define WCD_SPI_SLAVE_SW_RST_IRQ (0x34) -#define WCD_SPI_SLAVE_CHAR_CFG (0x38) -#define WCD_SPI_SLAVE_CHAR_DATA_MOSI (0x3c) -#define WCD_SPI_SLAVE_CHAR_DATA_CS_N (0x40) -#define WCD_SPI_SLAVE_CHAR_DATA_MISO (0x44) -#define WCD_SPI_SLAVE_TRNS_BYTE_CNT (0x4c) -#define WCD_SPI_SLAVE_TRNS_LEN (0x50) -#define WCD_SPI_SLAVE_FIFO_LEVEL (0x54) -#define WCD_SPI_SLAVE_GENERICS (0x58) -#define WCD_SPI_SLAVE_EXT_BASE_ADDR (0x5c) -#define WCD_SPI_MAX_REGISTER (0x5F) - -#endif /* End __WCD_SPI_REGISTERS_H__ */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd-spi.c b/techpack/audio/4.0/asoc/codecs/wcd-spi.c deleted file mode 100644 index 4c7a85338ed4..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd-spi.c +++ /dev/null @@ -1,1674 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-spi-registers.h" - -/* Byte manipulations */ -#define SHIFT_1_BYTES (8) -#define SHIFT_2_BYTES (16) -#define SHIFT_3_BYTES (24) - -/* Command opcodes */ -#define WCD_SPI_CMD_NOP (0x00) -#define WCD_SPI_CMD_WREN (0x06) -#define WCD_SPI_CMD_CLKREQ (0xDA) -#define WCD_SPI_CMD_RDSR (0x05) -#define WCD_SPI_CMD_IRR (0x81) -#define WCD_SPI_CMD_IRW (0x82) -#define WCD_SPI_CMD_MIOR (0x83) -#define WCD_SPI_CMD_FREAD (0x0B) -#define WCD_SPI_CMD_MIOW (0x02) -#define WCD_SPI_WRITE_FRAME_OPCODE \ - (WCD_SPI_CMD_MIOW << SHIFT_3_BYTES) -#define WCD_SPI_READ_FRAME_OPCODE \ - (WCD_SPI_CMD_MIOR << SHIFT_3_BYTES) -#define WCD_SPI_FREAD_FRAME_OPCODE \ - (WCD_SPI_CMD_FREAD << SHIFT_3_BYTES) - -/* Command lengths */ -#define WCD_SPI_OPCODE_LEN (0x01) -#define WCD_SPI_CMD_NOP_LEN (0x01) -#define WCD_SPI_CMD_WREN_LEN (0x01) -#define WCD_SPI_CMD_CLKREQ_LEN (0x04) -#define WCD_SPI_CMD_IRR_LEN (0x04) -#define WCD_SPI_CMD_IRW_LEN (0x06) -#define WCD_SPI_WRITE_SINGLE_LEN (0x08) -#define WCD_SPI_READ_SINGLE_LEN (0x13) -#define WCD_SPI_CMD_FREAD_LEN (0x13) - -/* Command delays */ -#define WCD_SPI_CLKREQ_DELAY_USECS (500) -#define WCD_SPI_CLK_OFF_TIMER_MS (500) -#define WCD_SPI_RESUME_TIMEOUT_MS 100 - -/* Command masks */ -#define WCD_CMD_ADDR_MASK \ - (0xFF | \ - (0xFF << SHIFT_1_BYTES) | \ - (0xFF << SHIFT_2_BYTES)) - -/* Clock ctrl request related */ -#define WCD_SPI_CLK_ENABLE true -#define WCD_SPI_CLK_DISABLE false -#define WCD_SPI_CLK_FLAG_DELAYED (1 << 0) -#define WCD_SPI_CLK_FLAG_IMMEDIATE (1 << 1) - -/* Internal addresses */ -#define WCD_SPI_ADDR_IPC_CTL_HOST (0x012014) - -/* Word sizes and min/max lengths */ -#define WCD_SPI_WORD_BYTE_CNT (4) -#define WCD_SPI_RW_MULTI_MIN_LEN (16) - -/* Max size is 32 bytes less than 64Kbytes */ -#define WCD_SPI_RW_MULTI_MAX_LEN ((64 * 1024) - 32) - -/* - * Max size for the pre-allocated buffers is the max - * possible read/write length + 32 bytes for the SPI - * read/write command header itself. - */ -#define WCD_SPI_RW_MAX_BUF_SIZE (WCD_SPI_RW_MULTI_MAX_LEN + 32) - -/* Alignment requirements */ -#define WCD_SPI_RW_MIN_ALIGN WCD_SPI_WORD_BYTE_CNT -#define WCD_SPI_RW_MULTI_ALIGN (16) - -/* Status mask bits */ -#define WCD_SPI_CLK_STATE_ENABLED BIT(0) -#define WCD_SPI_IS_SUSPENDED BIT(1) - -/* Locking related */ -#define WCD_SPI_MUTEX_LOCK(spi, lock) \ -{ \ - dev_vdbg(&spi->dev, "%s: mutex_lock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_lock(&lock); \ -} - -#define WCD_SPI_MUTEX_UNLOCK(spi, lock) \ -{ \ - dev_vdbg(&spi->dev, "%s: mutex_unlock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_unlock(&lock); \ -} - -struct wcd_spi_debug_data { - struct dentry *dir; - u32 addr; - u32 size; -}; - -struct wcd_spi_priv { - struct spi_device *spi; - u32 mem_base_addr; - - struct regmap *regmap; - - /* Message for single transfer */ - struct spi_message msg1; - struct spi_transfer xfer1; - - /* Message for two transfers */ - struct spi_message msg2; - struct spi_transfer xfer2[2]; - - /* Register access related */ - u32 reg_bytes; - u32 val_bytes; - - /* Clock requests related */ - struct mutex clk_mutex; - int clk_users; - unsigned long status_mask; - struct delayed_work clk_dwork; - - /* Transaction related */ - struct mutex xfer_mutex; - - struct device *m_dev; - struct wdsp_mgr_ops *m_ops; - - /* Debugfs related information */ - struct wcd_spi_debug_data debug_data; - - /* Completion object to indicate system resume completion */ - struct completion resume_comp; - - /* Buffers to hold memory used for transfers */ - void *tx_buf; - void *rx_buf; - - /* DMA handles for transfer buffers */ - dma_addr_t tx_dma; - dma_addr_t rx_dma; - /* Handle to child (qmi client) device */ - struct device *ac_dev; -}; - -enum xfer_request { - WCD_SPI_XFER_WRITE, - WCD_SPI_XFER_READ, -}; - - -static char *wcd_spi_xfer_req_str(enum xfer_request req) -{ - if (req == WCD_SPI_XFER_WRITE) - return "xfer_write"; - else if (req == WCD_SPI_XFER_READ) - return "xfer_read"; - else - return "xfer_invalid"; -} - -static void wcd_spi_reinit_xfer(struct spi_transfer *xfer) -{ - xfer->tx_buf = NULL; - xfer->rx_buf = NULL; - xfer->delay_usecs = 0; - xfer->len = 0; -} - -static bool wcd_spi_is_suspended(struct wcd_spi_priv *wcd_spi) -{ - return test_bit(WCD_SPI_IS_SUSPENDED, &wcd_spi->status_mask); -} - -static bool wcd_spi_can_suspend(struct wcd_spi_priv *wcd_spi) -{ - struct spi_device *spi = wcd_spi->spi; - - if (wcd_spi->clk_users > 0 || - test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) { - dev_err(&spi->dev, "%s: cannot suspend, clk_users = %d\n", - __func__, wcd_spi->clk_users); - return false; - } - - return true; -} - -static int wcd_spi_wait_for_resume(struct wcd_spi_priv *wcd_spi) -{ - struct spi_device *spi = wcd_spi->spi; - int rc = 0; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - /* If the system is already in resumed state, return right away */ - if (!wcd_spi_is_suspended(wcd_spi)) - goto done; - - /* If suspended then wait for resume to happen */ - reinit_completion(&wcd_spi->resume_comp); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - rc = wait_for_completion_timeout(&wcd_spi->resume_comp, - msecs_to_jiffies(WCD_SPI_RESUME_TIMEOUT_MS)); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (rc == 0) { - dev_err(&spi->dev, "%s: failed to resume in %u msec\n", - __func__, WCD_SPI_RESUME_TIMEOUT_MS); - rc = -EIO; - goto done; - } - - dev_dbg(&spi->dev, "%s: resume successful\n", __func__); - rc = 0; -done: - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - return rc; -} - -static int wcd_spi_read_single(struct spi_device *spi, - u32 remote_addr, u32 *val) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *tx_xfer = &wcd_spi->xfer2[0]; - struct spi_transfer *rx_xfer = &wcd_spi->xfer2[1]; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - u32 frame = 0; - int ret; - - dev_dbg(&spi->dev, "%s: remote_addr = 0x%x\n", - __func__, remote_addr); - - if (!tx_buf) { - dev_err(&spi->dev, "%s: tx_buf not allocated\n", - __func__); - return -ENOMEM; - } - - frame |= WCD_SPI_READ_FRAME_OPCODE; - frame |= remote_addr & WCD_CMD_ADDR_MASK; - - wcd_spi_reinit_xfer(tx_xfer); - frame = cpu_to_be32(frame); - memcpy(tx_buf, &frame, sizeof(frame)); - tx_xfer->tx_buf = tx_buf; - tx_xfer->len = WCD_SPI_READ_SINGLE_LEN; - - wcd_spi_reinit_xfer(rx_xfer); - rx_xfer->rx_buf = rx_buf; - rx_xfer->len = sizeof(*val); - - ret = spi_sync(spi, &wcd_spi->msg2); - if (ret) - dev_err(&spi->dev, "%s: spi_sync failed, err %d\n", - __func__, ret); - else - memcpy((u8*) val, rx_buf, sizeof(*val)); - - return ret; -} - -static int wcd_spi_read_multi(struct spi_device *spi, - u32 remote_addr, u8 *data, - size_t len) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - u32 frame = 0; - int ret; - - dev_dbg(&spi->dev, "%s: addr 0x%x, len = %zd\n", - __func__, remote_addr, len); - - frame |= WCD_SPI_FREAD_FRAME_OPCODE; - frame |= remote_addr & WCD_CMD_ADDR_MASK; - - if (!tx_buf || !rx_buf) { - dev_err(&spi->dev, "%s: %s not allocated\n", __func__, - (!tx_buf) ? "tx_buf" : "rx_buf"); - return -ENOMEM; - } - - wcd_spi_reinit_xfer(xfer); - frame = cpu_to_be32(frame); - memcpy(tx_buf, &frame, sizeof(frame)); - xfer->tx_buf = tx_buf; - xfer->rx_buf = rx_buf; - xfer->len = WCD_SPI_CMD_FREAD_LEN + len; - - ret = spi_sync(spi, &wcd_spi->msg1); - if (ret) { - dev_err(&spi->dev, "%s: failed, err = %d\n", - __func__, ret); - goto done; - } - - memcpy(data, rx_buf + WCD_SPI_CMD_FREAD_LEN, len); -done: - return ret; -} - -static int wcd_spi_write_single(struct spi_device *spi, - u32 remote_addr, u32 val) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u8 *tx_buf = wcd_spi->tx_buf; - u32 frame = 0; - - dev_dbg(&spi->dev, "%s: remote_addr = 0x%x, val = 0x%x\n", - __func__, remote_addr, val); - - memset(tx_buf, 0, WCD_SPI_WRITE_SINGLE_LEN); - frame |= WCD_SPI_WRITE_FRAME_OPCODE; - frame |= (remote_addr & WCD_CMD_ADDR_MASK); - - frame = cpu_to_be32(frame); - memcpy(tx_buf, &frame, sizeof(frame)); - memcpy(tx_buf + sizeof(frame), &val, sizeof(val)); - - wcd_spi_reinit_xfer(xfer); - xfer->tx_buf = tx_buf; - xfer->len = WCD_SPI_WRITE_SINGLE_LEN; - - return spi_sync(spi, &wcd_spi->msg1); -} - -static int wcd_spi_write_multi(struct spi_device *spi, - u32 remote_addr, u8 *data, - size_t len) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u32 frame = 0; - u8 *tx_buf = wcd_spi->tx_buf; - int xfer_len, ret; - - dev_dbg(&spi->dev, "%s: addr = 0x%x len = %zd\n", - __func__, remote_addr, len); - - frame |= WCD_SPI_WRITE_FRAME_OPCODE; - frame |= (remote_addr & WCD_CMD_ADDR_MASK); - - frame = cpu_to_be32(frame); - xfer_len = len + sizeof(frame); - - if (!tx_buf) { - dev_err(&spi->dev, "%s: tx_buf not allocated\n", - __func__); - return -ENOMEM; - } - - memcpy(tx_buf, &frame, sizeof(frame)); - memcpy(tx_buf + sizeof(frame), data, len); - - wcd_spi_reinit_xfer(xfer); - xfer->tx_buf = tx_buf; - xfer->len = xfer_len; - - ret = spi_sync(spi, &wcd_spi->msg1); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed, addr = 0x%x, len = %zd\n", - __func__, remote_addr, len); - return ret; -} - -static int wcd_spi_transfer_split(struct spi_device *spi, - struct wcd_spi_msg *data_msg, - enum xfer_request xfer_req) -{ - u32 addr = data_msg->remote_addr; - u8 *data = data_msg->data; - int remain_size = data_msg->len; - int to_xfer, loop_cnt, ret = 0; - - /* Perform single writes until multi word alignment is met */ - loop_cnt = 1; - while (remain_size && - !IS_ALIGNED(addr, WCD_SPI_RW_MULTI_ALIGN)) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_single(spi, addr, - (*(u32 *)data)); - else - ret = wcd_spi_read_single(spi, addr, - (u32 *)data); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail iter(%d) start-word addr (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - loop_cnt, addr); - goto done; - } - - addr += WCD_SPI_WORD_BYTE_CNT; - data += WCD_SPI_WORD_BYTE_CNT; - remain_size -= WCD_SPI_WORD_BYTE_CNT; - loop_cnt++; - } - - /* Perform multi writes for max allowed multi writes */ - loop_cnt = 1; - while (remain_size >= WCD_SPI_RW_MULTI_MAX_LEN) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_multi(spi, addr, data, - WCD_SPI_RW_MULTI_MAX_LEN); - else - ret = wcd_spi_read_multi(spi, addr, data, - WCD_SPI_RW_MULTI_MAX_LEN); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail iter(%d) max-write addr (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - loop_cnt, addr); - goto done; - } - - addr += WCD_SPI_RW_MULTI_MAX_LEN; - data += WCD_SPI_RW_MULTI_MAX_LEN; - remain_size -= WCD_SPI_RW_MULTI_MAX_LEN; - loop_cnt++; - } - - /* - * Perform write for max possible data that is multiple - * of the minimum size for multi-write commands. - */ - to_xfer = remain_size - (remain_size % WCD_SPI_RW_MULTI_MIN_LEN); - if (remain_size >= WCD_SPI_RW_MULTI_MIN_LEN && - to_xfer > 0) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_multi(spi, addr, data, to_xfer); - else - ret = wcd_spi_read_multi(spi, addr, data, to_xfer); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail write addr (0x%x), size (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - addr, to_xfer); - goto done; - } - - addr += to_xfer; - data += to_xfer; - remain_size -= to_xfer; - } - - /* Perform single writes for the last remaining data */ - loop_cnt = 1; - while (remain_size > 0) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_single(spi, addr, (*((u32 *)data))); - else - ret = wcd_spi_read_single(spi, addr, (u32 *) data); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail iter(%d) end-write addr (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - loop_cnt, addr); - goto done; - } - - addr += WCD_SPI_WORD_BYTE_CNT; - data += WCD_SPI_WORD_BYTE_CNT; - remain_size -= WCD_SPI_WORD_BYTE_CNT; - loop_cnt++; - } - -done: - return ret; -} - -static int wcd_spi_cmd_nop(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - u8 *tx_buf = wcd_spi->tx_buf; - - tx_buf[0] = WCD_SPI_CMD_NOP; - - return spi_write(spi, tx_buf, WCD_SPI_CMD_NOP_LEN); -} - -static int wcd_spi_cmd_clkreq(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u8 *tx_buf = wcd_spi->tx_buf; - u8 cmd[WCD_SPI_CMD_CLKREQ_LEN] = { - WCD_SPI_CMD_CLKREQ, - 0xBA, 0x80, 0x00}; - - memcpy(tx_buf, cmd, WCD_SPI_CMD_CLKREQ_LEN); - wcd_spi_reinit_xfer(xfer); - xfer->tx_buf = tx_buf; - xfer->len = WCD_SPI_CMD_CLKREQ_LEN; - xfer->delay_usecs = WCD_SPI_CLKREQ_DELAY_USECS; - - return spi_sync(spi, &wcd_spi->msg1); -} - -static int wcd_spi_cmd_wr_en(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - u8 *tx_buf = wcd_spi->tx_buf; - - tx_buf[0] = WCD_SPI_CMD_WREN; - - return spi_write(spi, tx_buf, WCD_SPI_CMD_WREN_LEN); -} - -static int wcd_spi_cmd_rdsr(struct spi_device *spi, - u32 *rdsr_status) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *tx_xfer = &wcd_spi->xfer2[0]; - struct spi_transfer *rx_xfer = &wcd_spi->xfer2[1]; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - int ret; - - tx_buf[0] = WCD_SPI_CMD_RDSR; - wcd_spi_reinit_xfer(tx_xfer); - tx_xfer->tx_buf = tx_buf; - tx_xfer->len = WCD_SPI_OPCODE_LEN; - - memset(rx_buf, 0, sizeof(*rdsr_status)); - wcd_spi_reinit_xfer(rx_xfer); - rx_xfer->rx_buf = rx_buf; - rx_xfer->len = sizeof(*rdsr_status); - - ret = spi_sync(spi, &wcd_spi->msg2); - if (ret < 0) { - dev_err(&spi->dev, "%s: RDSR failed, err = %d\n", - __func__, ret); - goto done; - } - - *rdsr_status = be32_to_cpu(*((u32*)rx_buf)); - - dev_dbg(&spi->dev, "%s: RDSR success, value = 0x%x\n", - __func__, *rdsr_status); -done: - return ret; -} - -static int wcd_spi_clk_enable(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - u32 rd_status = 0; - - /* Get the SPI access first */ - if (wcd_spi->ac_dev) { - ret = wcd_spi_access_ctl(wcd_spi->ac_dev, - WCD_SPI_ACCESS_REQUEST, - WCD_SPI_AC_DATA_TRANSFER); - if (ret) { - dev_err(&spi->dev, - "%s: Can't get spi access, err = %d\n", - __func__, ret); - return ret; - } - } - - ret = wcd_spi_cmd_nop(spi); - if (ret < 0) { - dev_err(&spi->dev, "%s: NOP1 failed, err = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_spi_cmd_clkreq(spi); - if (ret < 0) { - dev_err(&spi->dev, "%s: CLK_REQ failed, err = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_spi_cmd_nop(spi); - if (ret < 0) { - dev_err(&spi->dev, "%s: NOP2 failed, err = %d\n", - __func__, ret); - goto done; - } - wcd_spi_cmd_rdsr(spi, &rd_status); - /* - * Read status zero means reads are not - * happenning on the bus, possibly because - * clock request failed. - */ - if (rd_status) { - set_bit(WCD_SPI_CLK_STATE_ENABLED, - &wcd_spi->status_mask); - } else { - dev_err(&spi->dev, "%s: RDSR status is zero\n", - __func__); - ret = -EIO; - } -done: - return ret; -} - -static int wcd_spi_clk_disable(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - - ret = wcd_spi_write_single(spi, WCD_SPI_ADDR_IPC_CTL_HOST, 0x01); - if (ret < 0) - dev_err(&spi->dev, "%s: Failed, err = %d\n", - __func__, ret); - /* - * clear this bit even if clock disable failed - * as the source clocks might get turned off. - */ - clear_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask); - - /* once the clock is released, SPI access can be released as well */ - if (wcd_spi->ac_dev) { - ret = wcd_spi_access_ctl(wcd_spi->ac_dev, - WCD_SPI_ACCESS_RELEASE, - WCD_SPI_AC_DATA_TRANSFER); - if (ret) - dev_err(&spi->dev, - "%s: SPI access release failed, err = %d\n", - __func__, ret); - } - - return ret; -} - -static int wcd_spi_clk_ctrl(struct spi_device *spi, - bool request, u32 flags) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret = 0; - const char *delay_str; - - delay_str = (flags == WCD_SPI_CLK_FLAG_DELAYED) ? - "delayed" : "immediate"; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - - /* Reject any unbalanced disable request */ - if (wcd_spi->clk_users < 0 || - (!request && wcd_spi->clk_users == 0)) { - dev_err(&spi->dev, "%s: Unbalanced clk_users %d for %s\n", - __func__, wcd_spi->clk_users, - request ? "enable" : "disable"); - ret = -EINVAL; - - /* Reset the clk_users to 0 */ - wcd_spi->clk_users = 0; - - goto done; - } - - if (request == WCD_SPI_CLK_ENABLE) { - /* - * If the SPI bus is suspended, then return error - * as the transaction cannot be completed. - */ - if (wcd_spi_is_suspended(wcd_spi)) { - dev_err(&spi->dev, - "%s: SPI suspended, cannot enable clk\n", - __func__); - ret = -EIO; - goto done; - } - - /* Cancel the disable clk work */ - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - cancel_delayed_work_sync(&wcd_spi->clk_dwork); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - - wcd_spi->clk_users++; - - /* - * If clk state is already set, - * then clk wasnt really disabled - */ - if (test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) - goto done; - else if (wcd_spi->clk_users == 1) - ret = wcd_spi_clk_enable(spi); - - } else { - wcd_spi->clk_users--; - - /* Clock is still voted for */ - if (wcd_spi->clk_users > 0) - goto done; - - /* - * If we are here, clk_users must be 0 and needs - * to be disabled. Call the disable based on the - * flags. - */ - if (flags == WCD_SPI_CLK_FLAG_DELAYED) { - schedule_delayed_work(&wcd_spi->clk_dwork, - msecs_to_jiffies(WCD_SPI_CLK_OFF_TIMER_MS)); - } else { - ret = wcd_spi_clk_disable(spi); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed to disable clk err = %d\n", - __func__, ret); - } - } - -done: - dev_dbg(&spi->dev, "%s: updated clk_users = %d, request_%s %s\n", - __func__, wcd_spi->clk_users, request ? "enable" : "disable", - request ? "" : delay_str); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - - return ret; -} - -static int wcd_spi_init(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_ENABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) - goto done; - - ret = wcd_spi_cmd_wr_en(spi); - if (ret < 0) - goto err_wr_en; - - /* - * In case spi_init is called after component deinit, - * it is possible hardware register state is also reset. - * Sync the regcache here so hardware state is updated - * to reflect the cache. - */ - regcache_sync(wcd_spi->regmap); - - regmap_write(wcd_spi->regmap, WCD_SPI_SLAVE_CONFIG, - 0x0F3D0800); - - /* Write the MTU to max allowed size */ - regmap_update_bits(wcd_spi->regmap, - WCD_SPI_SLAVE_TRNS_LEN, - 0xFFFF0000, 0xFFFF0000); -err_wr_en: - wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_DISABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); -done: - return ret; -} - -static void wcd_spi_clk_work(struct work_struct *work) -{ - struct delayed_work *dwork; - struct wcd_spi_priv *wcd_spi; - struct spi_device *spi; - int ret; - - dwork = to_delayed_work(work); - wcd_spi = container_of(dwork, struct wcd_spi_priv, clk_dwork); - spi = wcd_spi->spi; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - ret = wcd_spi_clk_disable(spi); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed to disable clk, err = %d\n", - __func__, ret); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); -} - -static int __wcd_spi_data_xfer(struct spi_device *spi, - struct wcd_spi_msg *msg, - enum xfer_request xfer_req) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - - /* Check for minimum alignment requirements */ - if (!IS_ALIGNED(msg->remote_addr, WCD_SPI_RW_MIN_ALIGN)) { - dev_err(&spi->dev, - "%s addr 0x%x is not aligned to 0x%x\n", - __func__, msg->remote_addr, WCD_SPI_RW_MIN_ALIGN); - return -EINVAL; - } else if (msg->len % WCD_SPI_WORD_BYTE_CNT) { - dev_err(&spi->dev, - "%s len 0x%zx is not multiple of %d\n", - __func__, msg->len, WCD_SPI_WORD_BYTE_CNT); - return -EINVAL; - } - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (wcd_spi_is_suspended(wcd_spi)) { - dev_dbg(&spi->dev, - "%s: SPI suspended, cannot perform transfer\n", - __func__); - ret = -EIO; - goto done; - } - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->xfer_mutex); - if (msg->len == WCD_SPI_WORD_BYTE_CNT) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_single(spi, msg->remote_addr, - (*((u32 *)msg->data))); - else - ret = wcd_spi_read_single(spi, msg->remote_addr, - (u32 *) msg->data); - } else { - ret = wcd_spi_transfer_split(spi, msg, xfer_req); - } - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->xfer_mutex); -done: - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - return ret; -} - -static int wcd_spi_data_xfer(struct spi_device *spi, - struct wcd_spi_msg *msg, - enum xfer_request req) -{ - int ret, ret1; - - if (msg->len <= 0) { - dev_err(&spi->dev, "%s: Invalid size %zd\n", - __func__, msg->len); - return -EINVAL; - } - - /* Request for clock */ - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_ENABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) { - dev_err(&spi->dev, "%s: clk enable failed %d\n", - __func__, ret); - goto done; - } - - /* Perform the transaction */ - ret = __wcd_spi_data_xfer(spi, msg, req); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed %s, addr = 0x%x, size = 0x%zx, err = %d\n", - __func__, wcd_spi_xfer_req_str(req), - msg->remote_addr, msg->len, ret); - - /* Release the clock even if xfer failed */ - ret1 = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_DISABLE, - WCD_SPI_CLK_FLAG_DELAYED); - if (ret1 < 0) - dev_err(&spi->dev, "%s: clk disable failed %d\n", - __func__, ret1); -done: - return ret; -} - -/* - * wcd_spi_data_write: Write data to WCD SPI - * @spi: spi_device struct - * @msg: msg that needs to be written to WCD - * - * This API writes length of data to address specified. These details - * about the write are encapsulated in @msg. Write size should be multiple - * of 4 bytes and write address should be 4-byte aligned. - */ -static int wcd_spi_data_write(struct spi_device *spi, - struct wcd_spi_msg *msg) -{ - if (!spi || !msg) { - pr_err("%s: Invalid %s\n", __func__, - (!spi) ? "spi device" : "msg"); - return -EINVAL; - } - - dev_dbg_ratelimited(&spi->dev, "%s: addr = 0x%x, len = %zu\n", - __func__, msg->remote_addr, msg->len); - return wcd_spi_data_xfer(spi, msg, WCD_SPI_XFER_WRITE); -} - -/* - * wcd_spi_data_read: Read data from WCD SPI - * @spi: spi_device struct - * @msg: msg that needs to be read from WCD - * - * This API reads length of data from address specified. These details - * about the read are encapsulated in @msg. Read size should be multiple - * of 4 bytes and read address should be 4-byte aligned. - */ -static int wcd_spi_data_read(struct spi_device *spi, - struct wcd_spi_msg *msg) -{ - if (!spi || !msg) { - pr_err("%s: Invalid %s\n", __func__, - (!spi) ? "spi device" : "msg"); - return -EINVAL; - } - - dev_dbg_ratelimited(&spi->dev, "%s: addr = 0x%x,len = %zu\n", - __func__, msg->remote_addr, msg->len); - return wcd_spi_data_xfer(spi, msg, WCD_SPI_XFER_READ); -} - -static int wdsp_spi_dload_section(struct spi_device *spi, - void *data) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wdsp_img_section *sec = data; - struct wcd_spi_msg msg; - int ret; - - dev_dbg(&spi->dev, "%s: addr = 0x%x, size = 0x%zx\n", - __func__, sec->addr, sec->size); - - msg.remote_addr = sec->addr + wcd_spi->mem_base_addr; - msg.data = sec->data; - msg.len = sec->size; - - ret = __wcd_spi_data_xfer(spi, &msg, WCD_SPI_XFER_WRITE); - if (ret < 0) - dev_err(&spi->dev, "%s: fail addr (0x%x) size (0x%zx)\n", - __func__, msg.remote_addr, msg.len); - return ret; -} - -static int wdsp_spi_read_section(struct spi_device *spi, void *data) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wdsp_img_section *sec = data; - struct wcd_spi_msg msg; - int ret; - - msg.remote_addr = sec->addr + wcd_spi->mem_base_addr; - msg.data = sec->data; - msg.len = sec->size; - - dev_dbg(&spi->dev, "%s: addr = 0x%x, size = 0x%zx\n", - __func__, msg.remote_addr, msg.len); - - ret = wcd_spi_data_xfer(spi, &msg, WCD_SPI_XFER_READ); - if (ret < 0) - dev_err(&spi->dev, "%s: fail addr (0x%x) size (0x%zx)\n", - __func__, msg.remote_addr, msg.len); - return ret; -} - -static int wdsp_spi_event_handler(struct device *dev, void *priv_data, - enum wdsp_event_type event, - void *data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_ops *spi_ops; - int ret = 0; - - dev_dbg(&spi->dev, "%s: event type %d\n", - __func__, event); - - switch (event) { - case WDSP_EVENT_PRE_SHUTDOWN: - if (wcd_spi->ac_dev) { - ret = wcd_spi_access_ctl(wcd_spi->ac_dev, - WCD_SPI_ACCESS_REQUEST, - WCD_SPI_AC_REMOTE_DOWN); - if (ret) - dev_err(&spi->dev, - "%s: request access failed %d\n", - __func__, ret); - } - break; - - case WDSP_EVENT_POST_SHUTDOWN: - cancel_delayed_work_sync(&wcd_spi->clk_dwork); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) - wcd_spi_clk_disable(spi); - wcd_spi->clk_users = 0; - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - break; - - case WDSP_EVENT_POST_BOOTUP: - if (wcd_spi->ac_dev) { - ret = wcd_spi_access_ctl(wcd_spi->ac_dev, - WCD_SPI_ACCESS_RELEASE, - WCD_SPI_AC_REMOTE_DOWN); - if (ret) - dev_err(&spi->dev, - "%s: release access failed %d\n", - __func__, ret); - } - break; - - case WDSP_EVENT_PRE_DLOAD_CODE: - case WDSP_EVENT_PRE_DLOAD_DATA: - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_ENABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) - dev_err(&spi->dev, "%s: clk_req failed %d\n", - __func__, ret); - break; - - case WDSP_EVENT_POST_DLOAD_CODE: - case WDSP_EVENT_POST_DLOAD_DATA: - case WDSP_EVENT_DLOAD_FAILED: - - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_DISABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) - dev_err(&spi->dev, "%s: clk unvote failed %d\n", - __func__, ret); - break; - - case WDSP_EVENT_DLOAD_SECTION: - ret = wdsp_spi_dload_section(spi, data); - break; - - case WDSP_EVENT_READ_SECTION: - ret = wdsp_spi_read_section(spi, data); - break; - - case WDSP_EVENT_SUSPEND: - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (!wcd_spi_can_suspend(wcd_spi)) - ret = -EBUSY; - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - break; - - case WDSP_EVENT_RESUME: - ret = wcd_spi_wait_for_resume(wcd_spi); - break; - - case WDSP_EVENT_GET_DEVOPS: - if (!data) { - dev_err(&spi->dev, "%s: invalid data\n", - __func__); - ret = -EINVAL; - break; - } - - spi_ops = (struct wcd_spi_ops *) data; - spi_ops->spi_dev = spi; - spi_ops->read_dev = wcd_spi_data_read; - spi_ops->write_dev = wcd_spi_data_write; - break; - - default: - dev_dbg(&spi->dev, "%s: Unhandled event %d\n", - __func__, event); - break; - } - - return ret; -} - -static int wcd_spi_bus_gwrite(void *context, const void *reg, - size_t reg_len, const void *val, - size_t val_len) -{ - struct device *dev = context; - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - u8 *tx_buf = wcd_spi->tx_buf; - - if (!reg || !val || reg_len != wcd_spi->reg_bytes || - val_len != wcd_spi->val_bytes) { - dev_err(&spi->dev, - "%s: Invalid input, reg_len = %zd, val_len = %zd", - __func__, reg_len, val_len); - return -EINVAL; - } - - memset(tx_buf, 0, WCD_SPI_CMD_IRW_LEN); - tx_buf[0] = WCD_SPI_CMD_IRW; - tx_buf[1] = *((u8 *)reg); - memcpy(tx_buf + WCD_SPI_OPCODE_LEN + reg_len, - val, val_len); - - return spi_write(spi, tx_buf, WCD_SPI_CMD_IRW_LEN); -} - -static int wcd_spi_bus_write(void *context, const void *data, - size_t count) -{ - struct device *dev = context; - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - if (count < (wcd_spi->reg_bytes + wcd_spi->val_bytes)) { - dev_err(&spi->dev, "%s: Invalid size %zd\n", - __func__, count); - WARN_ON(1); - return -EINVAL; - } - - return wcd_spi_bus_gwrite(context, data, wcd_spi->reg_bytes, - data + wcd_spi->reg_bytes, - count - wcd_spi->reg_bytes); -} - -static int wcd_spi_bus_read(void *context, const void *reg, - size_t reg_len, void *val, - size_t val_len) -{ - struct device *dev = context; - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *tx_xfer = &wcd_spi->xfer2[0]; - struct spi_transfer *rx_xfer = &wcd_spi->xfer2[1]; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - int ret = 0; - - if (!reg || !val || reg_len != wcd_spi->reg_bytes || - val_len != wcd_spi->val_bytes) { - dev_err(&spi->dev, - "%s: Invalid input, reg_len = %zd, val_len = %zd", - __func__, reg_len, val_len); - return -EINVAL; - } - - memset(tx_buf, 0, WCD_SPI_CMD_IRR_LEN); - tx_buf[0] = WCD_SPI_CMD_IRR; - tx_buf[1] = *((u8 *)reg); - - wcd_spi_reinit_xfer(tx_xfer); - tx_xfer->tx_buf = tx_buf; - tx_xfer->rx_buf = NULL; - tx_xfer->len = WCD_SPI_CMD_IRR_LEN; - - wcd_spi_reinit_xfer(rx_xfer); - rx_xfer->tx_buf = NULL; - rx_xfer->rx_buf = rx_buf; - rx_xfer->len = val_len; - - ret = spi_sync(spi, &wcd_spi->msg2); - if (ret) { - dev_err(&spi->dev, "%s: spi_sync failed, err %d\n", - __func__, ret); - goto done; - } - - memcpy(val, rx_buf, val_len); - -done: - return ret; -} - -static struct regmap_bus wcd_spi_regmap_bus = { - .write = wcd_spi_bus_write, - .gather_write = wcd_spi_bus_gwrite, - .read = wcd_spi_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_BIG, -}; - -static int wcd_spi_state_show(struct seq_file *f, void *ptr) -{ - struct spi_device *spi = f->private; - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - const char *clk_state, *clk_mutex, *xfer_mutex; - - if (test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) - clk_state = "enabled"; - else - clk_state = "disabled"; - - clk_mutex = mutex_is_locked(&wcd_spi->clk_mutex) ? - "locked" : "unlocked"; - - xfer_mutex = mutex_is_locked(&wcd_spi->xfer_mutex) ? - "locked" : "unlocked"; - - seq_printf(f, "clk_state = %s\nclk_users = %d\n" - "clk_mutex = %s\nxfer_mutex = %s\n", - clk_state, wcd_spi->clk_users, clk_mutex, - xfer_mutex); - return 0; -} - -static int wcd_spi_state_open(struct inode *inode, struct file *file) -{ - return single_open(file, wcd_spi_state_show, inode->i_private); -} - -static const struct file_operations state_fops = { - .open = wcd_spi_state_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static ssize_t wcd_spi_debugfs_mem_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - struct spi_device *spi = file->private_data; - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_debug_data *dbg_data = &wcd_spi->debug_data; - struct wcd_spi_msg msg; - ssize_t buf_size, read_count = 0; - char *buf; - int ret; - - if (*ppos < 0 || !count) - return -EINVAL; - - if (dbg_data->size == 0 || dbg_data->addr == 0) { - dev_err(&spi->dev, - "%s: Invalid request, size = %u, addr = 0x%x\n", - __func__, dbg_data->size, dbg_data->addr); - return 0; - } - - buf_size = count < dbg_data->size ? count : dbg_data->size; - buf = kzalloc(buf_size, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - msg.data = buf; - msg.remote_addr = dbg_data->addr; - msg.len = buf_size; - msg.flags = 0; - - ret = wcd_spi_data_read(spi, &msg); - if (ret < 0) { - dev_err(&spi->dev, - "%s: Failed to read %zu bytes from addr 0x%x\n", - __func__, buf_size, msg.remote_addr); - goto done; - } - - read_count = simple_read_from_buffer(ubuf, count, ppos, buf, buf_size); - -done: - kfree(buf); - if (ret < 0) - return ret; - else - return read_count; -} - -static const struct file_operations mem_read_fops = { - .open = simple_open, - .read = wcd_spi_debugfs_mem_read, -}; - -static int wcd_spi_debugfs_init(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_debug_data *dbg_data = &wcd_spi->debug_data; - int rc = 0; - - dbg_data->dir = debugfs_create_dir("wcd_spi", NULL); - if (IS_ERR_OR_NULL(dbg_data->dir)) { - dbg_data->dir = NULL; - rc = -ENODEV; - goto done; - } - - debugfs_create_file("state", 0444, dbg_data->dir, spi, &state_fops); - debugfs_create_u32("addr", 0644, dbg_data->dir, - &dbg_data->addr); - debugfs_create_u32("size", 0644, dbg_data->dir, - &dbg_data->size); - - debugfs_create_file("mem_read", 0444, dbg_data->dir, - spi, &mem_read_fops); -done: - return rc; -} - - -static const struct reg_default wcd_spi_defaults[] = { - {WCD_SPI_SLAVE_SANITY, 0xDEADBEEF}, - {WCD_SPI_SLAVE_DEVICE_ID, 0x00500000}, - {WCD_SPI_SLAVE_STATUS, 0x80100000}, - {WCD_SPI_SLAVE_CONFIG, 0x0F200808}, - {WCD_SPI_SLAVE_SW_RESET, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_STATUS, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_EN, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_CLR, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_FORCE, 0x00000000}, - {WCD_SPI_SLAVE_TX, 0x00000000}, - {WCD_SPI_SLAVE_TEST_BUS_DATA, 0x00000000}, - {WCD_SPI_SLAVE_TEST_BUS_CTRL, 0x00000000}, - {WCD_SPI_SLAVE_SW_RST_IRQ, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_CFG, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_DATA_MOSI, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_DATA_CS_N, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_DATA_MISO, 0x00000000}, - {WCD_SPI_SLAVE_TRNS_BYTE_CNT, 0x00000000}, - {WCD_SPI_SLAVE_TRNS_LEN, 0x00000000}, - {WCD_SPI_SLAVE_FIFO_LEVEL, 0x00000000}, - {WCD_SPI_SLAVE_GENERICS, 0x80000000}, - {WCD_SPI_SLAVE_EXT_BASE_ADDR, 0x00000000}, -}; - -static bool wcd_spi_is_volatile_reg(struct device *dev, - unsigned int reg) -{ - switch (reg) { - case WCD_SPI_SLAVE_SANITY: - case WCD_SPI_SLAVE_STATUS: - case WCD_SPI_SLAVE_IRQ_STATUS: - case WCD_SPI_SLAVE_TX: - case WCD_SPI_SLAVE_SW_RST_IRQ: - case WCD_SPI_SLAVE_TRNS_BYTE_CNT: - case WCD_SPI_SLAVE_FIFO_LEVEL: - case WCD_SPI_SLAVE_GENERICS: - return true; - } - - return false; -} - -static bool wcd_spi_is_readable_reg(struct device *dev, - unsigned int reg) -{ - switch (reg) { - case WCD_SPI_SLAVE_SW_RESET: - case WCD_SPI_SLAVE_IRQ_CLR: - case WCD_SPI_SLAVE_IRQ_FORCE: - return false; - } - - return true; -} - -static struct regmap_config wcd_spi_regmap_cfg = { - .reg_bits = 8, - .val_bits = 32, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd_spi_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd_spi_defaults), - .max_register = WCD_SPI_MAX_REGISTER, - .volatile_reg = wcd_spi_is_volatile_reg, - .readable_reg = wcd_spi_is_readable_reg, -}; - -static int wcd_spi_add_ac_dev(struct device *dev, - struct device_node *node) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct platform_device *pdev; - int ret = 0; - - pdev = platform_device_alloc("wcd-spi-ac", -1); - if (IS_ERR_OR_NULL(pdev)) { - ret = PTR_ERR(pdev); - dev_err(dev, "%s: pdev alloc failed, ret = %d\n", - __func__, ret); - return ret; - } - - pdev->dev.parent = dev; - pdev->dev.of_node = node; - - ret = platform_device_add(pdev); - if (ret) { - dev_err(dev, "%s: pdev add failed, ret = %d\n", - __func__, ret); - goto dealloc_pdev; - } - - wcd_spi->ac_dev = &pdev->dev; - return 0; - -dealloc_pdev: - platform_device_put(pdev); - return ret; -} - -static int wdsp_spi_init(struct device *dev, void *priv_data) -{ - struct spi_device *spi = to_spi_device(dev); - int ret; - struct device_node *node; - - for_each_child_of_node(dev->of_node, node) { - if (!strcmp(node->name, "wcd_spi_ac")) - wcd_spi_add_ac_dev(dev, node); - } - - ret = wcd_spi_init(spi); - if (ret < 0) - dev_err(&spi->dev, "%s: Init failed, err = %d\n", - __func__, ret); - return ret; -} - -static int wdsp_spi_deinit(struct device *dev, void *priv_data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - /* - * Deinit means the hardware is reset. Mark the cache - * as dirty here, so init will sync the cache - */ - regcache_mark_dirty(wcd_spi->regmap); - - return 0; -} - -static struct wdsp_cmpnt_ops wdsp_spi_ops = { - .init = wdsp_spi_init, - .deinit = wdsp_spi_deinit, - .event_handler = wdsp_spi_event_handler, -}; - -static int wcd_spi_component_bind(struct device *dev, - struct device *master, - void *data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret = 0; - - wcd_spi->m_dev = master; - wcd_spi->m_ops = data; - - if (wcd_spi->m_ops && - wcd_spi->m_ops->register_cmpnt_ops) - ret = wcd_spi->m_ops->register_cmpnt_ops(master, dev, - wcd_spi, - &wdsp_spi_ops); - if (ret) { - dev_err(dev, "%s: register_cmpnt_ops failed, err = %d\n", - __func__, ret); - goto done; - } - - wcd_spi->reg_bytes = DIV_ROUND_UP(wcd_spi_regmap_cfg.reg_bits, 8); - wcd_spi->val_bytes = DIV_ROUND_UP(wcd_spi_regmap_cfg.val_bits, 8); - - wcd_spi->regmap = devm_regmap_init(&spi->dev, &wcd_spi_regmap_bus, - &spi->dev, &wcd_spi_regmap_cfg); - if (IS_ERR(wcd_spi->regmap)) { - ret = PTR_ERR(wcd_spi->regmap); - dev_err(&spi->dev, "%s: Failed to allocate regmap, err = %d\n", - __func__, ret); - goto done; - } - - if (wcd_spi_debugfs_init(spi)) - dev_err(&spi->dev, "%s: Failed debugfs init\n", __func__); - - spi_message_init(&wcd_spi->msg1); - spi_message_add_tail(&wcd_spi->xfer1, &wcd_spi->msg1); - - spi_message_init(&wcd_spi->msg2); - spi_message_add_tail(&wcd_spi->xfer2[0], &wcd_spi->msg2); - spi_message_add_tail(&wcd_spi->xfer2[1], &wcd_spi->msg2); - - /* Pre-allocate the buffers */ - wcd_spi->tx_buf = dma_zalloc_coherent(&spi->dev, - WCD_SPI_RW_MAX_BUF_SIZE, - &wcd_spi->tx_dma, GFP_KERNEL); - if (!wcd_spi->tx_buf) { - ret = -ENOMEM; - goto done; - } - - wcd_spi->rx_buf = dma_zalloc_coherent(&spi->dev, - WCD_SPI_RW_MAX_BUF_SIZE, - &wcd_spi->rx_dma, GFP_KERNEL); - if (!wcd_spi->rx_buf) { - dma_free_coherent(&spi->dev, WCD_SPI_RW_MAX_BUF_SIZE, - wcd_spi->tx_buf, wcd_spi->tx_dma); - wcd_spi->tx_buf = NULL; - ret = -ENOMEM; - goto done; - } -done: - return ret; -} - -static void wcd_spi_component_unbind(struct device *dev, - struct device *master, - void *data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_debug_data *dbg_data = &wcd_spi->debug_data; - - debugfs_remove_recursive(dbg_data->dir); - dbg_data->dir = NULL; - - wcd_spi->m_dev = NULL; - wcd_spi->m_ops = NULL; - - spi_transfer_del(&wcd_spi->xfer1); - spi_transfer_del(&wcd_spi->xfer2[0]); - spi_transfer_del(&wcd_spi->xfer2[1]); - - dma_free_coherent(&spi->dev, WCD_SPI_RW_MAX_BUF_SIZE, - wcd_spi->tx_buf, wcd_spi->tx_dma); - dma_free_coherent(&spi->dev, WCD_SPI_RW_MAX_BUF_SIZE, - wcd_spi->rx_buf, wcd_spi->rx_dma); - wcd_spi->tx_buf = NULL; - wcd_spi->rx_buf = NULL; -} - -static const struct component_ops wcd_spi_component_ops = { - .bind = wcd_spi_component_bind, - .unbind = wcd_spi_component_unbind, -}; - -static int wcd_spi_probe(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi; - int ret = 0; - - wcd_spi = devm_kzalloc(&spi->dev, sizeof(*wcd_spi), - GFP_KERNEL); - if (!wcd_spi) - return -ENOMEM; - - ret = of_property_read_u32(spi->dev.of_node, - "qcom,mem-base-addr", - &wcd_spi->mem_base_addr); - if (ret < 0) { - dev_err(&spi->dev, "%s: Missing %s DT entry", - __func__, "qcom,mem-base-addr"); - goto err_ret; - } - - dev_dbg(&spi->dev, - "%s: mem_base_addr 0x%x\n", __func__, wcd_spi->mem_base_addr); - - mutex_init(&wcd_spi->clk_mutex); - mutex_init(&wcd_spi->xfer_mutex); - INIT_DELAYED_WORK(&wcd_spi->clk_dwork, wcd_spi_clk_work); - init_completion(&wcd_spi->resume_comp); - arch_setup_dma_ops(&spi->dev, 0, 0, NULL, true); - - wcd_spi->spi = spi; - spi_set_drvdata(spi, wcd_spi); - - ret = component_add(&spi->dev, &wcd_spi_component_ops); - if (ret) { - dev_err(&spi->dev, "%s: component_add failed err = %d\n", - __func__, ret); - goto err_component_add; - } - - return ret; - -err_component_add: - mutex_destroy(&wcd_spi->clk_mutex); - mutex_destroy(&wcd_spi->xfer_mutex); -err_ret: - devm_kfree(&spi->dev, wcd_spi); - spi_set_drvdata(spi, NULL); - return ret; -} - -static int wcd_spi_remove(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - component_del(&spi->dev, &wcd_spi_component_ops); - - mutex_destroy(&wcd_spi->clk_mutex); - mutex_destroy(&wcd_spi->xfer_mutex); - - devm_kfree(&spi->dev, wcd_spi); - spi_set_drvdata(spi, NULL); - - return 0; -} - -#ifdef CONFIG_PM -static int wcd_spi_suspend(struct device *dev) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int rc = 0; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (!wcd_spi_can_suspend(wcd_spi)) { - rc = -EBUSY; - goto done; - } - - /* - * If we are here, it is okay to let the suspend go - * through for this driver. But, still need to notify - * the master to make sure all other components can suspend - * as well. - */ - if (wcd_spi->m_dev && wcd_spi->m_ops && - wcd_spi->m_ops->suspend) { - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - rc = wcd_spi->m_ops->suspend(wcd_spi->m_dev); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - } - - if (rc == 0) - set_bit(WCD_SPI_IS_SUSPENDED, &wcd_spi->status_mask); - else - dev_dbg(&spi->dev, "%s: cannot suspend, err = %d\n", - __func__, rc); -done: - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - return rc; -} - -static int wcd_spi_resume(struct device *dev) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - clear_bit(WCD_SPI_IS_SUSPENDED, &wcd_spi->status_mask); - complete(&wcd_spi->resume_comp); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - - return 0; -} - -static const struct dev_pm_ops wcd_spi_pm_ops = { - .suspend = wcd_spi_suspend, - .resume = wcd_spi_resume, -}; -#endif - -static const struct of_device_id wcd_spi_of_match[] = { - { .compatible = "qcom,wcd-spi-v2", }, - { } -}; -MODULE_DEVICE_TABLE(of, wcd_spi_of_match); - -static struct spi_driver wcd_spi_driver = { - .driver = { - .name = "wcd-spi-v2", - .of_match_table = wcd_spi_of_match, -#ifdef CONFIG_PM - .pm = &wcd_spi_pm_ops, -#endif - }, - .probe = wcd_spi_probe, - .remove = wcd_spi_remove, -}; - -module_spi_driver(wcd_spi_driver); - -MODULE_DESCRIPTION("WCD SPI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9335_registers.h b/techpack/audio/4.0/asoc/codecs/wcd9335_registers.h deleted file mode 100644 index 19a942c2a6be..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9335_registers.h +++ /dev/null @@ -1,1340 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD9335_REGISTERS_H -#define _WCD9335_REGISTERS_H - -#define WCD9335_PAGE_SIZE 256 -#define WCD9335_NUM_PAGES 256 - -extern const u8 *wcd9335_reg[WCD9335_NUM_PAGES]; - -enum { - PAGE_0 = 0, - PAGE_1, - PAGE_2, - PAGE_6 = 6, - PAGE_10 = 0xA, - PAGE_11, - PAGE_12, - PAGE_13, - PAGE_0X80, -}; - -/* Page-0 Registers */ -#define WCD9335_PAGE0_PAGE_REGISTER 0x0000 -#define WCD9335_CODEC_RPM_CLK_BYPASS 0x0001 -#define WCD9335_CODEC_RPM_CLK_GATE 0x0002 -#define WCD9335_CODEC_RPM_CLK_MCLK_CFG 0x0003 -#define WCD9335_CODEC_RPM_RST_CTL 0x0009 -#define WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL 0x0011 -#define WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_1 0x0012 -#define WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_2 0x0013 -#define WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_3 0x0014 -#define WCD9335_CODEC_RPM_PWR_CPE_IRAM_SHUTDOWN 0x0015 -#define WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN 0x0016 -#define WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_1 0x0017 -#define WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_2 0x0018 -#define WCD9335_CODEC_RPM_INT_MASK 0x001d -#define WCD9335_CODEC_RPM_INT_STATUS 0x001e -#define WCD9335_CODEC_RPM_INT_CLEAR 0x001f -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0 0x0021 -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE1 0x0022 -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE2 0x0023 -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE3 0x0024 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_CTL 0x0025 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_TEST0 0x0026 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_TEST1 0x0027 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0 0x0029 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 0x002a -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 0x002b -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT3 0x002c -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT4 0x002d -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT5 0x002e -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT6 0x002f -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT7 0x0030 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT8 0x0031 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT9 0x0032 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT10 0x0033 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT11 0x0034 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT12 0x0035 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT13 0x0036 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT14 0x0037 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT15 0x0038 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS 0x0039 -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO 0x003a -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_1 0x003b -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_2 0x003c -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_3 0x003d -#define WCD9335_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL 0x003e -#define WCD9335_CHIP_TIER_CTRL_I2C_ACTIVE 0x003f -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_CTL 0x0041 -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_STATUS 0x0042 -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_MSB 0x0043 -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_LSB 0x0044 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_CTL 0x0045 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_STATUS 0x0046 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_MSB 0x0047 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_LSB 0x0048 -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_CTL 0x0049 -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_STATUS 0x004a -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_MSB 0x004b -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_LSB 0x004c -#define WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL 0x0051 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL 0x0052 -#define WCD9335_DATA_HUB_DATA_HUB_I2S_CLK 0x0053 -#define WCD9335_DATA_HUB_DATA_HUB_RX0_INP_CFG 0x0054 -#define WCD9335_DATA_HUB_DATA_HUB_RX1_INP_CFG 0x0055 -#define WCD9335_DATA_HUB_DATA_HUB_RX2_INP_CFG 0x0056 -#define WCD9335_DATA_HUB_DATA_HUB_RX3_INP_CFG 0x0057 -#define WCD9335_DATA_HUB_DATA_HUB_RX4_INP_CFG 0x0058 -#define WCD9335_DATA_HUB_DATA_HUB_RX5_INP_CFG 0x0059 -#define WCD9335_DATA_HUB_DATA_HUB_RX6_INP_CFG 0x005a -#define WCD9335_DATA_HUB_DATA_HUB_RX7_INP_CFG 0x005b -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX0_INP_CFG 0x0061 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX1_INP_CFG 0x0062 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX2_INP_CFG 0x0063 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX3_INP_CFG 0x0064 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX4_INP_CFG 0x0065 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX5_INP_CFG 0x0066 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX6_INP_CFG 0x0067 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX7_INP_CFG 0x0068 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX8_INP_CFG 0x0069 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX9_INP_CFG 0x006a -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX10_INP_CFG 0x006b -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX11_INP_CFG 0x006c -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX13_INP_CFG 0x006e -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX14_INP_CFG 0x006f -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX15_INP_CFG 0x0070 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_L_CFG 0x0071 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_R_CFG 0x0072 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_L_CFG 0x0073 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_R_CFG 0x0074 -#define WCD9335_DATA_HUB_NATIVE_FIFO_SYNC 0x0075 -#define WCD9335_DATA_HUB_NATIVE_FIFO_STATUS 0x007D -#define WCD9335_INTR_CFG 0x0081 -#define WCD9335_INTR_CLR_COMMIT 0x0082 -#define WCD9335_INTR_PIN1_MASK0 0x0089 -#define WCD9335_INTR_PIN1_MASK1 0x008a -#define WCD9335_INTR_PIN1_MASK2 0x008b -#define WCD9335_INTR_PIN1_MASK3 0x008c -#define WCD9335_INTR_PIN1_STATUS0 0x0091 -#define WCD9335_INTR_PIN1_STATUS1 0x0092 -#define WCD9335_INTR_PIN1_STATUS2 0x0093 -#define WCD9335_INTR_PIN1_STATUS3 0x0094 -#define WCD9335_INTR_PIN1_CLEAR0 0x0099 -#define WCD9335_INTR_PIN1_CLEAR1 0x009a -#define WCD9335_INTR_PIN1_CLEAR2 0x009b -#define WCD9335_INTR_PIN1_CLEAR3 0x009c -#define WCD9335_INTR_PIN2_MASK0 0x00a1 -#define WCD9335_INTR_PIN2_MASK1 0x00a2 -#define WCD9335_INTR_PIN2_MASK2 0x00a3 -#define WCD9335_INTR_PIN2_MASK3 0x00a4 -#define WCD9335_INTR_PIN2_STATUS0 0x00a9 -#define WCD9335_INTR_PIN2_STATUS1 0x00aa -#define WCD9335_INTR_PIN2_STATUS2 0x00ab -#define WCD9335_INTR_PIN2_STATUS3 0x00ac -#define WCD9335_INTR_PIN2_CLEAR0 0x00b1 -#define WCD9335_INTR_PIN2_CLEAR1 0x00b2 -#define WCD9335_INTR_PIN2_CLEAR2 0x00b3 -#define WCD9335_INTR_PIN2_CLEAR3 0x00b4 -#define WCD9335_INTR_LEVEL0 0x00e1 -#define WCD9335_INTR_LEVEL1 0x00e2 -#define WCD9335_INTR_LEVEL2 0x00e3 -#define WCD9335_INTR_LEVEL3 0x00e4 -#define WCD9335_INTR_BYPASS0 0x00e9 -#define WCD9335_INTR_BYPASS1 0x00ea -#define WCD9335_INTR_BYPASS2 0x00eb -#define WCD9335_INTR_BYPASS3 0x00ec -#define WCD9335_INTR_SET0 0x00f1 -#define WCD9335_INTR_SET1 0x00f2 -#define WCD9335_INTR_SET2 0x00f3 -#define WCD9335_INTR_SET3 0x00f4 - -/* Page-1 Registers */ -#define WCD9335_PAGE1_PAGE_REGISTER 0x0100 -#define WCD9335_CPE_FLL_USER_CTL_0 0x0101 -#define WCD9335_CPE_FLL_USER_CTL_1 0x0102 -#define WCD9335_CPE_FLL_USER_CTL_2 0x0103 -#define WCD9335_CPE_FLL_USER_CTL_3 0x0104 -#define WCD9335_CPE_FLL_USER_CTL_4 0x0105 -#define WCD9335_CPE_FLL_USER_CTL_5 0x0106 -#define WCD9335_CPE_FLL_USER_CTL_6 0x0107 -#define WCD9335_CPE_FLL_USER_CTL_7 0x0108 -#define WCD9335_CPE_FLL_USER_CTL_8 0x0109 -#define WCD9335_CPE_FLL_USER_CTL_9 0x010a -#define WCD9335_CPE_FLL_L_VAL_CTL_0 0x010b -#define WCD9335_CPE_FLL_L_VAL_CTL_1 0x010c -#define WCD9335_CPE_FLL_DSM_FRAC_CTL_0 0x010d -#define WCD9335_CPE_FLL_DSM_FRAC_CTL_1 0x010e -#define WCD9335_CPE_FLL_CONFIG_CTL_0 0x010f -#define WCD9335_CPE_FLL_CONFIG_CTL_1 0x0110 -#define WCD9335_CPE_FLL_CONFIG_CTL_2 0x0111 -#define WCD9335_CPE_FLL_CONFIG_CTL_3 0x0112 -#define WCD9335_CPE_FLL_CONFIG_CTL_4 0x0113 -#define WCD9335_CPE_FLL_TEST_CTL_0 0x0114 -#define WCD9335_CPE_FLL_TEST_CTL_1 0x0115 -#define WCD9335_CPE_FLL_TEST_CTL_2 0x0116 -#define WCD9335_CPE_FLL_TEST_CTL_3 0x0117 -#define WCD9335_CPE_FLL_TEST_CTL_4 0x0118 -#define WCD9335_CPE_FLL_TEST_CTL_5 0x0119 -#define WCD9335_CPE_FLL_TEST_CTL_6 0x011a -#define WCD9335_CPE_FLL_TEST_CTL_7 0x011b -#define WCD9335_CPE_FLL_FREQ_CTL_0 0x011c -#define WCD9335_CPE_FLL_FREQ_CTL_1 0x011d -#define WCD9335_CPE_FLL_FREQ_CTL_2 0x011e -#define WCD9335_CPE_FLL_FREQ_CTL_3 0x011f -#define WCD9335_CPE_FLL_SSC_CTL_0 0x0120 -#define WCD9335_CPE_FLL_SSC_CTL_1 0x0121 -#define WCD9335_CPE_FLL_SSC_CTL_2 0x0122 -#define WCD9335_CPE_FLL_SSC_CTL_3 0x0123 -#define WCD9335_CPE_FLL_FLL_MODE 0x0124 -#define WCD9335_CPE_FLL_STATUS_0 0x0125 -#define WCD9335_CPE_FLL_STATUS_1 0x0126 -#define WCD9335_CPE_FLL_STATUS_2 0x0127 -#define WCD9335_CPE_FLL_STATUS_3 0x0128 -#define WCD9335_I2S_FLL_USER_CTL_0 0x0141 -#define WCD9335_I2S_FLL_USER_CTL_1 0x0142 -#define WCD9335_I2S_FLL_USER_CTL_2 0x0143 -#define WCD9335_I2S_FLL_USER_CTL_3 0x0144 -#define WCD9335_I2S_FLL_USER_CTL_4 0x0145 -#define WCD9335_I2S_FLL_USER_CTL_5 0x0146 -#define WCD9335_I2S_FLL_USER_CTL_6 0x0147 -#define WCD9335_I2S_FLL_USER_CTL_7 0x0148 -#define WCD9335_I2S_FLL_USER_CTL_8 0x0149 -#define WCD9335_I2S_FLL_USER_CTL_9 0x014a -#define WCD9335_I2S_FLL_L_VAL_CTL_0 0x014b -#define WCD9335_I2S_FLL_L_VAL_CTL_1 0x014c -#define WCD9335_I2S_FLL_DSM_FRAC_CTL_0 0x014d -#define WCD9335_I2S_FLL_DSM_FRAC_CTL_1 0x014e -#define WCD9335_I2S_FLL_CONFIG_CTL_0 0x014f -#define WCD9335_I2S_FLL_CONFIG_CTL_1 0x0150 -#define WCD9335_I2S_FLL_CONFIG_CTL_2 0x0151 -#define WCD9335_I2S_FLL_CONFIG_CTL_3 0x0152 -#define WCD9335_I2S_FLL_CONFIG_CTL_4 0x0153 -#define WCD9335_I2S_FLL_TEST_CTL_0 0x0154 -#define WCD9335_I2S_FLL_TEST_CTL_1 0x0155 -#define WCD9335_I2S_FLL_TEST_CTL_2 0x0156 -#define WCD9335_I2S_FLL_TEST_CTL_3 0x0157 -#define WCD9335_I2S_FLL_TEST_CTL_4 0x0158 -#define WCD9335_I2S_FLL_TEST_CTL_5 0x0159 -#define WCD9335_I2S_FLL_TEST_CTL_6 0x015a -#define WCD9335_I2S_FLL_TEST_CTL_7 0x015b -#define WCD9335_I2S_FLL_FREQ_CTL_0 0x015c -#define WCD9335_I2S_FLL_FREQ_CTL_1 0x015d -#define WCD9335_I2S_FLL_FREQ_CTL_2 0x015e -#define WCD9335_I2S_FLL_FREQ_CTL_3 0x015f -#define WCD9335_I2S_FLL_SSC_CTL_0 0x0160 -#define WCD9335_I2S_FLL_SSC_CTL_1 0x0161 -#define WCD9335_I2S_FLL_SSC_CTL_2 0x0162 -#define WCD9335_I2S_FLL_SSC_CTL_3 0x0163 -#define WCD9335_I2S_FLL_FLL_MODE 0x0164 -#define WCD9335_I2S_FLL_STATUS_0 0x0165 -#define WCD9335_I2S_FLL_STATUS_1 0x0166 -#define WCD9335_I2S_FLL_STATUS_2 0x0167 -#define WCD9335_I2S_FLL_STATUS_3 0x0168 -#define WCD9335_SB_FLL_USER_CTL_0 0x0181 -#define WCD9335_SB_FLL_USER_CTL_1 0x0182 -#define WCD9335_SB_FLL_USER_CTL_2 0x0183 -#define WCD9335_SB_FLL_USER_CTL_3 0x0184 -#define WCD9335_SB_FLL_USER_CTL_4 0x0185 -#define WCD9335_SB_FLL_USER_CTL_5 0x0186 -#define WCD9335_SB_FLL_USER_CTL_6 0x0187 -#define WCD9335_SB_FLL_USER_CTL_7 0x0188 -#define WCD9335_SB_FLL_USER_CTL_8 0x0189 -#define WCD9335_SB_FLL_USER_CTL_9 0x018a -#define WCD9335_SB_FLL_L_VAL_CTL_0 0x018b -#define WCD9335_SB_FLL_L_VAL_CTL_1 0x018c -#define WCD9335_SB_FLL_DSM_FRAC_CTL_0 0x018d -#define WCD9335_SB_FLL_DSM_FRAC_CTL_1 0x018e -#define WCD9335_SB_FLL_CONFIG_CTL_0 0x018f -#define WCD9335_SB_FLL_CONFIG_CTL_1 0x0190 -#define WCD9335_SB_FLL_CONFIG_CTL_2 0x0191 -#define WCD9335_SB_FLL_CONFIG_CTL_3 0x0192 -#define WCD9335_SB_FLL_CONFIG_CTL_4 0x0193 -#define WCD9335_SB_FLL_TEST_CTL_0 0x0194 -#define WCD9335_SB_FLL_TEST_CTL_1 0x0195 -#define WCD9335_SB_FLL_TEST_CTL_2 0x0196 -#define WCD9335_SB_FLL_TEST_CTL_3 0x0197 -#define WCD9335_SB_FLL_TEST_CTL_4 0x0198 -#define WCD9335_SB_FLL_TEST_CTL_5 0x0199 -#define WCD9335_SB_FLL_TEST_CTL_6 0x019a -#define WCD9335_SB_FLL_TEST_CTL_7 0x019b -#define WCD9335_SB_FLL_FREQ_CTL_0 0x019c -#define WCD9335_SB_FLL_FREQ_CTL_1 0x019d -#define WCD9335_SB_FLL_FREQ_CTL_2 0x019e -#define WCD9335_SB_FLL_FREQ_CTL_3 0x019f -#define WCD9335_SB_FLL_SSC_CTL_0 0x01a0 -#define WCD9335_SB_FLL_SSC_CTL_1 0x01a1 -#define WCD9335_SB_FLL_SSC_CTL_2 0x01a2 -#define WCD9335_SB_FLL_SSC_CTL_3 0x01a3 -#define WCD9335_SB_FLL_FLL_MODE 0x01a4 -#define WCD9335_SB_FLL_STATUS_0 0x01a5 -#define WCD9335_SB_FLL_STATUS_1 0x01a6 -#define WCD9335_SB_FLL_STATUS_2 0x01a7 -#define WCD9335_SB_FLL_STATUS_3 0x01a8 - -/* Page-2 Registers */ -#define WCD9335_PAGE2_PAGE_REGISTER 0x0200 -#define WCD9335_CPE_SS_MEM_PTR_0 0x0201 -#define WCD9335_CPE_SS_MEM_PTR_1 0x0202 -#define WCD9335_CPE_SS_MEM_PTR_2 0x0203 -#define WCD9335_CPE_SS_MEM_CTRL 0x0205 -#define WCD9335_CPE_SS_MEM_BANK_0 0x0206 -#define WCD9335_CPE_SS_MEM_BANK_1 0x0207 -#define WCD9335_CPE_SS_MEM_BANK_2 0x0208 -#define WCD9335_CPE_SS_MEM_BANK_3 0x0209 -#define WCD9335_CPE_SS_MEM_BANK_4 0x020a -#define WCD9335_CPE_SS_MEM_BANK_5 0x020b -#define WCD9335_CPE_SS_MEM_BANK_6 0x020c -#define WCD9335_CPE_SS_MEM_BANK_7 0x020d -#define WCD9335_CPE_SS_MEM_BANK_8 0x020e -#define WCD9335_CPE_SS_MEM_BANK_9 0x020f -#define WCD9335_CPE_SS_MEM_BANK_10 0x0210 -#define WCD9335_CPE_SS_MEM_BANK_11 0x0211 -#define WCD9335_CPE_SS_MEM_BANK_12 0x0212 -#define WCD9335_CPE_SS_MEM_BANK_13 0x0213 -#define WCD9335_CPE_SS_MEM_BANK_14 0x0214 -#define WCD9335_CPE_SS_MEM_BANK_15 0x0215 -#define WCD9335_CPE_SS_INBOX1_TRG 0x0216 -#define WCD9335_CPE_SS_INBOX2_TRG 0x0217 -#define WCD9335_CPE_SS_INBOX1_0 0x0218 -#define WCD9335_CPE_SS_INBOX1_1 0x0219 -#define WCD9335_CPE_SS_INBOX1_2 0x021a -#define WCD9335_CPE_SS_INBOX1_3 0x021b -#define WCD9335_CPE_SS_INBOX1_4 0x021c -#define WCD9335_CPE_SS_INBOX1_5 0x021d -#define WCD9335_CPE_SS_INBOX1_6 0x021e -#define WCD9335_CPE_SS_INBOX1_7 0x021f -#define WCD9335_CPE_SS_INBOX1_8 0x0220 -#define WCD9335_CPE_SS_INBOX1_9 0x0221 -#define WCD9335_CPE_SS_INBOX1_10 0x0222 -#define WCD9335_CPE_SS_INBOX1_11 0x0223 -#define WCD9335_CPE_SS_INBOX1_12 0x0224 -#define WCD9335_CPE_SS_INBOX1_13 0x0225 -#define WCD9335_CPE_SS_INBOX1_14 0x0226 -#define WCD9335_CPE_SS_INBOX1_15 0x0227 -#define WCD9335_CPE_SS_OUTBOX1_0 0x0228 -#define WCD9335_CPE_SS_OUTBOX1_1 0x0229 -#define WCD9335_CPE_SS_OUTBOX1_2 0x022a -#define WCD9335_CPE_SS_OUTBOX1_3 0x022b -#define WCD9335_CPE_SS_OUTBOX1_4 0x022c -#define WCD9335_CPE_SS_OUTBOX1_5 0x022d -#define WCD9335_CPE_SS_OUTBOX1_6 0x022e -#define WCD9335_CPE_SS_OUTBOX1_7 0x022f -#define WCD9335_CPE_SS_OUTBOX1_8 0x0230 -#define WCD9335_CPE_SS_OUTBOX1_9 0x0231 -#define WCD9335_CPE_SS_OUTBOX1_10 0x0232 -#define WCD9335_CPE_SS_OUTBOX1_11 0x0233 -#define WCD9335_CPE_SS_OUTBOX1_12 0x0234 -#define WCD9335_CPE_SS_OUTBOX1_13 0x0235 -#define WCD9335_CPE_SS_OUTBOX1_14 0x0236 -#define WCD9335_CPE_SS_OUTBOX1_15 0x0237 -#define WCD9335_CPE_SS_INBOX2_0 0x0238 -#define WCD9335_CPE_SS_INBOX2_1 0x0239 -#define WCD9335_CPE_SS_INBOX2_2 0x023a -#define WCD9335_CPE_SS_INBOX2_3 0x023b -#define WCD9335_CPE_SS_INBOX2_4 0x023c -#define WCD9335_CPE_SS_INBOX2_5 0x023d -#define WCD9335_CPE_SS_INBOX2_6 0x023e -#define WCD9335_CPE_SS_INBOX2_7 0x023f -#define WCD9335_CPE_SS_INBOX2_8 0x0240 -#define WCD9335_CPE_SS_INBOX2_9 0x0241 -#define WCD9335_CPE_SS_INBOX2_10 0x0242 -#define WCD9335_CPE_SS_INBOX2_11 0x0243 -#define WCD9335_CPE_SS_INBOX2_12 0x0244 -#define WCD9335_CPE_SS_INBOX2_13 0x0245 -#define WCD9335_CPE_SS_INBOX2_14 0x0246 -#define WCD9335_CPE_SS_INBOX2_15 0x0247 -#define WCD9335_CPE_SS_OUTBOX2_0 0x0248 -#define WCD9335_CPE_SS_OUTBOX2_1 0x0249 -#define WCD9335_CPE_SS_OUTBOX2_2 0x024a -#define WCD9335_CPE_SS_OUTBOX2_3 0x024b -#define WCD9335_CPE_SS_OUTBOX2_4 0x024c -#define WCD9335_CPE_SS_OUTBOX2_5 0x024d -#define WCD9335_CPE_SS_OUTBOX2_6 0x024e -#define WCD9335_CPE_SS_OUTBOX2_7 0x024f -#define WCD9335_CPE_SS_OUTBOX2_8 0x0250 -#define WCD9335_CPE_SS_OUTBOX2_9 0x0251 -#define WCD9335_CPE_SS_OUTBOX2_10 0x0252 -#define WCD9335_CPE_SS_OUTBOX2_11 0x0253 -#define WCD9335_CPE_SS_OUTBOX2_12 0x0254 -#define WCD9335_CPE_SS_OUTBOX2_13 0x0255 -#define WCD9335_CPE_SS_OUTBOX2_14 0x0256 -#define WCD9335_CPE_SS_OUTBOX2_15 0x0257 -#define WCD9335_CPE_SS_OUTBOX1_ACK 0x0258 -#define WCD9335_CPE_SS_OUTBOX2_ACK 0x0259 -#define WCD9335_CPE_SS_EC_BUF_INT_PERIOD 0x025a -#define WCD9335_CPE_SS_US_BUF_INT_PERIOD 0x025b -#define WCD9335_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD 0x025c -#define WCD9335_CPE_SS_CFG 0x025d -#define WCD9335_CPE_SS_US_EC_MUX_CFG 0x025e -#define WCD9335_CPE_SS_MAD_CTL 0x025f -#define WCD9335_CPE_SS_CPAR_CTL 0x0260 -#define WCD9335_CPE_SS_TX_PP_BUF_INT_PERIOD 0x0261 -#define WCD9335_CPE_SS_TX_PP_CFG 0x0262 -#define WCD9335_CPE_SS_DMIC0_CTL 0x0263 -#define WCD9335_CPE_SS_DMIC1_CTL 0x0264 -#define WCD9335_CPE_SS_DMIC2_CTL 0x0265 -#define WCD9335_CPE_SS_DMIC_CFG 0x0266 -#define WCD9335_CPE_SS_SVA_CFG 0x0267 -#define WCD9335_CPE_SS_CPAR_CFG 0x0271 -#define WCD9335_CPE_SS_WDOG_CFG 0x0272 -#define WCD9335_CPE_SS_BACKUP_INT 0x0273 -#define WCD9335_CPE_SS_STATUS 0x0274 -#define WCD9335_CPE_SS_CPE_OCD_CFG 0x0275 -#define WCD9335_CPE_SS_SS_ERROR_INT_MASK 0x0276 -#define WCD9335_CPE_SS_SS_ERROR_INT_STATUS 0x0277 -#define WCD9335_CPE_SS_SS_ERROR_INT_CLEAR 0x0278 -#define WCD9335_SOC_MAD_MAIN_CTL_1 0x0281 -#define WCD9335_SOC_MAD_MAIN_CTL_2 0x0282 -#define WCD9335_SOC_MAD_AUDIO_CTL_1 0x0283 -#define WCD9335_SOC_MAD_AUDIO_CTL_2 0x0284 -#define WCD9335_SOC_MAD_AUDIO_CTL_3 0x0285 -#define WCD9335_SOC_MAD_AUDIO_CTL_4 0x0286 -#define WCD9335_SOC_MAD_AUDIO_CTL_5 0x0287 -#define WCD9335_SOC_MAD_AUDIO_CTL_6 0x0288 -#define WCD9335_SOC_MAD_AUDIO_CTL_7 0x0289 -#define WCD9335_SOC_MAD_AUDIO_CTL_8 0x028a -#define WCD9335_SOC_MAD_AUDIO_IIR_CTL_PTR 0x028b -#define WCD9335_SOC_MAD_AUDIO_IIR_CTL_VAL 0x028c -#define WCD9335_SOC_MAD_ULTR_CTL_1 0x028d -#define WCD9335_SOC_MAD_ULTR_CTL_2 0x028e -#define WCD9335_SOC_MAD_ULTR_CTL_3 0x028f -#define WCD9335_SOC_MAD_ULTR_CTL_4 0x0290 -#define WCD9335_SOC_MAD_ULTR_CTL_5 0x0291 -#define WCD9335_SOC_MAD_ULTR_CTL_6 0x0292 -#define WCD9335_SOC_MAD_ULTR_CTL_7 0x0293 -#define WCD9335_SOC_MAD_BEACON_CTL_1 0x0294 -#define WCD9335_SOC_MAD_BEACON_CTL_2 0x0295 -#define WCD9335_SOC_MAD_BEACON_CTL_3 0x0296 -#define WCD9335_SOC_MAD_BEACON_CTL_4 0x0297 -#define WCD9335_SOC_MAD_BEACON_CTL_5 0x0298 -#define WCD9335_SOC_MAD_BEACON_CTL_6 0x0299 -#define WCD9335_SOC_MAD_BEACON_CTL_7 0x029a -#define WCD9335_SOC_MAD_BEACON_CTL_8 0x029b -#define WCD9335_SOC_MAD_BEACON_IIR_CTL_PTR 0x029c -#define WCD9335_SOC_MAD_BEACON_IIR_CTL_VAL 0x029d -#define WCD9335_SOC_MAD_INP_SEL 0x029e - -/* Page-6 Registers */ -#define WCD9335_PAGE6_PAGE_REGISTER 0x0600 -#define WCD9335_ANA_BIAS 0x0601 -#define WCD9335_ANA_CLK_TOP 0x0602 -#define WCD9335_ANA_RCO 0x0603 -#define WCD9335_ANA_BUCK_VOUT_A 0x0604 -#define WCD9335_ANA_BUCK_VOUT_D 0x0605 -#define WCD9335_ANA_BUCK_CTL 0x0606 -#define WCD9335_ANA_BUCK_STATUS 0x0607 -#define WCD9335_ANA_RX_SUPPLIES 0x0608 -#define WCD9335_ANA_HPH 0x0609 -#define WCD9335_ANA_EAR 0x060a -#define WCD9335_ANA_LO_1_2 0x060b -#define WCD9335_ANA_LO_3_4 0x060c -#define WCD9335_ANA_MAD_SETUP 0x060d -#define WCD9335_ANA_AMIC1 0x060e -#define WCD9335_ANA_AMIC2 0x060f -#define WCD9335_ANA_AMIC3 0x0610 -#define WCD9335_ANA_AMIC4 0x0611 -#define WCD9335_ANA_AMIC5 0x0612 -#define WCD9335_ANA_AMIC6 0x0613 -#define WCD9335_ANA_MBHC_MECH 0x0614 -#define WCD9335_ANA_MBHC_ELECT 0x0615 -#define WCD9335_ANA_MBHC_ZDET 0x0616 -#define WCD9335_ANA_MBHC_RESULT_1 0x0617 -#define WCD9335_ANA_MBHC_RESULT_2 0x0618 -#define WCD9335_ANA_MBHC_RESULT_3 0x0619 -#define WCD9335_ANA_MBHC_BTN0 0x061a -#define WCD9335_ANA_MBHC_BTN1 0x061b -#define WCD9335_ANA_MBHC_BTN2 0x061c -#define WCD9335_ANA_MBHC_BTN3 0x061d -#define WCD9335_ANA_MBHC_BTN4 0x061e -#define WCD9335_ANA_MBHC_BTN5 0x061f -#define WCD9335_ANA_MBHC_BTN6 0x0620 -#define WCD9335_ANA_MBHC_BTN7 0x0621 -#define WCD9335_ANA_MICB1 0x0622 -#define WCD9335_ANA_MICB2 0x0623 -#define WCD9335_ANA_MICB2_RAMP 0x0624 -#define WCD9335_ANA_MICB3 0x0625 -#define WCD9335_ANA_MICB4 0x0626 -#define WCD9335_ANA_VBADC 0x0627 -#define WCD9335_BIAS_CTL 0x0628 -#define WCD9335_BIAS_VBG_FINE_ADJ 0x0629 -#define WCD9335_CLOCK_TEST_CTL 0x062d -#define WCD9335_RCO_CTRL_1 0x062e -#define WCD9335_RCO_CTRL_2 0x062f -#define WCD9335_RCO_CAL 0x0630 -#define WCD9335_RCO_CAL_1 0x0631 -#define WCD9335_RCO_CAL_2 0x0632 -#define WCD9335_RCO_TEST_CTRL 0x0633 -#define WCD9335_RCO_CAL_OUT_1 0x0634 -#define WCD9335_RCO_CAL_OUT_2 0x0635 -#define WCD9335_RCO_CAL_OUT_3 0x0636 -#define WCD9335_RCO_CAL_OUT_4 0x0637 -#define WCD9335_RCO_CAL_OUT_5 0x0638 -#define WCD9335_SIDO_SIDO_MODE_1 0x063a -#define WCD9335_SIDO_SIDO_MODE_2 0x063b -#define WCD9335_SIDO_SIDO_MODE_3 0x063c -#define WCD9335_SIDO_SIDO_MODE_4 0x063d -#define WCD9335_SIDO_SIDO_VCL_1 0x063e -#define WCD9335_SIDO_SIDO_VCL_2 0x063f -#define WCD9335_SIDO_SIDO_VCL_3 0x0640 -#define WCD9335_SIDO_SIDO_CCL_1 0x0641 -#define WCD9335_SIDO_SIDO_CCL_2 0x0642 -#define WCD9335_SIDO_SIDO_CCL_3 0x0643 -#define WCD9335_SIDO_SIDO_CCL_4 0x0644 -#define WCD9335_SIDO_SIDO_CCL_5 0x0645 -#define WCD9335_SIDO_SIDO_CCL_6 0x0646 -#define WCD9335_SIDO_SIDO_CCL_7 0x0647 -#define WCD9335_SIDO_SIDO_CCL_8 0x0648 -#define WCD9335_SIDO_SIDO_CCL_9 0x0649 -#define WCD9335_SIDO_SIDO_CCL_10 0x064a -#define WCD9335_SIDO_SIDO_FILTER_1 0x064b -#define WCD9335_SIDO_SIDO_FILTER_2 0x064c -#define WCD9335_SIDO_SIDO_DRIVER_1 0x064d -#define WCD9335_SIDO_SIDO_DRIVER_2 0x064e -#define WCD9335_SIDO_SIDO_DRIVER_3 0x064f -#define WCD9335_SIDO_SIDO_CAL_CODE_EXT_1 0x0650 -#define WCD9335_SIDO_SIDO_CAL_CODE_EXT_2 0x0651 -#define WCD9335_SIDO_SIDO_CAL_CODE_OUT_1 0x0652 -#define WCD9335_SIDO_SIDO_CAL_CODE_OUT_2 0x0653 -#define WCD9335_SIDO_SIDO_TEST_1 0x0654 -#define WCD9335_SIDO_SIDO_TEST_2 0x0655 -#define WCD9335_MBHC_CTL_1 0x0656 -#define WCD9335_MBHC_CTL_2 0x0657 -#define WCD9335_MBHC_PLUG_DETECT_CTL 0x0658 -#define WCD9335_MBHC_ZDET_ANA_CTL 0x0659 -#define WCD9335_MBHC_ZDET_RAMP_CTL 0x065a -#define WCD9335_MBHC_FSM_DEBUG 0x065b /* v1.x */ -#define WCD9335_MBHC_FSM_STATUS 0x065b /* v2.0 */ -#define WCD9335_MBHC_TEST_CTL 0x065c -#define WCD9335_VBADC_SUBBLOCK_EN 0x065d -#define WCD9335_VBADC_IBIAS_FE 0x065e -#define WCD9335_VBADC_BIAS_ADC 0x065f -#define WCD9335_VBADC_FE_CTRL 0x0660 -#define WCD9335_VBADC_ADC_REF 0x0661 -#define WCD9335_VBADC_ADC_IO 0x0662 -#define WCD9335_VBADC_ADC_SAR 0x0663 -#define WCD9335_VBADC_DEBUG 0x0664 -#define WCD9335_VBADC_ADC_DOUTMSB 0x0665 -#define WCD9335_VBADC_ADC_DOUTLSB 0x0666 -#define WCD9335_LDOH_MODE 0x0667 -#define WCD9335_LDOH_BIAS 0x0668 -#define WCD9335_LDOH_STB_LOADS 0x0669 -#define WCD9335_LDOH_SLOWRAMP 0x066a -#define WCD9335_MICB1_TEST_CTL_1 0x066b -#define WCD9335_MICB1_TEST_CTL_2 0x066c -#define WCD9335_MICB1_TEST_CTL_3 0x066d -#define WCD9335_MICB2_TEST_CTL_1 0x066e -#define WCD9335_MICB2_TEST_CTL_2 0x066f -#define WCD9335_MICB2_TEST_CTL_3 0x0670 -#define WCD9335_MICB3_TEST_CTL_1 0x0671 -#define WCD9335_MICB3_TEST_CTL_2 0x0672 -#define WCD9335_MICB3_TEST_CTL_3 0x0673 -#define WCD9335_MICB4_TEST_CTL_1 0x0674 -#define WCD9335_MICB4_TEST_CTL_2 0x0675 -#define WCD9335_MICB4_TEST_CTL_3 0x0676 -#define WCD9335_TX_COM_ADC_VCM 0x0677 -#define WCD9335_TX_COM_BIAS_ATEST 0x0678 -#define WCD9335_TX_COM_ADC_INT1_IB 0x0679 -#define WCD9335_TX_COM_ADC_INT2_IB 0x067a -#define WCD9335_TX_COM_TXFE_DIV_CTL 0x067b -#define WCD9335_TX_COM_TXFE_DIV_START 0x067c -#define WCD9335_TX_COM_TXFE_DIV_STOP_9P6M 0x067d -#define WCD9335_TX_COM_TXFE_DIV_STOP_12P288M 0x067e -#define WCD9335_TX_1_2_TEST_EN 0x067f -#define WCD9335_TX_1_2_ADC_IB 0x0680 -#define WCD9335_TX_1_2_ATEST_REFCTL 0x0681 -#define WCD9335_TX_1_2_TEST_CTL 0x0682 -#define WCD9335_TX_1_2_TEST_BLK_EN 0x0683 -#define WCD9335_TX_1_2_TXFE_CLKDIV 0x0684 -#define WCD9335_TX_1_2_SAR1_ERR 0x0685 -#define WCD9335_TX_1_2_SAR2_ERR 0x0686 -#define WCD9335_TX_3_4_TEST_EN 0x0687 -#define WCD9335_TX_3_4_ADC_IB 0x0688 -#define WCD9335_TX_3_4_ATEST_REFCTL 0x0689 -#define WCD9335_TX_3_4_TEST_CTL 0x068a -#define WCD9335_TX_3_4_TEST_BLK_EN 0x068b -#define WCD9335_TX_3_4_TXFE_CLKDIV 0x068c -#define WCD9335_TX_3_4_SAR1_ERR 0x068d -#define WCD9335_TX_3_4_SAR2_ERR 0x068e -#define WCD9335_TX_5_6_TEST_EN 0x068f -#define WCD9335_TX_5_6_ADC_IB 0x0690 -#define WCD9335_TX_5_6_ATEST_REFCTL 0x0691 -#define WCD9335_TX_5_6_TEST_CTL 0x0692 -#define WCD9335_TX_5_6_TEST_BLK_EN 0x0693 -#define WCD9335_TX_5_6_TXFE_CLKDIV 0x0694 -#define WCD9335_TX_5_6_SAR1_ERR 0x0695 -#define WCD9335_TX_5_6_SAR2_ERR 0x0696 -#define WCD9335_CLASSH_MODE_1 0x0697 -#define WCD9335_CLASSH_MODE_2 0x0698 -#define WCD9335_CLASSH_MODE_3 0x0699 -#define WCD9335_CLASSH_CTRL_VCL_1 0x069a -#define WCD9335_CLASSH_CTRL_VCL_2 0x069b -#define WCD9335_CLASSH_CTRL_CCL_1 0x069c -#define WCD9335_CLASSH_CTRL_CCL_2 0x069d -#define WCD9335_CLASSH_CTRL_CCL_3 0x069e -#define WCD9335_CLASSH_CTRL_CCL_4 0x069f -#define WCD9335_CLASSH_CTRL_CCL_5 0x06a0 -#define WCD9335_CLASSH_BUCK_TMUX_A_D 0x06a1 -#define WCD9335_CLASSH_BUCK_SW_DRV_CNTL 0x06a2 -#define WCD9335_CLASSH_SPARE 0x06a3 -#define WCD9335_FLYBACK_EN 0x06a4 -#define WCD9335_FLYBACK_VNEG_CTRL_1 0x06a5 -#define WCD9335_FLYBACK_VNEG_CTRL_2 0x06a6 -#define WCD9335_FLYBACK_VNEG_CTRL_3 0x06a7 -#define WCD9335_FLYBACK_VNEG_CTRL_4 0x06a8 -#define WCD9335_FLYBACK_VNEG_CTRL_5 0x06a9 -#define WCD9335_FLYBACK_VNEG_CTRL_6 0x06aa -#define WCD9335_FLYBACK_VNEG_CTRL_7 0x06ab -#define WCD9335_FLYBACK_VNEG_CTRL_8 0x06ac -#define WCD9335_FLYBACK_VNEG_CTRL_9 0x06ad -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_1 0x06ae -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_2 0x06af -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_3 0x06b0 -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_4 0x06b1 /* v1.x */ -#define WCD9335_FLYBACK_CTRL_1 0x06b1 /* v2.0 */ -#define WCD9335_FLYBACK_TEST_CTL 0x06b2 -#define WCD9335_RX_AUX_SW_CTL 0x06b3 -#define WCD9335_RX_PA_AUX_IN_CONN 0x06b4 -#define WCD9335_RX_TIMER_DIV 0x06b5 -#define WCD9335_RX_OCP_CTL 0x06b6 -#define WCD9335_RX_OCP_COUNT 0x06b7 -#define WCD9335_RX_BIAS_EAR_DAC 0x06b8 -#define WCD9335_RX_BIAS_EAR_AMP 0x06b9 -#define WCD9335_RX_BIAS_HPH_LDO 0x06ba -#define WCD9335_RX_BIAS_HPH_PA 0x06bb -#define WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2 0x06bc -#define WCD9335_RX_BIAS_HPH_RDAC_LDO 0x06bd -#define WCD9335_RX_BIAS_HPH_CNP1 0x06be -#define WCD9335_RX_BIAS_HPH_LOWPOWER 0x06bf -#define WCD9335_RX_BIAS_DIFFLO_PA 0x06c0 -#define WCD9335_RX_BIAS_DIFFLO_REF 0x06c1 -#define WCD9335_RX_BIAS_DIFFLO_LDO 0x06c2 -#define WCD9335_RX_BIAS_SELO_DAC_PA 0x06c3 -#define WCD9335_RX_BIAS_BUCK_RST 0x06c4 -#define WCD9335_RX_BIAS_BUCK_VREF_ERRAMP 0x06c5 -#define WCD9335_RX_BIAS_FLYB_ERRAMP 0x06c6 -#define WCD9335_RX_BIAS_FLYB_BUFF 0x06c7 -#define WCD9335_RX_BIAS_FLYB_MID_RST 0x06c8 -#define WCD9335_HPH_L_STATUS 0x06c9 -#define WCD9335_HPH_R_STATUS 0x06ca -#define WCD9335_HPH_CNP_EN 0x06cb -#define WCD9335_HPH_CNP_WG_CTL 0x06cc -#define WCD9335_HPH_CNP_WG_TIME 0x06cd -#define WCD9335_HPH_OCP_CTL 0x06ce -#define WCD9335_HPH_AUTO_CHOP 0x06cf -#define WCD9335_HPH_CHOP_CTL 0x06d0 -#define WCD9335_HPH_PA_CTL1 0x06d1 -#define WCD9335_HPH_PA_CTL2 0x06d2 -#define WCD9335_HPH_L_EN 0x06d3 -#define WCD9335_HPH_L_TEST 0x06d4 -#define WCD9335_HPH_L_ATEST 0x06d5 -#define WCD9335_HPH_R_EN 0x06d6 -#define WCD9335_HPH_R_TEST 0x06d7 -#define WCD9335_HPH_R_ATEST 0x06d8 -#define WCD9335_HPH_RDAC_CLK_CTL1 0x06d9 -#define WCD9335_HPH_RDAC_CLK_CTL2 0x06da -#define WCD9335_HPH_RDAC_LDO_CTL 0x06db -#define WCD9335_HPH_RDAC_CHOP_CLK_LP_CTL 0x06dc -#define WCD9335_HPH_REFBUFF_UHQA_CTL 0x06dd -#define WCD9335_HPH_REFBUFF_LP_CTL 0x06de -#define WCD9335_HPH_L_DAC_CTL 0x06df -#define WCD9335_HPH_R_DAC_CTL 0x06e0 -#define WCD9335_EAR_EN_REG 0x06e1 -#define WCD9335_EAR_CMBUFF 0x06e2 -#define WCD9335_EAR_ICTL 0x06e3 -#define WCD9335_EAR_EN_DBG_CTL 0x06e4 -#define WCD9335_EAR_CNP 0x06e5 -#define WCD9335_EAR_DAC_CTL_ATEST 0x06e6 -#define WCD9335_EAR_STATUS_REG 0x06e7 -#define WCD9335_EAR_OUT_SHORT 0x06e8 -#define WCD9335_DIFF_LO_MISC 0x06e9 -#define WCD9335_DIFF_LO_LO2_COMPANDER 0x06ea -#define WCD9335_DIFF_LO_LO1_COMPANDER 0x06eb -#define WCD9335_DIFF_LO_COMMON 0x06ec -#define WCD9335_DIFF_LO_BYPASS_EN 0x06ed -#define WCD9335_DIFF_LO_CNP 0x06ee -#define WCD9335_DIFF_LO_CORE_OUT_PROG 0x06ef -#define WCD9335_DIFF_LO_LDO_OUT_PROG 0x06f0 -#define WCD9335_DIFF_LO_COM_SWCAP_REFBUF_FREQ 0x06f1 -#define WCD9335_DIFF_LO_COM_PA_FREQ 0x06f2 -#define WCD9335_DIFF_LO_RESERVED_REG 0x06f3 -#define WCD9335_DIFF_LO_LO1_STATUS_1 0x06f4 -#define WCD9335_DIFF_LO_LO1_STATUS_2 0x06f5 -#define WCD9335_SE_LO_COM1 0x06f6 -#define WCD9335_SE_LO_COM2 0x06f7 -#define WCD9335_SE_LO_LO3_GAIN 0x06f8 -#define WCD9335_SE_LO_LO3_CTRL 0x06f9 -#define WCD9335_SE_LO_LO4_GAIN 0x06fa -#define WCD9335_SE_LO_LO4_CTRL 0x06fb -#define WCD9335_SE_LO_LO3_STATUS 0x06fe -#define WCD9335_SE_LO_LO4_STATUS 0x06ff - -/* Page-10 Registers */ -#define WCD9335_PAGE10_PAGE_REGISTER 0x0a00 -#define WCD9335_CDC_ANC0_CLK_RESET_CTL 0x0a01 -#define WCD9335_CDC_ANC0_MODE_1_CTL 0x0a02 -#define WCD9335_CDC_ANC0_MODE_2_CTL 0x0a03 -#define WCD9335_CDC_ANC0_FF_SHIFT 0x0a04 -#define WCD9335_CDC_ANC0_FB_SHIFT 0x0a05 -#define WCD9335_CDC_ANC0_LPF_FF_A_CTL 0x0a06 -#define WCD9335_CDC_ANC0_LPF_FF_B_CTL 0x0a07 -#define WCD9335_CDC_ANC0_LPF_FB_CTL 0x0a08 -#define WCD9335_CDC_ANC0_SMLPF_CTL 0x0a09 -#define WCD9335_CDC_ANC0_DCFLT_SHIFT_CTL 0x0a0a -#define WCD9335_CDC_ANC0_IIR_ADAPT_CTL 0x0a0b -#define WCD9335_CDC_ANC0_IIR_COEFF_1_CTL 0x0a0c -#define WCD9335_CDC_ANC0_IIR_COEFF_2_CTL 0x0a0d -#define WCD9335_CDC_ANC0_FF_A_GAIN_CTL 0x0a0e -#define WCD9335_CDC_ANC0_FF_B_GAIN_CTL 0x0a0f -#define WCD9335_CDC_ANC0_FB_GAIN_CTL 0x0a10 -#define WCD9335_CDC_ANC1_CLK_RESET_CTL 0x0a19 -#define WCD9335_CDC_ANC1_MODE_1_CTL 0x0a1a -#define WCD9335_CDC_ANC1_MODE_2_CTL 0x0a1b -#define WCD9335_CDC_ANC1_FF_SHIFT 0x0a1c -#define WCD9335_CDC_ANC1_FB_SHIFT 0x0a1d -#define WCD9335_CDC_ANC1_LPF_FF_A_CTL 0x0a1e -#define WCD9335_CDC_ANC1_LPF_FF_B_CTL 0x0a1f -#define WCD9335_CDC_ANC1_LPF_FB_CTL 0x0a20 -#define WCD9335_CDC_ANC1_SMLPF_CTL 0x0a21 -#define WCD9335_CDC_ANC1_DCFLT_SHIFT_CTL 0x0a22 -#define WCD9335_CDC_ANC1_IIR_ADAPT_CTL 0x0a23 -#define WCD9335_CDC_ANC1_IIR_COEFF_1_CTL 0x0a24 -#define WCD9335_CDC_ANC1_IIR_COEFF_2_CTL 0x0a25 -#define WCD9335_CDC_ANC1_FF_A_GAIN_CTL 0x0a26 -#define WCD9335_CDC_ANC1_FF_B_GAIN_CTL 0x0a27 -#define WCD9335_CDC_ANC1_FB_GAIN_CTL 0x0a28 -#define WCD9335_CDC_TX0_TX_PATH_CTL 0x0a31 -#define WCD9335_CDC_TX0_TX_PATH_CFG0 0x0a32 -#define WCD9335_CDC_TX0_TX_PATH_CFG1 0x0a33 -#define WCD9335_CDC_TX0_TX_VOL_CTL 0x0a34 -#define WCD9335_CDC_TX0_TX_PATH_192_CTL 0x0a35 -#define WCD9335_CDC_TX0_TX_PATH_192_CFG 0x0a36 -#define WCD9335_CDC_TX0_TX_PATH_SEC0 0x0a37 -#define WCD9335_CDC_TX0_TX_PATH_SEC1 0x0a38 -#define WCD9335_CDC_TX0_TX_PATH_SEC2 0x0a39 -#define WCD9335_CDC_TX0_TX_PATH_SEC3 0x0a3a -#define WCD9335_CDC_TX0_TX_PATH_SEC4 0x0a3b -#define WCD9335_CDC_TX0_TX_PATH_SEC5 0x0a3c -#define WCD9335_CDC_TX0_TX_PATH_SEC6 0x0a3d -#define WCD9335_CDC_TX0_TX_PATH_SEC7 0x0a3e -#define WCD9335_CDC_TX1_TX_PATH_CTL 0x0a41 -#define WCD9335_CDC_TX1_TX_PATH_CFG0 0x0a42 -#define WCD9335_CDC_TX1_TX_PATH_CFG1 0x0a43 -#define WCD9335_CDC_TX1_TX_VOL_CTL 0x0a44 -#define WCD9335_CDC_TX1_TX_PATH_192_CTL 0x0a45 -#define WCD9335_CDC_TX1_TX_PATH_192_CFG 0x0a46 -#define WCD9335_CDC_TX1_TX_PATH_SEC0 0x0a47 -#define WCD9335_CDC_TX1_TX_PATH_SEC1 0x0a48 -#define WCD9335_CDC_TX1_TX_PATH_SEC2 0x0a49 -#define WCD9335_CDC_TX1_TX_PATH_SEC3 0x0a4a -#define WCD9335_CDC_TX1_TX_PATH_SEC4 0x0a4b -#define WCD9335_CDC_TX1_TX_PATH_SEC5 0x0a4c -#define WCD9335_CDC_TX1_TX_PATH_SEC6 0x0a4d -#define WCD9335_CDC_TX2_TX_PATH_CTL 0x0a51 -#define WCD9335_CDC_TX2_TX_PATH_CFG0 0x0a52 -#define WCD9335_CDC_TX2_TX_PATH_CFG1 0x0a53 -#define WCD9335_CDC_TX2_TX_VOL_CTL 0x0a54 -#define WCD9335_CDC_TX2_TX_PATH_192_CTL 0x0a55 -#define WCD9335_CDC_TX2_TX_PATH_192_CFG 0x0a56 -#define WCD9335_CDC_TX2_TX_PATH_SEC0 0x0a57 -#define WCD9335_CDC_TX2_TX_PATH_SEC1 0x0a58 -#define WCD9335_CDC_TX2_TX_PATH_SEC2 0x0a59 -#define WCD9335_CDC_TX2_TX_PATH_SEC3 0x0a5a -#define WCD9335_CDC_TX2_TX_PATH_SEC4 0x0a5b -#define WCD9335_CDC_TX2_TX_PATH_SEC5 0x0a5c -#define WCD9335_CDC_TX2_TX_PATH_SEC6 0x0a5d -#define WCD9335_CDC_TX3_TX_PATH_CTL 0x0a61 -#define WCD9335_CDC_TX3_TX_PATH_CFG0 0x0a62 -#define WCD9335_CDC_TX3_TX_PATH_CFG1 0x0a63 -#define WCD9335_CDC_TX3_TX_VOL_CTL 0x0a64 -#define WCD9335_CDC_TX3_TX_PATH_192_CTL 0x0a65 -#define WCD9335_CDC_TX3_TX_PATH_192_CFG 0x0a66 -#define WCD9335_CDC_TX3_TX_PATH_SEC0 0x0a67 -#define WCD9335_CDC_TX3_TX_PATH_SEC1 0x0a68 -#define WCD9335_CDC_TX3_TX_PATH_SEC2 0x0a69 -#define WCD9335_CDC_TX3_TX_PATH_SEC3 0x0a6a -#define WCD9335_CDC_TX3_TX_PATH_SEC4 0x0a6b -#define WCD9335_CDC_TX3_TX_PATH_SEC5 0x0a6c -#define WCD9335_CDC_TX3_TX_PATH_SEC6 0x0a6d -#define WCD9335_CDC_TX4_TX_PATH_CTL 0x0a71 -#define WCD9335_CDC_TX4_TX_PATH_CFG0 0x0a72 -#define WCD9335_CDC_TX4_TX_PATH_CFG1 0x0a73 -#define WCD9335_CDC_TX4_TX_VOL_CTL 0x0a74 -#define WCD9335_CDC_TX4_TX_PATH_192_CTL 0x0a75 -#define WCD9335_CDC_TX4_TX_PATH_192_CFG 0x0a76 -#define WCD9335_CDC_TX4_TX_PATH_SEC0 0x0a77 -#define WCD9335_CDC_TX4_TX_PATH_SEC1 0x0a78 -#define WCD9335_CDC_TX4_TX_PATH_SEC2 0x0a79 -#define WCD9335_CDC_TX4_TX_PATH_SEC3 0x0a7a -#define WCD9335_CDC_TX4_TX_PATH_SEC4 0x0a7b -#define WCD9335_CDC_TX4_TX_PATH_SEC5 0x0a7c -#define WCD9335_CDC_TX4_TX_PATH_SEC6 0x0a7d -#define WCD9335_CDC_TX5_TX_PATH_CTL 0x0a81 -#define WCD9335_CDC_TX5_TX_PATH_CFG0 0x0a82 -#define WCD9335_CDC_TX5_TX_PATH_CFG1 0x0a83 -#define WCD9335_CDC_TX5_TX_VOL_CTL 0x0a84 -#define WCD9335_CDC_TX5_TX_PATH_192_CTL 0x0a85 -#define WCD9335_CDC_TX5_TX_PATH_192_CFG 0x0a86 -#define WCD9335_CDC_TX5_TX_PATH_SEC0 0x0a87 -#define WCD9335_CDC_TX5_TX_PATH_SEC1 0x0a88 -#define WCD9335_CDC_TX5_TX_PATH_SEC2 0x0a89 -#define WCD9335_CDC_TX5_TX_PATH_SEC3 0x0a8a -#define WCD9335_CDC_TX5_TX_PATH_SEC4 0x0a8b -#define WCD9335_CDC_TX5_TX_PATH_SEC5 0x0a8c -#define WCD9335_CDC_TX5_TX_PATH_SEC6 0x0a8d -#define WCD9335_CDC_TX6_TX_PATH_CTL 0x0a91 -#define WCD9335_CDC_TX6_TX_PATH_CFG0 0x0a92 -#define WCD9335_CDC_TX6_TX_PATH_CFG1 0x0a93 -#define WCD9335_CDC_TX6_TX_VOL_CTL 0x0a94 -#define WCD9335_CDC_TX6_TX_PATH_192_CTL 0x0a95 -#define WCD9335_CDC_TX6_TX_PATH_192_CFG 0x0a96 -#define WCD9335_CDC_TX6_TX_PATH_SEC0 0x0a97 -#define WCD9335_CDC_TX6_TX_PATH_SEC1 0x0a98 -#define WCD9335_CDC_TX6_TX_PATH_SEC2 0x0a99 -#define WCD9335_CDC_TX6_TX_PATH_SEC3 0x0a9a -#define WCD9335_CDC_TX6_TX_PATH_SEC4 0x0a9b -#define WCD9335_CDC_TX6_TX_PATH_SEC5 0x0a9c -#define WCD9335_CDC_TX6_TX_PATH_SEC6 0x0a9d -#define WCD9335_CDC_TX7_TX_PATH_CTL 0x0aa1 -#define WCD9335_CDC_TX7_TX_PATH_CFG0 0x0aa2 -#define WCD9335_CDC_TX7_TX_PATH_CFG1 0x0aa3 -#define WCD9335_CDC_TX7_TX_VOL_CTL 0x0aa4 -#define WCD9335_CDC_TX7_TX_PATH_192_CTL 0x0aa5 -#define WCD9335_CDC_TX7_TX_PATH_192_CFG 0x0aa6 -#define WCD9335_CDC_TX7_TX_PATH_SEC0 0x0aa7 -#define WCD9335_CDC_TX7_TX_PATH_SEC1 0x0aa8 -#define WCD9335_CDC_TX7_TX_PATH_SEC2 0x0aa9 -#define WCD9335_CDC_TX7_TX_PATH_SEC3 0x0aaa -#define WCD9335_CDC_TX7_TX_PATH_SEC4 0x0aab -#define WCD9335_CDC_TX7_TX_PATH_SEC5 0x0aac -#define WCD9335_CDC_TX7_TX_PATH_SEC6 0x0aad -#define WCD9335_CDC_TX8_TX_PATH_CTL 0x0ab1 -#define WCD9335_CDC_TX8_TX_PATH_CFG0 0x0ab2 -#define WCD9335_CDC_TX8_TX_PATH_CFG1 0x0ab3 -#define WCD9335_CDC_TX8_TX_VOL_CTL 0x0ab4 -#define WCD9335_CDC_TX8_TX_PATH_192_CTL 0x0ab5 -#define WCD9335_CDC_TX8_TX_PATH_192_CFG 0x0ab6 -#define WCD9335_CDC_TX8_TX_PATH_SEC0 0x0ab7 -#define WCD9335_CDC_TX8_TX_PATH_SEC1 0x0ab8 -#define WCD9335_CDC_TX8_TX_PATH_SEC2 0x0ab9 -#define WCD9335_CDC_TX8_TX_PATH_SEC3 0x0aba -#define WCD9335_CDC_TX8_TX_PATH_SEC4 0x0abb -#define WCD9335_CDC_TX8_TX_PATH_SEC5 0x0abc -#define WCD9335_CDC_TX8_TX_PATH_SEC6 0x0abd -#define WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL 0x0ac2 -#define WCD9335_CDC_TX9_SPKR_PROT_PATH_CFG0 0x0ac3 -#define WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL 0x0ac6 -#define WCD9335_CDC_TX10_SPKR_PROT_PATH_CFG0 0x0ac7 -#define WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL 0x0aca -#define WCD9335_CDC_TX11_SPKR_PROT_PATH_CFG0 0x0acb -#define WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL 0x0ace -#define WCD9335_CDC_TX12_SPKR_PROT_PATH_CFG0 0x0acf - -/* Page-11 Registers */ -#define WCD9335_PAGE11_PAGE_REGISTER 0x0b00 -#define WCD9335_CDC_COMPANDER1_CTL0 0x0b01 -#define WCD9335_CDC_COMPANDER1_CTL1 0x0b02 -#define WCD9335_CDC_COMPANDER1_CTL2 0x0b03 -#define WCD9335_CDC_COMPANDER1_CTL3 0x0b04 -#define WCD9335_CDC_COMPANDER1_CTL4 0x0b05 -#define WCD9335_CDC_COMPANDER1_CTL5 0x0b06 -#define WCD9335_CDC_COMPANDER1_CTL6 0x0b07 -#define WCD9335_CDC_COMPANDER1_CTL7 0x0b08 -#define WCD9335_CDC_COMPANDER2_CTL0 0x0b09 -#define WCD9335_CDC_COMPANDER2_CTL1 0x0b0a -#define WCD9335_CDC_COMPANDER2_CTL2 0x0b0b -#define WCD9335_CDC_COMPANDER2_CTL3 0x0b0c -#define WCD9335_CDC_COMPANDER2_CTL4 0x0b0d -#define WCD9335_CDC_COMPANDER2_CTL5 0x0b0e -#define WCD9335_CDC_COMPANDER2_CTL6 0x0b0f -#define WCD9335_CDC_COMPANDER2_CTL7 0x0b10 -#define WCD9335_CDC_COMPANDER3_CTL0 0x0b11 -#define WCD9335_CDC_COMPANDER3_CTL1 0x0b12 -#define WCD9335_CDC_COMPANDER3_CTL2 0x0b13 -#define WCD9335_CDC_COMPANDER3_CTL3 0x0b14 -#define WCD9335_CDC_COMPANDER3_CTL4 0x0b15 -#define WCD9335_CDC_COMPANDER3_CTL5 0x0b16 -#define WCD9335_CDC_COMPANDER3_CTL6 0x0b17 -#define WCD9335_CDC_COMPANDER3_CTL7 0x0b18 -#define WCD9335_CDC_COMPANDER4_CTL0 0x0b19 -#define WCD9335_CDC_COMPANDER4_CTL1 0x0b1a -#define WCD9335_CDC_COMPANDER4_CTL2 0x0b1b -#define WCD9335_CDC_COMPANDER4_CTL3 0x0b1c -#define WCD9335_CDC_COMPANDER4_CTL4 0x0b1d -#define WCD9335_CDC_COMPANDER4_CTL5 0x0b1e -#define WCD9335_CDC_COMPANDER4_CTL6 0x0b1f -#define WCD9335_CDC_COMPANDER4_CTL7 0x0b20 -#define WCD9335_CDC_COMPANDER5_CTL0 0x0b21 -#define WCD9335_CDC_COMPANDER5_CTL1 0x0b22 -#define WCD9335_CDC_COMPANDER5_CTL2 0x0b23 -#define WCD9335_CDC_COMPANDER5_CTL3 0x0b24 -#define WCD9335_CDC_COMPANDER5_CTL4 0x0b25 -#define WCD9335_CDC_COMPANDER5_CTL5 0x0b26 -#define WCD9335_CDC_COMPANDER5_CTL6 0x0b27 -#define WCD9335_CDC_COMPANDER5_CTL7 0x0b28 -#define WCD9335_CDC_COMPANDER6_CTL0 0x0b29 -#define WCD9335_CDC_COMPANDER6_CTL1 0x0b2a -#define WCD9335_CDC_COMPANDER6_CTL2 0x0b2b -#define WCD9335_CDC_COMPANDER6_CTL3 0x0b2c -#define WCD9335_CDC_COMPANDER6_CTL4 0x0b2d -#define WCD9335_CDC_COMPANDER6_CTL5 0x0b2e -#define WCD9335_CDC_COMPANDER6_CTL6 0x0b2f -#define WCD9335_CDC_COMPANDER6_CTL7 0x0b30 -#define WCD9335_CDC_COMPANDER7_CTL0 0x0b31 -#define WCD9335_CDC_COMPANDER7_CTL1 0x0b32 -#define WCD9335_CDC_COMPANDER7_CTL2 0x0b33 -#define WCD9335_CDC_COMPANDER7_CTL3 0x0b34 -#define WCD9335_CDC_COMPANDER7_CTL4 0x0b35 -#define WCD9335_CDC_COMPANDER7_CTL5 0x0b36 -#define WCD9335_CDC_COMPANDER7_CTL6 0x0b37 -#define WCD9335_CDC_COMPANDER7_CTL7 0x0b38 -#define WCD9335_CDC_COMPANDER8_CTL0 0x0b39 -#define WCD9335_CDC_COMPANDER8_CTL1 0x0b3a -#define WCD9335_CDC_COMPANDER8_CTL2 0x0b3b -#define WCD9335_CDC_COMPANDER8_CTL3 0x0b3c -#define WCD9335_CDC_COMPANDER8_CTL4 0x0b3d -#define WCD9335_CDC_COMPANDER8_CTL5 0x0b3e -#define WCD9335_CDC_COMPANDER8_CTL6 0x0b3f -#define WCD9335_CDC_COMPANDER8_CTL7 0x0b40 -#define WCD9335_CDC_RX0_RX_PATH_CTL 0x0b41 -#define WCD9335_CDC_RX0_RX_PATH_CFG0 0x0b42 -#define WCD9335_CDC_RX0_RX_PATH_CFG1 0x0b43 -#define WCD9335_CDC_RX0_RX_PATH_CFG2 0x0b44 -#define WCD9335_CDC_RX0_RX_VOL_CTL 0x0b45 -#define WCD9335_CDC_RX0_RX_PATH_MIX_CTL 0x0b46 -#define WCD9335_CDC_RX0_RX_PATH_MIX_CFG 0x0b47 -#define WCD9335_CDC_RX0_RX_VOL_MIX_CTL 0x0b48 -#define WCD9335_CDC_RX0_RX_PATH_SEC0 0x0b49 -#define WCD9335_CDC_RX0_RX_PATH_SEC1 0x0b4a -#define WCD9335_CDC_RX0_RX_PATH_SEC2 0x0b4b -#define WCD9335_CDC_RX0_RX_PATH_SEC3 0x0b4c -#define WCD9335_CDC_RX0_RX_PATH_SEC5 0x0b4e -#define WCD9335_CDC_RX0_RX_PATH_SEC6 0x0b4f -#define WCD9335_CDC_RX0_RX_PATH_SEC7 0x0b50 -#define WCD9335_CDC_RX0_RX_PATH_MIX_SEC0 0x0b51 -#define WCD9335_CDC_RX0_RX_PATH_MIX_SEC1 0x0b52 -#define WCD9335_CDC_RX1_RX_PATH_CTL 0x0b55 -#define WCD9335_CDC_RX1_RX_PATH_CFG0 0x0b56 -#define WCD9335_CDC_RX1_RX_PATH_CFG1 0x0b57 -#define WCD9335_CDC_RX1_RX_PATH_CFG2 0x0b58 -#define WCD9335_CDC_RX1_RX_VOL_CTL 0x0b59 -#define WCD9335_CDC_RX1_RX_PATH_MIX_CTL 0x0b5a -#define WCD9335_CDC_RX1_RX_PATH_MIX_CFG 0x0b5b -#define WCD9335_CDC_RX1_RX_VOL_MIX_CTL 0x0b5c -#define WCD9335_CDC_RX1_RX_PATH_SEC0 0x0b5d -#define WCD9335_CDC_RX1_RX_PATH_SEC1 0x0b5e -#define WCD9335_CDC_RX1_RX_PATH_SEC2 0x0b5f -#define WCD9335_CDC_RX1_RX_PATH_SEC3 0x0b60 -#define WCD9335_CDC_RX1_RX_PATH_SEC4 0x0b61 -#define WCD9335_CDC_RX1_RX_PATH_SEC5 0x0b62 -#define WCD9335_CDC_RX1_RX_PATH_SEC6 0x0b63 -#define WCD9335_CDC_RX1_RX_PATH_SEC7 0x0b64 -#define WCD9335_CDC_RX1_RX_PATH_MIX_SEC0 0x0b65 -#define WCD9335_CDC_RX1_RX_PATH_MIX_SEC1 0x0b66 -#define WCD9335_CDC_RX2_RX_PATH_CTL 0x0b69 -#define WCD9335_CDC_RX2_RX_PATH_CFG0 0x0b6a -#define WCD9335_CDC_RX2_RX_PATH_CFG1 0x0b6b -#define WCD9335_CDC_RX2_RX_PATH_CFG2 0x0b6c -#define WCD9335_CDC_RX2_RX_VOL_CTL 0x0b6d -#define WCD9335_CDC_RX2_RX_PATH_MIX_CTL 0x0b6e -#define WCD9335_CDC_RX2_RX_PATH_MIX_CFG 0x0b6f -#define WCD9335_CDC_RX2_RX_VOL_MIX_CTL 0x0b70 -#define WCD9335_CDC_RX2_RX_PATH_SEC0 0x0b71 -#define WCD9335_CDC_RX2_RX_PATH_SEC1 0x0b72 -#define WCD9335_CDC_RX2_RX_PATH_SEC2 0x0b73 -#define WCD9335_CDC_RX2_RX_PATH_SEC3 0x0b74 -#define WCD9335_CDC_RX2_RX_PATH_SEC4 0x0b75 -#define WCD9335_CDC_RX2_RX_PATH_SEC5 0x0b76 -#define WCD9335_CDC_RX2_RX_PATH_SEC6 0x0b77 -#define WCD9335_CDC_RX2_RX_PATH_SEC7 0x0b78 -#define WCD9335_CDC_RX2_RX_PATH_MIX_SEC0 0x0b79 -#define WCD9335_CDC_RX2_RX_PATH_MIX_SEC1 0x0b7a -#define WCD9335_CDC_RX3_RX_PATH_CTL 0x0b7d -#define WCD9335_CDC_RX3_RX_PATH_CFG0 0x0b7e -#define WCD9335_CDC_RX3_RX_PATH_CFG1 0x0b7f -#define WCD9335_CDC_RX3_RX_PATH_CFG2 0x0b80 -#define WCD9335_CDC_RX3_RX_VOL_CTL 0x0b81 -#define WCD9335_CDC_RX3_RX_PATH_MIX_CTL 0x0b82 -#define WCD9335_CDC_RX3_RX_PATH_MIX_CFG 0x0b83 -#define WCD9335_CDC_RX3_RX_VOL_MIX_CTL 0x0b84 -#define WCD9335_CDC_RX3_RX_PATH_SEC0 0x0b85 -#define WCD9335_CDC_RX3_RX_PATH_SEC1 0x0b86 -#define WCD9335_CDC_RX3_RX_PATH_SEC2 0x0b87 -#define WCD9335_CDC_RX3_RX_PATH_SEC3 0x0b88 -#define WCD9335_CDC_RX3_RX_PATH_SEC5 0x0b8a -#define WCD9335_CDC_RX3_RX_PATH_SEC6 0x0b8b -#define WCD9335_CDC_RX3_RX_PATH_SEC7 0x0b8c -#define WCD9335_CDC_RX3_RX_PATH_MIX_SEC0 0x0b8d -#define WCD9335_CDC_RX3_RX_PATH_MIX_SEC1 0x0b8e -#define WCD9335_CDC_RX4_RX_PATH_CTL 0x0b91 -#define WCD9335_CDC_RX4_RX_PATH_CFG0 0x0b92 -#define WCD9335_CDC_RX4_RX_PATH_CFG1 0x0b93 -#define WCD9335_CDC_RX4_RX_PATH_CFG2 0x0b94 -#define WCD9335_CDC_RX4_RX_VOL_CTL 0x0b95 -#define WCD9335_CDC_RX4_RX_PATH_MIX_CTL 0x0b96 -#define WCD9335_CDC_RX4_RX_PATH_MIX_CFG 0x0b97 -#define WCD9335_CDC_RX4_RX_VOL_MIX_CTL 0x0b98 -#define WCD9335_CDC_RX4_RX_PATH_SEC0 0x0b99 -#define WCD9335_CDC_RX4_RX_PATH_SEC1 0x0b9a -#define WCD9335_CDC_RX4_RX_PATH_SEC2 0x0b9b -#define WCD9335_CDC_RX4_RX_PATH_SEC3 0x0b9c -#define WCD9335_CDC_RX4_RX_PATH_SEC5 0x0b9e -#define WCD9335_CDC_RX4_RX_PATH_SEC6 0x0b9f -#define WCD9335_CDC_RX4_RX_PATH_SEC7 0x0ba0 -#define WCD9335_CDC_RX4_RX_PATH_MIX_SEC0 0x0ba1 -#define WCD9335_CDC_RX4_RX_PATH_MIX_SEC1 0x0ba2 -#define WCD9335_CDC_RX5_RX_PATH_CTL 0x0ba5 -#define WCD9335_CDC_RX5_RX_PATH_CFG0 0x0ba6 -#define WCD9335_CDC_RX5_RX_PATH_CFG1 0x0ba7 -#define WCD9335_CDC_RX5_RX_PATH_CFG2 0x0ba8 -#define WCD9335_CDC_RX5_RX_VOL_CTL 0x0ba9 -#define WCD9335_CDC_RX5_RX_PATH_MIX_CTL 0x0baa -#define WCD9335_CDC_RX5_RX_PATH_MIX_CFG 0x0bab -#define WCD9335_CDC_RX5_RX_VOL_MIX_CTL 0x0bac -#define WCD9335_CDC_RX5_RX_PATH_SEC0 0x0bad -#define WCD9335_CDC_RX5_RX_PATH_SEC1 0x0bae -#define WCD9335_CDC_RX5_RX_PATH_SEC2 0x0baf -#define WCD9335_CDC_RX5_RX_PATH_SEC3 0x0bb0 -#define WCD9335_CDC_RX5_RX_PATH_SEC5 0x0bb2 -#define WCD9335_CDC_RX5_RX_PATH_SEC6 0x0bb3 -#define WCD9335_CDC_RX5_RX_PATH_SEC7 0x0bb4 -#define WCD9335_CDC_RX5_RX_PATH_MIX_SEC0 0x0bb5 -#define WCD9335_CDC_RX5_RX_PATH_MIX_SEC1 0x0bb6 -#define WCD9335_CDC_RX6_RX_PATH_CTL 0x0bb9 -#define WCD9335_CDC_RX6_RX_PATH_CFG0 0x0bba -#define WCD9335_CDC_RX6_RX_PATH_CFG1 0x0bbb -#define WCD9335_CDC_RX6_RX_PATH_CFG2 0x0bbc -#define WCD9335_CDC_RX6_RX_VOL_CTL 0x0bbd -#define WCD9335_CDC_RX6_RX_PATH_MIX_CTL 0x0bbe -#define WCD9335_CDC_RX6_RX_PATH_MIX_CFG 0x0bbf -#define WCD9335_CDC_RX6_RX_VOL_MIX_CTL 0x0bc0 -#define WCD9335_CDC_RX6_RX_PATH_SEC0 0x0bc1 -#define WCD9335_CDC_RX6_RX_PATH_SEC1 0x0bc2 -#define WCD9335_CDC_RX6_RX_PATH_SEC2 0x0bc3 -#define WCD9335_CDC_RX6_RX_PATH_SEC3 0x0bc4 -#define WCD9335_CDC_RX6_RX_PATH_SEC5 0x0bc6 -#define WCD9335_CDC_RX6_RX_PATH_SEC6 0x0bc7 -#define WCD9335_CDC_RX6_RX_PATH_SEC7 0x0bc8 -#define WCD9335_CDC_RX6_RX_PATH_MIX_SEC0 0x0bc9 -#define WCD9335_CDC_RX6_RX_PATH_MIX_SEC1 0x0bca -#define WCD9335_CDC_RX7_RX_PATH_CTL 0x0bcd -#define WCD9335_CDC_RX7_RX_PATH_CFG0 0x0bce -#define WCD9335_CDC_RX7_RX_PATH_CFG1 0x0bcf -#define WCD9335_CDC_RX7_RX_PATH_CFG2 0x0bd0 -#define WCD9335_CDC_RX7_RX_VOL_CTL 0x0bd1 -#define WCD9335_CDC_RX7_RX_PATH_MIX_CTL 0x0bd2 -#define WCD9335_CDC_RX7_RX_PATH_MIX_CFG 0x0bd3 -#define WCD9335_CDC_RX7_RX_VOL_MIX_CTL 0x0bd4 -#define WCD9335_CDC_RX7_RX_PATH_SEC0 0x0bd5 -#define WCD9335_CDC_RX7_RX_PATH_SEC1 0x0bd6 -#define WCD9335_CDC_RX7_RX_PATH_SEC2 0x0bd7 -#define WCD9335_CDC_RX7_RX_PATH_SEC3 0x0bd8 -#define WCD9335_CDC_RX7_RX_PATH_SEC5 0x0bda -#define WCD9335_CDC_RX7_RX_PATH_SEC6 0x0bdb -#define WCD9335_CDC_RX7_RX_PATH_SEC7 0x0bdc -#define WCD9335_CDC_RX7_RX_PATH_MIX_SEC0 0x0bdd -#define WCD9335_CDC_RX7_RX_PATH_MIX_SEC1 0x0bde -#define WCD9335_CDC_RX8_RX_PATH_CTL 0x0be1 -#define WCD9335_CDC_RX8_RX_PATH_CFG0 0x0be2 -#define WCD9335_CDC_RX8_RX_PATH_CFG1 0x0be3 -#define WCD9335_CDC_RX8_RX_PATH_CFG2 0x0be4 -#define WCD9335_CDC_RX8_RX_VOL_CTL 0x0be5 -#define WCD9335_CDC_RX8_RX_PATH_MIX_CTL 0x0be6 -#define WCD9335_CDC_RX8_RX_PATH_MIX_CFG 0x0be7 -#define WCD9335_CDC_RX8_RX_VOL_MIX_CTL 0x0be8 -#define WCD9335_CDC_RX8_RX_PATH_SEC0 0x0be9 -#define WCD9335_CDC_RX8_RX_PATH_SEC1 0x0bea -#define WCD9335_CDC_RX8_RX_PATH_SEC2 0x0beb -#define WCD9335_CDC_RX8_RX_PATH_SEC3 0x0bec -#define WCD9335_CDC_RX8_RX_PATH_SEC5 0x0bee -#define WCD9335_CDC_RX8_RX_PATH_SEC6 0x0bef -#define WCD9335_CDC_RX8_RX_PATH_SEC7 0x0bf0 -#define WCD9335_CDC_RX8_RX_PATH_MIX_SEC0 0x0bf1 -#define WCD9335_CDC_RX8_RX_PATH_MIX_SEC1 0x0bf2 - -/* Page-12 Registers */ -#define WCD9335_PAGE12_PAGE_REGISTER 0x0c00 -#define WCD9335_CDC_CLSH_CRC 0x0c01 -#define WCD9335_CDC_CLSH_DLY_CTRL 0x0c02 -#define WCD9335_CDC_CLSH_DECAY_CTRL 0x0c03 -#define WCD9335_CDC_CLSH_HPH_V_PA 0x0c04 -#define WCD9335_CDC_CLSH_EAR_V_PA 0x0c05 -#define WCD9335_CDC_CLSH_HPH_V_HD 0x0c06 -#define WCD9335_CDC_CLSH_EAR_V_HD 0x0c07 -#define WCD9335_CDC_CLSH_K1_MSB 0x0c08 -#define WCD9335_CDC_CLSH_K1_LSB 0x0c09 -#define WCD9335_CDC_CLSH_K2_MSB 0x0c0a -#define WCD9335_CDC_CLSH_K2_LSB 0x0c0b -#define WCD9335_CDC_CLSH_IDLE_CTRL 0x0c0c -#define WCD9335_CDC_CLSH_IDLE_HPH 0x0c0d -#define WCD9335_CDC_CLSH_IDLE_EAR 0x0c0e -#define WCD9335_CDC_CLSH_TEST0 0x0c0f -#define WCD9335_CDC_CLSH_TEST1 0x0c10 -#define WCD9335_CDC_CLSH_OVR_VREF 0x0c11 -#define WCD9335_CDC_BOOST0_BOOST_PATH_CTL 0x0c19 -#define WCD9335_CDC_BOOST0_BOOST_CTL 0x0c1a -#define WCD9335_CDC_BOOST0_BOOST_CFG1 0x0c1b -#define WCD9335_CDC_BOOST0_BOOST_CFG2 0x0c1c -#define WCD9335_CDC_BOOST1_BOOST_PATH_CTL 0x0c21 -#define WCD9335_CDC_BOOST1_BOOST_CTL 0x0c22 -#define WCD9335_CDC_BOOST1_BOOST_CFG1 0x0c23 -#define WCD9335_CDC_BOOST1_BOOST_CFG2 0x0c24 -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_0 0x0c29 -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_1 0x0c2a -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_2 0x0c2b -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_3 0x0c2c -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0 0x0c2d -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_1 0x0c2e -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_2 0x0c2f -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_3 0x0c30 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_0 0x0c31 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_1 0x0c32 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_2 0x0c33 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_3 0x0c34 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_0 0x0c35 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_1 0x0c36 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_2 0x0c37 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_3 0x0c38 -#define WCD9335_SWR_AHB_BRIDGE_ACCESS_CFG 0x0c39 -#define WCD9335_SWR_AHB_BRIDGE_ACCESS_STATUS 0x0c3a -#define WCD9335_CDC_VBAT_VBAT_PATH_CTL 0x0c3d -#define WCD9335_CDC_VBAT_VBAT_CFG 0x0c3e -#define WCD9335_CDC_VBAT_VBAT_ADC_CAL1 0x0c3f -#define WCD9335_CDC_VBAT_VBAT_ADC_CAL2 0x0c40 -#define WCD9335_CDC_VBAT_VBAT_ADC_CAL3 0x0c41 -#define WCD9335_CDC_VBAT_VBAT_PK_EST1 0x0c42 -#define WCD9335_CDC_VBAT_VBAT_PK_EST2 0x0c43 -#define WCD9335_CDC_VBAT_VBAT_PK_EST3 0x0c44 -#define WCD9335_CDC_VBAT_VBAT_RF_PROC1 0x0c45 -#define WCD9335_CDC_VBAT_VBAT_RF_PROC2 0x0c46 -#define WCD9335_CDC_VBAT_VBAT_TAC1 0x0c47 -#define WCD9335_CDC_VBAT_VBAT_TAC2 0x0c48 -#define WCD9335_CDC_VBAT_VBAT_TAC3 0x0c49 -#define WCD9335_CDC_VBAT_VBAT_TAC4 0x0c4a -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD1 0x0c4b -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD2 0x0c4c -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD3 0x0c4d -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD4 0x0c4e -#define WCD9335_CDC_VBAT_VBAT_DEBUG1 0x0c4f -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD_MON 0x0c50 -#define WCD9335_CDC_VBAT_VBAT_GAIN_MON_VAL 0x0c51 -#define WCD9335_SPLINE_SRC0_CLK_RST_CTL_0 0x0c55 -#define WCD9335_SPLINE_SRC0_STATUS 0x0c56 -#define WCD9335_SPLINE_SRC1_CLK_RST_CTL_0 0x0c6d -#define WCD9335_SPLINE_SRC1_STATUS 0x0c6e -#define WCD9335_SPLINE_SRC2_CLK_RST_CTL_0 0x0c85 -#define WCD9335_SPLINE_SRC2_STATUS 0x0c86 -#define WCD9335_SPLINE_SRC3_CLK_RST_CTL_0 0x0c9d -#define WCD9335_SPLINE_SRC3_STATUS 0x0c9e -#define WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL 0x0cb5 -#define WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1 0x0cb6 -#define WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL 0x0cb9 -#define WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1 0x0cba - -/* Page-13 Registers */ -#define WCD9335_PAGE13_PAGE_REGISTER 0x0d00 -#define WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0 0x0d01 -#define WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1 0x0d02 -#define WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0 0x0d03 -#define WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1 0x0d04 -#define WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0 0x0d05 -#define WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1 0x0d06 -#define WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0 0x0d07 -#define WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1 0x0d08 -#define WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0 0x0d09 -#define WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1 0x0d0a -#define WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0 0x0d0b -#define WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1 0x0d0c -#define WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0 0x0d0d -#define WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1 0x0d0e -#define WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0 0x0d0f -#define WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1 0x0d10 -#define WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0 0x0d11 -#define WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1 0x0d12 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG0 0x0d13 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG1 0x0d14 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG2 0x0d15 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG3 0x0d16 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG4 0x0d17 -#define WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 0x0d18 -#define WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1 0x0d19 -#define WCD9335_CDC_RX_INP_MUX_ANC_CFG0 0x0d1a -#define WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0 0x0d1b -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0 0x0d1d -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1 0x0d1e -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0 0x0d1f -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1 0x0d20 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0 0x0d21 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1 0x0d22 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0 0x0d23 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1 0x0d24 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0 0x0d25 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0 0x0d26 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0 0x0d27 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0 0x0d28 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0 0x0d29 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX10_CFG0 0x0d2b -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX11_CFG0 0x0d2c -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX12_CFG0 0x0d2d -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX13_CFG0 0x0d2e -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0 0x0d31 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1 0x0d32 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2 0x0d33 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3 0x0d34 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0 0x0d35 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1 0x0d36 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2 0x0d37 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3 0x0d38 -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0 0x0d3a -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1 0x0d3b -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2 0x0d3c -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3 0x0d3d -#define WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL 0x0d41 -#define WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL 0x0d42 -#define WCD9335_CDC_CLK_RST_CTRL_SWR_CONTROL 0x0d43 -#define WCD9335_CDC_PROX_DETECT_PROX_CTL 0x0d49 -#define WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD0 0x0d4a -#define WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD1 0x0d4b -#define WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB 0x0d4c -#define WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB 0x0d4d -#define WCD9335_CDC_PROX_DETECT_PROX_STATUS 0x0d4e -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_CTRL 0x0d4f -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB 0x0d50 -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB 0x0d51 -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD 0x0d52 -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD 0x0d53 -#define WCD9335_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT 0x0d54 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_PATH_CTL 0x0d55 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL 0x0d56 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL 0x0d57 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL 0x0d58 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL 0x0d59 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL 0x0d5a -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL 0x0d5b -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL 0x0d5c -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL 0x0d5d -#define WCD9335_CDC_SIDETONE_IIR0_IIR_CTL 0x0d5e -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL 0x0d5f -#define WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL 0x0d60 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL 0x0d61 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_PATH_CTL 0x0d65 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL 0x0d66 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL 0x0d67 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL 0x0d68 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL 0x0d69 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL 0x0d6a -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL 0x0d6b -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL 0x0d6c -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL 0x0d6d -#define WCD9335_CDC_SIDETONE_IIR1_IIR_CTL 0x0d6e -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL 0x0d6f -#define WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL 0x0d70 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL 0x0d71 -#define WCD9335_CDC_TOP_TOP_CFG0 0x0d81 -#define WCD9335_CDC_TOP_TOP_CFG1 0x0d82 -#define WCD9335_CDC_TOP_TOP_CFG2 0x0d83 -#define WCD9335_CDC_TOP_TOP_CFG3 0x0d84 -#define WCD9335_CDC_TOP_TOP_CFG4 0x0d85 -#define WCD9335_CDC_TOP_TOP_CFG5 0x0d86 -#define WCD9335_CDC_TOP_TOP_CFG6 0x0d87 -#define WCD9335_CDC_TOP_TOP_CFG7 0x0d88 -#define WCD9335_CDC_TOP_HPHL_COMP_WR_LSB 0x0d89 -#define WCD9335_CDC_TOP_HPHL_COMP_WR_MSB 0x0d8a -#define WCD9335_CDC_TOP_HPHL_COMP_LUT 0x0d8b -#define WCD9335_CDC_TOP_HPHL_COMP_RD_LSB 0x0d8c -#define WCD9335_CDC_TOP_HPHL_COMP_RD_MSB 0x0d8d -#define WCD9335_CDC_TOP_HPHR_COMP_WR_LSB 0x0d8e -#define WCD9335_CDC_TOP_HPHR_COMP_WR_MSB 0x0d8f -#define WCD9335_CDC_TOP_HPHR_COMP_LUT 0x0d90 -#define WCD9335_CDC_TOP_HPHR_COMP_RD_LSB 0x0d91 -#define WCD9335_CDC_TOP_HPHR_COMP_RD_MSB 0x0d92 -#define WCD9335_CDC_TOP_DIFFL_COMP_WR_LSB 0x0d93 -#define WCD9335_CDC_TOP_DIFFL_COMP_WR_MSB 0x0d94 -#define WCD9335_CDC_TOP_DIFFL_COMP_LUT 0x0d95 -#define WCD9335_CDC_TOP_DIFFL_COMP_RD_LSB 0x0d96 -#define WCD9335_CDC_TOP_DIFFL_COMP_RD_MSB 0x0d97 -#define WCD9335_CDC_TOP_DIFFR_COMP_WR_LSB 0x0d98 -#define WCD9335_CDC_TOP_DIFFR_COMP_WR_MSB 0x0d99 -#define WCD9335_CDC_TOP_DIFFR_COMP_LUT 0x0d9a -#define WCD9335_CDC_TOP_DIFFR_COMP_RD_LSB 0x0d9b -#define WCD9335_CDC_TOP_DIFFR_COMP_RD_MSB 0x0d9c - -/* Page-0x80 Registers */ -#define WCD9335_PAGE80_PAGE_REGISTER 0x8000 -#define WCD9335_TLMM_BIST_MODE_PINCFG 0x8001 -#define WCD9335_TLMM_RF_PA_ON_PINCFG 0x8002 -#define WCD9335_TLMM_INTR1_PINCFG 0x8003 -#define WCD9335_TLMM_INTR2_PINCFG 0x8004 -#define WCD9335_TLMM_SWR_DATA_PINCFG 0x8005 -#define WCD9335_TLMM_SWR_CLK_PINCFG 0x8006 -#define WCD9335_TLMM_SLIMBUS_DATA2_PINCFG 0x8007 -#define WCD9335_TLMM_I2C_CLK_PINCFG 0x8008 -#define WCD9335_TLMM_I2C_DATA_PINCFG 0x8009 -#define WCD9335_TLMM_I2S_RX_SD0_PINCFG 0x800a -#define WCD9335_TLMM_I2S_RX_SD1_PINCFG 0x800b -#define WCD9335_TLMM_I2S_RX_SCK_PINCFG 0x800c -#define WCD9335_TLMM_I2S_RX_WS_PINCFG 0x800d -#define WCD9335_TLMM_I2S_TX_SD0_PINCFG 0x800e -#define WCD9335_TLMM_I2S_TX_SD1_PINCFG 0x800f -#define WCD9335_TLMM_I2S_TX_SCK_PINCFG 0x8010 -#define WCD9335_TLMM_I2S_TX_WS_PINCFG 0x8011 -#define WCD9335_TLMM_DMIC1_CLK_PINCFG 0x8012 -#define WCD9335_TLMM_DMIC1_DATA_PINCFG 0x8013 -#define WCD9335_TLMM_DMIC2_CLK_PINCFG 0x8014 -#define WCD9335_TLMM_DMIC2_DATA_PINCFG 0x8015 -#define WCD9335_TLMM_DMIC3_CLK_PINCFG 0x8016 -#define WCD9335_TLMM_DMIC3_DATA_PINCFG 0x8017 -#define WCD9335_TLMM_JTDI_PINCFG 0x8018 -#define WCD9335_TLMM_JTDO_PINCFG 0x8019 -#define WCD9335_TLMM_JTMS_PINCFG 0x801a -#define WCD9335_TLMM_JTCK_PINCFG 0x801b -#define WCD9335_TLMM_JTRST_PINCFG 0x801c -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_0 0x8031 -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_1 0x8032 -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_2 0x8033 -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_3 0x8034 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_0 0x8035 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_1 0x8036 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_2 0x8037 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_3 0x8038 -#define WCD9335_TEST_DEBUG_PAD_DRVCTL 0x8039 -#define WCD9335_TEST_DEBUG_PIN_STATUS 0x803a -#define WCD9335_TEST_DEBUG_NPL_DLY_TEST_1 0x803b -#define WCD9335_TEST_DEBUG_NPL_DLY_TEST_2 0x803c -#define WCD9335_TEST_DEBUG_MEM_CTRL 0x803d -#define WCD9335_TEST_DEBUG_DEBUG_BUS_SEL 0x8041 -#define WCD9335_TEST_DEBUG_DEBUG_JTAG 0x8042 -#define WCD9335_TEST_DEBUG_DEBUG_EN_1 0x8043 -#define WCD9335_TEST_DEBUG_DEBUG_EN_2 0x8044 -#define WCD9335_TEST_DEBUG_DEBUG_EN_3 0x8045 -#define WCD9335_MAX_REGISTER 0x80FF - -/* SLIMBUS Slave Registers */ -#define TASHA_SLIM_PGD_PORT_INT_EN0 (0x30) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_RX_0 (0x34) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_RX_1 (0x35) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_TX_0 (0x36) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_TX_1 (0x37) -#define TASHA_SLIM_PGD_PORT_INT_CLR_RX_0 (0x38) -#define TASHA_SLIM_PGD_PORT_INT_CLR_RX_1 (0x39) -#define TASHA_SLIM_PGD_PORT_INT_CLR_TX_0 (0x3A) -#define TASHA_SLIM_PGD_PORT_INT_CLR_TX_1 (0x3B) -#define TASHA_SLIM_PGD_PORT_INT_RX_SOURCE0 (0x60) -#define TASHA_SLIM_PGD_PORT_INT_TX_SOURCE0 (0x70) - -/* Macros for Packing Register Writes into a U32 */ -#define TASHA_PACKED_REG_SIZE sizeof(u32) - -#define TASHA_CODEC_PACK_ENTRY(reg, mask, val) ((val & 0xff)|\ - ((mask & 0xff) << 8)|((reg & 0xffff) << 16)) -#define TASHA_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ - do { \ - ((reg) = ((packed >> 16) & (0xffff))); \ - ((mask) = ((packed >> 8) & (0xff))); \ - ((val) = ((packed) & (0xff))); \ - } while (0) -#endif diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/Android.mk b/techpack/audio/4.0/asoc/codecs/wcd937x/Android.mk deleted file mode 100644 index 183c78dfe2d7..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/Android.mk +++ /dev/null @@ -1,61 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd937x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x_slave.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_slave_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/Kbuild b/techpack/audio/4.0/asoc/codecs/wcd937x/Kbuild deleted file mode 100644 index 9ef043d596b7..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/Kbuild +++ /dev/null @@ -1,132 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.19 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ WCD937X ############ - -# for WCD937X Codec -ifdef CONFIG_SND_SOC_WCD937X - WCD937X_OBJS += wcd937x.o - WCD937X_OBJS += wcd937x-regmap.o - WCD937X_OBJS += wcd937x-tables.o - WCD937X_OBJS += wcd937x-mbhc.o -endif - -ifdef CONFIG_SND_SOC_WCD937X_SLAVE - WCD937X_SLAVE_OBJS += wcd937x_slave.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/ipc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/soc/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers - endif -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_WCD937X) += wcd937x_dlkm.o -wcd937x_dlkm-y := $(WCD937X_OBJS) - -obj-$(CONFIG_SND_SOC_WCD937X_SLAVE) += wcd937x_slave_dlkm.o -wcd937x_slave_dlkm-y := $(WCD937X_SLAVE_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/internal.h b/techpack/audio/4.0/asoc/codecs/wcd937x/internal.h deleted file mode 100644 index c62aad4376fb..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/internal.h +++ /dev/null @@ -1,178 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD937X_INTERNAL_H -#define _WCD937X_INTERNAL_H - -#include -#include -#include -#include "wcd937x-mbhc.h" - -#define WCD937X_MAX_MICBIAS 3 - -/* Convert from vout ctl to micbias voltage in mV */ -#define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) -#define MAX_PORT 8 -#define MAX_CH_PER_PORT 8 - -extern struct regmap_config wcd937x_regmap_config; - -struct codec_port_info { - u32 slave_port_type; - u32 master_port_type; - u32 ch_mask; - u32 num_ch; - u32 ch_rate; -}; -struct wcd937x_priv { - struct device *dev; - - int variant; - struct snd_soc_codec *codec; - struct device_node *rst_np; - struct regmap *regmap; - - struct swr_device *rx_swr_dev; - struct swr_device *tx_swr_dev; - - s32 micb_ref[WCD937X_MAX_MICBIAS]; - s32 pullup_ref[WCD937X_MAX_MICBIAS]; - - struct fw_info *fw_data; - struct device_node *wcd_rst_np; - - struct mutex micb_lock; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - /* class h specific info */ - struct wcd_clsh_cdc_info clsh_info; - /* mbhc module */ - struct wcd937x_mbhc *mbhc; - - u32 hph_mode; - bool comp1_enable; - bool comp2_enable; - - struct irq_domain *virq; - struct wcd_irq_info irq_info; - u32 rx_clk_cnt; - int num_irq_regs; - /* to track the status */ - unsigned long status_mask; - - u8 num_tx_ports; - u8 num_rx_ports; - struct codec_port_info - tx_port_mapping[MAX_PORT][MAX_CH_PER_PORT]; - struct codec_port_info - rx_port_mapping[MAX_PORT][MAX_CH_PER_PORT]; - struct regulator_bulk_data *supplies; - struct notifier_block nblock; - /* wcd callback to bolero */ - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); - int (*wakeup)(void *handle, bool enable); - u32 version; - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - /*Entry for Variant info*/ - struct snd_info_entry *variant_entry; - int ear_rx_path; - int ana_clk_count; - struct mutex ana_tx_clk_lock; -}; - -struct wcd937x_micbias_setting { - u8 ldoh_v; - u32 cfilt1_mv; - u32 micb1_mv; - u32 micb2_mv; - u32 micb3_mv; - u8 bias1_cfilt_sel; -}; - -struct wcd937x_pdata { - struct device_node *rst_np; - struct device_node *rx_slave; - struct device_node *tx_slave; - struct wcd937x_micbias_setting micbias; - - struct cdc_regulator *regulator; - int num_supplies; -}; - -struct wcd_ctrl_platform_data { - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -enum { - WCD_RX1, - WCD_RX2, - WCD_RX3 -}; - -enum { - BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR = 1, - BOLERO_WCD_EVT_PA_OFF_PRE_SSR, - BOLERO_WCD_EVT_SSR_DOWN, - BOLERO_WCD_EVT_SSR_UP, -}; - -enum { - WCD_BOLERO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ - WCD_BOLERO_EVT_IMPED_TRUE, /* for imped true */ - WCD_BOLERO_EVT_IMPED_FALSE, /* for imped false */ - WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST, - WCD_BOLERO_EVT_BCS_CLK_OFF, -}; - -enum { - /* INTR_CTRL_INT_MASK_0 */ - WCD937X_IRQ_MBHC_BUTTON_PRESS_DET = 0, - WCD937X_IRQ_MBHC_BUTTON_RELEASE_DET, - WCD937X_IRQ_MBHC_ELECT_INS_REM_DET, - WCD937X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - WCD937X_IRQ_MBHC_SW_DET, - WCD937X_IRQ_HPHR_OCP_INT, - WCD937X_IRQ_HPHR_CNP_INT, - WCD937X_IRQ_HPHL_OCP_INT, - - /* INTR_CTRL_INT_MASK_1 */ - WCD937X_IRQ_HPHL_CNP_INT, - WCD937X_IRQ_EAR_CNP_INT, - WCD937X_IRQ_EAR_SCD_INT, - WCD937X_IRQ_AUX_CNP_INT, - WCD937X_IRQ_AUX_SCD_INT, - WCD937X_IRQ_HPHL_PDM_WD_INT, - WCD937X_IRQ_HPHR_PDM_WD_INT, - WCD937X_IRQ_AUX_PDM_WD_INT, - - /* INTR_CTRL_INT_MASK_2 */ - WCD937X_IRQ_LDORT_SCD_INT, - WCD937X_IRQ_MBHC_MOISTURE_INT, - WCD937X_IRQ_HPHL_SURGE_DET_INT, - WCD937X_IRQ_HPHR_SURGE_DET_INT, - WCD937X_NUM_IRQS, -}; - -extern void wcd937x_disable_bcs_before_slow_insert( - struct snd_soc_codec *codec, - bool bcs_disable); -extern struct wcd937x_mbhc *wcd937x_soc_get_mbhc(struct snd_soc_codec *codec); -extern int wcd937x_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int volt, int micb_num); -extern int wcd937x_get_micb_vout_ctl_val(u32 micb_mv); -extern int wcd937x_micbias_control(struct snd_soc_codec *codec, int micb_num, - int req, bool is_dapm); -#endif diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.c b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.c deleted file mode 100644 index f4d5a4bae8ba..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.c +++ /dev/null @@ -1,1130 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd937x-registers.h" -#include -#include -#include "internal.h" - -#define WCD937X_ZDET_SUPPORTED true -/* Z value defined in milliohm */ -#define WCD937X_ZDET_VAL_32 32000 -#define WCD937X_ZDET_VAL_400 400000 -#define WCD937X_ZDET_VAL_1200 1200000 -#define WCD937X_ZDET_VAL_100K 100000000 -/* Z floating defined in ohms */ -#define WCD937X_ZDET_FLOATING_IMPEDANCE 0x0FFFFFFE - -#define WCD937X_ZDET_NUM_MEASUREMENTS 900 -#define WCD937X_MBHC_GET_C1(c) ((c & 0xC000) >> 14) -#define WCD937X_MBHC_GET_X1(x) (x & 0x3FFF) -/* Z value compared in milliOhm */ -#define WCD937X_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) -#define WCD937X_MBHC_ZDET_CONST (86 * 16384) -#define WCD937X_MBHC_MOISTURE_RREF R_24_KOHM - -static struct wcd_mbhc_register - wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { - WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN", - WCD937X_ANA_MBHC_MECH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN", - WCD937X_ANA_MBHC_MECH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE", - WCD937X_ANA_MBHC_MECH, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL", - WCD937X_MBHC_NEW_PLUG_DETECT_CTL, 0x30, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE", - WCD937X_ANA_MBHC_ELECT, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL", - WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x1F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL", - WCD937X_ANA_MBHC_MECH, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE", - WCD937X_ANA_MBHC_MECH, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE", - WCD937X_ANA_MBHC_MECH, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND", - WCD937X_ANA_MBHC_MECH, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC", - WCD937X_ANA_MBHC_ELECT, 0x06, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN", - WCD937X_ANA_MBHC_ELECT, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC", - WCD937X_MBHC_NEW_PLUG_DETECT_CTL, 0x0F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC", - WCD937X_MBHC_NEW_CTL_1, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF", - WCD937X_MBHC_NEW_CTL_2, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_IN2P_CLAMP_STATE", - WCD937X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN", - WCD937X_HPH_OCP_CTL, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x07, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL", - WCD937X_ANA_MBHC_ELECT, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL", - WCD937X_ANA_MICB2, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME", - WCD937X_HPH_CNP_WG_TIME, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN", - WCD937X_ANA_HPH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN", - WCD937X_ANA_HPH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN", - WCD937X_ANA_HPH, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", - WCD937X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", - 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", - WCD937X_MBHC_CTL_BCS, 0x02, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", - WCD937X_MBHC_NEW_FSM_STATUS, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", - WCD937X_MBHC_NEW_CTL_2, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS", - WCD937X_MBHC_NEW_FSM_STATUS, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND", - WCD937X_HPH_PA_CTL2, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND", - WCD937X_HPH_PA_CTL2, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_DET_EN", - WCD937X_HPH_L_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_DET_EN", - WCD937X_HPH_R_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_STATUS", - WCD937X_DIGITAL_INTR_STATUS_0, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_STATUS", - WCD937X_DIGITAL_INTR_STATUS_0, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_EN", - WCD937X_MBHC_NEW_CTL_1, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_COMPLETE", WCD937X_MBHC_NEW_FSM_STATUS, - 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_TIMEOUT", WCD937X_MBHC_NEW_FSM_STATUS, - 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_RESULT", WCD937X_MBHC_NEW_ADC_RESULT, - 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB2_VOUT", WCD937X_ANA_MICB2, 0x3F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_MODE", - WCD937X_MBHC_NEW_CTL_1, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_DETECTION_DONE", - WCD937X_MBHC_NEW_CTL_1, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_ISRC_EN", - WCD937X_ANA_MBHC_ZDET, 0x02, 1, 0), -}; - -static const struct wcd_mbhc_intr intr_ids = { - .mbhc_sw_intr = WCD937X_IRQ_MBHC_SW_DET, - .mbhc_btn_press_intr = WCD937X_IRQ_MBHC_BUTTON_PRESS_DET, - .mbhc_btn_release_intr = WCD937X_IRQ_MBHC_BUTTON_RELEASE_DET, - .mbhc_hs_ins_intr = WCD937X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - .mbhc_hs_rem_intr = WCD937X_IRQ_MBHC_ELECT_INS_REM_DET, - .hph_left_ocp = WCD937X_IRQ_HPHL_OCP_INT, - .hph_right_ocp = WCD937X_IRQ_HPHR_OCP_INT, -}; - -struct wcd937x_mbhc_zdet_param { - u16 ldo_ctl; - u16 noff; - u16 nshift; - u16 btn5; - u16 btn6; - u16 btn7; -}; - -static int wcd937x_mbhc_request_irq(struct snd_soc_codec *codec, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - return wcd_request_irq(&wcd937x->irq_info, irq, name, handler, data); -} - -static void wcd937x_mbhc_irq_control(struct snd_soc_codec *codec, - int irq, bool enable) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - if (enable) - wcd_enable_irq(&wcd937x->irq_info, irq); - else - wcd_disable_irq(&wcd937x->irq_info, irq); -} - -static int wcd937x_mbhc_free_irq(struct snd_soc_codec *codec, - int irq, void *data) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - wcd_free_irq(&wcd937x->irq_info, irq, data); - - return 0; -} - -static void wcd937x_mbhc_clk_setup(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_1, - 0x80, 0x80); - else - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_1, - 0x80, 0x00); -} - -static int wcd937x_mbhc_btn_to_num(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, WCD937X_ANA_MBHC_RESULT_3) & 0x7; -} - -static void wcd937x_mbhc_mbhc_bias_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_ELECT, - 0x01, 0x01); - else - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_ELECT, - 0x01, 0x00); -} - -static void wcd937x_mbhc_program_btn_thr(struct snd_soc_codec *codec, - s16 *btn_low, s16 *btn_high, - int num_btn, bool is_micbias) -{ - int i; - int vth; - - if (num_btn > WCD_MBHC_DEF_BUTTONS) { - dev_err(codec->dev, "%s: invalid number of buttons: %d\n", - __func__, num_btn); - return; - } - - for (i = 0; i < num_btn; i++) { - vth = ((btn_high[i] * 2) / 25) & 0x3F; - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN0 + i, - 0xFC, vth << 2); - dev_dbg(codec->dev, "%s: btn_high[%d]: %d, vth: %d\n", - __func__, i, btn_high[i], vth); - } -} - -static bool wcd937x_mbhc_lock_sleep(struct wcd_mbhc *mbhc, bool lock) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - wcd937x->wakeup((void*)wcd937x, lock); - return true; -} - -static int wcd937x_mbhc_register_notifier(struct wcd_mbhc *mbhc, - struct notifier_block *nblock, - bool enable) -{ - struct wcd937x_mbhc *wcd937x_mbhc; - - wcd937x_mbhc = container_of(mbhc, struct wcd937x_mbhc, wcd_mbhc); - - if (enable) - return blocking_notifier_chain_register(&wcd937x_mbhc->notifier, - nblock); - else - return blocking_notifier_chain_unregister( - &wcd937x_mbhc->notifier, nblock); -} - -static bool wcd937x_mbhc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num) -{ - u8 val = 0; - - if (micb_num == MIC_BIAS_2) { - val = ((snd_soc_read(mbhc->codec, WCD937X_ANA_MICB2) & 0xC0) - >> 6); - if (val == 0x01) - return true; - } - return false; -} - -static bool wcd937x_mbhc_hph_pa_on_status(struct snd_soc_codec *codec) -{ - return (snd_soc_read(codec, WCD937X_ANA_HPH) & 0xC0) ? true : false; -} - -static void wcd937x_mbhc_hph_l_pull_up_control(struct snd_soc_codec *codec, - int pull_up_cur) -{ - /* Default pull up current to 2uA */ - if (pull_up_cur > HS_PULLUP_I_OFF || pull_up_cur < HS_PULLUP_I_3P0_UA || - pull_up_cur == HS_PULLUP_I_DEFAULT) - pull_up_cur = HS_PULLUP_I_2P0_UA; - - dev_dbg(codec->dev, "%s: HS pull up current:%d\n", - __func__, pull_up_cur); - - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT, - 0x1F, pull_up_cur); -} - -static int wcd937x_mbhc_request_micbias(struct snd_soc_codec *codec, - int micb_num, int req) -{ - int ret = 0; - - ret = wcd937x_micbias_control(codec, micb_num, req, false); - - return ret; -} - -static void wcd937x_mbhc_micb_ramp_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x1C, 0x0C); - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x1C, 0x00); - } -} - -static struct firmware_cal *wcd937x_get_hwdep_fw_cal(struct wcd_mbhc *mbhc, - enum wcd_cal_type type) -{ - struct wcd937x_mbhc *wcd937x_mbhc; - struct firmware_cal *hwdep_cal; - struct snd_soc_codec *codec = mbhc->codec; - - wcd937x_mbhc = container_of(mbhc, struct wcd937x_mbhc, wcd_mbhc); - - if (!codec) { - pr_err("%s: NULL codec pointer\n", __func__); - return NULL; - } - hwdep_cal = wcdcal_get_fw_cal(wcd937x_mbhc->fw_data, type); - if (!hwdep_cal) - dev_err(codec->dev, "%s: cal not sent by %d\n", - __func__, type); - - return hwdep_cal; -} - -static int wcd937x_mbhc_micb_ctrl_threshold_mic(struct snd_soc_codec *codec, - int micb_num, bool req_en) -{ - struct wcd937x_pdata *pdata = dev_get_platdata(codec->dev); - int rc, micb_mv; - - if (micb_num != MIC_BIAS_2) - return -EINVAL; - /* - * If device tree micbias level is already above the minimum - * voltage needed to detect threshold microphone, then do - * not change the micbias, just return. - */ - if (pdata->micbias.micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) - return 0; - - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : pdata->micbias.micb2_mv; - - rc = wcd937x_mbhc_micb_adjust_voltage(codec, micb_mv, MIC_BIAS_2); - - return rc; -} - -static inline void wcd937x_mbhc_get_result_params(struct wcd937x_priv *wcd937x, - s16 *d1_a, u16 noff, - int32_t *zdet) -{ - int i; - int val, val1; - s16 c1; - s32 x1, d1; - int32_t denom; - int minCode_param[] = { - 3277, 1639, 820, 410, 205, 103, 52, 26 - }; - - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x20); - for (i = 0; i < WCD937X_ZDET_NUM_MEASUREMENTS; i++) { - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_2, &val); - if (val & 0x80) - break; - } - val = val << 0x8; - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_1, &val1); - val |= val1; - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x00); - x1 = WCD937X_MBHC_GET_X1(val); - c1 = WCD937X_MBHC_GET_C1(val); - /* If ramp is not complete, give additional 5ms */ - if ((c1 < 2) && x1) - usleep_range(5000, 5050); - - if (!c1 || !x1) { - dev_dbg(wcd937x->dev, - "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", - __func__, c1, x1); - goto ramp_down; - } - d1 = d1_a[c1]; - denom = (x1 * d1) - (1 << (14 - noff)); - if (denom > 0) - *zdet = (WCD937X_MBHC_ZDET_CONST * 1000) / denom; - else if (x1 < minCode_param[noff]) - *zdet = WCD937X_ZDET_FLOATING_IMPEDANCE; - - dev_dbg(wcd937x->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", - __func__, d1, c1, x1, *zdet); -ramp_down: - i = 0; - while (x1) { - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_1, &val); - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_2, &val1); - val = val << 0x8; - val |= val1; - x1 = WCD937X_MBHC_GET_X1(val); - i++; - if (i == WCD937X_ZDET_NUM_MEASUREMENTS) - break; - } -} - -static void wcd937x_mbhc_zdet_ramp(struct snd_soc_codec *codec, - struct wcd937x_mbhc_zdet_param *zdet_param, - int32_t *zl, int32_t *zr, s16 *d1_a) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - int32_t zdet = 0; - - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL, 0x70, - zdet_param->ldo_ctl << 4); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN5, 0xFC, - zdet_param->btn5); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN6, 0xFC, - zdet_param->btn6); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN7, 0xFC, - zdet_param->btn7); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL, 0x0F, - zdet_param->noff); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_ZDET_RAMP_CTL, 0x0F, - zdet_param->nshift); - - if (!zl) - goto z_right; - /* Start impedance measurement for HPH_L */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x80, 0x80); - dev_dbg(wcd937x->dev, "%s: ramp for HPH_L, noff = %d\n", - __func__, zdet_param->noff); - wcd937x_mbhc_get_result_params(wcd937x, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x80, 0x00); - - *zl = zdet; - -z_right: - if (!zr) - return; - /* Start impedance measurement for HPH_R */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x40, 0x40); - dev_dbg(wcd937x->dev, "%s: ramp for HPH_R, noff = %d\n", - __func__, zdet_param->noff); - wcd937x_mbhc_get_result_params(wcd937x, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x40, 0x00); - - *zr = zdet; -} - -static inline void wcd937x_wcd_mbhc_qfuse_cal(struct snd_soc_codec *codec, - int32_t *z_val, int flag_l_r) -{ - s16 q1; - int q1_cal; - - if (*z_val < (WCD937X_ZDET_VAL_400/1000)) - q1 = snd_soc_read(codec, - WCD937X_DIGITAL_EFUSE_REG_23 + (2 * flag_l_r)); - else - q1 = snd_soc_read(codec, - WCD937X_DIGITAL_EFUSE_REG_24 + (2 * flag_l_r)); - if (q1 & 0x80) - q1_cal = (10000 - ((q1 & 0x7F) * 25)); - else - q1_cal = (10000 + (q1 * 25)); - if (q1_cal > 0) - *z_val = ((*z_val) * 10000) / q1_cal; -} - -static void wcd937x_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - s16 reg0, reg1, reg2, reg3, reg4; - int32_t z1L, z1R, z1Ls; - int zMono, z_diff1, z_diff2; - bool is_fsm_disable = false; - struct wcd937x_mbhc_zdet_param zdet_param[] = { - {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */ - {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */ - {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */ - {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */ - }; - struct wcd937x_mbhc_zdet_param *zdet_param_ptr = NULL; - s16 d1_a[][4] = { - {0, 30, 90, 30}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - }; - s16 *d1 = NULL; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - reg0 = snd_soc_read(codec, WCD937X_ANA_MBHC_BTN5); - reg1 = snd_soc_read(codec, WCD937X_ANA_MBHC_BTN6); - reg2 = snd_soc_read(codec, WCD937X_ANA_MBHC_BTN7); - reg3 = snd_soc_read(codec, WCD937X_MBHC_CTL_CLK); - reg4 = snd_soc_read(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL); - - if (snd_soc_read(codec, WCD937X_ANA_MBHC_ELECT) & 0x80) { - is_fsm_disable = true; - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ELECT, 0x80, 0x00); - } - - /* For NO-jack, disable L_DET_EN before Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x80, 0x00); - - /* Turn off 100k pull down on HPHL */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x01, 0x00); - - /* Disable surge protection before impedance detection. - * This is done to give correct value for high impedance. - */ - regmap_update_bits(wcd937x->regmap, - WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0x00); - /* 1ms delay needed after disable surge protection */ - usleep_range(1000, 1010); - - /* First get impedance on Left */ - d1 = d1_a[1]; - zdet_param_ptr = &zdet_param[1]; - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - - if (!WCD937X_MBHC_IS_SECOND_RAMP_REQUIRED(z1L)) - goto left_ch_impedance; - - /* Second ramp for left ch */ - if (z1L < WCD937X_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1L > WCD937X_ZDET_VAL_400) && - (z1L <= WCD937X_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1L > WCD937X_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - -left_ch_impedance: - if ((z1L == WCD937X_ZDET_FLOATING_IMPEDANCE) || - (z1L > WCD937X_ZDET_VAL_100K)) { - *zl = WCD937X_ZDET_FLOATING_IMPEDANCE; - zdet_param_ptr = &zdet_param[1]; - d1 = d1_a[1]; - } else { - *zl = z1L/1000; - wcd937x_wcd_mbhc_qfuse_cal(codec, zl, 0); - } - dev_dbg(codec->dev, "%s: impedance on HPH_L = %d(ohms)\n", - __func__, *zl); - - /* Start of right impedance ramp and calculation */ - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - if (WCD937X_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) { - if (((z1R > WCD937X_ZDET_VAL_1200) && - (zdet_param_ptr->noff == 0x6)) || - ((*zl) != WCD937X_ZDET_FLOATING_IMPEDANCE)) - goto right_ch_impedance; - /* Second ramp for right ch */ - if (z1R < WCD937X_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1R > WCD937X_ZDET_VAL_400) && - (z1R <= WCD937X_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1R > WCD937X_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - } -right_ch_impedance: - if ((z1R == WCD937X_ZDET_FLOATING_IMPEDANCE) || - (z1R > WCD937X_ZDET_VAL_100K)) { - *zr = WCD937X_ZDET_FLOATING_IMPEDANCE; - } else { - *zr = z1R/1000; - wcd937x_wcd_mbhc_qfuse_cal(codec, zr, 1); - } - dev_dbg(codec->dev, "%s: impedance on HPH_R = %d(ohms)\n", - __func__, *zr); - - /* Mono/stereo detection */ - if ((*zl == WCD937X_ZDET_FLOATING_IMPEDANCE) && - (*zr == WCD937X_ZDET_FLOATING_IMPEDANCE)) { - dev_dbg(codec->dev, - "%s: plug type is invalid or extension cable\n", - __func__); - goto zdet_complete; - } - if ((*zl == WCD937X_ZDET_FLOATING_IMPEDANCE) || - (*zr == WCD937X_ZDET_FLOATING_IMPEDANCE) || - ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) || - ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) { - dev_dbg(codec->dev, - "%s: Mono plug type with one ch floating or shorted to GND\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - goto zdet_complete; - } - snd_soc_update_bits(codec, WCD937X_HPH_R_ATEST, 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, 0x40, 0x01); - if (*zl < (WCD937X_ZDET_VAL_32/1000)) - wcd937x_mbhc_zdet_ramp(codec, &zdet_param[0], &z1Ls, NULL, d1); - else - wcd937x_mbhc_zdet_ramp(codec, &zdet_param[1], &z1Ls, NULL, d1); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_HPH_R_ATEST, 0x02, 0x00); - z1Ls /= 1000; - wcd937x_wcd_mbhc_qfuse_cal(codec, &z1Ls, 0); - /* Parallel of left Z and 9 ohm pull down resistor */ - zMono = ((*zl) * 9) / ((*zl) + 9); - z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); - z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); - if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) { - dev_dbg(codec->dev, "%s: stereo plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } else { - dev_dbg(codec->dev, "%s: MONO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } - - /* Enable surge protection again after impedance detection */ - regmap_update_bits(wcd937x->regmap, - WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); -zdet_complete: - snd_soc_write(codec, WCD937X_ANA_MBHC_BTN5, reg0); - snd_soc_write(codec, WCD937X_ANA_MBHC_BTN6, reg1); - snd_soc_write(codec, WCD937X_ANA_MBHC_BTN7, reg2); - /* Turn on 100k pull down on HPHL */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x01, 0x01); - - /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x80, 0x80); - - snd_soc_write(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL, reg4); - snd_soc_write(codec, WCD937X_MBHC_CTL_CLK, reg3); - if (is_fsm_disable) - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ELECT, 0x80, 0x80); -} - -static void wcd937x_mbhc_gnd_det_ctrl(struct snd_soc_codec *codec, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x40, 0x40); - } else { - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x02, 0x00); - } -} - -static void wcd937x_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x40, 0x40); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x10, 0x10); - } else { - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x10, 0x00); - } -} - -static void wcd937x_mbhc_moisture_config(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - /* Do not enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); -} - -static void wcd937x_mbhc_moisture_detect_en(struct wcd_mbhc *mbhc, bool enable) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if (enable) - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); - else - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); -} - -static bool wcd937x_mbhc_get_moisture_status(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - bool ret = false; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - goto done; - } - - /* Do not enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - goto done; - } - - /* If moisture_en is already enabled, then skip to plug type - * detection. - */ - if ((snd_soc_read(codec, WCD937X_MBHC_NEW_CTL_2) & 0x0C)) - goto done; - - wcd937x_mbhc_moisture_detect_en(mbhc, true); - /* Read moisture comparator status */ - ret = ((snd_soc_read(codec, WCD937X_MBHC_NEW_FSM_STATUS) - & 0x20) ? 0 : 1); - -done: - return ret; - -} - -static void wcd937x_mbhc_moisture_polling_ctrl(struct wcd_mbhc *mbhc, - bool enable) -{ - struct snd_soc_codec *codec = mbhc->codec; - - snd_soc_update_bits(codec, - WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, - 0x04, (enable << 2)); -} - -static void wcd937x_mbhc_bcs_enable(struct wcd_mbhc *mbhc, - bool bcs_enable) -{ - if (bcs_enable) - wcd937x_disable_bcs_before_slow_insert(mbhc->codec, false); - else - wcd937x_disable_bcs_before_slow_insert(mbhc->codec, true); -} - -static const struct wcd_mbhc_cb mbhc_cb = { - .request_irq = wcd937x_mbhc_request_irq, - .irq_control = wcd937x_mbhc_irq_control, - .free_irq = wcd937x_mbhc_free_irq, - .clk_setup = wcd937x_mbhc_clk_setup, - .map_btn_code_to_num = wcd937x_mbhc_btn_to_num, - .mbhc_bias = wcd937x_mbhc_mbhc_bias_control, - .set_btn_thr = wcd937x_mbhc_program_btn_thr, - .lock_sleep = wcd937x_mbhc_lock_sleep, - .register_notifier = wcd937x_mbhc_register_notifier, - .micbias_enable_status = wcd937x_mbhc_micb_en_status, - .hph_pa_on_status = wcd937x_mbhc_hph_pa_on_status, - .hph_pull_up_control_v2 = wcd937x_mbhc_hph_l_pull_up_control, - .mbhc_micbias_control = wcd937x_mbhc_request_micbias, - .mbhc_micb_ramp_control = wcd937x_mbhc_micb_ramp_control, - .get_hwdep_fw_cal = wcd937x_get_hwdep_fw_cal, - .mbhc_micb_ctrl_thr_mic = wcd937x_mbhc_micb_ctrl_threshold_mic, - .compute_impedance = wcd937x_wcd_mbhc_calc_impedance, - .mbhc_gnd_det_ctrl = wcd937x_mbhc_gnd_det_ctrl, - .hph_pull_down_ctrl = wcd937x_mbhc_hph_pull_down_ctrl, - .mbhc_moisture_config = wcd937x_mbhc_moisture_config, - .mbhc_get_moisture_status = wcd937x_mbhc_get_moisture_status, - .mbhc_moisture_polling_ctrl = wcd937x_mbhc_moisture_polling_ctrl, - .mbhc_moisture_detect_en = wcd937x_mbhc_moisture_detect_en, - .bcs_enable = wcd937x_mbhc_bcs_enable, -}; - -static int wcd937x_get_hph_type(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_mbhc *wcd937x_mbhc = wcd937x_soc_get_mbhc(codec); - struct wcd_mbhc *mbhc; - - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mbhc = &wcd937x_mbhc->wcd_mbhc; - - ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; - dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); - - return 0; -} - -static int wcd937x_hph_impedance_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t zl, zr; - bool hphr; - struct soc_multi_mixer_control *mc; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_mbhc *wcd937x_mbhc = wcd937x_soc_get_mbhc(codec); - - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - wcd_mbhc_get_impedance(&wcd937x_mbhc->wcd_mbhc, &zl, &zr); - dev_dbg(codec->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); - ucontrol->value.integer.value[0] = hphr ? zr : zl; - - return 0; -} - -static const struct snd_kcontrol_new hph_type_detect_controls[] = { - SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, - wcd937x_get_hph_type, NULL), -}; - -static const struct snd_kcontrol_new impedance_detect_controls[] = { - SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0, - wcd937x_hph_impedance_get, NULL), - SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0, - wcd937x_hph_impedance_get, NULL), -}; - -/* - * wcd937x_mbhc_get_impedance: get impedance of headphone - * left and right channels - * @wcd937x_mbhc: handle to struct wcd937x_mbhc * - * @zl: handle to left-ch impedance - * @zr: handle to right-ch impedance - * return 0 for success or error code in case of failure - */ -int wcd937x_mbhc_get_impedance(struct wcd937x_mbhc *wcd937x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (!wcd937x_mbhc) { - pr_err("%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - if (!zl || !zr) { - pr_err("%s: zl or zr null!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_get_impedance(&wcd937x_mbhc->wcd_mbhc, zl, zr); -} -EXPORT_SYMBOL(wcd937x_mbhc_get_impedance); - -/* - * wcd937x_mbhc_hs_detect: starts mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - * @mbhc_cfg: handle to mbhc configuration structure - * return 0 if mbhc_start is success or error code in case of failure - */ -int wcd937x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - struct wcd937x_priv *wcd937x = NULL; - struct wcd937x_mbhc *wcd937x_mbhc = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - wcd937x = snd_soc_codec_get_drvdata(codec); - if (!wcd937x) { - pr_err("%s: wcd937x is NULL\n", __func__); - return -EINVAL; - } - - wcd937x_mbhc = wcd937x->mbhc; - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_start(&wcd937x_mbhc->wcd_mbhc, mbhc_cfg); -} -EXPORT_SYMBOL(wcd937x_mbhc_hs_detect); - -/* - * wcd937x_mbhc_hs_detect_exit: stop mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - */ -void wcd937x_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = NULL; - struct wcd937x_mbhc *wcd937x_mbhc = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - wcd937x = snd_soc_codec_get_drvdata(codec); - if (!wcd937x) { - pr_err("%s: wcd937x is NULL\n", __func__); - return; - } - - wcd937x_mbhc = wcd937x->mbhc; - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return; - } - wcd_mbhc_stop(&wcd937x_mbhc->wcd_mbhc); -} -EXPORT_SYMBOL(wcd937x_mbhc_hs_detect_exit); - -/* - * wcd937x_mbhc_ssr_down: stop mbhc during - * wcd937x subsystem restart - * @mbhc: pointer to wcd937x_mbhc structure - * @component: handle to snd_soc_component * - */ -void wcd937x_mbhc_ssr_down(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - struct wcd_mbhc *wcd_mbhc = NULL; - - if (!mbhc || !codec) - return; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - dev_err(codec->dev, "%s: wcd_mbhc is NULL\n", __func__); - return; - } - - wcd937x_mbhc_hs_detect_exit(codec); - wcd_mbhc_deinit(wcd_mbhc); -} -EXPORT_SYMBOL(wcd937x_mbhc_ssr_down); - -/* - * wcd937x_mbhc_post_ssr_init: initialize mbhc for - * wcd937x post subsystem restart - * @mbhc: poniter to wcd937x_mbhc structure - * @codec: handle to snd_soc_codec * - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int wcd937x_mbhc_post_ssr_init(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - int ret = 0; - struct wcd_mbhc *wcd_mbhc = NULL; - - if (!mbhc || !codec) - return -EINVAL; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - return -EINVAL; - } - - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x20, 0x20); - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, WCD937X_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(wcd937x_mbhc_post_ssr_init); - -/* - * wcd937x_mbhc_init: initialize mbhc for wcd937x - * @mbhc: poniter to wcd937x_mbhc struct pointer to store the configs - * @codec: handle to snd_soc_codec * - * @fw_data: handle to firmware data - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc, struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - struct wcd937x_mbhc *wcd937x_mbhc = NULL; - struct wcd_mbhc *wcd_mbhc = NULL; - struct wcd937x_pdata *pdata; - int ret = 0; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - wcd937x_mbhc = devm_kzalloc(codec->dev, sizeof(struct wcd937x_mbhc), - GFP_KERNEL); - if (!wcd937x_mbhc) - return -ENOMEM; - - wcd937x_mbhc->fw_data = fw_data; - BLOCKING_INIT_NOTIFIER_HEAD(&wcd937x_mbhc->notifier); - wcd_mbhc = &wcd937x_mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - - /* Setting default mbhc detection logic to ADC */ - wcd_mbhc->mbhc_detection_logic = WCD_DETECTION_ADC; - - pdata = dev_get_platdata(codec->dev); - if (!pdata) { - dev_err(codec->dev, "%s: pdata pointer is NULL\n", - __func__); - ret = -EINVAL; - goto err; - } - wcd_mbhc->micb_mv = pdata->micbias.micb2_mv; - - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, - &intr_ids, wcd_mbhc_registers, - WCD937X_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto err; - } - - (*mbhc) = wcd937x_mbhc; - snd_soc_add_codec_controls(codec, impedance_detect_controls, - ARRAY_SIZE(impedance_detect_controls)); - snd_soc_add_codec_controls(codec, hph_type_detect_controls, - ARRAY_SIZE(hph_type_detect_controls)); - - return 0; -err: - devm_kfree(codec->dev, wcd937x_mbhc); - return ret; -} -EXPORT_SYMBOL(wcd937x_mbhc_init); - -/* - * wcd937x_mbhc_deinit: deinitialize mbhc for wcd937x - * @codec: handle to snd_soc_codec * - */ -void wcd937x_mbhc_deinit(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x; - struct wcd937x_mbhc *wcd937x_mbhc; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - wcd937x = snd_soc_codec_get_drvdata(codec); - if (!wcd937x) { - pr_err("%s: wcd937x is NULL\n", __func__); - return; - } - - wcd937x_mbhc = wcd937x->mbhc; - if (wcd937x_mbhc) { - wcd_mbhc_deinit(&wcd937x_mbhc->wcd_mbhc); - devm_kfree(codec->dev, wcd937x_mbhc); - } -} -EXPORT_SYMBOL(wcd937x_mbhc_deinit); diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.h b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.h deleted file mode 100644 index e70d4b612bf2..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-mbhc.h +++ /dev/null @@ -1,66 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD937X_MBHC_H__ -#define __WCD937X_MBHC_H__ -#include - -struct wcd937x_mbhc { - struct wcd_mbhc wcd_mbhc; - struct blocking_notifier_head notifier; - struct fw_info *fw_data; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD937X) -extern int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data); -extern void wcd937x_mbhc_hs_detect_exit(struct snd_soc_codec *codec); -extern int wcd937x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg); -extern void wcd937x_mbhc_deinit(struct snd_soc_codec *codec); -extern int wcd937x_mbhc_post_ssr_init(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec); -extern void wcd937x_mbhc_ssr_down(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec); -extern int wcd937x_mbhc_get_impedance(struct wcd937x_mbhc *wcd937x_mbhc, - uint32_t *zl, uint32_t *zr); -#else -static inline int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - return 0; -} -static inline void wcd937x_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ -} -static inline int wcd937x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline void wcd937x_mbhc_deinit(struct snd_soc_codec *codec) -{ -} -static inline int wcd937x_mbhc_post_ssr_init(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - return 0; -} -static inline void wcd937x_mbhc_ssr_down(struct wcd937x_mbhc *mbhc, - struct snd_soc_component *component) -{ -} -static inline int wcd937x_mbhc_get_impedance(struct wcd937x_mbhc *wcd937x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (zl) - *zl = 0; - if (zr) - *zr = 0; - return -EINVAL; -} -#endif - -#endif /* __WCD937X_MBHC_H__ */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-registers.h b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-registers.h deleted file mode 100644 index f2c914f15592..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-registers.h +++ /dev/null @@ -1,438 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD937X_REGISTERS_H -#define _WCD937X_REGISTERS_H - -#define WCD937X_BASE_ADDRESS 0x3000 - -#define WCD937X_REG(reg) (reg - WCD937X_BASE_ADDRESS) - -enum { - REG_NO_ACCESS, - RD_REG, - WR_REG, - RD_WR_REG -}; - -#define WCD937X_ANA_BIAS (WCD937X_BASE_ADDRESS+0x001) -#define WCD937X_ANA_RX_SUPPLIES (WCD937X_BASE_ADDRESS+0x008) -#define WCD937X_ANA_HPH (WCD937X_BASE_ADDRESS+0x009) -#define WCD937X_ANA_EAR (WCD937X_BASE_ADDRESS+0x00A) -#define WCD937X_ANA_EAR_COMPANDER_CTL (WCD937X_BASE_ADDRESS+0x00B) -#define WCD937X_ANA_TX_CH1 (WCD937X_BASE_ADDRESS+0x00E) -#define WCD937X_ANA_TX_CH2 (WCD937X_BASE_ADDRESS+0x00F) -#define WCD937X_ANA_TX_CH3 (WCD937X_BASE_ADDRESS+0x010) -#define WCD937X_ANA_TX_CH3_HPF (WCD937X_BASE_ADDRESS+0x011) -#define WCD937X_ANA_MICB1_MICB2_DSP_EN_LOGIC (WCD937X_BASE_ADDRESS+0x012) -#define WCD937X_ANA_MICB3_DSP_EN_LOGIC (WCD937X_BASE_ADDRESS+0x013) -#define WCD937X_ANA_MBHC_MECH (WCD937X_BASE_ADDRESS+0x014) -#define WCD937X_ANA_MBHC_ELECT (WCD937X_BASE_ADDRESS+0x015) -#define WCD937X_ANA_MBHC_ZDET (WCD937X_BASE_ADDRESS+0x016) -#define WCD937X_ANA_MBHC_RESULT_1 (WCD937X_BASE_ADDRESS+0x017) -#define WCD937X_ANA_MBHC_RESULT_2 (WCD937X_BASE_ADDRESS+0x018) -#define WCD937X_ANA_MBHC_RESULT_3 (WCD937X_BASE_ADDRESS+0x019) -#define WCD937X_ANA_MBHC_BTN0 (WCD937X_BASE_ADDRESS+0x01A) -#define WCD937X_ANA_MBHC_BTN1 (WCD937X_BASE_ADDRESS+0x01B) -#define WCD937X_ANA_MBHC_BTN2 (WCD937X_BASE_ADDRESS+0x01C) -#define WCD937X_ANA_MBHC_BTN3 (WCD937X_BASE_ADDRESS+0x01D) -#define WCD937X_ANA_MBHC_BTN4 (WCD937X_BASE_ADDRESS+0x01E) -#define WCD937X_ANA_MBHC_BTN5 (WCD937X_BASE_ADDRESS+0x01F) -#define WCD937X_ANA_MBHC_BTN6 (WCD937X_BASE_ADDRESS+0x020) -#define WCD937X_ANA_MBHC_BTN7 (WCD937X_BASE_ADDRESS+0x021) -#define WCD937X_ANA_MICB1 (WCD937X_BASE_ADDRESS+0x022) -#define WCD937X_ANA_MICB2 (WCD937X_BASE_ADDRESS+0x023) -#define WCD937X_ANA_MICB2_RAMP (WCD937X_BASE_ADDRESS+0x024) -#define WCD937X_ANA_MICB3 (WCD937X_BASE_ADDRESS+0x025) -#define WCD937X_BIAS_CTL (WCD937X_BASE_ADDRESS+0x028) -#define WCD937X_BIAS_VBG_FINE_ADJ (WCD937X_BASE_ADDRESS+0x029) -#define WCD937X_LDOL_VDDCX_ADJUST (WCD937X_BASE_ADDRESS+0x040) -#define WCD937X_LDOL_DISABLE_LDOL (WCD937X_BASE_ADDRESS+0x041) -#define WCD937X_MBHC_CTL_CLK (WCD937X_BASE_ADDRESS+0x056) -#define WCD937X_MBHC_CTL_ANA (WCD937X_BASE_ADDRESS+0x057) -#define WCD937X_MBHC_CTL_SPARE_1 (WCD937X_BASE_ADDRESS+0x058) -#define WCD937X_MBHC_CTL_SPARE_2 (WCD937X_BASE_ADDRESS+0x059) -#define WCD937X_MBHC_CTL_BCS (WCD937X_BASE_ADDRESS+0x05A) -#define WCD937X_MBHC_MOISTURE_DET_FSM_STATUS (WCD937X_BASE_ADDRESS+0x05B) -#define WCD937X_MBHC_TEST_CTL (WCD937X_BASE_ADDRESS+0x05C) -#define WCD937X_LDOH_MODE (WCD937X_BASE_ADDRESS+0x067) -#define WCD937X_LDOH_BIAS (WCD937X_BASE_ADDRESS+0x068) -#define WCD937X_LDOH_STB_LOADS (WCD937X_BASE_ADDRESS+0x069) -#define WCD937X_LDOH_SLOWRAMP (WCD937X_BASE_ADDRESS+0x06A) -#define WCD937X_MICB1_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x06B) -#define WCD937X_MICB1_TEST_CTL_2 (WCD937X_BASE_ADDRESS+0x06C) -#define WCD937X_MICB1_TEST_CTL_3 (WCD937X_BASE_ADDRESS+0x06D) -#define WCD937X_MICB2_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x06E) -#define WCD937X_MICB2_TEST_CTL_2 (WCD937X_BASE_ADDRESS+0x06F) -#define WCD937X_MICB2_TEST_CTL_3 (WCD937X_BASE_ADDRESS+0x070) -#define WCD937X_MICB3_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x071) -#define WCD937X_MICB3_TEST_CTL_2 (WCD937X_BASE_ADDRESS+0x072) -#define WCD937X_MICB3_TEST_CTL_3 (WCD937X_BASE_ADDRESS+0x073) -#define WCD937X_TX_COM_ADC_VCM (WCD937X_BASE_ADDRESS+0x077) -#define WCD937X_TX_COM_BIAS_ATEST (WCD937X_BASE_ADDRESS+0x078) -#define WCD937X_TX_COM_ADC_INT1_IB (WCD937X_BASE_ADDRESS+0x079) -#define WCD937X_TX_COM_ADC_INT2_IB (WCD937X_BASE_ADDRESS+0x07A) -#define WCD937X_TX_COM_TXFE_DIV_CTL (WCD937X_BASE_ADDRESS+0x07B) -#define WCD937X_TX_COM_TXFE_DIV_START (WCD937X_BASE_ADDRESS+0x07C) -#define WCD937X_TX_COM_TXFE_DIV_STOP_9P6M (WCD937X_BASE_ADDRESS+0x07D) -#define WCD937X_TX_COM_TXFE_DIV_STOP_12P288M (WCD937X_BASE_ADDRESS+0x07E) -#define WCD937X_TX_1_2_TEST_EN (WCD937X_BASE_ADDRESS+0x07F) -#define WCD937X_TX_1_2_ADC_IB (WCD937X_BASE_ADDRESS+0x080) -#define WCD937X_TX_1_2_ATEST_REFCTL (WCD937X_BASE_ADDRESS+0x081) -#define WCD937X_TX_1_2_TEST_CTL (WCD937X_BASE_ADDRESS+0x082) -#define WCD937X_TX_1_2_TEST_BLK_EN (WCD937X_BASE_ADDRESS+0x083) -#define WCD937X_TX_1_2_TXFE_CLKDIV (WCD937X_BASE_ADDRESS+0x084) -#define WCD937X_TX_1_2_SAR2_ERR (WCD937X_BASE_ADDRESS+0x085) -#define WCD937X_TX_1_2_SAR1_ERR (WCD937X_BASE_ADDRESS+0x086) -#define WCD937X_TX_3_TEST_EN (WCD937X_BASE_ADDRESS+0x087) -#define WCD937X_TX_3_ADC_IB (WCD937X_BASE_ADDRESS+0x088) -#define WCD937X_TX_3_ATEST_REFCTL (WCD937X_BASE_ADDRESS+0x089) -#define WCD937X_TX_3_TEST_CTL (WCD937X_BASE_ADDRESS+0x08A) -#define WCD937X_TX_3_TEST_BLK_EN (WCD937X_BASE_ADDRESS+0x08B) -#define WCD937X_TX_3_TXFE_CLKDIV (WCD937X_BASE_ADDRESS+0x08C) -#define WCD937X_TX_3_SPARE_MONO (WCD937X_BASE_ADDRESS+0x08D) -#define WCD937X_TX_3_SAR1_ERR (WCD937X_BASE_ADDRESS+0x08E) -#define WCD937X_CLASSH_MODE_1 (WCD937X_BASE_ADDRESS+0x097) -#define WCD937X_CLASSH_MODE_2 (WCD937X_BASE_ADDRESS+0x098) -#define WCD937X_CLASSH_MODE_3 (WCD937X_BASE_ADDRESS+0x099) -#define WCD937X_CLASSH_CTRL_VCL_1 (WCD937X_BASE_ADDRESS+0x09A) -#define WCD937X_CLASSH_CTRL_VCL_2 (WCD937X_BASE_ADDRESS+0x09B) -#define WCD937X_CLASSH_CTRL_CCL_1 (WCD937X_BASE_ADDRESS+0x09C) -#define WCD937X_CLASSH_CTRL_CCL_2 (WCD937X_BASE_ADDRESS+0x09D) -#define WCD937X_CLASSH_CTRL_CCL_3 (WCD937X_BASE_ADDRESS+0x09E) -#define WCD937X_CLASSH_CTRL_CCL_4 (WCD937X_BASE_ADDRESS+0x09F) -#define WCD937X_CLASSH_CTRL_CCL_5 (WCD937X_BASE_ADDRESS+0x0A0) -#define WCD937X_CLASSH_BUCK_TMUX_A_D (WCD937X_BASE_ADDRESS+0x0A1) -#define WCD937X_CLASSH_BUCK_SW_DRV_CNTL (WCD937X_BASE_ADDRESS+0x0A2) -#define WCD937X_CLASSH_SPARE (WCD937X_BASE_ADDRESS+0x0A3) -#define WCD937X_FLYBACK_EN (WCD937X_BASE_ADDRESS+0x0A4) -#define WCD937X_FLYBACK_VNEG_CTRL_1 (WCD937X_BASE_ADDRESS+0x0A5) -#define WCD937X_FLYBACK_VNEG_CTRL_2 (WCD937X_BASE_ADDRESS+0x0A6) -#define WCD937X_FLYBACK_VNEG_CTRL_3 (WCD937X_BASE_ADDRESS+0x0A7) -#define WCD937X_FLYBACK_VNEG_CTRL_4 (WCD937X_BASE_ADDRESS+0x0A8) -#define WCD937X_FLYBACK_VNEG_CTRL_5 (WCD937X_BASE_ADDRESS+0x0A9) -#define WCD937X_FLYBACK_VNEG_CTRL_6 (WCD937X_BASE_ADDRESS+0x0AA) -#define WCD937X_FLYBACK_VNEG_CTRL_7 (WCD937X_BASE_ADDRESS+0x0AB) -#define WCD937X_FLYBACK_VNEG_CTRL_8 (WCD937X_BASE_ADDRESS+0x0AC) -#define WCD937X_FLYBACK_VNEG_CTRL_9 (WCD937X_BASE_ADDRESS+0x0AD) -#define WCD937X_FLYBACK_VNEGDAC_CTRL_1 (WCD937X_BASE_ADDRESS+0x0AE) -#define WCD937X_FLYBACK_VNEGDAC_CTRL_2 (WCD937X_BASE_ADDRESS+0x0AF) -#define WCD937X_FLYBACK_VNEGDAC_CTRL_3 (WCD937X_BASE_ADDRESS+0x0B0) -#define WCD937X_FLYBACK_CTRL_1 (WCD937X_BASE_ADDRESS+0x0B1) -#define WCD937X_FLYBACK_TEST_CTL (WCD937X_BASE_ADDRESS+0x0B2) -#define WCD937X_RX_AUX_SW_CTL (WCD937X_BASE_ADDRESS+0x0B3) -#define WCD937X_RX_PA_AUX_IN_CONN (WCD937X_BASE_ADDRESS+0x0B4) -#define WCD937X_RX_TIMER_DIV (WCD937X_BASE_ADDRESS+0x0B5) -#define WCD937X_RX_OCP_CTL (WCD937X_BASE_ADDRESS+0x0B6) -#define WCD937X_RX_OCP_COUNT (WCD937X_BASE_ADDRESS+0x0B7) -#define WCD937X_RX_BIAS_EAR_DAC (WCD937X_BASE_ADDRESS+0x0B8) -#define WCD937X_RX_BIAS_EAR_AMP (WCD937X_BASE_ADDRESS+0x0B9) -#define WCD937X_RX_BIAS_HPH_LDO (WCD937X_BASE_ADDRESS+0x0BA) -#define WCD937X_RX_BIAS_HPH_PA (WCD937X_BASE_ADDRESS+0x0BB) -#define WCD937X_RX_BIAS_HPH_RDACBUFF_CNP2 (WCD937X_BASE_ADDRESS+0x0BC) -#define WCD937X_RX_BIAS_HPH_RDAC_LDO (WCD937X_BASE_ADDRESS+0x0BD) -#define WCD937X_RX_BIAS_HPH_CNP1 (WCD937X_BASE_ADDRESS+0x0BE) -#define WCD937X_RX_BIAS_HPH_LOWPOWER (WCD937X_BASE_ADDRESS+0x0BF) -#define WCD937X_RX_BIAS_AUX_DAC (WCD937X_BASE_ADDRESS+0x0C0) -#define WCD937X_RX_BIAS_AUX_AMP (WCD937X_BASE_ADDRESS+0x0C1) -#define WCD937X_RX_BIAS_VNEGDAC_BLEEDER (WCD937X_BASE_ADDRESS+0x0C2) -#define WCD937X_RX_BIAS_MISC (WCD937X_BASE_ADDRESS+0x0C3) -#define WCD937X_RX_BIAS_BUCK_RST (WCD937X_BASE_ADDRESS+0x0C4) -#define WCD937X_RX_BIAS_BUCK_VREF_ERRAMP (WCD937X_BASE_ADDRESS+0x0C5) -#define WCD937X_RX_BIAS_FLYB_ERRAMP (WCD937X_BASE_ADDRESS+0x0C6) -#define WCD937X_RX_BIAS_FLYB_BUFF (WCD937X_BASE_ADDRESS+0x0C7) -#define WCD937X_RX_BIAS_FLYB_MID_RST (WCD937X_BASE_ADDRESS+0x0C8) -#define WCD937X_HPH_L_STATUS (WCD937X_BASE_ADDRESS+0x0C9) -#define WCD937X_HPH_R_STATUS (WCD937X_BASE_ADDRESS+0x0CA) -#define WCD937X_HPH_CNP_EN (WCD937X_BASE_ADDRESS+0x0CB) -#define WCD937X_HPH_CNP_WG_CTL (WCD937X_BASE_ADDRESS+0x0CC) -#define WCD937X_HPH_CNP_WG_TIME (WCD937X_BASE_ADDRESS+0x0CD) -#define WCD937X_HPH_OCP_CTL (WCD937X_BASE_ADDRESS+0x0CE) -#define WCD937X_HPH_AUTO_CHOP (WCD937X_BASE_ADDRESS+0x0CF) -#define WCD937X_HPH_CHOP_CTL (WCD937X_BASE_ADDRESS+0x0D0) -#define WCD937X_HPH_PA_CTL1 (WCD937X_BASE_ADDRESS+0x0D1) -#define WCD937X_HPH_PA_CTL2 (WCD937X_BASE_ADDRESS+0x0D2) -#define WCD937X_HPH_L_EN (WCD937X_BASE_ADDRESS+0x0D3) -#define WCD937X_HPH_L_TEST (WCD937X_BASE_ADDRESS+0x0D4) -#define WCD937X_HPH_L_ATEST (WCD937X_BASE_ADDRESS+0x0D5) -#define WCD937X_HPH_R_EN (WCD937X_BASE_ADDRESS+0x0D6) -#define WCD937X_HPH_R_TEST (WCD937X_BASE_ADDRESS+0x0D7) -#define WCD937X_HPH_R_ATEST (WCD937X_BASE_ADDRESS+0x0D8) -#define WCD937X_HPH_RDAC_CLK_CTL1 (WCD937X_BASE_ADDRESS+0x0D9) -#define WCD937X_HPH_RDAC_CLK_CTL2 (WCD937X_BASE_ADDRESS+0x0DA) -#define WCD937X_HPH_RDAC_LDO_CTL (WCD937X_BASE_ADDRESS+0x0DB) -#define WCD937X_HPH_RDAC_CHOP_CLK_LP_CTL (WCD937X_BASE_ADDRESS+0x0DC) -#define WCD937X_HPH_REFBUFF_UHQA_CTL (WCD937X_BASE_ADDRESS+0x0DD) -#define WCD937X_HPH_REFBUFF_LP_CTL (WCD937X_BASE_ADDRESS+0x0DE) -#define WCD937X_HPH_L_DAC_CTL (WCD937X_BASE_ADDRESS+0x0DF) -#define WCD937X_HPH_R_DAC_CTL (WCD937X_BASE_ADDRESS+0x0E0) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_COMP_SEL (WCD937X_BASE_ADDRESS+0x0E1) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_EN (WCD937X_BASE_ADDRESS+0x0E2) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_MISC1 (WCD937X_BASE_ADDRESS+0x0E3) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_STATUS (WCD937X_BASE_ADDRESS+0x0E4) -#define WCD937X_EAR_EAR_EN_REG (WCD937X_BASE_ADDRESS+0x0E9) -#define WCD937X_EAR_EAR_PA_CON (WCD937X_BASE_ADDRESS+0x0EA) -#define WCD937X_EAR_EAR_SP_CON (WCD937X_BASE_ADDRESS+0x0EB) -#define WCD937X_EAR_EAR_DAC_CON (WCD937X_BASE_ADDRESS+0x0EC) -#define WCD937X_EAR_EAR_CNP_FSM_CON (WCD937X_BASE_ADDRESS+0x0ED) -#define WCD937X_EAR_TEST_CTL (WCD937X_BASE_ADDRESS+0x0EE) -#define WCD937X_EAR_STATUS_REG_1 (WCD937X_BASE_ADDRESS+0x0EF) -#define WCD937X_EAR_STATUS_REG_2 (WCD937X_BASE_ADDRESS+0x0F0) -#define WCD937X_ANA_NEW_PAGE_REGISTER (WCD937X_BASE_ADDRESS+0x100) -#define WCD937X_HPH_NEW_ANA_HPH2 (WCD937X_BASE_ADDRESS+0x101) -#define WCD937X_HPH_NEW_ANA_HPH3 (WCD937X_BASE_ADDRESS+0x102) -#define WCD937X_SLEEP_CTL (WCD937X_BASE_ADDRESS+0x103) -#define WCD937X_SLEEP_WATCHDOG_CTL (WCD937X_BASE_ADDRESS+0x104) -#define WCD937X_MBHC_NEW_ELECT_REM_CLAMP_CTL (WCD937X_BASE_ADDRESS+0x11F) -#define WCD937X_MBHC_NEW_CTL_1 (WCD937X_BASE_ADDRESS+0x120) -#define WCD937X_MBHC_NEW_CTL_2 (WCD937X_BASE_ADDRESS+0x121) -#define WCD937X_MBHC_NEW_PLUG_DETECT_CTL (WCD937X_BASE_ADDRESS+0x122) -#define WCD937X_MBHC_NEW_ZDET_ANA_CTL (WCD937X_BASE_ADDRESS+0x123) -#define WCD937X_MBHC_NEW_ZDET_RAMP_CTL (WCD937X_BASE_ADDRESS+0x124) -#define WCD937X_MBHC_NEW_FSM_STATUS (WCD937X_BASE_ADDRESS+0x125) -#define WCD937X_MBHC_NEW_ADC_RESULT (WCD937X_BASE_ADDRESS+0x126) -#define WCD937X_TX_NEW_TX_CH2_SEL (WCD937X_BASE_ADDRESS+0x127) -#define WCD937X_AUX_AUXPA (WCD937X_BASE_ADDRESS+0x128) -#define WCD937X_LDORXTX_MODE (WCD937X_BASE_ADDRESS+0x129) -#define WCD937X_LDORXTX_CONFIG (WCD937X_BASE_ADDRESS+0x12A) -#define WCD937X_DIE_CRACK_DIE_CRK_DET_EN (WCD937X_BASE_ADDRESS+0x12C) -#define WCD937X_DIE_CRACK_DIE_CRK_DET_OUT (WCD937X_BASE_ADDRESS+0x12D) -#define WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL (WCD937X_BASE_ADDRESS+0x132) -#define WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L (WCD937X_BASE_ADDRESS+0x133) -#define WCD937X_HPH_NEW_INT_RDAC_VREF_CTL (WCD937X_BASE_ADDRESS+0x134) -#define WCD937X_HPH_NEW_INT_RDAC_OVERRIDE_CTL (WCD937X_BASE_ADDRESS+0x135) -#define WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R (WCD937X_BASE_ADDRESS+0x136) -#define WCD937X_HPH_NEW_INT_PA_MISC1 (WCD937X_BASE_ADDRESS+0x137) -#define WCD937X_HPH_NEW_INT_PA_MISC2 (WCD937X_BASE_ADDRESS+0x138) -#define WCD937X_HPH_NEW_INT_PA_RDAC_MISC (WCD937X_BASE_ADDRESS+0x139) -#define WCD937X_HPH_NEW_INT_HPH_TIMER1 (WCD937X_BASE_ADDRESS+0x13A) -#define WCD937X_HPH_NEW_INT_HPH_TIMER2 (WCD937X_BASE_ADDRESS+0x13B) -#define WCD937X_HPH_NEW_INT_HPH_TIMER3 (WCD937X_BASE_ADDRESS+0x13C) -#define WCD937X_HPH_NEW_INT_HPH_TIMER4 (WCD937X_BASE_ADDRESS+0x13D) -#define WCD937X_HPH_NEW_INT_PA_RDAC_MISC2 (WCD937X_BASE_ADDRESS+0x13E) -#define WCD937X_HPH_NEW_INT_PA_RDAC_MISC3 (WCD937X_BASE_ADDRESS+0x13F) -#define WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI (WCD937X_BASE_ADDRESS+0x145) -#define WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_ULP (WCD937X_BASE_ADDRESS+0x146) -#define WCD937X_RX_NEW_INT_HPH_RDAC_LDO_LP (WCD937X_BASE_ADDRESS+0x147) -#define WCD937X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL (WCD937X_BASE_ADDRESS+0x1AF) -#define WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL \ - (WCD937X_BASE_ADDRESS+0x1B0) -#define WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT (WCD937X_BASE_ADDRESS+0x1B1) -#define WCD937X_MBHC_NEW_INT_SPARE_2 (WCD937X_BASE_ADDRESS+0x1B2) -#define WCD937X_EAR_INT_NEW_EAR_CHOPPER_CON (WCD937X_BASE_ADDRESS+0x1B7) -#define WCD937X_EAR_INT_NEW_CNP_VCM_CON1 (WCD937X_BASE_ADDRESS+0x1B8) -#define WCD937X_EAR_INT_NEW_CNP_VCM_CON2 (WCD937X_BASE_ADDRESS+0x1B9) -#define WCD937X_EAR_INT_NEW_EAR_DYNAMIC_BIAS (WCD937X_BASE_ADDRESS+0x1BA) -#define WCD937X_AUX_INT_EN_REG (WCD937X_BASE_ADDRESS+0x1BD) -#define WCD937X_AUX_INT_PA_CTRL (WCD937X_BASE_ADDRESS+0x1BE) -#define WCD937X_AUX_INT_SP_CTRL (WCD937X_BASE_ADDRESS+0x1BF) -#define WCD937X_AUX_INT_DAC_CTRL (WCD937X_BASE_ADDRESS+0x1C0) -#define WCD937X_AUX_INT_CLK_CTRL (WCD937X_BASE_ADDRESS+0x1C1) -#define WCD937X_AUX_INT_TEST_CTRL (WCD937X_BASE_ADDRESS+0x1C2) -#define WCD937X_AUX_INT_STATUS_REG (WCD937X_BASE_ADDRESS+0x1C3) -#define WCD937X_AUX_INT_MISC (WCD937X_BASE_ADDRESS+0x1C4) -#define WCD937X_LDORXTX_INT_BIAS (WCD937X_BASE_ADDRESS+0x1C5) -#define WCD937X_LDORXTX_INT_STB_LOADS_DTEST (WCD937X_BASE_ADDRESS+0x1C6) -#define WCD937X_LDORXTX_INT_TEST0 (WCD937X_BASE_ADDRESS+0x1C7) -#define WCD937X_LDORXTX_INT_STARTUP_TIMER (WCD937X_BASE_ADDRESS+0x1C8) -#define WCD937X_LDORXTX_INT_TEST1 (WCD937X_BASE_ADDRESS+0x1C9) -#define WCD937X_LDORXTX_INT_STATUS (WCD937X_BASE_ADDRESS+0x1CA) -#define WCD937X_SLEEP_INT_WATCHDOG_CTL_1 (WCD937X_BASE_ADDRESS+0x1D0) -#define WCD937X_SLEEP_INT_WATCHDOG_CTL_2 (WCD937X_BASE_ADDRESS+0x1D1) -#define WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT1 (WCD937X_BASE_ADDRESS+0x1D3) -#define WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT2 (WCD937X_BASE_ADDRESS+0x1D4) -#define WCD937X_DIGITAL_PAGE_REGISTER (WCD937X_BASE_ADDRESS+0x400) -#define WCD937X_DIGITAL_CHIP_ID0 (WCD937X_BASE_ADDRESS+0x401) -#define WCD937X_DIGITAL_CHIP_ID1 (WCD937X_BASE_ADDRESS+0x402) -#define WCD937X_DIGITAL_CHIP_ID2 (WCD937X_BASE_ADDRESS+0x403) -#define WCD937X_DIGITAL_CHIP_ID3 (WCD937X_BASE_ADDRESS+0x404) -#define WCD937X_DIGITAL_CDC_RST_CTL (WCD937X_BASE_ADDRESS+0x406) -#define WCD937X_DIGITAL_TOP_CLK_CFG (WCD937X_BASE_ADDRESS+0x407) -#define WCD937X_DIGITAL_CDC_ANA_CLK_CTL (WCD937X_BASE_ADDRESS+0x408) -#define WCD937X_DIGITAL_CDC_DIG_CLK_CTL (WCD937X_BASE_ADDRESS+0x409) -#define WCD937X_DIGITAL_SWR_RST_EN (WCD937X_BASE_ADDRESS+0x40A) -#define WCD937X_DIGITAL_CDC_PATH_MODE (WCD937X_BASE_ADDRESS+0x40B) -#define WCD937X_DIGITAL_CDC_RX_RST (WCD937X_BASE_ADDRESS+0x40C) -#define WCD937X_DIGITAL_CDC_RX0_CTL (WCD937X_BASE_ADDRESS+0x40D) -#define WCD937X_DIGITAL_CDC_RX1_CTL (WCD937X_BASE_ADDRESS+0x40E) -#define WCD937X_DIGITAL_CDC_RX2_CTL (WCD937X_BASE_ADDRESS+0x40F) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA0 (WCD937X_BASE_ADDRESS+0x410) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA1 (WCD937X_BASE_ADDRESS+0x411) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA2 (WCD937X_BASE_ADDRESS+0x412) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA3 (WCD937X_BASE_ADDRESS+0x413) -#define WCD937X_DIGITAL_CDC_COMP_CTL_0 (WCD937X_BASE_ADDRESS+0x414) -#define WCD937X_DIGITAL_CDC_RX_DELAY_CTL (WCD937X_BASE_ADDRESS+0x417) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A1_0 (WCD937X_BASE_ADDRESS+0x418) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A1_1 (WCD937X_BASE_ADDRESS+0x419) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A2_0 (WCD937X_BASE_ADDRESS+0x41A) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A2_1 (WCD937X_BASE_ADDRESS+0x41B) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A3_0 (WCD937X_BASE_ADDRESS+0x41C) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A3_1 (WCD937X_BASE_ADDRESS+0x41D) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A4_0 (WCD937X_BASE_ADDRESS+0x41E) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A4_1 (WCD937X_BASE_ADDRESS+0x41F) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A5_0 (WCD937X_BASE_ADDRESS+0x420) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A5_1 (WCD937X_BASE_ADDRESS+0x421) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A6_0 (WCD937X_BASE_ADDRESS+0x422) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A7_0 (WCD937X_BASE_ADDRESS+0x423) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_0 (WCD937X_BASE_ADDRESS+0x424) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_1 (WCD937X_BASE_ADDRESS+0x425) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_2 (WCD937X_BASE_ADDRESS+0x426) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_3 (WCD937X_BASE_ADDRESS+0x427) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R1 (WCD937X_BASE_ADDRESS+0x428) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R2 (WCD937X_BASE_ADDRESS+0x429) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R3 (WCD937X_BASE_ADDRESS+0x42A) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R4 (WCD937X_BASE_ADDRESS+0x42B) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R5 (WCD937X_BASE_ADDRESS+0x42C) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R6 (WCD937X_BASE_ADDRESS+0x42D) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R7 (WCD937X_BASE_ADDRESS+0x42E) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A1_0 (WCD937X_BASE_ADDRESS+0x42F) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A1_1 (WCD937X_BASE_ADDRESS+0x430) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A2_0 (WCD937X_BASE_ADDRESS+0x431) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A2_1 (WCD937X_BASE_ADDRESS+0x432) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A3_0 (WCD937X_BASE_ADDRESS+0x433) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A3_1 (WCD937X_BASE_ADDRESS+0x434) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A4_0 (WCD937X_BASE_ADDRESS+0x435) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A4_1 (WCD937X_BASE_ADDRESS+0x436) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A5_0 (WCD937X_BASE_ADDRESS+0x437) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A5_1 (WCD937X_BASE_ADDRESS+0x438) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A6_0 (WCD937X_BASE_ADDRESS+0x439) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A7_0 (WCD937X_BASE_ADDRESS+0x43A) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_0 (WCD937X_BASE_ADDRESS+0x43B) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_1 (WCD937X_BASE_ADDRESS+0x43C) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_2 (WCD937X_BASE_ADDRESS+0x43D) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_3 (WCD937X_BASE_ADDRESS+0x43E) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R1 (WCD937X_BASE_ADDRESS+0x43F) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R2 (WCD937X_BASE_ADDRESS+0x440) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R3 (WCD937X_BASE_ADDRESS+0x441) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R4 (WCD937X_BASE_ADDRESS+0x442) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R5 (WCD937X_BASE_ADDRESS+0x443) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R6 (WCD937X_BASE_ADDRESS+0x444) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R7 (WCD937X_BASE_ADDRESS+0x445) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_RX_0 (WCD937X_BASE_ADDRESS+0x446) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_RX_1 (WCD937X_BASE_ADDRESS+0x447) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_0 (WCD937X_BASE_ADDRESS+0x448) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_1 (WCD937X_BASE_ADDRESS+0x449) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_2 (WCD937X_BASE_ADDRESS+0x44A) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_0 (WCD937X_BASE_ADDRESS+0x44B) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_1 (WCD937X_BASE_ADDRESS+0x44C) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_2 (WCD937X_BASE_ADDRESS+0x44D) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_CTL (WCD937X_BASE_ADDRESS+0x44E) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_CTL (WCD937X_BASE_ADDRESS+0x44F) -#define WCD937X_DIGITAL_CDC_EAR_PATH_CTL (WCD937X_BASE_ADDRESS+0x450) -#define WCD937X_DIGITAL_CDC_SWR_CLH (WCD937X_BASE_ADDRESS+0x451) -#define WCD937X_DIGITAL_SWR_CLH_BYP (WCD937X_BASE_ADDRESS+0x452) -#define WCD937X_DIGITAL_CDC_TX0_CTL (WCD937X_BASE_ADDRESS+0x453) -#define WCD937X_DIGITAL_CDC_TX1_CTL (WCD937X_BASE_ADDRESS+0x454) -#define WCD937X_DIGITAL_CDC_TX2_CTL (WCD937X_BASE_ADDRESS+0x455) -#define WCD937X_DIGITAL_CDC_TX_RST (WCD937X_BASE_ADDRESS+0x456) -#define WCD937X_DIGITAL_CDC_REQ_CTL (WCD937X_BASE_ADDRESS+0x457) -#define WCD937X_DIGITAL_CDC_AMIC_CTL (WCD937X_BASE_ADDRESS+0x45A) -#define WCD937X_DIGITAL_CDC_DMIC_CTL (WCD937X_BASE_ADDRESS+0x45B) -#define WCD937X_DIGITAL_CDC_DMIC1_CTL (WCD937X_BASE_ADDRESS+0x45C) -#define WCD937X_DIGITAL_CDC_DMIC2_CTL (WCD937X_BASE_ADDRESS+0x45D) -#define WCD937X_DIGITAL_CDC_DMIC3_CTL (WCD937X_BASE_ADDRESS+0x45E) -#define WCD937X_DIGITAL_EFUSE_CTL (WCD937X_BASE_ADDRESS+0x45F) -#define WCD937X_DIGITAL_EFUSE_PRG_CTL (WCD937X_BASE_ADDRESS+0x460) -#define WCD937X_DIGITAL_EFUSE_TEST_CTL_0 (WCD937X_BASE_ADDRESS+0x461) -#define WCD937X_DIGITAL_EFUSE_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x462) -#define WCD937X_DIGITAL_EFUSE_T_DATA_0 (WCD937X_BASE_ADDRESS+0x463) -#define WCD937X_DIGITAL_EFUSE_T_DATA_1 (WCD937X_BASE_ADDRESS+0x464) -#define WCD937X_DIGITAL_PDM_WD_CTL0 (WCD937X_BASE_ADDRESS+0x465) -#define WCD937X_DIGITAL_PDM_WD_CTL1 (WCD937X_BASE_ADDRESS+0x466) -#define WCD937X_DIGITAL_PDM_WD_CTL2 (WCD937X_BASE_ADDRESS+0x467) -#define WCD937X_DIGITAL_INTR_MODE (WCD937X_BASE_ADDRESS+0x46A) -#define WCD937X_DIGITAL_INTR_MASK_0 (WCD937X_BASE_ADDRESS+0x46B) -#define WCD937X_DIGITAL_INTR_MASK_1 (WCD937X_BASE_ADDRESS+0x46C) -#define WCD937X_DIGITAL_INTR_MASK_2 (WCD937X_BASE_ADDRESS+0x46D) -#define WCD937X_DIGITAL_INTR_STATUS_0 (WCD937X_BASE_ADDRESS+0x46E) -#define WCD937X_DIGITAL_INTR_STATUS_1 (WCD937X_BASE_ADDRESS+0x46F) -#define WCD937X_DIGITAL_INTR_STATUS_2 (WCD937X_BASE_ADDRESS+0x470) -#define WCD937X_DIGITAL_INTR_CLEAR_0 (WCD937X_BASE_ADDRESS+0x471) -#define WCD937X_DIGITAL_INTR_CLEAR_1 (WCD937X_BASE_ADDRESS+0x472) -#define WCD937X_DIGITAL_INTR_CLEAR_2 (WCD937X_BASE_ADDRESS+0x473) -#define WCD937X_DIGITAL_INTR_LEVEL_0 (WCD937X_BASE_ADDRESS+0x474) -#define WCD937X_DIGITAL_INTR_LEVEL_1 (WCD937X_BASE_ADDRESS+0x475) -#define WCD937X_DIGITAL_INTR_LEVEL_2 (WCD937X_BASE_ADDRESS+0x476) -#define WCD937X_DIGITAL_INTR_SET_0 (WCD937X_BASE_ADDRESS+0x477) -#define WCD937X_DIGITAL_INTR_SET_1 (WCD937X_BASE_ADDRESS+0x478) -#define WCD937X_DIGITAL_INTR_SET_2 (WCD937X_BASE_ADDRESS+0x479) -#define WCD937X_DIGITAL_INTR_TEST_0 (WCD937X_BASE_ADDRESS+0x47A) -#define WCD937X_DIGITAL_INTR_TEST_1 (WCD937X_BASE_ADDRESS+0x47B) -#define WCD937X_DIGITAL_INTR_TEST_2 (WCD937X_BASE_ADDRESS+0x47C) -#define WCD937X_DIGITAL_CDC_CONN_RX0_CTL (WCD937X_BASE_ADDRESS+0x47F) -#define WCD937X_DIGITAL_CDC_CONN_RX1_CTL (WCD937X_BASE_ADDRESS+0x480) -#define WCD937X_DIGITAL_CDC_CONN_RX2_CTL (WCD937X_BASE_ADDRESS+0x481) -#define WCD937X_DIGITAL_CDC_CONN_TX_CTL (WCD937X_BASE_ADDRESS+0x482) -#define WCD937X_DIGITAL_LOOP_BACK_MODE (WCD937X_BASE_ADDRESS+0x483) -#define WCD937X_DIGITAL_SWR_DAC_TEST (WCD937X_BASE_ADDRESS+0x484) -#define WCD937X_DIGITAL_SWR_HM_TEST_RX_0 (WCD937X_BASE_ADDRESS+0x485) -#define WCD937X_DIGITAL_SWR_HM_TEST_TX_0 (WCD937X_BASE_ADDRESS+0x491) -#define WCD937X_DIGITAL_SWR_HM_TEST_RX_1 (WCD937X_BASE_ADDRESS+0x492) -#define WCD937X_DIGITAL_SWR_HM_TEST_TX_1 (WCD937X_BASE_ADDRESS+0x493) -#define WCD937X_DIGITAL_SWR_HM_TEST (WCD937X_BASE_ADDRESS+0x494) -#define WCD937X_DIGITAL_PAD_CTL_PDM_RX0 (WCD937X_BASE_ADDRESS+0x495) -#define WCD937X_DIGITAL_PAD_CTL_PDM_RX1 (WCD937X_BASE_ADDRESS+0x496) -#define WCD937X_DIGITAL_PAD_CTL_PDM_TX0 (WCD937X_BASE_ADDRESS+0x497) -#define WCD937X_DIGITAL_PAD_CTL_PDM_TX1 (WCD937X_BASE_ADDRESS+0x498) -#define WCD937X_DIGITAL_PAD_INP_DIS_0 (WCD937X_BASE_ADDRESS+0x499) -#define WCD937X_DIGITAL_PAD_INP_DIS_1 (WCD937X_BASE_ADDRESS+0x49A) -#define WCD937X_DIGITAL_DRIVE_STRENGTH_0 (WCD937X_BASE_ADDRESS+0x49B) -#define WCD937X_DIGITAL_DRIVE_STRENGTH_1 (WCD937X_BASE_ADDRESS+0x49C) -#define WCD937X_DIGITAL_DRIVE_STRENGTH_2 (WCD937X_BASE_ADDRESS+0x49D) -#define WCD937X_DIGITAL_RX_DATA_EDGE_CTL (WCD937X_BASE_ADDRESS+0x49E) -#define WCD937X_DIGITAL_TX_DATA_EDGE_CTL (WCD937X_BASE_ADDRESS+0x49F) -#define WCD937X_DIGITAL_GPIO_MODE (WCD937X_BASE_ADDRESS+0x4A0) -#define WCD937X_DIGITAL_PIN_CTL_OE (WCD937X_BASE_ADDRESS+0x4A1) -#define WCD937X_DIGITAL_PIN_CTL_DATA_0 (WCD937X_BASE_ADDRESS+0x4A2) -#define WCD937X_DIGITAL_PIN_CTL_DATA_1 (WCD937X_BASE_ADDRESS+0x4A3) -#define WCD937X_DIGITAL_PIN_STATUS_0 (WCD937X_BASE_ADDRESS+0x4A4) -#define WCD937X_DIGITAL_PIN_STATUS_1 (WCD937X_BASE_ADDRESS+0x4A5) -#define WCD937X_DIGITAL_DIG_DEBUG_CTL (WCD937X_BASE_ADDRESS+0x4A6) -#define WCD937X_DIGITAL_DIG_DEBUG_EN (WCD937X_BASE_ADDRESS+0x4A7) -#define WCD937X_DIGITAL_ANA_CSR_DBG_ADD (WCD937X_BASE_ADDRESS+0x4A8) -#define WCD937X_DIGITAL_ANA_CSR_DBG_CTL (WCD937X_BASE_ADDRESS+0x4A9) -#define WCD937X_DIGITAL_SSP_DBG (WCD937X_BASE_ADDRESS+0x4AA) -#define WCD937X_DIGITAL_MODE_STATUS_0 (WCD937X_BASE_ADDRESS+0x4AB) -#define WCD937X_DIGITAL_MODE_STATUS_1 (WCD937X_BASE_ADDRESS+0x4AC) -#define WCD937X_DIGITAL_SPARE_0 (WCD937X_BASE_ADDRESS+0x4AD) -#define WCD937X_DIGITAL_SPARE_1 (WCD937X_BASE_ADDRESS+0x4AE) -#define WCD937X_DIGITAL_SPARE_2 (WCD937X_BASE_ADDRESS+0x4AF) -#define WCD937X_DIGITAL_EFUSE_REG_0 (WCD937X_BASE_ADDRESS+0x4B0) -#define WCD937X_DIGITAL_EFUSE_REG_1 (WCD937X_BASE_ADDRESS+0x4B1) -#define WCD937X_DIGITAL_EFUSE_REG_2 (WCD937X_BASE_ADDRESS+0x4B2) -#define WCD937X_DIGITAL_EFUSE_REG_3 (WCD937X_BASE_ADDRESS+0x4B3) -#define WCD937X_DIGITAL_EFUSE_REG_4 (WCD937X_BASE_ADDRESS+0x4B4) -#define WCD937X_DIGITAL_EFUSE_REG_5 (WCD937X_BASE_ADDRESS+0x4B5) -#define WCD937X_DIGITAL_EFUSE_REG_6 (WCD937X_BASE_ADDRESS+0x4B6) -#define WCD937X_DIGITAL_EFUSE_REG_7 (WCD937X_BASE_ADDRESS+0x4B7) -#define WCD937X_DIGITAL_EFUSE_REG_8 (WCD937X_BASE_ADDRESS+0x4B8) -#define WCD937X_DIGITAL_EFUSE_REG_9 (WCD937X_BASE_ADDRESS+0x4B9) -#define WCD937X_DIGITAL_EFUSE_REG_10 (WCD937X_BASE_ADDRESS+0x4BA) -#define WCD937X_DIGITAL_EFUSE_REG_11 (WCD937X_BASE_ADDRESS+0x4BB) -#define WCD937X_DIGITAL_EFUSE_REG_12 (WCD937X_BASE_ADDRESS+0x4BC) -#define WCD937X_DIGITAL_EFUSE_REG_13 (WCD937X_BASE_ADDRESS+0x4BD) -#define WCD937X_DIGITAL_EFUSE_REG_14 (WCD937X_BASE_ADDRESS+0x4BE) -#define WCD937X_DIGITAL_EFUSE_REG_15 (WCD937X_BASE_ADDRESS+0x4BF) -#define WCD937X_DIGITAL_EFUSE_REG_16 (WCD937X_BASE_ADDRESS+0x4C0) -#define WCD937X_DIGITAL_EFUSE_REG_17 (WCD937X_BASE_ADDRESS+0x4C1) -#define WCD937X_DIGITAL_EFUSE_REG_18 (WCD937X_BASE_ADDRESS+0x4C2) -#define WCD937X_DIGITAL_EFUSE_REG_19 (WCD937X_BASE_ADDRESS+0x4C3) -#define WCD937X_DIGITAL_EFUSE_REG_20 (WCD937X_BASE_ADDRESS+0x4C4) -#define WCD937X_DIGITAL_EFUSE_REG_21 (WCD937X_BASE_ADDRESS+0x4C5) -#define WCD937X_DIGITAL_EFUSE_REG_22 (WCD937X_BASE_ADDRESS+0x4C6) -#define WCD937X_DIGITAL_EFUSE_REG_23 (WCD937X_BASE_ADDRESS+0x4C7) -#define WCD937X_DIGITAL_EFUSE_REG_24 (WCD937X_BASE_ADDRESS+0x4C8) -#define WCD937X_DIGITAL_EFUSE_REG_25 (WCD937X_BASE_ADDRESS+0x4C9) -#define WCD937X_DIGITAL_EFUSE_REG_26 (WCD937X_BASE_ADDRESS+0x4CA) -#define WCD937X_DIGITAL_EFUSE_REG_27 (WCD937X_BASE_ADDRESS+0x4CB) -#define WCD937X_DIGITAL_EFUSE_REG_28 (WCD937X_BASE_ADDRESS+0x4CC) -#define WCD937X_DIGITAL_EFUSE_REG_29 (WCD937X_BASE_ADDRESS+0x4CD) -#define WCD937X_DIGITAL_EFUSE_REG_30 (WCD937X_BASE_ADDRESS+0x4CE) -#define WCD937X_DIGITAL_EFUSE_REG_31 (WCD937X_BASE_ADDRESS+0x4CF) - -#define WCD937X_REGISTERS_MAX_SIZE (WCD937X_BASE_ADDRESS+0x4D0) -#define WCD937X_MAX_REGISTER (WCD937X_REGISTERS_MAX_SIZE - 1) - -#endif diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-regmap.c b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-regmap.c deleted file mode 100644 index ec29826d58cc..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-regmap.c +++ /dev/null @@ -1,464 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "wcd937x-registers.h" - -extern const u8 wcd937x_reg_access[WCD937X_REGISTERS_MAX_SIZE]; - -static const struct reg_default wcd937x_defaults[] = { - { WCD937X_ANA_BIAS, 0x00 }, - { WCD937X_ANA_RX_SUPPLIES, 0x00 }, - { WCD937X_ANA_HPH, 0x0C }, - { WCD937X_ANA_EAR, 0x00 }, - { WCD937X_ANA_EAR_COMPANDER_CTL, 0x02 }, - { WCD937X_ANA_TX_CH1, 0x20 }, - { WCD937X_ANA_TX_CH2, 0x00 }, - { WCD937X_ANA_TX_CH3, 0x20 }, - { WCD937X_ANA_TX_CH3_HPF, 0x00 }, - { WCD937X_ANA_MICB1_MICB2_DSP_EN_LOGIC, 0x00 }, - { WCD937X_ANA_MICB3_DSP_EN_LOGIC, 0x00 }, - { WCD937X_ANA_MBHC_MECH, 0x39 }, - { WCD937X_ANA_MBHC_ELECT, 0x08 }, - { WCD937X_ANA_MBHC_ZDET, 0x00 }, - { WCD937X_ANA_MBHC_RESULT_1, 0x00 }, - { WCD937X_ANA_MBHC_RESULT_2, 0x00 }, - { WCD937X_ANA_MBHC_RESULT_3, 0x00 }, - { WCD937X_ANA_MBHC_BTN0, 0x00 }, - { WCD937X_ANA_MBHC_BTN1, 0x10 }, - { WCD937X_ANA_MBHC_BTN2, 0x20 }, - { WCD937X_ANA_MBHC_BTN3, 0x30 }, - { WCD937X_ANA_MBHC_BTN4, 0x40 }, - { WCD937X_ANA_MBHC_BTN5, 0x50 }, - { WCD937X_ANA_MBHC_BTN6, 0x60 }, - { WCD937X_ANA_MBHC_BTN7, 0x70 }, - { WCD937X_ANA_MICB1, 0x10 }, - { WCD937X_ANA_MICB2, 0x10 }, - { WCD937X_ANA_MICB2_RAMP, 0x00 }, - { WCD937X_ANA_MICB3, 0x10 }, - { WCD937X_BIAS_CTL, 0x2A }, - { WCD937X_BIAS_VBG_FINE_ADJ, 0x55 }, - { WCD937X_LDOL_VDDCX_ADJUST, 0x01 }, - { WCD937X_LDOL_DISABLE_LDOL, 0x00 }, - { WCD937X_MBHC_CTL_CLK, 0x00 }, - { WCD937X_MBHC_CTL_ANA, 0x00 }, - { WCD937X_MBHC_CTL_SPARE_1, 0x00 }, - { WCD937X_MBHC_CTL_SPARE_2, 0x00 }, - { WCD937X_MBHC_CTL_BCS, 0x00 }, - { WCD937X_MBHC_MOISTURE_DET_FSM_STATUS, 0x00 }, - { WCD937X_MBHC_TEST_CTL, 0x00 }, - { WCD937X_LDOH_MODE, 0x2B }, - { WCD937X_LDOH_BIAS, 0x68 }, - { WCD937X_LDOH_STB_LOADS, 0x00 }, - { WCD937X_LDOH_SLOWRAMP, 0x50 }, - { WCD937X_MICB1_TEST_CTL_1, 0x1A }, - { WCD937X_MICB1_TEST_CTL_2, 0x18 }, - { WCD937X_MICB1_TEST_CTL_3, 0xA4 }, - { WCD937X_MICB2_TEST_CTL_1, 0x1A }, - { WCD937X_MICB2_TEST_CTL_2, 0x18 }, - { WCD937X_MICB2_TEST_CTL_3, 0xA4 }, - { WCD937X_MICB3_TEST_CTL_1, 0x1A }, - { WCD937X_MICB3_TEST_CTL_2, 0x18 }, - { WCD937X_MICB3_TEST_CTL_3, 0xA4 }, - { WCD937X_TX_COM_ADC_VCM, 0x39 }, - { WCD937X_TX_COM_BIAS_ATEST, 0xC0 }, - { WCD937X_TX_COM_ADC_INT1_IB, 0x6F }, - { WCD937X_TX_COM_ADC_INT2_IB, 0x4F }, - { WCD937X_TX_COM_TXFE_DIV_CTL, 0x2E }, - { WCD937X_TX_COM_TXFE_DIV_START, 0x00 }, - { WCD937X_TX_COM_TXFE_DIV_STOP_9P6M, 0xC7 }, - { WCD937X_TX_COM_TXFE_DIV_STOP_12P288M, 0xFF }, - { WCD937X_TX_1_2_TEST_EN, 0xCC }, - { WCD937X_TX_1_2_ADC_IB, 0x09 }, - { WCD937X_TX_1_2_ATEST_REFCTL, 0x0A }, - { WCD937X_TX_1_2_TEST_CTL, 0x38 }, - { WCD937X_TX_1_2_TEST_BLK_EN, 0xFF }, - { WCD937X_TX_1_2_TXFE_CLKDIV, 0x00 }, - { WCD937X_TX_1_2_SAR2_ERR, 0x00 }, - { WCD937X_TX_1_2_SAR1_ERR, 0x00 }, - { WCD937X_TX_3_TEST_EN, 0xCC }, - { WCD937X_TX_3_ADC_IB, 0x09 }, - { WCD937X_TX_3_ATEST_REFCTL, 0x0A }, - { WCD937X_TX_3_TEST_CTL, 0x38 }, - { WCD937X_TX_3_TEST_BLK_EN, 0xFF }, - { WCD937X_TX_3_TXFE_CLKDIV, 0x00 }, - { WCD937X_TX_3_SPARE_MONO, 0x00 }, - { WCD937X_TX_3_SAR1_ERR, 0x00 }, - { WCD937X_CLASSH_MODE_1, 0x40 }, - { WCD937X_CLASSH_MODE_2, 0x3A }, - { WCD937X_CLASSH_MODE_3, 0x00 }, - { WCD937X_CLASSH_CTRL_VCL_1, 0x70 }, - { WCD937X_CLASSH_CTRL_VCL_2, 0x82 }, - { WCD937X_CLASSH_CTRL_CCL_1, 0x31 }, - { WCD937X_CLASSH_CTRL_CCL_2, 0x80 }, - { WCD937X_CLASSH_CTRL_CCL_3, 0x80 }, - { WCD937X_CLASSH_CTRL_CCL_4, 0x51 }, - { WCD937X_CLASSH_CTRL_CCL_5, 0x00 }, - { WCD937X_CLASSH_BUCK_TMUX_A_D, 0x00 }, - { WCD937X_CLASSH_BUCK_SW_DRV_CNTL, 0x77 }, - { WCD937X_CLASSH_SPARE, 0x00 }, - { WCD937X_FLYBACK_EN, 0x4E }, - { WCD937X_FLYBACK_VNEG_CTRL_1, 0x0B }, - { WCD937X_FLYBACK_VNEG_CTRL_2, 0x45 }, - { WCD937X_FLYBACK_VNEG_CTRL_3, 0x74 }, - { WCD937X_FLYBACK_VNEG_CTRL_4, 0x7F }, - { WCD937X_FLYBACK_VNEG_CTRL_5, 0x83 }, - { WCD937X_FLYBACK_VNEG_CTRL_6, 0x98 }, - { WCD937X_FLYBACK_VNEG_CTRL_7, 0xA9 }, - { WCD937X_FLYBACK_VNEG_CTRL_8, 0x68 }, - { WCD937X_FLYBACK_VNEG_CTRL_9, 0x64 }, - { WCD937X_FLYBACK_VNEGDAC_CTRL_1, 0xED }, - { WCD937X_FLYBACK_VNEGDAC_CTRL_2, 0xF0 }, - { WCD937X_FLYBACK_VNEGDAC_CTRL_3, 0xA6 }, - { WCD937X_FLYBACK_CTRL_1, 0x65 }, - { WCD937X_FLYBACK_TEST_CTL, 0x00 }, - { WCD937X_RX_AUX_SW_CTL, 0x00 }, - { WCD937X_RX_PA_AUX_IN_CONN, 0x00 }, - { WCD937X_RX_TIMER_DIV, 0x32 }, - { WCD937X_RX_OCP_CTL, 0x1F }, - { WCD937X_RX_OCP_COUNT, 0x77 }, - { WCD937X_RX_BIAS_EAR_DAC, 0xA0 }, - { WCD937X_RX_BIAS_EAR_AMP, 0xAA }, - { WCD937X_RX_BIAS_HPH_LDO, 0xA9 }, - { WCD937X_RX_BIAS_HPH_PA, 0xAA }, - { WCD937X_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A }, - { WCD937X_RX_BIAS_HPH_RDAC_LDO, 0x88 }, - { WCD937X_RX_BIAS_HPH_CNP1, 0x82 }, - { WCD937X_RX_BIAS_HPH_LOWPOWER, 0x82 }, - { WCD937X_RX_BIAS_AUX_DAC, 0xA0 }, - { WCD937X_RX_BIAS_AUX_AMP, 0xAA }, - { WCD937X_RX_BIAS_VNEGDAC_BLEEDER, 0x50 }, - { WCD937X_RX_BIAS_MISC, 0x00 }, - { WCD937X_RX_BIAS_BUCK_RST, 0x08 }, - { WCD937X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44 }, - { WCD937X_RX_BIAS_FLYB_ERRAMP, 0x40 }, - { WCD937X_RX_BIAS_FLYB_BUFF, 0xAA }, - { WCD937X_RX_BIAS_FLYB_MID_RST, 0x14 }, - { WCD937X_HPH_L_STATUS, 0x04 }, - { WCD937X_HPH_R_STATUS, 0x04 }, - { WCD937X_HPH_CNP_EN, 0x80 }, - { WCD937X_HPH_CNP_WG_CTL, 0x9A }, - { WCD937X_HPH_CNP_WG_TIME, 0x14 }, - { WCD937X_HPH_OCP_CTL, 0x28 }, - { WCD937X_HPH_AUTO_CHOP, 0x16 }, - { WCD937X_HPH_CHOP_CTL, 0x83 }, - { WCD937X_HPH_PA_CTL1, 0x46 }, - { WCD937X_HPH_PA_CTL2, 0x50 }, - { WCD937X_HPH_L_EN, 0x80 }, - { WCD937X_HPH_L_TEST, 0xE0 }, - { WCD937X_HPH_L_ATEST, 0x50 }, - { WCD937X_HPH_R_EN, 0x80 }, - { WCD937X_HPH_R_TEST, 0xE0 }, - { WCD937X_HPH_R_ATEST, 0x54 }, - { WCD937X_HPH_RDAC_CLK_CTL1, 0x99 }, - { WCD937X_HPH_RDAC_CLK_CTL2, 0x9B }, - { WCD937X_HPH_RDAC_LDO_CTL, 0x33 }, - { WCD937X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00 }, - { WCD937X_HPH_REFBUFF_UHQA_CTL, 0xA8 }, - { WCD937X_HPH_REFBUFF_LP_CTL, 0x0E }, - { WCD937X_HPH_L_DAC_CTL, 0x20 }, - { WCD937X_HPH_R_DAC_CTL, 0x20 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_COMP_SEL, 0x55 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0x19 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_MISC1, 0xA0 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_STATUS, 0x00 }, - { WCD937X_EAR_EAR_EN_REG, 0x22 }, - { WCD937X_EAR_EAR_PA_CON, 0x44 }, - { WCD937X_EAR_EAR_SP_CON, 0xDB }, - { WCD937X_EAR_EAR_DAC_CON, 0x80 }, - { WCD937X_EAR_EAR_CNP_FSM_CON, 0xB2 }, - { WCD937X_EAR_TEST_CTL, 0x00 }, - { WCD937X_EAR_STATUS_REG_1, 0x00 }, - { WCD937X_EAR_STATUS_REG_2, 0x00 }, - { WCD937X_ANA_NEW_PAGE_REGISTER, 0x00 }, - { WCD937X_HPH_NEW_ANA_HPH2, 0x00 }, - { WCD937X_HPH_NEW_ANA_HPH3, 0x00 }, - { WCD937X_SLEEP_CTL, 0x16 }, - { WCD937X_SLEEP_WATCHDOG_CTL, 0x00 }, - { WCD937X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00 }, - { WCD937X_MBHC_NEW_CTL_1, 0x02 }, - { WCD937X_MBHC_NEW_CTL_2, 0x05 }, - { WCD937X_MBHC_NEW_PLUG_DETECT_CTL, 0xE9 }, - { WCD937X_MBHC_NEW_ZDET_ANA_CTL, 0x0F }, - { WCD937X_MBHC_NEW_ZDET_RAMP_CTL, 0x00 }, - { WCD937X_MBHC_NEW_FSM_STATUS, 0x00 }, - { WCD937X_MBHC_NEW_ADC_RESULT, 0x00 }, - { WCD937X_TX_NEW_TX_CH2_SEL, 0x00 }, - { WCD937X_AUX_AUXPA, 0x00 }, - { WCD937X_LDORXTX_MODE, 0x0C }, - { WCD937X_LDORXTX_CONFIG, 0x10 }, - { WCD937X_DIE_CRACK_DIE_CRK_DET_EN, 0x00 }, - { WCD937X_DIE_CRACK_DIE_CRK_DET_OUT, 0x00 }, - { WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40 }, - { WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81 }, - { WCD937X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10 }, - { WCD937X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00 }, - { WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81 }, - { WCD937X_HPH_NEW_INT_PA_MISC1, 0x22 }, - { WCD937X_HPH_NEW_INT_PA_MISC2, 0x00 }, - { WCD937X_HPH_NEW_INT_PA_RDAC_MISC, 0x00 }, - { WCD937X_HPH_NEW_INT_HPH_TIMER1, 0xFE }, - { WCD937X_HPH_NEW_INT_HPH_TIMER2, 0x02 }, - { WCD937X_HPH_NEW_INT_HPH_TIMER3, 0x4E }, - { WCD937X_HPH_NEW_INT_HPH_TIMER4, 0x54 }, - { WCD937X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00 }, - { WCD937X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00 }, - { WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62 }, - { WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01 }, - { WCD937X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11 }, - { WCD937X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57 }, - { WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01 }, - { WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00 }, - { WCD937X_MBHC_NEW_INT_SPARE_2, 0x00 }, - { WCD937X_EAR_INT_NEW_EAR_CHOPPER_CON, 0xA8 }, - { WCD937X_EAR_INT_NEW_CNP_VCM_CON1, 0x42 }, - { WCD937X_EAR_INT_NEW_CNP_VCM_CON2, 0x22 }, - { WCD937X_EAR_INT_NEW_EAR_DYNAMIC_BIAS, 0x00 }, - { WCD937X_AUX_INT_EN_REG, 0x00 }, - { WCD937X_AUX_INT_PA_CTRL, 0x06 }, - { WCD937X_AUX_INT_SP_CTRL, 0xD2 }, - { WCD937X_AUX_INT_DAC_CTRL, 0x80 }, - { WCD937X_AUX_INT_CLK_CTRL, 0x50 }, - { WCD937X_AUX_INT_TEST_CTRL, 0x00 }, - { WCD937X_AUX_INT_STATUS_REG, 0x00 }, - { WCD937X_AUX_INT_MISC, 0x00 }, - { WCD937X_LDORXTX_INT_BIAS, 0x6E }, - { WCD937X_LDORXTX_INT_STB_LOADS_DTEST, 0x50 }, - { WCD937X_LDORXTX_INT_TEST0, 0x1C }, - { WCD937X_LDORXTX_INT_STARTUP_TIMER, 0xFF }, - { WCD937X_LDORXTX_INT_TEST1, 0x1F }, - { WCD937X_LDORXTX_INT_STATUS, 0x00 }, - { WCD937X_SLEEP_INT_WATCHDOG_CTL_1, 0x0A }, - { WCD937X_SLEEP_INT_WATCHDOG_CTL_2, 0x0A }, - { WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT1, 0x02 }, - { WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT2, 0x60 }, - { WCD937X_DIGITAL_PAGE_REGISTER, 0x00 }, - { WCD937X_DIGITAL_CHIP_ID0, 0x01 }, - { WCD937X_DIGITAL_CHIP_ID1, 0x00 }, - { WCD937X_DIGITAL_CHIP_ID2, 0x0A }, - { WCD937X_DIGITAL_CHIP_ID3, 0x01 }, - { WCD937X_DIGITAL_CDC_RST_CTL, 0x03 }, - { WCD937X_DIGITAL_TOP_CLK_CFG, 0x00 }, - { WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0x00 }, - { WCD937X_DIGITAL_SWR_RST_EN, 0x00 }, - { WCD937X_DIGITAL_CDC_PATH_MODE, 0x55 }, - { WCD937X_DIGITAL_CDC_RX_RST, 0x00 }, - { WCD937X_DIGITAL_CDC_RX0_CTL, 0xFC }, - { WCD937X_DIGITAL_CDC_RX1_CTL, 0xFC }, - { WCD937X_DIGITAL_CDC_RX2_CTL, 0xFC }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA0, 0x55 }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA1, 0x55 }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA2, 0x55 }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA3, 0x01 }, - { WCD937X_DIGITAL_CDC_COMP_CTL_0, 0x00 }, - { WCD937X_DIGITAL_CDC_RX_DELAY_CTL, 0x66 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A1_0, 0x00 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A1_1, 0x01 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A2_0, 0x63 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A2_1, 0x04 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A3_0, 0xAC }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A3_1, 0x04 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A4_0, 0x1A }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A4_1, 0x03 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A5_0, 0xBC }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A5_1, 0x02 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A6_0, 0xC7 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A7_0, 0xF8 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_0, 0x47 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_1, 0x43 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_2, 0xB1 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_3, 0x17 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R1, 0x4B }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R2, 0x26 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R3, 0x32 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R4, 0x57 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R5, 0x63 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R6, 0x7C }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R7, 0x57 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A1_0, 0x00 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A1_1, 0x01 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A2_0, 0x96 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A2_1, 0x09 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A3_0, 0xAB }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A3_1, 0x05 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A4_0, 0x1C }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A4_1, 0x02 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A5_0, 0x17 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A5_1, 0x02 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A6_0, 0xAA }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A7_0, 0xE3 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_0, 0x69 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_1, 0x54 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_2, 0x02 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_3, 0x15 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R1, 0xA4 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R2, 0xB5 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R3, 0x86 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R4, 0x85 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R5, 0xAA }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R6, 0xE2 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R7, 0x62 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_RX_0, 0x55 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_RX_1, 0xA9 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_0, 0x3D }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_1, 0x2E }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_2, 0x01 }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_0, 0x00 }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_1, 0xFC }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_2, 0x01 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_EAR_PATH_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_SWR_CLH, 0x00 }, - { WCD937X_DIGITAL_SWR_CLH_BYP, 0x00 }, - { WCD937X_DIGITAL_CDC_TX0_CTL, 0x68 }, - { WCD937X_DIGITAL_CDC_TX1_CTL, 0x68 }, - { WCD937X_DIGITAL_CDC_TX2_CTL, 0x68 }, - { WCD937X_DIGITAL_CDC_TX_RST, 0x00 }, - { WCD937X_DIGITAL_CDC_REQ_CTL, 0x01 }, - { WCD937X_DIGITAL_CDC_AMIC_CTL, 0x07 }, - { WCD937X_DIGITAL_CDC_DMIC_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_DMIC1_CTL, 0x01 }, - { WCD937X_DIGITAL_CDC_DMIC2_CTL, 0x01 }, - { WCD937X_DIGITAL_CDC_DMIC3_CTL, 0x01 }, - { WCD937X_DIGITAL_EFUSE_CTL, 0x2B }, - { WCD937X_DIGITAL_EFUSE_PRG_CTL, 0x00 }, - { WCD937X_DIGITAL_EFUSE_TEST_CTL_0, 0x00 }, - { WCD937X_DIGITAL_EFUSE_TEST_CTL_1, 0x00 }, - { WCD937X_DIGITAL_EFUSE_T_DATA_0, 0x00 }, - { WCD937X_DIGITAL_EFUSE_T_DATA_1, 0x00 }, - { WCD937X_DIGITAL_PDM_WD_CTL0, 0x00 }, - { WCD937X_DIGITAL_PDM_WD_CTL1, 0x00 }, - { WCD937X_DIGITAL_PDM_WD_CTL2, 0x00 }, - { WCD937X_DIGITAL_INTR_MODE, 0x00 }, - { WCD937X_DIGITAL_INTR_MASK_0, 0xFF }, - { WCD937X_DIGITAL_INTR_MASK_1, 0xFF }, - { WCD937X_DIGITAL_INTR_MASK_2, 0x0F }, - { WCD937X_DIGITAL_INTR_STATUS_0, 0x00 }, - { WCD937X_DIGITAL_INTR_STATUS_1, 0x00 }, - { WCD937X_DIGITAL_INTR_STATUS_2, 0x00 }, - { WCD937X_DIGITAL_INTR_CLEAR_0, 0x00 }, - { WCD937X_DIGITAL_INTR_CLEAR_1, 0x00 }, - { WCD937X_DIGITAL_INTR_CLEAR_2, 0x00 }, - { WCD937X_DIGITAL_INTR_LEVEL_0, 0x00 }, - { WCD937X_DIGITAL_INTR_LEVEL_1, 0x00 }, - { WCD937X_DIGITAL_INTR_LEVEL_2, 0x00 }, - { WCD937X_DIGITAL_INTR_SET_0, 0x00 }, - { WCD937X_DIGITAL_INTR_SET_1, 0x00 }, - { WCD937X_DIGITAL_INTR_SET_2, 0x00 }, - { WCD937X_DIGITAL_INTR_TEST_0, 0x00 }, - { WCD937X_DIGITAL_INTR_TEST_1, 0x00 }, - { WCD937X_DIGITAL_INTR_TEST_2, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_RX0_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_RX1_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_RX2_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_TX_CTL, 0x00 }, - { WCD937X_DIGITAL_LOOP_BACK_MODE, 0x00 }, - { WCD937X_DIGITAL_SWR_DAC_TEST, 0x00 }, - { WCD937X_DIGITAL_SWR_HM_TEST_RX_0, 0x40 }, - { WCD937X_DIGITAL_SWR_HM_TEST_TX_0, 0x40 }, - { WCD937X_DIGITAL_SWR_HM_TEST_RX_1, 0x00 }, - { WCD937X_DIGITAL_SWR_HM_TEST_TX_1, 0x00 }, - { WCD937X_DIGITAL_SWR_HM_TEST, 0x00 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_RX0, 0xF1 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_RX1, 0xF1 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_TX0, 0xF1 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_TX1, 0xF1 }, - { WCD937X_DIGITAL_PAD_INP_DIS_0, 0x00 }, - { WCD937X_DIGITAL_PAD_INP_DIS_1, 0x00 }, - { WCD937X_DIGITAL_DRIVE_STRENGTH_0, 0x00 }, - { WCD937X_DIGITAL_DRIVE_STRENGTH_1, 0x00 }, - { WCD937X_DIGITAL_DRIVE_STRENGTH_2, 0x00 }, - { WCD937X_DIGITAL_RX_DATA_EDGE_CTL, 0x1F }, - { WCD937X_DIGITAL_TX_DATA_EDGE_CTL, 0x10 }, - { WCD937X_DIGITAL_GPIO_MODE, 0x00 }, - { WCD937X_DIGITAL_PIN_CTL_OE, 0x00 }, - { WCD937X_DIGITAL_PIN_CTL_DATA_0, 0x00 }, - { WCD937X_DIGITAL_PIN_CTL_DATA_1, 0x00 }, - { WCD937X_DIGITAL_PIN_STATUS_0, 0x00 }, - { WCD937X_DIGITAL_PIN_STATUS_1, 0x00 }, - { WCD937X_DIGITAL_DIG_DEBUG_CTL, 0x00 }, - { WCD937X_DIGITAL_DIG_DEBUG_EN, 0x00 }, - { WCD937X_DIGITAL_ANA_CSR_DBG_ADD, 0x00 }, - { WCD937X_DIGITAL_ANA_CSR_DBG_CTL, 0x48 }, - { WCD937X_DIGITAL_SSP_DBG, 0x00 }, - { WCD937X_DIGITAL_MODE_STATUS_0, 0x00 }, - { WCD937X_DIGITAL_MODE_STATUS_1, 0x00 }, - { WCD937X_DIGITAL_SPARE_0, 0x00 }, - { WCD937X_DIGITAL_SPARE_1, 0x00 }, - { WCD937X_DIGITAL_SPARE_2, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_0, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_1, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_2, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_3, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_4, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_5, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_6, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_7, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_8, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_9, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_10, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_11, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_12, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_13, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_14, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_15, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_16, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_17, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_18, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_19, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_20, 0x0E }, - { WCD937X_DIGITAL_EFUSE_REG_21, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_22, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_23, 0xF8 }, - { WCD937X_DIGITAL_EFUSE_REG_24, 0x16 }, - { WCD937X_DIGITAL_EFUSE_REG_25, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_26, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_27, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_28, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_29, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_30, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_31, 0x00 }, -}; - -static bool wcd937x_readable_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD937X_BASE_ADDRESS) - return 0; - return wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG; -} - -static bool wcd937x_writeable_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD937X_BASE_ADDRESS) - return 0; - return wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG; -} - -static bool wcd937x_volatile_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD937X_BASE_ADDRESS) - return 0; - if ((wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG) - && !(wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG)) - return true; - return false; -} - -struct regmap_config wcd937x_regmap_config = { - .name = "wcd937x_csr", - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd937x_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd937x_defaults), - .max_register = WCD937X_MAX_REGISTER, - .readable_reg = wcd937x_readable_register, - .writeable_reg = wcd937x_writeable_register, - .volatile_reg = wcd937x_volatile_register, - .can_multi_write = true, -}; diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-tables.c b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-tables.c deleted file mode 100644 index 3631044bdd0c..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x-tables.c +++ /dev/null @@ -1,422 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2019 , The Linux Foundation. All rights reserved. - */ - -#include -#include "wcd937x-registers.h" - -const u8 wcd937x_reg_access[WCD937X_REG(WCD937X_REGISTERS_MAX_SIZE)] = { - [WCD937X_REG(WCD937X_ANA_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_RX_SUPPLIES)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_HPH)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_EAR)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_EAR_COMPANDER_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH3_HPF)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB1_MICB2_DSP_EN_LOGIC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB3_DSP_EN_LOGIC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_MECH)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_ELECT)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_ZDET)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_RESULT_1)] = RD_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_RESULT_2)] = RD_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_RESULT_3)] = RD_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB2_RAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_BIAS_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_BIAS_VBG_FINE_ADJ)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOL_VDDCX_ADJUST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOL_DISABLE_LDOL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_CLK)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_ANA)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_SPARE_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_SPARE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_BCS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_MOISTURE_DET_FSM_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_MBHC_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_STB_LOADS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_SLOWRAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB1_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB1_TEST_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB1_TEST_CTL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB2_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB2_TEST_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB2_TEST_CTL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB3_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB3_TEST_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB3_TEST_CTL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_ADC_VCM)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_BIAS_ATEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_ADC_INT1_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_ADC_INT2_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_START)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_STOP_9P6M)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_STOP_12P288M)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TEST_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_ADC_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_ATEST_REFCTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TEST_BLK_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TXFE_CLKDIV)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_SAR2_ERR)] = RD_REG, - [WCD937X_REG(WCD937X_TX_1_2_SAR1_ERR)] = RD_REG, - [WCD937X_REG(WCD937X_TX_3_TEST_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_ADC_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_ATEST_REFCTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_TEST_BLK_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_TXFE_CLKDIV)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_SPARE_MONO)] = RD_REG, - [WCD937X_REG(WCD937X_TX_3_SAR1_ERR)] = RD_REG, - [WCD937X_REG(WCD937X_CLASSH_MODE_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_MODE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_MODE_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_VCL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_VCL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_BUCK_TMUX_A_D)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_BUCK_SW_DRV_CNTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_SPARE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_8)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_9)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEGDAC_CTRL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEGDAC_CTRL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEGDAC_CTRL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_CTRL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_AUX_SW_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_PA_AUX_IN_CONN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_TIMER_DIV)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_OCP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_OCP_COUNT)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_EAR_DAC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_EAR_AMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_LDO)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_PA)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_RDACBUFF_CNP2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_RDAC_LDO)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_CNP1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_LOWPOWER)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_AUX_DAC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_AUX_AMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_VNEGDAC_BLEEDER)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_MISC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_BUCK_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_BUCK_VREF_ERRAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_FLYB_ERRAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_FLYB_BUFF)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_FLYB_MID_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_R_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_CNP_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_CNP_WG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_CNP_WG_TIME)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_OCP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_AUTO_CHOP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_CHOP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_PA_CTL1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_PA_CTL2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_ATEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_ATEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_CLK_CTL1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_CLK_CTL2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_LDO_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_CHOP_CLK_LP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_REFBUFF_UHQA_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_REFBUFF_LP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_DAC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_DAC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_COMP_SEL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_MISC1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_EAR_EAR_EN_REG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_PA_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_SP_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_DAC_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_CNP_FSM_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_STATUS_REG_1)] = RD_REG, - [WCD937X_REG(WCD937X_EAR_STATUS_REG_2)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_NEW_ANA_HPH2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_ANA_HPH3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_SLEEP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_SLEEP_WATCHDOG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ELECT_REM_CLAMP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_PLUG_DETECT_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ZDET_ANA_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ZDET_RAMP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_FSM_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ADC_RESULT)] = RD_REG, - [WCD937X_REG(WCD937X_TX_NEW_TX_CH2_SEL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_AUXPA)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_CONFIG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_OUT)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_VREF_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_OVERRIDE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_MISC1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_MISC2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_RDAC_MISC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_RDAC_MISC2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_RDAC_MISC3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_ULP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_NEW_INT_HPH_RDAC_LDO_LP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL)] - = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_SPARE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_EAR_CHOPPER_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_CNP_VCM_CON1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_CNP_VCM_CON2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_EAR_DYNAMIC_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_EN_REG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_PA_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_SP_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_DAC_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_CLK_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_TEST_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_STATUS_REG)] = RD_REG, - [WCD937X_REG(WCD937X_AUX_INT_MISC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_STB_LOADS_DTEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_TEST0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_STARTUP_TIMER)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_TEST1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_SLEEP_INT_WATCHDOG_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_SLEEP_INT_WATCHDOG_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID2)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID3)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_TOP_CLK_CFG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_ANA_CLK_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DIG_CLK_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_RST_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_PATH_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX0_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_COMP_CTL_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX_DELAY_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A1_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A1_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A2_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A2_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A3_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A3_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A4_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A4_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A5_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A5_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A6_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A7_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A1_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A1_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A2_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A2_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A3_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A3_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A4_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A4_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A5_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A5_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A6_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A7_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_RX_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_RX_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_EAR_PATH_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_SWR_CLH)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_CLH_BYP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX0_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_REQ_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AMIC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC3_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_PRG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_TEST_CTL_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_T_DATA_0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_T_DATA_1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_PDM_WD_CTL0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PDM_WD_CTL1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PDM_WD_CTL2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MASK_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MASK_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MASK_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_STATUS_0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_STATUS_1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_STATUS_2)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_CLEAR_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_CLEAR_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_CLEAR_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_LEVEL_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_LEVEL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_LEVEL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_SET_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_SET_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_SET_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_TEST_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_TEST_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_TEST_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_RX0_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_RX1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_RX2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_TX_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_LOOP_BACK_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_DAC_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_RX_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_TX_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_RX_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_TX_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_RX0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_RX1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_TX0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_TX1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_INP_DIS_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_INP_DIS_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_RX_DATA_EDGE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_TX_DATA_EDGE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_GPIO_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_CTL_OE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_CTL_DATA_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_CTL_DATA_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_STATUS_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_STATUS_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DIG_DEBUG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DIG_DEBUG_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_ANA_CSR_DBG_ADD)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_ANA_CSR_DBG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SSP_DBG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_MODE_STATUS_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_MODE_STATUS_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SPARE_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SPARE_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SPARE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_2)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_3)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_4)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_5)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_6)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_7)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_8)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_9)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_10)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_11)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_12)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_13)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_14)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_15)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_16)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_17)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_18)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_19)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_20)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_21)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_22)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_23)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_24)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_25)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_26)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_27)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_28)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_29)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_30)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_31)] = RD_REG, -}; diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.c b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.c deleted file mode 100644 index 5a12f0be2bc7..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.c +++ /dev/null @@ -1,3037 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "internal.h" -#include "wcd937x.h" -#include -#include "wcd937x-registers.h" -#include -#include -#include - - -#define WCD9370_VARIANT 0 -#define WCD9375_VARIANT 5 -#define WCD937X_VARIANT_ENTRY_SIZE 32 - -#define NUM_SWRS_DT_PARAMS 5 - -#define WCD937X_VERSION_1_0 1 -#define WCD937X_VERSION_ENTRY_SIZE 32 -#define EAR_RX_PATH_AUX 1 - -#define NUM_ATTEMPTS 5 - -enum { - CODEC_TX = 0, - CODEC_RX, -}; - -enum { - ALLOW_BUCK_DISABLE, - HPH_COMP_DELAY, - HPH_PA_DELAY, - AMIC2_BCS_ENABLE, -}; - -static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1); -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); - -static int wcd937x_handle_post_irq(void *data); -static int wcd937x_reset(struct device *dev); -static int wcd937x_reset_low(struct device *dev); - -static const struct regmap_irq wcd937x_irqs[WCD937X_NUM_IRQS] = { - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x02), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_ELECT_INS_REM_DET, 0, 0x04), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 0, 0x08), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_SW_DET, 0, 0x10), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_OCP_INT, 0, 0x20), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_CNP_INT, 0, 0x40), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_OCP_INT, 0, 0x80), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_CNP_INT, 1, 0x01), - REGMAP_IRQ_REG(WCD937X_IRQ_EAR_CNP_INT, 1, 0x02), - REGMAP_IRQ_REG(WCD937X_IRQ_EAR_SCD_INT, 1, 0x04), - REGMAP_IRQ_REG(WCD937X_IRQ_AUX_CNP_INT, 1, 0x08), - REGMAP_IRQ_REG(WCD937X_IRQ_AUX_SCD_INT, 1, 0x10), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_PDM_WD_INT, 1, 0x20), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_PDM_WD_INT, 1, 0x40), - REGMAP_IRQ_REG(WCD937X_IRQ_AUX_PDM_WD_INT, 1, 0x80), - REGMAP_IRQ_REG(WCD937X_IRQ_LDORT_SCD_INT, 2, 0x01), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_MOISTURE_INT, 2, 0x02), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_SURGE_DET_INT, 2, 0x04), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_SURGE_DET_INT, 2, 0x08), -}; - -static struct regmap_irq_chip wcd937x_regmap_irq_chip = { - .name = "wcd937x", - .irqs = wcd937x_irqs, - .num_irqs = ARRAY_SIZE(wcd937x_irqs), - .num_regs = 3, - .status_base = WCD937X_DIGITAL_INTR_STATUS_0, - .mask_base = WCD937X_DIGITAL_INTR_MASK_0, - .ack_base = WCD937X_DIGITAL_INTR_CLEAR_0, - .use_ack = 1, - .clear_ack = 1, - .type_base = WCD937X_DIGITAL_INTR_LEVEL_0, - .runtime_pm = false, - .handle_post_irq = wcd937x_handle_post_irq, - .irq_drv_data = NULL, -}; -static int wcd937x_handle_post_irq(void *data) -{ - struct wcd937x_priv *wcd937x = data; - u32 status1 = 0, status2 = 0, status3 = 0; - - regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_0, &status1); - regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_1, &status2); - regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_2, &status3); - - wcd937x->tx_swr_dev->slave_irq_pending = - ((status1 || status2 || status3) ? true : false); - - return IRQ_HANDLED; -} - -static int wcd937x_init_reg(struct snd_soc_codec *codec) -{ - snd_soc_update_bits(codec, WCD937X_SLEEP_CTL, 0x0E, 0x0E); - snd_soc_update_bits(codec, WCD937X_SLEEP_CTL, 0x80, 0x80); - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WCD937X_SLEEP_CTL, 0x40, 0x40); - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WCD937X_LDORXTX_CONFIG, 0x10, 0x00); - snd_soc_update_bits(codec, WCD937X_BIAS_VBG_FINE_ADJ, 0xF0, 0x80); - snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x80, 0x80); - snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x40, 0x40); - usleep_range(10000, 10010); - snd_soc_update_bits(codec, WCD937X_ANA_BIAS, - 0x40, 0x00); - snd_soc_update_bits(codec, - WCD937X_HPH_SURGE_HPHLR_SURGE_EN, - 0xFF, 0xD9); - snd_soc_update_bits(codec, WCD937X_MICB1_TEST_CTL_1, - 0xFF, 0xFA); - snd_soc_update_bits(codec, WCD937X_MICB2_TEST_CTL_1, - 0xFF, 0xFA); - snd_soc_update_bits(codec, WCD937X_MICB3_TEST_CTL_1, - 0xFF, 0xFA); - return 0; -} - -static int wcd937x_set_port_params(struct snd_soc_codec *codec, u8 slv_prt_type, - u8 *port_id, u8 *num_ch, u8 *ch_mask, u32 *ch_rate, - u8 *port_type, u8 path) -{ - int i, j; - u8 num_ports = 0; - struct codec_port_info (*map)[MAX_PORT][MAX_CH_PER_PORT] = NULL; - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - switch (path) { - case CODEC_RX: - map = &wcd937x->rx_port_mapping; - num_ports = wcd937x->num_rx_ports; - break; - case CODEC_TX: - map = &wcd937x->tx_port_mapping; - num_ports = wcd937x->num_tx_ports; - break; - } - - for (i = 0; i <= num_ports; i++) { - for (j = 0; j < MAX_CH_PER_PORT; j++) { - if ((*map)[i][j].slave_port_type == slv_prt_type) - goto found; - } - } -found: - if (i > num_ports || j == MAX_CH_PER_PORT) { - dev_err(codec->dev, "%s Failed to find slave port for type %u\n", - __func__, slv_prt_type); - return -EINVAL; - } - *port_id = i; - *num_ch = (*map)[i][j].num_ch; - *ch_mask = (*map)[i][j].ch_mask; - *ch_rate = (*map)[i][j].ch_rate; - *port_type = (*map)[i][j].master_port_type; - - return 0; -} - -static int wcd937x_parse_port_mapping(struct device *dev, - char *prop, u8 path) -{ - u32 *dt_array, map_size, map_length; - u32 port_num = 0, ch_mask, ch_rate, old_port_num = 0; - u32 slave_port_type, master_port_type; - u32 i, ch_iter = 0; - int ret = 0; - u8 *num_ports = NULL; - struct codec_port_info (*map)[MAX_PORT][MAX_CH_PER_PORT] = NULL; - struct wcd937x_priv *wcd937x = dev_get_drvdata(dev); - - switch (path) { - case CODEC_RX: - map = &wcd937x->rx_port_mapping; - num_ports = &wcd937x->num_rx_ports; - break; - case CODEC_TX: - map = &wcd937x->tx_port_mapping; - num_ports = &wcd937x->num_tx_ports; - break; - } - - if (!of_find_property(dev->of_node, prop, - &map_size)) { - dev_err(dev, "missing port mapping prop %s\n", prop); - ret = -EINVAL; - goto err; - } - - map_length = map_size / (NUM_SWRS_DT_PARAMS * sizeof(u32)); - - dt_array = kzalloc(map_size, GFP_KERNEL); - - if (!dt_array) { - ret = -ENOMEM; - goto err; - } - ret = of_property_read_u32_array(dev->of_node, prop, dt_array, - NUM_SWRS_DT_PARAMS * map_length); - if (ret) { - dev_err(dev, "%s: Failed to read port mapping from prop %s\n", - __func__, prop); - ret = -EINVAL; - goto err_pdata_fail; - } - - for (i = 0; i < map_length; i++) { - port_num = dt_array[NUM_SWRS_DT_PARAMS * i]; - slave_port_type = dt_array[NUM_SWRS_DT_PARAMS * i + 1]; - ch_mask = dt_array[NUM_SWRS_DT_PARAMS * i + 2]; - ch_rate = dt_array[NUM_SWRS_DT_PARAMS * i + 3]; - master_port_type = dt_array[NUM_SWRS_DT_PARAMS * i + 4]; - - if (port_num != old_port_num) - ch_iter = 0; - - (*map)[port_num][ch_iter].slave_port_type = slave_port_type; - (*map)[port_num][ch_iter].ch_mask = ch_mask; - (*map)[port_num][ch_iter].master_port_type = master_port_type; - (*map)[port_num][ch_iter].num_ch = __sw_hweight8(ch_mask); - (*map)[port_num][ch_iter++].ch_rate = ch_rate; - old_port_num = port_num; - } - *num_ports = port_num; - kfree(dt_array); - return 0; - -err_pdata_fail: - kfree(dt_array); -err: - return ret; -} - -static int wcd937x_tx_connect_port(struct snd_soc_codec *codec, - u8 slv_port_type, u8 enable) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u8 port_id; - u8 num_ch; - u8 ch_mask; - u32 ch_rate; - u8 port_type; - u8 num_port = 1; - int ret = 0; - - ret = wcd937x_set_port_params(codec, slv_port_type, &port_id, - &num_ch, &ch_mask, &ch_rate, - &port_type, CODEC_TX); - - if (ret) - return ret; - - if (enable) - ret = swr_connect_port(wcd937x->tx_swr_dev, &port_id, - num_port, &ch_mask, &ch_rate, - &num_ch, &port_type); - else - ret = swr_disconnect_port(wcd937x->tx_swr_dev, &port_id, - num_port, &ch_mask, &port_type); - return ret; - -} -static int wcd937x_rx_connect_port(struct snd_soc_codec *codec, - u8 slv_port_type, u8 enable) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u8 port_id; - u8 num_ch; - u8 ch_mask; - u32 ch_rate; - u8 port_type; - u8 num_port = 1; - int ret = 0; - - ret = wcd937x_set_port_params(codec, slv_port_type, &port_id, - &num_ch, &ch_mask, &ch_rate, - &port_type, CODEC_RX); - - if (ret) - return ret; - - if (enable) - ret = swr_connect_port(wcd937x->rx_swr_dev, &port_id, - num_port, &ch_mask, &ch_rate, - &num_ch, &port_type); - else - ret = swr_disconnect_port(wcd937x->rx_swr_dev, &port_id, - num_port, &ch_mask, &port_type); - return ret; -} - -static int wcd937x_rx_clk_enable(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (wcd937x->rx_clk_cnt == 0) { - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x08, 0x08); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX0_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX1_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX2_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x02, 0x02); - } - wcd937x->rx_clk_cnt++; - - return 0; -} - -static int wcd937x_rx_clk_disable(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (wcd937x->rx_clk_cnt == 0) { - dev_dbg(wcd937x->dev, "%s:clk already disabled\n", __func__); - return 0; - } - wcd937x->rx_clk_cnt--; - if (wcd937x->rx_clk_cnt == 0) { - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, 0x01, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x01, 0x00); - } - return 0; -} - -/* - * wcd937x_soc_get_mbhc: get wcd937x_mbhc handle of corresponding codec - * @codec: handle to snd_soc_codec * - * - * return wcd937x_mbhc handle or error code in case of failure - */ -struct wcd937x_mbhc *wcd937x_soc_get_mbhc(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x; - - if (!codec) { - pr_err("%s: Invalid params, NULL codec\n", __func__); - return NULL; - } - wcd937x = snd_soc_codec_get_drvdata(codec); - - if (!wcd937x) { - pr_err("%s: Invalid params, NULL tavil\n", __func__); - return NULL; - } - - return wcd937x->mbhc; -} -EXPORT_SYMBOL(wcd937x_soc_get_mbhc); - -static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_HPH_RDAC_CLK_CTL1, - 0x80, 0x00); - set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x02); - else if (hph_mode == CLS_H_LOHIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x06); - if (wcd937x->comp1_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x02); - snd_soc_update_bits(codec, - WCD937X_HPH_L_EN, 0x20, 0x00); - if (wcd937x->comp2_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD937X_HPH_R_EN, 0x20, 0x00); - } - /* - * 5ms sleep is required after COMP is enabled as per - * HW requirement - */ - if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) { - usleep_range(5000, 5100); - clear_bit(HPH_COMP_DELAY, - &wcd937x->status_mask); - } - } else { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x00); - snd_soc_update_bits(codec, - WCD937X_HPH_L_EN, 0x20, 0x20); - } - snd_soc_update_bits(codec, WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x01); - break; - } - - return 0; -} - -static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, - 0x08, 0x08); - snd_soc_update_bits(codec, WCD937X_HPH_RDAC_CLK_CTL1, - 0x80, 0x00); - set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x02); - else if (hph_mode == CLS_H_LOHIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x06); - if (wcd937x->comp2_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD937X_HPH_R_EN, 0x20, 0x00); - if (wcd937x->comp1_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x02); - snd_soc_update_bits(codec, - WCD937X_HPH_L_EN, 0x20, 0x00); - } - /* - * 5ms sleep is required after COMP is enabled as per - * HW requirement - */ - if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) { - usleep_range(5000, 5100); - clear_bit(HPH_COMP_DELAY, - &wcd937x->status_mask); - } - } else { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD937X_HPH_R_EN, 0x20, 0x20); - } - snd_soc_update_bits(codec, WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x01); - break; - } - - return 0; -} - -static int wcd937x_codec_ear_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x01, 0x01); - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x02); - else if (hph_mode == CLS_H_LOHIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x06); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x02); - usleep_range(5000, 5010); - snd_soc_update_bits(codec, WCD937X_FLYBACK_EN, - 0x04, 0x00); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_EAR, - hph_mode); - - break; - case SND_SOC_DAPM_POST_PMD: - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_LOHIFI || - hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x01); - break; - }; - return 0; - -} - -static int wcd937x_codec_aux_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_AUX_GAIN_CTL, - 0x01, 0x01); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_AUX, - hph_mode); - - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x04, 0x00); - break; - }; - return 0; - -} - -static int wcd937x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHR, - hph_mode); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x10, 0x10); - usleep_range(100, 110); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL1, 0x17, 0x13); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp2_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX2 << 0x10)); - wcd_enable_irq(&wcd937x->irq_info, - WCD937X_IRQ_HPHR_PDM_WD_INT); - break; - case SND_SOC_DAPM_PRE_PMD: - wcd_disable_irq(&wcd937x->irq_info, - WCD937X_IRQ_HPHR_PDM_WD_INT); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX2 << 0x10 | 0x1)); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_PRE_HPHR_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 7ms sleep is required after PA is disabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp2_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, WCD937X_DIGITAL_PDM_WD_CTL1, - 0x17, 0x00); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_POST_HPHR_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x10, 0x00); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHR, - hph_mode); - break; - }; - return ret; -} - -static int wcd937x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHL, - hph_mode); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x20, 0x20); - usleep_range(100, 110); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL0, 0x17, 0x13); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp1_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10)); - wcd_enable_irq(&wcd937x->irq_info, - WCD937X_IRQ_HPHL_PDM_WD_INT); - break; - case SND_SOC_DAPM_PRE_PMD: - wcd_disable_irq(&wcd937x->irq_info, - WCD937X_IRQ_HPHL_PDM_WD_INT); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10 | 0x1)); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_PRE_HPHL_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 7ms sleep is required after PA is disabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp1_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, WCD937X_DIGITAL_PDM_WD_CTL0, - 0x17, 0x00); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_POST_HPHL_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x20, 0x00); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHL, - hph_mode); - break; - }; - return ret; -} - -static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL2, 0x05, 0x05); - break; - case SND_SOC_DAPM_POST_PMU: - usleep_range(1000, 1010); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10)); - wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT); - break; - case SND_SOC_DAPM_PRE_PMD: - wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10 | 0x1)); - break; - case SND_SOC_DAPM_POST_PMD: - /* Add delay as per hw requirement */ - usleep_range(2000, 2010); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_AUX, - hph_mode); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL2, 0x05, 0x00); - break; - }; - return ret; -} - -static int wcd937x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - /* - * Enable watchdog interrupt for HPHL or AUX - * depending on mux value - */ - wcd937x->ear_rx_path = - snd_soc_read( - codec, WCD937X_DIGITAL_CDC_EAR_PATH_CTL); - if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL2, - 0x05, 0x05); - else - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL0, - 0x17, 0x13); - if (!wcd937x->comp1_enable) - snd_soc_update_bits(codec, - WCD937X_ANA_EAR_COMPANDER_CTL, 0x80, 0x80); - break; - case SND_SOC_DAPM_POST_PMU: - usleep_range(6000, 6010); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10)); - if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) - wcd_enable_irq(&wcd937x->irq_info, - WCD937X_IRQ_AUX_PDM_WD_INT); - else - wcd_enable_irq(&wcd937x->irq_info, - WCD937X_IRQ_HPHL_PDM_WD_INT); - break; - case SND_SOC_DAPM_PRE_PMD: - if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) - wcd_disable_irq(&wcd937x->irq_info, - WCD937X_IRQ_AUX_PDM_WD_INT); - else - wcd_disable_irq(&wcd937x->irq_info, - WCD937X_IRQ_HPHL_PDM_WD_INT); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10 | 0x1)); - break; - case SND_SOC_DAPM_POST_PMD: - if (!wcd937x->comp1_enable) - snd_soc_update_bits(codec, - WCD937X_ANA_EAR_COMPANDER_CTL, 0x80, 0x00); - usleep_range(7000, 7010); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_EAR, - hph_mode); - snd_soc_update_bits(codec, WCD937X_FLYBACK_EN, - 0x04, 0x04); - if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL2, - 0x05, 0x00); - else - snd_soc_update_bits(codec, - WCD937X_DIGITAL_PDM_WD_CTL0, - 0x17, 0x00); - break; - }; - return ret; -} - -static int wcd937x_enable_clsh(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int mode = wcd937x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - if (mode == CLS_H_LOHIFI || mode == CLS_H_ULP || - mode == CLS_H_HIFI || mode == CLS_H_LP) { - wcd937x_rx_connect_port(codec, CLSH, - SND_SOC_DAPM_EVENT_ON(event)); - } - if (SND_SOC_DAPM_EVENT_OFF(event)) - ret = swr_slvdev_datapath_control( - wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - false); - return ret; -} - -static int wcd937x_enable_rx1(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_connect_port(codec, HPH_L, true); - if (wcd937x->comp1_enable) - wcd937x_rx_connect_port(codec, COMP_L, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_rx_connect_port(codec, HPH_L, false); - if (wcd937x->comp1_enable) - wcd937x_rx_connect_port(codec, COMP_L, false); - wcd937x_rx_clk_disable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x01, 0x00); - break; - }; - return 0; -} - -static int wcd937x_enable_rx2(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_connect_port(codec, HPH_R, true); - if (wcd937x->comp2_enable) - wcd937x_rx_connect_port(codec, COMP_R, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_rx_connect_port(codec, HPH_R, false); - if (wcd937x->comp2_enable) - wcd937x_rx_connect_port(codec, COMP_R, false); - wcd937x_rx_clk_disable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x02, 0x00); - break; - }; - - return 0; -} - -static int wcd937x_enable_rx3(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_connect_port(codec, LO, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_rx_connect_port(codec, LO, false); - usleep_range(6000, 6010); - wcd937x_rx_clk_disable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x04, 0x00); - break; - } - return 0; - -} - -static int wcd937x_codec_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u16 dmic_clk_reg; - s32 *dmic_clk_cnt; - unsigned int dmic; - char *wname; - int ret = 0; - - wname = strpbrk(w->name, "012345"); - - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(wcd937x->dmic_0_1_clk_cnt); - dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC1_CTL; - break; - case 2: - case 3: - dmic_clk_cnt = &(wcd937x->dmic_2_3_clk_cnt); - dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC2_CTL; - break; - case 4: - case 5: - dmic_clk_cnt = &(wcd937x->dmic_4_5_clk_cnt); - dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC3_CTL; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - }; - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x80); - snd_soc_update_bits(codec, dmic_clk_reg, 0x07, 0x02); - snd_soc_update_bits(codec, dmic_clk_reg, 0x08, 0x08); - snd_soc_update_bits(codec, dmic_clk_reg, 0x70, 0x20); - wcd937x_tx_connect_port(codec, DMIC0 + (w->shift), true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_tx_connect_port(codec, DMIC0 + (w->shift), false); - break; - - }; - return 0; -} - -/* - * wcd937x_get_micb_vout_ctl_val: converts micbias from volts to register value - * @micb_mv: micbias in mv - * - * return register value converted - */ -int wcd937x_get_micb_vout_ctl_val(u32 micb_mv) -{ - /* min micbias voltage is 1V and maximum is 2.85V */ - if (micb_mv < 1000 || micb_mv > 2850) { - pr_err("%s: unsupported micbias voltage\n", __func__); - return -EINVAL; - } - - return (micb_mv - 1000) / 50; -} -EXPORT_SYMBOL(wcd937x_get_micb_vout_ctl_val); - -/* - * wcd937x_mbhc_micb_adjust_voltage: adjust specific micbias voltage - * @codec: handle to snd_soc_codec * - * @req_volt: micbias voltage to be set - * @micb_num: micbias to be set, e.g. micbias1 or micbias2 - * - * return 0 if adjustment is success or error code in case of failure - */ -int wcd937x_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, int micb_num) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int cur_vout_ctl, req_vout_ctl; - int micb_reg, micb_val, micb_en; - int ret = 0; - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD937X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD937X_ANA_MICB2; - break; - case MIC_BIAS_3: - micb_reg = WCD937X_ANA_MICB3; - break; - default: - return -EINVAL; - } - mutex_lock(&wcd937x->micb_lock); - - /* - * If requested micbias voltage is same as current micbias - * voltage, then just return. Otherwise, adjust voltage as - * per requested value. If micbias is already enabled, then - * to avoid slow micbias ramp-up or down enable pull-up - * momentarily, change the micbias value and then re-enable - * micbias. - */ - micb_val = snd_soc_read(codec, micb_reg); - micb_en = (micb_val & 0xC0) >> 6; - cur_vout_ctl = micb_val & 0x3F; - - req_vout_ctl = wcd937x_get_micb_vout_ctl_val(req_volt); - if (req_vout_ctl < 0) { - ret = -EINVAL; - goto exit; - } - if (cur_vout_ctl == req_vout_ctl) { - ret = 0; - goto exit; - } - - dev_dbg(codec->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", - __func__, micb_num, WCD_VOUT_CTL_TO_MICB(cur_vout_ctl), - req_volt, micb_en); - - if (micb_en == 0x1) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - - snd_soc_update_bits(codec, micb_reg, 0x3F, req_vout_ctl); - - if (micb_en == 0x1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - /* - * Add 2ms delay as per HW requirement after enabling - * micbias - */ - usleep_range(2000, 2100); - } -exit: - mutex_unlock(&wcd937x->micb_lock); - return ret; -} -EXPORT_SYMBOL(wcd937x_mbhc_micb_adjust_voltage); - -static int wcd937x_tx_swr_ctrl(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->tx_swr_dev, - wcd937x->tx_swr_dev->dev_num, - true); - break; - case SND_SOC_DAPM_POST_PMD: - ret = swr_slvdev_datapath_control(wcd937x->tx_swr_dev, - wcd937x->tx_swr_dev->dev_num, - false); - break; - }; - - return ret; -} - -static int wcd937x_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event){ - - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count++; - mutex_unlock(&wcd937x->ana_tx_clk_lock); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0x80, 0x80); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x08); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); - /* Enable BCS for Headset mic */ - if (w->shift == 1 && !(snd_soc_read(codec, - WCD937X_TX_NEW_TX_CH2_SEL) & 0x80)) { - wcd937x_tx_connect_port(codec, MBHC, true); - set_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask); - } - wcd937x_tx_connect_port(codec, ADC1 + (w->shift), true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_tx_connect_port(codec, ADC1 + (w->shift), false); - if (w->shift == 1 && - test_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask)) { - wcd937x_tx_connect_port(codec, MBHC, false); - clear_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask); - } - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x00); - break; - }; - - return 0; -} - -static int wcd937x_enable_req(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_REQ_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_REQ_CTL, 0x01, - 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x40); - snd_soc_update_bits(codec, - WCD937X_ANA_TX_CH3_HPF, 0x40, 0x40); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x70, 0x70); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x80); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x80, 0x80); - snd_soc_update_bits(codec, - WCD937X_ANA_TX_CH3, 0x80, 0x80); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD937X_ANA_TX_CH1, 0x80, 0x00); - snd_soc_update_bits(codec, - WCD937X_ANA_TX_CH2, 0x80, 0x00); - snd_soc_update_bits(codec, - WCD937X_ANA_TX_CH3, 0x80, 0x00); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0x10, 0x00); - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count--; - if (wcd937x->ana_clk_count <= 0) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x00); - wcd937x->ana_clk_count = 0; - } - - mutex_unlock(&wcd937x->ana_tx_clk_lock); - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0x80, 0x00); - break; - }; - return 0; -} - -int wcd937x_micbias_control(struct snd_soc_codec *codec, - int micb_num, int req, bool is_dapm) -{ - - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int micb_index = micb_num - 1; - u16 micb_reg; - int pre_off_event = 0, post_off_event = 0; - int post_on_event = 0, post_dapm_off = 0; - int post_dapm_on = 0; - - if ((micb_index < 0) || (micb_index > WCD937X_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD937X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD937X_ANA_MICB2; - pre_off_event = WCD_EVENT_PRE_MICBIAS_2_OFF; - post_off_event = WCD_EVENT_POST_MICBIAS_2_OFF; - post_on_event = WCD_EVENT_POST_MICBIAS_2_ON; - post_dapm_on = WCD_EVENT_POST_DAPM_MICBIAS_2_ON; - post_dapm_off = WCD_EVENT_POST_DAPM_MICBIAS_2_OFF; - break; - case MIC_BIAS_3: - micb_reg = WCD937X_ANA_MICB3; - break; - default: - dev_err(codec->dev, "%s: Invalid micbias number: %d\n", - __func__, micb_num); - return -EINVAL; - }; - mutex_lock(&wcd937x->micb_lock); - - switch (req) { - case MICB_PULLUP_ENABLE: - wcd937x->pullup_ref[micb_index]++; - if ((wcd937x->pullup_ref[micb_index] == 1) && - (wcd937x->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - break; - case MICB_PULLUP_DISABLE: - if (wcd937x->pullup_ref[micb_index] > 0) - wcd937x->pullup_ref[micb_index]--; - if ((wcd937x->pullup_ref[micb_index] == 0) && - (wcd937x->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - break; - case MICB_ENABLE: - wcd937x->micb_ref[micb_index]++; - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count++; - mutex_unlock(&wcd937x->ana_tx_clk_lock); - if (wcd937x->micb_ref[micb_index] == 1) { - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0xE0, 0xE0); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, WCD937X_MICB1_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_MICB2_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_MICB3_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - if (post_on_event) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, post_on_event, - &wcd937x->mbhc->wcd_mbhc); - } - if (is_dapm && post_dapm_on && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, post_dapm_on, - &wcd937x->mbhc->wcd_mbhc); - break; - case MICB_DISABLE: - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count--; - mutex_unlock(&wcd937x->ana_tx_clk_lock); - if (wcd937x->micb_ref[micb_index] > 0) - wcd937x->micb_ref[micb_index]--; - if ((wcd937x->micb_ref[micb_index] == 0) && - (wcd937x->pullup_ref[micb_index] > 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - else if ((wcd937x->micb_ref[micb_index] == 0) && - (wcd937x->pullup_ref[micb_index] == 0)) { - if (pre_off_event && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, pre_off_event, - &wcd937x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - if (post_off_event && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, - post_off_event, - &wcd937x->mbhc->wcd_mbhc); - } - mutex_lock(&wcd937x->ana_tx_clk_lock); - if (wcd937x->ana_clk_count <= 0) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x10, 0x00); - wcd937x->ana_clk_count = 0; - } - mutex_unlock(&wcd937x->ana_tx_clk_lock); - if (is_dapm && post_dapm_off && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, post_dapm_off, - &wcd937x->mbhc->wcd_mbhc); - break; - }; - - dev_dbg(codec->dev, "%s: micb_num:%d, micb_ref: %d, pullup_ref: %d\n", - __func__, micb_num, wcd937x->micb_ref[micb_index], - wcd937x->pullup_ref[micb_index]); - mutex_unlock(&wcd937x->micb_lock); - - return 0; -} -EXPORT_SYMBOL(wcd937x_micbias_control); - -void wcd937x_disable_bcs_before_slow_insert(struct snd_soc_codec *codec, - bool bcs_disable) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (wcd937x->update_wcd_event) { - if (bcs_disable) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_BCS_CLK_OFF, 0); - else - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_BCS_CLK_OFF, 1); - } -} - -static int wcd937x_get_logical_addr(struct swr_device *swr_dev) -{ - int ret = 0; - uint8_t devnum = 0; - int num_retry = NUM_ATTEMPTS; - - do { - ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum); - if (ret) { - dev_err(&swr_dev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, swr_dev->addr); - /* retry after 1ms */ - usleep_range(1000, 1010); - } - } while (ret && --num_retry); - swr_dev->dev_num = devnum; - return 0; -} - -static int wcd937x_event_notify(struct notifier_block *block, - unsigned long val, - void *data) -{ - u16 event = (val & 0xffff); - u16 amic = (val >> 0x10); - u16 mask = 0x40, reg = 0x0; - int ret = 0; - struct wcd937x_priv *wcd937x = dev_get_drvdata((struct device *)data); - struct snd_soc_codec *codec = wcd937x->codec; - struct wcd_mbhc *mbhc; - - switch (event) { - case BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR: - if (amic == 0x1 || amic == 0x2) - reg = WCD937X_ANA_TX_CH2; - else if (amic == 0x3) - reg = WCD937X_ANA_TX_CH3_HPF; - else - return 0; - if (amic == 0x2) - mask = 0x20; - snd_soc_update_bits(codec, reg, mask, 0x00); - break; - case BOLERO_WCD_EVT_PA_OFF_PRE_SSR: - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0xC0, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_EAR, 0x80, 0x00); - snd_soc_update_bits(codec, WCD937X_AUX_AUXPA, 0x80, 0x00); - break; - case BOLERO_WCD_EVT_SSR_DOWN: - wcd937x->mbhc->wcd_mbhc.deinit_in_progress = true; - mbhc = &wcd937x->mbhc->wcd_mbhc; - wcd937x_mbhc_ssr_down(wcd937x->mbhc, codec); - wcd937x_reset_low(wcd937x->dev); - break; - case BOLERO_WCD_EVT_SSR_UP: - wcd937x_reset(wcd937x->dev); - /* allow reset to take effect */ - usleep_range(10000, 10010); - wcd937x_get_logical_addr(wcd937x->tx_swr_dev); - wcd937x_get_logical_addr(wcd937x->rx_swr_dev); - wcd937x_init_reg(codec); - regcache_mark_dirty(wcd937x->regmap); - regcache_sync(wcd937x->regmap); - /* Initialize MBHC module */ - mbhc = &wcd937x->mbhc->wcd_mbhc; - ret = wcd937x_mbhc_post_ssr_init(wcd937x->mbhc, codec); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - } else { - wcd937x_mbhc_hs_detect(codec, mbhc->mbhc_cfg); - } - wcd937x->mbhc->wcd_mbhc.deinit_in_progress = false; - break; - default: - dev_err(codec->dev, "%s: invalid event %d\n", __func__, event); - break; - } - return 0; -} - -static int __wcd937x_codec_enable_micbias(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2"))) - micb_num = MIC_BIAS_2; - else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3"))) - micb_num = MIC_BIAS_3; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_micbias_control(codec, micb_num, MICB_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_micbias_control(codec, micb_num, MICB_DISABLE, true); - break; - }; - - return 0; - -} - -static int wcd937x_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - return __wcd937x_codec_enable_micbias(w, event); -} - -static int __wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "VA MIC BIAS1", sizeof("VA MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else if (strnstr(w->name, "VA MIC BIAS2", sizeof("VA MIC BIAS2"))) - micb_num = MIC_BIAS_2; - else if (strnstr(w->name, "VA MIC BIAS3", sizeof("VA MIC BIAS3"))) - micb_num = MIC_BIAS_3; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_micbias_control(codec, micb_num, - MICB_PULLUP_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - /* 1 msec delay as per HW requirement */ - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_micbias_control(codec, micb_num, - MICB_PULLUP_DISABLE, true); - break; - }; - - return 0; - -} - -static int wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - return __wcd937x_codec_enable_micbias_pullup(w, event); -} - -static int wcd937x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wcd937x->hph_mode; - return 0; -} - -static int wcd937x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u32 mode_val; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (mode_val == 0) { - dev_warn(codec->dev, "%s:Invalid HPH Mode, default to class_AB\n", - __func__); - mode_val = 3; /* enum will be updated later */ - } - wcd937x->hph_mode = mode_val; - return 0; -} - -static int wcd937x_ear_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain = 0; - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - - ear_pa_gain = snd_soc_read(codec, WCD937X_ANA_EAR_COMPANDER_CTL); - - ear_pa_gain = (ear_pa_gain & 0x7C) >> 2; - - ucontrol->value.integer.value[0] = ear_pa_gain; - - dev_dbg(codec->dev, "%s: ear_pa_gain = 0x%x\n", __func__, - ear_pa_gain); - - return 0; -} - -static int wcd937x_ear_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain = 0; - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - ear_pa_gain = ucontrol->value.integer.value[0] << 2; - - if (!wcd937x->comp1_enable) { - snd_soc_update_bits(codec, WCD937X_ANA_EAR_COMPANDER_CTL, - 0x7C, ear_pa_gain); - } - - return 0; -} - -static int wcd937x_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - bool hphr; - struct soc_multi_mixer_control *mc; - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - - ucontrol->value.integer.value[0] = hphr ? wcd937x->comp2_enable : - wcd937x->comp1_enable; - return 0; -} - -static int wcd937x_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - bool hphr; - struct soc_multi_mixer_control *mc; - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - if (hphr) - wcd937x->comp2_enable = value; - else - wcd937x->comp1_enable = value; - - return 0; -} - -static int wcd937x_codec_enable_vdd_buck(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - struct wcd937x_pdata *pdata = NULL; - int ret = 0; - - pdata = dev_get_platdata(wcd937x->dev); - - if (!pdata) { - dev_err(codec->dev, "%s: pdata is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (test_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask)) { - dev_dbg(codec->dev, - "%s: buck already in enabled state\n", - __func__); - clear_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - return 0; - } - ret = msm_cdc_enable_ondemand_supply(wcd937x->dev, - wcd937x->supplies, - pdata->regulator, - pdata->num_supplies, - "cdc-vdd-buck"); - if (ret == -EINVAL) { - dev_err(codec->dev, "%s: vdd buck is not enabled\n", - __func__); - return ret; - } - clear_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - /* - * 200us sleep is required after LDO15 is enabled as per - * HW requirement - */ - usleep_range(200, 250); - break; - case SND_SOC_DAPM_POST_PMD: - set_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - break; - } - return 0; -} - -static const char * const rx_hph_mode_mux_text[] = { - "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", - "CLS_H_ULP", "CLS_AB_HIFI", -}; - -static const char * const wcd937x_ear_pa_gain_text[] = { - "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", "G_0_DB", - "G_M1P5_DB", "G_M3_DB", "G_M4P5_DB", - "G_M6_DB", "G_7P5_DB", "G_M9_DB", - "G_M10P5_DB", "G_M12_DB", "G_M13P5_DB", - "G_M15_DB", "G_M16P5_DB", "G_M18_DB", -}; - -static const struct soc_enum rx_hph_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), - rx_hph_mode_mux_text); - -static SOC_ENUM_SINGLE_EXT_DECL(wcd937x_ear_pa_gain_enum, - wcd937x_ear_pa_gain_text); - -static const struct snd_kcontrol_new wcd937x_snd_controls[] = { - SOC_ENUM_EXT("EAR PA GAIN", wcd937x_ear_pa_gain_enum, - wcd937x_ear_pa_gain_get, wcd937x_ear_pa_gain_put), - SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, - wcd937x_rx_hph_mode_get, wcd937x_rx_hph_mode_put), - SOC_SINGLE_EXT("HPHL_COMP Switch", SND_SOC_NOPM, 0, 1, 0, - wcd937x_get_compander, wcd937x_set_compander), - SOC_SINGLE_EXT("HPHR_COMP Switch", SND_SOC_NOPM, 1, 1, 0, - wcd937x_get_compander, wcd937x_set_compander), - - SOC_SINGLE_TLV("HPHL Volume", WCD937X_HPH_L_EN, 0, 20, 1, line_gain), - SOC_SINGLE_TLV("HPHR Volume", WCD937X_HPH_R_EN, 0, 20, 1, line_gain), - SOC_SINGLE_TLV("ADC1 Volume", WCD937X_ANA_TX_CH1, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC2 Volume", WCD937X_ANA_TX_CH2, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC3 Volume", WCD937X_ANA_TX_CH3, 0, 20, 0, analog_gain), -}; - -static const struct snd_kcontrol_new adc1_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new adc2_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new adc3_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic1_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic2_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic3_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic4_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic5_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic6_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new ear_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new aux_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new hphl_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new hphr_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const char * const adc2_mux_text[] = { - "INP2", "INP3" -}; - -static const char * const rdac3_mux_text[] = { - "RX1", "RX3" -}; - -static const struct soc_enum adc2_enum = - SOC_ENUM_SINGLE(WCD937X_TX_NEW_TX_CH2_SEL, 7, - ARRAY_SIZE(adc2_mux_text), adc2_mux_text); - - -static const struct soc_enum rdac3_enum = - SOC_ENUM_SINGLE(WCD937X_DIGITAL_CDC_EAR_PATH_CTL, 0, - ARRAY_SIZE(rdac3_mux_text), rdac3_mux_text); - -static const struct snd_kcontrol_new tx_adc2_mux = - SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum); - -static const struct snd_kcontrol_new rx_rdac3_mux = - SOC_DAPM_ENUM("RDAC3_MUX Mux", rdac3_enum); - -static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = { - - /*input widgets*/ - - SND_SOC_DAPM_INPUT("AMIC1"), - SND_SOC_DAPM_INPUT("AMIC2"), - SND_SOC_DAPM_INPUT("AMIC3"), - SND_SOC_DAPM_INPUT("IN1_HPHL"), - SND_SOC_DAPM_INPUT("IN2_HPHR"), - SND_SOC_DAPM_INPUT("IN3_AUX"), - - /*tx widgets*/ - SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0, - wcd937x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("ADC1 REQ", SND_SOC_NOPM, 0, 0, - NULL, 0, wcd937x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 0, 0, - NULL, 0, wcd937x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, - &tx_adc2_mux), - - /*tx mixers*/ - SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, 0, 0, - adc1_switch, ARRAY_SIZE(adc1_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, 0, 0, - adc2_switch, ARRAY_SIZE(adc2_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - /* micbias widgets*/ - SND_SOC_DAPM_MICBIAS_E("MIC BIAS1", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS2", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS3", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_vdd_buck, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("CLS_H_PORT", 1, SND_SOC_NOPM, 0, 0, - wcd937x_enable_clsh, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /*rx widgets*/ - SND_SOC_DAPM_PGA_E("EAR PGA", WCD937X_ANA_EAR, 7, 0, NULL, 0, - wcd937x_codec_enable_ear_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("AUX PGA", WCD937X_AUX_AUXPA, 7, 0, NULL, 0, - wcd937x_codec_enable_aux_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHL PGA", WCD937X_ANA_HPH, 7, 0, NULL, 0, - wcd937x_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHR PGA", WCD937X_ANA_HPH, 6, 0, NULL, 0, - wcd937x_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_DAC_E("RDAC1", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_hphl_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC2", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_hphr_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC3", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_ear_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC4", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_aux_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("RDAC3_MUX", SND_SOC_NOPM, 0, 0, &rx_rdac3_mux), - - SND_SOC_DAPM_MIXER_E("RX1", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd937x_enable_rx1, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX2", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd937x_enable_rx2, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX3", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd937x_enable_rx3, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - /* rx mixer widgets*/ - - SND_SOC_DAPM_MIXER("EAR_RDAC", SND_SOC_NOPM, 0, 0, - ear_rdac_switch, ARRAY_SIZE(ear_rdac_switch)), - SND_SOC_DAPM_MIXER("AUX_RDAC", SND_SOC_NOPM, 0, 0, - aux_rdac_switch, ARRAY_SIZE(aux_rdac_switch)), - SND_SOC_DAPM_MIXER("HPHL_RDAC", SND_SOC_NOPM, 0, 0, - hphl_rdac_switch, ARRAY_SIZE(hphl_rdac_switch)), - SND_SOC_DAPM_MIXER("HPHR_RDAC", SND_SOC_NOPM, 0, 0, - hphr_rdac_switch, ARRAY_SIZE(hphr_rdac_switch)), - - /*output widgets tx*/ - - SND_SOC_DAPM_OUTPUT("ADC1_OUTPUT"), - SND_SOC_DAPM_OUTPUT("ADC2_OUTPUT"), - - /*output widgets rx*/ - SND_SOC_DAPM_OUTPUT("EAR"), - SND_SOC_DAPM_OUTPUT("AUX"), - SND_SOC_DAPM_OUTPUT("HPHL"), - SND_SOC_DAPM_OUTPUT("HPHR"), - - /* micbias pull up widgets*/ - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias_pullup, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS2", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias_pullup, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS3", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias_pullup, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - -}; - -static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = { - - /*input widgets*/ - SND_SOC_DAPM_INPUT("AMIC4"), - - /*tx widgets*/ - SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0, - wcd937x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("ADC3 REQ", SND_SOC_NOPM, 0, 0, - NULL, 0, wcd937x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /*tx mixer widgets*/ - SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, 0, - 0, dmic1_switch, ARRAY_SIZE(dmic1_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, 0, - 0, dmic2_switch, ARRAY_SIZE(dmic2_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, 0, - 0, dmic3_switch, ARRAY_SIZE(dmic3_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, 0, - 0, dmic4_switch, ARRAY_SIZE(dmic4_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, 0, - 0, dmic5_switch, ARRAY_SIZE(dmic5_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, 0, - 0, dmic6_switch, ARRAY_SIZE(dmic6_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, 0, 0, adc3_switch, - ARRAY_SIZE(adc3_switch), wcd937x_tx_swr_ctrl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /*output widgets*/ - SND_SOC_DAPM_OUTPUT("DMIC1_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC2_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC3_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC4_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC5_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC6_OUTPUT"), - SND_SOC_DAPM_OUTPUT("ADC3_OUTPUT"), - -}; - -static const struct snd_soc_dapm_route wcd937x_audio_map[] = { - {"ADC1_OUTPUT", NULL, "ADC1_MIXER"}, - {"ADC1_MIXER", "Switch", "ADC1 REQ"}, - {"ADC1 REQ", NULL, "ADC1"}, - {"ADC1", NULL, "AMIC1"}, - - {"ADC2_OUTPUT", NULL, "ADC2_MIXER"}, - {"ADC2_MIXER", "Switch", "ADC2 REQ"}, - {"ADC2 REQ", NULL, "ADC2"}, - {"ADC2", NULL, "ADC2 MUX"}, - {"ADC2 MUX", "INP3", "AMIC3"}, - {"ADC2 MUX", "INP2", "AMIC2"}, - - {"IN1_HPHL", NULL, "VDD_BUCK"}, - {"IN1_HPHL", NULL, "CLS_H_PORT"}, - {"RX1", NULL, "IN1_HPHL"}, - {"RDAC1", NULL, "RX1"}, - {"HPHL_RDAC", "Switch", "RDAC1"}, - {"HPHL PGA", NULL, "HPHL_RDAC"}, - {"HPHL", NULL, "HPHL PGA"}, - - {"IN2_HPHR", NULL, "VDD_BUCK"}, - {"IN2_HPHR", NULL, "CLS_H_PORT"}, - {"RX2", NULL, "IN2_HPHR"}, - {"RDAC2", NULL, "RX2"}, - {"HPHR_RDAC", "Switch", "RDAC2"}, - {"HPHR PGA", NULL, "HPHR_RDAC"}, - {"HPHR", NULL, "HPHR PGA"}, - - {"IN3_AUX", NULL, "VDD_BUCK"}, - {"IN3_AUX", NULL, "CLS_H_PORT"}, - {"RX3", NULL, "IN3_AUX"}, - {"RDAC4", NULL, "RX3"}, - {"AUX_RDAC", "Switch", "RDAC4"}, - {"AUX PGA", NULL, "AUX_RDAC"}, - {"AUX", NULL, "AUX PGA"}, - - {"RDAC3_MUX", "RX3", "RX3"}, - {"RDAC3_MUX", "RX1", "RX1"}, - {"RDAC3", NULL, "RDAC3_MUX"}, - {"EAR_RDAC", "Switch", "RDAC3"}, - {"EAR PGA", NULL, "EAR_RDAC"}, - {"EAR", NULL, "EAR PGA"}, -}; - -static const struct snd_soc_dapm_route wcd9375_audio_map[] = { - - {"ADC3_OUTPUT", NULL, "ADC3_MIXER"}, - {"ADC3_MIXER", "Switch", "ADC3 REQ"}, - {"ADC3 REQ", NULL, "ADC3"}, - {"ADC3", NULL, "AMIC4"}, - - {"DMIC1_OUTPUT", NULL, "DMIC1_MIXER"}, - {"DMIC1_MIXER", "Switch", "DMIC1"}, - - {"DMIC2_OUTPUT", NULL, "DMIC2_MIXER"}, - {"DMIC2_MIXER", "Switch", "DMIC2"}, - - {"DMIC3_OUTPUT", NULL, "DMIC3_MIXER"}, - {"DMIC3_MIXER", "Switch", "DMIC3"}, - - {"DMIC4_OUTPUT", NULL, "DMIC4_MIXER"}, - {"DMIC4_MIXER", "Switch", "DMIC4"}, - - {"DMIC5_OUTPUT", NULL, "DMIC5_MIXER"}, - {"DMIC5_MIXER", "Switch", "DMIC5"}, - - {"DMIC6_OUTPUT", NULL, "DMIC6_MIXER"}, - {"DMIC6_MIXER", "Switch", "DMIC6"}, - -}; - -static ssize_t wcd937x_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct wcd937x_priv *priv; - char buffer[WCD937X_VERSION_ENTRY_SIZE]; - int len = 0; - - priv = (struct wcd937x_priv *) entry->private_data; - if (!priv) { - pr_err("%s: wcd937x priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->version) { - case WCD937X_VERSION_1_0: - len = snprintf(buffer, sizeof(buffer), "WCD937X_1_0\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wcd937x_info_ops = { - .read = wcd937x_version_read, -}; - -static ssize_t wcd937x_variant_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct wcd937x_priv *priv; - char buffer[WCD937X_VARIANT_ENTRY_SIZE]; - int len = 0; - - priv = (struct wcd937x_priv *) entry->private_data; - if (!priv) { - pr_err("%s: wcd937x priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->variant) { - case WCD9370_VARIANT: - len = snprintf(buffer, sizeof(buffer), "WCD9370\n"); - break; - case WCD9375_VARIANT: - len = snprintf(buffer, sizeof(buffer), "WCD9375\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wcd937x_variant_ops = { - .read = wcd937x_variant_read, -}; - -/* - * wcd937x_info_create_codec_entry - creates wcd937x module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates wcd937x module, variant and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int wcd937x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct snd_info_entry *variant_entry; - struct wcd937x_priv *priv; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (priv->entry) { - dev_dbg(priv->dev, - "%s:wcd937x module already created\n", __func__); - return 0; - } - card = codec->component.card; - priv->entry = snd_info_create_subdir(codec_root->module, - "wcd937x", codec_root); - if (!priv->entry) { - dev_dbg(codec->dev, "%s: failed to create wcd937x entry\n", - __func__); - return -ENOMEM; - } - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - priv->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd937x version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = priv; - version_entry->size = WCD937X_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &wcd937x_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - priv->version_entry = version_entry; - - variant_entry = snd_info_create_card_entry(card->snd_card, - "variant", - priv->entry); - if (!variant_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd937x variant entry\n", - __func__); - return -ENOMEM; - } - - variant_entry->private_data = priv; - variant_entry->size = WCD937X_VARIANT_ENTRY_SIZE; - variant_entry->content = SNDRV_INFO_CONTENT_DATA; - variant_entry->c.ops = &wcd937x_variant_ops; - - if (snd_info_register(variant_entry) < 0) { - snd_info_free_entry(variant_entry); - return -ENOMEM; - } - priv->variant_entry = variant_entry; - return 0; -} -EXPORT_SYMBOL(wcd937x_info_create_codec_entry); - -static int wcd937x_set_micbias_data(struct wcd937x_priv *wcd937x, - struct wcd937x_pdata *pdata) -{ - int vout_ctl_1 = 0, vout_ctl_2 = 0, vout_ctl_3 = 0; - int rc = 0; - - if (!pdata) { - dev_err(wcd937x->dev, "%s: NULL pdata\n", __func__); - return -ENODEV; - } - - /* set micbias voltage */ - vout_ctl_1 = wcd937x_get_micb_vout_ctl_val(pdata->micbias.micb1_mv); - vout_ctl_2 = wcd937x_get_micb_vout_ctl_val(pdata->micbias.micb2_mv); - vout_ctl_3 = wcd937x_get_micb_vout_ctl_val(pdata->micbias.micb3_mv); - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0) { - rc = -EINVAL; - goto done; - } - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB1, 0x3F, - vout_ctl_1); - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB2, 0x3F, - vout_ctl_2); - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB3, 0x3F, - vout_ctl_3); - -done: - return rc; -} - -static int wcd937x_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int variant; - int ret = -EINVAL; - - dev_info(codec->dev, "%s()\n", __func__); - wcd937x = snd_soc_codec_get_drvdata(codec); - - if (!wcd937x) - return -EINVAL; - - wcd937x->codec = codec; - snd_soc_codec_init_regmap(codec, wcd937x->regmap); - variant = (snd_soc_read(codec, WCD937X_DIGITAL_EFUSE_REG_0) & 0x1E) - >> 1; - wcd937x->variant = variant; - - wcd937x->fw_data = devm_kzalloc(codec->dev, - sizeof(*(wcd937x->fw_data)), - GFP_KERNEL); - if (!wcd937x->fw_data) { - dev_err(codec->dev, "Failed to allocate fw_data\n"); - ret = -ENOMEM; - goto err; - } - - set_bit(WCD9XXX_MBHC_CAL, wcd937x->fw_data->cal_bit); - ret = wcd_cal_create_hwdep(wcd937x->fw_data, - WCD9XXX_CODEC_HWDEP_NODE, codec); - - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - goto err_hwdep; - } - - ret = wcd937x_mbhc_init(&wcd937x->mbhc, codec, wcd937x->fw_data); - if (ret) { - pr_err("%s: mbhc initialization failed\n", __func__); - goto err_hwdep; - } - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "IN1_HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "IN2_HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "IN3_AUX"); - snd_soc_dapm_ignore_suspend(dapm, "ADC1_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC2_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "AUX"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_sync(dapm); - - wcd_cls_h_init(&wcd937x->clsh_info); - wcd937x_init_reg(codec); - - if (wcd937x->variant == WCD9375_VARIANT) { - ret = snd_soc_dapm_new_controls(dapm, wcd9375_dapm_widgets, - ARRAY_SIZE(wcd9375_dapm_widgets)); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to add snd_ctls\n", - __func__); - goto err_hwdep; - } - ret = snd_soc_dapm_add_routes(dapm, wcd9375_audio_map, - ARRAY_SIZE(wcd9375_audio_map)); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to add routes\n", - __func__); - goto err_hwdep; - } - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC5_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC6_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC3_OUTPUT"); - snd_soc_dapm_sync(dapm); - } - wcd937x->version = WCD937X_VERSION_1_0; - /* Register event notifier */ - wcd937x->nblock.notifier_call = wcd937x_event_notify; - if (wcd937x->register_notifier) { - ret = wcd937x->register_notifier(wcd937x->handle, - &wcd937x->nblock, - true); - if (ret) { - dev_err(codec->dev, - "%s: Failed to register notifier %d\n", - __func__, ret); - return ret; - } - } - return ret; - -err_hwdep: - wcd937x->fw_data = NULL; - -err: - return ret; -} - -static int wcd937x_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (!wcd937x) - return -EINVAL; - - if (wcd937x->register_notifier) - wcd937x->register_notifier(wcd937x->handle, - &wcd937x->nblock, - false); - return 0; -} - -static struct regmap *wcd937x_get_regmap(struct device *dev) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(dev); - - return wcd937x->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_wcd937x = { - .probe = wcd937x_soc_codec_probe, - .remove = wcd937x_soc_codec_remove, - .get_regmap = wcd937x_get_regmap, - .component_driver = { - .controls = wcd937x_snd_controls, - .num_controls = ARRAY_SIZE(wcd937x_snd_controls), - .dapm_widgets = wcd937x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wcd937x_dapm_widgets), - .dapm_routes = wcd937x_audio_map, - .num_dapm_routes = ARRAY_SIZE(wcd937x_audio_map), - }, -}; - -#ifdef CONFIG_PM_SLEEP -static int wcd937x_suspend(struct device *dev) -{ - struct wcd937x_priv *wcd937x = NULL; - int ret = 0; - struct wcd937x_pdata *pdata = NULL; - - if (!dev) - return -ENODEV; - - wcd937x = dev_get_drvdata(dev); - if (!wcd937x) - return -EINVAL; - - pdata = dev_get_platdata(wcd937x->dev); - - if (!pdata) { - dev_err(dev, "%s: pdata is NULL\n", __func__); - return -EINVAL; - } - - if (test_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask)) { - ret = msm_cdc_disable_ondemand_supply(wcd937x->dev, - wcd937x->supplies, - pdata->regulator, - pdata->num_supplies, - "cdc-vdd-buck"); - if (ret == -EINVAL) { - dev_err(dev, "%s: vdd buck is not disabled\n", - __func__); - return 0; - } - clear_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - } - return 0; -} - -static int wcd937x_resume(struct device *dev) -{ - return 0; -} -#endif - -static int wcd937x_reset(struct device *dev) -{ - struct wcd937x_priv *wcd937x = NULL; - int rc = 0; - int value = 0; - - if (!dev) - return -ENODEV; - - wcd937x = dev_get_drvdata(dev); - if (!wcd937x) - return -EINVAL; - - if (!wcd937x->rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - value = msm_cdc_pinctrl_get_state(wcd937x->rst_np); - if (value > 0) - return 0; - - rc = msm_cdc_pinctrl_select_sleep_state(wcd937x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - /* 20ms sleep required after pulling the reset gpio to LOW */ - usleep_range(20, 30); - - rc = msm_cdc_pinctrl_select_active_state(wcd937x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd active state request fail!\n", - __func__); - return rc; - } - /* 20ms sleep required after pulling the reset gpio to HIGH */ - usleep_range(20, 30); - - return rc; -} - -static int wcd937x_read_of_property_u32(struct device *dev, const char *name, - u32 *val) -{ - int rc = 0; - - rc = of_property_read_u32(dev->of_node, name, val); - if (rc) - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, name, dev->of_node->full_name); - - return rc; -} - -static void wcd937x_dt_parse_micbias_info(struct device *dev, - struct wcd937x_micbias_setting *mb) -{ - u32 prop_val = 0; - int rc = 0; - - /* MB1 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias1-mv", - NULL)) { - rc = wcd937x_read_of_property_u32(dev, - "qcom,cdc-micbias1-mv", - &prop_val); - if (!rc) - mb->micb1_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias1 DT property not found\n", - __func__); - } - - /* MB2 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias2-mv", - NULL)) { - rc = wcd937x_read_of_property_u32(dev, - "qcom,cdc-micbias2-mv", - &prop_val); - if (!rc) - mb->micb2_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias2 DT property not found\n", - __func__); - } - - /* MB3 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias3-mv", - NULL)) { - rc = wcd937x_read_of_property_u32(dev, - "qcom,cdc-micbias3-mv", - &prop_val); - if (!rc) - mb->micb3_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias3 DT property not found\n", - __func__); - } -} - -static int wcd937x_reset_low(struct device *dev) -{ - struct wcd937x_priv *wcd937x = NULL; - int rc = 0; - - if (!dev) - return -ENODEV; - - wcd937x = dev_get_drvdata(dev); - if (!wcd937x) - return -EINVAL; - - if (!wcd937x->rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - rc = msm_cdc_pinctrl_select_sleep_state(wcd937x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - /* 20ms sleep required after pulling the reset gpio to LOW */ - usleep_range(20, 30); - - return rc; -} - -struct wcd937x_pdata *wcd937x_populate_dt_data(struct device *dev) -{ - struct wcd937x_pdata *pdata = NULL; - - pdata = kzalloc(sizeof(struct wcd937x_pdata), - GFP_KERNEL); - if (!pdata) - return NULL; - - pdata->rst_np = of_parse_phandle(dev->of_node, - "qcom,wcd-rst-gpio-node", 0); - - if (!pdata->rst_np) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,wcd-rst-gpio-node", - dev->of_node->full_name); - return NULL; - } - - /* Parse power supplies */ - msm_cdc_get_power_supplies(dev, &pdata->regulator, - &pdata->num_supplies); - if (!pdata->regulator || (pdata->num_supplies <= 0)) { - dev_err(dev, "%s: no power supplies defined for codec\n", - __func__); - return NULL; - } - - pdata->rx_slave = of_parse_phandle(dev->of_node, "qcom,rx-slave", 0); - pdata->tx_slave = of_parse_phandle(dev->of_node, "qcom,tx-slave", 0); - wcd937x_dt_parse_micbias_info(dev, &pdata->micbias); - - return pdata; -} - -static int wcd937x_wakeup(void *handle, bool enable) -{ - struct wcd937x_priv *priv; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - priv = (struct wcd937x_priv *)handle; - if (!priv->tx_swr_dev) { - pr_err("%s: tx swr dev is NULL\n", __func__); - return -EINVAL; - } - if (enable) - return swr_device_wakeup_vote(priv->tx_swr_dev); - else - return swr_device_wakeup_unvote(priv->tx_swr_dev); -} - -static irqreturn_t wcd937x_wd_handle_irq(int irq, void *data) -{ - pr_err_ratelimited("%s: Watchdog interrupt for irq =%d triggered\n", - __func__, irq); - return IRQ_HANDLED; -} - -static int wcd937x_bind(struct device *dev) -{ - int ret = 0, i = 0; - struct wcd937x_priv *wcd937x = NULL; - struct wcd937x_pdata *pdata = NULL; - struct wcd_ctrl_platform_data *plat_data = NULL; - - wcd937x = kzalloc(sizeof(struct wcd937x_priv), GFP_KERNEL); - if (!wcd937x) - return -ENOMEM; - - dev_set_drvdata(dev, wcd937x); - - pdata = wcd937x_populate_dt_data(dev); - if (!pdata) { - dev_err(dev, "%s: Fail to obtain platform data\n", __func__); - return -EINVAL; - } - wcd937x->dev = dev; - wcd937x->dev->platform_data = pdata; - wcd937x->rst_np = pdata->rst_np; - ret = msm_cdc_init_supplies(dev, &wcd937x->supplies, - pdata->regulator, pdata->num_supplies); - if (!wcd937x->supplies) { - dev_err(dev, "%s: Cannot init wcd supplies\n", - __func__); - goto err_bind_all; - } - - plat_data = dev_get_platdata(dev->parent); - if (!plat_data) { - dev_err(dev, "%s: platform data from parent is NULL\n", - __func__); - ret = -EINVAL; - goto err_bind_all; - } - wcd937x->handle = (void *)plat_data->handle; - if (!wcd937x->handle) { - dev_err(dev, "%s: handle is NULL\n", __func__); - ret = -EINVAL; - goto err_bind_all; - } - wcd937x->update_wcd_event = plat_data->update_wcd_event; - if (!wcd937x->update_wcd_event) { - dev_err(dev, "%s: update_wcd_event api is null!\n", - __func__); - ret = -EINVAL; - goto err_bind_all; - } - wcd937x->register_notifier = plat_data->register_notifier; - if (!wcd937x->register_notifier) { - dev_err(dev, "%s: register_notifier api is null!\n", - __func__); - ret = -EINVAL; - goto err_bind_all; - } - - ret = msm_cdc_enable_static_supplies(dev, wcd937x->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(dev, "%s: wcd static supply enable failed!\n", - __func__); - goto err_bind_all; - } - - wcd937x_reset(dev); - /* - * Add 5msec delay to provide sufficient time for - * soundwire auto enumeration of slave devices as - * as per HW requirement. - */ - usleep_range(5000, 5010); - wcd937x->wakeup = wcd937x_wakeup; - - ret = component_bind_all(dev, wcd937x); - if (ret) { - dev_err(dev, "%s: Slave bind failed, ret = %d\n", - __func__, ret); - goto err_bind_all; - } - - ret = wcd937x_parse_port_mapping(dev, "qcom,rx_swr_ch_map", CODEC_RX); - ret |= wcd937x_parse_port_mapping(dev, "qcom,tx_swr_ch_map", CODEC_TX); - - if (ret) { - dev_err(dev, "Failed to read port mapping\n"); - goto err; - } - - wcd937x->rx_swr_dev = get_matching_swr_slave_device(pdata->rx_slave); - if (!wcd937x->rx_swr_dev) { - dev_err(dev, "%s: Could not find RX swr slave device\n", - __func__); - ret = -ENODEV; - goto err; - } - - wcd937x->tx_swr_dev = get_matching_swr_slave_device(pdata->tx_slave); - if (!wcd937x->tx_swr_dev) { - dev_err(dev, "%s: Could not find TX swr slave device\n", - __func__); - ret = -ENODEV; - goto err; - } - - wcd937x->regmap = devm_regmap_init_swr(wcd937x->tx_swr_dev, - &wcd937x_regmap_config); - if (!wcd937x->regmap) { - dev_err(dev, "%s: Regmap init failed\n", - __func__); - goto err; - } - - /* Set all interupts as edge triggered */ - for (i = 0; i < wcd937x_regmap_irq_chip.num_regs; i++) - regmap_write(wcd937x->regmap, - (WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0); - - wcd937x_regmap_irq_chip.irq_drv_data = wcd937x; - wcd937x->irq_info.wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip; - wcd937x->irq_info.codec_name = "WCD937X"; - wcd937x->irq_info.regmap = wcd937x->regmap; - wcd937x->irq_info.dev = dev; - ret = wcd_irq_init(&wcd937x->irq_info, &wcd937x->virq); - - if (ret) { - dev_err(dev, "%s: IRQ init failed: %d\n", - __func__, ret); - goto err; - } - wcd937x->tx_swr_dev->slave_irq = wcd937x->virq; - - ret = wcd937x_set_micbias_data(wcd937x, pdata); - if (ret < 0) { - dev_err(dev, "%s: bad micbias pdata\n", __func__); - goto err_irq; - } - - mutex_init(&wcd937x->micb_lock); - mutex_init(&wcd937x->ana_tx_clk_lock); - /* Request for watchdog interrupt */ - wcd_request_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHR_PDM_WD_INT, - "HPHR PDM WD INT", wcd937x_wd_handle_irq, NULL); - wcd_request_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHL_PDM_WD_INT, - "HPHL PDM WD INT", wcd937x_wd_handle_irq, NULL); - wcd_request_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT, - "AUX PDM WD INT", wcd937x_wd_handle_irq, NULL); - /* Disable watchdog interrupt for HPH and AUX */ - wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHR_PDM_WD_INT); - wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHL_PDM_WD_INT); - wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT); - - ret = snd_soc_register_codec(dev, &soc_codec_dev_wcd937x, - NULL, 0); - if (ret) { - dev_err(dev, "%s: Codec registration failed\n", - __func__); - goto err_irq; - } - - return ret; -err_irq: - wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq); -err: - component_unbind_all(dev, wcd937x); -err_bind_all: - dev_set_drvdata(dev, NULL); - kfree(pdata); - kfree(wcd937x); - return ret; -} - -static void wcd937x_unbind(struct device *dev) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(dev); - struct wcd937x_pdata *pdata = dev_get_platdata(wcd937x->dev); - - wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq); - snd_soc_unregister_codec(dev); - component_unbind_all(dev, wcd937x); - mutex_destroy(&wcd937x->micb_lock); - mutex_destroy(&wcd937x->ana_tx_clk_lock); - dev_set_drvdata(dev, NULL); - kfree(pdata); - kfree(wcd937x); -} - -static const struct of_device_id wcd937x_dt_match[] = { - { .compatible = "qcom,wcd937x-codec" , .data = "wcd937x" }, - {} -}; - -static const struct component_master_ops wcd937x_comp_ops = { - .bind = wcd937x_bind, - .unbind = wcd937x_unbind, -}; - -static int wcd937x_compare_of(struct device *dev, void *data) -{ - return dev->of_node == data; -} - -static void wcd937x_release_of(struct device *dev, void *data) -{ - of_node_put(data); -} - -static int wcd937x_add_slave_components(struct device *dev, - struct component_match **matchptr) -{ - struct device_node *np, *rx_node, *tx_node; - - np = dev->of_node; - - rx_node = of_parse_phandle(np, "qcom,rx-slave", 0); - if (!rx_node) { - dev_err(dev, "%s: Rx-slave node not defined\n", __func__); - return -ENODEV; - } - of_node_get(rx_node); - component_match_add_release(dev, matchptr, - wcd937x_release_of, - wcd937x_compare_of, - rx_node); - - tx_node = of_parse_phandle(np, "qcom,tx-slave", 0); - if (!tx_node) { - dev_err(dev, "%s: Tx-slave node not defined\n", __func__); - return -ENODEV; - } - of_node_get(tx_node); - component_match_add_release(dev, matchptr, - wcd937x_release_of, - wcd937x_compare_of, - tx_node); - return 0; -} - -static int wcd937x_probe(struct platform_device *pdev) -{ - struct component_match *match = NULL; - int ret; - - ret = wcd937x_add_slave_components(&pdev->dev, &match); - if (ret) - return ret; - - return component_master_add_with_match(&pdev->dev, - &wcd937x_comp_ops, match); -} - -static int wcd937x_remove(struct platform_device *pdev) -{ - component_master_del(&pdev->dev, &wcd937x_comp_ops); - dev_set_drvdata(&pdev->dev, NULL); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static const struct dev_pm_ops wcd937x_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - wcd937x_suspend, - wcd937x_resume - ) -}; -#endif - -static struct platform_driver wcd937x_codec_driver = { - .probe = wcd937x_probe, - .remove = wcd937x_remove, - .driver = { - .name = "wcd937x_codec", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(wcd937x_dt_match), -#ifdef CONFIG_PM_SLEEP - .pm = &wcd937x_dev_pm_ops, -#endif - .suppress_bind_attrs = true, - }, -}; - -module_platform_driver(wcd937x_codec_driver); -MODULE_DESCRIPTION("WCD937X Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.h b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.h deleted file mode 100644 index 646c3810af2c..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x.h +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD937X_H -#define _WCD937X_H - -#ifdef CONFIG_SND_SOC_WCD937X -extern int wcd937x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -#else -extern int wcd937x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_WCD937X */ - -#endif diff --git a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x_slave.c b/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x_slave.c deleted file mode 100644 index 761e5fe5bacd..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd937x/wcd937x_slave.c +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -struct wcd937x_slave_priv { - struct swr_device *swr_slave; -}; - -static int wcd937x_slave_bind(struct device *dev, - struct device *master, void *data) -{ - int ret = 0; - struct wcd937x_slave_priv *wcd937x_slave = NULL; - uint8_t devnum = 0; - struct swr_device *pdev = to_swr_device(dev); - - if (pdev == NULL) { - dev_err(dev, "%s: pdev is NULL\n", __func__); - return -EINVAL; - } - - wcd937x_slave = devm_kzalloc(&pdev->dev, - sizeof(struct wcd937x_slave_priv), GFP_KERNEL); - if (!wcd937x_slave) - return -ENOMEM; - - swr_set_dev_data(pdev, wcd937x_slave); - - wcd937x_slave->swr_slave = pdev; - - ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum); - if (ret) { - dev_dbg(&pdev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, pdev->addr); - swr_remove_device(pdev); - return ret; - } - pdev->dev_num = devnum; - - return ret; -} - -static void wcd937x_slave_unbind(struct device *dev, - struct device *master, void *data) -{ - struct wcd937x_slave_priv *wcd937x_slave = NULL; - struct swr_device *pdev = to_swr_device(dev); - - if (pdev == NULL) { - dev_err(dev, "%s: pdev is NULL\n", __func__); - return; - } - - wcd937x_slave = swr_get_dev_data(pdev); - if (!wcd937x_slave) { - dev_err(&pdev->dev, "%s: wcd937x_slave is NULL\n", __func__); - return; - } - - swr_set_dev_data(pdev, NULL); -} - -static const struct swr_device_id wcd937x_swr_id[] = { - {"wcd937x-slave", 0}, - {} -}; - -static const struct of_device_id wcd937x_swr_dt_match[] = { - { - .compatible = "qcom,wcd937x-slave", - }, - {} -}; - -static const struct component_ops wcd937x_slave_comp_ops = { - .bind = wcd937x_slave_bind, - .unbind = wcd937x_slave_unbind, -}; - -static int wcd937x_swr_up(struct swr_device *pdev) -{ - return 0; -} - -static int wcd937x_swr_down(struct swr_device *pdev) -{ - return 0; -} - -static int wcd937x_swr_reset(struct swr_device *pdev) -{ - return 0; -} - -static int wcd937x_swr_probe(struct swr_device *pdev) -{ - return component_add(&pdev->dev, &wcd937x_slave_comp_ops); -} - -static int wcd937x_swr_remove(struct swr_device *pdev) -{ - component_del(&pdev->dev, &wcd937x_slave_comp_ops); - return 0; -} - -static struct swr_driver wcd937x_slave_driver = { - .driver = { - .name = "wcd937x-slave", - .owner = THIS_MODULE, - .of_match_table = wcd937x_swr_dt_match, - }, - .probe = wcd937x_swr_probe, - .remove = wcd937x_swr_remove, - .id_table = wcd937x_swr_id, - .device_up = wcd937x_swr_up, - .device_down = wcd937x_swr_down, - .reset_device = wcd937x_swr_reset, -}; - -static int __init wcd937x_slave_init(void) -{ - return swr_driver_register(&wcd937x_slave_driver); -} - -static void __exit wcd937x_slave_exit(void) -{ - swr_driver_unregister(&wcd937x_slave_driver); -} - -module_init(wcd937x_slave_init); -module_exit(wcd937x_slave_exit); - -MODULE_DESCRIPTION("WCD937X Swr Slave driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/Android.mk b/techpack/audio/4.0/asoc/codecs/wcd938x/Android.mk deleted file mode 100644 index 87f16620ed13..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/Android.mk +++ /dev/null @@ -1,69 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,kona lito atoll $(MSMSTEPPE)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd938x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd938x.ko -LOCAL_MODULE_KBUILD_NAME := wcd938x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd938x_slave.ko -LOCAL_MODULE_KBUILD_NAME := wcd938x_slave_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/Kbuild b/techpack/audio/4.0/asoc/codecs/wcd938x/Kbuild deleted file mode 100644 index 337feb02d1ef..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/Kbuild +++ /dev/null @@ -1,135 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.19 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ WCD938X ############ - -# for WCD938X Codec -ifdef CONFIG_SND_SOC_WCD938X - WCD938X_OBJS += wcd938x.o - WCD938X_OBJS += wcd938x-regmap.o - WCD938X_OBJS += wcd938x-tables.o - WCD938X_OBJS += wcd938x-mbhc.o -endif - -ifdef CONFIG_SND_SOC_WCD938X_SLAVE - WCD938X_SLAVE_OBJS += wcd938x-slave.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/ipc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/soc/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers - endif -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_WCD938X) += wcd938x_dlkm.o -wcd938x_dlkm-y := $(WCD938X_OBJS) - -obj-$(CONFIG_SND_SOC_WCD938X_SLAVE) += wcd938x_slave_dlkm.o -wcd938x_slave_dlkm-y := $(WCD938X_SLAVE_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/internal.h b/techpack/audio/4.0/asoc/codecs/wcd938x/internal.h deleted file mode 100644 index a1c0fa7838e0..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/internal.h +++ /dev/null @@ -1,195 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD938X_INTERNAL_H -#define _WCD938X_INTERNAL_H - -#include -#include -#include -#include "wcd938x-mbhc.h" - -#define SWR_SCP_CONTROL 0x44 -#define SWR_SCP_HOST_CLK_DIV2_CTL_BANK 0xE0 -#define WCD938X_MAX_MICBIAS 4 - -/* Convert from vout ctl to micbias voltage in mV */ -#define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) -#define MAX_PORT 8 -#define MAX_CH_PER_PORT 8 -#define TX_ADC_MAX 4 - -enum { - TX_HDR12 = 0, - TX_HDR34, - TX_HDR_MAX, -}; - -extern struct regmap_config wcd938x_regmap_config; - -struct codec_port_info { - u32 slave_port_type; - u32 master_port_type; - u32 ch_mask; - u32 num_ch; - u32 ch_rate; -}; - -struct wcd938x_priv { - struct device *dev; - - int variant; - struct snd_soc_codec *codec; - struct device_node *rst_np; - struct regmap *regmap; - - struct swr_device *rx_swr_dev; - struct swr_device *tx_swr_dev; - - s32 micb_ref[WCD938X_MAX_MICBIAS]; - s32 pullup_ref[WCD938X_MAX_MICBIAS]; - - struct fw_info *fw_data; - struct device_node *wcd_rst_np; - - struct mutex micb_lock; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - s32 dmic_6_7_clk_cnt; - int hdr_en[TX_HDR_MAX]; - /* class h specific info */ - struct wcd_clsh_cdc_info clsh_info; - /* mbhc module */ - struct wcd938x_mbhc *mbhc; - - u32 hph_mode; - u32 tx_mode[TX_ADC_MAX]; - bool comp1_enable; - bool comp2_enable; - bool ldoh; - bool bcs_dis; - struct irq_domain *virq; - struct wcd_irq_info irq_info; - u32 rx_clk_cnt; - int num_irq_regs; - /* to track the status */ - unsigned long status_mask; - - u8 num_tx_ports; - u8 num_rx_ports; - struct codec_port_info - tx_port_mapping[MAX_PORT][MAX_CH_PER_PORT]; - struct codec_port_info - rx_port_mapping[MAX_PORT][MAX_CH_PER_PORT]; - struct regulator_bulk_data *supplies; - struct notifier_block nblock; - /* wcd callback to bolero */ - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); - int (*wakeup)(void *handle, bool enable); - u32 version; - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - struct snd_info_entry *variant_entry; - int flyback_cur_det_disable; - int ear_rx_path; - bool dev_up; -}; - -struct wcd938x_micbias_setting { - u8 ldoh_v; - u32 cfilt1_mv; - u32 micb1_mv; - u32 micb2_mv; - u32 micb3_mv; - u32 micb4_mv; - u8 bias1_cfilt_sel; -}; - -struct wcd938x_pdata { - struct device_node *rst_np; - struct device_node *rx_slave; - struct device_node *tx_slave; - struct wcd938x_micbias_setting micbias; - - struct cdc_regulator *regulator; - int num_supplies; -}; - -struct wcd_ctrl_platform_data { - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -enum { - WCD_RX1, - WCD_RX2, - WCD_RX3 -}; - -enum { - BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR = 1, - BOLERO_WCD_EVT_PA_OFF_PRE_SSR, - BOLERO_WCD_EVT_SSR_DOWN, - BOLERO_WCD_EVT_SSR_UP, - BOLERO_WCD_EVT_CLK_NOTIFY, -}; - -enum { - WCD_BOLERO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ - WCD_BOLERO_EVT_IMPED_TRUE, /* for imped true */ - WCD_BOLERO_EVT_IMPED_FALSE, /* for imped false */ - WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST, - WCD_BOLERO_EVT_BCS_CLK_OFF, -}; - -enum { - /* INTR_CTRL_INT_MASK_0 */ - WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET = 0, - WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, - WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, - WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - WCD938X_IRQ_MBHC_SW_DET, - WCD938X_IRQ_HPHR_OCP_INT, - WCD938X_IRQ_HPHR_CNP_INT, - WCD938X_IRQ_HPHL_OCP_INT, - - /* INTR_CTRL_INT_MASK_1 */ - WCD938X_IRQ_HPHL_CNP_INT, - WCD938X_IRQ_EAR_CNP_INT, - WCD938X_IRQ_EAR_SCD_INT, - WCD938X_IRQ_AUX_CNP_INT, - WCD938X_IRQ_AUX_SCD_INT, - WCD938X_IRQ_HPHL_PDM_WD_INT, - WCD938X_IRQ_HPHR_PDM_WD_INT, - WCD938X_IRQ_AUX_PDM_WD_INT, - - /* INTR_CTRL_INT_MASK_2 */ - WCD938X_IRQ_LDORT_SCD_INT, - WCD938X_IRQ_MBHC_MOISTURE_INT, - WCD938X_IRQ_HPHL_SURGE_DET_INT, - WCD938X_IRQ_HPHR_SURGE_DET_INT, - WCD938X_NUM_IRQS, -}; - -extern struct wcd938x_mbhc *wcd938x_soc_get_mbhc( - struct snd_soc_codec *codec); -extern void wcd938x_disable_bcs_before_slow_insert( - struct snd_soc_codec *codec, - bool bcs_disable); -extern int wcd938x_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int volt, int micb_num); -extern int wcd938x_get_micb_vout_ctl_val(u32 micb_mv); -extern int wcd938x_micbias_control(struct snd_soc_codec *codec, - int micb_num, int req, bool is_dapm); -#endif /* _WCD938X_INTERNAL_H */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c deleted file mode 100644 index cbd5fe2eb88b..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c +++ /dev/null @@ -1,1145 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd938x-registers.h" -#include "internal.h" - -#define WCD938X_ZDET_SUPPORTED true -/* Z value defined in milliohm */ -#define WCD938X_ZDET_VAL_32 32000 -#define WCD938X_ZDET_VAL_400 400000 -#define WCD938X_ZDET_VAL_1200 1200000 -#define WCD938X_ZDET_VAL_100K 100000000 -/* Z floating defined in ohms */ -#define WCD938X_ZDET_FLOATING_IMPEDANCE 0x0FFFFFFE - -#define WCD938X_ZDET_NUM_MEASUREMENTS 900 -#define WCD938X_MBHC_GET_C1(c) ((c & 0xC000) >> 14) -#define WCD938X_MBHC_GET_X1(x) (x & 0x3FFF) -/* Z value compared in milliOhm */ -#define WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) -#define WCD938X_MBHC_ZDET_CONST (86 * 16384) -#define WCD938X_MBHC_MOISTURE_RREF R_24_KOHM - -static struct wcd_mbhc_register - wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { - WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN", - WCD938X_ANA_MBHC_MECH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN", - WCD938X_ANA_MBHC_MECH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE", - WCD938X_ANA_MBHC_MECH, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL", - WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0x30, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE", - WCD938X_ANA_MBHC_ELECT, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL", - WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x1F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL", - WCD938X_ANA_MBHC_MECH, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE", - WCD938X_ANA_MBHC_MECH, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE", - WCD938X_ANA_MBHC_MECH, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND", - WCD938X_ANA_MBHC_MECH, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC", - WCD938X_ANA_MBHC_ELECT, 0x06, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN", - WCD938X_ANA_MBHC_ELECT, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC", - WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0x0F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC", - WCD938X_MBHC_NEW_CTL_1, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF", - WCD938X_MBHC_NEW_CTL_2, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT", - WCD938X_ANA_MBHC_RESULT_3, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_IN2P_CLAMP_STATE", - WCD938X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT", - WCD938X_ANA_MBHC_RESULT_3, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT", - WCD938X_ANA_MBHC_RESULT_3, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT", - WCD938X_ANA_MBHC_RESULT_3, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN", - WCD938X_HPH_OCP_CTL, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT", - WCD938X_ANA_MBHC_RESULT_3, 0x07, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL", - WCD938X_ANA_MBHC_ELECT, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT", - WCD938X_ANA_MBHC_RESULT_3, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL", - WCD938X_ANA_MICB2, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME", - WCD938X_HPH_CNP_WG_TIME, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN", - WCD938X_ANA_HPH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN", - WCD938X_ANA_HPH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN", - WCD938X_ANA_HPH, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", - WCD938X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", - 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", - WCD938X_MBHC_CTL_BCS, 0x02, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", - WCD938X_MBHC_NEW_FSM_STATUS, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", - WCD938X_MBHC_NEW_CTL_2, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS", - WCD938X_MBHC_NEW_FSM_STATUS, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND", - WCD938X_HPH_PA_CTL2, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND", - WCD938X_HPH_PA_CTL2, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_DET_EN", - WCD938X_HPH_L_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_DET_EN", - WCD938X_HPH_R_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_STATUS", - WCD938X_DIGITAL_INTR_STATUS_0, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_STATUS", - WCD938X_DIGITAL_INTR_STATUS_0, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_EN", - WCD938X_MBHC_NEW_CTL_1, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_COMPLETE", WCD938X_MBHC_NEW_FSM_STATUS, - 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_TIMEOUT", WCD938X_MBHC_NEW_FSM_STATUS, - 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_RESULT", WCD938X_MBHC_NEW_ADC_RESULT, - 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB2_VOUT", WCD938X_ANA_MICB2, 0x3F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_MODE", - WCD938X_MBHC_NEW_CTL_1, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_DETECTION_DONE", - WCD938X_MBHC_NEW_CTL_1, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_ISRC_EN", - WCD938X_ANA_MBHC_ZDET, 0x02, 1, 0), -}; - -static const struct wcd_mbhc_intr intr_ids = { - .mbhc_sw_intr = WCD938X_IRQ_MBHC_SW_DET, - .mbhc_btn_press_intr = WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, - .mbhc_btn_release_intr = WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, - .mbhc_hs_ins_intr = WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - .mbhc_hs_rem_intr = WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, - .hph_left_ocp = WCD938X_IRQ_HPHL_OCP_INT, - .hph_right_ocp = WCD938X_IRQ_HPHR_OCP_INT, -}; - -struct wcd938x_mbhc_zdet_param { - u16 ldo_ctl; - u16 noff; - u16 nshift; - u16 btn5; - u16 btn6; - u16 btn7; -}; - -static int wcd938x_mbhc_request_irq(struct snd_soc_codec *codec, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - struct wcd938x_priv *wcd938x = dev_get_drvdata(codec->dev); - - return wcd_request_irq(&wcd938x->irq_info, irq, name, handler, data); -} - -static void wcd938x_mbhc_irq_control(struct snd_soc_codec *codec, - int irq, bool enable) -{ - struct wcd938x_priv *wcd938x = dev_get_drvdata(codec->dev); - - if (enable) - wcd_enable_irq(&wcd938x->irq_info, irq); - else - wcd_disable_irq(&wcd938x->irq_info, irq); -} - -static int wcd938x_mbhc_free_irq(struct snd_soc_codec *codec, - int irq, void *data) -{ - struct wcd938x_priv *wcd938x = dev_get_drvdata(codec->dev); - - wcd_free_irq(&wcd938x->irq_info, irq, data); - - return 0; -} - -static void wcd938x_mbhc_clk_setup(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_1, - 0x80, 0x80); - else - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_1, - 0x80, 0x00); -} - -static int wcd938x_mbhc_btn_to_num(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, WCD938X_ANA_MBHC_RESULT_3) & 0x7; -} - -static void wcd938x_mbhc_mbhc_bias_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_ELECT, - 0x01, 0x01); - else - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_ELECT, - 0x01, 0x00); -} - -static void wcd938x_mbhc_program_btn_thr(struct snd_soc_codec *codec, - s16 *btn_low, s16 *btn_high, - int num_btn, bool is_micbias) -{ - int i; - int vth; - - if (num_btn > WCD_MBHC_DEF_BUTTONS) { - dev_err(codec->dev, "%s: invalid number of buttons: %d\n", - __func__, num_btn); - return; - } - - for (i = 0; i < num_btn; i++) { - vth = ((btn_high[i] * 2) / 25) & 0x3F; - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_BTN0 + i, - 0xFC, vth << 2); - dev_dbg(codec->dev, "%s: btn_high[%d]: %d, vth: %d\n", - __func__, i, btn_high[i], vth); - } -} - -static bool wcd938x_mbhc_lock_sleep(struct wcd_mbhc *mbhc, bool lock) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd938x_priv *wcd938x = dev_get_drvdata(codec->dev); - - wcd938x->wakeup((void*)wcd938x, lock); - - return true; -} - -static int wcd938x_mbhc_register_notifier(struct wcd_mbhc *mbhc, - struct notifier_block *nblock, - bool enable) -{ - struct wcd938x_mbhc *wcd938x_mbhc; - - wcd938x_mbhc = container_of(mbhc, struct wcd938x_mbhc, wcd_mbhc); - - if (enable) - return blocking_notifier_chain_register(&wcd938x_mbhc->notifier, - nblock); - else - return blocking_notifier_chain_unregister( - &wcd938x_mbhc->notifier, nblock); -} - -static bool wcd938x_mbhc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num) -{ - u8 val = 0; - - if (micb_num == MIC_BIAS_2) { - val = ((snd_soc_read(mbhc->codec, - WCD938X_ANA_MICB2) & 0xC0) - >> 6); - if (val == 0x01) - return true; - } - return false; -} - -static bool wcd938x_mbhc_hph_pa_on_status(struct snd_soc_codec *codec) -{ - return (snd_soc_read(codec, WCD938X_ANA_HPH) & 0xC0) ? - true : false; -} - -static void wcd938x_mbhc_hph_l_pull_up_control( - struct snd_soc_codec *codec, - int pull_up_cur) -{ - /* Default pull up current to 2uA */ - if (pull_up_cur > HS_PULLUP_I_OFF || pull_up_cur < HS_PULLUP_I_3P0_UA || - pull_up_cur == HS_PULLUP_I_DEFAULT) - pull_up_cur = HS_PULLUP_I_2P0_UA; - - dev_dbg(codec->dev, "%s: HS pull up current:%d\n", - __func__, pull_up_cur); - - snd_soc_update_bits(codec, - WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, - 0x1F, pull_up_cur); -} - -static int wcd938x_mbhc_request_micbias(struct snd_soc_codec *codec, - int micb_num, int req) -{ - int ret = 0; - - ret = wcd938x_micbias_control(codec, micb_num, req, false); - - return ret; -} - -static void wcd938x_mbhc_micb_ramp_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD938X_ANA_MICB2_RAMP, - 0x1C, 0x0C); - snd_soc_update_bits(codec, WCD938X_ANA_MICB2_RAMP, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, WCD938X_ANA_MICB2_RAMP, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD938X_ANA_MICB2_RAMP, - 0x1C, 0x00); - } -} - -static struct firmware_cal *wcd938x_get_hwdep_fw_cal(struct wcd_mbhc *mbhc, - enum wcd_cal_type type) -{ - struct wcd938x_mbhc *wcd938x_mbhc; - struct firmware_cal *hwdep_cal; - struct snd_soc_codec *codec = mbhc->codec; - - wcd938x_mbhc = container_of(mbhc, struct wcd938x_mbhc, wcd_mbhc); - - if (!codec) { - pr_err("%s: NULL codec pointer\n", __func__); - return NULL; - } - hwdep_cal = wcdcal_get_fw_cal(wcd938x_mbhc->fw_data, type); - if (!hwdep_cal) - dev_err(codec->dev, "%s: cal not sent by %d\n", - __func__, type); - - return hwdep_cal; -} - -static int wcd938x_mbhc_micb_ctrl_threshold_mic( - struct snd_soc_codec *codec, - int micb_num, bool req_en) -{ - struct wcd938x_pdata *pdata = dev_get_platdata(codec->dev); - int rc, micb_mv; - - if (micb_num != MIC_BIAS_2) - return -EINVAL; - /* - * If device tree micbias level is already above the minimum - * voltage needed to detect threshold microphone, then do - * not change the micbias, just return. - */ - if (pdata->micbias.micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) - return 0; - - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : pdata->micbias.micb2_mv; - - rc = wcd938x_mbhc_micb_adjust_voltage(codec, micb_mv, MIC_BIAS_2); - - return rc; -} - -static inline void wcd938x_mbhc_get_result_params(struct wcd938x_priv *wcd938x, - s16 *d1_a, u16 noff, - int32_t *zdet) -{ - int i; - int val, val1; - s16 c1; - s32 x1, d1; - int32_t denom; - int minCode_param[] = { - 3277, 1639, 820, 410, 205, 103, 52, 26 - }; - - regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x20); - for (i = 0; i < WCD938X_ZDET_NUM_MEASUREMENTS; i++) { - regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_2, &val); - if (val & 0x80) - break; - } - val = val << 0x8; - regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_1, &val1); - val |= val1; - regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x00); - x1 = WCD938X_MBHC_GET_X1(val); - c1 = WCD938X_MBHC_GET_C1(val); - /* If ramp is not complete, give additional 5ms */ - if ((c1 < 2) && x1) - usleep_range(5000, 5050); - - if (!c1 || !x1) { - dev_dbg(wcd938x->dev, - "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", - __func__, c1, x1); - goto ramp_down; - } - d1 = d1_a[c1]; - denom = (x1 * d1) - (1 << (14 - noff)); - if (denom > 0) - *zdet = (WCD938X_MBHC_ZDET_CONST * 1000) / denom; - else if (x1 < minCode_param[noff]) - *zdet = WCD938X_ZDET_FLOATING_IMPEDANCE; - - dev_dbg(wcd938x->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", - __func__, d1, c1, x1, *zdet); -ramp_down: - i = 0; - while (x1) { - regmap_read(wcd938x->regmap, - WCD938X_ANA_MBHC_RESULT_1, &val); - regmap_read(wcd938x->regmap, - WCD938X_ANA_MBHC_RESULT_2, &val1); - val = val << 0x08; - val |= val1; - x1 = WCD938X_MBHC_GET_X1(val); - i++; - if (i == WCD938X_ZDET_NUM_MEASUREMENTS) - break; - } -} - -static void wcd938x_mbhc_zdet_ramp(struct snd_soc_codec *codec, - struct wcd938x_mbhc_zdet_param *zdet_param, - int32_t *zl, int32_t *zr, s16 *d1_a) -{ - struct wcd938x_priv *wcd938x = dev_get_drvdata(codec->dev); - int32_t zdet = 0; - - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_ZDET_ANA_CTL, - 0x70, zdet_param->ldo_ctl << 4); - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_BTN5, 0xFC, - zdet_param->btn5); - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_BTN6, 0xFC, - zdet_param->btn6); - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_BTN7, 0xFC, - zdet_param->btn7); - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_ZDET_ANA_CTL, - 0x0F, zdet_param->noff); - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_ZDET_RAMP_CTL, - 0x0F, zdet_param->nshift); - - if (!zl) - goto z_right; - /* Start impedance measurement for HPH_L */ - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_ZDET, 0x80, 0x80); - dev_dbg(wcd938x->dev, "%s: ramp for HPH_L, noff = %d\n", - __func__, zdet_param->noff); - wcd938x_mbhc_get_result_params(wcd938x, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_ZDET, 0x80, 0x00); - - *zl = zdet; - -z_right: - if (!zr) - return; - /* Start impedance measurement for HPH_R */ - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_ZDET, 0x40, 0x40); - dev_dbg(wcd938x->dev, "%s: ramp for HPH_R, noff = %d\n", - __func__, zdet_param->noff); - wcd938x_mbhc_get_result_params(wcd938x, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_ZDET, 0x40, 0x00); - - *zr = zdet; -} - -static inline void wcd938x_wcd_mbhc_qfuse_cal( - struct snd_soc_codec *codec, - int32_t *z_val, int flag_l_r) -{ - s16 q1; - int q1_cal; - - if (*z_val < (WCD938X_ZDET_VAL_400/1000)) - q1 = snd_soc_read(codec, - WCD938X_DIGITAL_EFUSE_REG_23 + (2 * flag_l_r)); - else - q1 = snd_soc_read(codec, - WCD938X_DIGITAL_EFUSE_REG_24 + (2 * flag_l_r)); - if (q1 & 0x80) - q1_cal = (10000 - ((q1 & 0x7F) * 25)); - else - q1_cal = (10000 + (q1 * 25)); - if (q1_cal > 0) - *z_val = ((*z_val) * 10000) / q1_cal; -} - -static void wcd938x_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd938x_priv *wcd938x = dev_get_drvdata(codec->dev); - s16 reg0, reg1, reg2, reg3, reg4; - int32_t z1L, z1R, z1Ls; - int zMono, z_diff1, z_diff2; - bool is_fsm_disable = false; - struct wcd938x_mbhc_zdet_param zdet_param[] = { - {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */ - {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */ - {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */ - {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */ - }; - struct wcd938x_mbhc_zdet_param *zdet_param_ptr = NULL; - s16 d1_a[][4] = { - {0, 30, 90, 30}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - }; - s16 *d1 = NULL; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - reg0 = snd_soc_read(codec, WCD938X_ANA_MBHC_BTN5); - reg1 = snd_soc_read(codec, WCD938X_ANA_MBHC_BTN6); - reg2 = snd_soc_read(codec, WCD938X_ANA_MBHC_BTN7); - reg3 = snd_soc_read(codec, WCD938X_MBHC_CTL_CLK); - reg4 = snd_soc_read(codec, WCD938X_MBHC_NEW_ZDET_ANA_CTL); - - if (snd_soc_read(codec, WCD938X_ANA_MBHC_ELECT) & 0x80) { - is_fsm_disable = true; - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_ELECT, 0x80, 0x00); - } - - /* For NO-jack, disable L_DET_EN before Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_MECH, 0x80, 0x00); - - /* Turn off 100k pull down on HPHL */ - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_MECH, 0x01, 0x00); - - /* Disable surge protection before impedance detection. - * This is done to give correct value for high impedance. - */ - regmap_update_bits(wcd938x->regmap, - WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0x00); - /* 1ms delay needed after disable surge protection */ - usleep_range(1000, 1010); - - /* First get impedance on Left */ - d1 = d1_a[1]; - zdet_param_ptr = &zdet_param[1]; - wcd938x_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - - if (!WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z1L)) - goto left_ch_impedance; - - /* Second ramp for left ch */ - if (z1L < WCD938X_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1L > WCD938X_ZDET_VAL_400) && - (z1L <= WCD938X_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1L > WCD938X_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - wcd938x_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - -left_ch_impedance: - if ((z1L == WCD938X_ZDET_FLOATING_IMPEDANCE) || - (z1L > WCD938X_ZDET_VAL_100K)) { - *zl = WCD938X_ZDET_FLOATING_IMPEDANCE; - zdet_param_ptr = &zdet_param[1]; - d1 = d1_a[1]; - } else { - *zl = z1L/1000; - wcd938x_wcd_mbhc_qfuse_cal(codec, zl, 0); - } - dev_dbg(codec->dev, "%s: impedance on HPH_L = %d(ohms)\n", - __func__, *zl); - - /* Start of right impedance ramp and calculation */ - wcd938x_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - if (WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) { - if (((z1R > WCD938X_ZDET_VAL_1200) && - (zdet_param_ptr->noff == 0x6)) || - ((*zl) != WCD938X_ZDET_FLOATING_IMPEDANCE)) - goto right_ch_impedance; - /* Second ramp for right ch */ - if (z1R < WCD938X_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1R > WCD938X_ZDET_VAL_400) && - (z1R <= WCD938X_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1R > WCD938X_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - wcd938x_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - } -right_ch_impedance: - if ((z1R == WCD938X_ZDET_FLOATING_IMPEDANCE) || - (z1R > WCD938X_ZDET_VAL_100K)) { - *zr = WCD938X_ZDET_FLOATING_IMPEDANCE; - } else { - *zr = z1R/1000; - wcd938x_wcd_mbhc_qfuse_cal(codec, zr, 1); - } - dev_dbg(codec->dev, "%s: impedance on HPH_R = %d(ohms)\n", - __func__, *zr); - - /* Mono/stereo detection */ - if ((*zl == WCD938X_ZDET_FLOATING_IMPEDANCE) && - (*zr == WCD938X_ZDET_FLOATING_IMPEDANCE)) { - dev_dbg(codec->dev, - "%s: plug type is invalid or extension cable\n", - __func__); - goto zdet_complete; - } - if ((*zl == WCD938X_ZDET_FLOATING_IMPEDANCE) || - (*zr == WCD938X_ZDET_FLOATING_IMPEDANCE) || - ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) || - ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) { - dev_dbg(codec->dev, - "%s: Mono plug type with one ch floating or shorted to GND\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - goto zdet_complete; - } - snd_soc_update_bits(codec, WCD938X_HPH_R_ATEST, 0x02, 0x02); - snd_soc_update_bits(codec, WCD938X_HPH_PA_CTL2, 0x40, 0x01); - if (*zl < (WCD938X_ZDET_VAL_32/1000)) - wcd938x_mbhc_zdet_ramp(codec, &zdet_param[0], &z1Ls, NULL, d1); - else - wcd938x_mbhc_zdet_ramp(codec, &zdet_param[1], &z1Ls, NULL, d1); - snd_soc_update_bits(codec, WCD938X_HPH_PA_CTL2, 0x40, 0x00); - snd_soc_update_bits(codec, WCD938X_HPH_R_ATEST, 0x02, 0x00); - z1Ls /= 1000; - wcd938x_wcd_mbhc_qfuse_cal(codec, &z1Ls, 0); - /* Parallel of left Z and 9 ohm pull down resistor */ - zMono = ((*zl) * 9) / ((*zl) + 9); - z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); - z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); - if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) { - dev_dbg(codec->dev, "%s: stereo plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } else { - dev_dbg(codec->dev, "%s: MONO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } - - /* Enable surge protection again after impedance detection */ - regmap_update_bits(wcd938x->regmap, - WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); -zdet_complete: - snd_soc_write(codec, WCD938X_ANA_MBHC_BTN5, reg0); - snd_soc_write(codec, WCD938X_ANA_MBHC_BTN6, reg1); - snd_soc_write(codec, WCD938X_ANA_MBHC_BTN7, reg2); - /* Turn on 100k pull down on HPHL */ - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_MECH, 0x01, 0x01); - - /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_MECH, 0x80, 0x80); - - snd_soc_write(codec, WCD938X_MBHC_NEW_ZDET_ANA_CTL, reg4); - snd_soc_write(codec, WCD938X_MBHC_CTL_CLK, reg3); - if (is_fsm_disable) - regmap_update_bits(wcd938x->regmap, - WCD938X_ANA_MBHC_ELECT, 0x80, 0x80); -} - -static void wcd938x_mbhc_gnd_det_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_MECH, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_MECH, - 0x40, 0x40); - } else { - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_MECH, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_MECH, - 0x02, 0x00); - } -} - -static void wcd938x_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD938X_HPH_PA_CTL2, - 0x40, 0x40); - snd_soc_update_bits(codec, WCD938X_HPH_PA_CTL2, - 0x10, 0x10); - } else { - snd_soc_update_bits(codec, WCD938X_HPH_PA_CTL2, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD938X_HPH_PA_CTL2, - 0x10, 0x00); - } -} - -static void wcd938x_mbhc_moisture_config(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - /* Do not enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); -} - -static void wcd938x_mbhc_moisture_detect_en(struct wcd_mbhc *mbhc, bool enable) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if (enable) - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); - else - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); -} - -static bool wcd938x_mbhc_get_moisture_status(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - bool ret = false; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - goto done; - } - - /* Do not enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, WCD938X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - goto done; - } - - /* - * If moisture_en is already enabled, then skip to plug type - * detection. - */ - if ((snd_soc_read(codec, WCD938X_MBHC_NEW_CTL_2) & 0x0C)) - goto done; - - wcd938x_mbhc_moisture_detect_en(mbhc, true); - /* Read moisture comparator status */ - ret = ((snd_soc_read(codec, WCD938X_MBHC_NEW_FSM_STATUS) - & 0x20) ? 0 : 1); - -done: - return ret; - -} - -static void wcd938x_mbhc_moisture_polling_ctrl(struct wcd_mbhc *mbhc, - bool enable) -{ - struct snd_soc_codec *codec = mbhc->codec; - - snd_soc_update_bits(codec, - WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, - 0x04, (enable << 2)); -} - -static void wcd938x_mbhc_bcs_enable(struct wcd_mbhc *mbhc, - bool bcs_enable) -{ - if (bcs_enable) - wcd938x_disable_bcs_before_slow_insert(mbhc->codec, false); - else - wcd938x_disable_bcs_before_slow_insert(mbhc->codec, true); -} - -static const struct wcd_mbhc_cb mbhc_cb = { - .request_irq = wcd938x_mbhc_request_irq, - .irq_control = wcd938x_mbhc_irq_control, - .free_irq = wcd938x_mbhc_free_irq, - .clk_setup = wcd938x_mbhc_clk_setup, - .map_btn_code_to_num = wcd938x_mbhc_btn_to_num, - .mbhc_bias = wcd938x_mbhc_mbhc_bias_control, - .set_btn_thr = wcd938x_mbhc_program_btn_thr, - .lock_sleep = wcd938x_mbhc_lock_sleep, - .register_notifier = wcd938x_mbhc_register_notifier, - .micbias_enable_status = wcd938x_mbhc_micb_en_status, - .hph_pa_on_status = wcd938x_mbhc_hph_pa_on_status, - .hph_pull_up_control_v2 = wcd938x_mbhc_hph_l_pull_up_control, - .mbhc_micbias_control = wcd938x_mbhc_request_micbias, - .mbhc_micb_ramp_control = wcd938x_mbhc_micb_ramp_control, - .get_hwdep_fw_cal = wcd938x_get_hwdep_fw_cal, - .mbhc_micb_ctrl_thr_mic = wcd938x_mbhc_micb_ctrl_threshold_mic, - .compute_impedance = wcd938x_wcd_mbhc_calc_impedance, - .mbhc_gnd_det_ctrl = wcd938x_mbhc_gnd_det_ctrl, - .hph_pull_down_ctrl = wcd938x_mbhc_hph_pull_down_ctrl, - .mbhc_moisture_config = wcd938x_mbhc_moisture_config, - .mbhc_get_moisture_status = wcd938x_mbhc_get_moisture_status, - .mbhc_moisture_polling_ctrl = wcd938x_mbhc_moisture_polling_ctrl, - .mbhc_moisture_detect_en = wcd938x_mbhc_moisture_detect_en, - .bcs_enable = wcd938x_mbhc_bcs_enable, -}; - -static int wcd938x_get_hph_type(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_mbhc *wcd938x_mbhc = wcd938x_soc_get_mbhc(codec); - struct wcd_mbhc *mbhc; - - if (!wcd938x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mbhc = &wcd938x_mbhc->wcd_mbhc; - - ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; - dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); - - return 0; -} - -static int wcd938x_hph_impedance_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t zl, zr; - bool hphr; - struct soc_multi_mixer_control *mc; - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_mbhc *wcd938x_mbhc = wcd938x_soc_get_mbhc(codec); - - if (!wcd938x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - wcd_mbhc_get_impedance(&wcd938x_mbhc->wcd_mbhc, &zl, &zr); - dev_dbg(codec->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); - ucontrol->value.integer.value[0] = hphr ? zr : zl; - - return 0; -} - -static const struct snd_kcontrol_new hph_type_detect_controls[] = { - SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, - wcd938x_get_hph_type, NULL), -}; - -static const struct snd_kcontrol_new impedance_detect_controls[] = { - SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0, - wcd938x_hph_impedance_get, NULL), - SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0, - wcd938x_hph_impedance_get, NULL), -}; - -/* - * wcd938x_mbhc_get_impedance: get impedance of headphone - * left and right channels - * @wcd938x_mbhc: handle to struct wcd938x_mbhc * - * @zl: handle to left-ch impedance - * @zr: handle to right-ch impedance - * return 0 for success or error code in case of failure - */ -int wcd938x_mbhc_get_impedance(struct wcd938x_mbhc *wcd938x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (!wcd938x_mbhc) { - pr_err("%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - if (!zl || !zr) { - pr_err("%s: zl or zr null!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_get_impedance(&wcd938x_mbhc->wcd_mbhc, zl, zr); -} -EXPORT_SYMBOL(wcd938x_mbhc_get_impedance); - -/* - * wcd938x_mbhc_hs_detect: starts mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - * @mbhc_cfg: handle to mbhc configuration structure - * return 0 if mbhc_start is success or error code in case of failure - */ -int wcd938x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - struct wcd938x_priv *wcd938x = NULL; - struct wcd938x_mbhc *wcd938x_mbhc = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - wcd938x = snd_soc_codec_get_drvdata(codec); - if (!wcd938x) { - pr_err("%s: wcd938x is NULL\n", __func__); - return -EINVAL; - } - - wcd938x_mbhc = wcd938x->mbhc; - if (!wcd938x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_start(&wcd938x_mbhc->wcd_mbhc, mbhc_cfg); -} -EXPORT_SYMBOL(wcd938x_mbhc_hs_detect); - -/* - * wcd938x_mbhc_hs_detect_exit: stop mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - */ -void wcd938x_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ - struct wcd938x_priv *wcd938x = NULL; - struct wcd938x_mbhc *wcd938x_mbhc = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - wcd938x = snd_soc_codec_get_drvdata(codec); - if (!wcd938x) { - pr_err("%s: wcd938x is NULL\n", __func__); - return; - } - - wcd938x_mbhc = wcd938x->mbhc; - if (!wcd938x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return; - } - wcd_mbhc_stop(&wcd938x_mbhc->wcd_mbhc); -} -EXPORT_SYMBOL(wcd938x_mbhc_hs_detect_exit); - -/* - * wcd938x_mbhc_ssr_down: stop mbhc during - * wcd938x subsystem restart - * mbhc: pointer to wcd937x_mbhc structure - * codec: handle to snd_soc_codec * - */ -void wcd938x_mbhc_ssr_down(struct wcd938x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - struct wcd_mbhc *wcd_mbhc = NULL; - - if (!mbhc || !codec) - return; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (!wcd_mbhc) { - dev_err(codec->dev, "%s: wcd_mbhc is NULL\n", __func__); - return; - } - - wcd938x_mbhc_hs_detect_exit(codec); - wcd_mbhc_deinit(wcd_mbhc); -} -EXPORT_SYMBOL(wcd938x_mbhc_ssr_down); - -/* - * wcd938x_mbhc_post_ssr_init: initialize mbhc for - * wcd938x post subsystem restart - * @mbhc: poniter to wcd938x_mbhc structure - * @codec: handle to snd_soc_codec * - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int wcd938x_mbhc_post_ssr_init(struct wcd938x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - int ret = 0; - struct wcd_mbhc *wcd_mbhc = NULL; - - if (!mbhc || !codec) - return -EINVAL; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - return -EINVAL; - } - - /* Reset detection type to insertion after SSR recovery */ - snd_soc_update_bits(codec, WCD938X_ANA_MBHC_MECH, - 0x20, 0x20); - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, WCD938X_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(wcd938x_mbhc_post_ssr_init); - -/* - * wcd938x_mbhc_init: initialize mbhc for wcd938x - * @mbhc: poniter to wcd938x_mbhc struct pointer to store the configs - * @codec: handle to snd_soc_codec * - * @fw_data: handle to firmware data - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int wcd938x_mbhc_init(struct wcd938x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - struct wcd938x_mbhc *wcd938x_mbhc = NULL; - struct wcd_mbhc *wcd_mbhc = NULL; - int ret = 0; - struct wcd938x_pdata *pdata; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - wcd938x_mbhc = devm_kzalloc(codec->dev, sizeof(struct wcd938x_mbhc), - GFP_KERNEL); - if (!wcd938x_mbhc) - return -ENOMEM; - - wcd938x_mbhc->fw_data = fw_data; - BLOCKING_INIT_NOTIFIER_HEAD(&wcd938x_mbhc->notifier); - wcd_mbhc = &wcd938x_mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - /* Setting default mbhc detection logic to ADC */ - wcd_mbhc->mbhc_detection_logic = WCD_DETECTION_ADC; - - pdata = dev_get_platdata(codec->dev); - if (!pdata) { - dev_err(codec->dev, "%s: pdata pointer is NULL\n", - __func__); - ret = -EINVAL; - goto err; - } - wcd_mbhc->micb_mv = pdata->micbias.micb2_mv; - - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, - &intr_ids, wcd_mbhc_registers, - WCD938X_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto err; - } - - (*mbhc) = wcd938x_mbhc; - snd_soc_add_codec_controls(codec, impedance_detect_controls, - ARRAY_SIZE(impedance_detect_controls)); - snd_soc_add_codec_controls(codec, hph_type_detect_controls, - ARRAY_SIZE(hph_type_detect_controls)); - - return 0; -err: - devm_kfree(codec->dev, wcd938x_mbhc); - return ret; -} -EXPORT_SYMBOL(wcd938x_mbhc_init); - -/* - * wcd938x_mbhc_deinit: deinitialize mbhc for wcd938x - * @codec: handle to snd_soc_codec * - */ -void wcd938x_mbhc_deinit(struct snd_soc_codec *codec) -{ - struct wcd938x_priv *wcd938x; - struct wcd938x_mbhc *wcd938x_mbhc; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - wcd938x = snd_soc_codec_get_drvdata(codec); - if (!wcd938x) { - pr_err("%s: wcd938x is NULL\n", __func__); - return; - } - - wcd938x_mbhc = wcd938x->mbhc; - if (wcd938x_mbhc) { - wcd_mbhc_deinit(&wcd938x_mbhc->wcd_mbhc); - devm_kfree(codec->dev, wcd938x_mbhc); - } -} -EXPORT_SYMBOL(wcd938x_mbhc_deinit); diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.h b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.h deleted file mode 100644 index 1732c07a66de..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.h +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD938X_MBHC_H__ -#define __WCD938X_MBHC_H__ -#include - -struct wcd938x_mbhc { - struct wcd_mbhc wcd_mbhc; - struct blocking_notifier_head notifier; - struct fw_info *fw_data; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD938X) -extern int wcd938x_mbhc_init(struct wcd938x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data); -extern void wcd938x_mbhc_hs_detect_exit(struct snd_soc_codec *codec); -extern int wcd938x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg); -extern void wcd938x_mbhc_deinit(struct snd_soc_codec *codec); -extern void wcd938x_mbhc_ssr_down(struct wcd938x_mbhc *mbhc, - struct snd_soc_codec *codec); -extern int wcd938x_mbhc_post_ssr_init(struct wcd938x_mbhc *mbhc, - struct snd_soc_codec *codec); -extern int wcd938x_mbhc_get_impedance(struct wcd938x_mbhc *wcd938x_mbhc, - uint32_t *zl, uint32_t *zr); -#else -static inline int wcd938x_mbhc_init(struct wcd938x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - return 0; -} -static inline void wcd938x_mbhc_hs_detect_exit( - struct snd_soc_codec *codec) -{ -} -static inline int wcd938x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline void wcd938x_mbhc_deinit(struct snd_soc_codec *codec) -{ -} -static inline void wcd938x_mbhc_ssr_down(struct wcd938x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ -} -static inline int wcd938x_mbhc_post_ssr_init(struct wcd938x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - return 0; -} - -static inline int wcd938x_mbhc_get_impedance(struct wcd938x_mbhc *wcd938x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (zl) - *zl = 0; - if (zr) - *zr = 0; - return -EINVAL; -} -#endif - -#endif /* __WCD938X_MBHC_H__ */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-registers.h b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-registers.h deleted file mode 100644 index 409c4139fc68..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-registers.h +++ /dev/null @@ -1,502 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD938X_REGISTERS_H -#define _WCD938X_REGISTERS_H - -#define WCD938X_BASE_ADDRESS 0x3000 -#define WCD938X_REG(reg) (reg - WCD938X_BASE_ADDRESS) - -enum { - REG_NO_ACCESS, - RD_REG, - WR_REG, - RD_WR_REG -}; - - -#define WCD938X_ANA_PAGE_REGISTER (WCD938X_BASE_ADDRESS + 0x0000) -#define WCD938X_ANA_BIAS (WCD938X_BASE_ADDRESS + 0x0001) -#define WCD938X_ANA_RX_SUPPLIES (WCD938X_BASE_ADDRESS + 0x0008) -#define WCD938X_ANA_HPH (WCD938X_BASE_ADDRESS + 0x0009) -#define WCD938X_ANA_EAR (WCD938X_BASE_ADDRESS + 0x000A) -#define WCD938X_ANA_EAR_COMPANDER_CTL (WCD938X_BASE_ADDRESS + 0x000B) -#define WCD938X_ANA_TX_CH1 (WCD938X_BASE_ADDRESS + 0x000E) -#define WCD938X_ANA_TX_CH2 (WCD938X_BASE_ADDRESS + 0x000F) -#define WCD938X_ANA_TX_CH3 (WCD938X_BASE_ADDRESS + 0x0010) -#define WCD938X_ANA_TX_CH4 (WCD938X_BASE_ADDRESS + 0x0011) -#define WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC (WCD938X_BASE_ADDRESS + 0x0012) -#define WCD938X_ANA_MICB3_DSP_EN_LOGIC (WCD938X_BASE_ADDRESS + 0x0013) -#define WCD938X_ANA_MBHC_MECH (WCD938X_BASE_ADDRESS + 0x0014) -#define WCD938X_ANA_MBHC_ELECT (WCD938X_BASE_ADDRESS + 0x0015) -#define WCD938X_ANA_MBHC_ZDET (WCD938X_BASE_ADDRESS + 0x0016) -#define WCD938X_ANA_MBHC_RESULT_1 (WCD938X_BASE_ADDRESS + 0x0017) -#define WCD938X_ANA_MBHC_RESULT_2 (WCD938X_BASE_ADDRESS + 0x0018) -#define WCD938X_ANA_MBHC_RESULT_3 (WCD938X_BASE_ADDRESS + 0x0019) -#define WCD938X_ANA_MBHC_BTN0 (WCD938X_BASE_ADDRESS + 0x001A) -#define WCD938X_ANA_MBHC_BTN1 (WCD938X_BASE_ADDRESS + 0x001B) -#define WCD938X_ANA_MBHC_BTN2 (WCD938X_BASE_ADDRESS + 0x001C) -#define WCD938X_ANA_MBHC_BTN3 (WCD938X_BASE_ADDRESS + 0x001D) -#define WCD938X_ANA_MBHC_BTN4 (WCD938X_BASE_ADDRESS + 0x001E) -#define WCD938X_ANA_MBHC_BTN5 (WCD938X_BASE_ADDRESS + 0x001F) -#define WCD938X_ANA_MBHC_BTN6 (WCD938X_BASE_ADDRESS + 0x0020) -#define WCD938X_ANA_MBHC_BTN7 (WCD938X_BASE_ADDRESS + 0x0021) -#define WCD938X_ANA_MICB1 (WCD938X_BASE_ADDRESS + 0x0022) -#define WCD938X_ANA_MICB2 (WCD938X_BASE_ADDRESS + 0x0023) -#define WCD938X_ANA_MICB2_RAMP (WCD938X_BASE_ADDRESS + 0x0024) -#define WCD938X_ANA_MICB3 (WCD938X_BASE_ADDRESS + 0x0025) -#define WCD938X_ANA_MICB4 (WCD938X_BASE_ADDRESS + 0x0026) -#define WCD938X_BIAS_CTL (WCD938X_BASE_ADDRESS + 0x0028) -#define WCD938X_BIAS_VBG_FINE_ADJ (WCD938X_BASE_ADDRESS + 0x0029) -#define WCD938X_LDOL_VDDCX_ADJUST (WCD938X_BASE_ADDRESS + 0x0040) -#define WCD938X_LDOL_DISABLE_LDOL (WCD938X_BASE_ADDRESS + 0x0041) -#define WCD938X_MBHC_CTL_CLK (WCD938X_BASE_ADDRESS + 0x0056) -#define WCD938X_MBHC_CTL_ANA (WCD938X_BASE_ADDRESS + 0x0057) -#define WCD938X_MBHC_CTL_SPARE_1 (WCD938X_BASE_ADDRESS + 0x0058) -#define WCD938X_MBHC_CTL_SPARE_2 (WCD938X_BASE_ADDRESS + 0x0059) -#define WCD938X_MBHC_CTL_BCS (WCD938X_BASE_ADDRESS + 0x005A) -#define WCD938X_MBHC_MOISTURE_DET_FSM_STATUS (WCD938X_BASE_ADDRESS + 0x005B) -#define WCD938X_MBHC_TEST_CTL (WCD938X_BASE_ADDRESS + 0x005C) -#define WCD938X_LDOH_MODE (WCD938X_BASE_ADDRESS + 0x0067) -#define WCD938X_LDOH_BIAS (WCD938X_BASE_ADDRESS + 0x0068) -#define WCD938X_LDOH_STB_LOADS (WCD938X_BASE_ADDRESS + 0x0069) -#define WCD938X_LDOH_SLOWRAMP (WCD938X_BASE_ADDRESS + 0x006A) -#define WCD938X_MICB1_TEST_CTL_1 (WCD938X_BASE_ADDRESS + 0x006B) -#define WCD938X_MICB1_TEST_CTL_2 (WCD938X_BASE_ADDRESS + 0x006C) -#define WCD938X_MICB1_TEST_CTL_3 (WCD938X_BASE_ADDRESS + 0x006D) -#define WCD938X_MICB2_TEST_CTL_1 (WCD938X_BASE_ADDRESS + 0x006E) -#define WCD938X_MICB2_TEST_CTL_2 (WCD938X_BASE_ADDRESS + 0x006F) -#define WCD938X_MICB2_TEST_CTL_3 (WCD938X_BASE_ADDRESS + 0x0070) -#define WCD938X_MICB3_TEST_CTL_1 (WCD938X_BASE_ADDRESS + 0x0071) -#define WCD938X_MICB3_TEST_CTL_2 (WCD938X_BASE_ADDRESS + 0x0072) -#define WCD938X_MICB3_TEST_CTL_3 (WCD938X_BASE_ADDRESS + 0x0073) -#define WCD938X_MICB4_TEST_CTL_1 (WCD938X_BASE_ADDRESS + 0x0074) -#define WCD938X_MICB4_TEST_CTL_2 (WCD938X_BASE_ADDRESS + 0x0075) -#define WCD938X_MICB4_TEST_CTL_3 (WCD938X_BASE_ADDRESS + 0x0076) -#define WCD938X_TX_COM_ADC_VCM (WCD938X_BASE_ADDRESS + 0x0077) -#define WCD938X_TX_COM_BIAS_ATEST (WCD938X_BASE_ADDRESS + 0x0078) -#define WCD938X_TX_COM_SPARE1 (WCD938X_BASE_ADDRESS + 0x0079) -#define WCD938X_TX_COM_SPARE2 (WCD938X_BASE_ADDRESS + 0x007A) -#define WCD938X_TX_COM_TXFE_DIV_CTL (WCD938X_BASE_ADDRESS + 0x007B) -#define WCD938X_TX_COM_TXFE_DIV_START (WCD938X_BASE_ADDRESS + 0x007C) -#define WCD938X_TX_COM_SPARE3 (WCD938X_BASE_ADDRESS + 0x007D) -#define WCD938X_TX_COM_SPARE4 (WCD938X_BASE_ADDRESS + 0x007E) -#define WCD938X_TX_1_2_TEST_EN (WCD938X_BASE_ADDRESS + 0x007F) -#define WCD938X_TX_1_2_ADC_IB (WCD938X_BASE_ADDRESS + 0x0080) -#define WCD938X_TX_1_2_ATEST_REFCTL (WCD938X_BASE_ADDRESS + 0x0081) -#define WCD938X_TX_1_2_TEST_CTL (WCD938X_BASE_ADDRESS + 0x0082) -#define WCD938X_TX_1_2_TEST_BLK_EN1 (WCD938X_BASE_ADDRESS + 0x0083) -#define WCD938X_TX_1_2_TXFE1_CLKDIV (WCD938X_BASE_ADDRESS + 0x0084) -#define WCD938X_TX_1_2_SAR2_ERR (WCD938X_BASE_ADDRESS + 0x0085) -#define WCD938X_TX_1_2_SAR1_ERR (WCD938X_BASE_ADDRESS + 0x0086) -#define WCD938X_TX_3_4_TEST_EN (WCD938X_BASE_ADDRESS + 0x0087) -#define WCD938X_TX_3_4_ADC_IB (WCD938X_BASE_ADDRESS + 0x0088) -#define WCD938X_TX_3_4_ATEST_REFCTL (WCD938X_BASE_ADDRESS + 0x0089) -#define WCD938X_TX_3_4_TEST_CTL (WCD938X_BASE_ADDRESS + 0x008A) -#define WCD938X_TX_3_4_TEST_BLK_EN3 (WCD938X_BASE_ADDRESS + 0x008B) -#define WCD938X_TX_3_4_TXFE3_CLKDIV (WCD938X_BASE_ADDRESS + 0x008C) -#define WCD938X_TX_3_4_SAR4_ERR (WCD938X_BASE_ADDRESS + 0x008D) -#define WCD938X_TX_3_4_SAR3_ERR (WCD938X_BASE_ADDRESS + 0x008E) -#define WCD938X_TX_3_4_TEST_BLK_EN2 (WCD938X_BASE_ADDRESS + 0x008F) -#define WCD938X_TX_3_4_TXFE2_CLKDIV (WCD938X_BASE_ADDRESS + 0x0090) -#define WCD938X_TX_3_4_SPARE1 (WCD938X_BASE_ADDRESS + 0x0091) -#define WCD938X_TX_3_4_TEST_BLK_EN4 (WCD938X_BASE_ADDRESS + 0x0092) -#define WCD938X_TX_3_4_TXFE4_CLKDIV (WCD938X_BASE_ADDRESS + 0x0093) -#define WCD938X_TX_3_4_SPARE2 (WCD938X_BASE_ADDRESS + 0x0094) -#define WCD938X_CLASSH_MODE_1 (WCD938X_BASE_ADDRESS + 0x0097) -#define WCD938X_CLASSH_MODE_2 (WCD938X_BASE_ADDRESS + 0x0098) -#define WCD938X_CLASSH_MODE_3 (WCD938X_BASE_ADDRESS + 0x0099) -#define WCD938X_CLASSH_CTRL_VCL_1 (WCD938X_BASE_ADDRESS + 0x009A) -#define WCD938X_CLASSH_CTRL_VCL_2 (WCD938X_BASE_ADDRESS + 0x009B) -#define WCD938X_CLASSH_CTRL_CCL_1 (WCD938X_BASE_ADDRESS + 0x009C) -#define WCD938X_CLASSH_CTRL_CCL_2 (WCD938X_BASE_ADDRESS + 0x009D) -#define WCD938X_CLASSH_CTRL_CCL_3 (WCD938X_BASE_ADDRESS + 0x009E) -#define WCD938X_CLASSH_CTRL_CCL_4 (WCD938X_BASE_ADDRESS + 0x009F) -#define WCD938X_CLASSH_CTRL_CCL_5 (WCD938X_BASE_ADDRESS + 0x00A0) -#define WCD938X_CLASSH_BUCK_TMUX_A_D (WCD938X_BASE_ADDRESS + 0x00A1) -#define WCD938X_CLASSH_BUCK_SW_DRV_CNTL (WCD938X_BASE_ADDRESS + 0x00A2) -#define WCD938X_CLASSH_SPARE (WCD938X_BASE_ADDRESS + 0x00A3) -#define WCD938X_FLYBACK_EN (WCD938X_BASE_ADDRESS + 0x00A4) -#define WCD938X_FLYBACK_VNEG_CTRL_1 (WCD938X_BASE_ADDRESS + 0x00A5) -#define WCD938X_FLYBACK_VNEG_CTRL_2 (WCD938X_BASE_ADDRESS + 0x00A6) -#define WCD938X_FLYBACK_VNEG_CTRL_3 (WCD938X_BASE_ADDRESS + 0x00A7) -#define WCD938X_FLYBACK_VNEG_CTRL_4 (WCD938X_BASE_ADDRESS + 0x00A8) -#define WCD938X_FLYBACK_VNEG_CTRL_5 (WCD938X_BASE_ADDRESS + 0x00A9) -#define WCD938X_FLYBACK_VNEG_CTRL_6 (WCD938X_BASE_ADDRESS + 0x00AA) -#define WCD938X_FLYBACK_VNEG_CTRL_7 (WCD938X_BASE_ADDRESS + 0x00AB) -#define WCD938X_FLYBACK_VNEG_CTRL_8 (WCD938X_BASE_ADDRESS + 0x00AC) -#define WCD938X_FLYBACK_VNEG_CTRL_9 (WCD938X_BASE_ADDRESS + 0x00AD) -#define WCD938X_FLYBACK_VNEGDAC_CTRL_1 (WCD938X_BASE_ADDRESS + 0x00AE) -#define WCD938X_FLYBACK_VNEGDAC_CTRL_2 (WCD938X_BASE_ADDRESS + 0x00AF) -#define WCD938X_FLYBACK_VNEGDAC_CTRL_3 (WCD938X_BASE_ADDRESS + 0x00B0) -#define WCD938X_FLYBACK_CTRL_1 (WCD938X_BASE_ADDRESS + 0x00B1) -#define WCD938X_FLYBACK_TEST_CTL (WCD938X_BASE_ADDRESS + 0x00B2) -#define WCD938X_RX_AUX_SW_CTL (WCD938X_BASE_ADDRESS + 0x00B3) -#define WCD938X_RX_PA_AUX_IN_CONN (WCD938X_BASE_ADDRESS + 0x00B4) -#define WCD938X_RX_TIMER_DIV (WCD938X_BASE_ADDRESS + 0x00B5) -#define WCD938X_RX_OCP_CTL (WCD938X_BASE_ADDRESS + 0x00B6) -#define WCD938X_RX_OCP_COUNT (WCD938X_BASE_ADDRESS + 0x00B7) -#define WCD938X_RX_BIAS_EAR_DAC (WCD938X_BASE_ADDRESS + 0x00B8) -#define WCD938X_RX_BIAS_EAR_AMP (WCD938X_BASE_ADDRESS + 0x00B9) -#define WCD938X_RX_BIAS_HPH_LDO (WCD938X_BASE_ADDRESS + 0x00BA) -#define WCD938X_RX_BIAS_HPH_PA (WCD938X_BASE_ADDRESS + 0x00BB) -#define WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2 (WCD938X_BASE_ADDRESS + 0x00BC) -#define WCD938X_RX_BIAS_HPH_RDAC_LDO (WCD938X_BASE_ADDRESS + 0x00BD) -#define WCD938X_RX_BIAS_HPH_CNP1 (WCD938X_BASE_ADDRESS + 0x00BE) -#define WCD938X_RX_BIAS_HPH_LOWPOWER (WCD938X_BASE_ADDRESS + 0x00BF) -#define WCD938X_RX_BIAS_AUX_DAC (WCD938X_BASE_ADDRESS + 0x00C0) -#define WCD938X_RX_BIAS_AUX_AMP (WCD938X_BASE_ADDRESS + 0x00C1) -#define WCD938X_RX_BIAS_VNEGDAC_BLEEDER (WCD938X_BASE_ADDRESS + 0x00C2) -#define WCD938X_RX_BIAS_MISC (WCD938X_BASE_ADDRESS + 0x00C3) -#define WCD938X_RX_BIAS_BUCK_RST (WCD938X_BASE_ADDRESS + 0x00C4) -#define WCD938X_RX_BIAS_BUCK_VREF_ERRAMP (WCD938X_BASE_ADDRESS + 0x00C5) -#define WCD938X_RX_BIAS_FLYB_ERRAMP (WCD938X_BASE_ADDRESS + 0x00C6) -#define WCD938X_RX_BIAS_FLYB_BUFF (WCD938X_BASE_ADDRESS + 0x00C7) -#define WCD938X_RX_BIAS_FLYB_MID_RST (WCD938X_BASE_ADDRESS + 0x00C8) -#define WCD938X_HPH_L_STATUS (WCD938X_BASE_ADDRESS + 0x00C9) -#define WCD938X_HPH_R_STATUS (WCD938X_BASE_ADDRESS + 0x00CA) -#define WCD938X_HPH_CNP_EN (WCD938X_BASE_ADDRESS + 0x00CB) -#define WCD938X_HPH_CNP_WG_CTL (WCD938X_BASE_ADDRESS + 0x00CC) -#define WCD938X_HPH_CNP_WG_TIME (WCD938X_BASE_ADDRESS + 0x00CD) -#define WCD938X_HPH_OCP_CTL (WCD938X_BASE_ADDRESS + 0x00CE) -#define WCD938X_HPH_AUTO_CHOP (WCD938X_BASE_ADDRESS + 0x00CF) -#define WCD938X_HPH_CHOP_CTL (WCD938X_BASE_ADDRESS + 0x00D0) -#define WCD938X_HPH_PA_CTL1 (WCD938X_BASE_ADDRESS + 0x00D1) -#define WCD938X_HPH_PA_CTL2 (WCD938X_BASE_ADDRESS + 0x00D2) -#define WCD938X_HPH_L_EN (WCD938X_BASE_ADDRESS + 0x00D3) -#define WCD938X_HPH_L_TEST (WCD938X_BASE_ADDRESS + 0x00D4) -#define WCD938X_HPH_L_ATEST (WCD938X_BASE_ADDRESS + 0x00D5) -#define WCD938X_HPH_R_EN (WCD938X_BASE_ADDRESS + 0x00D6) -#define WCD938X_HPH_R_TEST (WCD938X_BASE_ADDRESS + 0x00D7) -#define WCD938X_HPH_R_ATEST (WCD938X_BASE_ADDRESS + 0x00D8) -#define WCD938X_HPH_RDAC_CLK_CTL1 (WCD938X_BASE_ADDRESS + 0x00D9) -#define WCD938X_HPH_RDAC_CLK_CTL2 (WCD938X_BASE_ADDRESS + 0x00DA) -#define WCD938X_HPH_RDAC_LDO_CTL (WCD938X_BASE_ADDRESS + 0x00DB) -#define WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL (WCD938X_BASE_ADDRESS + 0x00DC) -#define WCD938X_HPH_REFBUFF_UHQA_CTL (WCD938X_BASE_ADDRESS + 0x00DD) -#define WCD938X_HPH_REFBUFF_LP_CTL (WCD938X_BASE_ADDRESS + 0x00DE) -#define WCD938X_HPH_L_DAC_CTL (WCD938X_BASE_ADDRESS + 0x00DF) -#define WCD938X_HPH_R_DAC_CTL (WCD938X_BASE_ADDRESS + 0x00E0) -#define WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL (WCD938X_BASE_ADDRESS + 0x00E1) -#define WCD938X_HPH_SURGE_HPHLR_SURGE_EN (WCD938X_BASE_ADDRESS + 0x00E2) -#define WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1 (WCD938X_BASE_ADDRESS + 0x00E3) -#define WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS (WCD938X_BASE_ADDRESS + 0x00E4) -#define WCD938X_EAR_EAR_EN_REG (WCD938X_BASE_ADDRESS + 0x00E9) -#define WCD938X_EAR_EAR_PA_CON (WCD938X_BASE_ADDRESS + 0x00EA) -#define WCD938X_EAR_EAR_SP_CON (WCD938X_BASE_ADDRESS + 0x00EB) -#define WCD938X_EAR_EAR_DAC_CON (WCD938X_BASE_ADDRESS + 0x00EC) -#define WCD938X_EAR_EAR_CNP_FSM_CON (WCD938X_BASE_ADDRESS + 0x00ED) -#define WCD938X_EAR_TEST_CTL (WCD938X_BASE_ADDRESS + 0x00EE) -#define WCD938X_EAR_STATUS_REG_1 (WCD938X_BASE_ADDRESS + 0x00EF) -#define WCD938X_EAR_STATUS_REG_2 (WCD938X_BASE_ADDRESS + 0x00F0) -#define WCD938X_ANA_NEW_PAGE_REGISTER (WCD938X_BASE_ADDRESS + 0x0100) -#define WCD938X_HPH_NEW_ANA_HPH2 (WCD938X_BASE_ADDRESS + 0x0101) -#define WCD938X_HPH_NEW_ANA_HPH3 (WCD938X_BASE_ADDRESS + 0x0102) -#define WCD938X_SLEEP_CTL (WCD938X_BASE_ADDRESS + 0x0103) -#define WCD938X_SLEEP_WATCHDOG_CTL (WCD938X_BASE_ADDRESS + 0x0104) -#define WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL (WCD938X_BASE_ADDRESS + 0x011F) -#define WCD938X_MBHC_NEW_CTL_1 (WCD938X_BASE_ADDRESS + 0x0120) -#define WCD938X_MBHC_NEW_CTL_2 (WCD938X_BASE_ADDRESS + 0x0121) -#define WCD938X_MBHC_NEW_PLUG_DETECT_CTL (WCD938X_BASE_ADDRESS + 0x0122) -#define WCD938X_MBHC_NEW_ZDET_ANA_CTL (WCD938X_BASE_ADDRESS + 0x0123) -#define WCD938X_MBHC_NEW_ZDET_RAMP_CTL (WCD938X_BASE_ADDRESS + 0x0124) -#define WCD938X_MBHC_NEW_FSM_STATUS (WCD938X_BASE_ADDRESS + 0x0125) -#define WCD938X_MBHC_NEW_ADC_RESULT (WCD938X_BASE_ADDRESS + 0x0126) -#define WCD938X_TX_NEW_AMIC_MUX_CFG (WCD938X_BASE_ADDRESS + 0x0127) -#define WCD938X_AUX_AUXPA (WCD938X_BASE_ADDRESS + 0x0128) -#define WCD938X_LDORXTX_MODE (WCD938X_BASE_ADDRESS + 0x0129) -#define WCD938X_LDORXTX_CONFIG (WCD938X_BASE_ADDRESS + 0x012A) -#define WCD938X_DIE_CRACK_DIE_CRK_DET_EN (WCD938X_BASE_ADDRESS + 0x012C) -#define WCD938X_DIE_CRACK_DIE_CRK_DET_OUT (WCD938X_BASE_ADDRESS + 0x012D) -#define WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL (WCD938X_BASE_ADDRESS + 0x0132) -#define WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L (WCD938X_BASE_ADDRESS + 0x0133) -#define WCD938X_HPH_NEW_INT_RDAC_VREF_CTL (WCD938X_BASE_ADDRESS + 0x0134) -#define WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL (WCD938X_BASE_ADDRESS + 0x0135) -#define WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R (WCD938X_BASE_ADDRESS + 0x0136) -#define WCD938X_HPH_NEW_INT_PA_MISC1 (WCD938X_BASE_ADDRESS + 0x0137) -#define WCD938X_HPH_NEW_INT_PA_MISC2 (WCD938X_BASE_ADDRESS + 0x0138) -#define WCD938X_HPH_NEW_INT_PA_RDAC_MISC (WCD938X_BASE_ADDRESS + 0x0139) -#define WCD938X_HPH_NEW_INT_HPH_TIMER1 (WCD938X_BASE_ADDRESS + 0x013A) -#define WCD938X_HPH_NEW_INT_HPH_TIMER2 (WCD938X_BASE_ADDRESS + 0x013B) -#define WCD938X_HPH_NEW_INT_HPH_TIMER3 (WCD938X_BASE_ADDRESS + 0x013C) -#define WCD938X_HPH_NEW_INT_HPH_TIMER4 (WCD938X_BASE_ADDRESS + 0x013D) -#define WCD938X_HPH_NEW_INT_PA_RDAC_MISC2 (WCD938X_BASE_ADDRESS + 0x013E) -#define WCD938X_HPH_NEW_INT_PA_RDAC_MISC3 (WCD938X_BASE_ADDRESS + 0x013F) -#define WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW (WCD938X_BASE_ADDRESS + 0x0140) -#define WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW (WCD938X_BASE_ADDRESS + 0x0141) -#define WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI (WCD938X_BASE_ADDRESS + 0x0145) -#define WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP (WCD938X_BASE_ADDRESS + 0x0146) -#define WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP (WCD938X_BASE_ADDRESS + 0x0147) -#define WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL \ - (WCD938X_BASE_ADDRESS + 0x01AF) -#define WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL \ - (WCD938X_BASE_ADDRESS + 0x01B0) -#define WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT (WCD938X_BASE_ADDRESS + 0x01B1) -#define WCD938X_MBHC_NEW_INT_SPARE_2 (WCD938X_BASE_ADDRESS + 0x01B2) -#define WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON (WCD938X_BASE_ADDRESS + 0x01B7) -#define WCD938X_EAR_INT_NEW_CNP_VCM_CON1 (WCD938X_BASE_ADDRESS + 0x01B8) -#define WCD938X_EAR_INT_NEW_CNP_VCM_CON2 (WCD938X_BASE_ADDRESS + 0x01B9) -#define WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS (WCD938X_BASE_ADDRESS + 0x01BA) -#define WCD938X_AUX_INT_EN_REG (WCD938X_BASE_ADDRESS + 0x01BD) -#define WCD938X_AUX_INT_PA_CTRL (WCD938X_BASE_ADDRESS + 0x01BE) -#define WCD938X_AUX_INT_SP_CTRL (WCD938X_BASE_ADDRESS + 0x01BF) -#define WCD938X_AUX_INT_DAC_CTRL (WCD938X_BASE_ADDRESS + 0x01C0) -#define WCD938X_AUX_INT_CLK_CTRL (WCD938X_BASE_ADDRESS + 0x01C1) -#define WCD938X_AUX_INT_TEST_CTRL (WCD938X_BASE_ADDRESS + 0x01C2) -#define WCD938X_AUX_INT_STATUS_REG (WCD938X_BASE_ADDRESS + 0x01C3) -#define WCD938X_AUX_INT_MISC (WCD938X_BASE_ADDRESS + 0x01C4) -#define WCD938X_LDORXTX_INT_BIAS (WCD938X_BASE_ADDRESS + 0x01C5) -#define WCD938X_LDORXTX_INT_STB_LOADS_DTEST (WCD938X_BASE_ADDRESS + 0x01C6) -#define WCD938X_LDORXTX_INT_TEST0 (WCD938X_BASE_ADDRESS + 0x01C7) -#define WCD938X_LDORXTX_INT_STARTUP_TIMER (WCD938X_BASE_ADDRESS + 0x01C8) -#define WCD938X_LDORXTX_INT_TEST1 (WCD938X_BASE_ADDRESS + 0x01C9) -#define WCD938X_LDORXTX_INT_STATUS (WCD938X_BASE_ADDRESS + 0x01CA) -#define WCD938X_SLEEP_INT_WATCHDOG_CTL_1 (WCD938X_BASE_ADDRESS + 0x01D0) -#define WCD938X_SLEEP_INT_WATCHDOG_CTL_2 (WCD938X_BASE_ADDRESS + 0x01D1) -#define WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1 (WCD938X_BASE_ADDRESS + 0x01D3) -#define WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2 (WCD938X_BASE_ADDRESS + 0x01D4) -#define WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2 (WCD938X_BASE_ADDRESS + 0x01D5) -#define WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1 (WCD938X_BASE_ADDRESS + 0x01D6) -#define WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0 (WCD938X_BASE_ADDRESS + 0x01D7) -#define WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M \ - (WCD938X_BASE_ADDRESS + 0x01D8) -#define WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M \ - (WCD938X_BASE_ADDRESS + 0x01D9) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1 \ - (WCD938X_BASE_ADDRESS + 0x01DA) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0 \ - (WCD938X_BASE_ADDRESS + 0x01DB) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP \ - (WCD938X_BASE_ADDRESS + 0x01DC) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1 \ - (WCD938X_BASE_ADDRESS + 0x01DD) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0 \ - (WCD938X_BASE_ADDRESS + 0x01DE) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP \ - (WCD938X_BASE_ADDRESS + 0x01DF) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0 \ - (WCD938X_BASE_ADDRESS + 0x01E0) -#define WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP \ - (WCD938X_BASE_ADDRESS + 0x01E1) -#define WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1 \ - (WCD938X_BASE_ADDRESS + 0x01E2) -#define WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP \ - (WCD938X_BASE_ADDRESS + 0x01E3) -#define WCD938X_TX_COM_NEW_INT_TXADC_INT_L2 (WCD938X_BASE_ADDRESS + 0x01E4) -#define WCD938X_TX_COM_NEW_INT_TXADC_INT_L1 (WCD938X_BASE_ADDRESS + 0x01E5) -#define WCD938X_TX_COM_NEW_INT_TXADC_INT_L0 (WCD938X_BASE_ADDRESS + 0x01E6) -#define WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP (WCD938X_BASE_ADDRESS + 0x01E7) -#define WCD938X_DIGITAL_PAGE_REGISTER (WCD938X_BASE_ADDRESS + 0x0400) -#define WCD938X_DIGITAL_CHIP_ID0 (WCD938X_BASE_ADDRESS + 0x0401) -#define WCD938X_DIGITAL_CHIP_ID1 (WCD938X_BASE_ADDRESS + 0x0402) -#define WCD938X_DIGITAL_CHIP_ID2 (WCD938X_BASE_ADDRESS + 0x0403) -#define WCD938X_DIGITAL_CHIP_ID3 (WCD938X_BASE_ADDRESS + 0x0404) -#define WCD938X_DIGITAL_SWR_TX_CLK_RATE (WCD938X_BASE_ADDRESS + 0x0405) -#define WCD938X_DIGITAL_CDC_RST_CTL (WCD938X_BASE_ADDRESS + 0x0406) -#define WCD938X_DIGITAL_TOP_CLK_CFG (WCD938X_BASE_ADDRESS + 0x0407) -#define WCD938X_DIGITAL_CDC_ANA_CLK_CTL (WCD938X_BASE_ADDRESS + 0x0408) -#define WCD938X_DIGITAL_CDC_DIG_CLK_CTL (WCD938X_BASE_ADDRESS + 0x0409) -#define WCD938X_DIGITAL_SWR_RST_EN (WCD938X_BASE_ADDRESS + 0x040A) -#define WCD938X_DIGITAL_CDC_PATH_MODE (WCD938X_BASE_ADDRESS + 0x040B) -#define WCD938X_DIGITAL_CDC_RX_RST (WCD938X_BASE_ADDRESS + 0x040C) -#define WCD938X_DIGITAL_CDC_RX0_CTL (WCD938X_BASE_ADDRESS + 0x040D) -#define WCD938X_DIGITAL_CDC_RX1_CTL (WCD938X_BASE_ADDRESS + 0x040E) -#define WCD938X_DIGITAL_CDC_RX2_CTL (WCD938X_BASE_ADDRESS + 0x040F) -#define WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1 (WCD938X_BASE_ADDRESS + 0x0410) -#define WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3 (WCD938X_BASE_ADDRESS + 0x0411) -#define WCD938X_DIGITAL_CDC_COMP_CTL_0 (WCD938X_BASE_ADDRESS + 0x0414) -#define WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL (WCD938X_BASE_ADDRESS + 0x0417) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A1_0 (WCD938X_BASE_ADDRESS + 0x0418) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A1_1 (WCD938X_BASE_ADDRESS + 0x0419) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A2_0 (WCD938X_BASE_ADDRESS + 0x041A) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A2_1 (WCD938X_BASE_ADDRESS + 0x041B) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A3_0 (WCD938X_BASE_ADDRESS + 0x041C) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A3_1 (WCD938X_BASE_ADDRESS + 0x041D) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A4_0 (WCD938X_BASE_ADDRESS + 0x041E) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A4_1 (WCD938X_BASE_ADDRESS + 0x041F) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A5_0 (WCD938X_BASE_ADDRESS + 0x0420) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A5_1 (WCD938X_BASE_ADDRESS + 0x0421) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A6_0 (WCD938X_BASE_ADDRESS + 0x0422) -#define WCD938X_DIGITAL_CDC_HPH_DSM_A7_0 (WCD938X_BASE_ADDRESS + 0x0423) -#define WCD938X_DIGITAL_CDC_HPH_DSM_C_0 (WCD938X_BASE_ADDRESS + 0x0424) -#define WCD938X_DIGITAL_CDC_HPH_DSM_C_1 (WCD938X_BASE_ADDRESS + 0x0425) -#define WCD938X_DIGITAL_CDC_HPH_DSM_C_2 (WCD938X_BASE_ADDRESS + 0x0426) -#define WCD938X_DIGITAL_CDC_HPH_DSM_C_3 (WCD938X_BASE_ADDRESS + 0x0427) -#define WCD938X_DIGITAL_CDC_HPH_DSM_R1 (WCD938X_BASE_ADDRESS + 0x0428) -#define WCD938X_DIGITAL_CDC_HPH_DSM_R2 (WCD938X_BASE_ADDRESS + 0x0429) -#define WCD938X_DIGITAL_CDC_HPH_DSM_R3 (WCD938X_BASE_ADDRESS + 0x042A) -#define WCD938X_DIGITAL_CDC_HPH_DSM_R4 (WCD938X_BASE_ADDRESS + 0x042B) -#define WCD938X_DIGITAL_CDC_HPH_DSM_R5 (WCD938X_BASE_ADDRESS + 0x042C) -#define WCD938X_DIGITAL_CDC_HPH_DSM_R6 (WCD938X_BASE_ADDRESS + 0x042D) -#define WCD938X_DIGITAL_CDC_HPH_DSM_R7 (WCD938X_BASE_ADDRESS + 0x042E) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A1_0 (WCD938X_BASE_ADDRESS + 0x042F) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A1_1 (WCD938X_BASE_ADDRESS + 0x0430) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A2_0 (WCD938X_BASE_ADDRESS + 0x0431) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A2_1 (WCD938X_BASE_ADDRESS + 0x0432) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A3_0 (WCD938X_BASE_ADDRESS + 0x0433) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A3_1 (WCD938X_BASE_ADDRESS + 0x0434) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A4_0 (WCD938X_BASE_ADDRESS + 0x0435) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A4_1 (WCD938X_BASE_ADDRESS + 0x0436) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A5_0 (WCD938X_BASE_ADDRESS + 0x0437) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A5_1 (WCD938X_BASE_ADDRESS + 0x0438) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A6_0 (WCD938X_BASE_ADDRESS + 0x0439) -#define WCD938X_DIGITAL_CDC_AUX_DSM_A7_0 (WCD938X_BASE_ADDRESS + 0x043A) -#define WCD938X_DIGITAL_CDC_AUX_DSM_C_0 (WCD938X_BASE_ADDRESS + 0x043B) -#define WCD938X_DIGITAL_CDC_AUX_DSM_C_1 (WCD938X_BASE_ADDRESS + 0x043C) -#define WCD938X_DIGITAL_CDC_AUX_DSM_C_2 (WCD938X_BASE_ADDRESS + 0x043D) -#define WCD938X_DIGITAL_CDC_AUX_DSM_C_3 (WCD938X_BASE_ADDRESS + 0x043E) -#define WCD938X_DIGITAL_CDC_AUX_DSM_R1 (WCD938X_BASE_ADDRESS + 0x043F) -#define WCD938X_DIGITAL_CDC_AUX_DSM_R2 (WCD938X_BASE_ADDRESS + 0x0440) -#define WCD938X_DIGITAL_CDC_AUX_DSM_R3 (WCD938X_BASE_ADDRESS + 0x0441) -#define WCD938X_DIGITAL_CDC_AUX_DSM_R4 (WCD938X_BASE_ADDRESS + 0x0442) -#define WCD938X_DIGITAL_CDC_AUX_DSM_R5 (WCD938X_BASE_ADDRESS + 0x0443) -#define WCD938X_DIGITAL_CDC_AUX_DSM_R6 (WCD938X_BASE_ADDRESS + 0x0444) -#define WCD938X_DIGITAL_CDC_AUX_DSM_R7 (WCD938X_BASE_ADDRESS + 0x0445) -#define WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0 (WCD938X_BASE_ADDRESS + 0x0446) -#define WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1 (WCD938X_BASE_ADDRESS + 0x0447) -#define WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0 (WCD938X_BASE_ADDRESS + 0x0448) -#define WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1 (WCD938X_BASE_ADDRESS + 0x0449) -#define WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2 (WCD938X_BASE_ADDRESS + 0x044A) -#define WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0 (WCD938X_BASE_ADDRESS + 0x044B) -#define WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1 (WCD938X_BASE_ADDRESS + 0x044C) -#define WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2 (WCD938X_BASE_ADDRESS + 0x044D) -#define WCD938X_DIGITAL_CDC_HPH_GAIN_CTL (WCD938X_BASE_ADDRESS + 0x044E) -#define WCD938X_DIGITAL_CDC_AUX_GAIN_CTL (WCD938X_BASE_ADDRESS + 0x044F) -#define WCD938X_DIGITAL_CDC_EAR_PATH_CTL (WCD938X_BASE_ADDRESS + 0x0450) -#define WCD938X_DIGITAL_CDC_SWR_CLH (WCD938X_BASE_ADDRESS + 0x0451) -#define WCD938X_DIGITAL_SWR_CLH_BYP (WCD938X_BASE_ADDRESS + 0x0452) -#define WCD938X_DIGITAL_CDC_TX0_CTL (WCD938X_BASE_ADDRESS + 0x0453) -#define WCD938X_DIGITAL_CDC_TX1_CTL (WCD938X_BASE_ADDRESS + 0x0454) -#define WCD938X_DIGITAL_CDC_TX2_CTL (WCD938X_BASE_ADDRESS + 0x0455) -#define WCD938X_DIGITAL_CDC_TX_RST (WCD938X_BASE_ADDRESS + 0x0456) -#define WCD938X_DIGITAL_CDC_REQ_CTL (WCD938X_BASE_ADDRESS + 0x0457) -#define WCD938X_DIGITAL_CDC_RST (WCD938X_BASE_ADDRESS + 0x0458) -#define WCD938X_DIGITAL_CDC_AMIC_CTL (WCD938X_BASE_ADDRESS + 0x045A) -#define WCD938X_DIGITAL_CDC_DMIC_CTL (WCD938X_BASE_ADDRESS + 0x045B) -#define WCD938X_DIGITAL_CDC_DMIC1_CTL (WCD938X_BASE_ADDRESS + 0x045C) -#define WCD938X_DIGITAL_CDC_DMIC2_CTL (WCD938X_BASE_ADDRESS + 0x045D) -#define WCD938X_DIGITAL_CDC_DMIC3_CTL (WCD938X_BASE_ADDRESS + 0x045E) -#define WCD938X_DIGITAL_CDC_DMIC4_CTL (WCD938X_BASE_ADDRESS + 0x045F) -#define WCD938X_DIGITAL_EFUSE_PRG_CTL (WCD938X_BASE_ADDRESS + 0x0460) -#define WCD938X_DIGITAL_EFUSE_CTL (WCD938X_BASE_ADDRESS + 0x0461) -#define WCD938X_DIGITAL_CDC_DMIC_RATE_1_2 (WCD938X_BASE_ADDRESS + 0x0462) -#define WCD938X_DIGITAL_CDC_DMIC_RATE_3_4 (WCD938X_BASE_ADDRESS + 0x0463) -#define WCD938X_DIGITAL_PDM_WD_CTL0 (WCD938X_BASE_ADDRESS + 0x0465) -#define WCD938X_DIGITAL_PDM_WD_CTL1 (WCD938X_BASE_ADDRESS + 0x0466) -#define WCD938X_DIGITAL_PDM_WD_CTL2 (WCD938X_BASE_ADDRESS + 0x0467) -#define WCD938X_DIGITAL_INTR_MODE (WCD938X_BASE_ADDRESS + 0x046A) -#define WCD938X_DIGITAL_INTR_MASK_0 (WCD938X_BASE_ADDRESS + 0x046B) -#define WCD938X_DIGITAL_INTR_MASK_1 (WCD938X_BASE_ADDRESS + 0x046C) -#define WCD938X_DIGITAL_INTR_MASK_2 (WCD938X_BASE_ADDRESS + 0x046D) -#define WCD938X_DIGITAL_INTR_STATUS_0 (WCD938X_BASE_ADDRESS + 0x046E) -#define WCD938X_DIGITAL_INTR_STATUS_1 (WCD938X_BASE_ADDRESS + 0x046F) -#define WCD938X_DIGITAL_INTR_STATUS_2 (WCD938X_BASE_ADDRESS + 0x0470) -#define WCD938X_DIGITAL_INTR_CLEAR_0 (WCD938X_BASE_ADDRESS + 0x0471) -#define WCD938X_DIGITAL_INTR_CLEAR_1 (WCD938X_BASE_ADDRESS + 0x0472) -#define WCD938X_DIGITAL_INTR_CLEAR_2 (WCD938X_BASE_ADDRESS + 0x0473) -#define WCD938X_DIGITAL_INTR_LEVEL_0 (WCD938X_BASE_ADDRESS + 0x0474) -#define WCD938X_DIGITAL_INTR_LEVEL_1 (WCD938X_BASE_ADDRESS + 0x0475) -#define WCD938X_DIGITAL_INTR_LEVEL_2 (WCD938X_BASE_ADDRESS + 0x0476) -#define WCD938X_DIGITAL_INTR_SET_0 (WCD938X_BASE_ADDRESS + 0x0477) -#define WCD938X_DIGITAL_INTR_SET_1 (WCD938X_BASE_ADDRESS + 0x0478) -#define WCD938X_DIGITAL_INTR_SET_2 (WCD938X_BASE_ADDRESS + 0x0479) -#define WCD938X_DIGITAL_INTR_TEST_0 (WCD938X_BASE_ADDRESS + 0x047A) -#define WCD938X_DIGITAL_INTR_TEST_1 (WCD938X_BASE_ADDRESS + 0x047B) -#define WCD938X_DIGITAL_INTR_TEST_2 (WCD938X_BASE_ADDRESS + 0x047C) -#define WCD938X_DIGITAL_TX_MODE_DBG_EN (WCD938X_BASE_ADDRESS + 0x047F) -#define WCD938X_DIGITAL_TX_MODE_DBG_0_1 (WCD938X_BASE_ADDRESS + 0x0480) -#define WCD938X_DIGITAL_TX_MODE_DBG_2_3 (WCD938X_BASE_ADDRESS + 0x0481) -#define WCD938X_DIGITAL_LB_IN_SEL_CTL (WCD938X_BASE_ADDRESS + 0x0482) -#define WCD938X_DIGITAL_LOOP_BACK_MODE (WCD938X_BASE_ADDRESS + 0x0483) -#define WCD938X_DIGITAL_SWR_DAC_TEST (WCD938X_BASE_ADDRESS + 0x0484) -#define WCD938X_DIGITAL_SWR_HM_TEST_RX_0 (WCD938X_BASE_ADDRESS + 0x0485) -#define WCD938X_DIGITAL_SWR_HM_TEST_TX_0 (WCD938X_BASE_ADDRESS + 0x0486) -#define WCD938X_DIGITAL_SWR_HM_TEST_RX_1 (WCD938X_BASE_ADDRESS + 0x0487) -#define WCD938X_DIGITAL_SWR_HM_TEST_TX_1 (WCD938X_BASE_ADDRESS + 0x0488) -#define WCD938X_DIGITAL_SWR_HM_TEST_TX_2 (WCD938X_BASE_ADDRESS + 0x0489) -#define WCD938X_DIGITAL_SWR_HM_TEST_0 (WCD938X_BASE_ADDRESS + 0x048A) -#define WCD938X_DIGITAL_SWR_HM_TEST_1 (WCD938X_BASE_ADDRESS + 0x048B) -#define WCD938X_DIGITAL_PAD_CTL_SWR_0 (WCD938X_BASE_ADDRESS + 0x048C) -#define WCD938X_DIGITAL_PAD_CTL_SWR_1 (WCD938X_BASE_ADDRESS + 0x048D) -#define WCD938X_DIGITAL_I2C_CTL (WCD938X_BASE_ADDRESS + 0x048E) -#define WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE (WCD938X_BASE_ADDRESS + 0x048F) -#define WCD938X_DIGITAL_EFUSE_TEST_CTL_0 (WCD938X_BASE_ADDRESS + 0x0490) -#define WCD938X_DIGITAL_EFUSE_TEST_CTL_1 (WCD938X_BASE_ADDRESS + 0x0491) -#define WCD938X_DIGITAL_EFUSE_T_DATA_0 (WCD938X_BASE_ADDRESS + 0x0492) -#define WCD938X_DIGITAL_EFUSE_T_DATA_1 (WCD938X_BASE_ADDRESS + 0x0493) -#define WCD938X_DIGITAL_PAD_CTL_PDM_RX0 (WCD938X_BASE_ADDRESS + 0x0494) -#define WCD938X_DIGITAL_PAD_CTL_PDM_RX1 (WCD938X_BASE_ADDRESS + 0x0495) -#define WCD938X_DIGITAL_PAD_CTL_PDM_TX0 (WCD938X_BASE_ADDRESS + 0x0496) -#define WCD938X_DIGITAL_PAD_CTL_PDM_TX1 (WCD938X_BASE_ADDRESS + 0x0497) -#define WCD938X_DIGITAL_PAD_CTL_PDM_TX2 (WCD938X_BASE_ADDRESS + 0x0498) -#define WCD938X_DIGITAL_PAD_INP_DIS_0 (WCD938X_BASE_ADDRESS + 0x0499) -#define WCD938X_DIGITAL_PAD_INP_DIS_1 (WCD938X_BASE_ADDRESS + 0x049A) -#define WCD938X_DIGITAL_DRIVE_STRENGTH_0 (WCD938X_BASE_ADDRESS + 0x049B) -#define WCD938X_DIGITAL_DRIVE_STRENGTH_1 (WCD938X_BASE_ADDRESS + 0x049C) -#define WCD938X_DIGITAL_DRIVE_STRENGTH_2 (WCD938X_BASE_ADDRESS + 0x049D) -#define WCD938X_DIGITAL_RX_DATA_EDGE_CTL (WCD938X_BASE_ADDRESS + 0x049E) -#define WCD938X_DIGITAL_TX_DATA_EDGE_CTL (WCD938X_BASE_ADDRESS + 0x049F) -#define WCD938X_DIGITAL_GPIO_MODE (WCD938X_BASE_ADDRESS + 0x04A0) -#define WCD938X_DIGITAL_PIN_CTL_OE (WCD938X_BASE_ADDRESS + 0x04A1) -#define WCD938X_DIGITAL_PIN_CTL_DATA_0 (WCD938X_BASE_ADDRESS + 0x04A2) -#define WCD938X_DIGITAL_PIN_CTL_DATA_1 (WCD938X_BASE_ADDRESS + 0x04A3) -#define WCD938X_DIGITAL_PIN_STATUS_0 (WCD938X_BASE_ADDRESS + 0x04A4) -#define WCD938X_DIGITAL_PIN_STATUS_1 (WCD938X_BASE_ADDRESS + 0x04A5) -#define WCD938X_DIGITAL_DIG_DEBUG_CTL (WCD938X_BASE_ADDRESS + 0x04A6) -#define WCD938X_DIGITAL_DIG_DEBUG_EN (WCD938X_BASE_ADDRESS + 0x04A7) -#define WCD938X_DIGITAL_ANA_CSR_DBG_ADD (WCD938X_BASE_ADDRESS + 0x04A8) -#define WCD938X_DIGITAL_ANA_CSR_DBG_CTL (WCD938X_BASE_ADDRESS + 0x04A9) -#define WCD938X_DIGITAL_SSP_DBG (WCD938X_BASE_ADDRESS + 0x04AA) -#define WCD938X_DIGITAL_MODE_STATUS_0 (WCD938X_BASE_ADDRESS + 0x04AB) -#define WCD938X_DIGITAL_MODE_STATUS_1 (WCD938X_BASE_ADDRESS + 0x04AC) -#define WCD938X_DIGITAL_SPARE_0 (WCD938X_BASE_ADDRESS + 0x04AD) -#define WCD938X_DIGITAL_SPARE_1 (WCD938X_BASE_ADDRESS + 0x04AE) -#define WCD938X_DIGITAL_SPARE_2 (WCD938X_BASE_ADDRESS + 0x04AF) -#define WCD938X_DIGITAL_EFUSE_REG_0 (WCD938X_BASE_ADDRESS + 0x04B0) -#define WCD938X_DIGITAL_EFUSE_REG_1 (WCD938X_BASE_ADDRESS + 0x04B1) -#define WCD938X_DIGITAL_EFUSE_REG_2 (WCD938X_BASE_ADDRESS + 0x04B2) -#define WCD938X_DIGITAL_EFUSE_REG_3 (WCD938X_BASE_ADDRESS + 0x04B3) -#define WCD938X_DIGITAL_EFUSE_REG_4 (WCD938X_BASE_ADDRESS + 0x04B4) -#define WCD938X_DIGITAL_EFUSE_REG_5 (WCD938X_BASE_ADDRESS + 0x04B5) -#define WCD938X_DIGITAL_EFUSE_REG_6 (WCD938X_BASE_ADDRESS + 0x04B6) -#define WCD938X_DIGITAL_EFUSE_REG_7 (WCD938X_BASE_ADDRESS + 0x04B7) -#define WCD938X_DIGITAL_EFUSE_REG_8 (WCD938X_BASE_ADDRESS + 0x04B8) -#define WCD938X_DIGITAL_EFUSE_REG_9 (WCD938X_BASE_ADDRESS + 0x04B9) -#define WCD938X_DIGITAL_EFUSE_REG_10 (WCD938X_BASE_ADDRESS + 0x04BA) -#define WCD938X_DIGITAL_EFUSE_REG_11 (WCD938X_BASE_ADDRESS + 0x04BB) -#define WCD938X_DIGITAL_EFUSE_REG_12 (WCD938X_BASE_ADDRESS + 0x04BC) -#define WCD938X_DIGITAL_EFUSE_REG_13 (WCD938X_BASE_ADDRESS + 0x04BD) -#define WCD938X_DIGITAL_EFUSE_REG_14 (WCD938X_BASE_ADDRESS + 0x04BE) -#define WCD938X_DIGITAL_EFUSE_REG_15 (WCD938X_BASE_ADDRESS + 0x04BF) -#define WCD938X_DIGITAL_EFUSE_REG_16 (WCD938X_BASE_ADDRESS + 0x04C0) -#define WCD938X_DIGITAL_EFUSE_REG_17 (WCD938X_BASE_ADDRESS + 0x04C1) -#define WCD938X_DIGITAL_EFUSE_REG_18 (WCD938X_BASE_ADDRESS + 0x04C2) -#define WCD938X_DIGITAL_EFUSE_REG_19 (WCD938X_BASE_ADDRESS + 0x04C3) -#define WCD938X_DIGITAL_EFUSE_REG_20 (WCD938X_BASE_ADDRESS + 0x04C4) -#define WCD938X_DIGITAL_EFUSE_REG_21 (WCD938X_BASE_ADDRESS + 0x04C5) -#define WCD938X_DIGITAL_EFUSE_REG_22 (WCD938X_BASE_ADDRESS + 0x04C6) -#define WCD938X_DIGITAL_EFUSE_REG_23 (WCD938X_BASE_ADDRESS + 0x04C7) -#define WCD938X_DIGITAL_EFUSE_REG_24 (WCD938X_BASE_ADDRESS + 0x04C8) -#define WCD938X_DIGITAL_EFUSE_REG_25 (WCD938X_BASE_ADDRESS + 0x04C9) -#define WCD938X_DIGITAL_EFUSE_REG_26 (WCD938X_BASE_ADDRESS + 0x04CA) -#define WCD938X_DIGITAL_EFUSE_REG_27 (WCD938X_BASE_ADDRESS + 0x04CB) -#define WCD938X_DIGITAL_EFUSE_REG_28 (WCD938X_BASE_ADDRESS + 0x04CC) -#define WCD938X_DIGITAL_EFUSE_REG_29 (WCD938X_BASE_ADDRESS + 0x04CD) -#define WCD938X_DIGITAL_EFUSE_REG_30 (WCD938X_BASE_ADDRESS + 0x04CE) -#define WCD938X_DIGITAL_EFUSE_REG_31 (WCD938X_BASE_ADDRESS + 0x04CF) -#define WCD938X_DIGITAL_TX_REQ_FB_CTL_0 (WCD938X_BASE_ADDRESS + 0x04D0) -#define WCD938X_DIGITAL_TX_REQ_FB_CTL_1 (WCD938X_BASE_ADDRESS + 0x04D1) -#define WCD938X_DIGITAL_TX_REQ_FB_CTL_2 (WCD938X_BASE_ADDRESS + 0x04D2) -#define WCD938X_DIGITAL_TX_REQ_FB_CTL_3 (WCD938X_BASE_ADDRESS + 0x04D3) -#define WCD938X_DIGITAL_TX_REQ_FB_CTL_4 (WCD938X_BASE_ADDRESS + 0x04D4) -#define WCD938X_DIGITAL_DEM_BYPASS_DATA0 (WCD938X_BASE_ADDRESS + 0x04D5) -#define WCD938X_DIGITAL_DEM_BYPASS_DATA1 (WCD938X_BASE_ADDRESS + 0x04D6) -#define WCD938X_DIGITAL_DEM_BYPASS_DATA2 (WCD938X_BASE_ADDRESS + 0x04D7) -#define WCD938X_DIGITAL_DEM_BYPASS_DATA3 (WCD938X_BASE_ADDRESS + 0x04D8) - -#define WCD938X_REGISTERS_MAX_SIZE (WCD938X_DIGITAL_DEM_BYPASS_DATA3 + 1) -#define WCD938X_MAX_REGISTER (WCD938X_REGISTERS_MAX_SIZE - 1) - -#endif /*_WCD938X_REGISTERS_H*/ diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-regmap.c b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-regmap.c deleted file mode 100644 index 6f59258331a0..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-regmap.c +++ /dev/null @@ -1,515 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "wcd938x-registers.h" - -extern const u8 wcd938x_reg_access[WCD938X_REGISTERS_MAX_SIZE]; - -static const struct reg_default wcd938x_defaults[] = { - {WCD938X_ANA_PAGE_REGISTER, 0x00}, - {WCD938X_ANA_BIAS, 0x00}, - {WCD938X_ANA_RX_SUPPLIES, 0x00}, - {WCD938X_ANA_HPH, 0x0C}, - {WCD938X_ANA_EAR, 0x00}, - {WCD938X_ANA_EAR_COMPANDER_CTL, 0x02}, - {WCD938X_ANA_TX_CH1, 0x20}, - {WCD938X_ANA_TX_CH2, 0x00}, - {WCD938X_ANA_TX_CH3, 0x20}, - {WCD938X_ANA_TX_CH4, 0x00}, - {WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC, 0x00}, - {WCD938X_ANA_MICB3_DSP_EN_LOGIC, 0x00}, - {WCD938X_ANA_MBHC_MECH, 0x39}, - {WCD938X_ANA_MBHC_ELECT, 0x08}, - {WCD938X_ANA_MBHC_ZDET, 0x00}, - {WCD938X_ANA_MBHC_RESULT_1, 0x00}, - {WCD938X_ANA_MBHC_RESULT_2, 0x00}, - {WCD938X_ANA_MBHC_RESULT_3, 0x00}, - {WCD938X_ANA_MBHC_BTN0, 0x00}, - {WCD938X_ANA_MBHC_BTN1, 0x10}, - {WCD938X_ANA_MBHC_BTN2, 0x20}, - {WCD938X_ANA_MBHC_BTN3, 0x30}, - {WCD938X_ANA_MBHC_BTN4, 0x40}, - {WCD938X_ANA_MBHC_BTN5, 0x50}, - {WCD938X_ANA_MBHC_BTN6, 0x60}, - {WCD938X_ANA_MBHC_BTN7, 0x70}, - {WCD938X_ANA_MICB1, 0x10}, - {WCD938X_ANA_MICB2, 0x10}, - {WCD938X_ANA_MICB2_RAMP, 0x00}, - {WCD938X_ANA_MICB3, 0x10}, - {WCD938X_ANA_MICB4, 0x10}, - {WCD938X_BIAS_CTL, 0x2A}, - {WCD938X_BIAS_VBG_FINE_ADJ, 0x55}, - {WCD938X_LDOL_VDDCX_ADJUST, 0x01}, - {WCD938X_LDOL_DISABLE_LDOL, 0x00}, - {WCD938X_MBHC_CTL_CLK, 0x00}, - {WCD938X_MBHC_CTL_ANA, 0x00}, - {WCD938X_MBHC_CTL_SPARE_1, 0x00}, - {WCD938X_MBHC_CTL_SPARE_2, 0x00}, - {WCD938X_MBHC_CTL_BCS, 0x00}, - {WCD938X_MBHC_MOISTURE_DET_FSM_STATUS, 0x00}, - {WCD938X_MBHC_TEST_CTL, 0x00}, - {WCD938X_LDOH_MODE, 0x2B}, - {WCD938X_LDOH_BIAS, 0x68}, - {WCD938X_LDOH_STB_LOADS, 0x00}, - {WCD938X_LDOH_SLOWRAMP, 0x50}, - {WCD938X_MICB1_TEST_CTL_1, 0x1A}, - {WCD938X_MICB1_TEST_CTL_2, 0x00}, - {WCD938X_MICB1_TEST_CTL_3, 0xA4}, - {WCD938X_MICB2_TEST_CTL_1, 0x1A}, - {WCD938X_MICB2_TEST_CTL_2, 0x00}, - {WCD938X_MICB2_TEST_CTL_3, 0x24}, - {WCD938X_MICB3_TEST_CTL_1, 0x1A}, - {WCD938X_MICB3_TEST_CTL_2, 0x00}, - {WCD938X_MICB3_TEST_CTL_3, 0xA4}, - {WCD938X_MICB4_TEST_CTL_1, 0x1A}, - {WCD938X_MICB4_TEST_CTL_2, 0x00}, - {WCD938X_MICB4_TEST_CTL_3, 0xA4}, - {WCD938X_TX_COM_ADC_VCM, 0x39}, - {WCD938X_TX_COM_BIAS_ATEST, 0xE0}, - {WCD938X_TX_COM_SPARE1, 0x00}, - {WCD938X_TX_COM_SPARE2, 0x00}, - {WCD938X_TX_COM_TXFE_DIV_CTL, 0x22}, - {WCD938X_TX_COM_TXFE_DIV_START, 0x00}, - {WCD938X_TX_COM_SPARE3, 0x00}, - {WCD938X_TX_COM_SPARE4, 0x00}, - {WCD938X_TX_1_2_TEST_EN, 0xCC}, - {WCD938X_TX_1_2_ADC_IB, 0xE9}, - {WCD938X_TX_1_2_ATEST_REFCTL, 0x0A}, - {WCD938X_TX_1_2_TEST_CTL, 0x38}, - {WCD938X_TX_1_2_TEST_BLK_EN1, 0xFF}, - {WCD938X_TX_1_2_TXFE1_CLKDIV, 0x00}, - {WCD938X_TX_1_2_SAR2_ERR, 0x00}, - {WCD938X_TX_1_2_SAR1_ERR, 0x00}, - {WCD938X_TX_3_4_TEST_EN, 0xCC}, - {WCD938X_TX_3_4_ADC_IB, 0xE9}, - {WCD938X_TX_3_4_ATEST_REFCTL, 0x0A}, - {WCD938X_TX_3_4_TEST_CTL, 0x38}, - {WCD938X_TX_3_4_TEST_BLK_EN3, 0xFF}, - {WCD938X_TX_3_4_TXFE3_CLKDIV, 0x00}, - {WCD938X_TX_3_4_SAR4_ERR, 0x00}, - {WCD938X_TX_3_4_SAR3_ERR, 0x00}, - {WCD938X_TX_3_4_TEST_BLK_EN2, 0xFB}, - {WCD938X_TX_3_4_TXFE2_CLKDIV, 0x00}, - {WCD938X_TX_3_4_SPARE1, 0x00}, - {WCD938X_TX_3_4_TEST_BLK_EN4, 0xFB}, - {WCD938X_TX_3_4_TXFE4_CLKDIV, 0x00}, - {WCD938X_TX_3_4_SPARE2, 0x00}, - {WCD938X_CLASSH_MODE_1, 0x40}, - {WCD938X_CLASSH_MODE_2, 0x3A}, - {WCD938X_CLASSH_MODE_3, 0x00}, - {WCD938X_CLASSH_CTRL_VCL_1, 0x70}, - {WCD938X_CLASSH_CTRL_VCL_2, 0x82}, - {WCD938X_CLASSH_CTRL_CCL_1, 0x31}, - {WCD938X_CLASSH_CTRL_CCL_2, 0x80}, - {WCD938X_CLASSH_CTRL_CCL_3, 0x80}, - {WCD938X_CLASSH_CTRL_CCL_4, 0x51}, - {WCD938X_CLASSH_CTRL_CCL_5, 0x00}, - {WCD938X_CLASSH_BUCK_TMUX_A_D, 0x00}, - {WCD938X_CLASSH_BUCK_SW_DRV_CNTL, 0x77}, - {WCD938X_CLASSH_SPARE, 0x00}, - {WCD938X_FLYBACK_EN, 0x4E}, - {WCD938X_FLYBACK_VNEG_CTRL_1, 0x0B}, - {WCD938X_FLYBACK_VNEG_CTRL_2, 0x45}, - {WCD938X_FLYBACK_VNEG_CTRL_3, 0x74}, - {WCD938X_FLYBACK_VNEG_CTRL_4, 0x7F}, - {WCD938X_FLYBACK_VNEG_CTRL_5, 0x83}, - {WCD938X_FLYBACK_VNEG_CTRL_6, 0x98}, - {WCD938X_FLYBACK_VNEG_CTRL_7, 0xA9}, - {WCD938X_FLYBACK_VNEG_CTRL_8, 0x68}, - {WCD938X_FLYBACK_VNEG_CTRL_9, 0x64}, - {WCD938X_FLYBACK_VNEGDAC_CTRL_1, 0xED}, - {WCD938X_FLYBACK_VNEGDAC_CTRL_2, 0xF0}, - {WCD938X_FLYBACK_VNEGDAC_CTRL_3, 0xA6}, - {WCD938X_FLYBACK_CTRL_1, 0x65}, - {WCD938X_FLYBACK_TEST_CTL, 0x00}, - {WCD938X_RX_AUX_SW_CTL, 0x00}, - {WCD938X_RX_PA_AUX_IN_CONN, 0x01}, - {WCD938X_RX_TIMER_DIV, 0x32}, - {WCD938X_RX_OCP_CTL, 0x1F}, - {WCD938X_RX_OCP_COUNT, 0x77}, - {WCD938X_RX_BIAS_EAR_DAC, 0xA0}, - {WCD938X_RX_BIAS_EAR_AMP, 0xAA}, - {WCD938X_RX_BIAS_HPH_LDO, 0xA9}, - {WCD938X_RX_BIAS_HPH_PA, 0xAA}, - {WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A}, - {WCD938X_RX_BIAS_HPH_RDAC_LDO, 0x88}, - {WCD938X_RX_BIAS_HPH_CNP1, 0x82}, - {WCD938X_RX_BIAS_HPH_LOWPOWER, 0x82}, - {WCD938X_RX_BIAS_AUX_DAC, 0xA0}, - {WCD938X_RX_BIAS_AUX_AMP, 0xAA}, - {WCD938X_RX_BIAS_VNEGDAC_BLEEDER, 0x50}, - {WCD938X_RX_BIAS_MISC, 0x00}, - {WCD938X_RX_BIAS_BUCK_RST, 0x08}, - {WCD938X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44}, - {WCD938X_RX_BIAS_FLYB_ERRAMP, 0x40}, - {WCD938X_RX_BIAS_FLYB_BUFF, 0xAA}, - {WCD938X_RX_BIAS_FLYB_MID_RST, 0x14}, - {WCD938X_HPH_L_STATUS, 0x04}, - {WCD938X_HPH_R_STATUS, 0x04}, - {WCD938X_HPH_CNP_EN, 0x80}, - {WCD938X_HPH_CNP_WG_CTL, 0x9A}, - {WCD938X_HPH_CNP_WG_TIME, 0x14}, - {WCD938X_HPH_OCP_CTL, 0x28}, - {WCD938X_HPH_AUTO_CHOP, 0x16}, - {WCD938X_HPH_CHOP_CTL, 0x83}, - {WCD938X_HPH_PA_CTL1, 0x46}, - {WCD938X_HPH_PA_CTL2, 0x50}, - {WCD938X_HPH_L_EN, 0x80}, - {WCD938X_HPH_L_TEST, 0xE0}, - {WCD938X_HPH_L_ATEST, 0x50}, - {WCD938X_HPH_R_EN, 0x80}, - {WCD938X_HPH_R_TEST, 0xE0}, - {WCD938X_HPH_R_ATEST, 0x54}, - {WCD938X_HPH_RDAC_CLK_CTL1, 0x99}, - {WCD938X_HPH_RDAC_CLK_CTL2, 0x9B}, - {WCD938X_HPH_RDAC_LDO_CTL, 0x33}, - {WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00}, - {WCD938X_HPH_REFBUFF_UHQA_CTL, 0x68}, - {WCD938X_HPH_REFBUFF_LP_CTL, 0x0E}, - {WCD938X_HPH_L_DAC_CTL, 0x20}, - {WCD938X_HPH_R_DAC_CTL, 0x20}, - {WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL, 0x55}, - {WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0x19}, - {WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1, 0xA0}, - {WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS, 0x00}, - {WCD938X_EAR_EAR_EN_REG, 0x22}, - {WCD938X_EAR_EAR_PA_CON, 0x44}, - {WCD938X_EAR_EAR_SP_CON, 0xDB}, - {WCD938X_EAR_EAR_DAC_CON, 0x80}, - {WCD938X_EAR_EAR_CNP_FSM_CON, 0xB2}, - {WCD938X_EAR_TEST_CTL, 0x00}, - {WCD938X_EAR_STATUS_REG_1, 0x00}, - {WCD938X_EAR_STATUS_REG_2, 0x08}, - {WCD938X_ANA_NEW_PAGE_REGISTER, 0x00}, - {WCD938X_HPH_NEW_ANA_HPH2, 0x00}, - {WCD938X_HPH_NEW_ANA_HPH3, 0x00}, - {WCD938X_SLEEP_CTL, 0x16}, - {WCD938X_SLEEP_WATCHDOG_CTL, 0x00}, - {WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00}, - {WCD938X_MBHC_NEW_CTL_1, 0x02}, - {WCD938X_MBHC_NEW_CTL_2, 0x05}, - {WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0xE9}, - {WCD938X_MBHC_NEW_ZDET_ANA_CTL, 0x0F}, - {WCD938X_MBHC_NEW_ZDET_RAMP_CTL, 0x00}, - {WCD938X_MBHC_NEW_FSM_STATUS, 0x00}, - {WCD938X_MBHC_NEW_ADC_RESULT, 0x00}, - {WCD938X_TX_NEW_AMIC_MUX_CFG, 0x00}, - {WCD938X_AUX_AUXPA, 0x00}, - {WCD938X_LDORXTX_MODE, 0x0C}, - {WCD938X_LDORXTX_CONFIG, 0x10}, - {WCD938X_DIE_CRACK_DIE_CRK_DET_EN, 0x00}, - {WCD938X_DIE_CRACK_DIE_CRK_DET_OUT, 0x00}, - {WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40}, - {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81}, - {WCD938X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10}, - {WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00}, - {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81}, - {WCD938X_HPH_NEW_INT_PA_MISC1, 0x22}, - {WCD938X_HPH_NEW_INT_PA_MISC2, 0x00}, - {WCD938X_HPH_NEW_INT_PA_RDAC_MISC, 0x00}, - {WCD938X_HPH_NEW_INT_HPH_TIMER1, 0xFE}, - {WCD938X_HPH_NEW_INT_HPH_TIMER2, 0x02}, - {WCD938X_HPH_NEW_INT_HPH_TIMER3, 0x4E}, - {WCD938X_HPH_NEW_INT_HPH_TIMER4, 0x54}, - {WCD938X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00}, - {WCD938X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00}, - {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, 0x90}, - {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, 0x90}, - {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62}, - {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01}, - {WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11}, - {WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57}, - {WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01}, - {WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00}, - {WCD938X_MBHC_NEW_INT_SPARE_2, 0x00}, - {WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON, 0xA8}, - {WCD938X_EAR_INT_NEW_CNP_VCM_CON1, 0x42}, - {WCD938X_EAR_INT_NEW_CNP_VCM_CON2, 0x22}, - {WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS, 0x00}, - {WCD938X_AUX_INT_EN_REG, 0x00}, - {WCD938X_AUX_INT_PA_CTRL, 0x06}, - {WCD938X_AUX_INT_SP_CTRL, 0xD2}, - {WCD938X_AUX_INT_DAC_CTRL, 0x80}, - {WCD938X_AUX_INT_CLK_CTRL, 0x50}, - {WCD938X_AUX_INT_TEST_CTRL, 0x00}, - {WCD938X_AUX_INT_STATUS_REG, 0x00}, - {WCD938X_AUX_INT_MISC, 0x00}, - {WCD938X_LDORXTX_INT_BIAS, 0x6E}, - {WCD938X_LDORXTX_INT_STB_LOADS_DTEST, 0x50}, - {WCD938X_LDORXTX_INT_TEST0, 0x1C}, - {WCD938X_LDORXTX_INT_STARTUP_TIMER, 0xFF}, - {WCD938X_LDORXTX_INT_TEST1, 0x1F}, - {WCD938X_LDORXTX_INT_STATUS, 0x00}, - {WCD938X_SLEEP_INT_WATCHDOG_CTL_1, 0x0A}, - {WCD938X_SLEEP_INT_WATCHDOG_CTL_2, 0x0A}, - {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1, 0x02}, - {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2, 0x60}, - {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2, 0xFF}, - {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1, 0x7F}, - {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0, 0x3F}, - {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M, 0x1F}, - {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M, 0x0F}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1, 0xD7}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0, 0xC8}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP, 0xC6}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1, 0xD5}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0, 0xCA}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, 0x05}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0, 0xA5}, - {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, 0x13}, - {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1, 0x88}, - {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP, 0x42}, - {WCD938X_TX_COM_NEW_INT_TXADC_INT_L2, 0xFF}, - {WCD938X_TX_COM_NEW_INT_TXADC_INT_L1, 0x64}, - {WCD938X_TX_COM_NEW_INT_TXADC_INT_L0, 0x64}, - {WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP, 0x77}, - {WCD938X_DIGITAL_PAGE_REGISTER, 0x00}, - {WCD938X_DIGITAL_CHIP_ID0, 0x00}, - {WCD938X_DIGITAL_CHIP_ID1, 0x00}, - {WCD938X_DIGITAL_CHIP_ID2, 0x0D}, - {WCD938X_DIGITAL_CHIP_ID3, 0x01}, - {WCD938X_DIGITAL_SWR_TX_CLK_RATE, 0x00}, - {WCD938X_DIGITAL_CDC_RST_CTL, 0x03}, - {WCD938X_DIGITAL_TOP_CLK_CFG, 0x00}, - {WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x00}, - {WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0xF0}, - {WCD938X_DIGITAL_SWR_RST_EN, 0x00}, - {WCD938X_DIGITAL_CDC_PATH_MODE, 0x55}, - {WCD938X_DIGITAL_CDC_RX_RST, 0x00}, - {WCD938X_DIGITAL_CDC_RX0_CTL, 0xFC}, - {WCD938X_DIGITAL_CDC_RX1_CTL, 0xFC}, - {WCD938X_DIGITAL_CDC_RX2_CTL, 0xFC}, - {WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0x00}, - {WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0x00}, - {WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x00}, - {WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL, 0x1E}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A1_0, 0x00}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A1_1, 0x01}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A2_0, 0x63}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A2_1, 0x04}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A3_0, 0xAC}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A3_1, 0x04}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A4_0, 0x1A}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A4_1, 0x03}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A5_0, 0xBC}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A5_1, 0x02}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A6_0, 0xC7}, - {WCD938X_DIGITAL_CDC_HPH_DSM_A7_0, 0xF8}, - {WCD938X_DIGITAL_CDC_HPH_DSM_C_0, 0x47}, - {WCD938X_DIGITAL_CDC_HPH_DSM_C_1, 0x43}, - {WCD938X_DIGITAL_CDC_HPH_DSM_C_2, 0xB1}, - {WCD938X_DIGITAL_CDC_HPH_DSM_C_3, 0x17}, - {WCD938X_DIGITAL_CDC_HPH_DSM_R1, 0x4D}, - {WCD938X_DIGITAL_CDC_HPH_DSM_R2, 0x29}, - {WCD938X_DIGITAL_CDC_HPH_DSM_R3, 0x34}, - {WCD938X_DIGITAL_CDC_HPH_DSM_R4, 0x59}, - {WCD938X_DIGITAL_CDC_HPH_DSM_R5, 0x66}, - {WCD938X_DIGITAL_CDC_HPH_DSM_R6, 0x87}, - {WCD938X_DIGITAL_CDC_HPH_DSM_R7, 0x64}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A1_0, 0x00}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A1_1, 0x01}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A2_0, 0x96}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A2_1, 0x09}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A3_0, 0xAB}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A3_1, 0x05}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A4_0, 0x1C}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A4_1, 0x02}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A5_0, 0x17}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A5_1, 0x02}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A6_0, 0xAA}, - {WCD938X_DIGITAL_CDC_AUX_DSM_A7_0, 0xE3}, - {WCD938X_DIGITAL_CDC_AUX_DSM_C_0, 0x69}, - {WCD938X_DIGITAL_CDC_AUX_DSM_C_1, 0x54}, - {WCD938X_DIGITAL_CDC_AUX_DSM_C_2, 0x02}, - {WCD938X_DIGITAL_CDC_AUX_DSM_C_3, 0x15}, - {WCD938X_DIGITAL_CDC_AUX_DSM_R1, 0xA4}, - {WCD938X_DIGITAL_CDC_AUX_DSM_R2, 0xB5}, - {WCD938X_DIGITAL_CDC_AUX_DSM_R3, 0x86}, - {WCD938X_DIGITAL_CDC_AUX_DSM_R4, 0x85}, - {WCD938X_DIGITAL_CDC_AUX_DSM_R5, 0xAA}, - {WCD938X_DIGITAL_CDC_AUX_DSM_R6, 0xE2}, - {WCD938X_DIGITAL_CDC_AUX_DSM_R7, 0x62}, - {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0, 0x55}, - {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1, 0xA9}, - {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0, 0x3D}, - {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1, 0x2E}, - {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2, 0x01}, - {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0, 0x00}, - {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1, 0xFC}, - {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2, 0x01}, - {WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x00}, - {WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 0x00}, - {WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0x00}, - {WCD938X_DIGITAL_CDC_SWR_CLH, 0x00}, - {WCD938X_DIGITAL_SWR_CLH_BYP, 0x00}, - {WCD938X_DIGITAL_CDC_TX0_CTL, 0x68}, - {WCD938X_DIGITAL_CDC_TX1_CTL, 0x68}, - {WCD938X_DIGITAL_CDC_TX2_CTL, 0x68}, - {WCD938X_DIGITAL_CDC_TX_RST, 0x00}, - {WCD938X_DIGITAL_CDC_REQ_CTL, 0x01}, - {WCD938X_DIGITAL_CDC_RST, 0x00}, - {WCD938X_DIGITAL_CDC_AMIC_CTL, 0x0F}, - {WCD938X_DIGITAL_CDC_DMIC_CTL, 0x04}, - {WCD938X_DIGITAL_CDC_DMIC1_CTL, 0x01}, - {WCD938X_DIGITAL_CDC_DMIC2_CTL, 0x01}, - {WCD938X_DIGITAL_CDC_DMIC3_CTL, 0x01}, - {WCD938X_DIGITAL_CDC_DMIC4_CTL, 0x01}, - {WCD938X_DIGITAL_EFUSE_PRG_CTL, 0x00}, - {WCD938X_DIGITAL_EFUSE_CTL, 0x2B}, - {WCD938X_DIGITAL_CDC_DMIC_RATE_1_2, 0x11}, - {WCD938X_DIGITAL_CDC_DMIC_RATE_3_4, 0x11}, - {WCD938X_DIGITAL_PDM_WD_CTL0, 0x00}, - {WCD938X_DIGITAL_PDM_WD_CTL1, 0x00}, - {WCD938X_DIGITAL_PDM_WD_CTL2, 0x00}, - {WCD938X_DIGITAL_INTR_MODE, 0x00}, - {WCD938X_DIGITAL_INTR_MASK_0, 0xFF}, - {WCD938X_DIGITAL_INTR_MASK_1, 0xFF}, - {WCD938X_DIGITAL_INTR_MASK_2, 0x3F}, - {WCD938X_DIGITAL_INTR_STATUS_0, 0x00}, - {WCD938X_DIGITAL_INTR_STATUS_1, 0x00}, - {WCD938X_DIGITAL_INTR_STATUS_2, 0x00}, - {WCD938X_DIGITAL_INTR_CLEAR_0, 0x00}, - {WCD938X_DIGITAL_INTR_CLEAR_1, 0x00}, - {WCD938X_DIGITAL_INTR_CLEAR_2, 0x00}, - {WCD938X_DIGITAL_INTR_LEVEL_0, 0x00}, - {WCD938X_DIGITAL_INTR_LEVEL_1, 0x00}, - {WCD938X_DIGITAL_INTR_LEVEL_2, 0x00}, - {WCD938X_DIGITAL_INTR_SET_0, 0x00}, - {WCD938X_DIGITAL_INTR_SET_1, 0x00}, - {WCD938X_DIGITAL_INTR_SET_2, 0x00}, - {WCD938X_DIGITAL_INTR_TEST_0, 0x00}, - {WCD938X_DIGITAL_INTR_TEST_1, 0x00}, - {WCD938X_DIGITAL_INTR_TEST_2, 0x00}, - {WCD938X_DIGITAL_TX_MODE_DBG_EN, 0x00}, - {WCD938X_DIGITAL_TX_MODE_DBG_0_1, 0x00}, - {WCD938X_DIGITAL_TX_MODE_DBG_2_3, 0x00}, - {WCD938X_DIGITAL_LB_IN_SEL_CTL, 0x00}, - {WCD938X_DIGITAL_LOOP_BACK_MODE, 0x00}, - {WCD938X_DIGITAL_SWR_DAC_TEST, 0x00}, - {WCD938X_DIGITAL_SWR_HM_TEST_RX_0, 0x40}, - {WCD938X_DIGITAL_SWR_HM_TEST_TX_0, 0x40}, - {WCD938X_DIGITAL_SWR_HM_TEST_RX_1, 0x00}, - {WCD938X_DIGITAL_SWR_HM_TEST_TX_1, 0x00}, - {WCD938X_DIGITAL_SWR_HM_TEST_TX_2, 0x00}, - {WCD938X_DIGITAL_SWR_HM_TEST_0, 0x00}, - {WCD938X_DIGITAL_SWR_HM_TEST_1, 0x00}, - {WCD938X_DIGITAL_PAD_CTL_SWR_0, 0x8F}, - {WCD938X_DIGITAL_PAD_CTL_SWR_1, 0x06}, - {WCD938X_DIGITAL_I2C_CTL, 0x00}, - {WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE, 0x00}, - {WCD938X_DIGITAL_EFUSE_TEST_CTL_0, 0x00}, - {WCD938X_DIGITAL_EFUSE_TEST_CTL_1, 0x00}, - {WCD938X_DIGITAL_EFUSE_T_DATA_0, 0x00}, - {WCD938X_DIGITAL_EFUSE_T_DATA_1, 0x00}, - {WCD938X_DIGITAL_PAD_CTL_PDM_RX0, 0xF1}, - {WCD938X_DIGITAL_PAD_CTL_PDM_RX1, 0xF1}, - {WCD938X_DIGITAL_PAD_CTL_PDM_TX0, 0xF1}, - {WCD938X_DIGITAL_PAD_CTL_PDM_TX1, 0xF1}, - {WCD938X_DIGITAL_PAD_CTL_PDM_TX2, 0xF1}, - {WCD938X_DIGITAL_PAD_INP_DIS_0, 0x00}, - {WCD938X_DIGITAL_PAD_INP_DIS_1, 0x00}, - {WCD938X_DIGITAL_DRIVE_STRENGTH_0, 0x00}, - {WCD938X_DIGITAL_DRIVE_STRENGTH_1, 0x00}, - {WCD938X_DIGITAL_DRIVE_STRENGTH_2, 0x00}, - {WCD938X_DIGITAL_RX_DATA_EDGE_CTL, 0x1F}, - {WCD938X_DIGITAL_TX_DATA_EDGE_CTL, 0x80}, - {WCD938X_DIGITAL_GPIO_MODE, 0x00}, - {WCD938X_DIGITAL_PIN_CTL_OE, 0x00}, - {WCD938X_DIGITAL_PIN_CTL_DATA_0, 0x00}, - {WCD938X_DIGITAL_PIN_CTL_DATA_1, 0x00}, - {WCD938X_DIGITAL_PIN_STATUS_0, 0x00}, - {WCD938X_DIGITAL_PIN_STATUS_1, 0x00}, - {WCD938X_DIGITAL_DIG_DEBUG_CTL, 0x00}, - {WCD938X_DIGITAL_DIG_DEBUG_EN, 0x00}, - {WCD938X_DIGITAL_ANA_CSR_DBG_ADD, 0x00}, - {WCD938X_DIGITAL_ANA_CSR_DBG_CTL, 0x48}, - {WCD938X_DIGITAL_SSP_DBG, 0x00}, - {WCD938X_DIGITAL_MODE_STATUS_0, 0x00}, - {WCD938X_DIGITAL_MODE_STATUS_1, 0x00}, - {WCD938X_DIGITAL_SPARE_0, 0x00}, - {WCD938X_DIGITAL_SPARE_1, 0x00}, - {WCD938X_DIGITAL_SPARE_2, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_0, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_1, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_2, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_3, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_4, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_5, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_6, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_7, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_8, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_9, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_10, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_11, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_12, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_13, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_14, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_15, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_16, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_17, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_18, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_19, 0xFF}, - {WCD938X_DIGITAL_EFUSE_REG_20, 0x0E}, - {WCD938X_DIGITAL_EFUSE_REG_21, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_22, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_23, 0xF8}, - {WCD938X_DIGITAL_EFUSE_REG_24, 0x16}, - {WCD938X_DIGITAL_EFUSE_REG_25, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_26, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_27, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_28, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_29, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_30, 0x00}, - {WCD938X_DIGITAL_EFUSE_REG_31, 0x00}, - {WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0x88}, - {WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0x88}, - {WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0x88}, - {WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0x88}, - {WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0x88}, - {WCD938X_DIGITAL_DEM_BYPASS_DATA0, 0x55}, - {WCD938X_DIGITAL_DEM_BYPASS_DATA1, 0x55}, - {WCD938X_DIGITAL_DEM_BYPASS_DATA2, 0x55}, - {WCD938X_DIGITAL_DEM_BYPASS_DATA3, 0x01}, -}; - -static bool wcd938x_readable_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD938X_BASE_ADDRESS) - return 0; - return wcd938x_reg_access[WCD938X_REG(reg)] & RD_REG; -} - -static bool wcd938x_writeable_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD938X_BASE_ADDRESS) - return 0; - return wcd938x_reg_access[WCD938X_REG(reg)] & WR_REG; -} - -static bool wcd938x_volatile_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD938X_BASE_ADDRESS) - return 0; - if ((wcd938x_reg_access[WCD938X_REG(reg)] & RD_REG) - && !(wcd938x_reg_access[WCD938X_REG(reg)] & WR_REG)) - return true; - return false; -} - -struct regmap_config wcd938x_regmap_config = { - .name = "wcd938x_csr", - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd938x_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd938x_defaults), - .max_register = WCD938X_MAX_REGISTER, - .readable_reg = wcd938x_readable_register, - .writeable_reg = wcd938x_writeable_register, - .volatile_reg = wcd938x_volatile_register, - .can_multi_write = true, -}; diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-slave.c b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-slave.c deleted file mode 100644 index d37bdd0ea9d5..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-slave.c +++ /dev/null @@ -1,417 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_DEBUG_FS -#include -#include - -#define SWR_SLV_MAX_REG_ADDR 0x2009 -#define SWR_SLV_START_REG_ADDR 0x40 -#define SWR_SLV_MAX_BUF_LEN 20 -#define BYTES_PER_LINE 12 -#define SWR_SLV_RD_BUF_LEN 8 -#define SWR_SLV_WR_BUF_LEN 32 -#define SWR_SLV_MAX_DEVICES 2 -#endif /* CONFIG_DEBUG_FS */ - -struct wcd938x_slave_priv { - struct swr_device *swr_slave; -#ifdef CONFIG_DEBUG_FS - struct dentry *debugfs_wcd938x_dent; - struct dentry *debugfs_peek; - struct dentry *debugfs_poke; - struct dentry *debugfs_reg_dump; - unsigned int read_data; -#endif -}; - -#ifdef CONFIG_DEBUG_FS -static int codec_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token = NULL; - int base = 0, cnt = 0; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else { - return -EINVAL; - } - } - return 0; -} - -static bool is_swr_slv_reg_readable(int reg) -{ - int ret = true; - - if (((reg > 0x46) && (reg < 0x4A)) || - ((reg > 0x4A) && (reg < 0x50)) || - ((reg > 0x55) && (reg < 0xD0)) || - ((reg > 0xD0) && (reg < 0xE0)) || - ((reg > 0xE0) && (reg < 0xF0)) || - ((reg > 0xF0) && (reg < 0x100)) || - ((reg > 0x105) && (reg < 0x120)) || - ((reg > 0x205) && (reg < 0x220)) || - ((reg > 0x305) && (reg < 0x320)) || - ((reg > 0x405) && (reg < 0x420)) || - ((reg > 0x128) && (reg < 0x130)) || - ((reg > 0x228) && (reg < 0x230)) || - ((reg > 0x328) && (reg < 0x330)) || - ((reg > 0x428) && (reg < 0x430)) || - ((reg > 0x138) && (reg < 0x205)) || - ((reg > 0x238) && (reg < 0x305)) || - ((reg > 0x338) && (reg < 0x405)) || - ((reg > 0x405) && (reg < 0xF00)) || - ((reg > 0xF05) && (reg < 0xF20)) || - ((reg > 0xF25) && (reg < 0xF30)) || - ((reg > 0xF35) && (reg < 0x2000))) - ret = false; - - return ret; -} - -static ssize_t wcd938x_swrslave_reg_show(struct swr_device *pdev, - char __user *ubuf, - size_t count, loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[SWR_SLV_MAX_BUF_LEN]; - - if (!ubuf || !ppos) - return 0; - - for (i = (((int) *ppos/BYTES_PER_LINE) + SWR_SLV_START_REG_ADDR); - i <= SWR_SLV_MAX_REG_ADDR; i++) { - if (!is_swr_slv_reg_readable(i)) - continue; - swr_read(pdev, pdev->dev_num, i, ®_val, 1); - len = snprintf(tmp_buf, sizeof(tmp_buf), "0x%.3x: 0x%.2x\n", i, - (reg_val & 0xFF)); - if (((total + len) >= count - 1) || (len < 0)) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - total += len; - *ppos += len; - } - -copy_err: - *ppos = SWR_SLV_MAX_REG_ADDR * BYTES_PER_LINE; - return total; -} - -static ssize_t codec_debug_dump(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - struct swr_device *pdev; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - pdev = file->private_data; - if (!pdev) - return -EINVAL; - - if (*ppos < 0) - return -EINVAL; - - return wcd938x_swrslave_reg_show(pdev, ubuf, count, ppos); -} - -static ssize_t codec_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_SLV_RD_BUF_LEN]; - struct swr_device *pdev = NULL; - struct wcd938x_slave_priv *wcd938x_slave = NULL; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - pdev = file->private_data; - if (!pdev) - return -EINVAL; - - wcd938x_slave = swr_get_dev_data(pdev); - if (!wcd938x_slave) - return -EINVAL; - - if (*ppos < 0) - return -EINVAL; - - snprintf(lbuf, sizeof(lbuf), "0x%x\n", - (wcd938x_slave->read_data & 0xFF)); - - return simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); -} - -static ssize_t codec_debug_peek_write(struct file *file, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char lbuf[SWR_SLV_WR_BUF_LEN]; - int rc = 0; - u32 param[5]; - struct swr_device *pdev = NULL; - struct wcd938x_slave_priv *wcd938x_slave = NULL; - - if (!cnt || !file || !ppos || !ubuf) - return -EINVAL; - - pdev = file->private_data; - if (!pdev) - return -EINVAL; - - wcd938x_slave = swr_get_dev_data(pdev); - if (!wcd938x_slave) - return -EINVAL; - - if (*ppos < 0) - return -EINVAL; - - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - rc = get_parameters(lbuf, param, 1); - if (!((param[0] <= SWR_SLV_MAX_REG_ADDR) && (rc == 0))) - return -EINVAL; - swr_read(pdev, pdev->dev_num, param[0], &wcd938x_slave->read_data, 1); - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static ssize_t codec_debug_write(struct file *file, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char lbuf[SWR_SLV_WR_BUF_LEN]; - int rc = 0; - u32 param[5]; - struct swr_device *pdev; - - if (!file || !ppos || !ubuf) - return -EINVAL; - - pdev = file->private_data; - if (!pdev) - return -EINVAL; - - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - rc = get_parameters(lbuf, param, 2); - if (!((param[0] <= SWR_SLV_MAX_REG_ADDR) && - (param[1] <= 0xFF) && (rc == 0))) - return -EINVAL; - swr_write(pdev, pdev->dev_num, param[0], ¶m[1]); - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations codec_debug_write_ops = { - .open = codec_debug_open, - .write = codec_debug_write, -}; - -static const struct file_operations codec_debug_read_ops = { - .open = codec_debug_open, - .read = codec_debug_read, - .write = codec_debug_peek_write, -}; - -static const struct file_operations codec_debug_dump_ops = { - .open = codec_debug_open, - .read = codec_debug_dump, -}; -#endif - -static int wcd938x_slave_bind(struct device *dev, - struct device *master, void *data) -{ - int ret = 0; - uint8_t devnum = 0; - struct swr_device *pdev = to_swr_device(dev); - - if (!pdev) { - pr_err("%s: invalid swr device handle\n", __func__); - return -EINVAL; - } - - ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum); - if (ret) { - dev_dbg(&pdev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, pdev->addr); - return ret; - } - pdev->dev_num = devnum; - - return ret; -} - -static void wcd938x_slave_unbind(struct device *dev, - struct device *master, void *data) -{ - struct wcd938x_slave_priv *wcd938x_slave = NULL; - struct swr_device *pdev = to_swr_device(dev); - - wcd938x_slave = swr_get_dev_data(pdev); - if (!wcd938x_slave) { - dev_err(&pdev->dev, "%s: wcd938x_slave is NULL\n", __func__); - return; - } -} - -static const struct swr_device_id wcd938x_swr_id[] = { - {"wcd938x-slave", 0}, - {} -}; - -static const struct of_device_id wcd938x_swr_dt_match[] = { - { - .compatible = "qcom,wcd938x-slave", - }, - {} -}; - -static const struct component_ops wcd938x_slave_comp_ops = { - .bind = wcd938x_slave_bind, - .unbind = wcd938x_slave_unbind, -}; - -static int wcd938x_swr_probe(struct swr_device *pdev) -{ - struct wcd938x_slave_priv *wcd938x_slave = NULL; - - wcd938x_slave = devm_kzalloc(&pdev->dev, - sizeof(struct wcd938x_slave_priv), GFP_KERNEL); - if (!wcd938x_slave) - return -ENOMEM; - - swr_set_dev_data(pdev, wcd938x_slave); - - wcd938x_slave->swr_slave = pdev; - -#ifdef CONFIG_DEBUG_FS - if (!wcd938x_slave->debugfs_wcd938x_dent) { - wcd938x_slave->debugfs_wcd938x_dent = debugfs_create_dir( - dev_name(&pdev->dev), 0); - if (!IS_ERR(wcd938x_slave->debugfs_wcd938x_dent)) { - wcd938x_slave->debugfs_peek = - debugfs_create_file("swrslave_peek", - S_IFREG | 0444, - wcd938x_slave->debugfs_wcd938x_dent, - (void *) pdev, - &codec_debug_read_ops); - - wcd938x_slave->debugfs_poke = - debugfs_create_file("swrslave_poke", - S_IFREG | 0444, - wcd938x_slave->debugfs_wcd938x_dent, - (void *) pdev, - &codec_debug_write_ops); - - wcd938x_slave->debugfs_reg_dump = - debugfs_create_file( - "swrslave_reg_dump", - S_IFREG | 0444, - wcd938x_slave->debugfs_wcd938x_dent, - (void *) pdev, - &codec_debug_dump_ops); - } - } -#endif - - return component_add(&pdev->dev, &wcd938x_slave_comp_ops); -} - -static int wcd938x_swr_remove(struct swr_device *pdev) -{ -#ifdef CONFIG_DEBUG_FS - struct wcd938x_slave_priv *wcd938x_slave = swr_get_dev_data(pdev); - - if (wcd938x_slave) { - debugfs_remove_recursive(wcd938x_slave->debugfs_wcd938x_dent); - wcd938x_slave->debugfs_wcd938x_dent = NULL; - } -#endif - component_del(&pdev->dev, &wcd938x_slave_comp_ops); - swr_set_dev_data(pdev, NULL); - swr_remove_device(pdev); - - return 0; -} - -static struct swr_driver wcd938x_slave_driver = { - .driver = { - .name = "wcd938x-slave", - .owner = THIS_MODULE, - .of_match_table = wcd938x_swr_dt_match, - }, - .probe = wcd938x_swr_probe, - .remove = wcd938x_swr_remove, - .id_table = wcd938x_swr_id, -}; - -static int __init wcd938x_slave_init(void) -{ - return swr_driver_register(&wcd938x_slave_driver); -} - -static void __exit wcd938x_slave_exit(void) -{ - swr_driver_unregister(&wcd938x_slave_driver); -} - -module_init(wcd938x_slave_init); -module_exit(wcd938x_slave_exit); - -MODULE_DESCRIPTION("WCD938X Swr Slave driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-tables.c b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-tables.c deleted file mode 100644 index d2f7d61b6d63..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-tables.c +++ /dev/null @@ -1,474 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018 , The Linux Foundation. All rights reserved. - */ - -#include -#include "wcd938x-registers.h" - -const u8 wcd938x_reg_access[WCD938X_REG(WCD938X_REGISTERS_MAX_SIZE)] = { - [WCD938X_REG(WCD938X_ANA_PAGE_REGISTER)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_BIAS)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_RX_SUPPLIES)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_HPH)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_EAR)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_EAR_COMPANDER_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_TX_CH1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_TX_CH2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_TX_CH3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_TX_CH4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MICB3_DSP_EN_LOGIC)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_MECH)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_ELECT)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_ZDET)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_RESULT_1)] = RD_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_RESULT_2)] = RD_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_RESULT_3)] = RD_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN5)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN6)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MBHC_BTN7)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MICB1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MICB2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MICB2_RAMP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MICB3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_ANA_MICB4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_BIAS_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_BIAS_VBG_FINE_ADJ)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDOL_VDDCX_ADJUST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDOL_DISABLE_LDOL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_CTL_CLK)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_CTL_ANA)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_CTL_SPARE_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_CTL_SPARE_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_CTL_BCS)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_MOISTURE_DET_FSM_STATUS)] = RD_REG, - [WCD938X_REG(WCD938X_MBHC_TEST_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDOH_MODE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDOH_BIAS)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDOH_STB_LOADS)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDOH_SLOWRAMP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB1_TEST_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB1_TEST_CTL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB1_TEST_CTL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB2_TEST_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB2_TEST_CTL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB2_TEST_CTL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB3_TEST_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB3_TEST_CTL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB3_TEST_CTL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB4_TEST_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB4_TEST_CTL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MICB4_TEST_CTL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_ADC_VCM)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_BIAS_ATEST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_SPARE1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_SPARE2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_TXFE_DIV_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_TXFE_DIV_START)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_SPARE3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_SPARE4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_1_2_TEST_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_1_2_ADC_IB)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_1_2_ATEST_REFCTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_1_2_TEST_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_1_2_TEST_BLK_EN1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_1_2_TXFE1_CLKDIV)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_1_2_SAR2_ERR)] = RD_REG, - [WCD938X_REG(WCD938X_TX_1_2_SAR1_ERR)] = RD_REG, - [WCD938X_REG(WCD938X_TX_3_4_TEST_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_ADC_IB)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_ATEST_REFCTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_TEST_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_TEST_BLK_EN3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_TXFE3_CLKDIV)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_SAR4_ERR)] = RD_REG, - [WCD938X_REG(WCD938X_TX_3_4_SAR3_ERR)] = RD_REG, - [WCD938X_REG(WCD938X_TX_3_4_TEST_BLK_EN2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_TXFE2_CLKDIV)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_SPARE1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_TEST_BLK_EN4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_TXFE4_CLKDIV)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_3_4_SPARE2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_MODE_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_MODE_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_MODE_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_CTRL_VCL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_CTRL_VCL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_CTRL_CCL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_CTRL_CCL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_CTRL_CCL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_CTRL_CCL_4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_CTRL_CCL_5)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_BUCK_TMUX_A_D)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_BUCK_SW_DRV_CNTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_CLASSH_SPARE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_5)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_6)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_7)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_8)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEG_CTRL_9)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEGDAC_CTRL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEGDAC_CTRL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_VNEGDAC_CTRL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_CTRL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_FLYBACK_TEST_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_AUX_SW_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_PA_AUX_IN_CONN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_TIMER_DIV)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_OCP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_OCP_COUNT)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_EAR_DAC)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_EAR_AMP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_HPH_LDO)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_HPH_PA)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_HPH_RDAC_LDO)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_HPH_CNP1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_HPH_LOWPOWER)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_AUX_DAC)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_AUX_AMP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_VNEGDAC_BLEEDER)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_MISC)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_BUCK_RST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_BUCK_VREF_ERRAMP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_FLYB_ERRAMP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_FLYB_BUFF)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_BIAS_FLYB_MID_RST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_L_STATUS)] = RD_REG, - [WCD938X_REG(WCD938X_HPH_R_STATUS)] = RD_REG, - [WCD938X_REG(WCD938X_HPH_CNP_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_CNP_WG_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_CNP_WG_TIME)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_OCP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_AUTO_CHOP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_CHOP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_PA_CTL1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_PA_CTL2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_L_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_L_TEST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_L_ATEST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_R_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_R_TEST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_R_ATEST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_RDAC_CLK_CTL1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_RDAC_CLK_CTL2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_RDAC_LDO_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_REFBUFF_UHQA_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_REFBUFF_LP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_L_DAC_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_R_DAC_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_SURGE_HPHLR_SURGE_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS)] = RD_REG, - [WCD938X_REG(WCD938X_EAR_EAR_EN_REG)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_EAR_PA_CON)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_EAR_SP_CON)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_EAR_DAC_CON)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_EAR_CNP_FSM_CON)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_TEST_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_STATUS_REG_1)] = RD_REG, - [WCD938X_REG(WCD938X_EAR_STATUS_REG_2)] = RD_REG, - [WCD938X_REG(WCD938X_ANA_NEW_PAGE_REGISTER)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_ANA_HPH2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_ANA_HPH3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_SLEEP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_SLEEP_WATCHDOG_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_CTL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_PLUG_DETECT_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_ZDET_ANA_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_ZDET_RAMP_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_FSM_STATUS)] = RD_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_ADC_RESULT)] = RD_REG, - [WCD938X_REG(WCD938X_TX_NEW_AMIC_MUX_CFG)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_AUXPA)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_MODE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_CONFIG)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIE_CRACK_DIE_CRK_DET_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIE_CRACK_DIE_CRK_DET_OUT)] = RD_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_RDAC_VREF_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_PA_MISC1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_PA_MISC2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_PA_RDAC_MISC)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_HPH_TIMER1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_HPH_TIMER2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_HPH_TIMER3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_HPH_TIMER4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_PA_RDAC_MISC2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_PA_RDAC_MISC3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW)] = RD_WR_REG, - [WCD938X_REG(WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT)] = RD_WR_REG, - [WCD938X_REG(WCD938X_MBHC_NEW_INT_SPARE_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_INT_NEW_CNP_VCM_CON1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_INT_NEW_CNP_VCM_CON2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_INT_EN_REG)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_INT_PA_CTRL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_INT_SP_CTRL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_INT_DAC_CTRL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_INT_CLK_CTRL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_INT_TEST_CTRL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_AUX_INT_STATUS_REG)] = RD_REG, - [WCD938X_REG(WCD938X_AUX_INT_MISC)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_INT_BIAS)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_INT_STB_LOADS_DTEST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_INT_TEST0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_INT_STARTUP_TIMER)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_INT_TEST1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_LDORXTX_INT_STATUS)] = RD_REG, - [WCD938X_REG(WCD938X_SLEEP_INT_WATCHDOG_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_SLEEP_INT_WATCHDOG_CTL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0)]=RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXADC_INT_L2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXADC_INT_L1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXADC_INT_L0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAGE_REGISTER)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CHIP_ID0)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_CHIP_ID1)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_CHIP_ID2)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_CHIP_ID3)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_TX_CLK_RATE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_RST_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TOP_CLK_CFG)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_ANA_CLK_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DIG_CLK_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_RST_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_PATH_MODE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_RX_RST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_RX0_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_RX1_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_RX2_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_COMP_CTL_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A1_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A1_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A2_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A2_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A3_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A3_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A4_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A4_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A5_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A5_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A6_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_A7_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_C_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_C_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_C_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_C_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_R1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_R2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_R3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_R4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_R5)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_R6)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_DSM_R7)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A1_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A1_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A2_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A2_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A3_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A3_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A4_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A4_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A5_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A5_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A6_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_A7_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_C_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_C_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_C_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_C_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_R1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_R2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_R3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_R4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_R5)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_R6)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_DSM_R7)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_HPH_GAIN_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AUX_GAIN_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_EAR_PATH_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_SWR_CLH)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_CLH_BYP)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_TX0_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_TX1_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_TX2_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_TX_RST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_REQ_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_RST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_AMIC_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DMIC_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DMIC1_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DMIC2_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DMIC3_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DMIC4_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_PRG_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DMIC_RATE_1_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_DMIC_RATE_3_4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PDM_WD_CTL0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PDM_WD_CTL1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PDM_WD_CTL2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_MODE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_MASK_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_MASK_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_MASK_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_STATUS_0)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_STATUS_1)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_STATUS_2)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_CLEAR_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_CLEAR_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_CLEAR_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_LEVEL_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_LEVEL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_LEVEL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_SET_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_SET_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_SET_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_TEST_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_TEST_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_INTR_TEST_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_MODE_DBG_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_MODE_DBG_0_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_MODE_DBG_2_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_LB_IN_SEL_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_LOOP_BACK_MODE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_DAC_TEST)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_HM_TEST_RX_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_HM_TEST_TX_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_HM_TEST_RX_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_HM_TEST_TX_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_HM_TEST_TX_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_HM_TEST_0)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_SWR_HM_TEST_1)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_CTL_SWR_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_CTL_SWR_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_I2C_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_TEST_CTL_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_TEST_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_T_DATA_0)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_T_DATA_1)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_CTL_PDM_RX0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_CTL_PDM_RX1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_CTL_PDM_TX0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_CTL_PDM_TX1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_CTL_PDM_TX2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_INP_DIS_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PAD_INP_DIS_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DRIVE_STRENGTH_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DRIVE_STRENGTH_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DRIVE_STRENGTH_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_RX_DATA_EDGE_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_DATA_EDGE_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_GPIO_MODE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PIN_CTL_OE)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PIN_CTL_DATA_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PIN_CTL_DATA_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_PIN_STATUS_0)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_PIN_STATUS_1)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_DIG_DEBUG_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DIG_DEBUG_EN)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_ANA_CSR_DBG_ADD)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_ANA_CSR_DBG_CTL)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SSP_DBG)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_MODE_STATUS_0)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_MODE_STATUS_1)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_SPARE_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SPARE_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_SPARE_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_0)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_1)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_2)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_3)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_4)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_5)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_6)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_7)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_8)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_9)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_10)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_11)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_12)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_13)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_14)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_15)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_16)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_17)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_18)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_19)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_20)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_21)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_22)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_23)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_24)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_25)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_26)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_27)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_28)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_29)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_30)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_EFUSE_REG_31)] = RD_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_REQ_FB_CTL_0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_REQ_FB_CTL_1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_REQ_FB_CTL_2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_REQ_FB_CTL_3)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_TX_REQ_FB_CTL_4)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DEM_BYPASS_DATA0)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DEM_BYPASS_DATA1)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DEM_BYPASS_DATA2)] = RD_WR_REG, - [WCD938X_REG(WCD938X_DIGITAL_DEM_BYPASS_DATA3)] = RD_WR_REG, -}; diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c deleted file mode 100644 index c60028ca2c63..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c +++ /dev/null @@ -1,3897 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "internal.h" -#include "wcd938x-registers.h" -#include "wcd938x.h" - -#define WCD938X_DRV_NAME "wcd938x_codec" -#define NUM_SWRS_DT_PARAMS 5 -#define WCD938X_VARIANT_ENTRY_SIZE 32 - -#define WCD938X_VERSION_1_0 1 -#define WCD938X_VERSION_ENTRY_SIZE 32 -#define EAR_RX_PATH_AUX 1 - -#define ADC_MODE_VAL_HIFI 0x01 -#define ADC_MODE_VAL_LO_HIF 0x02 -#define ADC_MODE_VAL_NORMAL 0x03 -#define ADC_MODE_VAL_LP 0x05 -#define ADC_MODE_VAL_ULP1 0x09 -#define ADC_MODE_VAL_ULP2 0x0B - -#define NUM_ATTEMPTS 5 - -enum { - CODEC_TX = 0, - CODEC_RX, -}; - -enum { - WCD_ADC1 = 0, - WCD_ADC2, - WCD_ADC3, - WCD_ADC4, - ALLOW_BUCK_DISABLE, - HPH_COMP_DELAY, - HPH_PA_DELAY, - AMIC2_BCS_ENABLE, -}; - -enum { - ADC_MODE_INVALID = 0, - ADC_MODE_HIFI, - ADC_MODE_LO_HIF, - ADC_MODE_NORMAL, - ADC_MODE_LP, - ADC_MODE_ULP1, - ADC_MODE_ULP2, -}; - -static u8 tx_mode_bit[] = { - [ADC_MODE_INVALID] = 0x00, - [ADC_MODE_HIFI] = 0x01, - [ADC_MODE_LO_HIF] = 0x02, - [ADC_MODE_NORMAL] = 0x04, - [ADC_MODE_LP] = 0x08, - [ADC_MODE_ULP1] = 0x10, - [ADC_MODE_ULP2] = 0x20, -}; - -static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1); -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); - -static int wcd938x_handle_post_irq(void *data); -static int wcd938x_reset(struct device *dev); -static int wcd938x_reset_low(struct device *dev); - -static const struct regmap_irq wcd938x_irqs[WCD938X_NUM_IRQS] = { - REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01), - REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x02), - REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, 0, 0x04), - REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 0, 0x08), - REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_SW_DET, 0, 0x10), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_OCP_INT, 0, 0x20), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_CNP_INT, 0, 0x40), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_OCP_INT, 0, 0x80), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_CNP_INT, 1, 0x01), - REGMAP_IRQ_REG(WCD938X_IRQ_EAR_CNP_INT, 1, 0x02), - REGMAP_IRQ_REG(WCD938X_IRQ_EAR_SCD_INT, 1, 0x04), - REGMAP_IRQ_REG(WCD938X_IRQ_AUX_CNP_INT, 1, 0x08), - REGMAP_IRQ_REG(WCD938X_IRQ_AUX_SCD_INT, 1, 0x10), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_PDM_WD_INT, 1, 0x20), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_PDM_WD_INT, 1, 0x40), - REGMAP_IRQ_REG(WCD938X_IRQ_AUX_PDM_WD_INT, 1, 0x80), - REGMAP_IRQ_REG(WCD938X_IRQ_LDORT_SCD_INT, 2, 0x01), - REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_MOISTURE_INT, 2, 0x02), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_SURGE_DET_INT, 2, 0x04), - REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_SURGE_DET_INT, 2, 0x08), -}; - -static struct regmap_irq_chip wcd938x_regmap_irq_chip = { - .name = "wcd938x", - .irqs = wcd938x_irqs, - .num_irqs = ARRAY_SIZE(wcd938x_irqs), - .num_regs = 3, - .status_base = WCD938X_DIGITAL_INTR_STATUS_0, - .mask_base = WCD938X_DIGITAL_INTR_MASK_0, - .type_base = WCD938X_DIGITAL_INTR_LEVEL_0, - .ack_base = WCD938X_DIGITAL_INTR_CLEAR_0, - .use_ack = 1, - .runtime_pm = false, - .handle_post_irq = wcd938x_handle_post_irq, - .irq_drv_data = NULL, -}; - -static int wcd938x_handle_post_irq(void *data) -{ - struct wcd938x_priv *wcd938x = data; - u32 sts1 = 0, sts2 = 0, sts3 = 0; - - regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_0, &sts1); - regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_1, &sts2); - regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_2, &sts3); - - wcd938x->tx_swr_dev->slave_irq_pending = - ((sts1 || sts2 || sts3) ? true : false); - - return IRQ_HANDLED; -} - -static int wcd938x_swr_slv_get_current_bank(struct swr_device *dev, u8 devnum) -{ - int ret = 0; - int bank = 0; - - ret = swr_read(dev, devnum, SWR_SCP_CONTROL, &bank, 1); - if (ret) - return -EINVAL; - - return ((bank & 0x40) ? 1: 0); -} - -static int wcd938x_get_clk_rate(int mode) -{ - int rate; - - switch (mode) { - case ADC_MODE_ULP2: - rate = SWR_CLK_RATE_0P6MHZ; - break; - case ADC_MODE_ULP1: - rate = SWR_CLK_RATE_1P2MHZ; - break; - case ADC_MODE_LP: - rate = SWR_CLK_RATE_4P8MHZ; - break; - case ADC_MODE_NORMAL: - case ADC_MODE_LO_HIF: - case ADC_MODE_HIFI: - case ADC_MODE_INVALID: - default: - rate = SWR_CLK_RATE_9P6MHZ; - break; - } - - return rate; -} - -static int wcd938x_set_swr_clk_rate(struct snd_soc_codec *codec, - int rate, int bank) -{ - u8 mask = (bank ? 0xF0 : 0x0F); - u8 val = 0; - - switch (rate) { - case SWR_CLK_RATE_0P6MHZ: - val = (bank ? 0x60 : 0x06); - break; - case SWR_CLK_RATE_1P2MHZ: - val = (bank ? 0x50 : 0x05); - break; - case SWR_CLK_RATE_2P4MHZ: - val = (bank ? 0x30 : 0x03); - break; - case SWR_CLK_RATE_4P8MHZ: - val = (bank ? 0x10 : 0x01); - break; - case SWR_CLK_RATE_9P6MHZ: - default: - val = 0x00; - break; - } - snd_soc_update_bits(codec, - WCD938X_DIGITAL_SWR_TX_CLK_RATE, - mask, val); - - return 0; -} - -static int wcd938x_init_reg(struct snd_soc_codec *codec) -{ - snd_soc_update_bits(codec, WCD938X_SLEEP_CTL, 0x0E, 0x0E); - snd_soc_update_bits(codec, WCD938X_SLEEP_CTL, 0x80, 0x80); - /* 1 msec delay as per HW requirement */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WCD938X_SLEEP_CTL, 0x40, 0x40); - /* 1 msec delay as per HW requirement */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WCD938X_LDORXTX_CONFIG, - 0x10, 0x00); - snd_soc_update_bits(codec, WCD938X_BIAS_VBG_FINE_ADJ, - 0xF0, 0x80); - snd_soc_update_bits(codec, WCD938X_ANA_BIAS, 0x80, 0x80); - snd_soc_update_bits(codec, WCD938X_ANA_BIAS, 0x40, 0x40); - /* 10 msec delay as per HW requirement */ - usleep_range(10000, 10010); - snd_soc_update_bits(codec, WCD938X_ANA_BIAS, 0x40, 0x00); - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, - 0xF0, 0x00); - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, - 0x1F, 0x15); - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, - 0x1F, 0x15); - snd_soc_update_bits(codec, WCD938X_HPH_REFBUFF_UHQA_CTL, - 0xC0, 0x80); - snd_soc_update_bits(codec, WCD938X_DIGITAL_CDC_DMIC_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, - WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, - 0xFF, 0x14); - snd_soc_update_bits(codec, - WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, - 0x1F, 0x08); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0xFF, 0x55); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0xFF, 0x44); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0xFF, 0x11); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0xFF, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0xFF, 0x00); - snd_soc_update_bits(codec, - WCD938X_MICB1_TEST_CTL_1, 0xE0, 0xE0); - snd_soc_update_bits(codec, - WCD938X_MICB2_TEST_CTL_1, 0xE0, 0xE0); - snd_soc_update_bits(codec, - WCD938X_MICB3_TEST_CTL_1, 0xE0, 0xE0); - snd_soc_update_bits(codec, - WCD938X_MICB4_TEST_CTL_1, 0xE0, 0xE0); - snd_soc_update_bits(codec, - WCD938X_TX_3_4_TEST_BLK_EN2, 0x01, 0x00); - snd_soc_update_bits(codec, WCD938X_SLEEP_CTL, 0x0E, - ((snd_soc_read(codec, - WCD938X_DIGITAL_EFUSE_REG_30) & 0x07) << 1)); - snd_soc_update_bits(codec, - WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); - - return 0; -} - -static int wcd938x_set_port_params(struct snd_soc_codec *codec, - u8 slv_prt_type, u8 *port_id, u8 *num_ch, - u8 *ch_mask, u32 *ch_rate, - u8 *port_type, u8 path) -{ - int i, j; - u8 num_ports = 0; - struct codec_port_info (*map)[MAX_PORT][MAX_CH_PER_PORT]; - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - switch (path) { - case CODEC_RX: - map = &wcd938x->rx_port_mapping; - num_ports = wcd938x->num_rx_ports; - break; - case CODEC_TX: - map = &wcd938x->tx_port_mapping; - num_ports = wcd938x->num_tx_ports; - break; - default: - dev_err(codec->dev, "%s Invalid path selected %u\n", - __func__, path); - return -EINVAL; - } - - for (i = 0; i <= num_ports; i++) { - for (j = 0; j < MAX_CH_PER_PORT; j++) { - if ((*map)[i][j].slave_port_type == slv_prt_type) - goto found; - } - } -found: - if (i > num_ports || j == MAX_CH_PER_PORT) { - dev_err(codec->dev, "%s Failed to find slave port for type %u\n", - __func__, slv_prt_type); - return -EINVAL; - } - *port_id = i; - *num_ch = (*map)[i][j].num_ch; - *ch_mask = (*map)[i][j].ch_mask; - *ch_rate = (*map)[i][j].ch_rate; - *port_type = (*map)[i][j].master_port_type; - - return 0; -} - -static int wcd938x_parse_port_mapping(struct device *dev, - char *prop, u8 path) -{ - u32 *dt_array, map_size, map_length; - u32 port_num = 0, ch_mask, ch_rate, old_port_num = 0; - u32 slave_port_type, master_port_type; - u32 i, ch_iter = 0; - int ret = 0; - u8 *num_ports = NULL; - struct codec_port_info (*map)[MAX_PORT][MAX_CH_PER_PORT]; - struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); - - switch (path) { - case CODEC_RX: - map = &wcd938x->rx_port_mapping; - num_ports = &wcd938x->num_rx_ports; - break; - case CODEC_TX: - map = &wcd938x->tx_port_mapping; - num_ports = &wcd938x->num_tx_ports; - break; - default: - dev_err(dev, "%s Invalid path selected %u\n", - __func__, path); - return -EINVAL; - } - - if (!of_find_property(dev->of_node, prop, - &map_size)) { - dev_err(dev, "missing port mapping prop %s\n", prop); - ret = -EINVAL; - goto err_port_map; - } - - map_length = map_size / (NUM_SWRS_DT_PARAMS * sizeof(u32)); - - dt_array = kzalloc(map_size, GFP_KERNEL); - - if (!dt_array) { - ret = -ENOMEM; - goto err_alloc; - } - ret = of_property_read_u32_array(dev->of_node, prop, dt_array, - NUM_SWRS_DT_PARAMS * map_length); - if (ret) { - dev_err(dev, "%s: Failed to read port mapping from prop %s\n", - __func__, prop); - goto err_pdata_fail; - } - - for (i = 0; i < map_length; i++) { - port_num = dt_array[NUM_SWRS_DT_PARAMS * i]; - slave_port_type = dt_array[NUM_SWRS_DT_PARAMS * i + 1]; - ch_mask = dt_array[NUM_SWRS_DT_PARAMS * i + 2]; - ch_rate = dt_array[NUM_SWRS_DT_PARAMS * i + 3]; - master_port_type = dt_array[NUM_SWRS_DT_PARAMS * i + 4]; - - if (port_num != old_port_num) - ch_iter = 0; - - (*map)[port_num][ch_iter].slave_port_type = slave_port_type; - (*map)[port_num][ch_iter].ch_mask = ch_mask; - (*map)[port_num][ch_iter].master_port_type = master_port_type; - (*map)[port_num][ch_iter].num_ch = __sw_hweight8(ch_mask); - (*map)[port_num][ch_iter++].ch_rate = ch_rate; - old_port_num = port_num; - } - *num_ports = port_num; - kfree(dt_array); - return 0; - -err_pdata_fail: - kfree(dt_array); -err_alloc: -err_port_map: - return ret; -} - -static int wcd938x_tx_connect_port(struct snd_soc_codec *codec, - u8 slv_port_type, int clk_rate, - u8 enable) -{ - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - u8 port_id, num_ch, ch_mask, port_type; - u32 ch_rate; - u8 num_port = 1; - int ret = 0; - - ret = wcd938x_set_port_params(codec, slv_port_type, &port_id, - &num_ch, &ch_mask, &ch_rate, - &port_type, CODEC_TX); - if (clk_rate) - ch_rate = clk_rate; - - if (ret) - return ret; - - if (enable) - ret = swr_connect_port(wcd938x->tx_swr_dev, &port_id, - num_port, &ch_mask, &ch_rate, - &num_ch, &port_type); - else - ret = swr_disconnect_port(wcd938x->tx_swr_dev, &port_id, - num_port, &ch_mask, &port_type); - return ret; - -} -static int wcd938x_rx_connect_port(struct snd_soc_codec *codec, - u8 slv_port_type, u8 enable) -{ - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - u8 port_id, num_ch, ch_mask, port_type; - u32 ch_rate; - u8 num_port = 1; - int ret = 0; - - ret = wcd938x_set_port_params(codec, slv_port_type, &port_id, - &num_ch, &ch_mask, &ch_rate, - &port_type, CODEC_RX); - - if (ret) - return ret; - - if (enable) - ret = swr_connect_port(wcd938x->rx_swr_dev, &port_id, - num_port, &ch_mask, &ch_rate, - &num_ch, &port_type); - else - ret = swr_disconnect_port(wcd938x->rx_swr_dev, &port_id, - num_port, &ch_mask, &port_type); - return ret; -} - -static int wcd938x_rx_clk_enable(struct snd_soc_codec *codec) -{ - - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - if (wcd938x->rx_clk_cnt == 0) { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_RX0_CTL, 0x40, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_RX1_CTL, 0x40, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_RX2_CTL, 0x40, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, - WCD938X_AUX_AUXPA, 0x10, 0x10); - } - wcd938x->rx_clk_cnt++; - - return 0; -} - -static int wcd938x_rx_clk_disable(struct snd_soc_codec *codec) -{ - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - wcd938x->rx_clk_cnt--; - if (wcd938x->rx_clk_cnt == 0) { - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, 0x40, 0x00); - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, 0x80, 0x00); - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, 0x01, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x02, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x01, 0x00); - } - return 0; -} - -/* - * wcd938x_soc_get_mbhc: get wcd938x_mbhc handle of corresponding codec - * @codec: handle to snd_soc_codec * - * - * return wcd938x_mbhc handle or error code in case of failure - */ -struct wcd938x_mbhc *wcd938x_soc_get_mbhc(struct snd_soc_codec *codec) -{ - struct wcd938x_priv *wcd938x; - - if (!codec) { - pr_err("%s: Invalid params, NULL codec\n", __func__); - return NULL; - } - wcd938x = snd_soc_codec_get_drvdata(codec); - - if (!wcd938x) { - pr_err("%s: wcd938x is NULL\n", __func__); - return NULL; - } - - return wcd938x->mbhc; -} -EXPORT_SYMBOL(wcd938x_soc_get_mbhc); - -static int wcd938x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_rx_clk_enable(codec); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x04, 0x04); - snd_soc_update_bits(codec, - WCD938X_HPH_RDAC_CLK_CTL1, 0x80, 0x00); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x0F, 0x02); - if (wcd938x->comp1_enable) { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x02, 0x02); - /* 5msec compander delay as per HW requirement */ - if (!wcd938x->comp2_enable || - (snd_soc_read(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x01)) - usleep_range(5000, 5010); - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00); - } else { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x00); - snd_soc_update_bits(codec, - WCD938X_HPH_L_EN, 0x20, 0x20); - - } - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x01); - break; - } - - return 0; -} - -static int wcd938x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_rx_clk_enable(codec); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x08, 0x08); - snd_soc_update_bits(codec, - WCD938X_HPH_RDAC_CLK_CTL1, 0x80, 0x00); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x0F, 0x02); - if (wcd938x->comp2_enable) { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x01, 0x01); - /* 5msec compander delay as per HW requirement */ - if (!wcd938x->comp1_enable || - (snd_soc_read(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x02)) - usleep_range(5000, 5010); - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00); - } else { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD938X_HPH_R_EN, 0x20, 0x20); - } - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x01); - break; - } - - return 0; -} - -static int wcd938x_codec_ear_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_rx_clk_enable(codec); - wcd938x->ear_rx_path = - snd_soc_read( - codec, WCD938X_DIGITAL_CDC_EAR_PATH_CTL); - if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { - snd_soc_update_bits(codec, - WCD938X_EAR_EAR_DAC_CON, 0x80, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x04, 0x04); - snd_soc_update_bits(codec, - WCD938X_ANA_EAR_COMPANDER_CTL, 0x80, 0x80); - } else { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x04, 0x04); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x02, 0x02); - } - /* 5 msec delay as per HW requirement */ - usleep_range(5000, 5010); - if (wcd938x->flyback_cur_det_disable == 0) - snd_soc_update_bits(codec, - WCD938X_FLYBACK_EN, - 0x04, 0x00); - wcd938x->flyback_cur_det_disable++; - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_EAR, - wcd938x->hph_mode); - break; - case SND_SOC_DAPM_POST_PMD: - if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 0x01, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x04, 0x00); - } else { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x04, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x01, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x02, 0x00); - } - snd_soc_update_bits(codec, - WCD938X_ANA_EAR_COMPANDER_CTL, 0x80, 0x00); - snd_soc_update_bits(codec, - WCD938X_EAR_EAR_DAC_CON, 0x80, 0x80); - break; - }; - return 0; - -} - -static int wcd938x_codec_aux_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_rx_clk_enable(codec); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x04, 0x04); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x04, 0x04); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 0x01, 0x01); - if (wcd938x->flyback_cur_det_disable == 0) - snd_soc_update_bits(codec, - WCD938X_FLYBACK_EN, - 0x04, 0x00); - wcd938x->flyback_cur_det_disable++; - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_AUX, - wcd938x->hph_mode); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x04, 0x00); - break; - }; - return ret; - -} - -static int wcd938x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int hph_mode = wcd938x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (wcd938x->ldoh) - snd_soc_update_bits(codec, - WCD938X_LDOH_MODE, - 0x80, 0x80); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX2 << 0x10 | 0x1)); - ret = swr_slvdev_datapath_control(wcd938x->rx_swr_dev, - wcd938x->rx_swr_dev->dev_num, - true); - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHR, - hph_mode); - wcd_clsh_set_hph_mode(codec, CLS_H_HIFI); - snd_soc_update_bits(codec, WCD938X_ANA_HPH, - 0x10, 0x10); - wcd_clsh_set_hph_mode(codec, hph_mode); - /* 100 usec delay as per HW requirement */ - usleep_range(100, 110); - set_bit(HPH_PA_DELAY, &wcd938x->status_mask); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL1, 0x17, 0x13); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * 7ms sleep is required if compander is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { - if (!wcd938x->comp2_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); - } - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x02); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || - hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, 0x02, 0x02); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX2 << 0x10)); - wcd_enable_irq(&wcd938x->irq_info, - WCD938X_IRQ_HPHR_PDM_WD_INT); - break; - case SND_SOC_DAPM_PRE_PMD: - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX2 << 0x10 | 0x1)); - wcd_disable_irq(&wcd938x->irq_info, - WCD938X_IRQ_HPHR_PDM_WD_INT); - if (wcd938x->update_wcd_event && wcd938x->comp2_enable) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST, - (WCD_RX2 << 0x10)); - /* - * 7ms sleep is required if compander is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (!wcd938x->comp2_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - snd_soc_update_bits(codec, WCD938X_ANA_HPH, - 0x40, 0x00); - blocking_notifier_call_chain(&wcd938x->mbhc->notifier, - WCD_EVENT_PRE_HPHR_PA_OFF, - &wcd938x->mbhc->wcd_mbhc); - set_bit(HPH_PA_DELAY, &wcd938x->status_mask); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 7ms sleep is required if compander is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { - if (!wcd938x->comp2_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); - } - blocking_notifier_call_chain(&wcd938x->mbhc->notifier, - WCD_EVENT_POST_HPHR_PA_OFF, - &wcd938x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, WCD938X_ANA_HPH, - 0x10, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL1, 0x17, 0x00); - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHR, - hph_mode); - if (wcd938x->ldoh) - snd_soc_update_bits(codec, - WCD938X_LDOH_MODE, - 0x80, 0x00); - break; - }; - return ret; -} - -static int wcd938x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int hph_mode = wcd938x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (wcd938x->ldoh) - snd_soc_update_bits(codec, - WCD938X_LDOH_MODE, - 0x80, 0x80); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10 | 0x01)); - ret = swr_slvdev_datapath_control(wcd938x->rx_swr_dev, - wcd938x->rx_swr_dev->dev_num, - true); - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHL, - hph_mode); - wcd_clsh_set_hph_mode(codec, CLS_H_HIFI); - snd_soc_update_bits(codec, WCD938X_ANA_HPH, - 0x20, 0x20); - wcd_clsh_set_hph_mode(codec, hph_mode); - /* 100 usec delay as per HW requirement */ - usleep_range(100, 110); - set_bit(HPH_PA_DELAY, &wcd938x->status_mask); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL0, 0x17, 0x13); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * 7ms sleep is required if compander is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { - if (!wcd938x->comp1_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); - } - snd_soc_update_bits(codec, - WCD938X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x02); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || - hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, 0x02, 0x02); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10)); - wcd_enable_irq(&wcd938x->irq_info, - WCD938X_IRQ_HPHL_PDM_WD_INT); - break; - case SND_SOC_DAPM_PRE_PMD: - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10 | 0x1)); - wcd_disable_irq(&wcd938x->irq_info, - WCD938X_IRQ_HPHL_PDM_WD_INT); - if (wcd938x->update_wcd_event && wcd938x->comp1_enable) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST, - (WCD_RX1 << 0x10)); - /* - * 7ms sleep is required if compander is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (!wcd938x->comp1_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - snd_soc_update_bits(codec, WCD938X_ANA_HPH, - 0x80, 0x00); - blocking_notifier_call_chain(&wcd938x->mbhc->notifier, - WCD_EVENT_PRE_HPHL_PA_OFF, - &wcd938x->mbhc->wcd_mbhc); - set_bit(HPH_PA_DELAY, &wcd938x->status_mask); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 7ms sleep is required if compander is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { - if (!wcd938x->comp1_enable) - usleep_range(21000, 21100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); - } - blocking_notifier_call_chain(&wcd938x->mbhc->notifier, - WCD_EVENT_POST_HPHL_PA_OFF, - &wcd938x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, WCD938X_ANA_HPH, - 0x20, 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL0, 0x17, 0x00); - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHL, - hph_mode); - if (wcd938x->ldoh) - snd_soc_update_bits(codec, - WCD938X_LDOH_MODE, - 0x80, 0x00); - break; - }; - return ret; -} - -static int wcd938x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd938x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd938x->rx_swr_dev, - wcd938x->rx_swr_dev->dev_num, - true); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL2, 0x05, 0x05); - break; - case SND_SOC_DAPM_POST_PMU: - /* 1 msec delay as per HW requirement */ - usleep_range(1000, 1010); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || - hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10)); - wcd_enable_irq(&wcd938x->irq_info, WCD938X_IRQ_AUX_PDM_WD_INT); - break; - case SND_SOC_DAPM_PRE_PMD: - wcd_disable_irq(&wcd938x->irq_info, - WCD938X_IRQ_AUX_PDM_WD_INT); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10 | 0x1)); - break; - case SND_SOC_DAPM_POST_PMD: - /* 1 msec delay as per HW requirement */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL2, 0x05, 0x00); - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_AUX, - hph_mode); - - wcd938x->flyback_cur_det_disable--; - if (wcd938x->flyback_cur_det_disable == 0) - snd_soc_update_bits(codec, - WCD938X_FLYBACK_EN, - 0x04, 0x04); - break; - }; - return ret; -} - -static int wcd938x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd938x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd938x->rx_swr_dev, - wcd938x->rx_swr_dev->dev_num, - true); - /* - * Enable watchdog interrupt for HPHL or AUX - * depending on mux value - */ - wcd938x->ear_rx_path = - snd_soc_read( - codec, WCD938X_DIGITAL_CDC_EAR_PATH_CTL); - if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL2, - 0x05, 0x05); - else - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL0, - 0x17, 0x13); - if (!wcd938x->comp1_enable) - snd_soc_update_bits(codec, - WCD938X_ANA_EAR_COMPANDER_CTL, 0x80, 0x80); - break; - case SND_SOC_DAPM_POST_PMU: - /* 6 msec delay as per HW requirement */ - usleep_range(6000, 6010); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || - hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) - snd_soc_update_bits(codec, - WCD938X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10)); - wcd_enable_irq(&wcd938x->irq_info, - WCD938X_IRQ_AUX_PDM_WD_INT); - } else { - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10)); - wcd_enable_irq(&wcd938x->irq_info, - WCD938X_IRQ_HPHL_PDM_WD_INT); - } - break; - case SND_SOC_DAPM_PRE_PMD: - if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { - wcd_disable_irq(&wcd938x->irq_info, - WCD938X_IRQ_AUX_PDM_WD_INT); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10 | 0x1)); - } else { - wcd_disable_irq(&wcd938x->irq_info, - WCD938X_IRQ_HPHL_PDM_WD_INT); - if (wcd938x->update_wcd_event) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10 | 0x1)); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (!wcd938x->comp1_enable) - snd_soc_update_bits(codec, - WCD938X_ANA_EAR_COMPANDER_CTL, 0x80, 0x00); - /* 7 msec delay as per HW requirement */ - usleep_range(7000, 7010); - if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL2, - 0x05, 0x00); - else - snd_soc_update_bits(codec, - WCD938X_DIGITAL_PDM_WD_CTL0, - 0x17, 0x00); - wcd_cls_h_fsm(codec, &wcd938x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_EAR, - hph_mode); - - wcd938x->flyback_cur_det_disable--; - if (wcd938x->flyback_cur_det_disable == 0) - snd_soc_update_bits(codec, - WCD938X_FLYBACK_EN, - 0x04, 0x04); - break; - }; - return ret; -} - -static int wcd938x_enable_clsh(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int mode = wcd938x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - if (mode == CLS_H_LOHIFI || mode == CLS_H_ULP || - mode == CLS_H_HIFI || mode == CLS_H_LP) { - wcd938x_rx_connect_port(codec, CLSH, - SND_SOC_DAPM_EVENT_ON(event)); - } - if (SND_SOC_DAPM_EVENT_OFF(event)) - ret = swr_slvdev_datapath_control( - wcd938x->rx_swr_dev, - wcd938x->rx_swr_dev->dev_num, - false); - return ret; -} - -static int wcd938x_enable_rx1(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_rx_connect_port(codec, HPH_L, true); - if (wcd938x->comp1_enable) - wcd938x_rx_connect_port(codec, COMP_L, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd938x_rx_connect_port(codec, HPH_L, false); - if (wcd938x->comp1_enable) - wcd938x_rx_connect_port(codec, COMP_L, false); - wcd938x_rx_clk_disable(codec); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, - 0x01, 0x00); - break; - }; - - return 0; -} - -static int wcd938x_enable_rx2(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_rx_connect_port(codec, HPH_R, true); - if (wcd938x->comp2_enable) - wcd938x_rx_connect_port(codec, COMP_R, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd938x_rx_connect_port(codec, HPH_R, false); - if (wcd938x->comp2_enable) - wcd938x_rx_connect_port(codec, COMP_R, false); - wcd938x_rx_clk_disable(codec); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, - 0x02, 0x00); - break; - }; - - return 0; -} - -static int wcd938x_enable_rx3(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_rx_connect_port(codec, LO, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd938x_rx_connect_port(codec, LO, false); - /* 6 msec delay as per HW requirement */ - usleep_range(6000, 6010); - wcd938x_rx_clk_disable(codec); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x04, 0x00); - break; - } - - return 0; -} - -static int wcd938x_codec_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - u16 dmic_clk_reg, dmic_clk_en_reg; - s32 *dmic_clk_cnt; - u8 dmic_ctl_shift = 0; - u8 dmic_clk_shift = 0; - u8 dmic_clk_mask = 0; - u16 dmic2_left_en = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (w->shift) { - case 0: - case 1: - dmic_clk_cnt = &(wcd938x->dmic_0_1_clk_cnt); - dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_1_2; - dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC1_CTL; - dmic_clk_mask = 0x0F; - dmic_clk_shift = 0x00; - dmic_ctl_shift = 0x00; - break; - case 2: - dmic2_left_en = WCD938X_DIGITAL_CDC_DMIC2_CTL; - case 3: - dmic_clk_cnt = &(wcd938x->dmic_2_3_clk_cnt); - dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_1_2; - dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC2_CTL; - dmic_clk_mask = 0xF0; - dmic_clk_shift = 0x04; - dmic_ctl_shift = 0x01; - break; - case 4: - case 5: - dmic_clk_cnt = &(wcd938x->dmic_4_5_clk_cnt); - dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_3_4; - dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC3_CTL; - dmic_clk_mask = 0x0F; - dmic_clk_shift = 0x00; - dmic_ctl_shift = 0x02; - break; - case 6: - case 7: - dmic_clk_cnt = &(wcd938x->dmic_6_7_clk_cnt); - dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_3_4; - dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC4_CTL; - dmic_clk_mask = 0xF0; - dmic_clk_shift = 0x04; - dmic_ctl_shift = 0x03; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - }; - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, (w->shift +1), *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_AMIC_CTL, - (0x01 << dmic_ctl_shift), 0x00); - /* 250us sleep as per HW requirement */ - usleep_range(250, 260); - if (dmic2_left_en) - snd_soc_update_bits(codec, - dmic2_left_en, 0x80, 0x80); - /* Setting DMIC clock rate to 2.4MHz */ - snd_soc_update_bits(codec, - dmic_clk_reg, dmic_clk_mask, - (0x03 << dmic_clk_shift)); - snd_soc_update_bits(codec, - dmic_clk_en_reg, 0x08, 0x08); - /* enable clock scaling */ - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DMIC_CTL, 0x06, 0x06); - wcd938x_tx_connect_port(codec, DMIC0 + (w->shift), - SWR_CLK_RATE_2P4MHZ, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd938x_tx_connect_port(codec, DMIC0 + (w->shift), 0, - false); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_AMIC_CTL, - (0x01 << dmic_ctl_shift), - (0x01 << dmic_ctl_shift)); - if (dmic2_left_en) - snd_soc_update_bits(codec, - dmic2_left_en, 0x80, 0x00); - snd_soc_update_bits(codec, - dmic_clk_en_reg, 0x08, 0x00); - break; - }; - return 0; -} - -/* - * wcd938x_get_micb_vout_ctl_val: converts micbias from volts to register value - * @micb_mv: micbias in mv - * - * return register value converted - */ -int wcd938x_get_micb_vout_ctl_val(u32 micb_mv) -{ - /* min micbias voltage is 1V and maximum is 2.85V */ - if (micb_mv < 1000 || micb_mv > 2850) { - pr_err("%s: unsupported micbias voltage\n", __func__); - return -EINVAL; - } - - return (micb_mv - 1000) / 50; -} -EXPORT_SYMBOL(wcd938x_get_micb_vout_ctl_val); - -/* - * wcd938x_mbhc_micb_adjust_voltage: adjust specific micbias voltage - * @codec: handle to snd_soc_codec * - * @req_volt: micbias voltage to be set - * @micb_num: micbias to be set, e.g. micbias1 or micbias2 - * - * return 0 if adjustment is success or error code in case of failure - */ -int wcd938x_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, int micb_num) -{ - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int cur_vout_ctl, req_vout_ctl; - int micb_reg, micb_val, micb_en; - int ret = 0; - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD938X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD938X_ANA_MICB2; - break; - case MIC_BIAS_3: - micb_reg = WCD938X_ANA_MICB3; - break; - case MIC_BIAS_4: - micb_reg = WCD938X_ANA_MICB4; - break; - default: - return -EINVAL; - } - mutex_lock(&wcd938x->micb_lock); - - /* - * If requested micbias voltage is same as current micbias - * voltage, then just return. Otherwise, adjust voltage as - * per requested value. If micbias is already enabled, then - * to avoid slow micbias ramp-up or down enable pull-up - * momentarily, change the micbias value and then re-enable - * micbias. - */ - micb_val = snd_soc_read(codec, micb_reg); - micb_en = (micb_val & 0xC0) >> 6; - cur_vout_ctl = micb_val & 0x3F; - - req_vout_ctl = wcd938x_get_micb_vout_ctl_val(req_volt); - if (req_vout_ctl < 0) { - ret = -EINVAL; - goto exit; - } - if (cur_vout_ctl == req_vout_ctl) { - ret = 0; - goto exit; - } - - dev_dbg(codec->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", - __func__, micb_num, WCD_VOUT_CTL_TO_MICB(cur_vout_ctl), - req_volt, micb_en); - - if (micb_en == 0x1) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - - snd_soc_update_bits(codec, micb_reg, 0x3F, req_vout_ctl); - - if (micb_en == 0x1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - /* - * Add 2ms delay as per HW requirement after enabling - * micbias - */ - usleep_range(2000, 2100); - } -exit: - mutex_unlock(&wcd938x->micb_lock); - return ret; -} -EXPORT_SYMBOL(wcd938x_mbhc_micb_adjust_voltage); - -static int wcd938x_tx_swr_ctrl(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int bank = 0; - u8 mode = 0; - int i = 0; - int rate = 0; - - bank = (wcd938x_swr_slv_get_current_bank(wcd938x->tx_swr_dev, - wcd938x->tx_swr_dev->dev_num) ? 0 : 1); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (strnstr(w->name, "ADC", sizeof("ADC"))) { - if (test_bit(WCD_ADC1, &wcd938x->status_mask)) - mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC1]]; - if (test_bit(WCD_ADC2, &wcd938x->status_mask)) - mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC2]]; - if (test_bit(WCD_ADC3, &wcd938x->status_mask)) - mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC3]]; - if (test_bit(WCD_ADC4, &wcd938x->status_mask)) - mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC4]]; - - if (mode != 0) { - for (i = 0; i < ADC_MODE_ULP2; i++) { - if (mode & (1 << i)) { - i++; - break; - } - } - } - rate = wcd938x_get_clk_rate(i); - wcd938x_set_swr_clk_rate(codec, mode, bank); - } - ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev, - wcd938x->tx_swr_dev->dev_num, - true); - if (strnstr(w->name, "ADC", sizeof("ADC"))) { - /* Copy clk settings to active bank */ - wcd938x_set_swr_clk_rate(codec, rate, !bank); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (strnstr(w->name, "ADC", sizeof("ADC"))) { - rate = wcd938x_get_clk_rate(ADC_MODE_INVALID); - wcd938x_set_swr_clk_rate(codec, rate, !bank); - } - ret = swr_slvdev_datapath_control(wcd938x->tx_swr_dev, - wcd938x->tx_swr_dev->dev_num, - false); - if (strnstr(w->name, "ADC", sizeof("ADC"))) - wcd938x_set_swr_clk_rate(codec, rate, bank); - break; - }; - - return ret; -} - -static int wcd938x_get_adc_mode(int val) -{ - int ret = 0; - - switch (val) { - case ADC_MODE_INVALID: - ret = ADC_MODE_VAL_NORMAL; - break; - case ADC_MODE_HIFI: - ret = ADC_MODE_VAL_HIFI; - break; - case ADC_MODE_LO_HIF: - ret = ADC_MODE_VAL_LO_HIF; - break; - case ADC_MODE_NORMAL: - ret = ADC_MODE_VAL_NORMAL; - break; - case ADC_MODE_LP: - ret = ADC_MODE_VAL_LP; - break; - case ADC_MODE_ULP1: - ret = ADC_MODE_VAL_ULP1; - break; - case ADC_MODE_ULP2: - ret = ADC_MODE_VAL_ULP2; - break; - default: - ret = -EINVAL; - pr_err("%s: invalid ADC mode value %d\n", __func__, val); - break; - } - return ret; -} - -static int wcd938x_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event){ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int clk_rate = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x08); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); - set_bit(w->shift, &wcd938x->status_mask); - clk_rate = wcd938x_get_clk_rate(wcd938x->tx_mode[w->shift]); - /* Enable BCS for Headset mic */ - if (w->shift == 1 && !(snd_soc_read(codec, - WCD938X_TX_NEW_AMIC_MUX_CFG) & 0x80)) { - if (!wcd938x->bcs_dis) - wcd938x_tx_connect_port(codec, MBHC, - SWR_CLK_RATE_4P8MHZ, true); - set_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask); - } - wcd938x_tx_connect_port(codec, ADC1 + (w->shift), clk_rate, - true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd938x_tx_connect_port(codec, ADC1 + (w->shift), 0, false); - if (w->shift == 1 && - test_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask)) { - if (!wcd938x->bcs_dis) - wcd938x_tx_connect_port(codec, MBHC, 0, - false); - clear_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask); - } - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x00); - clear_bit(w->shift, &wcd938x->status_mask); - break; - }; - - return 0; -} - -void wcd938x_disable_bcs_before_slow_insert(struct snd_soc_codec *codec, - bool bcs_disable) -{ - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - if (wcd938x->update_wcd_event) { - if (bcs_disable) - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_BCS_CLK_OFF, 0); - else - wcd938x->update_wcd_event(wcd938x->handle, - WCD_BOLERO_EVT_BCS_CLK_OFF, 1); - } -} - -int wcd938x_tx_channel_config(struct snd_soc_codec *codec, - int channel, int mode) -{ - int reg = WCD938X_ANA_TX_CH2, mask = 0, val = 0; - int ret = 0; - - switch (channel) { - case 0: - reg = WCD938X_ANA_TX_CH2; - mask = 0x40; - break; - case 1: - reg = WCD938X_ANA_TX_CH2; - mask = 0x20; - break; - case 2: - reg = WCD938X_ANA_TX_CH4; - mask = 0x40; - break; - case 3: - reg = WCD938X_ANA_TX_CH4; - mask = 0x20; - break; - default: - pr_err("%s: Invalid channel num %d\n", __func__, channel); - ret = -EINVAL; - break; - } - - if (!mode) - val = 0x00; - else - val = mask; - - if (!ret) - snd_soc_update_bits(codec, reg, mask, val); - - return ret; -} - -static int wcd938x_enable_req(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = - snd_soc_dapm_to_codec(w->dapm); - int mode; - int ret = 0; - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_REQ_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_REQ_CTL, 0x01, 0x00); - ret = wcd938x_tx_channel_config(codec, w->shift, 1); - mode = wcd938x_get_adc_mode(wcd938x->tx_mode[w->shift]); - if (mode < 0) { - dev_info(codec->dev, - "%s: invalid mode, setting to normal mode\n", - __func__); - mode = ADC_MODE_VAL_NORMAL; - } - switch (w->shift) { - case 0: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0x0F, - mode); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x10, 0x10); - break; - case 1: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0xF0, - mode << 4); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x20, 0x20); - break; - case 2: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0x0F, - mode); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x40, 0x40); - break; - case 3: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0xF0, - mode << 4); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x80, 0x80); - break; - default: - break; - } - ret |= wcd938x_tx_channel_config(codec, w->shift, 0); - break; - case SND_SOC_DAPM_POST_PMD: - switch (w->shift) { - case 0: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x10, 0x00); - break; - case 1: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0xF0, - 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x20, 0x00); - break; - case 2: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x40, 0x00); - break; - case 3: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0xF0, - 0x00); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0x80, 0x00); - break; - default: - break; - } - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x00); - break; - }; - return ret; -} - -int wcd938x_micbias_control(struct snd_soc_codec *codec, - int micb_num, int req, bool is_dapm) -{ - - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int micb_index = micb_num - 1; - u16 micb_reg; - int pre_off_event = 0, post_off_event = 0; - int post_on_event = 0, post_dapm_off = 0; - int post_dapm_on = 0; - int ret = 0; - - if ((micb_index < 0) || (micb_index > WCD938X_MAX_MICBIAS - 1)) { - dev_err(codec->dev, - "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - - if (NULL == wcd938x) { - dev_err(codec->dev, - "%s: wcd938x private data is NULL\n", __func__); - return -EINVAL; - } - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD938X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD938X_ANA_MICB2; - pre_off_event = WCD_EVENT_PRE_MICBIAS_2_OFF; - post_off_event = WCD_EVENT_POST_MICBIAS_2_OFF; - post_on_event = WCD_EVENT_POST_MICBIAS_2_ON; - post_dapm_on = WCD_EVENT_POST_DAPM_MICBIAS_2_ON; - post_dapm_off = WCD_EVENT_POST_DAPM_MICBIAS_2_OFF; - break; - case MIC_BIAS_3: - micb_reg = WCD938X_ANA_MICB3; - break; - case MIC_BIAS_4: - micb_reg = WCD938X_ANA_MICB4; - break; - default: - dev_err(codec->dev, "%s: Invalid micbias number: %d\n", - __func__, micb_num); - return -EINVAL; - }; - mutex_lock(&wcd938x->micb_lock); - - switch (req) { - case MICB_PULLUP_ENABLE: - if (!wcd938x->dev_up) { - dev_dbg(codec->dev, "%s: enable req %d wcd device down\n", - __func__, req); - ret = -ENODEV; - goto done; - } - wcd938x->pullup_ref[micb_index]++; - if ((wcd938x->pullup_ref[micb_index] == 1) && - (wcd938x->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, - 0xC0, 0x80); - break; - case MICB_PULLUP_DISABLE: - if (wcd938x->pullup_ref[micb_index] > 0) - wcd938x->pullup_ref[micb_index]--; - if (!wcd938x->dev_up) { - dev_dbg(codec->dev, "%s: enable req %d wcd device down\n", - __func__, req); - ret = -ENODEV; - goto done; - } - if ((wcd938x->pullup_ref[micb_index] == 0) && - (wcd938x->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, - 0xC0, 0x00); - break; - case MICB_ENABLE: - if (!wcd938x->dev_up) { - dev_dbg(codec->dev, "%s: enable req %d wcd device down\n", - __func__, req); - ret = -ENODEV; - goto done; - } - wcd938x->micb_ref[micb_index]++; - if (wcd938x->micb_ref[micb_index] == 1) { - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0xE0, 0xE0); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, - WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_MICB1_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_MICB2_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_MICB3_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, - WCD938X_MICB4_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, - micb_reg, 0xC0, 0x40); - if (post_on_event) - blocking_notifier_call_chain( - &wcd938x->mbhc->notifier, - post_on_event, - &wcd938x->mbhc->wcd_mbhc); - } - if (is_dapm && post_dapm_on && wcd938x->mbhc) - blocking_notifier_call_chain(&wcd938x->mbhc->notifier, - post_dapm_on, - &wcd938x->mbhc->wcd_mbhc); - break; - case MICB_DISABLE: - if (wcd938x->micb_ref[micb_index] > 0) - wcd938x->micb_ref[micb_index]--; - if (!wcd938x->dev_up) { - dev_dbg(codec->dev, "%s: enable req %d wcd device down\n", - __func__, req); - ret = -ENODEV; - goto done; - } - if ((wcd938x->micb_ref[micb_index] == 0) && - (wcd938x->pullup_ref[micb_index] > 0)) - snd_soc_update_bits(codec, micb_reg, - 0xC0, 0x80); - else if ((wcd938x->micb_ref[micb_index] == 0) && - (wcd938x->pullup_ref[micb_index] == 0)) { - if (pre_off_event && wcd938x->mbhc) - blocking_notifier_call_chain( - &wcd938x->mbhc->notifier, - pre_off_event, - &wcd938x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, micb_reg, - 0xC0, 0x00); - if (post_off_event && wcd938x->mbhc) - blocking_notifier_call_chain( - &wcd938x->mbhc->notifier, - post_off_event, - &wcd938x->mbhc->wcd_mbhc); - } - if (is_dapm && post_dapm_off && wcd938x->mbhc) - blocking_notifier_call_chain(&wcd938x->mbhc->notifier, - post_dapm_off, - &wcd938x->mbhc->wcd_mbhc); - break; - }; - - dev_dbg(codec->dev, - "%s: micb_num:%d, micb_ref: %d, pullup_ref: %d\n", - __func__, micb_num, wcd938x->micb_ref[micb_index], - wcd938x->pullup_ref[micb_index]); - -done: - mutex_unlock(&wcd938x->micb_lock); - return ret; -} -EXPORT_SYMBOL(wcd938x_micbias_control); - -static int wcd938x_get_logical_addr(struct swr_device *swr_dev) -{ - int ret = 0; - uint8_t devnum = 0; - int num_retry = NUM_ATTEMPTS; - - do { - ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum); - if (ret) { - dev_err(&swr_dev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, swr_dev->addr); - /* retry after 1ms */ - usleep_range(1000, 1010); - } - } while (ret && --num_retry); - swr_dev->dev_num = devnum; - return 0; -} - -static int wcd938x_event_notify(struct notifier_block *block, - unsigned long val, - void *data) -{ - u16 event = (val & 0xffff); - int ret = 0; - struct wcd938x_priv *wcd938x = dev_get_drvdata((struct device *)data); - struct snd_soc_codec *codec = wcd938x->codec; - struct wcd_mbhc *mbhc; - - switch (event) { - case BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR: - if (test_bit(WCD_ADC1, &wcd938x->status_mask)) { - snd_soc_update_bits(codec, - WCD938X_ANA_TX_CH2, 0x40, 0x00); - clear_bit(WCD_ADC1, &wcd938x->status_mask); - } - if (test_bit(WCD_ADC2, &wcd938x->status_mask)) { - snd_soc_update_bits(codec, - WCD938X_ANA_TX_CH2, 0x20, 0x00); - clear_bit(WCD_ADC2, &wcd938x->status_mask); - } - if (test_bit(WCD_ADC3, &wcd938x->status_mask)) { - snd_soc_update_bits(codec, - WCD938X_ANA_TX_CH4, 0x40, 0x00); - clear_bit(WCD_ADC3, &wcd938x->status_mask); - } - if (test_bit(WCD_ADC4, &wcd938x->status_mask)) { - snd_soc_update_bits(codec, - WCD938X_ANA_TX_CH4, 0x20, 0x00); - clear_bit(WCD_ADC4, &wcd938x->status_mask); - } - break; - case BOLERO_WCD_EVT_PA_OFF_PRE_SSR: - snd_soc_update_bits(codec, WCD938X_ANA_HPH, - 0xC0, 0x00); - snd_soc_update_bits(codec, WCD938X_ANA_EAR, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD938X_AUX_AUXPA, - 0x80, 0x00); - break; - case BOLERO_WCD_EVT_SSR_DOWN: - wcd938x->dev_up = false; - wcd938x->mbhc->wcd_mbhc.deinit_in_progress = true; - mbhc = &wcd938x->mbhc->wcd_mbhc; - wcd938x_mbhc_ssr_down(wcd938x->mbhc, codec); - wcd938x_reset_low(wcd938x->dev); - break; - case BOLERO_WCD_EVT_SSR_UP: - wcd938x_reset(wcd938x->dev); - /* allow reset to take effect */ - usleep_range(10000, 10010); - - wcd938x_get_logical_addr(wcd938x->tx_swr_dev); - wcd938x_get_logical_addr(wcd938x->rx_swr_dev); - - wcd938x_init_reg(codec); - regcache_mark_dirty(wcd938x->regmap); - regcache_sync(wcd938x->regmap); - /* Initialize MBHC module */ - mbhc = &wcd938x->mbhc->wcd_mbhc; - ret = wcd938x_mbhc_post_ssr_init(wcd938x->mbhc, codec); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - } else { - wcd938x_mbhc_hs_detect(codec, mbhc->mbhc_cfg); - } - wcd938x->mbhc->wcd_mbhc.deinit_in_progress = false; - wcd938x->dev_up = true; - break; - case BOLERO_WCD_EVT_CLK_NOTIFY: - snd_soc_update_bits(codec, - WCD938X_DIGITAL_TOP_CLK_CFG, 0x06, - ((val >> 0x10) << 0x01)); - break; - default: - dev_dbg(codec->dev, "%s: invalid event %d\n", __func__, event); - break; - } - return 0; -} - -static int __wcd938x_codec_enable_micbias(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2"))) - micb_num = MIC_BIAS_2; - else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3"))) - micb_num = MIC_BIAS_3; - else if (strnstr(w->name, "MIC BIAS4", sizeof("MIC BIAS4"))) - micb_num = MIC_BIAS_4; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_micbias_control(codec, micb_num, - MICB_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - /* 1 msec delay as per HW requirement */ - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - wcd938x_micbias_control(codec, micb_num, - MICB_DISABLE, true); - break; - }; - - return 0; - -} - -static int wcd938x_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - return __wcd938x_codec_enable_micbias(w, event); -} - -static int __wcd938x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "VA MIC BIAS1", sizeof("VA MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else if (strnstr(w->name, "VA MIC BIAS2", sizeof("VA MIC BIAS2"))) - micb_num = MIC_BIAS_2; - else if (strnstr(w->name, "VA MIC BIAS3", sizeof("VA MIC BIAS3"))) - micb_num = MIC_BIAS_3; - else if (strnstr(w->name, "VA MIC BIAS4", sizeof("VA MIC BIAS4"))) - micb_num = MIC_BIAS_4; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd938x_micbias_control(codec, micb_num, - MICB_PULLUP_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - /* 1 msec delay as per HW requirement */ - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - wcd938x_micbias_control(codec, micb_num, - MICB_PULLUP_DISABLE, true); - break; - }; - - return 0; - -} - -static int wcd938x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - return __wcd938x_codec_enable_micbias_pullup(w, event); -} - -static inline int wcd938x_tx_path_get(const char *wname, - unsigned int *path_num) -{ - int ret = 0; - char *widget_name = NULL; - char *w_name = NULL; - char *path_num_char = NULL; - char *path_name = NULL; - - widget_name = kstrndup(wname, 9, GFP_KERNEL); - if (!widget_name) - return -EINVAL; - - w_name = widget_name; - - path_name = strsep(&widget_name, " "); - if (!path_name) { - pr_err("%s: Invalid widget name = %s\n", - __func__, widget_name); - ret = -EINVAL; - goto err; - } - path_num_char = strpbrk(path_name, "0123"); - if (!path_num_char) { - pr_err("%s: tx path index not found\n", - __func__); - ret = -EINVAL; - goto err; - } - ret = kstrtouint(path_num_char, 10, path_num); - if (ret < 0) - pr_err("%s: Invalid tx path = %s\n", - __func__, w_name); - -err: - kfree(w_name); - return ret; -} - -static int wcd938x_tx_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = NULL; - int ret = 0; - unsigned int path = 0; - - if (!codec) - return -EINVAL; - - wcd938x = snd_soc_codec_get_drvdata(codec); - - if (!widget || !widget->name || !wcd938x) - return -EINVAL; - - ret = wcd938x_tx_path_get(kcontrol->id.name, &path); - if (ret < 0) - return ret; - - ucontrol->value.integer.value[0] = wcd938x->tx_mode[path]; - - return 0; -} - -static int wcd938x_tx_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = NULL; - u32 mode_val; - unsigned int path = 0; - int ret = 0; - - if (!codec) - return -EINVAL; - - wcd938x = snd_soc_codec_get_drvdata(codec); - - if (!wcd938x) - return -EINVAL; - - ret = wcd938x_tx_path_get(kcontrol->id.name, &path); - if (ret) - return ret; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - wcd938x->tx_mode[path] = mode_val; - - return 0; -} - -static int wcd938x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wcd938x->hph_mode; - return 0; -} - -static int wcd938x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - u32 mode_val; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (wcd938x->variant == WCD9380) { - if (mode_val == CLS_H_HIFI || mode_val == CLS_AB_HIFI) { - dev_info(codec->dev, - "%s:Invalid HPH Mode, default to CLS_H_ULP\n", - __func__); - mode_val = CLS_H_ULP; - } - } - if (mode_val == CLS_H_NORMAL) { - dev_info(codec->dev, - "%s:Invalid HPH Mode, default to class_AB\n", - __func__); - mode_val = CLS_H_ULP; - } - wcd938x->hph_mode = mode_val; - return 0; -} - -static int wcd938x_ear_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain = 0; - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - - ear_pa_gain = snd_soc_read(codec, - WCD938X_ANA_EAR_COMPANDER_CTL); - - ear_pa_gain = (ear_pa_gain & 0x7C) >> 2; - - ucontrol->value.integer.value[0] = ear_pa_gain; - - dev_dbg(codec->dev, "%s: ear_pa_gain = 0x%x\n", __func__, - ear_pa_gain); - - return 0; -} - -static int wcd938x_ear_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain = 0; - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - ear_pa_gain = ucontrol->value.integer.value[0] << 2; - - if (!wcd938x->comp1_enable) { - snd_soc_update_bits(codec, - WCD938X_ANA_EAR_COMPANDER_CTL, - 0x7C, ear_pa_gain); - } - - return 0; -} - -static int wcd938x_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - bool hphr; - struct soc_multi_mixer_control *mc; - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - - ucontrol->value.integer.value[0] = hphr ? wcd938x->comp2_enable : - wcd938x->comp1_enable; - return 0; -} - -static int wcd938x_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - bool hphr; - struct soc_multi_mixer_control *mc; - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - if (hphr) - wcd938x->comp2_enable = value; - else - wcd938x->comp1_enable = value; - - return 0; -} - -static int wcd938x_codec_enable_vdd_buck(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - struct wcd938x_pdata *pdata = NULL; - int ret = 0; - - pdata = dev_get_platdata(wcd938x->dev); - - if (!pdata) { - dev_err(codec->dev, "%s: pdata is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (test_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask)) { - dev_dbg(codec->dev, - "%s: buck already in enabled state\n", - __func__); - clear_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask); - return 0; - } - ret = msm_cdc_enable_ondemand_supply(wcd938x->dev, - wcd938x->supplies, - pdata->regulator, - pdata->num_supplies, - "cdc-vdd-buck"); - if (ret == -EINVAL) { - dev_err(codec->dev, "%s: vdd buck is not enabled\n", - __func__); - return ret; - } - clear_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask); - /* - * 200us sleep is required after LDO15 is enabled as per - * HW requirement - */ - usleep_range(200, 250); - break; - case SND_SOC_DAPM_POST_PMD: - set_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask); - break; - } - return 0; -} - -static int wcd938x_ldoh_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wcd938x->ldoh; - - return 0; -} - -static int wcd938x_ldoh_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - wcd938x->ldoh = ucontrol->value.integer.value[0]; - - return 0; -} - -static int wcd938x_bcs_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wcd938x->bcs_dis; - - return 0; -} - -static int wcd938x_bcs_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = - snd_soc_kcontrol_codec(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - wcd938x->bcs_dis = ucontrol->value.integer.value[0]; - - return 0; -} - -static const char * const tx_mode_mux_text_wcd9380[] = { - "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", -}; - -static const struct soc_enum tx_mode_mux_enum_wcd9380 = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tx_mode_mux_text_wcd9380), - tx_mode_mux_text_wcd9380); - -static const char * const tx_mode_mux_text[] = { - "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", - "ADC_ULP1", "ADC_ULP2", -}; - -static const struct soc_enum tx_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tx_mode_mux_text), - tx_mode_mux_text); - -static const char * const rx_hph_mode_mux_text_wcd9380[] = { - "CLS_H_INVALID", "CLS_H_INVALID_1", "CLS_H_LP", "CLS_AB", - "CLS_H_LOHIFI", "CLS_H_ULP", "CLS_H_INVALID_2", "CLS_AB_LP", - "CLS_AB_LOHIFI", -}; - -static const char * const wcd938x_ear_pa_gain_text[] = { - "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", "G_0_DB", - "G_M1P5_DB", "G_M3_DB", "G_M4P5_DB", - "G_M6_DB", "G_7P5_DB", "G_M9_DB", - "G_M10P5_DB", "G_M12_DB", "G_M13P5_DB", - "G_M15_DB", "G_M16P5_DB", "G_M18_DB", -}; - -static const struct soc_enum rx_hph_mode_mux_enum_wcd9380 = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text_wcd9380), - rx_hph_mode_mux_text_wcd9380); - -static SOC_ENUM_SINGLE_EXT_DECL(wcd938x_ear_pa_gain_enum, - wcd938x_ear_pa_gain_text); - -static const char * const rx_hph_mode_mux_text[] = { - "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", - "CLS_H_ULP", "CLS_AB_HIFI", "CLS_AB_LP", "CLS_AB_LOHIFI", -}; - -static const struct soc_enum rx_hph_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), - rx_hph_mode_mux_text); - -static const struct snd_kcontrol_new wcd9380_snd_controls[] = { - SOC_ENUM_EXT("EAR PA GAIN", wcd938x_ear_pa_gain_enum, - wcd938x_ear_pa_gain_get, wcd938x_ear_pa_gain_put), - - SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum_wcd9380, - wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), - - SOC_ENUM_EXT("TX0 MODE", tx_mode_mux_enum_wcd9380, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), - SOC_ENUM_EXT("TX1 MODE", tx_mode_mux_enum_wcd9380, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), - SOC_ENUM_EXT("TX2 MODE", tx_mode_mux_enum_wcd9380, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), - SOC_ENUM_EXT("TX3 MODE", tx_mode_mux_enum_wcd9380, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), -}; - -static const struct snd_kcontrol_new wcd9385_snd_controls[] = { - SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, - wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), - - SOC_ENUM_EXT("TX0 MODE", tx_mode_mux_enum, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), - SOC_ENUM_EXT("TX1 MODE", tx_mode_mux_enum, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), - SOC_ENUM_EXT("TX2 MODE", tx_mode_mux_enum, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), - SOC_ENUM_EXT("TX3 MODE", tx_mode_mux_enum, - wcd938x_tx_mode_get, wcd938x_tx_mode_put), -}; - -static const struct snd_kcontrol_new wcd938x_snd_controls[] = { - SOC_SINGLE_EXT("HPHL_COMP Switch", SND_SOC_NOPM, 0, 1, 0, - wcd938x_get_compander, wcd938x_set_compander), - SOC_SINGLE_EXT("HPHR_COMP Switch", SND_SOC_NOPM, 1, 1, 0, - wcd938x_get_compander, wcd938x_set_compander), - SOC_SINGLE_EXT("LDOH Enable", SND_SOC_NOPM, 0, 1, 0, - wcd938x_ldoh_get, wcd938x_ldoh_put), - - SOC_SINGLE_EXT("ADC2_BCS Disable", SND_SOC_NOPM, 0, 1, 0, - wcd938x_bcs_get, wcd938x_bcs_put), - - SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 20, 1, line_gain), - SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 20, 1, line_gain), - SOC_SINGLE_TLV("ADC1 Volume", WCD938X_ANA_TX_CH1, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC2 Volume", WCD938X_ANA_TX_CH2, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC3 Volume", WCD938X_ANA_TX_CH3, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC4 Volume", WCD938X_ANA_TX_CH4, 0, 20, 0, - analog_gain), -}; - -static const struct snd_kcontrol_new adc1_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new adc2_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new adc3_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new adc4_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic1_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic2_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic3_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic4_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic5_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic6_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic7_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic8_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new ear_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new aux_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new hphl_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new hphr_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const char * const adc2_mux_text[] = { - "INP2", "INP3" -}; - -static const struct soc_enum adc2_enum = - SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 7, - ARRAY_SIZE(adc2_mux_text), adc2_mux_text); - -static const struct snd_kcontrol_new tx_adc2_mux = - SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum); - -static const char * const adc3_mux_text[] = { - "INP4", "INP6" -}; - -static const struct soc_enum adc3_enum = - SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 6, - ARRAY_SIZE(adc3_mux_text), adc3_mux_text); - -static const struct snd_kcontrol_new tx_adc3_mux = - SOC_DAPM_ENUM("ADC3 MUX Mux", adc3_enum); - -static const char * const adc4_mux_text[] = { - "INP5", "INP7" -}; - -static const struct soc_enum adc4_enum = - SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 5, - ARRAY_SIZE(adc4_mux_text), adc4_mux_text); - -static const struct snd_kcontrol_new tx_adc4_mux = - SOC_DAPM_ENUM("ADC4 MUX Mux", adc4_enum); - -static const char * const rdac3_mux_text[] = { - "RX1", "RX3" -}; - -static const char * const hdr12_mux_text[] = { - "NO_HDR12", "HDR12" -}; - -static const struct soc_enum hdr12_enum = - SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 4, - ARRAY_SIZE(hdr12_mux_text), hdr12_mux_text); - -static const struct snd_kcontrol_new tx_hdr12_mux = - SOC_DAPM_ENUM("HDR12 MUX Mux", hdr12_enum); - -static const char * const hdr34_mux_text[] = { - "NO_HDR34", "HDR34" -}; - -static const struct soc_enum hdr34_enum = - SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 3, - ARRAY_SIZE(hdr34_mux_text), hdr34_mux_text); - -static const struct snd_kcontrol_new tx_hdr34_mux = - SOC_DAPM_ENUM("HDR34 MUX Mux", hdr34_enum); - -static const struct soc_enum rdac3_enum = - SOC_ENUM_SINGLE(WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0, - ARRAY_SIZE(rdac3_mux_text), rdac3_mux_text); - -static const struct snd_kcontrol_new rx_rdac3_mux = - SOC_DAPM_ENUM("RDAC3_MUX Mux", rdac3_enum); - -static const struct snd_soc_dapm_widget wcd938x_dapm_widgets[] = { - - /*input widgets*/ - SND_SOC_DAPM_INPUT("AMIC1"), - SND_SOC_DAPM_INPUT("AMIC2"), - SND_SOC_DAPM_INPUT("AMIC3"), - SND_SOC_DAPM_INPUT("AMIC4"), - SND_SOC_DAPM_INPUT("AMIC5"), - SND_SOC_DAPM_INPUT("AMIC6"), - SND_SOC_DAPM_INPUT("AMIC7"), - SND_SOC_DAPM_INPUT("IN1_HPHL"), - SND_SOC_DAPM_INPUT("IN2_HPHR"), - SND_SOC_DAPM_INPUT("IN3_AUX"), - - /*tx widgets*/ - SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0, - wcd938x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0, - wcd938x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("ADC4", NULL, SND_SOC_NOPM, 3, 0, - wcd938x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC7", NULL, SND_SOC_NOPM, 6, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC8", NULL, SND_SOC_NOPM, 7, 0, - wcd938x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("ADC1 REQ", SND_SOC_NOPM, 0, 0, - NULL, 0, wcd938x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 1, 0, - NULL, 0, wcd938x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC3 REQ", SND_SOC_NOPM, 2, 0, - NULL, 0, wcd938x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC4 REQ", SND_SOC_NOPM, 3, 0, - NULL, 0, wcd938x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, - &tx_adc2_mux), - SND_SOC_DAPM_MUX("ADC3 MUX", SND_SOC_NOPM, 0, 0, - &tx_adc3_mux), - SND_SOC_DAPM_MUX("ADC4 MUX", SND_SOC_NOPM, 0, 0, - &tx_adc4_mux), - SND_SOC_DAPM_MUX("HDR12 MUX", SND_SOC_NOPM, 0, 0, - &tx_hdr12_mux), - SND_SOC_DAPM_MUX("HDR34 MUX", SND_SOC_NOPM, 0, 0, - &tx_hdr34_mux), - /*tx mixers*/ - SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, 0, 0, - adc1_switch, ARRAY_SIZE(adc1_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, 0, 0, - adc2_switch, ARRAY_SIZE(adc2_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, 0, 0, adc3_switch, - ARRAY_SIZE(adc3_switch), wcd938x_tx_swr_ctrl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC4_MIXER", SND_SOC_NOPM, 0, 0, adc4_switch, - ARRAY_SIZE(adc4_switch), wcd938x_tx_swr_ctrl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, 0, - 0, dmic1_switch, ARRAY_SIZE(dmic1_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, 0, - 0, dmic2_switch, ARRAY_SIZE(dmic2_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, 0, - 0, dmic3_switch, ARRAY_SIZE(dmic3_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, 0, - 0, dmic4_switch, ARRAY_SIZE(dmic4_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, 0, - 0, dmic5_switch, ARRAY_SIZE(dmic5_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, 0, - 0, dmic6_switch, ARRAY_SIZE(dmic6_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC7_MIXER", SND_SOC_NOPM, 0, - 0, dmic7_switch, ARRAY_SIZE(dmic7_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC8_MIXER", SND_SOC_NOPM, 0, - 0, dmic8_switch, ARRAY_SIZE(dmic8_switch), - wcd938x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - /* micbias widgets*/ - SND_SOC_DAPM_MICBIAS_E("MIC BIAS1", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS2", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS3", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS4", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_vdd_buck, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("CLS_H_PORT", 1, SND_SOC_NOPM, 0, 0, - wcd938x_enable_clsh, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /*rx widgets*/ - SND_SOC_DAPM_PGA_E("EAR PGA", WCD938X_ANA_EAR, 7, 0, NULL, 0, - wcd938x_codec_enable_ear_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("AUX PGA", WCD938X_AUX_AUXPA, 7, 0, NULL, 0, - wcd938x_codec_enable_aux_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHL PGA", WCD938X_ANA_HPH, 7, 0, NULL, 0, - wcd938x_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHR PGA", WCD938X_ANA_HPH, 6, 0, NULL, 0, - wcd938x_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_DAC_E("RDAC1", NULL, SND_SOC_NOPM, 0, 0, - wcd938x_codec_hphl_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC2", NULL, SND_SOC_NOPM, 0, 0, - wcd938x_codec_hphr_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC3", NULL, SND_SOC_NOPM, 0, 0, - wcd938x_codec_ear_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC4", NULL, SND_SOC_NOPM, 0, 0, - wcd938x_codec_aux_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("RDAC3_MUX", SND_SOC_NOPM, 0, 0, &rx_rdac3_mux), - - SND_SOC_DAPM_MIXER_E("RX1", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd938x_enable_rx1, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX2", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd938x_enable_rx2, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX3", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd938x_enable_rx3, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - /* rx mixer widgets*/ - - SND_SOC_DAPM_MIXER("EAR_RDAC", SND_SOC_NOPM, 0, 0, - ear_rdac_switch, ARRAY_SIZE(ear_rdac_switch)), - SND_SOC_DAPM_MIXER("AUX_RDAC", SND_SOC_NOPM, 0, 0, - aux_rdac_switch, ARRAY_SIZE(aux_rdac_switch)), - SND_SOC_DAPM_MIXER("HPHL_RDAC", SND_SOC_NOPM, 0, 0, - hphl_rdac_switch, ARRAY_SIZE(hphl_rdac_switch)), - SND_SOC_DAPM_MIXER("HPHR_RDAC", SND_SOC_NOPM, 0, 0, - hphr_rdac_switch, ARRAY_SIZE(hphr_rdac_switch)), - - /*output widgets tx*/ - SND_SOC_DAPM_OUTPUT("ADC1_OUTPUT"), - SND_SOC_DAPM_OUTPUT("ADC2_OUTPUT"), - SND_SOC_DAPM_OUTPUT("ADC3_OUTPUT"), - SND_SOC_DAPM_OUTPUT("ADC4_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC1_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC2_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC3_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC4_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC5_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC6_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC7_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC8_OUTPUT"), - - /*output widgets rx*/ - SND_SOC_DAPM_OUTPUT("EAR"), - SND_SOC_DAPM_OUTPUT("AUX"), - SND_SOC_DAPM_OUTPUT("HPHL"), - SND_SOC_DAPM_OUTPUT("HPHR"), - - /* micbias pull up widgets*/ - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias_pullup, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS2", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias_pullup, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS3", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias_pullup, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS4", SND_SOC_NOPM, 0, 0, - wcd938x_codec_enable_micbias_pullup, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route wcd938x_audio_map[] = { - - {"ADC1_OUTPUT", NULL, "ADC1_MIXER"}, - {"ADC1_MIXER", "Switch", "ADC1 REQ"}, - {"ADC1 REQ", NULL, "ADC1"}, - {"ADC1", NULL, "AMIC1"}, - - {"ADC2_OUTPUT", NULL, "ADC2_MIXER"}, - {"ADC2_MIXER", "Switch", "ADC2 REQ"}, - {"ADC2 REQ", NULL, "ADC2"}, - {"ADC2", NULL, "HDR12 MUX"}, - {"HDR12 MUX", "NO_HDR12", "ADC2 MUX"}, - {"HDR12 MUX", "HDR12", "AMIC1"}, - {"ADC2 MUX", "INP3", "AMIC3"}, - {"ADC2 MUX", "INP2", "AMIC2"}, - - {"ADC3_OUTPUT", NULL, "ADC3_MIXER"}, - {"ADC3_MIXER", "Switch", "ADC3 REQ"}, - {"ADC3 REQ", NULL, "ADC3"}, - {"ADC3", NULL, "HDR34 MUX"}, - {"HDR34 MUX", "NO_HDR34", "ADC3 MUX"}, - {"HDR34 MUX", "HDR34", "AMIC5"}, - {"ADC3 MUX", "INP4", "AMIC4"}, - {"ADC3 MUX", "INP6", "AMIC6"}, - - {"ADC4_OUTPUT", NULL, "ADC4_MIXER"}, - {"ADC4_MIXER", "Switch", "ADC4 REQ"}, - {"ADC4 REQ", NULL, "ADC4"}, - {"ADC4", NULL, "ADC4 MUX"}, - {"ADC4 MUX", "INP5", "AMIC5"}, - {"ADC4 MUX", "INP7", "AMIC7"}, - - {"DMIC1_OUTPUT", NULL, "DMIC1_MIXER"}, - {"DMIC1_MIXER", "Switch", "DMIC1"}, - - {"DMIC2_OUTPUT", NULL, "DMIC2_MIXER"}, - {"DMIC2_MIXER", "Switch", "DMIC2"}, - - {"DMIC3_OUTPUT", NULL, "DMIC3_MIXER"}, - {"DMIC3_MIXER", "Switch", "DMIC3"}, - - {"DMIC4_OUTPUT", NULL, "DMIC4_MIXER"}, - {"DMIC4_MIXER", "Switch", "DMIC4"}, - - {"DMIC5_OUTPUT", NULL, "DMIC5_MIXER"}, - {"DMIC5_MIXER", "Switch", "DMIC5"}, - - {"DMIC6_OUTPUT", NULL, "DMIC6_MIXER"}, - {"DMIC6_MIXER", "Switch", "DMIC6"}, - - {"DMIC7_OUTPUT", NULL, "DMIC7_MIXER"}, - {"DMIC7_MIXER", "Switch", "DMIC7"}, - - {"DMIC8_OUTPUT", NULL, "DMIC8_MIXER"}, - {"DMIC8_MIXER", "Switch", "DMIC8"}, - - {"IN1_HPHL", NULL, "VDD_BUCK"}, - {"IN1_HPHL", NULL, "CLS_H_PORT"}, - {"RX1", NULL, "IN1_HPHL"}, - {"RDAC1", NULL, "RX1"}, - {"HPHL_RDAC", "Switch", "RDAC1"}, - {"HPHL PGA", NULL, "HPHL_RDAC"}, - {"HPHL", NULL, "HPHL PGA"}, - - {"IN2_HPHR", NULL, "VDD_BUCK"}, - {"IN2_HPHR", NULL, "CLS_H_PORT"}, - {"RX2", NULL, "IN2_HPHR"}, - {"RDAC2", NULL, "RX2"}, - {"HPHR_RDAC", "Switch", "RDAC2"}, - {"HPHR PGA", NULL, "HPHR_RDAC"}, - {"HPHR", NULL, "HPHR PGA"}, - - {"IN3_AUX", NULL, "VDD_BUCK"}, - {"IN3_AUX", NULL, "CLS_H_PORT"}, - {"RX3", NULL, "IN3_AUX"}, - {"RDAC4", NULL, "RX3"}, - {"AUX_RDAC", "Switch", "RDAC4"}, - {"AUX PGA", NULL, "AUX_RDAC"}, - {"AUX", NULL, "AUX PGA"}, - - {"RDAC3_MUX", "RX3", "RX3"}, - {"RDAC3_MUX", "RX1", "RX1"}, - {"RDAC3", NULL, "RDAC3_MUX"}, - {"EAR_RDAC", "Switch", "RDAC3"}, - {"EAR PGA", NULL, "EAR_RDAC"}, - {"EAR", NULL, "EAR PGA"}, -}; - -static ssize_t wcd938x_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct wcd938x_priv *priv; - char buffer[WCD938X_VERSION_ENTRY_SIZE]; - int len = 0; - - priv = (struct wcd938x_priv *) entry->private_data; - if (!priv) { - pr_err("%s: wcd938x priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->version) { - case WCD938X_VERSION_1_0: - len = snprintf(buffer, sizeof(buffer), "WCD938X_1_0\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wcd938x_info_ops = { - .read = wcd938x_version_read, -}; - -static ssize_t wcd938x_variant_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct wcd938x_priv *priv; - char buffer[WCD938X_VARIANT_ENTRY_SIZE]; - int len = 0; - - priv = (struct wcd938x_priv *) entry->private_data; - if (!priv) { - pr_err("%s: wcd938x priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->variant) { - case WCD9380: - len = snprintf(buffer, sizeof(buffer), "WCD9380\n"); - break; - case WCD9385: - len = snprintf(buffer, sizeof(buffer), "WCD9385\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wcd938x_variant_ops = { - .read = wcd938x_variant_read, -}; - -/* - * wcd938x_get_codec_variant - * @codec: codec instance - * - * Return: codec variant or -EINVAL in error. - */ -int wcd938x_get_codec_variant(struct snd_soc_codec *codec) -{ - struct wcd938x_priv *priv = NULL; - - if (!codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) { - dev_err(codec->dev, - "%s:wcd938x not probed\n", __func__); - return 0; - } - - return priv->variant; -} -EXPORT_SYMBOL(wcd938x_get_codec_variant); - -/* - * wcd938x_info_create_codec_entry - creates wcd938x module - * @codec_root: The parent directory - * @codec: codec instance - * - * Creates wcd938x module, variant and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int wcd938x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct snd_info_entry *variant_entry; - struct wcd938x_priv *priv; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (priv->entry) { - dev_dbg(priv->dev, - "%s:wcd938x module already created\n", __func__); - return 0; - } - card = codec->component.card; - priv->entry = snd_info_create_subdir(codec_root->module, - "wcd938x", codec_root); - if (!priv->entry) { - dev_dbg(codec->dev, "%s: failed to create wcd938x entry\n", - __func__); - return -ENOMEM; - } - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - priv->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd938x version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = priv; - version_entry->size = WCD938X_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &wcd938x_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - priv->version_entry = version_entry; - - variant_entry = snd_info_create_card_entry(card->snd_card, - "variant", - priv->entry); - if (!variant_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd938x variant entry\n", - __func__); - return -ENOMEM; - } - - variant_entry->private_data = priv; - variant_entry->size = WCD938X_VARIANT_ENTRY_SIZE; - variant_entry->content = SNDRV_INFO_CONTENT_DATA; - variant_entry->c.ops = &wcd938x_variant_ops; - - if (snd_info_register(variant_entry) < 0) { - snd_info_free_entry(variant_entry); - return -ENOMEM; - } - priv->variant_entry = variant_entry; - - return 0; -} -EXPORT_SYMBOL(wcd938x_info_create_codec_entry); - -static int wcd938x_set_micbias_data(struct wcd938x_priv *wcd938x, - struct wcd938x_pdata *pdata) -{ - int vout_ctl_1 = 0, vout_ctl_2 = 0, vout_ctl_3 = 0, vout_ctl_4 = 0; - int rc = 0; - - if (!pdata) { - dev_err(wcd938x->dev, "%s: NULL pdata\n", __func__); - return -ENODEV; - } - - /* set micbias voltage */ - vout_ctl_1 = wcd938x_get_micb_vout_ctl_val(pdata->micbias.micb1_mv); - vout_ctl_2 = wcd938x_get_micb_vout_ctl_val(pdata->micbias.micb2_mv); - vout_ctl_3 = wcd938x_get_micb_vout_ctl_val(pdata->micbias.micb3_mv); - vout_ctl_4 = wcd938x_get_micb_vout_ctl_val(pdata->micbias.micb4_mv); - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0 || - vout_ctl_4 < 0) { - rc = -EINVAL; - goto done; - } - regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, 0x3F, - vout_ctl_1); - regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, 0x3F, - vout_ctl_2); - regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, 0x3F, - vout_ctl_3); - regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, 0x3F, - vout_ctl_4); - -done: - return rc; -} - -static int wcd938x_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = - snd_soc_codec_get_dapm(codec); - int variant; - int ret = -EINVAL; - - dev_info(codec->dev, "%s()\n", __func__); - wcd938x = snd_soc_codec_get_drvdata(codec); - - if (!wcd938x) - return -EINVAL; - - wcd938x->codec = codec; - snd_soc_codec_init_regmap(codec, wcd938x->regmap); - - variant = (snd_soc_read(codec, - WCD938X_DIGITAL_EFUSE_REG_0) & 0x1E) >> 1; - wcd938x->variant = variant; - - wcd938x->fw_data = devm_kzalloc(codec->dev, - sizeof(*(wcd938x->fw_data)), - GFP_KERNEL); - if (!wcd938x->fw_data) { - dev_err(codec->dev, "Failed to allocate fw_data\n"); - ret = -ENOMEM; - goto err; - } - - set_bit(WCD9XXX_MBHC_CAL, wcd938x->fw_data->cal_bit); - ret = wcd_cal_create_hwdep(wcd938x->fw_data, - WCD9XXX_CODEC_HWDEP_NODE, codec); - - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - goto err_hwdep; - } - - ret = wcd938x_mbhc_init(&wcd938x->mbhc, codec, wcd938x->fw_data); - if (ret) { - pr_err("%s: mbhc initialization failed\n", __func__); - goto err_hwdep; - } - - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC6"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC7"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC5_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC6_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC7_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC8_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC1_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC2_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC3_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC4_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "IN1_HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "IN2_HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "IN3_AUX"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "AUX"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_sync(dapm); - - wcd_cls_h_init(&wcd938x->clsh_info); - wcd938x_init_reg(codec); - - if (wcd938x->variant == WCD9380) { - ret = snd_soc_add_codec_controls(codec, wcd9380_snd_controls, - ARRAY_SIZE(wcd9380_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to add snd ctrls for variant: %d\n", - __func__, wcd938x->variant); - goto err_hwdep; - } - } - if (wcd938x->variant == WCD9385) { - ret = snd_soc_add_codec_controls(codec, wcd9385_snd_controls, - ARRAY_SIZE(wcd9385_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to add snd ctrls for variant: %d\n", - __func__, wcd938x->variant); - goto err_hwdep; - } - } - wcd938x->version = WCD938X_VERSION_1_0; - /* Register event notifier */ - wcd938x->nblock.notifier_call = wcd938x_event_notify; - if (wcd938x->register_notifier) { - ret = wcd938x->register_notifier(wcd938x->handle, - &wcd938x->nblock, - true); - if (ret) { - dev_err(codec->dev, - "%s: Failed to register notifier %d\n", - __func__, ret); - return ret; - } - } - wcd938x->dev_up = true; - return ret; - -err_hwdep: - wcd938x->fw_data = NULL; - -err: - return ret; -} - -static int wcd938x_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); - - if (!wcd938x) { - dev_err(codec->dev, "%s: wcd938x is already NULL\n", - __func__); - return -EINVAL; - } - if (wcd938x->register_notifier) - wcd938x->register_notifier(wcd938x->handle, - &wcd938x->nblock, - false); - return 0; -} - -static struct snd_soc_codec_driver soc_codec_dev_wcd938x = { - .probe = wcd938x_soc_codec_probe, - .remove = wcd938x_soc_codec_remove, - .component_driver = { - .controls = wcd938x_snd_controls, - .num_controls = ARRAY_SIZE(wcd938x_snd_controls), - .dapm_widgets = wcd938x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wcd938x_dapm_widgets), - .dapm_routes = wcd938x_audio_map, - .num_dapm_routes = ARRAY_SIZE(wcd938x_audio_map), - } -}; - -static int wcd938x_reset(struct device *dev) -{ - struct wcd938x_priv *wcd938x = NULL; - int rc = 0; - int value = 0; - - if (!dev) - return -ENODEV; - - wcd938x = dev_get_drvdata(dev); - if (!wcd938x) - return -EINVAL; - - if (!wcd938x->rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - value = msm_cdc_pinctrl_get_state(wcd938x->rst_np); - if (value > 0) - return 0; - - rc = msm_cdc_pinctrl_select_sleep_state(wcd938x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - /* 20us sleep required after pulling the reset gpio to LOW */ - usleep_range(20, 30); - - rc = msm_cdc_pinctrl_select_active_state(wcd938x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd active state request fail!\n", - __func__); - return rc; - } - /* 20us sleep required after pulling the reset gpio to HIGH */ - usleep_range(20, 30); - - return rc; -} - -static int wcd938x_read_of_property_u32(struct device *dev, const char *name, - u32 *val) -{ - int rc = 0; - - rc = of_property_read_u32(dev->of_node, name, val); - if (rc) - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, name, dev->of_node->full_name); - - return rc; -} - -static void wcd938x_dt_parse_micbias_info(struct device *dev, - struct wcd938x_micbias_setting *mb) -{ - u32 prop_val = 0; - int rc = 0; - - /* MB1 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias1-mv", - NULL)) { - rc = wcd938x_read_of_property_u32(dev, - "qcom,cdc-micbias1-mv", - &prop_val); - if (!rc) - mb->micb1_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias1 DT property not found\n", - __func__); - } - - /* MB2 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias2-mv", - NULL)) { - rc = wcd938x_read_of_property_u32(dev, - "qcom,cdc-micbias2-mv", - &prop_val); - if (!rc) - mb->micb2_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias2 DT property not found\n", - __func__); - } - - /* MB3 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias3-mv", - NULL)) { - rc = wcd938x_read_of_property_u32(dev, - "qcom,cdc-micbias3-mv", - &prop_val); - if (!rc) - mb->micb3_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias3 DT property not found\n", - __func__); - } - - /* MB4 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias4-mv", - NULL)) { - rc = wcd938x_read_of_property_u32(dev, - "qcom,cdc-micbias4-mv", - &prop_val); - if (!rc) - mb->micb4_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias4 DT property not found\n", - __func__); - } -} - -static int wcd938x_reset_low(struct device *dev) -{ - struct wcd938x_priv *wcd938x = NULL; - int rc = 0; - - if (!dev) - return -ENODEV; - - wcd938x = dev_get_drvdata(dev); - if (!wcd938x) - return -EINVAL; - - if (!wcd938x->rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - rc = msm_cdc_pinctrl_select_sleep_state(wcd938x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - /* 20us sleep required after pulling the reset gpio to LOW */ - usleep_range(20, 30); - - return rc; -} - -struct wcd938x_pdata *wcd938x_populate_dt_data(struct device *dev) -{ - struct wcd938x_pdata *pdata = NULL; - - pdata = devm_kzalloc(dev, sizeof(struct wcd938x_pdata), - GFP_KERNEL); - if (!pdata) - return NULL; - - pdata->rst_np = of_parse_phandle(dev->of_node, - "qcom,wcd-rst-gpio-node", 0); - - if (!pdata->rst_np) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,wcd-rst-gpio-node", - dev->of_node->full_name); - return NULL; - } - - /* Parse power supplies */ - msm_cdc_get_power_supplies(dev, &pdata->regulator, - &pdata->num_supplies); - if (!pdata->regulator || (pdata->num_supplies <= 0)) { - dev_err(dev, "%s: no power supplies defined for codec\n", - __func__); - return NULL; - } - - pdata->rx_slave = of_parse_phandle(dev->of_node, "qcom,rx-slave", 0); - pdata->tx_slave = of_parse_phandle(dev->of_node, "qcom,tx-slave", 0); - - wcd938x_dt_parse_micbias_info(dev, &pdata->micbias); - - return pdata; -} - -static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) -{ - pr_err_ratelimited("%s: Watchdog interrupt for irq =%d triggered\n", - __func__, irq); - return IRQ_HANDLED; -} - -static int wcd938x_bind(struct device *dev) -{ - int ret = 0, i = 0; - struct wcd938x_pdata *pdata = dev_get_platdata(dev); - struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); - - /* - * Add 5msec delay to provide sufficient time for - * soundwire auto enumeration of slave devices as - * as per HW requirement. - */ - usleep_range(5000, 5010); - - ret = component_bind_all(dev, wcd938x); - if (ret) { - dev_err(dev, "%s: Slave bind failed, ret = %d\n", - __func__, ret); - return ret; - } - - wcd938x->rx_swr_dev = get_matching_swr_slave_device(pdata->rx_slave); - if (!wcd938x->rx_swr_dev) { - dev_err(dev, "%s: Could not find RX swr slave device\n", - __func__); - ret = -ENODEV; - goto err; - } - - wcd938x->tx_swr_dev = get_matching_swr_slave_device(pdata->tx_slave); - if (!wcd938x->tx_swr_dev) { - dev_err(dev, "%s: Could not find TX swr slave device\n", - __func__); - ret = -ENODEV; - goto err; - } - - wcd938x->regmap = devm_regmap_init_swr(wcd938x->tx_swr_dev, - &wcd938x_regmap_config); - if (!wcd938x->regmap) { - dev_err(dev, "%s: Regmap init failed\n", - __func__); - goto err; - } - - /* Set all interupts as edge triggered */ - for (i = 0; i < wcd938x_regmap_irq_chip.num_regs; i++) - regmap_write(wcd938x->regmap, - (WCD938X_DIGITAL_INTR_LEVEL_0 + i), 0); - - wcd938x_regmap_irq_chip.irq_drv_data = wcd938x; - wcd938x->irq_info.wcd_regmap_irq_chip = &wcd938x_regmap_irq_chip; - wcd938x->irq_info.codec_name = "WCD938X"; - wcd938x->irq_info.regmap = wcd938x->regmap; - wcd938x->irq_info.dev = dev; - ret = wcd_irq_init(&wcd938x->irq_info, &wcd938x->virq); - - if (ret) { - dev_err(wcd938x->dev, "%s: IRQ init failed: %d\n", - __func__, ret); - goto err; - } - wcd938x->tx_swr_dev->slave_irq = wcd938x->virq; - - ret = wcd938x_set_micbias_data(wcd938x, pdata); - if (ret < 0) { - dev_err(dev, "%s: bad micbias pdata\n", __func__); - goto err_irq; - } - - /* Request for watchdog interrupt */ - wcd_request_irq(&wcd938x->irq_info, WCD938X_IRQ_HPHR_PDM_WD_INT, - "HPHR PDM WD INT", wcd938x_wd_handle_irq, NULL); - wcd_request_irq(&wcd938x->irq_info, WCD938X_IRQ_HPHL_PDM_WD_INT, - "HPHL PDM WD INT", wcd938x_wd_handle_irq, NULL); - wcd_request_irq(&wcd938x->irq_info, WCD938X_IRQ_AUX_PDM_WD_INT, - "AUX PDM WD INT", wcd938x_wd_handle_irq, NULL); - /* Disable watchdog interrupt for HPH and AUX */ - wcd_disable_irq(&wcd938x->irq_info, WCD938X_IRQ_HPHR_PDM_WD_INT); - wcd_disable_irq(&wcd938x->irq_info, WCD938X_IRQ_HPHL_PDM_WD_INT); - wcd_disable_irq(&wcd938x->irq_info, WCD938X_IRQ_AUX_PDM_WD_INT); - - ret = snd_soc_register_codec(dev, &soc_codec_dev_wcd938x, - NULL, 0); - if (ret) { - dev_err(dev, "%s: Codec registration failed\n", - __func__); - goto err_irq; - } - - return ret; -err_irq: - wcd_irq_exit(&wcd938x->irq_info, wcd938x->virq); -err: - component_unbind_all(dev, wcd938x); - return ret; -} - -static void wcd938x_unbind(struct device *dev) -{ - struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); - - wcd_free_irq(&wcd938x->irq_info, WCD938X_IRQ_HPHR_PDM_WD_INT, NULL); - wcd_free_irq(&wcd938x->irq_info, WCD938X_IRQ_HPHL_PDM_WD_INT, NULL); - wcd_free_irq(&wcd938x->irq_info, WCD938X_IRQ_AUX_PDM_WD_INT, NULL); - wcd_irq_exit(&wcd938x->irq_info, wcd938x->virq); - snd_soc_unregister_codec(dev); - component_unbind_all(dev, wcd938x); -} - -static const struct of_device_id wcd938x_dt_match[] = { - { .compatible = "qcom,wcd938x-codec" , .data = "wcd938x" }, - {} -}; - -static const struct component_master_ops wcd938x_comp_ops = { - .bind = wcd938x_bind, - .unbind = wcd938x_unbind, -}; - -static int wcd938x_compare_of(struct device *dev, void *data) -{ - return dev->of_node == data; -} - -static void wcd938x_release_of(struct device *dev, void *data) -{ - of_node_put(data); -} - -static int wcd938x_add_slave_codecs(struct device *dev, - struct component_match **matchptr) -{ - struct device_node *np, *rx_node, *tx_node; - - np = dev->of_node; - - rx_node = of_parse_phandle(np, "qcom,rx-slave", 0); - if (!rx_node) { - dev_err(dev, "%s: Rx-slave node not defined\n", __func__); - return -ENODEV; - } - of_node_get(rx_node); - component_match_add_release(dev, matchptr, - wcd938x_release_of, - wcd938x_compare_of, - rx_node); - - tx_node = of_parse_phandle(np, "qcom,tx-slave", 0); - if (!tx_node) { - dev_err(dev, "%s: Tx-slave node not defined\n", __func__); - return -ENODEV; - } - of_node_get(tx_node); - component_match_add_release(dev, matchptr, - wcd938x_release_of, - wcd938x_compare_of, - tx_node); - return 0; -} - -static int wcd938x_wakeup(void *handle, bool enable) -{ - struct wcd938x_priv *priv; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - priv = (struct wcd938x_priv *)handle; - if (!priv->tx_swr_dev) { - pr_err("%s: tx swr dev is NULL\n", __func__); - return -EINVAL; - } - if (enable) - return swr_device_wakeup_vote(priv->tx_swr_dev); - else - return swr_device_wakeup_unvote(priv->tx_swr_dev); -} - -static int wcd938x_probe(struct platform_device *pdev) -{ - struct component_match *match = NULL; - struct wcd938x_priv *wcd938x = NULL; - struct wcd938x_pdata *pdata = NULL; - struct wcd_ctrl_platform_data *plat_data = NULL; - struct device *dev = &pdev->dev; - int ret; - - wcd938x = devm_kzalloc(dev, sizeof(struct wcd938x_priv), - GFP_KERNEL); - if (!wcd938x) - return -ENOMEM; - - dev_set_drvdata(dev, wcd938x); - wcd938x->dev = dev; - - pdata = wcd938x_populate_dt_data(dev); - if (!pdata) { - dev_err(dev, "%s: Fail to obtain platform data\n", __func__); - return -EINVAL; - } - dev->platform_data = pdata; - - wcd938x->rst_np = pdata->rst_np; - ret = msm_cdc_init_supplies(dev, &wcd938x->supplies, - pdata->regulator, pdata->num_supplies); - if (!wcd938x->supplies) { - dev_err(dev, "%s: Cannot init wcd supplies\n", - __func__); - return ret; - } - - plat_data = dev_get_platdata(dev->parent); - if (!plat_data) { - dev_err(dev, "%s: platform data from parent is NULL\n", - __func__); - return -EINVAL; - } - wcd938x->handle = (void *)plat_data->handle; - if (!wcd938x->handle) { - dev_err(dev, "%s: handle is NULL\n", __func__); - return -EINVAL; - } - - wcd938x->update_wcd_event = plat_data->update_wcd_event; - if (!wcd938x->update_wcd_event) { - dev_err(dev, "%s: update_wcd_event api is null!\n", - __func__); - return -EINVAL; - } - wcd938x->register_notifier = plat_data->register_notifier; - if (!wcd938x->register_notifier) { - dev_err(dev, "%s: register_notifier api is null!\n", - __func__); - return -EINVAL; - } - - ret = msm_cdc_enable_static_supplies(&pdev->dev, wcd938x->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(dev, "%s: wcd static supply enable failed!\n", - __func__); - return ret; - } - - ret = wcd938x_parse_port_mapping(dev, "qcom,rx_swr_ch_map", - CODEC_RX); - ret |= wcd938x_parse_port_mapping(dev, "qcom,tx_swr_ch_map", - CODEC_TX); - - if (ret) { - dev_err(dev, "Failed to read port mapping\n"); - goto err; - } - - mutex_init(&wcd938x->micb_lock); - ret = wcd938x_add_slave_codecs(dev, &match); - if (ret) - goto err_lock_init; - - wcd938x_reset(dev); - - wcd938x->wakeup = wcd938x_wakeup; - - return component_master_add_with_match(dev, - &wcd938x_comp_ops, match); - -err_lock_init: - mutex_destroy(&wcd938x->micb_lock); -err: - return ret; -} - -static int wcd938x_remove(struct platform_device *pdev) -{ - struct wcd938x_priv *wcd938x = NULL; - - wcd938x = platform_get_drvdata(pdev); - component_master_del(&pdev->dev, &wcd938x_comp_ops); - mutex_destroy(&wcd938x->micb_lock); - dev_set_drvdata(&pdev->dev, NULL); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int wcd938x_suspend(struct device *dev) -{ - struct wcd938x_priv *wcd938x = NULL; - int ret = 0; - struct wcd938x_pdata *pdata = NULL; - - if (!dev) - return -ENODEV; - - wcd938x = dev_get_drvdata(dev); - if (!wcd938x) - return -EINVAL; - - pdata = dev_get_platdata(wcd938x->dev); - - if (!pdata) { - dev_err(dev, "%s: pdata is NULL\n", __func__); - return -EINVAL; - } - - if (test_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask)) { - ret = msm_cdc_disable_ondemand_supply(wcd938x->dev, - wcd938x->supplies, - pdata->regulator, - pdata->num_supplies, - "cdc-vdd-buck"); - if (ret == -EINVAL) { - dev_err(dev, "%s: vdd buck is not disabled\n", - __func__); - return 0; - } - clear_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask); - } - return 0; -} - -static int wcd938x_resume(struct device *dev) -{ - return 0; -} - -static const struct dev_pm_ops wcd938x_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - wcd938x_suspend, - wcd938x_resume - ) -}; -#endif - -static struct platform_driver wcd938x_codec_driver = { - .probe = wcd938x_probe, - .remove = wcd938x_remove, - .driver = { - .name = "wcd938x_codec", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(wcd938x_dt_match), -#ifdef CONFIG_PM_SLEEP - .pm = &wcd938x_dev_pm_ops, -#endif - .suppress_bind_attrs = true, - }, -}; - -module_platform_driver(wcd938x_codec_driver); -MODULE_DESCRIPTION("WCD938X Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.h b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.h deleted file mode 100644 index 03bea23661e0..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.h +++ /dev/null @@ -1,30 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD938X_H -#define _WCD938X_H - -enum { - WCD9380 = 0, - WCD9385 = 5, -}; - -#ifdef CONFIG_SND_SOC_WCD938X -extern int wcd938x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -extern int wcd938x_get_codec_variant(struct snd_soc_codec *codec); - -#else -extern int wcd938x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -extern int wcd938x_get_codec_variant(struct snd_soc_codec *codec) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_WCD938X */ -#endif /* _WCD938X_H */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-common-v2.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-common-v2.c deleted file mode 100644 index 3e29b2be2daf..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-common-v2.c +++ /dev/null @@ -1,1359 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define WCD_USLEEP_RANGE 50 -#define MAX_IMPED_PARAMS 6 - -enum { - DAC_GAIN_0DB = 0, - DAC_GAIN_0P2DB, - DAC_GAIN_0P4DB, - DAC_GAIN_0P6DB, - DAC_GAIN_0P8DB, - DAC_GAIN_M0P2DB, - DAC_GAIN_M0P4DB, - DAC_GAIN_M0P6DB, -}; - -enum { - VREF_FILT_R_0OHM = 0, - VREF_FILT_R_25KOHM, - VREF_FILT_R_50KOHM, - VREF_FILT_R_100KOHM, -}; - -enum { - DELTA_I_0MA, - DELTA_I_10MA, - DELTA_I_20MA, - DELTA_I_30MA, - DELTA_I_40MA, - DELTA_I_50MA, -}; - -struct wcd_imped_val { - u32 imped_val; - u8 index; -}; - -static const struct wcd_reg_mask_val imped_table[][MAX_IMPED_PARAMS] = { - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x0}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x0}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, -}; - -static const struct wcd_reg_mask_val imped_table_tavil[][MAX_IMPED_PARAMS] = { - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, -}; - -static const struct wcd_imped_val imped_index[] = { - {4, 0}, - {5, 1}, - {6, 2}, - {7, 3}, - {8, 4}, - {9, 5}, - {10, 6}, - {11, 7}, - {12, 8}, - {13, 9}, -}; - -static void (*clsh_state_fp[NUM_CLSH_STATES_V2])(struct snd_soc_codec *, - struct wcd_clsh_cdc_data *, - u8 req_state, bool en, int mode); - -static int get_impedance_index(int imped) -{ - int i = 0; - - if (imped < imped_index[i].imped_val) { - pr_debug("%s, detected impedance is less than 4 Ohm\n", - __func__); - i = 0; - goto ret; - } - if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) { - pr_debug("%s, detected impedance is greater than 12 Ohm\n", - __func__); - i = ARRAY_SIZE(imped_index) - 1; - goto ret; - } - for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) { - if (imped >= imped_index[i].imped_val && - imped < imped_index[i + 1].imped_val) - break; - } -ret: - pr_debug("%s: selected impedance index = %d\n", - __func__, imped_index[i].index); - return imped_index[i].index; -} - -/* - * Function: wcd_clsh_imped_config - * Params: codec, imped, reset - * Description: - * This function updates HPHL and HPHR gain settings - * according to the impedance value. - */ -void wcd_clsh_imped_config(struct snd_soc_codec *codec, int imped, bool reset) -{ - int i; - int index = 0; - int table_size; - - static const struct wcd_reg_mask_val - (*imped_table_ptr)[MAX_IMPED_PARAMS]; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (IS_CODEC_TYPE(wcd9xxx, WCD934X)) { - table_size = ARRAY_SIZE(imped_table_tavil); - imped_table_ptr = imped_table_tavil; - } else { - table_size = ARRAY_SIZE(imped_table); - imped_table_ptr = imped_table; - } - - /* reset = 1, which means request is to reset the register values */ - if (reset) { - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, 0); - return; - } - index = get_impedance_index(imped); - if (index >= (ARRAY_SIZE(imped_index) - 1)) { - pr_debug("%s, impedance not in range = %d\n", __func__, imped); - return; - } - if (index >= table_size) { - pr_debug("%s, impedance index not in range = %d\n", __func__, - index); - return; - } - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, - imped_table_ptr[index][i].val); -} -EXPORT_SYMBOL(wcd_clsh_imped_config); - -static bool is_native_44_1_active(struct snd_soc_codec *codec) -{ - bool native_active = false; - u8 native_clk, rx1_rate, rx2_rate; - - native_clk = snd_soc_read(codec, - WCD9XXX_CDC_CLK_RST_CTRL_MCLK_CONTROL); - rx1_rate = snd_soc_read(codec, WCD9XXX_CDC_RX1_RX_PATH_CTL); - rx2_rate = snd_soc_read(codec, WCD9XXX_CDC_RX2_RX_PATH_CTL); - - dev_dbg(codec->dev, "%s: native_clk %x rx1_rate= %x rx2_rate= %x", - __func__, native_clk, rx1_rate, rx2_rate); - - if ((native_clk & 0x2) && - ((rx1_rate & 0x0F) == 0x9 || (rx2_rate & 0x0F) == 0x9)) - native_active = true; - - return native_active; -} - -static const char *mode_to_str(int mode) -{ - switch (mode) { - case CLS_H_NORMAL: - return "CLS_H_NORMAL"; - case CLS_H_HIFI: - return "CLS_H_HIFI"; - case CLS_H_LOHIFI: - return "CLS_H_LOHIFI"; - case CLS_H_LP: - return "CLS_H_LP"; - case CLS_H_ULP: - return "CLS_H_ULP"; - case CLS_AB: - return "CLS_AB"; - case CLS_AB_HIFI: - return "CLS_AB_HIFI"; - default: - return "CLS_H_INVALID"; - }; -} - -static const char *state_to_str(u8 state, char *buf, size_t buflen) -{ - int i; - int cnt = 0; - /* - * This array of strings should match with enum wcd_clsh_state_bit. - */ - static const char *const states[] = { - "STATE_EAR", - "STATE_HPH_L", - "STATE_HPH_R", - "STATE_LO", - }; - - if (state == WCD_CLSH_STATE_IDLE) { - snprintf(buf, buflen, "[STATE_IDLE]"); - goto done; - } - - buf[0] = '\0'; - for (i = 0; i < ARRAY_SIZE(states); i++) { - if (!(state & (1 << i))) - continue; - cnt = snprintf(buf, buflen - cnt - 1, "%s%s%s", buf, - buf[0] == '\0' ? "[" : "|", - states[i]); - } - if (cnt > 0) - strlcat(buf + cnt, "]", buflen); - -done: - if (buf[0] == '\0') - snprintf(buf, buflen, "[STATE_UNKNOWN]"); - return buf; -} - -static inline void -wcd_enable_clsh_block(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, bool enable) -{ - if ((enable && ++clsh_d->clsh_users == 1) || - (!enable && --clsh_d->clsh_users == 0)) - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_CRC, 0x01, - (u8) enable); - if (clsh_d->clsh_users < 0) - clsh_d->clsh_users = 0; - dev_dbg(codec->dev, "%s: clsh_users %d, enable %d", __func__, - clsh_d->clsh_users, enable); -} - -static inline bool wcd_clsh_enable_status(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, WCD9XXX_A_CDC_CLSH_CRC) & 0x01; -} - -static inline int wcd_clsh_get_int_mode(struct wcd_clsh_cdc_data *clsh_d, - int clsh_state) -{ - int mode; - - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_LO)) - mode = CLS_NONE; - else - mode = clsh_d->interpolator_modes[ffs(clsh_state)]; - - return mode; -} - -static inline void wcd_clsh_set_int_mode(struct wcd_clsh_cdc_data *clsh_d, - int clsh_state, int mode) -{ - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_LO)) - return; - - clsh_d->interpolator_modes[ffs(clsh_state)] = mode; -} - -static inline void wcd_clsh_set_buck_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x08, 0x08); /* set to HIFI */ - else - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x08, 0x00); /* set to default */ -} - -static inline void wcd_clsh_set_flyback_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x04, 0x04); /* set to HIFI */ - else - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x04, 0x00); /* set to Default */ -} - -static inline void wcd_clsh_gm3_boost_disable(struct snd_soc_codec *codec, - int mode) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!IS_CODEC_TYPE(wcd9xxx, WCD934X)) - return; - - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) { - if (TAVIL_IS_1_0(wcd9xxx)) - snd_soc_update_bits(codec, WCD9XXX_HPH_CNP_WG_CTL, - 0x80, 0x0); /* disable GM3 Boost */ - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x80); - } else { - snd_soc_update_bits(codec, WCD9XXX_HPH_CNP_WG_CTL, - 0x80, 0x80); /* set to Default */ - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x70); - } -} - - -static inline void wcd_clsh_force_iq_ctl(struct snd_soc_codec *codec, - int mode) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!IS_CODEC_TYPE(wcd9xxx, WCD934X)) - return; - - if (mode == CLS_H_LOHIFI || mode == CLS_AB) { - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x20); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0xC0); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x02); - } else { - - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x0); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0x80); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x06); - } -} - -static void wcd_clsh_buck_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - int mode, - bool enable) -{ - /* enable/disable buck */ - if ((enable && (++clsh_d->buck_users == 1)) || - (!enable && (--clsh_d->buck_users == 0))) - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - (1 << 7), (enable << 7)); - dev_dbg(codec->dev, "%s: buck_users %d, enable %d, mode: %s", - __func__, clsh_d->buck_users, enable, mode_to_str(mode)); - /* - * 500us sleep is required after buck enable/disable - * as per HW requirement - */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); -} - -static void wcd_clsh_flyback_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - int mode, - bool enable) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_reg_val bulk_reg[2]; - u8 vneg[] = {0x00, 0x40}; - - /* enable/disable flyback */ - if ((enable && (++clsh_d->flyback_users == 1)) || - (!enable && (--clsh_d->flyback_users == 0))) { - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - (1 << 6), (enable << 6)); - /* 100usec delay is needed as per HW requirement */ - usleep_range(100, 110); - if (enable && (TASHA_IS_1_1(wcd9xxx))) { - wcd_clsh_set_flyback_mode(codec, CLS_H_HIFI); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_EN, - 0x60, 0x40); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_EN, - 0x10, 0x10); - vneg[0] = snd_soc_read(codec, - WCD9XXX_A_ANA_RX_SUPPLIES); - vneg[0] &= ~(0x40); - vneg[1] = vneg[0] | 0x40; - bulk_reg[0].reg = WCD9XXX_A_ANA_RX_SUPPLIES; - bulk_reg[0].buf = &vneg[0]; - bulk_reg[0].bytes = 1; - bulk_reg[1].reg = WCD9XXX_A_ANA_RX_SUPPLIES; - bulk_reg[1].buf = &vneg[1]; - bulk_reg[1].bytes = 1; - /* 500usec delay is needed as per HW requirement */ - usleep_range(500, 510); - wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, 2, - false); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_EN, - 0x10, 0x00); - wcd_clsh_set_flyback_mode(codec, mode); - } - - } - dev_dbg(codec->dev, "%s: flyback_users %d, enable %d, mode: %s", - __func__, clsh_d->flyback_users, enable, mode_to_str(mode)); - /* - * 500us sleep is required after flyback enable/disable - * as per HW requirement - */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); -} - -static void wcd_clsh_set_gain_path(struct snd_soc_codec *codec, - int mode) -{ - u8 val = 0; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!TASHA_IS_2_0(wcd9xxx)) - return; - - switch (mode) { - case CLS_H_NORMAL: - case CLS_AB: - val = 0x00; - break; - case CLS_H_HIFI: - val = 0x02; - break; - case CLS_H_LP: - val = 0x01; - break; - default: - return; - }; - snd_soc_update_bits(codec, WCD9XXX_HPH_L_EN, 0xC0, (val << 6)); - snd_soc_update_bits(codec, WCD9XXX_HPH_R_EN, 0xC0, (val << 6)); -} - -static void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec, - int mode) -{ - u8 val = 0; - u8 gain = 0; - u8 res_val = VREF_FILT_R_0OHM; - u8 ipeak = DELTA_I_50MA; - - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - switch (mode) { - case CLS_H_NORMAL: - res_val = VREF_FILT_R_50KOHM; - val = 0x00; - gain = DAC_GAIN_0DB; - ipeak = DELTA_I_50MA; - break; - case CLS_AB: - val = 0x00; - gain = DAC_GAIN_0DB; - ipeak = DELTA_I_50MA; - break; - case CLS_AB_HIFI: - val = 0x08; - break; - case CLS_H_HIFI: - val = 0x08; - gain = DAC_GAIN_M0P2DB; - ipeak = DELTA_I_50MA; - break; - case CLS_H_LOHIFI: - val = 0x00; - if ((IS_CODEC_TYPE(wcd9xxx, WCD9335)) || - (IS_CODEC_TYPE(wcd9xxx, WCD9326))) { - val = 0x08; - gain = DAC_GAIN_M0P2DB; - ipeak = DELTA_I_50MA; - } - break; - case CLS_H_ULP: - val = 0x0C; - break; - case CLS_H_LP: - val = 0x04; - ipeak = DELTA_I_30MA; - break; - default: - return; - }; - - /* - * For tavil set mode to Lower_power for - * CLS_H_LOHIFI and CLS_AB - */ - if ((IS_CODEC_TYPE(wcd9xxx, WCD934X)) && - (mode == CLS_H_LOHIFI || mode == CLS_AB)) - val = 0x04; - - snd_soc_update_bits(codec, WCD9XXX_A_ANA_HPH, 0x0C, val); - if (TASHA_IS_2_0(wcd9xxx)) { - snd_soc_update_bits(codec, WCD9XXX_CLASSH_CTRL_VCL_2, - 0x30, (res_val << 4)); - if (mode != CLS_H_LP) - snd_soc_update_bits(codec, WCD9XXX_HPH_REFBUFF_UHQA_CTL, - 0x07, gain); - snd_soc_update_bits(codec, WCD9XXX_CLASSH_CTRL_CCL_1, - 0xF0, (ipeak << 4)); - } -} - -static void wcd_clsh_set_flyback_vneg_ctl(struct snd_soc_codec *codec, - bool enable) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!TASHA_IS_2_0(wcd9xxx)) - return; - - if (enable) { - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_1, 0xE0, - 0x00); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, (0x07 << 5)); - } else { - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_1, 0xE0, - (0x07 << 5)); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, (0x02 << 5)); - } -} - -static void wcd_clsh_set_flyback_current(struct snd_soc_codec *codec, int mode) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!TASHA_IS_2_0(wcd9xxx)) - return; - - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0x0F, 0x0A); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0xF0, 0xA0); - /* Sleep needed to avoid click and pop as per HW requirement */ - usleep_range(100, 110); -} - -static void wcd_clsh_set_buck_regulator_mode(struct snd_soc_codec *codec, - int mode) -{ - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x02, 0x00); -} - -static void wcd_clsh_state_lo(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - dev_err(codec->dev, "%s: LO cannot be in this mode: %d\n", - __func__, mode); - return; - } - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_vneg_ctl(codec, true); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - } else { - wcd_clsh_buck_ctrl(codec, clsh_d, mode, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_vneg_ctl(codec, false); - wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_hph_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - int hph_mode = 0; - - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - if (req_state == WCD_CLSH_STATE_EAR) { - /* If HPH is running in CLS-AB when - * EAR comes, let it continue to run - * in Class-AB, no need to enable Class-H - * for EAR. - */ - if (clsh_d->state & WCD_CLSH_STATE_HPHL) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHL); - else if (clsh_d->state & WCD_CLSH_STATE_HPHR) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHR); - else - return; - if (hph_mode != CLS_AB && hph_mode != CLS_AB_HIFI - && !is_native_44_1_active(codec)) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - } - - if (is_native_44_1_active(codec)) { - snd_soc_write(codec, WCD9XXX_CDC_CLSH_HPH_V_PA, 0x39); - snd_soc_update_bits(codec, - WCD9XXX_CDC_RX0_RX_PATH_SEC0, - 0x03, 0x00); - if ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR)) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - } - - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - if ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR)) { - wcd_clsh_set_gain_path(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - } - } else { - if (req_state == WCD_CLSH_STATE_EAR) { - /* - * If EAR goes away, disable EAR Channel Enable - * if HPH running in Class-H otherwise - * and if HPH requested mode is CLS_AB then - * no need to disable EAR channel enable bit. - */ - if (wcd_clsh_enable_status(codec)) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - } - - if (is_native_44_1_active(codec)) { - snd_soc_write(codec, WCD9XXX_CDC_CLSH_HPH_V_PA, 0x1C); - snd_soc_update_bits(codec, - WCD9XXX_CDC_RX0_RX_PATH_SEC0, - 0x03, 0x01); - if (((clsh_d->state & WCD_CLSH_STATE_HPH_ST) - != WCD_CLSH_STATE_HPH_ST) && - ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR))) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - } - - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - if ((req_state & WCD_CLSH_STATE_HPH_ST) && - !wcd_clsh_enable_status(codec)) { - /* If Class-H is not enabled when HPH is turned - * off, enable it as EAR is in progress - */ - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } - } -} - -static void wcd_clsh_state_ear_lo(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - /* LO powerup is taken care in PA sequence. - * No need to change to class AB here. - */ - if (req_state == WCD_CLSH_STATE_EAR) { - /* EAR powerup.*/ - if (!wcd_clsh_enable_status(codec)) { - wcd_enable_clsh_block(codec, clsh_d, true); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - } - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - } - } else { - if (req_state == WCD_CLSH_STATE_EAR) { - /* EAR powerdown.*/ - wcd_enable_clsh_block(codec, clsh_d, false); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - } - /* LO powerdown is taken care in PA sequence. - * No need to change to class H here. - */ - } -} - -static void wcd_clsh_state_hph_lo(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - int hph_mode = 0; - - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - /* - * If requested state is LO, put regulator - * in class-AB or if requested state is HPH, - * which means LO is already enabled, keep - * the regulator config the same at class-AB - * and just set the power modes for flyback - * and buck. - */ - if (req_state == WCD_CLSH_STATE_LO) - wcd_clsh_set_buck_regulator_mode(codec, CLS_AB); - else { - if (!wcd_clsh_enable_status(codec)) { - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_set_flyback_vneg_ctl(codec, false); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_hph_mode(codec, mode); - wcd_clsh_set_gain_path(codec, mode); - } else { - dev_dbg(codec->dev, "%s:clsh is already enabled\n", - __func__); - } - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } - } else { - if ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR)) { - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - /* - * If HPH is powering down first, then disable clsh, - * set the buck/flyback mode to default and keep the - * regulator at Class-AB - */ - if ((clsh_d->state & WCD_CLSH_STATE_HPH_ST) - != WCD_CLSH_STATE_HPH_ST) { - wcd_enable_clsh_block(codec, clsh_d, false); - wcd_clsh_set_flyback_vneg_ctl(codec, true); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } - } else { - /* LO powerdown. - * If HPH mode also is CLS-AB, no need - * to turn-on class-H, otherwise enable - * Class-H configuration. - */ - if (clsh_d->state & WCD_CLSH_STATE_HPHL) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHL); - else if (clsh_d->state & WCD_CLSH_STATE_HPHR) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHR); - else - return; - dev_dbg(codec->dev, "%s: hph_mode = %d\n", __func__, - hph_mode); - - if ((hph_mode == CLS_AB) || - (hph_mode == CLS_AB_HIFI) || - (hph_mode == CLS_NONE)) - goto end; - - /* - * If Class-H is already enabled (HPH ON and then - * LO ON), no need to turn on again, just set the - * regulator mode. - */ - if (wcd_clsh_enable_status(codec)) { - wcd_clsh_set_buck_regulator_mode(codec, - hph_mode); - goto end; - } else { - dev_dbg(codec->dev, "%s: clsh is not enabled\n", - __func__); - } - - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - wcd_clsh_set_buck_regulator_mode(codec, - hph_mode); - if (clsh_d->state & WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (clsh_d->state & WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - wcd_clsh_set_hph_mode(codec, hph_mode); - } - } -end: - return; -} - -static void wcd_clsh_state_hph_st(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_AB || mode == CLS_AB_HIFI) - return; - - if (is_enable) { - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } else { - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - } -} - -static void wcd_clsh_state_hph_r(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_err(codec->dev, "%s: Normal mode not applicable for hph_r\n", - __func__); - return; - } - - if (is_enable) { - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - wcd_enable_clsh_block(codec, clsh_d, true); - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_gm3_boost_disable(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - wcd_clsh_set_gain_path(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - wcd_enable_clsh_block(codec, clsh_d, false); - } - /* buck and flyback set to default mode and disable */ - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL); - wcd_clsh_gm3_boost_disable(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_hph_l(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_err(codec->dev, "%s: Normal mode not applicable for hph_l\n", - __func__); - return; - } - - if (is_enable) { - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - wcd_enable_clsh_block(codec, clsh_d, true); - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - } - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_gm3_boost_disable(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - wcd_clsh_set_gain_path(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - wcd_enable_clsh_block(codec, clsh_d, false); - } - /* set buck and flyback to Default Mode */ - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL); - wcd_clsh_gm3_boost_disable(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode != CLS_H_NORMAL) { - dev_err(codec->dev, "%s: mode: %s cannot be used for EAR\n", - __func__, mode_to_str(mode)); - return; - } - - if (is_enable) { - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - } else { - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - wcd_enable_clsh_block(codec, clsh_d, false); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_err(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - char msg[128]; - - dev_err(codec->dev, - "%s Wrong request for class H state machine requested to %s %s", - __func__, is_enable ? "enable" : "disable", - state_to_str(req_state, msg, sizeof(msg))); - WARN_ON(1); -} - -/* - * Function: wcd_clsh_is_state_valid - * Params: state - * Description: - * Provides information on valid states of Class H configuration - */ -static bool wcd_clsh_is_state_valid(u8 state) -{ - switch (state) { - case WCD_CLSH_STATE_IDLE: - case WCD_CLSH_STATE_EAR: - case WCD_CLSH_STATE_HPHL: - case WCD_CLSH_STATE_HPHR: - case WCD_CLSH_STATE_HPH_ST: - case WCD_CLSH_STATE_LO: - case WCD_CLSH_STATE_HPHL_EAR: - case WCD_CLSH_STATE_HPHR_EAR: - case WCD_CLSH_STATE_HPH_ST_EAR: - case WCD_CLSH_STATE_HPHL_LO: - case WCD_CLSH_STATE_HPHR_LO: - case WCD_CLSH_STATE_HPH_ST_LO: - case WCD_CLSH_STATE_EAR_LO: - return true; - default: - return false; - }; -} - -/* - * Function: wcd_clsh_fsm - * Params: codec, cdc_clsh_d, req_state, req_type, clsh_event - * Description: - * This function handles PRE DAC and POST DAC conditions of different devices - * and updates class H configuration of different combination of devices - * based on validity of their states. cdc_clsh_d will contain current - * class h state information - */ -void wcd_clsh_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode) -{ - u8 old_state, new_state; - char msg0[128], msg1[128]; - - switch (clsh_event) { - case WCD_CLSH_EVENT_PRE_DAC: - old_state = cdc_clsh_d->state; - new_state = old_state | req_state; - - if (!wcd_clsh_is_state_valid(new_state)) { - dev_err(codec->dev, - "%s: Class-H not a valid new state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, int_mode); - (*clsh_state_fp[new_state]) (codec, cdc_clsh_d, req_state, - CLSH_REQ_ENABLE, int_mode); - dev_dbg(codec->dev, - "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, sizeof(msg1))); - break; - case WCD_CLSH_EVENT_POST_PA: - old_state = cdc_clsh_d->state; - new_state = old_state & (~req_state); - if (new_state < NUM_CLSH_STATES_V2) { - if (!wcd_clsh_is_state_valid(old_state)) { - dev_err(codec->dev, - "%s:Invalid old state:%s\n", - __func__, - state_to_str(old_state, msg0, - sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, - sizeof(msg0))); - return; - } - (*clsh_state_fp[old_state]) (codec, cdc_clsh_d, - req_state, CLSH_REQ_DISABLE, - int_mode); - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, CLS_NONE); - dev_dbg(codec->dev, "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, - sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, - sizeof(msg1))); - } - break; - }; -} -EXPORT_SYMBOL(wcd_clsh_fsm); - -int wcd_clsh_get_clsh_state(struct wcd_clsh_cdc_data *clsh) -{ - return clsh->state; -} -EXPORT_SYMBOL(wcd_clsh_get_clsh_state); - -void wcd_clsh_init(struct wcd_clsh_cdc_data *clsh) -{ - int i; - - clsh->state = WCD_CLSH_STATE_IDLE; - - for (i = 0; i < NUM_CLSH_STATES_V2; i++) - clsh_state_fp[i] = wcd_clsh_state_err; - - clsh_state_fp[WCD_CLSH_STATE_EAR] = wcd_clsh_state_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHL] = - wcd_clsh_state_hph_l; - clsh_state_fp[WCD_CLSH_STATE_HPHR] = - wcd_clsh_state_hph_r; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST] = - wcd_clsh_state_hph_st; - clsh_state_fp[WCD_CLSH_STATE_LO] = wcd_clsh_state_lo; - clsh_state_fp[WCD_CLSH_STATE_HPHL_EAR] = - wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHR_EAR] = - wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_EAR] = - wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHL_LO] = wcd_clsh_state_hph_lo; - clsh_state_fp[WCD_CLSH_STATE_HPHR_LO] = wcd_clsh_state_hph_lo; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_LO] = - wcd_clsh_state_hph_lo; - clsh_state_fp[WCD_CLSH_STATE_EAR_LO] = wcd_clsh_state_ear_lo; - /* Set interpolaotr modes to NONE */ - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_EAR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHL, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_LO, CLS_NONE); - clsh->flyback_users = 0; - clsh->buck_users = 0; - clsh->clsh_users = 0; -} -EXPORT_SYMBOL(wcd_clsh_init); - -MODULE_DESCRIPTION("WCD9XXX Common Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-core-init.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-core-init.c deleted file mode 100644 index cd35a9e24b12..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-core-init.c +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include - -#define NUM_DRIVERS_REG_RET 3 - -static int __init wcd9xxx_core_init(void) -{ - int ret[NUM_DRIVERS_REG_RET] = {0}; - int i = 0; - - ret[0] = msm_cdc_pinctrl_drv_init(); - if (ret[0]) - pr_err("%s: Failed init pinctrl drv: %d\n", __func__, ret[0]); - - ret[1] = wcd9xxx_irq_drv_init(); - if (ret[1]) - pr_err("%s: Failed init irq drv: %d\n", __func__, ret[1]); - - ret[2] = wcd9xxx_init(); - if (ret[2]) - pr_err("%s: Failed wcd core drv: %d\n", __func__, ret[2]); - - for (i = 0; i < NUM_DRIVERS_REG_RET; i++) { - if (ret[i]) - return ret[i]; - } - - return 0; -} -module_init(wcd9xxx_core_init); - -static void __exit wcd9xxx_core_exit(void) -{ - wcd9xxx_exit(); - wcd9xxx_irq_drv_exit(); - msm_cdc_pinctrl_drv_exit(); -} -module_exit(wcd9xxx_core_exit); - -MODULE_DESCRIPTION("WCD9XXX CODEC core init driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-core.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-core.c deleted file mode 100644 index 9736c43c365b..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-core.c +++ /dev/null @@ -1,1807 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd9xxx-utils.h" -#include -#include - -#define WCD9XXX_REGISTER_START_OFFSET 0x800 -#define WCD9XXX_SLIM_RW_MAX_TRIES 3 -#define SLIMBUS_PRESENT_TIMEOUT 100 - -#define MAX_WCD9XXX_DEVICE 4 -#define WCD9XXX_I2C_GSBI_SLAVE_ID "3-000d" -#define WCD9XXX_I2C_TOP_SLAVE_ADDR 0x0d -#define WCD9XXX_ANALOG_I2C_SLAVE_ADDR 0x77 -#define WCD9XXX_DIGITAL1_I2C_SLAVE_ADDR 0x66 -#define WCD9XXX_DIGITAL2_I2C_SLAVE_ADDR 0x55 -#define WCD9XXX_I2C_TOP_LEVEL 0 -#define WCD9XXX_I2C_ANALOG 1 -#define WCD9XXX_I2C_DIGITAL_1 2 -#define WCD9XXX_I2C_DIGITAL_2 3 - -/* - * Number of return values needs to be checked for each - * registration of Slimbus of I2C bus for each codec - */ -#define NUM_WCD9XXX_REG_RET 5 - -#define SLIM_USR_MC_REPEAT_CHANGE_VALUE 0x0 -#define SLIM_REPEAT_WRITE_MAX_SLICE 16 -#define REG_BYTES 2 -#define VAL_BYTES 1 -#define WCD9XXX_PAGE_NUM(reg) (((reg) >> 8) & 0xff) -#define WCD9XXX_PAGE_SIZE 256 - -struct wcd9xxx_i2c { - struct i2c_client *client; - struct i2c_msg xfer_msg[2]; - struct mutex xfer_lock; - int mod_id; -}; - -static struct regmap_config wcd9xxx_base_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .can_multi_write = true, -}; - -static struct regmap_config wcd9xxx_i2c_base_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .can_multi_write = false, - .use_single_rw = true, -}; - -static u8 wcd9xxx_pgd_la; -static u8 wcd9xxx_inf_la; - -static const int wcd9xxx_cdc_types[] = { - [WCD9XXX] = WCD9XXX, - [WCD9330] = WCD9330, - [WCD9335] = WCD9335, - [WCD934X] = WCD934X, -}; - -static const struct of_device_id wcd9xxx_of_match[] = { - { .compatible = "qcom,tavil-i2c", - .data = (void *)&wcd9xxx_cdc_types[WCD934X]}, - { .compatible = "qcom,tasha-i2c-pgd", - .data = (void *)&wcd9xxx_cdc_types[WCD9335]}, - { .compatible = "qcom,wcd9xxx-i2c", - .data = (void *)&wcd9xxx_cdc_types[WCD9330]}, - { } -}; -MODULE_DEVICE_TABLE(of, wcd9xxx_of_match); - -static int wcd9xxx_slim_device_up(struct slim_device *sldev); -static int wcd9xxx_slim_device_down(struct slim_device *sldev); - -struct wcd9xxx_i2c wcd9xxx_modules[MAX_WCD9XXX_DEVICE]; - -/* - * wcd9xxx_vote_ondemand_regulator: Initialize codec dynamic supplies - * - * @wcd9xxx: Pointer to wcd9xxx structure - * @wcd9xxx_pdata: Pointer to wcd9xxx_pdata structure - * @supply_name: supply parameter to initialize regulator - * @enable: flag to initialize/uninitialize supply - * - * Return error code if supply init is failed - */ -int wcd9xxx_vote_ondemand_regulator(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_pdata *pdata, - const char *supply_name, - bool enable) -{ - int i, rc, index = -EINVAL; - - pr_debug("%s: enable %d\n", __func__, enable); - - for (i = 0; i < wcd9xxx->num_of_supplies; ++i) { - if (pdata->regulator[i].ondemand && - wcd9xxx->supplies[i].supply && - !strcmp(wcd9xxx->supplies[i].supply, supply_name)) { - index = i; - break; - } - } - - if (index < 0) { - pr_err("%s: no matching regulator found\n", __func__); - return -EINVAL; - } - - if (enable) { - rc = regulator_set_voltage(wcd9xxx->supplies[index].consumer, - pdata->regulator[index].min_uV, - pdata->regulator[index].max_uV); - if (rc) { - pr_err("%s: set regulator voltage failed for %s, err:%d\n", - __func__, supply_name, rc); - return rc; - } - rc = regulator_set_load(wcd9xxx->supplies[index].consumer, - pdata->regulator[index].optimum_uA); - if (rc < 0) { - pr_err("%s: set regulator optimum mode failed for %s, err:%d\n", - __func__, supply_name, rc); - return rc; - } - } else { - regulator_set_voltage(wcd9xxx->supplies[index].consumer, 0, - pdata->regulator[index].max_uV); - regulator_set_load(wcd9xxx->supplies[index].consumer, 0); - } - - return 0; -} -EXPORT_SYMBOL(wcd9xxx_vote_ondemand_regulator); - -static int wcd9xxx_slim_multi_reg_write(struct wcd9xxx *wcd9xxx, - const void *data, size_t count) -{ - unsigned int reg; - struct device *dev; - u8 val[WCD9XXX_PAGE_SIZE]; - int ret = 0; - int i = 0; - int n = 0; - unsigned int page_num; - size_t num_regs = (count / (REG_BYTES + VAL_BYTES)); - struct wcd9xxx_reg_val *bulk_reg; - u8 *buf; - - dev = wcd9xxx->dev; - if (!data) { - dev_err(dev, "%s: data is NULL\n", __func__); - return -EINVAL; - } - if (num_regs == 0) - return -EINVAL; - - bulk_reg = kzalloc(num_regs * (sizeof(struct wcd9xxx_reg_val)), - GFP_KERNEL); - if (!bulk_reg) - return -ENOMEM; - - buf = (u8 *)data; - reg = *(u16 *)buf; - page_num = WCD9XXX_PAGE_NUM(reg); - for (i = 0, n = 0; n < num_regs; i++, n++) { - reg = *(u16 *)buf; - if (page_num != WCD9XXX_PAGE_NUM(reg)) { - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, - i, false); - page_num = WCD9XXX_PAGE_NUM(reg); - i = 0; - } - buf += REG_BYTES; - val[i] = *buf; - buf += VAL_BYTES; - bulk_reg[i].reg = reg; - bulk_reg[i].buf = &val[i]; - bulk_reg[i].bytes = 1; - } - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, - i, false); - if (ret) - dev_err(dev, "%s: error writing bulk regs\n", - __func__); - - kfree(bulk_reg); - return ret; -} - -/* - * wcd9xxx_interface_reg_read: Read slim interface registers - * - * @wcd9xxx: Pointer to wcd9xxx structure - * @reg: register adderss - * - * Returns register value in success and negative error code in case of failure - */ -int wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg) -{ - u8 val; - int ret; - - mutex_lock(&wcd9xxx->io_lock); - ret = wcd9xxx->read_dev(wcd9xxx, reg, 1, (void *)&val, - true); - if (ret < 0) - dev_err(wcd9xxx->dev, "%s: Codec read 0x%x failed\n", - __func__, reg); - else - dev_dbg(wcd9xxx->dev, "%s: Read 0x%02x from 0x%x\n", - __func__, val, reg); - - mutex_unlock(&wcd9xxx->io_lock); - - if (ret < 0) - return ret; - else - return val; -} -EXPORT_SYMBOL(wcd9xxx_interface_reg_read); - -/* - * wcd9xxx_interface_reg_write: Write slim interface registers - * - * @wcd9xxx: Pointer to wcd9xxx structure - * @reg: register adderss - * @val: value of the register to be written - * - * Returns 0 for success and negative error code in case of failure - */ -int wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg, - u8 val) -{ - int ret; - - mutex_lock(&wcd9xxx->io_lock); - ret = wcd9xxx->write_dev(wcd9xxx, reg, 1, (void *)&val, true); - dev_dbg(wcd9xxx->dev, "%s: Write %02x to 0x%x ret(%d)\n", - __func__, val, reg, ret); - mutex_unlock(&wcd9xxx->io_lock); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_interface_reg_write); - -static int wcd9xxx_slim_read_device(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *dest, bool interface) -{ - int ret; - struct slim_ele_access msg; - int slim_read_tries = WCD9XXX_SLIM_RW_MAX_TRIES; - - msg.start_offset = WCD9XXX_REGISTER_START_OFFSET + reg; - msg.num_bytes = bytes; - msg.comp = NULL; - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No read allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - return 0; - } - - while (1) { - mutex_lock(&wcd9xxx->xfer_lock); - ret = slim_request_val_element(interface ? - wcd9xxx->slim_slave : wcd9xxx->slim, - &msg, dest, bytes); - mutex_unlock(&wcd9xxx->xfer_lock); - if (likely(ret == 0) || (--slim_read_tries == 0)) - break; - usleep_range(5000, 5100); - } - - if (ret) - dev_err(wcd9xxx->dev, "%s: Error, Codec read failed (%d)\n", - __func__, ret); - - return ret; -} - -/* - * Interface specifies whether the write is to the interface or general - * registers. - */ -static int wcd9xxx_slim_write_device(struct wcd9xxx *wcd9xxx, - unsigned short reg, int bytes, void *src, bool interface) -{ - int ret; - struct slim_ele_access msg; - int slim_write_tries = WCD9XXX_SLIM_RW_MAX_TRIES; - - msg.start_offset = WCD9XXX_REGISTER_START_OFFSET + reg; - msg.num_bytes = bytes; - msg.comp = NULL; - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No write allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - return 0; - } - - while (1) { - mutex_lock(&wcd9xxx->xfer_lock); - ret = slim_change_val_element(interface ? - wcd9xxx->slim_slave : wcd9xxx->slim, - &msg, src, bytes); - mutex_unlock(&wcd9xxx->xfer_lock); - if (likely(ret == 0) || (--slim_write_tries == 0)) - break; - usleep_range(5000, 5100); - } - - if (ret) - pr_err("%s: Error, Codec write failed (%d)\n", __func__, ret); - - return ret; -} - -static int wcd9xxx_slim_get_allowed_slice(struct wcd9xxx *wcd9xxx, - int bytes) -{ - int allowed_sz = bytes; - - if (likely(bytes == SLIM_REPEAT_WRITE_MAX_SLICE)) - allowed_sz = 16; - else if (bytes >= 12) - allowed_sz = 12; - else if (bytes >= 8) - allowed_sz = 8; - else if (bytes >= 6) - allowed_sz = 6; - else if (bytes >= 4) - allowed_sz = 4; - else - allowed_sz = bytes; - - return allowed_sz; -} - -/* - * wcd9xxx_slim_write_repeat: Write the same register with multiple values - * @wcd9xxx: handle to wcd core - * @reg: register to be written - * @bytes: number of bytes to be written to reg - * @src: buffer with data content to be written to reg - * This API will write reg with bytes from src in a single slimbus - * transaction. All values from 1 to 16 are supported by this API. - */ -int wcd9xxx_slim_write_repeat(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src) -{ - int ret = 0, bytes_to_write = bytes, bytes_allowed; - struct slim_ele_access slim_msg; - - mutex_lock(&wcd9xxx->io_lock); - if (wcd9xxx->type == WCD9335 || wcd9xxx->type == WCD934X) { - ret = wcd9xxx_page_write(wcd9xxx, ®); - if (ret) - goto done; - } - - slim_msg.start_offset = WCD9XXX_REGISTER_START_OFFSET + reg; - slim_msg.comp = NULL; - - if (unlikely(bytes > SLIM_REPEAT_WRITE_MAX_SLICE)) { - dev_err(wcd9xxx->dev, "%s: size %d not supported\n", - __func__, bytes); - ret = -EINVAL; - goto done; - } - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No write allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - ret = 0; - goto done; - } - - while (bytes_to_write > 0) { - bytes_allowed = wcd9xxx_slim_get_allowed_slice(wcd9xxx, - bytes_to_write); - - slim_msg.num_bytes = bytes_allowed; - mutex_lock(&wcd9xxx->xfer_lock); - ret = slim_user_msg(wcd9xxx->slim, wcd9xxx->slim->laddr, - SLIM_MSG_MT_DEST_REFERRED_USER, - SLIM_USR_MC_REPEAT_CHANGE_VALUE, - &slim_msg, src, bytes_allowed); - mutex_unlock(&wcd9xxx->xfer_lock); - - if (ret) { - dev_err(wcd9xxx->dev, "%s: failed, ret = %d\n", - __func__, ret); - break; - } - - bytes_to_write = bytes_to_write - bytes_allowed; - src = ((u8 *)src) + bytes_allowed; - } - -done: - mutex_unlock(&wcd9xxx->io_lock); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_slim_write_repeat); - -/* - * wcd9xxx_slim_reserve_bw: API to reserve the slimbus bandwidth - * @wcd9xxx: Handle to the wcd9xxx core - * @bw_ops: value of the bandwidth that is requested - * @commit: Flag to indicate if bandwidth change is to be committed - * right away - */ -int wcd9xxx_slim_reserve_bw(struct wcd9xxx *wcd9xxx, - u32 bw_ops, bool commit) -{ - if (!wcd9xxx || !wcd9xxx->slim) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!wcd9xxx) ? "wcd9xxx" : "slim_device"); - return -EINVAL; - } - - return slim_reservemsg_bw(wcd9xxx->slim, bw_ops, commit); -} -EXPORT_SYMBOL(wcd9xxx_slim_reserve_bw); - -/* - * wcd9xxx_slim_bulk_write: API to write multiple registers with one descriptor - * @wcd9xxx: Handle to the wcd9xxx core - * @wcd9xxx_reg_val: structure holding register and values to be written - * @size: Indicates number of messages to be written with one descriptor - * @is_interface: Indicates whether the register is for slim interface or for - * general registers. - * @return: returns 0 if success or error information to the caller in case - * of failure. - */ -int wcd9xxx_slim_bulk_write(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_reg_val *bulk_reg, - unsigned int size, bool is_interface) -{ - int ret, i; - struct slim_val_inf *msgs; - unsigned short reg; - - if (!bulk_reg || !size || !wcd9xxx) { - pr_err("%s: Invalid parameters\n", __func__); - return -EINVAL; - } - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No write allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - return 0; - } - - msgs = kzalloc(size * (sizeof(struct slim_val_inf)), GFP_KERNEL); - if (!msgs) { - ret = -ENOMEM; - goto mem_fail; - } - - mutex_lock(&wcd9xxx->io_lock); - reg = bulk_reg->reg; - for (i = 0; i < size; i++) { - msgs[i].start_offset = WCD9XXX_REGISTER_START_OFFSET + - (bulk_reg->reg & 0xFF); - msgs[i].num_bytes = bulk_reg->bytes; - msgs[i].wbuf = bulk_reg->buf; - bulk_reg++; - } - ret = wcd9xxx_page_write(wcd9xxx, ®); - if (ret) { - pr_err("%s: Page write error for reg: 0x%x\n", - __func__, reg); - goto err; - } - - ret = slim_bulk_msg_write(is_interface ? - wcd9xxx->slim_slave : wcd9xxx->slim, - SLIM_MSG_MT_CORE, - SLIM_MSG_MC_CHANGE_VALUE, msgs, size, - NULL, NULL); - if (ret) - pr_err("%s: Error, Codec bulk write failed (%d)\n", - __func__, ret); - /* 100 usec sleep is needed as per HW requirement */ - usleep_range(100, 110); -err: - mutex_unlock(&wcd9xxx->io_lock); - kfree(msgs); -mem_fail: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_slim_bulk_write); - -static int wcd9xxx_num_irq_regs(const struct wcd9xxx *wcd9xxx) -{ - return (wcd9xxx->codec_type->num_irqs / 8) + - ((wcd9xxx->codec_type->num_irqs % 8) ? 1 : 0); -} - -static int wcd9xxx_regmap_init_cache(struct wcd9xxx *wcd9xxx) -{ - struct regmap_config *regmap_config; - int rc; - - regmap_config = wcd9xxx_get_regmap_config(wcd9xxx->type); - if (!regmap_config) { - dev_err(wcd9xxx->dev, "regmap config is not defined\n"); - return -EINVAL; - } - - rc = regmap_reinit_cache(wcd9xxx->regmap, regmap_config); - if (rc != 0) { - dev_err(wcd9xxx->dev, "%s:Failed to reinit register cache: %d\n", - __func__, rc); - } - - return rc; -} - -static int wcd9xxx_device_init(struct wcd9xxx *wcd9xxx) -{ - int ret = 0, i; - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - regmap_patch_fptr regmap_apply_patch = NULL; - - mutex_init(&wcd9xxx->io_lock); - mutex_init(&wcd9xxx->xfer_lock); - mutex_init(&wcd9xxx->reset_lock); - - ret = wcd9xxx_bringup(wcd9xxx->dev); - if (ret) { - ret = -EPROBE_DEFER; - goto err_bring_up; - } - - wcd9xxx->codec_type = devm_kzalloc(wcd9xxx->dev, - sizeof(struct wcd9xxx_codec_type), GFP_KERNEL); - if (!wcd9xxx->codec_type) { - ret = -ENOMEM; - goto err_bring_up; - } - ret = wcd9xxx_get_codec_info(wcd9xxx->dev); - if (ret) { - ret = -EPROBE_DEFER; - goto fail_cdc_fill; - } - wcd9xxx->version = wcd9xxx->codec_type->version; - if (!wcd9xxx->codec_type->dev || !wcd9xxx->codec_type->size) - goto fail_cdc_fill; - - core_res->parent = wcd9xxx; - core_res->dev = wcd9xxx->dev; - core_res->intr_table = wcd9xxx->codec_type->intr_tbl; - core_res->intr_table_size = wcd9xxx->codec_type->intr_tbl_size; - - for (i = 0; i < WCD9XXX_INTR_REG_MAX; i++) - wcd9xxx->core_res.intr_reg[i] = - wcd9xxx->codec_type->intr_reg[i]; - - wcd9xxx_core_res_init(&wcd9xxx->core_res, - wcd9xxx->codec_type->num_irqs, - wcd9xxx_num_irq_regs(wcd9xxx), - wcd9xxx->regmap); - - if (wcd9xxx_core_irq_init(&wcd9xxx->core_res)) - goto err; - - ret = wcd9xxx_regmap_init_cache(wcd9xxx); - if (ret) - goto err_irq; - - regmap_apply_patch = wcd9xxx_get_regmap_reg_patch( - wcd9xxx->type); - if (regmap_apply_patch) { - ret = regmap_apply_patch(wcd9xxx->regmap, - wcd9xxx->version); - if (ret) - dev_err(wcd9xxx->dev, - "Failed to register patch: %d\n", ret); - } - - ret = mfd_add_devices(wcd9xxx->dev, -1, wcd9xxx->codec_type->dev, - wcd9xxx->codec_type->size, NULL, 0, NULL); - if (ret != 0) { - dev_err(wcd9xxx->dev, "Failed to add children: %d\n", ret); - goto err_irq; - } - - ret = device_init_wakeup(wcd9xxx->dev, true); - if (ret) { - dev_err(wcd9xxx->dev, "Device wakeup init failed: %d\n", ret); - goto err_irq; - } - - return ret; -err_irq: - wcd9xxx_irq_exit(&wcd9xxx->core_res); -fail_cdc_fill: - devm_kfree(wcd9xxx->dev, wcd9xxx->codec_type); - wcd9xxx->codec_type = NULL; -err: - wcd9xxx_bringdown(wcd9xxx->dev); - wcd9xxx_core_res_deinit(&wcd9xxx->core_res); -err_bring_up: - mutex_destroy(&wcd9xxx->io_lock); - mutex_destroy(&wcd9xxx->xfer_lock); - mutex_destroy(&wcd9xxx->reset_lock); - return ret; -} - -static void wcd9xxx_device_exit(struct wcd9xxx *wcd9xxx) -{ - device_init_wakeup(wcd9xxx->dev, false); - wcd9xxx_irq_exit(&wcd9xxx->core_res); - mfd_remove_devices(wcd9xxx->dev); - wcd9xxx_bringdown(wcd9xxx->dev); - wcd9xxx_reset_low(wcd9xxx->dev); - wcd9xxx_core_res_deinit(&wcd9xxx->core_res); - mutex_destroy(&wcd9xxx->io_lock); - mutex_destroy(&wcd9xxx->xfer_lock); - mutex_destroy(&wcd9xxx->reset_lock); - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - slim_remove_device(wcd9xxx->slim_slave); -} - - -#ifdef CONFIG_DEBUG_FS -struct wcd9xxx *debugCodec; - -static struct dentry *debugfs_wcd9xxx_dent; -static struct dentry *debugfs_peek; -static struct dentry *debugfs_poke; -static struct dentry *debugfs_power_state; -static struct dentry *debugfs_reg_dump; - -static unsigned char read_data; - -static int codec_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, long int *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token != NULL) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtoul(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t wcd9xxx_slimslave_reg_show(char __user *ubuf, size_t count, - loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[25]; /* each line is 12 bytes but 25 for margin of error */ - - for (i = (int) *ppos / 12; i <= SLIM_MAX_REG_ADDR; i++) { - reg_val = wcd9xxx_interface_reg_read(debugCodec, i); - len = snprintf(tmp_buf, sizeof(tmp_buf), - "0x%.3x: 0x%.2x\n", i, reg_val); - if (len < 0) { - pr_err("%s: fail to fill the buffer\n", __func__); - total = -EFAULT; - goto copy_err; - } - - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t codec_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[8]; - char *access_str = file->private_data; - ssize_t ret_cnt; - - if (*ppos < 0 || !count) - return -EINVAL; - - if (!strcmp(access_str, "slimslave_peek")) { - snprintf(lbuf, sizeof(lbuf), "0x%x\n", read_data); - ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); - } else if (!strcmp(access_str, "slimslave_reg_dump")) { - ret_cnt = wcd9xxx_slimslave_reg_show(ubuf, count, ppos); - } else { - pr_err("%s: %s not permitted to read\n", __func__, access_str); - ret_cnt = -EPERM; - } - - return ret_cnt; -} - -static void wcd9xxx_set_reset_pin_state(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_pdata *pdata, - bool active) -{ - if (wcd9xxx->wcd_rst_np) { - if (active) - msm_cdc_pinctrl_select_active_state( - wcd9xxx->wcd_rst_np); - else - msm_cdc_pinctrl_select_sleep_state( - wcd9xxx->wcd_rst_np); - - return; - } else if (gpio_is_valid(wcd9xxx->reset_gpio)) { - gpio_direction_output(wcd9xxx->reset_gpio, - (active == true ? 1 : 0)); - } -} - -static int codec_debug_process_cdc_power(char *lbuf) -{ - long int param; - int rc; - struct wcd9xxx_pdata *pdata; - - if (wcd9xxx_get_intf_type() != WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - pr_err("%s: CODEC is not in SLIMBUS mode\n", __func__); - rc = -EPERM; - goto error_intf; - } - - rc = get_parameters(lbuf, ¶m, 1); - - if (likely(!rc)) { - pdata = debugCodec->slim->dev.platform_data; - if (param == 0) { - wcd9xxx_slim_device_down(debugCodec->slim); - msm_cdc_disable_static_supplies(debugCodec->dev, - debugCodec->supplies, - pdata->regulator, - pdata->num_supplies); - wcd9xxx_set_reset_pin_state(debugCodec, pdata, false); - } else if (param == 1) { - msm_cdc_enable_static_supplies(debugCodec->dev, - debugCodec->supplies, - pdata->regulator, - pdata->num_supplies); - usleep_range(1000, 2000); - wcd9xxx_set_reset_pin_state(debugCodec, pdata, false); - usleep_range(1000, 2000); - wcd9xxx_set_reset_pin_state(debugCodec, pdata, true); - usleep_range(1000, 2000); - wcd9xxx_slim_device_up(debugCodec->slim); - } else { - pr_err("%s: invalid command %ld\n", __func__, param); - } - } - -error_intf: - return rc; -} - -static ssize_t codec_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *access_str = filp->private_data; - char lbuf[32]; - int rc; - long int param[5]; - - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - - if (!strcmp(access_str, "slimslave_poke")) { - /* write */ - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= 0x3FF) && (param[1] <= 0xFF) && - (rc == 0)) - wcd9xxx_interface_reg_write(debugCodec, param[0], - param[1]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "slimslave_peek")) { - /* read */ - rc = get_parameters(lbuf, param, 1); - if ((param[0] <= 0x3FF) && (rc == 0)) - read_data = wcd9xxx_interface_reg_read(debugCodec, - param[0]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "power_state")) { - rc = codec_debug_process_cdc_power(lbuf); - } - - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations codec_debug_ops = { - .open = codec_debug_open, - .write = codec_debug_write, - .read = codec_debug_read -}; -#endif - -static struct wcd9xxx_i2c *wcd9xxx_i2c_get_device_info(struct wcd9xxx *wcd9xxx, - u16 reg) -{ - u16 mask = 0x0f00; - int value = 0; - struct wcd9xxx_i2c *wcd9xxx_i2c = NULL; - - if (wcd9xxx->type == WCD9335) { - wcd9xxx_i2c = &wcd9xxx_modules[0]; - } else { - value = ((reg & mask) >> 8) & 0x000f; - switch (value) { - case 0: - wcd9xxx_i2c = &wcd9xxx_modules[0]; - break; - case 1: - wcd9xxx_i2c = &wcd9xxx_modules[1]; - break; - case 2: - wcd9xxx_i2c = &wcd9xxx_modules[2]; - break; - case 3: - wcd9xxx_i2c = &wcd9xxx_modules[3]; - break; - - default: - break; - } - } - return wcd9xxx_i2c; -} - -static int wcd9xxx_i2c_write_device(struct wcd9xxx *wcd9xxx, u16 reg, u8 *value, - u32 bytes) -{ - - struct i2c_msg *msg; - int ret = 0; - u8 reg_addr = 0; - u8 *data = NULL; - struct wcd9xxx_i2c *wcd9xxx_i2c; - - wcd9xxx_i2c = wcd9xxx_i2c_get_device_info(wcd9xxx, reg); - if (wcd9xxx_i2c == NULL || wcd9xxx_i2c->client == NULL) { - pr_err("failed to get device info\n"); - return -ENODEV; - } - - data = kzalloc(bytes + 1, GFP_KERNEL); - if (!data) - return -ENOMEM; - - reg_addr = (u8)reg; - msg = &wcd9xxx_i2c->xfer_msg[0]; - msg->addr = wcd9xxx_i2c->client->addr; - msg->len = bytes + 1; - msg->flags = 0; - data[0] = reg; - data[1] = *value; - msg->buf = data; - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 1); - /* Try again if the write fails */ - if (ret != 1) { - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 1); - if (ret != 1) { - pr_err("failed to write the device\n"); - goto fail; - } - } - pr_debug("write success register = %x val = %x\n", reg, data[1]); -fail: - kfree(data); - return ret; -} - - -static int wcd9xxx_i2c_read_device(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, unsigned char *dest) -{ - struct i2c_msg *msg; - int ret = 0; - u8 reg_addr = 0; - struct wcd9xxx_i2c *wcd9xxx_i2c; - u8 i = 0; - - wcd9xxx_i2c = wcd9xxx_i2c_get_device_info(wcd9xxx, reg); - if (wcd9xxx_i2c == NULL || wcd9xxx_i2c->client == NULL) { - pr_err("failed to get device info\n"); - return -ENODEV; - } - for (i = 0; i < bytes; i++) { - reg_addr = (u8)reg++; - msg = &wcd9xxx_i2c->xfer_msg[0]; - msg->addr = wcd9xxx_i2c->client->addr; - msg->len = 1; - msg->flags = 0; - msg->buf = ®_addr; - - msg = &wcd9xxx_i2c->xfer_msg[1]; - msg->addr = wcd9xxx_i2c->client->addr; - msg->len = 1; - msg->flags = I2C_M_RD; - msg->buf = dest++; - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 2); - - /* Try again if read fails first time */ - if (ret != 2) { - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 2); - if (ret != 2) { - pr_err("failed to read wcd9xxx register\n"); - return ret; - } - } - } - return 0; -} - -int wcd9xxx_i2c_read(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *dest, bool interface_reg) -{ - return wcd9xxx_i2c_read_device(wcd9xxx, reg, bytes, dest); -} - -int wcd9xxx_i2c_write(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src, bool interface_reg) -{ - return wcd9xxx_i2c_write_device(wcd9xxx, reg, src, bytes); -} - -static int wcd9xxx_i2c_get_client_index(struct i2c_client *client, - int *wcd9xx_index) -{ - int ret = 0; - - switch (client->addr) { - case WCD9XXX_I2C_TOP_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_TOP_LEVEL; - break; - case WCD9XXX_ANALOG_I2C_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_ANALOG; - break; - case WCD9XXX_DIGITAL1_I2C_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_DIGITAL_1; - break; - case WCD9XXX_DIGITAL2_I2C_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_DIGITAL_2; - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - -static int wcd9xxx_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct wcd9xxx *wcd9xxx = NULL; - struct wcd9xxx_pdata *pdata = NULL; - int val = 0; - int ret = 0; - int wcd9xx_index = 0; - struct device *dev; - int intf_type; - const struct of_device_id *of_id; - - intf_type = wcd9xxx_get_intf_type(); - - pr_debug("%s: interface status %d\n", __func__, intf_type); - if (intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - dev_dbg(&client->dev, "%s:Codec is detected in slimbus mode\n", - __func__); - return -ENODEV; - } else if (intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - ret = wcd9xxx_i2c_get_client_index(client, &wcd9xx_index); - if (ret != 0) - dev_err(&client->dev, "%s: I2C set codec I2C\n" - "client failed\n", __func__); - else { - dev_err(&client->dev, "%s:probe for other slaves\n" - "devices of codec I2C slave Addr = %x\n", - __func__, client->addr); - wcd9xxx_modules[wcd9xx_index].client = client; - } - return ret; - } else if (intf_type == WCD9XXX_INTERFACE_TYPE_PROBING) { - dev = &client->dev; - if (client->dev.of_node) { - dev_dbg(&client->dev, "%s:Platform data\n" - "from device tree\n", __func__); - pdata = wcd9xxx_populate_dt_data(&client->dev); - if (!pdata) { - dev_err(&client->dev, - "%s: Fail to obtain pdata from device tree\n", - __func__); - ret = -EINVAL; - goto fail; - } - client->dev.platform_data = pdata; - } else { - dev_dbg(&client->dev, "%s:Platform data from\n" - "board file\n", __func__); - pdata = client->dev.platform_data; - } - wcd9xxx = devm_kzalloc(&client->dev, sizeof(struct wcd9xxx), - GFP_KERNEL); - if (!wcd9xxx) { - ret = -ENOMEM; - goto fail; - } - - if (!pdata) { - dev_dbg(&client->dev, "no platform data?\n"); - ret = -EINVAL; - goto fail; - } - wcd9xxx->type = WCD9XXX; - if (client->dev.of_node) { - of_id = of_match_device(wcd9xxx_of_match, &client->dev); - if (of_id) { - wcd9xxx->type = *((int *)of_id->data); - dev_info(&client->dev, "%s: codec type is %d\n", - __func__, wcd9xxx->type); - } - } else { - dev_info(&client->dev, "%s: dev.of_node is NULL, default to WCD9XXX\n", - __func__); - wcd9xxx->type = WCD9XXX; - } - wcd9xxx->regmap = wcd9xxx_regmap_init(&client->dev, - &wcd9xxx_i2c_base_regmap_config); - if (IS_ERR(wcd9xxx->regmap)) { - ret = PTR_ERR(wcd9xxx->regmap); - dev_err(&client->dev, "%s: Failed to allocate register map: %d\n", - __func__, ret); - goto err_codec; - } - wcd9xxx->reset_gpio = pdata->reset_gpio; - wcd9xxx->wcd_rst_np = pdata->wcd_rst_np; - - if (!wcd9xxx->wcd_rst_np) { - pdata->use_pinctrl = false; - dev_err(&client->dev, "%s: pinctrl not used for rst_n\n", - __func__); - goto err_codec; - } - - if (i2c_check_functionality(client->adapter, - I2C_FUNC_I2C) == 0) { - dev_dbg(&client->dev, "can't talk I2C?\n"); - ret = -EIO; - goto fail; - } - dev_set_drvdata(&client->dev, wcd9xxx); - wcd9xxx->dev = &client->dev; - wcd9xxx->dev_up = true; - if (client->dev.of_node) - wcd9xxx->mclk_rate = pdata->mclk_rate; - - wcd9xxx->num_of_supplies = pdata->num_supplies; - ret = msm_cdc_init_supplies_v2(wcd9xxx->dev, &wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies, - pdata->vote_regulator_on_demand); - if (!wcd9xxx->supplies) { - dev_err(wcd9xxx->dev, "%s: Cannot init wcd supplies\n", - __func__); - goto err_codec; - } - ret = msm_cdc_enable_static_supplies(wcd9xxx->dev, - wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(wcd9xxx->dev, "%s: wcd static supply enable failed!\n", - __func__); - goto err_codec; - } - /* For WCD9335, it takes about 600us for the Vout_A and - * Vout_D to be ready after BUCK_SIDO is powered up\ - * SYS_RST_N shouldn't be pulled high during this time - */ - if (wcd9xxx->type == WCD9335) - usleep_range(600, 650); - else - usleep_range(5, 10); - - ret = wcd9xxx_reset(wcd9xxx->dev); - if (ret) { - pr_err("%s: Resetting Codec failed\n", __func__); - goto err_supplies; - } - - ret = wcd9xxx_i2c_get_client_index(client, &wcd9xx_index); - if (ret != 0) { - pr_err("%s:Set codec I2C client failed\n", __func__); - goto err_supplies; - } - - wcd9xxx_modules[wcd9xx_index].client = client; - wcd9xxx->read_dev = wcd9xxx_i2c_read; - wcd9xxx->write_dev = wcd9xxx_i2c_write; - if (!wcd9xxx->dev->of_node) - wcd9xxx_assign_irq(&wcd9xxx->core_res, - pdata->irq, pdata->irq_base); - - ret = wcd9xxx_device_init(wcd9xxx); - if (ret) { - pr_err("%s: error, initializing device failed (%d)\n", - __func__, ret); - goto err_device_init; - } - - ret = wcd9xxx_i2c_read(wcd9xxx, WCD9XXX_A_CHIP_STATUS, 1, - &val, 0); - if (ret < 0) - pr_err("%s: failed to read the wcd9xxx status (%d)\n", - __func__, ret); - if (val != wcd9xxx->codec_type->i2c_chip_status) - pr_err("%s: unknown chip status 0x%x\n", __func__, val); - - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_I2C); - - return ret; - } - - pr_err("%s: I2C probe in wrong state\n", __func__); - - -err_device_init: - wcd9xxx_reset_low(wcd9xxx->dev); -err_supplies: - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - pdata->regulator = NULL; - pdata->num_supplies = 0; -err_codec: - devm_kfree(&client->dev, wcd9xxx); - dev_set_drvdata(&client->dev, NULL); -fail: - return ret; -} - -static int wcd9xxx_i2c_remove(struct i2c_client *client) -{ - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_pdata *pdata = client->dev.platform_data; - - wcd9xxx = dev_get_drvdata(&client->dev); - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - wcd9xxx_device_exit(wcd9xxx); - dev_set_drvdata(&client->dev, NULL); - return 0; -} - -static int wcd9xxx_dt_parse_slim_interface_dev_info(struct device *dev, - struct slim_device *slim_ifd) -{ - int ret = 0; - struct property *prop; - - ret = of_property_read_string(dev->of_node, "qcom,cdc-slim-ifd", - &slim_ifd->name); - if (ret) { - dev_err(dev, "Looking up %s property in node %s failed", - "qcom,cdc-slim-ifd-dev", dev->of_node->full_name); - return -ENODEV; - } - prop = of_find_property(dev->of_node, - "qcom,cdc-slim-ifd-elemental-addr", NULL); - if (!prop) { - dev_err(dev, "Looking up %s property in node %s failed", - "qcom,cdc-slim-ifd-elemental-addr", - dev->of_node->full_name); - return -ENODEV; - } else if (prop->length != 6) { - dev_err(dev, "invalid codec slim ifd addr. addr length = %d\n", - prop->length); - return -ENODEV; - } - memcpy(slim_ifd->e_addr, prop->value, 6); - - return 0; -} - -static int wcd9xxx_slim_get_laddr(struct slim_device *sb, - const u8 *e_addr, u8 e_len, u8 *laddr) -{ - int ret; - const unsigned long timeout = jiffies + - msecs_to_jiffies(SLIMBUS_PRESENT_TIMEOUT); - - do { - ret = slim_get_logical_addr(sb, e_addr, e_len, laddr); - if (!ret) - break; - /* Give SLIMBUS time to report present and be ready. */ - usleep_range(1000, 1100); - pr_debug_ratelimited("%s: retyring get logical addr\n", - __func__); - } while time_before(jiffies, timeout); - - return ret; -} - -static int wcd9xxx_slim_probe(struct slim_device *slim) -{ - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_pdata *pdata; - const struct slim_device_id *device_id; - int ret = 0; - int intf_type; - - if (!slim) - return -EINVAL; - - intf_type = wcd9xxx_get_intf_type(); - - wcd9xxx = devm_kzalloc(&slim->dev, sizeof(struct wcd9xxx), - GFP_KERNEL); - if (!wcd9xxx) - return -ENOMEM; - - if (intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - dev_dbg(&slim->dev, "%s:Codec is detected in I2C mode\n", - __func__); - ret = -ENODEV; - goto err; - } - if (slim->dev.of_node) { - dev_dbg(&slim->dev, "Platform data from device tree\n"); - pdata = wcd9xxx_populate_dt_data(&slim->dev); - if (!pdata) { - dev_err(&slim->dev, - "%s: Fail to obtain pdata from device tree\n", - __func__); - ret = -EINVAL; - goto err; - } - - ret = wcd9xxx_dt_parse_slim_interface_dev_info(&slim->dev, - &pdata->slimbus_slave_device); - if (ret) { - dev_err(&slim->dev, "Error, parsing slim interface\n"); - devm_kfree(&slim->dev, pdata); - ret = -EINVAL; - goto err; - } - slim->dev.platform_data = pdata; - - } else { - dev_info(&slim->dev, "Platform data from board file\n"); - pdata = slim->dev.platform_data; - } - - if (!pdata) { - dev_err(&slim->dev, "Error, no platform data\n"); - ret = -EINVAL; - goto err; - } - - if (!slim->ctrl) { - dev_err(&slim->dev, "%s: Error, no SLIMBUS control data\n", - __func__); - ret = -EINVAL; - goto err_codec; - } - - if (pdata->has_buck_vsel_gpio) - msm_cdc_pinctrl_select_active_state(pdata->buck_vsel_ctl_np); - - if (pdata->has_micb_supply_en_gpio) - msm_cdc_pinctrl_select_active_state(pdata->micb_en_ctl); - - device_id = slim_get_device_id(slim); - if (!device_id) { - dev_err(&slim->dev, "%s: Error, no device id\n", __func__); - ret = -EINVAL; - goto err; - } - - wcd9xxx->type = device_id->driver_data; - dev_info(&slim->dev, "%s: probing for wcd type: %d, name: %s\n", - __func__, wcd9xxx->type, device_id->name); - - /* wcd9xxx members init */ - wcd9xxx->multi_reg_write = wcd9xxx_slim_multi_reg_write; - wcd9xxx->slim = slim; - slim_set_clientdata(slim, wcd9xxx); - wcd9xxx->reset_gpio = pdata->reset_gpio; - wcd9xxx->dev = &slim->dev; - wcd9xxx->mclk_rate = pdata->mclk_rate; - wcd9xxx->dev_up = true; - wcd9xxx->wcd_rst_np = pdata->wcd_rst_np; - - wcd9xxx->regmap = wcd9xxx_regmap_init(&slim->dev, - &wcd9xxx_base_regmap_config); - if (IS_ERR(wcd9xxx->regmap)) { - ret = PTR_ERR(wcd9xxx->regmap); - dev_err(&slim->dev, "%s: Failed to allocate register map: %d\n", - __func__, ret); - goto err_codec; - } - - if (!wcd9xxx->wcd_rst_np) { - pdata->use_pinctrl = false; - dev_err(&slim->dev, "%s: pinctrl not used for rst_n\n", - __func__); - goto err_codec; - } - - wcd9xxx->num_of_supplies = pdata->num_supplies; - ret = msm_cdc_init_supplies_v2(&slim->dev, &wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies, - pdata->vote_regulator_on_demand); - if (!wcd9xxx->supplies) { - dev_err(wcd9xxx->dev, "%s: Cannot init wcd supplies\n", - __func__); - goto err_codec; - } - ret = msm_cdc_enable_static_supplies(wcd9xxx->dev, - wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(wcd9xxx->dev, "%s: wcd static supply enable failed!\n", - __func__); - goto err_codec; - } - - /* - * For WCD9335, it takes about 600us for the Vout_A and - * Vout_D to be ready after BUCK_SIDO is powered up. - * SYS_RST_N shouldn't be pulled high during this time - */ - if (wcd9xxx->type == WCD9335 || wcd9xxx->type == WCD934X) - usleep_range(600, 650); - else - usleep_range(5, 10); - - ret = wcd9xxx_reset(&slim->dev); - if (ret) { - dev_err(&slim->dev, "%s: Resetting Codec failed\n", __func__); - goto err_supplies; - } - - ret = wcd9xxx_slim_get_laddr(wcd9xxx->slim, wcd9xxx->slim->e_addr, - ARRAY_SIZE(wcd9xxx->slim->e_addr), - &wcd9xxx->slim->laddr); - if (ret) { - dev_err(&slim->dev, "%s: failed to get slimbus %s logical address: %d\n", - __func__, wcd9xxx->slim->name, ret); - goto err_reset; - } - wcd9xxx->read_dev = wcd9xxx_slim_read_device; - wcd9xxx->write_dev = wcd9xxx_slim_write_device; - wcd9xxx_pgd_la = wcd9xxx->slim->laddr; - wcd9xxx->slim_slave = &pdata->slimbus_slave_device; - if (!wcd9xxx->dev->of_node) - wcd9xxx_assign_irq(&wcd9xxx->core_res, - pdata->irq, pdata->irq_base); - - ret = slim_add_device(slim->ctrl, wcd9xxx->slim_slave); - if (ret) { - dev_err(&slim->dev, "%s: error, adding SLIMBUS device failed\n", - __func__); - goto err_reset; - } - - ret = wcd9xxx_slim_get_laddr(wcd9xxx->slim_slave, - wcd9xxx->slim_slave->e_addr, - ARRAY_SIZE(wcd9xxx->slim_slave->e_addr), - &wcd9xxx->slim_slave->laddr); - if (ret) { - dev_err(&slim->dev, "%s: failed to get slimbus %s logical address: %d\n", - __func__, wcd9xxx->slim->name, ret); - goto err_slim_add; - } - wcd9xxx_inf_la = wcd9xxx->slim_slave->laddr; - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_SLIMBUS); - - ret = wcd9xxx_device_init(wcd9xxx); - if (ret) { - dev_err(&slim->dev, "%s: error, initializing device failed (%d)\n", - __func__, ret); - goto err_slim_add; - } -#ifdef CONFIG_DEBUG_FS - debugCodec = wcd9xxx; - - debugfs_wcd9xxx_dent = debugfs_create_dir - ("wcd9xxx_core", 0); - if (!IS_ERR(debugfs_wcd9xxx_dent)) { - debugfs_peek = debugfs_create_file("slimslave_peek", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "slimslave_peek", &codec_debug_ops); - - debugfs_poke = debugfs_create_file("slimslave_poke", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "slimslave_poke", &codec_debug_ops); - - debugfs_power_state = debugfs_create_file("power_state", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "power_state", &codec_debug_ops); - - debugfs_reg_dump = debugfs_create_file("slimslave_reg_dump", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "slimslave_reg_dump", &codec_debug_ops); - } -#endif - - return ret; - -err_slim_add: - slim_remove_device(wcd9xxx->slim_slave); -err_reset: - wcd9xxx_reset_low(wcd9xxx->dev); -err_supplies: - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); -err_codec: - slim_set_clientdata(slim, NULL); -err: - devm_kfree(&slim->dev, wcd9xxx); - return ret; -} -static int wcd9xxx_slim_remove(struct slim_device *pdev) -{ - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_pdata *pdata = pdev->dev.platform_data; - -#ifdef CONFIG_DEBUG_FS - debugfs_remove_recursive(debugfs_wcd9xxx_dent); -#endif - wcd9xxx = slim_get_devicedata(pdev); - wcd9xxx_deinit_slimslave(wcd9xxx); - slim_remove_device(wcd9xxx->slim_slave); - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - wcd9xxx_device_exit(wcd9xxx); - slim_set_clientdata(pdev, NULL); - return 0; -} - -static int wcd9xxx_device_up(struct wcd9xxx *wcd9xxx) -{ - int ret = 0; - struct wcd9xxx_core_resource *wcd9xxx_res = &wcd9xxx->core_res; - - dev_info(wcd9xxx->dev, "%s: codec bring up\n", __func__); - wcd9xxx_bringup(wcd9xxx->dev); - ret = wcd9xxx_irq_init(wcd9xxx_res); - if (ret) { - pr_err("%s: wcd9xx_irq_init failed : %d\n", __func__, ret); - } else { - if (wcd9xxx->post_reset) - ret = wcd9xxx->post_reset(wcd9xxx); - } - return ret; -} - -static int wcd9xxx_slim_device_reset(struct slim_device *sldev) -{ - int ret; - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - dev_info(wcd9xxx->dev, "%s: device reset, dev_up = %d\n", - __func__, wcd9xxx->dev_up); - if (wcd9xxx->dev_up) - return 0; - - mutex_lock(&wcd9xxx->reset_lock); - ret = wcd9xxx_reset(wcd9xxx->dev); - if (ret) - dev_err(wcd9xxx->dev, "%s: Resetting Codec failed\n", __func__); - mutex_unlock(&wcd9xxx->reset_lock); - - return ret; -} - -static int wcd9xxx_slim_device_up(struct slim_device *sldev) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - int ret = 0; - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - dev_info(wcd9xxx->dev, "%s: slim device up, dev_up = %d\n", - __func__, wcd9xxx->dev_up); - if (wcd9xxx->dev_up) - return 0; - - wcd9xxx->dev_up = true; - - mutex_lock(&wcd9xxx->reset_lock); - ret = wcd9xxx_device_up(wcd9xxx); - mutex_unlock(&wcd9xxx->reset_lock); - - return ret; -} - -static int wcd9xxx_slim_device_down(struct slim_device *sldev) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - dev_info(wcd9xxx->dev, "%s: device down, dev_up = %d\n", - __func__, wcd9xxx->dev_up); - if (!wcd9xxx->dev_up) - return 0; - - wcd9xxx->dev_up = false; - - mutex_lock(&wcd9xxx->reset_lock); - if (wcd9xxx->dev_down) - wcd9xxx->dev_down(wcd9xxx); - wcd9xxx_irq_exit(&wcd9xxx->core_res); - wcd9xxx_reset_low(wcd9xxx->dev); - mutex_unlock(&wcd9xxx->reset_lock); - - return 0; -} - -static int wcd9xxx_slim_resume(struct slim_device *sldev) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - return wcd9xxx_core_res_resume(&wcd9xxx->core_res); -} - -static int wcd9xxx_i2c_resume(struct device *dev) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - - if (wcd9xxx) - return wcd9xxx_core_res_resume(&wcd9xxx->core_res); - else - return 0; -} - -static int wcd9xxx_slim_suspend(struct slim_device *sldev, pm_message_t pmesg) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - return wcd9xxx_core_res_suspend(&wcd9xxx->core_res, pmesg); -} - -static int wcd9xxx_i2c_suspend(struct device *dev) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - pm_message_t pmesg = {0}; - - if (wcd9xxx) - return wcd9xxx_core_res_suspend(&wcd9xxx->core_res, pmesg); - else - return 0; -} - -static const struct slim_device_id wcd_slim_device_id[] = { - {"sitar-slim", 0}, - {"sitar1p1-slim", 0}, - {"tabla-slim", 0}, - {"tabla2x-slim", 0}, - {"taiko-slim-pgd", 0}, - {"tapan-slim-pgd", 0}, - {"tomtom-slim-pgd", WCD9330}, - {"tasha-slim-pgd", WCD9335}, - {"tavil-slim-pgd", WCD934X}, - {} -}; - -static struct slim_driver wcd_slim_driver = { - .driver = { - .name = "wcd-slim", - .owner = THIS_MODULE, - }, - .probe = wcd9xxx_slim_probe, - .remove = wcd9xxx_slim_remove, - .id_table = wcd_slim_device_id, - .resume = wcd9xxx_slim_resume, - .suspend = wcd9xxx_slim_suspend, - .device_up = wcd9xxx_slim_device_up, - .reset_device = wcd9xxx_slim_device_reset, - .device_down = wcd9xxx_slim_device_down, -}; - -static struct i2c_device_id wcd9xxx_id_table[] = { - {"wcd9xxx-i2c", WCD9XXX_I2C_TOP_LEVEL}, - {"wcd9xxx-i2c", WCD9XXX_I2C_ANALOG}, - {"wcd9xxx-i2c", WCD9XXX_I2C_DIGITAL_1}, - {"wcd9xxx-i2c", WCD9XXX_I2C_DIGITAL_2}, - {} -}; - -static struct i2c_device_id tasha_id_table[] = { - {"tasha-i2c-pgd", WCD9XXX_I2C_TOP_LEVEL}, - {} -}; - -static struct i2c_device_id tavil_id_table[] = { - {"tavil-i2c", WCD9XXX_I2C_TOP_LEVEL}, - {} -}; - -static struct i2c_device_id tabla_id_table[] = { - {"tabla top level", WCD9XXX_I2C_TOP_LEVEL}, - {"tabla analog", WCD9XXX_I2C_ANALOG}, - {"tabla digital1", WCD9XXX_I2C_DIGITAL_1}, - {"tabla digital2", WCD9XXX_I2C_DIGITAL_2}, - {} -}; -MODULE_DEVICE_TABLE(i2c, tabla_id_table); - -static const struct dev_pm_ops wcd9xxx_i2c_pm_ops = { - .suspend = wcd9xxx_i2c_suspend, - .resume = wcd9xxx_i2c_resume, -}; - -static struct i2c_driver tabla_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "tabla-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = tabla_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -static struct i2c_driver wcd9xxx_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "wcd9xxx-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = wcd9xxx_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -static struct i2c_driver wcd9335_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "tasha-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = tasha_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -static struct i2c_driver wcd934x_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "tavil-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = tavil_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -int wcd9xxx_init(void) -{ - int ret[NUM_WCD9XXX_REG_RET] = {0}; - int i = 0; - - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_PROBING); - - ret[0] = i2c_add_driver(&tabla_i2c_driver); - if (ret[0]) - pr_err("%s: Failed to add the tabla2x I2C driver: %d\n", - __func__, ret[0]); - - ret[1] = i2c_add_driver(&wcd9xxx_i2c_driver); - if (ret[1]) - pr_err("%s: Failed to add the wcd9xxx I2C driver: %d\n", - __func__, ret[1]); - - ret[2] = i2c_add_driver(&wcd9335_i2c_driver); - if (ret[2]) - pr_err("%s: Failed to add the wcd9335 I2C driver: %d\n", - __func__, ret[2]); - - ret[3] = slim_driver_register(&wcd_slim_driver); - if (ret[3]) - pr_err("%s: Failed to register wcd SB driver: %d\n", - __func__, ret[3]); - - ret[4] = i2c_add_driver(&wcd934x_i2c_driver); - if (ret[4]) - pr_err("%s: Failed to add the wcd934x I2C driver: %d\n", - __func__, ret[4]); - - for (i = 0; i < NUM_WCD9XXX_REG_RET; i++) { - if (ret[i]) - return ret[i]; - } - - return 0; -} - -void wcd9xxx_exit(void) -{ - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_PROBING); - - i2c_del_driver(&tabla_i2c_driver); - i2c_del_driver(&wcd9xxx_i2c_driver); - i2c_del_driver(&wcd9335_i2c_driver); - i2c_del_driver(&wcd934x_i2c_driver); - slim_driver_unregister(&wcd_slim_driver); -} - -MODULE_DESCRIPTION("Codec core driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-irq.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-irq.c deleted file mode 100644 index c1efba4c69f6..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-irq.c +++ /dev/null @@ -1,894 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BYTE_BIT_MASK(nr) (1UL << ((nr) % BITS_PER_BYTE)) -#define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE) - -#define WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS 100 - -#ifndef NO_IRQ -#define NO_IRQ (-1) -#endif - -#ifdef CONFIG_OF -struct wcd9xxx_irq_drv_data { - struct irq_domain *domain; - int irq; -}; -#endif - -static int virq_to_phyirq( - struct wcd9xxx_core_resource *wcd9xxx_res, int virq); -static int phyirq_to_virq( - struct wcd9xxx_core_resource *wcd9xxx_res, int irq); -static unsigned int wcd9xxx_irq_get_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res); -static void wcd9xxx_irq_put_downstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res); -static void wcd9xxx_irq_put_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res); -static int wcd9xxx_map_irq( - struct wcd9xxx_core_resource *wcd9xxx_res, int irq); - -static void wcd9xxx_irq_lock(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - mutex_lock(&wcd9xxx_res->irq_lock); -} - -static void wcd9xxx_irq_sync_unlock(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - int i; - - if ((ARRAY_SIZE(wcd9xxx_res->irq_masks_cur) > - WCD9XXX_MAX_IRQ_REGS) || - (ARRAY_SIZE(wcd9xxx_res->irq_masks_cache) > - WCD9XXX_MAX_IRQ_REGS)) { - pr_err("%s: Array Size out of bound\n", __func__); - return; - } - if (!wcd9xxx_res->wcd_core_regmap) { - pr_err("%s: Codec core regmap not defined\n", - __func__); - return; - } - - for (i = 0; i < ARRAY_SIZE(wcd9xxx_res->irq_masks_cur); i++) { - /* If there's been a change in the mask write it back - * to the hardware. - */ - if (wcd9xxx_res->irq_masks_cur[i] != - wcd9xxx_res->irq_masks_cache[i]) { - - wcd9xxx_res->irq_masks_cache[i] = - wcd9xxx_res->irq_masks_cur[i]; - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_MASK_BASE] + i, - wcd9xxx_res->irq_masks_cur[i]); - } - } - - mutex_unlock(&wcd9xxx_res->irq_lock); -} - -static void wcd9xxx_irq_enable(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - int wcd9xxx_irq = virq_to_phyirq(wcd9xxx_res, data->irq); - int byte = BIT_BYTE(wcd9xxx_irq); - int size = ARRAY_SIZE(wcd9xxx_res->irq_masks_cur); - - if ((byte < size) && (byte >= 0)) { - wcd9xxx_res->irq_masks_cur[byte] &= - ~(BYTE_BIT_MASK(wcd9xxx_irq)); - } else { - pr_err("%s: Array size is %d but index is %d: Out of range\n", - __func__, size, byte); - } -} - -static void wcd9xxx_irq_disable(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - int wcd9xxx_irq = virq_to_phyirq(wcd9xxx_res, data->irq); - int byte = BIT_BYTE(wcd9xxx_irq); - int size = ARRAY_SIZE(wcd9xxx_res->irq_masks_cur); - - if ((byte < size) && (byte >= 0)) { - wcd9xxx_res->irq_masks_cur[byte] - |= BYTE_BIT_MASK(wcd9xxx_irq); - } else { - pr_err("%s: Array size is %d but index is %d: Out of range\n", - __func__, size, byte); - } -} - -static void wcd9xxx_irq_ack(struct irq_data *data) -{ - int wcd9xxx_irq = 0; - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - - if (wcd9xxx_res == NULL) { - pr_err("%s: wcd9xxx_res is NULL\n", __func__); - return; - } - wcd9xxx_irq = virq_to_phyirq(wcd9xxx_res, data->irq); - pr_debug("%s: IRQ_ACK called for WCD9XXX IRQ: %d\n", - __func__, wcd9xxx_irq); -} - -static void wcd9xxx_irq_mask(struct irq_data *d) -{ - /* do nothing but required as linux calls irq_mask without NULL check */ -} - -static struct irq_chip wcd9xxx_irq_chip = { - .name = "wcd9xxx", - .irq_bus_lock = wcd9xxx_irq_lock, - .irq_bus_sync_unlock = wcd9xxx_irq_sync_unlock, - .irq_disable = wcd9xxx_irq_disable, - .irq_enable = wcd9xxx_irq_enable, - .irq_mask = wcd9xxx_irq_mask, - .irq_ack = wcd9xxx_irq_ack, -}; - -bool wcd9xxx_lock_sleep( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - enum wcd9xxx_pm_state os; - - /* - * wcd9xxx_{lock/unlock}_sleep will be called by wcd9xxx_irq_thread - * and its subroutines only motly. - * but btn0_lpress_fn is not wcd9xxx_irq_thread's subroutine and - * It can race with wcd9xxx_irq_thread. - * So need to embrace wlock_holders with mutex. - * - * If system didn't resume, we can simply return false so codec driver's - * IRQ handler can return without handling IRQ. - * As interrupt line is still active, codec will have another IRQ to - * retry shortly. - */ - mutex_lock(&wcd9xxx_res->pm_lock); - if (wcd9xxx_res->wlock_holders++ == 0) { - pr_debug("%s: holding wake lock\n", __func__); - pm_qos_update_request(&wcd9xxx_res->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - pm_stay_awake(wcd9xxx_res->dev); - } - mutex_unlock(&wcd9xxx_res->pm_lock); - - if (!wait_event_timeout(wcd9xxx_res->pm_wq, - ((os = wcd9xxx_pm_cmpxchg(wcd9xxx_res, - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_AWAKE)) == - WCD9XXX_PM_SLEEPABLE || - (os == WCD9XXX_PM_AWAKE)), - msecs_to_jiffies( - WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS))) { - pr_warn("%s: system didn't resume within %dms, s %d, w %d\n", - __func__, - WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS, wcd9xxx_res->pm_state, - wcd9xxx_res->wlock_holders); - wcd9xxx_unlock_sleep(wcd9xxx_res); - return false; - } - wake_up_all(&wcd9xxx_res->pm_wq); - return true; -} -EXPORT_SYMBOL(wcd9xxx_lock_sleep); - -void wcd9xxx_unlock_sleep( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - mutex_lock(&wcd9xxx_res->pm_lock); - if (--wcd9xxx_res->wlock_holders == 0) { - pr_debug("%s: releasing wake lock pm_state %d -> %d\n", - __func__, wcd9xxx_res->pm_state, WCD9XXX_PM_SLEEPABLE); - /* - * if wcd9xxx_lock_sleep failed, pm_state would be still - * WCD9XXX_PM_ASLEEP, don't overwrite - */ - if (likely(wcd9xxx_res->pm_state == WCD9XXX_PM_AWAKE)) - wcd9xxx_res->pm_state = WCD9XXX_PM_SLEEPABLE; - pm_qos_update_request(&wcd9xxx_res->pm_qos_req, - PM_QOS_DEFAULT_VALUE); - pm_relax(wcd9xxx_res->dev); - } - mutex_unlock(&wcd9xxx_res->pm_lock); - wake_up_all(&wcd9xxx_res->pm_wq); -} -EXPORT_SYMBOL(wcd9xxx_unlock_sleep); - -void wcd9xxx_nested_irq_lock(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - mutex_lock(&wcd9xxx_res->nested_irq_lock); -} - -void wcd9xxx_nested_irq_unlock(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - mutex_unlock(&wcd9xxx_res->nested_irq_lock); -} - - -static void wcd9xxx_irq_dispatch(struct wcd9xxx_core_resource *wcd9xxx_res, - struct intr_data *irqdata) -{ - int irqbit = irqdata->intr_num; - - if (!wcd9xxx_res->wcd_core_regmap) { - pr_err("%s: codec core regmap not defined\n", - __func__); - return; - } - - if (irqdata->clear_first) { - wcd9xxx_nested_irq_lock(wcd9xxx_res); - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLEAR_BASE] + - BIT_BYTE(irqbit), - BYTE_BIT_MASK(irqbit)); - - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLR_COMMIT], - 0x02); - handle_nested_irq(phyirq_to_virq(wcd9xxx_res, irqbit)); - wcd9xxx_nested_irq_unlock(wcd9xxx_res); - } else { - wcd9xxx_nested_irq_lock(wcd9xxx_res); - handle_nested_irq(phyirq_to_virq(wcd9xxx_res, irqbit)); - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLEAR_BASE] + - BIT_BYTE(irqbit), - BYTE_BIT_MASK(irqbit)); - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLR_COMMIT], - 0x02); - - wcd9xxx_nested_irq_unlock(wcd9xxx_res); - } -} - -static irqreturn_t wcd9xxx_irq_thread(int irq, void *data) -{ - int ret; - int i; - struct intr_data irqdata; - char linebuf[128]; - static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 1); - struct wcd9xxx_core_resource *wcd9xxx_res = data; - int num_irq_regs = wcd9xxx_res->num_irq_regs; - struct wcd9xxx *wcd9xxx; - u8 status[4], status1[4] = {0}, unmask_status[4] = {0}; - - if (unlikely(wcd9xxx_lock_sleep(wcd9xxx_res) == false)) { - dev_err(wcd9xxx_res->dev, "Failed to hold suspend\n"); - return IRQ_NONE; - } - - if (!wcd9xxx_res->wcd_core_regmap) { - dev_err(wcd9xxx_res->dev, - "%s: Codec core regmap not supplied\n", - __func__); - goto err_disable_irq; - } - - wcd9xxx = (struct wcd9xxx *)wcd9xxx_res->parent; - if (!wcd9xxx) { - dev_err(wcd9xxx_res->dev, - "%s: Codec core not supplied\n", __func__); - goto err_disable_irq; - } - - if (!wcd9xxx->dev_up) { - dev_info_ratelimited(wcd9xxx_res->dev, "wcd9xxx dev not up\n"); - /* - * sleep to not block the core when device is - * not up (slimbus will not be available) to - * process interrupts. - */ - msleep(10); - } - - memset(status, 0, sizeof(status)); - ret = regmap_bulk_read(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_STATUS_BASE], - status, num_irq_regs); - - if (ret < 0) { - dev_err(wcd9xxx_res->dev, - "Failed to read interrupt status: %d\n", ret); - goto err_disable_irq; - } - /* - * If status is 0 return without clearing. - * status contains: HW status - masked interrupts - * status1 contains: unhandled interrupts - masked interrupts - * unmasked_status contains: unhandled interrupts - */ - if (unlikely(!memcmp(status, status1, sizeof(status)))) { - pr_debug("%s: status is 0\n", __func__); - wcd9xxx_unlock_sleep(wcd9xxx_res); - return IRQ_HANDLED; - } - - /* - * Copy status to unmask_status before masking, otherwise SW may miss - * to clear masked interrupt in corner case. - */ - memcpy(unmask_status, status, sizeof(unmask_status)); - - /* Apply masking */ - for (i = 0; i < num_irq_regs; i++) - status[i] &= ~wcd9xxx_res->irq_masks_cur[i]; - - memcpy(status1, status, sizeof(status1)); - - /* Find out which interrupt was triggered and call that interrupt's - * handler function - * - * Since codec has only one hardware irq line which is shared by - * codec's different internal interrupts, so it's possible master irq - * handler dispatches multiple nested irq handlers after breaking - * order. Dispatch interrupts in the order that is maintained by - * the interrupt table. - */ - for (i = 0; i < wcd9xxx_res->intr_table_size; i++) { - irqdata = wcd9xxx_res->intr_table[i]; - if (status[BIT_BYTE(irqdata.intr_num)] & - BYTE_BIT_MASK(irqdata.intr_num)) { - wcd9xxx_irq_dispatch(wcd9xxx_res, &irqdata); - status1[BIT_BYTE(irqdata.intr_num)] &= - ~BYTE_BIT_MASK(irqdata.intr_num); - unmask_status[BIT_BYTE(irqdata.intr_num)] &= - ~BYTE_BIT_MASK(irqdata.intr_num); - } - } - - /* - * As a failsafe if unhandled irq is found, clear it to prevent - * interrupt storm. - * Note that we can say there was an unhandled irq only when no irq - * handled by nested irq handler since Taiko supports qdsp as irqs' - * destination for few irqs. Therefore driver shouldn't clear pending - * irqs when few handled while few others not. - */ - if (unlikely(!memcmp(status, status1, sizeof(status)))) { - if (__ratelimit(&ratelimit)) { - pr_warn("%s: Unhandled irq found\n", __func__); - hex_dump_to_buffer(status, sizeof(status), 16, 1, - linebuf, sizeof(linebuf), false); - pr_warn("%s: status0 : %s\n", __func__, linebuf); - hex_dump_to_buffer(status1, sizeof(status1), 16, 1, - linebuf, sizeof(linebuf), false); - pr_warn("%s: status1 : %s\n", __func__, linebuf); - } - /* - * unmask_status contains unhandled interrupts, hence clear all - * unhandled interrupts. - */ - ret = regmap_bulk_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLEAR_BASE], - unmask_status, num_irq_regs); - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLR_COMMIT], - 0x02); - } - wcd9xxx_unlock_sleep(wcd9xxx_res); - - return IRQ_HANDLED; - -err_disable_irq: - dev_err(wcd9xxx_res->dev, - "Disable irq %d\n", wcd9xxx_res->irq); - - disable_irq_wake(wcd9xxx_res->irq); - disable_irq_nosync(wcd9xxx_res->irq); - wcd9xxx_unlock_sleep(wcd9xxx_res); - return IRQ_NONE; -} - -/** - * wcd9xxx_free_irq - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * @data: data pointer - * - */ -void wcd9xxx_free_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq, void *data) -{ - free_irq(phyirq_to_virq(wcd9xxx_res, irq), data); -} -EXPORT_SYMBOL(wcd9xxx_free_irq); - -/** - * wcd9xxx_enable_irq - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * - */ -void wcd9xxx_enable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - if (wcd9xxx_res->irq) - enable_irq(phyirq_to_virq(wcd9xxx_res, irq)); -} -EXPORT_SYMBOL(wcd9xxx_enable_irq); - -/** - * wcd9xxx_disable_irq - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * - */ -void wcd9xxx_disable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - if (wcd9xxx_res->irq) - disable_irq_nosync(phyirq_to_virq(wcd9xxx_res, irq)); -} -EXPORT_SYMBOL(wcd9xxx_disable_irq); - -/** - * wcd9xxx_disable_irq_sync - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * - */ -void wcd9xxx_disable_irq_sync( - struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - if (wcd9xxx_res->irq) - disable_irq(phyirq_to_virq(wcd9xxx_res, irq)); -} -EXPORT_SYMBOL(wcd9xxx_disable_irq_sync); - -static int wcd9xxx_irq_setup_downstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - int irq, virq, ret; - - pr_debug("%s: enter\n", __func__); - - for (irq = 0; irq < wcd9xxx_res->num_irqs; irq++) { - /* Map OF irq */ - virq = wcd9xxx_map_irq(wcd9xxx_res, irq); - pr_debug("%s: irq %d -> %d\n", __func__, irq, virq); - if (virq == NO_IRQ) { - pr_err("%s, No interrupt specifier for irq %d\n", - __func__, irq); - return NO_IRQ; - } - - ret = irq_set_chip_data(virq, wcd9xxx_res); - if (ret) { - pr_err("%s: Failed to configure irq %d (%d)\n", - __func__, irq, ret); - return ret; - } - - if (wcd9xxx_res->irq_level_high[irq]) - irq_set_chip_and_handler(virq, &wcd9xxx_irq_chip, - handle_level_irq); - else - irq_set_chip_and_handler(virq, &wcd9xxx_irq_chip, - handle_edge_irq); - - irq_set_nested_thread(virq, 1); - } - - pr_debug("%s: leave\n", __func__); - - return 0; -} - -/** - * wcd9xxx_irq_init - * - * @wcd9xxx_res: pointer to core resource - * - * Returns 0 on success, appropriate error code otherwise - */ -int wcd9xxx_irq_init(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - int i, ret; - u8 *irq_level = NULL; - struct irq_domain *domain; - struct device_node *pnode; - - mutex_init(&wcd9xxx_res->irq_lock); - mutex_init(&wcd9xxx_res->nested_irq_lock); - - pnode = of_irq_find_parent(wcd9xxx_res->dev->of_node); - if (unlikely(!pnode)) - return -EINVAL; - - domain = irq_find_host(pnode); - if (unlikely(!domain)) - return -EINVAL; - - wcd9xxx_res->domain = domain; - - wcd9xxx_res->irq = wcd9xxx_irq_get_upstream_irq(wcd9xxx_res); - if (!wcd9xxx_res->irq) { - pr_warn("%s: irq driver is not yet initialized\n", __func__); - mutex_destroy(&wcd9xxx_res->irq_lock); - mutex_destroy(&wcd9xxx_res->nested_irq_lock); - return -EPROBE_DEFER; - } - pr_debug("%s: probed irq %d\n", __func__, wcd9xxx_res->irq); - - /* Setup downstream IRQs */ - ret = wcd9xxx_irq_setup_downstream_irq(wcd9xxx_res); - if (ret) { - pr_err("%s: Failed to setup downstream IRQ\n", __func__); - goto fail_irq_level; - return ret; - } - - /* All other wcd9xxx interrupts are edge triggered */ - wcd9xxx_res->irq_level_high[0] = true; - - /* mask all the interrupts */ - irq_level = kzalloc(wcd9xxx_res->num_irq_regs, GFP_KERNEL); - if (!irq_level) { - ret = -ENOMEM; - goto fail_irq_level; - } - for (i = 0; i < wcd9xxx_res->num_irqs; i++) { - wcd9xxx_res->irq_masks_cur[BIT_BYTE(i)] |= BYTE_BIT_MASK(i); - wcd9xxx_res->irq_masks_cache[BIT_BYTE(i)] |= BYTE_BIT_MASK(i); - irq_level[BIT_BYTE(i)] |= - wcd9xxx_res->irq_level_high[i] << (i % BITS_PER_BYTE); - } - - if (!wcd9xxx_res->wcd_core_regmap) { - dev_err(wcd9xxx_res->dev, - "%s: Codec core regmap not defined\n", - __func__); - ret = -EINVAL; - goto fail_irq_init; - } - - for (i = 0; i < wcd9xxx_res->num_irq_regs; i++) { - /* Initialize interrupt mask and level registers */ - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_LEVEL_BASE] + i, - irq_level[i]); - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_MASK_BASE] + i, - wcd9xxx_res->irq_masks_cur[i]); - } - - ret = request_threaded_irq(wcd9xxx_res->irq, NULL, wcd9xxx_irq_thread, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - "wcd9xxx", wcd9xxx_res); - if (ret != 0) - dev_err(wcd9xxx_res->dev, "Failed to request IRQ %d: %d\n", - wcd9xxx_res->irq, ret); - else { - ret = enable_irq_wake(wcd9xxx_res->irq); - if (ret) - dev_err(wcd9xxx_res->dev, - "Failed to set wake interrupt on IRQ %d: %d\n", - wcd9xxx_res->irq, ret); - if (ret) - free_irq(wcd9xxx_res->irq, wcd9xxx_res); - } - - if (ret) - goto fail_irq_init; - - kfree(irq_level); - return ret; - -fail_irq_init: - dev_err(wcd9xxx_res->dev, - "%s: Failed to init wcd9xxx irq\n", __func__); - kfree(irq_level); -fail_irq_level: - wcd9xxx_irq_put_upstream_irq(wcd9xxx_res); - mutex_destroy(&wcd9xxx_res->irq_lock); - mutex_destroy(&wcd9xxx_res->nested_irq_lock); - return ret; -} -EXPORT_SYMBOL(wcd9xxx_irq_init); - -int wcd9xxx_request_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - int virq; - - virq = phyirq_to_virq(wcd9xxx_res, irq); - - return request_threaded_irq(virq, NULL, handler, IRQF_TRIGGER_RISING, - name, data); -} -EXPORT_SYMBOL(wcd9xxx_request_irq); - -void wcd9xxx_irq_exit(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - dev_dbg(wcd9xxx_res->dev, "%s: Cleaning up irq %d\n", __func__, - wcd9xxx_res->irq); - - if (wcd9xxx_res->irq) { - disable_irq_wake(wcd9xxx_res->irq); - free_irq(wcd9xxx_res->irq, wcd9xxx_res); - wcd9xxx_res->irq = 0; - wcd9xxx_irq_put_downstream_irq(wcd9xxx_res); - wcd9xxx_irq_put_upstream_irq(wcd9xxx_res); - } - mutex_destroy(&wcd9xxx_res->irq_lock); - mutex_destroy(&wcd9xxx_res->nested_irq_lock); -} - -#ifndef CONFIG_OF -static int phyirq_to_virq( - struct wcd9xxx_core_resource *wcd9xxx_res, - int offset) -{ - return wcd9xxx_res->irq_base + offset; -} - -static int virq_to_phyirq( - struct wcd9xxx_core_resource *wcd9xxx_res, - int virq) -{ - return virq - wcd9xxx_res->irq_base; -} - -static unsigned int wcd9xxx_irq_get_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - return wcd9xxx_res->irq; -} - -static void wcd9xxx_irq_put_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - /* Do nothing */ -} - -static int wcd9xxx_map_irq( - struct wcd9xxx_core_resource *wcd9xxx_core_res, int irq) -{ - return phyirq_to_virq(wcd9xxx_core_res, irq); -} -#else -static struct wcd9xxx_irq_drv_data * -wcd9xxx_irq_add_domain(struct device_node *node, - struct device_node *parent) -{ - struct wcd9xxx_irq_drv_data *data = NULL; - - pr_debug("%s: node %s, node parent %s\n", __func__, - node->name, node->parent->name); - - data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return NULL; - - /* - * wcd9xxx_intc interrupt controller supports N to N irq mapping with - * single cell binding with irq numbers(offsets) only. - * Use irq_domain_simple_ops that has irq_domain_simple_map and - * irq_domain_xlate_onetwocell. - */ - data->domain = irq_domain_add_linear(node, WCD9XXX_MAX_NUM_IRQS, - &irq_domain_simple_ops, data); - if (!data->domain) { - kfree(data); - return NULL; - } - - return data; -} - -static struct wcd9xxx_irq_drv_data * -wcd9xxx_get_irq_drv_d(const struct wcd9xxx_core_resource *wcd9xxx_res) -{ - struct irq_domain *domain; - - domain = wcd9xxx_res->domain; - - if (domain) - return domain->host_data; - else - return NULL; -} - -static int phyirq_to_virq(struct wcd9xxx_core_resource *wcd9xxx_res, int offset) -{ - struct wcd9xxx_irq_drv_data *data; - - data = wcd9xxx_get_irq_drv_d(wcd9xxx_res); - if (!data) { - pr_warn("%s: not registered to interrupt controller\n", - __func__); - return -EINVAL; - } - return irq_linear_revmap(data->domain, offset); -} - -static int virq_to_phyirq(struct wcd9xxx_core_resource *wcd9xxx_res, int virq) -{ - struct irq_data *irq_data = irq_get_irq_data(virq); - - if (unlikely(!irq_data)) { - pr_err("%s: irq_data is NULL", __func__); - return -EINVAL; - } - return irq_data->hwirq; -} - -static unsigned int wcd9xxx_irq_get_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - struct wcd9xxx_irq_drv_data *data; - - data = wcd9xxx_get_irq_drv_d(wcd9xxx_res); - if (!data) { - pr_err("%s: interrupt controller is not registered\n", - __func__); - return 0; - } - - /* Make sure data is updated before return. */ - rmb(); - return data->irq; -} - -static void wcd9xxx_irq_put_downstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - int irq, virq, ret; - - /* - * IRQ migration hits error if the chip data and handles - * are not made NULL. make associated data and handles - * to NULL at irq_exit - */ - for (irq = 0; irq < wcd9xxx_res->num_irqs; irq++) { - virq = wcd9xxx_map_irq(wcd9xxx_res, irq); - pr_debug("%s: irq %d -> %d\n", __func__, irq, virq); - ret = irq_set_chip_data(virq, NULL); - if (ret) { - pr_err("%s: Failed to configure irq %d (%d)\n", - __func__, irq, ret); - return; - } - irq_set_chip_and_handler(virq, NULL, NULL); - } -} - -static void wcd9xxx_irq_put_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - wcd9xxx_res->domain = NULL; -} - -static int wcd9xxx_map_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - return of_irq_to_resource(wcd9xxx_res->dev->of_node, irq, NULL); -} - -static int wcd9xxx_irq_probe(struct platform_device *pdev) -{ - int irq, dir_apps_irq = -EINVAL; - struct wcd9xxx_irq_drv_data *data; - struct device_node *node = pdev->dev.of_node; - int ret = -EINVAL; - - irq = of_get_named_gpio(node, "qcom,gpio-connect", 0); - if (!gpio_is_valid(irq)) - dir_apps_irq = platform_get_irq_byname(pdev, "wcd_irq"); - - if (!gpio_is_valid(irq) && dir_apps_irq < 0) { - dev_err(&pdev->dev, "TLMM connect gpio not found\n"); - return -EPROBE_DEFER; - } - if (dir_apps_irq > 0) { - irq = dir_apps_irq; - } else { - irq = gpio_to_irq(irq); - if (irq < 0) { - dev_err(&pdev->dev, "Unable to configure irq\n"); - return irq; - } - } - dev_dbg(&pdev->dev, "%s: virq = %d\n", __func__, irq); - data = wcd9xxx_irq_add_domain(node, node->parent); - if (!data) { - pr_err("%s: irq_add_domain failed\n", __func__); - return -EINVAL; - } - data->irq = irq; - - /* Make sure irq is saved before return. */ - wmb(); - ret = 0; - - return ret; -} - -static int wcd9xxx_irq_remove(struct platform_device *pdev) -{ - struct irq_domain *domain; - struct wcd9xxx_irq_drv_data *data; - - domain = irq_find_host(pdev->dev.of_node); - if (unlikely(!domain)) { - pr_err("%s: domain is NULL", __func__); - return -EINVAL; - } - data = (struct wcd9xxx_irq_drv_data *)domain->host_data; - data->irq = 0; - - /* Make sure irq variable is updated in data, before irq removal. */ - wmb(); - irq_domain_remove(data->domain); - kfree(data); - - return 0; -} - -static const struct of_device_id of_match[] = { - { .compatible = "qcom,wcd9xxx-irq" }, - { } -}; - -static struct platform_driver wcd9xxx_irq_driver = { - .probe = wcd9xxx_irq_probe, - .remove = wcd9xxx_irq_remove, - .driver = { - .name = "wcd9xxx_intc", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(of_match), - .suppress_bind_attrs = true, - }, -}; - -int wcd9xxx_irq_drv_init(void) -{ - return platform_driver_register(&wcd9xxx_irq_driver); -} - -void wcd9xxx_irq_drv_exit(void) -{ - platform_driver_unregister(&wcd9xxx_irq_driver); -} -#endif /* CONFIG_OF */ diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-resmgr-v2.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-resmgr-v2.c deleted file mode 100644 index d592b37491a5..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-resmgr-v2.c +++ /dev/null @@ -1,686 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include - -#define WCD9XXX_RCO_CALIBRATION_DELAY_INC_US 5000 -/* This register is valid only for WCD9335 */ -#define WCD93XX_ANA_CLK_TOP 0x0602 - -#define WCD93XX_ANA_BIAS 0x0601 -#define WCD93XX_CDC_CLK_RST_CTRL_MCLK_CONTROL 0x0d41 -#define WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL 0x0d42 -#define WCD93XX_CLK_SYS_MCLK_PRG 0x711 -#define WCD93XX_CODEC_RPM_CLK_GATE 0x002 -#define WCD93XX_ANA_RCO 0x603 -#define WCD93XX_ANA_BUCK_CTL 0x606 - -static const char *wcd_resmgr_clk_type_to_str(enum wcd_clock_type clk_type) -{ - if (clk_type == WCD_CLK_OFF) - return "WCD_CLK_OFF"; - else if (clk_type == WCD_CLK_RCO) - return "WCD_CLK_RCO"; - else if (clk_type == WCD_CLK_MCLK) - return "WCD_CLK_MCLK"; - else - return "WCD_CLK_UNDEFINED"; -} - -static int wcd_resmgr_codec_reg_update_bits(struct wcd9xxx_resmgr_v2 *resmgr, - u16 reg, u8 mask, u8 val) -{ - bool change; - int ret; - - if (resmgr->codec_type != WCD9335) { - /* Tavil and Pahu does not support ANA_CLK_TOP register */ - if (reg == WCD93XX_ANA_CLK_TOP) - return 0; - } else { - /* Tasha does not support CLK_SYS_MCLK_PRG register */ - if (reg == WCD93XX_CLK_SYS_MCLK_PRG) - return 0; - } - if (resmgr->codec) { - ret = snd_soc_update_bits(resmgr->codec, reg, mask, val); - } else if (resmgr->core_res->wcd_core_regmap) { - ret = regmap_update_bits_check( - resmgr->core_res->wcd_core_regmap, - reg, mask, val, &change); - if (!ret) - ret = change; - } else { - pr_err("%s: codec/regmap not defined\n", __func__); - ret = -EINVAL; - } - - return ret; -} - -static int wcd_resmgr_codec_reg_read(struct wcd9xxx_resmgr_v2 *resmgr, - unsigned int reg) -{ - int val, ret; - - if (resmgr->codec_type != WCD9335) { - if (reg == WCD93XX_ANA_CLK_TOP) - return 0; - } else { - if (reg == WCD93XX_CLK_SYS_MCLK_PRG) - return 0; - } - if (resmgr->codec) { - val = snd_soc_read(resmgr->codec, reg); - } else if (resmgr->core_res->wcd_core_regmap) { - ret = regmap_read(resmgr->core_res->wcd_core_regmap, - reg, &val); - if (ret) - val = ret; - } else { - pr_err("%s: wcd regmap is null\n", __func__); - return -EINVAL; - } - - return val; -} - -/* - * wcd_resmgr_get_clk_type() - * Returns clk type that is currently enabled - */ -int wcd_resmgr_get_clk_type(struct wcd9xxx_resmgr_v2 *resmgr) -{ - if (!resmgr) { - pr_err("%s: resmgr not initialized\n", __func__); - return -EINVAL; - } - return resmgr->clk_type; -} -EXPORT_SYMBOL(wcd_resmgr_get_clk_type); - -static void wcd_resmgr_cdc_specific_get_clk(struct wcd9xxx_resmgr_v2 *resmgr, - int clk_users) -{ - /* Caller of this function should have acquired BG_CLK lock */ - if (clk_users) { - if (resmgr->resmgr_cb && - resmgr->resmgr_cb->cdc_rco_ctrl) { - while (clk_users--) - resmgr->resmgr_cb->cdc_rco_ctrl(resmgr->codec, - true); - } - } -} - -/* - * wcd_resmgr_post_ssr_v2 - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -void wcd_resmgr_post_ssr_v2(struct wcd9xxx_resmgr_v2 *resmgr) -{ - int old_bg_audio_users; - int old_clk_rco_users, old_clk_mclk_users; - - WCD9XXX_V2_BG_CLK_LOCK(resmgr); - - old_bg_audio_users = resmgr->master_bias_users; - old_clk_mclk_users = resmgr->clk_mclk_users; - old_clk_rco_users = resmgr->clk_rco_users; - resmgr->master_bias_users = 0; - resmgr->clk_mclk_users = 0; - resmgr->clk_rco_users = 0; - resmgr->clk_type = WCD_CLK_OFF; - - pr_debug("%s: old_bg_audio_users=%d old_clk_mclk_users=%d old_clk_rco_users=%d\n", - __func__, old_bg_audio_users, - old_clk_mclk_users, old_clk_rco_users); - - if (old_bg_audio_users) { - while (old_bg_audio_users--) - wcd_resmgr_enable_master_bias(resmgr); - } - - if (old_clk_mclk_users) { - while (old_clk_mclk_users--) - wcd_resmgr_enable_clk_block(resmgr, WCD_CLK_MCLK); - } - - if (old_clk_rco_users) - wcd_resmgr_cdc_specific_get_clk(resmgr, old_clk_rco_users); - - WCD9XXX_V2_BG_CLK_UNLOCK(resmgr); -} -EXPORT_SYMBOL(wcd_resmgr_post_ssr_v2); - -/* - * wcd_resmgr_enable_master_bias: enable codec master bias - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -int wcd_resmgr_enable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr) -{ - mutex_lock(&resmgr->master_bias_lock); - - resmgr->master_bias_users++; - if (resmgr->master_bias_users == 1) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x80, 0x80); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x40, 0x40); - /* - * 1ms delay is required after pre-charge is enabled - * as per HW requirement - */ - usleep_range(1000, 1100); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x40, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_BIAS, 0x20, 0x00); - } - - pr_debug("%s: current master bias users: %d\n", __func__, - resmgr->master_bias_users); - - mutex_unlock(&resmgr->master_bias_lock); - return 0; -} -EXPORT_SYMBOL(wcd_resmgr_enable_master_bias); - -/* - * wcd_resmgr_disable_master_bias: disable codec master bias - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -int wcd_resmgr_disable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr) -{ - mutex_lock(&resmgr->master_bias_lock); - if (resmgr->master_bias_users <= 0) { - mutex_unlock(&resmgr->master_bias_lock); - return -EINVAL; - } - - resmgr->master_bias_users--; - if (resmgr->master_bias_users == 0) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x80, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_BIAS, 0x20, 0x00); - } - mutex_unlock(&resmgr->master_bias_lock); - return 0; -} -EXPORT_SYMBOL(wcd_resmgr_disable_master_bias); - -static int wcd_resmgr_enable_clk_mclk(struct wcd9xxx_resmgr_v2 *resmgr) -{ - /* Enable mclk requires master bias to be enabled first */ - if (resmgr->master_bias_users <= 0) { - pr_err("%s: Cannot turn on MCLK, BG is not enabled\n", - __func__); - return -EINVAL; - } - - if (((resmgr->clk_mclk_users == 0) && - (resmgr->clk_type == WCD_CLK_MCLK)) || - ((resmgr->clk_mclk_users > 0) && - (resmgr->clk_type != WCD_CLK_MCLK))) { - pr_err("%s: Error enabling MCLK, clk_type: %s\n", - __func__, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - return -EINVAL; - } - - if (++resmgr->clk_mclk_users == 1) { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, 0x80, 0x80); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, 0x08, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, 0x04, 0x04); - if (resmgr->codec_type != WCD9335) { - /* - * In tavil clock contrl register is changed - * to CLK_SYS_MCLK_PRG - */ - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x80, 0x80); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x30, 0x10); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x02, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x02, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CODEC_RPM_CLK_GATE, 0x03, 0x00); - } else { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - } - /* - * 10us sleep is required after clock is enabled - * as per HW requirement - */ - usleep_range(10, 15); - } - - resmgr->clk_type = WCD_CLK_MCLK; - - pr_debug("%s: mclk_users: %d, clk_type: %s\n", __func__, - resmgr->clk_mclk_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -static int wcd_resmgr_disable_clk_mclk(struct wcd9xxx_resmgr_v2 *resmgr) -{ - if (resmgr->clk_mclk_users <= 0) { - pr_err("%s: No mclk users, cannot disable mclk\n", __func__); - return -EINVAL; - } - - if (--resmgr->clk_mclk_users == 0) { - if (resmgr->clk_rco_users > 0) { - /* MCLK to RCO switch */ - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, - 0x08, 0x08); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x02, 0x02); - /* Disable clock buffer */ - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x80, 0x00); - resmgr->clk_type = WCD_CLK_RCO; - } else { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, - 0x04, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x81, 0x00); - resmgr->clk_type = WCD_CLK_OFF; - } - - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_CLK_TOP, - 0x80, 0x00); - } - - if ((resmgr->codec_type != WCD9335) && - (resmgr->clk_type == WCD_CLK_OFF)) - wcd_resmgr_set_sido_input_src(resmgr, SIDO_SOURCE_INTERNAL); - - pr_debug("%s: mclk_users: %d, clk_type: %s\n", __func__, - resmgr->clk_mclk_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -static void wcd_resmgr_set_buck_accuracy(struct wcd9xxx_resmgr_v2 *resmgr) -{ - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x02, 0x02); - /* 100us sleep needed after HIGH_ACCURACY_PRE_EN1 */ - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x01, 0x01); - /* 100us sleep needed after HIGH_ACCURACY_PRE_EN2 */ - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x04, 0x04); - /* 100us sleep needed after HIGH_ACCURACY_EN */ - usleep_range(100, 110); -} - -static int wcd_resmgr_enable_clk_rco(struct wcd9xxx_resmgr_v2 *resmgr) -{ - bool rco_cal_done = true; - - resmgr->clk_rco_users++; - if ((resmgr->clk_rco_users == 1) && - ((resmgr->clk_type == WCD_CLK_OFF) || - (resmgr->clk_mclk_users == 0))) { - pr_warn("%s: RCO enable requires MCLK to be ON first\n", - __func__); - resmgr->clk_rco_users--; - return -EINVAL; - } else if ((resmgr->clk_rco_users == 1) && - (resmgr->clk_mclk_users)) { - /* RCO Enable */ - if (resmgr->sido_input_src == SIDO_SOURCE_INTERNAL) { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_RCO, - 0x80, 0x80); - if (resmgr->codec_type != WCD9335) - wcd_resmgr_set_buck_accuracy(resmgr); - } - - /* - * 20us required after RCO BG is enabled as per HW - * requirements - */ - usleep_range(20, 25); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x40, 0x40); - /* - * 20us required after RCO is enabled as per HW - * requirements - */ - usleep_range(20, 25); - /* RCO Calibration */ - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x04, 0x04); - if (resmgr->codec_type != WCD9335) - /* - * For wcd934x and wcd936x codecs, 20us sleep is needed - * after enabling RCO calibration - */ - usleep_range(20, 25); - - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x04, 0x00); - if (resmgr->codec_type != WCD9335) - /* - * For wcd934x and wcd936x codecs, 20us sleep is needed - * after disabling RCO calibration - */ - usleep_range(20, 25); - - /* RCO calibration takes app. 5ms to complete */ - usleep_range(WCD9XXX_RCO_CALIBRATION_DELAY_INC_US, - WCD9XXX_RCO_CALIBRATION_DELAY_INC_US + 100); - if (wcd_resmgr_codec_reg_read(resmgr, WCD93XX_ANA_RCO) & 0x02) - rco_cal_done = false; - - WARN((!rco_cal_done), "RCO Calibration failed\n"); - - /* Switch MUX to RCO */ - if (resmgr->clk_mclk_users == 1) { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, - 0x08, 0x08); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, - 0x02, 0x02); - resmgr->clk_type = WCD_CLK_RCO; - } - } - pr_debug("%s: rco clk users: %d, clk_type: %s\n", __func__, - resmgr->clk_rco_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -static int wcd_resmgr_disable_clk_rco(struct wcd9xxx_resmgr_v2 *resmgr) -{ - if ((resmgr->clk_rco_users <= 0) || - (resmgr->clk_type == WCD_CLK_OFF)) { - pr_err("%s: rco_clk_users = %d, clk_type = %d, cannot disable\n", - __func__, resmgr->clk_rco_users, resmgr->clk_type); - return -EINVAL; - } - - resmgr->clk_rco_users--; - - if ((resmgr->clk_rco_users == 0) && - (resmgr->clk_type == WCD_CLK_RCO)) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_CLK_TOP, - 0x08, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, - 0x02, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_CLK_TOP, - 0x04, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x40, 0x00); - if (resmgr->sido_input_src == SIDO_SOURCE_INTERNAL) - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_RCO, - 0x80, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, - 0x01, 0x00); - resmgr->clk_type = WCD_CLK_OFF; - } else if ((resmgr->clk_rco_users == 0) && - (resmgr->clk_mclk_users)) { - /* Disable RCO while MCLK is ON */ - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x40, 0x00); - if (resmgr->sido_input_src == SIDO_SOURCE_INTERNAL) - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_RCO, - 0x80, 0x00); - } - - if ((resmgr->codec_type != WCD9335) && - (resmgr->clk_type == WCD_CLK_OFF)) - wcd_resmgr_set_sido_input_src(resmgr, SIDO_SOURCE_INTERNAL); - - pr_debug("%s: rco clk users: %d, clk_type: %s\n", __func__, - resmgr->clk_rco_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -/* - * wcd_resmgr_enable_clk_block: enable MCLK or RCO - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - * @type: Clock type to enable - */ -int wcd_resmgr_enable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type) -{ - int ret; - - switch (type) { - case WCD_CLK_MCLK: - ret = wcd_resmgr_enable_clk_mclk(resmgr); - break; - case WCD_CLK_RCO: - ret = wcd_resmgr_enable_clk_rco(resmgr); - break; - default: - pr_err("%s: Unknown Clock type: %s\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - ret = -EINVAL; - break; - }; - - if (ret) - pr_err("%s: Enable clock %s failed\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - - return ret; -} -EXPORT_SYMBOL(wcd_resmgr_enable_clk_block); - -void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src) -{ - if (!resmgr) - return; - - if (sido_src == resmgr->sido_input_src) - return; - - if (sido_src == SIDO_SOURCE_INTERNAL) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x04, 0x00); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x03, 0x00); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x80, 0x00); - usleep_range(100, 110); - resmgr->sido_input_src = SIDO_SOURCE_INTERNAL; - pr_debug("%s: sido input src to internal\n", __func__); - } else if (sido_src == SIDO_SOURCE_RCO_BG) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x80, 0x80); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x02, 0x02); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x01, 0x01); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x04, 0x04); - usleep_range(100, 110); - resmgr->sido_input_src = SIDO_SOURCE_RCO_BG; - pr_debug("%s: sido input src to external\n", __func__); - } -} -EXPORT_SYMBOL(wcd_resmgr_set_sido_input_src); - -/* - * wcd_resmgr_set_sido_input_src_locked: - * Set SIDO input in BG_CLK locked context - * - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - * @sido_src: Select the SIDO input source - */ -void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src) -{ - if (!resmgr) - return; - - WCD9XXX_V2_BG_CLK_LOCK(resmgr); - wcd_resmgr_set_sido_input_src(resmgr, sido_src); - WCD9XXX_V2_BG_CLK_UNLOCK(resmgr); -} -EXPORT_SYMBOL(wcd_resmgr_set_sido_input_src_locked); - -/* - * wcd_resmgr_disable_clk_block: disable MCLK or RCO - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - * @type: Clock type to disable - */ -int wcd_resmgr_disable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type) -{ - int ret; - - switch (type) { - case WCD_CLK_MCLK: - ret = wcd_resmgr_disable_clk_mclk(resmgr); - break; - case WCD_CLK_RCO: - ret = wcd_resmgr_disable_clk_rco(resmgr); - break; - default: - pr_err("%s: Unknown Clock type: %s\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - ret = -EINVAL; - break; - }; - - if (ret) - pr_err("%s: Disable clock %s failed\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - - return ret; -} -EXPORT_SYMBOL(wcd_resmgr_disable_clk_block); - -/* - * wcd_resmgr_init: initialize wcd resource manager - * @core_res: handle to struct wcd9xxx_core_resource - * - * Early init call without a handle to snd_soc_codec * - */ -struct wcd9xxx_resmgr_v2 *wcd_resmgr_init( - struct wcd9xxx_core_resource *core_res, - struct snd_soc_codec *codec) -{ - struct wcd9xxx_resmgr_v2 *resmgr; - struct wcd9xxx *wcd9xxx; - - resmgr = kzalloc(sizeof(struct wcd9xxx_resmgr_v2), GFP_KERNEL); - if (!resmgr) - return ERR_PTR(-ENOMEM); - - wcd9xxx = container_of(core_res, struct wcd9xxx, core_res); - if (!wcd9xxx) { - kfree(resmgr); - pr_err("%s: Cannot get wcd9xx pointer\n", __func__); - return ERR_PTR(-EINVAL); - } - - mutex_init(&resmgr->codec_bg_clk_lock); - mutex_init(&resmgr->master_bias_lock); - resmgr->master_bias_users = 0; - resmgr->clk_mclk_users = 0; - resmgr->clk_rco_users = 0; - resmgr->master_bias_users = 0; - resmgr->codec = codec; - resmgr->core_res = core_res; - resmgr->sido_input_src = SIDO_SOURCE_INTERNAL; - resmgr->codec_type = wcd9xxx->type; - - return resmgr; -} -EXPORT_SYMBOL(wcd_resmgr_init); - -/* - * wcd_resmgr_remove: Clean-up wcd resource manager - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -void wcd_resmgr_remove(struct wcd9xxx_resmgr_v2 *resmgr) -{ - mutex_destroy(&resmgr->master_bias_lock); - kfree(resmgr); -} -EXPORT_SYMBOL(wcd_resmgr_remove); - -/* - * wcd_resmgr_post_init: post init call to assign codec handle - * @resmgr: handle to struct wcd9xxx_resmgr_v2 created during early init - * @resmgr_cb: codec callback function for resmgr - * @codec: handle to struct snd_soc_codec - */ -int wcd_resmgr_post_init(struct wcd9xxx_resmgr_v2 *resmgr, - const struct wcd_resmgr_cb *resmgr_cb, - struct snd_soc_codec *codec) -{ - if (!resmgr) { - pr_err("%s: resmgr not allocated\n", __func__); - return -EINVAL; - } - - if (!codec) { - pr_err("%s: Codec memory is NULL, nothing to post init\n", - __func__); - return -EINVAL; - } - - resmgr->codec = codec; - resmgr->resmgr_cb = resmgr_cb; - - return 0; -} -EXPORT_SYMBOL(wcd_resmgr_post_init); - -MODULE_DESCRIPTION("wcd9xxx resmgr v2 module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-rst.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-rst.c deleted file mode 100644 index 4171a713f6c0..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-rst.c +++ /dev/null @@ -1,435 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - */ - - -#include -#include -#include -#include -#include -#include -#include "wcd9xxx-utils.h" -#include "wcd9335_registers.h" -#include "wcd9335_irq.h" -#include -#include "wcd934x/wcd934x_irq.h" - -/* wcd9335 interrupt table */ -static const struct intr_data wcd9335_intr_table[] = { - {WCD9XXX_IRQ_SLIMBUS, false}, - {WCD9335_IRQ_MBHC_SW_DET, true}, - {WCD9335_IRQ_MBHC_BUTTON_PRESS_DET, true}, - {WCD9335_IRQ_MBHC_BUTTON_RELEASE_DET, true}, - {WCD9335_IRQ_MBHC_ELECT_INS_REM_DET, true}, - {WCD9335_IRQ_MBHC_ELECT_INS_REM_LEG_DET, true}, - {WCD9335_IRQ_FLL_LOCK_LOSS, false}, - {WCD9335_IRQ_HPH_PA_CNPL_COMPLETE, false}, - {WCD9335_IRQ_HPH_PA_CNPR_COMPLETE, false}, - {WCD9335_IRQ_EAR_PA_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA1_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA2_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA3_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA4_CNP_COMPLETE, false}, - {WCD9335_IRQ_HPH_PA_OCPL_FAULT, false}, - {WCD9335_IRQ_HPH_PA_OCPR_FAULT, false}, - {WCD9335_IRQ_EAR_PA_OCP_FAULT, false}, - {WCD9335_IRQ_SOUNDWIRE, false}, - {WCD9335_IRQ_VDD_DIG_RAMP_COMPLETE, false}, - {WCD9335_IRQ_RCO_ERROR, false}, - {WCD9335_IRQ_SVA_ERROR, false}, - {WCD9335_IRQ_MAD_AUDIO, false}, - {WCD9335_IRQ_MAD_BEACON, false}, - {WCD9335_IRQ_SVA_OUTBOX1, true}, - {WCD9335_IRQ_SVA_OUTBOX2, true}, - {WCD9335_IRQ_MAD_ULTRASOUND, false}, - {WCD9335_IRQ_VBAT_ATTACK, false}, - {WCD9335_IRQ_VBAT_RESTORE, false}, -}; - -static const struct intr_data wcd934x_intr_table[] = { - {WCD9XXX_IRQ_SLIMBUS, false}, - {WCD934X_IRQ_MBHC_SW_DET, true}, - {WCD934X_IRQ_MBHC_BUTTON_PRESS_DET, true}, - {WCD934X_IRQ_MBHC_BUTTON_RELEASE_DET, true}, - {WCD934X_IRQ_MBHC_ELECT_INS_REM_DET, true}, - {WCD934X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, true}, - {WCD934X_IRQ_MISC, false}, - {WCD934X_IRQ_HPH_PA_CNPL_COMPLETE, false}, - {WCD934X_IRQ_HPH_PA_CNPR_COMPLETE, false}, - {WCD934X_IRQ_EAR_PA_CNP_COMPLETE, false}, - {WCD934X_IRQ_LINE_PA1_CNP_COMPLETE, false}, - {WCD934X_IRQ_LINE_PA2_CNP_COMPLETE, false}, - {WCD934X_IRQ_SLNQ_ANALOG_ERROR, false}, - {WCD934X_IRQ_RESERVED_3, false}, - {WCD934X_IRQ_HPH_PA_OCPL_FAULT, false}, - {WCD934X_IRQ_HPH_PA_OCPR_FAULT, false}, - {WCD934X_IRQ_EAR_PA_OCP_FAULT, false}, - {WCD934X_IRQ_SOUNDWIRE, false}, - {WCD934X_IRQ_VDD_DIG_RAMP_COMPLETE, false}, - {WCD934X_IRQ_RCO_ERROR, false}, - {WCD934X_IRQ_CPE_ERROR, false}, - {WCD934X_IRQ_MAD_AUDIO, false}, - {WCD934X_IRQ_MAD_BEACON, false}, - {WCD934X_IRQ_CPE1_INTR, true}, - {WCD934X_IRQ_RESERVED_4, false}, - {WCD934X_IRQ_MAD_ULTRASOUND, false}, - {WCD934X_IRQ_VBAT_ATTACK, false}, - {WCD934X_IRQ_VBAT_RESTORE, false}, -}; - -/* - * wcd9335_bring_down: Bringdown WCD Codec - * - * @wcd9xxx: Pointer to wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9335_bring_down(struct wcd9xxx *wcd9xxx) -{ - if (!wcd9xxx || !wcd9xxx->regmap) - return -EINVAL; - - regmap_write(wcd9xxx->regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x04); - - return 0; -} - -/* - * wcd9335_bring_up: Bringup WCD Codec - * - * @wcd9xxx: Pointer to the wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9335_bring_up(struct wcd9xxx *wcd9xxx) -{ - int ret = 0; - int val, byte0; - struct regmap *wcd_regmap; - - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null!\n", - __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - regmap_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, &val); - regmap_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, &byte0); - - if ((val < 0) || (byte0 < 0)) { - dev_err(wcd9xxx->dev, "%s: tasha codec version detection fail!\n", - __func__); - return -EINVAL; - } - if ((val & 0x80) && (byte0 == 0x0)) { - dev_info(wcd9xxx->dev, "%s: wcd9335 codec version is v1.1\n", - __func__); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_2, 0xFC); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_4, 0x21); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x5); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x7); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x3); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x3); - } else if (byte0 == 0x1) { - dev_info(wcd9xxx->dev, "%s: wcd9335 codec version is v2.0\n", - __func__); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_TEST_2, 0x00); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_8, 0x6F); - regmap_write(wcd_regmap, WCD9335_BIAS_VBG_FINE_ADJ, 0x65); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x5); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x7); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x3); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x3); - } else if ((byte0 == 0) && (!(val & 0x80))) { - dev_info(wcd9xxx->dev, "%s: wcd9335 codec version is v1.0\n", - __func__); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_2, 0xFC); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_4, 0x21); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x3); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x3); - } else { - dev_err(wcd9xxx->dev, "%s: tasha codec version unknown\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -/* - * wcd9335_get_cdc_info: Get codec specific information - * - * @wcd9xxx: pointer to wcd9xxx structure - * @wcd_type: pointer to wcd9xxx_codec_type structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9335_get_cdc_info(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_codec_type *wcd_type) -{ - u16 id_minor, id_major; - struct regmap *wcd_regmap; - int rc, val, version = 0; - - if (!wcd9xxx || !wcd_type) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null!\n", - __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - rc = regmap_bulk_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, - (u8 *)&id_minor, sizeof(u16)); - if (rc) - return -EINVAL; - - rc = regmap_bulk_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE2, - (u8 *)&id_major, sizeof(u16)); - if (rc) - return -EINVAL; - - dev_info(wcd9xxx->dev, "%s: wcd9xxx chip id major 0x%x, minor 0x%x\n", - __func__, id_major, id_minor); - - /* Version detection */ - if (id_major == TASHA_MAJOR) { - regmap_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, - &val); - version = ((u8)val & 0x80) >> 7; - } else if (id_major == TASHA2P0_MAJOR) - version = 2; - else - dev_err(wcd9xxx->dev, "%s: wcd9335 version unknown (major 0x%x, minor 0x%x)\n", - __func__, id_major, id_minor); - - /* Fill codec type info */ - wcd_type->id_major = id_major; - wcd_type->id_minor = id_minor; - wcd_type->num_irqs = WCD9335_NUM_IRQS; - wcd_type->version = version; - wcd_type->slim_slave_type = WCD9XXX_SLIM_SLAVE_ADDR_TYPE_1; - wcd_type->i2c_chip_status = 0x01; - wcd_type->intr_tbl = wcd9335_intr_table; - wcd_type->intr_tbl_size = ARRAY_SIZE(wcd9335_intr_table); - - wcd_type->intr_reg[WCD9XXX_INTR_STATUS_BASE] = - WCD9335_INTR_PIN1_STATUS0; - wcd_type->intr_reg[WCD9XXX_INTR_CLEAR_BASE] = - WCD9335_INTR_PIN1_CLEAR0; - wcd_type->intr_reg[WCD9XXX_INTR_MASK_BASE] = - WCD9335_INTR_PIN1_MASK0; - wcd_type->intr_reg[WCD9XXX_INTR_LEVEL_BASE] = - WCD9335_INTR_LEVEL0; - wcd_type->intr_reg[WCD9XXX_INTR_CLR_COMMIT] = - WCD9335_INTR_CLR_COMMIT; - - return rc; -} - -/* - * wcd934x_bring_down: Bringdown WCD Codec - * - * @wcd9xxx: Pointer to wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd934x_bring_down(struct wcd9xxx *wcd9xxx) -{ - if (!wcd9xxx || !wcd9xxx->regmap) - return -EINVAL; - - regmap_write(wcd9xxx->regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x04); - - return 0; -} - -/* - * wcd934x_bring_up: Bringup WCD Codec - * - * @wcd9xxx: Pointer to the wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd934x_bring_up(struct wcd9xxx *wcd9xxx) -{ - struct regmap *wcd_regmap; - - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null!\n", - __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD934X_SIDO_NEW_VOUT_A_STARTUP, 0x19); - regmap_write(wcd_regmap, WCD934X_SIDO_NEW_VOUT_D_STARTUP, 0x15); - /* Add 1msec delay for VOUT to settle */ - usleep_range(1000, 1100); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x5); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x7); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_RST_CTL, 0x3); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_RST_CTL, 0x7); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x3); - - return 0; -} - -/* - * wcd934x_get_cdc_info: Get codec specific information - * - * @wcd9xxx: pointer to wcd9xxx structure - * @wcd_type: pointer to wcd9xxx_codec_type structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd934x_get_cdc_info(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_codec_type *wcd_type) -{ - u16 id_minor, id_major; - struct regmap *wcd_regmap; - int rc, version = -1; - - if (!wcd9xxx || !wcd_type) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null\n", __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - rc = regmap_bulk_read(wcd_regmap, WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0, - (u8 *)&id_minor, sizeof(u16)); - if (rc) - return -EINVAL; - - rc = regmap_bulk_read(wcd_regmap, WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE2, - (u8 *)&id_major, sizeof(u16)); - if (rc) - return -EINVAL; - - dev_info(wcd9xxx->dev, "%s: wcd9xxx chip id major 0x%x, minor 0x%x\n", - __func__, id_major, id_minor); - - if (id_major != TAVIL_MAJOR) - goto version_unknown; - - /* - * As fine version info cannot be retrieved before tavil probe. - * Assign coarse versions for possible future use before tavil probe. - */ - if (id_minor == cpu_to_le16(0)) - version = TAVIL_VERSION_1_0; - else if (id_minor == cpu_to_le16(0x01)) - version = TAVIL_VERSION_1_1; - -version_unknown: - if (version < 0) - dev_err(wcd9xxx->dev, "%s: wcd934x version unknown\n", - __func__); - - /* Fill codec type info */ - wcd_type->id_major = id_major; - wcd_type->id_minor = id_minor; - wcd_type->num_irqs = WCD934X_NUM_IRQS; - wcd_type->version = version; - wcd_type->slim_slave_type = WCD9XXX_SLIM_SLAVE_ADDR_TYPE_1; - wcd_type->i2c_chip_status = 0x01; - wcd_type->intr_tbl = wcd934x_intr_table; - wcd_type->intr_tbl_size = ARRAY_SIZE(wcd934x_intr_table); - - wcd_type->intr_reg[WCD9XXX_INTR_STATUS_BASE] = - WCD934X_INTR_PIN1_STATUS0; - wcd_type->intr_reg[WCD9XXX_INTR_CLEAR_BASE] = - WCD934X_INTR_PIN1_CLEAR0; - wcd_type->intr_reg[WCD9XXX_INTR_MASK_BASE] = - WCD934X_INTR_PIN1_MASK0; - wcd_type->intr_reg[WCD9XXX_INTR_LEVEL_BASE] = - WCD934X_INTR_LEVEL0; - wcd_type->intr_reg[WCD9XXX_INTR_CLR_COMMIT] = - WCD934X_INTR_CLR_COMMIT; - - return rc; -} - -codec_bringdown_fn wcd9xxx_bringdown_fn(int type) -{ - codec_bringdown_fn cdc_bdown_fn; - - switch (type) { - case WCD934X: - cdc_bdown_fn = wcd934x_bring_down; - break; - case WCD9335: - cdc_bdown_fn = wcd9335_bring_down; - break; - default: - cdc_bdown_fn = NULL; - break; - } - - return cdc_bdown_fn; -} - -codec_bringup_fn wcd9xxx_bringup_fn(int type) -{ - codec_bringup_fn cdc_bup_fn; - - switch (type) { - case WCD934X: - cdc_bup_fn = wcd934x_bring_up; - break; - case WCD9335: - cdc_bup_fn = wcd9335_bring_up; - break; - default: - cdc_bup_fn = NULL; - break; - } - - return cdc_bup_fn; -} - -codec_type_fn wcd9xxx_get_codec_info_fn(int type) -{ - codec_type_fn cdc_type_fn; - - switch (type) { - case WCD934X: - cdc_type_fn = wcd934x_get_cdc_info; - break; - case WCD9335: - cdc_type_fn = wcd9335_get_cdc_info; - break; - default: - cdc_type_fn = NULL; - break; - } - - return cdc_type_fn; -} - diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-slimslave.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-slimslave.c deleted file mode 100644 index 502bbf55e569..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-slimslave.c +++ /dev/null @@ -1,576 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include - -struct wcd9xxx_slim_sch { - u16 rx_port_ch_reg_base; - u16 port_tx_cfg_reg_base; - u16 port_rx_cfg_reg_base; -}; - -static struct wcd9xxx_slim_sch sh_ch; - -static int wcd9xxx_alloc_slim_sh_ch(struct wcd9xxx *wcd9xxx, - u8 wcd9xxx_pgd_la, u32 cnt, - struct wcd9xxx_ch *channels, u32 path); - -static int wcd9xxx_dealloc_slim_sh_ch(struct slim_device *slim, - u32 cnt, struct wcd9xxx_ch *channels); - -static int wcd9xxx_configure_ports(struct wcd9xxx *wcd9xxx) -{ - if (wcd9xxx->codec_type->slim_slave_type == - WCD9XXX_SLIM_SLAVE_ADDR_TYPE_0) { - sh_ch.rx_port_ch_reg_base = 0x180; - sh_ch.port_rx_cfg_reg_base = 0x040; - sh_ch.port_tx_cfg_reg_base = 0x040; - } else { - sh_ch.rx_port_ch_reg_base = - 0x180 - (TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS * 4); - sh_ch.port_rx_cfg_reg_base = - 0x040 - TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS; - sh_ch.port_tx_cfg_reg_base = 0x050; - } - - return 0; -} - -/** - * wcd9xxx_init_slimslave - * - * @wcd9xxx: pointer to wcd9xxx struct - * @wcd9xxx_pgd_la: pgd_la value - * @tx_num: tx number - * @rx_num: rx number - * @tx_slot: pointer to tx slot - * @rx_slot: pointer to rx slot - * - * Returns 0 on success, appropriate error code otherwise - */ -int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - int ret = 0; - int i; - - ret = wcd9xxx_configure_ports(wcd9xxx); - if (ret) { - pr_err("%s: Failed to configure register address offset\n", - __func__); - goto err; - } - - if (!rx_num || rx_num > wcd9xxx->num_rx_port) { - pr_err("%s: invalid rx num %d\n", __func__, rx_num); - return -EINVAL; - } - if (wcd9xxx->rx_chs) { - wcd9xxx->num_rx_port = rx_num; - for (i = 0; i < rx_num; i++) { - wcd9xxx->rx_chs[i].ch_num = rx_slot[i]; - INIT_LIST_HEAD(&wcd9xxx->rx_chs[i].list); - } - ret = wcd9xxx_alloc_slim_sh_ch(wcd9xxx, wcd9xxx_pgd_la, - wcd9xxx->num_rx_port, - wcd9xxx->rx_chs, - SLIM_SINK); - if (ret) { - pr_err("%s: Failed to alloc %d rx slimbus channels\n", - __func__, wcd9xxx->num_rx_port); - kfree(wcd9xxx->rx_chs); - wcd9xxx->rx_chs = NULL; - wcd9xxx->num_rx_port = 0; - } - } else { - pr_err("Not able to allocate memory for %d slimbus rx ports\n", - wcd9xxx->num_rx_port); - } - - if (!tx_num || tx_num > wcd9xxx->num_tx_port) { - pr_err("%s: invalid tx num %d\n", __func__, tx_num); - return -EINVAL; - } - if (wcd9xxx->tx_chs) { - wcd9xxx->num_tx_port = tx_num; - for (i = 0; i < tx_num; i++) { - wcd9xxx->tx_chs[i].ch_num = tx_slot[i]; - INIT_LIST_HEAD(&wcd9xxx->tx_chs[i].list); - } - ret = wcd9xxx_alloc_slim_sh_ch(wcd9xxx, wcd9xxx_pgd_la, - wcd9xxx->num_tx_port, - wcd9xxx->tx_chs, - SLIM_SRC); - if (ret) { - pr_err("%s: Failed to alloc %d tx slimbus channels\n", - __func__, wcd9xxx->num_tx_port); - kfree(wcd9xxx->tx_chs); - wcd9xxx->tx_chs = NULL; - wcd9xxx->num_tx_port = 0; - } - } else { - pr_err("Not able to allocate memory for %d slimbus tx ports\n", - wcd9xxx->num_tx_port); - } - return 0; -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_init_slimslave); - -int wcd9xxx_deinit_slimslave(struct wcd9xxx *wcd9xxx) -{ - if (wcd9xxx->num_rx_port) { - wcd9xxx_dealloc_slim_sh_ch(wcd9xxx->slim, - wcd9xxx->num_rx_port, - wcd9xxx->rx_chs); - wcd9xxx->num_rx_port = 0; - } - if (wcd9xxx->num_tx_port) { - wcd9xxx_dealloc_slim_sh_ch(wcd9xxx->slim, - wcd9xxx->num_tx_port, - wcd9xxx->tx_chs); - wcd9xxx->num_tx_port = 0; - } - return 0; -} - - -static int wcd9xxx_alloc_slim_sh_ch(struct wcd9xxx *wcd9xxx, - u8 wcd9xxx_pgd_la, u32 cnt, - struct wcd9xxx_ch *channels, u32 path) -{ - int ret = 0; - u32 ch_idx; - - /* The slimbus channel allocation seem take longer time - * so do the allocation up front to avoid delay in start of - * playback - */ - pr_debug("%s: pgd_la[%d]\n", __func__, wcd9xxx_pgd_la); - for (ch_idx = 0; ch_idx < cnt; ch_idx++) { - ret = slim_get_slaveport(wcd9xxx_pgd_la, - channels[ch_idx].port, - &channels[ch_idx].sph, path); - pr_debug("%s: pgd_la[%d] channels[%d].port[%d]\n" - "channels[%d].sph[%d] path[%d]\n", - __func__, wcd9xxx_pgd_la, ch_idx, - channels[ch_idx].port, - ch_idx, channels[ch_idx].sph, path); - if (ret < 0) { - pr_err("%s: slave port failure id[%d] ret[%d]\n", - __func__, channels[ch_idx].ch_num, ret); - goto err; - } - - ret = slim_query_ch(wcd9xxx->slim, - channels[ch_idx].ch_num, - &channels[ch_idx].ch_h); - if (ret < 0) { - pr_err("%s: slim_query_ch failed ch-num[%d] ret[%d]\n", - __func__, channels[ch_idx].ch_num, ret); - goto err; - } - } -err: - return ret; -} - -static int wcd9xxx_dealloc_slim_sh_ch(struct slim_device *slim, - u32 cnt, struct wcd9xxx_ch *channels) -{ - int idx = 0; - int ret = 0; - /* slim_dealloc_ch */ - for (idx = 0; idx < cnt; idx++) { - ret = slim_dealloc_ch(slim, channels[idx].ch_h); - if (ret < 0) { - pr_err("%s: slim_dealloc_ch fail ret[%d] ch_h[%d]\n", - __func__, ret, channels[idx].ch_h); - } - } - return ret; -} - -/* Enable slimbus slave device for RX path */ -int wcd9xxx_cfg_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph) -{ - u8 ch_cnt = 0; - u16 ch_h[SLIM_MAX_RX_PORTS] = {0}; - u8 payload = 0; - u16 codec_port = 0; - int ret; - struct slim_ch prop; - struct wcd9xxx_ch *rx; - int size = ARRAY_SIZE(ch_h); - - /* Configure slave interface device */ - - list_for_each_entry(rx, wcd9xxx_ch_list, list) { - payload |= 1 << rx->shift; - if (ch_cnt < size) { - ch_h[ch_cnt] = rx->ch_h; - ch_cnt++; - pr_debug("list ch->ch_h %d ch->sph %d\n", - rx->ch_h, rx->sph); - } else { - pr_err("%s: allocated channel number %u is out of max rangae %d\n", - __func__, ch_cnt, - size); - ret = EINVAL; - goto err; - } - } - pr_debug("%s: ch_cnt[%d] rate=%d WATER_MARK_VAL %d\n", - __func__, ch_cnt, rate, WATER_MARK_VAL); - /* slim_define_ch api */ - prop.prot = SLIM_AUTO_ISO; - if ((rate == 44100) || (rate == 88200) || (rate == 176400) || - (rate == 352800)) { - prop.baser = SLIM_RATE_11025HZ; - prop.ratem = (rate/11025); - } else { - prop.baser = SLIM_RATE_4000HZ; - prop.ratem = (rate/4000); - } - prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; - prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; - prop.sampleszbits = bit_width; - - pr_debug("Before slim_define_ch:\n" - "ch_cnt %d,ch_h[0] %d ch_h[1] %d, grph %d\n", - ch_cnt, ch_h[0], ch_h[1], *grph); - ret = slim_define_ch(wcd9xxx->slim, &prop, ch_h, ch_cnt, - true, grph); - if (ret < 0) { - pr_err("%s: slim_define_ch failed ret[%d]\n", - __func__, ret); - goto err; - } - - list_for_each_entry(rx, wcd9xxx_ch_list, list) { - codec_port = rx->port; - pr_debug("%s: codec_port %d rx 0x%p, payload %d\n" - "sh_ch.rx_port_ch_reg_base0 0x%x\n" - "sh_ch.port_rx_cfg_reg_base 0x%x\n", - __func__, codec_port, rx, payload, - sh_ch.rx_port_ch_reg_base, - sh_ch.port_rx_cfg_reg_base); - - /* look for the valid port range and chose the - * payload accordingly - */ - /* write to interface device */ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_RX_PORT_MULTI_CHANNEL_0( - sh_ch.rx_port_ch_reg_base, codec_port), - payload); - - if (ret < 0) { - pr_err("%s:Intf-dev fail reg[%d] payload[%d] ret[%d]\n", - __func__, - SB_PGD_RX_PORT_MULTI_CHANNEL_0( - sh_ch.rx_port_ch_reg_base, codec_port), - payload, ret); - goto err; - } - /* configure the slave port for water mark and enable*/ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_PORT_CFG_BYTE_ADDR( - sh_ch.port_rx_cfg_reg_base, codec_port), - WATER_MARK_VAL); - if (ret < 0) { - pr_err("%s:watermark set failure for port[%d] ret[%d]", - __func__, codec_port, ret); - } - - ret = slim_connect_sink(wcd9xxx->slim, &rx->sph, 1, rx->ch_h); - if (ret < 0) { - pr_err("%s: slim_connect_sink failed ret[%d]\n", - __func__, ret); - goto err_close_slim_sch; - } - } - /* slim_control_ch */ - ret = slim_control_ch(wcd9xxx->slim, *grph, SLIM_CH_ACTIVATE, - true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", - __func__, ret); - goto err_close_slim_sch; - } - return 0; - -err_close_slim_sch: - /* release all acquired handles */ - wcd9xxx_close_slim_sch_rx(wcd9xxx, wcd9xxx_ch_list, *grph); -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_cfg_slim_sch_rx); - -/* Enable slimbus slave device for RX path */ -int wcd9xxx_cfg_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph) -{ - u16 ch_cnt = 0; - u16 payload = 0; - u16 ch_h[SLIM_MAX_TX_PORTS] = {0}; - u16 codec_port; - int ret = 0; - struct wcd9xxx_ch *tx; - int size = ARRAY_SIZE(ch_h); - - struct slim_ch prop; - - list_for_each_entry(tx, wcd9xxx_ch_list, list) { - payload |= 1 << tx->shift; - if (ch_cnt < size) { - ch_h[ch_cnt] = tx->ch_h; - ch_cnt++; - } else { - pr_err("%s: allocated channel number %u is out of max rangae %d\n", - __func__, ch_cnt, - size); - ret = EINVAL; - goto err; - } - } - - /* slim_define_ch api */ - prop.prot = SLIM_AUTO_ISO; - prop.baser = SLIM_RATE_4000HZ; - prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; - prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; - prop.ratem = (rate/4000); - prop.sampleszbits = bit_width; - ret = slim_define_ch(wcd9xxx->slim, &prop, ch_h, ch_cnt, - true, grph); - if (ret < 0) { - pr_err("%s: slim_define_ch failed ret[%d]\n", - __func__, ret); - goto err; - } - - pr_debug("%s: ch_cnt[%d] rate[%d] bitwidth[%u]\n", __func__, ch_cnt, - rate, bit_width); - list_for_each_entry(tx, wcd9xxx_ch_list, list) { - codec_port = tx->port; - pr_debug("%s: codec_port %d tx 0x%p, payload 0x%x\n", - __func__, codec_port, tx, payload); - /* write to interface device */ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_TX_PORT_MULTI_CHANNEL_0(codec_port), - payload & 0x00FF); - if (ret < 0) { - pr_err("%s:Intf-dev fail reg[%d] payload[%d] ret[%d]\n", - __func__, - SB_PGD_TX_PORT_MULTI_CHANNEL_0(codec_port), - payload, ret); - goto err; - } - /* ports 8,9 */ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_TX_PORT_MULTI_CHANNEL_1(codec_port), - (payload & 0xFF00)>>8); - if (ret < 0) { - pr_err("%s:Intf-dev fail reg[%d] payload[%d] ret[%d]\n", - __func__, - SB_PGD_TX_PORT_MULTI_CHANNEL_1(codec_port), - payload, ret); - goto err; - } - /* configure the slave port for water mark and enable*/ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_PORT_CFG_BYTE_ADDR( - sh_ch.port_tx_cfg_reg_base, codec_port), - WATER_MARK_VAL); - if (ret < 0) { - pr_err("%s:watermark set failure for port[%d] ret[%d]", - __func__, codec_port, ret); - } - - ret = slim_connect_src(wcd9xxx->slim, tx->sph, tx->ch_h); - - if (ret < 0) { - pr_err("%s: slim_connect_src failed ret[%d]\n", - __func__, ret); - goto err; - } - } - /* slim_control_ch */ - ret = slim_control_ch(wcd9xxx->slim, *grph, SLIM_CH_ACTIVATE, - true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", - __func__, ret); - goto err; - } - return 0; -err: - /* release all acquired handles */ - wcd9xxx_close_slim_sch_tx(wcd9xxx, wcd9xxx_ch_list, *grph); - return ret; -} -EXPORT_SYMBOL(wcd9xxx_cfg_slim_sch_tx); - -int wcd9xxx_close_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph) -{ - u32 sph[SLIM_MAX_RX_PORTS] = {0}; - int ch_cnt = 0; - int ret = 0; - struct wcd9xxx_ch *rx; - - list_for_each_entry(rx, wcd9xxx_ch_list, list) - sph[ch_cnt++] = rx->sph; - - pr_debug("%s ch_cht %d, sph[0] %d sph[1] %d\n", __func__, ch_cnt, - sph[0], sph[1]); - - /* slim_control_ch (REMOVE) */ - pr_debug("%s before slim_control_ch grph %d\n", __func__, grph); - ret = slim_control_ch(wcd9xxx->slim, grph, SLIM_CH_REMOVE, true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", __func__, ret); - goto err; - } -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_close_slim_sch_rx); - -int wcd9xxx_close_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - u16 grph) -{ - u32 sph[SLIM_MAX_TX_PORTS] = {0}; - int ret = 0; - int ch_cnt = 0; - struct wcd9xxx_ch *tx; - - pr_debug("%s\n", __func__); - list_for_each_entry(tx, wcd9xxx_ch_list, list) - sph[ch_cnt++] = tx->sph; - - pr_debug("%s ch_cht %d, sph[0] %d sph[1] %d\n", - __func__, ch_cnt, sph[0], sph[1]); - /* slim_control_ch (REMOVE) */ - ret = slim_control_ch(wcd9xxx->slim, grph, SLIM_CH_REMOVE, true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", - __func__, ret); - goto err; - } -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_close_slim_sch_tx); - -int wcd9xxx_get_slave_port(unsigned int ch_num) -{ - int ret = 0; - - ret = (ch_num - BASE_CH_NUM); - pr_debug("%s: ch_num[%d] slave port[%d]\n", __func__, ch_num, ret); - if (ret < 0) { - pr_err("%s: Error:- Invalid slave port found = %d\n", - __func__, ret); - return -EINVAL; - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_get_slave_port); - -int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph) -{ - u32 sph[SLIM_MAX_TX_PORTS + SLIM_MAX_RX_PORTS] = {0}; - int ch_cnt = 0; - int ret = 0; - struct wcd9xxx_ch *slim_ch; - - list_for_each_entry(slim_ch, wcd9xxx_ch_list, list) - sph[ch_cnt++] = slim_ch->sph; - - /* slim_disconnect_port */ - ret = slim_disconnect_ports(wcd9xxx->slim, sph, ch_cnt); - if (ret < 0) { - pr_err("%s: slim_disconnect_ports failed ret[%d]\n", - __func__, ret); - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_disconnect_port); - -/* This function is called with mutex acquired */ -int wcd9xxx_rx_vport_validation(u32 port_id, - struct list_head *codec_dai_list) -{ - struct wcd9xxx_ch *ch; - int ret = 0; - - pr_debug("%s: port_id %u\n", __func__, port_id); - - list_for_each_entry(ch, - codec_dai_list, list) { - pr_debug("%s: ch->port %u\n", __func__, ch->port); - if (ch->port == port_id) { - ret = -EINVAL; - break; - } - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_rx_vport_validation); - - -/* This function is called with mutex acquired */ -int wcd9xxx_tx_vport_validation(u32 table, u32 port_id, - struct wcd9xxx_codec_dai_data *codec_dai, - u32 num_codec_dais) -{ - struct wcd9xxx_ch *ch; - int ret = 0; - u32 index; - unsigned long vtable = table; - u32 size = sizeof(table) * BITS_PER_BYTE; - - pr_debug("%s: vtable 0x%lx port_id %u size %d\n", __func__, - vtable, port_id, size); - for_each_set_bit(index, &vtable, size) { - if (index < num_codec_dais) { - list_for_each_entry(ch, - &codec_dai[index].wcd9xxx_ch_list, - list) { - pr_debug("%s: index %u ch->port %u vtable 0x%lx\n", - __func__, index, ch->port, - vtable); - if (ch->port == port_id) { - pr_err("%s: TX%u is used by AIF%u_CAP Mixer\n", - __func__, port_id + 1, - (index + 1)/2); - ret = -EINVAL; - break; - } - } - } else { - pr_err("%s: Invalid index %d of codec dai", - __func__, index); - ret = -EINVAL; - } - if (ret) - break; - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_tx_vport_validation); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-soc-init.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-soc-init.c deleted file mode 100644 index 06a991ca99a2..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-soc-init.c +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "audio-ext-clk-up.h" - -static int __init wcd9xxx_soc_init(void) -{ - int ret = 0; - - ret = wcd_dsp_mgr_init(); - if (!ret) { - ret = audio_ref_clk_platform_init(); - if (ret) { - pr_err("%s: init extclk fail: %d\n", __func__, ret); - wcd_dsp_mgr_exit(); - } - } else { - pr_err("%s: init dsp mgr fail: %d\n", __func__, ret); - } - - return ret; -} -module_init(wcd9xxx_soc_init); - -static void __exit wcd9xxx_soc_exit(void) -{ - audio_ref_clk_platform_exit(); - wcd_dsp_mgr_exit(); -} -module_exit(wcd9xxx_soc_exit); - -MODULE_DESCRIPTION("WCD9XXX CODEC soc init driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.c b/techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.c deleted file mode 100644 index face7118dfba..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.c +++ /dev/null @@ -1,1224 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd9xxx-utils.h" - -#define REG_BYTES 2 -#define VAL_BYTES 1 -/* - * Page Register Address that APP Proc uses to - * access WCD9335 Codec registers is identified - * as 0x00 - */ -#define PAGE_REG_ADDR 0x00 - -static enum wcd9xxx_intf_status wcd9xxx_intf = -1; - -static struct mfd_cell tavil_devs[] = { - { - .name = "qcom-wcd-pinctrl", - .of_compatible = "qcom,wcd-pinctrl", - }, - { - .name = "tavil_codec", - }, -}; - -static struct mfd_cell tasha_devs[] = { - { - .name = "tasha_codec", - }, -}; - -static struct mfd_cell tomtom_devs[] = { - { - .name = "tomtom_codec", - }, -}; - -static int wcd9xxx_read_of_property_u32(struct device *dev, const char *name, - u32 *val) -{ - int rc = 0; - - rc = of_property_read_u32(dev->of_node, name, val); - if (rc) - dev_err(dev, "%s: Looking up %s property in node %s failed", - __func__, name, dev->of_node->full_name); - - return rc; -} - -static void wcd9xxx_dt_parse_micbias_info(struct device *dev, - struct wcd9xxx_micbias_setting *mb) -{ - u32 prop_val; - int rc; - - if (of_find_property(dev->of_node, "qcom,cdc-micbias-ldoh-v", NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-ldoh-v", - &prop_val); - if (!rc) - mb->ldoh_v = (u8)prop_val; - } - - /* MB1 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias-cfilt1-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-cfilt1-mv", - &prop_val); - if (!rc) - mb->cfilt1_mv = prop_val; - - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias1-cfilt-sel", - &prop_val); - if (!rc) - mb->bias1_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias1-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias1-mv", - &prop_val); - if (!rc) - mb->micb1_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias1 DT property not found\n", - __func__); - } - - /* MB2 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias-cfilt2-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-cfilt2-mv", - &prop_val); - if (!rc) - mb->cfilt2_mv = prop_val; - - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias2-cfilt-sel", - &prop_val); - if (!rc) - mb->bias2_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias2-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias2-mv", - &prop_val); - if (!rc) - mb->micb2_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias2 DT property not found\n", - __func__); - } - - /* MB3 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias-cfilt3-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-cfilt3-mv", - &prop_val); - if (!rc) - mb->cfilt3_mv = prop_val; - - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias3-cfilt-sel", - &prop_val); - if (!rc) - mb->bias3_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias3-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias3-mv", - &prop_val); - if (!rc) - mb->micb3_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias3 DT property not found\n", - __func__); - } - - /* MB4 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias4-cfilt-sel", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias4-cfilt-sel", - &prop_val); - if (!rc) - mb->bias4_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias4-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias4-mv", - &prop_val); - if (!rc) - mb->micb4_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias4 DT property not found\n", - __func__); - } - - mb->bias1_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias1-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - mb->bias2_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias2-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - mb->bias3_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias3-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - mb->bias4_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias4-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - - mb->bias2_is_headset_only = - of_property_read_bool(dev->of_node, - "qcom,cdc-micbias2-headset-only"); - - /* Print micbias info */ - dev_dbg(dev, "%s: ldoh_v %u cfilt1_mv %u cfilt2_mv %u cfilt3_mv %u", - __func__, (u32)mb->ldoh_v, (u32)mb->cfilt1_mv, - (u32)mb->cfilt2_mv, (u32)mb->cfilt3_mv); - - dev_dbg(dev, "%s: micb1_mv %u micb2_mv %u micb3_mv %u micb4_mv %u", - __func__, mb->micb1_mv, mb->micb2_mv, - mb->micb3_mv, mb->micb4_mv); - - dev_dbg(dev, "%s: bias1_cfilt_sel %u bias2_cfilt_sel %u\n", - __func__, (u32)mb->bias1_cfilt_sel, (u32)mb->bias2_cfilt_sel); - - dev_dbg(dev, "%s: bias3_cfilt_sel %u bias4_cfilt_sel %u\n", - __func__, (u32)mb->bias3_cfilt_sel, (u32)mb->bias4_cfilt_sel); - - dev_dbg(dev, "%s: bias1_ext_cap %d bias2_ext_cap %d\n", - __func__, mb->bias1_cap_mode, mb->bias2_cap_mode); - - dev_dbg(dev, "%s: bias3_ext_cap %d bias4_ext_cap %d\n", - __func__, mb->bias3_cap_mode, mb->bias4_cap_mode); - - dev_dbg(dev, "%s: bias2_is_headset_only %d\n", - __func__, mb->bias2_is_headset_only); -} - -/* - * wcd9xxx_validate_dmic_sample_rate: - * Given the dmic_sample_rate and mclk rate, validate the - * dmic_sample_rate. If dmic rate is found to be invalid, - * assign the dmic rate as undefined, so individual codec - * drivers can use their own defaults - * @dev: the device for which the dmic is to be configured - * @dmic_sample_rate: The input dmic_sample_rate - * @mclk_rate: The input codec mclk rate - * @dmic_rate_type: String to indicate the type of dmic sample - * rate, used for debug/error logging. - */ -static u32 wcd9xxx_validate_dmic_sample_rate(struct device *dev, - u32 dmic_sample_rate, u32 mclk_rate, - const char *dmic_rate_type) -{ - u32 div_factor; - - if (dmic_sample_rate == WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) - goto undefined_rate; - - div_factor = mclk_rate / dmic_sample_rate; - - switch (div_factor) { - case 2: - case 3: - case 4: - case 8: - case 16: - /* Valid dmic DIV factors */ - dev_dbg(dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - break; - case 6: - /* - * DIV 6 is valid for both 9.6MHz and 12.288MHz - * MCLK on Tavil. Older codecs support DIV6 only - * for 12.288MHz MCLK. - */ - if ((mclk_rate == WCD9XXX_MCLK_CLK_9P6HZ) && - (of_device_is_compatible(dev->of_node, - "qcom,tavil-slim-pgd"))) - dev_dbg(dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - else if (mclk_rate != WCD9XXX_MCLK_CLK_12P288MHZ) - goto undefined_rate; - break; - default: - /* Any other DIV factor is invalid */ - goto undefined_rate; - } - - return dmic_sample_rate; - -undefined_rate: - dev_dbg(dev, "%s: Invalid %s = %d, for mclk %d\n", - __func__, dmic_rate_type, dmic_sample_rate, mclk_rate); - dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - - return dmic_sample_rate; -} - -/* - * wcd9xxx_populate_dt_data: - * Parse device tree properties for the given codec device - * - * @dev: pointer to codec device - * - * Returns pointer to the platform data resulting from parsing - * device tree. - */ -struct wcd9xxx_pdata *wcd9xxx_populate_dt_data(struct device *dev) -{ - struct wcd9xxx_pdata *pdata; - u32 dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - u32 mad_dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - u32 ecpp_dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - u32 dmic_clk_drive = WCD9XXX_DMIC_CLK_DRIVE_UNDEFINED; - u32 prop_val; - int rc = 0; - - if (!dev || !dev->of_node) - return NULL; - - pdata = devm_kzalloc(dev, sizeof(struct wcd9xxx_pdata), - GFP_KERNEL); - if (!pdata) - return NULL; - - /* Parse power supplies */ - msm_cdc_get_power_supplies(dev, &pdata->regulator, - &pdata->num_supplies); - if (!pdata->regulator || (pdata->num_supplies <= 0)) { - dev_err(dev, "%s: no power supplies defined for codec\n", - __func__); - goto err_power_sup; - } - - /* Parse micbias info */ - wcd9xxx_dt_parse_micbias_info(dev, &pdata->micbias); - - pdata->wcd_rst_np = of_parse_phandle(dev->of_node, - "qcom,wcd-rst-gpio-node", 0); - if (!pdata->wcd_rst_np) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,wcd-rst-gpio-node", - dev->of_node->full_name); - goto err_parse_dt_prop; - } - - pdata->has_buck_vsel_gpio = of_property_read_bool(dev->of_node, - "qcom,has-buck-vsel-gpio"); - if (pdata->has_buck_vsel_gpio) { - pdata->buck_vsel_ctl_np = of_parse_phandle(dev->of_node, - "qcom,buck-vsel-gpio-node", 0); - if (!pdata->buck_vsel_ctl_np) { - dev_err(dev, "%s No entry for %s property in node %s\n", - __func__, "qcom,buck-vsel-gpio-node", - dev->of_node->full_name); - goto err_parse_dt_prop; - } - } - - pdata->has_micb_supply_en_gpio = of_property_read_bool(dev->of_node, - "qcom,has-micbias-supply-en-gpio"); - if (pdata->has_micb_supply_en_gpio) { - pdata->micb_en_ctl = of_parse_phandle(dev->of_node, - "qcom,micbias-supply-en-gpio-node", 0); - if (!pdata->micb_en_ctl) { - dev_err(dev, "%s No entry for %s property in node %s\n", - __func__, "qcom,micbias-supply-en-gpio-node", - dev->of_node->full_name); - goto err_parse_dt_prop; - } - } - - if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-mclk-clk-rate", - &prop_val))) - pdata->mclk_rate = prop_val; - - if (pdata->mclk_rate != WCD9XXX_MCLK_CLK_9P6HZ && - pdata->mclk_rate != WCD9XXX_MCLK_CLK_12P288MHZ) { - dev_err(dev, "%s: Invalid mclk_rate = %u\n", __func__, - pdata->mclk_rate); - goto err_parse_dt_prop; - } - - if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-dmic-sample-rate", - &prop_val))) - dmic_sample_rate = prop_val; - - pdata->dmic_sample_rate = wcd9xxx_validate_dmic_sample_rate(dev, - dmic_sample_rate, - pdata->mclk_rate, - "audio_dmic_rate"); - if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-mad-dmic-rate", - &prop_val))) - mad_dmic_sample_rate = prop_val; - - pdata->mad_dmic_sample_rate = wcd9xxx_validate_dmic_sample_rate(dev, - mad_dmic_sample_rate, - pdata->mclk_rate, - "mad_dmic_rate"); - - if (of_find_property(dev->of_node, "qcom,cdc-ecpp-dmic-rate", NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-ecpp-dmic-rate", - &prop_val); - if (!rc) - ecpp_dmic_sample_rate = prop_val; - } - - pdata->ecpp_dmic_sample_rate = wcd9xxx_validate_dmic_sample_rate(dev, - ecpp_dmic_sample_rate, - pdata->mclk_rate, - "ecpp_dmic_rate"); - - if (!(of_property_read_u32(dev->of_node, - "qcom,cdc-dmic-clk-drv-strength", - &prop_val))) { - dmic_clk_drive = prop_val; - - if (dmic_clk_drive != 2 && dmic_clk_drive != 4 && - dmic_clk_drive != 8 && dmic_clk_drive != 16) - dev_err(dev, "Invalid cdc-dmic-clk-drv-strength %d\n", - dmic_clk_drive); - } - - pdata->dmic_clk_drv = dmic_clk_drive; - - rc = of_property_read_u32(dev->of_node, - "qcom,vote-dynamic-supply-on-demand", - &pdata->vote_regulator_on_demand); - if (rc) - dev_dbg(dev, "%s No entry for %s property in node %s\n", - __func__, "qcom,vote-dynamic-supply-on-demand", - dev->of_node->full_name); - - return pdata; - -err_parse_dt_prop: - devm_kfree(dev, pdata->regulator); - pdata->regulator = NULL; - pdata->num_supplies = 0; -err_power_sup: - devm_kfree(dev, pdata); - return NULL; -} -EXPORT_SYMBOL(wcd9xxx_populate_dt_data); - -static bool is_wcd9xxx_reg_power_down(struct wcd9xxx *wcd9xxx, u16 rreg) -{ - bool ret = false; - int i; - struct wcd9xxx_power_region *wcd9xxx_pwr; - - if (!wcd9xxx) - return ret; - - for (i = 0; i < WCD9XXX_MAX_PWR_REGIONS; i++) { - wcd9xxx_pwr = wcd9xxx->wcd9xxx_pwr[i]; - if (!wcd9xxx_pwr) - continue; - if (((wcd9xxx_pwr->pwr_collapse_reg_min == 0) && - (wcd9xxx_pwr->pwr_collapse_reg_max == 0)) || - (wcd9xxx_pwr->power_state == - WCD_REGION_POWER_COLLAPSE_REMOVE)) - ret = false; - else if (((wcd9xxx_pwr->power_state == - WCD_REGION_POWER_DOWN) || - (wcd9xxx_pwr->power_state == - WCD_REGION_POWER_COLLAPSE_BEGIN)) && - (rreg >= wcd9xxx_pwr->pwr_collapse_reg_min) && - (rreg <= wcd9xxx_pwr->pwr_collapse_reg_max)) - ret = true; - } - return ret; -} - -/* - * wcd9xxx_page_write: - * Retrieve page number from register and - * write that page number to the page address. - * Called under io_lock acquisition. - * - * @wcd9xxx: pointer to wcd9xxx - * @reg: Register address from which page number is retrieved - * - * Returns 0 for success and negative error code for failure. - */ -int wcd9xxx_page_write(struct wcd9xxx *wcd9xxx, unsigned short *reg) -{ - int ret = 0; - unsigned short c_reg, reg_addr; - u8 pg_num, prev_pg_num; - - if (wcd9xxx->type != WCD9335 && wcd9xxx->type != WCD934X) - return ret; - - c_reg = *reg; - pg_num = c_reg >> 8; - reg_addr = c_reg & 0xff; - if (wcd9xxx->prev_pg_valid) { - prev_pg_num = wcd9xxx->prev_pg; - if (prev_pg_num != pg_num) { - ret = wcd9xxx->write_dev( - wcd9xxx, PAGE_REG_ADDR, 1, - (void *) &pg_num, false); - if (ret < 0) - pr_err("page write error, pg_num: 0x%x\n", - pg_num); - else { - wcd9xxx->prev_pg = pg_num; - dev_dbg(wcd9xxx->dev, "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - } else { - ret = wcd9xxx->write_dev( - wcd9xxx, PAGE_REG_ADDR, 1, (void *) &pg_num, - false); - if (ret < 0) - pr_err("page write error, pg_num: 0x%x\n", pg_num); - else { - wcd9xxx->prev_pg = pg_num; - wcd9xxx->prev_pg_valid = true; - dev_dbg(wcd9xxx->dev, "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - *reg = reg_addr; - return ret; -} -EXPORT_SYMBOL(wcd9xxx_page_write); - -static int regmap_bus_read(void *context, const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - unsigned short c_reg, rreg; - int ret, i; - - if (!wcd9xxx) { - dev_err(dev, "%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - - mutex_lock(&wcd9xxx->io_lock); - c_reg = *(u16 *)reg; - rreg = c_reg; - - if (is_wcd9xxx_reg_power_down(wcd9xxx, rreg)) { - ret = 0; - for (i = 0; i < val_size; i++) - ((u8 *)val)[i] = 0; - goto err; - } - ret = wcd9xxx_page_write(wcd9xxx, &c_reg); - if (ret) - goto err; - ret = wcd9xxx->read_dev(wcd9xxx, c_reg, val_size, val, false); - if (ret < 0) - dev_err(dev, "%s: Codec read failed (%d), reg: 0x%x, size:%zd\n", - __func__, ret, rreg, val_size); - else { - for (i = 0; i < val_size; i++) - dev_dbg(dev, "%s: Read 0x%02x from 0x%x\n", - __func__, ((u8 *)val)[i], rreg + i); - } -err: - mutex_unlock(&wcd9xxx->io_lock); - - return ret; -} - -static int regmap_bus_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_size) -{ - struct device *dev = context; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - unsigned short c_reg, rreg; - int ret, i; - - if (!wcd9xxx) { - dev_err(dev, "%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - mutex_lock(&wcd9xxx->io_lock); - c_reg = *(u16 *)reg; - rreg = c_reg; - - if (is_wcd9xxx_reg_power_down(wcd9xxx, rreg)) { - ret = 0; - goto err; - } - ret = wcd9xxx_page_write(wcd9xxx, &c_reg); - if (ret) - goto err; - - for (i = 0; i < val_size; i++) - dev_dbg(dev, "Write %02x to 0x%x\n", ((u8 *)val)[i], - rreg + i); - - ret = wcd9xxx->write_dev(wcd9xxx, c_reg, val_size, (void *) val, - false); - if (ret < 0) - dev_err(dev, "%s: Codec write failed (%d), reg:0x%x, size:%zd\n", - __func__, ret, rreg, val_size); - -err: - mutex_unlock(&wcd9xxx->io_lock); - return ret; -} - -static int regmap_bus_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - - if (!wcd9xxx) - return -EINVAL; - - WARN_ON(count < REG_BYTES); - - if (count > (REG_BYTES + VAL_BYTES)) { - if (wcd9xxx->multi_reg_write) - return wcd9xxx->multi_reg_write(wcd9xxx, - data, count); - } else - return regmap_bus_gather_write(context, data, REG_BYTES, - data + REG_BYTES, - count - REG_BYTES); - - dev_err(dev, "%s: bus multi reg write failure\n", __func__); - - return -EINVAL; -} - -static struct regmap_bus regmap_bus_config = { - .write = regmap_bus_write, - .gather_write = regmap_bus_gather_write, - .read = regmap_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -/* - * wcd9xxx_regmap_init: - * Initialize wcd9xxx register map - * - * @dev: pointer to wcd device - * @config: pointer to register map config - * - * Returns pointer to regmap structure for success - * or NULL in case of failure. - */ -struct regmap *wcd9xxx_regmap_init(struct device *dev, - const struct regmap_config *config) -{ - return devm_regmap_init(dev, ®map_bus_config, dev, config); -} -EXPORT_SYMBOL(wcd9xxx_regmap_init); - -/* - * wcd9xxx_reset: - * Reset wcd9xxx codec - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_reset(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - int value; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->wcd_rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - value = msm_cdc_pinctrl_get_state(wcd9xxx->wcd_rst_np); - if (value > 0) { - wcd9xxx->avoid_cdc_rstlow = 1; - return 0; - } - - rc = msm_cdc_pinctrl_select_sleep_state(wcd9xxx->wcd_rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - - /* 20ms sleep required after pulling the reset gpio to LOW */ - msleep(20); - - rc = msm_cdc_pinctrl_select_active_state(wcd9xxx->wcd_rst_np); - if (rc) { - dev_err(dev, "%s: wcd active state request fail!\n", - __func__); - return rc; - } - msleep(20); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_reset); - -/* - * wcd9xxx_reset_low: - * Pull the wcd9xxx codec reset_n to low - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_reset_low(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->wcd_rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - if (wcd9xxx->avoid_cdc_rstlow) { - wcd9xxx->avoid_cdc_rstlow = 0; - dev_dbg(dev, "%s: avoid pull down of reset GPIO\n", __func__); - return 0; - } - - rc = msm_cdc_pinctrl_select_sleep_state(wcd9xxx->wcd_rst_np); - if (rc) - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_reset_low); - -/* - * wcd9xxx_bringup: - * Toggle reset analog and digital cores of wcd9xxx codec - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_bringup(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - codec_bringup_fn cdc_bup_fn; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - cdc_bup_fn = wcd9xxx_bringup_fn(wcd9xxx->type); - if (!cdc_bup_fn) { - dev_err(dev, "%s: Codec bringup fn NULL!\n", - __func__); - return -EINVAL; - } - rc = cdc_bup_fn(wcd9xxx); - if (rc) - dev_err(dev, "%s: Codec bringup error, rc: %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_bringup); - -/* - * wcd9xxx_bringup: - * Set analog and digital cores of wcd9xxx codec in reset state - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_bringdown(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - codec_bringdown_fn cdc_bdown_fn; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - cdc_bdown_fn = wcd9xxx_bringdown_fn(wcd9xxx->type); - if (!cdc_bdown_fn) { - dev_err(dev, "%s: Codec bring down fn NULL!\n", - __func__); - return -EINVAL; - } - rc = cdc_bdown_fn(wcd9xxx); - if (rc) - dev_err(dev, "%s: Codec bring down error, rc: %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_bringdown); - -/* - * wcd9xxx_get_codec_info: - * Fill codec specific information like interrupts, version - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_get_codec_info(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - codec_type_fn cdc_type_fn; - struct wcd9xxx_codec_type *cinfo; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - cdc_type_fn = wcd9xxx_get_codec_info_fn(wcd9xxx->type); - if (!cdc_type_fn) { - dev_err(dev, "%s: Codec fill type fn NULL!\n", - __func__); - return -EINVAL; - } - - cinfo = wcd9xxx->codec_type; - if (!cinfo) - return -EINVAL; - - rc = cdc_type_fn(wcd9xxx, cinfo); - if (rc) { - dev_err(dev, "%s: Codec type fill failed, rc:%d\n", - __func__, rc); - return rc; - - } - - switch (wcd9xxx->type) { - case WCD934X: - cinfo->dev = tavil_devs; - cinfo->size = ARRAY_SIZE(tavil_devs); - break; - case WCD9335: - cinfo->dev = tasha_devs; - cinfo->size = ARRAY_SIZE(tasha_devs); - break; - case WCD9330: - cinfo->dev = tomtom_devs; - cinfo->size = ARRAY_SIZE(tomtom_devs); - break; - default: - cinfo->dev = NULL; - cinfo->size = 0; - break; - } - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_get_codec_info); - -/* - * wcd9xxx_core_irq_init: - * Initialize wcd9xxx codec irq instance - * - * @wcd9xxx_core_res: pointer to wcd core resource - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_core_irq_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - int ret = 0; - - if (!wcd9xxx_core_res) - return -EINVAL; - - if (wcd9xxx_core_res->irq != 1) { - ret = wcd9xxx_irq_init(wcd9xxx_core_res); - if (ret) - pr_err("IRQ initialization failed\n"); - } - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_core_irq_init); - -/* - * wcd9xxx_assign_irq: - * Assign irq and irq_base to wcd9xxx core resource - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @irq: irq number - * @irq_base: base irq number - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_assign_irq( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - unsigned int irq, - unsigned int irq_base) -{ - if (!wcd9xxx_core_res) - return -EINVAL; - - wcd9xxx_core_res->irq = irq; - wcd9xxx_core_res->irq_base = irq_base; - - return 0; -} -EXPORT_SYMBOL(wcd9xxx_assign_irq); - -/* - * wcd9xxx_core_res_init: - * Initialize wcd core resource instance - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @num_irqs: number of irqs for wcd9xxx core - * @num_irq_regs: number of irq registers - * @wcd_regmap: pointer to the wcd register map - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_core_res_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - int num_irqs, int num_irq_regs, struct regmap *wcd_regmap) -{ - if (!wcd9xxx_core_res || !wcd_regmap) - return -EINVAL; - - mutex_init(&wcd9xxx_core_res->pm_lock); - wcd9xxx_core_res->wlock_holders = 0; - wcd9xxx_core_res->pm_state = WCD9XXX_PM_SLEEPABLE; - init_waitqueue_head(&wcd9xxx_core_res->pm_wq); - pm_qos_add_request(&wcd9xxx_core_res->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - wcd9xxx_core_res->num_irqs = num_irqs; - wcd9xxx_core_res->num_irq_regs = num_irq_regs; - wcd9xxx_core_res->wcd_core_regmap = wcd_regmap; - - pr_debug("%s: num_irqs = %d, num_irq_regs = %d\n", - __func__, wcd9xxx_core_res->num_irqs, - wcd9xxx_core_res->num_irq_regs); - - return 0; -} -EXPORT_SYMBOL(wcd9xxx_core_res_init); - -/* - * wcd9xxx_core_res_deinit: - * Deinit wcd core resource instance - * - * @wcd9xxx_core_res: pointer to wcd core resource - */ -void wcd9xxx_core_res_deinit(struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - if (!wcd9xxx_core_res) - return; - - pm_qos_remove_request(&wcd9xxx_core_res->pm_qos_req); - mutex_destroy(&wcd9xxx_core_res->pm_lock); -} -EXPORT_SYMBOL(wcd9xxx_core_res_deinit); - -/* - * wcd9xxx_pm_cmpxchg: - * Check old state and exchange with pm new state - * if old state matches with current state - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @o: pm old state - * @n: pm new state - * - * Returns old state - */ -enum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - enum wcd9xxx_pm_state o, - enum wcd9xxx_pm_state n) -{ - enum wcd9xxx_pm_state old; - - if (!wcd9xxx_core_res) - return o; - - mutex_lock(&wcd9xxx_core_res->pm_lock); - old = wcd9xxx_core_res->pm_state; - if (old == o) - wcd9xxx_core_res->pm_state = n; - mutex_unlock(&wcd9xxx_core_res->pm_lock); - - return old; -} -EXPORT_SYMBOL(wcd9xxx_pm_cmpxchg); - -/* - * wcd9xxx_core_res_suspend: - * Suspend callback function for wcd9xxx core - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @pm_message_t: pm message - * - * Returns 0 for success or negative error code for failure/busy - */ -int wcd9xxx_core_res_suspend( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - pm_message_t pmesg) -{ - int ret = 0; - - pr_debug("%s: enter\n", __func__); - /* - * pm_qos_update_request() can be called after this suspend chain call - * started. thus suspend can be called while lock is being held - */ - mutex_lock(&wcd9xxx_core_res->pm_lock); - if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_SLEEPABLE) { - pr_debug("%s: suspending system, state %d, wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - wcd9xxx_core_res->pm_state = WCD9XXX_PM_ASLEEP; - } else if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_AWAKE) { - /* - * unlock to wait for pm_state == WCD9XXX_PM_SLEEPABLE - * then set to WCD9XXX_PM_ASLEEP - */ - pr_debug("%s: waiting to suspend system, state %d, wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - mutex_unlock(&wcd9xxx_core_res->pm_lock); - if (!(wait_event_timeout(wcd9xxx_core_res->pm_wq, - wcd9xxx_pm_cmpxchg(wcd9xxx_core_res, - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_ASLEEP) == - WCD9XXX_PM_SLEEPABLE, - HZ))) { - pr_debug("%s: suspend failed state %d, wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - ret = -EBUSY; - } else { - pr_debug("%s: done, state %d, wlock %d\n", __func__, - wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - } - mutex_lock(&wcd9xxx_core_res->pm_lock); - } else if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_ASLEEP) { - pr_warn("%s: system is already suspended, state %d, wlock %dn", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - } - mutex_unlock(&wcd9xxx_core_res->pm_lock); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_core_res_suspend); - -/* - * wcd9xxx_core_res_resume: - * Resume callback function for wcd9xxx core - * - * @wcd9xxx_core_res: pointer to wcd core resource - * - * Returns 0 for success or negative error code for failure/busy - */ -int wcd9xxx_core_res_resume( - struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - int ret = 0; - - pr_debug("%s: enter\n", __func__); - mutex_lock(&wcd9xxx_core_res->pm_lock); - if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_ASLEEP) { - pr_debug("%s: resuming system, state %d, wlock %d\n", __func__, - wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - wcd9xxx_core_res->pm_state = WCD9XXX_PM_SLEEPABLE; - } else { - pr_warn("%s: system is already awake, state %d wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - } - mutex_unlock(&wcd9xxx_core_res->pm_lock); - wake_up_all(&wcd9xxx_core_res->pm_wq); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_core_res_resume); - -/* - * wcd9xxx_get_intf_type: - * Get interface type of wcd9xxx core - * - * Returns interface type - */ -enum wcd9xxx_intf_status wcd9xxx_get_intf_type(void) -{ - return wcd9xxx_intf; -} -EXPORT_SYMBOL(wcd9xxx_get_intf_type); - -/* - * wcd9xxx_set_intf_type: - * Set interface type of wcd9xxx core - * - */ -void wcd9xxx_set_intf_type(enum wcd9xxx_intf_status intf_status) -{ - wcd9xxx_intf = intf_status; -} -EXPORT_SYMBOL(wcd9xxx_set_intf_type); - -/* - * wcd9xxx_set_power_state: set power state for the region - * @wcd9xxx: handle to wcd core - * @state: power state to be set - * @region: region index - * - * Returns error code in case of failure or 0 for success - */ -int wcd9xxx_set_power_state(struct wcd9xxx *wcd9xxx, - enum codec_power_states state, - enum wcd_power_regions region) -{ - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - if ((region < 0) || (region >= WCD9XXX_MAX_PWR_REGIONS)) { - dev_err(wcd9xxx->dev, "%s: region index %d out of bounds\n", - __func__, region); - return -EINVAL; - } - if (!wcd9xxx->wcd9xxx_pwr[region]) { - dev_err(wcd9xxx->dev, "%s: memory not created for region: %d\n", - __func__, region); - return -EINVAL; - } - mutex_lock(&wcd9xxx->io_lock); - wcd9xxx->wcd9xxx_pwr[region]->power_state = state; - mutex_unlock(&wcd9xxx->io_lock); - - return 0; -} -EXPORT_SYMBOL(wcd9xxx_set_power_state); - -/* - * wcd9xxx_get_current_power_state: Get power state of the region - * @wcd9xxx: handle to wcd core - * @region: region index - * - * Returns current power state of the region or error code for failure - */ -int wcd9xxx_get_current_power_state(struct wcd9xxx *wcd9xxx, - enum wcd_power_regions region) -{ - int state; - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - if ((region < 0) || (region >= WCD9XXX_MAX_PWR_REGIONS)) { - dev_err(wcd9xxx->dev, "%s: region index %d out of bounds\n", - __func__, region); - return -EINVAL; - } - if (!wcd9xxx->wcd9xxx_pwr[region]) { - dev_err(wcd9xxx->dev, "%s: memory not created for region: %d\n", - __func__, region); - return -EINVAL; - } - - mutex_lock(&wcd9xxx->io_lock); - state = wcd9xxx->wcd9xxx_pwr[region]->power_state; - mutex_unlock(&wcd9xxx->io_lock); - - return state; -} -EXPORT_SYMBOL(wcd9xxx_get_current_power_state); diff --git a/techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.h b/techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.h deleted file mode 100644 index 1e063abfb5f5..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd9xxx-utils.h +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef __WCD9XXX_UTILS_H__ -#define __WCD9XXX_UTILS_H__ - -#include -#include -#include -#include "pdata.h" -#include "core.h" - -struct wcd9xxx_pdata *wcd9xxx_populate_dt_data(struct device *dev); -int wcd9xxx_bringup(struct device *dev); -int wcd9xxx_bringdown(struct device *dev); -struct regmap *wcd9xxx_regmap_init(struct device *dev, - const struct regmap_config *config); -int wcd9xxx_reset(struct device *dev); -int wcd9xxx_reset_low(struct device *dev); -int wcd9xxx_get_codec_info(struct device *dev); - -typedef int (*codec_bringup_fn)(struct wcd9xxx *dev); -typedef int (*codec_bringdown_fn)(struct wcd9xxx *dev); -typedef int (*codec_type_fn)(struct wcd9xxx *dev, - struct wcd9xxx_codec_type *wcd_type); - -codec_bringdown_fn wcd9xxx_bringdown_fn(int type); -codec_bringup_fn wcd9xxx_bringup_fn(int type); -codec_type_fn wcd9xxx_get_codec_info_fn(int type); - -#endif diff --git a/techpack/audio/4.0/asoc/codecs/wcd_cmi_api.h b/techpack/audio/4.0/asoc/codecs/wcd_cmi_api.h deleted file mode 100644 index b02c66583604..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd_cmi_api.h +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - */ - -#ifndef __CMI_API__ -#define __CMI_API__ - -enum cmi_api_result { - CMI_API_FAILED = 1, - CMI_API_BUSY, - CMI_API_NO_MEMORY, - CMI_API_NOT_READY, -}; - -enum cmi_api_event { - CMI_API_MSG = 1, - CMI_API_OFFLINE, - CMI_API_ONLINE, - CMI_API_DEINITIALIZED, -}; - -struct cmi_api_notification { - enum cmi_api_event event; - enum cmi_api_result result; - void *message; -}; - -void *cmi_register( - void notification_callback - (const struct cmi_api_notification *parameter), - u32 service); -enum cmi_api_result cmi_deregister(void *reg_handle); -enum cmi_api_result cmi_send_msg(void *message); - -#endif /*__CMI_API__*/ diff --git a/techpack/audio/4.0/asoc/codecs/wcd_cpe_core.c b/techpack/audio/4.0/asoc/codecs/wcd_cpe_core.c deleted file mode 100644 index 8d6c016dd202..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd_cpe_core.c +++ /dev/null @@ -1,4591 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cpe_core.h" -#include "cpe_err.h" -#include "cpe_cmi.h" -#include "wcd_cpe_core.h" -#include "wcd_cpe_services.h" -#include "wcd_cmi_api.h" -#include - -#define CMI_CMD_TIMEOUT (10 * HZ) -#define WCD_CPE_LSM_MAX_SESSIONS 2 -#define WCD_CPE_AFE_MAX_PORTS 4 -#define AFE_SVC_EXPLICIT_PORT_START 1 -#define WCD_CPE_EC_PP_BUF_SIZE 480 /* 5 msec buffer */ - -#define ELF_FLAG_EXECUTE (1 << 0) -#define ELF_FLAG_WRITE (1 << 1) -#define ELF_FLAG_READ (1 << 2) - -#define ELF_FLAG_RW (ELF_FLAG_READ | ELF_FLAG_WRITE) - -#define WCD_CPE_GRAB_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock acquire\n", \ - __func__, name); \ - mutex_lock(lock); \ -} - -#define WCD_CPE_REL_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock release\n", \ - __func__, name); \ - mutex_unlock(lock); \ -} - -#define WCD_CPE_STATE_MAX_LEN 32 -#define CPE_OFFLINE_WAIT_TIMEOUT (2 * HZ) -#define CPE_READY_WAIT_TIMEOUT (3 * HZ) -#define WCD_CPE_SYSFS_DIR_MAX_LENGTH 32 - -#define CPE_ERR_IRQ_CB(core) \ - (core->cpe_cdc_cb->cpe_err_irq_control) - -/* - * AFE output buffer size is always - * (sample_rate * number of bytes per sample/2*1000) - */ -#define AFE_OUT_BUF_SIZE(bit_width, sample_rate) \ - (((sample_rate) * (bit_width / BITS_PER_BYTE))/(2*1000)) - -enum afe_port_state { - AFE_PORT_STATE_DEINIT = 0, - AFE_PORT_STATE_INIT, - AFE_PORT_STATE_CONFIG, - AFE_PORT_STATE_STARTED, - AFE_PORT_STATE_SUSPENDED, -}; - -struct wcd_cmi_afe_port_data { - u8 port_id; - struct mutex afe_lock; - struct completion afe_cmd_complete; - enum afe_port_state port_state; - u8 cmd_result; - u32 mem_handle; -}; - -struct cpe_lsm_ids { - u32 module_id; - u32 param_id; -}; - -static struct wcd_cpe_core *core_d; -static struct cpe_lsm_session - *lsm_sessions[WCD_CPE_LSM_MAX_SESSIONS + 1]; -struct wcd_cpe_core * (*wcd_get_cpe_core)(struct snd_soc_codec *); -static struct wcd_cmi_afe_port_data afe_ports[WCD_CPE_AFE_MAX_PORTS + 1]; -static void wcd_cpe_svc_event_cb(const struct cpe_svc_notification *param); -static int wcd_cpe_setup_irqs(struct wcd_cpe_core *core); -static void wcd_cpe_cleanup_irqs(struct wcd_cpe_core *core); -static ssize_t cpe_ftm_test_trigger(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos); -static u32 ramdump_enable; -static u32 cpe_ftm_test_status; -static const struct file_operations cpe_ftm_test_trigger_fops = { - .open = simple_open, - .write = cpe_ftm_test_trigger, -}; - -static int wcd_cpe_afe_svc_cmd_mode(void *core_handle, - u8 mode); -struct wcd_cpe_attribute { - struct attribute attr; - ssize_t (*show)(struct wcd_cpe_core *core, char *buf); - ssize_t (*store)(struct wcd_cpe_core *core, const char *buf, - ssize_t count); -}; - -#define WCD_CPE_ATTR(_name, _mode, _show, _store) \ -static struct wcd_cpe_attribute cpe_attr_##_name = { \ - .attr = {.name = __stringify(_name), .mode = _mode}, \ - .show = _show, \ - .store = _store, \ -} - -#define to_wcd_cpe_attr(a) \ - container_of((a), struct wcd_cpe_attribute, attr) - -#define kobj_to_cpe_core(kobj) \ - container_of((kobj), struct wcd_cpe_core, cpe_kobj) - -/* wcd_cpe_lsm_session_active: check if any session is active - * return true if any session is active. - */ -static bool wcd_cpe_lsm_session_active(void) -{ - int index = 1; - bool lsm_active = false; - - /* session starts from index 1 */ - for (; index <= WCD_CPE_LSM_MAX_SESSIONS; index++) { - if (lsm_sessions[index] != NULL) { - lsm_active = true; - break; - } else { - lsm_active = false; - } - } - return lsm_active; -} - -static int wcd_cpe_get_sfr_dump(struct wcd_cpe_core *core) -{ - struct cpe_svc_mem_segment dump_seg; - int rc; - u8 *sfr_dump; - - sfr_dump = kzalloc(core->sfr_buf_size, GFP_KERNEL); - if (!sfr_dump) - goto done; - - dump_seg.type = CPE_SVC_DATA_MEM; - dump_seg.cpe_addr = core->sfr_buf_addr; - dump_seg.size = core->sfr_buf_size; - dump_seg.data = sfr_dump; - dev_dbg(core->dev, - "%s: reading SFR from CPE, size = %zu\n", - __func__, core->sfr_buf_size); - - rc = cpe_svc_ramdump(core->cpe_handle, &dump_seg); - if (rc < 0) { - dev_err(core->dev, - "%s: Failed to read cpe sfr_dump, err = %d\n", - __func__, rc); - goto free_sfr_dump; - } - - dev_info(core->dev, - "%s: cpe_sfr = %s\n", __func__, sfr_dump); - -free_sfr_dump: - kfree(sfr_dump); -done: - /* Even if SFR dump failed, do not return error */ - return 0; -} - -static int wcd_cpe_collect_ramdump(struct wcd_cpe_core *core) -{ - struct cpe_svc_mem_segment dump_seg; - int rc; - - if (!core->cpe_ramdump_dev || !core->cpe_dump_v_addr || - core->hw_info.dram_size == 0) { - dev_err(core->dev, - "%s: Ramdump devices not set up, size = %zu\n", - __func__, core->hw_info.dram_size); - return -EINVAL; - } - - dump_seg.type = CPE_SVC_DATA_MEM; - dump_seg.cpe_addr = core->hw_info.dram_offset; - dump_seg.size = core->hw_info.dram_size; - dump_seg.data = core->cpe_dump_v_addr; - - dev_dbg(core->dev, - "%s: Reading ramdump from CPE\n", - __func__); - - rc = cpe_svc_ramdump(core->cpe_handle, &dump_seg); - if (rc < 0) { - dev_err(core->dev, - "%s: Failed to read CPE ramdump, err = %d\n", - __func__, rc); - return rc; - } - - dev_dbg(core->dev, - "%s: completed reading ramdump from CPE\n", - __func__); - - core->cpe_ramdump_seg.address = (unsigned long) core->cpe_dump_addr; - core->cpe_ramdump_seg.size = core->hw_info.dram_size; - core->cpe_ramdump_seg.v_address = core->cpe_dump_v_addr; - - rc = do_ramdump(core->cpe_ramdump_dev, - &core->cpe_ramdump_seg, 1); - if (rc) - dev_err(core->dev, - "%s: fail to dump cpe ram to device, err = %d\n", - __func__, rc); - return rc; -} - -/* wcd_cpe_is_valid_elf_hdr: check if the ELF header is valid - * @core: handle to wcd_cpe_core - * @fw_size: size of firmware from request_firmware - * @ehdr: the elf header to be checked for - * return true if all checks pass, true if any elf check fails - */ -static bool wcd_cpe_is_valid_elf_hdr(struct wcd_cpe_core *core, size_t fw_size, - const struct elf32_hdr *ehdr) -{ - if (fw_size < sizeof(*ehdr)) { - dev_err(core->dev, "%s:Firmware too small\n", __func__); - goto elf_check_fail; - } - - if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) { - dev_err(core->dev, "%s: Not an ELF file\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) { - dev_err(core->dev, "%s: Not a executable image\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_phnum == 0) { - dev_err(core->dev, "%s: no segments to load\n", __func__); - goto elf_check_fail; - } - - if (sizeof(struct elf32_phdr) * ehdr->e_phnum + - sizeof(struct elf32_hdr) > fw_size) { - dev_err(core->dev, "%s: Too small MDT file\n", __func__); - goto elf_check_fail; - } - - return true; - -elf_check_fail: - return false; -} - -/* - * wcd_cpe_load_each_segment: download segment to CPE - * @core: handle to struct wcd_cpe_core - * @file_idx: index of split firmware image file name - * @phdr: program header from metadata - */ -static int wcd_cpe_load_each_segment(struct wcd_cpe_core *core, - int file_idx, const struct elf32_phdr *phdr) -{ - const struct firmware *split_fw; - char split_fname[32]; - int ret = 0; - struct cpe_svc_mem_segment *segment; - - if (!core || !phdr) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - /* file size can be 0 for bss segments */ - if (phdr->p_filesz == 0 || phdr->p_memsz == 0) - return 0; - - segment = kzalloc(sizeof(struct cpe_svc_mem_segment), GFP_KERNEL); - if (!segment) - return -ENOMEM; - - snprintf(split_fname, sizeof(split_fname), "%s.b%02d", - core->fname, file_idx); - - ret = request_firmware(&split_fw, split_fname, core->dev); - if (ret) { - dev_err(core->dev, "firmware %s not found\n", - split_fname); - ret = -EIO; - goto fw_req_fail; - } - - if (phdr->p_flags & ELF_FLAG_EXECUTE) - segment->type = CPE_SVC_INSTRUCTION_MEM; - else if (phdr->p_flags & ELF_FLAG_RW) - segment->type = CPE_SVC_DATA_MEM; - else { - dev_err(core->dev, "%s invalid flags 0x%x\n", - __func__, phdr->p_flags); - goto done; - } - - if (phdr->p_filesz != split_fw->size) { - dev_err(core->dev, - "%s: %s size mismatch, phdr_size: 0x%x fw_size: 0x%zx", - __func__, split_fname, phdr->p_filesz, split_fw->size); - ret = -EINVAL; - goto done; - } - - segment->cpe_addr = phdr->p_paddr; - segment->size = phdr->p_filesz; - segment->data = (u8 *) split_fw->data; - - dev_dbg(core->dev, - "%s: cpe segment type %s read from firmware\n", __func__, - (segment->type == CPE_SVC_INSTRUCTION_MEM) ? - "INSTRUCTION" : "DATA"); - - ret = cpe_svc_download_segment(core->cpe_handle, segment); - if (ret) { - dev_err(core->dev, - "%s: Failed to download %s, error = %d\n", - __func__, split_fname, ret); - goto done; - } - -done: - release_firmware(split_fw); - -fw_req_fail: - kfree(segment); - return ret; -} - -/* - * wcd_cpe_enable_cpe_clks: enable the clocks for CPE - * @core: handle to wcd_cpe_core - * @enable: flag indicating whether to enable/disable cpe clocks - */ -static int wcd_cpe_enable_cpe_clks(struct wcd_cpe_core *core, bool enable) -{ - int ret, ret1; - - if (!core || !core->cpe_cdc_cb || - !core->cpe_cdc_cb->cpe_clk_en) { - pr_err("%s: invalid handle\n", - __func__); - return -EINVAL; - } - - ret = core->cpe_cdc_cb->cdc_clk_en(core->codec, enable); - if (ret) { - dev_err(core->dev, "%s: Failed to enable RCO\n", - __func__); - return ret; - } - - if (!enable && core->cpe_clk_ref > 0) - core->cpe_clk_ref--; - - /* - * CPE clk will be enabled at the first time - * and be disabled at the last time. - */ - if (core->cpe_clk_ref == 0) { - ret = core->cpe_cdc_cb->cpe_clk_en(core->codec, enable); - if (ret) { - dev_err(core->dev, - "%s: cpe_clk_en() failed, err = %d\n", - __func__, ret); - goto cpe_clk_fail; - } - } - - if (enable) - core->cpe_clk_ref++; - - return 0; - -cpe_clk_fail: - /* Release the codec clk if CPE clk enable failed */ - if (enable) { - ret1 = core->cpe_cdc_cb->cdc_clk_en(core->codec, !enable); - if (ret1) - dev_err(core->dev, - "%s: Fail to release codec clk, err = %d\n", - __func__, ret1); - } - - return ret; -} - -/* - * wcd_cpe_bus_vote_max_bw: Function to vote for max bandwidth on codec bus - * @core: handle to core for cpe - * @vote: flag to indicate enable/disable of vote - * - * This function will try to use the codec provided callback to - * vote/unvote for the max bandwidth of the bus that is used by - * the codec for register reads/writes. - */ -static int wcd_cpe_bus_vote_max_bw(struct wcd_cpe_core *core, - bool vote) -{ - if (!core || !core->cpe_cdc_cb) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!core) ? "core" : "codec callbacks"); - return -EINVAL; - } - - if (core->cpe_cdc_cb->bus_vote_bw) { - dev_dbg(core->dev, "%s: %s cdc bus max bandwidth\n", - __func__, vote ? "Vote" : "Unvote"); - core->cpe_cdc_cb->bus_vote_bw(core->codec, vote); - } - - return 0; -} - -/* - * wcd_cpe_load_fw: Function to load the fw image - * @core: cpe core pointer - * @load_type: indicates whether to load to data section - * or the instruction section - * - * Parse the mdt file to look for program headers, load each - * split file corresponding to the program headers. - */ -static int wcd_cpe_load_fw(struct wcd_cpe_core *core, - unsigned int load_type) -{ - - int ret, phdr_idx; - struct snd_soc_codec *codec = NULL; - struct wcd9xxx *wcd9xxx = NULL; - const struct elf32_hdr *ehdr; - const struct elf32_phdr *phdr; - const struct firmware *fw; - const u8 *elf_ptr; - char mdt_name[64]; - bool img_dload_fail = false; - bool load_segment; - - if (!core || !core->cpe_handle) { - pr_err("%s: Error CPE core %pK\n", __func__, - core); - return -EINVAL; - } - codec = core->codec; - wcd9xxx = dev_get_drvdata(codec->dev->parent); - snprintf(mdt_name, sizeof(mdt_name), "%s.mdt", core->fname); - ret = request_firmware(&fw, mdt_name, core->dev); - if (ret < 0) { - dev_err(core->dev, "firmware %s not found\n", mdt_name); - return ret; - } - - ehdr = (struct elf32_hdr *) fw->data; - if (!wcd_cpe_is_valid_elf_hdr(core, fw->size, ehdr)) { - dev_err(core->dev, "%s: fw mdt %s is invalid\n", - __func__, mdt_name); - ret = -EINVAL; - goto done; - } - - elf_ptr = fw->data + sizeof(*ehdr); - - if (load_type == ELF_FLAG_EXECUTE) { - /* Reset CPE first */ - ret = cpe_svc_reset(core->cpe_handle); - if (ret < 0) { - dev_err(core->dev, - "%s: Failed to reset CPE with error %d\n", - __func__, ret); - goto done; - } - } - - dev_dbg(core->dev, "%s: start image dload, name = %s, load_type = 0x%x\n", - __func__, core->fname, load_type); - - wcd_cpe_bus_vote_max_bw(core, true); - - /* parse every program header and request corresponding firmware */ - for (phdr_idx = 0; phdr_idx < ehdr->e_phnum; phdr_idx++) { - phdr = (struct elf32_phdr *)elf_ptr; - load_segment = false; - - dev_dbg(core->dev, - "index = %d, vaddr = 0x%x, paddr = 0x%x, filesz = 0x%x, memsz = 0x%x, flags = 0x%x\n" - , phdr_idx, phdr->p_vaddr, phdr->p_paddr, - phdr->p_filesz, phdr->p_memsz, phdr->p_flags); - - switch (load_type) { - case ELF_FLAG_EXECUTE: - if (phdr->p_flags & load_type) - load_segment = true; - break; - case ELF_FLAG_RW: - if (!(phdr->p_flags & ELF_FLAG_EXECUTE) && - (phdr->p_flags & load_type)) - load_segment = true; - break; - default: - pr_err("%s: Invalid load_type 0x%x\n", - __func__, load_type); - ret = -EINVAL; - goto rel_bus_vote; - } - - if (load_segment) { - ret = wcd_cpe_load_each_segment(core, - phdr_idx, phdr); - if (ret < 0) { - dev_err(core->dev, - "Failed to load segment %d, aborting img dload\n", - phdr_idx); - img_dload_fail = true; - goto rel_bus_vote; - } - } else { - dev_dbg(core->dev, - "%s: skipped segment with index %d\n", - __func__, phdr_idx); - } - - elf_ptr = elf_ptr + sizeof(*phdr); - } - if (load_type == ELF_FLAG_EXECUTE) - core->ssr_type = WCD_CPE_IMEM_DOWNLOADED; - -rel_bus_vote: - wcd_cpe_bus_vote_max_bw(core, false); - -done: - release_firmware(fw); - return ret; -} - -/* - * wcd_cpe_change_online_state - mark cpe online/offline state - * @core: core session to mark - * @online: whether online of offline - * - */ -static void wcd_cpe_change_online_state(struct wcd_cpe_core *core, - int online) -{ - struct wcd_cpe_ssr_entry *ssr_entry = NULL; - unsigned long ret; - - if (!core) { - pr_err("%s: Invalid core handle\n", - __func__); - return; - } - - ssr_entry = &core->ssr_entry; - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - ssr_entry->offline = !online; - - /* Make sure write to offline state is completed. */ - wmb(); - ret = xchg(&ssr_entry->offline_change, 1); - wake_up_interruptible(&ssr_entry->offline_poll_wait); - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); - pr_debug("%s: change state 0x%x offline_change 0x%x\n" - " core->offline 0x%x, ret = %ld\n", - __func__, online, - ssr_entry->offline_change, - core->ssr_entry.offline, ret); -} - -/* - * wcd_cpe_load_fw_image: work function to load the fw image - * @work: work that is scheduled to perform the image loading - * - * Parse the mdt file to look for program headers, load each - * split file corresponding to the program headers. - */ -static void wcd_cpe_load_fw_image(struct work_struct *work) -{ - struct wcd_cpe_core *core; - int ret = 0; - - core = container_of(work, struct wcd_cpe_core, load_fw_work); - ret = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (!ret) - wcd_cpe_change_online_state(core, 1); - else - pr_err("%s: failed to load instruction section, err = %d\n", - __func__, ret); -} - -/* - * wcd_cpe_get_core_handle: get the handle to wcd_cpe_core - * @codec: codec from which this handle is to be obtained - * Codec driver should provide a callback function to obtain - * handle to wcd_cpe_core during initialization of wcd_cpe_core - */ -void *wcd_cpe_get_core_handle( - struct snd_soc_codec *codec) -{ - struct wcd_cpe_core *core = NULL; - - if (!codec) { - pr_err("%s: Invalid codec handle\n", - __func__); - goto done; - } - - if (!wcd_get_cpe_core) { - dev_err(codec->dev, - "%s: codec callback not available\n", - __func__); - goto done; - } - - core = wcd_get_cpe_core(codec); - - if (!core) - dev_err(codec->dev, - "%s: handle to core not available\n", - __func__); -done: - return core; -} -EXPORT_SYMBOL(wcd_cpe_get_core_handle); - -/* - * svass_engine_irq: threaded interrupt handler for svass engine irq - * @irq: interrupt number - * @data: data pointer passed during irq registration - */ -static irqreturn_t svass_engine_irq(int irq, void *data) -{ - struct wcd_cpe_core *core = data; - int ret = 0; - - if (!core) { - pr_err("%s: Invalid data for interrupt handler\n", - __func__); - goto done; - } - - ret = cpe_svc_process_irq(core->cpe_handle, CPE_IRQ_OUTBOX_IRQ); - if (ret < 0) - dev_err(core->dev, - "%s: Error processing irq from cpe_Services\n", - __func__); -done: - return IRQ_HANDLED; -} - -/* - * wcd_cpe_state_read - update read status in procfs - * @entry: snd_info_entry - * @buf: buffer where the read status is updated. - * - */ -static ssize_t wcd_cpe_state_read(struct snd_info_entry *entry, - void *file_private_data, struct file *file, - char __user *buf, size_t count, loff_t pos) -{ - int len = 0; - char buffer[WCD_CPE_STATE_MAX_LEN]; - struct wcd_cpe_core *core = NULL; - struct wcd_cpe_ssr_entry *ssr_entry = NULL; - - core = (struct wcd_cpe_core *) entry->private_data; - if (!core) { - pr_err("%s: CPE core NULL\n", __func__); - return -EINVAL; - } - ssr_entry = &core->ssr_entry; - - /* Make sure read from ssr_entry is completed. */ - rmb(); - dev_dbg(core->dev, - "%s: Offline 0x%x\n", __func__, - ssr_entry->offline); - - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - len = snprintf(buffer, sizeof(buffer), "%s\n", - ssr_entry->offline ? "OFFLINE" : "ONLINE"); - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -/* - * wcd_cpe_state_poll - polls for change state - * @entry: snd_info_entry - * @wait: wait for duration for poll wait - * - */ -static unsigned int wcd_cpe_state_poll(struct snd_info_entry *entry, - void *private_data, struct file *file, - poll_table *wait) -{ - struct wcd_cpe_core *core = NULL; - struct wcd_cpe_ssr_entry *ssr_entry = NULL; - int ret = 0; - - core = (struct wcd_cpe_core *) entry->private_data; - if (!core) { - pr_err("%s: CPE core NULL\n", __func__); - return -EINVAL; - } - - ssr_entry = &core->ssr_entry; - - dev_dbg(core->dev, "%s: CPE Poll wait\n", - __func__); - poll_wait(file, &ssr_entry->offline_poll_wait, wait); - dev_dbg(core->dev, "%s: Wake-up Poll wait\n", - __func__); - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - - if (xchg(&ssr_entry->offline_change, 0)) - ret = POLLIN | POLLPRI | POLLRDNORM; - - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); - - dev_dbg(core->dev, "%s: ret (%d) from poll_wait\n", - __func__, ret); - return ret; -} - -/* - * wcd_cpe_is_online_state - return true if card is online state - * @core: core offline to query - */ -static bool wcd_cpe_is_online_state(void *core_handle) -{ - struct wcd_cpe_core *core = core_handle; - - if (core_handle) { - return !core->ssr_entry.offline; - } else { - pr_err("%s: Core handle NULL\n", __func__); - /* still return 1- offline if core ptr null */ - return false; - } -} - -static struct snd_info_entry_ops wcd_cpe_state_proc_ops = { - .read = wcd_cpe_state_read, - .poll = wcd_cpe_state_poll, -}; - -static int wcd_cpe_check_new_image(struct wcd_cpe_core *core) -{ - int rc = 0; - char temp_img_name[WCD_CPE_IMAGE_FNAME_MAX]; - - if (!strcmp(core->fname, core->dyn_fname) && - core->ssr_type != WCD_CPE_INITIALIZED) { - dev_dbg(core->dev, - "%s: Firmware unchanged, fname = %s, ssr_type 0x%x\n", - __func__, core->fname, core->ssr_type); - goto done; - } - - /* - * Different firmware name requested, - * Re-load the instruction section - */ - strlcpy(temp_img_name, core->fname, - WCD_CPE_IMAGE_FNAME_MAX); - strlcpy(core->fname, core->dyn_fname, - WCD_CPE_IMAGE_FNAME_MAX); - - rc = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (rc) { - dev_err(core->dev, - "%s: Failed to dload new image %s, err = %d\n", - __func__, core->fname, rc); - /* If new image download failed, revert back to old image */ - strlcpy(core->fname, temp_img_name, - WCD_CPE_IMAGE_FNAME_MAX); - rc = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (rc) - dev_err(core->dev, - "%s: Failed to re-dload image %s, err = %d\n", - __func__, core->fname, rc); - } else { - dev_info(core->dev, "%s: fw changed to %s\n", - __func__, core->fname); - } -done: - return rc; -} - -static int wcd_cpe_enable(struct wcd_cpe_core *core, - bool enable) -{ - int ret = 0; - - if (enable) { - /* Reset CPE first */ - ret = cpe_svc_reset(core->cpe_handle); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE Reset failed, error = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_cpe_setup_irqs(core); - if (ret) { - dev_err(core->dev, - "%s: CPE IRQs setup failed, error = %d\n", - __func__, ret); - goto done; - } - ret = wcd_cpe_check_new_image(core); - if (ret) - goto fail_boot; - - /* Dload data section */ - ret = wcd_cpe_load_fw(core, ELF_FLAG_RW); - if (ret) { - dev_err(core->dev, - "%s: Failed to dload data section, err = %d\n", - __func__, ret); - goto fail_boot; - } - - ret = wcd_cpe_enable_cpe_clks(core, true); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE clk enable failed, err = %d\n", - __func__, ret); - goto fail_boot; - } - - ret = cpe_svc_boot(core->cpe_handle, - core->cpe_debug_mode); - if (ret < 0) { - dev_err(core->dev, - "%s: Failed to boot CPE\n", - __func__); - goto fail_boot; - } - - /* wait for CPE to be online */ - dev_dbg(core->dev, - "%s: waiting for CPE bootup\n", - __func__); - - wait_for_completion(&core->online_compl); - - dev_dbg(core->dev, - "%s: CPE bootup done\n", - __func__); - - core->ssr_type = WCD_CPE_ENABLED; - } else { - if (core->ssr_type == WCD_CPE_BUS_DOWN_EVENT || - core->ssr_type == WCD_CPE_SSR_EVENT) { - /* - * If this disable vote is when - * SSR is in progress, do not disable CPE here, - * instead SSR handler will control CPE. - */ - wcd_cpe_enable_cpe_clks(core, false); - wcd_cpe_cleanup_irqs(core); - goto done; - } - - ret = cpe_svc_shutdown(core->cpe_handle); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE shutdown failed, error %d\n", - __func__, ret); - goto done; - } - - wcd_cpe_enable_cpe_clks(core, false); - wcd_cpe_cleanup_irqs(core); - core->ssr_type = WCD_CPE_IMEM_DOWNLOADED; - } - - return ret; - -fail_boot: - wcd_cpe_cleanup_irqs(core); - -done: - return ret; -} - -/* - * wcd_cpe_boot_ssr: Load the images to CPE after ssr and bootup cpe - * @core: handle to the core - */ -static int wcd_cpe_boot_ssr(struct wcd_cpe_core *core) -{ - int rc = 0; - - if (!core || !core->cpe_handle) { - pr_err("%s: Invalid handle\n", __func__); - rc = -EINVAL; - goto fail; - } - /* Load the instruction section and mark CPE as online */ - rc = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (rc) { - dev_err(core->dev, - "%s: Failed to load instruction, err = %d\n", - __func__, rc); - goto fail; - } else { - wcd_cpe_change_online_state(core, 1); - } - -fail: - return rc; -} - -/* - * wcd_cpe_clr_ready_status: - * Clear the value from the ready status for CPE - * @core: handle to the core - * @value: flag/bitmask that is to be cleared - * - * This function should not be invoked with ssr_lock acquired - */ -static void wcd_cpe_clr_ready_status(struct wcd_cpe_core *core, - u8 value) -{ - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - core->ready_status &= ~(value); - dev_dbg(core->dev, - "%s: ready_status = 0x%x\n", - __func__, core->ready_status); - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); -} - -/* - * wcd_cpe_set_and_complete: - * Set the ready status with the provided value and - * flag the completion object if ready status moves - * to ready to download - * @core: handle to the core - * @value: flag/bitmask that is to be set - */ -static void wcd_cpe_set_and_complete(struct wcd_cpe_core *core, - u8 value) -{ - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - core->ready_status |= value; - if ((core->ready_status & WCD_CPE_READY_TO_DLOAD) == - WCD_CPE_READY_TO_DLOAD) { - dev_dbg(core->dev, - "%s: marking ready, status = 0x%x\n", - __func__, core->ready_status); - complete(&core->ready_compl); - } - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); -} - - -/* - * wcd_cpe_ssr_work: work function to handle CPE SSR - * @work: work that is scheduled to perform CPE shutdown - * and restart - */ -static void wcd_cpe_ssr_work(struct work_struct *work) -{ - - int rc = 0; - u32 irq = 0; - struct wcd_cpe_core *core = NULL; - u8 status = 0; - - core = container_of(work, struct wcd_cpe_core, ssr_work); - if (!core) { - pr_err("%s: Core handle NULL\n", __func__); - return; - } - - /* Obtain pm request up in case of suspend mode */ - pm_qos_add_request(&core->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - pm_qos_update_request(&core->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - dev_dbg(core->dev, - "%s: CPE SSR with event %d\n", - __func__, core->ssr_type); - - if (core->ssr_type == WCD_CPE_SSR_EVENT) { - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_STATUS, - &status); - if (status & core->irq_info.cpe_fatal_irqs) - irq = CPE_IRQ_WDOG_BITE; - } else { - /* If bus is down, cdc reg cannot be read */ - irq = CPE_IRQ_WDOG_BITE; - } - - if (core->cpe_users > 0) { - rc = cpe_svc_process_irq(core->cpe_handle, irq); - if (rc < 0) - /* - * Even if process_irq fails, - * wait for cpe to move to offline state - */ - dev_err(core->dev, - "%s: irq processing failed, error = %d\n", - __func__, rc); - - rc = wait_for_completion_timeout(&core->offline_compl, - CPE_OFFLINE_WAIT_TIMEOUT); - if (!rc) { - dev_err(core->dev, - "%s: wait for cpe offline timed out\n", - __func__); - goto err_ret; - } - if (core->ssr_type != WCD_CPE_BUS_DOWN_EVENT) { - wcd_cpe_get_sfr_dump(core); - - /* - * Ramdump has to be explicitly enabled - * through debugfs and cannot be collected - * when bus is down. - */ - if (ramdump_enable) - wcd_cpe_collect_ramdump(core); - } - } else { - pr_err("%s: no cpe users, mark as offline\n", __func__); - wcd_cpe_change_online_state(core, 0); - wcd_cpe_set_and_complete(core, - WCD_CPE_BLK_READY); - } - - rc = wait_for_completion_timeout(&core->ready_compl, - CPE_READY_WAIT_TIMEOUT); - if (!rc) { - dev_err(core->dev, - "%s: ready to online timed out, status = %u\n", - __func__, core->ready_status); - goto err_ret; - } - - rc = wcd_cpe_boot_ssr(core); - - /* Once image are downloaded make sure all - * error interrupts are cleared - */ - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_CLEAR, NULL); - -err_ret: - /* remove after default pm qos */ - pm_qos_update_request(&core->pm_qos_req, - PM_QOS_DEFAULT_VALUE); - pm_qos_remove_request(&core->pm_qos_req); -} - -/* - * wcd_cpe_ssr_handle: handle SSR events here. - * @core_handle: handle to the cpe core - * @event: indicates ADSP or CDSP SSR. - */ -int wcd_cpe_ssr_event(void *core_handle, - enum wcd_cpe_ssr_state_event event) -{ - struct wcd_cpe_core *core = core_handle; - - if (!core) { - pr_err("%s: Invalid handle to core\n", - __func__); - return -EINVAL; - } - - /* - * If CPE is not even enabled, the SSR event for - * CPE needs to be ignored - */ - if (core->ssr_type == WCD_CPE_INITIALIZED) { - dev_info(core->dev, - "%s: CPE initialized but not enabled, skip CPE ssr\n", - __func__); - return 0; - } - - dev_dbg(core->dev, - "%s: Schedule ssr work, event = %d\n", - __func__, core->ssr_type); - - switch (event) { - case WCD_CPE_BUS_DOWN_EVENT: - /* - * If bus down, then CPE block is also - * treated to be down - */ - wcd_cpe_clr_ready_status(core, WCD_CPE_READY_TO_DLOAD); - core->ssr_type = event; - schedule_work(&core->ssr_work); - break; - - case WCD_CPE_SSR_EVENT: - wcd_cpe_clr_ready_status(core, WCD_CPE_BLK_READY); - core->ssr_type = event; - schedule_work(&core->ssr_work); - break; - - case WCD_CPE_BUS_UP_EVENT: - wcd_cpe_set_and_complete(core, WCD_CPE_BUS_READY); - /* - * In case of bus up event ssr_type will be changed - * to WCD_CPE_ACTIVE once CPE is online - */ - break; - - default: - dev_err(core->dev, - "%s: unhandled SSR event %d\n", - __func__, event); - return -EINVAL; - } - - return 0; -} -EXPORT_SYMBOL(wcd_cpe_ssr_event); - -/* - * svass_exception_irq: threaded irq handler for sva error interrupts - * @irq: interrupt number - * @data: data pointer passed during irq registration - * - * Once a error interrupt is received, it is not cleared, since - * clearing this interrupt will raise spurious interrupts unless - * CPE is reset. - */ -static irqreturn_t svass_exception_irq(int irq, void *data) -{ - struct wcd_cpe_core *core = data; - u8 status = 0; - - if (!core || !CPE_ERR_IRQ_CB(core)) { - pr_err("%s: Invalid %s\n", - __func__, - (!core) ? "core" : "cdc control"); - return IRQ_HANDLED; - } - - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_STATUS, &status); - - while (status != 0) { - if (status & core->irq_info.cpe_fatal_irqs) { - dev_err(core->dev, - "%s: CPE SSR event,err_status = 0x%02x\n", - __func__, status); - wcd_cpe_ssr_event(core, WCD_CPE_SSR_EVENT); - /* - * If fatal interrupt is received, - * trigger SSR and stop processing - * further interrupts - */ - break; - } - /* - * Mask the interrupt that was raised to - * avoid spurious interrupts - */ - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_MASK, &status); - - /* Clear only the interrupt that was raised */ - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_CLEAR, &status); - dev_err(core->dev, - "%s: err_interrupt status = 0x%x\n", - __func__, status); - - /* Read status for pending interrupts */ - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_STATUS, &status); - } - - return IRQ_HANDLED; -} - -/* - * wcd_cpe_cmi_afe_cb: callback called on response to afe commands - * @param: parameter containing the response code, etc - * - * Process the request to the command sent to CPE and wakeup the - * command send wait. - */ -static void wcd_cpe_cmi_afe_cb(const struct cmi_api_notification *param) -{ - struct cmi_hdr *hdr; - struct wcd_cmi_afe_port_data *afe_port_d; - u8 port_id; - - if (!param) { - pr_err("%s: param is null\n", __func__); - return; - } - - if (param->event != CMI_API_MSG) { - pr_err("%s: unhandled event 0x%x\n", - __func__, param->event); - return; - } - - pr_debug("%s: param->result = %d\n", - __func__, param->result); - - hdr = (struct cmi_hdr *) param->message; - - /* - * for AFE cmd response, port id is - * stored at session id field of header - */ - port_id = CMI_HDR_GET_SESSION_ID(hdr); - if (port_id > WCD_CPE_AFE_MAX_PORTS) { - pr_err("%s: invalid port_id %d\n", - __func__, port_id); - return; - } - - afe_port_d = &(afe_ports[port_id]); - - if (hdr->opcode == CPE_CMI_BASIC_RSP_OPCODE) { - - u8 *payload = ((u8 *)param->message) + (sizeof(struct cmi_hdr)); - u8 result = payload[0]; - - afe_port_d->cmd_result = result; - complete(&afe_port_d->afe_cmd_complete); - - } else if (hdr->opcode == CPE_AFE_PORT_CMDRSP_SHARED_MEM_ALLOC) { - - struct cpe_cmdrsp_shmem_alloc *cmdrsp_shmem_alloc = - (struct cpe_cmdrsp_shmem_alloc *) param->message; - - if (cmdrsp_shmem_alloc->addr == 0) { - pr_err("%s: Failed AFE shared mem alloc\n", __func__); - afe_port_d->cmd_result = CMI_SHMEM_ALLOC_FAILED; - } else { - pr_debug("%s AFE shared mem addr = 0x%x\n", - __func__, cmdrsp_shmem_alloc->addr); - afe_port_d->mem_handle = cmdrsp_shmem_alloc->addr; - afe_port_d->cmd_result = 0; - } - complete(&afe_port_d->afe_cmd_complete); - } -} - -/* - * wcd_cpe_initialize_afe_port_data: Initialize all AFE ports - * - * Initialize the data for all the afe ports. Assign the - * afe port state to INIT state. - */ -static void wcd_cpe_initialize_afe_port_data(void) -{ - struct wcd_cmi_afe_port_data *afe_port_d; - int i; - - for (i = 0; i <= WCD_CPE_AFE_MAX_PORTS; i++) { - afe_port_d = &afe_ports[i]; - afe_port_d->port_id = i; - init_completion(&afe_port_d->afe_cmd_complete); - afe_port_d->port_state = AFE_PORT_STATE_INIT; - mutex_init(&afe_port_d->afe_lock); - } -} - -/* - * wcd_cpe_deinitialize_afe_port_data: De-initialize all AFE ports - * - * De-Initialize the data for all the afe ports. Assign the - * afe port state to DEINIT state. - */ -static void wcd_cpe_deinitialize_afe_port_data(void) -{ - struct wcd_cmi_afe_port_data *afe_port_d; - int i; - - for (i = 0; i <= WCD_CPE_AFE_MAX_PORTS; i++) { - afe_port_d = &afe_ports[i]; - afe_port_d->port_state = AFE_PORT_STATE_DEINIT; - mutex_destroy(&afe_port_d->afe_lock); - } -} - -/* - * wcd_cpe_svc_event_cb: callback from cpe services, indicating - * CPE is online or offline. - * @param: parameter / payload for event to be notified - */ -static void wcd_cpe_svc_event_cb(const struct cpe_svc_notification *param) -{ - struct snd_soc_codec *codec; - struct wcd_cpe_core *core; - struct cpe_svc_boot_event *boot_data; - bool active_sessions; - - if (!param) { - pr_err("%s: Invalid event\n", __func__); - return; - } - - codec = param->private_data; - if (!codec) { - pr_err("%s: Invalid handle to codec\n", - __func__); - return; - } - - core = wcd_cpe_get_core_handle(codec); - if (!core) { - pr_err("%s: Invalid handle to core\n", - __func__); - return; - } - - dev_dbg(core->dev, - "%s: event = 0x%x, ssr_type = 0x%x\n", - __func__, param->event, core->ssr_type); - - switch (param->event) { - case CPE_SVC_BOOT: - boot_data = (struct cpe_svc_boot_event *) - param->payload; - core->sfr_buf_addr = boot_data->debug_address; - core->sfr_buf_size = boot_data->debug_buffer_size; - dev_dbg(core->dev, - "%s: CPE booted, sfr_addr = %d, sfr_size = %zu\n", - __func__, core->sfr_buf_addr, - core->sfr_buf_size); - break; - case CPE_SVC_ONLINE: - core->ssr_type = WCD_CPE_ACTIVE; - dev_dbg(core->dev, "%s CPE is now online\n", - __func__); - complete(&core->online_compl); - break; - case CPE_SVC_OFFLINE: - /* - * offline can happen during normal shutdown, - * but we are interested in offline only during - * SSR. - */ - if (core->ssr_type != WCD_CPE_SSR_EVENT && - core->ssr_type != WCD_CPE_BUS_DOWN_EVENT) - break; - - active_sessions = wcd_cpe_lsm_session_active(); - wcd_cpe_change_online_state(core, 0); - complete(&core->offline_compl); - dev_err(core->dev, "%s: CPE is now offline\n", - __func__); - break; - case CPE_SVC_CMI_CLIENTS_DEREG: - - /* - * Only when either CPE SSR is in progress, - * or the bus is down, we need to mark the CPE - * as ready. In all other cases, this event is - * ignored - */ - if (core->ssr_type == WCD_CPE_SSR_EVENT || - core->ssr_type == WCD_CPE_BUS_DOWN_EVENT) - wcd_cpe_set_and_complete(core, - WCD_CPE_BLK_READY); - break; - default: - dev_err(core->dev, - "%s: unhandled notification\n", - __func__); - break; - } -} - -/* - * wcd_cpe_cleanup_irqs: free the irq resources required by cpe - * @core: handle the cpe core - * - * This API will free the IRQs for CPE but does not mask the - * CPE interrupts. If masking is needed, it has to be done - * explicity by caller. - */ -static void wcd_cpe_cleanup_irqs(struct wcd_cpe_core *core) -{ - - struct snd_soc_codec *codec = core->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - - wcd9xxx_free_irq(core_res, - core->irq_info.cpe_engine_irq, - core); - wcd9xxx_free_irq(core_res, - core->irq_info.cpe_err_irq, - core); - -} - -/* - * wcd_cpe_setup_sva_err_intr: setup the irqs for CPE - * @core: handle to wcd_cpe_core - * All interrupts needed for CPE are acquired. If any - * request_irq fails, then all irqs are free'd - */ -static int wcd_cpe_setup_irqs(struct wcd_cpe_core *core) -{ - int ret; - struct snd_soc_codec *codec = core->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - - ret = wcd9xxx_request_irq(core_res, - core->irq_info.cpe_engine_irq, - svass_engine_irq, "SVASS_Engine", core); - if (ret) { - dev_err(core->dev, - "%s: Failed to request svass engine irq\n", - __func__); - goto fail_engine_irq; - } - - /* Make sure all error interrupts are cleared */ - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_CLEAR, - NULL); - - /* Enable required error interrupts */ - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_UNMASK, - NULL); - - ret = wcd9xxx_request_irq(core_res, - core->irq_info.cpe_err_irq, - svass_exception_irq, "SVASS_Exception", core); - if (ret) { - dev_err(core->dev, - "%s: Failed to request svass err irq\n", - __func__); - goto fail_exception_irq; - } - - return 0; - -fail_exception_irq: - wcd9xxx_free_irq(core_res, - core->irq_info.cpe_engine_irq, core); - -fail_engine_irq: - return ret; -} - -static int wcd_cpe_get_cal_index(int32_t cal_type) -{ - int cal_index = -EINVAL; - - if (cal_type == ULP_AFE_CAL_TYPE) - cal_index = WCD_CPE_LSM_CAL_AFE; - else if (cal_type == ULP_LSM_CAL_TYPE) - cal_index = WCD_CPE_LSM_CAL_LSM; - else if (cal_type == ULP_LSM_TOPOLOGY_ID_CAL_TYPE) - cal_index = WCD_CPE_LSM_CAL_TOPOLOGY_ID; - else - pr_err("%s: invalid cal_type %d\n", - __func__, cal_type); - - return cal_index; -} - -static int wcd_cpe_alloc_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = wcd_cpe_get_cal_index(cal_type); - if (cal_index < 0) { - pr_err("%s: invalid caltype %d\n", - __func__, cal_type); - return -EINVAL; - } - - ret = cal_utils_alloc_cal(data_size, data, - core_d->cal_data[cal_index], - 0, NULL); - if (ret < 0) - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - return ret; -} - -static int wcd_cpe_dealloc_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - cal_index = wcd_cpe_get_cal_index(cal_type); - if (cal_index < 0) { - pr_err("%s: invalid caltype %d\n", - __func__, cal_type); - return -EINVAL; - } - - ret = cal_utils_dealloc_cal(data_size, data, - core_d->cal_data[cal_index]); - if (ret < 0) - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - return ret; -} - -static int wcd_cpe_set_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = wcd_cpe_get_cal_index(cal_type); - if (cal_index < 0) { - pr_err("%s: invalid caltype %d\n", - __func__, cal_type); - return -EINVAL; - } - - ret = cal_utils_set_cal(data_size, data, - core_d->cal_data[cal_index], - 0, NULL); - if (ret < 0) - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - return ret; -} - -static int wcd_cpe_cal_init(struct wcd_cpe_core *core) -{ - int ret = 0; - - struct cal_type_info cal_type_info[] = { - {{ULP_AFE_CAL_TYPE, - {wcd_cpe_alloc_cal, wcd_cpe_dealloc_cal, NULL, - wcd_cpe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ULP_LSM_CAL_TYPE, - {wcd_cpe_alloc_cal, wcd_cpe_dealloc_cal, NULL, - wcd_cpe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ULP_LSM_TOPOLOGY_ID_CAL_TYPE, - {wcd_cpe_alloc_cal, wcd_cpe_dealloc_cal, NULL, - wcd_cpe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - - ret = cal_utils_create_cal_types(WCD_CPE_LSM_CAL_MAX, - core->cal_data, - cal_type_info); - if (ret < 0) - pr_err("%s: could not create cal type!\n", - __func__); - return ret; -} - -/* - * wcd_cpe_enable: setup the cpe interrupts and schedule - * the work to download image and bootup the CPE. - * core: handle to cpe core structure - */ -static int wcd_cpe_vote(struct wcd_cpe_core *core, - bool enable) -{ - int ret = 0; - - if (!core) { - pr_err("%s: Invalid handle to core\n", - __func__); - ret = -EINVAL; - goto done; - } - - dev_dbg(core->dev, - "%s: enter, enable = %s, cpe_users = %u\n", - __func__, (enable ? "true" : "false"), - core->cpe_users); - - if (enable) { - core->cpe_users++; - if (core->cpe_users == 1) { - ret = wcd_cpe_enable(core, enable); - if (ret) { - dev_err(core->dev, - "%s: CPE enable failed, err = %d\n", - __func__, ret); - goto done; - } - } else { - dev_dbg(core->dev, - "%s: cpe already enabled, users = %u\n", - __func__, core->cpe_users); - goto done; - } - } else { - core->cpe_users--; - if (core->cpe_users == 0) { - ret = wcd_cpe_enable(core, enable); - if (ret) { - dev_err(core->dev, - "%s: CPE disable failed, err = %d\n", - __func__, ret); - goto done; - } - } else { - dev_dbg(core->dev, - "%s: %u valid users on cpe\n", - __func__, core->cpe_users); - goto done; - } - } - - dev_dbg(core->dev, - "%s: leave, enable = %s, cpe_users = %u\n", - __func__, (enable ? "true" : "false"), - core->cpe_users); - -done: - return ret; -} - -static int wcd_cpe_debugfs_init(struct wcd_cpe_core *core) -{ - int rc = 0; - - struct dentry *dir = debugfs_create_dir("wcd_cpe", NULL); - - if (IS_ERR_OR_NULL(dir)) { - dir = NULL; - rc = -ENODEV; - goto err_create_dir; - } - - if (!debugfs_create_u32("ramdump_enable", 0644, - dir, &ramdump_enable)) { - dev_err(core->dev, "%s: Failed to create debugfs node %s\n", - __func__, "ramdump_enable"); - rc = -ENODEV; - goto err_create_entry; - } - - if (!debugfs_create_file("cpe_ftm_test_trigger", 0200, - dir, core, &cpe_ftm_test_trigger_fops)) { - dev_err(core->dev, "%s: Failed to create debugfs node %s\n", - __func__, "cpe_ftm_test_trigger"); - rc = -ENODEV; - goto err_create_entry; - } - - if (!debugfs_create_u32("cpe_ftm_test_status", 0444, - dir, &cpe_ftm_test_status)) { - dev_err(core->dev, "%s: Failed to create debugfs node %s\n", - __func__, "cpe_ftm_test_status"); - rc = -ENODEV; - goto err_create_entry; - } - -err_create_entry: - debugfs_remove(dir); - -err_create_dir: - return rc; -} - -static ssize_t fw_name_show(struct wcd_cpe_core *core, char *buf) -{ - return snprintf(buf, WCD_CPE_IMAGE_FNAME_MAX, "%s", - core->dyn_fname); -} - -static ssize_t fw_name_store(struct wcd_cpe_core *core, - const char *buf, ssize_t count) -{ - int copy_count = count; - const char *pos; - - pos = memchr(buf, '\n', count); - if (pos) - copy_count = pos - buf; - - if (copy_count > (WCD_CPE_IMAGE_FNAME_MAX - 1)) { - dev_err(core->dev, - "%s: Invalid length %d, max allowed %d\n", - __func__, copy_count, WCD_CPE_IMAGE_FNAME_MAX - 1); - return -EINVAL; - } - - strlcpy(core->dyn_fname, buf, copy_count + 1); - - return count; -} - -WCD_CPE_ATTR(fw_name, 0660, fw_name_show, fw_name_store); - -static ssize_t wcd_cpe_sysfs_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct wcd_cpe_attribute *cpe_attr = to_wcd_cpe_attr(attr); - struct wcd_cpe_core *core = kobj_to_cpe_core(kobj); - ssize_t ret = -EINVAL; - - if (core && cpe_attr->show) - ret = cpe_attr->show(core, buf); - - return ret; -} - -static ssize_t wcd_cpe_sysfs_store(struct kobject *kobj, - struct attribute *attr, const char *buf, - size_t count) -{ - struct wcd_cpe_attribute *cpe_attr = to_wcd_cpe_attr(attr); - struct wcd_cpe_core *core = kobj_to_cpe_core(kobj); - ssize_t ret = -EINVAL; - - if (core && cpe_attr->store) - ret = cpe_attr->store(core, buf, count); - - return ret; -} - -static const struct sysfs_ops wcd_cpe_sysfs_ops = { - .show = wcd_cpe_sysfs_show, - .store = wcd_cpe_sysfs_store, -}; - -static struct kobj_type wcd_cpe_ktype = { - .sysfs_ops = &wcd_cpe_sysfs_ops, -}; - -static int wcd_cpe_sysfs_init(struct wcd_cpe_core *core, int id) -{ - char sysfs_dir_name[WCD_CPE_SYSFS_DIR_MAX_LENGTH]; - int rc = 0; - - snprintf(sysfs_dir_name, WCD_CPE_SYSFS_DIR_MAX_LENGTH, - "%s%d", "wcd_cpe", id); - - rc = kobject_init_and_add(&core->cpe_kobj, &wcd_cpe_ktype, - kernel_kobj, - sysfs_dir_name); - if (unlikely(rc)) { - dev_err(core->dev, - "%s: Failed to add kobject %s, err = %d\n", - __func__, sysfs_dir_name, rc); - goto done; - } - - rc = sysfs_create_file(&core->cpe_kobj, &cpe_attr_fw_name.attr); - if (rc) { - dev_err(core->dev, - "%s: Failed to fw_name sysfs entry to %s\n", - __func__, sysfs_dir_name); - goto fail_create_file; - } - - return 0; - -fail_create_file: - kobject_put(&core->cpe_kobj); -done: - return rc; -} - -static ssize_t cpe_ftm_test_trigger(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct wcd_cpe_core *core = file->private_data; - int ret = 0; - - /* Enable the clks for cpe */ - ret = wcd_cpe_enable_cpe_clks(core, true); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE clk enable failed, err = %d\n", - __func__, ret); - goto done; - } - - /* Get the CPE_STATUS */ - ret = cpe_svc_ftm_test(core->cpe_handle, &cpe_ftm_test_status); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE FTM test failed, err = %d\n", - __func__, ret); - if (ret == CPE_SVC_BUSY) { - cpe_ftm_test_status = 1; - ret = 0; - } - } - - /* Disable the clks for cpe */ - ret = wcd_cpe_enable_cpe_clks(core, false); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE clk disable failed, err = %d\n", - __func__, ret); - } - -done: - if (ret < 0) - return ret; - else - return count; -} - -static int wcd_cpe_validate_params( - struct snd_soc_codec *codec, - struct wcd_cpe_params *params) -{ - - if (!codec) { - pr_err("%s: Invalid codec\n", __func__); - return -EINVAL; - } - - if (!params) { - dev_err(codec->dev, - "%s: No params supplied for codec %s\n", - __func__, codec->component.name); - return -EINVAL; - } - - if (!params->codec || !params->get_cpe_core || - !params->cdc_cb) { - dev_err(codec->dev, - "%s: Invalid params for codec %s\n", - __func__, codec->component.name); - return -EINVAL; - } - - return 0; -} - -/* - * wcd_cpe_init: Initialize CPE related structures - * @img_fname: filename for firmware image - * @codec: handle to codec requesting for image download - * @params: parameter structure passed from caller - * - * This API will initialize the cpe core but will not - * download the image or boot the cpe core. - */ -struct wcd_cpe_core *wcd_cpe_init(const char *img_fname, - struct snd_soc_codec *codec, - struct wcd_cpe_params *params) -{ - struct wcd_cpe_core *core; - int ret = 0; - struct snd_card *card = NULL; - struct snd_info_entry *entry = NULL; - char proc_name[WCD_CPE_STATE_MAX_LEN]; - const char *cpe_name = "cpe"; - const char *state_name = "_state"; - const struct cpe_svc_hw_cfg *hw_info; - int id = 0; - - if (wcd_cpe_validate_params(codec, params)) - return NULL; - - core = kzalloc(sizeof(struct wcd_cpe_core), GFP_KERNEL); - if (!core) - return NULL; - - snprintf(core->fname, sizeof(core->fname), "%s", img_fname); - strlcpy(core->dyn_fname, core->fname, WCD_CPE_IMAGE_FNAME_MAX); - - wcd_get_cpe_core = params->get_cpe_core; - - core->codec = params->codec; - core->dev = params->codec->dev; - core->cpe_debug_mode = params->dbg_mode; - - core->cdc_info.major_version = params->cdc_major_ver; - core->cdc_info.minor_version = params->cdc_minor_ver; - core->cdc_info.id = params->cdc_id; - - core->cpe_cdc_cb = params->cdc_cb; - - memcpy(&core->irq_info, ¶ms->cdc_irq_info, - sizeof(core->irq_info)); - - INIT_WORK(&core->load_fw_work, wcd_cpe_load_fw_image); - INIT_WORK(&core->ssr_work, wcd_cpe_ssr_work); - init_completion(&core->offline_compl); - init_completion(&core->ready_compl); - init_completion(&core->online_compl); - init_waitqueue_head(&core->ssr_entry.offline_poll_wait); - mutex_init(&core->ssr_lock); - mutex_init(&core->session_lock); - core->cpe_users = 0; - core->cpe_clk_ref = 0; - - /* - * By default, during probe, it is assumed that - * both CPE hardware block and underlying bus to codec - * are ready - */ - core->ready_status = WCD_CPE_READY_TO_DLOAD; - - core->cpe_handle = cpe_svc_initialize(NULL, &core->cdc_info, - params->cpe_svc_params); - if (!core->cpe_handle) { - dev_err(core->dev, - "%s: failed to initialize cpe services\n", - __func__); - goto fail_cpe_initialize; - } - - core->cpe_reg_handle = cpe_svc_register(core->cpe_handle, - wcd_cpe_svc_event_cb, - CPE_SVC_ONLINE | CPE_SVC_OFFLINE | - CPE_SVC_BOOT | - CPE_SVC_CMI_CLIENTS_DEREG, - "codec cpe handler"); - if (!core->cpe_reg_handle) { - dev_err(core->dev, - "%s: failed to register cpe service\n", - __func__); - goto fail_cpe_register; - } - - card = codec->component.card->snd_card; - snprintf(proc_name, (sizeof("cpe") + sizeof("_state") + - sizeof(id) - 2), "%s%d%s", cpe_name, id, state_name); - entry = snd_info_create_card_entry(card, proc_name, - card->proc_root); - if (entry) { - core->ssr_entry.entry = entry; - core->ssr_entry.offline = 1; - entry->size = WCD_CPE_STATE_MAX_LEN; - entry->content = SNDRV_INFO_CONTENT_DATA; - entry->c.ops = &wcd_cpe_state_proc_ops; - entry->private_data = core; - ret = snd_info_register(entry); - if (ret < 0) { - dev_err(core->dev, - "%s: snd_info_register failed (%d)\n", - __func__, ret); - snd_info_free_entry(entry); - entry = NULL; - } - } else { - dev_err(core->dev, - "%s: Failed to create CPE SSR status entry\n", - __func__); - /* - * Even if SSR entry creation fails, continue - * with image download - */ - } - - core_d = core; - ret = wcd_cpe_cal_init(core); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE calibration init failed, err = %d\n", - __func__, ret); - goto fail_cpe_reset; - } - - wcd_cpe_debugfs_init(core); - - wcd_cpe_sysfs_init(core, id); - - hw_info = cpe_svc_get_hw_cfg(core->cpe_handle); - if (!hw_info) { - dev_err(core->dev, - "%s: hw info not available\n", - __func__); - goto schedule_dload_work; - } else { - core->hw_info.dram_offset = hw_info->DRAM_offset; - core->hw_info.dram_size = hw_info->DRAM_size; - core->hw_info.iram_offset = hw_info->IRAM_offset; - core->hw_info.iram_size = hw_info->IRAM_size; - } - - /* Setup the ramdump device and buffer */ - core->cpe_ramdump_dev = create_ramdump_device("cpe", - core->dev); - if (!core->cpe_ramdump_dev) { - dev_err(core->dev, - "%s: Failed to create ramdump device\n", - __func__); - goto schedule_dload_work; - } - - arch_setup_dma_ops(core->dev, 0, 0, NULL, 0); - core->cpe_dump_v_addr = dma_alloc_coherent(core->dev, - core->hw_info.dram_size, - &core->cpe_dump_addr, - GFP_KERNEL); - if (!core->cpe_dump_v_addr) { - dev_err(core->dev, - "%s: Failed to alloc memory for cpe dump, size = %zd\n", - __func__, core->hw_info.dram_size); - goto schedule_dload_work; - } else { - memset(core->cpe_dump_v_addr, 0, core->hw_info.dram_size); - } - -schedule_dload_work: - core->ssr_type = WCD_CPE_INITIALIZED; - schedule_work(&core->load_fw_work); - return core; - -fail_cpe_reset: - cpe_svc_deregister(core->cpe_handle, core->cpe_reg_handle); - -fail_cpe_register: - cpe_svc_deinitialize(core->cpe_handle); - -fail_cpe_initialize: - kfree(core); - return NULL; -} -EXPORT_SYMBOL(wcd_cpe_init); - -/* - * wcd_cpe_cmi_lsm_callback: callback called from cpe services - * to notify command response for lsm - * service - * @param: param containing the response code and status - * - * This callback is registered with cpe services while registering - * the LSM service - */ -static void wcd_cpe_cmi_lsm_callback(const struct cmi_api_notification *param) -{ - struct cmi_hdr *hdr; - struct cpe_lsm_session *lsm_session; - u8 session_id; - - if (!param) { - pr_err("%s: param is null\n", __func__); - return; - } - - if (param->event != CMI_API_MSG) { - pr_err("%s: unhandled event 0x%x\n", __func__, param->event); - return; - } - - hdr = (struct cmi_hdr *) param->message; - session_id = CMI_HDR_GET_SESSION_ID(hdr); - - if (session_id > WCD_CPE_LSM_MAX_SESSIONS) { - pr_err("%s: invalid lsm session id = %d\n", - __func__, session_id); - return; - } - - lsm_session = lsm_sessions[session_id]; - - if (hdr->opcode == CPE_CMI_BASIC_RSP_OPCODE) { - - u8 *payload = ((u8 *)param->message) + (sizeof(struct cmi_hdr)); - u8 result = payload[0]; - - lsm_session->cmd_err_code = result; - complete(&lsm_session->cmd_comp); - - } else if (hdr->opcode == CPE_LSM_SESSION_CMDRSP_SHARED_MEM_ALLOC) { - - struct cpe_cmdrsp_shmem_alloc *cmdrsp_shmem_alloc = - (struct cpe_cmdrsp_shmem_alloc *) param->message; - - if (cmdrsp_shmem_alloc->addr == 0) { - pr_err("%s: Failed LSM shared mem alloc\n", __func__); - lsm_session->cmd_err_code = CMI_SHMEM_ALLOC_FAILED; - - } else { - - pr_debug("%s LSM shared mem addr = 0x%x\n", - __func__, cmdrsp_shmem_alloc->addr); - lsm_session->lsm_mem_handle = cmdrsp_shmem_alloc->addr; - lsm_session->cmd_err_code = 0; - } - - complete(&lsm_session->cmd_comp); - - } else if (hdr->opcode == CPE_LSM_SESSION_EVENT_DETECTION_STATUS_V2) { - - struct cpe_lsm_event_detect_v2 *event_detect_v2 = - (struct cpe_lsm_event_detect_v2 *) param->message; - - if (!lsm_session->priv_d) { - pr_err("%s: private data is not present\n", - __func__); - return; - } - - pr_debug("%s: event payload, status = %u, size = %u\n", - __func__, event_detect_v2->detection_status, - event_detect_v2->size); - - if (lsm_session->event_cb) - lsm_session->event_cb( - lsm_session->priv_d, - event_detect_v2->detection_status, - event_detect_v2->size, - event_detect_v2->payload); - } -} - -/* - * wcd_cpe_cmi_send_lsm_msg: send a message to lsm service - * @core: handle to cpe core - * @session: session on which to send the message - * @message: actual message containing header and payload - * - * Sends message to lsm service for specified session and wait - * for response back on the message. - * should be called after acquiring session specific mutex - */ -static int wcd_cpe_cmi_send_lsm_msg( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *message) -{ - int ret = 0; - struct cmi_hdr *hdr = message; - - pr_debug("%s: sending message with opcode 0x%x\n", - __func__, hdr->opcode); - - if (unlikely(!wcd_cpe_is_online_state(core))) { - dev_err(core->dev, - "%s: MSG not sent, CPE offline\n", - __func__); - goto done; - } - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, true); - - reinit_completion(&session->cmd_comp); - ret = cmi_send_msg(message); - if (ret) { - pr_err("%s: msg opcode (0x%x) send failed (%d)\n", - __func__, hdr->opcode, ret); - goto rel_bus_vote; - } - - ret = wait_for_completion_timeout(&session->cmd_comp, - CMI_CMD_TIMEOUT); - if (ret > 0) { - pr_debug("%s: command 0x%x, received response 0x%x\n", - __func__, hdr->opcode, session->cmd_err_code); - if (session->cmd_err_code == CMI_SHMEM_ALLOC_FAILED) - session->cmd_err_code = CPE_ENOMEMORY; - if (session->cmd_err_code > 0) - pr_err("%s: CPE returned error[%s]\n", - __func__, cpe_err_get_err_str( - session->cmd_err_code)); - ret = cpe_err_get_lnx_err_code(session->cmd_err_code); - goto rel_bus_vote; - } else { - pr_err("%s: command (0x%x) send timed out\n", - __func__, hdr->opcode); - ret = -ETIMEDOUT; - goto rel_bus_vote; - } - - -rel_bus_vote: - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, false); - -done: - return ret; -} - - -/* - * fill_cmi_header: fill the cmi header with specified values - * - * @hdr: header to be updated with values - * @session_id: session id of the header, - * in case of AFE service it is port_id - * @service_id: afe/lsm, etc - * @version: update the version field in header - * @payload_size: size of the payload following after header - * @opcode: opcode of the message - * @obm_flag: indicates if this header is for obm message - * - */ -static int fill_cmi_header(struct cmi_hdr *hdr, - u8 session_id, u8 service_id, - bool version, u8 payload_size, - u16 opcode, bool obm_flag) -{ - /* sanitize the data */ - if (!IS_VALID_SESSION_ID(session_id) || - !IS_VALID_SERVICE_ID(service_id) || - !IS_VALID_PLD_SIZE(payload_size)) { - pr_err("Invalid header creation request\n"); - return -EINVAL; - } - - CMI_HDR_SET_SESSION(hdr, session_id); - CMI_HDR_SET_SERVICE(hdr, service_id); - if (version) - CMI_HDR_SET_VERSION(hdr, 1); - else - CMI_HDR_SET_VERSION(hdr, 0); - - CMI_HDR_SET_PAYLOAD_SIZE(hdr, payload_size); - - hdr->opcode = opcode; - - if (obm_flag) - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_OUT_BAND); - else - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_IN_BAND); - - return 0; -} - -/* - * fill_lsm_cmd_header_v0_inband: - * Given the header, fill the header with information - * for lsm service, version 0 and inband message - * @hdr: the cmi header to be filled. - * @session_id: ID for the lsm session - * @payload_size: size for cmi message payload - * @opcode: opcode for cmi message - */ -static int fill_lsm_cmd_header_v0_inband(struct cmi_hdr *hdr, - u8 session_id, u8 payload_size, u16 opcode) -{ - return fill_cmi_header(hdr, session_id, - CMI_CPE_LSM_SERVICE_ID, false, - payload_size, opcode, false); -} - -/* - * wcd_cpe_is_valid_lsm_session: - * Check session parameters to identify validity for the sesion - * @core: handle to cpe core - * @session: handle to the lsm session - * @func: invoking function to be printed in error logs - */ -static int wcd_cpe_is_valid_lsm_session(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - const char *func) -{ - if (unlikely(IS_ERR_OR_NULL(core))) { - pr_err("%s: invalid handle to core\n", - func); - return -EINVAL; - } - - if (unlikely(IS_ERR_OR_NULL(session))) { - dev_err(core->dev, "%s: invalid session\n", - func); - return -EINVAL; - } - - if (session->id > WCD_CPE_LSM_MAX_SESSIONS) { - dev_err(core->dev, "%s: invalid session id (%u)\n", - func, session->id); - return -EINVAL; - } - - dev_dbg(core->dev, "%s: session_id = %u\n", - func, session->id); - return 0; -} - -static int wcd_cpe_cmd_lsm_open_tx_v2( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session) -{ - struct cpe_lsm_cmd_open_tx_v2 cmd_open_tx_v2; - struct cal_block_data *top_cal = NULL; - struct audio_cal_info_lsm_top *lsm_top; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - if (core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID] == NULL) { - dev_err(core->dev, - "%s: LSM_TOPOLOGY cal not allocated!\n", - __func__); - return -EINVAL; - } - - mutex_lock(&core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID]->lock); - top_cal = cal_utils_get_only_cal_block( - core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID]); - if (!top_cal) { - dev_err(core->dev, - "%s: Failed to get LSM TOPOLOGY cal block\n", - __func__); - ret = -EINVAL; - goto unlock_cal_mutex; - } - - lsm_top = (struct audio_cal_info_lsm_top *) - top_cal->cal_info; - - if (!lsm_top) { - dev_err(core->dev, - "%s: cal_info for LSM_TOPOLOGY not found\n", - __func__); - ret = -EINVAL; - goto unlock_cal_mutex; - } - - dev_dbg(core->dev, - "%s: topology_id = 0x%x, acdb_id = 0x%x, app_type = 0x%x\n", - __func__, lsm_top->topology, lsm_top->acdb_id, - lsm_top->app_type); - - if (lsm_top->topology == 0) { - dev_err(core->dev, - "%s: topology id not sent for app_type 0x%x\n", - __func__, lsm_top->app_type); - ret = -EINVAL; - goto unlock_cal_mutex; - } - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_open_tx_v2, 0, sizeof(struct cpe_lsm_cmd_open_tx_v2)); - if (fill_lsm_cmd_header_v0_inband(&cmd_open_tx_v2.hdr, - session->id, OPEN_V2_CMD_PAYLOAD_SIZE, - CPE_LSM_SESSION_CMD_OPEN_TX_V2)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_open_tx_v2.topology_id = lsm_top->topology; - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_open_tx_v2); - if (ret) - dev_err(core->dev, - "%s: failed to send open_tx_v2 cmd, err = %d\n", - __func__, ret); - else - session->is_topology_used = true; -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - -unlock_cal_mutex: - mutex_unlock(&core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID]->lock); - return ret; -} - -/* - * wcd_cpe_cmd_lsm_open_tx: compose and send lsm open command - * @core_handle: handle to cpe core - * @session: session for which the command needs to be sent - * @app_id: application id part of the command - * @sample_rate: sample rate for this session - */ -static int wcd_cpe_cmd_lsm_open_tx(void *core_handle, - struct cpe_lsm_session *session, - u16 app_id, u16 sample_rate) -{ - struct cpe_lsm_cmd_open_tx cmd_open_tx; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - /* Try to open with topology first */ - ret = wcd_cpe_cmd_lsm_open_tx_v2(core, session); - if (!ret) - goto done; - - dev_dbg(core->dev, "%s: Try open_tx without topology\n", - __func__); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_open_tx, 0, sizeof(struct cpe_lsm_cmd_open_tx)); - if (fill_lsm_cmd_header_v0_inband(&cmd_open_tx.hdr, - session->id, OPEN_CMD_PAYLOAD_SIZE, - CPE_LSM_SESSION_CMD_OPEN_TX)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_open_tx.app_id = app_id; - cmd_open_tx.sampling_rate = sample_rate; - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_open_tx); - if (ret) - dev_err(core->dev, - "%s: failed to send open_tx cmd, err = %d\n", - __func__, ret); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -done: - return ret; -} - -/* - * wcd_cpe_cmd_close_tx: compose and send lsm close command - * @core_handle: handle to cpe core - * @session: session for which the command needs to be sent - */ -static int wcd_cpe_cmd_lsm_close_tx(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_close_tx; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_close_tx, 0, sizeof(cmd_close_tx)); - if (fill_lsm_cmd_header_v0_inband(&cmd_close_tx, session->id, - 0, CPE_LSM_SESSION_CMD_CLOSE_TX)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_close_tx); - if (ret) - dev_err(core->dev, - "%s: lsm close_tx cmd failed, err = %d\n", - __func__, ret); - else - session->is_topology_used = false; -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_cmd_shmem_alloc: compose and send lsm shared - * memory allocation command - * @core_handle: handle to cpe core - * @session: session for which the command needs to be sent - * @size: size of memory to be allocated - */ -static int wcd_cpe_cmd_lsm_shmem_alloc(void *core_handle, - struct cpe_lsm_session *session, - u32 size) -{ - struct cpe_cmd_shmem_alloc cmd_shmem_alloc; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_shmem_alloc, 0, sizeof(cmd_shmem_alloc)); - if (fill_lsm_cmd_header_v0_inband(&cmd_shmem_alloc.hdr, session->id, - SHMEM_ALLOC_CMD_PLD_SIZE, - CPE_LSM_SESSION_CMD_SHARED_MEM_ALLOC)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_shmem_alloc.size = size; - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_shmem_alloc); - if (ret) - dev_err(core->dev, - "%s: lsm_shmem_alloc cmd send fail, %d\n", - __func__, ret); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_cmd_lsm_shmem_dealloc: deallocate the shared memory - * for the specified session - * @core_handle: handle to cpe core - * @session: session for which memory needs to be deallocated. - */ -static int wcd_cpe_cmd_lsm_shmem_dealloc(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cpe_cmd_shmem_dealloc cmd_dealloc; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_dealloc, 0, sizeof(cmd_dealloc)); - if (fill_lsm_cmd_header_v0_inband(&cmd_dealloc.hdr, session->id, - SHMEM_DEALLOC_CMD_PLD_SIZE, - CPE_LSM_SESSION_CMD_SHARED_MEM_DEALLOC)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_dealloc.addr = session->lsm_mem_handle; - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_dealloc); - if (ret) { - dev_err(core->dev, - "%s: lsm_shmem_dealloc cmd failed, rc %d\n", - __func__, ret); - goto end_ret; - } - - memset(&session->lsm_mem_handle, 0, - sizeof(session->lsm_mem_handle)); - -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_send_lsm_cal: send the calibration for lsm service - * from acdb to the cpe - * @core: handle to cpe core - * @session: session for which the calibration needs to be set. - */ -static int wcd_cpe_send_lsm_cal( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session) -{ - - u8 *msg_pld; - struct cmi_hdr *hdr; - struct cal_block_data *lsm_cal = NULL; - void *inb_msg; - int rc = 0; - - if (core->cal_data[WCD_CPE_LSM_CAL_LSM] == NULL) { - pr_err("%s: LSM cal not allocated!\n", __func__); - return -EINVAL; - } - - mutex_lock(&core->cal_data[WCD_CPE_LSM_CAL_LSM]->lock); - lsm_cal = cal_utils_get_only_cal_block( - core->cal_data[WCD_CPE_LSM_CAL_LSM]); - if (!lsm_cal) { - pr_err("%s: failed to get lsm cal block\n", __func__); - rc = -EINVAL; - goto unlock_cal_mutex; - } - - if (lsm_cal->cal_data.size == 0) { - dev_dbg(core->dev, "%s: No LSM cal to send\n", - __func__); - rc = 0; - goto unlock_cal_mutex; - } - - inb_msg = kzalloc(sizeof(struct cmi_hdr) + lsm_cal->cal_data.size, - GFP_KERNEL); - if (!inb_msg) { - rc = -ENOMEM; - goto unlock_cal_mutex; - } - - hdr = (struct cmi_hdr *) inb_msg; - - rc = fill_lsm_cmd_header_v0_inband(hdr, session->id, - lsm_cal->cal_data.size, - CPE_LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: invalid params for header, err = %d\n", - __func__, rc); - goto free_msg; - } - - msg_pld = ((u8 *) inb_msg) + sizeof(struct cmi_hdr); - memcpy(msg_pld, lsm_cal->cal_data.kvaddr, - lsm_cal->cal_data.size); - - rc = wcd_cpe_cmi_send_lsm_msg(core, session, inb_msg); - if (rc) - pr_err("%s: acdb lsm_params send failed, err = %d\n", - __func__, rc); - -free_msg: - kfree(inb_msg); - -unlock_cal_mutex: - mutex_unlock(&core->cal_data[WCD_CPE_LSM_CAL_LSM]->lock); - return rc; - -} - -static void wcd_cpe_set_param_data(struct cpe_param_data *param_d, - struct cpe_lsm_ids *ids, u32 p_size, - u32 set_param_cmd) -{ - param_d->module_id = ids->module_id; - param_d->param_id = ids->param_id; - - switch (set_param_cmd) { - case CPE_LSM_SESSION_CMD_SET_PARAMS_V2: - param_d->p_size.param_size = p_size; - break; - case CPE_LSM_SESSION_CMD_SET_PARAMS: - default: - param_d->p_size.sr.param_size = - (u16) p_size; - param_d->p_size.sr.reserved = 0; - break; - } -} - -static int wcd_cpe_send_param_epd_thres(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids) -{ - struct snd_lsm_ep_det_thres *ep_det_data; - struct cpe_lsm_param_epd_thres epd_cmd; - struct cmi_hdr *msg_hdr = &epd_cmd.hdr; - struct cpe_param_data *param_d = - &epd_cmd.param; - int rc; - - memset(&epd_cmd, 0, sizeof(epd_cmd)); - ep_det_data = (struct snd_lsm_ep_det_thres *) data; - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_EPD_THRES_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_EPD_THRES_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - epd_cmd.minor_version = 1; - epd_cmd.epd_begin = ep_det_data->epd_begin; - epd_cmd.epd_end = ep_det_data->epd_end; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &epd_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(EPD Threshold) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_opmode(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids) -{ - struct snd_lsm_detect_mode *opmode_d; - struct cpe_lsm_param_opmode opmode_cmd; - struct cmi_hdr *msg_hdr = &opmode_cmd.hdr; - struct cpe_param_data *param_d = - &opmode_cmd.param; - int rc; - - memset(&opmode_cmd, 0, sizeof(opmode_cmd)); - opmode_d = (struct snd_lsm_detect_mode *) data; - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_OPMODE_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_OPMODE_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - opmode_cmd.minor_version = 1; - if (opmode_d->mode == LSM_MODE_KEYWORD_ONLY_DETECTION) - opmode_cmd.mode = 1; - else - opmode_cmd.mode = 3; - - if (opmode_d->detect_failure) - opmode_cmd.mode |= 0x04; - - opmode_cmd.reserved = 0; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &opmode_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(operation_mode) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_gain(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids) -{ - struct snd_lsm_gain *gain_d; - struct cpe_lsm_param_gain gain_cmd; - struct cmi_hdr *msg_hdr = &gain_cmd.hdr; - struct cpe_param_data *param_d = - &gain_cmd.param; - int rc; - - memset(&gain_cmd, 0, sizeof(gain_cmd)); - gain_d = (struct snd_lsm_gain *) data; - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_GAIN_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_GAIN_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - gain_cmd.minor_version = 1; - gain_cmd.gain = gain_d->gain; - gain_cmd.reserved = 0; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &gain_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(lsm_gain) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_connectport(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids, u16 port_id) -{ - struct cpe_lsm_param_connectport con_port_cmd; - struct cmi_hdr *msg_hdr = &con_port_cmd.hdr; - struct cpe_param_data *param_d = - &con_port_cmd.param; - int rc; - - memset(&con_port_cmd, 0, sizeof(con_port_cmd)); - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_CONNECTPORT_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_CONNECTPORT_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - con_port_cmd.minor_version = 1; - con_port_cmd.afe_port_id = port_id; - con_port_cmd.reserved = 0; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &con_port_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(connect_port) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_conf_levels( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - struct cpe_lsm_ids *ids) -{ - struct cpe_lsm_conf_level conf_level_data; - struct cmi_hdr *hdr = &(conf_level_data.hdr); - struct cpe_param_data *param_d = &(conf_level_data.param); - u8 pld_size = 0; - u8 pad_bytes = 0; - void *message; - int ret = 0; - - memset(&conf_level_data, 0, sizeof(conf_level_data)); - - pld_size = (sizeof(struct cpe_lsm_conf_level) - sizeof(struct cmi_hdr)); - pld_size += session->num_confidence_levels; - pad_bytes = ((4 - (pld_size % 4)) % 4); - pld_size += pad_bytes; - - fill_cmi_header(hdr, session->id, CMI_CPE_LSM_SERVICE_ID, - false, pld_size, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2, false); - - wcd_cpe_set_param_data(param_d, ids, - pld_size - sizeof(struct cpe_param_data), - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - conf_level_data.num_active_models = session->num_confidence_levels; - - message = kzalloc(sizeof(struct cpe_lsm_conf_level) + - conf_level_data.num_active_models + pad_bytes, - GFP_KERNEL); - if (!message) { - pr_err("%s: no memory for conf_level\n", __func__); - return -ENOMEM; - } - - memcpy(message, &conf_level_data, - sizeof(struct cpe_lsm_conf_level)); - memcpy(((u8 *) message) + sizeof(struct cpe_lsm_conf_level), - session->conf_levels, conf_level_data.num_active_models); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, message); - if (ret) - pr_err("%s: lsm_set_conf_levels failed, err = %d\n", - __func__, ret); - kfree(message); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -static int wcd_cpe_send_param_snd_model(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, struct cpe_lsm_ids *ids) -{ - int ret = 0; - struct cmi_obm_msg obm_msg; - struct cpe_param_data *param_d; - - memset(&obm_msg, 0, sizeof(obm_msg)); - - ret = fill_cmi_header(&obm_msg.hdr, session->id, - CMI_CPE_LSM_SERVICE_ID, 0, 20, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2, true); - if (ret) { - dev_err(core->dev, - "%s: Invalid parameters, rc = %d\n", - __func__, ret); - goto err_ret; - } - - obm_msg.pld.version = 0; - obm_msg.pld.size = session->snd_model_size; - obm_msg.pld.data_ptr.kvaddr = session->snd_model_data; - obm_msg.pld.mem_handle = session->lsm_mem_handle; - - param_d = (struct cpe_param_data *) session->snd_model_data; - wcd_cpe_set_param_data(param_d, ids, - (session->snd_model_size - sizeof(*param_d)), - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &obm_msg); - if (ret) - dev_err(core->dev, - "%s: snd_model_register failed, %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - -err_ret: - return ret; -} - -static int wcd_cpe_send_param_dereg_model( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - struct cpe_lsm_ids *ids) -{ - struct cmi_hdr *hdr; - struct cpe_param_data *param_d; - u8 *message; - u32 pld_size; - int rc = 0; - - pld_size = sizeof(*hdr) + sizeof(*param_d); - - message = kzalloc(pld_size, GFP_KERNEL); - if (!message) - return -ENOMEM; - - hdr = (struct cmi_hdr *) message; - param_d = (struct cpe_param_data *) - (((u8 *) message) + sizeof(*hdr)); - - if (fill_lsm_cmd_header_v0_inband(hdr, - session->id, - sizeof(*param_d), - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - wcd_cpe_set_param_data(param_d, ids, 0, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, message); - if (rc) - dev_err(core->dev, - "%s: snd_model_deregister failed, %d\n", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - kfree(message); - return rc; -} - -static int wcd_cpe_send_custom_param( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, u32 msg_size) -{ - u8 *msg; - struct cmi_hdr *hdr; - u8 *msg_pld; - int rc; - - if (msg_size > CMI_INBAND_MESSAGE_SIZE) { - dev_err(core->dev, - "%s: out of band custom params not supported\n", - __func__); - return -EINVAL; - } - - msg = kzalloc(sizeof(*hdr) + msg_size, GFP_KERNEL); - if (!msg) - return -ENOMEM; - - hdr = (struct cmi_hdr *) msg; - msg_pld = msg + sizeof(struct cmi_hdr); - - if (fill_lsm_cmd_header_v0_inband(hdr, - session->id, - msg_size, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - memcpy(msg_pld, data, msg_size); - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, msg); - if (rc) - dev_err(core->dev, - "%s: custom params send failed, err = %d\n", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - kfree(msg); - return rc; -} - -static int wcd_cpe_set_one_param(void *core_handle, - struct cpe_lsm_session *session, struct lsm_params_info *p_info, - void *data, uint32_t param_type) -{ - struct wcd_cpe_core *core = core_handle; - int rc = 0; - struct cpe_lsm_ids ids; - - memset(&ids, 0, sizeof(ids)); - ids.module_id = p_info->module_id; - ids.param_id = p_info->param_id; - - switch (param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: - rc = wcd_cpe_send_param_epd_thres(core, session, - data, &ids); - break; - case LSM_OPERATION_MODE: - rc = wcd_cpe_send_param_opmode(core, session, data, &ids); - break; - case LSM_GAIN: - rc = wcd_cpe_send_param_gain(core, session, data, &ids); - break; - case LSM_MIN_CONFIDENCE_LEVELS: - rc = wcd_cpe_send_param_conf_levels(core, session, &ids); - break; - case LSM_REG_SND_MODEL: - rc = wcd_cpe_send_param_snd_model(core, session, &ids); - break; - case LSM_DEREG_SND_MODEL: - rc = wcd_cpe_send_param_dereg_model(core, session, &ids); - break; - case LSM_CUSTOM_PARAMS: - rc = wcd_cpe_send_custom_param(core, session, - data, p_info->param_size); - break; - default: - pr_err("%s: wrong param_type 0x%x\n", - __func__, param_type); - } - - if (rc) - dev_err(core->dev, - "%s: send_param(%d) failed, err %d\n", - __func__, param_type, rc); - return rc; -} - -/* - * wcd_cpe_lsm_set_params: set the parameters for lsm service - * @core: handle to cpe core - * @session: session for which the parameters are to be set - * @detect_mode: mode for detection - * @detect_failure: flag indicating failure detection enabled/disabled - * - */ -static int wcd_cpe_lsm_set_params(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, bool detect_failure) -{ - struct cpe_lsm_ids ids; - struct snd_lsm_detect_mode det_mode; - - int ret = 0; - - /* Send lsm calibration */ - ret = wcd_cpe_send_lsm_cal(core, session); - if (ret) { - pr_err("%s: fail to sent acdb cal, err = %d", - __func__, ret); - goto err_ret; - } - - /* Send operation mode */ - ids.module_id = CPE_LSM_MODULE_ID_VOICE_WAKEUP; - ids.param_id = CPE_LSM_PARAM_ID_OPERATION_MODE; - det_mode.mode = detect_mode; - det_mode.detect_failure = detect_failure; - ret = wcd_cpe_send_param_opmode(core, session, - &det_mode, &ids); - if (ret) - dev_err(core->dev, - "%s: Failed to set opmode, err=%d\n", - __func__, ret); - -err_ret: - return ret; -} - -static int wcd_cpe_lsm_set_data(void *core_handle, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, - bool detect_failure) -{ - struct wcd_cpe_core *core = core_handle; - struct cpe_lsm_ids ids; - int ret = 0; - - if (session->num_confidence_levels > 0) { - ret = wcd_cpe_lsm_set_params(core, session, detect_mode, - detect_failure); - if (ret) { - dev_err(core->dev, - "%s: lsm set params failed, rc = %d\n", - __func__, ret); - goto err_ret; - } - - ids.module_id = CPE_LSM_MODULE_ID_VOICE_WAKEUP; - ids.param_id = CPE_LSM_PARAM_ID_MIN_CONFIDENCE_LEVELS; - ret = wcd_cpe_send_param_conf_levels(core, session, &ids); - if (ret) { - dev_err(core->dev, - "%s: lsm confidence levels failed, rc = %d\n", - __func__, ret); - goto err_ret; - } - } else { - dev_dbg(core->dev, - "%s: no conf levels to set\n", - __func__); - } - -err_ret: - return ret; -} - -/* - * wcd_cpe_lsm_reg_snd_model: register the sound model for listen - * @session: session for which to register the sound model - * @detect_mode: detection mode, user dependent/independent - * @detect_failure: flag to indicate if failure detection is enabled - * - * The memory required for sound model should be pre-allocated on CPE - * before this function is invoked. - */ -static int wcd_cpe_lsm_reg_snd_model(void *core_handle, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, - bool detect_failure) -{ - int ret = 0; - struct cmi_obm_msg obm_msg; - struct wcd_cpe_core *core = core_handle; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - ret = wcd_cpe_lsm_set_data(core_handle, session, - detect_mode, detect_failure); - if (ret) { - dev_err(core->dev, - "%s: fail to set lsm data, err = %d\n", - __func__, ret); - return ret; - } - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - ret = fill_cmi_header(&obm_msg.hdr, session->id, - CMI_CPE_LSM_SERVICE_ID, 0, 20, - CPE_LSM_SESSION_CMD_REGISTER_SOUND_MODEL, true); - if (ret) { - dev_err(core->dev, - "%s: Invalid parameters, rc = %d\n", - __func__, ret); - goto err_ret; - } - - obm_msg.pld.version = 0; - obm_msg.pld.size = session->snd_model_size; - obm_msg.pld.data_ptr.kvaddr = session->snd_model_data; - obm_msg.pld.mem_handle = session->lsm_mem_handle; - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &obm_msg); - if (ret) - dev_err(core->dev, - "%s: snd_model_register failed, %d\n", - __func__, ret); -err_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_lsm_dereg_snd_model: deregister the sound model for listen - * @core_handle: handle to cpe core - * @session: session for which to deregister the sound model - * - */ -static int wcd_cpe_lsm_dereg_snd_model(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_dereg_snd_model; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_dereg_snd_model, 0, sizeof(cmd_dereg_snd_model)); - if (fill_lsm_cmd_header_v0_inband(&cmd_dereg_snd_model, session->id, - 0, CPE_LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_dereg_snd_model); - if (ret) - dev_err(core->dev, - "%s: failed to send dereg_snd_model cmd\n", - __func__); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_lsm_get_afe_out_port_id: get afe output port id - * @core_handle: handle to the CPE core - * @session: session for which port id needs to get - */ -static int wcd_cpe_lsm_get_afe_out_port_id(void *core_handle, - struct cpe_lsm_session *session) -{ - struct wcd_cpe_core *core = core_handle; - struct snd_soc_codec *codec; - int rc = 0; - - if (!core || !core->codec) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!core) ? "core" : "codec"); - rc = -EINVAL; - goto done; - } - - if (!session) { - dev_err(core->dev, "%s: Invalid session\n", - __func__); - rc = -EINVAL; - goto done; - } - - if (!core->cpe_cdc_cb || - !core->cpe_cdc_cb->get_afe_out_port_id) { - session->afe_out_port_id = WCD_CPE_AFE_OUT_PORT_2; - dev_dbg(core->dev, - "%s: callback not defined, default port_id = %d\n", - __func__, session->afe_out_port_id); - goto done; - } - - codec = core->codec; - rc = core->cpe_cdc_cb->get_afe_out_port_id(codec, - &session->afe_out_port_id); - if (rc) { - dev_err(core->dev, - "%s: failed to get port id, err = %d\n", - __func__, rc); - goto done; - } - dev_dbg(core->dev, "%s: port_id: %d\n", __func__, - session->afe_out_port_id); - -done: - return rc; -} - -/* - * wcd_cpe_cmd_lsm_start: send the start command to lsm - * @core_handle: handle to the CPE core - * @session: session for which start command to be sent - * - */ -static int wcd_cpe_cmd_lsm_start(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_lsm_start; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_lsm_start, 0, sizeof(struct cmi_hdr)); - if (fill_lsm_cmd_header_v0_inband(&cmd_lsm_start, session->id, 0, - CPE_LSM_SESSION_CMD_START)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_lsm_start); - if (ret) - dev_err(core->dev, "failed to send lsm_start cmd\n"); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_cmd_lsm_stop: send the stop command for LSM service - * @core_handle: handle to the cpe core - * @session: session for which stop command to be sent - * - */ -static int wcd_cpe_cmd_lsm_stop(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_lsm_stop; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_lsm_stop, 0, sizeof(struct cmi_hdr)); - if (fill_lsm_cmd_header_v0_inband(&cmd_lsm_stop, session->id, 0, - CPE_LSM_SESSION_CMD_STOP)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_lsm_stop); - if (ret) - dev_err(core->dev, - "%s: failed to send lsm_stop cmd\n", - __func__); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; - -} - -/* - * wcd_cpe_alloc_lsm_session: allocate a lsm session - * @core: handle to wcd_cpe_core - * @lsm_priv_d: lsm private data - */ -static struct cpe_lsm_session *wcd_cpe_alloc_lsm_session( - void *core_handle, void *client_data, - void (*event_cb)(void *, u8, u8, u8 *)) -{ - struct cpe_lsm_session *session; - int i, session_id = -1; - struct wcd_cpe_core *core = core_handle; - bool afe_register_service = false; - int ret = 0; - - /* - * Even if multiple listen sessions can be - * allocated, the AFE service registration - * should be done only once as CPE can only - * have one instance of AFE service. - * - * If this is the first session to be allocated, - * only then register the afe service. - */ - WCD_CPE_GRAB_LOCK(&core->session_lock, "session_lock"); - if (!wcd_cpe_lsm_session_active()) - afe_register_service = true; - - for (i = 1; i <= WCD_CPE_LSM_MAX_SESSIONS; i++) { - if (!lsm_sessions[i]) { - session_id = i; - break; - } - } - - if (session_id < 0) { - dev_err(core->dev, - "%s: max allowed sessions already allocated\n", - __func__); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return NULL; - } - - ret = wcd_cpe_vote(core, true); - if (ret) { - dev_err(core->dev, - "%s: Failed to enable cpe, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return NULL; - } - - session = kzalloc(sizeof(struct cpe_lsm_session), GFP_KERNEL); - if (!session) - goto err_session_alloc; - - session->id = session_id; - session->event_cb = event_cb; - session->cmi_reg_handle = cmi_register(wcd_cpe_cmi_lsm_callback, - CMI_CPE_LSM_SERVICE_ID); - if (!session->cmi_reg_handle) { - dev_err(core->dev, - "%s: Failed to register LSM service with CMI\n", - __func__); - goto err_ret; - } - session->priv_d = client_data; - mutex_init(&session->lsm_lock); - if (afe_register_service) { - /* Register for AFE Service */ - core->cmi_afe_handle = cmi_register(wcd_cpe_cmi_afe_cb, - CMI_CPE_AFE_SERVICE_ID); - wcd_cpe_initialize_afe_port_data(); - if (!core->cmi_afe_handle) { - dev_err(core->dev, - "%s: Failed to register AFE service with CMI\n", - __func__); - goto err_afe_svc_reg; - } - - /* Once AFE service is registered, send the mode command */ - ret = wcd_cpe_afe_svc_cmd_mode(core, - AFE_SVC_EXPLICIT_PORT_START); - if (ret) - goto err_afe_mode_cmd; - } - - session->lsm_mem_handle = 0; - init_completion(&session->cmd_comp); - - lsm_sessions[session_id] = session; - - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return session; - -err_afe_mode_cmd: - cmi_deregister(core->cmi_afe_handle); - -err_afe_svc_reg: - cmi_deregister(session->cmi_reg_handle); - mutex_destroy(&session->lsm_lock); - -err_ret: - kfree(session); - -err_session_alloc: - wcd_cpe_vote(core, false); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return NULL; -} - -/* - * wcd_cpe_lsm_config_lab_latency: send lab latency value - * @core: handle to wcd_cpe_core - * @session: lsm session - * @latency: the value of latency for lab setup in msec - */ -static int wcd_cpe_lsm_config_lab_latency( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - u32 latency) -{ - int ret = 0, pld_size = CPE_PARAM_LSM_LAB_LATENCY_SIZE; - struct cpe_lsm_lab_latency_config cpe_lab_latency; - struct cpe_lsm_lab_config *lab_lat = &cpe_lab_latency.latency_cfg; - struct cpe_param_data *param_d = &lab_lat->param; - struct cpe_lsm_ids ids; - - if (fill_lsm_cmd_header_v0_inband(&cpe_lab_latency.hdr, session->id, - (u8) pld_size, CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - pr_err("%s: Failed to create header\n", __func__); - return -EINVAL; - } - if (latency == 0x00 || latency > WCD_CPE_LAB_MAX_LATENCY) { - pr_err("%s: Invalid latency %u\n", - __func__, latency); - return -EINVAL; - } - - lab_lat->latency = latency; - lab_lat->minor_ver = 1; - ids.module_id = CPE_LSM_MODULE_ID_LAB; - ids.param_id = CPE_LSM_PARAM_ID_LAB_CONFIG; - wcd_cpe_set_param_data(param_d, &ids, - PARAM_SIZE_LSM_LATENCY_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - pr_debug("%s: Module 0x%x Param 0x%x size %zu pld_size 0x%x\n", - __func__, lab_lat->param.module_id, - lab_lat->param.param_id, PARAM_SIZE_LSM_LATENCY_SIZE, - pld_size); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cpe_lab_latency); - if (ret != 0) - pr_err("%s: lsm_set_params failed, error = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_lsm_lab_control: enable/disable lab - * @core: handle to wcd_cpe_core - * @session: lsm session - * @enable: Indicates whether to enable / disable lab - */ -static int wcd_cpe_lsm_lab_control( - void *core_handle, - struct cpe_lsm_session *session, - bool enable) -{ - struct wcd_cpe_core *core = core_handle; - int ret = 0, pld_size = CPE_PARAM_SIZE_LSM_LAB_CONTROL; - struct cpe_lsm_control_lab cpe_lab_enable; - struct cpe_lsm_lab_enable *lab_enable = &cpe_lab_enable.lab_enable; - struct cpe_param_data *param_d = &lab_enable->param; - struct cpe_lsm_ids ids; - - pr_debug("%s: enter payload_size = %d Enable %d\n", - __func__, pld_size, enable); - - memset(&cpe_lab_enable, 0, sizeof(cpe_lab_enable)); - - if (fill_lsm_cmd_header_v0_inband(&cpe_lab_enable.hdr, session->id, - (u8) pld_size, CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - return -EINVAL; - } - if (enable == true) - lab_enable->enable = 1; - else - lab_enable->enable = 0; - - ids.module_id = CPE_LSM_MODULE_ID_LAB; - ids.param_id = CPE_LSM_PARAM_ID_LAB_ENABLE; - wcd_cpe_set_param_data(param_d, &ids, - PARAM_SIZE_LSM_CONTROL_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - pr_debug("%s: Module 0x%x, Param 0x%x size %zu pld_size 0x%x\n", - __func__, lab_enable->param.module_id, - lab_enable->param.param_id, PARAM_SIZE_LSM_CONTROL_SIZE, - pld_size); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cpe_lab_enable); - if (ret != 0) { - pr_err("%s: lsm_set_params failed, error = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - goto done; - } - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - - if (lab_enable->enable) - ret = wcd_cpe_lsm_config_lab_latency(core, session, - WCD_CPE_LAB_MAX_LATENCY); -done: - return ret; -} - -/* - * wcd_cpe_lsm_eob: stop lab - * @core: handle to wcd_cpe_core - * @session: lsm session to be deallocated - */ -static int wcd_cpe_lsm_eob( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session) -{ - int ret = 0; - struct cmi_hdr lab_eob; - - if (fill_lsm_cmd_header_v0_inband(&lab_eob, session->id, - 0, CPE_LSM_SESSION_CMD_EOB)) { - return -EINVAL; - } - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &lab_eob); - if (ret != 0) - pr_err("%s: lsm_set_params failed\n", __func__); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - - return ret; -} - -/* - * wcd_cpe_dealloc_lsm_session: deallocate lsm session - * @core: handle to wcd_cpe_core - * @session: lsm session to be deallocated - */ -static int wcd_cpe_dealloc_lsm_session(void *core_handle, - struct cpe_lsm_session *session) -{ - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - WCD_CPE_GRAB_LOCK(&core->session_lock, "session_lock"); - if (!session) { - dev_err(core->dev, - "%s: Invalid lsm session\n", __func__); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return -EINVAL; - } - - dev_dbg(core->dev, "%s: session %d being deallocated\n", - __func__, session->id); - if (session->id > WCD_CPE_LSM_MAX_SESSIONS) { - dev_err(core->dev, - "%s: Wrong session id %d max allowed = %d\n", - __func__, session->id, - WCD_CPE_LSM_MAX_SESSIONS); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return -EINVAL; - } - - cmi_deregister(session->cmi_reg_handle); - mutex_destroy(&session->lsm_lock); - lsm_sessions[session->id] = NULL; - kfree(session); - - if (!wcd_cpe_lsm_session_active()) { - cmi_deregister(core->cmi_afe_handle); - core->cmi_afe_handle = NULL; - wcd_cpe_deinitialize_afe_port_data(); - } - - ret = wcd_cpe_vote(core, false); - if (ret) - dev_dbg(core->dev, - "%s: Failed to un-vote cpe, err = %d\n", - __func__, ret); - - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return ret; -} - -static int wcd_cpe_lab_ch_setup(void *core_handle, - struct cpe_lsm_session *session, - enum wcd_cpe_event event) -{ - struct wcd_cpe_core *core = core_handle; - struct snd_soc_codec *codec; - int rc = 0; - u8 cpe_intr_bits; - - if (!core || !core->codec) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!core) ? "core" : "codec"); - rc = EINVAL; - goto done; - } - - if (!core->cpe_cdc_cb || - !core->cpe_cdc_cb->cdc_ext_clk || - !core->cpe_cdc_cb->lab_cdc_ch_ctl) { - dev_err(core->dev, - "%s: Invalid codec callbacks\n", - __func__); - rc = -EINVAL; - goto done; - } - - codec = core->codec; - dev_dbg(core->dev, - "%s: event = 0x%x\n", - __func__, event); - - switch (event) { - case WCD_CPE_PRE_ENABLE: - rc = core->cpe_cdc_cb->cdc_ext_clk(codec, true, false); - if (rc) { - dev_err(core->dev, - "%s: failed to enable cdc clk, err = %d\n", - __func__, rc); - goto done; - } - - rc = core->cpe_cdc_cb->lab_cdc_ch_ctl(codec, - true); - if (rc) { - dev_err(core->dev, - "%s: failed to enable cdc port, err = %d\n", - __func__, rc); - rc = core->cpe_cdc_cb->cdc_ext_clk(codec, false, false); - goto done; - } - - break; - - case WCD_CPE_POST_ENABLE: - rc = cpe_svc_toggle_lab(core->cpe_handle, true); - if (rc) - dev_err(core->dev, - "%s: Failed to enable lab\n", __func__); - break; - - case WCD_CPE_PRE_DISABLE: - /* - * Mask the non-fatal interrupts in CPE as they will - * be generated during lab teardown and may flood. - */ - cpe_intr_bits = ~(core->irq_info.cpe_fatal_irqs & 0xFF); - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_MASK, - &cpe_intr_bits); - - rc = core->cpe_cdc_cb->lab_cdc_ch_ctl(codec, - false); - if (rc) - dev_err(core->dev, - "%s: failed to disable cdc port, err = %d\n", - __func__, rc); - break; - - case WCD_CPE_POST_DISABLE: - rc = wcd_cpe_lsm_eob(core, session); - if (rc) - dev_err(core->dev, - "%s: eob send failed, err = %d\n", - __func__, rc); - - /* Continue teardown even if eob failed */ - rc = cpe_svc_toggle_lab(core->cpe_handle, false); - if (rc) - dev_err(core->dev, - "%s: Failed to disable lab\n", __func__); - - /* Continue with disabling even if toggle lab fails */ - rc = core->cpe_cdc_cb->cdc_ext_clk(codec, false, false); - if (rc) - dev_err(core->dev, - "%s: failed to disable cdc clk, err = %d\n", - __func__, rc); - - /* Unmask non-fatal CPE interrupts */ - cpe_intr_bits = ~(core->irq_info.cpe_fatal_irqs & 0xFF); - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_UNMASK, - &cpe_intr_bits); - break; - - default: - dev_err(core->dev, - "%s: Invalid event 0x%x\n", - __func__, event); - rc = -EINVAL; - break; - } - -done: - return rc; -} - -static int wcd_cpe_lsm_set_fmt_cfg(void *core_handle, - struct cpe_lsm_session *session) -{ - int ret; - struct cpe_lsm_output_format_cfg out_fmt_cfg; - struct wcd_cpe_core *core = core_handle; - - ret = wcd_cpe_is_valid_lsm_session(core, session, __func__); - if (ret) - goto done; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&out_fmt_cfg, 0, sizeof(out_fmt_cfg)); - if (fill_lsm_cmd_header_v0_inband(&out_fmt_cfg.hdr, - session->id, OUT_FMT_CFG_CMD_PAYLOAD_SIZE, - CPE_LSM_SESSION_CMD_TX_BUFF_OUTPUT_CONFIG)) { - ret = -EINVAL; - goto err_ret; - } - - out_fmt_cfg.format = session->out_fmt_cfg.format; - out_fmt_cfg.packing = session->out_fmt_cfg.pack_mode; - out_fmt_cfg.data_path_events = session->out_fmt_cfg.data_path_events; - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &out_fmt_cfg); - if (ret) - dev_err(core->dev, - "%s: lsm_set_output_format_cfg failed, err = %d\n", - __func__, ret); - -err_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -done: - return ret; -} - -static void wcd_cpe_snd_model_offset(void *core_handle, - struct cpe_lsm_session *session, size_t *offset) -{ - *offset = sizeof(struct cpe_param_data); -} - -static int wcd_cpe_lsm_set_media_fmt_params(void *core_handle, - struct cpe_lsm_session *session, - struct lsm_hw_params *param) -{ - struct cpe_lsm_media_fmt_param media_fmt; - struct cmi_hdr *msg_hdr = &media_fmt.hdr; - struct wcd_cpe_core *core = core_handle; - struct cpe_param_data *param_d = &media_fmt.param; - struct cpe_lsm_ids ids; - int ret; - - memset(&media_fmt, 0, sizeof(media_fmt)); - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_MEDIA_FMT_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - ret = -EINVAL; - goto done; - } - - memset(&ids, 0, sizeof(ids)); - ids.module_id = CPE_LSM_MODULE_FRAMEWORK; - ids.param_id = CPE_LSM_PARAM_ID_MEDIA_FMT; - - wcd_cpe_set_param_data(param_d, &ids, CPE_MEDIA_FMT_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - media_fmt.minor_version = 1; - media_fmt.sample_rate = param->sample_rate; - media_fmt.num_channels = param->num_chs; - media_fmt.bit_width = param->bit_width; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &media_fmt); - if (ret) - dev_err(core->dev, - "%s: Set_param(media_format) failed, err=%d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -done: - return ret; -} - -static int wcd_cpe_lsm_set_port(void *core_handle, - struct cpe_lsm_session *session, void *data) -{ - u32 port_id; - int ret; - struct cpe_lsm_ids ids; - struct wcd_cpe_core *core = core_handle; - - ret = wcd_cpe_is_valid_lsm_session(core, session, __func__); - if (ret) - goto done; - - if (!data) { - dev_err(core->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - port_id = *(u32 *)data; - dev_dbg(core->dev, "%s: port_id: %d\n", __func__, port_id); - - memset(&ids, 0, sizeof(ids)); - ids.module_id = LSM_MODULE_ID_FRAMEWORK; - ids.param_id = LSM_PARAM_ID_CONNECT_TO_PORT; - - ret = wcd_cpe_send_param_connectport(core, session, NULL, - &ids, port_id); - if (ret) - dev_err(core->dev, - "%s: send_param_connectport failed, err %d\n", - __func__, ret); -done: - return ret; -} - -/* - * wcd_cpe_get_lsm_ops: register lsm driver to codec - * @lsm_ops: structure with lsm callbacks - * @codec: codec to which this lsm driver is registered to - */ -int wcd_cpe_get_lsm_ops(struct wcd_cpe_lsm_ops *lsm_ops) -{ - lsm_ops->lsm_alloc_session = wcd_cpe_alloc_lsm_session; - lsm_ops->lsm_dealloc_session = wcd_cpe_dealloc_lsm_session; - lsm_ops->lsm_open_tx = wcd_cpe_cmd_lsm_open_tx; - lsm_ops->lsm_close_tx = wcd_cpe_cmd_lsm_close_tx; - lsm_ops->lsm_shmem_alloc = wcd_cpe_cmd_lsm_shmem_alloc; - lsm_ops->lsm_shmem_dealloc = wcd_cpe_cmd_lsm_shmem_dealloc; - lsm_ops->lsm_register_snd_model = wcd_cpe_lsm_reg_snd_model; - lsm_ops->lsm_deregister_snd_model = wcd_cpe_lsm_dereg_snd_model; - lsm_ops->lsm_get_afe_out_port_id = wcd_cpe_lsm_get_afe_out_port_id; - lsm_ops->lsm_start = wcd_cpe_cmd_lsm_start; - lsm_ops->lsm_stop = wcd_cpe_cmd_lsm_stop; - lsm_ops->lsm_lab_control = wcd_cpe_lsm_lab_control; - lsm_ops->lab_ch_setup = wcd_cpe_lab_ch_setup; - lsm_ops->lsm_set_data = wcd_cpe_lsm_set_data; - lsm_ops->lsm_set_fmt_cfg = wcd_cpe_lsm_set_fmt_cfg; - lsm_ops->lsm_set_one_param = wcd_cpe_set_one_param; - lsm_ops->lsm_get_snd_model_offset = wcd_cpe_snd_model_offset; - lsm_ops->lsm_set_media_fmt_params = wcd_cpe_lsm_set_media_fmt_params; - lsm_ops->lsm_set_port = wcd_cpe_lsm_set_port; - - return 0; -} -EXPORT_SYMBOL(wcd_cpe_get_lsm_ops); - -static int fill_afe_cmd_header(struct cmi_hdr *hdr, u8 port_id, - u16 opcode, u8 pld_size, - bool obm_flag) -{ - CMI_HDR_SET_SESSION(hdr, port_id); - CMI_HDR_SET_SERVICE(hdr, CMI_CPE_AFE_SERVICE_ID); - - CMI_HDR_SET_PAYLOAD_SIZE(hdr, pld_size); - - hdr->opcode = opcode; - - if (obm_flag) - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_OUT_BAND); - else - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_IN_BAND); - - return 0; -} - -/* - * wcd_cpe_cmi_send_afe_msg: send message to AFE service - * @core: wcd cpe core handle - * @port_cfg: configuration data for the afe port - * for which this message is to be sent - * @message: actual message with header and payload - * - * Port specific lock needs to be acquired before this - * function can be invoked - */ -static int wcd_cpe_cmi_send_afe_msg( - struct wcd_cpe_core *core, - struct wcd_cmi_afe_port_data *port_d, - void *message) -{ - int ret = 0; - struct cmi_hdr *hdr = message; - - pr_debug("%s: sending message with opcode 0x%x\n", - __func__, hdr->opcode); - - if (unlikely(!wcd_cpe_is_online_state(core))) { - dev_err(core->dev, "%s: CPE offline\n", __func__); - return 0; - } - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, true); - - ret = cmi_send_msg(message); - if (ret) { - pr_err("%s: cmd 0x%x send failed, err = %d\n", - __func__, hdr->opcode, ret); - goto rel_bus_vote; - } - - ret = wait_for_completion_timeout(&port_d->afe_cmd_complete, - CMI_CMD_TIMEOUT); - if (ret > 0) { - pr_debug("%s: command 0x%x, received response 0x%x\n", - __func__, hdr->opcode, port_d->cmd_result); - if (port_d->cmd_result == CMI_SHMEM_ALLOC_FAILED) - port_d->cmd_result = CPE_ENOMEMORY; - if (port_d->cmd_result > 0) - pr_err("%s: CPE returned error[%s]\n", - __func__, cpe_err_get_err_str( - port_d->cmd_result)); - ret = cpe_err_get_lnx_err_code(port_d->cmd_result); - goto rel_bus_vote; - } else { - pr_err("%s: command 0x%x send timed out\n", - __func__, hdr->opcode); - ret = -ETIMEDOUT; - goto rel_bus_vote; - } - -rel_bus_vote: - reinit_completion(&port_d->afe_cmd_complete); - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, false); - - return ret; -} - - - -/* - * wcd_cpe_afe_shmem_alloc: allocate the cpe memory for afe service - * @core: handle to cpe core - * @port_cfg: configuration data for the port which needs - * memory to be allocated on CPE - * @size: size of the memory to be allocated - */ -static int wcd_cpe_afe_shmem_alloc( - struct wcd_cpe_core *core, - struct wcd_cmi_afe_port_data *port_d, - u32 size) -{ - struct cpe_cmd_shmem_alloc cmd_shmem_alloc; - int ret = 0; - - pr_debug("%s: enter: size = %d\n", __func__, size); - - memset(&cmd_shmem_alloc, 0, sizeof(cmd_shmem_alloc)); - if (fill_afe_cmd_header(&cmd_shmem_alloc.hdr, port_d->port_id, - CPE_AFE_PORT_CMD_SHARED_MEM_ALLOC, - SHMEM_ALLOC_CMD_PLD_SIZE, false)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_shmem_alloc.size = size; - - ret = wcd_cpe_cmi_send_afe_msg(core, port_d, &cmd_shmem_alloc); - if (ret) { - pr_err("%s: afe_shmem_alloc fail,ret = %d\n", - __func__, ret); - goto end_ret; - } - - pr_debug("%s: completed %s, mem_handle = 0x%x\n", - __func__, "CPE_AFE_CMD_SHARED_MEM_ALLOC", - port_d->mem_handle); - -end_ret: - return ret; -} - -/* - * wcd_cpe_afe_shmem_dealloc: deallocate the cpe memory for - * afe service - * @core: handle to cpe core - * @port_d: configuration data for the port which needs - * memory to be deallocated on CPE - * The memory handle to be de-allocated is saved in the - * port configuration data - */ -static int wcd_cpe_afe_shmem_dealloc( - struct wcd_cpe_core *core, - struct wcd_cmi_afe_port_data *port_d) -{ - struct cpe_cmd_shmem_dealloc cmd_dealloc; - int ret = 0; - - pr_debug("%s: enter, port_id = %d\n", - __func__, port_d->port_id); - - memset(&cmd_dealloc, 0, sizeof(cmd_dealloc)); - if (fill_afe_cmd_header(&cmd_dealloc.hdr, port_d->port_id, - CPE_AFE_PORT_CMD_SHARED_MEM_DEALLOC, - SHMEM_DEALLOC_CMD_PLD_SIZE, false)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_dealloc.addr = port_d->mem_handle; - ret = wcd_cpe_cmi_send_afe_msg(core, port_d, &cmd_dealloc); - if (ret) { - pr_err("failed to send shmem_dealloc cmd\n"); - goto end_ret; - } - memset(&port_d->mem_handle, 0, - sizeof(port_d->mem_handle)); - -end_ret: - return ret; -} - -/* - * wcd_cpe_send_afe_cal: send the acdb calibration to AFE port - * @core: handle to cpe core - * @port_d: configuration data for the port for which the - * calibration needs to be appplied - */ -static int wcd_cpe_send_afe_cal(void *core_handle, - struct wcd_cmi_afe_port_data *port_d) -{ - - struct cal_block_data *afe_cal = NULL; - struct wcd_cpe_core *core = core_handle; - struct cmi_obm_msg obm_msg; - void *inb_msg = NULL; - void *msg; - int rc = 0; - bool is_obm_msg; - - if (core->cal_data[WCD_CPE_LSM_CAL_AFE] == NULL) { - pr_err("%s: LSM cal not allocated!\n", - __func__); - rc = -EINVAL; - goto rel_cal_mutex; - } - - mutex_lock(&core->cal_data[WCD_CPE_LSM_CAL_AFE]->lock); - afe_cal = cal_utils_get_only_cal_block( - core->cal_data[WCD_CPE_LSM_CAL_AFE]); - if (!afe_cal) { - pr_err("%s: failed to get afe cal block\n", - __func__); - rc = -EINVAL; - goto rel_cal_mutex; - } - - if (afe_cal->cal_data.size == 0) { - dev_dbg(core->dev, "%s: No AFE cal to send\n", - __func__); - rc = 0; - goto rel_cal_mutex; - } - - is_obm_msg = (afe_cal->cal_data.size > - CMI_INBAND_MESSAGE_SIZE) ? true : false; - - if (is_obm_msg) { - struct cmi_hdr *hdr = &(obm_msg.hdr); - struct cmi_obm *pld = &(obm_msg.pld); - - rc = wcd_cpe_afe_shmem_alloc(core, port_d, - afe_cal->cal_data.size); - if (rc) { - dev_err(core->dev, - "%s: AFE shmem alloc fail %d\n", - __func__, rc); - goto rel_cal_mutex; - } - - rc = fill_afe_cmd_header(hdr, port_d->port_id, - CPE_AFE_CMD_SET_PARAM, - CPE_AFE_PARAM_PAYLOAD_SIZE, - true); - if (rc) { - dev_err(core->dev, - "%s: invalid params for header, err = %d\n", - __func__, rc); - wcd_cpe_afe_shmem_dealloc(core, port_d); - goto rel_cal_mutex; - } - - pld->version = 0; - pld->size = afe_cal->cal_data.size; - pld->data_ptr.kvaddr = afe_cal->cal_data.kvaddr; - pld->mem_handle = port_d->mem_handle; - msg = &obm_msg; - - } else { - u8 *msg_pld; - struct cmi_hdr *hdr; - - inb_msg = kzalloc(sizeof(struct cmi_hdr) + - afe_cal->cal_data.size, - GFP_KERNEL); - if (!inb_msg) { - dev_err(core->dev, - "%s: no memory for afe cal inband\n", - __func__); - rc = -ENOMEM; - goto rel_cal_mutex; - } - - hdr = (struct cmi_hdr *) inb_msg; - - rc = fill_afe_cmd_header(hdr, port_d->port_id, - CPE_AFE_CMD_SET_PARAM, - CPE_AFE_PARAM_PAYLOAD_SIZE, - false); - if (rc) { - dev_err(core->dev, - "%s: invalid params for header, err = %d\n", - __func__, rc); - kfree(inb_msg); - inb_msg = NULL; - goto rel_cal_mutex; - } - - msg_pld = ((u8 *) inb_msg) + sizeof(struct cmi_hdr); - memcpy(msg_pld, afe_cal->cal_data.kvaddr, - afe_cal->cal_data.size); - - msg = inb_msg; - } - - rc = wcd_cpe_cmi_send_afe_msg(core, port_d, msg); - if (rc) - pr_err("%s: afe cal for listen failed, rc = %d\n", - __func__, rc); - - if (is_obm_msg) { - wcd_cpe_afe_shmem_dealloc(core, port_d); - port_d->mem_handle = 0; - } else { - kfree(inb_msg); - inb_msg = NULL; - } - -rel_cal_mutex: - mutex_unlock(&core->cal_data[WCD_CPE_LSM_CAL_AFE]->lock); - return rc; -} - -/* - * wcd_cpe_is_valid_port: check validity of afe port id - * @core: handle to core to check for validity - * @afe_cfg: client provided afe configuration - * @func: function name invoking this validity check, - * used for logging purpose only. - */ -static int wcd_cpe_is_valid_port(struct wcd_cpe_core *core, - struct wcd_cpe_afe_port_cfg *afe_cfg, - const char *func) -{ - if (unlikely(IS_ERR_OR_NULL(core))) { - pr_err("%s: Invalid core handle\n", func); - return -EINVAL; - } - - if (afe_cfg->port_id > WCD_CPE_AFE_MAX_PORTS) { - dev_err(core->dev, - "%s: invalid afe port (%u)\n", - func, afe_cfg->port_id); - return -EINVAL; - } - - dev_dbg(core->dev, - "%s: port_id = %u\n", - func, afe_cfg->port_id); - - return 0; -} - -static int wcd_cpe_afe_svc_cmd_mode(void *core_handle, - u8 mode) -{ - struct cpe_afe_svc_cmd_mode afe_mode; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret; - - afe_port_d = &afe_ports[0]; - /* - * AFE SVC mode command is for the service and not port - * specific, hence use AFE port as 0 so the command will - * be applied to all AFE ports on CPE. - */ - afe_port_d->port_id = 0; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - memset(&afe_mode, 0, sizeof(afe_mode)); - if (fill_afe_cmd_header(&afe_mode.hdr, afe_port_d->port_id, - CPE_AFE_SVC_CMD_LAB_MODE, - CPE_AFE_CMD_MODE_PAYLOAD_SIZE, - false)) { - ret = -EINVAL; - goto err_ret; - } - - afe_mode.mode = mode; - - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &afe_mode); - if (ret) - dev_err(core->dev, - "%s: afe_svc_mode cmd failed, err = %d\n", - __func__, ret); - -err_ret: - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -static int wcd_cpe_afe_cmd_port_cfg(void *core_handle, - struct wcd_cpe_afe_port_cfg *afe_cfg) -{ - struct cpe_afe_cmd_port_cfg port_cfg_cmd; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret; - - ret = wcd_cpe_is_valid_port(core, afe_cfg, __func__); - if (ret) - goto done; - - afe_port_d = &afe_ports[afe_cfg->port_id]; - afe_port_d->port_id = afe_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - memset(&port_cfg_cmd, 0, sizeof(port_cfg_cmd)); - if (fill_afe_cmd_header(&port_cfg_cmd.hdr, - afe_cfg->port_id, - CPE_AFE_PORT_CMD_GENERIC_CONFIG, - CPE_AFE_CMD_PORT_CFG_PAYLOAD_SIZE, - false)) { - ret = -EINVAL; - goto err_ret; - } - - port_cfg_cmd.bit_width = afe_cfg->bit_width; - port_cfg_cmd.num_channels = afe_cfg->num_channels; - port_cfg_cmd.sample_rate = afe_cfg->sample_rate; - - if (afe_port_d->port_id == CPE_AFE_PORT_3_TX) - port_cfg_cmd.buffer_size = WCD_CPE_EC_PP_BUF_SIZE; - else - port_cfg_cmd.buffer_size = AFE_OUT_BUF_SIZE(afe_cfg->bit_width, - afe_cfg->sample_rate); - - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &port_cfg_cmd); - if (ret) - dev_err(core->dev, - "%s: afe_port_config failed, err = %d\n", - __func__, ret); - -err_ret: - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); -done: - return ret; -} - -/* - * wcd_cpe_afe_set_params: set the parameters for afe port - * @afe_cfg: configuration data for the port for which the - * parameters are to be set - */ -static int wcd_cpe_afe_set_params(void *core_handle, - struct wcd_cpe_afe_port_cfg *afe_cfg, bool afe_mad_ctl) -{ - struct cpe_afe_params afe_params; - struct cpe_afe_hw_mad_ctrl *hw_mad_ctrl = &afe_params.hw_mad_ctrl; - struct cpe_afe_port_cfg *port_cfg = &afe_params.port_cfg; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0, pld_size = 0; - - ret = wcd_cpe_is_valid_port(core, afe_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[afe_cfg->port_id]; - afe_port_d->port_id = afe_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - ret = wcd_cpe_send_afe_cal(core, afe_port_d); - if (ret) { - dev_err(core->dev, - "%s: afe acdb cal send failed, err = %d\n", - __func__, ret); - goto err_ret; - } - - pld_size = CPE_AFE_PARAM_PAYLOAD_SIZE; - memset(&afe_params, 0, sizeof(afe_params)); - - if (fill_afe_cmd_header(&afe_params.hdr, - afe_cfg->port_id, - CPE_AFE_CMD_SET_PARAM, - (u8) pld_size, false)) { - ret = -EINVAL; - goto err_ret; - } - - hw_mad_ctrl->param.module_id = CPE_AFE_MODULE_HW_MAD; - hw_mad_ctrl->param.param_id = CPE_AFE_PARAM_ID_HW_MAD_CTL; - hw_mad_ctrl->param.p_size.sr.param_size = PARAM_SIZE_AFE_HW_MAD_CTRL; - hw_mad_ctrl->param.p_size.sr.reserved = 0; - hw_mad_ctrl->minor_version = 1; - hw_mad_ctrl->mad_type = MAD_TYPE_AUDIO; - hw_mad_ctrl->mad_enable = afe_mad_ctl; - - port_cfg->param.module_id = CPE_AFE_MODULE_AUDIO_DEV_INTERFACE; - port_cfg->param.param_id = CPE_AFE_PARAM_ID_GENERIC_PORT_CONFIG; - port_cfg->param.p_size.sr.param_size = PARAM_SIZE_AFE_PORT_CFG; - port_cfg->param.p_size.sr.reserved = 0; - port_cfg->minor_version = 1; - port_cfg->bit_width = afe_cfg->bit_width; - port_cfg->num_channels = afe_cfg->num_channels; - port_cfg->sample_rate = afe_cfg->sample_rate; - - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &afe_params); - if (ret) - dev_err(core->dev, - "%s: afe_port_config failed, err = %d\n", - __func__, ret); -err_ret: - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_start: send the start command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be started. - */ -static int wcd_cpe_afe_port_start(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(struct cmi_hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_START, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_port_start cmd failed, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_stop: send stop command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be stopped. - */ -static int wcd_cpe_afe_port_stop(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_STOP, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_stop cmd failed, err = %d\n", - __func__, ret); - - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_suspend: send suspend command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be suspended. - */ -static int wcd_cpe_afe_port_suspend(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(struct cmi_hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_SUSPEND, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_suspend cmd failed, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_resume: send the resume command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be resumed. - */ -static int wcd_cpe_afe_port_resume(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_RESUME, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_resume cmd failed, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; - -} - -/* - * wcd_cpe_register_afe_driver: register lsm driver to codec - * @cpe_ops: structure with lsm callbacks - * @codec: codec to which this lsm driver is registered to - */ -int wcd_cpe_get_afe_ops(struct wcd_cpe_afe_ops *afe_ops) -{ - afe_ops->afe_set_params = wcd_cpe_afe_set_params; - afe_ops->afe_port_start = wcd_cpe_afe_port_start; - afe_ops->afe_port_stop = wcd_cpe_afe_port_stop; - afe_ops->afe_port_suspend = wcd_cpe_afe_port_suspend; - afe_ops->afe_port_resume = wcd_cpe_afe_port_resume; - afe_ops->afe_port_cmd_cfg = wcd_cpe_afe_cmd_port_cfg; - - return 0; -} -EXPORT_SYMBOL(wcd_cpe_get_afe_ops); - -MODULE_DESCRIPTION("WCD CPE Core"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd_cpe_core.h b/techpack/audio/4.0/asoc/codecs/wcd_cpe_core.h deleted file mode 100644 index 085c0e2cc062..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd_cpe_core.h +++ /dev/null @@ -1,235 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef WCD_CPE_CORE_H -#define WCD_CPE_CORE_H - -#include -#include -#include "wcd_cpe_services.h" - -#define WCD_CPE_LAB_MAX_LATENCY 250 -#define WCD_CPE_MAD_SLIM_CHANNEL 140 - -/* Indicates CPE block is ready for image re-download */ -#define WCD_CPE_BLK_READY (1 << 0) -/* Indicates the underlying bus is ready */ -#define WCD_CPE_BUS_READY (1 << 1) - -/* - * only when the underlying bus and CPE block both are ready, - * the state will be ready to download - */ -#define WCD_CPE_READY_TO_DLOAD \ - (WCD_CPE_BLK_READY | WCD_CPE_BUS_READY) - -#define WCD_CPE_LOAD_IMEM (1 << 0) -#define WCD_CPE_LOAD_DATA (1 << 1) -#define WCD_CPE_LOAD_ALL \ - (WCD_CPE_LOAD_IMEM | WCD_CPE_LOAD_DATA) - -#define WCD_CPE_IMAGE_FNAME_MAX 64 - -#define WCD_CPE_AFE_OUT_PORT_2 2 -#define WCD_CPE_AFE_OUT_PORT_4 4 - -enum { - WCD_CPE_LSM_CAL_AFE = 0, - WCD_CPE_LSM_CAL_LSM, - WCD_CPE_LSM_CAL_TOPOLOGY_ID, - WCD_CPE_LSM_CAL_MAX, -}; - -enum cpe_err_irq_cntl_type { - CPE_ERR_IRQ_MASK = 0, - CPE_ERR_IRQ_UNMASK, - CPE_ERR_IRQ_CLEAR, - CPE_ERR_IRQ_STATUS, -}; - -struct wcd_cpe_cdc_cb { - /* codec provided callback to enable RCO */ - int (*cdc_clk_en)(struct snd_soc_codec *, bool); - - /* callback for FLL setup for codec */ - int (*cpe_clk_en)(struct snd_soc_codec *, bool); - int (*cdc_ext_clk)(struct snd_soc_codec *codec, int enable, bool dapm); - int (*lab_cdc_ch_ctl)(struct snd_soc_codec *codec, u8 event); - int (*get_afe_out_port_id)(struct snd_soc_codec *codec, u16 *port_id); - int (*bus_vote_bw)(struct snd_soc_codec *codec, - bool vote); - - /* Callback to control the cpe error interrupt mask/status/clear */ - int (*cpe_err_irq_control)(struct snd_soc_codec *codec, - enum cpe_err_irq_cntl_type cntl_type, - u8 *status); -}; - -enum wcd_cpe_ssr_state_event { - /* Indicates CPE is initialized */ - WCD_CPE_INITIALIZED = 0, - /* Indicates that IMEM is downloaded to CPE */ - WCD_CPE_IMEM_DOWNLOADED, - /* Indicates CPE is enabled */ - WCD_CPE_ENABLED, - /* Indicates that CPE is currently active */ - WCD_CPE_ACTIVE, - /* Event from underlying bus notifying bus is down */ - WCD_CPE_BUS_DOWN_EVENT, - /* Event from CPE block, notifying CPE is down */ - WCD_CPE_SSR_EVENT, - /* Event from underlying bus notifying bus is up */ - WCD_CPE_BUS_UP_EVENT, -}; - -struct wcd_cpe_ssr_entry { - int offline; - u32 offline_change; - wait_queue_head_t offline_poll_wait; - struct snd_info_entry *entry; -}; - -struct wcd_cpe_irq_info { - int cpe_engine_irq; - int cpe_err_irq; - u8 cpe_fatal_irqs; -}; - -struct wcd_cpe_hw_info { - u32 dram_offset; - size_t dram_size; - u32 iram_offset; - size_t iram_size; -}; - -struct wcd_cpe_core { - /* handle to cpe services */ - void *cpe_handle; - - /* registration handle to cpe services */ - void *cpe_reg_handle; - - /* cmi registration handle for afe service */ - void *cmi_afe_handle; - - /* handle to codec */ - struct snd_soc_codec *codec; - - /* codec device */ - struct device *dev; - - /* firmware image file name */ - char fname[WCD_CPE_IMAGE_FNAME_MAX]; - - /* firmware image file name from sysfs */ - char dyn_fname[WCD_CPE_IMAGE_FNAME_MAX]; - - /* codec information needed by cpe services */ - struct cpe_svc_codec_info_v1 cdc_info; - - /* work to perform image download */ - struct work_struct load_fw_work; - - /* flag to indicate mode in which cpe needs to be booted */ - int cpe_debug_mode; - - /* callbacks for codec specific implementation */ - const struct wcd_cpe_cdc_cb *cpe_cdc_cb; - - /* work to handle CPE SSR*/ - struct work_struct ssr_work; - - /* PM handle for suspend mode during SSR */ - struct pm_qos_request pm_qos_req; - - /* completion event indicating CPE OFFLINE */ - struct completion offline_compl; - - /* entry into snd card procfs indicating cpe status */ - struct wcd_cpe_ssr_entry ssr_entry; - - /* - * completion event to signal CPE is - * ready for image re-download - */ - struct completion ready_compl; - - /* maintains the status for cpe ssr */ - u8 ready_status; - - /* Indicate SSR type */ - enum wcd_cpe_ssr_state_event ssr_type; - - /* mutex to protect cpe ssr status variables */ - struct mutex ssr_lock; - - /* mutex to protect cpe session status variables */ - struct mutex session_lock; - - /* Store the calibration data needed for cpe */ - struct cal_type_data *cal_data[WCD_CPE_LSM_CAL_MAX]; - - /* completion event to signal CPE is online */ - struct completion online_compl; - - /* reference counter for cpe usage */ - u8 cpe_users; - - /* Ramdump support */ - void *cpe_ramdump_dev; - struct ramdump_segment cpe_ramdump_seg; - dma_addr_t cpe_dump_addr; - void *cpe_dump_v_addr; - - /* SFR support */ - u32 sfr_buf_addr; - size_t sfr_buf_size; - - /* IRQ information for CPE interrupts */ - struct wcd_cpe_irq_info irq_info; - - /* Kobject for sysfs entry */ - struct kobject cpe_kobj; - - /* Reference count for cpe clk*/ - int cpe_clk_ref; - - /* codec based hardware info */ - struct wcd_cpe_hw_info hw_info; -}; - -struct wcd_cpe_params { - struct snd_soc_codec *codec; - struct wcd_cpe_core * (*get_cpe_core)( - struct snd_soc_codec *); - const struct wcd_cpe_cdc_cb *cdc_cb; - int dbg_mode; - u16 cdc_major_ver; - u16 cdc_minor_ver; - u32 cdc_id; - - struct wcd_cpe_irq_info cdc_irq_info; - - struct cpe_svc_init_param *cpe_svc_params; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_CPE) -int wcd_cpe_ssr_event(void *core_handle, - enum wcd_cpe_ssr_state_event event); -struct wcd_cpe_core *wcd_cpe_init(const char *img_fname, -struct snd_soc_codec *codec, struct wcd_cpe_params *params); -#else /* CONFIG_SND_SOC_WCD_CPE */ -static inline int wcd_cpe_ssr_event(void *core_handle, - enum wcd_cpe_ssr_state_event event) -{ - return 0; -} -static inline struct wcd_cpe_core *wcd_cpe_init(const char *img_fname, - struct snd_soc_codec *codec, - struct wcd_cpe_params *params) -{ - return NULL; -} -#endif /* CONFIG_SND_SOC_WCD_CPE */ -#endif diff --git a/techpack/audio/4.0/asoc/codecs/wcd_cpe_services.c b/techpack/audio/4.0/asoc/codecs/wcd_cpe_services.c deleted file mode 100644 index 96e2bb1945a4..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd_cpe_services.c +++ /dev/null @@ -1,2719 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd9335_registers.h" -#include -#include "cpe_cmi.h" -#include "wcd_cpe_services.h" -#include "wcd_cmi_api.h" - -#define CPE_MSG_BUFFER_SIZE 132 -#define CPE_NO_SERVICE 0 - -#define CMI_DRIVER_SUPPORTED_VERSION 0 -#define CMI_API_SUCCESS 0 -#define CMI_MSG_TRANSPORT (0x0002) -#define CPE_SVC_INACTIVE_STATE_RETRIES_MAX 10 - -#define TOMTOM_A_SVASS_SPE_DRAM_OFFSET 0x50000 -#define TOMTOM_A_SVASS_SPE_DRAM_SIZE 0x30000 -#define TOMTOM_A_SVASS_SPE_IRAM_OFFSET 0x80000 -#define TOMTOM_A_SVASS_SPE_IRAM_SIZE 0xC000 -#define TOMTOM_A_SVASS_SPE_INBOX_SIZE 12 -#define TOMTOM_A_SVASS_SPE_OUTBOX_SIZE 12 - -#define MEM_ACCESS_NONE_VAL 0x0 -#define MEM_ACCESS_IRAM_VAL 0x1 -#define MEM_ACCESS_DRAM_VAL 0x2 -#define LISTEN_CTL_SPE_VAL 0x0 -#define LISTEN_CTL_MSM_VAL 0x1 - -#define WCD9335_CPE_SS_SPE_DRAM_OFFSET 0x48000 -#define WCD9335_CPE_SS_SPE_DRAM_SIZE 0x34000 -#define WCD9335_CPE_SS_SPE_IRAM_OFFSET 0x80000 -#define WCD9335_CPE_SS_SPE_IRAM_SIZE 0x20000 - -#define WCD9335_CPE_SS_SPE_INBOX_SIZE 16 -#define WCD9335_CPE_SS_SPE_OUTBOX_SIZE 16 -#define WCD9335_CPE_SS_SPE_MEM_BANK_SIZ 16 - -#define WCD9335_CPE_SS_SPE_INBOX1(N) (WCD9335_CPE_SS_INBOX1_0 + (N)) -#define WCD9335_CPE_SS_SPE_OUTBOX1(N) (WCD9335_CPE_SS_OUTBOX1_0 + (N)) -#define WCD9335_CPE_SS_MEM_BANK(N) (WCD9335_CPE_SS_MEM_BANK_0 + (N)) - -#define CHUNK_SIZE 16 - -#define CPE_SVC_GRAB_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock acquire\n", \ - __func__, name); \ - mutex_lock(lock); \ -} - -#define CPE_SVC_REL_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock release\n", \ - __func__, name); \ - mutex_unlock(lock); \ -} - -static const struct cpe_svc_hw_cfg cpe_svc_tomtom_info = { - TOMTOM_A_SVASS_SPE_DRAM_SIZE, - TOMTOM_A_SVASS_SPE_DRAM_OFFSET, - TOMTOM_A_SVASS_SPE_IRAM_SIZE, - TOMTOM_A_SVASS_SPE_IRAM_OFFSET, - TOMTOM_A_SVASS_SPE_INBOX_SIZE, - TOMTOM_A_SVASS_SPE_OUTBOX_SIZE -}; - -static const struct cpe_svc_hw_cfg cpe_svc_wcd9335_info = { - WCD9335_CPE_SS_SPE_DRAM_SIZE, - WCD9335_CPE_SS_SPE_DRAM_OFFSET, - WCD9335_CPE_SS_SPE_IRAM_SIZE, - WCD9335_CPE_SS_SPE_IRAM_OFFSET, - WCD9335_CPE_SS_SPE_INBOX_SIZE, - WCD9335_CPE_SS_SPE_OUTBOX_SIZE -}; - -enum cpe_state { - CPE_STATE_UNINITIALIZED = 0, - CPE_STATE_INITIALIZED, - CPE_STATE_IDLE, - CPE_STATE_DOWNLOADING, - CPE_STATE_BOOTING, - CPE_STATE_SENDING_MSG, - CPE_STATE_OFFLINE, - CPE_STATE_BUFFERING, - CPE_STATE_BUFFERING_CANCELLED -}; - -enum cpe_substate { - CPE_SS_IDLE = 0, - CPE_SS_MSG_REQUEST_ACCESS, - CPE_SS_MSG_SEND_INBOX, - CPE_SS_MSG_SENT, - CPE_SS_DL_DOWNLOADING, - CPE_SS_DL_COMPLETED, - CPE_SS_BOOT, - CPE_SS_BOOT_INIT, - CPE_SS_ONLINE -}; - -enum cpe_command { - CPE_CMD_KILL_THREAD = 0, - CPE_CMD_BOOT, - CPE_CMD_BOOT_INITIALIZE, - CPE_CMD_BOOT_COMPLETE, - CPE_CMD_SEND_MSG, - CPE_CMD_SEND_TRANS_MSG, - CPE_CMD_SEND_MSG_COMPLETE, - CPE_CMD_PROCESS_IRQ, - CPE_CMD_RAMDUMP, - CPE_CMD_DL_SEGMENT, - CPE_CMD_SHUTDOWN, - CPE_CMD_RESET, - CPE_CMD_DEINITIALIZE, - CPE_CMD_READ, - CPE_CMD_ENABLE_LAB, - CPE_CMD_DISABLE_LAB, - CPE_CMD_SWAP_BUFFER, - CPE_LAB_CFG_SB, - CPE_CMD_CANCEL_MEMACCESS, - CPE_CMD_PROC_INCOMING_MSG, - CPE_CMD_FTM_TEST, -}; - -enum cpe_process_result { - CPE_PROC_SUCCESS = 0, - CPE_PROC_FAILED, - CPE_PROC_KILLED, - CPE_PROC_QUEUED, -}; - -struct cpe_command_node { - enum cpe_command command; - enum cpe_svc_result result; - void *data; - struct list_head list; -}; - -struct cpe_info { - struct list_head main_queue; - struct completion cmd_complete; - struct completion thread_comp; - void *thread_handler; - bool stop_thread; - struct mutex msg_lock; - enum cpe_state state; - enum cpe_substate substate; - struct list_head client_list; - enum cpe_process_result (*cpe_process_command) - (struct cpe_command_node *command_node); - enum cpe_svc_result (*cpe_cmd_validate) - (const struct cpe_info *i, - enum cpe_command command); - enum cpe_svc_result (*cpe_start_notification) - (struct cpe_info *i); - u32 initialized; - struct cpe_svc_tgt_abstraction *tgt; - void *pending; - void *data; - void *client_context; - u32 codec_id; - struct work_struct clk_plan_work; - struct completion core_svc_cmd_compl; -}; - -struct cpe_tgt_waiti_info { - u8 tgt_waiti_size; - u8 *tgt_waiti_data; -}; - -struct cpe_svc_tgt_abstraction { - enum cpe_svc_result (*tgt_boot)(int debug_mode); - - u32 (*tgt_cpar_init_done)(void); - - u32 (*tgt_is_active)(void); - - enum cpe_svc_result (*tgt_reset)(void); - - enum cpe_svc_result (*tgt_stop)(void); - - enum cpe_svc_result (*tgt_read_mailbox) - (u8 *buffer, size_t size); - - enum cpe_svc_result (*tgt_write_mailbox) - (u8 *buffer, size_t size); - - enum cpe_svc_result (*tgt_read_ram) - (struct cpe_info *c, - struct cpe_svc_mem_segment *data); - - enum cpe_svc_result (*tgt_write_ram) - (struct cpe_info *c, - const struct cpe_svc_mem_segment *data); - - enum cpe_svc_result (*tgt_route_notification) - (enum cpe_svc_module module, - enum cpe_svc_route_dest dest); - - enum cpe_svc_result (*tgt_set_debug_mode)(u32 enable); - const struct cpe_svc_hw_cfg *(*tgt_get_cpe_info)(void); - enum cpe_svc_result (*tgt_deinit) - (struct cpe_svc_tgt_abstraction *param); - enum cpe_svc_result (*tgt_voice_tx_lab) - (bool); - u8 *inbox; - u8 *outbox; - struct cpe_tgt_waiti_info *tgt_waiti_info; -}; - -static enum cpe_svc_result cpe_tgt_tomtom_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param); - -static enum cpe_svc_result cpe_tgt_wcd9335_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param); - -struct cpe_send_msg { - u8 *payload; - u32 isobm; - u32 address; - size_t size; -}; - -struct cpe_read_handle { - void *registration; - struct cpe_info t_info; - struct list_head buffers; - void *config; -}; - -struct generic_notification { - void (*notification) - (const struct cpe_svc_notification *parameter); - void (*cmi_notification) - (const struct cmi_api_notification *parameter); -}; - -struct cpe_notif_node { - struct generic_notification notif; - u32 mask; - u32 service; - const struct cpe_info *context; - const char *name; - u32 disabled; - struct list_head list; -}; - -struct cpe_priv { - struct cpe_info *cpe_default_handle; - void (*cpe_irq_control_callback)(u32 enable); - void (*cpe_query_freq_plans_cb) - (void *cdc_priv, - struct cpe_svc_cfg_clk_plan *clk_freq); - void (*cpe_change_freq_plan_cb)(void *cdc_priv, - u32 clk_freq); - u32 cpe_msg_buffer; - void *cpe_cmi_handle; - struct mutex cpe_api_mutex; - struct mutex cpe_svc_lock; - struct cpe_svc_boot_event cpe_debug_vector; - void *cdc_priv; -}; - -static struct cpe_priv cpe_d; - -static enum cpe_svc_result __cpe_svc_shutdown(void *cpe_handle); - -static enum cpe_svc_result cpe_is_command_valid( - const struct cpe_info *t_info, - enum cpe_command command); - -static int cpe_register_read(u32 reg, u8 *val) -{ - *(val) = snd_soc_read(cpe_d.cdc_priv, reg); - return 0; -} - -static enum cpe_svc_result cpe_update_bits(u32 reg, - u32 mask, u32 value) -{ - int ret = 0; - - ret = snd_soc_update_bits(cpe_d.cdc_priv, reg, - mask, value); - if (ret < 0) - return CPE_SVC_FAILED; - - return CPE_SVC_SUCCESS; -} - -static int cpe_register_write(u32 reg, u32 val) -{ - int ret = 0; - - if (reg != WCD9335_CPE_SS_MEM_BANK_0) - pr_debug("%s: reg = 0x%x, value = 0x%x\n", - __func__, reg, val); - - ret = snd_soc_write(cpe_d.cdc_priv, reg, val); - if (ret < 0) - return CPE_SVC_FAILED; - - return CPE_SVC_SUCCESS; -} - -static int cpe_register_write_repeat(u32 reg, u8 *ptr, u32 to_write) -{ - struct snd_soc_codec *codec = cpe_d.cdc_priv; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int ret = 0; - - ret = wcd9xxx_slim_write_repeat(wcd9xxx, reg, to_write, ptr); - if (ret != 0) - pr_err("%s: slim_write_repeat failed\n", __func__); - - if (ret < 0) - return CPE_SVC_FAILED; - - return CPE_SVC_SUCCESS; -} - -static bool cpe_register_read_autoinc_supported(void) -{ - return true; -} - - -/* Called under msgq locked context */ -static void cpe_cmd_received(struct cpe_info *t_info) -{ - struct cpe_command_node *node = NULL; - enum cpe_process_result proc_rc = CPE_PROC_SUCCESS; - - if (!t_info) { - pr_err("%s: Invalid thread info\n", - __func__); - return; - } - - while (!list_empty(&t_info->main_queue)) { - if (proc_rc != CPE_PROC_SUCCESS) - break; - node = list_first_entry(&t_info->main_queue, - struct cpe_command_node, list); - if (!node) - break; - list_del(&node->list); - proc_rc = t_info->cpe_process_command(node); - pr_debug("%s: process command return %d\n", - __func__, proc_rc); - - switch (proc_rc) { - case CPE_PROC_SUCCESS: - kfree(node); - break; - case CPE_PROC_FAILED: - kfree(node); - pr_err("%s: cmd failed\n", __func__); - break; - case CPE_PROC_KILLED: - break; - default: - list_add(&node->list, &(t_info->main_queue)); - - } - } -} - -static int cpe_worker_thread(void *context) -{ - struct cpe_info *t_info = (struct cpe_info *)context; - - /* - * Thread will run until requested to stop explicitly - * by setting the t_info->stop_thread flag - */ - while (1) { - /* Wait for command to be processed */ - wait_for_completion(&t_info->cmd_complete); - - CPE_SVC_GRAB_LOCK(&t_info->msg_lock, "msg_lock"); - cpe_cmd_received(t_info); - reinit_completion(&t_info->cmd_complete); - /* Check if thread needs to be stopped */ - if (t_info->stop_thread) - goto unlock_and_exit; - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - }; - -unlock_and_exit: - pr_debug("%s: thread stopped\n", __func__); - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - complete_and_exit(&t_info->thread_comp, 0); -} - -static void cpe_create_worker_thread(struct cpe_info *t_info) -{ - INIT_LIST_HEAD(&t_info->main_queue); - init_completion(&t_info->cmd_complete); - init_completion(&t_info->thread_comp); - t_info->stop_thread = false; - t_info->thread_handler = kthread_run(cpe_worker_thread, - (void *)t_info, "cpe-worker-thread"); - pr_debug("%s: Created new worker thread\n", - __func__); -} - -static void cpe_cleanup_worker_thread(struct cpe_info *t_info) -{ - if (!t_info->thread_handler) { - pr_err("%s: thread not created\n", __func__); - return; - } - - /* - * Wake up the command handler in case - * it is waiting for an command to be processed. - */ - CPE_SVC_GRAB_LOCK(&t_info->msg_lock, "msg_lock"); - t_info->stop_thread = true; - complete(&t_info->cmd_complete); - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - - /* Wait for the thread to exit */ - wait_for_completion(&t_info->thread_comp); - t_info->thread_handler = NULL; - - pr_debug("%s: Thread cleaned up successfully\n", - __func__); -} - -static enum cpe_svc_result -cpe_send_cmd_to_thread(struct cpe_info *t_info, - enum cpe_command command, void *data, - bool high_prio) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_command_node *cmd = NULL; - - rc = cpe_is_command_valid(t_info, command); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Invalid command %d\n", - __func__, command); - return rc; - } - - cmd = kzalloc(sizeof(struct cpe_command_node), - GFP_ATOMIC); - if (!cmd) - return CPE_SVC_NO_MEMORY; - - cmd->command = command; - cmd->data = data; - - CPE_SVC_GRAB_LOCK(&t_info->msg_lock, "msg_lock"); - if (high_prio) - list_add(&(cmd->list), - &(t_info->main_queue)); - else - list_add_tail(&(cmd->list), - &(t_info->main_queue)); - complete(&t_info->cmd_complete); - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - - return rc; -} - -static enum cpe_svc_result cpe_change_state( - struct cpe_info *t_info, - enum cpe_state state, enum cpe_substate ss) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - t_info->state = state; - t_info->substate = ss; - - pr_debug("%s: current state: %d,%d, new_state: %d,%d\n", - __func__, t_info->state, t_info->substate, - state, ss); - - return rc; -} - -static enum cpe_svc_result -cpe_is_command_valid(const struct cpe_info *t_info, - enum cpe_command command) -{ - enum cpe_svc_result rc = CPE_SVC_INVALID_HANDLE; - - if (t_info && t_info->cpe_cmd_validate) - rc = t_info->cpe_cmd_validate(t_info, command); - else - pr_err("%s: invalid handle or callback\n", - __func__); - return rc; -} - -static void cpe_notify_client(struct cpe_notif_node *client, - struct cpe_svc_notification *payload) -{ - if (!client || !payload) { - pr_err("%s: invalid client or payload\n", - __func__); - return; - } - - if (!(client->mask & payload->event)) { - pr_debug("%s: client mask 0x%x not registered for event 0x%x\n", - __func__, client->mask, payload->event); - return; - } - - if (client->notif.notification && !client->disabled) - client->notif.notification(payload); - - if ((client->mask & CPE_SVC_CMI_MSG) && - client->notif.cmi_notification) - client->notif.cmi_notification( - (const struct cmi_api_notification *)payload); -} - -static void cpe_broadcast_notification(const struct cpe_info *t_info, - struct cpe_svc_notification *payload) -{ - struct cpe_notif_node *n = NULL; - - if (!t_info || !payload) { - pr_err("%s: invalid handle\n", __func__); - return; - } - - pr_debug("%s: notify clients, event = %d\n", - __func__, payload->event); - payload->private_data = cpe_d.cdc_priv; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_for_each_entry(n, &t_info->client_list, list) { - if (!(n->mask & CPE_SVC_CMI_MSG)) - cpe_notify_client(n, payload); - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); -} - -static void *cpe_register_generic(struct cpe_info *t_info, - void notification_callback( - const struct cpe_svc_notification *parameter), - void cmi_callback( - const struct cmi_api_notification *parameter), - u32 mask, u32 service, const char *name) -{ - struct cpe_notif_node *n = NULL; - - n = kzalloc(sizeof(struct cpe_notif_node), - GFP_KERNEL); - if (!n) - return NULL; - n->mask = mask; - n->service = service; - n->notif.notification = notification_callback; - n->notif.cmi_notification = cmi_callback; - n->context = t_info; - n->disabled = false; - n->name = name; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - /* Make sure CPE core service is first */ - if (service == CMI_CPE_CORE_SERVICE_ID) - list_add(&n->list, &t_info->client_list); - else - list_add_tail(&n->list, &t_info->client_list); - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - - return n; -} - -static enum cpe_svc_result cpe_deregister_generic(struct cpe_info *t_info, - void *reg_handle) -{ - struct cpe_notif_node *n = (struct cpe_notif_node *)reg_handle; - - if (!t_info || !reg_handle) { - pr_err("%s: invalid handle\n", __func__); - return CPE_SVC_INVALID_HANDLE; - } - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_del(&(n->list)); - kfree(reg_handle); - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_svc_tgt_init(struct cpe_svc_codec_info_v1 *i, - struct cpe_svc_tgt_abstraction *abs) -{ - if (!i || !abs) { - pr_err("%s: Incorrect information provided\n", - __func__); - return CPE_SVC_FAILED; - } - - switch (i->id) { - case CPE_SVC_CODEC_TOMTOM: - return cpe_tgt_tomtom_init(i, abs); - case CPE_SVC_CODEC_WCD9335: - return cpe_tgt_wcd9335_init(i, abs); - default: - pr_err("%s: Codec type %d not supported\n", - __func__, i->id); - return CPE_SVC_FAILED; - } - - return CPE_SVC_SUCCESS; -} - -static void cpe_notify_cmi_client(struct cpe_info *t_info, u8 *payload, - enum cpe_svc_result result) -{ - struct cpe_notif_node *n = NULL; - struct cmi_api_notification notif; - struct cmi_hdr *hdr; - u8 service = 0; - - if (!t_info || !payload) { - pr_err("%s: invalid payload/handle\n", - __func__); - return; - } - - hdr = CMI_GET_HEADER(payload); - service = CMI_HDR_GET_SERVICE(hdr); - - notif.event = CMI_API_MSG; - notif.result = result; - notif.message = payload; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_for_each_entry(n, &t_info->client_list, list) { - - if ((n->mask & CPE_SVC_CMI_MSG) && - n->service == service && - n->notif.cmi_notification) { - n->notif.cmi_notification(¬if); - break; - } - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); -} - -static void cpe_toggle_irq_notification(struct cpe_info *t_info, u32 value) -{ - if (cpe_d.cpe_irq_control_callback) - cpe_d.cpe_irq_control_callback(value); -} - -static void cpe_command_cleanup(struct cpe_command_node *command_node) -{ - switch (command_node->command) { - case CPE_CMD_SEND_MSG: - case CPE_CMD_SEND_TRANS_MSG: - case CPE_CMD_SEND_MSG_COMPLETE: - case CPE_CMD_SHUTDOWN: - case CPE_CMD_READ: - kfree(command_node->data); - command_node->data = NULL; - break; - default: - pr_err("%s: unhandled command\n", - __func__); - break; - } -} - -static enum cpe_svc_result cpe_send_msg_to_inbox( - struct cpe_info *t_info, u32 opcode, - struct cpe_send_msg *msg) -{ - size_t bytes = 0; - size_t inbox_size = - t_info->tgt->tgt_get_cpe_info()->inbox_size; - struct cmi_hdr *hdr; - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - memset(t_info->tgt->inbox, 0, inbox_size); - hdr = CMI_GET_HEADER(t_info->tgt->inbox); - CMI_HDR_SET_SESSION(hdr, 1); - CMI_HDR_SET_SERVICE(hdr, CMI_CPE_CORE_SERVICE_ID); - CMI_HDR_SET_VERSION(hdr, CMI_DRIVER_SUPPORTED_VERSION); - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_IN_BAND); - - switch (opcode) { - case CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC: { - struct cmi_core_svc_cmd_shared_mem_alloc *m; - - CMI_HDR_SET_OPCODE(hdr, - CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, - sizeof(struct cmi_core_svc_cmd_shared_mem_alloc)); - m = (struct cmi_core_svc_cmd_shared_mem_alloc *) - CMI_GET_PAYLOAD(t_info->tgt->inbox); - m->size = CPE_MSG_BUFFER_SIZE; - pr_debug("send shared mem alloc msg to cpe inbox\n"); - } - break; - case CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ: - CMI_HDR_SET_OPCODE(hdr, - CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, 0); - pr_debug("%s: Creating DRAM acces request msg\n", - __func__); - break; - - case CPE_CMI_BASIC_RSP_OPCODE: { - struct cmi_basic_rsp_result *rsp; - - CMI_HDR_SET_OPCODE(hdr, - CPE_CMI_BASIC_RSP_OPCODE); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, - sizeof(struct cmi_basic_rsp_result)); - rsp = (struct cmi_basic_rsp_result *) - CMI_GET_PAYLOAD(t_info->tgt->inbox); - rsp->status = 0; - pr_debug("%s: send basic response\n", __func__); - } - break; - - default: - if (msg->address != 0) { - struct cmi_msg_transport *m = NULL; - struct cpe_svc_mem_segment mem_seg; - - mem_seg.type = CPE_SVC_DATA_MEM; - if (msg->isobm) { - struct cmi_obm *obm = (struct cmi_obm *) - - CMI_GET_PAYLOAD(msg->payload); - mem_seg.cpe_addr = obm->mem_handle; - mem_seg.data = (u8 *)obm->data_ptr.kvaddr; - mem_seg.size = obm->size; - t_info->tgt->tgt_write_ram(t_info, &mem_seg); - } - - mem_seg.cpe_addr = msg->address; - mem_seg.data = msg->payload; - mem_seg.size = msg->size; - t_info->tgt->tgt_write_ram(t_info, &mem_seg); - - hdr = CMI_GET_HEADER(t_info->tgt->inbox); - CMI_HDR_SET_OPCODE(hdr, CMI_MSG_TRANSPORT); - m = (struct cmi_msg_transport *) - CMI_GET_PAYLOAD(t_info->tgt->inbox); - m->addr = msg->address; - m->size = msg->size; - CMI_HDR_SET_PAYLOAD_SIZE(hdr, - sizeof(struct cmi_msg_transport)); - } else { - memcpy(t_info->tgt->inbox, msg->payload, - msg->size); - } - - break; - } - - pr_debug("%s: sending message to cpe inbox\n", - __func__); - bytes = sizeof(struct cmi_hdr); - hdr = CMI_GET_HEADER(t_info->tgt->inbox); - bytes += CMI_HDR_GET_PAYLOAD_SIZE(hdr); - rc = t_info->tgt->tgt_write_mailbox(t_info->tgt->inbox, bytes); - - return rc; -} - -static bool cpe_is_cmd_clk_req(void *cmd) -{ - struct cmi_hdr *hdr; - - hdr = CMI_GET_HEADER(cmd); - - if ((CMI_HDR_GET_SERVICE(hdr) == - CMI_CPE_CORE_SERVICE_ID)) { - if (CMI_GET_OPCODE(cmd) == - CPE_CORE_SVC_CMD_CLK_FREQ_REQUEST) - return true; - } - - return false; -} - -static enum cpe_svc_result cpe_process_clk_change_req( - struct cpe_info *t_info) -{ - struct cmi_core_svc_cmd_clk_freq_request *req; - - req = (struct cmi_core_svc_cmd_clk_freq_request *) - CMI_GET_PAYLOAD(t_info->tgt->outbox); - - if (!cpe_d.cpe_change_freq_plan_cb) { - pr_err("%s: No support for clk freq change\n", - __func__); - return CPE_SVC_FAILED; - } - - cpe_d.cpe_change_freq_plan_cb(cpe_d.cdc_priv, - req->clk_freq); - - /*send a basic response*/ - cpe_send_msg_to_inbox(t_info, - CPE_CMI_BASIC_RSP_OPCODE, NULL); - - return CPE_SVC_SUCCESS; -} - -static void cpe_process_irq_int(u32 irq, - struct cpe_info *t_info) -{ - struct cpe_command_node temp_node; - struct cpe_send_msg *m; - u8 size = 0; - bool err_irq = false; - struct cmi_hdr *hdr; - - pr_debug("%s: irq = %u\n", __func__, irq); - - if (!t_info) { - pr_err("%s: Invalid handle\n", - __func__); - return; - } - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - switch (irq) { - case CPE_IRQ_OUTBOX_IRQ: - size = t_info->tgt->tgt_get_cpe_info()->outbox_size; - t_info->tgt->tgt_read_mailbox(t_info->tgt->outbox, size); - break; - - case CPE_IRQ_MEM_ACCESS_ERROR: - err_irq = true; - cpe_change_state(t_info, CPE_STATE_OFFLINE, CPE_SS_IDLE); - break; - - case CPE_IRQ_WDOG_BITE: - case CPE_IRQ_RCO_WDOG_INT: - err_irq = true; - __cpe_svc_shutdown(t_info); - break; - - case CPE_IRQ_FLL_LOCK_LOST: - default: - err_irq = true; - break; - } - - if (err_irq) { - pr_err("%s: CPE error IRQ %u occurred\n", - __func__, irq); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return; - } - - switch (t_info->state) { - case CPE_STATE_BOOTING: - - switch (t_info->substate) { - case CPE_SS_BOOT: - temp_node.command = CPE_CMD_BOOT_INITIALIZE; - temp_node.result = CPE_SVC_SUCCESS; - t_info->substate = CPE_SS_BOOT_INIT; - t_info->cpe_process_command(&temp_node); - break; - - case CPE_SS_BOOT_INIT: - temp_node.command = CPE_CMD_BOOT_COMPLETE; - temp_node.result = CPE_SVC_SUCCESS; - t_info->substate = CPE_SS_ONLINE; - t_info->cpe_process_command(&temp_node); - break; - - default: - pr_debug("%s: unhandled substate %d for state %d\n", - __func__, t_info->state, t_info->substate); - break; - } - break; - - case CPE_STATE_SENDING_MSG: - hdr = CMI_GET_HEADER(t_info->tgt->outbox); - if (CMI_GET_OPCODE(t_info->tgt->outbox) == - CPE_LSM_SESSION_EVENT_DETECTION_STATUS_V2) { - pr_debug("%s: session_id: %u, state: %d,%d, event received\n", - __func__, CMI_HDR_GET_SESSION_ID(hdr), - t_info->state, t_info->substate); - temp_node.command = CPE_CMD_PROC_INCOMING_MSG; - temp_node.data = NULL; - t_info->cpe_process_command(&temp_node); - break; - } - - m = (struct cpe_send_msg *)t_info->pending; - - switch (t_info->substate) { - case CPE_SS_MSG_REQUEST_ACCESS: - cpe_send_cmd_to_thread(t_info, - CPE_CMD_SEND_TRANS_MSG, m, true); - break; - - case CPE_SS_MSG_SEND_INBOX: - if (cpe_is_cmd_clk_req(t_info->tgt->outbox)) - cpe_process_clk_change_req(t_info); - else - cpe_send_cmd_to_thread(t_info, - CPE_CMD_SEND_MSG_COMPLETE, m, true); - break; - - default: - pr_debug("%s: unhandled substate %d for state %d\n", - __func__, t_info->state, t_info->substate); - break; - } - break; - - case CPE_STATE_IDLE: - pr_debug("%s: Message received, notifying client\n", - __func__); - temp_node.command = CPE_CMD_PROC_INCOMING_MSG; - temp_node.data = NULL; - t_info->cpe_process_command(&temp_node); - break; - - default: - pr_debug("%s: unhandled state %d\n", - __func__, t_info->state); - break; - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); -} - - -static void broacast_boot_failed(void) -{ - struct cpe_info *t_info = cpe_d.cpe_default_handle; - struct cpe_svc_notification payload; - - payload.event = CPE_SVC_BOOT_FAILED; - payload.result = CPE_SVC_FAILED; - payload.payload = NULL; - if (t_info) - payload.private_data = - t_info->client_context; - cpe_broadcast_notification(t_info, &payload); -} - -static enum cpe_svc_result broadcast_boot_event( - struct cpe_info *t_info) -{ - struct cpe_svc_notification payload; - - payload.event = CPE_SVC_ONLINE; - payload.result = CPE_SVC_SUCCESS; - payload.payload = NULL; - if (t_info) - payload.private_data = - t_info->client_context; - cpe_broadcast_notification(t_info, &payload); - - return CPE_SVC_SUCCESS; -} - -static enum cpe_process_result cpe_boot_initialize(struct cpe_info *t_info, - enum cpe_svc_result *cpe_rc) -{ - enum cpe_process_result rc = CPE_SVC_FAILED; - struct cpe_svc_notification payload; - struct cmi_core_svc_event_system_boot *p = NULL; - - if (CMI_GET_OPCODE(t_info->tgt->outbox) != - CPE_CORE_SVC_EVENT_SYSTEM_BOOT) { - broacast_boot_failed(); - return rc; - } - - p = (struct cmi_core_svc_event_system_boot *) - CMI_GET_PAYLOAD(t_info->tgt->outbox); - if (p->status != CPE_BOOT_SUCCESS) { - pr_err("%s: cpe boot failed, status = %d\n", - __func__, p->status); - broacast_boot_failed(); - return rc; - } - - /* boot was successful */ - if (p->version == - CPE_CORE_VERSION_SYSTEM_BOOT_EVENT) { - cpe_d.cpe_debug_vector.debug_address = - p->sfr_buff_address; - cpe_d.cpe_debug_vector.debug_buffer_size = - p->sfr_buff_size; - cpe_d.cpe_debug_vector.status = p->status; - payload.event = CPE_SVC_BOOT; - payload.result = CPE_SVC_SUCCESS; - payload.payload = (void *)&cpe_d.cpe_debug_vector; - payload.private_data = t_info->client_context; - cpe_broadcast_notification(t_info, &payload); - } - cpe_change_state(t_info, CPE_STATE_BOOTING, - CPE_SS_BOOT_INIT); - (*cpe_rc) = cpe_send_msg_to_inbox(t_info, - CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC, NULL); - rc = CPE_PROC_SUCCESS; - return rc; -} - -static void cpe_svc_core_cmi_handler( - const struct cmi_api_notification *parameter) -{ - struct cmi_hdr *hdr; - - if (!parameter) - return; - - pr_debug("%s: event = %d\n", - __func__, parameter->event); - - if (parameter->event != CMI_API_MSG) - return; - - hdr = (struct cmi_hdr *) parameter->message; - - if (hdr->opcode == CPE_CMI_BASIC_RSP_OPCODE) { - struct cmi_basic_rsp_result *result; - - result = (struct cmi_basic_rsp_result *) - ((u8 *)parameter->message) + (sizeof(*hdr)); - if (result->status) - pr_err("%s: error response, error code = %u\n", - __func__, result->status); - complete(&cpe_d.cpe_default_handle->core_svc_cmd_compl); - } -} - -static void cpe_clk_plan_work(struct work_struct *work) -{ - struct cpe_info *t_info = NULL; - size_t size = 0; - struct cpe_svc_cfg_clk_plan plan; - u8 *cmi_msg; - struct cmi_hdr *hdr; - int rc; - - t_info = container_of(work, struct cpe_info, clk_plan_work); - if (!t_info) { - pr_err("%s: Invalid handle for cpe_info\n", - __func__); - return; - } - - /* Register the core service */ - cpe_d.cpe_cmi_handle = cmi_register( - cpe_svc_core_cmi_handler, - CMI_CPE_CORE_SERVICE_ID); - - /* send the clk plan command */ - if (!cpe_d.cpe_query_freq_plans_cb) { - pr_err("%s: No support for querying clk plans\n", - __func__); - return; - } - - cpe_d.cpe_query_freq_plans_cb(cpe_d.cdc_priv, &plan); - size = sizeof(plan.current_clk_feq) + - sizeof(plan.num_clk_freqs); - size += plan.num_clk_freqs * - sizeof(plan.clk_freqs[0]); - cmi_msg = kzalloc(size + sizeof(struct cmi_hdr), - GFP_KERNEL); - if (!cmi_msg) - return; - - hdr = (struct cmi_hdr *) cmi_msg; - CMI_HDR_SET_OPCODE(hdr, - CPE_CORE_SVC_CMD_CFG_CLK_PLAN); - CMI_HDR_SET_SERVICE(hdr, CMI_CPE_CORE_SERVICE_ID); - CMI_HDR_SET_SESSION(hdr, 1); - CMI_HDR_SET_VERSION(hdr, CMI_DRIVER_SUPPORTED_VERSION); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, size); - memcpy(CMI_GET_PAYLOAD(cmi_msg), &plan, - size); - cmi_send_msg(cmi_msg); - - /* Wait for clk plan command to complete */ - rc = wait_for_completion_timeout(&t_info->core_svc_cmd_compl, - (10 * HZ)); - if (!rc) { - pr_err("%s: clk plan cmd timed out\n", - __func__); - goto cmd_fail; - } - - /* clk plan cmd is successful, send start notification */ - if (t_info->cpe_start_notification) - t_info->cpe_start_notification(t_info); - else - pr_err("%s: no start notification\n", - __func__); - -cmd_fail: - kfree(cmi_msg); - cmi_deregister(cpe_d.cpe_cmi_handle); -} - -static enum cpe_process_result cpe_boot_complete( - struct cpe_info *t_info) -{ - struct cmi_core_svc_cmdrsp_shared_mem_alloc *p = NULL; - - if (CMI_GET_OPCODE(t_info->tgt->outbox) != - CPE_CORE_SVC_CMDRSP_SHARED_MEM_ALLOC) { - broacast_boot_failed(); - return CPE_PROC_FAILED; - } - - p = (struct cmi_core_svc_cmdrsp_shared_mem_alloc *) - CMI_GET_PAYLOAD(t_info->tgt->outbox); - cpe_d.cpe_msg_buffer = p->addr; - - if (cpe_d.cpe_msg_buffer == 0) { - pr_err("%s: Invalid cpe buffer for message\n", - __func__); - broacast_boot_failed(); - return CPE_PROC_FAILED; - } - - cpe_change_state(t_info, CPE_STATE_IDLE, CPE_SS_IDLE); - cpe_create_worker_thread(t_info); - - if (t_info->codec_id != CPE_SVC_CODEC_TOMTOM) { - schedule_work(&t_info->clk_plan_work); - } else { - if (t_info->cpe_start_notification) - t_info->cpe_start_notification(t_info); - else - pr_err("%s: no start notification\n", - __func__); - } - - pr_debug("%s: boot complete\n", __func__); - return CPE_PROC_SUCCESS; -} - -static enum cpe_process_result cpe_process_send_msg( - struct cpe_info *t_info, - enum cpe_svc_result *cpe_rc, - struct cpe_command_node *command_node) -{ - enum cpe_process_result rc = CPE_PROC_SUCCESS; - struct cpe_send_msg *m = - (struct cpe_send_msg *)command_node->data; - u32 size = m->size; - - if (t_info->pending) { - pr_debug("%s: message queued\n", __func__); - *cpe_rc = CPE_SVC_SUCCESS; - return CPE_PROC_QUEUED; - } - - pr_debug("%s: Send CMI message, size = %u\n", - __func__, size); - - if (size <= t_info->tgt->tgt_get_cpe_info()->inbox_size) { - pr_debug("%s: Msg fits mailbox, size %u\n", - __func__, size); - cpe_change_state(t_info, CPE_STATE_SENDING_MSG, - CPE_SS_MSG_SEND_INBOX); - t_info->pending = m; - *cpe_rc = cpe_send_msg_to_inbox(t_info, 0, m); - } else if (size < CPE_MSG_BUFFER_SIZE) { - m->address = cpe_d.cpe_msg_buffer; - pr_debug("%s: Message req CMI mem access\n", - __func__); - t_info->pending = m; - cpe_change_state(t_info, CPE_STATE_SENDING_MSG, - CPE_SS_MSG_REQUEST_ACCESS); - *cpe_rc = cpe_send_msg_to_inbox(t_info, - CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ, m); - } else { - pr_debug("%s: Invalid msg size %u\n", - __func__, size); - cpe_command_cleanup(command_node); - rc = CPE_PROC_FAILED; - cpe_change_state(t_info, CPE_STATE_IDLE, - CPE_SS_IDLE); - } - - return rc; -} - -static enum cpe_process_result cpe_process_incoming( - struct cpe_info *t_info) -{ - enum cpe_process_result rc = CPE_PROC_FAILED; - struct cmi_hdr *hdr; - - hdr = CMI_GET_HEADER(t_info->tgt->outbox); - - if (CMI_HDR_GET_SERVICE(hdr) == - CMI_CPE_CORE_SERVICE_ID) { - pr_debug("%s: core service message received\n", - __func__); - - switch (CMI_GET_OPCODE(t_info->tgt->outbox)) { - case CPE_CORE_SVC_CMD_CLK_FREQ_REQUEST: - cpe_process_clk_change_req(t_info); - rc = CPE_PROC_SUCCESS; - break; - case CMI_MSG_TRANSPORT: - pr_debug("%s: transport msg received\n", - __func__); - rc = CPE_PROC_SUCCESS; - break; - case CPE_CMI_BASIC_RSP_OPCODE: - pr_debug("%s: received basic rsp\n", - __func__); - rc = CPE_PROC_SUCCESS; - break; - default: - pr_debug("%s: unknown message received\n", - __func__); - break; - } - } else { - /* if service id if for a CMI client, notify client */ - pr_debug("%s: Message received, notifying client\n", - __func__); - cpe_notify_cmi_client(t_info, - t_info->tgt->outbox, CPE_SVC_SUCCESS); - rc = CPE_PROC_SUCCESS; - } - - return rc; -} - -static enum cpe_process_result cpe_process_kill_thread( - struct cpe_info *t_info, - struct cpe_command_node *command_node) -{ - struct cpe_svc_notification payload; - - cpe_d.cpe_msg_buffer = 0; - payload.result = CPE_SVC_SHUTTING_DOWN; - payload.event = CPE_SVC_OFFLINE; - payload.payload = NULL; - payload.private_data = t_info->client_context; - /* - * Make state as offline before broadcasting - * the message to clients. - */ - cpe_change_state(t_info, CPE_STATE_OFFLINE, - CPE_SS_IDLE); - cpe_broadcast_notification(t_info, &payload); - - return CPE_PROC_KILLED; -} - -static enum cpe_process_result cpe_mt_process_cmd( - struct cpe_command_node *command_node) -{ - struct cpe_info *t_info = cpe_d.cpe_default_handle; - enum cpe_svc_result cpe_rc = CPE_SVC_SUCCESS; - enum cpe_process_result rc = CPE_PROC_SUCCESS; - struct cpe_send_msg *m; - struct cmi_hdr *hdr; - u8 service = 0; - u8 retries = 0; - - if (!t_info || !command_node) { - pr_err("%s: Invalid handle/command node\n", - __func__); - return CPE_PROC_FAILED; - } - - pr_debug("%s: cmd = %u\n", __func__, command_node->command); - - cpe_rc = cpe_is_command_valid(t_info, command_node->command); - - if (cpe_rc != CPE_SVC_SUCCESS) { - pr_err("%s: Invalid command %d, err = %d\n", - __func__, command_node->command, cpe_rc); - return CPE_PROC_FAILED; - } - - switch (command_node->command) { - - case CPE_CMD_BOOT_INITIALIZE: - rc = cpe_boot_initialize(t_info, &cpe_rc); - break; - - case CPE_CMD_BOOT_COMPLETE: - rc = cpe_boot_complete(t_info); - break; - - case CPE_CMD_SEND_MSG: - rc = cpe_process_send_msg(t_info, &cpe_rc, - command_node); - break; - - case CPE_CMD_SEND_TRANS_MSG: - m = (struct cpe_send_msg *)command_node->data; - - while (retries < CPE_SVC_INACTIVE_STATE_RETRIES_MAX) { - if (t_info->tgt->tgt_is_active()) { - ++retries; - /* Wait for CPE to be inactive */ - usleep_range(5000, 5100); - } else { - break; - } - } - - pr_debug("%s: cpe inactive after %d attempts\n", - __func__, retries); - - cpe_change_state(t_info, CPE_STATE_SENDING_MSG, - CPE_SS_MSG_SEND_INBOX); - rc = cpe_send_msg_to_inbox(t_info, 0, m); - break; - - case CPE_CMD_SEND_MSG_COMPLETE: - hdr = CMI_GET_HEADER(t_info->tgt->outbox); - service = CMI_HDR_GET_SERVICE(hdr); - pr_debug("%s: msg send success, notifying clients\n", - __func__); - cpe_command_cleanup(command_node); - t_info->pending = NULL; - cpe_change_state(t_info, - CPE_STATE_IDLE, CPE_SS_IDLE); - cpe_notify_cmi_client(t_info, - t_info->tgt->outbox, CPE_SVC_SUCCESS); - break; - - case CPE_CMD_PROC_INCOMING_MSG: - rc = cpe_process_incoming(t_info); - break; - - case CPE_CMD_KILL_THREAD: - rc = cpe_process_kill_thread(t_info, command_node); - break; - - default: - pr_err("%s: unhandled cpe cmd = %d\n", - __func__, command_node->command); - break; - } - - if (cpe_rc != CPE_SVC_SUCCESS) { - pr_err("%s: failed to execute command\n", __func__); - if (t_info->pending) { - m = (struct cpe_send_msg *)t_info->pending; - cpe_notify_cmi_client(t_info, m->payload, - CPE_SVC_FAILED); - t_info->pending = NULL; - } - - cpe_command_cleanup(command_node); - rc = CPE_PROC_FAILED; - cpe_change_state(t_info, CPE_STATE_IDLE, - CPE_SS_IDLE); - } - - return rc; -} - -static enum cpe_svc_result cpe_mt_validate_cmd( - const struct cpe_info *t_info, - enum cpe_command command) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - if ((t_info == NULL) || t_info->initialized == false) { - pr_err("%s: cpe service is not ready\n", - __func__); - return CPE_SVC_NOT_READY; - } - - switch (t_info->state) { - case CPE_STATE_UNINITIALIZED: - case CPE_STATE_INITIALIZED: - switch (command) { - case CPE_CMD_RESET: - case CPE_CMD_DL_SEGMENT: - case CPE_CMD_RAMDUMP: - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_KILL_THREAD: - case CPE_CMD_DEINITIALIZE: - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_SUCCESS; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - case CPE_STATE_DOWNLOADING: - switch (command) { - case CPE_CMD_RESET: - case CPE_CMD_DL_SEGMENT: - case CPE_CMD_BOOT: - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_SUCCESS; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - case CPE_STATE_BOOTING: - switch (command) { - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_BOOT_INITIALIZE: - case CPE_CMD_BOOT_COMPLETE: - case CPE_CMD_SHUTDOWN: - rc = CPE_SVC_SUCCESS; - break; - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_BUSY; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - case CPE_STATE_IDLE: - switch (command) { - case CPE_CMD_SEND_MSG: - case CPE_CMD_SEND_TRANS_MSG: - case CPE_CMD_SEND_MSG_COMPLETE: - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_RESET: - case CPE_CMD_SHUTDOWN: - case CPE_CMD_KILL_THREAD: - case CPE_CMD_PROC_INCOMING_MSG: - rc = CPE_SVC_SUCCESS; - break; - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_BUSY; - break; - default: - rc = CPE_SVC_FAILED; - break; - } - break; - - case CPE_STATE_SENDING_MSG: - switch (command) { - case CPE_CMD_SEND_MSG: - case CPE_CMD_SEND_TRANS_MSG: - case CPE_CMD_SEND_MSG_COMPLETE: - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_SHUTDOWN: - case CPE_CMD_KILL_THREAD: - case CPE_CMD_PROC_INCOMING_MSG: - rc = CPE_SVC_SUCCESS; - break; - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_BUSY; - break; - default: - rc = CPE_SVC_FAILED; - break; - } - break; - - case CPE_STATE_OFFLINE: - switch (command) { - case CPE_CMD_RESET: - case CPE_CMD_RAMDUMP: - case CPE_CMD_KILL_THREAD: - rc = CPE_SVC_SUCCESS; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - default: - pr_debug("%s: unhandled state %d\n", - __func__, t_info->state); - break; - } - - if (rc != CPE_SVC_SUCCESS) - pr_err("%s: invalid command %d, state = %d\n", - __func__, command, t_info->state); - return rc; -} - -void *cpe_svc_initialize( - void irq_control_callback(u32 enable), - const void *codec_info, void *context) -{ - struct cpe_info *t_info = NULL; - const struct cpe_svc_hw_cfg *cap = NULL; - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_svc_init_param *init_context = - (struct cpe_svc_init_param *) context; - void *client_context = NULL; - - if (cpe_d.cpe_default_handle && - cpe_d.cpe_default_handle->initialized == true) - return (void *)cpe_d.cpe_default_handle; - cpe_d.cpe_query_freq_plans_cb = NULL; - cpe_d.cpe_change_freq_plan_cb = NULL; - - if (context) { - client_context = init_context->context; - switch (init_context->version) { - case CPE_SVC_INIT_PARAM_V1: - cpe_d.cpe_query_freq_plans_cb = - init_context->query_freq_plans_cb; - cpe_d.cpe_change_freq_plan_cb = - init_context->change_freq_plan_cb; - break; - default: - break; - } - } - - if (!cpe_d.cpe_default_handle) { - cpe_d.cpe_default_handle = kzalloc(sizeof(struct cpe_info), - GFP_KERNEL); - if (!cpe_d.cpe_default_handle) - goto err_register; - - memset(cpe_d.cpe_default_handle, 0, - sizeof(struct cpe_info)); - } - - t_info = cpe_d.cpe_default_handle; - t_info->client_context = client_context; - - INIT_LIST_HEAD(&t_info->client_list); - cpe_d.cdc_priv = client_context; - INIT_WORK(&t_info->clk_plan_work, cpe_clk_plan_work); - init_completion(&t_info->core_svc_cmd_compl); - - t_info->tgt = kzalloc(sizeof(struct cpe_svc_tgt_abstraction), - GFP_KERNEL); - if (!t_info->tgt) - goto err_tgt_alloc; - t_info->codec_id = - ((struct cpe_svc_codec_info_v1 *) codec_info)->id; - - rc = cpe_svc_tgt_init((struct cpe_svc_codec_info_v1 *)codec_info, - t_info->tgt); - - if (rc != CPE_SVC_SUCCESS) - goto err_tgt_init; - - cap = t_info->tgt->tgt_get_cpe_info(); - - memset(t_info->tgt->outbox, 0, cap->outbox_size); - memset(t_info->tgt->inbox, 0, cap->inbox_size); - mutex_init(&t_info->msg_lock); - cpe_d.cpe_irq_control_callback = irq_control_callback; - t_info->cpe_process_command = cpe_mt_process_cmd; - t_info->cpe_cmd_validate = cpe_mt_validate_cmd; - t_info->cpe_start_notification = broadcast_boot_event; - mutex_init(&cpe_d.cpe_api_mutex); - mutex_init(&cpe_d.cpe_svc_lock); - pr_debug("%s: cpe services initialized\n", __func__); - t_info->state = CPE_STATE_INITIALIZED; - t_info->initialized = true; - - return t_info; - -err_tgt_init: - kfree(t_info->tgt); - -err_tgt_alloc: - kfree(cpe_d.cpe_default_handle); - cpe_d.cpe_default_handle = NULL; - -err_register: - return NULL; -} - -enum cpe_svc_result cpe_svc_deinitialize(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_DEINITIALIZE); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Invalid command %d\n", - __func__, CPE_CMD_DEINITIALIZE); - return rc; - } - - if (cpe_d.cpe_default_handle == t_info) - cpe_d.cpe_default_handle = NULL; - - t_info->tgt->tgt_deinit(t_info->tgt); - cpe_change_state(t_info, CPE_STATE_UNINITIALIZED, - CPE_SS_IDLE); - mutex_destroy(&t_info->msg_lock); - kfree(t_info->tgt); - kfree(t_info); - mutex_destroy(&cpe_d.cpe_api_mutex); - mutex_destroy(&cpe_d.cpe_svc_lock); - - return rc; -} - -void *cpe_svc_register(void *cpe_handle, - void (*notification_callback) - (const struct cpe_svc_notification *parameter), - u32 mask, const char *name) -{ - void *reg_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!cpe_d.cpe_default_handle) { - cpe_d.cpe_default_handle = kzalloc(sizeof(struct cpe_info), - GFP_KERNEL); - if (!cpe_d.cpe_default_handle) { - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return NULL; - } - - memset(cpe_d.cpe_default_handle, 0, - sizeof(struct cpe_info)); - } - - if (!cpe_handle) - cpe_handle = cpe_d.cpe_default_handle; - - reg_handle = cpe_register_generic((struct cpe_info *)cpe_handle, - notification_callback, - NULL, - mask, CPE_NO_SERVICE, name); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return reg_handle; -} - -enum cpe_svc_result cpe_svc_deregister(void *cpe_handle, void *reg_handle) -{ - enum cpe_svc_result rc; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!cpe_handle) - cpe_handle = cpe_d.cpe_default_handle; - - rc = cpe_deregister_generic((struct cpe_info *)cpe_handle, - reg_handle); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_download_segment(void *cpe_handle, - const struct cpe_svc_mem_segment *segment) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_DL_SEGMENT); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_DL_SEGMENT); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - cpe_toggle_irq_notification(t_info, false); - t_info->state = CPE_STATE_DOWNLOADING; - t_info->substate = CPE_SS_DL_DOWNLOADING; - rc = t_info->tgt->tgt_write_ram(t_info, segment); - cpe_toggle_irq_notification(t_info, true); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_boot(void *cpe_handle, int debug_mode) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_BOOT); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_BOOT); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - if (rc == CPE_SVC_SUCCESS) { - t_info->tgt->tgt_boot(debug_mode); - t_info->state = CPE_STATE_BOOTING; - t_info->substate = CPE_SS_BOOT; - pr_debug("%s: cpe service booting\n", - __func__); - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cpe_svc_result cpe_svc_process_irq(void *cpe_handle, u32 cpe_irq) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - cpe_toggle_irq_notification(t_info, false); - cpe_process_irq_int(cpe_irq, t_info); - cpe_toggle_irq_notification(t_info, true); - - return rc; -} - -enum cpe_svc_result cpe_svc_route_notification(void *cpe_handle, - enum cpe_svc_module module, enum cpe_svc_route_dest dest) -{ - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - enum cpe_svc_result rc = CPE_SVC_NOT_READY; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - rc = t_info->tgt->tgt_route_notification(module, dest); - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -static enum cpe_svc_result __cpe_svc_shutdown(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - struct cpe_command_node *n = NULL; - struct cpe_command_node kill_cmd; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_SHUTDOWN); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_SHUTDOWN); - return rc; - } - - while (!list_empty(&t_info->main_queue)) { - n = list_first_entry(&t_info->main_queue, - struct cpe_command_node, list); - - if (n->command == CPE_CMD_SEND_MSG) { - cpe_notify_cmi_client(t_info, (u8 *)n->data, - CPE_SVC_SHUTTING_DOWN); - } - /* - * Since command cannot be processed, - * delete it from the list and perform cleanup - */ - list_del(&n->list); - cpe_command_cleanup(n); - kfree(n); - } - - pr_debug("%s: cpe service OFFLINE state\n", __func__); - - t_info->state = CPE_STATE_OFFLINE; - t_info->substate = CPE_SS_IDLE; - - memset(&kill_cmd, 0, sizeof(kill_cmd)); - kill_cmd.command = CPE_CMD_KILL_THREAD; - - if (t_info->pending) { - struct cpe_send_msg *m = - (struct cpe_send_msg *)t_info->pending; - cpe_notify_cmi_client(t_info, m->payload, - CPE_SVC_SHUTTING_DOWN); - kfree(t_info->pending); - t_info->pending = NULL; - } - - cpe_cleanup_worker_thread(t_info); - t_info->cpe_process_command(&kill_cmd); - - return rc; -} - -enum cpe_svc_result cpe_svc_shutdown(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - rc = __cpe_svc_shutdown(cpe_handle); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cpe_svc_result cpe_svc_reset(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_RESET); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_RESET); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - if (t_info && t_info->tgt) { - rc = t_info->tgt->tgt_reset(); - pr_debug("%s: cpe services in INITIALIZED state\n", - __func__); - t_info->state = CPE_STATE_INITIALIZED; - t_info->substate = CPE_SS_IDLE; - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_ramdump(void *cpe_handle, - struct cpe_svc_mem_segment *buffer) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_RAMDUMP); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_RAMDUMP); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - if (t_info->tgt) { - rc = t_info->tgt->tgt_read_ram(t_info, buffer); - } else { - pr_err("%s: cpe service not ready\n", __func__); - rc = CPE_SVC_NOT_READY; - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_set_debug_mode(void *cpe_handle, u32 mode) -{ - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - enum cpe_svc_result rc = CPE_SVC_INVALID_HANDLE; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - rc = t_info->tgt->tgt_set_debug_mode(mode); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -const struct cpe_svc_hw_cfg *cpe_svc_get_hw_cfg(void *cpe_handle) -{ - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - return t_info->tgt->tgt_get_cpe_info(); - - return NULL; -} - -void *cmi_register( - void notification_callback( - const struct cmi_api_notification *parameter), - u32 service) -{ - void *reg_handle = NULL; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - reg_handle = cpe_register_generic(cpe_d.cpe_default_handle, - NULL, - notification_callback, - (CPE_SVC_CMI_MSG | CPE_SVC_OFFLINE | - CPE_SVC_ONLINE), - service, - "CMI_CLIENT"); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return reg_handle; -} - -enum cmi_api_result cmi_deregister(void *reg_handle) -{ - u32 clients = 0; - struct cpe_notif_node *n = NULL; - enum cmi_api_result rc = CMI_API_SUCCESS; - struct cpe_svc_notification payload; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - rc = (enum cmi_api_result) cpe_deregister_generic( - cpe_d.cpe_default_handle, reg_handle); - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_for_each_entry(n, &cpe_d.cpe_default_handle->client_list, list) { - if (n->mask & CPE_SVC_CMI_MSG) - clients++; - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - - if (clients == 0) { - payload.event = CPE_SVC_CMI_CLIENTS_DEREG; - payload.payload = NULL; - payload.result = CPE_SVC_SUCCESS; - cpe_broadcast_notification(cpe_d.cpe_default_handle, &payload); - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cmi_api_result cmi_send_msg(void *message) -{ - enum cmi_api_result rc = CMI_API_SUCCESS; - struct cpe_send_msg *msg = NULL; - struct cmi_hdr *hdr; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - hdr = CMI_GET_HEADER(message); - msg = kzalloc(sizeof(struct cpe_send_msg), - GFP_ATOMIC); - if (!msg) { - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return CPE_SVC_NO_MEMORY; - } - - if (CMI_HDR_GET_OBM_FLAG(hdr) == CMI_OBM_FLAG_OUT_BAND) - msg->isobm = 1; - else - msg->isobm = 0; - - msg->size = sizeof(struct cmi_hdr) + - CMI_HDR_GET_PAYLOAD_SIZE(hdr); - - msg->payload = kzalloc(msg->size, GFP_ATOMIC); - if (!msg->payload) { - kfree(msg); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return CPE_SVC_NO_MEMORY; - } - - msg->address = 0; - memcpy((void *)msg->payload, message, msg->size); - - rc = (enum cmi_api_result) cpe_send_cmd_to_thread( - cpe_d.cpe_default_handle, - CPE_CMD_SEND_MSG, - (void *)msg, false); - - if (rc != 0) { - pr_err("%s: Failed to queue message\n", __func__); - kfree(msg->payload); - kfree(msg); - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cpe_svc_result cpe_svc_ftm_test(void *cpe_handle, u32 *status) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - struct cpe_svc_mem_segment backup_seg; - struct cpe_svc_mem_segment waiti_seg; - u8 *backup_data = NULL; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_FTM_TEST); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_FTM_TEST); - goto fail_cmd; - } - - if (t_info && t_info->tgt) { - backup_data = kzalloc( - t_info->tgt->tgt_waiti_info->tgt_waiti_size, - GFP_KERNEL); - - /* CPE reset */ - rc = t_info->tgt->tgt_reset(); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: CPE reset fail! err = %d\n", - __func__, rc); - goto err_return; - } - - /* Back up the 4 byte IRAM data first */ - backup_seg.type = CPE_SVC_INSTRUCTION_MEM; - backup_seg.cpe_addr = - t_info->tgt->tgt_get_cpe_info()->IRAM_offset; - backup_seg.size = t_info->tgt->tgt_waiti_info->tgt_waiti_size; - backup_seg.data = backup_data; - - pr_debug("%s: Backing up IRAM data from CPE\n", - __func__); - - rc = t_info->tgt->tgt_read_ram(t_info, &backup_seg); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to backup CPE IRAM data, err = %d\n", - __func__, rc); - goto err_return; - } - - pr_debug("%s: Complete backing up IRAM data from CPE\n", - __func__); - - /* Write the WAITI instruction data */ - waiti_seg.type = CPE_SVC_INSTRUCTION_MEM; - waiti_seg.cpe_addr = - t_info->tgt->tgt_get_cpe_info()->IRAM_offset; - waiti_seg.size = t_info->tgt->tgt_waiti_info->tgt_waiti_size; - waiti_seg.data = t_info->tgt->tgt_waiti_info->tgt_waiti_data; - - rc = t_info->tgt->tgt_write_ram(t_info, &waiti_seg); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to write the WAITI data, err = %d\n", - __func__, rc); - goto restore_iram; - } - - /* Boot up cpe to execute the WAITI instructions */ - rc = t_info->tgt->tgt_boot(1); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to boot CPE, err = %d\n", - __func__, rc); - goto reset; - } - - /* - * 1ms delay is suggested by the hw team to - * wait for cpe to boot up. - */ - usleep_range(1000, 1100); - - /* Check if the cpe init is done after executing the WAITI */ - *status = t_info->tgt->tgt_cpar_init_done(); - -reset: - /* Set the cpe back to reset state */ - rc = t_info->tgt->tgt_reset(); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: CPE reset fail! err = %d\n", - __func__, rc); - goto restore_iram; - } - -restore_iram: - /* Restore the IRAM 4 bytes data */ - rc = t_info->tgt->tgt_write_ram(t_info, &backup_seg); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to restore the IRAM data, err = %d\n", - __func__, rc); - goto err_return; - } - } - -err_return: - kfree(backup_data); -fail_cmd: - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -static enum cpe_svc_result cpe_tgt_tomtom_boot(int debug_mode) -{ - return CPE_SVC_SUCCESS; -} - -static u32 cpe_tgt_tomtom_is_cpar_init_done(void) -{ - return 0; -} - -static u32 cpe_tgt_tomtom_is_active(void) -{ - return 0; -} - -static enum cpe_svc_result cpe_tgt_tomtom_reset(void) -{ - return CPE_SVC_SUCCESS; -} - -enum cpe_svc_result cpe_tgt_tomtom_voicetx(bool enable) -{ - return CPE_SVC_SUCCESS; -} - -enum cpe_svc_result cpe_svc_toggle_lab(void *cpe_handle, bool enable) -{ - - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - return t_info->tgt->tgt_voice_tx_lab(enable); - else - return CPE_SVC_INVALID_HANDLE; -} - -static enum cpe_svc_result cpe_tgt_tomtom_read_mailbox(u8 *buffer, - size_t size) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_write_mailbox(u8 *buffer, - size_t size) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_read_RAM(struct cpe_info *t_info, - struct cpe_svc_mem_segment *mem_seg) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_write_RAM(struct cpe_info *t_info, - const struct cpe_svc_mem_segment *mem_seg) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_route_notification( - enum cpe_svc_module module, - enum cpe_svc_route_dest dest) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_set_debug_mode(u32 enable) -{ - return CPE_SVC_SUCCESS; -} - -static const struct cpe_svc_hw_cfg *cpe_tgt_tomtom_get_cpe_info(void) -{ - return &cpe_svc_tomtom_info; -} - -static enum cpe_svc_result cpe_tgt_tomtom_deinit( - struct cpe_svc_tgt_abstraction *param) -{ - kfree(param->inbox); - param->inbox = NULL; - kfree(param->outbox); - param->outbox = NULL; - memset(param, 0, sizeof(struct cpe_svc_tgt_abstraction)); - return CPE_SVC_SUCCESS; -} - -static u8 cpe_tgt_tomtom_waiti_data[] = {0x00, 0x70, 0x00, 0x00}; - -static struct cpe_tgt_waiti_info cpe_tgt_tomtom_waiti_info = { - .tgt_waiti_size = ARRAY_SIZE(cpe_tgt_tomtom_waiti_data), - .tgt_waiti_data = cpe_tgt_tomtom_waiti_data, -}; - -static enum cpe_svc_result cpe_tgt_tomtom_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param) -{ - if (!codec_info) - return CPE_SVC_INVALID_HANDLE; - if (!param) - return CPE_SVC_INVALID_HANDLE; - - if (codec_info->id == CPE_SVC_CODEC_TOMTOM) { - param->tgt_boot = cpe_tgt_tomtom_boot; - param->tgt_cpar_init_done = cpe_tgt_tomtom_is_cpar_init_done; - param->tgt_is_active = cpe_tgt_tomtom_is_active; - param->tgt_reset = cpe_tgt_tomtom_reset; - param->tgt_read_mailbox = cpe_tgt_tomtom_read_mailbox; - param->tgt_write_mailbox = cpe_tgt_tomtom_write_mailbox; - param->tgt_read_ram = cpe_tgt_tomtom_read_RAM; - param->tgt_write_ram = cpe_tgt_tomtom_write_RAM; - param->tgt_route_notification = - cpe_tgt_tomtom_route_notification; - param->tgt_set_debug_mode = cpe_tgt_tomtom_set_debug_mode; - param->tgt_get_cpe_info = cpe_tgt_tomtom_get_cpe_info; - param->tgt_deinit = cpe_tgt_tomtom_deinit; - param->tgt_voice_tx_lab = cpe_tgt_tomtom_voicetx; - param->tgt_waiti_info = &cpe_tgt_tomtom_waiti_info; - - param->inbox = kzalloc(TOMTOM_A_SVASS_SPE_INBOX_SIZE, - GFP_KERNEL); - if (!param->inbox) - return CPE_SVC_NO_MEMORY; - - param->outbox = kzalloc(TOMTOM_A_SVASS_SPE_OUTBOX_SIZE, - GFP_KERNEL); - if (!param->outbox) { - kfree(param->inbox); - return CPE_SVC_NO_MEMORY; - } - } - - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_boot(int debug_mode) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - if (!debug_mode) - rc |= cpe_update_bits( - WCD9335_CPE_SS_WDOG_CFG, - 0x3f, 0x31); - else - pr_info("%s: CPE in debug mode, WDOG disabled\n", - __func__); - - rc |= cpe_register_write(WCD9335_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 19); - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x04, 0x00); - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x02, 0x02); - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x01, 0x01); - - if (unlikely(rc)) { - pr_err("%s: Failed to boot, err = %d\n", - __func__, rc); - rc = CPE_SVC_FAILED; - } - - return rc; -} - -static u32 cpe_tgt_wcd9335_is_cpar_init_done(void) -{ - u8 temp = 0; - - cpe_register_read(WCD9335_CPE_SS_STATUS, &temp); - return temp & 0x1; -} - -static u32 cpe_tgt_wcd9335_is_active(void) -{ - u8 temp = 0; - - cpe_register_read(WCD9335_CPE_SS_STATUS, &temp); - return temp & 0x4; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_reset(void) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CFG, 0x01, 0x00); - - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_IRAM_SHUTDOWN, 0x00); - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN, 0x00); - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_1, 0x00); - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_2, 0x00); - - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x04, 0x04); - - if (unlikely(rc)) { - pr_err("%s: failed to reset cpe, err = %d\n", - __func__, rc); - rc = CPE_SVC_FAILED; - } - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_read_mailbox(u8 *buffer, - size_t size) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u32 cnt = 0; - - pr_debug("%s: size=%zd\n", __func__, size); - - if (size > WCD9335_CPE_SS_SPE_OUTBOX_SIZE) - size = WCD9335_CPE_SS_SPE_OUTBOX_SIZE; - - for (cnt = 0; (cnt < size) && (rc == CPE_SVC_SUCCESS); cnt++) - rc = cpe_register_read(WCD9335_CPE_SS_SPE_OUTBOX1(cnt), - &buffer[cnt]); - - rc = cpe_register_write(WCD9335_CPE_SS_OUTBOX1_ACK, 0x01); - - if (unlikely(rc)) { - pr_err("%s: failed to ACK outbox, err = %d\n", - __func__, rc); - rc = CPE_SVC_FAILED; - } - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_write_mailbox(u8 *buffer, - size_t size) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u32 cnt = 0; - - pr_debug("%s: size = %zd\n", __func__, size); - if (size > WCD9335_CPE_SS_SPE_INBOX_SIZE) - size = WCD9335_CPE_SS_SPE_INBOX_SIZE; - for (cnt = 0; (cnt < size) && (rc == CPE_SVC_SUCCESS); cnt++) { - rc |= cpe_register_write(WCD9335_CPE_SS_SPE_INBOX1(cnt), - buffer[cnt]); - } - - if (unlikely(rc)) { - pr_err("%s: Error %d writing mailbox registers\n", - __func__, rc); - return rc; - } - - rc = cpe_register_write(WCD9335_CPE_SS_INBOX1_TRG, 1); - return rc; -} - -static enum cpe_svc_result cpe_wcd9335_get_mem_addr(struct cpe_info *t_info, - const struct cpe_svc_mem_segment *mem_seg, - u32 *addr, u8 *mem) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u32 offset, mem_sz, address; - u8 mem_type; - - switch (mem_seg->type) { - case CPE_SVC_DATA_MEM: - mem_type = MEM_ACCESS_DRAM_VAL; - offset = WCD9335_CPE_SS_SPE_DRAM_OFFSET; - mem_sz = WCD9335_CPE_SS_SPE_DRAM_SIZE; - break; - - case CPE_SVC_INSTRUCTION_MEM: - mem_type = MEM_ACCESS_IRAM_VAL; - offset = WCD9335_CPE_SS_SPE_IRAM_OFFSET; - mem_sz = WCD9335_CPE_SS_SPE_IRAM_SIZE; - break; - - default: - pr_err("%s: Invalid mem type = %u\n", - __func__, mem_seg->type); - return CPE_SVC_INVALID_HANDLE; - } - - if (mem_seg->cpe_addr < offset) { - pr_err("%s: Invalid addr %x for mem type %u\n", - __func__, mem_seg->cpe_addr, mem_type); - return CPE_SVC_INVALID_HANDLE; - } - - address = mem_seg->cpe_addr - offset; - if (address + mem_seg->size > mem_sz) { - pr_err("%s: wrong size %zu, start address %x, mem_type %u\n", - __func__, mem_seg->size, address, mem_type); - return CPE_SVC_INVALID_HANDLE; - } - - (*addr) = address; - (*mem) = mem_type; - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_read_RAM(struct cpe_info *t_info, - struct cpe_svc_mem_segment *mem_seg) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u8 temp = 0; - u32 cnt = 0; - u8 mem = 0x0; - u32 addr = 0; - u32 lastaddr = 0; - u32 ptr_update = true; - bool autoinc; - - if (!mem_seg) { - pr_err("%s: Invalid buffer\n", __func__); - return CPE_SVC_INVALID_HANDLE; - } - - rc = cpe_wcd9335_get_mem_addr(t_info, mem_seg, &addr, &mem); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Cannot obtain address, mem_type %u\n", - __func__, mem_seg->type); - return rc; - } - - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - autoinc = cpe_register_read_autoinc_supported(); - - if (autoinc) - temp = 0x18; - else - temp = 0x10; - - temp |= mem; - - lastaddr = ~addr; - do { - if (!autoinc || (ptr_update)) { - /* write LSB only if modified */ - if ((lastaddr & 0xFF) != (addr & 0xFF)) - rc |= cpe_register_write( - WCD9335_CPE_SS_MEM_PTR_0, - (addr & 0xFF)); - /* write middle byte only if modified */ - if (((lastaddr >> 8) & 0xFF) != ((addr >> 8) & 0xFF)) - rc |= cpe_register_write( - WCD9335_CPE_SS_MEM_PTR_1, - ((addr>>8) & 0xFF)); - /* write MSB only if modified */ - if (((lastaddr >> 16) & 0xFF) != ((addr >> 16) & 0xFF)) - rc |= cpe_register_write( - WCD9335_CPE_SS_MEM_PTR_2, - ((addr>>16) & 0xFF)); - - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, temp); - lastaddr = addr; - addr++; - ptr_update = false; - } - - rc |= cpe_register_read(WCD9335_CPE_SS_MEM_BANK_0, - &mem_seg->data[cnt]); - - if (!autoinc) - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - } while ((++cnt < mem_seg->size) || - (rc != CPE_SVC_SUCCESS)); - - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - - if (rc) - pr_err("%s: Failed to read registers, err = %d\n", - __func__, rc); - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_write_RAM(struct cpe_info *t_info, - const struct cpe_svc_mem_segment *mem_seg) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u8 mem_reg_val = 0; - u8 mem = MEM_ACCESS_NONE_VAL; - u32 addr = 0; - u8 *temp_ptr = NULL; - u32 temp_size = 0; - bool autoinc; - - if (!mem_seg) { - pr_err("%s: Invalid mem segment\n", - __func__); - return CPE_SVC_INVALID_HANDLE; - } - - rc = cpe_wcd9335_get_mem_addr(t_info, mem_seg, &addr, &mem); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Cannot obtain address, mem_type %u\n", - __func__, mem_seg->type); - return rc; - } - - autoinc = cpe_register_read_autoinc_supported(); - if (autoinc) - mem_reg_val = 0x18; - else - mem_reg_val = 0x10; - - mem_reg_val |= mem; - - rc = cpe_update_bits(WCD9335_CPE_SS_MEM_CTRL, - 0x0F, mem_reg_val); - - rc = cpe_register_write(WCD9335_CPE_SS_MEM_PTR_0, - (addr & 0xFF)); - rc = cpe_register_write(WCD9335_CPE_SS_MEM_PTR_1, - ((addr >> 8) & 0xFF)); - - rc = cpe_register_write(WCD9335_CPE_SS_MEM_PTR_2, - ((addr >> 16) & 0xFF)); - - temp_size = 0; - temp_ptr = mem_seg->data; - - while (temp_size <= mem_seg->size) { - u32 to_write = (mem_seg->size >= temp_size+CHUNK_SIZE) - ? CHUNK_SIZE : (mem_seg->size - temp_size); - - if (t_info->state == CPE_STATE_OFFLINE) { - pr_err("%s: CPE is offline\n", __func__); - return CPE_SVC_FAILED; - } - - cpe_register_write_repeat(WCD9335_CPE_SS_MEM_BANK_0, - temp_ptr, to_write); - temp_size += CHUNK_SIZE; - temp_ptr += CHUNK_SIZE; - } - - rc = cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - - if (rc) - pr_err("%s: Failed to write registers, err = %d\n", - __func__, rc); - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_route_notification( - enum cpe_svc_module module, - enum cpe_svc_route_dest dest) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - pr_debug("%s: Module = %d, Destination = %d\n", - __func__, module, dest); - - switch (module) { - case CPE_SVC_LISTEN_PROC: - switch (dest) { - case CPE_SVC_EXTERNAL: - rc = cpe_update_bits(WCD9335_CPE_SS_CFG, 0x01, 0x01); - break; - case CPE_SVC_INTERNAL: - rc = cpe_update_bits(WCD9335_CPE_SS_CFG, 0x01, 0x00); - break; - default: - pr_err("%s: Invalid destination %d\n", - __func__, dest); - return CPE_SVC_FAILED; - } - break; - default: - pr_err("%s: Invalid module %d\n", - __func__, module); - rc = CPE_SVC_FAILED; - break; - } - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_set_debug_mode(u32 enable) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - pr_debug("%s: enable = %s\n", __func__, - (enable) ? "true" : "false"); - - return rc; -} - -static const struct cpe_svc_hw_cfg *cpe_tgt_wcd9335_get_cpe_info(void) -{ - return &cpe_svc_wcd9335_info; -} - -static enum cpe_svc_result -cpe_tgt_wcd9335_deinit(struct cpe_svc_tgt_abstraction *param) -{ - kfree(param->inbox); - param->inbox = NULL; - kfree(param->outbox); - param->outbox = NULL; - memset(param, 0, sizeof(struct cpe_svc_tgt_abstraction)); - - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result - cpe_tgt_wcd9335_voicetx(bool enable) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u8 val = 0; - - pr_debug("%s: enable = %u\n", __func__, enable); - if (enable) - val = 0x02; - else - val = 0x00; - - rc = cpe_update_bits(WCD9335_CPE_SS_CFG, 0x02, val); - val = 0; - cpe_register_read(WCD9335_CPE_SS_CFG, &val); - - return rc; -} - -static u8 cpe_tgt_wcd9335_waiti_data[] = {0x00, 0x70, 0x00, 0x00}; - -static struct cpe_tgt_waiti_info cpe_tgt_wcd9335_waiti_info = { - .tgt_waiti_size = ARRAY_SIZE(cpe_tgt_wcd9335_waiti_data), - .tgt_waiti_data = cpe_tgt_wcd9335_waiti_data, -}; - -static enum cpe_svc_result cpe_tgt_wcd9335_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param) -{ - if (!codec_info) - return CPE_SVC_INVALID_HANDLE; - if (!param) - return CPE_SVC_INVALID_HANDLE; - - if (codec_info->id == CPE_SVC_CODEC_WCD9335) { - param->tgt_boot = cpe_tgt_wcd9335_boot; - param->tgt_cpar_init_done = cpe_tgt_wcd9335_is_cpar_init_done; - param->tgt_is_active = cpe_tgt_wcd9335_is_active; - param->tgt_reset = cpe_tgt_wcd9335_reset; - param->tgt_read_mailbox = cpe_tgt_wcd9335_read_mailbox; - param->tgt_write_mailbox = cpe_tgt_wcd9335_write_mailbox; - param->tgt_read_ram = cpe_tgt_wcd9335_read_RAM; - param->tgt_write_ram = cpe_tgt_wcd9335_write_RAM; - param->tgt_route_notification = - cpe_tgt_wcd9335_route_notification; - param->tgt_set_debug_mode = cpe_tgt_wcd9335_set_debug_mode; - param->tgt_get_cpe_info = cpe_tgt_wcd9335_get_cpe_info; - param->tgt_deinit = cpe_tgt_wcd9335_deinit; - param->tgt_voice_tx_lab = cpe_tgt_wcd9335_voicetx; - param->tgt_waiti_info = &cpe_tgt_wcd9335_waiti_info; - - param->inbox = kzalloc(WCD9335_CPE_SS_SPE_INBOX_SIZE, - GFP_KERNEL); - if (!param->inbox) - return CPE_SVC_NO_MEMORY; - - param->outbox = kzalloc(WCD9335_CPE_SS_SPE_OUTBOX_SIZE, - GFP_KERNEL); - if (!param->outbox) { - kfree(param->inbox); - return CPE_SVC_NO_MEMORY; - } - } - - return CPE_SVC_SUCCESS; -} - -MODULE_DESCRIPTION("WCD CPE Services"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd_cpe_services.h b/techpack/audio/4.0/asoc/codecs/wcd_cpe_services.h deleted file mode 100644 index caf645bb5614..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcd_cpe_services.h +++ /dev/null @@ -1,171 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. - */ - -#ifndef __CPE_SERVICES__ -#define __CPE_SERVICES__ - -#define CPE_IRQ_OUTBOX_IRQ 0x01 -#define CPE_IRQ_MEM_ACCESS_ERROR 0x02 -#define CPE_IRQ_WDOG_BITE 0x04 -#define CPE_IRQ_BUFFER_OVERFLOW 0x08 -#define CPE_IRQ_LAB_OVFUNF 0x10 -#define CPE_IRQ_FLL_LOCK_LOST 0x20 -#define CPE_IRQ_RCO_WDOG_INT 0x40 - -#define EFAILED (MAX_ERRNO - 1) -#define ENOTREADY (MAX_ERRNO - 2) - -#define MAX_SUPPORTED_CLKFREQ 8 -#define CPE_SVC_INIT_PARAM_V1 1 - -enum cpe_svc_result { - CPE_SVC_SUCCESS = 0, - CPE_SVC_FAILED = -EFAILED, - CPE_SVC_NO_MEMORY = -ENOMEM, - CPE_SVC_INVALID_HANDLE = -EINVAL, - CPE_SVC_NOT_READY = -ENOTREADY, - CPE_SVC_SHUTTING_DOWN = -ESHUTDOWN, - CPE_SVC_BUSY = -EBUSY, -}; - -enum cpe_svc_event { - CPE_SVC_CMI_MSG = 0x01, - CPE_SVC_OFFLINE = 0x02, - CPE_SVC_ONLINE = 0x04, - CPE_SVC_BOOT_FAILED = 0x08, - CPE_SVC_READ_COMPLETE = 0x10, - CPE_SVC_READ_ERROR = 0x20, - CPE_SVC_BOOT = 0x40, - CPE_SVC_CMI_CLIENTS_DEREG = 0x100, - CPE_SVC_EVENT_ANCHOR = 0x7FFF -}; - -enum cpe_svc_module { - CPE_SVC_LISTEN_PROC = 1, - CPE_SVC_MODULE_ANCHOR = 0x7F -}; - -enum cpe_svc_route_dest { - CPE_SVC_EXTERNAL = 1, - CPE_SVC_INTERNAL = 2, - CPE_SVC_ROUTE_ANCHOR = 0x7F -}; - -enum cpe_svc_mem_type { - CPE_SVC_DATA_MEM = 1, - CPE_SVC_INSTRUCTION_MEM = 2, - CPE_SVC_IPC_MEM = 3, - CPE_SVC_MEM_TYPE_ANCHOR = 0x7F -}; - -enum cpe_svc_codec_id { - CPE_SVC_CODEC_TOMTOM = 5, - CPE_SVC_CODEC_WCD9335 = 7, - CPE_SVC_CODEC_WCD9326 = 8, - CPE_SVC_CODEC_ID_ANCHOR = 0x7ffffff -}; - -enum cpe_svc_codec_version { - CPE_SVC_CODEC_V1P0 = 1, - CPE_SVC_CODEC_VERSION_ANCHOR = 0x7fffffff -}; - -struct cpe_svc_codec_info_v1 { - u16 major_version;/*must be 1*/ - u16 minor_version;/*must be 0*/ - u32 id; - u32 version; - /*Add 1.1 version fields after this line*/ -}; - -struct cpe_svc_notification { - enum cpe_svc_event event; - enum cpe_svc_result result; - void *payload; - void *private_data; -}; - -struct cpe_svc_msg_payload { - u8 *cmi_msg; -}; - -struct cpe_svc_read_complete { - u8 *buffer; - size_t size; -}; - -struct cpe_svc_boot_event { - u32 debug_address; - size_t debug_buffer_size; - u32 status; -}; - -struct cpe_svc_mem_segment { - enum cpe_svc_mem_type type; - u32 cpe_addr; - size_t size; - u8 *data; -}; - -struct cpe_svc_hw_cfg { - size_t DRAM_size; - u32 DRAM_offset; - size_t IRAM_size; - u32 IRAM_offset; - u8 inbox_size; - u8 outbox_size; -}; - -struct cpe_svc_cfg_clk_plan { - u32 current_clk_feq; - u32 num_clk_freqs; - u32 clk_freqs[MAX_SUPPORTED_CLKFREQ]; -}; - -struct cpe_svc_init_param { - void *context; - u32 version; - void (*query_freq_plans_cb)(void *cdc_priv, - struct cpe_svc_cfg_clk_plan *clk_freq); - void (*change_freq_plan_cb)(void *cdc_priv, - u32 clk_freq); -}; - - -void *cpe_svc_initialize( - void irq_control_callback(u32 enable), - const void *codec_info, void *context); -enum cpe_svc_result cpe_svc_deinitialize(void *cpe_handle); - -void *cpe_svc_register(void *cpe_handle, - void (*notification_callback)( - const struct cpe_svc_notification *parameter), - u32 mask, const char *name); - -enum cpe_svc_result cpe_svc_deregister(void *cpe_handle, void *reg_handle); - -enum cpe_svc_result cpe_svc_download_segment(void *cpe_handle, - const struct cpe_svc_mem_segment *segment); - -enum cpe_svc_result cpe_svc_boot(void *cpe_handle, int debug_mode); - -enum cpe_svc_result cpe_svc_shutdown(void *cpe_handle); - -enum cpe_svc_result cpe_svc_reset(void *cpe_handle); - -enum cpe_svc_result cpe_svc_process_irq(void *cpe_handle, u32 cpe_irq); - -enum cpe_svc_result -cpe_svc_route_notification(void *cpe_handle, enum cpe_svc_module module, - enum cpe_svc_route_dest dest); - -enum cpe_svc_result cpe_svc_ramdump(void *cpe_handle, - struct cpe_svc_mem_segment *buffer); - -enum cpe_svc_result cpe_svc_set_debug_mode(void *cpe_handle, u32 mode); - -const struct cpe_svc_hw_cfg *cpe_svc_get_hw_cfg(void *cpe_handle); -enum cpe_svc_result cpe_svc_toggle_lab(void *cpe_handle, bool enable); -enum cpe_svc_result cpe_svc_ftm_test(void *cpe_handle, u32 *status); -#endif /*__CPE_SERVICES__*/ diff --git a/techpack/audio/4.0/asoc/codecs/wcdcal-hwdep.c b/techpack/audio/4.0/asoc/codecs/wcdcal-hwdep.c deleted file mode 100644 index e0fd80f342bc..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wcdcal-hwdep.c +++ /dev/null @@ -1,215 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015, 2017-2018 The Linux Foundation. All rights reserved. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int cal_size_info[WCD9XXX_MAX_CAL] = { - [WCD9XXX_ANC_CAL] = 16384, - [WCD9XXX_MBHC_CAL] = 4096, - [WCD9XXX_MAD_CAL] = 4096, - [WCD9XXX_VBAT_CAL] = 72, -}; - -const char *cal_name_info[WCD9XXX_MAX_CAL] = { - [WCD9XXX_ANC_CAL] = "anc", - [WCD9XXX_MBHC_CAL] = "mbhc", - [WCD9XXX_MAD_CAL] = "mad", - [WCD9XXX_VBAT_CAL] = "vbat", -}; - -struct firmware_cal *wcdcal_get_fw_cal(struct fw_info *fw_data, - enum wcd_cal_type type) -{ - if (!fw_data) { - pr_err("%s: fw_data is NULL\n", __func__); - return NULL; - } - if (type >= WCD9XXX_MAX_CAL || - type < WCD9XXX_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", __func__, type); - return NULL; - } - mutex_lock(&fw_data->lock); - if (!test_bit(WCDCAL_RECIEVED, - &fw_data->wcdcal_state[type])) { - pr_err("%s: cal not sent by userspace %d\n", - __func__, type); - mutex_unlock(&fw_data->lock); - return NULL; - } - mutex_unlock(&fw_data->lock); - return fw_data->fw[type]; -} -EXPORT_SYMBOL(wcdcal_get_fw_cal); - -static int wcdcal_hwdep_ioctl_shared(struct snd_hwdep *hw, - struct wcdcal_ioctl_buffer fw_user) -{ - struct fw_info *fw_data = hw->private_data; - struct firmware_cal **fw = fw_data->fw; - void *data; - - if (!test_bit(fw_user.cal_type, fw_data->cal_bit)) { - pr_err("%s: codec didn't set this %d!!\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.cal_type >= WCD9XXX_MAX_CAL || - fw_user.cal_type < WCD9XXX_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.size > cal_size_info[fw_user.cal_type] || - fw_user.size <= 0) { - pr_err("%s: incorrect firmware size %d for %s\n", - __func__, fw_user.size, - cal_name_info[fw_user.cal_type]); - return -EFAULT; - } - data = fw[fw_user.cal_type]->data; - if (copy_from_user(data, fw_user.buffer, fw_user.size)) - return -EFAULT; - fw[fw_user.cal_type]->size = fw_user.size; - mutex_lock(&fw_data->lock); - set_bit(WCDCAL_RECIEVED, &fw_data->wcdcal_state[fw_user.cal_type]); - mutex_unlock(&fw_data->lock); - return 0; -} - -#ifdef CONFIG_COMPAT -struct wcdcal_ioctl_buffer32 { - u32 size; - compat_uptr_t buffer; - enum wcd_cal_type cal_type; -}; - -enum { - SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32 = - _IOW('U', 0x1, struct wcdcal_ioctl_buffer32), -}; - -static int wcdcal_hwdep_ioctl_compat(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct wcdcal_ioctl_buffer __user *argp = (void __user *)arg; - struct wcdcal_ioctl_buffer32 fw_user32; - struct wcdcal_ioctl_buffer fw_user_compat; - - if (cmd != SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32) { - pr_err("%s: wrong ioctl command sent %u!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user32, argp, sizeof(fw_user32))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - fw_user_compat.size = fw_user32.size; - fw_user_compat.buffer = compat_ptr(fw_user32.buffer); - fw_user_compat.cal_type = fw_user32.cal_type; - return wcdcal_hwdep_ioctl_shared(hw, fw_user_compat); -} -#else -#define wcdcal_hwdep_ioctl_compat NULL -#endif - -static int wcdcal_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct wcdcal_ioctl_buffer __user *argp = (void __user *)arg; - struct wcdcal_ioctl_buffer fw_user; - - if (cmd != SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE) { - pr_err("%s: wrong ioctl command sent %d!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user, argp, sizeof(fw_user))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - return wcdcal_hwdep_ioctl_shared(hw, fw_user); -} - -static int wcdcal_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ - struct fw_info *fw_data = hw->private_data; - - mutex_lock(&fw_data->lock); - /* clear all the calibrations */ - memset(fw_data->wcdcal_state, 0, - sizeof(fw_data->wcdcal_state)); - mutex_unlock(&fw_data->lock); - return 0; -} - -int wcd_cal_create_hwdep(void *data, int node, struct snd_soc_codec *codec) -{ - char hwname[40]; - struct snd_hwdep *hwdep; - struct firmware_cal **fw; - struct fw_info *fw_data = data; - int err, cal_bit; - - if (!fw_data || !codec) { - pr_err("%s: wrong arguments passed\n", __func__); - return -EINVAL; - } - - fw = fw_data->fw; - snprintf(hwname, strlen("Codec %s"), "Codec %s", - codec->component.name); - err = snd_hwdep_new(codec->component.card->snd_card, - hwname, node, &hwdep); - if (err < 0) { - dev_err(codec->dev, "%s: new hwdep failed %d\n", - __func__, err); - return err; - } - snprintf(hwdep->name, strlen("Codec %s"), "Codec %s", - codec->component.name); - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_CODEC; - hwdep->private_data = fw_data; - hwdep->ops.ioctl_compat = wcdcal_hwdep_ioctl_compat; - hwdep->ops.ioctl = wcdcal_hwdep_ioctl; - hwdep->ops.release = wcdcal_hwdep_release; - mutex_init(&fw_data->lock); - - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - set_bit(WCDCAL_UNINITIALISED, - &fw_data->wcdcal_state[cal_bit]); - fw[cal_bit] = kzalloc(sizeof *(fw[cal_bit]), GFP_KERNEL); - if (!fw[cal_bit]) - goto end; - } - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - fw[cal_bit]->data = kzalloc(cal_size_info[cal_bit], - GFP_KERNEL); - if (!fw[cal_bit]->data) - goto exit; - set_bit(WCDCAL_INITIALISED, - &fw_data->wcdcal_state[cal_bit]); - } - return 0; -exit: - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - kfree(fw[cal_bit]->data); - fw[cal_bit]->data = NULL; - } -end: - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - kfree(fw[cal_bit]); - fw[cal_bit] = NULL; - } - return -ENOMEM; -} -EXPORT_SYMBOL(wcd_cal_create_hwdep); diff --git a/techpack/audio/4.0/asoc/codecs/wsa881x-registers.h b/techpack/audio/4.0/asoc/codecs/wsa881x-registers.h deleted file mode 100644 index 6e19b32b1145..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wsa881x-registers.h +++ /dev/null @@ -1,170 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. - */ - -#ifndef WSA881X_REGISTERS_H -#define WSA881X_REGISTERS_H - -#define WSA881X_DIGITAL_BASE 0x3000 -#define WSA881X_ANALOG_BASE 0x3100 - -/* Digital register address space */ -#define WSA881X_CHIP_ID0 (WSA881X_DIGITAL_BASE+0x0000) -#define WSA881X_CHIP_ID1 (WSA881X_DIGITAL_BASE+0x0001) -#define WSA881X_CHIP_ID2 (WSA881X_DIGITAL_BASE+0x0002) -#define WSA881X_CHIP_ID3 (WSA881X_DIGITAL_BASE+0x0003) -#define WSA881X_BUS_ID (WSA881X_DIGITAL_BASE+0x0004) -#define WSA881X_CDC_RST_CTL (WSA881X_DIGITAL_BASE+0x0005) -#define WSA881X_CDC_TOP_CLK_CTL (WSA881X_DIGITAL_BASE+0x0006) -#define WSA881X_CDC_ANA_CLK_CTL (WSA881X_DIGITAL_BASE+0x0007) -#define WSA881X_CDC_DIG_CLK_CTL (WSA881X_DIGITAL_BASE+0x0008) -#define WSA881X_CLOCK_CONFIG (WSA881X_DIGITAL_BASE+0x0009) -#define WSA881X_ANA_CTL (WSA881X_DIGITAL_BASE+0x000A) -#define WSA881X_SWR_RESET_EN (WSA881X_DIGITAL_BASE+0x000B) -#define WSA881X_RESET_CTL (WSA881X_DIGITAL_BASE+0x000C) -#define WSA881X_TADC_VALUE_CTL (WSA881X_DIGITAL_BASE+0x000F) -#define WSA881X_TEMP_DETECT_CTL (WSA881X_DIGITAL_BASE+0x0010) -#define WSA881X_TEMP_MSB (WSA881X_DIGITAL_BASE+0x0011) -#define WSA881X_TEMP_LSB (WSA881X_DIGITAL_BASE+0x0012) -#define WSA881X_TEMP_CONFIG0 (WSA881X_DIGITAL_BASE+0x0013) -#define WSA881X_TEMP_CONFIG1 (WSA881X_DIGITAL_BASE+0x0014) -#define WSA881X_CDC_CLIP_CTL (WSA881X_DIGITAL_BASE+0x0015) -#define WSA881X_SDM_PDM9_LSB (WSA881X_DIGITAL_BASE+0x0016) -#define WSA881X_SDM_PDM9_MSB (WSA881X_DIGITAL_BASE+0x0017) -#define WSA881X_CDC_RX_CTL (WSA881X_DIGITAL_BASE+0x0018) -#define WSA881X_DEM_BYPASS_DATA0 (WSA881X_DIGITAL_BASE+0x0019) -#define WSA881X_DEM_BYPASS_DATA1 (WSA881X_DIGITAL_BASE+0x001A) -#define WSA881X_DEM_BYPASS_DATA2 (WSA881X_DIGITAL_BASE+0x001B) -#define WSA881X_DEM_BYPASS_DATA3 (WSA881X_DIGITAL_BASE+0x001C) -#define WSA881X_OTP_CTRL0 (WSA881X_DIGITAL_BASE+0x001D) -#define WSA881X_OTP_CTRL1 (WSA881X_DIGITAL_BASE+0x001E) -#define WSA881X_HDRIVE_CTL_GROUP1 (WSA881X_DIGITAL_BASE+0x001F) -#define WSA881X_INTR_MODE (WSA881X_DIGITAL_BASE+0x0020) -#define WSA881X_INTR_MASK (WSA881X_DIGITAL_BASE+0x0021) -#define WSA881X_INTR_STATUS (WSA881X_DIGITAL_BASE+0x0022) -#define WSA881X_INTR_CLEAR (WSA881X_DIGITAL_BASE+0x0023) -#define WSA881X_INTR_LEVEL (WSA881X_DIGITAL_BASE+0x0024) -#define WSA881X_INTR_SET (WSA881X_DIGITAL_BASE+0x0025) -#define WSA881X_INTR_TEST (WSA881X_DIGITAL_BASE+0x0026) -#define WSA881X_PDM_TEST_MODE (WSA881X_DIGITAL_BASE+0x0030) -#define WSA881X_ATE_TEST_MODE (WSA881X_DIGITAL_BASE+0x0031) -#define WSA881X_PIN_CTL_MODE (WSA881X_DIGITAL_BASE+0x0032) -#define WSA881X_PIN_CTL_OE (WSA881X_DIGITAL_BASE+0x0033) -#define WSA881X_PIN_WDATA_IOPAD (WSA881X_DIGITAL_BASE+0x0034) -#define WSA881X_PIN_STATUS (WSA881X_DIGITAL_BASE+0x0035) -#define WSA881X_DIG_DEBUG_MODE (WSA881X_DIGITAL_BASE+0x0037) -#define WSA881X_DIG_DEBUG_SEL (WSA881X_DIGITAL_BASE+0x0038) -#define WSA881X_DIG_DEBUG_EN (WSA881X_DIGITAL_BASE+0x0039) -#define WSA881X_SWR_HM_TEST1 (WSA881X_DIGITAL_BASE+0x003B) -#define WSA881X_SWR_HM_TEST2 (WSA881X_DIGITAL_BASE+0x003C) -#define WSA881X_TEMP_DETECT_DBG_CTL (WSA881X_DIGITAL_BASE+0x003D) -#define WSA881X_TEMP_DEBUG_MSB (WSA881X_DIGITAL_BASE+0x003E) -#define WSA881X_TEMP_DEBUG_LSB (WSA881X_DIGITAL_BASE+0x003F) -#define WSA881X_SAMPLE_EDGE_SEL (WSA881X_DIGITAL_BASE+0x0044) -#define WSA881X_IOPAD_CTL (WSA881X_DIGITAL_BASE+0x0045) -#define WSA881X_SPARE_0 (WSA881X_DIGITAL_BASE+0x0050) -#define WSA881X_SPARE_1 (WSA881X_DIGITAL_BASE+0x0051) -#define WSA881X_SPARE_2 (WSA881X_DIGITAL_BASE+0x0052) -#define WSA881X_OTP_REG_0 (WSA881X_DIGITAL_BASE+0x0080) -#define WSA881X_OTP_REG_1 (WSA881X_DIGITAL_BASE+0x0081) -#define WSA881X_OTP_REG_2 (WSA881X_DIGITAL_BASE+0x0082) -#define WSA881X_OTP_REG_3 (WSA881X_DIGITAL_BASE+0x0083) -#define WSA881X_OTP_REG_4 (WSA881X_DIGITAL_BASE+0x0084) -#define WSA881X_OTP_REG_5 (WSA881X_DIGITAL_BASE+0x0085) -#define WSA881X_OTP_REG_6 (WSA881X_DIGITAL_BASE+0x0086) -#define WSA881X_OTP_REG_7 (WSA881X_DIGITAL_BASE+0x0087) -#define WSA881X_OTP_REG_8 (WSA881X_DIGITAL_BASE+0x0088) -#define WSA881X_OTP_REG_9 (WSA881X_DIGITAL_BASE+0x0089) -#define WSA881X_OTP_REG_10 (WSA881X_DIGITAL_BASE+0x008A) -#define WSA881X_OTP_REG_11 (WSA881X_DIGITAL_BASE+0x008B) -#define WSA881X_OTP_REG_12 (WSA881X_DIGITAL_BASE+0x008C) -#define WSA881X_OTP_REG_13 (WSA881X_DIGITAL_BASE+0x008D) -#define WSA881X_OTP_REG_14 (WSA881X_DIGITAL_BASE+0x008E) -#define WSA881X_OTP_REG_15 (WSA881X_DIGITAL_BASE+0x008F) -#define WSA881X_OTP_REG_16 (WSA881X_DIGITAL_BASE+0x0090) -#define WSA881X_OTP_REG_17 (WSA881X_DIGITAL_BASE+0x0091) -#define WSA881X_OTP_REG_18 (WSA881X_DIGITAL_BASE+0x0092) -#define WSA881X_OTP_REG_19 (WSA881X_DIGITAL_BASE+0x0093) -#define WSA881X_OTP_REG_20 (WSA881X_DIGITAL_BASE+0x0094) -#define WSA881X_OTP_REG_21 (WSA881X_DIGITAL_BASE+0x0095) -#define WSA881X_OTP_REG_22 (WSA881X_DIGITAL_BASE+0x0096) -#define WSA881X_OTP_REG_23 (WSA881X_DIGITAL_BASE+0x0097) -#define WSA881X_OTP_REG_24 (WSA881X_DIGITAL_BASE+0x0098) -#define WSA881X_OTP_REG_25 (WSA881X_DIGITAL_BASE+0x0099) -#define WSA881X_OTP_REG_26 (WSA881X_DIGITAL_BASE+0x009A) -#define WSA881X_OTP_REG_27 (WSA881X_DIGITAL_BASE+0x009B) -#define WSA881X_OTP_REG_28 (WSA881X_DIGITAL_BASE+0x009C) -#define WSA881X_OTP_REG_29 (WSA881X_DIGITAL_BASE+0x009D) -#define WSA881X_OTP_REG_30 (WSA881X_DIGITAL_BASE+0x009E) -#define WSA881X_OTP_REG_31 (WSA881X_DIGITAL_BASE+0x009F) -#define WSA881X_OTP_REG_63 (WSA881X_DIGITAL_BASE+0x00BF) - -/* Analog Register address space */ -#define WSA881X_BIAS_REF_CTRL (WSA881X_ANALOG_BASE+0x0000) -#define WSA881X_BIAS_TEST (WSA881X_ANALOG_BASE+0x0001) -#define WSA881X_BIAS_BIAS (WSA881X_ANALOG_BASE+0x0002) -#define WSA881X_TEMP_OP (WSA881X_ANALOG_BASE+0x0003) -#define WSA881X_TEMP_IREF_CTRL (WSA881X_ANALOG_BASE+0x0004) -#define WSA881X_TEMP_ISENS_CTRL (WSA881X_ANALOG_BASE+0x0005) -#define WSA881X_TEMP_CLK_CTRL (WSA881X_ANALOG_BASE+0x0006) -#define WSA881X_TEMP_TEST (WSA881X_ANALOG_BASE+0x0007) -#define WSA881X_TEMP_BIAS (WSA881X_ANALOG_BASE+0x0008) -#define WSA881X_TEMP_ADC_CTRL (WSA881X_ANALOG_BASE+0x0009) -#define WSA881X_TEMP_DOUT_MSB (WSA881X_ANALOG_BASE+0x000A) -#define WSA881X_TEMP_DOUT_LSB (WSA881X_ANALOG_BASE+0x000B) -#define WSA881X_ADC_EN_MODU_V (WSA881X_ANALOG_BASE+0x0010) -#define WSA881X_ADC_EN_MODU_I (WSA881X_ANALOG_BASE+0x0011) -#define WSA881X_ADC_EN_DET_TEST_V (WSA881X_ANALOG_BASE+0x0012) -#define WSA881X_ADC_EN_DET_TEST_I (WSA881X_ANALOG_BASE+0x0013) -#define WSA881X_ADC_SEL_IBIAS (WSA881X_ANALOG_BASE+0x0014) -#define WSA881X_ADC_EN_SEL_IBAIS (WSA881X_ANALOG_BASE+0x0015) -#define WSA881X_SPKR_DRV_EN (WSA881X_ANALOG_BASE+0x001A) -#define WSA881X_SPKR_DRV_GAIN (WSA881X_ANALOG_BASE+0x001B) -#define WSA881X_SPKR_DAC_CTL (WSA881X_ANALOG_BASE+0x001C) -#define WSA881X_SPKR_DRV_DBG (WSA881X_ANALOG_BASE+0x001D) -#define WSA881X_SPKR_PWRSTG_DBG (WSA881X_ANALOG_BASE+0x001E) -#define WSA881X_SPKR_OCP_CTL (WSA881X_ANALOG_BASE+0x001F) -#define WSA881X_SPKR_CLIP_CTL (WSA881X_ANALOG_BASE+0x0020) -#define WSA881X_SPKR_BBM_CTL (WSA881X_ANALOG_BASE+0x0021) -#define WSA881X_SPKR_MISC_CTL1 (WSA881X_ANALOG_BASE+0x0022) -#define WSA881X_SPKR_MISC_CTL2 (WSA881X_ANALOG_BASE+0x0023) -#define WSA881X_SPKR_BIAS_INT (WSA881X_ANALOG_BASE+0x0024) -#define WSA881X_SPKR_PA_INT (WSA881X_ANALOG_BASE+0x0025) -#define WSA881X_SPKR_BIAS_CAL (WSA881X_ANALOG_BASE+0x0026) -#define WSA881X_SPKR_BIAS_PSRR (WSA881X_ANALOG_BASE+0x0027) -#define WSA881X_SPKR_STATUS1 (WSA881X_ANALOG_BASE+0x0028) -#define WSA881X_SPKR_STATUS2 (WSA881X_ANALOG_BASE+0x0029) -#define WSA881X_BOOST_EN_CTL (WSA881X_ANALOG_BASE+0x002A) -#define WSA881X_BOOST_CURRENT_LIMIT (WSA881X_ANALOG_BASE+0x002B) -#define WSA881X_BOOST_PS_CTL (WSA881X_ANALOG_BASE+0x002C) -#define WSA881X_BOOST_PRESET_OUT1 (WSA881X_ANALOG_BASE+0x002D) -#define WSA881X_BOOST_PRESET_OUT2 (WSA881X_ANALOG_BASE+0x002E) -#define WSA881X_BOOST_FORCE_OUT (WSA881X_ANALOG_BASE+0x002F) -#define WSA881X_BOOST_LDO_PROG (WSA881X_ANALOG_BASE+0x0030) -#define WSA881X_BOOST_SLOPE_COMP_ISENSE_FB (WSA881X_ANALOG_BASE+0x0031) -#define WSA881X_BOOST_RON_CTL (WSA881X_ANALOG_BASE+0x0032) -#define WSA881X_BOOST_LOOP_STABILITY (WSA881X_ANALOG_BASE+0x0033) -#define WSA881X_BOOST_ZX_CTL (WSA881X_ANALOG_BASE+0x0034) -#define WSA881X_BOOST_START_CTL (WSA881X_ANALOG_BASE+0x0035) -#define WSA881X_BOOST_MISC1_CTL (WSA881X_ANALOG_BASE+0x0036) -#define WSA881X_BOOST_MISC2_CTL (WSA881X_ANALOG_BASE+0x0037) -#define WSA881X_BOOST_MISC3_CTL (WSA881X_ANALOG_BASE+0x0038) -#define WSA881X_BOOST_ATEST_CTL (WSA881X_ANALOG_BASE+0x0039) -#define WSA881X_SPKR_PROT_FE_GAIN (WSA881X_ANALOG_BASE+0x003A) -#define WSA881X_SPKR_PROT_FE_CM_LDO_SET (WSA881X_ANALOG_BASE+0x003B) -#define WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1 (WSA881X_ANALOG_BASE+0x003C) -#define WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2 (WSA881X_ANALOG_BASE+0x003D) -#define WSA881X_SPKR_PROT_ATEST1 (WSA881X_ANALOG_BASE+0x003E) -#define WSA881X_SPKR_PROT_ATEST2 (WSA881X_ANALOG_BASE+0x003F) -#define WSA881X_SPKR_PROT_FE_VSENSE_VCM (WSA881X_ANALOG_BASE+0x0040) -#define WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1 (WSA881X_ANALOG_BASE+0x0041) -#define WSA881X_BONGO_RESRV_REG1 (WSA881X_ANALOG_BASE+0x0042) -#define WSA881X_BONGO_RESRV_REG2 (WSA881X_ANALOG_BASE+0x0043) -#define WSA881X_SPKR_PROT_SAR (WSA881X_ANALOG_BASE+0x0044) -#define WSA881X_SPKR_STATUS3 (WSA881X_ANALOG_BASE+0x0045) - -#define WSA881X_NUM_REGISTERS (WSA881X_SPKR_STATUS3+1) -#define WSA881X_MAX_REGISTER (WSA881X_NUM_REGISTERS-1) -#define WSA881X_CACHE_SIZE WSA881X_NUM_REGISTERS - -#endif /* WSA881X_REGISTERS_H */ diff --git a/techpack/audio/4.0/asoc/codecs/wsa881x-regmap.c b/techpack/audio/4.0/asoc/codecs/wsa881x-regmap.c deleted file mode 100644 index 27e45a1878c3..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wsa881x-regmap.c +++ /dev/null @@ -1,258 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "wsa881x-registers.h" -#include "wsa881x.h" - -/* - * Default register reset values that are common across different versions - * are defined here. If a register reset value is changed based on version - * then remove it from this structure and add it in version specific - * structures. - */ -static struct reg_default wsa881x_defaults[] = { - {WSA881X_CHIP_ID0, 0x00}, - {WSA881X_CHIP_ID1, 0x00}, - {WSA881X_CHIP_ID2, 0x00}, - {WSA881X_CHIP_ID3, 0x02}, - {WSA881X_BUS_ID, 0x00}, - {WSA881X_CDC_RST_CTL, 0x00}, - {WSA881X_CDC_TOP_CLK_CTL, 0x03}, - {WSA881X_CDC_ANA_CLK_CTL, 0x00}, - {WSA881X_CDC_DIG_CLK_CTL, 0x00}, - {WSA881X_CLOCK_CONFIG, 0x00}, - {WSA881X_ANA_CTL, 0x08}, - {WSA881X_SWR_RESET_EN, 0x00}, - {WSA881X_TEMP_DETECT_CTL, 0x01}, - {WSA881X_TEMP_MSB, 0x00}, - {WSA881X_TEMP_LSB, 0x00}, - {WSA881X_TEMP_CONFIG0, 0x00}, - {WSA881X_TEMP_CONFIG1, 0x00}, - {WSA881X_CDC_CLIP_CTL, 0x03}, - {WSA881X_SDM_PDM9_LSB, 0x00}, - {WSA881X_SDM_PDM9_MSB, 0x00}, - {WSA881X_CDC_RX_CTL, 0x7E}, - {WSA881X_DEM_BYPASS_DATA0, 0x00}, - {WSA881X_DEM_BYPASS_DATA1, 0x00}, - {WSA881X_DEM_BYPASS_DATA2, 0x00}, - {WSA881X_DEM_BYPASS_DATA3, 0x00}, - {WSA881X_OTP_CTRL0, 0x00}, - {WSA881X_OTP_CTRL1, 0x00}, - {WSA881X_HDRIVE_CTL_GROUP1, 0x00}, - {WSA881X_INTR_MODE, 0x00}, - {WSA881X_INTR_STATUS, 0x00}, - {WSA881X_INTR_CLEAR, 0x00}, - {WSA881X_INTR_LEVEL, 0x00}, - {WSA881X_INTR_SET, 0x00}, - {WSA881X_INTR_TEST, 0x00}, - {WSA881X_PDM_TEST_MODE, 0x00}, - {WSA881X_ATE_TEST_MODE, 0x00}, - {WSA881X_PIN_CTL_MODE, 0x00}, - {WSA881X_PIN_CTL_OE, 0x00}, - {WSA881X_PIN_WDATA_IOPAD, 0x00}, - {WSA881X_PIN_STATUS, 0x00}, - {WSA881X_DIG_DEBUG_MODE, 0x00}, - {WSA881X_DIG_DEBUG_SEL, 0x00}, - {WSA881X_DIG_DEBUG_EN, 0x00}, - {WSA881X_SWR_HM_TEST1, 0x08}, - {WSA881X_SWR_HM_TEST2, 0x00}, - {WSA881X_TEMP_DETECT_DBG_CTL, 0x00}, - {WSA881X_TEMP_DEBUG_MSB, 0x00}, - {WSA881X_TEMP_DEBUG_LSB, 0x00}, - {WSA881X_SAMPLE_EDGE_SEL, 0x0C}, - {WSA881X_SPARE_0, 0x00}, - {WSA881X_SPARE_1, 0x00}, - {WSA881X_SPARE_2, 0x00}, - {WSA881X_OTP_REG_0, 0x01}, - {WSA881X_OTP_REG_1, 0xFF}, - {WSA881X_OTP_REG_2, 0xC0}, - {WSA881X_OTP_REG_3, 0xFF}, - {WSA881X_OTP_REG_4, 0xC0}, - {WSA881X_OTP_REG_5, 0xFF}, - {WSA881X_OTP_REG_6, 0xFF}, - {WSA881X_OTP_REG_7, 0xFF}, - {WSA881X_OTP_REG_8, 0xFF}, - {WSA881X_OTP_REG_9, 0xFF}, - {WSA881X_OTP_REG_10, 0xFF}, - {WSA881X_OTP_REG_11, 0xFF}, - {WSA881X_OTP_REG_12, 0xFF}, - {WSA881X_OTP_REG_13, 0xFF}, - {WSA881X_OTP_REG_14, 0xFF}, - {WSA881X_OTP_REG_15, 0xFF}, - {WSA881X_OTP_REG_16, 0xFF}, - {WSA881X_OTP_REG_17, 0xFF}, - {WSA881X_OTP_REG_18, 0xFF}, - {WSA881X_OTP_REG_19, 0xFF}, - {WSA881X_OTP_REG_20, 0xFF}, - {WSA881X_OTP_REG_21, 0xFF}, - {WSA881X_OTP_REG_22, 0xFF}, - {WSA881X_OTP_REG_23, 0xFF}, - {WSA881X_OTP_REG_24, 0x03}, - {WSA881X_OTP_REG_25, 0x01}, - {WSA881X_OTP_REG_26, 0x03}, - {WSA881X_OTP_REG_27, 0x11}, - {WSA881X_OTP_REG_63, 0x40}, - /* WSA881x Analog registers */ - {WSA881X_BIAS_REF_CTRL, 0x6C}, - {WSA881X_BIAS_TEST, 0x16}, - {WSA881X_BIAS_BIAS, 0xF0}, - {WSA881X_TEMP_OP, 0x00}, - {WSA881X_TEMP_IREF_CTRL, 0x56}, - {WSA881X_TEMP_ISENS_CTRL, 0x47}, - {WSA881X_TEMP_CLK_CTRL, 0x87}, - {WSA881X_TEMP_TEST, 0x00}, - {WSA881X_TEMP_BIAS, 0x51}, - {WSA881X_TEMP_DOUT_MSB, 0x00}, - {WSA881X_TEMP_DOUT_LSB, 0x00}, - {WSA881X_ADC_EN_MODU_V, 0x00}, - {WSA881X_ADC_EN_MODU_I, 0x00}, - {WSA881X_ADC_EN_DET_TEST_V, 0x00}, - {WSA881X_ADC_EN_DET_TEST_I, 0x00}, - {WSA881X_ADC_EN_SEL_IBAIS, 0x10}, - {WSA881X_SPKR_DRV_EN, 0x74}, - {WSA881X_SPKR_DRV_DBG, 0x15}, - {WSA881X_SPKR_PWRSTG_DBG, 0x00}, - {WSA881X_SPKR_OCP_CTL, 0xD4}, - {WSA881X_SPKR_CLIP_CTL, 0x90}, - {WSA881X_SPKR_PA_INT, 0x54}, - {WSA881X_SPKR_BIAS_CAL, 0xAC}, - {WSA881X_SPKR_STATUS1, 0x00}, - {WSA881X_SPKR_STATUS2, 0x00}, - {WSA881X_BOOST_EN_CTL, 0x18}, - {WSA881X_BOOST_CURRENT_LIMIT, 0x7A}, - {WSA881X_BOOST_PRESET_OUT2, 0x70}, - {WSA881X_BOOST_FORCE_OUT, 0x0E}, - {WSA881X_BOOST_LDO_PROG, 0x16}, - {WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, 0x71}, - {WSA881X_BOOST_RON_CTL, 0x0F}, - {WSA881X_BOOST_ZX_CTL, 0x34}, - {WSA881X_BOOST_START_CTL, 0x23}, - {WSA881X_BOOST_MISC1_CTL, 0x80}, - {WSA881X_BOOST_MISC2_CTL, 0x00}, - {WSA881X_BOOST_MISC3_CTL, 0x00}, - {WSA881X_BOOST_ATEST_CTL, 0x00}, - {WSA881X_SPKR_PROT_FE_GAIN, 0x46}, - {WSA881X_SPKR_PROT_FE_CM_LDO_SET, 0x3B}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1, 0x8D}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2, 0x8D}, - {WSA881X_SPKR_PROT_ATEST1, 0x01}, - {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x8D}, - {WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1, 0x4D}, - {WSA881X_SPKR_PROT_SAR, 0x00}, - {WSA881X_SPKR_STATUS3, 0x00}, -}; - -/* Default register reset values for WSA881x rev 2.0 */ -static struct reg_sequence wsa881x_rev_2_0[] = { - {WSA881X_RESET_CTL, 0x00, 0x00}, - {WSA881X_TADC_VALUE_CTL, 0x01, 0x00}, - {WSA881X_INTR_MASK, 0x1B, 0x00}, - {WSA881X_IOPAD_CTL, 0x00, 0x00}, - {WSA881X_OTP_REG_28, 0x3F, 0x00}, - {WSA881X_OTP_REG_29, 0x3F, 0x00}, - {WSA881X_OTP_REG_30, 0x01, 0x00}, - {WSA881X_OTP_REG_31, 0x01, 0x00}, - {WSA881X_TEMP_ADC_CTRL, 0x03, 0x00}, - {WSA881X_ADC_SEL_IBIAS, 0x45, 0x00}, - {WSA881X_SPKR_DRV_GAIN, 0xC1, 0x00}, - {WSA881X_SPKR_DAC_CTL, 0x42, 0x00}, - {WSA881X_SPKR_BBM_CTL, 0x02, 0x00}, - {WSA881X_SPKR_MISC_CTL1, 0x40, 0x00}, - {WSA881X_SPKR_MISC_CTL2, 0x07, 0x00}, - {WSA881X_SPKR_BIAS_INT, 0x5F, 0x00}, - {WSA881X_SPKR_BIAS_PSRR, 0x44, 0x00}, - {WSA881X_BOOST_PS_CTL, 0xA0, 0x00}, - {WSA881X_BOOST_PRESET_OUT1, 0xB7, 0x00}, - {WSA881X_BOOST_LOOP_STABILITY, 0x8D, 0x00}, - {WSA881X_SPKR_PROT_ATEST2, 0x02, 0x00}, - {WSA881X_BONGO_RESRV_REG1, 0x5E, 0x00}, - {WSA881X_BONGO_RESRV_REG2, 0x07, 0x00}, -}; - -/* - * wsa881x_regmap_defaults - update regmap default register values - * @regmap: pointer to regmap structure - * @version: wsa881x version id - * - * Update regmap default register values based on version id - * - */ -void wsa881x_regmap_defaults(struct regmap *regmap, u8 version) -{ - u16 ret = 0; - - if (!regmap) { - pr_debug("%s: regmap structure is NULL\n", __func__); - return; - } - - regcache_cache_only(regmap, true); - ret = regmap_multi_reg_write(regmap, wsa881x_rev_2_0, - ARRAY_SIZE(wsa881x_rev_2_0)); - regcache_cache_only(regmap, false); - - if (ret) - pr_debug("%s: Failed to update regmap defaults ret= %d\n", - __func__, ret); -} -EXPORT_SYMBOL(wsa881x_regmap_defaults); - -static bool wsa881x_readable_register(struct device *dev, unsigned int reg) -{ - return wsa881x_reg_readable[reg]; -} - -static bool wsa881x_volatile_register(struct device *dev, unsigned int reg) -{ - switch (reg) { - case WSA881X_CHIP_ID0: - case WSA881X_CHIP_ID1: - case WSA881X_CHIP_ID2: - case WSA881X_CHIP_ID3: - case WSA881X_BUS_ID: - case WSA881X_TEMP_MSB: - case WSA881X_TEMP_LSB: - case WSA881X_SDM_PDM9_LSB: - case WSA881X_SDM_PDM9_MSB: - case WSA881X_OTP_CTRL1: - case WSA881X_INTR_STATUS: - case WSA881X_ATE_TEST_MODE: - case WSA881X_PIN_STATUS: - case WSA881X_SWR_HM_TEST2: - case WSA881X_SPKR_STATUS1: - case WSA881X_SPKR_STATUS2: - case WSA881X_SPKR_STATUS3: - case WSA881X_OTP_REG_0: - case WSA881X_OTP_REG_1: - case WSA881X_OTP_REG_2: - case WSA881X_OTP_REG_3: - case WSA881X_OTP_REG_4: - case WSA881X_OTP_REG_5: - case WSA881X_OTP_REG_31: - case WSA881X_TEMP_DOUT_MSB: - case WSA881X_TEMP_DOUT_LSB: - case WSA881X_TEMP_OP: - case WSA881X_SPKR_PROT_SAR: - return true; - default: - return false; - } -} - -struct regmap_config wsa881x_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wsa881x_defaults, - .num_reg_defaults = ARRAY_SIZE(wsa881x_defaults), - .max_register = WSA881X_MAX_REGISTER, - .volatile_reg = wsa881x_volatile_register, - .readable_reg = wsa881x_readable_register, - .reg_format_endian = REGMAP_ENDIAN_NATIVE, - .val_format_endian = REGMAP_ENDIAN_NATIVE, - .can_multi_write = true, -}; diff --git a/techpack/audio/4.0/asoc/codecs/wsa881x-tables.c b/techpack/audio/4.0/asoc/codecs/wsa881x-tables.c deleted file mode 100644 index 40d2fa244431..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wsa881x-tables.c +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "wsa881x-registers.h" - -const u8 wsa881x_reg_readable[WSA881X_CACHE_SIZE] = { - [WSA881X_CHIP_ID0] = 1, - [WSA881X_CHIP_ID1] = 1, - [WSA881X_CHIP_ID2] = 1, - [WSA881X_CHIP_ID3] = 1, - [WSA881X_BUS_ID] = 1, - [WSA881X_CDC_RST_CTL] = 1, - [WSA881X_CDC_TOP_CLK_CTL] = 1, - [WSA881X_CDC_ANA_CLK_CTL] = 1, - [WSA881X_CDC_DIG_CLK_CTL] = 1, - [WSA881X_CLOCK_CONFIG] = 1, - [WSA881X_ANA_CTL] = 1, - [WSA881X_SWR_RESET_EN] = 1, - [WSA881X_RESET_CTL] = 1, - [WSA881X_TADC_VALUE_CTL] = 1, - [WSA881X_TEMP_DETECT_CTL] = 1, - [WSA881X_TEMP_MSB] = 1, - [WSA881X_TEMP_LSB] = 1, - [WSA881X_TEMP_CONFIG0] = 1, - [WSA881X_TEMP_CONFIG1] = 1, - [WSA881X_CDC_CLIP_CTL] = 1, - [WSA881X_SDM_PDM9_LSB] = 1, - [WSA881X_SDM_PDM9_MSB] = 1, - [WSA881X_CDC_RX_CTL] = 1, - [WSA881X_DEM_BYPASS_DATA0] = 1, - [WSA881X_DEM_BYPASS_DATA1] = 1, - [WSA881X_DEM_BYPASS_DATA2] = 1, - [WSA881X_DEM_BYPASS_DATA3] = 1, - [WSA881X_OTP_CTRL0] = 1, - [WSA881X_OTP_CTRL1] = 1, - [WSA881X_HDRIVE_CTL_GROUP1] = 1, - [WSA881X_INTR_MODE] = 1, - [WSA881X_INTR_MASK] = 1, - [WSA881X_INTR_STATUS] = 1, - [WSA881X_INTR_CLEAR] = 1, - [WSA881X_INTR_LEVEL] = 1, - [WSA881X_INTR_SET] = 1, - [WSA881X_INTR_TEST] = 1, - [WSA881X_PDM_TEST_MODE] = 1, - [WSA881X_ATE_TEST_MODE] = 1, - [WSA881X_PIN_CTL_MODE] = 1, - [WSA881X_PIN_CTL_OE] = 1, - [WSA881X_PIN_WDATA_IOPAD] = 1, - [WSA881X_PIN_STATUS] = 1, - [WSA881X_DIG_DEBUG_MODE] = 1, - [WSA881X_DIG_DEBUG_SEL] = 1, - [WSA881X_DIG_DEBUG_EN] = 1, - [WSA881X_SWR_HM_TEST1] = 1, - [WSA881X_SWR_HM_TEST2] = 1, - [WSA881X_TEMP_DETECT_DBG_CTL] = 1, - [WSA881X_TEMP_DEBUG_MSB] = 1, - [WSA881X_TEMP_DEBUG_LSB] = 1, - [WSA881X_SAMPLE_EDGE_SEL] = 1, - [WSA881X_IOPAD_CTL] = 1, - [WSA881X_SPARE_0] = 1, - [WSA881X_SPARE_1] = 1, - [WSA881X_SPARE_2] = 1, - [WSA881X_OTP_REG_0] = 1, - [WSA881X_OTP_REG_1] = 1, - [WSA881X_OTP_REG_2] = 1, - [WSA881X_OTP_REG_3] = 1, - [WSA881X_OTP_REG_4] = 1, - [WSA881X_OTP_REG_5] = 1, - [WSA881X_OTP_REG_6] = 1, - [WSA881X_OTP_REG_7] = 1, - [WSA881X_OTP_REG_8] = 1, - [WSA881X_OTP_REG_9] = 1, - [WSA881X_OTP_REG_10] = 1, - [WSA881X_OTP_REG_11] = 1, - [WSA881X_OTP_REG_12] = 1, - [WSA881X_OTP_REG_13] = 1, - [WSA881X_OTP_REG_14] = 1, - [WSA881X_OTP_REG_15] = 1, - [WSA881X_OTP_REG_16] = 1, - [WSA881X_OTP_REG_17] = 1, - [WSA881X_OTP_REG_18] = 1, - [WSA881X_OTP_REG_19] = 1, - [WSA881X_OTP_REG_20] = 1, - [WSA881X_OTP_REG_21] = 1, - [WSA881X_OTP_REG_22] = 1, - [WSA881X_OTP_REG_23] = 1, - [WSA881X_OTP_REG_24] = 1, - [WSA881X_OTP_REG_25] = 1, - [WSA881X_OTP_REG_26] = 1, - [WSA881X_OTP_REG_27] = 1, - [WSA881X_OTP_REG_28] = 1, - [WSA881X_OTP_REG_29] = 1, - [WSA881X_OTP_REG_30] = 1, - [WSA881X_OTP_REG_31] = 1, - [WSA881X_OTP_REG_63] = 1, - /* Analog Registers */ - [WSA881X_BIAS_REF_CTRL] = 1, - [WSA881X_BIAS_TEST] = 1, - [WSA881X_BIAS_BIAS] = 1, - [WSA881X_TEMP_OP] = 1, - [WSA881X_TEMP_IREF_CTRL] = 1, - [WSA881X_TEMP_ISENS_CTRL] = 1, - [WSA881X_TEMP_CLK_CTRL] = 1, - [WSA881X_TEMP_TEST] = 1, - [WSA881X_TEMP_BIAS] = 1, - [WSA881X_TEMP_ADC_CTRL] = 1, - [WSA881X_TEMP_DOUT_MSB] = 1, - [WSA881X_TEMP_DOUT_LSB] = 1, - [WSA881X_ADC_EN_MODU_V] = 1, - [WSA881X_ADC_EN_MODU_I] = 1, - [WSA881X_ADC_EN_DET_TEST_V] = 1, - [WSA881X_ADC_EN_DET_TEST_I] = 1, - [WSA881X_ADC_SEL_IBIAS] = 1, - [WSA881X_ADC_EN_SEL_IBAIS] = 1, - [WSA881X_SPKR_DRV_EN] = 1, - [WSA881X_SPKR_DRV_GAIN] = 1, - [WSA881X_SPKR_DAC_CTL] = 1, - [WSA881X_SPKR_DRV_DBG] = 1, - [WSA881X_SPKR_PWRSTG_DBG] = 1, - [WSA881X_SPKR_OCP_CTL] = 1, - [WSA881X_SPKR_CLIP_CTL] = 1, - [WSA881X_SPKR_BBM_CTL] = 1, - [WSA881X_SPKR_MISC_CTL1] = 1, - [WSA881X_SPKR_MISC_CTL2] = 1, - [WSA881X_SPKR_BIAS_INT] = 1, - [WSA881X_SPKR_PA_INT] = 1, - [WSA881X_SPKR_BIAS_CAL] = 1, - [WSA881X_SPKR_BIAS_PSRR] = 1, - [WSA881X_SPKR_STATUS1] = 1, - [WSA881X_SPKR_STATUS2] = 1, - [WSA881X_BOOST_EN_CTL] = 1, - [WSA881X_BOOST_CURRENT_LIMIT] = 1, - [WSA881X_BOOST_PS_CTL] = 1, - [WSA881X_BOOST_PRESET_OUT1] = 1, - [WSA881X_BOOST_PRESET_OUT2] = 1, - [WSA881X_BOOST_FORCE_OUT] = 1, - [WSA881X_BOOST_LDO_PROG] = 1, - [WSA881X_BOOST_SLOPE_COMP_ISENSE_FB] = 1, - [WSA881X_BOOST_RON_CTL] = 1, - [WSA881X_BOOST_LOOP_STABILITY] = 1, - [WSA881X_BOOST_ZX_CTL] = 1, - [WSA881X_BOOST_START_CTL] = 1, - [WSA881X_BOOST_MISC1_CTL] = 1, - [WSA881X_BOOST_MISC2_CTL] = 1, - [WSA881X_BOOST_MISC3_CTL] = 1, - [WSA881X_BOOST_ATEST_CTL] = 1, - [WSA881X_SPKR_PROT_FE_GAIN] = 1, - [WSA881X_SPKR_PROT_FE_CM_LDO_SET] = 1, - [WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1] = 1, - [WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2] = 1, - [WSA881X_SPKR_PROT_ATEST1] = 1, - [WSA881X_SPKR_PROT_ATEST2] = 1, - [WSA881X_SPKR_PROT_FE_VSENSE_VCM] = 1, - [WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1] = 1, - [WSA881X_BONGO_RESRV_REG1] = 1, - [WSA881X_BONGO_RESRV_REG2] = 1, - [WSA881X_SPKR_PROT_SAR] = 1, - [WSA881X_SPKR_STATUS3] = 1, -}; diff --git a/techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.c b/techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.c deleted file mode 100644 index 107a43a633d3..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.c +++ /dev/null @@ -1,187 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015, 2017-2019 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "wsa881x-temp-sensor.h" - -#define T1_TEMP -10 -#define T2_TEMP 150 -#define LOW_TEMP_THRESHOLD 5 -#define HIGH_TEMP_THRESHOLD 45 -#define TEMP_INVALID 0xFFFF -#define WSA881X_TEMP_RETRY 3 -/* - * wsa881x_get_temp - get wsa temperature - * @thermal: thermal zone device - * @temp: temperature value - * - * Get the temperature of wsa881x. - * - * Return: 0 on success or negative error code on failure. - */ -int wsa881x_get_temp(struct thermal_zone_device *thermal, - int *temp) -{ - struct wsa881x_tz_priv *pdata; - struct snd_soc_codec *codec; - struct wsa_temp_register reg; - int dmeas, d1, d2; - int ret = 0; - int temp_val; - int t1 = T1_TEMP; - int t2 = T2_TEMP; - u8 retry = WSA881X_TEMP_RETRY; - - if (!thermal) - return -EINVAL; - - if (thermal->devdata) { - pdata = thermal->devdata; - if (pdata->codec) { - codec = pdata->codec; - } else { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - } else { - pr_err("%s: pdata is NULL\n", __func__); - return -EINVAL; - } - if (atomic_cmpxchg(&pdata->is_suspend_spk, 1, 0)) { - /* - * get_temp query happens as part of POST_PM_SUSPEND - * from thermal core. To avoid calls to slimbus - * as part of this thermal query, return default temp - * and reset the suspend flag. - */ - if (!pdata->t0_init) { - if (temp) - *temp = pdata->curr_temp; - return 0; - } - } - -temp_retry: - if (pdata->wsa_temp_reg_read) { - ret = pdata->wsa_temp_reg_read(codec, ®); - if (ret) { - pr_err("%s: temp read failed: %d, current temp: %d\n", - __func__, ret, pdata->curr_temp); - if (temp) - *temp = pdata->curr_temp; - return 0; - } - } else { - pr_err("%s: wsa_temp_reg_read is NULL\n", __func__); - return -EINVAL; - } - /* - * Temperature register values are expected to be in the - * following range. - * d1_msb = 68 - 92 and d1_lsb = 0, 64, 128, 192 - * d2_msb = 185 -218 and d2_lsb = 0, 64, 128, 192 - */ - if ((reg.d1_msb < 68 || reg.d1_msb > 92) || - (!(reg.d1_lsb == 0 || reg.d1_lsb == 64 || reg.d1_lsb == 128 || - reg.d1_lsb == 192)) || - (reg.d2_msb < 185 || reg.d2_msb > 218) || - (!(reg.d2_lsb == 0 || reg.d2_lsb == 64 || reg.d2_lsb == 128 || - reg.d2_lsb == 192))) { - printk_ratelimited("%s: Temperature registers[%d %d %d %d] are out of range\n", - __func__, reg.d1_msb, reg.d1_lsb, reg.d2_msb, - reg.d2_lsb); - } - dmeas = ((reg.dmeas_msb << 0x8) | reg.dmeas_lsb) >> 0x6; - d1 = ((reg.d1_msb << 0x8) | reg.d1_lsb) >> 0x6; - d2 = ((reg.d2_msb << 0x8) | reg.d2_lsb) >> 0x6; - - if (d1 == d2) - temp_val = TEMP_INVALID; - else - temp_val = t1 + (((dmeas - d1) * (t2 - t1))/(d2 - d1)); - - if (temp_val <= LOW_TEMP_THRESHOLD || - temp_val >= HIGH_TEMP_THRESHOLD) { - pr_debug("%s: T0: %d is out of range[%d, %d]\n", __func__, - temp_val, LOW_TEMP_THRESHOLD, HIGH_TEMP_THRESHOLD); - if (retry--) { - msleep(20); - goto temp_retry; - } - } - pdata->curr_temp = temp_val; - - if (temp) - *temp = temp_val; - pr_debug("%s: t0 measured: %d dmeas = %d, d1 = %d, d2 = %d\n", - __func__, temp_val, dmeas, d1, d2); - return ret; -} -EXPORT_SYMBOL(wsa881x_get_temp); - -static struct thermal_zone_device_ops wsa881x_thermal_ops = { - .get_temp = wsa881x_get_temp, -}; - - -static int wsa881x_pm_notify(struct notifier_block *nb, - unsigned long mode, void *_unused) -{ - struct wsa881x_tz_priv *pdata = - container_of(nb, struct wsa881x_tz_priv, pm_nb); - - switch (mode) { - case PM_SUSPEND_PREPARE: - atomic_set(&pdata->is_suspend_spk, 1); - break; - default: - break; - } - return 0; -} - -int wsa881x_init_thermal(struct wsa881x_tz_priv *tz_pdata) -{ - struct thermal_zone_device *tz_dev; - - if (tz_pdata == NULL) { - pr_err("%s: thermal pdata is NULL\n", __func__); - return -EINVAL; - } - /* Register with the thermal zone */ - tz_dev = thermal_zone_device_register(tz_pdata->name, - 0, 0, tz_pdata, - &wsa881x_thermal_ops, NULL, 0, 0); - if (IS_ERR(tz_dev)) { - pr_err("%s: thermal device register failed.\n", __func__); - return -EINVAL; - } - tz_pdata->tz_dev = tz_dev; - tz_pdata->pm_nb.notifier_call = wsa881x_pm_notify; - register_pm_notifier(&tz_pdata->pm_nb); - atomic_set(&tz_pdata->is_suspend_spk, 0); - - return 0; -} -EXPORT_SYMBOL(wsa881x_init_thermal); - -void wsa881x_deinit_thermal(struct thermal_zone_device *tz_dev) -{ - struct wsa881x_tz_priv *pdata; - - if (tz_dev && tz_dev->devdata) { - pdata = tz_dev->devdata; - if (pdata) - unregister_pm_notifier(&pdata->pm_nb); - } - if (tz_dev) - thermal_zone_device_unregister(tz_dev); -} -EXPORT_SYMBOL(wsa881x_deinit_thermal); diff --git a/techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.h b/techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.h deleted file mode 100644 index 4e7342b0c8b0..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wsa881x-temp-sensor.h +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2015, 2018 The Linux Foundation. All rights reserved. - */ -#ifndef WSA881X_TEMP_SENSOR_H -#define WSA881X_TEMP_SENSOR_H - -#include -#include - -struct wsa_temp_register { - u8 d1_msb; - u8 d1_lsb; - u8 d2_msb; - u8 d2_lsb; - u8 dmeas_msb; - u8 dmeas_lsb; -}; -typedef int32_t (*wsa_temp_register_read)(struct snd_soc_codec *codec, - struct wsa_temp_register *wsa_temp_reg); -struct wsa881x_tz_priv { - struct thermal_zone_device *tz_dev; - struct snd_soc_codec *codec; - struct wsa_temp_register *wsa_temp_reg; - char name[80]; - wsa_temp_register_read wsa_temp_reg_read; - struct notifier_block pm_nb; - atomic_t is_suspend_spk; - int t0_init; - int curr_temp; -}; - -int wsa881x_get_temp(struct thermal_zone_device *tz_dev, int *temp); -int wsa881x_init_thermal(struct wsa881x_tz_priv *tz_pdata); -void wsa881x_deinit_thermal(struct thermal_zone_device *tz_dev); -#endif diff --git a/techpack/audio/4.0/asoc/codecs/wsa881x.c b/techpack/audio/4.0/asoc/codecs/wsa881x.c deleted file mode 100644 index 3b8062e786ea..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wsa881x.c +++ /dev/null @@ -1,1643 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wsa881x.h" -#include "wsa881x-temp-sensor.h" - -#define WSA881X_NUM_RETRY 5 - -enum { - G_18DB = 0, - G_16P5DB, - G_15DB, - G_13P5DB, - G_12DB, - G_10P5DB, - G_9DB, - G_7P5DB, - G_6DB, - G_4P5DB, - G_3DB, - G_1P5DB, - G_0DB, -}; - -enum { - DISABLE = 0, - ENABLE, -}; - -enum { - SWR_DAC_PORT, - SWR_COMP_PORT, - SWR_BOOST_PORT, - SWR_VISENSE_PORT, -}; - -struct swr_port { - u8 port_id; - u8 ch_mask; - u32 ch_rate; - u8 num_ch; - u8 port_type; -}; - -enum { - WSA881X_DEV_DOWN, - WSA881X_DEV_UP, - WSA881X_DEV_READY, -}; - -/* - * Private data Structure for wsa881x. All parameters related to - * WSA881X codec needs to be defined here. - */ -struct wsa881x_priv { - struct regmap *regmap; - struct device *dev; - struct swr_device *swr_slave; - struct snd_soc_codec *codec; - bool comp_enable; - bool boost_enable; - bool visense_enable; - u8 pa_gain; - struct swr_port port[WSA881X_MAX_SWR_PORTS]; - int pd_gpio; - struct wsa881x_tz_priv tz_pdata; - int bg_cnt; - int clk_cnt; - int version; - struct mutex bg_lock; - struct mutex res_lock; - struct mutex temp_lock; - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - int state; - struct delayed_work ocp_ctl_work; - struct device_node *wsa_rst_np; - int pa_mute; - struct device_node *bolero_np; - struct platform_device* bolero_dev; - struct notifier_block bolero_nblock; - void *handle; - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -/* from bolero to WSA events */ -enum { - BOLERO_WSA_EVT_TX_CH_HOLD_CLEAR = 1, - BOLERO_WSA_EVT_PA_OFF_PRE_SSR, - BOLERO_WSA_EVT_SSR_DOWN, - BOLERO_WSA_EVT_SSR_UP, - BOLERO_WSA_EVT_PA_ON_POST_FSCLK, -}; - -struct wsa_ctrl_platform_data { - void *handle; - int (*update_wsa_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -#define SWR_SLV_MAX_REG_ADDR 0x390 -#define SWR_SLV_START_REG_ADDR 0x40 -#define SWR_SLV_MAX_BUF_LEN 25 -#define BYTES_PER_LINE 12 -#define SWR_SLV_RD_BUF_LEN 8 -#define SWR_SLV_WR_BUF_LEN 32 -#define SWR_SLV_MAX_DEVICES 2 - -#define WSA881X_VERSION_ENTRY_SIZE 27 -#define WSA881X_OCP_CTL_TIMER_SEC 2 -#define WSA881X_OCP_CTL_TEMP_CELSIUS 25 -#define WSA881X_OCP_CTL_POLL_TIMER_SEC 60 - -static int wsa881x_ocp_poll_timer_sec = WSA881X_OCP_CTL_POLL_TIMER_SEC; -module_param(wsa881x_ocp_poll_timer_sec, int, 0664); -MODULE_PARM_DESC(wsa881x_ocp_poll_timer_sec, "timer for ocp ctl polling"); - -static struct wsa881x_priv *dbgwsa881x; -static struct dentry *debugfs_wsa881x_dent; -static struct dentry *debugfs_peek; -static struct dentry *debugfs_poke; -static struct dentry *debugfs_reg_dump; -static unsigned int read_data; -static unsigned int devnum; - -static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec, - bool enable); - -static const char * const wsa_pa_gain_text[] = { - "G_18_DB", "G_16P5_DB", "G_15_DB", "G_13P5_DB", "G_12_DB", "G_10P5_DB", - "G_9_DB", "G_7P5_DB", "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", - "G_0_DB" -}; - -static const struct soc_enum wsa_pa_gain_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wsa_pa_gain_text), wsa_pa_gain_text); - -static int wsa_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->pa_gain; - - dev_dbg(codec->dev, "%s: PA gain = 0x%x\n", __func__, wsa881x->pa_gain); - - return 0; -} - -static int wsa_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - wsa881x->pa_gain = ucontrol->value.integer.value[0]; - - return 0; -} - -static int wsa881x_get_mute(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->pa_mute; - - return 0; -} - -static int wsa881x_set_mute(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: mute current %d, new %d\n", - __func__, wsa881x->pa_mute, value); - - if (value) - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x80, 0x00); - wsa881x->pa_mute = value; - - return 0; -} - -static int wsa881x_get_t0_init(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; - - ucontrol->value.integer.value[0] = pdata->t0_init; - dev_dbg(codec->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); - - return 0; -} - -static int wsa881x_set_t0_init(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; - - pdata->t0_init = ucontrol->value.integer.value[0]; - dev_dbg(codec->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); - - return 0; -} - -static const struct snd_kcontrol_new wsa_snd_controls[] = { - SOC_ENUM_EXT("WSA PA Gain", wsa_pa_gain_enum, - wsa_pa_gain_get, wsa_pa_gain_put), - SOC_SINGLE_EXT("WSA PA Mute", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_mute, wsa881x_set_mute), - SOC_SINGLE_EXT("WSA T0 Init", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_t0_init, wsa881x_set_t0_init), -}; - -static int codec_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t wsa881x_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, struct file *file, - char __user *buf, size_t count, loff_t pos) -{ - struct wsa881x_priv *wsa881x; - char buffer[WSA881X_VERSION_ENTRY_SIZE]; - int len; - - wsa881x = (struct wsa881x_priv *) entry->private_data; - if (!wsa881x) { - pr_err("%s: wsa881x priv is null\n", __func__); - return -EINVAL; - } - - len = snprintf(buffer, sizeof(buffer), "WSA881X-SOUNDWIRE_2_0\n"); - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wsa881x_codec_info_ops = { - .read = wsa881x_codec_version_read, -}; - -/* - * wsa881x_codec_info_create_codec_entry - creates wsa881x module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates wsa881x module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int wsa881x_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct wsa881x_priv *wsa881x; - struct snd_soc_card *card; - char name[80]; - - if (!codec_root || !codec) - return -EINVAL; - - wsa881x = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - snprintf(name, sizeof(name), "%s.%x", "wsa881x", - (u32)wsa881x->swr_slave->addr); - - wsa881x->entry = snd_info_create_subdir(codec_root->module, - (const char *)name, - codec_root); - if (!wsa881x->entry) { - dev_dbg(codec->dev, "%s: failed to create wsa881x entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - wsa881x->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wsa881x version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = wsa881x; - version_entry->size = WSA881X_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &wsa881x_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - wsa881x->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(wsa881x_codec_info_create_codec_entry); - -static bool is_swr_slv_reg_readable(int reg) -{ - bool ret = true; - - if (((reg > 0x46) && (reg < 0x4A)) || - ((reg > 0x4A) && (reg < 0x50)) || - ((reg > 0x55) && (reg < 0xE0)) || - ((reg > 0xE0) && (reg < 0xF0)) || - ((reg > 0xF0) && (reg < 0x100)) || - ((reg > 0x105) && (reg < 0x120)) || - ((reg > 0x128) && (reg < 0x130)) || - ((reg > 0x138) && (reg < 0x200)) || - ((reg > 0x205) && (reg < 0x220)) || - ((reg > 0x228) && (reg < 0x230)) || - ((reg > 0x238) && (reg < 0x300)) || - ((reg > 0x305) && (reg < 0x320)) || - ((reg > 0x328) && (reg < 0x330)) || - ((reg > 0x338) && (reg < 0x400)) || - ((reg > 0x405) && (reg < 0x420))) - ret = false; - - return ret; -} - -static ssize_t wsa881x_swrslave_reg_show(char __user *ubuf, size_t count, - loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[SWR_SLV_MAX_BUF_LEN]; - - if (!ubuf || !ppos || (devnum == 0)) - return 0; - - for (i = (((int) *ppos / BYTES_PER_LINE) + SWR_SLV_START_REG_ADDR); - i <= SWR_SLV_MAX_REG_ADDR; i++) { - if (!is_swr_slv_reg_readable(i)) - continue; - swr_read(dbgwsa881x->swr_slave, devnum, - i, ®_val, 1); - len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i, - (reg_val & 0xFF)); - if (len < 0) { - pr_err("%s: fail to fill the buffer\n", __func__); - total = -EFAULT; - goto copy_err; - } - - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t codec_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_SLV_RD_BUF_LEN]; - char *access_str; - ssize_t ret_cnt; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - access_str = file->private_data; - if (*ppos < 0) - return -EINVAL; - - if (!strcmp(access_str, "swrslave_peek")) { - snprintf(lbuf, sizeof(lbuf), "0x%x\n", (read_data & 0xFF)); - ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); - } else if (!strcmp(access_str, "swrslave_reg_dump")) { - ret_cnt = wsa881x_swrslave_reg_show(ubuf, count, ppos); - } else { - pr_err("%s: %s not permitted to read\n", __func__, access_str); - ret_cnt = -EPERM; - } - return ret_cnt; -} - -static ssize_t codec_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char lbuf[SWR_SLV_WR_BUF_LEN]; - int rc; - u32 param[5]; - char *access_str; - - if (!filp || !ppos || !ubuf) - return -EINVAL; - - access_str = filp->private_data; - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - if (!strcmp(access_str, "swrslave_poke")) { - /* write */ - rc = get_parameters(lbuf, param, 3); - if ((param[0] <= SWR_SLV_MAX_REG_ADDR) && (param[1] <= 0xFF) && - (rc == 0)) - swr_write(dbgwsa881x->swr_slave, param[2], - param[0], ¶m[1]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "swrslave_peek")) { - /* read */ - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= SWR_SLV_MAX_REG_ADDR) && (rc == 0)) - swr_read(dbgwsa881x->swr_slave, param[1], - param[0], &read_data, 1); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "swrslave_reg_dump")) { - /* reg dump */ - rc = get_parameters(lbuf, param, 1); - if ((rc == 0) && (param[0] > 0) && - (param[0] <= SWR_SLV_MAX_DEVICES)) - devnum = param[0]; - else - rc = -EINVAL; - } - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations codec_debug_ops = { - .open = codec_debug_open, - .write = codec_debug_write, - .read = codec_debug_read, -}; - -static void wsa881x_regcache_sync(struct wsa881x_priv *wsa881x) -{ - mutex_lock(&wsa881x->res_lock); - if (wsa881x->state != WSA881X_DEV_READY) { - regcache_mark_dirty(wsa881x->regmap); - regcache_sync(wsa881x->regmap); - wsa881x->state = WSA881X_DEV_READY; - } - mutex_unlock(&wsa881x->res_lock); -} - -static const struct reg_sequence wsa881x_pre_pmu_pa[] = { - {WSA881X_SPKR_DRV_GAIN, 0x41, 0}, - {WSA881X_SPKR_MISC_CTL1, 0x01, 0}, - {WSA881X_ADC_EN_DET_TEST_I, 0x01, 0}, - {WSA881X_ADC_EN_MODU_V, 0x02, 0}, - {WSA881X_ADC_EN_DET_TEST_V, 0x10, 0}, - {WSA881X_SPKR_PWRSTG_DBG, 0xA0, 0}, -}; - -static const struct reg_sequence wsa881x_pre_pmu_pa_2_0[] = { - {WSA881X_SPKR_DRV_GAIN, 0x41, 0}, - {WSA881X_SPKR_MISC_CTL1, 0x87, 0}, -}; - -static const struct reg_sequence wsa881x_post_pmu_pa[] = { - {WSA881X_SPKR_PWRSTG_DBG, 0x00, 0}, - {WSA881X_ADC_EN_DET_TEST_V, 0x00, 0}, - {WSA881X_ADC_EN_MODU_V, 0x00, 0}, - {WSA881X_ADC_EN_DET_TEST_I, 0x00, 0}, -}; - -static const struct reg_sequence wsa881x_vi_txfe_en[] = { - {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x85, 0}, - {WSA881X_SPKR_PROT_ATEST2, 0x0A, 0}, - {WSA881X_SPKR_PROT_FE_GAIN, 0xCF, 0}, -}; - -static const struct reg_sequence wsa881x_vi_txfe_en_2_0[] = { - {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x85, 0}, - {WSA881X_SPKR_PROT_ATEST2, 0x0A, 0}, - {WSA881X_SPKR_PROT_FE_GAIN, 0x47, 0}, -}; - -static int wsa881x_boost_ctrl(struct snd_soc_codec *codec, bool enable) -{ - dev_dbg(codec->dev, "%s: enable:%d\n", __func__, enable); - if (enable) - snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x80); - else - snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x00); - /* - * 1.5ms sleep is needed after boost enable/disable as per - * HW requirement - */ - usleep_range(1500, 1510); - return 0; -} - -static int wsa881x_visense_txfe_ctrl(struct snd_soc_codec *codec, bool enable, - u8 isense1_gain, u8 isense2_gain, - u8 vsense_gain) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, - "%s: enable:%d, isense1 gain: %d, isense2 gain: %d, vsense_gain %d\n", - __func__, enable, isense1_gain, isense2_gain, vsense_gain); - - if (enable) { - regmap_multi_reg_write(wsa881x->regmap, - wsa881x_vi_txfe_en_2_0, - ARRAY_SIZE(wsa881x_vi_txfe_en_2_0)); - } else { - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_VSENSE_VCM, - 0x08, 0x08); - /* - * 200us sleep is needed after visense txfe disable as per - * HW requirement. - */ - usleep_range(200, 210); - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN, - 0x01, 0x00); - } - return 0; -} - -static int wsa881x_visense_adc_ctrl(struct snd_soc_codec *codec, bool enable) -{ - - dev_dbg(codec->dev, "%s: enable:%d\n", __func__, enable); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, (0x01 << 7), - (enable << 7)); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_I, (0x01 << 7), - (enable << 7)); - return 0; -} - -static void wsa881x_bandgap_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: enable:%d, bg_count:%d\n", __func__, - enable, wsa881x->bg_cnt); - mutex_lock(&wsa881x->bg_lock); - if (enable) { - ++wsa881x->bg_cnt; - if (wsa881x->bg_cnt == 1) { - snd_soc_update_bits(codec, WSA881X_TEMP_OP, - 0x08, 0x08); - /* 400usec sleep is needed as per HW requirement */ - usleep_range(400, 410); - snd_soc_update_bits(codec, WSA881X_TEMP_OP, - 0x04, 0x04); - } - } else { - --wsa881x->bg_cnt; - if (wsa881x->bg_cnt <= 0) { - WARN_ON(wsa881x->bg_cnt < 0); - wsa881x->bg_cnt = 0; - snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x04, 0x00); - snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x08, 0x00); - } - } - mutex_unlock(&wsa881x->bg_lock); -} - -static void wsa881x_clk_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: enable:%d, clk_count:%d\n", __func__, - enable, wsa881x->clk_cnt); - mutex_lock(&wsa881x->res_lock); - if (enable) { - ++wsa881x->clk_cnt; - if (wsa881x->clk_cnt == 1) { - snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x01); - snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x01); - } - } else { - --wsa881x->clk_cnt; - if (wsa881x->clk_cnt <= 0) { - WARN_ON(wsa881x->clk_cnt < 0); - wsa881x->clk_cnt = 0; - snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x00); - snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x00); - } - } - mutex_unlock(&wsa881x->res_lock); -} - -static int wsa881x_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->comp_enable; - return 0; -} - -static int wsa881x_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Compander enable current %d, new %d\n", - __func__, wsa881x->comp_enable, value); - wsa881x->comp_enable = value; - return 0; -} - -static int wsa881x_get_boost(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->boost_enable; - return 0; -} - -static int wsa881x_set_boost(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Boost enable current %d, new %d\n", - __func__, wsa881x->boost_enable, value); - wsa881x->boost_enable = value; - return 0; -} - -static int wsa881x_get_visense(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->visense_enable; - return 0; -} - -static int wsa881x_set_visense(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: VIsense enable current %d, new %d\n", - __func__, wsa881x->visense_enable, value); - wsa881x->visense_enable = value; - return 0; -} - -static int wsa881x_set_boost_level(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u8 wsa_boost_level = 0; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - wsa_boost_level = ucontrol->value.integer.value[0]; - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1, - 0xff, wsa_boost_level); - - return 0; -} - -static int wsa881x_get_boost_level(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u8 wsa_boost_level = 0; - - wsa_boost_level = snd_soc_read(codec, WSA881X_BOOST_PRESET_OUT1); - ucontrol->value.integer.value[0] = wsa_boost_level; - dev_dbg(codec->dev, "%s: boost level = 0x%x\n", __func__, - wsa_boost_level); - - return 0; -} - -static const struct snd_kcontrol_new wsa881x_snd_controls[] = { - SOC_SINGLE_EXT("COMP Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_compander, wsa881x_set_compander), - - SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_boost, wsa881x_set_boost), - - SOC_SINGLE_EXT("VISENSE Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_visense, wsa881x_set_visense), - - SOC_SINGLE_EXT("Boost Level", SND_SOC_NOPM, 0, 0xff, 0, - wsa881x_get_boost_level, wsa881x_set_boost_level), -}; - -static const struct snd_kcontrol_new swr_dac_port[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static int wsa881x_set_port(struct snd_soc_codec *codec, int port_idx, - u8 *port_id, u8 *num_ch, u8 *ch_mask, u32 *ch_rate, - u8 *port_type) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - *port_id = wsa881x->port[port_idx].port_id; - *num_ch = wsa881x->port[port_idx].num_ch; - *ch_mask = wsa881x->port[port_idx].ch_mask; - *ch_rate = wsa881x->port[port_idx].ch_rate; - *port_type = wsa881x->port[port_idx].port_type; - return 0; -} - -static int wsa881x_enable_swr_dac_port(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - u8 port_id[WSA881X_MAX_SWR_PORTS]; - u8 num_ch[WSA881X_MAX_SWR_PORTS]; - u8 ch_mask[WSA881X_MAX_SWR_PORTS]; - u32 ch_rate[WSA881X_MAX_SWR_PORTS]; - u8 port_type[WSA881X_MAX_SWR_PORTS]; - u8 num_port = 0; - - dev_dbg(codec->dev, "%s: event %d name %s\n", __func__, - event, w->name); - if (wsa881x == NULL) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wsa881x_set_port(codec, SWR_DAC_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - - if (wsa881x->comp_enable) { - wsa881x_set_port(codec, SWR_COMP_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->boost_enable) { - wsa881x_set_port(codec, SWR_BOOST_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->visense_enable) { - wsa881x_set_port(codec, SWR_VISENSE_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - swr_connect_port(wsa881x->swr_slave, &port_id[0], num_port, - &ch_mask[0], &ch_rate[0], &num_ch[0], - &port_type[0]); - break; - case SND_SOC_DAPM_POST_PMU: - break; - case SND_SOC_DAPM_PRE_PMD: - break; - case SND_SOC_DAPM_POST_PMD: - wsa881x_set_port(codec, SWR_DAC_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - - if (wsa881x->comp_enable) { - wsa881x_set_port(codec, SWR_COMP_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->boost_enable) { - wsa881x_set_port(codec, SWR_BOOST_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->visense_enable) { - wsa881x_set_port(codec, SWR_VISENSE_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - swr_disconnect_port(wsa881x->swr_slave, &port_id[0], num_port, - &ch_mask[0], &port_type[0]); - break; - default: - break; - } - return 0; -} - -static int wsa881x_rdac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: %s %d boost %d visense %d\n", __func__, - w->name, event, wsa881x->boost_enable, - wsa881x->visense_enable); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - mutex_lock(&wsa881x->temp_lock); - wsa881x_resource_acquire(codec, ENABLE); - mutex_unlock(&wsa881x->temp_lock); - wsa881x_boost_ctrl(codec, ENABLE); - break; - case SND_SOC_DAPM_POST_PMD: - swr_slvdev_datapath_control(wsa881x->swr_slave, - wsa881x->swr_slave->dev_num, - false); - wsa881x_boost_ctrl(codec, DISABLE); - mutex_lock(&wsa881x->temp_lock); - wsa881x_resource_acquire(codec, DISABLE); - mutex_unlock(&wsa881x->temp_lock); - break; - } - return 0; -} - -static int wsa881x_ramp_pa_gain(struct snd_soc_codec *codec, - int min_gain, int max_gain, int udelay) -{ - int val; - - for (val = min_gain; max_gain <= val; val--) { - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, - 0xF0, val << 4); - /* - * 1ms delay is needed for every step change in gain as per - * HW requirement. - */ - usleep_range(udelay, udelay+10); - } - return 0; -} - -static void wsa881x_ocp_ctl_work(struct work_struct *work) -{ - struct wsa881x_priv *wsa881x; - struct delayed_work *dwork; - struct snd_soc_codec *codec; - int temp_val; - - dwork = to_delayed_work(work); - wsa881x = container_of(dwork, struct wsa881x_priv, ocp_ctl_work); - - codec = wsa881x->codec; - wsa881x_get_temp(wsa881x->tz_pdata.tz_dev, &temp_val); - dev_dbg(codec->dev, " temp = %d\n", temp_val); - - if (temp_val <= WSA881X_OCP_CTL_TEMP_CELSIUS) - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x00); - else - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0); - - schedule_delayed_work(&wsa881x->ocp_ctl_work, - msecs_to_jiffies(wsa881x_ocp_poll_timer_sec * 1000)); -} - -static int wsa881x_spkr_pa_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int min_gain, max_gain; - - dev_dbg(codec->dev, "%s: %s %d\n", __func__, w->name, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x80); - regmap_multi_reg_write(wsa881x->regmap, - wsa881x_pre_pmu_pa_2_0, - ARRAY_SIZE(wsa881x_pre_pmu_pa_2_0)); - swr_slvdev_datapath_control(wsa881x->swr_slave, - wsa881x->swr_slave->dev_num, - true); - /* Set register mode if compander is not enabled */ - if (!wsa881x->comp_enable) - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, - 0x08, 0x08); - else - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, - 0x08, 0x00); - - break; - case SND_SOC_DAPM_POST_PMU: - if (!wsa881x->bolero_dev) - snd_soc_update_bits(codec, - WSA881X_SPKR_DRV_EN, - 0x80, 0x80); - if (!wsa881x->comp_enable) { - max_gain = wsa881x->pa_gain; - /* - * Gain has to set incrementally in 4 steps - * as per HW sequence - */ - if (max_gain > G_4P5DB) - min_gain = G_0DB; - else - min_gain = max_gain + 3; - /* - * 1ms delay is needed before change in gain - * as per HW requirement. - */ - usleep_range(1000, 1010); - wsa881x_ramp_pa_gain(codec, min_gain, max_gain, 1000); - } - if (wsa881x->visense_enable) { - wsa881x_visense_txfe_ctrl(codec, ENABLE, - 0x00, 0x03, 0x01); - snd_soc_update_bits(codec, WSA881X_ADC_EN_SEL_IBAIS, - 0x07, 0x01); - wsa881x_visense_adc_ctrl(codec, ENABLE); - } - schedule_delayed_work(&wsa881x->ocp_ctl_work, - msecs_to_jiffies(WSA881X_OCP_CTL_TIMER_SEC * 1000)); - /* Force remove group */ - swr_remove_from_group(wsa881x->swr_slave, - wsa881x->swr_slave->dev_num); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x80, 0x00); - if (wsa881x->visense_enable) { - wsa881x_visense_adc_ctrl(codec, DISABLE); - wsa881x_visense_txfe_ctrl(codec, DISABLE, - 0x00, 0x01, 0x01); - } - cancel_delayed_work_sync(&wsa881x->ocp_ctl_work); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0); - break; - } - return 0; -} - -static const struct snd_soc_dapm_widget wsa881x_dapm_widgets[] = { - SND_SOC_DAPM_INPUT("IN"), - - SND_SOC_DAPM_MIXER_E("SWR DAC_Port", SND_SOC_NOPM, 0, 0, swr_dac_port, - ARRAY_SIZE(swr_dac_port), wsa881x_enable_swr_dac_port, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_DAC_E("RDAC", NULL, WSA881X_SPKR_DAC_CTL, 7, 0, - wsa881x_rdac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_PGA_E("SPKR PGA", SND_SOC_NOPM, 0, 0, NULL, 0, - wsa881x_spkr_pa_event, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("SPKR"), -}; - -static const struct snd_soc_dapm_route wsa881x_audio_map[] = { - {"SWR DAC_Port", "Switch", "IN"}, - {"RDAC", NULL, "SWR DAC_Port"}, - {"SPKR PGA", NULL, "RDAC"}, - {"SPKR", NULL, "SPKR PGA"}, -}; - -int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, u8 num_port, - unsigned int *ch_mask, unsigned int *ch_rate, - u8 *port_type) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int i; - - if (!port || !ch_mask || !ch_rate || - (num_port > WSA881X_MAX_SWR_PORTS)) { - dev_err(codec->dev, - "%s: Invalid port=%pK, ch_mask=%pK, ch_rate=%pK\n", - __func__, port, ch_mask, ch_rate); - return -EINVAL; - } - for (i = 0; i < num_port; i++) { - wsa881x->port[i].port_id = port[i]; - wsa881x->port[i].ch_mask = ch_mask[i]; - wsa881x->port[i].ch_rate = ch_rate[i]; - wsa881x->port[i].num_ch = __sw_hweight8(ch_mask[i]); - if (port_type) - wsa881x->port[i].port_type = port_type[i]; - } - return 0; -} -EXPORT_SYMBOL(wsa881x_set_channel_map); - -static void wsa881x_init(struct snd_soc_codec *codec) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - wsa881x->version = snd_soc_read(codec, WSA881X_CHIP_ID1); - wsa881x_regmap_defaults(wsa881x->regmap, wsa881x->version); - /* Enable software reset output from soundwire slave */ - snd_soc_update_bits(codec, WSA881X_SWR_RESET_EN, 0x07, 0x07); - /* Bring out of analog reset */ - snd_soc_update_bits(codec, WSA881X_CDC_RST_CTL, 0x02, 0x02); - /* Bring out of digital reset */ - snd_soc_update_bits(codec, WSA881X_CDC_RST_CTL, 0x01, 0x01); - - snd_soc_update_bits(codec, WSA881X_CLOCK_CONFIG, 0x10, 0x10); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0xC0, 0x80); - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0x06, 0x06); - snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_INT, 0xFF, 0x00); - snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0xF0, 0x40); - snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0x0E, 0x0E); - snd_soc_update_bits(codec, WSA881X_BOOST_LOOP_STABILITY, - 0x03, 0x03); - snd_soc_update_bits(codec, WSA881X_BOOST_MISC2_CTL, 0xFF, 0x14); - snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, 0x80, 0x80); - snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, 0x03, 0x00); - snd_soc_update_bits(codec, WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, - 0x0C, 0x04); - snd_soc_update_bits(codec, WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, - 0x03, 0x00); - if (snd_soc_read(codec, WSA881X_OTP_REG_0)) - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1, - 0xF0, 0x70); - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT2, - 0xF0, 0x30); - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x08, 0x08); - snd_soc_update_bits(codec, WSA881X_BOOST_CURRENT_LIMIT, - 0x0F, 0x08); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x30, 0x30); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x0C, 0x00); - snd_soc_update_bits(codec, WSA881X_OTP_REG_28, 0x3F, 0x3A); - snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG1, - 0xFF, 0xB2); - snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG2, - 0xFF, 0x05); -} - -static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec, - bool enable) -{ - wsa881x_clk_ctrl(codec, enable); - wsa881x_bandgap_ctrl(codec, enable); - return 0; -} - -static int32_t wsa881x_temp_reg_read(struct snd_soc_codec *codec, - struct wsa_temp_register *wsa_temp_reg) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct swr_device *dev; - u8 retry = WSA881X_NUM_RETRY; - u8 devnum = 0; - - if (!wsa881x) { - dev_err(codec->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - dev = wsa881x->swr_slave; - if (dev && (wsa881x->state == WSA881X_DEV_DOWN)) { - while (swr_get_logical_dev_num(dev, dev->addr, &devnum) && - retry--) { - /* Retry after 1 msec delay */ - usleep_range(1000, 1100); - } - if (retry == 0) { - dev_err(codec->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, dev->addr); - return -EINVAL; - } - } - wsa881x_regcache_sync(wsa881x); - mutex_lock(&wsa881x->temp_lock); - wsa881x_resource_acquire(codec, ENABLE); - - snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x00); - wsa_temp_reg->dmeas_msb = snd_soc_read(codec, WSA881X_TEMP_MSB); - wsa_temp_reg->dmeas_lsb = snd_soc_read(codec, WSA881X_TEMP_LSB); - snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x01); - wsa_temp_reg->d1_msb = snd_soc_read(codec, WSA881X_OTP_REG_1); - wsa_temp_reg->d1_lsb = snd_soc_read(codec, WSA881X_OTP_REG_2); - wsa_temp_reg->d2_msb = snd_soc_read(codec, WSA881X_OTP_REG_3); - wsa_temp_reg->d2_lsb = snd_soc_read(codec, WSA881X_OTP_REG_4); - - wsa881x_resource_acquire(codec, DISABLE); - mutex_unlock(&wsa881x->temp_lock); - - return 0; -} - -static int wsa881x_probe(struct snd_soc_codec *codec) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct swr_device *dev; - - if (!wsa881x) - return -EINVAL; - snd_soc_codec_init_regmap(codec, wsa881x->regmap); - - dev = wsa881x->swr_slave; - wsa881x->codec = codec; - mutex_init(&wsa881x->bg_lock); - wsa881x_init(codec); - snprintf(wsa881x->tz_pdata.name, sizeof(wsa881x->tz_pdata.name), - "%s.%x", "wsatz", (u8)dev->addr); - wsa881x->bg_cnt = 0; - wsa881x->clk_cnt = 0; - wsa881x->tz_pdata.codec = codec; - wsa881x->tz_pdata.wsa_temp_reg_read = wsa881x_temp_reg_read; - wsa881x_init_thermal(&wsa881x->tz_pdata); - snd_soc_add_codec_controls(codec, wsa_snd_controls, - ARRAY_SIZE(wsa_snd_controls)); - INIT_DELAYED_WORK(&wsa881x->ocp_ctl_work, wsa881x_ocp_ctl_work); - return 0; -} - -static int wsa881x_remove(struct snd_soc_codec *codec) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - if (wsa881x->tz_pdata.tz_dev) - wsa881x_deinit_thermal(wsa881x->tz_pdata.tz_dev); - mutex_destroy(&wsa881x->bg_lock); - - return 0; -} - -static struct regmap *wsa881x_get_regmap(struct device *dev) -{ - struct wsa881x_priv *control = swr_get_dev_data(to_swr_device(dev)); - - if (!control) - return NULL; - - return control->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_wsa881x = { - .probe = wsa881x_probe, - .remove = wsa881x_remove, - .get_regmap = wsa881x_get_regmap, - .component_driver = { - .controls = wsa881x_snd_controls, - .num_controls = ARRAY_SIZE(wsa881x_snd_controls), - .dapm_widgets = wsa881x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wsa881x_dapm_widgets), - .dapm_routes = wsa881x_audio_map, - .num_dapm_routes = ARRAY_SIZE(wsa881x_audio_map), - }, -}; - -static int wsa881x_gpio_ctrl(struct wsa881x_priv *wsa881x, bool enable) -{ - int ret = 0; - - if (wsa881x->pd_gpio < 0) { - dev_err(wsa881x->dev, "%s: gpio is not valid %d\n", - __func__, wsa881x->pd_gpio); - return -EINVAL; - } - - if (wsa881x->wsa_rst_np) { - if (enable) - ret = msm_cdc_pinctrl_select_active_state( - wsa881x->wsa_rst_np); - else - ret = msm_cdc_pinctrl_select_sleep_state( - wsa881x->wsa_rst_np); - if (ret != 0) - dev_err(wsa881x->dev, - "%s: Failed to turn state %d; ret=%d\n", - __func__, enable, ret); - } else { - if (gpio_is_valid(wsa881x->pd_gpio)) - gpio_direction_output(wsa881x->pd_gpio, enable); - } - - return ret; -} - -static int wsa881x_gpio_init(struct swr_device *pdev) -{ - int ret = 0; - struct wsa881x_priv *wsa881x; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(&pdev->dev, "%s: gpio %d request with name %s\n", - __func__, wsa881x->pd_gpio, dev_name(&pdev->dev)); - ret = gpio_request(wsa881x->pd_gpio, dev_name(&pdev->dev)); - if (ret) { - if (ret == -EBUSY) { - /* GPIO was already requested */ - dev_dbg(&pdev->dev, - "%s: gpio %d is already set to high\n", - __func__, wsa881x->pd_gpio); - ret = 0; - } else { - dev_err(&pdev->dev, "%s: Failed to request gpio %d, err: %d\n", - __func__, wsa881x->pd_gpio, ret); - } - } - return ret; -} - -static int wsa881x_event_notify(struct notifier_block *nb, - unsigned long val, void *ptr) -{ - u16 event = (val & 0xffff); - struct wsa881x_priv *wsa881x = container_of(nb, struct wsa881x_priv, - bolero_nblock); - - if (!wsa881x) - return -EINVAL; - - switch (event) { - case BOLERO_WSA_EVT_PA_OFF_PRE_SSR: - snd_soc_update_bits(wsa881x->codec, - WSA881X_SPKR_DRV_GAIN, - 0xF0, 0xC0); - snd_soc_update_bits(wsa881x->codec, - WSA881X_SPKR_DRV_EN, - 0x80, 0x00); - break; - case BOLERO_WSA_EVT_PA_ON_POST_FSCLK: - if ((snd_soc_read(wsa881x->codec, - WSA881X_SPKR_DAC_CTL) & 0x80) == 0x80) - snd_soc_update_bits(wsa881x->codec, - WSA881X_SPKR_DRV_EN, - 0x80, 0x80); - break; - default: - break; - } - - return 0; -} - -static int wsa881x_swr_probe(struct swr_device *pdev) -{ - int ret = 0; - struct wsa881x_priv *wsa881x; - u8 devnum = 0; - bool pin_state_current = false; - struct wsa_ctrl_platform_data *plat_data = NULL; - - wsa881x = devm_kzalloc(&pdev->dev, sizeof(struct wsa881x_priv), - GFP_KERNEL); - if (!wsa881x) - return -ENOMEM; - wsa881x->wsa_rst_np = of_parse_phandle(pdev->dev.of_node, - "qcom,spkr-sd-n-node", 0); - if (!wsa881x->wsa_rst_np) { - dev_dbg(&pdev->dev, "%s: Not using pinctrl, fallback to gpio\n", - __func__); - wsa881x->pd_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,spkr-sd-n-gpio", 0); - if (wsa881x->pd_gpio < 0) { - dev_err(&pdev->dev, "%s: %s property is not found %d\n", - __func__, "qcom,spkr-sd-n-gpio", - wsa881x->pd_gpio); - goto err; - } - dev_dbg(&pdev->dev, "%s: reset gpio %d\n", __func__, - wsa881x->pd_gpio); - } - swr_set_dev_data(pdev, wsa881x); - - wsa881x->swr_slave = pdev; - - if (!wsa881x->wsa_rst_np) { - ret = wsa881x_gpio_init(pdev); - if (ret) - goto err; - } - if (wsa881x->wsa_rst_np) - pin_state_current = msm_cdc_pinctrl_get_state( - wsa881x->wsa_rst_np); - wsa881x_gpio_ctrl(wsa881x, true); - wsa881x->state = WSA881X_DEV_UP; - - if (!debugfs_wsa881x_dent) { - dbgwsa881x = wsa881x; - debugfs_wsa881x_dent = debugfs_create_dir( - "wsa881x_swr_slave", 0); - if (!IS_ERR(debugfs_wsa881x_dent)) { - debugfs_peek = debugfs_create_file("swrslave_peek", - S_IFREG | 0444, debugfs_wsa881x_dent, - (void *) "swrslave_peek", - &codec_debug_ops); - - debugfs_poke = debugfs_create_file("swrslave_poke", - S_IFREG | 0444, debugfs_wsa881x_dent, - (void *) "swrslave_poke", - &codec_debug_ops); - - debugfs_reg_dump = debugfs_create_file( - "swrslave_reg_dump", - S_IFREG | 0444, - debugfs_wsa881x_dent, - (void *) "swrslave_reg_dump", - &codec_debug_ops); - } - } - - /* - * Add 5msec delay to provide sufficient time for - * soundwire auto enumeration of slave devices as - * as per HW requirement. - */ - usleep_range(5000, 5010); - ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum); - if (ret) { - dev_dbg(&pdev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, pdev->addr); - goto dev_err; - } - pdev->dev_num = devnum; - - wsa881x->regmap = devm_regmap_init_swr(pdev, - &wsa881x_regmap_config); - if (IS_ERR(wsa881x->regmap)) { - ret = PTR_ERR(wsa881x->regmap); - dev_err(&pdev->dev, "%s: regmap_init failed %d\n", - __func__, ret); - goto dev_err; - } - - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wsa881x, - NULL, 0); - if (ret) { - dev_err(&pdev->dev, "%s: Codec registration failed\n", - __func__); - goto dev_err; - } - - wsa881x->bolero_np = of_parse_phandle(pdev->dev.of_node, - "qcom,bolero-handle", 0); - if (wsa881x->bolero_np) { - wsa881x->bolero_dev = - of_find_device_by_node(wsa881x->bolero_np); - if (wsa881x->bolero_dev) { - plat_data = dev_get_platdata(&wsa881x->bolero_dev->dev); - if (plat_data) { - wsa881x->bolero_nblock.notifier_call = - wsa881x_event_notify; - if (plat_data->register_notifier) - plat_data->register_notifier( - plat_data->handle, - &wsa881x->bolero_nblock, - true); - wsa881x->register_notifier = - plat_data->register_notifier; - wsa881x->handle = plat_data->handle; - } else { - dev_err(&pdev->dev, "%s: plat data not found\n", - __func__); - } - } else { - dev_err(&pdev->dev, "%s: bolero dev not found\n", - __func__); - } - } else { - dev_info(&pdev->dev, "%s: bolero node not found\n", __func__); - } - - mutex_init(&wsa881x->res_lock); - mutex_init(&wsa881x->temp_lock); - - return 0; - -dev_err: - if (pin_state_current == false) - wsa881x_gpio_ctrl(wsa881x, false); - swr_remove_device(pdev); -err: - return ret; -} - -static int wsa881x_swr_remove(struct swr_device *pdev) -{ - struct wsa881x_priv *wsa881x; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - - if (wsa881x->register_notifier) - wsa881x->register_notifier(wsa881x->handle, - &wsa881x->bolero_nblock, false); - debugfs_remove_recursive(debugfs_wsa881x_dent); - debugfs_wsa881x_dent = NULL; - mutex_destroy(&wsa881x->res_lock); - mutex_destroy(&wsa881x->temp_lock); - snd_soc_unregister_codec(&pdev->dev); - if (wsa881x->pd_gpio) - gpio_free(wsa881x->pd_gpio); - swr_set_dev_data(pdev, NULL); - return 0; -} - -static int wsa881x_swr_up(struct swr_device *pdev) -{ - int ret; - struct wsa881x_priv *wsa881x; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - ret = wsa881x_gpio_ctrl(wsa881x, true); - if (ret) - dev_err(&pdev->dev, "%s: Failed to enable gpio\n", __func__); - else - wsa881x->state = WSA881X_DEV_UP; - - return ret; -} - -static int wsa881x_swr_down(struct swr_device *pdev) -{ - struct wsa881x_priv *wsa881x; - int ret; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - if (delayed_work_pending(&wsa881x->ocp_ctl_work)) - cancel_delayed_work_sync(&wsa881x->ocp_ctl_work); - ret = wsa881x_gpio_ctrl(wsa881x, false); - if (ret) - dev_err(&pdev->dev, "%s: Failed to disable gpio\n", __func__); - else - wsa881x->state = WSA881X_DEV_DOWN; - - return ret; -} - -static int wsa881x_swr_reset(struct swr_device *pdev) -{ - struct wsa881x_priv *wsa881x; - u8 retry = WSA881X_NUM_RETRY; - u8 devnum = 0; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - if (wsa881x->state == WSA881X_DEV_READY) { - dev_dbg(&pdev->dev, "%s: device already active\n", __func__); - return 0; - } - - wsa881x->bg_cnt = 0; - wsa881x->clk_cnt = 0; - while (swr_get_logical_dev_num(pdev, pdev->addr, &devnum) && retry--) { - /* Retry after 1 msec delay */ - usleep_range(1000, 1100); - } - pdev->dev_num = devnum; - wsa881x_regcache_sync(wsa881x); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int wsa881x_swr_suspend(struct device *dev) -{ - dev_dbg(dev, "%s: system suspend\n", __func__); - return 0; -} - -static int wsa881x_swr_resume(struct device *dev) -{ - struct wsa881x_priv *wsa881x = swr_get_dev_data(to_swr_device(dev)); - - if (!wsa881x) { - dev_err(dev, "%s: wsa881x private data is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(dev, "%s: system resume\n", __func__); - return 0; -} -#endif /* CONFIG_PM_SLEEP */ - -static const struct dev_pm_ops wsa881x_swr_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(wsa881x_swr_suspend, wsa881x_swr_resume) -}; - -static const struct swr_device_id wsa881x_swr_id[] = { - {"wsa881x", 0}, - {} -}; - -static const struct of_device_id wsa881x_swr_dt_match[] = { - { - .compatible = "qcom,wsa881x", - }, - {} -}; - -static struct swr_driver wsa881x_codec_driver = { - .driver = { - .name = "wsa881x", - .owner = THIS_MODULE, - .pm = &wsa881x_swr_pm_ops, - .of_match_table = wsa881x_swr_dt_match, - }, - .probe = wsa881x_swr_probe, - .remove = wsa881x_swr_remove, - .id_table = wsa881x_swr_id, - .device_up = wsa881x_swr_up, - .device_down = wsa881x_swr_down, - .reset_device = wsa881x_swr_reset, -}; - -static int __init wsa881x_codec_init(void) -{ - return swr_driver_register(&wsa881x_codec_driver); -} - -static void __exit wsa881x_codec_exit(void) -{ - swr_driver_unregister(&wsa881x_codec_driver); -} - -module_init(wsa881x_codec_init); -module_exit(wsa881x_codec_exit); - -MODULE_DESCRIPTION("WSA881x Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/codecs/wsa881x.h b/techpack/audio/4.0/asoc/codecs/wsa881x.h deleted file mode 100644 index 802a97eaa33f..000000000000 --- a/techpack/audio/4.0/asoc/codecs/wsa881x.h +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _WSA881X_H -#define _WSA881X_H - -#include -#include -#include -#include "wsa881x-registers.h" - -#define WSA881X_MAX_SWR_PORTS 4 - -#if IS_ENABLED(CONFIG_SND_SOC_WSA881X) -extern int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, - u8 num_port, unsigned int *ch_mask, - unsigned int *ch_rate, u8 *port_type); - -extern const u8 wsa881x_reg_readable[WSA881X_CACHE_SIZE]; -extern struct regmap_config wsa881x_regmap_config; -extern int wsa881x_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -void wsa881x_regmap_defaults(struct regmap *regmap, u8 version); - -#else -extern int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, - u8 num_port, unsigned int *ch_mask, - unsigned int *ch_rate, u8 *port_type); -{ - return 0; -} - -extern int wsa881x_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} - -void wsa881x_regmap_defaults(struct regmap *regmap, u8 version) -{ -} - -#endif - -#endif /* _WSA881X_H */ diff --git a/techpack/audio/4.0/asoc/device_event.h b/techpack/audio/4.0/asoc/device_event.h deleted file mode 100644 index 5327f0ef1a22..000000000000 --- a/techpack/audio/4.0/asoc/device_event.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - */ - -#ifndef __DEVICE_EVENT_H -#define __DEVICE_EVENT_H - -#define QC_AUDIO_EXTERNAL_SPK_1_EVENT "qc_ext_spk_1" -#define QC_AUDIO_EXTERNAL_SPK_2_EVENT "qc_ext_spk_2" -#define QC_AUDIO_EXTERNAL_MIC_EVENT "qc_ext_mic" - -#endif /* __DEVICE_EVENT_H */ diff --git a/techpack/audio/4.0/asoc/kona-port-config.h b/techpack/audio/4.0/asoc/kona-port-config.h deleted file mode 100644 index 723c94a7dde3..000000000000 --- a/techpack/audio/4.0/asoc/kona-port-config.h +++ /dev/null @@ -1,76 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _KONA_PORT_CONFIG -#define _KONA_PORT_CONFIG - -#include - -#define WSA_MSTR_PORT_MASK 0xFF -/* - * Add port configuration in the format - *{ si, off1, off2, hstart, hstop, wd_len, bp_mode, bgp_ctrl, lane_ctrl} - */ - -static struct port_params wsa_frame_params_default[SWR_MSTR_PORT_LEN] = { - {7, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {31, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {63, 12, 31, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF}, - {7, 6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {31, 18, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {63, 13, 31, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF}, - {15, 7, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {15, 10, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, -}; - -static struct port_params rx_frame_params_default[SWR_MSTR_PORT_LEN] = { - {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, - {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, - {31, 11, 11, 0xFF, 0xFF, 4, 1, 0xFF, 0}, - {7, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, - {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0}, -}; - -static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { - {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, - {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, - {31, 11, 11, 0xFF, 0xFF, 4, 1, 0xFF, 0}, - {7, 9, 0, 0xFF, 0xFF, 0xFF, 0xFF, 1, 0}, - {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 3, 0}, -}; - -/* TX UC1: TX1: 1ch, TX2: 2chs, TX3: 1ch(MBHC) */ -static struct port_params tx_frame_params_default[SWR_MSTR_PORT_LEN] = { - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},/* PCM OUT */ - {1, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX1 */ - {1, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1}, /* TX2 */ - {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX3 */ - {3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1}, /* TX4 */ -}; - -/* TX UC1: TX1: 1ch, TX2: 2chs, TX3: 1ch(MBHC) */ -static struct port_params tx_frame_params_v2[SWR_MSTR_PORT_LEN] = { - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},/* PCM OUT */ - {1, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1}, /* TX1 */ - {1, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 2}, /* TX2 */ - {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX3 */ - {3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 2}, /* TX4 */ -}; - -static struct swr_mstr_port_map sm_port_map[] = { - {TX_MACRO, SWR_UC0, tx_frame_params_default}, - {RX_MACRO, SWR_UC0, rx_frame_params_default}, - {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, - {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, -}; - -static struct swr_mstr_port_map sm_port_map_v2[] = { - {TX_MACRO, SWR_UC0, tx_frame_params_v2}, - {RX_MACRO, SWR_UC0, rx_frame_params_default}, - {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, - {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, -}; - -#endif /* _KONA_PORT_CONFIG */ diff --git a/techpack/audio/4.0/asoc/kona.c b/techpack/audio/4.0/asoc/kona.c deleted file mode 100644 index 005a9becfa61..000000000000 --- a/techpack/audio/4.0/asoc/kona.c +++ /dev/null @@ -1,8314 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "device_event.h" -#include "msm-pcm-routing-v2.h" -#include "asoc/msm-cdc-pinctrl.h" -#include "asoc/wcd-mbhc-v2.h" -#include "codecs/wcd938x/wcd938x-mbhc.h" -#include "codecs/wcd937x/wcd937x-mbhc.h" -#include "codecs/wsa881x.h" -#include "codecs/wcd938x/wcd938x.h" -#include "codecs/wcd937x/wcd937x.h" -#include "codecs/bolero/bolero-cdc.h" -#include -#include "codecs/bolero/wsa-macro.h" -#include "kona-port-config.h" - -#define DRV_NAME "kona-asoc-snd" -#define __CHIPSET__ "KONA " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define IS_FRACTIONAL(x) \ -((x == SAMPLING_RATE_11P025KHZ) || (x == SAMPLING_RATE_22P05KHZ) || \ -(x == SAMPLING_RATE_44P1KHZ) || (x == SAMPLING_RATE_88P2KHZ) || \ -(x == SAMPLING_RATE_176P4KHZ) || (x == SAMPLING_RATE_352P8KHZ)) - -#define IS_MSM_INTERFACE_MI2S(x) \ -((x == PRIM_MI2S) || (x == SEC_MI2S) || (x == TERT_MI2S)) - -#define WCD9XXX_MBHC_DEF_RLOADS 5 -#define WCD9XXX_MBHC_DEF_BUTTONS 8 -#define CODEC_EXT_CLK_RATE 9600000 -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define DEV_NAME_STR_LEN 32 -#define WCD_MBHC_HS_V_MAX 1600 - -#define TDM_CHANNEL_MAX 8 -#define DEV_NAME_STR_LEN 32 - -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ - -#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 - -enum { - RX_PATH = 0, - TX_PATH, - MAX_PATH, -}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -#define TDM_MAX_SLOTS 8 -#define TDM_SLOT_WIDTH_BITS 32 - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_QUIN, - TDM_SEN, - TDM_INTERFACE_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - QUIN_AUX_PCM, - SEN_AUX_PCM, - AUX_PCM_MAX, -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - QUIN_MI2S, - SEN_MI2S, - MI2S_MAX, -}; - -enum { - WSA_CDC_DMA_RX_0 = 0, - WSA_CDC_DMA_RX_1, - RX_CDC_DMA_RX_0, - RX_CDC_DMA_RX_1, - RX_CDC_DMA_RX_2, - RX_CDC_DMA_RX_3, - RX_CDC_DMA_RX_5, - CDC_DMA_RX_MAX, -}; - -enum { - WSA_CDC_DMA_TX_0 = 0, - WSA_CDC_DMA_TX_1, - WSA_CDC_DMA_TX_2, - TX_CDC_DMA_TX_0, - TX_CDC_DMA_TX_3, - TX_CDC_DMA_TX_4, - VA_CDC_DMA_TX_0, - VA_CDC_DMA_TX_1, - VA_CDC_DMA_TX_2, - CDC_DMA_TX_MAX, -}; - -enum { - SLIM_RX_7 = 0, - SLIM_RX_MAX, -}; -enum { - SLIM_TX_7 = 0, - SLIM_TX_8, - SLIM_TX_MAX, -}; - -enum { - AFE_LOOPBACK_TX_IDX = 0, - AFE_LOOPBACK_TX_IDX_MAX, -}; -struct msm_asoc_mach_data { - struct snd_info_entry *codec_root; - int usbc_en2_gpio; /* used by gpio driver API */ - struct device_node *dmic01_gpio_p; /* used by pinctrl API */ - struct device_node *dmic23_gpio_p; /* used by pinctrl API */ - struct device_node *dmic45_gpio_p; /* used by pinctrl API */ - struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */ - atomic_t mi2s_gpio_ref_count[MI2S_MAX]; /* used by pinctrl API */ - struct device_node *us_euro_gpio_p; /* used by pinctrl API */ - struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ - bool is_afe_config_done; - struct device_node *fsa_handle; - struct clk *lpass_audio_hw_vote; - int core_audio_vote_count; -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -struct tdm_dev_config { - unsigned int tdm_slot_offset[TDM_MAX_SLOTS]; -}; - -enum { - EXT_DISP_RX_IDX_DP = 0, - EXT_DISP_RX_IDX_DP1, - EXT_DISP_RX_IDX_MAX, -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct aux_codec_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [EXT_DISP_RX_IDX_DP] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [EXT_DISP_RX_IDX_DP1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, -}; - -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; - -/* Default configuration of TDM channels */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, -}; - -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, -}; - -/* Default configuration of AUX PCM channels */ -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct tdm_dev_config pri_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = { - { /* PRI TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 8, 12, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, -}; - -static struct tdm_dev_config sec_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = { - { /* SEC TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, -}; - -static struct tdm_dev_config tert_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = { - { /* TERT TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, -}; - -static struct tdm_dev_config quat_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = { - { /* QUAT TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, -}; - -static struct tdm_dev_config quin_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = { - { /* QUIN TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, -}; - -static struct tdm_dev_config sen_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = { - { /* SEN TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, -}; - -static void *tdm_cfg[TDM_INTERFACE_MAX] = { - pri_tdm_dev_config, - sec_tdm_dev_config, - tert_tdm_dev_config, - quat_tdm_dev_config, - quin_tdm_dev_config, - sen_tdm_dev_config, -}; - -/* Default configuration of Codec DMA Interface RX */ -static struct dev_config cdc_dma_rx_cfg[] = { - [WSA_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of Codec DMA Interface TX */ -static struct dev_config cdc_dma_tx_cfg[] = { - [WSA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [VA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, - [VA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, - [VA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, -}; - -static struct dev_config afe_loopback_tx_cfg[] = { - [AFE_LOOPBACK_TX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static int msm_vi_feed_tx_ch = 2; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *cdc80_bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_48", "KHZ_176P4", - "KHZ_352P8"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16", - "KHZ_22P05", "KHZ_32", "KHZ_44P1", - "KHZ_48", "KHZ_88P2", "KHZ_96", - "KHZ_176P4", "KHZ_192","KHZ_352P8", - "KHZ_384"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; - -static const char *const cdc_dma_rx_ch_text[] = {"One", "Two"}; -static const char *const cdc_dma_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *cdc_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", - "KHZ_176P4", "KHZ_192", - "KHZ_352P8", "KHZ_384"}; -static char const *cdc80_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", - "KHZ_176P4", "KHZ_192"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE", - "S24_3LE"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_32", "KHZ_44P1", - "KHZ_88P2", "KHZ_176P4"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static const char *const afe_loopback_tx_ch_text[] = {"One", "Two"}; - -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_sample_rate, - cdc_dma_sample_rate_text); - -/* WCD9380 */ -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_0_format, cdc80_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_1_format, cdc80_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_2_format, cdc80_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_3_format, cdc80_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_5_format, cdc80_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_0_sample_rate, - cdc80_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_1_sample_rate, - cdc80_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_2_sample_rate, - cdc80_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_3_sample_rate, - cdc80_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_5_sample_rate, - cdc80_dma_sample_rate_text); -/* WCD9385 */ -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_3_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_5_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_2_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_3_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_5_sample_rate, - cdc_dma_sample_rate_text); - -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); -static SOC_ENUM_SINGLE_EXT_DECL(afe_loopback_tx_chs, afe_loopback_tx_ch_text); - -static bool is_initial_boot; -static bool codec_reg_done; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; -static struct snd_soc_card snd_soc_card_kona_msm; -static int dmic_0_1_gpio_cnt; -static int dmic_2_3_gpio_cnt; -static int dmic_4_5_gpio_cnt; - -static void *def_wcd_mbhc_cal(void); - -/* - * Need to report LINEIN - * if R/L channel impedance is larger than 5K ohm - */ -static struct wcd_mbhc_config wcd_mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .detect_extn_cable = true, - .mono_stero_detection = false, - .swap_gnd_mic = NULL, - .hs_ext_micbias = true, - .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, - .key_code[4] = 0, - .key_code[5] = 0, - .key_code[6] = 0, - .key_code[7] = 0, - .linein_th = 5000, - .moisture_en = false, - .mbhc_micbias = MIC_BIAS_2, - .anc_micbias = MIC_BIAS_2, - .enable_anc_mic_detect = false, - .moisture_duty_cycle_en = true, -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, - unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val = 0; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val = 0; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} -static int afe_loopback_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: afe_loopback_tx_ch = %d\n", __func__, - afe_loopback_tx_cfg[0].channels); - ucontrol->value.enumerated.item[0] = - afe_loopback_tx_cfg[0].channels - 1; - - return 0; -} - -static int afe_loopback_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_tx_cfg[0].channels = - ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: afe_loopback_tx_ch = %d\n", __func__, - afe_loopback_tx_cfg[0].channels); - - return 1; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx = 0; - - if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) { - idx = EXT_DISP_RX_IDX_DP; - } else if (strnstr(kcontrol->id.name, "Display Port1 RX", - sizeof("Display Port1 RX"))) { - idx = EXT_DISP_RX_IDX_DP1; - } else { - pr_err("%s: unsupported BE: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 2: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 6; - break; - - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 4; - break; - - case SAMPLING_RATE_32KHZ: - sample_rate_val = 3; - break; - - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 6: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - port->mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUAT; - } else if (strnstr(kcontrol->id.name, "QUIN", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUIN; - } else if (strnstr(kcontrol->id.name, "SEN", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEN; - } else { - pr_err("%s: unsupported mode in: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - port->channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - port->channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - port->channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - port->channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - port->channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - port->channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - port->channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - port->channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - } else { - return -EINVAL; - } - return 0; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 5; - break; - default: - sample_rate_val = 3; - break; - } - return sample_rate_val; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_slot_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int slot_index = 0; - int interface = ucontrol->value.integer.value[0]; - int channel = ucontrol->value.integer.value[1]; - unsigned int offset_val = 0; - unsigned int *slot_offset = NULL; - struct tdm_dev_config *config = NULL; - - if (interface < 0 || interface >= (TDM_INTERFACE_MAX * MAX_PATH)) { - pr_err("%s: incorrect interface = %d\n", __func__, interface); - return -EINVAL; - } - if (channel < 0 || channel >= TDM_PORT_MAX) { - pr_err("%s: incorrect channel = %d\n", __func__, channel); - return -EINVAL; - } - - pr_debug("%s: interface = %d, channel = %d\n", __func__, - interface, channel); - - config = ((struct tdm_dev_config *) tdm_cfg[interface / MAX_PATH]) + - ((interface % MAX_PATH) * TDM_PORT_MAX) + channel; - slot_offset = config->tdm_slot_offset; - - for (slot_index = 0; slot_index < TDM_MAX_SLOTS; slot_index++) { - offset_val = ucontrol->value.integer.value[MAX_PATH + - slot_index]; - /* Offset value can only be 0, 4, 8, ..28 */ - if (offset_val % 4 == 0 && offset_val <= 28) - slot_offset[slot_index] = offset_val; - pr_debug("%s: slot offset[%d] = %d\n", __func__, - slot_index, slot_offset[slot_index]); - } - - return 0; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx = 0; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) { - idx = PRIM_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) { - idx = SEC_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) { - idx = TERT_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) { - idx = QUAT_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", - sizeof("QUIN_AUX_PCM"))) { - idx = QUIN_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "SEN_AUX_PCM", - sizeof("SEN_AUX_PCM"))) { - idx = SEN_AUX_PCM; - } else { - pr_err("%s: unsupported port: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int mi2s_auxpcm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_auxpcm_get_format_value(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx = 0; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) { - idx = PRIM_MI2S; - } else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) { - idx = SEC_MI2S; - } else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) { - idx = TERT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) { - idx = QUAT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", - sizeof("QUIN_MI2S_RX"))) { - idx = QUIN_MI2S; - } else if (strnstr(kcontrol->id.name, "SEN_MI2S_RX", - sizeof("SEN_MI2S_RX"))) { - idx = SEN_MI2S; - } else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) { - idx = PRIM_MI2S; - } else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) { - idx = SEC_MI2S; - } else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) { - idx = TERT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) { - idx = QUAT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", - sizeof("QUIN_MI2S_TX"))) { - idx = QUIN_MI2S; - } else if (strnstr(kcontrol->id.name, "SEN_MI2S_TX", - sizeof("SEN_MI2S_TX"))) { - idx = SEN_MI2S; - } else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 11: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 12: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SENARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SENARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SENARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SENARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_1; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2: - afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_2; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample = 0; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - -err: - return ret; -} - -static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx = 0; - - if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_0", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_1", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_1; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_0", - sizeof("RX_CDC_DMA_RX_0"))) - idx = RX_CDC_DMA_RX_0; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_1", - sizeof("RX_CDC_DMA_RX_1"))) - idx = RX_CDC_DMA_RX_1; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_2", - sizeof("RX_CDC_DMA_RX_2"))) - idx = RX_CDC_DMA_RX_2; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_3", - sizeof("RX_CDC_DMA_RX_3"))) - idx = RX_CDC_DMA_RX_3; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_5", - sizeof("RX_CDC_DMA_RX_5"))) - idx = RX_CDC_DMA_RX_5; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_0", - sizeof("WSA_CDC_DMA_TX_0"))) - idx = WSA_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_1", - sizeof("WSA_CDC_DMA_TX_1"))) - idx = WSA_CDC_DMA_TX_1; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_2", - sizeof("WSA_CDC_DMA_TX_2"))) - idx = WSA_CDC_DMA_TX_2; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_0", - sizeof("TX_CDC_DMA_TX_0"))) - idx = TX_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_3", - sizeof("TX_CDC_DMA_TX_3"))) - idx = TX_CDC_DMA_TX_3; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_4", - sizeof("TX_CDC_DMA_TX_4"))) - idx = TX_CDC_DMA_TX_4; - else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_0", - sizeof("VA_CDC_DMA_TX_0"))) - idx = VA_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_1", - sizeof("VA_CDC_DMA_TX_1"))) - idx = VA_CDC_DMA_TX_1; - else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_2", - sizeof("VA_CDC_DMA_TX_2"))) - idx = VA_CDC_DMA_TX_2; - else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return idx; -} - -static int cdc_dma_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels - 1); - ucontrol->value.integer.value[0] = cdc_dma_rx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_rx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_rx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - - -static int cdc_dma_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int cdc_dma_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 11: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 12: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int cdc_dma_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - ucontrol->value.enumerated.item[0] = - cdc_dma_get_sample_rate_val(cdc_dma_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: cdc_dma_rx_sample_rate = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_rx_cfg[ch_num].sample_rate = - cdc_dma_get_sample_rate(ucontrol->value.enumerated.item[0]); - - - pr_debug("%s: control value = %d, cdc_dma_rx_sample_rate = %d\n", - __func__, ucontrol->value.enumerated.item[0], - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - ucontrol->value.integer.value[0] = cdc_dma_tx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_tx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_tx_cfg[ch_num].sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: cdc_dma_tx_sample_rate = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 12: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, cdc_dma_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_tx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int msm_cdc_dma_get_idx_from_beid(int32_t be_id) -{ - int idx = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - idx = WSA_CDC_DMA_RX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - idx = WSA_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - idx = WSA_CDC_DMA_RX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - idx = WSA_CDC_DMA_TX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - idx = WSA_CDC_DMA_TX_2; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - idx = RX_CDC_DMA_RX_0; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - idx = RX_CDC_DMA_RX_1; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - idx = RX_CDC_DMA_RX_2; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3: - idx = RX_CDC_DMA_RX_3; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5: - idx = RX_CDC_DMA_RX_5; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - idx = TX_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - idx = TX_CDC_DMA_TX_3; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - idx = TX_CDC_DMA_TX_4; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - idx = VA_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - idx = VA_CDC_DMA_TX_1; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2: - idx = VA_CDC_DMA_TX_2; - break; - default: - idx = RX_CDC_DMA_RX_0; - break; - } - - return idx; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d\n", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate rx = %d\n", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_rx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_tx_cfg[SLIM_TX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate tx = %d\n", __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_tx = %d, value = %d\n", - __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static const struct snd_kcontrol_new msm_int_snd_controls[] = { - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Channels", wsa_cdc_dma_rx_0_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Channels", wsa_cdc_dma_rx_1_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Channels", rx_cdc_dma_rx_0_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Channels", rx_cdc_dma_rx_1_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Channels", rx_cdc_dma_rx_2_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Channels", rx_cdc_dma_rx_3_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Channels", rx_cdc_dma_rx_5_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 Channels", wsa_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Channels", wsa_cdc_dma_tx_1_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Channels", wsa_cdc_dma_tx_2_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Channels", tx_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Channels", tx_cdc_dma_tx_3_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Channels", tx_cdc_dma_tx_4_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Channels", va_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Channels", va_cdc_dma_tx_1_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_2 Channels", va_cdc_dma_tx_2_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Format", wsa_cdc_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Format", wsa_cdc_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Format", wsa_cdc_dma_tx_1_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Format", wsa_cdc_dma_tx_2_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Format", tx_cdc_dma_tx_0_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Format", tx_cdc_dma_tx_3_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Format", tx_cdc_dma_tx_4_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Format", va_cdc_dma_tx_0_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Format", va_cdc_dma_tx_1_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_2 Format", va_cdc_dma_tx_2_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 SampleRate", - wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 SampleRate", - wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 SampleRate", - wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 SampleRate", - wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 SampleRate", - wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 SampleRate", - tx_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 SampleRate", - tx_cdc_dma_tx_3_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 SampleRate", - tx_cdc_dma_tx_4_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_0 SampleRate", - va_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_1 SampleRate", - va_cdc_dma_tx_1_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_2 SampleRate", - va_cdc_dma_tx_2_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_int_wcd9380_snd_controls[] = { - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc80_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc80_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc80_dma_rx_2_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc80_dma_rx_3_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc80_dma_rx_5_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate", - rx_cdc80_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate", - rx_cdc80_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate", - rx_cdc80_dma_rx_2_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate", - rx_cdc80_dma_rx_3_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate", - rx_cdc80_dma_rx_5_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_int_wcd9385_snd_controls[] = { - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc85_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc85_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc85_dma_rx_2_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc85_dma_rx_3_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc85_dma_rx_5_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate", - rx_cdc85_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate", - rx_cdc85_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate", - rx_cdc85_dma_rx_2_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate", - rx_cdc85_dma_rx_3_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate", - rx_cdc85_dma_rx_5_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_common_snd_controls[] = { - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("Display Port1 RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("Display Port1 RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("Display Port1 RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx, - msm_bt_sample_rate_rx_get, - msm_bt_sample_rate_rx_put), - SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, - msm_bt_sample_rate_tx_get, - msm_bt_sample_rate_tx_put), - SOC_ENUM_EXT("AFE_LOOPBACK_TX Channels", afe_loopback_tx_chs, - afe_loopback_tx_ch_get, afe_loopback_tx_ch_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), -}; - -static const struct snd_kcontrol_new msm_tdm_snd_controls[] = { - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_SINGLE_MULTI_EXT("TDM Slot Map", SND_SOC_NOPM, 0, 255, 0, - TDM_MAX_SLOTS + MAX_PATH, NULL, tdm_slot_map_put), -}; - -static const struct snd_kcontrol_new msm_auxpcm_snd_controls[] = { - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEN_AUX_PCM_RX SampleRate", sen_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEN_AUX_PCM_TX SampleRate", sen_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), -}; - -static const struct snd_kcontrol_new msm_mi2s_snd_controls[] = { - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEN_MI2S_RX SampleRate", sen_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEN_MI2S_TX SampleRate", sen_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEN_MI2S_RX Channels", sen_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEN_MI2S_TX Channels", sen_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), -}; - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), -}; - -static int msm_ext_disp_get_idx_from_beid(int32_t be_id) -{ - int idx; - - switch (be_id) { - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = EXT_DISP_RX_IDX_DP; - break; - case MSM_BACKEND_DAI_DISPLAY_PORT_RX_1: - idx = EXT_DISP_RX_IDX_DP1; - break; - default: - pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id); - idx = -EINVAL; - break; - } - - return idx; -} - -static int kona_send_island_va_config(int32_t be_id) -{ - int rc = 0; - int port_id = 0xFFFF; - - port_id = msm_get_port_id(be_id); - if (port_id < 0) { - pr_err("%s: Invalid island interface, be_id: %d\n", - __func__, be_id); - rc = -EINVAL; - } else { - /* - * send island mode config - * This should be the first configuration - */ - rc = afe_send_port_island_mode(port_id); - if (rc) - pr_err("%s: afe send island mode failed %d\n", - __func__, rc); - } - - return rc; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int idx = 0, rc = 0; - - pr_debug("%s: dai_id= %d, format = %d, rate = %d\n", - __func__, dai_link->id, params_format(params), - params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - case MSM_BACKEND_DAI_DISPLAY_PORT_RX_1: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - goto done; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SENARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SENARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_rx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_rx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_tx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[SLIM_TX_7].bit_format); - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - case MSM_BACKEND_DAI_AFE_LOOPBACK_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - afe_loopback_tx_cfg[idx].bit_format); - rate->min = rate->max = afe_loopback_tx_cfg[idx].sample_rate; - channels->min = channels->max = - afe_loopback_tx_cfg[idx].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - -done: - return rc; -} - -static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - if (!pdata->fsa_handle) - return false; - - return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP); -} - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - int value = 0; - bool ret = false; - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return false; - } - card = codec->component.card; - pdata = snd_soc_card_get_drvdata(card); - - if (!pdata) - return false; - - if (wcd_mbhc_cfg.enable_usbc_analog) - return msm_usbc_swap_gnd_mic(codec, active); - - /* if usbc is not defined, swap using us_euro_gpio_p */ - if (pdata->us_euro_gpio_p) { - value = msm_cdc_pinctrl_get_state( - pdata->us_euro_gpio_p); - if (value) - msm_cdc_pinctrl_select_sleep_state( - pdata->us_euro_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - pdata->us_euro_gpio_p); - dev_dbg(codec->dev, "%s: swap select switch %d to %d\n", - __func__, value, !value); - ret = true; - } - - return ret; -} - -static int kona_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int slot_width = TDM_SLOT_WIDTH_BITS; - int channels, slots = TDM_MAX_SLOTS; - unsigned int slot_mask, rate, clk_freq; - unsigned int *slot_offset; - struct tdm_dev_config *config; - unsigned int path_dir = 0, interface = 0, channel_interface = 0; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - if (cpu_dai->id < AFE_PORT_ID_TDM_PORT_RANGE_START) { - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - /* RX or TX */ - path_dir = cpu_dai->id % MAX_PATH; - - /* PRI, SEC, TERT, QUAT, QUIN, ... */ - interface = (cpu_dai->id - AFE_PORT_ID_TDM_PORT_RANGE_START) - / (MAX_PATH * TDM_PORT_MAX); - - /* 0, 1, 2, .. 7 */ - channel_interface = - ((cpu_dai->id - AFE_PORT_ID_TDM_PORT_RANGE_START) / MAX_PATH) - % TDM_PORT_MAX; - - pr_debug("%s: path dir: %u, interface %u, channel interface %u\n", - __func__, path_dir, interface, channel_interface); - - config = ((struct tdm_dev_config *) tdm_cfg[interface]) + - (path_dir * TDM_PORT_MAX) + channel_interface; - slot_offset = config->tdm_slot_offset; - - if (path_dir) - channels = tdm_tx_cfg[interface][channel_interface].channels; - else - channels = tdm_rx_cfg[interface][channel_interface].channels; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16 - slots); - - pr_debug("%s: tdm rx slot_width %d slots %d slot_mask %x\n", - __func__, slot_width, slots, slot_mask); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm rx slot, err:%d\n", - __func__, ret); - goto end; - } - - pr_debug("%s: tdm rx channels: %d\n", __func__, channels); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set tdm rx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16 - slots); - - pr_debug("%s: tdm tx slot_width %d slots %d slot_mask %x\n", - __func__, slot_width, slots, slot_mask); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm tx slot, err:%d\n", - __func__, ret); - goto end; - } - - pr_debug("%s: tdm tx channels: %d\n", __func__, channels); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - channels, slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set tdm tx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - -end: - return ret; -} - -static int msm_get_tdm_mode(u32 port_id) -{ - int tdm_mode; - - switch (port_id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - tdm_mode = TDM_PRI; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - tdm_mode = TDM_SEC; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - tdm_mode = TDM_TERT; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - tdm_mode = TDM_QUAT; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - tdm_mode = TDM_QUIN; - break; - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_TX: - tdm_mode = TDM_SEN; - break; - default: - pr_err("%s: Invalid port id: %d\n", __func__, port_id); - tdm_mode = -EINVAL; - } - return tdm_mode; -} - -static int kona_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) { - ret = -EINVAL; - pr_err("%s: Invalid TDM interface %d\n", - __func__, ret); - return ret; - } - - if (pdata->mi2s_gpio_p[tdm_mode]) { - if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode])) - == 0) { - ret = msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[tdm_mode]); - if (ret) { - pr_err("%s: TDM GPIO pinctrl set active failed with %d\n", - __func__, ret); - goto done; - } - } - atomic_inc(&(pdata->mi2s_gpio_ref_count[tdm_mode])); - } - -done: - return ret; -} - -static void kona_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) { - ret = -EINVAL; - pr_err("%s: Invalid TDM interface %d\n", - __func__, ret); - return; - } - - if (pdata->mi2s_gpio_p[tdm_mode]) { - atomic_dec(&(pdata->mi2s_gpio_ref_count[tdm_mode])); - if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode])) - == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[tdm_mode]); - if (ret) - pr_err("%s: TDM GPIO pinctrl set sleep failed with %d\n", - __func__, ret); - } - } -} - -static int kona_aux_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - u32 aux_mode = cpu_dai->id - 1; - - if (aux_mode >= AUX_PCM_MAX) { - ret = -EINVAL; - pr_err("%s: Invalid AUX interface %d\n", - __func__, ret); - return ret; - } - - if (pdata->mi2s_gpio_p[aux_mode]) { - if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode])) - == 0) { - ret = msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[aux_mode]); - if (ret) { - pr_err("%s: AUX GPIO pinctrl set active failed with %d\n", - __func__, ret); - goto done; - } - } - atomic_inc(&(pdata->mi2s_gpio_ref_count[aux_mode])); - } - -done: - return ret; -} - -static void kona_aux_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - u32 aux_mode = cpu_dai->id - 1; - - if (aux_mode >= AUX_PCM_MAX) { - pr_err("%s: Invalid AUX interface %d\n", - __func__, ret); - return; - } - - if (pdata->mi2s_gpio_p[aux_mode]) { - atomic_dec(&(pdata->mi2s_gpio_ref_count[aux_mode])); - if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode])) - == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[aux_mode]); - if (ret) - pr_err("%s: AUX GPIO pinctrl set sleep failed with %d\n", - __func__, ret); - } - } -} - -static int msm_snd_cdc_dma_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - switch (dai_link->id) { - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2: - ret = kona_send_island_va_config(dai_link->id); - if (ret) - pr_err("%s: send island va cfg failed, err: %d\n", - __func__, ret); - break; - } - - return ret; -} - -static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch_cdc_dma, tx_ch_cdc_dma; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 user_set_rx_ch = 0; - u32 ch_id; - - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, &tx_ch_cdc_dma, &rx_ch_cnt, - &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_4: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d rx_ch=%d\n", __func__, - ch_id, cdc_dma_rx_cfg[ch_id].channels); - user_set_rx_ch = cdc_dma_rx_cfg[ch_id].channels; - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - user_set_rx_ch, &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - - } - break; - } - } else { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - { - user_set_tx_ch = msm_vi_feed_tx_ch; - } - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d tx_ch=%d\n", __func__, - ch_id, cdc_dma_tx_cfg[ch_id].channels); - user_set_tx_ch = cdc_dma_tx_cfg[ch_id].channels; - } - break; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, user_set_tx_ch, - &tx_ch_cdc_dma, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -void mi2s_disable_audio_vote(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int sample_rate = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - sample_rate = mi2s_rx_cfg[index].sample_rate; - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - sample_rate = mi2s_tx_cfg[index].sample_rate; - } else { - pr_err("%s: invalid stream %d\n", __func__, substream->stream); - return; - } - - if (IS_MSM_INTERFACE_MI2S(index) && IS_FRACTIONAL(sample_rate)) { - if (pdata->lpass_audio_hw_vote != NULL) { - if (--pdata->core_audio_vote_count == 0) { - clk_disable_unprepare( - pdata->lpass_audio_hw_vote); - } else if (pdata->core_audio_vote_count < 0) { - pr_err("%s: audio vote mismatch\n", __func__); - pdata->core_audio_vote_count = 0; - } - } else { - pr_err("%s: Invalid lpass audio hw node\n", __func__); - } - } -} - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int sample_rate = 0; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - /* - * Mutex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - sample_rate = mi2s_rx_cfg[index].sample_rate; - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - sample_rate = mi2s_tx_cfg[index].sample_rate; - } else { - pr_err("%s: invalid stream %d\n", __func__, substream->stream); - ret = -EINVAL; - goto vote_err; - } - - if (IS_MSM_INTERFACE_MI2S(index) && IS_FRACTIONAL(sample_rate)) { - if (pdata->lpass_audio_hw_vote == NULL) { - dev_err(rtd->card->dev, "%s: Invalid lpass audio hw node\n", - __func__); - ret = -EINVAL; - goto vote_err; - } - if (pdata->core_audio_vote_count == 0) { - ret = clk_prepare_enable(pdata->lpass_audio_hw_vote); - if (ret < 0) { - dev_err(rtd->card->dev, "%s: audio vote error\n", - __func__); - goto vote_err; - } - } - pdata->core_audio_vote_count++; - } - - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - if (pdata->mi2s_gpio_p[index]) { - if (atomic_read(&(pdata->mi2s_gpio_ref_count[index])) - == 0) { - ret = msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[index]); - if (ret) { - pr_err("%s: MI2S GPIO pinctrl set active failed with %d\n", - __func__, ret); - goto clk_off; - } - } - atomic_inc(&(pdata->mi2s_gpio_ref_count[index])); - } - } -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) { - mi2s_intf_conf[index].ref_cnt--; - mi2s_disable_audio_vote(substream); - } -vote_err: - mutex_unlock(&mi2s_intf_conf[index].lock); -err: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (index < PRIM_MI2S || index >= MI2S_MAX) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - if (pdata->mi2s_gpio_p[index]) { - atomic_dec(&(pdata->mi2s_gpio_ref_count[index])); - if (atomic_read(&(pdata->mi2s_gpio_ref_count[index])) - == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[index]); - if (ret) - pr_err("%s: MI2S GPIO pinctrl set sleep failed with %d\n", - __func__, ret); - } - } - - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - } - mi2s_disable_audio_vote(substream); - mutex_unlock(&mi2s_intf_conf[index].lock); -} - -static int msm_wcn_hw_params_lito(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret = 0; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -err: - return ret; -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret = 0; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -err: - return ret; -} - -static struct snd_soc_ops kona_aux_be_ops = { - .startup = kona_aux_snd_startup, - .shutdown = kona_aux_snd_shutdown -}; - -static struct snd_soc_ops kona_tdm_be_ops = { - .hw_params = kona_tdm_snd_hw_params, - .startup = kona_tdm_snd_startup, - .shutdown = kona_tdm_snd_shutdown -}; - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -static struct snd_soc_ops msm_cdc_dma_be_ops = { - .startup = msm_snd_cdc_dma_startup, - .hw_params = msm_snd_cdc_dma_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops_lito = { - .hw_params = msm_wcn_hw_params_lito, -}; - -static int msm_dmic_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - u32 dmic_idx; - int *dmic_gpio_cnt; - struct device_node *dmic_gpio; - char *wname; - - wname = strpbrk(w->name, "012345"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic_idx); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - pdata = snd_soc_card_get_drvdata(codec->component.card); - - switch (dmic_idx) { - case 0: - case 1: - dmic_gpio_cnt = &dmic_0_1_gpio_cnt; - dmic_gpio = pdata->dmic01_gpio_p; - break; - case 2: - case 3: - dmic_gpio_cnt = &dmic_2_3_gpio_cnt; - dmic_gpio = pdata->dmic23_gpio_p; - break; - case 4: - case 5: - dmic_gpio_cnt = &dmic_4_5_gpio_cnt; - dmic_gpio = pdata->dmic45_gpio_p; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n", - __func__, event, dmic_idx, *dmic_gpio_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - (*dmic_gpio_cnt)++; - if (*dmic_gpio_cnt == 1) { - ret = msm_cdc_pinctrl_select_active_state( - dmic_gpio); - if (ret < 0) { - pr_err("%s: gpio set cannot be activated %sd", - __func__, "dmic_gpio"); - return ret; - } - } - - break; - case SND_SOC_DAPM_POST_PMD: - (*dmic_gpio_cnt)--; - if (*dmic_gpio_cnt == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - dmic_gpio); - if (ret < 0) { - pr_err("%s: gpio set cannot be de-activated %sd", - __func__, "dmic_gpio"); - return ret; - } - } - break; - default: - pr_err("%s: invalid DAPM event %d\n", __func__, event); - return -EINVAL; - } - return 0; -} - -static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = { - SND_SOC_DAPM_MIC("Analog Mic1", NULL), - SND_SOC_DAPM_MIC("Analog Mic2", NULL), - SND_SOC_DAPM_MIC("Analog Mic3", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - SND_SOC_DAPM_MIC("Analog Mic5", NULL), - SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic5", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic6", NULL), - SND_SOC_DAPM_MIC("Digital Mic7", NULL), -}; - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static int msm_wcn_init_lito(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -#ifndef CONFIG_TDM_DISABLE -static void msm_add_tdm_snd_controls(struct snd_soc_codec *codec) -{ - snd_soc_add_codec_controls(codec, msm_tdm_snd_controls, - ARRAY_SIZE(msm_tdm_snd_controls)); -} -#else -static void msm_add_tdm_snd_controls(struct snd_soc_codec *codec) -{ - return; -} -#endif - -#ifndef CONFIG_MI2S_DISABLE -static void msm_add_mi2s_snd_controls(struct snd_soc_codec *codec) -{ - snd_soc_add_codec_controls(codec, msm_mi2s_snd_controls, - ARRAY_SIZE(msm_mi2s_snd_controls)); -} -#else -static void msm_add_mi2s_snd_controls(struct snd_soc_codec *codec) -{ - return; -} -#endif - -#ifndef CONFIG_AUXPCM_DISABLE -static void msm_add_auxpcm_snd_controls(struct snd_soc_codec *codec) -{ - snd_soc_add_codec_controls(codec, msm_auxpcm_snd_controls, - ARRAY_SIZE(msm_auxpcm_snd_controls)); -} -#else -static void msm_add_auxpcm_snd_controls(struct snd_soc_codec *codec) -{ - return; -} -#endif - -static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = -EINVAL; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - 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); - - ret = snd_soc_add_codec_controls(codec, msm_int_snd_controls, - ARRAY_SIZE(msm_int_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed: %d\n", - __func__, ret); - return ret; - } - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - ARRAY_SIZE(msm_common_snd_controls)); - if (ret < 0) { - pr_err("%s: add common snd controls failed: %d\n", - __func__, ret); - return ret; - } - - msm_add_tdm_snd_controls(codec); - msm_add_mi2s_snd_controls(codec); - msm_add_auxpcm_snd_controls(codec); - - snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets, - ARRAY_SIZE(msm_int_dapm_widgets)); - - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic7"); - - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5"); - - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA AIF VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA"); - - snd_soc_dapm_sync(dapm); - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - dev_dbg(codec->dev, "%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_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(rtd->codec, - WSA_MACRO_SPKR_MODE_1); - wsa_macro_set_spkr_gain_offset(rtd->codec, - WSA_MACRO_GAIN_OFFSET_M1P5_DB); - } - } - bolero_set_port_map(codec, ARRAY_SIZE(sm_port_map), - sm_port_map); - } - card = rtd->card->snd_card; - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - bolero_info_create_codec_entry(pdata->codec_root, codec); - bolero_register_wake_irq(codec, false); - codec_reg_done = true; - return 0; -err: - return ret; -} - -static void *def_wcd_mbhc_cal(void) -{ - void *wcd_mbhc_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!wcd_mbhc_cal) - return NULL; - - WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->v_hs_max = WCD_MBHC_HS_V_MAX; - WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->num_btn = WCD_MBHC_DEF_BUTTONS; - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; - - return wcd_mbhc_cal; -} - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - {/* hw:x,0 */ - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - {/* hw:x,1 */ - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - {/* hw:x,2 */ - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - {/* hw:x,3 */ - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - {/* hw:x,4 */ - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - {/* hw:x,5 */ - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - {/* hw:x,6 */ - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - {/* hw:x,7 */ - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - /* Hostless PCM purpose */ - {/* hw:x,8 */ - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,9 */ - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - {/* hw:x,10 */ - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - {/* hw:x,11 */ - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - {/* hw:x,12 */ - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - {/* hw:x,13 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - /* HDMI Hostless */ - {/* hw:x,14 */ - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,15 */ - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - {/* hw:x,16 */ - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - {/* hw:x,17 */ - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - {/* hw:x,18 */ - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - {/* hw:x,19 */ - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - {/* hw:x,20 */ - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - {/* hw:x,21 */ - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - {/* hw:x,22 */ - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - {/* hw:x,23 */ - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - {/* hw:x,24 */ - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - {/* hw:x,25 */ - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - {/* hw:x,26 */ - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - {/* hw:x,27 */ - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - {/* hw:x,28 */ - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - {/* hw:x,29 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - .ops = &msm_fe_qos_ops, - }, - {/* hw:x,30 */ - .name = "CDC_DMA Hostless", - .stream_name = "CDC_DMA Hostless", - .cpu_dai_name = "CDC_DMA_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,31 */ - .name = "TX3_CDC_DMA Hostless", - .stream_name = "TX3_CDC_DMA Hostless", - .cpu_dai_name = "TX3_CDC_DMA_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,32 */ - .name = "Tertiary MI2S TX_Hostless", - .stream_name = "Tertiary MI2S_TX Hostless Capture", - .cpu_dai_name = "TERT_MI2S_TX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = { - {/* hw:x,33 */ - .name = LPASS_BE_WSA_CDC_DMA_TX_0, - .stream_name = "WSA CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45057", - .platform_name = "msm-pcm-hostless", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_vifeedback", - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { - {/* hw:x,34 */ - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - {/* hw:x,35 */ - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,36 */ - .name = "SLIMBUS_7 Hostless", - .stream_name = "SLIMBUS_7 Hostless", - .cpu_dai_name = "SLIMBUS7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,37 */ - .name = "Compress Capture", - .stream_name = "Compress9", - .cpu_dai_name = "MultiMedia17", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA17, - }, - {/* hw:x,38 */ - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS_8 Hostless", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,39 */ - .name = LPASS_BE_TX_CDC_DMA_TX_5, - .stream_name = "TX CDC DMA5 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45115", - .platform_name = "msm-pcm-hostless", - .codec_name = "bolero_codec", - .codec_dai_name = "tx_macro_tx3", - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Proxy Tx BACK END DAI Link */ - { - .name = LPASS_BE_PROXY_TX, - .stream_name = "Proxy Capture", - .cpu_dai_name = "msm-dai-q6-dev.8195", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PROXY_TX, - .ignore_suspend = 1, - }, - /* Proxy Rx BACK END DAI Link */ - { - .name = LPASS_BE_PROXY_RX, - .stream_name = "Proxy Playback", - .cpu_dai_name = "msm-dai-q6-dev.8194", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PROXY_RX, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .dynamic = 1, - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, -}; - - -static struct snd_soc_dai_link msm_tdm_be_dai_links[] = { - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_RX_0, - .stream_name = "Quinary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36928", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_TX_0, - .stream_name = "Quinary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36929", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEN_TDM_RX_0, - .stream_name = "Senary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36944", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEN_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEN_TDM_TX_0, - .stream_name = "Senary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36945", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEN_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_btfm_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init_lito, - .ops = &msm_wcn_ops_lito, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops_lito, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops_lito, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* DISP PORT 1 BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT1, - .stream_name = "Display Port1 Playback", - .cpu_dai_name = "msm-dai-q6-dp.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx1_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SENARY_MI2S_RX, - .stream_name = "Senary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SENARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SENARY_MI2S_TX, - .stream_name = "Senary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SENARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - /* Senary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEN_AUXPCM_RX, - .stream_name = "Sen AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.6", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEN_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEN_AUXPCM_TX, - .stream_name = "Sen AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.6", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEN_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &kona_aux_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = { - /* WSA CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_WSA_CDC_DMA_RX_0, - .stream_name = "WSA CDC DMA0 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45056", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .init = &msm_int_audrx_init, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_RX_1, - .stream_name = "WSA CDC DMA1 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45058", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx_mix", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_TX_1, - .stream_name = "WSA CDC DMA1 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45059", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_echo", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_rx_tx_cdc_dma_be_dai_links[] = { - /* RX CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_RX_CDC_DMA_RX_0, - .stream_name = "RX CDC DMA0 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45104", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx1", - .dynamic = 1, - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_1, - .stream_name = "RX CDC DMA1 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45106", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx2", - .dynamic = 1, - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_2, - .stream_name = "RX CDC DMA2 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45108", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx3", - .dynamic = 1, - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_3, - .stream_name = "RX CDC DMA3 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45110", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx4", - .dynamic = 1, - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - /* TX CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_TX_CDC_DMA_TX_3, - .stream_name = "TX CDC DMA3 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45111", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "tx_macro_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_TX_CDC_DMA_TX_4, - .stream_name = "TX CDC DMA4 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45113", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "tx_macro_tx2", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_va_cdc_dma_be_dai_links[] = { - { - .name = LPASS_BE_VA_CDC_DMA_TX_0, - .stream_name = "VA CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45089", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "va_macro_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_VA_CDC_DMA_TX_1, - .stream_name = "VA CDC DMA1 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45091", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "va_macro_tx2", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_VA_CDC_DMA_TX_2, - .stream_name = "VA CDC DMA2 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45093", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "va_macro_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_afe_rxtx_lb_be_dai_link[] = { - { - .name = LPASS_BE_AFE_LOOPBACK_TX, - .stream_name = "AFE Loopback Capture", - .cpu_dai_name = "msm-dai-q6-dev.24577", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_kona_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_bolero_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links) + - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) + - ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links) + - ARRAY_SIZE(msm_va_cdc_dma_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link) + - ARRAY_SIZE(msm_wcn_btfm_be_dai_links) + - ARRAY_SIZE(msm_tdm_be_dai_links)]; - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - dev_err(cdev, "%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - dev_err(cdev, "%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - dev_err(cdev, "%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - dev_err(cdev, "%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - dev_err(cdev, "%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = -EINVAL; - struct snd_soc_codec *codec = rtd->codec; - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, - "%s: add_codec_controls failed, err = %d\n", - __func__, ret); - return ret; - } - - return ret; -} - -static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - return 0; -} - -static struct snd_soc_ops msm_stub_be_ops = { - .hw_params = msm_snd_stub_hw_params, -}; - -struct snd_soc_card snd_soc_card_stub_msm = { - .name = "kona-stub-snd-card", -}; - -static struct snd_soc_dai_link msm_stub_fe_dai_links[] = { - /* FrontEnd DAI Links */ - { - .name = "MSMSTUB Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, -}; - -static struct snd_soc_dai_link msm_stub_be_dai_links[] = { - /* Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .init = &msm_audrx_stub_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_stub_dai_links[ - ARRAY_SIZE(msm_stub_fe_dai_links) + - ARRAY_SIZE(msm_stub_be_dai_links)]; - -static const struct of_device_id kona_asoc_machine_of_match[] = { - { .compatible = "qcom,kona-asoc-snd", - .data = "codec"}, - { .compatible = "qcom,kona-asoc-snd-stub", - .data = "stub_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink = NULL; - int len_1 = 0; - int len_2 = 0; - int total_links = 0; - int rc = 0; - u32 mi2s_audio_intf = 0; - u32 auxpcm_audio_intf = 0; - u32 val = 0; - u32 wcn_btfm_intf = 0; - const struct of_device_id *match; - - match = of_match_node(kona_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "codec")) { - card = &snd_soc_card_kona_msm; - - memcpy(msm_kona_dai_links + total_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - total_links += ARRAY_SIZE(msm_common_dai_links); - - memcpy(msm_kona_dai_links + total_links, - msm_bolero_fe_dai_links, - sizeof(msm_bolero_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_bolero_fe_dai_links); - - memcpy(msm_kona_dai_links + total_links, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - total_links += ARRAY_SIZE(msm_common_misc_fe_dai_links); - - memcpy(msm_kona_dai_links + total_links, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - total_links += ARRAY_SIZE(msm_common_be_dai_links); - - memcpy(msm_kona_dai_links + total_links, - msm_wsa_cdc_dma_be_dai_links, - sizeof(msm_wsa_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links); - - memcpy(msm_kona_dai_links + total_links, - msm_rx_tx_cdc_dma_be_dai_links, - sizeof(msm_rx_tx_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links); - - memcpy(msm_kona_dai_links + total_links, - msm_va_cdc_dma_be_dai_links, - sizeof(msm_va_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_va_cdc_dma_be_dai_links); - - rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf", - &mi2s_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match MI2S audio interface\n", - __func__); - } else { - if (mi2s_audio_intf) { - memcpy(msm_kona_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += - ARRAY_SIZE(msm_mi2s_be_dai_links); - } - } - - rc = of_property_read_u32(dev->of_node, - "qcom,auxpcm-audio-intf", - &auxpcm_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match Aux PCM interface\n", - __func__); - } else { - if (auxpcm_audio_intf) { - memcpy(msm_kona_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += - ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - } - - rc = of_property_read_u32(dev->of_node, - "qcom,ext-disp-audio-rx", &val); - if (!rc && val) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_kona_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - - rc = of_property_read_u32(dev->of_node, "qcom,wcn-bt", &val); - if (!rc && val) { - dev_dbg(dev, "%s(): WCN BT support present\n", - __func__); - memcpy(msm_kona_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += ARRAY_SIZE(msm_wcn_be_dai_links); - } - - rc = of_property_read_u32(dev->of_node, "qcom,afe-rxtx-lb", - &val); - if (!rc && val) { - memcpy(msm_kona_dai_links + total_links, - msm_afe_rxtx_lb_be_dai_link, - sizeof(msm_afe_rxtx_lb_be_dai_link)); - total_links += - ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link); - } - - rc = of_property_read_u32(dev->of_node, "qcom,tdm-audio-intf", - &val); - if (!rc && val) { - memcpy(msm_kona_dai_links + total_links, - msm_tdm_be_dai_links, - sizeof(msm_tdm_be_dai_links)); - total_links += - ARRAY_SIZE(msm_tdm_be_dai_links); - } - - rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", - &wcn_btfm_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match wcn btfm interface\n", - __func__); - } else { - if (wcn_btfm_intf) { - memcpy(msm_kona_dai_links + total_links, - msm_wcn_btfm_be_dai_links, - sizeof(msm_wcn_btfm_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wcn_btfm_be_dai_links); - } - } - dailink = msm_kona_dai_links; - } else if(!strcmp(match->data, "stub_codec")) { - card = &snd_soc_card_stub_msm; - len_1 = ARRAY_SIZE(msm_stub_fe_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_stub_be_dai_links); - - memcpy(msm_stub_dai_links, - msm_stub_fe_dai_links, - sizeof(msm_stub_fe_dai_links)); - memcpy(msm_stub_dai_links + len_1, - msm_stub_be_dai_links, - sizeof(msm_stub_be_dai_links)); - - dailink = msm_stub_dai_links; - total_links = len_2; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -static int msm_wsa881x_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, - SPKR_L_BOOST, SPKR_L_VI}; - u8 spkright_port_types[WSA881X_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}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm; - struct snd_card *card = component->card->snd_card; - struct snd_info_entry *entry; - int ret = 0; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - dapm = snd_soc_codec_get_dapm(codec); - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkleft_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkright_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - ret = -EINVAL; - goto err; - } - pdata = snd_soc_card_get_drvdata(component->card); - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_err("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); -err: - return ret; -} - -static int msm_aux_codec_init(struct snd_soc_component *component) -{ - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret = 0; - int codec_variant = -1; - void *mbhc_calibration; - struct snd_info_entry *entry; - struct snd_card *card = component->card->snd_card; - struct msm_asoc_mach_data *pdata; - struct platform_device *pdev = NULL; - char *data = NULL; - int i = 0; - - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "AUX"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_sync(dapm); - - pdata = snd_soc_card_get_drvdata(component->card); - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - dev_dbg(codec->dev, "%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto mbhc_cfg_cal; - } - pdata->codec_root = entry; - } - - for (i = 0; i < component->card->num_aux_devs; i++) - { - if (msm_aux_dev[i].name != NULL ) { - if (strstr(msm_aux_dev[i].name, "wsa")) - continue; - } - - if (msm_aux_dev[i].codec_of_node) { - pdev = of_find_device_by_node( - msm_aux_dev[i].codec_of_node); - if (pdev) - data = (char*) of_device_get_match_data( - &pdev->dev); - - if (data != NULL) { - if (!strncmp(data, "wcd937x", - sizeof("wcd937x"))) { - wcd937x_info_create_codec_entry( - pdata->codec_root, codec); - break; - } else if (!strncmp( data, "wcd938x", - sizeof("wcd938x"))) { - wcd938x_info_create_codec_entry( - pdata->codec_root, codec); - break; - } - } - } - } - - codec_variant = wcd938x_get_codec_variant(codec); - dev_dbg(codec->dev, "%s: variant %d\n", __func__, codec_variant); - if (codec_variant == WCD9380) - ret = snd_soc_add_codec_controls(codec, - msm_int_wcd9380_snd_controls, - ARRAY_SIZE(msm_int_wcd9380_snd_controls)); - else if (codec_variant == WCD9385) - ret = snd_soc_add_codec_controls(codec, - msm_int_wcd9385_snd_controls, - ARRAY_SIZE(msm_int_wcd9385_snd_controls)); - - if (ret < 0) { - dev_err(codec->dev, "%s: add codec specific snd controls failed: %d\n", - __func__, ret); - return ret; - } - -mbhc_cfg_cal: - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) - return -ENOMEM; - wcd_mbhc_cfg.calibration = mbhc_calibration; - if (data != NULL) { - if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) - ret = wcd937x_mbhc_hs_detect(codec, &wcd_mbhc_cfg); - else if (!strncmp( data, "wcd938x", sizeof("wcd938x"))) - ret = wcd938x_mbhc_hs_detect(codec, &wcd_mbhc_cfg); - } - if (ret) { - dev_err(codec->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); - return ret; -} - -static int msm_init_aux_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - struct device_node *aux_codec_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - 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; - const char *auxdev_name_prefix[1]; - char *dev_name_str = NULL; - int found = 0; - int codecs_found = 0; - int ret = 0; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_info(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - wsa_max_devs = 0; - goto codec_aux_dev; - } - if (wsa_max_devs == 0) { - dev_warn(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - goto codec_aux_dev; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err; - } - if (soc_find_component_locked(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - -codec_aux_dev: - /* Get maximum aux codec device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-max-aux-devs", - &codec_max_aux_devs); - if (ret) { - dev_err(&pdev->dev, - "%s: codec-max-aux-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - codec_max_aux_devs = 0; - goto aux_dev_register; - } - if (codec_max_aux_devs == 0) { - dev_dbg(&pdev->dev, - "%s: Max aux codec devices is 0 for this target?\n", - __func__); - goto aux_dev_register; - } - - /* Get count of aux codec device phandles for this platform */ - codec_aux_dev_cnt = of_count_phandle_with_args( - pdev->dev.of_node, - "qcom,codec-aux-devs", NULL); - if (codec_aux_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No aux codec defined in DT.\n", - __func__); - goto err; - } else if (codec_aux_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading aux codec device from DT, dev_cnt=%d\n", - __func__, codec_aux_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * AUX device count. However, if it is less, then assign same value to - * max count as well. - */ - if (codec_aux_dev_cnt < codec_max_aux_devs) { - dev_dbg(&pdev->dev, - "%s: codec_max_aux_devs = %d cannot exceed codec_aux_dev_cnt = %d\n", - __func__, codec_max_aux_devs, - codec_aux_dev_cnt); - codec_max_aux_devs = codec_aux_dev_cnt; - } - - /* - * Alloc mem to store phandle and index info of aux codec - * if already registered with ALSA core - */ - aux_cdc_dev_info = devm_kcalloc(&pdev->dev, codec_aux_dev_cnt, - sizeof(struct aux_codec_dev_info), - GFP_KERNEL); - if (!aux_cdc_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all aux codecs are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < codec_aux_dev_cnt; i++) { - aux_codec_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,codec-aux-devs", i); - if (unlikely(!aux_codec_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: aux codec dev node is not present\n", - __func__); - ret = -EINVAL; - goto err; - } - if (soc_find_component_locked(aux_codec_of_node, NULL)) { - /* AUX codec registered with ALSA core */ - aux_cdc_dev_info[codecs_found].of_node = - aux_codec_of_node; - aux_cdc_dev_info[codecs_found].index = i; - codecs_found++; - } - } - - if (codecs_found < codec_aux_dev_cnt) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, codec_aux_dev_cnt, codecs_found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d AUX codecs registered with ALSA core\n", - __func__, codecs_found); - -aux_dev_register: - card->num_aux_devs = wsa_max_devs + codec_aux_dev_cnt; - card->num_configs = wsa_max_devs + codec_aux_dev_cnt; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_configs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err; - } - - for (i = 0; i < wsa_max_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_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; - } - - for (i = 0; i < codec_aux_dev_cnt; i++) { - msm_aux_dev[wsa_max_devs + i].name = NULL; - msm_aux_dev[wsa_max_devs + i].codec_name = NULL; - msm_aux_dev[wsa_max_devs + i].codec_of_node = - aux_cdc_dev_info[i].of_node; - msm_aux_dev[wsa_max_devs + i].init = msm_aux_codec_init; - msm_codec_conf[wsa_max_devs + i].dev_name = NULL; - msm_codec_conf[wsa_max_devs + i].name_prefix = - NULL; - msm_codec_conf[wsa_max_devs + i].of_node = - aux_cdc_dev_info[i].of_node; - } - - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; -err: - return ret; -} - -static void msm_i2s_auxpcm_init(struct platform_device *pdev) -{ - int count = 0; - u32 mi2s_master_slave[MI2S_MAX]; - int ret = 0; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } -} - -static void msm_i2s_auxpcm_deinit(void) -{ - int count = 0; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_destroy(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - mi2s_intf_conf[count].msm_is_mi2s_master = 0; - } -} - -static int kona_ssr_enable(struct device *dev, void *data) -{ - struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_card *card = platform_get_drvdata(pdev); - int ret = 0; - - if (!card) { - dev_err(dev, "%s: card is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - if (!strcmp(card->name, "kona-stub-snd-card")) { - /* TODO */ - dev_dbg(dev, "%s: TODO \n", __func__); - } - - snd_soc_card_change_online_state(card, 1); - dev_dbg(dev, "%s: setting snd_card to ONLINE\n", __func__); - -err: - return ret; -} - -static void kona_ssr_disable(struct device *dev, void *data) -{ - struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_card *card = platform_get_drvdata(pdev); - - if (!card) { - dev_err(dev, "%s: card is NULL\n", __func__); - return; - } - - dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__); - snd_soc_card_change_online_state(card, 0); - - if (!strcmp(card->name, "kona-stub-snd-card")) { - /* TODO */ - dev_dbg(dev, "%s: TODO \n", __func__); - } -} - -static const struct snd_event_ops kona_ssr_ops = { - .enable = kona_ssr_enable, - .disable = kona_ssr_disable, -}; - -static int msm_audio_ssr_compare(struct device *dev, void *data) -{ - struct device_node *node = data; - - dev_dbg(dev, "%s: dev->of_node = 0x%p, node = 0x%p\n", - __func__, dev->of_node, node); - return (dev->of_node && dev->of_node == node); -} - -static int msm_audio_ssr_register(struct device *dev) -{ - struct device_node *np = dev->of_node; - struct snd_event_clients *ssr_clients = NULL; - struct device_node *node = NULL; - int ret = 0; - int i = 0; - - for (i = 0; ; i++) { - node = of_parse_phandle(np, "qcom,msm_audio_ssr_devs", i); - if (!node) - break; - snd_event_mstr_add_client(&ssr_clients, - msm_audio_ssr_compare, node); - } - - ret = snd_event_master_register(dev, &kona_ssr_ops, - ssr_clients, NULL); - if (!ret) - snd_event_notify(dev, SND_EVENT_UP); - - return ret; -} - -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card = NULL; - struct msm_asoc_mach_data *pdata = NULL; - const char *mbhc_audio_jack_type = NULL; - int ret = 0; - uint index = 0; - struct clk *lpass_audio_hw_vote = NULL; - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "%s: No platform supplied from device tree\n", __func__); - return -EINVAL; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "%s: parse card name failed, err:%d\n", - __func__, ret); - goto err; - } - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) { - dev_err(&pdev->dev, "%s: parse audio routing failed, err:%d\n", - __func__, ret); - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - - ret = msm_init_aux_dev(pdev, card); - if (ret) - goto err; - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) - ret = -EINVAL; - goto err; - } else if (ret) { - dev_err(&pdev->dev, "%s: snd_soc_register_card failed (%d)\n", - __func__, ret); - goto err; - } - dev_info(&pdev->dev, "%s: Sound card %s registered\n", - __func__, card->name); - - pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!pdata->hph_en1_gpio_p) { - dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n", - __func__, "qcom,hph-en1-gpio", - pdev->dev.of_node->full_name); - } - - pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!pdata->hph_en0_gpio_p) { - dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n", - __func__, "qcom,hph-en0-gpio", - pdev->dev.of_node->full_name); - } - - ret = of_property_read_string(pdev->dev.of_node, - "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type); - if (ret) { - dev_dbg(&pdev->dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,mbhc-audio-jack-type", - pdev->dev.of_node->full_name); - dev_dbg(&pdev->dev, "Jack type properties set to default\n"); - } else { - if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "This hardware has 4 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 5 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 6 pole jack"); - } else { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "Unknown value, set to default\n"); - } - } - /* - * Parse US-Euro gpio info from DT. Report no error if us-euro - * entry is not found in DT file as some targets do not support - * US-Euro detection - */ - pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!pdata->us_euro_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,us-euro-gpios", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "%s detected\n", - "qcom,us-euro-gpios"); - wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - } - - if (wcd_mbhc_cfg.enable_usbc_analog) - wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic; - - pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node, - "fsa4480-i2c-handle", 0); - if (!pdata->fsa_handle) - dev_dbg(&pdev->dev, "property %s not detected in node %s\n", - "fsa4480-i2c-handle", pdev->dev.of_node->full_name); - - msm_i2s_auxpcm_init(pdev); - pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic01-gpios", - 0); - pdata->dmic23_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic23-gpios", - 0); - pdata->dmic45_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic45-gpios", - 0); - pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,pri-mi2s-gpios", 0); - pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,sec-mi2s-gpios", 0); - pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,tert-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quat-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quin-mi2s-gpios", 0); - pdata->mi2s_gpio_p[SEN_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,sen-mi2s-gpios", 0); - for (index = PRIM_MI2S; index < MI2S_MAX; index++) - atomic_set(&(pdata->mi2s_gpio_ref_count[index]), 0); - - /* Register LPASS audio hw vote */ - lpass_audio_hw_vote = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote"); - if (IS_ERR(lpass_audio_hw_vote)) { - ret = PTR_ERR(lpass_audio_hw_vote); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_audio_hw_vote", ret); - lpass_audio_hw_vote = NULL; - ret = 0; - } - pdata->lpass_audio_hw_vote = lpass_audio_hw_vote; - pdata->core_audio_vote_count = 0; - - ret = msm_audio_ssr_register(&pdev->dev); - if (ret) - pr_err("%s: Registration with SND event FWK failed ret = %d\n", - __func__, ret); - - is_initial_boot = true; - - return 0; -err: - devm_kfree(&pdev->dev, pdata); - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - - snd_event_master_deregister(&pdev->dev); - snd_soc_unregister_card(card); - msm_i2s_auxpcm_deinit(); - - return 0; -} - -static struct platform_driver kona_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = kona_asoc_machine_of_match, - .suppress_bind_attrs = true, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; -module_platform_driver(kona_asoc_machine_driver); - -MODULE_DESCRIPTION("ALSA SoC msm"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, kona_asoc_machine_of_match); diff --git a/techpack/audio/4.0/asoc/msm-audio-effects-q6-v2.c b/techpack/audio/4.0/asoc/msm-audio-effects-q6-v2.c deleted file mode 100644 index db3bd87ebc0e..000000000000 --- a/techpack/audio/4.0/asoc/msm-audio-effects-q6-v2.c +++ /dev/null @@ -1,1482 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_ENABLE_CMD_SIZE 32 - -#define GET_NEXT(ptr, upper_limit, rc) \ -({ \ - if (((ptr) + 1) > (upper_limit)) { \ - pr_err_ratelimited("%s: param list out of boundary\n", \ - __func__); \ - (rc) = -EINVAL; \ - } \ - ((rc) == 0) ? *(ptr)++ : -EINVAL; \ -}) - -#define CHECK_PARAM_LEN(len, max_len, tag, rc) \ -do { \ - if ((len) > (max_len)) { \ - pr_err_ratelimited("%s: params length overflows\n", \ - (tag)); \ - (rc) = -EINVAL; \ - } \ -} while (0) - - -/** - * msm_audio_effects_is_effmodule_supp_in_top - - * Checks if given topology and module in effects - * - */ -bool msm_audio_effects_is_effmodule_supp_in_top(int effect_module, - int topology) -{ - switch (effect_module) { - case VIRTUALIZER_MODULE: - case REVERB_MODULE: - case BASS_BOOST_MODULE: - case PBE_MODULE: - case EQ_MODULE: - switch (topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_SA_PLUS: - return true; - default: - return false; - } - default: - return false; - } -} -EXPORT_SYMBOL(msm_audio_effects_is_effmodule_supp_in_top); - -int msm_audio_effects_enable_extn(struct audio_client *ac, - struct msm_nt_eff_all_config *effects, - bool flag) -{ - u32 flag_param = flag ? 1 : 0; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s\n", __func__); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VIRTUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = VIRTUALIZER_ENABLE_PARAM_SZ; - if (effects->virtualizer.enable_flag) - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_hdr, - (u8 *) &flag_param); - - param_hdr.module_id = AUDPROC_MODULE_ID_BASS_BOOST; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = BASS_BOOST_ENABLE_PARAM_SZ; - if (effects->bass_boost.enable_flag) - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_hdr, - (u8 *) &flag_param); - - param_hdr.module_id = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = EQ_ENABLE_PARAM_SZ; - if (effects->equalizer.enable_flag) - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_hdr, - (u8 *) &flag_param); - - return rc; -} - -/** - * msm_audio_effects_virtualizer_handler - - * Audio effects handler for virtualizer - * - * @ac: audio client handle - * @pbe: virtualizer params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_virtualizer_handler(struct audio_client *ac, - struct virtualizer_params *virtualizer, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VIRTUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case VIRTUALIZER_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("VIRT ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = virtualizer->enable_flag; - virtualizer->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s:VIRT ENABLE prev:%d, new:%d\n", __func__, - prev_enable_flag, virtualizer->enable_flag); - if (prev_enable_flag == virtualizer->enable_flag) - continue; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_ENABLE; - param_hdr.param_size = VIRTUALIZER_ENABLE_PARAM_SZ; - param_data = (u8 *) &virtualizer->enable_flag; - break; - case VIRTUALIZER_STRENGTH: - if (length != 1 || index_offset != 0) { - pr_err("VIRT STRENGTH:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - virtualizer->strength = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: VIRT STRENGTH val: %d\n", - __func__, virtualizer->strength); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_STRENGTH_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT STRENGTH", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_STRENGTH; - param_hdr.param_size = VIRTUALIZER_STRENGTH_PARAM_SZ; - param_data = (u8 *) &virtualizer->strength; - break; - case VIRTUALIZER_OUT_TYPE: - if (length != 1 || index_offset != 0) { - pr_err("VIRT OUT_TYPE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - virtualizer->out_type = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: VIRT OUT_TYPE val:%d\n", - __func__, virtualizer->out_type); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_OUT_TYPE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT OUT_TYPE", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_OUT_TYPE; - param_hdr.param_size = VIRTUALIZER_OUT_TYPE_PARAM_SZ; - param_data = (u8 *) &virtualizer->out_type; - break; - case VIRTUALIZER_GAIN_ADJUST: - if (length != 1 || index_offset != 0) { - pr_err("VIRT GAIN_ADJUST: invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - virtualizer->gain_adjust = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: VIRT GAIN_ADJUST val:%d\n", - __func__, virtualizer->gain_adjust); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_GAIN_ADJUST_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT GAIN_ADJUST", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_GAIN_ADJUST; - param_hdr.param_size = VIRTUALIZER_GAIN_ADJUST_PARAM_SZ; - param_data = (u8 *) &virtualizer->gain_adjust; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_virtualizer_handler); - -/** - * msm_audio_effects_reverb_handler - - * Audio effects handler for reverb - * - * @ac: audio client handle - * @pbe: reverb params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_reverb_handler(struct audio_client *ac, - struct reverb_params *reverb, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_REVERB; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case REVERB_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = reverb->enable_flag; - reverb->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s:REVERB_ENABLE prev:%d,new:%d\n", __func__, - prev_enable_flag, reverb->enable_flag); - if (prev_enable_flag == reverb->enable_flag) - continue; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_ENABLE; - param_hdr.param_size = REVERB_ENABLE_PARAM_SZ; - param_data = (u8 *) &reverb->enable_flag; - break; - case REVERB_MODE: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_MODE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->mode = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_MODE val:%d\n", - __func__, reverb->mode); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_MODE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_MODE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_MODE; - param_hdr.param_size = REVERB_MODE_PARAM_SZ; - param_data = (u8 *) &reverb->mode; - break; - case REVERB_PRESET: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_PRESET:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->preset = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_PRESET val:%d\n", - __func__, reverb->preset); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_PRESET_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_PRESET", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_PRESET; - param_hdr.param_size = REVERB_PRESET_PARAM_SZ; - param_data = (u8 *) &reverb->preset; - break; - case REVERB_WET_MIX: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_WET_MIX:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->wet_mix = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_WET_MIX val:%d\n", - __func__, reverb->wet_mix); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_WET_MIX_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_WET_MIX", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_WET_MIX; - param_hdr.param_size = REVERB_WET_MIX_PARAM_SZ; - param_data = (u8 *) &reverb->wet_mix; - break; - case REVERB_GAIN_ADJUST: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_GAIN_ADJUST:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->gain_adjust = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_GAIN_ADJUST val:%d\n", - __func__, reverb->gain_adjust); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_GAIN_ADJUST_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_GAIN_ADJUST", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_GAIN_ADJUST; - param_hdr.param_size = REVERB_GAIN_ADJUST_PARAM_SZ; - param_data = (u8 *) &reverb->gain_adjust; - break; - case REVERB_ROOM_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_ROOM_LEVEL:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->room_level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_ROOM_LEVEL val:%d\n", - __func__, reverb->room_level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_ROOM_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_ROOM_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_ROOM_LEVEL; - param_hdr.param_size = REVERB_ROOM_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->room_level; - break; - case REVERB_ROOM_HF_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_ROOM_HF_LEVEL:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->room_hf_level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_ROOM_HF_LEVEL val%d\n", - __func__, reverb->room_hf_level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_ROOM_HF_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_ROOM_HF_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_ROOM_HF_LEVEL; - param_hdr.param_size = REVERB_ROOM_HF_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->room_hf_level; - break; - case REVERB_DECAY_TIME: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DECAY_TIME:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->decay_time = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DECAY_TIME val:%d\n", - __func__, reverb->decay_time); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DECAY_TIME_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DECAY_TIME", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DECAY_TIME; - param_hdr.param_size = REVERB_DECAY_TIME_PARAM_SZ; - param_data = (u8 *) &reverb->decay_time; - break; - case REVERB_DECAY_HF_RATIO: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DECAY_HF_RATIOinvalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->decay_hf_ratio = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DECAY_HF_RATIO val%d\n", - __func__, reverb->decay_hf_ratio); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DECAY_HF_RATIO_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DECAY_HF_RATIO", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_DECAY_HF_RATIO; - param_hdr.param_size = REVERB_DECAY_HF_RATIO_PARAM_SZ; - param_data = (u8 *) &reverb->decay_hf_ratio; - break; - case REVERB_REFLECTIONS_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_REFLECTION_LVLinvalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->reflections_level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_REFLECTIONS_LEVEL val:%d\n", - __func__, reverb->reflections_level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_REFLECTIONS_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_REFLECTIONS_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_REFLECTIONS_LEVEL; - param_hdr.param_size = - REVERB_REFLECTIONS_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->reflections_level; - break; - case REVERB_REFLECTIONS_DELAY: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_REFLECTION_DLYinvalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->reflections_delay = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_REFLECTIONS_DELAY val:%d\n", - __func__, reverb->reflections_delay); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_REFLECTIONS_DELAY_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_REFLECTIONS_DELAY", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_REFLECTIONS_DELAY; - param_hdr.param_size = - REVERB_REFLECTIONS_DELAY_PARAM_SZ; - param_data = (u8 *) &reverb->reflections_delay; - break; - case REVERB_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_LEVEL:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_LEVEL val:%d\n", - __func__, reverb->level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_LEVEL; - param_hdr.param_size = REVERB_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->level; - break; - case REVERB_DELAY: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DELAY:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->delay = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s:REVERB_DELAY val:%d\n", - __func__, reverb->delay); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DELAY_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DELAY", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DELAY; - param_hdr.param_size = REVERB_DELAY_PARAM_SZ; - param_data = (u8 *) &reverb->delay; - break; - case REVERB_DIFFUSION: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DIFFUSION:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->diffusion = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DIFFUSION val:%d\n", - __func__, reverb->diffusion); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DIFFUSION_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DIFFUSION", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DIFFUSION; - param_hdr.param_size = REVERB_DIFFUSION_PARAM_SZ; - param_data = (u8 *) &reverb->diffusion; - break; - case REVERB_DENSITY: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DENSITY:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->density = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DENSITY val:%d\n", - __func__, reverb->density); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DENSITY_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DENSITY", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DENSITY; - param_hdr.param_size = REVERB_DENSITY_PARAM_SZ; - param_data = (u8 *) &reverb->density; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_reverb_handler); - -/** - * msm_audio_effects_bass_boost_handler - - * Audio effects handler for bass_boost - * - * @ac: audio client handle - * @bass_boost: bass_boost params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_bass_boost_handler(struct audio_client *ac, - struct bass_boost_params *bass_boost, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_BASS_BOOST; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case BASS_BOOST_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("BASS_BOOST_ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = bass_boost->enable_flag; - bass_boost->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: BASS_BOOST_ENABLE prev:%d new:%d\n", - __func__, prev_enable_flag, - bass_boost->enable_flag); - if (prev_enable_flag == bass_boost->enable_flag) - continue; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - BASS_BOOST_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "BASS_BOOST_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_BASS_BOOST_ENABLE; - param_hdr.param_size = BASS_BOOST_ENABLE_PARAM_SZ; - param_data = (u8 *) &bass_boost->enable_flag; - break; - case BASS_BOOST_MODE: - if (length != 1 || index_offset != 0) { - pr_err("BASS_BOOST_MODE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - bass_boost->mode = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: BASS_BOOST_MODE val:%d\n", - __func__, bass_boost->mode); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - BASS_BOOST_MODE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "BASS_BOOST_MODE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_BASS_BOOST_MODE; - param_hdr.param_size = BASS_BOOST_MODE_PARAM_SZ; - param_data = (u8 *) &bass_boost->mode; - break; - case BASS_BOOST_STRENGTH: - if (length != 1 || index_offset != 0) { - pr_err("BASS_BOOST_STRENGTH:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - bass_boost->strength = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: BASS_BOOST_STRENGTH val:%d\n", - __func__, bass_boost->strength); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - BASS_BOOST_STRENGTH_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "BASS_BOOST_STRENGTH", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_BASS_BOOST_STRENGTH; - param_hdr.param_size = BASS_BOOST_STRENGTH_PARAM_SZ; - param_data = (u8 *) &bass_boost->strength; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_bass_boost_handler); - -/** - * msm_audio_effects_pbe_handler - - * Audio effects handler for pbe - * - * @ac: audio client handle - * @pbe: pbe params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_pbe_handler(struct audio_client *ac, - struct pbe_params *pbe, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - int32_t *p_coeffs = NULL; - uint32_t lpf_len = 0, hpf_len = 0, bpf_len = 0; - uint32_t bsf_len = 0, tsf_len = 0, total_coeffs_len = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_PBE; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case PBE_ENABLE: - pr_debug("%s: PBE_ENABLE\n", __func__); - if (length != 1 || index_offset != 0) { - pr_err("no valid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = pbe->enable_flag; - pbe->enable_flag = - GET_NEXT(values, param_max_offset, rc); - if (prev_enable_flag == pbe->enable_flag) - continue; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - PBE_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "PBE_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_PBE_ENABLE; - param_hdr.param_size = PBE_ENABLE_PARAM_SZ; - param_data = (u8 *) &pbe->enable_flag; - break; - case PBE_CONFIG: - pr_debug("%s: PBE_PARAM length %u\n", __func__, length); - if (length > sizeof(struct pbe_config_t) || - length < PBE_CONFIG_PARAM_LEN || - index_offset != 0) { - pr_err("no valid params, len %d\n", length); - rc = -EINVAL; - goto invalid_config; - } - - pbe->config.real_bass_mix = - GET_NEXT(values, param_max_offset, rc); - pbe->config.bass_color_control = - GET_NEXT(values, param_max_offset, rc); - pbe->config.main_chain_delay = - GET_NEXT(values, param_max_offset, rc); - pbe->config.xover_filter_order = - GET_NEXT(values, param_max_offset, rc); - pbe->config.bandpass_filter_order = - GET_NEXT(values, param_max_offset, rc); - pbe->config.drc_delay = - GET_NEXT(values, param_max_offset, rc); - pbe->config.rms_tav = - GET_NEXT(values, param_max_offset, rc); - pbe->config.exp_threshold = - GET_NEXT(values, param_max_offset, rc); - pbe->config.exp_slope = - GET_NEXT(values, param_max_offset, rc); - pbe->config.comp_threshold = - GET_NEXT(values, param_max_offset, rc); - pbe->config.comp_slope = - GET_NEXT(values, param_max_offset, rc); - pbe->config.makeup_gain = - GET_NEXT(values, param_max_offset, rc); - pbe->config.comp_attack = - GET_NEXT(values, param_max_offset, rc); - pbe->config.comp_release = - GET_NEXT(values, param_max_offset, rc); - pbe->config.exp_attack = - GET_NEXT(values, param_max_offset, rc); - pbe->config.exp_release = - GET_NEXT(values, param_max_offset, rc); - pbe->config.limiter_bass_threshold = - GET_NEXT(values, param_max_offset, rc); - pbe->config.limiter_high_threshold = - GET_NEXT(values, param_max_offset, rc); - pbe->config.limiter_bass_makeup_gain = - GET_NEXT(values, param_max_offset, rc); - pbe->config.limiter_high_makeup_gain = - GET_NEXT(values, param_max_offset, rc); - pbe->config.limiter_bass_gc = - GET_NEXT(values, param_max_offset, rc); - pbe->config.limiter_high_gc = - GET_NEXT(values, param_max_offset, rc); - pbe->config.limiter_delay = - GET_NEXT(values, param_max_offset, rc); - pbe->config.reserved = - GET_NEXT(values, param_max_offset, rc); - - p_coeffs = &pbe->config.p1LowPassCoeffs[0]; - lpf_len = (pbe->config.xover_filter_order == 3) ? 10 : 5; - hpf_len = (pbe->config.xover_filter_order == 3) ? 10 : 5; - bpf_len = pbe->config.bandpass_filter_order * 5; - bsf_len = 5; - tsf_len = 5; - total_coeffs_len = lpf_len + hpf_len + bpf_len + bsf_len + tsf_len; - - for (i = 0; i < total_coeffs_len; i++) { - *p_coeffs++ = GET_NEXT(values, param_max_offset, rc); - } - - if (command_config_state != CONFIG_SET) - break; - - max_params_length = - params_length + COMMAND_IID_PAYLOAD_SZ + length; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "PBE_PARAM", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_PBE_PARAM_CONFIG; - param_hdr.param_size = length; - param_data = (u8 *) &pbe->config; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_pbe_handler); - -/** - * msm_audio_effects_popless_eq_handler - - * Audio effects handler for popless equalizer - * - * @ac: audio client handle - * @eq: equalizer params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_popless_eq_handler(struct audio_client *ac, - struct eq_params *eq, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params = NULL; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - u8 *eq_config_data = NULL; - u32 *updt_config_data = NULL; - int config_param_length; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - uint32_t idx; - int j; - - switch (command_id) { - case EQ_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("EQ_ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = eq->enable_flag; - eq->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: EQ_ENABLE prev:%d new:%d\n", __func__, - prev_enable_flag, eq->enable_flag); - if (prev_enable_flag == eq->enable_flag) - continue; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - EQ_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_EQ_ENABLE; - param_hdr.param_size = EQ_ENABLE_PARAM_SZ; - param_data = (u8 *) &eq->enable_flag; - break; - case EQ_CONFIG: - if (length < EQ_CONFIG_PARAM_LEN || index_offset != 0) { - pr_err("EQ_CONFIG:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - pr_debug("%s: EQ_CONFIG bands:%d, pgain:%d, pset:%d\n", - __func__, eq->config.num_bands, - eq->config.eq_pregain, eq->config.preset_id); - for (idx = 0; idx < MAX_EQ_BANDS; idx++) - eq->per_band_cfg[idx].band_idx = -1; - eq->config.eq_pregain = - GET_NEXT(values, param_max_offset, rc); - eq->config.preset_id = - GET_NEXT(values, param_max_offset, rc); - eq->config.num_bands = - GET_NEXT(values, param_max_offset, rc); - if (eq->config.num_bands > MAX_EQ_BANDS) { - pr_err("EQ_CONFIG:invalid num of bands\n"); - rc = -EINVAL; - goto invalid_config; - } - if (eq->config.num_bands && - (((length - EQ_CONFIG_PARAM_LEN)/ - EQ_CONFIG_PER_BAND_PARAM_LEN) - != eq->config.num_bands)) { - pr_err("EQ_CONFIG:invalid length per band\n"); - rc = -EINVAL; - goto invalid_config; - } - for (j = 0; j < eq->config.num_bands; j++) { - idx = GET_NEXT(values, param_max_offset, rc); - if (idx >= MAX_EQ_BANDS) { - pr_err("EQ_CONFIG:invalid band index\n"); - rc = -EINVAL; - goto invalid_config; - } - eq->per_band_cfg[idx].band_idx = idx; - eq->per_band_cfg[idx].filter_type = - GET_NEXT(values, param_max_offset, rc); - eq->per_band_cfg[idx].freq_millihertz = - GET_NEXT(values, param_max_offset, rc); - eq->per_band_cfg[idx].gain_millibels = - GET_NEXT(values, param_max_offset, rc); - eq->per_band_cfg[idx].quality_factor = - GET_NEXT(values, param_max_offset, rc); - } - if (command_config_state != CONFIG_SET) - break; - config_param_length = EQ_CONFIG_PARAM_SZ + - (EQ_CONFIG_PER_BAND_PARAM_SZ * - eq->config.num_bands); - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - config_param_length; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_CONFIG", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_EQ_CONFIG; - param_hdr.param_size = config_param_length; - - if (!eq_config_data) - eq_config_data = kzalloc(config_param_length, - GFP_KERNEL); - else - memset(eq_config_data, 0, config_param_length); - if (!eq_config_data) { - pr_err("%s, EQ_CONFIG:memory alloc failed\n", - __func__); - rc = -ENOMEM; - goto invalid_config; - } - param_data = eq_config_data; - updt_config_data = (u32 *) eq_config_data; - *updt_config_data++ = eq->config.eq_pregain; - *updt_config_data++ = eq->config.preset_id; - *updt_config_data++ = eq->config.num_bands; - for (idx = 0; idx < MAX_EQ_BANDS; idx++) { - if (eq->per_band_cfg[idx].band_idx < 0) - continue; - *updt_config_data++ = - eq->per_band_cfg[idx].filter_type; - *updt_config_data++ = - eq->per_band_cfg[idx].freq_millihertz; - *updt_config_data++ = - eq->per_band_cfg[idx].gain_millibels; - *updt_config_data++ = - eq->per_band_cfg[idx].quality_factor; - *updt_config_data++ = - eq->per_band_cfg[idx].band_idx; - } - break; - case EQ_BAND_INDEX: - if (length != 1 || index_offset != 0) { - pr_err("EQ_BAND_INDEX:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - idx = GET_NEXT(values, param_max_offset, rc); - if (idx > MAX_EQ_BANDS) { - pr_err("EQ_BAND_INDEX:invalid band index\n"); - rc = -EINVAL; - goto invalid_config; - } - eq->band_index = idx; - pr_debug("%s: EQ_BAND_INDEX val:%d\n", - __func__, eq->band_index); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - EQ_BAND_INDEX_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_BAND_INDEX", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_EQ_BAND_INDEX; - param_hdr.param_size = EQ_BAND_INDEX_PARAM_SZ; - param_data = (u8 *) &eq->band_index; - break; - case EQ_SINGLE_BAND_FREQ: - if (length != 1 || index_offset != 0) { - pr_err("EQ_SINGLE_BAND_FREQ:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - if (eq->band_index > MAX_EQ_BANDS) { - pr_err("EQ_SINGLE_BAND_FREQ:invalid index\n"); - break; - } - eq->freq_millihertz = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: EQ_SINGLE_BAND_FREQ idx:%d, val:%d\n", - __func__, eq->band_index, eq->freq_millihertz); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - EQ_SINGLE_BAND_FREQ_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_SINGLE_BAND_FREQ", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_EQ_SINGLE_BAND_FREQ; - param_hdr.param_size = EQ_SINGLE_BAND_FREQ_PARAM_SZ; - param_data = (u8 *) &eq->freq_millihertz; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - kfree(eq_config_data); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_popless_eq_handler); - -static int __msm_audio_effects_volume_handler(struct audio_client *ac, - struct soft_volume_params *vol, - long *values, - int instance) -{ - int devices; - int num_commands; - char *params = NULL; - u8 *updt_params; - int i; - uint32_t vol_gain_2ch = 0; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u32 packed_data_size = 0; - long *param_max_offset; - int rc = 0; - - pr_debug("%s: instance: %d\n", __func__, instance); - if (!values) { - pr_err("%s: set audio effects failed, no valid data\n", - __func__); - return -EINVAL; - } - param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - devices = GET_NEXT(values, param_max_offset, rc); - num_commands = GET_NEXT(values, param_max_offset, rc); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - q6asm_set_soft_volume_module_instance_ids(instance, ¶m_hdr); - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case SOFT_VOLUME_GAIN_2CH: - case SOFT_VOLUME2_GAIN_2CH: - if (length != 2 || index_offset != 0) { - pr_err("VOLUME_GAIN_2CH: invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - vol->left_gain = GET_NEXT(values, param_max_offset, rc); - vol->right_gain = - GET_NEXT(values, param_max_offset, rc); - vol->master_gain = 0x2000; - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_2CH_PARAM_SZ + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_MASTER_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VOLUME/VOLUME2_GAIN_2CH", rc); - break; - case SOFT_VOLUME_GAIN_MASTER: - case SOFT_VOLUME2_GAIN_MASTER: - if (length != 1 || index_offset != 0) { - pr_err("VOLUME_GAIN_MASTER: invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - vol->left_gain = 0x2000; - vol->right_gain = 0x2000; - vol->master_gain = - GET_NEXT(values, param_max_offset, rc); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_2CH_PARAM_SZ + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_MASTER_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VOLUME/VOLUME2_GAIN_MASTER", rc); - break; - default: - pr_err_ratelimited("%s: Invalid command id: %d to set config\n", - __func__, command_id); - continue; - } - if (rc) - continue; - - /* Set Volume Control for Left/Right */ - param_hdr.param_id = ASM_PARAM_ID_VOL_CTRL_LR_CHANNEL_GAIN; - param_hdr.param_size = SOFT_VOLUME_GAIN_2CH_PARAM_SZ; - vol_gain_2ch = (vol->left_gain << 16) | vol->right_gain; - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - (u8 *) &vol_gain_2ch, - &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - - /* Set Master Volume Control */ - param_hdr.param_id = ASM_PARAM_ID_VOL_CTRL_MASTER_GAIN; - param_hdr.param_size = SOFT_VOLUME_GAIN_MASTER_PARAM_SZ; - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - (u8 *) &vol->master_gain, - &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); -invalid_config: - kfree(params); - return rc; -} - -int msm_audio_effects_volume_handler(struct audio_client *ac, - struct soft_volume_params *vol, - long *values) -{ - return __msm_audio_effects_volume_handler(ac, vol, values, - SOFT_VOLUME_INSTANCE_1); -} - -/** - * msm_audio_effects_volume_handler_v2 - - * Audio effects handler for volume - * - * @ac: audio client handle - * @vol: volume params - * @values: values to be updated - * @instance: instance to update - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_volume_handler_v2(struct audio_client *ac, - struct soft_volume_params *vol, - long *values, int instance) -{ - return __msm_audio_effects_volume_handler(ac, vol, values, instance); -} -EXPORT_SYMBOL(msm_audio_effects_volume_handler_v2); diff --git a/techpack/audio/4.0/asoc/msm-compress-q6-v2.c b/techpack/audio/4.0/asoc/msm-compress-q6-v2.c deleted file mode 100644 index 0a49a778a91f..000000000000 --- a/techpack/audio/4.0/asoc/msm-compress-q6-v2.c +++ /dev/null @@ -1,5416 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "msm-qti-pp-config.h" - -#define DRV_NAME "msm-compress-q6-v2" - -#define TIMEOUT_MS 1000 -#define DSP_PP_BUFFERING_IN_MSEC 25 -#define PARTIAL_DRAIN_ACK_EARLY_BY_MSEC 150 -#define MP3_OUTPUT_FRAME_SZ 1152 -#define AAC_OUTPUT_FRAME_SZ 1024 -#define AC3_OUTPUT_FRAME_SZ 1536 -#define EAC3_OUTPUT_FRAME_SZ 1536 -#define DSP_NUM_OUTPUT_FRAME_BUFFERED 2 -#define FLAC_BLK_SIZE_LIMIT 65535 - -/* Timestamp mode payload offsets */ -#define CAPTURE_META_DATA_TS_OFFSET_LSW 6 -#define CAPTURE_META_DATA_TS_OFFSET_MSW 7 - -/* decoder parameter length */ -#define DDP_DEC_MAX_NUM_PARAM 18 - -/* Default values used if user space does not set */ -#define COMPR_PLAYBACK_MIN_FRAGMENT_SIZE (8 * 1024) -#define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024) -#define COMPR_PLAYBACK_MIN_NUM_FRAGMENTS (4) -#define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4) - -#define COMPRESSED_LR_VOL_MAX_STEPS 0x2000 -const DECLARE_TLV_DB_LINEAR(msm_compr_vol_gain, 0, - COMPRESSED_LR_VOL_MAX_STEPS); - -/* Stream id switches between 1 and 2 */ -#define NEXT_STREAM_ID(stream_id) ((stream_id & 1) + 1) - -#define STREAM_ARRAY_INDEX(stream_id) (stream_id - 1) - -#define MAX_NUMBER_OF_STREAMS 2 - -#define SND_DEC_DDP_MAX_PARAMS 18 - -#ifndef COMPRESSED_PERF_MODE_FLAG -#define COMPRESSED_PERF_MODE_FLAG 0 -#endif - -struct msm_compr_gapless_state { - bool set_next_stream_id; - int32_t stream_opened[MAX_NUMBER_OF_STREAMS]; - uint32_t initial_samples_drop; - uint32_t trailing_samples_drop; - uint32_t gapless_transition; - bool use_dsp_gapless_mode; - union snd_codec_options codec_options; -}; - -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, - 88200, 96000, 128000, 144000, 176400, 192000, 352800, 384000, 2822400, - 5644800 -}; - -struct msm_compr_pdata { - struct snd_compr_stream *cstream[MSM_FRONTEND_DAI_MAX]; - uint32_t volume[MSM_FRONTEND_DAI_MAX][2]; /* For both L & R */ - struct msm_compr_audio_effects *audio_effects[MSM_FRONTEND_DAI_MAX]; - bool use_dsp_gapless_mode; - bool use_legacy_api; /* indicates use older asm apis*/ - struct msm_compr_dec_params *dec_params[MSM_FRONTEND_DAI_MAX]; - struct msm_compr_ch_map *ch_map[MSM_FRONTEND_DAI_MAX]; - bool is_in_use[MSM_FRONTEND_DAI_MAX]; - struct msm_pcm_channel_mixer *chmixer_pspd[MSM_FRONTEND_DAI_MM_SIZE]; - struct mutex lock; -}; - -struct msm_compr_audio { - struct snd_compr_stream *cstream; - struct snd_compr_caps compr_cap; - struct snd_compr_codec_caps codec_caps; - struct snd_compr_params codec_param; - struct audio_client *audio_client; - - uint32_t codec; - uint32_t compr_passthr; - void *buffer; /* virtual address */ - phys_addr_t buffer_paddr; /* physical address */ - uint32_t app_pointer; - uint32_t buffer_size; - uint32_t byte_offset; - uint64_t copied_total; /* bytes consumed by DSP */ - uint64_t bytes_received; /* from userspace */ - uint64_t bytes_sent; /* to DSP */ - - uint64_t received_total; /* bytes received from DSP */ - uint64_t bytes_copied; /* to userspace */ - uint64_t bytes_read; /* from DSP */ - uint32_t bytes_read_offset; /* bytes read offset */ - - uint32_t ts_header_offset; /* holds the timestamp header offset */ - - int32_t first_buffer; - int32_t last_buffer; - int32_t partial_drain_delay; - - uint16_t session_id; - - uint32_t sample_rate; - uint32_t num_channels; - - /* - * convention - commands coming from the same thread - * can use the common cmd_ack var. Others (e.g drain/EOS) - * must use separate vars to track command status. - */ - uint32_t cmd_ack; - uint32_t cmd_interrupt; - uint32_t drain_ready; - uint32_t eos_ack; - - uint32_t stream_available; - uint32_t next_stream; - - uint32_t run_mode; - uint32_t start_delay_lsw; - uint32_t start_delay_msw; - - uint64_t marker_timestamp; - - struct msm_compr_gapless_state gapless_state; - - atomic_t start; - atomic_t eos; - atomic_t drain; - atomic_t xrun; - atomic_t close; - atomic_t wait_on_close; - atomic_t error; - - wait_queue_head_t eos_wait; - wait_queue_head_t drain_wait; - wait_queue_head_t close_wait; - wait_queue_head_t wait_for_stream_avail; - - spinlock_t lock; -}; - -const u32 compr_codecs[] = { - SND_AUDIOCODEC_AC3, SND_AUDIOCODEC_EAC3, SND_AUDIOCODEC_DTS, - SND_AUDIOCODEC_DSD, SND_AUDIOCODEC_TRUEHD, SND_AUDIOCODEC_IEC61937}; - -struct query_audio_effect { - uint32_t mod_id; - uint32_t parm_id; - uint32_t size; - uint32_t offset; - uint32_t device; -}; - -struct msm_compr_audio_effects { - struct bass_boost_params bass_boost; - struct pbe_params pbe; - struct virtualizer_params virtualizer; - struct reverb_params reverb; - struct eq_params equalizer; - struct soft_volume_params volume; - struct query_audio_effect query; -}; - -struct msm_compr_dec_params { - struct snd_dec_ddp ddp_params; -}; - -struct msm_compr_ch_map { - bool set_ch_map; - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; -}; - -static int msm_compr_send_dec_params(struct snd_compr_stream *cstream, - struct msm_compr_dec_params *dec_params, - int stream_id); - -static int msm_compr_set_render_mode(struct msm_compr_audio *prtd, - uint32_t render_mode) { - int ret = -EINVAL; - struct audio_client *ac = prtd->audio_client; - - pr_debug("%s, got render mode %u\n", __func__, render_mode); - - if (render_mode == SNDRV_COMPRESS_RENDER_MODE_AUDIO_MASTER) { - render_mode = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT; - } else if (render_mode == SNDRV_COMPRESS_RENDER_MODE_STC_MASTER) { - render_mode = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC; - prtd->run_mode = ASM_SESSION_CMD_RUN_STARTIME_RUN_WITH_DELAY; - } else { - pr_err("%s, Invalid render mode %u\n", __func__, - render_mode); - ret = -EINVAL; - goto exit; - } - - ret = q6asm_send_mtmx_strtr_render_mode(ac, render_mode); - if (ret) { - pr_err("%s, Render mode can't be set error %d\n", __func__, - ret); - } -exit: - return ret; -} - -static int msm_compr_set_clk_rec_mode(struct audio_client *ac, - uint32_t clk_rec_mode) { - int ret = -EINVAL; - - pr_debug("%s, got clk rec mode %u\n", __func__, clk_rec_mode); - - if (clk_rec_mode == SNDRV_COMPRESS_CLK_REC_MODE_NONE) { - clk_rec_mode = ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_NONE; - } else if (clk_rec_mode == SNDRV_COMPRESS_CLK_REC_MODE_AUTO) { - clk_rec_mode = ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_AUTO; - } else { - pr_err("%s, Invalid clk rec_mode mode %u\n", __func__, - clk_rec_mode); - ret = -EINVAL; - goto exit; - } - - ret = q6asm_send_mtmx_strtr_clk_rec_mode(ac, clk_rec_mode); - if (ret) { - pr_err("%s, clk rec mode can't be set, error %d\n", __func__, - ret); - } - -exit: - return ret; -} - -static int msm_compr_set_render_window(struct audio_client *ac, - uint32_t ws_lsw, uint32_t ws_msw, - uint32_t we_lsw, uint32_t we_msw) -{ - int ret = -EINVAL; - struct asm_session_mtmx_strtr_param_window_v2_t asm_mtmx_strtr_window; - uint32_t param_id; - - pr_debug("%s, ws_lsw 0x%x ws_msw 0x%x we_lsw 0x%x we_ms 0x%x\n", - __func__, ws_lsw, ws_msw, we_lsw, we_msw); - - memset(&asm_mtmx_strtr_window, 0, - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t)); - asm_mtmx_strtr_window.window_lsw = ws_lsw; - asm_mtmx_strtr_window.window_msw = ws_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, - param_id); - if (ret) { - pr_err("%s, start window can't be set error %d\n", __func__, - ret); - goto exit; - } - - asm_mtmx_strtr_window.window_lsw = we_lsw; - asm_mtmx_strtr_window.window_msw = we_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, - param_id); - if (ret) { - pr_err("%s, end window can't be set error %d\n", __func__, - ret); - } - -exit: - return ret; -} - -static int msm_compr_enable_adjust_session_clock(struct audio_client *ac, - bool enable) -{ - int ret; - - pr_debug("%s, enable adjust_session %d\n", __func__, enable); - - ret = q6asm_send_mtmx_strtr_enable_adjust_session_clock(ac, enable); - if (ret) - pr_err("%s, adjust session clock can't be set error %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_adjust_session_clock(struct audio_client *ac, - uint32_t adjust_session_lsw, uint32_t adjust_session_msw) -{ - int ret; - - pr_debug("%s, adjust_session_time_msw 0x%x adjust_session_time_lsw 0x%x\n", - __func__, adjust_session_msw, adjust_session_lsw); - - ret = q6asm_adjust_session_clock(ac, - adjust_session_lsw, - adjust_session_msw); - if (ret) - pr_err("%s, adjust session clock can't be set error %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_set_volume(struct snd_compr_stream *cstream, - uint32_t volume_l, uint32_t volume_r) -{ - struct msm_compr_audio *prtd; - int rc = 0; - uint32_t avg_vol, gain_list[VOLUME_CONTROL_MAX_CHANNELS]; - uint32_t num_channels; - struct snd_soc_pcm_runtime *rtd; - struct msm_compr_pdata *pdata; - bool use_default = true; - u8 *chmap = NULL; - - pr_debug("%s: volume_l %d volume_r %d\n", - __func__, volume_l, volume_r); - if (!cstream || !cstream->runtime) { - pr_err("%s: session not active\n", __func__); - return -EPERM; - } - rtd = cstream->private_data; - prtd = cstream->runtime->private_data; - - if (!rtd || !rtd->platform || !prtd || !prtd->audio_client) { - pr_err("%s: invalid rtd, prtd or audio client", __func__); - return rc; - } - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No volume config for passthrough %d\n", - __func__, prtd->compr_passthr); - return rc; - } - - use_default = !(pdata->ch_map[rtd->dai_link->id]->set_ch_map); - chmap = pdata->ch_map[rtd->dai_link->id]->channel_map; - num_channels = prtd->num_channels; - - if (prtd->num_channels > 2) { - /* - * Currently the left and right gains are averaged an applied - * to all channels. This might not be desirable. But currently, - * there exists no API in userspace to send a list of gains for - * each channel either. If such an API does become available, - * the mixer control must be updated to accept more than 2 - * channel gains. - * - */ - avg_vol = (volume_l + volume_r) / 2; - rc = q6asm_set_volume(prtd->audio_client, avg_vol); - } else { - gain_list[0] = volume_l; - gain_list[1] = volume_r; - gain_list[2] = volume_l; - if (use_default) - num_channels = 3; - rc = q6asm_set_multich_gain(prtd->audio_client, num_channels, - gain_list, chmap, use_default); - } - - if (rc < 0) - pr_err("%s: Send vol gain command failed rc=%d\n", - __func__, rc); - - return rc; -} - -static int msm_compr_send_ddp_cfg(struct audio_client *ac, - struct snd_dec_ddp *ddp, - int stream_id) -{ - int i, rc; - - pr_debug("%s\n", __func__); - for (i = 0; i < ddp->params_length; i++) { - rc = q6asm_ds1_set_stream_endp_params(ac, ddp->params_id[i], - ddp->params_value[i], - stream_id); - if (rc) { - pr_err("sending params_id: %d failed\n", - ddp->params_id[i]); - return rc; - } - } - return 0; -} - -static int msm_compr_send_buffer(struct msm_compr_audio *prtd) -{ - int buffer_length; - uint64_t bytes_available; - struct audio_aio_write_param param; - struct snd_codec_metadata *buff_addr; - - if (!atomic_read(&prtd->start)) { - pr_err("%s: stream is not in started state\n", __func__); - return -EINVAL; - } - - - if (atomic_read(&prtd->xrun)) { - WARN(1, "%s called while xrun is true", __func__); - return -EPERM; - } - - pr_debug("%s: bytes_received = %llu copied_total = %llu\n", - __func__, prtd->bytes_received, prtd->copied_total); - if (prtd->first_buffer && prtd->gapless_state.use_dsp_gapless_mode && - prtd->compr_passthr == LEGACY_PCM) - q6asm_stream_send_meta_data(prtd->audio_client, - prtd->audio_client->stream_id, - prtd->gapless_state.initial_samples_drop, - prtd->gapless_state.trailing_samples_drop); - - buffer_length = prtd->codec_param.buffer.fragment_size; - bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < prtd->codec_param.buffer.fragment_size) - buffer_length = bytes_available; - - if (prtd->byte_offset + buffer_length > prtd->buffer_size) { - buffer_length = (prtd->buffer_size - prtd->byte_offset); - pr_debug("%s: wrap around situation, send partial data %d now", - __func__, buffer_length); - } - - if (buffer_length) { - param.paddr = prtd->buffer_paddr + prtd->byte_offset; - WARN(prtd->byte_offset % 32 != 0, "offset %x not multiple of 32\n", - prtd->byte_offset); - } else { - param.paddr = prtd->buffer_paddr; - } - param.len = buffer_length; - if (prtd->ts_header_offset) { - buff_addr = (struct snd_codec_metadata *) - (prtd->buffer + prtd->byte_offset); - param.len = buff_addr->length; - param.msw_ts = (uint32_t) - ((buff_addr->timestamp & 0xFFFFFFFF00000000LL) >> 32); - param.lsw_ts = (uint32_t) (buff_addr->timestamp & 0xFFFFFFFFLL); - param.paddr += prtd->ts_header_offset; - param.flags = SET_TIMESTAMP; - param.metadata_len = prtd->ts_header_offset; - } else { - param.msw_ts = 0; - param.lsw_ts = 0; - param.flags = NO_TIMESTAMP; - param.metadata_len = 0; - } - param.uid = buffer_length; - param.last_buffer = prtd->last_buffer; - - pr_debug("%s: sending %d bytes to DSP byte_offset = %d\n", - __func__, param.len, prtd->byte_offset); - if (q6asm_async_write(prtd->audio_client, ¶m) < 0) { - pr_err("%s:q6asm_async_write failed\n", __func__); - } else { - prtd->bytes_sent += buffer_length; - if (prtd->first_buffer) - prtd->first_buffer = 0; - } - - return 0; -} - -static int msm_compr_read_buffer(struct msm_compr_audio *prtd) -{ - int buffer_length; - uint64_t bytes_available; - uint64_t buffer_sent; - struct audio_aio_read_param param; - int ret; - - if (!atomic_read(&prtd->start)) { - pr_err("%s: stream is not in started state\n", __func__); - return -EINVAL; - } - - buffer_length = prtd->codec_param.buffer.fragment_size - - prtd->ts_header_offset; - bytes_available = prtd->received_total - prtd->bytes_copied; - buffer_sent = prtd->bytes_read - prtd->bytes_copied; - if (buffer_sent + buffer_length + prtd->ts_header_offset - > prtd->buffer_size) { - pr_debug(" %s : Buffer is Full bytes_available: %llu\n", - __func__, bytes_available); - return 0; - } - - memset(¶m, 0x0, sizeof(struct audio_aio_read_param)); - param.paddr = prtd->buffer_paddr + prtd->bytes_read_offset + - prtd->ts_header_offset; - param.len = buffer_length; - param.uid = buffer_length; - param.flags = prtd->codec_param.codec.flags; - - pr_debug("%s: reading %d bytes from DSP byte_offset = %llu\n", - __func__, buffer_length, prtd->bytes_read); - ret = q6asm_async_read(prtd->audio_client, ¶m); - if (ret < 0) { - pr_err("%s: q6asm_async_read failed - %d\n", - __func__, ret); - return ret; - } - prtd->bytes_read += buffer_length + prtd->ts_header_offset; - prtd->bytes_read_offset += buffer_length + prtd->ts_header_offset; - if (prtd->bytes_read_offset >= prtd->buffer_size) - prtd->bytes_read_offset -= prtd->buffer_size; - - return 0; -} - -static void compr_event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct msm_compr_audio *prtd = priv; - struct snd_compr_stream *cstream; - struct audio_client *ac; - uint32_t chan_mode = 0; - uint32_t sample_rate = 0; - uint64_t bytes_available; - int stream_id; - uint32_t stream_index; - unsigned long flags; - uint64_t read_size; - uint32_t *buff_addr; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - if (!prtd) { - pr_err("%s: prtd is NULL\n", __func__); - return; - } - cstream = prtd->cstream; - if (!cstream) { - pr_err("%s: cstream is NULL\n", __func__); - return; - } - - ac = prtd->audio_client; - - /* - * Token for rest of the compressed commands use to set - * session id, stream id, dir etc. - */ - stream_id = q6asm_get_stream_id_from_token(token); - - pr_debug("%s opcode =%08x\n", __func__, opcode); - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: - spin_lock_irqsave(&prtd->lock, flags); - - if (payload[3]) { - pr_err("%s: WRITE FAILED w/ err 0x%x !, paddr 0x%x, byte_offset=%d,copied_total=%llu,token=%d\n", - __func__, - payload[3], - payload[0], - prtd->byte_offset, - prtd->copied_total, token); - - if (atomic_cmpxchg(&prtd->drain, 1, 0) && - prtd->last_buffer) { - pr_debug("%s: wake up on drain\n", __func__); - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - prtd->last_buffer = 0; - } else { - atomic_set(&prtd->start, 0); - } - } else { - pr_debug("ASM_DATA_EVENT_WRITE_DONE_V2 offset %d, length %d\n", - prtd->byte_offset, token); - } - - /* - * Token for WRITE command represents the amount of data - * written to ADSP in the last write, update offset and - * total copied data accordingly. - */ - if (prtd->ts_header_offset) { - /* Always assume that the data will be sent to DSP on - * frame boundary. - * i.e, one frame of userspace write will result in - * one kernel write to DSP. This is needed as - * timestamp will be sent per frame. - */ - prtd->byte_offset += - prtd->codec_param.buffer.fragment_size; - prtd->copied_total += - prtd->codec_param.buffer.fragment_size; - } else { - prtd->byte_offset += token; - prtd->copied_total += token; - } - if (prtd->byte_offset >= prtd->buffer_size) - prtd->byte_offset -= prtd->buffer_size; - - snd_compr_fragment_elapsed(cstream); - - if (!atomic_read(&prtd->start)) { - /* Writes must be restarted from _copy() */ - pr_debug("write_done received while not started, treat as xrun"); - atomic_set(&prtd->xrun, 1); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { - pr_debug("WRITE_DONE Insufficient data to send. break out\n"); - atomic_set(&prtd->xrun, 1); - - if (prtd->last_buffer) - prtd->last_buffer = 0; - if (atomic_read(&prtd->drain)) { - pr_debug("wake up on drain\n"); - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - atomic_set(&prtd->drain, 0); - } - } else if ((bytes_available == cstream->runtime->fragment_size) - && atomic_read(&prtd->drain)) { - prtd->last_buffer = 1; - msm_compr_send_buffer(prtd); - prtd->last_buffer = 0; - } else - msm_compr_send_buffer(prtd); - - spin_unlock_irqrestore(&prtd->lock, flags); - break; - - case ASM_DATA_EVENT_READ_DONE_V2: - spin_lock_irqsave(&prtd->lock, flags); - - pr_debug("ASM_DATA_EVENT_READ_DONE_V2 offset %d, length %d\n", - prtd->byte_offset, payload[4]); - - if (prtd->ts_header_offset) { - /* Update the header for received buffer */ - buff_addr = prtd->buffer + prtd->byte_offset; - /* Write the actual length of the received buffer */ - *buff_addr = payload[4]; - buff_addr++; - /* Write the offset */ - *buff_addr = prtd->ts_header_offset; - buff_addr++; - /* Write the TS LSW */ - *buff_addr = payload[CAPTURE_META_DATA_TS_OFFSET_LSW]; - buff_addr++; - /* Write the TS MSW */ - *buff_addr = payload[CAPTURE_META_DATA_TS_OFFSET_MSW]; - } - /* Always assume read_size is same as fragment_size */ - read_size = prtd->codec_param.buffer.fragment_size; - prtd->byte_offset += read_size; - prtd->received_total += read_size; - if (prtd->byte_offset >= prtd->buffer_size) - prtd->byte_offset -= prtd->buffer_size; - - snd_compr_fragment_elapsed(cstream); - - if (!atomic_read(&prtd->start)) { - pr_debug("read_done received while not started, treat as xrun"); - atomic_set(&prtd->xrun, 1); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - msm_compr_read_buffer(prtd); - - spin_unlock_irqrestore(&prtd->lock, flags); - break; - - case ASM_DATA_EVENT_RENDERED_EOS: - spin_lock_irqsave(&prtd->lock, flags); - pr_debug("%s: ASM_DATA_CMDRSP_EOS token 0x%x,stream id %d\n", - __func__, token, stream_id); - if (atomic_read(&prtd->eos) && - !prtd->gapless_state.set_next_stream_id) { - pr_debug("ASM_DATA_CMDRSP_EOS wake up\n"); - prtd->eos_ack = 1; - wake_up(&prtd->eos_wait); - } - atomic_set(&prtd->eos, 0); - stream_index = STREAM_ARRAY_INDEX(stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || - stream_index < 0) { - pr_err("%s: Invalid stream index %d", __func__, - stream_index); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - if (prtd->gapless_state.set_next_stream_id && - prtd->gapless_state.stream_opened[stream_index]) { - pr_debug("%s: CMD_CLOSE stream_id %d\n", - __func__, stream_id); - q6asm_stream_cmd_nowait(ac, CMD_CLOSE, stream_id); - atomic_set(&prtd->close, 1); - prtd->gapless_state.stream_opened[stream_index] = 0; - prtd->gapless_state.set_next_stream_id = false; - } - if (prtd->gapless_state.gapless_transition) - prtd->gapless_state.gapless_transition = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - case ASM_STREAM_PP_EVENT: - case ASM_STREAM_CMD_ENCDEC_EVENTS: - pr_debug("%s: ASM_STREAM_EVENT(0x%x)\n", __func__, opcode); - rtd = cstream->private_data; - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return; - } - - ret = msm_adsp_inform_mixer_ctl(rtd, payload); - if (ret) { - pr_err("%s: failed to inform mixer ctrl. err = %d\n", - __func__, ret); - return; - } - break; - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: { - pr_debug("ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY\n"); - chan_mode = payload[1] >> 16; - sample_rate = payload[2] >> 16; - if (prtd && (chan_mode != prtd->num_channels || - sample_rate != prtd->sample_rate)) { - prtd->num_channels = chan_mode; - prtd->sample_rate = sample_rate; - } - } - /* Fallthrough here */ - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - /* check if the first buffer need to be sent to DSP */ - pr_debug("ASM_SESSION_CMD_RUN_V2\n"); - - /* FIXME: A state is a better way, dealing with this */ - spin_lock_irqsave(&prtd->lock, flags); - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - atomic_set(&prtd->start, 1); - msm_compr_read_buffer(prtd); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - if (!prtd->bytes_sent) { - bytes_available = prtd->bytes_received - - prtd->copied_total; - if (bytes_available < - cstream->runtime->fragment_size) { - pr_debug("CMD_RUN_V2 Insufficient data to send. break out\n"); - atomic_set(&prtd->xrun, 1); - } else { - msm_compr_send_buffer(prtd); - } - } - - /* - * The condition below ensures playback finishes in the - * follow cornercase - * WRITE(last buffer) - * WAIT_FOR_DRAIN - * PAUSE - * WRITE_DONE(X) - * RESUME - */ - if ((prtd->copied_total == prtd->bytes_sent) && - atomic_read(&prtd->drain)) { - bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { - pr_debug("%s: RUN ack, wake up & continue pending drain\n", - __func__); - - if (prtd->last_buffer) - prtd->last_buffer = 0; - - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - atomic_set(&prtd->drain, 0); - } else if (atomic_read(&prtd->xrun)) { - pr_debug("%s: RUN ack, continue write cycle\n", __func__); - atomic_set(&prtd->xrun, 0); - msm_compr_send_buffer(prtd); - } - } - - spin_unlock_irqrestore(&prtd->lock, flags); - break; - case ASM_STREAM_CMD_FLUSH: - pr_debug("%s: ASM_STREAM_CMD_FLUSH:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - prtd->cmd_ack = 1; - break; - case ASM_DATA_CMD_REMOVE_INITIAL_SILENCE: - pr_debug("%s: ASM_DATA_CMD_REMOVE_INITIAL_SILENCE:", - __func__); - pr_debug("token 0x%x, stream id = %d\n", token, - stream_id); - break; - case ASM_DATA_CMD_REMOVE_TRAILING_SILENCE: - pr_debug("%s: ASM_DATA_CMD_REMOVE_TRAILING_SILENCE:", - __func__); - pr_debug("token = 0x%x, stream id = %d\n", token, - stream_id); - break; - case ASM_STREAM_CMD_CLOSE: - pr_debug("%s: ASM_DATA_CMD_CLOSE:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - /* - * wakeup wait for stream avail on stream 3 - * after stream 1 ends. - */ - if (prtd->next_stream) { - pr_debug("%s:CLOSE:wakeup wait for stream\n", - __func__); - prtd->stream_available = 1; - wake_up(&prtd->wait_for_stream_avail); - prtd->next_stream = 0; - } - if (atomic_read(&prtd->close) && - atomic_read(&prtd->wait_on_close)) { - prtd->cmd_ack = 1; - wake_up(&prtd->close_wait); - } - atomic_set(&prtd->close, 0); - break; - case ASM_STREAM_CMD_REGISTER_PP_EVENTS: - pr_debug("%s: ASM_STREAM_CMD_REGISTER_PP_EVENTS:", - __func__); - break; - default: - break; - } - break; - } - case ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3: - pr_debug("%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3\n", - __func__); - break; - case RESET_EVENTS: - pr_err("%s: Received reset events CB, move to error state", - __func__); - spin_lock_irqsave(&prtd->lock, flags); - /* - * Since ADSP is down, let this driver pretend that it copied - * all the bytes received, so that next write will be triggered - */ - prtd->copied_total = prtd->bytes_received; - snd_compr_fragment_elapsed(cstream); - atomic_set(&prtd->error, 1); - wake_up(&prtd->drain_wait); - if (atomic_cmpxchg(&prtd->eos, 1, 0)) { - pr_debug("%s:unblock eos wait queues", __func__); - wake_up(&prtd->eos_wait); - } - spin_unlock_irqrestore(&prtd->lock, flags); - break; - default: - pr_debug("%s: Not Supported Event opcode[0x%x]\n", - __func__, opcode); - break; - } -} - -static int msm_compr_get_partial_drain_delay(int frame_sz, int sample_rate) -{ - int delay_time_ms = 0; - - delay_time_ms = ((DSP_NUM_OUTPUT_FRAME_BUFFERED * frame_sz * 1000) / - sample_rate) + DSP_PP_BUFFERING_IN_MSEC; - delay_time_ms = delay_time_ms > PARTIAL_DRAIN_ACK_EARLY_BY_MSEC ? - delay_time_ms - PARTIAL_DRAIN_ACK_EARLY_BY_MSEC : 0; - - pr_debug("%s: frame_sz %d, sample_rate %d, partial drain delay %d\n", - __func__, frame_sz, sample_rate, delay_time_ms); - return delay_time_ms; -} - -static void populate_codec_list(struct msm_compr_audio *prtd) -{ - pr_debug("%s\n", __func__); - prtd->compr_cap.direction = SND_COMPRESS_PLAYBACK; - prtd->compr_cap.min_fragment_size = - COMPR_PLAYBACK_MIN_FRAGMENT_SIZE; - prtd->compr_cap.max_fragment_size = - COMPR_PLAYBACK_MAX_FRAGMENT_SIZE; - prtd->compr_cap.min_fragments = - COMPR_PLAYBACK_MIN_NUM_FRAGMENTS; - prtd->compr_cap.max_fragments = - COMPR_PLAYBACK_MAX_NUM_FRAGMENTS; - prtd->compr_cap.num_codecs = 17; - prtd->compr_cap.codecs[0] = SND_AUDIOCODEC_MP3; - prtd->compr_cap.codecs[1] = SND_AUDIOCODEC_AAC; - prtd->compr_cap.codecs[2] = SND_AUDIOCODEC_AC3; - prtd->compr_cap.codecs[3] = SND_AUDIOCODEC_EAC3; - prtd->compr_cap.codecs[4] = SND_AUDIOCODEC_MP2; - prtd->compr_cap.codecs[5] = SND_AUDIOCODEC_PCM; - prtd->compr_cap.codecs[6] = SND_AUDIOCODEC_WMA; - prtd->compr_cap.codecs[7] = SND_AUDIOCODEC_WMA_PRO; - prtd->compr_cap.codecs[8] = SND_AUDIOCODEC_FLAC; - prtd->compr_cap.codecs[9] = SND_AUDIOCODEC_VORBIS; - prtd->compr_cap.codecs[10] = SND_AUDIOCODEC_ALAC; - prtd->compr_cap.codecs[11] = SND_AUDIOCODEC_APE; - prtd->compr_cap.codecs[12] = SND_AUDIOCODEC_DTS; - prtd->compr_cap.codecs[13] = SND_AUDIOCODEC_DSD; - prtd->compr_cap.codecs[14] = SND_AUDIOCODEC_APTX; - prtd->compr_cap.codecs[15] = SND_AUDIOCODEC_TRUEHD; - prtd->compr_cap.codecs[16] = SND_AUDIOCODEC_IEC61937; -} - -static int msm_compr_send_media_format_block(struct snd_compr_stream *cstream, - int stream_id, - bool use_gapless_codec_options) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - struct asm_aac_cfg aac_cfg; - struct asm_wma_cfg wma_cfg; - struct asm_wmapro_cfg wma_pro_cfg; - struct asm_flac_cfg flac_cfg; - struct asm_vorbis_cfg vorbis_cfg; - struct asm_alac_cfg alac_cfg; - struct asm_ape_cfg ape_cfg; - struct asm_dsd_cfg dsd_cfg; - struct aptx_dec_bt_addr_cfg aptx_cfg; - struct asm_amrwbplus_cfg amrwbplus_cfg; - union snd_codec_options *codec_options; - - int ret = 0; - uint16_t bit_width; - bool use_default_chmap = true; - char *chmap = NULL; - uint16_t sample_word_size; - - pr_debug("%s: use_gapless_codec_options %d\n", - __func__, use_gapless_codec_options); - - if (use_gapless_codec_options) - codec_options = &(prtd->gapless_state.codec_options); - else - codec_options = &(prtd->codec_param.codec.options); - - if (!codec_options) { - pr_err("%s: codec_options is NULL\n", __func__); - return -EINVAL; - } - - switch (prtd->codec) { - case FORMAT_LINEAR_PCM: - pr_debug("SND_AUDIOCODEC_PCM\n"); - if (pdata->ch_map[rtd->dai_link->id]) { - use_default_chmap = - !(pdata->ch_map[rtd->dai_link->id]->set_ch_map); - chmap = - pdata->ch_map[rtd->dai_link->id]->channel_map; - } - - switch (prtd->codec_param.codec.format) { - case SNDRV_PCM_FORMAT_S32_LE: - bit_width = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bit_width = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bit_width = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_width = 16; - sample_word_size = 16; - break; - } - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) { - ret = q6asm_media_format_block_pcm_format_support_v5( - prtd->audio_client, - prtd->sample_rate, - prtd->num_channels, - bit_width, stream_id, - use_default_chmap, - chmap, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } else { - ret = q6asm_media_format_block_pcm_format_support_v4( - prtd->audio_client, - prtd->sample_rate, - prtd->num_channels, - bit_width, stream_id, - use_default_chmap, - chmap, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - - break; - case FORMAT_MP3: - pr_debug("SND_AUDIOCODEC_MP3\n"); - /* no media format block needed */ - break; - case FORMAT_MPEG4_AAC: - pr_debug("SND_AUDIOCODEC_AAC\n"); - memset(&aac_cfg, 0x0, sizeof(struct asm_aac_cfg)); - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - if (prtd->codec_param.codec.format == - SND_AUDIOSTREAMFORMAT_MP4ADTS) - aac_cfg.format = 0x0; - else if (prtd->codec_param.codec.format == - SND_AUDIOSTREAMFORMAT_MP4LATM) - aac_cfg.format = 0x04; - else - aac_cfg.format = 0x03; - aac_cfg.ch_cfg = prtd->num_channels; - aac_cfg.sample_rate = prtd->sample_rate; - ret = q6asm_stream_media_format_block_aac(prtd->audio_client, - &aac_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case FORMAT_AC3: - pr_debug("SND_AUDIOCODEC_AC3\n"); - break; - case FORMAT_EAC3: - pr_debug("SND_AUDIOCODEC_EAC3\n"); - break; - case FORMAT_WMA_V9: - pr_debug("SND_AUDIOCODEC_WMA\n"); - memset(&wma_cfg, 0x0, sizeof(struct asm_wma_cfg)); - wma_cfg.format_tag = prtd->codec_param.codec.format; - wma_cfg.ch_cfg = prtd->codec_param.codec.ch_in; - wma_cfg.sample_rate = prtd->sample_rate; - wma_cfg.avg_bytes_per_sec = codec_options->wma.avg_bit_rate/8; - wma_cfg.block_align = codec_options->wma.super_block_align; - wma_cfg.valid_bits_per_sample = - codec_options->wma.bits_per_sample; - wma_cfg.ch_mask = codec_options->wma.channelmask; - wma_cfg.encode_opt = codec_options->wma.encodeopt; - ret = q6asm_media_format_block_wma(prtd->audio_client, - &wma_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case FORMAT_WMA_V10PRO: - pr_debug("SND_AUDIOCODEC_WMA_PRO\n"); - memset(&wma_pro_cfg, 0x0, sizeof(struct asm_wmapro_cfg)); - wma_pro_cfg.format_tag = prtd->codec_param.codec.format; - wma_pro_cfg.ch_cfg = prtd->codec_param.codec.ch_in; - wma_pro_cfg.sample_rate = prtd->sample_rate; - wma_cfg.avg_bytes_per_sec = codec_options->wma.avg_bit_rate/8; - wma_pro_cfg.block_align = codec_options->wma.super_block_align; - wma_pro_cfg.valid_bits_per_sample = - codec_options->wma.bits_per_sample; - wma_pro_cfg.ch_mask = codec_options->wma.channelmask; - wma_pro_cfg.encode_opt = codec_options->wma.encodeopt; - wma_pro_cfg.adv_encode_opt = codec_options->wma.encodeopt1; - wma_pro_cfg.adv_encode_opt2 = codec_options->wma.encodeopt2; - ret = q6asm_media_format_block_wmapro(prtd->audio_client, - &wma_pro_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case FORMAT_MP2: - pr_debug("%s: SND_AUDIOCODEC_MP2\n", __func__); - break; - case FORMAT_FLAC: - pr_debug("%s: SND_AUDIOCODEC_FLAC\n", __func__); - memset(&flac_cfg, 0x0, sizeof(struct asm_flac_cfg)); - flac_cfg.ch_cfg = prtd->num_channels; - flac_cfg.sample_rate = prtd->sample_rate; - flac_cfg.stream_info_present = 1; - flac_cfg.sample_size = codec_options->flac_dec.sample_size; - flac_cfg.min_blk_size = codec_options->flac_dec.min_blk_size; - flac_cfg.max_blk_size = codec_options->flac_dec.max_blk_size; - flac_cfg.max_frame_size = - codec_options->flac_dec.max_frame_size; - flac_cfg.min_frame_size = - codec_options->flac_dec.min_frame_size; - - ret = q6asm_stream_media_format_block_flac(prtd->audio_client, - &flac_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - - break; - case FORMAT_VORBIS: - pr_debug("%s: SND_AUDIOCODEC_VORBIS\n", __func__); - memset(&vorbis_cfg, 0x0, sizeof(struct asm_vorbis_cfg)); - vorbis_cfg.bit_stream_fmt = - codec_options->vorbis_dec.bit_stream_fmt; - - ret = q6asm_stream_media_format_block_vorbis( - prtd->audio_client, &vorbis_cfg, - stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - - break; - case FORMAT_ALAC: - pr_debug("%s: SND_AUDIOCODEC_ALAC\n", __func__); - memset(&alac_cfg, 0x0, sizeof(struct asm_alac_cfg)); - alac_cfg.num_channels = prtd->num_channels; - alac_cfg.sample_rate = prtd->sample_rate; - alac_cfg.frame_length = codec_options->alac.frame_length; - alac_cfg.compatible_version = - codec_options->alac.compatible_version; - alac_cfg.bit_depth = codec_options->alac.bit_depth; - alac_cfg.pb = codec_options->alac.pb; - alac_cfg.mb = codec_options->alac.mb; - alac_cfg.kb = codec_options->alac.kb; - alac_cfg.max_run = codec_options->alac.max_run; - alac_cfg.max_frame_bytes = codec_options->alac.max_frame_bytes; - alac_cfg.avg_bit_rate = codec_options->alac.avg_bit_rate; - alac_cfg.channel_layout_tag = - codec_options->alac.channel_layout_tag; - - ret = q6asm_media_format_block_alac(prtd->audio_client, - &alac_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_APE: - pr_debug("%s: SND_AUDIOCODEC_APE\n", __func__); - memset(&ape_cfg, 0x0, sizeof(struct asm_ape_cfg)); - ape_cfg.num_channels = prtd->num_channels; - ape_cfg.sample_rate = prtd->sample_rate; - ape_cfg.compatible_version = - codec_options->ape.compatible_version; - ape_cfg.compression_level = - codec_options->ape.compression_level; - ape_cfg.format_flags = codec_options->ape.format_flags; - ape_cfg.blocks_per_frame = codec_options->ape.blocks_per_frame; - ape_cfg.final_frame_blocks = - codec_options->ape.final_frame_blocks; - ape_cfg.total_frames = codec_options->ape.total_frames; - ape_cfg.bits_per_sample = codec_options->ape.bits_per_sample; - ape_cfg.seek_table_present = - codec_options->ape.seek_table_present; - - ret = q6asm_media_format_block_ape(prtd->audio_client, - &ape_cfg, stream_id); - - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_DTS: - pr_debug("SND_AUDIOCODEC_DTS\n"); - /* no media format block needed */ - break; - case FORMAT_DSD: - pr_debug("%s: SND_AUDIOCODEC_DSD\n", __func__); - memset(&dsd_cfg, 0x0, sizeof(struct asm_dsd_cfg)); - dsd_cfg.num_channels = prtd->num_channels; - dsd_cfg.dsd_data_rate = prtd->sample_rate; - dsd_cfg.num_version = 0; - dsd_cfg.is_bitwise_big_endian = 1; - dsd_cfg.dsd_channel_block_size = 1; - ret = q6asm_media_format_block_dsd(prtd->audio_client, - &dsd_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD DSD Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_TRUEHD: - pr_debug("SND_AUDIOCODEC_TRUEHD\n"); - /* no media format block needed */ - break; - case FORMAT_IEC61937: - pr_debug("SND_AUDIOCODEC_IEC61937\n"); - ret = q6asm_media_format_block_iec(prtd->audio_client, - prtd->sample_rate, - prtd->num_channels); - if (ret < 0) - pr_err("%s: CMD IEC61937 Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_APTX: - pr_debug("SND_AUDIOCODEC_APTX\n"); - memset(&aptx_cfg, 0x0, sizeof(struct aptx_dec_bt_addr_cfg)); - ret = q6asm_stream_media_format_block_aptx_dec( - prtd->audio_client, - prtd->sample_rate, - stream_id); - if (ret >= 0) { - aptx_cfg.nap = codec_options->aptx_dec.nap; - aptx_cfg.uap = codec_options->aptx_dec.uap; - aptx_cfg.lap = codec_options->aptx_dec.lap; - q6asm_set_aptx_dec_bt_addr(prtd->audio_client, - &aptx_cfg); - } else { - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - } - break; - case FORMAT_AMRNB: - pr_debug("SND_AUDIOCODEC_AMR\n"); - /* no media format block needed */ - break; - case FORMAT_AMRWB: - pr_debug("SND_AUDIOCODEC_AMRWB\n"); - /* no media format block needed */ - break; - case FORMAT_AMR_WB_PLUS: - pr_debug("SND_AUDIOCODEC_AMRWBPLUS\n"); - memset(&amrwbplus_cfg, 0x0, sizeof(struct asm_amrwbplus_cfg)); - amrwbplus_cfg.amr_frame_fmt = - codec_options->amrwbplus.bit_stream_fmt; - ret = q6asm_media_format_block_amrwbplus( - prtd->audio_client, - &amrwbplus_cfg); - if (ret < 0) - pr_err("%s: CMD AMRWBPLUS Format block failed ret %d\n", - __func__, ret); - break; - default: - pr_debug("%s, unsupported format, skip", __func__); - break; - } - return ret; -} - -static int msm_compr_init_pp_params(struct snd_compr_stream *cstream, - struct audio_client *ac) -{ - int ret = 0; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - switch (ac->topology) { - default: - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - - break; - } - return ret; -} - -static int msm_compr_configure_dsp_for_playback - (struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = cstream->private_data; - uint16_t bits_per_sample = 16; - int dir = IN, ret = 0; - struct audio_client *ac = prtd->audio_client; - uint32_t stream_index; - struct asm_softpause_params softpause = { - .enable = SOFT_PAUSE_ENABLE, - .period = SOFT_PAUSE_PERIOD, - .step = SOFT_PAUSE_STEP, - .rampingcurve = SOFT_PAUSE_CURVE_LINEAR, - }; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - struct snd_kcontrol *kctl; - struct snd_ctl_elem_value kctl_elem_value; - uint16_t target_asm_bit_width = 0; - - pr_debug("%s: stream_id %d\n", __func__, ac->stream_id); - stream_index = STREAM_ARRAY_INDEX(ac->stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || stream_index < 0) { - pr_err("%s: Invalid stream index:%d", __func__, stream_index); - return -EINVAL; - } - - kctl = snd_soc_card_get_kcontrol(soc_prtd->card, - DSP_BIT_WIDTH_MIXER_CTL); - if (kctl) { - kctl->get(kctl, &kctl_elem_value); - target_asm_bit_width = kctl_elem_value.value.integer.value[0]; - if (target_asm_bit_width > 0) { - pr_debug("%s enforce ASM bitwidth to %d from %d\n", - __func__, - target_asm_bit_width, - bits_per_sample); - bits_per_sample = target_asm_bit_width; - } - } else { - pr_info("%s: failed to get mixer ctl for %s.\n", - __func__, DSP_BIT_WIDTH_MIXER_CTL); - } - - if ((prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S24_LE) || - (prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S24_3LE)) - bits_per_sample = 24; - else if (prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S32_LE) - bits_per_sample = 32; - - if (prtd->compr_passthr != LEGACY_PCM) { - ret = q6asm_open_write_compressed(ac, prtd->codec, - prtd->compr_passthr); - if (ret < 0) { - pr_err("%s:ASM open write err[%d] for compr_type[%d]\n", - __func__, ret, prtd->compr_passthr); - return ret; - } - prtd->gapless_state.stream_opened[stream_index] = 1; - - ret = msm_pcm_routing_reg_phy_compr_stream( - soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_PLAYBACK, - prtd->compr_passthr); - if (ret) { - pr_err("%s: compr stream reg failed:%d\n", __func__, - ret); - return ret; - } - } else { - pr_debug("%s: stream_id %d bits_per_sample %d\n", - __func__, ac->stream_id, bits_per_sample); - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) - ret = q6asm_stream_open_write_v5(ac, - prtd->codec, bits_per_sample, - ac->stream_id, - prtd->gapless_state.use_dsp_gapless_mode); - else - ret = q6asm_stream_open_write_v4(ac, - prtd->codec, bits_per_sample, - ac->stream_id, - prtd->gapless_state.use_dsp_gapless_mode); - if (ret < 0) { - pr_err("%s:ASM open write err[%d] for compr type[%d]\n", - __func__, ret, prtd->compr_passthr); - return -ENOMEM; - } - prtd->gapless_state.stream_opened[stream_index] = 1; - - pr_debug("%s: BE id %d\n", __func__, soc_prtd->dai_link->id); - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_PLAYBACK); - if (ret) { - pr_err("%s: stream reg failed:%d\n", __func__, ret); - return ret; - } - } - - ret = msm_compr_set_volume(cstream, 0, 0); - if (ret < 0) - pr_err("%s : Set Volume failed : %d", __func__, ret); - - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s : Don't send cal and PP params for compress path", - __func__); - } else { - ret = q6asm_send_cal(ac); - if (ret < 0) - pr_debug("%s : Send cal failed : %d", __func__, ret); - - ret = q6asm_set_softpause(ac, &softpause); - if (ret < 0) - pr_err("%s: Send SoftPause Param failed ret=%d\n", - __func__, ret); - - ret = q6asm_set_softvolume(ac, &softvol); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - } - ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -EINVAL; - } - - runtime->fragments = prtd->codec_param.buffer.fragments; - runtime->fragment_size = prtd->codec_param.buffer.fragment_size; - pr_debug("allocate %d buffers each of size %d\n", - runtime->fragments, - runtime->fragment_size); - ret = q6asm_audio_client_buf_alloc_contiguous(dir, ac, - runtime->fragment_size, - runtime->fragments); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret); - return -ENOMEM; - } - - prtd->byte_offset = 0; - prtd->copied_total = 0; - prtd->app_pointer = 0; - prtd->bytes_received = 0; - prtd->bytes_sent = 0; - prtd->buffer = ac->port[dir].buf[0].data; - prtd->buffer_paddr = ac->port[dir].buf[0].phys; - prtd->buffer_size = runtime->fragments * runtime->fragment_size; - - /* Bit-0 of flags represent timestamp mode */ - if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) - prtd->ts_header_offset = sizeof(struct snd_codec_metadata); - else - prtd->ts_header_offset = 0; - - ret = msm_compr_send_media_format_block(cstream, ac->stream_id, false); - if (ret < 0) - pr_err("%s, failed to send media format block\n", __func__); - - return ret; -} - -static int msm_compr_configure_dsp_for_capture(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = cstream->private_data; - uint16_t bits_per_sample; - uint16_t sample_word_size; - int dir = OUT, ret = 0; - struct audio_client *ac = prtd->audio_client; - uint32_t stream_index; - uint32_t enc_cfg_id = ENC_CFG_ID_NONE; - bool compress_ts = false; - - switch (prtd->codec_param.codec.format) { - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - bits_per_sample = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - if (prtd->codec == FORMAT_BESPOKE) - enc_cfg_id = - prtd->codec_param.codec.options.generic.reserved[0]; - break; - } - - pr_debug("%s: stream_id %d bits_per_sample %d compr_passthr %d\n", - __func__, ac->stream_id, bits_per_sample, - prtd->compr_passthr); - - if (prtd->compr_passthr != LEGACY_PCM) { - ret = q6asm_open_read_compressed(prtd->audio_client, - prtd->codec, prtd->compr_passthr); - if (ret < 0) { - pr_err("%s:ASM open read err[%d] for compr_type[%d]\n", - __func__, ret, prtd->compr_passthr); - return ret; - } - - ret = msm_pcm_routing_reg_phy_compr_stream( - soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_CAPTURE, - prtd->compr_passthr); - if (ret) { - pr_err("%s: compr stream reg failed:%d\n", - __func__, ret); - return ret; - } - } else { - if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) - compress_ts = true; - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) - ret = q6asm_open_read_v5(prtd->audio_client, - prtd->codec, bits_per_sample, - compress_ts, enc_cfg_id); - else - ret = q6asm_open_read_v4(prtd->audio_client, - prtd->codec, bits_per_sample, - compress_ts, enc_cfg_id); - if (ret < 0) { - pr_err("%s: q6asm_open_read failed:%d\n", - __func__, ret); - return ret; - } - - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_CAPTURE); - if (ret) { - pr_err("%s: stream reg failed:%d\n", __func__, ret); - return ret; - } - } - - ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -EINVAL; - } - - stream_index = STREAM_ARRAY_INDEX(ac->stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || stream_index < 0) { - pr_err("%s: Invalid stream index:%d", __func__, stream_index); - return -EINVAL; - } - - runtime->fragments = prtd->codec_param.buffer.fragments; - runtime->fragment_size = prtd->codec_param.buffer.fragment_size; - pr_debug("%s: allocate %d buffers each of size %d\n", - __func__, runtime->fragments, - runtime->fragment_size); - ret = q6asm_audio_client_buf_alloc_contiguous(dir, ac, - runtime->fragment_size, - runtime->fragments); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret); - return -ENOMEM; - } - - prtd->byte_offset = 0; - prtd->received_total = 0; - prtd->app_pointer = 0; - prtd->bytes_copied = 0; - prtd->bytes_read = 0; - prtd->bytes_read_offset = 0; - prtd->buffer = ac->port[dir].buf[0].data; - prtd->buffer_paddr = ac->port[dir].buf[0].phys; - prtd->buffer_size = runtime->fragments * runtime->fragment_size; - - /* Bit-0 of flags represent timestamp mode */ - if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) - prtd->ts_header_offset = sizeof(struct snd_codec_metadata); - else - prtd->ts_header_offset = 0; - - pr_debug("%s: sample_rate = %d channels = %d bps = %d sample_word_size = %d\n", - __func__, prtd->sample_rate, prtd->num_channels, - bits_per_sample, sample_word_size); - if (prtd->codec == FORMAT_BESPOKE) { - /* - * For BESPOKE codec, encoder specific config params are - * included as part of generic. - */ - ret = q6asm_enc_cfg_blk_custom(prtd->audio_client, prtd->sample_rate, - prtd->num_channels, prtd->codec, - (void *)&prtd->codec_param.codec.options.generic); - } else if (prtd->compr_passthr == LEGACY_PCM) { - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) - ret = q6asm_enc_cfg_blk_pcm_format_support_v5( - prtd->audio_client, - prtd->sample_rate, prtd->num_channels, - bits_per_sample, sample_word_size, - ASM_LITTLE_ENDIAN, DEFAULT_QF); - else - ret = q6asm_enc_cfg_blk_pcm_format_support_v4( - prtd->audio_client, - prtd->sample_rate, prtd->num_channels, - bits_per_sample, sample_word_size, - ASM_LITTLE_ENDIAN, DEFAULT_QF); - } - - return ret; -} - -static int msm_compr_playback_open(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_audio *prtd = NULL; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - enum apr_subsys_state subsys_state; - - pr_debug("%s\n", __func__); - if (pdata->is_in_use[rtd->dai_link->id] == true) { - pr_err("%s: %s is already in use, err: %d\n", - __func__, rtd->dai_link->cpu_dai_name, -EBUSY); - return -EBUSY; - } - - subsys_state = apr_get_subsys_state(); - if (subsys_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - - prtd = kzalloc(sizeof(struct msm_compr_audio), GFP_KERNEL); - if (prtd == NULL) { - pr_err("Failed to allocate memory for msm_compr_audio\n"); - return -ENOMEM; - } - - runtime->private_data = NULL; - prtd->cstream = cstream; - pdata->cstream[rtd->dai_link->id] = cstream; - pdata->audio_effects[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_compr_audio_effects), GFP_KERNEL); - if (pdata->audio_effects[rtd->dai_link->id] == NULL) { - pr_err("%s: Could not allocate memory for effects\n", __func__); - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - return -ENOMEM; - } - pdata->dec_params[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_compr_dec_params), GFP_KERNEL); - if (pdata->dec_params[rtd->dai_link->id] == NULL) { - pr_err("%s: Could not allocate memory for dec params\n", - __func__); - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - return -ENOMEM; - } - prtd->codec = FORMAT_MP3; - prtd->bytes_received = 0; - prtd->bytes_sent = 0; - prtd->copied_total = 0; - prtd->byte_offset = 0; - prtd->sample_rate = 44100; - prtd->num_channels = 2; - prtd->drain_ready = 0; - prtd->last_buffer = 0; - prtd->first_buffer = 1; - prtd->partial_drain_delay = 0; - prtd->next_stream = 0; - memset(&prtd->gapless_state, 0, sizeof(struct msm_compr_gapless_state)); - /* - * Update the use_dsp_gapless_mode from gapless struture with the value - * part of platform data. - */ - prtd->gapless_state.use_dsp_gapless_mode = pdata->use_dsp_gapless_mode; - - pr_debug("%s: gapless mode %d", __func__, pdata->use_dsp_gapless_mode); - - spin_lock_init(&prtd->lock); - - atomic_set(&prtd->eos, 0); - atomic_set(&prtd->start, 0); - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 0); - atomic_set(&prtd->close, 0); - atomic_set(&prtd->wait_on_close, 0); - atomic_set(&prtd->error, 0); - - init_waitqueue_head(&prtd->eos_wait); - init_waitqueue_head(&prtd->drain_wait); - init_waitqueue_head(&prtd->close_wait); - init_waitqueue_head(&prtd->wait_for_stream_avail); - - runtime->private_data = prtd; - populate_codec_list(prtd); - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)compr_event_handler, prtd); - if (prtd->audio_client == NULL) { - pr_err("%s: Could not allocate memory for client\n", __func__); - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - kfree(pdata->dec_params[rtd->dai_link->id]); - pdata->dec_params[rtd->dai_link->id] = NULL; - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - runtime->private_data = NULL; - return -ENOMEM; - } - pr_debug("%s: session ID %d\n", __func__, prtd->audio_client->session); - prtd->audio_client->perf_mode = false; - prtd->session_id = prtd->audio_client->session; - msm_adsp_init_mixer_ctl_pp_event_queue(rtd); - pdata->is_in_use[rtd->dai_link->id] = true; - return 0; -} - -static int msm_compr_capture_open(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_audio *prtd; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - enum apr_subsys_state subsys_state; - - pr_debug("%s\n", __func__); - if (!pdata) { - pr_err("%s: pdata is NULL\n", __func__); - return -EINVAL; - } - - subsys_state = apr_get_subsys_state(); - if (subsys_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - prtd = kzalloc(sizeof(struct msm_compr_audio), GFP_KERNEL); - if (!prtd) { - pr_err("Failed to allocate memory for msm_compr_audio\n"); - return -ENOMEM; - } - - runtime->private_data = NULL; - prtd->cstream = cstream; - pdata->cstream[rtd->dai_link->id] = cstream; - - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)compr_event_handler, prtd); - if (!prtd->audio_client) { - pr_err("%s: Could not allocate memory for client\n", __func__); - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - return -ENOMEM; - } - pr_debug("%s: session ID %d\n", __func__, prtd->audio_client->session); - prtd->audio_client->perf_mode = false; - prtd->session_id = prtd->audio_client->session; - prtd->codec = FORMAT_LINEAR_PCM; - prtd->bytes_copied = 0; - prtd->bytes_read = 0; - prtd->bytes_read_offset = 0; - prtd->received_total = 0; - prtd->byte_offset = 0; - prtd->sample_rate = 48000; - prtd->num_channels = 2; - prtd->first_buffer = 0; - - spin_lock_init(&prtd->lock); - - atomic_set(&prtd->eos, 0); - atomic_set(&prtd->start, 0); - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 0); - atomic_set(&prtd->close, 0); - atomic_set(&prtd->wait_on_close, 0); - atomic_set(&prtd->error, 0); - - init_waitqueue_head(&prtd->eos_wait); - init_waitqueue_head(&prtd->drain_wait); - init_waitqueue_head(&prtd->close_wait); - init_waitqueue_head(&prtd->wait_for_stream_avail); - - runtime->private_data = prtd; - - return 0; -} - -static int msm_compr_open(struct snd_compr_stream *cstream) -{ - int ret = 0; - - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_playback_open(cstream); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_capture_open(cstream); - return ret; -} - -static int msm_compr_playback_free(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime; - struct msm_compr_audio *prtd; - struct snd_soc_pcm_runtime *soc_prtd; - struct msm_compr_pdata *pdata; - struct audio_client *ac; - int dir = IN, ret = 0, stream_id; - unsigned long flags; - uint32_t stream_index; - - pr_debug("%s\n", __func__); - - if (!cstream) { - pr_err("%s cstream is null\n", __func__); - return 0; - } - runtime = cstream->runtime; - soc_prtd = cstream->private_data; - if (!runtime || !soc_prtd || !(soc_prtd->platform)) { - pr_err("%s runtime or soc_prtd or platform is null\n", - __func__); - return 0; - } - prtd = runtime->private_data; - if (!prtd) { - pr_err("%s prtd is null\n", __func__); - return 0; - } - prtd->cmd_interrupt = 1; - wake_up(&prtd->drain_wait); - pdata = snd_soc_platform_get_drvdata(soc_prtd->platform); - ac = prtd->audio_client; - if (!pdata || !ac) { - pr_err("%s pdata or ac is null\n", __func__); - return 0; - } - if (atomic_read(&prtd->eos)) { - ret = wait_event_timeout(prtd->eos_wait, - prtd->eos_ack, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: CMD_EOS failed\n", __func__); - } - if (atomic_read(&prtd->close)) { - prtd->cmd_ack = 0; - atomic_set(&prtd->wait_on_close, 1); - ret = wait_event_timeout(prtd->close_wait, - prtd->cmd_ack, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: CMD_CLOSE failed\n", __func__); - } - - spin_lock_irqsave(&prtd->lock, flags); - stream_id = ac->stream_id; - stream_index = STREAM_ARRAY_INDEX(NEXT_STREAM_ID(stream_id)); - - if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0) && - (prtd->gapless_state.stream_opened[stream_index])) { - prtd->gapless_state.stream_opened[stream_index] = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - pr_debug(" close stream %d", NEXT_STREAM_ID(stream_id)); - q6asm_stream_cmd(ac, CMD_CLOSE, NEXT_STREAM_ID(stream_id)); - spin_lock_irqsave(&prtd->lock, flags); - } - - stream_index = STREAM_ARRAY_INDEX(stream_id); - if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0) && - (prtd->gapless_state.stream_opened[stream_index])) { - prtd->gapless_state.stream_opened[stream_index] = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - pr_debug("close stream %d", stream_id); - q6asm_stream_cmd(ac, CMD_CLOSE, stream_id); - spin_lock_irqsave(&prtd->lock, flags); - } - spin_unlock_irqrestore(&prtd->lock, flags); - - mutex_lock(&pdata->lock); - pdata->cstream[soc_prtd->dai_link->id] = NULL; - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_PLAYBACK); - } - - q6asm_audio_client_buf_free_contiguous(dir, ac); - - q6asm_audio_client_free(ac); - msm_adsp_clean_mixer_ctl_pp_event_queue(soc_prtd); - if (pdata->audio_effects[soc_prtd->dai_link->id] != NULL) { - kfree(pdata->audio_effects[soc_prtd->dai_link->id]); - pdata->audio_effects[soc_prtd->dai_link->id] = NULL; - } - if (pdata->dec_params[soc_prtd->dai_link->id] != NULL) { - kfree(pdata->dec_params[soc_prtd->dai_link->id]); - pdata->dec_params[soc_prtd->dai_link->id] = NULL; - } - pdata->is_in_use[soc_prtd->dai_link->id] = false; - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_compr_capture_free(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime; - struct msm_compr_audio *prtd; - struct snd_soc_pcm_runtime *soc_prtd; - struct msm_compr_pdata *pdata; - struct audio_client *ac; - int dir = OUT, stream_id; - unsigned long flags; - uint32_t stream_index; - - if (!cstream) { - pr_err("%s cstream is null\n", __func__); - return 0; - } - runtime = cstream->runtime; - soc_prtd = cstream->private_data; - if (!runtime || !soc_prtd || !(soc_prtd->platform)) { - pr_err("%s runtime or soc_prtd or platform is null\n", - __func__); - return 0; - } - - prtd = runtime->private_data; - if (!prtd) { - pr_err("%s prtd is null\n", __func__); - return 0; - } - pdata = snd_soc_platform_get_drvdata(soc_prtd->platform); - ac = prtd->audio_client; - if (!pdata || !ac) { - pr_err("%s pdata or ac is null\n", __func__); - return 0; - } - - spin_lock_irqsave(&prtd->lock, flags); - stream_id = ac->stream_id; - - stream_index = STREAM_ARRAY_INDEX(stream_id); - if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0)) { - spin_unlock_irqrestore(&prtd->lock, flags); - pr_debug("close stream %d", stream_id); - q6asm_stream_cmd(ac, CMD_CLOSE, stream_id); - spin_lock_irqsave(&prtd->lock, flags); - } - spin_unlock_irqrestore(&prtd->lock, flags); - - mutex_lock(&pdata->lock); - pdata->cstream[soc_prtd->dai_link->id] = NULL; - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - - q6asm_audio_client_buf_free_contiguous(dir, ac); - - q6asm_audio_client_free(ac); - - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_compr_free(struct snd_compr_stream *cstream) -{ - int ret = 0; - - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_playback_free(cstream); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_capture_free(cstream); - return ret; -} - -static bool msm_compr_validate_codec_compr(__u32 codec_id) -{ - int32_t i; - - for (i = 0; i < ARRAY_SIZE(compr_codecs); i++) { - if (compr_codecs[i] == codec_id) - return true; - } - return false; -} - -/* compress stream operations */ -static int msm_compr_set_params(struct snd_compr_stream *cstream, - struct snd_compr_params *params) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - int ret = 0, frame_sz = 0; - int i, num_rates; - bool is_format_gapless = false; - - pr_debug("%s\n", __func__); - - num_rates = sizeof(supported_sample_rates)/sizeof(unsigned int); - for (i = 0; i < num_rates; i++) - if (params->codec.sample_rate == supported_sample_rates[i]) - break; - if (i == num_rates) - return -EINVAL; - - memcpy(&prtd->codec_param, params, sizeof(struct snd_compr_params)); - /* ToDo: remove duplicates */ - prtd->num_channels = prtd->codec_param.codec.ch_in; - prtd->sample_rate = prtd->codec_param.codec.sample_rate; - pr_debug("%s: sample_rate %d\n", __func__, prtd->sample_rate); - - if ((prtd->codec_param.codec.compr_passthr >= LEGACY_PCM && - prtd->codec_param. - codec.compr_passthr <= COMPRESSED_PASSTHROUGH_DSD) || - (prtd->codec_param. - codec.compr_passthr == COMPRESSED_PASSTHROUGH_IEC61937)) - prtd->compr_passthr = prtd->codec_param.codec.compr_passthr; - else - prtd->compr_passthr = LEGACY_PCM; - pr_debug("%s: compr_passthr = %d", __func__, prtd->compr_passthr); - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: Reset gapless mode playback for compr_type[%d]\n", - __func__, prtd->compr_passthr); - prtd->gapless_state.use_dsp_gapless_mode = 0; - if (!msm_compr_validate_codec_compr(params->codec.id)) { - pr_err("%s codec not supported in passthrough,id =%d\n", - __func__, params->codec.id); - return -EINVAL; - } - } - - if (params->codec.flags & COMPRESSED_PERF_MODE_FLAG) { - pr_debug("%s: setting perf mode = %d", __func__, LOW_LATENCY_PCM_MODE); - prtd->audio_client->perf_mode = LOW_LATENCY_PCM_MODE; - } - - switch (params->codec.id) { - case SND_AUDIOCODEC_PCM: { - pr_debug("SND_AUDIOCODEC_PCM\n"); - prtd->codec = FORMAT_LINEAR_PCM; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_MP3: { - pr_debug("SND_AUDIOCODEC_MP3\n"); - prtd->codec = FORMAT_MP3; - frame_sz = MP3_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_AAC: { - pr_debug("SND_AUDIOCODEC_AAC\n"); - prtd->codec = FORMAT_MPEG4_AAC; - frame_sz = AAC_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_AC3: { - pr_debug("SND_AUDIOCODEC_AC3\n"); - prtd->codec = FORMAT_AC3; - frame_sz = AC3_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_EAC3: { - pr_debug("SND_AUDIOCODEC_EAC3\n"); - prtd->codec = FORMAT_EAC3; - frame_sz = EAC3_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_MP2: { - pr_debug("SND_AUDIOCODEC_MP2\n"); - prtd->codec = FORMAT_MP2; - break; - } - - case SND_AUDIOCODEC_WMA: { - pr_debug("SND_AUDIOCODEC_WMA\n"); - prtd->codec = FORMAT_WMA_V9; - break; - } - - case SND_AUDIOCODEC_WMA_PRO: { - pr_debug("SND_AUDIOCODEC_WMA_PRO\n"); - prtd->codec = FORMAT_WMA_V10PRO; - break; - } - - case SND_AUDIOCODEC_FLAC: { - pr_debug("%s: SND_AUDIOCODEC_FLAC\n", __func__); - prtd->codec = FORMAT_FLAC; - /* - * DSP bufferring is based on blk size, - * consider mininum buffering to rule out any false wait - */ - frame_sz = - prtd->codec_param.codec.options.flac_dec.min_blk_size; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_VORBIS: { - pr_debug("%s: SND_AUDIOCODEC_VORBIS\n", __func__); - prtd->codec = FORMAT_VORBIS; - break; - } - - case SND_AUDIOCODEC_ALAC: { - pr_debug("%s: SND_AUDIOCODEC_ALAC\n", __func__); - prtd->codec = FORMAT_ALAC; - break; - } - - case SND_AUDIOCODEC_APE: { - pr_debug("%s: SND_AUDIOCODEC_APE\n", __func__); - prtd->codec = FORMAT_APE; - break; - } - - case SND_AUDIOCODEC_DTS: { - pr_debug("%s: SND_AUDIOCODEC_DTS\n", __func__); - prtd->codec = FORMAT_DTS; - break; - } - - case SND_AUDIOCODEC_DSD: { - pr_debug("%s: SND_AUDIOCODEC_DSD\n", __func__); - prtd->codec = FORMAT_DSD; - break; - } - - case SND_AUDIOCODEC_TRUEHD: { - pr_debug("%s: SND_AUDIOCODEC_TRUEHD\n", __func__); - prtd->codec = FORMAT_TRUEHD; - break; - } - - case SND_AUDIOCODEC_IEC61937: { - pr_debug("%s: SND_AUDIOCODEC_IEC61937\n", __func__); - prtd->codec = FORMAT_IEC61937; - break; - } - - case SND_AUDIOCODEC_APTX: { - pr_debug("%s: SND_AUDIOCODEC_APTX\n", __func__); - prtd->codec = FORMAT_APTX; - break; - } - - case SND_AUDIOCODEC_BESPOKE: { - pr_debug("%s: SND_AUDIOCODEC_BESPOKE\n", __func__); - prtd->codec = FORMAT_BESPOKE; - break; - } - - case SND_AUDIOCODEC_AMR: { - pr_debug("%s:SND_AUDIOCODEC_AMR\n", __func__); - prtd->codec = FORMAT_AMRNB; - break; - } - - case SND_AUDIOCODEC_AMRWB: { - pr_debug("%s:SND_AUDIOCODEC_AMRWB\n", __func__); - prtd->codec = FORMAT_AMRWB; - break; - } - - case SND_AUDIOCODEC_AMRWBPLUS: { - pr_debug("%s:SND_AUDIOCODEC_AMRWBPLUS\n", __func__); - prtd->codec = FORMAT_AMR_WB_PLUS; - break; - } - - default: - pr_err("codec not supported, id =%d\n", params->codec.id); - return -EINVAL; - } - - if (!is_format_gapless) - prtd->gapless_state.use_dsp_gapless_mode = false; - - prtd->partial_drain_delay = - msm_compr_get_partial_drain_delay(frame_sz, prtd->sample_rate); - - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_configure_dsp_for_playback(cstream); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_configure_dsp_for_capture(cstream); - - return ret; -} - -static int msm_compr_drain_buffer(struct msm_compr_audio *prtd, - unsigned long *flags) -{ - int rc = 0; - - atomic_set(&prtd->drain, 1); - prtd->drain_ready = 0; - spin_unlock_irqrestore(&prtd->lock, *flags); - pr_debug("%s: wait for buffer to be drained\n", __func__); - rc = wait_event_interruptible(prtd->drain_wait, - prtd->drain_ready || - prtd->cmd_interrupt || - atomic_read(&prtd->xrun) || - atomic_read(&prtd->error)); - pr_debug("%s: out of buffer drain wait with ret %d\n", __func__, rc); - spin_lock_irqsave(&prtd->lock, *flags); - if (prtd->cmd_interrupt) { - pr_debug("%s: buffer drain interrupted by flush)\n", __func__); - rc = -EINTR; - prtd->cmd_interrupt = 0; - } - if (atomic_read(&prtd->error)) { - pr_err("%s: Got RESET EVENTS notification, return\n", - __func__); - rc = -ENETRESET; - } - return rc; -} - -static int msm_compr_wait_for_stream_avail(struct msm_compr_audio *prtd, - unsigned long *flags) -{ - int rc = 0; - - pr_debug("next session is already in opened state\n"); - prtd->next_stream = 1; - prtd->cmd_interrupt = 0; - spin_unlock_irqrestore(&prtd->lock, *flags); - /* - * Wait for stream to be available, or the wait to be interrupted by - * commands like flush or till a timeout of one second. - */ - rc = wait_event_timeout(prtd->wait_for_stream_avail, - prtd->stream_available || prtd->cmd_interrupt, 1 * HZ); - pr_err("%s:prtd->stream_available %d, prtd->cmd_interrupt %d rc %d\n", - __func__, prtd->stream_available, prtd->cmd_interrupt, rc); - - spin_lock_irqsave(&prtd->lock, *flags); - if (rc == 0) { - pr_err("%s: wait_for_stream_avail timed out\n", - __func__); - rc = -ETIMEDOUT; - } else if (prtd->cmd_interrupt == 1) { - /* - * This scenario might not happen as we do not allow - * flush in transition state. - */ - pr_debug("%s: wait_for_stream_avail interrupted\n", __func__); - prtd->cmd_interrupt = 0; - prtd->stream_available = 0; - rc = -EINTR; - } else { - prtd->stream_available = 0; - rc = 0; - } - pr_debug("%s : rc = %d", __func__, rc); - return rc; -} - -static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - uint32_t *volume = NULL; - struct audio_client *ac = prtd->audio_client; - unsigned long fe_id = rtd->dai_link->id; - int rc = 0; - int bytes_to_write; - unsigned long flags; - int stream_id; - uint32_t stream_index; - uint16_t bits_per_sample = 16; - - if (!pdata) { - pr_err("%s: pdata is NULL\n", __func__); - return -EINVAL; - } - volume = pdata->volume[rtd->dai_link->id]; - - spin_lock_irqsave(&prtd->lock, flags); - if (atomic_read(&prtd->error)) { - pr_err("%s Got RESET EVENTS notification, return immediately", - __func__); - spin_unlock_irqrestore(&prtd->lock, flags); - return 0; - } - spin_unlock_irqrestore(&prtd->lock, flags); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - pr_debug("%s: SNDRV_PCM_TRIGGER_START\n", __func__); - atomic_set(&prtd->start, 1); - - /* - * compr_set_volume and compr_init_pp_params - * are used to configure ASM volume hence not - * needed for compress passthrough playback. - * - * compress passthrough volume is controlled in - * ADM by adm_send_compressed_device_mute() - */ - if (prtd->compr_passthr == LEGACY_PCM && - cstream->direction == SND_COMPRESS_PLAYBACK) { - /* set volume for the stream before RUN */ - rc = msm_compr_set_volume(cstream, - volume[0], volume[1]); - if (rc) - pr_err("%s : Set Volume failed : %d\n", - __func__, rc); - - rc = msm_compr_init_pp_params(cstream, ac); - if (rc) - pr_err("%s : init PP params failed : %d\n", - __func__, rc); - } else { - msm_compr_read_buffer(prtd); - } - /* issue RUN command for the stream */ - q6asm_run_nowait(prtd->audio_client, prtd->run_mode, - prtd->start_delay_msw, prtd->start_delay_lsw); - break; - case SNDRV_PCM_TRIGGER_STOP: - spin_lock_irqsave(&prtd->lock, flags); - pr_debug("%s: SNDRV_PCM_TRIGGER_STOP transition %d\n", __func__, - prtd->gapless_state.gapless_transition); - stream_id = ac->stream_id; - atomic_set(&prtd->start, 0); - if (cstream->direction == SND_COMPRESS_CAPTURE) { - q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->xrun, 0); - prtd->received_total = 0; - prtd->bytes_copied = 0; - prtd->bytes_read = 0; - prtd->bytes_read_offset = 0; - prtd->byte_offset = 0; - prtd->app_pointer = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - if (prtd->next_stream) { - pr_debug("%s: interrupt next track wait queues\n", - __func__); - prtd->cmd_interrupt = 1; - wake_up(&prtd->wait_for_stream_avail); - prtd->next_stream = 0; - } - if (atomic_read(&prtd->eos)) { - pr_debug("%s: interrupt eos wait queues", __func__); - /* - * Gapless playback does not wait for eos, do not set - * cmd_int and do not wake up eos_wait during gapless - * transition - */ - if (!prtd->gapless_state.gapless_transition) { - prtd->cmd_interrupt = 1; - wake_up(&prtd->eos_wait); - } - atomic_set(&prtd->eos, 0); - } - if (atomic_read(&prtd->drain)) { - pr_debug("%s: interrupt drain wait queues", __func__); - prtd->cmd_interrupt = 1; - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - atomic_set(&prtd->drain, 0); - } - prtd->last_buffer = 0; - prtd->cmd_ack = 0; - if (!prtd->gapless_state.gapless_transition) { - pr_debug("issue CMD_FLUSH stream_id %d\n", stream_id); - spin_unlock_irqrestore(&prtd->lock, flags); - q6asm_stream_cmd( - prtd->audio_client, CMD_FLUSH, stream_id); - spin_lock_irqsave(&prtd->lock, flags); - } else { - prtd->first_buffer = 0; - } - /* FIXME. only reset if flush was successful */ - prtd->byte_offset = 0; - prtd->copied_total = 0; - prtd->app_pointer = 0; - prtd->bytes_received = 0; - prtd->bytes_sent = 0; - prtd->marker_timestamp = 0; - - atomic_set(&prtd->xrun, 0); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE_PUSH transition %d\n", - prtd->gapless_state.gapless_transition); - if (!prtd->gapless_state.gapless_transition) { - pr_debug("issue CMD_PAUSE stream_id %d\n", - ac->stream_id); - q6asm_stream_cmd_nowait(ac, CMD_PAUSE, ac->stream_id); - atomic_set(&prtd->start, 0); - } - break; - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE_RELEASE transition %d\n", - prtd->gapless_state.gapless_transition); - if (!prtd->gapless_state.gapless_transition) { - atomic_set(&prtd->start, 1); - q6asm_run_nowait(prtd->audio_client, prtd->run_mode, - 0, 0); - } - break; - case SND_COMPR_TRIGGER_PARTIAL_DRAIN: - pr_debug("%s: SND_COMPR_TRIGGER_PARTIAL_DRAIN\n", __func__); - if (!prtd->gapless_state.use_dsp_gapless_mode) { - pr_debug("%s: set partial drain as drain\n", __func__); - cmd = SND_COMPR_TRIGGER_DRAIN; - } - case SND_COMPR_TRIGGER_DRAIN: - pr_debug("%s: SNDRV_COMPRESS_DRAIN\n", __func__); - /* Make sure all the data is sent to DSP before sending EOS */ - spin_lock_irqsave(&prtd->lock, flags); - - if (!atomic_read(&prtd->start)) { - pr_err("%s: stream is not in started state\n", - __func__); - rc = -EPERM; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - if (prtd->bytes_received > prtd->copied_total) { - pr_debug("%s: wait till all the data is sent to dsp\n", - __func__); - rc = msm_compr_drain_buffer(prtd, &flags); - if (rc || !atomic_read(&prtd->start)) { - if (rc != -ENETRESET) - rc = -EINTR; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - /* - * FIXME: Bug. - * Write(32767) - * Start - * Drain <- Indefinite wait - * sol1 : if (prtd->copied_total) then wait? - * sol2 : (prtd->cmd_interrupt || prtd->drain_ready || - * atomic_read(xrun) - */ - bytes_to_write = prtd->bytes_received - - prtd->copied_total; - WARN(bytes_to_write > runtime->fragment_size, - "last write %d cannot be > than fragment_size", - bytes_to_write); - - if (bytes_to_write > 0) { - pr_debug("%s: send %d partial bytes at the end", - __func__, bytes_to_write); - atomic_set(&prtd->xrun, 0); - prtd->last_buffer = 1; - msm_compr_send_buffer(prtd); - } - } - - if ((cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN) && - (prtd->gapless_state.set_next_stream_id)) { - /* wait for the last buffer to be returned */ - - if (prtd->last_buffer) { - pr_debug("%s: last buffer drain\n", __func__); - rc = msm_compr_drain_buffer(prtd, &flags); - if (rc || !atomic_read(&prtd->start)) { - spin_unlock_irqrestore(&prtd->lock, - flags); - break; - } - } - /* send EOS */ - prtd->eos_ack = 0; - atomic_set(&prtd->eos, 1); - pr_debug("issue CMD_EOS stream_id %d\n", ac->stream_id); - q6asm_stream_cmd_nowait(ac, CMD_EOS, ac->stream_id); - pr_info("PARTIAL DRAIN, do not wait for EOS ack\n"); - - /* send a zero length buffer */ - atomic_set(&prtd->xrun, 0); - msm_compr_send_buffer(prtd); - - /* wait for the zero length buffer to be returned */ - pr_debug("%s: zero length buffer drain\n", __func__); - rc = msm_compr_drain_buffer(prtd, &flags); - if (rc || !atomic_read(&prtd->start)) { - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - /* sleep for additional duration partial drain */ - atomic_set(&prtd->drain, 1); - prtd->drain_ready = 0; - pr_debug("%s, additional sleep: %d\n", __func__, - prtd->partial_drain_delay); - spin_unlock_irqrestore(&prtd->lock, flags); - rc = wait_event_timeout(prtd->drain_wait, - prtd->drain_ready || prtd->cmd_interrupt, - msecs_to_jiffies(prtd->partial_drain_delay)); - pr_debug("%s: out of additional wait for low sample rate\n", - __func__); - spin_lock_irqsave(&prtd->lock, flags); - if (prtd->cmd_interrupt) { - pr_debug("%s: additional wait interrupted by flush)\n", - __func__); - rc = -EINTR; - prtd->cmd_interrupt = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - /* move to next stream and reset vars */ - pr_debug("%s: Moving to next stream in gapless\n", - __func__); - ac->stream_id = NEXT_STREAM_ID(ac->stream_id); - prtd->byte_offset = 0; - prtd->app_pointer = 0; - prtd->first_buffer = 1; - prtd->last_buffer = 0; - /* - * Set gapless transition flag only if EOS hasn't been - * acknowledged already. - */ - if (atomic_read(&prtd->eos)) - prtd->gapless_state.gapless_transition = 1; - prtd->marker_timestamp = 0; - - /* - * Don't reset these as these vars map to - * total_bytes_transferred and total_bytes_available - * directly, only total_bytes_transferred will be - * updated in the next avail() ioctl - * prtd->copied_total = 0; - * prtd->bytes_received = 0; - */ - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 1); - pr_debug("%s: issue CMD_RUN", __func__); - q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - /* - * moving to next stream failed, so reset the gapless state - * set next stream id for the same session so that the same - * stream can be used for gapless playback - */ - prtd->gapless_state.set_next_stream_id = false; - prtd->gapless_state.gapless_transition = 0; - pr_debug("%s:CMD_EOS stream_id %d\n", __func__, ac->stream_id); - - prtd->eos_ack = 0; - atomic_set(&prtd->eos, 1); - q6asm_stream_cmd_nowait(ac, CMD_EOS, ac->stream_id); - - spin_unlock_irqrestore(&prtd->lock, flags); - - - /* Wait indefinitely for DRAIN. Flush can also signal this*/ - rc = wait_event_interruptible(prtd->eos_wait, - (prtd->eos_ack || - prtd->cmd_interrupt || - atomic_read(&prtd->error))); - - if (rc < 0) - pr_err("%s: EOS wait failed\n", __func__); - - pr_debug("%s: SNDRV_COMPRESS_DRAIN out of wait for EOS\n", - __func__); - - if (prtd->cmd_interrupt) - rc = -EINTR; - - if (atomic_read(&prtd->error)) { - pr_err("%s: Got RESET EVENTS notification, return\n", - __func__); - rc = -ENETRESET; - } - - /*FIXME : what if a flush comes while PC is here */ - if (rc == 0) { - /* - * Failed to open second stream in DSP for gapless - * so prepare the current stream in session - * for gapless playback - */ - spin_lock_irqsave(&prtd->lock, flags); - pr_debug("%s:issue CMD_PAUSE stream_id %d", - __func__, ac->stream_id); - q6asm_stream_cmd_nowait(ac, CMD_PAUSE, ac->stream_id); - prtd->cmd_ack = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - - /* - * Cache this time as last known time - */ - if (pdata->use_legacy_api) - q6asm_get_session_time_legacy( - prtd->audio_client, - &prtd->marker_timestamp); - else - q6asm_get_session_time(prtd->audio_client, - &prtd->marker_timestamp); - - spin_lock_irqsave(&prtd->lock, flags); - /* - * Don't reset these as these vars map to - * total_bytes_transferred and total_bytes_available. - * Just total_bytes_transferred will be updated - * in the next avail() ioctl. - * prtd->copied_total = 0; - * prtd->bytes_received = 0; - * do not reset prtd->bytes_sent as well as the same - * session is used for gapless playback - */ - prtd->byte_offset = 0; - - prtd->app_pointer = 0; - prtd->first_buffer = 1; - prtd->last_buffer = 0; - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 1); - spin_unlock_irqrestore(&prtd->lock, flags); - - pr_debug("%s:issue CMD_FLUSH ac->stream_id %d", - __func__, ac->stream_id); - q6asm_stream_cmd(ac, CMD_FLUSH, ac->stream_id); - - q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - } - prtd->cmd_interrupt = 0; - break; - case SND_COMPR_TRIGGER_NEXT_TRACK: - if (!prtd->gapless_state.use_dsp_gapless_mode) { - pr_debug("%s: ignore trigger next track\n", __func__); - rc = 0; - break; - } - pr_debug("%s: SND_COMPR_TRIGGER_NEXT_TRACK\n", __func__); - spin_lock_irqsave(&prtd->lock, flags); - rc = 0; - /* next stream in gapless */ - stream_id = NEXT_STREAM_ID(ac->stream_id); - /* - * Wait if stream 1 has not completed before honoring next - * track for stream 3. Scenario happens if second clip is - * small and fills in one buffer so next track will be - * called immediately. - */ - stream_index = STREAM_ARRAY_INDEX(stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || - stream_index < 0) { - pr_err("%s: Invalid stream index: %d", __func__, - stream_index); - spin_unlock_irqrestore(&prtd->lock, flags); - rc = -EINVAL; - break; - } - - if (prtd->gapless_state.stream_opened[stream_index]) { - if (prtd->gapless_state.gapless_transition) { - rc = msm_compr_wait_for_stream_avail(prtd, - &flags); - } else { - /* - * If session is already opened break out if - * the state is not gapless transition. This - * is when seek happens after the last buffer - * is sent to the driver. Next track would be - * called again after last buffer is sent. - */ - pr_debug("next session is in opened state\n"); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - } - spin_unlock_irqrestore(&prtd->lock, flags); - if (rc < 0) { - /* - * if return type EINTR then reset to zero. Tiny - * compress treats EINTR as error and prevents PARTIAL - * DRAIN. EINTR is not an error. wait for stream avail - * is interrupted by some other command like FLUSH. - */ - if (rc == -EINTR) { - pr_debug("%s: EINTR reset rc to 0\n", __func__); - rc = 0; - } - break; - } - - if (prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S24_LE) - bits_per_sample = 24; - else if (prtd->codec_param.codec.format == - SNDRV_PCM_FORMAT_S32_LE) - bits_per_sample = 32; - - pr_debug("%s: open_write stream_id %d bits_per_sample %d", - __func__, stream_id, bits_per_sample); - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) - rc = q6asm_stream_open_write_v5(prtd->audio_client, - prtd->codec, bits_per_sample, - stream_id, - prtd->gapless_state.use_dsp_gapless_mode); - else - rc = q6asm_stream_open_write_v4(prtd->audio_client, - prtd->codec, bits_per_sample, - stream_id, - prtd->gapless_state.use_dsp_gapless_mode); - if (rc < 0) { - pr_err("%s: Session out open failed for gapless [%d]\n", - __func__, rc); - break; - } - - spin_lock_irqsave(&prtd->lock, flags); - prtd->gapless_state.stream_opened[stream_index] = 1; - prtd->gapless_state.set_next_stream_id = true; - spin_unlock_irqrestore(&prtd->lock, flags); - - rc = msm_compr_send_media_format_block(cstream, - stream_id, false); - if (rc < 0) { - pr_err("%s, failed to send media format block\n", - __func__); - break; - } - msm_compr_send_dec_params(cstream, pdata->dec_params[fe_id], - stream_id); - break; - } - - return rc; -} - -static int msm_compr_pointer(struct snd_compr_stream *cstream, - struct snd_compr_tstamp *arg) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_audio *prtd = runtime->private_data; - struct msm_compr_pdata *pdata = NULL; - struct snd_compr_tstamp tstamp; - uint64_t timestamp = 0; - int rc = 0, first_buffer; - unsigned long flags; - uint32_t gapless_transition; - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pr_debug("%s\n", __func__); - memset(&tstamp, 0x0, sizeof(struct snd_compr_tstamp)); - - spin_lock_irqsave(&prtd->lock, flags); - tstamp.sampling_rate = prtd->sample_rate; - tstamp.byte_offset = prtd->byte_offset; - if (cstream->direction == SND_COMPRESS_PLAYBACK) - tstamp.copied_total = prtd->copied_total; - else if (cstream->direction == SND_COMPRESS_CAPTURE) - tstamp.copied_total = prtd->received_total; - first_buffer = prtd->first_buffer; - if (atomic_read(&prtd->error)) { - pr_err_ratelimited("%s Got RESET EVENTS notification, return error\n", - __func__); - if (cstream->direction == SND_COMPRESS_PLAYBACK) - runtime->total_bytes_transferred = tstamp.copied_total; - else - runtime->total_bytes_available = tstamp.copied_total; - tstamp.pcm_io_frames = 0; - memcpy(arg, &tstamp, sizeof(struct snd_compr_tstamp)); - spin_unlock_irqrestore(&prtd->lock, flags); - return -ENETRESET; - } - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - - gapless_transition = prtd->gapless_state.gapless_transition; - spin_unlock_irqrestore(&prtd->lock, flags); - if (gapless_transition) - pr_debug("%s session time in gapless transition", - __func__); - /* - *- Do not query if no buffer has been given. - *- Do not query on a gapless transition. - * Playback for the 2nd stream can start (thus returning time - * starting from 0) before the driver knows about EOS of first - * stream. - */ - if (!first_buffer || gapless_transition) { - - if (pdata->use_legacy_api) - rc = q6asm_get_session_time_legacy( - prtd->audio_client, &prtd->marker_timestamp); - else - rc = q6asm_get_session_time( - prtd->audio_client, &prtd->marker_timestamp); - if (rc < 0) { - if (atomic_read(&prtd->error)) - return -ENETRESET; - else - return rc; - } - } - } else { - spin_unlock_irqrestore(&prtd->lock, flags); - } - timestamp = prtd->marker_timestamp; - - /* DSP returns timestamp in usec */ - pr_debug("%s: timestamp = %lld usec\n", __func__, timestamp); - timestamp *= prtd->sample_rate; - tstamp.pcm_io_frames = (snd_pcm_uframes_t)div64_u64(timestamp, 1000000); - memcpy(arg, &tstamp, sizeof(struct snd_compr_tstamp)); - - return 0; -} - -static int msm_compr_ack(struct snd_compr_stream *cstream, - size_t count) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - void *src, *dstn; - size_t copy; - unsigned long flags; - - WARN(1, "This path is untested"); - return -EINVAL; - - pr_debug("%s: count = %zd\n", __func__, count); - if (!prtd->buffer) { - pr_err("%s: Buffer is not allocated yet ??\n", __func__); - return -EINVAL; - } - src = runtime->buffer + prtd->app_pointer; - dstn = prtd->buffer + prtd->app_pointer; - if (count < prtd->buffer_size - prtd->app_pointer) { - memcpy(dstn, src, count); - prtd->app_pointer += count; - } else { - copy = prtd->buffer_size - prtd->app_pointer; - memcpy(dstn, src, copy); - memcpy(prtd->buffer, runtime->buffer, count - copy); - prtd->app_pointer = count - copy; - } - - /* - * If the stream is started and all the bytes received were - * copied to DSP, the newly received bytes should be - * sent right away - */ - spin_lock_irqsave(&prtd->lock, flags); - - if (atomic_read(&prtd->start) && - prtd->bytes_received == prtd->copied_total) { - prtd->bytes_received += count; - msm_compr_send_buffer(prtd); - } else - prtd->bytes_received += count; - - spin_unlock_irqrestore(&prtd->lock, flags); - - return 0; -} - -static int msm_compr_playback_copy(struct snd_compr_stream *cstream, - char __user *buf, size_t count) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - void *dstn; - size_t copy; - uint64_t bytes_available = 0; - unsigned long flags; - - pr_debug("%s: count = %zd\n", __func__, count); - if (!prtd->buffer) { - pr_err("%s: Buffer is not allocated yet ??", __func__); - return 0; - } - - spin_lock_irqsave(&prtd->lock, flags); - if (atomic_read(&prtd->error)) { - pr_err("%s Got RESET EVENTS notification", __func__); - spin_unlock_irqrestore(&prtd->lock, flags); - return -ENETRESET; - } - spin_unlock_irqrestore(&prtd->lock, flags); - - dstn = prtd->buffer + prtd->app_pointer; - if (count < prtd->buffer_size - prtd->app_pointer) { - if (copy_from_user(dstn, buf, count)) - return -EFAULT; - prtd->app_pointer += count; - } else { - copy = prtd->buffer_size - prtd->app_pointer; - if (copy_from_user(dstn, buf, copy)) - return -EFAULT; - if (copy_from_user(prtd->buffer, buf + copy, count - copy)) - return -EFAULT; - prtd->app_pointer = count - copy; - } - - /* - * If stream is started and there has been an xrun, - * since the available bytes fits fragment_size, copy the data - * right away. - */ - spin_lock_irqsave(&prtd->lock, flags); - prtd->bytes_received += count; - if (atomic_read(&prtd->start)) { - if (atomic_read(&prtd->xrun)) { - pr_debug("%s: in xrun, count = %zd\n", __func__, count); - bytes_available = prtd->bytes_received - - prtd->copied_total; - if (bytes_available >= runtime->fragment_size) { - pr_debug("%s: handle xrun, bytes_to_write = %llu\n", - __func__, bytes_available); - atomic_set(&prtd->xrun, 0); - msm_compr_send_buffer(prtd); - } /* else not sufficient data */ - } /* writes will continue on the next write_done */ - } - - spin_unlock_irqrestore(&prtd->lock, flags); - - return count; -} - -static int msm_compr_capture_copy(struct snd_compr_stream *cstream, - char __user *buf, size_t count) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - void *source; - unsigned long flags; - - pr_debug("%s: count = %zd\n", __func__, count); - if (!prtd->buffer) { - pr_err("%s: Buffer is not allocated yet ??", __func__); - return 0; - } - - spin_lock_irqsave(&prtd->lock, flags); - if (atomic_read(&prtd->error)) { - pr_err("%s Got RESET EVENTS notification", __func__); - spin_unlock_irqrestore(&prtd->lock, flags); - return -ENETRESET; - } - - source = prtd->buffer + prtd->app_pointer; - /* check if we have requested amount of data to copy to user*/ - if (count <= prtd->received_total - prtd->bytes_copied) { - spin_unlock_irqrestore(&prtd->lock, flags); - if (copy_to_user(buf, source, count)) { - pr_err("copy_to_user failed"); - return -EFAULT; - } - spin_lock_irqsave(&prtd->lock, flags); - prtd->app_pointer += count; - if (prtd->app_pointer >= prtd->buffer_size) - prtd->app_pointer -= prtd->buffer_size; - prtd->bytes_copied += count; - } - msm_compr_read_buffer(prtd); - - spin_unlock_irqrestore(&prtd->lock, flags); - return count; -} - -static int msm_compr_copy(struct snd_compr_stream *cstream, - char __user *buf, size_t count) -{ - int ret = 0; - - pr_debug(" In %s\n", __func__); - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_playback_copy(cstream, buf, count); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_capture_copy(cstream, buf, count); - return ret; -} - -static int msm_compr_get_caps(struct snd_compr_stream *cstream, - struct snd_compr_caps *arg) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - int ret = 0; - - pr_debug("%s\n", __func__); - if ((arg != NULL) && (prtd != NULL)) { - memcpy(arg, &prtd->compr_cap, sizeof(struct snd_compr_caps)); - } else { - ret = -EINVAL; - pr_err("%s: arg (0x%pK), prtd (0x%pK)\n", __func__, arg, prtd); - } - - return ret; -} - -static int msm_compr_get_codec_caps(struct snd_compr_stream *cstream, - struct snd_compr_codec_caps *codec) -{ - pr_debug("%s\n", __func__); - - switch (codec->codec) { - case SND_AUDIOCODEC_MP3: - codec->num_descriptors = 2; - codec->descriptor[0].max_ch = 2; - memcpy(codec->descriptor[0].sample_rates, - supported_sample_rates, - sizeof(supported_sample_rates)); - codec->descriptor[0].num_sample_rates = - sizeof(supported_sample_rates)/sizeof(unsigned int); - codec->descriptor[0].bit_rate[0] = 320; /* 320kbps */ - codec->descriptor[0].bit_rate[1] = 128; - codec->descriptor[0].num_bitrates = 2; - codec->descriptor[0].profiles = 0; - codec->descriptor[0].modes = SND_AUDIOCHANMODE_MP3_STEREO; - codec->descriptor[0].formats = 0; - break; - case SND_AUDIOCODEC_AAC: - codec->num_descriptors = 2; - codec->descriptor[1].max_ch = 2; - memcpy(codec->descriptor[1].sample_rates, - supported_sample_rates, - sizeof(supported_sample_rates)); - codec->descriptor[1].num_sample_rates = - sizeof(supported_sample_rates)/sizeof(unsigned int); - codec->descriptor[1].bit_rate[0] = 320; /* 320kbps */ - codec->descriptor[1].bit_rate[1] = 128; - codec->descriptor[1].num_bitrates = 2; - codec->descriptor[1].profiles = 0; - codec->descriptor[1].modes = 0; - codec->descriptor[1].formats = - (SND_AUDIOSTREAMFORMAT_MP4ADTS | - SND_AUDIOSTREAMFORMAT_RAW); - break; - case SND_AUDIOCODEC_AC3: - case SND_AUDIOCODEC_EAC3: - case SND_AUDIOCODEC_FLAC: - case SND_AUDIOCODEC_VORBIS: - case SND_AUDIOCODEC_ALAC: - case SND_AUDIOCODEC_APE: - case SND_AUDIOCODEC_DTS: - case SND_AUDIOCODEC_DSD: - case SND_AUDIOCODEC_TRUEHD: - case SND_AUDIOCODEC_IEC61937: - case SND_AUDIOCODEC_APTX: - break; - default: - pr_err("%s: Unsupported audio codec %d\n", - __func__, codec->codec); - return -EINVAL; - } - - return 0; -} - -static int msm_compr_set_metadata(struct snd_compr_stream *cstream, - struct snd_compr_metadata *metadata) -{ - struct msm_compr_audio *prtd; - struct audio_client *ac; - pr_debug("%s\n", __func__); - - if (!metadata || !cstream) - return -EINVAL; - - prtd = cstream->runtime->private_data; - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return -EINVAL; - } - - if (((metadata->key == SNDRV_COMPRESS_ENCODER_PADDING) || - (metadata->key == SNDRV_COMPRESS_ENCODER_DELAY)) && - (prtd->compr_passthr != LEGACY_PCM)) { - pr_debug("%s: No trailing silence for compress_type[%d]\n", - __func__, prtd->compr_passthr); - return 0; - } - - ac = prtd->audio_client; - if (metadata->key == SNDRV_COMPRESS_ENCODER_PADDING) { - pr_debug("%s, got encoder padding %u", - __func__, metadata->value[0]); - prtd->gapless_state.trailing_samples_drop = metadata->value[0]; - } else if (metadata->key == SNDRV_COMPRESS_ENCODER_DELAY) { - pr_debug("%s, got encoder delay %u", - __func__, metadata->value[0]); - prtd->gapless_state.initial_samples_drop = metadata->value[0]; - } else if (metadata->key == SNDRV_COMPRESS_RENDER_MODE) { - return msm_compr_set_render_mode(prtd, metadata->value[0]); - } else if (metadata->key == SNDRV_COMPRESS_CLK_REC_MODE) { - return msm_compr_set_clk_rec_mode(ac, metadata->value[0]); - } else if (metadata->key == SNDRV_COMPRESS_RENDER_WINDOW) { - return msm_compr_set_render_window( - ac, - metadata->value[0], - metadata->value[1], - metadata->value[2], - metadata->value[3]); - } else if (metadata->key == SNDRV_COMPRESS_START_DELAY) { - prtd->start_delay_lsw = metadata->value[0]; - prtd->start_delay_msw = metadata->value[1]; - } else if (metadata->key == - SNDRV_COMPRESS_ENABLE_ADJUST_SESSION_CLOCK) { - return msm_compr_enable_adjust_session_clock(ac, - metadata->value[0]); - } else if (metadata->key == SNDRV_COMPRESS_ADJUST_SESSION_CLOCK) { - return msm_compr_adjust_session_clock(ac, - metadata->value[0], - metadata->value[1]); - } - - return 0; -} - -static int msm_compr_get_metadata(struct snd_compr_stream *cstream, - struct snd_compr_metadata *metadata) -{ - struct msm_compr_audio *prtd; - struct audio_client *ac; - int ret = -EINVAL; - uint64_t ses_time = 0, frames = 0, abs_time = 0; - uint64_t *val = NULL; - int64_t av_offset = 0; - int32_t clock_id = -EINVAL; - - pr_debug("%s\n", __func__); - - if (!metadata || !cstream || !cstream->runtime) - return ret; - - if (metadata->key != SNDRV_COMPRESS_PATH_DELAY && - metadata->key != SNDRV_COMPRESS_DSP_POSITION) { - pr_err("%s, unsupported key %d\n", __func__, metadata->key); - return ret; - } - - prtd = cstream->runtime->private_data; - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return ret; - } - - switch (metadata->key) { - case SNDRV_COMPRESS_PATH_DELAY: - ac = prtd->audio_client; - ret = q6asm_get_path_delay(prtd->audio_client); - if (ret) { - pr_err("%s: get_path_delay failed, ret=%d\n", - __func__, ret); - return ret; - } - - pr_debug("%s, path delay(in us) %u\n", __func__, - ac->path_delay); - metadata->value[0] = ac->path_delay; - break; - case SNDRV_COMPRESS_DSP_POSITION: - clock_id = metadata->value[0]; - pr_debug("%s, clock_id %d\n", __func__, clock_id); - ret = q6asm_get_session_time_v2(prtd->audio_client, - &ses_time, &abs_time); - if (ret) { - pr_err("%s: q6asm_get_session_time_v2 failed, ret=%d\n", - __func__, ret); - return ret; - } - frames = div64_u64((ses_time * prtd->sample_rate), 1000000); - - ret = avcs_core_query_timer_offset(&av_offset, clock_id); - if (ret) { - pr_err("%s: avcs query failed, ret=%d\n", - __func__, ret); - return ret; - } - - val = (uint64_t *) &metadata->value[1]; - val[0] = frames; - val[1] = abs_time + av_offset; - pr_debug("%s, vals frames %lld, time %lld, avoff %lld, abst %lld, sess_time %llu sr %d\n", - __func__, val[0], val[1], av_offset, abs_time, - ses_time, prtd->sample_rate); - break; - default: - pr_err("%s, unsupported key %d\n", __func__, metadata->key); - break; - } - return ret; -} - - -static int msm_compr_set_next_track_param(struct snd_compr_stream *cstream, - union snd_codec_options *codec_options) -{ - struct msm_compr_audio *prtd; - struct audio_client *ac; - int ret = 0; - - if (!codec_options || !cstream) - return -EINVAL; - - prtd = cstream->runtime->private_data; - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return -EINVAL; - } - - ac = prtd->audio_client; - - pr_debug("%s: got codec options for codec type %u", - __func__, prtd->codec); - switch (prtd->codec) { - case FORMAT_WMA_V9: - case FORMAT_WMA_V10PRO: - case FORMAT_FLAC: - case FORMAT_VORBIS: - case FORMAT_ALAC: - case FORMAT_APE: - case FORMAT_AMRNB: - case FORMAT_AMRWB: - case FORMAT_AMR_WB_PLUS: - memcpy(&(prtd->gapless_state.codec_options), - codec_options, - sizeof(union snd_codec_options)); - ret = msm_compr_send_media_format_block(cstream, - ac->stream_id, true); - if (ret < 0) { - pr_err("%s: failed to send media format block\n", - __func__); - } - break; - - default: - pr_debug("%s: Ignore sending CMD Format block\n", - __func__); - break; - } - - return ret; -} - -static int msm_compr_volume_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - uint32_t *volume = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - volume = pdata->volume[fe_id]; - - volume[0] = ucontrol->value.integer.value[0]; - volume[1] = ucontrol->value.integer.value[1]; - pr_debug("%s: fe_id %lu left_vol %d right_vol %d\n", - __func__, fe_id, volume[0], volume[1]); - if (cstream) - msm_compr_set_volume(cstream, volume[0], volume[1]); - return 0; -} - -static int msm_compr_volume_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - - struct msm_compr_pdata *pdata = - snd_soc_component_get_drvdata(comp); - uint32_t *volume = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - volume = pdata->volume[fe_id]; - pr_debug("%s: fe_id %lu\n", __func__, fe_id); - ucontrol->value.integer.value[0] = volume[0]; - ucontrol->value.integer.value[1] = volume[1]; - - return 0; -} - -static int msm_compr_audio_effects_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); - int ret = 0; - int effects_module; - - pr_debug("%s\n", __func__); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto done; - } - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No effects for compr_type[%d]\n", - __func__, prtd->compr_passthr); - goto done; - } - pr_debug("%s: Effects supported for compr_type[%d]\n", - __func__, prtd->compr_passthr); - - effects_module = *values++; - switch (effects_module) { - case VIRTUALIZER_MODULE: - pr_debug("%s: VIRTUALIZER_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_virtualizer_handler( - prtd->audio_client, - &(audio_effects->virtualizer), - values); - break; - case REVERB_MODULE: - pr_debug("%s: REVERB_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_reverb_handler(prtd->audio_client, - &(audio_effects->reverb), - values); - break; - case BASS_BOOST_MODULE: - pr_debug("%s: BASS_BOOST_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_bass_boost_handler(prtd->audio_client, - &(audio_effects->bass_boost), - values); - break; - case PBE_MODULE: - pr_debug("%s: PBE_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_pbe_handler(prtd->audio_client, - &(audio_effects->pbe), - values); - break; - case EQ_MODULE: - pr_debug("%s: EQ_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_popless_eq_handler(prtd->audio_client, - &(audio_effects->equalizer), - values); - break; - case SOFT_VOLUME_MODULE: - pr_debug("%s: SOFT_VOLUME_MODULE\n", __func__); - break; - case SOFT_VOLUME2_MODULE: - pr_debug("%s: SOFT_VOLUME2_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_volume_handler_v2(prtd->audio_client, - &(audio_effects->volume), - values, SOFT_VOLUME_INSTANCE_2); - break; - default: - pr_err("%s Invalid effects config module\n", __func__); - ret = -EINVAL; - } -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - int ret = 0; - struct msm_compr_audio *prtd = NULL; - - pr_debug("%s\n", __func__); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_debug("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - } -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_query_audio_effect_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - int ret = 0; - long *values = &(ucontrol->value.integer.value[0]); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto done; - } - if (prtd->compr_passthr != LEGACY_PCM) { - pr_err("%s: No effects for compr_type[%d]\n", - __func__, prtd->compr_passthr); - ret = -EPERM; - goto done; - } - audio_effects->query.mod_id = (u32)*values++; - audio_effects->query.parm_id = (u32)*values++; - audio_effects->query.size = (u32)*values++; - audio_effects->query.offset = (u32)*values++; - audio_effects->query.device = (u32)*values++; - -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_query_audio_effect_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - int ret = 0; - long *values = &(ucontrol->value.integer.value[0]); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_debug("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto done; - } - values[0] = (long)audio_effects->query.mod_id; - values[1] = (long)audio_effects->query.parm_id; - values[2] = (long)audio_effects->query.size; - values[3] = (long)audio_effects->query.offset; - values[4] = (long)audio_effects->query.device; -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_send_dec_params(struct snd_compr_stream *cstream, - struct msm_compr_dec_params *dec_params, - int stream_id) -{ - - int rc = 0; - struct msm_compr_audio *prtd = NULL; - struct snd_dec_ddp *ddp = &dec_params->ddp_params; - - if (!cstream || !dec_params) { - pr_err("%s: stream or dec_params inactive\n", __func__); - rc = -EINVAL; - goto end; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set dec_params\n", __func__); - rc = -EINVAL; - goto end; - } - switch (prtd->codec) { - case FORMAT_MP3: - case FORMAT_MPEG4_AAC: - case FORMAT_TRUEHD: - case FORMAT_IEC61937: - case FORMAT_APTX: - pr_debug("%s: no runtime parameters for codec: %d\n", __func__, - prtd->codec); - break; - case FORMAT_AC3: - case FORMAT_EAC3: - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No DDP param for compr_type[%d]\n", - __func__, prtd->compr_passthr); - break; - } - rc = msm_compr_send_ddp_cfg(prtd->audio_client, ddp, stream_id); - if (rc < 0) - pr_err("%s: DDP CMD CFG failed %d\n", __func__, rc); - break; - default: - break; - } -end: - return rc; - -} -static int msm_compr_dec_params_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_dec_params *dec_params = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); - int rc = 0; - - pr_debug("%s\n", __func__); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - dec_params = pdata->dec_params[fe_id]; - - if (!cstream || !dec_params) { - pr_err("%s: stream or dec_params inactive\n", __func__); - return -EINVAL; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set dec_params\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - switch (prtd->codec) { - case FORMAT_MP3: - case FORMAT_MPEG4_AAC: - case FORMAT_FLAC: - case FORMAT_VORBIS: - case FORMAT_ALAC: - case FORMAT_APE: - case FORMAT_DTS: - case FORMAT_DSD: - case FORMAT_TRUEHD: - case FORMAT_IEC61937: - case FORMAT_APTX: - case FORMAT_AMRNB: - case FORMAT_AMRWB: - case FORMAT_AMR_WB_PLUS: - pr_debug("%s: no runtime parameters for codec: %d\n", __func__, - prtd->codec); - break; - case FORMAT_AC3: - case FORMAT_EAC3: { - struct snd_dec_ddp *ddp = &dec_params->ddp_params; - int cnt; - - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No DDP param for compr_type[%d]\n", - __func__, prtd->compr_passthr); - break; - } - - ddp->params_length = (*values++); - if (ddp->params_length > DDP_DEC_MAX_NUM_PARAM) { - pr_err("%s: invalid num of params:: %d\n", __func__, - ddp->params_length); - rc = -EINVAL; - goto end; - } - for (cnt = 0; cnt < ddp->params_length; cnt++) { - ddp->params_id[cnt] = *values++; - ddp->params_value[cnt] = *values++; - } - prtd = cstream->runtime->private_data; - if (prtd && prtd->audio_client) - rc = msm_compr_send_dec_params(cstream, dec_params, - prtd->audio_client->stream_id); - break; - } - default: - break; - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_compr_dec_params_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* dummy function */ - return 0; -} - -static int msm_compr_playback_app_type_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_playback_app_type_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_compr_capture_app_type_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_capture_app_type_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_compr_channel_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - int rc = 0, i; - struct msm_pcm_channel_mixer *chmixer_pspd = NULL; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - - if (pdata->ch_map[fe_id]) { - pdata->ch_map[fe_id]->set_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - pdata->ch_map[fe_id]->channel_map[i] = - (char)(ucontrol->value.integer.value[i]); - - /* update chmixer_pspd chmap cached with routing driver as well */ - chmixer_pspd = pdata->chmixer_pspd[fe_id]; - if (chmixer_pspd && chmixer_pspd->enable) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = - pdata->ch_map[fe_id]->channel_map[i]; - chmixer_pspd->override_in_ch_map = true; - msm_pcm_routing_set_channel_mixer_cfg(fe_id, - SESSION_TYPE_RX, chmixer_pspd); - } - } else { - pr_debug("%s: no memory for ch_map, default will be set\n", - __func__); - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_compr_channel_map_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - int rc = 0, i; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - if (pdata->ch_map[fe_id]) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - pdata->ch_map[fe_id]->channel_map[i]; - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_compr_adsp_stream_cmd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd; - int ret = 0; - struct msm_adsp_event_data *event_data = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - return -EINVAL; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)ucontrol->value.bytes.data; - if ((event_data->event_type < ADSP_STREAM_PP_EVENT) || - (event_data->event_type >= ADSP_STREAM_EVENT_MAX)) { - pr_err("%s: invalid event_type=%d", - __func__, event_data->event_type); - ret = -EINVAL; - goto done; - } - - if (event_data->payload_len > sizeof(ucontrol->value.bytes.data) - - sizeof(struct msm_adsp_event_data)) { - pr_err("%s param length=%d exceeds limit", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_stream_cmd(prtd->audio_client, event_data); - if (ret < 0) - pr_err("%s: failed to send stream event cmd, err = %d\n", - __func__, ret); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_ion_fd_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd; - int fd; - int ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds invalid fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - return -EINVAL; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(&fd, ucontrol->value.bytes.data, sizeof(fd)); - ret = q6asm_send_ion_fd(prtd->audio_client, fd); - if (ret < 0) - pr_err("%s: failed to register ion fd\n", __func__); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_rtic_event_ack_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd; - int ret = 0; - int param_length = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(¶m_length, ucontrol->value.bytes.data, - sizeof(param_length)); - if ((param_length + sizeof(param_length)) - >= sizeof(ucontrol->value.bytes.data)) { - pr_err("%s param length=%d exceeds limit", - __func__, param_length); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_rtic_event_ack(prtd->audio_client, - ucontrol->value.bytes.data + sizeof(param_length), - param_length); - if (ret < 0) - pr_err("%s: failed to send rtic event ack, err = %d\n", - __func__, ret); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_gapless_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - pdata->use_dsp_gapless_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: value: %ld\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_compr_gapless_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = - snd_soc_component_get_drvdata(comp); - pr_debug("%s:gapless mode %d\n", __func__, pdata->use_dsp_gapless_mode); - ucontrol->value.integer.value[0] = pdata->use_dsp_gapless_mode; - - return 0; -} - -static const struct snd_kcontrol_new msm_compr_gapless_controls[] = { - SOC_SINGLE_EXT("Compress Gapless Playback", - 0, 0, 1, 0, - msm_compr_gapless_get, - msm_compr_gapless_put), -}; - -static int msm_compr_probe(struct snd_soc_platform *platform) -{ - struct msm_compr_pdata *pdata; - int i; - int rc; - const char *qdsp_version; - - pr_debug("%s\n", __func__); - pdata = (struct msm_compr_pdata *) dev_get_drvdata(platform->dev); - if (!pdata) { - pr_err("%s platform data not set\n", __func__); - return -EINVAL; - } - - snd_soc_platform_set_drvdata(platform, pdata); - - for (i = 0; i < MSM_FRONTEND_DAI_MAX; i++) { - pdata->volume[i][0] = COMPRESSED_LR_VOL_MAX_STEPS; - pdata->volume[i][1] = COMPRESSED_LR_VOL_MAX_STEPS; - pdata->audio_effects[i] = NULL; - pdata->dec_params[i] = NULL; - pdata->cstream[i] = NULL; - pdata->ch_map[i] = NULL; - pdata->is_in_use[i] = false; - } - - snd_soc_add_platform_controls(platform, msm_compr_gapless_controls, - ARRAY_SIZE(msm_compr_gapless_controls)); - - rc = of_property_read_string(platform->dev->of_node, - "qcom,adsp-version", &qdsp_version); - if (!rc) { - if (!strcmp(qdsp_version, "MDSP 1.2")) - pdata->use_legacy_api = true; - else - pdata->use_legacy_api = false; - } else - pdata->use_legacy_api = false; - - pr_debug("%s: use legacy api %d\n", __func__, pdata->use_legacy_api); - /* - * use_dsp_gapless_mode part of platform data(pdata) is updated from HAL - * through a mixer control before compress driver is opened. The mixer - * control is used to decide if dsp gapless mode needs to be enabled. - * Gapless is disabled by default. - */ - pdata->use_dsp_gapless_mode = false; - return 0; -} - -static int msm_compr_volume_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = COMPRESSED_LR_VOL_MAX_STEPS; - return 0; -} - -static int msm_compr_audio_effects_config_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = MAX_PP_PARAMS_SZ; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_query_audio_effect_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 128; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_dec_params_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 128; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_app_type_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 5; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_channel_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - uinfo->value.integer.min = 0; - /* See PCM_MAX_CHANNEL_MAP in apr_audio-v2.h */ - uinfo->value.integer.max = PCM_MAX_CHANNEL_MAP; - return 0; -} - -static int msm_compr_add_volume_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Compress Playback"; - const char *deviceNo = "NN"; - const char *suffix = "Volume"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_volume_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_volume_info, - .tlv.p = msm_compr_vol_gain, - .get = msm_compr_volume_get, - .put = msm_compr_volume_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 + - strlen(suffix) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - pr_err("failed to allocate mixer ctrl str of len %d", ctl_len); - return 0; - } - snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name, - rtd->pcm->device, suffix); - fe_volume_control[0].name = mixer_str; - fe_volume_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, fe_volume_control, - ARRAY_SIZE(fe_volume_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_audio_effects_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Audio Effects Config"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_audio_effects_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_audio_effects_config_info, - .get = msm_compr_audio_effects_config_get, - .put = msm_compr_audio_effects_config_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return 0; - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - - fe_audio_effects_config_control[0].name = mixer_str; - fe_audio_effects_config_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s\n", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_audio_effects_config_control, - ARRAY_SIZE(fe_audio_effects_config_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_query_audio_effect_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Query Audio Effect Param"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_query_audio_effect_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_query_audio_effect_info, - .get = msm_compr_query_audio_effect_get, - .put = msm_compr_query_audio_effect_put, - .private_value = 0, - } - }; - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - pr_err("failed to allocate mixer ctrl str of len %d", ctl_len); - return 0; - } - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_query_audio_effect_control[0].name = mixer_str; - fe_query_audio_effect_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: registering new mixer ctl %s\n", __func__, mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_query_audio_effect_control, - ARRAY_SIZE(fe_query_audio_effect_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_audio_adsp_stream_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CMD; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_audio_adsp_stream_cmd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_compr_adsp_stream_cmd_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_stream_cmd_config_control[0].name = mixer_str; - fe_audio_adsp_stream_cmd_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_stream_cmd_config_control, - ARRAY_SIZE(fe_audio_adsp_stream_cmd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); - return ret; -} - -static int msm_compr_add_audio_adsp_stream_callback_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol *kctl; - - struct snd_kcontrol_new fe_audio_adsp_callback_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_callback_info, - .get = msm_adsp_stream_callback_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_callback_config_control[0].name = mixer_str; - fe_audio_adsp_callback_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_callback_config_control, - ARRAY_SIZE(fe_audio_adsp_callback_config_control)); - if (ret < 0) { - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl %s.\n", __func__, mixer_str); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl->private_data = NULL; - -free_mixer_str: - kfree(mixer_str); -done: - return ret; -} - -static int msm_compr_add_dec_runtime_params_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Audio Stream"; - const char *deviceNo = "NN"; - const char *suffix = "Dec Params"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_dec_params_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_dec_params_info, - .get = msm_compr_dec_params_get, - .put = msm_compr_dec_params_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 + - strlen(suffix) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return 0; - - snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name, - rtd->pcm->device, suffix); - - fe_dec_params_control[0].name = mixer_str; - fe_dec_params_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_dec_params_control, - ARRAY_SIZE(fe_dec_params_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_app_type_cfg_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_app_type_cfg_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_app_type_cfg_info, - .put = msm_compr_playback_app_type_cfg_put, - .get = msm_compr_playback_app_type_cfg_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - - pr_debug("%s: added new compr FE ctl with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) - ctl_len = strlen(playback_mixer_ctl_name) + 1 + strlen(deviceNo) - + 1 + strlen(suffix) + 1; - else - ctl_len = strlen(capture_mixer_ctl_name) + 1 + strlen(deviceNo) - + 1 + strlen(suffix) + 1; - - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return 0; - - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) - snprintf(mixer_str, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - else - snprintf(mixer_str, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - - fe_app_type_cfg_control[0].name = mixer_str; - fe_app_type_cfg_control[0].private_value = rtd->dai_link->id; - - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) { - fe_app_type_cfg_control[0].put = - msm_compr_playback_app_type_cfg_put; - fe_app_type_cfg_control[0].get = - msm_compr_playback_app_type_cfg_get; - } else { - fe_app_type_cfg_control[0].put = - msm_compr_capture_app_type_cfg_put; - fe_app_type_cfg_control[0].get = - msm_compr_capture_app_type_cfg_get; - } - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_app_type_cfg_control, - ARRAY_SIZE(fe_app_type_cfg_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_channel_map_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Channel Map"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - struct msm_compr_pdata *pdata = NULL; - int ctl_len; - struct snd_kcontrol_new fe_channel_map_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_channel_map_info, - .get = msm_compr_channel_map_get, - .put = msm_compr_channel_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: NULL rtd\n", __func__); - return -EINVAL; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s%d", mixer_ctl_name, rtd->pcm->device); - - fe_channel_map_control[0].name = mixer_str; - fe_channel_map_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_channel_map_control, - ARRAY_SIZE(fe_channel_map_control)); - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pdata->ch_map[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_compr_ch_map), GFP_KERNEL); - if (!pdata->ch_map[rtd->dai_link->id]) { - pr_err("%s: Could not allocate memory for channel map\n", - __func__); - kfree(mixer_str); - return -ENOMEM; - } - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_io_fd_cmd_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback ION FD"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_ion_fd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_compr_ion_fd_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_ion_fd_config_control[0].name = mixer_str; - fe_ion_fd_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_ion_fd_config_control, - ARRAY_SIZE(fe_ion_fd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); - return ret; -} - -static int msm_compr_add_event_ack_cmd_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Event Ack"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_event_ack_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_compr_rtic_event_ack_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_event_ack_config_control[0].name = mixer_str; - fe_event_ack_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_event_ack_config_control, - ARRAY_SIZE(fe_event_ack_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); - return ret; -} - -static struct msm_pcm_channel_mixer *msm_compr_get_chmixer( - struct msm_compr_pdata *pdata, u64 fe_id) -{ - if (!pdata) { - pr_err("%s: missing pdata\n", __func__); - return NULL; - } - - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %llu\n", __func__, fe_id); - return NULL; - } - - return pdata->chmixer_pspd[fe_id]; -} - -static int msm_compr_channel_mixer_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int ret = 0, i = 0, stream_id = 0, be_id = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - struct msm_pcm_channel_mixer *chmixer_pspd = NULL; - u8 asm_ch_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; - bool reset_override_out_ch_map = false; - bool reset_override_in_ch_map = false; - - if ((session_type != SESSION_TYPE_TX) && - (session_type != SESSION_TYPE_RX)) { - pr_err("%s: invalid session type %d\n", __func__, session_type); - return -EINVAL; - } - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->enable = ucontrol->value.integer.value[0]; - chmixer_pspd->rule = ucontrol->value.integer.value[1]; - chmixer_pspd->input_channel = ucontrol->value.integer.value[2]; - chmixer_pspd->output_channel = ucontrol->value.integer.value[3]; - chmixer_pspd->port_idx = ucontrol->value.integer.value[4]; - - if (chmixer_pspd->input_channel < 0 || - chmixer_pspd->input_channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8 || - chmixer_pspd->output_channel < 0 || - chmixer_pspd->output_channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channels, in %d, out %d\n", - __func__, chmixer_pspd->input_channel, - chmixer_pspd->output_channel); - return -EINVAL; - } - - if (chmixer_pspd->enable) { - if (session_type == SESSION_TYPE_RX && - !chmixer_pspd->override_in_ch_map) { - if (pdata->ch_map[fe_id]->set_ch_map) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = - pdata->ch_map[fe_id]->channel_map[i]; - } else { - q6asm_map_channels(asm_ch_map, - chmixer_pspd->input_channel, false); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = asm_ch_map[i]; - } - chmixer_pspd->override_in_ch_map = true; - reset_override_in_ch_map = true; - } else if (session_type == SESSION_TYPE_TX && - !chmixer_pspd->override_out_ch_map) { - if (pdata->ch_map[fe_id]->set_ch_map) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->out_ch_map[i] = - pdata->ch_map[fe_id]->channel_map[i]; - } else { - q6asm_map_channels(asm_ch_map, - chmixer_pspd->output_channel, false); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->out_ch_map[i] = asm_ch_map[i]; - } - chmixer_pspd->override_out_ch_map = true; - reset_override_out_ch_map = true; - } - } else { - chmixer_pspd->override_out_ch_map = false; - chmixer_pspd->override_in_ch_map = false; - } - - /* cache value and take effect during adm_open stage */ - msm_pcm_routing_set_channel_mixer_cfg(fe_id, - session_type, - chmixer_pspd); - - cstream = pdata->cstream[fe_id]; - if (chmixer_pspd->enable && cstream && cstream->runtime) { - prtd = cstream->runtime->private_data; - - if (prtd && prtd->audio_client) { - stream_id = prtd->audio_client->session; - be_id = chmixer_pspd->port_idx; - msm_pcm_routing_set_channel_mixer_runtime(be_id, - stream_id, session_type, chmixer_pspd); - } - } - - if (reset_override_out_ch_map) - chmixer_pspd->override_out_ch_map = false; - if (reset_override_in_ch_map) - chmixer_pspd->override_in_ch_map = false; - - return ret; -} - -static int msm_compr_channel_mixer_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = chmixer_pspd->enable; - ucontrol->value.integer.value[1] = chmixer_pspd->rule; - ucontrol->value.integer.value[2] = chmixer_pspd->input_channel; - ucontrol->value.integer.value[3] = chmixer_pspd->output_channel; - ucontrol->value.integer.value[4] = chmixer_pspd->port_idx; - return 0; -} - -static int msm_compr_channel_mixer_output_map_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int i = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->override_out_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->out_ch_map[i] = - ucontrol->value.integer.value[i]; - - return 0; -} - -static int msm_compr_channel_mixer_output_map_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int i = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->out_ch_map[i]; - return 0; -} - -static int msm_compr_channel_mixer_input_map_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int i = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->override_in_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = ucontrol->value.integer.value[i]; - - return 0; -} - -static int msm_compr_channel_mixer_input_map_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int i = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->in_ch_map[i]; - return 0; -} - -static int msm_compr_channel_mixer_weight_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int channel = (kcontrol->private_value >> 16) & 0xFF; - int i = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - if (channel <= 0 || channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: invalid channel number %d\n", __func__, channel); - return -EINVAL; - } - channel--; - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->channel_weight[channel][i] = - ucontrol->value.integer.value[i]; - return 0; -} - -static int msm_compr_channel_mixer_weight_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int channel = (kcontrol->private_value >> 16) & 0xFF; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - int i = 0; - struct msm_pcm_channel_mixer *chmixer_pspd; - - if (channel <= 0 || channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: invalid channel number %d\n", __func__, channel); - return -EINVAL; - } - channel--; - - chmixer_pspd = msm_compr_get_chmixer(pdata, fe_id); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->channel_weight[channel][i]; - return 0; -} - -static int msm_compr_add_platform_controls(struct snd_kcontrol_new *kctl, - struct snd_soc_pcm_runtime *rtd, const char *name_prefix, - const char *name_suffix, int session_type, int channels) -{ - int ret = -EINVAL; - char *mixer_name = NULL; - const char *deviceNo = "NN"; - const char *channelNo = "NN"; - int ctl_len = 0; - - ctl_len = strlen(name_prefix) + 1 + strlen(deviceNo) + 1 + - strlen(channelNo) + 1 + strlen(name_suffix) + 1; - - mixer_name = kzalloc(ctl_len, GFP_KERNEL); - if (mixer_name == NULL) - return -ENOMEM; - - if (channels >= 0) { - snprintf(mixer_name, ctl_len, "%s %d %s %d", - name_prefix, rtd->pcm->device, name_suffix, channels); - kctl->private_value = (rtd->dai_link->id) | (channels << 16); - } else { - snprintf(mixer_name, ctl_len, "%s %d %s", - name_prefix, rtd->pcm->device, name_suffix); - kctl->private_value = (rtd->dai_link->id); - } - if (session_type != INVALID_SESSION) - kctl->private_value |= (session_type << 8); - - kctl->name = mixer_name; - ret = snd_soc_add_platform_controls(rtd->platform, kctl, 1); - kfree(mixer_name); - return ret; -} - -static int msm_compr_channel_mixer_output_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid channel map value ranges from 1 to 64 */ - uinfo->value.integer.min = 1; - uinfo->value.integer.max = 64; - return 0; -} - -static int msm_compr_add_channel_mixer_output_map_controls( - struct snd_soc_pcm_runtime *rtd) -{ - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Output Map"; - const char *mixer_ctl_name = NULL; - int ret = 0, session_type = INVALID_SESSION, channel = -1; - struct snd_kcontrol_new channel_mixer_output_map_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_channel_mixer_output_map_info, - .put = msm_compr_channel_mixer_output_map_ctl_put, - .get = msm_compr_channel_mixer_output_map_ctl_get, - .private_value = 0, - }; - - mixer_ctl_name = rtd->compr->direction == SND_COMPRESS_PLAYBACK ? - playback_mixer_ctl_name : capture_mixer_ctl_name ; - ret = msm_compr_add_platform_controls(&channel_mixer_output_map_control, - rtd, mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) { - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - } - - return ret; -} - -static int msm_compr_channel_mixer_input_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid channel map value ranges from 1 to 64 */ - uinfo->value.integer.min = 1; - uinfo->value.integer.max = 64; - return 0; -} - -static int msm_compr_add_channel_mixer_input_map_controls( - struct snd_soc_pcm_runtime *rtd) -{ - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Input Map"; - const char *mixer_ctl_name = NULL; - int ret = 0, session_type = INVALID_SESSION, channel = -1; - struct snd_kcontrol_new channel_mixer_input_map_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_channel_mixer_input_map_info, - .put = msm_compr_channel_mixer_input_map_ctl_put, - .get = msm_compr_channel_mixer_input_map_ctl_get, - .private_value = 0, - }; - - mixer_ctl_name = rtd->compr->direction == SND_COMPRESS_PLAYBACK ? - playback_mixer_ctl_name : capture_mixer_ctl_name ; - ret = msm_compr_add_platform_controls(&channel_mixer_input_map_control, - rtd, mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) { - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - } - - return ret; -} - -static int msm_compr_channel_mixer_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - /* five int values: enable, rule, in_channels, out_channels and port_id */ - uinfo->count = 5; - /* Valid range is all positive values to support above controls */ - uinfo->value.integer.min = 0; - uinfo->value.integer.max = INT_MAX; - return 0; -} - -static int msm_compr_add_channel_mixer_cfg_controls( - struct snd_soc_pcm_runtime *rtd) -{ - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Cfg"; - const char *mixer_ctl_name = NULL; - int ret = 0, session_type = INVALID_SESSION, channel = -1; - struct snd_kcontrol_new channel_mixer_cfg_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_channel_mixer_cfg_info, - .put = msm_compr_channel_mixer_cfg_ctl_put, - .get = msm_compr_channel_mixer_cfg_ctl_get, - .private_value = 0, - }; - - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) { - session_type = SESSION_TYPE_RX; - mixer_ctl_name = playback_mixer_ctl_name; - } else { - session_type = SESSION_TYPE_TX; - mixer_ctl_name = capture_mixer_ctl_name; - } - - ret = msm_compr_add_platform_controls(&channel_mixer_cfg_control, - rtd, mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) { - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - } - - return ret; -} - -static int msm_compr_channel_mixer_weight_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid range: 0 to 0x4000(Unity) gain weightage */ - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x4000; - return 0; -} - -static int msm_compr_add_channel_mixer_weight_controls( - struct snd_soc_pcm_runtime *rtd, - int channel) -{ - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Weight Ch"; - const char *mixer_ctl_name = NULL; - int ret = 0, session_type = INVALID_SESSION; - struct snd_kcontrol_new channel_mixer_weight_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_channel_mixer_weight_info, - .put = msm_compr_channel_mixer_weight_ctl_put, - .get = msm_compr_channel_mixer_weight_ctl_get, - .private_value = 0, - }; - - mixer_ctl_name = rtd->compr->direction == SND_COMPRESS_PLAYBACK ? - playback_mixer_ctl_name : capture_mixer_ctl_name ; - ret = msm_compr_add_platform_controls(&channel_mixer_weight_control, - rtd, mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) { - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - } - - return ret; -} - -static int msm_compr_add_channel_mixer_controls(struct snd_soc_pcm_runtime *rtd) -{ - int i, ret = 0; - struct msm_compr_pdata *pdata = NULL; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - - if (!pdata->chmixer_pspd[rtd->dai_link->id]) { - pdata->chmixer_pspd[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_pcm_channel_mixer), GFP_KERNEL); - if (!pdata->chmixer_pspd[rtd->dai_link->id]) - return -ENOMEM; - } - - ret = msm_compr_add_channel_mixer_cfg_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer cfg controls failed:%d\n", - __func__, ret); - goto fail; - } - ret = msm_compr_add_channel_mixer_input_map_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer input map controls failed:%d\n", - __func__, ret); - goto fail; - } - ret = msm_compr_add_channel_mixer_output_map_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer output map controls failed:%d\n", - __func__, ret); - goto fail; - } - - for (i = 1; i <= PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) { - ret = msm_compr_add_channel_mixer_weight_controls(rtd, i); - if (ret) { - pr_err("%s: pcm add channel mixer weight controls failed:%d\n", - __func__, ret); - goto fail; - } - } - return 0; - -fail: - kfree(pdata->chmixer_pspd[rtd->dai_link->id]); - pdata->chmixer_pspd[rtd->dai_link->id] = NULL; - return ret; -} - -static int msm_compr_new(struct snd_soc_pcm_runtime *rtd) -{ - int rc; - - rc = msm_compr_add_volume_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Volume Control\n", __func__); - - rc = msm_compr_add_audio_effects_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Audio Effects Control\n", - __func__); - - rc = msm_compr_add_audio_adsp_stream_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add Compr ADSP Stream Cmd Control\n", - __func__); - - rc = msm_compr_add_audio_adsp_stream_callback_control(rtd); - if (rc) - pr_err("%s: Could not add Compr ADSP Stream Callback Control\n", - __func__); - - rc = msm_compr_add_io_fd_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add Compr ion fd Control\n", - __func__); - - rc = msm_compr_add_event_ack_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add Compr event ack Control\n", - __func__); - - rc = msm_compr_add_query_audio_effect_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Query Audio Effect Control\n", - __func__); - - rc = msm_compr_add_dec_runtime_params_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Dec runtime params Control\n", - __func__); - rc = msm_compr_add_app_type_cfg_control(rtd); - if (rc) - pr_err("%s: Could not add Compr App Type Cfg Control\n", - __func__); - rc = msm_compr_add_channel_map_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Channel Map Control\n", - __func__); - rc = msm_compr_add_channel_mixer_controls(rtd); - if (rc) - pr_err("%s: Could not add Compr Channel Mixer Controls\n", - __func__); - return 0; -} - -static struct snd_compr_ops msm_compr_ops = { - .open = msm_compr_open, - .free = msm_compr_free, - .trigger = msm_compr_trigger, - .pointer = msm_compr_pointer, - .set_params = msm_compr_set_params, - .set_metadata = msm_compr_set_metadata, - .get_metadata = msm_compr_get_metadata, - .set_next_track_param = msm_compr_set_next_track_param, - .ack = msm_compr_ack, - .copy = msm_compr_copy, - .get_caps = msm_compr_get_caps, - .get_codec_caps = msm_compr_get_codec_caps, -}; - -static struct snd_soc_platform_driver msm_soc_platform = { - .probe = msm_compr_probe, - .compr_ops = &msm_compr_ops, - .pcm_new = msm_compr_new, -}; - -static int msm_compr_dev_probe(struct platform_device *pdev) -{ - struct msm_compr_pdata *pdata = NULL; - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - pdata = (struct msm_compr_pdata *) - kzalloc(sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - mutex_init(&pdata->lock); - dev_set_drvdata(&pdev->dev, pdata); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_compr_remove(struct platform_device *pdev) -{ - int i = 0; - struct msm_compr_pdata *pdata = NULL; - - pdata = dev_get_drvdata(&pdev->dev); - if (pdata) { - for (i = 0; i < MSM_FRONTEND_DAI_MM_SIZE; i++) - kfree(pdata->chmixer_pspd[i]); - } - mutex_destroy(&pdata->lock); - kfree(pdata); - - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_compr_dt_match[] = { - {.compatible = "qcom,msm-compress-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_compr_dt_match); - -static struct platform_driver msm_compr_driver = { - .driver = { - .name = "msm-compress-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_compr_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_compr_dev_probe, - .remove = msm_compr_remove, -}; - -int __init msm_compress_dsp_init(void) -{ - return platform_driver_register(&msm_compr_driver); -} - -void msm_compress_dsp_exit(void) -{ - platform_driver_unregister(&msm_compr_driver); -} - -MODULE_DESCRIPTION("Compress Offload platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-cpe-lsm.c b/techpack/audio/4.0/asoc/msm-cpe-lsm.c deleted file mode 100644 index 05b3336a1cf1..000000000000 --- a/techpack/audio/4.0/asoc/msm-cpe-lsm.c +++ /dev/null @@ -1,3348 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-slim-dma.h" -#include "codecs/cpe_core.h" - -#define SAMPLE_RATE_48KHZ 48000 -#define SAMPLE_RATE_16KHZ 16000 -#define LSM_VOICE_WAKEUP_APP_V2 2 -#define AFE_PORT_ID_1 1 -#define AFE_PORT_ID_3 3 -#define AFE_OUT_PORT_2 2 -#define LISTEN_MIN_NUM_PERIODS 2 -#define LISTEN_MAX_NUM_PERIODS 12 -#define LISTEN_MAX_PERIOD_SIZE 61440 -#define LISTEN_MIN_PERIOD_SIZE 320 -#define LISTEN_MAX_STATUS_PAYLOAD_SIZE 256 -#define MSM_CPE_MAX_CUSTOM_PARAM_SIZE 2048 - -#define MSM_CPE_LAB_THREAD_TIMEOUT (3 * (HZ/10)) - -#define MSM_CPE_LSM_GRAB_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock acquire\n", \ - __func__, name); \ - mutex_lock(lock); \ -} - -#define MSM_CPE_LSM_REL_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock release\n", \ - __func__, name); \ - mutex_unlock(lock); \ -} - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 16000, 48000, 192000, 384000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - - -static struct snd_pcm_hardware msm_pcm_hardware_listen = { - .info = (SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | - SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE), - .rates = (SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_384000), - .rate_min = 16000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = LISTEN_MAX_NUM_PERIODS * - LISTEN_MAX_PERIOD_SIZE, - .period_bytes_min = LISTEN_MIN_PERIOD_SIZE, - .period_bytes_max = LISTEN_MAX_PERIOD_SIZE, - .periods_min = LISTEN_MIN_NUM_PERIODS, - .periods_max = LISTEN_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -enum { - AFE_CMD_INVALID = 0, - AFE_CMD_PORT_START, - AFE_CMD_PORT_SUSPEND, - AFE_CMD_PORT_RESUME, - AFE_CMD_PORT_STOP, -}; - -enum cpe_lab_thread_status { - MSM_LSM_LAB_THREAD_STOP, - MSM_LSM_LAB_THREAD_RUNNING, - MSM_LSM_LAB_THREAD_ERROR, -}; - -struct cpe_hw_params { - u32 sample_rate; - u16 sample_size; - u32 buf_sz; - u32 period_count; - u16 channels; -}; - -struct cpe_data_pcm_buf { - u8 *mem; - phys_addr_t phys; -}; - -struct cpe_lsm_lab { - atomic_t in_count; - atomic_t abort_read; - u32 dma_write; - u32 buf_idx; - u32 pcm_size; - enum cpe_lab_thread_status thread_status; - struct cpe_data_pcm_buf *pcm_buf; - wait_queue_head_t period_wait; - struct completion comp; - struct completion thread_complete; -}; - -struct cpe_priv { - void *core_handle; - struct snd_soc_codec *codec; - struct wcd_cpe_lsm_ops lsm_ops; - struct wcd_cpe_afe_ops afe_ops; - bool afe_mad_ctl; - u32 input_port_id; -}; - -struct cpe_lsm_data { - struct device *dev; - struct cpe_lsm_session *lsm_session; - struct mutex lsm_api_lock; - struct cpe_lsm_lab lab; - struct cpe_hw_params hw_params; - struct snd_pcm_substream *substream; - - wait_queue_head_t event_wait; - atomic_t event_avail; - atomic_t event_stop; - - u8 ev_det_status; - u8 ev_det_pld_size; - u8 *ev_det_payload; - - bool cpe_prepared; -}; - -static int msm_cpe_afe_mad_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct cpe_priv *cpe = kcontrol->private_data; - - ucontrol->value.integer.value[0] = cpe->afe_mad_ctl; - return 0; -} - -static int msm_cpe_afe_mad_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct cpe_priv *cpe = kcontrol->private_data; - - cpe->afe_mad_ctl = ucontrol->value.integer.value[0]; - return 0; -} - -static struct snd_kcontrol_new msm_cpe_kcontrols[] = { - SOC_SINGLE_EXT("CPE AFE MAD Enable", SND_SOC_NOPM, 0, 1, 0, - msm_cpe_afe_mad_ctl_get, msm_cpe_afe_mad_ctl_put), -}; - -/* - * cpe_get_private_data: obtain ASoC platform driver private data - * @substream: ASoC substream for which private data to be obtained - */ -static struct cpe_priv *cpe_get_private_data( - struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd; - - if (!substream || !substream->private_data) { - pr_err("%s: %s is invalid\n", - __func__, - (!substream) ? "substream" : "private_data"); - goto err_ret; - } - - rtd = substream->private_data; - - if (!rtd || !rtd->platform) { - pr_err("%s: %s is invalid\n", - __func__, - (!rtd) ? "runtime" : "platform"); - goto err_ret; - } - - return snd_soc_platform_get_drvdata(rtd->platform); - -err_ret: - return NULL; -} - -/* - * cpe_get_lsm_data: obtain the lsm session data given the substream - * @substream: ASoC substream for which lsm session data to be obtained - */ -static struct cpe_lsm_data *cpe_get_lsm_data( - struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - - return runtime->private_data; -} - -static void msm_cpe_process_event_status(void *data, - u8 detect_status, u8 size, u8 *payload) -{ - struct cpe_lsm_data *lsm_d = data; - - lsm_d->ev_det_status = detect_status; - lsm_d->ev_det_pld_size = size; - - lsm_d->ev_det_payload = kzalloc(size, GFP_KERNEL); - if (!lsm_d->ev_det_payload) - return; - - memcpy(lsm_d->ev_det_payload, payload, size); - - atomic_set(&lsm_d->event_avail, 1); - wake_up(&lsm_d->event_wait); -} - -static void msm_cpe_process_event_status_done(struct cpe_lsm_data *lsm_data) -{ - kfree(lsm_data->ev_det_payload); - lsm_data->ev_det_payload = NULL; - - lsm_data->ev_det_status = 0; - lsm_data->ev_det_pld_size = 0; -} - -/* - * msm_cpe_afe_port_cntl: Perform the afe port control - * @substream: substream for which afe port command to be performed - * @core_handle: handle to core - * @afe_ops: handle to the afe operations - * @afe_cfg: afe port configuration data - * @cmd: command to be sent to AFE - * - */ -static int msm_cpe_afe_port_cntl( - struct snd_pcm_substream *substream, - void *core_handle, - struct wcd_cpe_afe_ops *afe_ops, - struct wcd_cpe_afe_port_cfg *afe_cfg, - int cmd) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (!afe_cfg->port_id) { - /* - * It is possible driver can get closed without prepare, - * in which case afe ports will not be initialized. - */ - dev_dbg(rtd->dev, - "%s: Invalid afe port id\n", - __func__); - return 0; - } - - switch (cmd) { - case AFE_CMD_PORT_START: - rc = afe_ops->afe_port_start(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: AFE port start failed\n", - __func__); - break; - case AFE_CMD_PORT_SUSPEND: - rc = afe_ops->afe_port_suspend(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: afe_suspend failed, err = %d\n", - __func__, rc); - break; - case AFE_CMD_PORT_RESUME: - rc = afe_ops->afe_port_resume(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: afe_resume failed, err = %d\n", - __func__, rc); - break; - case AFE_CMD_PORT_STOP: - rc = afe_ops->afe_port_stop(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: afe_stopfailed, err = %d\n", - __func__, rc); - break; - } - - return rc; -} - -static int msm_cpe_lsm_lab_stop(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - struct wcd_cpe_afe_ops *afe_ops; - struct cpe_lsm_session *session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct msm_slim_dma_data *dma_data = NULL; - int rc; - - /* - * the caller is not aware of LAB status and will - * try to stop lab even if it is already stopped. - * return success right away is LAB is already stopped - */ - if (lab_d->thread_status == MSM_LSM_LAB_THREAD_STOP) { - dev_dbg(rtd->dev, - "%s: lab already stopped\n", - __func__); - return 0; - } - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - lsm_ops = &cpe->lsm_ops; - afe_ops = &cpe->afe_ops; - session = lsm_d->lsm_session; - if (rtd->cpu_dai) - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) { - dev_err(rtd->dev, - "%s: dma_data is not set\n", - __func__); - return -EINVAL; - } - - if (lab_d->thread_status == MSM_LSM_LAB_THREAD_RUNNING) { - dev_dbg(rtd->dev, "%s: stopping lab thread\n", - __func__); - rc = kthread_stop(session->lsm_lab_thread); - - /* - * kthread_stop returns EINTR if the thread_fn - * was not scheduled before calling kthread_stop. - * In this case, we dont need to wait for lab - * thread to complete as lab thread will not be - * scheduled at all. - */ - if (rc == -EINTR) - goto done; - - /* Wait for the lab thread to exit */ - rc = wait_for_completion_timeout( - &lab_d->thread_complete, - MSM_CPE_LAB_THREAD_TIMEOUT); - if (!rc) { - dev_err(rtd->dev, - "%s: Wait for lab thread timedout\n", - __func__); - return -ETIMEDOUT; - } - } - - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_PRE_DISABLE); - if (rc) - dev_err(rtd->dev, - "%s: PRE ch teardown failed, err = %d\n", - __func__, rc); - /* continue with teardown even if any intermediate step fails */ - rc = dma_data->dai_channel_ctl(dma_data, rtd->cpu_dai, false); - if (rc) - dev_err(rtd->dev, - "%s: open data failed %d\n", __func__, rc); - dma_data->ph = 0; - - /* - * Even though LAB stop failed, - * output AFE port needs to be stopped - */ - rc = afe_ops->afe_port_stop(cpe->core_handle, - &session->afe_out_port_cfg); - if (rc) - dev_err(rtd->dev, - "%s: AFE out port stop failed, err = %d\n", - __func__, rc); - - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_POST_DISABLE); - if (rc) - dev_err(rtd->dev, - "%s: POST ch teardown failed, err = %d\n", - __func__, rc); - -done: - lab_d->thread_status = MSM_LSM_LAB_THREAD_STOP; - lab_d->buf_idx = 0; - atomic_set(&lab_d->in_count, 0); - lab_d->dma_write = 0; - - return 0; -} - -static int msm_cpe_lab_buf_alloc(struct snd_pcm_substream *substream, - struct cpe_lsm_session *session, - struct msm_slim_dma_data *dma_data) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct cpe_hw_params *hw_params = &lsm_d->hw_params; - struct cpe_data_pcm_buf *pcm_buf = NULL; - int rc = 0; - int dma_alloc = 0; - u32 count = 0; - u32 bufsz, bufcnt; - - if (lab_d->pcm_buf && - lab_d->pcm_buf->mem) { - dev_dbg(rtd->dev, - "%s: LAB buf already allocated\n", - __func__); - goto exit; - } - - bufsz = hw_params->buf_sz; - bufcnt = hw_params->period_count; - - dev_dbg(rtd->dev, - "%s:Buf Size %d Buf count %d\n", - __func__, - bufsz, bufcnt); - - pcm_buf = kzalloc(((sizeof(struct cpe_data_pcm_buf)) * bufcnt), - GFP_KERNEL); - if (!pcm_buf) { - rc = -ENOMEM; - goto exit; - } - - lab_d->pcm_buf = pcm_buf; - dma_alloc = bufsz * bufcnt; - pcm_buf->mem = NULL; - pcm_buf->mem = kzalloc(dma_alloc, GFP_DMA); - if (!pcm_buf->mem) { - rc = -ENOMEM; - goto fail; - } - - pcm_buf->phys = dma_map_single(dma_data->sdev->dev.parent, - pcm_buf->mem, dma_alloc, DMA_BIDIRECTIONAL); - if (dma_mapping_error(dma_data->sdev->dev.parent, pcm_buf->phys)) { - dev_err(rtd->dev, "%s Error mapping DMA buffers\n", __func__); - pcm_buf->phys = (phys_addr_t)NULL; - rc = -EFAULT; - goto fail; - } - - count = 0; - while (count < bufcnt) { - pcm_buf[count].mem = pcm_buf[0].mem + (count * bufsz); - pcm_buf[count].phys = pcm_buf[0].phys + (count * bufsz); - dev_dbg(rtd->dev, - "%s: pcm_buf[%d].mem %pK pcm_buf[%d].phys %pK\n", - __func__, count, - (void *)pcm_buf[count].mem, - count, &(pcm_buf[count].phys)); - count++; - } - - return 0; -fail: - if (pcm_buf && pcm_buf->mem) - kfree(pcm_buf->mem); - kfree(pcm_buf); - lab_d->pcm_buf = NULL; -exit: - return rc; -} - -static int msm_cpe_lab_buf_dealloc(struct snd_pcm_substream *substream, - struct cpe_lsm_session *session, struct msm_slim_dma_data *dma_data) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct cpe_hw_params *hw_params = &lsm_d->hw_params; - int rc = 0; - int dma_alloc = 0; - struct cpe_data_pcm_buf *pcm_buf = NULL; - int bufsz, bufcnt; - - bufsz = hw_params->buf_sz; - bufcnt = hw_params->period_count; - - dev_dbg(rtd->dev, - "%s:Buf Size %d Buf count %d\n", __func__, - bufsz, bufcnt); - - if (bufcnt <= 0 || bufsz <= 0) { - dev_err(rtd->dev, - "%s: Invalid params, bufsz = %u, bufcnt = %u\n", - __func__, bufsz, bufcnt); - return -EINVAL; - } - - pcm_buf = lab_d->pcm_buf; - dma_alloc = bufsz * bufcnt; - if (dma_data && pcm_buf) - if (pcm_buf->phys) - dma_unmap_single(dma_data->sdev->dev.parent, - pcm_buf->phys, dma_alloc, DMA_BIDIRECTIONAL); - if (pcm_buf) - kfree(pcm_buf->mem); - - kfree(pcm_buf); - lab_d->pcm_buf = NULL; - return rc; -} - -/* - * msm_cpe_lab_thread: Initiated on KW detection - * @data: lab data - * - * Start lab thread and call CPE core API for SLIM - * read operations. - */ -static int msm_cpe_lab_thread(void *data) -{ - struct cpe_lsm_data *lsm_d = data; - struct cpe_lsm_session *session = lsm_d->lsm_session; - struct snd_pcm_substream *substream = lsm_d->substream; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct cpe_hw_params *hw_params = &lsm_d->hw_params; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - struct wcd_cpe_afe_ops *afe_ops; - struct cpe_data_pcm_buf *cur_buf, *next_buf; - struct msm_slim_dma_data *dma_data = NULL; - struct snd_soc_pcm_runtime *rtd = NULL; - bool wait_timedout = false; - int rc = 0; - u32 done_len = 0; - u32 buf_count = 0; - u32 prd_cnt; - - allow_signal(SIGKILL); - set_current_state(TASK_INTERRUPTIBLE); - - pr_debug("%s: Lab thread start\n", __func__); - init_completion(&lab_d->comp); - - if (PCM_RUNTIME_CHECK(substream)) { - rc = -EINVAL; - goto done; - } - - if (!cpe || !cpe->core_handle) { - pr_err("%s: Handle to %s is invalid\n", - __func__, - (!cpe) ? "cpe" : "core"); - rc = -EINVAL; - goto done; - } - - rtd = substream->private_data; - if (rtd->cpu_dai) - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) { - pr_err("%s: dma_data is not set\n", __func__); - rc = -EINVAL; - goto done; - } - - lsm_ops = &cpe->lsm_ops; - afe_ops = &cpe->afe_ops; - - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_PRE_ENABLE); - if (rc) { - dev_err(rtd->dev, - "%s: PRE ch setup failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = dma_data->dai_channel_ctl(dma_data, rtd->cpu_dai, true); - if (rc) { - dev_err(rtd->dev, - "%s: open data failed %d\n", __func__, rc); - goto done; - } - - dev_dbg(rtd->dev, "%s: Established data channel\n", - __func__); - - init_waitqueue_head(&lab_d->period_wait); - memset(lab_d->pcm_buf[0].mem, 0, lab_d->pcm_size); - - rc = slim_port_xfer(dma_data->sdev, dma_data->ph, - lab_d->pcm_buf[0].mem, - hw_params->buf_sz, &lab_d->comp); - if (rc) { - dev_err(rtd->dev, - "%s: buf[0] slim_port_xfer failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = slim_port_xfer(dma_data->sdev, dma_data->ph, - lab_d->pcm_buf[1].mem, - hw_params->buf_sz, &lab_d->comp); - if (rc) { - dev_err(rtd->dev, - "%s: buf[0] slim_port_xfer failed, err = %d\n", - __func__, rc); - goto done; - } - - cur_buf = &lab_d->pcm_buf[0]; - next_buf = &lab_d->pcm_buf[2]; - prd_cnt = hw_params->period_count; - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_POST_ENABLE); - if (rc) { - dev_err(rtd->dev, - "%s: POST ch setup failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = afe_ops->afe_port_start(cpe->core_handle, - &session->afe_out_port_cfg); - if (rc) { - dev_err(rtd->dev, - "%s: AFE out port start failed, err = %d\n", - __func__, rc); - goto done; - } - - while (!kthread_should_stop() && - lab_d->thread_status != MSM_LSM_LAB_THREAD_ERROR) { - - rc = slim_port_xfer(dma_data->sdev, dma_data->ph, - next_buf->mem, - hw_params->buf_sz, &lab_d->comp); - if (rc) { - dev_err(rtd->dev, - "%s: slim_port_xfer failed, err = %d\n", - __func__, rc); - lab_d->thread_status = MSM_LSM_LAB_THREAD_ERROR; - } - - rc = wait_for_completion_timeout(&lab_d->comp, (2 * HZ/10)); - if (!rc) { - dev_err(rtd->dev, - "%s: wait timedout for slim buffer\n", - __func__); - wait_timedout = true; - } else { - wait_timedout = false; - } - - rc = slim_port_get_xfer_status(dma_data->sdev, - dma_data->ph, - &cur_buf->phys, &done_len); - if (rc || - (!rc && wait_timedout)) { - dev_err(rtd->dev, - "%s: xfer_status failure, rc = %d, wait_timedout = %s\n", - __func__, rc, - (wait_timedout ? "true" : "false")); - lab_d->thread_status = MSM_LSM_LAB_THREAD_ERROR; - } - - if (done_len || - ((!done_len) && - lab_d->thread_status == MSM_LSM_LAB_THREAD_ERROR)) { - atomic_inc(&lab_d->in_count); - lab_d->dma_write += snd_pcm_lib_period_bytes(substream); - snd_pcm_period_elapsed(substream); - wake_up(&lab_d->period_wait); - buf_count++; - - cur_buf = &lab_d->pcm_buf[buf_count % prd_cnt]; - next_buf = &lab_d->pcm_buf[(buf_count + 2) % prd_cnt]; - dev_dbg(rtd->dev, - "%s: Cur buf.mem = %pK Next Buf.mem = %pK\n" - " buf count = 0x%x\n", __func__, - cur_buf->mem, next_buf->mem, buf_count); - } else { - dev_err(rtd->dev, - "%s: SB get status, invalid len = 0x%x\n", - __func__, done_len); - } - done_len = 0; - } - -done: - if (rc) - lab_d->thread_status = MSM_LSM_LAB_THREAD_ERROR; - pr_debug("%s: Exit lab_thread, exit_status=%d, thread_status=%d\n", - __func__, rc, lab_d->thread_status); - complete(&lab_d->thread_complete); - - return 0; -} - -/* - * msm_cpe_lsm_open: ASoC call to open the stream - * @substream: substream that is to be opened - * - * Create session data for lsm session and open the lsm session - * on CPE. - */ -static int msm_cpe_lsm_open(struct snd_pcm_substream *substream) -{ - struct cpe_lsm_data *lsm_d; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - int rc = 0; - - if (!cpe || !cpe->codec) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - runtime->hw = msm_pcm_hardware_listen; - - rc = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (rc < 0) { - pr_err("snd_pcm_hw_constraint_list failed rc %d\n", rc); - return -EINVAL; - } - - /* Ensure that buffer size is a multiple of period size */ - rc = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (rc < 0) { - pr_err("%s: Unable to set pcm_param_periods, rc %d\n", - __func__, rc); - return -EINVAL; - } - - rc = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - LISTEN_MIN_NUM_PERIODS * LISTEN_MIN_PERIOD_SIZE, - LISTEN_MAX_NUM_PERIODS * LISTEN_MAX_PERIOD_SIZE); - if (rc < 0) { - pr_err("%s: Unable to set pcm constraints, rc %d\n", - __func__, rc); - return -EINVAL; - } - - cpe->core_handle = wcd_cpe_get_core_handle(cpe->codec); - - if (!cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid handle to codec core\n", - __func__); - return -EINVAL; - } - - lsm_ops = &cpe->lsm_ops; - lsm_d = kzalloc(sizeof(struct cpe_lsm_data), GFP_KERNEL); - if (!lsm_d) { - dev_err(rtd->dev, - "%s: ENOMEM for lsm session, size = %zd\n", - __func__, sizeof(struct cpe_lsm_data)); - rc = -ENOMEM; - goto fail_return; - } - mutex_init(&lsm_d->lsm_api_lock); - - lsm_d->lsm_session = lsm_ops->lsm_alloc_session(cpe->core_handle, - lsm_d, msm_cpe_process_event_status); - if (!lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: session allocation failed", - __func__); - rc = -EINVAL; - goto fail_session_alloc; - } - /* Explicitly Assign the LAB thread to STOP state */ - lsm_d->lab.thread_status = MSM_LSM_LAB_THREAD_STOP; - lsm_d->lsm_session->started = false; - lsm_d->substream = substream; - init_waitqueue_head(&lsm_d->lab.period_wait); - lsm_d->cpe_prepared = false; - - dev_dbg(rtd->dev, "%s: allocated session with id = %d\n", - __func__, lsm_d->lsm_session->id); - - - rc = lsm_ops->lsm_open_tx(cpe->core_handle, lsm_d->lsm_session, - LSM_VOICE_WAKEUP_APP_V2, 16000); - if (rc < 0) { - dev_err(rtd->dev, - "%s: OPEN_TX cmd failed, err = %d\n", - __func__, rc); - goto fail_open_tx; - } - - init_waitqueue_head(&lsm_d->event_wait); - atomic_set(&lsm_d->event_avail, 0); - atomic_set(&lsm_d->event_stop, 0); - runtime->private_data = lsm_d; - - return 0; - -fail_open_tx: - lsm_ops->lsm_dealloc_session(cpe->core_handle, lsm_d->lsm_session); - -fail_session_alloc: - mutex_destroy(&lsm_d->lsm_api_lock); - kfree(lsm_d); -fail_return: - return rc; -} - -/* - * msm_cpe_lsm_close: ASoC call to close/cleanup the stream - * @substream: substream that is to be closed - * - * Deallocate the session and release the AFE port. It is not - * required to deregister the sound model as long as we close - * the lsm session on CPE. - */ -static int msm_cpe_lsm_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - struct cpe_lsm_session *session; - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *afe_cfg; - int rc = 0; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - lsm_ops = &cpe->lsm_ops; - session = lsm_d->lsm_session; - afe_ops = &cpe->afe_ops; - afe_cfg = &(lsm_d->lsm_session->afe_port_cfg); - - /* - * If driver is closed without stopping LAB, - * explicitly stop LAB before cleaning up the - * driver resources. - */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to stop lab, error = %d\n", - __func__, rc); - return rc; - } - - rc = msm_cpe_afe_port_cntl(substream, - cpe->core_handle, - afe_ops, afe_cfg, - AFE_CMD_PORT_STOP); - - lsm_d->cpe_prepared = false; - - rc = lsm_ops->lsm_close_tx(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: lsm_close fail, err = %d\n", - __func__, rc); - return rc; - } - - lsm_ops->lsm_dealloc_session(cpe->core_handle, session); - runtime->private_data = NULL; - mutex_destroy(&lsm_d->lsm_api_lock); - kfree(lsm_d); - - return rc; -} - -static int msm_cpe_lsm_get_conf_levels( - struct cpe_lsm_session *session, - u8 *conf_levels_ptr) -{ - int rc = 0; - - if (session->num_confidence_levels <= 0) { - pr_debug("%s: conf_levels (%u), skip set params\n", - __func__, - session->num_confidence_levels); - goto done; - } - - session->conf_levels = kzalloc(session->num_confidence_levels, - GFP_KERNEL); - if (!session->conf_levels) { - rc = -ENOMEM; - goto done; - } - - if (copy_from_user(session->conf_levels, - conf_levels_ptr, - session->num_confidence_levels)) { - pr_err("%s: copy_from_user failed for confidence levels %u\n", - __func__, session->num_confidence_levels); - kfree(session->conf_levels); - session->conf_levels = NULL; - rc = -EFAULT; - goto done; - } - -done: - return rc; -} - -static int msm_cpe_lsm_validate_out_format( - struct snd_pcm_substream *substream, - struct snd_lsm_output_format_cfg *cfg) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (!cfg) { - dev_err(rtd->dev, - "%s: Invalid lsm out cfg\n", __func__); - rc = -EINVAL; - goto done; - } - - if (cfg->format != LSM_OUT_FORMAT_PCM && - cfg->format != LSM_OUT_FORMAT_ADPCM) { - dev_err(rtd->dev, - "%s: Invalid format %u\n", - __func__, cfg->format); - rc = -EINVAL; - goto done; - } - - if (cfg->packing != LSM_OUT_DATA_RAW && - cfg->packing != LSM_OUT_DATA_PACKED) { - dev_err(rtd->dev, - "%s: Invalid packing method %u\n", - __func__, cfg->packing); - rc = -EINVAL; - goto done; - } - - if (cfg->events != LSM_OUT_DATA_EVENTS_DISABLED && - cfg->events != LSM_OUT_DATA_EVENTS_ENABLED) { - dev_err(rtd->dev, - "%s: Invalid events provided %u\n", - __func__, cfg->events); - rc = -EINVAL; - goto done; - } - - if (cfg->mode != LSM_OUT_TRANSFER_MODE_RT && - cfg->mode != LSM_OUT_TRANSFER_MODE_FTRT) { - dev_err(rtd->dev, - "%s: Invalid transfer mode %u\n", - __func__, cfg->mode); - rc = -EINVAL; - goto done; - } - -done: - return rc; -} - -/* - * msm_cpe_lsm_ioctl_shared: Shared IOCTL for this platform driver - * @substream: ASoC substream for which the operation is invoked - * @cmd: command for the ioctl - * @arg: argument for the ioctl - * - * Perform dedicated listen functions like register sound model, - * deregister sound model, etc - * Called with lsm_api_lock acquired. - */ -static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_lsm_sound_model_v2 snd_model; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_session *session; - struct wcd_cpe_lsm_ops *lsm_ops; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct msm_slim_dma_data *dma_data = NULL; - struct snd_lsm_detection_params det_params; - int rc = 0; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - switch (cmd) { - case SNDRV_LSM_STOP_LAB: - dev_dbg(rtd->dev, - "%s: %s, lab_enable = %d, lab_thread_ststus = %d\n", - __func__, "SNDRV_LSM_STOP_LAB", - session->lab_enable, - lab_d->thread_status); - - if (session->lab_enable && - lab_d->thread_status != MSM_LSM_LAB_THREAD_STOP) { - atomic_inc(&lab_d->abort_read); - wake_up(&lab_d->period_wait); - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: stop LAB failed, error = %d\n", - __func__, rc); - return rc; - } - } else if (!session->lab_enable) { - dev_dbg(rtd->dev, - "%s: LAB already stopped\n", - __func__); - } - - break; - - case SNDRV_LSM_LAB_CONTROL: - if (copy_from_user(&session->lab_enable, (void *)arg, - sizeof(u32))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size %zd\n", - __func__, sizeof(u32)); - return -EFAULT; - } - - dev_dbg(rtd->dev, - "%s: %s, lab_enable = %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", - session->lab_enable); - if (rtd->cpu_dai) - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) { - dev_err(rtd->dev, - "%s: dma_data is not set\n", __func__); - return -EINVAL; - } - - if (session->lab_enable) { - rc = msm_cpe_lab_buf_alloc(substream, - session, dma_data); - if (rc < 0) { - dev_err(rtd->dev, - "%s: lab buffer alloc failed, err = %d\n", - __func__, rc); - return rc; - } - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = lab_d->pcm_buf[0].mem; - dma_buf->addr = lab_d->pcm_buf[0].phys; - dma_buf->bytes = (lsm_d->hw_params.buf_sz * - lsm_d->hw_params.period_count); - init_completion(&lab_d->thread_complete); - snd_pcm_set_runtime_buffer(substream, - &substream->dma_buffer); - rc = lsm_ops->lsm_lab_control(cpe->core_handle, - session, true); - if (rc < 0) { - dev_err(rtd->dev, - "%s: Lab Enable Failed rc %d\n", - __func__, rc); - return rc; - } - } else { - /* - * It is possible that lab is still enabled - * when trying to de-allocate the lab buffer. - * Make sure to disable lab before de-allocating - * the lab buffer. - */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc < 0) { - dev_err(rtd->dev, - "%s: LAB stop failed, error = %d\n", - __func__, rc); - return rc; - } - /* - * Buffer has to be de-allocated even if - * lab_control failed. - */ - rc = msm_cpe_lab_buf_dealloc(substream, - session, dma_data); - if (rc < 0) { - dev_err(rtd->dev, - "%s: lab buffer free failed, err = %d\n", - __func__, rc); - return rc; - } - } - break; - case SNDRV_LSM_REG_SND_MODEL_V2: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_REG_SND_MODEL_V2"); - - memcpy(&snd_model, arg, - sizeof(struct snd_lsm_sound_model_v2)); - - session->num_confidence_levels = - snd_model.num_confidence_levels; - rc = msm_cpe_lsm_get_conf_levels(session, - snd_model.confidence_level); - if (rc) { - dev_err(rtd->dev, - "%s: %s get_conf_levels fail, err = %d\n", - __func__, "SNDRV_LSM_REG_SND_MODEL_V2", - rc); - break; - } - - session->snd_model_data = kzalloc(snd_model.data_size, - GFP_KERNEL); - if (!session->snd_model_data) { - kfree(session->conf_levels); - session->conf_levels = NULL; - return -ENOMEM; - } - session->snd_model_size = snd_model.data_size; - - if (copy_from_user(session->snd_model_data, - snd_model.data, snd_model.data_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for snd_model\n", - __func__); - kfree(session->conf_levels); - kfree(session->snd_model_data); - session->conf_levels = NULL; - session->snd_model_data = NULL; - return -EFAULT; - } - - rc = lsm_ops->lsm_shmem_alloc(cpe->core_handle, session, - session->snd_model_size); - if (rc != 0) { - dev_err(rtd->dev, - "%s: shared memory allocation failed, err = %d\n", - __func__, rc); - kfree(session->snd_model_data); - kfree(session->conf_levels); - session->snd_model_data = NULL; - session->conf_levels = NULL; - return rc; - } - - rc = lsm_ops->lsm_register_snd_model(cpe->core_handle, session, - snd_model.detection_mode, - snd_model.detect_failure); - if (rc != 0) { - dev_err(rtd->dev, - "%s: snd_model_reg failed, err = %d\n", - __func__, rc); - lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); - kfree(session->snd_model_data); - kfree(session->conf_levels); - session->snd_model_data = NULL; - session->conf_levels = NULL; - return rc; - } - - break; - - case SNDRV_LSM_DEREG_SND_MODEL: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_DEREG_SND_MODEL"); - - if (session->lab_enable) { - /* - * It is possible that lab is still enabled - * when trying to deregister sound model. - * Make sure to disable lab before de-allocating - * the lab buffer. - */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: LAB stop failed, error = %d\n", - __func__, rc); - return rc; - } - - rc = lsm_ops->lsm_lab_control(cpe->core_handle, - session, false); - if (rc) - dev_err(rtd->dev, - "%s: Lab Disable Failed rc %d\n", - __func__, rc); - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) - dev_err(rtd->dev, - "%s: dma_data is not set\n", __func__); - - /* - * Buffer has to be de-allocated even if - * lab_control failed and/or dma data is invalid. - */ - rc = msm_cpe_lab_buf_dealloc(substream, - session, dma_data); - if (rc < 0) - dev_err(rtd->dev, - "%s: lab buffer free failed, err = %d\n", - __func__, rc); - } - - rc = lsm_ops->lsm_deregister_snd_model( - cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: snd_model de-reg failed, err = %d\n", - __func__, rc); - return rc; - } - - kfree(session->snd_model_data); - kfree(session->conf_levels); - session->snd_model_data = NULL; - session->conf_levels = NULL; - - rc = lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: LSM shared memory dealloc failed, err = %d\n", - __func__, rc); - return rc; - } - - break; - - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status *user; - struct snd_lsm_event_status_v3 *user_v3; - - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_EVENT_STATUS(_V3)"); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, - "SNDRV_LSM_EVENT_STATUS(_V3)"); - return -EINVAL; - } - - /* - * Release the api lock before wait to allow - * other IOCTLs to be invoked while waiting - * for event - */ - MSM_CPE_LSM_REL_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - rc = wait_event_freezable(lsm_d->event_wait, - (atomic_read(&lsm_d->event_avail) == 1) || - (atomic_read(&lsm_d->event_stop) == 1)); - - MSM_CPE_LSM_GRAB_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - if (!rc) { - if (atomic_read(&lsm_d->event_avail) == 1) { - rc = 0; - atomic_set(&lsm_d->event_avail, 0); - - if (cmd == SNDRV_LSM_EVENT_STATUS) { - user = arg; - if (lsm_d->ev_det_pld_size > - user->payload_size) { - dev_err(rtd->dev, - "%s: avail pld_bytes = %u, needed = %u\n", - __func__, - user->payload_size, - lsm_d->ev_det_pld_size); - return -EINVAL; - } - - user->status = lsm_d->ev_det_status; - user->payload_size = - lsm_d->ev_det_pld_size; - memcpy(user->payload, - lsm_d->ev_det_payload, - lsm_d->ev_det_pld_size); - } else { - user_v3 = arg; - if (lsm_d->ev_det_pld_size > - user_v3->payload_size) { - dev_err(rtd->dev, - "%s: avail pld_bytes = %u, needed = %u\n", - __func__, - user_v3->payload_size, - lsm_d->ev_det_pld_size); - return -EINVAL; - } - /* event status timestamp not supported - * on CPE mode. Set msw and lsw to 0. - */ - user_v3->timestamp_lsw = 0; - user_v3->timestamp_msw = 0; - user_v3->status = lsm_d->ev_det_status; - user_v3->payload_size = - lsm_d->ev_det_pld_size; - memcpy(user_v3->payload, - lsm_d->ev_det_payload, - lsm_d->ev_det_pld_size); - } - } else if (atomic_read(&lsm_d->event_stop) == 1) { - dev_dbg(rtd->dev, - "%s: wait_aborted\n", __func__); - if (cmd == SNDRV_LSM_EVENT_STATUS) { - user = arg; - user->payload_size = 0; - } else { - user_v3 = arg; - user_v3->payload_size = 0; - } - rc = 0; - } - } - } - break; - - case SNDRV_LSM_ABORT_EVENT: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_ABORT_EVENT"); - atomic_set(&lsm_d->event_stop, 1); - wake_up(&lsm_d->event_wait); - break; - - case SNDRV_LSM_START: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_START"); - rc = lsm_ops->lsm_start(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: lsm_start fail, err = %d\n", - __func__, rc); - return rc; - } - session->started = true; - break; - - case SNDRV_LSM_STOP: - dev_dbg(rtd->dev, - "%s: %s, lab_enable = %d, lab_thread_status = %d\n", - __func__, "SNDRV_LSM_STOP", - session->lab_enable, - lab_d->thread_status); - if ((session->lab_enable && - lab_d->thread_status == - MSM_LSM_LAB_THREAD_RUNNING)) { - /* Explicitly stop LAB */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: lab_stop failed, err = %d\n", - __func__, rc); - return rc; - } - } - - rc = lsm_ops->lsm_stop(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: lsm_stop fail err = %d\n", - __func__, rc); - - return rc; - } - session->started = false; - break; - - case SNDRV_LSM_SET_PARAMS: - memcpy(&det_params, arg, - sizeof(det_params)); - if (det_params.num_confidence_levels <= 0) { - dev_err(rtd->dev, - "%s: %s: Invalid confidence levels %u\n", - __func__, "SNDRV_LSM_SET_PARAMS", - det_params.num_confidence_levels); - return -EINVAL; - } - - session->num_confidence_levels = - det_params.num_confidence_levels; - rc = msm_cpe_lsm_get_conf_levels(session, - det_params.conf_level); - if (rc) { - dev_err(rtd->dev, - "%s: %s get_conf_levels fail, err = %d\n", - __func__, "SNDRV_LSM_SET_PARAMS", - rc); - break; - } - - rc = lsm_ops->lsm_set_data(cpe->core_handle, session, - det_params.detect_mode, - det_params.detect_failure); - if (rc) { - dev_err(rtd->dev, - "%s: lsm_set_data failed, err = %d\n", - __func__, rc); - return rc; - } - - kfree(session->conf_levels); - session->conf_levels = NULL; - - break; - - case SNDRV_LSM_OUT_FORMAT_CFG: { - struct snd_lsm_output_format_cfg u_fmt_cfg; - - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, "SNDRV_LSM_OUT_FORMAT_CFG"); - return -EINVAL; - } - - if (copy_from_user(&u_fmt_cfg, arg, - sizeof(u_fmt_cfg))) { - dev_err(rtd->dev, - "%s: copy_from_user failed for out_fmt_cfg\n", - __func__); - return -EFAULT; - } - - if (msm_cpe_lsm_validate_out_format(substream, - &u_fmt_cfg)) - return -EINVAL; - - session->out_fmt_cfg.format = u_fmt_cfg.format; - session->out_fmt_cfg.pack_mode = u_fmt_cfg.packing; - session->out_fmt_cfg.data_path_events = - u_fmt_cfg.events; - session->out_fmt_cfg.transfer_mode = u_fmt_cfg.mode; - - rc = lsm_ops->lsm_set_fmt_cfg(cpe->core_handle, - session); - if (rc) { - dev_err(rtd->dev, - "%s: lsm_set_fmt_cfg failed, err = %d\n", - __func__, rc); - return rc; - } - } - break; - - case SNDRV_LSM_SET_PORT: { - u32 port_id = cpe->input_port_id; - - dev_dbg(rtd->dev, "%s: %s\n", __func__, "SNDRV_LSM_SET_PORT"); - rc = lsm_ops->lsm_set_port(cpe->core_handle, session, &port_id); - if (rc) { - dev_err(rtd->dev, - "%s: lsm_set_port failed, err = %d\n", - __func__, rc); - return rc; - } - } - break; - - default: - dev_dbg(rtd->dev, - "%s: Default snd_lib_ioctl cmd 0x%x\n", - __func__, cmd); - rc = snd_pcm_lib_ioctl(substream, cmd, arg); - } - - return rc; -} - -static int msm_cpe_lsm_lab_start(struct snd_pcm_substream *substream, - u16 event_det_status) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct cpe_lsm_lab *lab_d = NULL; - struct cpe_hw_params *hw_params; - struct wcd_cpe_lsm_ops *lsm_ops; - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *out_port; - int rc; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - __func__, substream); - return -EINVAL; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - lab_d = &lsm_d->lab; - afe_ops = &cpe->afe_ops; - hw_params = &lsm_d->hw_params; - - if (!session->started) { - dev_dbg(rtd->dev, - "%s: Session is stopped, cannot start LAB\n", - __func__); - return 0; - } - - reinit_completion(&lab_d->thread_complete); - - if (session->lab_enable && - event_det_status == - LSM_VOICE_WAKEUP_STATUS_DETECTED) { - out_port = &session->afe_out_port_cfg; - out_port->port_id = session->afe_out_port_id; - out_port->bit_width = hw_params->sample_size; - out_port->num_channels = hw_params->channels; - out_port->sample_rate = hw_params->sample_rate; - dev_dbg(rtd->dev, "%s: port_id= %u, bit_width= %u, rate= %u\n", - __func__, out_port->port_id, out_port->bit_width, - out_port->sample_rate); - - rc = afe_ops->afe_port_cmd_cfg(cpe->core_handle, - out_port); - if (rc) { - dev_err(rtd->dev, - "%s: Failed afe generic config v2, err = %d\n", - __func__, rc); - return rc; - } - - atomic_set(&lab_d->abort_read, 0); - dev_dbg(rtd->dev, - "%s: KW detected, scheduling LAB thread\n", - __func__); - - /* - * Even though thread might be only scheduled and - * not currently running, mark the internal driver - * status to running so driver can cancel this thread - * if it needs to before the thread gets chance to run. - */ - lab_d->thread_status = MSM_LSM_LAB_THREAD_RUNNING; - session->lsm_lab_thread = kthread_run( - msm_cpe_lab_thread, - lsm_d, - "lab_thread"); - } - - return 0; -} - -static bool msm_cpe_lsm_is_valid_stream(struct snd_pcm_substream *substream, - const char *func) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - func, substream); - return false; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - func); - return false; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - func); - return false; - } - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (!lsm_ops) { - dev_err(rtd->dev, - "%s: Invalid lsm_ops\n", func); - return false; - } - - return true; -} - -static int msm_cpe_lsm_set_epd(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - struct snd_lsm_ep_det_thres epd_thres; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size != sizeof(epd_thres)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&epd_thres, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, &epd_thres, - LSM_ENDPOINT_DETECT_THRESHOLD); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(epd_threshold) failed, rc %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_cpe_lsm_set_mode(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - struct snd_lsm_detect_mode det_mode; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size != sizeof(det_mode)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&det_mode, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, &det_mode, - LSM_OPERATION_MODE); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(epd_threshold) failed, rc %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_cpe_lsm_set_gain(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - struct snd_lsm_gain gain; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size != sizeof(gain)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&gain, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, &gain, - LSM_GAIN); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(epd_threshold) failed, rc %d\n", - __func__, rc); -done: - return rc; - -} - -static int msm_cpe_lsm_set_conf(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - session->num_confidence_levels = - p_info->param_size; - rc = msm_cpe_lsm_get_conf_levels(session, - p_info->param_data); - if (rc) { - dev_err(rtd->dev, - "%s: get_conf_levels failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, NULL, - LSM_MIN_CONFIDENCE_LEVELS); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(conf_levels) failed, rc %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_cpe_lsm_reg_model(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - int rc; - size_t offset; - u8 *snd_model_ptr; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - lsm_ops->lsm_get_snd_model_offset(cpe->core_handle, - session, &offset); - /* Check if 'p_info->param_size + offset' crosses U32_MAX. */ - if (p_info->param_size > U32_MAX - offset) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - return -EINVAL; - } - session->snd_model_size = p_info->param_size + offset; - - session->snd_model_data = vzalloc(session->snd_model_size); - if (!session->snd_model_data) - return -ENOMEM; - - snd_model_ptr = ((u8 *) session->snd_model_data) + offset; - - if (copy_from_user(snd_model_ptr, - p_info->param_data, p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user for snd_model failed\n", - __func__); - rc = -EFAULT; - goto free_snd_model_data; - } - - rc = lsm_ops->lsm_shmem_alloc(cpe->core_handle, session, - session->snd_model_size); - if (rc != 0) { - dev_err(rtd->dev, - "%s: shared memory allocation failed, err = %d\n", - __func__, rc); - rc = -EINVAL; - goto free_snd_model_data; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, NULL, - LSM_REG_SND_MODEL); - if (unlikely(rc)) { - dev_err(rtd->dev, - "%s: set_one_param(snd_model) failed, rc %d\n", - __func__, rc); - goto dealloc_shmem; - } - return 0; - -dealloc_shmem: - lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); - -free_snd_model_data: - vfree(session->snd_model_data); - return rc; -} - -static int msm_cpe_lsm_dereg_model(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, NULL, - LSM_DEREG_SND_MODEL); - if (rc) - dev_err(rtd->dev, - "%s: dereg_snd_model failed\n", - __func__); - return lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); -} - -static int msm_cpe_lsm_set_custom(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - u8 *data; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size > MSM_CPE_MAX_CUSTOM_PARAM_SIZE) { - dev_err(rtd->dev, - "%s: invalid size %d, max allowed %d\n", - __func__, p_info->param_size, - MSM_CPE_MAX_CUSTOM_PARAM_SIZE); - return -EINVAL; - } - - data = kzalloc(p_info->param_size, GFP_KERNEL); - if (!data) - return -ENOMEM; - - if (copy_from_user(data, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for custom params, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto err_ret; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, data, - LSM_CUSTOM_PARAMS); - if (rc) - dev_err(rtd->dev, - "%s: custom_params failed, err = %d\n", - __func__, rc); -err_ret: - kfree(data); - return rc; -} - -static int msm_cpe_lsm_process_params(struct snd_pcm_substream *substream, - struct snd_lsm_module_params *p_data, - void *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct lsm_params_info *p_info; - int i; - int rc = 0; - - p_info = (struct lsm_params_info *) params; - - for (i = 0; i < p_data->num_params; i++) { - dev_dbg(rtd->dev, - "%s: param (%d), module_id = 0x%x, param_id = 0x%x, param_size = 0x%x, param_type = 0x%x\n", - __func__, i, p_info->module_id, - p_info->param_id, p_info->param_size, - p_info->param_type); - - switch (p_info->param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: - rc = msm_cpe_lsm_set_epd(substream, p_info); - break; - case LSM_OPERATION_MODE: - rc = msm_cpe_lsm_set_mode(substream, p_info); - break; - case LSM_GAIN: - rc = msm_cpe_lsm_set_gain(substream, p_info); - break; - case LSM_MIN_CONFIDENCE_LEVELS: - rc = msm_cpe_lsm_set_conf(substream, p_info); - break; - case LSM_REG_SND_MODEL: - rc = msm_cpe_lsm_reg_model(substream, p_info); - break; - case LSM_DEREG_SND_MODEL: - rc = msm_cpe_lsm_dereg_model(substream, p_info); - break; - case LSM_CUSTOM_PARAMS: - rc = msm_cpe_lsm_set_custom(substream, p_info); - break; - default: - dev_err(rtd->dev, - "%s: Invalid param_type %d\n", - __func__, p_info->param_type); - rc = -EINVAL; - break; - } - if (rc) { - pr_err("%s: set_param fail for param_type %d\n", - __func__, p_info->param_type); - return rc; - } - - p_info++; - } - - return rc; -} - -static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - struct snd_soc_pcm_runtime *rtd; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - __func__, substream); - return -EINVAL; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - MSM_CPE_LSM_GRAB_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - switch (cmd) { - case SNDRV_LSM_REG_SND_MODEL_V2: { - struct snd_lsm_sound_model_v2 snd_model; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "LSM_REG_SND_MODEL_V2"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&snd_model, (void *)arg, - sizeof(struct snd_lsm_sound_model_v2))) { - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_sound_model_v2)); - err = -EFAULT; - goto done; - } - - err = msm_cpe_lsm_ioctl_shared(substream, cmd, - &snd_model); - } - break; - case SNDRV_LSM_EVENT_STATUS: { - struct snd_lsm_event_status u_event_status; - struct snd_lsm_event_status *event_status = NULL; - int u_pld_size = 0; - - if (copy_from_user(&u_event_status, (void *)arg, - sizeof(struct snd_lsm_event_status))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status)); - err = -EFAULT; - goto done; - } - - if (u_event_status.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status) + - u_event_status.payload_size; - - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - } - - if (!err && copy_to_user(arg, event_status, u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - } - break; - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status_v3 u_event_status; - struct snd_lsm_event_status_v3 *event_status = NULL; - int u_pld_size = 0; - - if (copy_from_user(&u_event_status, (void *)arg, - sizeof(struct snd_lsm_event_status_v3))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status_v3)); - err = -EFAULT; - goto done; - } - - if (u_event_status.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status_v3) + - u_event_status.payload_size; - - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - } - - if (!err && copy_to_user(arg, event_status, u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - } - break; - case SNDRV_LSM_SET_PARAMS: { - struct snd_lsm_detection_params det_params; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&det_params, (void *) arg, - sizeof(det_params))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS", - sizeof(det_params)); - err = -EFAULT; - goto done; - } - - err = msm_cpe_lsm_ioctl_shared(substream, cmd, - &det_params); - } - break; - - case SNDRV_LSM_SET_MODULE_PARAMS: { - struct snd_lsm_module_params p_data; - size_t p_size; - u8 *params; - - if (!session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS"); - err = -EINVAL; - goto done; - } - - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data, arg, - sizeof(p_data))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "p_data", sizeof(p_data)); - err = -EFAULT; - goto done; - } - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS", - p_data.num_params); - err = -EINVAL; - goto done; - } - - p_size = p_data.num_params * - sizeof(struct lsm_params_info); - - if (p_data.data_size != p_size) { - dev_err(rtd->dev, - "%s: %s: Invalid size %zd\n", - __func__, "SET_MODULE_PARAMS", p_size); - - err = -EFAULT; - goto done; - } - - params = kzalloc(p_size, GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "params", p_data.data_size); - kfree(params); - err = -EFAULT; - goto done; - } - - err = msm_cpe_lsm_process_params(substream, &p_data, params); - if (err) - dev_err(rtd->dev, - "%s: %s: Failed to set params, err = %d\n", - __func__, "SET_MODULE_PARAMS", err); - kfree(params); - break; - } - default: - err = msm_cpe_lsm_ioctl_shared(substream, cmd, arg); - break; - } - -done: - MSM_CPE_LSM_REL_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - return err; -} - -#ifdef CONFIG_COMPAT -struct snd_lsm_sound_model_v2_32 { - compat_uptr_t data; - compat_uptr_t confidence_level; - u32 data_size; - enum lsm_detection_mode detection_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct snd_lsm_detection_params_32 { - compat_uptr_t conf_level; - enum lsm_detection_mode detect_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct lsm_params_info_32 { - u32 module_id; - u32 param_id; - u32 param_size; - compat_uptr_t param_data; - uint32_t param_type; -}; - -struct snd_lsm_module_params_32 { - compat_uptr_t params; - u32 num_params; - u32 data_size; -}; - -enum { - SNDRV_LSM_REG_SND_MODEL_V2_32 = - _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), - SNDRV_LSM_SET_PARAMS32 = - _IOW('U', 0x0A, struct snd_lsm_detection_params_32), - SNDRV_LSM_SET_MODULE_PARAMS_32 = - _IOW('U', 0x0B, struct snd_lsm_module_params_32), -}; - -static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - struct snd_soc_pcm_runtime *rtd; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - __func__, substream); - return -EINVAL; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - MSM_CPE_LSM_GRAB_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - switch (cmd) { - case SNDRV_LSM_REG_SND_MODEL_V2_32: { - struct snd_lsm_sound_model_v2 snd_model; - struct snd_lsm_sound_model_v2_32 snd_model32; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "LSM_REG_SND_MODEL_V2_32"); - err = -EINVAL; - goto done; - } - - dev_dbg(rtd->dev, - "%s: ioctl %s\n", __func__, - "SNDRV_LSM_REG_SND_MODEL_V2_32"); - - if (copy_from_user(&snd_model32, (void *)arg, - sizeof(snd_model32))) { - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, - sizeof(snd_model32)); - err = -EFAULT; - goto done; - } - - snd_model.data = compat_ptr(snd_model32.data); - snd_model.confidence_level = - compat_ptr(snd_model32.confidence_level); - snd_model.data_size = snd_model32.data_size; - snd_model.detect_failure = snd_model32.detect_failure; - snd_model.num_confidence_levels = - snd_model32.num_confidence_levels; - snd_model.detection_mode = snd_model32.detection_mode; - - cmd = SNDRV_LSM_REG_SND_MODEL_V2; - err = msm_cpe_lsm_ioctl_shared(substream, cmd, &snd_model); - if (err) - dev_err(rtd->dev, - "%s: %s failed, error = %d\n", - __func__, - "SNDRV_LSM_REG_SND_MODEL_V2_32", - err); - } - break; - case SNDRV_LSM_EVENT_STATUS: { - struct snd_lsm_event_status *event_status = NULL; - struct snd_lsm_event_status u_event_status32; - struct snd_lsm_event_status *udata_32 = NULL; - int u_pld_size = 0; - - dev_dbg(rtd->dev, - "%s: ioctl %s\n", __func__, - "SNDRV_LSM_EVENT_STATUS32"); - - if (copy_from_user(&u_event_status32, (void *)arg, - sizeof(struct snd_lsm_event_status))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status)); - err = -EFAULT; - goto done; - } - - if (u_event_status32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status) + - u_event_status32.payload_size; - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - dev_err(rtd->dev, - "%s: No memory for event status\n", - __func__); - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status32.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - if (err) - dev_err(rtd->dev, - "%s: %s failed, error = %d\n", - __func__, - "SNDRV_LSM_EVENT_STATUS32", - err); - } - - if (!err) { - udata_32 = kzalloc(u_pld_size, GFP_KERNEL); - if (!udata_32) { - dev_err(rtd->dev, - "%s: nomem for udata\n", - __func__); - err = -EFAULT; - } else { - udata_32->status = event_status->status; - udata_32->payload_size = - event_status->payload_size; - memcpy(udata_32->payload, - event_status->payload, - u_pld_size); - } - } - - if (!err && copy_to_user(arg, udata_32, - u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - kfree(udata_32); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - kfree(udata_32); - } - break; - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status_v3 *event_status = NULL; - struct snd_lsm_event_status_v3 u_event_status32; - struct snd_lsm_event_status_v3 *udata_32 = NULL; - int u_pld_size = 0; - - dev_dbg(rtd->dev, - "%s: ioctl %s\n", __func__, - "SNDRV_LSM_EVENT_STATUS_V3_32"); - - if (copy_from_user(&u_event_status32, (void *)arg, - sizeof(struct snd_lsm_event_status_v3))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status_v3)); - err = -EFAULT; - goto done; - } - - if (u_event_status32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status_v3) + - u_event_status32.payload_size; - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - dev_err(rtd->dev, - "%s: No memory for event status\n", - __func__); - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status32.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - if (err) - dev_err(rtd->dev, - "%s: %s failed, error = %d\n", - __func__, - "SNDRV_LSM_EVENT_STATUS_V3_32", - err); - } - - if (!err) { - udata_32 = kzalloc(u_pld_size, GFP_KERNEL); - if (!udata_32) { - dev_err(rtd->dev, - "%s: nomem for udata\n", - __func__); - err = -EFAULT; - } else { - udata_32->timestamp_lsw = - event_status->timestamp_lsw; - udata_32->timestamp_msw = - event_status->timestamp_msw; - udata_32->status = event_status->status; - udata_32->payload_size = - event_status->payload_size; - memcpy(udata_32->payload, - event_status->payload, - u_pld_size); - } - } - - if (!err && copy_to_user(arg, udata_32, - u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - kfree(udata_32); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - kfree(udata_32); - } - break; - case SNDRV_LSM_SET_PARAMS32: { - struct snd_lsm_detection_params_32 det_params32; - struct snd_lsm_detection_params det_params; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SNDRV_LSM_SET_PARAMS32"); - - err = -EINVAL; - goto done; - } - - if (copy_from_user(&det_params32, arg, - sizeof(det_params32))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS_32", - sizeof(det_params32)); - } else { - det_params.conf_level = - compat_ptr(det_params32.conf_level); - det_params.detect_mode = - det_params32.detect_mode; - det_params.num_confidence_levels = - det_params32.num_confidence_levels; - det_params.detect_failure = - det_params32.detect_failure; - cmd = SNDRV_LSM_SET_PARAMS; - err = msm_cpe_lsm_ioctl_shared(substream, cmd, - &det_params); - if (err) - dev_err(rtd->dev, - "%s: ioctl %s failed\n", __func__, - "SNDRV_LSM_SET_PARAMS"); - } - - break; - } - - case SNDRV_LSM_SET_MODULE_PARAMS_32: { - struct snd_lsm_module_params_32 p_data_32; - struct snd_lsm_module_params p_data; - u8 *params, *params32; - size_t p_size; - struct lsm_params_info_32 *p_info_32; - struct lsm_params_info *p_info; - int i; - - if (!session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS_32"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data_32, arg, - sizeof(p_data_32))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SET_MODULE_PARAMS_32", - sizeof(p_data_32)); - err = -EFAULT; - goto done; - } - - p_data.params = compat_ptr(p_data_32.params); - p_data.num_params = p_data_32.num_params; - p_data.data_size = p_data_32.data_size; - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS_32", - p_data.num_params); - err = -EINVAL; - goto done; - } - - if (p_data.data_size != - (p_data.num_params * sizeof(struct lsm_params_info_32))) { - dev_err(rtd->dev, - "%s: %s: Invalid size %d\n", - __func__, "SET_MODULE_PARAMS_32", - p_data.data_size); - err = -EINVAL; - goto done; - } - - p_size = sizeof(struct lsm_params_info_32) * - p_data.num_params; - - params32 = kzalloc(p_size, GFP_KERNEL); - if (!params32) { - err = -ENOMEM; - goto done; - } - - p_size = sizeof(struct lsm_params_info) * p_data.num_params; - params = kzalloc(p_size, GFP_KERNEL); - if (!params) { - kfree(params32); - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params32, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "params32", p_data.data_size); - kfree(params32); - kfree(params); - err = -EFAULT; - goto done; - } - - p_info_32 = (struct lsm_params_info_32 *) params32; - p_info = (struct lsm_params_info *) params; - for (i = 0; i < p_data.num_params; i++) { - p_info->module_id = p_info_32->module_id; - p_info->param_id = p_info_32->param_id; - p_info->param_size = p_info_32->param_size; - p_info->param_data = compat_ptr(p_info_32->param_data); - p_info->param_type = p_info_32->param_type; - - p_info_32++; - p_info++; - } - - err = msm_cpe_lsm_process_params(substream, - &p_data, params); - if (err) - dev_err(rtd->dev, - "%s: Failed to process params, err = %d\n", - __func__, err); - kfree(params); - kfree(params32); - break; - } - case SNDRV_LSM_REG_SND_MODEL_V2: - case SNDRV_LSM_SET_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS: - /* - * In ideal cases, the compat_ioctl should never be called - * with the above unlocked ioctl commands. Print error - * and return error if it does. - */ - dev_err(rtd->dev, - "%s: Invalid cmd for compat_ioctl\n", - __func__); - err = -EINVAL; - break; - default: - err = msm_cpe_lsm_ioctl_shared(substream, cmd, arg); - break; - } -done: - MSM_CPE_LSM_REL_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - return err; -} - -#else -#define msm_cpe_lsm_ioctl_compat NULL -#endif - -/* - * msm_cpe_lsm_prepare: prepare call from ASoC core for this platform - * @substream: ASoC substream for which the operation is invoked - * - * start the AFE port on CPE associated for this listen session - */ -static int msm_cpe_lsm_prepare(struct snd_pcm_substream *substream) -{ - int rc = 0; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *afe_cfg; - struct cpe_lsm_session *lsm_session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_hw_params lsm_param; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - if (runtime->status->state == SNDRV_PCM_STATE_XRUN || - runtime->status->state == SNDRV_PCM_STATE_PREPARED) { - pr_err("%s: XRUN ignore for now\n", __func__); - return 0; - } - - lsm_session = lsm_d->lsm_session; - lab_d->pcm_size = snd_pcm_lib_buffer_bytes(substream); - - dev_dbg(rtd->dev, - "%s: pcm_size 0x%x", __func__, lab_d->pcm_size); - - if (lsm_d->cpe_prepared) { - dev_dbg(rtd->dev, "%s: CPE is alredy prepared\n", - __func__); - return 0; - } - - lsm_ops = &cpe->lsm_ops; - afe_ops = &cpe->afe_ops; - afe_cfg = &(lsm_d->lsm_session->afe_port_cfg); - - switch (cpe->input_port_id) { - case AFE_PORT_ID_3: - afe_cfg->port_id = AFE_PORT_ID_3; - afe_cfg->bit_width = 16; - afe_cfg->num_channels = 1; - afe_cfg->sample_rate = SAMPLE_RATE_48KHZ; - rc = afe_ops->afe_port_cmd_cfg(cpe->core_handle, afe_cfg); - break; - case AFE_PORT_ID_1: - default: - afe_cfg->port_id = AFE_PORT_ID_1; - afe_cfg->bit_width = 16; - afe_cfg->num_channels = 1; - afe_cfg->sample_rate = SAMPLE_RATE_16KHZ; - rc = afe_ops->afe_set_params(cpe->core_handle, - afe_cfg, cpe->afe_mad_ctl); - break; - } - - if (rc != 0) { - dev_err(rtd->dev, - "%s: cpe afe params failed for port = %d, err = %d\n", - __func__, afe_cfg->port_id, rc); - return rc; - } - lsm_param.sample_rate = afe_cfg->sample_rate; - lsm_param.num_chs = afe_cfg->num_channels; - lsm_param.bit_width = afe_cfg->bit_width; - rc = lsm_ops->lsm_set_media_fmt_params(cpe->core_handle, lsm_session, - &lsm_param); - if (rc) - dev_dbg(rtd->dev, - "%s: failed to set lsm media fmt params, err = %d\n", - __func__, rc); - - /* Send connect to port (input) */ - rc = lsm_ops->lsm_set_port(cpe->core_handle, lsm_session, - &cpe->input_port_id); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to set connect input port, err=%d\n", - __func__, rc); - return rc; - } - - if (cpe->input_port_id != 3) { - rc = lsm_ops->lsm_get_afe_out_port_id(cpe->core_handle, - lsm_session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: failed to get port id, err = %d\n", - __func__, rc); - return rc; - } - /* Send connect to port (output) */ - rc = lsm_ops->lsm_set_port(cpe->core_handle, lsm_session, - &lsm_session->afe_out_port_id); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to set connect output port, err=%d\n", - __func__, rc); - return rc; - } - } - rc = msm_cpe_afe_port_cntl(substream, - cpe->core_handle, - afe_ops, afe_cfg, - AFE_CMD_PORT_START); - if (rc) - dev_err(rtd->dev, - "%s: cpe_afe_port start failed, err = %d\n", - __func__, rc); - else - lsm_d->cpe_prepared = true; - - return rc; -} - -/* - * msm_cpe_lsm_trigger: trigger call from ASoC core for this platform - * @substream: ASoC substream for which the operation is invoked - * @cmd: the trigger command from framework - * - * suspend/resume the AFE port on CPE associated with listen session - */ -static int msm_cpe_lsm_trigger(struct snd_pcm_substream *substream, - int cmd) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *afe_cfg; - int afe_cmd = AFE_CMD_INVALID; - int rc = 0; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - afe_ops = &cpe->afe_ops; - afe_cfg = &(lsm_d->lsm_session->afe_port_cfg); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - afe_cmd = AFE_CMD_PORT_SUSPEND; - break; - - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - afe_cmd = AFE_CMD_PORT_RESUME; - break; - - default: - afe_cmd = AFE_CMD_INVALID; - dev_dbg(rtd->dev, - "%s: unhandled trigger cmd %d\n", - __func__, cmd); - break; - } - - if (afe_cmd != AFE_CMD_INVALID) - rc = msm_cpe_afe_port_cntl(substream, - cpe->core_handle, - afe_ops, afe_cfg, - afe_cmd); - - return rc; -} - -static int msm_cpe_lsm_hwparams(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_session *session = NULL; - struct cpe_hw_params *hw_params = NULL; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid %s\n", - __func__, - (!cpe) ? "cpe" : "core"); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid %s\n", - __func__, - (!lsm_d) ? "priv_data" : "session"); - return -EINVAL; - } - - session = lsm_d->lsm_session; - hw_params = &lsm_d->hw_params; - hw_params->buf_sz = (params_buffer_bytes(params) - / params_periods(params)); - hw_params->period_count = params_periods(params); - hw_params->channels = params_channels(params); - hw_params->sample_rate = params_rate(params); - - if (params_format(params) == SNDRV_PCM_FORMAT_S16_LE) - hw_params->sample_size = 16; - else if (params_format(params) == - SNDRV_PCM_FORMAT_S24_LE) - hw_params->sample_size = 24; - else if (params_format(params) == - SNDRV_PCM_FORMAT_S32_LE) - hw_params->sample_size = 32; - else { - dev_err(rtd->dev, - "%s: Invalid Format 0x%x\n", - __func__, params_format(params)); - return -EINVAL; - } - - dev_dbg(rtd->dev, - "%s: Format %d buffer size(bytes) %d period count %d\n" - " Channel %d period in bytes 0x%x Period Size 0x%x rate = %d\n", - __func__, params_format(params), params_buffer_bytes(params), - params_periods(params), params_channels(params), - params_period_bytes(params), params_period_size(params), - params_rate(params)); - - return 0; -} - -static snd_pcm_uframes_t msm_cpe_lsm_pointer( - struct snd_pcm_substream *substream) -{ - - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_session *session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - - session = lsm_d->lsm_session; - if (lab_d->dma_write >= lab_d->pcm_size) - lab_d->dma_write = 0; - dev_dbg(rtd->dev, - "%s:pcm_dma_pos = %d\n", - __func__, lab_d->dma_write); - - return bytes_to_frames(runtime, (lab_d->dma_write)); -} - -static int msm_cpe_lsm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_pcm_runtime *runtime = substream->runtime; - struct cpe_lsm_session *session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - char *pcm_buf; - int rc = 0; - - if (runtime->status->state == SNDRV_PCM_STATE_XRUN || - runtime->status->state == SNDRV_PCM_STATE_PREPARED) { - pr_err("%s: XRUN ignore for now\n", __func__); - return 0; - } - session = lsm_d->lsm_session; - - /* Check if buffer reading is already in error state */ - if (lab_d->thread_status == MSM_LSM_LAB_THREAD_ERROR) { - dev_err(rtd->dev, - "%s: Bufferring is in error state\n", - __func__); - /* - * Advance the period so there is no wait in case - * read is invoked even after error is propogated - */ - atomic_inc(&lab_d->in_count); - lab_d->dma_write += snd_pcm_lib_period_bytes(substream); - snd_pcm_period_elapsed(substream); - return -ENETRESET; - } else if (lab_d->thread_status == MSM_LSM_LAB_THREAD_STOP) { - dev_err(rtd->dev, - "%s: Buferring is in stopped\n", - __func__); - return -EIO; - } - - rc = wait_event_timeout(lab_d->period_wait, - (atomic_read(&lab_d->in_count) || - atomic_read(&lab_d->abort_read)), - (2 * HZ)); - if (atomic_read(&lab_d->abort_read)) { - pr_debug("%s: LSM LAB Abort read\n", __func__); - return -EIO; - } - if (lab_d->thread_status != MSM_LSM_LAB_THREAD_RUNNING) { - pr_err("%s: Lab stopped\n", __func__); - return -EIO; - } - if (!rc) { - pr_err("%s:LAB err wait_event_timeout\n", __func__); - rc = -EAGAIN; - goto fail; - } - if (lab_d->buf_idx >= (lsm_d->hw_params.period_count)) - lab_d->buf_idx = 0; - pcm_buf = (lab_d->pcm_buf[lab_d->buf_idx].mem); - pr_debug("%s: Buf IDX = 0x%x pcm_buf %pK\n", - __func__, lab_d->buf_idx, pcm_buf); - if (pcm_buf) { - if (copy_to_user(buf, pcm_buf, fbytes)) { - pr_err("Failed to copy buf to user\n"); - rc = -EFAULT; - goto fail; - } - } - lab_d->buf_idx++; - atomic_dec(&lab_d->in_count); - return 0; -fail: - return rc; -} - -/* - * msm_asoc_cpe_lsm_probe: ASoC framework for lsm platform driver - * @platform: platform registered with ASoC core - * - * Allocate the private data for this platform and obtain the ops for - * lsm and afe modules from underlying driver. Also find the codec - * for this platform as specified by machine driver for ASoC framework. - */ -static int msm_asoc_cpe_lsm_probe(struct snd_soc_platform *platform) -{ - struct snd_soc_card *card; - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; - struct cpe_priv *cpe_priv; - const struct snd_kcontrol_new *kcontrol; - bool found_runtime = false; - const char *cpe_dev_id = "qcom,msm-cpe-lsm-id"; - u32 port_id = 0; - int ret = 0; - - if (!platform || !platform->component.card) { - pr_err("%s: Invalid platform or card\n", - __func__); - return -EINVAL; - } - - card = platform->component.card; - - /* Match platform to codec */ - list_for_each_entry(rtd, &card->rtd_list, list) { - if (!rtd->platform) - continue; - if (!strcmp(rtd->platform->component.name, - platform->component.name)) { - found_runtime = true; - break; - } - } - - if (!found_runtime) { - dev_err(platform->dev, - "%s: Failed to find runtime for platform\n", - __func__); - return -EINVAL; - } - - ret = of_property_read_u32(platform->dev->of_node, cpe_dev_id, - &port_id); - if (ret) { - dev_dbg(platform->dev, - "%s: missing 0x%x in dt node\n", __func__, port_id); - port_id = 1; - } - - codec = rtd->codec; - - cpe_priv = kzalloc(sizeof(struct cpe_priv), - GFP_KERNEL); - if (!cpe_priv) - return -ENOMEM; - - cpe_priv->codec = codec; - cpe_priv->input_port_id = port_id; - wcd_cpe_get_lsm_ops(&cpe_priv->lsm_ops); - wcd_cpe_get_afe_ops(&cpe_priv->afe_ops); - - snd_soc_platform_set_drvdata(platform, cpe_priv); - kcontrol = &msm_cpe_kcontrols[0]; - snd_ctl_add(card->snd_card, snd_ctl_new1(kcontrol, cpe_priv)); - return 0; -} - -static const struct snd_pcm_ops msm_cpe_lsm_ops = { - .open = msm_cpe_lsm_open, - .close = msm_cpe_lsm_close, - .ioctl = msm_cpe_lsm_ioctl, - .prepare = msm_cpe_lsm_prepare, - .trigger = msm_cpe_lsm_trigger, - .pointer = msm_cpe_lsm_pointer, - .copy_user = msm_cpe_lsm_copy, - .hw_params = msm_cpe_lsm_hwparams, - .compat_ioctl = msm_cpe_lsm_ioctl_compat, -}; - -static struct snd_soc_platform_driver msm_soc_cpe_platform = { - .ops = &msm_cpe_lsm_ops, - .probe = msm_asoc_cpe_lsm_probe, -}; - -/* - * msm_cpe_lsm_probe: platform driver probe - * @pdev: platform device - * - * Register the ASoC platform driver with ASoC core - */ -static int msm_cpe_lsm_probe(struct platform_device *pdev) -{ - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_cpe_platform); -} - -/* - * msm_cpe_lsm_remove: platform driver remove - * @pdev: platform device - * - * Deregister the ASoC platform driver - */ -static int msm_cpe_lsm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_cpe_lsm_dt_match[] = { - {.compatible = "qcom,msm-cpe-lsm" }, - { } -}; - -static struct platform_driver msm_cpe_lsm_driver = { - .driver = { - .name = "msm-cpe-lsm", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(msm_cpe_lsm_dt_match), - .suppress_bind_attrs = true, - }, - .probe = msm_cpe_lsm_probe, - .remove = msm_cpe_lsm_remove, -}; - -int __init msm_cpe_lsm_init(void) -{ - return platform_driver_register(&msm_cpe_lsm_driver); -} - -void __exit msm_cpe_lsm_exit(void) -{ - platform_driver_unregister(&msm_cpe_lsm_driver); -} - -module_init(msm_cpe_lsm_init); -module_exit(msm_cpe_lsm_exit); -MODULE_DESCRIPTION("CPE LSM platform driver"); -MODULE_DEVICE_TABLE(of, msm_cpe_lsm_dt_match); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-dai-fe.c b/techpack/audio/4.0/asoc/msm-dai-fe.c deleted file mode 100644 index 2025be91a119..000000000000 --- a/techpack/audio/4.0/asoc/msm-dai-fe.c +++ /dev/null @@ -1,2901 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include - -static struct snd_soc_dai_ops msm_fe_dai_ops = {}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, - 88200, 96000, 176400, 192000, 352800, 384000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int multimedia_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - snd_pcm_hw_constraint_list(substream->runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - return 0; -} - -static int fe_dai_probe(struct snd_soc_dai *dai) -{ - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai || !dai->driver) { - pr_err("%s invalid params\n", __func__); - return -EINVAL; - } - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.stream_name; - intercon.sink = dai->driver->playback.aif_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - snd_soc_dapm_ignore_suspend(dapm, intercon.source); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.stream_name; - intercon.source = dai->driver->capture.aif_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - snd_soc_dapm_ignore_suspend(dapm, intercon.sink); - } - return 0; -} - -static struct snd_soc_dai_ops msm_fe_Multimedia_dai_ops = { - .startup = multimedia_startup, -}; - -static const struct snd_soc_component_driver msm_fe_dai_component = { - .name = "msm-dai-fe", -}; - -static struct snd_soc_dai_driver msm_fe_dais[] = { - { - .playback = { - .stream_name = "MultiMedia1 Playback", - .aif_name = "MM_DL1", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia1 Capture", - .aif_name = "MM_UL1", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia1", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia2 Playback", - .aif_name = "MM_DL2", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia2 Capture", - .aif_name = "MM_UL2", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia2", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VoIP Playback", - .aif_name = "VOIP_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VoIP Capture", - .aif_name = "VOIP_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VoIP", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia3 Playback", - .aif_name = "MM_DL3", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia3 Capture", - .aif_name = "MM_UL3", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia3", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia4 Playback", - .aif_name = "MM_DL4", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia4", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia5 Playback", - .aif_name = "MM_DL5", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia5 Capture", - .aif_name = "MM_UL5", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia5", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia6 Playback", - .aif_name = "MM_DL6", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia6 Capture", - .aif_name = "MM_UL6", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia6", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia7 Playback", - .aif_name = "MM_DL7", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia7", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia8 Playback", - .aif_name = "MM_DL8", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia8 Capture", - .aif_name = "MM_UL8", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia8", - .probe = fe_dai_probe, - }, - /* FE DAIs created for hostless operation purpose */ - { - .playback = { - .stream_name = "SLIMBUS0_HOSTLESS Playback", - .aif_name = "SLIM0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS0_HOSTLESS Capture", - .aif_name = "SLIM0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_96000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS1_HOSTLESS Playback", - .aif_name = "SLIM1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS1_HOSTLESS Capture", - .aif_name = "SLIM1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS3_HOSTLESS Playback", - .aif_name = "SLIM3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS3_HOSTLESS Capture", - .aif_name = "SLIM3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS4_HOSTLESS Playback", - .aif_name = "SLIM4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS4_HOSTLESS Capture", - .aif_name = "SLIM4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS6_HOSTLESS Playback", - .aif_name = "SLIM6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS7_HOSTLESS Playback", - .aif_name = "SLIM7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS7_HOSTLESS Capture", - .aif_name = "SLIM7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS8_HOSTLESS Playback", - .aif_name = "SLIM8_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .aif_name = "SLIM8_UL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS8_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "CDC_DMA_HOSTLESS Playback", - .aif_name = "CDC_DMA_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "CDC_DMA_HOSTLESS Capture", - .aif_name = "CDC_DMA_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "CDC_DMA_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "TX3_CDC_DMA_HOSTLESS Capture", - .aif_name = "TX3_CDC_DMA_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "TX3_CDC_DMA_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT_FM_HOSTLESS Playback", - .aif_name = "INTFM_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT_FM_HOSTLESS Capture", - .aif_name = "INTFM_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT_FM_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT_HFP_BT Hostless Playback", - .aif_name = "INTHFP_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 16000, - }, - .capture = { - .stream_name = "INT_HFP_BT Hostless Capture", - .aif_name = "INTHFP_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT_HFP_BT_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "USBAUDIO_HOSTLESS Playback", - .aif_name = "USBAUDIO_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "USBAUDIO_HOSTLESS Capture", - .aif_name = "USBAUDIO_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "USBAUDIO_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "AFE Playback", - .aif_name = "PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "AFE Capture", - .aif_name = "PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "AFE-PROXY", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "HDMI_HOSTLESS Playback", - .aif_name = "HDMI_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "HDMI_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "AUXPCM_HOSTLESS Playback", - .aif_name = "AUXPCM_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .capture = { - .stream_name = "AUXPCM_HOSTLESS Capture", - .aif_name = "AUXPCM_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "AUXPCM_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SEC_AUXPCM_HOSTLESS Playback", - .aif_name = "SEC_AUXPCM_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_AUXPCM_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "SEC_AUXPCM_HOSTLESS Capture", - .aif_name = "SEC_AUXPCM_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_AUXPCM_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VOICE_STUB Playback", - .aif_name = "VOICE_STUB_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VOICE_STUB Capture", - .aif_name = "VOICE_STUB_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VOICE_STUB", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MI2S_RX_HOSTLESS Playback", - .aif_name = "MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "MI2S_TX_HOSTLESS Capture", - .aif_name = "MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SEC_I2S_RX_HOSTLESS Playback", - .aif_name = "SEC_I2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_I2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary MI2S_TX Hostless Capture", - .aif_name = "PRI_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary MI2S_RX Hostless Playback", - .aif_name = "PRI_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary MI2S_TX Hostless Capture", - .aif_name = "SEC_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary MI2S_RX Hostless Playback", - .aif_name = "SEC_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary MI2S_TX Hostless Capture", - .aif_name = "TERT_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary MI2S_RX Hostless Playback", - .aif_name = "TERT_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary MI2S_TX Hostless Capture", - .aif_name = "QUAT_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary MI2S_RX Hostless Playback", - .aif_name = "QUAT_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT0 MI2S_RX Hostless Playback", - .aif_name = "INT0_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT0_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT4 MI2S_RX Hostless Playback", - .aif_name = "INT4_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT4_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "INT3 MI2S_TX Hostless Capture", - .aif_name = "INT3_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT3_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - /* TDM Hostless */ - { - .capture = { - .stream_name = "Primary TDM0 Hostless Capture", - .aif_name = "PRI_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM0 Hostless Playback", - .aif_name = "PRI_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM1 Hostless Capture", - .aif_name = "PRI_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM1 Hostless Playback", - .aif_name = "PRI_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM2 Hostless Capture", - .aif_name = "PRI_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM2 Hostless Playback", - .aif_name = "PRI_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM3 Hostless Capture", - .aif_name = "PRI_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM3 Hostless Playback", - .aif_name = "PRI_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM4 Hostless Capture", - .aif_name = "PRI_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM4 Hostless Playback", - .aif_name = "PRI_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM5 Hostless Capture", - .aif_name = "PRI_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM5 Hostless Playback", - .aif_name = "PRI_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM6 Hostless Capture", - .aif_name = "PRI_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM6 Hostless Playback", - .aif_name = "PRI_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM7 Hostless Capture", - .aif_name = "PRI_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM7 Hostless Playback", - .aif_name = "PRI_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM0 Hostless Capture", - .aif_name = "SEC_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM0 Hostless Playback", - .aif_name = "SEC_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM1 Hostless Capture", - .aif_name = "SEC_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM1 Hostless Playback", - .aif_name = "SEC_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM2 Hostless Capture", - .aif_name = "SEC_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM2 Hostless Playback", - .aif_name = "SEC_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM3 Hostless Capture", - .aif_name = "SEC_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM3 Hostless Playback", - .aif_name = "SEC_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM4 Hostless Capture", - .aif_name = "SEC_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM4 Hostless Playback", - .aif_name = "SEC_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM5 Hostless Capture", - .aif_name = "SEC_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM5 Hostless Playback", - .aif_name = "SEC_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM6 Hostless Capture", - .aif_name = "SEC_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM6 Hostless Playback", - .aif_name = "SEC_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM7 Hostless Capture", - .aif_name = "SEC_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM7 Hostless Playback", - .aif_name = "SEC_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM0 Hostless Capture", - .aif_name = "TERT_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM0 Hostless Playback", - .aif_name = "TERT_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM1 Hostless Capture", - .aif_name = "TERT_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM1 Hostless Playback", - .aif_name = "TERT_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM2 Hostless Capture", - .aif_name = "TERT_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM2 Hostless Playback", - .aif_name = "TERT_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM3 Hostless Capture", - .aif_name = "TERT_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM3 Hostless Playback", - .aif_name = "TERT_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM4 Hostless Capture", - .aif_name = "TERT_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM4 Hostless Playback", - .aif_name = "TERT_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM5 Hostless Capture", - .aif_name = "TERT_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM5 Hostless Playback", - .aif_name = "TERT_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM6 Hostless Capture", - .aif_name = "TERT_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM6 Hostless Playback", - .aif_name = "TERT_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM7 Hostless Capture", - .aif_name = "TERT_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM7 Hostless Playback", - .aif_name = "TERT_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM0 Hostless Capture", - .aif_name = "QUAT_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM0 Hostless Playback", - .aif_name = "QUAT_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM1 Hostless Capture", - .aif_name = "QUAT_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM1 Hostless Playback", - .aif_name = "QUAT_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM2 Hostless Capture", - .aif_name = "QUAT_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM2 Hostless Playback", - .aif_name = "QUAT_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM3 Hostless Capture", - .aif_name = "QUAT_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM3 Hostless Playback", - .aif_name = "QUAT_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM4 Hostless Capture", - .aif_name = "QUAT_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM4 Hostless Playback", - .aif_name = "QUAT_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM5 Hostless Capture", - .aif_name = "QUAT_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM5 Hostless Playback", - .aif_name = "QUAT_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM6 Hostless Capture", - .aif_name = "QUAT_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM6 Hostless Playback", - .aif_name = "QUAT_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM7 Hostless Capture", - .aif_name = "QUAT_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM7 Hostless Playback", - .aif_name = "QUAT_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quinary TDM7 Hostless Capture", - .aif_name = "QUIN_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUIN_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quinary TDM7 Hostless Playback", - .aif_name = "QUIN_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUIN_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "DTMF_RX_HOSTLESS Playback", - .aif_name = "DTMF_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "DTMF_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "CPE Listen Audio capture", - .aif_name = "CPE_LSM_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "CPE_LSM_NOHOST", - }, - { - .playback = { - .stream_name = "VOLTE_STUB Playback", - .aif_name = "VOLTE_STUB_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VOLTE_STUB Capture", - .aif_name = "VOLTE_STUB_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VOLTE_STUB", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VOICE2_STUB Playback", - .aif_name = "VOICE2_STUB_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VOICE2_STUB Capture", - .aif_name = "VOICE2_STUB_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VOICE2_STUB", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia9 Playback", - .aif_name = "MM_DL9", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia9 Capture", - .aif_name = "MM_UL9", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia9", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "QCHAT Playback", - .aif_name = "QCHAT_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "QCHAT Capture", - .aif_name = "QCHAT_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QCHAT", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 1 Audio Service Capture", - .aif_name = "LSM1_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM1", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 2 Audio Service Capture", - .aif_name = "LSM2_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM2", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 3 Audio Service Capture", - .aif_name = "LSM3_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM3", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 4 Audio Service Capture", - .aif_name = "LSM4_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM4", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 5 Audio Service Capture", - .aif_name = "LSM5_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM5", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 6 Audio Service Capture", - .aif_name = "LSM6_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM6", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 7 Audio Service Capture", - .aif_name = "LSM7_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM7", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 8 Audio Service Capture", - .aif_name = "LSM8_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM8", - .probe = fe_dai_probe, - }, - /* FE DAIs created for multiple instances of offload playback */ - { - .playback = { - .stream_name = "MultiMedia10 Playback", - .aif_name = "MM_DL10", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia10 Capture", - .aif_name = "MM_UL10", - .rates = (SNDRV_PCM_RATE_8000_48000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia10", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia11 Playback", - .aif_name = "MM_DL11", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia11", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia12 Playback", - .aif_name = "MM_DL12", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia12", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia13 Playback", - .aif_name = "MM_DL13", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia13", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia14 Playback", - .aif_name = "MM_DL14", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia14", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia15 Playback", - .aif_name = "MM_DL15", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia15", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia16 Playback", - .aif_name = "MM_DL16", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia16 Capture", - .aif_name = "MM_UL16", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia16", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VoiceMMode1 Playback", - .aif_name = "VOICEMMODE1_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VoiceMMode1 Capture", - .aif_name = "VOICEMMODE1_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VoiceMMode1", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VoiceMMode2 Playback", - .aif_name = "VOICEMMODE2_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VoiceMMode2 Capture", - .aif_name = "VOICEMMODE2_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VoiceMMode2", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia17 Capture", - .aif_name = "MM_UL17", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia17", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia18 Capture", - .aif_name = "MM_UL18", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia18", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia19 Capture", - .aif_name = "MM_UL19", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia19", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia20 Playback", - .aif_name = "MM_DL20", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia20 Capture", - .aif_name = "MM_UL20", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia20", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia21 Playback", - .aif_name = "MM_DL21", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia21 Capture", - .aif_name = "MM_UL21", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia21", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia22 Playback", - .aif_name = "MM_DL22", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia22 Capture", - .aif_name = "MM_UL22", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia22", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia23 Playback", - .aif_name = "MM_DL23", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia23 Capture", - .aif_name = "MM_UL23", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia23", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia26 Playback", - .aif_name = "MM_DL26", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia26", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia27 Capture", - .aif_name = "MM_UL27", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia27", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia28 Capture", - .aif_name = "MM_UL28", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia28", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia29 Capture", - .aif_name = "MM_UL29", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia29", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia30 Capture", - .aif_name = "MM_UL30", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia30", - .probe = fe_dai_probe, - }, -}; - -static int msm_fe_dai_dev_probe(struct platform_device *pdev) -{ - - dev_dbg(&pdev->dev, "%s: dev name %s\n", __func__, - dev_name(&pdev->dev)); - return snd_soc_register_component(&pdev->dev, &msm_fe_dai_component, - msm_fe_dais, ARRAY_SIZE(msm_fe_dais)); -} - -static int msm_fe_dai_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_fe_dt_match[] = { - {.compatible = "qcom,msm-dai-fe"}, - {} -}; - -static struct platform_driver msm_fe_dai_driver = { - .probe = msm_fe_dai_dev_probe, - .remove = msm_fe_dai_dev_remove, - .driver = { - .name = "msm-dai-fe", - .owner = THIS_MODULE, - .of_match_table = msm_dai_fe_dt_match, - .suppress_bind_attrs = true, - }, -}; - -int __init msm_fe_dai_init(void) -{ - return platform_driver_register(&msm_fe_dai_driver); -} - -void msm_fe_dai_exit(void) -{ - platform_driver_unregister(&msm_fe_dai_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM Frontend DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-dai-q6-hdmi-v2.c b/techpack/audio/4.0/asoc/msm-dai-q6-hdmi-v2.c deleted file mode 100644 index 664169bd8bf2..000000000000 --- a/techpack/audio/4.0/asoc/msm-dai-q6-hdmi-v2.c +++ /dev/null @@ -1,692 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-dai-q6-v2.h" - -#define HDMI_RX_CA_MAX 0x32 - -enum { - DP_CONTROLLER0 = 0, - DP_CONTROLLER1, - DP_CONTROLLER_MAX, -}; - -enum { - DP_STREAM0 = 0, - DP_STREAM1, - DP_STREAM_MAX, -}; - -enum { - STATUS_PORT_STARTED, /* track if AFE port has started */ - STATUS_MAX -}; - -struct msm_ext_disp_ca { - bool set_ca; - u32 ca; -}; - -struct msm_dai_q6_hdmi_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 stream_idx; - u32 ctl_idx; - struct msm_ext_disp_ca ca; - union afe_port_config port_config; -}; - -static int get_port_id(int dai_id) -{ - /* Currently, display devices share a common AFE port */ - if (dai_id != HDMI_RX) - return DISPLAY_PORT_RX; - - return dai_id; -} - -static int msm_dai_q6_ext_disp_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - dai_data->port_config.hdmi_multi_ch.datatype = value; - pr_debug("%s: value = %d\n", __func__, value); - - return 0; -} - -static int msm_dai_q6_ext_disp_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = - dai_data->port_config.hdmi_multi_ch.datatype; - pr_debug("%s: value = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_ext_disp_device_idx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - if ((ucontrol->value.integer.value[0] > (DP_CONTROLLER_MAX - 1)) || - (ucontrol->value.integer.value[1] > (DP_STREAM_MAX - 1)) || - (ucontrol->value.integer.value[0] < 0) || - (ucontrol->value.integer.value[1] < 0)) { - pr_err("%s: DP control index invalid\n", __func__); - return -EINVAL; - } - - dai_data->ctl_idx = ucontrol->value.integer.value[0]; - dai_data->stream_idx = ucontrol->value.integer.value[1]; - pr_debug("%s: DP ctl id %d stream id %d\n", __func__, - dai_data->ctl_idx, dai_data->stream_idx); - - return 0; -} - -static int msm_dai_q6_ext_disp_device_idx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = dai_data->ctl_idx; - ucontrol->value.integer.value[1] = dai_data->stream_idx; - pr_debug("%s: DP ctl id %d stream id %d\n", __func__, - dai_data->ctl_idx, dai_data->stream_idx); - - return 0; -} - -static int msm_dai_q6_ext_disp_ca_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - dai_data->ca.ca = ucontrol->value.integer.value[0]; - dai_data->ca.set_ca = true; - pr_debug("%s: ca = %d\n", __func__, dai_data->ca.ca); - return 0; -} - -static int msm_dai_q6_ext_disp_ca_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = dai_data->ca.ca; - pr_debug("%s: ca = %d\n", __func__, dai_data->ca.ca); - return 0; -} - -/* HDMI format field for AFE_PORT_MULTI_CHAN_HDMI_AUDIO_IF_CONFIG command - * 0: linear PCM - * 1: non-linear PCM - */ -static const char * const hdmi_format[] = { - "LPCM", - "Compr" -}; - -static const struct soc_enum hdmi_config_enum[] = { - SOC_ENUM_SINGLE_EXT(2, hdmi_format), -}; - -static int msm_dai_q6_ext_disp_drift_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_param_id_dev_timing_stats); - - return 0; -} - -static int msm_dai_q6_ext_disp_drift_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - struct afe_param_id_dev_timing_stats timing_stats; - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: afe port not started. status_mask = %ld\n", - __func__, *dai_data->status_mask); - goto done; - } - - memset(&timing_stats, 0, sizeof(struct afe_param_id_dev_timing_stats)); - ret = afe_get_av_dev_drift(&timing_stats, get_port_id(dai->id)); - if (ret) { - pr_err("%s: Error getting AFE Drift for port %d, err=%d\n", - __func__, get_port_id(dai->id), ret); - - ret = -EINVAL; - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&timing_stats, - sizeof(struct afe_param_id_dev_timing_stats)); -done: - return ret; -} - -static const struct snd_kcontrol_new hdmi_config_controls[] = { - SOC_ENUM_EXT("HDMI RX Format", hdmi_config_enum[0], - msm_dai_q6_ext_disp_format_get, - msm_dai_q6_ext_disp_format_put), - SOC_SINGLE_MULTI_EXT("HDMI RX CA", SND_SOC_NOPM, 0, - HDMI_RX_CA_MAX, 0, 1, - msm_dai_q6_ext_disp_ca_get, - msm_dai_q6_ext_disp_ca_put), - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "HDMI DRIFT", - .info = msm_dai_q6_ext_disp_drift_info, - .get = msm_dai_q6_ext_disp_drift_get, - }, -}; - -static const struct snd_kcontrol_new display_port_config_controls[] = { - SOC_ENUM_EXT("Display Port RX Format", hdmi_config_enum[0], - msm_dai_q6_ext_disp_format_get, - msm_dai_q6_ext_disp_format_put), - SOC_SINGLE_MULTI_EXT("Display Port RX CA", SND_SOC_NOPM, 0, - HDMI_RX_CA_MAX, 0, 1, - msm_dai_q6_ext_disp_ca_get, - msm_dai_q6_ext_disp_ca_put), - SOC_SINGLE_MULTI_EXT("Display Port RX DEVICE IDX", SND_SOC_NOPM, 0, - 1, 0, 2, - msm_dai_q6_ext_disp_device_idx_get, - msm_dai_q6_ext_disp_device_idx_put), - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "DISPLAY_PORT DRIFT", - .info = msm_dai_q6_ext_disp_drift_info, - .get = msm_dai_q6_ext_disp_drift_get, - }, - SOC_ENUM_EXT("Display Port1 RX Format", hdmi_config_enum[0], - msm_dai_q6_ext_disp_format_get, - msm_dai_q6_ext_disp_format_put), - SOC_SINGLE_MULTI_EXT("Display Port1 RX CA", SND_SOC_NOPM, 0, - HDMI_RX_CA_MAX, 0, 1, - msm_dai_q6_ext_disp_ca_get, - msm_dai_q6_ext_disp_ca_put), - SOC_SINGLE_MULTI_EXT("Display Port1 RX DEVICE IDX", SND_SOC_NOPM, 0, - 1, 0, 2, - msm_dai_q6_ext_disp_device_idx_get, - msm_dai_q6_ext_disp_device_idx_put), - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "DISPLAY_PORT1 DRIFT", - .info = msm_dai_q6_ext_disp_drift_info, - .get = msm_dai_q6_ext_disp_drift_get, - }, -}; - -/* Current implementation assumes hw_param is called once - * This may not be the case but what to do when ADM and AFE - * port are already opened and parameter changes - */ -static int msm_dai_q6_hdmi_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - dai_data->port_config.hdmi_multi_ch.reserved = 0; - dai_data->port_config.hdmi_multi_ch.hdmi_cfg_minor_version = 1; - dai_data->port_config.hdmi_multi_ch.sample_rate = dai_data->rate; - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->port_config.hdmi_multi_ch.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.hdmi_multi_ch.bit_width = 24; - break; - } - - /*refer to HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4*/ - switch (dai_data->channels) { - case 2: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0; - break; - case 3: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x02; - break; - case 4: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x06; - break; - case 5: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x0A; - break; - case 6: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x0B; - break; - case 7: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x12; - break; - case 8: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x13; - break; - default: - dev_err(dai->dev, "invalid Channels = %u\n", - dai_data->channels); - return -EINVAL; - } - dev_dbg(dai->dev, "%s() minor version: %u samplerate: %u bitwidth: %u\n" - "num_ch = %u channel_allocation = %u datatype = %d\n", __func__, - dai_data->port_config.hdmi_multi_ch.hdmi_cfg_minor_version, - dai_data->port_config.hdmi_multi_ch.sample_rate, - dai_data->port_config.hdmi_multi_ch.bit_width, - dai_data->channels, - dai_data->port_config.hdmi_multi_ch.channel_allocation, - dai_data->port_config.hdmi_multi_ch.datatype); - - return 0; -} - - -static void msm_dai_q6_hdmi_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_info("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - return; - } - - rc = afe_close(get_port_id(dai->id)); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); -} - - -static int msm_dai_q6_hdmi_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (dai_data->ca.set_ca) - dai_data->port_config.hdmi_multi_ch.channel_allocation = - dai_data->ca.ca; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_set_display_stream(get_port_id(dai->id), dai_data->stream_idx, - dai_data->ctl_idx); - if (rc < 0) { - dev_err(dai->dev, "fail to set AFE ctl, stream ID params %x\n", - dai->id); - if (rc != -EOPNOTSUPP) { - dev_err(dai->dev, "not starting AFE port\n"); - goto err; - } - } - - rc = afe_port_start(get_port_id(dai->id), &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port %x\n", - get_port_id(dai->id)); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - -err: - return rc; -} - -static inline void msm_dai_q6_hdmi_set_dai_id(struct snd_soc_dai *dai) -{ - if (!dai->driver->id) { - dev_warn(dai->dev, "DAI driver id is not set\n"); - return; - } - dai->id = dai->driver->id; -} - -static int msm_dai_q6_hdmi_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data; - const struct snd_kcontrol_new *kcontrol; - int rc = 0; - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai || !dai->driver) { - pr_err("%s: dai or dai->driver is NULL\n", __func__); - return -EINVAL; - } - dai_data = kzalloc(sizeof(struct msm_dai_q6_hdmi_dai_data), - GFP_KERNEL); - - if (!dai_data) { - dev_err(dai->dev, "DAI-%d: fail to allocate dai data\n", - dai->id); - rc = -ENOMEM; - } else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_hdmi_set_dai_id(dai); - - if (dai->driver->id == HDMI_RX) { - kcontrol = &hdmi_config_controls[0]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &hdmi_config_controls[1]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &hdmi_config_controls[2]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai)); - } else if (dai->driver->id == MSM_DISPLAY_PORT) { - kcontrol = &display_port_config_controls[0]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[1]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[2]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[3]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai)); - } else if (dai->driver->id == MSM_DISPLAY_PORT1) { - kcontrol = &display_port_config_controls[4]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[5]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[6]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[7]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai)); - } else { - dev_err(dai->dev, "%s: Invalid id:%d\n", - __func__, dai->driver->id); - kfree(dai_data); - dev_set_drvdata(dai->dev, NULL); - return -EINVAL; - } - - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (!rc) { - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - } - return rc; -} - -static int msm_dai_q6_hdmi_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(get_port_id(dai->id)); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - kfree(dai_data); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_q6_hdmi_ops = { - .prepare = msm_dai_q6_hdmi_prepare, - .hw_params = msm_dai_q6_hdmi_hw_params, - .shutdown = msm_dai_q6_hdmi_shutdown, -}; - -static struct snd_soc_dai_driver msm_dai_q6_hdmi_hdmi_rx_dai = { - .playback = { - .stream_name = "HDMI Playback", - .aif_name = "HDMI", - .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 2, - .channels_max = 8, - .rate_max = 192000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_hdmi_ops, - .id = HDMI_RX, - .probe = msm_dai_q6_hdmi_dai_probe, - .remove = msm_dai_q6_hdmi_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_display_port_rx_dai[] = { - { - .playback = { - .stream_name = "Display Port Playback", - .aif_name = "DISPLAY_PORT", - .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 2, - .channels_max = 8, - .rate_max = 192000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_hdmi_ops, - .id = MSM_DISPLAY_PORT, - .probe = msm_dai_q6_hdmi_dai_probe, - .remove = msm_dai_q6_hdmi_dai_remove, - }, - { - .playback = { - .stream_name = "Display Port1 Playback", - .aif_name = "DISPLAY_PORT1", - .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 2, - .channels_max = 8, - .rate_max = 192000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_hdmi_ops, - .id = MSM_DISPLAY_PORT1, - .probe = msm_dai_q6_hdmi_dai_probe, - .remove = msm_dai_q6_hdmi_dai_remove, - }, -}; - -static const struct snd_soc_component_driver msm_dai_hdmi_q6_component = { - .name = "msm-dai-q6-hdmi", -}; - -/* To do: change to register DAIs as batch */ -static int msm_dai_q6_hdmi_dev_probe(struct platform_device *pdev) -{ - int rc, id; - const char *q6_dev_id = "qcom,msm-dai-q6-dev-id"; - - rc = of_property_read_u32(pdev->dev.of_node, q6_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, q6_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (pdev->id) { - case HDMI_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_hdmi_q6_component, - &msm_dai_q6_hdmi_hdmi_rx_dai, 1); - break; - case MSM_DISPLAY_PORT: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_hdmi_q6_component, - &msm_dai_q6_display_port_rx_dai[0], 1); - break; - case MSM_DISPLAY_PORT1: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_hdmi_q6_component, - &msm_dai_q6_display_port_rx_dai[1], 1); - break; - default: - dev_err(&pdev->dev, "invalid device ID %d\n", pdev->id); - rc = -ENODEV; - break; - } - return rc; -} - -static int msm_dai_q6_hdmi_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_hdmi_dt_match[] = { - {.compatible = "qcom,msm-dai-q6-hdmi"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_hdmi_dt_match); - -static struct platform_driver msm_dai_q6_hdmi_driver = { - .probe = msm_dai_q6_hdmi_dev_probe, - .remove = msm_dai_q6_hdmi_dev_remove, - .driver = { - .name = "msm-dai-q6-hdmi", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_hdmi_dt_match, - .suppress_bind_attrs = true, - }, -}; - -int __init msm_dai_q6_hdmi_init(void) -{ - return platform_driver_register(&msm_dai_q6_hdmi_driver); -} - -void msm_dai_q6_hdmi_exit(void) -{ - platform_driver_unregister(&msm_dai_q6_hdmi_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM DSP HDMI DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-dai-q6-v2.c b/techpack/audio/4.0/asoc/msm-dai-q6-v2.c deleted file mode 100644 index 0ed0dae05b90..000000000000 --- a/techpack/audio/4.0/asoc/msm-dai-q6-v2.c +++ /dev/null @@ -1,13157 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-dai-q6-v2.h" -#include - -#define MSM_DAI_PRI_AUXPCM_DT_DEV_ID 1 -#define MSM_DAI_SEC_AUXPCM_DT_DEV_ID 2 -#define MSM_DAI_TERT_AUXPCM_DT_DEV_ID 3 -#define MSM_DAI_QUAT_AUXPCM_DT_DEV_ID 4 -#define MSM_DAI_QUIN_AUXPCM_DT_DEV_ID 5 -#define MSM_DAI_SEN_AUXPCM_DT_DEV_ID 6 - -#define MSM_DAI_TWS_CHANNEL_MODE_ONE 1 -#define MSM_DAI_TWS_CHANNEL_MODE_TWO 2 - -#define spdif_clock_value(rate) (2*rate*32*2) -#define CHANNEL_STATUS_SIZE 24 -#define CHANNEL_STATUS_MASK_INIT 0x0 -#define CHANNEL_STATUS_MASK 0x4 -#define PREEMPH_MASK 0x38 -#define PREEMPH_SHIFT 3 -#define GET_PREEMPH(b) ((b & PREEMPH_MASK) >> PREEMPH_SHIFT) -#define AFE_API_VERSION_CLOCK_SET 1 -#define MSM_DAI_SYSFS_ENTRY_MAX_LEN 64 - -#define DAI_FORMATS_S16_S24_S32_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id); - -enum { - ENC_FMT_NONE, - DEC_FMT_NONE = ENC_FMT_NONE, - ENC_FMT_SBC = ASM_MEDIA_FMT_SBC, - DEC_FMT_SBC = ASM_MEDIA_FMT_SBC, - ENC_FMT_AAC_V2 = ASM_MEDIA_FMT_AAC_V2, - DEC_FMT_AAC_V2 = ASM_MEDIA_FMT_AAC_V2, - ENC_FMT_APTX = ASM_MEDIA_FMT_APTX, - ENC_FMT_APTX_HD = ASM_MEDIA_FMT_APTX_HD, - ENC_FMT_CELT = ASM_MEDIA_FMT_CELT, - ENC_FMT_LDAC = ASM_MEDIA_FMT_LDAC, - ENC_FMT_APTX_ADAPTIVE = ASM_MEDIA_FMT_APTX_ADAPTIVE, - DEC_FMT_APTX_ADAPTIVE = ASM_MEDIA_FMT_APTX_ADAPTIVE, - DEC_FMT_MP3 = ASM_MEDIA_FMT_MP3, - ENC_FMT_APTX_AD_SPEECH = ASM_MEDIA_FMT_APTX_AD_SPEECH, - DEC_FMT_APTX_AD_SPEECH = ASM_MEDIA_FMT_APTX_AD_SPEECH, -}; - -enum { - SPKR_1, - SPKR_2, -}; - -static const struct afe_clk_set lpass_clk_set_default = { - AFE_API_VERSION_CLOCK_SET, - Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT, - Q6AFE_LPASS_OSR_CLK_2_P048_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, -}; - -static const struct afe_clk_cfg lpass_clk_cfg_default = { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_OSR_CLK_2_P048_MHZ, - 0, - Q6AFE_LPASS_CLK_SRC_INTERNAL, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - Q6AFE_LPASS_MODE_CLK1_VALID, - 0, -}; -enum { - STATUS_PORT_STARTED, /* track if AFE port has started */ - /* track AFE Tx port status for bi-directional transfers */ - STATUS_TX_PORT, - /* track AFE Rx port status for bi-directional transfers */ - STATUS_RX_PORT, - STATUS_MAX -}; - -enum { - RATE_8KHZ, - RATE_16KHZ, - RATE_MAX_NUM_OF_AUX_PCM_RATES, -}; - -enum { - IDX_PRIMARY_TDM_RX_0, - IDX_PRIMARY_TDM_RX_1, - IDX_PRIMARY_TDM_RX_2, - IDX_PRIMARY_TDM_RX_3, - IDX_PRIMARY_TDM_RX_4, - IDX_PRIMARY_TDM_RX_5, - IDX_PRIMARY_TDM_RX_6, - IDX_PRIMARY_TDM_RX_7, - IDX_PRIMARY_TDM_TX_0, - IDX_PRIMARY_TDM_TX_1, - IDX_PRIMARY_TDM_TX_2, - IDX_PRIMARY_TDM_TX_3, - IDX_PRIMARY_TDM_TX_4, - IDX_PRIMARY_TDM_TX_5, - IDX_PRIMARY_TDM_TX_6, - IDX_PRIMARY_TDM_TX_7, - IDX_SECONDARY_TDM_RX_0, - IDX_SECONDARY_TDM_RX_1, - IDX_SECONDARY_TDM_RX_2, - IDX_SECONDARY_TDM_RX_3, - IDX_SECONDARY_TDM_RX_4, - IDX_SECONDARY_TDM_RX_5, - IDX_SECONDARY_TDM_RX_6, - IDX_SECONDARY_TDM_RX_7, - IDX_SECONDARY_TDM_TX_0, - IDX_SECONDARY_TDM_TX_1, - IDX_SECONDARY_TDM_TX_2, - IDX_SECONDARY_TDM_TX_3, - IDX_SECONDARY_TDM_TX_4, - IDX_SECONDARY_TDM_TX_5, - IDX_SECONDARY_TDM_TX_6, - IDX_SECONDARY_TDM_TX_7, - IDX_TERTIARY_TDM_RX_0, - IDX_TERTIARY_TDM_RX_1, - IDX_TERTIARY_TDM_RX_2, - IDX_TERTIARY_TDM_RX_3, - IDX_TERTIARY_TDM_RX_4, - IDX_TERTIARY_TDM_RX_5, - IDX_TERTIARY_TDM_RX_6, - IDX_TERTIARY_TDM_RX_7, - IDX_TERTIARY_TDM_TX_0, - IDX_TERTIARY_TDM_TX_1, - IDX_TERTIARY_TDM_TX_2, - IDX_TERTIARY_TDM_TX_3, - IDX_TERTIARY_TDM_TX_4, - IDX_TERTIARY_TDM_TX_5, - IDX_TERTIARY_TDM_TX_6, - IDX_TERTIARY_TDM_TX_7, - IDX_QUATERNARY_TDM_RX_0, - IDX_QUATERNARY_TDM_RX_1, - IDX_QUATERNARY_TDM_RX_2, - IDX_QUATERNARY_TDM_RX_3, - IDX_QUATERNARY_TDM_RX_4, - IDX_QUATERNARY_TDM_RX_5, - IDX_QUATERNARY_TDM_RX_6, - IDX_QUATERNARY_TDM_RX_7, - IDX_QUATERNARY_TDM_TX_0, - IDX_QUATERNARY_TDM_TX_1, - IDX_QUATERNARY_TDM_TX_2, - IDX_QUATERNARY_TDM_TX_3, - IDX_QUATERNARY_TDM_TX_4, - IDX_QUATERNARY_TDM_TX_5, - IDX_QUATERNARY_TDM_TX_6, - IDX_QUATERNARY_TDM_TX_7, - IDX_QUINARY_TDM_RX_0, - IDX_QUINARY_TDM_RX_1, - IDX_QUINARY_TDM_RX_2, - IDX_QUINARY_TDM_RX_3, - IDX_QUINARY_TDM_RX_4, - IDX_QUINARY_TDM_RX_5, - IDX_QUINARY_TDM_RX_6, - IDX_QUINARY_TDM_RX_7, - IDX_QUINARY_TDM_TX_0, - IDX_QUINARY_TDM_TX_1, - IDX_QUINARY_TDM_TX_2, - IDX_QUINARY_TDM_TX_3, - IDX_QUINARY_TDM_TX_4, - IDX_QUINARY_TDM_TX_5, - IDX_QUINARY_TDM_TX_6, - IDX_QUINARY_TDM_TX_7, - IDX_SENARY_TDM_RX_0, - IDX_SENARY_TDM_RX_1, - IDX_SENARY_TDM_RX_2, - IDX_SENARY_TDM_RX_3, - IDX_SENARY_TDM_RX_4, - IDX_SENARY_TDM_RX_5, - IDX_SENARY_TDM_RX_6, - IDX_SENARY_TDM_RX_7, - IDX_SENARY_TDM_TX_0, - IDX_SENARY_TDM_TX_1, - IDX_SENARY_TDM_TX_2, - IDX_SENARY_TDM_TX_3, - IDX_SENARY_TDM_TX_4, - IDX_SENARY_TDM_TX_5, - IDX_SENARY_TDM_TX_6, - IDX_SENARY_TDM_TX_7, - IDX_TDM_MAX, -}; - -enum { - IDX_GROUP_PRIMARY_TDM_RX, - IDX_GROUP_PRIMARY_TDM_TX, - IDX_GROUP_SECONDARY_TDM_RX, - IDX_GROUP_SECONDARY_TDM_TX, - IDX_GROUP_TERTIARY_TDM_RX, - IDX_GROUP_TERTIARY_TDM_TX, - IDX_GROUP_QUATERNARY_TDM_RX, - IDX_GROUP_QUATERNARY_TDM_TX, - IDX_GROUP_QUINARY_TDM_RX, - IDX_GROUP_QUINARY_TDM_TX, - IDX_GROUP_SENARY_TDM_RX, - IDX_GROUP_SENARY_TDM_TX, - IDX_GROUP_TDM_MAX, -}; - -struct msm_dai_q6_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - DECLARE_BITMAP(hwfree_status, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u32 cal_mode; - u32 afe_rx_in_channels; - u16 afe_rx_in_bitformat; - u32 afe_tx_out_channels; - u16 afe_tx_out_bitformat; - struct afe_enc_config enc_config; - struct afe_dec_config dec_config; - union afe_port_config port_config; - u16 vi_feed_mono; - u32 xt_logging_disable; -}; - -struct msm_dai_q6_spdif_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u16 port_id; - struct afe_spdif_port_config spdif_port; - struct afe_event_fmt_update fmt_event; - struct kobject *kobj; -}; - -struct msm_dai_q6_spdif_event_msg { - struct afe_port_mod_evt_rsp_hdr evt_hdr; - struct afe_event_fmt_update fmt_event; -}; - -struct msm_dai_q6_mi2s_dai_config { - u16 pdata_mi2s_lines; - struct msm_dai_q6_dai_data mi2s_dai_data; -}; - -struct msm_dai_q6_mi2s_dai_data { - u32 is_island_dai; - struct msm_dai_q6_mi2s_dai_config tx_dai; - struct msm_dai_q6_mi2s_dai_config rx_dai; -}; - -struct msm_dai_q6_meta_mi2s_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u16 num_member_ports; - u16 member_port_id[MAX_NUM_I2S_META_PORT_MEMBER_PORTS]; - u16 channel_mode[MAX_NUM_I2S_META_PORT_MEMBER_PORTS]; - u32 rate; - u32 channels; - u32 bitwidth; - union afe_port_config port_config; -}; - -struct msm_dai_q6_cdc_dma_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - DECLARE_BITMAP(hwfree_status, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u32 is_island_dai; - u32 xt_logging_disable; - union afe_port_config port_config; -}; - -struct msm_dai_q6_auxpcm_dai_data { - /* BITMAP to track Rx and Tx port usage count */ - DECLARE_BITMAP(auxpcm_port_status, STATUS_MAX); - struct mutex rlock; /* auxpcm dev resource lock */ - u16 rx_pid; /* AUXPCM RX AFE port ID */ - u16 tx_pid; /* AUXPCM TX AFE port ID */ - u16 afe_clk_ver; - u32 is_island_dai; - struct afe_clk_cfg clk_cfg; /* hold LPASS clock configuration */ - struct afe_clk_set clk_set; /* hold LPASS clock configuration */ - struct msm_dai_q6_dai_data bdai_data; /* incoporate base DAI data */ -}; - -struct msm_dai_q6_tdm_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u32 num_group_ports; - u32 is_island_dai; - struct afe_clk_set clk_set; /* hold LPASS clock config. */ - union afe_port_group_config group_cfg; /* hold tdm group config */ - struct afe_tdm_port_config port_cfg; /* hold tdm config */ - struct afe_param_id_tdm_lane_cfg lane_cfg; /* hold tdm lane config */ -}; - -/* MI2S format field for AFE_PORT_CMD_I2S_CONFIG command - * 0: linear PCM - * 1: non-linear PCM - * 2: PCM data in IEC 60968 container - * 3: compressed data in IEC 60958 container - * 9: DSD over PCM (DoP) with marker byte - */ -static const char *const mi2s_format[] = { - "LPCM", - "Compr", - "LPCM-60958", - "Compr-60958", - "NA4", - "NA5", - "NA6", - "NA7", - "NA8", - "DSD_DOP_W_MARKER" -}; - -static const char *const mi2s_vi_feed_mono[] = { - "Left", - "Right", -}; - -static const struct soc_enum mi2s_config_enum[] = { - SOC_ENUM_SINGLE_EXT(10, mi2s_format), - SOC_ENUM_SINGLE_EXT(2, mi2s_vi_feed_mono), -}; - -static const char *const cdc_dma_format[] = { - "UNPACKED", - "PACKED_16B", -}; - -static const struct soc_enum cdc_dma_config_enum[] = { - SOC_ENUM_SINGLE_EXT(2, cdc_dma_format), -}; - -static const char *const sb_format[] = { - "UNPACKED", - "PACKED_16B", - "DSD_DOP", -}; - -static const struct soc_enum sb_config_enum[] = { - SOC_ENUM_SINGLE_EXT(3, sb_format), -}; - -static const char * const xt_logging_disable_text[] = { - "FALSE", - "TRUE", -}; - -static const struct soc_enum xt_logging_disable_enum[] = { - SOC_ENUM_SINGLE_EXT(2, xt_logging_disable_text), -}; - -static const char *const tdm_data_format[] = { - "LPCM", - "Compr", - "Gen Compr" -}; - -static const char *const tdm_header_type[] = { - "Invalid", - "Default", - "Entertainment", -}; - -static const struct soc_enum tdm_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_data_format), tdm_data_format), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_header_type), tdm_header_type), -}; - -static DEFINE_MUTEX(tdm_mutex); - -static atomic_t tdm_group_ref[IDX_GROUP_TDM_MAX]; - -static struct afe_param_id_tdm_lane_cfg tdm_lane_cfg = { - AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX, - 0x0, -}; - -/* cache of group cfg per parent node */ -static struct afe_param_id_group_device_tdm_cfg tdm_group_cfg = { - AFE_API_VERSION_GROUP_DEVICE_TDM_CONFIG, - AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX, - 0, - {AFE_PORT_ID_QUATERNARY_TDM_RX, - AFE_PORT_ID_QUATERNARY_TDM_RX_1, - AFE_PORT_ID_QUATERNARY_TDM_RX_2, - AFE_PORT_ID_QUATERNARY_TDM_RX_3, - AFE_PORT_ID_QUATERNARY_TDM_RX_4, - AFE_PORT_ID_QUATERNARY_TDM_RX_5, - AFE_PORT_ID_QUATERNARY_TDM_RX_6, - AFE_PORT_ID_QUATERNARY_TDM_RX_7}, - 8, - 48000, - 32, - 8, - 32, - 0xFF, -}; - -static u32 num_tdm_group_ports; - -static struct afe_clk_set tdm_clk_set = { - AFE_API_VERSION_CLOCK_SET, - Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT, - Q6AFE_LPASS_IBIT_CLK_DISABLE, - Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, -}; - -static int msm_dai_q6_get_tdm_clk_ref(u16 id) -{ - switch (id) { - case IDX_GROUP_PRIMARY_TDM_RX: - case IDX_GROUP_PRIMARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_PRIMARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_PRIMARY_TDM_TX]); - case IDX_GROUP_SECONDARY_TDM_RX: - case IDX_GROUP_SECONDARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_SECONDARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_SECONDARY_TDM_TX]); - case IDX_GROUP_TERTIARY_TDM_RX: - case IDX_GROUP_TERTIARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_TERTIARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_TERTIARY_TDM_TX]); - case IDX_GROUP_QUATERNARY_TDM_RX: - case IDX_GROUP_QUATERNARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_QUATERNARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_QUATERNARY_TDM_TX]); - case IDX_GROUP_QUINARY_TDM_RX: - case IDX_GROUP_QUINARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_QUINARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_QUINARY_TDM_TX]); - case IDX_GROUP_SENARY_TDM_RX: - case IDX_GROUP_SENARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_SENARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_SENARY_TDM_TX]); - default: return -EINVAL; - } -} - -int msm_dai_q6_get_group_idx(u16 id) -{ - switch (id) { - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_GROUP_PRIMARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_GROUP_PRIMARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_GROUP_SECONDARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_GROUP_SECONDARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_GROUP_TERTIARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_GROUP_TERTIARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_GROUP_QUATERNARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_GROUP_QUATERNARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_GROUP_QUINARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_GROUP_QUINARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - return IDX_GROUP_SENARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_TX_7: - return IDX_GROUP_SENARY_TDM_TX; - default: return -EINVAL; - } -} - -int msm_dai_q6_get_port_idx(u16 id) -{ - switch (id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - return IDX_PRIMARY_TDM_RX_0; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return IDX_PRIMARY_TDM_TX_0; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return IDX_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return IDX_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return IDX_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return IDX_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return IDX_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return IDX_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return IDX_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return IDX_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return IDX_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return IDX_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return IDX_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return IDX_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return IDX_SECONDARY_TDM_RX_0; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return IDX_SECONDARY_TDM_TX_0; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return IDX_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return IDX_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return IDX_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return IDX_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return IDX_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return IDX_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return IDX_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return IDX_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return IDX_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return IDX_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return IDX_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return IDX_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return IDX_TERTIARY_TDM_RX_0; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return IDX_TERTIARY_TDM_TX_0; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return IDX_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return IDX_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return IDX_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return IDX_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return IDX_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return IDX_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return IDX_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return IDX_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return IDX_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return IDX_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return IDX_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return IDX_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return IDX_QUATERNARY_TDM_RX_0; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return IDX_QUATERNARY_TDM_TX_0; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return IDX_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return IDX_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return IDX_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return IDX_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return IDX_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return IDX_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return IDX_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return IDX_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return IDX_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return IDX_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return IDX_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return IDX_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return IDX_QUINARY_TDM_RX_0; - case AFE_PORT_ID_QUINARY_TDM_TX: - return IDX_QUINARY_TDM_TX_0; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return IDX_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return IDX_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return IDX_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return IDX_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return IDX_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return IDX_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return IDX_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return IDX_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return IDX_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return IDX_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return IDX_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return IDX_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_QUINARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_TDM_RX: - return IDX_SENARY_TDM_RX_0; - case AFE_PORT_ID_SENARY_TDM_TX: - return IDX_SENARY_TDM_TX_0; - case AFE_PORT_ID_SENARY_TDM_RX_1: - return IDX_SENARY_TDM_RX_1; - case AFE_PORT_ID_SENARY_TDM_TX_1: - return IDX_SENARY_TDM_TX_1; - case AFE_PORT_ID_SENARY_TDM_RX_2: - return IDX_SENARY_TDM_RX_2; - case AFE_PORT_ID_SENARY_TDM_TX_2: - return IDX_SENARY_TDM_TX_2; - case AFE_PORT_ID_SENARY_TDM_RX_3: - return IDX_SENARY_TDM_RX_3; - case AFE_PORT_ID_SENARY_TDM_TX_3: - return IDX_SENARY_TDM_TX_3; - case AFE_PORT_ID_SENARY_TDM_RX_4: - return IDX_SENARY_TDM_RX_4; - case AFE_PORT_ID_SENARY_TDM_TX_4: - return IDX_SENARY_TDM_TX_4; - case AFE_PORT_ID_SENARY_TDM_RX_5: - return IDX_SENARY_TDM_RX_5; - case AFE_PORT_ID_SENARY_TDM_TX_5: - return IDX_SENARY_TDM_TX_5; - case AFE_PORT_ID_SENARY_TDM_RX_6: - return IDX_SENARY_TDM_RX_6; - case AFE_PORT_ID_SENARY_TDM_TX_6: - return IDX_SENARY_TDM_TX_6; - case AFE_PORT_ID_SENARY_TDM_RX_7: - return IDX_SENARY_TDM_RX_7; - case AFE_PORT_ID_SENARY_TDM_TX_7: - return IDX_SENARY_TDM_TX_7; - default: return -EINVAL; - } -} - -static u16 msm_dai_q6_max_num_slot(int frame_rate) -{ - /* Max num of slots is bits per frame divided - * by bits per sample which is 16 - */ - switch (frame_rate) { - case AFE_PORT_PCM_BITS_PER_FRAME_8: - return 0; - case AFE_PORT_PCM_BITS_PER_FRAME_16: - return 1; - case AFE_PORT_PCM_BITS_PER_FRAME_32: - return 2; - case AFE_PORT_PCM_BITS_PER_FRAME_64: - return 4; - case AFE_PORT_PCM_BITS_PER_FRAME_128: - return 8; - case AFE_PORT_PCM_BITS_PER_FRAME_256: - return 16; - default: - pr_err("%s Invalid bits per frame %d\n", - __func__, frame_rate); - return 0; - } -} - -static int msm_dai_q6_dai_add_route(struct snd_soc_dai *dai) -{ - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->driver) { - pr_err("%s: Invalid params dai driver\n", __func__); - return -EINVAL; - } - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - snd_soc_dapm_ignore_suspend(dapm, intercon.sink); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - snd_soc_dapm_ignore_suspend(dapm, intercon.source); - } - return 0; -} - -static int msm_dai_q6_auxpcm_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = &aux_dai_data->bdai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = - (struct msm_dai_auxpcm_pdata *) dai->dev->platform_data; - int rc = 0, slot_mapping_copy_len = 0; - - if (params_channels(params) != 1 || (params_rate(params) != 8000 && - params_rate(params) != 16000)) { - dev_err(dai->dev, "%s: invalid param chan %d rate %d\n", - __func__, params_channels(params), params_rate(params)); - return -EINVAL; - } - - mutex_lock(&aux_dai_data->rlock); - - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - /* AUXPCM DAI in use */ - if (dai_data->rate != params_rate(params)) { - dev_err(dai->dev, "%s: rate mismatch of running DAI\n", - __func__); - rc = -EINVAL; - } - mutex_unlock(&aux_dai_data->rlock); - return rc; - } - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - if (dai_data->rate == 8000) { - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = auxpcm_pdata->mode_8k.mode; - dai_data->port_config.pcm.sync_src = auxpcm_pdata->mode_8k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_8k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_8k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_8k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_8k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_8k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_8k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_8k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(dai->dev, "%s 8khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } - } else { - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = - auxpcm_pdata->mode_16k.mode; - dai_data->port_config.pcm.sync_src = - auxpcm_pdata->mode_16k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_16k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_16k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_16k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_16k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_16k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_16k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_16k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(dai->dev, "%s 16khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } - } - - dev_dbg(dai->dev, "%s: aux_mode 0x%x sync_src 0x%x frame_setting 0x%x\n", - __func__, dai_data->port_config.pcm.aux_mode, - dai_data->port_config.pcm.sync_src, - dai_data->port_config.pcm.frame_setting); - dev_dbg(dai->dev, "%s: qtype 0x%x dout 0x%x num_map[0] 0x%x\n" - "num_map[1] 0x%x num_map[2] 0x%x num_map[3] 0x%x\n", - __func__, dai_data->port_config.pcm.quantype, - dai_data->port_config.pcm.ctrl_data_out_enable, - dai_data->port_config.pcm.slot_number_mapping[0], - dai_data->port_config.pcm.slot_number_mapping[1], - dai_data->port_config.pcm.slot_number_mapping[2], - dai_data->port_config.pcm.slot_number_mapping[3]); - - mutex_unlock(&aux_dai_data->rlock); - return rc; -} - -static int msm_dai_q6_auxpcm_set_clk( - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data, - u16 port_id, bool enable) -{ - int rc; - - pr_debug("%s: afe_clk_ver: %d, port_id: %d, enable: %d\n", __func__, - aux_dai_data->afe_clk_ver, port_id, enable); - if (aux_dai_data->afe_clk_ver == AFE_CLK_VERSION_V2) { - aux_dai_data->clk_set.enable = enable; - rc = afe_set_lpass_clock_v2(port_id, - &aux_dai_data->clk_set); - } else { - if (!enable) - aux_dai_data->clk_cfg.clk_val1 = 0; - rc = afe_set_lpass_clock(port_id, - &aux_dai_data->clk_cfg); - } - return rc; -} - -static void msm_dai_q6_auxpcm_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = - dev_get_drvdata(dai->dev); - - mutex_lock(&aux_dai_data->rlock); - - if (!(test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status))) { - dev_dbg(dai->dev, "%s(): dai->id %d PCM ports already closed\n", - __func__, dai->id); - goto exit; - } - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status)) - clear_bit(STATUS_TX_PORT, - aux_dai_data->auxpcm_port_status); - else { - dev_dbg(dai->dev, "%s: PCM_TX port already closed\n", - __func__); - goto exit; - } - } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) - clear_bit(STATUS_RX_PORT, - aux_dai_data->auxpcm_port_status); - else { - dev_dbg(dai->dev, "%s: PCM_RX port already closed\n", - __func__); - goto exit; - } - } - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: cannot shutdown PCM ports\n", - __func__); - goto exit; - } - - dev_dbg(dai->dev, "%s: dai->id = %d closing PCM AFE ports\n", - __func__, dai->id); - - rc = afe_close(aux_dai_data->rx_pid); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close PCM_RX AFE port\n"); - - rc = afe_close(aux_dai_data->tx_pid); - if (rc < 0) - dev_err(dai->dev, "fail to close AUX PCM TX port\n"); - - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->rx_pid, false); - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->tx_pid, false); -exit: - mutex_unlock(&aux_dai_data->rlock); -} - -static int msm_dai_q6_auxpcm_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = &aux_dai_data->bdai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = NULL; - int rc = 0; - u32 pcm_clk_rate; - - auxpcm_pdata = dai->dev->platform_data; - mutex_lock(&aux_dai_data->rlock); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (test_bit(STATUS_TX_PORT, - aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: PCM_TX port already ON\n", - __func__); - goto exit; - } else - set_bit(STATUS_TX_PORT, - aux_dai_data->auxpcm_port_status); - } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (test_bit(STATUS_RX_PORT, - aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: PCM_RX port already ON\n", - __func__); - goto exit; - } else - set_bit(STATUS_RX_PORT, - aux_dai_data->auxpcm_port_status); - } - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) && - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: PCM ports already set\n", __func__); - goto exit; - } - - dev_dbg(dai->dev, "%s: dai->id:%d opening afe ports\n", - __func__, dai->id); - - rc = afe_q6_interface_prepare(); - if (rc < 0) { - dev_err(dai->dev, "fail to open AFE APR\n"); - goto fail; - } - - /* - * For AUX PCM Interface the below sequence of clk - * settings and afe_open is a strict requirement. - * - * Also using afe_open instead of afe_port_start_nowait - * to make sure the port is open before deasserting the - * clock line. This is required because pcm register is - * not written before clock deassert. Hence the hw does - * not get updated with new setting if the below clock - * assert/deasset and afe_open sequence is not followed. - */ - - if (dai_data->rate == 8000) { - pcm_clk_rate = auxpcm_pdata->mode_8k.pcm_clk_rate; - } else if (dai_data->rate == 16000) { - pcm_clk_rate = (auxpcm_pdata->mode_16k.pcm_clk_rate); - } else { - dev_err(dai->dev, "%s: Invalid AUX PCM rate %d\n", __func__, - dai_data->rate); - rc = -EINVAL; - goto fail; - } - if (aux_dai_data->afe_clk_ver == AFE_CLK_VERSION_V2) { - memcpy(&aux_dai_data->clk_set, &lpass_clk_set_default, - sizeof(struct afe_clk_set)); - aux_dai_data->clk_set.clk_freq_in_hz = pcm_clk_rate; - - switch (dai->id) { - case MSM_DAI_PRI_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_PRI_PCM_EBIT; - break; - case MSM_DAI_SEC_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEC_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEC_PCM_EBIT; - break; - case MSM_DAI_TERT_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_TER_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_TER_PCM_EBIT; - break; - case MSM_DAI_QUAT_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUAD_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUAD_PCM_EBIT; - break; - case MSM_DAI_QUIN_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUIN_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT; - break; - case MSM_DAI_SEN_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEN_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEN_PCM_EBIT; - break; - default: - dev_err(dai->dev, "%s: AUXPCM id: %d not supported\n", - __func__, dai->id); - break; - } - } else { - memcpy(&aux_dai_data->clk_cfg, &lpass_clk_cfg_default, - sizeof(struct afe_clk_cfg)); - aux_dai_data->clk_cfg.clk_val1 = pcm_clk_rate; - } - - rc = msm_dai_q6_auxpcm_set_clk(aux_dai_data, - aux_dai_data->rx_pid, true); - if (rc < 0) { - dev_err(dai->dev, - "%s:afe_set_lpass_clock on RX pcm_src_clk failed\n", - __func__); - goto fail; - } - - rc = msm_dai_q6_auxpcm_set_clk(aux_dai_data, - aux_dai_data->tx_pid, true); - if (rc < 0) { - dev_err(dai->dev, - "%s:afe_set_lpass_clock on TX pcm_src_clk failed\n", - __func__); - goto fail; - } - - afe_open(aux_dai_data->rx_pid, &dai_data->port_config, dai_data->rate); - afe_open(aux_dai_data->tx_pid, &dai_data->port_config, dai_data->rate); - goto exit; - -fail: - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - clear_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); - else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - clear_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status); - -exit: - mutex_unlock(&aux_dai_data->rlock); - return rc; -} - -static int msm_dai_q6_auxpcm_trigger(struct snd_pcm_substream *substream, - int cmd, struct snd_soc_dai *dai) -{ - int rc = 0; - - pr_debug("%s:port:%d cmd:%d\n", - __func__, dai->id, cmd); - - switch (cmd) { - - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - /* afe_open will be called from prepare */ - return 0; - - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - return 0; - - default: - pr_err("%s: cmd %d\n", __func__, cmd); - rc = -EINVAL; - } - - return rc; - -} - -static int msm_dai_q6_dai_auxpcm_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data; - int rc; - - aux_dai_data = dev_get_drvdata(dai->dev); - - dev_dbg(dai->dev, "%s: dai->id %d closing afe\n", - __func__, dai->id); - - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - rc = afe_close(aux_dai_data->rx_pid); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AUXPCM RX AFE port\n"); - rc = afe_close(aux_dai_data->tx_pid); - if (rc < 0) - dev_err(dai->dev, "fail to close AUXPCM TX AFE port\n"); - clear_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); - clear_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status); - } - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->rx_pid, false); - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->tx_pid, false); - return 0; -} - -static int msm_dai_q6_island_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value = ucontrol->value.integer.value[0]; - u16 port_id = (u16)kcontrol->private_value; - - pr_debug("%s: island mode = %d\n", __func__, value); - trace_printk("%s: island mode = %d\n", __func__, value); - - afe_set_island_mode_cfg(port_id, value); - return 0; -} - -static int msm_dai_q6_island_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value; - u16 port_id = (u16)kcontrol->private_value; - - afe_get_island_mode_cfg(port_id, &value); - ucontrol->value.integer.value[0] = value; - return 0; -} - -static void island_mx_ctl_private_free(struct snd_kcontrol *kcontrol) -{ - struct snd_kcontrol_new *knew = snd_kcontrol_chip(kcontrol); - - kfree(knew); -} - -static int msm_dai_q6_add_island_mx_ctls(struct snd_card *card, - const char *dai_name, - int dai_id, void *dai_data) -{ - const char *mx_ctl_name = "TX island"; - char *mixer_str = NULL; - int dai_str_len = 0, ctl_len = 0; - int rc = 0; - struct snd_kcontrol_new *knew = NULL; - struct snd_kcontrol *kctl = NULL; - - dai_str_len = strlen(dai_name) + 1; - - /* Add island related mixer controls */ - ctl_len = dai_str_len + strlen(mx_ctl_name) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %s", dai_name, mx_ctl_name); - - knew = kzalloc(sizeof(struct snd_kcontrol_new), GFP_KERNEL); - if (!knew) { - kfree(mixer_str); - return -ENOMEM; - } - knew->iface = SNDRV_CTL_ELEM_IFACE_MIXER; - knew->info = snd_ctl_boolean_mono_info; - knew->get = msm_dai_q6_island_mode_get; - knew->put = msm_dai_q6_island_mode_put; - knew->name = mixer_str; - knew->private_value = dai_id; - kctl = snd_ctl_new1(knew, knew); - if (!kctl) { - kfree(knew); - kfree(mixer_str); - return -ENOMEM; - } - kctl->private_free = island_mx_ctl_private_free; - rc = snd_ctl_add(card, kctl); - if (rc < 0) - pr_err("%s: err add config ctl, DAI = %s\n", - __func__, dai_name); - kfree(mixer_str); - - return rc; -} - -/* - * For single CPU DAI registration, the dai id needs to be - * set explicitly in the dai probe as ASoC does not read - * the cpu->driver->id field rather it assigns the dai id - * from the device name that is in the form %s.%d. This dai - * id should be assigned to back-end AFE port id and used - * during dai prepare. For multiple dai registration, it - * is not required to call this function, however the dai-> - * driver->id field must be defined and set to corresponding - * AFE Port id. - */ -static inline void msm_dai_q6_set_dai_id(struct snd_soc_dai *dai) -{ - if (!dai->driver) { - dev_err(dai->dev, "DAI driver is not set\n"); - return; - } - if (!dai->driver->id) { - dev_dbg(dai->dev, "DAI driver id is not set\n"); - return; - } - dai->id = dai->driver->id; -} - -static int msm_dai_q6_aux_pcm_probe(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_auxpcm_dai_data *dai_data = NULL; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - msm_dai_q6_set_dai_id(dai); - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai_data->tx_pid, - (void *)dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static struct snd_soc_dai_ops msm_dai_q6_auxpcm_ops = { - .prepare = msm_dai_q6_auxpcm_prepare, - .trigger = msm_dai_q6_auxpcm_trigger, - .hw_params = msm_dai_q6_auxpcm_hw_params, - .shutdown = msm_dai_q6_auxpcm_shutdown, -}; - -static const struct snd_soc_component_driver - msm_dai_q6_aux_pcm_dai_component = { - .name = "msm-auxpcm-dev", -}; - -static struct snd_soc_dai_driver msm_dai_q6_aux_pcm_dai[] = { - { - .playback = { - .stream_name = "AUX PCM Playback", - .aif_name = "AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "AUX PCM Capture", - .aif_name = "AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_PRI_AUXPCM_DT_DEV_ID, - .name = "Pri AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Sec AUX PCM Playback", - .aif_name = "SEC_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Sec AUX PCM Capture", - .aif_name = "SEC_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_SEC_AUXPCM_DT_DEV_ID, - .name = "Sec AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Tert AUX PCM Playback", - .aif_name = "TERT_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Tert AUX PCM Capture", - .aif_name = "TERT_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_TERT_AUXPCM_DT_DEV_ID, - .name = "Tert AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Quat AUX PCM Playback", - .aif_name = "QUAT_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Quat AUX PCM Capture", - .aif_name = "QUAT_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_QUAT_AUXPCM_DT_DEV_ID, - .name = "Quat AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Quin AUX PCM Playback", - .aif_name = "QUIN_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Quin AUX PCM Capture", - .aif_name = "QUIN_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_QUIN_AUXPCM_DT_DEV_ID, - .name = "Quin AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Sen AUX PCM Playback", - .aif_name = "SEN_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Sen AUX PCM Capture", - .aif_name = "SEN_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_SEN_AUXPCM_DT_DEV_ID, - .name = "Sen AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, -}; - -static int msm_dai_q6_spdif_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->spdif_port.cfg.data_format = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_spdif_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->spdif_port.cfg.data_format; - return 0; -} - -static int msm_dai_q6_spdif_source_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->spdif_port.cfg.src_sel = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_spdif_source_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->spdif_port.cfg.src_sel; - return 0; -} - -static const char * const spdif_format[] = { - "LPCM", - "Compr" -}; - -static const char * const spdif_source[] = { - "Optical", "EXT-ARC", "Coaxial", "VT-ARC" -}; - -static const struct soc_enum spdif_rx_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_format), spdif_format), -}; - -static const struct soc_enum spdif_tx_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_source), spdif_source), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_format), spdif_format), -}; - -static int msm_dai_q6_spdif_chstatus_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int ret = 0; - - dai_data->spdif_port.ch_status.status_type = - AFE_API_VERSION_SPDIF_CH_STATUS_CONFIG; - memset(dai_data->spdif_port.ch_status.status_mask, - CHANNEL_STATUS_MASK_INIT, CHANNEL_STATUS_SIZE); - dai_data->spdif_port.ch_status.status_mask[0] = - CHANNEL_STATUS_MASK; - - memcpy(dai_data->spdif_port.ch_status.status_bits, - ucontrol->value.iec958.status, CHANNEL_STATUS_SIZE); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: Port already started. Dynamic update\n", - __func__); - ret = afe_send_spdif_ch_status_cfg( - &dai_data->spdif_port.ch_status, - dai_data->port_id); - } - return ret; -} - -static int msm_dai_q6_spdif_chstatus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - memcpy(ucontrol->value.iec958.status, - dai_data->spdif_port.ch_status.status_bits, - CHANNEL_STATUS_SIZE); - return 0; -} - -static int msm_dai_q6_spdif_chstatus_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; - uinfo->count = 1; - return 0; -} - -static const struct snd_kcontrol_new spdif_rx_config_controls[] = { - /* Primary SPDIF output */ - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM), - .info = msm_dai_q6_spdif_chstatus_info, - .get = msm_dai_q6_spdif_chstatus_get, - .put = msm_dai_q6_spdif_chstatus_put, - }, - SOC_ENUM_EXT("PRI SPDIF RX Format", spdif_rx_config_enum[0], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put), - /* Secondary SPDIF output */ - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("SEC", PLAYBACK, PCM_STREAM), - .info = msm_dai_q6_spdif_chstatus_info, - .get = msm_dai_q6_spdif_chstatus_get, - .put = msm_dai_q6_spdif_chstatus_put, - }, - SOC_ENUM_EXT("SEC SPDIF RX Format", spdif_rx_config_enum[0], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put) -}; - -static const struct snd_kcontrol_new spdif_tx_config_controls[] = { - SOC_ENUM_EXT("PRI SPDIF TX Source", spdif_tx_config_enum[0], - msm_dai_q6_spdif_source_get, - msm_dai_q6_spdif_source_put), - SOC_ENUM_EXT("PRI SPDIF TX Format", spdif_tx_config_enum[1], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put), - SOC_ENUM_EXT("SEC SPDIF TX Source", spdif_tx_config_enum[0], - msm_dai_q6_spdif_source_get, - msm_dai_q6_spdif_source_put), - SOC_ENUM_EXT("SEC SPDIF TX Format", spdif_tx_config_enum[1], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put) -}; - -static void msm_dai_q6_spdif_process_event(uint32_t opcode, uint32_t token, - uint32_t *payload, void *private_data) -{ - struct msm_dai_q6_spdif_event_msg *evt; - struct msm_dai_q6_spdif_dai_data *dai_data; - int preemph_old = 0; - int preemph_new = 0; - - evt = (struct msm_dai_q6_spdif_event_msg *)payload; - dai_data = (struct msm_dai_q6_spdif_dai_data *)private_data; - - preemph_old = GET_PREEMPH(dai_data->fmt_event.channel_status[0]); - preemph_new = GET_PREEMPH(evt->fmt_event.channel_status[0]); - - pr_debug("%s: old state %d, fmt %d, rate %d, preemph %d\n", - __func__, dai_data->fmt_event.status, - dai_data->fmt_event.data_format, - dai_data->fmt_event.sample_rate, - preemph_old); - pr_debug("%s: new state %d, fmt %d, rate %d, preemph %d\n", - __func__, evt->fmt_event.status, - evt->fmt_event.data_format, - evt->fmt_event.sample_rate, - preemph_new); - - dai_data->fmt_event.status = evt->fmt_event.status; - dai_data->fmt_event.data_format = evt->fmt_event.data_format; - dai_data->fmt_event.sample_rate = evt->fmt_event.sample_rate; - dai_data->fmt_event.channel_status[0] = - evt->fmt_event.channel_status[0]; - dai_data->fmt_event.channel_status[1] = - evt->fmt_event.channel_status[1]; - dai_data->fmt_event.channel_status[2] = - evt->fmt_event.channel_status[2]; - dai_data->fmt_event.channel_status[3] = - evt->fmt_event.channel_status[3]; - dai_data->fmt_event.channel_status[4] = - evt->fmt_event.channel_status[4]; - dai_data->fmt_event.channel_status[5] = - evt->fmt_event.channel_status[5]; -} - -static int msm_dai_q6_spdif_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->spdif_port.cfg.num_channels = dai_data->channels; - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->spdif_port.cfg.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->spdif_port.cfg.bit_width = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->bitwidth = dai_data->spdif_port.cfg.bit_width; - dai_data->spdif_port.cfg.sample_rate = dai_data->rate; - dai_data->spdif_port.cfg.spdif_cfg_minor_version = - AFE_API_VERSION_SPDIF_CONFIG_V2; - dev_dbg(dai->dev, " channel %d sample rate %d bit width %d\n", - dai_data->channels, dai_data->rate, - dai_data->spdif_port.cfg.bit_width); - dai_data->spdif_port.cfg.reserved = 0; - return 0; -} - -static void msm_dai_q6_spdif_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_info("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - return; - } - - rc = afe_close(dai->id); - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - dai_data->fmt_event.status = 0; /* report invalid line state */ - - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); -} - -static int msm_dai_q6_spdif_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_spdif_reg_event_cfg(dai->id, - AFE_MODULE_REGISTER_EVENT_FLAG, - msm_dai_q6_spdif_process_event, - dai_data); - if (rc < 0) - dev_err(dai->dev, - "fail to register event for port 0x%x\n", - dai->id); - - rc = afe_spdif_port_start(dai->id, &dai_data->spdif_port, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - - return rc; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_state(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.status); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.status); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_format(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.data_format); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.data_format); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_rate(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.sample_rate); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.sample_rate); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_preemph(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - int preemph = 0; - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - preemph = GET_PREEMPH(dai_data->fmt_event.channel_status[0]); - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", preemph); - pr_debug("%s: '%d'\n", __func__, preemph); - - return ret; -} - -static DEVICE_ATTR(audio_state, 0444, msm_dai_q6_spdif_sysfs_rda_audio_state, - NULL); -static DEVICE_ATTR(audio_format, 0444, msm_dai_q6_spdif_sysfs_rda_audio_format, - NULL); -static DEVICE_ATTR(audio_rate, 0444, msm_dai_q6_spdif_sysfs_rda_audio_rate, - NULL); -static DEVICE_ATTR(audio_preemph, 0444, - msm_dai_q6_spdif_sysfs_rda_audio_preemph, NULL); - -static struct attribute *msm_dai_q6_spdif_fs_attrs[] = { - &dev_attr_audio_state.attr, - &dev_attr_audio_format.attr, - &dev_attr_audio_rate.attr, - &dev_attr_audio_preemph.attr, - NULL, -}; -static struct attribute_group msm_dai_q6_spdif_fs_attrs_group = { - .attrs = msm_dai_q6_spdif_fs_attrs, -}; - -static int msm_dai_q6_spdif_sysfs_create(struct snd_soc_dai *dai, - struct msm_dai_q6_spdif_dai_data *dai_data) -{ - int rc; - - rc = sysfs_create_group(&dai->dev->kobj, - &msm_dai_q6_spdif_fs_attrs_group); - if (rc) { - pr_err("%s: failed, rc=%d\n", __func__, rc); - return rc; - } - dai_data->kobj = &dai->dev->kobj; - - return 0; -} - -static void msm_dai_q6_spdif_sysfs_remove(struct snd_soc_dai *dai, - struct msm_dai_q6_spdif_dai_data *dai_data) -{ - if (dai_data->kobj) - sysfs_remove_group(dai_data->kobj, - &msm_dai_q6_spdif_fs_attrs_group); - dai_data->kobj = NULL; -} - -static int msm_dai_q6_spdif_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data; - int rc = 0; - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai) { - pr_err("%s: dai not found!!\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - dai_data = kzalloc(sizeof(struct msm_dai_q6_spdif_dai_data), - GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_set_dai_id(dai); - dai_data->port_id = dai->id; - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_rx_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_rx_config_controls[3], - dai_data)); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - rc = msm_dai_q6_spdif_sysfs_create(dai, dai_data); - - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - rc = msm_dai_q6_spdif_sysfs_create(dai, dai_data); - - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[3], - dai_data)); - break; - } - if (rc < 0) - dev_err(dai->dev, - "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - dapm = snd_soc_component_get_dapm(dai->component); - - memset(&intercon, 0, sizeof(intercon)); - if (!rc && dai && dai->driver) { - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - } - return rc; -} - -static int msm_dai_q6_spdif_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_spdif_reg_event_cfg(dai->id, - AFE_MODULE_DEREGISTER_EVENT_FLAG, - NULL, - dai_data); - if (rc < 0) - dev_err(dai->dev, - "fail to deregister event for port 0x%x\n", - dai->id); - - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - - msm_dai_q6_spdif_sysfs_remove(dai, dai_data); - - kfree(dai_data); - - return 0; -} - - -static struct snd_soc_dai_ops msm_dai_q6_spdif_ops = { - .prepare = msm_dai_q6_spdif_prepare, - .hw_params = msm_dai_q6_spdif_hw_params, - .shutdown = msm_dai_q6_spdif_shutdown, -}; - -static struct snd_soc_dai_driver msm_dai_q6_spdif_spdif_rx_dai[] = { - { - .playback = { - .stream_name = "Primary SPDIF Playback", - .aif_name = "PRI_SPDIF_RX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "PRI_SPDIF_RX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_PRIMARY_SPDIF_RX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, - { - .playback = { - .stream_name = "Secondary SPDIF Playback", - .aif_name = "SEC_SPDIF_RX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "SEC_SPDIF_RX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_SECONDARY_SPDIF_RX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_spdif_spdif_tx_dai[] = { - { - .capture = { - .stream_name = "Primary SPDIF Capture", - .aif_name = "PRI_SPDIF_TX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "PRI_SPDIF_TX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_PRIMARY_SPDIF_TX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, - { - .capture = { - .stream_name = "Secondary SPDIF Capture", - .aif_name = "SEC_SPDIF_TX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "SEC_SPDIF_TX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_SECONDARY_SPDIF_TX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, -}; - -static const struct snd_soc_component_driver msm_dai_spdif_q6_component = { - .name = "msm-dai-q6-spdif", -}; - -static int msm_dai_q6_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if (dai_data->enc_config.format != ENC_FMT_NONE) { - int bitwidth = 0; - - switch (dai_data->afe_rx_in_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - bitwidth = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bitwidth = 16; - break; - } - pr_debug("%s: calling AFE_PORT_START_V2 with enc_format: %d\n", - __func__, dai_data->enc_config.format); - rc = afe_port_start_v2(dai->id, &dai_data->port_config, - dai_data->rate, - dai_data->afe_rx_in_channels, - bitwidth, - &dai_data->enc_config, NULL); - if (rc < 0) - pr_err("%s: afe_port_start_v2 failed error: %d\n", - __func__, rc); - } else if (dai_data->dec_config.format != DEC_FMT_NONE) { - int bitwidth = 0; - - /* - * If bitwidth is not configured set default value to - * zero, so that decoder port config uses slim device - * bit width value in afe decoder config. - */ - switch (dai_data->afe_tx_out_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - bitwidth = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - bitwidth = 16; - break; - default: - bitwidth = 0; - break; - } - pr_debug("%s: calling AFE_PORT_START_V2 with dec format: %d\n", - __func__, dai_data->dec_config.format); - rc = afe_port_start_v2(dai->id, &dai_data->port_config, - dai_data->rate, - dai_data->afe_tx_out_channels, - bitwidth, - NULL, &dai_data->dec_config); - if (rc < 0) { - pr_err("%s: fail to open AFE port 0x%x\n", - __func__, dai->id); - } - } else { - rc = afe_port_start(dai->id, &dai_data->port_config, - dai_data->rate); - } - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - return rc; -} - -static int msm_dai_q6_cdc_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - switch (dai_data->channels) { - case 2: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_STEREO; - break; - case 1: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - return -EINVAL; - pr_err("%s: err channels %d\n", - __func__, dai_data->channels); - break; - } - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.i2s.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.i2s.bit_width = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->port_config.i2s.sample_rate = dai_data->rate; - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.data_format = AFE_LINEAR_PCM_DATA; - dev_dbg(dai->dev, " channel %d sample rate %d entered\n", - dai_data->channels, dai_data->rate); - - dai_data->port_config.i2s.channel_mode = 1; - return 0; -} - -static u16 num_of_bits_set(u16 sd_line_mask) -{ - u8 num_bits_set = 0; - - while (sd_line_mask) { - num_bits_set++; - sd_line_mask = sd_line_mask & (sd_line_mask - 1); - } - return num_bits_set; -} - -static int msm_dai_q6_i2s_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - struct msm_i2s_data *i2s_pdata = - (struct msm_i2s_data *) dai->dev->platform_data; - - dai_data->channels = params_channels(params); - if (num_of_bits_set(i2s_pdata->sd_lines) == 1) { - switch (dai_data->channels) { - case 2: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_STEREO; - break; - case 1: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - pr_warn("%s: greater than stereo has not been validated %d", - __func__, dai_data->channels); - break; - } - } - dai_data->rate = params_rate(params); - dai_data->port_config.i2s.sample_rate = dai_data->rate; - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.data_format = AFE_LINEAR_PCM_DATA; - /* Q6 only supports 16 as now */ - dai_data->port_config.i2s.bit_width = 16; - dai_data->port_config.i2s.channel_mode = 1; - - return 0; -} - -static int msm_dai_q6_slim_bus_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.slim_sch.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.slim_sch.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.slim_sch.bit_width = 32; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->port_config.slim_sch.sb_cfg_minor_version = - AFE_API_VERSION_SLIMBUS_CONFIG; - dai_data->port_config.slim_sch.sample_rate = dai_data->rate; - dai_data->port_config.slim_sch.num_channels = dai_data->channels; - - dev_dbg(dai->dev, "%s:slimbus_dev_id[%hu] bit_wd[%hu] format[%hu]\n" - "num_channel %hu shared_ch_mapping[0] %hu\n" - "slave_port_mapping[1] %hu slave_port_mapping[2] %hu\n" - "sample_rate %d\n", __func__, - dai_data->port_config.slim_sch.slimbus_dev_id, - dai_data->port_config.slim_sch.bit_width, - dai_data->port_config.slim_sch.data_format, - dai_data->port_config.slim_sch.num_channels, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1], - dai_data->port_config.slim_sch.shared_ch_mapping[2], - dai_data->rate); - - return 0; -} - -static int msm_dai_q6_usb_audio_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.usb_audio.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.usb_audio.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.usb_audio.bit_width = 32; - break; - - default: - dev_err(dai->dev, "%s: invalid format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - dai_data->port_config.usb_audio.cfg_minor_version = - AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - dai_data->port_config.usb_audio.num_channels = dai_data->channels; - dai_data->port_config.usb_audio.sample_rate = dai_data->rate; - - dev_dbg(dai->dev, "%s: dev_id[0x%x] bit_wd[%hu] format[%hu]\n" - "num_channel %hu sample_rate %d\n", __func__, - dai_data->port_config.usb_audio.dev_token, - dai_data->port_config.usb_audio.bit_width, - dai_data->port_config.usb_audio.data_format, - dai_data->port_config.usb_audio.num_channels, - dai_data->port_config.usb_audio.sample_rate); - - return 0; -} - -static int msm_dai_q6_bt_fm_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - dev_dbg(dai->dev, "channels %d sample rate %d entered\n", - dai_data->channels, dai_data->rate); - - memset(&dai_data->port_config, 0, sizeof(dai_data->port_config)); - - pr_debug("%s: setting bt_fm parameters\n", __func__); - - dai_data->port_config.int_bt_fm.bt_fm_cfg_minor_version = - AFE_API_VERSION_INTERNAL_BT_FM_CONFIG; - dai_data->port_config.int_bt_fm.num_channels = dai_data->channels; - dai_data->port_config.int_bt_fm.sample_rate = dai_data->rate; - dai_data->port_config.int_bt_fm.bit_width = 16; - - return 0; -} - -static int msm_dai_q6_afe_rtproxy_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->rate = params_rate(params); - dai_data->port_config.rtproxy.num_channels = params_channels(params); - dai_data->port_config.rtproxy.sample_rate = params_rate(params); - - pr_debug("channel %d entered,dai_id: %d,rate: %d\n", - dai_data->port_config.rtproxy.num_channels, dai->id, dai_data->rate); - - dai_data->port_config.rtproxy.rt_proxy_cfg_minor_version = - AFE_API_VERSION_RT_PROXY_CONFIG; - dai_data->port_config.rtproxy.bit_width = 16; /* Q6 only supports 16 */ - dai_data->port_config.rtproxy.interleaved = 1; - dai_data->port_config.rtproxy.frame_size = params_period_bytes(params); - dai_data->port_config.rtproxy.jitter_allowance = - dai_data->port_config.rtproxy.frame_size/2; - dai_data->port_config.rtproxy.low_water_mark = 0; - dai_data->port_config.rtproxy.high_water_mark = 0; - - return 0; -} - -static int msm_dai_q6_pseudo_port_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - /* Q6 only supports 16 as now */ - dai_data->port_config.pseudo_port.pseud_port_cfg_minor_version = - AFE_API_VERSION_PSEUDO_PORT_CONFIG; - dai_data->port_config.pseudo_port.num_channels = - params_channels(params); - dai_data->port_config.pseudo_port.bit_width = 16; - dai_data->port_config.pseudo_port.data_format = 0; - dai_data->port_config.pseudo_port.timing_mode = - AFE_PSEUDOPORT_TIMING_MODE_TIMER; - dai_data->port_config.pseudo_port.sample_rate = params_rate(params); - - dev_dbg(dai->dev, "%s: bit_wd[%hu] num_channels [%hu] format[%hu]\n" - "timing Mode %hu sample_rate %d\n", __func__, - dai_data->port_config.pseudo_port.bit_width, - dai_data->port_config.pseudo_port.num_channels, - dai_data->port_config.pseudo_port.data_format, - dai_data->port_config.pseudo_port.timing_mode, - dai_data->port_config.pseudo_port.sample_rate); - - return 0; -} - -/* Current implementation assumes hw_param is called once - * This may not be the case but what to do when ADM and AFE - * port are already opened and parameter changes - */ -static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - int rc = 0; - - switch (dai->id) { - case PRIMARY_I2S_TX: - case PRIMARY_I2S_RX: - case SECONDARY_I2S_RX: - rc = msm_dai_q6_cdc_hw_params(params, dai, substream->stream); - break; - case MI2S_RX: - rc = msm_dai_q6_i2s_hw_params(params, dai, substream->stream); - break; - case SLIMBUS_0_RX: - case SLIMBUS_1_RX: - case SLIMBUS_2_RX: - case SLIMBUS_3_RX: - case SLIMBUS_4_RX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_7_RX: - case SLIMBUS_8_RX: - case SLIMBUS_9_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_TX: - case SLIMBUS_2_TX: - case SLIMBUS_3_TX: - case SLIMBUS_4_TX: - case SLIMBUS_5_TX: - case SLIMBUS_6_TX: - case SLIMBUS_7_TX: - case SLIMBUS_8_TX: - case SLIMBUS_9_TX: - rc = msm_dai_q6_slim_bus_hw_params(params, dai, - substream->stream); - break; - case INT_BT_SCO_RX: - case INT_BT_SCO_TX: - case INT_BT_A2DP_RX: - case INT_FM_RX: - case INT_FM_TX: - rc = msm_dai_q6_bt_fm_hw_params(params, dai, substream->stream); - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - rc = msm_dai_q6_usb_audio_hw_params(params, dai, - substream->stream); - break; - case RT_PROXY_DAI_001_TX: - case RT_PROXY_DAI_001_RX: - case RT_PROXY_DAI_002_TX: - case RT_PROXY_DAI_002_RX: - case RT_PROXY_PORT_002_TX: - case RT_PROXY_PORT_002_RX: - rc = msm_dai_q6_afe_rtproxy_hw_params(params, dai); - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - rc = msm_dai_q6_pseudo_port_hw_params(params, - dai, substream->stream); - break; - default: - dev_err(dai->dev, "invalid AFE port ID 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - - return rc; -} - -static void msm_dai_q6_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: stop pseudo port:%d\n", __func__, dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } -} - -static int msm_dai_q6_cdc_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - dai_data->port_config.i2s.ws_src = 1; /* CPU is master */ - break; - case SND_SOC_DAIFMT_CBM_CFM: - dai_data->port_config.i2s.ws_src = 0; /* CPU is slave */ - break; - default: - pr_err("%s: fmt 0x%x\n", - __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - int rc = 0; - - dev_dbg(dai->dev, "%s: id = %d fmt[%d]\n", __func__, - dai->id, fmt); - switch (dai->id) { - case PRIMARY_I2S_TX: - case PRIMARY_I2S_RX: - case MI2S_RX: - case SECONDARY_I2S_RX: - rc = msm_dai_q6_cdc_set_fmt(dai, fmt); - break; - default: - dev_err(dai->dev, "invalid cpu_dai id 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - - return rc; -} - -static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) - -{ - int rc = 0; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - unsigned int i = 0; - - dev_dbg(dai->dev, "%s: id = %d\n", __func__, dai->id); - switch (dai->id) { - case SLIMBUS_0_RX: - case SLIMBUS_1_RX: - case SLIMBUS_2_RX: - case SLIMBUS_3_RX: - case SLIMBUS_4_RX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_7_RX: - case SLIMBUS_8_RX: - case SLIMBUS_9_RX: - /* - * channel number to be between 128 and 255. - * For RX port use channel numbers - * from 138 to 144 for pre-Taiko - * from 144 to 159 for Taiko - */ - if (!rx_slot) { - pr_err("%s: rx slot not found\n", __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - pr_err("%s: invalid rx num %d\n", __func__, rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) { - dai_data->port_config.slim_sch.shared_ch_mapping[i] = - rx_slot[i]; - pr_debug("%s: find number of channels[%d] ch[%d]\n", - __func__, i, rx_slot[i]); - } - dai_data->port_config.slim_sch.num_channels = rx_num; - pr_debug("%s: SLIMBUS_%d_RX cnt[%d] ch[%d %d]\n", __func__, - (dai->id - SLIMBUS_0_RX) / 2, rx_num, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1]); - - break; - case SLIMBUS_0_TX: - case SLIMBUS_1_TX: - case SLIMBUS_2_TX: - case SLIMBUS_3_TX: - case SLIMBUS_4_TX: - case SLIMBUS_5_TX: - case SLIMBUS_6_TX: - case SLIMBUS_7_TX: - case SLIMBUS_8_TX: - case SLIMBUS_9_TX: - /* - * channel number to be between 128 and 255. - * For TX port use channel numbers - * from 128 to 137 for pre-Taiko - * from 128 to 143 for Taiko - */ - if (!tx_slot) { - pr_err("%s: tx slot not found\n", __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - pr_err("%s: invalid tx num %d\n", __func__, tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) { - dai_data->port_config.slim_sch.shared_ch_mapping[i] = - tx_slot[i]; - pr_debug("%s: find number of channels[%d] ch[%d]\n", - __func__, i, tx_slot[i]); - } - dai_data->port_config.slim_sch.num_channels = tx_num; - pr_debug("%s:SLIMBUS_%d_TX cnt[%d] ch[%d %d]\n", __func__, - (dai->id - SLIMBUS_0_TX) / 2, tx_num, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1]); - break; - default: - dev_err(dai->dev, "invalid cpu_dai id 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - return rc; -} - -/* all ports with excursion logging requirement can use this digital_mute api */ -static int msm_dai_q6_spk_digital_mute(struct snd_soc_dai *dai, - int mute) -{ - int port_id = dai->id; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (mute && !dai_data->xt_logging_disable) - afe_get_sp_xt_logging_data(port_id); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_q6_ops = { - .prepare = msm_dai_q6_prepare, - .hw_params = msm_dai_q6_hw_params, - .shutdown = msm_dai_q6_shutdown, - .set_fmt = msm_dai_q6_set_fmt, - .set_channel_map = msm_dai_q6_set_channel_map, -}; - -static struct snd_soc_dai_ops msm_dai_slimbus_0_rx_ops = { - .prepare = msm_dai_q6_prepare, - .hw_params = msm_dai_q6_hw_params, - .shutdown = msm_dai_q6_shutdown, - .set_fmt = msm_dai_q6_set_fmt, - .set_channel_map = msm_dai_q6_set_channel_map, - .digital_mute = msm_dai_q6_spk_digital_mute, -}; - -static int msm_dai_q6_cal_info_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u16 port_id = ((struct soc_enum *) - kcontrol->private_value)->reg; - - dai_data->cal_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: setting cal_mode to %d\n", - __func__, dai_data->cal_mode); - afe_set_cal_mode(port_id, dai_data->cal_mode); - - return 0; -} - -static int msm_dai_q6_cal_info_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = dai_data->cal_mode; - return 0; -} - -static int msm_dai_q6_cdc_dma_xt_logging_disable_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->xt_logging_disable = ucontrol->value.integer.value[0]; - pr_debug("%s: setting xt logging disable to %d\n", - __func__, dai_data->xt_logging_disable); - } - - return 0; -} - -static int msm_dai_q6_cdc_dma_xt_logging_disable_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = dai_data->xt_logging_disable; - return 0; -} - -static int msm_dai_q6_sb_xt_logging_disable_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->xt_logging_disable = ucontrol->value.integer.value[0]; - pr_debug("%s: setting xt logging disable to %d\n", - __func__, dai_data->xt_logging_disable); - } - - return 0; -} - -static int msm_dai_q6_sb_xt_logging_disable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = dai_data->xt_logging_disable; - return 0; -} - -static int msm_dai_q6_sb_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.slim_sch.data_format = value; - pr_debug("%s: format = %d\n", __func__, value); - } - - return 0; -} - -static int msm_dai_q6_sb_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = - dai_data->port_config.slim_sch.data_format; - - return 0; -} - -static int msm_dai_q6_usb_audio_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.usb_audio.dev_token = val; - pr_debug("%s: dev_token = 0x%x\n", __func__, - dai_data->port_config.usb_audio.dev_token); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - } - - return 0; -} - -static int msm_dai_q6_usb_audio_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.dev_token; - pr_debug("%s: dev_token = 0x%x\n", __func__, - dai_data->port_config.usb_audio.dev_token); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - } - - return 0; -} - -static int msm_dai_q6_usb_audio_endian_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.usb_audio.endian = val; - pr_debug("%s: endian = 0x%x\n", __func__, - dai_data->port_config.usb_audio.endian); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_usb_audio_endian_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.endian; - pr_debug("%s: endian = 0x%x\n", __func__, - dai_data->port_config.usb_audio.endian); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_usb_audio_svc_interval_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - dai_data->port_config.usb_audio.service_interval = val; - pr_debug("%s: new service interval = %u\n", __func__, - dai_data->port_config.usb_audio.service_interval); - return 0; -} - -static int msm_dai_q6_usb_audio_svc_interval_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.service_interval; - pr_debug("%s: service interval = %d\n", __func__, - dai_data->port_config.usb_audio.service_interval); - return 0; -} - -static int msm_dai_q6_afe_enc_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_enc_config); - - return 0; -} - -static int msm_dai_q6_afe_enc_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - int format_size = sizeof(dai_data->enc_config.format); - - pr_debug("%s: encoder config for %d format\n", - __func__, dai_data->enc_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->enc_config.format, - format_size); - switch (dai_data->enc_config.format) { - case ENC_FMT_SBC: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_sbc_enc_cfg_t)); - break; - case ENC_FMT_AAC_V2: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aac_enc_cfg_t)); - break; - case ENC_FMT_APTX: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_enc_cfg_t)); - break; - case ENC_FMT_APTX_HD: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_custom_enc_cfg_t)); - break; - case ENC_FMT_CELT: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_celt_enc_cfg_t)); - break; - case ENC_FMT_LDAC: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_ldac_enc_cfg_t)); - break; - case ENC_FMT_APTX_ADAPTIVE: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_ad_enc_cfg_t)); - break; - case ENC_FMT_APTX_AD_SPEECH: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_ad_speech_enc_cfg_t)); - break; - - default: - pr_debug("%s: unknown format = %d\n", - __func__, dai_data->enc_config.format); - ret = -EINVAL; - break; - } - } - - return ret; -} - -static int msm_dai_q6_afe_enc_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - int format_size = sizeof(dai_data->enc_config.format); - - memset(&dai_data->enc_config, 0x0, - sizeof(struct afe_enc_config)); - memcpy(&dai_data->enc_config.format, - ucontrol->value.bytes.data, - format_size); - pr_debug("%s: Received encoder config for %d format\n", - __func__, dai_data->enc_config.format); - switch (dai_data->enc_config.format) { - case ENC_FMT_SBC: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_sbc_enc_cfg_t)); - break; - case ENC_FMT_AAC_V2: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aac_enc_cfg_t)); - break; - case ENC_FMT_APTX: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_enc_cfg_t)); - break; - case ENC_FMT_APTX_HD: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_custom_enc_cfg_t)); - break; - case ENC_FMT_CELT: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_celt_enc_cfg_t)); - break; - case ENC_FMT_LDAC: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_ldac_enc_cfg_t)); - break; - case ENC_FMT_APTX_ADAPTIVE: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_ad_enc_cfg_t)); - break; - case ENC_FMT_APTX_AD_SPEECH: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_ad_speech_enc_cfg_t)); - break; - - default: - pr_debug("%s: Ignore enc config for unknown format = %d\n", - __func__, dai_data->enc_config.format); - ret = -EINVAL; - break; - } - } else - ret = -EINVAL; - - return ret; -} - -static const char *const afe_chs_text[] = {"Zero", "One", "Two"}; - -static const struct soc_enum afe_chs_enum[] = { - SOC_ENUM_SINGLE_EXT(3, afe_chs_text), -}; - -static const char *const afe_bit_format_text[] = {"S16_LE", "S24_LE", - "S32_LE"}; - -static const struct soc_enum afe_bit_format_enum[] = { - SOC_ENUM_SINGLE_EXT(3, afe_bit_format_text), -}; - -static const char *const tws_chs_mode_text[] = {"Zero", "One", "Two"}; - -static const struct soc_enum tws_chs_mode_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tws_chs_mode_text), tws_chs_mode_text), -}; - -static int msm_dai_q6_afe_input_channel_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = dai_data->afe_rx_in_channels; - pr_debug("%s:afe input channel = %d\n", - __func__, dai_data->afe_rx_in_channels); - } - - return 0; -} - -static int msm_dai_q6_afe_input_channel_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->afe_rx_in_channels = ucontrol->value.integer.value[0]; - pr_debug("%s: updating afe input channel : %d\n", - __func__, dai_data->afe_rx_in_channels); - } - - return 0; -} - -static int msm_dai_q6_tws_channel_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = NULL; - - if (dai) - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->enc_config.mono_mode; - pr_debug("%s:tws channel mode = %d\n", - __func__, dai_data->enc_config.mono_mode); - } - - return 0; -} - -static int msm_dai_q6_tws_channel_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = NULL; - int ret = 0; - u32 format = 0; - - if (dai) - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data) - format = dai_data->enc_config.format; - else - goto exit; - - if (format == ENC_FMT_APTX || format == ENC_FMT_APTX_ADAPTIVE) { - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - ret = afe_set_tws_channel_mode(format, - dai->id, ucontrol->value.integer.value[0]); - if (ret < 0) { - pr_err("%s: channel mode setting failed for TWS\n", - __func__); - goto exit; - } else { - pr_debug("%s: updating tws channel mode : %d\n", - __func__, dai_data->enc_config.mono_mode); - } - } - if (ucontrol->value.integer.value[0] == - MSM_DAI_TWS_CHANNEL_MODE_ONE || - ucontrol->value.integer.value[0] == - MSM_DAI_TWS_CHANNEL_MODE_TWO) - dai_data->enc_config.mono_mode = - ucontrol->value.integer.value[0]; - else - return -EINVAL; - } -exit: - return ret; -} - -static int msm_dai_q6_afe_input_bit_format_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - switch (dai_data->afe_rx_in_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: afe input bit format : %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_afe_input_bit_format_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - switch (ucontrol->value.integer.value[0]) { - case 2: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S32_LE; - break; - case 1: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: updating afe input bit format : %d\n", - __func__, dai_data->afe_rx_in_bitformat); - - return 0; -} - -static int msm_dai_q6_afe_output_bit_format_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - switch (dai_data->afe_tx_out_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: afe output bit format : %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_afe_output_bit_format_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - switch (ucontrol->value.integer.value[0]) { - case 2: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S32_LE; - break; - case 1: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: updating afe output bit format : %d\n", - __func__, dai_data->afe_tx_out_bitformat); - - return 0; -} - -static int msm_dai_q6_afe_output_channel_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->afe_tx_out_channels; - pr_debug("%s:afe output channel = %d\n", - __func__, dai_data->afe_tx_out_channels); - } - return 0; -} - -static int msm_dai_q6_afe_output_channel_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->afe_tx_out_channels = - ucontrol->value.integer.value[0]; - pr_debug("%s: updating afe output channel : %d\n", - __func__, dai_data->afe_tx_out_channels); - } - return 0; -} - -static int msm_dai_q6_afe_scrambler_mode_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - ucontrol->value.integer.value[0] = dai_data->enc_config.scrambler_mode; - - return 0; -} - -static int msm_dai_q6_afe_scrambler_mode_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - dai_data->enc_config.scrambler_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: afe scrambler mode : %d\n", - __func__, dai_data->enc_config.scrambler_mode); - return 0; -} - -static const struct snd_kcontrol_new afe_enc_config_controls[] = { - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_RX Encoder Config", - .info = msm_dai_q6_afe_enc_cfg_info, - .get = msm_dai_q6_afe_enc_cfg_get, - .put = msm_dai_q6_afe_enc_cfg_put, - }, - SOC_ENUM_EXT("AFE Input Channels", afe_chs_enum[0], - msm_dai_q6_afe_input_channel_get, - msm_dai_q6_afe_input_channel_put), - SOC_ENUM_EXT("AFE Input Bit Format", afe_bit_format_enum[0], - msm_dai_q6_afe_input_bit_format_get, - msm_dai_q6_afe_input_bit_format_put), - SOC_SINGLE_EXT("AFE Scrambler Mode", - 0, 0, 1, 0, - msm_dai_q6_afe_scrambler_mode_get, - msm_dai_q6_afe_scrambler_mode_put), - SOC_ENUM_EXT("TWS Channel Mode", tws_chs_mode_enum[0], - msm_dai_q6_tws_channel_mode_get, - msm_dai_q6_tws_channel_mode_put), - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_RX APTX_AD Enc Cfg", - .info = msm_dai_q6_afe_enc_cfg_info, - .get = msm_dai_q6_afe_enc_cfg_get, - .put = msm_dai_q6_afe_enc_cfg_put, - } -}; - -static int msm_dai_q6_afe_dec_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_dec_config); - - return 0; -} - -static int msm_dai_q6_afe_feedback_dec_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - u32 abr_size = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - format_size = sizeof(dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->dec_config.format, - format_size); - - pr_debug("%s: abr_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - abr_size = sizeof(dai_data->dec_config.abr_dec_cfg.imc_info); - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.abr_dec_cfg, - sizeof(struct afe_imc_dec_enc_info)); - - switch (dai_data->dec_config.format) { - case DEC_FMT_APTX_AD_SPEECH: - pr_debug("%s: afe_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data + format_size + abr_size, - &dai_data->dec_config.data, - sizeof(struct asm_aptx_ad_speech_dec_cfg_t)); - break; - default: - pr_debug("%s: no afe_dec_cfg for format %d\n", - __func__, dai_data->dec_config.format); - break; - } - - return 0; -} - -static int msm_dai_q6_afe_feedback_dec_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - u32 abr_size = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - memset(&dai_data->dec_config, 0x0, - sizeof(struct afe_dec_config)); - format_size = sizeof(dai_data->dec_config.format); - memcpy(&dai_data->dec_config.format, - ucontrol->value.bytes.data, - format_size); - - pr_debug("%s: abr_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - abr_size = sizeof(dai_data->dec_config.abr_dec_cfg.imc_info); - memcpy(&dai_data->dec_config.abr_dec_cfg, - ucontrol->value.bytes.data + format_size, - sizeof(struct afe_imc_dec_enc_info)); - dai_data->dec_config.abr_dec_cfg.is_abr_enabled = true; - - switch (dai_data->dec_config.format) { - case DEC_FMT_APTX_AD_SPEECH: - pr_debug("%s: afe_dec_cfg for %d format\n", - __func__, dai_data->dec_config.format); - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size + abr_size, - sizeof(struct asm_aptx_ad_speech_dec_cfg_t)); - break; - default: - pr_debug("%s: no afe_dec_cfg for format %d\n", - __func__, dai_data->dec_config.format); - break; - } - return 0; -} - -static int msm_dai_q6_afe_dec_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - int ret = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - format_size = sizeof(dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->dec_config.format, - format_size); - switch (dai_data->dec_config.format) { - case DEC_FMT_AAC_V2: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.data, - sizeof(struct asm_aac_dec_cfg_v2_t)); - break; - case DEC_FMT_APTX_ADAPTIVE: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.data, - sizeof(struct asm_aptx_ad_dec_cfg_t)); - break; - case DEC_FMT_SBC: - case DEC_FMT_MP3: - /* No decoder specific data available */ - break; - default: - pr_err("%s: Invalid format %d\n", - __func__, dai_data->dec_config.format); - ret = -EINVAL; - break; - } - - return ret; -} - -static int msm_dai_q6_afe_dec_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - int ret = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - memset(&dai_data->dec_config, 0x0, - sizeof(struct afe_dec_config)); - format_size = sizeof(dai_data->dec_config.format); - memcpy(&dai_data->dec_config.format, - ucontrol->value.bytes.data, - format_size); - pr_debug("%s: Received decoder config for %d format\n", - __func__, dai_data->dec_config.format); - switch (dai_data->dec_config.format) { - case DEC_FMT_AAC_V2: - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aac_dec_cfg_v2_t)); - break; - case DEC_FMT_SBC: - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_sbc_dec_cfg_t)); - break; - case DEC_FMT_APTX_ADAPTIVE: - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_ad_dec_cfg_t)); - break; - default: - pr_err("%s: Invalid format %d\n", - __func__, dai_data->dec_config.format); - ret = -EINVAL; - break; - } - - return ret; -} - -static const struct snd_kcontrol_new afe_dec_config_controls[] = { - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_TX Decoder Config", - .info = msm_dai_q6_afe_dec_cfg_info, - .get = msm_dai_q6_afe_feedback_dec_cfg_get, - .put = msm_dai_q6_afe_feedback_dec_cfg_put, - }, - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_9_TX Decoder Config", - .info = msm_dai_q6_afe_dec_cfg_info, - .get = msm_dai_q6_afe_dec_cfg_get, - .put = msm_dai_q6_afe_dec_cfg_put, - }, - SOC_ENUM_EXT("AFE Output Channels", afe_chs_enum[0], - msm_dai_q6_afe_output_channel_get, - msm_dai_q6_afe_output_channel_put), - SOC_ENUM_EXT("AFE Output Bit Format", afe_bit_format_enum[0], - msm_dai_q6_afe_output_bit_format_get, - msm_dai_q6_afe_output_bit_format_put), -}; - -static int msm_dai_q6_slim_rx_drift_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_param_id_dev_timing_stats); - - return 0; -} - -static int msm_dai_q6_slim_rx_drift_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - struct afe_param_id_dev_timing_stats timing_stats; - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - goto done; - } - - memset(&timing_stats, 0, sizeof(struct afe_param_id_dev_timing_stats)); - ret = afe_get_av_dev_drift(&timing_stats, dai->id); - if (ret) { - pr_err("%s: Error getting AFE Drift for port %d, err=%d\n", - __func__, dai->id, ret); - - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&timing_stats, - sizeof(struct afe_param_id_dev_timing_stats)); -done: - return ret; -} - -static const char * const afe_cal_mode_text[] = { - "CAL_MODE_DEFAULT", "CAL_MODE_NONE" -}; - -static const struct soc_enum slim_2_rx_enum = - SOC_ENUM_SINGLE(SLIMBUS_2_RX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct soc_enum rt_proxy_1_rx_enum = - SOC_ENUM_SINGLE(RT_PROXY_PORT_001_RX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct soc_enum rt_proxy_1_tx_enum = - SOC_ENUM_SINGLE(RT_PROXY_PORT_001_TX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct snd_kcontrol_new sb_config_controls[] = { - SOC_ENUM_EXT("SLIM_4_TX Format", sb_config_enum[0], - msm_dai_q6_sb_format_get, - msm_dai_q6_sb_format_put), - SOC_ENUM_EXT("SLIM_2_RX SetCalMode", slim_2_rx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), - SOC_ENUM_EXT("SLIM_2_RX Format", sb_config_enum[0], - msm_dai_q6_sb_format_get, - msm_dai_q6_sb_format_put), - SOC_ENUM_EXT("SLIM_0_RX XTLoggingDisable", xt_logging_disable_enum[0], - msm_dai_q6_sb_xt_logging_disable_get, - msm_dai_q6_sb_xt_logging_disable_put), -}; - -static const struct snd_kcontrol_new rt_proxy_config_controls[] = { - SOC_ENUM_EXT("RT_PROXY_1_RX SetCalMode", rt_proxy_1_rx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), - SOC_ENUM_EXT("RT_PROXY_1_TX SetCalMode", rt_proxy_1_tx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), -}; - -static const struct snd_kcontrol_new usb_audio_cfg_controls[] = { - SOC_SINGLE_EXT("USB_AUDIO_RX dev_token", 0, 0, UINT_MAX, 0, - msm_dai_q6_usb_audio_cfg_get, - msm_dai_q6_usb_audio_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_RX endian", 0, 0, 1, 0, - msm_dai_q6_usb_audio_endian_cfg_get, - msm_dai_q6_usb_audio_endian_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_TX dev_token", 0, 0, UINT_MAX, 0, - msm_dai_q6_usb_audio_cfg_get, - msm_dai_q6_usb_audio_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_TX endian", 0, 0, 1, 0, - msm_dai_q6_usb_audio_endian_cfg_get, - msm_dai_q6_usb_audio_endian_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_RX service_interval", SND_SOC_NOPM, 0, - UINT_MAX, 0, - msm_dai_q6_usb_audio_svc_interval_get, - msm_dai_q6_usb_audio_svc_interval_put), -}; - -static const struct snd_kcontrol_new avd_drift_config_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_0_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_6_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_7_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, -}; - -static inline void msm_dai_q6_set_slim_dev_id(struct snd_soc_dai *dai) -{ - int rc = 0; - int slim_dev_id = 0; - const char *q6_slim_dev_id = "qcom,msm-dai-q6-slim-dev-id"; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->port_config.slim_sch.slimbus_dev_id = AFE_SLIMBUS_DEVICE_1; - - rc = of_property_read_u32(dai->dev->of_node, q6_slim_dev_id, - &slim_dev_id); - if (rc) { - dev_dbg(dai->dev, - "%s: missing %s in dt node\n", __func__, q6_slim_dev_id); - return; - } - - dev_dbg(dai->dev, "%s: slim_dev_id = %d\n", __func__, slim_dev_id); - - if (slim_dev_id >= AFE_SLIMBUS_DEVICE_1 && - slim_dev_id <= AFE_SLIMBUS_DEVICE_2) - dai_data->port_config.slim_sch.slimbus_dev_id = slim_dev_id; -} - -static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data; - int rc = 0; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - dai_data = kzalloc(sizeof(struct msm_dai_q6_dai_data), GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_set_dai_id(dai); - - if ((dai->id >= SLIMBUS_0_RX) && (dai->id <= SLIMBUS_9_TX)) - msm_dai_q6_set_slim_dev_id(dai); - - switch (dai->id) { - case SLIMBUS_4_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[0], - dai_data)); - break; - case SLIMBUS_2_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[2], - dai_data)); - break; - case SLIMBUS_7_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[3], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[4], - dai)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[5], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[2], - dai)); - break; - case SLIMBUS_7_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[0], - dai_data)); - break; - case SLIMBUS_9_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[3], - dai_data)); - break; - case RT_PROXY_DAI_001_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&rt_proxy_config_controls[0], - dai_data)); - break; - case RT_PROXY_DAI_001_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&rt_proxy_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_USB_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[4], - dai_data)); - break; - case AFE_PORT_ID_USB_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[3], - dai_data)); - break; - case SLIMBUS_0_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[0], - dai)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[3], - dai_data)); - break; - case SLIMBUS_6_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[1], - dai)); - break; - } - if (rc < 0) - dev_err(dai->dev, "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static int msm_dai_q6_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: stop pseudo port:%d\n", __func__, dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - kfree(dai_data); - - return 0; -} - -static struct snd_soc_dai_driver msm_dai_q6_afe_rx_dai[] = { - { - .playback = { - .stream_name = "AFE Playback", - .aif_name = "PCM_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_001_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "AFE-PROXY RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_002_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_afe_lb_tx_dai[] = { - { - .capture = { - .stream_name = "AFE Loopback Capture", - .aif_name = "AFE_LOOPBACK_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE ), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .id = AFE_LOOPBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_afe_tx_dai[] = { - { - .capture = { - .stream_name = "AFE Capture", - .aif_name = "PCM_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_002_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "AFE-PROXY TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_001_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_sco_rx_dai = { - .playback = { - .stream_name = "Internal BT-SCO Playback", - .aif_name = "INT_BT_SCO_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_SCO_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_a2dp_rx_dai = { - .playback = { - .stream_name = "Internal BT-A2DP Playback", - .aif_name = "INT_BT_A2DP_RX", - .rates = SNDRV_PCM_RATE_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_A2DP_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_sco_tx_dai = { - .capture = { - .stream_name = "Internal BT-SCO Capture", - .aif_name = "INT_BT_SCO_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_SCO_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_fm_rx_dai = { - .playback = { - .stream_name = "Internal FM Playback", - .aif_name = "INT_FM_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 2, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_FM_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_fm_tx_dai = { - .capture = { - .stream_name = "Internal FM Capture", - .aif_name = "INT_FM_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 2, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_FM_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_voc_playback_dai[] = { - { - .playback = { - .stream_name = "Voice Farend Playback", - .aif_name = "VOICE_PLAYBACK_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_PLAYBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Voice2 Farend Playback", - .aif_name = "VOICE2_PLAYBACK_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE2_PLAYBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_incall_record_dai[] = { - { - .capture = { - .stream_name = "Voice Uplink Capture", - .aif_name = "INCALL_RECORD_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_RECORD_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Voice Downlink Capture", - .aif_name = "INCALL_RECORD_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_RECORD_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_proxy_tx_dai = { - .capture = { - .stream_name = "Proxy Capture", - .aif_name = "PROXY_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_PORT_002_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_proxy_rx_dai = { - .playback = { - .stream_name = "Proxy Playback", - .aif_name = "PROXY_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_PORT_002_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_usb_rx_dai = { - .playback = { - .stream_name = "USB Audio Playback", - .aif_name = "USB_AUDIO_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_max = 384000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = AFE_PORT_ID_USB_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_usb_tx_dai = { - .capture = { - .stream_name = "USB Audio Capture", - .aif_name = "USB_AUDIO_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_max = 384000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = AFE_PORT_ID_USB_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static int msm_auxpcm_dev_probe(struct platform_device *pdev) -{ - struct msm_dai_q6_auxpcm_dai_data *dai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata; - uint32_t val_array[RATE_MAX_NUM_OF_AUX_PCM_RATES]; - uint32_t val = 0; - const char *intf_name; - int rc = 0, i = 0, len = 0; - const uint32_t *slot_mapping_array = NULL; - u32 array_length = 0; - - dai_data = kzalloc(sizeof(struct msm_dai_q6_auxpcm_dai_data), - GFP_KERNEL); - if (!dai_data) - return -ENOMEM; - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - auxpcm_pdata = kzalloc(sizeof(struct msm_dai_auxpcm_pdata), - GFP_KERNEL); - - if (!auxpcm_pdata) { - dev_err(&pdev->dev, "Failed to allocate memory for platform data\n"); - goto fail_pdata_nomem; - } - - dev_dbg(&pdev->dev, "%s: dev %pK, dai_data %pK, auxpcm_pdata %pK\n", - __func__, &pdev->dev, dai_data, auxpcm_pdata); - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-mode", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-mode missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.mode = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.mode = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-sync", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-sync missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.sync = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.sync = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-frame", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-frame missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.frame = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.frame = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-quant", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-quant missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.quant = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.quant = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-num-slots", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-num-slots missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.num_slots = (u16)val_array[RATE_8KHZ]; - - if (auxpcm_pdata->mode_8k.num_slots > - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_8k.frame)) { - dev_err(&pdev->dev, "%s Max slots %d greater than DT node %d\n", - __func__, - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_8k.frame), - auxpcm_pdata->mode_8k.num_slots); - rc = -EINVAL; - goto fail_invalid_dt; - } - auxpcm_pdata->mode_16k.num_slots = (u16)val_array[RATE_16KHZ]; - - if (auxpcm_pdata->mode_16k.num_slots > - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_16k.frame)) { - dev_err(&pdev->dev, "%s Max slots %d greater than DT node %d\n", - __func__, - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_16k.frame), - auxpcm_pdata->mode_16k.num_slots); - rc = -EINVAL; - goto fail_invalid_dt; - } - - slot_mapping_array = of_get_property(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-slot-mapping", &len); - - if (slot_mapping_array == NULL) { - dev_err(&pdev->dev, "%s slot_mapping_array is not valid\n", - __func__); - rc = -EINVAL; - goto fail_invalid_dt; - } - - array_length = auxpcm_pdata->mode_8k.num_slots + - auxpcm_pdata->mode_16k.num_slots; - - if (len != sizeof(uint32_t) * array_length) { - dev_err(&pdev->dev, "%s Length is %d and expected is %zd\n", - __func__, len, sizeof(uint32_t) * array_length); - rc = -EINVAL; - goto fail_invalid_dt; - } - - auxpcm_pdata->mode_8k.slot_mapping = - kzalloc(sizeof(uint16_t) * - auxpcm_pdata->mode_8k.num_slots, - GFP_KERNEL); - if (!auxpcm_pdata->mode_8k.slot_mapping) { - dev_err(&pdev->dev, "%s No mem for mode_8k slot mapping\n", - __func__); - rc = -ENOMEM; - goto fail_invalid_dt; - } - - for (i = 0; i < auxpcm_pdata->mode_8k.num_slots; i++) - auxpcm_pdata->mode_8k.slot_mapping[i] = - (u16)be32_to_cpu(slot_mapping_array[i]); - - auxpcm_pdata->mode_16k.slot_mapping = - kzalloc(sizeof(uint16_t) * - auxpcm_pdata->mode_16k.num_slots, - GFP_KERNEL); - - if (!auxpcm_pdata->mode_16k.slot_mapping) { - dev_err(&pdev->dev, "%s No mem for mode_16k slot mapping\n", - __func__); - rc = -ENOMEM; - goto fail_invalid_16k_slot_mapping; - } - - for (i = 0; i < auxpcm_pdata->mode_16k.num_slots; i++) - auxpcm_pdata->mode_16k.slot_mapping[i] = - (u16)be32_to_cpu(slot_mapping_array[i + - auxpcm_pdata->mode_8k.num_slots]); - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-data", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-data missing in DT node\n", - __func__); - goto fail_invalid_dt1; - } - auxpcm_pdata->mode_8k.data = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.data = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-pcm-clk-rate", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, - "%s: qcom,msm-cpudai-auxpcm-pcm-clk-rate missing in DT\n", - __func__); - goto fail_invalid_dt1; - } - auxpcm_pdata->mode_8k.pcm_clk_rate = (int)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.pcm_clk_rate = (int)val_array[RATE_16KHZ]; - - rc = of_property_read_string(pdev->dev.of_node, - "qcom,msm-auxpcm-interface", &intf_name); - if (rc) { - dev_err(&pdev->dev, - "%s: qcom,msm-auxpcm-interface missing in DT node\n", - __func__); - goto fail_nodev_intf; - } - - if (!strcmp(intf_name, "primary")) { - dai_data->rx_pid = AFE_PORT_ID_PRIMARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_PRIMARY_PCM_TX; - pdev->id = MSM_DAI_PRI_AUXPCM_DT_DEV_ID; - i = 0; - } else if (!strcmp(intf_name, "secondary")) { - dai_data->rx_pid = AFE_PORT_ID_SECONDARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_SECONDARY_PCM_TX; - pdev->id = MSM_DAI_SEC_AUXPCM_DT_DEV_ID; - i = 1; - } else if (!strcmp(intf_name, "tertiary")) { - dai_data->rx_pid = AFE_PORT_ID_TERTIARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_TERTIARY_PCM_TX; - pdev->id = MSM_DAI_TERT_AUXPCM_DT_DEV_ID; - i = 2; - } else if (!strcmp(intf_name, "quaternary")) { - dai_data->rx_pid = AFE_PORT_ID_QUATERNARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_QUATERNARY_PCM_TX; - pdev->id = MSM_DAI_QUAT_AUXPCM_DT_DEV_ID; - i = 3; - } else if (!strcmp(intf_name, "quinary")) { - dai_data->rx_pid = AFE_PORT_ID_QUINARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_QUINARY_PCM_TX; - pdev->id = MSM_DAI_QUIN_AUXPCM_DT_DEV_ID; - i = 4; - } else if (!strcmp(intf_name, "senary")) { - dai_data->rx_pid = AFE_PORT_ID_SENARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_SENARY_PCM_TX; - pdev->id = MSM_DAI_SEN_AUXPCM_DT_DEV_ID; - i = 5; - } else { - dev_err(&pdev->dev, "%s: invalid DT intf name %s\n", - __func__, intf_name); - goto fail_invalid_intf; - } - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-afe-clk-ver", &val); - if (rc) - dai_data->afe_clk_ver = AFE_CLK_VERSION_V1; - else - dai_data->afe_clk_ver = val; - - mutex_init(&dai_data->rlock); - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - - dev_set_drvdata(&pdev->dev, dai_data); - pdev->dev.platform_data = (void *) auxpcm_pdata; - - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_aux_pcm_dai_component, - &msm_dai_q6_aux_pcm_dai[i], 1); - if (rc) { - dev_err(&pdev->dev, "%s: auxpcm dai reg failed, rc=%d\n", - __func__, rc); - goto fail_reg_dai; - } - - return rc; - -fail_reg_dai: -fail_invalid_intf: -fail_nodev_intf: -fail_invalid_dt1: - kfree(auxpcm_pdata->mode_16k.slot_mapping); -fail_invalid_16k_slot_mapping: - kfree(auxpcm_pdata->mode_8k.slot_mapping); -fail_invalid_dt: - kfree(auxpcm_pdata); -fail_pdata_nomem: - kfree(dai_data); - return rc; -} - -static int msm_auxpcm_dev_remove(struct platform_device *pdev) -{ - struct msm_dai_q6_auxpcm_dai_data *dai_data; - - dai_data = dev_get_drvdata(&pdev->dev); - - snd_soc_unregister_component(&pdev->dev); - - mutex_destroy(&dai_data->rlock); - kfree(dai_data); - kfree(pdev->dev.platform_data); - - return 0; -} - -static const struct of_device_id msm_auxpcm_dev_dt_match[] = { - { .compatible = "qcom,msm-auxpcm-dev", }, - {} -}; - - -static struct platform_driver msm_auxpcm_dev_driver = { - .probe = msm_auxpcm_dev_probe, - .remove = msm_auxpcm_dev_remove, - .driver = { - .name = "msm-auxpcm-dev", - .owner = THIS_MODULE, - .of_match_table = msm_auxpcm_dev_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_slimbus_rx_dai[] = { - { - .playback = { - .stream_name = "Slimbus Playback", - .aif_name = "SLIMBUS_0_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_slimbus_0_rx_ops, - .id = SLIMBUS_0_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus1 Playback", - .aif_name = "SLIMBUS_1_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_1_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus2 Playback", - .aif_name = "SLIMBUS_2_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_2_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus3 Playback", - .aif_name = "SLIMBUS_3_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_3_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus4 Playback", - .aif_name = "SLIMBUS_4_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_4_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus6 Playback", - .aif_name = "SLIMBUS_6_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_6_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus5 Playback", - .aif_name = "SLIMBUS_5_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_5_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus7 Playback", - .aif_name = "SLIMBUS_7_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_7_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus8 Playback", - .aif_name = "SLIMBUS_8_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_8_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus9 Playback", - .aif_name = "SLIMBUS_9_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_9_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_slimbus_tx_dai[] = { - { - .capture = { - .stream_name = "Slimbus Capture", - .aif_name = "SLIMBUS_0_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_0_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus1 Capture", - .aif_name = "SLIMBUS_1_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_1_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus2 Capture", - .aif_name = "SLIMBUS_2_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_2_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus3 Capture", - .aif_name = "SLIMBUS_3_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 2, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_3_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus4 Capture", - .aif_name = "SLIMBUS_4_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 2, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_4_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus5 Capture", - .aif_name = "SLIMBUS_5_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_5_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus6 Capture", - .aif_name = "SLIMBUS_6_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_6_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus7 Capture", - .aif_name = "SLIMBUS_7_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_7_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus8 Capture", - .aif_name = "SLIMBUS_8_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_8_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus9 Capture", - .aif_name = "SLIMBUS_9_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_9_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static int msm_dai_q6_mi2s_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_config.i2s.data_format = value; - pr_debug("%s: value = %d, channel = %d, line = %d\n", - __func__, value, dai_data->port_config.i2s.mono_stereo, - dai_data->port_config.i2s.channel_mode); - return 0; -} - -static int msm_dai_q6_mi2s_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_config.i2s.data_format; - return 0; -} - -static int msm_dai_q6_mi2s_vi_feed_mono_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->vi_feed_mono = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_mi2s_vi_feed_mono_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = dai_data->vi_feed_mono; - return 0; -} - -static const struct snd_kcontrol_new mi2s_config_controls[] = { - SOC_ENUM_EXT("PRI MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SEC MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("TERT MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUAT MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUIN MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SENARY MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("PRI MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SEC MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("TERT MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUAT MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUIN MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SENARY MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("INT5 MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), -}; - -static const struct snd_kcontrol_new mi2s_vi_feed_controls[] = { - SOC_ENUM_EXT("INT5 MI2S VI MONO", mi2s_config_enum[1], - msm_dai_q6_mi2s_vi_feed_mono_get, - msm_dai_q6_mi2s_vi_feed_mono_put), -}; - -static int msm_dai_q6_dai_mi2s_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_mi2s_pdata *mi2s_pdata = - (struct msm_mi2s_pdata *) dai->dev->platform_data; - struct snd_kcontrol *kcontrol = NULL; - int rc = 0; - const struct snd_kcontrol_new *ctrl = NULL; - const struct snd_kcontrol_new *vi_feed_ctrl = NULL; - u16 dai_id = 0; - - dai->id = mi2s_pdata->intf_id; - - if (mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.channel_mode) { - if (dai->id == MSM_PRIM_MI2S) - ctrl = &mi2s_config_controls[0]; - if (dai->id == MSM_SEC_MI2S) - ctrl = &mi2s_config_controls[1]; - if (dai->id == MSM_TERT_MI2S) - ctrl = &mi2s_config_controls[2]; - if (dai->id == MSM_QUAT_MI2S) - ctrl = &mi2s_config_controls[3]; - if (dai->id == MSM_QUIN_MI2S) - ctrl = &mi2s_config_controls[4]; - if (dai->id == MSM_SENARY_MI2S) - ctrl = &mi2s_config_controls[5]; - } - - if (ctrl) { - kcontrol = snd_ctl_new1(ctrl, - &mi2s_dai_data->rx_dai.mi2s_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, kcontrol); - if (rc < 0) { - dev_err(dai->dev, "%s: err add RX fmt ctl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - ctrl = NULL; - if (mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.channel_mode) { - if (dai->id == MSM_PRIM_MI2S) - ctrl = &mi2s_config_controls[6]; - if (dai->id == MSM_SEC_MI2S) - ctrl = &mi2s_config_controls[7]; - if (dai->id == MSM_TERT_MI2S) - ctrl = &mi2s_config_controls[8]; - if (dai->id == MSM_QUAT_MI2S) - ctrl = &mi2s_config_controls[9]; - if (dai->id == MSM_QUIN_MI2S) - ctrl = &mi2s_config_controls[10]; - if (dai->id == MSM_SENARY_MI2S) - ctrl = &mi2s_config_controls[11]; - if (dai->id == MSM_INT5_MI2S) - ctrl = &mi2s_config_controls[12]; - } - - if (ctrl) { - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(ctrl, - &mi2s_dai_data->tx_dai.mi2s_dai_data)); - if (rc < 0) { - if (kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - kcontrol); - dev_err(dai->dev, "%s: err add TX fmt ctl DAI = %s\n", - __func__, dai->name); - } - } - - if (dai->id == MSM_INT5_MI2S) - vi_feed_ctrl = &mi2s_vi_feed_controls[0]; - - if (vi_feed_ctrl) { - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(vi_feed_ctrl, - &mi2s_dai_data->tx_dai.mi2s_dai_data)); - - if (rc < 0) { - dev_err(dai->dev, "%s: err add TX vi feed channel ctl DAI = %s\n", - __func__, dai->name); - } - } - - if (mi2s_dai_data->is_island_dai) { - msm_mi2s_get_port_id(dai->id, SNDRV_PCM_STREAM_CAPTURE, - &dai_id); - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai_id, - (void *)mi2s_dai_data); - } - - rc = msm_dai_q6_dai_add_route(dai); -rtn: - return rc; -} - - -static int msm_dai_q6_dai_mi2s_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - int rc; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask)) { - rc = afe_close(MI2S_RX); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close MI2S_RX port\n"); - clear_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask); - } - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask)) { - rc = afe_close(MI2S_TX); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close MI2S_TX port\n"); - clear_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask); - } - return 0; -} - -static int msm_dai_q6_mi2s_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - - return 0; -} - -static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id) -{ - int ret = 0; - - switch (stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - switch (mi2s_id) { - case MSM_PRIM_MI2S: - *port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_SEC_MI2S: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_TERT_MI2S: - *port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_QUAT_MI2S: - *port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_SEC_MI2S_SD1: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - break; - case MSM_QUIN_MI2S: - *port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_SENARY_MI2S: - *port_id = AFE_PORT_ID_SENARY_MI2S_RX; - break; - case MSM_INT0_MI2S: - *port_id = AFE_PORT_ID_INT0_MI2S_RX; - break; - case MSM_INT1_MI2S: - *port_id = AFE_PORT_ID_INT1_MI2S_RX; - break; - case MSM_INT2_MI2S: - *port_id = AFE_PORT_ID_INT2_MI2S_RX; - break; - case MSM_INT3_MI2S: - *port_id = AFE_PORT_ID_INT3_MI2S_RX; - break; - case MSM_INT4_MI2S: - *port_id = AFE_PORT_ID_INT4_MI2S_RX; - break; - case MSM_INT5_MI2S: - *port_id = AFE_PORT_ID_INT5_MI2S_RX; - break; - case MSM_INT6_MI2S: - *port_id = AFE_PORT_ID_INT6_MI2S_RX; - break; - default: - pr_err("%s: playback err id 0x%x\n", - __func__, mi2s_id); - ret = -1; - break; - } - break; - case SNDRV_PCM_STREAM_CAPTURE: - switch (mi2s_id) { - case MSM_PRIM_MI2S: - *port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_SEC_MI2S: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_TERT_MI2S: - *port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_QUAT_MI2S: - *port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_QUIN_MI2S: - *port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case MSM_SENARY_MI2S: - *port_id = AFE_PORT_ID_SENARY_MI2S_TX; - break; - case MSM_INT0_MI2S: - *port_id = AFE_PORT_ID_INT0_MI2S_TX; - break; - case MSM_INT1_MI2S: - *port_id = AFE_PORT_ID_INT1_MI2S_TX; - break; - case MSM_INT2_MI2S: - *port_id = AFE_PORT_ID_INT2_MI2S_TX; - break; - case MSM_INT3_MI2S: - *port_id = AFE_PORT_ID_INT3_MI2S_TX; - break; - case MSM_INT4_MI2S: - *port_id = AFE_PORT_ID_INT4_MI2S_TX; - break; - case MSM_INT5_MI2S: - *port_id = AFE_PORT_ID_INT5_MI2S_TX; - break; - case MSM_INT6_MI2S: - *port_id = AFE_PORT_ID_INT6_MI2S_TX; - break; - default: - pr_err("%s: capture err id 0x%x\n", __func__, mi2s_id); - ret = -1; - break; - } - break; - default: - pr_err("%s: default err %d\n", __func__, stream); - ret = -1; - break; - } - pr_debug("%s: port_id = 0x%x\n", __func__, *port_id); - return ret; -} - -static int msm_dai_q6_mi2s_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - u16 port_id = 0; - int rc = 0; - - if (msm_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - return -EINVAL; - } - - dev_dbg(dai->dev, "%s: dai id %d, afe port id = 0x%x\n" - "dai_data->channels = %u sample_rate = %u\n", __func__, - dai->id, port_id, dai_data->channels, dai_data->rate); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - /* PORT START should be set if prepare called - * in active state. - */ - rc = afe_port_start(port_id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - if (!test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) { - set_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); - dev_dbg(dai->dev, "%s: set hwfree_status to started\n", - __func__); - } - return rc; -} - -static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_mi2s_dai_config *mi2s_dai_config = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai : &mi2s_dai_data->tx_dai); - struct msm_dai_q6_dai_data *dai_data = &mi2s_dai_config->mi2s_dai_data; - struct afe_param_id_i2s_cfg *i2s = &dai_data->port_config.i2s; - - dai_data->channels = params_channels(params); - switch (dai_data->channels) { - case 15: - case 16: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_16CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 13: - case 14: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_14CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 11: - case 12: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_12CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 9: - case 10: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_10CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 8: - case 7: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_8CHS) - goto error_invalid_data; - else - if (mi2s_dai_config->pdata_mi2s_lines - == AFE_PORT_I2S_8CHS_2) - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_8CHS_2; - else - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_8CHS; - break; - case 6: - case 5: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_6CHS) - goto error_invalid_data; - dai_data->port_config.i2s.channel_mode = AFE_PORT_I2S_6CHS; - break; - case 4: - case 3: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - goto error_invalid_data; - break; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_QUAD23: - case AFE_PORT_I2S_QUAD45: - case AFE_PORT_I2S_QUAD67: - dai_data->port_config.i2s.channel_mode = - mi2s_dai_config->pdata_mi2s_lines; - break; - case AFE_PORT_I2S_8CHS_2: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_QUAD45; - break; - default: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_QUAD01; - break; - }; - break; - case 2: - case 1: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_SD0) - goto error_invalid_data; - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - dai_data->port_config.i2s.channel_mode = - mi2s_dai_config->pdata_mi2s_lines; - break; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_6CHS: - case AFE_PORT_I2S_8CHS: - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - if (dai_data->vi_feed_mono == SPKR_1) - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD0; - else - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD1; - break; - case AFE_PORT_I2S_QUAD23: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD2; - break; - case AFE_PORT_I2S_QUAD45: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD4; - break; - case AFE_PORT_I2S_QUAD67: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD6; - break; - } - if (dai_data->channels == 2) - dai_data->port_config.i2s.mono_stereo = - MSM_AFE_CH_STEREO; - else - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - pr_err("%s: default err channels %d\n", - __func__, dai_data->channels); - goto error_invalid_data; - } - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.i2s.bit_width = 16; - dai_data->bitwidth = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.i2s.bit_width = 24; - dai_data->bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.i2s.bit_width = 32; - dai_data->bitwidth = 32; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.sample_rate = dai_data->rate; - if ((test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask) && - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.hwfree_status)) || - (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask) && - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.hwfree_status))) { - if ((mi2s_dai_data->tx_dai.mi2s_dai_data.rate != - mi2s_dai_data->rx_dai.mi2s_dai_data.rate) || - (mi2s_dai_data->rx_dai.mi2s_dai_data.bitwidth != - mi2s_dai_data->tx_dai.mi2s_dai_data.bitwidth)) { - dev_err(dai->dev, "%s: Error mismatch in HW params\n" - "Tx sample_rate = %u bit_width = %hu\n" - "Rx sample_rate = %u bit_width = %hu\n" - , __func__, - mi2s_dai_data->tx_dai.mi2s_dai_data.rate, - mi2s_dai_data->tx_dai.mi2s_dai_data.bitwidth, - mi2s_dai_data->rx_dai.mi2s_dai_data.rate, - mi2s_dai_data->rx_dai.mi2s_dai_data.bitwidth); - return -EINVAL; - } - } - dev_dbg(dai->dev, "%s: dai id %d dai_data->channels = %d\n" - "sample_rate = %u i2s_cfg_minor_version = 0x%x\n" - "bit_width = %hu channel_mode = 0x%x mono_stereo = %#x\n" - "ws_src = 0x%x sample_rate = %u data_format = 0x%x\n" - "reserved = %u\n", __func__, dai->id, dai_data->channels, - dai_data->rate, i2s->i2s_cfg_minor_version, i2s->bit_width, - i2s->channel_mode, i2s->mono_stereo, i2s->ws_src, - i2s->sample_rate, i2s->data_format, i2s->reserved); - - return 0; - -error_invalid_data: - pr_err("%s: dai_data->channels = %d channel_mode = %d\n", __func__, - dai_data->channels, dai_data->port_config.i2s.channel_mode); - return -EINVAL; -} - - -static int msm_dai_q6_mi2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask) || - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask)) { - dev_err(dai->dev, "%s: err chg i2s mode while dai running", - __func__); - return -EPERM; - } - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.ws_src = 1; - mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.ws_src = 1; - break; - case SND_SOC_DAIFMT_CBM_CFM: - mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.ws_src = 0; - mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.ws_src = 0; - break; - default: - pr_err("%s: fmt %d\n", - __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_mi2s_hw_free(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) { - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); - dev_dbg(dai->dev, "%s: clear hwfree_status\n", __func__); - } - return 0; -} - -static void msm_dai_q6_mi2s_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - u16 port_id = 0; - int rc = 0; - - if (msm_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - } - - dev_dbg(dai->dev, "%s: closing afe port id = 0x%x\n", - __func__, port_id); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(port_id); - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); -} - -static struct snd_soc_dai_ops msm_dai_q6_mi2s_ops = { - .startup = msm_dai_q6_mi2s_startup, - .prepare = msm_dai_q6_mi2s_prepare, - .hw_params = msm_dai_q6_mi2s_hw_params, - .hw_free = msm_dai_q6_mi2s_hw_free, - .set_fmt = msm_dai_q6_mi2s_set_fmt, - .shutdown = msm_dai_q6_mi2s_shutdown, -}; - -/* Channel min and max are initialized base on platform data */ -static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { - { - .playback = { - .stream_name = "Primary MI2S Playback", - .aif_name = "PRI_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "Primary MI2S Capture", - .aif_name = "PRI_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Primary MI2S", - .id = MSM_PRIM_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Secondary MI2S Playback", - .aif_name = "SEC_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Secondary MI2S Capture", - .aif_name = "SEC_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Secondary MI2S", - .id = MSM_SEC_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Tertiary MI2S Playback", - .aif_name = "TERT_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Tertiary MI2S Capture", - .aif_name = "TERT_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Tertiary MI2S", - .id = MSM_TERT_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Quaternary MI2S Playback", - .aif_name = "QUAT_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Quaternary MI2S Capture", - .aif_name = "QUAT_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Quaternary MI2S", - .id = MSM_QUAT_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Quinary MI2S Playback", - .aif_name = "QUIN_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Quinary MI2S Capture", - .aif_name = "QUIN_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Quinary MI2S", - .id = MSM_QUIN_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Senary MI2S Playback", - .aif_name = "SEN_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "Senary MI2S Capture", - .aif_name = "SENARY_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Senary MI2S", - .id = MSM_SENARY_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Secondary MI2S Playback SD1", - .aif_name = "SEC_MI2S_RX_SD1", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .id = MSM_SEC_MI2S_SD1, - }, - { - .playback = { - .stream_name = "INT0 MI2S Playback", - .aif_name = "INT0_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "INT0 MI2S Capture", - .aif_name = "INT0_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT0 MI2S", - .id = MSM_INT0_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT1 MI2S Playback", - .aif_name = "INT1_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT1 MI2S Capture", - .aif_name = "INT1_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT1 MI2S", - .id = MSM_INT1_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT2 MI2S Playback", - .aif_name = "INT2_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT2 MI2S Capture", - .aif_name = "INT2_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT2 MI2S", - .id = MSM_INT2_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT3 MI2S Playback", - .aif_name = "INT3_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT3 MI2S Capture", - .aif_name = "INT3_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT3 MI2S", - .id = MSM_INT3_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT4 MI2S Playback", - .aif_name = "INT4_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "INT4 MI2S Capture", - .aif_name = "INT4_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT4 MI2S", - .id = MSM_INT4_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT5 MI2S Playback", - .aif_name = "INT5_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT5 MI2S Capture", - .aif_name = "INT5_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT5 MI2S", - .id = MSM_INT5_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT6 MI2S Playback", - .aif_name = "INT6_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT6 MI2S Capture", - .aif_name = "INT6_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT6 MI2S", - .id = MSM_INT6_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, -}; - - -static int msm_dai_q6_mi2s_get_lineconfig(u16 sd_lines, u16 *config_ptr, - unsigned int *ch_cnt) -{ - u8 num_of_sd_lines; - - num_of_sd_lines = num_of_bits_set(sd_lines); - switch (num_of_sd_lines) { - case 0: - pr_debug("%s: no line is assigned\n", __func__); - break; - case 1: - switch (sd_lines) { - case MSM_MI2S_SD0: - *config_ptr = AFE_PORT_I2S_SD0; - break; - case MSM_MI2S_SD1: - *config_ptr = AFE_PORT_I2S_SD1; - break; - case MSM_MI2S_SD2: - *config_ptr = AFE_PORT_I2S_SD2; - break; - case MSM_MI2S_SD3: - *config_ptr = AFE_PORT_I2S_SD3; - break; - case MSM_MI2S_SD4: - *config_ptr = AFE_PORT_I2S_SD4; - break; - case MSM_MI2S_SD5: - *config_ptr = AFE_PORT_I2S_SD5; - break; - case MSM_MI2S_SD6: - *config_ptr = AFE_PORT_I2S_SD6; - break; - case MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_SD7; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 2: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1: - *config_ptr = AFE_PORT_I2S_QUAD01; - break; - case MSM_MI2S_SD2 | MSM_MI2S_SD3: - *config_ptr = AFE_PORT_I2S_QUAD23; - break; - case MSM_MI2S_SD4 | MSM_MI2S_SD5: - *config_ptr = AFE_PORT_I2S_QUAD45; - break; - case MSM_MI2S_SD6 | MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_QUAD67; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 3: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2: - *config_ptr = AFE_PORT_I2S_6CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 4: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 | MSM_MI2S_SD3: - *config_ptr = AFE_PORT_I2S_8CHS; - break; - case MSM_MI2S_SD4 | MSM_MI2S_SD5 | MSM_MI2S_SD6 | MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_8CHS_2; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 5: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 - | MSM_MI2S_SD3 | MSM_MI2S_SD4: - *config_ptr = AFE_PORT_I2S_10CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 6: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 - | MSM_MI2S_SD3 | MSM_MI2S_SD4 | MSM_MI2S_SD5: - *config_ptr = AFE_PORT_I2S_12CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 7: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 | MSM_MI2S_SD3 - | MSM_MI2S_SD4 | MSM_MI2S_SD5 | MSM_MI2S_SD6: - *config_ptr = AFE_PORT_I2S_14CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 8: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 | MSM_MI2S_SD3 - | MSM_MI2S_SD4 | MSM_MI2S_SD5 | MSM_MI2S_SD6 | MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_16CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - default: - pr_err("%s: invalid SD lines %d\n", __func__, num_of_sd_lines); - goto error_invalid_data; - } - *ch_cnt = num_of_sd_lines; - return 0; - -error_invalid_data: - pr_err("%s: invalid data\n", __func__); - return -EINVAL; -} - -static u16 msm_dai_q6_mi2s_get_num_channels(u16 config) -{ - switch (config) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - return 2; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_QUAD23: - case AFE_PORT_I2S_QUAD45: - case AFE_PORT_I2S_QUAD67: - return 4; - case AFE_PORT_I2S_6CHS: - return 6; - case AFE_PORT_I2S_8CHS: - case AFE_PORT_I2S_8CHS_2: - return 8; - case AFE_PORT_I2S_10CHS: - return 10; - case AFE_PORT_I2S_12CHS: - return 12; - case AFE_PORT_I2S_14CHS: - return 14; - case AFE_PORT_I2S_16CHS: - return 16; - default: - pr_err("%s: invalid config\n", __func__); - return 0; - } -} - -static int msm_dai_q6_mi2s_platform_data_validation( - struct platform_device *pdev, struct snd_soc_dai_driver *dai_driver) -{ - struct msm_dai_q6_mi2s_dai_data *dai_data = dev_get_drvdata(&pdev->dev); - struct msm_mi2s_pdata *mi2s_pdata = - (struct msm_mi2s_pdata *) pdev->dev.platform_data; - unsigned int ch_cnt; - int rc = 0; - u16 sd_line; - - if (mi2s_pdata == NULL) { - pr_err("%s: mi2s_pdata NULL", __func__); - return -EINVAL; - } - - rc = msm_dai_q6_mi2s_get_lineconfig(mi2s_pdata->rx_sd_lines, - &sd_line, &ch_cnt); - if (rc < 0) { - dev_err(&pdev->dev, "invalid MI2S RX sd line config\n"); - goto rtn; - } - - if (ch_cnt) { - dai_data->rx_dai.mi2s_dai_data.port_config.i2s.channel_mode = - sd_line; - dai_data->rx_dai.pdata_mi2s_lines = sd_line; - dai_driver->playback.channels_min = 1; - dai_driver->playback.channels_max = ch_cnt << 1; - } else { - dai_driver->playback.channels_min = 0; - dai_driver->playback.channels_max = 0; - } - rc = msm_dai_q6_mi2s_get_lineconfig(mi2s_pdata->tx_sd_lines, - &sd_line, &ch_cnt); - if (rc < 0) { - dev_err(&pdev->dev, "invalid MI2S TX sd line config\n"); - goto rtn; - } - - if (ch_cnt) { - dai_data->tx_dai.mi2s_dai_data.port_config.i2s.channel_mode = - sd_line; - dai_data->tx_dai.pdata_mi2s_lines = sd_line; - dai_driver->capture.channels_min = 1; - dai_driver->capture.channels_max = ch_cnt << 1; - } else { - dai_driver->capture.channels_min = 0; - dai_driver->capture.channels_max = 0; - } - - dev_dbg(&pdev->dev, "%s: playback sdline 0x%x capture sdline 0x%x\n", - __func__, dai_data->rx_dai.pdata_mi2s_lines, - dai_data->tx_dai.pdata_mi2s_lines); - dev_dbg(&pdev->dev, "%s: playback ch_max %d capture ch_mx %d\n", - __func__, dai_driver->playback.channels_max, - dai_driver->capture.channels_max); -rtn: - return rc; -} - -static const struct snd_soc_component_driver msm_q6_mi2s_dai_component = { - .name = "msm-dai-q6-mi2s", -}; -static int msm_dai_q6_mi2s_dev_probe(struct platform_device *pdev) -{ - struct msm_dai_q6_mi2s_dai_data *dai_data; - const char *q6_mi2s_dev_id = "qcom,msm-dai-q6-mi2s-dev-id"; - u32 tx_line = 0; - u32 rx_line = 0; - u32 mi2s_intf = 0; - struct msm_mi2s_pdata *mi2s_pdata; - int rc; - - rc = of_property_read_u32(pdev->dev.of_node, q6_mi2s_dev_id, - &mi2s_intf); - if (rc) { - dev_err(&pdev->dev, - "%s: missing 0x%x in dt node\n", __func__, mi2s_intf); - goto rtn; - } - - dev_dbg(&pdev->dev, "dev name %s dev id 0x%x\n", dev_name(&pdev->dev), - mi2s_intf); - - if ((mi2s_intf < MSM_MI2S_MIN || mi2s_intf > MSM_MI2S_MAX) - || (mi2s_intf >= ARRAY_SIZE(msm_dai_q6_mi2s_dai))) { - dev_err(&pdev->dev, - "%s: Invalid MI2S ID %u from Device Tree\n", - __func__, mi2s_intf); - rc = -ENXIO; - goto rtn; - } - - pdev->id = mi2s_intf; - - mi2s_pdata = kzalloc(sizeof(struct msm_mi2s_pdata), GFP_KERNEL); - if (!mi2s_pdata) { - rc = -ENOMEM; - goto rtn; - } - - rc = of_property_read_u32(pdev->dev.of_node, "qcom,msm-mi2s-rx-lines", - &rx_line); - if (rc) { - dev_err(&pdev->dev, "%s: Rx line from DT file %s\n", __func__, - "qcom,msm-mi2s-rx-lines"); - goto free_pdata; - } - - rc = of_property_read_u32(pdev->dev.of_node, "qcom,msm-mi2s-tx-lines", - &tx_line); - if (rc) { - dev_err(&pdev->dev, "%s: Tx line from DT file %s\n", __func__, - "qcom,msm-mi2s-tx-lines"); - goto free_pdata; - } - dev_dbg(&pdev->dev, "dev name %s Rx line 0x%x , Tx ine 0x%x\n", - dev_name(&pdev->dev), rx_line, tx_line); - mi2s_pdata->rx_sd_lines = rx_line; - mi2s_pdata->tx_sd_lines = tx_line; - mi2s_pdata->intf_id = mi2s_intf; - - dai_data = kzalloc(sizeof(struct msm_dai_q6_mi2s_dai_data), - GFP_KERNEL); - if (!dai_data) { - rc = -ENOMEM; - goto free_pdata; - } else - dev_set_drvdata(&pdev->dev, dai_data); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - pdev->dev.platform_data = mi2s_pdata; - - rc = msm_dai_q6_mi2s_platform_data_validation(pdev, - &msm_dai_q6_mi2s_dai[mi2s_intf]); - if (rc < 0) - goto free_dai_data; - - rc = snd_soc_register_component(&pdev->dev, &msm_q6_mi2s_dai_component, - &msm_dai_q6_mi2s_dai[mi2s_intf], 1); - if (rc < 0) - goto err_register; - return 0; - -err_register: - dev_err(&pdev->dev, "fail to msm_dai_q6_mi2s_dev_probe\n"); -free_dai_data: - kfree(dai_data); -free_pdata: - kfree(mi2s_pdata); -rtn: - return rc; -} - -static int msm_dai_q6_mi2s_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static int msm_dai_q6_dai_meta_mi2s_probe(struct snd_soc_dai *dai) -{ - struct msm_meta_mi2s_pdata *meta_mi2s_pdata = - (struct msm_meta_mi2s_pdata *) dai->dev->platform_data; - int rc = 0; - - dai->id = meta_mi2s_pdata->intf_id; - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static int msm_dai_q6_dai_meta_mi2s_remove(struct snd_soc_dai *dai) -{ - return 0; -} - -static int msm_dai_q6_meta_mi2s_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - return 0; -} - -static int msm_meta_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id) -{ - int ret = 0; - - switch (stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - switch (mi2s_id) { - case MSM_PRIM_META_MI2S: - *port_id = AFE_PORT_ID_PRIMARY_META_MI2S_RX; - break; - case MSM_SEC_META_MI2S: - *port_id = AFE_PORT_ID_SECONDARY_META_MI2S_RX; - break; - default: - pr_err("%s: playback err id 0x%x\n", - __func__, mi2s_id); - ret = -1; - break; - } - break; - - case SNDRV_PCM_STREAM_CAPTURE: - switch (mi2s_id) { - default: - pr_err("%s: capture err id 0x%x\n", __func__, mi2s_id); - ret = -1; - break; - } - break; - - default: - pr_err("%s: default err %d\n", __func__, stream); - ret = -1; - break; - } - pr_debug("%s: port_id = 0x%x\n", __func__, *port_id); - return ret; -} - -static int msm_dai_q6_meta_mi2s_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_meta_mi2s_dai_data *dai_data = - dev_get_drvdata(dai->dev); - u16 port_id = 0; - int rc = 0; - - if (msm_meta_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - return -EINVAL; - } - - dev_dbg(dai->dev, "%s: dai id %d, afe port id = 0x%x\n" - "dai_data->channels = %u sample_rate = %u\n", __func__, - dai->id, port_id, dai_data->channels, dai_data->rate); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - /* PORT START should be set if prepare called - * in active state. - */ - rc = afe_port_start(port_id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - - return rc; -} - -static int msm_dai_q6_meta_mi2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_meta_mi2s_dai_data *dai_data = - dev_get_drvdata(dai->dev); - struct afe_param_id_meta_i2s_cfg *port_cfg = - &dai_data->port_config.meta_i2s; - int idx = 0; - u16 port_channels = 0; - u16 channels_left = 0; - - dai_data->channels = params_channels(params); - channels_left = dai_data->channels; - - /* map requested channels to channels that member ports provide */ - for (idx = 0; idx < dai_data->num_member_ports; idx++) { - port_channels = msm_dai_q6_mi2s_get_num_channels( - dai_data->channel_mode[idx]); - - if (channels_left >= port_channels) { - port_cfg->member_port_id[idx] = - dai_data->member_port_id[idx]; - port_cfg->member_port_channel_mode[idx] = - dai_data->channel_mode[idx]; - channels_left -= port_channels; - } else { - switch (channels_left) { - case 15: - case 16: - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_16CHS: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_16CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 13: - case 14: - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_14CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 11: - case 12: - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_12CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 9: - case 10: - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_10CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 8: - case 7: - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_8CHS: - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_8CHS; - break; - case AFE_PORT_I2S_8CHS_2: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_8CHS_2; - break; - default: - goto error_invalid_data; - }; - break; - case 6: - case 5: - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_6CHS: - case AFE_PORT_I2S_8CHS: - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_6CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 4: - case 3: - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - goto error_invalid_data; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_QUAD23: - case AFE_PORT_I2S_QUAD45: - case AFE_PORT_I2S_QUAD67: - port_cfg->member_port_channel_mode[idx] - = dai_data->channel_mode[idx]; - break; - case AFE_PORT_I2S_8CHS_2: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_QUAD45; - break; - default: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_QUAD01; - }; - break; - case 2: - case 1: - if (dai_data->channel_mode[idx] < - AFE_PORT_I2S_SD0) - goto error_invalid_data; - switch (dai_data->channel_mode[idx]) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - port_cfg->member_port_channel_mode[idx] - = dai_data->channel_mode[idx]; - break; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_6CHS: - case AFE_PORT_I2S_8CHS: - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_SD0; - break; - case AFE_PORT_I2S_QUAD23: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_SD2; - break; - case AFE_PORT_I2S_QUAD45: - case AFE_PORT_I2S_8CHS_2: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_SD4; - break; - case AFE_PORT_I2S_QUAD67: - port_cfg->member_port_channel_mode[idx] - = AFE_PORT_I2S_SD6; - break; - } - break; - case 0: - port_cfg->member_port_channel_mode[idx] = 0; - } - if (port_cfg->member_port_channel_mode[idx] == 0) { - port_cfg->member_port_id[idx] = - AFE_PORT_ID_INVALID; - } else { - port_cfg->member_port_id[idx] = - dai_data->member_port_id[idx]; - channels_left -= - msm_dai_q6_mi2s_get_num_channels( - port_cfg->member_port_channel_mode[idx]); - } - } - } - - if (channels_left > 0) { - pr_err("%s: too many channels %d\n", - __func__, dai_data->channels); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - port_cfg->sample_rate = dai_data->rate; - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - port_cfg->bit_width = 16; - dai_data->bitwidth = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - port_cfg->bit_width = 24; - dai_data->bitwidth = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - port_cfg->minor_version = AFE_API_VERSION_META_I2S_CONFIG; - port_cfg->data_format = AFE_LINEAR_PCM_DATA; - - dev_dbg(dai->dev, "%s: dai id %d dai_data->channels = %d\n" - "bit_width = %hu ws_src = 0x%x sample_rate = %u\n" - "member_ports 0x%x 0x%x 0x%x 0x%x\n" - "sd_lines 0x%x 0x%x 0x%x 0x%x\n", - __func__, dai->id, dai_data->channels, - port_cfg->bit_width, port_cfg->ws_src, port_cfg->sample_rate, - port_cfg->member_port_id[0], - port_cfg->member_port_id[1], - port_cfg->member_port_id[2], - port_cfg->member_port_id[3], - port_cfg->member_port_channel_mode[0], - port_cfg->member_port_channel_mode[1], - port_cfg->member_port_channel_mode[2], - port_cfg->member_port_channel_mode[3]); - return 0; - -error_invalid_data: - pr_err("%s: error when assigning member port %d channels (channels_left %d)\n", - __func__, idx, channels_left); - return -EINVAL; -} - -static int msm_dai_q6_meta_mi2s_set_fmt(struct snd_soc_dai *dai, - unsigned int fmt) -{ - struct msm_dai_q6_meta_mi2s_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - dev_err(dai->dev, "%s: err chg meta i2s mode while dai running", - __func__); - return -EPERM; - } - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - dai_data->port_config.meta_i2s.ws_src = 1; - break; - case SND_SOC_DAIFMT_CBM_CFM: - dai_data->port_config.meta_i2s.ws_src = 0; - break; - default: - pr_err("%s: fmt %d\n", - __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); - return -EINVAL; - } - - return 0; -} - -static void msm_dai_q6_meta_mi2s_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_meta_mi2s_dai_data *dai_data = - dev_get_drvdata(dai->dev); - u16 port_id = 0; - int rc = 0; - - if (msm_meta_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - } - - dev_dbg(dai->dev, "%s: closing afe port id = 0x%x\n", - __func__, port_id); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(port_id); - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } -} - -static struct snd_soc_dai_ops msm_dai_q6_meta_mi2s_ops = { - .startup = msm_dai_q6_meta_mi2s_startup, - .prepare = msm_dai_q6_meta_mi2s_prepare, - .hw_params = msm_dai_q6_meta_mi2s_hw_params, - .set_fmt = msm_dai_q6_meta_mi2s_set_fmt, - .shutdown = msm_dai_q6_meta_mi2s_shutdown, -}; - -/* Channel min and max are initialized base on platform data */ -static struct snd_soc_dai_driver msm_dai_q6_meta_mi2s_dai[] = { - { - .playback = { - .stream_name = "Primary META MI2S Playback", - .aif_name = "PRI_META_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_meta_mi2s_ops, - .name = "Primary META MI2S", - .id = AFE_PORT_ID_PRIMARY_META_MI2S_RX, - .probe = msm_dai_q6_dai_meta_mi2s_probe, - .remove = msm_dai_q6_dai_meta_mi2s_remove, - }, - { - .playback = { - .stream_name = "Secondary META MI2S Playback", - .aif_name = "SEC_META_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_meta_mi2s_ops, - .name = "Secondary META MI2S", - .id = AFE_PORT_ID_SECONDARY_META_MI2S_RX, - .probe = msm_dai_q6_dai_meta_mi2s_probe, - .remove = msm_dai_q6_dai_meta_mi2s_remove, - }, -}; - -static int msm_dai_q6_meta_mi2s_platform_data_validation( - struct platform_device *pdev, struct snd_soc_dai_driver *dai_driver) -{ - struct msm_dai_q6_meta_mi2s_dai_data *dai_data = - dev_get_drvdata(&pdev->dev); - struct msm_meta_mi2s_pdata *meta_mi2s_pdata = - (struct msm_meta_mi2s_pdata *) pdev->dev.platform_data; - int rc = 0; - int idx = 0; - u16 channel_mode = 0; - unsigned int ch_cnt = 0; - unsigned int ch_cnt_sum = 0; - struct afe_param_id_meta_i2s_cfg *port_cfg = - &dai_data->port_config.meta_i2s; - - if (meta_mi2s_pdata == NULL) { - pr_err("%s: meta_mi2s_pdata NULL", __func__); - return -EINVAL; - } - - dai_data->num_member_ports = meta_mi2s_pdata->num_member_ports; - for (idx = 0; idx < meta_mi2s_pdata->num_member_ports; idx++) { - rc = msm_dai_q6_mi2s_get_lineconfig( - meta_mi2s_pdata->sd_lines[idx], - &channel_mode, - &ch_cnt); - if (rc < 0) { - dev_err(&pdev->dev, "invalid META MI2S RX sd line config\n"); - goto rtn; - } - if (ch_cnt) { - msm_mi2s_get_port_id(meta_mi2s_pdata->member_port[idx], - SNDRV_PCM_STREAM_PLAYBACK, - &dai_data->member_port_id[idx]); - dai_data->channel_mode[idx] = channel_mode; - port_cfg->member_port_id[idx] = - dai_data->member_port_id[idx]; - port_cfg->member_port_channel_mode[idx] = channel_mode; - } - ch_cnt_sum += ch_cnt; - } - - if (ch_cnt_sum) { - dai_driver->playback.channels_min = 1; - dai_driver->playback.channels_max = ch_cnt_sum << 1; - } else { - dai_driver->playback.channels_min = 0; - dai_driver->playback.channels_max = 0; - } - - dev_dbg(&pdev->dev, "%s: sdline 0x%x 0x%x 0x%x 0x%x\n", __func__, - dai_data->channel_mode[0], dai_data->channel_mode[1], - dai_data->channel_mode[2], dai_data->channel_mode[3]); - dev_dbg(&pdev->dev, "%s: playback ch_max %d\n", - __func__, dai_driver->playback.channels_max); -rtn: - return rc; -} - -static const struct snd_soc_component_driver msm_q6_meta_mi2s_dai_component = { - .name = "msm-dai-q6-meta-mi2s", -}; - -static int msm_dai_q6_meta_mi2s_dev_probe(struct platform_device *pdev) -{ - struct msm_dai_q6_meta_mi2s_dai_data *dai_data; - const char *q6_meta_mi2s_dev_id = "qcom,msm-dai-q6-meta-mi2s-dev-id"; - u32 dev_id = 0; - u32 meta_mi2s_intf = 0; - struct msm_meta_mi2s_pdata *meta_mi2s_pdata; - int rc; - - rc = of_property_read_u32(pdev->dev.of_node, q6_meta_mi2s_dev_id, - &dev_id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, - q6_meta_mi2s_dev_id); - goto rtn; - } - - dev_dbg(&pdev->dev, "dev name %s dev id 0x%x\n", dev_name(&pdev->dev), - dev_id); - - switch (dev_id) { - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - meta_mi2s_intf = 0; - break; - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - meta_mi2s_intf = 1; - break; - default: - dev_err(&pdev->dev, - "%s: Invalid META MI2S ID 0x%x from Device Tree\n", - __func__, dev_id); - rc = -ENXIO; - goto rtn; - } - - pdev->id = dev_id; - - meta_mi2s_pdata = kzalloc(sizeof(struct msm_meta_mi2s_pdata), - GFP_KERNEL); - if (!meta_mi2s_pdata) { - rc = -ENOMEM; - goto rtn; - } - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-mi2s-num-members", - &meta_mi2s_pdata->num_member_ports); - if (rc) { - dev_err(&pdev->dev, "%s: invalid num from DT file %s\n", - __func__, "qcom,msm-mi2s-num-members"); - goto free_pdata; - } - - if (meta_mi2s_pdata->num_member_ports > - MAX_NUM_I2S_META_PORT_MEMBER_PORTS) { - dev_err(&pdev->dev, "%s: num-members %d too large from DT file\n", - __func__, meta_mi2s_pdata->num_member_ports); - goto free_pdata; - } - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-member-id", - meta_mi2s_pdata->member_port, - meta_mi2s_pdata->num_member_ports); - if (rc) { - dev_err(&pdev->dev, "%s: member-id from DT file %s\n", - __func__, "qcom,msm-mi2s-member-id"); - goto free_pdata; - } - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-rx-lines", - meta_mi2s_pdata->sd_lines, - meta_mi2s_pdata->num_member_ports); - if (rc) { - dev_err(&pdev->dev, "%s: Rx line from DT file %s\n", - __func__, "qcom,msm-mi2s-rx-lines"); - goto free_pdata; - } - - dev_dbg(&pdev->dev, "dev name %s num-members=%d\n", - dev_name(&pdev->dev), meta_mi2s_pdata->num_member_ports); - dev_dbg(&pdev->dev, "member array (%d, %d, %d, %d)\n", - meta_mi2s_pdata->member_port[0], - meta_mi2s_pdata->member_port[1], - meta_mi2s_pdata->member_port[2], - meta_mi2s_pdata->member_port[3]); - dev_dbg(&pdev->dev, "sd-lines array (0x%x, 0x%x, 0x%x, 0x%x)\n", - meta_mi2s_pdata->sd_lines[0], - meta_mi2s_pdata->sd_lines[1], - meta_mi2s_pdata->sd_lines[2], - meta_mi2s_pdata->sd_lines[3]); - - meta_mi2s_pdata->intf_id = meta_mi2s_intf; - - dai_data = kzalloc(sizeof(struct msm_dai_q6_meta_mi2s_dai_data), - GFP_KERNEL); - if (!dai_data) { - rc = -ENOMEM; - goto free_pdata; - } else - dev_set_drvdata(&pdev->dev, dai_data); - - pdev->dev.platform_data = meta_mi2s_pdata; - - rc = msm_dai_q6_meta_mi2s_platform_data_validation(pdev, - &msm_dai_q6_meta_mi2s_dai[meta_mi2s_intf]); - if (rc < 0) - goto free_dai_data; - - rc = snd_soc_register_component(&pdev->dev, - &msm_q6_meta_mi2s_dai_component, - &msm_dai_q6_meta_mi2s_dai[meta_mi2s_intf], 1); - if (rc < 0) - goto err_register; - return 0; - -err_register: - dev_err(&pdev->dev, "fail to %s\n", __func__); -free_dai_data: - kfree(dai_data); -free_pdata: - kfree(meta_mi2s_pdata); -rtn: - return rc; -} - -static int msm_dai_q6_meta_mi2s_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct snd_soc_component_driver msm_dai_q6_component = { - .name = "msm-dai-q6-dev", -}; - -static int msm_dai_q6_dev_probe(struct platform_device *pdev) -{ - int rc, id, i, len; - const char *q6_dev_id = "qcom,msm-dai-q6-dev-id"; - char stream_name[80]; - - rc = of_property_read_u32(pdev->dev.of_node, q6_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, q6_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (id) { - case SLIMBUS_0_RX: - strlcpy(stream_name, "Slimbus Playback", 80); - goto register_slim_playback; - case SLIMBUS_2_RX: - strlcpy(stream_name, "Slimbus2 Playback", 80); - goto register_slim_playback; - case SLIMBUS_1_RX: - strlcpy(stream_name, "Slimbus1 Playback", 80); - goto register_slim_playback; - case SLIMBUS_3_RX: - strlcpy(stream_name, "Slimbus3 Playback", 80); - goto register_slim_playback; - case SLIMBUS_4_RX: - strlcpy(stream_name, "Slimbus4 Playback", 80); - goto register_slim_playback; - case SLIMBUS_5_RX: - strlcpy(stream_name, "Slimbus5 Playback", 80); - goto register_slim_playback; - case SLIMBUS_6_RX: - strlcpy(stream_name, "Slimbus6 Playback", 80); - goto register_slim_playback; - case SLIMBUS_7_RX: - strlcpy(stream_name, "Slimbus7 Playback", sizeof(stream_name)); - goto register_slim_playback; - case SLIMBUS_8_RX: - strlcpy(stream_name, "Slimbus8 Playback", sizeof(stream_name)); - goto register_slim_playback; - case SLIMBUS_9_RX: - strlcpy(stream_name, "Slimbus9 Playback", sizeof(stream_name)); - goto register_slim_playback; -register_slim_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_slimbus_rx_dai); i++) { - if (msm_dai_q6_slimbus_rx_dai[i].playback.stream_name && - !strcmp(stream_name, - msm_dai_q6_slimbus_rx_dai[i] - .playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_slimbus_rx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case SLIMBUS_0_TX: - strlcpy(stream_name, "Slimbus Capture", 80); - goto register_slim_capture; - case SLIMBUS_1_TX: - strlcpy(stream_name, "Slimbus1 Capture", 80); - goto register_slim_capture; - case SLIMBUS_2_TX: - strlcpy(stream_name, "Slimbus2 Capture", 80); - goto register_slim_capture; - case SLIMBUS_3_TX: - strlcpy(stream_name, "Slimbus3 Capture", 80); - goto register_slim_capture; - case SLIMBUS_4_TX: - strlcpy(stream_name, "Slimbus4 Capture", 80); - goto register_slim_capture; - case SLIMBUS_5_TX: - strlcpy(stream_name, "Slimbus5 Capture", 80); - goto register_slim_capture; - case SLIMBUS_6_TX: - strlcpy(stream_name, "Slimbus6 Capture", 80); - goto register_slim_capture; - case SLIMBUS_7_TX: - strlcpy(stream_name, "Slimbus7 Capture", sizeof(stream_name)); - goto register_slim_capture; - case SLIMBUS_8_TX: - strlcpy(stream_name, "Slimbus8 Capture", sizeof(stream_name)); - goto register_slim_capture; - case SLIMBUS_9_TX: - strlcpy(stream_name, "Slimbus9 Capture", sizeof(stream_name)); - goto register_slim_capture; -register_slim_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_slimbus_tx_dai); i++) { - if (msm_dai_q6_slimbus_tx_dai[i].capture.stream_name && - !strcmp(stream_name, - msm_dai_q6_slimbus_tx_dai[i] - .capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_slimbus_tx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case AFE_LOOPBACK_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_lb_tx_dai[0], - 1); - break; - case INT_BT_SCO_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_sco_rx_dai, 1); - break; - case INT_BT_SCO_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_sco_tx_dai, 1); - break; - case INT_BT_A2DP_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_a2dp_rx_dai, 1); - break; - case INT_FM_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_fm_rx_dai, 1); - break; - case INT_FM_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_fm_tx_dai, 1); - break; - case AFE_PORT_ID_USB_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_usb_rx_dai, 1); - break; - case AFE_PORT_ID_USB_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_usb_tx_dai, 1); - break; - case RT_PROXY_DAI_001_RX: - strlcpy(stream_name, "AFE Playback", 80); - goto register_afe_playback; - case RT_PROXY_DAI_002_RX: - strlcpy(stream_name, "AFE-PROXY RX", 80); -register_afe_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_afe_rx_dai); i++) { - if (msm_dai_q6_afe_rx_dai[i].playback.stream_name && - !strcmp(stream_name, - msm_dai_q6_afe_rx_dai[i].playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_rx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case RT_PROXY_DAI_001_TX: - strlcpy(stream_name, "AFE-PROXY TX", 80); - goto register_afe_capture; - case RT_PROXY_DAI_002_TX: - strlcpy(stream_name, "AFE Capture", 80); -register_afe_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_afe_tx_dai); i++) { - if (msm_dai_q6_afe_tx_dai[i].capture.stream_name && - !strcmp(stream_name, - msm_dai_q6_afe_tx_dai[i].capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_tx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case VOICE_PLAYBACK_TX: - strlcpy(stream_name, "Voice Farend Playback", 80); - goto register_voice_playback; - case VOICE2_PLAYBACK_TX: - strlcpy(stream_name, "Voice2 Farend Playback", 80); -register_voice_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_voc_playback_dai); i++) { - if (msm_dai_q6_voc_playback_dai[i].playback.stream_name - && !strcmp(stream_name, - msm_dai_q6_voc_playback_dai[i].playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_voc_playback_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s Device not found stream name %s\n", - __func__, stream_name); - break; - case VOICE_RECORD_RX: - strlcpy(stream_name, "Voice Downlink Capture", 80); - goto register_uplink_capture; - case VOICE_RECORD_TX: - strlcpy(stream_name, "Voice Uplink Capture", 80); -register_uplink_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_incall_record_dai); i++) { - if (msm_dai_q6_incall_record_dai[i].capture.stream_name - && !strcmp(stream_name, - msm_dai_q6_incall_record_dai[i]. - capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_incall_record_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - - case RT_PROXY_PORT_002_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_proxy_rx_dai, 1); - break; - case RT_PROXY_PORT_002_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_proxy_tx_dai, 1); - break; - default: - rc = -ENODEV; - break; - } - - return rc; -} - -static int msm_dai_q6_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-q6-dev", }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_dev_dt_match); - -static struct platform_driver msm_dai_q6_dev = { - .probe = msm_dai_q6_dev_probe, - .remove = msm_dai_q6_dev_remove, - .driver = { - .name = "msm-dai-q6-dev", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_dev_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int msm_dai_q6_probe(struct platform_device *pdev) -{ - int rc; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - - return rc; -} - -static int msm_dai_q6_remove(struct platform_device *pdev) -{ - of_platform_depopulate(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_dt_match[] = { - { .compatible = "qcom,msm-dai-q6", }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_dt_match); -static struct platform_driver msm_dai_q6 = { - .probe = msm_dai_q6_probe, - .remove = msm_dai_q6_remove, - .driver = { - .name = "msm-dai-q6", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int msm_dai_mi2s_q6_probe(struct platform_device *pdev) -{ - int rc; - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - return rc; -} - -static int msm_dai_mi2s_q6_remove(struct platform_device *pdev) -{ - return 0; -} - -static const struct of_device_id msm_dai_mi2s_dt_match[] = { - { .compatible = "qcom,msm-dai-mi2s", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_mi2s_dt_match); - -static struct platform_driver msm_dai_mi2s_q6 = { - .probe = msm_dai_mi2s_q6_probe, - .remove = msm_dai_mi2s_q6_remove, - .driver = { - .name = "msm-dai-mi2s", - .owner = THIS_MODULE, - .of_match_table = msm_dai_mi2s_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static const struct of_device_id msm_dai_q6_mi2s_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-q6-mi2s", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_q6_mi2s_dev_dt_match); - -static struct platform_driver msm_dai_q6_mi2s_driver = { - .probe = msm_dai_q6_mi2s_dev_probe, - .remove = msm_dai_q6_mi2s_dev_remove, - .driver = { - .name = "msm-dai-q6-mi2s", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_mi2s_dev_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static const struct of_device_id msm_dai_q6_meta_mi2s_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-q6-meta-mi2s", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_q6_meta_mi2s_dev_dt_match); - -static struct platform_driver msm_dai_q6_meta_mi2s_driver = { - .probe = msm_dai_q6_meta_mi2s_dev_probe, - .remove = msm_dai_q6_meta_mi2s_dev_remove, - .driver = { - .name = "msm-dai-q6-meta-mi2s", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_meta_mi2s_dev_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int msm_dai_q6_spdif_dev_probe(struct platform_device *pdev) -{ - int rc, id; - const char *q6_dev_id = "qcom,msm-dai-q6-dev-id"; - - rc = of_property_read_u32(pdev->dev.of_node, q6_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, q6_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (pdev->id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_rx_dai[0], 1); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_rx_dai[1], 1); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_tx_dai[0], 1); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_tx_dai[1], 1); - break; - default: - dev_err(&pdev->dev, "invalid device ID %d\n", pdev->id); - rc = -ENODEV; - break; - } - - return rc; -} - -static int msm_dai_q6_spdif_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_spdif_dt_match[] = { - {.compatible = "qcom,msm-dai-q6-spdif"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_spdif_dt_match); - -static struct platform_driver msm_dai_q6_spdif_driver = { - .probe = msm_dai_q6_spdif_dev_probe, - .remove = msm_dai_q6_spdif_dev_remove, - .driver = { - .name = "msm-dai-q6-spdif", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_spdif_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int msm_dai_q6_tdm_set_clk_param(u32 group_id, - struct afe_clk_set *clk_set, u32 mode) -{ - switch (group_id) { - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_PRI_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_SENARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_SENARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEN_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEN_TDM_EBIT; - break; - default: - return -EINVAL; - } - return 0; -} - -static int msm_dai_tdm_q6_probe(struct platform_device *pdev) -{ - int rc = 0; - const uint32_t *port_id_array = NULL; - uint32_t array_length = 0; - int i = 0; - int group_idx = 0; - u32 clk_mode = 0; - - /* extract tdm group info into static */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-group-id", - (u32 *)&tdm_group_cfg.group_id); - if (rc) { - dev_err(&pdev->dev, "%s: Group ID from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-group-id"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Group ID from DT file 0x%x\n", - __func__, tdm_group_cfg.group_id); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-group-num-ports", - &num_tdm_group_ports); - if (rc) { - dev_err(&pdev->dev, "%s: Group Num Ports from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-group-num-ports"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Group Num Ports from DT file 0x%x\n", - __func__, num_tdm_group_ports); - - if (num_tdm_group_ports > AFE_GROUP_DEVICE_NUM_PORTS) { - dev_err(&pdev->dev, "%s Group Num Ports %d greater than Max %d\n", - __func__, num_tdm_group_ports, - AFE_GROUP_DEVICE_NUM_PORTS); - rc = -EINVAL; - goto rtn; - } - - port_id_array = of_get_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-group-port-id", - &array_length); - if (port_id_array == NULL) { - dev_err(&pdev->dev, "%s port_id_array is not valid\n", - __func__); - rc = -EINVAL; - goto rtn; - } - if (array_length != sizeof(uint32_t) * num_tdm_group_ports) { - dev_err(&pdev->dev, "%s array_length is %d, expected is %zd\n", - __func__, array_length, - sizeof(uint32_t) * num_tdm_group_ports); - rc = -EINVAL; - goto rtn; - } - - for (i = 0; i < num_tdm_group_ports; i++) - tdm_group_cfg.port_id[i] = - (u16)be32_to_cpu(port_id_array[i]); - /* Unused index should be filled with 0 or AFE_PORT_INVALID */ - for (i = num_tdm_group_ports; i < AFE_GROUP_DEVICE_NUM_PORTS; i++) - tdm_group_cfg.port_id[i] = - AFE_PORT_INVALID; - - /* extract tdm clk info into static */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-rate", - &tdm_clk_set.clk_freq_in_hz); - if (rc) { - dev_err(&pdev->dev, "%s: Clk Rate from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-clk-rate"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Clk Rate from DT file %d\n", - __func__, tdm_clk_set.clk_freq_in_hz); - - /* initialize static tdm clk attribute to default value */ - tdm_clk_set.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO; - - /* extract tdm clk attribute into static */ - if (of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-attribute", NULL)) { - rc = of_property_read_u16(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-attribute", - &tdm_clk_set.clk_attri); - if (rc) { - dev_err(&pdev->dev, "%s: value for clk attribute not found %s\n", - __func__, "qcom,msm-cpudai-tdm-clk-attribute"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: clk attribute from DT file %d\n", - __func__, tdm_clk_set.clk_attri); - } else - dev_dbg(&pdev->dev, "%s: clk attribute not found\n", __func__); - - /* extract tdm lane cfg to static */ - tdm_lane_cfg.port_id = tdm_group_cfg.group_id; - tdm_lane_cfg.lane_mask = AFE_LANE_MASK_INVALID; - if (of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-lane-mask", NULL)) { - rc = of_property_read_u16(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-lane-mask", - &tdm_lane_cfg.lane_mask); - if (rc) { - dev_err(&pdev->dev, "%s: value for tdm lane mask not found %s\n", - __func__, "qcom,msm-cpudai-tdm-lane-mask"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: tdm lane mask from DT file %d\n", - __func__, tdm_lane_cfg.lane_mask); - } else - dev_dbg(&pdev->dev, "%s: tdm lane mask not found\n", __func__); - - /* extract tdm clk src master/slave info into static */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-internal", - &clk_mode); - if (rc) { - dev_err(&pdev->dev, "%s: Clk id from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-clk-internal"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Clk id from DT file %d\n", - __func__, clk_mode); - - rc = msm_dai_q6_tdm_set_clk_param(tdm_group_cfg.group_id, - &tdm_clk_set, clk_mode); - if (rc) { - dev_err(&pdev->dev, "%s: group id not supported 0x%x\n", - __func__, tdm_group_cfg.group_id); - goto rtn; - } - - /* other initializations within device group */ - group_idx = msm_dai_q6_get_group_idx(tdm_group_cfg.group_id); - if (group_idx < 0) { - dev_err(&pdev->dev, "%s: group id 0x%x not supported\n", - __func__, tdm_group_cfg.group_id); - rc = -EINVAL; - goto rtn; - } - atomic_set(&tdm_group_ref[group_idx], 0); - - /* probe child node info */ - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - goto rtn; - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - -rtn: - return rc; -} - -static int msm_dai_tdm_q6_remove(struct platform_device *pdev) -{ - return 0; -} - -static const struct of_device_id msm_dai_tdm_dt_match[] = { - { .compatible = "qcom,msm-dai-tdm", }, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_dai_tdm_dt_match); - -static struct platform_driver msm_dai_tdm_q6 = { - .probe = msm_dai_tdm_q6_probe, - .remove = msm_dai_tdm_q6_remove, - .driver = { - .name = "msm-dai-tdm", - .owner = THIS_MODULE, - .of_match_table = msm_dai_tdm_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int msm_dai_q6_tdm_data_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - switch (value) { - case 0: - dai_data->port_cfg.tdm.data_format = AFE_LINEAR_PCM_DATA; - break; - case 1: - dai_data->port_cfg.tdm.data_format = AFE_NON_LINEAR_DATA; - break; - case 2: - dai_data->port_cfg.tdm.data_format = AFE_GENERIC_COMPRESSED; - break; - default: - pr_err("%s: data_format invalid\n", __func__); - break; - } - pr_debug("%s: data_format = %d\n", - __func__, dai_data->port_cfg.tdm.data_format); - return 0; -} - -static int msm_dai_q6_tdm_data_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_cfg.tdm.data_format; - pr_debug("%s: data_format = %d\n", - __func__, dai_data->port_cfg.tdm.data_format); - return 0; -} - -static int msm_dai_q6_tdm_header_type_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_cfg.custom_tdm_header.header_type = value; - pr_debug("%s: header_type = %d\n", - __func__, - dai_data->port_cfg.custom_tdm_header.header_type); - return 0; -} - -static int msm_dai_q6_tdm_header_type_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_cfg.custom_tdm_header.header_type; - pr_debug("%s: header_type = %d\n", - __func__, - dai_data->port_cfg.custom_tdm_header.header_type); - return 0; -} - -static int msm_dai_q6_tdm_header_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int i = 0; - - for (i = 0; i < AFE_CUSTOM_TDM_HEADER_MAX_CNT; i++) { - dai_data->port_cfg.custom_tdm_header.header[i] = - (u16)ucontrol->value.integer.value[i]; - pr_debug("%s: header #%d = 0x%x\n", - __func__, i, - dai_data->port_cfg.custom_tdm_header.header[i]); - } - return 0; -} - -static int msm_dai_q6_tdm_header_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int i = 0; - - for (i = 0; i < AFE_CUSTOM_TDM_HEADER_MAX_CNT; i++) { - ucontrol->value.integer.value[i] = - dai_data->port_cfg.custom_tdm_header.header[i]; - pr_debug("%s: header #%d = 0x%x\n", - __func__, i, - dai_data->port_cfg.custom_tdm_header.header[i]); - } - return 0; -} - -static const struct snd_kcontrol_new tdm_config_controls_data_format[] = { - SOC_ENUM_EXT("PRI_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEN_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), -}; - -static const struct snd_kcontrol_new tdm_config_controls_header_type[] = { - SOC_ENUM_EXT("PRI_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEN_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), -}; - -static const struct snd_kcontrol_new tdm_config_controls_header[] = { - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), -}; - -static int msm_dai_q6_tdm_set_clk( - struct msm_dai_q6_tdm_dai_data *dai_data, - u16 port_id, bool enable) -{ - int rc = 0; - - dai_data->clk_set.enable = enable; - - rc = afe_set_lpass_clock_v2(port_id, - &dai_data->clk_set); - if (rc < 0) - pr_err("%s: afe lpass clock failed, err:%d\n", - __func__, rc); - - return rc; -} - -static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *tdm_dai_data = NULL; - struct snd_kcontrol *data_format_kcontrol = NULL; - struct snd_kcontrol *header_type_kcontrol = NULL; - struct snd_kcontrol *header_kcontrol = NULL; - int port_idx = 0; - const struct snd_kcontrol_new *data_format_ctrl = NULL; - const struct snd_kcontrol_new *header_type_ctrl = NULL; - const struct snd_kcontrol_new *header_ctrl = NULL; - - tdm_dai_data = dev_get_drvdata(dai->dev); - - msm_dai_q6_set_dai_id(dai); - - port_idx = msm_dai_q6_get_port_idx(dai->id); - if (port_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - rc = -EINVAL; - goto rtn; - } - - data_format_ctrl = - &tdm_config_controls_data_format[port_idx]; - header_type_ctrl = - &tdm_config_controls_header_type[port_idx]; - header_ctrl = - &tdm_config_controls_header[port_idx]; - - if (data_format_ctrl) { - data_format_kcontrol = snd_ctl_new1(data_format_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - data_format_kcontrol); - if (rc < 0) { - dev_err(dai->dev, "%s: err add data format ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (header_type_ctrl) { - header_type_kcontrol = snd_ctl_new1(header_type_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - header_type_kcontrol); - if (rc < 0) { - if (data_format_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - data_format_kcontrol); - dev_err(dai->dev, "%s: err add header type ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (header_ctrl) { - header_kcontrol = snd_ctl_new1(header_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - header_kcontrol); - if (rc < 0) { - if (header_type_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - header_type_kcontrol); - if (data_format_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - data_format_kcontrol); - dev_err(dai->dev, "%s: err add header ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (tdm_dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, - dai->id, (void *)tdm_dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - -rtn: - return rc; -} - - -static int msm_dai_q6_dai_tdm_remove(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *tdm_dai_data = - dev_get_drvdata(dai->dev); - u16 group_id = tdm_dai_data->group_cfg.tdm_cfg.group_id; - int group_idx = 0; - atomic_t *group_ref = NULL; - - group_idx = msm_dai_q6_get_group_idx(dai->id); - if (group_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - return -EINVAL; - } - - group_ref = &tdm_group_ref[group_idx]; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, tdm_dai_data->status_mask)) { - rc = afe_close(dai->id); /* can block */ - if (rc < 0) { - dev_err(dai->dev, "%s: fail to close AFE port 0x%x\n", - __func__, dai->id); - } - atomic_dec(group_ref); - clear_bit(STATUS_PORT_STARTED, - tdm_dai_data->status_mask); - - if (atomic_read(group_ref) == 0) { - rc = afe_port_group_enable(group_id, - NULL, false, NULL); - if (rc < 0) { - dev_err(dai->dev, "fail to disable AFE group 0x%x\n", - group_id); - } - } - - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - rc = msm_dai_q6_tdm_set_clk(tdm_dai_data, - dai->id, false); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE clk 0x%x\n", - __func__, dai->id); - } - } - } - - return 0; -} - -static int msm_dai_q6_tdm_set_tdm_slot(struct snd_soc_dai *dai, - unsigned int tx_mask, - unsigned int rx_mask, - int slots, int slot_width) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - struct afe_param_id_group_device_tdm_cfg *tdm_group = - &dai_data->group_cfg.tdm_cfg; - unsigned int cap_mask; - - dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); - - /* HW only supports 16 and 32 bit slot width configuration */ - if ((slot_width != 16) && (slot_width != 32)) { - dev_err(dai->dev, "%s: invalid slot_width %d\n", - __func__, slot_width); - return -EINVAL; - } - - /* HW supports 1-32 slots configuration. Typical: 1, 2, 4, 8, 16, 32 */ - switch (slots) { - case 1: - cap_mask = 0x01; - break; - case 2: - cap_mask = 0x03; - break; - case 4: - cap_mask = 0x0F; - break; - case 8: - cap_mask = 0xFF; - break; - case 16: - cap_mask = 0xFFFF; - break; - case 32: - cap_mask = 0xFFFFFFFF; - break; - default: - dev_err(dai->dev, "%s: invalid slots %d\n", - __func__, slots); - return -EINVAL; - } - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - tdm_group->nslots_per_frame = slots; - tdm_group->slot_width = slot_width; - tdm_group->slot_mask = rx_mask & cap_mask; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_TX_7: - tdm_group->nslots_per_frame = slots; - tdm_group->slot_width = slot_width; - tdm_group->slot_mask = tx_mask & cap_mask; - break; - default: - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - - return rc; -} - -static int msm_dai_q6_tdm_set_sysclk(struct snd_soc_dai *dai, - int clk_id, unsigned int freq, int dir) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - if ((dai->id >= AFE_PORT_ID_PRIMARY_TDM_RX) && - (dai->id <= AFE_PORT_ID_SENARY_TDM_TX_7)) { - dai_data->clk_set.clk_freq_in_hz = freq; - } else { - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - - dev_dbg(dai->dev, "%s: dai id = 0x%x, group clk_freq = %d\n", - __func__, dai->id, freq); - return 0; -} - -static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - struct afe_param_id_slot_mapping_cfg *slot_mapping = - &dai_data->port_cfg.slot_mapping; - struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = - &dai_data->port_cfg.slot_mapping_v2; - int i = 0; - - dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { - if (!rx_slot) { - dev_err(dai->dev, "%s: rx slot not found\n", - __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { - dev_err(dai->dev, "%s: invalid rx num %d\n", - __func__, - rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) - slot_mapping_v2->offset[i] = rx_slot[i]; - for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; - i++) - slot_mapping_v2->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping_v2->num_channel = rx_num; - } else { - if (!rx_slot) { - dev_err(dai->dev, "%s: rx slot not found\n", - __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid rx num %d\n", - __func__, - rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) - slot_mapping->offset[i] = rx_slot[i]; - for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++) - slot_mapping->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping->num_channel = rx_num; - } - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_TX_7: - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { - if (!tx_slot) { - dev_err(dai->dev, "%s: tx slot not found\n", - __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { - dev_err(dai->dev, "%s: invalid tx num %d\n", - __func__, - tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) - slot_mapping_v2->offset[i] = tx_slot[i]; - for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; - i++) - slot_mapping_v2->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping_v2->num_channel = tx_num; - } else { - if (!tx_slot) { - dev_err(dai->dev, "%s: tx slot not found\n", - __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid tx num %d\n", - __func__, - tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) - slot_mapping->offset[i] = tx_slot[i]; - for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++) - slot_mapping->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping->num_channel = tx_num; - } - break; - default: - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - - return rc; -} - -static unsigned int tdm_param_set_slot_mask(u16 *slot_offset, int slot_width, - int slots_per_frame) -{ - unsigned int i = 0; - unsigned int slot_index = 0; - unsigned long slot_mask = 0; - unsigned int slot_width_bytes = slot_width / 8; - unsigned int channel_count = AFE_PORT_MAX_AUDIO_CHAN_CNT; - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) - channel_count = AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; - - if (slot_width_bytes == 0) { - pr_err("%s: slot width is zero\n", __func__); - return slot_mask; - } - - for (i = 0; i < channel_count; i++) { - if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID) { - slot_index = slot_offset[i] / slot_width_bytes; - if (slot_index < slots_per_frame) - set_bit(slot_index, &slot_mask); - else { - pr_err("%s: invalid slot map setting\n", - __func__); - return 0; - } - } else { - break; - } - } - - return slot_mask; -} - -static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - struct afe_param_id_group_device_tdm_cfg *tdm_group = - &dai_data->group_cfg.tdm_cfg; - struct afe_param_id_tdm_cfg *tdm = - &dai_data->port_cfg.tdm; - struct afe_param_id_slot_mapping_cfg *slot_mapping = - &dai_data->port_cfg.slot_mapping; - struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = - &dai_data->port_cfg.slot_mapping_v2; - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header = - &dai_data->port_cfg.custom_tdm_header; - - pr_debug("%s: dev_name: %s\n", - __func__, dev_name(dai->dev)); - - if ((params_channels(params) == 0) || - (params_channels(params) > 32)) { - dev_err(dai->dev, "%s: invalid param channels %d\n", - __func__, params_channels(params)); - return -EINVAL; - } - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->bitwidth = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->bitwidth = 32; - break; - default: - dev_err(dai->dev, "%s: invalid param format 0x%x\n", - __func__, params_format(params)); - return -EINVAL; - } - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - /* - * update tdm group config param - * NOTE: group config is set to the same as slot config. - */ - tdm_group->bit_width = tdm_group->slot_width; - - /* - * for multi lane scenario - * Total number of active channels = number of active lanes * number of active slots. - */ - if (dai_data->lane_cfg.lane_mask != AFE_LANE_MASK_INVALID) - tdm_group->num_channels = tdm_group->nslots_per_frame - * num_of_bits_set(dai_data->lane_cfg.lane_mask); - else - tdm_group->num_channels = tdm_group->nslots_per_frame; - - tdm_group->sample_rate = dai_data->rate; - - pr_debug("%s: TDM GROUP:\n" - "num_channels=%d sample_rate=%d bit_width=%d\n" - "nslots_per_frame=%d slot_width=%d slot_mask=0x%x\n", - __func__, - tdm_group->num_channels, - tdm_group->sample_rate, - tdm_group->bit_width, - tdm_group->nslots_per_frame, - tdm_group->slot_width, - tdm_group->slot_mask); - pr_debug("%s: TDM GROUP:\n" - "port_id[0]=0x%x port_id[1]=0x%x port_id[2]=0x%x port_id[3]=0x%x\n" - "port_id[4]=0x%x port_id[5]=0x%x port_id[6]=0x%x port_id[7]=0x%x\n", - __func__, - tdm_group->port_id[0], - tdm_group->port_id[1], - tdm_group->port_id[2], - tdm_group->port_id[3], - tdm_group->port_id[4], - tdm_group->port_id[5], - tdm_group->port_id[6], - tdm_group->port_id[7]); - pr_debug("%s: TDM GROUP ID 0x%x lane mask 0x%x:\n", - __func__, - tdm_group->group_id, - dai_data->lane_cfg.lane_mask); - - /* - * update tdm config param - * NOTE: channels/rate/bitwidth are per stream property - */ - tdm->num_channels = dai_data->channels; - tdm->sample_rate = dai_data->rate; - tdm->bit_width = dai_data->bitwidth; - /* - * port slot config is the same as group slot config - * port slot mask should be set according to offset - */ - tdm->nslots_per_frame = tdm_group->nslots_per_frame; - tdm->slot_width = tdm_group->slot_width; - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) - tdm->slot_mask = tdm_param_set_slot_mask( - slot_mapping_v2->offset, - tdm_group->slot_width, - tdm_group->nslots_per_frame); - else - tdm->slot_mask = tdm_param_set_slot_mask(slot_mapping->offset, - tdm_group->slot_width, - tdm_group->nslots_per_frame); - - pr_debug("%s: TDM:\n" - "num_channels=%d sample_rate=%d bit_width=%d\n" - "nslots_per_frame=%d slot_width=%d slot_mask=0x%x\n" - "data_format=0x%x sync_mode=0x%x sync_src=0x%x\n" - "data_out=0x%x invert_sync=0x%x data_delay=0x%x\n", - __func__, - tdm->num_channels, - tdm->sample_rate, - tdm->bit_width, - tdm->nslots_per_frame, - tdm->slot_width, - tdm->slot_mask, - tdm->data_format, - tdm->sync_mode, - tdm->sync_src, - tdm->ctrl_data_out_enable, - tdm->ctrl_invert_sync_pulse, - tdm->ctrl_sync_data_delay); - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { - /* - * update slot mapping v2 config param - * NOTE: channels/rate/bitwidth are per stream property - */ - slot_mapping_v2->bitwidth = dai_data->bitwidth; - - pr_debug("%s: SLOT MAPPING_V2:\n" - "num_channel=%d bitwidth=%d data_align=0x%x\n", - __func__, - slot_mapping_v2->num_channel, - slot_mapping_v2->bitwidth, - slot_mapping_v2->data_align_type); - pr_debug("%s: SLOT MAPPING V2:\n" - "offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n" - "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n" - "offset[8]=0x%x offset[9]=0x%x offset[10]=0x%x offset[11]=0x%x\n" - "offset[12]=0x%x offset[13]=0x%x offset[14]=0x%x offset[15]=0x%x\n" - "offset[16]=0x%x offset[17]=0x%x offset[18]=0x%x offset[19]=0x%x\n" - "offset[20]=0x%x offset[21]=0x%x offset[22]=0x%x offset[23]=0x%x\n" - "offset[24]=0x%x offset[25]=0x%x offset[26]=0x%x offset[27]=0x%x\n" - "offset[28]=0x%x offset[29]=0x%x offset[30]=0x%x offset[31]=0x%x\n", - __func__, - slot_mapping_v2->offset[0], - slot_mapping_v2->offset[1], - slot_mapping_v2->offset[2], - slot_mapping_v2->offset[3], - slot_mapping_v2->offset[4], - slot_mapping_v2->offset[5], - slot_mapping_v2->offset[6], - slot_mapping_v2->offset[7], - slot_mapping_v2->offset[8], - slot_mapping_v2->offset[9], - slot_mapping_v2->offset[10], - slot_mapping_v2->offset[11], - slot_mapping_v2->offset[12], - slot_mapping_v2->offset[13], - slot_mapping_v2->offset[14], - slot_mapping_v2->offset[15], - slot_mapping_v2->offset[16], - slot_mapping_v2->offset[17], - slot_mapping_v2->offset[18], - slot_mapping_v2->offset[19], - slot_mapping_v2->offset[20], - slot_mapping_v2->offset[21], - slot_mapping_v2->offset[22], - slot_mapping_v2->offset[23], - slot_mapping_v2->offset[24], - slot_mapping_v2->offset[25], - slot_mapping_v2->offset[26], - slot_mapping_v2->offset[27], - slot_mapping_v2->offset[28], - slot_mapping_v2->offset[29], - slot_mapping_v2->offset[30], - slot_mapping_v2->offset[31]); - } else { - /* - * update slot mapping config param - * NOTE: channels/rate/bitwidth are per stream property - */ - slot_mapping->bitwidth = dai_data->bitwidth; - - pr_debug("%s: SLOT MAPPING:\n" - "num_channel=%d bitwidth=%d data_align=0x%x\n", - __func__, - slot_mapping->num_channel, - slot_mapping->bitwidth, - slot_mapping->data_align_type); - pr_debug("%s: SLOT MAPPING:\n" - "offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n" - "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n", - __func__, - slot_mapping->offset[0], - slot_mapping->offset[1], - slot_mapping->offset[2], - slot_mapping->offset[3], - slot_mapping->offset[4], - slot_mapping->offset[5], - slot_mapping->offset[6], - slot_mapping->offset[7]); - } - /* - * update custom header config param - * NOTE: channels/rate/bitwidth are per playback stream property. - * custom tdm header only applicable to playback stream. - */ - if (custom_tdm_header->header_type != - AFE_CUSTOM_TDM_HEADER_TYPE_INVALID) { - pr_debug("%s: CUSTOM TDM HEADER:\n" - "start_offset=0x%x header_width=%d\n" - "num_frame_repeat=%d header_type=0x%x\n", - __func__, - custom_tdm_header->start_offset, - custom_tdm_header->header_width, - custom_tdm_header->num_frame_repeat, - custom_tdm_header->header_type); - pr_debug("%s: CUSTOM TDM HEADER:\n" - "header[0]=0x%x header[1]=0x%x header[2]=0x%x header[3]=0x%x\n" - "header[4]=0x%x header[5]=0x%x header[6]=0x%x header[7]=0x%x\n", - __func__, - custom_tdm_header->header[0], - custom_tdm_header->header[1], - custom_tdm_header->header[2], - custom_tdm_header->header[3], - custom_tdm_header->header[4], - custom_tdm_header->header[5], - custom_tdm_header->header[6], - custom_tdm_header->header[7]); - } - - return 0; -} - -static int msm_dai_q6_tdm_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - u16 group_id = dai_data->group_cfg.tdm_cfg.group_id; - int group_idx = 0; - atomic_t *group_ref = NULL; - - dev_dbg(dai->dev, "%s: dev_name: %s dev_id: 0x%x group_id: 0x%x\n", - __func__, dev_name(dai->dev), dai->dev->id, group_id); - - if (dai_data->port_cfg.custom_tdm_header.minor_version == 0) - dev_dbg(dai->dev, - "%s: Custom tdm header not supported\n", __func__); - - group_idx = msm_dai_q6_get_group_idx(dai->id); - if (group_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - return -EINVAL; - } - - mutex_lock(&tdm_mutex); - - group_ref = &tdm_group_ref[group_idx]; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - /* TX and RX share the same clk. So enable the clk - * per TDM interface. */ - rc = msm_dai_q6_tdm_set_clk(dai_data, - dai->id, true); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to enable AFE clk 0x%x\n", - __func__, dai->id); - goto rtn; - } - } - - /* PORT START should be set if prepare called - * in active state. - */ - if (atomic_read(group_ref) == 0) { - /* - * if only one port, don't do group enable as there - * is no group need for only one port - */ - if (dai_data->num_group_ports > 1) { - rc = afe_port_group_enable(group_id, - &dai_data->group_cfg, true, - &dai_data->lane_cfg); - if (rc < 0) { - dev_err(dai->dev, - "%s: fail to enable AFE group 0x%x\n", - __func__, group_id); - goto rtn; - } - } - } - - rc = afe_tdm_port_start(dai->id, &dai_data->port_cfg, - dai_data->rate, dai_data->num_group_ports); - if (rc < 0) { - if (atomic_read(group_ref) == 0) { - afe_port_group_enable(group_id, - NULL, false, NULL); - } - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - msm_dai_q6_tdm_set_clk(dai_data, - dai->id, false); - } - dev_err(dai->dev, "%s: fail to open AFE port 0x%x\n", - __func__, dai->id); - } else { - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - atomic_inc(group_ref); - } - - /* TODO: need to monitor PCM/MI2S/TDM HW status */ - /* NOTE: AFE should error out if HW resource contention */ - - } - -rtn: - mutex_unlock(&tdm_mutex); - return rc; -} - -static void msm_dai_q6_tdm_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - u16 group_id = dai_data->group_cfg.tdm_cfg.group_id; - int group_idx = 0; - atomic_t *group_ref = NULL; - - group_idx = msm_dai_q6_get_group_idx(dai->id); - if (group_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - return; - } - - mutex_lock(&tdm_mutex); - - group_ref = &tdm_group_ref[group_idx]; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(dai->id); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to close AFE port 0x%x\n", - __func__, dai->id); - } - atomic_dec(group_ref); - clear_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - - if (atomic_read(group_ref) == 0) { - rc = afe_port_group_enable(group_id, - NULL, false, NULL); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE group 0x%x\n", - __func__, group_id); - } - } - - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - rc = msm_dai_q6_tdm_set_clk(dai_data, - dai->id, false); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE clk 0x%x\n", - __func__, dai->id); - } - } - - /* TODO: need to monitor PCM/MI2S/TDM HW status */ - /* NOTE: AFE should error out if HW resource contention */ - - } - - mutex_unlock(&tdm_mutex); -} - -static struct snd_soc_dai_ops msm_dai_q6_tdm_ops = { - .prepare = msm_dai_q6_tdm_prepare, - .hw_params = msm_dai_q6_tdm_hw_params, - .set_tdm_slot = msm_dai_q6_tdm_set_tdm_slot, - .set_channel_map = msm_dai_q6_tdm_set_channel_map, - .set_sysclk = msm_dai_q6_tdm_set_sysclk, - .shutdown = msm_dai_q6_tdm_shutdown, -}; - -static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { - { - .playback = { - .stream_name = "Primary TDM0 Playback", - .aif_name = "PRI_TDM_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM1 Playback", - .aif_name = "PRI_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM2 Playback", - .aif_name = "PRI_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM3 Playback", - .aif_name = "PRI_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM4 Playback", - .aif_name = "PRI_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM5 Playback", - .aif_name = "PRI_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM6 Playback", - .aif_name = "PRI_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM7 Playback", - .aif_name = "PRI_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM0 Capture", - .aif_name = "PRI_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM1 Capture", - .aif_name = "PRI_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM2 Capture", - .aif_name = "PRI_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM3 Capture", - .aif_name = "PRI_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM4 Capture", - .aif_name = "PRI_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM5 Capture", - .aif_name = "PRI_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM6 Capture", - .aif_name = "PRI_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM7 Capture", - .aif_name = "PRI_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM0 Playback", - .aif_name = "SEC_TDM_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM1 Playback", - .aif_name = "SEC_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM2 Playback", - .aif_name = "SEC_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM3 Playback", - .aif_name = "SEC_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM4 Playback", - .aif_name = "SEC_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM5 Playback", - .aif_name = "SEC_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM6 Playback", - .aif_name = "SEC_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM7 Playback", - .aif_name = "SEC_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM0 Capture", - .aif_name = "SEC_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM1 Capture", - .aif_name = "SEC_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM2 Capture", - .aif_name = "SEC_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM3 Capture", - .aif_name = "SEC_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM4 Capture", - .aif_name = "SEC_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM5 Capture", - .aif_name = "SEC_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM6 Capture", - .aif_name = "SEC_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM7 Capture", - .aif_name = "SEC_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM0 Playback", - .aif_name = "TERT_TDM_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM1 Playback", - .aif_name = "TERT_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM2 Playback", - .aif_name = "TERT_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM3 Playback", - .aif_name = "TERT_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM4 Playback", - .aif_name = "TERT_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM5 Playback", - .aif_name = "TERT_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM6 Playback", - .aif_name = "TERT_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM7 Playback", - .aif_name = "TERT_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM0 Capture", - .aif_name = "TERT_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM1 Capture", - .aif_name = "TERT_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM2 Capture", - .aif_name = "TERT_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM3 Capture", - .aif_name = "TERT_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM4 Capture", - .aif_name = "TERT_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM5 Capture", - .aif_name = "TERT_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM6 Capture", - .aif_name = "TERT_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM7 Capture", - .aif_name = "TERT_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM0 Playback", - .aif_name = "QUAT_TDM_RX_0", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM1 Playback", - .aif_name = "QUAT_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM2 Playback", - .aif_name = "QUAT_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM3 Playback", - .aif_name = "QUAT_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM4 Playback", - .aif_name = "QUAT_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM5 Playback", - .aif_name = "QUAT_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM6 Playback", - .aif_name = "QUAT_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM7 Playback", - .aif_name = "QUAT_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM0 Capture", - .aif_name = "QUAT_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM1 Capture", - .aif_name = "QUAT_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM2 Capture", - .aif_name = "QUAT_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM3 Capture", - .aif_name = "QUAT_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM4 Capture", - .aif_name = "QUAT_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM5 Capture", - .aif_name = "QUAT_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM6 Capture", - .aif_name = "QUAT_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM7 Capture", - .aif_name = "QUAT_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM0 Playback", - .aif_name = "QUIN_TDM_RX_0", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM1 Playback", - .aif_name = "QUIN_TDM_RX_1", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM2 Playback", - .aif_name = "QUIN_TDM_RX_2", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM3 Playback", - .aif_name = "QUIN_TDM_RX_3", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM4 Playback", - .aif_name = "QUIN_TDM_RX_4", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM5 Playback", - .aif_name = "QUIN_TDM_RX_5", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM6 Playback", - .aif_name = "QUIN_TDM_RX_6", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM7 Playback", - .aif_name = "QUIN_TDM_RX_7", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM0 Capture", - .aif_name = "QUIN_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM1 Capture", - .aif_name = "QUIN_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM2 Capture", - .aif_name = "QUIN_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM3 Capture", - .aif_name = "QUIN_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM4 Capture", - .aif_name = "QUIN_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM5 Capture", - .aif_name = "QUIN_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM6 Capture", - .aif_name = "QUIN_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM7 Capture", - .aif_name = "QUIN_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM0 Playback", - .aif_name = "SEN_TDM_RX_0", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM1 Playback", - .aif_name = "SEN_TDM_RX_1", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM2 Playback", - .aif_name = "SEN_TDM_RX_2", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM3 Playback", - .aif_name = "SEN_TDM_RX_3", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM4 Playback", - .aif_name = "SEN_TDM_RX_4", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM5 Playback", - .aif_name = "SEN_TDM_RX_5", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM6 Playback", - .aif_name = "SEN_TDM_RX_6", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Senary TDM7 Playback", - .aif_name = "SEN_TDM_RX_7", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM0 Capture", - .aif_name = "SEN_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM1 Capture", - .aif_name = "SEN_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM2 Capture", - .aif_name = "SEN_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM3 Capture", - .aif_name = "SEN_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM4 Capture", - .aif_name = "SEN_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM5 Capture", - .aif_name = "SEN_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM6 Capture", - .aif_name = "SEN_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Senary TDM7 Capture", - .aif_name = "SEN_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEN_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SENARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, -}; - -static const struct snd_soc_component_driver msm_q6_tdm_dai_component = { - .name = "msm-dai-q6-tdm", -}; - -static int msm_dai_q6_tdm_dev_probe(struct platform_device *pdev) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = NULL; - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header = NULL; - int rc = 0; - u32 tdm_dev_id = 0; - int port_idx = 0; - struct device_node *tdm_parent_node = NULL; - - /* retrieve device/afe id */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-dev-id", - &tdm_dev_id); - if (rc) { - dev_err(&pdev->dev, "%s: Device ID missing in DT file\n", - __func__); - goto rtn; - } - if ((tdm_dev_id < AFE_PORT_ID_TDM_PORT_RANGE_START) || - (tdm_dev_id > AFE_PORT_ID_TDM_PORT_RANGE_END)) { - dev_err(&pdev->dev, "%s: Invalid TDM Device ID 0x%x in DT file\n", - __func__, tdm_dev_id); - rc = -ENXIO; - goto rtn; - } - pdev->id = tdm_dev_id; - - dai_data = kzalloc(sizeof(struct msm_dai_q6_tdm_dai_data), - GFP_KERNEL); - if (!dai_data) { - rc = -ENOMEM; - dev_err(&pdev->dev, - "%s Failed to allocate memory for tdm dai_data\n", - __func__); - goto rtn; - } - memset(dai_data, 0, sizeof(*dai_data)); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - /* TDM CFG */ - tdm_parent_node = of_get_parent(pdev->dev.of_node); - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-sync-mode", - (u32 *)&dai_data->port_cfg.tdm.sync_mode); - if (rc) { - dev_err(&pdev->dev, "%s: Sync Mode from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-sync-mode"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Sync Mode from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.sync_mode); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-sync-src", - (u32 *)&dai_data->port_cfg.tdm.sync_src); - if (rc) { - dev_err(&pdev->dev, "%s: Sync Src from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-sync-src"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Sync Src from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.sync_src); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-data-out", - (u32 *)&dai_data->port_cfg.tdm.ctrl_data_out_enable); - if (rc) { - dev_err(&pdev->dev, "%s: Data Out from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-data-out"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Data Out from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.ctrl_data_out_enable); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-invert-sync", - (u32 *)&dai_data->port_cfg.tdm.ctrl_invert_sync_pulse); - if (rc) { - dev_err(&pdev->dev, "%s: Invert Sync from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-invert-sync"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Invert Sync from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.ctrl_invert_sync_pulse); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-data-delay", - (u32 *)&dai_data->port_cfg.tdm.ctrl_sync_data_delay); - if (rc) { - dev_err(&pdev->dev, "%s: Data Delay from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-data-delay"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Data Delay from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.ctrl_sync_data_delay); - - /* TDM CFG -- set default */ - dai_data->port_cfg.tdm.data_format = AFE_LINEAR_PCM_DATA; - dai_data->port_cfg.tdm.tdm_cfg_minor_version = - AFE_API_VERSION_TDM_CONFIG; - - /* TDM SLOT MAPPING CFG */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-data-align", - &dai_data->port_cfg.slot_mapping.data_align_type); - if (rc) { - dev_err(&pdev->dev, "%s: Data Align from DT file %s\n", - __func__, - "qcom,msm-cpudai-tdm-data-align"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Data Align from DT file 0x%x\n", - __func__, dai_data->port_cfg.slot_mapping.data_align_type); - - /* TDM SLOT MAPPING CFG -- set default */ - dai_data->port_cfg.slot_mapping.minor_version = - AFE_API_VERSION_SLOT_MAPPING_CONFIG; - dai_data->port_cfg.slot_mapping_v2.minor_version = - AFE_API_VERSION_SLOT_MAPPING_CONFIG_V2; - - /* CUSTOM TDM HEADER CFG */ - custom_tdm_header = &dai_data->port_cfg.custom_tdm_header; - if (of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-start-offset", NULL) && - of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-width", NULL) && - of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-num-frame-repeat", NULL)) { - /* if the property exist */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-start-offset", - (u32 *)&custom_tdm_header->start_offset); - if (rc) { - dev_err(&pdev->dev, "%s: Header Start Offset from DT file %s\n", - __func__, - "qcom,msm-cpudai-tdm-header-start-offset"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Header Start Offset from DT file 0x%x\n", - __func__, custom_tdm_header->start_offset); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-width", - (u32 *)&custom_tdm_header->header_width); - if (rc) { - dev_err(&pdev->dev, "%s: Header Width from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-header-width"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Header Width from DT file 0x%x\n", - __func__, custom_tdm_header->header_width); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-num-frame-repeat", - (u32 *)&custom_tdm_header->num_frame_repeat); - if (rc) { - dev_err(&pdev->dev, "%s: Header Num Frame Repeat from DT file %s\n", - __func__, - "qcom,msm-cpudai-tdm-header-num-frame-repeat"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Header Num Frame Repeat from DT file 0x%x\n", - __func__, custom_tdm_header->num_frame_repeat); - - /* CUSTOM TDM HEADER CFG -- set default */ - custom_tdm_header->minor_version = - AFE_API_VERSION_CUSTOM_TDM_HEADER_CONFIG; - custom_tdm_header->header_type = - AFE_CUSTOM_TDM_HEADER_TYPE_INVALID; - } else { - /* CUSTOM TDM HEADER CFG -- set default */ - custom_tdm_header->header_type = - AFE_CUSTOM_TDM_HEADER_TYPE_INVALID; - /* proceed with probe */ - } - - /* copy static clk per parent node */ - dai_data->clk_set = tdm_clk_set; - /* copy static group cfg per parent node */ - dai_data->group_cfg.tdm_cfg = tdm_group_cfg; - /* copy static num group ports per parent node */ - dai_data->num_group_ports = num_tdm_group_ports; - dai_data->lane_cfg = tdm_lane_cfg; - - dev_set_drvdata(&pdev->dev, dai_data); - - port_idx = msm_dai_q6_get_port_idx(tdm_dev_id); - if (port_idx < 0) { - dev_err(&pdev->dev, "%s Port id 0x%x not supported\n", - __func__, tdm_dev_id); - rc = -EINVAL; - goto free_dai_data; - } - - rc = snd_soc_register_component(&pdev->dev, - &msm_q6_tdm_dai_component, - &msm_dai_q6_tdm_dai[port_idx], 1); - - if (rc) { - dev_err(&pdev->dev, "%s: TDM dai 0x%x register failed, rc=%d\n", - __func__, tdm_dev_id, rc); - goto err_register; - } - - return 0; - -err_register: -free_dai_data: - kfree(dai_data); -rtn: - return rc; -} - -static int msm_dai_q6_tdm_dev_remove(struct platform_device *pdev) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(&pdev->dev); - - snd_soc_unregister_component(&pdev->dev); - - kfree(dai_data); - - return 0; -} - -static const struct of_device_id msm_dai_q6_tdm_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-q6-tdm", }, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_dai_q6_tdm_dev_dt_match); - -static struct platform_driver msm_dai_q6_tdm_driver = { - .probe = msm_dai_q6_tdm_dev_probe, - .remove = msm_dai_q6_tdm_dev_remove, - .driver = { - .name = "msm-dai-q6-tdm", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_tdm_dev_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int msm_dai_q6_cdc_dma_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_config.cdc_dma.data_format = value; - pr_debug("%s: format = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_cdc_dma_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_config.cdc_dma.data_format; - return 0; -} - -static const struct snd_kcontrol_new cdc_dma_config_controls[] = { - SOC_ENUM_EXT("WSA_CDC_DMA_0 TX Format", cdc_dma_config_enum[0], - msm_dai_q6_cdc_dma_format_get, - msm_dai_q6_cdc_dma_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_0 RX XTLoggingDisable", - xt_logging_disable_enum[0], - msm_dai_q6_cdc_dma_xt_logging_disable_get, - msm_dai_q6_cdc_dma_xt_logging_disable_put), -}; - -/* SOC probe for codec DMA interface */ -static int msm_dai_q6_dai_cdc_dma_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = NULL; - int rc = 0; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - msm_dai_q6_set_dai_id(dai); - dai_data = dev_get_drvdata(dai->dev); - - switch (dai->id) { - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&cdc_dma_config_controls[0], - dai_data)); - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&cdc_dma_config_controls[1], - dai_data)); - break; - default: - break; - } - - if (rc < 0) - dev_err(dai->dev, "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - if (dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai->id, - (void *)dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static int msm_dai_q6_dai_cdc_dma_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - int rc = 0; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - dev_dbg(dai->dev, "%s: stop codec dma port:%d\n", __func__, - dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - return rc; -} - -static int msm_dai_q6_cdc_dma_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num_ch, unsigned int *tx_ch_mask, - unsigned int rx_num_ch, unsigned int *rx_ch_mask) - -{ - int rc = 0; - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - unsigned int ch_mask = 0, ch_num = 0; - - dev_dbg(dai->dev, "%s: id = %d\n", __func__, dai->id); - switch (dai->id) { - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - if (!rx_ch_mask) { - dev_err(dai->dev, "%s: invalid rx ch mask\n", __func__); - return -EINVAL; - } - if (rx_num_ch > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid rx_num_ch %d\n", - __func__, rx_num_ch); - return -EINVAL; - } - ch_mask = *rx_ch_mask; - ch_num = rx_num_ch; - break; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - if (!tx_ch_mask) { - dev_err(dai->dev, "%s: invalid tx ch mask\n", __func__); - return -EINVAL; - } - if (tx_num_ch > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid tx_num_ch %d\n", - __func__, tx_num_ch); - return -EINVAL; - } - ch_mask = *tx_ch_mask; - ch_num = tx_num_ch; - break; - default: - dev_err(dai->dev, "%s: invalid dai id %d\n", __func__, dai->id); - return -EINVAL; - } - - dai_data->port_config.cdc_dma.active_channels_mask = ch_mask; - dev_dbg(dai->dev, "%s: CDC_DMA_%d_ch cnt[%d] ch mask[0x%x]\n", __func__, - dai->id, ch_num, ch_mask); - return rc; -} - -static int msm_dai_q6_cdc_dma_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.cdc_dma.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.cdc_dma.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.cdc_dma.bit_width = 32; - break; - default: - dev_err(dai->dev, "%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->channels = params_channels(params); - - dai_data->port_config.cdc_dma.cdc_dma_cfg_minor_version = - AFE_API_VERSION_CODEC_DMA_CONFIG; - dai_data->port_config.cdc_dma.sample_rate = dai_data->rate; - dai_data->port_config.cdc_dma.num_channels = dai_data->channels; - dev_dbg(dai->dev, "%s: bit_wd[%hu] format[%hu]\n" - "num_channel %hu sample_rate %d\n", __func__, - dai_data->port_config.cdc_dma.bit_width, - dai_data->port_config.cdc_dma.data_format, - dai_data->port_config.cdc_dma.num_channels, - dai_data->rate); - - return 0; -} - -static int msm_dai_q6_cdc_dma_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if ((dai->id == AFE_PORT_ID_WSA_CODEC_DMA_TX_0) && - (dai_data->port_config.cdc_dma.data_format == 1)) - dai_data->port_config.cdc_dma.data_format = - AFE_LINEAR_PCM_DATA_PACKED_16BIT; - - rc = afe_port_start(dai->id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - return rc; -} - - -static void msm_dai_q6_cdc_dma_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - dev_dbg(dai->dev, "%s: stop AFE port:%d\n", __func__, - dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - dev_dbg(dai->dev, "%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); -} - -static struct snd_soc_dai_ops msm_dai_q6_cdc_dma_ops = { - .prepare = msm_dai_q6_cdc_dma_prepare, - .hw_params = msm_dai_q6_cdc_dma_hw_params, - .shutdown = msm_dai_q6_cdc_dma_shutdown, - .set_channel_map = msm_dai_q6_cdc_dma_set_channel_map, -}; - -static struct snd_soc_dai_ops msm_dai_q6_cdc_wsa_dma_ops = { - .prepare = msm_dai_q6_cdc_dma_prepare, - .hw_params = msm_dai_q6_cdc_dma_hw_params, - .shutdown = msm_dai_q6_cdc_dma_shutdown, - .set_channel_map = msm_dai_q6_cdc_dma_set_channel_map, - .digital_mute = msm_dai_q6_spk_digital_mute, -}; - -static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { - { - .playback = { - .stream_name = "WSA CDC DMA0 Playback", - .aif_name = "WSA_CDC_DMA_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_RX_0", - .ops = &msm_dai_q6_cdc_wsa_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_RX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "WSA CDC DMA0 Capture", - .aif_name = "WSA_CDC_DMA_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_TX_0", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "WSA CDC DMA1 Playback", - .aif_name = "WSA_CDC_DMA_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_RX_1", - .ops = &msm_dai_q6_cdc_wsa_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_RX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "WSA CDC DMA1 Capture", - .aif_name = "WSA_CDC_DMA_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_TX_1", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "WSA CDC DMA2 Capture", - .aif_name = "WSA_CDC_DMA_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_TX_2", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "VA CDC DMA0 Capture", - .aif_name = "VA_CDC_DMA_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "VA_CDC_DMA_TX_0", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_VA_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "VA CDC DMA1 Capture", - .aif_name = "VA_CDC_DMA_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "VA_CDC_DMA_TX_1", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_VA_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "VA CDC DMA2 Capture", - .aif_name = "VA_CDC_DMA_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "VA_CDC_DMA_TX_2", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_VA_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA0 Playback", - .aif_name = "RX_CDC_DMA_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA0 Capture", - .aif_name = "TX_CDC_DMA_TX_0", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 3, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA1 Playback", - .aif_name = "RX_CDC_DMA_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA1 Capture", - .aif_name = "TX_CDC_DMA_TX_1", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 3, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA2 Playback", - .aif_name = "RX_CDC_DMA_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA2 Capture", - .aif_name = "TX_CDC_DMA_TX_2", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, { - .playback = { - .stream_name = "RX CDC DMA3 Playback", - .aif_name = "RX_CDC_DMA_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_3, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA3 Capture", - .aif_name = "TX_CDC_DMA_TX_3", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_3, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA4 Playback", - .aif_name = "RX_CDC_DMA_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 6, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_4, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA4 Capture", - .aif_name = "TX_CDC_DMA_TX_4", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_4, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA5 Playback", - .aif_name = "RX_CDC_DMA_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_5, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA5 Capture", - .aif_name = "TX_CDC_DMA_TX_5", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_5, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA6 Playback", - .aif_name = "RX_CDC_DMA_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_6, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA7 Playback", - .aif_name = "RX_CDC_DMA_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_7, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, -}; - -static const struct snd_soc_component_driver msm_q6_cdc_dma_dai_component = { - .name = "msm-dai-cdc-dma-dev", -}; - -/* DT related probe for each codec DMA interface device */ -static int msm_dai_q6_cdc_dma_dev_probe(struct platform_device *pdev) -{ - const char *q6_cdc_dma_dev_id = "qcom,msm-dai-cdc-dma-dev-id"; - u32 cdc_dma_id = 0; - int i; - int rc = 0; - struct msm_dai_q6_cdc_dma_dai_data *dai_data = NULL; - - rc = of_property_read_u32(pdev->dev.of_node, q6_cdc_dma_dev_id, - &cdc_dma_id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing 0x%x in dt node\n", __func__, cdc_dma_id); - return rc; - } - - dev_dbg(&pdev->dev, "%s: dev name %s dev id 0x%x\n", __func__, - dev_name(&pdev->dev), cdc_dma_id); - - pdev->id = cdc_dma_id; - - dai_data = devm_kzalloc(&pdev->dev, - sizeof(struct msm_dai_q6_cdc_dma_dai_data), - GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - dev_set_drvdata(&pdev->dev, dai_data); - - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_cdc_dma_dai); i++) { - if (msm_dai_q6_cdc_dma_dai[i].id == cdc_dma_id) { - return snd_soc_register_component(&pdev->dev, - &msm_q6_cdc_dma_dai_component, - &msm_dai_q6_cdc_dma_dai[i], 1); - } - } - return -ENODEV; -} - -static int msm_dai_q6_cdc_dma_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_cdc_dma_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-cdc-dma-dev", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_q6_cdc_dma_dev_dt_match); - -static struct platform_driver msm_dai_q6_cdc_dma_driver = { - .probe = msm_dai_q6_cdc_dma_dev_probe, - .remove = msm_dai_q6_cdc_dma_dev_remove, - .driver = { - .name = "msm-dai-cdc-dma-dev", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_cdc_dma_dev_dt_match, - .suppress_bind_attrs = true, - }, -}; - -/* DT related probe for codec DMA interface device group */ -static int msm_dai_cdc_dma_q6_probe(struct platform_device *pdev) -{ - int rc; - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - return rc; -} - -static int msm_dai_cdc_dma_q6_remove(struct platform_device *pdev) -{ - of_platform_depopulate(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_cdc_dma_dt_match[] = { - { .compatible = "qcom,msm-dai-cdc-dma", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_cdc_dma_dt_match); - -static struct platform_driver msm_dai_cdc_dma_q6 = { - .probe = msm_dai_cdc_dma_q6_probe, - .remove = msm_dai_cdc_dma_q6_remove, - .driver = { - .name = "msm-dai-cdc-dma", - .owner = THIS_MODULE, - .of_match_table = msm_dai_cdc_dma_dt_match, - .suppress_bind_attrs = true, - }, -}; - -int __init msm_dai_q6_init(void) -{ - int rc; - - rc = platform_driver_register(&msm_auxpcm_dev_driver); - if (rc) { - pr_err("%s: fail to register auxpcm dev driver", __func__); - goto fail; - } - - rc = platform_driver_register(&msm_dai_q6); - if (rc) { - pr_err("%s: fail to register dai q6 driver", __func__); - goto dai_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_dev); - if (rc) { - pr_err("%s: fail to register dai q6 dev driver", __func__); - goto dai_q6_dev_fail; - } - - rc = platform_driver_register(&msm_dai_q6_mi2s_driver); - if (rc) { - pr_err("%s: fail to register dai MI2S dev drv\n", __func__); - goto dai_q6_mi2s_drv_fail; - } - - rc = platform_driver_register(&msm_dai_q6_meta_mi2s_driver); - if (rc) { - pr_err("%s: fail to register dai META MI2S dev drv\n", - __func__); - goto dai_q6_meta_mi2s_drv_fail; - } - - rc = platform_driver_register(&msm_dai_mi2s_q6); - if (rc) { - pr_err("%s: fail to register dai MI2S\n", __func__); - goto dai_mi2s_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_spdif_driver); - if (rc) { - pr_err("%s: fail to register dai SPDIF\n", __func__); - goto dai_spdif_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_tdm_driver); - if (rc) { - pr_err("%s: fail to register dai TDM dev drv\n", __func__); - goto dai_q6_tdm_drv_fail; - } - - rc = platform_driver_register(&msm_dai_tdm_q6); - if (rc) { - pr_err("%s: fail to register dai TDM\n", __func__); - goto dai_tdm_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_cdc_dma_driver); - if (rc) { - pr_err("%s: fail to register dai CDC DMA dev\n", __func__); - goto dai_cdc_dma_q6_dev_fail; - } - - - rc = platform_driver_register(&msm_dai_cdc_dma_q6); - if (rc) { - pr_err("%s: fail to register dai CDC DMA\n", __func__); - goto dai_cdc_dma_q6_fail; - } - return rc; - -dai_cdc_dma_q6_fail: - platform_driver_unregister(&msm_dai_q6_cdc_dma_driver); -dai_cdc_dma_q6_dev_fail: - platform_driver_unregister(&msm_dai_tdm_q6); -dai_tdm_q6_fail: - platform_driver_unregister(&msm_dai_q6_tdm_driver); -dai_q6_tdm_drv_fail: - platform_driver_unregister(&msm_dai_q6_spdif_driver); -dai_spdif_q6_fail: - platform_driver_unregister(&msm_dai_mi2s_q6); -dai_mi2s_q6_fail: - platform_driver_unregister(&msm_dai_q6_meta_mi2s_driver); -dai_q6_meta_mi2s_drv_fail: - platform_driver_unregister(&msm_dai_q6_mi2s_driver); -dai_q6_mi2s_drv_fail: - platform_driver_unregister(&msm_dai_q6_dev); -dai_q6_dev_fail: - platform_driver_unregister(&msm_dai_q6); -dai_q6_fail: - platform_driver_unregister(&msm_auxpcm_dev_driver); -fail: - return rc; -} - -void msm_dai_q6_exit(void) -{ - platform_driver_unregister(&msm_dai_cdc_dma_q6); - platform_driver_unregister(&msm_dai_q6_cdc_dma_driver); - platform_driver_unregister(&msm_dai_tdm_q6); - platform_driver_unregister(&msm_dai_q6_tdm_driver); - platform_driver_unregister(&msm_dai_q6_spdif_driver); - platform_driver_unregister(&msm_dai_mi2s_q6); - platform_driver_unregister(&msm_dai_q6_meta_mi2s_driver); - platform_driver_unregister(&msm_dai_q6_mi2s_driver); - platform_driver_unregister(&msm_dai_q6_dev); - platform_driver_unregister(&msm_dai_q6); - platform_driver_unregister(&msm_auxpcm_dev_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM DSP DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-dai-q6-v2.h b/techpack/audio/4.0/asoc/msm-dai-q6-v2.h deleted file mode 100644 index 3ad049d96185..000000000000 --- a/techpack/audio/4.0/asoc/msm-dai-q6-v2.h +++ /dev/null @@ -1,104 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2012-2017, 2019 The Linux Foundation. All rights reserved. - */ - -#ifndef __MSM_DAI_Q6_PDATA_H__ - -#define __MSM_DAI_Q6_PDATA_H__ - -#define MSM_MI2S_SD0 (1 << 0) -#define MSM_MI2S_SD1 (1 << 1) -#define MSM_MI2S_SD2 (1 << 2) -#define MSM_MI2S_SD3 (1 << 3) -#define MSM_MI2S_SD4 (1 << 4) -#define MSM_MI2S_SD5 (1 << 5) -#define MSM_MI2S_SD6 (1 << 6) -#define MSM_MI2S_SD7 (1 << 7) - -#define MSM_MI2S_CAP_RX 0 -#define MSM_MI2S_CAP_TX 1 - -#define MSM_PRIM_MI2S 0 -#define MSM_SEC_MI2S 1 -#define MSM_TERT_MI2S 2 -#define MSM_QUAT_MI2S 3 -#define MSM_QUIN_MI2S 4 -#define MSM_SENARY_MI2S 5 -#define MSM_SEC_MI2S_SD1 6 -#define MSM_INT0_MI2S 7 -#define MSM_INT1_MI2S 8 -#define MSM_INT2_MI2S 9 -#define MSM_INT3_MI2S 10 -#define MSM_INT4_MI2S 11 -#define MSM_INT5_MI2S 12 -#define MSM_INT6_MI2S 13 -#define MSM_MI2S_MIN MSM_PRIM_MI2S -#define MSM_MI2S_MAX MSM_INT6_MI2S - -#define MSM_DISPLAY_PORT 0 -#define MSM_DISPLAY_PORT1 1 - -#define MSM_PRIM_META_MI2S 0 -#define MSM_SEC_META_MI2S 1 -#define MSM_META_MI2S_MIN MSM_PRIM_META_MI2S -#define MSM_META_MI2S_MAX MSM_SEC_META_MI2S - -struct msm_dai_auxpcm_config { - u16 mode; - u16 sync; - u16 frame; - u16 quant; - u16 num_slots; - u16 *slot_mapping; - u16 data; - u32 pcm_clk_rate; -}; - -struct msm_dai_auxpcm_pdata { - struct msm_dai_auxpcm_config mode_8k; - struct msm_dai_auxpcm_config mode_16k; -}; - -struct msm_mi2s_pdata { - u16 rx_sd_lines; - u16 tx_sd_lines; - u16 intf_id; -}; - -struct msm_meta_mi2s_pdata { - u32 num_member_ports; - u32 member_port[MAX_NUM_I2S_META_PORT_MEMBER_PORTS]; - u32 sd_lines[MAX_NUM_I2S_META_PORT_MEMBER_PORTS]; - u16 intf_id; -}; - -struct msm_i2s_data { - u32 capability; /* RX or TX */ - u16 sd_lines; -}; - -struct msm_dai_tdm_group_config { - u16 group_id; - u16 num_ports; - u16 *port_id; - u32 clk_rate; -}; - -struct msm_dai_tdm_config { - u16 sync_mode; - u16 sync_src; - u16 data_out; - u16 invert_sync; - u16 data_delay; - u32 data_align; - u16 header_start_offset; - u16 header_width; - u16 header_num_frame_repeat; -}; - -struct msm_dai_tdm_pdata { - struct msm_dai_tdm_group_config group_config; - struct msm_dai_tdm_config config; -}; - -#endif diff --git a/techpack/audio/4.0/asoc/msm-dai-slim.c b/techpack/audio/4.0/asoc/msm-dai-slim.c deleted file mode 100644 index 545590fa3735..000000000000 --- a/techpack/audio/4.0/asoc/msm-dai-slim.c +++ /dev/null @@ -1,655 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-slim-dma.h" - -#define SLIM_DEV_NAME "msm-dai-slim" - -#define SLIM_DAI_RATES (SNDRV_PCM_RATE_48000 | \ - SNDRV_PCM_RATE_8000 | \ - SNDRV_PCM_RATE_16000 | \ - SNDRV_PCM_RATE_96000 | \ - SNDRV_PCM_RATE_192000 | \ - SNDRV_PCM_RATE_384000) - -#define SLIM_DAI_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -#define DAI_STATE_INITIALIZED (0x01 << 0) -#define DAI_STATE_PREPARED (0x01 << 1) -#define DAI_STATE_RUNNING (0x01 << 2) - -#define SET_DAI_STATE(status, state) \ - (status |= state) - -#define CLR_DAI_STATE(status, state) \ - (status = status & (~state)) - -enum { - MSM_DAI_SLIM0 = 0, - NUM_SLIM_DAIS, -}; - -struct msm_slim_dai_data { - unsigned int dai_id; - u16 *chan_h; - u16 *sh_ch; - u16 grph; - u32 rate; - u16 bits; - u16 ch_cnt; - u8 status; - struct snd_soc_dai_driver *dai_drv; - struct msm_slim_dma_data dma_data; - struct slim_port_cfg port_cfg; -}; - -struct msm_dai_slim_drv_data { - struct slim_device *sdev; - u16 num_dais; - struct msm_slim_dai_data slim_dai_data[NUM_SLIM_DAIS]; -}; - -struct msm_slim_dai_data *msm_slim_get_dai_data( - struct msm_dai_slim_drv_data *drv_data, - struct snd_soc_dai *dai) -{ - struct msm_slim_dai_data *dai_data_t; - int i; - - for (i = 0; i < drv_data->num_dais; i++) { - dai_data_t = &drv_data->slim_dai_data[i]; - if (dai_data_t->dai_id == dai->id) - return dai_data_t; - } - - dev_err(dai->dev, - "%s: no dai data found for dai_id %d\n", - __func__, dai->id); - return NULL; -} - -static int msm_dai_slim_ch_ctl(struct msm_slim_dma_data *dma_data, - struct snd_soc_dai *dai, bool enable) -{ - struct slim_device *sdev; - struct msm_dai_slim_drv_data *drv_data; - struct msm_slim_dai_data *dai_data; - int rc, rc1, i; - - if (!dma_data || !dma_data->sdev) { - pr_err("%s: Invalid %s\n", __func__, - (!dma_data) ? "dma_data" : "slim_device"); - return -EINVAL; - } - - sdev = dma_data->sdev; - drv_data = dev_get_drvdata(&sdev->dev); - dai_data = msm_slim_get_dai_data(drv_data, dai); - - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai_id %d\n", - __func__, dai->id); - return -EINVAL; - } - - dev_dbg(&sdev->dev, - "%s: enable = %s, rate = %u\n", __func__, - enable ? "true" : "false", - dai_data->rate); - - if (enable) { - if (!(dai_data->status & DAI_STATE_PREPARED)) { - dev_err(&sdev->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return -EINVAL; - } - - rc = slim_alloc_mgrports(sdev, - SLIM_REQ_DEFAULT, dai_data->ch_cnt, - &(dma_data->ph), - sizeof(dma_data->ph)); - if (rc < 0) { - dev_err(&sdev->dev, - "%s:alloc mgrport failed rc %d\n", - __func__, rc); - goto done; - } - - rc = slim_config_mgrports(sdev, &(dma_data->ph), - dai_data->ch_cnt, - &(dai_data->port_cfg)); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: config mgrport failed rc %d\n", - __func__, rc); - goto err_done; - } - - for (i = 0; i < dai_data->ch_cnt; i++) { - rc = slim_connect_sink(sdev, - &dma_data->ph, 1, - dai_data->chan_h[i]); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: slim_connect_sink failed, ch = %d, err = %d\n", - __func__, i, rc); - goto err_done; - } - } - - rc = slim_control_ch(sdev, - dai_data->grph, - SLIM_CH_ACTIVATE, true); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: slim activate ch failed, err = %d\n", - __func__, rc); - goto err_done; - } - /* Mark dai status as running */ - SET_DAI_STATE(dai_data->status, DAI_STATE_RUNNING); - } else { - if (!(dai_data->status & DAI_STATE_RUNNING)) { - dev_err(&sdev->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return -EINVAL; - } - - rc = slim_control_ch(sdev, - dai_data->grph, - SLIM_CH_REMOVE, true); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: slim activate ch failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = slim_dealloc_mgrports(sdev, - &dma_data->ph, 1); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: dealloc mgrport failed, err = %d\n", - __func__, rc); - goto done; - } - /* clear running state for dai*/ - CLR_DAI_STATE(dai_data->status, DAI_STATE_RUNNING); - } - - return rc; - -err_done: - rc1 = slim_dealloc_mgrports(sdev, - &dma_data->ph, 1); - if (rc1 < 0) - dev_err(&sdev->dev, - "%s: dealloc mgrport failed, err = %d\n", - __func__, rc1); -done: - return rc; -} - -static int msm_dai_slim_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dai_data *dai_data; - int rc = 0; - - dai_data = msm_slim_get_dai_data(drv_data, dai); - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai_id %d\n", - __func__, dai->id); - rc = -EINVAL; - goto done; - } - - if (!dai_data->ch_cnt || dai_data->ch_cnt != params_channels(params)) { - dev_err(dai->dev, "%s: invalid ch_cnt %d %d\n", - __func__, dai_data->ch_cnt, params_channels(params)); - rc = -EINVAL; - goto done; - } - - dai_data->rate = params_rate(params); - dai_data->port_cfg.port_opts = SLIM_OPT_NONE; - if (dai_data->rate >= SNDRV_PCM_RATE_48000) - dai_data->port_cfg.watermark = 16; - else - dai_data->port_cfg.watermark = 8; - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->bits = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - dai_data->bits = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->bits = 32; - break; - default: - dev_err(dai->dev, "%s: invalid format %d\n", __func__, - params_format(params)); - rc = -EINVAL; - goto done; - } - - dev_dbg(dai->dev, "%s: ch_cnt=%u rate=%u, bit_width = %u\n", - __func__, dai_data->ch_cnt, dai_data->rate, - dai_data->bits); -done: - return rc; -} - -static int msm_dai_slim_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dai_data *dai_data; - struct snd_soc_dai_driver *dai_drv; - u8 i = 0; - - dev_dbg(dai->dev, - "%s: tx_num=%u, rx_num=%u\n", - __func__, tx_num, rx_num); - - dai_data = msm_slim_get_dai_data(drv_data, dai); - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai_id %d\n", - __func__, dai->id); - return -EINVAL; - } - - dai_drv = dai_data->dai_drv; - - if (tx_num > dai_drv->capture.channels_max) { - dev_err(dai->dev, "%s: tx_num %u max out master port cnt\n", - __func__, tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) - dai_data->sh_ch[i] = tx_slot[i]; - - dai_data->ch_cnt = tx_num; - return 0; -} - -static int msm_dai_slim_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dma_data *dma_data; - struct msm_slim_dai_data *dai_data = NULL; - struct slim_ch prop; - int rc; - u8 i, j; - - dai_data = msm_slim_get_dai_data(drv_data, dai); - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai %d\n", - __func__, dai->id); - return -EINVAL; - } - - if (!(dai_data->status & DAI_STATE_INITIALIZED)) { - dev_err(dai->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return -EINVAL; - } - - if (dai_data->status & DAI_STATE_PREPARED) { - dev_dbg(dai->dev, - "%s: dai id (%d) has already prepared.\n", - __func__, dai->id); - return 0; - } - - dma_data = &dai_data->dma_data; - snd_soc_dai_set_dma_data(dai, substream, dma_data); - - for (i = 0; i < dai_data->ch_cnt; i++) { - rc = slim_query_ch(drv_data->sdev, dai_data->sh_ch[i], - &dai_data->chan_h[i]); - if (rc) { - dev_err(dai->dev, "%s:query chan handle failed rc %d\n", - __func__, rc); - goto error_chan_query; - } - } - - prop.prot = SLIM_AUTO_ISO; - prop.baser = SLIM_RATE_4000HZ; - prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; - prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; - prop.ratem = (dai_data->rate/4000); - prop.sampleszbits = dai_data->bits; - - rc = slim_define_ch(drv_data->sdev, &prop, dai_data->chan_h, - dai_data->ch_cnt, true, &dai_data->grph); - - if (rc) { - dev_err(dai->dev, "%s:define chan failed rc %d\n", - __func__, rc); - goto error_define_chan; - } - - /* Mark stream status as prepared */ - SET_DAI_STATE(dai_data->status, DAI_STATE_PREPARED); - - return rc; - -error_define_chan: -error_chan_query: - for (j = 0; j < i; j++) - slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[j]); - return rc; -} - -static void msm_dai_slim_shutdown(struct snd_pcm_substream *stream, - struct snd_soc_dai *dai) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dma_data *dma_data = NULL; - struct msm_slim_dai_data *dai_data; - int i, rc = 0; - - dai_data = msm_slim_get_dai_data(drv_data, dai); - dma_data = snd_soc_dai_get_dma_data(dai, stream); - if (!dma_data || !dai_data) { - dev_err(dai->dev, - "%s: Invalid %s\n", __func__, - (!dma_data) ? "dma_data" : "dai_data"); - return; - } - - if ((!(dai_data->status & DAI_STATE_PREPARED)) || - dai_data->status & DAI_STATE_RUNNING) { - dev_err(dai->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return; - } - - for (i = 0; i < dai_data->ch_cnt; i++) { - rc = slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[i]); - if (rc) { - dev_err(dai->dev, - "%s: dealloc_ch failed, err = %d\n", - __func__, rc); - } - } - - snd_soc_dai_set_dma_data(dai, stream, NULL); - /* clear prepared state for the dai */ - CLR_DAI_STATE(dai_data->status, DAI_STATE_PREPARED); -} - -static const struct snd_soc_component_driver msm_dai_slim_component = { - .name = "msm-dai-slim-cmpnt", -}; - -static struct snd_soc_dai_ops msm_dai_slim_ops = { - .prepare = msm_dai_slim_prepare, - .hw_params = msm_dai_slim_hw_params, - .shutdown = msm_dai_slim_shutdown, - .set_channel_map = msm_dai_slim_set_channel_map, -}; - -static struct snd_soc_dai_driver msm_slim_dais[] = { - { - /* - * The first dai name should be same as device name - * to support registering single and multile dais. - */ - .name = SLIM_DEV_NAME, - .id = MSM_DAI_SLIM0, - .capture = { - .rates = SLIM_DAI_RATES, - .formats = SLIM_DAI_FORMATS, - .channels_min = 1, - /* - * max channels allowed is - * dependent on platform and - * will be updated before this - * dai driver is registered. - */ - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - .stream_name = "SLIM_DAI0 Capture", - }, - .ops = &msm_dai_slim_ops, - }, - /* - * If multiple dais are needed, - * add dais here and update the - * dai_id enum. - */ -}; - -static void msm_dai_slim_remove_dai_data( - struct device *dev, - struct msm_dai_slim_drv_data *drv_data) -{ - int i; - struct msm_slim_dai_data *dai_data_t; - - for (i = 0; i < drv_data->num_dais; i++) { - dai_data_t = &drv_data->slim_dai_data[i]; - - kfree(dai_data_t->chan_h); - dai_data_t->chan_h = NULL; - kfree(dai_data_t->sh_ch); - dai_data_t->sh_ch = NULL; - } -} - -static int msm_dai_slim_populate_dai_data(struct device *dev, - struct msm_dai_slim_drv_data *drv_data) -{ - struct snd_soc_dai_driver *dai_drv; - struct msm_slim_dai_data *dai_data_t; - u8 num_ch; - int i, j, rc; - - for (i = 0; i < drv_data->num_dais; i++) { - num_ch = 0; - dai_drv = &msm_slim_dais[i]; - num_ch += dai_drv->capture.channels_max; - num_ch += dai_drv->playback.channels_max; - - dai_data_t = &drv_data->slim_dai_data[i]; - dai_data_t->dai_drv = dai_drv; - dai_data_t->dai_id = dai_drv->id; - dai_data_t->dma_data.sdev = drv_data->sdev; - dai_data_t->dma_data.dai_channel_ctl = - msm_dai_slim_ch_ctl; - SET_DAI_STATE(dai_data_t->status, - DAI_STATE_INITIALIZED); - - dai_data_t->chan_h = devm_kzalloc(dev, - sizeof(u16) * num_ch, - GFP_KERNEL); - if (!dai_data_t->chan_h) { - dev_err(dev, - "%s: DAI ID %d, Failed to alloc channel handles\n", - __func__, i); - rc = -ENOMEM; - goto err_mem_alloc; - } - - dai_data_t->sh_ch = devm_kzalloc(dev, - sizeof(u16) * num_ch, - GFP_KERNEL); - if (!dai_data_t->sh_ch) { - dev_err(dev, - "%s: DAI ID %d, Failed to alloc sh_ch\n", - __func__, i); - rc = -ENOMEM; - goto err_mem_alloc; - } - } - return 0; - -err_mem_alloc: - for (j = 0; j < i; j++) { - dai_data_t = &drv_data->slim_dai_data[i]; - - devm_kfree(dev, dai_data_t->chan_h); - dai_data_t->chan_h = NULL; - - devm_kfree(dev, dai_data_t->sh_ch); - dai_data_t->sh_ch = NULL; - } - return rc; -} - -static int msm_dai_slim_dev_probe(struct slim_device *sdev) -{ - int rc, i; - u8 max_channels; - u32 apps_ch_pipes; - struct msm_dai_slim_drv_data *drv_data; - struct device *dev = &sdev->dev; - struct snd_soc_dai_driver *dai_drv; - - if (!dev->of_node || - !dev->of_node->parent) { - dev_err(dev, - "%s: Invalid %s\n", __func__, - (!dev->of_node) ? "of_node" : "parent_of_node"); - return -EINVAL; - } - - rc = of_property_read_u32(dev->of_node->parent, - "qcom,apps-ch-pipes", - &apps_ch_pipes); - if (rc) { - dev_err(dev, - "%s: Failed to lookup property %s in node %s, err = %d\n", - __func__, "qcom,apps-ch-pipes", - dev->of_node->parent->full_name, rc); - goto err_ret; - } - - max_channels = hweight_long(apps_ch_pipes); - if (max_channels <= 0) { - dev_err(dev, - "%s: Invalid apps owned ports %d\n", - __func__, max_channels); - goto err_ret; - } - - dev_dbg(dev, "%s: max channels = %u\n", - __func__, max_channels); - - for (i = 0; i < ARRAY_SIZE(msm_slim_dais); i++) { - dai_drv = &msm_slim_dais[i]; - dai_drv->capture.channels_max = max_channels; - dai_drv->playback.channels_max = max_channels; - } - - drv_data = devm_kzalloc(dev, sizeof(*drv_data), - GFP_KERNEL); - if (!drv_data) { - rc = -ENOMEM; - goto err_ret; - } - - drv_data->sdev = sdev; - drv_data->num_dais = NUM_SLIM_DAIS; - - rc = msm_dai_slim_populate_dai_data(dev, drv_data); - if (rc) { - dev_err(dev, - "%s: failed to setup dai_data, err = %d\n", - __func__, rc); - goto err_populate_dai; - } - - rc = snd_soc_register_component(&sdev->dev, &msm_dai_slim_component, - msm_slim_dais, NUM_SLIM_DAIS); - if (rc < 0) { - dev_err(dev, "%s: failed to register DAI, err = %d\n", - __func__, rc); - goto err_reg_comp; - } - - dev_set_drvdata(dev, drv_data); - return rc; - -err_reg_comp: - msm_dai_slim_remove_dai_data(dev, drv_data); - -err_populate_dai: - devm_kfree(dev, drv_data); - -err_ret: - return rc; -} - -static int msm_dai_slim_dev_remove(struct slim_device *sdev) -{ - snd_soc_unregister_component(&sdev->dev); - return 0; -} - -static const struct slim_device_id msm_dai_slim_dt_match[] = { - {SLIM_DEV_NAME, 0 }, - {} -}; - -static struct slim_driver msm_dai_slim_driver = { - .driver = { - .name = SLIM_DEV_NAME, - .owner = THIS_MODULE, - }, - .probe = msm_dai_slim_dev_probe, - .remove = msm_dai_slim_dev_remove, - .id_table = msm_dai_slim_dt_match, -}; - -int __init msm_dai_slim_init(void) -{ - int rc; - - rc = slim_driver_register(&msm_dai_slim_driver); - if (rc) - pr_err("%s: failed to register with slimbus driver rc = %d", - __func__, rc); - return rc; -} - -void msm_dai_slim_exit(void) -{ - slim_driver_unregister(&msm_dai_slim_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("Slimbus apps-owned channel handling driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-dai-stub-v2.c b/techpack/audio/4.0/asoc/msm-dai-stub-v2.c deleted file mode 100644 index 55701566be15..000000000000 --- a/techpack/audio/4.0/asoc/msm-dai-stub-v2.c +++ /dev/null @@ -1,386 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2013-2014, 2017, 2019 The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - STUB_RX, - STUB_TX, - STUB_1_RX, - STUB_1_TX, - STUB_DTMF_TX, - STUB_HOST_RX_CAPTURE_TX, - STUB_HOST_RX_PLAYBACK_RX, - STUB_HOST_TX_CAPTURE_TX, - STUB_HOST_TX_PLAYBACK_RX, -}; - -static int msm_dai_stub_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - pr_debug("%s:\n", __func__); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_stub_ops = { - .set_channel_map = msm_dai_stub_set_channel_map, -}; - -static int msm_dai_stub_add_route(struct snd_soc_dai *dai) -{ - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai || !dai->driver) { - pr_err("%s Invalid params\n", __func__); - return -EINVAL; - } - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - return 0; -} - -static int msm_dai_stub_dai_probe(struct snd_soc_dai *dai) -{ - return msm_dai_stub_add_route(dai); -} - -static int msm_dai_stub_dai_remove(struct snd_soc_dai *dai) -{ - pr_debug("%s:\n", __func__); - return 0; -} - -static struct snd_soc_dai_driver msm_dai_stub_dai_rx = { - .playback = { - .stream_name = "Stub Playback", - .aif_name = "STUB_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_stub_dai_tx[] = { - { - .capture = { - .stream_name = "Stub Capture", - .aif_name = "STUB_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, - { - .capture = { - .stream_name = "Stub1 Capture", - .aif_name = "STUB_1_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - } -}; - -static struct snd_soc_dai_driver msm_dai_stub_dtmf_tx_dai = { - .capture = { - .stream_name = "DTMF TX", - .aif_name = "STUB_DTMF_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_stub_host_capture_tx_dai[] = { - { - .capture = { - .stream_name = "CS-VOICE HOST RX CAPTURE", - .aif_name = "STUB_HOST_RX_CAPTURE_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, - { - .capture = { - .stream_name = "CS-VOICE HOST TX CAPTURE", - .aif_name = "STUB_HOST_TX_CAPTURE_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_stub_host_playback_rx_dai[] = { - { - .playback = { - .stream_name = "CS-VOICE HOST RX PLAYBACK", - .aif_name = "STUB_HOST_RX_PLAYBACK_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, - { - .playback = { - .stream_name = "CS-VOICE HOST TX PLAYBACK", - .aif_name = "STUB_HOST_TX_PLAYBACK_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, -}; - -static const struct snd_soc_component_driver msm_dai_stub_component = { - .name = "msm-dai-stub-dev", -}; - -static int msm_dai_stub_dev_probe(struct platform_device *pdev) -{ - int rc, id = -1; - const char *stub_dev_id = "qcom,msm-dai-stub-dev-id"; - - rc = of_property_read_u32(pdev->dev.of_node, stub_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, stub_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (id) { - case STUB_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, &msm_dai_stub_dai_rx, 1); - break; - case STUB_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, &msm_dai_stub_dai_tx[0], 1); - break; - case STUB_1_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, &msm_dai_stub_dai_tx[1], 1); - break; - case STUB_DTMF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_dtmf_tx_dai, 1); - break; - case STUB_HOST_RX_CAPTURE_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_capture_tx_dai[0], 1); - break; - case STUB_HOST_TX_CAPTURE_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_capture_tx_dai[1], 1); - break; - case STUB_HOST_RX_PLAYBACK_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_playback_rx_dai[0], 1); - break; - case STUB_HOST_TX_PLAYBACK_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_playback_rx_dai[1], 1); - break; - } - - return rc; -} - -static int msm_dai_stub_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_stub_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-stub-dev", }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_dai_stub_dev_dt_match); - -static struct platform_driver msm_dai_stub_dev = { - .probe = msm_dai_stub_dev_probe, - .remove = msm_dai_stub_dev_remove, - .driver = { - .name = "msm-dai-stub-dev", - .owner = THIS_MODULE, - .of_match_table = msm_dai_stub_dev_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int msm_dai_stub_probe(struct platform_device *pdev) -{ - int rc = 0; - - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - - return rc; -} - -static int msm_dai_stub_remove(struct platform_device *pdev) -{ - pr_debug("%s:\n", __func__); - - return 0; -} - -static const struct of_device_id msm_dai_stub_dt_match[] = { - {.compatible = "qcom,msm-dai-stub"}, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_dai_stub_dt_match); - - -static struct platform_driver msm_dai_stub_driver = { - .probe = msm_dai_stub_probe, - .remove = msm_dai_stub_remove, - .driver = { - .name = "msm-dai-stub", - .owner = THIS_MODULE, - .of_match_table = msm_dai_stub_dt_match, - .suppress_bind_attrs = true, - }, -}; - -int __init msm_dai_stub_init(void) -{ - int rc = 0; - - pr_debug("%s:\n", __func__); - - rc = platform_driver_register(&msm_dai_stub_driver); - if (rc) { - pr_err("%s: fail to register dai q6 driver", __func__); - goto fail; - } - - rc = platform_driver_register(&msm_dai_stub_dev); - if (rc) { - pr_err("%s: fail to register dai q6 dev driver", __func__); - goto dai_stub_dev_fail; - } - return rc; - -dai_stub_dev_fail: - platform_driver_unregister(&msm_dai_stub_driver); -fail: - return rc; -} - -void msm_dai_stub_exit(void) -{ - pr_debug("%s:\n", __func__); - - platform_driver_unregister(&msm_dai_stub_dev); - platform_driver_unregister(&msm_dai_stub_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM Stub DSP DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-dolby-common.h b/techpack/audio/4.0/asoc/msm-dolby-common.h deleted file mode 100644 index 46a2957593d4..000000000000 --- a/techpack/audio/4.0/asoc/msm-dolby-common.h +++ /dev/null @@ -1,259 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2013-2014, 2016, The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_DOLBY_COMMON_H_ -#define _MSM_DOLBY_COMMON_H_ - -#include - - -#define DOLBY_BUNDLE_MODULE_ID 0x00010723 -#define DOLBY_VISUALIZER_MODULE_ID 0x0001072B - -#define DOLBY_PARAM_ID_VDHE 0x0001074D -#define DOLBY_PARAM_ID_VSPE 0x00010750 -#define DOLBY_PARAM_ID_DSSF 0x00010753 -#define DOLBY_PARAM_ID_DVLI 0x0001073E -#define DOLBY_PARAM_ID_DVLO 0x0001073F -#define DOLBY_PARAM_ID_DVLE 0x0001073C -#define DOLBY_PARAM_ID_DVMC 0x00010741 -#define DOLBY_PARAM_ID_DVME 0x00010740 -#define DOLBY_PARAM_ID_IENB 0x00010744 -#define DOLBY_PARAM_ID_IEBF 0x00010745 -#define DOLBY_PARAM_ID_IEON 0x00010743 -#define DOLBY_PARAM_ID_DEON 0x00010738 -#define DOLBY_PARAM_ID_NGON 0x00010736 -#define DOLBY_PARAM_ID_GEON 0x00010748 -#define DOLBY_PARAM_ID_GENB 0x00010749 -#define DOLBY_PARAM_ID_GEBF 0x0001074A -#define DOLBY_PARAM_ID_AONB 0x0001075B -#define DOLBY_PARAM_ID_AOBF 0x0001075C -#define DOLBY_PARAM_ID_AOBG 0x0001075D -#define DOLBY_PARAM_ID_AOON 0x00010759 -#define DOLBY_PARAM_ID_ARNB 0x0001075F -#define DOLBY_PARAM_ID_ARBF 0x00010760 -#define DOLBY_PARAM_ID_PLB 0x00010768 -#define DOLBY_PARAM_ID_PLMD 0x00010767 -#define DOLBY_PARAM_ID_DHSB 0x0001074E -#define DOLBY_PARAM_ID_DHRG 0x0001074F -#define DOLBY_PARAM_ID_DSSB 0x00010751 -#define DOLBY_PARAM_ID_DSSA 0x00010752 -#define DOLBY_PARAM_ID_DVLA 0x0001073D -#define DOLBY_PARAM_ID_IEBT 0x00010746 -#define DOLBY_PARAM_ID_IEA 0x0001076A -#define DOLBY_PARAM_ID_DEA 0x00010739 -#define DOLBY_PARAM_ID_DED 0x0001073A -#define DOLBY_PARAM_ID_GEBG 0x0001074B -#define DOLBY_PARAM_ID_AOCC 0x0001075A -#define DOLBY_PARAM_ID_ARBI 0x00010761 -#define DOLBY_PARAM_ID_ARBL 0x00010762 -#define DOLBY_PARAM_ID_ARBH 0x00010763 -#define DOLBY_PARAM_ID_AROD 0x00010764 -#define DOLBY_PARAM_ID_ARTP 0x00010765 -#define DOLBY_PARAM_ID_VMON 0x00010756 -#define DOLBY_PARAM_ID_VMB 0x00010757 -#define DOLBY_PARAM_ID_VCNB 0x00010733 -#define DOLBY_PARAM_ID_VCBF 0x00010734 -#define DOLBY_PARAM_ID_PREG 0x00010728 -#define DOLBY_PARAM_ID_VEN 0x00010732 -#define DOLBY_PARAM_ID_PSTG 0x00010729 -#define DOLBY_PARAM_ID_INIT_ENDP 0x00010727 - -/* Not Used with Set Param kcontrol, only to query using Get Param */ -#define DOLBY_PARAM_ID_VER 0x00010726 - -#define DOLBY_PARAM_ID_VCBG 0x00010730 -#define DOLBY_PARAM_ID_VCBE 0x00010731 - -/* DOLBY DAP control params */ -#define DOLBY_COMMIT_ALL_TO_DSP 0x70000001 -#define DOLBY_COMMIT_TO_DSP 0x70000002 -#define DOLBY_USE_CACHE 0x70000003 -#define DOLBY_AUTO_ENDP 0x70000004 -#define DOLBY_AUTO_ENDDEP_PARAMS 0x70000005 -#define DOLBY_DAP_BYPASS 0x70000006 - -#define DOLBY_ENABLE_CUSTOM_STEREO 0x000108c7 - -/* DOLBY DAP offsets start */ -#define DOLBY_PARAM_VDHE_LENGTH 1 -#define DOLBY_PARAM_VDHE_OFFSET 0 -#define DOLBY_PARAM_VSPE_LENGTH 1 -#define DOLBY_PARAM_VSPE_OFFSET (DOLBY_PARAM_VDHE_OFFSET + \ - DOLBY_PARAM_VDHE_LENGTH) -#define DOLBY_PARAM_DSSF_LENGTH 1 -#define DOLBY_PARAM_DSSF_OFFSET (DOLBY_PARAM_VSPE_OFFSET + \ - DOLBY_PARAM_VSPE_LENGTH) -#define DOLBY_PARAM_DVLI_LENGTH 1 -#define DOLBY_PARAM_DVLI_OFFSET (DOLBY_PARAM_DSSF_OFFSET + \ - DOLBY_PARAM_DSSF_LENGTH) -#define DOLBY_PARAM_DVLO_LENGTH 1 -#define DOLBY_PARAM_DVLO_OFFSET (DOLBY_PARAM_DVLI_OFFSET + \ - DOLBY_PARAM_DVLI_LENGTH) -#define DOLBY_PARAM_DVLE_LENGTH 1 -#define DOLBY_PARAM_DVLE_OFFSET (DOLBY_PARAM_DVLO_OFFSET + \ - DOLBY_PARAM_DVLO_LENGTH) -#define DOLBY_PARAM_DVMC_LENGTH 1 -#define DOLBY_PARAM_DVMC_OFFSET (DOLBY_PARAM_DVLE_OFFSET + \ - DOLBY_PARAM_DVLE_LENGTH) -#define DOLBY_PARAM_DVME_LENGTH 1 -#define DOLBY_PARAM_DVME_OFFSET (DOLBY_PARAM_DVMC_OFFSET + \ - DOLBY_PARAM_DVMC_LENGTH) -#define DOLBY_PARAM_IENB_LENGTH 1 -#define DOLBY_PARAM_IENB_OFFSET (DOLBY_PARAM_DVME_OFFSET + \ - DOLBY_PARAM_DVME_LENGTH) -#define DOLBY_PARAM_IEBF_LENGTH 40 -#define DOLBY_PARAM_IEBF_OFFSET (DOLBY_PARAM_IENB_OFFSET + \ - DOLBY_PARAM_IENB_LENGTH) -#define DOLBY_PARAM_IEON_LENGTH 1 -#define DOLBY_PARAM_IEON_OFFSET (DOLBY_PARAM_IEBF_OFFSET + \ - DOLBY_PARAM_IEBF_LENGTH) -#define DOLBY_PARAM_DEON_LENGTH 1 -#define DOLBY_PARAM_DEON_OFFSET (DOLBY_PARAM_IEON_OFFSET + \ - DOLBY_PARAM_IEON_LENGTH) -#define DOLBY_PARAM_NGON_LENGTH 1 -#define DOLBY_PARAM_NGON_OFFSET (DOLBY_PARAM_DEON_OFFSET + \ - DOLBY_PARAM_DEON_LENGTH) -#define DOLBY_PARAM_GEON_LENGTH 1 -#define DOLBY_PARAM_GEON_OFFSET (DOLBY_PARAM_NGON_OFFSET + \ - DOLBY_PARAM_NGON_LENGTH) -#define DOLBY_PARAM_GENB_LENGTH 1 -#define DOLBY_PARAM_GENB_OFFSET (DOLBY_PARAM_GEON_OFFSET + \ - DOLBY_PARAM_GEON_LENGTH) -#define DOLBY_PARAM_GEBF_LENGTH 40 -#define DOLBY_PARAM_GEBF_OFFSET (DOLBY_PARAM_GENB_OFFSET + \ - DOLBY_PARAM_GENB_LENGTH) -#define DOLBY_PARAM_AONB_LENGTH 1 -#define DOLBY_PARAM_AONB_OFFSET (DOLBY_PARAM_GEBF_OFFSET + \ - DOLBY_PARAM_GEBF_LENGTH) -#define DOLBY_PARAM_AOBF_LENGTH 40 -#define DOLBY_PARAM_AOBF_OFFSET (DOLBY_PARAM_AONB_OFFSET + \ - DOLBY_PARAM_AONB_LENGTH) -#define DOLBY_PARAM_AOBG_LENGTH 329 -#define DOLBY_PARAM_AOBG_OFFSET (DOLBY_PARAM_AOBF_OFFSET + \ - DOLBY_PARAM_AOBF_LENGTH) -#define DOLBY_PARAM_AOON_LENGTH 1 -#define DOLBY_PARAM_AOON_OFFSET (DOLBY_PARAM_AOBG_OFFSET + \ - DOLBY_PARAM_AOBG_LENGTH) -#define DOLBY_PARAM_ARNB_LENGTH 1 -#define DOLBY_PARAM_ARNB_OFFSET (DOLBY_PARAM_AOON_OFFSET + \ - DOLBY_PARAM_AOON_LENGTH) -#define DOLBY_PARAM_ARBF_LENGTH 40 -#define DOLBY_PARAM_ARBF_OFFSET (DOLBY_PARAM_ARNB_OFFSET + \ - DOLBY_PARAM_ARNB_LENGTH) -#define DOLBY_PARAM_PLB_LENGTH 1 -#define DOLBY_PARAM_PLB_OFFSET (DOLBY_PARAM_ARBF_OFFSET + \ - DOLBY_PARAM_ARBF_LENGTH) -#define DOLBY_PARAM_PLMD_LENGTH 1 -#define DOLBY_PARAM_PLMD_OFFSET (DOLBY_PARAM_PLB_OFFSET + \ - DOLBY_PARAM_PLB_LENGTH) -#define DOLBY_PARAM_DHSB_LENGTH 1 -#define DOLBY_PARAM_DHSB_OFFSET (DOLBY_PARAM_PLMD_OFFSET + \ - DOLBY_PARAM_PLMD_LENGTH) -#define DOLBY_PARAM_DHRG_LENGTH 1 -#define DOLBY_PARAM_DHRG_OFFSET (DOLBY_PARAM_DHSB_OFFSET + \ - DOLBY_PARAM_DHSB_LENGTH) -#define DOLBY_PARAM_DSSB_LENGTH 1 -#define DOLBY_PARAM_DSSB_OFFSET (DOLBY_PARAM_DHRG_OFFSET + \ - DOLBY_PARAM_DHRG_LENGTH) -#define DOLBY_PARAM_DSSA_LENGTH 1 -#define DOLBY_PARAM_DSSA_OFFSET (DOLBY_PARAM_DSSB_OFFSET + \ - DOLBY_PARAM_DSSB_LENGTH) -#define DOLBY_PARAM_DVLA_LENGTH 1 -#define DOLBY_PARAM_DVLA_OFFSET (DOLBY_PARAM_DSSA_OFFSET + \ - DOLBY_PARAM_DSSA_LENGTH) -#define DOLBY_PARAM_IEBT_LENGTH 40 -#define DOLBY_PARAM_IEBT_OFFSET (DOLBY_PARAM_DVLA_OFFSET + \ - DOLBY_PARAM_DVLA_LENGTH) -#define DOLBY_PARAM_IEA_LENGTH 1 -#define DOLBY_PARAM_IEA_OFFSET (DOLBY_PARAM_IEBT_OFFSET + \ - DOLBY_PARAM_IEBT_LENGTH) -#define DOLBY_PARAM_DEA_LENGTH 1 -#define DOLBY_PARAM_DEA_OFFSET (DOLBY_PARAM_IEA_OFFSET + \ - DOLBY_PARAM_IEA_LENGTH) -#define DOLBY_PARAM_DED_LENGTH 1 -#define DOLBY_PARAM_DED_OFFSET (DOLBY_PARAM_DEA_OFFSET + \ - DOLBY_PARAM_DEA_LENGTH) -#define DOLBY_PARAM_GEBG_LENGTH 40 -#define DOLBY_PARAM_GEBG_OFFSET (DOLBY_PARAM_DED_OFFSET + \ - DOLBY_PARAM_DED_LENGTH) -#define DOLBY_PARAM_AOCC_LENGTH 1 -#define DOLBY_PARAM_AOCC_OFFSET (DOLBY_PARAM_GEBG_OFFSET + \ - DOLBY_PARAM_GEBG_LENGTH) -#define DOLBY_PARAM_ARBI_LENGTH 40 -#define DOLBY_PARAM_ARBI_OFFSET (DOLBY_PARAM_AOCC_OFFSET + \ - DOLBY_PARAM_AOCC_LENGTH) -#define DOLBY_PARAM_ARBL_LENGTH 40 -#define DOLBY_PARAM_ARBL_OFFSET (DOLBY_PARAM_ARBI_OFFSET + \ - DOLBY_PARAM_ARBI_LENGTH) -#define DOLBY_PARAM_ARBH_LENGTH 40 -#define DOLBY_PARAM_ARBH_OFFSET (DOLBY_PARAM_ARBL_OFFSET + \ - DOLBY_PARAM_ARBL_LENGTH) -#define DOLBY_PARAM_AROD_LENGTH 1 -#define DOLBY_PARAM_AROD_OFFSET (DOLBY_PARAM_ARBH_OFFSET + \ - DOLBY_PARAM_ARBH_LENGTH) -#define DOLBY_PARAM_ARTP_LENGTH 1 -#define DOLBY_PARAM_ARTP_OFFSET (DOLBY_PARAM_AROD_OFFSET + \ - DOLBY_PARAM_AROD_LENGTH) -#define DOLBY_PARAM_VMON_LENGTH 1 -#define DOLBY_PARAM_VMON_OFFSET (DOLBY_PARAM_ARTP_OFFSET + \ - DOLBY_PARAM_ARTP_LENGTH) -#define DOLBY_PARAM_VMB_LENGTH 1 -#define DOLBY_PARAM_VMB_OFFSET (DOLBY_PARAM_VMON_OFFSET + \ - DOLBY_PARAM_VMON_LENGTH) -#define DOLBY_PARAM_VCNB_LENGTH 1 -#define DOLBY_PARAM_VCNB_OFFSET (DOLBY_PARAM_VMB_OFFSET + \ - DOLBY_PARAM_VMB_LENGTH) -#define DOLBY_PARAM_VCBF_LENGTH 20 -#define DOLBY_PARAM_VCBF_OFFSET (DOLBY_PARAM_VCNB_OFFSET + \ - DOLBY_PARAM_VCNB_LENGTH) -#define DOLBY_PARAM_PREG_LENGTH 1 -#define DOLBY_PARAM_PREG_OFFSET (DOLBY_PARAM_VCBF_OFFSET + \ - DOLBY_PARAM_VCBF_LENGTH) -#define DOLBY_PARAM_VEN_LENGTH 1 -#define DOLBY_PARAM_VEN_OFFSET (DOLBY_PARAM_PREG_OFFSET + \ - DOLBY_PARAM_PREG_LENGTH) -#define DOLBY_PARAM_PSTG_LENGTH 1 -#define DOLBY_PARAM_PSTG_OFFSET (DOLBY_PARAM_VEN_OFFSET + \ - DOLBY_PARAM_VEN_LENGTH) - -#define DOLBY_PARAM_INT_ENDP_LENGTH 1 -#define DOLBY_PARAM_PAYLOAD_SIZE 3 -#define DOLBY_MAX_LENGTH_INDIVIDUAL_PARAM 329 - -#define TOTAL_LENGTH_DOLBY_PARAM 745 -#define DOLBY_VIS_PARAM_HEADER_SIZE 25 -#define DOLBY_PARAM_VCNB_MAX_LENGTH 40 - -#define DOLBY_INVALID_PORT_ID -1 - -enum { - DEVICE_NONE = 0x0, - /* output devices */ - EARPIECE = 0x1, - SPEAKER = 0x2, - WIRED_HEADSET = 0x4, - WIRED_HEADPHONE = 0x8, - BLUETOOTH_SCO = 0x10, - BLUETOOTH_SCO_HEADSET = 0x20, - BLUETOOTH_SCO_CARKIT = 0x40, - BLUETOOTH_A2DP = 0x80, - BLUETOOTH_A2DP_HEADPHONES = 0x100, - BLUETOOTH_A2DP_SPEAKER = 0x200, - AUX_DIGITAL = 0x400, - ANLG_DOCK_HEADSET = 0x800, - DGTL_DOCK_HEADSET = 0x1000, - USB_ACCESSORY = 0x2000, - USB_DEVICE = 0x4000, - REMOTE_SUBMIX = 0x8000, - ANC_HEADSET = 0x10000, - ANC_HEADPHONE = 0x20000, - PROXY = 0x2000000, - FM = 0x100000, - FM_TX = 0x1000000, - DEVICE_OUT_DEFAULT = 0x40000000, - DEVICE_OUT_ALL = 0x403FFFFF, -}; -#endif diff --git a/techpack/audio/4.0/asoc/msm-dolby-dap-config.h b/techpack/audio/4.0/asoc/msm-dolby-dap-config.h deleted file mode 100644 index be950235ad93..000000000000 --- a/techpack/audio/4.0/asoc/msm-dolby-dap-config.h +++ /dev/null @@ -1,78 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2013-2014, 2017-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_DOLBY_DAP_CONFIG_H_ -#define _MSM_DOLBY_DAP_CONFIG_H_ - -#include -#include "msm-dolby-common.h" - -#ifdef CONFIG_DOLBY_DAP -/* DOLBY DOLBY GUIDS */ -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0x0001033B -#define NUM_DOLBY_ENDP_DEVICE 23 - -#define DOLBY_NUM_ENDP_DEPENDENT_PARAMS 3 -#define DOLBY_ENDDEP_PARAM_DVLO_OFFSET 0 -#define DOLBY_ENDDEP_PARAM_DVLO_LENGTH 1 -#define DOLBY_ENDDEP_PARAM_DVLI_OFFSET (DOLBY_ENDDEP_PARAM_DVLO_OFFSET + \ - DOLBY_ENDDEP_PARAM_DVLO_LENGTH) -#define DOLBY_ENDDEP_PARAM_DVLI_LENGTH 1 -#define DOLBY_ENDDEP_PARAM_VMB_OFFSET (DOLBY_ENDDEP_PARAM_DVLI_OFFSET + \ - DOLBY_ENDDEP_PARAM_DVLI_LENGTH) -#define DOLBY_ENDDEP_PARAM_VMB_LENGTH 1 -#define DOLBY_ENDDEP_PARAM_LENGTH (DOLBY_ENDDEP_PARAM_DVLO_LENGTH + \ - DOLBY_ENDDEP_PARAM_DVLI_LENGTH + DOLBY_ENDDEP_PARAM_VMB_LENGTH) - -#define MAX_DOLBY_PARAMS 47 -#define MAX_DOLBY_CTRL_PARAMS 5 -#define ALL_DOLBY_PARAMS (MAX_DOLBY_PARAMS + \ - MAX_DOLBY_CTRL_PARAMS) -#define DOLBY_COMMIT_ALL_IDX MAX_DOLBY_PARAMS -#define DOLBY_COMMIT_IDX (MAX_DOLBY_PARAMS+1) -#define DOLBY_USE_CACHE_IDX (MAX_DOLBY_PARAMS+2) -#define DOLBY_AUTO_ENDP_IDX (MAX_DOLBY_PARAMS+3) -#define DOLBY_AUTO_ENDDEP_IDX (MAX_DOLBY_PARAMS+4) - -/* DOLBY device definitions */ -enum { - DOLBY_ENDP_INT_SPEAKERS = 0, - DOLBY_ENDP_EXT_SPEAKERS, - DOLBY_ENDP_HEADPHONES, - DOLBY_ENDP_HDMI, - DOLBY_ENDP_SPDIF, - DOLBY_ENDP_DLNA, - DOLBY_ENDP_ANALOG, -}; - -/* DOLBY device definitions end */ - -struct dolby_dap_params { - uint32_t value[TOTAL_LENGTH_DOLBY_PARAM + MAX_DOLBY_PARAMS]; -} __packed; - -int msm_dolby_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on); -void msm_dolby_dap_deinit(int port_id); -void msm_dolby_dap_add_controls(struct snd_soc_platform *platform); -int dolby_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled); -/* Dolby DOLBY end */ -#else -int msm_dolby_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on) -{ - return 0; -} -void msm_dolby_dap_deinit(int port_id) { } -void msm_dolby_dap_add_controls(struct snd_soc_platform *platform) { } -int dolby_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled) -{ - return 0; -} -#endif - -#endif diff --git a/techpack/audio/4.0/asoc/msm-ds2-dap-config.c b/techpack/audio/4.0/asoc/msm-ds2-dap-config.c deleted file mode 100644 index f40b74b0479d..000000000000 --- a/techpack/audio/4.0/asoc/msm-ds2-dap-config.c +++ /dev/null @@ -1,2196 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "msm-ds2-dap-config.h" -#include "msm-pcm-routing-v2.h" - - -/* ramp up/down for 30ms */ -#define DOLBY_SOFT_VOLUME_PERIOD 40 -/* Step value 0ms or 0us */ -#define DOLBY_SOFT_VOLUME_STEP 1000 -#define DOLBY_ADDITIONAL_RAMP_WAIT 10 -#define SOFT_VOLUME_PARAM_SIZE 3 -#define PARAM_PAYLOAD_SIZE 3 - -enum { - DOLBY_SOFT_VOLUME_CURVE_LINEAR = 0, - DOLBY_SOFT_VOLUME_CURVE_EXP, - DOLBY_SOFT_VOLUME_CURVE_LOG, -}; - -#define VOLUME_ZERO_GAIN 0x0 -#define VOLUME_UNITY_GAIN 0x2000 -/* Wait time for module enable/disble */ -#define DOLBY_MODULE_ENABLE_PERIOD 50 - -/* DOLBY device definitions end */ -enum { - DOLBY_OFF_CACHE = 0, - DOLBY_SPEAKER_CACHE, - DOLBY_HEADPHONE_CACHE, - DOLBY_HDMI_CACHE, - DOLBY_WFD_CACHE, - DOLBY_FM_CACHE, - DOLBY_MAX_CACHE, -}; - -enum { - DAP_SOFT_BYPASS = 0, - DAP_HARD_BYPASS, -}; - -enum { - MODULE_DISABLE = 0, - MODULE_ENABLE, -}; -/* dolby param ids to/from dsp */ -static uint32_t ds2_dap_params_id[MAX_DS2_PARAMS] = { - DOLBY_PARAM_ID_VDHE, DOLBY_PARAM_ID_VSPE, DOLBY_PARAM_ID_DSSF, - DOLBY_PARAM_ID_DVLI, DOLBY_PARAM_ID_DVLO, DOLBY_PARAM_ID_DVLE, - DOLBY_PARAM_ID_DVMC, DOLBY_PARAM_ID_DVME, DOLBY_PARAM_ID_IENB, - DOLBY_PARAM_ID_IEBF, DOLBY_PARAM_ID_IEON, DOLBY_PARAM_ID_DEON, - DOLBY_PARAM_ID_NGON, DOLBY_PARAM_ID_GEON, DOLBY_PARAM_ID_GENB, - DOLBY_PARAM_ID_GEBF, DOLBY_PARAM_ID_AONB, DOLBY_PARAM_ID_AOBF, - DOLBY_PARAM_ID_AOBG, DOLBY_PARAM_ID_AOON, DOLBY_PARAM_ID_ARNB, - DOLBY_PARAM_ID_ARBF, DOLBY_PARAM_ID_PLB, DOLBY_PARAM_ID_PLMD, - DOLBY_PARAM_ID_DHSB, DOLBY_PARAM_ID_DHRG, DOLBY_PARAM_ID_DSSB, - DOLBY_PARAM_ID_DSSA, DOLBY_PARAM_ID_DVLA, DOLBY_PARAM_ID_IEBT, - DOLBY_PARAM_ID_IEA, DOLBY_PARAM_ID_DEA, DOLBY_PARAM_ID_DED, - DOLBY_PARAM_ID_GEBG, DOLBY_PARAM_ID_AOCC, DOLBY_PARAM_ID_ARBI, - DOLBY_PARAM_ID_ARBL, DOLBY_PARAM_ID_ARBH, DOLBY_PARAM_ID_AROD, - DOLBY_PARAM_ID_ARTP, DOLBY_PARAM_ID_VMON, DOLBY_PARAM_ID_VMB, - DOLBY_PARAM_ID_VCNB, DOLBY_PARAM_ID_VCBF, DOLBY_PARAM_ID_PREG, - DOLBY_PARAM_ID_VEN, DOLBY_PARAM_ID_PSTG, DOLBY_PARAM_ID_INIT_ENDP, -}; - -/* modifed state: 0x00000000 - Not updated - * > 0x00000000 && < 0x00010000 - * Updated and not committed to DSP - * 0x00010001 - Updated and committed to DSP - * > 0x00010001 - Modified the committed value - */ -/* param offset */ -static uint32_t ds2_dap_params_offset[MAX_DS2_PARAMS] = { - DOLBY_PARAM_VDHE_OFFSET, DOLBY_PARAM_VSPE_OFFSET, - DOLBY_PARAM_DSSF_OFFSET, DOLBY_PARAM_DVLI_OFFSET, - DOLBY_PARAM_DVLO_OFFSET, DOLBY_PARAM_DVLE_OFFSET, - DOLBY_PARAM_DVMC_OFFSET, DOLBY_PARAM_DVME_OFFSET, - DOLBY_PARAM_IENB_OFFSET, DOLBY_PARAM_IEBF_OFFSET, - DOLBY_PARAM_IEON_OFFSET, DOLBY_PARAM_DEON_OFFSET, - DOLBY_PARAM_NGON_OFFSET, DOLBY_PARAM_GEON_OFFSET, - DOLBY_PARAM_GENB_OFFSET, DOLBY_PARAM_GEBF_OFFSET, - DOLBY_PARAM_AONB_OFFSET, DOLBY_PARAM_AOBF_OFFSET, - DOLBY_PARAM_AOBG_OFFSET, DOLBY_PARAM_AOON_OFFSET, - DOLBY_PARAM_ARNB_OFFSET, DOLBY_PARAM_ARBF_OFFSET, - DOLBY_PARAM_PLB_OFFSET, DOLBY_PARAM_PLMD_OFFSET, - DOLBY_PARAM_DHSB_OFFSET, DOLBY_PARAM_DHRG_OFFSET, - DOLBY_PARAM_DSSB_OFFSET, DOLBY_PARAM_DSSA_OFFSET, - DOLBY_PARAM_DVLA_OFFSET, DOLBY_PARAM_IEBT_OFFSET, - DOLBY_PARAM_IEA_OFFSET, DOLBY_PARAM_DEA_OFFSET, - DOLBY_PARAM_DED_OFFSET, DOLBY_PARAM_GEBG_OFFSET, - DOLBY_PARAM_AOCC_OFFSET, DOLBY_PARAM_ARBI_OFFSET, - DOLBY_PARAM_ARBL_OFFSET, DOLBY_PARAM_ARBH_OFFSET, - DOLBY_PARAM_AROD_OFFSET, DOLBY_PARAM_ARTP_OFFSET, - DOLBY_PARAM_VMON_OFFSET, DOLBY_PARAM_VMB_OFFSET, - DOLBY_PARAM_VCNB_OFFSET, DOLBY_PARAM_VCBF_OFFSET, - DOLBY_PARAM_PREG_OFFSET, DOLBY_PARAM_VEN_OFFSET, - DOLBY_PARAM_PSTG_OFFSET, DOLBY_PARAM_INT_ENDP_OFFSET, -}; -/* param_length */ -static uint32_t ds2_dap_params_length[MAX_DS2_PARAMS] = { - DOLBY_PARAM_VDHE_LENGTH, DOLBY_PARAM_VSPE_LENGTH, - DOLBY_PARAM_DSSF_LENGTH, DOLBY_PARAM_DVLI_LENGTH, - DOLBY_PARAM_DVLO_LENGTH, DOLBY_PARAM_DVLE_LENGTH, - DOLBY_PARAM_DVMC_LENGTH, DOLBY_PARAM_DVME_LENGTH, - DOLBY_PARAM_IENB_LENGTH, DOLBY_PARAM_IEBF_LENGTH, - DOLBY_PARAM_IEON_LENGTH, DOLBY_PARAM_DEON_LENGTH, - DOLBY_PARAM_NGON_LENGTH, DOLBY_PARAM_GEON_LENGTH, - DOLBY_PARAM_GENB_LENGTH, DOLBY_PARAM_GEBF_LENGTH, - DOLBY_PARAM_AONB_LENGTH, DOLBY_PARAM_AOBF_LENGTH, - DOLBY_PARAM_AOBG_LENGTH, DOLBY_PARAM_AOON_LENGTH, - DOLBY_PARAM_ARNB_LENGTH, DOLBY_PARAM_ARBF_LENGTH, - DOLBY_PARAM_PLB_LENGTH, DOLBY_PARAM_PLMD_LENGTH, - DOLBY_PARAM_DHSB_LENGTH, DOLBY_PARAM_DHRG_LENGTH, - DOLBY_PARAM_DSSB_LENGTH, DOLBY_PARAM_DSSA_LENGTH, - DOLBY_PARAM_DVLA_LENGTH, DOLBY_PARAM_IEBT_LENGTH, - DOLBY_PARAM_IEA_LENGTH, DOLBY_PARAM_DEA_LENGTH, - DOLBY_PARAM_DED_LENGTH, DOLBY_PARAM_GEBG_LENGTH, - DOLBY_PARAM_AOCC_LENGTH, DOLBY_PARAM_ARBI_LENGTH, - DOLBY_PARAM_ARBL_LENGTH, DOLBY_PARAM_ARBH_LENGTH, - DOLBY_PARAM_AROD_LENGTH, DOLBY_PARAM_ARTP_LENGTH, - DOLBY_PARAM_VMON_LENGTH, DOLBY_PARAM_VMB_LENGTH, - DOLBY_PARAM_VCNB_LENGTH, DOLBY_PARAM_VCBF_LENGTH, - DOLBY_PARAM_PREG_LENGTH, DOLBY_PARAM_VEN_LENGTH, - DOLBY_PARAM_PSTG_LENGTH, DOLBY_PARAM_INT_ENDP_LENGTH, -}; - -struct ds2_dap_params_s { - int32_t params_val[TOTAL_LENGTH_DS2_PARAM]; - int32_t dap_params_modified[MAX_DS2_PARAMS]; -}; - -struct audio_rx_cal_data { - char aud_proc_data[AUD_PROC_BLOCK_SIZE]; - int32_t aud_proc_size; - char aud_vol_data[AUD_VOL_BLOCK_SIZE]; - int32_t aud_vol_size; -}; - -static struct ds2_dap_params_s ds2_dap_params[DOLBY_MAX_CACHE]; - -struct ds2_device_mapping { - int32_t device_id; /* audio_out_... */ - int port_id; /* afe port. constant for a target variant. routing-v2*/ - /*Only one Dolby COPP for a specific port*/ - int copp_idx; /* idx for the copp port on which ds2 is active */ - int cache_dev; /* idx to a shared parameter array dependent on device*/ - uint32_t stream_ref_count; - bool active; - void *cal_data; -}; - -static struct ds2_device_mapping dev_map[DS2_DEVICES_ALL]; - -struct ds2_dap_params_states_s { - bool use_cache; - bool dap_bypass; - bool dap_bypass_type; - bool node_opened; - int32_t device; - bool custom_stereo_onoff; -}; - -static struct ds2_dap_params_states_s ds2_dap_params_states = {true, false, - false, DEVICE_NONE}; - -static int all_supported_devices = EARPIECE|SPEAKER|WIRED_HEADSET| - WIRED_HEADPHONE|BLUETOOTH_SCO|AUX_DIGITAL| - ANLG_DOCK_HEADSET|DGTL_DOCK_HEADSET| - REMOTE_SUBMIX|ANC_HEADSET|ANC_HEADPHONE| - PROXY|FM|FM_TX|DEVICE_NONE| - BLUETOOTH_SCO_HEADSET|BLUETOOTH_SCO_CARKIT; - - -static void msm_ds2_dap_check_and_update_ramp_wait(int port_id, int copp_idx, - int *ramp_wait) -{ - - int32_t *update_params_value = NULL; - uint32_t params_length = SOFT_VOLUME_PARAM_SIZE * sizeof(uint32_t); - uint32_t param_payload_len = PARAM_PAYLOAD_SIZE * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - int rc = 0; - - update_params_value = kzalloc(params_length + param_payload_len, - GFP_KERNEL); - if (!update_params_value) { - pr_err("%s: params memory alloc failed\n", __func__); - goto end; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOL_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS; - param_hdr.param_size = params_length + param_payload_len; - rc = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, (char *) update_params_value); - if (rc == 0) { - pr_debug("%s: params_value [0x%x, 0x%x, 0x%x]\n", - __func__, update_params_value[0], - update_params_value[1], - update_params_value[2]); - *ramp_wait = update_params_value[0]; - } -end: - kfree(update_params_value); - /* - * No error returned as we do not need to error out from dap on/dap - * bypass. The default ramp parameter will be used to wait during - * ramp down. - */ -} - -static int msm_ds2_dap_set_vspe_vdhe(int dev_map_idx, - bool is_custom_stereo_enabled) -{ - u8 *packed_param_data = NULL; - u8 *param_data = NULL; - struct param_hdr_v3 param_hdr; - u32 packed_param_size = 0; - u32 param_size = 0; - int cdev; - int rc = 0; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: Invalid port id\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].port_id != SLIMBUS_0_RX) && - (dev_map[dev_map_idx].port_id != RT_PROXY_PORT_001_RX)) { - pr_debug("%s:No Custom stereo for port:0x%x\n", - __func__, dev_map[dev_map_idx].port_id); - goto end; - } - - /* Allocate the max space needed */ - packed_param_size = (TOTAL_LENGTH_DOLBY_PARAM * sizeof(uint32_t)) + - (2 * sizeof(union param_hdrs)); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - - packed_param_size = 0; - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* Set common values */ - cdev = dev_map[dev_map_idx].cache_dev; - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - - /* Pack VDHE header + data */ - param_hdr.param_id = DOLBY_PARAM_ID_VDHE; - param_size = DOLBY_PARAM_VDHE_LENGTH * sizeof(uint32_t); - param_hdr.param_size = param_size; - - if (is_custom_stereo_enabled) - param_data = NULL; - else - param_data = (u8 *) &ds2_dap_params[cdev] - .params_val[DOLBY_PARAM_VDHE_OFFSET]; - - rc = q6common_pack_pp_params(packed_param_data, ¶m_hdr, param_data, - ¶m_size); - if (rc) { - pr_err("%s: Failed to pack params for dolby vdhe, error %d\n", - __func__, rc); - goto end; - } - packed_param_size += param_size; - - /* Pack VSPE header + data */ - param_hdr.param_id = DOLBY_PARAM_ID_VSPE; - param_size = DOLBY_PARAM_VSPE_LENGTH * sizeof(uint32_t); - param_hdr.param_size = param_size; - - if (is_custom_stereo_enabled) - param_data = NULL; - else - param_data = (u8 *) &ds2_dap_params[cdev] - .params_val[DOLBY_PARAM_VSPE_OFFSET]; - - rc = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, param_data, ¶m_size); - if (rc) { - pr_err("%s: Failed to pack params for dolby vspe, error %d\n", - __func__, rc); - goto end; - } - packed_param_size += param_size; - - rc = adm_set_pp_params(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, NULL, - packed_param_data, packed_param_size); - if (rc) { - pr_err("%s: send vdhe/vspe params failed with rc=%d\n", - __func__, rc); - rc = -EINVAL; - goto end; - } -end: - kfree(packed_param_data); - return rc; -} - -int qti_set_custom_stereo_on(int port_id, int copp_idx, - bool is_custom_stereo_on) -{ - struct custom_stereo_param custom_stereo; - struct param_hdr_v3 param_hdr; - uint16_t op_FL_ip_FL_weight; - uint16_t op_FL_ip_FR_weight; - uint16_t op_FR_ip_FL_weight; - uint16_t op_FR_ip_FR_weight; - int rc = 0; - - if ((port_id != SLIMBUS_0_RX) && - (port_id != RT_PROXY_PORT_001_RX)) { - pr_debug("%s:No Custom stereo for port:0x%x\n", - __func__, port_id); - return 0; - } - - memset(&custom_stereo, 0, sizeof(custom_stereo)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - pr_debug("%s: port 0x%x, copp_idx %d, is_custom_stereo_on %d\n", - __func__, port_id, copp_idx, is_custom_stereo_on); - if (is_custom_stereo_on) { - op_FL_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FL_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - } else { - op_FL_ip_FL_weight = Q14_GAIN_UNITY; - op_FL_ip_FR_weight = 0; - op_FR_ip_FL_weight = 0; - op_FR_ip_FR_weight = Q14_GAIN_UNITY; - } - - param_hdr.module_id = MTMX_MODULE_ID_DEFAULT_CHMIXER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DEFAULT_CHMIXER_PARAM_ID_COEFF; - param_hdr.param_size = sizeof(struct custom_stereo_param); - - /* index is 32-bit param in little endian*/ - custom_stereo.index = CUSTOM_STEREO_INDEX_PARAM; - custom_stereo.reserved = 0; - /* for stereo mixing num out ch*/ - custom_stereo.num_out_ch = CUSTOM_STEREO_NUM_OUT_CH; - /* for stereo mixing num in ch*/ - custom_stereo.num_in_ch = CUSTOM_STEREO_NUM_IN_CH; - - /* Out ch map FL/FR*/ - custom_stereo.out_fl = PCM_CHANNEL_FL; - custom_stereo.out_fr = PCM_CHANNEL_FR; - - /* In ch map FL/FR*/ - custom_stereo.in_fl = PCM_CHANNEL_FL; - custom_stereo.in_fr = PCM_CHANNEL_FR; - - /* weighting coefficients as name suggests, - * mixing will be done according to these coefficients - */ - custom_stereo.op_FL_ip_FL_weight = op_FL_ip_FL_weight; - custom_stereo.op_FL_ip_FR_weight = op_FL_ip_FR_weight; - custom_stereo.op_FR_ip_FL_weight = op_FR_ip_FL_weight; - custom_stereo.op_FR_ip_FR_weight = op_FR_ip_FR_weight; - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (u8 *) &custom_stereo); - if (rc) { - pr_err("%s: send params failed rc=%d\n", __func__, rc); - return -EINVAL; - } - - return 0; -} -static int dap_set_custom_stereo_onoff(int dev_map_idx, - bool is_custom_stereo_enabled) -{ - uint32_t enable = is_custom_stereo_enabled ? 1 : 0; - struct param_hdr_v3 param_hdr; - int rc = 0; - - if ((dev_map[dev_map_idx].port_id != SLIMBUS_0_RX) && - (dev_map[dev_map_idx].port_id != RT_PROXY_PORT_001_RX)) { - pr_debug("%s:No Custom stereo for port:0x%x\n", - __func__, dev_map[dev_map_idx].port_id); - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - rc = -EINVAL; - goto end; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* DAP custom stereo */ - msm_ds2_dap_set_vspe_vdhe(dev_map_idx, - is_custom_stereo_enabled); - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_ENABLE_CUSTOM_STEREO; - param_hdr.param_size = sizeof(enable); - - rc = adm_pack_and_set_one_pp_param(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - param_hdr, (u8 *) &enable); - if (rc) { - pr_err("%s: set custom stereo enable failed with rc=%d\n", - __func__, rc); - rc = -EINVAL; - } -end: - return rc; - -} - - -static int set_custom_stereo_onoff(int dev_map_idx, - bool is_custom_stereo_enabled) -{ - int rc = 0; - - pr_debug("%s: map index %d, custom stereo %d\n", __func__, dev_map_idx, - is_custom_stereo_enabled); - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port id\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: invalid copp idx\n", __func__); - rc = -EINVAL; - goto end; - } - - if (ds2_dap_params_states.dap_bypass == true && - ds2_dap_params_states.dap_bypass_type == DAP_HARD_BYPASS) { - - rc = qti_set_custom_stereo_on(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - is_custom_stereo_enabled); - if (rc < 0) { - pr_err("%s:qti_set_custom_stereo_on_copp failed C.S %d", - __func__, is_custom_stereo_enabled); - } - goto end; - - } - - if (ds2_dap_params_states.dap_bypass == false) { - rc = dap_set_custom_stereo_onoff(dev_map_idx, - is_custom_stereo_enabled); - if (rc < 0) { - pr_err("%s:qti_set_custom_stereo_on_copp failed C.S %d", - __func__, is_custom_stereo_enabled); - } - goto end; - } -end: - return rc; -} - -static int msm_ds2_dap_alloc_and_store_cal_data(int dev_map_idx, int path, - int perf_mode) -{ - int rc = 0; - struct audio_rx_cal_data *aud_cal_data; - - pr_debug("%s: path %d, perf_mode %d, dev_map_idx %d\n", - __func__, path, perf_mode, dev_map_idx); - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - aud_cal_data = kzalloc(sizeof(struct audio_rx_cal_data), GFP_KERNEL); - if (!aud_cal_data) { - rc = -ENOMEM; - goto end; - } - - rc = adm_store_cal_data(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, path, perf_mode, - ADM_AUDPROC_CAL, aud_cal_data->aud_proc_data, - &aud_cal_data->aud_proc_size); - if (rc < 0) { - pr_err("%s: store cal data err %d\n", __func__, rc); - kfree(aud_cal_data); - goto end; - } - - rc = adm_store_cal_data(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, path, perf_mode, - ADM_AUDVOL_CAL, aud_cal_data->aud_vol_data, - &aud_cal_data->aud_vol_size); - if (rc < 0) { - pr_err("%s: store cal data err %d\n", __func__, rc); - kfree(aud_cal_data); - goto end; - } - - dev_map[dev_map_idx].cal_data = (void *)aud_cal_data; - -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_ds2_dap_free_cal_data(int dev_map_idx) -{ - int rc = 0; - struct audio_rx_cal_data *aud_cal_data; - - pr_debug("%s: dev_map_idx %d\n", __func__, dev_map_idx); - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - aud_cal_data = (struct audio_rx_cal_data *) - dev_map[dev_map_idx].cal_data; - kfree(aud_cal_data); - dev_map[dev_map_idx].cal_data = NULL; - -end: - return rc; -} - -static int msm_ds2_dap_send_cal_data(int dev_map_idx) -{ - int rc = 0; - struct audio_rx_cal_data *aud_cal_data = NULL; - - pr_debug("%s: devmap index %d\n", __func__, dev_map_idx); - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - if (dev_map[dev_map_idx].cal_data == NULL) { - pr_err("%s: No valid calibration data stored for idx %d\n", - __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - /* send aud proc cal */ - aud_cal_data = (struct audio_rx_cal_data *) - dev_map[dev_map_idx].cal_data; - rc = adm_send_calibration(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - ADM_PATH_PLAYBACK, 0, - ADM_AUDPROC_CAL, - aud_cal_data->aud_proc_data, - aud_cal_data->aud_proc_size); - if (rc < 0) { - pr_err("%s: adm_send_calibration failed %d\n", __func__, rc); - goto end; - } - - /* send aud volume cal*/ - rc = adm_send_calibration(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - ADM_PATH_PLAYBACK, 0, - ADM_AUDVOL_CAL, - aud_cal_data->aud_vol_data, - aud_cal_data->aud_vol_size); - if (rc < 0) - pr_err("%s: adm_send_calibration failed %d\n", __func__, rc); -end: - pr_debug("%s: return %d\n", __func__, rc); - return rc; -} - -static inline int msm_ds2_dap_can_enable_module(int32_t module_id) -{ - if (module_id == MTMX_MODULE_ID_DEFAULT_CHMIXER || - module_id == AUDPROC_MODULE_ID_RESAMPLER || - module_id == AUDPROC_MODULE_ID_VOL_CTRL) { - return false; - } - return true; -} - -static int msm_ds2_dap_init_modules_in_topology(int dev_map_idx) -{ - int rc = 0, i = 0, port_id, copp_idx; - /* Account for 32 bit integer allocation */ - int32_t param_sz = - (ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH / sizeof(uint32_t)); - int32_t *update_param_val = NULL; - struct module_instance_info mod_inst_info; - int mod_inst_info_sz = 0; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - port_id = dev_map[dev_map_idx].port_id; - copp_idx = dev_map[dev_map_idx].copp_idx; - pr_debug("%s: port_id 0x%x copp_idx %d\n", __func__, port_id, copp_idx); - update_param_val = - kzalloc(ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, GFP_KERNEL); - if (!update_param_val) { - pr_err("%s, param memory alloc failed\n", __func__); - rc = -ENOMEM; - goto end; - } - - if (!ds2_dap_params_states.dap_bypass) { - /* get modules from dsp */ - rc = adm_get_pp_topo_module_list_v2( - port_id, copp_idx, - ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, - update_param_val); - if (rc < 0) { - pr_err("%s:topo list port %d, err %d,copp_idx %d\n", - __func__, port_id, copp_idx, rc); - goto end; - } - - if (update_param_val[0] > (param_sz - 1)) { - pr_err("%s:max modules exp/ret [%d: %d]\n", - __func__, (param_sz - 1), - update_param_val[0]); - rc = -EINVAL; - goto end; - } - - mod_inst_info_sz = sizeof(struct module_instance_info) / - sizeof(uint32_t); - /* Turn off modules */ - for (i = 1; i < update_param_val[0] * mod_inst_info_sz; - i += mod_inst_info_sz) { - if (!msm_ds2_dap_can_enable_module( - update_param_val[i]) || - (update_param_val[i] == DS2_MODULE_ID)) { - pr_debug("%s: Do not enable/disable %d\n", - __func__, update_param_val[i]); - continue; - } - - pr_debug("%s: param disable %d\n", - __func__, update_param_val[i]); - memcpy(&mod_inst_info, &update_param_val[i], - sizeof(mod_inst_info)); - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_DISABLE); - } - } else { - msm_ds2_dap_send_cal_data(dev_map_idx); - - } - - mod_inst_info.module_id = DS2_MODULE_ID; - mod_inst_info.instance_id = INSTANCE_ID_0; - adm_param_enable_v2(port_id, copp_idx, mod_inst_info, - !ds2_dap_params_states.dap_bypass); -end: - kfree(update_param_val); - return rc; -} - -static bool msm_ds2_dap_check_is_param_modified(int32_t *dap_params_modified, - int32_t idx, int32_t commit) -{ - if ((dap_params_modified[idx] == 0) || - (commit && - ((dap_params_modified[idx] & 0x00010000) && - ((dap_params_modified[idx] & 0x0000FFFF) <= 1)))) { - pr_debug("%s: not modified at idx %d\n", __func__, idx); - return false; - } - pr_debug("%s: modified at idx %d\n", __func__, idx); - return true; -} - -static int msm_ds2_dap_map_device_to_dolby_cache_devices(int32_t device_id) -{ - int32_t cache_dev = -1; - - switch (device_id) { - case DEVICE_NONE: - cache_dev = DOLBY_OFF_CACHE; - break; - case EARPIECE: - case SPEAKER: - cache_dev = DOLBY_SPEAKER_CACHE; - break; - case WIRED_HEADSET: - case WIRED_HEADPHONE: - case ANLG_DOCK_HEADSET: - case DGTL_DOCK_HEADSET: - case ANC_HEADSET: - case ANC_HEADPHONE: - case BLUETOOTH_SCO: - case BLUETOOTH_SCO_HEADSET: - case BLUETOOTH_SCO_CARKIT: - cache_dev = DOLBY_HEADPHONE_CACHE; - break; - case FM: - case FM_TX: - cache_dev = DOLBY_FM_CACHE; - break; - case AUX_DIGITAL: - cache_dev = DOLBY_HDMI_CACHE; - break; - case PROXY: - case REMOTE_SUBMIX: - cache_dev = DOLBY_WFD_CACHE; - break; - default: - pr_err("%s: invalid cache device\n", __func__); - } - pr_debug("%s: cache device %d\n", __func__, cache_dev); - return cache_dev; -} - -static int msm_ds2_dap_update_num_devices(struct dolby_param_data *dolby_data, - int32_t *num_device, int32_t *dev_arr, - int32_t array_size) -{ - int32_t idx = 0; - int supported_devices = 0; - - if (!array_size) { - pr_err("%s: array size zero\n", __func__); - return -EINVAL; - } - - if (dolby_data->device_id == DEVICE_OUT_ALL || - dolby_data->device_id == DEVICE_OUT_DEFAULT) - supported_devices = all_supported_devices; - else - supported_devices = dolby_data->device_id; - - if ((idx < array_size) && (supported_devices & EARPIECE)) - dev_arr[idx++] = EARPIECE; - if ((idx < array_size) && (supported_devices & SPEAKER)) - dev_arr[idx++] = SPEAKER; - if ((idx < array_size) && (supported_devices & WIRED_HEADSET)) - dev_arr[idx++] = WIRED_HEADSET; - if ((idx < array_size) && (supported_devices & WIRED_HEADPHONE)) - dev_arr[idx++] = WIRED_HEADPHONE; - if ((idx < array_size) && (supported_devices & BLUETOOTH_SCO)) - dev_arr[idx++] = BLUETOOTH_SCO; - if ((idx < array_size) && (supported_devices & BLUETOOTH_SCO_CARKIT)) - dev_arr[idx++] = BLUETOOTH_SCO_CARKIT; - if ((idx < array_size) && (supported_devices & BLUETOOTH_SCO_HEADSET)) - dev_arr[idx++] = BLUETOOTH_SCO_HEADSET; - if ((idx < array_size) && (supported_devices & AUX_DIGITAL)) - dev_arr[idx++] = AUX_DIGITAL; - if ((idx < array_size) && (supported_devices & ANLG_DOCK_HEADSET)) - dev_arr[idx++] = ANLG_DOCK_HEADSET; - if ((idx < array_size) && (supported_devices & DGTL_DOCK_HEADSET)) - dev_arr[idx++] = DGTL_DOCK_HEADSET; - if ((idx < array_size) && (supported_devices & REMOTE_SUBMIX)) - dev_arr[idx++] = REMOTE_SUBMIX; - if ((idx < array_size) && (supported_devices & ANC_HEADSET)) - dev_arr[idx++] = ANC_HEADSET; - if ((idx < array_size) && (supported_devices & ANC_HEADPHONE)) - dev_arr[idx++] = ANC_HEADPHONE; - if ((idx < array_size) && (supported_devices & PROXY)) - dev_arr[idx++] = PROXY; - if ((idx < array_size) && (supported_devices & FM)) - dev_arr[idx++] = FM; - if ((idx < array_size) && (supported_devices & FM_TX)) - dev_arr[idx++] = FM_TX; - /* CHECK device none separately */ - if ((idx < array_size) && (supported_devices == DEVICE_NONE)) - dev_arr[idx++] = DEVICE_NONE; - pr_debug("%s: dev id 0x%x, idx %d\n", __func__, - supported_devices, idx); - *num_device = idx; - return 0; -} - -static int msm_ds2_dap_get_port_id( - int32_t device_id, int32_t be_id) -{ - struct msm_pcm_routing_bdai_data bedais; - int port_id = DOLBY_INVALID_PORT_ID; - int port_type = 0; - - if (be_id < 0) { - port_id = -1; - goto end; - } - - msm_pcm_routing_get_bedai_info(be_id, &bedais); - pr_debug("%s: be port_id %d\n", __func__, bedais.port_id); - port_id = bedais.port_id; - port_type = afe_get_port_type(bedais.port_id); - if (port_type != MSM_AFE_PORT_TYPE_RX) - port_id = DOLBY_INVALID_PORT_ID; -end: - pr_debug("%s: device_id 0x%x, be_id %d, port_id %d\n", - __func__, device_id, be_id, port_id); - return port_id; -} - -static int msm_ds2_dap_update_dev_map_port_id(int32_t device_id, int port_id) -{ - int i; - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if (dev_map[i].device_id == device_id) - dev_map[i].port_id = port_id; - } - pr_debug("%s: port_id %d, device_id 0x%x\n", - __func__, port_id, device_id); - return 0; -} - -static int msm_ds2_dap_handle_bypass_wait(int port_id, int copp_idx, - int wait_time) -{ - int ret = 0; - - adm_set_wait_parameters(port_id, copp_idx); - msm_pcm_routing_release_lock(); - ret = adm_wait_timeout(port_id, copp_idx, wait_time); - msm_pcm_routing_acquire_lock(); - /* Reset the parameters if wait has timed out */ - if (ret == 0) - adm_reset_wait_parameters(port_id, copp_idx); - return ret; -} - -static int msm_ds2_dap_handle_bypass(struct dolby_param_data *dolby_data) -{ - int rc = 0, i = 0, j = 0; - /*Account for 32 bit integer allocation */ - int32_t param_sz = - (ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH / sizeof(uint32_t)); - int32_t *mod_list = NULL; - int port_id = 0, copp_idx = -1; - bool cs_onoff = ds2_dap_params_states.custom_stereo_onoff; - int ramp_wait = DOLBY_SOFT_VOLUME_PERIOD; - struct module_instance_info mod_inst_info; - int mod_inst_info_sz = 0; - - pr_debug("%s: bypass type %d bypass %d custom stereo %d\n", __func__, - ds2_dap_params_states.dap_bypass_type, - ds2_dap_params_states.dap_bypass, - ds2_dap_params_states.custom_stereo_onoff); - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - mod_list = - kzalloc(ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, GFP_KERNEL); - if (!mod_list) { - pr_err("%s: param memory alloc failed\n", __func__); - rc = -ENOMEM; - goto end; - } - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - pr_debug("%s: active dev %d\n", __func__, dev_map[i].active); - if (dev_map[i].active) { - port_id = dev_map[i].port_id; - copp_idx = dev_map[i].copp_idx; - - if (port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port\n", __func__); - rc = 0; - goto end; - } - - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = 0; - goto end; - } - - /* getmodules from dsp */ - rc = adm_get_pp_topo_module_list_v2( - port_id, copp_idx, - ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, - mod_list); - if (rc < 0) { - pr_err("%s:adm get topo list port %d", - __func__, port_id); - pr_err("copp_idx %d, err %d\n", - copp_idx, rc); - goto end; - } - if (mod_list[0] > (param_sz - 1)) { - pr_err("%s:max modules exp/ret [%d: %d]\n", - __func__, (param_sz - 1), - mod_list[0]); - rc = -EINVAL; - goto end; - } - /* - * get ramp parameters - * check for change in ramp parameters - * update ramp wait - */ - msm_ds2_dap_check_and_update_ramp_wait(port_id, - copp_idx, - &ramp_wait); - - /* Mute before switching modules */ - rc = adm_set_volume(port_id, copp_idx, - VOLUME_ZERO_GAIN); - if (rc < 0) { - /* - * Not Fatal can continue bypass operations. - * Do not need to block playback - */ - pr_info("%s :Set volume port_id %d", - __func__, port_id); - pr_info("copp_idx %d, error %d\n", - copp_idx, rc); - } - - rc = msm_ds2_dap_handle_bypass_wait(port_id, copp_idx, - (ramp_wait + - DOLBY_ADDITIONAL_RAMP_WAIT)); - if (rc == -EINTR) { - pr_info("%s:bypass interrupted-ignore,port %d", - __func__, port_id); - pr_info("copp_idx %d\n", copp_idx); - rc = 0; - continue; - } - - /* if dap bypass is set */ - if (ds2_dap_params_states.dap_bypass) { - /* Turn off dap module */ - mod_inst_info.module_id = DS2_MODULE_ID; - mod_inst_info.instance_id = INSTANCE_ID_0; - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_DISABLE); - /* - * If custom stereo is on at the time of bypass, - * switch off custom stereo on dap and turn on - * custom stereo on qti channel mixer. - */ - if (cs_onoff) { - rc = dap_set_custom_stereo_onoff(i, - !cs_onoff); - if (rc < 0) { - pr_info("%s:D_CS i %d,rc %d\n", - __func__, i, rc); - } - rc = qti_set_custom_stereo_on(port_id, - copp_idx, - cs_onoff); - if (rc < 0) { - pr_info("%s:Q_CS port id 0x%x", - __func__, port_id); - pr_info("copp idx %d, rc %d\n", - copp_idx, rc); - } - } - - mod_inst_info_sz = - sizeof(struct module_instance_info) / - sizeof(uint32_t); - /* Turn on qti modules */ - for (j = 1; j < mod_list[0] * mod_inst_info_sz; - j += mod_inst_info_sz) { - if (!msm_ds2_dap_can_enable_module( - mod_list[j]) || - mod_list[j] == - DS2_MODULE_ID) - continue; - pr_debug("%s: param enable %d\n", - __func__, mod_list[j]); - memcpy(&mod_inst_info, &mod_list[j], - sizeof(mod_inst_info)); - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_ENABLE); - } - - /* Add adm api to resend calibration on port */ - rc = msm_ds2_dap_send_cal_data(i); - if (rc < 0) { - /* - * Not fatal,continue bypass operations. - * Do not need to block playback - */ - pr_info("%s:send cal err %d index %d\n", - __func__, rc, i); - } - } else { - /* Turn off qti modules */ - for (j = 1; j < mod_list[0] * mod_inst_info_sz; - j += mod_inst_info_sz) { - if (!msm_ds2_dap_can_enable_module( - mod_list[j]) || - mod_list[j] == - DS2_MODULE_ID) - continue; - pr_debug("%s: param disable %d\n", - __func__, mod_list[j]); - memcpy(&mod_inst_info, &mod_list[j], - sizeof(mod_inst_info)); - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_DISABLE); - } - - /* Enable DAP modules */ - pr_debug("%s:DS2 param enable\n", __func__); - mod_inst_info.module_id = DS2_MODULE_ID; - mod_inst_info.instance_id = INSTANCE_ID_0; - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_ENABLE); - /* - * If custom stereo is on at the time of dap on, - * switch off custom stereo on qti channel mixer - * and turn on custom stereo on DAP. - * mixer(qti). - */ - if (cs_onoff) { - rc = qti_set_custom_stereo_on(port_id, - copp_idx, - !cs_onoff); - if (rc < 0) { - pr_info("%s:Q_CS port_id 0x%x", - __func__, port_id); - pr_info("copp_idx %d rc %d\n", - copp_idx, rc); - } - rc = dap_set_custom_stereo_onoff(i, - cs_onoff); - if (rc < 0) { - pr_info("%s:D_CS i %d,rc %d\n", - __func__, i, rc); - } - } - } - - rc = msm_ds2_dap_handle_bypass_wait(port_id, copp_idx, - DOLBY_MODULE_ENABLE_PERIOD); - if (rc == -EINTR) { - pr_info("%s:bypass interrupted port_id %d copp_idx %d\n", - __func__, port_id, copp_idx); - /* Interrupted ignore bypass */ - rc = 0; - continue; - } - - /* set volume to unity gain after module on/off */ - rc = adm_set_volume(port_id, copp_idx, - VOLUME_UNITY_GAIN); - if (rc < 0) { - /* - * Not Fatal can continue bypass operations. - * Do not need to block playback - */ - pr_info("%s: Set vol port %d copp %d, rc %d\n", - __func__, port_id, copp_idx, rc); - rc = 0; - } - } - } - -end: - kfree(mod_list); - pr_debug("%s:return rc=%d\n", __func__, rc); - return rc; -} - -static int msm_ds2_dap_send_end_point(int dev_map_idx, int endp_idx) -{ - uint32_t offset = 0; - struct param_hdr_v3 param_hdr; - int cache_device = 0; - struct ds2_dap_params_s *ds2_ap_params_obj = NULL; - int32_t *modified_param = NULL; - int rc = 0; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - cache_device = dev_map[dev_map_idx].cache_dev; - - ds2_ap_params_obj = &ds2_dap_params[cache_device]; - pr_debug("%s: cache dev %d, dev_map_idx %d\n", __func__, - cache_device, dev_map_idx); - pr_debug("%s: endp - %pK %pK\n", __func__, - &ds2_dap_params[cache_device], ds2_ap_params_obj); - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = -EINVAL; - goto end; - } - - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_INIT_ENDP; - param_hdr.param_size = sizeof(offset); - offset = ds2_ap_params_obj->params_val[ds2_dap_params_offset[endp_idx]]; - pr_debug("%s: off %d, length %d\n", __func__, - ds2_dap_params_offset[endp_idx], - ds2_dap_params_length[endp_idx]); - pr_debug("%s: param 0x%x, param val %d\n", __func__, - ds2_dap_params_id[endp_idx], ds2_ap_params_obj-> - params_val[ds2_dap_params_offset[endp_idx]]); - rc = adm_pack_and_set_one_pp_param(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - param_hdr, (u8 *) &offset); - if (rc) { - pr_err("%s: send dolby params failed rc %d\n", __func__, rc); - rc = -EINVAL; - } - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified param structure invalid\n", - __func__); - rc = -EINVAL; - goto end; - } - - if (msm_ds2_dap_check_is_param_modified(modified_param, endp_idx, 0)) - ds2_ap_params_obj->dap_params_modified[endp_idx] = 0x00010001; - -end: - return rc; -} - -static int msm_ds2_dap_send_cached_params(int dev_map_idx, - int commit) -{ - uint8_t *packed_params = NULL; - uint32_t packed_params_size = 0; - uint32_t param_size = 0; - struct param_hdr_v3 param_hdr; - uint32_t idx, i, ret = 0; - int cache_device = 0; - struct ds2_dap_params_s *ds2_ap_params_obj = NULL; - int32_t *modified_param = NULL; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - ret = -EINVAL; - goto end; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - cache_device = dev_map[dev_map_idx].cache_dev; - - /* Use off profile cache in only for soft bypass */ - if (ds2_dap_params_states.dap_bypass_type == DAP_SOFT_BYPASS && - ds2_dap_params_states.dap_bypass == true) { - pr_debug("%s: use bypass cache 0\n", __func__); - cache_device = dev_map[0].cache_dev; - } - - ds2_ap_params_obj = &ds2_dap_params[cache_device]; - pr_debug("%s: cached param - %pK %pK, cache_device %d\n", __func__, - &ds2_dap_params[cache_device], ds2_ap_params_obj, - cache_device); - - /* - * Allocate the max space needed. This is enough space to hold the - * header for each param plus the total size of all the params. - */ - packed_params_size = (sizeof(param_hdr) * (MAX_DS2_PARAMS - 1)) + - (TOTAL_LENGTH_DOLBY_PARAM * sizeof(uint32_t)); - packed_params = kzalloc(packed_params_size, GFP_KERNEL); - if (!packed_params) - return -ENOMEM; - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port id\n", __func__); - ret = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - ret = -EINVAL; - goto end; - } - - packed_params_size = 0; - for (i = 0; i < (MAX_DS2_PARAMS-1); i++) { - /*get the pointer to the param modified array in the cache*/ - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified param structure invalid\n", - __func__); - ret = -EINVAL; - goto end; - } - if (!msm_ds2_dap_check_is_param_modified(modified_param, i, - commit)) - continue; - - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = ds2_dap_params_id[i]; - param_hdr.param_size = - ds2_dap_params_length[i] * sizeof(uint32_t); - - idx = ds2_dap_params_offset[i]; - ret = q6common_pack_pp_params( - packed_params + packed_params_size, ¶m_hdr, - (u8 *) &ds2_ap_params_obj->params_val[idx], - ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, ret); - goto end; - } - - packed_params_size += param_size; - } - - pr_debug("%s: total packed param length: %d\n", __func__, - packed_params_size); - if (packed_params_size) { - ret = adm_set_pp_params(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, NULL, - packed_params, packed_params_size); - if (ret) { - pr_err("%s: send dolby params failed ret %d\n", - __func__, ret); - ret = -EINVAL; - goto end; - } - for (i = 0; i < MAX_DS2_PARAMS-1; i++) { - /*get pointer to the param modified array in the cache*/ - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified param struct invalid\n", - __func__); - ret = -EINVAL; - goto end; - } - if (!msm_ds2_dap_check_is_param_modified( - modified_param, i, commit)) - continue; - ds2_ap_params_obj->dap_params_modified[i] = 0x00010001; - } - } -end: - kfree(packed_params); - return ret; -} - -static int msm_ds2_dap_commit_params(struct dolby_param_data *dolby_data, - int commit) -{ - int ret = 0, i, idx; - struct ds2_dap_params_s *ds2_ap_params_obj = NULL; - int32_t *modified_param = NULL; - - /* Do not commit params if in hard bypass */ - if (ds2_dap_params_states.dap_bypass_type == DAP_HARD_BYPASS && - ds2_dap_params_states.dap_bypass == true) { - pr_debug("%s: called in bypass", __func__); - ret = -EINVAL; - goto end; - } - for (idx = 0; idx < MAX_DS2_PARAMS; idx++) { - if (ds2_dap_params_id[idx] == DOLBY_PARAM_ID_INIT_ENDP) - break; - } - if (idx >= MAX_DS2_PARAMS || idx < 0) { - pr_err("%s: index of DS2 Param not found idx %d\n", - __func__, idx); - ret = -EINVAL; - goto end; - } - pr_debug("%s: found endp - idx %d 0x%x\n", __func__, idx, - ds2_dap_params_id[idx]); - for (i = 0; i < DS2_DEVICES_ALL; i++) { - pr_debug("%s:dev[0x%x,0x%x],i:%d,active:%d,bypass:%d,type:%d\n", - __func__, dolby_data->device_id, dev_map[i].device_id, - i, dev_map[i].active, ds2_dap_params_states.dap_bypass, - ds2_dap_params_states.dap_bypass_type); - - if (((dev_map[i].device_id & ds2_dap_params_states.device) || - ((ds2_dap_params_states.dap_bypass_type == - DAP_SOFT_BYPASS) && - (ds2_dap_params_states.dap_bypass == true))) && - (dev_map[i].active == true)) { - - /*get ptr to the cache storing the params for device*/ - if ((ds2_dap_params_states.dap_bypass_type == - DAP_SOFT_BYPASS) && - (ds2_dap_params_states.dap_bypass == true)) - ds2_ap_params_obj = - &ds2_dap_params[dev_map[0].cache_dev]; - else - ds2_ap_params_obj = - &ds2_dap_params[dev_map[i].cache_dev]; - - /*get the pointer to the param modified array in cache*/ - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified_param NULL\n", __func__); - ret = -EINVAL; - goto end; - } - - /* - * Send the endp param if use cache is set - * or if param is modified - */ - if (!commit || msm_ds2_dap_check_is_param_modified( - modified_param, idx, commit)) { - msm_ds2_dap_send_end_point(i, idx); - commit = 0; - } - ret = msm_ds2_dap_send_cached_params(i, commit); - if (ret < 0) { - pr_err("%s: send cached param %d\n", - __func__, ret); - goto end; - } - } - } -end: - return ret; -} - -static int msm_ds2_dap_handle_commands(u32 cmd, void *arg) -{ - int ret = 0, port_id = 0; - int32_t data; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - - if (get_user(data, &dolby_data->data[0])) { - pr_debug("%s error getting data\n", __func__); - ret = -EFAULT; - goto end; - } - - pr_debug("%s: param_id %d,be_id %d,device_id 0x%x,length %d,data %d\n", - __func__, dolby_data->param_id, dolby_data->be_id, - dolby_data->device_id, dolby_data->length, data); - - switch (dolby_data->param_id) { - case DAP_CMD_COMMIT_ALL: - msm_ds2_dap_commit_params(dolby_data, 0); - break; - - case DAP_CMD_COMMIT_CHANGED: - msm_ds2_dap_commit_params(dolby_data, 1); - break; - - case DAP_CMD_USE_CACHE_FOR_INIT: - ds2_dap_params_states.use_cache = data; - break; - - case DAP_CMD_SET_BYPASS: - pr_debug("%s: bypass %d bypass type %d, data %d\n", __func__, - ds2_dap_params_states.dap_bypass, - ds2_dap_params_states.dap_bypass_type, - data); - /* Do not perform bypass operation if bypass state is same*/ - if (ds2_dap_params_states.dap_bypass == data) - break; - ds2_dap_params_states.dap_bypass = data; - /* hard bypass */ - if (ds2_dap_params_states.dap_bypass_type == DAP_HARD_BYPASS) - msm_ds2_dap_handle_bypass(dolby_data); - /* soft bypass */ - msm_ds2_dap_commit_params(dolby_data, 0); - break; - - case DAP_CMD_SET_BYPASS_TYPE: - if (data == true) - ds2_dap_params_states.dap_bypass_type = - DAP_HARD_BYPASS; - else - ds2_dap_params_states.dap_bypass_type = - DAP_SOFT_BYPASS; - pr_debug("%s: bypass type %d", __func__, - ds2_dap_params_states.dap_bypass_type); - break; - - case DAP_CMD_SET_ACTIVE_DEVICE: - pr_debug("%s: DAP_CMD_SET_ACTIVE_DEVICE length %d\n", - __func__, dolby_data->length); - /* TODO: need to handle multiple instance*/ - ds2_dap_params_states.device |= dolby_data->device_id; - port_id = msm_ds2_dap_get_port_id( - dolby_data->device_id, - dolby_data->be_id); - pr_debug("%s: device id 0x%x all_dev 0x%x port_id %d\n", - __func__, dolby_data->device_id, - ds2_dap_params_states.device, port_id); - msm_ds2_dap_update_dev_map_port_id(dolby_data->device_id, - port_id); - if (port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port id %d\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - break; - } -end: - return ret; - -} - -static int msm_ds2_dap_set_param(u32 cmd, void *arg) -{ - int rc = 0, idx, i, j, off, port_id = 0, cdev = 0; - int32_t num_device = 0; - int32_t data = 0; - int32_t dev_arr[DS2_DSP_SUPPORTED_ENDP_DEVICE] = {0}; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - - rc = msm_ds2_dap_update_num_devices(dolby_data, &num_device, dev_arr, - DS2_DSP_SUPPORTED_ENDP_DEVICE); - if (num_device == 0 || rc < 0) { - pr_err("%s: num devices 0\n", __func__); - rc = -EINVAL; - goto end; - } - for (i = 0; i < num_device; i++) { - port_id = msm_ds2_dap_get_port_id(dev_arr[i], - dolby_data->be_id); - if (port_id != DOLBY_INVALID_PORT_ID) - msm_ds2_dap_update_dev_map_port_id(dev_arr[i], port_id); - - cdev = msm_ds2_dap_map_device_to_dolby_cache_devices( - dev_arr[i]); - if (cdev < 0 || cdev >= DOLBY_MAX_CACHE) { - pr_err("%s: Invalid cache device %d for device 0x%x\n", - __func__, cdev, dev_arr[i]); - rc = -EINVAL; - goto end; - } - pr_debug("%s:port:%d,be:%d,dev:0x%x,cdev:%d,param:0x%x,len:%d\n" - , __func__, port_id, dolby_data->be_id, dev_arr[i], - cdev, dolby_data->param_id, dolby_data->length); - for (idx = 0; idx < MAX_DS2_PARAMS; idx++) { - /*paramid from user space*/ - if (dolby_data->param_id == ds2_dap_params_id[idx]) - break; - } - if (idx > MAX_DS2_PARAMS-1) { - pr_err("%s: invalid param id 0x%x at idx %d\n", - __func__, dolby_data->param_id, idx); - rc = -EINVAL; - goto end; - } - - off = ds2_dap_params_offset[idx]; - if ((dolby_data->length <= 0) || - (dolby_data->length > TOTAL_LENGTH_DS2_PARAM - off)) { - pr_err("%s: invalid length %d at idx %d\n", - __func__, dolby_data->length, idx); - rc = -EINVAL; - goto end; - } - - /* cache the parameters */ - ds2_dap_params[cdev].dap_params_modified[idx] += 1; - for (j = 0; j < dolby_data->length; j++) { - if (get_user(data, &dolby_data->data[j])) { - pr_debug("%s:error getting data\n", __func__); - rc = -EFAULT; - goto end; - } - ds2_dap_params[cdev].params_val[off + j] = data; - pr_debug("%s:off %d,val[i/p:o/p]-[%d / %d]\n", - __func__, off, data, - ds2_dap_params[cdev]. - params_val[off + j]); - } - } -end: - return rc; -} - -static int msm_ds2_dap_get_param(u32 cmd, void *arg) -{ - int rc = 0, i, port_id = 0, copp_idx = -1; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - int32_t *params_value = NULL; - uint32_t params_length = DOLBY_MAX_LENGTH_INDIVIDUAL_PARAM * - sizeof(uint32_t); - uint32_t param_payload_len = - DOLBY_PARAM_PAYLOAD_SIZE * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - - /* Return error on get param in soft or hard bypass */ - if (ds2_dap_params_states.dap_bypass == true) { - pr_err("%s: called in bypass_type %d bypass %d\n", __func__, - ds2_dap_params_states.dap_bypass_type, - ds2_dap_params_states.dap_bypass); - rc = -EINVAL; - goto end; - } - - /* Return if invalid length */ - if ((dolby_data->length > - (DOLBY_MAX_LENGTH_INDIVIDUAL_PARAM - DOLBY_PARAM_PAYLOAD_SIZE)) || - (dolby_data->length <= 0)) { - pr_err("Invalid length %d", dolby_data->length); - rc = -EINVAL; - goto end; - } - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].active) && - (dev_map[i].device_id & dolby_data->device_id)) { - port_id = dev_map[i].port_id; - copp_idx = dev_map[i].copp_idx; - break; - } - } - - if (port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: Invalid port\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = -EINVAL; - goto end; - } - - pr_debug("%s: port_id 0x%x, copp_idx %d, dev_map[i].device_id %x\n", - __func__, port_id, copp_idx, dev_map[i].device_id); - - params_value = kzalloc(params_length + param_payload_len, - GFP_KERNEL); - if (!params_value) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - if (dolby_data->param_id == DOLBY_PARAM_ID_VER) { - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_VER; - param_hdr.param_size = params_length + param_payload_len; - } else { - for (i = 0; i < MAX_DS2_PARAMS; i++) - if (ds2_dap_params_id[i] == - dolby_data->param_id) - break; - if (i > MAX_DS2_PARAMS-1) { - pr_err("%s: invalid param id 0x%x at id %d\n", __func__, - dolby_data->param_id, i); - rc = -EINVAL; - goto end; - } else { - params_length = - ds2_dap_params_length[i] * sizeof(uint32_t); - - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = ds2_dap_params_id[i]; - param_hdr.param_size = - params_length + param_payload_len; - } - } - rc = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, (u8 *) params_value); - if (rc) { - pr_err("%s: get parameters failed rc %d\n", __func__, rc); - rc = -EINVAL; - goto end; - } - if (copy_to_user((void __user *) dolby_data->data, - ¶ms_value[DOLBY_PARAM_PAYLOAD_SIZE], - (dolby_data->length * sizeof(uint32_t)))) { - pr_err("%s: error getting param\n", __func__); - rc = -EFAULT; - goto end; - } -end: - kfree(params_value); - return rc; -} - -static int msm_ds2_dap_param_visualizer_control_get(u32 cmd, void *arg) -{ - int32_t *visualizer_data = NULL; - int i = 0, ret = 0, port_id = -1, cache_dev = -1, copp_idx = -1; - int32_t *update_visualizer_data = NULL; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - uint32_t offset, length, params_length; - uint32_t param_payload_len = - DOLBY_PARAM_PAYLOAD_SIZE * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].active)) { - port_id = dev_map[i].port_id; - cache_dev = dev_map[i].cache_dev; - copp_idx = dev_map[i].copp_idx; - break; - } - } - - if (port_id == DOLBY_INVALID_PORT_ID || - (copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - ret = 0; - dolby_data->length = 0; - pr_err("%s: no device active\n", __func__); - goto end; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - length = ds2_dap_params[cache_dev].params_val[DOLBY_PARAM_VCNB_OFFSET]; - - if (length > DOLBY_PARAM_VCNB_MAX_LENGTH || length <= 0) { - ret = 0; - dolby_data->length = 0; - pr_err("%s Incorrect VCNB length", __func__); - return -EINVAL; - } - - params_length = (2*length + DOLBY_VIS_PARAM_HEADER_SIZE) * - sizeof(uint32_t); - - visualizer_data = kzalloc(params_length, GFP_KERNEL); - if (!visualizer_data) { - pr_err("%s: params memory alloc failed\n", __func__); - ret = -ENOMEM; - dolby_data->length = 0; - goto end; - } - memset(visualizer_data, 0x0, params_length); - - /* Return error on get param in soft or hard bypass */ - if (ds2_dap_params_states.dap_bypass == true) { - pr_debug("%s: visualizer called in bypass, return 0\n", - __func__); - ret = 0; - dolby_data->length = 0; - goto end; - } - - offset = 0; - params_length = length * sizeof(uint32_t); - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_VCBG; - param_hdr.param_size = length * sizeof(uint32_t) + param_payload_len; - ret = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, - (((char *) (visualizer_data)) + offset)); - if (ret) { - pr_err("%s: get parameters failed ret %d\n", __func__, ret); - ret = -EINVAL; - dolby_data->length = 0; - goto end; - } - offset = length * sizeof(uint32_t); - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_VCBE; - param_hdr.param_size = length * sizeof(uint32_t) + param_payload_len; - ret = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, - (((char *) (visualizer_data)) + offset)); - if (ret) { - pr_err("%s: get parameters failed ret %d\n", __func__, ret); - ret = -EINVAL; - dolby_data->length = 0; - goto end; - } - update_visualizer_data = visualizer_data; - dolby_data->length = 2 * length; - - if (copy_to_user((void *)dolby_data->data, - (void *)update_visualizer_data, - (dolby_data->length * sizeof(uint32_t)))) { - pr_err("%s: copy to user failed for data\n", __func__); - dolby_data->length = 0; - ret = -EFAULT; - goto end; - } - -end: - kfree(visualizer_data); - return ret; -} - -int msm_ds2_dap_set_security_control(u32 cmd, void *arg) -{ - struct dolby_param_license *dolby_license = - ((struct dolby_param_license *)arg); - pr_debug("%s: dmid %d license key %d\n", __func__, - dolby_license->dmid, dolby_license->license_key); - core_set_dolby_manufacturer_id(dolby_license->dmid); - core_set_license(dolby_license->license_key, DOLBY_DS1_LICENSE_ID); - return 0; -} - -int msm_ds2_dap_update_port_parameters(struct snd_hwdep *hw, struct file *file, - bool open) -{ - int i = 0, dev_id = 0; - - pr_debug("%s: open %d\n", __func__, open); - ds2_dap_params_states.node_opened = open; - ds2_dap_params_states.dap_bypass = true; - ds2_dap_params_states.dap_bypass_type = 0; - ds2_dap_params_states.use_cache = 0; - ds2_dap_params_states.device = 0; - ds2_dap_params_states.custom_stereo_onoff = 0; - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if (i == 0) - dev_map[i].device_id = 0; - else { - dev_id = (1 << (i-1)); - if (all_supported_devices & dev_id) - dev_map[i].device_id = dev_id; - else - continue; - } - dev_map[i].cache_dev = - msm_ds2_dap_map_device_to_dolby_cache_devices( - dev_map[i].device_id); - if (dev_map[i].cache_dev < 0 || - dev_map[i].cache_dev >= DOLBY_MAX_CACHE) - pr_err("%s: Invalid cache device %d for device 0x%x\n", - __func__, - dev_map[i].cache_dev, - dev_map[i].device_id); - dev_map[i].port_id = -1; - dev_map[i].active = false; - dev_map[i].stream_ref_count = 0; - dev_map[i].cal_data = NULL; - dev_map[i].copp_idx = -1; - pr_debug("%s: device_id 0x%x, cache_dev %d act %d\n", __func__, - dev_map[i].device_id, dev_map[i].cache_dev, - dev_map[i].active); - } - return 0; - -} - -int msm_ds2_dap_ioctl_shared(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - int ret = 0; - - pr_debug("%s: cmd: 0x%x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM: - ret = msm_ds2_dap_set_param(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM: - ret = msm_ds2_dap_get_param(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND: - ret = msm_ds2_dap_handle_commands(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE: - ret = msm_ds2_dap_set_security_control(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: - ret = msm_ds2_dap_param_visualizer_control_get(cmd, arg); - break; - default: - pr_err("%s: called with invalid control 0x%x\n", __func__, cmd); - ret = -EINVAL; - } - return ret; -} - -int msm_ds2_dap_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - - int ret = 0; - - pr_debug("%s: cmd: 0x%x\n", __func__, cmd); - if (!arg) { - pr_err("%s: Invalid params event status\n", __func__); - ret = -EINVAL; - goto end; - } - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND: { - struct dolby_param_data dolby_data; - - if (copy_from_user((void *)&dolby_data, (void *)arg, - sizeof(struct dolby_param_data))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE: { - struct dolby_param_license dolby_license; - - if (copy_from_user((void *)&dolby_license, (void *)arg, - sizeof(struct dolby_param_license))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_license); - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: { - struct dolby_param_data dolby_data; - - if (copy_from_user((void *)&dolby_data, (void *)arg, - sizeof(struct dolby_param_data))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - if (ret < 0) - pr_err("%s: ioctl cmd %d returned err %d\n", - __func__, cmd, ret); - if (copy_to_user((void *)arg, &dolby_data, - sizeof(struct dolby_param_data))) { - pr_err("%s: Copy to user failed\n", __func__); - ret = -EFAULT; - goto end; - } - break; - } - default: - pr_err("%s: called with invalid control 0x%x\n", __func__, cmd); - ret = -EINVAL; - } -end: - return ret; - -} -#ifdef CONFIG_COMPAT -int msm_ds2_dap_compat_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - int ret = 0; - - pr_debug("%s: cmd: 0x%x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM; - goto handle_set_ioctl; - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND; -handle_set_ioctl: - { - struct dolby_param_data32 dolby_data32; - struct dolby_param_data dolby_data; - - memset(&dolby_data32, 0, sizeof(dolby_data32)); - memset(&dolby_data, 0, sizeof(dolby_data)); - if (copy_from_user(&dolby_data32, (void *)arg, - sizeof(struct dolby_param_data32))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - dolby_data.version = dolby_data32.version; - dolby_data.device_id = dolby_data32.device_id; - dolby_data.be_id = dolby_data32.be_id; - dolby_data.param_id = dolby_data32.param_id; - dolby_data.length = dolby_data32.length; - dolby_data.data = compat_ptr(dolby_data32.data); - - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM; - goto handle_get_ioctl; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER; -handle_get_ioctl: - { - struct dolby_param_data32 dolby_data32; - struct dolby_param_data dolby_data; - - memset(&dolby_data32, 0, sizeof(dolby_data32)); - memset(&dolby_data, 0, sizeof(dolby_data)); - if (copy_from_user(&dolby_data32, (void *)arg, - sizeof(struct dolby_param_data32))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - dolby_data.version = dolby_data32.version; - dolby_data.device_id = dolby_data32.device_id; - dolby_data.be_id = dolby_data32.be_id; - dolby_data.param_id = dolby_data32.param_id; - dolby_data.length = dolby_data32.length; - dolby_data.data = compat_ptr(dolby_data32.data); - - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - if (ret < 0) - pr_err("%s: ioctl cmd %d, returned err %d\n", - __func__, cmd, ret); - dolby_data32.length = dolby_data.length; - if (copy_to_user((void *)arg, &dolby_data32, - sizeof(struct dolby_param_data32))) { - pr_err("%s: Copy to user failed\n", __func__); - ret = -EFAULT; - goto end; - } - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE32: { - struct dolby_param_license32 dolby_license32; - struct dolby_param_license dolby_license; - - cmd = SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE; - if (copy_from_user((void *)&dolby_license32, (void *)arg, - sizeof(struct dolby_param_license32))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - dolby_license.dmid = dolby_license32.dmid; - dolby_license.license_key = dolby_license32.license_key; - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_license); - break; - } - default: - pr_err("%s: called with invalid control 0x%x\n", - __func__, cmd); - ret = -EINVAL; - } -end: - return ret; - -} -#endif - -int msm_ds2_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on) -{ - int ret = 0, idx = -1, i; - struct dolby_param_data dolby_data; - - struct audproc_softvolume_params softvol = { - .period = DOLBY_SOFT_VOLUME_PERIOD, - .step = DOLBY_SOFT_VOLUME_STEP, - .rampingcurve = DOLBY_SOFT_VOLUME_CURVE_EXP, - }; - - pr_debug("%s: port id %d, copp_idx %d\n", __func__, port_id, copp_idx); - - if (port_id != DOLBY_INVALID_PORT_ID) { - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].port_id == port_id) && - /* device part of active device */ - (dev_map[i].device_id & - ds2_dap_params_states.device)) { - idx = i; - /* Give priority to headset in case of - * combo device - */ - if (dev_map[i].device_id == SPEAKER) - continue; - else - break; - } - } - if (idx < 0) { - pr_err("%s: invalid index for port %d\n", - __func__, port_id); - ret = -EINVAL; - goto end; - } - pr_debug("%s:index %d, dev[0x%x,0x%x]\n", __func__, idx, - dev_map[idx].device_id, ds2_dap_params_states.device); - dev_map[idx].active = true; - dev_map[idx].copp_idx = copp_idx; - dolby_data.param_id = DOLBY_COMMIT_ALL_TO_DSP; - dolby_data.length = 0; - dolby_data.data = NULL; - dolby_data.device_id = dev_map[idx].device_id; - pr_debug("%s: idx %d, active %d, dev id 0x%x, ref count %d\n", - __func__, idx, dev_map[idx].active, - dev_map[idx].device_id, - dev_map[idx].stream_ref_count); - if (dev_map[idx].stream_ref_count == 0) { - /*perform next 3 func only if hard bypass enabled*/ - if (ds2_dap_params_states.dap_bypass_type == - DAP_HARD_BYPASS) { - ret = msm_ds2_dap_alloc_and_store_cal_data(idx, - ADM_PATH_PLAYBACK, 0); - if (ret < 0) { - pr_err("%s: Failed to alloc and store cal data for idx %d, device %d, copp_idx %d", - __func__, - idx, dev_map[idx].device_id, - dev_map[idx].copp_idx); - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - goto end; - } - - ret = adm_set_softvolume(port_id, copp_idx, - &softvol); - if (ret < 0) { - pr_err("%s: Soft volume ret error %d\n", - __func__, ret); - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - goto end; - } - - ret = msm_ds2_dap_init_modules_in_topology( - idx); - if (ret < 0) { - pr_err("%s: Failed to init modules in topolofy for idx %d, device %d, copp_idx %d\n", - __func__, idx, - dev_map[idx].device_id, - dev_map[idx].copp_idx); - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - goto end; - } - } - - ret = msm_ds2_dap_commit_params(&dolby_data, 0); - if (ret < 0) { - pr_debug("%s: commit params ret %d\n", - __func__, ret); - ret = 0; - } - } - dev_map[idx].stream_ref_count++; - if (is_custom_stereo_on) { - ds2_dap_params_states.custom_stereo_onoff = - is_custom_stereo_on; - set_custom_stereo_onoff(idx, - is_custom_stereo_on); - } - } - -end: - return ret; -} - -void msm_ds2_dap_deinit(int port_id) -{ - /* - * Get the active port corrresponding to the active device - * Check if this is same as incoming port - * Set it to invalid - */ - int idx = -1, i; - - pr_debug("%s: port_id %d\n", __func__, port_id); - if (port_id != DOLBY_INVALID_PORT_ID) { - for (i = 0; i < DS2_DEVICES_ALL; i++) { - /* Active port */ - if ((dev_map[i].port_id == port_id) && - /* device part of active device */ - (dev_map[i].device_id & - ds2_dap_params_states.device) && - /* - * Need this check to avoid race condition of - * active device being set and playback - * instance opened - */ - /* active device*/ - dev_map[i].active) { - idx = i; - if (dev_map[i].device_id == SPEAKER) - continue; - else - break; - } - } - if (idx < 0) { - pr_err("%s: invalid index for port %d\n", - __func__, port_id); - return; - } - pr_debug("%s:index %d, dev [0x%x, 0x%x]\n", __func__, idx, - dev_map[idx].device_id, ds2_dap_params_states.device); - dev_map[idx].stream_ref_count--; - if (dev_map[idx].stream_ref_count == 0) { - /*perform next func only if hard bypass enabled*/ - if (ds2_dap_params_states.dap_bypass_type == - DAP_HARD_BYPASS) { - msm_ds2_dap_free_cal_data(idx); - } - ds2_dap_params_states.device &= ~dev_map[idx].device_id; - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - } - pr_debug("%s:idx %d, active %d, dev id 0x%x ref count %d\n", - __func__, idx, dev_map[idx].active, - dev_map[idx].device_id, dev_map[idx].stream_ref_count); - } -} - -int msm_ds2_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled) -{ - int idx = -1, rc = 0, i; - - pr_debug("%s: port_id %d\n", __func__, port_id); - if (port_id != DOLBY_INVALID_PORT_ID) { - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].port_id == port_id) && - /* device part of active device */ - (dev_map[i].device_id & - ds2_dap_params_states.device)) { - idx = i; - if (dev_map[i].device_id == SPEAKER) - continue; - else - break; - } - } - if (idx < 0) { - pr_err("%s: invalid index for port %d\n", - __func__, port_id); - return rc; - } - ds2_dap_params_states.custom_stereo_onoff = - is_custom_stereo_enabled; - rc = set_custom_stereo_onoff(idx, - is_custom_stereo_enabled); - if (rc < 0) { - pr_err("%s: Custom stereo err %d on port %d\n", - __func__, rc, port_id); - } - } - return rc; -} diff --git a/techpack/audio/4.0/asoc/msm-ds2-dap-config.h b/techpack/audio/4.0/asoc/msm-ds2-dap-config.h deleted file mode 100644 index 165dbe186070..000000000000 --- a/techpack/audio/4.0/asoc/msm-ds2-dap-config.h +++ /dev/null @@ -1,143 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2013-2014, 2017 The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_DS2_DAP_CONFIG_H_ -#define _MSM_DS2_DAP_CONFIG_H_ - -#include -#include "msm-dolby-common.h" -#include -#include - -#ifdef CONFIG_COMPAT -struct dolby_param_data32 { - s32 version; - s32 device_id; - s32 be_id; - s32 param_id; - s32 length; - compat_uptr_t data; -}; - -struct dolby_param_license32 { - compat_uptr_t dmid; - compat_uptr_t license_key; -}; - -#define SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM32\ - _IOWR('U', 0x10, struct dolby_param_data32) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM32\ - _IOR('U', 0x11, struct dolby_param_data32) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND32\ - _IOWR('U', 0x13, struct dolby_param_data32) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE32\ - _IOWR('U', 0x14, struct dolby_param_license32) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32\ - _IOR('U', 0x15, struct dolby_param_data32) -#endif - -#if defined(CONFIG_DOLBY_DS2) || defined(CONFIG_DOLBY_LICENSE) -/* DOLBY DOLBY GUIDS */ -#define DS2_MODULE_ID 0x00010775 - -#define DS2_DSP_SUPPORTED_ENDP_DEVICE 17 -#define DS2_DEVICES_ALL 32 /* enum val is 4 bytes */ - -enum { - - DAP_CMD_COMMIT_ALL = 0, - DAP_CMD_COMMIT_CHANGED = 1, - DAP_CMD_USE_CACHE_FOR_INIT = 2, - DAP_CMD_SET_BYPASS = 3, - DAP_CMD_SET_ACTIVE_DEVICE = 4, - DAP_CMD_SET_BYPASS_TYPE = 5, -}; - -struct custom_stereo_param { - /* Index is 32-bit param in little endian */ - u16 index; - u16 reserved; - - /* For stereo mixing, the number of out channels */ - u16 num_out_ch; - /* For stereo mixing, the number of in channels */ - u16 num_in_ch; - - /* Out channel map FL/FR*/ - u16 out_fl; - u16 out_fr; - - /* In channel map FL/FR*/ - u16 in_fl; - u16 in_fr; - - /* - * Weighting coefficients. Mixing will be done according to - * these coefficients. - */ - u16 op_FL_ip_FL_weight; - u16 op_FL_ip_FR_weight; - u16 op_FR_ip_FL_weight; - u16 op_FR_ip_FR_weight; -}; - -#define DOLBY_PARAM_INT_ENDP_LENGTH 1 -#define DOLBY_PARAM_INT_ENDP_OFFSET (DOLBY_PARAM_PSTG_OFFSET + \ - DOLBY_PARAM_PSTG_LENGTH) -#define MAX_DS2_PARAMS 48 -#define MAX_DS2_CTRL_PARAMS 4 -#define ALL_DS2_PARAMS (MAX_DS2_PARAMS + \ - MAX_DS2_CTRL_PARAMS) -#define TOTAL_LENGTH_DS2_PARAM (TOTAL_LENGTH_DOLBY_PARAM + 1) - -int msm_ds2_dap_update_port_parameters(struct snd_hwdep *hw, struct file *file, - bool open); -int msm_ds2_dap_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg); -int msm_ds2_dap_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - u32 cmd, void *arg); -int msm_ds2_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on); -void msm_ds2_dap_deinit(int port_id); -int msm_ds2_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled); -/* Dolby DOLBY end */ -#else - -static inline int msm_ds2_dap_update_port_parameters(struct snd_hwdep *hw, - struct file *file, - bool open) -{ - return 0; -} - -static inline int msm_ds2_dap_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - return 0; -} - -static inline int msm_ds2_dap_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - u32 cmd, void *arg) -{ - return 0; -} -static inline int msm_ds2_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on) -{ - return 0; -} - -static inline void msm_ds2_dap_deinit(int port_id) { } - -static inline int msm_ds2_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled) -{ - return 0; -} -#endif -#endif diff --git a/techpack/audio/4.0/asoc/msm-lsm-client.c b/techpack/audio/4.0/asoc/msm-lsm-client.c deleted file mode 100644 index d6fd86cc97a2..000000000000 --- a/techpack/audio/4.0/asoc/msm-lsm-client.c +++ /dev/null @@ -1,3207 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" - - -#define CAPTURE_MIN_NUM_PERIODS 2 -#define CAPTURE_MAX_NUM_PERIODS 8 -#define CAPTURE_MAX_PERIOD_SIZE 61440 -#define CAPTURE_MIN_PERIOD_SIZE 320 -#define LISTEN_MAX_STATUS_PAYLOAD_SIZE 256 - -#define WAKELOCK_TIMEOUT 2000 - -#define LAB_BUFFER_ALLOC 1 -#define LAB_BUFFER_DEALLOC 0 - -#define LSM_IS_LAST_STAGE(client, stage_idx) \ - (client->num_stages == (stage_idx + 1)) - -static struct snd_pcm_hardware msm_pcm_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .rate_min = 16000, - .rate_max = 48000, - .channels_min = LSM_INPUT_NUM_CHANNELS_MIN, - .channels_max = LSM_INPUT_NUM_CHANNELS_MAX, - .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * - CAPTURE_MAX_PERIOD_SIZE, - .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE, - .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE, - .periods_min = CAPTURE_MIN_NUM_PERIODS, - .periods_max = CAPTURE_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 16000, 48000, -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -struct lsm_priv { - struct snd_pcm_substream *substream; - struct lsm_client *lsm_client; - struct snd_lsm_event_status_v3 *event_status; - struct snd_lsm_event_status *det_event; - spinlock_t event_lock; - wait_queue_head_t event_wait; - unsigned long event_avail; - atomic_t event_wait_stop; - atomic_t buf_count; - atomic_t read_abort; - wait_queue_head_t period_wait; - struct mutex lsm_api_lock; - int appl_cnt; - int dma_write; - int xrun_count; - int xrun_index; - spinlock_t xrun_lock; - struct wakeup_source ws; -}; - -enum { /* lsm session states */ - IDLE = 0, - RUNNING, -}; - -static int msm_lsm_queue_lab_buffer(struct lsm_priv *prtd, int i) -{ - int rc = 0; - struct lsm_cmd_read cmd_read; - struct snd_soc_pcm_runtime *rtd; - - if (!prtd || !prtd->lsm_client) { - pr_err("%s: Invalid params prtd %pK lsm client %pK\n", - __func__, prtd, ((!prtd) ? NULL : prtd->lsm_client)); - return -EINVAL; - } - if (!prtd->substream || !prtd->substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!prtd->substream) ? "substream" : "private_data"); - return -EINVAL; - } - rtd = prtd->substream->private_data; - - if (!prtd->lsm_client->lab_buffer || - i >= prtd->lsm_client->out_hw_params.period_count) { - dev_err(rtd->dev, - "%s: Lab buffer not setup %pK incorrect index %d period count %d\n", - __func__, prtd->lsm_client->lab_buffer, i, - prtd->lsm_client->out_hw_params.period_count); - return -EINVAL; - } - cmd_read.buf_addr_lsw = - lower_32_bits(prtd->lsm_client->lab_buffer[i].phys); - cmd_read.buf_addr_msw = - msm_audio_populate_upper_32_bits( - prtd->lsm_client->lab_buffer[i].phys); - cmd_read.buf_size = prtd->lsm_client->lab_buffer[i].size; - cmd_read.mem_map_handle = - prtd->lsm_client->lab_buffer[i].mem_map_handle; - rc = q6lsm_read(prtd->lsm_client, &cmd_read); - if (rc) - dev_err(rtd->dev, - "%s: error in queuing the lab buffer rc %d\n", - __func__, rc); - return rc; -} - -static int lsm_lab_buffer_sanity(struct lsm_priv *prtd, - struct lsm_cmd_read_done *read_done, int *index) -{ - int i = 0, rc = -EINVAL; - struct snd_soc_pcm_runtime *rtd; - - if (!prtd || !read_done || !index) { - pr_err("%s: Invalid params prtd %pK read_done %pK index %pK\n", - __func__, prtd, read_done, index); - return -EINVAL; - } - - if (!prtd->substream || !prtd->substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!prtd->substream) ? "substream" : "private_data"); - return -EINVAL; - } - rtd = prtd->substream->private_data; - - if (!prtd->lsm_client->lab_enable || !prtd->lsm_client->lab_buffer) { - dev_err(rtd->dev, - "%s: Lab not enabled %d invalid lab buffer %pK\n", - __func__, prtd->lsm_client->lab_enable, - prtd->lsm_client->lab_buffer); - return -EINVAL; - } - for (i = 0; i < prtd->lsm_client->out_hw_params.period_count; i++) { - if ((lower_32_bits(prtd->lsm_client->lab_buffer[i].phys) == - read_done->buf_addr_lsw) && - (msm_audio_populate_upper_32_bits - (prtd->lsm_client->lab_buffer[i].phys) == - read_done->buf_addr_msw) && - (prtd->lsm_client->lab_buffer[i].mem_map_handle == - read_done->mem_map_handle)) { - dev_dbg(rtd->dev, - "%s: Buffer found %pK memmap handle %d\n", - __func__, &prtd->lsm_client->lab_buffer[i].phys, - prtd->lsm_client->lab_buffer[i].mem_map_handle); - if (read_done->total_size > - prtd->lsm_client->lab_buffer[i].size) { - dev_err(rtd->dev, - "%s: Size mismatch call back size %d actual size %zd\n", - __func__, read_done->total_size, - prtd->lsm_client->lab_buffer[i].size); - rc = -EINVAL; - break; - } else { - *index = i; - rc = 0; - break; - } - } - } - return rc; -} - -static void lsm_event_handler(uint32_t opcode, uint32_t token, - uint32_t *payload, uint16_t client_size, - void *priv) -{ - unsigned long flags; - struct lsm_priv *prtd = priv; - struct snd_pcm_substream *substream = prtd->substream; - struct snd_soc_pcm_runtime *rtd; - struct snd_lsm_event_status_v3 *temp; - uint16_t status = 0; - uint16_t payload_size = 0; - uint16_t index = 0; - uint32_t event_ts_lsw = 0; - uint32_t event_ts_msw = 0; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return; - } - rtd = substream->private_data; - - pm_wakeup_ws_event(&prtd->ws, WAKELOCK_TIMEOUT, true); - dev_dbg(rtd->dev, "%s: opcode %x\n", __func__, opcode); - switch (opcode) { - case LSM_DATA_EVENT_READ_DONE: { - int rc; - struct lsm_cmd_read_done *read_done = (struct lsm_cmd_read_done *)payload; - int buf_index = 0; - unsigned long flags = 0; - - if (prtd->lsm_client->session != token || - !read_done) { - dev_err(rtd->dev, - "%s: EVENT_READ_DONE invalid callback, session %d callback %d payload %pK", - __func__, prtd->lsm_client->session, - token, read_done); - __pm_relax(&prtd->ws); - return; - } - if (atomic_read(&prtd->read_abort)) { - dev_dbg(rtd->dev, - "%s: read abort set skip data\n", __func__); - __pm_relax(&prtd->ws); - return; - } - if (!lsm_lab_buffer_sanity(prtd, read_done, &buf_index)) { - dev_dbg(rtd->dev, - "%s: process read done index %d\n", - __func__, buf_index); - if (buf_index >= - prtd->lsm_client->out_hw_params.period_count) { - dev_err(rtd->dev, - "%s: Invalid index %d buf_index max cnt %d\n", - __func__, buf_index, - prtd->lsm_client->out_hw_params.period_count); - __pm_relax(&prtd->ws); - return; - } - spin_lock_irqsave(&prtd->xrun_lock, flags); - prtd->dma_write += read_done->total_size; - atomic_inc(&prtd->buf_count); - snd_pcm_period_elapsed(substream); - wake_up(&prtd->period_wait); - if (atomic_read(&prtd->buf_count) < - prtd->lsm_client->out_hw_params.period_count) { - /* queue the next period buffer */ - buf_index = (buf_index + 1) % - prtd->lsm_client->out_hw_params.period_count; - rc = msm_lsm_queue_lab_buffer(prtd, buf_index); - if (rc) - dev_err(rtd->dev, - "%s: error in queuing the lab buffer rc %d\n", - __func__, rc); - } else { - dev_dbg(rtd->dev, - "%s: xrun: further lab to be queued after read from user\n", - __func__); - if (!prtd->xrun_count) - prtd->xrun_index = buf_index; - (prtd->xrun_count)++; - } - spin_unlock_irqrestore(&prtd->xrun_lock, flags); - } else - dev_err(rtd->dev, "%s: Invalid lab buffer returned by dsp\n", - __func__); - break; - } - - case LSM_SESSION_EVENT_DETECTION_STATUS: - if (client_size < 3 * sizeof(uint8_t)) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - __pm_relax(&prtd->ws); - return; - } - status = (uint16_t)((uint8_t *)payload)[0]; - payload_size = (uint16_t)((uint8_t *)payload)[2]; - index = 4; - dev_dbg(rtd->dev, - "%s: event detect status = %d payload size = %d\n", - __func__, status, payload_size); - break; - - case LSM_SESSION_EVENT_DETECTION_STATUS_V2: - if (client_size < 2 * sizeof(uint8_t)) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - __pm_relax(&prtd->ws); - return; - } - status = (uint16_t)((uint8_t *)payload)[0]; - payload_size = (uint16_t)((uint8_t *)payload)[1]; - index = 2; - dev_dbg(rtd->dev, - "%s: event detect status_v2 = %d payload size = %d\n", - __func__, status, payload_size); - break; - - case LSM_SESSION_EVENT_DETECTION_STATUS_V3: - if (client_size < 2 * (sizeof(uint32_t) + sizeof(uint8_t))) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - __pm_relax(&prtd->ws); - return; - } - event_ts_lsw = ((uint32_t *)payload)[0]; - event_ts_msw = ((uint32_t *)payload)[1]; - status = (uint16_t)((uint8_t *)payload)[8]; - payload_size = (uint16_t)((uint8_t *)payload)[9]; - index = 10; - dev_dbg(rtd->dev, - "%s: ts_msw = %u, ts_lsw = %u, event detect status = %d payload size = %d\n", - __func__, event_ts_msw, event_ts_lsw, status, - payload_size); - break; - - case LSM_SESSION_DETECTION_ENGINE_GENERIC_EVENT: { - struct snd_lsm_event_status *tmp; - if (client_size < 2 * sizeof(uint16_t)) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - __pm_relax(&prtd->ws); - return; - } - - - status = ((uint16_t *)payload)[0]; - payload_size = ((uint16_t *)payload)[1]; - - spin_lock_irqsave(&prtd->event_lock, flags); - tmp = krealloc(prtd->det_event, - sizeof(struct snd_lsm_event_status) + - payload_size, GFP_ATOMIC); - if (!tmp) { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Failed to allocate memory for %s, size = %zu\n", - __func__, - "LSM_SESSION_DETECTION_ENGINE_GENERIC_EVENT", - sizeof(struct snd_lsm_event_status) + - payload_size); - __pm_relax(&prtd->ws); - return; - } - - prtd->det_event = tmp; - prtd->det_event->status = status; - prtd->det_event->payload_size = payload_size; - if (client_size >= payload_size + 4) { - memcpy(prtd->det_event->payload, - &((uint8_t *)payload)[4], payload_size); - } else { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Failed to copy memory with invalid size = %d\n", - __func__, payload_size); - __pm_relax(&prtd->ws); - return; - } - prtd->event_avail = 1; - spin_unlock_irqrestore(&prtd->event_lock, flags); - wake_up(&prtd->event_wait); - - if (substream->timer_running) - snd_timer_interrupt(substream->timer, 1); - - dev_dbg(rtd->dev, - "%s: Generic det event status = %d payload size = %d\n", - __func__, prtd->det_event->status, - prtd->det_event->payload_size); - break; - } - - default: - break; - } - - if (opcode == LSM_SESSION_EVENT_DETECTION_STATUS || - opcode == LSM_SESSION_EVENT_DETECTION_STATUS_V2 || - opcode == LSM_SESSION_EVENT_DETECTION_STATUS_V3) { - spin_lock_irqsave(&prtd->event_lock, flags); - dev_dbg(rtd->dev, "%s: detection status\n", __func__); - temp = krealloc(prtd->event_status, - sizeof(struct snd_lsm_event_status_v3) + - payload_size, GFP_ATOMIC); - if (!temp) { - dev_err(rtd->dev, "%s: no memory for event status\n", - __func__); - __pm_relax(&prtd->ws); - return; - } - /* - * event status timestamp will be non-zero and valid if - * opcode is LSM_SESSION_EVENT_DETECTION_STATUS_V3 - */ - prtd->event_status = temp; - prtd->event_status->timestamp_lsw = event_ts_lsw; - prtd->event_status->timestamp_msw = event_ts_msw; - prtd->event_status->status = status; - prtd->event_status->payload_size = payload_size; - - if (likely(prtd->event_status)) { - if (client_size >= (payload_size + index)) { - memcpy(prtd->event_status->payload, - &((uint8_t *)payload)[index], - payload_size); - prtd->event_avail = 1; - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_dbg(rtd->dev, "%s: wakeup event_wait\n", - __func__); - wake_up(&prtd->event_wait); - } else { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Failed to copy memory with invalid size = %d\n", - __func__, payload_size); - __pm_relax(&prtd->ws); - return; - } - } else { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Couldn't allocate %d bytes of memory\n", - __func__, payload_size); - } - if (substream->timer_running) - snd_timer_interrupt(substream->timer, 1); - } - dev_dbg(rtd->dev, "%s: leave\n", __func__); -} - -static int msm_lsm_lab_buffer_alloc(struct lsm_priv *lsm, int alloc) -{ - int ret = 0; - struct snd_dma_buffer *dma_buf = NULL; - - if (!lsm) { - pr_err("%s: Invalid param lsm %pK\n", __func__, lsm); - return -EINVAL; - } - if (alloc) { - if (!lsm->substream) { - pr_err("%s: substream is NULL\n", __func__); - return -EINVAL; - } - ret = q6lsm_lab_buffer_alloc(lsm->lsm_client, alloc); - if (ret) { - pr_err("%s: alloc lab buffer failed ret %d\n", - __func__, ret); - goto exit; - } - dma_buf = &lsm->substream->dma_buffer; - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = lsm->substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = lsm->lsm_client->lab_buffer[0].data; - dma_buf->addr = lsm->lsm_client->lab_buffer[0].phys; - dma_buf->bytes = lsm->lsm_client->out_hw_params.buf_sz * - lsm->lsm_client->out_hw_params.period_count; - snd_pcm_set_runtime_buffer(lsm->substream, dma_buf); - } else { - ret = q6lsm_lab_buffer_alloc(lsm->lsm_client, alloc); - if (ret) - pr_err("%s: free lab buffer failed ret %d\n", - __func__, ret); - kfree(lsm->lsm_client->lab_buffer); - lsm->lsm_client->lab_buffer = NULL; - } -exit: - return ret; -} - -static int msm_lsm_get_conf_levels(struct lsm_client *client, - u8 *conf_levels_ptr) -{ - int rc = 0; - - if (client->num_confidence_levels == 0) { - pr_debug("%s: no confidence levels provided\n", - __func__); - client->confidence_levels = NULL; - goto done; - } - - client->confidence_levels = - kzalloc((sizeof(uint8_t) * client->num_confidence_levels), - GFP_KERNEL); - if (!client->confidence_levels) { - pr_err("%s: No memory for confidence\n" - "levels num of level from user = %d\n", - __func__, client->num_confidence_levels); - rc = -ENOMEM; - goto done; - } - - if (copy_from_user(client->confidence_levels, - conf_levels_ptr, - client->num_confidence_levels)) { - pr_err("%s: copy from user failed, size = %d\n", - __func__, client->num_confidence_levels); - rc = -EFAULT; - goto copy_err; - } - - return rc; - -copy_err: - kfree(client->confidence_levels); - client->confidence_levels = NULL; -done: - return rc; - -} - -static int msm_lsm_set_epd(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - struct snd_lsm_ep_det_thres epd_th; - - if (p_info->param_size != sizeof(epd_th)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&epd_th, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &epd_th, LSM_ENDPOINT_DETECT_THRESHOLD); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set epd param, err = %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_lsm_set_mode(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_detect_mode mode; - int rc = 0; - - if (p_info->param_size != sizeof(mode)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&mode, p_info->param_data, - sizeof(mode))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(mode)); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &mode, LSM_OPERATION_MODE); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set det_mode param, err = %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_lsm_set_gain(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_gain gain; - int rc = 0; - - if (p_info->param_size != sizeof(gain)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&gain, p_info->param_data, - sizeof(gain))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(gain)); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &gain, LSM_GAIN); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set det_mode param, err = %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_lsm_set_conf(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (p_info->param_size > MAX_NUM_CONFIDENCE) { - dev_err(rtd->dev, - "%s: invalid confidence levels %d\n", - __func__, p_info->param_size); - return -EINVAL; - } - - prtd->lsm_client->num_confidence_levels = - p_info->param_size; - rc = msm_lsm_get_conf_levels(prtd->lsm_client, - p_info->param_data); - if (rc) { - dev_err(rtd->dev, - "%s: get_conf_levels failed, err = %d\n", - __func__, rc); - return rc; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - prtd->lsm_client->confidence_levels, - LSM_MIN_CONFIDENCE_LEVELS); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set min_conf_levels, err = %d\n", - __func__, rc); - - if (prtd->lsm_client->confidence_levels) { - kfree(prtd->lsm_client->confidence_levels); - prtd->lsm_client->confidence_levels = NULL; - } - return rc; -} - -static int msm_lsm_reg_model(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - struct lsm_sound_model *sm = NULL; - size_t offset = sizeof(union param_hdrs); - - rc = q6lsm_snd_model_buf_alloc(prtd->lsm_client, - p_info->param_size, p_info); - if (rc) { - dev_err(rtd->dev, - "%s: snd_model buf alloc failed, size = %d\n", - __func__, p_info->param_size); - return rc; - } - - q6lsm_sm_set_param_data(prtd->lsm_client, p_info, &offset); - - /* - * For set_param, advance the sound model data with the - * number of bytes required by param_data. - */ - - sm = &prtd->lsm_client->stage_cfg[p_info->stage_idx].sound_model; - if (copy_from_user((u8 *)sm->data + offset, - p_info->param_data, p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user for snd_model failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto err_copy; - } - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, NULL, - LSM_REG_SND_MODEL); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to set sound_model, err = %d\n", - __func__, rc); - goto err_copy; - } - return rc; - -err_copy: - q6lsm_snd_model_buf_free(prtd->lsm_client, p_info); - return rc; -} - -static int msm_lsm_dereg_model(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - NULL, LSM_DEREG_SND_MODEL); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set det_mode param, err = %d\n", - __func__, rc); - - q6lsm_snd_model_buf_free(prtd->lsm_client, p_info); - - return rc; -} - -static int msm_lsm_set_custom(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - u8 *data; - int rc = 0; - - data = kzalloc(p_info->param_size, GFP_KERNEL); - if (!data) - return -ENOMEM; - - if (copy_from_user(data, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for custom params, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto err_ret; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - data, LSM_CUSTOM_PARAMS); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set custom param, err = %d\n", - __func__, rc); - -err_ret: - kfree(data); - return rc; -} - -static int msm_lsm_check_and_set_lab_controls(struct snd_pcm_substream *substream, - u32 enable, struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct lsm_hw_params *out_hw_params = &prtd->lsm_client->out_hw_params; - u8 *chmap = NULL; - u32 ch_idx; - int rc = 0, stage_idx = p_info->stage_idx; - - if (prtd->lsm_client->stage_cfg[stage_idx].lab_enable == enable) { - dev_dbg(rtd->dev, "%s: Lab for session %d, stage %d already %s\n", - __func__, prtd->lsm_client->session, - stage_idx, enable ? "enabled" : "disabled"); - return rc; - } - - chmap = kzalloc(out_hw_params->num_chs, GFP_KERNEL); - if (!chmap) - return -ENOMEM; - - rc = q6lsm_lab_control(prtd->lsm_client, enable, p_info); - if (rc) { - dev_err(rtd->dev, "%s: Failed to set lab_control param, err = %d\n", - __func__, rc); - goto fail; - } else { - if (LSM_IS_LAST_STAGE(prtd->lsm_client, stage_idx)) { - rc = msm_lsm_lab_buffer_alloc(prtd, - enable ? LAB_BUFFER_ALLOC : LAB_BUFFER_DEALLOC); - if (rc) { - dev_err(rtd->dev, - "%s: msm_lsm_lab_buffer_alloc failed rc %d for %s\n", - __func__, rc, enable ? "ALLOC" : "DEALLOC"); - goto fail; - } else { - /* set client level flag based on last stage control */ - prtd->lsm_client->lab_enable = enable; - } - } - if (!rc) - prtd->lsm_client->stage_cfg[stage_idx].lab_enable = enable; - } - - /* - * First channel to be read from lab is always the - * best channel (0xff). For second channel onwards, - * the channel indices are 0, 1, .. etc - */ - chmap[0] = 0xFF; - for (ch_idx = 1; ch_idx < out_hw_params->num_chs; ch_idx++) - chmap[ch_idx] = ch_idx - 1; - - rc = q6lsm_lab_out_ch_cfg(prtd->lsm_client, chmap, p_info); - if (rc) - dev_err(rtd->dev, "%s: Failed to set lab out ch cfg %d\n", - __func__, rc); - -fail: - kfree(chmap); - return rc; -} - -static int msm_lsm_set_lab_control(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_lab_control lab_ctrl; - int rc = 0; - - if (p_info->param_size != sizeof(lab_ctrl)) - return -EINVAL; - - if (prtd->lsm_client->started) { - dev_err(rtd->dev, "%s: lab control sent after start\n", __func__); - return -EAGAIN; - } - - if (copy_from_user(&lab_ctrl, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for lab_control params, size = %d\n", - __func__, p_info->param_size); - return -EFAULT; - } - - rc = msm_lsm_check_and_set_lab_controls(substream, lab_ctrl.enable, p_info); - return rc; -} - -static int msm_lsm_set_poll_enable(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_poll_enable poll_enable; - int rc = 0; - - if (p_info->param_size != sizeof(poll_enable)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&poll_enable, p_info->param_data, - sizeof(poll_enable))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(poll_enable)); - rc = -EFAULT; - goto done; - } - - if (prtd->lsm_client->poll_enable == poll_enable.poll_en) { - dev_dbg(rtd->dev, - "%s: Polling for session %d already %s\n", - __func__, prtd->lsm_client->session, - (poll_enable.poll_en ? "enabled" : "disabled")); - rc = 0; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &poll_enable, LSM_POLLING_ENABLE); - if (!rc) { - prtd->lsm_client->poll_enable = poll_enable.poll_en; - } else { - dev_err(rtd->dev, - "%s: Failed to set poll enable, err = %d\n", - __func__, rc); - } -done: - return rc; -} - -static int msm_lsm_set_det_event_type(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_lsm_det_event_type det_event_type; - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (p_info->param_size != sizeof(det_event_type)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&det_event_type, p_info->param_data, - sizeof(det_event_type))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(det_event_type)); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &det_event_type, LSM_DET_EVENT_TYPE); - if (!rc) - prtd->lsm_client->event_type = det_event_type.event_type; - else - dev_err(rtd->dev, - "%s: Failed to set detection event type %s, err = %d\n", - __func__, (det_event_type.event_type ? - "LSM_DET_EVENT_TYPE_GENERIC" : - "LSM_DET_EVENT_TYPE_LEGACY"), rc); -done: - return rc; -} - -static int msm_lsm_process_params(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - dev_dbg(rtd->dev, - "%s: mid=0x%x, pid=0x%x, iid=0x%x, stage_idx=%d, size=0x%x, type=%d\n", - __func__, p_info->module_id, p_info->param_id, p_info->instance_id, - p_info->stage_idx, p_info->param_size, p_info->param_type); - - if (!prtd->lsm_client || - prtd->lsm_client->num_stages <= p_info->stage_idx) { - dev_err(rtd->dev, - "%s: invalid stage_idx(%d) for client(%p) having num_stages(%d)\n", - __func__, p_info->stage_idx, prtd->lsm_client, - prtd->lsm_client ? prtd->lsm_client->num_stages : 0); - return -EINVAL; - } - - switch (p_info->param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: - rc = msm_lsm_set_epd(substream, p_info); - break; - case LSM_OPERATION_MODE: - rc = msm_lsm_set_mode(substream, p_info); - break; - case LSM_GAIN: - rc = msm_lsm_set_gain(substream, p_info); - break; - case LSM_MIN_CONFIDENCE_LEVELS: - rc = msm_lsm_set_conf(substream, p_info); - break; - case LSM_REG_SND_MODEL: - rc = msm_lsm_reg_model(substream, p_info); - break; - case LSM_DEREG_SND_MODEL: - rc = msm_lsm_dereg_model(substream, p_info); - break; - case LSM_CUSTOM_PARAMS: - rc = msm_lsm_set_custom(substream, p_info); - break; - case LSM_POLLING_ENABLE: - rc = msm_lsm_set_poll_enable(substream, p_info); - break; - case LSM_DET_EVENT_TYPE: - rc = msm_lsm_set_det_event_type(substream, p_info); - break; - case LSM_LAB_CONTROL: - rc = msm_lsm_set_lab_control(substream, p_info); - break; - default: - dev_err(rtd->dev, - "%s: Invalid param_type %d\n", - __func__, p_info->param_type); - rc = -EINVAL; - break; - } - if (rc) { - pr_err("%s: set_param fail for param_type %d\n", - __func__, p_info->param_type); - } - - return rc; -} - -static int msm_lsm_start_lab_buffer(struct lsm_priv *prtd, uint16_t status) -{ - struct lsm_client *lsm_client = prtd->lsm_client; - int rc = 0; - - if (lsm_client && lsm_client->lab_enable && - !lsm_client->lab_started && - status == LSM_VOICE_WAKEUP_STATUS_DETECTED) { - atomic_set(&prtd->read_abort, 0); - atomic_set(&prtd->buf_count, 0); - prtd->appl_cnt = 0; - prtd->dma_write = 0; - prtd->xrun_count = 0; - prtd->xrun_index = 0; - - rc = msm_lsm_queue_lab_buffer(prtd, 0); - if (rc) - pr_err("%s: Queue buffer failed for lab rc = %d\n", - __func__, rc); - else - prtd->lsm_client->lab_started = true; - } - - return rc; -} - -static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_soc_pcm_runtime *rtd; - unsigned long flags; - int ret; - struct snd_lsm_sound_model_v2 snd_model_v2; - struct snd_lsm_session_data session_data; - struct snd_lsm_session_data_v2 ses_data_v2 = {0}; - int rc = 0, stage_idx; - int xchg = 0; - struct snd_pcm_runtime *runtime; - struct lsm_priv *prtd; - struct snd_lsm_detection_params det_params; - uint32_t max_detection_stages_supported = LSM_MAX_STAGES_PER_SESSION; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return -EINVAL; - } - - runtime = substream->runtime; - prtd = runtime->private_data; - rtd = substream->private_data; - - dev_dbg(rtd->dev, "%s: enter, cmd %x\n", __func__, cmd); - switch (cmd) { - case SNDRV_LSM_SET_SESSION_DATA: - case SNDRV_LSM_SET_SESSION_DATA_V2: - - if (cmd == SNDRV_LSM_SET_SESSION_DATA) { - dev_dbg(rtd->dev, "%s: set session data\n", __func__); - rc = copy_from_user(&session_data, arg, sizeof(session_data)); - if (!rc) { - ses_data_v2.app_id = session_data.app_id; - ses_data_v2.num_stages = 1; - } - } else { - dev_dbg(rtd->dev, "%s: set session data_v2\n", __func__); - rc = copy_from_user(&ses_data_v2, arg, sizeof(ses_data_v2)); - } - if (rc) { - dev_err(rtd->dev, "%s: %s: copy_from_user failed\n", - __func__, "LSM_SET_SESSION_DATA(_V2)"); - return -EFAULT; - } - - if (ses_data_v2.app_id != LSM_VOICE_WAKEUP_APP_ID_V2) { - dev_err(rtd->dev, - "%s:Invalid App id %d for Listen client\n", - __func__, ses_data_v2.app_id); - rc = -EINVAL; - break; - } - - /* - * Before validating num_stages from user argument. - * Check ADSP support for multi-stage session, - * and reset max_detection_stages_supported to "1" if required. - */ - if (!q6lsm_adsp_supports_multi_stage_detection()) { - dev_dbg(rtd->dev, - "%s: multi-stage session not supported by adsp\n", __func__); - max_detection_stages_supported = 1; - } - - if (ses_data_v2.num_stages <= 0 || - ses_data_v2.num_stages > max_detection_stages_supported) { - dev_err(rtd->dev, - "%s: Unsupported number of stages req(%d)/max(%d)\n", - __func__, ses_data_v2.num_stages, - max_detection_stages_supported); - rc = -EINVAL; - break; - } - - prtd->lsm_client->app_id = ses_data_v2.app_id; - prtd->lsm_client->num_stages = ses_data_v2.num_stages; - for (stage_idx = LSM_STAGE_INDEX_FIRST; - stage_idx < ses_data_v2.num_stages; stage_idx++) { - prtd->lsm_client->stage_cfg[stage_idx].app_type = - ses_data_v2.stage_info[stage_idx].app_type; - prtd->lsm_client->stage_cfg[stage_idx].lpi_enable = - ses_data_v2.stage_info[stage_idx].lpi_enable; - } - - ret = q6lsm_open(prtd->lsm_client, ses_data_v2.app_id); - if (ret < 0) { - dev_err(rtd->dev, - "%s: lsm open failed, %d\n", - __func__, ret); - __pm_relax(&prtd->ws); - return ret; - } - prtd->lsm_client->opened = true; - dev_dbg(rtd->dev, "%s: Session_ID = %d, APP ID = %d, Num stages %d\n", - __func__, - prtd->lsm_client->session, - prtd->lsm_client->app_id, - prtd->lsm_client->num_stages); - break; - case SNDRV_LSM_REG_SND_MODEL_V2: { - /* - * With multi-stage support sm buff allocation/free usage param info - * to check stage index for which this sound model is being set, and - * to check whether sm data is sent using set param command or not. - * Hence, set param ids to '0' to indicate allocation is for legacy - * reg_sm cmd, where buffer for param header need not be allocated, - * also set stage index to LSM_STAGE_INDEX_FIRST. - */ - struct lsm_params_info_v2 p_info = {0}; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - - dev_dbg(rtd->dev, "%s: Registering sound model V2\n", - __func__); - memcpy(&snd_model_v2, arg, - sizeof(struct snd_lsm_sound_model_v2)); - if (snd_model_v2.num_confidence_levels > - MAX_NUM_CONFIDENCE) { - dev_err(rtd->dev, - "%s: Invalid conf_levels = %d, maximum allowed = %d\n", - __func__, snd_model_v2.num_confidence_levels, - MAX_NUM_CONFIDENCE); - rc = -EINVAL; - break; - } - rc = q6lsm_snd_model_buf_alloc(prtd->lsm_client, - snd_model_v2.data_size, &p_info); - if (rc) { - dev_err(rtd->dev, - "%s: q6lsm buffer alloc failed V2, size %d\n", - __func__, snd_model_v2.data_size); - break; - } - if (copy_from_user( - prtd->lsm_client->stage_cfg[p_info.stage_idx].sound_model.data, - snd_model_v2.data, snd_model_v2.data_size)) { - dev_err(rtd->dev, - "%s: copy from user data failed\n" - "data %pK size %d\n", __func__, - snd_model_v2.data, snd_model_v2.data_size); - q6lsm_snd_model_buf_free(prtd->lsm_client, &p_info); - rc = -EFAULT; - break; - } - - dev_dbg(rtd->dev, "SND Model Magic no byte[0] %x,\n" - "byte[1] %x, byte[2] %x byte[3] %x\n", - snd_model_v2.data[0], snd_model_v2.data[1], - snd_model_v2.data[2], snd_model_v2.data[3]); - prtd->lsm_client->num_confidence_levels = - snd_model_v2.num_confidence_levels; - - rc = msm_lsm_get_conf_levels(prtd->lsm_client, - snd_model_v2.confidence_level); - if (rc) { - dev_err(rtd->dev, - "%s: get_conf_levels failed, err = %d\n", - __func__, rc); - break; - } - - rc = q6lsm_register_sound_model(prtd->lsm_client, - snd_model_v2.detection_mode, - snd_model_v2.detect_failure); - if (rc < 0) { - dev_err(rtd->dev, - "%s: Register snd Model v2 failed =%d\n", - __func__, rc); - q6lsm_snd_model_buf_free(prtd->lsm_client, &p_info); - } - if (prtd->lsm_client->confidence_levels) { - kfree(prtd->lsm_client->confidence_levels); - prtd->lsm_client->confidence_levels = NULL; - } - break; - } - case SNDRV_LSM_SET_PARAMS: - dev_dbg(rtd->dev, "%s: set_params\n", __func__); - memcpy(&det_params, arg, - sizeof(det_params)); - if (det_params.num_confidence_levels > - MAX_NUM_CONFIDENCE) { - rc = -EINVAL; - break; - } - - prtd->lsm_client->num_confidence_levels = - det_params.num_confidence_levels; - - rc = msm_lsm_get_conf_levels(prtd->lsm_client, - det_params.conf_level); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to get conf_levels, err = %d\n", - __func__, rc); - break; - } - - rc = q6lsm_set_data(prtd->lsm_client, - det_params.detect_mode, - det_params.detect_failure); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set params, err = %d\n", - __func__, rc); - if (prtd->lsm_client->confidence_levels) { - kfree(prtd->lsm_client->confidence_levels); - prtd->lsm_client->confidence_levels = NULL; - } - break; - - case SNDRV_LSM_DEREG_SND_MODEL: - dev_dbg(rtd->dev, "%s: Deregistering sound model\n", - __func__); - rc = q6lsm_deregister_sound_model(prtd->lsm_client); - if (rc) - dev_err(rtd->dev, - "%s: Sound model de-register failed, err = %d\n", - __func__, rc); - break; - - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_EVENT_STATUS_V3: { - uint32_t ts_lsw, ts_msw; - uint16_t status = 0, payload_size = 0; - - dev_dbg(rtd->dev, "%s: Get event status cmd %xx\n", - __func__, cmd); - atomic_set(&prtd->event_wait_stop, 0); - - /* - * Release the api lock before wait to allow - * other IOCTLs to be invoked while waiting - * for event - */ - mutex_unlock(&prtd->lsm_api_lock); - rc = wait_event_freezable(prtd->event_wait, - (cmpxchg(&prtd->event_avail, 1, 0) || - (xchg = atomic_cmpxchg(&prtd->event_wait_stop, - 1, 0)))); - dev_dbg(rtd->dev, "%s: wait event is done\n", __func__); - mutex_lock(&prtd->lsm_api_lock); - dev_dbg(rtd->dev, "%s: wait_event_freezable %d event_wait_stop %d\n", - __func__, rc, xchg); - if (!rc && !xchg) { - dev_dbg(rtd->dev, "%s: New event available %ld\n", - __func__, prtd->event_avail); - spin_lock_irqsave(&prtd->event_lock, flags); - - if (prtd->event_status) { - payload_size = prtd->event_status->payload_size; - ts_lsw = prtd->event_status->timestamp_lsw; - ts_msw = prtd->event_status->timestamp_msw; - status = prtd->event_status->status; - spin_unlock_irqrestore(&prtd->event_lock, - flags); - } else { - spin_unlock_irqrestore(&prtd->event_lock, - flags); - rc = -EINVAL; - dev_err(rtd->dev, - "%s: prtd->event_status is NULL\n", - __func__); - break; - } - - if (cmd == SNDRV_LSM_EVENT_STATUS) { - struct snd_lsm_event_status *user = arg; - - if (user->payload_size < payload_size) { - dev_dbg(rtd->dev, - "%s: provided %d bytes isn't enough, needs %d bytes\n", - __func__, user->payload_size, - payload_size); - rc = -ENOMEM; - } else { - user->status = status; - user->payload_size = payload_size; - memcpy(user->payload, - prtd->event_status->payload, - payload_size); - } - } else { - struct snd_lsm_event_status_v3 *user_v3 = arg; - - if (user_v3->payload_size < payload_size) { - dev_dbg(rtd->dev, - "%s: provided %d bytes isn't enough, needs %d bytes\n", - __func__, user_v3->payload_size, - payload_size); - rc = -ENOMEM; - } else { - user_v3->timestamp_lsw = ts_lsw; - user_v3->timestamp_msw = ts_msw; - user_v3->status = status; - user_v3->payload_size = payload_size; - memcpy(user_v3->payload, - prtd->event_status->payload, - payload_size); - } - } - - if (!rc) - rc = msm_lsm_start_lab_buffer(prtd, status); - } else if (xchg) { - dev_dbg(rtd->dev, "%s: Wait aborted\n", __func__); - rc = 0; - } - break; - } - - case SNDRV_LSM_GENERIC_DET_EVENT: { - struct snd_lsm_event_status *user = arg; - uint16_t status = 0; - uint16_t payload_size = 0; - - dev_dbg(rtd->dev, - "%s: SNDRV_LSM_GENERIC_DET_EVENT\n", __func__); - - atomic_set(&prtd->event_wait_stop, 0); - - /* - * Release the api lock before wait to allow - * other IOCTLs to be invoked while waiting - * for event - */ - mutex_unlock(&prtd->lsm_api_lock); - rc = wait_event_freezable(prtd->event_wait, - (cmpxchg(&prtd->event_avail, 1, 0) || - (xchg = atomic_cmpxchg(&prtd->event_wait_stop, - 1, 0)))); - mutex_lock(&prtd->lsm_api_lock); - - dev_dbg(rtd->dev, "%s: wait_event_freezable %d event_wait_stop %d\n", - __func__, rc, xchg); - - if (!rc && !xchg) { - dev_dbg(rtd->dev, "%s: %s: New event available %ld\n", - __func__, "SNDRV_LSM_GENERIC_DET_EVENT", - prtd->event_avail); - - spin_lock_irqsave(&prtd->event_lock, flags); - - if (prtd->det_event) { - payload_size = prtd->det_event->payload_size; - status = prtd->det_event->status; - spin_unlock_irqrestore(&prtd->event_lock, - flags); - } else { - spin_unlock_irqrestore(&prtd->event_lock, - flags); - dev_err(rtd->dev, - "%s: %s: prtd->event_status is NULL\n", - __func__, - "SNDRV_LSM_GENERIC_DET_EVENT"); - rc = -EINVAL; - break; - } - - if (user->payload_size < payload_size) { - dev_err(rtd->dev, - "%s: provided %d bytes isn't enough, needs %d bytes\n", - __func__, user->payload_size, - payload_size); - rc = -ENOMEM; - break; - } - user->status = status; - user->payload_size = payload_size; - memcpy(user->payload, prtd->det_event->payload, - payload_size); - - rc = msm_lsm_start_lab_buffer(prtd, status); - } else if (xchg) { - dev_dbg(rtd->dev, "%s: %s: Wait aborted\n", - __func__, "SNDRV_LSM_GENERIC_DET_EVENT"); - rc = 0; - } - break; - } - - case SNDRV_LSM_ABORT_EVENT: - dev_dbg(rtd->dev, "%s: Aborting event status wait\n", - __func__); - atomic_set(&prtd->event_wait_stop, 1); - wake_up(&prtd->event_wait); - break; - - case SNDRV_LSM_START: - dev_dbg(rtd->dev, "%s: Starting LSM client session\n", - __func__); - if (!prtd->lsm_client->started) { - rc = q6lsm_start(prtd->lsm_client, true); - if (!rc) { - prtd->lsm_client->started = true; - dev_dbg(rtd->dev, "%s: LSM client session started\n", - __func__); - } - } - break; - - case SNDRV_LSM_STOP: { - dev_dbg(rtd->dev, - "%s: Stopping LSM client session\n", - __func__); - if (prtd->lsm_client->started) { - if (prtd->lsm_client->lab_enable) { - atomic_set(&prtd->read_abort, 1); - if (prtd->lsm_client->lab_started) { - rc = q6lsm_stop_lab(prtd->lsm_client); - if (rc) - dev_err(rtd->dev, - "%s: stop lab failed rc %d\n", - __func__, rc); - prtd->lsm_client->lab_started = false; - } - } - - if (!atomic_read(&prtd->read_abort)) { - dev_dbg(rtd->dev, - "%s: set read_abort to stop buffering\n", __func__); - atomic_set(&prtd->read_abort, 1); - } - rc = q6lsm_stop(prtd->lsm_client, true); - if (!rc) - dev_dbg(rtd->dev, - "%s: LSM client session stopped %d\n", - __func__, rc); - prtd->lsm_client->started = false; - } - break; - } - case SNDRV_LSM_LAB_CONTROL: { - u32 enable = 0; - struct lsm_params_info_v2 p_info = {0}; - - if (prtd->lsm_client->num_stages > 1) { - dev_err(rtd->dev, "%s: %s: not supported for multi stage session\n", - __func__, "LSM_LAB_CONTROL"); - __pm_relax(&prtd->ws); - return -EINVAL; - } - - if (copy_from_user(&enable, arg, sizeof(enable))) { - dev_err(rtd->dev, "%s: %s: copy_frm_user failed\n", - __func__, "LSM_LAB_CONTROL"); - __pm_relax(&prtd->ws); - return -EFAULT; - } - - dev_dbg(rtd->dev, "%s: ioctl %s, enable = %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", enable); - - if (prtd->lsm_client->started) { - dev_err(rtd->dev, "%s: ioctl %s issued after start", - __func__, "SNDRV_LSM_LAB_CONTROL"); - rc = -EINVAL; - break; - } - - /* - * With multi-stage support lab control needs to set param info - * specifying stage index for which this lab control is issued, - * along with values of module/instance ids applicable for the stage. - * Hence, set param info with default lab module/instance ids, and - * set stage index to LSM_STAGE_INDEX_FIRST. - */ - p_info.param_type = LSM_LAB_CONTROL; - p_info.module_id = LSM_MODULE_ID_LAB; - p_info.instance_id = INSTANCE_ID_0; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - p_info.param_size = 0; - rc = msm_lsm_check_and_set_lab_controls(substream, enable, &p_info); - break; - } - case SNDRV_LSM_STOP_LAB: - dev_dbg(rtd->dev, "%s: stopping LAB\n", __func__); - if (prtd->lsm_client->lab_enable && - prtd->lsm_client->lab_started) { - atomic_set(&prtd->read_abort, 1); - rc = q6lsm_stop_lab(prtd->lsm_client); - if (rc) - dev_err(rtd->dev, - "%s: Lab stop failed for session %d rc %d\n", - __func__, - prtd->lsm_client->session, rc); - prtd->lsm_client->lab_started = false; - } - break; - - case SNDRV_LSM_SET_PORT: - dev_dbg(rtd->dev, "%s: set LSM port\n", __func__); - rc = q6lsm_set_port_connected(prtd->lsm_client); - break; - - case SNDRV_LSM_SET_FWK_MODE_CONFIG: { - u32 mode; - - if (copy_from_user(&mode, arg, sizeof(mode))) { - dev_err(rtd->dev, "%s: %s: copy_frm_user failed\n", - __func__, "LSM_SET_FWK_MODE_CONFIG"); - __pm_relax(&prtd->ws); - return -EFAULT; - } - - dev_dbg(rtd->dev, "%s: ioctl %s, enable = %d\n", - __func__, "SNDRV_LSM_SET_FWK_MODE_CONFIG", mode); - if (prtd->lsm_client->event_mode == mode) { - dev_dbg(rtd->dev, - "%s: mode for %d already set to %d\n", - __func__, prtd->lsm_client->session, mode); - rc = 0; - } else { - dev_dbg(rtd->dev, "%s: Event mode = %d\n", - __func__, mode); - rc = q6lsm_set_fwk_mode_cfg(prtd->lsm_client, mode); - if (!rc) - prtd->lsm_client->event_mode = mode; - else - dev_err(rtd->dev, - "%s: set event mode failed %d\n", - __func__, rc); - } - break; - } - case SNDRV_LSM_SET_INPUT_HW_PARAMS: { - struct lsm_hw_params *in_params; - struct snd_lsm_input_hw_params params; - - if (copy_from_user(¶ms, arg, sizeof(params))) { - dev_err(rtd->dev, "%s: %s: copy_from_user failed\n", - __func__, "LSM_SET_INPUT_HW_PARAMS"); - __pm_relax(&prtd->ws); - return -EFAULT; - } - - in_params = &prtd->lsm_client->in_hw_params; - in_params->sample_rate = params.sample_rate; - in_params->sample_size = params.bit_width; - in_params->num_chs = params.num_channels; - - break; - } - - default: - dev_dbg(rtd->dev, - "%s: Falling into default snd_lib_ioctl cmd 0x%x\n", - __func__, cmd); - rc = snd_pcm_lib_ioctl(substream, cmd, arg); - break; - } - - if (!rc) - dev_dbg(rtd->dev, "%s: leave (%d)\n", - __func__, rc); - else - dev_err(rtd->dev, "%s: cmd 0x%x failed %d\n", - __func__, cmd, rc); - - __pm_relax(&prtd->ws); - return rc; -} - -static int msm_lsm_check_event_type(struct lsm_client *lsm_client, - unsigned int cmd) -{ - int err = 0; - uint32_t event_type = lsm_client->event_type; - - if (cmd == SNDRV_LSM_EVENT_STATUS && - event_type != LSM_DET_EVENT_TYPE_LEGACY) { - pr_err("%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_EVENT_STATUS"); - err = -EINVAL; - } else if (cmd == SNDRV_LSM_GENERIC_DET_EVENT && - event_type != LSM_DET_EVENT_TYPE_GENERIC) { - pr_err("%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_GENERIC_DET_EVENT"); - err = -EINVAL; - } - - return err; -} - -#ifdef CONFIG_COMPAT - -struct snd_lsm_event_status32 { - u16 status; - u16 payload_size; - u8 payload[0]; -}; - -struct snd_lsm_event_status_v3_32 { - u32 timestamp_lsw; - u32 timestamp_msw; - u16 status; - u16 payload_size; - u8 payload[0]; -}; - -struct snd_lsm_sound_model_v2_32 { - compat_uptr_t data; - compat_uptr_t confidence_level; - u32 data_size; - enum lsm_detection_mode detection_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct snd_lsm_detection_params_32 { - compat_uptr_t conf_level; - enum lsm_detection_mode detect_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct lsm_params_info_32 { - u32 module_id; - u32 param_id; - u32 param_size; - compat_uptr_t param_data; - uint32_t param_type; -}; - -struct lsm_params_info_v2_32 { - u32 module_id; - u32 param_id; - u32 param_size; - compat_uptr_t param_data; - uint32_t param_type; - u16 instance_id; - u16 stage_idx; -}; - -struct snd_lsm_module_params_32 { - compat_uptr_t params; - u32 num_params; - u32 data_size; -}; - -enum { - SNDRV_LSM_REG_SND_MODEL_V2_32 = - _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), - SNDRV_LSM_SET_PARAMS_32 = - _IOW('U', 0x0A, struct snd_lsm_detection_params_32), - SNDRV_LSM_SET_MODULE_PARAMS_32 = - _IOW('U', 0x0B, struct snd_lsm_module_params_32), - SNDRV_LSM_EVENT_STATUS_V3_32 = - _IOW('U', 0x0F, struct snd_lsm_event_status_v3_32), - SNDRV_LSM_SET_MODULE_PARAMS_V2_32 = - _IOW('U', 0x13, struct snd_lsm_module_params_32), -}; - -static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, - unsigned int cmd, void __user *arg) -{ - struct snd_pcm_runtime *runtime; - struct lsm_priv *prtd; - struct snd_soc_pcm_runtime *rtd; - int err = 0; - u32 size = 0; - - if (PCM_RUNTIME_CHECK(substream)) - return -ENXIO; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return -EINVAL; - } - runtime = substream->runtime; - rtd = substream->private_data; - prtd = runtime->private_data; - - mutex_lock(&prtd->lsm_api_lock); - - switch (cmd) { - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_GENERIC_DET_EVENT: { - struct snd_lsm_event_status userarg32, *user32 = NULL; - struct snd_lsm_event_status *user = NULL; - - dev_dbg(rtd->dev, - "%s: %s\n", __func__, - (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - - err = msm_lsm_check_event_type(prtd->lsm_client, cmd); - if (err) - goto done; - - if (copy_from_user(&userarg32, arg, sizeof(userarg32))) { - dev_err(rtd->dev, "%s: %s: Failed to copy from user\n", - __func__, (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - err = -EFAULT; - goto done; - } - - if (userarg32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(*user) + userarg32.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - err = -ENOMEM; - goto done; - } - - user->payload_size = userarg32.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - if (err) { - dev_err(rtd->dev, - "%s: msm_lsm_ioctl_shared() failed, err = %d", - __func__, err); - kfree(user); - goto done; - } - - /* Update size with actual payload size */ - size = sizeof(userarg32) + user->payload_size; - if (!access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: Failed to verify write, size = %d\n", - __func__, size); - err = -EFAULT; - kfree(user); - goto done; - } - - user32 = kzalloc(size, GFP_KERNEL); - if (!user32) { - err = -ENOMEM; - kfree(user); - goto done; - } - user32->status = user->status; - user32->payload_size = user->payload_size; - memcpy(user32->payload, user->payload, - user32->payload_size); - - if (copy_to_user(arg, user32, size)) { - dev_err(rtd->dev, - "%s: Failed to copy payload to user, size = %d", - __func__, size); - err = -EFAULT; - } - kfree(user); - kfree(user32); - break; - } - - case SNDRV_LSM_EVENT_STATUS_V3_32: { - struct snd_lsm_event_status_v3_32 userarg32, *user32 = NULL; - struct snd_lsm_event_status_v3 *user = NULL; - - if (prtd->lsm_client->event_type != - LSM_DET_EVENT_TYPE_LEGACY) { - dev_err(rtd->dev, - "%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_EVENT_STATUS_V3_32"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&userarg32, arg, sizeof(userarg32))) { - dev_err(rtd->dev, "%s: err copyuser ioctl %s\n", - __func__, "SNDRV_LSM_EVENT_STATUS_V3_32"); - err = -EFAULT; - goto done; - } - - if (userarg32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - pr_err("%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(*user) + userarg32.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - dev_err(rtd->dev, - "%s: Allocation failed event status size %d\n", - __func__, size); - err = -ENOMEM; - goto done; - } - cmd = SNDRV_LSM_EVENT_STATUS_V3; - user->payload_size = userarg32.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - - /* Update size with actual payload size */ - size = sizeof(userarg32) + user->payload_size; - if (!err && !access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: write verify failed size %d\n", - __func__, size); - err = -EFAULT; - } - if (!err) { - user32 = kzalloc(size, GFP_KERNEL); - if (!user32) { - dev_err(rtd->dev, - "%s: Allocation event user status size %d\n", - __func__, size); - err = -EFAULT; - } else { - user32->timestamp_lsw = user->timestamp_lsw; - user32->timestamp_msw = user->timestamp_msw; - user32->status = user->status; - user32->payload_size = user->payload_size; - memcpy(user32->payload, - user->payload, user32->payload_size); - } - } - if (!err && (copy_to_user(arg, user32, size))) { - dev_err(rtd->dev, "%s: failed to copy payload %d", - __func__, size); - err = -EFAULT; - } - kfree(user); - kfree(user32); - if (err) - dev_err(rtd->dev, "%s: lsmevent failed %d", - __func__, err); - break; - } - - case SNDRV_LSM_REG_SND_MODEL_V2_32: { - struct snd_lsm_sound_model_v2_32 snd_modelv232; - struct snd_lsm_sound_model_v2 snd_modelv2; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "REG_SND_MODEL_V2"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&snd_modelv232, arg, - sizeof(snd_modelv232))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: copy user failed, size %zd %s\n", - __func__, - sizeof(struct snd_lsm_sound_model_v2_32), - "SNDRV_LSM_REG_SND_MODEL_V2_32"); - } else { - snd_modelv2.confidence_level = - compat_ptr(snd_modelv232.confidence_level); - snd_modelv2.data = compat_ptr(snd_modelv232.data); - snd_modelv2.data_size = snd_modelv232.data_size; - snd_modelv2.detect_failure = - snd_modelv232.detect_failure; - snd_modelv2.detection_mode = - snd_modelv232.detection_mode; - snd_modelv2.num_confidence_levels = - snd_modelv232.num_confidence_levels; - cmd = SNDRV_LSM_REG_SND_MODEL_V2; - err = msm_lsm_ioctl_shared(substream, cmd, - &snd_modelv2); - if (err) - dev_err(rtd->dev, - "%s: ioctl %s failed\n", __func__, - "SNDDRV_LSM_REG_SND_MODEL_V2_32"); - } - break; - } - - case SNDRV_LSM_SET_PARAMS_32:{ - struct snd_lsm_detection_params_32 det_params32; - struct snd_lsm_detection_params det_params; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SET_PARAMS_32"); - err = -EINVAL; - } - - if (copy_from_user(&det_params32, arg, - sizeof(det_params32))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS_32", - sizeof(det_params32)); - } else { - det_params.conf_level = - compat_ptr(det_params32.conf_level); - det_params.detect_mode = - det_params32.detect_mode; - det_params.num_confidence_levels = - det_params32.num_confidence_levels; - det_params.detect_failure = - det_params32.detect_failure; - cmd = SNDRV_LSM_SET_PARAMS; - err = msm_lsm_ioctl_shared(substream, cmd, - &det_params); - if (err) - dev_err(rtd->dev, - "%s: ioctl %s failed\n", __func__, - "SNDRV_LSM_SET_PARAMS"); - } - break; - } - - case SNDRV_LSM_SET_MODULE_PARAMS_32: - case SNDRV_LSM_SET_MODULE_PARAMS_V2_32: { - struct snd_lsm_module_params_32 p_data_32; - struct snd_lsm_module_params p_data; - u8 *params32; - size_t expected_size = 0, count; - struct lsm_params_info_32 *p_info_32 = NULL; - struct lsm_params_info_v2_32 *p_info_v2_32 = NULL; - struct lsm_params_info_v2 p_info; - - if (!prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS(_V2)_32"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data_32, arg, - sizeof(p_data_32))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SET_MODULE_PARAMS(_V2)_32", - sizeof(p_data_32)); - err = -EFAULT; - goto done; - } - - p_data.params = compat_ptr(p_data_32.params); - p_data.num_params = p_data_32.num_params; - p_data.data_size = p_data_32.data_size; - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS(_V2)_32", - p_data.num_params); - err = -EINVAL; - goto done; - } - - expected_size = (cmd == SNDRV_LSM_SET_MODULE_PARAMS_32) ? - p_data.num_params * sizeof(struct lsm_params_info_32) : - p_data.num_params * sizeof(struct lsm_params_info_v2_32); - - if (p_data.data_size != expected_size) { - dev_err(rtd->dev, - "%s: %s: Invalid size %d\n", - __func__, "SET_MODULE_PARAMS(_V2)_32", - p_data.data_size); - err = -EINVAL; - goto done; - } - - params32 = kzalloc(p_data.data_size, GFP_KERNEL); - if (!params32) { - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params32, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "params32", p_data.data_size); - kfree(params32); - err = -EFAULT; - goto done; - } - - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS_32) - p_info_32 = (struct lsm_params_info_32 *) params32; - else - p_info_v2_32 = (struct lsm_params_info_v2_32 *) params32; - - for (count = 0; count < p_data.num_params; count++) { - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS_32) { - p_info.module_id = p_info_32->module_id; - p_info.param_id = p_info_32->param_id; - p_info.param_size = p_info_32->param_size; - p_info.param_data = compat_ptr(p_info_32->param_data); - p_info.param_type = p_info_32->param_type; - - p_info.instance_id = INSTANCE_ID_0; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - - p_info_32++; - } else { - p_info.module_id = p_info_v2_32->module_id; - p_info.param_id = p_info_v2_32->param_id; - p_info.param_size = p_info_v2_32->param_size; - p_info.param_data = compat_ptr(p_info_v2_32->param_data); - p_info.param_type = p_info_v2_32->param_type; - - p_info.instance_id = p_info_v2_32->instance_id; - p_info.stage_idx = p_info_v2_32->stage_idx; - - p_info_v2_32++; - } - - err = msm_lsm_process_params(substream, &p_info); - if (err) - dev_err(rtd->dev, - "%s: Failed to process param, type%d stage=%d err=%d\n", - __func__, p_info.param_type, p_info.stage_idx, err); - } - - kfree(params32); - break; - } - case SNDRV_LSM_REG_SND_MODEL_V2: - case SNDRV_LSM_SET_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS_V2: - /* - * In ideal cases, the compat_ioctl should never be called - * with the above unlocked ioctl commands. Print error - * and return error if it does. - */ - dev_err(rtd->dev, - "%s: Invalid cmd for compat_ioctl\n", - __func__); - err = -EINVAL; - break; - default: - err = msm_lsm_ioctl_shared(substream, cmd, arg); - break; - } -done: - mutex_unlock(&prtd->lsm_api_lock); - return err; -} -#else -#define msm_lsm_ioctl_compat NULL -#endif - -static int msm_lsm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void __user *arg) -{ - int err = 0; - u32 size = 0; - struct snd_pcm_runtime *runtime; - struct snd_soc_pcm_runtime *rtd; - struct lsm_priv *prtd; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return -EINVAL; - } - runtime = substream->runtime; - prtd = runtime->private_data; - rtd = substream->private_data; - - mutex_lock(&prtd->lsm_api_lock); - switch (cmd) { - case SNDRV_LSM_REG_SND_MODEL_V2: { - struct snd_lsm_sound_model_v2 snd_model_v2; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "REG_SND_MODEL_V2"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&snd_model_v2, arg, sizeof(snd_model_v2))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_sound_model_v2)); - } - if (!err) - err = msm_lsm_ioctl_shared(substream, cmd, - &snd_model_v2); - if (err) - dev_err(rtd->dev, - "%s REG_SND_MODEL failed err %d\n", - __func__, err); - goto done; - } - break; - case SNDRV_LSM_SET_PARAMS: { - struct snd_lsm_detection_params det_params; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SET_PARAMS"); - err = -EINVAL; - goto done; - } - - pr_debug("%s: SNDRV_LSM_SET_PARAMS\n", __func__); - - if (copy_from_user(&det_params, arg, - sizeof(det_params))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS", - sizeof(det_params)); - err = -EFAULT; - } - - if (!err) - err = msm_lsm_ioctl_shared(substream, cmd, - &det_params); - else - dev_err(rtd->dev, - "%s: LSM_SET_PARAMS failed, err %d\n", - __func__, err); - - goto done; - } - - case SNDRV_LSM_SET_MODULE_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS_V2: { - struct snd_lsm_module_params p_data; - struct lsm_params_info *temp_ptr_info = NULL; - struct lsm_params_info_v2 info_v2; - struct lsm_params_info_v2 *ptr_info_v2 = NULL, *temp_ptr_info_v2 = NULL; - size_t p_size = 0, count; - u8 *params; - - if (!prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS(_V2)"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data, arg, - sizeof(p_data))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "p_data", sizeof(p_data)); - err = -EFAULT; - goto done; - } - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS(_V2)", - p_data.num_params); - err = -EINVAL; - goto done; - } - - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS) - p_size = p_data.num_params * sizeof(struct lsm_params_info); - else - p_size = p_data.num_params * sizeof(struct lsm_params_info_v2); - - if (p_data.data_size != p_size) { - dev_err(rtd->dev, - "%s: %s: Invalid data_size(%u) against expected(%zd)\n", - __func__, "SET_MODULE_PARAMS(_V2)", - p_data.data_size, p_size); - err = -EFAULT; - goto done; - } - - params = kzalloc(p_size, GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "set module params", p_data.data_size); - kfree(params); - err = -EFAULT; - goto done; - } - - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS) - temp_ptr_info = (struct lsm_params_info *)params; - else - temp_ptr_info_v2 = (struct lsm_params_info_v2 *)params; - - for (count = 0; count < p_data.num_params; count++) { - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS) { - /* convert to V2 param info struct from legacy param info */ - info_v2.module_id = temp_ptr_info->module_id; - info_v2.param_id = temp_ptr_info->param_id; - info_v2.param_size = temp_ptr_info->param_size; - info_v2.param_data = temp_ptr_info->param_data; - info_v2.param_type = temp_ptr_info->param_type; - - info_v2.instance_id = INSTANCE_ID_0; - info_v2.stage_idx = LSM_STAGE_INDEX_FIRST; - - ptr_info_v2 = &info_v2; - temp_ptr_info++; - } else { - /* Just copy the pointer as user already provided v2 params */ - ptr_info_v2 = temp_ptr_info_v2; - temp_ptr_info_v2++; - } - err = msm_lsm_process_params(substream, ptr_info_v2); - if (err) - dev_err(rtd->dev, - "%s: Failed to process param, type%d stage=%d err=%d\n", - __func__, ptr_info_v2->param_type, - ptr_info_v2->stage_idx, err); - } - kfree(params); - break; - } - - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_GENERIC_DET_EVENT: { - struct snd_lsm_event_status *user = NULL; - struct snd_lsm_event_status userarg; - - dev_dbg(rtd->dev, - "%s: %s\n", __func__, - (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - - err = msm_lsm_check_event_type(prtd->lsm_client, cmd); - if (err) - goto done; - - if (copy_from_user(&userarg, arg, sizeof(userarg))) { - dev_err(rtd->dev, - "%s: %s: Copy from user failed\n", __func__, - (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - err = -EFAULT; - goto done; - } - - if (userarg.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(struct snd_lsm_event_status) + - userarg.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - err = -ENOMEM; - goto done; - } - - user->payload_size = userarg.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - if (err) { - dev_err(rtd->dev, - "%s: msm_lsm_ioctl_shared() failed, err = %d", - __func__, err); - kfree(user); - goto done; - } - - /* Update size with actual payload size */ - size = sizeof(*user) + user->payload_size; - if (!access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: Failed to verify write, size = %d\n", - __func__, size); - err = -EFAULT; - } - if (!err && copy_to_user(arg, user, size)) { - dev_err(rtd->dev, - "%s: Failed to copy payload to user, size = %d\n", - __func__, size); - err = -EFAULT; - } - - kfree(user); - break; - } - - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status_v3 *user = NULL; - struct snd_lsm_event_status_v3 userarg; - - dev_dbg(rtd->dev, - "%s: SNDRV_LSM_EVENT_STATUS_V3\n", __func__); - - if (prtd->lsm_client->event_type != - LSM_DET_EVENT_TYPE_LEGACY) { - dev_err(rtd->dev, - "%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_EVENT_STATUS_V3"); - err = -EINVAL; - goto done; - } - - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid params event_status_v3\n", - __func__); - err = -EINVAL; - goto done; - } - if (copy_from_user(&userarg, arg, sizeof(userarg))) { - dev_err(rtd->dev, - "%s: err copyuser event_status_v3\n", - __func__); - err = -EFAULT; - goto done; - } - - if (userarg.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - pr_err("%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(struct snd_lsm_event_status_v3) + - userarg.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - dev_err(rtd->dev, - "%s: Allocation failed event status size %d\n", - __func__, size); - err = -EFAULT; - goto done; - } - user->payload_size = userarg.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - - /* Update size with actual payload size */ - size = sizeof(*user) + user->payload_size; - if (!err && !access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: write verify failed size %d\n", - __func__, size); - err = -EFAULT; - } - if (!err && (copy_to_user(arg, user, size))) { - dev_err(rtd->dev, - "%s: failed to copy payload %d", - __func__, size); - err = -EFAULT; - } - kfree(user); - if (err) - dev_err(rtd->dev, - "%s: lsm_event_v3 failed %d", __func__, err); - break; - } - - default: - err = msm_lsm_ioctl_shared(substream, cmd, arg); - break; - } -done: - mutex_unlock(&prtd->lsm_api_lock); - return err; -} - -static int msm_lsm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int ret = 0; - - pr_debug("%s\n", __func__); - prtd = kzalloc(sizeof(struct lsm_priv), GFP_KERNEL); - if (!prtd) { - pr_err("%s: Failed to allocate memory for lsm_priv\n", - __func__); - return -ENOMEM; - } - mutex_init(&prtd->lsm_api_lock); - spin_lock_init(&prtd->event_lock); - spin_lock_init(&prtd->xrun_lock); - init_waitqueue_head(&prtd->event_wait); - init_waitqueue_head(&prtd->period_wait); - prtd->substream = substream; - runtime->private_data = prtd; - runtime->hw = msm_pcm_hardware_capture; - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_info("%s: snd_pcm_hw_constraint_list failed ret %d\n", - __func__, ret); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("%s: snd_pcm_hw_constraint_integer failed ret %d\n", - __func__, ret); - - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - CAPTURE_MIN_NUM_PERIODS * CAPTURE_MIN_PERIOD_SIZE, - CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE); - if (ret < 0) - pr_info("%s: constraint for buffer bytes min max ret = %d\n", - __func__, ret); - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32); - if (ret < 0) { - pr_info("%s: constraint for period bytes step ret = %d\n", - __func__, ret); - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32); - if (ret < 0) - pr_info("%s: constraint for buffer bytes step ret = %d\n", - __func__, ret); - prtd->lsm_client = q6lsm_client_alloc( - lsm_event_handler, prtd); - if (!prtd->lsm_client) { - pr_err("%s: Could not allocate memory\n", __func__); - kfree(prtd); - runtime->private_data = NULL; - return -ENOMEM; - } - prtd->lsm_client->opened = false; - prtd->lsm_client->started = false; - prtd->lsm_client->session_state = IDLE; - prtd->lsm_client->poll_enable = true; - prtd->lsm_client->perf_mode = 0; - prtd->lsm_client->event_mode = LSM_EVENT_NON_TIME_STAMP_MODE; - prtd->lsm_client->event_type = LSM_DET_EVENT_TYPE_LEGACY; - prtd->lsm_client->fe_id = rtd->dai_link->id; - prtd->lsm_client->unprocessed_data = 0; - - wakeup_source_init(&prtd->ws, "lsm-client"); - return 0; -} - -static int msm_lsm_send_ch_mix_config(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - struct lsm_hw_params *in_params; - int pp_ch_cnt; - int *ch_wght_coeff; - int ret = 0, i, idx; - - /* - * The output channels from channel mixer is the input to LSM (stream) - * side and is read from in_params->num_chs. - * - * The input channels to channel mixer are the output channels from - * the device side (routing) and is obtained by reading the - * pp_ch_cnt. - * - * For LSM to be functional, only unity channel mixing is allowed. - */ - - in_params = &prtd->lsm_client->in_hw_params; - rtd = prtd->substream->private_data; - pp_ch_cnt = msm_pcm_routing_get_pp_ch_cnt(rtd->dai_link->id, - SESSION_TYPE_TX); - if (pp_ch_cnt < 0 || - pp_ch_cnt > LSM_V3P0_MAX_NUM_CHANNELS || - in_params->num_chs > LSM_V3P0_MAX_NUM_CHANNELS) { - dev_err(rtd->dev, - "%s: invalid ch cnt, pp_ch_cnt %d in_ch_cnt %d\n", - __func__, pp_ch_cnt, in_params->num_chs); - return -EINVAL; - } - - if (!pp_ch_cnt || - (pp_ch_cnt == in_params->num_chs)) { - dev_dbg(rtd->dev, - "%s: Skip ch mixing, pp_ch_cnt %d in_ch_cnt %d\n", - __func__, pp_ch_cnt, in_params->num_chs); - return 0; - } - - ch_wght_coeff = kzalloc(in_params->num_chs * pp_ch_cnt * sizeof(int), - GFP_KERNEL); - if (!ch_wght_coeff) - return -ENOMEM; - - /* - * channel weight co-efficients is a m X n array, where - * m = number of input channels to ch mixer (pp_ch_cnt) - * n = number of output channels from ch mixer (in_params->num_chs) - */ - for (i = 0; i < in_params->num_chs; i++) { - idx = (i * pp_ch_cnt) + i; - ch_wght_coeff[idx] = 1; - } - - ret = msm_pcm_routing_send_chmix_cfg(rtd->dai_link->id, - pp_ch_cnt, in_params->num_chs, - ch_wght_coeff, - SESSION_TYPE_TX, STREAM_TYPE_LSM); - if (ret) - dev_err(rtd->dev, - "%s: Failed to configure channel mixer err %d\n", - __func__, ret); - - kfree(ch_wght_coeff); - - return ret; -} - -static int msm_lsm_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - - rtd = prtd->substream->private_data; - - if (!prtd->lsm_client) { - dev_err(rtd->dev, - "%s: LSM client data ptr is NULL\n", __func__); - return -EINVAL; - } - - if (q6lsm_set_media_fmt_v2_params(prtd->lsm_client)) - dev_dbg(rtd->dev, - "%s: failed to set lsm media fmt params\n", __func__); - - if (prtd->lsm_client->session_state == IDLE) { - ret = msm_pcm_routing_reg_phy_compr_stream( - rtd->dai_link->id, - prtd->lsm_client->perf_mode, - prtd->lsm_client->session, - SNDRV_PCM_STREAM_CAPTURE, - LISTEN); - if (ret) { - dev_err(rtd->dev, - "%s: register phy compr stream failed %d\n", - __func__, ret); - return ret; - } - - ret = msm_lsm_send_ch_mix_config(substream); - if (ret) { - msm_pcm_routing_dereg_phy_stream(rtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - return ret; - } - } - - prtd->lsm_client->session_state = RUNNING; - runtime->private_data = prtd; - return ret; -} - -static int msm_lsm_close(struct snd_pcm_substream *substream) -{ - unsigned long flags; - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - int be_id = 0; - int fe_id = 0; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - if (!prtd || !prtd->lsm_client) { - pr_err("%s: No LSM session active\n", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - dev_dbg(rtd->dev, "%s\n", __func__); - if (prtd->lsm_client->started) { - if (prtd->lsm_client->lab_enable) { - atomic_set(&prtd->read_abort, 1); - if (prtd->lsm_client->lab_started) { - ret = q6lsm_stop_lab(prtd->lsm_client); - if (ret) - dev_err(rtd->dev, - "%s: stop lab failed ret %d\n", - __func__, ret); - prtd->lsm_client->lab_started = false; - } - if (prtd->lsm_client->lab_buffer) { - ret = msm_lsm_lab_buffer_alloc(prtd, - LAB_BUFFER_DEALLOC); - if (ret) - dev_err(rtd->dev, - "%s: lab buffer dealloc failed ret %d\n", - __func__, ret); - } - } - - if (!atomic_read(&prtd->read_abort)) { - dev_dbg(rtd->dev, - "%s: set read_abort to stop buffering\n", __func__); - atomic_set(&prtd->read_abort, 1); - } - ret = q6lsm_stop(prtd->lsm_client, true); - if (ret) - dev_err(rtd->dev, - "%s: session stop failed, err = %d\n", - __func__, ret); - else - dev_dbg(rtd->dev, - "%s: LSM client session stopped %d\n", - __func__, ret); - - /* - * Go Ahead and try de-register sound model, - * even if stop failed - */ - prtd->lsm_client->started = false; - - ret = q6lsm_deregister_sound_model(prtd->lsm_client); - if (ret) - dev_err(rtd->dev, - "%s: dereg_snd_model failed, err = %d\n", - __func__, ret); - else - dev_dbg(rtd->dev, "%s: dereg_snd_model successful\n", - __func__); - } - - msm_pcm_routing_dereg_phy_stream(rtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - - if (prtd->lsm_client->opened) { - if (!atomic_read(&prtd->read_abort)) { - dev_dbg(rtd->dev, - "%s: set read_abort to stop buffering\n", __func__); - atomic_set(&prtd->read_abort, 1); - } - q6lsm_close(prtd->lsm_client); - prtd->lsm_client->opened = false; - } - - fe_id = prtd->lsm_client->fe_id; - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_TX, - &be_id, &cfg_data); - if (ret < 0) - dev_dbg(rtd->dev, - "%s: get stream app type cfg failed, err = %d\n", - __func__, ret); - /* - * be_id will be 0 in case of LSM directly connects to AFE due to - * last_be_id_configured[fedai_id][session_type] has not been updated. - * And then the cfg_data from wrong combination would be reset without - * this if check. We reset only if app_type, acdb_dev_id, and sample_rate - * are valid. - */ - if (!cfg_data.app_type && - !cfg_data.acdb_dev_id && !cfg_data.sample_rate) { - dev_dbg(rtd->dev, "%s: no need to reset app type configs\n", - __func__); - } else { - memset(&cfg_data, 0, sizeof(cfg_data)); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, - SESSION_TYPE_TX, - be_id, - &cfg_data); - if (ret < 0) - dev_dbg(rtd->dev, - "%s: set stream app type cfg failed, err = %d\n", - __func__, ret); - } - - q6lsm_client_free(prtd->lsm_client); - - wakeup_source_trash(&prtd->ws); - spin_lock_irqsave(&prtd->event_lock, flags); - kfree(prtd->event_status); - prtd->event_status = NULL; - kfree(prtd->det_event); - prtd->det_event = NULL; - spin_unlock_irqrestore(&prtd->event_lock, flags); - mutex_destroy(&prtd->lsm_api_lock); - kfree(prtd); - runtime->private_data = NULL; - - return 0; -} - -static int msm_lsm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct lsm_hw_params *out_hw_params = NULL; - struct lsm_hw_params *in_hw_params = NULL; - struct snd_soc_pcm_runtime *rtd; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - if (!prtd || !params) { - dev_err(rtd->dev, - "%s: invalid params prtd %pK params %pK", - __func__, prtd, params); - return -EINVAL; - } - in_hw_params = &prtd->lsm_client->in_hw_params; - out_hw_params = &prtd->lsm_client->out_hw_params; - out_hw_params->num_chs = params_channels(params); - out_hw_params->period_count = params_periods(params); - out_hw_params->sample_rate = params_rate(params); - if (((out_hw_params->sample_rate != 16000) && - (out_hw_params->sample_rate != 48000)) || - (out_hw_params->period_count == 0)) { - dev_err(rtd->dev, - "%s: Invalid Params sample rate %d period count %d\n", - __func__, out_hw_params->sample_rate, - out_hw_params->period_count); - return -EINVAL; - } - - if (params_format(params) == SNDRV_PCM_FORMAT_S16_LE) { - out_hw_params->sample_size = 16; - } else if (params_format(params) == SNDRV_PCM_FORMAT_S24_LE) { - out_hw_params->sample_size = 24; - } else { - dev_err(rtd->dev, "%s: Invalid Format 0x%x\n", - __func__, params_format(params)); - return -EINVAL; - } - - out_hw_params->buf_sz = params_buffer_bytes(params) / - out_hw_params->period_count; - dev_dbg(rtd->dev, - "%s: channels %d sample rate %d sample size %d buffer size %d period count %d\n", - __func__, out_hw_params->num_chs, out_hw_params->sample_rate, - out_hw_params->sample_size, out_hw_params->buf_sz, - out_hw_params->period_count); - - /* - * copy the out_hw_params to in_hw_params. in_hw_params will be - * over-written with LSM_SET_INPUT_HW_PARAMS ioctl from userspace. - * If this ioctl is not set, then it is assumed that input and - * output hw params for LSM are the same. - * Currently the period_count and buf_sz are unused for input params. - */ - memcpy(in_hw_params, out_hw_params, - sizeof(struct lsm_hw_params)); - return 0; -} - -static snd_pcm_uframes_t msm_lsm_pcm_pointer( - struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - if (!prtd) { - dev_err(rtd->dev, - "%s: Invalid param %pK\n", __func__, prtd); - return 0; - } - - if (prtd->dma_write >= snd_pcm_lib_buffer_bytes(substream)) - prtd->dma_write = 0; - dev_dbg(rtd->dev, - "%s: dma post = %d\n", __func__, prtd->dma_write); - return bytes_to_frames(runtime, prtd->dma_write); -} - -static int msm_lsm_pcm_copy(struct snd_pcm_substream *substream, int ch, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - char *pcm_buf = NULL; - int rc = 0, buf_index = 0; - unsigned long flags = 0; - struct snd_soc_pcm_runtime *rtd; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - if (!prtd) { - dev_err(rtd->dev, - "%s: Invalid param %pK\n", __func__, prtd); - return -EINVAL; - } - - if (runtime->status->state == SNDRV_PCM_STATE_XRUN || - runtime->status->state == SNDRV_PCM_STATE_PREPARED) { - dev_err(rtd->dev, - "%s: runtime state incorrect %d", __func__, - runtime->status->state); - return 0; - } - rc = wait_event_timeout(prtd->period_wait, - (atomic_read(&prtd->buf_count) | - atomic_read(&prtd->read_abort)), (2 * HZ)); - if (!rc) { - dev_err(rtd->dev, - "%s: timeout for read retry\n", __func__); - return -EAGAIN; - } - if (atomic_read(&prtd->read_abort)) { - dev_err(rtd->dev, - "%s: Read abort received\n", __func__); - return -EIO; - } - prtd->appl_cnt = prtd->appl_cnt % - prtd->lsm_client->out_hw_params.period_count; - pcm_buf = prtd->lsm_client->lab_buffer[prtd->appl_cnt].data; - dev_dbg(rtd->dev, - "%s: copy the pcm data size %lu\n", - __func__, fbytes); - if (pcm_buf) { - if (copy_to_user(buf, pcm_buf, fbytes)) { - dev_err(rtd->dev, - "%s: failed to copy bytes %lu\n", - __func__, fbytes); - return -EINVAL; - } - } else { - dev_err(rtd->dev, - "%s: Invalid pcm buffer\n", __func__); - return -EINVAL; - } - prtd->appl_cnt = (prtd->appl_cnt + 1) % - prtd->lsm_client->out_hw_params.period_count; - - spin_lock_irqsave(&prtd->xrun_lock, flags); - /* Queue lab buffer here if in xrun */ - if (prtd->xrun_count > 0) { - (prtd->xrun_count)--; - buf_index = (prtd->xrun_index + 1) % - prtd->lsm_client->out_hw_params.period_count; - rc = msm_lsm_queue_lab_buffer(prtd, buf_index); - if (rc) - dev_err(rtd->dev, - "%s: error in queuing the lab buffer rc %d\n", - __func__, rc); - prtd->xrun_index = buf_index; - } - atomic_dec(&prtd->buf_count); - spin_unlock_irqrestore(&prtd->xrun_lock, flags); - - return 0; -} - -static int msm_lsm_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return 0; -} - -static int msm_lsm_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_lsm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *mixer_ctl_name = "Listen Stream"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - ctl_len = strlen(mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Listen app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: Listen app type cntrl add failed: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_lsm_app_type_cfg_ctl_put; - kctl->get = msm_lsm_app_type_cfg_ctl_get; - return 0; -} - -static int msm_lsm_afe_data_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - uint16_t afe_data_format = 0; - int ret = 0; - - afe_data_format = ucontrol->value.integer.value[0]; - pr_debug("%s: afe data is %s\n", __func__, - afe_data_format ? "unprocessed" : "processed"); - - ret = q6lsm_set_afe_data_format(fe_id, afe_data_format); - if (ret) - pr_err("%s: q6lsm_set_afe_data_format failed, ret = %d\n", - __func__, ret); - - return ret; -} - -static int msm_lsm_afe_data_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - uint16_t afe_data_format = 0; - int ret = 0; - - q6lsm_get_afe_data_format(fe_id, &afe_data_format); - ucontrol->value.integer.value[0] = afe_data_format; - pr_debug("%s: afe data is %s\n", __func__, - afe_data_format ? "unprocessed" : "processed"); - - return ret; -} - -static int msm_lsm_add_afe_data_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_usr *afe_data_info; - struct snd_kcontrol *kctl; - const char *mixer_ctl_name = "Listen Stream"; - const char *deviceNo = "NN"; - const char *suffix = "Unprocessed Data"; - int ctl_len, ret = 0; - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 + - strlen(suffix) + 1; - pr_debug("%s: Adding Listen afe data cntrls\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &afe_data_info); - if (ret < 0) { - pr_err("%s: Adding Listen afe data cntrls failed: %d\n", - __func__, ret); - return ret; - } - kctl = afe_data_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_lsm_afe_data_ctl_put; - kctl->get = msm_lsm_afe_data_ctl_get; - - return 0; -} - -static int msm_lsm_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - - ret = msm_lsm_add_app_type_controls(rtd); - if (ret) - pr_err("%s, add app type controls failed:%d\n", __func__, ret); - - ret = msm_lsm_add_afe_data_controls(rtd); - if (ret) - pr_err("%s, add afe data controls failed:%d\n", __func__, ret); - - return ret; -} - -static const struct snd_pcm_ops msm_lsm_ops = { - .open = msm_lsm_open, - .close = msm_lsm_close, - .ioctl = msm_lsm_ioctl, - .prepare = msm_lsm_prepare, - .compat_ioctl = msm_lsm_ioctl_compat, - .hw_params = msm_lsm_hw_params, - .copy_user = msm_lsm_pcm_copy, - .pointer = msm_lsm_pcm_pointer, -}; - -static int msm_asoc_lsm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_lsm_add_controls(rtd); - if (ret) - pr_err("%s, kctl add failed:%d\n", __func__, ret); - - return ret; -} - -static int msm_asoc_lsm_probe(struct snd_soc_platform *platform) -{ - pr_debug("enter %s\n", __func__); - - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_lsm_ops, - .pcm_new = msm_asoc_lsm_new, - .probe = msm_asoc_lsm_probe, -}; - -static int msm_lsm_probe(struct platform_device *pdev) -{ - - return snd_soc_register_platform(&pdev->dev, &msm_soc_platform); -} - -static int msm_lsm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - - return 0; -} - -static const struct of_device_id msm_lsm_client_dt_match[] = { - {.compatible = "qcom,msm-lsm-client" }, - { } -}; - -static struct platform_driver msm_lsm_driver = { - .driver = { - .name = "msm-lsm-client", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(msm_lsm_client_dt_match), - .suppress_bind_attrs = true, - }, - .probe = msm_lsm_probe, - .remove = msm_lsm_remove, -}; - -int __init msm_lsm_client_init(void) -{ - return platform_driver_register(&msm_lsm_driver); -} - -void msm_lsm_client_exit(void) -{ - platform_driver_unregister(&msm_lsm_driver); -} - -MODULE_DESCRIPTION("LSM client platform driver"); -MODULE_DEVICE_TABLE(of, msm_lsm_client_dt_match); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-afe-v2.c b/techpack/audio/4.0/asoc/msm-pcm-afe-v2.c deleted file mode 100644 index f93ddb636a1d..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-afe-v2.c +++ /dev/null @@ -1,917 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-afe-v2.h" - -#define DRV_NAME "msm-pcm-afe-v2" - -#define TIMEOUT_MS 1000 -#define MIN_PLAYBACK_PERIOD_SIZE (128 * 2) -#define MAX_PLAYBACK_PERIOD_SIZE (128 * 2 * 2 * 6) -#define MIN_PLAYBACK_NUM_PERIODS (4) -#define MAX_PLAYBACK_NUM_PERIODS (384) - -#define MIN_CAPTURE_PERIOD_SIZE (128 * 2) -#define MAX_CAPTURE_PERIOD_SIZE (192 * 2 * 2 * 8 * 4) -#define MIN_CAPTURE_NUM_PERIODS (4) -#define MAX_CAPTURE_NUM_PERIODS (384) - -static struct snd_pcm_hardware msm_afe_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE| - SNDRV_PCM_FMTBIT_S24_LE, - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 6, - .buffer_bytes_max = MAX_PLAYBACK_PERIOD_SIZE * - MAX_PLAYBACK_NUM_PERIODS, - .period_bytes_min = MIN_PLAYBACK_PERIOD_SIZE, - .period_bytes_max = MAX_PLAYBACK_PERIOD_SIZE, - .periods_min = MIN_PLAYBACK_NUM_PERIODS, - .periods_max = MAX_PLAYBACK_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_afe_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE| - SNDRV_PCM_FMTBIT_S24_LE, - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 6, - .buffer_bytes_max = MAX_CAPTURE_PERIOD_SIZE * - MAX_CAPTURE_NUM_PERIODS, - .period_bytes_min = MIN_CAPTURE_PERIOD_SIZE, - .period_bytes_max = MAX_CAPTURE_PERIOD_SIZE, - .periods_min = MIN_CAPTURE_NUM_PERIODS, - .periods_max = MAX_CAPTURE_NUM_PERIODS, - .fifo_size = 0, -}; - - -static enum hrtimer_restart afe_hrtimer_callback(struct hrtimer *hrt); -static enum hrtimer_restart afe_hrtimer_rec_callback(struct hrtimer *hrt); - -static enum hrtimer_restart afe_hrtimer_callback(struct hrtimer *hrt) -{ - struct pcm_afe_info *prtd = - container_of(hrt, struct pcm_afe_info, hrt); - struct snd_pcm_substream *substream = prtd->substream; - struct snd_pcm_runtime *runtime = substream->runtime; - u32 mem_map_handle = 0; - - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) - pr_err("%s: mem_map_handle is NULL\n", __func__); - - if (prtd->start) { - pr_debug("sending frame to DSP: poll_time: %d\n", - prtd->poll_time); - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - pr_debug("%s: mem_map_handle 0x%x\n", __func__, mem_map_handle); - afe_rt_proxy_port_write( - (prtd->dma_addr + - (prtd->dsp_cnt * - snd_pcm_lib_period_bytes(prtd->substream))), mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - prtd->dsp_cnt++; - hrtimer_forward_now(hrt, ns_to_ktime(prtd->poll_time - * 1000)); - - return HRTIMER_RESTART; - } else - return HRTIMER_NORESTART; -} -static enum hrtimer_restart afe_hrtimer_rec_callback(struct hrtimer *hrt) -{ - struct pcm_afe_info *prtd = - container_of(hrt, struct pcm_afe_info, hrt); - struct snd_pcm_substream *substream = prtd->substream; - struct snd_pcm_runtime *runtime = substream->runtime; - u32 mem_map_handle = 0; - int ret; - - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) - pr_err("%s: mem_map_handle is NULL\n", __func__); - - if (prtd->start) { - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - pr_debug("%s: mem_map_handle 0x%x\n", __func__, mem_map_handle); - ret = afe_rt_proxy_port_read( - (prtd->dma_addr + (prtd->dsp_cnt - * snd_pcm_lib_period_bytes(prtd->substream))), mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - if (ret < 0) { - pr_err("%s: AFE port read fails: %d\n", __func__, ret); - prtd->start = 0; - return HRTIMER_NORESTART; - } - prtd->dsp_cnt++; - pr_debug("sending frame rec to DSP: poll_time: %d\n", - prtd->poll_time); - hrtimer_forward_now(hrt, ns_to_ktime(prtd->poll_time - * 1000)); - - return HRTIMER_RESTART; - } else - return HRTIMER_NORESTART; -} -static void pcm_afe_process_tx_pkt(uint32_t opcode, - uint32_t token, uint32_t *payload, - void *priv) -{ - struct pcm_afe_info *prtd = priv; - unsigned long dsp_flags; - struct snd_pcm_substream *substream = NULL; - struct snd_pcm_runtime *runtime = NULL; - uint16_t event; - uint64_t period_bytes; - uint64_t bytes_one_sec; - - if (prtd == NULL) - return; - substream = prtd->substream; - runtime = substream->runtime; - pr_debug("%s\n", __func__); - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - switch (opcode) { - case AFE_EVENT_RT_PROXY_PORT_STATUS: { - event = (uint16_t)((0xFFFF0000 & payload[0]) >> 0x10); - switch (event) { - case AFE_EVENT_RTPORT_START: { - prtd->dsp_cnt = 0; - /* Calculate poll time. - * Split steps to avoid overflow. - * Poll time-time corresponding to one period - * in bytes. - * (Samplerate * channelcount * format) = - * bytes in 1 sec. - * Poll time = - * (period bytes / bytes in one sec) * - * 1000000 micro seconds. - * Multiplication by 1000000 is done in two - * steps to keep the accuracy of poll time. - */ - if (prtd->mmap_flag) { - period_bytes = ((uint64_t)( - (snd_pcm_lib_period_bytes( - prtd->substream)) * - 1000)); - bytes_one_sec = (runtime->rate - * runtime->channels * 2); - bytes_one_sec = - div_u64(bytes_one_sec, 1000); - prtd->poll_time = - div_u64(period_bytes, - bytes_one_sec); - pr_debug("prtd->poll_time: %d", - prtd->poll_time); - } - break; - } - case AFE_EVENT_RTPORT_STOP: - pr_debug("%s: event!=0\n", __func__); - prtd->start = 0; - snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); - break; - case AFE_EVENT_RTPORT_LOW_WM: - pr_debug("%s: Underrun\n", __func__); - break; - case AFE_EVENT_RTPORT_HI_WM: - pr_debug("%s: Overrun\n", __func__); - break; - default: - break; - } - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2: - pr_debug("write done\n"); - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - break; - } - case RESET_EVENTS: - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - prtd->reset_event = true; - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); -} - -static void pcm_afe_process_rx_pkt(uint32_t opcode, - uint32_t token, uint32_t *payload, - void *priv) -{ - struct pcm_afe_info *prtd = priv; - unsigned long dsp_flags; - struct snd_pcm_substream *substream = NULL; - struct snd_pcm_runtime *runtime = NULL; - uint16_t event; - uint64_t period_bytes; - uint64_t bytes_one_sec; - uint32_t mem_map_handle = 0; - - if (prtd == NULL) - return; - substream = prtd->substream; - runtime = substream->runtime; - pr_debug("%s\n", __func__); - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - switch (opcode) { - case AFE_EVENT_RT_PROXY_PORT_STATUS: { - event = (uint16_t)((0xFFFF0000 & payload[0]) >> 0x10); - switch (event) { - case AFE_EVENT_RTPORT_START: { - prtd->dsp_cnt = 0; - /* Calculate poll time. Split steps to avoid overflow. - * Poll time-time corresponding to one period in bytes. - * (Samplerate * channelcount * format)=bytes in 1 sec. - * Poll time = (period bytes / bytes in one sec) * - * 1000000 micro seconds. - * Multiplication by 1000000 is done in two steps to - * keep the accuracy of poll time. - */ - if (prtd->mmap_flag) { - period_bytes = ((uint64_t)( - (snd_pcm_lib_period_bytes( - prtd->substream)) * 1000)); - bytes_one_sec = (runtime->rate * - runtime->channels * 2); - bytes_one_sec = div_u64(bytes_one_sec, 1000); - prtd->poll_time = - div_u64(period_bytes, bytes_one_sec); - pr_debug("prtd->poll_time : %d\n", - prtd->poll_time); - } else { - mem_map_handle = - afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) - pr_err("%s:mem_map_handle is NULL\n", - __func__); - /* Do initial read to start transfer */ - afe_rt_proxy_port_read((prtd->dma_addr + - (prtd->dsp_cnt * - snd_pcm_lib_period_bytes( - prtd->substream))), - mem_map_handle, - snd_pcm_lib_period_bytes( - prtd->substream)); - prtd->dsp_cnt++; - } - break; - } - case AFE_EVENT_RTPORT_STOP: - pr_debug("%s: event!=0\n", __func__); - prtd->start = 0; - snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); - break; - case AFE_EVENT_RTPORT_LOW_WM: - pr_debug("%s: Underrun\n", __func__); - break; - case AFE_EVENT_RTPORT_HI_WM: - pr_debug("%s: Overrun\n", __func__); - break; - default: - break; - } - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2: - pr_debug("%s :Read done\n", __func__); - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - if (!prtd->mmap_flag) { - atomic_set(&prtd->rec_bytes_avail, 1); - wake_up(&prtd->read_wait); - } - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - break; - } - case RESET_EVENTS: - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - prtd->reset_event = true; - if (!prtd->mmap_flag) { - atomic_set(&prtd->rec_bytes_avail, 1); - wake_up(&prtd->read_wait); - } - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); -} - -static int msm_afe_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *dai = rtd->cpu_dai; - int ret = 0; - - pr_debug("%s: sample_rate=%d\n", __func__, runtime->rate); - - pr_debug("%s: dai->id =%x\n", __func__, dai->id); - ret = afe_register_get_events(dai->id, - pcm_afe_process_tx_pkt, prtd); - if (ret < 0) { - pr_err("afe-pcm:register for events failed\n"); - return ret; - } - pr_debug("%s:success\n", __func__); - prtd->prepared++; - return ret; -} - -static int msm_afe_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *dai = rtd->cpu_dai; - int ret = 0; - - pr_debug("%s\n", __func__); - - pr_debug("%s: dai->id =%x\n", __func__, dai->id); - ret = afe_register_get_events(dai->id, - pcm_afe_process_rx_pkt, prtd); - if (ret < 0) { - pr_err("afe-pcm:register for events failed\n"); - return ret; - } - pr_debug("%s:success\n", __func__); - prtd->prepared++; - return 0; -} - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 16000, 48000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int msm_afe_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = NULL; - int ret = 0; - - prtd = kzalloc(sizeof(struct pcm_afe_info), GFP_KERNEL); - if (prtd == NULL) - return -ENOMEM; - pr_debug("prtd %pK\n", prtd); - - mutex_init(&prtd->lock); - spin_lock_init(&prtd->dsp_lock); - prtd->dsp_cnt = 0; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - runtime->hw = msm_afe_hardware_playback; - else - runtime->hw = msm_afe_hardware_capture; - - prtd->substream = substream; - runtime->private_data = prtd; - prtd->audio_client = q6afe_audio_client_alloc(prtd); - if (!prtd->audio_client) { - pr_debug("%s: Could not allocate memory\n", __func__); - mutex_unlock(&prtd->lock); - kfree(prtd); - return -ENOMEM; - } - - atomic_set(&prtd->rec_bytes_avail, 0); - init_waitqueue_head(&prtd->read_wait); - - hrtimer_init(&prtd->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->hrt.function = afe_hrtimer_callback; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->hrt.function = afe_hrtimer_rec_callback; - - mutex_unlock(&prtd->lock); - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_err("snd_pcm_hw_constraint_list failed\n"); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_err("snd_pcm_hw_constraint_integer failed\n"); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - MIN_CAPTURE_NUM_PERIODS * MIN_CAPTURE_PERIOD_SIZE, - MAX_CAPTURE_NUM_PERIODS * MAX_CAPTURE_PERIOD_SIZE); - - if (ret < 0) { - pr_err("constraint for buffer bytes min max ret = %d\n", - ret); - } - } - - prtd->reset_event = false; - return 0; -} - -static int msm_afe_playback_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - char *hwbuf = runtime->dma_area + hwoff; - u32 mem_map_handle = 0; - - pr_debug("%s : appl_ptr 0x%lx hw_ptr 0x%lx dest_to_copy 0x%pK\n", - __func__, - runtime->control->appl_ptr, runtime->status->hw_ptr, hwbuf); - - if (copy_from_user(hwbuf, buf, fbytes)) { - pr_err("%s :Failed to copy audio from user buffer\n", - __func__); - - ret = -EFAULT; - goto fail; - } - - if (!prtd->mmap_flag) { - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) { - pr_err("%s: mem_map_handle is NULL\n", __func__); - ret = -EFAULT; - goto fail; - } - - pr_debug("%s : prtd-> dma_addr 0x%lx dsp_cnt %d\n", __func__, - prtd->dma_addr, prtd->dsp_cnt); - - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - - ret = afe_rt_proxy_port_write( - (prtd->dma_addr + (prtd->dsp_cnt * - snd_pcm_lib_period_bytes(prtd->substream))), - mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - - if (ret) { - pr_err("%s: AFE proxy port write failed %d\n", - __func__, ret); - goto fail; - } - prtd->dsp_cnt++; - } -fail: - return ret; -} - -static int msm_afe_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - char *hwbuf = runtime->dma_area + hwoff; - u32 mem_map_handle = 0; - - if (!prtd->mmap_flag) { - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - - if (!mem_map_handle) { - pr_err("%s: mem_map_handle is NULL\n", __func__); - ret = -EFAULT; - goto fail; - } - - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - - ret = afe_rt_proxy_port_read((prtd->dma_addr + - (prtd->dsp_cnt * - snd_pcm_lib_period_bytes(prtd->substream))), - mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - - if (ret) { - pr_err("%s: AFE proxy port read failed %d\n", - __func__, ret); - goto fail; - } - - prtd->dsp_cnt++; - ret = wait_event_timeout(prtd->read_wait, - atomic_read(&prtd->rec_bytes_avail), - msecs_to_jiffies(TIMEOUT_MS)); - if (ret < 0) { - pr_err("%s: wait_event_timeout failed\n", __func__); - - ret = -ETIMEDOUT; - goto fail; - } - atomic_set(&prtd->rec_bytes_avail, 0); - } - pr_debug("%s:appl_ptr 0x%lx hw_ptr 0x%lx src_to_copy 0x%pK\n", - __func__, runtime->control->appl_ptr, - runtime->status->hw_ptr, hwbuf); - - if (copy_to_user(buf, hwbuf, fbytes)) { - pr_err("%s: copy to user failed\n", __func__); - - goto fail; - ret = -EFAULT; - } - -fail: - return ret; -} - -static int msm_afe_copy(struct snd_pcm_substream *substream, int channel, - unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - int ret = 0; - - if (prtd->reset_event) { - pr_debug("%s: reset events received from ADSP, return error\n", - __func__); - return -ENETRESET; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_afe_playback_copy(substream, channel, hwoff, - buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_afe_capture_copy(substream, channel, hwoff, - buf, fbytes); - return ret; -} - -static int msm_afe_close(struct snd_pcm_substream *substream) -{ - int rc = 0; - struct snd_dma_buffer *dma_buf; - struct snd_pcm_runtime *runtime; - struct pcm_afe_info *prtd; - struct snd_soc_pcm_runtime *rtd = NULL; - struct snd_soc_dai *dai = NULL; - int dir = IN; - int ret = 0; - - pr_debug("%s\n", __func__); - if (substream == NULL) { - pr_err("substream is NULL\n"); - return -EINVAL; - } - rtd = substream->private_data; - dai = rtd->cpu_dai; - runtime = substream->runtime; - prtd = runtime->private_data; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - dir = IN; - ret = afe_unregister_get_events(dai->id); - if (ret < 0) - pr_err("AFE unregister for events failed\n"); - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - dir = OUT; - ret = afe_unregister_get_events(dai->id); - if (ret < 0) - pr_err("AFE unregister for events failed\n"); - } - if (prtd->mmap_flag) - hrtimer_cancel(&prtd->hrt); - - rc = afe_cmd_memory_unmap(afe_req_mmap_handle(prtd->audio_client)); - if (rc < 0) - pr_err("AFE memory unmap failed\n"); - - pr_debug("release all buffer\n"); - dma_buf = &substream->dma_buffer; - if (dma_buf == NULL) { - pr_debug("dma_buf is NULL\n"); - goto done; - } - - if (dma_buf->area) - dma_buf->area = NULL; - q6afe_audio_client_buf_free_contiguous(dir, prtd->audio_client); -done: - pr_debug("%s: dai->id =%x\n", __func__, dai->id); - q6afe_audio_client_free(prtd->audio_client); - mutex_unlock(&prtd->lock); - prtd->prepared--; - kfree(prtd); - runtime->private_data = NULL; - return 0; -} -static int msm_afe_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - prtd->pcm_irq_pos = 0; - if (prtd->prepared) - return 0; - mutex_lock(&prtd->lock); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_afe_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_afe_capture_prepare(substream); - mutex_unlock(&prtd->lock); - return ret; -} -static int msm_afe_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - struct afe_audio_client *ac = prtd->audio_client; - struct afe_audio_port_data *apd = ac->port; - struct afe_audio_buffer *ab; - int dir = -1; - - pr_debug("%s\n", __func__); - prtd->mmap_flag = 1; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ab = &(apd[dir].buf[0]); - - return msm_audio_ion_mmap((struct audio_buffer *)ab, vma); -} -static int msm_afe_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: SNDRV_PCM_TRIGGER_START\n", __func__); - prtd->start = 1; - if (prtd->mmap_flag) - hrtimer_start(&prtd->hrt, ns_to_ktime(0), - HRTIMER_MODE_REL); - break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("%s: SNDRV_PCM_TRIGGER_STOP\n", __func__); - prtd->start = 0; - break; - default: - ret = -EINVAL; - break; - } - return ret; -} -static int msm_afe_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct pcm_afe_info *prtd = runtime->private_data; - struct afe_audio_buffer *buf; - int dir, rc; - - pr_debug("%s:\n", __func__); - - mutex_lock(&prtd->lock); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - - rc = q6afe_audio_client_buf_alloc_contiguous(dir, - prtd->audio_client, - (params_buffer_bytes(params) / params_periods(params)), - params_periods(params)); - pr_debug("params_buffer_bytes(params) = %d\n", - (params_buffer_bytes(params))); - pr_debug("params_periods(params) = %d\n", - (params_periods(params))); - pr_debug("params_periodsize(params) = %d\n", - (params_buffer_bytes(params) / params_periods(params))); - - if (rc < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", rc); - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - buf = prtd->audio_client->port[dir].buf; - - if (buf == NULL || buf[0].data == NULL) { - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - - pr_debug("%s:buf = %pK\n", __func__, buf); - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf[0].data; - dma_buf->addr = buf[0].phys; - - dma_buf->bytes = params_buffer_bytes(params); - - if (!dma_buf->area) { - pr_err("%s:MSM AFE physical memory allocation failed\n", - __func__); - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - - memset(dma_buf->area, 0, params_buffer_bytes(params)); - - prtd->dma_addr = (phys_addr_t) dma_buf->addr; - - mutex_unlock(&prtd->lock); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - rc = afe_memory_map(dma_buf->addr, dma_buf->bytes, prtd->audio_client); - if (rc < 0) - pr_err("fail to map memory to DSP\n"); - - return rc; -} -static snd_pcm_uframes_t msm_afe_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - if (prtd->pcm_irq_pos >= snd_pcm_lib_buffer_bytes(substream)) - prtd->pcm_irq_pos = 0; - - if (prtd->reset_event) { - pr_debug("%s: reset events received from ADSP, return XRUN\n", - __func__); - return SNDRV_PCM_POS_XRUN; - } - - pr_debug("pcm_irq_pos = %d\n", prtd->pcm_irq_pos); - return bytes_to_frames(runtime, (prtd->pcm_irq_pos)); -} - -static const struct snd_pcm_ops msm_afe_ops = { - .open = msm_afe_open, - .copy_user = msm_afe_copy, - .hw_params = msm_afe_hw_params, - .trigger = msm_afe_trigger, - .close = msm_afe_close, - .prepare = msm_afe_prepare, - .mmap = msm_afe_mmap, - .pointer = msm_afe_pointer, -}; - - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - pr_debug("%s\n", __func__); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static int msm_afe_afe_probe(struct snd_soc_platform *platform) -{ - pr_debug("%s\n", __func__); - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_afe_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_afe_afe_probe, -}; - -static int msm_afe_probe(struct platform_device *pdev) -{ - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_afe_remove(struct platform_device *pdev) -{ - pr_debug("%s\n", __func__); - snd_soc_unregister_platform(&pdev->dev); - return 0; -} -static const struct of_device_id msm_pcm_afe_dt_match[] = { - {.compatible = "qcom,msm-pcm-afe"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_afe_dt_match); - -static struct platform_driver msm_afe_driver = { - .driver = { - .name = "msm-pcm-afe", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_afe_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_afe_probe, - .remove = msm_afe_remove, -}; - -int __init msm_pcm_afe_init(void) -{ - pr_debug("%s\n", __func__); - return platform_driver_register(&msm_afe_driver); -} - -void msm_pcm_afe_exit(void) -{ - pr_debug("%s\n", __func__); - platform_driver_unregister(&msm_afe_driver); -} - -MODULE_DESCRIPTION("AFE PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-afe-v2.h b/techpack/audio/4.0/asoc/msm-pcm-afe-v2.h deleted file mode 100644 index 3c0d52089887..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-afe-v2.h +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2012,2015-2016 The Linux Foundation. All rights reserved. - */ -#ifndef _MSM_PCM_AFE_H -#define _MSM_PCM_AFE_H -#include -#include - - -struct pcm_afe_info { - unsigned long dma_addr; - struct snd_pcm_substream *substream; - unsigned int pcm_irq_pos; /* IRQ position */ - struct mutex lock; - spinlock_t dsp_lock; - uint32_t samp_rate; - uint32_t channel_mode; - uint8_t start; - uint32_t dsp_cnt; - uint32_t buf_phys; - int32_t mmap_flag; - int prepared; - struct hrtimer hrt; - int poll_time; - struct afe_audio_client *audio_client; - wait_queue_head_t read_wait; - atomic_t rec_bytes_avail; - bool reset_event; -}; - - -#define MSM_EXT(xname, fp_info, fp_get, fp_put, addr) \ - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ - .name = xname, \ - .info = fp_info,\ - .get = fp_get, .put = fp_put, \ - .private_value = addr, \ - } - -#endif /*_MSM_PCM_AFE_H*/ diff --git a/techpack/audio/4.0/asoc/msm-pcm-dtmf-v2.c b/techpack/audio/4.0/asoc/msm-pcm-dtmf-v2.c deleted file mode 100644 index 4a837cdefbe8..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-dtmf-v2.c +++ /dev/null @@ -1,589 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2013-2014, 2017-2019 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" - -#define DTMF_MAX_DURATION 65535 -enum { - DTMF_IN_RX, - DTMF_IN_TX, -}; - -enum format { - FORMAT_S16_LE = 2 -}; - -struct dtmf_det_info { - char session[MAX_SESSION_NAME_LEN]; - uint8_t dir; - uint16_t high_freq; - uint16_t low_freq; -}; - -struct dtmf_buf_node { - struct list_head list; - struct dtmf_det_info dtmf_det_pkt; -}; - -enum dtmf_state { - DTMF_GEN_RX_STOPPED, - DTMF_GEN_RX_STARTED, -}; - -#define DTMF_MAX_Q_LEN 10 -#define DTMF_PKT_SIZE sizeof(struct dtmf_det_info) - -struct dtmf_drv_info { - enum dtmf_state state; - struct snd_pcm_substream *capture_substream; - - struct list_head out_queue; - struct list_head free_out_queue; - - wait_queue_head_t out_wait; - - struct mutex lock; - spinlock_t dsp_lock; - - uint8_t capture_start; - uint8_t capture_instance; - - unsigned int pcm_capture_size; - unsigned int pcm_capture_count; - unsigned int pcm_capture_irq_pos; - unsigned int pcm_capture_buf_pos; -}; - -static struct snd_pcm_hardware msm_pcm_hardware = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = (sizeof(struct dtmf_buf_node) * DTMF_MAX_Q_LEN), - .period_bytes_min = DTMF_PKT_SIZE, - .period_bytes_max = DTMF_PKT_SIZE, - .periods_min = DTMF_MAX_Q_LEN, - .periods_max = DTMF_MAX_Q_LEN, - .fifo_size = 0, -}; - -static int msm_dtmf_rx_generate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint16_t low_freq = ucontrol->value.integer.value[0]; - uint16_t high_freq = ucontrol->value.integer.value[1]; - int64_t duration = ucontrol->value.integer.value[2]; - uint16_t gain = ucontrol->value.integer.value[3]; - - pr_debug("%s: low_freq=%d high_freq=%d duration=%lld gain=%d\n", - __func__, low_freq, high_freq, (int)duration, gain); - - if (duration == DTMF_MAX_DURATION) - duration = -1; - - afe_dtmf_generate_rx(duration, high_freq, low_freq, gain); - return 0; -} - -static int msm_dtmf_rx_generate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s:\n", __func__); - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int msm_dtmf_detect_voice_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int enable = ucontrol->value.integer.value[0]; - - pr_debug("%s: enable=%d\n", __func__, enable); - voc_enable_dtmf_rx_detection(voc_get_session_id(VOICE_SESSION_NAME), - enable); - - return 0; -} - -static int msm_dtmf_detect_voice_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int msm_dtmf_detect_volte_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int enable = ucontrol->value.integer.value[0]; - - pr_debug("%s: enable=%d\n", __func__, enable); - voc_enable_dtmf_rx_detection(voc_get_session_id(VOLTE_SESSION_NAME), - enable); - - return 0; -} - -static int msm_dtmf_detect_volte_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static struct snd_kcontrol_new msm_dtmf_controls[] = { - SOC_SINGLE_MULTI_EXT("DTMF_Generate Rx Low High Duration Gain", - SND_SOC_NOPM, 0, 5000, 0, 4, - msm_dtmf_rx_generate_get, - msm_dtmf_rx_generate_put), - SOC_SINGLE_EXT("DTMF_Detect Rx Voice enable", SND_SOC_NOPM, 0, 1, 0, - msm_dtmf_detect_voice_rx_get, - msm_dtmf_detect_voice_rx_put), - SOC_SINGLE_EXT("DTMF_Detect Rx VoLTE enable", SND_SOC_NOPM, 0, 1, 0, - msm_dtmf_detect_volte_rx_get, - msm_dtmf_detect_volte_rx_put), -}; - -static int msm_pcm_dtmf_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_dtmf_controls, - ARRAY_SIZE(msm_dtmf_controls)); - return 0; -} - -static void dtmf_rx_detected_cb(uint8_t *pkt, - char *session, - void *private_data) -{ - struct dtmf_buf_node *buf_node = NULL; - struct vss_istream_evt_rx_dtmf_detected *dtmf_det_pkt = - (struct vss_istream_evt_rx_dtmf_detected *)pkt; - struct dtmf_drv_info *prtd = private_data; - unsigned long dsp_flags; - - pr_debug("%s\n", __func__); - if (prtd->capture_substream == NULL) - return; - - /* Copy dtmf detected info into out_queue. */ - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - /* discarding dtmf detection info till start is received */ - if (!list_empty(&prtd->free_out_queue) && prtd->capture_start) { - buf_node = list_first_entry(&prtd->free_out_queue, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - buf_node->dtmf_det_pkt.high_freq = dtmf_det_pkt->high_freq; - buf_node->dtmf_det_pkt.low_freq = dtmf_det_pkt->low_freq; - if (session != NULL) - strlcpy(buf_node->dtmf_det_pkt.session, - session, MAX_SESSION_NAME_LEN); - - buf_node->dtmf_det_pkt.dir = DTMF_IN_RX; - pr_debug("high =%d, low=%d session=%s\n", - buf_node->dtmf_det_pkt.high_freq, - buf_node->dtmf_det_pkt.low_freq, - buf_node->dtmf_det_pkt.session); - list_add_tail(&buf_node->list, &prtd->out_queue); - prtd->pcm_capture_irq_pos += prtd->pcm_capture_count; - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(prtd->capture_substream); - } else { - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - pr_err("DTMF detection pkt in Rx dropped, no free node available\n"); - } - - wake_up(&prtd->out_wait); -} - -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct dtmf_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - - ret = wait_event_interruptible_timeout(prtd->out_wait, - (!list_empty(&prtd->out_queue)), - 1 * HZ); - - if (ret > 0) { - if (fbytes <= DTMF_PKT_SIZE) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - buf_node = list_first_entry(&prtd->out_queue, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - ret = copy_to_user(buf, - &buf_node->dtmf_det_pkt, - fbytes); - if (ret) { - pr_err("%s: Copy to user returned %d\n", - __func__, ret); - ret = -EFAULT; - } - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, - &prtd->free_out_queue); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - - } else { - pr_err("%s: Read count %lu > DTMF_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - } else if (ret == 0) { - pr_err("%s: No UL data available\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: Read was interrupted\n", __func__); - ret = -ERESTARTSYS; - } - return ret; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - - pr_debug("%s() DTMF\n", __func__); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, a, hwoff, buf, fbytes); - - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = NULL; - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - prtd = kzalloc(sizeof(struct dtmf_drv_info), GFP_KERNEL); - - if (prtd == NULL) { - ret = -ENOMEM; - goto done; - } - - mutex_init(&prtd->lock); - spin_lock_init(&prtd->dsp_lock); - init_waitqueue_head(&prtd->out_wait); - INIT_LIST_HEAD(&prtd->out_queue); - INIT_LIST_HEAD(&prtd->free_out_queue); - - runtime->hw = msm_pcm_hardware; - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - prtd->capture_substream = substream; - prtd->capture_instance++; - runtime->private_data = prtd; - } - -done: - return ret; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct dtmf_buf_node *buf_node = NULL; - struct snd_dma_buffer *c_dma_buf; - struct snd_pcm_substream *c_substream; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - - pr_debug("%s() DTMF\n", __func__); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - mutex_lock(&prtd->lock); - wake_up(&prtd->out_wait); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_instance--; - - if (!prtd->capture_instance) { - if (prtd->state == DTMF_GEN_RX_STARTED) { - prtd->state = DTMF_GEN_RX_STOPPED; - voc_disable_dtmf_det_on_active_sessions(); - voc_register_dtmf_rx_detection_cb(NULL, NULL); - } - /* release all buffer */ - /* release out_queue and free_out_queue */ - pr_debug("release all buffer\n"); - c_substream = prtd->capture_substream; - if (c_substream == NULL) { - pr_debug("c_substream is NULL\n"); - mutex_unlock(&prtd->lock); - return -EINVAL; - } - - c_dma_buf = &c_substream->dma_buffer; - if (c_dma_buf == NULL) { - pr_debug("c_dma_buf is NULL.\n"); - mutex_unlock(&prtd->lock); - return -EINVAL; - } - - if (c_dma_buf->area != NULL) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_for_each_safe(ptr, next, - &prtd->out_queue) { - buf_node = list_entry(ptr, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - } - - list_for_each_safe(ptr, next, - &prtd->free_out_queue) { - buf_node = list_entry(ptr, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - } - - spin_unlock_irqrestore(&prtd->dsp_lock, - dsp_flags); - dma_free_coherent(c_substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - c_dma_buf->area, - c_dma_buf->addr); - c_dma_buf->area = NULL; - } - } - prtd->capture_substream = NULL; - mutex_unlock(&prtd->lock); - } - - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct dtmf_buf_node *buf_node = NULL; - int i = 0, offset = 0; - int ret = 0; - - pr_debug("%s: DTMF\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - mutex_lock(&prtd->lock); - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - - dma_buf->area = dma_alloc_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - &dma_buf->addr, GFP_KERNEL); - if (!dma_buf->area) { - pr_err("%s:MSM DTMF dma_alloc failed\n", __func__); - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - - dma_buf->bytes = runtime->hw.buffer_bytes_max; - memset(dma_buf->area, 0, runtime->hw.buffer_bytes_max); - - for (i = 0; i < DTMF_MAX_Q_LEN; i++) { - pr_debug("node =%d\n", i); - buf_node = (void *) dma_buf->area + offset; - list_add_tail(&buf_node->list, - &prtd->free_out_queue); - offset = offset + sizeof(struct dtmf_buf_node); - } - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - mutex_unlock(&prtd->lock); - } - - return ret; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - pr_debug("%s: DTMF\n", __func__); - prtd->pcm_capture_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_capture_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_capture_irq_pos = 0; - prtd->pcm_capture_buf_pos = 0; - return 0; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - pr_debug("%s: DTMF\n", __func__); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - mutex_lock(&prtd->lock); - - msm_pcm_capture_prepare(substream); - - if (runtime->format != FORMAT_S16_LE) { - pr_err("format:%u doesn't match %d\n", - (uint32_t)runtime->format, FORMAT_S16_LE); - mutex_unlock(&prtd->lock); - return -EINVAL; - } - - if (prtd->capture_instance && - (prtd->state != DTMF_GEN_RX_STARTED)) { - voc_register_dtmf_rx_detection_cb(dtmf_rx_detected_cb, - prtd); - prtd->state = DTMF_GEN_RX_STARTED; - } - mutex_unlock(&prtd->lock); - } - - return 0; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - pr_debug("%s: Trigger start\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_start = 1; - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_start = 0; - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - snd_pcm_uframes_t ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (prtd->pcm_capture_irq_pos >= prtd->pcm_capture_size) - prtd->pcm_capture_irq_pos = 0; - ret = bytes_to_frames(runtime, (prtd->pcm_capture_irq_pos)); - } - - return ret; -} - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_dtmf_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_pcm_dtmf_dt_match[] = { - {.compatible = "qcom,msm-pcm-dtmf"}, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_pcm_dtmf_dt_match); - - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-dtmf", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_dtmf_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_dtmf_init(void) -{ - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_dtmf_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("DTMF platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-host-voice-v2.c b/techpack/audio/4.0/asoc/msm-pcm-host-voice-v2.c deleted file mode 100644 index 99d6e3732050..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-host-voice-v2.c +++ /dev/null @@ -1,1526 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define HPCM_MAX_Q_LEN 2 -#define HPCM_MIN_VOC_PKT_SIZE 320 -#define HPCM_MAX_VOC_PKT_SIZE 640 -#define VHPCM_BLOCK_SIZE 4096 -#define CACHE_ALIGNMENT_SIZE 128 -#define CACHE_ALIGNMENT_MASK 0xFFFFFF80 - -#define VOICE_TX_CAPTURE_DAI_ID "CS-VOICE HOST TX CAPTURE" -#define VOICE_TX_PLAYBACK_DAI_ID "CS-VOICE HOST TX PLAYBACK" -#define VOICE_RX_CAPTURE_DAI_ID "CS-VOICE HOST RX CAPTURE" -#define VOICE_RX_PLAYBACK_DAI_ID "CS-VOICE HOST RX PLAYBACK" - -#define VOLTE_TX_CAPTURE_DAI_ID "VOLTE HOST TX CAPTURE" -#define VOLTE_TX_PLAYBACK_DAI_ID "VOLTE HOST TX PLAYBACK" -#define VOLTE_RX_CAPTURE_DAI_ID "VOLTE HOST RX CAPTURE" -#define VOLTE_RX_PLAYBACK_DAI_ID "VOLTE HOST RX PLAYBACK" - - -#define VoMMode1_TX_CAPTURE_DAI_ID "VoiceMMode1 HOST TX CAPTURE" -#define VoMMode1_TX_PLAYBACK_DAI_ID "VoiceMMode1 HOST TX PLAYBACK" -#define VoMMode1_RX_CAPTURE_DAI_ID "VoiceMMode1 HOST RX CAPTURE" -#define VoMMode1_RX_PLAYBACK_DAI_ID "VoiceMMode1 HOST RX PLAYBACK" - -#define VoMMode2_TX_CAPTURE_DAI_ID "VoiceMMode2 HOST TX CAPTURE" -#define VoMMode2_TX_PLAYBACK_DAI_ID "VoiceMMode2 HOST TX PLAYBACK" -#define VoMMode2_RX_CAPTURE_DAI_ID "VoiceMMode2 HOST RX CAPTURE" -#define VoMMode2_RX_PLAYBACK_DAI_ID "VoiceMMode2 HOST RX PLAYBACK" - -enum { - RX = 1, - TX, -}; - -enum { - VOICE_INDEX = 0, - VOLTE_INDEX, - VOMMODE1_INDEX, - VOMMODE2_INDEX, - MAX_SESSION -}; - -enum hpcm_state { - HPCM_STOPPED = 1, - HPCM_CLOSED, - HPCM_PREPARED, - HPCM_STARTED, -}; - -struct hpcm_frame { - uint32_t len; - uint8_t voc_pkt[HPCM_MAX_VOC_PKT_SIZE]; -}; - -struct hpcm_buf_node { - struct list_head list; - struct hpcm_frame frame; -}; - -struct vocpcm_ion_buffer { - /* Physical address */ - phys_addr_t paddr; - /* Kernel virtual address */ - void *kvaddr; -}; - -struct dai_data { - enum hpcm_state state; - struct snd_pcm_substream *substream; - struct list_head filled_queue; - struct list_head free_queue; - wait_queue_head_t queue_wait; - spinlock_t dsp_lock; - uint32_t pcm_size; - uint32_t pcm_count; - /* IRQ position */ - uint32_t pcm_irq_pos; - /* Position in buffer */ - uint32_t pcm_buf_pos; - struct vocpcm_ion_buffer vocpcm_ion_buffer; -}; - -struct tap_point { - struct dai_data playback_dai_data; - struct dai_data capture_dai_data; -}; - -struct session { - struct tap_point tx_tap_point; - struct tap_point rx_tap_point; - phys_addr_t sess_paddr; - void *sess_kvaddr; - struct dma_buf *dma_buf; - struct mem_map_table tp_mem_table; -}; - -struct tappnt_mxr_data { - bool enable; - uint16_t direction; - uint16_t sample_rate; -}; - -/* Values from mixer ctl are cached in this structure */ -struct mixer_conf { - int8_t sess_indx; - struct tappnt_mxr_data rx; - struct tappnt_mxr_data tx; -}; - -struct start_cmd { - struct vss_ivpcm_tap_point tap_pnt[2]; - uint32_t no_of_tapoints; -}; - -struct hpcm_drv { - struct mutex lock; - struct session session[MAX_SESSION]; - struct mixer_conf mixer_conf; - struct start_cmd start_cmd; -}; - -static struct hpcm_drv hpcm_drv; - -static struct snd_pcm_hardware msm_pcm_hardware = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .rate_min = 8000, - .rate_max = 16000, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = sizeof(struct hpcm_buf_node) * HPCM_MAX_Q_LEN, - .period_bytes_min = HPCM_MIN_VOC_PKT_SIZE, - .period_bytes_max = HPCM_MAX_VOC_PKT_SIZE, - .periods_min = HPCM_MAX_Q_LEN, - .periods_max = HPCM_MAX_Q_LEN, - .fifo_size = 0, -}; - -static char *hpcm_get_sess_name(int sess_indx) -{ - char *sess_name = NULL; - - if (sess_indx == VOICE_INDEX) - sess_name = VOICE_SESSION_NAME; - else if (sess_indx == VOLTE_INDEX) - sess_name = VOLTE_SESSION_NAME; - else if (sess_indx == VOMMODE1_INDEX) - sess_name = VOICEMMODE1_NAME; - else if (sess_indx == VOMMODE2_INDEX) - sess_name = VOICEMMODE2_NAME; - else - pr_err("%s:, Invalid sess_index\n", __func__); - - return sess_name; -} - -static void hpcm_reset_mixer_config(struct hpcm_drv *prtd) -{ - prtd->mixer_conf.sess_indx = -1; - prtd->mixer_conf.rx.enable = false; - prtd->mixer_conf.rx.direction = -1; - prtd->mixer_conf.rx.sample_rate = 0; - - prtd->mixer_conf.tx.enable = false; - prtd->mixer_conf.tx.direction = -1; - prtd->mixer_conf.tx.sample_rate = 0; -} - -/* Check for valid mixer control values */ -static bool hpcm_is_valid_config(int sess_indx, int tap_point, - uint16_t direction, uint16_t samplerate) -{ - if (sess_indx < VOICE_INDEX || sess_indx > VOMMODE2_INDEX) { - pr_err("%s: invalid sess_indx :%d\n", __func__, sess_indx); - goto error; - } - - if (samplerate != VSS_IVPCM_SAMPLING_RATE_8K && - samplerate != VSS_IVPCM_SAMPLING_RATE_16K) { - pr_err("%s: invalid sample rate :%d\n", __func__, samplerate); - goto error; - } - - if ((tap_point != RX) && (tap_point != TX)) { - pr_err("%s: invalid tappoint :%d\n", __func__, tap_point); - goto error; - } - - if ((direction != VSS_IVPCM_TAP_POINT_DIR_IN) && - (direction != VSS_IVPCM_TAP_POINT_DIR_OUT) && - (direction != VSS_IVPCM_TAP_POINT_DIR_OUT_IN)) { - pr_err("%s: invalid direction :%d\n", __func__, direction); - goto error; - } - - return true; - -error: - return false; -} - - -static struct dai_data *hpcm_get_dai_data(char *pcm_id, struct hpcm_drv *prtd) -{ - struct dai_data *dai_data = NULL; - size_t size = 0; - - if (pcm_id) { - size = strlen(pcm_id); - /* Check for Voice DAI */ - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VOICE_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOICE_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].rx_tap_point.playback_dai_data; - /* Check for VoLTE DAI */ - } else if (strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VOLTE_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOLTE_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].rx_tap_point.playback_dai_data; - /* check for VoiceMMode1 DAI */ - } else if (strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VoMMode1_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode1_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].rx_tap_point.playback_dai_data; - /* check for VOiceMMode2 DAI */ - } else if (strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VoMMode2_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode2_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].rx_tap_point.playback_dai_data; - - } else { - pr_err("%s: Wrong dai id\n", __func__); - } - } - - return dai_data; -} - -static struct tap_point *hpcm_get_tappoint_data(char *pcm_id, - struct hpcm_drv *prtd) -{ - struct tap_point *tp = NULL; - size_t size = 0; - - if (pcm_id) { - size = strlen(pcm_id); - /* Check for Voice DAI */ - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOICE_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VOICE_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].rx_tap_point; - /* Check for VoLTE DAI */ - } else if (strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOLTE_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VOLTE_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].rx_tap_point; - /* check for VoiceMMode1 */ - } else if (strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode1_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VoMMode1_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].rx_tap_point; - /* check for VoiceMMode2 */ - } else if (strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode2_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VoMMode2_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].rx_tap_point; - } else { - pr_err("%s: wrong dai id\n", __func__); - } - } - - return tp; -} - -static struct tappnt_mxr_data *hpcm_get_tappnt_mixer_data(char *pcm_id, - struct hpcm_drv *prtd) -{ - - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, strlen(pcm_id))) { - return &prtd->mixer_conf.tx; - } else { - return &prtd->mixer_conf.rx; - } -} - -static int get_tappnt_value(char *pcm_id) -{ - - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, strlen(pcm_id))) { - return TX; - } else { - return RX; - } -} - -static bool hpcm_all_dais_are_ready(uint16_t direction, struct tap_point *tp, - enum hpcm_state state) -{ - bool dais_started = false; - - /* - * Based on the direction set per tap point in the mixer control, - * all the dais per tap point should meet the required state for the - * commands such as vpcm_map_memory/vpcm_start to be executed. - */ - switch (direction) { - case VSS_IVPCM_TAP_POINT_DIR_OUT_IN: - if ((tp->playback_dai_data.state >= state) && - (tp->capture_dai_data.state >= state)) { - dais_started = true; - } - break; - - case VSS_IVPCM_TAP_POINT_DIR_IN: - if (tp->playback_dai_data.state >= state) - dais_started = true; - break; - - case VSS_IVPCM_TAP_POINT_DIR_OUT: - if (tp->capture_dai_data.state >= state) - dais_started = true; - break; - - default: - pr_err("invalid direction\n"); - } - - return dais_started; -} - -static void hpcm_create_free_queue(struct snd_dma_buffer *dma_buf, - struct dai_data *dai_data) -{ - struct hpcm_buf_node *buf_node = NULL; - int i = 0, offset = 0; - - for (i = 0; i < HPCM_MAX_Q_LEN; i++) { - buf_node = (void *)dma_buf->area + offset; - list_add_tail(&buf_node->list, - &dai_data->free_queue); - offset = offset + sizeof(struct hpcm_buf_node); - } -} - -static void hpcm_free_allocated_mem(struct hpcm_drv *prtd) -{ - phys_addr_t paddr = 0; - struct tap_point *txtp = NULL; - struct tap_point *rxtp = NULL; - struct session *sess = NULL; - - sess = &prtd->session[prtd->mixer_conf.sess_indx]; - txtp = &sess->tx_tap_point; - rxtp = &sess->rx_tap_point; - paddr = sess->sess_paddr; - - if (paddr) { - msm_audio_ion_free(sess->dma_buf); - sess->dma_buf = NULL; - msm_audio_ion_free(sess->tp_mem_table.dma_buf); - sess->tp_mem_table.dma_buf = NULL; - sess->sess_paddr = 0; - sess->sess_kvaddr = 0; - - txtp->capture_dai_data.vocpcm_ion_buffer.paddr = 0; - txtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = 0; - - txtp->playback_dai_data.vocpcm_ion_buffer.paddr = 0; - txtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = 0; - - rxtp->capture_dai_data.vocpcm_ion_buffer.paddr = 0; - rxtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = 0; - - rxtp->playback_dai_data.vocpcm_ion_buffer.paddr = 0; - rxtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = 0; - } else { - pr_debug("%s, paddr = 0, nothing to free\n", __func__); - } -} - -static void hpcm_unmap_and_free_shared_memory(struct hpcm_drv *prtd) - -{ - phys_addr_t paddr = 0; - char *sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - - if (prtd->mixer_conf.sess_indx >= 0) - paddr = prtd->session[prtd->mixer_conf.sess_indx].sess_paddr; - else - paddr = 0; - - if (paddr) { - voc_send_cvp_unmap_vocpcm_memory(voc_get_session_id(sess_name)); - hpcm_free_allocated_mem(prtd); - } else { - pr_debug("%s, paddr = 0, nothing to unmap/free\n", __func__); - } -} - -static int hpcm_map_vocpcm_memory(struct hpcm_drv *prtd) -{ - int ret = 0; - char *sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - struct session *sess = NULL; - - sess = &prtd->session[prtd->mixer_conf.sess_indx]; - - ret = voc_send_cvp_map_vocpcm_memory(voc_get_session_id(sess_name), - &sess->tp_mem_table, - sess->sess_paddr, - VHPCM_BLOCK_SIZE); - - return ret; -} - -static int hpcm_allocate_shared_memory(struct hpcm_drv *prtd) -{ - int result; - int ret = 0; - size_t mem_len; - size_t len; - struct tap_point *txtp = NULL; - struct tap_point *rxtp = NULL; - struct session *sess = NULL; - - sess = &prtd->session[prtd->mixer_conf.sess_indx]; - txtp = &sess->tx_tap_point; - rxtp = &sess->rx_tap_point; - - result = msm_audio_ion_alloc(&sess->dma_buf, - VHPCM_BLOCK_SIZE, - &sess->sess_paddr, - &mem_len, - &sess->sess_kvaddr); - if (result) { - pr_err("%s: msm_audio_ion_alloc error, rc = %d\n", - __func__, result); - sess->sess_paddr = 0; - sess->sess_kvaddr = 0; - ret = -ENOMEM; - goto done; - } - pr_debug("%s: Host PCM memory block allocated\n", __func__); - - /* Allocate mem_map_table for tap point */ - result = msm_audio_ion_alloc(&sess->tp_mem_table.dma_buf, - sizeof(struct vss_imemory_table_t), - &sess->tp_mem_table.phys, - &len, - &sess->tp_mem_table.data); - - if (result) { - pr_err("%s: msm_audio_ion_alloc error, rc = %d\n", - __func__, result); - msm_audio_ion_free(sess->dma_buf); - sess->dma_buf = NULL; - sess->sess_paddr = 0; - sess->sess_kvaddr = 0; - ret = -ENOMEM; - goto done; - } - pr_debug("%s: Host PCM memory table allocated\n", __func__); - - memset(sess->tp_mem_table.data, 0, - sizeof(struct vss_imemory_table_t)); - - sess->tp_mem_table.size = sizeof(struct vss_imemory_table_t); - - pr_debug("%s: data %pK phys %pK\n", __func__, - sess->tp_mem_table.data, &sess->tp_mem_table.phys); - - /* Split 4096 block into four 1024 byte blocks for each dai */ - txtp->capture_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr; - txtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr; - - txtp->playback_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr + VHPCM_BLOCK_SIZE/4; - txtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr + VHPCM_BLOCK_SIZE/4; - - rxtp->capture_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr + (VHPCM_BLOCK_SIZE/4) * 2; - rxtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr + (VHPCM_BLOCK_SIZE/4) * 2; - - rxtp->playback_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr + (VHPCM_BLOCK_SIZE/4) * 3; - rxtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr + (VHPCM_BLOCK_SIZE/4) * 3; - -done: - return ret; -} - -static int hpcm_start_vocpcm(char *pcm_id, struct hpcm_drv *prtd, - struct tap_point *tp) -{ - int indx = prtd->mixer_conf.sess_indx; - uint32_t *no_of_tp = &prtd->start_cmd.no_of_tapoints; - struct vss_ivpcm_tap_point *tap_pnt = &prtd->start_cmd.tap_pnt[0]; - uint32_t no_of_tp_req = 0; - char *sess_name = hpcm_get_sess_name(indx); - - if (prtd->mixer_conf.rx.enable) - no_of_tp_req++; - if (prtd->mixer_conf.tx.enable) - no_of_tp_req++; - - if (prtd->mixer_conf.rx.enable && (get_tappnt_value(pcm_id) == RX)) { - if (hpcm_all_dais_are_ready(prtd->mixer_conf.rx.direction, - tp, HPCM_PREPARED)) { - pr_debug("%s: RX conditions met\n", __func__); - tap_pnt[*no_of_tp].tap_point = - VSS_IVPCM_TAP_POINT_RX_DEFAULT; - tap_pnt[*no_of_tp].direction = - prtd->mixer_conf.rx.direction; - tap_pnt[*no_of_tp].sampling_rate = - prtd->mixer_conf.rx.sample_rate; - (*no_of_tp)++; - } - } - - if (prtd->mixer_conf.tx.enable && (get_tappnt_value(pcm_id) == TX)) { - if (hpcm_all_dais_are_ready(prtd->mixer_conf.tx.direction, - tp, HPCM_PREPARED)) { - pr_debug("%s: TX conditions met\n", __func__); - tap_pnt[*no_of_tp].tap_point = - VSS_IVPCM_TAP_POINT_TX_DEFAULT; - tap_pnt[*no_of_tp].direction = - prtd->mixer_conf.tx.direction; - tap_pnt[*no_of_tp].sampling_rate = - prtd->mixer_conf.tx.sample_rate; - (*no_of_tp)++; - } - } - - if ((prtd->mixer_conf.tx.enable || prtd->mixer_conf.rx.enable) && - *no_of_tp == no_of_tp_req) { - voc_send_cvp_start_vocpcm(voc_get_session_id(sess_name), - tap_pnt, *no_of_tp); - /* Reset the start command so that it is not called twice */ - memset(&prtd->start_cmd, 0, sizeof(struct start_cmd)); - } else { - pr_debug("%s: required pcm handles not opened yet\n", __func__); - } - - return 0; -} - -/* Playback path*/ -static void hpcm_copy_playback_data_from_queue(struct dai_data *dai_data, - uint32_t *len) -{ - struct hpcm_buf_node *buf_node = NULL; - unsigned long dsp_flags; - - if (dai_data->substream == NULL) - return; - - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - - if (!list_empty(&dai_data->filled_queue)) { - buf_node = list_first_entry(&dai_data->filled_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - *len = buf_node->frame.len; - memcpy((u8 *)dai_data->vocpcm_ion_buffer.kvaddr, - &buf_node->frame.voc_pkt[0], - buf_node->frame.len); - - list_add_tail(&buf_node->list, &dai_data->free_queue); - dai_data->pcm_irq_pos += dai_data->pcm_count; - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(dai_data->substream); - } else { - *len = 0; - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - pr_err("IN data not available\n"); - } - - wake_up(&dai_data->queue_wait); -} - -/* Capture path*/ -static void hpcm_copy_capture_data_to_queue(struct dai_data *dai_data, - uint32_t len) -{ - struct hpcm_buf_node *buf_node = NULL; - unsigned long dsp_flags; - - if (dai_data->substream == NULL) - return; - - /* Copy out buffer packet into free_queue */ - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - - if (!list_empty(&dai_data->free_queue)) { - buf_node = list_first_entry(&dai_data->free_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - buf_node->frame.len = len; - memcpy(&buf_node->frame.voc_pkt[0], - (uint8_t *)dai_data->vocpcm_ion_buffer.kvaddr, - buf_node->frame.len); - list_add_tail(&buf_node->list, &dai_data->filled_queue); - dai_data->pcm_irq_pos += dai_data->pcm_count; - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(dai_data->substream); - } else { - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - pr_err("OUTPUT data dropped\n"); - } - - wake_up(&dai_data->queue_wait); -} - -void hpcm_notify_evt_processing(uint8_t *data, char *session, - void *private_data) -{ - struct hpcm_drv *prtd = (struct hpcm_drv *)private_data; - struct vss_ivpcm_evt_notify_v2_t *notify_evt = - (struct vss_ivpcm_evt_notify_v2_t *)data; - struct vss_ivpcm_evt_push_buffer_v2_t push_buff_event; - struct tap_point *tp = NULL; - int in_buf_len = 0; - struct tappnt_mxr_data *tmd = NULL; - char *sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - - /* If it's not a timetick, it's a error notification, drop the event */ - if ((notify_evt->notify_mask & VSS_IVPCM_NOTIFY_MASK_TIMETICK) == 0) { - pr_err("%s: Error notification. mask=%d\n", __func__, - notify_evt->notify_mask); - return; - } - - if (notify_evt->tap_point == VSS_IVPCM_TAP_POINT_TX_DEFAULT) { - tp = &prtd->session[prtd->mixer_conf.sess_indx].tx_tap_point; - tmd = &prtd->mixer_conf.tx; - } else if (notify_evt->tap_point == VSS_IVPCM_TAP_POINT_RX_DEFAULT) { - tp = &prtd->session[prtd->mixer_conf.sess_indx].rx_tap_point; - tmd = &prtd->mixer_conf.rx; - } - - if (tp == NULL || tmd == NULL) { - pr_err("%s: tp = %pK or tmd = %pK is null\n", __func__, - tp, tmd); - - return; - } - - if (notify_evt->notify_mask & VSS_IVPCM_NOTIFY_MASK_OUTPUT_BUFFER) { - hpcm_copy_capture_data_to_queue(&tp->capture_dai_data, - notify_evt->filled_out_size); - } - - if (notify_evt->notify_mask & VSS_IVPCM_NOTIFY_MASK_INPUT_BUFFER) { - hpcm_copy_playback_data_from_queue(&tp->playback_dai_data, - &in_buf_len); - } - - switch (tmd->direction) { - /* - * When the dir is OUT_IN, for the first notify mask, pushbuf mask - * should be set to VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER since we - * atleast need one buffer's worth data before we can send IN buffer. - * For the consecutive notify evts, the push buf mask will set for both - * VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER and - * VSS_IVPCM_PUSH_BUFFER_MASK_IN_BUFFER. - */ - case VSS_IVPCM_TAP_POINT_DIR_OUT_IN: - if (notify_evt->notify_mask == - VSS_IVPCM_NOTIFY_MASK_TIMETICK) { - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER; - } else { - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER | - VSS_IVPCM_PUSH_BUFFER_MASK_INPUT_BUFFER; - } - break; - - case VSS_IVPCM_TAP_POINT_DIR_IN: - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_INPUT_BUFFER; - break; - - case VSS_IVPCM_TAP_POINT_DIR_OUT: - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER; - break; - } - - push_buff_event.tap_point = notify_evt->tap_point; - push_buff_event.out_buf_mem_address = - tp->capture_dai_data.vocpcm_ion_buffer.paddr; - push_buff_event.in_buf_mem_address = - tp->playback_dai_data.vocpcm_ion_buffer.paddr; - push_buff_event.sampling_rate = notify_evt->sampling_rate; - push_buff_event.num_in_channels = 1; - - /* - * ADSP must read and write from a cache aligned (128 byte) location, - * and in blocks of the cache alignment size. The 128 byte cache - * alignment requirement is guaranteed due to 4096 byte memory - * alignment requirement during memory allocation/mapping. The output - * buffer (ADSP write) size mask ensures that a 128 byte multiple - * worth of will be written. Internally, the input buffer (ADSP read) - * size will also be a multiple of 128 bytes. However it is the - * application's responsibility to ensure no other data is written in - * the specified length of memory. - */ - push_buff_event.out_buf_mem_size = ((notify_evt->request_buf_size) + - CACHE_ALIGNMENT_SIZE) & CACHE_ALIGNMENT_MASK; - push_buff_event.in_buf_mem_size = in_buf_len; - - voc_send_cvp_vocpcm_push_buf_evt(voc_get_session_id(sess_name), - &push_buff_event); -} - -static int msm_hpcm_configure_voice_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point = %d direction = %d sample_rate = %d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOICE_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control voice values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOICE_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; -} - -static int msm_hpcm_configure_vmmode1_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point = %d direction = %d sample_rate = %d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOMMODE1_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control voice values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOMMODE1_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; -} - -static int msm_hpcm_configure_vmmode2_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point = %d direction = %d sample_rate = %d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOMMODE2_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control voice values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOMMODE2_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; -} - -static int msm_hpcm_configure_volte_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point=%d direction=%d sample_rate=%d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOLTE_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control volte values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOLTE_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; - -} - -static struct snd_kcontrol_new msm_hpcm_controls[] = { - SOC_SINGLE_MULTI_EXT("HPCM_Voice tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_voice_put), - SOC_SINGLE_MULTI_EXT("HPCM_VoLTE tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_volte_put), - SOC_SINGLE_MULTI_EXT("HPCM_VMMode1 tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_vmmode1_put), - SOC_SINGLE_MULTI_EXT("HPCM_VMMode2 tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_vmmode2_put), -}; - -/* Sample rates supported */ -static unsigned int supported_sample_rates[] = {8000, 16000}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct hpcm_buf_node *buf_node = NULL; - struct snd_dma_buffer *dma_buf; - struct snd_pcm_runtime *runtime; - struct hpcm_drv *prtd; - unsigned long dsp_flags; - struct dai_data *dai_data = NULL; - struct tap_point *tp = NULL; - struct tappnt_mxr_data *tmd = NULL; - char *sess_name = NULL; - - if (substream == NULL) { - pr_err("substream is NULL\n"); - return -EINVAL; - } - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - runtime = substream->runtime; - prtd = runtime->private_data; - sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - wake_up(&dai_data->queue_wait); - mutex_lock(&prtd->lock); - - tmd = hpcm_get_tappnt_mixer_data(substream->pcm->id, prtd); - - tp = hpcm_get_tappoint_data(substream->pcm->id, prtd); - /* Send stop command */ - voc_send_cvp_stop_vocpcm(voc_get_session_id(sess_name)); - /* Memory unmap/free takes place only when called the first time */ - hpcm_unmap_and_free_shared_memory(prtd); - /* Unregister host PCM event callback function */ - voc_deregister_hpcm_evt_cb(); - /* Reset the cached start cmd */ - memset(&prtd->start_cmd, 0, sizeof(struct start_cmd)); - /* Release all buffer */ - pr_debug("%s: Release all buffer\n", __func__); - substream = dai_data->substream; - if (substream == NULL) { - pr_debug("%s: substream is NULL\n", __func__); - goto done; - } - dma_buf = &substream->dma_buffer; - if (dma_buf == NULL) { - pr_debug("%s: dma_buf is NULL\n", __func__); - goto done; - } - if (dma_buf->area != NULL) { - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - list_for_each_safe(ptr, next, &dai_data->filled_queue) { - buf_node = list_entry(ptr, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - } - list_for_each_safe(ptr, next, &dai_data->free_queue) { - buf_node = list_entry(ptr, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - } - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - dma_free_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, dma_buf->area, - dma_buf->addr); - dma_buf->area = NULL; - } - dai_data->substream = NULL; - dai_data->pcm_buf_pos = 0; - dai_data->pcm_count = 0; - dai_data->pcm_irq_pos = 0; - dai_data->pcm_size = 0; - dai_data->state = HPCM_CLOSED; - hpcm_reset_mixer_config(prtd); - -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - struct hpcm_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - unsigned long dsp_flags; - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_interruptible_timeout(dai_data->queue_wait, - (!list_empty(&dai_data->free_queue) || - dai_data->state == HPCM_STOPPED), - 1 * HZ); - if (ret > 0) { - if (fbytes <= HPCM_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - buf_node = - list_first_entry(&dai_data->free_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - ret = copy_from_user(&buf_node->frame.voc_pkt, buf, - fbytes); - buf_node->frame.len = fbytes; - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, &dai_data->filled_queue); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - } else { - pr_err("%s: Write cnt %lu is > HPCM_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - } else if (ret == 0) { - pr_err("%s: No free Playback buffer\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: playback copy was interrupted\n", __func__); - } - -done: - return ret; -} - -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct hpcm_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - unsigned long dsp_flags; - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_interruptible_timeout(dai_data->queue_wait, - (!list_empty(&dai_data->filled_queue) || - dai_data->state == HPCM_STOPPED), - 1 * HZ); - - if (ret > 0) { - if (fbytes <= HPCM_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - buf_node = list_first_entry(&dai_data->filled_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - ret = copy_to_user(buf, &buf_node->frame.voc_pkt, - buf_node->frame.len); - if (ret) { - pr_err("%s: Copy to user returned %d\n", - __func__, ret); - ret = -EFAULT; - } - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, &dai_data->free_queue); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - - } else { - pr_err("%s: Read count %lu > HPCM_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - - } else if (ret == 0) { - pr_err("%s: No Caputre data available\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: Read was interrupted\n", __func__); - ret = -ERESTARTSYS; - } - -done: - return ret; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int channel, - unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_copy(substream, channel, - hwoff, buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, channel, - hwoff, buf, fbytes); - - return ret; -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - struct dai_data *dai_data = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - snd_pcm_uframes_t ret; - - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = 0; - goto done; - } - - if (dai_data->pcm_irq_pos >= dai_data->pcm_size) - dai_data->pcm_irq_pos = 0; - - ret = bytes_to_frames(runtime, (dai_data->pcm_irq_pos)); - -done: - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = - hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - pr_debug("SNDRV_PCM_TRIGGER_START\n"); - dai_data->state = HPCM_STARTED; - break; - - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - dai_data->state = HPCM_STOPPED; - break; - - default: - ret = -EINVAL; - break; - } - -done: - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = NULL; - struct tap_point *tp = NULL; - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - mutex_lock(&prtd->lock); - - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - dai_data->pcm_size = snd_pcm_lib_buffer_bytes(substream); - dai_data->pcm_count = snd_pcm_lib_period_bytes(substream); - dai_data->pcm_irq_pos = 0; - dai_data->pcm_buf_pos = 0; - dai_data->state = HPCM_PREPARED; - - /* Register event notify processing callback in prepare instead of - * init() as q6voice module's init() can be called at a later point - */ - voc_register_hpcm_evt_cb(hpcm_notify_evt_processing, &hpcm_drv); - - tp = hpcm_get_tappoint_data(substream->pcm->id, prtd); - if (tp != NULL) { - ret = hpcm_start_vocpcm(substream->pcm->id, prtd, tp); - if (ret) { - pr_err("error sending start cmd err=%d\n", ret); - goto done; - } - } else { - pr_err("%s tp is NULL\n", __func__); - } -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct hpcm_drv *prtd = (struct hpcm_drv *)runtime->private_data; - int ret = 0; - - pr_debug("%s: %s\n", __func__, substream->pcm->id); - mutex_lock(&prtd->lock); - - /* Allocate and map voice host PCM ion buffer */ - if (prtd->session[prtd->mixer_conf.sess_indx].sess_paddr == 0) { - ret = hpcm_allocate_shared_memory(prtd); - if (ret) { - pr_err("error creating shared memory err=%d\n", ret); - goto done; - } - - ret = hpcm_map_vocpcm_memory(prtd); - if (ret) { - pr_err("error mapping shared memory err=%d\n", ret); - hpcm_free_allocated_mem(prtd); - goto done; - } - } else { - pr_debug("%s, VHPCM memory allocation/mapping not performed\n" - , __func__); - } - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - - dma_buf->area = dma_alloc_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - &dma_buf->addr, GFP_KERNEL); - - if (!dma_buf->area) { - pr_err("%s:MSM dma_alloc failed\n", __func__); - ret = -ENOMEM; - goto done; - } - - dma_buf->bytes = runtime->hw.buffer_bytes_max; - memset(dma_buf->area, 0, runtime->hw.buffer_bytes_max); - - hpcm_create_free_queue(dma_buf, - hpcm_get_dai_data(substream->pcm->id, prtd)); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = &hpcm_drv; - struct tappnt_mxr_data *tmd = NULL; - struct dai_data *dai_data = NULL; - int ret = 0; - int tp_val = 0; - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - mutex_lock(&prtd->lock); - - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - runtime->hw = msm_pcm_hardware; - - ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_debug("snd_pcm_hw_constraint_list failed\n"); - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) { - pr_debug("snd_pcm_hw_constraint_integer failed\n"); - goto done; - } - - tp_val = get_tappnt_value(substream->pcm->id); - tmd = hpcm_get_tappnt_mixer_data(substream->pcm->id, prtd); - - /* Check wheather the kcontrol values set are valid */ - if (!tmd || - !(tmd->enable) || - !hpcm_is_valid_config(prtd->mixer_conf.sess_indx, - tp_val, tmd->direction, - tmd->sample_rate)) { - ret = -EINVAL; - goto done; - } - - dai_data->substream = substream; - runtime->private_data = prtd; - -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .hw_params = msm_pcm_hw_params, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .copy_user = msm_pcm_copy, - .close = msm_pcm_close, -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - - pr_debug("%s:\n", __func__); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - return 0; -} - -static int msm_pcm_hpcm_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_hpcm_controls, - ARRAY_SIZE(msm_hpcm_controls)); - - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_hpcm_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - - pr_info("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_voice_host_pcm_dt_match[] = { - {.compatible = "qcom,msm-voice-host-pcm"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_voice_host_pcm_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-voice-host-pcm", - .owner = THIS_MODULE, - .of_match_table = msm_voice_host_pcm_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_voice_host_init(void) -{ - int i = 0; - struct session *s = NULL; - - memset(&hpcm_drv, 0, sizeof(hpcm_drv)); - mutex_init(&hpcm_drv.lock); - - for (i = 0; i < MAX_SESSION; i++) { - s = &hpcm_drv.session[i]; - spin_lock_init(&s->rx_tap_point.capture_dai_data.dsp_lock); - spin_lock_init(&s->rx_tap_point.playback_dai_data.dsp_lock); - spin_lock_init(&s->tx_tap_point.capture_dai_data.dsp_lock); - spin_lock_init(&s->tx_tap_point.playback_dai_data.dsp_lock); - - init_waitqueue_head( - &s->rx_tap_point.capture_dai_data.queue_wait); - init_waitqueue_head( - &s->rx_tap_point.playback_dai_data.queue_wait); - init_waitqueue_head( - &s->tx_tap_point.capture_dai_data.queue_wait); - init_waitqueue_head( - &s->tx_tap_point.playback_dai_data.queue_wait); - - INIT_LIST_HEAD(&s->rx_tap_point.capture_dai_data.filled_queue); - INIT_LIST_HEAD(&s->rx_tap_point.capture_dai_data.free_queue); - INIT_LIST_HEAD(&s->rx_tap_point.playback_dai_data.filled_queue); - INIT_LIST_HEAD(&s->rx_tap_point.playback_dai_data.free_queue); - - INIT_LIST_HEAD(&s->tx_tap_point.capture_dai_data.filled_queue); - INIT_LIST_HEAD(&s->tx_tap_point.capture_dai_data.free_queue); - INIT_LIST_HEAD(&s->tx_tap_point.playback_dai_data.filled_queue); - INIT_LIST_HEAD(&s->tx_tap_point.playback_dai_data.free_queue); - } - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_voice_host_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-hostless.c b/techpack/audio/4.0/asoc/msm-pcm-hostless.c deleted file mode 100644 index 000eb927467d..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-hostless.c +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2011-2014, 2017-2019 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - - -static int msm_pcm_hostless_prepare(struct snd_pcm_substream *substream) -{ - if (!substream) { - pr_err("%s: invalid params\n", __func__); - return -EINVAL; - } - pm_qos_remove_request(&substream->latency_pm_qos_req); - return 0; -} - -static const struct snd_pcm_ops msm_pcm_hostless_ops = { - .prepare = msm_pcm_hostless_prepare -}; - -static struct snd_soc_platform_driver msm_soc_hostless_platform = { - .ops = &msm_pcm_hostless_ops, -}; - -static int msm_pcm_hostless_probe(struct platform_device *pdev) -{ - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_hostless_platform); -} - -static int msm_pcm_hostless_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_pcm_hostless_dt_match[] = { - {.compatible = "qcom,msm-pcm-hostless"}, - {} -}; - -static struct platform_driver msm_pcm_hostless_driver = { - .driver = { - .name = "msm-pcm-hostless", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_hostless_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_hostless_probe, - .remove = msm_pcm_hostless_remove, -}; - -int __init msm_pcm_hostless_init(void) -{ - return platform_driver_register(&msm_pcm_hostless_driver); -} - -void msm_pcm_hostless_exit(void) -{ - platform_driver_unregister(&msm_pcm_hostless_driver); -} - -MODULE_DESCRIPTION("Hostless platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-loopback-v2.c b/techpack/audio/4.0/asoc/msm-pcm-loopback-v2.c deleted file mode 100644 index 8ad8120c1638..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-loopback-v2.c +++ /dev/null @@ -1,1492 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-routing-v2.h" - -#define LOOPBACK_VOL_MAX_STEPS 0x2000 -#define LOOPBACK_SESSION_MAX 4 - -static DEFINE_MUTEX(loopback_session_lock); -static const DECLARE_TLV_DB_LINEAR(loopback_rx_vol_gain, 0, - LOOPBACK_VOL_MAX_STEPS); - -struct msm_pcm_loopback { - struct snd_pcm_substream *playback_substream; - struct snd_pcm_substream *capture_substream; - - int instance; - - struct mutex lock; - - uint32_t samp_rate; - uint32_t channel_mode; - - int playback_start; - int capture_start; - int session_id; - struct audio_client *audio_client; - uint32_t volume; -}; - -struct fe_dai_session_map { - char stream_name[32]; - struct msm_pcm_loopback *loopback_priv; -}; - -static struct fe_dai_session_map session_map[LOOPBACK_SESSION_MAX] = { - { {}, NULL}, - { {}, NULL}, - { {}, NULL}, - { {}, NULL}, -}; - -static u32 hfp_tx_mute; - -struct msm_pcm_pdata { - int perf_mode; - struct snd_pcm *pcm_device[MSM_FRONTEND_DAI_MM_SIZE]; - struct msm_pcm_channel_mixer *chmixer_pspd[MSM_FRONTEND_DAI_MM_SIZE][2]; -}; - -static void stop_pcm(struct msm_pcm_loopback *pcm); -static int msm_pcm_loopback_get_session(struct snd_soc_pcm_runtime *rtd, - struct msm_pcm_loopback **pcm); - -static void msm_pcm_route_event_handler(enum msm_pcm_routing_event event, - void *priv_data) -{ - struct msm_pcm_loopback *pcm = priv_data; - - WARN_ON(!pcm); - - pr_debug("%s: event 0x%x\n", __func__, event); - - switch (event) { - case MSM_PCM_RT_EVT_DEVSWITCH: - q6asm_cmd(pcm->audio_client, CMD_PAUSE); - q6asm_cmd(pcm->audio_client, CMD_FLUSH); - q6asm_run(pcm->audio_client, 0, 0, 0); - /* fallthrough */ - default: - pr_err("%s: default event 0x%x\n", __func__, event); - break; - } -} - -static void msm_pcm_loopback_event_handler(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - pr_debug("%s:\n", __func__); - switch (opcode) { - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - break; - default: - break; - } - } - break; - default: - pr_err("%s: Not Supported Event opcode[0x%x]\n", - __func__, opcode); - break; - } -} - -static int msm_loopback_session_mute_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = hfp_tx_mute; - return 0; -} - -static int msm_loopback_session_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0, n = 0; - int mute = ucontrol->value.integer.value[0]; - struct msm_pcm_loopback *pcm = NULL; - - if ((mute < 0) || (mute > 1)) { - pr_err(" %s Invalid arguments", __func__); - ret = -EINVAL; - goto done; - } - mutex_lock(&loopback_session_lock); - pr_debug("%s: mute=%d\n", __func__, mute); - hfp_tx_mute = mute; - for (n = 0; n < LOOPBACK_SESSION_MAX; n++) { - if (!strcmp(session_map[n].stream_name, "MultiMedia6")) - pcm = session_map[n].loopback_priv; - } - if (pcm && pcm->audio_client) { - ret = q6asm_set_mute(pcm->audio_client, mute); - if (ret < 0) - pr_err("%s: Send mute command failed rc=%d\n", - __func__, ret); - } - mutex_unlock(&loopback_session_lock); -done: - return ret; -} - -static struct snd_kcontrol_new msm_loopback_controls[] = { - SOC_SINGLE_EXT("HFP TX Mute", SND_SOC_NOPM, 0, 1, 0, - msm_loopback_session_mute_get, - msm_loopback_session_mute_put), -}; - -static int msm_pcm_loopback_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_loopback_controls, - ARRAY_SIZE(msm_loopback_controls)); - - return 0; -} -static int pcm_loopback_set_volume(struct msm_pcm_loopback *prtd, - uint32_t volume) -{ - int rc = -EINVAL; - - pr_debug("%s: Setting volume 0x%x\n", __func__, volume); - - if (prtd && prtd->audio_client) { - rc = q6asm_set_volume(prtd->audio_client, volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc = %d\n", - __func__, rc); - return rc; - } - prtd->volume = volume; - } - return rc; -} - -static int msm_pcm_loopback_get_session(struct snd_soc_pcm_runtime *rtd, - struct msm_pcm_loopback **pcm) -{ - int ret = 0; - int n, index = -1; - - dev_dbg(rtd->platform->dev, "%s: stream %s\n", __func__, - rtd->dai_link->stream_name); - - mutex_lock(&loopback_session_lock); - for (n = 0; n < LOOPBACK_SESSION_MAX; n++) { - if (!strcmp(rtd->dai_link->stream_name, - session_map[n].stream_name)) { - *pcm = session_map[n].loopback_priv; - goto exit; - } - /* - * Store the min index value for allocating a new session. - * Here, if session stream name is not found in the - * existing entries after the loop iteration, then this - * index will be used to allocate the new session. - * This index variable is expected to point to the topmost - * available free session. - */ - if (!(session_map[n].stream_name[0]) && (index < 0)) - index = n; - } - - if (index < 0) { - dev_err(rtd->platform->dev, "%s: Max Sessions allocated\n", - __func__); - ret = -EAGAIN; - goto exit; - } - - session_map[index].loopback_priv = kzalloc( - sizeof(struct msm_pcm_loopback), GFP_KERNEL); - if (!session_map[index].loopback_priv) { - ret = -ENOMEM; - goto exit; - } - - strlcpy(session_map[index].stream_name, - rtd->dai_link->stream_name, - sizeof(session_map[index].stream_name)); - dev_dbg(rtd->platform->dev, "%s: stream %s index %d\n", - __func__, session_map[index].stream_name, index); - - mutex_init(&session_map[index].loopback_priv->lock); - *pcm = session_map[index].loopback_priv; -exit: - mutex_unlock(&loopback_session_lock); - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - struct msm_pcm_loopback *pcm = NULL; - int ret = 0; - uint16_t bits_per_sample = 16; - struct asm_session_mtmx_strtr_param_window_v2_t asm_mtmx_strtr_window; - uint32_t param_id; - struct msm_pcm_pdata *pdata; - - ret = msm_pcm_loopback_get_session(rtd, &pcm); - if (ret) - return ret; - - mutex_lock(&pcm->lock); - - pcm->volume = 0x2000; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - pcm->playback_substream = substream; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - pcm->capture_substream = substream; - - pcm->instance++; - dev_dbg(rtd->platform->dev, "%s: pcm out open: %d,%d\n", __func__, - pcm->instance, substream->stream); - if (pcm->instance == 2) { - if (pcm->audio_client != NULL) - stop_pcm(pcm); - - pdata = (struct msm_pcm_pdata *) - dev_get_drvdata(rtd->platform->dev); - if (!pdata) { - dev_err(rtd->platform->dev, - "%s: platform data not populated\n", __func__); - mutex_unlock(&pcm->lock); - return -EINVAL; - } - - pcm->audio_client = q6asm_audio_client_alloc( - (app_cb)msm_pcm_loopback_event_handler, pcm); - if (!pcm->audio_client) { - dev_err(rtd->platform->dev, - "%s: Could not allocate memory\n", __func__); - mutex_unlock(&pcm->lock); - return -ENOMEM; - } - pcm->session_id = pcm->audio_client->session; - pcm->audio_client->perf_mode = pdata->perf_mode; - ret = q6asm_open_loopback_v2(pcm->audio_client, - bits_per_sample); - if (ret < 0) { - dev_err(rtd->platform->dev, - "%s: pcm out open failed\n", __func__); - q6asm_audio_client_free(pcm->audio_client); - mutex_unlock(&pcm->lock); - return -ENOMEM; - } - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - pcm->playback_substream = substream; - ret = pcm_loopback_set_volume(pcm, pcm->volume); - if (ret < 0) - dev_err(rtd->platform->dev, - "Error %d setting volume", ret); - } - /* Set to largest negative value */ - asm_mtmx_strtr_window.window_lsw = 0x00000000; - asm_mtmx_strtr_window.window_msw = 0x80000000; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2; - q6asm_send_mtmx_strtr_window(pcm->audio_client, - &asm_mtmx_strtr_window, - param_id); - /* Set to largest positive value */ - asm_mtmx_strtr_window.window_lsw = 0xffffffff; - asm_mtmx_strtr_window.window_msw = 0x7fffffff; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2; - q6asm_send_mtmx_strtr_window(pcm->audio_client, - &asm_mtmx_strtr_window, - param_id); - } - dev_info(rtd->platform->dev, "%s: Instance = %d, Stream ID = %s\n", - __func__, pcm->instance, substream->pcm->id); - runtime->private_data = pcm; - - mutex_unlock(&pcm->lock); - - return 0; -} - -static void stop_pcm(struct msm_pcm_loopback *pcm) -{ - struct snd_soc_pcm_runtime *soc_pcm_rx; - struct snd_soc_pcm_runtime *soc_pcm_tx; - - if (pcm->audio_client == NULL) - return; - - mutex_lock(&loopback_session_lock); - q6asm_cmd(pcm->audio_client, CMD_CLOSE); - - if (pcm->playback_substream != NULL) { - soc_pcm_rx = pcm->playback_substream->private_data; - msm_pcm_routing_dereg_phy_stream(soc_pcm_rx->dai_link->id, - SNDRV_PCM_STREAM_PLAYBACK); - } - if (pcm->capture_substream != NULL) { - soc_pcm_tx = pcm->capture_substream->private_data; - msm_pcm_routing_dereg_phy_stream(soc_pcm_tx->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - } - q6asm_audio_client_free(pcm->audio_client); - pcm->audio_client = NULL; - mutex_unlock(&loopback_session_lock); -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_pcm_loopback *pcm = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - int ret = 0, n; - bool found = false; - - mutex_lock(&pcm->lock); - - dev_dbg(rtd->platform->dev, "%s: end pcm call:%d\n", - __func__, substream->stream); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - pcm->playback_start = 0; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - pcm->capture_start = 0; - - pcm->instance--; - if (!pcm->playback_start || !pcm->capture_start) { - dev_dbg(rtd->platform->dev, "%s: end pcm call\n", __func__); - stop_pcm(pcm); - } - - if (!pcm->instance) { - mutex_lock(&loopback_session_lock); - for (n = 0; n < LOOPBACK_SESSION_MAX; n++) { - if (!strcmp(rtd->dai_link->stream_name, - session_map[n].stream_name)) { - found = true; - break; - } - } - if (found) { - memset(session_map[n].stream_name, 0, - sizeof(session_map[n].stream_name)); - mutex_unlock(&pcm->lock); - mutex_destroy(&session_map[n].loopback_priv->lock); - session_map[n].loopback_priv = NULL; - kfree(pcm); - dev_dbg(rtd->platform->dev, "%s: stream freed %s\n", - __func__, rtd->dai_link->stream_name); - mutex_unlock(&loopback_session_lock); - return 0; - } - mutex_unlock(&loopback_session_lock); - } - mutex_unlock(&pcm->lock); - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_pcm_loopback *pcm = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - struct msm_pcm_routing_evt event; - - memset(&event, 0, sizeof(event)); - mutex_lock(&pcm->lock); - - dev_dbg(rtd->platform->dev, "%s: ASM loopback stream:%d\n", - __func__, substream->stream); - - if (pcm->playback_start && pcm->capture_start) { - mutex_unlock(&pcm->lock); - return ret; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (!pcm->playback_start) - pcm->playback_start = 1; - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (!pcm->capture_start) - pcm->capture_start = 1; - } - - if (pcm->playback_start && pcm->capture_start) { - struct snd_soc_pcm_runtime *soc_pcm_rx = - pcm->playback_substream->private_data; - struct snd_soc_pcm_runtime *soc_pcm_tx = - pcm->capture_substream->private_data; - event.event_func = msm_pcm_route_event_handler; - event.priv_data = (void *) pcm; - msm_pcm_routing_reg_phy_stream(soc_pcm_tx->dai_link->id, - pcm->audio_client->perf_mode, - pcm->session_id, pcm->capture_substream->stream); - msm_pcm_routing_reg_phy_stream_v2(soc_pcm_rx->dai_link->id, - pcm->audio_client->perf_mode, - pcm->session_id, pcm->playback_substream->stream, - event); - } - - mutex_unlock(&pcm->lock); - - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_pcm_loopback *pcm = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - dev_dbg(rtd->platform->dev, - "%s: playback_start:%d,capture_start:%d\n", __func__, - pcm->playback_start, pcm->capture_start); - if (pcm->playback_start && pcm->capture_start) - q6asm_run_nowait(pcm->audio_client, 0, 0, 0); - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - case SNDRV_PCM_TRIGGER_STOP: - dev_dbg(rtd->platform->dev, - "%s:Pause/Stop - playback_start:%d,capture_start:%d\n", - __func__, pcm->playback_start, pcm->capture_start); - if (pcm->playback_start && pcm->capture_start) - q6asm_cmd_nowait(pcm->audio_client, CMD_PAUSE); - break; - default: - pr_err("%s: default cmd %d\n", __func__, cmd); - break; - } - - return 0; -} - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, -}; - -static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = kcontrol->private_data; - struct snd_pcm_substream *substream = vol->pcm->streams[0].substream; - struct msm_pcm_loopback *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : 0x%x\n", __func__, volume); - if ((!substream) || (!substream->runtime)) { - pr_err("%s substream or runtime not found\n", __func__); - rc = -ENODEV; - goto exit; - } - mutex_lock(&loopback_session_lock); - prtd = substream->runtime->private_data; - if (!prtd) { - rc = -ENODEV; - mutex_unlock(&loopback_session_lock); - goto exit; - } - rc = pcm_loopback_set_volume(prtd, volume); - mutex_unlock(&loopback_session_lock); -exit: - return rc; -} - -static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct msm_pcm_loopback *prtd; - - pr_debug("%s\n", __func__); - if (!vol) { - pr_err("%s: vol is NULL\n", __func__); - return -ENODEV; - } - if ((!substream) || (!substream->runtime)) { - pr_debug("%s substream or runtime not found\n", __func__); - rc = -ENODEV; - goto exit; - } - mutex_lock(&loopback_session_lock); - prtd = substream->runtime->private_data; - if (!prtd) { - rc = -ENODEV; - mutex_unlock(&loopback_session_lock); - goto exit; - } - ucontrol->value.integer.value[0] = prtd->volume; - mutex_unlock(&loopback_session_lock); -exit: - return rc; -} - -static int msm_pcm_add_volume_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm->streams[0].pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - int ret = 0; - - dev_dbg(rtd->dev, "%s, Volume cntrl add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, - rtd->dai_link->id, - &volume_info); - if (ret < 0) - return ret; - kctl = volume_info->kctl; - kctl->put = msm_pcm_volume_ctl_put; - kctl->get = msm_pcm_volume_ctl_get; - kctl->tlv.p = loopback_rx_vol_gain; - return 0; -} - -static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm->streams[0].pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ctl_len = strlen(playback_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Playback app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) - return ret; - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_playback_app_type_cfg_ctl_put; - kctl->get = msm_pcm_playback_app_type_cfg_ctl_get; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ctl_len = strlen(capture_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Capture app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) - return ret; - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_capture_app_type_cfg_ctl_put; - kctl->get = msm_pcm_capture_app_type_cfg_ctl_get; - } - - return 0; -} - -static struct msm_pcm_channel_mixer *msm_pcm_get_chmixer( - struct msm_pcm_pdata *pdata, - u64 fe_id, int session_type) -{ - if (!pdata) { - pr_err("%s: missing pdata\n", __func__); - return NULL; - } - - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %llu\n", __func__, fe_id); - return NULL; - } - - if ((session_type != SESSION_TYPE_TX) && - (session_type != SESSION_TYPE_RX)) { - pr_err("%s: invalid session type %d\n", __func__, session_type); - return NULL; - } - - return pdata->chmixer_pspd[fe_id][session_type]; -} - -static int msm_pcm_channel_mixer_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int ret = 0; - int stream_id = 0; - int be_id = 0, i = 0; - struct msm_pcm_loopback *prtd = NULL; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - struct snd_pcm *pcm = NULL; - struct snd_pcm_substream *substream = NULL; - struct msm_pcm_channel_mixer *chmixer_pspd = NULL; - u8 asm_ch_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; - bool reset_override_out_ch_map = false; - bool reset_override_in_ch_map = false; - - pcm = pdata->pcm_device[fe_id]; - if (!pcm) { - pr_err("%s invalid pcm handle for fe_id %llu\n", - __func__, fe_id); - return -EINVAL; - } - - if (session_type == SESSION_TYPE_RX) - substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - else - substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->enable = ucontrol->value.integer.value[0]; - chmixer_pspd->rule = ucontrol->value.integer.value[1]; - chmixer_pspd->input_channel = ucontrol->value.integer.value[2]; - chmixer_pspd->output_channel = ucontrol->value.integer.value[3]; - chmixer_pspd->port_idx = ucontrol->value.integer.value[4]; - - if (chmixer_pspd->enable) { - if (session_type == SESSION_TYPE_RX && - !chmixer_pspd->override_in_ch_map) { - if (chmixer_pspd->input_channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", - __func__, chmixer_pspd->input_channel); - return -EINVAL; - } - q6asm_map_channels(asm_ch_map, - chmixer_pspd->input_channel, false); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = asm_ch_map[i]; - chmixer_pspd->override_in_ch_map = true; - reset_override_in_ch_map = true; - } else if (session_type == SESSION_TYPE_TX && - !chmixer_pspd->override_out_ch_map) { - if (chmixer_pspd->output_channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", - __func__, chmixer_pspd->output_channel); - return -EINVAL; - } - q6asm_map_channels(asm_ch_map, - chmixer_pspd->output_channel, false); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->out_ch_map[i] = asm_ch_map[i]; - chmixer_pspd->override_out_ch_map = true; - reset_override_out_ch_map = true; - } - } else { - chmixer_pspd->override_out_ch_map = false; - chmixer_pspd->override_in_ch_map = false; - } - - /* cache value and take effect during adm_open stage */ - msm_pcm_routing_set_channel_mixer_cfg(fe_id, - session_type, - chmixer_pspd); - - mutex_lock(&loopback_session_lock); - if (chmixer_pspd->enable && substream->runtime) { - prtd = substream->runtime->private_data; - if (!prtd) { - pr_err("%s find invalid prtd fail\n", __func__); - ret = -EINVAL; - mutex_unlock(&loopback_session_lock); - goto done; - } - - if (prtd->audio_client) { - stream_id = prtd->audio_client->session; - be_id = chmixer_pspd->port_idx; - msm_pcm_routing_set_channel_mixer_runtime(be_id, - stream_id, - session_type, - chmixer_pspd); - } - } - mutex_unlock(&loopback_session_lock); - if (reset_override_out_ch_map) - chmixer_pspd->override_out_ch_map = false; - if (reset_override_in_ch_map) - chmixer_pspd->override_in_ch_map = false; - -done: - return ret; -} - -static int msm_pcm_channel_mixer_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = chmixer_pspd->enable; - ucontrol->value.integer.value[1] = chmixer_pspd->rule; - ucontrol->value.integer.value[2] = chmixer_pspd->input_channel; - ucontrol->value.integer.value[3] = chmixer_pspd->output_channel; - ucontrol->value.integer.value[4] = chmixer_pspd->port_idx; - return 0; -} - -static int msm_pcm_channel_mixer_output_map_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->override_out_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->out_ch_map[i] = - ucontrol->value.integer.value[i]; - - return 0; -} - -static int msm_pcm_channel_mixer_output_map_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->out_ch_map[i]; - return 0; -} - -static int msm_pcm_channel_mixer_input_map_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->override_in_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = ucontrol->value.integer.value[i]; - - return 0; -} - -static int msm_pcm_channel_mixer_input_map_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->in_ch_map[i]; - return 0; -} - -static int msm_pcm_channel_mixer_weight_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int channel = (kcontrol->private_value >> 16) & 0xFF; - int i = 0; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - if (channel <= 0 || channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: invalid channel number %d\n", __func__, channel); - return -EINVAL; - } - channel--; - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->channel_weight[channel][i] = - ucontrol->value.integer.value[i]; - return 0; -} - -static int msm_pcm_channel_mixer_weight_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int channel = (kcontrol->private_value >> 16) & 0xFF; - struct snd_soc_component *component = - snd_soc_kcontrol_component(kcontrol); - struct msm_pcm_pdata *pdata = dev_get_drvdata(component->dev); - int i = 0; - struct msm_pcm_channel_mixer *chmixer_pspd; - - if (channel <= 0 || channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: invalid channel number %d\n", __func__, channel); - return -EINVAL; - } - channel--; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->channel_weight[channel][i]; - return 0; -} - -static int msm_pcm_add_platform_controls(struct snd_kcontrol_new *kctl, - struct snd_soc_pcm_runtime *rtd, const char *name_prefix, - const char *name_suffix, int session_type, int channels) -{ - int ret = -EINVAL; - char *mixer_name = NULL; - struct snd_pcm *pcm = rtd->pcm; - const char *deviceNo = "NN"; - const char *channelNo = "NN"; - int ctl_len = 0; - - - ctl_len = strlen(name_prefix) + 1 + strlen(deviceNo) + 1 + - strlen(channelNo) + 1 + strlen(name_suffix) + 1; - - mixer_name = kzalloc(ctl_len, GFP_KERNEL); - if (mixer_name == NULL) - return -ENOMEM; - - if (channels >= 0) { - snprintf(mixer_name, ctl_len, "%s %d %s %d", - name_prefix, pcm->device, name_suffix, channels); - kctl->private_value = (rtd->dai_link->id) | (session_type << 8) | - (channels << 16); - } else { - snprintf(mixer_name, ctl_len, "%s %d %s", - name_prefix, pcm->device, name_suffix); - kctl->private_value = (rtd->dai_link->id) | (session_type << 8); - } - - kctl->name = mixer_name; - ret = snd_soc_add_platform_controls(rtd->platform, kctl, 1); - kfree(mixer_name); - return ret; -} - -static int msm_pcm_channel_mixer_output_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid channel map value ranges from 1 to 64 */ - uinfo->value.integer.min = 1; - uinfo->value.integer.max = 64; - return 0; -} - -static int msm_pcm_add_channel_mixer_output_map_controls( - struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Output Map"; - int session_type = 0, ret = 0, channel = -1; - struct snd_kcontrol_new channel_mixer_output_map_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_output_map_info, - .put = msm_pcm_channel_mixer_output_map_ctl_put, - .get = msm_pcm_channel_mixer_output_map_ctl_get, - .private_value = 0, - }; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_output_map_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_output_map_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_channel_mixer_input_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid channel map value ranges from 1 to 64 */ - uinfo->value.integer.min = 1; - uinfo->value.integer.max = 64; - return 0; -} - -static int msm_pcm_add_channel_mixer_input_map_controls( - struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Input Map"; - int session_type = 0, ret = 0, channel = -1; - struct snd_kcontrol_new channel_mixer_input_map_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_input_map_info, - .put = msm_pcm_channel_mixer_input_map_ctl_put, - .get = msm_pcm_channel_mixer_input_map_ctl_get, - .private_value = 0, - }; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_input_map_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_input_map_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - return ret; -} - -static int msm_pcm_channel_mixer_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - /* five int values: enable, rule, in_channels, out_channels and port_id */ - uinfo->count = 5; - /* Valid range is all positive values to support above controls */ - uinfo->value.integer.min = 0; - uinfo->value.integer.max = INT_MAX; - return 0; -} - -static int msm_pcm_add_channel_mixer_cfg_controls( - struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Cfg"; - int session_type = 0, ret = 0, channel = -1; - struct msm_pcm_pdata *pdata = NULL; - struct snd_kcontrol_new channel_mixer_cfg_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_cfg_info, - .put = msm_pcm_channel_mixer_cfg_ctl_put, - .get = msm_pcm_channel_mixer_cfg_ctl_get, - .private_value = 0, - }; - - pdata = (struct msm_pcm_pdata *) - dev_get_drvdata(rtd->platform->dev); - if (pdata == NULL) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - - pdata->pcm_device[rtd->dai_link->id] = rtd->pcm; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_cfg_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_cfg_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_channel_mixer_weight_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid range: 0 to 0x4000(Unity) gain weightage */ - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x4000; - return 0; -} - -static int msm_pcm_add_channel_mixer_weight_controls( - struct snd_soc_pcm_runtime *rtd, - int channel) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Weight Ch"; - int session_type = 0, ret = 0; - struct snd_kcontrol_new channel_mixer_weight_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_weight_info, - .put = msm_pcm_channel_mixer_weight_ctl_put, - .get = msm_pcm_channel_mixer_weight_ctl_get, - .private_value = 0, - }; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_weight_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_weight_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_add_channel_mixer_controls(struct snd_soc_pcm_runtime *rtd) -{ - int i, ret = 0; - struct snd_pcm *pcm = NULL; - struct msm_pcm_pdata *pdata = NULL; - - if (!rtd || !rtd->pcm) { - pr_err("%s invalid rtd or pcm\n", __func__); - return -EINVAL; - } - pcm = rtd->pcm; - - - pdata = (struct msm_pcm_pdata *) - dev_get_drvdata(rtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream && - !pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX]) { - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX] = - kzalloc(sizeof(struct msm_pcm_channel_mixer), GFP_KERNEL); - if (!pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX]) { - ret = -ENOMEM; - goto fail; - } - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream && - !pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX]) { - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX] = - kzalloc(sizeof(struct msm_pcm_channel_mixer), GFP_KERNEL); - if (!pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX]) { - ret = -ENOMEM; - goto fail; - } - } - - ret = msm_pcm_add_channel_mixer_cfg_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer cfg controls failed:%d\n", - __func__, ret); - goto fail; - } - ret = msm_pcm_add_channel_mixer_input_map_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer input map controls failed:%d\n", - __func__, ret); - goto fail; - } - ret = msm_pcm_add_channel_mixer_output_map_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer output map controls failed:%d\n", - __func__, ret); - goto fail; - } - - for (i = 1; i <= PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) { - ret = msm_pcm_add_channel_mixer_weight_controls(rtd, i); - if (ret) { - pr_err("%s: pcm add channel mixer weight controls failed:%d\n", - __func__, ret); - goto fail; - } - } - return 0; - -fail: - kfree(pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX]); - kfree(pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX]); - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX] = NULL; - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX] = NULL; - - return ret; -} - -static int msm_pcm_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - ret = msm_pcm_add_volume_controls(rtd); - if (ret) - pr_err("%s: pcm add volume controls failed:%d\n", - __func__, ret); - ret = msm_pcm_add_app_type_controls(rtd); - if (ret) - pr_err("%s: pcm add app type controls failed:%d\n", - __func__, ret); - - ret = msm_pcm_add_channel_mixer_controls(rtd); - if (ret) - pr_err("%s: pcm add channel mixer controls failed:%d\n", - __func__, ret); - return ret; -} - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_pcm_add_controls(rtd); - if (ret) - dev_err(rtd->dev, "%s, kctl add failed\n", __func__); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_loopback_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - struct msm_pcm_pdata *pdata; - - dev_dbg(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - - pdata = kzalloc(sizeof(struct msm_pcm_pdata), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - if (of_property_read_bool(pdev->dev.of_node, - "qcom,msm-pcm-loopback-low-latency")) - pdata->perf_mode = LOW_LATENCY_PCM_MODE; - else - pdata->perf_mode = LEGACY_PCM_MODE; - - dev_set_drvdata(&pdev->dev, pdata); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - struct msm_pcm_pdata *pdata; - int i = 0; - - pdata = dev_get_drvdata(&pdev->dev); - if (pdata) { - for (i = 0; i < MSM_FRONTEND_DAI_MM_SIZE; i++) { - kfree(pdata->chmixer_pspd[i][SESSION_TYPE_RX]); - kfree(pdata->chmixer_pspd[i][SESSION_TYPE_TX]); - } - } - kfree(pdata); - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_pcm_loopback_dt_match[] = { - {.compatible = "qcom,msm-pcm-loopback"}, - {} -}; - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-loopback", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_loopback_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_loopback_init(void) -{ - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_loopback_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM loopback platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-q6-noirq.c b/techpack/audio/4.0/asoc/msm-pcm-q6-noirq.c deleted file mode 100644 index eb8a974e619f..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-q6-noirq.c +++ /dev/null @@ -1,1418 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" - -#define PCM_MASTER_VOL_MAX_STEPS 0x2000 -static const DECLARE_TLV_DB_LINEAR(msm_pcm_vol_gain, 0, - PCM_MASTER_VOL_MAX_STEPS); - -struct snd_msm { - struct snd_card *card; - struct snd_pcm *pcm; -}; - -#define CMD_EOS_MIN_TIMEOUT_LENGTH 50 -#define CMD_EOS_TIMEOUT_MULTIPLIER (HZ * 50) - -#define ATRACE_END() \ - trace_printk("tracing_mark_write: E\n") -#define ATRACE_BEGIN(name) \ - trace_printk("tracing_mark_write: B|%d|%s\n", current->tgid, name) -#define ATRACE_FUNC() ATRACE_BEGIN(__func__) -#define ATRACE_INT(name, value) \ - trace_printk("tracing_mark_write: C|%d|%s|%d\n", \ - current->tgid, name, (int)(value)) - -#define SIO_PLAYBACK_MAX_PERIOD_SIZE PLAYBACK_MAX_PERIOD_SIZE -#define SIO_PLAYBACK_MIN_PERIOD_SIZE 48 -#define SIO_PLAYBACK_MAX_NUM_PERIODS 512 -#define SIO_PLAYBACK_MIN_NUM_PERIODS PLAYBACK_MIN_NUM_PERIODS -#define SIO_PLAYBACK_MIN_BYTES (SIO_PLAYBACK_MIN_NUM_PERIODS * \ - SIO_PLAYBACK_MIN_PERIOD_SIZE) - -#define SIO_PLAYBACK_MAX_BYTES ((SIO_PLAYBACK_MAX_NUM_PERIODS) * \ - (SIO_PLAYBACK_MAX_PERIOD_SIZE)) - -#define SIO_CAPTURE_MAX_PERIOD_SIZE CAPTURE_MAX_PERIOD_SIZE -#define SIO_CAPTURE_MIN_PERIOD_SIZE 48 -#define SIO_CAPTURE_MAX_NUM_PERIODS 512 -#define SIO_CAPTURE_MIN_NUM_PERIODS CAPTURE_MIN_NUM_PERIODS - -#define SIO_CAPTURE_MIN_BYTES (SIO_CAPTURE_MIN_NUM_PERIODS * \ - SIO_CAPTURE_MIN_PERIOD_SIZE) - -#define SIO_CAPTURE_MAX_BYTES (SIO_CAPTURE_MAX_NUM_PERIODS * \ - SIO_CAPTURE_MAX_PERIOD_SIZE) - -static struct snd_pcm_hardware msm_pcm_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .rates = SNDRV_PCM_RATE_8000_192000, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = SIO_PLAYBACK_MAX_NUM_PERIODS * - SIO_PLAYBACK_MAX_PERIOD_SIZE, - .period_bytes_min = SIO_PLAYBACK_MIN_PERIOD_SIZE, - .period_bytes_max = SIO_PLAYBACK_MAX_PERIOD_SIZE, - .periods_min = SIO_PLAYBACK_MIN_NUM_PERIODS, - .periods_max = SIO_PLAYBACK_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_pcm_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .rates = SNDRV_PCM_RATE_8000_48000, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 4, - .buffer_bytes_max = SIO_CAPTURE_MAX_NUM_PERIODS * - SIO_CAPTURE_MAX_PERIOD_SIZE, - .period_bytes_min = SIO_CAPTURE_MIN_PERIOD_SIZE, - .period_bytes_max = SIO_CAPTURE_MAX_PERIOD_SIZE, - .periods_min = SIO_CAPTURE_MIN_NUM_PERIODS, - .periods_max = SIO_CAPTURE_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, - 88200, 96000, 176400, 192000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static unsigned long msm_pcm_fe_topology[MSM_FRONTEND_DAI_MAX]; - -/* default value is DTS (i.e read from device tree) */ -static char const *msm_pcm_fe_topology_text[] = { - "DTS", "ULL", "ULL_PP", "LL" }; - -static const struct soc_enum msm_pcm_fe_topology_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(msm_pcm_fe_topology_text), - msm_pcm_fe_topology_text), -}; - -static void event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - uint32_t *ptrmem = (uint32_t *)payload; - - switch (opcode) { - case ASM_DATA_EVENT_WATERMARK: - pr_debug("%s: Watermark level = 0x%08x\n", __func__, *ptrmem); - break; - case APR_BASIC_RSP_RESULT: - pr_debug("%s: Payload = [0x%x]stat[0x%x]\n", - __func__, payload[0], payload[1]); - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - case ASM_SESSION_CMD_PAUSE: - case ASM_STREAM_CMD_FLUSH: - break; - default: - break; - } - break; - default: - pr_debug("Not Supported Event opcode[0x%x]\n", opcode); - break; - } -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd; - int ret = 0; - enum apr_subsys_state subsys_state; - - subsys_state = apr_get_subsys_state(); - if (subsys_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - prtd = kzalloc(sizeof(struct msm_audio), GFP_KERNEL); - - if (prtd == NULL) - return -ENOMEM; - - prtd->substream = substream; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - runtime->hw = msm_pcm_hardware_playback; - else - runtime->hw = msm_pcm_hardware_capture; - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret) - pr_info("snd_pcm_hw_constraint_list failed\n"); - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - SIO_PLAYBACK_MIN_BYTES, - SIO_PLAYBACK_MAX_BYTES); - if (ret) { - pr_info("%s: P buffer bytes minmax constraint ret %d\n", - __func__, ret); - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - SIO_CAPTURE_MIN_BYTES, - SIO_CAPTURE_MAX_BYTES); - if (ret) { - pr_info("%s: C buffer bytes minmax constraint ret %d\n", - __func__, ret); - } - } - - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32); - if (ret) { - pr_err("%s: Constraint for period bytes step ret = %d\n", - __func__, ret); - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32); - if (ret) { - pr_err("%s: Constraint for buffer bytes step ret = %d\n", - __func__, ret); - } - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)event_handler, prtd); - if (!prtd->audio_client) { - pr_err("%s: client alloc failed\n", __func__); - ret = -ENOMEM; - goto fail_cmd; - } - prtd->dsp_cnt = 0; - prtd->set_channel_map = false; - runtime->private_data = prtd; - return 0; - -fail_cmd: - kfree(prtd); - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) - -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct audio_buffer *buf; - struct shared_io_config config; - uint16_t sample_word_size; - uint16_t bits_per_sample; - int ret; - int dir = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? IN : OUT; - unsigned long topology; - int perf_mode; - bool use_default_chmap = true; - char *chmap = NULL; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - ret = -EINVAL; - pr_err("%s: platform data not populated ret: %d\n", __func__, - ret); - return ret; - } - - topology = msm_pcm_fe_topology[soc_prtd->dai_link->id]; - - if (!strcmp(msm_pcm_fe_topology_text[topology], "ULL_PP")) - perf_mode = ULL_POST_PROCESSING_PCM_MODE; - else if (!strcmp(msm_pcm_fe_topology_text[topology], "ULL")) - perf_mode = ULTRA_LOW_LATENCY_PCM_MODE; - else if (!strcmp(msm_pcm_fe_topology_text[topology], "LL")) - perf_mode = LOW_LATENCY_PCM_MODE; - else - /* use the default from the device tree */ - perf_mode = pdata->perf_mode; - - - /* need to set LOW_LATENCY_PCM_MODE for capture since - * push mode does not support ULL - */ - prtd->audio_client->perf_mode = (dir == IN) ? - perf_mode : - LOW_LATENCY_PCM_MODE; - - /* rate and channels are sent to audio driver */ - prtd->samp_rate = params_rate(params); - prtd->channel_mode = params_channels(params); - if (prtd->enabled) - return 0; - - if (pdata->ch_map[soc_prtd->dai_link->id]) { - use_default_chmap = - !(pdata->ch_map[soc_prtd->dai_link->id]->set_ch_map); - chmap = - pdata->ch_map[soc_prtd->dai_link->id]->channel_map; - } - - switch (runtime->format) { - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - break; - } - - config.format = FORMAT_LINEAR_PCM; - config.bits_per_sample = bits_per_sample; - config.rate = params_rate(params); - config.channels = params_channels(params); - config.sample_word_size = sample_word_size; - config.bufsz = params_buffer_bytes(params) / params_periods(params); - config.bufcnt = params_periods(params); - - ret = q6asm_open_shared_io(prtd->audio_client, &config, dir, - use_default_chmap, chmap); - if (ret) { - pr_err("%s: q6asm_open_write_shared_io failed ret: %d\n", - __func__, ret); - return ret; - } - - prtd->pcm_size = params_buffer_bytes(params); - prtd->pcm_count = params_buffer_bytes(params); - prtd->pcm_irq_pos = 0; - - buf = prtd->audio_client->port[dir].buf; - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf->data; - dma_buf->addr = buf->phys; - dma_buf->bytes = prtd->pcm_size; - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - pr_debug("%s: session ID %d, perf %d\n", __func__, - prtd->audio_client->session, - prtd->audio_client->perf_mode); - prtd->session_id = prtd->audio_client->session; - - pr_debug("msm_pcm_routing_reg_phy_stream w/ id %d\n", - soc_prtd->dai_link->id); - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream); - - if (ret) { - pr_err("%s: stream reg failed ret:%d\n", __func__, ret); - return ret; - } - - atomic_set(&prtd->out_count, runtime->periods); - prtd->enabled = 1; - prtd->cmd_pending = 0; - prtd->cmd_interrupt = 0; - - return 0; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - int dir = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? 0 : 1; - struct audio_buffer *buf; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: %s Trigger start\n", __func__, - dir == 0 ? "P" : "C"); - ret = q6asm_run(prtd->audio_client, 0, 0, 0); - if (ret) - break; - atomic_set(&prtd->start, 1); - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("%s: SNDRV_PCM_TRIGGER_STOP\n", __func__); - atomic_set(&prtd->start, 0); - q6asm_cmd(prtd->audio_client, CMD_PAUSE); - q6asm_cmd(prtd->audio_client, CMD_FLUSH); - buf = q6asm_shared_io_buf(prtd->audio_client, dir); - if (buf == NULL) { - pr_err("%s: shared IO buffer is null\n", __func__); - ret = -EINVAL; - break; - } - memset(buf->data, 0, buf->actual_size); - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("%s: SNDRV_PCM_TRIGGER_PAUSE\n", __func__); - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->start, 0); - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - - -static int msm_pcm_mmap_fd(struct snd_pcm_substream *substream, - struct snd_pcm_mmap_fd *mmap_fd) -{ - struct msm_audio *prtd; - struct audio_port_data *apd; - struct audio_buffer *ab; - int dir = -1; - struct dma_buf *buf = NULL; - int rc = 0; - - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return -EFAULT; - } - - prtd = substream->runtime->private_data; - if (!prtd || !prtd->audio_client || !prtd->mmap_flag) { - pr_err("%s no audio client or not an mmap session\n", __func__); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - - apd = prtd->audio_client->port; - ab = &(apd[dir].buf[0]); - /* - * Passing O_CLOEXEC as flag passed to fd, to be in sync with - * previous implimentation. - * This was the flag used by previous internal wrapper API, which - * used to call dma_buf_fd internally. - */ - mmap_fd->fd = dma_buf_fd(ab->dma_buf, O_CLOEXEC); - if (mmap_fd->fd < 0) { - pr_err("%s: dma_buf_fd failed, fd:%d\n", - __func__, mmap_fd->fd); - rc = -EFAULT; - goto buf_fd_fail; - } - mmap_fd->dir = dir; - mmap_fd->actual_size = ab->actual_size; - mmap_fd->size = ab->size; - - buf = dma_buf_get(mmap_fd->fd); - if (IS_ERR_OR_NULL(buf)) { - pr_err("%s: dma_buf_get failed, fd:%d\n", - __func__, mmap_fd->fd); - rc = -EINVAL; - } - -buf_fd_fail: - return rc; -} - -static int msm_pcm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - int dir = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? 0 : 1; - struct audio_buffer *buf; - - switch (cmd) { - case SNDRV_PCM_IOCTL1_RESET: - pr_debug("%s: %s SNDRV_PCM_IOCTL1_RESET\n", __func__, - dir == 0 ? "P" : "C"); - buf = q6asm_shared_io_buf(prtd->audio_client, dir); - - if (buf && buf->data) - memset(buf->data, 0, buf->actual_size); - break; - default: - break; - } - - return snd_pcm_lib_ioctl(substream, cmd, arg); -} - -#ifdef CONFIG_COMPAT -static int msm_pcm_compat_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - /* we only handle RESET which is common for both modes */ - return msm_pcm_ioctl(substream, cmd, arg); -} -#endif - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - uint32_t read_index, wall_clk_msw, wall_clk_lsw; - /*these are offsets, unlike ASoC's full values*/ - snd_pcm_sframes_t hw_ptr; - snd_pcm_sframes_t period_size; - int ret; - int retries = 10; - struct msm_audio *prtd = runtime->private_data; - - period_size = runtime->period_size; - - do { - ret = q6asm_get_shared_pos(prtd->audio_client, - &read_index, &wall_clk_msw, - &wall_clk_lsw); - } while (ret == -EAGAIN && --retries); - - if (ret || !period_size) { - pr_err("get_shared_pos error or zero period size\n"); - return 0; - } - - hw_ptr = bytes_to_frames(substream->runtime, - read_index); - - if (runtime->control->appl_ptr == 0) { - pr_debug("ptr(%s): appl(0), hw = %lu read_index = %u\n", - prtd->substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - "P" : "C", - hw_ptr, read_index); - } - return (hw_ptr/period_size) * period_size; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - return -EINVAL; -} - -static int msm_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - struct audio_port_data *apd = ac->port; - struct audio_buffer *ab; - int dir = -1; - int ret; - - pr_debug("%s: mmap begin\n", __func__); - prtd->mmap_flag = 1; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - - ab = &(apd[dir].buf[0]); - - ret = msm_audio_ion_mmap(ab, vma); - - if (ret) - prtd->mmap_flag = 0; - - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int rc = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - if (!prtd || !prtd->mmap_flag) - return -EIO; - - if (prtd->audio_client) { - rc = q6asm_set_softvolume_v2(prtd->audio_client, - &softvol, SOFT_VOLUME_INSTANCE_1); - if (rc < 0) - pr_err("%s: Send SoftVolume command failed rc=%d\n", - __func__, rc); - } - return rc; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - struct msm_plat_data *pdata = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - uint32_t timeout; - int dir = 0; - int ret = 0; - - if (!soc_prtd) { - pr_debug("%s: private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - - mutex_lock(&pdata->lock); - if (ac) { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - dir = OUT; - - /* determine timeout length */ - if (runtime->frame_bits == 0 || runtime->rate == 0) { - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } else { - timeout = (runtime->period_size * - CMD_EOS_TIMEOUT_MULTIPLIER) / - ((runtime->frame_bits / 8) * - runtime->rate); - if (timeout < CMD_EOS_MIN_TIMEOUT_LENGTH) - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } - - q6asm_cmd(ac, CMD_CLOSE); - - ret = q6asm_shared_io_free(ac, dir); - - if (ret) { - pr_err("%s: Failed to close pull mode, ret %d\n", - __func__, ret); - } - q6asm_audio_client_free(ac); - } - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - dir == IN ? - SNDRV_PCM_STREAM_PLAYBACK : - SNDRV_PCM_STREAM_CAPTURE); - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_pcm_set_volume(struct msm_audio *prtd, uint32_t volume) -{ - int rc = 0; - - if (prtd && prtd->audio_client) { - pr_debug("%s: channels %d volume 0x%x\n", __func__, - prtd->channel_mode, volume); - rc = q6asm_set_volume(prtd->audio_client, volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - } - } - return rc; -} - -static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = NULL; - struct snd_pcm_substream *substream = - vol->pcm->streams[vol->stream].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_audio *prtd; - - pr_debug("%s\n", __func__); - if (!vol) { - pr_err("%s: vol is NULL\n", __func__); - return -ENODEV; - } - if (!substream) { - pr_err("%s: substream not found\n", __func__); - return -ENODEV; - } - soc_prtd = substream->private_data; - if (!substream->runtime || !soc_prtd) { - pr_debug("%s substream runtime or private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->volume; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = NULL; - struct snd_pcm_substream *substream = - vol->pcm->streams[vol->stream].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_audio *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : 0x%x\n", __func__, volume); - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -ENODEV; - } - soc_prtd = substream->private_data; - if (!substream->runtime || !soc_prtd) { - pr_err("%s: substream runtime or private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - rc = msm_pcm_set_volume(prtd, volume); - prtd->volume = volume; - } - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_pcm_add_volume_control(struct snd_soc_pcm_runtime *rtd, - int stream) -{ - int ret = 0; - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - - dev_dbg(rtd->dev, "%s, volume control add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, stream, - NULL, 1, rtd->dai_link->id, - &volume_info); - if (ret < 0) { - pr_err("%s volume control failed ret %d\n", __func__, ret); - return ret; - } - kctl = volume_info->kctl; - kctl->put = msm_pcm_volume_ctl_put; - kctl->get = msm_pcm_volume_ctl_get; - kctl->tlv.p = msm_pcm_vol_gain; - return 0; -} - -static int msm_pcm_channel_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *pcm = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_plat_data *pdata = (struct msm_plat_data *) - snd_soc_component_get_drvdata(pcm); - int rc = 0, i = 0; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - - if (pdata->ch_map[fe_id]) { - pdata->ch_map[fe_id]->set_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL; i++) - pdata->ch_map[fe_id]->channel_map[i] = - (char)(ucontrol->value.integer.value[i]); - } else { - pr_debug("%s: no memory for ch_map, default will be set\n", - __func__); - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_pcm_channel_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 8; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_pcm_channel_map_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *pcm = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_plat_data *pdata = (struct msm_plat_data *) - snd_soc_component_get_drvdata(pcm); - int rc = 0, i = 0; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s: Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - if (pdata->ch_map[fe_id]) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL; i++) - ucontrol->value.integer.value[i] = - pdata->ch_map[fe_id]->channel_map[i]; - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_pcm_add_channel_map_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Channel Map"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - struct msm_plat_data *pdata = NULL; - int ctl_len = 0; - struct snd_kcontrol_new fe_channel_map_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_map_info, - .get = msm_pcm_channel_map_get, - .put = msm_pcm_channel_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: NULL rtd\n", __func__); - return -EINVAL; - } - - pr_debug("%s: added new pcm FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s%d", mixer_ctl_name, rtd->pcm->device); - - fe_channel_map_control[0].name = mixer_str; - fe_channel_map_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_channel_map_control, - ARRAY_SIZE(fe_channel_map_control)); - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pdata->ch_map[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_pcm_ch_map), GFP_KERNEL); - if (!pdata->ch_map[rtd->dai_link->id]) { - pr_err("%s: Could not allocate memory for channel map\n", - __func__); - kfree(mixer_str); - return -ENOMEM; - } - kfree(mixer_str); - return 0; -} - -static int msm_pcm_fe_topology_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - const struct soc_enum *e = &msm_pcm_fe_topology_enum[0]; - - return snd_ctl_enum_info(uinfo, 1, e->items, e->texts); -} - -static int msm_pcm_fe_topology_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned long fe_id = kcontrol->private_value; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: %lu topology %s\n", __func__, fe_id, - msm_pcm_fe_topology_text[msm_pcm_fe_topology[fe_id]]); - ucontrol->value.enumerated.item[0] = msm_pcm_fe_topology[fe_id]; - return 0; -} - -static int msm_pcm_fe_topology_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned long fe_id = kcontrol->private_value; - unsigned int item; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - item = ucontrol->value.enumerated.item[0]; - if (item >= ARRAY_SIZE(msm_pcm_fe_topology_text)) { - pr_err("%s Received out of bound topology %lu\n", __func__, - fe_id); - return -EINVAL; - } - - pr_debug("%s: %lu new topology %s\n", __func__, fe_id, - msm_pcm_fe_topology_text[item]); - msm_pcm_fe_topology[fe_id] = item; - return 0; -} - -static int msm_pcm_add_fe_topology_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "PCM_Dev"; - const char *deviceNo = "NN"; - const char *topo_text = "Topology"; - char *mixer_str = NULL; - int ctl_len; - int ret; - struct snd_kcontrol_new topology_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "?", - .info = msm_pcm_fe_topology_info, - .get = msm_pcm_fe_topology_get, - .put = msm_pcm_fe_topology_put, - .private_value = 0, - }, - }; - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 + - strlen(topo_text) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name, - rtd->pcm->device, topo_text); - - topology_control[0].name = mixer_str; - topology_control[0].private_value = rtd->dai_link->id; - ret = snd_soc_add_platform_controls(rtd->platform, topology_control, - ARRAY_SIZE(topology_control)); - msm_pcm_fe_topology[rtd->dai_link->id] = 0; - kfree(mixer_str); - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ctl_len = strlen(playback_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + - strlen(suffix) + 1; - pr_debug("%s: Playback app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: playback app type cntrl add failed, err: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_playback_app_type_cfg_ctl_put; - kctl->get = msm_pcm_playback_app_type_cfg_ctl_get; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ctl_len = strlen(capture_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Capture app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: capture app type cntrl add failed, err: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_capture_app_type_cfg_ctl_put; - kctl->get = msm_pcm_capture_app_type_cfg_ctl_get; - } - - return 0; -} - -static int msm_pcm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - int ret = 0; - struct snd_pcm *pcm = hw->private_data; - struct snd_pcm_mmap_fd __user *_mmap_fd = NULL; - struct snd_pcm_mmap_fd mmap_fd; - struct snd_pcm_substream *substream = NULL; - int32_t dir = -1; - - switch (cmd) { - case SNDRV_PCM_IOCTL_MMAP_DATA_FD: - _mmap_fd = (struct snd_pcm_mmap_fd __user *)arg; - if (get_user(dir, (int32_t __user *)&(_mmap_fd->dir))) { - pr_err("%s: error copying mmap_fd from user\n", - __func__); - ret = -EFAULT; - break; - } - if (dir != OUT && dir != IN) { - pr_err("%s invalid stream dir\n", __func__); - ret = -EINVAL; - break; - } - substream = pcm->streams[dir].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - ret = -ENODEV; - break; - } - pr_debug("%s : %s MMAP Data fd\n", __func__, - dir == 0 ? "P" : "C"); - if (msm_pcm_mmap_fd(substream, &mmap_fd) < 0) { - pr_err("%s: error getting fd\n", - __func__); - ret = -EFAULT; - break; - } - if (put_user(mmap_fd.fd, &_mmap_fd->fd) || - put_user(mmap_fd.size, &_mmap_fd->size) || - put_user(mmap_fd.actual_size, &_mmap_fd->actual_size)) { - pr_err("%s: error copying fd\n", __func__); - return -EFAULT; - } - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - -#ifdef CONFIG_COMPAT -static int msm_pcm_hwdep_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - unsigned int cmd, - unsigned long arg) -{ - /* we only support mmap fd. Handling is common in both modes */ - return msm_pcm_hwdep_ioctl(hw, file, cmd, arg); -} -#else -static int msm_pcm_hwdep_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - unsigned int cmd, - unsigned long arg) -{ - return -EINVAL; -} -#endif - -static int msm_pcm_add_hwdep_dev(struct snd_soc_pcm_runtime *runtime) -{ - struct snd_hwdep *hwdep; - int rc; - char id[] = "NOIRQ_NN"; - - snprintf(id, sizeof(id), "NOIRQ_%d", runtime->pcm->device); - pr_debug("%s: pcm dev %d\n", __func__, runtime->pcm->device); - rc = snd_hwdep_new(runtime->card->snd_card, - &id[0], - HWDEP_FE_BASE + runtime->pcm->device, - &hwdep); - if (!hwdep || rc < 0) { - pr_err("%s: hwdep intf failed to create %s - hwdep\n", __func__, - id); - return rc; - } - - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_BE; /* for lack of a FE iface */ - hwdep->private_data = runtime->pcm; /* of type struct snd_pcm */ - hwdep->ops.ioctl = msm_pcm_hwdep_ioctl; - hwdep->ops.ioctl_compat = msm_pcm_hwdep_compat_ioctl; - return 0; -} - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - struct snd_pcm *pcm = rtd->pcm; - int ret; - - pr_debug("%s , register new control\n", __func__); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_pcm_add_channel_map_control(rtd); - if (ret) - pr_err("%s: Could not add pcm Channel Map Control\n", - __func__); - - ret = msm_pcm_add_volume_control(rtd, SNDRV_PCM_STREAM_PLAYBACK); - if (ret) { - pr_err("%s: Could not add pcm playback volume Control %d\n", - __func__, ret); - } - ret = msm_pcm_add_volume_control(rtd, SNDRV_PCM_STREAM_CAPTURE); - if (ret) { - pr_err("%s: Could not add pcm capture volume Control %d\n", - __func__, ret); - } - ret = msm_pcm_add_fe_topology_control(rtd); - if (ret) { - pr_err("%s: Could not add pcm topology control %d\n", - __func__, ret); - } - - ret = msm_pcm_add_app_type_controls(rtd); - if (ret) { - pr_err("%s: Could not add app type controls failed %d\n", - __func__, ret); - } - ret = msm_pcm_add_hwdep_dev(rtd); - if (ret) - pr_err("%s: Could not add hw dep node\n", __func__); - pcm->nonatomic = true; - - return ret; -} - - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .prepare = msm_pcm_prepare, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .ioctl = msm_pcm_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = msm_pcm_compat_ioctl, -#endif - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .mmap = msm_pcm_mmap, - .close = msm_pcm_close, -}; - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - struct msm_plat_data *pdata; - const char *latency_level; - int perf_mode = LOW_LATENCY_PCM_MODE; - - dev_dbg(&pdev->dev, "Pull mode driver probe\n"); - - if (of_property_read_bool(pdev->dev.of_node, - "qcom,msm-pcm-low-latency")) { - - rc = of_property_read_string(pdev->dev.of_node, - "qcom,latency-level", &latency_level); - if (!rc) { - if (!strcmp(latency_level, "ultra")) - perf_mode = ULTRA_LOW_LATENCY_PCM_MODE; - else if (!strcmp(latency_level, "ull-pp")) - perf_mode = ULL_POST_PROCESSING_PCM_MODE; - } - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_plat_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - pdata->perf_mode = perf_mode; - - mutex_init(&pdata->lock); - - dev_set_drvdata(&pdev->dev, pdata); - - dev_dbg(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - dev_dbg(&pdev->dev, "Pull mode driver register\n"); - rc = snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); - - if (rc) - dev_err(&pdev->dev, "Failed to register pull mode driver\n"); - - return rc; -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - struct msm_plat_data *pdata; - - dev_dbg(&pdev->dev, "Pull mode remove\n"); - pdata = dev_get_drvdata(&pdev->dev); - mutex_destroy(&pdata->lock); - devm_kfree(&pdev->dev, pdata); - snd_soc_unregister_platform(&pdev->dev); - return 0; -} -static const struct of_device_id msm_pcm_noirq_dt_match[] = { - {.compatible = "qcom,msm-pcm-dsp-noirq"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_noirq_dt_match); - -static struct platform_driver msm_pcm_driver_noirq = { - .driver = { - .name = "msm-pcm-dsp-noirq", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_noirq_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_noirq_init(void) -{ - return platform_driver_register(&msm_pcm_driver_noirq); -} - -void msm_pcm_noirq_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver_noirq); -} - -MODULE_DESCRIPTION("PCM NOIRQ module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-q6-v2.c b/techpack/audio/4.0/asoc/msm-pcm-q6-v2.c deleted file mode 100644 index 507c0d856c23..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-q6-v2.c +++ /dev/null @@ -1,2817 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" -#include "msm-qti-pp-config.h" - -#define DRV_NAME "msm-pcm-q6-v2" -#define TIMEOUT_MS 1000 - -enum stream_state { - IDLE = 0, - STOPPED, - RUNNING, -}; - -static struct audio_locks the_locks; - -#define PCM_MASTER_VOL_MAX_STEPS 0x2000 -static const DECLARE_TLV_DB_LINEAR(msm_pcm_vol_gain, 0, - PCM_MASTER_VOL_MAX_STEPS); - -struct snd_msm { - struct snd_card *card; - struct snd_pcm *pcm; -}; - -#define CMD_EOS_MIN_TIMEOUT_LENGTH 50 -#define CMD_EOS_TIMEOUT_MULTIPLIER (HZ * 50) -#define MAX_PB_COPY_RETRIES 3 - -static struct snd_pcm_hardware msm_pcm_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .rates = SNDRV_PCM_RATE_8000_384000, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 4, - .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * - CAPTURE_MAX_PERIOD_SIZE, - .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE, - .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE, - .periods_min = CAPTURE_MIN_NUM_PERIODS, - .periods_max = CAPTURE_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_pcm_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .rates = SNDRV_PCM_RATE_8000_384000, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = PLAYBACK_MAX_NUM_PERIODS * - PLAYBACK_MAX_PERIOD_SIZE, - .period_bytes_min = PLAYBACK_MIN_PERIOD_SIZE, - .period_bytes_max = PLAYBACK_MAX_PERIOD_SIZE, - .periods_min = PLAYBACK_MIN_NUM_PERIODS, - .periods_max = PLAYBACK_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, - 88200, 96000, 176400, 192000, 352800, 384000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static void msm_pcm_route_event_handler(enum msm_pcm_routing_event event, - void *priv_data) -{ - struct msm_audio *prtd = priv_data; - - WARN_ON(!prtd); - - pr_debug("%s: event %x\n", __func__, event); - - switch (event) { - case MSM_PCM_RT_EVT_BUF_RECFG: - q6asm_cmd(prtd->audio_client, CMD_PAUSE); - q6asm_cmd(prtd->audio_client, CMD_FLUSH); - q6asm_run(prtd->audio_client, 0, 0, 0); - /* fallthrough */ - default: - break; - } -} - -static void event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct msm_audio *prtd = priv; - struct snd_pcm_substream *substream = prtd->substream; - uint32_t *ptrmem = (uint32_t *)payload; - uint32_t idx = 0; - uint32_t size = 0; - uint8_t buf_index; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: { - pr_debug("ASM_DATA_EVENT_WRITE_DONE_V2\n"); - pr_debug("Buffer Consumed = 0x%08x\n", *ptrmem); - prtd->pcm_irq_pos += prtd->pcm_count; - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - atomic_inc(&prtd->out_count); - wake_up(&the_locks.write_wait); - if (!atomic_read(&prtd->start)) - break; - if (!prtd->mmap_flag || prtd->reset_event) - break; - if (q6asm_is_cpu_buf_avail_nolock(IN, - prtd->audio_client, - &size, &idx)) { - pr_debug("%s:writing %d bytes of buffer to dsp 2\n", - __func__, prtd->pcm_count); - q6asm_write_nolock(prtd->audio_client, - prtd->pcm_count, 0, 0, NO_TIMESTAMP); - } - break; - } - case ASM_DATA_EVENT_RENDERED_EOS: - pr_debug("ASM_DATA_EVENT_RENDERED_EOS\n"); - clear_bit(CMD_EOS, &prtd->cmd_pending); - wake_up(&the_locks.eos_wait); - break; - case ASM_DATA_EVENT_READ_DONE_V2: { - pr_debug("ASM_DATA_EVENT_READ_DONE_V2\n"); - buf_index = q6asm_get_buf_index_from_token(token); - if (buf_index >= CAPTURE_MAX_NUM_PERIODS) { - pr_err("%s: buffer index %u is out of range.\n", - __func__, buf_index); - return; - } - pr_debug("%s: token=0x%08x buf_index=0x%08x\n", - __func__, token, buf_index); - prtd->in_frame_info[buf_index].size = payload[4]; - prtd->in_frame_info[buf_index].offset = payload[5]; - /* assume data size = 0 during flushing */ - if (prtd->in_frame_info[buf_index].size) { - prtd->pcm_irq_pos += - prtd->in_frame_info[buf_index].size; - pr_debug("pcm_irq_pos=%d\n", prtd->pcm_irq_pos); - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - if (atomic_read(&prtd->in_count) <= prtd->periods) - atomic_inc(&prtd->in_count); - wake_up(&the_locks.read_wait); - if (prtd->mmap_flag && - q6asm_is_cpu_buf_avail_nolock(OUT, - prtd->audio_client, - &size, &idx) && - (substream->runtime->status->state == - SNDRV_PCM_STATE_RUNNING)) - q6asm_read_nolock(prtd->audio_client); - } else { - pr_debug("%s: reclaim flushed buf in_count %x\n", - __func__, atomic_read(&prtd->in_count)); - prtd->pcm_irq_pos += prtd->pcm_count; - if (prtd->mmap_flag) { - if (q6asm_is_cpu_buf_avail_nolock(OUT, - prtd->audio_client, - &size, &idx) && - (substream->runtime->status->state == - SNDRV_PCM_STATE_RUNNING)) - q6asm_read_nolock(prtd->audio_client); - } else { - atomic_inc(&prtd->in_count); - } - if (atomic_read(&prtd->in_count) == prtd->periods) { - pr_info("%s: reclaimed all bufs\n", __func__); - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - wake_up(&the_locks.read_wait); - } - } - break; - } - case ASM_STREAM_PP_EVENT: - case ASM_STREAM_CMD_ENCDEC_EVENTS: { - pr_debug("%s: ASM_STREAM_EVENT (0x%x)\n", __func__, opcode); - if (!substream) { - pr_err("%s: substream is NULL.\n", __func__); - return; - } - - rtd = substream->private_data; - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return; - } - - ret = msm_adsp_inform_mixer_ctl(rtd, payload); - if (ret) { - pr_err("%s: failed to inform mixer ctl. err = %d\n", - __func__, ret); - return; - } - - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - if (substream->stream - != SNDRV_PCM_STREAM_PLAYBACK) { - atomic_set(&prtd->start, 1); - break; - } - if (prtd->mmap_flag) { - pr_debug("%s:writing %d bytes of buffer to dsp\n", - __func__, - prtd->pcm_count); - q6asm_write_nolock(prtd->audio_client, - prtd->pcm_count, - 0, 0, NO_TIMESTAMP); - } else { - while (atomic_read(&prtd->out_needed)) { - pr_debug("%s:writing %d bytes of buffer to dsp\n", - __func__, - prtd->pcm_count); - q6asm_write_nolock(prtd->audio_client, - prtd->pcm_count, - 0, 0, NO_TIMESTAMP); - atomic_dec(&prtd->out_needed); - wake_up(&the_locks.write_wait); - }; - } - atomic_set(&prtd->start, 1); - break; - case ASM_STREAM_CMD_REGISTER_PP_EVENTS: - pr_debug("%s: ASM_STREAM_CMD_REGISTER_PP_EVENTS:", - __func__); - break; - default: - pr_debug("%s:Payload = [0x%x]stat[0x%x]\n", - __func__, payload[0], payload[1]); - break; - } - } - break; - case RESET_EVENTS: - pr_debug("%s RESET_EVENTS\n", __func__); - prtd->pcm_irq_pos += prtd->pcm_count; - atomic_inc(&prtd->out_count); - atomic_inc(&prtd->in_count); - prtd->reset_event = true; - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - wake_up(&the_locks.eos_wait); - wake_up(&the_locks.write_wait); - wake_up(&the_locks.read_wait); - break; - default: - pr_debug("Not Supported Event opcode[0x%x]\n", opcode); - break; - } -} - -static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - struct snd_pcm_hw_params *params; - int ret; - uint32_t fmt_type = FORMAT_LINEAR_PCM; - uint16_t bits_per_sample; - uint16_t sample_word_size; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - if (!prtd || !prtd->audio_client) { - pr_err("%s: private data null or audio client freed\n", - __func__); - return -EINVAL; - } - params = &soc_prtd->dpcm[substream->stream].hw_params; - - pr_debug("%s\n", __func__); - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - if (prtd->enabled) - return 0; - - prtd->audio_client->perf_mode = pdata->perf_mode; - pr_debug("%s: perf: %x\n", __func__, pdata->perf_mode); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S32_LE: - bits_per_sample = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - break; - } - if (prtd->compress_enable) { - fmt_type = FORMAT_GEN_COMPR; - pr_debug("%s: Compressed enabled!\n", __func__); - ret = q6asm_open_write_compressed(prtd->audio_client, fmt_type, - COMPRESSED_PASSTHROUGH_GEN); - if (ret < 0) { - pr_err("%s: q6asm_open_write_compressed failed (%d)\n", - __func__, ret); - q6asm_audio_client_free(prtd->audio_client); - prtd->audio_client = NULL; - return -ENOMEM; - } - } else { - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2)) - ret = q6asm_open_write_v5(prtd->audio_client, - fmt_type, bits_per_sample); - else - ret = q6asm_open_write_v4(prtd->audio_client, - fmt_type, bits_per_sample); - - if (ret < 0) { - pr_err("%s: q6asm_open_write failed (%d)\n", - __func__, ret); - q6asm_audio_client_free(prtd->audio_client); - prtd->audio_client = NULL; - return -ENOMEM; - } - - ret = q6asm_send_cal(prtd->audio_client); - if (ret < 0) - pr_debug("%s : Send cal failed : %d", __func__, ret); - } - pr_debug("%s: session ID %d\n", __func__, - prtd->audio_client->session); - prtd->session_id = prtd->audio_client->session; - - if (prtd->compress_enable) { - ret = msm_pcm_routing_reg_phy_compr_stream( - soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_PLAYBACK, - COMPRESSED_PASSTHROUGH_GEN); - } else { - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream); - } - if (ret) { - pr_err("%s: stream reg failed ret:%d\n", __func__, ret); - return ret; - } - if (prtd->compress_enable) { - ret = q6asm_media_format_block_gen_compr( - prtd->audio_client, runtime->rate, - runtime->channels, !prtd->set_channel_map, - prtd->channel_map, bits_per_sample); - } else { - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2)) { - - ret = q6asm_media_format_block_multi_ch_pcm_v5( - prtd->audio_client, runtime->rate, - runtime->channels, !prtd->set_channel_map, - prtd->channel_map, bits_per_sample, - sample_word_size, ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } else { - ret = q6asm_media_format_block_multi_ch_pcm_v4( - prtd->audio_client, runtime->rate, - runtime->channels, !prtd->set_channel_map, - prtd->channel_map, bits_per_sample, - sample_word_size, ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } - } - if (ret < 0) - pr_info("%s: CMD Format block failed\n", __func__); - - atomic_set(&prtd->out_count, runtime->periods); - - prtd->enabled = 1; - prtd->cmd_pending = 0; - prtd->cmd_interrupt = 0; - - return 0; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_plat_data *pdata; - struct snd_pcm_hw_params *params; - struct msm_pcm_routing_evt event; - int ret = 0; - int i = 0; - uint16_t bits_per_sample = 16; - uint16_t sample_word_size; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - if (!prtd || !prtd->audio_client) { - pr_err("%s: private data null or audio client freed\n", - __func__); - return -EINVAL; - } - - if (prtd->enabled == IDLE) { - pr_debug("%s:perf_mode=%d periods=%d\n", __func__, - pdata->perf_mode, runtime->periods); - params = &soc_prtd->dpcm[substream->stream].hw_params; - if ((params_format(params) == SNDRV_PCM_FORMAT_S24_LE) || - (params_format(params) == SNDRV_PCM_FORMAT_S24_3LE)) - bits_per_sample = 24; - else if (params_format(params) == SNDRV_PCM_FORMAT_S32_LE) - bits_per_sample = 32; - - /* ULL mode is not supported in capture path */ - if (pdata->perf_mode == LEGACY_PCM_MODE) - prtd->audio_client->perf_mode = LEGACY_PCM_MODE; - else - prtd->audio_client->perf_mode = LOW_LATENCY_PCM_MODE; - - pr_debug("%s Opening %d-ch PCM read stream, perf_mode %d\n", - __func__, params_channels(params), - prtd->audio_client->perf_mode); - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2)) - ret = q6asm_open_read_v5(prtd->audio_client, - FORMAT_LINEAR_PCM, - bits_per_sample, false, ENC_CFG_ID_NONE); - else - ret = q6asm_open_read_v4(prtd->audio_client, - FORMAT_LINEAR_PCM, - bits_per_sample, false, ENC_CFG_ID_NONE); - if (ret < 0) { - pr_err("%s: q6asm_open_read failed\n", __func__); - q6asm_audio_client_free(prtd->audio_client); - prtd->audio_client = NULL; - return -ENOMEM; - } - - ret = q6asm_send_cal(prtd->audio_client); - if (ret < 0) - pr_debug("%s : Send cal failed : %d", __func__, ret); - - pr_debug("%s: session ID %d\n", - __func__, prtd->audio_client->session); - prtd->session_id = prtd->audio_client->session; - event.event_func = msm_pcm_route_event_handler; - event.priv_data = (void *) prtd; - ret = msm_pcm_routing_reg_phy_stream_v2( - soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream, - event); - if (ret) { - pr_err("%s: stream reg failed ret:%d\n", __func__, ret); - return ret; - } - } - - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - - if (prtd->enabled == IDLE || prtd->enabled == STOPPED) { - for (i = 0; i < runtime->periods; i++) - q6asm_read(prtd->audio_client); - prtd->periods = runtime->periods; - } - - if (prtd->enabled != IDLE) - return 0; - - switch (runtime->format) { - case SNDRV_PCM_FORMAT_S32_LE: - bits_per_sample = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - break; - } - - pr_debug("%s: Samp_rate = %d Channel = %d bit width = %d, word size = %d\n", - __func__, prtd->samp_rate, prtd->channel_mode, - bits_per_sample, sample_word_size); - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2)) - ret = q6asm_enc_cfg_blk_pcm_format_support_v5( - prtd->audio_client, - prtd->samp_rate, - prtd->channel_mode, - bits_per_sample, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - else - ret = q6asm_enc_cfg_blk_pcm_format_support_v4( - prtd->audio_client, - prtd->samp_rate, - prtd->channel_mode, - bits_per_sample, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - - if (ret < 0) - pr_debug("%s: cmd cfg pcm was block failed", __func__); - - prtd->enabled = RUNNING; - - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: Trigger start\n", __func__); - ret = q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - atomic_set(&prtd->start, 0); - if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) { - prtd->enabled = STOPPED; - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - break; - } - /* pending CMD_EOS isn't expected */ - WARN_ON_ONCE(test_bit(CMD_EOS, &prtd->cmd_pending)); - set_bit(CMD_EOS, &prtd->cmd_pending); - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_EOS); - if (ret) - clear_bit(CMD_EOS, &prtd->cmd_pending); - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE\n"); - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->start, 0); - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd; - struct msm_plat_data *pdata; - enum apr_subsys_state subsys_state; - int ret = 0; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - - subsys_state = apr_get_subsys_state(); - if (subsys_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - - prtd = kzalloc(sizeof(struct msm_audio), GFP_KERNEL); - if (prtd == NULL) - return -ENOMEM; - - prtd->substream = substream; - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)event_handler, prtd); - if (!prtd->audio_client) { - pr_info("%s: Could not allocate memory\n", __func__); - kfree(prtd); - prtd = NULL; - return -ENOMEM; - } - - prtd->audio_client->dev = soc_prtd->platform->dev; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - runtime->hw = msm_pcm_hardware_playback; - - /* Capture path */ - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - runtime->hw = msm_pcm_hardware_capture; - else { - pr_err("Invalid Stream type %d\n", substream->stream); - return -EINVAL; - } - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_list failed\n"); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_SIZE, - PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE); - if (ret < 0) { - pr_err("constraint for buffer bytes min max ret = %d\n", - ret); - } - } - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - CAPTURE_MIN_NUM_PERIODS * CAPTURE_MIN_PERIOD_SIZE, - CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE); - if (ret < 0) { - pr_err("constraint for buffer bytes min max ret = %d\n", - ret); - } - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32); - if (ret < 0) { - pr_err("constraint for period bytes step ret = %d\n", - ret); - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32); - if (ret < 0) { - pr_err("constraint for buffer bytes step ret = %d\n", - ret); - } - - prtd->enabled = IDLE; - prtd->dsp_cnt = 0; - prtd->set_channel_map = false; - prtd->reset_event = false; - runtime->private_data = prtd; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - msm_adsp_init_mixer_ctl_pp_event_queue(soc_prtd); - - /* Vote to update the Rx thread priority to RT Thread for playback */ - if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) && - (pdata->perf_mode == LOW_LATENCY_PCM_MODE)) - apr_start_rx_rt(prtd->audio_client->apr); - - return 0; -} - -static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - int xfer = 0; - char *bufptr = NULL; - void *data = NULL; - uint32_t idx = 0; - uint32_t size = 0; - uint32_t retries = 0; - - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - - pr_debug("%s: prtd->out_count = %d\n", - __func__, atomic_read(&prtd->out_count)); - - while ((fbytes > 0) && (retries < MAX_PB_COPY_RETRIES)) { - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET before wait\n", - __func__); - return -ENETRESET; - } - - ret = wait_event_timeout(the_locks.write_wait, - (atomic_read(&prtd->out_count)), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event_timeout failed\n", __func__); - ret = -ETIMEDOUT; - goto fail; - } - ret = 0; - - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET after wait\n", - __func__); - return -ENETRESET; - } - - if (!atomic_read(&prtd->out_count)) { - pr_err("%s: pcm stopped out_count 0\n", __func__); - return 0; - } - - data = q6asm_is_cpu_buf_avail(IN, prtd->audio_client, &size, - &idx); - if (data == NULL) { - retries++; - continue; - } else { - retries = 0; - } - - if (fbytes > size) - xfer = size; - else - xfer = fbytes; - - bufptr = data; - if (bufptr) { - pr_debug("%s:fbytes =%lu: xfer=%d size=%d\n", - __func__, fbytes, xfer, size); - if (copy_from_user(bufptr, buf, xfer)) { - ret = -EFAULT; - pr_err("%s: copy_from_user failed\n", - __func__); - q6asm_cpu_buf_release(IN, prtd->audio_client); - goto fail; - } - buf += xfer; - fbytes -= xfer; - pr_debug("%s:fbytes = %lu: xfer=%d\n", __func__, - fbytes, xfer); - if (atomic_read(&prtd->start)) { - pr_debug("%s:writing %d bytes of buffer to dsp\n", - __func__, xfer); - ret = q6asm_write(prtd->audio_client, xfer, - 0, 0, NO_TIMESTAMP); - if (ret < 0) { - ret = -EFAULT; - q6asm_cpu_buf_release(IN, - prtd->audio_client); - goto fail; - } - } else - atomic_inc(&prtd->out_needed); - atomic_dec(&prtd->out_count); - } - } -fail: - if (retries >= MAX_PB_COPY_RETRIES) - ret = -ENOMEM; - - return ret; -} - -static int msm_pcm_playback_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - uint32_t timeout; - int dir = 0; - int ret = 0; - - pr_debug("%s: cmd_pending 0x%lx\n", __func__, prtd->cmd_pending); - - pdata = (struct msm_plat_data *) dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - if (prtd->audio_client) { - dir = IN; - - /* - * Unvote to downgrade the Rx thread priority from - * RT Thread for Low-Latency use case. - */ - if (pdata) { - if (pdata->perf_mode == LOW_LATENCY_PCM_MODE) - apr_end_rx_rt(prtd->audio_client->apr); - } - /* determine timeout length */ - if (runtime->frame_bits == 0 || runtime->rate == 0) { - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } else { - timeout = (runtime->period_size * - CMD_EOS_TIMEOUT_MULTIPLIER) / - ((runtime->frame_bits / 8) * - runtime->rate); - if (timeout < CMD_EOS_MIN_TIMEOUT_LENGTH) - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } - pr_debug("%s: CMD_EOS timeout is %d\n", __func__, timeout); - - ret = wait_event_timeout(the_locks.eos_wait, - !test_bit(CMD_EOS, &prtd->cmd_pending), - timeout); - if (!ret) - pr_err("%s: CMD_EOS failed, cmd_pending 0x%lx\n", - __func__, prtd->cmd_pending); - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - q6asm_audio_client_free(prtd->audio_client); - } - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_PLAYBACK); - msm_adsp_clean_mixer_ctl_pp_event_queue(soc_prtd); - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - int xfer; - char *bufptr; - void *data = NULL; - uint32_t idx = 0; - uint32_t size = 0; - uint32_t offset = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = substream->runtime->private_data; - - - pr_debug("%s\n", __func__); - - pr_debug("appl_ptr %d\n", (int)runtime->control->appl_ptr); - pr_debug("hw_ptr %d\n", (int)runtime->status->hw_ptr); - pr_debug("avail_min %d\n", (int)runtime->control->avail_min); - - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET before wait\n", __func__); - return -ENETRESET; - } - ret = wait_event_timeout(the_locks.read_wait, - (atomic_read(&prtd->in_count)), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_debug("%s: wait_event_timeout failed\n", __func__); - goto fail; - } - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET after wait\n", __func__); - return -ENETRESET; - } - if (!atomic_read(&prtd->in_count)) { - pr_debug("%s: pcm stopped in_count 0\n", __func__); - return 0; - } - pr_debug("Checking if valid buffer is available...%pK\n", - data); - data = q6asm_is_cpu_buf_avail(OUT, prtd->audio_client, &size, &idx); - bufptr = data; - pr_debug("Size = %d\n", size); - pr_debug("fbytes = %lu\n", fbytes); - pr_debug("idx = %d\n", idx); - if (bufptr) { - xfer = fbytes; - if (xfer > size) - xfer = size; - offset = prtd->in_frame_info[idx].offset; - pr_debug("Offset value = %d\n", offset); - if (copy_to_user(buf, bufptr+offset, xfer)) { - pr_err("Failed to copy buf to user\n"); - ret = -EFAULT; - q6asm_cpu_buf_release(OUT, prtd->audio_client); - goto fail; - } - fbytes -= xfer; - size -= xfer; - prtd->in_frame_info[idx].offset += xfer; - pr_debug("%s:fbytes = %lu: size=%d: xfer=%d\n", - __func__, fbytes, size, xfer); - pr_debug(" Sending next buffer to dsp\n"); - memset(&prtd->in_frame_info[idx], 0, - sizeof(struct msm_audio_in_frame_info)); - atomic_dec(&prtd->in_count); - ret = q6asm_read(prtd->audio_client); - if (ret < 0) { - pr_err("q6asm read failed\n"); - ret = -EFAULT; - q6asm_cpu_buf_release(OUT, prtd->audio_client); - goto fail; - } - } else - pr_err("No valid buffer\n"); - - pr_debug("Returning from capture_copy... %d\n", ret); -fail: - return ret; -} - -static int msm_pcm_capture_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - int dir = OUT; - - pr_debug("%s\n", __func__); - - pdata = (struct msm_plat_data *) dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - if (prtd->audio_client) { - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - q6asm_audio_client_free(prtd->audio_client); - } - - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_copy(substream, a, hwoff, buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, a, hwoff, buf, fbytes); - return ret; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_close(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_close(substream); - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - return ret; -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - - if (prtd->pcm_irq_pos >= prtd->pcm_size) - prtd->pcm_irq_pos = 0; - - pr_debug("pcm_irq_pos = %d\n", prtd->pcm_irq_pos); - return bytes_to_frames(runtime, (prtd->pcm_irq_pos)); -} - -static int msm_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - struct audio_port_data *apd = ac->port; - struct audio_buffer *ab; - int dir = -1; - - prtd->mmap_flag = 1; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ab = &(apd[dir].buf[0]); - - return msm_audio_ion_mmap(ab, vma); -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct audio_buffer *buf; - int dir, ret; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ret = q6asm_audio_client_buf_alloc_contiguous(dir, - prtd->audio_client, - (params_buffer_bytes(params) / params_periods(params)), - params_periods(params)); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", - ret); - return -ENOMEM; - } - buf = prtd->audio_client->port[dir].buf; - if (buf == NULL || buf[0].data == NULL) - return -ENOMEM; - - pr_debug("%s:buf = %pK\n", __func__, buf); - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf[0].data; - dma_buf->addr = buf[0].phys; - dma_buf->bytes = params_buffer_bytes(params); - if (!dma_buf->area) - return -ENOMEM; - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - return 0; -} - -static int msm_pcm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void __user *arg) -{ - struct msm_audio *prtd = NULL; - struct snd_soc_pcm_runtime *rtd = NULL; - uint64_t ses_time = 0, abs_time = 0; - int64_t av_offset = 0; - int32_t clock_id = -EINVAL; - int rc = 0; - struct snd_pcm_prsnt_position userarg; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return -EINVAL; - } - - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return -EINVAL; - } - - prtd = substream->runtime->private_data; - if (!prtd) { - pr_err("%s prtd is null.\n", __func__); - return -EINVAL; - } - - rtd = substream->private_data; - - switch (cmd) { - case SNDRV_PCM_IOCTL_DSP_POSITION: - dev_dbg(rtd->dev, "%s: SNDRV_PCM_DSP_POSITION", __func__); - if (!arg) { - dev_err(rtd->dev, "%s: Invalid params DSP_POSITION\n", - __func__); - rc = -EINVAL; - goto done; - } - memset(&userarg, 0, sizeof(userarg)); - if (copy_from_user(&userarg, arg, sizeof(userarg))) { - dev_err(rtd->dev, "%s: err copyuser DSP_POSITION\n", - __func__); - rc = -EFAULT; - goto done; - } - clock_id = userarg.clock_id; - rc = q6asm_get_session_time_v2(prtd->audio_client, &ses_time, - &abs_time); - if (rc) { - pr_err("%s: q6asm_get_session_time_v2 failed, rc=%d\n", - __func__, rc); - goto done; - } - userarg.frames = div64_u64((ses_time * prtd->samp_rate), - 1000000); - - rc = avcs_core_query_timer_offset(&av_offset, clock_id); - if (rc) { - pr_err("%s: avcs offset query failed, rc=%d\n", - __func__, rc); - goto done; - } - - userarg.timestamp = abs_time + av_offset; - if (copy_to_user(arg, &userarg, sizeof(userarg))) { - dev_err(rtd->dev, "%s: err copy to user DSP_POSITION\n", - __func__); - rc = -EFAULT; - goto done; - } - pr_debug("%s, vals f %lld, t %lld, avoff %lld, abst %lld, sess_time %llu sr %d\n", - __func__, userarg.frames, userarg.timestamp, - av_offset, abs_time, ses_time, prtd->samp_rate); - break; - default: - rc = snd_pcm_lib_ioctl(substream, cmd, arg); - break; - } -done: - return rc; -} - -#ifdef CONFIG_COMPAT -static int msm_pcm_compat_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void __user *arg) -{ - return msm_pcm_ioctl(substream, cmd, arg); -} -#else -#define msm_pcm_compat_ioctl NULL -#endif - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .ioctl = msm_pcm_ioctl, - .compat_ioctl = msm_pcm_compat_ioctl, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .mmap = msm_pcm_mmap, -}; - -static int msm_pcm_adsp_stream_cmd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *pcm = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(pcm); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - int ret = 0; - struct msm_adsp_event_data *event_data = NULL; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - - mutex_lock(&pdata->lock); - substream = pdata->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - ret = -EINVAL; - goto done; - } - - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = substream->runtime->private_data; - if (prtd == NULL) { - pr_err("%s prtd is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s prtd is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)ucontrol->value.bytes.data; - if ((event_data->event_type < ADSP_STREAM_PP_EVENT) || - (event_data->event_type >= ADSP_STREAM_EVENT_MAX)) { - pr_err("%s: invalid event_type=%d", - __func__, event_data->event_type); - ret = -EINVAL; - goto done; - } - - if (event_data->payload_len > sizeof(ucontrol->value.bytes.data) - - sizeof(struct msm_adsp_event_data)) { - pr_err("%s param length=%d exceeds limit", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_stream_cmd(prtd->audio_client, event_data); - if (ret < 0) - pr_err("%s: failed to send stream event cmd, err = %d\n", - __func__, ret); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_pcm_add_audio_adsp_stream_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CMD; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_audio_adsp_stream_cmd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_pcm_adsp_stream_cmd_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_stream_cmd_config_control[0].name = mixer_str; - fe_audio_adsp_stream_cmd_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s\n", mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_stream_cmd_config_control, - ARRAY_SIZE(fe_audio_adsp_stream_cmd_config_control)); - if (ret < 0) - pr_err("%s: failed add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_pcm_add_audio_adsp_stream_callback_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol *kctl; - - struct snd_kcontrol_new fe_audio_adsp_callback_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_callback_info, - .get = msm_adsp_stream_callback_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: added new pcm FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_callback_config_control[0].name = mixer_str; - fe_audio_adsp_callback_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_callback_config_control, - ARRAY_SIZE(fe_audio_adsp_callback_config_control)); - if (ret < 0) { - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl %s.\n", __func__, mixer_str); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl->private_data = NULL; - -free_mixer_str: - kfree(mixer_str); -done: - return ret; -} - -static int msm_pcm_set_volume(struct msm_audio *prtd, uint32_t volume) -{ - int rc = 0; - - if (prtd && prtd->audio_client) { - pr_debug("%s: channels %d volume 0x%x\n", __func__, - prtd->channel_mode, volume); - rc = q6asm_set_volume(prtd->audio_client, volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - } - } - return rc; -} - -static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = NULL; - struct snd_pcm_substream *substream = - vol->pcm->streams[vol->stream].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_audio *prtd; - - pr_debug("%s\n", __func__); - if (!vol) { - pr_err("%s: vol is NULL\n", __func__); - return -ENODEV; - } - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -ENODEV; - } - soc_prtd = substream->private_data; - if (!substream->runtime || !soc_prtd) { - pr_debug("%s: substream runtime or private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->volume; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = NULL; - struct snd_pcm_substream *substream = - vol->pcm->streams[vol->stream].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_audio *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : 0x%x\n", __func__, volume); - if (!substream) { - pr_err("%s: substream not found\n", __func__); - return -ENODEV; - } - - soc_prtd = substream->private_data; - if (!substream->runtime || !soc_prtd) { - pr_err("%s: substream runtime or private_data not found\n", - __func__); - return 0; - } - - - pdata = (struct msm_plat_data *) dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - rc = msm_pcm_set_volume(prtd, volume); - prtd->volume = volume; - } - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_pcm_add_volume_control(struct snd_soc_pcm_runtime *rtd, - int stream) -{ - int ret = 0; - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - - dev_dbg(rtd->dev, "%s, volume control add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, stream, - NULL, 1, rtd->dai_link->id, - &volume_info); - if (ret < 0) { - pr_err("%s volume control failed ret %d\n", __func__, ret); - return ret; - } - kctl = volume_info->kctl; - kctl->put = msm_pcm_volume_ctl_put; - kctl->get = msm_pcm_volume_ctl_get; - kctl->tlv.p = msm_pcm_vol_gain; - return 0; -} - -static int msm_pcm_compress_ctl_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x2000; - return 0; -} - -static int msm_pcm_compress_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(comp); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - substream = pdata->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - if (!substream->runtime) { - pr_debug("%s substream runtime not found\n", __func__); - return 0; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->compress_enable; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_compress_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(comp); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - int compress = ucontrol->value.integer.value[0]; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - substream = pdata->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - pr_debug("%s: compress : 0x%x\n", __func__, compress); - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return 0; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - pr_debug("%s: setting compress flag to 0x%x\n", - __func__, compress); - prtd->compress_enable = compress; - } - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_pcm_add_compress_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback "; - const char *mixer_ctl_end_name = " Compress"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len; - int ret = 0; - struct msm_plat_data *pdata; - struct snd_kcontrol_new pcm_compress_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_compress_ctl_info, - .get = msm_pcm_compress_ctl_get, - .put = msm_pcm_compress_ctl_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: NULL rtd\n", __func__); - return -EINVAL; - } - - ctl_len = strlen(mixer_ctl_name) + strlen(deviceNo) + - strlen(mixer_ctl_end_name) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s%d%s", mixer_ctl_name, - rtd->pcm->device, mixer_ctl_end_name); - - pcm_compress_control[0].name = mixer_str; - pcm_compress_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - pdata = dev_get_drvdata(rtd->platform->dev); - if (pdata) { - if (!pdata->pcm) { - pdata->pcm = rtd->pcm; - snd_soc_add_platform_controls(rtd->platform, - pcm_compress_control, - ARRAY_SIZE - (pcm_compress_control)); - pr_debug("%s: add control success plt = %pK\n", - __func__, rtd->platform); - } - } else { - pr_err("%s: NULL pdata\n", __func__); - ret = -EINVAL; - } - kfree(mixer_str); - return ret; -} - -static int msm_pcm_chmap_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); - unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - struct snd_soc_pcm_runtime *rtd = NULL; - struct msm_plat_data *pdata = NULL; - struct msm_pcm_channel_mixer *chmixer_pspd = NULL; - u64 fe_id = 0; - - pr_debug("%s", __func__); - substream = snd_pcm_chmap_substream(info, idx); - if (!substream) - return -ENODEV; - rtd = substream->private_data; - if (rtd) { - pdata = (struct msm_plat_data *) - dev_get_drvdata(rtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - } - - if (!rtd) - return 0; - - mutex_lock(&pdata->lock); - prtd = substream->runtime ? substream->runtime->private_data : NULL; - if (prtd) { - prtd->set_channel_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - prtd->channel_map[i] = - (char)(ucontrol->value.integer.value[i]); - - /* update chmixer_pspd chmap cached with routing driver as well */ - if (rtd) { - fe_id = rtd->dai_link->id; - chmixer_pspd = pdata ? - pdata->chmixer_pspd[fe_id][SESSION_TYPE_RX] : NULL; - - if (chmixer_pspd && chmixer_pspd->enable) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = prtd->channel_map[i]; - chmixer_pspd->override_in_ch_map = true; - msm_pcm_routing_set_channel_mixer_cfg(fe_id, - SESSION_TYPE_RX, chmixer_pspd); - } - } - } - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); - unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - struct snd_soc_pcm_runtime *rtd = NULL; - struct msm_plat_data *pdata = NULL; - - pr_debug("%s", __func__); - substream = snd_pcm_chmap_substream(info, idx); - if (!substream) - return -ENODEV; - - rtd = substream->private_data; - if (rtd) { - pdata = (struct msm_plat_data *) - dev_get_drvdata(rtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - } - - memset(ucontrol->value.integer.value, 0, - sizeof(ucontrol->value.integer.value)); - if (!rtd) - return 0; /* no channels set */ - - mutex_lock(&pdata->lock); - prtd = substream->runtime ? substream->runtime->private_data : NULL; - - if (prtd && prtd->set_channel_map == true) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - (int)prtd->channel_map[i]; - } else { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = 0; - } - - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_add_chmap_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_chmap *chmap_info; - struct snd_kcontrol *kctl; - char device_num[12]; - int i, ret = 0; - - pr_debug("%s, Channel map cntrl add\n", __func__); - ret = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - snd_pcm_std_chmaps, - PCM_FORMAT_MAX_NUM_CHANNEL_V8, 0, - &chmap_info); - if (ret < 0) { - pr_err("%s, channel map cntrl add failed\n", __func__); - return ret; - } - kctl = chmap_info->kctl; - for (i = 0; i < kctl->count; i++) - kctl->vd[i].access |= SNDRV_CTL_ELEM_ACCESS_WRITE; - snprintf(device_num, sizeof(device_num), "%d", pcm->device); - strlcat(kctl->id.name, device_num, sizeof(kctl->id.name)); - pr_debug("%s, Overwriting channel map control name to: %s\n", - __func__, kctl->id.name); - kctl->put = msm_pcm_chmap_ctl_put; - kctl->get = msm_pcm_chmap_ctl_get; - return 0; -} - -static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ctl_len = strlen(playback_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Playback app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: playback app type cntrl add failed: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_playback_app_type_cfg_ctl_put; - kctl->get = msm_pcm_playback_app_type_cfg_ctl_get; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ctl_len = strlen(capture_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Capture app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: capture app type cntrl add failed: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_capture_app_type_cfg_ctl_put; - kctl->get = msm_pcm_capture_app_type_cfg_ctl_get; - } - - return 0; -} - -static struct msm_pcm_channel_mixer *msm_pcm_get_chmixer( - struct msm_plat_data *pdata, - u64 fe_id, int session_type) -{ - if (!pdata) { - pr_err("%s: missing pdata\n", __func__); - return NULL; - } - - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %llu\n", __func__, fe_id); - return NULL; - } - - if ((session_type != SESSION_TYPE_TX) && - (session_type != SESSION_TYPE_RX)) { - pr_err("%s: invalid session type %d\n", __func__, session_type); - return NULL; - } - - return pdata->chmixer_pspd[fe_id][session_type]; -} - -static int msm_pcm_channel_mixer_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int ret = 0; - int stream_id = 0; - int be_id = 0, i = 0; - struct msm_audio *prtd = NULL; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - struct snd_pcm *pcm = NULL; - struct snd_pcm_substream *substream = NULL; - struct msm_pcm_channel_mixer *chmixer_pspd = NULL; - u8 asm_ch_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; - bool reset_override_out_ch_map = false; - bool reset_override_in_ch_map = false; - - pcm = pdata->pcm_device[fe_id]; - if (!pcm) { - pr_err("%s invalid pcm handle for fe_id %llu\n", - __func__, fe_id); - return -EINVAL; - } - - if (session_type == SESSION_TYPE_RX) - substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - else - substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->enable = ucontrol->value.integer.value[0]; - chmixer_pspd->rule = ucontrol->value.integer.value[1]; - chmixer_pspd->input_channel = ucontrol->value.integer.value[2]; - chmixer_pspd->output_channel = ucontrol->value.integer.value[3]; - chmixer_pspd->port_idx = ucontrol->value.integer.value[4]; - - if (chmixer_pspd->input_channel < 0 || - chmixer_pspd->input_channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8 || - chmixer_pspd->output_channel < 0 || - chmixer_pspd->output_channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channels, in %d, out %d\n", - __func__, chmixer_pspd->input_channel, - chmixer_pspd->output_channel); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime ? substream->runtime->private_data : NULL; - if (chmixer_pspd->enable && prtd) { - if (session_type == SESSION_TYPE_RX && - !chmixer_pspd->override_in_ch_map) { - if (prtd->set_channel_map) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = prtd->channel_map[i]; - } else { - q6asm_map_channels(asm_ch_map, - chmixer_pspd->input_channel, false); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = asm_ch_map[i]; - } - chmixer_pspd->override_in_ch_map = true; - reset_override_in_ch_map = true; - } else if (session_type == SESSION_TYPE_TX && - !chmixer_pspd->override_out_ch_map) { - /* - * Channel map set in prtd is for plyback only, - * hence always use default for capture path. - */ - q6asm_map_channels(asm_ch_map, - chmixer_pspd->output_channel, false); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->out_ch_map[i] = asm_ch_map[i]; - chmixer_pspd->override_out_ch_map = true; - reset_override_out_ch_map = true; - } - } else { - chmixer_pspd->override_out_ch_map = false; - chmixer_pspd->override_in_ch_map = false; - } - - /* cache value and take effect during adm_open stage */ - msm_pcm_routing_set_channel_mixer_cfg(fe_id, - session_type, - chmixer_pspd); - - if (chmixer_pspd->enable && prtd && prtd->audio_client) { - stream_id = prtd->audio_client->session; - be_id = chmixer_pspd->port_idx; - msm_pcm_routing_set_channel_mixer_runtime(be_id, - stream_id, - session_type, - chmixer_pspd); - } - - if (reset_override_out_ch_map) - chmixer_pspd->override_out_ch_map = false; - if (reset_override_in_ch_map) - chmixer_pspd->override_in_ch_map = false; - - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_pcm_channel_mixer_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = chmixer_pspd->enable; - ucontrol->value.integer.value[1] = chmixer_pspd->rule; - ucontrol->value.integer.value[2] = chmixer_pspd->input_channel; - ucontrol->value.integer.value[3] = chmixer_pspd->output_channel; - ucontrol->value.integer.value[4] = chmixer_pspd->port_idx; - return 0; -} - -static int msm_pcm_channel_mixer_output_map_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->override_out_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->out_ch_map[i] = - ucontrol->value.integer.value[i]; - - return 0; -} - -static int msm_pcm_channel_mixer_output_map_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->out_ch_map[i]; - return 0; -} - -static int msm_pcm_channel_mixer_input_map_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - chmixer_pspd->override_in_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->in_ch_map[i] = ucontrol->value.integer.value[i]; - - return 0; -} - -static int msm_pcm_channel_mixer_input_map_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int i = 0; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->in_ch_map[i]; - return 0; -} - -static int msm_pcm_channel_mixer_weight_ctl_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int channel = (kcontrol->private_value >> 16) & 0xFF; - int i = 0; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - struct msm_pcm_channel_mixer *chmixer_pspd; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - if (channel <= 0 || channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: invalid channel number %d\n", __func__, channel); - return -EINVAL; - } - channel--; - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - chmixer_pspd->channel_weight[channel][i] = - ucontrol->value.integer.value[i]; - return 0; -} - -static int msm_pcm_channel_mixer_weight_ctl_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value & 0xFF; - int session_type = (kcontrol->private_value >> 8) & 0xFF; - int channel = (kcontrol->private_value >> 16) & 0xFF; - struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = dev_get_drvdata(component->dev); - int i = 0; - struct msm_pcm_channel_mixer *chmixer_pspd; - - if (channel <= 0 || channel > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: invalid channel number %d\n", __func__, channel); - return -EINVAL; - } - channel--; - - chmixer_pspd = msm_pcm_get_chmixer(pdata, fe_id, session_type); - if (!chmixer_pspd) { - pr_err("%s: invalid chmixer_pspd in pdata", __func__); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - chmixer_pspd->channel_weight[channel][i]; - return 0; -} - -static int msm_pcm_add_platform_controls(struct snd_kcontrol_new *kctl, - struct snd_soc_pcm_runtime *rtd, const char *name_prefix, - const char *name_suffix, int session_type, int channels) -{ - int ret = -EINVAL; - char *mixer_name = NULL; - struct snd_pcm *pcm = rtd->pcm; - const char *deviceNo = "NN"; - const char *channelNo = "NN"; - int ctl_len = 0; - - ctl_len = strlen(name_prefix) + 1 + strlen(deviceNo) + 1 + - strlen(channelNo) + 1 + strlen(name_suffix) + 1; - - mixer_name = kzalloc(ctl_len, GFP_KERNEL); - if (mixer_name == NULL) - return -ENOMEM; - - if (channels >= 0) { - snprintf(mixer_name, ctl_len, "%s %d %s %d", - name_prefix, pcm->device, name_suffix, channels); - kctl->private_value = (rtd->dai_link->id) | (session_type << 8) | - (channels << 16); - } else { - snprintf(mixer_name, ctl_len, "%s %d %s", - name_prefix, pcm->device, name_suffix); - kctl->private_value = (rtd->dai_link->id) | (session_type << 8); - } - - kctl->name = mixer_name; - ret = snd_soc_add_platform_controls(rtd->platform, kctl, 1); - kfree(mixer_name); - return ret; -} - -static int msm_pcm_channel_mixer_output_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid channel map value ranges from 1 to 64 */ - uinfo->value.integer.min = 1; - uinfo->value.integer.max = 64; - return 0; -} - -static int msm_pcm_add_channel_mixer_output_map_controls( - struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Output Map"; - int session_type = 0, ret = 0, channel = -1; - struct snd_kcontrol_new channel_mixer_output_map_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_output_map_info, - .put = msm_pcm_channel_mixer_output_map_ctl_put, - .get = msm_pcm_channel_mixer_output_map_ctl_get, - .private_value = 0, - }; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_output_map_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_output_map_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - return ret; -} - -static int msm_pcm_channel_mixer_input_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid channel map value ranges from 1 to 64 */ - uinfo->value.integer.min = 1; - uinfo->value.integer.max = 64; - return 0; -} - -static int msm_pcm_add_channel_mixer_input_map_controls( - struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Input Map"; - int session_type = 0, ret = 0, channel = -1; - struct snd_kcontrol_new channel_mixer_input_map_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_input_map_info, - .put = msm_pcm_channel_mixer_input_map_ctl_put, - .get = msm_pcm_channel_mixer_input_map_ctl_get, - .private_value = 0, - }; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_input_map_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_input_map_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_channel_mixer_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - /* five int values: enable, rule, in_channels, out_channels and port_id */ - uinfo->count = 5; - /* Valid range is all positive values to support above controls */ - uinfo->value.integer.min = 0; - uinfo->value.integer.max = INT_MAX; - return 0; -} - -static int msm_pcm_add_channel_mixer_cfg_controls( - struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Cfg"; - int session_type = 0, ret = 0, channel = -1; - struct msm_plat_data *pdata = NULL; - struct snd_kcontrol_new channel_mixer_cfg_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_cfg_info, - .put = msm_pcm_channel_mixer_cfg_ctl_put, - .get = msm_pcm_channel_mixer_cfg_ctl_get, - .private_value = 0, - }; - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - pdata->pcm_device[rtd->dai_link->id] = rtd->pcm; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_cfg_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_cfg_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_channel_mixer_weight_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid range: 0 to 0x4000(Unity) gain weightage */ - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x4000; - return 0; -} - -static int msm_pcm_add_channel_mixer_weight_controls( - struct snd_soc_pcm_runtime *rtd, - int channel) -{ - struct snd_pcm *pcm = rtd->pcm; - const char *playback_mixer_ctl_name = "AudStr"; - const char *capture_mixer_ctl_name = "AudStr Capture"; - const char *suffix = "ChMixer Weight Ch"; - int session_type = 0, ret = 0; - struct snd_kcontrol_new channel_mixer_weight_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_mixer_weight_info, - .put = msm_pcm_channel_mixer_weight_ctl_put, - .get = msm_pcm_channel_mixer_weight_ctl_get, - .private_value = 0, - }; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream != NULL) { - session_type = SESSION_TYPE_RX; - ret = msm_pcm_add_platform_controls(&channel_mixer_weight_control, - rtd, playback_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream != NULL) { - session_type = SESSION_TYPE_TX; - ret = msm_pcm_add_platform_controls(&channel_mixer_weight_control, - rtd, capture_mixer_ctl_name, suffix, session_type, channel); - if (ret < 0) - goto fail; - } - return 0; - -fail: - pr_err("%s: failed add platform ctl, err = %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_add_channel_mixer_controls(struct snd_soc_pcm_runtime *rtd) -{ - int i, ret = 0; - struct snd_pcm *pcm = NULL; - struct msm_plat_data *pdata = NULL; - if (!rtd || !rtd->pcm) { - pr_err("%s invalid rtd or pcm\n", __func__); - return -EINVAL; - } - pcm = rtd->pcm; - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream && - !pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX]) { - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX] = - kzalloc(sizeof(struct msm_pcm_channel_mixer), GFP_KERNEL); - if (!pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX]) { - ret = -ENOMEM; - goto fail; - } - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream && - !pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX]) { - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX] = - kzalloc(sizeof(struct msm_pcm_channel_mixer), GFP_KERNEL); - if (!pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX]) { - ret = -ENOMEM; - goto fail; - } - } - - ret = msm_pcm_add_channel_mixer_cfg_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer cfg controls failed:%d\n", - __func__, ret); - goto fail; - } - ret = msm_pcm_add_channel_mixer_input_map_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer input map controls failed:%d\n", - __func__, ret); - goto fail; - } - ret = msm_pcm_add_channel_mixer_output_map_controls(rtd); - if (ret) { - pr_err("%s: pcm add channel mixer output map controls failed:%d\n", - __func__, ret); - goto fail; - } - - for (i = 1; i <= PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) { - ret = msm_pcm_add_channel_mixer_weight_controls(rtd, i); - if (ret) { - pr_err("%s: pcm add channel mixer weight controls failed:%d\n", - __func__, ret); - goto fail; - } - } - return 0; - -fail: - kfree(pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX]); - kfree(pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX]); - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_RX] = NULL; - pdata->chmixer_pspd[rtd->dai_link->id][SESSION_TYPE_TX] = NULL; - - return ret; -} - -static int msm_pcm_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - ret = msm_pcm_add_chmap_controls(rtd); - if (ret) - pr_err("%s: pcm add controls failed:%d\n", __func__, ret); - ret = msm_pcm_add_app_type_controls(rtd); - if (ret) - pr_err("%s: pcm add app type controls failed:%d\n", - __func__, ret); - ret = msm_pcm_add_channel_mixer_controls(rtd); - if (ret) - pr_err("%s: pcm add channel mixer controls failed:%d\n", - __func__, ret); - return ret; -} - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_pcm_add_controls(rtd); - if (ret) { - pr_err("%s, kctl add failed:%d\n", __func__, ret); - return ret; - } - - ret = msm_pcm_add_volume_control(rtd, SNDRV_PCM_STREAM_PLAYBACK); - if (ret) - pr_err("%s: Could not add pcm Volume Control %d\n", - __func__, ret); - ret = msm_pcm_add_volume_control(rtd, SNDRV_PCM_STREAM_CAPTURE); - if (ret) - pr_err("%s: Could not add pcm Volume Control %d\n", - __func__, ret); - ret = msm_pcm_add_compress_control(rtd); - if (ret) - pr_err("%s: Could not add pcm Compress Control %d\n", - __func__, ret); - - ret = msm_pcm_add_audio_adsp_stream_cmd_control(rtd); - if (ret) - pr_err("%s: Could not add pcm ADSP Stream Cmd Control\n", - __func__); - - ret = msm_pcm_add_audio_adsp_stream_callback_control(rtd); - if (ret) - pr_err("%s: Could not add pcm ADSP Stream Callback Control\n", - __func__); - - return ret; -} - -static snd_pcm_sframes_t msm_pcm_delay_blk(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - snd_pcm_sframes_t frames; - int ret; - - ret = q6asm_get_path_delay(prtd->audio_client); - if (ret) { - pr_err("%s: get_path_delay failed, ret=%d\n", __func__, ret); - return 0; - } - - /* convert microseconds to frames */ - frames = ac->path_delay / 1000 * runtime->rate / 1000; - - /* also convert the remainder from the initial division */ - frames += ac->path_delay % 1000 * runtime->rate / 1000000; - - /* overcompensate for the loss of precision (empirical) */ - frames += 2; - - return frames; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .delay_blk = msm_pcm_delay_blk, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - int id; - struct msm_plat_data *pdata; - const char *latency_level; - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-pcm-dsp-id", &id); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-pcm-dsp-id missing in DT node\n", - __func__); - return rc; - } - - pdata = kzalloc(sizeof(struct msm_plat_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - if (of_property_read_bool(pdev->dev.of_node, - "qcom,msm-pcm-low-latency")) { - - pdata->perf_mode = LOW_LATENCY_PCM_MODE; - rc = of_property_read_string(pdev->dev.of_node, - "qcom,latency-level", &latency_level); - if (!rc) { - if (!strcmp(latency_level, "ultra")) - pdata->perf_mode = ULTRA_LOW_LATENCY_PCM_MODE; - else if (!strcmp(latency_level, "ull-pp")) - pdata->perf_mode = - ULL_POST_PROCESSING_PCM_MODE; - } - } else { - pdata->perf_mode = LEGACY_PCM_MODE; - } - mutex_init(&pdata->lock); - dev_set_drvdata(&pdev->dev, pdata); - - - dev_dbg(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - struct msm_plat_data *pdata; - int i = 0; - - pdata = dev_get_drvdata(&pdev->dev); - if (pdata) { - for (i = 0; i < MSM_FRONTEND_DAI_MM_SIZE; i++) { - kfree(pdata->chmixer_pspd[i][SESSION_TYPE_RX]); - kfree(pdata->chmixer_pspd[i][SESSION_TYPE_TX]); - } - } - mutex_destroy(&pdata->lock); - kfree(pdata); - snd_soc_unregister_platform(&pdev->dev); - return 0; -} -static const struct of_device_id msm_pcm_dt_match[] = { - {.compatible = "qcom,msm-pcm-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_dsp_init(void) -{ - init_waitqueue_head(&the_locks.enable_wait); - init_waitqueue_head(&the_locks.eos_wait); - init_waitqueue_head(&the_locks.write_wait); - init_waitqueue_head(&the_locks.read_wait); - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_dsp_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-q6-v2.h b/techpack/audio/4.0/asoc/msm-pcm-q6-v2.h deleted file mode 100644 index 2411f3daada6..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-q6-v2.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2012-2017, 2019 The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_PCM_H -#define _MSM_PCM_H -#include -#include -#include "msm-pcm-routing-v2.h" - - -/* Support unconventional sample rates 12000, 24000 as well */ -#define USE_RATE \ - (SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_KNOT) - -extern int copy_count; - -struct buffer { - void *data; - unsigned int size; - unsigned int used; - unsigned int addr; -}; - -struct buffer_rec { - void *data; - unsigned int size; - unsigned int read; - unsigned int addr; -}; - -struct audio_locks { - spinlock_t event_lock; - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - wait_queue_head_t eos_wait; - wait_queue_head_t enable_wait; - wait_queue_head_t flush_wait; -}; - -struct msm_audio_in_frame_info { - uint32_t size; - uint32_t offset; -}; - -#define PLAYBACK_MIN_NUM_PERIODS 2 -#define PLAYBACK_MAX_NUM_PERIODS 8 -#define PLAYBACK_MAX_PERIOD_SIZE 122880 -#define PLAYBACK_MIN_PERIOD_SIZE 128 -#define CAPTURE_MIN_NUM_PERIODS 2 -#define CAPTURE_MAX_NUM_PERIODS 8 -#define CAPTURE_MAX_PERIOD_SIZE 122880 -#define CAPTURE_MIN_PERIOD_SIZE 320 - -struct msm_audio { - struct snd_pcm_substream *substream; - unsigned int pcm_size; - unsigned int pcm_count; - unsigned int pcm_irq_pos; /* IRQ position */ - uint16_t source; /* Encoding source bit mask */ - - struct audio_client *audio_client; - - uint16_t session_id; - - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t dsp_cnt; - - int abort; /* set when error, like sample rate mismatch */ - - bool reset_event; - int enabled; - int close_ack; - int cmd_ack; - /* - * cmd_ack doesn't tell if paticular command has been sent so can't - * determine if it needs to wait for completion. - * Use cmd_pending instead when checking whether a command is been - * sent or not. - */ - unsigned long cmd_pending; - atomic_t start; - atomic_t stop; - atomic_t out_count; - atomic_t in_count; - atomic_t out_needed; - atomic_t eos; - int out_head; - int periods; - int mmap_flag; - atomic_t pending_buffer; - bool set_channel_map; - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - int cmd_interrupt; - bool meta_data_mode; - uint32_t volume; - bool compress_enable; - /* array of frame info */ - struct msm_audio_in_frame_info in_frame_info[CAPTURE_MAX_NUM_PERIODS]; -}; - -struct output_meta_data_st { - uint32_t meta_data_length; - uint32_t frame_size; - uint32_t timestamp_lsw; - uint32_t timestamp_msw; - uint32_t reserved[12]; -}; - -struct msm_plat_data { - int perf_mode; - struct snd_pcm *pcm; - struct msm_pcm_ch_map *ch_map[MSM_FRONTEND_DAI_MAX]; - struct snd_pcm *pcm_device[MSM_FRONTEND_DAI_MM_SIZE]; - struct msm_pcm_channel_mixer *chmixer_pspd[MSM_FRONTEND_DAI_MM_SIZE][2]; - struct mutex lock; -}; - -struct msm_pcm_ch_map { - bool set_ch_map; - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL]; -}; - -#endif /*_MSM_PCM_H*/ diff --git a/techpack/audio/4.0/asoc/msm-pcm-routing-devdep.c b/techpack/audio/4.0/asoc/msm-pcm-routing-devdep.c deleted file mode 100644 index cddc2a1e3f26..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-routing-devdep.c +++ /dev/null @@ -1,131 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2014, 2016-2017 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-devdep.h" -#include "msm-ds2-dap-config.h" - -#ifdef CONFIG_SND_HWDEP -static int msm_pcm_routing_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ - pr_debug("%s\n", __func__); - msm_ds2_dap_update_port_parameters(hw, file, true); - return 0; -} - -static int msm_pcm_routing_hwdep_release(struct snd_hwdep *hw, - struct file *file) -{ - pr_debug("%s\n", __func__); - msm_ds2_dap_update_port_parameters(hw, file, false); - return 0; -} - -static int msm_pcm_routing_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - int ret = 0; - void __user *argp = (void __user *)arg; - - pr_debug("%s:cmd %x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE: - msm_pcm_routing_acquire_lock(); - ret = msm_ds2_dap_ioctl(hw, file, cmd, argp); - msm_pcm_routing_release_lock(); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: - ret = msm_ds2_dap_ioctl(hw, file, cmd, argp); - break; - default: - pr_err("%s called with invalid control 0x%X\n", __func__, cmd); - ret = -EINVAL; - break; - } - return ret; -} - -void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm) -{ - pr_debug("%s\n", __func__); -} - -#ifdef CONFIG_COMPAT -static int msm_pcm_routing_hwdep_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - unsigned int cmd, - unsigned long arg) -{ - int ret = 0; - void __user *argp = (void __user *)arg; - - pr_debug("%s:cmd %x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM32: - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM32: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND32: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE32: - msm_pcm_routing_acquire_lock(); - ret = msm_ds2_dap_compat_ioctl(hw, file, cmd, argp); - msm_pcm_routing_release_lock(); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32: - ret = msm_ds2_dap_compat_ioctl(hw, file, cmd, argp); - break; - default: - pr_err("%s called with invalid control 0x%X\n", __func__, cmd); - ret = -EINVAL; - break; - } - return ret; -} -#endif - -int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, - struct msm_pcm_routing_bdai_data *msm_bedais) -{ - struct snd_hwdep *hwdep; - struct snd_soc_dai_link *dai_link = runtime->dai_link; - int rc; - - if (dai_link->id < 0 || - dai_link->id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s:BE id %d invalid index\n", - __func__, dai_link->id); - return -EINVAL; - } - pr_debug("%s BE id %d\n", __func__, dai_link->id); - rc = snd_hwdep_new(runtime->card->snd_card, - msm_bedais[dai_link->id].name, - dai_link->id, &hwdep); - if (hwdep == NULL) { - pr_err("%s: hwdep intf failed to create %s- hwdep NULL\n", - __func__, msm_bedais[dai_link->id].name); - return rc; - } - if (rc < 0) { - pr_err("%s: hwdep intf failed to create %s rc %d\n", __func__, - msm_bedais[dai_link->id].name, rc); - return rc; - } - - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_BE; - hwdep->private_data = &msm_bedais[dai_link->id]; - hwdep->ops.open = msm_pcm_routing_hwdep_open; - hwdep->ops.ioctl = msm_pcm_routing_hwdep_ioctl; - hwdep->ops.release = msm_pcm_routing_hwdep_release; -#ifdef CONFIG_COMPAT - hwdep->ops.ioctl_compat = msm_pcm_routing_hwdep_compat_ioctl; -#endif - return rc; -} -#endif diff --git a/techpack/audio/4.0/asoc/msm-pcm-routing-devdep.h b/techpack/audio/4.0/asoc/msm-pcm-routing-devdep.h deleted file mode 100644 index ac3594af2d56..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-routing-devdep.h +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2014-2015, 2017 The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_PCM_ROUTING_DEVDEP_H_ -#define _MSM_PCM_ROUTING_DEVDEP_H_ - -#include -#include "msm-pcm-routing-v2.h" - -#ifdef CONFIG_SND_HWDEP -int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, - struct msm_pcm_routing_bdai_data *msm_bedais); -void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm); -#else -static inline int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, - struct msm_pcm_routing_bdai_data *msm_bedais) -{ - return 0; -} - -static inline void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm) -{ -} -#endif -#endif diff --git a/techpack/audio/4.0/asoc/msm-pcm-routing-v2.c b/techpack/audio/4.0/asoc/msm-pcm-routing-v2.c deleted file mode 100644 index 856edb481ee5..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-routing-v2.c +++ /dev/null @@ -1,31021 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-routing-v2.h" -#include "msm-pcm-routing-devdep.h" -#include "msm-qti-pp-config.h" -#include "msm-dolby-dap-config.h" -#include "msm-ds2-dap-config.h" - -#ifndef CONFIG_DOLBY_DAP -#undef DOLBY_ADM_COPP_TOPOLOGY_ID -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFE -#endif - -#ifndef CONFIG_DOLBY_DS2 -#undef DS2_ADM_COPP_TOPOLOGY_ID -#define DS2_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFF -#endif - -static struct mutex routing_lock; - -static struct cal_type_data *cal_data[MAX_ROUTING_CAL_TYPES]; - -static int fm_switch_enable; -static int hfp_switch_enable; -static int a2dp_switch_enable; -static int sco_switch_enable; - -#ifndef CONFIG_MI2S_DISABLE -static int int0_mi2s_switch_enable; -static int int4_mi2s_switch_enable; -static int pri_mi2s_switch_enable; -static int sec_mi2s_switch_enable; -static int tert_mi2s_switch_enable; -static int quat_mi2s_switch_enable; -static int quin_mi2s_switch_enable; -static int sen_mi2s_switch_enable; -#endif - -static int fm_pcmrx_switch_enable; -static int usb_switch_enable; -static int lsm_port_index[MAX_LSM_SESSIONS]; -static int slim0_rx_aanc_fb_port; -static int msm_route_ec_ref_rx; -static int msm_ec_ref_ch = 4; -static int msm_ec_ref_ch_downmixed = 4; -static int msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S16_LE; -static int msm_ec_ref_sampling_rate = 48000; -static uint32_t voc_session_id = ALL_SESSION_VSID; -static int msm_route_ext_ec_ref; -static bool is_custom_stereo_on; -static bool is_ds2_on; -static bool ffecns_freeze_event; -static bool swap_ch; -static bool hifi_filter_enabled; -static int aanc_level; -static int num_app_cfg_types; -static int msm_ec_ref_port_id; -static int afe_loopback_tx_port_index; -static int afe_loopback_tx_port_id = -1; - -#define WEIGHT_0_DB 0x4000 -/* all the FEs which can support channel mixer */ -static struct msm_pcm_channel_mixer channel_mixer[MSM_FRONTEND_DAI_MM_SIZE]; - -/* all the FES which can support channel mixer for bidirection */ -static struct msm_pcm_channel_mixer - channel_mixer_v2[MSM_FRONTEND_DAI_MM_SIZE][2]; - -/* input BE for each FE */ -static int channel_input[MSM_FRONTEND_DAI_MM_SIZE][ADM_MAX_CHANNELS]; - -enum { - MADNONE, - MADAUDIO, - MADBEACON, - MADULTRASOUND, - MADSWAUDIO, -}; - -#define ADM_LSM_PORT_INDEX 9 - -#define SLIMBUS_0_TX_TEXT "SLIMBUS_0_TX" -#define SLIMBUS_1_TX_TEXT "SLIMBUS_1_TX" -#define SLIMBUS_2_TX_TEXT "SLIMBUS_2_TX" -#define SLIMBUS_3_TX_TEXT "SLIMBUS_3_TX" -#define SLIMBUS_4_TX_TEXT "SLIMBUS_4_TX" -#define SLIMBUS_5_TX_TEXT "SLIMBUS_5_TX" -#define TERT_MI2S_TX_TEXT "TERT_MI2S_TX" -#define QUAT_MI2S_TX_TEXT "QUAT_MI2S_TX" -#define ADM_LSM_TX_TEXT "ADM_LSM_TX" -#define INT3_MI2S_TX_TEXT "INT3_MI2S_TX" -#define VA_CDC_DMA_TX_0_TEXT "VA_CDC_DMA_TX_0" -#define VA_CDC_DMA_TX_1_TEXT "VA_CDC_DMA_TX_1" -#define VA_CDC_DMA_TX_2_TEXT "VA_CDC_DMA_TX_2" -#define TX_CDC_DMA_TX_3_TEXT "TX_CDC_DMA_TX_3" -#define QUIN_TDM_TX_TEXT "QUIN_TDM_TX_0" -#define TERT_TDM_TX_TEXT "TERT_TDM_TX_0" - -#define LSM_FUNCTION_TEXT "LSM Function" -static const char * const lsm_port_text[] = { - "None", - SLIMBUS_0_TX_TEXT, SLIMBUS_1_TX_TEXT, SLIMBUS_2_TX_TEXT, - SLIMBUS_3_TX_TEXT, SLIMBUS_4_TX_TEXT, SLIMBUS_5_TX_TEXT, - TERT_MI2S_TX_TEXT, QUAT_MI2S_TX_TEXT, ADM_LSM_TX_TEXT, - INT3_MI2S_TX_TEXT, VA_CDC_DMA_TX_0_TEXT, VA_CDC_DMA_TX_1_TEXT, - VA_CDC_DMA_TX_2_TEXT, TX_CDC_DMA_TX_3_TEXT, QUIN_TDM_TX_TEXT, - TERT_TDM_TX_TEXT -}; - -struct msm_pcm_route_bdai_pp_params { - u16 port_id; /* AFE port ID */ - unsigned long pp_params_config; - bool mute_on; - int latency; -}; - -static struct msm_pcm_route_bdai_pp_params - msm_bedais_pp_params[MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX] = { - {HDMI_RX, 0, 0, 0}, - {DISPLAY_PORT_RX, 0, 0, 0}, -}; - -/* - * The be_dai_name_table is passed to HAL so that it can specify the - * BE ID for the BE it wants to enable based on the name. Thus there - * is a matching table and structure in HAL that need to be updated - * if any changes to these are made. - */ -struct msm_pcm_route_bdai_name { - unsigned int be_id; - char be_name[LPASS_BE_NAME_MAX_LENGTH]; -}; -static struct msm_pcm_route_bdai_name be_dai_name_table[MSM_BACKEND_DAI_MAX]; - -static int msm_routing_send_device_pp_params(int port_id, int copp_idx, - int fe_id); - -static void msm_routing_load_topology(size_t data_size, void *data); -static void msm_routing_unload_topology(uint32_t topology_id); - -static int msm_routing_get_bit_width(unsigned int format) -{ - int bit_width; - - switch (format) { - case SNDRV_PCM_FORMAT_S32_LE: - bit_width = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_width = 16; - } - return bit_width; -} - -static bool msm_is_resample_needed(int input_sr, int output_sr) -{ - bool rc = false; - - if (input_sr != output_sr) - rc = true; - - pr_debug("perform resampling (%s) for copp rate (%d)afe rate (%d)", - (rc ? "oh yes" : "not really"), - input_sr, output_sr); - - return rc; -} - -static void msm_pcm_routing_cfg_pp(int port_id, int copp_idx, int topology, - int channels) -{ - int rc = 0; - - switch (topology) { - case SRS_TRUMEDIA_TOPOLOGY_ID: - pr_debug("%s: SRS_TRUMEDIA_TOPOLOGY_ID\n", __func__); - msm_dts_srs_tm_init(port_id, copp_idx); - break; - case DS2_ADM_COPP_TOPOLOGY_ID: - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY %d\n", - __func__, DS2_ADM_COPP_TOPOLOGY_ID); - rc = msm_ds2_dap_init(port_id, copp_idx, channels, - is_custom_stereo_on); - if (rc < 0) - pr_err("%s: DS2 topo_id 0x%x, port %d, CS %d rc %d\n", - __func__, topology, port_id, - is_custom_stereo_on, rc); - break; - case DOLBY_ADM_COPP_TOPOLOGY_ID: - if (is_ds2_on) { - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY\n", __func__); - rc = msm_ds2_dap_init(port_id, copp_idx, channels, - is_custom_stereo_on); - if (rc < 0) - pr_err("%s:DS2 topo_id 0x%x, port %d, rc %d\n", - __func__, topology, port_id, rc); - } else { - pr_debug("%s: DOLBY_ADM_COPP_TOPOLOGY_ID\n", __func__); - rc = msm_dolby_dap_init(port_id, copp_idx, channels, - is_custom_stereo_on); - if (rc < 0) - pr_err("%s: DS1 topo_id 0x%x, port %d, rc %d\n", - __func__, topology, port_id, rc); - } - break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: - pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); - rc = msm_qti_pp_asphere_init(port_id, copp_idx); - if (rc < 0) - pr_err("%s: topo_id 0x%x, port %d, copp %d, rc %d\n", - __func__, topology, port_id, copp_idx, rc); - break; - default: - /* custom topology specific feature param handlers */ - break; - } -} - -static void msm_pcm_routing_deinit_pp(int port_id, int topology) -{ - switch (topology) { - case SRS_TRUMEDIA_TOPOLOGY_ID: - pr_debug("%s: SRS_TRUMEDIA_TOPOLOGY_ID\n", __func__); - msm_dts_srs_tm_deinit(port_id); - break; - case DS2_ADM_COPP_TOPOLOGY_ID: - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY_ID %d\n", - __func__, DS2_ADM_COPP_TOPOLOGY_ID); - msm_ds2_dap_deinit(port_id); - break; - case DOLBY_ADM_COPP_TOPOLOGY_ID: - if (is_ds2_on) { - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY_ID\n", __func__); - msm_ds2_dap_deinit(port_id); - } else { - pr_debug("%s: DOLBY_ADM_COPP_TOPOLOGY_ID\n", __func__); - msm_dolby_dap_deinit(port_id); - } - break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: - pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); - msm_qti_pp_asphere_deinit(port_id); - break; - default: - /* custom topology specific feature deinit handlers */ - break; - } -} - -static void msm_pcm_routng_cfg_matrix_map_pp(struct route_payload payload, - int path_type, int perf_mode) -{ - int itr = 0, rc = 0; - - if ((path_type == ADM_PATH_PLAYBACK) && - (perf_mode == LEGACY_PCM_MODE) && - is_custom_stereo_on) { - for (itr = 0; itr < payload.num_copps; itr++) { - if ((payload.port_id[itr] != SLIMBUS_0_RX) && - (payload.port_id[itr] != RT_PROXY_PORT_001_RX)) { - continue; - } - - rc = msm_qti_pp_send_stereo_to_custom_stereo_cmd( - payload.port_id[itr], - payload.copp_idx[itr], - payload.session_id, - Q14_GAIN_ZERO_POINT_FIVE, - Q14_GAIN_ZERO_POINT_FIVE, - Q14_GAIN_ZERO_POINT_FIVE, - Q14_GAIN_ZERO_POINT_FIVE); - if (rc < 0) - pr_err("%s: err setting custom stereo\n", - __func__); - } - } -} - -#define SLIMBUS_EXTPROC_RX AFE_PORT_INVALID -struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = { - { PRIMARY_I2S_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PRI_I2S_RX}, - { PRIMARY_I2S_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PRI_I2S_TX}, - { SLIMBUS_0_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_0_RX}, - { SLIMBUS_0_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_0_TX}, - { HDMI_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_HDMI}, - { INT_BT_SCO_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_BT_SCO_RX}, - { INT_BT_SCO_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_BT_SCO_TX}, - { INT_FM_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_FM_RX}, - { INT_FM_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_FM_TX}, - { RT_PROXY_PORT_001_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AFE_PCM_RX}, - { RT_PROXY_PORT_001_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AFE_PCM_TX}, - { AFE_PORT_ID_PRIMARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AUXPCM_RX}, - { AFE_PORT_ID_PRIMARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AUXPCM_TX}, - { VOICE_PLAYBACK_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VOICE_PLAYBACK_TX}, - { VOICE2_PLAYBACK_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VOICE2_PLAYBACK_TX}, - { VOICE_RECORD_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INCALL_RECORD_RX}, - { VOICE_RECORD_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INCALL_RECORD_TX}, - { MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_MI2S_RX}, - { MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_MI2S_TX}, - { SECONDARY_I2S_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SEC_I2S_RX}, - { SLIMBUS_1_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_1_RX}, - { SLIMBUS_1_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_1_TX}, - { SLIMBUS_2_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_2_RX}, - { SLIMBUS_2_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_2_TX}, - { SLIMBUS_3_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_3_RX}, - { SLIMBUS_3_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_3_TX}, - { SLIMBUS_4_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_4_RX}, - { SLIMBUS_4_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_4_TX}, - { SLIMBUS_5_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_5_RX}, - { SLIMBUS_5_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_5_TX}, - { SLIMBUS_6_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_6_RX}, - { SLIMBUS_6_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_6_TX}, - { SLIMBUS_7_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_7_RX}, - { SLIMBUS_7_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_7_TX}, - { SLIMBUS_8_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_8_RX}, - { SLIMBUS_8_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_8_TX}, - { SLIMBUS_EXTPROC_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_STUB_RX}, - { SLIMBUS_EXTPROC_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_STUB_TX}, - { SLIMBUS_EXTPROC_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_STUB_1_TX}, - { AFE_PORT_ID_QUATERNARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_MI2S_RX}, - { AFE_PORT_ID_QUATERNARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_MI2S_TX}, - { AFE_PORT_ID_SECONDARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_MI2S_RX}, - { AFE_PORT_ID_SECONDARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_MI2S_TX}, - { AFE_PORT_ID_PRIMARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_MI2S_RX}, - { AFE_PORT_ID_PRIMARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_MI2S_TX}, - { AFE_PORT_ID_TERTIARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_MI2S_RX}, - { AFE_PORT_ID_TERTIARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_MI2S_TX}, - { AUDIO_PORT_ID_I2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AUDIO_I2S_RX}, - { AFE_PORT_ID_SECONDARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_AUXPCM_RX}, - { AFE_PORT_ID_SECONDARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_AUXPCM_TX}, - { AFE_PORT_ID_PRIMARY_SPDIF_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_SPDIF_RX}, - { AFE_PORT_ID_SECONDARY_MI2S_RX_SD1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_MI2S_RX_SD1}, - { AFE_PORT_ID_QUINARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_MI2S_RX}, - { AFE_PORT_ID_QUINARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_MI2S_TX}, - { AFE_PORT_ID_SENARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SENARY_MI2S_TX}, - { AFE_PORT_ID_PRIMARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_0}, - { AFE_PORT_ID_PRIMARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_0}, - { AFE_PORT_ID_PRIMARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_1}, - { AFE_PORT_ID_PRIMARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_1}, - { AFE_PORT_ID_PRIMARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_2}, - { AFE_PORT_ID_PRIMARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_2}, - { AFE_PORT_ID_PRIMARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_3}, - { AFE_PORT_ID_PRIMARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_3}, - { AFE_PORT_ID_PRIMARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_4}, - { AFE_PORT_ID_PRIMARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_4}, - { AFE_PORT_ID_PRIMARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_5}, - { AFE_PORT_ID_PRIMARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_5}, - { AFE_PORT_ID_PRIMARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_6}, - { AFE_PORT_ID_PRIMARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_6}, - { AFE_PORT_ID_PRIMARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_7}, - { AFE_PORT_ID_PRIMARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_7}, - { AFE_PORT_ID_SECONDARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_0}, - { AFE_PORT_ID_SECONDARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_0}, - { AFE_PORT_ID_SECONDARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_1}, - { AFE_PORT_ID_SECONDARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_1}, - { AFE_PORT_ID_SECONDARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_2}, - { AFE_PORT_ID_SECONDARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_2}, - { AFE_PORT_ID_SECONDARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_3}, - { AFE_PORT_ID_SECONDARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_3}, - { AFE_PORT_ID_SECONDARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_4}, - { AFE_PORT_ID_SECONDARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_4}, - { AFE_PORT_ID_SECONDARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_5}, - { AFE_PORT_ID_SECONDARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_5}, - { AFE_PORT_ID_SECONDARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_6}, - { AFE_PORT_ID_SECONDARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_6}, - { AFE_PORT_ID_SECONDARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_7}, - { AFE_PORT_ID_SECONDARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_7}, - { AFE_PORT_ID_TERTIARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_0}, - { AFE_PORT_ID_TERTIARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_0}, - { AFE_PORT_ID_TERTIARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_1}, - { AFE_PORT_ID_TERTIARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_1}, - { AFE_PORT_ID_TERTIARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_2}, - { AFE_PORT_ID_TERTIARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_2}, - { AFE_PORT_ID_TERTIARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_3}, - { AFE_PORT_ID_TERTIARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_3}, - { AFE_PORT_ID_TERTIARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_4}, - { AFE_PORT_ID_TERTIARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_4}, - { AFE_PORT_ID_TERTIARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_5}, - { AFE_PORT_ID_TERTIARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_5}, - { AFE_PORT_ID_TERTIARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_6}, - { AFE_PORT_ID_TERTIARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_6}, - { AFE_PORT_ID_TERTIARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_7}, - { AFE_PORT_ID_TERTIARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_7}, - { AFE_PORT_ID_QUATERNARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_0}, - { AFE_PORT_ID_QUATERNARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_0}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_1}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_1}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_2}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_2}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_3}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_3}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_4}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_4}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_5}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_5}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_6}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_6}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_7}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_7}, - { AFE_PORT_ID_QUINARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_0}, - { AFE_PORT_ID_QUINARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_0}, - { AFE_PORT_ID_QUINARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_1}, - { AFE_PORT_ID_QUINARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_1}, - { AFE_PORT_ID_QUINARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_2}, - { AFE_PORT_ID_QUINARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_2}, - { AFE_PORT_ID_QUINARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_3}, - { AFE_PORT_ID_QUINARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_3}, - { AFE_PORT_ID_QUINARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_4}, - { AFE_PORT_ID_QUINARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_4}, - { AFE_PORT_ID_QUINARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_5}, - { AFE_PORT_ID_QUINARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_5}, - { AFE_PORT_ID_QUINARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_6}, - { AFE_PORT_ID_QUINARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_6}, - { AFE_PORT_ID_QUINARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_7}, - { AFE_PORT_ID_QUINARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_7}, - { AFE_PORT_ID_SENARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_0}, - { AFE_PORT_ID_SENARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_0}, - { AFE_PORT_ID_SENARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_1}, - { AFE_PORT_ID_SENARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_1}, - { AFE_PORT_ID_SENARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_2}, - { AFE_PORT_ID_SENARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_2}, - { AFE_PORT_ID_SENARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_3}, - { AFE_PORT_ID_SENARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_3}, - { AFE_PORT_ID_SENARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_4}, - { AFE_PORT_ID_SENARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_4}, - { AFE_PORT_ID_SENARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_5}, - { AFE_PORT_ID_SENARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_5}, - { AFE_PORT_ID_SENARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_6}, - { AFE_PORT_ID_SENARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_6}, - { AFE_PORT_ID_SENARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_RX_7}, - { AFE_PORT_ID_SENARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_TDM_TX_7}, - { INT_BT_A2DP_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT_BT_A2DP_RX}, - { AFE_PORT_ID_USB_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_USB_AUDIO_RX}, - { AFE_PORT_ID_USB_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_USB_AUDIO_TX}, - { DISPLAY_PORT_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_DISPLAY_PORT}, - { DISPLAY_PORT_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_DISPLAY_PORT1}, - { AFE_PORT_ID_TERTIARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_AUXPCM_RX}, - { AFE_PORT_ID_TERTIARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_AUXPCM_TX}, - { AFE_PORT_ID_QUATERNARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_AUXPCM_RX}, - { AFE_PORT_ID_QUATERNARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_AUXPCM_TX}, - { AFE_PORT_ID_QUINARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_AUXPCM_RX}, - { AFE_PORT_ID_QUINARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_AUXPCM_TX}, - { AFE_PORT_ID_INT0_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT0_MI2S_RX}, - { AFE_PORT_ID_INT0_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT0_MI2S_TX}, - { AFE_PORT_ID_INT1_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT1_MI2S_RX}, - { AFE_PORT_ID_INT1_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT1_MI2S_TX}, - { AFE_PORT_ID_INT2_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT2_MI2S_RX}, - { AFE_PORT_ID_INT2_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT2_MI2S_TX}, - { AFE_PORT_ID_INT3_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT3_MI2S_RX}, - { AFE_PORT_ID_INT3_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT3_MI2S_TX}, - { AFE_PORT_ID_INT4_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT4_MI2S_RX}, - { AFE_PORT_ID_INT4_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT4_MI2S_TX}, - { AFE_PORT_ID_INT5_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT5_MI2S_RX}, - { AFE_PORT_ID_INT5_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT5_MI2S_TX}, - { AFE_PORT_ID_INT6_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT6_MI2S_RX}, - { AFE_PORT_ID_INT6_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT6_MI2S_TX}, - { AFE_PORT_ID_SENARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_AUXPCM_RX}, - { AFE_PORT_ID_SENARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_AUXPCM_TX}, - { AFE_PORT_ID_SENARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SENARY_MI2S_RX}, - { AFE_PORT_ID_WSA_CODEC_DMA_RX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_RX_0}, - { AFE_PORT_ID_WSA_CODEC_DMA_TX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_TX_0}, - { AFE_PORT_ID_WSA_CODEC_DMA_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_RX_1}, - { AFE_PORT_ID_WSA_CODEC_DMA_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_TX_1}, - { AFE_PORT_ID_WSA_CODEC_DMA_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_TX_2}, - { AFE_PORT_ID_VA_CODEC_DMA_TX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VA_CDC_DMA_TX_0}, - { AFE_PORT_ID_VA_CODEC_DMA_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VA_CDC_DMA_TX_1}, - { AFE_PORT_ID_VA_CODEC_DMA_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VA_CDC_DMA_TX_2}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_0}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_0}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_1}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_1}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_2}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_2}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_3}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_3}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_4}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_4}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_5}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_5}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_6}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_7}, - { AFE_PORT_ID_PRIMARY_SPDIF_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_SPDIF_TX}, - { AFE_PORT_ID_SECONDARY_SPDIF_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_SPDIF_RX}, - { AFE_PORT_ID_SECONDARY_SPDIF_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_SPDIF_TX}, - { SLIMBUS_9_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_9_RX}, - { SLIMBUS_9_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_9_TX}, - { AFE_LOOPBACK_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_AFE_LOOPBACK_TX}, - { AFE_PORT_ID_PRIMARY_META_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_META_MI2S_RX}, - { AFE_PORT_ID_SECONDARY_META_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_META_MI2S_RX}, - { RT_PROXY_PORT_002_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_RX}, - { RT_PROXY_PORT_002_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_TX}, -}; - -/* Track ASM playback & capture sessions of DAI - * Track LSM listen sessions - */ -static struct msm_pcm_routing_fdai_data - fe_dai_map[MSM_FRONTEND_DAI_MAX][2] = { - /* MULTIMEDIA1 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA2 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA3 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA4 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA5 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA6 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA7*/ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA8 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA9 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA10 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA11 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA12 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA13 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA14 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA15 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA16 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA17 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA18 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA19 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA20 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA21 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA22 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA23 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA26 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA27 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA28 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA29 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA30 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOIP */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* AFE_RX */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* AFE_TX */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICE_STUB */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* DTMF_RX */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* QCHAT */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOLTE_STUB */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM1 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM2 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM3 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM4 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM5 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM6 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM7 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM8 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICE2_STUB */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICEMMODE1 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICEMMODE2 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, -}; - -static unsigned long session_copp_map[MSM_FRONTEND_DAI_MAX][2] - [MSM_BACKEND_DAI_MAX]; -static struct msm_pcm_routing_app_type_data app_type_cfg[MAX_APP_TYPES]; -static struct msm_pcm_routing_app_type_data lsm_app_type_cfg[MAX_APP_TYPES]; -static struct msm_pcm_stream_app_type_cfg - fe_dai_app_type_cfg[MSM_FRONTEND_DAI_MAX][2][MSM_BACKEND_DAI_MAX]; - -static int last_be_id_configured[MSM_FRONTEND_DAI_MAX][MAX_SESSION_TYPES]; - -/* The caller of this should acquire routing lock */ -void msm_pcm_routing_get_bedai_info(int be_idx, - struct msm_pcm_routing_bdai_data *be_dai) -{ - if (be_idx >= 0 && be_idx < MSM_BACKEND_DAI_MAX) - memcpy(be_dai, &msm_bedais[be_idx], - sizeof(struct msm_pcm_routing_bdai_data)); -} - -/* The caller of this should acquire routing lock */ -void msm_pcm_routing_get_fedai_info(int fe_idx, int sess_type, - struct msm_pcm_routing_fdai_data *fe_dai) -{ - if ((sess_type == SESSION_TYPE_TX) || (sess_type == SESSION_TYPE_RX)) - memcpy(fe_dai, &fe_dai_map[fe_idx][sess_type], - sizeof(struct msm_pcm_routing_fdai_data)); -} - -void msm_pcm_routing_acquire_lock(void) -{ - mutex_lock(&routing_lock); -} - -void msm_pcm_routing_release_lock(void) -{ - mutex_unlock(&routing_lock); -} - -static int msm_pcm_routing_get_app_type_idx(int app_type) -{ - int idx; - - pr_debug("%s: app_type: %d\n", __func__, app_type); - for (idx = 0; idx < MAX_APP_TYPES; idx++) { - if (app_type_cfg[idx].app_type == app_type) - return idx; - } - pr_info("%s: App type not available, fallback to default\n", __func__); - return 0; -} - -static int msm_pcm_routing_get_lsm_app_type_idx(int app_type) -{ - int idx; - - pr_debug("%s: app_type: %d\n", __func__, app_type); - for (idx = 0; idx < MAX_APP_TYPES; idx++) { - if (lsm_app_type_cfg[idx].app_type == app_type) - return idx; - } - pr_debug("%s: App type not available, fallback to default\n", __func__); - return 0; -} - -static int get_port_id(int port_id) -{ - int ret = port_id; - - if (port_id == AFE_LOOPBACK_TX) { - /* - * Return afe_loopback_tx_port_id if set. Else return - * msm_ec_ref_port_id to maintain backward compatibility. - */ - if (afe_loopback_tx_port_id != -1) - ret = afe_loopback_tx_port_id; - else - ret = msm_ec_ref_port_id; - } - - return ret; -} - -static bool is_mm_lsm_fe_id(int fe_id) -{ - bool rc = true; - - if (fe_id > MSM_FRONTEND_DAI_MM_MAX_ID && - ((fe_id < MSM_FRONTEND_DAI_LSM1) || - (fe_id > MSM_FRONTEND_DAI_LSM8))) { - rc = false; - } - return rc; -} - -/* - * msm_pcm_routing_send_chmix_cfg: - * send the channel mixer command to mix the input channels - * into output channels. - * - * @fe_id: front end id - * @ip_channel_cnt: input channel count - * @op_channel_cnt: output channel count - * @ch_wght_coeff: channel weight co-efficients for channel mixing - * @session_type: indicates session is of type TX or RX - * @stream_type: indicates either Audio or Listen stream type - */ -int msm_pcm_routing_send_chmix_cfg(int fe_id, int ip_channel_cnt, - int op_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type) -{ - - int rc = 0, idx = 0; - int be_index = 0, port_id; - unsigned int session_id = 0; - - pr_debug("%s:fe_id[%d] ip_ch[%d] op_ch[%d] sess_type [%d], stream_type[%d]", - __func__, fe_id, ip_channel_cnt, op_channel_cnt, session_type, - stream_type); - if (!is_mm_lsm_fe_id(fe_id)) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID %d\n", __func__, fe_id); - return -EINVAL; - } - - if (ch_wght_coeff == NULL) { - pr_err("%s: Null channel weightage coefficients passed\n", - __func__); - return -EINVAL; - } - - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - port_id = msm_bedais[be_index].port_id; - if (!msm_bedais[be_index].active || - !test_bit(fe_id, &msm_bedais[be_index].fe_sessions[0])) - continue; - - session_id = fe_dai_map[fe_id][session_type].strm_id; - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - unsigned long copp = - session_copp_map[fe_id][session_type][be_index]; - if (!test_bit(idx, &copp)) - continue; - msm_qti_pp_send_chmix_cfg_cmd(port_id, idx, - session_id, ip_channel_cnt, - op_channel_cnt, ch_wght_coeff, - session_type, stream_type); - if (rc < 0) - pr_err("%s: err setting channel mix config\n", - __func__); - } - } - - return 0; -} -EXPORT_SYMBOL(msm_pcm_routing_send_chmix_cfg); - -/** - * msm_pcm_routing_set_channel_mixer_cfg - cache channel mixer - * setting before use case start. - * - * @fe_id: frontend idx - * @type: stream direction type - * @params: parameters of channel mixer setting - * - * Return 0 for success - */ -int msm_pcm_routing_set_channel_mixer_cfg( - int fe_id, int type, - struct msm_pcm_channel_mixer *params) -{ - int i, j = 0; - - channel_mixer_v2[fe_id][type].enable = params->enable; - channel_mixer_v2[fe_id][type].rule = params->rule; - channel_mixer_v2[fe_id][type].input_channel = - params->input_channel; - channel_mixer_v2[fe_id][type].output_channel = - params->output_channel; - channel_mixer_v2[fe_id][type].port_idx = params->port_idx; - - for (i = 0; i < ADM_MAX_CHANNELS; i++) - channel_mixer_v2[fe_id][type].in_ch_map[i] = - params->in_ch_map[i]; - for (i = 0; i < ADM_MAX_CHANNELS; i++) - channel_mixer_v2[fe_id][type].out_ch_map[i] = - params->out_ch_map[i]; - - for (i = 0; i < ADM_MAX_CHANNELS; i++) - for (j = 0; j < ADM_MAX_CHANNELS; j++) - channel_mixer_v2[fe_id][type].channel_weight[i][j] = - params->channel_weight[i][j]; - - channel_mixer_v2[fe_id][type].override_in_ch_map = - params->override_in_ch_map; - channel_mixer_v2[fe_id][type].override_out_ch_map = - params->override_out_ch_map; - - return 0; -} -EXPORT_SYMBOL(msm_pcm_routing_set_channel_mixer_cfg); - -int msm_pcm_routing_reg_stream_app_type_cfg( - int fedai_id, int session_type, int be_id, - struct msm_pcm_stream_app_type_cfg *cfg_data) -{ - int ret = 0; - - if (cfg_data == NULL) { - pr_err("%s: Received NULL pointer for cfg_data\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fedai_id, session_type, be_id, - cfg_data->app_type, cfg_data->acdb_dev_id, - cfg_data->sample_rate); - - if (!is_mm_lsm_fe_id(fedai_id)) { - pr_err("%s: Invalid machine driver ID %d\n", - __func__, fedai_id); - ret = -EINVAL; - goto done; - } - if (session_type != SESSION_TYPE_RX && - session_type != SESSION_TYPE_TX) { - pr_err("%s: Invalid session type %d\n", - __func__, session_type); - ret = -EINVAL; - goto done; - } - if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Received out of bounds be_id %d\n", - __func__, be_id); - ret = -EINVAL; - goto done; - } - - fe_dai_app_type_cfg[fedai_id][session_type][be_id] = *cfg_data; - - /* - * Store the BE ID of the configuration information set as the latest so - * the get mixer control knows what to return. - */ - last_be_id_configured[fedai_id][session_type] = be_id; - -done: - return ret; -} -EXPORT_SYMBOL(msm_pcm_routing_reg_stream_app_type_cfg); - -/** - * msm_pcm_routing_get_stream_app_type_cfg - * - * Receives fedai_id, session_type, be_id, and populates app_type, - * acdb_dev_id, & sample rate. Returns 0 on success. On failure returns - * -EINVAL and does not alter passed values. - * - * fedai_id - Passed value, front end ID for which app type config is wanted - * session_type - Passed value, session type for which app type config - * is wanted - * be_id - Returned value, back end device id the app type config data is for - * cfg_data - Returned value, configuration data used by app type config - */ -int msm_pcm_routing_get_stream_app_type_cfg( - int fedai_id, int session_type, int *bedai_id, - struct msm_pcm_stream_app_type_cfg *cfg_data) -{ - int be_id; - int ret = 0; - - if (bedai_id == NULL) { - pr_err("%s: Received NULL pointer for backend ID\n", __func__); - ret = -EINVAL; - goto done; - } else if (cfg_data == NULL) { - pr_err("%s: NULL pointer sent for cfg_data\n", __func__); - ret = -EINVAL; - goto done; - } else if (!is_mm_lsm_fe_id(fedai_id)) { - pr_err("%s: Invalid FE ID %d\n", __func__, fedai_id); - ret = -EINVAL; - goto done; - } else if (session_type != SESSION_TYPE_RX && - session_type != SESSION_TYPE_TX) { - pr_err("%s: Invalid session type %d\n", __func__, session_type); - ret = -EINVAL; - goto done; - } - - be_id = last_be_id_configured[fedai_id][session_type]; - if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Invalid BE ID %d\n", __func__, be_id); - ret = -EINVAL; - goto done; - } - - *bedai_id = be_id; - *cfg_data = fe_dai_app_type_cfg[fedai_id][session_type][be_id]; - pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fedai_id, session_type, *bedai_id, - cfg_data->app_type, cfg_data->acdb_dev_id, - cfg_data->sample_rate); -done: - return ret; -} -EXPORT_SYMBOL(msm_pcm_routing_get_stream_app_type_cfg); - -static struct cal_block_data *msm_routing_find_topology_by_path(int path, - int cal_index) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (((struct audio_cal_info_adm_top *)cal_block - ->cal_info)->path == path) { - return cal_block; - } - } - pr_debug("%s: Can't find topology for path %d\n", __func__, path); - return NULL; -} - -static struct cal_block_data *msm_routing_find_topology(int path, - int app_type, - int acdb_id, - int cal_index, - bool exact) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_adm_top *cal_info; - - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - cal_info = (struct audio_cal_info_adm_top *) - cal_block->cal_info; - if ((cal_info->path == path) && - (cal_info->app_type == app_type) && - (cal_info->acdb_id == acdb_id)) { - return cal_block; - } - } - pr_debug("%s: Can't find topology for path %d, app %d, " - "acdb_id %d %s\n", __func__, path, app_type, acdb_id, - exact ? "fail" : "defaulting to search by path"); - return exact ? NULL : msm_routing_find_topology_by_path(path, - cal_index); -} - -static int msm_routing_find_topology_on_index(int session_type, int app_type, - int acdb_dev_id, int idx, - bool exact) -{ - int topology = -EINVAL; - struct cal_block_data *cal_block = NULL; - - mutex_lock(&cal_data[idx]->lock); - cal_block = msm_routing_find_topology(session_type, app_type, - acdb_dev_id, idx, exact); - if (cal_block != NULL) { - topology = ((struct audio_cal_info_adm_top *) - cal_block->cal_info)->topology; - } - mutex_unlock(&cal_data[idx]->lock); - return topology; -} - -/* - * Retrieving cal_block will mark cal_block as stale. - * Hence it cannot be reused or resent unless the flag - * is reset. - */ -static int msm_routing_get_adm_topology(int fedai_id, int session_type, - int be_id) -{ - int topology = NULL_COPP_TOPOLOGY; - int app_type = 0, acdb_dev_id = 0; - - pr_debug("%s: fedai_id %d, session_type %d, be_id %d\n", - __func__, fedai_id, session_type, be_id); - - if (cal_data == NULL) - goto done; - - app_type = fe_dai_app_type_cfg[fedai_id][session_type][be_id].app_type; - acdb_dev_id = - fe_dai_app_type_cfg[fedai_id][session_type][be_id].acdb_dev_id; - - pr_debug("%s: Check for exact LSM topology\n", __func__); - topology = msm_routing_find_topology_on_index(session_type, - app_type, - acdb_dev_id, - ADM_LSM_TOPOLOGY_CAL_TYPE_IDX, - true /*exact*/); - if (topology < 0) { - pr_debug("%s: Check for compatible topology\n", __func__); - topology = msm_routing_find_topology_on_index(session_type, - app_type, - acdb_dev_id, - ADM_TOPOLOGY_CAL_TYPE_IDX, - false /*exact*/); - if (topology < 0) - topology = NULL_COPP_TOPOLOGY; - } -done: - pr_debug("%s: Using topology %d\n", __func__, topology); - return topology; -} - -static uint8_t is_be_dai_extproc(int be_dai) -{ - if (be_dai == MSM_BACKEND_DAI_EXTPROC_RX || - be_dai == MSM_BACKEND_DAI_EXTPROC_TX || - be_dai == MSM_BACKEND_DAI_EXTPROC_EC_TX) - return 1; - else - return 0; -} - -static void msm_pcm_routing_build_matrix(int fedai_id, int sess_type, - int path_type, int perf_mode, - uint32_t passthr_mode) -{ - int i, port_type, j, num_copps = 0; - struct route_payload payload; - - port_type = ((path_type == ADM_PATH_PLAYBACK || - path_type == ADM_PATH_COMPRESSED_RX) ? - MSM_AFE_PORT_TYPE_RX : MSM_AFE_PORT_TYPE_TX); - - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - int port_id = get_port_id(msm_bedais[i].port_id); - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - unsigned long copp = - session_copp_map[fedai_id][sess_type][i]; - if (test_bit(j, &copp)) { - payload.port_id[num_copps] = port_id; - payload.copp_idx[num_copps] = j; - payload.app_type[num_copps] = - fe_dai_app_type_cfg - [fedai_id][sess_type][i] - .app_type; - payload.acdb_dev_id[num_copps] = - fe_dai_app_type_cfg - [fedai_id][sess_type][i] - .acdb_dev_id; - payload.sample_rate[num_copps] = - fe_dai_app_type_cfg - [fedai_id][sess_type][i] - .sample_rate; - num_copps++; - } - } - } - } - - if (num_copps) { - payload.num_copps = num_copps; - payload.session_id = fe_dai_map[fedai_id][sess_type].strm_id; - adm_matrix_map(path_type, payload, perf_mode, passthr_mode); - msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode); - } -} - -void msm_pcm_routing_reg_psthr_stream(int fedai_id, int dspst_id, - int stream_type) -{ - int i, session_type, path_type, port_type; - u32 mode = 0; - - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID\n", __func__); - return; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - session_type = SESSION_TYPE_RX; - path_type = ADM_PATH_PLAYBACK; - port_type = MSM_AFE_PORT_TYPE_RX; - } else { - session_type = SESSION_TYPE_TX; - path_type = ADM_PATH_LIVE_REC; - port_type = MSM_AFE_PORT_TYPE_TX; - } - - mutex_lock(&routing_lock); - - fe_dai_map[fedai_id][session_type].strm_id = dspst_id; - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - mode = afe_get_port_type(msm_bedais[i].port_id); - adm_connect_afe_port(mode, dspst_id, - msm_bedais[i].port_id); - break; - } - } - mutex_unlock(&routing_lock); -} - -static bool route_check_fe_id_adm_support(int fe_id) -{ - bool rc = true; - - if ((fe_id >= MSM_FRONTEND_DAI_LSM1) && - (fe_id <= MSM_FRONTEND_DAI_LSM8)) { - /* fe id is listen while port is set to afe */ - if (lsm_port_index[fe_id - MSM_FRONTEND_DAI_LSM1] != - ADM_LSM_PORT_INDEX) { - pr_debug("%s: fe_id %d, lsm mux slim port %d\n", - __func__, fe_id, - lsm_port_index[fe_id - MSM_FRONTEND_DAI_LSM1]); - rc = false; - } - } - - return rc; -} - -/* - * msm_pcm_routing_get_pp_ch_cnt: - * Read the processed channel count - * - * @fe_id: Front end ID - * @session_type: Inidicates RX or TX session type - */ -int msm_pcm_routing_get_pp_ch_cnt(int fe_id, int session_type) -{ - struct msm_pcm_stream_app_type_cfg cfg_data; - int be_id = 0, app_type_idx = 0, app_type = 0; - int ret = -EINVAL; - - memset(&cfg_data, 0, sizeof(cfg_data)); - - if (!is_mm_lsm_fe_id(fe_id)) { - pr_err("%s: bad MM ID\n", __func__); - return -EINVAL; - } - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret) { - pr_err("%s: cannot get stream app type cfg\n", __func__); - return ret; - } - - app_type = cfg_data.app_type; - app_type_idx = msm_pcm_routing_get_lsm_app_type_idx(app_type); - return lsm_app_type_cfg[app_type_idx].num_out_channels; -} -EXPORT_SYMBOL(msm_pcm_routing_get_pp_ch_cnt); - -int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode, - int dspst_id, int stream_type, - uint32_t passthr_mode) -{ - int i, j, session_type, path_type, port_type, topology; - int num_copps = 0; - struct route_payload payload; - u32 channels, sample_rate; - u16 bit_width = 16, be_bit_width; - bool is_lsm; - - pr_debug("%s:fe_id[%d] perf_mode[%d] id[%d] stream_type[%d] passt[%d]", - __func__, fe_id, perf_mode, dspst_id, - stream_type, passthr_mode); - if (!is_mm_lsm_fe_id(fe_id)) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID %d\n", __func__, fe_id); - return -EINVAL; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - session_type = SESSION_TYPE_RX; - if (passthr_mode != LEGACY_PCM) - path_type = ADM_PATH_COMPRESSED_RX; - else - path_type = ADM_PATH_PLAYBACK; - port_type = MSM_AFE_PORT_TYPE_RX; - } else if (stream_type == SNDRV_PCM_STREAM_CAPTURE) { - session_type = SESSION_TYPE_TX; - if ((passthr_mode != LEGACY_PCM) && (passthr_mode != LISTEN)) - path_type = ADM_PATH_COMPRESSED_TX; - else - path_type = ADM_PATH_LIVE_REC; - port_type = MSM_AFE_PORT_TYPE_TX; - } else { - pr_err("%s: invalid stream type %d\n", __func__, stream_type); - return -EINVAL; - } - - is_lsm = (fe_id >= MSM_FRONTEND_DAI_LSM1) && - (fe_id <= MSM_FRONTEND_DAI_LSM8); - mutex_lock(&routing_lock); - - fe_dai_map[fe_id][session_type].strm_id = dspst_id; - fe_dai_map[fe_id][session_type].perf_mode = perf_mode; - fe_dai_map[fe_id][session_type].passthr_mode = passthr_mode; - if (!route_check_fe_id_adm_support(fe_id)) { - /* ignore adm open if not supported for fe_id */ - pr_debug("%s: No ADM support for fe id %d\n", __func__, fe_id); - mutex_unlock(&routing_lock); - return 0; - } - - payload.num_copps = 0; /* only RX needs to use payload */ - /* re-enable EQ if active */ - msm_qti_pp_send_eq_values(fe_id); - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == - port_type) && - (msm_bedais[i].active) && - (test_bit(fe_id, &msm_bedais[i].fe_sessions[0]))) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - int port_id = get_port_id(msm_bedais[i].port_id); - - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!msm_bedais[i].adm_override_ch) - channels = msm_bedais[i].channel; - else - channels = msm_bedais[i].adm_override_ch; - - bit_width = msm_routing_get_bit_width( - msm_bedais[i].format); - app_type = - fe_dai_app_type_cfg[fe_id][session_type][i].app_type; - if (app_type && is_lsm) { - app_type_idx = - msm_pcm_routing_get_lsm_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[fe_id][session_type][i] - .sample_rate; - bit_width = - lsm_app_type_cfg[app_type_idx].bit_width; - } else if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx( - app_type); - sample_rate = - fe_dai_app_type_cfg[fe_id][session_type][i].sample_rate; - bit_width = - app_type_cfg[app_type_idx].bit_width; - } else { - sample_rate = msm_bedais[i].sample_rate; - } - acdb_dev_id = - fe_dai_app_type_cfg[fe_id][session_type][i].acdb_dev_id; - topology = msm_routing_get_adm_topology(fe_id, - session_type, - i); - if ((passthr_mode == COMPRESSED_PASSTHROUGH_DSD) - || (passthr_mode == - COMPRESSED_PASSTHROUGH_GEN) - || (passthr_mode == - COMPRESSED_PASSTHROUGH_IEC61937)) - topology = COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY; - pr_debug("%s: Before adm open topology %d\n", __func__, - topology); - - be_bit_width = msm_routing_get_bit_width( - msm_bedais[i].format); - if (hifi_filter_enabled && (msm_bedais[i].sample_rate - == 384000 || msm_bedais[i].sample_rate == - 352800) && be_bit_width == 32) - bit_width = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - - copp_idx = - adm_open(port_id, path_type, sample_rate, - channels, topology, perf_mode, - bit_width, app_type, acdb_dev_id, - session_type); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s:adm open failed coppid:%d\n", - __func__, copp_idx); - mutex_unlock(&routing_lock); - return -EINVAL; - } - pr_debug("%s: set idx bit of fe:%d, type: %d, be:%d\n", - __func__, fe_id, session_type, i); - set_bit(copp_idx, - &session_copp_map[fe_id][session_type][i]); - - if (msm_is_resample_needed( - sample_rate, - msm_bedais[i].sample_rate)) - adm_copp_mfc_cfg(port_id, copp_idx, - msm_bedais[i].sample_rate); - - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - unsigned long copp = - session_copp_map[fe_id][session_type][i]; - if (test_bit(j, &copp)) { - payload.port_id[num_copps] = port_id; - payload.copp_idx[num_copps] = j; - payload.app_type[num_copps] = - fe_dai_app_type_cfg - [fe_id][session_type][i] - .app_type; - payload.acdb_dev_id[num_copps] = - fe_dai_app_type_cfg - [fe_id][session_type][i] - .acdb_dev_id; - payload.sample_rate[num_copps] = - fe_dai_app_type_cfg - [fe_id][session_type][i] - .sample_rate; - num_copps++; - } - } - if (passthr_mode != COMPRESSED_PASSTHROUGH_DSD - && passthr_mode != COMPRESSED_PASSTHROUGH_GEN - && passthr_mode != COMPRESSED_PASSTHROUGH_IEC61937) - msm_routing_send_device_pp_params(port_id, - copp_idx, fe_id); - } - } - if (num_copps) { - payload.num_copps = num_copps; - payload.session_id = fe_dai_map[fe_id][session_type].strm_id; - adm_matrix_map(path_type, payload, perf_mode, passthr_mode); - msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode); - } - mutex_unlock(&routing_lock); - return 0; -} - -static u32 msm_pcm_routing_get_voc_sessionid(u16 val) -{ - u32 session_id; - - switch (val) { - case MSM_FRONTEND_DAI_QCHAT: - session_id = voc_get_session_id(QCHAT_SESSION_NAME); - break; - case MSM_FRONTEND_DAI_VOIP: - session_id = voc_get_session_id(VOIP_SESSION_NAME); - break; - case MSM_FRONTEND_DAI_VOICEMMODE1: - session_id = voc_get_session_id(VOICEMMODE1_NAME); - break; - case MSM_FRONTEND_DAI_VOICEMMODE2: - session_id = voc_get_session_id(VOICEMMODE2_NAME); - break; - default: - session_id = 0; - } - - pr_debug("%s session_id 0x%x", __func__, session_id); - return session_id; -} - -static int msm_pcm_routing_channel_mixer_v2(int fe_id, bool perf_mode, - int dspst_id, int stream_type) -{ - int copp_idx = 0; - int sess_type = 0; - int j = 0, be_id = 0; - int ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return 0; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) - sess_type = SESSION_TYPE_RX; - else - sess_type = SESSION_TYPE_TX; - - if (!(channel_mixer_v2[fe_id][sess_type].enable)) { - pr_debug("%s: channel mixer not enabled for FE %d direction %d\n", - __func__, fe_id, sess_type); - return 0; - } - - be_id = channel_mixer_v2[fe_id][sess_type].port_idx - 1; - channel_mixer_v2[fe_id][sess_type].input_channels[0] = - channel_mixer_v2[fe_id][sess_type].input_channel; - - pr_debug("%s sess type %d,fe_id %d,override in:%d out:%d,be active %d\n", - __func__, sess_type, fe_id, - channel_mixer_v2[fe_id][sess_type].override_in_ch_map, - channel_mixer_v2[fe_id][sess_type].override_out_ch_map, - msm_bedais[be_id].active); - - if ((msm_bedais[be_id].active) && - test_bit(fe_id, &msm_bedais[be_id].fe_sessions[0])) { - unsigned long copp = - session_copp_map[fe_id][sess_type][be_id]; - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - if (test_bit(j, &copp)) { - copp_idx = j; - break; - } - } - - ret = adm_programable_channel_mixer( - msm_bedais[be_id].port_id, - copp_idx, dspst_id, sess_type, - &channel_mixer_v2[fe_id][sess_type], 0); - } - - return ret; -} - -static int msm_pcm_routing_channel_mixer(int fe_id, bool perf_mode, - int dspst_id, int stream_type) -{ - int copp_idx = 0; - int sess_type = 0; - int i = 0, j = 0, be_id; - int ret = 0; - - ret = msm_pcm_routing_channel_mixer_v2(fe_id, perf_mode, - dspst_id, stream_type); - if (ret) { - pr_err("%s channel mixer v2 cmd set failure%d\n", __func__, - fe_id); - return ret; - } - - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return 0; - } - - if (!(channel_mixer[fe_id].enable)) { - pr_debug("%s: channel mixer not enabled for FE %d\n", - __func__, fe_id); - return 0; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) - sess_type = SESSION_TYPE_RX; - else - sess_type = SESSION_TYPE_TX; - - for (i = 0; i < ADM_MAX_CHANNELS && channel_input[fe_id][i] > 0; - ++i) { - be_id = channel_input[fe_id][i] - 1; - channel_mixer[fe_id].input_channels[i] = - msm_bedais[be_id].channel; - - if ((msm_bedais[be_id].active) && - test_bit(fe_id, - &msm_bedais[be_id].fe_sessions[0])) { - unsigned long copp = - session_copp_map[fe_id][sess_type][be_id]; - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - if (test_bit(j, &copp)) { - copp_idx = j; - break; - } - } - - pr_debug("%s: fe %d, be %d, channel %d, copp %d\n", - __func__, - fe_id, be_id, msm_bedais[be_id].channel, - copp_idx); - ret = adm_programable_channel_mixer( - get_port_id(msm_bedais[be_id].port_id), - copp_idx, dspst_id, sess_type, - channel_mixer + fe_id, i); - } - } - - return ret; -} - -/** - * msm_pcm_routing_set_channel_mixer_runtime - apply channel mixer - * setting during runtime. - * - * @be_id: backend index - * @session_id: session index - * @session_type: session type - * @params: parameters for channel mixer - * - * Retuen: 0 for success, else error - */ -int msm_pcm_routing_set_channel_mixer_runtime(int be_id, int session_id, - int session_type, - struct msm_pcm_channel_mixer *params) -{ - int rc = 0; - int port_id, copp_idx = 0; - - be_id--; - if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: invalid backend id %d\n", __func__, - be_id); - return -EINVAL; - } - - port_id = msm_bedais[be_id].port_id; - copp_idx = adm_get_default_copp_idx(port_id); - pr_debug("%s: port_id - %d, copp_idx %d session id - %d\n", - __func__, port_id, copp_idx, session_id); - - if ((params->input_channel < 0) || - (params->input_channel > ADM_MAX_CHANNELS)) { - pr_err("%s: invalid input channel %d\n", __func__, - params->input_channel); - return -EINVAL; - } - - if ((params->output_channel < 0) || - (params->output_channel > ADM_MAX_CHANNELS)) { - pr_err("%s: invalid output channel %d\n", __func__, - params->output_channel); - return -EINVAL; - } - - params->input_channels[0] = params->input_channel; - - pr_debug("%s sess type %d,override in:%d out:%d,be active %d\n", - __func__, session_type, - params->override_in_ch_map, - params->override_out_ch_map, - msm_bedais[be_id].active); - - rc = adm_programable_channel_mixer(port_id, - copp_idx, - session_id, - session_type, - params, - 0); - if (rc) { - pr_err("%s: send params failed rc=%d\n", __func__, rc); - rc = -EINVAL; - } - return rc; -} -EXPORT_SYMBOL(msm_pcm_routing_set_channel_mixer_runtime); - -int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, - int dspst_id, int stream_type) -{ - int i, j, session_type, path_type, port_type, topology, num_copps = 0; - struct route_payload payload; - u32 channels, sample_rate; - uint16_t bits_per_sample = 16, be_bit_width; - uint32_t passthr_mode = LEGACY_PCM; - int ret = 0; - - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID %d\n", __func__, fedai_id); - return -EINVAL; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - session_type = SESSION_TYPE_RX; - path_type = ADM_PATH_PLAYBACK; - port_type = MSM_AFE_PORT_TYPE_RX; - } else { - session_type = SESSION_TYPE_TX; - path_type = ADM_PATH_LIVE_REC; - port_type = MSM_AFE_PORT_TYPE_TX; - } - - mutex_lock(&routing_lock); - - payload.num_copps = 0; /* only RX needs to use payload */ - fe_dai_map[fedai_id][session_type].strm_id = dspst_id; - fe_dai_map[fedai_id][session_type].perf_mode = perf_mode; - fe_dai_map[fedai_id][session_type].passthr_mode = LEGACY_PCM; - - /* re-enable EQ if active */ - msm_qti_pp_send_eq_values(fedai_id); - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - int port_id = get_port_id(msm_bedais[i].port_id); - - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!msm_bedais[i].adm_override_ch) - channels = msm_bedais[i].channel; - else - channels = msm_bedais[i].adm_override_ch; - - bits_per_sample = msm_routing_get_bit_width( - msm_bedais[i].format); - - app_type = - fe_dai_app_type_cfg[fedai_id][session_type][i].app_type; - if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[fedai_id][session_type][i] - .sample_rate; - bits_per_sample = - app_type_cfg[app_type_idx].bit_width; - } else - sample_rate = msm_bedais[i].sample_rate; - - acdb_dev_id = - fe_dai_app_type_cfg[fedai_id][session_type][i] - .acdb_dev_id; - topology = msm_routing_get_adm_topology(fedai_id, - session_type, - i); - be_bit_width = msm_routing_get_bit_width( - msm_bedais[i].format); - - if (hifi_filter_enabled && (msm_bedais[i].sample_rate == - 384000 ||msm_bedais[i].sample_rate == 352800) - && be_bit_width == 32) - bits_per_sample = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - copp_idx = adm_open(port_id, path_type, - sample_rate, channels, topology, - perf_mode, bits_per_sample, - app_type, acdb_dev_id, - session_type); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: adm open failed copp_idx:%d\n", - __func__, copp_idx); - mutex_unlock(&routing_lock); - return -EINVAL; - } - pr_debug("%s: setting idx bit of fe:%d, type: %d, be:%d\n", - __func__, fedai_id, session_type, i); - set_bit(copp_idx, - &session_copp_map[fedai_id][session_type][i]); - - if (msm_is_resample_needed( - sample_rate, - msm_bedais[i].sample_rate)) - adm_copp_mfc_cfg(port_id, copp_idx, - msm_bedais[i].sample_rate); - - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - unsigned long copp = - session_copp_map[fedai_id][session_type][i]; - if (test_bit(j, &copp)) { - payload.port_id[num_copps] = port_id; - payload.copp_idx[num_copps] = j; - payload.app_type[num_copps] = - fe_dai_app_type_cfg - [fedai_id][session_type] - [i].app_type; - payload.acdb_dev_id[num_copps] = - fe_dai_app_type_cfg - [fedai_id][session_type] - [i].acdb_dev_id; - payload.sample_rate[num_copps] = - fe_dai_app_type_cfg - [fedai_id][session_type] - [i].sample_rate; - num_copps++; - } - } - if (perf_mode == LEGACY_PCM_MODE) - msm_pcm_routing_cfg_pp(port_id, copp_idx, - topology, channels); - } - } - if (num_copps) { - payload.num_copps = num_copps; - payload.session_id = fe_dai_map[fedai_id][session_type].strm_id; - adm_matrix_map(path_type, payload, perf_mode, passthr_mode); - msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode); - } - - ret = msm_pcm_routing_channel_mixer(fedai_id, perf_mode, - dspst_id, stream_type); - mutex_unlock(&routing_lock); - return ret; -} - -int msm_pcm_routing_reg_phy_stream_v2(int fedai_id, int perf_mode, - int dspst_id, int stream_type, - struct msm_pcm_routing_evt event_info) -{ - if (msm_pcm_routing_reg_phy_stream(fedai_id, perf_mode, dspst_id, - stream_type)) { - pr_err("%s: failed to reg phy stream\n", __func__); - return -EINVAL; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) - fe_dai_map[fedai_id][SESSION_TYPE_RX].event_info = event_info; - else - fe_dai_map[fedai_id][SESSION_TYPE_TX].event_info = event_info; - return 0; -} - -void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type) -{ - int i, port_type, session_type, path_type, topology, port_id; - struct msm_pcm_routing_fdai_data *fdai; - - if (!is_mm_lsm_fe_id(fedai_id)) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID\n", __func__); - return; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - port_type = MSM_AFE_PORT_TYPE_RX; - session_type = SESSION_TYPE_RX; - path_type = ADM_PATH_PLAYBACK; - } else { - port_type = MSM_AFE_PORT_TYPE_TX; - session_type = SESSION_TYPE_TX; - path_type = ADM_PATH_LIVE_REC; - } - - mutex_lock(&routing_lock); - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - int idx; - unsigned long copp = - session_copp_map[fedai_id][session_type][i]; - fdai = &fe_dai_map[fedai_id][session_type]; - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (test_bit(idx, &copp)) - break; - - if (idx >= MAX_COPPS_PER_PORT || idx < 0) { - pr_debug("%s: copp idx is invalid, exiting\n", - __func__); - continue; - } - port_id = get_port_id(msm_bedais[i].port_id); - topology = adm_get_topology_for_port_copp_idx( - port_id, idx); - msm_routing_unload_topology(topology); - adm_close(port_id, fdai->perf_mode, idx); - pr_debug("%s:copp:%ld,idx bit fe:%d,type:%d,be:%d\n", - __func__, copp, fedai_id, session_type, i); - clear_bit(idx, - &session_copp_map[fedai_id][session_type][i]); - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID || - topology == DS2_ADM_COPP_TOPOLOGY_ID) && - (fdai->perf_mode == LEGACY_PCM_MODE) && - (fdai->passthr_mode == LEGACY_PCM)) - msm_pcm_routing_deinit_pp(port_id, topology); - } - } - - fe_dai_map[fedai_id][session_type].strm_id = INVALID_SESSION; - fe_dai_map[fedai_id][session_type].be_srate = 0; - mutex_unlock(&routing_lock); -} - -/* Check if FE/BE route is set */ -static bool msm_pcm_routing_route_is_set(u16 be_id, u16 fe_id) -{ - bool rc = false; - - if (!is_mm_lsm_fe_id(fe_id)) { - /* recheck FE ID in the mixer control defined in this file */ - pr_err("%s: bad MM ID\n", __func__); - return rc; - } - - if (test_bit(fe_id, &msm_bedais[be_id].fe_sessions[0])) - rc = true; - - return rc; -} - -static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set) -{ - int session_type, path_type, topology; - u32 channels, sample_rate; - uint16_t bits_per_sample = 16, be_bit_width; - struct msm_pcm_routing_fdai_data *fdai; - uint32_t passthr_mode; - bool is_lsm; - - pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set); - - if (val == MSM_FRONTEND_DAI_DTMF_RX && - afe_get_port_type(msm_bedais[reg].port_id) == - MSM_AFE_PORT_TYPE_RX) { - pr_debug("%s(): set=%d port id=0x%x for dtmf generation\n", - __func__, set, msm_bedais[reg].port_id); - afe_set_dtmf_gen_rx_portid(msm_bedais[reg].port_id, set); - } else if (!is_mm_lsm_fe_id(val)) { - /* recheck FE ID in the mixer control defined in this file */ - pr_err("%s: bad MM ID\n", __func__); - return; - } - - if (!route_check_fe_id_adm_support(val)) { - /* ignore adm open if not supported for fe_id */ - pr_debug("%s: No ADM support for fe id %d\n", __func__, val); - if (set) - set_bit(val, &msm_bedais[reg].fe_sessions[0]); - else - clear_bit(val, &msm_bedais[reg].fe_sessions[0]); - return; - } - - session_type = - (afe_get_port_type(msm_bedais[reg].port_id) == MSM_AFE_PORT_TYPE_RX) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - fdai = &fe_dai_map[val][session_type]; - passthr_mode = fdai->passthr_mode; - if (session_type == SESSION_TYPE_RX) { - if (passthr_mode != LEGACY_PCM) - path_type = ADM_PATH_COMPRESSED_RX; - else - path_type = ADM_PATH_PLAYBACK; - } else { - if ((passthr_mode != LEGACY_PCM) && (passthr_mode != LISTEN)) - path_type = ADM_PATH_COMPRESSED_TX; - else - path_type = ADM_PATH_LIVE_REC; - } - is_lsm = (val >= MSM_FRONTEND_DAI_LSM1) && - (val <= MSM_FRONTEND_DAI_LSM8); - - mutex_lock(&routing_lock); - if (set) { - if (!test_bit(val, &msm_bedais[reg].fe_sessions[0]) && - ((msm_bedais[reg].port_id == VOICE_PLAYBACK_TX) || - (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX))) - voc_start_playback(set, msm_bedais[reg].port_id); - - set_bit(val, &msm_bedais[reg].fe_sessions[0]); - if (msm_bedais[reg].active && fdai->strm_id != - INVALID_SESSION) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - int port_id = get_port_id(msm_bedais[reg].port_id); - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!msm_bedais[reg].adm_override_ch) - channels = msm_bedais[reg].channel; - else - channels = msm_bedais[reg].adm_override_ch; - if (session_type == SESSION_TYPE_TX && - fdai->be_srate && - (fdai->be_srate != msm_bedais[reg].sample_rate)) { - pr_debug("%s: flush strm %d diff BE rates\n", - __func__, fdai->strm_id); - - if (fdai->event_info.event_func) - fdai->event_info.event_func( - MSM_PCM_RT_EVT_BUF_RECFG, - fdai->event_info.priv_data); - fdai->be_srate = 0; /* might not need it */ - } - - bits_per_sample = msm_routing_get_bit_width( - msm_bedais[reg].format); - - app_type = - fe_dai_app_type_cfg[val][session_type][reg].app_type; - if (app_type && is_lsm) { - app_type_idx = - msm_pcm_routing_get_lsm_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[val][session_type][reg] - .sample_rate; - bits_per_sample = - lsm_app_type_cfg[app_type_idx].bit_width; - } else if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[val][session_type][reg] - .sample_rate; - bits_per_sample = - app_type_cfg[app_type_idx].bit_width; - } else - sample_rate = msm_bedais[reg].sample_rate; - - topology = msm_routing_get_adm_topology(val, - session_type, - reg); - acdb_dev_id = - fe_dai_app_type_cfg[val][session_type][reg].acdb_dev_id; - - be_bit_width = msm_routing_get_bit_width( - msm_bedais[reg].format); - if (hifi_filter_enabled && (msm_bedais[reg].sample_rate - == 384000 ||msm_bedais[reg].sample_rate == - 352800) && be_bit_width == 32) - bits_per_sample = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - copp_idx = adm_open(port_id, path_type, - sample_rate, channels, topology, - fdai->perf_mode, bits_per_sample, - app_type, acdb_dev_id, - session_type); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: adm open failed\n", __func__); - mutex_unlock(&routing_lock); - return; - } - pr_debug("%s: setting idx bit of fe:%d, type: %d, be:%d\n", - __func__, val, session_type, reg); - set_bit(copp_idx, - &session_copp_map[val][session_type][reg]); - - if (msm_is_resample_needed( - sample_rate, - msm_bedais[reg].sample_rate)) - adm_copp_mfc_cfg(port_id, copp_idx, - msm_bedais[reg].sample_rate); - - if (session_type == SESSION_TYPE_RX && - fdai->event_info.event_func) - fdai->event_info.event_func( - MSM_PCM_RT_EVT_DEVSWITCH, - fdai->event_info.priv_data); - - msm_pcm_routing_build_matrix(val, session_type, - path_type, - fdai->perf_mode, - passthr_mode); - if ((fdai->perf_mode == LEGACY_PCM_MODE) && - (passthr_mode == LEGACY_PCM)) - msm_pcm_routing_cfg_pp(port_id, copp_idx, - topology, channels); - } - } else { - if (test_bit(val, &msm_bedais[reg].fe_sessions[0]) && - ((msm_bedais[reg].port_id == VOICE_PLAYBACK_TX) || - (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX))) - voc_start_playback(set, msm_bedais[reg].port_id); - clear_bit(val, &msm_bedais[reg].fe_sessions[0]); - if (msm_bedais[reg].active && fdai->strm_id != - INVALID_SESSION) { - int idx; - int port_id; - unsigned long copp = - session_copp_map[val][session_type][reg]; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (test_bit(idx, &copp)) - break; - - if (idx >= MAX_COPPS_PER_PORT) { - pr_debug("%s: copp idx is invalid, exiting\n", - __func__); - mutex_unlock(&routing_lock); - return; - } - port_id = get_port_id(msm_bedais[reg].port_id); - topology = adm_get_topology_for_port_copp_idx(port_id, - idx); - msm_routing_unload_topology(topology); - adm_close(port_id, fdai->perf_mode, idx); - pr_debug("%s: copp: %ld, reset idx bit fe:%d, type: %d, be:%d topology=0x%x\n", - __func__, copp, val, session_type, reg, - topology); - clear_bit(idx, - &session_copp_map[val][session_type][reg]); - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID || - topology == DS2_ADM_COPP_TOPOLOGY_ID) && - (fdai->perf_mode == LEGACY_PCM_MODE) && - (passthr_mode == LEGACY_PCM)) - msm_pcm_routing_deinit_pp(port_id, topology); - msm_pcm_routing_build_matrix(val, session_type, - path_type, - fdai->perf_mode, - passthr_mode); - } - } - if ((msm_bedais[reg].port_id == VOICE_RECORD_RX) - || (msm_bedais[reg].port_id == VOICE_RECORD_TX)) - voc_start_record(msm_bedais[reg].port_id, set, voc_session_id); - - mutex_unlock(&routing_lock); -} - -static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - if (ucontrol->value.integer.value[0] && - msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == false) { - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 1); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - } else if (!ucontrol->value.integer.value[0] && - msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == true) { - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 0); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - } - - return 1; -} - -static int msm_routing_get_listen_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_listen_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - if (ucontrol->value.integer.value[0]) { - if (msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == false) - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 1); - snd_soc_dapm_mixer_update_power(widget->dapm, - kcontrol, 1, update); - } else if (!ucontrol->value.integer.value[0]) { - if (msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == true) - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 0); - snd_soc_dapm_mixer_update_power(widget->dapm, - kcontrol, 0, update); - } - - return 1; -} - -static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set) -{ - u32 session_id = 0; - u16 path_type; - struct media_format_info voc_be_media_format; - - pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set); - - session_id = msm_pcm_routing_get_voc_sessionid(val); - - pr_debug("%s: FE DAI 0x%x session_id 0x%x\n", - __func__, val, session_id); - - mutex_lock(&routing_lock); - - if (set) - set_bit(val, &msm_bedais[reg].fe_sessions[0]); - else - clear_bit(val, &msm_bedais[reg].fe_sessions[0]); - - if (val == MSM_FRONTEND_DAI_DTMF_RX && - afe_get_port_type(msm_bedais[reg].port_id) == - MSM_AFE_PORT_TYPE_RX) { - pr_debug("%s(): set=%d port id=0x%x for dtmf generation\n", - __func__, set, msm_bedais[reg].port_id); - afe_set_dtmf_gen_rx_portid(msm_bedais[reg].port_id, set); - } - - if (afe_get_port_type(msm_bedais[reg].port_id) == - MSM_AFE_PORT_TYPE_RX) - path_type = RX_PATH; - else - path_type = TX_PATH; - - if (set) { - if (msm_bedais[reg].active) { - voc_set_route_flag(session_id, path_type, 1); - - memset(&voc_be_media_format, 0, - sizeof(struct media_format_info)); - - voc_be_media_format.port_id = msm_bedais[reg].port_id; - voc_be_media_format.num_channels = - msm_bedais[reg].channel; - voc_be_media_format.sample_rate = - msm_bedais[reg].sample_rate; - voc_be_media_format.bits_per_sample = - msm_bedais[reg].format; - /* Defaulting this to 1 for voice call usecases */ - voc_be_media_format.channel_mapping[0] = 1; - - voc_set_device_config(session_id, path_type, - &voc_be_media_format); - - if (voc_get_route_flag(session_id, TX_PATH) && - voc_get_route_flag(session_id, RX_PATH)) - voc_enable_device(session_id); - } else { - pr_debug("%s BE is not active\n", __func__); - } - } else { - voc_set_route_flag(session_id, path_type, 0); - voc_disable_device(session_id); - } - - mutex_unlock(&routing_lock); - -} - -static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - mutex_lock(&routing_lock); - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - mutex_unlock(&routing_lock); - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - if (ucontrol->value.integer.value[0]) { - msm_pcm_routing_process_voice(mc->shift, mc->rshift, 1); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - } else { - msm_pcm_routing_process_voice(mc->shift, mc->rshift, 0); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - } - - return 1; -} - -static int msm_routing_get_voice_stub_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - mutex_lock(&routing_lock); - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - mutex_unlock(&routing_lock); - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_voice_stub_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - if (ucontrol->value.integer.value[0]) { - mutex_lock(&routing_lock); - set_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0]); - mutex_unlock(&routing_lock); - - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - } else { - mutex_lock(&routing_lock); - clear_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0]); - mutex_unlock(&routing_lock); - - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - } - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 1; -} - -/* - * Return the mapping between port ID and backend ID to enable the AFE callback - * to determine the acdb_dev_id from the port id - */ -int msm_pcm_get_be_id_from_port_id(int port_id) -{ - int i; - int be_id = -EINVAL; - - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (msm_bedais[i].port_id == port_id) { - be_id = i; - break; - } - } - - return be_id; -} - -/* - * Return the registered dev_acdb_id given a port ID to enable identifying the - * correct AFE calibration information by comparing the header information. - */ -static int msm_pcm_get_dev_acdb_id_by_port_id(int port_id) -{ - int acdb_id = -EINVAL; - int i = 0; - int session; - int port_type = afe_get_port_type(port_id); - int be_id = msm_pcm_get_be_id_from_port_id(port_id); - - pr_debug("%s:port_id %d be_id %d, port_type 0x%x\n", - __func__, port_id, be_id, port_type); - - if (port_type == MSM_AFE_PORT_TYPE_TX) { - session = SESSION_TYPE_TX; - } else if (port_type == MSM_AFE_PORT_TYPE_RX) { - session = SESSION_TYPE_RX; - } else { - pr_err("%s: Invalid port type %d\n", __func__, port_type); - acdb_id = -EINVAL; - goto exit; - } - - if (be_id < 0) { - pr_err("%s: Error getting backend id %d\n", __func__, be_id); - goto exit; - } - - mutex_lock(&routing_lock); - i = find_first_bit(&msm_bedais[be_id].fe_sessions[0], - MSM_FRONTEND_DAI_MAX); - if (i < MSM_FRONTEND_DAI_MAX) - acdb_id = fe_dai_app_type_cfg[i][session][be_id].acdb_dev_id; - - pr_debug("%s: FE[%d] session[%d] BE[%d] acdb_id(%d)\n", - __func__, i, session, be_id, acdb_id); - mutex_unlock(&routing_lock); -exit: - return acdb_id; -} - -static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = fm_switch_enable; - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - fm_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_hfp_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = hfp_switch_enable; - pr_debug("%s: HFP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_hfp_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: HFP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 1, update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 0, update); - hfp_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_a2dp_switch_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = a2dp_switch_enable; - pr_debug("%s: A2DP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_a2dp_switch_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: A2DP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - a2dp_switch_enable = ucontrol->value.integer.value[0]; - if (a2dp_switch_enable) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 1, update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 0, update); - return 1; -} - -static int msm_routing_sco_switch_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = sco_switch_enable; - pr_debug("%s: SCO Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_sco_switch_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: SCO Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - sco_switch_enable = ucontrol->value.integer.value[0]; - if (sco_switch_enable) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 1, update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 0, update); - return 1; -} - -#ifndef CONFIG_MI2S_DISABLE -static int msm_routing_get_int0_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = int0_mi2s_switch_enable; - pr_debug("%s: INT0 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_int0_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: INT0 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - int0_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_int4_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = int4_mi2s_switch_enable; - pr_debug("%s: INT4 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_int4_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: INT4 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - int4_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_pri_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = pri_mi2s_switch_enable; - pr_debug("%s: PRI MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_pri_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: PRI MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - pri_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_sec_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = sec_mi2s_switch_enable; - pr_debug("%s: SEC MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_sec_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: SEC MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - sec_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_tert_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = tert_mi2s_switch_enable; - pr_debug("%s: TERT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_tert_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: TERT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - tert_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_quat_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = quat_mi2s_switch_enable; - pr_debug("%s: QUAT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_quat_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: QUAT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - quat_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_quin_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = quin_mi2s_switch_enable; - pr_debug("%s: QUIN MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_quin_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: QUIN MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - quin_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_sen_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = sen_mi2s_switch_enable; - pr_debug("%s: SEN MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_sen_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: SEN MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - sen_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} -#endif - -static int msm_routing_get_usb_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = usb_switch_enable; - pr_debug("%s: HFP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_usb_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: USB Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 1, update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 0, update); - usb_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = fm_pcmrx_switch_enable; - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - fm_pcmrx_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static void msm_routing_get_lsm_fe_idx(struct snd_kcontrol *kcontrol, - u8 *fe_idx) -{ - int fe_id = MSM_FRONTEND_DAI_LSM1; - - if (strnstr(kcontrol->id.name, "LSM1", sizeof("LSM1"))) { - fe_id = MSM_FRONTEND_DAI_LSM1; - } else if (strnstr(kcontrol->id.name, "LSM2", sizeof("LSM2"))) { - fe_id = MSM_FRONTEND_DAI_LSM2; - } else if (strnstr(kcontrol->id.name, "LSM3", sizeof("LSM3"))) { - fe_id = MSM_FRONTEND_DAI_LSM3; - } else if (strnstr(kcontrol->id.name, "LSM4", sizeof("LSM4"))) { - fe_id = MSM_FRONTEND_DAI_LSM4; - } else if (strnstr(kcontrol->id.name, "LSM5", sizeof("LSM5"))) { - fe_id = MSM_FRONTEND_DAI_LSM5; - } else if (strnstr(kcontrol->id.name, "LSM6", sizeof("LSM6"))) { - fe_id = MSM_FRONTEND_DAI_LSM6; - } else if (strnstr(kcontrol->id.name, "LSM7", sizeof("LSM7"))) { - fe_id = MSM_FRONTEND_DAI_LSM7; - } else if (strnstr(kcontrol->id.name, "LSM8", sizeof("LSM8"))) { - fe_id = MSM_FRONTEND_DAI_LSM8; - } else { - pr_err("%s: Invalid kcontrol name:%s\n", __func__, - kcontrol->id.name); - return; - } - - *fe_idx = fe_id - MSM_FRONTEND_DAI_LSM1; - pr_debug("%s: fe_id: %d, fe_idx:%d\n", __func__, fe_id, *fe_idx); -} - -static int msm_routing_lsm_port_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 fe_idx = 0; - - msm_routing_get_lsm_fe_idx(kcontrol, &fe_idx); - ucontrol->value.integer.value[0] = lsm_port_index[fe_idx]; - return 0; -} - -static int msm_routing_lsm_port_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - int mux = ucontrol->value.enumerated.item[0]; - int lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; - u8 fe_idx = 0; - - if (mux >= e->items) { - pr_err("%s: Invalid mux value %d\n", __func__, mux); - return -EINVAL; - } - - pr_debug("%s: LSM enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - switch (ucontrol->value.integer.value[0]) { - case 1: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX; - break; - case 2: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX; - break; - case 3: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX; - break; - case 4: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX; - break; - case 5: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX; - break; - case 6: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; - break; - case 7: - lsm_port = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case 8: - lsm_port = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case 9: - lsm_port = ADM_LSM_PORT_ID; - break; - case 10: - lsm_port = AFE_PORT_ID_INT3_MI2S_TX; - break; - case 11: - lsm_port = AFE_PORT_ID_VA_CODEC_DMA_TX_0; - break; - case 12: - lsm_port = AFE_PORT_ID_VA_CODEC_DMA_TX_1; - break; - case 13: - lsm_port = AFE_PORT_ID_VA_CODEC_DMA_TX_2; - break; - case 14: - lsm_port = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - break; - case 15: - lsm_port = AFE_PORT_ID_QUINARY_TDM_TX; - break; - case 16: - lsm_port = AFE_PORT_ID_TERTIARY_TDM_TX; - break; - default: - pr_err("Default lsm port"); - break; - } - set_lsm_port(lsm_port); - msm_routing_get_lsm_fe_idx(kcontrol, &fe_idx); - lsm_port_index[fe_idx] = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_routing_lsm_func_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - u16 port_id; - enum afe_mad_type mad_type; - - pr_debug("%s: id name %s\n", __func__, kcontrol->id.name); - for (i = 0; i < ARRAY_SIZE(lsm_port_text); i++) - if (!strnstr(kcontrol->id.name, lsm_port_text[i], - strlen(lsm_port_text[i]))) - break; - - if (i-- == ARRAY_SIZE(lsm_port_text)) { - pr_warn("%s: Invalid id name %s\n", __func__, - kcontrol->id.name); - return -EINVAL; - } - - port_id = i * 2 + 1 + SLIMBUS_0_RX; - - /*Check for Tertiary/Quaternary/INT3 TX port*/ - if (strnstr(kcontrol->id.name, lsm_port_text[7], - strlen(lsm_port_text[7]))) - port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[8], - strlen(lsm_port_text[8]))) - port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[10], - strlen(lsm_port_text[10]))) - port_id = AFE_PORT_ID_INT3_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[14], - strlen(lsm_port_text[14]))) - port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - - if (strnstr(kcontrol->id.name, lsm_port_text[15], - strlen(lsm_port_text[15]))) - port_id = AFE_PORT_ID_QUINARY_TDM_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[16], - strlen(lsm_port_text[16]))) - port_id = AFE_PORT_ID_TERTIARY_TDM_TX; - - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - switch (mad_type) { - case MAD_HW_NONE: - ucontrol->value.integer.value[0] = MADNONE; - break; - case MAD_HW_AUDIO: - ucontrol->value.integer.value[0] = MADAUDIO; - break; - case MAD_HW_BEACON: - ucontrol->value.integer.value[0] = MADBEACON; - break; - case MAD_HW_ULTRASOUND: - ucontrol->value.integer.value[0] = MADULTRASOUND; - break; - case MAD_SW_AUDIO: - ucontrol->value.integer.value[0] = MADSWAUDIO; - break; - default: - pr_warn("%s: Unknown\n", __func__); - return -EINVAL; - } - return 0; -} - -static int msm_routing_lsm_func_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - u16 port_id; - enum afe_mad_type mad_type; - - pr_debug("%s: id name %s\n", __func__, kcontrol->id.name); - for (i = 0; i < ARRAY_SIZE(lsm_port_text); i++) - if (strnstr(kcontrol->id.name, lsm_port_text[i], - strlen(lsm_port_text[i]))) - break; - - if (i-- == ARRAY_SIZE(lsm_port_text)) { - pr_warn("%s: Invalid id name %s\n", __func__, - kcontrol->id.name); - return -EINVAL; - } - - port_id = i * 2 + 1 + SLIMBUS_0_RX; - switch (ucontrol->value.integer.value[0]) { - case MADNONE: - mad_type = MAD_HW_NONE; - break; - case MADAUDIO: - mad_type = MAD_HW_AUDIO; - break; - case MADBEACON: - mad_type = MAD_HW_BEACON; - break; - case MADULTRASOUND: - mad_type = MAD_HW_ULTRASOUND; - break; - case MADSWAUDIO: - mad_type = MAD_SW_AUDIO; - break; - default: - pr_warn("%s: Unknown\n", __func__); - return -EINVAL; - } - - /*Check for Tertiary/Quaternary/INT3 TX port*/ - if (strnstr(kcontrol->id.name, lsm_port_text[7], - strlen(lsm_port_text[7]))) - port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[8], - strlen(lsm_port_text[8]))) - port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[10], - strlen(lsm_port_text[10]))) - port_id = AFE_PORT_ID_INT3_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[14], - strlen(lsm_port_text[14]))) - port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - - if (strnstr(kcontrol->id.name, lsm_port_text[15], - strlen(lsm_port_text[15]))) - port_id = AFE_PORT_ID_QUINARY_TDM_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[16], - strlen(lsm_port_text[16]))) - port_id = AFE_PORT_ID_TERTIARY_TDM_TX; - - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - return afe_port_set_mad_type(port_id, mad_type); -} - -static const char *const adm_override_chs_text[] = {"Zero", "One", "Two"}; - -static SOC_ENUM_SINGLE_EXT_DECL(adm_override_chs, - adm_override_chs_text); - -static int msm_routing_adm_get_backend_idx(struct snd_kcontrol *kcontrol) -{ - int backend_id; - - if (strnstr(kcontrol->id.name, "SLIM7_RX", sizeof("SLIM7_RX"))) { - backend_id = MSM_BACKEND_DAI_SLIMBUS_7_RX; - } else if (strnstr(kcontrol->id.name, "SLIM9_TX", sizeof("SLIM9_TX"))) { - backend_id = MSM_BACKEND_DAI_SLIMBUS_9_TX; - } else { - pr_err("%s: unsupported backend id: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return backend_id; -} - -static int msm_routing_adm_channel_config_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int backend_id = msm_routing_adm_get_backend_idx(kcontrol); - - if (backend_id >= 0) { - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = - msm_bedais[backend_id].adm_override_ch; - pr_debug("%s: adm channel count %ld for BE:%d\n", __func__, - ucontrol->value.integer.value[0], backend_id); - mutex_unlock(&routing_lock); - } - - return 0; -} - -static int msm_routing_adm_channel_config_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int backend_id = msm_routing_adm_get_backend_idx(kcontrol); - - if (backend_id >= 0) { - mutex_lock(&routing_lock); - msm_bedais[backend_id].adm_override_ch = - ucontrol->value.integer.value[0]; - pr_debug("%s:updating BE :%d adm channels: %d\n", - __func__, backend_id, - msm_bedais[backend_id].adm_override_ch); - mutex_unlock(&routing_lock); - } - - return 0; -} - -static const struct snd_kcontrol_new adm_channel_config_controls[] = { - SOC_ENUM_EXT("SLIM7_RX ADM Channels", adm_override_chs, - msm_routing_adm_channel_config_get, - msm_routing_adm_channel_config_put), - SOC_ENUM_EXT("SLIM9_TX ADM Channels", adm_override_chs, - msm_routing_adm_channel_config_get, - msm_routing_adm_channel_config_put), -}; - -static int msm_routing_slim_0_rx_aanc_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = slim0_rx_aanc_fb_port; - mutex_unlock(&routing_lock); - pr_debug("%s: AANC Mux Port %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -}; - -static int msm_routing_slim_0_rx_aanc_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct aanc_data aanc_info; - - mutex_lock(&routing_lock); - memset(&aanc_info, 0x00, sizeof(aanc_info)); - pr_debug("%s: AANC Mux Port %ld\n", __func__, - ucontrol->value.integer.value[0]); - slim0_rx_aanc_fb_port = ucontrol->value.integer.value[0]; - if (ucontrol->value.integer.value[0] == 0) { - aanc_info.aanc_active = false; - aanc_info.aanc_tx_port = 0; - aanc_info.aanc_rx_port = 0; - } else { - aanc_info.aanc_active = true; - aanc_info.aanc_rx_port = SLIMBUS_0_RX; - aanc_info.aanc_tx_port = - (SLIMBUS_0_RX - 1 + (slim0_rx_aanc_fb_port * 2)); - } - afe_set_aanc_info(&aanc_info); - mutex_unlock(&routing_lock); - return 0; -}; -static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = 0, shift = 0; - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - idx = mc->rshift/(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - shift = mc->rshift%(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - - if (idx >= BE_DAI_PORT_SESSIONS_IDX_MAX) { - pr_err("%s: Invalid idx = %d\n", __func__, idx); - return -EINVAL; - } - - if (test_bit(shift, - (unsigned long *)&msm_bedais[mc->shift].port_sessions[idx])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_port_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = 0, shift = 0; - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - idx = mc->rshift/(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - shift = mc->rshift%(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - - if (idx >= BE_DAI_PORT_SESSIONS_IDX_MAX) { - pr_err("%s: Invalid idx = %d\n", __func__, idx); - return -EINVAL; - } - - pr_debug("%s: shift 0x%x rshift 0x%x val %ld idx %d reminder shift %d\n", - __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0], idx, shift); - - if (ucontrol->value.integer.value[0]) { - afe_loopback(1, msm_bedais[mc->shift].port_id, - msm_bedais[mc->rshift].port_id); - set_bit(shift, - (unsigned long *)&msm_bedais[mc->shift].port_sessions[idx]); - } else { - afe_loopback(0, msm_bedais[mc->shift].port_id, - msm_bedais[mc->rshift].port_id); - clear_bit(shift, - (unsigned long *)&msm_bedais[mc->shift].port_sessions[idx]); - } - - return 1; -} - -static int msm_pcm_get_channel_rule_index(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = channel_mixer[fe_id].rule; - - return 0; -} - -static int msm_pcm_put_channel_rule_index(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - channel_mixer[fe_id].rule = ucontrol->value.integer.value[0]; - - return 1; -} - -static int msm_pcm_get_out_chs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = - channel_mixer[fe_id].output_channel; - return 0; -} - -static int msm_pcm_put_out_chs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: fe_id is %d, output channels = %d\n", __func__, - fe_id, - (unsigned int)(ucontrol->value.integer.value[0])); - channel_mixer[fe_id].output_channel = - (unsigned int)(ucontrol->value.integer.value[0]); - - return 1; -} - -static const char *const ch_mixer[] = {"Disable", "Enable"}; - -/* If new backend is added, need update this array */ -static const char *const be_name[] = { -"ZERO", "PRI_I2S_RX", "PRI_I2S_TX", "SLIM_0_RX", -"SLIM_0_TX", "HDMI_RX", "INT_BT_SCO_RX", "INT_BT_SCO_TX", -"INT_FM_RX", "INT_FM_TX", "AFE_PCM_RX", "AFE_PCM_TX", -"AUXPCM_RX", "AUXPCM_TX", "VOICE_PLAYBACK_TX", "VOICE2_PLAYBACK_TX", -"INCALL_RECORD_RX", "INCALL_RECORD_TX", "MI2S_RX", "MI2S_TX", -"SEC_I2S_RX", "SLIM_1_RX", "SLIM_1_TX", "SLIM_2_RX", -"SLIM_2_TX", "SLIM_3_RX", "SLIM_3_TX", "SLIM_4_RX", -"SLIM_4_TX", "SLIM_5_RX", "SLIM_5_TX", "SLIM_6_RX", -"SLIM_6_TX", "SLIM_7_RX", "SLIM_7_TX", "SLIM_8_RX", -"SLIM_8_TX", "EXTPROC_RX", "EXTPROC_TX", "EXPROC_EC_TX", -"QUAT_MI2S_RX", "QUAT_MI2S_TX", "SECOND_MI2S_RX", "SECOND_MI2S_TX", -"PRI_MI2S_RX", "PRI_MI2S_TX", "TERT_MI2S_RX", "TERT_MI2S_TX", -"AUDIO_I2S_RX", "SEC_AUXPCM_RX", "SEC_AUXPCM_TX", "PRI_SPDIF_RX", -"SECOND_MI2S_RX_SD1", "QUIN_MI2S_RX", "QUIN_MI2S_TX", "SENARY_MI2S_TX", -"PRI_TDM_RX_0", "PRI_TDM_TX_0", "PRI_TDM_RX_1", "PRI_TDM_TX_1", -"PRI_TDM_RX_2", "PRI_TDM_TX_2", "PRI_TDM_RX_3", "PRI_TDM_TX_3", -"PRI_TDM_RX_4", "PRI_TDM_TX_4", "PRI_TDM_RX_5", "PRI_TDM_TX_5", -"PRI_TDM_RX_6", "PRI_TDM_TX_6", "PRI_TDM_RX_7", "PRI_TDM_TX_7", -"SEC_TDM_RX_0", "SEC_TDM_TX_0", "SEC_TDM_RX_1", "SEC_TDM_TX_1", -"SEC_TDM_RX_2", "SEC_TDM_TX_2", "SEC_TDM_RX_3", "SEC_TDM_TX_3", -"SEC_TDM_RX_4", "SEC_TDM_TX_4", "SEC_TDM_RX_5", "SEC_TDM_TX_5", -"SEC_TDM_RX_6", "SEC_TDM_TX_6", "SEC_TDM_RX_7", "SEC_TDM_TX_7", -"TERT_TDM_RX_0", "TERT_TDM_TX_0", "TERT_TDM_RX_1", "TERT_TDM_TX_1", -"TERT_TDM_RX_2", "TERT_TDM_TX_2", "TERT_TDM_RX_3", "TERT_TDM_TX_3", -"TERT_TDM_RX_4", "TERT_TDM_TX_4", "TERT_TDM_RX_5", "TERT_TDM_TX_5", -"TERT_TDM_RX_6", "TERT_TDM_TX_6", "TERT_TDM_RX_7", "TERT_TDM_TX_7", -"QUAT_TDM_RX_0", "QUAT_TDM_TX_0", "QUAT_TDM_RX_1", "QUAT_TDM_TX_1", -"QUAT_TDM_RX_2", "QUAT_TDM_TX_2", "QUAT_TDM_RX_3", "QUAT_TDM_TX_3", -"QUAT_TDM_RX_4", "QUAT_TDM_TX_4", "QUAT_TDM_RX_5", "QUAT_TDM_TX_5", -"QUAT_TDM_RX_6", "QUAT_TDM_TX_6", "QUAT_TDM_RX_7", "QUAT_TDM_TX_7", -"QUIN_TDM_RX_0", "QUIN_TDM_TX_0", "QUIN_TDM_RX_1", "QUIN_TDM_TX_1", -"QUIN_TDM_RX_2", "QUIN_TDM_TX_2", "QUIN_TDM_RX_3", "QUIN_TDM_TX_3", -"QUIN_TDM_RX_4", "QUIN_TDM_TX_4", "QUIN_TDM_RX_5", "QUIN_TDM_TX_5", -"QUIN_TDM_RX_6", "QUIN_TDM_TX_6", "QUIN_TDM_RX_7", "QUIN_TDM_TX_7", -"SEN_TDM_RX_0", "SEN_TDM_TX_0", "SEN_TDM_RX_1", "SEN_TDM_TX_1", -"SEN_TDM_RX_2", "SEN_TDM_TX_2", "SEN_TDM_RX_3", "SEN_TDM_TX_3", -"SEN_TDM_RX_4", "SEN_TDM_TX_4", "SEN_TDM_RX_5", "SEN_TDM_TX_5", -"SEN_TDM_RX_6", "SEN_TDM_TX_6", "SEN_TDM_RX_7", "SEN_TDM_TX_7", -"INT_BT_A2DP_RX", "USB_RX", "USB_TX", "DISPLAY_PORT_RX", -"DISPLAY_PORT_RX1", "TERT_AUXPCM_RX", "TERT_AUXPCM_TX", "QUAT_AUXPCM_RX", -"QUAT_AUXPCM_TX", "QUIN_AUXPCM_RX", "QUIN_AUXPCM_TX", "INT0_MI2S_RX", -"INT0_MI2S_TX", "INT1_MI2S_RX", "INT1_MI2S_TX", "INT2_MI2S_RX", -"INT2_MI2S_TX", "INT3_MI2S_RX", "INT3_MI2S_TX", "INT4_MI2S_RX", -"INT4_MI2S_TX", "INT5_MI2S_RX", "INT5_MI2S_TX", "INT6_MI2S_RX", -"INT6_MI2S_TX", "SEN_AUXPCM_RX", "SEN_AUXPCM_TX", "SENARY_MI2S_RX", -"WSA_CDC_DMA_RX_0", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_RX_1","WSA_CDC_DMA_TX_1", -"WSA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_2", -"RX_CDC_DMA_RX_0", "TX_CDC_DMA_TX_0", "RX_CDC_DMA_RX_1", "TX_CDC_DMA_TX_1", -"RX_CDC_DMA_RX_2", "TX_CDC_DMA_TX_2", "RX_CDC_DMA_RX_3", "TX_CDC_DMA_TX_3", -"RX_CDC_DMA_RX_4", "TX_CDC_DMA_TX_4", "RX_CDC_DMA_RX_5", "TX_CDC_DMA_TX_5", -"RX_CDC_DMA_RX_6", "RX_CDC_DMA_RX_7", -"PRI_SPDIF_TX", "SEC_SPDIF_RX", "SEC_SPDIF_TX", -"SLIM_9_RX", "SLIM_9_TX", "AFE_LOOPBACK_TX", "PRI_META_MI2S_RX", -"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX" -}; - -static SOC_ENUM_SINGLE_DECL(mm1_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm2_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA2, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm3_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA3, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm4_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA4, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm18_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA18, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm19_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA19, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm28_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA28, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm29_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA29, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm30_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA30, ch_mixer); - -static SOC_ENUM_DOUBLE_DECL(mm1_ch1_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 0, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch2_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 1, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch3_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 2, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch4_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 3, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch5_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 4, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch6_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 5, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch7_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 6, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch8_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 7, be_name); -static SOC_ENUM_DOUBLE_DECL(mm18_ch1_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA18, 0, be_name); -static SOC_ENUM_DOUBLE_DECL(mm18_ch2_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA18, 1, be_name); -static SOC_ENUM_DOUBLE_DECL(mm19_ch1_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA19, 0, be_name); -static SOC_ENUM_DOUBLE_DECL(mm19_ch2_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA19, 1, be_name); -static SOC_ENUM_DOUBLE_DECL(mm28_ch1_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA28, 0, be_name); -static SOC_ENUM_DOUBLE_DECL(mm28_ch2_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA28, 1, be_name); -static SOC_ENUM_DOUBLE_DECL(mm29_ch1_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA29, 0, be_name); -static SOC_ENUM_DOUBLE_DECL(mm29_ch2_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA29, 1, be_name); -static SOC_ENUM_DOUBLE_DECL(mm30_ch1_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA30, 0, be_name); -static SOC_ENUM_DOUBLE_DECL(mm30_ch2_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA30, 1, be_name); - -static int msm_pcm_get_ctl_enum_info(struct snd_ctl_elem_info *uinfo, - unsigned int channels, - unsigned int items, const char *const names[]) -{ - if (uinfo->value.enumerated.item >= items) - uinfo->value.enumerated.item = items - 1; - - WARN(strlen(names[uinfo->value.enumerated.item]) >= - sizeof(uinfo->value.enumerated.name), - "ALSA: too long item name '%s'\n", - names[uinfo->value.enumerated.item]); - strlcpy(uinfo->value.enumerated.name, - names[uinfo->value.enumerated.item], - sizeof(uinfo->value.enumerated.name)); - return 0; -} - -static int msm_pcm_channel_mixer_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - - uinfo->value.enumerated.items = ARRAY_SIZE(ch_mixer); - msm_pcm_get_ctl_enum_info(uinfo, 1, e->items, e->texts); - - return 0; -} -static int msm_pcm_channel_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_enum *) - kcontrol->private_value)->shift_l; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: FE %d %s\n", __func__, - fe_id, - channel_mixer[fe_id].enable ? "Enabled" : "Disabled"); - ucontrol->value.enumerated.item[0] = channel_mixer[fe_id].enable; - return 0; -} - -static int msm_pcm_channel_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_enum *) - kcontrol->private_value)->shift_l; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - channel_mixer[fe_id].enable = ucontrol->value.enumerated.item[0]; - pr_debug("%s: %s FE %d\n", __func__, - channel_mixer[fe_id].enable ? "Enable" : "Disable", - fe_id); - return 0; -} - -static int msm_pcm_channel_input_be_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - - uinfo->value.enumerated.items = ARRAY_SIZE(be_name); - msm_pcm_get_ctl_enum_info(uinfo, 1, e->items, e->texts); - - return 0; -} - -static int msm_pcm_channel_input_be_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - u16 fe_id = 0, in_ch = 0; - - fe_id = e->shift_l; - in_ch = e->shift_r; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (in_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, in_ch); - return -EINVAL; - } - - channel_input[fe_id][in_ch] = ucontrol->value.enumerated.item[0]; - return 1; -} - -static int msm_pcm_channel_input_be_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - u16 fe_id = 0, in_ch = 0; - - fe_id = e->shift_l; - in_ch = e->shift_r; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (in_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, in_ch); - return -EINVAL; - } - - ucontrol->value.enumerated.item[0] = channel_input[fe_id][in_ch]; - return 1; -} - - -static int msm_pcm_channel_weight_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = ADM_MAX_CHANNELS; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = WEIGHT_0_DB; - - return 0; -} - -static int msm_pcm_channel_weight_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0, out_ch = 0; - int i, weight; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - out_ch = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->rshift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (out_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, out_ch); - return -EINVAL; - } - - pr_debug("%s: FE_ID: %d, channel weight %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld\n", - __func__, fe_id, - ucontrol->value.integer.value[0], - ucontrol->value.integer.value[1], - ucontrol->value.integer.value[2], - ucontrol->value.integer.value[3], - ucontrol->value.integer.value[4], - ucontrol->value.integer.value[5], - ucontrol->value.integer.value[6], - ucontrol->value.integer.value[7]); - - for (i = 0; i < ADM_MAX_CHANNELS; ++i) { - weight = ucontrol->value.integer.value[i]; - channel_mixer[fe_id].channel_weight[out_ch][i] = weight; - pr_debug("%s: FE_ID %d, output %d input %d weight %d\n", - __func__, fe_id, out_ch, i, - channel_mixer[fe_id].channel_weight[out_ch][i]); - } - - return 0; -} - -static int msm_pcm_channel_weight_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0, out_ch = 0; - int i; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - out_ch = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->rshift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (out_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, out_ch); - return -EINVAL; - } - - for (i = 0; i < ADM_MAX_CHANNELS; ++i) - ucontrol->value.integer.value[i] = - channel_mixer[fe_id].channel_weight[out_ch][i]; - - pr_debug("%s: FE_ID: %d, weight %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld", - __func__, fe_id, - ucontrol->value.integer.value[0], - ucontrol->value.integer.value[1], - ucontrol->value.integer.value[2], - ucontrol->value.integer.value[3], - ucontrol->value.integer.value[4], - ucontrol->value.integer.value[5], - ucontrol->value.integer.value[6], - ucontrol->value.integer.value[7]); - - return 0; -} - -static int msm_pcm_channel_output_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - /* Valid channel map value ranges from 1 to 64 */ - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 64; - - return 0; -} - -static int msm_pcm_channel_output_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - int i, ch_map; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; ++i) { - ch_map = ucontrol->value.integer.value[i]; - channel_mixer[fe_id].out_ch_map[i] = ch_map; - pr_debug("%s: FE_ID %d, channel %d channel map %d\n", - __func__, fe_id, i, channel_mixer[fe_id].out_ch_map[i]); - } - - /* Make override_out_ch_map false if ch map is reset */ - if (channel_mixer[fe_id].out_ch_map[0] == 0) - channel_mixer[fe_id].override_out_ch_map = false; - else - channel_mixer[fe_id].override_out_ch_map = true; - - return 0; -} - -static int msm_pcm_channel_output_map_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - int i; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; ++i) - ucontrol->value.integer.value[i] = - channel_mixer[fe_id].out_ch_map[i]; - - return 0; -} - -static const struct snd_kcontrol_new channel_mixer_controls[] = { - SOC_SINGLE_EXT("MultiMedia1 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia2 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia3 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia4 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA4, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia5 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA5, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia6 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA6, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia18 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA18, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia19 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA19, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia28 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA28, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia29 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA29, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia30 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA30, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - - SOC_SINGLE_EXT("MultiMedia1 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 14, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia2 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia3 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia4 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA4, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia5 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA5, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia6 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA6, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia18 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA18, 14, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia19 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA19, 14, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia28 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA28, 14, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia29 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA29, 14, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia30 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA30, 14, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm1_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm2_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia3 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm3_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia4 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm4_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm18_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm19_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm28_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm29_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm30_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 1, } - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel4", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel5", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel6", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel7", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel8", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 7,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel9", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 8,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel10", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 9,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel11", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 10,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel12", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 11,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel13", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 12,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel14", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 13,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA2, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA2, .rshift = 1,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA2, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia3 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA3, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia3 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA3, .rshift = 1,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 1, } - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel4", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel5", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel6", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel7", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel8", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 7,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel9", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 8,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel10", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 9,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel11", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 10,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel12", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 11,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel13", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 12,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel14", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18, .rshift = 13,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 1, } - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel4", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel5", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel6", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel7", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel8", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 7,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel9", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 8,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel10", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 9,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel11", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 10,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel12", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 11,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel13", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 12,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel14", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19, .rshift = 13,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 1, } - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel4", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel5", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel6", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel7", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel8", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 7,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel9", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 8,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel10", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 9,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel11", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 10,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel12", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 11,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel13", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 12,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel14", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28, .rshift = 13,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 1, } - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel4", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel5", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel6", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel7", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel8", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 7,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel9", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 8,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel10", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 9,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel11", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 10,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel12", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 11,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel13", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 12,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel14", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29, .rshift = 13,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 1, } - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel4", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel5", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel6", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel7", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel8", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 7,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel9", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 8,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel10", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 9,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel11", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 10,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel12", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 11,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel13", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 12,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel14", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30, .rshift = 13,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel1", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch1_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel2", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch2_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel3", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch3_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel4", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch4_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel5", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch5_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel6", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch6_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel7", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch7_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel8", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch8_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Channel1", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm18_ch1_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Channel2", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm18_ch2_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Channel1", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm19_ch1_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Channel2", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm19_ch2_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Channel1", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm28_ch1_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Channel2", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm28_ch2_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Channel1", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm29_ch1_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Channel2", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm29_ch2_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Channel1", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm30_ch1_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Channel2", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm30_ch2_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia3 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia4 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia5 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia6 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia18 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia19 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia28 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia29 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia30 Output Channel Map", - .info = msm_pcm_channel_output_map_info, - .get = msm_pcm_channel_output_map_get, - .put = msm_pcm_channel_output_map_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30,} - }, -}; - -static int msm_ec_ref_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_ec_ref_ch; - pr_debug("%s: msm_ec_ref_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_ec_ref_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_ec_ref_ch = ucontrol->value.integer.value[0]; - pr_debug("%s: msm_ec_ref_ch = %d\n", __func__, msm_ec_ref_ch); - adm_num_ec_ref_rx_chans(msm_ec_ref_ch); - return 0; -} - -static int msm_ec_ref_ch_downmixed_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_ec_ref_ch_downmixed; - pr_debug("%s: msm_ec_ref_downmixed_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_ec_ref_ch_downmixed_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_ec_ref_ch_downmixed = ucontrol->value.integer.value[0]; - pr_debug("%s: msm_ec_ref_downmixed_ch = %d\n", - __func__, msm_ec_ref_ch_downmixed); - adm_num_ec_ref_rx_chans_downmixed(msm_ec_ref_ch_downmixed); - return 0; -} - -static int msm_ec_ref_chmixer_weights_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i = 0, ret = 0; - uint16_t weights[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; - int out_channel_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - for (; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - weights[i] = ucontrol->value.integer.value[i]; - - ret = adm_ec_ref_chmixer_weights(out_channel_idx, - weights, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - pr_debug("%s: ch_index = %d, ret = %d\n", __func__, out_channel_idx, ret); - return ret; -} - -static const char *const ec_ref_ch_text[] = {"Zero", "One", "Two", "Three", - "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", - "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen"}; - -static int msm_ec_ref_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (msm_ec_ref_bit_format) { - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S16_LE: - ucontrol->value.integer.value[0] = 1; - break; - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: msm_ec_ref_bit_format = %ld\n", - __func__, ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_ec_ref_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 bit_width = 0; - - switch (ucontrol->value.integer.value[0]) { - case 2: - msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 1: - msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - default: - msm_ec_ref_bit_format = 0; - break; - } - - if (msm_ec_ref_bit_format == SNDRV_PCM_FORMAT_S16_LE) - bit_width = 16; - else if (msm_ec_ref_bit_format == SNDRV_PCM_FORMAT_S24_LE) - bit_width = 24; - - pr_debug("%s: msm_ec_ref_bit_format = %d\n", - __func__, msm_ec_ref_bit_format); - adm_ec_ref_rx_bit_width(bit_width); - return 0; -} - -static char const *ec_ref_bit_format_text[] = {"0", "S16_LE", "S24_LE"}; - -static int msm_ec_ref_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_ec_ref_sampling_rate; - pr_debug("%s: msm_ec_ref_sampling_rate = %ld\n", - __func__, ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_ec_ref_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 0: - msm_ec_ref_sampling_rate = 0; - break; - case 1: - msm_ec_ref_sampling_rate = 8000; - break; - case 2: - msm_ec_ref_sampling_rate = 16000; - break; - case 3: - msm_ec_ref_sampling_rate = 32000; - break; - case 4: - msm_ec_ref_sampling_rate = 44100; - break; - case 5: - msm_ec_ref_sampling_rate = 48000; - break; - case 6: - msm_ec_ref_sampling_rate = 96000; - break; - case 7: - msm_ec_ref_sampling_rate = 192000; - break; - case 8: - msm_ec_ref_sampling_rate = 384000; - break; - default: - msm_ec_ref_sampling_rate = 48000; - break; - } - pr_debug("%s: msm_ec_ref_sampling_rate = %d\n", - __func__, msm_ec_ref_sampling_rate); - adm_ec_ref_rx_sampling_rate(msm_ec_ref_sampling_rate); - return 0; -} - -static int get_ec_ref_port_id(int value, int *index) -{ - int port_id; - - switch (value) { - case 0: - *index = 0; - port_id = AFE_PORT_INVALID; - break; - case 1: - *index = 1; - port_id = SLIMBUS_0_RX; - break; - case 2: - *index = 2; - port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case 3: - *index = 3; - port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case 4: - *index = 4; - port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case 5: - *index = 5; - port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case 6: - *index = 6; - port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case 7: - *index = 7; - port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case 9: - *index = 9; - port_id = SLIMBUS_5_RX; - break; - case 10: - *index = 10; - port_id = SLIMBUS_1_TX; - break; - case 11: - *index = 11; - port_id = AFE_PORT_ID_QUATERNARY_TDM_TX_1; - break; - case 12: - *index = 12; - port_id = AFE_PORT_ID_QUATERNARY_TDM_RX; - break; - case 13: - *index = 13; - port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_1; - break; - case 14: - *index = 14; - port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_2; - break; - case 15: - *index = 15; - port_id = SLIMBUS_6_RX; - break; - case 16: - *index = 16; - port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case 17: - *index = 17; - port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case 18: - *index = 18; - port_id = AFE_PORT_ID_TERTIARY_TDM_TX; - break; - case 19: - *index = 19; - port_id = AFE_PORT_ID_USB_RX; - break; - case 20: - *index = 20; - port_id = AFE_PORT_ID_INT0_MI2S_RX; - break; - case 21: - *index = 21; - port_id = AFE_PORT_ID_INT4_MI2S_RX; - break; - case 22: - *index = 22; - port_id = AFE_PORT_ID_INT3_MI2S_TX; - break; - case 23: - *index = 23; - port_id = AFE_PORT_ID_HDMI_OVER_DP_RX; - break; - case 24: - *index = 24; - port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - break; - case 25: - *index = 25; - port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - break; - case 26: - *index = 26; - port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - break; - case 27: - *index = 27; - port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - break; - case 28: - *index = 28; - port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - break; - case 29: - *index = 29; - port_id = SLIMBUS_7_RX; - break; - case 30: - *index = 30; - port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_0; - break; - case 31: - *index = 31; - port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_1; - break; - case 32: - *index = 32; - port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_2; - break; - case 33: - *index = 33; - port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_3; - break; - case 34: - *index = 34; - port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_0; - break; - case 35: - *index = 35; - port_id = AFE_PORT_ID_TERTIARY_TDM_RX_2; - break; - case 36: - *index = 36; - port_id = AFE_PORT_ID_SECONDARY_TDM_TX; - break; - case 37: - *index = 37; - port_id = AFE_PORT_ID_HDMI_OVER_DP_RX; - break; - case 38: - *index = 38; - port_id = AFE_PORT_ID_SENARY_MI2S_RX; - break; - default: - *index = 0; /* NONE */ - pr_err("%s: Invalid value %d\n", __func__, value); - port_id = AFE_PORT_INVALID; - break; - } - - return port_id; -} - -static int msm_routing_afe_lb_tx_port_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: port index = %d", __func__, afe_loopback_tx_port_index); - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = afe_loopback_tx_port_index; - mutex_unlock(&routing_lock); - - return 0; -} - -static int msm_routing_afe_lb_tx_port_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value = ucontrol->value.integer.value[0]; - - mutex_lock(&routing_lock); - afe_loopback_tx_port_id = get_ec_ref_port_id(value, - &afe_loopback_tx_port_index); - pr_debug("%s: afe_loopback_tx_port_index = %d\n", - __func__, afe_loopback_tx_port_index); - mutex_unlock(&routing_lock); - - return 0; -} - -static const char *const ec_ref_rate_text[] = {"0", "8000", "16000", - "32000", "44100", "48000", "96000", "192000", "384000"}; - -static const struct soc_enum msm_route_ec_ref_params_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ec_ref_ch_text), ec_ref_ch_text), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ec_ref_bit_format_text), - ec_ref_bit_format_text), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ec_ref_rate_text), ec_ref_rate_text), -}; - -static const char *const ec_ref_rx[] = { "None", "SLIM_RX", "I2S_RX", - "PRI_MI2S_TX", "SEC_MI2S_TX", - "TERT_MI2S_TX", "QUAT_MI2S_TX", "SEC_I2S_RX", "PROXY_RX", - "SLIM_5_RX", "SLIM_1_TX", "QUAT_TDM_TX_1", - "QUAT_TDM_RX_0", "QUAT_TDM_RX_1", "QUAT_TDM_RX_2", "SLIM_6_RX", - "TERT_MI2S_RX", "QUAT_MI2S_RX", "TERT_TDM_TX_0", "USB_AUDIO_RX", - "INT0_MI2S_RX", "INT4_MI2S_RX", "INT3_MI2S_TX", "DISPLAY_PORT", - "WSA_CDC_DMA_RX_0", "WSA_CDC_DMA_RX_1", - "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_2", - "SLIM_7_RX", "RX_CDC_DMA_RX_0", "RX_CDC_DMA_RX_1", "RX_CDC_DMA_RX_2", - "RX_CDC_DMA_RX_3", "TX_CDC_DMA_TX_0", "TERT_TDM_RX_2", "SEC_TDM_TX_0", - "DISPLAY_PORT1", "SEN_MI2S_RX", -}; - -static const struct soc_enum msm_route_ec_ref_rx_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ec_ref_rx), ec_ref_rx), -}; - -static const struct snd_kcontrol_new ec_ref_param_controls[] = { - SOC_ENUM_EXT("EC Reference Channels", msm_route_ec_ref_params_enum[0], - msm_ec_ref_ch_get, msm_ec_ref_ch_put), - SOC_ENUM_EXT("EC Reference Bit Format", msm_route_ec_ref_params_enum[1], - msm_ec_ref_bit_format_get, msm_ec_ref_bit_format_put), - SOC_ENUM_EXT("EC Reference SampleRate", msm_route_ec_ref_params_enum[2], - msm_ec_ref_rate_get, msm_ec_ref_rate_put), - SOC_ENUM_EXT("EC Reference Downmixed Channels", - msm_route_ec_ref_params_enum[0], - msm_ec_ref_ch_downmixed_get, msm_ec_ref_ch_downmixed_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch1", SND_SOC_NOPM, - 0, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch2", SND_SOC_NOPM, - 1, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch3", SND_SOC_NOPM, - 2, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch4", SND_SOC_NOPM, - 3, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch5", SND_SOC_NOPM, - 4, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch6", SND_SOC_NOPM, - 5, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch7", SND_SOC_NOPM, - 6, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch8", SND_SOC_NOPM, - 7, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, - msm_ec_ref_chmixer_weights_put), - SOC_ENUM_EXT("AFE_LOOPBACK_TX Port", msm_route_ec_ref_rx_enum[0], - msm_routing_afe_lb_tx_port_get, msm_routing_afe_lb_tx_port_put), -}; - -static int msm_routing_ec_ref_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: ec_ref_rx = %d", __func__, msm_route_ec_ref_rx); - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = msm_route_ec_ref_rx; - mutex_unlock(&routing_lock); - - return 0; -} - -static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value = ucontrol->value.integer.value[0]; - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - mutex_lock(&routing_lock); - msm_ec_ref_port_id = get_ec_ref_port_id(value, &msm_route_ec_ref_rx); - adm_ec_ref_rx_id(msm_ec_ref_port_id); - pr_debug("%s: msm_route_ec_ref_rx = %d\n", - __func__, msm_route_ec_ref_rx); - mutex_unlock(&routing_lock); - - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - msm_route_ec_ref_rx, e, update); - return 0; -} - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul1 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL1 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul2 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL2 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul3 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL3 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul4 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL4 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul5 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL5 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul6 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL6 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul8 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL8 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul9 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL9 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul16 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL16 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul10 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL10 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul17 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL17 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul18 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL18 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul19 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL19 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul28 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL28 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul29 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL29 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static int msm_routing_ext_ec_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: ext_ec_ref_rx = %x\n", __func__, msm_route_ext_ec_ref); - - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = msm_route_ext_ec_ref; - mutex_unlock(&routing_lock); - return 0; -} - -static int msm_routing_ext_ec_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - int mux = ucontrol->value.enumerated.item[0]; - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - int ret = 1; - bool state = true; - uint16_t ext_ec_ref_port_id; - struct snd_soc_dapm_update *update = NULL; - - if (mux >= e->items) { - pr_err("%s: Invalid mux value %d\n", __func__, mux); - return -EINVAL; - } - - mutex_lock(&routing_lock); - msm_route_ext_ec_ref = ucontrol->value.integer.value[0]; - - switch (msm_route_ext_ec_ref) { - case EXT_EC_REF_PRI_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case EXT_EC_REF_SEC_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case EXT_EC_REF_TERT_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case EXT_EC_REF_QUAT_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case EXT_EC_REF_QUIN_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case EXT_EC_REF_SLIM_1_TX: - ext_ec_ref_port_id = SLIMBUS_1_TX; - break; - case EXT_EC_REF_PRI_TDM_TX: - ext_ec_ref_port_id = AFE_PORT_ID_PRIMARY_TDM_TX; - break; - case EXT_EC_REF_SEC_TDM_TX: - ext_ec_ref_port_id = AFE_PORT_ID_SECONDARY_TDM_TX; - break; - case EXT_EC_REF_NONE: - default: - ext_ec_ref_port_id = AFE_PORT_INVALID; - state = false; - break; - } - - pr_debug("%s: val = %d ext_ec_ref_port_id = 0x%0x state = %d\n", - __func__, msm_route_ext_ec_ref, ext_ec_ref_port_id, state); - - if (!voc_set_ext_ec_ref_port_id(ext_ec_ref_port_id, state)) { - mutex_unlock(&routing_lock); - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, mux, e, - update); - } else { - ret = -EINVAL; - mutex_unlock(&routing_lock); - } - return ret; -} - -static const char * const ext_ec_ref_rx[] = {"NONE", "PRI_MI2S_TX", - "SEC_MI2S_TX", "TERT_MI2S_TX", - "QUAT_MI2S_TX", "QUIN_MI2S_TX", - "SLIM_1_TX", "PRI_TDM_TX", - "SEC_TDM_TX"}; - -static const struct soc_enum msm_route_ext_ec_ref_rx_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ext_ec_ref_rx), ext_ec_ref_rx), -}; - -static const struct snd_kcontrol_new voc_ext_ec_mux = - SOC_DAPM_ENUM_EXT("VOC_EXT_EC MUX Mux", msm_route_ext_ec_ref_rx_enum[0], - msm_routing_ext_ec_get, msm_routing_ext_ec_put); - - -static const struct snd_kcontrol_new pri_spdif_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_spdif_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -#ifndef CONFIG_MI2S_DISABLE -static const struct snd_kcontrol_new pri_i2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -}; - -static const struct snd_kcontrol_new senary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -}; - -static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new secondary_mi2s_rx2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX_SD1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int0_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int4_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_meta_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -}; - -static const struct snd_kcontrol_new sec_meta_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - - - -static const struct snd_kcontrol_new mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new pri_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new int0_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new int4_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tert_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quat_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quin_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sen_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - - -static const struct snd_kcontrol_new int0_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT3_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new int4_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT3_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - - -static const struct snd_kcontrol_new mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif -}; - -static const struct snd_kcontrol_new tert_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sen_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new primary_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif -}; - -static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sec_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new int0_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_int0_mi2s_switch_mixer, - msm_routing_put_int0_mi2s_switch_mixer); - -static const struct snd_kcontrol_new int4_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_int4_mi2s_switch_mixer, - msm_routing_put_int4_mi2s_switch_mixer); - -static const struct snd_kcontrol_new sec_i2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_pri_mi2s_switch_mixer, - msm_routing_put_pri_mi2s_switch_mixer); - -static const struct snd_kcontrol_new sec_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_sec_mi2s_switch_mixer, - msm_routing_put_sec_mi2s_switch_mixer); - -static const struct snd_kcontrol_new tert_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_tert_mi2s_switch_mixer, - msm_routing_put_tert_mi2s_switch_mixer); - -static const struct snd_kcontrol_new quat_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_quat_mi2s_switch_mixer, - msm_routing_put_quat_mi2s_switch_mixer); - -static const struct snd_kcontrol_new quin_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_quin_mi2s_switch_mixer, - msm_routing_put_quin_mi2s_switch_mixer); - -static const struct snd_kcontrol_new sen_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_sen_mi2s_switch_mixer, - msm_routing_put_sen_mi2s_switch_mixer); -#endif - -static const struct snd_kcontrol_new hdmi_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new display_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new display_port1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - - /* incall music delivery mixer */ -static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new incall_music2_delivery_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_4_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_5_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_6_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_7_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_7_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_9_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; -static const struct snd_kcontrol_new usb_audio_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int_bt_a2dp_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -#ifndef CONFIG_AUXPCM_DISABLE -static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sen_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; -#endif - -#ifndef CONFIG_TDM_DISABLE -static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = { -static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = { -static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia22", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_2_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_2_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_0_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VoLTE Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_1_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VoLTE Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_2_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VoLTE Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_3_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("Voice Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("Voice2 Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VoLTE Stub", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_0_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_1_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_2_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_3_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_0_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_1_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_2_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_3_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_7_port_mixer_controls[] = { - SOC_DOUBLE_EXT("TERT_TDM_TX_7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_7, - MSM_BACKEND_DAI_TERT_TDM_TX_7, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_0_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_1_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_2_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_3_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_0_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_1_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_2_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_3_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_7_port_mixer_controls[] = { - SOC_DOUBLE_EXT("QUAT_TDM_TX_7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_7, - MSM_BACKEND_DAI_QUAT_TDM_TX_7, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_7, - MSM_BACKEND_DAI_QUIN_TDM_TX_7, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_0_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_1_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_2_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_3_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_0_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_1_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_2_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sen_tdm_rx_3_port_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -#endif - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_7_port_mixer_controls[] = { - SOC_DOUBLE_EXT("TERT_TDM_TX_7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_7, - MSM_BACKEND_DAI_TERT_TDM_TX_7, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_7, - MSM_BACKEND_DAI_QUAT_TDM_TX_7, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_7, - MSM_BACKEND_DAI_QUIN_TDM_TX_7, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; -#endif - -static const struct snd_kcontrol_new mmul1_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul2_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - -}; - -static const struct snd_kcontrol_new mmul3_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul4_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul5_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul6_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul8_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul16_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul9_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul10_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; -static const struct snd_kcontrol_new mmul17_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul18_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul19_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul20_mixer_controls[] = { -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul21_mixer_controls[] = { - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul22_mixer_controls[] = { -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA22, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif -}; - -static const struct snd_kcontrol_new mmul23_mixer_controls[] = { -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif -}; - -static const struct snd_kcontrol_new mmul27_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SENARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul28_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul29_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul30_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -#endif - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_6_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new usb_audio_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx1_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -#ifndef CONFIG_AUXPCM_DISABLE -static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sec_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tert_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quat_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quin_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sen_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; -#endif - -static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_7_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_8_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_1_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_0_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_1_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_2_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_3_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_4_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_5_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_6_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_7_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new stub_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new proxy_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voicemmode1_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT_BT_SCO_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -#endif - - SOC_DOUBLE_EXT("PRI_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PROXY_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voicemmode2_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT_BT_SCO_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -#endif - - SOC_DOUBLE_EXT("PRI_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PROXY_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voip_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -#endif - - SOC_DOUBLE_EXT("PRI_MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_SINGLE_EXT("PRI_TDM_TX_3_Voip", MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voice_stub_mixer_controls[] = { - SOC_DOUBLE_EXT("STUB_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("STUB_1_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -#endif - - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -}; - -static const struct snd_kcontrol_new tx_voice2_stub_mixer_controls[] = { - SOC_DOUBLE_EXT("STUB_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("STUB_1_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -#endif - - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -}; - -static const struct snd_kcontrol_new tx_volte_stub_mixer_controls[] = { - SOC_DOUBLE_EXT("STUB_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("STUB_1_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - -#ifndef CONFIG_AUXPCM_DISABLE - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -#endif - - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -}; - -static const struct snd_kcontrol_new tx_qchat_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_PRI_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEN_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SENARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static int msm_routing_get_ffecns_freeze_event_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = ffecns_freeze_event; - return 0; -} - -static int msm_routing_put_ffecns_freeze_event_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - - ffecns_freeze_event = ucontrol->value.integer.value[0]; - - ret = adm_set_ffecns_freeze_event(ffecns_freeze_event); - if (ret) - pr_err("%s: failed to set ffecns imc event to%d\n", - __func__, ffecns_freeze_event); - - return ret; -} - -static const struct snd_kcontrol_new use_ffecns_freeze_event_controls[] = { - SOC_SINGLE_EXT("FFECNS Freeze Event", SND_SOC_NOPM, 0, - 1, 0, msm_routing_get_ffecns_freeze_event_control, - msm_routing_put_ffecns_freeze_event_control), -}; - -#ifndef CONFIG_AUXPCM_DISABLE -static const struct snd_kcontrol_new aux_pcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sen_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; -#endif - -static const struct snd_kcontrol_new sbus_1_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sbus_3_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_INT_BT_SCO_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_AFE_PCM_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_AUXPCM_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_SLIMBUS_0_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sbus_6_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new bt_sco_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new afe_pcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - - -static const struct snd_kcontrol_new hdmi_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new usb_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_BACKEND_DAI_USB_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new lsm1_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new lsm2_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", - SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new lsm3_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new lsm4_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new lsm5_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new lsm6_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new lsm7_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new lsm8_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_MI2S_DISABLE - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#ifndef CONFIG_TDM_DISABLE - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -#endif -}; - -static const struct snd_kcontrol_new slim_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim1_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim3_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim4_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new cdc_dma_wsa_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new cdc_dma_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new cdc_dma_rx_1_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim6_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new pcm_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_fm_pcmrx_switch_mixer, - msm_routing_put_fm_pcmrx_switch_mixer); - -static const struct snd_kcontrol_new hfp_pri_aux_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new hfp_aux_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new hfp_int_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new hfp_slim7_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new usb_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_usb_switch_mixer, - msm_routing_put_usb_switch_mixer); - -static const struct snd_kcontrol_new a2dp_slim7_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_a2dp_switch_mixer_get, - msm_routing_a2dp_switch_mixer_put); - -static const struct snd_kcontrol_new sco_slim7_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_sco_switch_mixer_get, - msm_routing_sco_switch_mixer_put); - -static const struct soc_enum lsm_port_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lsm_port_text), lsm_port_text); - -static const char * const lsm_func_text[] = { - "None", "AUDIO", "BEACON", "ULTRASOUND", "SWAUDIO", -}; -static const struct soc_enum lsm_func_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lsm_func_text), lsm_func_text); - -static const struct snd_kcontrol_new lsm_controls[] = { - /* kcontrol of lsm_function */ - SOC_ENUM_EXT(SLIMBUS_0_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_1_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_2_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_3_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_4_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_5_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(TERT_MI2S_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(QUAT_MI2S_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(INT3_MI2S_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(TX_CDC_DMA_TX_3_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(QUIN_TDM_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(TERT_TDM_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - /* kcontrol of lsm_port */ - SOC_ENUM_EXT("LSM1 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM2 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM3 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM4 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM5 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM6 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM7 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM8 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), -}; - -static const char * const aanc_slim_0_rx_text[] = { - "ZERO", "SLIMBUS_0_TX", "SLIMBUS_1_TX", "SLIMBUS_2_TX", "SLIMBUS_3_TX", - "SLIMBUS_4_TX", "SLIMBUS_5_TX", "SLIMBUS_6_TX" -}; - -static const struct soc_enum aanc_slim_0_rx_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(aanc_slim_0_rx_text), - aanc_slim_0_rx_text); - -static const struct snd_kcontrol_new aanc_slim_0_rx_mux[] = { - SOC_ENUM_EXT("AANC_SLIM_0_RX MUX", aanc_slim_0_rx_enum, - msm_routing_slim_0_rx_aanc_mux_get, - msm_routing_slim_0_rx_aanc_mux_put) -}; - -static int msm_routing_aanc_noise_level_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = aanc_level; - - return 0; -} - -static int msm_routing_aanc_noise_level_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - - mutex_lock(&routing_lock); - aanc_level = ucontrol->value.integer.value[0]; - pr_debug("%s: value: %ld\n", - __func__, ucontrol->value.integer.value[0]); - ret = afe_set_aanc_noise_level(aanc_level); - mutex_unlock(&routing_lock); - - return ret; -} - -static const struct snd_kcontrol_new aanc_noise_level[] = { - SOC_SINGLE_EXT("AANC Noise Level", SND_SOC_NOPM, 0, 255, - 0, msm_routing_aanc_noise_level_get, msm_routing_aanc_noise_level_put) -}; - -static int msm_routing_get_stereo_to_custom_stereo_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = is_custom_stereo_on; - return 0; -} - -static int msm_routing_put_stereo_to_custom_stereo_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int flag = 0, i = 0, rc = 0, idx = 0; - int be_index = 0, port_id, topo_id; - unsigned int session_id = 0; - uint16_t op_FL_ip_FL_weight = 0; - uint16_t op_FL_ip_FR_weight = 0; - uint16_t op_FR_ip_FL_weight = 0; - uint16_t op_FR_ip_FR_weight = 0; - - flag = ucontrol->value.integer.value[0]; - pr_debug("%s E flag %d\n", __func__, flag); - - if ((is_custom_stereo_on && flag) || (!is_custom_stereo_on && !flag)) { - pr_err("%s: is_custom_stereo_on %d, flag %d\n", - __func__, is_custom_stereo_on, flag); - return 0; - } - is_custom_stereo_on = flag ? true : false; - pr_debug("%s:is_custom_stereo_on %d\n", __func__, is_custom_stereo_on); - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - port_id = msm_bedais[be_index].port_id; - if (!msm_bedais[be_index].active) - continue; - if ((port_id != SLIMBUS_0_RX) && - (port_id != RT_PROXY_PORT_001_RX) && - (port_id != AFE_PORT_ID_PRIMARY_MI2S_RX) && - (port_id != AFE_PORT_ID_INT4_MI2S_RX)) - continue; - - for_each_set_bit(i, &msm_bedais[be_index].fe_sessions[0], - MSM_FRONTEND_DAI_MM_SIZE) { - if (fe_dai_map[i][SESSION_TYPE_RX].perf_mode != - LEGACY_PCM_MODE) - goto skip_send_custom_stereo; - session_id = - fe_dai_map[i][SESSION_TYPE_RX].strm_id; - if (is_custom_stereo_on) { - op_FL_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FL_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - } else { - op_FL_ip_FL_weight = Q14_GAIN_UNITY; - op_FL_ip_FR_weight = 0; - op_FR_ip_FL_weight = 0; - op_FR_ip_FR_weight = Q14_GAIN_UNITY; - } - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - unsigned long copp = - session_copp_map[i] - [SESSION_TYPE_RX][be_index]; - if (!test_bit(idx, &copp)) - goto skip_send_custom_stereo; - topo_id = adm_get_topology_for_port_copp_idx( - msm_bedais[be_index].port_id, idx); - if (topo_id < 0) - pr_debug("%s:Err:custom stereo topo %d", - __func__, topo_id); - pr_debug("idx %d\n", idx); - if (topo_id == DS2_ADM_COPP_TOPOLOGY_ID) - rc = msm_ds2_dap_set_custom_stereo_onoff - (msm_bedais[be_index].port_id, - idx, is_custom_stereo_on); - else if (topo_id == DOLBY_ADM_COPP_TOPOLOGY_ID) - rc = dolby_dap_set_custom_stereo_onoff( - msm_bedais[be_index].port_id, - idx, is_custom_stereo_on); - else - rc = msm_qti_pp_send_stereo_to_custom_stereo_cmd - (msm_bedais[be_index].port_id, - idx, session_id, - op_FL_ip_FL_weight, - op_FL_ip_FR_weight, - op_FR_ip_FL_weight, - op_FR_ip_FR_weight); - if (rc < 0) -skip_send_custom_stereo: - pr_err("%s: err setting custom stereo\n", - __func__); - } - - } - } - return 0; -} - -static const struct snd_kcontrol_new stereo_to_custom_stereo_controls[] = { - SOC_SINGLE_EXT("Set Custom Stereo OnOff", SND_SOC_NOPM, 0, - 1, 0, msm_routing_get_stereo_to_custom_stereo_control, - msm_routing_put_stereo_to_custom_stereo_control), -}; - -static int msm_routing_get_app_type_cfg_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static int msm_routing_put_app_type_cfg_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i = 0, j; - int num_app_types = ucontrol->value.integer.value[i++]; - - pr_debug("%s\n", __func__); - - memset(app_type_cfg, 0, MAX_APP_TYPES* - sizeof(struct msm_pcm_routing_app_type_data)); - if (num_app_types > MAX_APP_TYPES) { - pr_err("%s: number of app types exceed the max supported\n", - __func__); - return -EINVAL; - } - for (j = 0; j < num_app_types; j++) { - app_type_cfg[j].app_type = - ucontrol->value.integer.value[i++]; - app_type_cfg[j].sample_rate = - ucontrol->value.integer.value[i++]; - app_type_cfg[j].bit_width = - ucontrol->value.integer.value[i++]; - } - - return 0; -} - -static int msm_routing_put_app_type_gain_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int j, fe_id, be_id, port_type; - int ret = 0; - unsigned long copp; - struct msm_pcm_routing_bdai_data *bedai; - int dir = ucontrol->value.integer.value[0] ? SESSION_TYPE_TX : - SESSION_TYPE_RX; - int app_type = ucontrol->value.integer.value[1]; - int gain = (ucontrol->value.integer.value[2] + - ucontrol->value.integer.value[3])/2; - - port_type = (dir == SESSION_TYPE_RX) ? MSM_AFE_PORT_TYPE_RX : - MSM_AFE_PORT_TYPE_TX; - - mutex_lock(&routing_lock); - for (be_id = 0; be_id < MSM_BACKEND_DAI_MAX; be_id++) { - if (is_be_dai_extproc(be_id)) - continue; - - bedai = &msm_bedais[be_id]; - if (afe_get_port_type(bedai->port_id) != port_type) - continue; - - if (!bedai->active) - continue; - - for (fe_id = 0; fe_id < MSM_FRONTEND_DAI_MAX; fe_id++) { - if (!test_bit(fe_id, &bedai->fe_sessions[0])) - continue; - - if (app_type != - fe_dai_app_type_cfg[fe_id][dir][be_id].app_type) - continue; - - copp = session_copp_map[fe_id][dir][be_id]; - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - if (!test_bit(j, &copp)) - continue; - ret |= adm_set_volume(bedai->port_id, j, gain); - } - } - } - mutex_unlock(&routing_lock); - return ret ? -EINVAL : 0; -} - -static const struct snd_kcontrol_new app_type_cfg_controls[] = { - SOC_SINGLE_MULTI_EXT("App Type Config", SND_SOC_NOPM, 0, - 0x7FFFFFFF, 0, 128, msm_routing_get_app_type_cfg_control, - msm_routing_put_app_type_cfg_control), - SOC_SINGLE_MULTI_EXT("App Type Gain", SND_SOC_NOPM, 0, - 0x2000, 0, 4, NULL, msm_routing_put_app_type_gain_control) -}; - -static int msm_routing_put_module_cfg_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int copp_idx, fe_id, be_id, port_type; - int ret = 0; - unsigned long copp; - struct msm_pcm_routing_bdai_data *bedai; - u8 *packed_params = NULL; - struct param_hdr_v3 param_hdr; - u32 packed_param_size = (sizeof(struct param_hdr_v3) + - sizeof(uint32_t)); - - int dir = ucontrol->value.integer.value[0] ? SESSION_TYPE_TX : - SESSION_TYPE_RX; - int app_type = ucontrol->value.integer.value[1]; - int module_id = ucontrol->value.integer.value[2]; - int instance_id = ucontrol->value.integer.value[3]; - int param_id = ucontrol->value.integer.value[4]; - int param_value = ucontrol->value.integer.value[5]; - - port_type = (dir == SESSION_TYPE_RX) ? MSM_AFE_PORT_TYPE_RX : - MSM_AFE_PORT_TYPE_TX; - pr_debug("%s app_type:%d mod_id:%d instance_id:%d param_id:%d value:%d\n", - __func__, app_type, module_id, - instance_id, param_id, param_value); - - packed_params = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_params) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = module_id; - param_hdr.instance_id = instance_id; - param_hdr.param_id = param_id; - param_hdr.param_size = sizeof(uint32_t); - - packed_param_size = 0; - - mutex_lock(&routing_lock); - for (be_id = 0; be_id < MSM_BACKEND_DAI_MAX; be_id++) { - if (is_be_dai_extproc(be_id)) - continue; - - bedai = &msm_bedais[be_id]; - if (afe_get_port_type(bedai->port_id) != port_type) - continue; - - if (!bedai->active) - continue; - - for (fe_id = 0; fe_id < MSM_FRONTEND_DAI_MAX; fe_id++) { - if (!test_bit(fe_id, &bedai->fe_sessions[0])) - continue; - - if (app_type != - fe_dai_app_type_cfg[fe_id][dir][be_id].app_type) - continue; - - copp = session_copp_map[fe_id][dir][be_id]; - for (copp_idx = 0; copp_idx < MAX_COPPS_PER_PORT; - copp_idx++) { - if (!test_bit(copp_idx, &copp)) - continue; - - ret = q6common_pack_pp_params(packed_params, - ¶m_hdr, - (u8 *) ¶m_value, - &packed_param_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, ret); - goto done; - } - - ret = adm_set_pp_params(bedai->port_id, - copp_idx, NULL, - packed_params, - packed_param_size); - if (ret) { - pr_err("%s: Setting param failed with err=%d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - } - } - } -done: - mutex_unlock(&routing_lock); - kfree(packed_params); - return ret; -} - -static const struct snd_kcontrol_new module_cfg_controls[] = { - SOC_SINGLE_MULTI_EXT("Audio Effect", SND_SOC_NOPM, 0, - 0x2000, 0, 6, NULL, msm_routing_put_module_cfg_control) -}; - -static int msm_routing_get_lsm_app_type_cfg_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int shift = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int i = 0, j = 0; - - ucontrol->value.integer.value[i] = num_app_cfg_types; - - for (j = 0; j < num_app_cfg_types; ++j) { - ucontrol->value.integer.value[++i] = - lsm_app_type_cfg[j].app_type; - ucontrol->value.integer.value[++i] = - lsm_app_type_cfg[j].sample_rate; - ucontrol->value.integer.value[++i] = - lsm_app_type_cfg[j].bit_width; - if (shift == 1) - ucontrol->value.integer.value[++i] = - lsm_app_type_cfg[j].num_out_channels; - } - return 0; -} - -static int msm_routing_put_lsm_app_type_cfg_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int shift = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int i = 0, j; - - if (ucontrol->value.integer.value[0] > MAX_APP_TYPES) { - pr_err("%s: number of app types exceed the max supported\n", - __func__); - return -EINVAL; - } - - num_app_cfg_types = ucontrol->value.integer.value[i++]; - memset(lsm_app_type_cfg, 0, MAX_APP_TYPES* - sizeof(struct msm_pcm_routing_app_type_data)); - - for (j = 0; j < num_app_cfg_types; j++) { - lsm_app_type_cfg[j].app_type = - ucontrol->value.integer.value[i++]; - lsm_app_type_cfg[j].sample_rate = - ucontrol->value.integer.value[i++]; - lsm_app_type_cfg[j].bit_width = - ucontrol->value.integer.value[i++]; - /* Shift of 1 indicates this is V2 mixer control */ - if (shift == 1) - lsm_app_type_cfg[j].num_out_channels = - ucontrol->value.integer.value[i++]; - } - - return 0; -} - -static const struct snd_kcontrol_new lsm_app_type_cfg_controls[] = { - SOC_SINGLE_MULTI_EXT("Listen App Type Config", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, 128, msm_routing_get_lsm_app_type_cfg_control, - msm_routing_put_lsm_app_type_cfg_control), - SOC_SINGLE_MULTI_EXT("Listen App Type Config V2", SND_SOC_NOPM, 1, - 0xFFFFFFFF, 0, 128, msm_routing_get_lsm_app_type_cfg_control, - msm_routing_put_lsm_app_type_cfg_control), -}; - -static int msm_routing_get_use_ds1_or_ds2_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = is_ds2_on; - return 0; -} - -static int msm_routing_put_use_ds1_or_ds2_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - is_ds2_on = ucontrol->value.integer.value[0]; - return 0; -} - -static const struct snd_kcontrol_new use_ds1_or_ds2_controls[] = { - SOC_SINGLE_EXT("DS2 OnOff", SND_SOC_NOPM, 0, - 1, 0, msm_routing_get_use_ds1_or_ds2_control, - msm_routing_put_use_ds1_or_ds2_control), -}; - -static int msm_routing_get_hifi_filter_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = hifi_filter_enabled; - return 0; -} - -static int msm_routing_put_hifi_filter_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - hifi_filter_enabled = ucontrol->value.integer.value[0]; - return 0; -} - -static const struct snd_kcontrol_new hifi_filter_controls[] = { - SOC_SINGLE_EXT("HiFi Filter", SND_SOC_NOPM, 0, - 1, 0, msm_routing_get_hifi_filter_control, - msm_routing_put_hifi_filter_control), -}; - -int msm_routing_get_rms_value_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int be_idx = 0; - char *param_value; - int *update_param_value; - uint32_t param_size = (RMS_PAYLOAD_LEN + 1) * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - - param_value = kzalloc(param_size, GFP_KERNEL); - if (!param_value) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) - if (msm_bedais[be_idx].port_id == SLIMBUS_0_TX) - break; - if ((be_idx < MSM_BACKEND_DAI_MAX) && msm_bedais[be_idx].active) { - param_hdr.module_id = RMS_MODULEID_APPI_PASSTHRU; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = RMS_PARAM_FIRST_SAMPLE; - param_hdr.param_size = param_size; - rc = adm_get_pp_params(SLIMBUS_0_TX, 0, ADM_CLIENT_ID_DEFAULT, - NULL, ¶m_hdr, (u8 *) param_value); - if (rc) { - pr_err("%s: get parameters failed:%d\n", __func__, rc); - kfree(param_value); - return -EINVAL; - } - update_param_value = (int *)param_value; - ucontrol->value.integer.value[0] = update_param_value[0]; - - pr_debug("%s: FROM DSP value[0] 0x%x\n", - __func__, update_param_value[0]); - } - kfree(param_value); - return 0; -} - -static int msm_voc_session_id_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - voc_session_id = ucontrol->value.integer.value[0]; - - pr_debug("%s: voc_session_id=%u\n", __func__, voc_session_id); - - return 0; -} - -static int msm_voc_session_id_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = voc_session_id; - - return 0; -} - -static struct snd_kcontrol_new msm_voc_session_controls[] = { - SOC_SINGLE_MULTI_EXT("Voc VSID", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, 1, msm_voc_session_id_get, - msm_voc_session_id_put), -}; - -static int msm_sound_focus_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct sound_focus_param); - - return 0; -} - -static int msm_voice_sound_focus_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - - memcpy((void *)&soundFocusData, ucontrol->value.bytes.data, - sizeof(struct sound_focus_param)); - ret = voc_set_sound_focus(soundFocusData); - if (ret) { - pr_err("%s: Error setting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - } - - return ret; -} - -static int msm_voice_sound_focus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - - memset(&soundFocusData, 0, sizeof(struct sound_focus_param)); - - ret = voc_get_sound_focus(&soundFocusData); - if (ret) { - pr_debug("%s: Error getting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - memcpy(ucontrol->value.bytes.data, (void *)&soundFocusData, - sizeof(struct sound_focus_param)); - -done: - return ret; -} - -static int msm_source_tracking_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct source_tracking_param); - - return 0; -} - -static int msm_voice_source_tracking_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct source_tracking_param sourceTrackingData; - - memset(&sourceTrackingData, 0, sizeof(struct source_tracking_param)); - - ret = voc_get_source_tracking(&sourceTrackingData); - if (ret) { - pr_debug("%s: Error getting Source Tracking Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - memcpy(ucontrol->value.bytes.data, (void *)&sourceTrackingData, - sizeof(struct source_tracking_param)); - -done: - return ret; -} - -static int msm_audio_get_copp_idx_from_port_id(int port_id, int session_type, - int *copp_idx) -{ - int i, idx, be_idx; - int ret = 0; - unsigned long copp; - - pr_debug("%s: Enter, port_id=%d\n", __func__, port_id); - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port validation failed id 0x%x ret %d\n", - __func__, port_id, ret); - - ret = -EINVAL; - goto done; - } - - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - if (msm_bedais[be_idx].port_id == port_id) - break; - } - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Invalid be id %d\n", __func__, be_idx); - - ret = -EINVAL; - goto done; - } - - for_each_set_bit(i, &msm_bedais[be_idx].fe_sessions[0], - MSM_FRONTEND_DAI_MAX) { - if (!(is_mm_lsm_fe_id(i) && - route_check_fe_id_adm_support(i))) - continue; - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - copp = session_copp_map[i] - [session_type][be_idx]; - if (test_bit(idx, &copp)) - break; - } - if (idx >= MAX_COPPS_PER_PORT) - continue; - else - break; - } - if (i >= MSM_FRONTEND_DAI_MAX) { - pr_debug("%s: Invalid FE, exiting\n", __func__); - - ret = -EINVAL; - goto done; - } - *copp_idx = idx; - pr_debug("%s: copp_idx=%d\n", __func__, *copp_idx); - -done: - return ret; -} - -static int msm_audio_sound_focus_derive_port_id(struct snd_kcontrol *kcontrol, - const char *prefix, int *port_id) -{ - int ret = 0; - - pr_debug("%s: Enter, prefix:%s\n", __func__, prefix); - - /* - * Mixer control name will be like "Sound Focus Audio Tx SLIMBUS_0" - * where the prefix is "Sound Focus Audio Tx ". Skip the prefix - * and compare the string with the backend name to derive the port id. - */ - if (!strcmp(kcontrol->id.name + strlen(prefix), - "SLIMBUS_0")) { - *port_id = SLIMBUS_0_TX; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "TERT_MI2S")) { - *port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "INT3_MI2S")) { - *port_id = AFE_PORT_ID_INT3_MI2S_TX; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "VA_CDC_DMA_TX_0")) { - *port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "TX_CDC_DMA_TX_3")) { - *port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "QUIN_TDM_TX_0")) { - *port_id = AFE_PORT_ID_QUINARY_TDM_TX; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "PRIMARY_TDM")) { - *port_id = AFE_PORT_ID_PRIMARY_TDM_TX; - } else { - pr_err("%s: mixer ctl name=%s, could not derive valid port id\n", - __func__, kcontrol->id.name); - - ret = -EINVAL; - goto done; - } - pr_debug("%s: mixer ctl name=%s, derived port_id=%d\n", - __func__, kcontrol->id.name, *port_id); - -done: - return ret; -} - -static int msm_audio_sound_focus_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - int port_id, copp_idx; - - ret = msm_audio_sound_focus_derive_port_id(kcontrol, - "Sound Focus Audio Tx ", &port_id); - if (ret != 0) { - pr_err("%s: Error in deriving port id, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX, - &copp_idx); - if (ret) { - pr_err("%s: Could not get copp idx for port_id=%d\n", - __func__, port_id); - - ret = -EINVAL; - goto done; - } - - memcpy((void *)&soundFocusData, ucontrol->value.bytes.data, - sizeof(struct sound_focus_param)); - - ret = adm_set_sound_focus(port_id, copp_idx, soundFocusData); - if (ret) { - pr_err("%s: Error setting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - -done: - return ret; -} - -static int msm_audio_sound_focus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - int port_id, copp_idx; - - ret = msm_audio_sound_focus_derive_port_id(kcontrol, - "Sound Focus Audio Tx ", &port_id); - if (ret) { - pr_err("%s: Error in deriving port id, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX, - &copp_idx); - if (ret) { - pr_debug("%s: Could not get copp idx for port_id=%d\n", - __func__, port_id); - - ret = -EINVAL; - goto done; - } - - ret = adm_get_sound_focus(port_id, copp_idx, &soundFocusData); - if (ret) { - pr_err("%s: Error getting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&soundFocusData, - sizeof(struct sound_focus_param)); - -done: - return ret; -} - -static int msm_audio_source_tracking_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct source_tracking_param sourceTrackingData; - int port_id, copp_idx; - - ret = msm_audio_sound_focus_derive_port_id(kcontrol, - "Source Tracking Audio Tx ", &port_id); - if (ret) { - pr_err("%s: Error in deriving port id, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX, - &copp_idx); - if (ret) { - pr_debug("%s: Could not get copp idx for port_id=%d\n", - __func__, port_id); - - ret = -EINVAL; - goto done; - } - - ret = adm_get_source_tracking(port_id, copp_idx, &sourceTrackingData); - if (ret) { - pr_err("%s: Error getting Source Tracking Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&sourceTrackingData, - sizeof(struct source_tracking_param)); - -done: - return ret; -} - -static int msm_doa_tracking_mon_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct doa_tracking_mon_param); - - return 0; -} - -static int msm_doa_tracking_mon_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct doa_tracking_mon_param doa_tracking_data; - int port_id, copp_idx; - - memset(&doa_tracking_data, 0, sizeof(struct doa_tracking_mon_param)); - ret = msm_audio_sound_focus_derive_port_id(kcontrol, - "Doa Tracking Monitor Listen ", &port_id); - if (ret) { - pr_err("%s: Error in deriving port id, err=%d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - /* - * If copp id exists for given port id, query adm to get doa data. - * Else query afe for doa tracking params. - * This is to support in cases where LSM directly connects to - * AFE for FFNS. - */ - ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX, - &copp_idx); - if (!ret) - ret = adm_get_doa_tracking_mon(port_id, copp_idx, - &doa_tracking_data); - else - ret = afe_get_doa_tracking_mon(port_id, &doa_tracking_data); - - if (ret) { - pr_err("%s: Error getting Doa Tracking Params, err=%d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&doa_tracking_data, - sizeof(struct doa_tracking_mon_param)); -done: - return ret; -} - -static const struct snd_kcontrol_new msm_source_tracking_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx SLIMBUS_0", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx SLIMBUS_0", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx SLIMBUS_0", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx SLIMBUS_0", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx TERT_MI2S", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx TERT_MI2S", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx TERT_MI2S", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx TERT_MI2S", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx INT3_MI2S", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx INT3_MI2S", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx INT3_MI2S", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx INT3_MI2S", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx VA_CDC_DMA_TX_0", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx VA_CDC_DMA_TX_0", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx VA_CDC_DMA_TX_0", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx VA_CDC_DMA_TX_0", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx TX_CDC_DMA_TX_3", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx TX_CDC_DMA_TX_3", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx TX_CDC_DMA_TX_3", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx TX_CDC_DMA_TX_3", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx QUIN_TDM_TX_0", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx QUIN_TDM_TX_0", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx QUIN_TDM_TX_0", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx QUIN_TDM_TX_0", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx PRIMARY_TDM", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx PRIMARY_TDM", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Doa Tracking Monitor Listen VA_CDC_DMA_TX_0", - .info = msm_doa_tracking_mon_info, - .get = msm_doa_tracking_mon_get, - }, -}; - -static int spkr_prot_put_vi_lch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int item; - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - pr_debug("%s item is %d\n", __func__, - ucontrol->value.enumerated.item[0]); - mutex_lock(&routing_lock); - item = ucontrol->value.enumerated.item[0]; - if (item < e->items) { - pr_debug("%s RX DAI ID %d TX DAI id %d\n", - __func__, e->shift_l, e->values[item]); - if (e->shift_l < MSM_BACKEND_DAI_MAX && - e->values[item] < MSM_BACKEND_DAI_MAX) - /* Enable feedback TX path */ - ret = afe_spk_prot_feed_back_cfg( - msm_bedais[e->values[item]].port_id, - msm_bedais[e->shift_l].port_id, 1, 0, 1); - else { - pr_debug("%s values are out of range item %d\n", - __func__, e->values[item]); - /* Disable feedback TX path */ - if (e->values[item] == MSM_BACKEND_DAI_MAX) - ret = afe_spk_prot_feed_back_cfg(0, 0, 0, 0, 0); - else - ret = -EINVAL; - } - } else { - pr_err("%s item value is out of range item\n", __func__); - ret = -EINVAL; - } - mutex_unlock(&routing_lock); - return ret; -} - -static int spkr_prot_put_vi_rch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int item; - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - pr_debug("%s item is %d\n", __func__, - ucontrol->value.enumerated.item[0]); - mutex_lock(&routing_lock); - item = ucontrol->value.enumerated.item[0]; - if (item < e->items) { - pr_debug("%s RX DAI ID %d TX DAI id %d\n", - __func__, e->shift_l, e->values[item]); - if (e->shift_l < MSM_BACKEND_DAI_MAX && - e->values[item] < MSM_BACKEND_DAI_MAX) - /* Enable feedback TX path */ - ret = afe_spk_prot_feed_back_cfg( - msm_bedais[e->values[item]].port_id, - msm_bedais[e->shift_l].port_id, - 1, 1, 1); - else { - pr_debug("%s values are out of range item %d\n", - __func__, e->values[item]); - /* Disable feedback TX path */ - if (e->values[item] == MSM_BACKEND_DAI_MAX) - ret = afe_spk_prot_feed_back_cfg(0, - 0, 0, 0, 0); - else - ret = -EINVAL; - } - } else { - pr_err("%s item value is out of range item\n", __func__); - ret = -EINVAL; - } - mutex_unlock(&routing_lock); - return ret; -} - -static int spkr_prot_get_vi_lch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s\n", __func__); - return 0; -} - -static int spkr_prot_get_vi_rch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s\n", __func__); - ucontrol->value.enumerated.item[0] = 0; - return 0; -} - -static const char * const slim0_rx_vi_fb_tx_lch_mux_text[] = { - "ZERO", "SLIM4_TX" -}; - -static const char * const slim0_rx_vi_fb_tx_rch_mux_text[] = { - "ZERO", "SLIM4_TX" -}; - -static const char * const wsa_rx_0_vi_fb_tx_lch_mux_text[] = { - "ZERO", "WSA_CDC_DMA_TX_0" -}; - -static const char * const wsa_rx_0_vi_fb_tx_rch_mux_text[] = { - "ZERO", "WSA_CDC_DMA_TX_0" -}; - -static const char * const mi2s_rx_vi_fb_tx_mux_text[] = { - "ZERO", "SENARY_TX" -}; - -static const char * const int4_mi2s_rx_vi_fb_tx_mono_mux_text[] = { - "ZERO", "INT5_MI2S_TX" -}; - -static const char * const int4_mi2s_rx_vi_fb_tx_stereo_mux_text[] = { - "ZERO", "INT5_MI2S_TX" -}; - -static const int slim0_rx_vi_fb_tx_lch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX -}; - -static const int slim0_rx_vi_fb_tx_rch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX -}; - -static const int wsa_rx_0_vi_fb_tx_lch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0 -}; - -static const int wsa_rx_0_vi_fb_tx_rch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0 -}; - - -static const int mi2s_rx_vi_fb_tx_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SENARY_MI2S_TX -}; - -static const int int4_mi2s_rx_vi_fb_tx_mono_ch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX -}; - -static const int int4_mi2s_rx_vi_fb_tx_stereo_ch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX -}; - -static const struct soc_enum slim0_rx_vi_fb_lch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_SLIMBUS_0_RX, 0, 0, - ARRAY_SIZE(slim0_rx_vi_fb_tx_lch_mux_text), - slim0_rx_vi_fb_tx_lch_mux_text, slim0_rx_vi_fb_tx_lch_value); - -static const struct soc_enum slim0_rx_vi_fb_rch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_SLIMBUS_0_RX, 0, 0, - ARRAY_SIZE(slim0_rx_vi_fb_tx_rch_mux_text), - slim0_rx_vi_fb_tx_rch_mux_text, slim0_rx_vi_fb_tx_rch_value); - -static const struct soc_enum wsa_rx_0_vi_fb_lch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, 0, 0, - ARRAY_SIZE(wsa_rx_0_vi_fb_tx_lch_mux_text), - wsa_rx_0_vi_fb_tx_lch_mux_text, wsa_rx_0_vi_fb_tx_lch_value); - -static const struct soc_enum wsa_rx_0_vi_fb_rch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, 0, 0, - ARRAY_SIZE(wsa_rx_0_vi_fb_tx_rch_mux_text), - wsa_rx_0_vi_fb_tx_rch_mux_text, wsa_rx_0_vi_fb_tx_rch_value); - -static const struct soc_enum mi2s_rx_vi_fb_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_PRI_MI2S_RX, 0, 0, - ARRAY_SIZE(mi2s_rx_vi_fb_tx_mux_text), - mi2s_rx_vi_fb_tx_mux_text, mi2s_rx_vi_fb_tx_value); - -static const struct soc_enum int4_mi2s_rx_vi_fb_mono_ch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_INT4_MI2S_RX, 0, 0, - ARRAY_SIZE(int4_mi2s_rx_vi_fb_tx_mono_mux_text), - int4_mi2s_rx_vi_fb_tx_mono_mux_text, - int4_mi2s_rx_vi_fb_tx_mono_ch_value); - -static const struct soc_enum int4_mi2s_rx_vi_fb_stereo_ch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_INT4_MI2S_RX, 0, 0, - ARRAY_SIZE(int4_mi2s_rx_vi_fb_tx_stereo_mux_text), - int4_mi2s_rx_vi_fb_tx_stereo_mux_text, - int4_mi2s_rx_vi_fb_tx_stereo_ch_value); - -static const struct snd_kcontrol_new slim0_rx_vi_fb_lch_mux = - SOC_DAPM_ENUM_EXT("SLIM0_RX_VI_FB_LCH_MUX", - slim0_rx_vi_fb_lch_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new slim0_rx_vi_fb_rch_mux = - SOC_DAPM_ENUM_EXT("SLIM0_RX_VI_FB_RCH_MUX", - slim0_rx_vi_fb_rch_mux_enum, spkr_prot_get_vi_rch_port, - spkr_prot_put_vi_rch_port); - -static const struct snd_kcontrol_new wsa_rx_0_vi_fb_lch_mux = - SOC_DAPM_ENUM_EXT("WSA_RX_0_VI_FB_LCH_MUX", - wsa_rx_0_vi_fb_lch_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new wsa_rx_0_vi_fb_rch_mux = - SOC_DAPM_ENUM_EXT("WSA_RX_0_VI_FB_RCH_MUX", - wsa_rx_0_vi_fb_rch_mux_enum, spkr_prot_get_vi_rch_port, - spkr_prot_put_vi_rch_port); - -static const struct snd_kcontrol_new mi2s_rx_vi_fb_mux = - SOC_DAPM_ENUM_EXT("PRI_MI2S_RX_VI_FB_MUX", - mi2s_rx_vi_fb_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new int4_mi2s_rx_vi_fb_mono_ch_mux = - SOC_DAPM_ENUM_EXT("INT4_MI2S_RX_VI_FB_MONO_CH_MUX", - int4_mi2s_rx_vi_fb_mono_ch_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new int4_mi2s_rx_vi_fb_stereo_ch_mux = - SOC_DAPM_ENUM_EXT("INT4_MI2S_RX_VI_FB_STEREO_CH_MUX", - int4_mi2s_rx_vi_fb_stereo_ch_mux_enum, spkr_prot_get_vi_rch_port, - spkr_prot_put_vi_rch_port); - -static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { - /* Frontend AIF */ - /* Widget name equals to Front-End DAI name, - * Stream name must contains substring of front-end dai name - */ - SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL5", "MultiMedia5 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL6", "MultiMedia6 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL7", "MultiMedia7 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL8", "MultiMedia8 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL9", "MultiMedia9 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL10", "MultiMedia10 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL11", "MultiMedia11 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL12", "MultiMedia12 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL13", "MultiMedia13 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL14", "MultiMedia14 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL15", "MultiMedia15 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL16", "MultiMedia16 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL20", "MultiMedia20 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL21", "MultiMedia21 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL22", "MultiMedia22 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL23", "MultiMedia23 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL26", "MultiMedia26 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL3", "MultiMedia3 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL4", "MultiMedia4 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL5", "MultiMedia5 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL6", "MultiMedia6 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL8", "MultiMedia8 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL9", "MultiMedia9 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL10", "MultiMedia10 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL16", "MultiMedia16 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL17", "MultiMedia17 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL18", "MultiMedia18 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL19", "MultiMedia19 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL20", "MultiMedia20 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL21", "MultiMedia21 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL22", "MultiMedia22 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL23", "MultiMedia23 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL27", "MultiMedia27 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL28", "MultiMedia28 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL29", "MultiMedia29 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL30", "MultiMedia30 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICEMMODE1_DL", - "VoiceMMode1 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICEMMODE1_UL", - "VoiceMMode1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICEMMODE2_DL", - "VoiceMMode2 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICEMMODE2_UL", - "VoiceMMode2 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("CDC_DMA_DL_HL", "CDC_DMA_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("CDC_DMA_UL_HL", "CDC_DMA_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TX3_CDC_DMA_UL_HL", - "TX3_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("CPE_LSM_UL_HL", "CPE LSM capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM1_DL_HL", "SLIMBUS1_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM1_UL_HL", "SLIMBUS1_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM3_DL_HL", "SLIMBUS3_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM3_UL_HL", "SLIMBUS3_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM4_DL_HL", "SLIMBUS4_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM4_UL_HL", "SLIMBUS4_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM6_DL_HL", "SLIMBUS6_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM6_UL_HL", "SLIMBUS6_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM7_DL_HL", "SLIMBUS7_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM7_UL_HL", "SLIMBUS7_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM8_DL_HL", "SLIMBUS8_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM8_UL_HL", "SLIMBUS8_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INTHFP_DL_HL", "INT_HFP_BT_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INTHFP_UL_HL", "INT_HFP_BT_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("USBAUDIO_DL_HL", "USBAUDIO_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("USBAUDIO_UL_HL", "USBAUDIO_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("DTMF_DL_HL", "DTMF_RX_HOSTLESS Playback", - 0, 0, 0, 0), - /* LSM */ - SND_SOC_DAPM_AIF_OUT("LSM1_UL_HL", "Listen 1 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM2_UL_HL", "Listen 2 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM3_UL_HL", "Listen 3 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM4_UL_HL", "Listen 4 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM5_UL_HL", "Listen 5 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM6_UL_HL", "Listen 6 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM7_UL_HL", "Listen 7 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM8_UL_HL", "Listen 8 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QCHAT_DL", "QCHAT Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QCHAT_UL", "QCHAT Capture", 0, 0, 0, 0), - /* Backend AIF */ - /* Stream name equals to backend dai link stream name */ - SND_SOC_DAPM_AIF_OUT("PRI_SPDIF_RX", "Primary SPDIF Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_SPDIF_TX", "Primary SPDIF Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_SPDIF_RX", "Secondary SPDIF Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_SPDIF_TX", "Secondary SPDIF Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_RX", "Slimbus2 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_RX", "Slimbus5 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT", "Display Port Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT1", "Display Port1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT_BT_A2DP_RX", "Internal BT-A2DP Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("WSA_CDC_DMA_RX_0", "WSA CDC DMA0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_0", "WSA CDC DMA0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("WSA_CDC_DMA_RX_1", "WSA CDC DMA1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_1", "WSA CDC DMA1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_2", "WSA CDC DMA2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VA_CDC_DMA_TX_0", "VA CDC DMA0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VA_CDC_DMA_TX_1", "VA CDC DMA1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VA_CDC_DMA_TX_2", "VA CDC DMA2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_0", "RX CDC DMA0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_0", "TX CDC DMA0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_1", "RX CDC DMA1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_1", "TX CDC DMA1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_2", "RX CDC DMA2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_2", "TX CDC DMA2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_3", "RX CDC DMA3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_3", "TX CDC DMA3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_4", "RX CDC DMA4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_4", "TX CDC DMA4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_5", "RX CDC DMA5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_5", "TX CDC DMA5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_6", "RX CDC DMA6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_7", "RX CDC DMA7 Playback", - 0, 0, 0, 0), - /* incall */ - SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICE2_PLAYBACK_TX", "Voice2 Farend Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_2_TX", "Slimbus2 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICE2_STUB_DL", "VOICE2_STUB Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICE2_STUB_UL", "VOICE2_STUB Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOLTE_STUB_DL", "VOLTE_STUB Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOLTE_STUB_UL", "VOLTE_STUB Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("STUB_1_TX", "Stub1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_3_TX", "Slimbus3 Capture", 0, 0, 0, 0), - /* In- call recording */ - SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_RX", "Slimbus6 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_6_TX", "Slimbus6 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("AFE_LOOPBACK_TX", "AFE Loopback Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_7_RX", "Slimbus7 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_7_TX", "Slimbus7 Capture", 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_OUT("SLIMBUS_8_RX", "Slimbus8 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_8_TX", "Slimbus8 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_9_RX", "Slimbus9 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_9_TX", "Slimbus9 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("USB_AUDIO_RX", "USB Audio Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("USB_AUDIO_TX", "USB Audio Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PROXY_RX", "Proxy Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PROXY_TX", "Proxy Capture", 0, 0, 0, 0), - - /* Switch Definitions */ - SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0, - &slim_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS1_DL_HL", SND_SOC_NOPM, 0, 0, - &slim1_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS3_DL_HL", SND_SOC_NOPM, 0, 0, - &slim3_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS4_DL_HL", SND_SOC_NOPM, 0, 0, - &slim4_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS6_DL_HL", SND_SOC_NOPM, 0, 0, - &slim6_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("PCM_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &pcm_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SCO_SLIM7_DL_HL", SND_SOC_NOPM, 0, 0, - &sco_slim7_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_PRI_AUX_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_pri_aux_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_AUX_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_aux_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_INT_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_int_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_SLIM7_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_slim7_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("USB_DL_HL", SND_SOC_NOPM, 0, 0, - &usb_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("A2DP_SLIM7_UL_HL", SND_SOC_NOPM, 0, 0, - &a2dp_slim7_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("WSA_CDC_DMA_RX_0_DL_HL", SND_SOC_NOPM, 0, 0, - &cdc_dma_wsa_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("RX_CDC_DMA_RX_0_DL_HL", SND_SOC_NOPM, 0, 0, - &cdc_dma_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("RX_CDC_DMA_RX_1_DL_HL", SND_SOC_NOPM, 0, 0, - &cdc_dma_rx_1_switch_mixer_controls), - - /* Mixer definitions */ - SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_2_rx_mixer_controls, ARRAY_SIZE(slimbus_2_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_5_rx_mixer_controls, ARRAY_SIZE(slimbus_5_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_7_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_7_rx_mixer_controls, ARRAY_SIZE(slimbus_7_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_9_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_9_rx_mixer_controls, ARRAY_SIZE(slimbus_9_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0, - hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT Mixer", SND_SOC_NOPM, 0, 0, - display_port_mixer_controls, ARRAY_SIZE(display_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT1 Mixer", SND_SOC_NOPM, 0, 0, - display_port1_mixer_controls, ARRAY_SIZE(display_port1_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_SPDIF_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_spdif_rx_mixer_controls, ARRAY_SIZE(pri_spdif_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_SPDIF_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_spdif_rx_mixer_controls, ARRAY_SIZE(sec_spdif_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_0_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_1_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_0_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_1_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_2_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_3_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_4_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_4_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_5_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_5_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_6_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_6_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_7_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_7_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0, - mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0, - mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0, - mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0, - mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0, - mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0, - mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0, - mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia9 Mixer", SND_SOC_NOPM, 0, 0, - mmul9_mixer_controls, ARRAY_SIZE(mmul9_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia10 Mixer", SND_SOC_NOPM, 0, 0, - mmul10_mixer_controls, ARRAY_SIZE(mmul10_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia16 Mixer", SND_SOC_NOPM, 0, 0, - mmul16_mixer_controls, ARRAY_SIZE(mmul16_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia17 Mixer", SND_SOC_NOPM, 0, 0, - mmul17_mixer_controls, ARRAY_SIZE(mmul17_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia18 Mixer", SND_SOC_NOPM, 0, 0, - mmul18_mixer_controls, ARRAY_SIZE(mmul18_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia19 Mixer", SND_SOC_NOPM, 0, 0, - mmul19_mixer_controls, ARRAY_SIZE(mmul19_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia20 Mixer", SND_SOC_NOPM, 0, 0, - mmul20_mixer_controls, ARRAY_SIZE(mmul20_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia21 Mixer", SND_SOC_NOPM, 0, 0, - mmul21_mixer_controls, ARRAY_SIZE(mmul21_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia22 Mixer", SND_SOC_NOPM, 0, 0, - mmul22_mixer_controls, ARRAY_SIZE(mmul22_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia23 Mixer", SND_SOC_NOPM, 0, 0, - mmul23_mixer_controls, ARRAY_SIZE(mmul23_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia27 Mixer", SND_SOC_NOPM, 0, 0, - mmul27_mixer_controls, ARRAY_SIZE(mmul27_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia28 Mixer", SND_SOC_NOPM, 0, 0, - mmul28_mixer_controls, ARRAY_SIZE(mmul28_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia29 Mixer", SND_SOC_NOPM, 0, 0, - mmul29_mixer_controls, ARRAY_SIZE(mmul29_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia30 Mixer", SND_SOC_NOPM, 0, 0, - mmul30_mixer_controls, ARRAY_SIZE(mmul30_mixer_controls)), - /* incall */ - SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0, - incall_music_delivery_mixer_controls, - ARRAY_SIZE(incall_music_delivery_mixer_controls)), - SND_SOC_DAPM_MIXER("Incall_Music_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - incall_music2_delivery_mixer_controls, - ARRAY_SIZE(incall_music2_delivery_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_4_rx_mixer_controls, - ARRAY_SIZE(slimbus_4_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_6_rx_mixer_controls, - ARRAY_SIZE(slimbus_6_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("USB_AUDIO_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - usb_audio_rx_mixer_controls, - ARRAY_SIZE(usb_audio_rx_mixer_controls)), - /* Voice Mixer */ - SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - slimbus_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - bt_sco_rx_voice_mixer_controls, - ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - afe_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - hdmi_rx_voice_mixer_controls, - ARRAY_SIZE(hdmi_rx_voice_mixer_controls)), - - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_0_Voice Mixer", - SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_0_voice_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_0_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("PROXY_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - proxy_rx_voice_mixer_controls, - ARRAY_SIZE(proxy_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0_Voice Mixer", - SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_0_voice_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_0_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_1_Voice Mixer", - SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_1_voice_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_1_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("Voip_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls, - ARRAY_SIZE(tx_voip_mixer_controls)), - SND_SOC_DAPM_MIXER("VoiceMMode1_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_voicemmode1_mixer_controls, - ARRAY_SIZE(tx_voicemmode1_mixer_controls)), - SND_SOC_DAPM_MIXER("VoiceMMode2_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_voicemmode2_mixer_controls, - ARRAY_SIZE(tx_voicemmode2_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_A2DP_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int_bt_a2dp_rx_mixer_controls, - ARRAY_SIZE(int_bt_a2dp_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0, - tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)), - SND_SOC_DAPM_MIXER("Voice2 Stub Tx Mixer", SND_SOC_NOPM, 0, 0, - tx_voice2_stub_mixer_controls, - ARRAY_SIZE(tx_voice2_stub_mixer_controls)), - SND_SOC_DAPM_MIXER("VoLTE Stub Tx Mixer", SND_SOC_NOPM, 0, 0, - tx_volte_stub_mixer_controls, ARRAY_SIZE(tx_volte_stub_mixer_controls)), - SND_SOC_DAPM_MIXER("STUB_RX Mixer", SND_SOC_NOPM, 0, 0, - stub_rx_mixer_controls, ARRAY_SIZE(stub_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Mixer", SND_SOC_NOPM, 0, 0, - slimbus_1_rx_mixer_controls, ARRAY_SIZE(slimbus_1_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_3_RX_Voice Mixer", SND_SOC_NOPM, 0, 0, - slimbus_3_rx_mixer_controls, ARRAY_SIZE(slimbus_3_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIM_6_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - slimbus_6_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_6_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIM_7_RX_Voice Mixer", SND_SOC_NOPM, 0, 0, - slimbus_7_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_7_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIM_8_RX_Voice Mixer", SND_SOC_NOPM, 0, 0, - slimbus_8_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_8_rx_voice_mixer_controls)), - /* port mixer */ - SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls, - ARRAY_SIZE(sbus_0_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0, - sbus_1_rx_port_mixer_controls, - ARRAY_SIZE(sbus_1_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0, - bt_sco_rx_port_mixer_controls, - ARRAY_SIZE(bt_sco_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer", - SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls, - ARRAY_SIZE(hdmi_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Port Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx_port_mixer_controls, - ARRAY_SIZE(display_port_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX1 Port Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx1_port_mixer_controls, - ARRAY_SIZE(display_port_rx1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sbus_3_rx_port_mixer_controls, - ARRAY_SIZE(sbus_3_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sbus_6_rx_port_mixer_controls, - ARRAY_SIZE(sbus_6_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_0_port_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_0_port_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_1_port_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QCHAT_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_qchat_mixer_controls, - ARRAY_SIZE(tx_qchat_mixer_controls)), - SND_SOC_DAPM_MIXER("USB_AUDIO_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, usb_audio_rx_voice_mixer_controls, - ARRAY_SIZE(usb_audio_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("USB_AUDIO_RX Port Mixer", - SND_SOC_NOPM, 0, 0, usb_rx_port_mixer_controls, - ARRAY_SIZE(usb_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx_voice_mixer_controls, - ARRAY_SIZE(display_port_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX1_Voice Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx1_voice_mixer_controls, - ARRAY_SIZE(display_port_rx1_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("AFE_PCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, afe_pcm_rx_port_mixer_controls, - ARRAY_SIZE(afe_pcm_rx_port_mixer_controls)), - /* lsm mixer definitions */ - SND_SOC_DAPM_MIXER("LSM1 Mixer", SND_SOC_NOPM, 0, 0, - lsm1_mixer_controls, ARRAY_SIZE(lsm1_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM2 Mixer", SND_SOC_NOPM, 0, 0, - lsm2_mixer_controls, ARRAY_SIZE(lsm2_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM3 Mixer", SND_SOC_NOPM, 0, 0, - lsm3_mixer_controls, ARRAY_SIZE(lsm3_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM4 Mixer", SND_SOC_NOPM, 0, 0, - lsm4_mixer_controls, ARRAY_SIZE(lsm4_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM5 Mixer", SND_SOC_NOPM, 0, 0, - lsm5_mixer_controls, ARRAY_SIZE(lsm5_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM6 Mixer", SND_SOC_NOPM, 0, 0, - lsm6_mixer_controls, ARRAY_SIZE(lsm6_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM7 Mixer", SND_SOC_NOPM, 0, 0, - lsm7_mixer_controls, ARRAY_SIZE(lsm7_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM8 Mixer", SND_SOC_NOPM, 0, 0, - lsm8_mixer_controls, ARRAY_SIZE(lsm8_mixer_controls)), - /* Virtual Pins to force backends ON atm */ - SND_SOC_DAPM_OUTPUT("BE_OUT"), - SND_SOC_DAPM_INPUT("BE_IN"), - - SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0, - &slim0_rx_vi_fb_lch_mux), - SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0, - &slim0_rx_vi_fb_rch_mux), - SND_SOC_DAPM_MUX("WSA_RX_0_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0, - &wsa_rx_0_vi_fb_lch_mux), - SND_SOC_DAPM_MUX("WSA_RX_0_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0, - &wsa_rx_0_vi_fb_rch_mux), - - SND_SOC_DAPM_MUX("VOC_EXT_EC MUX", SND_SOC_NOPM, 0, 0, - &voc_ext_ec_mux), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL1 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul1), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL2 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul2), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL3 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul3), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL4 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul4), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL5 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul5), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL6 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul6), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL8 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul8), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL9 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul9), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL10 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul10), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL16 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul16), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL17 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul17), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL18 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul18), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL19 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul19), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL28 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul28), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL29 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul29), -}; - -#ifndef CONFIG_AUXPCM_DISABLE -static const struct snd_soc_dapm_widget msm_qdsp6_widgets_aux_pcm[] = { - /* Frontend AIF */ - /* Widget name equals to Front-End DAI name, - * Stream name must contains substring of front-end dai name - */ - SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_AUXPCM_DL_HL", "SEC_AUXPCM_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_AUXPCM_UL_HL", "SEC_AUXPCM_HOSTLESS Capture", - 0, 0, 0, 0), - /* LSM */ - /* Backend AIF */ - /* Stream name equals to backend dai link stream name */ - /* incall */ - SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_AUX_PCM_RX", "Sec AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_AUX_PCM_TX", "Sec AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_AUX_PCM_RX", "Tert AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_AUX_PCM_TX", "Tert AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_AUX_PCM_RX", "Quat AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_AUX_PCM_TX", "Quat AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_AUX_PCM_RX", "Quin AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_AUX_PCM_TX", "Quin AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_AUX_PCM_RX", "Sen AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_AUX_PCM_TX", "Sen AUX PCM Capture", - 0, 0, 0, 0), - /* In- call recording */ - - /* Switch Definitions */ - - /* Mixer definitions */ - SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_auxpcm_rx_mixer_controls, ARRAY_SIZE(sec_auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_auxpcm_rx_mixer_controls, - ARRAY_SIZE(tert_auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_auxpcm_rx_mixer_controls, - ARRAY_SIZE(quat_auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_auxpcm_rx_mixer_controls, - ARRAY_SIZE(quin_auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sen_auxpcm_rx_mixer_controls, - ARRAY_SIZE(sen_auxpcm_rx_mixer_controls)), - /* incall */ - /* Voice Mixer */ - SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sec_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(sec_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - tert_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(tert_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quat_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(quat_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quin_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(quin_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sen_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(sen_aux_pcm_rx_voice_mixer_controls)), - /* port mixer */ - SND_SOC_DAPM_MIXER("AUX_PCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, aux_pcm_rx_port_mixer_controls, - ARRAY_SIZE(aux_pcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sec_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(sec_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, tert_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(tert_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, quat_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(quat_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, quin_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(quin_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sen_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(sen_auxpcm_rx_port_mixer_controls)), -}; -#endif - -#ifndef CONFIG_MI2S_DISABLE -static const struct snd_soc_dapm_widget msm_qdsp6_widgets_mi2s[] = { - /* Frontend AIF */ - /* Widget name equals to Front-End DAI name, - * Stream name must contains substring of front-end dai name - */ - SND_SOC_DAPM_AIF_IN("SEC_I2S_DL_HL", "SEC_I2S_RX_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT0_MI2S_DL_HL", - "INT0 MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT4_MI2S_DL_HL", - "INT4 MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_MI2S_DL_HL", - "Primary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_MI2S_DL_HL", - "Secondary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_MI2S_DL_HL", - "Tertiary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_MI2S_DL_HL", - "Quaternary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_MI2S_DL_HL", - "Quinary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_MI2S_DL_HL", - "Senary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_OUT("MI2S_UL_HL", "MI2S_TX_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT3_MI2S_UL_HL", - "INT3 MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_MI2S_UL_HL", - "Tertiary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_UL_HL", - "Secondary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_MI2S_UL_HL", - "Primary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MI2S_DL_HL", "MI2S_RX_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_UL_HL", - "Quaternary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_UL_HL", - "Quinary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_MI2S_UL_HL", - "Senary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - - - - /* LSM */ - /* Backend AIF */ - /* Stream name equals to backend dai link stream name */ - SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX", "Quaternary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX", "Tertiary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX", "Secondary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_SD1", - "Secondary MI2S Playback SD1", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_MI2S_RX", "Primary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT0_MI2S_RX", "INT0 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT2_MI2S_RX", "INT2 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT3_MI2S_RX", "INT3 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT5_MI2S_RX", "INT5 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT4_MI2S_RX", "INT4 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT4_MI2S_TX", "INT4 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_RX", "Quinary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_MI2S_RX", "Senary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MI2S_TX", "MI2S Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX", "Quaternary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_MI2S_TX", "Primary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX", "Tertiary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT0_MI2S_TX", "INT0 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT2_MI2S_TX", "INT2 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT3_MI2S_TX", "INT3 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX", "Secondary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_MI2S_TX", "Quinary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SENARY_MI2S_TX", "Senary MI2S Capture", - 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_OUT("PRI_META_MI2S_RX", "Primary META MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_META_MI2S_RX", "Secondary META MI2S Playback", - 0, 0, 0, 0), - /* incall */ - SND_SOC_DAPM_AIF_IN("SENARY_TX", "Senary_mi2s Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT5_MI2S_TX", "INT5 MI2S Capture", - 0, 0, 0, 0), - - /* In- call recording */ - - - /* Switch Definitions */ - SND_SOC_DAPM_SWITCH("INT0_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &int0_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("INT4_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &int4_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("PRI_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &pri_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SEC_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &sec_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("TERT_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &tert_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("QUAT_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &quat_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("QUIN_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &quin_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SEN_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &sen_mi2s_rx_switch_mixer_controls), - - /* Mixer definitions */ - SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quaternary_mi2s_rx_mixer_controls, - ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - tertiary_mi2s_rx_mixer_controls, - ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - secondary_mi2s_rx_mixer_controls, - ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX_SD1 Audio Mixer", SND_SOC_NOPM, 0, 0, - secondary_mi2s_rx2_mixer_controls, - ARRAY_SIZE(secondary_mi2s_rx2_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - primary_mi2s_rx_mixer_controls, - ARRAY_SIZE(primary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INT0_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int0_mi2s_rx_mixer_controls, - ARRAY_SIZE(int0_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INT4_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int4_mi2s_rx_mixer_controls, - ARRAY_SIZE(int4_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quinary_mi2s_rx_mixer_controls, - ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - senary_mi2s_rx_mixer_controls, - ARRAY_SIZE(senary_mi2s_rx_mixer_controls)), - - SND_SOC_DAPM_MIXER("PRI_META_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_meta_mi2s_rx_mixer_controls, - ARRAY_SIZE(pri_meta_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_META_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_meta_mi2s_rx_mixer_controls, - ARRAY_SIZE(sec_meta_mi2s_rx_mixer_controls)), - /* incall */ - /* Voice Mixer */ - SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls, - ARRAY_SIZE(pri_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sec_i2s_rx_voice_mixer_controls, - ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sec_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(sec_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - pri_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(pri_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("INT0_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - int0_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(int0_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("INT4_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - int4_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(int4_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - tert_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(tert_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quat_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(quat_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quin_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(quin_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sen_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(sen_mi2s_rx_voice_mixer_controls)), - - /* port mixer */ - SND_SOC_DAPM_MIXER("SEC_I2S_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sec_i2s_rx_port_mixer_controls, - ARRAY_SIZE(sec_i2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - mi2s_rx_port_mixer_controls, ARRAY_SIZE(mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - primary_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(primary_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - sec_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(sec_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - tert_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(tert_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - quat_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(quat_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - quin_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(quin_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - sen_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(sen_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("INT0_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - int0_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(int0_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("INT4_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - int4_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(int4_mi2s_rx_port_mixer_controls)), - /* lsm mixer definitions */ - /* Virtual Pins to force backends ON atm */ - - SND_SOC_DAPM_MUX("PRI_MI2S_RX_VI_FB_MUX", SND_SOC_NOPM, 0, 0, - &mi2s_rx_vi_fb_mux), - SND_SOC_DAPM_MUX("INT4_MI2S_RX_VI_FB_MONO_CH_MUX", SND_SOC_NOPM, 0, 0, - &int4_mi2s_rx_vi_fb_mono_ch_mux), - SND_SOC_DAPM_MUX("INT4_MI2S_RX_VI_FB_STEREO_CH_MUX", SND_SOC_NOPM, 0, 0, - &int4_mi2s_rx_vi_fb_stereo_ch_mux), - -}; -#endif - -#ifndef CONFIG_TDM_DISABLE -static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { - /* Frontend AIF */ - /* Widget name equals to Front-End DAI name, - * Stream name must contains substring of front-end dai name - */ - - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_0_DL_HL", - "Primary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_0_UL_HL", - "Primary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_1_DL_HL", - "Primary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_1_UL_HL", - "Primary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_2_DL_HL", - "Primary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_2_UL_HL", - "Primary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_3_DL_HL", - "Primary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_3_UL_HL", - "Primary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_4_DL_HL", - "Primary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_4_UL_HL", - "Primary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_5_DL_HL", - "Primary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_5_UL_HL", - "Primary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_6_DL_HL", - "Primary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_6_UL_HL", - "Primary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_7_DL_HL", - "Primary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_7_UL_HL", - "Primary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_0_DL_HL", - "Secondary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_0_UL_HL", - "Secondary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_1_DL_HL", - "Secondary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_1_UL_HL", - "Secondary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_2_DL_HL", - "Secondary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_2_UL_HL", - "Secondary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_3_DL_HL", - "Secondary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_3_UL_HL", - "Secondary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_4_DL_HL", - "Secondary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_4_UL_HL", - "Secondary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_5_DL_HL", - "Secondary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_5_UL_HL", - "Secondary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_6_DL_HL", - "Secondary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_6_UL_HL", - "Secondary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_7_DL_HL", - "Secondary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_7_UL_HL", - "Secondary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_0_DL_HL", - "Tertiary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_0_UL_HL", - "Tertiary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_1_DL_HL", - "Tertiary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_1_UL_HL", - "Tertiary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_2_DL_HL", - "Tertiary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_2_UL_HL", - "Tertiary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_3_DL_HL", - "Tertiary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_3_UL_HL", - "Tertiary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_4_DL_HL", - "Tertiary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_4_UL_HL", - "Tertiary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_5_DL_HL", - "Tertiary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_5_UL_HL", - "Tertiary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_6_DL_HL", - "Tertiary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_6_UL_HL", - "Tertiary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_7_DL_HL", - "Tertiary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_7_UL_HL", - "Tertiary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_0_DL_HL", - "Quaternary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_0_UL_HL", - "Quaternary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_1_DL_HL", - "Quaternary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_1_UL_HL", - "Quaternary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_2_DL_HL", - "Quaternary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_2_UL_HL", - "Quaternary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_3_DL_HL", - "Quaternary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_3_UL_HL", - "Quaternary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_4_DL_HL", - "Quaternary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_4_UL_HL", - "Quaternary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_5_DL_HL", - "Quaternary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_5_UL_HL", - "Quaternary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_6_DL_HL", - "Quaternary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_6_UL_HL", - "Quaternary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_7_DL_HL", - "Quaternary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_7_UL_HL", - "Quaternary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_0_DL_HL", - "Quinary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_0_UL_HL", - "Quinary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_1_DL_HL", - "Quinary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_1_UL_HL", - "Quinary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_2_DL_HL", - "Quinary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_2_UL_HL", - "Quinary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_3_DL_HL", - "Quinary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_3_UL_HL", - "Quinary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_4_DL_HL", - "Quinary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_4_UL_HL", - "Quinary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_5_DL_HL", - "Quinary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_5_UL_HL", - "Quinary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_6_DL_HL", - "Quinary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_6_UL_HL", - "Quinary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_7_DL_HL", - "Quinary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_7_UL_HL", - "Quinary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_0_DL_HL", - "Senary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_0_UL_HL", - "Senary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_1_DL_HL", - "Senary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_1_UL_HL", - "Senary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_2_DL_HL", - "Senary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_2_UL_HL", - "Senary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_3_DL_HL", - "Senary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_3_UL_HL", - "Senary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_4_DL_HL", - "Senary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_4_UL_HL", - "Senary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_5_DL_HL", - "Senary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_5_UL_HL", - "Senary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_6_DL_HL", - "Senary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_6_UL_HL", - "Senary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_7_DL_HL", - "Senary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_7_UL_HL", - "Senary TDM7 Hostless Capture", - 0, 0, 0, 0), - - /* LSM */ - /* Backend AIF */ - /* Stream name equals to backend dai link stream name */ - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_0", "Primary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_0", "Primary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_1", "Primary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_1", "Primary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_2", "Primary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_2", "Primary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_3", "Primary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_3", "Primary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_4", "Primary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_4", "Primary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_5", "Primary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_5", "Primary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_6", "Primary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_6", "Primary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_7", "Primary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_7", "Primary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_0", "Secondary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_0", "Secondary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_1", "Secondary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_1", "Secondary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_2", "Secondary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_2", "Secondary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_3", "Secondary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_3", "Secondary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_4", "Secondary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_4", "Secondary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_5", "Secondary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_5", "Secondary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_6", "Secondary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_6", "Secondary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_7", "Secondary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_7", "Secondary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_0", "Tertiary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_0", "Tertiary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_1", "Tertiary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_1", "Tertiary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_2", "Tertiary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_2", "Tertiary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_3", "Tertiary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_3", "Tertiary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_4", "Tertiary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_4", "Tertiary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_5", "Tertiary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_5", "Tertiary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_6", "Tertiary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_6", "Tertiary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_7", "Tertiary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_7", "Tertiary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_0", "Quaternary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_0", "Quaternary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_1", "Quaternary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_1", "Quaternary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_2", "Quaternary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_2", "Quaternary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_3", "Quaternary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_3", "Quaternary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_4", "Quaternary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_4", "Quaternary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_5", "Quaternary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_5", "Quaternary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_6", "Quaternary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_6", "Quaternary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_7", "Quaternary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_7", "Quaternary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_0", "Quinary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_0", "Quinary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_1", "Quinary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_1", "Quinary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_2", "Quinary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_2", "Quinary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_3", "Quinary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_3", "Quinary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_4", "Quinary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_4", "Quinary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_5", "Quinary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_5", "Quinary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_6", "Quinary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_6", "Quinary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_7", "Quinary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_7", "Quinary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_0", "Senary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_0", "Senary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_1", "Senary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_1", "Senary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_2", "Senary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_2", "Senary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_3", "Senary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_3", "Senary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_4", "Senary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_4", "Senary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_5", "Senary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_5", "Senary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_6", "Senary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_6", "Senary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_7", "Senary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_7", "Senary TDM7 Capture", - 0, 0, 0, 0), - /* incall */ - - /* In- call recording */ - /* Switch Definitions */ - - /* Mixer definitions */ - SND_SOC_DAPM_MIXER("PRI_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_0_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_1_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_2_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_3_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_tx_0_mixer_controls, - ARRAY_SIZE(pri_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_0_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_1_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_2_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_3_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_tx_0_mixer_controls, - ARRAY_SIZE(sec_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_0_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_tx_0_mixer_controls, - ARRAY_SIZE(tert_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_1_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_2_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_3_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_4_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_0_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_tx_0_mixer_controls, - ARRAY_SIZE(quat_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_1_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_2_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_3_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_0_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_0_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_1_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_1_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_2_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_2_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_3_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_3_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_tx_0_mixer_controls, - ARRAY_SIZE(sen_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_0_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_1_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_2_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_3_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_3_mixer_controls)), - /* incall */ - /* Voice Mixer */ - SND_SOC_DAPM_MIXER("PRI_TDM_RX_0_Voice Mixer", - SND_SOC_NOPM, 0, 0, - pri_tdm_rx_0_voice_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_0_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_1_Voice Mixer", - SND_SOC_NOPM, 0, 0, - pri_tdm_rx_1_voice_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_1_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_2_Voice Mixer", - SND_SOC_NOPM, 0, 0, - pri_tdm_rx_2_voice_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_2_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_3_Voice Mixer", - SND_SOC_NOPM, 0, 0, - pri_tdm_rx_3_voice_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_3_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quat_tdm_rx_2_voice_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_2_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quin_tdm_rx_2_voice_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_2_voice_mixer_controls)), - /* port mixer */ - SND_SOC_DAPM_MIXER("PRI_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_7_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_7_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_7_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_7_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_7_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_7_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(sen_tdm_rx_3_port_mixer_controls)), - /* lsm mixer definitions */ - /* Virtual Pins to force backends ON atm */ -}; -#endif - -static const struct snd_soc_dapm_route intercon[] = { - - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"}, - - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_2_RX", NULL, "SLIMBUS_2_RX Audio Mixer"}, - - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_5_RX", NULL, "SLIMBUS_5_RX Audio Mixer"}, - - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0 Audio Mixer"}, - - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"WSA_CDC_DMA_RX_1", NULL, "WSA_CDC_DMA_RX_1 Audio Mixer"}, - - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0 Audio Mixer"}, - - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1 Audio Mixer"}, - - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_2", NULL, "RX_CDC_DMA_RX_2 Audio Mixer"}, - - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_3", NULL, "RX_CDC_DMA_RX_3 Audio Mixer"}, - - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_4", NULL, "RX_CDC_DMA_RX_4 Audio Mixer"}, - - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_5", NULL, "RX_CDC_DMA_RX_5 Audio Mixer"}, - - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_6", NULL, "RX_CDC_DMA_RX_6 Audio Mixer"}, - - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_7", NULL, "RX_CDC_DMA_RX_7 Audio Mixer"}, - - {"HDMI Mixer", "MultiMedia1", "MM_DL1"}, - {"HDMI Mixer", "MultiMedia2", "MM_DL2"}, - {"HDMI Mixer", "MultiMedia3", "MM_DL3"}, - {"HDMI Mixer", "MultiMedia4", "MM_DL4"}, - {"HDMI Mixer", "MultiMedia5", "MM_DL5"}, - {"HDMI Mixer", "MultiMedia6", "MM_DL6"}, - {"HDMI Mixer", "MultiMedia7", "MM_DL7"}, - {"HDMI Mixer", "MultiMedia8", "MM_DL8"}, - {"HDMI Mixer", "MultiMedia9", "MM_DL9"}, - {"HDMI Mixer", "MultiMedia10", "MM_DL10"}, - {"HDMI Mixer", "MultiMedia11", "MM_DL11"}, - {"HDMI Mixer", "MultiMedia12", "MM_DL12"}, - {"HDMI Mixer", "MultiMedia13", "MM_DL13"}, - {"HDMI Mixer", "MultiMedia14", "MM_DL14"}, - {"HDMI Mixer", "MultiMedia15", "MM_DL15"}, - {"HDMI Mixer", "MultiMedia16", "MM_DL16"}, - {"HDMI Mixer", "MultiMedia26", "MM_DL26"}, - {"HDMI", NULL, "HDMI Mixer"}, - - {"DISPLAY_PORT Mixer", "MultiMedia1", "MM_DL1"}, - {"DISPLAY_PORT Mixer", "MultiMedia2", "MM_DL2"}, - {"DISPLAY_PORT Mixer", "MultiMedia3", "MM_DL3"}, - {"DISPLAY_PORT Mixer", "MultiMedia4", "MM_DL4"}, - {"DISPLAY_PORT Mixer", "MultiMedia5", "MM_DL5"}, - {"DISPLAY_PORT Mixer", "MultiMedia6", "MM_DL6"}, - {"DISPLAY_PORT Mixer", "MultiMedia7", "MM_DL7"}, - {"DISPLAY_PORT Mixer", "MultiMedia8", "MM_DL8"}, - {"DISPLAY_PORT Mixer", "MultiMedia9", "MM_DL9"}, - {"DISPLAY_PORT Mixer", "MultiMedia10", "MM_DL10"}, - {"DISPLAY_PORT Mixer", "MultiMedia11", "MM_DL11"}, - {"DISPLAY_PORT Mixer", "MultiMedia12", "MM_DL12"}, - {"DISPLAY_PORT Mixer", "MultiMedia13", "MM_DL13"}, - {"DISPLAY_PORT Mixer", "MultiMedia14", "MM_DL14"}, - {"DISPLAY_PORT Mixer", "MultiMedia15", "MM_DL15"}, - {"DISPLAY_PORT Mixer", "MultiMedia16", "MM_DL16"}, - {"DISPLAY_PORT Mixer", "MultiMedia26", "MM_DL26"}, - {"DISPLAY_PORT", NULL, "DISPLAY_PORT Mixer"}, - - {"DISPLAY_PORT1 Mixer", "MultiMedia1", "MM_DL1"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia2", "MM_DL2"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia3", "MM_DL3"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia4", "MM_DL4"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia5", "MM_DL5"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia6", "MM_DL6"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia7", "MM_DL7"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia8", "MM_DL8"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia9", "MM_DL9"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia10", "MM_DL10"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia11", "MM_DL11"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia12", "MM_DL12"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia13", "MM_DL13"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia14", "MM_DL14"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia15", "MM_DL15"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia16", "MM_DL16"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia26", "MM_DL26"}, - {"DISPLAY_PORT1", NULL, "DISPLAY_PORT1 Mixer"}, - - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"PRI_SPDIF_RX", NULL, "PRI_SPDIF_RX Audio Mixer"}, - - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SEC_SPDIF_RX", NULL, "SEC_SPDIF_RX Audio Mixer"}, - - /* incall */ - {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"Incall_Music Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"Incall_Music Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"Incall_Music Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"VOICE2_PLAYBACK_TX", NULL, "Incall_Music_2 Audio Mixer"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_4_RX", NULL, "SLIMBUS_4_RX Audio Mixer"}, - - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_6_RX", NULL, "SLIMBUS_6_RX Audio Mixer"}, - - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_7_RX", NULL, "SLIMBUS_7_RX Audio Mixer"}, - - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_9_RX", NULL, "SLIMBUS_9_RX Audio Mixer"}, - - {"USB_AUDIO_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"USB_AUDIO_RX", NULL, "USB_AUDIO_RX Audio Mixer"}, - - {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia4 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia8 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia9 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia4 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia8 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia9 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"}, - {"MultiMedia1 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia1 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia1 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"MultiMedia1 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia8 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia8 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia8 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia4 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia4 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia17 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia17 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia18 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia18 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia19 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia19 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia28 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia28 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia29 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia29 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia30 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia30 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia8 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia8 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - - {"MultiMedia3 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia3 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia5 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia5 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia10 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia10 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia16 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia16 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia5 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia5 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"MultiMedia5 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia10 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia10 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia18 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia19 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia28 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia29 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia30 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia18 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia19 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia28 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia29 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia30 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - - {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia1 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia2 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia2 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia2 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia2 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - - {"MultiMedia6 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia6 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - - {"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia1 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia1 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia1 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia1 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia1 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia2 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia2 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia2 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia2 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia2 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia3 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia3 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia3 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia3 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia3 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia4 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia4 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia4 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia4 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia4 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia5 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia5 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia5 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia5 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia5 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia6 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia6 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia6 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia6 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia6 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia8 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia8 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia8 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia8 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia8 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia9 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia9 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia9 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia9 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia9 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia9 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia10 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - - {"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia20 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia20 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia20 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia20 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia20 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia20 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - - {"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia21 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia21 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia21 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia21 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia21 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia21 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - - - {"MultiMedia27 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia27 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia27 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia27 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia27 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia27 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia27 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia27 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - - {"MultiMedia1 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia2 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia4 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia5 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia6 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia8 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia10 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - - - {"MultiMedia16 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia16 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia16 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia16 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia16 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia16 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia16 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia16 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia16 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia16 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia17 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia18 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia18 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia18 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia19 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia19 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia19 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia28 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia28 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia28 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia29 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia29 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia29 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - - {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia30 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia30 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia30 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia6", "MM_UL6"}, - {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"}, - - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia6", "MM_UL6"}, - {"INT_BT_A2DP_RX", NULL, "INTERNAL_A2DP_RX Audio Mixer"}, - - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"}, - - {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"}, - - {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia3 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia4 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia10 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia17 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia18 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia19 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia28 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia29 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia30 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia5 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia8 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia16 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia4 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia16 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia17 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia18 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia19 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia28 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia29 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia30 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia5 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia6 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia8 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - - {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia3 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia4 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia10 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia17 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia18 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia19 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia28 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia29 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia30 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia5 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia8 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia16 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MM_UL1", NULL, "MultiMedia1 Mixer"}, - {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MM_UL2", NULL, "MultiMedia2 Mixer"}, - {"MM_UL3", NULL, "MultiMedia3 Mixer"}, - {"MM_UL4", NULL, "MultiMedia4 Mixer"}, - {"MM_UL5", NULL, "MultiMedia5 Mixer"}, - {"MM_UL6", NULL, "MultiMedia6 Mixer"}, - {"MM_UL8", NULL, "MultiMedia8 Mixer"}, - {"MM_UL9", NULL, "MultiMedia9 Mixer"}, - {"MM_UL10", NULL, "MultiMedia10 Mixer"}, - {"MM_UL16", NULL, "MultiMedia16 Mixer"}, - {"MM_UL17", NULL, "MultiMedia17 Mixer"}, - {"MM_UL18", NULL, "MultiMedia18 Mixer"}, - {"MM_UL19", NULL, "MultiMedia19 Mixer"}, - {"MM_UL20", NULL, "MultiMedia20 Mixer"}, - {"MM_UL21", NULL, "MultiMedia21 Mixer"}, - {"MM_UL22", NULL, "MultiMedia22 Mixer"}, - {"MM_UL23", NULL, "MultiMedia23 Mixer"}, - {"MM_UL27", NULL, "MultiMedia27 Mixer"}, - {"MM_UL28", NULL, "MultiMedia28 Mixer"}, - {"MM_UL29", NULL, "MultiMedia29 Mixer"}, - {"MM_UL30", NULL, "MultiMedia30 Mixer"}, - - {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_0_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_0_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_0_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_0_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"}, - - {"SLIM_6_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_6_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_6_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_6_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_6_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_6_RX", NULL, "SLIM_6_RX_Voice Mixer"}, - - {"USB_AUDIO_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"USB_AUDIO_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"USB_AUDIO_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"USB_AUDIO_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"USB_AUDIO_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"USB_AUDIO_RX", NULL, "USB_AUDIO_RX_Voice Mixer"}, - - {"DISPLAY_PORT_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"DISPLAY_PORT", NULL, "DISPLAY_PORT_RX_Voice Mixer"}, - - {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia4 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia8 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia9 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia4 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia8 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia9 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"}, - {"MultiMedia1 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia1 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia1 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"MultiMedia1 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia8 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia8 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia8 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia4 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia4 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia18 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia18 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia19 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia19 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia28 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia28 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia29 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia29 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia30 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia30 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia8 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia8 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia3 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia3 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia5 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia5 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia10 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia10 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia16 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia16 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia5 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia5 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"MultiMedia5 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia10 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia10 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia18 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia19 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia28 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia29 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia30 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia18 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia19 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia28 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia29 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - {"MultiMedia30 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"}, - - {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"AFE_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"AFE_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"AFE_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"AFE_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"}, - - {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"HDMI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"HDMI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"HDMI_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"HDMI_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"HDMI", NULL, "HDMI_RX_Voice Mixer"}, - {"HDMI", NULL, "HDMI_DL_HL"}, - - - - {"WSA_CDC_DMA_RX_0_Voice Mixer", "Voip", "VOIP_DL"}, - {"WSA_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"WSA_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0_Voice Mixer"}, - - {"PROXY_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PROXY_RX", NULL, "PROXY_RX_Voice Mixer"}, - - {"PROXY_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PROXY_RX", NULL, "PROXY_RX_Voice Mixer"}, - - {"RX_CDC_DMA_RX_0_Voice Mixer", "Voip", "VOIP_DL"}, - {"RX_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"RX_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0_Voice Mixer"}, - - {"RX_CDC_DMA_RX_1_Voice Mixer", "Voip", "VOIP_DL"}, - {"RX_CDC_DMA_RX_1_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"RX_CDC_DMA_RX_1_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1_Voice Mixer"}, - - {"VOC_EXT_EC MUX", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"VOIP_UL", NULL, "VOC_EXT_EC MUX"}, - {"VOICEMMODE1_UL", NULL, "VOC_EXT_EC MUX"}, - {"VOICEMMODE2_UL", NULL, "VOC_EXT_EC MUX"}, - - - {"AUDIO_REF_EC_UL1 MUX", "SLIM_1_TX", "SLIMBUS_1_TX"}, - - {"AUDIO_REF_EC_UL10 MUX", "SLIM_1_TX", "SLIMBUS_1_TX"}, - - {"LSM1_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM2_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM3_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM4_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM5_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM6_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM7_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM8_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - - {"MM_UL1", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"MM_UL2", NULL, "AUDIO_REF_EC_UL2 MUX"}, - {"MM_UL3", NULL, "AUDIO_REF_EC_UL3 MUX"}, - {"MM_UL4", NULL, "AUDIO_REF_EC_UL4 MUX"}, - {"MM_UL5", NULL, "AUDIO_REF_EC_UL5 MUX"}, - {"MM_UL6", NULL, "AUDIO_REF_EC_UL6 MUX"}, - {"MM_UL8", NULL, "AUDIO_REF_EC_UL8 MUX"}, - {"MM_UL9", NULL, "AUDIO_REF_EC_UL9 MUX"}, - {"MM_UL10", NULL, "AUDIO_REF_EC_UL10 MUX"}, - {"MM_UL16", NULL, "AUDIO_REF_EC_UL16 MUX"}, - {"MM_UL17", NULL, "AUDIO_REF_EC_UL17 MUX"}, - {"MM_UL18", NULL, "AUDIO_REF_EC_UL18 MUX"}, - {"MM_UL19", NULL, "AUDIO_REF_EC_UL19 MUX"}, - {"MM_UL28", NULL, "AUDIO_REF_EC_UL28 MUX"}, - {"MM_UL29", NULL, "AUDIO_REF_EC_UL29 MUX"}, - - {"VoiceMMode1_Tx Mixer", "SLIM_0_TX_MMode1", "SLIMBUS_0_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_7_TX_MMode1", "SLIMBUS_7_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_8_TX_MMode1", "SLIMBUS_8_TX"}, - {"VoiceMMode1_Tx Mixer", "USB_AUDIO_TX_MMode1", "USB_AUDIO_TX"}, - {"VoiceMMode1_Tx Mixer", "INT_BT_SCO_TX_MMode1", "INT_BT_SCO_TX"}, - {"VoiceMMode1_Tx Mixer", "AFE_PCM_TX_MMode1", "PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_0_MMode1", "TX_CDC_DMA_TX_0"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_1_MMode1", "TX_CDC_DMA_TX_1"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_2_MMode1", "TX_CDC_DMA_TX_2"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_3_MMode1", "TX_CDC_DMA_TX_3"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_4_MMode1", "TX_CDC_DMA_TX_4"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_5_MMode1", "TX_CDC_DMA_TX_5"}, - {"VoiceMMode1_Tx Mixer", "PROXY_TX_MMode1", "PROXY_TX"}, - {"VOICEMMODE1_UL", NULL, "VoiceMMode1_Tx Mixer"}, - - {"VoiceMMode2_Tx Mixer", "SLIM_0_TX_MMode2", "SLIMBUS_0_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_7_TX_MMode2", "SLIMBUS_7_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_8_TX_MMode2", "SLIMBUS_8_TX"}, - {"VoiceMMode2_Tx Mixer", "USB_AUDIO_TX_MMode2", "USB_AUDIO_TX"}, - {"VoiceMMode2_Tx Mixer", "INT_BT_SCO_TX_MMode2", "INT_BT_SCO_TX"}, - {"VoiceMMode2_Tx Mixer", "AFE_PCM_TX_MMode2", "PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_0_MMode2", "TX_CDC_DMA_TX_0"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_1_MMode2", "TX_CDC_DMA_TX_1"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_2_MMode2", "TX_CDC_DMA_TX_2"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_3_MMode2", "TX_CDC_DMA_TX_3"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_4_MMode2", "TX_CDC_DMA_TX_4"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_5_MMode2", "TX_CDC_DMA_TX_5"}, - {"VoiceMMode2_Tx Mixer", "PROXY_TX_MMode2", "PROXY_TX"}, - {"VOICEMMODE2_UL", NULL, "VoiceMMode2_Tx Mixer"}, - - {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"}, - {"Voip_Tx Mixer", "SLIM_7_TX_Voip", "SLIMBUS_7_TX"}, - {"Voip_Tx Mixer", "SLIM_8_TX_Voip", "SLIMBUS_8_TX"}, - {"Voip_Tx Mixer", "USB_AUDIO_TX_Voip", "USB_AUDIO_TX"}, - {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"}, - {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_0_Voip", "TX_CDC_DMA_TX_0"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_1_Voip", "TX_CDC_DMA_TX_1"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_2_Voip", "TX_CDC_DMA_TX_2"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_3_Voip", "TX_CDC_DMA_TX_3"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_4_Voip", "TX_CDC_DMA_TX_4"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_5_Voip", "TX_CDC_DMA_TX_5"}, - {"VOIP_UL", NULL, "Voip_Tx Mixer"}, - - {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"}, - {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"}, - {"SLIMBUS1_DL_HL", "Switch", "SLIM1_DL_HL"}, - {"SLIMBUS_1_RX", NULL, "SLIMBUS1_DL_HL"}, - {"SLIMBUS3_DL_HL", "Switch", "SLIM3_DL_HL"}, - {"SLIMBUS_3_RX", NULL, "SLIMBUS3_DL_HL"}, - {"SLIMBUS4_DL_HL", "Switch", "SLIM4_DL_HL"}, - {"SLIMBUS_4_RX", NULL, "SLIMBUS4_DL_HL"}, - {"SLIMBUS6_DL_HL", "Switch", "SLIM0_DL_HL"}, - {"SLIMBUS_6_RX", NULL, "SLIMBUS6_DL_HL"}, - {"SCO_SLIM7_DL_HL", "Switch", "SLIM7_DL_HL"}, - {"SLIMBUS_7_RX", NULL, "SCO_SLIM7_DL_HL"}, - {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"}, - {"SLIM1_UL_HL", NULL, "SLIMBUS_1_TX"}, - {"SLIM3_UL_HL", NULL, "SLIMBUS_3_TX"}, - {"SLIM4_UL_HL", NULL, "SLIMBUS_4_TX"}, - {"SLIM8_UL_HL", NULL, "SLIMBUS_8_TX"}, - {"WSA_CDC_DMA_RX_0_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0_DL_HL"}, - {"CDC_DMA_UL_HL", NULL, "VA_CDC_DMA_TX_0"}, - {"RX_CDC_DMA_RX_0_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0_DL_HL"}, - {"RX_CDC_DMA_RX_1_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1_DL_HL"}, - {"TX3_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_3"}, - {"LSM1 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM1 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM1 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM1 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM1 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM1 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM1_UL_HL", NULL, "LSM1 Mixer"}, - - {"LSM2 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM2 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM2 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM2 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM2 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM2 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM2 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM2 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM2 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM2_UL_HL", NULL, "LSM2 Mixer"}, - - - {"LSM3 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM3 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM3 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM3 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM3 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM3 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM3 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM3 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM3 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM3_UL_HL", NULL, "LSM3 Mixer"}, - - - {"LSM4 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM4 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM4 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM4 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM4 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM4 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM4 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM4 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM4 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM4_UL_HL", NULL, "LSM4 Mixer"}, - - {"LSM5 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM5 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM5 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM5 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM5 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM5 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM5 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM5 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM5 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM5_UL_HL", NULL, "LSM5 Mixer"}, - - {"LSM6 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM6 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM6 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM6 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM6 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM6 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM6 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM6 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM6 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM6_UL_HL", NULL, "LSM6 Mixer"}, - - {"LSM7 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM7 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM7 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM7 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM7 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM7 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM7 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM7 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM7 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM7_UL_HL", NULL, "LSM7 Mixer"}, - - {"LSM8 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM8 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM8 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM8 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM8 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM8 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM8 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM8 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM8 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM8_UL_HL", NULL, "LSM8 Mixer"}, - - - {"CPE_LSM_UL_HL", NULL, "BE_IN"}, - {"QCHAT_Tx Mixer", "SLIM_0_TX_QCHAT", "SLIMBUS_0_TX"}, - {"QCHAT_Tx Mixer", "SLIM_7_TX_QCHAT", "SLIMBUS_7_TX"}, - {"QCHAT_Tx Mixer", "SLIM_8_TX_QCHAT", "SLIMBUS_8_TX"}, - {"QCHAT_Tx Mixer", "INTERNAL_BT_SCO_TX_QCHAT", "INT_BT_SCO_TX"}, - {"QCHAT_Tx Mixer", "AFE_PCM_TX_QCHAT", "PCM_TX"}, - {"QCHAT_Tx Mixer", "USB_AUDIO_TX_QCHAT", "USB_AUDIO_TX"}, - {"QCHAT_UL", NULL, "QCHAT_Tx Mixer"}, - - {"INT_FM_RX", NULL, "INTFM_DL_HL"}, - {"INTFM_UL_HL", NULL, "INT_FM_TX"}, - {"INTHFP_UL_HL", NULL, "HFP_INT_UL_HL"}, - {"HFP_INT_UL_HL", "Switch", "INT_BT_SCO_TX"}, - {"SLIM7_UL_HL", NULL, "HFP_SLIM7_UL_HL"}, - {"HFP_SLIM7_UL_HL", "Switch", "SLIMBUS_7_TX"}, - {"SLIM7_UL_HL", NULL, "A2DP_SLIM7_UL_HL"}, - {"A2DP_SLIM7_UL_HL", "Switch", "SLIMBUS_7_TX"}, - {"PCM_RX", NULL, "PCM_RX_DL_HL"}, - - /* connect to INT4_MI2S_DL_HL since same pcm_id */ - - {"WSA_CDC_DMA_RX_0 Port Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"WSA_CDC_DMA_RX_0 Port Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"WSA_CDC_DMA_RX_0 Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0 Port Mixer"}, - - {"RX_CDC_DMA_RX_0 Port Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"RX_CDC_DMA_RX_0 Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0 Port Mixer"}, - - {"RX_CDC_DMA_RX_1 Port Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"RX_CDC_DMA_RX_1 Port Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"RX_CDC_DMA_RX_1 Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1 Port Mixer"}, - - {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"SLIMBUS_0_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"}, - {"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"AFE_PCM_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"PCM_RX", NULL, "AFE_PCM_RX Port Mixer"}, - {"USB_AUDIO_RX Port Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"USB_AUDIO_RX", NULL, "USB_AUDIO_RX Port Mixer"}, - {"USB_DL_HL", "Switch", "USBAUDIO_DL_HL"}, - {"USB_AUDIO_RX", NULL, "USB_DL_HL"}, - {"USBAUDIO_UL_HL", NULL, "USB_AUDIO_TX"}, - {"Voice Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"}, - {"Voice Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"Voice Stub Tx Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"Voice Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"}, - {"Voice Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"Voice Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"}, - {"Voice Stub Tx Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"Voice Stub Tx Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"Voice Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"VOICE_STUB_UL", NULL, "Voice Stub Tx Mixer"}, - - {"VoLTE Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"VoLTE Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"VoLTE Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"VOLTE_STUB_UL", NULL, "VoLTE Stub Tx Mixer"}, - - {"Voice2 Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"Voice2 Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"Voice2 Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"VOICE2_STUB_UL", NULL, "Voice2 Stub Tx Mixer"}, - - {"STUB_RX Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"STUB_RX Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"STUB_RX", NULL, "STUB_RX Mixer"}, - - {"SLIMBUS_1_RX Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIMBUS_1_RX Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"}, - - {"SLIMBUS_3_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIMBUS_3_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX_Voice Mixer"}, - - {"SLIM_7_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_7_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_7_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_7_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_7_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_7_RX", NULL, "SLIM_7_RX_Voice Mixer"}, - - {"SLIM_8_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_8_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_8_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_8_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_8_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_8_RX", NULL, "SLIM_8_RX_Voice Mixer"}, - - {"SLIMBUS_1_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SLIMBUS_1_RX Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Port Mixer"}, - {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Port Mixer"}, - {"SLIMBUS_3_RX Port Mixer", "INTERNAL_BT_SCO_RX", "INT_BT_SCO_RX"}, - {"SLIMBUS_3_RX Port Mixer", "AFE_PCM_RX", "PCM_RX"}, - {"SLIMBUS_3_RX Port Mixer", "SLIM_0_RX", "SLIMBUS_0_RX"}, - {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX Port Mixer"}, - - {"SLIMBUS_6_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"SLIMBUS_6_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SLIMBUS_6_RX", NULL, "SLIMBUS_6_RX Port Mixer"}, - - {"HDMI", NULL, "HDMI_RX Port Mixer"}, - - {"DISPLAY_PORT", NULL, "DISPLAY_PORT_RX Port Mixer"}, - - {"DISPLAY_PORT1", NULL, "DISPLAY_PORT_RX1 Port Mixer"}, - - /* Backend Enablement */ - - {"BE_OUT", NULL, "SLIMBUS_0_RX"}, - {"BE_OUT", NULL, "SLIMBUS_1_RX"}, - {"BE_OUT", NULL, "SLIMBUS_2_RX"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "SLIMBUS_4_RX"}, - {"BE_OUT", NULL, "SLIMBUS_5_RX"}, - {"BE_OUT", NULL, "SLIMBUS_6_RX"}, - {"BE_OUT", NULL, "SLIMBUS_7_RX"}, - {"BE_OUT", NULL, "SLIMBUS_8_RX"}, - {"BE_OUT", NULL, "SLIMBUS_9_RX"}, - {"BE_OUT", NULL, "USB_AUDIO_RX"}, - {"BE_OUT", NULL, "HDMI"}, - {"BE_OUT", NULL, "DISPLAY_PORT"}, - {"BE_OUT", NULL, "DISPLAY_PORT1"}, - {"BE_OUT", NULL, "PRI_SPDIF_RX"}, - {"BE_OUT", NULL, "SEC_SPDIF_RX"}, - - {"BE_OUT", NULL, "INT_BT_SCO_RX"}, - {"BE_OUT", NULL, "INT_BT_A2DP_RX"}, - {"BE_OUT", NULL, "INT_FM_RX"}, - {"BE_OUT", NULL, "PCM_RX"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "INT_BT_SCO_RX"}, - {"BE_OUT", NULL, "INT_FM_RX"}, - {"BE_OUT", NULL, "PCM_RX"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "VOICE_PLAYBACK_TX"}, - {"BE_OUT", NULL, "VOICE2_PLAYBACK_TX"}, - {"BE_OUT", NULL, "WSA_CDC_DMA_RX_0"}, - {"BE_OUT", NULL, "WSA_CDC_DMA_RX_1"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_0"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_1"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_2"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_3"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_4"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_5"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_6"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_7"}, - {"BE_OUT", NULL, "PROXY_RX"}, - - {"SLIMBUS_0_TX", NULL, "BE_IN" }, - {"SLIMBUS_1_TX", NULL, "BE_IN" }, - {"SLIMBUS_3_TX", NULL, "BE_IN" }, - {"SLIMBUS_4_TX", NULL, "BE_IN" }, - {"SLIMBUS_5_TX", NULL, "BE_IN" }, - {"SLIMBUS_6_TX", NULL, "BE_IN" }, - {"SLIMBUS_7_TX", NULL, "BE_IN" }, - {"SLIMBUS_8_TX", NULL, "BE_IN" }, - {"SLIMBUS_9_TX", NULL, "BE_IN" }, - {"USB_AUDIO_TX", NULL, "BE_IN" }, - {"INT_BT_SCO_TX", NULL, "BE_IN"}, - {"INT_FM_TX", NULL, "BE_IN"}, - {"PCM_TX", NULL, "BE_IN"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "STUB_RX"}, - {"STUB_TX", NULL, "BE_IN"}, - {"STUB_1_TX", NULL, "BE_IN"}, - {"INCALL_RECORD_TX", NULL, "BE_IN"}, - {"INCALL_RECORD_RX", NULL, "BE_IN"}, - {"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, - {"SLIM0_RX_VI_FB_RCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, - {"WSA_RX_0_VI_FB_LCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"WSA_RX_0_VI_FB_RCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"}, - {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_RCH_MUX"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_LCH_MUX"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_RCH_MUX"}, - {"WSA_CDC_DMA_TX_0", NULL, "BE_IN"}, - {"WSA_CDC_DMA_TX_1", NULL, "BE_IN"}, - {"WSA_CDC_DMA_TX_2", NULL, "BE_IN"}, - {"VA_CDC_DMA_TX_0", NULL, "BE_IN"}, - {"VA_CDC_DMA_TX_1", NULL, "BE_IN"}, - {"VA_CDC_DMA_TX_2", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_0", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_1", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_2", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_3", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_4", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_5", NULL, "BE_IN"}, - {"PRI_SPDIF_TX", NULL, "BE_IN"}, - {"SEC_SPDIF_TX", NULL, "BE_IN"}, - {"PROXY_TX", NULL, "BE_IN"}, -}; - -#ifndef CONFIG_AUXPCM_DISABLE -static const struct snd_soc_dapm_route intercon_aux_pcm[] = { - /* incall */ - {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia2 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia16 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"}, - {"MultiMedia16 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia16 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "QUIN_AUX_PCM_TX", "QUIN_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "QUIN_AUX_PCM_TX", "QUIN_AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "SEN_AUXPCM_UL_TX", "SEN_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "SEN_AUX_PCM_TX", "SEN_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "SEN_AUX_PCM_TX", "SEN_AUX_PCM_TX"}, - - {"MultiMedia21 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia21 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - - {"MultiMedia6 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia6 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - - {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"}, - - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUX_PCM_RX Audio Mixer"}, - - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_AUX_PCM_RX", NULL, "TERT_AUX_PCM_RX Audio Mixer"}, - - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_AUX_PCM_RX", NULL, "QUAT_AUX_PCM_RX Audio Mixer"}, - - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_AUX_PCM_RX", NULL, "QUIN_AUX_PCM_RX Audio Mixer"}, - - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_AUX_PCM_RX", NULL, "SEN_AUX_PCM_RX Audio Mixer"}, - - - {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"}, - - {"SEC_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUX_PCM_RX_Voice Mixer"}, - - {"TERT_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"TERT_AUX_PCM_RX", NULL, "TERT_AUX_PCM_RX_Voice Mixer"}, - - {"QUAT_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUAT_AUX_PCM_RX", NULL, "QUAT_AUX_PCM_RX_Voice Mixer"}, - - {"QUIN_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUIN_AUX_PCM_RX", NULL, "QUIN_AUX_PCM_RX_Voice Mixer"}, - - {"SEN_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEN_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SEN_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEN_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SEN_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SEN_AUX_PCM_RX", NULL, "SEN_AUX_PCM_RX_Voice Mixer"}, - - {"VoiceMMode1_Tx Mixer", "AUX_PCM_TX_MMode1", "AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "SEC_AUX_PCM_TX_MMode1", "SEC_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "TERT_AUX_PCM_TX_MMode1", "TERT_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUAT_AUX_PCM_TX_MMode1", "QUAT_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUIN_AUX_PCM_TX_MMode1", "QUIN_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "SEN_AUX_PCM_TX_MMode1", "SEN_AUX_PCM_TX"}, - - {"VoiceMMode2_Tx Mixer", "AUX_PCM_TX_MMode2", "AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "SEC_AUX_PCM_TX_MMode2", "SEC_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "TERT_AUX_PCM_TX_MMode2", "TERT_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "QUAT_AUX_PCM_TX_MMode2", "QUAT_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "QUIN_AUX_PCM_TX_MMode2", "QUIN_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "SEN_AUX_PCM_TX_MMode2", "SEN_AUX_PCM_TX"}, - - {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"}, - {"Voip_Tx Mixer", "SEC_AUX_PCM_TX_Voip", "SEC_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "TERT_AUX_PCM_TX_Voip", "TERT_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "QUAT_AUX_PCM_TX_Voip", "QUAT_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "QUIN_AUX_PCM_TX_Voip", "QUIN_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "SEN_AUX_PCM_TX_Voip", "SEN_AUX_PCM_TX"}, - - {"QCHAT_Tx Mixer", "AUX_PCM_TX_QCHAT", "AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "SEC_AUX_PCM_TX_QCHAT", "SEC_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "TERT_AUX_PCM_TX_QCHAT", "TERT_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "QUAT_AUX_PCM_TX_QCHAT", "QUAT_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "QUIN_AUX_PCM_TX_QCHAT", "QUIN_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "SEN_AUX_PCM_TX_QCHAT", "SEN_AUX_PCM_TX"}, - - {"Voice2 Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - - /* connect to INT4_MI2S_DL_HL since same pcm_id */ - - {"INTHFP_UL_HL", NULL, "HFP_PRI_AUX_UL_HL"}, - {"HFP_PRI_AUX_UL_HL", "Switch", "AUX_PCM_TX"}, - {"INTHFP_UL_HL", NULL, "HFP_AUX_UL_HL"}, - {"HFP_AUX_UL_HL", "Switch", "SEC_AUX_PCM_TX"}, - {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"}, - {"AUX_PCM_RX", NULL, "INTHFP_DL_HL"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUXPCM_DL_HL"}, - {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"}, - {"SEC_AUXPCM_UL_HL", NULL, "SEC_AUX_PCM_TX"}, - - {"AUX_PCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"AUX_PCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"AUX_PCM_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"AUX_PCM_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"AUX_PCM_RX Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"AUX_PCM_RX Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"AUX_PCM_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUX_PCM_RX", NULL, "AUX_PCM_RX Port Mixer"}, - - {"SEC_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_AUXPCM_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SEC_AUXPCM_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUXPCM_RX Port Mixer"}, - - {"TERT_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_AUXPCM_RX Port Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"TERT_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"TERT_AUX_PCM_RX", NULL, "TERT_AUXPCM_RX Port Mixer"}, - - {"QUAT_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_AUXPCM_RX Port Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"QUAT_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUAT_AUX_PCM_RX", NULL, "QUAT_AUXPCM_RX Port Mixer"}, - - {"QUIN_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_AUXPCM_RX Port Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"QUIN_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUIN_AUX_PCM_RX", NULL, "QUIN_AUXPCM_RX Port Mixer"}, - - {"Voice Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "SEN_AUXPCM_UL_TX", "SEN_AUX_PCM_TX"}, - - {"SLIMBUS_1_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SLIMBUS_3_RX Port Mixer", "AUX_PCM_RX", "AUX_PCM_RX"}, - - {"SLIMBUS_6_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - - /* Backend Enablement */ - - {"BE_OUT", NULL, "AUX_PCM_RX"}, - {"BE_OUT", NULL, "SEC_AUX_PCM_RX"}, - {"BE_OUT", NULL, "TERT_AUX_PCM_RX"}, - {"BE_OUT", NULL, "QUAT_AUX_PCM_RX"}, - {"BE_OUT", NULL, "QUIN_AUX_PCM_RX"}, - {"BE_OUT", NULL, "SEN_AUX_PCM_RX"}, - - {"AUX_PCM_TX", NULL, "BE_IN"}, - {"SEC_AUX_PCM_TX", NULL, "BE_IN"}, - {"TERT_AUX_PCM_TX", NULL, "BE_IN"}, - {"QUAT_AUX_PCM_TX", NULL, "BE_IN"}, - {"QUIN_AUX_PCM_TX", NULL, "BE_IN"}, - {"SEN_AUX_PCM_TX", NULL, "BE_IN"}, -}; -#endif - -#ifndef CONFIG_TDM_DISABLE -static const struct snd_soc_dapm_route intercon_tdm[] = { - /* incall */ - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0 Audio Mixer"}, - - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1 Audio Mixer"}, - - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2 Audio Mixer"}, - - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3 Audio Mixer"}, - - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"PRI_TDM_TX_0", NULL, "PRI_TDM_TX_0 Audio Mixer"}, - - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0 Audio Mixer"}, - - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"SEC_TDM_RX_1", NULL, "SEC_TDM_RX_1 Audio Mixer"}, - - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"SEC_TDM_RX_2", NULL, "SEC_TDM_RX_2 Audio Mixer"}, - - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3 Audio Mixer"}, - - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"SEC_TDM_TX_0", NULL, "SEC_TDM_TX_0 Audio Mixer"}, - - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0 Audio Mixer"}, - - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"TERT_TDM_TX_0", NULL, "TERT_TDM_TX_0 Audio Mixer"}, - - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"TERT_TDM_RX_1", NULL, "TERT_TDM_RX_1 Audio Mixer"}, - - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"TERT_TDM_RX_2", NULL, "TERT_TDM_RX_2 Audio Mixer"}, - - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"TERT_TDM_RX_3", NULL, "TERT_TDM_RX_3 Audio Mixer"}, - - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"TERT_TDM_RX_4", NULL, "TERT_TDM_RX_4 Audio Mixer"}, - - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Audio Mixer"}, - - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUAT_TDM_TX_0", NULL, "QUAT_TDM_TX_0 Audio Mixer"}, - - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1 Audio Mixer"}, - - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2 Audio Mixer"}, - - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Audio Mixer"}, - - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Audio Mixer"}, - - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUIN_TDM_TX_0", NULL, "QUIN_TDM_TX_0 Audio Mixer"}, - - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1 Audio Mixer"}, - - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2 Audio Mixer"}, - - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia22", "MM_DL22"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Audio Mixer"}, - - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEN_TDM_RX_0", NULL, "SEN_TDM_RX_0 Audio Mixer"}, - - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_TDM_TX_0", NULL, "SEN_TDM_TX_0 Audio Mixer"}, - - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEN_TDM_RX_1", NULL, "SEN_TDM_RX_1 Audio Mixer"}, - - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEN_TDM_RX_2", NULL, "SEN_TDM_RX_2 Audio Mixer"}, - - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEN_TDM_RX_3", NULL, "SEN_TDM_RX_3 Audio Mixer"}, - - {"MultiMedia1 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia1 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia1 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia1 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia1 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia1 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia1 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia1 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia1 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia2 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia2 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia2 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia2 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia2 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia2 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia2 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia2 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia2 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia3 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia3 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia3 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia3 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia3 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia3 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia3 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia3 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia3 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia4 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia4 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia4 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia4 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia4 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia4 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia4 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia4 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia4 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia5 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia5 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia5 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia5 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia5 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia5 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia5 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia5 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia5 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia6 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia6 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia6 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia6 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia6 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia6 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia6 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia6 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia6 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia8 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia8 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia8 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia8 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia8 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia8 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia8 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia8 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia8 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia9 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia9 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia9 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia9 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia9 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia10 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia10 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia10 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia10 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia20 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia20 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia20 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia20 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia21 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia21 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia21 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia21 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia21 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"MultiMedia21 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"MultiMedia21 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"MultiMedia21 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - - {"MultiMedia22 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia22 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia22 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia22 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia22 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia22 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia22 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia22 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia22 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia22 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia22 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia22 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia22 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia22 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia22 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia22 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia22 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia22 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia22 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia22 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - - {"MultiMedia23 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia23 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia23 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia23 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia23 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia23 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia23 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia23 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia23 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia23 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia23 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia23 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia23 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia23 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia23 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia23 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia23 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia23 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia23 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia23 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - - {"MultiMedia16 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia16 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia16 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia16 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_0_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_TDM_RX_0_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"}, - {"PRI_TDM_RX_0_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"PRI_TDM_RX_0_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"PRI_TDM_RX_0_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_TDM_RX_0_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_TDM_RX_0_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_TDM_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0_Voice Mixer"}, - - {"PRI_TDM_RX_1_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_TDM_RX_1_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"}, - {"PRI_TDM_RX_1_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"PRI_TDM_RX_1_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"PRI_TDM_RX_1_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_TDM_RX_1_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_TDM_RX_1_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_TDM_RX_1_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1_Voice Mixer"}, - - {"PRI_TDM_RX_2_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_TDM_RX_2_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"}, - {"PRI_TDM_RX_2_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"PRI_TDM_RX_2_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"PRI_TDM_RX_2_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_TDM_RX_2_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_TDM_RX_2_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_TDM_RX_2_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2_Voice Mixer"}, - - {"PRI_TDM_RX_3_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_TDM_RX_3_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"}, - {"PRI_TDM_RX_3_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"PRI_TDM_RX_3_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"PRI_TDM_RX_3_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_TDM_RX_3_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_TDM_RX_3_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_TDM_RX_3_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3_Voice Mixer"}, - - {"QUAT_TDM_RX_2_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2_Voice Mixer"}, - - {"QUIN_TDM_RX_2_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2_Voice Mixer"}, - - {"VoiceMMode1_Tx Mixer", "QUAT_TDM_TX_0_MMode1", "QUAT_TDM_TX_0"}, - {"VoiceMMode2_Tx Mixer", "PRI_TDM_TX_3_MMode2", "PRI_TDM_TX_3"}, - {"VoiceMMode1_Tx Mixer", "PRI_TDM_TX_3_MMode1", "PRI_TDM_TX_3"}, - - {"VOC_EXT_EC MUX", "PRI_TDM_TX", "PRI_TDM_TX_0"}, - {"VOC_EXT_EC MUX", "SEC_TDM_TX", "SEC_TDM_TX_0"}, - /* connect to INT4_MI2S_DL_HL since same pcm_id */ - - {"PRI_TDM_TX_0_UL_HL", NULL, "PRI_TDM_TX_0"}, - {"PRI_TDM_TX_1_UL_HL", NULL, "PRI_TDM_TX_1"}, - {"PRI_TDM_TX_2_UL_HL", NULL, "PRI_TDM_TX_2"}, - {"PRI_TDM_TX_3_UL_HL", NULL, "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0_DL_HL"}, - {"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1_DL_HL"}, - {"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2_DL_HL"}, - {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3_DL_HL"}, - {"SEC_TDM_TX_0_UL_HL", NULL, "SEC_TDM_TX_0"}, - {"SEC_TDM_TX_1_UL_HL", NULL, "SEC_TDM_TX_1"}, - {"SEC_TDM_TX_2_UL_HL", NULL, "SEC_TDM_TX_2"}, - {"SEC_TDM_TX_3_UL_HL", NULL, "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0_DL_HL"}, - {"SEC_TDM_RX_1", NULL, "SEC_TDM_RX_1_DL_HL"}, - {"SEC_TDM_RX_2", NULL, "SEC_TDM_RX_2_DL_HL"}, - {"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3_DL_HL"}, - {"SEC_TDM_RX_7", NULL, "SEC_TDM_RX_7_DL_HL"}, - {"TERT_TDM_TX_0_UL_HL", NULL, "TERT_TDM_TX_0"}, - {"TERT_TDM_TX_1_UL_HL", NULL, "TERT_TDM_TX_1"}, - {"TERT_TDM_TX_2_UL_HL", NULL, "TERT_TDM_TX_2"}, - {"TERT_TDM_TX_3_UL_HL", NULL, "TERT_TDM_TX_3"}, - {"TERT_TDM_TX_7_UL_HL", NULL, "TERT_TDM_TX_7"}, - {"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0_DL_HL"}, - {"TERT_TDM_RX_1", NULL, "TERT_TDM_RX_1_DL_HL"}, - {"TERT_TDM_RX_2", NULL, "TERT_TDM_RX_2_DL_HL"}, - {"TERT_TDM_RX_3", NULL, "TERT_TDM_RX_3_DL_HL"}, - {"QUAT_TDM_TX_0_UL_HL", NULL, "QUAT_TDM_TX_0"}, - {"QUAT_TDM_TX_1_UL_HL", NULL, "QUAT_TDM_TX_1"}, - {"QUAT_TDM_TX_2_UL_HL", NULL, "QUAT_TDM_TX_2"}, - {"QUAT_TDM_TX_3_UL_HL", NULL, "QUAT_TDM_TX_3"}, - {"QUAT_TDM_TX_7_UL_HL", NULL, "QUAT_TDM_TX_7"}, - {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0_DL_HL"}, - {"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1_DL_HL"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2_DL_HL"}, - {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3_DL_HL"}, - {"QUAT_TDM_RX_7", NULL, "QUAT_TDM_RX_7_DL_HL"}, - {"QUIN_TDM_TX_0_UL_HL", NULL, "QUIN_TDM_TX_0"}, - {"QUIN_TDM_TX_1_UL_HL", NULL, "QUIN_TDM_TX_1"}, - {"QUIN_TDM_TX_2_UL_HL", NULL, "QUIN_TDM_TX_2"}, - {"QUIN_TDM_TX_3_UL_HL", NULL, "QUIN_TDM_TX_3"}, - {"QUIN_TDM_TX_7_UL_HL", NULL, "QUIN_TDM_TX_7"}, - {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0_DL_HL"}, - {"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1_DL_HL"}, - {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2_DL_HL"}, - {"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3_DL_HL"}, - {"QUIN_TDM_RX_7", NULL, "QUIN_TDM_RX_7_DL_HL"}, - {"SEN_TDM_TX_0_UL_HL", NULL, "SEN_TDM_TX_0"}, - {"SEN_TDM_TX_1_UL_HL", NULL, "SEN_TDM_TX_1"}, - {"SEN_TDM_TX_2_UL_HL", NULL, "SEN_TDM_TX_2"}, - {"SEN_TDM_TX_3_UL_HL", NULL, "SEN_TDM_TX_3"}, - {"SEN_TDM_RX_0", NULL, "SEN_TDM_RX_0_DL_HL"}, - {"SEN_TDM_RX_1", NULL, "SEN_TDM_RX_1_DL_HL"}, - {"SEN_TDM_RX_2", NULL, "SEN_TDM_RX_2_DL_HL"}, - {"SEN_TDM_RX_3", NULL, "SEN_TDM_RX_3_DL_HL"}, - -#ifndef CONFIG_MI2S_DISABLE - {"PRI_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"PRI_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"PRI_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"PRI_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"PRI_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"PRI_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"PRI_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"PRI_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"PRI_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"PRI_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"PRI_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3 Port Mixer"}, - - {"SEC_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0 Port Mixer"}, - - {"SEC_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEC_TDM_RX_1", NULL, "SEC_TDM_RX_1 Port Mixer"}, - - {"SEC_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEC_TDM_RX_2", NULL, "SEC_TDM_RX_2 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"SEC_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"SEC_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"SEC_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3 Port Mixer"}, - - {"SEC_TDM_RX_7 Port Mixer", "TERT_TDM_TX_7", "TERT_TDM_TX_7"}, - {"SEC_TDM_RX_7", NULL, "SEC_TDM_RX_7 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"TERT_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"TERT_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"TERT_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"TERT_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"TERT_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"TERT_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"TERT_TDM_RX_1", NULL, "TERT_TDM_RX_1 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"TERT_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"TERT_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"TERT_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"TERT_TDM_RX_2", NULL, "TERT_TDM_RX_2 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"TERT_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, -#endif - {"TERT_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"TERT_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"TERT_TDM_RX_3", NULL, "TERT_TDM_RX_3 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUAT_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUAT_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUAT_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUAT_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUAT_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUAT_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUAT_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUAT_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUAT_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUAT_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUAT_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Port Mixer"}, - - {"QUAT_TDM_RX_7 Port Mixer", "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"}, - {"QUAT_TDM_RX_7 Port Mixer", "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"}, - {"QUAT_TDM_RX_7", NULL, "QUAT_TDM_RX_7 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUIN_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUIN_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUIN_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUIN_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUIN_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUIN_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUIN_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUIN_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUIN_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"QUIN_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"QUIN_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUIN_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Port Mixer"}, - - {"QUIN_TDM_RX_7 Port Mixer", "TERT_TDM_TX_7", "TERT_TDM_TX_7"}, - {"QUIN_TDM_RX_7 Port Mixer", "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"}, - {"QUIN_TDM_RX_7 Port Mixer", "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"}, - {"QUIN_TDM_RX_7", NULL, "QUIN_TDM_RX_7 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"SEN_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEN_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEN_TDM_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"SEN_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEN_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEN_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"SEN_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEN_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEN_TDM_RX_0", NULL, "SEN_TDM_RX_0 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"SEN_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEN_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEN_TDM_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"SEN_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEN_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEN_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEN_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEN_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEN_TDM_RX_1", NULL, "SEN_TDM_RX_1 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"SEN_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEN_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEN_TDM_RX_2 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"SEN_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEN_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEN_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"SEN_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEN_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEN_TDM_RX_2", NULL, "SEN_TDM_RX_2 Port Mixer"}, - -#ifndef CONFIG_MI2S_DISABLE - {"SEN_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEN_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEN_TDM_RX_3 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, -#endif - {"SEN_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEN_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEN_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"SEN_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEN_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"}, - {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"}, - {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"}, - {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, - {"SEN_TDM_RX_3", NULL, "SEN_TDM_RX_3 Port Mixer"}, - - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_0", "QUAT_TDM_RX_0"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_1", "QUAT_TDM_RX_1"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_2", "QUAT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL1 MUX", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"AUDIO_REF_EC_UL1 MUX", "TERT_TDM_RX_2", "TERT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL1 MUX", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_0", "QUAT_TDM_RX_0"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_1", "QUAT_TDM_RX_1"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_2", "QUAT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL10 MUX", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"AUDIO_REF_EC_UL10 MUX", "TERT_TDM_RX_2", "TERT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL10 MUX", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - - {"AUDIO_REF_EC_UL16 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL17 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL18 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL19 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL28 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL29 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"LSM1_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM2_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM3_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM4_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM5_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM6_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM7_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM8_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - - {"MM_UL1", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"MM_UL2", NULL, "AUDIO_REF_EC_UL2 MUX"}, - {"MM_UL3", NULL, "AUDIO_REF_EC_UL3 MUX"}, - {"MM_UL4", NULL, "AUDIO_REF_EC_UL4 MUX"}, - {"MM_UL5", NULL, "AUDIO_REF_EC_UL5 MUX"}, - {"MM_UL6", NULL, "AUDIO_REF_EC_UL6 MUX"}, - {"MM_UL8", NULL, "AUDIO_REF_EC_UL8 MUX"}, - {"MM_UL9", NULL, "AUDIO_REF_EC_UL9 MUX"}, - {"MM_UL10", NULL, "AUDIO_REF_EC_UL10 MUX"}, - {"MM_UL16", NULL, "AUDIO_REF_EC_UL16 MUX"}, - {"MM_UL17", NULL, "AUDIO_REF_EC_UL17 MUX"}, - {"MM_UL18", NULL, "AUDIO_REF_EC_UL18 MUX"}, - {"MM_UL19", NULL, "AUDIO_REF_EC_UL19 MUX"}, - {"MM_UL28", NULL, "AUDIO_REF_EC_UL28 MUX"}, - {"MM_UL29", NULL, "AUDIO_REF_EC_UL29 MUX"}, - {"MM_UL30", NULL, "AUDIO_REF_EC_UL30 MUX"}, - - {"VoiceMMode1_Tx Mixer", "PRI_TX_MMode1", "PRI_I2S_TX"}, - {"VoiceMMode1_Tx Mixer", "PRI_MI2S_TX_MMode1", "PRI_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "MI2S_TX_MMode1", "MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "SEC_MI2S_TX_MMode1", "SEC_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "TERT_MI2S_TX_MMode1", "TERT_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "INT3_MI2S_TX_MMode1", "INT3_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_0_TX_MMode1", "SLIMBUS_0_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_7_TX_MMode1", "SLIMBUS_7_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_8_TX_MMode1", "SLIMBUS_8_TX"}, - {"VoiceMMode1_Tx Mixer", "USB_AUDIO_TX_MMode1", "USB_AUDIO_TX"}, - {"VoiceMMode1_Tx Mixer", "INT_BT_SCO_TX_MMode1", "INT_BT_SCO_TX"}, - {"VoiceMMode1_Tx Mixer", "AFE_PCM_TX_MMode1", "PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "AUX_PCM_TX_MMode1", "AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "SEC_AUX_PCM_TX_MMode1", "SEC_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "TERT_AUX_PCM_TX_MMode1", "TERT_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUAT_AUX_PCM_TX_MMode1", "QUAT_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUIN_AUX_PCM_TX_MMode1", "QUIN_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "SEN_AUX_PCM_TX_MMode1", "SEN_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUAT_TDM_TX_0_MMode1", "QUAT_TDM_TX_0"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_0_MMode1", "TX_CDC_DMA_TX_0"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_1_MMode1", "TX_CDC_DMA_TX_1"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_2_MMode1", "TX_CDC_DMA_TX_2"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_3_MMode1", "TX_CDC_DMA_TX_3"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_4_MMode1", "TX_CDC_DMA_TX_4"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_5_MMode1", "TX_CDC_DMA_TX_5"}, - {"VoiceMMode1_Tx Mixer", "QUAT_MI2S_TX_MMode1", "QUAT_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "QUIN_MI2S_TX_MMode1", "QUIN_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "PRI_TDM_TX_3_MMode1", "PRI_TDM_TX_3"}, - {"VOICEMMODE1_UL", NULL, "VoiceMMode1_Tx Mixer"}, - - {"VoiceMMode2_Tx Mixer", "PRI_TX_MMode2", "PRI_I2S_TX"}, - {"VoiceMMode2_Tx Mixer", "PRI_MI2S_TX_MMode2", "PRI_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "SEC_MI2S_TX_MMode2", "SEC_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "MI2S_TX_MMode2", "MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "TERT_MI2S_TX_MMode2", "TERT_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "INT3_MI2S_TX_MMode2", "INT3_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_0_TX_MMode2", "SLIMBUS_0_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_7_TX_MMode2", "SLIMBUS_7_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_8_TX_MMode2", "SLIMBUS_8_TX"}, - {"VoiceMMode2_Tx Mixer", "USB_AUDIO_TX_MMode2", "USB_AUDIO_TX"}, - {"VoiceMMode2_Tx Mixer", "INT_BT_SCO_TX_MMode2", "INT_BT_SCO_TX"}, - {"VoiceMMode2_Tx Mixer", "AFE_PCM_TX_MMode2", "PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "AUX_PCM_TX_MMode2", "AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "SEC_AUX_PCM_TX_MMode2", "SEC_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "TERT_AUX_PCM_TX_MMode2", "TERT_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "QUAT_AUX_PCM_TX_MMode2", "QUAT_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "QUIN_AUX_PCM_TX_MMode2", "QUIN_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "SEN_AUX_PCM_TX_MMode2", "SEN_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_0_MMode2", "TX_CDC_DMA_TX_0"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_1_MMode2", "TX_CDC_DMA_TX_1"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_2_MMode2", "TX_CDC_DMA_TX_2"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_3_MMode2", "TX_CDC_DMA_TX_3"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_4_MMode2", "TX_CDC_DMA_TX_4"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_5_MMode2", "TX_CDC_DMA_TX_5"}, - {"VoiceMMode2_Tx Mixer", "QUAT_MI2S_TX_MMode2", "QUAT_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "QUIN_MI2S_TX_MMode2", "QUIN_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "PRI_TDM_TX_3_MMode2", "PRI_TDM_TX_3"}, - {"VOICEMMODE2_UL", NULL, "VoiceMMode2_Tx Mixer"}, - - {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"}, - {"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"}, - {"Voip_Tx Mixer", "SEC_MI2S_TX_Voip", "SEC_MI2S_TX"}, - {"Voip_Tx Mixer", "TERT_MI2S_TX_Voip", "TERT_MI2S_TX"}, - {"Voip_Tx Mixer", "INT3_MI2S_TX_Voip", "INT3_MI2S_TX"}, - {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"}, - {"Voip_Tx Mixer", "SLIM_7_TX_Voip", "SLIMBUS_7_TX"}, - {"Voip_Tx Mixer", "SLIM_8_TX_Voip", "SLIMBUS_8_TX"}, - {"Voip_Tx Mixer", "USB_AUDIO_TX_Voip", "USB_AUDIO_TX"}, - {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"}, - {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"}, - {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"}, - {"Voip_Tx Mixer", "SEC_AUX_PCM_TX_Voip", "SEC_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "TERT_AUX_PCM_TX_Voip", "TERT_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "QUAT_AUX_PCM_TX_Voip", "QUAT_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "QUIN_AUX_PCM_TX_Voip", "QUIN_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "SEN_AUX_PCM_TX_Voip", "SEN_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "PRI_MI2S_TX_Voip", "PRI_MI2S_TX"}, - {"Voip_Tx Mixer", "PRI_TDM_TX_3_Voip", "PRI_TDM_TX_3"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_0_Voip", "TX_CDC_DMA_TX_0"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_1_Voip", "TX_CDC_DMA_TX_1"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_2_Voip", "TX_CDC_DMA_TX_2"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_3_Voip", "TX_CDC_DMA_TX_3"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_4_Voip", "TX_CDC_DMA_TX_4"}, - {"Voip_Tx Mixer", "TX_CDC_DMA_TX_5_Voip", "TX_CDC_DMA_TX_5"}, - {"VOIP_UL", NULL, "Voip_Tx Mixer"}, - - {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"}, - {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"}, - {"SLIMBUS1_DL_HL", "Switch", "SLIM1_DL_HL"}, - {"SLIMBUS_1_RX", NULL, "SLIMBUS1_DL_HL"}, - {"SLIMBUS3_DL_HL", "Switch", "SLIM3_DL_HL"}, - {"SLIMBUS_3_RX", NULL, "SLIMBUS3_DL_HL"}, - {"SLIMBUS4_DL_HL", "Switch", "SLIM4_DL_HL"}, - {"SLIMBUS_4_RX", NULL, "SLIMBUS4_DL_HL"}, - {"SLIMBUS6_DL_HL", "Switch", "SLIM0_DL_HL"}, - {"SLIMBUS_6_RX", NULL, "SLIMBUS6_DL_HL"}, - {"SCO_SLIM7_DL_HL", "Switch", "SLIM7_DL_HL"}, - {"SLIMBUS_7_RX", NULL, "SCO_SLIM7_DL_HL"}, - {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"}, - {"SLIM1_UL_HL", NULL, "SLIMBUS_1_TX"}, - {"SLIM3_UL_HL", NULL, "SLIMBUS_3_TX"}, - {"SLIM4_UL_HL", NULL, "SLIMBUS_4_TX"}, - {"SLIM8_UL_HL", NULL, "SLIMBUS_8_TX"}, - {"WSA_CDC_DMA_RX_0_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0_DL_HL"}, - {"CDC_DMA_UL_HL", NULL, "VA_CDC_DMA_TX_0"}, - {"RX_CDC_DMA_RX_0_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0_DL_HL"}, - {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_0_DL_HL"}, - {"RX_CDC_DMA_RX_1_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1_DL_HL"}, - {"TX3_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_3"}, - {"LSM1 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM1 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM1 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM1 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM1 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM1 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM1 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_2"}, - {"LSM1 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM1 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM1 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"LSM2 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM2 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"LSM3 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM3 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"LSM4 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM4 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"LSM5 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM5 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"LSM6 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM6 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"LSM7 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM7 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"LSM8 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM8 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - - {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SEN_AUXPCM_UL_TX", "SEN_AUX_PCM_TX"}, - /* Backend Enablement */ - - {"BE_OUT", NULL, "PRI_TDM_RX_0"}, - {"BE_OUT", NULL, "PRI_TDM_RX_1"}, - {"BE_OUT", NULL, "PRI_TDM_RX_2"}, - {"BE_OUT", NULL, "PRI_TDM_RX_3"}, - {"BE_OUT", NULL, "SEC_TDM_RX_0"}, - {"BE_OUT", NULL, "SEC_TDM_RX_1"}, - {"BE_OUT", NULL, "SEC_TDM_RX_2"}, - {"BE_OUT", NULL, "SEC_TDM_RX_3"}, - {"BE_OUT", NULL, "SEC_TDM_RX_7"}, - {"BE_OUT", NULL, "TERT_TDM_RX_0"}, - {"BE_OUT", NULL, "TERT_TDM_RX_1"}, - {"BE_OUT", NULL, "TERT_TDM_RX_2"}, - {"BE_OUT", NULL, "TERT_TDM_RX_3"}, - {"BE_OUT", NULL, "TERT_TDM_RX_4"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_0"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_1"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_2"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_3"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_7"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_0"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_1"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_2"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_3"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_7"}, - {"BE_OUT", NULL, "SEN_TDM_RX_0"}, - {"BE_OUT", NULL, "SEN_TDM_RX_1"}, - {"BE_OUT", NULL, "SEN_TDM_RX_2"}, - {"BE_OUT", NULL, "SEN_TDM_RX_3"}, - - {"PRI_TDM_TX_0", NULL, "BE_IN"}, - {"PRI_TDM_TX_1", NULL, "BE_IN"}, - {"PRI_TDM_TX_2", NULL, "BE_IN"}, - {"PRI_TDM_TX_3", NULL, "BE_IN"}, - {"SEC_TDM_TX_0", NULL, "BE_IN"}, - {"SEC_TDM_TX_1", NULL, "BE_IN"}, - {"SEC_TDM_TX_2", NULL, "BE_IN"}, - {"SEC_TDM_TX_3", NULL, "BE_IN"}, - {"TERT_TDM_TX_0", NULL, "BE_IN"}, - {"TERT_TDM_TX_1", NULL, "BE_IN"}, - {"TERT_TDM_TX_2", NULL, "BE_IN"}, - {"TERT_TDM_TX_3", NULL, "BE_IN"}, - {"TERT_TDM_TX_7", NULL, "BE_IN"}, - {"QUAT_TDM_TX_0", NULL, "BE_IN"}, - {"QUAT_TDM_TX_1", NULL, "BE_IN"}, - {"QUAT_TDM_TX_2", NULL, "BE_IN"}, - {"QUAT_TDM_TX_3", NULL, "BE_IN"}, - {"QUAT_TDM_TX_7", NULL, "BE_IN"}, - {"AFE_LOOPBACK_TX", NULL, "BE_IN"}, - {"QUIN_TDM_TX_0", NULL, "BE_IN"}, - {"QUIN_TDM_TX_1", NULL, "BE_IN"}, - {"QUIN_TDM_TX_2", NULL, "BE_IN"}, - {"QUIN_TDM_TX_3", NULL, "BE_IN"}, - {"QUIN_TDM_TX_7", NULL, "BE_IN"}, - {"SEN_TDM_TX_0", NULL, "BE_IN"}, - {"SEN_TDM_TX_1", NULL, "BE_IN"}, - {"SEN_TDM_TX_2", NULL, "BE_IN"}, - {"SEN_TDM_TX_3", NULL, "BE_IN"}, -}; -#endif - -#ifndef CONFIG_MI2S_DISABLE -static const struct snd_soc_dapm_route intercon_mi2s[] = { - {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"}, - - {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"}, - - - /* incall */ - {"MultiMedia2 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia4 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia17 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia18 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia19 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia28 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia29 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia30 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia8 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia18 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia19 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia28 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia29 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia30 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia17 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia18 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia19 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia28 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia29 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia30 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia17 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia18 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia19 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia28 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia29 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia30 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia8 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - - {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"}, - - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX Audio Mixer"}, - - {"TERT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX Audio Mixer"}, - - {"SEC_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX Audio Mixer"}, - - {"SEC_MI2S_RX_SD1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_MI2S_RX_SD1", NULL, "SEC_MI2S_RX_SD1 Audio Mixer"}, - - {"SEC_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - - {"PRI_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX Audio Mixer"}, - {"PRI_MI2S_RX Audio Mixer", "DTMF", "DTMF_DL_HL"}, - - {"INT0_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX Audio Mixer"}, - - {"INT4_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX Audio Mixer"}, - - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX Audio Mixer"}, - - {"SEN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX Audio Mixer"}, - - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_META_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"PRI_META_MI2S_RX", NULL, "PRI_META_MI2S_RX Audio Mixer"}, - - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_META_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SEC_META_MI2S_RX", NULL, "SEC_META_MI2S_RX Audio Mixer"}, - - {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"}, - {"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia3 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia5 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia10 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia16 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia2 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia6 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia1 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia2 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia1 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"MultiMedia2 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"MultiMedia1 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia2 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia1 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia2 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia1 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia2 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia1 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia1 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia2 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia6 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia3 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia5 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia10 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia6 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia3 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia5 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia10 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia16 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia6 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia3 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia5 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia10 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia16 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia17 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia18 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia19 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia28 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia29 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia30 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia6 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia6 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia6 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia6 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - - {"MultiMedia20 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia20 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia20 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia20 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia20 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia20 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - - {"MultiMedia27 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia27 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia27 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia27 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia27 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia27 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - - {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"}, - - {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEC_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SEC_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"}, - - {"SEC_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SEC_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX_Voice Mixer"}, - - - {"MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"}, - - {"PRI_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_Voice Mixer"}, - - {"INT0_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"INT0_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"INT0_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"INT0_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"INT0_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX_Voice Mixer"}, - - {"INT4_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"INT4_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"INT4_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"INT4_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"INT4_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_Voice Mixer"}, - - {"TERT_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"TERT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX_Voice Mixer"}, - - {"QUAT_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_Voice Mixer"}, - - {"QUIN_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX_Voice Mixer"}, - - {"SEN_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEN_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEN_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SEN_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX_Voice Mixer"}, - - - {"VOC_EXT_EC MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"VOC_EXT_EC MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"VOC_EXT_EC MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"VOC_EXT_EC MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"VOC_EXT_EC MUX", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - - {"AUDIO_REF_EC_UL1 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL2 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL2 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL2 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL2 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL3 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL3 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL3 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL3 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL4 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL4 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL4 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL4 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL5 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL5 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL5 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL5 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL6 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL6 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL6 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL6 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL8 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL8 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL8 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL8 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL9 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL9 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL9 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL9 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL10 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL16 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL17 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL18 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL19 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL28 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL29 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"VoiceMMode1_Tx Mixer", "PRI_TX_MMode1", "PRI_I2S_TX"}, - {"VoiceMMode1_Tx Mixer", "PRI_MI2S_TX_MMode1", "PRI_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "MI2S_TX_MMode1", "MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "SEC_MI2S_TX_MMode1", "SEC_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "TERT_MI2S_TX_MMode1", "TERT_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "INT3_MI2S_TX_MMode1", "INT3_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "QUAT_MI2S_TX_MMode1", "QUAT_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "QUIN_MI2S_TX_MMode1", "QUIN_MI2S_TX"}, - - {"VoiceMMode2_Tx Mixer", "PRI_TX_MMode2", "PRI_I2S_TX"}, - {"VoiceMMode2_Tx Mixer", "PRI_MI2S_TX_MMode2", "PRI_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "SEC_MI2S_TX_MMode2", "SEC_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "MI2S_TX_MMode2", "MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "TERT_MI2S_TX_MMode2", "TERT_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "INT3_MI2S_TX_MMode2", "INT3_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "QUAT_MI2S_TX_MMode2", "QUAT_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "QUIN_MI2S_TX_MMode2", "QUIN_MI2S_TX"}, - {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"}, - {"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"}, - {"Voip_Tx Mixer", "SEC_MI2S_TX_Voip", "SEC_MI2S_TX"}, - {"Voip_Tx Mixer", "TERT_MI2S_TX_Voip", "TERT_MI2S_TX"}, - {"Voip_Tx Mixer", "INT3_MI2S_TX_Voip", "INT3_MI2S_TX"}, - {"Voip_Tx Mixer", "PRI_MI2S_TX_Voip", "PRI_MI2S_TX"}, - {"Voip_Tx Mixer", "PRI_TDM_TX_3_Voip", "PRI_TDM_TX_3"}, - - {"LSM1 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM1 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM2 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM2 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM2 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - - {"LSM3 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM3 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM3 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - - {"LSM4 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM4 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM4 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - - {"LSM5 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM5 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM5 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM6 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"LSM7 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"LSM8 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"QCHAT_Tx Mixer", "PRI_TX_QCHAT", "PRI_I2S_TX"}, - {"QCHAT_Tx Mixer", "MI2S_TX_QCHAT", "MI2S_TX"}, - {"QCHAT_Tx Mixer", "PRI_MI2S_TX_QCHAT", "PRI_MI2S_TX"}, - {"QCHAT_Tx Mixer", "TERT_MI2S_TX_QCHAT", "TERT_MI2S_TX"}, - {"QCHAT_Tx Mixer", "INT3_MI2S_TX_QCHAT", "INT3_MI2S_TX"}, - - {"MI2S_RX", NULL, "MI2S_DL_HL"}, - {"MI2S_UL_HL", NULL, "MI2S_TX"}, - - /* connect to INT4_MI2S_DL_HL since same pcm_id */ - - {"WSA_CDC_DMA_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"RX_CDC_DMA_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"RX_CDC_DMA_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - - {"SLIMBUS_0_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - - {"SLIMBUS_6_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"INT0_MI2S_RX_DL_HL", "Switch", "INT4_MI2S_DL_HL"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX_DL_HL"}, - {"INT4_MI2S_RX_DL_HL", "Switch", "INT4_MI2S_DL_HL"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_DL_HL"}, - {"PRI_MI2S_RX_DL_HL", "Switch", "PRI_MI2S_DL_HL"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_DL_HL"}, - {"SEC_MI2S_RX_DL_HL", "Switch", "SEC_MI2S_DL_HL"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX_DL_HL"}, - {"TERT_MI2S_RX_DL_HL", "Switch", "TERT_MI2S_DL_HL"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX_DL_HL"}, - - {"QUAT_MI2S_RX_DL_HL", "Switch", "QUAT_MI2S_DL_HL"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_DL_HL"}, - {"QUIN_MI2S_RX_DL_HL", "Switch", "QUIN_MI2S_DL_HL"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX_DL_HL"}, - {"SEN_MI2S_RX_DL_HL", "Switch", "SEN_MI2S_DL_HL"}, - {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX_DL_HL"}, - {"MI2S_UL_HL", NULL, "TERT_MI2S_TX"}, - {"INT3_MI2S_UL_HL", NULL, "INT3_MI2S_TX"}, - {"TERT_MI2S_UL_HL", NULL, "TERT_MI2S_TX"}, - {"SEC_I2S_RX", NULL, "SEC_I2S_DL_HL"}, - {"PRI_MI2S_UL_HL", NULL, "PRI_MI2S_TX"}, - {"SEC_MI2S_UL_HL", NULL, "SEC_MI2S_TX"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_DL_HL"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_DL_HL"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_DL_HL"}, - {"QUAT_MI2S_UL_HL", NULL, "QUAT_MI2S_TX"}, - - {"INT0_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"INT0_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"INT0_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"INT0_MI2S_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"INT0_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX Port Mixer"}, - - {"INT4_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"INT4_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"INT4_MI2S_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"INT4_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"INT4_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX Port Mixer"}, - - {"Voice Stub Tx Mixer", "MI2S_TX", "MI2S_TX"}, - {"Voice Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"Voice Stub Tx Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"Voice Stub Tx Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"Voice Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"VoLTE Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"VoLTE Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"Voice2 Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"Voice2 Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"Voice2 Stub Tx Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - - - {"SEC_I2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SEC_I2S_RX", NULL, "SEC_I2S_RX Port Mixer"}, - - {"MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MI2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"MI2S_RX", NULL, "MI2S_RX Port Mixer"}, - - {"PRI_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"PRI_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"PRI_MI2S_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, -#endif - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX Port Mixer"}, - - {"SEC_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SEC_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"SEC_MI2S_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, -#endif - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX Port Mixer"}, - - {"TERT_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"TERT_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX Port Mixer"}, - - {"QUAT_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"SEN_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUAT_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, -#ifndef CONFIG_AUXPCM_DISABLE - {"QUAT_MI2S_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, -#endif - {"QUAT_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX Port Mixer"}, - - {"QUIN_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUIN_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX Port Mixer"}, - - {"SEN_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEN_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEN_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SEN_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEN_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"SEN_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SEN_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX Port Mixer"}, - - {"SLIMBUS_3_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - - {"SLIMBUS_6_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"DISPLAY_PORT_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"DISPLAY_PORT_RX1 Port Mixer", "MI2S_TX", "MI2S_TX"}, - - /* Backend Enablement */ - {"BE_OUT", NULL, "PRI_I2S_RX"}, - {"BE_OUT", NULL, "SEC_I2S_RX"}, - {"BE_OUT", NULL, "MI2S_RX"}, - {"BE_OUT", NULL, "QUAT_MI2S_RX"}, - {"BE_OUT", NULL, "QUIN_MI2S_RX"}, - {"BE_OUT", NULL, "SEN_MI2S_RX"}, - {"BE_OUT", NULL, "TERT_MI2S_RX"}, - {"BE_OUT", NULL, "SEC_MI2S_RX"}, - {"BE_OUT", NULL, "SEC_MI2S_RX_SD1"}, - {"BE_OUT", NULL, "PRI_MI2S_RX"}, - {"BE_OUT", NULL, "INT0_MI2S_RX"}, - {"BE_OUT", NULL, "INT4_MI2S_RX"}, - {"BE_OUT", NULL, "INT2_MI2S_RX"}, - {"BE_OUT", NULL, "INT3_MI2S_RX"}, - {"BE_OUT", NULL, "INT5_MI2S_RX"}, - - {"PRI_I2S_TX", NULL, "BE_IN"}, - {"MI2S_TX", NULL, "BE_IN"}, - {"QUAT_MI2S_TX", NULL, "BE_IN"}, - {"QUIN_MI2S_TX", NULL, "BE_IN"}, - {"PRI_MI2S_TX", NULL, "BE_IN"}, - {"TERT_MI2S_TX", NULL, "BE_IN"}, - {"INT0_MI2S_TX", NULL, "BE_IN"}, - {"INT2_MI2S_TX", NULL, "BE_IN"}, - {"INT3_MI2S_TX", NULL, "BE_IN"}, - {"INT4_MI2S_TX", NULL, "BE_IN"}, - {"INT5_MI2S_TX", NULL, "BE_IN"}, - {"SEC_MI2S_TX", NULL, "BE_IN"}, - {"SENARY_MI2S_TX", NULL, "BE_IN"}, - {"PRI_MI2S_RX_VI_FB_MUX", "SENARY_TX", "SENARY_TX"}, - {"INT4_MI2S_RX_VI_FB_MONO_CH_MUX", "INT5_MI2S_TX", "INT5_MI2S_TX"}, - {"INT4_MI2S_RX_VI_FB_STEREO_CH_MUX", "INT5_MI2S_TX", "INT5_MI2S_TX"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_VI_FB_MUX"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_VI_FB_MONO_CH_MUX"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_VI_FB_STEREO_CH_MUX"}, -}; -#endif - -static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - unsigned int be_id = rtd->dai_link->id; - - if (be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: unexpected BE id %d\n", __func__, be_id); - return -EINVAL; - } - - mutex_lock(&routing_lock); - msm_bedais[be_id].sample_rate = params_rate(params); - msm_bedais[be_id].channel = params_channels(params); - msm_bedais[be_id].format = params_format(params); - pr_debug("%s: BE Sample Rate (%d) format (%d) BE id %d\n", - __func__, msm_bedais[be_id].sample_rate, - msm_bedais[be_id].format, be_id); - mutex_unlock(&routing_lock); - return 0; -} - -static int msm_pcm_routing_close(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - unsigned int be_id = rtd->dai_link->id; - int i, session_type, path_type, topology; - struct msm_pcm_routing_bdai_data *bedai; - struct msm_pcm_routing_fdai_data *fdai; - - pr_debug("%s: substream->pcm->id:%s\n", - __func__, substream->pcm->id); - - if (be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: unexpected BE id %d\n", __func__, be_id); - return -EINVAL; - } - - bedai = &msm_bedais[be_id]; - session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - 0 : 1); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - path_type = ADM_PATH_PLAYBACK; - else - path_type = ADM_PATH_LIVE_REC; - - mutex_lock(&routing_lock); - for_each_set_bit(i, &bedai->fe_sessions[0], MSM_FRONTEND_DAI_MAX) { - if (!is_mm_lsm_fe_id(i)) - continue; - fdai = &fe_dai_map[i][session_type]; - if (fdai->strm_id != INVALID_SESSION) { - int idx; - int port_id; - unsigned long copp = - session_copp_map[i][session_type][be_id]; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (test_bit(idx, &copp)) - break; - - if (idx >= MAX_COPPS_PER_PORT) { - pr_debug("%s: copp idx is invalid, exiting\n", - __func__); - continue; - } - fdai->be_srate = bedai->sample_rate; - port_id = get_port_id(bedai->port_id); - topology = adm_get_topology_for_port_copp_idx(port_id, - idx); - msm_routing_unload_topology(topology); - adm_close(port_id, fdai->perf_mode, idx); - pr_debug("%s: copp:%ld,idx bit fe:%d, type:%d,be:%d topology=0x%x\n", - __func__, copp, i, session_type, be_id, - topology); - clear_bit(idx, - &session_copp_map[i][session_type][be_id]); - if ((fdai->perf_mode == LEGACY_PCM_MODE) && - (fdai->passthr_mode == LEGACY_PCM)) - msm_pcm_routing_deinit_pp(port_id, - topology); - } - } - - bedai->active = 0; - bedai->sample_rate = 0; - bedai->channel = 0; - mutex_unlock(&routing_lock); - - return 0; -} - -static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - unsigned int be_id = rtd->dai_link->id; - int i, path_type, topology; - int session_type = INVALID_SESSION; - struct msm_pcm_routing_bdai_data *bedai; - u32 channels, sample_rate; - uint16_t bits_per_sample = 16, voc_path_type, be_bit_width; - struct msm_pcm_routing_fdai_data *fdai; - u32 session_id; - struct media_format_info voc_be_media_format; - bool is_lsm; - - pr_debug("%s: substream->pcm->id:%s\n", - __func__, substream->pcm->id); - - if (be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: unexpected BE id %d\n", __func__, be_id); - return -EINVAL; - } - - bedai = &msm_bedais[be_id]; - - mutex_lock(&routing_lock); - if (bedai->active == 1) - goto done; /* Ignore prepare if back-end already active */ - - /* AFE port is not active at this point. However, still - * go ahead setting active flag under the notion that - * QDSP6 is able to handle ADM starting before AFE port - * is started. - */ - bedai->active = 1; - - for_each_set_bit(i, &bedai->fe_sessions[0], MSM_FRONTEND_DAI_MAX) { - if (!(is_mm_lsm_fe_id(i) && - route_check_fe_id_adm_support(i))) - continue; - - session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - fdai = &fe_dai_map[i][session_type]; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (fdai->passthr_mode != LEGACY_PCM) - path_type = ADM_PATH_COMPRESSED_RX; - else - path_type = ADM_PATH_PLAYBACK; - } else { - if ((fdai->passthr_mode != LEGACY_PCM) && - (fdai->passthr_mode != LISTEN)) - path_type = ADM_PATH_COMPRESSED_TX; - else - path_type = ADM_PATH_LIVE_REC; - } - - is_lsm = (i >= MSM_FRONTEND_DAI_LSM1) && - (i <= MSM_FRONTEND_DAI_LSM8); - if (fdai->strm_id != INVALID_SESSION) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - int port_id = get_port_id(bedai->port_id); - - if (session_type == SESSION_TYPE_TX && - fdai->be_srate && - (fdai->be_srate != bedai->sample_rate)) { - pr_debug("%s: flush strm %d diff BE rates\n", - __func__, - fdai->strm_id); - - if (fdai->event_info.event_func) - fdai->event_info.event_func( - MSM_PCM_RT_EVT_BUF_RECFG, - fdai->event_info.priv_data); - fdai->be_srate = 0; /* might not need it */ - } - bits_per_sample = msm_routing_get_bit_width( - bedai->format); - - app_type = - fe_dai_app_type_cfg[i][session_type][be_id].app_type; - if (app_type && is_lsm) { - app_type_idx = - msm_pcm_routing_get_lsm_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[i][session_type][be_id] - .sample_rate; - bits_per_sample = - lsm_app_type_cfg[app_type_idx].bit_width; - } else if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[i][session_type] - [be_id].sample_rate; - bits_per_sample = - app_type_cfg[app_type_idx].bit_width; - } else - sample_rate = bedai->sample_rate; - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!bedai->adm_override_ch) - channels = bedai->channel; - else - channels = bedai->adm_override_ch; - acdb_dev_id = - fe_dai_app_type_cfg[i][session_type][be_id].acdb_dev_id; - topology = msm_routing_get_adm_topology(i, session_type, - be_id); - - if ((fdai->passthr_mode == COMPRESSED_PASSTHROUGH_DSD) - || (fdai->passthr_mode == COMPRESSED_PASSTHROUGH_GEN) - || (fdai->passthr_mode == COMPRESSED_PASSTHROUGH_IEC61937)) - topology = COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY; - - be_bit_width = msm_routing_get_bit_width( - bedai->format); - - if (hifi_filter_enabled && (bedai->sample_rate == 384000 - || bedai->sample_rate == 352800) && - be_bit_width == 32) - bits_per_sample = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - copp_idx = adm_open(port_id, path_type, - sample_rate, channels, topology, - fdai->perf_mode, bits_per_sample, - app_type, acdb_dev_id, - session_type); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: adm open failed\n", __func__); - mutex_unlock(&routing_lock); - return -EINVAL; - } - pr_debug("%s: setting idx bit of fe:%d, type: %d, be:%d\n", - __func__, i, session_type, be_id); - set_bit(copp_idx, - &session_copp_map[i][session_type][be_id]); - - if (msm_is_resample_needed( - sample_rate, - bedai->sample_rate)) - adm_copp_mfc_cfg(port_id, copp_idx, - bedai->sample_rate); - - msm_pcm_routing_build_matrix(i, session_type, path_type, - fdai->perf_mode, fdai->passthr_mode); - if ((fdai->perf_mode == LEGACY_PCM_MODE) && - (fdai->passthr_mode == LEGACY_PCM)) - msm_pcm_routing_cfg_pp(port_id, copp_idx, - topology, channels); - } - } - - for_each_set_bit(i, &bedai->fe_sessions[0], MSM_FRONTEND_DAI_MAX) { - session_id = msm_pcm_routing_get_voc_sessionid(i); - if (session_id) { - pr_debug("%s voice session_id: 0x%x\n", __func__, - session_id); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - voc_path_type = RX_PATH; - else - voc_path_type = TX_PATH; - - voc_set_route_flag(session_id, voc_path_type, 1); - - memset(&voc_be_media_format, 0, - sizeof(struct media_format_info)); - - voc_be_media_format.port_id = bedai->port_id; - voc_be_media_format.num_channels = bedai->channel; - voc_be_media_format.sample_rate = bedai->sample_rate; - voc_be_media_format.bits_per_sample = bedai->format; - /* Defaulting this to 1 for voice call usecases */ - voc_be_media_format.channel_mapping[0] = 1; - - voc_set_device_config(session_id, voc_path_type, - &voc_be_media_format); - - if (voc_get_route_flag(session_id, RX_PATH) && - voc_get_route_flag(session_id, TX_PATH)) - voc_enable_device(session_id); - } - } - - /* Check if backend is an external ec ref port and set as needed */ - if (unlikely(bedai->port_id == voc_get_ext_ec_ref_port_id())) { - - memset(&voc_be_media_format, 0, - sizeof(struct media_format_info)); - - /* Get format info for ec ref port from msm_bedais[] */ - voc_be_media_format.port_id = bedai->port_id; - voc_be_media_format.num_channels = bedai->channel; - voc_be_media_format.bits_per_sample = bedai->format; - voc_be_media_format.sample_rate = bedai->sample_rate; - /* Defaulting this to 1 for voice call usecases */ - voc_be_media_format.channel_mapping[0] = 1; - voc_set_ext_ec_ref_media_fmt_info(&voc_be_media_format); - pr_debug("%s: EC Ref media format info set to port_id=%d, num_channels=%d, bits_per_sample=%d, sample_rate=%d\n", - __func__, voc_be_media_format.port_id, - voc_be_media_format.num_channels, - voc_be_media_format.bits_per_sample, - voc_be_media_format.sample_rate); - } - -done: - mutex_unlock(&routing_lock); - - return 0; -} - -static int msm_routing_send_device_pp_params(int port_id, int copp_idx, - int fe_id) -{ - int index, topo_id, be_idx; - unsigned long pp_config = 0; - bool mute_on; - int latency, session_type; - bool compr_passthr_mode = true; - - pr_debug("%s: port_id %d, copp_idx %d\n", __func__, port_id, copp_idx); - - if (port_id != HDMI_RX && port_id != DISPLAY_PORT_RX) { - pr_err("%s: Device pp params on invalid port %d\n", - __func__, port_id); - return -EINVAL; - } - - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - if (port_id == msm_bedais[be_idx].port_id) - break; - } - - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_debug("%s: Invalid be id %d\n", __func__, be_idx); - return -EINVAL; - } - - for (index = 0; index < MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX; index++) { - if (msm_bedais_pp_params[index].port_id == port_id) - break; - } - if (index >= MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX) { - pr_err("%s: Invalid backend pp params index %d\n", - __func__, index); - return -EINVAL; - } - - topo_id = adm_get_topology_for_port_copp_idx(port_id, copp_idx); - if (topo_id != COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY) { - pr_err("%s: Invalid passthrough topology 0x%x\n", - __func__, topo_id); - return -EINVAL; - } - - session_type = - (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - - if ((fe_dai_map[fe_id][session_type].passthr_mode == LEGACY_PCM) || - (fe_dai_map[fe_id][session_type].passthr_mode == LISTEN)) - compr_passthr_mode = false; - - pp_config = msm_bedais_pp_params[index].pp_params_config; - if (test_bit(ADM_PP_PARAM_MUTE_BIT, &pp_config)) { - pr_debug("%s: ADM_PP_PARAM_MUTE\n", __func__); - clear_bit(ADM_PP_PARAM_MUTE_BIT, &pp_config); - mute_on = msm_bedais_pp_params[index].mute_on; - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_mute(port_id, - copp_idx, - mute_on); - } - if (test_bit(ADM_PP_PARAM_LATENCY_BIT, &pp_config)) { - pr_debug("%s: ADM_PP_PARAM_LATENCY\n", __func__); - clear_bit(ADM_PP_PARAM_LATENCY_BIT, - &pp_config); - latency = msm_bedais_pp_params[index].latency; - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_latency(port_id, - copp_idx, - latency); - } - return 0; -} - -static uint32_t msm_routing_get_topology(size_t data_size, void *data) -{ - uint32_t topology = NULL_COPP_TOPOLOGY; - void *cal_info = NULL; - uint32_t size = 0; - - /* Retrieve cal_info size from cal data*/ - if (data_size < sizeof(struct audio_cal_type_basic) + - sizeof(struct audio_cal_info_adm_top)) { - pr_err("%s: Invalid data size: %zd\n", __func__, data_size); - goto done; - } - size = data_size - sizeof(struct audio_cal_type_basic); - cal_info = kzalloc(size, GFP_KERNEL); - - if (!cal_info) - goto done; - - memcpy(cal_info, - ((uint8_t *)data + sizeof(struct audio_cal_type_basic)), size); - - topology = ((struct audio_cal_info_adm_top *)cal_info)->topology; - kfree(cal_info); - cal_info = NULL; - -done: - pr_debug("%s: Using topology %d\n", __func__, topology); - - return topology; -} - -static void msm_routing_load_topology(size_t data_size, void *data) -{ - uint32_t topology_id; - int ret = -EINVAL; - - topology_id = msm_routing_get_topology(data_size, data); - if (topology_id != NULL_COPP_TOPOLOGY) - ret = q6core_load_unload_topo_modules(topology_id, - CORE_LOAD_TOPOLOGY); - if (ret < 0) - pr_debug("%s %d load topology failed\n", - __func__, topology_id); - -} - -static void msm_routing_unload_topology(uint32_t topology_id) -{ - int ret = -EINVAL; - - if (topology_id != NULL_COPP_TOPOLOGY) - ret = q6core_load_unload_topo_modules(topology_id, - CORE_UNLOAD_TOPOLOGY); - if (ret < 0) - pr_debug("%s %d unload topology failed\n", - __func__, topology_id); - -} - -static int msm_routing_put_device_pp_params_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int pp_id = ucontrol->value.integer.value[0]; - int port_id = 0; - int index, be_idx, i, topo_id, idx; - bool mute; - int latency, session_type; - bool compr_passthr_mode = true; - - pr_debug("%s: pp_id: 0x%x\n", __func__, pp_id); - - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - port_id = msm_bedais[be_idx].port_id; - if (port_id == HDMI_RX || port_id == DISPLAY_PORT_RX) - break; - } - - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_debug("%s: Invalid be id %d\n", __func__, be_idx); - return -EINVAL; - } - - for (index = 0; index < MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX; index++) { - if (msm_bedais_pp_params[index].port_id == port_id) - break; - } - if (index >= MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX) { - pr_err("%s: Invalid pp params backend index %d\n", - __func__, index); - return -EINVAL; - } - - session_type = - (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - - for_each_set_bit(i, &msm_bedais[be_idx].fe_sessions[0], - MSM_FRONTEND_DAI_MM_SIZE) { - if ((fe_dai_map[i][session_type].passthr_mode == LEGACY_PCM) || - (fe_dai_map[i][session_type].passthr_mode == LISTEN)) - compr_passthr_mode = false; - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - unsigned long copp = - session_copp_map[i] - [SESSION_TYPE_RX][be_idx]; - if (!test_bit(idx, &copp)) - continue; - topo_id = adm_get_topology_for_port_copp_idx(port_id, - idx); - if (topo_id != COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY) - continue; - pr_debug("%s: port: 0x%x, copp %ld, be active: %d, passt: %d\n", - __func__, port_id, copp, msm_bedais[be_idx].active, - fe_dai_map[i][session_type].passthr_mode); - switch (pp_id) { - case ADM_PP_PARAM_MUTE_ID: - pr_debug("%s: ADM_PP_PARAM_MUTE\n", __func__); - mute = ucontrol->value.integer.value[1] ? true : false; - msm_bedais_pp_params[index].mute_on = mute; - set_bit(ADM_PP_PARAM_MUTE_BIT, - &msm_bedais_pp_params[index].pp_params_config); - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_mute(port_id, - idx, mute); - break; - case ADM_PP_PARAM_LATENCY_ID: - pr_debug("%s: ADM_PP_PARAM_LATENCY\n", __func__); - msm_bedais_pp_params[index].latency = - ucontrol->value.integer.value[1]; - set_bit(ADM_PP_PARAM_LATENCY_BIT, - &msm_bedais_pp_params[index].pp_params_config); - latency = msm_bedais_pp_params[index].latency = - ucontrol->value.integer.value[1]; - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_latency(port_id, - idx, latency); - break; - default: - pr_info("%s, device pp param %d not supported\n", - __func__, pp_id); - break; - } - } - } - return 0; -} - -static int msm_routing_get_device_pp_params_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s:msm_routing_get_device_pp_params_mixer", __func__); - return 0; -} - -static const struct snd_kcontrol_new device_pp_params_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("Device PP Params", SND_SOC_NOPM, 0, 0xFFFFFFFF, - 0, 3, msm_routing_get_device_pp_params_mixer, - msm_routing_put_device_pp_params_mixer), -}; - -static int msm_aptx_dec_license_control_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = - core_get_license_status(ASM_MEDIA_FMT_APTX); - pr_debug("%s: status %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_aptx_dec_license_control_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t status = 0; - - status = core_set_license(ucontrol->value.integer.value[0], - APTX_CLASSIC_DEC_LICENSE_ID); - pr_debug("%s: status %d\n", __func__, status); - return status; -} - -static const struct snd_kcontrol_new aptx_dec_license_controls[] = { - SOC_SINGLE_EXT("APTX Dec License", SND_SOC_NOPM, 0, - 0xFFFF, 0, msm_aptx_dec_license_control_get, - msm_aptx_dec_license_control_put), -}; - -static int msm_routing_put_port_chmap_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint8_t channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - uint32_t be_idx = ucontrol->value.integer.value[0]; - int i; - - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Invalid Backend index %d\n", __func__, be_idx); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) { - channel_map[i] = (char)(ucontrol->value.integer.value[i + 1]); - if (channel_map[i] > PCM_MAX_CHMAP_ID) { - pr_err("%s: Invalid channel map %d\n", - __func__, channel_map[i]); - return -EINVAL; - } - } - adm_set_port_multi_ch_map(channel_map, msm_bedais[be_idx].port_id); - - return 0; -} - -static const struct snd_kcontrol_new port_multi_channel_map_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("Backend Device Channel Map", SND_SOC_NOPM, 0, - MSM_BACKEND_DAI_MAX, 0, - PCM_FORMAT_MAX_NUM_CHANNEL_V8 + 1, NULL, - msm_routing_put_port_chmap_mixer), -}; - -static int msm_routing_be_dai_name_table_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(be_dai_name_table); - return 0; -} - -static int msm_routing_be_dai_name_table_tlv_get(struct snd_kcontrol *kcontrol, - unsigned int __user *bytes, - unsigned int size) -{ - int i; - int ret = 0; - - if (size < sizeof(be_dai_name_table)) { - pr_err("%s: invalid size %d requested, returning\n", - __func__, size); - ret = -EINVAL; - goto done; - } - - /* - * Fill be_dai_name_table from msm_bedais table to reduce code changes - * needed when adding new backends - */ - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - be_dai_name_table[i].be_id = i; - strlcpy(be_dai_name_table[i].be_name, - msm_bedais[i].name, - LPASS_BE_NAME_MAX_LENGTH); - } - - ret = copy_to_user(bytes, &be_dai_name_table, - sizeof(be_dai_name_table)); - if (ret) { - pr_err("%s: failed to copy be_dai_name_table\n", __func__); - ret = -EFAULT; - } - -done: - return ret; -} - -static const struct snd_kcontrol_new - msm_routing_be_dai_name_table_mixer_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, - .info = msm_routing_be_dai_name_table_info, - .name = "Backend DAI Name Table", - .tlv.c = snd_soc_bytes_tlv_callback, - .private_value = (unsigned long) &(struct soc_bytes_ext) { - .max = sizeof(be_dai_name_table), - .get = msm_routing_be_dai_name_table_tlv_get, - } - }, -}; - -static int msm_routing_stereo_channel_reverse_control_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = swap_ch; - pr_debug("%s: Swap channel value: %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_stereo_channel_reverse_control_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i, idx, be_index, port_id; - int ret = 0; - unsigned long copp; - - pr_debug("%s Swap channel value:%ld\n", __func__, - ucontrol->value.integer.value[0]); - - swap_ch = ucontrol->value.integer.value[0]; - - mutex_lock(&routing_lock); - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - port_id = msm_bedais[be_index].port_id; - if (!msm_bedais[be_index].active) - continue; - - for_each_set_bit(i, &msm_bedais[be_index].fe_sessions[0], - MSM_FRONTEND_DAI_MM_SIZE) { - copp = session_copp_map[i][SESSION_TYPE_RX][be_index]; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - if (!test_bit(idx, &copp)) - continue; - - pr_debug("%s: swap channel control of portid:%d, coppid:%d\n", - __func__, port_id, idx); - ret = adm_swap_speaker_channels( - port_id, idx, - msm_bedais[be_index].sample_rate, - swap_ch); - if (ret) { - pr_err("%s:Swap_channel failed, err=%d\n", - __func__, ret); - goto done; - } - } - } - } -done: - mutex_unlock(&routing_lock); - return ret; -} - -static const struct snd_kcontrol_new stereo_channel_reverse_control[] = { - SOC_SINGLE_EXT("Swap channel", SND_SOC_NOPM, 0, - 1, 0, msm_routing_stereo_channel_reverse_control_get, - msm_routing_stereo_channel_reverse_control_put), -}; - -static int msm_routing_instance_id_support_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - uinfo->count = 1; - return 0; -} - -static int msm_routing_instance_id_support_put( - struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - bool supported = ucontrol->value.integer.value[0] ? true : false; - - q6common_update_instance_id_support(supported); - return 0; -} - -static int msm_routing_instance_id_support_get( - struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - bool supported = false; - - supported = q6common_is_instance_id_supported(); - ucontrol->value.integer.value[0] = supported ? 1 : 0; - - return 0; -} - -static const struct snd_kcontrol_new - msm_routing_feature_support_mixer_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_WRITE, - .info = msm_routing_instance_id_support_info, - .name = "Instance ID Support", - .put = msm_routing_instance_id_support_put, - .get = msm_routing_instance_id_support_get, - }, -}; - -static const struct snd_pcm_ops msm_routing_pcm_ops = { - .hw_params = msm_pcm_routing_hw_params, - .close = msm_pcm_routing_close, - .prepare = msm_pcm_routing_prepare, -}; - -#ifndef CONFIG_TDM_DISABLE -static void snd_soc_dapm_new_controls_tdm(struct snd_soc_platform *platform) -{ - snd_soc_dapm_new_controls(&platform->component.dapm, - msm_qdsp6_widgets_tdm, - ARRAY_SIZE(msm_qdsp6_widgets_tdm)); -} -static void snd_soc_dapm_add_routes_tdm(struct snd_soc_platform *platform) -{ - snd_soc_dapm_add_routes(&platform->component.dapm, intercon_tdm, - ARRAY_SIZE(intercon_tdm)); -} -#else -static void snd_soc_dapm_new_controls_tdm(struct snd_soc_platform *platform) -{ - return; -} -static void snd_soc_dapm_add_routes_tdm(struct snd_soc_platform *platform) -{ - return; -} -#endif - -#ifndef CONFIG_MI2S_DISABLE -static void snd_soc_dapm_new_controls_mi2s(struct snd_soc_platform *platform) -{ - snd_soc_dapm_new_controls(&platform->component.dapm, - msm_qdsp6_widgets_mi2s, - ARRAY_SIZE(msm_qdsp6_widgets_mi2s)); -} -static void snd_soc_dapm_add_routes_mi2s(struct snd_soc_platform *platform) -{ - snd_soc_dapm_add_routes(&platform->component.dapm, intercon_mi2s, - ARRAY_SIZE(intercon_mi2s)); -} -#else -static void snd_soc_dapm_new_controls_mi2s(struct snd_soc_platform *platform) -{ - return; -} -static void snd_soc_dapm_add_routes_mi2s(struct snd_soc_platform *platform) -{ - return; -} -#endif - -#ifndef CONFIG_AUXPCM_DISABLE -static void snd_soc_dapm_new_controls_aux_pcm(struct snd_soc_platform *platform) -{ - snd_soc_dapm_new_controls(&platform->component.dapm, - msm_qdsp6_widgets_aux_pcm, - ARRAY_SIZE(msm_qdsp6_widgets_aux_pcm)); -} -static void snd_soc_dapm_add_routes_aux_pcm(struct snd_soc_platform *platform) -{ - snd_soc_dapm_add_routes(&platform->component.dapm, intercon_aux_pcm, - ARRAY_SIZE(intercon_aux_pcm)); -} -#else -static void snd_soc_dapm_new_controls_aux_pcm(struct snd_soc_platform *platform) -{ - return; -} -static void snd_soc_dapm_add_routes_aux_pcm(struct snd_soc_platform *platform) -{ - return; -} -#endif - -/* Not used but frame seems to require it */ -static int msm_routing_probe(struct snd_soc_platform *platform) -{ - snd_soc_dapm_new_controls(&platform->component.dapm, msm_qdsp6_widgets, - ARRAY_SIZE(msm_qdsp6_widgets)); - snd_soc_dapm_new_controls_tdm(platform); - snd_soc_dapm_new_controls_mi2s(platform); - snd_soc_dapm_new_controls_aux_pcm(platform); - - snd_soc_dapm_ignore_suspend(&platform->component.dapm, "BE_OUT"); - snd_soc_dapm_ignore_suspend(&platform->component.dapm, "BE_IN"); - snd_soc_dapm_add_routes(&platform->component.dapm, intercon, - ARRAY_SIZE(intercon)); - snd_soc_dapm_add_routes_tdm(platform); - snd_soc_dapm_add_routes_mi2s(platform); - snd_soc_dapm_add_routes_aux_pcm(platform); - snd_soc_dapm_new_widgets(platform->component.dapm.card); - - snd_soc_add_platform_controls(platform, lsm_controls, - ARRAY_SIZE(lsm_controls)); - - snd_soc_add_platform_controls(platform, aanc_slim_0_rx_mux, - ARRAY_SIZE(aanc_slim_0_rx_mux)); - - snd_soc_add_platform_controls(platform, aanc_noise_level, - ARRAY_SIZE(aanc_noise_level)); - - snd_soc_add_platform_controls(platform, msm_voc_session_controls, - ARRAY_SIZE(msm_voc_session_controls)); - - snd_soc_add_platform_controls(platform, app_type_cfg_controls, - ARRAY_SIZE(app_type_cfg_controls)); - - snd_soc_add_platform_controls(platform, lsm_app_type_cfg_controls, - ARRAY_SIZE(lsm_app_type_cfg_controls)); - - snd_soc_add_platform_controls(platform, module_cfg_controls, - ARRAY_SIZE(module_cfg_controls)); - - snd_soc_add_platform_controls(platform, - stereo_to_custom_stereo_controls, - ARRAY_SIZE(stereo_to_custom_stereo_controls)); - - snd_soc_add_platform_controls(platform, ec_ref_param_controls, - ARRAY_SIZE(ec_ref_param_controls)); - - snd_soc_add_platform_controls(platform, channel_mixer_controls, - ARRAY_SIZE(channel_mixer_controls)); - - msm_qti_pp_add_controls(platform); - - msm_dts_srs_tm_add_controls(platform); - - msm_dolby_dap_add_controls(platform); - - snd_soc_add_platform_controls(platform, - use_ds1_or_ds2_controls, - ARRAY_SIZE(use_ds1_or_ds2_controls)); - - snd_soc_add_platform_controls(platform, - hifi_filter_controls, - ARRAY_SIZE(hifi_filter_controls)); - - snd_soc_add_platform_controls(platform, - use_ffecns_freeze_event_controls, - ARRAY_SIZE(use_ffecns_freeze_event_controls)); - - snd_soc_add_platform_controls(platform, - device_pp_params_mixer_controls, - ARRAY_SIZE(device_pp_params_mixer_controls)); - - snd_soc_add_platform_controls(platform, - msm_routing_be_dai_name_table_mixer_controls, - ARRAY_SIZE(msm_routing_be_dai_name_table_mixer_controls)); - - snd_soc_add_platform_controls(platform, msm_source_tracking_controls, - ARRAY_SIZE(msm_source_tracking_controls)); - snd_soc_add_platform_controls(platform, adm_channel_config_controls, - ARRAY_SIZE(adm_channel_config_controls)); - - snd_soc_add_platform_controls(platform, aptx_dec_license_controls, - ARRAY_SIZE(aptx_dec_license_controls)); - snd_soc_add_platform_controls(platform, stereo_channel_reverse_control, - ARRAY_SIZE(stereo_channel_reverse_control)); - snd_soc_add_platform_controls( - platform, msm_routing_feature_support_mixer_controls, - ARRAY_SIZE(msm_routing_feature_support_mixer_controls)); - snd_soc_add_platform_controls(platform, - port_multi_channel_map_mixer_controls, - ARRAY_SIZE(port_multi_channel_map_mixer_controls)); - - return 0; -} - -int msm_routing_pcm_new(struct snd_soc_pcm_runtime *runtime) -{ - return msm_pcm_routing_hwdep_new(runtime, msm_bedais); -} - -void msm_routing_pcm_free(struct snd_pcm *pcm) -{ - msm_pcm_routing_hwdep_free(pcm); -} - -static struct snd_soc_platform_driver msm_soc_routing_platform = { - .ops = &msm_routing_pcm_ops, - .probe = msm_routing_probe, - .pcm_new = msm_routing_pcm_new, - .pcm_free = msm_routing_pcm_free, -}; - -static int msm_routing_pcm_probe(struct platform_device *pdev) -{ - - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_routing_platform); -} - -static int msm_routing_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - - -static const struct of_device_id msm_pcm_routing_dt_match[] = { - {.compatible = "qcom,msm-pcm-routing"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_routing_dt_match); - -static struct platform_driver msm_routing_pcm_driver = { - .driver = { - .name = "msm-pcm-routing", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_routing_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_routing_pcm_probe, - .remove = msm_routing_pcm_remove, -}; - -int msm_routing_check_backend_enabled(int fedai_id) -{ - int i; - - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID\n", __func__); - return 0; - } - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0])) - return msm_bedais[i].active; - } - return 0; -} - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case ADM_TOPOLOGY_CAL_TYPE: - ret = ADM_TOPOLOGY_CAL_TYPE_IDX; - break; - case ADM_LSM_TOPOLOGY_CAL_TYPE: - ret = ADM_LSM_TOPOLOGY_CAL_TYPE_IDX; - break; - default: - pr_err("%s: Invalid cal type %d\n", __func__, cal_type); - } - return ret; -} - -static int msm_routing_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - pr_debug("%s\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - /* Pre-load if it is ADM topology */ - if ((cal_index == ADM_TOPOLOGY_CAL_TYPE_IDX) || - (cal_index == ADM_LSM_TOPOLOGY_CAL_TYPE_IDX)) { - msm_routing_load_topology(data_size, data); - } -done: - return ret; -} - -static void msm_routing_delete_cal_data(void) -{ - pr_debug("%s\n", __func__); - - cal_utils_destroy_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0]); -} - -static int msm_routing_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{ADM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - msm_routing_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ADM_LSM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - msm_routing_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - pr_debug("%s\n", __func__); - - ret = cal_utils_create_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0], - &cal_type_info[0]); - if (ret < 0) { - pr_err("%s: could not create cal type!\n", - __func__); - ret = -EINVAL; - goto err; - } - - return ret; -err: - msm_routing_delete_cal_data(); - return ret; -} - -int __init msm_soc_routing_platform_init(void) -{ - mutex_init(&routing_lock); - if (msm_routing_init_cal_data()) - pr_err("%s: could not init cal data!\n", __func__); - - afe_set_routing_callback( - (routing_cb)msm_pcm_get_dev_acdb_id_by_port_id); - - memset(&be_dai_name_table, 0, sizeof(be_dai_name_table)); - memset(&last_be_id_configured, 0, sizeof(last_be_id_configured)); - - return platform_driver_register(&msm_routing_pcm_driver); -} - -void msm_soc_routing_platform_exit(void) -{ - msm_routing_delete_cal_data(); - memset(&be_dai_name_table, 0, sizeof(be_dai_name_table)); - mutex_destroy(&routing_lock); - platform_driver_unregister(&msm_routing_pcm_driver); -} - -MODULE_DESCRIPTION("MSM routing platform driver"); -MODULE_LICENSE("GPL v2"); - diff --git a/techpack/audio/4.0/asoc/msm-pcm-routing-v2.h b/techpack/audio/4.0/asoc/msm-pcm-routing-v2.h deleted file mode 100644 index ee9c63ad89c8..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-routing-v2.h +++ /dev/null @@ -1,652 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ -#ifndef _MSM_PCM_ROUTING_H -#define _MSM_PCM_ROUTING_H -#include -#include - -/* - * These names are used by HAL to specify the BE. If any changes are - * made to the string names or the max name length corresponding - * changes need to be made in the HAL to ensure they still match. - */ -#define LPASS_BE_NAME_MAX_LENGTH 24 -#define LPASS_BE_PRI_I2S_RX "PRIMARY_I2S_RX" -#define LPASS_BE_PRI_I2S_TX "PRIMARY_I2S_TX" -#define LPASS_BE_SLIMBUS_0_RX "SLIMBUS_0_RX" -#define LPASS_BE_SLIMBUS_0_TX "SLIMBUS_0_TX" -#define LPASS_BE_HDMI "HDMI" -#define LPASS_BE_DISPLAY_PORT "DISPLAY_PORT" -#define LPASS_BE_DISPLAY_PORT1 "DISPLAY_PORT1" -#define LPASS_BE_INT_BT_SCO_RX "INT_BT_SCO_RX" -#define LPASS_BE_INT_BT_SCO_TX "INT_BT_SCO_TX" -#define LPASS_BE_INT_BT_A2DP_RX "INT_BT_A2DP_RX" -#define LPASS_BE_INT_FM_RX "INT_FM_RX" -#define LPASS_BE_INT_FM_TX "INT_FM_TX" -#define LPASS_BE_AFE_PCM_RX "RT_PROXY_DAI_001_RX" -#define LPASS_BE_AFE_PCM_TX "RT_PROXY_DAI_002_TX" -#define LPASS_BE_AUXPCM_RX "AUX_PCM_RX" -#define LPASS_BE_AUXPCM_TX "AUX_PCM_TX" -#define LPASS_BE_SEC_AUXPCM_RX "SEC_AUX_PCM_RX" -#define LPASS_BE_SEC_AUXPCM_TX "SEC_AUX_PCM_TX" -#define LPASS_BE_TERT_AUXPCM_RX "TERT_AUX_PCM_RX" -#define LPASS_BE_TERT_AUXPCM_TX "TERT_AUX_PCM_TX" -#define LPASS_BE_QUAT_AUXPCM_RX "QUAT_AUX_PCM_RX" -#define LPASS_BE_QUAT_AUXPCM_TX "QUAT_AUX_PCM_TX" -#define LPASS_BE_QUIN_AUXPCM_RX "QUIN_AUX_PCM_RX" -#define LPASS_BE_QUIN_AUXPCM_TX "QUIN_AUX_PCM_TX" -#define LPASS_BE_SEN_AUXPCM_RX "SEN_AUX_PCM_RX" -#define LPASS_BE_SEN_AUXPCM_TX "SEN_AUX_PCM_TX" -#define LPASS_BE_VOICE_PLAYBACK_TX "VOICE_PLAYBACK_TX" -#define LPASS_BE_VOICE2_PLAYBACK_TX "VOICE2_PLAYBACK_TX" -#define LPASS_BE_INCALL_RECORD_RX "INCALL_RECORD_RX" -#define LPASS_BE_INCALL_RECORD_TX "INCALL_RECORD_TX" -#define LPASS_BE_PROXY_RX "PROXY_RX" -#define LPASS_BE_PROXY_TX "PROXY_TX" -#define LPASS_BE_SEC_I2S_RX "SECONDARY_I2S_RX" -#define LPASS_BE_PRI_SPDIF_RX "PRI_SPDIF_RX" -#define LPASS_BE_PRI_SPDIF_TX "PRI_SPDIF_TX" -#define LPASS_BE_SEC_SPDIF_RX "SEC_SPDIF_RX" -#define LPASS_BE_SEC_SPDIF_TX "SEC_SPDIF_TX" - -#define LPASS_BE_MI2S_RX "MI2S_RX" -#define LPASS_BE_MI2S_TX "MI2S_TX" -#define LPASS_BE_QUAT_MI2S_RX "QUAT_MI2S_RX" -#define LPASS_BE_QUAT_MI2S_TX "QUAT_MI2S_TX" -#define LPASS_BE_SEC_MI2S_RX "SEC_MI2S_RX" -#define LPASS_BE_SEC_MI2S_RX_SD1 "SEC_MI2S_RX_SD1" -#define LPASS_BE_SEC_MI2S_TX "SEC_MI2S_TX" -#define LPASS_BE_PRI_MI2S_RX "PRI_MI2S_RX" -#define LPASS_BE_PRI_MI2S_TX "PRI_MI2S_TX" -#define LPASS_BE_TERT_MI2S_RX "TERT_MI2S_RX" -#define LPASS_BE_TERT_MI2S_TX "TERT_MI2S_TX" -#define LPASS_BE_AUDIO_I2S_RX "AUDIO_I2S_RX" -#define LPASS_BE_STUB_RX "STUB_RX" -#define LPASS_BE_STUB_TX "STUB_TX" -#define LPASS_BE_SLIMBUS_1_RX "SLIMBUS_1_RX" -#define LPASS_BE_SLIMBUS_1_TX "SLIMBUS_1_TX" -#define LPASS_BE_STUB_1_TX "STUB_1_TX" -#define LPASS_BE_SLIMBUS_2_RX "SLIMBUS_2_RX" -#define LPASS_BE_SLIMBUS_2_TX "SLIMBUS_2_TX" -#define LPASS_BE_SLIMBUS_3_RX "SLIMBUS_3_RX" -#define LPASS_BE_SLIMBUS_3_TX "SLIMBUS_3_TX" -#define LPASS_BE_SLIMBUS_4_RX "SLIMBUS_4_RX" -#define LPASS_BE_SLIMBUS_4_TX "SLIMBUS_4_TX" -#define LPASS_BE_SLIMBUS_TX_VI "SLIMBUS_TX_VI" -#define LPASS_BE_SLIMBUS_5_RX "SLIMBUS_5_RX" -#define LPASS_BE_SLIMBUS_5_TX "SLIMBUS_5_TX" -#define LPASS_BE_SLIMBUS_6_RX "SLIMBUS_6_RX" -#define LPASS_BE_SLIMBUS_6_TX "SLIMBUS_6_TX" -#define LPASS_BE_QUIN_MI2S_RX "QUIN_MI2S_RX" -#define LPASS_BE_QUIN_MI2S_TX "QUIN_MI2S_TX" -#define LPASS_BE_SENARY_MI2S_TX "SENARY_MI2S_TX" -#define LPASS_BE_SENARY_MI2S_RX "SENARY_MI2S_RX" - -#define LPASS_BE_PRI_META_MI2S_RX "PRI_META_MI2S_RX" -#define LPASS_BE_SEC_META_MI2S_RX "SEC_META_MI2S_RX" - -#define LPASS_BE_PRI_TDM_RX_0 "PRI_TDM_RX_0" -#define LPASS_BE_PRI_TDM_TX_0 "PRI_TDM_TX_0" -#define LPASS_BE_PRI_TDM_RX_1 "PRI_TDM_RX_1" -#define LPASS_BE_PRI_TDM_TX_1 "PRI_TDM_TX_1" -#define LPASS_BE_PRI_TDM_RX_2 "PRI_TDM_RX_2" -#define LPASS_BE_PRI_TDM_TX_2 "PRI_TDM_TX_2" -#define LPASS_BE_PRI_TDM_RX_3 "PRI_TDM_RX_3" -#define LPASS_BE_PRI_TDM_TX_3 "PRI_TDM_TX_3" -#define LPASS_BE_PRI_TDM_RX_4 "PRI_TDM_RX_4" -#define LPASS_BE_PRI_TDM_TX_4 "PRI_TDM_TX_4" -#define LPASS_BE_PRI_TDM_RX_5 "PRI_TDM_RX_5" -#define LPASS_BE_PRI_TDM_TX_5 "PRI_TDM_TX_5" -#define LPASS_BE_PRI_TDM_RX_6 "PRI_TDM_RX_6" -#define LPASS_BE_PRI_TDM_TX_6 "PRI_TDM_TX_6" -#define LPASS_BE_PRI_TDM_RX_7 "PRI_TDM_RX_7" -#define LPASS_BE_PRI_TDM_TX_7 "PRI_TDM_TX_7" -#define LPASS_BE_SEC_TDM_RX_0 "SEC_TDM_RX_0" -#define LPASS_BE_SEC_TDM_TX_0 "SEC_TDM_TX_0" -#define LPASS_BE_SEC_TDM_RX_1 "SEC_TDM_RX_1" -#define LPASS_BE_SEC_TDM_TX_1 "SEC_TDM_TX_1" -#define LPASS_BE_SEC_TDM_RX_2 "SEC_TDM_RX_2" -#define LPASS_BE_SEC_TDM_TX_2 "SEC_TDM_TX_2" -#define LPASS_BE_SEC_TDM_RX_3 "SEC_TDM_RX_3" -#define LPASS_BE_SEC_TDM_TX_3 "SEC_TDM_TX_3" -#define LPASS_BE_SEC_TDM_RX_4 "SEC_TDM_RX_4" -#define LPASS_BE_SEC_TDM_TX_4 "SEC_TDM_TX_4" -#define LPASS_BE_SEC_TDM_RX_5 "SEC_TDM_RX_5" -#define LPASS_BE_SEC_TDM_TX_5 "SEC_TDM_TX_5" -#define LPASS_BE_SEC_TDM_RX_6 "SEC_TDM_RX_6" -#define LPASS_BE_SEC_TDM_TX_6 "SEC_TDM_TX_6" -#define LPASS_BE_SEC_TDM_RX_7 "SEC_TDM_RX_7" -#define LPASS_BE_SEC_TDM_TX_7 "SEC_TDM_TX_7" -#define LPASS_BE_TERT_TDM_RX_0 "TERT_TDM_RX_0" -#define LPASS_BE_TERT_TDM_TX_0 "TERT_TDM_TX_0" -#define LPASS_BE_TERT_TDM_RX_1 "TERT_TDM_RX_1" -#define LPASS_BE_TERT_TDM_TX_1 "TERT_TDM_TX_1" -#define LPASS_BE_TERT_TDM_RX_2 "TERT_TDM_RX_2" -#define LPASS_BE_TERT_TDM_TX_2 "TERT_TDM_TX_2" -#define LPASS_BE_TERT_TDM_RX_3 "TERT_TDM_RX_3" -#define LPASS_BE_TERT_TDM_TX_3 "TERT_TDM_TX_3" -#define LPASS_BE_TERT_TDM_RX_4 "TERT_TDM_RX_4" -#define LPASS_BE_TERT_TDM_TX_4 "TERT_TDM_TX_4" -#define LPASS_BE_TERT_TDM_RX_5 "TERT_TDM_RX_5" -#define LPASS_BE_TERT_TDM_TX_5 "TERT_TDM_TX_5" -#define LPASS_BE_TERT_TDM_RX_6 "TERT_TDM_RX_6" -#define LPASS_BE_TERT_TDM_TX_6 "TERT_TDM_TX_6" -#define LPASS_BE_TERT_TDM_RX_7 "TERT_TDM_RX_7" -#define LPASS_BE_TERT_TDM_TX_7 "TERT_TDM_TX_7" -#define LPASS_BE_QUAT_TDM_RX_0 "QUAT_TDM_RX_0" -#define LPASS_BE_QUAT_TDM_TX_0 "QUAT_TDM_TX_0" -#define LPASS_BE_QUAT_TDM_RX_1 "QUAT_TDM_RX_1" -#define LPASS_BE_QUAT_TDM_TX_1 "QUAT_TDM_TX_1" -#define LPASS_BE_QUAT_TDM_RX_2 "QUAT_TDM_RX_2" -#define LPASS_BE_QUAT_TDM_TX_2 "QUAT_TDM_TX_2" -#define LPASS_BE_QUAT_TDM_RX_3 "QUAT_TDM_RX_3" -#define LPASS_BE_QUAT_TDM_TX_3 "QUAT_TDM_TX_3" -#define LPASS_BE_QUAT_TDM_RX_4 "QUAT_TDM_RX_4" -#define LPASS_BE_QUAT_TDM_TX_4 "QUAT_TDM_TX_4" -#define LPASS_BE_QUAT_TDM_RX_5 "QUAT_TDM_RX_5" -#define LPASS_BE_QUAT_TDM_TX_5 "QUAT_TDM_TX_5" -#define LPASS_BE_QUAT_TDM_RX_6 "QUAT_TDM_RX_6" -#define LPASS_BE_QUAT_TDM_TX_6 "QUAT_TDM_TX_6" -#define LPASS_BE_QUAT_TDM_RX_7 "QUAT_TDM_RX_7" -#define LPASS_BE_QUAT_TDM_TX_7 "QUAT_TDM_TX_7" -#define LPASS_BE_AFE_LOOPBACK_TX "AFE_LOOPBACK_TX" -#define LPASS_BE_QUIN_TDM_RX_0 "QUIN_TDM_RX_0" -#define LPASS_BE_QUIN_TDM_TX_0 "QUIN_TDM_TX_0" -#define LPASS_BE_QUIN_TDM_RX_1 "QUIN_TDM_RX_1" -#define LPASS_BE_QUIN_TDM_TX_1 "QUIN_TDM_TX_1" -#define LPASS_BE_QUIN_TDM_RX_2 "QUIN_TDM_RX_2" -#define LPASS_BE_QUIN_TDM_TX_2 "QUIN_TDM_TX_2" -#define LPASS_BE_QUIN_TDM_RX_3 "QUIN_TDM_RX_3" -#define LPASS_BE_QUIN_TDM_TX_3 "QUIN_TDM_TX_3" -#define LPASS_BE_QUIN_TDM_RX_4 "QUIN_TDM_RX_4" -#define LPASS_BE_QUIN_TDM_TX_4 "QUIN_TDM_TX_4" -#define LPASS_BE_QUIN_TDM_RX_5 "QUIN_TDM_RX_5" -#define LPASS_BE_QUIN_TDM_TX_5 "QUIN_TDM_TX_5" -#define LPASS_BE_QUIN_TDM_RX_6 "QUIN_TDM_RX_6" -#define LPASS_BE_QUIN_TDM_TX_6 "QUIN_TDM_TX_6" -#define LPASS_BE_QUIN_TDM_RX_7 "QUIN_TDM_RX_7" -#define LPASS_BE_QUIN_TDM_TX_7 "QUIN_TDM_TX_7" -#define LPASS_BE_SEN_TDM_RX_0 "SEN_TDM_RX_0" -#define LPASS_BE_SEN_TDM_TX_0 "SEN_TDM_TX_0" -#define LPASS_BE_SEN_TDM_RX_1 "SEN_TDM_RX_1" -#define LPASS_BE_SEN_TDM_TX_1 "SEN_TDM_TX_1" -#define LPASS_BE_SEN_TDM_RX_2 "SEN_TDM_RX_2" -#define LPASS_BE_SEN_TDM_TX_2 "SEN_TDM_TX_2" -#define LPASS_BE_SEN_TDM_RX_3 "SEN_TDM_RX_3" -#define LPASS_BE_SEN_TDM_TX_3 "SEN_TDM_TX_3" -#define LPASS_BE_SEN_TDM_RX_4 "SEN_TDM_RX_4" -#define LPASS_BE_SEN_TDM_TX_4 "SEN_TDM_TX_4" -#define LPASS_BE_SEN_TDM_RX_5 "SEN_TDM_RX_5" -#define LPASS_BE_SEN_TDM_TX_5 "SEN_TDM_TX_5" -#define LPASS_BE_SEN_TDM_RX_6 "SEN_TDM_RX_6" -#define LPASS_BE_SEN_TDM_TX_6 "SEN_TDM_TX_6" -#define LPASS_BE_SEN_TDM_RX_7 "SEN_TDM_RX_7" -#define LPASS_BE_SEN_TDM_TX_7 "SEN_TDM_TX_7" - -#define LPASS_BE_SLIMBUS_7_RX "SLIMBUS_7_RX" -#define LPASS_BE_SLIMBUS_7_TX "SLIMBUS_7_TX" -#define LPASS_BE_SLIMBUS_8_RX "SLIMBUS_8_RX" -#define LPASS_BE_SLIMBUS_8_TX "SLIMBUS_8_TX" -#define LPASS_BE_SLIMBUS_9_RX "SLIMBUS_9_RX" -#define LPASS_BE_SLIMBUS_9_TX "SLIMBUS_9_TX" - -#define LPASS_BE_USB_AUDIO_RX "USB_AUDIO_RX" -#define LPASS_BE_USB_AUDIO_TX "USB_AUDIO_TX" - -#define LPASS_BE_INT0_MI2S_RX "INT0_MI2S_RX" -#define LPASS_BE_INT0_MI2S_TX "INT0_MI2S_TX" -#define LPASS_BE_INT1_MI2S_RX "INT1_MI2S_RX" -#define LPASS_BE_INT1_MI2S_TX "INT1_MI2S_TX" -#define LPASS_BE_INT2_MI2S_RX "INT2_MI2S_RX" -#define LPASS_BE_INT2_MI2S_TX "INT2_MI2S_TX" -#define LPASS_BE_INT3_MI2S_RX "INT3_MI2S_RX" -#define LPASS_BE_INT3_MI2S_TX "INT3_MI2S_TX" -#define LPASS_BE_INT4_MI2S_RX "INT4_MI2S_RX" -#define LPASS_BE_INT4_MI2S_TX "INT4_MI2S_TX" -#define LPASS_BE_INT5_MI2S_RX "INT5_MI2S_RX" -#define LPASS_BE_INT5_MI2S_TX "INT5_MI2S_TX" -#define LPASS_BE_INT6_MI2S_RX "INT6_MI2S_RX" -#define LPASS_BE_INT6_MI2S_TX "INT6_MI2S_TX" - -#define LPASS_BE_WSA_CDC_DMA_RX_0 "WSA_CDC_DMA_RX_0" -#define LPASS_BE_WSA_CDC_DMA_TX_0 "WSA_CDC_DMA_TX_0" -#define LPASS_BE_WSA_CDC_DMA_RX_1 "WSA_CDC_DMA_RX_1" -#define LPASS_BE_WSA_CDC_DMA_TX_1 "WSA_CDC_DMA_TX_1" -#define LPASS_BE_WSA_CDC_DMA_TX_2 "WSA_CDC_DMA_TX_2" -#define LPASS_BE_VA_CDC_DMA_TX_0 "VA_CDC_DMA_TX_0" -#define LPASS_BE_VA_CDC_DMA_TX_1 "VA_CDC_DMA_TX_1" -#define LPASS_BE_VA_CDC_DMA_TX_2 "VA_CDC_DMA_TX_2" - -#define LPASS_BE_RX_CDC_DMA_RX_0 "RX_CDC_DMA_RX_0" -#define LPASS_BE_RX_CDC_DMA_RX_1 "RX_CDC_DMA_RX_1" -#define LPASS_BE_RX_CDC_DMA_RX_2 "RX_CDC_DMA_RX_2" -#define LPASS_BE_RX_CDC_DMA_RX_3 "RX_CDC_DMA_RX_3" -#define LPASS_BE_RX_CDC_DMA_RX_4 "RX_CDC_DMA_RX_4" -#define LPASS_BE_RX_CDC_DMA_RX_5 "RX_CDC_DMA_RX_5" -#define LPASS_BE_RX_CDC_DMA_RX_6 "RX_CDC_DMA_RX_6" -#define LPASS_BE_RX_CDC_DMA_RX_7 "RX_CDC_DMA_RX_7" -#define LPASS_BE_TX_CDC_DMA_TX_0 "TX_CDC_DMA_TX_0" -#define LPASS_BE_TX_CDC_DMA_TX_1 "TX_CDC_DMA_TX_1" -#define LPASS_BE_TX_CDC_DMA_TX_2 "TX_CDC_DMA_TX_2" -#define LPASS_BE_TX_CDC_DMA_TX_3 "TX_CDC_DMA_TX_3" -#define LPASS_BE_TX_CDC_DMA_TX_4 "TX_CDC_DMA_TX_4" -#define LPASS_BE_TX_CDC_DMA_TX_5 "TX_CDC_DMA_TX_5" - -/* For multimedia front-ends, asm session is allocated dynamically. - * Hence, asm session/multimedia front-end mapping has to be maintained. - * Due to this reason, additional multimedia front-end must be placed before - * non-multimedia front-ends. - */ - -enum { - MSM_FRONTEND_DAI_MULTIMEDIA1 = 0, - MSM_FRONTEND_DAI_MULTIMEDIA2, - MSM_FRONTEND_DAI_MULTIMEDIA3, - MSM_FRONTEND_DAI_MULTIMEDIA4, - MSM_FRONTEND_DAI_MULTIMEDIA5, - MSM_FRONTEND_DAI_MULTIMEDIA6, - MSM_FRONTEND_DAI_MULTIMEDIA7, - MSM_FRONTEND_DAI_MULTIMEDIA8, - MSM_FRONTEND_DAI_MULTIMEDIA9, - MSM_FRONTEND_DAI_MULTIMEDIA10, - MSM_FRONTEND_DAI_MULTIMEDIA11, - MSM_FRONTEND_DAI_MULTIMEDIA12, - MSM_FRONTEND_DAI_MULTIMEDIA13, - MSM_FRONTEND_DAI_MULTIMEDIA14, - MSM_FRONTEND_DAI_MULTIMEDIA15, - MSM_FRONTEND_DAI_MULTIMEDIA16, - MSM_FRONTEND_DAI_MULTIMEDIA17, - MSM_FRONTEND_DAI_MULTIMEDIA18, - MSM_FRONTEND_DAI_MULTIMEDIA19, - MSM_FRONTEND_DAI_MULTIMEDIA20, - MSM_FRONTEND_DAI_MULTIMEDIA21, - MSM_FRONTEND_DAI_MULTIMEDIA22, - MSM_FRONTEND_DAI_MULTIMEDIA23, - MSM_FRONTEND_DAI_MULTIMEDIA26, - MSM_FRONTEND_DAI_MULTIMEDIA27, - MSM_FRONTEND_DAI_MULTIMEDIA28, - MSM_FRONTEND_DAI_MULTIMEDIA29, - MSM_FRONTEND_DAI_MULTIMEDIA30, - MSM_FRONTEND_DAI_VOIP, - MSM_FRONTEND_DAI_AFE_RX, - MSM_FRONTEND_DAI_AFE_TX, - MSM_FRONTEND_DAI_VOICE_STUB, - MSM_FRONTEND_DAI_DTMF_RX, - MSM_FRONTEND_DAI_QCHAT, - MSM_FRONTEND_DAI_VOLTE_STUB, - MSM_FRONTEND_DAI_LSM1, - MSM_FRONTEND_DAI_LSM2, - MSM_FRONTEND_DAI_LSM3, - MSM_FRONTEND_DAI_LSM4, - MSM_FRONTEND_DAI_LSM5, - MSM_FRONTEND_DAI_LSM6, - MSM_FRONTEND_DAI_LSM7, - MSM_FRONTEND_DAI_LSM8, - MSM_FRONTEND_DAI_VOICE2_STUB, - MSM_FRONTEND_DAI_VOICEMMODE1, - MSM_FRONTEND_DAI_VOICEMMODE2, - MSM_FRONTEND_DAI_MAX, -}; - -#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_MULTIMEDIA30 + 1) -#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_MULTIMEDIA30 - -enum { - MSM_BACKEND_DAI_PRI_I2S_RX = 0, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_BACKEND_DAI_HDMI_RX, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_BACKEND_DAI_MI2S_RX, - MSM_BACKEND_DAI_MI2S_TX, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_BACKEND_DAI_SLIMBUS_2_TX, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_BACKEND_DAI_EXTPROC_RX, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_BACKEND_DAI_AUDIO_I2S_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX_SD1, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_BACKEND_DAI_PRI_TDM_RX_4, - MSM_BACKEND_DAI_PRI_TDM_TX_4, - MSM_BACKEND_DAI_PRI_TDM_RX_5, - MSM_BACKEND_DAI_PRI_TDM_TX_5, - MSM_BACKEND_DAI_PRI_TDM_RX_6, - MSM_BACKEND_DAI_PRI_TDM_TX_6, - MSM_BACKEND_DAI_PRI_TDM_RX_7, - MSM_BACKEND_DAI_PRI_TDM_TX_7, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_BACKEND_DAI_SEC_TDM_RX_4, - MSM_BACKEND_DAI_SEC_TDM_TX_4, - MSM_BACKEND_DAI_SEC_TDM_RX_5, - MSM_BACKEND_DAI_SEC_TDM_TX_5, - MSM_BACKEND_DAI_SEC_TDM_RX_6, - MSM_BACKEND_DAI_SEC_TDM_TX_6, - MSM_BACKEND_DAI_SEC_TDM_RX_7, - MSM_BACKEND_DAI_SEC_TDM_TX_7, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_BACKEND_DAI_TERT_TDM_TX_4, - MSM_BACKEND_DAI_TERT_TDM_RX_5, - MSM_BACKEND_DAI_TERT_TDM_TX_5, - MSM_BACKEND_DAI_TERT_TDM_RX_6, - MSM_BACKEND_DAI_TERT_TDM_TX_6, - MSM_BACKEND_DAI_TERT_TDM_RX_7, - MSM_BACKEND_DAI_TERT_TDM_TX_7, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_BACKEND_DAI_QUAT_TDM_RX_4, - MSM_BACKEND_DAI_QUAT_TDM_TX_4, - MSM_BACKEND_DAI_QUAT_TDM_RX_5, - MSM_BACKEND_DAI_QUAT_TDM_TX_5, - MSM_BACKEND_DAI_QUAT_TDM_RX_6, - MSM_BACKEND_DAI_QUAT_TDM_TX_6, - MSM_BACKEND_DAI_QUAT_TDM_RX_7, - MSM_BACKEND_DAI_QUAT_TDM_TX_7, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_BACKEND_DAI_QUIN_TDM_RX_4, - MSM_BACKEND_DAI_QUIN_TDM_TX_4, - MSM_BACKEND_DAI_QUIN_TDM_RX_5, - MSM_BACKEND_DAI_QUIN_TDM_TX_5, - MSM_BACKEND_DAI_QUIN_TDM_RX_6, - MSM_BACKEND_DAI_QUIN_TDM_TX_6, - MSM_BACKEND_DAI_QUIN_TDM_RX_7, - MSM_BACKEND_DAI_QUIN_TDM_TX_7, - MSM_BACKEND_DAI_SEN_TDM_RX_0, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_BACKEND_DAI_SEN_TDM_RX_1, - MSM_BACKEND_DAI_SEN_TDM_TX_1, - MSM_BACKEND_DAI_SEN_TDM_RX_2, - MSM_BACKEND_DAI_SEN_TDM_TX_2, - MSM_BACKEND_DAI_SEN_TDM_RX_3, - MSM_BACKEND_DAI_SEN_TDM_TX_3, - MSM_BACKEND_DAI_SEN_TDM_RX_4, - MSM_BACKEND_DAI_SEN_TDM_TX_4, - MSM_BACKEND_DAI_SEN_TDM_RX_5, - MSM_BACKEND_DAI_SEN_TDM_TX_5, - MSM_BACKEND_DAI_SEN_TDM_RX_6, - MSM_BACKEND_DAI_SEN_TDM_TX_6, - MSM_BACKEND_DAI_SEN_TDM_RX_7, - MSM_BACKEND_DAI_SEN_TDM_TX_7, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_BACKEND_DAI_USB_RX, - MSM_BACKEND_DAI_USB_TX, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT0_MI2S_TX, - MSM_BACKEND_DAI_INT1_MI2S_RX, - MSM_BACKEND_DAI_INT1_MI2S_TX, - MSM_BACKEND_DAI_INT2_MI2S_RX, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_BACKEND_DAI_INT3_MI2S_RX, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT4_MI2S_TX, - MSM_BACKEND_DAI_INT5_MI2S_RX, - MSM_BACKEND_DAI_INT5_MI2S_TX, - MSM_BACKEND_DAI_INT6_MI2S_RX, - MSM_BACKEND_DAI_INT6_MI2S_TX, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_2, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_BACKEND_DAI_AFE_LOOPBACK_TX, - MSM_BACKEND_DAI_PRI_META_MI2S_RX, - MSM_BACKEND_DAI_SEC_META_MI2S_RX, - MSM_BACKEND_DAI_PROXY_RX, - MSM_BACKEND_DAI_PROXY_TX, - MSM_BACKEND_DAI_MAX, -}; - -enum msm_pcm_routing_event { - MSM_PCM_RT_EVT_BUF_RECFG, - MSM_PCM_RT_EVT_DEVSWITCH, - MSM_PCM_RT_EVT_MAX, -}; - -enum { - EXT_EC_REF_NONE = 0, - EXT_EC_REF_PRI_MI2S_TX, - EXT_EC_REF_SEC_MI2S_TX, - EXT_EC_REF_TERT_MI2S_TX, - EXT_EC_REF_QUAT_MI2S_TX, - EXT_EC_REF_QUIN_MI2S_TX, - EXT_EC_REF_SLIM_1_TX, - EXT_EC_REF_PRI_TDM_TX, - EXT_EC_REF_SEC_TDM_TX, -}; - -#define INVALID_SESSION -1 -#define SESSION_TYPE_RX 0 -#define SESSION_TYPE_TX 1 -#define MAX_SESSION_TYPES 2 -#define INT_RX_VOL_MAX_STEPS 0x2000 -#define INT_RX_VOL_GAIN 0x2000 - -#define RELEASE_LOCK 0 -#define ACQUIRE_LOCK 1 - -#define MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX 2 -#define HDMI_RX_ID 0x8001 -#define ADM_PP_PARAM_MUTE_ID 0 -#define ADM_PP_PARAM_MUTE_BIT 1 -#define ADM_PP_PARAM_LATENCY_ID 1 -#define ADM_PP_PARAM_LATENCY_BIT 2 -#define BE_DAI_PORT_SESSIONS_IDX_MAX 4 -#define BE_DAI_FE_SESSIONS_IDX_MAX 2 - -#define STREAM_TYPE_ASM 0 -#define STREAM_TYPE_LSM 1 - -enum { - ADM_TOPOLOGY_CAL_TYPE_IDX = 0, - ADM_LSM_TOPOLOGY_CAL_TYPE_IDX, - MAX_ROUTING_CAL_TYPES -}; - -struct msm_pcm_routing_evt { - void (*event_func)(enum msm_pcm_routing_event, void *); - void *priv_data; -}; - -struct msm_pcm_routing_bdai_data { - u16 port_id; /* AFE port ID */ - u8 active; /* track if this backend is enabled */ - - /* Front-end sessions */ - unsigned long fe_sessions[BE_DAI_FE_SESSIONS_IDX_MAX]; - /* - * Track Tx BE ports -> Rx BE ports. - * port_sessions[0] used to track BE 0 to BE 63. - * port_sessions[1] used to track BE 64 to BE 127. - * port_sessions[2] used to track BE 128 to BE 191. - * port_sessions[3] used to track BE 192 to BE 255. - */ - u64 port_sessions[BE_DAI_PORT_SESSIONS_IDX_MAX]; - - unsigned int sample_rate; - unsigned int channel; - unsigned int format; - unsigned int adm_override_ch; - char *name; -}; - -struct msm_pcm_routing_fdai_data { - u16 be_srate; /* track prior backend sample rate for flushing purpose */ - int strm_id; /* ASM stream ID */ - int perf_mode; - struct msm_pcm_routing_evt event_info; - u32 passthr_mode; -}; - -#define MAX_APP_TYPES 16 -struct msm_pcm_routing_app_type_data { - int app_type; - u32 sample_rate; - int bit_width; - u32 num_out_channels; -}; - -struct msm_pcm_stream_app_type_cfg { - int app_type; - int acdb_dev_id; - int sample_rate; -}; - -/* dai_id: front-end ID, - * dspst_id: DSP audio stream ID - * stream_type: playback or capture - */ -int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, int dspst_id, - int stream_type); -void msm_pcm_routing_reg_psthr_stream(int fedai_id, int dspst_id, - int stream_type); -int msm_pcm_routing_reg_phy_compr_stream(int fedai_id, int perf_mode, - int dspst_id, int stream_type, - uint32_t compr_passthr); - -int msm_pcm_routing_reg_phy_stream_v2(int fedai_id, int perf_mode, - int dspst_id, int stream_type, - struct msm_pcm_routing_evt event_info); - -void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type); - -int msm_routing_check_backend_enabled(int fedai_id); - - -void msm_pcm_routing_get_bedai_info(int be_idx, - struct msm_pcm_routing_bdai_data *bedai); -void msm_pcm_routing_get_fedai_info(int fe_idx, int sess_type, - struct msm_pcm_routing_fdai_data *fe_dai); -void msm_pcm_routing_acquire_lock(void); -void msm_pcm_routing_release_lock(void); - -int msm_pcm_routing_reg_stream_app_type_cfg( - int fedai_id, int session_type, int be_id, - struct msm_pcm_stream_app_type_cfg *cfg_data); -int msm_pcm_routing_get_stream_app_type_cfg( - int fedai_id, int session_type, int *be_id, - struct msm_pcm_stream_app_type_cfg *cfg_data); -int msm_pcm_routing_send_chmix_cfg(int fe_id, int ip_channel_cnt, - int op_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type); -int msm_pcm_routing_get_pp_ch_cnt(int fe_id, int session_type); - -int msm_pcm_routing_set_channel_mixer_cfg( - int fe_id, int session_type, - struct msm_pcm_channel_mixer *params); - -int msm_pcm_routing_set_channel_mixer_runtime( - int be_id, int session_id, - int session_type, - struct msm_pcm_channel_mixer *params); -#endif /*_MSM_PCM_H*/ diff --git a/techpack/audio/4.0/asoc/msm-pcm-voice-v2.c b/techpack/audio/4.0/asoc/msm-pcm-voice-v2.c deleted file mode 100644 index d4d08156198b..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-voice-v2.c +++ /dev/null @@ -1,853 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-voice-v2.h" - -#define DRV_NAME "msm-pcm-voice-v2" - -#define NUM_CHANNELS_MONO 1 -#define NUM_CHANNELS_STEREO 2 - -static struct msm_voice voice_info[VOICE_SESSION_INDEX_MAX]; - -static struct snd_pcm_hardware msm_pcm_hardware = { - - .info = (SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | - SNDRV_PCM_INFO_RESUME), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .rate_min = 8000, - .rate_max = 16000, - .channels_min = 1, - .channels_max = 1, - - .buffer_bytes_max = 4096 * 2, - .period_bytes_min = 2048, - .period_bytes_max = 4096, - .periods_min = 2, - .periods_max = 4, - - .fifo_size = 0, -}; -static bool is_volte(struct msm_voice *pvolte) -{ - if (pvolte == &voice_info[VOLTE_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_voice2(struct msm_voice *pvoice2) -{ - if (pvoice2 == &voice_info[VOICE2_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_qchat(struct msm_voice *pqchat) -{ - if (pqchat == &voice_info[QCHAT_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_vowlan(struct msm_voice *pvowlan) -{ - if (pvowlan == &voice_info[VOWLAN_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_voicemmode1(struct msm_voice *pvoicemmode1) -{ - if (pvoicemmode1 == &voice_info[VOICEMMODE1_INDEX]) - return true; - else - return false; -} - -static bool is_voicemmode2(struct msm_voice *pvoicemmode2) -{ - if (pvoicemmode2 == &voice_info[VOICEMMODE2_INDEX]) - return true; - else - return false; -} - -static uint32_t get_session_id(struct msm_voice *pvoc) -{ - uint32_t session_id = 0; - - if (is_volte(pvoc)) - session_id = voc_get_session_id(VOLTE_SESSION_NAME); - else if (is_voice2(pvoc)) - session_id = voc_get_session_id(VOICE2_SESSION_NAME); - else if (is_qchat(pvoc)) - session_id = voc_get_session_id(QCHAT_SESSION_NAME); - else if (is_vowlan(pvoc)) - session_id = voc_get_session_id(VOWLAN_SESSION_NAME); - else if (is_voicemmode1(pvoc)) - session_id = voc_get_session_id(VOICEMMODE1_NAME); - else if (is_voicemmode2(pvoc)) - session_id = voc_get_session_id(VOICEMMODE2_NAME); - else - session_id = voc_get_session_id(VOICE_SESSION_NAME); - - return session_id; -} - - -static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (!prtd->playback_start) - prtd->playback_start = 1; - - return 0; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (!prtd->capture_start) - prtd->capture_start = 1; - - return 0; -} -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *voice; - - if (!strncmp("VoLTE", substream->pcm->id, 5)) { - voice = &voice_info[VOLTE_SESSION_INDEX]; - pr_debug("%s: Open VoLTE Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("Voice2", substream->pcm->id, 6)) { - voice = &voice_info[VOICE2_SESSION_INDEX]; - pr_debug("%s: Open Voice2 Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("QCHAT", substream->pcm->id, 5)) { - voice = &voice_info[QCHAT_SESSION_INDEX]; - pr_debug("%s: Open QCHAT Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("VoWLAN", substream->pcm->id, 6)) { - voice = &voice_info[VOWLAN_SESSION_INDEX]; - pr_debug("%s: Open VoWLAN Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("VoiceMMode1", substream->pcm->id, 11)) { - voice = &voice_info[VOICEMMODE1_INDEX]; - pr_debug("%s: Open VoiceMMode1 Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("VoiceMMode2", substream->pcm->id, 11)) { - voice = &voice_info[VOICEMMODE2_INDEX]; - pr_debug("%s: Open VoiceMMode2 Substream Id=%s\n", - __func__, substream->pcm->id); - } else { - voice = &voice_info[VOICE_SESSION_INDEX]; - pr_debug("%s: Open VOICE Substream Id=%s\n", - __func__, substream->pcm->id); - } - mutex_lock(&voice->lock); - - runtime->hw = msm_pcm_hardware; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - voice->playback_substream = substream; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - voice->capture_substream = substream; - - voice->instance++; - pr_debug("%s: Instance = %d, Stream ID = %s\n", - __func__, voice->instance, substream->pcm->id); - runtime->private_data = voice; - - mutex_unlock(&voice->lock); - - return 0; -} -static int msm_pcm_playback_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (prtd->playback_start) - prtd->playback_start = 0; - - prtd->playback_substream = NULL; - - return 0; -} -static int msm_pcm_capture_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (prtd->capture_start) - prtd->capture_start = 0; - prtd->capture_substream = NULL; - - return 0; -} -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = 0; - int ret = 0; - - mutex_lock(&prtd->lock); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_close(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_close(substream); - - prtd->instance--; - if (!prtd->playback_start && !prtd->capture_start) { - pr_debug("end voice call\n"); - - session_id = get_session_id(prtd); - if (session_id) - voc_end_voice_call(session_id); - } - mutex_unlock(&prtd->lock); - - return ret; -} -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = 0; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - - if (prtd->playback_start && prtd->capture_start) { - session_id = get_session_id(prtd); - if (session_id) - voc_start_voice_call(session_id); - } - mutex_unlock(&prtd->lock); - - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - - pr_debug("%s: Voice\n", __func__); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - return 0; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = 0; - - pr_debug("%s: cmd = %d\n", __func__, cmd); - - session_id = get_session_id(prtd); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("Start & Stop Voice call not handled in Trigger.\n"); - break; - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: resume call session_id = %d\n", __func__, - session_id); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - if (prtd->playback_start && prtd->capture_start) { - if (session_id) - voc_resume_voice_call(session_id); - } - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("%s: pause call session_id=%d\n", - __func__, session_id); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (prtd->playback_start) - prtd->playback_start = 0; - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (prtd->capture_start) - prtd->capture_start = 0; - } - if (session_id) - voc_standby_voice_call(session_id); - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - -static int msm_pcm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = get_session_id(prtd); - enum voice_lch_mode lch_mode; - int ret = 0; - - switch (cmd) { - case SNDRV_VOICE_IOCTL_LCH: - if (copy_from_user(&lch_mode, (void *)arg, - sizeof(enum voice_lch_mode))) { - pr_err("%s: Copy from user failed, size %zd\n", - __func__, sizeof(enum voice_lch_mode)); - - ret = -EFAULT; - break; - } - - pr_debug("%s: %s lch_mode:%d\n", - __func__, substream->pcm->id, lch_mode); - - switch (lch_mode) { - case VOICE_LCH_START: - case VOICE_LCH_STOP: - ret = voc_set_lch(session_id, lch_mode); - break; - - default: - pr_err("%s: Invalid LCH MODE %d\n", __func__, lch_mode); - - ret = -EFAULT; - } - - break; - default: - pr_debug("%s: Falling into default snd_lib_ioctl cmd 0x%x\n", - __func__, cmd); - - ret = snd_pcm_lib_ioctl(substream, cmd, arg); - break; - } - - if (!ret) - pr_debug("%s: ret %d\n", __func__, ret); - else - pr_err("%s: cmd 0x%x failed %d\n", __func__, cmd, ret); - - return ret; -} - -static int msm_voice_sidetone_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret; - long value = ucontrol->value.integer.value[0]; - bool sidetone_enable = value; - uint32_t session_id = ALL_SESSION_VSID; - - if (value < 0) { - pr_err("%s: Invalid arguments sidetone enable %ld\n", - __func__, value); - ret = -EINVAL; - return ret; - } - ret = voc_set_afe_sidetone(session_id, sidetone_enable); - pr_debug("%s: AFE Sidetone enable=%d session_id=0x%x ret=%d\n", - __func__, sidetone_enable, session_id, ret); - return ret; -} - -static int msm_voice_sidetone_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = voc_get_afe_sidetone(); - return 0; -} - -static int msm_voice_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int volume = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((volume < 0) || (ramp_duration < 0) - || (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: volume: %d session_id: %#x ramp_duration: %d\n", __func__, - volume, session_id, ramp_duration); - - voc_set_rx_vol_step(session_id, RX_PATH, volume, ramp_duration); - -done: - return ret; -} - -static int msm_voice_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0) - || (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d session_id=%#x ramp_duration=%d\n", __func__, - mute, session_id, ramp_duration); - - ret = voc_set_tx_mute(session_id, TX_PATH, mute, ramp_duration); - -done: - return ret; -} - -static int msm_voice_tx_device_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0) || - (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d session_id=%#x ramp_duration=%d\n", __func__, - mute, session_id, ramp_duration); - - ret = voc_set_device_mute(session_id, VSS_IVOLUME_DIRECTION_TX, - mute, ramp_duration); - -done: - return ret; -} - -static int msm_voice_rx_device_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0) || - (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d session_id=%#x ramp_duration=%d\n", __func__, - mute, session_id, ramp_duration); - - voc_set_device_mute(session_id, VSS_IVOLUME_DIRECTION_RX, - mute, ramp_duration); - -done: - return ret; -} - -static int msm_voice_mbd_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = voc_get_mbd_enable(); - return 0; -} - -static int msm_voice_mbd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - bool enable = ucontrol->value.integer.value[0]; - - voc_set_mbd_enable(enable); - - return 0; -} - - -static const char * const tty_mode[] = {"OFF", "HCO", "VCO", "FULL"}; -static const struct soc_enum msm_tty_mode_enum[] = { - SOC_ENUM_SINGLE_EXT(4, tty_mode), -}; - -static int msm_voice_tty_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = - voc_get_tty_mode(voc_get_session_id(VOICE_SESSION_NAME)); - return 0; -} - -static int msm_voice_tty_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int tty_mode = ucontrol->value.integer.value[0]; - - pr_debug("%s: tty_mode=%d\n", __func__, tty_mode); - - voc_set_tty_mode(voc_get_session_id(VOICE_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOICE2_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOLTE_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOWLAN_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOICEMMODE1_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOICEMMODE2_NAME), tty_mode); - - return 0; -} - -static int msm_voice_slowtalk_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int st_enable = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - struct module_instance_info mod_inst_info; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - pr_debug("%s: st enable=%d session_id=%#x\n", __func__, st_enable, - session_id); - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - voc_set_pp_enable(session_id, mod_inst_info, st_enable); - - return 0; -} - -static int msm_voice_ecns_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t enable = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - uint32_t module_id = ucontrol->value.integer.value[2]; - - pr_debug("%s: ecns enable=%d session_id=%#x\n", __func__, enable, - session_id); - voc_set_ecns_enable(session_id, module_id, enable); - - return 0; -} - -static int msm_voice_hd_voice_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - uint32_t hd_enable = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - - pr_debug("%s: HD Voice enable=%d session_id=%#x\n", __func__, hd_enable, - session_id); - - ret = voc_set_hd_enable(session_id, hd_enable); - - return ret; -} - -static int msm_voice_topology_disable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int disable = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - - if ((disable < 0) || (disable > 1)) { - pr_err(" %s Invalid arguments: %d\n", __func__, disable); - - ret = -EINVAL; - goto done; - } - pr_debug("%s: disable = %d, session_id = %d\n", __func__, disable, - session_id); - - ret = voc_disable_topology(session_id, disable); - -done: - return ret; -} - -static int msm_voice_rec_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int voc_rec_config_channels = ucontrol->value.integer.value[0]; - - if (voc_rec_config_channels < NUM_CHANNELS_MONO || - voc_rec_config_channels > NUM_CHANNELS_STEREO) { - pr_err("%s: Invalid channel config (%d)\n", __func__, - voc_rec_config_channels); - ret = -EINVAL; - goto done; - } - voc_set_incall_capture_channel_config(voc_rec_config_channels); - -done: - pr_debug("%s: voc_rec_config_channels = %d, ret = %d\n", __func__, - voc_rec_config_channels, ret); - return ret; -} - -static int msm_voice_rec_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - ucontrol->value.integer.value[0] = - voc_get_incall_capture_channel_config(); - pr_debug("%s: rec_config_channels = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_voice_cvd_version_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - int ret = 0; - - pr_debug("%s:\n", __func__); - - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = CVD_VERSION_STRING_MAX_SIZE; - - return ret; -} - -static int msm_voice_cvd_version_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char cvd_version[CVD_VERSION_STRING_MAX_SIZE] = CVD_VERSION_DEFAULT; - int ret; - - pr_debug("%s:\n", __func__); - - ret = voc_get_cvd_version(cvd_version); - - if (ret) - pr_err("%s: Error retrieving CVD version, error:%d\n", - __func__, ret); - - memcpy(ucontrol->value.bytes.data, cvd_version, sizeof(cvd_version)); - - return 0; -} -static struct snd_kcontrol_new msm_voice_controls[] = { - SOC_SINGLE_MULTI_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, - 0, 3, NULL, msm_voice_rx_device_mute_put), - SOC_SINGLE_MULTI_EXT("Voice Tx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, - 0, 3, NULL, msm_voice_tx_device_mute_put), - SOC_SINGLE_MULTI_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, VSID_MAX, - 0, 3, NULL, msm_voice_mute_put), - SOC_SINGLE_MULTI_EXT("Voice Rx Gain", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, - NULL, msm_voice_gain_put), - SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, - msm_voice_tty_mode_put), - SOC_SINGLE_MULTI_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, - NULL, msm_voice_slowtalk_put), - SOC_SINGLE_MULTI_EXT("Voice ECNS Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, - NULL, msm_voice_ecns_put), - SOC_SINGLE_MULTI_EXT("Voice Topology Disable", SND_SOC_NOPM, 0, - VSID_MAX, 0, 2, NULL, - msm_voice_topology_disable_put), - SOC_SINGLE_MULTI_EXT("HD Voice Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, - NULL, msm_voice_hd_voice_put), - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "CVD Version", - .info = msm_voice_cvd_version_info, - .get = msm_voice_cvd_version_get, - }, - SOC_SINGLE_MULTI_EXT("Voice Sidetone Enable", SND_SOC_NOPM, 0, 1, 0, 1, - msm_voice_sidetone_get, msm_voice_sidetone_put), - SOC_SINGLE_BOOL_EXT("Voice Mic Break Enable", 0, msm_voice_mbd_get, - msm_voice_mbd_put), -}; - -static struct snd_kcontrol_new msm_voice_rec_config_controls[] = { - SOC_SINGLE_MULTI_EXT("Voc Rec Config", SND_SOC_NOPM, 0, - 2, 0, 1, msm_voice_rec_config_get, - msm_voice_rec_config_put), -}; - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .ioctl = msm_pcm_ioctl, - .compat_ioctl = msm_pcm_ioctl, -}; - - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static int msm_pcm_voice_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_voice_controls, - ARRAY_SIZE(msm_voice_controls)); - snd_soc_add_platform_controls(platform, msm_voice_rec_config_controls, - ARRAY_SIZE(msm_voice_rec_config_controls)); - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_voice_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - bool destroy_cvd = false; - const char *is_destroy_cvd = "qcom,destroy-cvd"; - - if (!is_voc_initialized()) { - pr_debug("%s: voice module not initialized yet, deferring probe()\n", - __func__); - - rc = -EPROBE_DEFER; - goto done; - } - - rc = voc_alloc_cal_shared_memory(); - if (rc == -EPROBE_DEFER) { - pr_debug("%s: memory allocation for calibration deferred %d\n", - __func__, rc); - - goto done; - } else if (rc < 0) { - pr_err("%s: memory allocation for calibration failed %d\n", - __func__, rc); - } - - pr_debug("%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - destroy_cvd = of_property_read_bool(pdev->dev.of_node, - is_destroy_cvd); - voc_set_destroy_cvd_flag(destroy_cvd); - - rc = snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); - -done: - return rc; -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_voice_dt_match[] = { - {.compatible = "qcom,msm-pcm-voice"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_voice_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-voice", - .owner = THIS_MODULE, - .of_match_table = msm_voice_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_voice_init(void) -{ - int i = 0; - - memset(&voice_info, 0, sizeof(voice_info)); - - for (i = 0; i < VOICE_SESSION_INDEX_MAX; i++) - mutex_init(&voice_info[i].lock); - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_voice_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("Voice PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-pcm-voice-v2.h b/techpack/audio/4.0/asoc/msm-pcm-voice-v2.h deleted file mode 100644 index d300abf9b15b..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-voice-v2.h +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. - */ -#ifndef _MSM_PCM_VOICE_H -#define _MSM_PCM_VOICE_H -#include - -enum { - VOICE_SESSION_INDEX, - VOLTE_SESSION_INDEX, - VOICE2_SESSION_INDEX, - QCHAT_SESSION_INDEX, - VOWLAN_SESSION_INDEX, - VOICEMMODE1_INDEX, - VOICEMMODE2_INDEX, - VOICE_SESSION_INDEX_MAX, -}; - -struct msm_voice { - struct snd_pcm_substream *playback_substream; - struct snd_pcm_substream *capture_substream; - - int instance; - - struct mutex lock; - - uint32_t samp_rate; - uint32_t channel_mode; - - int playback_start; - int capture_start; -}; - -#endif /*_MSM_PCM_VOICE_H*/ diff --git a/techpack/audio/4.0/asoc/msm-pcm-voip-v2.c b/techpack/audio/4.0/asoc/msm-pcm-voip-v2.c deleted file mode 100644 index 25cdf2b1b5a9..000000000000 --- a/techpack/audio/4.0/asoc/msm-pcm-voip-v2.c +++ /dev/null @@ -1,1701 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" - -#define SHARED_MEM_BUF 2 -#define VOIP_MAX_Q_LEN 10 -#define VOIP_MAX_VOC_PKT_SIZE 4096 -#define VOIP_MIN_VOC_PKT_SIZE 320 - -/* Length of the DSP frame info header added to the voc packet. */ -#define DSP_FRAME_HDR_LEN 1 - -#define MODE_IS127 0x2 -#define MODE_4GV_NB 0x3 -#define MODE_4GV_WB 0x4 -#define MODE_AMR 0x5 -#define MODE_AMR_WB 0xD -#define MODE_PCM 0xC -#define MODE_4GV_NW 0xE -#define MODE_G711 0xA -#define MODE_G711A 0xF - -enum msm_audio_g711a_frame_type { - MVS_G711A_SPEECH_GOOD, - MVS_G711A_SID, - MVS_G711A_NO_DATA, - MVS_G711A_ERASURE -}; - -enum msm_audio_g711a_mode { - MVS_G711A_MODE_MULAW, - MVS_G711A_MODE_ALAW -}; - -enum msm_audio_g711_mode { - MVS_G711_MODE_MULAW, - MVS_G711_MODE_ALAW -}; - -#define VOIP_MODE_MAX MODE_G711A -#define VOIP_RATE_MAX 23850 - -enum format { - FORMAT_S16_LE = 2, - FORMAT_SPECIAL = 31, -}; - - -enum amr_rate_type { - AMR_RATE_4750, /* AMR 4.75 kbps */ - AMR_RATE_5150, /* AMR 5.15 kbps */ - AMR_RATE_5900, /* AMR 5.90 kbps */ - AMR_RATE_6700, /* AMR 6.70 kbps */ - AMR_RATE_7400, /* AMR 7.40 kbps */ - AMR_RATE_7950, /* AMR 7.95 kbps */ - AMR_RATE_10200, /* AMR 10.20 kbps */ - AMR_RATE_12200, /* AMR 12.20 kbps */ - AMR_RATE_6600, /* AMR-WB 6.60 kbps */ - AMR_RATE_8850, /* AMR-WB 8.85 kbps */ - AMR_RATE_12650, /* AMR-WB 12.65 kbps */ - AMR_RATE_14250, /* AMR-WB 14.25 kbps */ - AMR_RATE_15850, /* AMR-WB 15.85 kbps */ - AMR_RATE_18250, /* AMR-WB 18.25 kbps */ - AMR_RATE_19850, /* AMR-WB 19.85 kbps */ - AMR_RATE_23050, /* AMR-WB 23.05 kbps */ - AMR_RATE_23850, /* AMR-WB 23.85 kbps */ - AMR_RATE_UNDEF -}; - -enum voip_state { - VOIP_STOPPED, - VOIP_STARTED, -}; - -struct voip_frame_hdr { - uint32_t timestamp; - union { - /* - * Bits 0-3: Frame type - * [optional] Bits 16-19: Frame rate - */ - uint32_t frame_type; - uint32_t packet_rate; - }; -}; -struct voip_frame { - struct voip_frame_hdr frm_hdr; - uint32_t pktlen; - uint8_t voc_pkt[VOIP_MAX_VOC_PKT_SIZE]; -}; - -struct voip_buf_node { - struct list_head list; - struct voip_frame frame; -}; - -struct voip_drv_info { - enum voip_state state; - - struct snd_pcm_substream *playback_substream; - struct snd_pcm_substream *capture_substream; - - struct list_head in_queue; - struct list_head free_in_queue; - - struct list_head out_queue; - struct list_head free_out_queue; - - wait_queue_head_t out_wait; - wait_queue_head_t in_wait; - - struct mutex lock; - - spinlock_t dsp_lock; - spinlock_t dsp_ul_lock; - - bool voip_reset; - uint32_t mode; - uint32_t rate_type; - uint32_t rate; - uint32_t dtx_mode; - - uint8_t capture_start; - uint8_t playback_start; - - uint8_t playback_prepare; - uint8_t capture_prepare; - - unsigned int play_samp_rate; - unsigned int cap_samp_rate; - - unsigned int pcm_size; - unsigned int pcm_count; - unsigned int pcm_playback_irq_pos; /* IRQ position */ - unsigned int pcm_playback_buf_pos; /* position in buffer */ - - unsigned int pcm_capture_size; - unsigned int pcm_capture_count; - unsigned int pcm_capture_irq_pos; /* IRQ position */ - unsigned int pcm_capture_buf_pos; /* position in buffer */ - - uint32_t evrc_min_rate; - uint32_t evrc_max_rate; -}; - -static int voip_get_media_type(uint32_t mode, uint32_t rate_type, - unsigned int samp_rate, - unsigned int *media_type); -static int voip_get_rate_type(uint32_t mode, - uint32_t rate, - uint32_t *rate_type); -static int voip_config_vocoder(struct snd_pcm_substream *substream); -static int msm_voip_mode_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_mode_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_evrc_min_max_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_evrc_min_max_rate_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - -static struct voip_drv_info voip_info; - -static struct snd_pcm_hardware msm_pcm_hardware = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = sizeof(struct voip_buf_node) * VOIP_MAX_Q_LEN, - .period_bytes_min = VOIP_MIN_VOC_PKT_SIZE, - .period_bytes_max = VOIP_MAX_VOC_PKT_SIZE, - .periods_min = VOIP_MAX_Q_LEN, - .periods_max = VOIP_MAX_Q_LEN, - .fifo_size = 0, -}; - - -static int msm_voip_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - int ramp_duration = ucontrol->value.integer.value[1]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d ramp_duration=%d\n", __func__, mute, - ramp_duration); - - voc_set_tx_mute(voc_get_session_id(VOIP_SESSION_NAME), TX_PATH, mute, - ramp_duration); - -done: - return ret; -} - -static int msm_voip_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int volume = ucontrol->value.integer.value[0]; - int ramp_duration = ucontrol->value.integer.value[1]; - - if ((volume < 0) || (ramp_duration < 0)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: volume: %d ramp_duration: %d\n", __func__, volume, - ramp_duration); - - voc_set_rx_vol_step(voc_get_session_id(VOIP_SESSION_NAME), - RX_PATH, - volume, - ramp_duration); - -done: - return ret; -} - -static int msm_voip_dtx_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - voip_info.dtx_mode = ucontrol->value.integer.value[0]; - - pr_debug("%s: dtx: %d\n", __func__, voip_info.dtx_mode); - - mutex_unlock(&voip_info.lock); - - return 0; -} -static int msm_voip_dtx_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - ucontrol->value.integer.value[0] = voip_info.dtx_mode; - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static struct snd_kcontrol_new msm_voip_controls[] = { - SOC_SINGLE_MULTI_EXT("Voip Tx Mute", SND_SOC_NOPM, 0, - MAX_RAMP_DURATION, - 0, 2, NULL, msm_voip_mute_put), - SOC_SINGLE_MULTI_EXT("Voip Rx Gain", SND_SOC_NOPM, 0, - MAX_RAMP_DURATION, - 0, 2, NULL, msm_voip_gain_put), - SOC_SINGLE_EXT("Voip Mode Config", SND_SOC_NOPM, 0, VOIP_MODE_MAX, 0, - msm_voip_mode_config_get, msm_voip_mode_config_put), - SOC_SINGLE_EXT("Voip Rate Config", SND_SOC_NOPM, 0, VOIP_RATE_MAX, 0, - NULL, msm_voip_rate_config_put), - SOC_SINGLE_MULTI_EXT("Voip Evrc Min Max Rate Config", SND_SOC_NOPM, - 0, VOC_1_RATE, 0, 2, - msm_voip_evrc_min_max_rate_config_get, - msm_voip_evrc_min_max_rate_config_put), - SOC_SINGLE_EXT("Voip Dtx Mode", SND_SOC_NOPM, 0, 1, 0, - msm_voip_dtx_mode_get, msm_voip_dtx_mode_put), -}; - -static int msm_pcm_voip_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_voip_controls, - ARRAY_SIZE(msm_voip_controls)); - - return 0; -} - -/* sample rate supported */ -static unsigned int supported_sample_rates[] = {8000, 16000, 32000, 48000}; - -static void voip_ssr_cb_fn(uint32_t opcode, void *private_data) -{ - - /* Notify ASoC to send next playback/Capture to unblock write/read */ - struct voip_drv_info *prtd = private_data; - - if (opcode == 0xFFFFFFFF) { - - prtd->voip_reset = true; - pr_debug("%s: Notify ASoC to send next playback/Capture\n", - __func__); - - prtd->pcm_playback_irq_pos += prtd->pcm_count; - if (prtd->state == VOIP_STARTED) - snd_pcm_period_elapsed(prtd->playback_substream); - wake_up(&prtd->out_wait); - - prtd->pcm_capture_irq_pos += prtd->pcm_capture_count; - if (prtd->state == VOIP_STARTED) - snd_pcm_period_elapsed(prtd->capture_substream); - wake_up(&prtd->in_wait); - - } else { - pr_err("%s: Invalid opcode during reset : %d\n", - __func__, opcode); - } -} - -/* capture path */ -static void voip_process_ul_pkt(uint8_t *voc_pkt, - uint32_t pkt_len, - uint32_t timestamp, - void *private_data) -{ - struct voip_buf_node *buf_node = NULL; - struct voip_drv_info *prtd = private_data; - unsigned long dsp_flags; - - if (prtd->capture_substream == NULL) - return; - - /* Copy up-link packet into out_queue. */ - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - - /* discarding UL packets till start is received */ - if (!list_empty(&prtd->free_out_queue) && prtd->capture_start) { - buf_node = list_first_entry(&prtd->free_out_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - switch (prtd->mode) { - case MODE_AMR_WB: - case MODE_AMR: { - /* Remove the DSP frame info header. Header format: - * Bits 0-3: Frame rate - * Bits 4-7: Frame type - */ - buf_node->frame.frm_hdr.timestamp = timestamp; - buf_node->frame.frm_hdr.frame_type = - ((*voc_pkt) & 0xF0) >> 4; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - buf_node->frame.pktlen = pkt_len - DSP_FRAME_HDR_LEN; - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, &prtd->out_queue); - break; - } - case MODE_IS127: - case MODE_4GV_NB: - case MODE_4GV_WB: - case MODE_4GV_NW: { - /* Remove the DSP frame info header. - * Header format: - * Bits 0-3: frame rate - */ - buf_node->frame.frm_hdr.timestamp = timestamp; - buf_node->frame.frm_hdr.packet_rate = (*voc_pkt) & 0x0F; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - buf_node->frame.pktlen = pkt_len - DSP_FRAME_HDR_LEN; - - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, &prtd->out_queue); - break; - } - case MODE_G711: - case MODE_G711A:{ - /* G711 frames are 10ms each, but the DSP works with - * 20ms frames and sends two 10ms frames per buffer. - * Extract the two frames and put them in separate - * buffers. - */ - /* Remove the first DSP frame info header. - * Header format: G711A - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - * - * Header format: G711 - * Bits 2-3: Frame rate - */ - if (prtd->mode == MODE_G711A) - buf_node->frame.frm_hdr.frame_type = - (*voc_pkt) & 0x03; - buf_node->frame.frm_hdr.timestamp = timestamp; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - /* There are two frames in the buffer. Length of the - * first frame: - */ - buf_node->frame.pktlen = (pkt_len - - 2 * DSP_FRAME_HDR_LEN) / 2; - - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - voc_pkt = voc_pkt + buf_node->frame.pktlen; - - list_add_tail(&buf_node->list, &prtd->out_queue); - - /* Get another buffer from the free Q and fill in the - * second frame. - */ - if (!list_empty(&prtd->free_out_queue)) { - buf_node = - list_first_entry(&prtd->free_out_queue, - struct voip_buf_node, - list); - list_del(&buf_node->list); - - /* Remove the second DSP frame info header. - * Header format: - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - */ - - if (prtd->mode == MODE_G711A) - buf_node->frame.frm_hdr.frame_type = - (*voc_pkt) & 0x03; - buf_node->frame.frm_hdr.timestamp = timestamp; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - /* There are two frames in the buffer. Length - * of the second frame: - */ - buf_node->frame.pktlen = (pkt_len - - 2 * DSP_FRAME_HDR_LEN) / 2; - - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, - &prtd->out_queue); - } else { - /* Drop the second frame */ - pr_err("%s: UL data dropped, read is slow\n", - __func__); - } - break; - } - default: { - buf_node->frame.frm_hdr.timestamp = timestamp; - buf_node->frame.pktlen = pkt_len; - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - list_add_tail(&buf_node->list, &prtd->out_queue); - } - } - pr_debug("%s: pkt_len =%d, frame.pktlen=%d, timestamp=%d\n", - __func__, pkt_len, buf_node->frame.pktlen, timestamp); - - if (prtd->mode == MODE_PCM) - prtd->pcm_capture_irq_pos += buf_node->frame.pktlen; - else - prtd->pcm_capture_irq_pos += prtd->pcm_capture_count; - - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - snd_pcm_period_elapsed(prtd->capture_substream); - } else { - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - pr_err("UL data dropped\n"); - } - - wake_up(&prtd->out_wait); -} - -/* playback path */ -static void voip_process_dl_pkt(uint8_t *voc_pkt, void *private_data) -{ - struct voip_buf_node *buf_node = NULL; - struct voip_drv_info *prtd = private_data; - unsigned long dsp_flags; - uint32_t rate_type; - uint32_t frame_rate; - u32 pkt_len; - u8 *voc_addr = NULL; - - if (prtd->playback_substream == NULL) - return; - - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - - if (!list_empty(&prtd->in_queue) && prtd->playback_start) { - buf_node = list_first_entry(&prtd->in_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - switch (prtd->mode) { - case MODE_AMR: - case MODE_AMR_WB: { - *((uint32_t *)voc_pkt) = buf_node->frame.pktlen + - DSP_FRAME_HDR_LEN; - /* Advance to the header of voip packet */ - voc_pkt = voc_pkt + sizeof(uint32_t); - /* - * Add the DSP frame info header. Header format: - * Bits 0-3: Frame rate - * Bits 4-7: Frame type - */ - *voc_pkt = ((buf_node->frame.frm_hdr.frame_type & - 0x0F) << 4); - frame_rate = (buf_node->frame.frm_hdr.frame_type & - 0xFFFF0000) >> 16; - if (frame_rate) { - if (voip_get_rate_type(prtd->mode, frame_rate, - &rate_type)) { - pr_err("%s(): fail at getting rate_type\n", - __func__); - } else - prtd->rate_type = rate_type; - } - *voc_pkt |= prtd->rate_type & 0x0F; - - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - list_add_tail(&buf_node->list, &prtd->free_in_queue); - break; - } - case MODE_IS127: - case MODE_4GV_NB: - case MODE_4GV_WB: - case MODE_4GV_NW: { - *((uint32_t *)voc_pkt) = buf_node->frame.pktlen + - DSP_FRAME_HDR_LEN; - /* Advance to the header of voip packet */ - voc_pkt = voc_pkt + sizeof(uint32_t); - /* - * Add the DSP frame info header. Header format: - * Bits 0-3 : Frame rate - */ - *voc_pkt = buf_node->frame.frm_hdr.packet_rate & 0x0F; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, &prtd->free_in_queue); - break; - } - case MODE_G711: - case MODE_G711A:{ - /* G711 frames are 10ms each but the DSP expects 20ms - * worth of data, so send two 10ms frames per buffer. - */ - /* Add the first DSP frame info header. Header format: - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - */ - voc_addr = voc_pkt; - voc_pkt = voc_pkt + sizeof(uint32_t); - - *voc_pkt = ((prtd->rate_type & 0x0F) << 2) | - (buf_node->frame.frm_hdr.frame_type & 0x03); - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - pkt_len = buf_node->frame.pktlen + DSP_FRAME_HDR_LEN; - - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - voc_pkt = voc_pkt + buf_node->frame.pktlen; - - list_add_tail(&buf_node->list, &prtd->free_in_queue); - - if (!list_empty(&prtd->in_queue)) { - /* Get the second buffer. */ - buf_node = list_first_entry(&prtd->in_queue, - struct voip_buf_node, - list); - list_del(&buf_node->list); - - /* Add the second DSP frame info header. - * Header format: - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - */ - *voc_pkt = ((prtd->rate_type & 0x0F) << 2) | - (buf_node->frame.frm_hdr.frame_type & 0x03); - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - pkt_len = pkt_len + buf_node->frame.pktlen + - DSP_FRAME_HDR_LEN; - - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, - &prtd->free_in_queue); - } else { - /* Only 10ms worth of data is available, signal - * erasure frame. - */ - *voc_pkt = ((prtd->rate_type & 0x0F) << 2) | - (MVS_G711A_ERASURE & 0x03); - - pkt_len = pkt_len + DSP_FRAME_HDR_LEN; - pr_debug("%s, Only 10ms read, erase 2nd frame\n", - __func__); - } - *((uint32_t *)voc_addr) = pkt_len; - break; - } - default: { - *((uint32_t *)voc_pkt) = buf_node->frame.pktlen; - voc_pkt = voc_pkt + sizeof(uint32_t); - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - list_add_tail(&buf_node->list, &prtd->free_in_queue); - } - } - pr_debug("%s: frame.pktlen=%d\n", __func__, - buf_node->frame.pktlen); - - if (prtd->mode == MODE_PCM) - prtd->pcm_playback_irq_pos += buf_node->frame.pktlen; - else - prtd->pcm_playback_irq_pos += prtd->pcm_count; - - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(prtd->playback_substream); - } else { - *((uint32_t *)voc_pkt) = 0; - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - pr_err_ratelimited("DL data not available\n"); - } - wake_up(&prtd->in_wait); -} - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - prtd->play_samp_rate = runtime->rate; - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_playback_irq_pos = 0; - prtd->pcm_playback_buf_pos = 0; - prtd->playback_prepare = 1; - - return 0; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - int ret = 0; - - prtd->cap_samp_rate = runtime->rate; - prtd->pcm_capture_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_capture_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_capture_irq_pos = 0; - prtd->pcm_capture_buf_pos = 0; - prtd->capture_prepare = 1; - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - pr_debug("%s: Trigger start\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_start = 1; - else - prtd->playback_start = 1; - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->playback_start = 0; - else - prtd->capture_start = 0; - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = &voip_info; - int ret = 0; - - pr_debug("%s, VoIP\n", __func__); - mutex_lock(&prtd->lock); - - runtime->hw = msm_pcm_hardware; - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_debug("snd_pcm_hw_constraint_list failed\n"); - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) { - pr_debug("snd_pcm_hw_constraint_integer failed\n"); - goto err; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->playback_substream = substream; - else - prtd->capture_substream = substream; - - runtime->private_data = prtd; -err: - mutex_unlock(&prtd->lock); - - return ret; -} - -static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct voip_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - - pr_debug("%s: fbytes=%lu\n", __func__, fbytes); - - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - ret = wait_event_interruptible_timeout(prtd->in_wait, - (!list_empty(&prtd->free_in_queue) || - prtd->state == VOIP_STOPPED), - 1 * HZ); - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - if (ret > 0) { - if (fbytes <= VOIP_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - buf_node = - list_first_entry(&prtd->free_in_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - if (prtd->mode == MODE_PCM) { - ret = copy_from_user(&buf_node->frame.voc_pkt, - buf, fbytes); - if (ret) { - pr_err("%s: copy from user failed %d\n", - __func__, ret); - return -EFAULT; - } - buf_node->frame.pktlen = fbytes; - } else { - ret = copy_from_user(&buf_node->frame, - buf, fbytes); - if (ret) { - pr_err("%s: copy from user failed %d\n", - __func__, ret); - return -EFAULT; - } - if (buf_node->frame.pktlen >= fbytes) - buf_node->frame.pktlen = fbytes - - (sizeof(buf_node->frame.frm_hdr) + - sizeof(buf_node->frame.pktlen)); - } - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, &prtd->in_queue); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - } else { - pr_err("%s: Write cnt %lu is > VOIP_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - - } else if (ret == 0) { - pr_err("%s: No free DL buffs\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: playback copy was interrupted %d\n", __func__, ret); - } - - return ret; -} -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - struct voip_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - int size; - - pr_debug("%s: fbytes = %lu\n", __func__, fbytes); - - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - ret = wait_event_interruptible_timeout(prtd->out_wait, - (!list_empty(&prtd->out_queue) || - prtd->state == VOIP_STOPPED), - 1 * HZ); - - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - if (ret > 0) { - - if (fbytes <= VOIP_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - buf_node = list_first_entry(&prtd->out_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - if (prtd->mode == MODE_PCM) { - ret = copy_to_user(buf, - &buf_node->frame.voc_pkt, - buf_node->frame.pktlen); - } else { - size = sizeof(buf_node->frame.frm_hdr) + - sizeof(buf_node->frame.pktlen) + - buf_node->frame.pktlen; - - ret = copy_to_user(buf, - &buf_node->frame, - size); - } - if (ret) { - pr_err("%s: Copy to user returned %d\n", - __func__, ret); - ret = -EFAULT; - } - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - list_add_tail(&buf_node->list, - &prtd->free_out_queue); - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - } else { - pr_err("%s: Read fbytes %lu > VOIP_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - - - } else if (ret == 0) { - pr_err_ratelimited("%s: No UL data available\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: Read was interrupted\n", __func__); - ret = -ERESTARTSYS; - } - return ret; -} -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_copy(substream, a, hwoff, buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, a, hwoff, buf, fbytes); - - return ret; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct voip_buf_node *buf_node = NULL; - struct snd_dma_buffer *p_dma_buf, *c_dma_buf; - struct snd_pcm_substream *p_substream, *c_substream; - struct snd_pcm_runtime *runtime; - struct voip_drv_info *prtd; - unsigned long dsp_flags; - - if (substream == NULL) { - pr_err("substream is NULL\n"); - return -EINVAL; - } - runtime = substream->runtime; - prtd = runtime->private_data; - - wake_up(&prtd->out_wait); - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->playback_prepare = 0; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_prepare = 0; - - if (!prtd->playback_prepare && !prtd->capture_prepare) { - if (prtd->state == VOIP_STARTED) { - prtd->voip_reset = false; - prtd->state = VOIP_STOPPED; - voc_end_voice_call( - voc_get_session_id(VOIP_SESSION_NAME)); - voc_register_mvs_cb(NULL, NULL, NULL, prtd); - } - /* release all buffer */ - /* release in_queue and free_in_queue */ - pr_debug("release all buffer\n"); - p_substream = prtd->playback_substream; - if (p_substream == NULL) { - pr_debug("p_substream is NULL\n"); - goto capt; - } - p_dma_buf = &p_substream->dma_buffer; - if (p_dma_buf == NULL) { - pr_debug("p_dma_buf is NULL\n"); - goto capt; - } - if (p_dma_buf->area != NULL) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_for_each_safe(ptr, next, &prtd->in_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - list_for_each_safe(ptr, next, &prtd->free_in_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - dma_free_coherent(p_substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, p_dma_buf->area, - p_dma_buf->addr); - p_dma_buf->area = NULL; - } - /* release out_queue and free_out_queue */ -capt: c_substream = prtd->capture_substream; - if (c_substream == NULL) { - pr_debug("c_substream is NULL\n"); - goto done; - } - c_dma_buf = &c_substream->dma_buffer; - if (c_substream == NULL) { - pr_debug("c_dma_buf is NULL.\n"); - goto done; - } - if (c_dma_buf->area != NULL) { - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - list_for_each_safe(ptr, next, &prtd->out_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - list_for_each_safe(ptr, next, &prtd->free_out_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - dma_free_coherent(c_substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, c_dma_buf->area, - c_dma_buf->addr); - c_dma_buf->area = NULL; - } -done: - prtd->capture_substream = NULL; - prtd->playback_substream = NULL; - } - mutex_unlock(&prtd->lock); - - return ret; -} - -static int voip_config_vocoder(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - uint32_t media_type = 0; - uint32_t rate_type = 0; - uint32_t evrc_min_rate_type = 0; - uint32_t evrc_max_rate_type = 0; - - pr_debug("%s(): mode=%d, playback rate=%d, capture rate=%d\n", - __func__, prtd->mode, prtd->play_samp_rate, - prtd->cap_samp_rate); - - if ((runtime->format != FORMAT_S16_LE && - runtime->format != FORMAT_SPECIAL) && - ((prtd->mode == MODE_AMR) || (prtd->mode == MODE_AMR_WB) || - (prtd->mode == MODE_IS127) || (prtd->mode == MODE_4GV_NB) || - (prtd->mode == MODE_4GV_WB) || (prtd->mode == MODE_4GV_NW) || - (prtd->mode == MODE_G711) || (prtd->mode == MODE_G711A))) { - pr_err("%s(): mode:%d and format:%u are not matched\n", - __func__, prtd->mode, (uint32_t)runtime->format); - - ret = -EINVAL; - goto done; - } - - if (runtime->format != FORMAT_S16_LE && (prtd->mode == MODE_PCM)) { - pr_err("%s(): mode:%d and format:%u are not matched\n", - __func__, prtd->mode, runtime->format); - - ret = -EINVAL; - goto done; - } - - if ((prtd->mode == MODE_PCM) || - (prtd->mode == MODE_AMR) || - (prtd->mode == MODE_AMR_WB) || - (prtd->mode == MODE_G711) || - (prtd->mode == MODE_G711A)) { - ret = voip_get_rate_type(prtd->mode, - prtd->rate, - &rate_type); - if (ret < 0) { - pr_err("%s(): fail at getting rate_type, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - prtd->rate_type = rate_type; - pr_debug("rate_type=%d\n", rate_type); - - } else if ((prtd->mode == MODE_IS127) || - (prtd->mode == MODE_4GV_NB) || - (prtd->mode == MODE_4GV_WB) || - (prtd->mode == MODE_4GV_NW)) { - ret = voip_get_rate_type(prtd->mode, - prtd->evrc_min_rate, - &evrc_min_rate_type); - if (ret < 0) { - pr_err("%s(): fail at getting min rate, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - if (evrc_min_rate_type == VOC_0_RATE) - evrc_min_rate_type = VOC_8_RATE; - - ret = voip_get_rate_type(prtd->mode, - prtd->evrc_max_rate, - &evrc_max_rate_type); - if (ret < 0) { - pr_err("%s(): fail at getting max rate, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - if (evrc_max_rate_type == VOC_0_RATE) - evrc_max_rate_type = VOC_1_RATE; - - if (evrc_max_rate_type < evrc_min_rate_type) { - pr_err("%s(): Invalid EVRC min max rates: %d, %d\n", - __func__, evrc_min_rate_type, - evrc_max_rate_type); - - ret = -EINVAL; - goto done; - } - pr_debug("%s(): min rate=%d, max rate=%d\n", - __func__, evrc_min_rate_type, evrc_max_rate_type); - } - ret = voip_get_media_type(prtd->mode, - prtd->rate_type, - prtd->play_samp_rate, - &media_type); - if (ret < 0) { - pr_err("%s(): fail at getting media_type, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - pr_debug("%s(): media_type=%d\n", __func__, media_type); - - if ((prtd->play_samp_rate == 8000 && prtd->cap_samp_rate == 8000) || - (prtd->play_samp_rate == 16000 && prtd->cap_samp_rate == 16000) || - (prtd->play_samp_rate == 32000 && prtd->cap_samp_rate == 32000) || - (prtd->play_samp_rate == 48000 && prtd->cap_samp_rate == 48000)) { - voc_config_vocoder(media_type, rate_type, - VSS_NETWORK_ID_VOIP, - voip_info.dtx_mode, - evrc_min_rate_type, - evrc_max_rate_type); - } else { - pr_debug("%s: Invalid rate playback %d, capture %d\n", - __func__, prtd->play_samp_rate, - prtd->cap_samp_rate); - - ret = -EINVAL; - } -done: - - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - - if (prtd->playback_prepare && prtd->capture_prepare - && (prtd->state != VOIP_STARTED)) { - ret = voip_config_vocoder(substream); - if (ret < 0) { - pr_err("%s(): fail at configuring vocoder for voip, ret=%d\n", - __func__, ret); - - goto done; - } - - /* Initialaizing cb variables */ - voc_register_mvs_cb(voip_process_ul_pkt, - voip_process_dl_pkt, - voip_ssr_cb_fn, prtd); - - ret = voc_start_voice_call( - voc_get_session_id(VOIP_SESSION_NAME)); - - if (ret < 0) { - pr_err("%s: voc_start_voice_call() failed err %d", - __func__, ret); - - goto done; - } - prtd->state = VOIP_STARTED; - } -done: - mutex_unlock(&prtd->lock); - - return ret; -} - -static snd_pcm_uframes_t -msm_pcm_playback_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - if (prtd->pcm_playback_irq_pos >= prtd->pcm_size) - prtd->pcm_playback_irq_pos = 0; - return bytes_to_frames(runtime, (prtd->pcm_playback_irq_pos)); -} - -static snd_pcm_uframes_t -msm_pcm_capture_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - if (prtd->pcm_capture_irq_pos >= prtd->pcm_capture_size) - prtd->pcm_capture_irq_pos = 0; - return bytes_to_frames(runtime, (prtd->pcm_capture_irq_pos)); -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - snd_pcm_uframes_t ret = 0; - - pr_debug("%s\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_pointer(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_pointer(substream); - return ret; -} - -static int msm_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - - pr_debug("%s\n", __func__); - dma_mmap_coherent(substream->pcm->card->dev, vma, - runtime->dma_area, - runtime->dma_addr, - runtime->dma_bytes); - return 0; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct voip_buf_node *buf_node = NULL; - int i = 0, offset = 0; - - pr_debug("%s: voip\n", __func__); - - mutex_lock(&voip_info.lock); - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - - dma_buf->area = dma_alloc_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - &dma_buf->addr, GFP_KERNEL); - if (!dma_buf->area) { - pr_err("%s:MSM VOIP dma_alloc failed\n", __func__); - mutex_unlock(&voip_info.lock); - return -ENOMEM; - } - - dma_buf->bytes = runtime->hw.buffer_bytes_max; - memset(dma_buf->area, 0, runtime->hw.buffer_bytes_max); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - for (i = 0; i < VOIP_MAX_Q_LEN; i++) { - buf_node = (void *)dma_buf->area + offset; - - list_add_tail(&buf_node->list, - &voip_info.free_in_queue); - offset = offset + sizeof(struct voip_buf_node); - } - } else { - for (i = 0; i < VOIP_MAX_Q_LEN; i++) { - buf_node = (void *) dma_buf->area + offset; - list_add_tail(&buf_node->list, - &voip_info.free_out_queue); - offset = offset + sizeof(struct voip_buf_node); - } - } - - mutex_unlock(&voip_info.lock); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - return 0; -} - -static int msm_voip_mode_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - ucontrol->value.integer.value[0] = voip_info.mode; - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int msm_voip_mode_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - voip_info.mode = ucontrol->value.integer.value[0]; - - pr_debug("%s: mode=%d\n", __func__, voip_info.mode); - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int msm_voip_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int rate = ucontrol->value.integer.value[0]; - - mutex_lock(&voip_info.lock); - - if (voip_info.rate != rate) { - voip_info.rate = rate; - pr_debug("%s: rate=%d\n", __func__, voip_info.rate); - - if (voip_info.state == VOIP_STARTED && - (voip_info.mode == MODE_AMR || - voip_info.mode == MODE_AMR_WB)) { - ret = voip_config_vocoder( - voip_info.capture_substream); - if (ret) { - pr_err("%s:Failed to configure vocoder, ret=%d\n", - __func__, ret); - - goto done; - } - - ret = voc_update_amr_vocoder_rate( - voc_get_session_id(VOIP_SESSION_NAME)); - if (ret) { - pr_err("%s:Failed to update AMR rate, ret=%d\n", - __func__, ret); - } - } - } - -done: - mutex_unlock(&voip_info.lock); - - return ret; -} - -static int msm_voip_evrc_min_max_rate_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - ucontrol->value.integer.value[0] = voip_info.evrc_min_rate; - ucontrol->value.integer.value[1] = voip_info.evrc_max_rate; - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int msm_voip_evrc_min_max_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - voip_info.evrc_min_rate = ucontrol->value.integer.value[0]; - voip_info.evrc_max_rate = ucontrol->value.integer.value[1]; - - pr_debug("%s(): evrc_min_rate=%d,evrc_max_rate=%d\n", __func__, - voip_info.evrc_min_rate, voip_info.evrc_max_rate); - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int voip_get_rate_type(uint32_t mode, uint32_t rate, - uint32_t *rate_type) -{ - int ret = 0; - - switch (mode) { - case MODE_AMR: { - switch (rate) { - case 4750: - *rate_type = AMR_RATE_4750; - break; - case 5150: - *rate_type = AMR_RATE_5150; - break; - case 5900: - *rate_type = AMR_RATE_5900; - break; - case 6700: - *rate_type = AMR_RATE_6700; - break; - case 7400: - *rate_type = AMR_RATE_7400; - break; - case 7950: - *rate_type = AMR_RATE_7950; - break; - case 10200: - *rate_type = AMR_RATE_10200; - break; - case 12200: - *rate_type = AMR_RATE_12200; - break; - default: - pr_err("wrong rate for AMR NB.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_AMR_WB: { - switch (rate) { - case 6600: - *rate_type = AMR_RATE_6600 - AMR_RATE_6600; - break; - case 8850: - *rate_type = AMR_RATE_8850 - AMR_RATE_6600; - break; - case 12650: - *rate_type = AMR_RATE_12650 - AMR_RATE_6600; - break; - case 14250: - *rate_type = AMR_RATE_14250 - AMR_RATE_6600; - break; - case 15850: - *rate_type = AMR_RATE_15850 - AMR_RATE_6600; - break; - case 18250: - *rate_type = AMR_RATE_18250 - AMR_RATE_6600; - break; - case 19850: - *rate_type = AMR_RATE_19850 - AMR_RATE_6600; - break; - case 23050: - *rate_type = AMR_RATE_23050 - AMR_RATE_6600; - break; - case 23850: - *rate_type = AMR_RATE_23850 - AMR_RATE_6600; - break; - default: - pr_err("wrong rate for AMR_WB.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_PCM: { - *rate_type = 0; - break; - } - case MODE_IS127: - case MODE_4GV_NB: - case MODE_4GV_WB: { - switch (rate) { - case VOC_0_RATE: - case VOC_8_RATE: - case VOC_4_RATE: - case VOC_2_RATE: - case VOC_1_RATE: - *rate_type = rate; - break; - default: - pr_err("wrong rate for IS127/4GV_NB/WB.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_4GV_NW: { - switch (rate) { - case VOC_0_RATE: - case VOC_8_RATE: - case VOC_4_RATE: - case VOC_2_RATE: - case VOC_1_RATE: - case VOC_8_RATE_NC: - *rate_type = rate; - break; - default: - pr_err("wrong rate for 4GV_NW.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_G711: - case MODE_G711A: - *rate_type = rate; - break; - default: - pr_err("wrong mode type.\n"); - ret = -EINVAL; - } - pr_debug("%s, mode=%d, rate=%u, rate_type=%d\n", - __func__, mode, rate, *rate_type); - return ret; -} - -static int voip_get_media_type(uint32_t mode, uint32_t rate_type, - unsigned int samp_rate, - unsigned int *media_type) -{ - int ret = 0; - - pr_debug("%s: mode=%d, samp_rate=%d\n", __func__, - mode, samp_rate); - switch (mode) { - case MODE_AMR: - *media_type = VSS_MEDIA_ID_AMR_NB_MODEM; - break; - case MODE_AMR_WB: - *media_type = VSS_MEDIA_ID_AMR_WB_MODEM; - break; - case MODE_PCM: - if (samp_rate == 8000) - *media_type = VSS_MEDIA_ID_PCM_8_KHZ; - else if (samp_rate == 16000) - *media_type = VSS_MEDIA_ID_PCM_16_KHZ; - else if (samp_rate == 32000) - *media_type = VSS_MEDIA_ID_PCM_32_KHZ; - else - *media_type = VSS_MEDIA_ID_PCM_48_KHZ; - break; - case MODE_IS127: /* EVRC-A */ - *media_type = VSS_MEDIA_ID_EVRC_MODEM; - break; - case MODE_4GV_NB: /* EVRC-B */ - *media_type = VSS_MEDIA_ID_4GV_NB_MODEM; - break; - case MODE_4GV_WB: /* EVRC-WB */ - *media_type = VSS_MEDIA_ID_4GV_WB_MODEM; - break; - case MODE_4GV_NW: /* EVRC-NW */ - *media_type = VSS_MEDIA_ID_4GV_NW_MODEM; - break; - case MODE_G711: - case MODE_G711A: - if (rate_type == MVS_G711A_MODE_MULAW) - *media_type = VSS_MEDIA_ID_G711_MULAW; - else - *media_type = VSS_MEDIA_ID_G711_ALAW; - break; - default: - pr_debug(" input mode is not supported\n"); - ret = -EINVAL; - } - - pr_debug("%s: media_type is 0x%x\n", __func__, *media_type); - - return ret; -} - - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .mmap = msm_pcm_mmap, -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - pr_debug("msm_asoc_pcm_new\n"); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_voip_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - - if (!is_voc_initialized()) { - pr_debug("%s: voice module not initialized yet, deferring probe()\n", - __func__); - - rc = -EPROBE_DEFER; - goto done; - } - - rc = voc_alloc_cal_shared_memory(); - if (rc == -EPROBE_DEFER) { - pr_debug("%s: memory allocation for calibration deferred %d\n", - __func__, rc); - - goto done; - } else if (rc < 0) { - pr_err("%s: memory allocation for calibration failed %d\n", - __func__, rc); - } - - rc = voc_alloc_voip_shared_memory(); - if (rc < 0) { - pr_err("%s: error allocating shared mem err %d\n", - __func__, rc); - } - - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - rc = snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); - -done: - return rc; -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_voip_dt_match[] = { - {.compatible = "qcom,msm-voip-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_voip_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-voip-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_voip_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_voip_init(void) -{ - memset(&voip_info, 0, sizeof(voip_info)); - voip_info.mode = MODE_PCM; - mutex_init(&voip_info.lock); - - spin_lock_init(&voip_info.dsp_lock); - spin_lock_init(&voip_info.dsp_ul_lock); - - init_waitqueue_head(&voip_info.out_wait); - init_waitqueue_head(&voip_info.in_wait); - - INIT_LIST_HEAD(&voip_info.in_queue); - INIT_LIST_HEAD(&voip_info.free_in_queue); - INIT_LIST_HEAD(&voip_info.out_queue); - INIT_LIST_HEAD(&voip_info.free_out_queue); - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_voip_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/msm-qti-pp-config.c b/techpack/audio/4.0/asoc/msm-qti-pp-config.c deleted file mode 100644 index 5e9f628af5aa..000000000000 --- a/techpack/audio/4.0/asoc/msm-qti-pp-config.c +++ /dev/null @@ -1,1717 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-qti-pp-config.h" -#include "msm-pcm-routing-v2.h" - -/* EQUALIZER */ -/* Equal to Frontend after last of the MULTIMEDIA SESSIONS */ -#define MAX_EQ_SESSIONS (MSM_FRONTEND_DAI_MAX + 1) -#define CHMIX_CFG_CONST_PARAM_SIZE 4 - -enum { - EQ_BAND1 = 0, - EQ_BAND2, - EQ_BAND3, - EQ_BAND4, - EQ_BAND5, - EQ_BAND6, - EQ_BAND7, - EQ_BAND8, - EQ_BAND9, - EQ_BAND10, - EQ_BAND11, - EQ_BAND12, - EQ_BAND_MAX, -}; - -/* Audio Sphere data structures */ -struct msm_audio_pp_asphere_state_s { - uint32_t enabled; - uint32_t strength; - uint32_t mode; - uint32_t version; - int port_id[AFE_MAX_PORTS]; - int copp_idx[AFE_MAX_PORTS]; - bool initialized; - uint32_t enabled_prev; - uint32_t strength_prev; -}; - -static struct msm_audio_pp_asphere_state_s asphere_state; - -struct msm_audio_eq_stream_config eq_data[MAX_EQ_SESSIONS]; - -static int msm_route_hfp_vol_control; -static const DECLARE_TLV_DB_LINEAR(hfp_rx_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_route_icc_vol_control; -static const DECLARE_TLV_DB_LINEAR(icc_rx_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_route_pri_auxpcm_lb_vol_ctrl; -static const DECLARE_TLV_DB_LINEAR(pri_auxpcm_lb_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_route_sec_auxpcm_lb_vol_ctrl; -static const DECLARE_TLV_DB_LINEAR(sec_auxpcm_lb_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_multichannel_ec_primary_mic_ch; -static int msm_ffecns_effect; - -static void msm_qti_pp_send_eq_values_(int eq_idx) -{ - int result; - struct msm_pcm_routing_fdai_data fe_dai; - struct audio_client *ac = NULL; - - msm_pcm_routing_get_fedai_info(eq_idx, SESSION_TYPE_RX, &fe_dai); - ac = q6asm_get_audio_client(fe_dai.strm_id); - - if (ac == NULL) { - pr_err("%s: Could not get audio client for session: %d\n", - __func__, fe_dai.strm_id); - goto done; - } - - result = q6asm_equalizer(ac, &eq_data[eq_idx]); - - if (result < 0) - pr_err("%s: Call to ASM equalizer failed, returned = %d\n", - __func__, result); -done: - return; -} - -static int msm_qti_pp_get_eq_enable_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - - ucontrol->value.integer.value[0] = eq_data[eq_idx].enable; - - pr_debug("%s: EQ #%d enable %d\n", __func__, - eq_idx, eq_data[eq_idx].enable); - return 0; -} - -static int msm_qti_pp_put_eq_enable_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int value = ucontrol->value.integer.value[0]; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - pr_debug("%s: EQ #%d enable %d\n", __func__, - eq_idx, value); - eq_data[eq_idx].enable = value; - msm_pcm_routing_acquire_lock(); - msm_qti_pp_send_eq_values_(eq_idx); - msm_pcm_routing_release_lock(); - return 0; -} - -static int msm_qti_pp_get_eq_band_count_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands; - - pr_debug("%s: EQ #%d bands %d\n", __func__, - eq_idx, eq_data[eq_idx].num_bands); - return eq_data[eq_idx].num_bands; -} - -static int msm_qti_pp_put_eq_band_count_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int value = ucontrol->value.integer.value[0]; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - - pr_debug("%s: EQ #%d bands %d\n", __func__, - eq_idx, value); - eq_data[eq_idx].num_bands = value; - return 0; -} - -static int msm_qti_pp_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS) || - (band_idx < EQ_BAND1) || (band_idx >= EQ_BAND_MAX)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - eq_data[eq_idx].eq_bands[band_idx].band_idx; - ucontrol->value.integer.value[1] = - eq_data[eq_idx].eq_bands[band_idx].filter_type; - ucontrol->value.integer.value[2] = - eq_data[eq_idx].eq_bands[band_idx].center_freq_hz; - ucontrol->value.integer.value[3] = - eq_data[eq_idx].eq_bands[band_idx].filter_gain; - ucontrol->value.integer.value[4] = - eq_data[eq_idx].eq_bands[band_idx].q_factor; - - pr_debug("%s: band_idx = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].band_idx); - pr_debug("%s: filter_type = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].filter_type); - pr_debug("%s: center_freq_hz = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].center_freq_hz); - pr_debug("%s: filter_gain = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].filter_gain); - pr_debug("%s: q_factor = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].q_factor); - return 0; -} - -static int msm_qti_pp_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS) || - (band_idx < EQ_BAND1) || (band_idx >= EQ_BAND_MAX)) - return -EINVAL; - - eq_data[eq_idx].eq_bands[band_idx].band_idx = - ucontrol->value.integer.value[0]; - eq_data[eq_idx].eq_bands[band_idx].filter_type = - ucontrol->value.integer.value[1]; - eq_data[eq_idx].eq_bands[band_idx].center_freq_hz = - ucontrol->value.integer.value[2]; - eq_data[eq_idx].eq_bands[band_idx].filter_gain = - ucontrol->value.integer.value[3]; - eq_data[eq_idx].eq_bands[band_idx].q_factor = - ucontrol->value.integer.value[4]; - return 0; -} - -#ifdef CONFIG_QTI_PP -void msm_qti_pp_send_eq_values(int fedai_id) -{ - if (eq_data[fedai_id].enable) - msm_qti_pp_send_eq_values_(fedai_id); -} - -/* CUSTOM MIXING */ -int msm_qti_pp_send_stereo_to_custom_stereo_cmd(int port_id, int copp_idx, - unsigned int session_id, - uint16_t op_FL_ip_FL_weight, - uint16_t op_FL_ip_FR_weight, - uint16_t op_FR_ip_FL_weight, - uint16_t op_FR_ip_FR_weight) -{ - char *params_value; - int *update_params_value32, rc = 0; - int16_t *update_params_value16 = 0; - uint32_t params_length = CUSTOM_STEREO_PAYLOAD_SIZE * sizeof(uint32_t); - uint32_t avail_length = params_length; - - pr_debug("%s: port_id - %d, session id - %d\n", __func__, port_id, - session_id); - params_value = kzalloc(params_length, GFP_KERNEL); - if (!params_value) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - update_params_value32 = (int *)params_value; - if (avail_length < 2 * sizeof(uint32_t)) - goto skip_send_cmd; - - /* - * This module is internal to ADSP and cannot be configured with - * an instance id - */ - *update_params_value32++ = MTMX_MODULE_ID_DEFAULT_CHMIXER; - *update_params_value32++ = DEFAULT_CHMIXER_PARAM_ID_COEFF; - avail_length = avail_length - (2 * sizeof(uint32_t)); - - update_params_value16 = (int16_t *)update_params_value32; - if (avail_length < 10 * sizeof(uint16_t)) - goto skip_send_cmd; - *update_params_value16++ = CUSTOM_STEREO_CMD_PARAM_SIZE; - /*for alignment only*/ - *update_params_value16++ = 0; - /*index is 32-bit param in little endian*/ - *update_params_value16++ = CUSTOM_STEREO_INDEX_PARAM; - *update_params_value16++ = 0; - /*for stereo mixing num out ch*/ - *update_params_value16++ = CUSTOM_STEREO_NUM_OUT_CH; - /*for stereo mixing num in ch*/ - *update_params_value16++ = CUSTOM_STEREO_NUM_IN_CH; - - /* Out ch map FL/FR*/ - *update_params_value16++ = PCM_CHANNEL_FL; - *update_params_value16++ = PCM_CHANNEL_FR; - - /* In ch map FL/FR*/ - *update_params_value16++ = PCM_CHANNEL_FL; - *update_params_value16++ = PCM_CHANNEL_FR; - avail_length = avail_length - (10 * sizeof(uint16_t)); - /* weighting coefficients as name suggests, - * mixing will be done according to these coefficients - */ - if (avail_length < 4 * sizeof(uint16_t)) - goto skip_send_cmd; - *update_params_value16++ = op_FL_ip_FL_weight; - *update_params_value16++ = op_FL_ip_FR_weight; - *update_params_value16++ = op_FR_ip_FL_weight; - *update_params_value16++ = op_FR_ip_FR_weight; - avail_length = avail_length - (4 * sizeof(uint16_t)); - if (params_length) { - rc = adm_set_stereo_to_custom_stereo(port_id, - copp_idx, - session_id, - params_value, - params_length); - if (rc) { - pr_err("%s: send params failed rc=%d\n", __func__, rc); - kfree(params_value); - return -EINVAL; - } - } - kfree(params_value); - return 0; -skip_send_cmd: - pr_err("%s: insufficient memory, send cmd failed\n", - __func__); - kfree(params_value); - return -ENOMEM; -} - -static int msm_qti_pp_arrange_mch_map(int16_t *update_params_value16, - int channel_count) -{ - int i; - int16_t ch_map[PCM_FORMAT_MAX_CHANNELS_9] = { - PCM_CHANNEL_FL, PCM_CHANNEL_FR, PCM_CHANNEL_FC, - PCM_CHANNEL_LS, PCM_CHANNEL_RS, PCM_CHANNEL_LFE, - PCM_CHANNEL_LB, PCM_CHANNEL_RB, PCM_CHANNEL_CS }; - - if (channel_count < 1 || - channel_count > PCM_FORMAT_MAX_CHANNELS_9) { - pr_err("%s: invalid ch_cnt %d\n", - __func__, channel_count); - return -EINVAL; - } - - switch (channel_count) { - /* Add special cases here */ - case 1: - *update_params_value16++ = PCM_CHANNEL_FC; - break; - case 4: - *update_params_value16++ = PCM_CHANNEL_FL; - *update_params_value16++ = PCM_CHANNEL_FR; - *update_params_value16++ = PCM_CHANNEL_LS; - *update_params_value16++ = PCM_CHANNEL_RS; - break; - - /* Add standard cases here */ - default: - for (i = 0; i < channel_count; i++) - *update_params_value16++ = ch_map[i]; - break; - } - - return 0; -} - -static uint32_t msm_qti_pp_get_chmix_param_size(int ip_ch_cnt, int op_ch_cnt) -{ - uint32_t param_size; - /* Assign constant part of param length initially - - * Index, Num out channels, Num in channels. - */ - param_size = CHMIX_CFG_CONST_PARAM_SIZE * sizeof(uint16_t); - - /* Calculate variable part of param length using ip and op channels */ - - /* channel map for input and output channels */ - param_size += op_ch_cnt * sizeof(uint16_t); - param_size += ip_ch_cnt * sizeof(uint16_t); - - /* weightage coeff for each op ch corresponding to each ip ch */ - param_size += (ip_ch_cnt * op_ch_cnt) * sizeof(uint16_t); - - /* Params length should be multiple of 4 bytes i.e 32bit aligned*/ - param_size = (param_size + 3) & 0xFFFFFFFC; - - return param_size; -} - -/* - * msm_qti_pp_send_chmix_cfg_cmd: - * Send the custom channel mixer configuration command. - * - * @port_id: Backend port id - * @copp_idx: ADM copp index - * @session_id: id for the session requesting channel mixer - * @ip_channel_cnt: Input channel count - * @op_channel_cnt: Output channel count - * @ch_wght_coeff: Channel weight co-efficients for mixing - * @session_type: Indicates TX or RX session - * @stream_type: Indicates Audio or Listen stream type - */ -int msm_qti_pp_send_chmix_cfg_cmd(int port_id, int copp_idx, - unsigned int session_id, int ip_channel_cnt, - int op_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type) -{ - char *params_value; - int rc = 0, i, direction; - u8 *param_ptr; - int16_t *update_params_value16 = 0; - uint32_t param_size = msm_qti_pp_get_chmix_param_size(ip_channel_cnt, - op_channel_cnt); - struct param_hdr_v3 *param_hdr; - - /* constant payload data size represents module_id, param_id, - * param size, reserved field. - */ - uint32_t params_length = param_size + sizeof(*param_hdr); - - pr_debug("%s: port_id - %d, session id - %d\n", __func__, port_id, - session_id); - - params_value = kzalloc(params_length, GFP_KERNEL); - if (!params_value) - return -ENOMEM; - - param_ptr = params_value; - - param_hdr = (struct param_hdr_v3 *) param_ptr; - param_hdr->module_id = MTMX_MODULE_ID_DEFAULT_CHMIXER; - param_hdr->instance_id = INSTANCE_ID_0; - param_hdr->param_id = DEFAULT_CHMIXER_PARAM_ID_COEFF; - param_hdr->param_size = param_size; - - param_ptr += sizeof(*param_hdr); - - update_params_value16 = (int16_t *) param_ptr; - /*for alignment only*/ - *update_params_value16++ = 0; - /*index is 32-bit param in little endian*/ - *update_params_value16++ = CUSTOM_STEREO_INDEX_PARAM; - *update_params_value16++ = 0; - /*number of out ch*/ - *update_params_value16++ = op_channel_cnt; - /*number of in ch*/ - *update_params_value16++ = ip_channel_cnt; - - /* Out ch map FL/FR*/ - msm_qti_pp_arrange_mch_map(update_params_value16, op_channel_cnt); - update_params_value16 += op_channel_cnt; - - /* In ch map FL/FR*/ - msm_qti_pp_arrange_mch_map(update_params_value16, ip_channel_cnt); - update_params_value16 += ip_channel_cnt; - - /* weighting coefficients as name suggests, - * mixing will be done according to these coefficients. - */ - for (i = 0; i < ip_channel_cnt * op_channel_cnt; i++) - *update_params_value16++ = - ch_wght_coeff[i] ? Q14_GAIN_UNITY : 0; - if (params_length) { - direction = (session_type == SESSION_TYPE_RX) ? - ADM_MATRIX_ID_AUDIO_RX : ADM_MATRIX_ID_AUDIO_TX; - rc = adm_set_custom_chmix_cfg(port_id, - copp_idx, - session_id, - params_value, - params_length, - direction, - stream_type); - if (rc) { - pr_err("%s: send params failed rc=%d\n", __func__, rc); - kfree(params_value); - return -EINVAL; - } - } - kfree(params_value); - return 0; -} -EXPORT_SYMBOL(msm_qti_pp_send_chmix_cfg_cmd); -#endif /* CONFIG_QTI_PP */ - -/* RMS */ -static int msm_qti_pp_get_rms_value_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int be_idx = 0, copp_idx; - char *param_value; - int *update_param_value; - uint32_t param_size = (RMS_PAYLOAD_LEN + 1) * sizeof(uint32_t); - struct msm_pcm_routing_bdai_data msm_bedai; - struct param_hdr_v3 param_hdr; - - param_value = kzalloc(param_size, GFP_KERNEL); - if (!param_value) - return -ENOMEM; - msm_pcm_routing_acquire_lock(); - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - msm_pcm_routing_get_bedai_info(be_idx, &msm_bedai); - if (msm_bedai.port_id == SLIMBUS_0_TX) - break; - } - if ((be_idx >= MSM_BACKEND_DAI_MAX) || !msm_bedai.active) { - pr_err("%s, back not active to query rms be_idx:%d\n", - __func__, be_idx); - rc = -EINVAL; - goto get_rms_value_err; - } - copp_idx = adm_get_default_copp_idx(SLIMBUS_0_TX); - if ((copp_idx < 0) || (copp_idx > MAX_COPPS_PER_PORT)) { - pr_err("%s, no active copp to query rms copp_idx:%d\n", - __func__, copp_idx); - rc = -EINVAL; - goto get_rms_value_err; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = RMS_MODULEID_APPI_PASSTHRU; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = RMS_PARAM_FIRST_SAMPLE; - param_hdr.param_size = param_size; - rc = adm_get_pp_params(SLIMBUS_0_TX, copp_idx, ADM_CLIENT_ID_DEFAULT, - NULL, ¶m_hdr, param_value); - if (rc) { - pr_err("%s: get parameters failed rc=%d\n", __func__, rc); - rc = -EINVAL; - goto get_rms_value_err; - } - update_param_value = (int *)param_value; - ucontrol->value.integer.value[0] = update_param_value[0]; - - pr_debug("%s: FROM DSP value[0] 0x%x\n", - __func__, update_param_value[0]); -get_rms_value_err: - msm_pcm_routing_release_lock(); - kfree(param_value); - return rc; -} - -static int msm_qti_pp_put_rms_value_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* not used */ - return 0; -} - -/* VOLUME */ -static int msm_route_fm_vol_control; -static int msm_afe_lb_vol_ctrl; -static int msm_afe_sec_mi2s_lb_vol_ctrl; -static int msm_afe_tert_mi2s_lb_vol_ctrl; -static int msm_afe_quat_mi2s_lb_vol_ctrl; -static int msm_afe_slimbus_7_lb_vol_ctrl; -static int msm_afe_slimbus_8_lb_vol_ctrl; -static int msm_asm_bit_width; -static const DECLARE_TLV_DB_LINEAR(fm_rx_vol_gain, 0, INT_RX_VOL_MAX_STEPS); -static const DECLARE_TLV_DB_LINEAR(afe_lb_vol_gain, 0, INT_RX_VOL_MAX_STEPS); - -static int msm_qti_pp_get_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_fm_vol_control; - return 0; -} - -static int msm_qti_pp_set_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(INT_FM_TX, ucontrol->value.integer.value[0]); - - msm_route_fm_vol_control = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_asm_bit_width_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s get ASM bitwidth = %d\n", - __func__, msm_asm_bit_width); - - ucontrol->value.integer.value[0] = msm_asm_bit_width; - - return 0; -} - -static int msm_asm_bit_width_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 16: - msm_asm_bit_width = 16; - break; - case 24: - msm_asm_bit_width = 24; - break; - case 32: - msm_asm_bit_width = 32; - break; - default: - msm_asm_bit_width = 0; - break; - } - - return 0; -} - -static int msm_qti_pp_get_pri_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_pri_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_PRIMARY_MI2S_TX, - ucontrol->value.integer.value[0]); - - msm_afe_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_sec_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_sec_mi2s_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_sec_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_SECONDARY_MI2S_TX, - ucontrol->value.integer.value[0]); - msm_afe_sec_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_tert_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_tert_mi2s_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_tert_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_TERTIARY_MI2S_TX, - ucontrol->value.integer.value[0]); - msm_afe_tert_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0]; - return 0; -} - -static int msm_qti_pp_get_slimbus_7_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_slimbus_7_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_slimbus_7_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = afe_loopback_gain(SLIMBUS_7_TX, - ucontrol->value.integer.value[0]); - - if (ret) - pr_err("%s: failed to set LB vol for SLIMBUS_7_TX, err %d\n", - __func__, ret); - else - msm_afe_slimbus_7_lb_vol_ctrl = - ucontrol->value.integer.value[0]; - - return ret; -} - -static int msm_qti_pp_get_slimbus_8_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_slimbus_8_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_slimbus_8_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - - ret = afe_loopback_gain(SLIMBUS_8_TX, - ucontrol->value.integer.value[0]); - - if (ret) - pr_err("%s: failed to set LB vol for SLIMBUS_8_TX", __func__); - else - msm_afe_slimbus_8_lb_vol_ctrl = - ucontrol->value.integer.value[0]; - - return ret; -} - -static int msm_qti_pp_get_icc_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_icc_vol_control; - return 0; -} - -static int msm_qti_pp_set_icc_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - adm_set_mic_gain(AFE_PORT_ID_QUATERNARY_TDM_TX, - adm_get_default_copp_idx(AFE_PORT_ID_QUATERNARY_TDM_TX), - ucontrol->value.integer.value[0]); - msm_route_icc_vol_control = ucontrol->value.integer.value[0]; - return 0; -} - -static int msm_qti_pp_get_quat_mi2s_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_quat_mi2s_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_quat_mi2s_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_QUATERNARY_MI2S_TX, - ucontrol->value.integer.value[0]); - - msm_afe_quat_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_hfp_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_hfp_vol_control; - return 0; -} - -static int msm_qti_pp_set_hfp_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(INT_BT_SCO_TX, ucontrol->value.integer.value[0]); - - msm_route_hfp_vol_control = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_pri_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_pri_auxpcm_lb_vol_ctrl; - pr_debug("%s: Volume = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_qti_pp_set_pri_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - afe_loopback_gain(mc->reg, ucontrol->value.integer.value[0]); - - msm_route_pri_auxpcm_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_sec_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_sec_auxpcm_lb_vol_ctrl; - pr_debug("%s: Volume = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_qti_pp_set_sec_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - afe_loopback_gain(mc->reg, ucontrol->value.integer.value[0]); - - msm_route_sec_auxpcm_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_channel_map_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; - int i; - - adm_get_multi_ch_map(channel_map, ADM_PATH_PLAYBACK); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - (unsigned int) channel_map[i]; - return 0; -} - -static int msm_qti_pp_put_channel_map_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - int i; - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - channel_map[i] = (char)(ucontrol->value.integer.value[i]); - adm_set_multi_ch_map(channel_map, ADM_PATH_PLAYBACK); - - return 0; -} - -static int msm_qti_pp_get_channel_map_capture(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; - int i; - - adm_get_multi_ch_map(channel_map, ADM_PATH_LIVE_REC); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - (unsigned int) channel_map[i]; - return 0; -} - -static int msm_qti_pp_put_channel_map_capture(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - int i; - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - channel_map[i] = (char)(ucontrol->value.integer.value[i]); - adm_set_multi_ch_map(channel_map, ADM_PATH_LIVE_REC); - - return 0; -} - -/* Audio Sphere functions */ - -static void msm_qti_pp_asphere_init_state(void) -{ - int i; - - if (asphere_state.initialized) - return; - asphere_state.initialized = true; - for (i = 0; i < AFE_MAX_PORTS; i++) { - asphere_state.port_id[i] = -1; - asphere_state.copp_idx[i] = -1; - } - asphere_state.enabled = 0; - asphere_state.strength = 0; - asphere_state.mode = 0; - asphere_state.version = 0; - asphere_state.enabled_prev = 0; - asphere_state.strength_prev = 0; -} - -static int msm_qti_pp_asphere_send_params(int port_id, int copp_idx, bool force) -{ - u8 *packed_params = NULL; - u32 packed_params_size = 0; - u32 param_size = 0; - struct param_hdr_v3 param_hdr; - bool set_enable = force || - (asphere_state.enabled != asphere_state.enabled_prev); - bool set_strength = asphere_state.enabled == 1 && (set_enable || - (asphere_state.strength != asphere_state.strength_prev)); - int param_count = 0; - int ret = 0; - - if (set_enable) - param_count++; - if (set_strength) - param_count++; - - if (param_count == 0) { - pr_debug("%s: Nothing to send, exiting\n", __func__); - return 0; - } - - pr_debug("%s: port_id %d, copp_id %d, forced %d, param_count %d\n", - __func__, port_id, copp_idx, force, param_count); - pr_debug("%s: enable prev:%u cur:%u, strength prev:%u cur:%u\n", - __func__, asphere_state.enabled_prev, asphere_state.enabled, - asphere_state.strength_prev, asphere_state.strength); - - packed_params_size = - param_count * (sizeof(struct param_hdr_v3) + sizeof(uint32_t)); - packed_params = kzalloc(packed_params_size, GFP_KERNEL); - if (!packed_params) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - packed_params_size = 0; - param_hdr.module_id = AUDPROC_MODULE_ID_AUDIOSPHERE; - param_hdr.instance_id = INSTANCE_ID_0; - if (set_strength) { - /* add strength command */ - param_hdr.param_id = AUDPROC_PARAM_ID_AUDIOSPHERE_STRENGTH; - param_hdr.param_size = sizeof(asphere_state.strength); - ret = q6common_pack_pp_params(packed_params + - packed_params_size, - ¶m_hdr, - (u8 *) &asphere_state.strength, - ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params for audio sphere" - " strength, error %d\n", __func__, ret); - goto done; - } - packed_params_size += param_size; - } - if (set_enable) { - /* add enable command */ - param_hdr.param_id = AUDPROC_PARAM_ID_AUDIOSPHERE_ENABLE; - param_hdr.param_size = sizeof(asphere_state.enabled); - q6common_pack_pp_params(packed_params + packed_params_size, - ¶m_hdr, - (u8 *) &asphere_state.enabled, - ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params for audio sphere" - " enable, error %d\n", __func__, ret); - goto done; - } - packed_params_size += param_size; - } - - pr_debug("%s: packed data size: %d\n", __func__, packed_params_size); - ret = adm_set_pp_params(port_id, copp_idx, NULL, packed_params, - packed_params_size); - if (ret) - pr_err("%s: set param failed with err=%d\n", __func__, ret); - -done: - kfree(packed_params); - return 0; -} - -#if defined(CONFIG_QTI_PP) && defined(CONFIG_QTI_PP_AUDIOSPHERE) -int msm_qti_pp_asphere_init(int port_id, int copp_idx) -{ - int index = adm_validate_and_get_port_index(port_id); - - pr_debug("%s, port_id %d, copp_id %d\n", __func__, port_id, copp_idx); - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index, - port_id); - return -EINVAL; - } - msm_qti_pp_asphere_init_state(); - - asphere_state.port_id[index] = port_id; - asphere_state.copp_idx[index] = copp_idx; - - if (asphere_state.enabled) - msm_qti_pp_asphere_send_params(port_id, copp_idx, true); - - return 0; -} - -void msm_qti_pp_asphere_deinit(int port_id) -{ - int index = adm_validate_and_get_port_index(port_id); - - pr_debug("%s, port_id %d\n", __func__, port_id); - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index, - port_id); - return; - } - - if (asphere_state.port_id[index] == port_id) { - asphere_state.port_id[index] = -1; - asphere_state.copp_idx[index] = -1; - } -} -#endif - -static int msm_qti_pp_asphere_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - if (!asphere_state.initialized) - return -EAGAIN; - ucontrol->value.integer.value[0] = asphere_state.enabled; - ucontrol->value.integer.value[1] = asphere_state.strength; - pr_debug("%s, enable %u, strength %u\n", __func__, - asphere_state.enabled, asphere_state.strength); - return 0; -} - -static int msm_qti_pp_asphere_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t enable = ucontrol->value.integer.value[0]; - int32_t strength = ucontrol->value.integer.value[1]; - int i; - - pr_debug("%s, enable %u, strength %u\n", __func__, enable, strength); - - msm_qti_pp_asphere_init_state(); - - if (enable == 0 || enable == 1) { - asphere_state.enabled_prev = asphere_state.enabled; - asphere_state.enabled = enable; - } - - if (strength >= 0 && strength <= 1000) { - asphere_state.strength_prev = asphere_state.strength; - asphere_state.strength = strength; - } - - if (asphere_state.strength != asphere_state.strength_prev || - asphere_state.enabled != asphere_state.enabled_prev) { - for (i = 0; i < AFE_MAX_PORTS; i++) { - if (asphere_state.port_id[i] >= 0) - msm_qti_pp_asphere_send_params( - asphere_state.port_id[i], - asphere_state.copp_idx[i], - false); - } - } - return 0; -} - -int msm_adsp_init_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_kcontrol *kctl; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -EINVAL; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, - rtd->pcm->device); - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - kfree(mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl.\n", __func__); - ret = -EINVAL; - goto done; - } - - if (kctl->private_data != NULL) { - pr_err("%s: kctl_prtd is not NULL at initialization.\n", - __func__); - return -EINVAL; - } - - kctl_prtd = kzalloc(sizeof(struct dsp_stream_callback_prtd), - GFP_KERNEL); - if (!kctl_prtd) { - ret = -ENOMEM; - goto done; - } - - spin_lock_init(&kctl_prtd->prtd_spin_lock); - INIT_LIST_HEAD(&kctl_prtd->event_queue); - kctl_prtd->event_count = 0; - kctl->private_data = kctl_prtd; - -done: - return ret; -} - -int msm_adsp_clean_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_kcontrol *kctl; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct dsp_stream_callback_list *node, *n; - unsigned long spin_flags; - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -EINVAL; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, - rtd->pcm->device); - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - kfree(mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl.\n", __func__); - ret = -EINVAL; - goto done; - } - - kctl_prtd = (struct dsp_stream_callback_prtd *) - kctl->private_data; - if (kctl_prtd != NULL) { - spin_lock_irqsave(&kctl_prtd->prtd_spin_lock, spin_flags); - /* clean the queue */ - list_for_each_entry_safe(node, n, - &kctl_prtd->event_queue, list) { - list_del(&node->list); - kctl_prtd->event_count--; - pr_debug("%s: %d remaining events after del.\n", - __func__, kctl_prtd->event_count); - kfree(node); - } - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - } - - kfree(kctl_prtd); - kctl->private_data = NULL; - -done: - return ret; -} - -int msm_adsp_inform_mixer_ctl(struct snd_soc_pcm_runtime *rtd, - uint32_t *payload) -{ - /* adsp pp event notifier */ - struct snd_kcontrol *kctl; - struct snd_ctl_elem_value control; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct dsp_stream_callback_list *new_event; - struct dsp_stream_callback_list *oldest_event; - unsigned long spin_flags; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - struct msm_adsp_event_data *event_data = NULL; - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - struct snd_ctl_elem_info kctl_info; - - if (!rtd || !payload) { - pr_err("%s: %s is NULL\n", __func__, - (!rtd) ? "rtd" : "payload"); - ret = -EINVAL; - goto done; - } - - if (rtd->card->snd_card == NULL) { - pr_err("%s: snd_card is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_ATOMIC); - if (!mixer_str) { - ret = -EINVAL; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, - rtd->pcm->device); - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - kfree(mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl.\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)payload; - if (event_data->payload_len < sizeof(struct msm_adsp_event_data)) { - pr_err("%s: event_data size of %x is less than expected.\n", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - kctl->info(kctl, &kctl_info); - - if (event_data->payload_len > - kctl_info.count - sizeof(struct msm_adsp_event_data)) { - pr_err("%s: payload length exceeds limit of %u bytes.\n", - __func__, kctl_info.count); - ret = -EINVAL; - goto done; - } - - kctl_prtd = (struct dsp_stream_callback_prtd *) - kctl->private_data; - if (kctl_prtd == NULL) { - /* queue is not initialized */ - ret = -EINVAL; - pr_err("%s: event queue is not initialized.\n", __func__); - goto done; - } - - new_event = kzalloc(sizeof(struct dsp_stream_callback_list) - + event_data->payload_len, - GFP_ATOMIC); - if (new_event == NULL) { - ret = -ENOMEM; - goto done; - } - memcpy((void *)&new_event->event, (void *)payload, - event_data->payload_len - + sizeof(struct msm_adsp_event_data)); - - spin_lock_irqsave(&kctl_prtd->prtd_spin_lock, spin_flags); - while (kctl_prtd->event_count >= DSP_STREAM_CALLBACK_QUEUE_SIZE) { - pr_info("%s: queue of size %d is full. delete oldest one.\n", - __func__, DSP_STREAM_CALLBACK_QUEUE_SIZE); - oldest_event = list_first_entry(&kctl_prtd->event_queue, - struct dsp_stream_callback_list, list); - pr_info("%s: event deleted: type %d length %d\n", - __func__, oldest_event->event.event_type, - oldest_event->event.payload_len); - list_del(&oldest_event->list); - kctl_prtd->event_count--; - kfree(oldest_event); - } - - list_add_tail(&new_event->list, &kctl_prtd->event_queue); - kctl_prtd->event_count++; - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - - control.id = kctl->id; - snd_ctl_notify(rtd->card->snd_card, - SNDRV_CTL_EVENT_MASK_INFO, - &control.id); - -done: - return ret; -} - -int msm_adsp_stream_cmd_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = - sizeof(((struct snd_ctl_elem_value *)0)->value.bytes.data); - - return 0; -} - -int msm_adsp_stream_callback_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t payload_size = 0; - struct dsp_stream_callback_list *oldest_event; - unsigned long spin_flags; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - int ret = 0; - - kctl_prtd = (struct dsp_stream_callback_prtd *) - kcontrol->private_data; - if (kctl_prtd == NULL) { - pr_debug("%s: ASM Stream PP event queue is not initialized.\n", - __func__); - ret = -EINVAL; - goto done; - } - - spin_lock_irqsave(&kctl_prtd->prtd_spin_lock, spin_flags); - pr_debug("%s: %d events in queue.\n", __func__, kctl_prtd->event_count); - if (list_empty(&kctl_prtd->event_queue)) { - pr_err("%s: ASM Stream PP event queue is empty.\n", __func__); - ret = -EINVAL; - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - goto done; - } - - oldest_event = list_first_entry(&kctl_prtd->event_queue, - struct dsp_stream_callback_list, list); - list_del(&oldest_event->list); - kctl_prtd->event_count--; - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - - payload_size = oldest_event->event.payload_len; - pr_debug("%s: event fetched: type %d length %d\n", - __func__, oldest_event->event.event_type, - oldest_event->event.payload_len); - memcpy(ucontrol->value.bytes.data, &oldest_event->event, - sizeof(struct msm_adsp_event_data) + payload_size); - kfree(oldest_event); - -done: - return ret; -} - -int msm_adsp_stream_callback_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = - sizeof(((struct snd_ctl_elem_value *)0)->value.bytes.data); - - return 0; -} - -static int msm_multichannel_ec_primary_mic_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int copp_idx = 0; - int port_id = AFE_PORT_ID_QUATERNARY_TDM_TX; - - msm_multichannel_ec_primary_mic_ch = ucontrol->value.integer.value[0]; - pr_debug("%s: msm_multichannel_ec_primary_mic_ch = %u\n", - __func__, msm_multichannel_ec_primary_mic_ch); - copp_idx = adm_get_default_copp_idx(port_id); - if ((copp_idx < 0) || (copp_idx > MAX_COPPS_PER_PORT)) { - pr_err("%s : no active copp to query multichannel ec copp_idx: %u\n", - __func__, copp_idx); - return -EINVAL; - } - adm_send_set_multichannel_ec_primary_mic_ch(port_id, copp_idx, - msm_multichannel_ec_primary_mic_ch); - - return ret; -} - -static int msm_multichannel_ec_primary_mic_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_multichannel_ec_primary_mic_ch; - pr_debug("%s: msm_multichannel_ec_primary_mic_ch = %lu\n", - __func__, ucontrol->value.integer.value[0]); - return 0; -} - -static const struct snd_kcontrol_new msm_multichannel_ec_controls[] = { - SOC_SINGLE_EXT("Multichannel EC Primary Mic Ch", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, msm_multichannel_ec_primary_mic_ch_get, - msm_multichannel_ec_primary_mic_ch_put), -}; - -static char const *ffecns_effect_text[] = {"NO_EFFECT", "EC_ONLY", "NS_ONLY", "ECNS"}; - -static int msm_ffecns_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - - if (ucontrol->value.integer.value[0] < 0 || - ucontrol->value.integer.value[0] >= ARRAY_SIZE(ffecns_effect_text)) { - pr_err("%s: invalid ffecns effect value %ld\n", - __func__, ucontrol->value.integer.value[0]); - return -EINVAL; - } - - msm_ffecns_effect = ucontrol->value.integer.value[0]; - - pr_debug("%s: set %s for ffecns\n", __func__, - ffecns_effect_text[msm_ffecns_effect]); - - ret = adm_set_ffecns_effect(msm_ffecns_effect); - if (ret) - pr_err("%s: failed to set %s for ffecns\n", - __func__, ffecns_effect_text[msm_ffecns_effect]); - - return ret; -} - -static int msm_ffecns_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_ffecns_effect; - pr_debug("%s: ffecns effect = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static SOC_ENUM_SINGLE_EXT_DECL(ffecns_effect_enum, ffecns_effect_text); - -static const struct snd_kcontrol_new ec_ffecns_controls[] = { - SOC_ENUM_EXT("FFECNS Effect", ffecns_effect_enum, - msm_ffecns_get, msm_ffecns_put), -}; - -static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_fm_vol_mixer, - msm_qti_pp_set_fm_vol_mixer, fm_rx_vol_gain), - SOC_SINGLE_EXT_TLV("Quat MI2S FM RX Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_quat_mi2s_fm_vol_mixer, - msm_qti_pp_set_quat_mi2s_fm_vol_mixer, fm_rx_vol_gain), -}; - -static const struct snd_kcontrol_new dsp_bit_width_controls[] = { - SOC_SINGLE_EXT(DSP_BIT_WIDTH_MIXER_CTL, SND_SOC_NOPM, 0, 0x20, - 0, msm_asm_bit_width_get, msm_asm_bit_width_put), -}; - -static const struct snd_kcontrol_new pri_mi2s_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("PRI MI2S LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_pri_mi2s_lb_vol_mixer, - msm_qti_pp_set_pri_mi2s_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new sec_mi2s_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SEC MI2S LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_sec_mi2s_lb_vol_mixer, - msm_qti_pp_set_sec_mi2s_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new tert_mi2s_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Tert MI2S LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_tert_mi2s_lb_vol_mixer, - msm_qti_pp_set_tert_mi2s_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new slimbus_7_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SLIMBUS_7 LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, - msm_qti_pp_get_slimbus_7_lb_vol_mixer, - msm_qti_pp_set_slimbus_7_lb_vol_mixer, - afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new slimbus_8_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SLIMBUS_8 LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_slimbus_8_lb_vol_mixer, - msm_qti_pp_set_slimbus_8_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new int_hfp_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Internal HFP RX Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_hfp_vol_mixer, - msm_qti_pp_set_hfp_vol_mixer, hfp_rx_vol_gain), -}; - -static const struct snd_kcontrol_new int_icc_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Internal ICC Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_icc_vol_mixer, - msm_qti_pp_set_icc_vol_mixer, icc_rx_vol_gain), -}; - -static const struct snd_kcontrol_new pri_auxpcm_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("PRI AUXPCM LOOPBACK Volume", - AFE_PORT_ID_PRIMARY_PCM_TX, 0, INT_RX_VOL_GAIN, 0, - msm_qti_pp_get_pri_auxpcm_lb_vol_mixer, - msm_qti_pp_set_pri_auxpcm_lb_vol_mixer, - pri_auxpcm_lb_vol_gain), -}; - -static const struct snd_kcontrol_new sec_auxpcm_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SEC AUXPCM LOOPBACK Volume", - AFE_PORT_ID_SECONDARY_PCM_TX, 0, INT_RX_VOL_GAIN, 0, - msm_qti_pp_get_sec_auxpcm_lb_vol_mixer, - msm_qti_pp_set_sec_auxpcm_lb_vol_mixer, - sec_auxpcm_lb_vol_gain), -}; - -static const struct snd_kcontrol_new multi_ch_channel_map_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("Playback Device Channel Map", SND_SOC_NOPM, - 0, PCM_MAX_CHMAP_ID, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, - msm_qti_pp_get_channel_map_mixer, - msm_qti_pp_put_channel_map_mixer), -}; - -static const struct snd_kcontrol_new multi_ch_channel_map_capture_controls[] = { - SOC_SINGLE_MULTI_EXT("Capture Device Channel Map", SND_SOC_NOPM, - 0, PCM_MAX_CHMAP_ID, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, - msm_qti_pp_get_channel_map_capture, - msm_qti_pp_put_channel_map_capture), -}; - - -static const struct snd_kcontrol_new get_rms_controls[] = { - SOC_SINGLE_EXT("Get RMS", SND_SOC_NOPM, 0, 0xFFFFFFFF, - 0, msm_qti_pp_get_rms_value_control, msm_qti_pp_put_rms_value_control), -}; - -static const struct snd_kcontrol_new eq_enable_mixer_controls[] = { - SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_qti_pp_get_eq_enable_mixer, - msm_qti_pp_put_eq_enable_mixer), - SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_qti_pp_get_eq_enable_mixer, - msm_qti_pp_put_eq_enable_mixer), - SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_qti_pp_get_eq_enable_mixer, - msm_qti_pp_put_eq_enable_mixer), -}; - -static const struct snd_kcontrol_new eq_band_mixer_controls[] = { - SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0, - msm_qti_pp_get_eq_band_count_audio_mixer, - msm_qti_pp_put_eq_band_count_audio_mixer), - SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0, - msm_qti_pp_get_eq_band_count_audio_mixer, - msm_qti_pp_put_eq_band_count_audio_mixer), - SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0, - msm_qti_pp_get_eq_band_count_audio_mixer, - msm_qti_pp_put_eq_band_count_audio_mixer), -}; - -static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), -}; - -static const struct snd_kcontrol_new asphere_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("MSM ASphere Set Param", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, 2, msm_qti_pp_asphere_get, msm_qti_pp_asphere_set), -}; - -#ifdef CONFIG_QTI_PP -void msm_qti_pp_add_controls(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, int_fm_vol_mixer_controls, - ARRAY_SIZE(int_fm_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, pri_mi2s_lb_vol_mixer_controls, - ARRAY_SIZE(pri_mi2s_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, sec_mi2s_lb_vol_mixer_controls, - ARRAY_SIZE(sec_mi2s_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, tert_mi2s_lb_vol_mixer_controls, - ARRAY_SIZE(tert_mi2s_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, slimbus_7_lb_vol_mixer_controls, - ARRAY_SIZE(slimbus_7_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, slimbus_8_lb_vol_mixer_controls, - ARRAY_SIZE(slimbus_8_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, int_hfp_vol_mixer_controls, - ARRAY_SIZE(int_hfp_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, int_icc_vol_mixer_controls, - ARRAY_SIZE(int_icc_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, - pri_auxpcm_lb_vol_mixer_controls, - ARRAY_SIZE(pri_auxpcm_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, - sec_auxpcm_lb_vol_mixer_controls, - ARRAY_SIZE(sec_auxpcm_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, - multi_ch_channel_map_mixer_controls, - ARRAY_SIZE(multi_ch_channel_map_mixer_controls)); - - snd_soc_add_platform_controls(platform, get_rms_controls, - ARRAY_SIZE(get_rms_controls)); - - snd_soc_add_platform_controls(platform, - multi_ch_channel_map_capture_controls, - ARRAY_SIZE(multi_ch_channel_map_capture_controls)); - - snd_soc_add_platform_controls(platform, eq_enable_mixer_controls, - ARRAY_SIZE(eq_enable_mixer_controls)); - - snd_soc_add_platform_controls(platform, eq_band_mixer_controls, - ARRAY_SIZE(eq_band_mixer_controls)); - - snd_soc_add_platform_controls(platform, eq_coeff_mixer_controls, - ARRAY_SIZE(eq_coeff_mixer_controls)); - - snd_soc_add_platform_controls(platform, asphere_mixer_controls, - ARRAY_SIZE(asphere_mixer_controls)); - - snd_soc_add_platform_controls(platform, msm_multichannel_ec_controls, - ARRAY_SIZE(msm_multichannel_ec_controls)); - - snd_soc_add_platform_controls(platform, dsp_bit_width_controls, - ARRAY_SIZE(dsp_bit_width_controls)); - - - snd_soc_add_platform_controls(platform, ec_ffecns_controls, - ARRAY_SIZE(ec_ffecns_controls)); -} -#endif /* CONFIG_QTI_PP */ diff --git a/techpack/audio/4.0/asoc/msm-qti-pp-config.h b/techpack/audio/4.0/asoc/msm-qti-pp-config.h deleted file mode 100644 index 01f0c8e215b3..000000000000 --- a/techpack/audio/4.0/asoc/msm-qti-pp-config.h +++ /dev/null @@ -1,94 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_QTI_PP_H_ -#define _MSM_QTI_PP_H_ - -#include -#define DSP_BIT_WIDTH_MIXER_CTL "ASM Bit Width" -#ifdef CONFIG_QTI_PP -int msm_adsp_inform_mixer_ctl(struct snd_soc_pcm_runtime *rtd, - uint32_t *payload); -int msm_adsp_init_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd); -int msm_adsp_clean_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd); -int msm_adsp_stream_cmd_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo); -int msm_adsp_stream_callback_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -int msm_adsp_stream_callback_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo); -void msm_qti_pp_send_eq_values(int fedai_id); -int msm_qti_pp_send_stereo_to_custom_stereo_cmd(int port_id, int copp_idx, - unsigned int session_id, - uint16_t op_FL_ip_FL_weight, - uint16_t op_FL_ip_FR_weight, - uint16_t op_FR_ip_FL_weight, - uint16_t op_FR_ip_FR_weight); -void msm_qti_pp_add_controls(struct snd_soc_platform *platform); -int msm_qti_pp_send_chmix_cfg_cmd(int port_id, int copp_idx, - unsigned int session_id, int ip_channel_count, - int out_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type); -#else /* CONFIG_QTI_PP */ -static inline int msm_adsp_inform_mixer_ctl(struct snd_soc_pcm_runtime *rtd, - uint32_t *payload) -{ - return 0; -} - -static inline int msm_adsp_init_mixer_ctl_pp_event_queue( - struct snd_soc_pcm_runtime *rtd) -{ - return 0; -} - -static inline int msm_adsp_clean_mixer_ctl_pp_event_queue( - struct snd_soc_pcm_runtime *rtd) -{ - return 0; -} - -static inline int msm_adsp_stream_cmd_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - return 0; -} - -static inline int msm_adsp_stream_callback_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static inline int msm_adsp_stream_callback_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - return 0; -} - -int msm_qti_pp_send_chmix_cfg_cmd(int port_id, int copp_idx, - unsigned int session_id, int ip_channel_count, - int out_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type) -{ - return 0; -} -#define msm_qti_pp_send_eq_values(fedai_id) do {} while (0) -#define msm_qti_pp_send_stereo_to_custom_stereo_cmd(port_id, copp_idx, \ - session_id, op_FL_ip_FL_weight, op_FL_ip_FR_weight, \ - op_FR_ip_FL_weight, op_FR_ip_FR_weight) (0) -#define msm_qti_pp_add_controls(platform) do {} while (0) -#endif /* CONFIG_QTI_PP */ - - -#if defined(CONFIG_QTI_PP) && defined(CONFIG_QTI_PP_AUDIOSPHERE) -int msm_qti_pp_asphere_init(int port_id, int copp_idx); -void msm_qti_pp_asphere_deinit(int port_id); -#else -#define msm_qti_pp_asphere_init(port_id, copp_idx) (0) -#define msm_qti_pp_asphere_deinit(port_id) do {} while (0) -#endif - -#endif /* _MSM_QTI_PP_H_ */ diff --git a/techpack/audio/4.0/asoc/msm-slim-dma.h b/techpack/audio/4.0/asoc/msm-slim-dma.h deleted file mode 100644 index 911ce1f4dba8..000000000000 --- a/techpack/audio/4.0/asoc/msm-slim-dma.h +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2014, 2017 The Linux Foundation. All rights reserved. - * - */ -#ifndef _MSM_SLIMBUS_DMA_H -#define _MSM_SLIMBUS_DMA_H - -#include - -/* - * struct msm_slim_dma_data - DMA data for slimbus data transfer - * - * @sdev: Handle to the slim_device instance associated with the - * data transfer. - * @ph: Port handle for the slimbus ports. - * @dai_channel_ctl: callback function into the CPU dai driver - * to setup the data path. - * - * This structure is used to share the slimbus port handles and - * other data path setup related handles with other drivers. - */ -struct msm_slim_dma_data { - - /* Handle to slimbus device */ - struct slim_device *sdev; - - /* Port Handle */ - u32 ph; - - /* Callback for data channel control */ - int (*dai_channel_ctl)(struct msm_slim_dma_data *dma_data, - struct snd_soc_dai *dai, bool enable); -}; - -#endif diff --git a/techpack/audio/4.0/asoc/msm-transcode-loopback-q6-v2.c b/techpack/audio/4.0/asoc/msm-transcode-loopback-q6-v2.c deleted file mode 100644 index 21fe0f95d8a4..000000000000 --- a/techpack/audio/4.0/asoc/msm-transcode-loopback-q6-v2.c +++ /dev/null @@ -1,1645 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-routing-v2.h" -#include "msm-qti-pp-config.h" - -#define LOOPBACK_SESSION_MAX_NUM_STREAMS 2 -/* Max volume corresponding to 24dB */ -#define TRANSCODE_LR_VOL_MAX_DB 0xFFFF - -#define APP_TYPE_CONFIG_IDX_APP_TYPE 0 -#define APP_TYPE_CONFIG_IDX_ACDB_ID 1 -#define APP_TYPE_CONFIG_IDX_SAMPLE_RATE 2 -#define APP_TYPE_CONFIG_IDX_BE_ID 3 - -static DEFINE_MUTEX(transcode_loopback_session_lock); - -struct msm_transcode_audio_effects { - struct bass_boost_params bass_boost; - struct pbe_params pbe; - struct virtualizer_params virtualizer; - struct reverb_params reverb; - struct eq_params equalizer; - struct soft_volume_params volume; -}; - -struct trans_loopback_pdata { - struct snd_compr_stream *cstream[MSM_FRONTEND_DAI_MAX]; - uint32_t master_gain; - int perf_mode[MSM_FRONTEND_DAI_MAX]; - struct msm_transcode_audio_effects *audio_effects[MSM_FRONTEND_DAI_MAX]; -}; - -struct loopback_stream { - struct snd_compr_stream *cstream; - uint32_t codec_format; - bool start; - int perf_mode; -}; - -enum loopback_session_state { - /* One or both streams not opened */ - LOOPBACK_SESSION_CLOSE = 0, - /* Loopback streams opened */ - LOOPBACK_SESSION_READY, - /* Loopback streams opened and formats configured */ - LOOPBACK_SESSION_START, - /* Trigger issued on either of streams when in START state */ - LOOPBACK_SESSION_RUN -}; - -struct msm_transcode_loopback { - struct loopback_stream source; - struct loopback_stream sink; - - struct snd_compr_caps source_compr_cap; - struct snd_compr_caps sink_compr_cap; - - uint32_t instance; - uint32_t num_streams; - int session_state; - - struct mutex lock; - - int session_id; - struct audio_client *audio_client; -}; - -/* Transcode loopback global info struct */ -static struct msm_transcode_loopback transcode_info; - -static void loopback_event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct msm_transcode_loopback *trans = - (struct msm_transcode_loopback *)priv; - struct snd_soc_pcm_runtime *rtd; - struct snd_compr_stream *cstream; - struct audio_client *ac; - int stream_id; - int ret; - - if (!trans || !payload) { - pr_err("%s: rtd or payload is NULL\n", __func__); - return; - } - - cstream = trans->sink.cstream; - ac = trans->audio_client; - - /* - * Token for rest of the compressed commands use to set - * session id, stream id, dir etc. - */ - stream_id = q6asm_get_stream_id_from_token(token); - - switch (opcode) { - case ASM_STREAM_CMD_ENCDEC_EVENTS: - case ASM_IEC_61937_MEDIA_FMT_EVENT: - pr_debug("%s: Handling stream event : 0X%x\n", - __func__, opcode); - rtd = cstream->private_data; - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return; - } - - ret = msm_adsp_inform_mixer_ctl(rtd, payload); - if (ret) { - pr_err("%s: failed to inform mixer ctrl. err = %d\n", - __func__, ret); - return; - } - break; - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - pr_debug("%s: ASM_SESSION_CMD_RUN_V2:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - break; - case ASM_STREAM_CMD_CLOSE: - pr_debug("%s: ASM_DATA_CMD_CLOSE:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - break; - default: - break; - } - break; - } - default: - pr_debug("%s: Not Supported Event opcode[0x%x]\n", - __func__, opcode); - break; - } -} - -static void populate_codec_list(struct msm_transcode_loopback *trans, - struct snd_compr_stream *cstream) -{ - struct snd_compr_caps compr_cap; - - pr_debug("%s\n", __func__); - - memset(&compr_cap, 0, sizeof(struct snd_compr_caps)); - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - compr_cap.direction = SND_COMPRESS_CAPTURE; - compr_cap.num_codecs = 4; - compr_cap.codecs[0] = SND_AUDIOCODEC_PCM; - compr_cap.codecs[1] = SND_AUDIOCODEC_AC3; - compr_cap.codecs[2] = SND_AUDIOCODEC_EAC3; - compr_cap.codecs[3] = SND_AUDIOCODEC_TRUEHD; - memcpy(&trans->source_compr_cap, &compr_cap, - sizeof(struct snd_compr_caps)); - } - - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - compr_cap.direction = SND_COMPRESS_PLAYBACK; - compr_cap.num_codecs = 1; - compr_cap.codecs[0] = SND_AUDIOCODEC_PCM; - memcpy(&trans->sink_compr_cap, &compr_cap, - sizeof(struct snd_compr_caps)); - } -} - -static int msm_transcode_loopback_open(struct snd_compr_stream *cstream) -{ - int ret = 0; - struct snd_compr_runtime *runtime; - struct snd_soc_pcm_runtime *rtd; - struct msm_transcode_loopback *trans = &transcode_info; - struct trans_loopback_pdata *pdata; - - if (cstream == NULL) { - pr_err("%s: Invalid substream\n", __func__); - return -EINVAL; - } - runtime = cstream->runtime; - rtd = snd_pcm_substream_chip(cstream); - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pdata->cstream[rtd->dai_link->id] = cstream; - pdata->audio_effects[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_transcode_audio_effects), GFP_KERNEL); - - if (pdata->audio_effects[rtd->dai_link->id] == NULL) { - ret = -ENOMEM; - goto effect_error; - } - - mutex_lock(&trans->lock); - if (trans->num_streams > LOOPBACK_SESSION_MAX_NUM_STREAMS) { - pr_err("msm_transcode_open failed..invalid stream\n"); - ret = -EINVAL; - goto exit; - } - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - if (trans->source.cstream == NULL) { - trans->source.cstream = cstream; - trans->num_streams++; - } else { - pr_err("%s: capture stream already opened\n", - __func__); - ret = -EINVAL; - goto exit; - } - } else if (cstream->direction == SND_COMPRESS_PLAYBACK) { - if (trans->sink.cstream == NULL) { - trans->sink.cstream = cstream; - trans->num_streams++; - } else { - pr_debug("%s: playback stream already opened\n", - __func__); - ret = -EINVAL; - goto exit; - } - msm_adsp_init_mixer_ctl_pp_event_queue(rtd); - } - - pr_debug("%s: num stream%d, stream name %s\n", __func__, - trans->num_streams, cstream->name); - - populate_codec_list(trans, cstream); - - if (trans->num_streams == LOOPBACK_SESSION_MAX_NUM_STREAMS) { - pr_debug("%s: Moving loopback session to READY state %d\n", - __func__, trans->session_state); - trans->session_state = LOOPBACK_SESSION_READY; - } - - runtime->private_data = trans; - -exit: - mutex_unlock(&trans->lock); - if ((pdata->audio_effects[rtd->dai_link->id] != NULL) && (ret < 0)) { - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - } -effect_error: - return ret; -} - -static void stop_transcoding(struct msm_transcode_loopback *trans) -{ - struct snd_soc_pcm_runtime *soc_pcm_rx; - struct snd_soc_pcm_runtime *soc_pcm_tx; - - if (trans->audio_client != NULL) { - q6asm_cmd(trans->audio_client, CMD_CLOSE); - - if (trans->sink.cstream != NULL) { - soc_pcm_rx = trans->sink.cstream->private_data; - msm_pcm_routing_dereg_phy_stream( - soc_pcm_rx->dai_link->id, - SND_COMPRESS_PLAYBACK); - } - if (trans->source.cstream != NULL) { - soc_pcm_tx = trans->source.cstream->private_data; - msm_pcm_routing_dereg_phy_stream( - soc_pcm_tx->dai_link->id, - SND_COMPRESS_CAPTURE); - } - q6asm_audio_client_free(trans->audio_client); - trans->audio_client = NULL; - } -} - -static int msm_transcode_loopback_free(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_transcode_loopback *trans = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(cstream); - struct trans_loopback_pdata *pdata; - int ret = 0; - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - mutex_lock(&trans->lock); - - if (pdata->audio_effects[rtd->dai_link->id] != NULL) { - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - } - - pr_debug("%s: Transcode loopback end:%d, streams %d\n", __func__, - cstream->direction, trans->num_streams); - trans->num_streams--; - stop_transcoding(trans); - - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - memset(&trans->sink, 0, sizeof(struct loopback_stream)); - msm_adsp_clean_mixer_ctl_pp_event_queue(rtd); - } else if (cstream->direction == SND_COMPRESS_CAPTURE) { - memset(&trans->source, 0, sizeof(struct loopback_stream)); - } - - trans->session_state = LOOPBACK_SESSION_CLOSE; - mutex_unlock(&trans->lock); - return ret; -} - -static int msm_transcode_loopback_trigger(struct snd_compr_stream *cstream, - int cmd) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_transcode_loopback *trans = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - - if (trans->session_state == LOOPBACK_SESSION_START) { - pr_debug("%s: Issue Loopback session %d RUN\n", - __func__, trans->instance); - q6asm_run_nowait(trans->audio_client, 0, 0, 0); - trans->session_state = LOOPBACK_SESSION_RUN; - } - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("%s: Issue Loopback session %d STOP\n", __func__, - trans->instance); - if (trans->session_state == LOOPBACK_SESSION_RUN) - q6asm_cmd_nowait(trans->audio_client, CMD_PAUSE); - trans->session_state = LOOPBACK_SESSION_START; - break; - - default: - break; - } - return 0; -} - -static int msm_transcode_set_render_window(struct audio_client *ac, - uint32_t ws_lsw, uint32_t ws_msw, - uint32_t we_lsw, uint32_t we_msw) -{ - int ret = -EINVAL; - struct asm_session_mtmx_strtr_param_window_v2_t asm_mtmx_strtr_window; - uint32_t param_id; - - pr_debug("%s, ws_lsw 0x%x ws_msw 0x%x we_lsw 0x%x we_msw 0x%x\n", - __func__, ws_lsw, ws_msw, we_lsw, we_msw); - - memset(&asm_mtmx_strtr_window, 0, - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t)); - asm_mtmx_strtr_window.window_lsw = ws_lsw; - asm_mtmx_strtr_window.window_msw = ws_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, param_id); - if (ret) { - pr_err("%s, start window can't be set error %d\n", __func__, ret); - goto exit; - } - - asm_mtmx_strtr_window.window_lsw = we_lsw; - asm_mtmx_strtr_window.window_msw = we_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, param_id); - if (ret) - pr_err("%s, end window can't be set error %d\n", __func__, ret); - -exit: - return ret; -} - -static int msm_transcode_loopback_set_params(struct snd_compr_stream *cstream, - struct snd_compr_params *codec_param) -{ - - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_transcode_loopback *trans = runtime->private_data; - struct snd_soc_pcm_runtime *soc_pcm_rx; - struct snd_soc_pcm_runtime *soc_pcm_tx; - struct snd_soc_pcm_runtime *rtd; - struct trans_loopback_pdata *pdata; - uint32_t bit_width = 16; - int ret = 0; - enum apr_subsys_state subsys_state; - - if (trans == NULL) { - pr_err("%s: Invalid param\n", __func__); - return -EINVAL; - } - - subsys_state = apr_get_subsys_state(); - if (subsys_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - - mutex_lock(&trans->lock); - - rtd = snd_pcm_substream_chip(cstream); - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return -EINVAL; - } - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - if (codec_param->codec.id == SND_AUDIOCODEC_PCM) { - trans->sink.codec_format = - FORMAT_LINEAR_PCM; - switch (codec_param->codec.format) { - case SNDRV_PCM_FORMAT_S32_LE: - bit_width = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_width = 16; - break; - } - } else { - pr_debug("%s: unknown sink codec\n", __func__); - ret = -EINVAL; - goto exit; - } - trans->sink.start = true; - trans->sink.perf_mode = pdata->perf_mode[rtd->dai_link->id]; - } - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - switch (codec_param->codec.id) { - case SND_AUDIOCODEC_PCM: - pr_debug("Source SND_AUDIOCODEC_PCM\n"); - trans->source.codec_format = - FORMAT_LINEAR_PCM; - break; - case SND_AUDIOCODEC_AC3: - pr_debug("Source SND_AUDIOCODEC_AC3\n"); - trans->source.codec_format = - FORMAT_AC3; - break; - case SND_AUDIOCODEC_EAC3: - pr_debug("Source SND_AUDIOCODEC_EAC3\n"); - trans->source.codec_format = - FORMAT_EAC3; - break; - case SND_AUDIOCODEC_TRUEHD: - pr_debug("Source SND_AUDIOCODEC_TRUEHD\n"); - trans->source.codec_format = - FORMAT_TRUEHD; - break; - default: - pr_debug("%s: unknown source codec\n", __func__); - ret = -EINVAL; - goto exit; - } - trans->source.start = true; - trans->source.perf_mode = pdata->perf_mode[rtd->dai_link->id]; - } - - pr_debug("%s: trans->source.start %d trans->sink.start %d trans->source.cstream %pK trans->sink.cstream %pK trans->session_state %d\n", - __func__, trans->source.start, trans->sink.start, - trans->source.cstream, trans->sink.cstream, - trans->session_state); - - if ((trans->session_state == LOOPBACK_SESSION_READY) && - trans->source.start && trans->sink.start) { - pr_debug("%s: Moving loopback session to start state\n", - __func__); - trans->session_state = LOOPBACK_SESSION_START; - } - - if (trans->session_state == LOOPBACK_SESSION_START) { - if (trans->audio_client != NULL) { - pr_debug("%s: ASM client already opened, closing\n", - __func__); - stop_transcoding(trans); - } - - trans->audio_client = q6asm_audio_client_alloc( - (app_cb)loopback_event_handler, trans); - if (!trans->audio_client) { - pr_err("%s: Could not allocate memory\n", __func__); - ret = -EINVAL; - goto exit; - } - pr_debug("%s: ASM client allocated, callback %pK\n", __func__, - loopback_event_handler); - trans->session_id = trans->audio_client->session; - trans->audio_client->perf_mode = trans->sink.perf_mode; - ret = q6asm_open_transcode_loopback(trans->audio_client, - bit_width, - trans->source.codec_format, - trans->sink.codec_format); - if (ret < 0) { - pr_err("%s: Session transcode loopback open failed\n", - __func__); - q6asm_audio_client_free(trans->audio_client); - trans->audio_client = NULL; - goto exit; - } - - pr_debug("%s: Starting ADM open for loopback\n", __func__); - soc_pcm_rx = trans->sink.cstream->private_data; - soc_pcm_tx = trans->source.cstream->private_data; - if (trans->source.codec_format != FORMAT_LINEAR_PCM) - msm_pcm_routing_reg_phy_compr_stream( - soc_pcm_tx->dai_link->id, - LEGACY_PCM_MODE, - trans->session_id, - SNDRV_PCM_STREAM_CAPTURE, - COMPRESSED_PASSTHROUGH_GEN); - else - msm_pcm_routing_reg_phy_stream( - soc_pcm_tx->dai_link->id, - trans->source.perf_mode, - trans->session_id, - SNDRV_PCM_STREAM_CAPTURE); - /* Opening Rx ADM in LOW_LATENCY mode by default */ - msm_pcm_routing_reg_phy_stream( - soc_pcm_rx->dai_link->id, - trans->sink.perf_mode, - trans->session_id, - SNDRV_PCM_STREAM_PLAYBACK); - pr_debug("%s: Successfully opened ADM sessions\n", __func__); - } -exit: - mutex_unlock(&trans->lock); - return ret; -} - -static int msm_transcode_loopback_get_caps(struct snd_compr_stream *cstream, - struct snd_compr_caps *arg) -{ - struct snd_compr_runtime *runtime; - struct msm_transcode_loopback *trans; - - if (!arg || !cstream) { - pr_err("%s: Invalid arguments\n", __func__); - return -EINVAL; - } - - runtime = cstream->runtime; - trans = runtime->private_data; - pr_debug("%s\n", __func__); - if (cstream->direction == SND_COMPRESS_CAPTURE) - memcpy(arg, &trans->source_compr_cap, - sizeof(struct snd_compr_caps)); - else - memcpy(arg, &trans->sink_compr_cap, - sizeof(struct snd_compr_caps)); - return 0; -} - -static int msm_transcode_loopback_set_metadata(struct snd_compr_stream *cstream, - struct snd_compr_metadata *metadata) -{ - struct snd_soc_pcm_runtime *rtd; - struct trans_loopback_pdata *pdata; - struct msm_transcode_loopback *prtd = NULL; - struct audio_client *ac = NULL; - - if (!metadata || !cstream) { - pr_err("%s: Invalid arguments\n", __func__); - return -EINVAL; - } - - rtd = snd_pcm_substream_chip(cstream); - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return -EINVAL; - } - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - prtd = cstream->runtime->private_data; - - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return -EINVAL; - } - - ac = prtd->audio_client; - - switch (metadata->key) { - case SNDRV_COMPRESS_LATENCY_MODE: - { - switch (metadata->value[0]) { - case SNDRV_COMPRESS_LEGACY_LATENCY_MODE: - pdata->perf_mode[rtd->dai_link->id] = LEGACY_PCM_MODE; - break; - case SNDRV_COMPRESS_LOW_LATENCY_MODE: - pdata->perf_mode[rtd->dai_link->id] = - LOW_LATENCY_PCM_MODE; - break; - default: - pr_debug("%s: Unsupported latency mode %d, default to Legacy\n", - __func__, metadata->value[0]); - pdata->perf_mode[rtd->dai_link->id] = LEGACY_PCM_MODE; - break; - } - break; - } - case SNDRV_COMPRESS_RENDER_WINDOW: - { - return msm_transcode_set_render_window( - ac, - metadata->value[0], - metadata->value[1], - metadata->value[2], - metadata->value[3]); - } - default: - pr_debug("%s: Unsupported metadata %d\n", - __func__, metadata->key); - break; - } - return 0; -} - -static int msm_transcode_stream_cmd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd; - int ret = 0; - struct msm_adsp_event_data *event_data = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto done; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)ucontrol->value.bytes.data; - if ((event_data->event_type < ADSP_STREAM_PP_EVENT) || - (event_data->event_type >= ADSP_STREAM_EVENT_MAX)) { - pr_err("%s: invalid event_type=%d", - __func__, event_data->event_type); - ret = -EINVAL; - goto done; - } - - if (event_data->payload_len > sizeof(ucontrol->value.bytes.data) - - sizeof(struct msm_adsp_event_data)) { - pr_err("%s param length=%d exceeds limit", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_stream_cmd(prtd->audio_client, event_data); - if (ret < 0) - pr_err("%s: failed to send stream event cmd, err = %d\n", - __func__, ret); -done: - return ret; -} - -static int msm_transcode_ion_fd_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd; - int fd; - int ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds invalid fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto done; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(&fd, ucontrol->value.bytes.data, sizeof(fd)); - ret = q6asm_send_ion_fd(prtd->audio_client, fd); - if (ret < 0) - pr_err("%s: failed to register ion fd\n", __func__); -done: - return ret; -} - -static int msm_transcode_rtic_event_ack_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd; - int ret = 0; - int param_length = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto done; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(¶m_length, ucontrol->value.bytes.data, - sizeof(param_length)); - if ((param_length + sizeof(param_length)) - >= sizeof(ucontrol->value.bytes.data)) { - pr_err("%s param length=%d exceeds limit", - __func__, param_length); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_rtic_event_ack(prtd->audio_client, - ucontrol->value.bytes.data + sizeof(param_length), - param_length); - if (ret < 0) - pr_err("%s: failed to send rtic event ack, err = %d\n", - __func__, ret); -done: - return ret; -} - -static int msm_transcode_playback_app_type_cfg_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_APP_TYPE]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_ACDB_ID]; - if (ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_SAMPLE_RATE]; - pr_debug("%s: fe_id %llu session_type %d be_id %d app_type %d acdb_dev_id %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_transcode_playback_stream_app_type_cfg set failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_transcode_playback_app_type_cfg_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_transcode_playback_stream_app_type_cfg get failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_APP_TYPE] = - cfg_data.app_type; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_ACDB_ID] = - cfg_data.acdb_dev_id; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] = - cfg_data.sample_rate; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_transcode_capture_app_type_cfg_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_APP_TYPE]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_ACDB_ID]; - if (ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_SAMPLE_RATE]; - pr_debug("%s: fe_id %llu session_type %d be_id %d app_type %d acdb_dev_id %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: register stream app type cfg failed, returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_transcode_capture_app_type_cfg_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: get stream app type cfg failed, returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_APP_TYPE] = - cfg_data.app_type; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_ACDB_ID] = - cfg_data.acdb_dev_id; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] = - cfg_data.sample_rate; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_transcode_set_volume(struct snd_compr_stream *cstream, - uint32_t master_gain) -{ - int rc = 0; - struct msm_transcode_loopback *prtd; - struct snd_soc_pcm_runtime *rtd; - - pr_debug("%s: master_gain %d\n", __func__, master_gain); - if (!cstream || !cstream->runtime) { - pr_err("%s: session not active\n", __func__); - return -EINVAL; - } - rtd = cstream->private_data; - prtd = cstream->runtime->private_data; - - if (!rtd || !prtd || !prtd->audio_client) { - pr_err("%s: invalid rtd, prtd or audio client", __func__); - return -EINVAL; - } - - rc = q6asm_set_volume(prtd->audio_client, master_gain); - if (rc < 0) - pr_err("%s: Send vol gain command failed rc=%d\n", - __func__, rc); - - return rc; -} - -static int msm_transcode_volume_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - uint32_t ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - pdata->master_gain = ucontrol->value.integer.value[0]; - - pr_debug("%s: fe_id %lu master_gain %d\n", - __func__, fe_id, pdata->master_gain); - if (cstream) - ret = msm_transcode_set_volume(cstream, pdata->master_gain); - return ret; -} - -static int msm_transcode_volume_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: fe_id %lu\n", __func__, fe_id); - ucontrol->value.integer.value[0] = pdata->master_gain; - - return 0; -} - -static int msm_transcode_audio_effects_config_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = MAX_PP_PARAMS_SZ; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_transcode_audio_effects_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_transcode_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - - pr_debug("%s: fe_id: %lu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_transcode_audio_effects_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_transcode_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); - int effects_module; - int ret = 0; - - pr_debug("%s: fe_id: %lu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto exit; - } - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto exit; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto exit; - } - - effects_module = *values++; - switch (effects_module) { - case VIRTUALIZER_MODULE: - pr_debug("%s: VIRTUALIZER_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_virtualizer_handler( - prtd->audio_client, - &(audio_effects->virtualizer), - values); - break; - case REVERB_MODULE: - pr_debug("%s: REVERB_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_reverb_handler(prtd->audio_client, - &(audio_effects->reverb), - values); - break; - case BASS_BOOST_MODULE: - pr_debug("%s: BASS_BOOST_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_bass_boost_handler(prtd->audio_client, - &(audio_effects->bass_boost), - values); - break; - case PBE_MODULE: - pr_debug("%s: PBE_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_pbe_handler(prtd->audio_client, - &(audio_effects->pbe), - values); - break; - case EQ_MODULE: - pr_debug("%s: EQ_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_popless_eq_handler(prtd->audio_client, - &(audio_effects->equalizer), - values); - break; - case SOFT_VOLUME_MODULE: - pr_debug("%s: SOFT_VOLUME_MODULE\n", __func__); - break; - case SOFT_VOLUME2_MODULE: - pr_debug("%s: SOFT_VOLUME2_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_volume_handler_v2(prtd->audio_client, - &(audio_effects->volume), - values, SOFT_VOLUME_INSTANCE_2); - break; - default: - pr_err("%s Invalid effects config module\n", __func__); - ret = -EINVAL; - } - -exit: - return ret; -} - -static int msm_transcode_add_audio_effects_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Audio Effects Config"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0; - int ret = 0; - struct snd_kcontrol_new fe_audio_effects_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_transcode_audio_effects_config_info, - .get = msm_transcode_audio_effects_config_get, - .put = msm_transcode_audio_effects_config_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", __func__, - rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - - fe_audio_effects_config_control[0].name = mixer_str; - fe_audio_effects_config_control[0].private_value = rtd->dai_link->id; - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_effects_config_control, - ARRAY_SIZE(fe_audio_effects_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s. err = %d\n", __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_stream_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CMD; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_loopback_stream_cmd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_transcode_stream_cmd_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_loopback_stream_cmd_config_control[0].name = mixer_str; - fe_loopback_stream_cmd_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_loopback_stream_cmd_config_control, - ARRAY_SIZE(fe_loopback_stream_cmd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_stream_callback_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol *kctl; - - struct snd_kcontrol_new fe_loopback_callback_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_callback_info, - .get = msm_adsp_stream_callback_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_loopback_callback_config_control[0].name = mixer_str; - fe_loopback_callback_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_loopback_callback_config_control, - ARRAY_SIZE(fe_loopback_callback_config_control)); - if (ret < 0) { - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl %s.\n", __func__, mixer_str); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl->private_data = NULL; -free_mixer_str: - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_add_ion_fd_cmd_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback ION FD"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_ion_fd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_transcode_ion_fd_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_ion_fd_config_control[0].name = mixer_str; - fe_ion_fd_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_ion_fd_config_control, - ARRAY_SIZE(fe_ion_fd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_add_event_ack_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Event Ack"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_event_ack_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_transcode_rtic_event_ack_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_event_ack_config_control[0].name = mixer_str; - fe_event_ack_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_event_ack_config_control, - ARRAY_SIZE(fe_event_ack_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_app_type_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 5; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_transcode_add_app_type_cfg_control( - struct snd_soc_pcm_runtime *rtd) -{ - char mixer_str[128]; - struct snd_kcontrol_new fe_app_type_cfg_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_transcode_app_type_cfg_info, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) { - snprintf(mixer_str, sizeof(mixer_str), - "Audio Stream %d App Type Cfg", - rtd->pcm->device); - - fe_app_type_cfg_control[0].name = mixer_str; - fe_app_type_cfg_control[0].private_value = rtd->dai_link->id; - - fe_app_type_cfg_control[0].put = - msm_transcode_playback_app_type_cfg_put; - fe_app_type_cfg_control[0].get = - msm_transcode_playback_app_type_cfg_get; - - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_app_type_cfg_control, - ARRAY_SIZE(fe_app_type_cfg_control)); - } else if (rtd->compr->direction == SND_COMPRESS_CAPTURE) { - snprintf(mixer_str, sizeof(mixer_str), - "Audio Stream Capture %d App Type Cfg", - rtd->pcm->device); - - fe_app_type_cfg_control[0].name = mixer_str; - fe_app_type_cfg_control[0].private_value = rtd->dai_link->id; - - fe_app_type_cfg_control[0].put = - msm_transcode_capture_app_type_cfg_put; - fe_app_type_cfg_control[0].get = - msm_transcode_capture_app_type_cfg_get; - - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_app_type_cfg_control, - ARRAY_SIZE(fe_app_type_cfg_control)); - } - - return 0; -} - -static int msm_transcode_volume_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = TRANSCODE_LR_VOL_MAX_DB; - return 0; -} - -static int msm_transcode_add_volume_control(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_kcontrol_new fe_volume_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Transcode Loopback Rx Volume", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_transcode_volume_info, - .get = msm_transcode_volume_get, - .put = msm_transcode_volume_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) { - fe_volume_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s", - fe_volume_control[0].name); - snd_soc_add_platform_controls(rtd->platform, fe_volume_control, - ARRAY_SIZE(fe_volume_control)); - } - return 0; -} - -static int msm_transcode_loopback_new(struct snd_soc_pcm_runtime *rtd) -{ - int rc; - - rc = msm_transcode_add_audio_effects_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Audio Effects Control\n", - __func__); - - rc = msm_transcode_stream_cmd_control(rtd); - if (rc) - pr_err("%s: ADSP Stream Cmd Control open failed\n", __func__); - - rc = msm_transcode_stream_callback_control(rtd); - if (rc) - pr_err("%s: ADSP Stream callback Control open failed\n", - __func__); - - rc = msm_transcode_add_ion_fd_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add transcode ion fd Control\n", - __func__); - - rc = msm_transcode_add_event_ack_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add transcode event ack Control\n", - __func__); - - rc = msm_transcode_add_app_type_cfg_control(rtd); - if (rc) - pr_err("%s: Could not add Compr App Type Cfg Control\n", - __func__); - - rc = msm_transcode_add_volume_control(rtd); - if (rc) - pr_err("%s: Could not add transcode volume Control\n", - __func__); - - return 0; -} - -static struct snd_compr_ops msm_transcode_loopback_ops = { - .open = msm_transcode_loopback_open, - .free = msm_transcode_loopback_free, - .trigger = msm_transcode_loopback_trigger, - .set_params = msm_transcode_loopback_set_params, - .get_caps = msm_transcode_loopback_get_caps, - .set_metadata = msm_transcode_loopback_set_metadata, -}; - - -static int msm_transcode_loopback_probe(struct snd_soc_platform *platform) -{ - struct trans_loopback_pdata *pdata = NULL; - int i; - - pr_debug("%s\n", __func__); - pdata = (struct trans_loopback_pdata *) - kzalloc(sizeof(struct trans_loopback_pdata), - GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - for (i = 0; i < MSM_FRONTEND_DAI_MAX; i++) { - pdata->audio_effects[i] = NULL; - pdata->perf_mode[i] = LOW_LATENCY_PCM_MODE; - } - - snd_soc_platform_set_drvdata(platform, pdata); - return 0; -} - -static int msm_transcode_loopback_remove(struct snd_soc_platform *platform) -{ - struct trans_loopback_pdata *pdata = NULL; - - pdata = (struct trans_loopback_pdata *) - snd_soc_platform_get_drvdata(platform); - kfree(pdata); - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .probe = msm_transcode_loopback_probe, - .compr_ops = &msm_transcode_loopback_ops, - .pcm_new = msm_transcode_loopback_new, - .remove = msm_transcode_loopback_remove, -}; - -static int msm_transcode_dev_probe(struct platform_device *pdev) -{ - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_transcode_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_transcode_loopback_dt_match[] = { - {.compatible = "qcom,msm-transcode-loopback"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_transcode_loopback_dt_match); - -static struct platform_driver msm_transcode_loopback_driver = { - .driver = { - .name = "msm-transcode-loopback", - .owner = THIS_MODULE, - .of_match_table = msm_transcode_loopback_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_transcode_dev_probe, - .remove = msm_transcode_remove, -}; - -int __init msm_transcode_loopback_init(void) -{ - memset(&transcode_info, 0, sizeof(struct msm_transcode_loopback)); - mutex_init(&transcode_info.lock); - return platform_driver_register(&msm_transcode_loopback_driver); -} - -void msm_transcode_loopback_exit(void) -{ - mutex_destroy(&transcode_info.lock); - platform_driver_unregister(&msm_transcode_loopback_driver); -} - -MODULE_DESCRIPTION("Transcode loopback platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/platform_init.c b/techpack/audio/4.0/asoc/platform_init.c deleted file mode 100644 index e9ff68fc30a8..000000000000 --- a/techpack/audio/4.0/asoc/platform_init.c +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. -*/ - -#include -#include -#include "platform_init.h" - -static int __init audio_platform_init(void) -{ - msm_compress_dsp_init(); - msm_fe_dai_init(); - msm_dai_q6_hdmi_init(); - msm_dai_q6_init(); - msm_dai_slim_init(); - msm_dai_stub_init(); - msm_lsm_client_init(); - msm_pcm_afe_init(); - msm_pcm_dtmf_init(); - msm_pcm_hostless_init(); - msm_voice_host_init(); - msm_pcm_loopback_init(); - msm_pcm_noirq_init(); - msm_pcm_dsp_init(); - msm_soc_routing_platform_init(); - msm_pcm_voice_init(); - msm_pcm_voip_init(); - msm_transcode_loopback_init(); - - return 0; -} - -static void audio_platform_exit(void) -{ - msm_transcode_loopback_exit(); - msm_pcm_voip_exit(); - msm_pcm_voice_exit(); - msm_soc_routing_platform_exit(); - msm_pcm_dsp_exit(); - msm_pcm_noirq_exit(); - msm_pcm_loopback_exit(); - msm_voice_host_exit(); - msm_pcm_hostless_exit(); - msm_pcm_dtmf_exit(); - msm_pcm_afe_exit(); - msm_lsm_client_exit(); - msm_dai_stub_exit(); - msm_dai_slim_exit(); - msm_dai_q6_exit(); - msm_dai_q6_hdmi_exit(); - msm_fe_dai_exit(); - msm_compress_dsp_exit(); -} - -module_init(audio_platform_init); -module_exit(audio_platform_exit); - -MODULE_DESCRIPTION("Audio Platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/asoc/platform_init.h b/techpack/audio/4.0/asoc/platform_init.h deleted file mode 100644 index caa54042cff4..000000000000 --- a/techpack/audio/4.0/asoc/platform_init.h +++ /dev/null @@ -1,59 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef __PLATFORM_INIT_H__ -#define __PLATFORM_INIT_H__ -int msm_compress_dsp_init(void); -int msm_fe_dai_init(void); -int msm_dai_q6_hdmi_init(void); -int msm_dai_q6_init(void); -int msm_dai_stub_init(void); -int msm_lsm_client_init(void); -int msm_pcm_afe_init(void); -int msm_pcm_dtmf_init(void); -int msm_pcm_hostless_init(void); -int msm_voice_host_init(void); -int msm_pcm_loopback_init(void); -int msm_pcm_noirq_init(void); -int msm_pcm_dsp_init(void); -int msm_soc_routing_platform_init(void); -int msm_pcm_voice_init(void); -int msm_pcm_voip_init(void); -int msm_transcode_loopback_init(void); -int msm_cpe_lsm_init(void); - -void msm_cpe_lsm_exit(void); -void msm_transcode_loopback_exit(void); -void msm_pcm_voip_exit(void); -void msm_pcm_voice_exit(void); -void msm_soc_routing_platform_exit(void); -void msm_pcm_dsp_exit(void); -void msm_pcm_noirq_exit(void); -void msm_pcm_loopback_exit(void); -void msm_voice_host_exit(void); -void msm_pcm_hostless_exit(void); -void msm_pcm_dtmf_exit(void); -void msm_pcm_afe_exit(void); -void msm_lsm_client_exit(void); -void msm_dai_stub_exit(void); -void msm_dai_q6_exit(void); -void msm_dai_q6_hdmi_exit(void); -void msm_fe_dai_exit(void); -void msm_compress_dsp_exit(void); - -#if IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE) -int msm_dai_slim_init(void); -void msm_dai_slim_exit(void); -#else -static inline int msm_dai_slim_init(void) -{ - return 0; -}; -static inline void msm_dai_slim_exit(void) -{ -}; -#endif -#endif - diff --git a/techpack/audio/4.0/asoc/sm6150.c b/techpack/audio/4.0/asoc/sm6150.c deleted file mode 100644 index 1fd1c5253a09..000000000000 --- a/techpack/audio/4.0/asoc/sm6150.c +++ /dev/null @@ -1,9260 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "device_event.h" -#include "msm-pcm-routing-v2.h" -#include -#include "codecs/wcd934x/wcd934x.h" -#include "codecs/wcd9335.h" -#include "codecs/wcd934x/wcd934x-mbhc.h" -#include "codecs/wcd937x/wcd937x-mbhc.h" -#include "codecs/wcd938x/wcd938x-mbhc.h" -#include "codecs/wsa881x.h" -#include "codecs/bolero/bolero-cdc.h" -#include -#include "codecs/bolero/wsa-macro.h" -#include "codecs/wcd937x/wcd937x.h" -#include "codecs/wcd938x/wcd938x.h" - -#include "sm6150-port-config.h" - -#define DRV_NAME "sm6150-asoc-snd" - -#define __CHIPSET__ "SM6150 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define WCD9XXX_MBHC_DEF_BUTTONS 8 -#define WCD9XXX_MBHC_DEF_RLOADS 5 -#define CODEC_EXT_CLK_RATE 9600000 -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define DEV_NAME_STR_LEN 32 - -#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 3 -#define TDM_CHANNEL_MAX 8 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ -#define MSM_HIFI_ON 1 - -#define SM6150_SOC_VERSION_1_0 0x00010000 -#define SM6150_SOC_MSM_ID 0x163 - -enum { - SLIM_RX_0 = 0, - SLIM_RX_1, - SLIM_RX_2, - SLIM_RX_3, - SLIM_RX_4, - SLIM_RX_5, - SLIM_RX_6, - SLIM_RX_7, - SLIM_RX_MAX, -}; -enum { - SLIM_TX_0 = 0, - SLIM_TX_1, - SLIM_TX_2, - SLIM_TX_3, - SLIM_TX_4, - SLIM_TX_5, - SLIM_TX_6, - SLIM_TX_7, - SLIM_TX_8, - SLIM_TX_MAX, -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - QUIN_MI2S, - MI2S_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - QUIN_AUX_PCM, - AUX_PCM_MAX, -}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_QUIN, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -enum { - WSA_CDC_DMA_RX_0 = 0, - WSA_CDC_DMA_RX_1, - RX_CDC_DMA_RX_0, - RX_CDC_DMA_RX_1, - RX_CDC_DMA_RX_2, - RX_CDC_DMA_RX_3, - RX_CDC_DMA_RX_5, - CDC_DMA_RX_MAX, -}; - -enum { - WSA_CDC_DMA_TX_0 = 0, - WSA_CDC_DMA_TX_1, - WSA_CDC_DMA_TX_2, - TX_CDC_DMA_TX_0, - TX_CDC_DMA_TX_3, - TX_CDC_DMA_TX_4, - CDC_DMA_TX_MAX, -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; - u32 msm_is_ext_mclk; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -enum { - DP_RX_IDX = 0, - EXT_DISP_RX_IDX_MAX, -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct aux_codec_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct msm_asoc_mach_data { - struct snd_info_entry *codec_root; - int usbc_en2_gpio; /* used by gpio driver API */ - struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */ - int hph_en1_gpio; - int hph_en0_gpio; - struct device_node *dmic01_gpio_p; /* used by pinctrl API */ - struct device_node *dmic23_gpio_p; /* used by pinctrl API */ - struct device_node *us_euro_gpio_p; /* used by pinctrl API */ - struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ - bool is_afe_config_done; - struct device_node *fsa_handle; -}; - -struct msm_asoc_wcd93xx_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); -}; - -static struct snd_soc_card snd_soc_card_sm6150_msm; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } - -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } -}; - - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of Codec DMA Interface Tx */ -static struct dev_config cdc_dma_rx_cfg[] = { - [WSA_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of Codec DMA Interface Rx */ -static struct dev_config cdc_dma_tx_cfg[] = { - [WSA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; -static int msm_vi_feed_tx_ch = 2; -static const char *const slim_rx_ch_text[] = {"One", "Two"}; -static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE", - "S24_3LE"}; -static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_32", "KHZ_44P1", - "KHZ_88P2", "KHZ_176P4" }; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_48", "KHZ_176P4", - "KHZ_352P8"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16", - "KHZ_22P05", "KHZ_32", "KHZ_44P1", - "KHZ_48", "KHZ_96", "KHZ_192"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const hifi_text[] = {"Off", "On"}; -static const char *const qos_text[] = {"Disable", "Enable"}; - -static const char *const cdc_dma_rx_ch_text[] = {"One", "Two"}; -static const char *const cdc_dma_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *cdc_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", - "KHZ_176P4", "KHZ_192", - "KHZ_352P8", "KHZ_384"}; - - -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_sample_rate, - cdc_dma_sample_rate_text); - -static int msm_hifi_control; -static bool codec_reg_done; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; -static struct msm_asoc_wcd93xx_codec msm_codec_fn; - -static int dmic_0_1_gpio_cnt; -static int dmic_2_3_gpio_cnt; - -static void *def_wcd_mbhc_cal(void); -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm); -static int msm_wsa881x_init(struct snd_soc_component *component); -static int msm_aux_codec_init(struct snd_soc_component *component); - -/* - * Need to report LINEIN - * if R/L channel impedance is larger than 5K ohm - */ -static struct wcd_mbhc_config wcd_mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .detect_extn_cable = true, - .mono_stero_detection = false, - .swap_gnd_mic = NULL, - .hs_ext_micbias = true, - .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, - .key_code[4] = 0, - .key_code[5] = 0, - .key_code[6] = 0, - .key_code[7] = 0, - .linein_th = 5000, - .moisture_en = false, - .mbhc_micbias = MIC_BIAS_2, - .anc_micbias = MIC_BIAS_2, - .enable_anc_mic_detect = false, - .moisture_duty_cycle_en = true, -}; - -static struct snd_soc_dapm_route wcd_audio_paths[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS2", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } - -}; - -static struct afe_clk_set mi2s_mclk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_3, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_2, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_1, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_1, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } -}; - -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; - -static int slim_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 10; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int slim_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int slim_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - val = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int slim_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - bit_fmt = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int slim_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) { - port_id = SLIM_RX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_2_RX", sizeof("SLIM_2_RX"))) { - port_id = SLIM_RX_2; - } else if (strnstr(kcontrol->id.name, - "SLIM_5_RX", sizeof("SLIM_5_RX"))) { - port_id = SLIM_RX_5; - } else if (strnstr(kcontrol->id.name, - "SLIM_6_RX", sizeof("SLIM_6_RX"))) { - port_id = SLIM_RX_6; - } else if (strnstr(kcontrol->id.name, - "SLIM_0_TX", sizeof("SLIM_0_TX"))) { - port_id = SLIM_TX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_1_TX", sizeof("SLIM_1_TX"))) { - port_id = SLIM_TX_1; - } else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].sample_rate = - slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate = 0; - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - if (sample_rate == SAMPLING_RATE_44P1KHZ) { - pr_err("%s: Unsupported sample rate %d: for Tx path\n", - __func__, sample_rate); - return -EINVAL; - } - slim_tx_cfg[ch_num].sample_rate = sample_rate; - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - - return 1; -} - -static int slim_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d\n", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} -static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate rx = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_rx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_tx_cfg[SLIM_TX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate tx = %d", __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_tx = %d, value = %d\n", - __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} -static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx = 0; - - if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_0", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_1", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_1; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_0", - sizeof("RX_CDC_DMA_RX_0"))) - idx = RX_CDC_DMA_RX_0; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_1", - sizeof("RX_CDC_DMA_RX_1"))) - idx = RX_CDC_DMA_RX_1; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_2", - sizeof("RX_CDC_DMA_RX_2"))) - idx = RX_CDC_DMA_RX_2; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_3", - sizeof("RX_CDC_DMA_RX_3"))) - idx = RX_CDC_DMA_RX_3; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_5", - sizeof("RX_CDC_DMA_RX_5"))) - idx = RX_CDC_DMA_RX_5; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_0", - sizeof("WSA_CDC_DMA_TX_0"))) - idx = WSA_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_1", - sizeof("WSA_CDC_DMA_TX_1"))) - idx = WSA_CDC_DMA_TX_1; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_2", - sizeof("WSA_CDC_DMA_TX_2"))) - idx = WSA_CDC_DMA_TX_2; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_0", - sizeof("TX_CDC_DMA_TX_0"))) - idx = TX_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_3", - sizeof("TX_CDC_DMA_TX_3"))) - idx = TX_CDC_DMA_TX_3; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_4", - sizeof("TX_CDC_DMA_TX_4"))) - idx = TX_CDC_DMA_TX_4; - else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return idx; -} - -static int cdc_dma_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels - 1); - ucontrol->value.integer.value[0] = cdc_dma_rx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_rx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_rx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - - -static int cdc_dma_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int cdc_dma_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 11: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 12: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int cdc_dma_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - ucontrol->value.enumerated.item[0] = - cdc_dma_get_sample_rate_val(cdc_dma_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: cdc_dma_rx_sample_rate = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_rx_cfg[ch_num].sample_rate = - cdc_dma_get_sample_rate(ucontrol->value.enumerated.item[0]); - - - pr_debug("%s: control value = %d, cdc_dma_rx_sample_rate = %d\n", - __func__, ucontrol->value.enumerated.item[0], - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - ucontrol->value.integer.value[0] = cdc_dma_tx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_tx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_tx_cfg[ch_num].sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: cdc_dma_tx_sample_rate = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 12: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, cdc_dma_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_tx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) { - idx = DP_RX_IDX; - } else { - pr_err("%s: unsupported BE: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 2: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 6; - break; - - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 4; - break; - - case SAMPLING_RATE_32KHZ: - sample_rate_val = 3; - break; - - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 6: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 5; - break; - default: - sample_rate_val = 3; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - port->mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUAT; - } else if (strnstr(kcontrol->id.name, "QUIN", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUIN; - } else { - pr_err("%s: unsupported mode in: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - port->channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - port->channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - port->channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - port->channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - port->channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - port->channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - port->channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - port->channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - } else { - return -EINVAL; - } - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) { - idx = PRIM_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) { - idx = SEC_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) { - idx = TERT_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) { - idx = QUAT_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", - sizeof("QUIN_AUX_PCM"))) { - idx = QUIN_AUX_PCM; - } else { - pr_err("%s: unsupported port: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) { - idx = PRIM_MI2S; - } else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) { - idx = SEC_MI2S; - } else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) { - idx = TERT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) { - idx = QUAT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", - sizeof("QUIN_MI2S_RX"))) { - idx = QUIN_MI2S; - } else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) { - idx = PRIM_MI2S; - } else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) { - idx = SEC_MI2S; - } else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) { - idx = TERT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) { - idx = QUAT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", - sizeof("QUIN_MI2S_TX"))) { - idx = QUIN_MI2S; - } else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_auxpcm_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_auxpcm_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_hifi_ctrl(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - dev_dbg(codec->dev, "%s: msm_hifi_control = %d\n", __func__, - msm_hifi_control); - - if (!pdata || !pdata->hph_en1_gpio_p) { - dev_err(codec->dev, "%s: hph_en1_gpio is invalid\n", __func__); - return -EINVAL; - } - if (msm_hifi_control == MSM_HIFI_ON) { - msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p); - /* 5msec delay needed as per HW requirement */ - usleep_range(5000, 5010); - } else { - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p); - } - snd_soc_dapm_sync(dapm); - - return 0; -} - -static int msm_hifi_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - ucontrol->value.integer.value[0] = msm_hifi_control; - - return 0; -} - -static int msm_hifi_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - msm_hifi_control = ucontrol->value.integer.value[0]; - msm_hifi_ctrl(codec); - - return 0; -} - -static const struct snd_kcontrol_new msm_int_snd_controls[] = { - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Channels", wsa_cdc_dma_rx_0_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Channels", wsa_cdc_dma_rx_1_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Channels", rx_cdc_dma_rx_0_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Channels", rx_cdc_dma_rx_1_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Channels", rx_cdc_dma_rx_2_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Channels", rx_cdc_dma_rx_3_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Channels", rx_cdc_dma_rx_5_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 Channels", wsa_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Channels", wsa_cdc_dma_tx_1_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Channels", wsa_cdc_dma_tx_2_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Channels", tx_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Channels", tx_cdc_dma_tx_3_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Channels", tx_cdc_dma_tx_4_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Format", wsa_cdc_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Format", wsa_cdc_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc_dma_rx_2_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc_dma_rx_3_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc_dma_rx_5_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Format", wsa_cdc_dma_tx_1_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Format", wsa_cdc_dma_tx_2_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Format", tx_cdc_dma_tx_0_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Format", tx_cdc_dma_tx_3_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Format", tx_cdc_dma_tx_4_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 SampleRate", - wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 SampleRate", - wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate", - rx_cdc_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate", - rx_cdc_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate", - rx_cdc_dma_rx_2_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate", - rx_cdc_dma_rx_3_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate", - rx_cdc_dma_rx_5_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 SampleRate", - wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 SampleRate", - wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 SampleRate", - wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 SampleRate", - tx_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 SampleRate", - tx_cdc_dma_tx_3_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 SampleRate", - tx_cdc_dma_tx_4_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_ext_snd_controls[] = { - SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format, - slim_tx_bit_format_get, slim_tx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate, - slim_tx_sample_rate_get, slim_tx_sample_rate_put), - SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_common_snd_controls[] = { - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, - msm_hifi_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx, - msm_bt_sample_rate_rx_get, - msm_bt_sample_rate_rx_put), - SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, - msm_bt_sample_rate_tx_get, - msm_bt_sample_rate_tx_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), -}; - -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_enable(codec, enable); - } else if (!strcmp(dev_name(codec->dev), "tasha_codec")) { - ret = tasha_cdc_mclk_enable(codec, enable, dapm); - } else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_tx_enable(codec, enable); - } else if (!strcmp(dev_name(codec->dev), "tasha_codec")) { - ret = tasha_cdc_mclk_tx_enable(codec, enable, dapm); - } else { - dev_err(codec->dev, "%s: unknown codec to enable TX ext clk\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_tx_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_tx_clk(codec, 0, true); - } - return 0; -} - -static int msm_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_clk(codec, 0, true); - } - return 0; -} - -static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *k, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - dev_dbg(codec->dev, "%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - - if (!pdata || !pdata->hph_en0_gpio_p) { - dev_err(codec->dev, "%s: hph_en0_gpio is invalid\n", __func__); - return -EINVAL; - } - - if (msm_hifi_control != MSM_HIFI_ON) { - dev_dbg(codec->dev, "%s: HiFi mixer control is not set\n", - __func__); - return 0; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p); - break; - case SND_SOC_DAPM_PRE_PMD: - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p); - break; - } - - return 0; -} - -static const struct snd_soc_dapm_widget msm_ext_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, - msm_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0, - msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SPK("Lineout_1 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_3 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_4 amp", NULL), - SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event), - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), - SND_SOC_DAPM_MIC("Secondary Mic", NULL), - SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - SND_SOC_DAPM_MIC("Analog Mic5", NULL), - SND_SOC_DAPM_MIC("Analog Mic6", NULL), - SND_SOC_DAPM_MIC("Analog Mic7", NULL), - SND_SOC_DAPM_MIC("Analog Mic8", NULL), - - SND_SOC_DAPM_MIC("Digital Mic0", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", NULL), - SND_SOC_DAPM_MIC("Digital Mic2", NULL), - SND_SOC_DAPM_MIC("Digital Mic3", NULL), - SND_SOC_DAPM_MIC("Digital Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic5", NULL), - SND_SOC_DAPM_MIC("Digital Mic6", NULL), -}; - -static int msm_dmic_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - u32 dmic_idx; - int *dmic_gpio_cnt; - struct device_node *dmic_gpio; - char *wname; - - wname = strpbrk(w->name, "0123"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic_idx); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - pdata = snd_soc_card_get_drvdata(codec->component.card); - - switch (dmic_idx) { - case 0: - case 1: - dmic_gpio_cnt = &dmic_0_1_gpio_cnt; - dmic_gpio = pdata->dmic01_gpio_p; - break; - case 2: - case 3: - dmic_gpio_cnt = &dmic_2_3_gpio_cnt; - dmic_gpio = pdata->dmic23_gpio_p; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n", - __func__, event, dmic_idx, *dmic_gpio_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - (*dmic_gpio_cnt)++; - if (*dmic_gpio_cnt == 1) { - ret = msm_cdc_pinctrl_select_active_state( - dmic_gpio); - if (ret < 0) { - pr_err("%s: gpio set cannot be activated %sd", - __func__, "dmic_gpio"); - return ret; - } - } - - break; - case SND_SOC_DAPM_POST_PMD: - (*dmic_gpio_cnt)--; - if (*dmic_gpio_cnt == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - dmic_gpio); - if (ret < 0) { - pr_err("%s: gpio set cannot be de-activated %sd", - __func__, "dmic_gpio"); - return ret; - } - } - break; - default: - pr_err("%s: invalid DAPM event %d\n", __func__, event); - return -EINVAL; - } - return 0; -} - -static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = { - SND_SOC_DAPM_MIC("Analog Mic1", NULL), - SND_SOC_DAPM_MIC("Analog Mic2", NULL), - SND_SOC_DAPM_MIC("Analog Mic3", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event), -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, - unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int msm_slim_get_ch_from_beid(int32_t be_id) -{ - int ch_id = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - ch_id = SLIM_RX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - ch_id = SLIM_RX_1; - break; - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - ch_id = SLIM_RX_2; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - ch_id = SLIM_RX_3; - break; - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - ch_id = SLIM_RX_4; - break; - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - ch_id = SLIM_RX_6; - break; - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - ch_id = SLIM_TX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - ch_id = SLIM_TX_3; - break; - default: - ch_id = SLIM_RX_0; - break; - } - - return ch_id; -} - -static int msm_cdc_dma_get_idx_from_beid(int32_t be_id) -{ - int idx = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - idx = WSA_CDC_DMA_RX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - idx = WSA_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - idx = WSA_CDC_DMA_RX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - idx = WSA_CDC_DMA_TX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - idx = WSA_CDC_DMA_TX_2; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - idx = RX_CDC_DMA_RX_0; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - idx = RX_CDC_DMA_RX_1; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - idx = RX_CDC_DMA_RX_2; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3: - idx = RX_CDC_DMA_RX_3; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5: - idx = RX_CDC_DMA_RX_5; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - idx = TX_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - idx = TX_CDC_DMA_TX_3; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - idx = TX_CDC_DMA_TX_4; - break; - default: - idx = RX_CDC_DMA_RX_0; - break; - } - - return idx; -} - -static int msm_ext_disp_get_idx_from_beid(int32_t be_id) -{ - int idx = -EINVAL; - - switch (be_id) { - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = DP_RX_IDX; - break; - default: - pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id); - idx = -EINVAL; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - int rc = 0; - int idx; - void *config = NULL; - struct snd_soc_codec *codec = NULL; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[idx].bit_format); - rate->min = rate->max = slim_rx_cfg[idx].sample_rate; - channels->min = channels->max = slim_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[idx].bit_format); - rate->min = rate->max = slim_tx_cfg[idx].sample_rate; - channels->min = channels->max = slim_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_1_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[1].bit_format); - rate->min = rate->max = slim_tx_cfg[1].sample_rate; - channels->min = channels->max = slim_tx_cfg[1].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_4_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[5].bit_format); - rate->min = rate->max = slim_rx_cfg[5].sample_rate; - channels->min = channels->max = slim_rx_cfg[5].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_TX: - codec = rtd->codec; - rate->min = rate->max = SAMPLING_RATE_16KHZ; - channels->min = channels->max = 1; - - config = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_PORT_CONFIG); - if (config) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, - config, SLIMBUS_5_TX); - if (rc) - pr_err("%s: Failed to set slimbus slave port config %d\n", - __func__, rc); - } - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - goto done; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - - case MSM_BACKEND_DAI_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_rx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_rx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_tx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - -done: - return rc; -} - -static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - if (!pdata->fsa_handle) - return false; - - return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP); -} - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - int value = 0; - bool ret = false; - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return false; - } - card = codec->component.card; - pdata = snd_soc_card_get_drvdata(card); - - if (!pdata) - return false; - - if (wcd_mbhc_cfg.enable_usbc_analog) - return msm_usbc_swap_gnd_mic(codec, active); - - /* if usbc is not defined, swap using us_euro_gpio_p */ - if (pdata->us_euro_gpio_p) { - value = msm_cdc_pinctrl_get_state( - pdata->us_euro_gpio_p); - if (value) - msm_cdc_pinctrl_select_sleep_state( - pdata->us_euro_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - pdata->us_euro_gpio_p); - dev_dbg(codec->dev, "%s: swap select switch %d to %d\n", - __func__, value, !value); - ret = true; - } - return ret; -} - -static int msm_afe_set_config(struct snd_soc_codec *codec) -{ - int ret = 0; - void *config_data = NULL; - - if (!msm_codec_fn.get_afe_config_fn) { - dev_err(codec->dev, "%s: codec get afe config not init'ed\n", - __func__); - return -EINVAL; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set codec registers config %d\n", - __func__, ret); - return ret; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (ret) - dev_err(codec->dev, - "%s: Failed to set cdc register page config\n", - __func__); - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set slimbus slave config %d\n", - __func__, ret); - return ret; - } - } - - return 0; -} - -static void msm_afe_clear_config(void) -{ - afe_clear_config(AFE_CDC_REGISTERS_CONFIG); - afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); -} - -static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* - * Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[WCD934X_RX_MAX] = {144, 145, 146, 147, 148, 149, - 150, 151}; - unsigned int tx_ch[WCD934X_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - pr_info("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_ext_snd_controls, - ARRAY_SIZE(msm_ext_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - ARRAY_SIZE(msm_common_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_ext_dapm_widgets, - ARRAY_SIZE(msm_ext_dapm_widgets)); - - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - - snd_soc_dapm_sync(dapm); - - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); - - msm_codec_fn.get_afe_config_fn = tavil_get_afe_config; - - ret = msm_afe_set_config(codec); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err; - } - pdata->is_afe_config_done = true; - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err; - } - } - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tavil_set_spkr_mode(rtd->codec, WCD934X_SPKR_MODE_1); - tavil_set_spkr_gain_offset(rtd->codec, - WCD934X_RX_GAIN_OFFSET_M1P5_DB); - } - } - - card = rtd->card->snd_card; - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - pdata->codec_root = entry; - tavil_codec_info_create_codec_entry(pdata->codec_root, codec); - - codec_reg_done = true; - return 0; -err: - return ret; -} - -static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156}; - unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - pr_info("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_ext_snd_controls, - ARRAY_SIZE(msm_ext_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - ARRAY_SIZE(msm_common_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_ext_dapm_widgets, - ARRAY_SIZE(msm_ext_dapm_widgets)); - - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_2 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_4 amp"); - - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_1 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_2 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_3 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_4 amp"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic6"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic7"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic8"); - - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC0"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT2"); - - snd_soc_dapm_sync(dapm); - - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); - - msm_codec_fn.get_afe_config_fn = tasha_get_afe_config; - - ret = msm_afe_set_config(codec); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err; - } - pdata->is_afe_config_done = true; - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err; - } - } - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tasha_set_spkr_mode(rtd->codec, SPKR_MODE_1); - tasha_set_spkr_gain_offset(rtd->codec, - RX_GAIN_OFFSET_M1P5_DB); - } - } - - card = rtd->card->snd_card; - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - tasha_codec_info_create_codec_entry(pdata->codec_root, codec); - - codec_reg_done = true; - return 0; -err: - return ret; -} - -static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - 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); - - pr_err("%s entry\n", __func__); - ret = snd_soc_add_codec_controls(codec, msm_int_snd_controls, - ARRAY_SIZE(msm_int_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed: %d\n", - __func__, ret); - return ret; - } - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - ARRAY_SIZE(msm_common_snd_controls)); - if (ret < 0) { - pr_err("%s: add common snd controls failed: %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets, - ARRAY_SIZE(msm_int_dapm_widgets)); - - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA AIF VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA"); - - snd_soc_dapm_sync(dapm); - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - dev_dbg(codec->dev, "%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - list_for_each_entry(aux_comp, &rtd->card->aux_comp_list, - card_aux_list) { - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - wsa_macro_set_spkr_mode(rtd->codec, - WSA_MACRO_SPKR_MODE_1); - wsa_macro_set_spkr_gain_offset(rtd->codec, - WSA_MACRO_GAIN_OFFSET_M1P5_DB); - break; - } - } - bolero_set_port_map(codec, ARRAY_SIZE(sm_port_map), - sm_port_map); - } - card = rtd->card->snd_card; - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - bolero_info_create_codec_entry(pdata->codec_root, codec); - /* - * SM6150 MSM 1.0 doesn't have hardware wake up interrupt line - * from AOSS to APSS. So, it uses SW workaround and listens to - * interrupt from AFE over IPC. - * Check for MSM version and MSM ID and register wake irq - * accordingly to provide compatibility to all chipsets. - */ - if (socinfo_get_id() == SM6150_SOC_MSM_ID && - socinfo_get_version() == SM6150_SOC_VERSION_1_0) - bolero_register_wake_irq(codec, true); - else - bolero_register_wake_irq(codec, false); - - codec_reg_done = true; - pr_err("%s exit\n", __func__); - return 0; -err: - return ret; -} - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static void *def_wcd_mbhc_cal(void) -{ - void *wcd_mbhc_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!wcd_mbhc_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->X) = (Y)) - S(v_hs_max, 1600); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; - - return wcd_mbhc_cal; -} - -static int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 rx_ch_count; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) { - pr_debug("%s: rx_5_ch=%d\n", __func__, - slim_rx_cfg[5].channels); - rx_ch_count = slim_rx_cfg[5].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) { - pr_debug("%s: rx_2_ch=%d\n", __func__, - slim_rx_cfg[2].channels); - rx_ch_count = slim_rx_cfg[2].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) { - pr_debug("%s: rx_6_ch=%d\n", __func__, - slim_rx_cfg[6].channels); - rx_ch_count = slim_rx_cfg[6].channels; - } else { - pr_debug("%s: rx_0_ch=%d\n", __func__, - slim_rx_cfg[0].channels); - rx_ch_count = slim_rx_cfg[0].channels; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - rx_ch_count, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - - pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__, - codec_dai->name, codec_dai->id, user_set_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get tx codec chan map, err:%d\n", - __func__, ret); - goto err; - } - /* For _tx1 case */ - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX) - user_set_tx_ch = slim_tx_cfg[0].channels; - /* For _tx3 case */ - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX) - user_set_tx_ch = slim_tx_cfg[1].channels; - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX) - user_set_tx_ch = msm_vi_feed_tx_ch; - else - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), BE id (%d)\n", - __func__, slim_tx_cfg[0].channels, user_set_tx_ch, - tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set tx cpu chan map, err:%d\n", - __func__, ret); - } - -err: - return ret; -} - - -static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch_cdc_dma, tx_ch_cdc_dma; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 user_set_rx_ch = 0; - u32 ch_id; - - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, &tx_ch_cdc_dma, &rx_ch_cnt, - &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_4: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d rx_ch=%d\n", __func__, - ch_id, cdc_dma_rx_cfg[ch_id].channels); - user_set_rx_ch = cdc_dma_rx_cfg[ch_id].channels; - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - user_set_rx_ch, &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - - } - break; - } - } else { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - { - user_set_tx_ch = msm_vi_feed_tx_ch; - } - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d tx_ch=%d\n", __func__, - ch_id, cdc_dma_tx_cfg[ch_id].channels); - user_set_tx_ch = cdc_dma_tx_cfg[ch_id].channels; - } - break; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, user_set_tx_ch, - &tx_ch_cdc_dma, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_slimbus_2_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0; - unsigned int num_tx_ch = 0; - unsigned int num_rx_ch = 0; - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - num_rx_ch = params_channels(params); - pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_rx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - num_rx_ch, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - num_tx_ch = params_channels(params); - pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get tx codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, - num_tx_ch, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set tx cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -err: - return ret; -} - -int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - int ret = 0; - u32 tx_ch[SLIM_MAX_TX_PORTS]; - u32 tx_ch_cnt = 0; - - if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) { - pr_err("%s: Invalid stream type %d\n", - __func__, substream->stream); - ret = -EINVAL; - goto end; - } - - pr_debug("%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, NULL, NULL); - if (ret < 0) { - pr_err("%s: failed to get codec chan map\n, err:%d\n", - __func__, ret); - goto end; - } - - pr_debug("%s: tx_ch_cnt(%d) id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto end; - } -end: - return ret; -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - -err: - return ret; -} - -static int sm6150_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int slot_width = 32; - int channels, slots; - unsigned int slot_mask, rate, clk_freq; - unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28}; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - slots = tdm_rx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - slots = tdm_rx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - slots = tdm_rx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - slots = tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - slots = tdm_tx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - slots = tdm_tx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - slots = tdm_tx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - slots = tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - break; - case AFE_PORT_ID_QUINARY_TDM_TX: - slots = tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - break; - - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - channels = slots; - - pr_debug("%s: tdm rx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm rx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set tdm rx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - channels = slots; - - pr_debug("%s: tdm tx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm tx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - channels, slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set tdm tx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - -end: - return ret; -} - -static int msm_get_tdm_mode(u32 port_id) -{ - int tdm_mode; - - switch (port_id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - tdm_mode = TDM_PRI; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - tdm_mode = TDM_SEC; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - tdm_mode = TDM_TERT; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - tdm_mode = TDM_QUAT; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - tdm_mode = TDM_QUIN; - break; - default: - pr_err("%s: Invalid port id: %d\n", __func__, port_id); - tdm_mode = -EINVAL; - } - return tdm_mode; -} - -static int sm6150_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode < 0) { - dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__); - return tdm_mode; - } - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if (pdata->mi2s_gpio_p[tdm_mode]) - ret = msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[tdm_mode]); - - return ret; -} - -static void sm6150_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode < 0) { - dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__); - return; - } - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if (pdata->mi2s_gpio_p[tdm_mode]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[tdm_mode]); -} - -static struct snd_soc_ops sm6150_tdm_be_ops = { - .hw_params = sm6150_tdm_snd_hw_params, - .startup = sm6150_tdm_snd_startup, - .shutdown = sm6150_tdm_snd_shutdown -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - int port_id = msm_get_port_id(rtd->dai_link->id); - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - /* - * Mutex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - if (mi2s_intf_conf[index].msm_is_ext_mclk) { - pr_debug("%s: Enabling mclk, clk_freq_in_hz = %u\n", - __func__, mi2s_mclk[index].clk_freq_in_hz); - mi2s_mclk[index].enable = 1; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_mclk[index]); - if (ret < 0) { - pr_err("%s: afe lpass mclk failed, err:%d\n", - __func__, ret); - goto clk_off; - } - } - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[index]); - } -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -err: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - int port_id = msm_get_port_id(rtd->dai_link->id); - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - return; - } - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[index]); - - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - - if (mi2s_intf_conf[index].msm_is_ext_mclk) { - pr_debug("%s: Disabling mclk, clk_freq_in_hz = %u\n", - __func__, mi2s_mclk[index].clk_freq_in_hz); - mi2s_mclk[index].enable = 0; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_mclk[index]); - if (ret < 0) - pr_err("%s: mclk disable failed for MCLK (%d); ret=%d\n", - __func__, index, ret); - } - } - mutex_unlock(&mi2s_intf_conf[index].lock); -} - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_cdc_dma_be_ops = { - .hw_params = msm_snd_cdc_dma_hw_params, -}; - -static struct snd_soc_ops msm_be_ops = { - .hw_params = msm_snd_hw_params, -}; - -static struct snd_soc_ops msm_slimbus_2_be_ops = { - .hw_params = msm_slimbus_2_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - -static struct snd_soc_ops msm_ext_cpe_ops = { - .hw_params = msm_snd_cpe_hw_params, -}; - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - {/* hw:x,0 */ - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - {/* hw:x,1 */ - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - {/* hw:x,2 */ - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - {/* hw:x,3 */ - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - {/* hw:x,4 */ - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - {/* hw:x,5 */ - .name = "SLIMBUS_0 Hostless", - .stream_name = "SLIMBUS_0 Hostless", - .cpu_dai_name = "SLIMBUS0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,6 */ - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - {/* hw:x,7 */ - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - {/* hw:x,8 */ - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - {/* hw:x,9 */ - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,10 */ - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,11 */ - .name = "SLIMBUS_3 Hostless", - .stream_name = "SLIMBUS_3 Hostless", - .cpu_dai_name = "SLIMBUS3_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,12 */ - .name = "SLIMBUS_7 Hostless", - .stream_name = "SLIMBUS_7 Hostless", - .cpu_dai_name = "SLIMBUS7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,13 */ - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - {/* hw:x,14 */ - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - {/* hw:x,15 */ - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - {/* hw:x,16 */ - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - {/* hw:x,17 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - /* HDMI Hostless */ - {/* hw:x,18 */ - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,19 */ - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - {/* hw:x,20 */ - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - {/* hw:x,21 */ - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - {/* hw:x,22 */ - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - {/* hw:x,23 */ - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - {/* hw:x,24 */ - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - {/* hw:x,25 */ - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - {/* hw:x,26 */ - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - {/* hw:x,27 */ - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - {/* hw:x,28 */ - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - {/* hw:x,29 */ - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - {/* hw:x,30 */ - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - {/* hw:x,31 */ - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - {/* hw:x,32 */ - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - {/* hw:x,33 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - {/* hw:x,34 */ - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,35 */ - .name = "CDC_DMA Hostless", - .stream_name = "CDC_DMA Hostless", - .cpu_dai_name = "CDC_DMA_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,36 */ - .name = "TX3_CDC_DMA Hostless", - .stream_name = "TX3_CDC_DMA Hostless", - .cpu_dai_name = "TX3_CDC_DMA_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = { - {/* hw:x,37 */ - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - {/* hw:x,38 */ - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - {/* hw:x,39 */ - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_int_compress_capture_dai[] = { - { - .name = "Compress9", - .stream_name = "Compress9", - .cpu_dai_name = "MultiMedia17", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA17, - }, - { - .name = "Compress10", - .stream_name = "Compress10", - .cpu_dai_name = "MultiMedia18", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA18, - }, - { - .name = "Compress11", - .stream_name = "Compress11", - .cpu_dai_name = "MultiMedia19", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA19, - }, - { - .name = "Compress12", - .stream_name = "Compress12", - .cpu_dai_name = "MultiMedia28", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA28, - }, - { - .name = "Compress13", - .stream_name = "Compress13", - .cpu_dai_name = "MultiMedia29", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA29, - }, -}; - -static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = { - {/* hw:x,37 */ - .name = LPASS_BE_WSA_CDC_DMA_TX_0, - .stream_name = "WSA CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45057", - .platform_name = "msm-pcm-hostless", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_vifeedback", - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_tasha_fe_dai_links[] = { - /* tasha_vifeedback for speaker protection */ - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx2", - .ignore_suspend = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx2", - .ignore_suspend = 1, - .dpcm_capture = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* CPE LSM direct dai-link */ - { - .name = "CPE Listen service", - .stream_name = "CPE Listen Audio Service", - .cpu_dai_name = "msm-dai-slim", - .platform_name = "msm-cpe-lsm", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .dpcm_capture = 1, - .codec_dai_name = "tasha_mad1", - .codec_name = "tasha_codec", - .ops = &msm_ext_cpe_ops, - }, - { - .name = "SLIMBUS_6 Hostless Playback", - .stream_name = "SLIMBUS_6 Hostless", - .cpu_dai_name = "SLIMBUS6_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* CPE LSM EC PP direct dai-link */ - { - .name = "CPE Listen service ECPP", - .stream_name = "CPE Listen Audio Service ECPP", - .cpu_dai_name = "CPE_LSM_NOHOST", - .platform_name = "msm-cpe-lsm.3", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "tasha_cpe", - .codec_name = "tasha_codec", - }, -}; - -static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { - { - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_RX_0, - .stream_name = "Quinary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36928", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_TX_0, - .stream_name = "Quinary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36929", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_tavil_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_tavil_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - }, -}; - -static struct snd_soc_dai_link msm_tasha_be_dai_links[] = { - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_tasha_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = { - /* WSA CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_WSA_CDC_DMA_RX_0, - .stream_name = "WSA CDC DMA0 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45056", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .init = &msm_int_audrx_init, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_RX_1, - .stream_name = "WSA CDC DMA1 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45058", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx_mix", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_TX_1, - .stream_name = "WSA CDC DMA1 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45059", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_echo", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_rx_tx_cdc_dma_be_dai_links[] = { - /* RX CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_RX_CDC_DMA_RX_0, - .stream_name = "RX CDC DMA0 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45104", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_1, - .stream_name = "RX CDC DMA1 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45106", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_2, - .stream_name = "RX CDC DMA2 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45108", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_3, - .stream_name = "RX CDC DMA3 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45110", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - /* TX CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_TX_CDC_DMA_TX_0, - .stream_name = "TX CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45105", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_echo", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_TX_CDC_DMA_TX_3, - .stream_name = "TX CDC DMA3 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45111", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "tx_macro_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_TX_CDC_DMA_TX_4, - .stream_name = "TX CDC DMA4 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45113", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "tx_macro_tx2", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_sm6150_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_tavil_fe_dai_links) + - ARRAY_SIZE(msm_bolero_fe_dai_links) + - ARRAY_SIZE(msm_tasha_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_int_compress_capture_dai) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_tavil_be_dai_links) + - ARRAY_SIZE(msm_tasha_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links) + - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) + - ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links)]; - -static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tavil_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - return ret; -} - -static int msm_snd_card_tasha_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tasha_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - return ret; -} - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - pr_err("%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - - ret = snd_soc_add_codec_controls(codec, msm_ext_snd_controls, - ARRAY_SIZE(msm_ext_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, - "%s: add_codec_controls failed, err = %d\n", - __func__, ret); - return ret; - } - - return 0; -} - -static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - - int ret = 0; - unsigned int rx_ch[] = {144, 145, 146, 147, 148, 149, 150, - 151}; - unsigned int tx_ch[] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - slim_rx_cfg[SLIM_RX_0].channels, - rx_ch); - if (ret < 0) - pr_err("%s: RX failed to set cpu chan map error %d\n", - __func__, ret); - } else { - ret = snd_soc_dai_set_channel_map(cpu_dai, - slim_tx_cfg[SLIM_TX_0].channels, - tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: TX failed to set cpu chan map error %d\n", - __func__, ret); - } - - return ret; -} - -static struct snd_soc_ops msm_stub_be_ops = { - .hw_params = msm_snd_stub_hw_params, -}; - -static struct snd_soc_dai_link msm_stub_fe_dai_links[] = { - - /* FrontEnd DAI Links */ - { - .name = "MSMSTUB Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, -}; - -static struct snd_soc_dai_link msm_stub_be_dai_links[] = { - - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_stub_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_stub_dai_links[ - ARRAY_SIZE(msm_stub_fe_dai_links) + - ARRAY_SIZE(msm_stub_be_dai_links)]; - -struct snd_soc_card snd_soc_card_stub_msm = { - .name = "sm6150-stub-snd-card", -}; - -static const struct of_device_id sm6150_asoc_machine_of_match[] = { - { .compatible = "qcom,sm6150-asoc-snd", - .data = "codec"}, - { .compatible = "qcom,sm6150-asoc-snd-stub", - .data = "stub_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int total_links = 0, rc = 0; - u32 tavil_codec = 0, auxpcm_audio_intf = 0; - u32 mi2s_audio_intf = 0, ext_disp_audio_intf = 0; - u32 wcn_btfm_intf = 0; - const struct of_device_id *match; - u32 tasha_codec = 0; - - match = of_match_node(sm6150_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "codec")) { - card = &snd_soc_card_sm6150_msm; - memcpy(msm_sm6150_dai_links + total_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - - total_links += ARRAY_SIZE(msm_common_dai_links); - - memcpy(msm_sm6150_dai_links + total_links, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - - total_links += ARRAY_SIZE(msm_common_misc_fe_dai_links); - - rc = of_property_read_u32(dev->of_node, "qcom,tavil_codec", - &tavil_codec); - if (rc) - dev_dbg(dev, "%s: No DT match for tavil codec\n", - __func__); - - rc = of_property_read_u32(dev->of_node, "qcom,tasha_codec", - &tasha_codec); - if (rc) - dev_dbg(dev, "%s: No DT match for tasha codec\n", - __func__); - - if (tavil_codec) { - card->late_probe = - msm_snd_card_tavil_late_probe; - memcpy(msm_sm6150_dai_links + total_links, - msm_tavil_fe_dai_links, - sizeof(msm_tavil_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_tavil_fe_dai_links); - } else if (tasha_codec) { - card->late_probe = - msm_snd_card_tasha_late_probe; - memcpy(msm_sm6150_dai_links + total_links, - msm_tasha_fe_dai_links, - sizeof(msm_tasha_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_tasha_fe_dai_links); - } else { - memcpy(msm_sm6150_dai_links + total_links, - msm_bolero_fe_dai_links, - sizeof(msm_bolero_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_bolero_fe_dai_links); - } - - memcpy(msm_sm6150_dai_links + total_links, - msm_int_compress_capture_dai, - sizeof(msm_int_compress_capture_dai)); - - total_links += ARRAY_SIZE(msm_int_compress_capture_dai); - - memcpy(msm_sm6150_dai_links + total_links, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - - total_links += ARRAY_SIZE(msm_common_be_dai_links); - - if (tavil_codec) { - memcpy(msm_sm6150_dai_links + total_links, - msm_tavil_be_dai_links, - sizeof(msm_tavil_be_dai_links)); - total_links += ARRAY_SIZE(msm_tavil_be_dai_links); - } else if (tasha_codec) { - memcpy(msm_sm6150_dai_links + total_links, - msm_tasha_be_dai_links, - sizeof(msm_tasha_be_dai_links)); - total_links += ARRAY_SIZE(msm_tasha_be_dai_links); - } else { - memcpy(msm_sm6150_dai_links + total_links, - msm_wsa_cdc_dma_be_dai_links, - sizeof(msm_wsa_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links); - - memcpy(msm_sm6150_dai_links + total_links, - msm_rx_tx_cdc_dma_be_dai_links, - sizeof(msm_rx_tx_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links); - } - - rc = of_property_read_u32(dev->of_node, - "qcom,ext-disp-audio-rx", - &ext_disp_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match Ext Disp interface\n", - __func__); - } else { - if (ext_disp_audio_intf) { - memcpy(msm_sm6150_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += - ARRAY_SIZE(ext_disp_be_dai_link); - } - } - - rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf", - &mi2s_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match MI2S audio interface\n", - __func__); - } else { - if (mi2s_audio_intf) { - memcpy(msm_sm6150_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += - ARRAY_SIZE(msm_mi2s_be_dai_links); - } - } - - - rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", - &wcn_btfm_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match wcn btfm interface\n", - __func__); - } else { - if (wcn_btfm_intf) { - memcpy(msm_sm6150_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wcn_be_dai_links); - } - } - - rc = of_property_read_u32(dev->of_node, - "qcom,auxpcm-audio-intf", - &auxpcm_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match Aux PCM interface\n", - __func__); - } else { - if (auxpcm_audio_intf) { - memcpy(msm_sm6150_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += - ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - } - - dailink = msm_sm6150_dai_links; - pr_err("%s\n. dailinks\n", __func__); - } else if (!strcmp(match->data, "stub_codec")) { - card = &snd_soc_card_stub_msm; - - memcpy(msm_stub_dai_links + total_links, - msm_stub_fe_dai_links, - sizeof(msm_stub_fe_dai_links)); - total_links += ARRAY_SIZE(msm_stub_fe_dai_links); - - memcpy(msm_stub_dai_links + total_links, - msm_stub_be_dai_links, - sizeof(msm_stub_be_dai_links)); - total_links += ARRAY_SIZE(msm_stub_be_dai_links); - - dailink = msm_stub_dai_links; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -static int msm_wsa881x_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, - SPKR_L_BOOST, SPKR_L_VI}; - u8 spkright_port_types[WSA881X_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}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm; - struct snd_card *card = component->card->snd_card; - struct snd_info_entry *entry; - int ret = 0; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - dapm = snd_soc_codec_get_dapm(codec); - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkleft_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkright_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - ret = -EINVAL; - goto err; - } - pdata = snd_soc_card_get_drvdata(component->card); - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_err("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); -err: - return ret; -} - -static int msm_aux_codec_init(struct snd_soc_component *component) -{ - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret = 0; - void *mbhc_calibration; - struct snd_info_entry *entry; - struct snd_card *card = component->card->snd_card; - struct msm_asoc_mach_data *pdata; - - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "AUX"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_sync(dapm); - - pdata = snd_soc_card_get_drvdata(component->card); - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_err("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto codec_root_err; - } - pdata->codec_root = entry; - } - wcd938x_info_create_codec_entry(pdata->codec_root, codec); -codec_root_err: - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) { - return -ENOMEM; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = wcd938x_mbhc_hs_detect(codec, &wcd_mbhc_cfg); - - return ret; -} - -static int msm_init_aux_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - struct device_node *aux_codec_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - u32 codec_max_aux_devs = 0; - u32 codec_aux_dev_cnt = 0; - int i; - struct msm_wsa881x_dev_info *wsa881x_dev_info = NULL; - struct aux_codec_dev_info *aux_cdc_dev_info = NULL; - const char *auxdev_name_prefix[1]; - char *dev_name_str = NULL; - int found = 0; - int codecs_found = 0; - int ret = 0; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_err(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - wsa_max_devs = 0; - goto codec_aux_dev; - } - if (wsa_max_devs == 0) { - dev_dbg(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - goto codec_aux_dev; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err; - } - if (soc_find_component_locked(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - -codec_aux_dev: - if (!strnstr(card->name, "tavil", strlen(card->name)) && - !strnstr(card->name, "tasha", strlen(card->name))) { - /* Get maximum aux codec device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-max-aux-devs", - &codec_max_aux_devs); - if (ret) { - dev_err(&pdev->dev, - "%s: codec-max-aux-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - codec_max_aux_devs = 0; - goto aux_dev_register; - } - if (codec_max_aux_devs == 0) { - dev_dbg(&pdev->dev, - "%s: Max aux codec devices is 0 for this target?\n", - __func__); - goto aux_dev_register; - } - - /* Get count of aux codec device phandles for this platform */ - codec_aux_dev_cnt = of_count_phandle_with_args( - pdev->dev.of_node, - "qcom,codec-aux-devs", NULL); - if (codec_aux_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No aux codec defined in DT.\n", - __func__); - goto err; - } else if (codec_aux_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading aux codec device from DT, dev_cnt=%d\n", - __func__, codec_aux_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * AUX device count. However, if it is less, then assign same value to - * max count as well. - */ - if (codec_aux_dev_cnt < codec_max_aux_devs) { - dev_dbg(&pdev->dev, - "%s: codec_max_aux_devs = %d cannot exceed codec_aux_dev_cnt = %d\n", - __func__, codec_max_aux_devs, - codec_aux_dev_cnt); - codec_max_aux_devs = codec_aux_dev_cnt; - } - - /* - * Alloc mem to store phandle and index info of aux codec - * if already registered with ALSA core - */ - aux_cdc_dev_info = devm_kcalloc(&pdev->dev, codec_max_aux_devs, - sizeof(struct aux_codec_dev_info), - GFP_KERNEL); - if (!aux_cdc_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all aux codecs are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < codec_aux_dev_cnt; i++) { - aux_codec_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,codec-aux-devs", i); - if (unlikely(!aux_codec_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: aux codec dev node is not present\n", - __func__); - ret = -EINVAL; - goto err; - } - if (soc_find_component_locked(aux_codec_of_node, NULL)) { - /* AUX codec registered with ALSA core */ - aux_cdc_dev_info[codecs_found].of_node = - aux_codec_of_node; - aux_cdc_dev_info[codecs_found].index = i; - codecs_found++; - } - } - - if (codecs_found < codec_max_aux_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, codec_max_aux_devs, codecs_found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d AUX codecs registered with ALSA core\n", - __func__, codecs_found); - - } - -aux_dev_register: - card->num_aux_devs = wsa_max_devs + codec_max_aux_devs; - card->num_configs = wsa_max_devs + codec_max_aux_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_configs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err; - } - - for (i = 0; i < wsa_max_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_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; - } - - for (i = 0; i < codec_aux_dev_cnt; i++) { - msm_aux_dev[wsa_max_devs + i].name = "aux_codec"; - msm_aux_dev[wsa_max_devs + i].codec_name = NULL; - msm_aux_dev[wsa_max_devs + i].codec_of_node = - aux_cdc_dev_info[i].of_node; - msm_aux_dev[wsa_max_devs + i].init = msm_aux_codec_init; - msm_codec_conf[wsa_max_devs + i].dev_name = NULL; - msm_codec_conf[wsa_max_devs + i].name_prefix = - NULL; - msm_codec_conf[wsa_max_devs + i].of_node = - aux_cdc_dev_info[i].of_node; - } - - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; -err: - return ret; -} - -static void msm_i2s_auxpcm_init(struct platform_device *pdev) -{ - int count; - u32 mi2s_master_slave[MI2S_MAX]; - u32 mi2s_ext_mclk[MI2S_MAX]; - int ret; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-ext-mclk", - mi2s_ext_mclk, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-ext-mclk in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) - mi2s_intf_conf[count].msm_is_ext_mclk = - mi2s_ext_mclk[count]; - } -} - -static void msm_i2s_auxpcm_deinit(void) -{ - int count; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_destroy(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - mi2s_intf_conf[count].msm_is_mi2s_master = 0; - mi2s_intf_conf[count].msm_is_ext_mclk = 0; - } -} - -static int sm6150_ssr_enable(struct device *dev, void *data) -{ - struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata; - int ret = 0; - - if (!card) { - dev_err(dev, "%s: card is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - if (strnstr(card->name, "tavil", strlen(card->name)) || - strnstr(card->name, "tasha", strlen(card->name))) { - pdata = snd_soc_card_get_drvdata(card); - if (!pdata->is_afe_config_done) { - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err; - } - ret = msm_afe_set_config(rtd->codec); - if (ret) - dev_err(dev, "%s: Failed to set AFE config. err %d\n", - __func__, ret); - else - pdata->is_afe_config_done = true; - } - } - snd_soc_card_change_online_state(card, 1); - dev_dbg(dev, "%s: setting snd_card to ONLINE\n", __func__); - -err: - return ret; -} - -static void sm6150_ssr_disable(struct device *dev, void *data) -{ - struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata; - - if (!card) { - dev_err(dev, "%s: card is NULL\n", __func__); - return; - } - - dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__); - snd_soc_card_change_online_state(card, 0); - - if (strnstr(card->name, "tavil", strlen(card->name)) || - strnstr(card->name, "tasha", strlen(card->name))) { - pdata = snd_soc_card_get_drvdata(card); - msm_afe_clear_config(); - pdata->is_afe_config_done = false; - } -} - -static int msm_ext_prepare_hifi(struct msm_asoc_mach_data *pdata) -{ - int ret = 0; - - if (gpio_is_valid(pdata->hph_en1_gpio)) { - pr_debug("%s: hph_en1_gpio request %d\n", __func__, - pdata->hph_en1_gpio); - ret = gpio_request(pdata->hph_en1_gpio, "hph_en1_gpio"); - if (ret) { - pr_err("%s: hph_en1_gpio request failed, ret:%d\n", - __func__, ret); - goto err; - } - } - if (gpio_is_valid(pdata->hph_en0_gpio)) { - pr_debug("%s: hph_en0_gpio request %d\n", __func__, - pdata->hph_en0_gpio); - ret = gpio_request(pdata->hph_en0_gpio, "hph_en0_gpio"); - if (ret) - pr_err("%s: hph_en0_gpio request failed, ret:%d\n", - __func__, ret); - } - -err: - return ret; -} - -static const struct snd_event_ops sm6150_ssr_ops = { - .enable = sm6150_ssr_enable, - .disable = sm6150_ssr_disable, -}; - -static int msm_audio_ssr_compare(struct device *dev, void *data) -{ - struct device_node *node = data; - - dev_dbg(dev, "%s: dev->of_node = 0x%p, node = 0x%p\n", - __func__, dev->of_node, node); - return (dev->of_node && dev->of_node == node); -} - -static int msm_audio_ssr_register(struct device *dev) -{ - struct device_node *np = dev->of_node; - struct snd_event_clients *ssr_clients = NULL; - struct device_node *node; - int ret; - int i; - - for (i = 0; ; i++) { - node = of_parse_phandle(np, "qcom,msm_audio_ssr_devs", i); - if (!node) - break; - snd_event_mstr_add_client(&ssr_clients, - msm_audio_ssr_compare, node); - } - - ret = snd_event_master_register(dev, &sm6150_ssr_ops, - ssr_clients, NULL); - if (!ret) - snd_event_notify(dev, SND_EVENT_UP); - - return ret; -} - -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - const char *mbhc_audio_jack_type = NULL; - int ret; - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "No platform supplied from device tree\n"); - return -EINVAL; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "parse card name failed, err:%d\n", - ret); - goto err; - } - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) { - dev_err(&pdev->dev, "parse audio routing failed, err:%d\n", - ret); - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - - ret = msm_init_aux_dev(pdev, card); - if (ret) - goto err; - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) - ret = -EINVAL; - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - dev_info(&pdev->dev, "Sound card %s registered\n", card->name); - - pdata->hph_en1_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!gpio_is_valid(pdata->hph_en1_gpio)) - pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!gpio_is_valid(pdata->hph_en1_gpio) && (!pdata->hph_en1_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en1-gpio", pdev->dev.of_node->full_name); - } - - pdata->hph_en0_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!gpio_is_valid(pdata->hph_en0_gpio)) - pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!gpio_is_valid(pdata->hph_en0_gpio) && (!pdata->hph_en0_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en0-gpio", pdev->dev.of_node->full_name); - } - - ret = msm_ext_prepare_hifi(pdata); - if (ret) { - dev_dbg(&pdev->dev, "msm_ext_prepare_hifi failed (%d)\n", - ret); - ret = 0; - } - - ret = of_property_read_string(pdev->dev.of_node, - "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type); - if (ret) { - dev_dbg(&pdev->dev, "Looking up %s property in node %s failed\n", - "qcom,mbhc-audio-jack-type", - pdev->dev.of_node->full_name); - dev_dbg(&pdev->dev, "Jack type properties set to default\n"); - ret = 0; - } else { - if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "This hardware has 4 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 5 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 6 pole jack"); - } else { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "Unknown value, set to default\n"); - } - } - - pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,pri-mi2s-gpios", 0); - pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,sec-mi2s-gpios", 0); - pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,tert-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quat-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quin-mi2s-gpios", 0); - - /* - * Parse US-Euro gpio info from DT. Report no error if us-euro - * entry is not found in DT file as some targets do not support - * US-Euro detection - */ - pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!pdata->us_euro_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,us-euro-gpios", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "%s detected\n", - "qcom,us-euro-gpios"); - wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - } - - if (wcd_mbhc_cfg.enable_usbc_analog) { - wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic; - - pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node, - "fsa4480-i2c-handle", 0); - if (!pdata->fsa_handle) - dev_err(&pdev->dev, - "property %s not detected in node %s\n", - "fsa4480-i2c-handle", - pdev->dev.of_node->full_name); - } - - msm_i2s_auxpcm_init(pdev); - if (!strnstr(card->name, "tavil", strlen(card->name)) && - !strnstr(card->name, "tasha", strlen(card->name))) { - pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic01-gpios", - 0); - pdata->dmic23_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic23-gpios", - 0); - } - - ret = msm_audio_ssr_register(&pdev->dev); - if (ret) - pr_err("%s: Registration with SND event FWK failed ret = %d\n", - __func__, ret); - -err: - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - snd_event_master_deregister(&pdev->dev); - msm_i2s_auxpcm_deinit(); - - return 0; -} - -static struct platform_driver sm6150_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = sm6150_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; -module_platform_driver(sm6150_asoc_machine_driver); - -MODULE_DESCRIPTION("ALSA SoC SM6150 Machine driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, sm6150_asoc_machine_of_match); diff --git a/techpack/audio/4.0/config/atollauto.conf b/techpack/audio/4.0/config/atollauto.conf deleted file mode 100644 index 0e1830105f71..000000000000 --- a/techpack/audio/4.0/config/atollauto.conf +++ /dev/null @@ -1,42 +0,0 @@ -CONFIG_PINCTRL_LPI=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_WCD9XXX_CODEC_CORE_V2=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_MSTR_CTRL=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_BOLERO=m -CONFIG_WSA_MACRO=m -CONFIG_VA_MACRO=m -CONFIG_RX_MACRO=m -CONFIG_TX_MACRO=m -CONFIG_SND_SOC_WCD_IRQ=m -CONFIG_SND_SOC_WCD937X=m -CONFIG_SND_SOC_WCD937X_SLAVE=m -CONFIG_SND_SOC_WCD938X=m -CONFIG_SND_SOC_WCD938X_SLAVE=m -CONFIG_SND_SOC_ATOLL=m -CONFIG_SND_EVENT=m -CONFIG_TDM_DISABLE=m -CONFIG_MI2S_DISABLE=m -CONFIG_AUXPCM_DISABLE=m -CONFIG_DIGITAL_CDC_RSC_MGR=m diff --git a/techpack/audio/4.0/config/atollautoconf.h b/techpack/audio/4.0/config/atollautoconf.h deleted file mode 100644 index eff6697f53a9..000000000000 --- a/techpack/audio/4.0/config/atollautoconf.h +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_WCD9XXX_CODEC_CORE_V2 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_RX_MACRO 1 -#define CONFIG_TX_MACRO 1 -#define CONFIG_SND_SOC_WCD_IRQ 1 -#define CONFIG_SND_SOC_WCD937X 1 -#define CONFIG_SND_SOC_WCD937X_SLAVE 1 -#define CONFIG_SND_SOC_WCD938X 1 -#define CONFIG_SND_SOC_WCD938X_SLAVE 1 -#define CONFIG_SND_SOC_ATOLL 1 -#define CONFIG_SND_EVENT 1 -#define CONFIG_TDM_DISABLE 1 -#define CONFIG_MI2S_DISABLE 1 -#define CONFIG_AUXPCM_DISABLE 1 -#define CONFIG_DIGITAL_CDC_RSC_MGR 1 diff --git a/techpack/audio/4.0/config/gvmauto.conf b/techpack/audio/4.0/config/gvmauto.conf deleted file mode 100644 index 35b70b9f5e46..000000000000 --- a/techpack/audio/4.0/config/gvmauto.conf +++ /dev/null @@ -1,15 +0,0 @@ -CONFIG_MSM_QDSP6_APRV2_VM=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_QDSP6V2_VM=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_SND_EVENT=m diff --git a/techpack/audio/4.0/config/gvmautoconf.h b/techpack/audio/4.0/config/gvmautoconf.h deleted file mode 100644 index 84a8f1df7c6f..000000000000 --- a/techpack/audio/4.0/config/gvmautoconf.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_MSM_QDSP6_APRV2_VM 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_VM 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_SND_EVENT 1 diff --git a/techpack/audio/4.0/config/konaauto.conf b/techpack/audio/4.0/config/konaauto.conf deleted file mode 100644 index 03e054150385..000000000000 --- a/techpack/audio/4.0/config/konaauto.conf +++ /dev/null @@ -1,38 +0,0 @@ -export CONFIG_PINCTRL_LPI=m -export CONFIG_PINCTRL_WCD=m -export CONFIG_AUDIO_EXT_CLK=m -export CONFIG_SND_SOC_WCD9XXX_V2=m -export CONFIG_SND_SOC_WCD_MBHC=m -export CONFIG_SND_SOC_WSA881X=m -export CONFIG_WCD9XXX_CODEC_CORE_V2=m -export CONFIG_MSM_CDC_PINCTRL=m -export CONFIG_MSM_QDSP6V2_CODECS=m -export CONFIG_MSM_ULTRASOUND=m -export CONFIG_MSM_QDSP6_APRV2_RPMSG=m -export CONFIG_MSM_ADSP_LOADER=m -export CONFIG_REGMAP_SWR=m -export CONFIG_MSM_QDSP6_SSR=m -export CONFIG_MSM_QDSP6_PDR=m -export CONFIG_MSM_QDSP6_NOTIFIER=m -export CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -export CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -export CONFIG_SOUNDWIRE=m -export CONFIG_SOUNDWIRE_MSTR_CTRL=m -export CONFIG_SND_SOC_QDSP6V2=m -export CONFIG_SND_SOC_WCD_MBHC_ADC=m -export CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -export CONFIG_QTI_PP=m -export CONFIG_SND_HWDEP_ROUTING=m -export CONFIG_SND_SOC_MSM_STUB=m -export CONFIG_MSM_AVTIMER=m -export CONFIG_SND_SOC_BOLERO=m -export CONFIG_WSA_MACRO=m -export CONFIG_VA_MACRO=m -export CONFIG_RX_MACRO=m -export CONFIG_TX_MACRO=m -export CONFIG_SND_SOC_WCD_IRQ=m -export CONFIG_SND_SOC_WCD938X=m -export CONFIG_SND_SOC_WCD938X_SLAVE=m -export CONFIG_SND_SOC_KONA=m -export CONFIG_SND_EVENT=m -export CONFIG_VOICE_MHI=m diff --git a/techpack/audio/4.0/config/konaautoconf.h b/techpack/audio/4.0/config/konaautoconf.h deleted file mode 100644 index f93223641b15..000000000000 --- a/techpack/audio/4.0/config/konaautoconf.h +++ /dev/null @@ -1,42 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_WCD9XXX_CODEC_CORE_V2 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_RX_MACRO 1 -#define CONFIG_TX_MACRO 1 -#define CONFIG_SND_SOC_WCD_IRQ 1 -#define CONFIG_SND_SOC_WCD938X 1 -#define CONFIG_SND_SOC_WCD938X_SLAVE 1 -#define CONFIG_SND_SOC_KONA 1 -#define CONFIG_SND_EVENT 1 -#define CONFIG_VOICE_MHI 1 diff --git a/techpack/audio/4.0/config/litoauto.conf b/techpack/audio/4.0/config/litoauto.conf deleted file mode 100644 index 0bbe4f742e9a..000000000000 --- a/techpack/audio/4.0/config/litoauto.conf +++ /dev/null @@ -1,36 +0,0 @@ -CONFIG_PINCTRL_LPI=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_WCD9XXX_CODEC_CORE_V2=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_MSTR_CTRL=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_BOLERO=m -CONFIG_WSA_MACRO=m -CONFIG_VA_MACRO=m -CONFIG_RX_MACRO=m -CONFIG_TX_MACRO=m -CONFIG_SND_SOC_WCD_IRQ=m -CONFIG_SND_SOC_WCD938X=m -CONFIG_SND_SOC_WCD938X_SLAVE=m -CONFIG_SND_SOC_LITO=m -CONFIG_SND_EVENT=m diff --git a/techpack/audio/4.0/config/litoautoconf.h b/techpack/audio/4.0/config/litoautoconf.h deleted file mode 100644 index 2d19f2dab9ab..000000000000 --- a/techpack/audio/4.0/config/litoautoconf.h +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_WCD9XXX_CODEC_CORE_V2 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_RX_MACRO 1 -#define CONFIG_TX_MACRO 1 -#define CONFIG_SND_SOC_WCD_IRQ 1 -#define CONFIG_SND_SOC_WCD938X 1 -#define CONFIG_SND_SOC_WCD938X_SLAVE 1 -#define CONFIG_SND_SOC_LITO 1 -#define CONFIG_SND_EVENT 1 diff --git a/techpack/audio/4.0/config/qcs405auto.conf b/techpack/audio/4.0/config/qcs405auto.conf deleted file mode 100644 index afa8140b6e04..000000000000 --- a/techpack/audio/4.0/config/qcs405auto.conf +++ /dev/null @@ -1,39 +0,0 @@ -CONFIG_PINCTRL_LPI=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD9335=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_SND_SOC_CSRA66X0=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_QCS405=m -CONFIG_SND_SOC_BOLERO=m -CONFIG_WSA_MACRO=m -CONFIG_VA_MACRO=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_MSTR_CTRL=m -CONFIG_SND_SOC_WCD_MBHC_LEGACY=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_AFE_HWDEP=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_MSM_MDF=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_SND_SOC_EP92=m -CONFIG_USE_Q6_32CH_SUPPORT=m diff --git a/techpack/audio/4.0/config/qcs405autoconf.h b/techpack/audio/4.0/config/qcs405autoconf.h deleted file mode 100644 index 0a2e2865aa48..000000000000 --- a/techpack/audio/4.0/config/qcs405autoconf.h +++ /dev/null @@ -1,43 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD9335 1 -#define CONFIG_SND_SOC_CSRA66X0 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_QCS405 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_LEGACY 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_AFE_HWDEP 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_MDF 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_SND_SOC_EP92 1 -#define CONFIG_USE_Q6_32CH_SUPPORT 1 diff --git a/techpack/audio/4.0/config/sa8155auto.conf b/techpack/audio/4.0/config/sa8155auto.conf deleted file mode 100644 index bf5b9cdae15a..000000000000 --- a/techpack/audio/4.0/config/sa8155auto.conf +++ /dev/null @@ -1,15 +0,0 @@ -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_SND_EVENT=m diff --git a/techpack/audio/4.0/config/sa8155autoconf.h b/techpack/audio/4.0/config/sa8155autoconf.h deleted file mode 100644 index 167451639a1e..000000000000 --- a/techpack/audio/4.0/config/sa8155autoconf.h +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_SND_EVENT 1 diff --git a/techpack/audio/4.0/config/sdxpoorwillsauto.conf b/techpack/audio/4.0/config/sdxpoorwillsauto.conf deleted file mode 100644 index dee34a08be5d..000000000000 --- a/techpack/audio/4.0/config/sdxpoorwillsauto.conf +++ /dev/null @@ -1,29 +0,0 @@ -CONFIG_PINCTRL_WCD=y -CONFIG_SND_SOC_WCD934X=y -CONFIG_AUDIO_EXT_CLK=y -CONFIG_SND_SOC_WCD9XXX_V2=y -CONFIG_SND_SOC_WCD_MBHC=y -CONFIG_SND_SOC_WSA881X=y -CONFIG_SND_SOC_WCD_DSP_MGR=y -CONFIG_SND_SOC_WCD934X=y -CONFIG_SND_SOC_WCD934X_MBHC=y -CONFIG_SND_SOC_WCD934X_DSD=y -CONFIG_MSM_QDSP6V2_CODECS=y -CONFIG_MSM_QDSP6_APRV3_GLINK=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_MSM_ADSP_LOADER=y -CONFIG_REGMAP_SWR=y -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_SND_SOC_POORWILLS=y -CONFIG_SOUNDWIRE=y -CONFIG_SOUNDWIRE_WCD_CTRL=y -CONFIG_SND_SOC_QDSP6V2=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_MSM_CDC_PINCTRL=y -CONFIG_WCD9XXX_CODEC_CORE=y -CONFIG_SND_SOC_WCD_MBHC_ADC=y -CONFIG_QTI_PP=y -CONFIG_SND_HWDEP_ROUTING=y -CONFIG_SND_SOC_MACHINE_SDXPOORWILLS=y -CONFIG_SND_SOC_MSM_STUB=y diff --git a/techpack/audio/4.0/config/sdxpoorwillsautoconf.h b/techpack/audio/4.0/config/sdxpoorwillsautoconf.h deleted file mode 100644 index 49bbe41c0bec..000000000000 --- a/techpack/audio/4.0/config/sdxpoorwillsautoconf.h +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_QDSP6_APRV3_GLINK 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_SND_SOC_POORWILLS 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_WCD_CTRL 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_SND_SOC_MACHINE_SDXPOORWILLS 1 -#define CONFIG_SND_SOC_MSM_STUB 1 diff --git a/techpack/audio/4.0/config/sm6150auto.conf b/techpack/audio/4.0/config/sm6150auto.conf deleted file mode 100644 index 0ced07c97140..000000000000 --- a/techpack/audio/4.0/config/sm6150auto.conf +++ /dev/null @@ -1,50 +0,0 @@ -CONFIG_PINCTRL_WCD=m -CONFIG_PINCTRL_LPI=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD_DSP_MGR=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_SM6150=m -CONFIG_MSM_GLINK_SPI_XPRT=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_MSTR_CTRL=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_SND_SOC_BOLERO=m -CONFIG_WSA_MACRO=m -CONFIG_VA_MACRO=m -CONFIG_RX_MACRO=m -CONFIG_TX_MACRO=m -CONFIG_SND_SOC_WCD_IRQ=m -CONFIG_SND_SOC_WCD937X=m -CONFIG_SND_SOC_WCD937X_SLAVE=m -CONFIG_SND_SOC_WCD938X=m -CONFIG_SND_SOC_WCD938X_SLAVE=m -CONFIG_SND_EVENT=m diff --git a/techpack/audio/4.0/config/sm6150autoconf.h b/techpack/audio/4.0/config/sm6150autoconf.h deleted file mode 100644 index 5b2bb751bc35..000000000000 --- a/techpack/audio/4.0/config/sm6150autoconf.h +++ /dev/null @@ -1,55 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_SM6150 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_RX_MACRO 1 -#define CONFIG_TX_MACRO 1 -#define CONFIG_SND_SOC_WCD_IRQ 1 -#define CONFIG_SND_SOC_WCD937X 1 -#define CONFIG_SND_SOC_WCD937X_SLAVE 1 -#define CONFIG_SND_SOC_WCD938X 1 -#define CONFIG_SND_SOC_WCD938X_SLAVE 1 -#define CONFIG_SND_EVENT 1 diff --git a/techpack/audio/4.0/config/sm8150auto.conf b/techpack/audio/4.0/config/sm8150auto.conf deleted file mode 100644 index f00155f4b066..000000000000 --- a/techpack/audio/4.0/config/sm8150auto.conf +++ /dev/null @@ -1,40 +0,0 @@ -CONFIG_PINCTRL_WCD=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD9360=m -CONFIG_SND_SOC_WCD_DSP_MGR=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_SND_SOC_WCD_CPE=m -CONFIG_SOUNDWIRE_WCD_CTRL=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_SM8150=m -CONFIG_MSM_GLINK_SPI_XPRT=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_SOUNDWIRE=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m diff --git a/techpack/audio/4.0/config/sm8150autoconf.h b/techpack/audio/4.0/config/sm8150autoconf.h deleted file mode 100644 index 0c19fd39f9c3..000000000000 --- a/techpack/audio/4.0/config/sm8150autoconf.h +++ /dev/null @@ -1,44 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD9360 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_SM8150 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_WCD_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 diff --git a/techpack/audio/4.0/dsp/Android.mk b/techpack/audio/4.0/dsp/Android.mk deleted file mode 100644 index 172fbee3f895..000000000000 --- a/techpack/audio/4.0/dsp/Android.mk +++ /dev/null @@ -1,104 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform, kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform, lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform, atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) atoll kona lito),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=q6_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6.ko -LOCAL_MODULE_KBUILD_NAME := q6_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_adsp_loader.ko -LOCAL_MODULE_KBUILD_NAME := adsp_loader_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_notifier.ko -LOCAL_MODULE_KBUILD_NAME := q6_notifier_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -############################################################ -ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_usf.ko -LOCAL_MODULE_KBUILD_NAME := usf_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################## -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_pdr.ko -LOCAL_MODULE_KBUILD_NAME := q6_pdr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/dsp/Kbuild b/techpack/audio/4.0/dsp/Kbuild deleted file mode 100644 index ed00b157a4f2..000000000000 --- a/techpack/audio/4.0/dsp/Kbuild +++ /dev/null @@ -1,255 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME), ) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.19 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - ifdef CONFIG_SND_SOC_SA8155 - include $(AUDIO_ROOT)/config/sa8155auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sa8155autoconf.h - else - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif - ifeq ($(CONFIG_QTI_GVM), y) - include $(AUDIO_ROOT)/config/gvmauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h - endif -endif - - - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ QDSP6V2 ############ - -ifdef CONFIG_SND_SOC_MSM_QDSP6V2_INTF - Q6_OBJS += msm-audio-event-notify.o - Q6_OBJS += audio_calibration.o - Q6_OBJS += audio_cal_utils.o - Q6_OBJS += q6adm.o - Q6_OBJS += q6afe.o - Q6_OBJS += q6asm.o - Q6_OBJS += q6audio-v2.o - Q6_OBJS += q6voice.o - Q6_OBJS += q6core.o - Q6_OBJS += q6common.o - Q6_OBJS += rtac.o - Q6_OBJS += q6lsm.o - Q6_OBJS += adsp_err.o - Q6_OBJS += msm_audio_ion.o - Q6_OBJS += avtimer.o - Q6_OBJS += q6_init.o -endif - -ifdef CONFIG_SND_SOC_MSM_QDSP6V2_VM - Q6_OBJS += msm-audio-event-notify.o - Q6_OBJS += audio_calibration.o - Q6_OBJS += audio_cal_utils.o - Q6_OBJS += q6adm.o - Q6_OBJS += q6afe.o - Q6_OBJS += q6asm.o - Q6_OBJS += q6audio-v2.o - Q6_OBJS += q6voice.o - Q6_OBJS += q6core.o - Q6_OBJS += q6common.o - Q6_OBJS += rtac.o - Q6_OBJS += q6lsm.o - Q6_OBJS += adsp_err.o - Q6_OBJS += msm_audio_ion_vm.o - Q6_OBJS += avtimer.o - Q6_OBJS += q6_init.o -endif - -ifdef CONFIG_XT_LOGGING - Q6_OBJS += sp_params.o -endif - -ifdef CONFIG_WCD9XXX_CODEC_CORE - Q6_OBJS += audio_slimslave.o -endif - -ifdef CONFIG_DTS_SRS_TM - Q6_OBJS += msm-dts-srs-tm-config.o -endif - -ifdef CONFIG_AFE_HWDEP - Q6_OBJS += q6afecal-hwdep.o -endif - -ifdef CONFIG_MSM_ADSP_LOADER -ADSP_LOADER_OBJS += adsp-loader.o -endif - -ifdef CONFIG_MSM_QDSP6_PDR -QDSP6_PDR_OBJS += audio_pdr.o -endif - -ifdef CONFIG_MSM_QDSP6_NOTIFIER -QDSP6_NOTIFIER_OBJS += audio_notifier.o audio_ssr.o -endif - -ifdef CONFIG_MSM_ULTRASOUND -USF_OBJS += usf.o usfcdev.o q6usm.o -endif - -ifdef CONFIG_MSM_MDF - Q6_OBJS += msm_mdf.o -endif - -ifdef CONFIG_VOICE_MHI - Q6_OBJS += voice_mhi.o -endif - -ifdef CONFIG_DIGITAL_CDC_RSC_MGR - Q6_OBJS += digital-cdc-rsc-mgr.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -# If the module name is not "wlan", then the define MULTI_IF_NAME to be the -# same a the QCA CHIP name. The host driver will then append MULTI_IF_NAME to -# any string that must be unique for all instances of the driver on the system. -# This allows multiple instances of the driver with different module names. -# If the module name is wlan, leave MULTI_IF_NAME undefined and the code will -# treat the driver as the primary driver. -ifneq ($(MODNAME), qdsp6v2) -CHIP_NAME ?= $(MODNAME) -CDEFINES += -DMULTI_IF_NAME=\"$(CHIP_NAME)\" -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/ipc/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers - endif -endif - -ifeq ($(KERNEL_BUILD), 1) - obj-y += codecs/ -endif - -obj-$(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) += q6_dlkm.o -q6_dlkm-y := $(Q6_OBJS) - -obj-$(CONFIG_SND_SOC_MSM_QDSP6V2_VM) += q6_dlkm.o -q6_dlkm-y := $(Q6_OBJS) - -obj-$(CONFIG_MSM_ULTRASOUND) += usf_dlkm.o -usf_dlkm-y := $(USF_OBJS) - -obj-$(CONFIG_MSM_ADSP_LOADER) += adsp_loader_dlkm.o -adsp_loader_dlkm-y := $(ADSP_LOADER_OBJS) - -obj-$(CONFIG_MSM_QDSP6_PDR) += q6_pdr_dlkm.o -q6_pdr_dlkm-y := $(QDSP6_PDR_OBJS) - -obj-$(CONFIG_MSM_QDSP6_NOTIFIER) += q6_notifier_dlkm.o -q6_notifier_dlkm-y := $(QDSP6_NOTIFIER_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/dsp/adsp-loader.c b/techpack/audio/4.0/dsp/adsp-loader.c deleted file mode 100644 index c0dbe3f4f438..000000000000 --- a/techpack/audio/4.0/dsp/adsp-loader.c +++ /dev/null @@ -1,459 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2014, 2017-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define Q6_PIL_GET_DELAY_MS 100 -#define BOOT_CMD 1 -#define SSR_RESET_CMD 1 -#define IMAGE_UNLOAD_CMD 0 -#define MAX_FW_IMAGES 4 - -static ssize_t adsp_boot_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, size_t count); - -static ssize_t adsp_ssr_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, size_t count); - -struct adsp_loader_private { - void *pil_h; - struct kobject *boot_adsp_obj; - struct attribute_group *attr_group; - char *adsp_fw_name; -}; - -static struct kobj_attribute adsp_boot_attribute = - __ATTR(boot, 0220, NULL, adsp_boot_store); - -static struct kobj_attribute adsp_ssr_attribute = - __ATTR(ssr, 0220, NULL, adsp_ssr_store); - -static struct attribute *attrs[] = { - &adsp_boot_attribute.attr, - &adsp_ssr_attribute.attr, - NULL, -}; - -static struct work_struct adsp_ldr_work; -static struct platform_device *adsp_private; -static void adsp_loader_unload(struct platform_device *pdev); - -static void adsp_load_fw(struct work_struct *adsp_ldr_work) -{ - struct platform_device *pdev = adsp_private; - struct adsp_loader_private *priv = NULL; - const char *adsp_dt = "qcom,adsp-state"; - int rc = 0; - u32 adsp_state; - const char *img_name; - - if (!pdev) { - dev_err(&pdev->dev, "%s: Platform device null\n", __func__); - goto fail; - } - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, - "%s: Device tree information missing\n", __func__); - goto fail; - } - - rc = of_property_read_u32(pdev->dev.of_node, adsp_dt, &adsp_state); - if (rc) { - dev_err(&pdev->dev, - "%s: ADSP state = %x\n", __func__, adsp_state); - goto fail; - } - - rc = of_property_read_string(pdev->dev.of_node, - "qcom,proc-img-to-load", - &img_name); - - if (rc) { - dev_dbg(&pdev->dev, - "%s: loading default image ADSP\n", __func__); - goto load_adsp; - } - if (!strcmp(img_name, "modem")) { - /* adsp_state always returns "0". So load modem image based on - * apr_modem_state to prevent loading of image twice - */ - adsp_state = apr_get_modem_state(); - if (adsp_state == APR_SUBSYS_DOWN) { - priv = platform_get_drvdata(pdev); - if (!priv) { - dev_err(&pdev->dev, - " %s: Private data get failed\n", __func__); - goto fail; - } - - priv->pil_h = subsystem_get("modem"); - if (IS_ERR(priv->pil_h)) { - dev_err(&pdev->dev, "%s: pil get failed,\n", - __func__); - goto fail; - } - - /* Set the state of the ADSP in APR driver */ - apr_set_modem_state(APR_SUBSYS_LOADED); - } else if (adsp_state == APR_SUBSYS_LOADED) { - dev_dbg(&pdev->dev, - "%s: MDSP state = %x\n", __func__, adsp_state); - } - - dev_dbg(&pdev->dev, "%s: Q6/MDSP image is loaded\n", __func__); - return; - } - -load_adsp: - { - adsp_state = apr_get_q6_state(); - if (adsp_state == APR_SUBSYS_DOWN) { - priv = platform_get_drvdata(pdev); - if (!priv) { - dev_err(&pdev->dev, - " %s: Private data get failed\n", __func__); - goto fail; - } - if (!priv->adsp_fw_name) { - dev_dbg(&pdev->dev, "%s: Load default ADSP\n", - __func__); - priv->pil_h = subsystem_get("adsp"); - } else { - dev_dbg(&pdev->dev, "%s: Load ADSP with fw name %s\n", - __func__, priv->adsp_fw_name); - priv->pil_h = subsystem_get_with_fwname("adsp", priv->adsp_fw_name); - } - - if (IS_ERR(priv->pil_h)) { - dev_err(&pdev->dev, "%s: pil get failed,\n", - __func__); - goto fail; - } - } else if (adsp_state == APR_SUBSYS_LOADED) { - dev_dbg(&pdev->dev, - "%s: ADSP state = %x\n", __func__, adsp_state); - } - - dev_dbg(&pdev->dev, "%s: Q6/ADSP image is loaded\n", __func__); - return; - } -fail: - dev_err(&pdev->dev, "%s: Q6 image loading failed\n", __func__); -} - -static void adsp_loader_do(struct platform_device *pdev) -{ - schedule_work(&adsp_ldr_work); -} - -static ssize_t adsp_ssr_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - int ssr_command = 0; - struct subsys_device *adsp_dev = NULL; - struct platform_device *pdev = adsp_private; - struct adsp_loader_private *priv = NULL; - int rc; - - dev_dbg(&pdev->dev, "%s: going to call adsp ssr\n ", __func__); - - if (kstrtoint(buf, 10, &ssr_command) < 0) - return -EINVAL; - - if (ssr_command != SSR_RESET_CMD) - return -EINVAL; - - priv = platform_get_drvdata(pdev); - if (!priv) - return -EINVAL; - - adsp_dev = (struct subsys_device *)priv->pil_h; - if (!adsp_dev) - return -EINVAL; - - dev_err(&pdev->dev, "requesting for ADSP restart\n"); - - /* subsystem_restart_dev has worker queue to handle */ - rc = subsystem_restart_dev(adsp_dev); - if (rc) { - dev_err(&pdev->dev, "subsystem_restart_dev failed\n"); - return rc; - } - - dev_dbg(&pdev->dev, "ADSP restarted\n"); - return count; -} - -static ssize_t adsp_boot_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - int boot = 0; - - if (sscanf(buf, "%du", &boot) != 1) { - pr_err("%s: failed to read boot info from string\n", __func__); - return -EINVAL; - } - - if (boot == BOOT_CMD) { - pr_debug("%s: going to call adsp_loader_do\n", __func__); - adsp_loader_do(adsp_private); - } else if (boot == IMAGE_UNLOAD_CMD) { - pr_debug("%s: going to call adsp_unloader\n", __func__); - adsp_loader_unload(adsp_private); - } - return count; -} - -static void adsp_loader_unload(struct platform_device *pdev) -{ - struct adsp_loader_private *priv = NULL; - - priv = platform_get_drvdata(pdev); - - if (!priv) - return; - - if (priv->pil_h) { - dev_dbg(&pdev->dev, "%s: calling subsystem put\n", __func__); - subsystem_put(priv->pil_h); - priv->pil_h = NULL; - } -} - -static int adsp_loader_init_sysfs(struct platform_device *pdev) -{ - int ret = -EINVAL; - struct adsp_loader_private *priv = NULL; - - adsp_private = NULL; - priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); - if (!priv) { - ret = -ENOMEM; - return ret; - } - - platform_set_drvdata(pdev, priv); - - priv->pil_h = NULL; - priv->boot_adsp_obj = NULL; - priv->attr_group = devm_kzalloc(&pdev->dev, - sizeof(*(priv->attr_group)), - GFP_KERNEL); - if (!priv->attr_group) { - ret = -ENOMEM; - goto error_return; - } - - priv->attr_group->attrs = attrs; - - priv->boot_adsp_obj = kobject_create_and_add("boot_adsp", kernel_kobj); - if (!priv->boot_adsp_obj) { - dev_err(&pdev->dev, "%s: sysfs create and add failed\n", - __func__); - ret = -ENOMEM; - goto error_return; - } - - ret = sysfs_create_group(priv->boot_adsp_obj, priv->attr_group); - if (ret) { - dev_err(&pdev->dev, "%s: sysfs create group failed %d\n", - __func__, ret); - goto error_return; - } - - adsp_private = pdev; - - return 0; - -error_return: - - if (priv->boot_adsp_obj) { - kobject_del(priv->boot_adsp_obj); - priv->boot_adsp_obj = NULL; - } - - return ret; -} - -static int adsp_loader_remove(struct platform_device *pdev) -{ - struct adsp_loader_private *priv = NULL; - - priv = platform_get_drvdata(pdev); - - if (!priv) - return 0; - - if (priv->pil_h) { - subsystem_put(priv->pil_h); - priv->pil_h = NULL; - } - - if (priv->boot_adsp_obj) { - sysfs_remove_group(priv->boot_adsp_obj, priv->attr_group); - kobject_del(priv->boot_adsp_obj); - priv->boot_adsp_obj = NULL; - } - - return 0; -} - -static int adsp_loader_probe(struct platform_device *pdev) -{ - struct adsp_loader_private *priv = NULL; - struct nvmem_cell *cell; - size_t len; - u32 *buf; - const char **adsp_fw_name_array = NULL; - int adsp_fw_cnt; - u32* adsp_fw_bit_values = NULL; - int i; - int fw_name_size; - u32 adsp_var_idx = 0; - int ret = 0; - - ret = adsp_loader_init_sysfs(pdev); - if (ret != 0) { - dev_err(&pdev->dev, "%s: Error in initing sysfs\n", __func__); - return ret; - } - - priv = platform_get_drvdata(pdev); - /* get adsp variant idx */ - cell = nvmem_cell_get(&pdev->dev, "adsp_variant"); - if (IS_ERR_OR_NULL(cell)) { - dev_dbg(&pdev->dev, "%s: FAILED to get nvmem cell \n", __func__); - goto wqueue; - } - buf = nvmem_cell_read(cell, &len); - nvmem_cell_put(cell); - if (IS_ERR_OR_NULL(buf)) { - dev_dbg(&pdev->dev, "%s: FAILED to read nvmem cell \n", __func__); - goto wqueue; - } - if (len <= 0 || len > sizeof(u32)) { - dev_dbg(&pdev->dev, "%s: nvmem cell length out of range: %d\n", - __func__, len); - kfree(buf); - goto wqueue; - } - memcpy(&adsp_var_idx, buf, len); - kfree(buf); - - /* Get count of fw images */ - adsp_fw_cnt = of_property_count_strings(pdev->dev.of_node, - "adsp-fw-names"); - if (adsp_fw_cnt <= 0 || adsp_fw_cnt > MAX_FW_IMAGES) { - dev_dbg(&pdev->dev, "%s: Invalid number of fw images %d", - __func__, adsp_fw_cnt); - goto wqueue; - } - - adsp_fw_bit_values = devm_kzalloc(&pdev->dev, - adsp_fw_cnt * sizeof(u32), GFP_KERNEL); - if (!adsp_fw_bit_values) - goto wqueue; - - /* Read bit values corresponding to each firmware image entry */ - ret = of_property_read_u32_array(pdev->dev.of_node, - "adsp-fw-bit-values", - adsp_fw_bit_values, - adsp_fw_cnt); - if (ret) { - dev_dbg(&pdev->dev, "%s: unable to read fw-bit-values\n", - __func__); - goto wqueue; - } - - adsp_fw_name_array = devm_kzalloc(&pdev->dev, - adsp_fw_cnt * sizeof(char *), GFP_KERNEL); - if (!adsp_fw_name_array) - goto wqueue; - - /* Read ADSP firmware image names */ - ret = of_property_read_string_array(pdev->dev.of_node, - "adsp-fw-names", - adsp_fw_name_array, - adsp_fw_cnt); - if (ret < 0) { - dev_dbg(&pdev->dev, "%s: unable to read fw-names\n", - __func__); - goto wqueue; - } - - for (i = 0; i < adsp_fw_cnt; i++) { - if (adsp_fw_bit_values[i] == adsp_var_idx) { - fw_name_size = strlen(adsp_fw_name_array[i]) + 1; - priv->adsp_fw_name = devm_kzalloc(&pdev->dev, - fw_name_size, - GFP_KERNEL); - if (!priv->adsp_fw_name) - goto wqueue; - strlcpy(priv->adsp_fw_name, adsp_fw_name_array[i], - fw_name_size); - break; - } - } -wqueue: - INIT_WORK(&adsp_ldr_work, adsp_load_fw); - if (adsp_fw_bit_values) - devm_kfree(&pdev->dev, adsp_fw_bit_values); - if (adsp_fw_name_array) - devm_kfree(&pdev->dev, adsp_fw_name_array); - return 0; - -} - -static const struct of_device_id adsp_loader_dt_match[] = { - { .compatible = "qcom,adsp-loader" }, - { } -}; -MODULE_DEVICE_TABLE(of, adsp_loader_dt_match); - -static struct platform_driver adsp_loader_driver = { - .driver = { - .name = "adsp-loader", - .owner = THIS_MODULE, - .of_match_table = adsp_loader_dt_match, - .suppress_bind_attrs = true, - }, - .probe = adsp_loader_probe, - .remove = adsp_loader_remove, -}; - -static int __init adsp_loader_init(void) -{ - return platform_driver_register(&adsp_loader_driver); -} -module_init(adsp_loader_init); - -static void __exit adsp_loader_exit(void) -{ - platform_driver_unregister(&adsp_loader_driver); -} -module_exit(adsp_loader_exit); - -MODULE_DESCRIPTION("ADSP Loader module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/adsp_err.c b/techpack/audio/4.0/dsp/adsp_err.c deleted file mode 100644 index f2401569ccbe..000000000000 --- a/techpack/audio/4.0/dsp/adsp_err.c +++ /dev/null @@ -1,165 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include - - -/* ERROR STRING */ -/* Success. The operation completed with no errors. */ -#define ADSP_EOK_STR "ADSP_EOK" -/* General failure. */ -#define ADSP_EFAILED_STR "ADSP_EFAILED" -/* Bad operation parameter. */ -#define ADSP_EBADPARAM_STR "ADSP_EBADPARAM" -/* Unsupported routine or operation. */ -#define ADSP_EUNSUPPORTED_STR "ADSP_EUNSUPPORTED" -/* Unsupported version. */ -#define ADSP_EVERSION_STR "ADSP_EVERSION" -/* Unexpected problem encountered. */ -#define ADSP_EUNEXPECTED_STR "ADSP_EUNEXPECTED" -/* Unhandled problem occurred. */ -#define ADSP_EPANIC_STR "ADSP_EPANIC" -/* Unable to allocate resource. */ -#define ADSP_ENORESOURCE_STR "ADSP_ENORESOURCE" -/* Invalid handle. */ -#define ADSP_EHANDLE_STR "ADSP_EHANDLE" -/* Operation is already processed. */ -#define ADSP_EALREADY_STR "ADSP_EALREADY" -/* Operation is not ready to be processed. */ -#define ADSP_ENOTREADY_STR "ADSP_ENOTREADY" -/* Operation is pending completion. */ -#define ADSP_EPENDING_STR "ADSP_EPENDING" -/* Operation could not be accepted or processed. */ -#define ADSP_EBUSY_STR "ADSP_EBUSY" -/* Operation aborted due to an error. */ -#define ADSP_EABORTED_STR "ADSP_EABORTED" -/* Operation preempted by a higher priority. */ -#define ADSP_EPREEMPTED_STR "ADSP_EPREEMPTED" -/* Operation requests intervention to complete. */ -#define ADSP_ECONTINUE_STR "ADSP_ECONTINUE" -/* Operation requests immediate intervention to complete. */ -#define ADSP_EIMMEDIATE_STR "ADSP_EIMMEDIATE" -/* Operation is not implemented. */ -#define ADSP_ENOTIMPL_STR "ADSP_ENOTIMPL" -/* Operation needs more data or resources. */ -#define ADSP_ENEEDMORE_STR "ADSP_ENEEDMORE" -/* Operation does not have memory. */ -#define ADSP_ENOMEMORY_STR "ADSP_ENOMEMORY" -/* Item does not exist. */ -#define ADSP_ENOTEXIST_STR "ADSP_ENOTEXIST" -/* Unexpected error code. */ -#define ADSP_ERR_MAX_STR "ADSP_ERR_MAX" - -#if IS_ENABLED(CONFIG_SND_SOC_QDSP_DEBUG) -static bool adsp_err_panic; - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_adsp_err; - -static ssize_t adsp_err_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char cmd; - - if (copy_from_user(&cmd, ubuf, 1)) - return -EFAULT; - - if (cmd == '0') - adsp_err_panic = false; - else - adsp_err_panic = true; - - return cnt; -} - -static const struct file_operations adsp_err_debug_ops = { - .write = adsp_err_debug_write, -}; -#endif -#endif - -struct adsp_err_code { - int lnx_err_code; - char *adsp_err_str; -}; - - -static struct adsp_err_code adsp_err_code_info[ADSP_ERR_MAX+1] = { - { 0, ADSP_EOK_STR}, - { -ENOTRECOVERABLE, ADSP_EFAILED_STR}, - { -EINVAL, ADSP_EBADPARAM_STR}, - { -EOPNOTSUPP, ADSP_EUNSUPPORTED_STR}, - { -ENOPROTOOPT, ADSP_EVERSION_STR}, - { -ENOTRECOVERABLE, ADSP_EUNEXPECTED_STR}, - { -ENOTRECOVERABLE, ADSP_EPANIC_STR}, - { -ENOSPC, ADSP_ENORESOURCE_STR}, - { -EBADR, ADSP_EHANDLE_STR}, - { -EALREADY, ADSP_EALREADY_STR}, - { -EPERM, ADSP_ENOTREADY_STR}, - { -EINPROGRESS, ADSP_EPENDING_STR}, - { -EBUSY, ADSP_EBUSY_STR}, - { -ECANCELED, ADSP_EABORTED_STR}, - { -EAGAIN, ADSP_EPREEMPTED_STR}, - { -EAGAIN, ADSP_ECONTINUE_STR}, - { -EAGAIN, ADSP_EIMMEDIATE_STR}, - { -EAGAIN, ADSP_ENOTIMPL_STR}, - { -ENODATA, ADSP_ENEEDMORE_STR}, - { -EADV, ADSP_ERR_MAX_STR}, - { -ENOMEM, ADSP_ENOMEMORY_STR}, - { -ENODEV, ADSP_ENOTEXIST_STR}, - { -EADV, ADSP_ERR_MAX_STR}, -}; - -#if IS_ENABLED(CONFIG_SND_SOC_QDSP_DEBUG) -static inline void adsp_err_check_panic(u32 adsp_error) -{ - if (adsp_err_panic && adsp_error != ADSP_EALREADY) - panic("%s: encounter adsp_err=0x%x\n", __func__, adsp_error); -} -#else -static inline void adsp_err_check_panic(u32 adsp_error) {} -#endif - -int adsp_err_get_lnx_err_code(u32 adsp_error) -{ - adsp_err_check_panic(adsp_error); - - if (adsp_error > ADSP_ERR_MAX) - return adsp_err_code_info[ADSP_ERR_MAX].lnx_err_code; - else - return adsp_err_code_info[adsp_error].lnx_err_code; -} - -char *adsp_err_get_err_str(u32 adsp_error) -{ - if (adsp_error > ADSP_ERR_MAX) - return adsp_err_code_info[ADSP_ERR_MAX].adsp_err_str; - else - return adsp_err_code_info[adsp_error].adsp_err_str; -} - -#if IS_ENABLED(CONFIG_SND_SOC_QDSP_DEBUG) && defined(CONFIG_DEBUG_FS) -int __init adsp_err_init(void) -{ - - - debugfs_adsp_err = debugfs_create_file("msm_adsp_audio_debug", - S_IFREG | 0444, NULL, NULL, - &adsp_err_debug_ops); - - return 0; -} -#else -int __init adsp_err_init(void) { return 0; } - -#endif - -void adsp_err_exit(void) -{ - return; -} diff --git a/techpack/audio/4.0/dsp/adsp_err.h b/techpack/audio/4.0/dsp/adsp_err.h deleted file mode 100644 index 8a0f6bf97748..000000000000 --- a/techpack/audio/4.0/dsp/adsp_err.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. - */ - -#ifndef __ADSP_ERR__ -#define __ADSP_ERR__ - -int adsp_err_get_lnx_err_code(u32 adsp_error); - -char *adsp_err_get_err_str(u32 adsp_error); - -#endif diff --git a/techpack/audio/4.0/dsp/audio_cal_utils.c b/techpack/audio/4.0/dsp/audio_cal_utils.c deleted file mode 100644 index 7e243e88609b..000000000000 --- a/techpack/audio/4.0/dsp/audio_cal_utils.c +++ /dev/null @@ -1,1070 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include - -static int unmap_memory(struct cal_type_data *cal_type, - struct cal_block_data *cal_block); - -size_t get_cal_info_size(int32_t cal_type) -{ - size_t size = 0; - size_t size1 = 0, size2 = 0; - - switch (cal_type) { - case CVP_VOC_RX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_top); - break; - case CVP_VOC_TX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_top); - break; - case CVP_VOCPROC_STATIC_CAL_TYPE: - size = sizeof(struct audio_cal_info_vocproc); - break; - case CVP_VOCPROC_DYNAMIC_CAL_TYPE: - size = sizeof(struct audio_cal_info_vocvol); - break; - case CVS_VOCSTRM_STATIC_CAL_TYPE: - size = 0; - break; - case CVP_VOCDEV_CFG_CAL_TYPE: - size = sizeof(struct audio_cal_info_vocdev_cfg); - break; - case CVP_VOCPROC_STATIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_col); - break; - case CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_col); - break; - case CVS_VOCSTRM_STATIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_col); - break; - case ADM_TOPOLOGY_CAL_TYPE: - case ADM_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_adm_top); - break; - case ADM_CUST_TOPOLOGY_CAL_TYPE: - case CORE_CUSTOM_TOPOLOGIES_CAL_TYPE: - size = 0; - break; - case ADM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: - size = sizeof(struct audio_cal_info_audproc); - break; - case ADM_AUDVOL_CAL_TYPE: - case ADM_RTAC_AUDVOL_CAL_TYPE: - size = sizeof(struct audio_cal_info_audvol); - break; - case ASM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_asm_top); - break; - case ASM_CUST_TOPOLOGY_CAL_TYPE: - size = 0; - break; - case ASM_AUDSTRM_CAL_TYPE: - size = sizeof(struct audio_cal_info_audstrm); - break; - case AFE_TOPOLOGY_CAL_TYPE: - case AFE_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe_top); - break; - case AFE_CUST_TOPOLOGY_CAL_TYPE: - size = 0; - break; - case AFE_COMMON_RX_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe); - break; - case AFE_COMMON_TX_CAL_TYPE: - case AFE_LSM_TX_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe); - break; - case AFE_FB_SPKR_PROT_CAL_TYPE: - size = sizeof(struct audio_cal_info_spk_prot_cfg); - break; - case AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size1 = max(sizeof(struct audio_cal_info_sp_th_vi_ftm_cfg), - sizeof(struct audio_cal_info_sp_th_vi_param)); - size2 = max(sizeof(struct audio_cal_info_sp_th_vi_v_vali_cfg), - sizeof(struct audio_cal_info_sp_th_vi_v_vali_param)); - size = max(size1, size2); - break; - case AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size = max(sizeof(struct audio_cal_info_sp_ex_vi_ftm_cfg), - sizeof(struct audio_cal_info_sp_ex_vi_param)); - break; - case AFE_ANC_CAL_TYPE: - size = 0; - break; - case AFE_AANC_CAL_TYPE: - size = sizeof(struct audio_cal_info_aanc); - break; - case AFE_HW_DELAY_CAL_TYPE: - size = sizeof(struct audio_cal_info_hw_delay); - break; - case AFE_SIDETONE_CAL_TYPE: - size = sizeof(struct audio_cal_info_sidetone); - break; - case AFE_SIDETONE_IIR_CAL_TYPE: - size = sizeof(struct audio_cal_info_sidetone_iir); - break; - case LSM_CUST_TOPOLOGY_CAL_TYPE: - size = 0; - break; - case LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm_top); - break; - case ULP_LSM_TOPOLOGY_ID_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm_top); - break; - case LSM_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm); - break; - case ADM_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case ADM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case ASM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_APR_CAL_TYPE: - size = 0; - break; - case MAD_CAL_TYPE: - size = 0; - break; - case ULP_AFE_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe); - break; - case ULP_LSM_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm); - break; - case AUDIO_CORE_METAINFO_CAL_TYPE: - size = sizeof(struct audio_cal_info_metainfo); - break; - case SRS_TRUMEDIA_CAL_TYPE: - size = 0; - break; - default: - pr_err("%s:Invalid cal type %d!", - __func__, cal_type); - } - return size; -} - -size_t get_user_cal_type_size(int32_t cal_type) -{ - size_t size = 0; - - switch (cal_type) { - case CVP_VOC_RX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_voc_top); - break; - case CVP_VOC_TX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_voc_top); - break; - case CVP_VOCPROC_STATIC_CAL_TYPE: - size = sizeof(struct audio_cal_type_vocproc); - break; - case CVP_VOCPROC_DYNAMIC_CAL_TYPE: - size = sizeof(struct audio_cal_type_vocvol); - break; - case CVS_VOCSTRM_STATIC_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case CVP_VOCDEV_CFG_CAL_TYPE: - size = sizeof(struct audio_cal_type_vocdev_cfg); - break; - case CVP_VOCPROC_STATIC_COL_CAL_TYPE: - case CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE: - case CVS_VOCSTRM_STATIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_type_voc_col); - break; - case ADM_TOPOLOGY_CAL_TYPE: - case ADM_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_adm_top); - break; - case ADM_CUST_TOPOLOGY_CAL_TYPE: - case CORE_CUSTOM_TOPOLOGIES_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case ADM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: - size = sizeof(struct audio_cal_type_audproc); - break; - case ADM_AUDVOL_CAL_TYPE: - case ADM_RTAC_AUDVOL_CAL_TYPE: - size = sizeof(struct audio_cal_type_audvol); - break; - case ASM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_asm_top); - break; - case ASM_CUST_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case ASM_AUDSTRM_CAL_TYPE: - size = sizeof(struct audio_cal_type_audstrm); - break; - case AFE_TOPOLOGY_CAL_TYPE: - case AFE_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe_top); - break; - case AFE_CUST_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case AFE_COMMON_RX_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe); - break; - case AFE_COMMON_TX_CAL_TYPE: - case AFE_LSM_TX_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe); - break; - case AFE_FB_SPKR_PROT_CAL_TYPE: - size = sizeof(struct audio_cal_type_fb_spk_prot_cfg); - break; - case AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size = max(sizeof(struct audio_cal_type_sp_th_vi_ftm_cfg), - sizeof(struct audio_cal_type_sp_th_vi_param)); - break; - case AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size = max(sizeof(struct audio_cal_type_sp_ex_vi_ftm_cfg), - sizeof(struct audio_cal_type_sp_ex_vi_param)); - break; - case AFE_ANC_CAL_TYPE: - size = 0; - break; - case AFE_AANC_CAL_TYPE: - size = sizeof(struct audio_cal_type_aanc); - break; - case AFE_HW_DELAY_CAL_TYPE: - size = sizeof(struct audio_cal_type_hw_delay); - break; - case AFE_SIDETONE_CAL_TYPE: - size = sizeof(struct audio_cal_type_sidetone); - break; - case AFE_SIDETONE_IIR_CAL_TYPE: - size = sizeof(struct audio_cal_type_sidetone_iir); - break; - case LSM_CUST_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm_top); - break; - case ULP_LSM_TOPOLOGY_ID_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm_top); - break; - case LSM_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm); - break; - case ADM_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case ADM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case ASM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_APR_CAL_TYPE: - size = 0; - break; - case MAD_CAL_TYPE: - size = 0; - break; - case ULP_AFE_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe); - break; - case ULP_LSM_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm); - break; - case AUDIO_CORE_METAINFO_CAL_TYPE: - size = sizeof(struct audio_cal_type_metainfo); - break; - case SRS_TRUMEDIA_CAL_TYPE: - size = 0; - break; - default: - pr_err("%s:Invalid cal type %d!", - __func__, cal_type); - } - return size; -} - -int32_t cal_utils_get_cal_type_version(void *cal_type_data) -{ - struct audio_cal_type_basic *data = NULL; - - data = (struct audio_cal_type_basic *)cal_type_data; - - return data->cal_hdr.version; -} - -static struct cal_type_data *create_cal_type_data( - struct cal_type_info *info) -{ - struct cal_type_data *cal_type = NULL; - - if ((info->reg.cal_type < 0) || - (info->reg.cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d is Invalid!\n", - __func__, info->reg.cal_type); - goto done; - } - - if (info->cal_util_callbacks.match_block == NULL) { - pr_err("%s: cal type %d no method to match blocks!\n", - __func__, info->reg.cal_type); - goto done; - } - - cal_type = kmalloc(sizeof(*cal_type), GFP_KERNEL); - if (cal_type == NULL) - goto done; - - INIT_LIST_HEAD(&cal_type->cal_blocks); - mutex_init(&cal_type->lock); - memcpy(&cal_type->info, info, - sizeof(cal_type->info)); -done: - return cal_type; -} - -/** - * cal_utils_create_cal_types - * - * @num_cal_types: number of types - * @cal_type: pointer to the cal types pointer - * @info: pointer to info - * - * Returns 0 on success, EINVAL otherwise - */ -int cal_utils_create_cal_types(int num_cal_types, - struct cal_type_data **cal_type, - struct cal_type_info *info) -{ - int ret = 0; - int i; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if (info == NULL) { - pr_err("%s: info is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - ret = -EINVAL; - goto done; - } - - for (i = 0; i < num_cal_types; i++) { - if ((info[i].reg.cal_type < 0) || - (info[i].reg.cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d at index %d is Invalid!\n", - __func__, info[i].reg.cal_type, i); - ret = -EINVAL; - goto done; - } - - cal_type[i] = create_cal_type_data(&info[i]); - if (cal_type[i] == NULL) { - pr_err("%s: Could not allocate cal_type of index %d!\n", - __func__, i); - ret = -EINVAL; - goto done; - } - - ret = audio_cal_register(1, &info[i].reg); - if (ret < 0) { - pr_err("%s: audio_cal_register failed, ret = %d!\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - pr_debug("%s: cal type %d at index %d!\n", - __func__, info[i].reg.cal_type, i); - } -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_create_cal_types); - -static void delete_cal_block(struct cal_block_data *cal_block) -{ - pr_debug("%s\n", __func__); - - if (cal_block == NULL) - goto done; - - list_del(&cal_block->list); - kfree(cal_block->client_info); - cal_block->client_info = NULL; - kfree(cal_block->cal_info); - cal_block->cal_info = NULL; - if (cal_block->map_data.dma_buf != NULL) { - msm_audio_ion_free(cal_block->map_data.dma_buf); - cal_block->map_data.dma_buf = NULL; - } - kfree(cal_block); -done: - return; -} - -static void destroy_all_cal_blocks(struct cal_type_data *cal_type) -{ - int ret = 0; - struct list_head *ptr, *next; - struct cal_block_data *cal_block; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - ret = unmap_memory(cal_type, cal_block); - if (ret < 0) { - pr_err("%s: unmap_memory failed, cal type %d, ret = %d!\n", - __func__, - cal_type->info.reg.cal_type, - ret); - } - delete_cal_block(cal_block); - cal_block = NULL; - } -} - -static void destroy_cal_type_data(struct cal_type_data *cal_type) -{ - if (cal_type == NULL) - goto done; - - destroy_all_cal_blocks(cal_type); - list_del(&cal_type->cal_blocks); - kfree(cal_type); -done: - return; -} - -/** - * cal_utils_destroy_cal_types - - * Destroys cal types and deregister from cal info - * - * @num_cal_types: number of cal types - * @cal_type: cal type pointer with cal info - * - */ -void cal_utils_destroy_cal_types(int num_cal_types, - struct cal_type_data **cal_type) -{ - int i; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - goto done; - } - - for (i = 0; i < num_cal_types; i++) { - audio_cal_deregister(1, &cal_type[i]->info.reg); - destroy_cal_type_data(cal_type[i]); - cal_type[i] = NULL; - } -done: - return; -} -EXPORT_SYMBOL(cal_utils_destroy_cal_types); - -/** - * cal_utils_get_only_cal_block - * - * @cal_type: pointer to the cal type - * - * Returns cal_block structure - */ -struct cal_block_data *cal_utils_get_only_cal_block( - struct cal_type_data *cal_type) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - - if (cal_type == NULL) - goto done; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - break; - } -done: - return cal_block; -} -EXPORT_SYMBOL(cal_utils_get_only_cal_block); - -/** - * cal_utils_get_only_cal_block - * - * @cal_block: pointer to cal block struct - * @user_data: pointer to user data - * - * Returns true on match - */ -bool cal_utils_match_buf_num(struct cal_block_data *cal_block, - void *user_data) -{ - bool ret = false; - struct audio_cal_type_basic *data = user_data; - - if (cal_block->buffer_number == data->cal_hdr.buffer_number) - ret = true; - - return ret; -} -EXPORT_SYMBOL(cal_utils_match_buf_num); - -static struct cal_block_data *get_matching_cal_block( - struct cal_type_data *cal_type, - void *data) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_type->info.cal_util_callbacks. - match_block(cal_block, data)) - return cal_block; - } - - return NULL; -} - -static int cal_block_ion_alloc(struct cal_block_data *cal_block) -{ - int ret = 0; - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = msm_audio_ion_import(&cal_block->map_data.dma_buf, - cal_block->map_data.ion_map_handle, - NULL, 0, - &cal_block->cal_data.paddr, - &cal_block->map_data.map_size, - &cal_block->cal_data.kvaddr); - if (ret) { - pr_err("%s: audio ION import failed, rc = %d\n", - __func__, ret); - ret = -ENOMEM; - goto done; - } -done: - return ret; -} - -static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, - struct audio_cal_type_basic *basic_cal, - size_t client_info_size, void *client_info) -{ - struct cal_block_data *cal_block = NULL; - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - goto done; - } else if (basic_cal == NULL) { - pr_err("%s: basic_cal is NULL!\n", __func__); - goto done; - } - - cal_block = kzalloc(sizeof(*cal_block), - GFP_KERNEL); - if (cal_block == NULL) - goto done; - - INIT_LIST_HEAD(&cal_block->list); - - cal_block->map_data.ion_map_handle = basic_cal->cal_data.mem_handle; - if (basic_cal->cal_data.mem_handle > 0) { - if (cal_block_ion_alloc(cal_block)) { - pr_err("%s: cal_block_ion_alloc failed!\n", - __func__); - goto err; - } - } - if (client_info_size > 0) { - cal_block->client_info_size = client_info_size; - cal_block->client_info = kmalloc(client_info_size, GFP_KERNEL); - if (cal_block->client_info == NULL) { - pr_err("%s: could not allocats client_info!\n", - __func__); - goto err; - } - if (client_info != NULL) - memcpy(cal_block->client_info, client_info, - client_info_size); - } - - cal_block->cal_info = kzalloc( - get_cal_info_size(cal_type->info.reg.cal_type), - GFP_KERNEL); - if (cal_block->cal_info == NULL) { - pr_err("%s: could not allocats cal_info!\n", - __func__); - goto err; - } - cal_block->buffer_number = basic_cal->cal_hdr.buffer_number; - list_add_tail(&cal_block->list, &cal_type->cal_blocks); - pr_debug("%s: created block for cal type %d, buf num %d, map handle %d, map size %zd paddr 0x%pK!\n", - __func__, cal_type->info.reg.cal_type, - cal_block->buffer_number, - cal_block->map_data.ion_map_handle, - cal_block->map_data.map_size, - &cal_block->cal_data.paddr); -done: - return cal_block; -err: - kfree(cal_block->cal_info); - cal_block->cal_info = NULL; - kfree(cal_block->client_info); - cal_block->client_info = NULL; - kfree(cal_block); - cal_block = NULL; - return cal_block; -} - -void cal_utils_clear_cal_block_q6maps(int num_cal_types, - struct cal_type_data **cal_type) -{ - int i = 0; - struct list_head *ptr, *next; - struct cal_block_data *cal_block; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - goto done; - } - - for (; i < num_cal_types; i++) { - if (cal_type[i] == NULL) - continue; - - mutex_lock(&cal_type[i]->lock); - list_for_each_safe(ptr, next, - &cal_type[i]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - cal_block->map_data.q6map_handle = 0; - } - mutex_unlock(&cal_type[i]->lock); - } -done: - return; -} - - - -static int realloc_memory(struct cal_block_data *cal_block) -{ - int ret = 0; - - msm_audio_ion_free(cal_block->map_data.dma_buf); - cal_block->map_data.dma_buf = NULL; - cal_block->cal_data.size = 0; - - ret = cal_block_ion_alloc(cal_block); - if (ret < 0) - pr_err("%s: realloc_memory failed!\n", - __func__); - return ret; -} - -static int map_memory(struct cal_type_data *cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - - - if (cal_type->info.cal_util_callbacks.map_cal != NULL) { - if ((cal_block->map_data.ion_map_handle < 0) || - (cal_block->map_data.map_size <= 0) || - (cal_block->map_data.q6map_handle != 0)) { - goto done; - } - - pr_debug("%s: cal type %d call map\n", - __func__, cal_type->info.reg.cal_type); - ret = cal_type->info.cal_util_callbacks. - map_cal(cal_type->info.reg.cal_type, cal_block); - if (ret < 0) { - pr_err("%s: map_cal failed, cal type %d, ret = %d!\n", - __func__, cal_type->info.reg.cal_type, - ret); - goto done; - } - } -done: - return ret; -} - -static int unmap_memory(struct cal_type_data *cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - - if (cal_type->info.cal_util_callbacks.unmap_cal != NULL) { - if ((cal_block->map_data.ion_map_handle < 0) || - (cal_block->map_data.map_size <= 0) || - (cal_block->map_data.q6map_handle == 0)) { - goto done; - } - pr_debug("%s: cal type %d call unmap\n", - __func__, cal_type->info.reg.cal_type); - ret = cal_type->info.cal_util_callbacks. - unmap_cal(cal_type->info.reg.cal_type, cal_block); - if (ret < 0) { - pr_err("%s: unmap_cal failed, cal type %d, ret = %d!\n", - __func__, cal_type->info.reg.cal_type, - ret); - goto done; - } - } -done: - return ret; -} - -/** - * cal_utils_alloc_cal - * - * @data_size: size of data to allocate - * @data: data pointer - * @cal_type: pointer to the cal type - * @client_info_size: client info size - * @client_info: pointer to client info - * - * Returns 0 on success, appropriate error code otherwise - */ -int cal_utils_alloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info) -{ - int ret = 0; - struct cal_block_data *cal_block; - struct audio_cal_type_alloc *alloc_data = data; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", - __func__); - ret = -EINVAL; - goto done; - } - if (data_size < sizeof(struct audio_cal_type_alloc)) { - pr_err("%s: data_size of %zd does not equal alloc struct size of %zd!\n", - __func__, data_size, - sizeof(struct audio_cal_type_alloc)); - ret = -EINVAL; - goto done; - } - if ((client_info_size > 0) && (client_info == NULL)) { - pr_err("%s: User info pointer is NULL but size is %zd!\n", - __func__, client_info_size); - ret = -EINVAL; - goto done; - } - - if (alloc_data->cal_data.mem_handle < 0) { - pr_err("%s: mem_handle %d invalid!\n", - __func__, alloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto done; - } - - mutex_lock(&cal_type->lock); - - cal_block = get_matching_cal_block(cal_type, - data); - if (cal_block != NULL) { - ret = unmap_memory(cal_type, cal_block); - if (ret < 0) - goto err; - ret = realloc_memory(cal_block); - if (ret < 0) - goto err; - } else { - cal_block = create_cal_block(cal_type, - (struct audio_cal_type_basic *)alloc_data, - client_info_size, client_info); - if (cal_block == NULL) { - pr_err("%s: create_cal_block failed for %d!\n", - __func__, alloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto err; - } - } - - ret = map_memory(cal_type, cal_block); - if (ret < 0) - goto err; -err: - mutex_unlock(&cal_type->lock); -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_alloc_cal); - -/** - * cal_utils_dealloc_cal - * - * @data_size: size of data to allocate - * @data: data pointer - * @cal_type: pointer to the cal type - * - * Returns 0 on success, appropriate error code otherwise - */ -int cal_utils_dealloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type) -{ - int ret = 0; - struct cal_block_data *cal_block; - struct audio_cal_type_dealloc *dealloc_data = data; - - pr_debug("%s\n", __func__); - - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", - __func__); - ret = -EINVAL; - goto done; - } - - if (data_size < sizeof(struct audio_cal_type_dealloc)) { - pr_err("%s: data_size of %zd does not equal struct size of %zd!\n", - __func__, data_size, - sizeof(struct audio_cal_type_dealloc)); - ret = -EINVAL; - goto done; - } - - if ((dealloc_data->cal_data.mem_handle == -1) && - (dealloc_data->cal_hdr.buffer_number == ALL_CAL_BLOCKS)) { - destroy_all_cal_blocks(cal_type); - goto done; - } - - if (dealloc_data->cal_data.mem_handle < 0) { - pr_err("%s: mem_handle %d invalid!\n", - __func__, dealloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto done; - } - - mutex_lock(&cal_type->lock); - cal_block = get_matching_cal_block( - cal_type, - data); - if (cal_block == NULL) { - pr_err("%s: allocation does not exist for %d!\n", - __func__, dealloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto err; - } - - ret = unmap_memory(cal_type, cal_block); - if (ret < 0) - goto err; - - delete_cal_block(cal_block); -err: - mutex_unlock(&cal_type->lock); -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_dealloc_cal); - -/** - * cal_utils_set_cal - * - * @data_size: size of data to allocate - * @data: data pointer - * @cal_type: pointer to the cal type - * @client_info_size: client info size - * @client_info: pointer to client info - * - * Returns 0 on success, appropriate error code otherwise - */ -int cal_utils_set_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info) -{ - int ret = 0; - struct cal_block_data *cal_block; - struct audio_cal_type_basic *basic_data = data; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", - __func__); - ret = -EINVAL; - goto done; - } - - if ((client_info_size > 0) && (client_info == NULL)) { - pr_err("%s: User info pointer is NULL but size is %zd!\n", - __func__, client_info_size); - ret = -EINVAL; - goto done; - } - - if ((data_size > get_user_cal_type_size( - cal_type->info.reg.cal_type)) || (data_size < 0)) { - pr_err("%s: cal_type %d, data_size of %zd is invalid, expecting %zd!\n", - __func__, cal_type->info.reg.cal_type, data_size, - get_user_cal_type_size(cal_type->info.reg.cal_type)); - ret = -EINVAL; - goto done; - } - - mutex_lock(&cal_type->lock); - cal_block = get_matching_cal_block( - cal_type, - data); - if (cal_block == NULL) { - if (basic_data->cal_data.mem_handle > 0) { - pr_err("%s: allocation does not exist for %d!\n", - __func__, basic_data->cal_data.mem_handle); - ret = -EINVAL; - goto err; - } else { - cal_block = create_cal_block( - cal_type, - basic_data, - client_info_size, client_info); - if (cal_block == NULL) { - pr_err("%s: create_cal_block failed for cal type %d!\n", - __func__, - cal_type->info.reg.cal_type); - ret = -EINVAL; - goto err; - } - } - } - - ret = map_memory(cal_type, cal_block); - if (ret < 0) - goto err; - - cal_block->cal_data.size = basic_data->cal_data.cal_size; - - if (client_info_size > 0) { - memcpy(cal_block->client_info, - client_info, - client_info_size); - } - - memcpy(cal_block->cal_info, - ((uint8_t *)data + sizeof(struct audio_cal_type_basic)), - data_size - sizeof(struct audio_cal_type_basic)); - - /* reset buffer stale flag */ - cal_block->cal_stale = false; - -err: - mutex_unlock(&cal_type->lock); -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_set_cal); - -/** - * cal_utils_mark_cal_used - * - * @cal_block: pointer to cal block - */ -void cal_utils_mark_cal_used(struct cal_block_data *cal_block) -{ - if (cal_block) - cal_block->cal_stale = true; -} -EXPORT_SYMBOL(cal_utils_mark_cal_used); - -/** - * cal_utils_is_cal_stale - * - * @cal_block: pointer to cal block - * - * Returns true if cal block is stale, false otherwise - */ -bool cal_utils_is_cal_stale(struct cal_block_data *cal_block) -{ - if ((cal_block) && (cal_block->cal_stale)) - return true; - - return false; -} -EXPORT_SYMBOL(cal_utils_is_cal_stale); diff --git a/techpack/audio/4.0/dsp/audio_calibration.c b/techpack/audio/4.0/dsp/audio_calibration.c deleted file mode 100644 index a5167be3cfaa..000000000000 --- a/techpack/audio/4.0/dsp/audio_calibration.c +++ /dev/null @@ -1,627 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2014, 2016-2017, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct audio_cal_client_info { - struct list_head list; - struct audio_cal_callbacks *callbacks; -}; - -struct audio_cal_info { - struct mutex common_lock; - struct mutex cal_mutex[MAX_CAL_TYPES]; - struct list_head client_info[MAX_CAL_TYPES]; - int ref_count; -}; - -static struct audio_cal_info audio_cal; - - -static bool callbacks_are_equal(struct audio_cal_callbacks *callback1, - struct audio_cal_callbacks *callback2) -{ - bool ret = true; - struct audio_cal_callbacks *call1 = callback1; - struct audio_cal_callbacks *call2 = callback2; - - pr_debug("%s\n", __func__); - - if ((call1 == NULL) && (call2 == NULL)) - ret = true; - else if ((call1 == NULL) || (call2 == NULL)) - ret = false; - else if ((call1->alloc != call2->alloc) || - (call1->dealloc != call2->dealloc) || - (call1->pre_cal != call2->pre_cal) || - (call1->set_cal != call2->set_cal) || - (call1->get_cal != call2->get_cal) || - (call1->post_cal != call2->post_cal)) - ret = false; - return ret; -} - -int audio_cal_deregister(int num_cal_types, - struct audio_cal_reg *reg_data) -{ - int ret = 0; - int i = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s\n", __func__); - - if (reg_data == NULL) { - pr_err("%s: reg_data is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - ret = -EINVAL; - goto done; - } - - for (; i < num_cal_types; i++) { - if ((reg_data[i].cal_type < 0) || - (reg_data[i].cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d at index %d is Invalid!\n", - __func__, reg_data[i].cal_type, i); - ret = -EINVAL; - continue; - } - - mutex_lock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - list_for_each_safe(ptr, next, - &audio_cal.client_info[reg_data[i].cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - if (callbacks_are_equal(client_info_node->callbacks, - ®_data[i].callbacks)) { - list_del(&client_info_node->list); - kfree(client_info_node->callbacks); - client_info_node->callbacks = NULL; - kfree(client_info_node); - client_info_node = NULL; - break; - } - } - mutex_unlock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - } -done: - return ret; -} - - -int audio_cal_register(int num_cal_types, - struct audio_cal_reg *reg_data) -{ - int ret = 0; - int i = 0; - struct audio_cal_client_info *client_info_node = NULL; - struct audio_cal_callbacks *callback_node = NULL; - - pr_debug("%s\n", __func__); - - if (reg_data == NULL) { - pr_err("%s: callbacks are NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - ret = -EINVAL; - goto done; - } - - for (; i < num_cal_types; i++) { - if ((reg_data[i].cal_type < 0) || - (reg_data[i].cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d at index %d is Invalid!\n", - __func__, reg_data[i].cal_type, i); - ret = -EINVAL; - goto err; - } - - client_info_node = kmalloc(sizeof(*client_info_node), - GFP_KERNEL); - if (client_info_node == NULL) { - ret = -ENOMEM; - goto err; - } - INIT_LIST_HEAD(&client_info_node->list); - - callback_node = kmalloc(sizeof(*callback_node), - GFP_KERNEL); - if (callback_node == NULL) { - ret = -ENOMEM; - goto err; - } - - memcpy(callback_node, ®_data[i].callbacks, - sizeof(*callback_node)); - client_info_node->callbacks = callback_node; - - mutex_lock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - list_add_tail(&client_info_node->list, - &audio_cal.client_info[reg_data[i].cal_type]); - mutex_unlock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - } -done: - return ret; -err: - audio_cal_deregister(num_cal_types, reg_data); - return ret; -} - -static int call_allocs(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->alloc == NULL) - continue; - - ret2 = client_info_node->callbacks-> - alloc(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: alloc failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_deallocs(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->dealloc == NULL) - continue; - - ret2 = client_info_node->callbacks-> - dealloc(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: dealloc failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_pre_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->pre_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - pre_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: pre_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_post_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->post_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - post_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: post_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_set_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->set_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - set_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: set_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_get_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->get_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - get_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: get_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int audio_cal_open(struct inode *inode, struct file *f) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&audio_cal.common_lock); - audio_cal.ref_count++; - mutex_unlock(&audio_cal.common_lock); - - return ret; -} - -static void dealloc_all_clients(void) -{ - int i = 0; - struct audio_cal_type_dealloc dealloc_data; - - pr_debug("%s\n", __func__); - - dealloc_data.cal_hdr.version = VERSION_0_0; - dealloc_data.cal_hdr.buffer_number = ALL_CAL_BLOCKS; - dealloc_data.cal_data.mem_handle = -1; - - for (; i < MAX_CAL_TYPES; i++) - call_deallocs(i, sizeof(dealloc_data), &dealloc_data); -} - -static int audio_cal_release(struct inode *inode, struct file *f) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&audio_cal.common_lock); - audio_cal.ref_count--; - if (audio_cal.ref_count <= 0) { - audio_cal.ref_count = 0; - dealloc_all_clients(); - } - mutex_unlock(&audio_cal.common_lock); - - return ret; -} - -static long audio_cal_shared_ioctl(struct file *file, unsigned int cmd, - void __user *arg) -{ - int ret = 0; - int32_t size; - struct audio_cal_basic *data = NULL; - - pr_debug("%s\n", __func__); - - switch (cmd) { - case AUDIO_ALLOCATE_CALIBRATION: - case AUDIO_DEALLOCATE_CALIBRATION: - case AUDIO_PREPARE_CALIBRATION: - case AUDIO_SET_CALIBRATION: - case AUDIO_GET_CALIBRATION: - case AUDIO_POST_CALIBRATION: - break; - default: - pr_err("%s: ioctl not found!\n", __func__); - ret = -EFAULT; - goto done; - } - - if (copy_from_user(&size, (void *)arg, sizeof(size))) { - pr_err("%s: Could not copy size value from user\n", __func__); - ret = -EFAULT; - goto done; - } else if ((size < sizeof(struct audio_cal_basic)) - || (size > MAX_IOCTL_CMD_SIZE)) { - pr_err("%s: Invalid size sent to driver: %d, max size is %d, min size is %zd\n", - __func__, size, MAX_IOCTL_CMD_SIZE, - sizeof(struct audio_cal_basic)); - ret = -EINVAL; - goto done; - } - - data = kmalloc(size, GFP_KERNEL); - if (data == NULL) { - ret = -ENOMEM; - goto done; - } else if (copy_from_user(data, (void *)arg, size)) { - pr_err("%s: Could not copy data from user\n", - __func__); - ret = -EFAULT; - goto done; - } else if ((data->hdr.cal_type < 0) || - (data->hdr.cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d is Invalid!\n", - __func__, data->hdr.cal_type); - ret = -EINVAL; - goto done; - } else if ((data->hdr.cal_type_size < - sizeof(struct audio_cal_type_basic)) || - (data->hdr.cal_type_size > - get_user_cal_type_size(data->hdr.cal_type))) { - pr_err("%s: cal type size %d is Invalid! Max is %zd!\n", - __func__, data->hdr.cal_type_size, - get_user_cal_type_size(data->hdr.cal_type)); - ret = -EINVAL; - goto done; - } else if (data->cal_type.cal_hdr.buffer_number < 0) { - pr_err("%s: cal type %d Invalid buffer number %d!\n", - __func__, data->hdr.cal_type, - data->cal_type.cal_hdr.buffer_number); - ret = -EINVAL; - goto done; - } else if ((data->hdr.cal_type_size + sizeof(data->hdr)) > size) { - pr_err("%s: cal type hdr size %zd + cal type size %d is greater than user buffer size %d\n", - __func__, sizeof(data->hdr), data->hdr.cal_type_size, - size); - ret = -EFAULT; - goto done; - } - - - mutex_lock(&audio_cal.cal_mutex[data->hdr.cal_type]); - - switch (cmd) { - case AUDIO_ALLOCATE_CALIBRATION: - ret = call_allocs(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_DEALLOCATE_CALIBRATION: - ret = call_deallocs(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_PREPARE_CALIBRATION: - ret = call_pre_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_SET_CALIBRATION: - ret = call_set_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_GET_CALIBRATION: - ret = call_get_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_POST_CALIBRATION: - ret = call_post_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - } - - if (cmd == AUDIO_GET_CALIBRATION) { - if (data->hdr.cal_type_size == 0) - goto unlock; - if (data == NULL) - goto unlock; - if (copy_to_user(arg, data, - sizeof(data->hdr) + data->hdr.cal_type_size)) { - pr_err("%s: Could not copy cal type to user\n", - __func__); - ret = -EFAULT; - goto unlock; - } - } - -unlock: - mutex_unlock(&audio_cal.cal_mutex[data->hdr.cal_type]); -done: - kfree(data); - return ret; -} - -static long audio_cal_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - return audio_cal_shared_ioctl(f, cmd, (void __user *)arg); -} - -#ifdef CONFIG_COMPAT - -#define AUDIO_ALLOCATE_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 200, compat_uptr_t) -#define AUDIO_DEALLOCATE_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 201, compat_uptr_t) -#define AUDIO_PREPARE_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 202, compat_uptr_t) -#define AUDIO_SET_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 203, compat_uptr_t) -#define AUDIO_GET_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 204, compat_uptr_t) -#define AUDIO_POST_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 205, compat_uptr_t) - -static long audio_cal_compat_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - unsigned int cmd64; - int ret = 0; - - switch (cmd) { - case AUDIO_ALLOCATE_CALIBRATION32: - cmd64 = AUDIO_ALLOCATE_CALIBRATION; - break; - case AUDIO_DEALLOCATE_CALIBRATION32: - cmd64 = AUDIO_DEALLOCATE_CALIBRATION; - break; - case AUDIO_PREPARE_CALIBRATION32: - cmd64 = AUDIO_PREPARE_CALIBRATION; - break; - case AUDIO_SET_CALIBRATION32: - cmd64 = AUDIO_SET_CALIBRATION; - break; - case AUDIO_GET_CALIBRATION32: - cmd64 = AUDIO_GET_CALIBRATION; - break; - case AUDIO_POST_CALIBRATION32: - cmd64 = AUDIO_POST_CALIBRATION; - break; - default: - pr_err("%s: ioctl not found!\n", __func__); - ret = -EFAULT; - goto done; - } - - ret = audio_cal_shared_ioctl(f, cmd64, compat_ptr(arg)); -done: - return ret; -} -#endif - -static const struct file_operations audio_cal_fops = { - .owner = THIS_MODULE, - .open = audio_cal_open, - .release = audio_cal_release, - .unlocked_ioctl = audio_cal_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_cal_compat_ioctl, -#endif -}; - -struct miscdevice audio_cal_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_audio_cal", - .fops = &audio_cal_fops, -}; - -int __init audio_cal_init(void) -{ - int i = 0; - - pr_debug("%s\n", __func__); - - memset(&audio_cal, 0, sizeof(audio_cal)); - mutex_init(&audio_cal.common_lock); - for (; i < MAX_CAL_TYPES; i++) { - INIT_LIST_HEAD(&audio_cal.client_info[i]); - mutex_init(&audio_cal.cal_mutex[i]); - } - - return misc_register(&audio_cal_misc); -} - -void audio_cal_exit(void) -{ - int i = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node; - - for (; i < MAX_CAL_TYPES; i++) { - list_for_each_safe(ptr, next, - &audio_cal.client_info[i]) { - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - list_del(&client_info_node->list); - kfree(client_info_node->callbacks); - client_info_node->callbacks = NULL; - kfree(client_info_node); - client_info_node = NULL; - } - } - misc_deregister(&audio_cal_misc); -} - - -MODULE_DESCRIPTION("SoC QDSP6v2 Audio Calibration driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/audio_notifier.c b/techpack/audio/4.0/dsp/audio_notifier.c deleted file mode 100644 index 56cfa31fa645..000000000000 --- a/techpack/audio/4.0/dsp/audio_notifier.c +++ /dev/null @@ -1,636 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include "audio_ssr.h" -#include "audio_pdr.h" - -/* Audio states internal to notifier. Client */ -/* used states defined in audio_notifier.h */ -/* for AUDIO_NOTIFIER_SERVICE_DOWN & UP */ -#define NO_SERVICE -2 -#define UNINIT_SERVICE -1 - -/* - * Used for each client registered with audio notifier - */ -struct client_data { - struct list_head list; - /* Notifier block given by client */ - struct notifier_block *nb; - char client_name[20]; - int service; - int domain; -}; - -/* - * Used for each service and domain combination - * Tracks information specific to the underlying - * service. - */ -struct service_info { - const char name[20]; - int domain_id; - int state; - void *handle; - /* Notifier block registered to service */ - struct notifier_block *nb; - /* Used to determine when to register and deregister service */ - int num_of_clients; - /* List of all clients registered to the service and domain */ - struct srcu_notifier_head client_nb_list; -}; - -static int audio_notifer_ssr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data); -static int audio_notifer_ssr_modem_cb(struct notifier_block *this, - unsigned long opcode, void *data); -static int audio_notifer_pdr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data); - -static struct notifier_block notifier_ssr_adsp_nb = { - .notifier_call = audio_notifer_ssr_adsp_cb, - .priority = 0, -}; - -static struct notifier_block notifier_ssr_modem_nb = { - .notifier_call = audio_notifer_ssr_modem_cb, - .priority = 0, -}; - -static struct notifier_block notifier_pdr_adsp_nb = { - .notifier_call = audio_notifer_pdr_adsp_cb, - .priority = 0, -}; - -static struct service_info service_data[AUDIO_NOTIFIER_MAX_SERVICES] - [AUDIO_NOTIFIER_MAX_DOMAINS] = { - - {{ - .name = "SSR_ADSP", - .domain_id = AUDIO_SSR_DOMAIN_ADSP, - .state = AUDIO_NOTIFIER_SERVICE_DOWN, - .nb = ¬ifier_ssr_adsp_nb - }, - { - .name = "SSR_MODEM", - .domain_id = AUDIO_SSR_DOMAIN_MODEM, - .state = AUDIO_NOTIFIER_SERVICE_DOWN, - .nb = ¬ifier_ssr_modem_nb - } }, - - {{ - .name = "PDR_ADSP", - .domain_id = AUDIO_PDR_DOMAIN_ADSP, - .state = UNINIT_SERVICE, - .nb = ¬ifier_pdr_adsp_nb - }, - { /* PDR MODEM service not enabled */ - .name = "INVALID", - .state = NO_SERVICE, - .nb = NULL - } } -}; - -/* Master list of all audio notifier clients */ -struct list_head client_list; -struct mutex notifier_mutex; - -static int audio_notifer_get_default_service(int domain) -{ - int service = NO_SERVICE; - - /* initial service to connect per domain */ - switch (domain) { - case AUDIO_NOTIFIER_ADSP_DOMAIN: - service = AUDIO_NOTIFIER_PDR_SERVICE; - break; - case AUDIO_NOTIFIER_MODEM_DOMAIN: - service = AUDIO_NOTIFIER_SSR_SERVICE; - break; - } - - return service; -} - -static void audio_notifer_disable_service(int service) -{ - int i; - - for (i = 0; i < AUDIO_NOTIFIER_MAX_DOMAINS; i++) - service_data[service][i].state = NO_SERVICE; -} - -static bool audio_notifer_is_service_enabled(int service) -{ - int i; - - for (i = 0; i < AUDIO_NOTIFIER_MAX_DOMAINS; i++) - if (service_data[service][i].state != NO_SERVICE) - return true; - return false; -} - -static void audio_notifer_init_service(int service) -{ - int i; - - for (i = 0; i < AUDIO_NOTIFIER_MAX_DOMAINS; i++) { - if (service_data[service][i].state == UNINIT_SERVICE) - service_data[service][i].state = - AUDIO_NOTIFIER_SERVICE_DOWN; - } -} - -static int audio_notifer_reg_service(int service, int domain) -{ - void *handle; - int ret = 0; - int curr_state = AUDIO_NOTIFIER_SERVICE_DOWN; - - switch (service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - handle = audio_ssr_register( - service_data[service][domain].domain_id, - service_data[service][domain].nb); - break; - case AUDIO_NOTIFIER_PDR_SERVICE: - handle = audio_pdr_service_register( - service_data[service][domain].domain_id, - service_data[service][domain].nb, &curr_state); - - if (curr_state == SERVREG_NOTIF_SERVICE_STATE_UP_V01) - curr_state = AUDIO_NOTIFIER_SERVICE_UP; - else - curr_state = AUDIO_NOTIFIER_SERVICE_DOWN; - break; - default: - pr_err("%s: Invalid service %d\n", - __func__, service); - ret = -EINVAL; - goto done; - } - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: handle is incorrect for service %s\n", - __func__, service_data[service][domain].name); - ret = -EINVAL; - goto done; - } - service_data[service][domain].state = curr_state; - service_data[service][domain].handle = handle; - - pr_info("%s: service %s is in use\n", - __func__, service_data[service][domain].name); - pr_debug("%s: service %s has current state %d, handle 0x%pK\n", - __func__, service_data[service][domain].name, - service_data[service][domain].state, - service_data[service][domain].handle); -done: - return ret; -} - -static int audio_notifer_dereg_service(int service, int domain) -{ - int ret; - - switch (service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - ret = audio_ssr_deregister( - service_data[service][domain].handle, - service_data[service][domain].nb); - break; - case AUDIO_NOTIFIER_PDR_SERVICE: - ret = audio_pdr_service_deregister( - service_data[service][domain].handle, - service_data[service][domain].nb); - break; - default: - pr_err("%s: Invalid service %d\n", - __func__, service); - ret = -EINVAL; - goto done; - } - if (ret < 0) { - pr_err("%s: deregister failed for service %s, ret %d\n", - __func__, service_data[service][domain].name, ret); - goto done; - } - - pr_debug("%s: service %s with handle 0x%pK deregistered\n", - __func__, service_data[service][domain].name, - service_data[service][domain].handle); - - service_data[service][domain].state = AUDIO_NOTIFIER_SERVICE_DOWN; - service_data[service][domain].handle = NULL; -done: - return ret; -} - -static int audio_notifer_reg_client_service(struct client_data *client_data, - int service) -{ - int ret = 0; - int domain = client_data->domain; - struct audio_notifier_cb_data data; - - switch (service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - case AUDIO_NOTIFIER_PDR_SERVICE: - if (service_data[service][domain].num_of_clients == 0) - ret = audio_notifer_reg_service(service, domain); - break; - default: - pr_err("%s: Invalid service for client %s, service %d, domain %d\n", - __func__, client_data->client_name, service, domain); - ret = -EINVAL; - goto done; - } - - if (ret < 0) { - pr_err("%s: service registration failed on service %s for client %s\n", - __func__, service_data[service][domain].name, - client_data->client_name); - goto done; - } - - client_data->service = service; - srcu_notifier_chain_register( - &service_data[service][domain].client_nb_list, - client_data->nb); - service_data[service][domain].num_of_clients++; - - pr_debug("%s: registered client %s on service %s, current state 0x%x\n", - __func__, client_data->client_name, - service_data[service][domain].name, - service_data[service][domain].state); - - /* - * PDR registration returns current state - * Force callback of client with current state for PDR - */ - if (client_data->service == AUDIO_NOTIFIER_PDR_SERVICE) { - data.service = service; - data.domain = domain; - (void)client_data->nb->notifier_call(client_data->nb, - service_data[service][domain].state, &data); - } -done: - return ret; -} - -static int audio_notifer_reg_client(struct client_data *client_data) -{ - int ret = 0; - int service; - int domain = client_data->domain; - - service = audio_notifer_get_default_service(domain); - if (service < 0) { - pr_err("%s: service %d is incorrect\n", __func__, service); - ret = -EINVAL; - goto done; - } - - /* Search through services to find a valid one to register client on. */ - for (; service >= 0; service--) { - /* If a service is not initialized, wait for it to come up. */ - if (service_data[service][domain].state == UNINIT_SERVICE) - goto done; - /* Skip unsupported service and domain combinations. */ - if (service_data[service][domain].state < 0) - continue; - /* Only register clients who have not acquired a service. */ - if (client_data->service != NO_SERVICE) - continue; - - /* - * Only register clients, who have not acquired a service, on - * the best available service for their domain. Uninitialized - * services will try to register all of their clients after - * they initialize correctly or will disable their service and - * register clients on the next best avaialable service. - */ - pr_debug("%s: register client %s on service %s", - __func__, client_data->client_name, - service_data[service][domain].name); - - ret = audio_notifer_reg_client_service(client_data, service); - if (ret < 0) - pr_err("%s: client %s failed to register on service %s", - __func__, client_data->client_name, - service_data[service][domain].name); - } - -done: - return ret; -} - -static int audio_notifer_dereg_client(struct client_data *client_data) -{ - int ret = 0; - int service = client_data->service; - int domain = client_data->domain; - - switch (client_data->service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - case AUDIO_NOTIFIER_PDR_SERVICE: - if (service_data[service][domain].num_of_clients == 1) - ret = audio_notifer_dereg_service(service, domain); - break; - case NO_SERVICE: - goto done; - default: - pr_err("%s: Invalid service for client %s, service %d\n", - __func__, client_data->client_name, - client_data->service); - ret = -EINVAL; - goto done; - } - - if (ret < 0) { - pr_err("%s: deregister failed for client %s on service %s, ret %d\n", - __func__, client_data->client_name, - service_data[service][domain].name, ret); - goto done; - } - - ret = srcu_notifier_chain_unregister(&service_data[service][domain]. - client_nb_list, client_data->nb); - if (ret < 0) { - pr_err("%s: srcu_notifier_chain_unregister failed, ret %d\n", - __func__, ret); - goto done; - } - - pr_debug("%s: deregistered client %s on service %s\n", - __func__, client_data->client_name, - service_data[service][domain].name); - - client_data->service = NO_SERVICE; - if (service_data[service][domain].num_of_clients > 0) - service_data[service][domain].num_of_clients--; -done: - return ret; -} - -static void audio_notifer_reg_all_clients(void) -{ - struct list_head *ptr, *next; - struct client_data *client_data; - int ret; - - list_for_each_safe(ptr, next, &client_list) { - client_data = list_entry(ptr, struct client_data, list); - - ret = audio_notifer_reg_client(client_data); - if (ret < 0) - pr_err("%s: audio_notifer_reg_client failed for client %s, ret %d\n", - __func__, client_data->client_name, - ret); - } -} - -static int audio_notifer_pdr_callback(struct notifier_block *this, - unsigned long opcode, void *data) -{ - pr_debug("%s: Audio PDR framework state 0x%lx\n", - __func__, opcode); - mutex_lock(¬ifier_mutex); - if (opcode == AUDIO_PDR_FRAMEWORK_DOWN) - audio_notifer_disable_service(AUDIO_NOTIFIER_PDR_SERVICE); - else - audio_notifer_init_service(AUDIO_NOTIFIER_PDR_SERVICE); - - audio_notifer_reg_all_clients(); - mutex_unlock(¬ifier_mutex); - return 0; -} - -static struct notifier_block pdr_nb = { - .notifier_call = audio_notifer_pdr_callback, - .priority = 0, -}; - -static int audio_notifer_convert_opcode(unsigned long opcode, - unsigned long *notifier_opcode) -{ - int ret = 0; - - switch (opcode) { - case SUBSYS_BEFORE_SHUTDOWN: - case SERVREG_NOTIF_SERVICE_STATE_DOWN_V01: - *notifier_opcode = AUDIO_NOTIFIER_SERVICE_DOWN; - break; - case SUBSYS_AFTER_POWERUP: - case SERVREG_NOTIF_SERVICE_STATE_UP_V01: - *notifier_opcode = AUDIO_NOTIFIER_SERVICE_UP; - break; - default: - pr_debug("%s: Unused opcode 0x%lx\n", __func__, opcode); - ret = -EINVAL; - } - - return ret; -} - -static int audio_notifer_service_cb(unsigned long opcode, - int service, int domain) -{ - int ret = 0; - unsigned long notifier_opcode; - struct audio_notifier_cb_data data; - - if (audio_notifer_convert_opcode(opcode, ¬ifier_opcode) < 0) - goto done; - - data.service = service; - data.domain = domain; - - pr_debug("%s: service %s, opcode 0x%lx\n", - __func__, service_data[service][domain].name, notifier_opcode); - - mutex_lock(¬ifier_mutex); - - service_data[service][domain].state = notifier_opcode; - ret = srcu_notifier_call_chain(&service_data[service][domain]. - client_nb_list, notifier_opcode, &data); - if (ret < 0) - pr_err("%s: srcu_notifier_call_chain returned %d, service %s, opcode 0x%lx\n", - __func__, ret, service_data[service][domain].name, - notifier_opcode); - - mutex_unlock(¬ifier_mutex); -done: - return NOTIFY_OK; -} - -static int audio_notifer_pdr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - return audio_notifer_service_cb(opcode, - AUDIO_NOTIFIER_PDR_SERVICE, - AUDIO_NOTIFIER_ADSP_DOMAIN); -} - -static int audio_notifer_ssr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - return audio_notifer_service_cb(opcode, - AUDIO_NOTIFIER_SSR_SERVICE, - AUDIO_NOTIFIER_ADSP_DOMAIN); -} - -static int audio_notifer_ssr_modem_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - return audio_notifer_service_cb(opcode, - AUDIO_NOTIFIER_SSR_SERVICE, - AUDIO_NOTIFIER_MODEM_DOMAIN); -} - -int audio_notifier_deregister(char *client_name) -{ - int ret = 0; - int ret2; - struct list_head *ptr, *next; - struct client_data *client_data = NULL; - - if (client_name == NULL) { - pr_err("%s: client_name is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - mutex_lock(¬ifier_mutex); - list_for_each_safe(ptr, next, &client_list) { - client_data = list_entry(ptr, struct client_data, list); - if (!strcmp(client_name, client_data->client_name)) { - ret2 = audio_notifer_dereg_client(client_data); - if (ret2 < 0) { - pr_err("%s: audio_notifer_dereg_client failed, ret %d\n, service %d, domain %d", - __func__, ret2, client_data->service, - client_data->domain); - ret = ret2; - continue; - } - list_del(&client_data->list); - kfree(client_data); - } - } - mutex_unlock(¬ifier_mutex); -done: - return ret; -} -EXPORT_SYMBOL(audio_notifier_deregister); - -int audio_notifier_register(char *client_name, int domain, - struct notifier_block *nb) -{ - int ret; - struct client_data *client_data; - - if (client_name == NULL) { - pr_err("%s: client_name is NULL\n", __func__); - ret = -EINVAL; - goto done; - } else if (nb == NULL) { - pr_err("%s: Notifier block is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - client_data = kmalloc(sizeof(*client_data), GFP_KERNEL); - if (client_data == NULL) { - ret = -ENOMEM; - goto done; - } - INIT_LIST_HEAD(&client_data->list); - client_data->nb = nb; - strlcpy(client_data->client_name, client_name, - sizeof(client_data->client_name)); - client_data->service = NO_SERVICE; - client_data->domain = domain; - - mutex_lock(¬ifier_mutex); - ret = audio_notifer_reg_client(client_data); - if (ret < 0) { - mutex_unlock(¬ifier_mutex); - pr_err("%s: audio_notifer_reg_client for client %s failed ret = %d\n", - __func__, client_data->client_name, - ret); - kfree(client_data); - goto done; - } - list_add_tail(&client_data->list, &client_list); - mutex_unlock(¬ifier_mutex); -done: - return ret; -} -EXPORT_SYMBOL(audio_notifier_register); - -static int __init audio_notifier_subsys_init(void) -{ - int i, j; - - mutex_init(¬ifier_mutex); - INIT_LIST_HEAD(&client_list); - for (i = 0; i < AUDIO_NOTIFIER_MAX_SERVICES; i++) { - for (j = 0; j < AUDIO_NOTIFIER_MAX_DOMAINS; j++) { - if (service_data[i][j].state <= NO_SERVICE) - continue; - - srcu_init_notifier_head( - &service_data[i][j].client_nb_list); - } - } - - return 0; -} - -static int __init audio_notifier_late_init(void) -{ - /* - * If pdr registration failed, register clients on next service - * Do in late init to ensure that SSR subsystem is initialized - */ - mutex_lock(¬ifier_mutex); - if (!audio_notifer_is_service_enabled(AUDIO_NOTIFIER_PDR_SERVICE)) - audio_notifer_reg_all_clients(); - - mutex_unlock(¬ifier_mutex); - return 0; -} - -static int __init audio_notifier_init(void) -{ - int ret; - - audio_notifier_subsys_init(); - - ret = audio_pdr_register(&pdr_nb); - if (ret < 0) { - pr_err("%s: PDR register failed, ret = %d, disable service\n", - __func__, ret); - audio_notifer_disable_service(AUDIO_NOTIFIER_PDR_SERVICE); - } - - /* Do not return error since PDR enablement is not critical */ - audio_notifier_late_init(); - - return 0; -} -module_init(audio_notifier_init); - -static void __exit audio_notifier_exit(void) -{ - audio_pdr_deregister(&pdr_nb); -} -module_exit(audio_notifier_exit); - -MODULE_DESCRIPTION("Audio notifier driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/audio_pdr.c b/techpack/audio/4.0/dsp/audio_pdr.c deleted file mode 100644 index b9341dec1e52..000000000000 --- a/techpack/audio/4.0/dsp/audio_pdr.c +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include "audio_pdr.h" - -static struct pd_qmi_client_data audio_pdr_services[AUDIO_PDR_DOMAIN_MAX] = { - { /* AUDIO_PDR_DOMAIN_ADSP */ - .client_name = "audio_pdr_adsp", - .service_name = "avs/audio" - } -}; - -struct srcu_notifier_head audio_pdr_cb_list; - -static int audio_pdr_locator_callback(struct notifier_block *this, - unsigned long opcode, void *data) -{ - unsigned long pdr_state = AUDIO_PDR_FRAMEWORK_DOWN; - - if (opcode == LOCATOR_DOWN) { - pr_debug("%s: Service %s is down!", __func__, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP]. - service_name); - goto done; - } - - memcpy(&audio_pdr_services, data, - sizeof(audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP])); - if (audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].total_domains == 1) { - pr_debug("%s: Service %s, returned total domains %d, ", - __func__, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].service_name, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP]. - total_domains); - pdr_state = AUDIO_PDR_FRAMEWORK_UP; - goto done; - } else - pr_err("%s: Service %s returned invalid total domains %d", - __func__, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].service_name, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP]. - total_domains); -done: - srcu_notifier_call_chain(&audio_pdr_cb_list, pdr_state, NULL); - return NOTIFY_OK; -} - -static struct notifier_block audio_pdr_locator_nb = { - .notifier_call = audio_pdr_locator_callback, - .priority = 0, -}; - -/** - * audio_pdr_register - - * register to PDR framework - * - * @nb: notifier block - * - * Returns 0 on success or error on failure - */ -int audio_pdr_register(struct notifier_block *nb) -{ - if (nb == NULL) { - pr_err("%s: Notifier block is NULL\n", __func__); - return -EINVAL; - } - return srcu_notifier_chain_register(&audio_pdr_cb_list, nb); -} -EXPORT_SYMBOL(audio_pdr_register); - -/** - * audio_pdr_deregister - - * Deregister from PDR framework - * - * @nb: notifier block - * - * Returns 0 on success or error on failure - */ -int audio_pdr_deregister(struct notifier_block *nb) -{ - if (nb == NULL) { - pr_err("%s: Notifier block is NULL\n", __func__); - return -EINVAL; - } - return srcu_notifier_chain_unregister(&audio_pdr_cb_list, nb); -} -EXPORT_SYMBOL(audio_pdr_deregister); - -void *audio_pdr_service_register(int domain_id, - struct notifier_block *nb, int *curr_state) -{ - void *handle; - - if ((domain_id < 0) || - (domain_id >= AUDIO_PDR_DOMAIN_MAX)) { - pr_err("%s: Invalid service ID %d\n", __func__, domain_id); - return ERR_PTR(-EINVAL); - } - - handle = service_notif_register_notifier( - audio_pdr_services[domain_id].domain_list[0].name, - audio_pdr_services[domain_id].domain_list[0].instance_id, - nb, curr_state); - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: Failed to register for service %s, instance %d\n", - __func__, - audio_pdr_services[domain_id].domain_list[0].name, - audio_pdr_services[domain_id].domain_list[0]. - instance_id); - } - return handle; -} -EXPORT_SYMBOL(audio_pdr_service_register); - -int audio_pdr_service_deregister(void *service_handle, - struct notifier_block *nb) -{ - int ret; - - if (service_handle == NULL) { - pr_err("%s: service handle is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = service_notif_unregister_notifier( - service_handle, nb); - if (ret < 0) - pr_err("%s: Failed to deregister service ret %d\n", - __func__, ret); -done: - return ret; -} -EXPORT_SYMBOL(audio_pdr_service_deregister); - -static int __init audio_pdr_subsys_init(void) -{ - srcu_init_notifier_head(&audio_pdr_cb_list); - return 0; -} - -static int __init audio_pdr_late_init(void) -{ - int ret; - - audio_pdr_subsys_init(); - - ret = get_service_location( - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].client_name, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].service_name, - &audio_pdr_locator_nb); - if (ret < 0) { - pr_err("%s get_service_location failed ret %d\n", - __func__, ret); - srcu_notifier_call_chain(&audio_pdr_cb_list, - AUDIO_PDR_FRAMEWORK_DOWN, NULL); - } - - return ret; -} -module_init(audio_pdr_late_init); - -static void __exit audio_pdr_late_exit(void) -{ -} -module_exit(audio_pdr_late_exit); - -MODULE_DESCRIPTION("PDR framework driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/audio_pdr.h b/techpack/audio/4.0/dsp/audio_pdr.h deleted file mode 100644 index e563275ee5e3..000000000000 --- a/techpack/audio/4.0/dsp/audio_pdr.h +++ /dev/null @@ -1,98 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef __AUDIO_PDR_H_ -#define __AUDIO_PDR_H_ - -enum { - AUDIO_PDR_DOMAIN_ADSP, - AUDIO_PDR_DOMAIN_MAX -}; - -enum { - AUDIO_PDR_FRAMEWORK_DOWN, - AUDIO_PDR_FRAMEWORK_UP -}; - -#ifdef CONFIG_MSM_QDSP6_PDR - -/* - * Use audio_pdr_register to register with the PDR subsystem this - * should be done before module late init otherwise notification - * of the AUDIO_PDR_FRAMEWORK_UP cannot be guaranteed. - * - * *nb - Pointer to a notifier block. Provide a callback function - * to be notified once the PDR framework has been initialized. - * Callback will receive either the AUDIO_PDR_FRAMEWORK_DOWN - * or AUDIO_PDR_FRAMEWORK_UP ioctl depending on the state of - * the PDR framework. - * - * Returns: Success: 0 - * Failure: Error code - */ -int audio_pdr_register(struct notifier_block *nb); -int audio_pdr_deregister(struct notifier_block *nb); - -/* - * Use audio_pdr_service_register to register with a PDR service - * Function should be called after nb callback registered with - * audio_pdr_register has been called back with the - * AUDIO_PDR_FRAMEWORK_UP ioctl. - * - * domain_id - Domain to use, example: AUDIO_PDR_ADSP - * *nb - Pointer to a notifier block. Provide a callback function - * that will be notified of the state of the domain - * requested. The ioctls received by the callback are - * defined in service-notifier.h. - * - * Returns: Success: Client handle - * Failure: Pointer error code - */ -void *audio_pdr_service_register(int domain_id, - struct notifier_block *nb, int *curr_state); - -/* - * Use audio_pdr_service_deregister to deregister with a PDR - * service that was registered using the audio_pdr_service_register - * API. - * - * *service_handle - Service handle returned by audio_pdr_service_register - * *nb - Pointer to the notifier block. Used in the call to - * audio_pdr_service_register. - * - * Returns: Success: Client handle - * Failure: Error code - */ -int audio_pdr_service_deregister(void *service_handle, - struct notifier_block *nb); - -#else - -static inline int audio_pdr_register(struct notifier_block *nb) -{ - return -ENODEV; -} - -static inline int audio_pdr_deregister(struct notifier_block *nb) -{ - return -ENODEV; -} - -static inline void *audio_pdr_service_register(int domain_id, - struct notifier_block *nb, - int *curr_state) -{ - return NULL; -} - -static inline int audio_pdr_service_deregister(void *service_handle, - struct notifier_block *nb) -{ - return 0; -} - -#endif /* CONFIG_MSM_QDSP6_PDR */ - -#endif diff --git a/techpack/audio/4.0/dsp/audio_slimslave.c b/techpack/audio/4.0/dsp/audio_slimslave.c deleted file mode 100644 index b09506a05f18..000000000000 --- a/techpack/audio/4.0/dsp/audio_slimslave.c +++ /dev/null @@ -1,168 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2014, 2017-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static struct slim_device *slim; -static int vote_count; -struct mutex suspend_lock; -bool suspend; - -static int audio_slim_open(struct inode *inode, struct file *file) -{ - pr_debug("%s:\n", __func__); - - if (vote_count) { - pr_debug("%s: unvote: vote_count=%d\n", __func__, vote_count); - pm_runtime_mark_last_busy(slim->dev.parent); - pm_runtime_put(slim->dev.parent); - vote_count--; - } - return 0; -}; - -static int audio_slim_release(struct inode *inode, struct file *file) -{ - pr_debug("%s:\n", __func__); - - if (vote_count) { - pr_debug("%s: unvote: vote_count=%d\n", __func__, vote_count); - pm_runtime_mark_last_busy(slim->dev.parent); - pm_runtime_put(slim->dev.parent); - vote_count--; - } else { - pr_debug("%s: vote: vote_count=%d\n", __func__, vote_count); - pm_runtime_get_sync(slim->dev.parent); - vote_count++; - } - return 0; -}; - -static long audio_slim_ioctl(struct file *file, unsigned int cmd, - unsigned long u_arg) -{ - switch (cmd) { - case AUDIO_SLIMSLAVE_VOTE: - mutex_lock(&suspend_lock); - if (!vote_count && !suspend) { - pr_debug("%s:AUDIO_SLIMSLAVE_VOTE\n", __func__); - pm_runtime_get_sync(slim->dev.parent); - vote_count++; - } else { - pr_err("%s:Invalid vote: vote_count=%d suspend=%d\n", - __func__, vote_count, suspend); - } - mutex_unlock(&suspend_lock); - break; - case AUDIO_SLIMSLAVE_UNVOTE: - mutex_lock(&suspend_lock); - if (vote_count && !suspend) { - pr_debug("%s:AUDIO_SLIMSLAVE_UNVOTE\n", __func__); - pm_runtime_mark_last_busy(slim->dev.parent); - pm_runtime_put(slim->dev.parent); - vote_count--; - } else { - pr_err("%s:Invalid unvote: vote_count=%d suspend=%d\n", - __func__, vote_count, suspend); - } - mutex_unlock(&suspend_lock); - break; - default: - pr_debug("%s: Invalid ioctl cmd: %d\n", __func__, cmd); - break; - } - return 0; -} - -static const struct file_operations audio_slimslave_fops = { - .open = audio_slim_open, - .unlocked_ioctl = audio_slim_ioctl, - .release = audio_slim_release, -}; - -struct miscdevice audio_slimslave_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = AUDIO_SLIMSLAVE_IOCTL_NAME, - .fops = &audio_slimslave_fops, -}; - -static int audio_slimslave_probe(struct slim_device *audio_slim) -{ - pr_debug("%s:\n", __func__); - - mutex_init(&suspend_lock); - suspend = false; - slim = audio_slim; - misc_register(&audio_slimslave_misc); - return 0; -} - -static int audio_slimslave_remove(struct slim_device *audio_slim) -{ - pr_debug("%s:\n", __func__); - - misc_deregister(&audio_slimslave_misc); - return 0; -} - -static int audio_slimslave_resume(struct slim_device *audio_slim) -{ - pr_debug("%s:\n", __func__); - - mutex_lock(&suspend_lock); - suspend = false; - mutex_unlock(&suspend_lock); - return 0; -} - -static int audio_slimslave_suspend(struct slim_device *audio_slim, - pm_message_t pmesg) -{ - pr_debug("%s:\n", __func__); - - mutex_lock(&suspend_lock); - suspend = true; - mutex_unlock(&suspend_lock); - return 0; -} - -static const struct slim_device_id audio_slimslave_dt_match[] = { - {"audio-slimslave", 0}, - {} -}; - -static struct slim_driver audio_slimslave_driver = { - .driver = { - .name = "audio-slimslave", - .owner = THIS_MODULE, - }, - .probe = audio_slimslave_probe, - .remove = audio_slimslave_remove, - .id_table = audio_slimslave_dt_match, - .resume = audio_slimslave_resume, - .suspend = audio_slimslave_suspend, -}; - -int __init audio_slimslave_init(void) -{ - return slim_driver_register(&audio_slimslave_driver); -} - -void audio_slimslave_exit(void) -{ - slim_driver_unregister(&audio_slimslave_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("Audio side Slimbus slave driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/audio_ssr.c b/techpack/audio/4.0/dsp/audio_ssr.c deleted file mode 100644 index 9a9467ae73a2..000000000000 --- a/techpack/audio/4.0/dsp/audio_ssr.c +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include "audio_ssr.h" - -static char *audio_ssr_domains[] = { - "adsp", - "modem" -}; - -/** - * audio_ssr_register - - * register to SSR framework - * - * @domain_id: Domain ID to register with - * @nb: notifier block - * - * Returns handle pointer on success or error PTR on failure - */ -void *audio_ssr_register(int domain_id, struct notifier_block *nb) -{ - if ((domain_id < 0) || - (domain_id >= AUDIO_SSR_DOMAIN_MAX)) { - pr_err("%s: Invalid service ID %d\n", __func__, domain_id); - return ERR_PTR(-EINVAL); - } - - return subsys_notif_register_notifier( - audio_ssr_domains[domain_id], nb); -} -EXPORT_SYMBOL(audio_ssr_register); - -/** - * audio_ssr_deregister - - * Deregister handle from SSR framework - * - * @handle: SSR handle - * @nb: notifier block - * - * Returns 0 on success or error on failure - */ -int audio_ssr_deregister(void *handle, struct notifier_block *nb) -{ - return subsys_notif_unregister_notifier(handle, nb); -} -EXPORT_SYMBOL(audio_ssr_deregister); - diff --git a/techpack/audio/4.0/dsp/audio_ssr.h b/techpack/audio/4.0/dsp/audio_ssr.h deleted file mode 100644 index e79c59433d78..000000000000 --- a/techpack/audio/4.0/dsp/audio_ssr.h +++ /dev/null @@ -1,70 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. - */ - -#ifndef __AUDIO_SSR_H_ -#define __AUDIO_SSR_H_ - -enum { - AUDIO_SSR_DOMAIN_ADSP, - AUDIO_SSR_DOMAIN_MODEM, - AUDIO_SSR_DOMAIN_MAX -}; - -#ifdef CONFIG_MSM_QDSP6_SSR - -/* - * Use audio_ssr_register to register with the SSR subsystem - * - * domain_id - Service to use, example: AUDIO_SSR_DOMAIN_ADSP - * *nb - Pointer to a notifier block. Provide a callback function - * to be notified of an event for that service. The ioctls - * used by the callback are defined in subsystem_notif.h. - * - * Returns: Success: Client handle - * Failure: Pointer error code - */ -void *audio_ssr_register(int domain_id, struct notifier_block *nb); - -/* - * Use audio_ssr_deregister to register with the SSR subsystem - * - * handle - Handle received from audio_ssr_register - * *nb - Pointer to a notifier block. Callback function - * Used from audio_ssr_register. - * - * Returns: Success: 0 - * Failure: Error code - */ -int audio_ssr_deregister(void *handle, struct notifier_block *nb); - - -/* - * Use audio_ssr_send_nmi to force a RAM dump on ADSP - * down event. - * - * *ssr_cb_data - *data received from notifier callback - */ -void audio_ssr_send_nmi(void *ssr_cb_data); - -#else - -static inline void *audio_ssr_register(int domain_id, - struct notifier_block *nb) -{ - return NULL; -} - -static inline int audio_ssr_deregister(void *handle, struct notifier_block *nb) -{ - return 0; -} - -static inline void audio_ssr_send_nmi(void *ssr_cb_data) -{ -} - -#endif /* CONFIG_MSM_QDSP6_SSR */ - -#endif diff --git a/techpack/audio/4.0/dsp/avtimer.c b/techpack/audio/4.0/dsp/avtimer.c deleted file mode 100644 index e1d032d53661..000000000000 --- a/techpack/audio/4.0/dsp/avtimer.c +++ /dev/null @@ -1,640 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2015, 2017-2019 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if IS_ENABLED(CONFIG_AVTIMER_LEGACY) -#include -#endif -#include -#include - -#define DEVICE_NAME "avtimer" -#define TIMEOUT_MS 1000 -#define CORE_CLIENT 1 -#define TEMP_PORT ((CORE_CLIENT << 8) | 0x0001) -#define SSR_WAKETIME 1000 -#define Q6_READY_RETRY 250 -#define Q6_READY_MAX_RETRIES 40 - -#define AVCS_CMD_REMOTE_AVTIMER_VOTE_REQUEST 0x00012914 -#define AVCS_CMD_RSP_REMOTE_AVTIMER_VOTE_REQUEST 0x00012915 -#define AVCS_CMD_REMOTE_AVTIMER_RELEASE_REQUEST 0x00012916 -#define AVTIMER_REG_CNT 2 - -struct adsp_avt_timer { - struct apr_hdr hdr; - union { - char client_name[8]; - u32 avtimer_handle; - }; -} __packed; - -static int major; - -struct avtimer_t { - struct apr_svc *core_handle_q; - struct cdev myc; - struct class *avtimer_class; - struct mutex avtimer_lock; - int avtimer_open_cnt; - struct delayed_work ssr_dwork; - wait_queue_head_t adsp_resp_wait; - int enable_timer_resp_received; - int timer_handle; - void __iomem *p_avtimer_msw; - void __iomem *p_avtimer_lsw; - uint32_t clk_div; - uint32_t clk_mult; - atomic_t adsp_ready; - int num_retries; -}; - -static struct avtimer_t avtimer; -static void avcs_set_isp_fptr(bool enable); - -static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv) -{ - uint32_t *payload1; - - if (!data) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - pr_debug("%s: core msg: payload len = %u, apr resp opcode = 0x%X\n", - __func__, data->payload_size, data->opcode); - - switch (data->opcode) { - - case APR_BASIC_RSP_RESULT:{ - - if (!data->payload_size) { - pr_err("%s: APR_BASIC_RSP_RESULT No Payload ", - __func__); - return 0; - } - - payload1 = data->payload; - - if (data->payload_size < 2 * sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - - switch (payload1[0]) { - case AVCS_CMD_REMOTE_AVTIMER_RELEASE_REQUEST: - pr_debug("%s: Cmd = TIMER RELEASE status[0x%x]\n", - __func__, payload1[1]); - break; - default: - pr_err("Invalid cmd rsp[0x%x][0x%x]\n", - payload1[0], payload1[1]); - break; - } - break; - } - - case RESET_EVENTS:{ - pr_debug("%s: Reset event received in AV timer\n", __func__); - apr_reset(avtimer.core_handle_q); - avtimer.core_handle_q = NULL; - avtimer.avtimer_open_cnt = 0; - atomic_set(&avtimer.adsp_ready, 0); - schedule_delayed_work(&avtimer.ssr_dwork, - msecs_to_jiffies(SSR_WAKETIME)); - break; - } - - case AVCS_CMD_RSP_REMOTE_AVTIMER_VOTE_REQUEST: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - pr_debug("%s: RSP_REMOTE_AVTIMER_VOTE_REQUEST handle %x\n", - __func__, payload1[0]); - avtimer.timer_handle = payload1[0]; - avtimer.enable_timer_resp_received = 1; - wake_up(&avtimer.adsp_resp_wait); - break; - default: - pr_err("%s: Message adspcore svc: %d\n", - __func__, data->opcode); - break; - } - - return 0; -} - -int avcs_core_open(void) -{ - if (!avtimer.core_handle_q) - avtimer.core_handle_q = apr_register("ADSP", "CORE", - aprv2_core_fn_q, TEMP_PORT, NULL); - pr_debug("%s: Open_q %p\n", __func__, avtimer.core_handle_q); - if (!avtimer.core_handle_q) { - pr_err("%s: Unable to register CORE\n", __func__); - return -EINVAL; - } - return 0; -} -EXPORT_SYMBOL(avcs_core_open); - -static int avcs_core_disable_avtimer(int timerhandle) -{ - int rc = -EINVAL; - struct adsp_avt_timer payload; - - if (!timerhandle) { - pr_err("%s: Invalid timer handle\n", __func__); - return -EINVAL; - } - memset(&payload, 0, sizeof(payload)); - rc = avcs_core_open(); - if (!rc && avtimer.core_handle_q) { - payload.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - payload.hdr.pkt_size = - sizeof(struct adsp_avt_timer); - payload.hdr.src_svc = avtimer.core_handle_q->id; - payload.hdr.src_domain = APR_DOMAIN_APPS; - payload.hdr.dest_domain = APR_DOMAIN_ADSP; - payload.hdr.dest_svc = APR_SVC_ADSP_CORE; - payload.hdr.src_port = TEMP_PORT; - payload.hdr.dest_port = TEMP_PORT; - payload.hdr.token = CORE_CLIENT; - payload.hdr.opcode = AVCS_CMD_REMOTE_AVTIMER_RELEASE_REQUEST; - payload.avtimer_handle = timerhandle; - pr_debug("%s: disable avtimer opcode %x handle %x\n", - __func__, payload.hdr.opcode, payload.avtimer_handle); - rc = apr_send_pkt(avtimer.core_handle_q, - (uint32_t *)&payload); - if (rc < 0) - pr_err("%s: Enable AVtimer failed op[0x%x]rc[%d]\n", - __func__, payload.hdr.opcode, rc); - else - rc = 0; - } - return rc; -} - -static int avcs_core_enable_avtimer(char *client_name) -{ - int rc = -EINVAL, ret = -EINVAL; - struct adsp_avt_timer payload; - - if (!client_name) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - memset(&payload, 0, sizeof(payload)); - rc = avcs_core_open(); - if (!rc && avtimer.core_handle_q) { - avtimer.enable_timer_resp_received = 0; - payload.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - payload.hdr.pkt_size = - sizeof(struct adsp_avt_timer); - payload.hdr.src_svc = avtimer.core_handle_q->id; - payload.hdr.src_domain = APR_DOMAIN_APPS; - payload.hdr.dest_domain = APR_DOMAIN_ADSP; - payload.hdr.dest_svc = APR_SVC_ADSP_CORE; - payload.hdr.src_port = TEMP_PORT; - payload.hdr.dest_port = TEMP_PORT; - payload.hdr.token = CORE_CLIENT; - payload.hdr.opcode = AVCS_CMD_REMOTE_AVTIMER_VOTE_REQUEST; - strlcpy(payload.client_name, client_name, - sizeof(payload.client_name)); - pr_debug("%s: enable avtimer opcode %x client name %s\n", - __func__, payload.hdr.opcode, payload.client_name); - rc = apr_send_pkt(avtimer.core_handle_q, - (uint32_t *)&payload); - if (rc < 0) { - pr_err("%s: Enable AVtimer failed op[0x%x]rc[%d]\n", - __func__, payload.hdr.opcode, rc); - goto bail; - } else - rc = 0; - ret = wait_event_timeout(avtimer.adsp_resp_wait, - (avtimer.enable_timer_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for Enable timer\n", - __func__); - rc = -ETIMEDOUT; - } - if (rc) - avtimer.timer_handle = 0; - } -bail: - return rc; -} - -int avcs_core_disable_power_collapse(int enable) -{ - int rc = 0; - - mutex_lock(&avtimer.avtimer_lock); - if (enable) { - if (avtimer.avtimer_open_cnt) { - avtimer.avtimer_open_cnt++; - pr_debug("%s: opened avtimer open count=%d\n", - __func__, avtimer.avtimer_open_cnt); - rc = 0; - goto done; - } - rc = avcs_core_enable_avtimer("timer"); - if (!rc) { - avtimer.avtimer_open_cnt++; - atomic_set(&avtimer.adsp_ready, 1); - } - } else { - if (avtimer.avtimer_open_cnt > 0) { - avtimer.avtimer_open_cnt--; - if (!avtimer.avtimer_open_cnt) { - rc = avcs_core_disable_avtimer( - avtimer.timer_handle); - avtimer.timer_handle = 0; - atomic_set(&avtimer.adsp_ready, 0); - } - } - } -done: - mutex_unlock(&avtimer.avtimer_lock); - return rc; -} -EXPORT_SYMBOL(avcs_core_disable_power_collapse); - -static void reset_work(struct work_struct *work) -{ - if (q6core_is_adsp_ready()) { - avcs_core_disable_power_collapse(1); - avtimer.num_retries = Q6_READY_MAX_RETRIES; - return; - } - pr_debug("%s:Q6 not ready-retry after sometime\n", __func__); - if (--avtimer.num_retries > 0) { - schedule_delayed_work(&avtimer.ssr_dwork, - msecs_to_jiffies(Q6_READY_RETRY)); - } else { - pr_err("%s: Q6 failed responding after multiple retries\n", - __func__); - avtimer.num_retries = Q6_READY_MAX_RETRIES; - } -} - -int avcs_core_query_timer(uint64_t *avtimer_tick) -{ - uint32_t avtimer_msw = 0, avtimer_lsw = 0; - uint64_t avtimer_tick_temp; - - if (!atomic_read(&avtimer.adsp_ready)) { - pr_debug("%s:In SSR, return\n", __func__); - return -ENETRESET; - } - avtimer_lsw = ioread32(avtimer.p_avtimer_lsw); - avtimer_msw = ioread32(avtimer.p_avtimer_msw); - - avtimer_tick_temp = (uint64_t)((uint64_t)avtimer_msw << 32) - | avtimer_lsw; - *avtimer_tick = mul_u64_u32_div(avtimer_tick_temp, avtimer.clk_mult, - avtimer.clk_div); - pr_debug_ratelimited("%s:Avtimer: msw: %u, lsw: %u, tick: %llu\n", - __func__, - avtimer_msw, avtimer_lsw, *avtimer_tick); - return 0; -} -EXPORT_SYMBOL(avcs_core_query_timer); - -/* - * avcs_core_query_timer_offset: - * derive offset between system clock & avtimer clock - * - * @ avoffset: offset between system clock & avtimer clock - * @ clock_id: clock id to get the system time - * - */ -int avcs_core_query_timer_offset(int64_t *av_offset, int32_t clock_id) -{ - uint32_t avtimer_msw = 0, avtimer_lsw = 0; - uint64_t avtimer_tick_temp, avtimer_tick, sys_time = 0; - struct timespec ts; - - if (!atomic_read(&avtimer.adsp_ready)) { - pr_debug("%s:In SSR, return\n", __func__); - return -ENETRESET; - } - - if ((avtimer.p_avtimer_lsw == NULL) || - (avtimer.p_avtimer_msw == NULL)) { - return -EINVAL; - } - - memset(&ts, 0, sizeof(struct timespec)); - avtimer_lsw = ioread32(avtimer.p_avtimer_lsw); - avtimer_msw = ioread32(avtimer.p_avtimer_msw); - - switch (clock_id) { - case CLOCK_MONOTONIC_RAW: - getrawmonotonic(&ts); - break; - case CLOCK_BOOTTIME: - get_monotonic_boottime(&ts); - break; - case CLOCK_MONOTONIC: - ktime_get_ts(&ts); - break; - case CLOCK_REALTIME: - ktime_get_real_ts(&ts); - break; - default: - pr_debug("%s: unsupported clock id %d\n", __func__, clock_id); - return -EINVAL; - } - - sys_time = ts.tv_sec * 1000000LL + div64_u64(ts.tv_nsec, 1000); - avtimer_tick_temp = (uint64_t)((uint64_t)avtimer_msw << 32) | - avtimer_lsw; - - avtimer_tick = mul_u64_u32_div(avtimer_tick_temp, avtimer.clk_mult, - avtimer.clk_div); - *av_offset = sys_time - avtimer_tick; - pr_debug("%s: sys_time: %llu, offset %lld, avtimer tick %lld\n", - __func__, sys_time, *av_offset, avtimer_tick); - - return 0; -} -EXPORT_SYMBOL(avcs_core_query_timer_offset); - -#if IS_ENABLED(CONFIG_AVTIMER_LEGACY) -static void avcs_set_isp_fptr(bool enable) -{ - struct avtimer_fptr_t av_fptr; - - if (enable) { - av_fptr.fptr_avtimer_open = avcs_core_open; - av_fptr.fptr_avtimer_enable = avcs_core_disable_power_collapse; - av_fptr.fptr_avtimer_get_time = avcs_core_query_timer; - msm_isp_set_avtimer_fptr(av_fptr); - } else { - av_fptr.fptr_avtimer_open = NULL; - av_fptr.fptr_avtimer_enable = NULL; - av_fptr.fptr_avtimer_get_time = NULL; - msm_isp_set_avtimer_fptr(av_fptr); - } -} -#else -static void avcs_set_isp_fptr(bool enable) -{ -} -#endif - -static int avtimer_open(struct inode *inode, struct file *file) -{ - return avcs_core_disable_power_collapse(1); -} - -static int avtimer_release(struct inode *inode, struct file *file) -{ - return avcs_core_disable_power_collapse(0); -} - -/* - * ioctl call provides GET_AVTIMER - */ -static long avtimer_ioctl(struct file *file, unsigned int ioctl_num, - unsigned long ioctl_param) -{ - switch (ioctl_num) { - case IOCTL_GET_AVTIMER_TICK: - { - uint64_t avtimer_tick = 0; - int rc; - - rc = avcs_core_query_timer(&avtimer_tick); - - if (rc) { - pr_err("%s: Error: Invalid AV Timer tick, rc = %d\n", - __func__, rc); - return rc; - } - - pr_debug_ratelimited("%s: AV Timer tick: time %llx\n", - __func__, avtimer_tick); - if (copy_to_user((void __user *)ioctl_param, &avtimer_tick, - sizeof(avtimer_tick))) { - pr_err("%s: copy_to_user failed\n", __func__); - return -EFAULT; - } - } - break; - - default: - pr_err("%s: invalid cmd\n", __func__); - return -EINVAL; - } - return 0; -} - -static const struct file_operations avtimer_fops = { - .unlocked_ioctl = avtimer_ioctl, - .compat_ioctl = avtimer_ioctl, - .open = avtimer_open, - .release = avtimer_release -}; - -static int dev_avtimer_probe(struct platform_device *pdev) -{ - int result = 0; - dev_t dev = MKDEV(major, 0); - struct device *device_handle; - struct resource *reg_lsb = NULL, *reg_msb = NULL; - uint32_t clk_div_val; - uint32_t clk_mult_val; - - if (!pdev) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - reg_lsb = platform_get_resource_byname(pdev, - IORESOURCE_MEM, "avtimer_lsb_addr"); - if (!reg_lsb) { - dev_err(&pdev->dev, "%s: Looking up %s property", - "avtimer_lsb_addr", __func__); - return -EINVAL; - } - reg_msb = platform_get_resource_byname(pdev, - IORESOURCE_MEM, "avtimer_msb_addr"); - if (!reg_msb) { - dev_err(&pdev->dev, "%s: Looking up %s property", - "avtimer_msb_addr", __func__); - return -EINVAL; - } - INIT_DELAYED_WORK(&avtimer.ssr_dwork, reset_work); - - avtimer.p_avtimer_lsw = devm_ioremap_nocache(&pdev->dev, - reg_lsb->start, resource_size(reg_lsb)); - if (!avtimer.p_avtimer_lsw) { - dev_err(&pdev->dev, "%s: ioremap failed for lsb avtimer register", - __func__); - return -ENOMEM; - } - - avtimer.p_avtimer_msw = devm_ioremap_nocache(&pdev->dev, - reg_msb->start, resource_size(reg_msb)); - if (!avtimer.p_avtimer_msw) { - dev_err(&pdev->dev, "%s: ioremap failed for msb avtimer register", - __func__); - goto unmap; - } - avtimer.num_retries = Q6_READY_MAX_RETRIES; - /* get the device number */ - if (major) - result = register_chrdev_region(dev, 1, DEVICE_NAME); - else { - result = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME); - major = MAJOR(dev); - } - - if (result < 0) { - dev_err(&pdev->dev, "%s: Registering avtimer device failed\n", - __func__); - goto unmap; - } - - avtimer.avtimer_class = class_create(THIS_MODULE, "avtimer"); - if (IS_ERR(avtimer.avtimer_class)) { - result = PTR_ERR(avtimer.avtimer_class); - dev_err(&pdev->dev, "%s: Error creating avtimer class: %d\n", - __func__, result); - goto unregister_chrdev_region; - } - - cdev_init(&avtimer.myc, &avtimer_fops); - result = cdev_add(&avtimer.myc, dev, 1); - - if (result < 0) { - dev_err(&pdev->dev, "%s: Registering file operations failed\n", - __func__); - goto class_destroy; - } - - device_handle = device_create(avtimer.avtimer_class, - NULL, avtimer.myc.dev, NULL, "avtimer"); - if (IS_ERR(device_handle)) { - result = PTR_ERR(device_handle); - pr_err("%s: device_create failed: %d\n", __func__, result); - goto class_destroy; - } - init_waitqueue_head(&avtimer.adsp_resp_wait); - mutex_init(&avtimer.avtimer_lock); - avtimer.avtimer_open_cnt = 0; - - pr_debug("%s: Device create done for avtimer major=%d\n", - __func__, major); - - if (of_property_read_u32(pdev->dev.of_node, - "qcom,clk-div", &clk_div_val)) - avtimer.clk_div = 1; - else - avtimer.clk_div = clk_div_val; - - if (of_property_read_u32(pdev->dev.of_node, - "qcom,clk-mult", &clk_mult_val)) - avtimer.clk_mult = 1; - else - avtimer.clk_mult = clk_mult_val; - - avcs_set_isp_fptr(true); - - pr_debug("%s: avtimer.clk_div = %d, avtimer.clk_mult = %d\n", - __func__, avtimer.clk_div, avtimer.clk_mult); - return 0; - -class_destroy: - class_destroy(avtimer.avtimer_class); -unregister_chrdev_region: - unregister_chrdev_region(MKDEV(major, 0), 1); -unmap: - if (avtimer.p_avtimer_lsw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_lsw); - if (avtimer.p_avtimer_msw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_msw); - avtimer.p_avtimer_lsw = NULL; - avtimer.p_avtimer_msw = NULL; - return result; - -} - -static int dev_avtimer_remove(struct platform_device *pdev) -{ - pr_debug("%s: dev_avtimer_remove\n", __func__); - - if (avtimer.p_avtimer_lsw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_lsw); - if (avtimer.p_avtimer_msw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_msw); - device_destroy(avtimer.avtimer_class, avtimer.myc.dev); - cdev_del(&avtimer.myc); - class_destroy(avtimer.avtimer_class); - unregister_chrdev_region(MKDEV(major, 0), 1); - avcs_set_isp_fptr(false); - - return 0; -} - -static const struct of_device_id avtimer_machine_of_match[] = { - { .compatible = "qcom,avtimer", }, - {}, -}; -static struct platform_driver dev_avtimer_driver = { - .probe = dev_avtimer_probe, - .remove = dev_avtimer_remove, - .driver = { - .name = "dev_avtimer", - .of_match_table = avtimer_machine_of_match, - .suppress_bind_attrs = true, - }, -}; - -int __init avtimer_init(void) -{ - s32 rc; - - rc = platform_driver_register(&dev_avtimer_driver); - if (rc < 0) { - pr_err("%s: platform_driver_register failed\n", __func__); - goto error_platform_driver; - } - pr_debug("%s: dev_avtimer_init : done\n", __func__); - - return 0; -error_platform_driver: - - pr_err("%s: encounterd error\n", __func__); - return rc; -} - -void avtimer_exit(void) -{ - platform_driver_unregister(&dev_avtimer_driver); -} - -MODULE_DESCRIPTION("avtimer driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/codecs/Android.mk b/techpack/audio/4.0/dsp/codecs/Android.mk deleted file mode 100644 index 48e3b8568f6e..000000000000 --- a/techpack/audio/4.0/dsp/codecs/Android.mk +++ /dev/null @@ -1,66 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) atoll kona lito),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=native_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_native.ko -LOCAL_MODULE_KBUILD_NAME := native_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/dsp/codecs/Kbuild b/techpack/audio/4.0/dsp/codecs/Kbuild deleted file mode 100644 index a68c00b8d406..000000000000 --- a/techpack/audio/4.0/dsp/codecs/Kbuild +++ /dev/null @@ -1,167 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME), ) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.19 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif - ifeq ($(CONFIG_QTI_GVM), y) - include $(AUDIO_ROOT)/config/gvmauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ Native Enc/Dec ############ - -ifdef CONFIG_MSM_QDSP6V2_CODECS - NATIVE_OBJS += q6audio_v2.o q6audio_v2_aio.o - NATIVE_OBJS += audio_utils_aio.o - NATIVE_OBJS += audio_utils.o - NATIVE_OBJS += audio_native.o - NATIVE_OBJS += aac_in.o - NATIVE_OBJS += amrnb_in.o - NATIVE_OBJS += amrwb_in.o - NATIVE_OBJS += audio_aac.o - NATIVE_OBJS += audio_alac.o - NATIVE_OBJS += audio_amrnb.o - NATIVE_OBJS += audio_amrwb.o - NATIVE_OBJS += audio_amrwbplus.o - NATIVE_OBJS += audio_ape.o - NATIVE_OBJS += audio_evrc.o - NATIVE_OBJS += audio_g711alaw.o - NATIVE_OBJS += audio_g711mlaw.o - NATIVE_OBJS += audio_hwacc_effects.o - NATIVE_OBJS += audio_mp3.o - NATIVE_OBJS += audio_multi_aac.o - NATIVE_OBJS += audio_qcelp.o - NATIVE_OBJS += audio_wma.o - NATIVE_OBJS += audio_wmapro.o - NATIVE_OBJS += evrc_in.o - NATIVE_OBJS += g711alaw_in.o - NATIVE_OBJS += g711mlaw_in.o - NATIVE_OBJS += qcelp_in.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers - endif -endif - -# Module information used by KBuild framework -obj-$(CONFIG_MSM_QDSP6V2_CODECS) += native_dlkm.o -native_dlkm-y := $(NATIVE_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/dsp/codecs/aac_in.c b/techpack/audio/4.0/dsp/codecs/aac_in.c deleted file mode 100644 index 04f69876ab6b..000000000000 --- a/techpack/audio/4.0/dsp/codecs/aac_in.c +++ /dev/null @@ -1,704 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 5 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((1536+sizeof(struct meta_out_dsp)) * 5)) - -#define AAC_FORMAT_ADTS 65535 - -#define MAX_SAMPLE_RATE_384K 384000 - -static long aac_in_ioctl_shared(struct file *file, unsigned int cmd, void *arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_aac_enc_config *enc_cfg; - struct msm_audio_aac_config *aac_config; - uint32_t aac_mode = AAC_ENC_MODE_AAC_LC; - - enc_cfg = audio->enc_cfg; - aac_config = audio->codec_cfg; - /* ENCODE CFG (after new set of API's are published )bharath*/ - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - - if (audio->opened) { - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - } else { - if (audio->feedback == NON_TUNNEL_MODE) { - pr_debug("%s: starting in non_tunnel mode", - __func__); - rc = q6asm_open_read_write(audio->ac, - FORMAT_MPEG4_AAC, FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:open read write failed\n", - __func__); - break; - } - } - if (audio->feedback == TUNNEL_MODE) { - pr_debug("%s: starting in tunnel mode", - __func__); - rc = q6asm_open_read(audio->ac, - FORMAT_MPEG4_AAC); - - if (rc < 0) { - pr_err("%s:open read failed\n", - __func__); - break; - } - } - audio->stopped = 0; - } - - pr_debug("%s:sbr_ps_flag = %d, sbr_flag = %d\n", __func__, - aac_config->sbr_ps_on_flag, aac_config->sbr_on_flag); - if (aac_config->sbr_ps_on_flag) - aac_mode = AAC_ENC_MODE_EAAC_P; - else if (aac_config->sbr_on_flag) - aac_mode = AAC_ENC_MODE_AAC_P; - else - aac_mode = AAC_ENC_MODE_AAC_LC; - - rc = q6asm_enc_cfg_blk_aac(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->sample_rate, - enc_cfg->channels, - enc_cfg->bit_rate, - aac_mode, - enc_cfg->stream_format); - if (rc < 0) { - pr_err("%s:session id %d: cmd media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: Rxed AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_GET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config *cfg; - struct msm_audio_aac_enc_config *enc_cfg; - - cfg = (struct msm_audio_aac_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, "AUDIO_GET_AAC_CONFIG"); - rc = -EINVAL; - break; - } - memset(cfg, 0, sizeof(*cfg)); - enc_cfg = audio->enc_cfg; - if (enc_cfg->channels == CH_MODE_MONO) - cfg->channels = 1; - else - cfg->channels = 2; - - cfg->sample_rate = enc_cfg->sample_rate; - cfg->bit_rate = enc_cfg->bit_rate; - switch (enc_cfg->stream_format) { - case 0x00: - cfg->stream_format = AUDIO_AAC_FORMAT_ADTS; - break; - case 0x01: - cfg->stream_format = AUDIO_AAC_FORMAT_LOAS; - break; - case 0x02: - cfg->stream_format = AUDIO_AAC_FORMAT_ADIF; - break; - default: - case 0x03: - cfg->stream_format = AUDIO_AAC_FORMAT_RAW; - } - pr_debug("%s:session id %d: Get-aac-cfg: format=%d sr=%d bitrate=%d\n", - __func__, audio->ac->session, - cfg->stream_format, cfg->sample_rate, cfg->bit_rate); - break; - } - case AUDIO_SET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config *cfg; - struct msm_audio_aac_enc_config *enc_cfg; - uint32_t min_bitrate, max_bitrate; - - cfg = (struct msm_audio_aac_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - "AUDIO_SET_AAC_ENC_CONFIG", __func__); - rc = -EINVAL; - break; - } - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: Set-aac-cfg: stream=%d\n", __func__, - audio->ac->session, cfg->stream_format); - - switch (cfg->stream_format) { - case AUDIO_AAC_FORMAT_ADTS: - enc_cfg->stream_format = 0x00; - break; - case AUDIO_AAC_FORMAT_LOAS: - enc_cfg->stream_format = 0x01; - break; - case AUDIO_AAC_FORMAT_ADIF: - enc_cfg->stream_format = 0x02; - break; - case AUDIO_AAC_FORMAT_RAW: - enc_cfg->stream_format = 0x03; - break; - default: - pr_err("%s:session id %d: unsupported AAC format %d\n", - __func__, audio->ac->session, - cfg->stream_format); - rc = -EINVAL; - break; - } - - if (cfg->channels == 1) { - cfg->channels = CH_MODE_MONO; - } else if (cfg->channels == 2) { - cfg->channels = CH_MODE_STEREO; - } else { - rc = -EINVAL; - break; - } - - if (cfg->sample_rate > MAX_SAMPLE_RATE_384K) { - pr_err("%s: ERROR: invalid sample rate = %u", - __func__, cfg->sample_rate); - rc = -EINVAL; - break; - } - - min_bitrate = ((cfg->sample_rate)*(cfg->channels))/2; - /* This calculation should be based on AAC mode. But we cannot - * get AAC mode in this setconfig. min_bitrate's logical max - * value is 24000. So if min_bitrate is higher than 24000, - * choose 24000. - */ - if (min_bitrate > 24000) - min_bitrate = 24000; - max_bitrate = 6*(cfg->sample_rate)*(cfg->channels); - if (max_bitrate > 192000) - max_bitrate = 192000; - if ((cfg->bit_rate < min_bitrate) || - (cfg->bit_rate > max_bitrate)) { - pr_err("%s: bitrate permissible: max=%d, min=%d\n", - __func__, max_bitrate, min_bitrate); - pr_err("%s: ERROR in setting bitrate = %d\n", - __func__, cfg->bit_rate); - rc = -EINVAL; - break; - } - enc_cfg->sample_rate = cfg->sample_rate; - enc_cfg->channels = cfg->channels; - enc_cfg->bit_rate = cfg->bit_rate; - pr_debug("%s:session id %d: Set-aac-cfg:SR= 0x%x ch=0x%x bitrate=0x%x, format(adts/raw) = %d\n", - __func__, audio->ac->session, enc_cfg->sample_rate, - enc_cfg->channels, enc_cfg->bit_rate, - enc_cfg->stream_format); - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config *aac_cfg; - struct msm_audio_aac_config *audio_aac_cfg; - struct msm_audio_aac_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - audio_aac_cfg = audio->codec_cfg; - aac_cfg = (struct msm_audio_aac_config *)arg; - - if (aac_cfg == NULL) { - pr_err("%s: NULL config pointer %s\n", - __func__, "AUDIO_SET_AAC_CONFIG"); - rc = -EINVAL; - break; - } - pr_debug("%s:session id %d: AUDIO_SET_AAC_CONFIG: sbr_flag = %d sbr_ps_flag = %d\n", - __func__, audio->ac->session, aac_cfg->sbr_on_flag, - aac_cfg->sbr_ps_on_flag); - audio_aac_cfg->sbr_on_flag = aac_cfg->sbr_on_flag; - audio_aac_cfg->sbr_ps_on_flag = aac_cfg->sbr_ps_on_flag; - if ((audio_aac_cfg->sbr_on_flag == 1) || - (audio_aac_cfg->sbr_ps_on_flag == 1)) { - if (enc_cfg->sample_rate < 24000) { - pr_err("%s: ERROR in setting samplerate = %d\n", - __func__, enc_cfg->sample_rate); - rc = -EINVAL; - break; - } - } - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long aac_in_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = aac_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) { - pr_err("%s:AUDIO_GET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - case AUDIO_GET_AAC_CONFIG: { - if (copy_to_user((void *)arg, &audio->codec_cfg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config aac_cfg; - - if (copy_from_user(&aac_cfg, (void *)arg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_SET_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = aac_in_ioctl_shared(file, cmd, &aac_cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd=%d\n", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_aac_enc_config32 { - u32 channels; - u32 sample_rate; - u32 bit_rate; - u32 stream_format; -}; - -struct msm_audio_aac_config32 { - s16 format; - u16 audio_object; - u16 ep_config; /* 0 ~ 3 useful only obj = ERLC */ - u16 aac_section_data_resilience_flag; - u16 aac_scalefactor_data_resilience_flag; - u16 aac_spectral_data_resilience_flag; - u16 sbr_on_flag; - u16 sbr_ps_on_flag; - u16 dual_mono_mode; - u16 channel_configuration; - u16 sample_rate; -}; - -enum { - AUDIO_SET_AAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config32), - AUDIO_GET_AAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config32), - AUDIO_SET_AAC_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_aac_enc_config32), - AUDIO_GET_AAC_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+4), struct msm_audio_aac_enc_config32) -}; - -static long aac_in_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = aac_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AAC_ENC_CONFIG_32: { - struct msm_audio_aac_enc_config cfg; - struct msm_audio_aac_enc_config32 cfg_32; - - memset(&cfg_32, 0, sizeof(cfg_32)); - - cmd = AUDIO_GET_AAC_ENC_CONFIG; - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) { - pr_err("%s:AUDIO_GET_AAC_ENC_CONFIG_32 failed. Rc= %d\n", - __func__, rc); - break; - } - cfg_32.channels = cfg.channels; - cfg_32.sample_rate = cfg.sample_rate; - cfg_32.bit_rate = cfg.bit_rate; - cfg_32.stream_format = cfg.stream_format; - if (copy_to_user((void *)arg, &cfg_32, sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AAC_ENC_CONFIG_32: { - struct msm_audio_aac_enc_config cfg; - struct msm_audio_aac_enc_config32 cfg_32; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_GET_AAC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.channels = cfg_32.channels; - cfg.sample_rate = cfg_32.sample_rate; - cfg.bit_rate = cfg_32.bit_rate; - cfg.stream_format = cfg_32.stream_format; - /* The command should be converted from 32 bit to normal - * before the shared ioctl is called as shared ioctl - * can process only normal commands - */ - cmd = AUDIO_SET_AAC_ENC_CONFIG; - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG_32 failed. rc=%d\n", - __func__, rc); - break; - } - case AUDIO_GET_AAC_CONFIG_32: { - struct msm_audio_aac_config *aac_config; - struct msm_audio_aac_config32 aac_config_32; - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - aac_config_32.format = aac_config->format; - aac_config_32.audio_object = aac_config->audio_object; - aac_config_32.ep_config = aac_config->ep_config; - aac_config_32.aac_section_data_resilience_flag = - aac_config->aac_section_data_resilience_flag; - aac_config_32.aac_scalefactor_data_resilience_flag = - aac_config->aac_scalefactor_data_resilience_flag; - aac_config_32.aac_spectral_data_resilience_flag = - aac_config->aac_spectral_data_resilience_flag; - aac_config_32.sbr_on_flag = aac_config->sbr_on_flag; - aac_config_32.sbr_ps_on_flag = aac_config->sbr_ps_on_flag; - aac_config_32.dual_mono_mode = aac_config->dual_mono_mode; - aac_config_32.channel_configuration = - aac_config->channel_configuration; - aac_config_32.sample_rate = aac_config->sample_rate; - - if (copy_to_user((void *)arg, &aac_config_32, - sizeof(aac_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG_32: { - struct msm_audio_aac_config aac_cfg; - struct msm_audio_aac_config32 aac_cfg_32; - - if (copy_from_user(&aac_cfg_32, (void *)arg, - sizeof(aac_cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - aac_cfg.format = aac_cfg_32.format; - aac_cfg.audio_object = aac_cfg_32.audio_object; - aac_cfg.ep_config = aac_cfg_32.ep_config; - aac_cfg.aac_section_data_resilience_flag = - aac_cfg_32.aac_section_data_resilience_flag; - aac_cfg.aac_scalefactor_data_resilience_flag = - aac_cfg_32.aac_scalefactor_data_resilience_flag; - aac_cfg.aac_spectral_data_resilience_flag = - aac_cfg_32.aac_spectral_data_resilience_flag; - aac_cfg.sbr_on_flag = aac_cfg_32.sbr_on_flag; - aac_cfg.sbr_ps_on_flag = aac_cfg_32.sbr_ps_on_flag; - aac_cfg.dual_mono_mode = aac_cfg_32.dual_mono_mode; - aac_cfg.channel_configuration = - aac_cfg_32.channel_configuration; - aac_cfg.sample_rate = aac_cfg_32.sample_rate; - - cmd = AUDIO_SET_AAC_CONFIG; - rc = aac_in_ioctl_shared(file, cmd, &aac_cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d\n", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define aac_in_compat_ioctl NULL -#endif - -static int aac_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_aac_enc_config *enc_cfg; - struct msm_audio_aac_config *aac_config; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_aac_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - aac_config = audio->codec_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 1536; - audio->max_frames_per_buf = 5; - enc_cfg->sample_rate = 8000; - enc_cfg->channels = 1; - enc_cfg->bit_rate = 16000; - enc_cfg->stream_format = 0x00;/* 0:ADTS, 3:RAW */ - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - aac_config->format = AUDIO_AAC_FORMAT_ADTS; - aac_config->audio_object = AUDIO_AAC_OBJECT_LC; - aac_config->sbr_on_flag = 0; - aac_config->sbr_ps_on_flag = 0; - aac_config->channel_configuration = 1; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - /* open aac encoder in tunnel mode */ - audio->buf_cfg.frames_per_buf = 0x01; - - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_MPEG4_AAC, - FORMAT_LINEAR_PCM); - - if (rc < 0) { - pr_err("%s:session id %d: NT Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - audio->buf_cfg.meta_info_enable = 0x01; - pr_info("%s:session id %d: NT mode encoder success\n", __func__, - audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_MPEG4_AAC); - - if (rc < 0) { - pr_err("%s:session id %d: Tunnel Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, - audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - audio->buf_cfg.meta_info_enable = 0x00; - pr_info("%s:session id %d: T mode encoder success\n", __func__, - audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = aac_in_compat_ioctl; - audio->enc_ioctl = aac_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = aac_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_aac_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac_in", - .fops = &audio_in_fops, -}; - -int __init aac_in_init(void) -{ - return misc_register(&audio_aac_in_misc); -} - -void aac_in_exit(void) -{ - misc_deregister(&audio_aac_in_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/amrnb_in.c b/techpack/audio/4.0/dsp/codecs/amrnb_in.c deleted file mode 100644 index 924ac5c7f51c..000000000000 --- a/techpack/audio/4.0/dsp/codecs/amrnb_in.c +++ /dev/null @@ -1,397 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2010-2012, 2014, 2016-2017 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((32+sizeof(struct meta_out_dsp)) * 10)) - -static long amrnb_in_ioctl_shared(struct file *file, - unsigned int cmd, void *arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_amrnb_enc_config_v2 *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - rc = q6asm_enc_cfg_blk_amrnb(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->band_mode, - enc_cfg->dtx_enable); - - if (rc < 0) { - pr_err("%s:session id %d: cmd amrnb media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", - __func__, audio->ac->session, - audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:AUDIO_STOP\n", __func__); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG_V2: { - struct msm_audio_amrnb_enc_config_v2 *cfg; - struct msm_audio_amrnb_enc_config_v2 *enc_cfg; - - cfg = (struct msm_audio_amrnb_enc_config_v2 *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, - "AUDIO_SET_AMRNB_ENC_CONFIG_V2"); - rc = -EINVAL; - break; - } - - enc_cfg = audio->enc_cfg; - if (cfg->band_mode > 8 || - cfg->band_mode < 1) { - pr_err("%s:session id %d: invalid band mode\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - /* AMR NB encoder accepts values between 0-7 - * while openmax provides value between 1-8 - * as per spec - */ - enc_cfg->band_mode = (cfg->band_mode - 1); - enc_cfg->dtx_enable = (cfg->dtx_enable ? 1 : 0); - enc_cfg->frame_format = 0; - pr_debug("%s:session id %d: band_mode = 0x%x dtx_enable=0x%x\n", - __func__, audio->ac->session, - enc_cfg->band_mode, enc_cfg->dtx_enable); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long amrnb_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrnb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRNB_ENC_CONFIG_V2: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_amrnb_enc_config_v2))) { - pr_err("%s: copy_to_user for AUDIO_GET_AMRNB_ENC_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG_V2: { - struct msm_audio_amrnb_enc_config_v2 cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRNB_ENC_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = amrnb_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s: AUDIO_SET_AMRNB_ENC_CONFIG_V2 failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd=%d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_amrnb_enc_config_v2_32 { - u32 band_mode; - u32 dtx_enable; - u32 frame_format; -}; - -enum { - AUDIO_GET_AMRNB_ENC_CONFIG_V2_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+2), - struct msm_audio_amrnb_enc_config_v2_32), - AUDIO_SET_AMRNB_ENC_CONFIG_V2_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), - struct msm_audio_amrnb_enc_config_v2_32) -}; - -static long amrnb_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrnb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRNB_ENC_CONFIG_V2_32: { - struct msm_audio_amrnb_enc_config_v2 *amrnb_config; - struct msm_audio_amrnb_enc_config_v2_32 amrnb_config_32; - - memset(&amrnb_config_32, 0, sizeof(amrnb_config_32)); - - amrnb_config = - (struct msm_audio_amrnb_enc_config_v2 *)audio->enc_cfg; - amrnb_config_32.band_mode = amrnb_config->band_mode; - amrnb_config_32.dtx_enable = amrnb_config->dtx_enable; - amrnb_config_32.frame_format = amrnb_config->frame_format; - - if (copy_to_user((void *)arg, &amrnb_config_32, - sizeof(amrnb_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AMRNB_ENC_CONFIG_V2_32 failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG_V2_32: { - struct msm_audio_amrnb_enc_config_v2_32 cfg_32; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRNB_ENC_CONFIG_V2_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cmd = AUDIO_SET_AMRNB_ENC_CONFIG_V2; - rc = amrnb_in_ioctl_shared(file, cmd, &cfg_32); - if (rc) - pr_err("%s:AUDIO_SET_AMRNB_ENC_CONFIG_V2 failed rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define amrnb_in_compat_ioctl NULL -#endif - -static int amrnb_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_amrnb_enc_config_v2 *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_amrnb_enc_config_v2), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 32; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->band_mode = 7; - enc_cfg->dtx_enable = 0; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open amrnb encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_AMRNB, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", - __func__, audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_AMRNB); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, - rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", - __func__, audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = amrnb_in_compat_ioctl; - audio->enc_ioctl = amrnb_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = amrnb_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_amrnb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb_in", - .fops = &audio_in_fops, -}; - -int __init amrnb_in_init(void) -{ - return misc_register(&audio_amrnb_in_misc); -} - -void amrnb_in_exit(void) -{ - misc_deregister(&audio_amrnb_in_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/amrwb_in.c b/techpack/audio/4.0/dsp/codecs/amrwb_in.c deleted file mode 100644 index 9a9b4a0ae9ae..000000000000 --- a/techpack/audio/4.0/dsp/codecs/amrwb_in.c +++ /dev/null @@ -1,395 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2011-2012, 2014, 2016-2017 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((61+sizeof(struct meta_out_dsp)) * 10)) - -static long amrwb_in_ioctl_shared(struct file *file, - unsigned int cmd, void *arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_amrwb_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - rc = q6asm_enc_cfg_blk_amrwb(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->band_mode, - enc_cfg->dtx_enable); - - if (rc < 0) { - pr_err("%s:session id %d: cmd amrwb media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", - __func__, audio->ac->session, - audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:AUDIO_STOP\n", __func__); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_SET_AMRWB_ENC_CONFIG: { - struct msm_audio_amrwb_enc_config *cfg; - struct msm_audio_amrwb_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - cfg = (struct msm_audio_amrwb_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, "AUDIO_SET_AMRWB_ENC_CONFIG"); - rc = -EINVAL; - break; - } - - if (cfg->band_mode > 8) { - pr_err("%s:session id %d: invalid band mode\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - /* ToDo: AMR WB encoder accepts values between 0-8 - * while openmax provides value between 9-17 - * as per spec - */ - enc_cfg->band_mode = cfg->band_mode; - enc_cfg->dtx_enable = (cfg->dtx_enable ? 1 : 0); - /* Currently DSP does not support different frameformat */ - enc_cfg->frame_format = 0; - pr_debug("%s:session id %d: band_mode = 0x%x dtx_enable=0x%x\n", - __func__, audio->ac->session, - enc_cfg->band_mode, enc_cfg->dtx_enable); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long amrwb_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrwb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRWB_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_amrwb_enc_config))) - pr_err("%s: copy_to_user for AUDIO_GET_AMRWB_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - case AUDIO_SET_AMRWB_ENC_CONFIG: { - struct msm_audio_amrwb_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRWB_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = amrwb_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_amrwb_enc_config_32 { - u32 band_mode; - u32 dtx_enable; - u32 frame_format; -}; - -enum { - AUDIO_GET_AMRWB_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), - struct msm_audio_amrwb_enc_config_32), - AUDIO_SET_AMRWB_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), - struct msm_audio_amrwb_enc_config_32) -}; - -static long amrwb_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrwb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRWB_ENC_CONFIG_32: { - struct msm_audio_amrwb_enc_config *amrwb_config; - struct msm_audio_amrwb_enc_config_32 amrwb_config_32; - - memset(&amrwb_config_32, 0, sizeof(amrwb_config_32)); - - amrwb_config = - (struct msm_audio_amrwb_enc_config *)audio->enc_cfg; - amrwb_config_32.band_mode = amrwb_config->band_mode; - amrwb_config_32.dtx_enable = amrwb_config->dtx_enable; - amrwb_config_32.frame_format = amrwb_config->frame_format; - - if (copy_to_user((void *)arg, &amrwb_config_32, - sizeof(struct msm_audio_amrwb_enc_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AMRWB_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRWB_ENC_CONFIG_32: { - struct msm_audio_amrwb_enc_config cfg_32; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRWB_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cmd = AUDIO_SET_AMRWB_ENC_CONFIG; - rc = amrwb_in_ioctl_shared(file, cmd, &cfg_32); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define amrwb_in_compat_ioctl NULL -#endif - -static int amrwb_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_amrwb_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_amrwb_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 32; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->band_mode = 8; - enc_cfg->dtx_enable = 0; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 16000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s:audio[%pK]: Could not allocate memory for audio client\n", - __func__, audio); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open amrwb encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_AMRWB, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", - __func__, audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_AMRWB); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, - rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", - __func__, audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = amrwb_in_compat_ioctl; - audio->enc_ioctl = amrwb_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = amrwb_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_amrwb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwb_in", - .fops = &audio_in_fops, -}; - -int __init amrwb_in_init(void) -{ - return misc_register(&audio_amrwb_in_misc); -} - -void amrwb_in_exit(void) -{ - misc_deregister(&audio_amrwb_in_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_aac.c b/techpack/audio/4.0/dsp/codecs/audio_aac.c deleted file mode 100644 index 14475dcb4d7a..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_aac.c +++ /dev/null @@ -1,480 +0,0 @@ -/* aac audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2010-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include "audio_utils_aio.h" - -#define AUDIO_AAC_DUAL_MONO_INVALID -1 -#define PCM_BUFSZ_MIN_AAC ((8*1024) + sizeof(struct dec_meta_out)) - -static struct miscdevice audio_aac_misc; -static struct ws_mgr audio_aac_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_aac_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_aac_cfg aac_cfg; - struct msm_audio_aac_config *aac_config; - uint32_t sbr_ps = 0x00; - - pr_debug("%s: AUDIO_START session_id[%d]\n", __func__, - audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - /* turn on both sbr and ps */ - rc = q6asm_enable_sbrps(audio->ac, sbr_ps); - if (rc < 0) - pr_err("sbr-ps enable failed\n"); - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - if (aac_config->sbr_ps_on_flag) - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - else if (aac_config->sbr_on_flag) - aac_cfg.aot = AAC_ENC_MODE_AAC_P; - else - aac_cfg.aot = AAC_ENC_MODE_AAC_LC; - - switch (aac_config->format) { - case AUDIO_AAC_FORMAT_ADTS: - aac_cfg.format = 0x00; - break; - case AUDIO_AAC_FORMAT_LOAS: - aac_cfg.format = 0x01; - break; - case AUDIO_AAC_FORMAT_ADIF: - aac_cfg.format = 0x02; - break; - default: - case AUDIO_AAC_FORMAT_RAW: - aac_cfg.format = 0x03; - } - aac_cfg.ep_config = aac_config->ep_config; - aac_cfg.section_data_resilience = - aac_config->aac_section_data_resilience_flag; - aac_cfg.scalefactor_data_resilience = - aac_config->aac_scalefactor_data_resilience_flag; - aac_cfg.spectral_data_resilience = - aac_config->aac_spectral_data_resilience_flag; - aac_cfg.ch_cfg = audio->pcm_cfg.channel_count; - if (audio->feedback == TUNNEL_MODE) { - aac_cfg.sample_rate = aac_config->sample_rate; - aac_cfg.ch_cfg = aac_config->channel_configuration; - } else { - aac_cfg.sample_rate = audio->pcm_cfg.sample_rate; - aac_cfg.ch_cfg = audio->pcm_cfg.channel_count; - } - - pr_debug("%s:format=%x aot=%d ch=%d sr=%d\n", - __func__, aac_cfg.format, - aac_cfg.aot, aac_cfg.ch_cfg, - aac_cfg.sample_rate); - - /* Configure Media format block */ - rc = q6asm_media_format_block_aac(audio->ac, &aac_cfg); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - rc = enable_volume_ramp(audio); - if (rc < 0) { - pr_err("%s: Failed to enable volume ramp\n", - __func__); - } - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_info("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config *aac_config; - uint16_t sce_left = 1, sce_right = 2; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - aac_config = (struct msm_audio_aac_config *)arg; - if (aac_config == NULL) { - pr_err("%s: Invalid config pointer\n", __func__); - rc = -EINVAL; - break; - } - memcpy(audio->codec_cfg, aac_config, - sizeof(struct msm_audio_aac_config)); - /* PL_PR is 0 only need to check PL_SR */ - if (aac_config->dual_mono_mode > - AUDIO_AAC_DUAL_MONO_PL_SR) { - pr_err("%s:Invalid dual_mono mode =%d\n", __func__, - aac_config->dual_mono_mode); - } else { - /* convert the data from user into sce_left - * and sce_right based on the definitions - */ - pr_debug("%s: modify dual_mono mode =%d\n", __func__, - aac_config->dual_mono_mode); - switch (aac_config->dual_mono_mode) { - case AUDIO_AAC_DUAL_MONO_PL_PR: - sce_left = 1; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_SL_SR: - sce_left = 2; - sce_right = 2; - break; - case AUDIO_AAC_DUAL_MONO_SL_PR: - sce_left = 2; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_PL_SR: - default: - sce_left = 1; - sce_right = 2; - break; - } - rc = q6asm_cfg_dual_mono_aac(audio->ac, - sce_left, sce_right); - if (rc < 0) - pr_err("%s:asm cmd dualmono failed rc=%d\n", - __func__, rc); - } - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config aac_config; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - if (copy_from_user(&aac_config, (void *)arg, - sizeof(aac_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("%s[%pK]:Failed in utils_ioctl: %d\n", - __func__, audio, rc); - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_aac_config32 { - s16 format; - u16 audio_object; - u16 ep_config; /* 0 ~ 3 useful only obj = ERLC */ - u16 aac_section_data_resilience_flag; - u16 aac_scalefactor_data_resilience_flag; - u16 aac_spectral_data_resilience_flag; - u16 sbr_on_flag; - u16 sbr_ps_on_flag; - u16 dual_mono_mode; - u16 channel_configuration; - u16 sample_rate; -}; - -enum { - AUDIO_SET_AAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config32), - AUDIO_GET_AAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG_32: { - struct msm_audio_aac_config *aac_config; - struct msm_audio_aac_config32 aac_config_32; - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - aac_config_32.format = aac_config->format; - aac_config_32.audio_object = aac_config->audio_object; - aac_config_32.ep_config = aac_config->ep_config; - aac_config_32.aac_section_data_resilience_flag = - aac_config->aac_section_data_resilience_flag; - aac_config_32.aac_scalefactor_data_resilience_flag = - aac_config->aac_scalefactor_data_resilience_flag; - aac_config_32.aac_spectral_data_resilience_flag = - aac_config->aac_spectral_data_resilience_flag; - aac_config_32.sbr_on_flag = aac_config->sbr_on_flag; - aac_config_32.sbr_ps_on_flag = aac_config->sbr_ps_on_flag; - aac_config_32.dual_mono_mode = aac_config->dual_mono_mode; - aac_config_32.channel_configuration = - aac_config->channel_configuration; - aac_config_32.sample_rate = aac_config->sample_rate; - - if (copy_to_user((void *)arg, &aac_config_32, - sizeof(aac_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG_32: { - struct msm_audio_aac_config aac_config; - struct msm_audio_aac_config32 aac_config_32; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - if (copy_from_user(&aac_config_32, (void *)arg, - sizeof(aac_config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - aac_config.format = aac_config_32.format; - aac_config.audio_object = aac_config_32.audio_object; - aac_config.ep_config = aac_config_32.ep_config; - aac_config.aac_section_data_resilience_flag = - aac_config_32.aac_section_data_resilience_flag; - aac_config.aac_scalefactor_data_resilience_flag = - aac_config_32.aac_scalefactor_data_resilience_flag; - aac_config.aac_spectral_data_resilience_flag = - aac_config_32.aac_spectral_data_resilience_flag; - aac_config.sbr_on_flag = aac_config_32.sbr_on_flag; - aac_config.sbr_ps_on_flag = aac_config_32.sbr_ps_on_flag; - aac_config.dual_mono_mode = aac_config_32.dual_mono_mode; - aac_config.channel_configuration = - aac_config_32.channel_configuration; - aac_config.sample_rate = aac_config_32.sample_rate; - - cmd = AUDIO_SET_AAC_CONFIG; - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("%s[%pK]:Failed in utils_ioctl: %d\n", - __func__, audio, rc); - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - struct msm_audio_aac_config *aac_config = NULL; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_aac_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - aac_config = audio->codec_cfg; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN_AAC; - audio->miscdevice = &audio_aac_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_aac_ws_mgr; - aac_config->dual_mono_mode = AUDIO_AAC_DUAL_MONO_INVALID; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_MPEG4_AAC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open AAC decoder, expected frames is always 1 - * audio->buf_cfg.frames_per_buf = 0x01; - */ - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_MPEG4_AAC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_aac_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_aac_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:aacdec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_aac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_aac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac", - .fops = &audio_aac_fops, -}; - -int __init audio_aac_init(void) -{ - int ret = misc_register(&audio_aac_misc); - - if (ret == 0) - device_init_wakeup(audio_aac_misc.this_device, true); - audio_aac_ws_mgr.ref_cnt = 0; - mutex_init(&audio_aac_ws_mgr.ws_lock); - - return ret; -} - -void audio_aac_exit(void) -{ - mutex_destroy(&audio_aac_ws_mgr.ws_lock); - misc_deregister(&audio_aac_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_alac.c b/techpack/audio/4.0/dsp/codecs/audio_alac.c deleted file mode 100644 index cda7995ed0f9..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_alac.c +++ /dev/null @@ -1,433 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_alac_misc; -static struct ws_mgr audio_alac_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_alac_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; - -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_alac_debug_fops); -} -#endif -static int alac_channel_map(u8 *channel_mapping, uint32_t channels); - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_alac_cfg alac_cfg; - struct msm_audio_alac_config *alac_config; - u8 channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL]; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (alac_channel_map(channel_mapping, - audio->pcm_cfg.channel_count)) { - pr_err("%s: setting channel map failed %d\n", - __func__, audio->pcm_cfg.channel_count); - } - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /*bits per sample*/ - false, false, channel_mapping); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; - alac_cfg.frame_length = alac_config->frameLength; - alac_cfg.compatible_version = alac_config->compatVersion; - alac_cfg.bit_depth = alac_config->bitDepth; - alac_cfg.pb = alac_config->pb; - alac_cfg.mb = alac_config->mb; - alac_cfg.kb = alac_config->kb; - alac_cfg.num_channels = alac_config->channelCount; - alac_cfg.max_run = alac_config->maxRun; - alac_cfg.max_frame_bytes = alac_config->maxSize; - alac_cfg.avg_bit_rate = alac_config->averageBitRate; - alac_cfg.sample_rate = alac_config->sampleRate; - alac_cfg.channel_layout_tag = alac_config->channelLayout; - pr_debug("%s: frame_length %d compatible_version %d bit_depth %d pb %d mb %d kb %d num_channels %d max_run %d max_frame_bytes %d avg_bit_rate %d sample_rate %d channel_layout_tag %d\n", - __func__, alac_config->frameLength, - alac_config->compatVersion, - alac_config->bitDepth, alac_config->pb, - alac_config->mb, alac_config->kb, - alac_config->channelCount, alac_config->maxRun, - alac_config->maxSize, - alac_config->averageBitRate, - alac_config->sampleRate, - alac_config->channelLayout); - /* Configure Media format block */ - rc = q6asm_media_format_block_alac(audio->ac, &alac_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_ALAC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_alac_config))) { - pr_err("%s:copy_to_user for AUDIO_GET_ALAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_ALAC_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_alac_config))) { - pr_err("%s:copy_from_user for AUDIO_SET_ALAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_alac_config_32 { - u32 frameLength; - u8 compatVersion; - u8 bitDepth; - u8 pb; - u8 mb; - u8 kb; - u8 channelCount; - u16 maxRun; - u32 maxSize; - u32 averageBitRate; - u32 sampleRate; - u32 channelLayout; -}; - -enum { - AUDIO_GET_ALAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_alac_config_32), - AUDIO_SET_ALAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_alac_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_ALAC_CONFIG_32: { - struct msm_audio_alac_config *alac_config; - struct msm_audio_alac_config_32 alac_config_32; - - memset(&alac_config_32, 0, sizeof(alac_config_32)); - - alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; - alac_config_32.frameLength = alac_config->frameLength; - alac_config_32.compatVersion = - alac_config->compatVersion; - alac_config_32.bitDepth = alac_config->bitDepth; - alac_config_32.pb = alac_config->pb; - alac_config_32.mb = alac_config->mb; - alac_config_32.kb = alac_config->kb; - alac_config_32.channelCount = alac_config->channelCount; - alac_config_32.maxRun = alac_config->maxRun; - alac_config_32.maxSize = alac_config->maxSize; - alac_config_32.averageBitRate = alac_config->averageBitRate; - alac_config_32.sampleRate = alac_config->sampleRate; - alac_config_32.channelLayout = alac_config->channelLayout; - - if (copy_to_user((void *)arg, &alac_config_32, - sizeof(alac_config_32))) { - pr_err("%s: copy_to_user for GET_ALAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_ALAC_CONFIG_32: { - struct msm_audio_alac_config *alac_config; - struct msm_audio_alac_config_32 alac_config_32; - - if (copy_from_user(&alac_config_32, (void *)arg, - sizeof(alac_config_32))) { - pr_err("%s: copy_from_user for SET_ALAC_CONFIG_32 failed\n" - , __func__); - rc = -EFAULT; - break; - } - alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; - alac_config->frameLength = alac_config_32.frameLength; - alac_config->compatVersion = - alac_config_32.compatVersion; - alac_config->bitDepth = alac_config_32.bitDepth; - alac_config->pb = alac_config_32.pb; - alac_config->mb = alac_config_32.mb; - alac_config->kb = alac_config_32.kb; - alac_config->channelCount = alac_config_32.channelCount; - alac_config->maxRun = alac_config_32.maxRun; - alac_config->maxSize = alac_config_32.maxSize; - alac_config->averageBitRate = alac_config_32.averageBitRate; - alac_config->sampleRate = alac_config_32.sampleRate; - alac_config->channelLayout = alac_config_32.channelLayout; - - break; - } - default: { - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_alac_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - if (!audio) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_alac_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_alac_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_alac_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_ALAC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open ALAC decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_ALAC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_alac_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_debug("%s:alacdec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static int alac_channel_map(u8 *channel_mapping, uint32_t channels) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_CS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_LFE; - } else if (channels == 7) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_CS; - lchannel_mapping[6] = PCM_CHANNEL_LFE; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FLC; - lchannel_mapping[2] = PCM_CHANNEL_FRC; - lchannel_mapping[3] = PCM_CHANNEL_FL; - lchannel_mapping[4] = PCM_CHANNEL_FR; - lchannel_mapping[5] = PCM_CHANNEL_LS; - lchannel_mapping[6] = PCM_CHANNEL_RS; - lchannel_mapping[7] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} - -static const struct file_operations audio_alac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_alac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_alac", - .fops = &audio_alac_fops, -}; - -int __init audio_alac_init(void) -{ - int ret = misc_register(&audio_alac_misc); - - if (ret == 0) - device_init_wakeup(audio_alac_misc.this_device, true); - audio_alac_ws_mgr.ref_cnt = 0; - mutex_init(&audio_alac_ws_mgr.ws_lock); - - return ret; -} - -void audio_alac_exit(void) -{ - mutex_destroy(&audio_alac_ws_mgr.ws_lock); - misc_deregister(&audio_alac_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_amrnb.c b/techpack/audio/4.0/dsp/codecs/audio_amrnb.c deleted file mode 100644 index caaa096c133a..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_amrnb.c +++ /dev/null @@ -1,230 +0,0 @@ -/* amrnb audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_amrnb_misc; -static struct ws_mgr audio_amrnb_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_amrnb_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling compat ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - } - return rc; -} - - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrnb_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_amrnb_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_amrnb_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_AMRNB); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_AMRNB); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_amrnb_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_amrnb_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info_ratelimited("%s:amrnb decoder open success, session_id = %d\n", __func__, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrnb_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl, -}; - -static struct miscdevice audio_amrnb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb", - .fops = &audio_amrnb_fops, -}; - -int __init audio_amrnb_init(void) -{ - int ret = misc_register(&audio_amrnb_misc); - - if (ret == 0) - device_init_wakeup(audio_amrnb_misc.this_device, true); - audio_amrnb_ws_mgr.ref_cnt = 0; - mutex_init(&audio_amrnb_ws_mgr.ws_lock); - - return ret; -} - -void audio_amrnb_exit(void) -{ - mutex_destroy(&audio_amrnb_ws_mgr.ws_lock); - misc_deregister(&audio_amrnb_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_amrwb.c b/techpack/audio/4.0/dsp/codecs/audio_amrwb.c deleted file mode 100644 index 688a94d3ec26..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_amrwb.c +++ /dev/null @@ -1,226 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* amrwb audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_amrwb_misc; -static struct ws_mgr audio_amrwb_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_amrwb_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling compat ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrwb_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_amrwb_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_amrwb_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_AMRWB); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_AMRWB); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_amrwb_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_amrwb_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s: AMRWB dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrwb_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl, -}; - -static struct miscdevice audio_amrwb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwb", - .fops = &audio_amrwb_fops, -}; - -int __init audio_amrwb_init(void) -{ - int ret = misc_register(&audio_amrwb_misc); - - if (ret == 0) - device_init_wakeup(audio_amrwb_misc.this_device, true); - audio_amrwb_ws_mgr.ref_cnt = 0; - mutex_init(&audio_amrwb_ws_mgr.ws_lock); - - return ret; -} - -void audio_amrwb_exit(void) -{ - mutex_destroy(&audio_amrwb_ws_mgr.ws_lock); - misc_deregister(&audio_amrwb_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_amrwbplus.c b/techpack/audio/4.0/dsp/codecs/audio_amrwbplus.c deleted file mode 100644 index 09a8b302ae1d..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_amrwbplus.c +++ /dev/null @@ -1,401 +0,0 @@ -/* amr-wbplus audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2010-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_amrwbplus_misc; -static struct ws_mgr audio_amrwbplus_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_amrwbplus_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -static void config_debug_fs(struct q6audio_aio *audio) -{ - if (audio != NULL) { - char name[sizeof("msm_amrwbplus_") + 5]; - - snprintf(name, sizeof(name), "msm_amrwbplus_%04x", - audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_amrwbplus_debug_fops); - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); - } -} -#else -static void config_debug_fs(struct q6audio_aio *audio) -{ -} -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct asm_amrwbplus_cfg q6_amrwbplus_cfg; - struct msm_audio_amrwbplus_config_v2 *amrwbplus_drv_config; - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - pr_err("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - amrwbplus_drv_config = - (struct msm_audio_amrwbplus_config_v2 *)audio->codec_cfg; - - q6_amrwbplus_cfg.size_bytes = - amrwbplus_drv_config->size_bytes; - q6_amrwbplus_cfg.version = - amrwbplus_drv_config->version; - q6_amrwbplus_cfg.num_channels = - amrwbplus_drv_config->num_channels; - q6_amrwbplus_cfg.amr_band_mode = - amrwbplus_drv_config->amr_band_mode; - q6_amrwbplus_cfg.amr_dtx_mode = - amrwbplus_drv_config->amr_dtx_mode; - q6_amrwbplus_cfg.amr_frame_fmt = - amrwbplus_drv_config->amr_frame_fmt; - q6_amrwbplus_cfg.amr_lsf_idx = - amrwbplus_drv_config->amr_lsf_idx; - - rc = q6asm_media_format_block_amrwbplus(audio->ac, - &q6_amrwbplus_cfg); - if (rc < 0) { - pr_err("q6asm_media_format_block_amrwb+ failed...\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s:AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - - break; - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AMRWBPLUS_CONFIG_V2: { - if ((audio) && (arg) && (audio->codec_cfg)) { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_amrwbplus_config_v2))) { - rc = -EFAULT; - pr_err("%s: copy_to_user for AUDIO_GET_AMRWBPLUS_CONFIG_V2 failed\n", - __func__); - break; - } - } else { - pr_err("%s: wb+ config v2 invalid parameters\n" - , __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AMRWBPLUS_CONFIG_V2: { - if ((audio) && (arg) && (audio->codec_cfg)) { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_amrwbplus_config_v2))) { - rc = -EFAULT; - pr_err("%s: copy_from_user for AUDIO_SET_AMRWBPLUS_CONFIG_V2 failed\n", - __func__); - break; - } - } else { - pr_err("%s: wb+ config invalid parameters\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - break; - } - } - return rc; -} -#ifdef CONFIG_COMPAT -struct msm_audio_amrwbplus_config_v2_32 { - u32 size_bytes; - u32 version; - u32 num_channels; - u32 amr_band_mode; - u32 amr_dtx_mode; - u32 amr_frame_fmt; - u32 amr_lsf_idx; -}; - -enum { - AUDIO_GET_AMRWBPLUS_CONFIG_V2_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+2), - struct msm_audio_amrwbplus_config_v2_32), - AUDIO_SET_AMRWBPLUS_CONFIG_V2_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), - struct msm_audio_amrwbplus_config_v2_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AMRWBPLUS_CONFIG_V2_32: { - if (audio && arg && (audio->codec_cfg)) { - struct msm_audio_amrwbplus_config_v2 *amrwbplus_config; - struct msm_audio_amrwbplus_config_v2_32 - amrwbplus_config_32; - - memset(&amrwbplus_config_32, 0, - sizeof(amrwbplus_config_32)); - - amrwbplus_config = - (struct msm_audio_amrwbplus_config_v2 *) - audio->codec_cfg; - amrwbplus_config_32.size_bytes = - amrwbplus_config->size_bytes; - amrwbplus_config_32.version = - amrwbplus_config->version; - amrwbplus_config_32.num_channels = - amrwbplus_config->num_channels; - amrwbplus_config_32.amr_band_mode = - amrwbplus_config->amr_band_mode; - amrwbplus_config_32.amr_dtx_mode = - amrwbplus_config->amr_dtx_mode; - amrwbplus_config_32.amr_frame_fmt = - amrwbplus_config->amr_frame_fmt; - amrwbplus_config_32.amr_lsf_idx = - amrwbplus_config->amr_lsf_idx; - - if (copy_to_user((void *)arg, &amrwbplus_config_32, - sizeof(amrwbplus_config_32))) { - rc = -EFAULT; - pr_err("%s: copy_to_user for AUDIO_GET_AMRWBPLUS_CONFIG_V2_32 failed\n" - , __func__); - } - } else { - pr_err("%s: wb+ Get config v2 invalid parameters\n" - , __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRWBPLUS_CONFIG_V2_32: { - if ((audio) && (arg) && (audio->codec_cfg)) { - struct msm_audio_amrwbplus_config_v2 *amrwbplus_config; - struct msm_audio_amrwbplus_config_v2_32 - amrwbplus_config_32; - - if (copy_from_user(&amrwbplus_config_32, (void *)arg, - sizeof(struct msm_audio_amrwbplus_config_v2_32))) { - rc = -EFAULT; - pr_err("%s: copy_from_user for AUDIO_SET_AMRWBPLUS_CONFIG_V2_32 failed\n" - , __func__); - break; - } - amrwbplus_config = - (struct msm_audio_amrwbplus_config_v2 *) - audio->codec_cfg; - amrwbplus_config->size_bytes = - amrwbplus_config_32.size_bytes; - amrwbplus_config->version = - amrwbplus_config_32.version; - amrwbplus_config->num_channels = - amrwbplus_config_32.num_channels; - amrwbplus_config->amr_band_mode = - amrwbplus_config_32.amr_band_mode; - amrwbplus_config->amr_dtx_mode = - amrwbplus_config_32.amr_dtx_mode; - amrwbplus_config->amr_frame_fmt = - amrwbplus_config_32.amr_frame_fmt; - amrwbplus_config->amr_lsf_idx = - amrwbplus_config_32.amr_lsf_idx; - } else { - pr_err("%s: wb+ config invalid parameters\n", - __func__); - rc = -EFAULT; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = - kzalloc(sizeof(struct msm_audio_amrwbplus_config_v2), GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_amrwbplus_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_amrwbplus_ws_mgr; - - audio->ac = - q6asm_audio_client_alloc((app_cb) q6_audio_cb, (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_AMR_WB_PLUS); - if (rc < 0) { - pr_err("amrwbplus NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_AMR_WB_PLUS); - if (rc < 0) { - pr_err("wb+ T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("audio_amrwbplus Not supported mode\n"); - rc = -EACCES; - goto fail; - } - - config_debug_fs(audio); - pr_debug("%s: AMRWBPLUS dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrwbplus_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_amrwbplus_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwbplus", - .fops = &audio_amrwbplus_fops, -}; - -int __init audio_amrwbplus_init(void) -{ - int ret = misc_register(&audio_amrwbplus_misc); - - if (ret == 0) - device_init_wakeup(audio_amrwbplus_misc.this_device, true); - audio_amrwbplus_ws_mgr.ref_cnt = 0; - mutex_init(&audio_amrwbplus_ws_mgr.ws_lock); - - return ret; -} - -void audio_amrwbplus_exit(void) -{ - mutex_destroy(&audio_amrwbplus_ws_mgr.ws_lock); - misc_deregister(&audio_amrwbplus_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_ape.c b/techpack/audio/4.0/dsp/codecs/audio_ape.c deleted file mode 100644 index 939f1e1ae2b9..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_ape.c +++ /dev/null @@ -1,358 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_ape_misc; -static struct ws_mgr audio_ape_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_ape_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_ape_debug_fops); -} -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_ape_cfg ape_cfg; - struct msm_audio_ape_config *ape_config; - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; - ape_cfg.compatible_version = ape_config->compatibleVersion; - ape_cfg.compression_level = ape_config->compressionLevel; - ape_cfg.format_flags = ape_config->formatFlags; - ape_cfg.blocks_per_frame = ape_config->blocksPerFrame; - ape_cfg.final_frame_blocks = ape_config->finalFrameBlocks; - ape_cfg.total_frames = ape_config->totalFrames; - ape_cfg.bits_per_sample = ape_config->bitsPerSample; - ape_cfg.num_channels = ape_config->numChannels; - ape_cfg.sample_rate = ape_config->sampleRate; - ape_cfg.seek_table_present = ape_config->seekTablePresent; - pr_debug("%s: compatibleVersion %d compressionLevel %d formatFlags %d blocksPerFrame %d finalFrameBlocks %d totalFrames %d bitsPerSample %d numChannels %d sampleRate %d seekTablePresent %d\n", - __func__, ape_config->compatibleVersion, - ape_config->compressionLevel, - ape_config->formatFlags, - ape_config->blocksPerFrame, - ape_config->finalFrameBlocks, - ape_config->totalFrames, - ape_config->bitsPerSample, - ape_config->numChannels, - ape_config->sampleRate, - ape_config->seekTablePresent); - /* Configure Media format block */ - rc = q6asm_media_format_block_ape(audio->ac, &ape_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_APE_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_ape_config))) { - pr_err("%s:copy_to_user for AUDIO_GET_APE_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_APE_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_ape_config))) { - pr_err("%s:copy_from_user for AUDIO_SET_APE_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_ape_config_32 { - u16 compatibleVersion; - u16 compressionLevel; - u32 formatFlags; - u32 blocksPerFrame; - u32 finalFrameBlocks; - u32 totalFrames; - u16 bitsPerSample; - u16 numChannels; - u32 sampleRate; - u32 seekTablePresent; - -}; - -enum { - AUDIO_GET_APE_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_ape_config_32), - AUDIO_SET_APE_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_ape_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_APE_CONFIG_32: { - struct msm_audio_ape_config *ape_config; - struct msm_audio_ape_config_32 ape_config_32; - - memset(&ape_config_32, 0, sizeof(ape_config_32)); - - ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; - ape_config_32.compatibleVersion = ape_config->compatibleVersion; - ape_config_32.compressionLevel = - ape_config->compressionLevel; - ape_config_32.formatFlags = ape_config->formatFlags; - ape_config_32.blocksPerFrame = ape_config->blocksPerFrame; - ape_config_32.finalFrameBlocks = ape_config->finalFrameBlocks; - ape_config_32.totalFrames = ape_config->totalFrames; - ape_config_32.bitsPerSample = ape_config->bitsPerSample; - ape_config_32.numChannels = ape_config->numChannels; - ape_config_32.sampleRate = ape_config->sampleRate; - ape_config_32.seekTablePresent = ape_config->seekTablePresent; - - if (copy_to_user((void *)arg, &ape_config_32, - sizeof(ape_config_32))) { - pr_err("%s: copy_to_user for GET_APE_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_APE_CONFIG_32: { - struct msm_audio_ape_config *ape_config; - struct msm_audio_ape_config_32 ape_config_32; - - if (copy_from_user(&ape_config_32, (void *)arg, - sizeof(ape_config_32))) { - pr_err("%s: copy_from_user for SET_APE_CONFIG_32 failed\n" - , __func__); - rc = -EFAULT; - break; - } - ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; - ape_config->compatibleVersion = ape_config_32.compatibleVersion; - ape_config->compressionLevel = - ape_config_32.compressionLevel; - ape_config->formatFlags = ape_config_32.formatFlags; - ape_config->blocksPerFrame = ape_config_32.blocksPerFrame; - ape_config->finalFrameBlocks = ape_config_32.finalFrameBlocks; - ape_config->totalFrames = ape_config_32.totalFrames; - ape_config->bitsPerSample = ape_config_32.bitsPerSample; - ape_config->numChannels = ape_config_32.numChannels; - ape_config->sampleRate = ape_config_32.sampleRate; - ape_config->seekTablePresent = ape_config_32.seekTablePresent; - - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_ape_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - if (!audio) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_ape_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_ape_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_ape_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_APE); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open APE decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_APE); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_ape_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_debug("%s:apedec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_ape_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_ape_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_ape", - .fops = &audio_ape_fops, -}; - -int __init audio_ape_init(void) -{ - int ret = misc_register(&audio_ape_misc); - - if (ret == 0) - device_init_wakeup(audio_ape_misc.this_device, true); - audio_ape_ws_mgr.ref_cnt = 0; - mutex_init(&audio_ape_ws_mgr.ws_lock); - - return ret; -} - -void audio_ape_exit(void) -{ - mutex_destroy(&audio_ape_ws_mgr.ws_lock); - misc_deregister(&audio_ape_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_evrc.c b/techpack/audio/4.0/dsp/codecs/audio_evrc.c deleted file mode 100644 index a29e226b2042..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_evrc.c +++ /dev/null @@ -1,188 +0,0 @@ -/* evrc audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "audio_utils_aio.h" - -static struct miscdevice audio_evrc_misc; -static struct ws_mgr audio_evrc_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_evrc_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_evrc_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_evrc_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_evrc_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_EVRC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_EVRC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_evrc_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_evrc_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_evrc_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_evrc_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc", - .fops = &audio_evrc_fops, -}; - -int __init audio_evrc_init(void) -{ - int ret = misc_register(&audio_evrc_misc); - - if (ret == 0) - device_init_wakeup(audio_evrc_misc.this_device, true); - audio_evrc_ws_mgr.ref_cnt = 0; - mutex_init(&audio_evrc_ws_mgr.ws_lock); - - return ret; -} - -void audio_evrc_exit(void) -{ - mutex_destroy(&audio_evrc_ws_mgr.ws_lock); - misc_deregister(&audio_evrc_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_g711alaw.c b/techpack/audio/4.0/dsp/codecs/audio_g711alaw.c deleted file mode 100644 index 7cf6810b1462..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_g711alaw.c +++ /dev/null @@ -1,389 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2016-2017, 2019-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_g711alaw_misc; -static struct ws_mgr audio_g711_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_g711_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; - -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_g711_debug_fops); -} -#endif - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels); - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_g711_dec_cfg g711_dec_cfg; - struct msm_audio_g711_dec_config *g711_dec_config; - u8 channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL]; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - memset(&g711_dec_cfg, 0, sizeof(g711_dec_cfg)); - - if (g711_channel_map(channel_mapping, - audio->pcm_cfg.channel_count)) { - pr_err("%s: setting channel map failed %d\n", - __func__, audio->pcm_cfg.channel_count); - } - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /*bits per sample*/ - false, false, channel_mapping); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_cfg.sample_rate = g711_dec_config->sample_rate; - /* Configure Media format block */ - rc = q6asm_media_format_block_g711(audio->ac, &g711_dec_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("%s: cmd media format block failed rc=%d\n", - __func__, rc); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("%s: AUDIO_START success enable[%d]\n", - __func__, audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - default: { - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_dec_config_32 { - u32 sample_rate; -}; - -enum { - AUDIO_SET_G711_DEC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_dec_config_32), - AUDIO_GET_G711_DEC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_dec_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config_32.sample_rate = g711_dec_config->sample_rate; - - if (copy_to_user((void *)arg, &g711_dec_config_32, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_DEC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - if (copy_from_user(&g711_dec_config_32, (void *)arg, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_DEC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config->sample_rate = g711_dec_config_32.sample_rate; - - break; - } - default: { - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_compat_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_g711_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (!audio) - return -ENOMEM; - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_g711_dec_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_g711alaw_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_g711_ws_mgr; - - init_waitqueue_head(&audio->event_wait); - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ /*foramt:G711_ALAW*/ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_G711_ALAW_FS); - if (rc < 0) { - pr_err("%s: NT mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open G711 decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_G711_ALAW_FS); - if (rc < 0) { - pr_err("%s: T mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("%s: %d mode is not supported mode\n", - __func__, file->f_mode); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_g711_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("%s: debugfs_create_file failed\n", __func__); -#endif - pr_debug("%s: g711dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_CS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_LFE; - } else if (channels == 7) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_CS; - lchannel_mapping[6] = PCM_CHANNEL_LFE; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FLC; - lchannel_mapping[2] = PCM_CHANNEL_FRC; - lchannel_mapping[3] = PCM_CHANNEL_FL; - lchannel_mapping[4] = PCM_CHANNEL_FR; - lchannel_mapping[5] = PCM_CHANNEL_LS; - lchannel_mapping[6] = PCM_CHANNEL_RS; - lchannel_mapping[7] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} - -static const struct file_operations audio_g711_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .compat_ioctl = audio_compat_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_g711alaw_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711alaw", - .fops = &audio_g711_fops, -}; - -int __init audio_g711alaw_init(void) -{ - int ret = misc_register(&audio_g711alaw_misc); - - if (ret == 0) - device_init_wakeup(audio_g711alaw_misc.this_device, true); - audio_g711_ws_mgr.ref_cnt = 0; - mutex_init(&audio_g711_ws_mgr.ws_lock); - - return ret; -} - -void audio_g711alaw_exit(void) -{ - mutex_destroy(&audio_g711_ws_mgr.ws_lock); - misc_deregister(&audio_g711alaw_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_g711mlaw.c b/techpack/audio/4.0/dsp/codecs/audio_g711mlaw.c deleted file mode 100644 index 1c16eef81954..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_g711mlaw.c +++ /dev/null @@ -1,389 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2016-2017, 2019-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_g711mlaw_misc; -static struct ws_mgr audio_g711_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_g711_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; - -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_g711_debug_fops); -} -#endif - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels); - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_g711_dec_cfg g711_dec_cfg; - struct msm_audio_g711_dec_config *g711_dec_config; - u8 channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL]; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - memset(&g711_dec_cfg, 0, sizeof(g711_dec_cfg)); - - if (g711_channel_map(channel_mapping, - audio->pcm_cfg.channel_count)) { - pr_err("%s: setting channel map failed %d\n", - __func__, audio->pcm_cfg.channel_count); - } - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /*bits per sample*/ - false, false, channel_mapping); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_cfg.sample_rate = g711_dec_config->sample_rate; - /* Configure Media format block */ - rc = q6asm_media_format_block_g711(audio->ac, &g711_dec_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("%s: cmd media format block failed rc=%d\n", - __func__, rc); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("%s: AUDIO_START success enable[%d]\n", - __func__, audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: AUDIO_GET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: AUDIO_SET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - default: { - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_dec_config_32 { - u32 sample_rate; -}; - -enum { - AUDIO_SET_G711_DEC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_dec_config_32), - AUDIO_GET_G711_DEC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_dec_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config_32.sample_rate = g711_dec_config->sample_rate; - - if (copy_to_user((void *)arg, &g711_dec_config_32, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - if (copy_from_user(&g711_dec_config_32, (void *)arg, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config->sample_rate = g711_dec_config_32.sample_rate; - - break; - } - default: { - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_compat_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_g711_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (!audio) - return -ENOMEM; - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_g711_dec_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_g711mlaw_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_g711_ws_mgr; - - init_waitqueue_head(&audio->event_wait); - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ /*foramt:G711_ALAW*/ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_G711_MLAW_FS); - if (rc < 0) { - pr_err("%s: NT mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open G711 decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_G711_MLAW_FS); - if (rc < 0) { - pr_err("%s: T mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("%s: %d mode is not supported\n", __func__, - file->f_mode); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_g711_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("%s: debugfs_create_file failed\n", __func__); -#endif - pr_debug("%s: g711dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_CS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_LFE; - } else if (channels == 7) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_CS; - lchannel_mapping[6] = PCM_CHANNEL_LFE; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FLC; - lchannel_mapping[2] = PCM_CHANNEL_FRC; - lchannel_mapping[3] = PCM_CHANNEL_FL; - lchannel_mapping[4] = PCM_CHANNEL_FR; - lchannel_mapping[5] = PCM_CHANNEL_LS; - lchannel_mapping[6] = PCM_CHANNEL_RS; - lchannel_mapping[7] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} - -static const struct file_operations audio_g711_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .compat_ioctl = audio_compat_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_g711mlaw_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711mlaw", - .fops = &audio_g711_fops, -}; - -int __init audio_g711mlaw_init(void) -{ - int ret = misc_register(&audio_g711mlaw_misc); - - if (ret == 0) - device_init_wakeup(audio_g711mlaw_misc.this_device, true); - audio_g711_ws_mgr.ref_cnt = 0; - mutex_init(&audio_g711_ws_mgr.ws_lock); - - return ret; -} - -void audio_g711mlaw_exit(void) -{ - mutex_destroy(&audio_g711_ws_mgr.ws_lock); - misc_deregister(&audio_g711mlaw_misc); -} - diff --git a/techpack/audio/4.0/dsp/codecs/audio_hwacc_effects.c b/techpack/audio/4.0/dsp/codecs/audio_hwacc_effects.c deleted file mode 100644 index d0717d792cca..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_hwacc_effects.c +++ /dev/null @@ -1,773 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "q6audio_common.h" -#include -#include "audio_utils_aio.h" - -#define MAX_CHANNELS_SUPPORTED 8 -#define WAIT_TIMEDOUT_DURATION_SECS 1 - -struct q6audio_effects { - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - - struct audio_client *ac; - struct msm_hwacc_effects_config config; - - struct mutex lock; - - atomic_t in_count; - atomic_t out_count; - - int opened; - int started; - int buf_alloc; - struct msm_nt_eff_all_config audio_effects; -}; - -static void audio_effects_init_pp(struct audio_client *ac) -{ - int ret = 0; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - if (!ac) { - pr_err("%s: audio client null to init pp\n", __func__); - return; - } - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); -} - -static void audio_effects_deinit_pp(struct audio_client *ac) -{ - if (!ac) { - pr_err("%s: audio client null to deinit pp\n", __func__); - return; - } -} - -static void audio_effects_event_handler(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_effects *effects; - - if (!payload || !priv) { - pr_err("%s: invalid data to handle events, payload: %pK, priv: %pK\n", - __func__, payload, priv); - return; - } - - effects = (struct q6audio_effects *)priv; - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: { - atomic_inc(&effects->out_count); - wake_up(&effects->write_wait); - break; - } - case ASM_DATA_EVENT_READ_DONE_V2: { - atomic_inc(&effects->in_count); - wake_up(&effects->read_wait); - break; - } - case APR_BASIC_RSP_RESULT: { - pr_debug("%s: APR_BASIC_RSP_RESULT Cmd[0x%x] Status[0x%x]\n", - __func__, payload[0], payload[1]); - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - pr_debug("ASM_SESSION_CMD_RUN_V2\n"); - break; - default: - pr_debug("%s: Payload = [0x%x] stat[0x%x]\n", - __func__, payload[0], payload[1]); - break; - } - break; - } - default: - pr_debug("%s: Unhandled Event 0x%x token = 0x%x\n", - __func__, opcode, token); - break; - } -} - -static int audio_effects_shared_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s: AUDIO_START\n", __func__); - - mutex_lock(&effects->lock); - - rc = q6asm_open_read_write_v2(effects->ac, - FORMAT_LINEAR_PCM, - FORMAT_MULTI_CHANNEL_LINEAR_PCM, - effects->config.meta_mode_enabled, - effects->config.output.bits_per_sample, - true /*overwrite topology*/, - ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER); - if (rc < 0) { - pr_err("%s: Open failed for hw accelerated effects:rc=%d\n", - __func__, rc); - rc = -EINVAL; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - effects->opened = 1; - - pr_debug("%s: dec buf size: %d, num_buf: %d, enc buf size: %d, num_buf: %d\n", - __func__, effects->config.output.buf_size, - effects->config.output.num_buf, - effects->config.input.buf_size, - effects->config.input.num_buf); - rc = q6asm_audio_client_buf_alloc_contiguous(IN, effects->ac, - effects->config.output.buf_size, - effects->config.output.num_buf); - if (rc < 0) { - pr_err("%s: Write buffer Allocation failed rc = %d\n", - __func__, rc); - rc = -ENOMEM; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - atomic_set(&effects->in_count, effects->config.input.num_buf); - rc = q6asm_audio_client_buf_alloc_contiguous(OUT, effects->ac, - effects->config.input.buf_size, - effects->config.input.num_buf); - if (rc < 0) { - pr_err("%s: Read buffer Allocation failed rc = %d\n", - __func__, rc); - rc = -ENOMEM; - goto readbuf_fail; - } - atomic_set(&effects->out_count, effects->config.output.num_buf); - effects->buf_alloc = 1; - - pr_debug("%s: enc: sample_rate: %d, num_channels: %d\n", - __func__, effects->config.input.sample_rate, - effects->config.input.num_channels); - rc = q6asm_enc_cfg_blk_pcm(effects->ac, - effects->config.input.sample_rate, - effects->config.input.num_channels); - if (rc < 0) { - pr_err("%s: pcm read block config failed\n", __func__); - rc = -EINVAL; - goto cfg_fail; - } - pr_debug("%s: dec: sample_rate: %d, num_channels: %d, bit_width: %d\n", - __func__, effects->config.output.sample_rate, - effects->config.output.num_channels, - effects->config.output.bits_per_sample); - rc = q6asm_media_format_block_pcm_format_support( - effects->ac, effects->config.output.sample_rate, - effects->config.output.num_channels, - effects->config.output.bits_per_sample); - if (rc < 0) { - pr_err("%s: pcm write format block config failed\n", - __func__); - rc = -EINVAL; - goto cfg_fail; - } - - audio_effects_init_pp(effects->ac); - - rc = q6asm_run(effects->ac, 0x00, 0x00, 0x00); - if (!rc) - effects->started = 1; - else { - effects->started = 0; - pr_err("%s: ASM run state failed\n", __func__); - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_WRITE: { - char *bufptr = NULL; - uint32_t idx = 0; - uint32_t size = 0; - - mutex_lock(&effects->lock); - - if (!effects->started) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - rc = wait_event_timeout(effects->write_wait, - atomic_read(&effects->out_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) { - pr_err("%s: write wait_event_timeout\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - if (!atomic_read(&effects->out_count)) { - pr_err("%s: pcm stopped out_count 0\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - bufptr = q6asm_is_cpu_buf_avail(IN, effects->ac, &size, &idx); - if (bufptr) { - if ((effects->config.buf_cfg.output_len > size) || - copy_from_user(bufptr, (void *)arg, - effects->config.buf_cfg.output_len)) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - rc = q6asm_write(effects->ac, - effects->config.buf_cfg.output_len, - 0, 0, NO_TIMESTAMP); - if (rc < 0) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - atomic_dec(&effects->out_count); - } else { - pr_err("%s: AUDIO_EFFECTS_WRITE: Buffer dropped\n", - __func__); - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_READ: { - char *bufptr = NULL; - uint32_t idx = 0; - uint32_t size = 0; - - mutex_lock(&effects->lock); - - if (!effects->started) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - atomic_set(&effects->in_count, 0); - - q6asm_read_v2(effects->ac, effects->config.buf_cfg.input_len); - /* Read might fail initially, don't error out */ - if (rc < 0) - pr_err("%s: read failed\n", __func__); - - rc = wait_event_timeout(effects->read_wait, - atomic_read(&effects->in_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) { - pr_err("%s: read wait_event_timeout\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - if (!atomic_read(&effects->in_count)) { - pr_err("%s: pcm stopped in_count 0\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - bufptr = q6asm_is_cpu_buf_avail(OUT, effects->ac, &size, &idx); - if (bufptr) { - if (!((void *)arg)) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - if ((effects->config.buf_cfg.input_len > size) || - copy_to_user((void *)arg, bufptr, - effects->config.buf_cfg.input_len)) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - } - mutex_unlock(&effects->lock); - break; - } - default: - pr_err("%s: Invalid effects config module\n", __func__); - rc = -EINVAL; - break; - } -ioctl_fail: - return rc; -readbuf_fail: - q6asm_audio_client_buf_free_contiguous(IN, - effects->ac); - mutex_unlock(&effects->lock); - return rc; -cfg_fail: - q6asm_audio_client_buf_free_contiguous(IN, - effects->ac); - q6asm_audio_client_buf_free_contiguous(OUT, - effects->ac); - effects->buf_alloc = 0; - mutex_unlock(&effects->lock); - return rc; -} - -static long audio_effects_set_pp_param(struct q6audio_effects *effects, - long *values) -{ - int rc = 0; - int effects_module = values[0]; - - switch (effects_module) { - case VIRTUALIZER_MODULE: - pr_debug("%s: VIRTUALIZER_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_virtualizer_handler( - effects->ac, - &(effects->audio_effects.virtualizer), - (long *)&values[1]); - break; - case REVERB_MODULE: - pr_debug("%s: REVERB_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_reverb_handler(effects->ac, - &(effects->audio_effects.reverb), - (long *)&values[1]); - break; - case BASS_BOOST_MODULE: - pr_debug("%s: BASS_BOOST_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_bass_boost_handler( - effects->ac, - &(effects->audio_effects.bass_boost), - (long *)&values[1]); - break; - case PBE_MODULE: - pr_debug("%s: PBE_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_pbe_handler( - effects->ac, - &(effects->audio_effects.pbe), - (long *)&values[1]); - break; - case EQ_MODULE: - pr_debug("%s: EQ_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_popless_eq_handler( - effects->ac, - &(effects->audio_effects.equalizer), - (long *)&values[1]); - break; - case SOFT_VOLUME_MODULE: - pr_debug("%s: SA PLUS VOLUME_MODULE\n", __func__); - msm_audio_effects_volume_handler_v2(effects->ac, - &(effects->audio_effects.saplus_vol), - (long *)&values[1], SOFT_VOLUME_INSTANCE_1); - break; - case SOFT_VOLUME2_MODULE: - pr_debug("%s: TOPOLOGY SWITCH VOLUME MODULE\n", - __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_volume_handler_v2(effects->ac, - &(effects->audio_effects.topo_switch_vol), - (long *)&values[1], SOFT_VOLUME_INSTANCE_2); - break; - default: - pr_err("%s: Invalid effects config module\n", __func__); - rc = -EINVAL; - } - return rc; -} - -static long audio_effects_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0; - long argvalues[MAX_PP_PARAMS_SZ] = {0}; - - switch (cmd) { - case AUDIO_SET_EFFECTS_CONFIG: { - pr_debug("%s: AUDIO_SET_EFFECTS_CONFIG\n", __func__); - mutex_lock(&effects->lock); - memset(&effects->config, 0, sizeof(effects->config)); - if (copy_from_user(&effects->config, (void *)arg, - sizeof(effects->config))) { - pr_err("%s: copy from user for AUDIO_SET_EFFECTS_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - pr_debug("%s: write buf_size: %d, num_buf: %d, sample_rate: %d, channel: %d\n", - __func__, effects->config.output.buf_size, - effects->config.output.num_buf, - effects->config.output.sample_rate, - effects->config.output.num_channels); - pr_debug("%s: read buf_size: %d, num_buf: %d, sample_rate: %d, channel: %d\n", - __func__, effects->config.input.buf_size, - effects->config.input.num_buf, - effects->config.input.sample_rate, - effects->config.input.num_channels); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_BUF_LEN: { - mutex_lock(&effects->lock); - if (copy_from_user(&effects->config.buf_cfg, (void *)arg, - sizeof(effects->config.buf_cfg))) { - pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", - __func__); - rc = -EFAULT; - } - pr_debug("%s: write buf len: %d, read buf len: %d\n", - __func__, effects->config.buf_cfg.output_len, - effects->config.buf_cfg.input_len); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_GET_BUF_AVAIL: { - struct msm_hwacc_buf_avail buf_avail; - - buf_avail.input_num_avail = atomic_read(&effects->in_count); - buf_avail.output_num_avail = atomic_read(&effects->out_count); - mutex_lock(&effects->lock); - pr_debug("%s: write buf avail: %d, read buf avail: %d\n", - __func__, buf_avail.output_num_avail, - buf_avail.input_num_avail); - if (copy_to_user((void *)arg, &buf_avail, - sizeof(buf_avail))) { - pr_err("%s: copy to user for AUDIO_EFFECTS_GET_NUM_BUF_AVAIL failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_PP_PARAMS: { - mutex_lock(&effects->lock); - if (copy_from_user(argvalues, (void *)arg, - MAX_PP_PARAMS_SZ*sizeof(long))) { - pr_err("%s: copy from user for pp params failed\n", - __func__); - mutex_unlock(&effects->lock); - return -EFAULT; - } - rc = audio_effects_set_pp_param(effects, argvalues); - mutex_unlock(&effects->lock); - break; - } - default: - pr_debug("%s: Calling shared ioctl\n", __func__); - rc = audio_effects_shared_ioctl(file, cmd, arg); - break; - } - if (rc) - pr_err("%s: cmd 0x%x failed\n", __func__, cmd); - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_hwacc_data_config32 { - __u32 buf_size; - __u32 num_buf; - __u32 num_channels; - __u8 channel_map[MAX_CHANNELS_SUPPORTED]; - __u32 sample_rate; - __u32 bits_per_sample; -}; - -struct msm_hwacc_buf_cfg32 { - __u32 input_len; - __u32 output_len; -}; - -struct msm_hwacc_buf_avail32 { - __u32 input_num_avail; - __u32 output_num_avail; -}; - -struct msm_hwacc_effects_config32 { - struct msm_hwacc_data_config32 input; - struct msm_hwacc_data_config32 output; - struct msm_hwacc_buf_cfg32 buf_cfg; - __u32 meta_mode_enabled; - __u32 overwrite_topology; - __s32 topology; -}; - -enum { - AUDIO_SET_EFFECTS_CONFIG32 = _IOW(AUDIO_IOCTL_MAGIC, 99, - struct msm_hwacc_effects_config32), - AUDIO_EFFECTS_SET_BUF_LEN32 = _IOW(AUDIO_IOCTL_MAGIC, 100, - struct msm_hwacc_buf_cfg32), - AUDIO_EFFECTS_GET_BUF_AVAIL32 = _IOW(AUDIO_IOCTL_MAGIC, 101, - struct msm_hwacc_buf_avail32), - AUDIO_EFFECTS_WRITE32 = _IOW(AUDIO_IOCTL_MAGIC, 102, compat_uptr_t), - AUDIO_EFFECTS_READ32 = _IOWR(AUDIO_IOCTL_MAGIC, 103, compat_uptr_t), - AUDIO_EFFECTS_SET_PP_PARAMS32 = _IOW(AUDIO_IOCTL_MAGIC, 104, - compat_uptr_t), - AUDIO_START32 = _IOW(AUDIO_IOCTL_MAGIC, 0, unsigned int), -}; - -static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0, i; - - switch (cmd) { - case AUDIO_SET_EFFECTS_CONFIG32: { - struct msm_hwacc_effects_config32 config32; - struct msm_hwacc_effects_config *config = &effects->config; - - mutex_lock(&effects->lock); - memset(&effects->config, 0, sizeof(effects->config)); - if (copy_from_user(&config32, (void *)arg, - sizeof(config32))) { - pr_err("%s: copy to user for AUDIO_SET_EFFECTS_CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - break; - } - config->input.buf_size = config32.input.buf_size; - config->input.num_buf = config32.input.num_buf; - config->input.num_channels = config32.input.num_channels; - config->input.sample_rate = config32.input.sample_rate; - config->input.bits_per_sample = config32.input.bits_per_sample; - config->input.buf_size = config32.input.buf_size; - for (i = 0; i < MAX_CHANNELS_SUPPORTED; i++) - config->input.channel_map[i] = - config32.input.channel_map[i]; - config->output.buf_size = config32.output.buf_size; - config->output.num_buf = config32.output.num_buf; - config->output.num_channels = config32.output.num_channels; - config->output.sample_rate = config32.output.sample_rate; - config->output.bits_per_sample = - config32.output.bits_per_sample; - config->output.buf_size = config32.output.buf_size; - for (i = 0; i < MAX_CHANNELS_SUPPORTED; i++) - config->output.channel_map[i] = - config32.output.channel_map[i]; - config->buf_cfg.input_len = config32.buf_cfg.input_len; - config->buf_cfg.output_len = config32.buf_cfg.output_len; - config->meta_mode_enabled = config32.meta_mode_enabled; - config->overwrite_topology = config32.overwrite_topology; - config->topology = config32.topology; - pr_debug("%s: write buf_size: %d, num_buf: %d, sample_rate: %d, channels: %d\n", - __func__, effects->config.output.buf_size, - effects->config.output.num_buf, - effects->config.output.sample_rate, - effects->config.output.num_channels); - pr_debug("%s: read buf_size: %d, num_buf: %d, sample_rate: %d, channels: %d\n", - __func__, effects->config.input.buf_size, - effects->config.input.num_buf, - effects->config.input.sample_rate, - effects->config.input.num_channels); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_BUF_LEN32: { - struct msm_hwacc_buf_cfg32 buf_cfg32; - struct msm_hwacc_effects_config *config = &effects->config; - - mutex_lock(&effects->lock); - if (copy_from_user(&buf_cfg32, (void *)arg, - sizeof(buf_cfg32))) { - pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - break; - } - config->buf_cfg.input_len = buf_cfg32.input_len; - config->buf_cfg.output_len = buf_cfg32.output_len; - pr_debug("%s: write buf len: %d, read buf len: %d\n", - __func__, effects->config.buf_cfg.output_len, - effects->config.buf_cfg.input_len); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_GET_BUF_AVAIL32: { - struct msm_hwacc_buf_avail32 buf_avail; - - memset(&buf_avail, 0, sizeof(buf_avail)); - - mutex_lock(&effects->lock); - buf_avail.input_num_avail = atomic_read(&effects->in_count); - buf_avail.output_num_avail = atomic_read(&effects->out_count); - pr_debug("%s: write buf avail: %d, read buf avail: %d\n", - __func__, buf_avail.output_num_avail, - buf_avail.input_num_avail); - if (copy_to_user((void *)arg, &buf_avail, - sizeof(buf_avail))) { - pr_err("%s: copy to user for AUDIO_EFFECTS_GET_NUM_BUF_AVAIL failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_PP_PARAMS32: { - long argvalues[MAX_PP_PARAMS_SZ] = {0}; - int argvalues32[MAX_PP_PARAMS_SZ] = {0}; - - mutex_lock(&effects->lock); - if (copy_from_user(argvalues32, (void *)arg, - MAX_PP_PARAMS_SZ*sizeof(int))) { - pr_err("%s: copy from user failed for pp params\n", - __func__); - mutex_unlock(&effects->lock); - return -EFAULT; - } - for (i = 0; i < MAX_PP_PARAMS_SZ; i++) - argvalues[i] = argvalues32[i]; - - rc = audio_effects_set_pp_param(effects, argvalues); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_START32: { - rc = audio_effects_shared_ioctl(file, AUDIO_START, arg); - break; - } - case AUDIO_EFFECTS_WRITE32: { - rc = audio_effects_shared_ioctl(file, AUDIO_EFFECTS_WRITE, arg); - break; - } - case AUDIO_EFFECTS_READ32: { - rc = audio_effects_shared_ioctl(file, AUDIO_EFFECTS_READ, arg); - break; - } - default: - pr_debug("%s: unhandled ioctl\n", __func__); - rc = -EINVAL; - break; - } - return rc; -} -#endif - -static int audio_effects_release(struct inode *inode, struct file *file) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0; - - if (!effects) { - pr_err("%s: effect is NULL\n", __func__); - return -EINVAL; - } - if (effects->opened) { - rc = wait_event_timeout(effects->write_wait, - atomic_read(&effects->out_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) - pr_err("%s: write wait_event_timeout failed\n", - __func__); - rc = wait_event_timeout(effects->read_wait, - atomic_read(&effects->in_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) - pr_err("%s: read wait_event_timeout failed\n", - __func__); - rc = q6asm_cmd(effects->ac, CMD_CLOSE); - if (rc < 0) - pr_err("%s[%pK]:Failed to close the session rc=%d\n", - __func__, effects, rc); - effects->opened = 0; - effects->started = 0; - - audio_effects_deinit_pp(effects->ac); - } - - if (effects->buf_alloc) { - q6asm_audio_client_buf_free_contiguous(IN, effects->ac); - q6asm_audio_client_buf_free_contiguous(OUT, effects->ac); - } - q6asm_audio_client_free(effects->ac); - - mutex_destroy(&effects->lock); - kfree(effects); - - pr_debug("%s: close session success\n", __func__); - return rc; -} - -static int audio_effects_open(struct inode *inode, struct file *file) -{ - struct q6audio_effects *effects; - int rc = 0; - - effects = kzalloc(sizeof(struct q6audio_effects), GFP_KERNEL); - if (!effects) - return -ENOMEM; - - effects->ac = q6asm_audio_client_alloc( - (app_cb)audio_effects_event_handler, - (void *)effects); - if (!effects->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(effects); - return -ENOMEM; - } - - init_waitqueue_head(&effects->read_wait); - init_waitqueue_head(&effects->write_wait); - mutex_init(&effects->lock); - - effects->opened = 0; - effects->started = 0; - effects->buf_alloc = 0; - file->private_data = effects; - pr_debug("%s: open session success\n", __func__); - return rc; -} - -static const struct file_operations audio_effects_fops = { - .owner = THIS_MODULE, - .open = audio_effects_open, - .release = audio_effects_release, - .unlocked_ioctl = audio_effects_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_effects_compat_ioctl, -#endif -}; - -struct miscdevice audio_effects_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_hweffects", - .fops = &audio_effects_fops, -}; - -int __init audio_effects_init(void) -{ - return misc_register(&audio_effects_misc); -} - -void audio_effects_exit(void) -{ - misc_deregister(&audio_effects_misc); -} - -MODULE_DESCRIPTION("Audio hardware accelerated effects driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/codecs/audio_mp3.c b/techpack/audio/4.0/dsp/codecs/audio_mp3.c deleted file mode 100644 index b64b9922606a..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_mp3.c +++ /dev/null @@ -1,192 +0,0 @@ -/* mp3 audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "audio_utils_aio.h" - -static struct miscdevice audio_mp3_misc; -static struct ws_mgr audio_mp3_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_mp3_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - rc = enable_volume_ramp(audio); - if (rc < 0) { - pr_err("%s: Failed to enable volume ramp\n", - __func__); - } - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_info("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_mp3_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_mp3_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_mp3_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_MP3); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open MP3 decoder, expected frames is always 1 - * audio->buf_cfg.frames_per_buf = 0x01; - */ - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_MP3); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_mp3_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_mp3_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:mp3dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_mp3_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_mp3_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mp3", - .fops = &audio_mp3_fops, -}; - -int __init audio_mp3_init(void) -{ - int ret = misc_register(&audio_mp3_misc); - - if (ret == 0) - device_init_wakeup(audio_mp3_misc.this_device, true); - audio_mp3_ws_mgr.ref_cnt = 0; - mutex_init(&audio_mp3_ws_mgr.ws_lock); - - return ret; -} - -void audio_mp3_exit(void) -{ - mutex_destroy(&audio_mp3_ws_mgr.ws_lock); - misc_deregister(&audio_mp3_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_multi_aac.c b/techpack/audio/4.0/dsp/codecs/audio_multi_aac.c deleted file mode 100644 index 0a15c83047c5..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_multi_aac.c +++ /dev/null @@ -1,534 +0,0 @@ -/* aac audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -#define AUDIO_AAC_DUAL_MONO_INVALID -1 - - -/* Default number of pre-allocated event packets */ -#define PCM_BUFSZ_MIN_AACM ((8*1024) + sizeof(struct dec_meta_out)) -static struct miscdevice audio_multiaac_misc; -static struct ws_mgr audio_multiaac_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_aac_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_aac_cfg aac_cfg; - struct msm_audio_aac_config *aac_config; - uint32_t sbr_ps = 0x00; - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - if (audio->feedback == TUNNEL_MODE) { - aac_cfg.sample_rate = aac_config->sample_rate; - aac_cfg.ch_cfg = aac_config->channel_configuration; - } else { - aac_cfg.sample_rate = audio->pcm_cfg.sample_rate; - aac_cfg.ch_cfg = audio->pcm_cfg.channel_count; - } - pr_debug("%s: AUDIO_START session_id[%d]\n", __func__, - audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_native(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - /* turn on both sbr and ps */ - rc = q6asm_enable_sbrps(audio->ac, sbr_ps); - if (rc < 0) - pr_err("sbr-ps enable failed\n"); - if (aac_config->sbr_ps_on_flag) - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - else if (aac_config->sbr_on_flag) - aac_cfg.aot = AAC_ENC_MODE_AAC_P; - else - aac_cfg.aot = AAC_ENC_MODE_AAC_LC; - - switch (aac_config->format) { - case AUDIO_AAC_FORMAT_ADTS: - aac_cfg.format = 0x00; - break; - case AUDIO_AAC_FORMAT_LOAS: - aac_cfg.format = 0x01; - break; - case AUDIO_AAC_FORMAT_ADIF: - aac_cfg.format = 0x02; - break; - default: - case AUDIO_AAC_FORMAT_RAW: - aac_cfg.format = 0x03; - } - aac_cfg.ep_config = aac_config->ep_config; - aac_cfg.section_data_resilience = - aac_config->aac_section_data_resilience_flag; - aac_cfg.scalefactor_data_resilience = - aac_config->aac_scalefactor_data_resilience_flag; - aac_cfg.spectral_data_resilience = - aac_config->aac_spectral_data_resilience_flag; - - pr_debug("%s:format=%x aot=%d ch=%d sr=%d\n", - __func__, aac_cfg.format, - aac_cfg.aot, aac_cfg.ch_cfg, - aac_cfg.sample_rate); - - /* Configure Media format block */ - rc = q6asm_media_format_block_multi_aac(audio->ac, &aac_cfg); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - - /* Fall back to the default number of channels - * if aac_cfg.ch_cfg is not between 1-6 - */ - if ((aac_cfg.ch_cfg == 0) || (aac_cfg.ch_cfg > 6)) - aac_cfg.ch_cfg = 2; - - rc = q6asm_set_encdec_chan_map(audio->ac, aac_cfg.ch_cfg); - if (rc < 0) { - pr_err("%s: cmd set encdec_chan_map failed\n", - __func__); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_info("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config *aac_config; - uint16_t sce_left = 1, sce_right = 2; - - if (arg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - memcpy(audio->codec_cfg, arg, - sizeof(struct msm_audio_aac_config)); - aac_config = audio->codec_cfg; - if (aac_config->dual_mono_mode > - AUDIO_AAC_DUAL_MONO_PL_SR) { - pr_err("%s:AUDIO_SET_AAC_CONFIG: Invalid dual_mono mode =%d\n", - __func__, aac_config->dual_mono_mode); - } else { - /* convert the data from user into sce_left - * and sce_right based on the definitions - */ - pr_debug("%s: AUDIO_SET_AAC_CONFIG: modify dual_mono mode =%d\n", - __func__, aac_config->dual_mono_mode); - switch (aac_config->dual_mono_mode) { - case AUDIO_AAC_DUAL_MONO_PL_PR: - sce_left = 1; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_SL_SR: - sce_left = 2; - sce_right = 2; - break; - case AUDIO_AAC_DUAL_MONO_SL_PR: - sce_left = 2; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_PL_SR: - default: - sce_left = 1; - sce_right = 2; - break; - } - rc = q6asm_cfg_dual_mono_aac(audio->ac, - sce_left, sce_right); - if (rc < 0) - pr_err("%s: asm cmd dualmono failed rc=%d\n", - __func__, rc); - } break; - break; - } - case AUDIO_SET_AAC_MIX_CONFIG: { - u32 *mix_coeff = (u32 *)arg; - - if (!arg) { - pr_err("%s: Invalid param for %s\n", - __func__, "AUDIO_SET_AAC_MIX_CONFIG"); - rc = -EINVAL; - break; - } - pr_debug("%s, AUDIO_SET_AAC_MIX_CONFIG", __func__); - pr_debug("%s, value of coeff = %d", - __func__, *mix_coeff); - q6asm_cfg_aac_sel_mix_coef(audio->ac, *mix_coeff); - if (rc < 0) - pr_err("%s asm aac_sel_mix_coef failed rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG failed\n" - , __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config aac_config; - - if (copy_from_user(&aac_config, (void *)arg, - sizeof(aac_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG failed\n" - , __func__); - rc = -EFAULT; - } - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - case AUDIO_SET_AAC_MIX_CONFIG: { - u32 mix_config; - - pr_debug("%s, AUDIO_SET_AAC_MIX_CONFIG", __func__); - if (copy_from_user(&mix_config, (void *)arg, - sizeof(u32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_MIX_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = audio_ioctl_shared(file, cmd, &mix_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("Calling utils ioctl\n"); - rc = audio->codec_ioctl(file, cmd, arg); - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_aac_config32 { - s16 format; - u16 audio_object; - u16 ep_config; /* 0 ~ 3 useful only obj = ERLC */ - u16 aac_section_data_resilience_flag; - u16 aac_scalefactor_data_resilience_flag; - u16 aac_spectral_data_resilience_flag; - u16 sbr_on_flag; - u16 sbr_ps_on_flag; - u16 dual_mono_mode; - u16 channel_configuration; - u16 sample_rate; -}; - -enum { - AUDIO_SET_AAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config32), - AUDIO_GET_AAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config32), -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG_32: { - struct msm_audio_aac_config *aac_config; - struct msm_audio_aac_config32 aac_config_32; - - memset(&aac_config_32, 0, sizeof(aac_config_32)); - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - aac_config_32.format = aac_config->format; - aac_config_32.audio_object = aac_config->audio_object; - aac_config_32.ep_config = aac_config->ep_config; - aac_config_32.aac_section_data_resilience_flag = - aac_config->aac_section_data_resilience_flag; - aac_config_32.aac_scalefactor_data_resilience_flag = - aac_config->aac_scalefactor_data_resilience_flag; - aac_config_32.aac_spectral_data_resilience_flag = - aac_config->aac_spectral_data_resilience_flag; - aac_config_32.sbr_on_flag = aac_config->sbr_on_flag; - aac_config_32.sbr_ps_on_flag = aac_config->sbr_ps_on_flag; - aac_config_32.dual_mono_mode = aac_config->dual_mono_mode; - aac_config_32.channel_configuration = - aac_config->channel_configuration; - aac_config_32.sample_rate = aac_config->sample_rate; - - if (copy_to_user((void *)arg, &aac_config_32, - sizeof(aac_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG_32: { - struct msm_audio_aac_config aac_config; - struct msm_audio_aac_config32 aac_config_32; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - if (copy_from_user(&aac_config_32, (void *)arg, - sizeof(aac_config_32))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_AAC_CONFIG_32 failed", - __func__); - rc = -EFAULT; - break; - } - aac_config.format = aac_config_32.format; - aac_config.audio_object = aac_config_32.audio_object; - aac_config.ep_config = aac_config_32.ep_config; - aac_config.aac_section_data_resilience_flag = - aac_config_32.aac_section_data_resilience_flag; - aac_config.aac_scalefactor_data_resilience_flag = - aac_config_32.aac_scalefactor_data_resilience_flag; - aac_config.aac_spectral_data_resilience_flag = - aac_config_32.aac_spectral_data_resilience_flag; - aac_config.sbr_on_flag = aac_config_32.sbr_on_flag; - aac_config.sbr_ps_on_flag = aac_config_32.sbr_ps_on_flag; - aac_config.dual_mono_mode = aac_config_32.dual_mono_mode; - aac_config.channel_configuration = - aac_config_32.channel_configuration; - aac_config.sample_rate = aac_config_32.sample_rate; - - cmd = AUDIO_SET_AAC_CONFIG; - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - case AUDIO_SET_AAC_MIX_CONFIG: { - u32 mix_config; - - pr_debug("%s, AUDIO_SET_AAC_MIX_CONFIG\n", __func__); - if (copy_from_user(&mix_config, (void *)arg, - sizeof(u32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_MIX_CONFIG failed\n" - , __func__); - rc = -EFAULT; - break; - } - rc = audio_ioctl_shared(file, cmd, &mix_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("Calling utils ioctl\n"); - rc = audio->codec_compat_ioctl(file, cmd, arg); - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - struct msm_audio_aac_config *aac_config = NULL; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_multi_aac_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - - aac_config = audio->codec_cfg; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN_AACM; - audio->miscdevice = &audio_multiaac_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_multiaac_ws_mgr; - aac_config->dual_mono_mode = AUDIO_AAC_DUAL_MONO_INVALID; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_MPEG4_MULTI_AAC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open AAC decoder, expected frames is always 1 - * audio->buf_cfg.frames_per_buf = 0x01; - */ - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_MPEG4_MULTI_AAC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_multi_aac_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_aac_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:AAC 5.1 Decoder OPEN success mode[%d]session[%d]\n", - __func__, audio->feedback, audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_aac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_multiaac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_multi_aac", - .fops = &audio_aac_fops, -}; - -int __init audio_multiaac_init(void) -{ - int ret = misc_register(&audio_multiaac_misc); - - if (ret == 0) - device_init_wakeup(audio_multiaac_misc.this_device, true); - audio_multiaac_ws_mgr.ref_cnt = 0; - mutex_init(&audio_multiaac_ws_mgr.ws_lock); - - return ret; -} - -void audio_multiaac_exit(void) -{ - mutex_destroy(&audio_multiaac_ws_mgr.ws_lock); - misc_deregister(&audio_multiaac_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_native.c b/techpack/audio/4.0/dsp/codecs/audio_native.c deleted file mode 100644 index 6e2491459bf0..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_native.c +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "audio_utils.h" - -spinlock_t enc_dec_lock; - -static int __init audio_native_init(void) -{ - aac_in_init(); - amrnb_in_init(); - amrwb_in_init(); - audio_aac_init(); - audio_alac_init(); - audio_amrnb_init(); - audio_amrwb_init(); - audio_amrwbplus_init(); - audio_ape_init(); - audio_evrc_init(); - audio_g711alaw_init(); - audio_g711mlaw_init(); - audio_effects_init(); - audio_mp3_init(); - audio_multiaac_init(); - audio_qcelp_init(); - audio_wma_init(); - audio_wmapro_init(); - evrc_in_init(); - g711alaw_in_init(); - g711mlaw_in_init(); - qcelp_in_init(); - spin_lock_init(&enc_dec_lock); - return 0; -} - -static void __exit audio_native_exit(void) -{ - aac_in_exit(); - amrnb_in_exit(); - amrwb_in_exit(); - audio_aac_exit(); - audio_alac_exit(); - audio_amrnb_exit(); - audio_amrwb_exit(); - audio_amrwbplus_exit(); - audio_ape_exit(); - audio_evrc_exit(); - audio_g711alaw_exit(); - audio_g711mlaw_exit(); - audio_effects_exit(); - audio_mp3_exit(); - audio_multiaac_exit(); - audio_qcelp_exit(); - audio_wma_exit(); - audio_wmapro_exit(); - evrc_in_exit(); - g711alaw_in_exit(); - g711mlaw_in_exit(); - qcelp_in_exit(); -} - -module_init(audio_native_init); -module_exit(audio_native_exit); -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Native Encoder/Decoder module"); diff --git a/techpack/audio/4.0/dsp/codecs/audio_qcelp.c b/techpack/audio/4.0/dsp/codecs/audio_qcelp.c deleted file mode 100644 index f5e1a313e755..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_qcelp.c +++ /dev/null @@ -1,195 +0,0 @@ -/* qcelp(v13k) audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "audio_utils_aio.h" - -#define FRAME_SIZE_DEC_QCELP ((32) + sizeof(struct dec_meta_in)) - -static struct miscdevice audio_qcelp_misc; -static struct ws_mgr audio_qcelp_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_qcelp_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_qcelp_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE_DEC_QCELP; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - audio->pcm_cfg.sample_rate = 8000; - audio->pcm_cfg.channel_count = 1; - audio->miscdevice = &audio_qcelp_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_qcelp_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_V13K); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_V13K); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_qcelp_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_qcelp_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_qcelp_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_qcelp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp", - .fops = &audio_qcelp_fops, -}; - -int audio_qcelp_init(void) -{ - int ret = misc_register(&audio_qcelp_misc); - - if (ret == 0) - device_init_wakeup(audio_qcelp_misc.this_device, true); - audio_qcelp_ws_mgr.ref_cnt = 0; - mutex_init(&audio_qcelp_ws_mgr.ws_lock); - - return ret; -} - -void audio_qcelp_exit(void) -{ - mutex_destroy(&audio_qcelp_ws_mgr.ws_lock); - misc_deregister(&audio_qcelp_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_utils.c b/techpack/audio/4.0/dsp/codecs/audio_utils.c deleted file mode 100644 index ac934132ac3b..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_utils.c +++ /dev/null @@ -1,953 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2010-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* - * Define maximum buffer size. Below values are chosen considering the higher - * values used among all native drivers. - */ -#define MAX_FRAME_SIZE 1536 -#define MAX_FRAMES 5 -#define META_SIZE (sizeof(struct meta_out_dsp)) -#define MAX_BUFFER_SIZE (1 + ((MAX_FRAME_SIZE + META_SIZE) * MAX_FRAMES)) - -static int audio_in_pause(struct q6audio_in *audio) -{ - int rc; - - rc = q6asm_cmd(audio->ac, CMD_PAUSE); - if (rc < 0) - pr_err("%s:session id %d: pause cmd failed rc=%d\n", __func__, - audio->ac->session, rc); - - return rc; -} - -static int audio_in_flush(struct q6audio_in *audio) -{ - int rc; - - pr_debug("%s:session id %d: flush\n", __func__, audio->ac->session); - /* Flush if session running */ - if (audio->enabled) { - /* Implicitly issue a pause to the encoder before flushing */ - rc = audio_in_pause(audio); - if (rc < 0) { - pr_err("%s:session id %d: pause cmd failed rc=%d\n", - __func__, audio->ac->session, rc); - return rc; - } - - rc = q6asm_cmd(audio->ac, CMD_FLUSH); - if (rc < 0) { - pr_err("%s:session id %d: flush cmd failed rc=%d\n", - __func__, audio->ac->session, rc); - return rc; - } - /* 2nd arg: 0 -> run immediately - * 3rd arg: 0 -> msw_ts, - * 4th arg: 0 ->lsw_ts - */ - q6asm_run(audio->ac, 0x00, 0x00, 0x00); - pr_debug("Rerun the session\n"); - } - audio->rflush = 1; - audio->wflush = 1; - memset(audio->out_frame_info, 0, sizeof(audio->out_frame_info)); - wake_up(&audio->read_wait); - /* get read_lock to ensure no more waiting read thread */ - mutex_lock(&audio->read_lock); - audio->rflush = 0; - mutex_unlock(&audio->read_lock); - wake_up(&audio->write_wait); - /* get write_lock to ensure no more waiting write thread */ - mutex_lock(&audio->write_lock); - audio->wflush = 0; - mutex_unlock(&audio->write_lock); - pr_debug("%s:session id %d: in_bytes %d\n", __func__, - audio->ac->session, atomic_read(&audio->in_bytes)); - pr_debug("%s:session id %d: in_samples %d\n", __func__, - audio->ac->session, atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); - atomic_set(&audio->out_count, 0); - return 0; -} - -/* must be called with audio->lock held */ -int audio_in_enable(struct q6audio_in *audio) -{ - if (audio->enabled) - return 0; - - /* 2nd arg: 0 -> run immediately - * 3rd arg: 0 -> msw_ts, - * 4th arg: 0 ->lsw_ts - */ - return q6asm_run(audio->ac, 0x00, 0x00, 0x00); -} - -/* must be called with audio->lock held */ -int audio_in_disable(struct q6audio_in *audio) -{ - int rc = 0; - - if (!audio->stopped) { - audio->enabled = 0; - audio->opened = 0; - pr_debug("%s:session id %d: inbytes[%d] insamples[%d]\n", - __func__, audio->ac->session, - atomic_read(&audio->in_bytes), - atomic_read(&audio->in_samples)); - - rc = q6asm_cmd(audio->ac, CMD_CLOSE); - if (rc < 0) - pr_err("%s:session id %d: Failed to close the session rc=%d\n", - __func__, audio->ac->session, - rc); - audio->stopped = 1; - memset(audio->out_frame_info, 0, - sizeof(audio->out_frame_info)); - wake_up(&audio->read_wait); - wake_up(&audio->write_wait); - } - pr_debug("%s:session id %d: enabled[%d]\n", __func__, - audio->ac->session, audio->enabled); - return rc; -} - -int audio_in_buf_alloc(struct q6audio_in *audio) -{ - int rc = 0; - - switch (audio->buf_alloc) { - case NO_BUF_ALLOC: - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_audio_client_buf_alloc(IN, - audio->ac, - ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size), - audio->pcm_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed\n", - __func__, - audio->ac->session); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_IN; - } - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_OUT; - break; - case BUF_ALLOC_IN: - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_OUT; - break; - case BUF_ALLOC_OUT: - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_audio_client_buf_alloc(IN, audio->ac, - ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size), - audio->pcm_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed\n", - __func__, - audio->ac->session); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_IN; - } - break; - default: - pr_debug("%s:session id %d: buf[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - } - - return rc; -} - -int audio_in_set_config(struct file *file, - struct msm_audio_config *cfg) -{ - int rc = 0; - struct q6audio_in *audio = file->private_data; - - if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s:session id %d: Not sufficient permission to change the record mode\n", - __func__, audio->ac->session); - rc = -EACCES; - goto ret; - } - if ((cfg->buffer_count > PCM_BUF_COUNT) || - (cfg->buffer_count == 1)) - cfg->buffer_count = PCM_BUF_COUNT; - - audio->pcm_cfg.buffer_count = cfg->buffer_count; - audio->pcm_cfg.buffer_size = cfg->buffer_size; - audio->pcm_cfg.channel_count = cfg->channel_count; - audio->pcm_cfg.sample_rate = cfg->sample_rate; - if (audio->opened && audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_audio_client_buf_alloc(IN, audio->ac, - ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size), - audio->pcm_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed\n", - __func__, audio->ac->session); - rc = -ENOMEM; - goto ret; - } - } - audio->buf_alloc |= BUF_ALLOC_IN; - rc = 0; - pr_debug("%s:session id %d: AUDIO_SET_CONFIG %d %d\n", __func__, - audio->ac->session, audio->pcm_cfg.buffer_count, - audio->pcm_cfg.buffer_size); -ret: - return rc; -} -/* ------------------- device --------------------- */ -static long audio_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_FLUSH: { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the read_lock. - * While audio->stopped read threads will always - * exit immediately. - */ - rc = audio_in_flush(audio); - if (rc < 0) - pr_err("%s:session id %d: Flush Fail rc=%d\n", - __func__, audio->ac->session, rc); - else { /* Register back the flushed read buffer with DSP */ - int cnt = 0; - - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - pr_debug("register the read buffer\n"); - } - break; - } - case AUDIO_PAUSE: { - pr_debug("%s:session id %d: AUDIO_PAUSE\n", __func__, - audio->ac->session); - if (audio->enabled) - audio_in_pause(audio); - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->ac->session, - sizeof(u16))) { - pr_err("%s: copy_to_user for AUDIO_GET_SESSION_ID failed\n", - __func__); - rc = -EFAULT; - } - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -long audio_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_FLUSH: - case AUDIO_PAUSE: - case AUDIO_GET_SESSION_ID: - rc = audio_in_ioctl_shared(file, cmd, arg); - break; - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->str_cfg.buffer_size; - cfg.buffer_count = audio->str_cfg.buffer_count; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - pr_debug("%s:session id %d: AUDIO_GET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, cfg.buffer_size, - cfg.buffer_count); - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG failed\n" - , __func__); - rc = -EFAULT; - break; - } - /* Minimum single frame size, - * but with in maximum frames number - */ - if ((cfg.buffer_size < (audio->min_frame_size + - sizeof(struct meta_out_dsp))) || - (cfg.buffer_count < FRAME_NUM)) { - rc = -EINVAL; - break; - } - if (cfg.buffer_size > MAX_BUFFER_SIZE) { - rc = -EINVAL; - break; - } - audio->str_cfg.buffer_size = cfg.buffer_size; - audio->str_cfg.buffer_count = cfg.buffer_count; - if (audio->opened) { - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s: session id %d: Buffer Alloc failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENOMEM; - break; - } - } - audio->buf_alloc |= BUF_ALLOC_OUT; - rc = 0; - pr_debug("%s:session id %d: AUDIO_SET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, - audio->str_cfg.buffer_size, - audio->str_cfg.buffer_count); - break; - } - case AUDIO_SET_BUF_CFG: { - struct msm_audio_buf_cfg cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - break; - } - - /* Restrict the num of frames per buf to coincide with - * default buf size - */ - if (cfg.frames_per_buf > audio->max_frames_per_buf) { - rc = -EFAULT; - break; - } - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - audio->buf_cfg.frames_per_buf = cfg.frames_per_buf; - pr_debug("%s:session id %d: Set-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, - audio->ac->session, cfg.meta_info_enable, - cfg.frames_per_buf); - break; - } - case AUDIO_GET_BUF_CFG: { - pr_debug("%s:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - - if (copy_to_user((void *)arg, &audio->buf_cfg, - sizeof(struct msm_audio_buf_cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_CONFIG: { - if (copy_to_user((void *)arg, &audio->pcm_cfg, - sizeof(struct msm_audio_config))) - rc = -EFAULT; - break; - - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = audio_in_set_config(file, &cfg); - break; - } - default: - /* call codec specific ioctl */ - rc = audio->enc_ioctl(file, cmd, arg); - } - mutex_unlock(&audio->lock); - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_stats32 { - u32 byte_count; - u32 sample_count; - u32 unused[2]; -}; - -struct msm_audio_stream_config32 { - u32 buffer_size; - u32 buffer_count; -}; - -struct msm_audio_config32 { - u32 buffer_size; - u32 buffer_count; - u32 channel_count; - u32 sample_rate; - u32 type; - u32 meta_field; - u32 bits; - u32 unused[3]; -}; - -struct msm_audio_buf_cfg32 { - u32 meta_info_enable; - u32 frames_per_buf; -}; - -enum { - AUDIO_GET_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 3, - struct msm_audio_config32), - AUDIO_SET_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 4, - struct msm_audio_config32), - AUDIO_GET_STATS_32 = _IOR(AUDIO_IOCTL_MAGIC, 5, - struct msm_audio_stats32), - AUDIO_SET_STREAM_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 80, - struct msm_audio_stream_config32), - AUDIO_GET_STREAM_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 81, - struct msm_audio_stream_config32), - AUDIO_SET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 94, - struct msm_audio_buf_cfg32), - AUDIO_GET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 93, - struct msm_audio_buf_cfg32), -}; - -long audio_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS_32) { - struct msm_audio_stats32 stats_32; - - memset(&stats_32, 0, sizeof(stats_32)); - stats_32.byte_count = atomic_read(&audio->in_bytes); - stats_32.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats_32, sizeof(stats_32))) { - pr_err("%s: copy_to_user failed for AUDIO_GET_STATS_32\n", - __func__); - return -EFAULT; - } - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_FLUSH: - case AUDIO_PAUSE: - case AUDIO_GET_SESSION_ID: - rc = audio_in_ioctl_shared(file, cmd, arg); - break; - case AUDIO_GET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg_32; - - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.buffer_size = audio->str_cfg.buffer_size; - cfg_32.buffer_count = audio->str_cfg.buffer_count; - if (copy_to_user((void *)arg, &cfg_32, sizeof(cfg_32))) { - pr_err("%s: Copy to user failed\n", __func__); - rc = -EFAULT; - } - pr_debug("%s:session id %d: AUDIO_GET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, - cfg_32.buffer_size, - cfg_32.buffer_count); - break; - } - case AUDIO_SET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg_32; - struct msm_audio_stream_config cfg; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.buffer_size = cfg_32.buffer_size; - cfg.buffer_count = cfg_32.buffer_count; - /* Minimum single frame size, - * but with in maximum frames number - */ - if ((cfg.buffer_size < (audio->min_frame_size + - sizeof(struct meta_out_dsp))) || - (cfg.buffer_count < FRAME_NUM)) { - rc = -EINVAL; - break; - } - audio->str_cfg.buffer_size = cfg.buffer_size; - audio->str_cfg.buffer_count = cfg.buffer_count; - if (audio->opened) { - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s: session id %d:\n", - __func__, audio->ac->session); - pr_err("Buffer Alloc failed rc=%d\n", rc); - rc = -ENOMEM; - break; - } - } - audio->buf_alloc |= BUF_ALLOC_OUT; - pr_debug("%s:session id %d: AUDIO_SET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, - audio->str_cfg.buffer_size, - audio->str_cfg.buffer_count); - break; - } - case AUDIO_SET_BUF_CFG_32: { - struct msm_audio_buf_cfg32 cfg_32; - struct msm_audio_buf_cfg cfg; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_BUG_CFG_32 failed", - __func__); - rc = -EFAULT; - break; - } - cfg.meta_info_enable = cfg_32.meta_info_enable; - cfg.frames_per_buf = cfg_32.frames_per_buf; - - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - break; - } - - /* Restrict the num of frames per buf to coincide with - * default buf size - */ - if (cfg.frames_per_buf > audio->max_frames_per_buf) { - rc = -EFAULT; - break; - } - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - audio->buf_cfg.frames_per_buf = cfg.frames_per_buf; - pr_debug("%s:session id %d: Set-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, audio->ac->session, cfg.meta_info_enable, - cfg.frames_per_buf); - break; - } - case AUDIO_GET_BUF_CFG_32: { - struct msm_audio_buf_cfg32 cfg_32; - - pr_debug("%s:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - cfg_32.meta_info_enable = audio->buf_cfg.meta_info_enable; - cfg_32.frames_per_buf = audio->buf_cfg.frames_per_buf; - - if (copy_to_user((void *)arg, &cfg_32, - sizeof(struct msm_audio_buf_cfg32))) { - pr_err("%s: Copy to user failed\n", __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_GET_CONFIG_32: { - struct msm_audio_config32 cfg_32; - - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.buffer_size = audio->pcm_cfg.buffer_size; - cfg_32.buffer_count = audio->pcm_cfg.buffer_count; - cfg_32.channel_count = audio->pcm_cfg.channel_count; - cfg_32.sample_rate = audio->pcm_cfg.sample_rate; - cfg_32.type = audio->pcm_cfg.type; - cfg_32.meta_field = audio->pcm_cfg.meta_field; - cfg_32.bits = audio->pcm_cfg.bits; - - if (copy_to_user((void *)arg, &cfg_32, - sizeof(struct msm_audio_config32))) { - pr_err("%s: Copy to user failed\n", __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_CONFIG_32: { - struct msm_audio_config32 cfg_32; - struct msm_audio_config cfg; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.buffer_size = cfg_32.buffer_size; - cfg.buffer_count = cfg_32.buffer_count; - cfg.channel_count = cfg_32.channel_count; - cfg.sample_rate = cfg_32.sample_rate; - cfg.type = cfg_32.type; - cfg.meta_field = cfg_32.meta_field; - cfg.bits = cfg_32.bits; - rc = audio_in_set_config(file, &cfg); - break; - } - default: - /* call codec specific ioctl */ - rc = audio->enc_compat_ioctl(file, cmd, arg); - } - mutex_unlock(&audio->lock); - return rc; -} -#endif - -ssize_t audio_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct q6audio_in *audio = file->private_data; - const char __user *start = buf; - unsigned char *data; - uint32_t offset = 0; - uint32_t size = 0; - int rc = 0; - uint32_t idx; - struct meta_out_dsp meta; - uint32_t bytes_to_copy = 0; - uint32_t mfield_size = (audio->buf_cfg.meta_info_enable == 0) ? 0 : - (sizeof(unsigned char) + - (sizeof(struct meta_out_dsp)*(audio->buf_cfg.frames_per_buf))); - - memset(&meta, 0, sizeof(meta)); - pr_debug("%s:session id %d: read - %zd\n", __func__, audio->ac->session, - count); - if (audio->reset_event) - return -ENETRESET; - - if (!audio->enabled) - return -EFAULT; - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->read_wait, - ((atomic_read(&audio->out_count) > 0) || - (audio->stopped) || - audio->rflush || audio->eos_rsp || - audio->event_abort)); - - if (audio->event_abort) { - rc = -EIO; - break; - } - - - if (rc < 0) - break; - - if ((audio->stopped && !(atomic_read(&audio->out_count))) || - audio->rflush) { - pr_debug("%s:session id %d: driver in stop state or flush,No more buf to read", - __func__, - audio->ac->session); - rc = 0;/* End of File */ - break; - } - if (!(atomic_read(&audio->out_count)) && - (audio->eos_rsp == 1) && - (count >= (sizeof(unsigned char) + - sizeof(struct meta_out_dsp)))) { - unsigned char num_of_frames; - - pr_info("%s:session id %d: eos %d at output\n", - __func__, audio->ac->session, audio->eos_rsp); - if (buf != start) - break; - num_of_frames = 0xFF; - if (copy_to_user(buf, &num_of_frames, - sizeof(unsigned char))) { - rc = -EFAULT; - break; - } - buf += sizeof(unsigned char); - meta.frame_size = 0xFFFF; - meta.encoded_pcm_samples = 0xFFFF; - meta.msw_ts = 0x00; - meta.lsw_ts = 0x00; - meta.nflags = AUD_EOS_SET; - audio->eos_rsp = 0; - if (copy_to_user(buf, &meta, sizeof(meta))) { - rc = -EFAULT; - break; - } - buf += sizeof(meta); - break; - } - data = (unsigned char *)q6asm_is_cpu_buf_avail(OUT, audio->ac, - &size, &idx); - if ((count >= (size + mfield_size)) && data) { - if (audio->buf_cfg.meta_info_enable) { - if (copy_to_user(buf, - &audio->out_frame_info[idx][0], - sizeof(unsigned char))) { - rc = -EFAULT; - break; - } - bytes_to_copy = - (size + audio->out_frame_info[idx][1]); - if (bytes_to_copy == 0) { - rc = 0; - break; - } - /* Number of frames information copied */ - buf += sizeof(unsigned char); - count -= sizeof(unsigned char); - } else { - offset = audio->out_frame_info[idx][1]; - bytes_to_copy = size; - } - - pr_debug("%s:session id %d: offset=%d nr of frames= %d\n", - __func__, audio->ac->session, - audio->out_frame_info[idx][1], - audio->out_frame_info[idx][0]); - - if (copy_to_user(buf, &data[offset], bytes_to_copy)) { - rc = -EFAULT; - break; - } - count -= bytes_to_copy; - buf += bytes_to_copy; - } else { - pr_err("%s:session id %d: short read data[%pK] bytesavail[%d]bytesrequest[%zd]\n", - __func__, - audio->ac->session, - data, size, count); - } - atomic_dec(&audio->out_count); - q6asm_read(audio->ac); - break; - } - mutex_unlock(&audio->read_lock); - - pr_debug("%s:session id %d: read: %zd bytes\n", __func__, - audio->ac->session, (buf-start)); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int extract_meta_info(char *buf, unsigned long *msw_ts, - unsigned long *lsw_ts, unsigned int *flags) -{ - struct meta_in *meta = (struct meta_in *)buf; - *msw_ts = meta->ntimestamp.highpart; - *lsw_ts = meta->ntimestamp.lowpart; - *flags = meta->nflags; - return 0; -} - -ssize_t audio_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct q6audio_in *audio = file->private_data; - const char __user *start = buf; - size_t xfer = 0; - char *cpy_ptr; - int rc = 0; - unsigned char *data; - uint32_t size = 0; - uint32_t idx = 0; - uint32_t nflags = 0; - unsigned long msw_ts = 0; - unsigned long lsw_ts = 0; - uint32_t mfield_size = (audio->buf_cfg.meta_info_enable == 0) ? 0 : - sizeof(struct meta_in); - - pr_debug("%s:session id %d: to write[%zd]\n", __func__, - audio->ac->session, count); - if (audio->reset_event) - return -ENETRESET; - - if (!audio->enabled) - return -EFAULT; - mutex_lock(&audio->write_lock); - - while (count > 0) { - rc = wait_event_interruptible(audio->write_wait, - ((atomic_read(&audio->in_count) > 0) || - (audio->stopped) || - (audio->wflush) || (audio->event_abort))); - - if (audio->event_abort) { - rc = -EIO; - break; - } - - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - pr_debug("%s: session id %d: stop or flush\n", __func__, - audio->ac->session); - rc = -EBUSY; - break; - } - /* if no PCM data, might have only eos buffer - * such case do not hold cpu buffer - */ - if ((buf == start) && (count == mfield_size)) { - char eos_buf[sizeof(struct meta_in)]; - /* Processing beginning of user buffer */ - if (copy_from_user(eos_buf, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - extract_meta_info(eos_buf, &msw_ts, &lsw_ts, - &nflags); - buf += mfield_size; - /* send the EOS and return */ - pr_debug("%s:session id %d: send EOS 0x%8x\n", - __func__, - audio->ac->session, nflags); - break; - } - data = (unsigned char *)q6asm_is_cpu_buf_avail(IN, audio->ac, - &size, &idx); - if (!data) { - pr_debug("%s:session id %d: No buf available\n", - __func__, audio->ac->session); - continue; - } - cpy_ptr = data; - if (audio->buf_cfg.meta_info_enable) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - extract_meta_info(cpy_ptr, &msw_ts, &lsw_ts, - &nflags); - buf += mfield_size; - count -= mfield_size; - } else { - pr_debug("%s:session id %d: continuous buffer\n", - __func__, audio->ac->session); - } - } - - xfer = (count > size) ? size : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - rc = q6asm_write(audio->ac, xfer, msw_ts, lsw_ts, 0x00); - if (rc < 0) { - rc = -EFAULT; - break; - } - atomic_dec(&audio->in_count); - count -= xfer; - buf += xfer; - } - mutex_unlock(&audio->write_lock); - pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%pK] start[0x%pK]\n", - __func__, audio->ac->session, - nflags, buf, start); - if (nflags & AUD_EOS_SET) { - rc = q6asm_cmd(audio->ac, CMD_EOS); - pr_info("%s:session id %d: eos %d at input\n", __func__, - audio->ac->session, audio->eos_rsp); - } - pr_debug("%s:session id %d: Written %zd Avail Buf[%d]", __func__, - audio->ac->session, (buf - start - mfield_size), - atomic_read(&audio->in_count)); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -int audio_in_release(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = file->private_data; - - pr_info("%s: session id %d\n", __func__, audio->ac->session); - mutex_lock(&audio->lock); - audio_in_disable(audio); - q6asm_audio_client_free(audio->ac); - mutex_unlock(&audio->lock); - spin_lock(&enc_dec_lock); - kfree(audio->enc_cfg); - kfree(audio->codec_cfg); - kfree(audio); - file->private_data = NULL; - spin_unlock(&enc_dec_lock); - return 0; -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_utils.h b/techpack/audio/4.0/dsp/codecs/audio_utils.h deleted file mode 100644 index 5116a464f833..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_utils.h +++ /dev/null @@ -1,149 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2010-2015, 2017 The Linux Foundation. All rights reserved. - */ -#include -#include -#include "q6audio_common.h" - -#define FRAME_NUM (8) - -#define PCM_BUF_COUNT (2) - -#define AUD_EOS_SET 0x01 -#define TUNNEL_MODE 0x0000 -#define NON_TUNNEL_MODE 0x0001 - -#define NO_BUF_ALLOC 0x00 -#define BUF_ALLOC_IN 0x01 -#define BUF_ALLOC_OUT 0x02 -#define BUF_ALLOC_INOUT 0x03 -#define ALIGN_BUF_SIZE(size) ((size + 4095) & (~4095)) - -struct timestamp { - u32 lowpart; - u32 highpart; -} __packed; - -struct meta_in { - unsigned short offset; - struct timestamp ntimestamp; - unsigned int nflags; -} __packed; - -struct meta_out_dsp { - u32 offset_to_frame; - u32 frame_size; - u32 encoded_pcm_samples; - u32 msw_ts; - u32 lsw_ts; - u32 nflags; -} __packed; - -struct meta_out { - unsigned char num_of_frames; - struct meta_out_dsp meta_out_dsp[]; -} __packed; - -struct q6audio_in { - spinlock_t dsp_lock; - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - struct mutex write_lock; - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - - struct audio_client *ac; - struct msm_audio_stream_config str_cfg; - void *enc_cfg; - struct msm_audio_buf_cfg buf_cfg; - struct msm_audio_config pcm_cfg; - void *codec_cfg; - - /* number of buffers available to read/write */ - atomic_t in_count; - atomic_t out_count; - - /* first idx: num of frames per buf, second idx: offset to frame */ - uint32_t out_frame_info[FRAME_NUM][2]; - int eos_rsp; - int opened; - int enabled; - int stopped; - int event_abort; - int feedback; /* Flag indicates whether used - * in Non Tunnel mode - */ - int rflush; - int wflush; - int buf_alloc; - uint16_t min_frame_size; - uint16_t max_frames_per_buf; - bool reset_event; - long (*enc_ioctl)(struct file *, unsigned int, unsigned long); - long (*enc_compat_ioctl)(struct file *, unsigned int, unsigned long); -}; - -int audio_in_enable(struct q6audio_in *audio); -int audio_in_disable(struct q6audio_in *audio); -int audio_in_buf_alloc(struct q6audio_in *audio); -long audio_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg); -#ifdef CONFIG_COMPAT -long audio_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg); -#else -#define audio_in_compat_ioctl NULL -#endif -ssize_t audio_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos); -ssize_t audio_in_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos); -int audio_in_release(struct inode *inode, struct file *file); -int audio_in_set_config(struct file *file, struct msm_audio_config *cfg); -int aac_in_init(void); -int amrnb_in_init(void); -int amrwb_in_init(void); -int audio_aac_init(void); -int audio_alac_init(void); -int audio_amrnb_init(void); -int audio_amrwb_init(void); -int audio_amrwbplus_init(void); -int audio_ape_init(void); -int audio_evrc_init(void); -int audio_g711alaw_init(void); -int audio_g711mlaw_init(void); -int audio_effects_init(void); -int audio_mp3_init(void); -int audio_multiaac_init(void); -int audio_qcelp_init(void); -int audio_wma_init(void); -int audio_wmapro_init(void); -int evrc_in_init(void); -int g711alaw_in_init(void); -int g711mlaw_in_init(void); -int qcelp_in_init(void); -void aac_in_exit(void); -void amrnb_in_exit(void); -void amrwb_in_exit(void); -void audio_aac_exit(void); -void audio_alac_exit(void); -void audio_amrnb_exit(void); -void audio_amrwb_exit(void); -void audio_amrwbplus_exit(void); -void audio_ape_exit(void); -void audio_evrc_exit(void); -void audio_g711alaw_exit(void); -void audio_g711mlaw_exit(void); -void audio_effects_exit(void); -void audio_mp3_exit(void); -void audio_multiaac_exit(void); -void audio_qcelp_exit(void); -void audio_wma_exit(void); -void audio_wmapro_exit(void); -void evrc_in_exit(void); -void g711alaw_in_exit(void); -void g711mlaw_in_exit(void); -void qcelp_in_exit(void); diff --git a/techpack/audio/4.0/dsp/codecs/audio_utils_aio.c b/techpack/audio/4.0/dsp/codecs/audio_utils_aio.c deleted file mode 100644 index 67fdc06fdedf..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_utils_aio.c +++ /dev/null @@ -1,2152 +0,0 @@ -/* Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2020, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils_aio.h" -#ifdef CONFIG_USE_DEV_CTRL_VOLUME -#include -#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/ -static DEFINE_MUTEX(lock); -#ifdef CONFIG_DEBUG_FS - -int audio_aio_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -ssize_t audio_aio_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0; - struct q6audio_aio *audio; - - mutex_lock(&lock); - if (file->private_data != NULL) { - audio = file->private_data; - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", - audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "feedback %d\n", audio->feedback); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "inqueue empty %d\n", - list_empty(&audio->in_queue)); - n += scnprintf(buffer + n, debug_bufmax - n, - "outqueue empty %d\n", - list_empty(&audio->out_queue)); - } - mutex_unlock(&lock); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} -#endif - -static long audio_aio_ioctl(struct file *file, unsigned int cmd, - unsigned long arg); -#ifdef CONFIG_COMPAT -static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg); -#else -#define audio_aio_compat_ioctl NULL -#endif -int insert_eos_buf(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - struct dec_meta_out *eos_buf = buf_node->kvaddr; - - pr_debug("%s[%pK]:insert_eos_buf\n", __func__, audio); - eos_buf->num_of_frames = 0xFFFFFFFF; - eos_buf->meta_out_dsp[0].offset_to_frame = 0x0; - eos_buf->meta_out_dsp[0].nflags = AUDIO_DEC_EOS_SET; - return sizeof(struct dec_meta_out) + - sizeof(eos_buf->meta_out_dsp[0]); -} - -/* Routine which updates read buffers of driver/dsp, - * for flush operation as DSP output might not have proper - * value set - */ -static int insert_meta_data_flush(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - struct dec_meta_out *meta_data = buf_node->kvaddr; - - meta_data->num_of_frames = 0x0; - meta_data->meta_out_dsp[0].offset_to_frame = 0x0; - meta_data->meta_out_dsp[0].nflags = 0x0; - return sizeof(struct dec_meta_out) + - sizeof(meta_data->meta_out_dsp[0]); -} - -static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr, - unsigned long len, - struct audio_aio_ion_region **region) -{ - struct audio_aio_ion_region *region_elt; - - int match_count = 0; - - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len && - addr + len > addr) { - /* to avoid integer addition overflow */ - - /* offset since we could pass vaddr inside a registered - * ion buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - pr_err("%s[%pK]:multiple hits for vaddr %pK, len %ld\n", - __func__, audio, addr, len); - list_for_each_entry(region_elt, &audio->ion_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len && - addr + len > addr) - pr_err("\t%s[%pK]:%pK, %ld --> %pK\n", - __func__, audio, - region_elt->vaddr, - region_elt->len, - ®ion_elt->paddr); - } - } - - return *region ? 0 : -1; -} - -static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr, - unsigned long len, int ref_up, void **kvaddr) -{ - struct audio_aio_ion_region *region; - phys_addr_t paddr; - int ret; - - ret = audio_aio_ion_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - pr_err("%s[%pK]:lookup (%pK, %ld) failed\n", - __func__, audio, addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - pr_debug("%s[%pK]:found region %pK ref_cnt %d\n", - __func__, audio, region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - /* provide kernel virtual address for accessing meta information */ - if (kvaddr) - *kvaddr = (void *) (region->kvaddr + (addr - region->vaddr)); - return paddr; -} - -static int audio_aio_pause(struct q6audio_aio *audio) -{ - int rc = -EINVAL; - - pr_debug("%s[%pK], enabled = %d\n", __func__, audio, - audio->enabled); - if (audio->enabled) { - rc = q6asm_cmd(audio->ac, CMD_PAUSE); - if (rc < 0) - pr_err_ratelimited("%s[%pK]: pause cmd failed rc=%d\n", - __func__, audio, rc); - - if (rc == 0) { - /* Send suspend only if pause was successful */ - rc = q6asm_cmd(audio->ac, CMD_SUSPEND); - if (rc < 0) - pr_err_ratelimited("%s[%pK]: suspend cmd failed rc=%d\n", - __func__, audio, rc); - } else - pr_err_ratelimited("%s[%pK]: not sending suspend since pause failed\n", - __func__, audio); - - } else - pr_err("%s[%pK]: Driver not enabled\n", __func__, audio); - return rc; -} - -static int audio_aio_flush(struct q6audio_aio *audio) -{ - int rc = 0; - - if (audio->enabled) { - /* Implicitly issue a pause to the decoder before flushing if - * it is not in pause state - */ - if (!(audio->drv_status & ADRV_STATUS_PAUSE)) { - rc = audio_aio_pause(audio); - if (rc < 0) - pr_err_ratelimited("%s[%pK}: pause cmd failed rc=%d\n", - __func__, audio, - rc); - else - audio->drv_status |= ADRV_STATUS_PAUSE; - } - rc = q6asm_cmd(audio->ac, CMD_FLUSH); - if (rc < 0) - pr_err_ratelimited("%s[%pK]: flush cmd failed rc=%d\n", - __func__, audio, rc); - /* Not in stop state, reenable the stream */ - if (audio->stopped == 0) { - rc = audio_aio_enable(audio); - if (rc) - pr_err_ratelimited("%s[%pK]:audio re-enable failed\n", - __func__, audio); - else { - audio->enabled = 1; - if (audio->drv_status & ADRV_STATUS_PAUSE) - audio->drv_status &= ~ADRV_STATUS_PAUSE; - } - } - } - pr_debug("%s[%pK]:in_bytes %d\n", - __func__, audio, atomic_read(&audio->in_bytes)); - pr_debug("%s[%pK]:in_samples %d\n", - __func__, audio, atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); - return rc; -} - -static int audio_aio_outport_flush(struct q6audio_aio *audio) -{ - int rc; - - rc = q6asm_cmd(audio->ac, CMD_OUT_FLUSH); - if (rc < 0) - pr_err_ratelimited("%s[%pK}: output port flush cmd failed rc=%d\n", - __func__, audio, rc); - return rc; -} - -/* Write buffer to DSP / Handle Ack from DSP */ -void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audio_aio_buffer_node *used_buf; - - /* No active flush in progress */ - if (audio->wflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (list_empty(&audio->out_queue)) { - pr_warn("%s: ignore unexpected event from dsp\n", __func__); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return; - } - used_buf = list_first_entry(&audio->out_queue, - struct audio_aio_buffer_node, list); - if (token == used_buf->token) { - list_del(&used_buf->list); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - pr_debug("%s[%pK]:consumed buffer\n", __func__, audio); - event_payload.aio_buf = used_buf->buf; - audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, - event_payload); - kfree(used_buf); - if (list_empty(&audio->out_queue) && - (audio->drv_status & ADRV_STATUS_FSYNC)) { - pr_debug("%s[%pK]: list is empty, reached EOS in Tunnel\n", - __func__, audio); - wake_up(&audio->write_wait); - } - } else { - pr_err("%s[%pK]:expected=%x ret=%x\n", - __func__, audio, used_buf->token, token); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } -} - -/* ------------------- device --------------------- */ -void audio_aio_async_out_flush(struct q6audio_aio *audio) -{ - struct audio_aio_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - unsigned long flags; - - pr_debug("%s[%pK}\n", __func__, audio); - /* EOS followed by flush, EOS response not guranteed, free EOS i/p - * buffer - */ - spin_lock_irqsave(&audio->dsp_lock, flags); - - if (audio->eos_flag && (audio->eos_write_payload.aio_buf.buf_addr)) { - pr_debug("%s[%pK]: EOS followed by flush received,acknowledge eos i/p buffer immediately\n", - __func__, audio); - audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, - audio->eos_write_payload); - memset(&audio->eos_write_payload, 0, - sizeof(union msm_audio_event_payload)); - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audio_aio_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, payload); - kfree(buf_node); - pr_debug("%s[%pK]: Propagate WRITE_DONE during flush\n", - __func__, audio); - } -} - -void audio_aio_async_in_flush(struct q6audio_aio *audio) -{ - struct audio_aio_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - pr_debug("%s[%pK]\n", __func__, audio); - list_for_each_safe(ptr, next, &audio->in_queue) { - buf_node = list_entry(ptr, struct audio_aio_buffer_node, list); - list_del(&buf_node->list); - /* Forcefull send o/p eos buffer after flush, if no eos response - * received by dsp even after sending eos command - */ - if ((audio->eos_rsp != 1) && audio->eos_flag) { - pr_debug("%s[%pK]: send eos on o/p buffer during flush\n", - __func__, audio); - payload.aio_buf = buf_node->buf; - payload.aio_buf.data_len = - insert_eos_buf(audio, buf_node); - audio->eos_flag = 0; - } else { - payload.aio_buf = buf_node->buf; - payload.aio_buf.data_len = - insert_meta_data_flush(audio, buf_node); - } - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, payload); - kfree(buf_node); - pr_debug("%s[%pK]: Propagate READ_DONE during flush\n", - __func__, audio); - } -} - -int audio_aio_enable(struct q6audio_aio *audio) -{ - /* 2nd arg: 0 -> run immediately - * 3rd arg: 0 -> msw_ts, - * 4th arg: 0 ->lsw_ts - */ - return q6asm_run(audio->ac, 0x00, 0x00, 0x00); -} - -int audio_aio_disable(struct q6audio_aio *audio) -{ - int rc = 0; - - if (audio->opened) { - audio->enabled = 0; - audio->opened = 0; - pr_debug("%s[%pK]: inbytes[%d] insamples[%d]\n", __func__, - audio, atomic_read(&audio->in_bytes), - atomic_read(&audio->in_samples)); - /* Close the session */ - rc = q6asm_cmd(audio->ac, CMD_CLOSE); - if (rc < 0) - pr_err_ratelimited("%s[%pK]:Failed to close the session rc=%d\n", - __func__, audio, rc); - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->cmd_wait); - } - pr_debug("%s[%pK]:enabled[%d]\n", __func__, audio, audio->enabled); - return rc; -} - -void audio_aio_reset_ion_region(struct q6audio_aio *audio) -{ - struct audio_aio_ion_region *region; - struct list_head *ptr, *next; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audio_aio_ion_region, list); - list_del(®ion->list); - msm_audio_ion_free(region->dma_buf); - kfree(region); - } -} - -void audio_aio_reset_event_queue(struct q6audio_aio *audio) -{ - unsigned long flags; - struct audio_aio_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audio_aio_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audio_aio_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); -} - -static void audio_aio_unmap_ion_region(struct q6audio_aio *audio) -{ - struct audio_aio_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - pr_debug("%s[%pK]:\n", __func__, audio); - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audio_aio_ion_region, list); - if (region != NULL) { - pr_debug("%s[%pK]: phy_address = 0x%pK\n", - __func__, audio, ®ion->paddr); - rc = q6asm_memory_unmap(audio->ac, - region->paddr, IN); - if (rc < 0) - pr_err("%s[%pK]: memory unmap failed\n", - __func__, audio); - } - } -} - -#ifdef CONFIG_USE_DEV_CTRL_VOLUME - -static void audio_aio_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct q6audio_aio *audio = (struct q6audio_aio *) private_data; - int rc = 0; - - switch (evt_id) { - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->volume = evt_payload->session_vol; - pr_debug("%s[%pK]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n", - __func__, audio, audio->volume, audio->enabled); - if (audio->enabled == 1) { - if (audio->ac) { - rc = q6asm_set_volume(audio->ac, audio->volume); - if (rc < 0) { - pr_err("%s[%pK]: Send Volume command failed rc=%d\n", - __func__, audio, rc); - } - } - } - break; - default: - pr_err("%s[%pK]:ERROR:wrong event\n", __func__, audio); - break; - } -} - -int register_volume_listener(struct q6audio_aio *audio) -{ - int rc = 0; - - audio->device_events = AUDDEV_EVT_STREAM_VOL_CHG; - audio->drv_status &= ~ADRV_STATUS_PAUSE; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->ac->session, - audio_aio_listner, - (void *)audio); - if (rc < 0) { - pr_err("%s[%pK]: Event listener failed\n", __func__, audio); - rc = -EACCES; - } - return rc; -} -void unregister_volume_listener(struct q6audio_aio *audio) -{ - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->ac->session); -} - -int enable_volume_ramp(struct q6audio_aio *audio) -{ - int rc = 0; - struct asm_softpause_params softpause; - struct asm_softvolume_params softvol; - - if (audio->ac == NULL) - return -EINVAL; - pr_debug("%s[%pK]\n", __func__, audio); - softpause.enable = SOFT_PAUSE_ENABLE; - softpause.period = SOFT_PAUSE_PERIOD; - softpause.step = SOFT_PAUSE_STEP; - softpause.rampingcurve = SOFT_PAUSE_CURVE_LINEAR; - - softvol.period = SOFT_VOLUME_PERIOD; - softvol.step = SOFT_VOLUME_STEP; - softvol.rampingcurve = SOFT_VOLUME_CURVE_LINEAR; - - if (softpause.rampingcurve == SOFT_PAUSE_CURVE_LINEAR) - softpause.step = SOFT_PAUSE_STEP_LINEAR; - if (softvol.rampingcurve == SOFT_VOLUME_CURVE_LINEAR) - softvol.step = SOFT_VOLUME_STEP_LINEAR; - rc = q6asm_set_volume(audio->ac, audio->volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - return rc; - } - rc = q6asm_set_softpause(audio->ac, &softpause); - if (rc < 0) { - pr_err("%s: Send SoftPause Param failed rc=%d\n", - __func__, rc); - return rc; - } - rc = q6asm_set_softvolume(audio->ac, &softvol); - if (rc < 0) { - pr_err("%s: Send SoftVolume Param failed rc=%d\n", - __func__, rc); - return rc; - } - /* disable mute by default */ - rc = q6asm_set_mute(audio->ac, 0); - if (rc < 0) { - pr_err("%s: Send mute command failed rc=%d\n", - __func__, rc); - return rc; - } - return rc; -} - -#else /*CONFIG_USE_DEV_CTRL_VOLUME*/ -int register_volume_listener(struct q6audio_aio *audio) -{ - return 0;/* do nothing */ -} -void unregister_volume_listener(struct q6audio_aio *audio) -{ - return;/* do nothing */ -} -int enable_volume_ramp(struct q6audio_aio *audio) -{ - return 0; /* do nothing */ -} -#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/ - -int audio_aio_release(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = file->private_data; - - pr_debug("%s[%pK]\n", __func__, audio); - mutex_lock(&lock); - mutex_lock(&audio->lock); - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - audio->wflush = 1; - if (audio->wakelock_voted && - (audio->audio_ws_mgr != NULL) && - (audio->miscdevice != NULL)) { - audio->wakelock_voted = false; - mutex_lock(&audio->audio_ws_mgr->ws_lock); - if ((audio->audio_ws_mgr->ref_cnt > 0) && - (--audio->audio_ws_mgr->ref_cnt == 0)) { - pm_relax(audio->miscdevice->this_device); - } - mutex_unlock(&audio->audio_ws_mgr->ws_lock); - } - if (audio->enabled) - audio_aio_flush(audio); - audio->wflush = 0; - audio->drv_ops.out_flush(audio); - audio->drv_ops.in_flush(audio); - audio_aio_disable(audio); - audio_aio_unmap_ion_region(audio); - audio_aio_reset_ion_region(audio); - audio->event_abort = 1; - wake_up(&audio->event_wait); - audio_aio_reset_event_queue(audio); - q6asm_audio_client_free(audio->ac); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - mutex_unlock(&audio->lock); - mutex_destroy(&audio->lock); - mutex_destroy(&audio->read_lock); - mutex_destroy(&audio->write_lock); - mutex_destroy(&audio->get_event_lock); - unregister_volume_listener(audio); - -#ifdef CONFIG_DEBUG_FS - debugfs_remove(audio->dentry); -#endif - spin_lock(&enc_dec_lock); - kfree(audio->codec_cfg); - kfree(audio); - file->private_data = NULL; - spin_unlock(&enc_dec_lock); - mutex_unlock(&lock); - return 0; -} - -int audio_aio_fsync(struct file *file, loff_t start, loff_t end, int datasync) -{ - int rc = 0; - struct q6audio_aio *audio = file->private_data; - - if (!audio->enabled || audio->feedback) - return -EINVAL; - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - pr_debug("%s[%pK]:\n", __func__, audio); - - audio->eos_rsp = 0; - - pr_debug("%s[%pK]Wait for write done from DSP\n", __func__, audio); - rc = wait_event_interruptible(audio->write_wait, - (list_empty(&audio->out_queue)) || - audio->wflush || audio->stopped); - - if (audio->stopped || audio->wflush) { - pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" - , __func__, audio); - audio->wflush = 0; - rc = -EBUSY; - } - - if (rc < 0) { - pr_err("%s[%pK]: wait event for list_empty failed, rc = %d\n", - __func__, audio, rc); - goto done; - } - - rc = q6asm_cmd(audio->ac, CMD_EOS); - pr_debug("%s[%pK]: EOS cmd sent to DSP\n", __func__, audio); - - if (rc < 0) - pr_err_ratelimited("%s[%pK]: q6asm_cmd failed, rc = %d", - __func__, audio, rc); - - pr_debug("%s[%pK]: wait for RENDERED_EOS from DSP\n" - , __func__, audio); - rc = wait_event_interruptible(audio->write_wait, - (audio->eos_rsp || audio->wflush || - audio->stopped)); - - if (rc < 0) { - pr_err("%s[%pK]: wait event for eos_rsp failed, rc = %d\n", - __func__, audio, rc); - goto done; - } - - if (audio->stopped || audio->wflush) { - audio->wflush = 0; - pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" - , __func__, audio); - rc = -EBUSY; - } - - if (audio->eos_rsp == 1) - pr_debug("%s[%pK]: EOS\n", __func__, audio); - - -done: - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -static int audio_aio_events_pending(struct q6audio_aio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort || audio->reset_event; -} - -static long audio_aio_process_event_req_common(struct q6audio_aio *audio, - struct msm_audio_event *usr_evt) -{ - long rc; - struct audio_aio_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - timeout = usr_evt->timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout(audio->event_wait, - audio_aio_events_pending - (audio), - msecs_to_jiffies - (timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible(audio->event_wait, - audio_aio_events_pending(audio)); - } - if (rc < 0) - return rc; - - if (audio->reset_event) { - audio->reset_event = false; - pr_err("In SSR, post ENETRESET err\n"); - return -ENETRESET; - } - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audio_aio_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt->event_type = drv_evt->event_type; - usr_evt->event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else { - pr_err("%s[%pK]:Unexpected path\n", __func__, audio); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return -EPERM; - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) { - pr_debug("%s[%pK]:posted AUDIO_EVENT_WRITE_DONE to user\n", - __func__, audio); - mutex_lock(&audio->write_lock); - audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0, 0); - mutex_unlock(&audio->write_lock); - } else if (drv_evt->event_type == AUDIO_EVENT_READ_DONE) { - pr_debug("%s[%pK]:posted AUDIO_EVENT_READ_DONE to user\n", - __func__, audio); - mutex_lock(&audio->read_lock); - audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0, 0); - mutex_unlock(&audio->read_lock); - } - - /* Some read buffer might be held up in DSP,release all - * Once EOS indicated - */ - if (audio->eos_rsp && !list_empty(&audio->in_queue)) { - pr_debug("%s[%pK]:Send flush command to release read buffers held up in DSP\n", - __func__, audio); - mutex_lock(&audio->lock); - audio_aio_flush(audio); - mutex_unlock(&audio->lock); - } - - return rc; -} - -static long audio_aio_process_event_req(struct q6audio_aio *audio, - void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) { - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - - rc = audio_aio_process_event_req_common(audio, &usr_evt); - - if (copy_to_user(arg, &usr_evt, sizeof(usr_evt))) { - pr_err("%s: copy_to_user failed\n", __func__); - rc = -EFAULT; - } - return rc; -} - -#ifdef CONFIG_COMPAT - -struct msm_audio_aio_buf32 { - compat_uptr_t buf_addr; - u32 buf_len; - u32 data_len; - compat_uptr_t private_data; - u16 mfield_sz; /*only useful for data has meta field */ -}; - -struct msm_audio_bitstream_info32 { - u32 codec_type; - u32 chan_info; - u32 sample_rate; - u32 bit_stream_info; - u32 bit_rate; - u32 unused[3]; -}; - -struct msm_audio_bitstream_error_info32 { - u32 dec_id; - u32 err_msg_indicator; - u32 err_type; -}; - -union msm_audio_event_payload32 { - struct msm_audio_aio_buf32 aio_buf; - struct msm_audio_bitstream_info32 stream_info; - struct msm_audio_bitstream_error_info32 error_info; - s32 reserved; -}; - -struct msm_audio_event32 { - s32 event_type; - s32 timeout_ms; - union msm_audio_event_payload32 event_payload; -}; - -static long audio_aio_process_event_req_compat(struct q6audio_aio *audio, - void __user *arg) -{ - long rc; - struct msm_audio_event32 usr_evt_32; - struct msm_audio_event usr_evt; - memset(&usr_evt, 0, sizeof(struct msm_audio_event)); - - if (copy_from_user(&usr_evt_32, arg, - sizeof(struct msm_audio_event32))) { - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - usr_evt.timeout_ms = usr_evt_32.timeout_ms; - - rc = audio_aio_process_event_req_common(audio, &usr_evt); - if (rc < 0) { - pr_err("%s: audio process event failed, rc = %ld", - __func__, rc); - return rc; - } - - usr_evt_32.event_type = usr_evt.event_type; - switch (usr_evt_32.event_type) { - case AUDIO_EVENT_SUSPEND: - case AUDIO_EVENT_RESUME: - case AUDIO_EVENT_WRITE_DONE: - case AUDIO_EVENT_READ_DONE: - usr_evt_32.event_payload.aio_buf.buf_addr = - ptr_to_compat(usr_evt.event_payload.aio_buf.buf_addr); - usr_evt_32.event_payload.aio_buf.buf_len = - usr_evt.event_payload.aio_buf.buf_len; - usr_evt_32.event_payload.aio_buf.data_len = - usr_evt.event_payload.aio_buf.data_len; - usr_evt_32.event_payload.aio_buf.private_data = - ptr_to_compat(usr_evt.event_payload.aio_buf.private_data); - usr_evt_32.event_payload.aio_buf.mfield_sz = - usr_evt.event_payload.aio_buf.mfield_sz; - break; - case AUDIO_EVENT_STREAM_INFO: - usr_evt_32.event_payload.stream_info.codec_type = - usr_evt.event_payload.stream_info.codec_type; - usr_evt_32.event_payload.stream_info.chan_info = - usr_evt.event_payload.stream_info.chan_info; - usr_evt_32.event_payload.stream_info.sample_rate = - usr_evt.event_payload.stream_info.sample_rate; - usr_evt_32.event_payload.stream_info.bit_stream_info = - usr_evt.event_payload.stream_info.bit_stream_info; - usr_evt_32.event_payload.stream_info.bit_rate = - usr_evt.event_payload.stream_info.bit_rate; - break; - case AUDIO_EVENT_BITSTREAM_ERROR_INFO: - usr_evt_32.event_payload.error_info.dec_id = - usr_evt.event_payload.error_info.dec_id; - usr_evt_32.event_payload.error_info.err_msg_indicator = - usr_evt.event_payload.error_info.err_msg_indicator; - usr_evt_32.event_payload.error_info.err_type = - usr_evt.event_payload.error_info.err_type; - break; - default: - pr_debug("%s: unknown audio event type = %d rc = %ld", - __func__, usr_evt_32.event_type, rc); - return rc; - } - if (copy_to_user(arg, &usr_evt_32, sizeof(usr_evt_32))) { - pr_err("%s: copy_to_user failed\n", __func__); - rc = -EFAULT; - } - return rc; -} -#endif - -static int audio_aio_ion_check(struct q6audio_aio *audio, - void *vaddr, unsigned long len) -{ - struct audio_aio_ion_region *region_elt; - struct audio_aio_ion_region t = {.vaddr = vaddr, .len = len }; - - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || - OVERLAPS(region_elt, &t)) { - pr_err("%s[%pK]:region (vaddr %pK len %ld) clashes with registered region (vaddr %pK paddr %pK len %ld)\n", - __func__, audio, vaddr, len, - region_elt->vaddr, - ®ion_elt->paddr, region_elt->len); - return -EINVAL; - } - } - - return 0; -} - -static int audio_aio_ion_add(struct q6audio_aio *audio, - struct msm_audio_ion_info *info) -{ - dma_addr_t paddr = 0; - size_t len = 0; - struct audio_aio_ion_region *region; - int rc = -EINVAL; - struct dma_buf *dma_buf = NULL; - unsigned long ionflag; - void *kvaddr = NULL; - - pr_debug("%s[%pK]:\n", __func__, audio); - region = kmalloc(sizeof(*region), GFP_KERNEL); - - if (!region) { - rc = -ENOMEM; - goto end; - } - - rc = msm_audio_ion_import(&dma_buf, info->fd, &ionflag, - 0, &paddr, &len, &kvaddr); - if (rc) { - pr_err("%s: msm audio ion alloc failed\n", __func__); - goto import_error; - } - - rc = audio_aio_ion_check(audio, info->vaddr, len); - if (rc < 0) { - pr_err("%s: audio_aio_ion_check failed\n", __func__); - goto ion_error; - } - - region->dma_buf = dma_buf; - region->vaddr = info->vaddr; - region->fd = info->fd; - region->paddr = paddr; - region->kvaddr = kvaddr; - region->len = len; - region->ref_cnt = 0; - pr_debug("%s[%pK]:add region paddr %pK vaddr %pK, len %lu kvaddr %pK\n", - __func__, audio, - ®ion->paddr, region->vaddr, region->len, - region->kvaddr); - list_add_tail(®ion->list, &audio->ion_region_queue); - rc = q6asm_memory_map(audio->ac, paddr, IN, len, 1); - if (rc < 0) { - pr_err("%s[%pK]: memory map failed\n", __func__, audio); - goto mmap_error; - } else { - goto end; - } -mmap_error: - list_del(®ion->list); -ion_error: - msm_audio_ion_free(dma_buf); -import_error: - kfree(region); -end: - return rc; -} - -static int audio_aio_ion_remove(struct q6audio_aio *audio, - struct msm_audio_ion_info *info) -{ - struct audio_aio_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - pr_debug("%s[%pK]:info fd %d vaddr %pK\n", - __func__, audio, info->fd, info->vaddr); - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audio_aio_ion_region, list); - - if ((region->fd == info->fd) && - (region->vaddr == info->vaddr)) { - if (region->ref_cnt) { - pr_debug("%s[%pK]:region %pK in use ref_cnt %d\n", - __func__, audio, region, - region->ref_cnt); - break; - } - pr_debug("%s[%pK]:remove region fd %d vaddr %pK\n", - __func__, audio, info->fd, info->vaddr); - rc = q6asm_memory_unmap(audio->ac, - region->paddr, IN); - if (rc < 0) - pr_err("%s[%pK]: memory unmap failed\n", - __func__, audio); - - list_del(®ion->list); - msm_audio_ion_free(region->dma_buf); - kfree(region); - rc = 0; - break; - } - } - - return rc; -} - -static int audio_aio_async_write(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - int rc; - struct audio_client *ac; - struct audio_aio_write_param param; - - memset(¶m, 0, sizeof(param)); - - if (!audio || !buf_node) { - pr_err("%s NULL pointer audio=[0x%pK], buf_node=[0x%pK]\n", - __func__, audio, buf_node); - return -EINVAL; - } - pr_debug("%s[%pK]: Send write buff %pK phy %pK len %d meta_enable = %d\n", - __func__, audio, buf_node, &buf_node->paddr, - buf_node->buf.data_len, - audio->buf_cfg.meta_info_enable); - pr_debug("%s[%pK]: flags = 0x%x\n", __func__, audio, - buf_node->meta_info.meta_in.nflags); - - ac = audio->ac; - /* Offset with appropriate meta */ - if (audio->feedback) { - /* Non Tunnel mode */ - param.paddr = buf_node->paddr + sizeof(struct dec_meta_in); - param.len = buf_node->buf.data_len - sizeof(struct dec_meta_in); - } else { - /* Tunnel mode */ - param.paddr = buf_node->paddr; - param.len = buf_node->buf.data_len; - } - param.msw_ts = buf_node->meta_info.meta_in.ntimestamp.highpart; - param.lsw_ts = buf_node->meta_info.meta_in.ntimestamp.lowpart; - param.flags = buf_node->meta_info.meta_in.nflags; - /* If no meta_info enaled, indicate no time stamp valid */ - if (!audio->buf_cfg.meta_info_enable) - param.flags = 0xFF00; - - if (buf_node->meta_info.meta_in.nflags & AUDIO_DEC_EOF_SET) - param.flags |= AUDIO_DEC_EOF_SET; - - param.uid = ac->session; - /* Read command will populate session id as token */ - buf_node->token = ac->session; - rc = q6asm_async_write(ac, ¶m); - if (rc < 0) - pr_err_ratelimited("%s[%pK]:failed\n", __func__, audio); - return rc; -} - -void audio_aio_post_event(struct q6audio_aio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audio_aio_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audio_aio_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audio_aio_event), GFP_ATOMIC); - if (!e_node) { - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static int audio_aio_async_read(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - struct audio_client *ac; - struct audio_aio_read_param param; - int rc; - - pr_debug("%s[%pK]: Send read buff %pK phy %pK len %d\n", - __func__, audio, buf_node, - &buf_node->paddr, buf_node->buf.buf_len); - ac = audio->ac; - /* Provide address so driver can append nr frames information */ - param.paddr = buf_node->paddr + - sizeof(struct dec_meta_out); - param.len = buf_node->buf.buf_len - - sizeof(struct dec_meta_out); - param.uid = ac->session; - /* Write command will populate session_id as token */ - buf_node->token = ac->session; - rc = q6asm_async_read(ac, ¶m); - if (rc < 0 && rc != -ENETRESET) - pr_err_ratelimited("%s[%pK]:failed\n", __func__, audio); - return rc; -} - -static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, - struct audio_aio_buffer_node *buf_node) -{ - unsigned long flags; - int ret = 0; - - pr_debug("%s[%pK]:node %pK dir %x buf_addr %pK buf_len %d data_len %d\n", - __func__, audio, buf_node, dir, buf_node->buf.buf_addr, - buf_node->buf.buf_len, buf_node->buf.data_len); - buf_node->paddr = audio_aio_ion_fixup(audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1, - &buf_node->kvaddr); - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (!audio->feedback && !buf_node->buf.data_len)) { - kfree(buf_node); - return -EINVAL; - } - ret = extract_meta_out_info(audio, buf_node, 1); - if (ret) { - pr_debug("%s: extract meta failed with %d\n", - __func__, ret); - kfree(buf_node); - return ret; - } - /* Not a EOS buffer */ - if (!(buf_node->meta_info.meta_in.nflags & AUDIO_DEC_EOS_SET)) { - spin_lock_irqsave(&audio->dsp_lock, flags); - ret = audio_aio_async_write(audio, buf_node); - /* EOS buffer handled in driver */ - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } else if (buf_node->meta_info.meta_in.nflags - & AUDIO_DEC_EOS_SET) { - if (!audio->wflush) { - pr_debug("%s[%pK]:Send EOS cmd at i/p\n", - __func__, audio); - /* Driver will forcefully post writedone event - * once eos ack recived from DSP - */ - audio->eos_write_payload.aio_buf = - buf_node->buf; - audio->eos_flag = 1; - audio->eos_rsp = 0; - q6asm_cmd(audio->ac, CMD_EOS); - kfree(buf_node); - } else { /* Flush in progress, send back i/p - * EOS buffer as is - */ - union msm_audio_event_payload event_payload; - - event_payload.aio_buf = buf_node->buf; - audio_aio_post_event(audio, - AUDIO_EVENT_WRITE_DONE, - event_payload); - kfree(buf_node); - } - } - } else { - /* read */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.buf_len < PCM_BUFSZ_MIN)) { - kfree(buf_node); - return -EINVAL; - } - /* No EOS reached */ - if (!audio->eos_rsp) { - spin_lock_irqsave(&audio->dsp_lock, flags); - ret = audio_aio_async_read(audio, buf_node); - /* EOS buffer handled in driver */ - list_add_tail(&buf_node->list, &audio->in_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } - /* EOS reached at input side fake all upcoming read buffer to - * indicate the same - */ - else { - union msm_audio_event_payload event_payload; - - event_payload.aio_buf = buf_node->buf; - event_payload.aio_buf.data_len = - insert_eos_buf(audio, buf_node); - pr_debug("%s[%pK]: propagate READ_DONE as EOS done\n", - __func__, audio); - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(buf_node); - } - } - return ret; -} -#ifdef CONFIG_COMPAT -static int audio_aio_buf_add_compat(struct q6audio_aio *audio, u32 dir, - void __user *arg) -{ - struct audio_aio_buffer_node *buf_node; - struct msm_audio_aio_buf32 aio_buf_32; - - buf_node = kzalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&aio_buf_32, arg, sizeof(aio_buf_32))) { - kfree(buf_node); - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - - buf_node->buf.buf_addr = compat_ptr(aio_buf_32.buf_addr); - buf_node->buf.buf_len = aio_buf_32.buf_len; - buf_node->buf.data_len = aio_buf_32.data_len; - buf_node->buf.private_data = compat_ptr(aio_buf_32.private_data); - buf_node->buf.mfield_sz = aio_buf_32.mfield_sz; - - return audio_aio_buf_add_shared(audio, dir, buf_node); -} -#endif - -static int audio_aio_buf_add(struct q6audio_aio *audio, u32 dir, - void __user *arg) -{ - struct audio_aio_buffer_node *buf_node; - - buf_node = kzalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - - return audio_aio_buf_add_shared(audio, dir, buf_node); -} - -void audio_aio_ioport_reset(struct q6audio_aio *audio) -{ - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%pK]:fsync in progress\n", - __func__, audio); - audio->drv_ops.out_flush(audio); - } else - audio->drv_ops.out_flush(audio); - if (audio->feedback == NON_TUNNEL_MODE) - audio->drv_ops.in_flush(audio); - } -} - -int audio_aio_open(struct q6audio_aio *audio, struct file *file) -{ - int rc = 0; - int i; - struct audio_aio_event *e_node = NULL; - struct list_head *ptr, *next; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - audio->pcm_cfg.sample_rate = 48000; - audio->pcm_cfg.channel_count = 2; - - /* Only AIO interface */ - if (file->f_flags & O_NONBLOCK) { - pr_debug("%s[%pK]:set to aio interface\n", __func__, audio); - audio->drv_status |= ADRV_STATUS_AIO_INTF; - audio->drv_ops.out_flush = audio_aio_async_out_flush; - audio->drv_ops.in_flush = audio_aio_async_in_flush; - q6asm_set_io_mode(audio->ac, ASYNC_IO_MODE); - } else { - pr_err_ratelimited("%s[%pK]:SIO interface not supported\n", - __func__, audio); - rc = -EACCES; - goto fail; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->cmd_wait); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->event_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->in_queue); - INIT_LIST_HEAD(&audio->ion_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - - audio->drv_ops.out_flush(audio); - audio->opened = 1; - audio->reset_event = false; - file->private_data = audio; - audio->codec_ioctl = audio_aio_ioctl; - audio->codec_compat_ioctl = audio_aio_compat_ioctl; - for (i = 0; i < AUDIO_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audio_aio_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - rc = -ENOMEM; - goto cleanup; - } - } - - rc = register_volume_listener(audio); - if (rc < 0) - goto cleanup; - - return 0; -cleanup: - list_for_each_safe(ptr, next, &audio->free_event_queue) { - e_node = list_first_entry(&audio->free_event_queue, - struct audio_aio_event, list); - list_del(&e_node->list); - kfree(e_node); - } -fail: - return rc; -} - -static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_ABORT_GET_EVENT: { - audio->event_abort = 1; - wake_up(&audio->event_wait); - break; - } - case AUDIO_OUTPORT_FLUSH: { - pr_debug("%s[%pK]:AUDIO_OUTPORT_FLUSH\n", __func__, audio); - mutex_lock(&audio->read_lock); - rc = audio_aio_outport_flush(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]: AUDIO_OUTPORT_FLUSH failed\n", - __func__, audio); - rc = -EINTR; - } - mutex_unlock(&audio->read_lock); - break; - } - case AUDIO_STOP: { - pr_debug("%s[%pK]: AUDIO_STOP session_id[%d]\n", __func__, - audio, audio->ac->session); - mutex_lock(&audio->lock); - audio->stopped = 1; - rc = audio_aio_flush(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]:Audio Stop procedure failed rc=%d\n", - __func__, audio, rc); - mutex_unlock(&audio->lock); - break; - } - audio->enabled = 0; - audio->drv_status &= ~ADRV_STATUS_PAUSE; - if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", - __func__, audio); - wake_up(&audio->write_wait); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_PAUSE: { - pr_debug("%s[%pK]:AUDIO_PAUSE %ld\n", __func__, audio, arg); - mutex_lock(&audio->lock); - if (arg == 1) { - rc = audio_aio_pause(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]: pause FAILED rc=%d\n", - __func__, audio, rc); - mutex_unlock(&audio->lock); - break; - } - audio->drv_status |= ADRV_STATUS_PAUSE; - } else if (arg == 0) { - if (audio->drv_status & ADRV_STATUS_PAUSE) { - rc = audio_aio_enable(audio); - if (rc) - pr_err_ratelimited("%s[%pK]: audio enable failed\n", - __func__, audio); - else { - audio->drv_status &= ~ADRV_STATUS_PAUSE; - audio->enabled = 1; - } - } - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_FLUSH: { - pr_debug("%s[%pK]: AUDIO_FLUSH sessionid[%d]\n", __func__, - audio, audio->ac->session); - mutex_lock(&audio->lock); - audio->rflush = 1; - audio->wflush = 1; - if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", - __func__, audio); - wake_up(&audio->write_wait); - } - /* Flush DSP */ - rc = audio_aio_flush(audio); - /* Flush input / Output buffer in software*/ - audio_aio_ioport_reset(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]:AUDIO_FLUSH interrupted\n", - __func__, audio); - rc = -EINTR; - } else { - audio->rflush = 0; - if (audio->drv_status & ADRV_STATUS_FSYNC) - wake_up(&audio->write_wait); - else - audio->wflush = 0; - - } - audio->eos_flag = 0; - audio->eos_rsp = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_SESSION_ID: { - mutex_lock(&audio->lock); - if (copy_to_user((void *)arg, &audio->ac->session, - sizeof(u16))) { - pr_err_ratelimited("%s: copy_to_user for AUDIO_GET_SESSION_ID failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_PM_AWAKE: { - if ((audio->audio_ws_mgr == NULL) || - (audio->miscdevice == NULL)) { - pr_err_ratelimited("%s[%pK]: invalid ws_mgr or miscdevice", - __func__, audio); - rc = -EACCES; - break; - } - pr_debug("%s[%pK]:AUDIO_PM_AWAKE\n", __func__, audio); - mutex_lock(&audio->lock); - if (!audio->wakelock_voted) { - audio->wakelock_voted = true; - mutex_lock(&audio->audio_ws_mgr->ws_lock); - if (audio->audio_ws_mgr->ref_cnt++ == 0) - pm_stay_awake(audio->miscdevice->this_device); - mutex_unlock(&audio->audio_ws_mgr->ws_lock); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_PM_RELAX: { - if ((audio->audio_ws_mgr == NULL) || - (audio->miscdevice == NULL)) { - pr_err_ratelimited("%s[%pK]: invalid ws_mgr or miscdevice", - __func__, audio); - rc = -EACCES; - break; - } - pr_debug("%s[%pK]:AUDIO_PM_RELAX\n", __func__, audio); - mutex_lock(&audio->lock); - if (audio->wakelock_voted) { - audio->wakelock_voted = false; - mutex_lock(&audio->audio_ws_mgr->ws_lock); - if ((audio->audio_ws_mgr->ref_cnt > 0) && - (--audio->audio_ws_mgr->ref_cnt == 0)) { - pm_relax(audio->miscdevice->this_device); - } - mutex_unlock(&audio->audio_ws_mgr->ws_lock); - } - mutex_unlock(&audio->lock); - break; - } - default: - pr_err_ratelimited("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; - - -} - -static long audio_aio_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_ABORT_GET_EVENT: - case AUDIO_OUTPORT_FLUSH: - case AUDIO_STOP: - case AUDIO_PAUSE: - case AUDIO_FLUSH: - case AUDIO_GET_SESSION_ID: - case AUDIO_PM_AWAKE: - case AUDIO_PM_RELAX: - rc = audio_aio_shared_ioctl(file, cmd, arg); - break; - case AUDIO_GET_STATS: { - struct msm_audio_stats stats; - uint64_t timestamp; - - memset(&stats, 0, sizeof(struct msm_audio_stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - rc = q6asm_get_session_time(audio->ac, ×tamp); - if (rc >= 0) - memcpy(&stats.unused[0], ×tamp, sizeof(timestamp)); - else - pr_debug("Error while getting timestamp\n"); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) { - pr_err("%s: copy_frm_user for AUDIO_GET_STATS failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_GET_EVENT: { - pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audio_aio_process_event_req(audio, - (void __user *)arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - break; - } - case AUDIO_ASYNC_WRITE: { - mutex_lock(&audio->write_lock); - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else { - if (audio->enabled) - rc = audio_aio_buf_add(audio, 1, - (void __user *)arg); - else - rc = -EPERM; - } - mutex_unlock(&audio->write_lock); - break; - } - case AUDIO_ASYNC_READ: { - mutex_lock(&audio->read_lock); - if (audio->feedback) - rc = audio_aio_buf_add(audio, 0, - (void __user *)arg); - else - rc = -EPERM; - mutex_unlock(&audio->read_lock); - break; - } - - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - mutex_lock(&audio->lock); - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->str_cfg.buffer_size; - cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", - __func__, audio, cfg.buffer_size, cfg.buffer_count); - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_STREAM_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_STREAM_CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - - mutex_lock(&audio->lock); - if (copy_to_user((void *)arg, &audio->pcm_cfg, sizeof(cfg))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - - pr_debug("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&config, (void *)arg, sizeof(config))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", - __func__, audio); - rc = -EACCES; - mutex_unlock(&audio->lock); - break; - } - if ((config.buffer_count > PCM_BUF_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - audio->pcm_cfg.buffer_count = config.buffer_count; - audio->pcm_cfg.buffer_size = config.buffer_size; - audio->pcm_cfg.channel_count = config.channel_count; - audio->pcm_cfg.sample_rate = config.sample_rate; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_BUF_CFG: { - struct msm_audio_buf_cfg cfg; - - mutex_lock(&audio->lock); - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_GET_BUF CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", - __func__, audio, - audio->ac->session, cfg.meta_info_enable); - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_BUF_CFG: { - pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, audio, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - - mutex_lock(&audio->lock); - if (copy_to_user((void *)arg, &audio->buf_cfg, - sizeof(struct msm_audio_buf_cfg))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_BUF_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_REGISTER_ION: { - struct msm_audio_ion_info info; - - pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&info, (void *)arg, sizeof(info))) { - pr_err( - "%s: copy_from_user for AUDIO_REGISTER_ION failed\n", - __func__); - rc = -EFAULT; - } else { - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_add(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_DEREGISTER_ION: { - struct msm_audio_ion_info info; - - mutex_lock(&audio->lock); - pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); - if (copy_from_user(&info, (void *)arg, sizeof(info))) { - pr_err( - "%s: copy_from_user for AUDIO_DEREGISTER_ION failed\n", - __func__); - rc = -EFAULT; - } else { - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_remove(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_stream_config32 { - u32 buffer_size; - u32 buffer_count; -}; - -struct msm_audio_stats32 { - u32 byte_count; - u32 sample_count; - u32 unused[2]; -}; - -struct msm_audio_config32 { - u32 buffer_size; - u32 buffer_count; - u32 channel_count; - u32 sample_rate; - u32 type; - u32 meta_field; - u32 bits; - u32 unused[3]; -}; - -struct msm_audio_buf_cfg32 { - u32 meta_info_enable; - u32 frames_per_buf; -}; - -struct msm_audio_ion_info32 { - int fd; - compat_uptr_t vaddr; -}; - -enum { - AUDIO_GET_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 3, - struct msm_audio_config32), - AUDIO_SET_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 4, - struct msm_audio_config32), - AUDIO_GET_STATS_32 = _IOR(AUDIO_IOCTL_MAGIC, 5, - struct msm_audio_stats32), - AUDIO_GET_EVENT_32 = _IOR(AUDIO_IOCTL_MAGIC, 13, - struct msm_audio_event32), - AUDIO_ASYNC_WRITE_32 = _IOW(AUDIO_IOCTL_MAGIC, 17, - struct msm_audio_aio_buf32), - AUDIO_ASYNC_READ_32 = _IOW(AUDIO_IOCTL_MAGIC, 18, - struct msm_audio_aio_buf32), - AUDIO_SET_STREAM_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 80, - struct msm_audio_stream_config32), - AUDIO_GET_STREAM_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 81, - struct msm_audio_stream_config32), - AUDIO_GET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 93, - struct msm_audio_buf_cfg32), - AUDIO_SET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 94, - struct msm_audio_buf_cfg32), - AUDIO_REGISTER_ION_32 = _IOW(AUDIO_IOCTL_MAGIC, 97, - struct msm_audio_ion_info32), - AUDIO_DEREGISTER_ION_32 = _IOW(AUDIO_IOCTL_MAGIC, 98, - struct msm_audio_ion_info32), -}; - -static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_ABORT_GET_EVENT: - case AUDIO_OUTPORT_FLUSH: - case AUDIO_STOP: - case AUDIO_PAUSE: - case AUDIO_FLUSH: - case AUDIO_GET_SESSION_ID: - case AUDIO_PM_AWAKE: - case AUDIO_PM_RELAX: - rc = audio_aio_shared_ioctl(file, cmd, arg); - break; - case AUDIO_GET_STATS_32: { - struct msm_audio_stats32 stats; - uint64_t timestamp; - - memset(&stats, 0, sizeof(struct msm_audio_stats32)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - rc = q6asm_get_session_time(audio->ac, ×tamp); - if (rc >= 0) - memcpy(&stats.unused[0], ×tamp, sizeof(timestamp)); - else - pr_debug("Error while getting timestamp\n"); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_STATS_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_GET_EVENT_32: { - pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audio_aio_process_event_req_compat(audio, - (void __user *)arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - break; - } - case AUDIO_ASYNC_WRITE_32: { - mutex_lock(&audio->write_lock); - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else { - if (audio->enabled) - rc = audio_aio_buf_add_compat(audio, 1, - (void __user *)arg); - else - rc = -EPERM; - } - mutex_unlock(&audio->write_lock); - break; - } - case AUDIO_ASYNC_READ_32: { - mutex_lock(&audio->read_lock); - if (audio->feedback) - rc = audio_aio_buf_add_compat(audio, 0, - (void __user *)arg); - else - rc = -EPERM; - mutex_unlock(&audio->read_lock); - break; - } - - case AUDIO_GET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg; - - mutex_lock(&audio->lock); - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->str_cfg.buffer_size; - cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", - __func__, audio, cfg.buffer_size, cfg.buffer_count); - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { - pr_err("%s: copy_to_user for AUDIO_GET_STREAM_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg_32; - struct msm_audio_stream_config cfg; - - pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - cfg.buffer_size = cfg_32.buffer_size; - cfg.buffer_count = cfg_32.buffer_count; - - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_CONFIG_32: { - struct msm_audio_config32 cfg_32; - - mutex_lock(&audio->lock); - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.buffer_size = audio->pcm_cfg.buffer_size; - cfg_32.buffer_count = audio->pcm_cfg.buffer_count; - cfg_32.channel_count = audio->pcm_cfg.channel_count; - cfg_32.sample_rate = audio->pcm_cfg.sample_rate; - cfg_32.type = audio->pcm_cfg.type; - cfg_32.meta_field = audio->pcm_cfg.meta_field; - cfg_32.bits = audio->pcm_cfg.bits; - - if (copy_to_user((void *)arg, &cfg_32, sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_CONFIG_32: { - struct msm_audio_config config; - struct msm_audio_config32 config_32; - - mutex_lock(&audio->lock); - - if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", - __func__, audio); - rc = -EACCES; - mutex_unlock(&audio->lock); - break; - } - pr_debug("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); - if (copy_from_user(&config_32, (void *)arg, - sizeof(config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - config.buffer_size = config_32.buffer_size; - config.buffer_count = config_32.buffer_count; - config.channel_count = config_32.channel_count; - config.sample_rate = config_32.sample_rate; - config.type = config_32.type; - config.meta_field = config_32.meta_field; - config.bits = config_32.bits; - - if ((config.buffer_count > PCM_BUF_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - audio->pcm_cfg.buffer_count = config.buffer_count; - audio->pcm_cfg.buffer_size = config.buffer_size; - audio->pcm_cfg.channel_count = config.channel_count; - audio->pcm_cfg.sample_rate = config.sample_rate; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_BUF_CFG_32: { - struct msm_audio_buf_cfg cfg; - struct msm_audio_buf_cfg32 cfg_32; - - mutex_lock(&audio->lock); - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - cfg.meta_info_enable = cfg_32.meta_info_enable; - cfg.frames_per_buf = cfg_32.frames_per_buf; - - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", - __func__, audio, - audio->ac->session, cfg.meta_info_enable); - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_BUF_CFG_32: { - struct msm_audio_buf_cfg32 cfg_32; - - pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, audio, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - mutex_lock(&audio->lock); - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.meta_info_enable = audio->buf_cfg.meta_info_enable; - cfg_32.frames_per_buf = audio->buf_cfg.frames_per_buf; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(struct msm_audio_buf_cfg32))) { - pr_err("%s: copy_to_user for AUDIO_GET_BUF_CFG_32 failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_REGISTER_ION_32: { - struct msm_audio_ion_info32 info_32; - struct msm_audio_ion_info info; - - pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { - pr_err("%s: copy_from_user for AUDIO_REGISTER_ION_32 failed\n", - __func__); - rc = -EFAULT; - } else { - info.fd = info_32.fd; - info.vaddr = compat_ptr(info_32.vaddr); - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_add(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_DEREGISTER_ION_32: { - struct msm_audio_ion_info32 info_32; - struct msm_audio_ion_info info; - - mutex_lock(&audio->lock); - pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); - if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { - pr_err("%s: copy_from_user for AUDIO_DEREGISTER_ION_32 failed\n", - __func__); - rc = -EFAULT; - } else { - info.fd = info_32.fd; - info.vaddr = compat_ptr(info_32.vaddr); - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_remove(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#endif diff --git a/techpack/audio/4.0/dsp/codecs/audio_utils_aio.h b/techpack/audio/4.0/dsp/codecs/audio_utils_aio.h deleted file mode 100644 index 4b41d89f80e2..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_utils_aio.h +++ /dev/null @@ -1,220 +0,0 @@ -/* Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6audio_common.h" - -#define TUNNEL_MODE 0x0000 -#define NON_TUNNEL_MODE 0x0001 - -#define ADRV_STATUS_AIO_INTF 0x00000001 /* AIO interface */ -#define ADRV_STATUS_FSYNC 0x00000008 -#define ADRV_STATUS_PAUSE 0x00000010 -#define AUDIO_DEC_EOS_SET 0x00000001 -#define AUDIO_DEC_EOF_SET 0x00000010 -#define AUDIO_EVENT_NUM 10 - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -struct timestamp { - u32 lowpart; - u32 highpart; -} __packed; - -struct meta_out_dsp { - u32 offset_to_frame; - u32 frame_size; - u32 encoded_pcm_samples; - u32 msw_ts; - u32 lsw_ts; - u32 nflags; -} __packed; - -struct dec_meta_in { - unsigned char reserved[18]; - unsigned short offset; - struct timestamp ntimestamp; - unsigned int nflags; -} __packed; - -struct dec_meta_out { - unsigned int reserved[7]; - unsigned int num_of_frames; - struct meta_out_dsp meta_out_dsp[]; -} __packed; - -/* General meta field to store meta info locally */ -union meta_data { - struct dec_meta_out meta_out; - struct dec_meta_in meta_in; -} __packed; - -/* per device wakeup source manager */ -struct ws_mgr { - struct mutex ws_lock; - uint32_t ref_cnt; -}; - -#define PCM_BUF_COUNT (2) -/* Buffer with meta */ -#define PCM_BUFSZ_MIN ((4*1024) + sizeof(struct dec_meta_out)) - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (2) -#define FRAME_SIZE ((4*1536) + sizeof(struct dec_meta_in)) - -struct audio_aio_ion_region { - struct list_head list; - struct dma_buf *dma_buf; - int fd; - void *vaddr; - phys_addr_t paddr; - void *kvaddr; - unsigned long len; - unsigned int ref_cnt; -}; - -struct audio_aio_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio_aio_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; - uint32_t token; - void *kvaddr; - union meta_data meta_info; -}; - -struct q6audio_aio; -struct audio_aio_drv_operations { - void (*out_flush)(struct q6audio_aio *); - void (*in_flush)(struct q6audio_aio *); -}; - -struct q6audio_aio { - atomic_t in_bytes; - atomic_t in_samples; - - struct msm_audio_stream_config str_cfg; - struct msm_audio_buf_cfg buf_cfg; - struct msm_audio_config pcm_cfg; - void *codec_cfg; - - struct audio_client *ac; - - struct mutex lock; - struct mutex read_lock; - struct mutex write_lock; - struct mutex get_event_lock; - wait_queue_head_t cmd_wait; - wait_queue_head_t write_wait; - wait_queue_head_t event_wait; - spinlock_t dsp_lock; - spinlock_t event_queue_lock; - - struct miscdevice *miscdevice; - uint32_t wakelock_voted; - struct ws_mgr *audio_ws_mgr; - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - struct list_head out_queue; /* queue to retain output buffers */ - struct list_head in_queue; /* queue to retain input buffers */ - struct list_head free_event_queue; - struct list_head event_queue; - struct list_head ion_region_queue; /* protected by lock */ - struct audio_aio_drv_operations drv_ops; - union msm_audio_event_payload eos_write_payload; - uint32_t device_events; - uint16_t volume; - uint32_t drv_status; - int event_abort; - int eos_rsp; - int eos_flag; - int opened; - int enabled; - int stopped; - int feedback; - int rflush; /* Read flush */ - int wflush; /* Write flush */ - bool reset_event; - long (*codec_ioctl)(struct file *, unsigned int, unsigned long); - long (*codec_compat_ioctl)(struct file *, unsigned int, unsigned long); -}; - -void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload); - -void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload); - -int insert_eos_buf(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node); - -int extract_meta_out_info(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node, int dir); - -int audio_aio_open(struct q6audio_aio *audio, struct file *file); -int audio_aio_enable(struct q6audio_aio *audio); -void audio_aio_post_event(struct q6audio_aio *audio, int type, - union msm_audio_event_payload payload); -int audio_aio_release(struct inode *inode, struct file *file); -int audio_aio_fsync(struct file *file, loff_t start, loff_t end, int datasync); -void audio_aio_async_out_flush(struct q6audio_aio *audio); -void audio_aio_async_in_flush(struct q6audio_aio *audio); -void audio_aio_ioport_reset(struct q6audio_aio *audio); -int enable_volume_ramp(struct q6audio_aio *audio); -#ifdef CONFIG_DEBUG_FS -int audio_aio_debug_open(struct inode *inode, struct file *file); -ssize_t audio_aio_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos); -#endif diff --git a/techpack/audio/4.0/dsp/codecs/audio_wma.c b/techpack/audio/4.0/dsp/codecs/audio_wma.c deleted file mode 100644 index da757f31a4d6..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_wma.c +++ /dev/null @@ -1,349 +0,0 @@ -/* wma audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_wma_misc; -static struct ws_mgr audio_wma_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_wma_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_wma_cfg wma_cfg; - struct msm_audio_wma_config_v2 *wma_config; - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; - wma_cfg.format_tag = wma_config->format_tag; - wma_cfg.ch_cfg = wma_config->numchannels; - wma_cfg.sample_rate = wma_config->samplingrate; - wma_cfg.avg_bytes_per_sec = wma_config->avgbytespersecond; - wma_cfg.block_align = wma_config->block_align; - wma_cfg.valid_bits_per_sample = - wma_config->validbitspersample; - wma_cfg.ch_mask = wma_config->channelmask; - wma_cfg.encode_opt = wma_config->encodeopt; - /* Configure Media format block */ - rc = q6asm_media_format_block_wma(audio->ac, &wma_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_WMA_CONFIG_V2: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_wma_config_v2))) { - pr_err("%s:copy_to_user for AUDIO_SET_WMA_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_WMA_CONFIG_V2: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_wma_config_v2))) { - pr_err("%s:copy_from_user for AUDIO_SET_WMA_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_wma_config_v2_32 { - u16 format_tag; - u16 numchannels; - u32 samplingrate; - u32 avgbytespersecond; - u16 block_align; - u16 validbitspersample; - u32 channelmask; - u16 encodeopt; -}; - -enum { - AUDIO_GET_WMA_CONFIG_V2_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+2), struct msm_audio_wma_config_v2_32), - AUDIO_SET_WMA_CONFIG_V2_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_wma_config_v2_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_WMA_CONFIG_V2_32: { - struct msm_audio_wma_config_v2 *wma_config; - struct msm_audio_wma_config_v2_32 wma_config_32; - - memset(&wma_config_32, 0, sizeof(wma_config_32)); - - wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; - wma_config_32.format_tag = wma_config->format_tag; - wma_config_32.numchannels = wma_config->numchannels; - wma_config_32.samplingrate = wma_config->samplingrate; - wma_config_32.avgbytespersecond = wma_config->avgbytespersecond; - wma_config_32.block_align = wma_config->block_align; - wma_config_32.validbitspersample = - wma_config->validbitspersample; - wma_config_32.channelmask = wma_config->channelmask; - wma_config_32.encodeopt = wma_config->encodeopt; - if (copy_to_user((void *)arg, &wma_config_32, - sizeof(wma_config_32))) { - pr_err("%s: copy_to_user for GET_WMA_CONFIG_V2_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_WMA_CONFIG_V2_32: { - struct msm_audio_wma_config_v2 *wma_config; - struct msm_audio_wma_config_v2_32 wma_config_32; - - if (copy_from_user(&wma_config_32, (void *)arg, - sizeof(wma_config_32))) { - pr_err("%s: copy_from_user for SET_WMA_CONFIG_V2_32 failed\n" - , __func__); - rc = -EFAULT; - break; - } - wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; - wma_config->format_tag = wma_config_32.format_tag; - wma_config->numchannels = wma_config_32.numchannels; - wma_config->samplingrate = wma_config_32.samplingrate; - wma_config->avgbytespersecond = wma_config_32.avgbytespersecond; - wma_config->block_align = wma_config_32.block_align; - wma_config->validbitspersample = - wma_config_32.validbitspersample; - wma_config->channelmask = wma_config_32.channelmask; - wma_config->encodeopt = wma_config_32.encodeopt; - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wma_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_wma_config_v2), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_wma_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_wma_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_WMA_V9); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open WMA decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_WMA_V9); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_wma_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_wma_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:wmadec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wma_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_wma_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wma", - .fops = &audio_wma_fops, -}; - -int __init audio_wma_init(void) -{ - int ret = misc_register(&audio_wma_misc); - - if (ret == 0) - device_init_wakeup(audio_wma_misc.this_device, true); - audio_wma_ws_mgr.ref_cnt = 0; - mutex_init(&audio_wma_ws_mgr.ws_lock); - - return ret; -} - -void audio_wma_exit(void) -{ - mutex_destroy(&audio_wma_ws_mgr.ws_lock); - misc_deregister(&audio_wma_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/audio_wmapro.c b/techpack/audio/4.0/dsp/codecs/audio_wmapro.c deleted file mode 100644 index 218216300bc6..000000000000 --- a/techpack/audio/4.0/dsp/codecs/audio_wmapro.c +++ /dev/null @@ -1,422 +0,0 @@ -/* wmapro audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_wmapro_misc; -static struct ws_mgr audio_wmapro_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_wmapro_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_wmapro_cfg wmapro_cfg; - struct msm_audio_wmapro_config *wmapro_config; - - pr_debug("%s: AUDIO_START session_id[%d]\n", __func__, - audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /* bits per sample */ - true, /* use default channel map */ - true, /* use back channel map flavor */ - NULL); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - wmapro_config = (struct msm_audio_wmapro_config *) - audio->codec_cfg; - if ((wmapro_config->formattag == 0x162) || - (wmapro_config->formattag == 0x163) || - (wmapro_config->formattag == 0x166) || - (wmapro_config->formattag == 0x167)) { - wmapro_cfg.format_tag = wmapro_config->formattag; - } else { - pr_err("%s:AUDIO_START failed: formattag = %d\n", - __func__, wmapro_config->formattag); - rc = -EINVAL; - break; - } - if (wmapro_config->numchannels > 0) { - wmapro_cfg.ch_cfg = wmapro_config->numchannels; - } else { - pr_err("%s:AUDIO_START failed: channels = %d\n", - __func__, wmapro_config->numchannels); - rc = -EINVAL; - break; - } - if (wmapro_config->samplingrate > 0) { - wmapro_cfg.sample_rate = wmapro_config->samplingrate; - } else { - pr_err("%s:AUDIO_START failed: sample_rate = %d\n", - __func__, wmapro_config->samplingrate); - rc = -EINVAL; - break; - } - wmapro_cfg.avg_bytes_per_sec = - wmapro_config->avgbytespersecond; - if ((wmapro_config->asfpacketlength <= 13376) || - (wmapro_config->asfpacketlength > 0)) { - wmapro_cfg.block_align = - wmapro_config->asfpacketlength; - } else { - pr_err("%s:AUDIO_START failed: block_align = %d\n", - __func__, wmapro_config->asfpacketlength); - rc = -EINVAL; - break; - } - if ((wmapro_config->validbitspersample == 16) || - (wmapro_config->validbitspersample == 24)) { - wmapro_cfg.valid_bits_per_sample = - wmapro_config->validbitspersample; - } else { - pr_err("%s:AUDIO_START failed: bitspersample = %d\n", - __func__, wmapro_config->validbitspersample); - rc = -EINVAL; - break; - } - wmapro_cfg.ch_mask = wmapro_config->channelmask; - wmapro_cfg.encode_opt = wmapro_config->encodeopt; - wmapro_cfg.adv_encode_opt = - wmapro_config->advancedencodeopt; - wmapro_cfg.adv_encode_opt2 = - wmapro_config->advancedencodeopt2; - /* Configure Media format block */ - rc = q6asm_media_format_block_wmapro(audio->ac, &wmapro_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd %d\n", __func__, cmd); - rc = -EINVAL; - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_GET_WMAPRO_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_wmapro_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_WMAPRO_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_WMAPRO_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_wmapro_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_WMAPRO_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT - -struct msm_audio_wmapro_config32 { - u16 armdatareqthr; - u8 validbitspersample; - u8 numchannels; - u16 formattag; - u32 samplingrate; - u32 avgbytespersecond; - u16 asfpacketlength; - u32 channelmask; - u16 encodeopt; - u16 advancedencodeopt; - u32 advancedencodeopt2; -}; - -enum { - AUDIO_GET_WMAPRO_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_wmapro_config32), - AUDIO_SET_WMAPRO_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_wmapro_config32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_GET_WMAPRO_CONFIG_32: { - struct msm_audio_wmapro_config *wmapro_config; - struct msm_audio_wmapro_config32 wmapro_config_32; - - memset(&wmapro_config_32, 0, sizeof(wmapro_config_32)); - - wmapro_config = - (struct msm_audio_wmapro_config *)audio->codec_cfg; - wmapro_config_32.armdatareqthr = wmapro_config->armdatareqthr; - wmapro_config_32.validbitspersample = - wmapro_config->validbitspersample; - wmapro_config_32.numchannels = wmapro_config->numchannels; - wmapro_config_32.formattag = wmapro_config->formattag; - wmapro_config_32.samplingrate = wmapro_config->samplingrate; - wmapro_config_32.avgbytespersecond = - wmapro_config->avgbytespersecond; - wmapro_config_32.asfpacketlength = - wmapro_config->asfpacketlength; - wmapro_config_32.channelmask = wmapro_config->channelmask; - wmapro_config_32.encodeopt = wmapro_config->encodeopt; - wmapro_config_32.advancedencodeopt = - wmapro_config->advancedencodeopt; - wmapro_config_32.advancedencodeopt2 = - wmapro_config->advancedencodeopt2; - - if (copy_to_user((void *)arg, &wmapro_config_32, - sizeof(struct msm_audio_wmapro_config32))) { - pr_err("%s: copy_to_user for AUDIO_GET_WMAPRO_CONFIG_V2_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_WMAPRO_CONFIG_32: { - struct msm_audio_wmapro_config *wmapro_config; - struct msm_audio_wmapro_config32 wmapro_config_32; - - if (copy_from_user(&wmapro_config_32, (void *)arg, - sizeof(struct msm_audio_wmapro_config32))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_WMAPRO_CONFG_V2_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - wmapro_config = - (struct msm_audio_wmapro_config *)audio->codec_cfg; - wmapro_config->armdatareqthr = wmapro_config_32.armdatareqthr; - wmapro_config->validbitspersample = - wmapro_config_32.validbitspersample; - wmapro_config->numchannels = wmapro_config_32.numchannels; - wmapro_config->formattag = wmapro_config_32.formattag; - wmapro_config->samplingrate = wmapro_config_32.samplingrate; - wmapro_config->avgbytespersecond = - wmapro_config_32.avgbytespersecond; - wmapro_config->asfpacketlength = - wmapro_config_32.asfpacketlength; - wmapro_config->channelmask = wmapro_config_32.channelmask; - wmapro_config->encodeopt = wmapro_config_32.encodeopt; - wmapro_config->advancedencodeopt = - wmapro_config_32.advancedencodeopt; - wmapro_config->advancedencodeopt2 = - wmapro_config_32.advancedencodeopt2; - break; - } - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wmapro_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_wmapro_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_wmapro_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_wmapro_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_WMA_V10PRO); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open WMA decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_WMA_V10PRO); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_wmapro_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_wmapro_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:wmapro decoder open success, session_id = %d\n", __func__, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wmapro_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_wmapro_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wmapro", - .fops = &audio_wmapro_fops, -}; - -int __init audio_wmapro_init(void) -{ - int ret = misc_register(&audio_wmapro_misc); - - if (ret == 0) - device_init_wakeup(audio_wmapro_misc.this_device, true); - audio_wmapro_ws_mgr.ref_cnt = 0; - mutex_init(&audio_wmapro_ws_mgr.ws_lock); - - return ret; -} - -void audio_wmapro_exit(void) -{ - mutex_destroy(&audio_wmapro_ws_mgr.ws_lock); - misc_deregister(&audio_wmapro_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/evrc_in.c b/techpack/audio/4.0/dsp/codecs/evrc_in.c deleted file mode 100644 index dae6fc8e62cc..000000000000 --- a/techpack/audio/4.0/dsp/codecs/evrc_in.c +++ /dev/null @@ -1,404 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((23+sizeof(struct meta_out_dsp)) * 10)) - -static long evrc_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_evrc_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - /* rate_modulation_cmd set to zero - * currently not configurable from user space - */ - rc = q6asm_enc_cfg_blk_evrc(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate, 0); - - if (rc < 0) { - pr_err("%s:session id %d: cmd evrc media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG: { - struct msm_audio_evrc_enc_config *cfg; - struct msm_audio_evrc_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - cfg = (struct msm_audio_evrc_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, "AUDIO_SET_EVRC_ENC_CONFIG"); - rc = -EINVAL; - break; - } - if (cfg->min_bit_rate > 4 || - cfg->min_bit_rate < 1 || - (cfg->min_bit_rate == 2)) { - pr_err("%s:session id %d: invalid min bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - if (cfg->max_bit_rate > 4 || - cfg->max_bit_rate < 1 || - (cfg->max_bit_rate == 2)) { - pr_err("%s:session id %d: invalid max bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->min_bit_rate = cfg->min_bit_rate; - enc_cfg->max_bit_rate = cfg->max_bit_rate; - pr_debug("%s:session id %d: min_bit_rate= 0x%x max_bit_rate=0x%x\n", - __func__, - audio->ac->session, enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long evrc_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = evrc_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_EVRC_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_evrc_enc_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_EVRC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG: { - struct msm_audio_evrc_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(struct msm_audio_evrc_enc_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_EVRC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = evrc_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_EVRC_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_evrc_enc_config32 { - u32 cdma_rate; - u32 min_bit_rate; - u32 max_bit_rate; -}; - -enum { - AUDIO_SET_EVRC_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - 2, struct msm_audio_evrc_enc_config32), - AUDIO_GET_EVRC_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - 3, struct msm_audio_evrc_enc_config32) -}; - -static long evrc_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = evrc_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_EVRC_ENC_CONFIG_32: { - struct msm_audio_evrc_enc_config32 cfg_32; - struct msm_audio_evrc_enc_config *enc_cfg; - - memset(&cfg_32, 0, sizeof(cfg_32)); - - enc_cfg = audio->enc_cfg; - cfg_32.cdma_rate = enc_cfg->cdma_rate; - cfg_32.min_bit_rate = enc_cfg->min_bit_rate; - cfg_32.max_bit_rate = enc_cfg->max_bit_rate; - - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_EVRC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG_32: { - struct msm_audio_evrc_enc_config cfg; - struct msm_audio_evrc_enc_config32 cfg_32; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_EVRC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.cdma_rate = cfg_32.cdma_rate; - cfg.min_bit_rate = cfg_32.min_bit_rate; - cfg.max_bit_rate = cfg_32.max_bit_rate; - cmd = AUDIO_SET_EVRC_ENC_CONFIG; - rc = evrc_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_EVRC_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define evrc_in_compat_ioctl NULL -#endif - -static int evrc_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_evrc_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_evrc_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 23; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->min_bit_rate = 4; - enc_cfg->max_bit_rate = 4; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open evrc encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_EVRC, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", - __func__, audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_EVRC); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, - audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", __func__, - audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = evrc_in_compat_ioctl; - audio->enc_ioctl = evrc_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = evrc_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_evrc_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc_in", - .fops = &audio_in_fops, -}; - -int __init evrc_in_init(void) -{ - return misc_register(&audio_evrc_in_misc); -} - -void evrc_in_exit(void) -{ - misc_deregister(&audio_evrc_in_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/g711alaw_in.c b/techpack/audio/4.0/dsp/codecs/g711alaw_in.c deleted file mode 100644 index 013007ecd066..000000000000 --- a/techpack/audio/4.0/dsp/codecs/g711alaw_in.c +++ /dev/null @@ -1,376 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((320+sizeof(struct meta_out_dsp)) * 10)) -static long g711_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - pr_debug("%s: sample rate %d", __func__, enc_cfg->sample_rate); - rc = q6asm_enc_cfg_blk_g711(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->sample_rate); - - if (rc < 0) { - pr_err("%s:session id %d: cmd g711 media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", __func__, - audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, - rc); - break; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config *cfg; - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - - cfg = (struct msm_audio_g711_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - if (cfg->sample_rate != 8000 && - cfg->sample_rate != 16000) { - pr_err("%s:session id %d: invalid sample rate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->sample_rate = cfg->sample_rate; - pr_debug("%s:session id %d: sample_rate= 0x%x", - __func__, - audio->ac->session, enc_cfg->sample_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -static long g711_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_g711_enc_config))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_g711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_GET_G711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - break; - } - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_GET_G711_ENC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_enc_config32 { - uint32_t sample_rate; -}; - -enum { - AUDIO_SET_G711_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_enc_config32), - AUDIO_GET_G711_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_enc_config32) -}; - -static long g711_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config32 *)audio->enc_cfg; - cfg_32.sample_rate = enc_cfg->sample_rate; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 cfg; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.sample_rate = cfg_32.sample_rate; - cmd = AUDIO_SET_G711_ENC_CONFIG; - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_G711_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} -#else -#define g711_in_compat_ioctl NULL -#endif - -static int g711_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_g711_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_g711_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* - * Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 320; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->sample_rate = 8000; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open g711 encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_G711_ALAW_FS, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_G711_ALAW_FS); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = g711_in_compat_ioctl; - audio->enc_ioctl = g711_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = g711_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_in_compat_ioctl, -#endif -}; - -struct miscdevice audio_g711alaw_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711alaw_in", - .fops = &audio_in_fops, -}; - -int __init g711alaw_in_init(void) -{ - return misc_register(&audio_g711alaw_in_misc); -} - -void g711alaw_in_exit(void) -{ - misc_deregister(&audio_g711alaw_in_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/g711mlaw_in.c b/techpack/audio/4.0/dsp/codecs/g711mlaw_in.c deleted file mode 100644 index 3d3175415c7d..000000000000 --- a/techpack/audio/4.0/dsp/codecs/g711mlaw_in.c +++ /dev/null @@ -1,379 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -#ifdef CONFIG_COMPAT -#undef PROC_ADD -#endif -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((320+sizeof(struct meta_out_dsp)) * 10)) -static long g711_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - pr_debug("%s: sample rate %d", __func__, enc_cfg->sample_rate); - rc = q6asm_enc_cfg_blk_g711(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->sample_rate); - - if (rc < 0) { - pr_err("%s:session id %d: cmd g711 media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", __func__, - audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, - rc); - break; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config *cfg; - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - - cfg = (struct msm_audio_g711_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - if (cfg->sample_rate != 8000 && - cfg->sample_rate != 16000) { - pr_err("%s:session id %d: invalid sample rate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->sample_rate = cfg->sample_rate; - pr_debug("%s:session id %d: sample_rate= 0x%x", - __func__, - audio->ac->session, enc_cfg->sample_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -static long g711_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_g711_enc_config))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_g711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_GET_G711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - break; - } - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_GET_G711_ENC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_enc_config32 { - uint32_t sample_rate; -}; - -enum { - AUDIO_SET_G711_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_enc_config32), - AUDIO_GET_G711_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_enc_config32) -}; - -static long g711_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config32 *)audio->enc_cfg; - cfg_32.sample_rate = enc_cfg->sample_rate; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 cfg; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.sample_rate = cfg_32.sample_rate; - cmd = AUDIO_SET_G711_ENC_CONFIG; - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_G711_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} -#else -#define g711_in_compat_ioctl NULL -#endif - -static int g711_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_g711_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_g711_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* - * Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 320; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->sample_rate = 8000; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open g711 encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_G711_MLAW_FS, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_G711_MLAW_FS); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = g711_in_compat_ioctl; - audio->enc_ioctl = g711_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = g711_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_in_compat_ioctl, -#endif -}; - -struct miscdevice audio_g711mlaw_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711mlaw_in", - .fops = &audio_in_fops, -}; - -int __init g711mlaw_in_init(void) -{ - return misc_register(&audio_g711mlaw_in_misc); -} - -void g711mlaw_in_exit(void) -{ - misc_deregister(&audio_g711mlaw_in_misc); -} diff --git a/techpack/audio/4.0/dsp/codecs/q6audio_common.h b/techpack/audio/4.0/dsp/codecs/q6audio_common.h deleted file mode 100644 index 67003feaee43..000000000000 --- a/techpack/audio/4.0/dsp/codecs/q6audio_common.h +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2012-2014, 2017, 2020 The Linux Foundation. All rights reserved. - */ - - -/* For Decoders */ -#ifndef __Q6_AUDIO_COMMON_H__ -#define __Q6_AUDIO_COMMON_H__ - -#include -#include -extern spinlock_t enc_dec_lock; - -void q6_audio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv); - -void audio_aio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *audio); - - -/* For Encoders */ -void q6asm_in_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv); - -void audio_in_get_dsp_frames(void *audio, - uint32_t token, uint32_t *payload); - -#endif /*__Q6_AUDIO_COMMON_H__*/ diff --git a/techpack/audio/4.0/dsp/codecs/q6audio_v2.c b/techpack/audio/4.0/dsp/codecs/q6audio_v2.c deleted file mode 100644 index 6a402f538b75..000000000000 --- a/techpack/audio/4.0/dsp/codecs/q6audio_v2.c +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2013, 2015-2017, 2020 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -void q6asm_in_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_in *audio = (struct q6audio_in *)priv; - unsigned long flags; - - spin_lock(&enc_dec_lock); - if (audio == NULL) { - pr_err("%s: failed to get q6audio value\n", __func__); - goto error; - } - pr_debug("%s:session id %d: opcode[0x%x]\n", __func__, - audio->ac->session, opcode); - - spin_lock_irqsave(&audio->dsp_lock, flags); - switch (opcode) { - case ASM_DATA_EVENT_READ_DONE_V2: - audio_in_get_dsp_frames(audio, token, payload); - break; - case ASM_DATA_EVENT_WRITE_DONE_V2: - atomic_inc(&audio->in_count); - wake_up(&audio->write_wait); - break; - case ASM_DATA_EVENT_RENDERED_EOS: - audio->eos_rsp = 1; - wake_up(&audio->read_wait); - break; - case ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2: - break; - case ASM_SESSION_EVENTX_OVERFLOW: - pr_err("%s:session id %d: ASM_SESSION_EVENT_TX_OVERFLOW\n", - __func__, audio->ac->session); - break; - case RESET_EVENTS: - pr_debug("%s:received RESET EVENTS\n", __func__); - audio->enabled = 0; - audio->stopped = 1; - audio->event_abort = 1; - audio->reset_event = true; - wake_up(&audio->read_wait); - wake_up(&audio->write_wait); - break; - default: - pr_debug("%s:session id %d: Ignore opcode[0x%x]\n", __func__, - audio->ac->session, opcode); - break; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -error: - spin_unlock(&enc_dec_lock); -} - -void audio_in_get_dsp_frames(void *priv, - uint32_t token, uint32_t *payload) -{ - struct q6audio_in *audio = (struct q6audio_in *)priv; - uint32_t index; - - index = q6asm_get_buf_index_from_token(token); - pr_debug("%s:session id %d: index=%d nr frames=%d offset[%d]\n", - __func__, audio->ac->session, token, payload[9], - payload[5]); - pr_debug("%s:session id %d: timemsw=%d lsw=%d\n", __func__, - audio->ac->session, payload[7], payload[6]); - pr_debug("%s:session id %d: uflags=0x%8x uid=0x%8x\n", __func__, - audio->ac->session, payload[8], payload[10]); - pr_debug("%s:session id %d: enc_framesotal_size=0x%8x\n", __func__, - audio->ac->session, payload[4]); - - /* Ensure the index is within max array size: FRAME_NUM */ - if (index >= FRAME_NUM) { - pr_err("%s: Invalid index %d\n", - __func__, index); - return; - } - - audio->out_frame_info[index][0] = payload[9]; - audio->out_frame_info[index][1] = payload[5]; - - /* statistics of read */ - atomic_add(payload[4], &audio->in_bytes); - atomic_add(payload[9], &audio->in_samples); - - if (atomic_read(&audio->out_count) <= audio->str_cfg.buffer_count) { - atomic_inc(&audio->out_count); - wake_up(&audio->read_wait); - } -} diff --git a/techpack/audio/4.0/dsp/codecs/q6audio_v2_aio.c b/techpack/audio/4.0/dsp/codecs/q6audio_v2_aio.c deleted file mode 100644 index ecd14dadfee7..000000000000 --- a/techpack/audio/4.0/dsp/codecs/q6audio_v2_aio.c +++ /dev/null @@ -1,230 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils_aio.h" - -void q6_audio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_aio *audio = (struct q6audio_aio *)priv; - - pr_debug("%s:opcode = %x token = 0x%x\n", __func__, opcode, token); - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: - case ASM_DATA_EVENT_READ_DONE_V2: - case ASM_DATA_EVENT_RENDERED_EOS: - case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - case RESET_EVENTS: - audio_aio_cb(opcode, token, payload, audio); - break; - default: - pr_debug("%s:Unhandled event = 0x%8x\n", __func__, opcode); - break; - } -} - -void audio_aio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv/*struct q6audio_aio *audio*/) -{ - struct q6audio_aio *audio = (struct q6audio_aio *)priv; - union msm_audio_event_payload e_payload; - - spin_lock(&enc_dec_lock); - if (audio == NULL) { - pr_err("%s: failed to get q6audio value\n", __func__); - goto error; - } - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: - pr_debug("%s[%pK]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n", - __func__, audio, token); - audio_aio_async_write_ack(audio, token, payload); - break; - case ASM_DATA_EVENT_READ_DONE_V2: - pr_debug("%s[%pK]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n", - __func__, audio, token); - audio_aio_async_read_ack(audio, token, payload); - break; - case ASM_DATA_EVENT_RENDERED_EOS: - /* EOS Handle */ - pr_debug("%s[%pK]:ASM_DATA_CMDRSP_EOS\n", __func__, audio); - if (audio->feedback) { /* Non-Tunnel mode */ - audio->eos_rsp = 1; - /* propagate input EOS i/p buffer, - * after receiving DSP acknowledgment - */ - if (audio->eos_flag && - (audio->eos_write_payload.aio_buf.buf_addr)) { - audio_aio_post_event(audio, - AUDIO_EVENT_WRITE_DONE, - audio->eos_write_payload); - memset(&audio->eos_write_payload, 0, - sizeof(union msm_audio_event_payload)); - audio->eos_flag = 0; - } - } else { /* Tunnel mode */ - audio->eos_rsp = 1; - wake_up(&audio->write_wait); - wake_up(&audio->cmd_wait); - } - break; - case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - pr_debug("%s[%pK]:payload0[%x] payloa1d[%x]opcode= 0x%x\n", - __func__, audio, payload[0], payload[1], opcode); - break; - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n", - __func__, audio, payload[0], - payload[1], payload[2], payload[3]); - - pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", - __func__, audio, audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - audio->pcm_cfg.sample_rate = payload[0]; - audio->pcm_cfg.channel_count = payload[1] & 0xFFFF; - e_payload.stream_info.chan_info = audio->pcm_cfg.channel_count; - e_payload.stream_info.sample_rate = audio->pcm_cfg.sample_rate; - audio_aio_post_event(audio, AUDIO_EVENT_STREAM_INFO, e_payload); - break; - case RESET_EVENTS: - pr_err("%s: Received opcode:0x%x\n", __func__, opcode); - audio->stopped = 1; - audio->reset_event = true; - wake_up(&audio->event_wait); - break; - default: - break; - } -error: - spin_unlock(&enc_dec_lock); -} - -int extract_meta_out_info(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node, int dir) -{ - struct dec_meta_out *meta_data = buf_node->kvaddr; - uint32_t temp; - - if (dir) { /* input buffer - Write */ - if (audio->buf_cfg.meta_info_enable) { - if (buf_node->buf.buf_len < - sizeof(struct dec_meta_in)) { - pr_debug("%s: invalid buf len %d\n", - __func__, buf_node->buf.buf_len); - return -EINVAL; - } - memcpy(&buf_node->meta_info.meta_in, - (char *)buf_node->kvaddr, sizeof(struct dec_meta_in)); - } else { - memset(&buf_node->meta_info.meta_in, - 0, sizeof(struct dec_meta_in)); - } - pr_debug("%s[%pK]:i/p: msw_ts %d lsw_ts %d nflags 0x%8x\n", - __func__, audio, - buf_node->meta_info.meta_in.ntimestamp.highpart, - buf_node->meta_info.meta_in.ntimestamp.lowpart, - buf_node->meta_info.meta_in.nflags); - } else { /* output buffer - Read */ - memcpy((char *)buf_node->kvaddr, - &buf_node->meta_info.meta_out, - sizeof(struct dec_meta_out)); - meta_data->meta_out_dsp[0].nflags = 0x00000000; - temp = meta_data->meta_out_dsp[0].msw_ts; - meta_data->meta_out_dsp[0].msw_ts = - meta_data->meta_out_dsp[0].lsw_ts; - meta_data->meta_out_dsp[0].lsw_ts = temp; - - pr_debug("%s[%pK]:o/p: msw_ts %d lsw_ts %d nflags 0x%8x, num_frames = %d\n", - __func__, audio, - ((struct dec_meta_out *)buf_node->kvaddr)-> - meta_out_dsp[0].msw_ts, - ((struct dec_meta_out *)buf_node->kvaddr)-> - meta_out_dsp[0].lsw_ts, - ((struct dec_meta_out *)buf_node->kvaddr)-> - meta_out_dsp[0].nflags, - ((struct dec_meta_out *)buf_node->kvaddr)->num_of_frames); - } - return 0; -} - -/* Read buffer from DSP / Handle Ack from DSP */ -void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audio_aio_buffer_node *filled_buf; - int ret; - - pr_debug("%s\n", __func__); - - /* No active flush in progress */ - if (audio->rflush) - return; - - /* Statistics of read */ - atomic_add(payload[4], &audio->in_bytes); - atomic_add(payload[9], &audio->in_samples); - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (list_empty(&audio->in_queue)) { - spin_unlock_irqrestore(&audio->dsp_lock, flags); - pr_warn("%s unexpected ack from dsp\n", __func__); - return; - } - filled_buf = list_first_entry(&audio->in_queue, - struct audio_aio_buffer_node, list); - - pr_debug("%s token: 0x[%x], filled_buf->token: 0x[%x]", - __func__, token, filled_buf->token); - if (token == (filled_buf->token)) { - list_del(&filled_buf->list); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - event_payload.aio_buf = filled_buf->buf; - /* Read done Buffer due to flush/normal condition - * after EOS event, so append EOS buffer - */ - if (audio->eos_rsp == 0x1) { - event_payload.aio_buf.data_len = - insert_eos_buf(audio, filled_buf); - /* Reset flag back to indicate eos intimated */ - audio->eos_rsp = 0; - } else { - filled_buf->meta_info.meta_out.num_of_frames - = payload[9]; - event_payload.aio_buf.data_len = payload[4] - + payload[5] + sizeof(struct dec_meta_out); - pr_debug("%s[%pK]:nr of frames 0x%8x len=%d\n", - __func__, audio, - filled_buf->meta_info.meta_out.num_of_frames, - event_payload.aio_buf.data_len); - ret = extract_meta_out_info(audio, filled_buf, 0); - audio->eos_rsp = 0; - } - pr_debug("%s, posting read done to the app here\n", __func__); - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(filled_buf); - } else { - pr_err("%s[%pK]:expected=%x ret=%x\n", - __func__, audio, filled_buf->token, token); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } -} diff --git a/techpack/audio/4.0/dsp/codecs/qcelp_in.c b/techpack/audio/4.0/dsp/codecs/qcelp_in.c deleted file mode 100644 index 806f8b233ffc..000000000000 --- a/techpack/audio/4.0/dsp/codecs/qcelp_in.c +++ /dev/null @@ -1,404 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((35+sizeof(struct meta_out_dsp)) * 10)) - -static long qcelp_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_qcelp_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - /* reduced_rate_level, rate_modulation_cmd set to zero - * currently not configurable from user space - */ - rc = q6asm_enc_cfg_blk_qcelp(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate, 0, 0); - - if (rc < 0) { - pr_err("%s:session id %d: cmd qcelp media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", __func__, - audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, - rc); - break; - } - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG: { - struct msm_audio_qcelp_enc_config *cfg; - struct msm_audio_qcelp_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - cfg = (struct msm_audio_qcelp_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - if (cfg->min_bit_rate > 4 || - cfg->min_bit_rate < 1) { - pr_err("%s:session id %d: invalid min bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - if (cfg->max_bit_rate > 4 || - cfg->max_bit_rate < 1) { - pr_err("%s:session id %d: invalid max bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->cdma_rate = cfg->cdma_rate; - enc_cfg->min_bit_rate = cfg->min_bit_rate; - enc_cfg->max_bit_rate = cfg->max_bit_rate; - pr_debug("%s:session id %d: min_bit_rate= 0x%x max_bit_rate=0x%x\n", - __func__, - audio->ac->session, enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long qcelp_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = qcelp_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_QCELP_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_qcelp_enc_config))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_QCELP_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG: { - struct msm_audio_qcelp_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_QCELP_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - break; - } - rc = qcelp_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_QCELP_ENC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_qcelp_enc_config32 { - u32 cdma_rate; - u32 min_bit_rate; - u32 max_bit_rate; -}; - -enum { - AUDIO_SET_QCELP_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - 0, struct msm_audio_qcelp_enc_config32), - AUDIO_GET_QCELP_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - 1, struct msm_audio_qcelp_enc_config32) -}; - -static long qcelp_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = qcelp_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_QCELP_ENC_CONFIG_32: { - struct msm_audio_qcelp_enc_config32 cfg_32; - struct msm_audio_qcelp_enc_config *enc_cfg; - - memset(&cfg_32, 0, sizeof(cfg_32)); - - enc_cfg = (struct msm_audio_qcelp_enc_config *)audio->enc_cfg; - cfg_32.cdma_rate = enc_cfg->cdma_rate; - cfg_32.min_bit_rate = enc_cfg->min_bit_rate; - cfg_32.max_bit_rate = enc_cfg->max_bit_rate; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_QCELP_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; -} - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG_32: { - struct msm_audio_qcelp_enc_config32 cfg_32; - struct msm_audio_qcelp_enc_config cfg; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_QCELP_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.cdma_rate = cfg_32.cdma_rate; - cfg.min_bit_rate = cfg_32.min_bit_rate; - cfg.max_bit_rate = cfg_32.max_bit_rate; - cmd = AUDIO_SET_QCELP_ENC_CONFIG; - rc = qcelp_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_QCELP_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define qcelp_in_compat_ioctl NULL -#endif - -static int qcelp_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_qcelp_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_qcelp_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 35; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->min_bit_rate = 4; - enc_cfg->max_bit_rate = 4; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open qcelp encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_V13K, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", __func__, - audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_V13K); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", __func__, - audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = qcelp_in_compat_ioctl; - audio->enc_ioctl = qcelp_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = qcelp_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_qcelp_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp_in", - .fops = &audio_in_fops, -}; - -int __init qcelp_in_init(void) -{ - return misc_register(&audio_qcelp_in_misc); -} - -void qcelp_in_exit(void) -{ - misc_deregister(&audio_qcelp_in_misc); -} diff --git a/techpack/audio/4.0/dsp/digital-cdc-rsc-mgr.c b/techpack/audio/4.0/dsp/digital-cdc-rsc-mgr.c deleted file mode 100644 index 4206523ea85b..000000000000 --- a/techpack/audio/4.0/dsp/digital-cdc-rsc-mgr.c +++ /dev/null @@ -1,100 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include - -struct mutex hw_vote_lock; -static bool is_init_done; - -/** - * digital_cdc_rsc_mgr_hw_vote_enable - Enables hw vote in DSP - * - * @vote_handle: vote handle for which voting needs to be done - * - * Returns 0 on success or -EINVAL/error code on failure - */ -int digital_cdc_rsc_mgr_hw_vote_enable(struct clk* vote_handle) -{ - int ret = 0; - - if (!is_init_done || vote_handle == NULL) { - pr_err_ratelimited("%s: init failed or vote handle NULL\n", - __func__); - return -EINVAL; - } - - mutex_lock(&hw_vote_lock); - ret = clk_prepare_enable(vote_handle); - mutex_unlock(&hw_vote_lock); - - pr_debug("%s: return %d\n", __func__, ret); - trace_printk("%s: return %d\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_enable); - -/** - * digital_cdc_rsc_mgr_hw_vote_disable - Disables hw vote in DSP - * - * @vote_handle: vote handle for which voting needs to be disabled - * - */ -void digital_cdc_rsc_mgr_hw_vote_disable(struct clk* vote_handle) -{ - if (!is_init_done || vote_handle == NULL) { - pr_err_ratelimited("%s: init failed or vote handle NULL\n", - __func__); - return; - } - - mutex_lock(&hw_vote_lock); - clk_disable_unprepare(vote_handle); - mutex_unlock(&hw_vote_lock); - trace_printk("%s\n", __func__); -} -EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_disable); - -/** - * digital_cdc_rsc_mgr_hw_vote_reset - Resets hw vote count - * - */ -void digital_cdc_rsc_mgr_hw_vote_reset(struct clk* vote_handle) -{ - int count = 0; - - if (!is_init_done || vote_handle == NULL) { - pr_err_ratelimited("%s: init failed or vote handle NULL\n", - __func__); - return; - } - - mutex_lock(&hw_vote_lock); - while (__clk_is_enabled(vote_handle)) { - clk_disable_unprepare(vote_handle); - count++; - } - pr_debug("%s: Vote count after SSR: %d\n", __func__, count); - trace_printk("%s: Vote count after SSR: %d\n", __func__, count); - - while (count--) - clk_prepare_enable(vote_handle); - mutex_unlock(&hw_vote_lock); -} -EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_reset); - -void digital_cdc_rsc_mgr_init() -{ - mutex_init(&hw_vote_lock); - is_init_done = true; -} - -void digital_cdc_rsc_mgr_exit() -{ - mutex_destroy(&hw_vote_lock); - is_init_done = false; -} diff --git a/techpack/audio/4.0/dsp/msm-audio-event-notify.c b/techpack/audio/4.0/dsp/msm-audio-event-notify.c deleted file mode 100644 index 06b4d3eaa732..000000000000 --- a/techpack/audio/4.0/dsp/msm-audio-event-notify.c +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ -#include -#include - -static ATOMIC_NOTIFIER_HEAD(msm_aud_evt_notifier_list); -static BLOCKING_NOTIFIER_HEAD(msm_aud_evt_blocking_notifier_list); - -/** - * msm_aud_evt_register_client - register a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_register_client(struct notifier_block *nb) -{ - return atomic_notifier_chain_register(&msm_aud_evt_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_register_client); - -/** - * msm_aud_evt_unregister_client - unregister a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_unregister_client(struct notifier_block *nb) -{ - return atomic_notifier_chain_unregister(&msm_aud_evt_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_unregister_client); - -/** - * msm_aud_evt_notifier_call_chain - notify clients of fb_events - * - */ -int msm_aud_evt_notifier_call_chain(unsigned long val, void *v) -{ - return atomic_notifier_call_chain(&msm_aud_evt_notifier_list, val, v); -} -EXPORT_SYMBOL_GPL(msm_aud_evt_notifier_call_chain); - -/** - * msm_aud_evt_blocking_register_client - register a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_blocking_register_client(struct notifier_block *nb) -{ - return blocking_notifier_chain_register( - &msm_aud_evt_blocking_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_blocking_register_client); - -/** - * msm_aud_evt_unregister_client - unregister a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_blocking_unregister_client(struct notifier_block *nb) -{ - return blocking_notifier_chain_unregister( - &msm_aud_evt_blocking_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_blocking_unregister_client); - -/** - * msm_aud_evt_notifier_call_chain - notify clients of fb_events - * @val: event or enum maintained by caller - * @v: private data pointer - * - */ -int msm_aud_evt_blocking_notifier_call_chain(unsigned long val, void *v) -{ - return blocking_notifier_call_chain( - &msm_aud_evt_blocking_notifier_list, val, v); -} -EXPORT_SYMBOL_GPL(msm_aud_evt_blocking_notifier_call_chain); diff --git a/techpack/audio/4.0/dsp/msm-dts-srs-tm-config.c b/techpack/audio/4.0/dsp/msm-dts-srs-tm-config.c deleted file mode 100644 index 9c503b90528d..000000000000 --- a/techpack/audio/4.0/dsp/msm-dts-srs-tm-config.c +++ /dev/null @@ -1,374 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2014, 2016-2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int srs_port_id[AFE_MAX_PORTS] = {-1}; -static int srs_copp_idx[AFE_MAX_PORTS] = {-1}; -static union srs_trumedia_params_u msm_srs_trumedia_params; -struct dma_buf *dma_buf; -static struct param_outband po; -static atomic_t ref_cnt; -#define ION_MEM_SIZE (8 * 1024) - -static int set_port_id(int port_id, int copp_idx) -{ - int index = adm_validate_and_get_port_index(port_id); - - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index, - port_id); - return -EINVAL; - } - srs_port_id[index] = port_id; - srs_copp_idx[index] = copp_idx; - return 0; -} - -static void msm_dts_srs_tm_send_params(__s32 port_id, __u32 techs) -{ - __s32 index = adm_validate_and_get_port_index(port_id); - - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id 0x%x\n", - __func__, index, port_id); - return; - } - if ((srs_copp_idx[index] < 0) || - (srs_copp_idx[index] >= MAX_COPPS_PER_PORT)) { - pr_debug("%s: send params called before copp open. so, caching\n", - __func__); - return; - } - pr_debug("SRS %s: called, port_id = %d, techs flags = %u\n", - __func__, port_id, techs); - /* force all if techs is set to 1 */ - if (techs == 1) - techs = 0xFFFFFFFF; - - if (techs & (1 << SRS_ID_WOWHD)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_WOWHD, - (void *)&msm_srs_trumedia_params.srs_params.wowhd); - if (techs & (1 << SRS_ID_CSHP)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_CSHP, - (void *)&msm_srs_trumedia_params.srs_params.cshp); - if (techs & (1 << SRS_ID_HPF)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_HPF, - (void *)&msm_srs_trumedia_params.srs_params.hpf); - if (techs & (1 << SRS_ID_AEQ)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_AEQ, - (void *)&msm_srs_trumedia_params.srs_params.aeq); - if (techs & (1 << SRS_ID_HL)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_HL, - (void *)&msm_srs_trumedia_params.srs_params.hl); - if (techs & (1 << SRS_ID_GEQ)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_GEQ, - (void *)&msm_srs_trumedia_params.srs_params.geq); - if (techs & (1 << SRS_ID_GLOBAL)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_GLOBAL, - (void *)&msm_srs_trumedia_params.srs_params.global); -} - - -static int msm_dts_srs_trumedia_control_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int msm_dts_srs_trumedia_control_set_(int port_id, - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - __u16 offset, value, max = sizeof(msm_srs_trumedia_params) >> 1; - - if (SRS_CMD_UPLOAD == - (ucontrol->value.integer.value[0] & SRS_CMD_UPLOAD)) { - __u32 techs = ucontrol->value.integer.value[0] & 0xFF; - __s32 index = adm_validate_and_get_port_index(port_id); - - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id 0x%x\n", - __func__, index, port_id); - return -EINVAL; - } - pr_debug("SRS %s: send params request, flag = %u\n", - __func__, techs); - if (srs_port_id[index] >= 0 && techs) - msm_dts_srs_tm_send_params(port_id, techs); - return 0; - } - offset = (__u16)((ucontrol->value.integer.value[0] & - SRS_PARAM_OFFSET_MASK) >> 16); - value = (__u16)(ucontrol->value.integer.value[0] & - SRS_PARAM_VALUE_MASK); - if (offset < max) { - msm_srs_trumedia_params.raw_params[offset] = value; - pr_debug("SRS %s: index set... (max %d, requested %d, value 0x%X)\n", - __func__, max, offset, value); - } else { - pr_err("SRS %s: index out of bounds! (max %d, requested %d)\n", - __func__, max, offset); - } - return 0; -} - -static int msm_dts_srs_trumedia_control_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control normal called\n"); - msm_dts_srs_acquire_lock(); - port_id = SLIMBUS_0_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static int msm_dts_srs_trumedia_control_i2s_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control I2S called\n"); - msm_dts_srs_acquire_lock(); - port_id = PRIMARY_I2S_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static int msm_dts_srs_trumedia_control_mi2s_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control MI2S called\n"); - msm_dts_srs_acquire_lock(); - port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static int msm_dts_srs_trumedia_control_hdmi_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control HDMI called\n"); - msm_dts_srs_acquire_lock(); - port_id = HDMI_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls[] = { - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - {.reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls_hdmi[] = { - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia HDMI", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_hdmi_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - {.reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls_i2s[] = { - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia I2S", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_i2s_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - {.reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls_mi2s[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia MI2S", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_mi2s_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - { - .reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -/** - * msm_dts_srs_tm_add_controls - - * Add DTS SRS module controls - * - * @platform: component to which controls can be registered - * - */ - -void msm_dts_srs_tm_add_controls(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls, - ARRAY_SIZE(lpa_srs_trumedia_controls)); - - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls_hdmi, - ARRAY_SIZE(lpa_srs_trumedia_controls_hdmi)); - - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls_i2s, - ARRAY_SIZE(lpa_srs_trumedia_controls_i2s)); - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls_mi2s, - ARRAY_SIZE(lpa_srs_trumedia_controls_mi2s)); -} -EXPORT_SYMBOL(msm_dts_srs_tm_add_controls); - -static int reg_ion_mem(void) -{ - int rc; - - rc = msm_audio_ion_alloc(&dma_buf, ION_MEM_SIZE, - &po.paddr, (size_t *)&po.size, - &po.kvaddr); - if (rc != 0) - pr_err("%s: failed to allocate memory.\n", __func__); - pr_debug("%s: exited dma_buf = %pK, phys_addr = %lu, length = %d, vaddr = %pK, rc = 0x%x\n", - __func__, dma_buf, (long)po.paddr, - (unsigned int)po.size, po.kvaddr, rc); - return rc; -} - -void msm_dts_srs_tm_ion_memmap(struct param_outband *po_) -{ - if (po.kvaddr == NULL) { - pr_debug("%s: callingreg_ion_mem()\n", __func__); - reg_ion_mem(); - } - po_->size = ION_MEM_SIZE; - po_->kvaddr = po.kvaddr; - po_->paddr = po.paddr; -} - -static void unreg_ion_mem(void) -{ - msm_audio_ion_free(dma_buf); - dma_buf = NULL; - po.kvaddr = NULL; - po.paddr = 0; - po.size = 0; -} - -/** - * msm_dts_srs_tm_deinit - - * De-Initializes DTS SRS module - * - * @port_id: Port ID number - * - */ -void msm_dts_srs_tm_deinit(int port_id) -{ - set_port_id(port_id, -1); - atomic_dec(&ref_cnt); - if (po.kvaddr != NULL) { - if (!atomic_read(&ref_cnt)) { - pr_debug("%s: calling unreg_ion_mem()\n", __func__); - unreg_ion_mem(); - } - } -} -EXPORT_SYMBOL(msm_dts_srs_tm_deinit); - -/** - * msm_dts_srs_tm_init - - * Initializes DTS SRS module - * - * @port_id: Port ID number - * @copp_idx: COPP index - * - */ -void msm_dts_srs_tm_init(int port_id, int copp_idx) -{ - int cur_ref_cnt = 0; - - if (set_port_id(port_id, copp_idx) < 0) { - pr_err("%s: Invalid port_id: %d\n", __func__, port_id); - return; - } - - cur_ref_cnt = atomic_read(&ref_cnt); - atomic_inc(&ref_cnt); - if (!cur_ref_cnt && po.kvaddr == NULL) { - pr_debug("%s: calling reg_ion_mem()\n", __func__); - if (reg_ion_mem() != 0) { - atomic_dec(&ref_cnt); - po.kvaddr = NULL; - return; - } - } - msm_dts_srs_tm_send_params(port_id, 1); -} -EXPORT_SYMBOL(msm_dts_srs_tm_init); diff --git a/techpack/audio/4.0/dsp/msm_audio_ion.c b/techpack/audio/4.0/dsp/msm_audio_ion.c deleted file mode 100644 index 056d540134a9..000000000000 --- a/techpack/audio/4.0/dsp/msm_audio_ion.c +++ /dev/null @@ -1,872 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MSM_AUDIO_ION_PROBED (1 << 0) - -#define MSM_AUDIO_ION_PHYS_ADDR(alloc_data) \ - alloc_data->table->sgl->dma_address - -#define MSM_AUDIO_ION_VA_START 0x10000000 -#define MSM_AUDIO_ION_VA_LEN 0x0FFFFFFF - -#define MSM_AUDIO_SMMU_SID_OFFSET 32 - -struct msm_audio_ion_private { - bool smmu_enabled; - struct device *cb_dev; - struct dma_iommu_mapping *mapping; - u8 device_status; - struct list_head alloc_list; - struct mutex list_mutex; - u64 smmu_sid_bits; - u32 smmu_version; - u32 iova_start_addr; -}; - -struct msm_audio_alloc_data { - size_t len; - void *vaddr; - struct dma_buf *dma_buf; - struct dma_buf_attachment *attach; - struct sg_table *table; - struct list_head list; -}; - -static struct msm_audio_ion_private msm_audio_ion_data = {0,}; - -static void msm_audio_ion_add_allocation( - struct msm_audio_ion_private *msm_audio_ion_data, - struct msm_audio_alloc_data *alloc_data) -{ - /* - * Since these APIs can be invoked by multiple - * clients, there is need to make sure the list - * of allocations is always protected - */ - mutex_lock(&(msm_audio_ion_data->list_mutex)); - list_add_tail(&(alloc_data->list), - &(msm_audio_ion_data->alloc_list)); - mutex_unlock(&(msm_audio_ion_data->list_mutex)); -} - -static int msm_audio_dma_buf_map(struct dma_buf *dma_buf, - dma_addr_t *addr, size_t *len) -{ - - struct msm_audio_alloc_data *alloc_data; - struct device *cb_dev; - unsigned long ionflag = 0; - int rc = 0; - - cb_dev = msm_audio_ion_data.cb_dev; - - /* Data required per buffer mapping */ - alloc_data = kzalloc(sizeof(*alloc_data), GFP_KERNEL); - if (!alloc_data) - return -ENOMEM; - - alloc_data->dma_buf = dma_buf; - alloc_data->len = dma_buf->size; - *len = dma_buf->size; - - /* Attach the dma_buf to context bank device */ - alloc_data->attach = dma_buf_attach(alloc_data->dma_buf, - cb_dev); - if (IS_ERR(alloc_data->attach)) { - rc = PTR_ERR(alloc_data->attach); - dev_err(cb_dev, - "%s: Fail to attach dma_buf to CB, rc = %d\n", - __func__, rc); - goto free_alloc_data; - } - - /* For uncached buffers, avoid cache maintanance */ - rc = dma_buf_get_flags(alloc_data->dma_buf, &ionflag); - if (rc) { - dev_err(cb_dev, "%s: dma_buf_get_flags failed: %d\n", - __func__, rc); - goto detach_dma_buf; - } - - if (!(ionflag & ION_FLAG_CACHED)) - alloc_data->attach->dma_map_attrs |= DMA_ATTR_SKIP_CPU_SYNC; - - /* - * Get the scatter-gather list. - * There is no info as this is a write buffer or - * read buffer, hence the request is bi-directional - * to accommodate both read and write mappings. - */ - alloc_data->table = dma_buf_map_attachment(alloc_data->attach, - DMA_BIDIRECTIONAL); - if (IS_ERR(alloc_data->table)) { - rc = PTR_ERR(alloc_data->table); - dev_err(cb_dev, - "%s: Fail to map attachment, rc = %d\n", - __func__, rc); - goto detach_dma_buf; - } - - /* physical address from mapping */ - *addr = MSM_AUDIO_ION_PHYS_ADDR(alloc_data); - - msm_audio_ion_add_allocation(&msm_audio_ion_data, - alloc_data); - return rc; - -detach_dma_buf: - dma_buf_detach(alloc_data->dma_buf, - alloc_data->attach); -free_alloc_data: - kfree(alloc_data); - - return rc; -} - -static int msm_audio_dma_buf_unmap(struct dma_buf *dma_buf) -{ - int rc = 0; - struct msm_audio_alloc_data *alloc_data = NULL; - struct list_head *ptr, *next; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - bool found = false; - - /* - * Though list_for_each_safe is delete safe, lock - * should be explicitly acquired to avoid race condition - * on adding elements to the list. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_safe(ptr, next, - &(msm_audio_ion_data.alloc_list)) { - - alloc_data = list_entry(ptr, struct msm_audio_alloc_data, - list); - - if (alloc_data->dma_buf == dma_buf) { - found = true; - dma_buf_unmap_attachment(alloc_data->attach, - alloc_data->table, - DMA_BIDIRECTIONAL); - - dma_buf_detach(alloc_data->dma_buf, - alloc_data->attach); - - dma_buf_put(alloc_data->dma_buf); - - list_del(&(alloc_data->list)); - kfree(alloc_data); - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - dev_err(cb_dev, - "%s: cannot find allocation, dma_buf %pK", - __func__, dma_buf); - rc = -EINVAL; - } - - return rc; -} - -static int msm_audio_ion_get_phys(struct dma_buf *dma_buf, - dma_addr_t *addr, size_t *len) -{ - int rc = 0; - - rc = msm_audio_dma_buf_map(dma_buf, addr, len); - if (rc) { - pr_err("%s: failed to map DMA buf, err = %d\n", - __func__, rc); - goto err; - } - if (msm_audio_ion_data.smmu_enabled) { - /* Append the SMMU SID information to the IOVA address */ - *addr |= msm_audio_ion_data.smmu_sid_bits; - } - - pr_debug("phys=%pK, len=%zd, rc=%d\n", &(*addr), *len, rc); -err: - return rc; -} - -int msm_audio_ion_get_smmu_info(struct device **cb_dev, - u64 *smmu_sid) -{ - if (!cb_dev || !smmu_sid) { - pr_err("%s: Invalid params\n", - __func__); - return -EINVAL; - } - - if (!msm_audio_ion_data.cb_dev || - !msm_audio_ion_data.smmu_sid_bits) { - pr_err("%s: Params not initialized\n", - __func__); - return -EINVAL; - } - - *cb_dev = msm_audio_ion_data.cb_dev; - *smmu_sid = msm_audio_ion_data.smmu_sid_bits; - - return 0; -} - -static void *msm_audio_ion_map_kernel(struct dma_buf *dma_buf) -{ - int rc = 0; - void *addr = NULL; - struct msm_audio_alloc_data *alloc_data = NULL; - - rc = dma_buf_begin_cpu_access(dma_buf, DMA_BIDIRECTIONAL); - if (rc) { - pr_err("%s: kmap dma_buf_begin_cpu_access fail\n", __func__); - goto exit; - } - - addr = dma_buf_vmap(dma_buf); - if (!addr) { - pr_err("%s: kernel mapping of dma_buf failed\n", - __func__); - goto exit; - } - - /* - * TBD: remove the below section once new API - * for mapping kernel virtual address is available. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->dma_buf == dma_buf) { - alloc_data->vaddr = addr; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - -exit: - return addr; -} - -static int msm_audio_ion_unmap_kernel(struct dma_buf *dma_buf) -{ - int rc = 0; - void *vaddr = NULL; - struct msm_audio_alloc_data *alloc_data = NULL; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - /* - * TBD: remove the below section once new API - * for unmapping kernel virtual address is available. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->dma_buf == dma_buf) { - vaddr = alloc_data->vaddr; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!vaddr) { - dev_err(cb_dev, - "%s: cannot find allocation for dma_buf %pK", - __func__, dma_buf); - rc = -EINVAL; - goto err; - } - - dma_buf_vunmap(dma_buf, vaddr); - - rc = dma_buf_end_cpu_access(dma_buf, DMA_BIDIRECTIONAL); - if (rc) { - dev_err(cb_dev, "%s: kmap dma_buf_end_cpu_access fail\n", - __func__); - goto err; - } - -err: - return rc; -} - -static int msm_audio_ion_map_buf(struct dma_buf *dma_buf, dma_addr_t *paddr, - size_t *plen, void **vaddr) -{ - int rc = 0; - - rc = msm_audio_ion_get_phys(dma_buf, paddr, plen); - if (rc) { - pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", - __func__, rc); - dma_buf_put(dma_buf); - goto err; - } - - *vaddr = msm_audio_ion_map_kernel(dma_buf); - if (IS_ERR_OR_NULL(*vaddr)) { - pr_err("%s: ION memory mapping for AUDIO failed\n", __func__); - rc = -ENOMEM; - msm_audio_dma_buf_unmap(dma_buf); - goto err; - } - -err: - return rc; -} - -static u32 msm_audio_ion_get_smmu_sid_mode32(void) -{ - if (msm_audio_ion_data.smmu_enabled) - return upper_32_bits(msm_audio_ion_data.smmu_sid_bits); - else - return 0; -} - -/** - * msm_audio_ion_alloc - - * Allocs ION memory for given client name - * - * @dma_buf: dma_buf for the ION memory - * @bufsz: buffer size - * @paddr: Physical address to be assigned with allocated region - * @plen: length of allocated region to be assigned - * vaddr: virtual address to be assigned - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz, - dma_addr_t *paddr, size_t *plen, void **vaddr) -{ - int rc = -EINVAL; - unsigned long err_ion_ptr = 0; - - if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) { - pr_debug("%s:probe is not done, deferred\n", __func__); - return -EPROBE_DEFER; - } - if (!dma_buf || !paddr || !vaddr || !bufsz || !plen) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - if (msm_audio_ion_data.smmu_enabled == true) { - pr_debug("%s: system heap is used\n", __func__); - *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_SYSTEM_HEAP_ID), 0); - } else { - pr_debug("%s: audio heap is used\n", __func__); - *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - } - if (IS_ERR_OR_NULL((void *)(*dma_buf))) { - if (IS_ERR((void *)(*dma_buf))) - err_ion_ptr = PTR_ERR((int *)(*dma_buf)); - pr_err("%s: ION alloc fail err ptr=%ld, smmu_enabled=%d\n", - __func__, err_ion_ptr, msm_audio_ion_data.smmu_enabled); - rc = -ENOMEM; - goto err; - } - - rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr); - if (rc) { - pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); - goto err; - } - pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, - *vaddr, bufsz); - - memset(*vaddr, 0, bufsz); - -err: - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_alloc); - -/** - * msm_audio_ion_dma_map - - * Memory maps for a given DMA buffer - * - * @phys_addr: Physical address of DMA buffer to be mapped - * @iova_base: IOVA address of memory mapped DMA buffer - * @size: buffer size - * @dir: DMA direction - * Returns 0 on success or error on failure - */ -int msm_audio_ion_dma_map(dma_addr_t *phys_addr, dma_addr_t *iova_base, - u32 size, enum dma_data_direction dir) -{ - dma_addr_t iova; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - if (!phys_addr || !iova_base || !size) - return -EINVAL; - - iova = dma_map_resource(cb_dev, *phys_addr, size, - dir, 0); - if (dma_mapping_error(cb_dev, iova)) { - pr_err("%s: dma_mapping_error\n", __func__); - return -EIO; - } - pr_debug("%s: dma_mapping_success iova:0x%lx\n", __func__, - (unsigned long)iova); - if (msm_audio_ion_data.smmu_enabled) - /* Append the SMMU SID information to the IOVA address */ - iova |= msm_audio_ion_data.smmu_sid_bits; - - *iova_base = iova; - - return 0; -} -EXPORT_SYMBOL(msm_audio_ion_dma_map); - -/** - * msm_audio_ion_import- - * Import ION buffer with given file descriptor - * - * @dma_buf: dma_buf for the ION memory - * @fd: file descriptor for the ION memory - * @ionflag: flags associated with ION buffer - * @bufsz: buffer size - * @paddr: Physical address to be assigned with allocated region - * @plen: length of allocated region to be assigned - * vaddr: virtual address to be assigned - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_import(struct dma_buf **dma_buf, int fd, - unsigned long *ionflag, size_t bufsz, - dma_addr_t *paddr, size_t *plen, void **vaddr) -{ - int rc = 0; - - if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) { - pr_debug("%s: probe is not done, deferred\n", __func__); - return -EPROBE_DEFER; - } - - if (!dma_buf || !paddr || !vaddr || !plen) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - /* bufsz should be 0 and fd shouldn't be 0 as of now */ - *dma_buf = dma_buf_get(fd); - pr_debug("%s: dma_buf =%pK, fd=%d\n", __func__, *dma_buf, fd); - if (IS_ERR_OR_NULL((void *)(*dma_buf))) { - pr_err("%s: dma_buf_get failed\n", __func__); - rc = -EINVAL; - goto err; - } - - if (ionflag != NULL) { - rc = dma_buf_get_flags(*dma_buf, ionflag); - if (rc) { - pr_err("%s: could not get flags for the dma_buf\n", - __func__); - goto err_ion_flag; - } - } - - rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr); - if (rc) { - pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); - goto err; - } - pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, - *vaddr, bufsz); - - return 0; - -err_ion_flag: - dma_buf_put(*dma_buf); -err: - *dma_buf = NULL; - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_import); - -/** - * msm_audio_ion_free - - * fress ION memory for given client and handle - * - * @dma_buf: dma_buf for the ION memory - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_free(struct dma_buf *dma_buf) -{ - int ret = 0; - - if (!dma_buf) { - pr_err("%s: dma_buf invalid\n", __func__); - return -EINVAL; - } - - ret = msm_audio_ion_unmap_kernel(dma_buf); - if (ret) - return ret; - - msm_audio_dma_buf_unmap(dma_buf); - - return 0; -} -EXPORT_SYMBOL(msm_audio_ion_free); - -/** - * msm_audio_ion_mmap - - * Audio ION memory map - * - * @abuff: audio buf pointer - * @vma: virtual mem area - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_mmap(struct audio_buffer *abuff, - struct vm_area_struct *vma) -{ - struct msm_audio_alloc_data *alloc_data = NULL; - struct sg_table *table; - unsigned long addr = vma->vm_start; - unsigned long offset = vma->vm_pgoff * PAGE_SIZE; - struct scatterlist *sg; - unsigned int i; - struct page *page; - int ret = 0; - bool found = false; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->dma_buf == abuff->dma_buf) { - found = true; - table = alloc_data->table; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - dev_err(cb_dev, - "%s: cannot find allocation, dma_buf %pK", - __func__, abuff->dma_buf); - return -EINVAL; - } - /* uncached */ - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - - /* We need to check if a page is associated with this sg list because: - * If the allocation came from a carveout we currently don't have - * pages associated with carved out memory. This might change in the - * future and we can remove this check and the else statement. - */ - page = sg_page(table->sgl); - if (page) { - pr_debug("%s: page is NOT null\n", __func__); - for_each_sg(table->sgl, sg, table->nents, i) { - unsigned long remainder = vma->vm_end - addr; - unsigned long len = sg->length; - - page = sg_page(sg); - - if (offset >= len) { - offset -= len; - continue; - } else if (offset) { - page += offset / PAGE_SIZE; - len -= offset; - offset = 0; - } - len = min(len, remainder); - pr_debug("vma=%pK, addr=%x len=%ld vm_start=%x vm_end=%x vm_page_prot=%lu\n", - vma, (unsigned int)addr, len, - (unsigned int)vma->vm_start, - (unsigned int)vma->vm_end, - (unsigned long)pgprot_val(vma->vm_page_prot)); - remap_pfn_range(vma, addr, page_to_pfn(page), len, - vma->vm_page_prot); - addr += len; - if (addr >= vma->vm_end) - return 0; - } - } else { - pr_debug("%s: page is NULL\n", __func__); - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(msm_audio_ion_mmap); - -/** - * msm_audio_ion_cache_operations- - * Cache operations on cached Audio ION buffers - * - * @abuff: audio buf pointer - * @cache_op: cache operation to be performed - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_cache_operations(struct audio_buffer *abuff, int cache_op) -{ - unsigned long ionflag = 0; - int rc = 0; - - if (!abuff) { - pr_err("%s: Invalid params: %pK\n", __func__, abuff); - return -EINVAL; - } - rc = dma_buf_get_flags(abuff->dma_buf, &ionflag); - if (rc) { - pr_err("%s: dma_buf_get_flags failed: %d\n", __func__, rc); - goto cache_op_failed; - } - - /* Has to be CACHED */ - if (ionflag & ION_FLAG_CACHED) { - /* MSM_AUDIO_ION_INV_CACHES or MSM_AUDIO_ION_CLEAN_CACHES */ - switch (cache_op) { - case MSM_AUDIO_ION_INV_CACHES: - case MSM_AUDIO_ION_CLEAN_CACHES: - dma_buf_begin_cpu_access(abuff->dma_buf, - DMA_BIDIRECTIONAL); - dma_buf_end_cpu_access(abuff->dma_buf, - DMA_BIDIRECTIONAL); - break; - default: - pr_err("%s: Invalid cache operation %d\n", - __func__, cache_op); - } - } else { - pr_err("%s: Cache ops called on uncached buffer: %pK\n", - __func__, abuff->dma_buf); - rc = -EINVAL; - } - -cache_op_failed: - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_cache_operations); - -/** - * msm_audio_populate_upper_32_bits - - * retrieve upper 32bits of 64bit address - * - * @pa: 64bit physical address - * - */ -u32 msm_audio_populate_upper_32_bits(dma_addr_t pa) -{ - if (sizeof(dma_addr_t) == sizeof(u32)) - return msm_audio_ion_get_smmu_sid_mode32(); - else - return upper_32_bits(pa); -} -EXPORT_SYMBOL(msm_audio_populate_upper_32_bits); - -static int msm_audio_smmu_init(struct device *dev) -{ - struct dma_iommu_mapping *mapping; - int ret; - - mapping = arm_iommu_create_mapping(&platform_bus_type, - msm_audio_ion_data.iova_start_addr, - MSM_AUDIO_ION_VA_LEN); - if (IS_ERR(mapping)) - return PTR_ERR(mapping); - - ret = arm_iommu_attach_device(dev, mapping); - if (ret) { - dev_err(dev, "%s: Attach failed, err = %d\n", - __func__, ret); - goto fail_attach; - } - - msm_audio_ion_data.mapping = mapping; - INIT_LIST_HEAD(&msm_audio_ion_data.alloc_list); - mutex_init(&(msm_audio_ion_data.list_mutex)); - - return 0; - -fail_attach: - arm_iommu_release_mapping(mapping); - return ret; -} - -static const struct of_device_id msm_audio_ion_dt_match[] = { - { .compatible = "qcom,msm-audio-ion" }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_audio_ion_dt_match); - -static int msm_audio_ion_probe(struct platform_device *pdev) -{ - int rc = 0; - u64 smmu_sid = 0; - u64 smmu_sid_mask = 0; - const char *msm_audio_ion_dt = "qcom,smmu-enabled"; - const char *msm_audio_ion_smmu = "qcom,smmu-version"; - const char *msm_audio_ion_iova_start_addr = "qcom,iova-start-addr"; - const char *msm_audio_ion_smmu_sid_mask = "qcom,smmu-sid-mask"; - bool smmu_enabled; - enum apr_subsys_state q6_state; - struct device *dev = &pdev->dev; - struct of_phandle_args iommuspec; - - - if (dev->of_node == NULL) { - dev_err(dev, - "%s: device tree is not found\n", - __func__); - msm_audio_ion_data.smmu_enabled = 0; - return 0; - } - - smmu_enabled = of_property_read_bool(dev->of_node, - msm_audio_ion_dt); - msm_audio_ion_data.smmu_enabled = smmu_enabled; - - if (!smmu_enabled) { - dev_dbg(dev, "%s: SMMU is Disabled\n", __func__); - goto exit; - } - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - dev_dbg(dev, - "defering %s, adsp_state %d\n", - __func__, q6_state); - return -EPROBE_DEFER; - } - dev_dbg(dev, "%s: adsp is ready\n", __func__); - - rc = of_property_read_u32(dev->of_node, - msm_audio_ion_smmu, - &msm_audio_ion_data.smmu_version); - if (rc) { - dev_err(dev, - "%s: qcom,smmu_version missing in DT node\n", - __func__); - return rc; - } - dev_dbg(dev, "%s: SMMU is Enabled. SMMU version is (%d)", - __func__, msm_audio_ion_data.smmu_version); - - rc = of_property_read_u32(dev->of_node, - msm_audio_ion_iova_start_addr, - &msm_audio_ion_data.iova_start_addr); - if (rc) { - dev_dbg(dev, - "%s: qcom,iova_start_addr missing in DT node, initialize with default val\n", - __func__); - msm_audio_ion_data.iova_start_addr = MSM_AUDIO_ION_VA_START; - } else { - dev_dbg(dev, "%s:IOVA start addr: 0x%x\n", - __func__, msm_audio_ion_data.iova_start_addr); - } - /* Get SMMU SID information from Devicetree */ - rc = of_property_read_u64(dev->of_node, - msm_audio_ion_smmu_sid_mask, - &smmu_sid_mask); - if (rc) { - dev_err(dev, - "%s: qcom,smmu-sid-mask missing in DT node, using default\n", - __func__); - smmu_sid_mask = 0xFFFFFFFFFFFFFFFF; - } - - rc = of_parse_phandle_with_args(dev->of_node, "iommus", - "#iommu-cells", 0, &iommuspec); - if (rc) - dev_err(dev, "%s: could not get smmu SID, ret = %d\n", - __func__, rc); - else - smmu_sid = (iommuspec.args[0] & smmu_sid_mask); - - msm_audio_ion_data.smmu_sid_bits = - smmu_sid << MSM_AUDIO_SMMU_SID_OFFSET; - - if (msm_audio_ion_data.smmu_version == 0x2) { - rc = msm_audio_smmu_init(dev); - } else { - dev_err(dev, "%s: smmu version invalid %d\n", - __func__, msm_audio_ion_data.smmu_version); - rc = -EINVAL; - } - if (rc) - dev_err(dev, "%s: smmu init failed, err = %d\n", - __func__, rc); - -exit: - if (!rc) - msm_audio_ion_data.device_status |= MSM_AUDIO_ION_PROBED; - - msm_audio_ion_data.cb_dev = dev; - - return rc; -} - -static int msm_audio_ion_remove(struct platform_device *pdev) -{ - struct dma_iommu_mapping *mapping; - struct device *audio_cb_dev; - - mapping = msm_audio_ion_data.mapping; - audio_cb_dev = msm_audio_ion_data.cb_dev; - - if (audio_cb_dev && mapping) { - arm_iommu_detach_device(audio_cb_dev); - arm_iommu_release_mapping(mapping); - } - - msm_audio_ion_data.smmu_enabled = 0; - msm_audio_ion_data.device_status = 0; - return 0; -} - -static struct platform_driver msm_audio_ion_driver = { - .driver = { - .name = "msm-audio-ion", - .owner = THIS_MODULE, - .of_match_table = msm_audio_ion_dt_match, - .suppress_bind_attrs = true, - }, - .probe = msm_audio_ion_probe, - .remove = msm_audio_ion_remove, -}; - -int __init msm_audio_ion_init(void) -{ - return platform_driver_register(&msm_audio_ion_driver); -} - -void msm_audio_ion_exit(void) -{ - platform_driver_unregister(&msm_audio_ion_driver); -} - -MODULE_DESCRIPTION("MSM Audio ION module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/msm_audio_ion_vm.c b/techpack/audio/4.0/dsp/msm_audio_ion_vm.c deleted file mode 100644 index a84403750574..000000000000 --- a/techpack/audio/4.0/dsp/msm_audio_ion_vm.c +++ /dev/null @@ -1,961 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MSM_AUDIO_ION_PROBED (1 << 0) - -#define MSM_AUDIO_ION_PHYS_ADDR(alloc_data) \ - alloc_data->table->sgl->dma_address - -#define MSM_AUDIO_SMMU_VM_CMD_MAP 0x00000001 -#define MSM_AUDIO_SMMU_VM_CMD_UNMAP 0x00000002 -#define MSM_AUDIO_SMMU_VM_HAB_MINOR_ID 1 - -enum msm_audio_mem_type{ - MSM_AUDIO_MEM_TYPE_ION, - MSM_AUDIO_MEM_TYPE_DMA, -}; - -struct msm_audio_ion_private { - bool smmu_enabled; - struct device *cb_dev; - u8 device_status; - struct list_head alloc_list; - struct mutex list_mutex; -}; - -struct msm_audio_alloc_data { - size_t len; - void *vaddr; - void *handle; - struct dma_buf_attachment *attach; - struct sg_table *table; - struct list_head list; - dma_addr_t *paddr; - enum msm_audio_mem_type type; - u32 export_id; -}; - -struct msm_audio_smmu_vm_map_cmd { - int cmd_id; - u32 export_id; - u32 buf_size; -}; - -struct msm_audio_smmu_vm_map_cmd_rsp { - int status; - u64 addr; -}; - -struct msm_audio_smmu_vm_unmap_cmd { - int cmd_id; - u32 export_id; -}; - -struct msm_audio_smmu_vm_unmap_cmd_rsp { - int status; -}; - -static struct msm_audio_ion_private msm_audio_ion_data = {0,}; -static u32 msm_audio_ion_hab_handle; - -static void msm_audio_ion_add_allocation( - struct msm_audio_ion_private *msm_audio_ion_data, - struct msm_audio_alloc_data *alloc_data) -{ - /* - * Since these APIs can be invoked by multiple - * clients, there is need to make sure the list - * of allocations is always protected - */ - mutex_lock(&(msm_audio_ion_data->list_mutex)); - list_add_tail(&(alloc_data->list), - &(msm_audio_ion_data->alloc_list)); - mutex_unlock(&(msm_audio_ion_data->list_mutex)); -} - -static int msm_audio_dma_buf_map(void *handle, void *vaddr, - dma_addr_t *paddr, - size_t *len) -{ - struct msm_audio_alloc_data *alloc_data; - - /* Data required per buffer mapping */ - alloc_data = kzalloc(sizeof(*alloc_data), GFP_KERNEL); - if (!alloc_data) - return -ENOMEM; - - alloc_data->handle = handle; - alloc_data->len = *len; - alloc_data->vaddr = vaddr; - alloc_data->paddr = paddr; - alloc_data->type = MSM_AUDIO_MEM_TYPE_DMA; - - msm_audio_ion_add_allocation(&msm_audio_ion_data, - alloc_data); - - return 0; -} - -static int msm_audio_ion_dma_buf_map(struct dma_buf *dma_buf, - dma_addr_t *addr, size_t *len) -{ - - struct msm_audio_alloc_data *alloc_data; - struct device *cb_dev; - unsigned long ionflag = 0; - int rc = 0; - - cb_dev = msm_audio_ion_data.cb_dev; - - /* Data required per buffer mapping */ - alloc_data = kzalloc(sizeof(*alloc_data), GFP_KERNEL); - if (!alloc_data) - return -ENOMEM; - - alloc_data->handle = (void*)dma_buf; - alloc_data->len = dma_buf->size; - alloc_data->type = MSM_AUDIO_MEM_TYPE_ION; - *len = dma_buf->size; - - /* Attach the dma_buf to context bank device */ - alloc_data->attach = dma_buf_attach(dma_buf, cb_dev); - if (IS_ERR(alloc_data->attach)) { - rc = PTR_ERR(alloc_data->attach); - dev_err(cb_dev, - "%s: Fail to attach dma_buf to CB, rc = %d\n", - __func__, rc); - goto free_alloc_data; - } - - /* For uncached buffers, avoid cache maintanance */ - rc = dma_buf_get_flags(dma_buf, &ionflag); - if (rc) { - dev_err(cb_dev, "%s: dma_buf_get_flags failed: %d\n", - __func__, rc); - goto detach_dma_buf; - } - - if (!(ionflag & ION_FLAG_CACHED)) - alloc_data->attach->dma_map_attrs |= DMA_ATTR_SKIP_CPU_SYNC; - - /* - * Get the scatter-gather list. - * There is no info as this is a write buffer or - * read buffer, hence the request is bi-directional - * to accommodate both read and write mappings. - */ - alloc_data->table = dma_buf_map_attachment(alloc_data->attach, - DMA_BIDIRECTIONAL); - if (IS_ERR(alloc_data->table)) { - rc = PTR_ERR(alloc_data->table); - dev_err(cb_dev, - "%s: Fail to map attachment, rc = %d\n", - __func__, rc); - goto detach_dma_buf; - } - - /* physical address from mapping */ - *addr = MSM_AUDIO_ION_PHYS_ADDR(alloc_data); - alloc_data->paddr = addr; - msm_audio_ion_add_allocation(&msm_audio_ion_data, - alloc_data); - return rc; - -detach_dma_buf: - dma_buf_detach(dma_buf, alloc_data->attach); -free_alloc_data: - kfree(alloc_data); - - return rc; -} - -static int msm_audio_ion_unmap_kernel(void *vaddr, void *handle) -{ - int rc = 0; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - if (!vaddr) { - dev_err(cb_dev, - "%s: cannot find allocation for handle %pK\n", - __func__, handle); - rc = -EINVAL; - goto err; - } - - dma_buf_vunmap((struct dma_buf*)handle, vaddr); - - rc = dma_buf_end_cpu_access((struct dma_buf*)handle, DMA_BIDIRECTIONAL); - if (rc) { - dev_err(cb_dev, "%s: kmap dma_buf_end_cpu_access fail\n", - __func__); - goto err; - } - -err: - return rc; -} - -static int msm_audio_dma_buf_unmap(void *handle) -{ - int rc = 0; - struct msm_audio_alloc_data *alloc_data = NULL; - struct list_head *ptr, *next; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - bool found = false; - - /* - * Though list_for_each_safe is delete safe, lock - * should be explicitly acquired to avoid race condition - * on adding elements to the list. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_safe(ptr, next, &(msm_audio_ion_data.alloc_list)) { - - alloc_data = list_entry(ptr, struct msm_audio_alloc_data, list); - if(alloc_data->type == MSM_AUDIO_MEM_TYPE_ION) { - if (alloc_data->handle == handle) { - rc = msm_audio_ion_unmap_kernel( - alloc_data->vaddr, - handle); - if(rc) { - pr_err("%s: Unable to unmap ion mem rc: %d\n", - __func__, rc); - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - return rc; - } - - found = true; - dma_buf_unmap_attachment(alloc_data->attach, - alloc_data->table, - DMA_BIDIRECTIONAL); - - dma_buf_detach((struct dma_buf*) - alloc_data->handle, - alloc_data->attach); - - dma_buf_put((struct dma_buf*) - alloc_data->handle); - - list_del(&(alloc_data->list)); - kfree(alloc_data); - break; - } - } else { - alloc_data = list_entry(ptr, - struct msm_audio_alloc_data, - list); - - if (alloc_data->handle == handle) { - found = true; - - dma_free_coherent(cb_dev, alloc_data->len, - alloc_data->vaddr, - *(alloc_data->paddr)); - - list_del(&(alloc_data->list)); - kfree(alloc_data); - break; - } - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - dev_err(cb_dev, - "%s: cannot find allocation, handle %pK", - __func__, handle); - rc = -EINVAL; - } - - return rc; -} - -static int msm_audio_ion_smmu_map(void *handle, - dma_addr_t *paddr, size_t *len) -{ - int rc; - u32 export_id; - u32 cmd_rsp_size; - bool found = false; - bool exported = false; - struct msm_audio_smmu_vm_map_cmd smmu_map_cmd; - struct msm_audio_smmu_vm_map_cmd_rsp cmd_rsp; - struct msm_audio_alloc_data *alloc_data = NULL; - unsigned long delay = jiffies + (HZ / 2); - void *vaddr; - - *len = ((struct dma_buf*)handle)->size; - - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->handle == handle) { - found = true; - vaddr = alloc_data->vaddr; - - /* Export the buffer to physical VM */ - rc = habmm_export(msm_audio_ion_hab_handle, vaddr, *len, - &export_id, 0); - if (rc) { - pr_err("%s: habmm_export failed vaddr = %pK, len = %zd, rc = %d\n", - __func__, vaddr, *len, rc); - goto err; - } - - exported = true; - smmu_map_cmd.cmd_id = MSM_AUDIO_SMMU_VM_CMD_MAP; - smmu_map_cmd.export_id = export_id; - smmu_map_cmd.buf_size = *len; - - rc = habmm_socket_send(msm_audio_ion_hab_handle, - (void *)&smmu_map_cmd, sizeof(smmu_map_cmd), 0); - if (rc) { - pr_err("%s: habmm_socket_send failed %d\n", - __func__, rc); - goto err; - } - - do { - cmd_rsp_size = sizeof(cmd_rsp); - rc = habmm_socket_recv(msm_audio_ion_hab_handle, - (void *)&cmd_rsp, - &cmd_rsp_size, - 0xFFFFFFFF, - 0); - } while (time_before(jiffies, delay) && (rc == -EINTR) && - (cmd_rsp_size == 0)); - if (rc) { - pr_err("%s: habmm_socket_recv failed %d\n", - __func__, rc); - goto err; - } - - if (cmd_rsp_size != sizeof(cmd_rsp)) { - pr_err("%s: invalid size for cmd rsp %u, expected %zu\n", - __func__, cmd_rsp_size, sizeof(cmd_rsp)); - rc = -EIO; - goto err; - } - - if (cmd_rsp.status) { - pr_err("%s: SMMU map command failed %d\n", - __func__, cmd_rsp.status); - rc = cmd_rsp.status; - goto err; - } - - *paddr = (dma_addr_t)cmd_rsp.addr; - alloc_data->export_id = export_id; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - pr_err("%s: cannot find allocation, handle %pK\n", __func__, handle); - return -EINVAL; - } - - return 0; - -err: - if (exported) - (void)habmm_unexport(msm_audio_ion_hab_handle, export_id, 0); - - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - return rc; -} - -static int msm_audio_ion_smmu_unmap(void *handle) -{ - int rc; - bool found = false; - u32 cmd_rsp_size; - struct msm_audio_smmu_vm_unmap_cmd smmu_unmap_cmd; - struct msm_audio_smmu_vm_unmap_cmd_rsp cmd_rsp; - struct msm_audio_alloc_data *alloc_data, *next; - unsigned long delay = jiffies + (HZ / 2); - - /* - * Though list_for_each_entry_safe is delete safe, lock - * should be explicitly acquired to avoid race condition - * on adding elements to the list. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry_safe(alloc_data, next, - &(msm_audio_ion_data.alloc_list), list) { - - if (alloc_data->handle == handle) { - found = true; - smmu_unmap_cmd.cmd_id = MSM_AUDIO_SMMU_VM_CMD_UNMAP; - smmu_unmap_cmd.export_id = alloc_data->export_id; - - rc = habmm_socket_send(msm_audio_ion_hab_handle, - (void *)&smmu_unmap_cmd, - sizeof(smmu_unmap_cmd), 0); - if (rc) { - pr_err("%s: habmm_socket_send failed %d\n", - __func__, rc); - goto err; - } - - do { - cmd_rsp_size = sizeof(cmd_rsp); - rc = habmm_socket_recv(msm_audio_ion_hab_handle, - (void *)&cmd_rsp, - &cmd_rsp_size, - 0xFFFFFFFF, - 0); - } while (time_before(jiffies, delay) && - (rc == -EINTR) && (cmd_rsp_size == 0)); - if (rc) { - pr_err("%s: habmm_socket_recv failed %d\n", - __func__, rc); - goto err; - } - - if (cmd_rsp_size != sizeof(cmd_rsp)) { - pr_err("%s: invalid size for cmd rsp %u\n", - __func__, cmd_rsp_size); - rc = -EIO; - goto err; - } - - if (cmd_rsp.status) { - pr_err("%s: SMMU unmap command failed %d\n", - __func__, cmd_rsp.status); - rc = cmd_rsp.status; - goto err; - } - - rc = habmm_unexport(msm_audio_ion_hab_handle, - alloc_data->export_id, 0xFFFFFFFF); - if (rc) { - pr_err("%s: habmm_unexport failed export_id = %d, rc = %d\n", - __func__, alloc_data->export_id, rc); - } - - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - pr_err("%s: cannot find allocation, handle %pK\n", __func__, handle); - rc = -EINVAL; - } - - return rc; - -err: - if (found) { - (void)habmm_unexport(msm_audio_ion_hab_handle, - alloc_data->export_id, 0xFFFFFFFF); - list_del(&(alloc_data->list)); - kfree(alloc_data); - } - - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - return rc; -} - -static int msm_audio_ion_get_phys(struct dma_buf *dma_buf, - dma_addr_t *addr, size_t *len) -{ - int rc = 0; - - rc = msm_audio_ion_dma_buf_map(dma_buf, addr, len); - if (rc) { - pr_err("%s: failed to map DMA buf, err = %d\n", - __func__, rc); - goto err; - } - - pr_debug("phys=%pK, len=%zd, rc=%d\n", addr, *len, rc); -err: - return rc; -} - -static void *msm_audio_ion_map_kernel(void *handle) -{ - int rc = 0; - void *addr = NULL; - struct msm_audio_alloc_data *alloc_data = NULL; - - rc = dma_buf_begin_cpu_access((struct dma_buf*)handle, - DMA_BIDIRECTIONAL); - if (rc) { - pr_err("%s: kmap dma_buf_begin_cpu_access fail\n", __func__); - goto exit; - } - - addr = dma_buf_vmap((struct dma_buf*)handle); - if (!addr) { - pr_err("%s: kernel mapping of dma_buf failed\n", - __func__); - goto exit; - } - - /* - * TBD: remove the below section once new API - * for mapping kernel virtual address is available. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->handle == handle) { - alloc_data->vaddr = addr; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - -exit: - return addr; -} - -static int msm_audio_ion_map_buf(void *handle, dma_addr_t *paddr, - size_t *plen, void **vaddr) -{ - int rc = 0; - - rc = msm_audio_ion_get_phys((struct dma_buf*) handle, paddr, plen); - if (rc) { - pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", - __func__, rc); - dma_buf_put(dma_buf); - goto err; - } - - *vaddr = msm_audio_ion_map_kernel(handle); - if (IS_ERR_OR_NULL(*vaddr)) { - pr_err("%s: ION memory mapping for AUDIO failed\n", __func__); - rc = -ENOMEM; - msm_audio_dma_buf_unmap(dma_buf); - goto err; - } - - if (msm_audio_ion_data.smmu_enabled) { - rc = msm_audio_ion_smmu_map(handle, paddr, plen); - if (rc) { - pr_err("%s: failed to do smmu map, err = %d\n", - __func__, rc); - msm_audio_dma_buf_unmap((struct dma_buf *) handle); - goto err; - } - } -err: - return rc; -} - -/** - * msm_audio_ion_alloc - - * Allocs ION memory for given client name - * - * @handle: generic handle to the memory allocation - * dma_buf for the system heap memory. vaddr for audio heap memory. - * @bufsz: buffer size - * @paddr: Physical address to be assigned with allocated region - * @plen: length of allocated region to be assigned - * vaddr: virtual address to be assigned - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_alloc(void **handle, size_t bufsz, - dma_addr_t *paddr, size_t *plen, void **vaddr) -{ - int rc = -EINVAL; - unsigned long err_ion_ptr = 0; - - if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) { - pr_debug("%s:probe is not done, deferred\n", __func__); - return -EPROBE_DEFER; - } - if (!handle || !paddr || !vaddr || !bufsz || !plen) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - if (msm_audio_ion_data.smmu_enabled == true) { - pr_debug("%s: system heap is used\n", __func__); - *handle = ion_alloc(bufsz, ION_HEAP(ION_SYSTEM_HEAP_ID), 0); - } else { - pr_debug("%s: audio heap is used\n", __func__); - *vaddr = *handle = dma_alloc_coherent( - msm_audio_ion_data.cb_dev, - bufsz, paddr, GFP_KERNEL); - if(*vaddr != NULL) { - pr_err("%s: vaddr = %pK, size=%zd\n", __func__, *vaddr, - bufsz); - rc = 0; - } - } - if (IS_ERR_OR_NULL((void *)(*handle))) { - if (IS_ERR((void *)(*handle))) - err_ion_ptr = PTR_ERR((int *)(*handle)); - pr_err("%s: ION alloc fail err ptr=%ld, smmu_enabled=%d\n", - __func__, err_ion_ptr, msm_audio_ion_data.smmu_enabled); - rc = -ENOMEM; - goto err; - } - if (msm_audio_ion_data.smmu_enabled) { - rc = msm_audio_ion_map_buf(*handle, paddr, plen, vaddr); - if (rc) { - pr_err("%s: failed to map ION buf, rc = %d\n", __func__, - rc); - } - } else { - rc = msm_audio_dma_buf_map(*handle, *vaddr, paddr, - &bufsz); - if (rc) { - pr_err("%s: failed to map ION buf, rc = %d\n", __func__, - rc); - dma_free_coherent(msm_audio_ion_data.cb_dev, - bufsz, vaddr, *paddr); - } - } - pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, - *vaddr, bufsz); - - memset(*vaddr, 0, bufsz); - -err: - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_alloc); - -int msm_audio_ion_phys_free(void *handle, - dma_addr_t *paddr, - size_t *pa_len, - u8 assign_type, - int id, - int key) -{ - handle = NULL; - return 0; -} -EXPORT_SYMBOL(msm_audio_ion_phys_free); - -int msm_audio_ion_phys_assign(void **handle, int fd, - dma_addr_t *paddr, size_t *pa_len, u8 assign_type, int id) -{ - *handle = NULL; - return 0; -} -EXPORT_SYMBOL(msm_audio_ion_phys_assign); - -bool msm_audio_is_hypervisor_supported(void) -{ - return false; -} -EXPORT_SYMBOL(msm_audio_is_hypervisor_supported); -/** - * msm_audio_ion_import- - * Import ION buffer with given file descriptor - * - * @handle: generic handle to the memory allocation - * dma_buf for the system heap memory. vaddr for audio heap memory. - * @fd: file descriptor for the ION memory - * @ionflag: flags associated with ION buffer - * @bufsz: buffer size - * @paddr: Physical address to be assigned with allocated region - * @plen: length of allocated region to be assigned - * vaddr: virtual address to be assigned - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_import(void **handle, int fd, - unsigned long *ionflag, size_t bufsz, - dma_addr_t *paddr, size_t *plen, void **vaddr) -{ - int rc = 0; - - if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) { - pr_debug("%s: probe is not done, deferred\n", __func__); - return -EPROBE_DEFER; - } - - if (!handle || !paddr || !vaddr || !plen) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - /* bufsz should be 0 and fd shouldn't be 0 as of now */ - *handle = dma_buf_get(fd); - pr_debug("%s: handle =%pK, fd=%d\n", __func__, *handle, fd); - if (IS_ERR_OR_NULL((void *)(*handle))) { - pr_err("%s: dma_buf_get failed\n", __func__); - rc = -EINVAL; - goto err; - } - - if (ionflag != NULL) { - rc = dma_buf_get_flags((struct dma_buf*)*handle, ionflag); - if (rc) { - pr_err("%s: could not get flags for the dma_buf\n", - __func__); - goto err_ion_flag; - } - } - - rc = msm_audio_ion_map_buf(*handle, paddr, plen, vaddr); - if (rc) { - pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); - goto err; - } - pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, - *vaddr, bufsz); - - return 0; - -err_ion_flag: - dma_buf_put((struct dma_buf*) *handle); -err: - *handle = NULL; - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_import); - -/** - * msm_audio_ion_free - - * fress ION memory for given client and handle - * - * @handle: generic handle to the memory allocation - * dma_buf for the system heap memory. vaddr for audio heap memory. - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_free(void *handle) -{ - int ret = 0; - - if (!handle) { - pr_err("%s: handle invalid\n", __func__); - return -EINVAL; - } - - if (msm_audio_ion_data.smmu_enabled) { - ret = msm_audio_ion_smmu_unmap(handle); - if (ret) - pr_err("%s: smmu unmap failed with ret %d\n", - __func__, ret); - } - - msm_audio_dma_buf_unmap(handle); - - return 0; -} -EXPORT_SYMBOL(msm_audio_ion_free); - -/** - * msm_audio_ion_mmap - - * Audio ION memory map - * - * @abuff: audio buf pointer - * @vma: virtual mem area - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_mmap(struct audio_buffer *abuff, - struct vm_area_struct *vma) -{ - struct msm_audio_alloc_data *alloc_data = NULL; - struct sg_table *table; - unsigned long addr = vma->vm_start; - unsigned long offset = vma->vm_pgoff * PAGE_SIZE; - struct scatterlist *sg; - unsigned int i; - struct page *page; - int ret = 0; - bool found = false; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->handle == abuff->mem_handle) { - found = true; - table = alloc_data->table; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - dev_err(cb_dev, - "%s: cannot find allocation, dma_buf %pK", - __func__, abuff->mem_handle); - return -EINVAL; - } - /* uncached */ - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - - /* We need to check if a page is associated with this sg list because: - * If the allocation came from a carveout we currently don't have - * pages associated with carved out memory. This might change in the - * future and we can remove this check and the else statement. - */ - page = sg_page(table->sgl); - if (page) { - pr_debug("%s: page is NOT null\n", __func__); - for_each_sg(table->sgl, sg, table->nents, i) { - unsigned long remainder = vma->vm_end - addr; - unsigned long len = sg->length; - - page = sg_page(sg); - - if (offset >= len) { - offset -= len; - continue; - } else if (offset) { - page += offset / PAGE_SIZE; - len -= offset; - offset = 0; - } - len = min(len, remainder); - pr_debug("vma=%pK, addr=%x len=%ld vm_start=%x vm_end=%x vm_page_prot=%lu\n", - vma, (unsigned int)addr, len, - (unsigned int)vma->vm_start, - (unsigned int)vma->vm_end, - (unsigned long)pgprot_val(vma->vm_page_prot)); - remap_pfn_range(vma, addr, page_to_pfn(page), len, - vma->vm_page_prot); - addr += len; - if (addr >= vma->vm_end) - return 0; - } - } else { - pr_debug("%s: page is NULL\n", __func__); - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(msm_audio_ion_mmap); - -/** - * msm_audio_populate_upper_32_bits - - * retrieve upper 32bits of 64bit address - * - * @pa: 64bit physical address - * - */ -u32 msm_audio_populate_upper_32_bits(dma_addr_t pa) -{ - return upper_32_bits(pa); -} -EXPORT_SYMBOL(msm_audio_populate_upper_32_bits); - -static const struct of_device_id msm_audio_ion_dt_match[] = { - { .compatible = "qcom,msm-audio-ion" }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_audio_ion_dt_match); - -static int msm_audio_ion_probe(struct platform_device *pdev) -{ - int rc = 0; - const char *msm_audio_ion_dt = "qcom,smmu-enabled"; - bool smmu_enabled; - struct device *dev = &pdev->dev; - - if (dev->of_node == NULL) { - dev_err(dev, - "%s: device tree is not found\n", - __func__); - msm_audio_ion_data.smmu_enabled = 0; - return 0; - } - - smmu_enabled = of_property_read_bool(dev->of_node, - msm_audio_ion_dt); - msm_audio_ion_data.smmu_enabled = smmu_enabled; - - if (!smmu_enabled) { - dev_dbg(dev, "%s: SMMU is Disabled\n", __func__); - goto exit; - } - - rc = habmm_socket_open(&msm_audio_ion_hab_handle, - HAB_MMID_CREATE(MM_AUD_3, - MSM_AUDIO_SMMU_VM_HAB_MINOR_ID), - 0xFFFFFFFF, - HABMM_SOCKET_OPEN_FLAGS_SINGLE_BE_SINGLE_FE); - if (rc) { - dev_err(dev, "%s: habmm_socket_open failed %d\n", - __func__, rc); - return rc; - } - - dev_info(dev, "%s: msm_audio_ion_hab_handle %x\n", - __func__, msm_audio_ion_hab_handle); - -exit: - if (!rc) - msm_audio_ion_data.device_status |= MSM_AUDIO_ION_PROBED; - - msm_audio_ion_data.cb_dev = dev; - INIT_LIST_HEAD(&msm_audio_ion_data.alloc_list); - mutex_init(&(msm_audio_ion_data.list_mutex)); - - return rc; -} - -static int msm_audio_ion_remove(struct platform_device *pdev) -{ - if (msm_audio_ion_data.smmu_enabled) { - if (msm_audio_ion_hab_handle) - habmm_socket_close(msm_audio_ion_hab_handle); - } - msm_audio_ion_data.smmu_enabled = 0; - msm_audio_ion_data.device_status = 0; - mutex_destroy(&(msm_audio_ion_data.list_mutex)); - return 0; -} - -static struct platform_driver msm_audio_ion_driver = { - .driver = { - .name = "msm-audio-ion", - .owner = THIS_MODULE, - .of_match_table = msm_audio_ion_dt_match, - }, - .probe = msm_audio_ion_probe, - .remove = msm_audio_ion_remove, -}; - -int __init msm_audio_ion_init(void) -{ - return platform_driver_register(&msm_audio_ion_driver); -} - -void msm_audio_ion_exit(void) -{ - platform_driver_unregister(&msm_audio_ion_driver); -} - -MODULE_DESCRIPTION("MSM Audio ION VM module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/msm_mdf.c b/techpack/audio/4.0/dsp/msm_mdf.c deleted file mode 100644 index 19232d5ae49b..000000000000 --- a/techpack/audio/4.0/dsp/msm_mdf.c +++ /dev/null @@ -1,724 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define VMID_SSC_Q6 5 -#define VMID_LPASS 6 -#define VMID_MSS_MSA 15 -#define VMID_CDSP 30 - -#define MSM_MDF_PROBED (1 << 0) -#define MSM_MDF_INITIALIZED (1 << 1) -#define MSM_MDF_MEM_ALLOCATED (1 << 2) -#define MSM_MDF_MEM_MAPPED (1 << 3) -#define MSM_MDF_MEM_PERMISSION (1 << 4) /* 0 - HLOS, 1 - Subsys */ - -/* TODO: Update IOVA range for subsys SMMUs */ -#define MSM_MDF_IOVA_START 0x80000000 -#define MSM_MDF_IOVA_LEN 0x800000 - -#define MSM_MDF_SMMU_SID_OFFSET 32 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 - -/* mem protection defines */ -#define TZ_MPU_LOCK_NS_REGION 0x00000025 -#define MEM_PROTECT_AC_PERM_READ 0x4 -#define MEM_PROTECT_AC_PERM_WRITE 0x2 - -#define MSM_AUDIO_SMMU_SID_OFFSET 32 - -enum { - SUBSYS_ADSP, /* Audio DSP must have index 0 */ - SUBSYS_SCC, /* Sensor DSP */ - SUBSYS_MSS, /* Modem DSP */ - SUBSYS_CDSP, /* Compute DSP */ - SUBSYS_MAX, -}; - -struct msm_mdf_dest_vm_and_perm_info { - uint32_t dst_vm; - /* Destination VM defined by ACVirtualMachineId. */ - uint32_t dst_vm_perm; - /* Permissions of the IPA to be mapped to VM, bitwise OR of AC_PERM. */ - uint64_t ctx; - /* Destination of the VM-specific context information. */ - uint32_t ctx_size; - /* Size of context buffer in bytes. */ -}; - -struct msm_mdf_protect_mem { - uint64_t dma_start_address; - uint64_t dma_end_address; - struct msm_mdf_dest_vm_and_perm_info dest_info[SUBSYS_MAX]; - uint32_t dest_info_size; -}; - -struct msm_mdf_mem { - struct device *dev; - uint8_t device_status; - uint32_t map_handle; - struct dma_buf *dma_buf; - dma_addr_t dma_addr; - size_t size; - void *va; -}; - -static struct msm_mdf_mem mdf_mem_data = {NULL,}; - -struct msm_mdf_smmu { - bool enabled; - char *subsys; - int vmid; - uint32_t proc_id; - struct device *cb_dev; - uint8_t device_status; - uint64_t sid; - struct dma_iommu_mapping *mapping; - u64 pa; - size_t pa_len; -}; - -static struct msm_mdf_smmu mdf_smmu_data[SUBSYS_MAX] = { - { - .subsys = "adsp", - .vmid = VMID_LPASS, - }, - { - .subsys = "dsps", - .vmid = VMID_SSC_Q6, - .proc_id = AVS_MDF_SSC_PROC_ID, - }, - { - .subsys = "modem", - .vmid = VMID_MSS_MSA, - .proc_id = AVS_MDF_MDSP_PROC_ID, - }, - { - .subsys = "cdsp", - .vmid = VMID_CDSP, - .proc_id = AVS_MDF_CDSP_PROC_ID, - }, -}; - -static void *ssr_handle; - -static inline uint64_t buf_page_start(uint64_t buf) -{ - uint64_t start = (uint64_t) buf & PAGE_MASK; - return start; -} - -static inline uint64_t buf_page_offset(uint64_t buf) -{ - uint64_t offset = (uint64_t) buf & (PAGE_SIZE - 1); - return offset; -} - -static inline int buf_num_pages(uint64_t buf, ssize_t len) -{ - uint64_t start = buf_page_start(buf) >> PAGE_SHIFT; - uint64_t end = (((uint64_t) buf + len - 1) & PAGE_MASK) >> PAGE_SHIFT; - int nPages = end - start + 1; - return nPages; -} - -static inline uint64_t buf_page_size(uint32_t size) -{ - uint64_t sz = (size + (PAGE_SIZE - 1)) & PAGE_MASK; - - return sz > PAGE_SIZE ? sz : PAGE_SIZE; -} - -static inline void *uint64_to_ptr(uint64_t addr) -{ - void *ptr = (void *)((uintptr_t)addr); - return ptr; -} - -static inline uint64_t ptr_to_uint64(void *ptr) -{ - uint64_t addr = (uint64_t)((uintptr_t)ptr); - return addr; -} - -static int msm_mdf_dma_buf_map(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - int rc = 0; - dma_addr_t pa = 0; - - smmu->pa = 0; - - if (!smmu) - return -EINVAL; - if (smmu->device_status & MSM_MDF_MEM_MAPPED) - return 0; - if (smmu->enabled) { - if (smmu->cb_dev == NULL) { - pr_err("%s: cb device is not initialized\n", - __func__); - /* Retry if LPASS cb device is not ready - * from audio ION during probing. - */ - if (!strcmp("adsp", smmu->subsys)) { - rc = msm_audio_ion_get_smmu_info(&smmu->cb_dev, - &smmu->sid); - if (rc) { - pr_err("%s: msm_audio_ion_get_smmu_info failed, rc = %d\n", - __func__, rc); - goto err; - } - } else - return -ENODEV; - } - - pa = dma_map_single_attrs(smmu->cb_dev, mem->va, - mem->size, DMA_BIDIRECTIONAL, DMA_ATTR_SKIP_CPU_SYNC); - if (dma_mapping_error(smmu->cb_dev, smmu->pa)) { - rc = -ENOMEM; - pr_err("%s: failed to map single, rc = %d\n", - __func__, rc); - goto err; - } - smmu->pa |= pa; - smmu->pa_len = mem->size; - - /* Append the SMMU SID information to the IOVA address */ - if (smmu->sid) - smmu->pa |= smmu->sid; - } else { - smmu->pa |= mem->dma_addr; - smmu->pa_len = mem->size; - } - pr_err("%s: pa=%pa, pa_len=%zd\n", __func__, - &smmu->pa, smmu->pa_len); - - smmu->device_status |= MSM_MDF_MEM_MAPPED; - - return 0; -err: - return rc; -} - -static int msm_mdf_alloc_dma_buf(struct msm_mdf_mem *mem) -{ - int rc = 0; - - if (!mem) - return -EINVAL; - - if (mem->device_status & MSM_MDF_MEM_ALLOCATED) - return 0; - - if (mem->dev == NULL) { - pr_err("%s: device is not initialized\n", - __func__); - return -ENODEV; - } - - mem->va = dma_alloc_attrs(mem->dev, mem->size, - &mem->dma_addr, GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); - if (IS_ERR_OR_NULL(mem->va)) { - pr_err("%s: failed to allocate dma memory, rc = %d\n", - __func__, rc); - return -ENOMEM; - } - mem->va = phys_to_virt(mem->dma_addr); - mem->device_status |= MSM_MDF_MEM_ALLOCATED; - return rc; -} - -static int msm_mdf_free_dma_buf(struct msm_mdf_mem *mem) -{ - if (!mem) - return -EINVAL; - - if (mem->dev == NULL) { - pr_err("%s: device is not initialized\n", - __func__); - return -ENODEV; - } - - //dma_free_coherent(mem->dev, mem->size, mem->va, - // mem->dma_addr); - - mem->device_status &= ~MSM_MDF_MEM_ALLOCATED; - return 0; -} - -static int msm_mdf_dma_buf_unmap(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - if (!smmu) - return -EINVAL; - - if (smmu->enabled) { - if (smmu->cb_dev == NULL) { - pr_err("%s: cb device is not initialized\n", - __func__); - return -ENODEV; - } - //if (smmu->pa && mem->size) - //dma_unmap_single(smmu->cb_dev, smmu->pa, - // mem->size, DMA_BIDIRECTIONAL); - } - - smmu->device_status &= ~MSM_MDF_MEM_MAPPED; - - return 0; -} - -static int msm_mdf_map_memory_to_subsys(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - int rc = 0; - - if (!mem || !smmu) - return -EINVAL; - - /* Map mdf shared memory to ADSP */ - if (!strcmp("adsp", smmu->subsys)) { - rc = q6core_map_mdf_memory_regions((uint64_t *)&smmu->pa, - ADSP_MEMORY_MAP_MDF_SHMEM_4K_POOL, - (uint32_t *)&smmu->pa_len, 1, &mem->map_handle); - if (rc) { - pr_err("%s: q6core_map_memory_regions failed, rc = %d\n", - __func__, rc); - } - } else { - if (mem->map_handle) { - /* Map mdf shared memory to remote DSPs */ - rc = q6core_map_mdf_shared_memory(mem->map_handle, - (uint64_t *)&smmu->pa, smmu->proc_id, - (uint32_t *)&smmu->pa_len, 1); - if (rc) { - pr_err("%s: q6core_map_mdf_shared_memory failed, rc = %d\n", - __func__, rc); - } - } - } - return rc; -} - -static void msm_mdf_unmap_memory_to_subsys(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - if (!mem || !smmu) - return; - - if (!strcmp("adsp", smmu->subsys)) { - if (mem->map_handle) - q6core_memory_unmap_regions(mem->map_handle); - } -} - -static int msm_mdf_assign_memory_to_subsys(struct msm_mdf_mem *mem) -{ - int ret = 0, i; - struct scm_desc desc = {0}; - struct msm_mdf_protect_mem *scm_buffer; - uint32_t fnid; - - scm_buffer = kzalloc(sizeof(struct msm_mdf_protect_mem), GFP_KERNEL); - if (!scm_buffer) - return -ENOMEM; - - scm_buffer->dma_start_address = mem->dma_addr; - scm_buffer->dma_end_address = mem->dma_addr + buf_page_size(mem->size); - for (i = 0; i < SUBSYS_MAX; i++) { - scm_buffer->dest_info[i].dst_vm = mdf_smmu_data[i].vmid; - scm_buffer->dest_info[i].dst_vm_perm = - MEM_PROTECT_AC_PERM_READ | MEM_PROTECT_AC_PERM_WRITE; - scm_buffer->dest_info[i].ctx = 0; - scm_buffer->dest_info[i].ctx_size = 0; - } - scm_buffer->dest_info_size = - sizeof(struct msm_mdf_dest_vm_and_perm_info) * SUBSYS_MAX; - - /* flush cache required by scm_call2 */ - dmac_flush_range(scm_buffer, ((void *)scm_buffer) + - sizeof(struct msm_mdf_protect_mem)); - - desc.args[0] = scm_buffer->dma_start_address; - desc.args[1] = scm_buffer->dma_end_address; - desc.args[2] = virt_to_phys(&(scm_buffer->dest_info[0])); - desc.args[3] = scm_buffer->dest_info_size; - - desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_VAL, SCM_RO, SCM_VAL); - - fnid = SCM_SIP_FNID(SCM_SVC_MP, TZ_MPU_LOCK_NS_REGION); - ret = scm_call2(fnid, &desc); - if (ret < 0) { - pr_err("%s: SCM call2 failed, ret %d scm_resp %llu\n", - __func__, ret, desc.ret[0]); - } - /* No More need for scm_buffer, freeing the same */ - kfree(scm_buffer); - return ret; -} - -/** - * msm_mdf_mem_init - Initializes MDF memory pool and - * map memory to subsystem - * - * Returns 0 on success or ret on failure. - */ - -int msm_mdf_mem_init(void) -{ - int rc = 0, i, j; - struct msm_mdf_mem *mem = &mdf_mem_data; - struct msm_mdf_smmu *smmu; - unsigned long timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - int adsp_ready = 0; - - if (!(mdf_mem_data.device_status & MSM_MDF_PROBED)) - return -ENODEV; - - if (mdf_mem_data.device_status & MSM_MDF_INITIALIZED) - return 0; - - /* TODO: pulling may not be needed as Q6 Core state should be - * checked during machine driver probing. - */ - do { - if (!q6core_is_adsp_ready()) { - pr_err("%s: ADSP Audio NOT Ready\n", - __func__); - /* ADSP will be coming up after subsystem restart and - * it might not be fully up when the control reaches - * here. So, wait for 50msec before checking ADSP state - */ - msleep(50); - } else { - pr_debug("%s: ADSP Audio Ready\n", - __func__); - adsp_ready = 1; - break; - } - } while (time_after(timeout, jiffies)); - - if (!adsp_ready) { - pr_err("%s: timed out waiting for ADSP Audio\n", - __func__); - return -ETIMEDOUT; - } - - if (mem->device_status & MSM_MDF_MEM_ALLOCATED) { - for (i = 0; i < SUBSYS_MAX; i++) { - smmu = &mdf_smmu_data[i]; - rc = msm_mdf_dma_buf_map(mem, smmu); - if (rc) { - pr_err("%s: msm_mdf_dma_buf_map failed, rc = %d\n", - __func__, rc); - goto err; - } - } - - rc = msm_mdf_assign_memory_to_subsys(mem); - if (rc) { - pr_err("%s: msm_mdf_assign_memory_to_subsys failed\n", - __func__); - goto err; - } - - for (j = 0; j < SUBSYS_MAX; j++) { - smmu = &mdf_smmu_data[j]; - rc = msm_mdf_map_memory_to_subsys(mem, smmu); - if (rc) { - pr_err("%s: msm_mdf_map_memory_to_subsys failed\n", - __func__); - goto err; - } - } - - mdf_mem_data.device_status |= MSM_MDF_INITIALIZED; - } - return 0; -err: - return rc; -} -EXPORT_SYMBOL(msm_mdf_mem_init); - -int msm_mdf_mem_deinit(void) -{ - int rc = 0, i; - struct msm_mdf_mem *mem = &mdf_mem_data; - struct msm_mdf_smmu *smmu; - - if (!(mdf_mem_data.device_status & MSM_MDF_INITIALIZED)) - return -ENODEV; - - for (i = SUBSYS_MAX - 1; i >= 0; i--) { - smmu = &mdf_smmu_data[i]; - msm_mdf_unmap_memory_to_subsys(mem, smmu); - } - - if (!rc) { - for (i = SUBSYS_MAX - 1; i >= 0; i--) { - smmu = &mdf_smmu_data[i]; - msm_mdf_dma_buf_unmap(mem, smmu); - } - - msm_mdf_free_dma_buf(mem); - mem->device_status &= ~MSM_MDF_MEM_ALLOCATED; - } - - mdf_mem_data.device_status &= ~MSM_MDF_INITIALIZED; - - return 0; -} -EXPORT_SYMBOL(msm_mdf_mem_deinit); - -static int msm_mdf_restart_notifier_cb(struct notifier_block *this, - unsigned long code, - void *_cmd) -{ - static int boot_count = 3; - - /* During LPASS boot, HLOS receives events: - * SUBSYS_BEFORE_POWERUP - * SUBSYS_PROXY_VOTE - * SUBSYS_AFTER_POWERUP - need skip - * SUBSYS_PROXY_UNVOTE - */ - if (boot_count) { - boot_count--; - return NOTIFY_OK; - } - - switch (code) { - case SUBSYS_BEFORE_SHUTDOWN: - pr_debug("Subsys Notify: Shutdown Started\n"); - /* Unmap and free memory upon restart event. */ - msm_mdf_mem_deinit(); - break; - case SUBSYS_AFTER_SHUTDOWN: - pr_debug("Subsys Notify: Shutdown Completed\n"); - break; - case SUBSYS_BEFORE_POWERUP: - pr_debug("Subsys Notify: Bootup Started\n"); - break; - case SUBSYS_AFTER_POWERUP: - pr_debug("Subsys Notify: Bootup Completed\n"); - /* Allocate and map memory after restart complete. */ - if (msm_mdf_mem_init()) - pr_err("msm_mdf_mem_init failed\n"); - break; - default: - pr_err("Subsys Notify: Generel: %lu\n", code); - break; - } - return NOTIFY_DONE; -} - -static const struct of_device_id msm_mdf_match_table[] = { - { .compatible = "qcom,msm-mdf", }, - { .compatible = "qcom,msm-mdf-mem-region", }, - { .compatible = "qcom,msm-mdf-cb", }, - {} -}; -MODULE_DEVICE_TABLE(of, msm_mdf_match_table); - -static int msm_mdf_cb_probe(struct device *dev) -{ - struct msm_mdf_smmu *smmu; - u64 smmu_sid = 0; - u64 smmu_sid_mask = 0; - struct of_phandle_args iommuspec; - const char *subsys; - int rc = 0, i; - - subsys = of_get_property(dev->of_node, "label", NULL); - if (!subsys) { - dev_err(dev, "%s: could not get label\n", - __func__); - return -EINVAL; - } - - for (i = 0; i < SUBSYS_MAX; i++) { - if (!mdf_smmu_data[i].subsys) - continue; - if (!strcmp(subsys, mdf_smmu_data[i].subsys)) - break; - } - if (i >= SUBSYS_MAX) { - dev_err(dev, "%s: subsys %s not supported\n", - __func__, subsys); - return -EINVAL; - } - - smmu = &mdf_smmu_data[i]; - - smmu->enabled = of_property_read_bool(dev->of_node, - "qcom,smmu-enabled"); - - dev_info(dev, "%s: SMMU is %s for %s\n", __func__, - (smmu->enabled) ? "enabled" : "disabled", - smmu->subsys); - - if (smmu->enabled) { - /* Get SMMU SID information from Devicetree */ - rc = of_property_read_u64(dev->of_node, - "qcom,smmu-sid-mask", - &smmu_sid_mask); - if (rc) { - dev_err(dev, - "%s: qcom,smmu-sid-mask missing in DT node, using default\n", - __func__); - smmu_sid_mask = 0xF; - } - - rc = of_parse_phandle_with_args(dev->of_node, "iommus", - "#iommu-cells", 0, &iommuspec); - if (rc) - dev_err(dev, "%s: could not get smmu SID, ret = %d\n", - __func__, rc); - else - smmu_sid = (iommuspec.args[0] & smmu_sid_mask); - - smmu->sid = - smmu_sid << MSM_AUDIO_SMMU_SID_OFFSET; - - smmu->cb_dev = dev; - } - return 0; -} - -static int msm_mdf_remove(struct platform_device *pdev) -{ - int rc = 0, i; - - for (i = 0; i < SUBSYS_MAX; i++) { - if (!IS_ERR_OR_NULL(mdf_smmu_data[i].cb_dev)) - arm_iommu_detach_device(mdf_smmu_data[i].cb_dev); - if (!IS_ERR_OR_NULL(mdf_smmu_data[i].mapping)) - arm_iommu_release_mapping(mdf_smmu_data[i].mapping); - mdf_smmu_data[i].enabled = 0; - } - mdf_mem_data.device_status = 0; - - return rc; -} - -static int msm_mdf_probe(struct platform_device *pdev) -{ - int rc = 0; - enum apr_subsys_state q6_state; - struct device *dev = &pdev->dev; - uint32_t mdf_mem_data_size = 0; - - /* TODO: MDF probing should have no dependency - * on ADSP Q6 state. - */ - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - dev_dbg(dev, "defering %s, adsp_state %d\n", - __func__, q6_state); - rc = -EPROBE_DEFER; - goto err; - } else - dev_dbg(dev, "%s: adsp is ready\n", __func__); - - if (of_device_is_compatible(dev->of_node, - "qcom,msm-mdf-cb")) - return msm_mdf_cb_probe(dev); - - if (of_device_is_compatible(dev->of_node, - "qcom,msm-mdf-mem-region")) { - mdf_mem_data.dev = dev; - - rc = of_property_read_u32(dev->of_node, - "qcom,msm-mdf-mem-data-size", - &mdf_mem_data_size); - if (rc) { - dev_dbg(&pdev->dev, "MDF mem data size entry not found\n"); - goto err; - } - - mdf_mem_data.size = mdf_mem_data_size; - dev_info(dev, "%s: mem region size %zd\n", - __func__, mdf_mem_data.size); - msm_mdf_alloc_dma_buf(&mdf_mem_data); - return 0; - } - - rc = of_platform_populate(pdev->dev.of_node, - msm_mdf_match_table, - NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to populate child nodes", - __func__); - goto err; - } - mdf_mem_data.device_status |= MSM_MDF_PROBED; - -err: - return rc; -} - -static struct platform_driver msm_mdf_driver = { - .probe = msm_mdf_probe, - .remove = msm_mdf_remove, - .driver = { - .name = "msm-mdf", - .owner = THIS_MODULE, - .of_match_table = msm_mdf_match_table, - .suppress_bind_attrs = true, - }, -}; - -static struct notifier_block nb = { - .priority = 0, - .notifier_call = msm_mdf_restart_notifier_cb, -}; - -int __init msm_mdf_init(void) -{ - /* Only need to monitor SSR from ADSP, which - * is the master DSP managing MDF memory. - */ - ssr_handle = subsys_notif_register_notifier("adsp", &nb); - return platform_driver_register(&msm_mdf_driver); -} - -void __exit msm_mdf_exit(void) -{ - platform_driver_unregister(&msm_mdf_driver); - - if (ssr_handle) - subsys_notif_unregister_notifier(ssr_handle, &nb); -} - -MODULE_DESCRIPTION("MSM MDF Module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/q6_init.c b/techpack/audio/4.0/dsp/q6_init.c deleted file mode 100644 index e990f2a15109..000000000000 --- a/techpack/audio/4.0/dsp/q6_init.c +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2017, 2019-2020 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include "q6_init.h" - -static int __init audio_q6_init(void) -{ - adsp_err_init(); - audio_cal_init(); - rtac_init(); - adm_init(); - afe_init(); - spk_params_init(); - q6asm_init(); - q6lsm_init(); - voice_init(); - core_init(); - msm_audio_ion_init(); - audio_slimslave_init(); - avtimer_init(); - msm_mdf_init(); - voice_mhi_init(); - digital_cdc_rsc_mgr_init(); - return 0; -} - -static void __exit audio_q6_exit(void) -{ - digital_cdc_rsc_mgr_exit(); - msm_mdf_exit(); - avtimer_exit(); - audio_slimslave_exit(); - msm_audio_ion_exit(); - core_exit(); - voice_exit(); - q6lsm_exit(); - q6asm_exit(); - afe_exit(); - spk_params_exit(); - adm_exit(); - rtac_exit(); - audio_cal_exit(); - adsp_err_exit(); - voice_mhi_exit(); -} - -module_init(audio_q6_init); -module_exit(audio_q6_exit); -MODULE_DESCRIPTION("Q6 module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/q6_init.h b/techpack/audio/4.0/dsp/q6_init.h deleted file mode 100644 index 77ba743484b4..000000000000 --- a/techpack/audio/4.0/dsp/q6_init.h +++ /dev/null @@ -1,98 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. - */ - -#ifndef __Q6_INIT_H__ -#define __Q6_INIT_H__ -int adsp_err_init(void); -int adm_init(void); -int afe_init(void); -int q6asm_init(void); -int q6lsm_init(void); -int voice_init(void); -int audio_cal_init(void); -int core_init(void); -int rtac_init(void); -int msm_audio_ion_init(void); -int avtimer_init(void); -#ifdef CONFIG_MSM_MDF -int msm_mdf_init(void); -void msm_mdf_exit(void); -#else -static inline int msm_mdf_init(void) -{ - return 0; -} - -static inline void msm_mdf_exit(void) -{ - return; -} -#endif -#ifdef CONFIG_XT_LOGGING -int spk_params_init(void); -void spk_params_exit(void); -#else -static inline int spk_params_init(void) -{ - return 0; -} -static inline void spk_params_exit(void) -{ -} -#endif - -void avtimer_exit(void); -void msm_audio_ion_exit(void); -void rtac_exit(void); -void core_exit(void); -void audio_cal_exit(void); -void voice_exit(void); -void q6lsm_exit(void); -void q6asm_exit(void); -void afe_exit(void); -void adm_exit(void); -void adsp_err_exit(void); -#if IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE) -int audio_slimslave_init(void); -void audio_slimslave_exit(void); -#else -static inline int audio_slimslave_init(void) -{ - return 0; -}; -static inline void audio_slimslave_exit(void) -{ -}; -#endif -#ifdef CONFIG_VOICE_MHI -int voice_mhi_init(void); -void voice_mhi_exit(void); -#else -static inline int voice_mhi_init(void) -{ - return 0; -} - -static inline void voice_mhi_exit(void) -{ - return; -} -#endif - -#ifdef CONFIG_DIGITAL_CDC_RSC_MGR -void digital_cdc_rsc_mgr_init(void); -void digital_cdc_rsc_mgr_exit(void); -#else -static inline void digital_cdc_rsc_mgr_init(void) -{ -} - -static inline void digital_cdc_rsc_mgr_exit(void) -{ -} -#endif /* CONFIG_DIGITAL_CDC_RSC_MGR */ - -#endif - diff --git a/techpack/audio/4.0/dsp/q6adm.c b/techpack/audio/4.0/dsp/q6adm.c deleted file mode 100644 index 5a038c97796b..000000000000 --- a/techpack/audio/4.0/dsp/q6adm.c +++ /dev/null @@ -1,5498 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define TIMEOUT_MS 1000 - -#define RESET_COPP_ID 99 -#define INVALID_COPP_ID 0xFF -/* Used for inband payload copy, max size is 4k */ -/* 3 is to account for module, instance & param ID in payload */ -#define ADM_GET_PARAMETER_LENGTH (4096 - APR_HDR_SIZE - 3 * sizeof(uint32_t)) - -#define ULL_SUPPORTED_BITS_PER_SAMPLE 16 -#define ULL_SUPPORTED_SAMPLE_RATE 48000 - -#ifndef CONFIG_DOLBY_DAP -#undef DOLBY_ADM_COPP_TOPOLOGY_ID -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFE -#endif - -#ifndef CONFIG_DOLBY_DS2 -#undef DS2_ADM_COPP_TOPOLOGY_ID -#define DS2_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFF -#endif - -#define SESSION_TYPE_RX 0 - -/* ENUM for adm_status */ -enum adm_cal_status { - ADM_STATUS_CALIBRATION_REQUIRED = 0, - ADM_STATUS_MAX, -}; - -struct adm_copp { - - atomic_t id[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t cnt[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t topology[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t mode[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t stat[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t rate[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t bit_width[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t channels[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t app_type[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t acdb_id[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t session_type[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - wait_queue_head_t wait[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - wait_queue_head_t adm_delay_wait[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t adm_delay_stat[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - uint32_t adm_delay[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - unsigned long adm_status[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; -}; - -struct source_tracking_data { - struct dma_buf *dma_buf; - struct param_outband memmap; - int apr_cmd_status; -}; - -struct adm_ctl { - void *apr; - - struct adm_copp copp; - - atomic_t matrix_map_stat; - wait_queue_head_t matrix_map_wait; - - atomic_t adm_stat; - wait_queue_head_t adm_wait; - - struct cal_type_data *cal_data[ADM_MAX_CAL_TYPES]; - - atomic_t mem_map_handles[ADM_MEM_MAP_INDEX_MAX]; - atomic_t mem_map_index; - - struct param_outband outband_memmap; - struct source_tracking_data sourceTrackingData; - - int set_custom_topology; - int ec_ref_rx; - int num_ec_ref_rx_chans; - int ec_ref_rx_bit_width; - int ec_ref_rx_sampling_rate; - int num_ec_ref_rx_chans_downmixed; - uint16_t ec_ref_chmixer_weights[PCM_FORMAT_MAX_NUM_CHANNEL_V8] - [PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - int ffecns_port_id; - int native_mode; -}; - -static struct adm_ctl this_adm; - -struct adm_multi_ch_map { - bool set_channel_map; - char channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; -}; - -#define ADM_MCH_MAP_IDX_PLAYBACK 0 -#define ADM_MCH_MAP_IDX_REC 1 -static struct adm_multi_ch_map multi_ch_maps[2] = { - { false, - {0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0} - }, - { false, - {0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0} - } -}; - -static struct adm_multi_ch_map port_channel_map[AFE_MAX_PORTS]; - -static int adm_get_parameters[MAX_COPPS_PER_PORT * ADM_GET_PARAMETER_LENGTH]; -static int adm_module_topo_list[MAX_COPPS_PER_PORT * - ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH]; -static struct mutex dts_srs_lock; - -void msm_dts_srs_acquire_lock(void) -{ - mutex_lock(&dts_srs_lock); -} - -void msm_dts_srs_release_lock(void) -{ - mutex_unlock(&dts_srs_lock); -} - -static int adm_arrange_mch_map_v8( - struct adm_device_endpoint_payload *ep_payload, - int path, - int channel_mode, - int port_idx); - -/** - * adm_validate_and_get_port_index - - * validate given port id - * - * @port_id: Port ID number - * - * Returns valid index on success or error on failure - */ -int adm_validate_and_get_port_index(int port_id) -{ - int index; - int ret; - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port validation failed id 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - - index = afe_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port idx %d port_id 0x%x\n", - __func__, index, - port_id); - return -EINVAL; - } - pr_debug("%s: port_idx- %d\n", __func__, index); - return index; -} -EXPORT_SYMBOL(adm_validate_and_get_port_index); - -/** - * adm_get_default_copp_idx - - * retrieve default copp_idx for given port - * - * @port_id: Port ID number - * - * Returns valid value on success or error on failure - */ -int adm_get_default_copp_idx(int port_id) -{ - int port_idx = adm_validate_and_get_port_index(port_id), idx; - - if (port_idx < 0) { - pr_err("%s: Invalid port id: 0x%x", __func__, port_id); - return -EINVAL; - } - pr_debug("%s: port_idx:%d\n", __func__, port_idx); - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - if (atomic_read(&this_adm.copp.id[port_idx][idx]) != - RESET_COPP_ID) - return idx; - } - return -EINVAL; -} -EXPORT_SYMBOL(adm_get_default_copp_idx); - -int adm_get_topology_for_port_from_copp_id(int port_id, int copp_id) -{ - int port_idx = adm_validate_and_get_port_index(port_id), idx; - - if (port_idx < 0) { - pr_err("%s: Invalid port id: 0x%x", __func__, port_id); - return 0; - } - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (atomic_read(&this_adm.copp.id[port_idx][idx]) == copp_id) - return atomic_read(&this_adm.copp.topology[port_idx] - [idx]); - pr_err("%s: Invalid copp_id %d port_id 0x%x\n", - __func__, copp_id, port_id); - return 0; -} - -/** - * adm_get_topology_for_port_copp_idx - - * retrieve topology of given port/copp_idx - * - * @port_id: Port ID number - * @copp_idx: copp index of ADM copp - * - * Returns valid value on success or 0 on failure - */ -int adm_get_topology_for_port_copp_idx(int port_id, int copp_idx) -{ - int port_idx = adm_validate_and_get_port_index(port_id); - - if (port_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid port: 0x%x copp id: 0x%x", - __func__, port_id, copp_idx); - return 0; - } - return atomic_read(&this_adm.copp.topology[port_idx][copp_idx]); -} -EXPORT_SYMBOL(adm_get_topology_for_port_copp_idx); - -int adm_get_indexes_from_copp_id(int copp_id, int *copp_idx, int *port_idx) -{ - int p_idx, c_idx; - - for (p_idx = 0; p_idx < AFE_MAX_PORTS; p_idx++) { - for (c_idx = 0; c_idx < MAX_COPPS_PER_PORT; c_idx++) { - if (atomic_read(&this_adm.copp.id[p_idx][c_idx]) - == copp_id) { - if (copp_idx != NULL) - *copp_idx = c_idx; - if (port_idx != NULL) - *port_idx = p_idx; - return 0; - } - } - } - return -EINVAL; -} - -static int adm_get_copp_id(int port_idx, int copp_idx) -{ - pr_debug("%s: port_idx:%d copp_idx:%d\n", __func__, port_idx, copp_idx); - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - return atomic_read(&this_adm.copp.id[port_idx][copp_idx]); -} - -static int adm_get_idx_if_copp_exists(int port_idx, int topology, int mode, - int rate, int bit_width, int app_type, - int session_type) -{ - int idx; - - pr_debug("%s: port_idx-%d, topology-0x%x, mode-%d, rate-%d, bit_width-%d\n", - __func__, port_idx, topology, mode, rate, bit_width); - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if ((topology == - atomic_read(&this_adm.copp.topology[port_idx][idx])) && - (mode == atomic_read(&this_adm.copp.mode[port_idx][idx])) && - (rate == atomic_read(&this_adm.copp.rate[port_idx][idx])) && - (bit_width == - atomic_read(&this_adm.copp.bit_width[port_idx][idx])) && - (session_type == - atomic_read( - &this_adm.copp.session_type[port_idx][idx])) && - (app_type == - atomic_read(&this_adm.copp.app_type[port_idx][idx]))) - return idx; - return -EINVAL; -} - -static int adm_get_next_available_copp(int port_idx) -{ - int idx; - - pr_debug("%s:\n", __func__); - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - pr_debug("%s: copp_id:0x%x port_idx:%d idx:%d\n", __func__, - atomic_read(&this_adm.copp.id[port_idx][idx]), - port_idx, idx); - if (atomic_read(&this_adm.copp.id[port_idx][idx]) == - RESET_COPP_ID) - break; - } - return idx; -} - -/** - * srs_trumedia_open - - * command to set SRS trumedia open - * - * @port_id: Port ID number - * @copp_idx: copp index of ADM copp - * @srs_tech_id: SRS tech index - * @srs_params: params pointer - * - * Returns 0 on success or error on failure - */ -int srs_trumedia_open(int port_id, int copp_idx, __s32 srs_tech_id, - void *srs_params) -{ - struct param_hdr_v3 param_hdr; - struct mem_mapping_hdr mem_hdr; - u32 total_param_size = 0; - bool outband = false; - int port_idx; - int ret = 0; - - pr_debug("SRS - %s", __func__); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&mem_hdr, 0, sizeof(mem_hdr)); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - return -EINVAL; - } - - param_hdr.module_id = SRS_TRUMEDIA_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - - switch (srs_tech_id) { - case SRS_ID_GLOBAL: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS; - param_hdr.param_size = - sizeof(struct srs_trumedia_params_GLOBAL); - break; - } - case SRS_ID_WOWHD: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_WOWHD; - param_hdr.param_size = sizeof(struct srs_trumedia_params_WOWHD); - break; - } - case SRS_ID_CSHP: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_CSHP; - param_hdr.param_size = sizeof(struct srs_trumedia_params_CSHP); - break; - } - case SRS_ID_HPF: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_HPF; - param_hdr.param_size = sizeof(struct srs_trumedia_params_HPF); - break; - } - case SRS_ID_AEQ: { - u8 *update_params_ptr = (u8 *) this_adm.outband_memmap.kvaddr; - - outband = true; - - if (update_params_ptr == NULL) { - pr_err("ADM_SRS_TRUMEDIA - %s: null memmap for AEQ params\n", - __func__); - ret = -EINVAL; - goto fail_cmd; - } - - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_AEQ; - param_hdr.param_size = sizeof(struct srs_trumedia_params_AEQ); - - ret = q6common_pack_pp_params(update_params_ptr, ¶m_hdr, - srs_params, &total_param_size); - if (ret) { - pr_err("%s: Failed to pack param header and data, error %d\n", - __func__, ret); - goto fail_cmd; - } - break; - } - case SRS_ID_HL: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_HL; - param_hdr.param_size = sizeof(struct srs_trumedia_params_HL); - break; - } - case SRS_ID_GEQ: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_GEQ; - param_hdr.param_size = sizeof(struct srs_trumedia_params_GEQ); - break; - } - default: - goto fail_cmd; - } - - if (outband && this_adm.outband_memmap.paddr) { - mem_hdr.data_payload_addr_lsw = - lower_32_bits(this_adm.outband_memmap.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - this_adm.outband_memmap.paddr); - mem_hdr.mem_map_handle = atomic_read( - &this_adm.mem_map_handles[ADM_SRS_TRUMEDIA]); - - ret = adm_set_pp_params(port_id, copp_idx, &mem_hdr, NULL, - total_param_size); - } else { - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, - param_hdr, - (u8 *) srs_params); - } - - if (ret < 0) - pr_err("SRS - %s: ADM enable for port %d failed\n", __func__, - port_id); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(srs_trumedia_open); - -static int adm_populate_channel_weight(u16 *ptr, - struct msm_pcm_channel_mixer *ch_mixer, - int channel_index) -{ - u16 i, j, start_index = 0; - - if (channel_index > ch_mixer->output_channel) { - pr_err("%s: channel index %d is larger than output_channel %d\n", - __func__, channel_index, ch_mixer->output_channel); - return -EINVAL; - } - - for (i = 0; i < ch_mixer->output_channel; i++) { - pr_debug("%s: weight for output %d:", __func__, i); - for (j = 0; j < ADM_MAX_CHANNELS; j++) - pr_debug(" %d", - ch_mixer->channel_weight[i][j]); - pr_debug("\n"); - } - - for (i = 0; i < channel_index; ++i) - start_index += ch_mixer->input_channels[i]; - - for (i = 0; i < ch_mixer->output_channel; ++i) { - for (j = start_index; - j < start_index + - ch_mixer->input_channels[channel_index]; j++) { - *ptr = ch_mixer->channel_weight[i][j]; - pr_debug("%s: ptr[%d][%d] = %d\n", - __func__, i, j, *ptr); - ptr++; - } - } - - return 0; -} - -/* - * adm_programable_channel_mixer - * - * Receives port_id, copp_idx, session_id, session_type, ch_mixer - * and channel_index to send ADM command to mix COPP data. - * - * port_id - Passed value, port_id for which backend is wanted - * copp_idx - Passed value, copp_idx for which COPP is wanted - * session_id - Passed value, session_id for which session is needed - * session_type - Passed value, session_type for RX or TX - * ch_mixer - Passed value, ch_mixer for which channel mixer config is needed - * channel_index - Passed value, channel_index for which channel is needed - */ -int adm_programable_channel_mixer(int port_id, int copp_idx, int session_id, - int session_type, - struct msm_pcm_channel_mixer *ch_mixer, - int channel_index) -{ - struct adm_cmd_set_pspd_mtmx_strtr_params_v5 *adm_params = NULL; - struct param_hdr_v1 data_v5; - int ret = 0, port_idx, sz = 0, param_size = 0; - struct adm_device_endpoint_payload ep_params = {0, 0, 0, {0}}; - u16 *adm_pspd_params; - u16 *ptr; - int index = 0, i = 0, path_type = ADM_PATH_PLAYBACK; - - pr_debug("%s: port_id = %d\n", __func__, port_id); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - return -EINVAL; - } - /* - * First 8 bytes are 4 bytes as rule number, 2 bytes as output - * channel and 2 bytes as input channel. - * 2 * ch_mixer->output_channel means output channel mapping. - * 2 * ch_mixer->input_channels[channel_index]) means input - * channel mapping. - * 2 * ch_mixer->input_channels[channel_index] * - * ch_mixer->output_channel) means the channel mixer weighting - * coefficients. - * param_size needs to be a multiple of 4 bytes. - */ - - param_size = 2 * (4 + ch_mixer->output_channel + - ch_mixer->input_channels[channel_index] + - ch_mixer->input_channels[channel_index] * - ch_mixer->output_channel); - param_size = roundup(param_size, 4); - - sz = sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5) + - sizeof(struct default_chmixer_param_id_coeff) + - sizeof(struct param_hdr_v1) + param_size; - pr_debug("%s: sz = %d\n", __func__, sz); - adm_params = kzalloc(sz, GFP_KERNEL); - if (!adm_params) - return -ENOMEM; - - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->direction = session_type; - adm_params->sessionid = session_id; - pr_debug("%s: copp_id = %d, session id %d\n", __func__, - atomic_read(&this_adm.copp.id[port_idx][copp_idx]), - session_id); - adm_params->deviceid = atomic_read( - &this_adm.copp.id[port_idx][copp_idx]); - adm_params->reserved = 0; - - /* - * This module is internal to ADSP and cannot be configured with - * an instance id - */ - data_v5.module_id = MTMX_MODULE_ID_DEFAULT_CHMIXER; - data_v5.param_id = DEFAULT_CHMIXER_PARAM_ID_COEFF; - data_v5.reserved = 0; - data_v5.param_size = param_size; - adm_params->payload_size = - sizeof(struct default_chmixer_param_id_coeff) + - sizeof(struct param_hdr_v1) + data_v5.param_size; - adm_pspd_params = (u16 *)((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5)); - memcpy(adm_pspd_params, &data_v5, sizeof(data_v5)); - - adm_pspd_params = (u16 *)((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5) - + sizeof(data_v5)); - - adm_pspd_params[0] = ch_mixer->rule; - adm_pspd_params[2] = ch_mixer->output_channel; - adm_pspd_params[3] = ch_mixer->input_channels[channel_index]; - index = 4; - - path_type = (session_type == SESSION_TYPE_RX) ? - ADM_PATH_PLAYBACK : ADM_PATH_LIVE_REC; - - if (ch_mixer->override_out_ch_map) { - memcpy(&adm_pspd_params[index], &ch_mixer->out_ch_map, - ch_mixer->output_channel * sizeof(uint16_t)); - index += ch_mixer->output_channel; - } else { - ep_params.dev_num_channel = ch_mixer->output_channel; - adm_arrange_mch_map_v8(&ep_params, path_type, - ep_params.dev_num_channel, port_idx); - for (i = 0; i < ch_mixer->output_channel; i++) - adm_pspd_params[index++] = ep_params.dev_channel_mapping[i]; - } - - if (ch_mixer->override_in_ch_map) { - memcpy(&adm_pspd_params[index], &ch_mixer->in_ch_map, - ch_mixer->input_channel * sizeof(uint16_t)); - index += ch_mixer->input_channel; - } else { - ep_params.dev_num_channel = ch_mixer->input_channels[channel_index]; - adm_arrange_mch_map_v8(&ep_params, path_type, - ep_params.dev_num_channel, port_idx); - for (i = 0; i < ch_mixer->input_channels[channel_index]; i++) - adm_pspd_params[index++] = ep_params.dev_channel_mapping[i]; - } - - ret = adm_populate_channel_weight(&adm_pspd_params[index], - ch_mixer, channel_index); - if (ret) { - pr_err("%s: fail to get channel weight with error %d\n", - __func__, ret); - goto fail_cmd; - } - - adm_params->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - adm_params->hdr.src_svc = APR_SVC_ADM; - adm_params->hdr.src_domain = APR_DOMAIN_APPS; - adm_params->hdr.src_port = port_id; - adm_params->hdr.dest_svc = APR_SVC_ADM; - adm_params->hdr.dest_domain = APR_DOMAIN_ADSP; - adm_params->hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_params->hdr.token = port_idx << 16 | copp_idx; - adm_params->hdr.opcode = ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5; - adm_params->hdr.pkt_size = sz; - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->reserved = 0; - - ptr = (u16 *)adm_params; - for (index = 0; index < (sz / 2); index++) - pr_debug("%s: adm_params[%d] = 0x%x\n", - __func__, index, (unsigned int)ptr[index]); - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], 0); - ret = apr_send_pkt(this_adm.apr, (uint32_t *)adm_params); - if (ret < 0) { - pr_err("%s: Set params failed port %d rc %d\n", __func__, - port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read( - &this_adm.copp.stat[port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: set params timed out port = %d\n", - __func__, port_id); - ret = -ETIMEDOUT; - goto fail_cmd; - } - ret = 0; -fail_cmd: - kfree(adm_params); - - return ret; -} -EXPORT_SYMBOL(adm_programable_channel_mixer); - -/** - * adm_set_stereo_to_custom_stereo - - * command to update custom stereo - * - * @port_id: Port ID number - * @copp_idx: copp index of ADM copp - * @session_id: session id to be updated - * @params: params pointer - * @param_length: length of params - * - * Returns 0 on success or error on failure - */ -int adm_set_stereo_to_custom_stereo(int port_id, int copp_idx, - unsigned int session_id, char *params, - uint32_t params_length) -{ - struct adm_cmd_set_pspd_mtmx_strtr_params_v5 *adm_params = NULL; - int sz, rc = 0, port_idx; - - pr_debug("%s:\n", __func__); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - sz = sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5) + - params_length; - adm_params = kzalloc(sz, GFP_KERNEL); - if (!adm_params) { - pr_err("%s, adm params memory alloc failed\n", __func__); - return -ENOMEM; - } - - memcpy(((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5)), - params, params_length); - adm_params->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - adm_params->hdr.pkt_size = sz; - adm_params->hdr.src_svc = APR_SVC_ADM; - adm_params->hdr.src_domain = APR_DOMAIN_APPS; - adm_params->hdr.src_port = port_id; - adm_params->hdr.dest_svc = APR_SVC_ADM; - adm_params->hdr.dest_domain = APR_DOMAIN_ADSP; - adm_params->hdr.dest_port = 0; /* Ignored */; - adm_params->hdr.token = port_idx << 16 | copp_idx; - adm_params->hdr.opcode = ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5; - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->payload_size = params_length; - /* direction RX as 0 */ - adm_params->direction = ADM_MATRIX_ID_AUDIO_RX; - /* session id for this cmd to be applied on */ - adm_params->sessionid = session_id; - adm_params->deviceid = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_params->reserved = 0; - pr_debug("%s: deviceid %d, session_id %d, src_port %d, dest_port %d\n", - __func__, adm_params->deviceid, adm_params->sessionid, - adm_params->hdr.src_port, adm_params->hdr.dest_port); - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - rc = apr_send_pkt(this_adm.apr, (uint32_t *)adm_params); - if (rc < 0) { - pr_err("%s: Set params failed port = 0x%x rc %d\n", - __func__, port_id, rc); - rc = -EINVAL; - goto set_stereo_to_custom_stereo_return; - } - /* Wait for the callback */ - rc = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: Set params timed out port = 0x%x\n", __func__, - port_id); - rc = -EINVAL; - goto set_stereo_to_custom_stereo_return; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_adm.copp.stat - [port_idx][copp_idx]))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - goto set_stereo_to_custom_stereo_return; - } - rc = 0; -set_stereo_to_custom_stereo_return: - kfree(adm_params); - return rc; -} -EXPORT_SYMBOL(adm_set_stereo_to_custom_stereo); - -/* - * adm_set_custom_chmix_cfg: - * Set the custom channel mixer configuration for ADM - * - * @port_id: Backend port id - * @copp_idx: ADM copp index - * @session_id: ID of the requesting session - * @params: Expected packaged params for channel mixer - * @params_length: Length of the params to be set - * @direction: RX or TX direction - * @stream_type: Audio or Listen stream type - */ -int adm_set_custom_chmix_cfg(int port_id, int copp_idx, - unsigned int session_id, char *params, - uint32_t params_length, int direction, - int stream_type) -{ - struct adm_cmd_set_pspd_mtmx_strtr_params_v6 *adm_params = NULL; - int sz, rc = 0, port_idx; - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - sz = sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v6) + - params_length; - adm_params = kzalloc(sz, GFP_KERNEL); - if (!adm_params) { - pr_err("%s, adm params memory alloc failed\n", __func__); - return -ENOMEM; - } - - memcpy(((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v6)), - params, params_length); - adm_params->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - adm_params->hdr.pkt_size = sz; - adm_params->hdr.src_svc = APR_SVC_ADM; - adm_params->hdr.src_domain = APR_DOMAIN_APPS; - adm_params->hdr.src_port = port_id; - adm_params->hdr.dest_svc = APR_SVC_ADM; - adm_params->hdr.dest_domain = APR_DOMAIN_ADSP; - adm_params->hdr.dest_port = 0; /* Ignored */; - adm_params->hdr.token = port_idx << 16 | copp_idx; - adm_params->hdr.opcode = ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V6; - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->payload_size = params_length; - adm_params->direction = direction; - /* session id for this cmd to be applied on */ - adm_params->sessionid = session_id; - adm_params->deviceid = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - /* connecting stream type i.e. lsm or asm */ - adm_params->stream_type = stream_type; - pr_debug("%s: deviceid %d, session_id %d, src_port %d, dest_port %d\n", - __func__, adm_params->deviceid, adm_params->sessionid, - adm_params->hdr.src_port, adm_params->hdr.dest_port); - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - rc = apr_send_pkt(this_adm.apr, (uint32_t *)adm_params); - if (rc < 0) { - pr_err("%s: Set params failed port = 0x%x rc %d\n", - __func__, port_id, rc); - rc = -EINVAL; - goto exit; - } - /* Wait for the callback */ - rc = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: Set params timed out port = 0x%x\n", __func__, - port_id); - rc = -EINVAL; - goto exit; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_adm.copp.stat - [port_idx][copp_idx]))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - goto exit; - } - - rc = 0; -exit: - kfree(adm_params); - return rc; -} -EXPORT_SYMBOL(adm_set_custom_chmix_cfg); - -/* - * With pre-packed data, only the opcode differes from V5 and V6. - * Use q6common_pack_pp_params to pack the data correctly. - */ -int adm_set_pp_params(int port_id, int copp_idx, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 param_size) -{ - struct adm_cmd_set_pp_params *adm_set_params = NULL; - int size = 0; - int port_idx = 0; - atomic_t *copp_stat = NULL; - int ret = 0; - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_idx 0x%x\n", __func__, port_idx); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - /* Only add params_size in inband case */ - size = sizeof(struct adm_cmd_set_pp_params); - if (param_data != NULL) - size += param_size; - adm_set_params = kzalloc(size, GFP_KERNEL); - if (!adm_set_params) - return -ENOMEM; - - adm_set_params->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - adm_set_params->apr_hdr.pkt_size = size; - adm_set_params->apr_hdr.src_svc = APR_SVC_ADM; - adm_set_params->apr_hdr.src_domain = APR_DOMAIN_APPS; - adm_set_params->apr_hdr.src_port = port_id; - adm_set_params->apr_hdr.dest_svc = APR_SVC_ADM; - adm_set_params->apr_hdr.dest_domain = APR_DOMAIN_ADSP; - adm_set_params->apr_hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_set_params->apr_hdr.token = port_idx << 16 | copp_idx; - - if (q6common_is_instance_id_supported()) - adm_set_params->apr_hdr.opcode = ADM_CMD_SET_PP_PARAMS_V6; - else - adm_set_params->apr_hdr.opcode = ADM_CMD_SET_PP_PARAMS_V5; - - adm_set_params->payload_size = param_size; - - if (mem_hdr != NULL) { - /* Out of Band Case */ - adm_set_params->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - /* - * In band case. Parameter data must be pre-packed with its - * header before calling this function. Use - * q6common_pack_pp_params to pack parameter data and header - * correctly. - */ - memcpy(&adm_set_params->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both memory header and param data\n", - __func__); - ret = -EINVAL; - goto done; - } - - copp_stat = &this_adm.copp.stat[port_idx][copp_idx]; - atomic_set(copp_stat, -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *) adm_set_params); - if (ret < 0) { - pr_err("%s: Set params APR send failed port = 0x%x ret %d\n", - __func__, port_id, ret); - goto done; - } - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(copp_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Set params timed out port = 0x%x\n", __func__, - port_id); - ret = -ETIMEDOUT; - goto done; - } - if (atomic_read(copp_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(copp_stat))); - ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat)); - goto done; - } - - ret = 0; -done: - kfree(adm_set_params); - return ret; -} -EXPORT_SYMBOL(adm_set_pp_params); - -int adm_pack_and_set_one_pp_param(int port_id, int copp_idx, - struct param_hdr_v3 param_hdr, u8 *param_data) -{ - u8 *packed_data = NULL; - u32 total_size = 0; - int ret = 0; - - total_size = sizeof(union param_hdrs) + param_hdr.param_size; - packed_data = kzalloc(total_size, GFP_KERNEL); - if (!packed_data) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_data, ¶m_hdr, param_data, - &total_size); - if (ret) { - pr_err("%s: Failed to pack parameter data, error %d\n", - __func__, ret); - goto done; - } - - ret = adm_set_pp_params(port_id, copp_idx, NULL, packed_data, - total_size); - if (ret) - pr_err("%s: Failed to set parameter data, error %d\n", __func__, - ret); -done: - kfree(packed_data); - return ret; -} -EXPORT_SYMBOL(adm_pack_and_set_one_pp_param); - -/* - * Only one parameter can be requested at a time. Therefore, packing and sending - * the request can be handled locally. - */ -int adm_get_pp_params(int port_id, int copp_idx, uint32_t client_id, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr, u8 *returned_param_data) -{ - struct adm_cmd_get_pp_params adm_get_params; - int total_size = 0; - int get_param_array_sz = ARRAY_SIZE(adm_get_parameters); - int returned_param_size = 0; - int returned_param_size_in_bytes = 0; - int port_idx = 0; - int idx = 0; - atomic_t *copp_stat = NULL; - int ret = 0; - - if (param_hdr == NULL) { - pr_err("%s: Received NULL pointer for parameter header\n", - __func__); - return -EINVAL; - } - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_idx 0x%x\n", __func__, port_idx); - return -EINVAL; - } - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - memset(&adm_get_params, 0, sizeof(adm_get_params)); - - if (mem_hdr != NULL) - adm_get_params.mem_hdr = *mem_hdr; - - q6common_pack_pp_params((u8 *) &adm_get_params.param_hdr, param_hdr, - NULL, &total_size); - - /* Pack APR header after filling body so total_size has correct value */ - adm_get_params.apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - adm_get_params.apr_hdr.pkt_size = sizeof(adm_get_params); - adm_get_params.apr_hdr.src_svc = APR_SVC_ADM; - adm_get_params.apr_hdr.src_domain = APR_DOMAIN_APPS; - adm_get_params.apr_hdr.src_port = port_id; - adm_get_params.apr_hdr.dest_svc = APR_SVC_ADM; - adm_get_params.apr_hdr.dest_domain = APR_DOMAIN_ADSP; - adm_get_params.apr_hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_get_params.apr_hdr.token = - port_idx << 16 | client_id << 8 | copp_idx; - - if (q6common_is_instance_id_supported()) - adm_get_params.apr_hdr.opcode = ADM_CMD_GET_PP_PARAMS_V6; - else - adm_get_params.apr_hdr.opcode = ADM_CMD_GET_PP_PARAMS_V5; - - copp_stat = &this_adm.copp.stat[port_idx][copp_idx]; - atomic_set(copp_stat, -1); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *) &adm_get_params); - if (ret < 0) { - pr_err("%s: Get params APR send failed port = 0x%x ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(copp_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Get params timed out port = 0x%x\n", __func__, - port_id); - ret = -ETIMEDOUT; - goto done; - } - if (atomic_read(copp_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(copp_stat))); - ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat)); - goto done; - } - - ret = 0; - - /* Copy data to caller if sent in band */ - if (!returned_param_data) { - pr_debug("%s: Received NULL pointer for param destination, not copying payload\n", - __func__); - return 0; - } - - idx = ADM_GET_PARAMETER_LENGTH * copp_idx; - returned_param_size = adm_get_parameters[idx]; - if (returned_param_size < 0 || - returned_param_size + idx + 1 > get_param_array_sz) { - pr_err("%s: Invalid parameter size %d\n", __func__, - returned_param_size); - return -EINVAL; - } - - returned_param_size_in_bytes = returned_param_size * sizeof(uint32_t); - if (param_hdr->param_size < returned_param_size_in_bytes) { - pr_err("%s: Provided buffer is not big enough, provided buffer size(%d) size needed(%d)\n", - __func__, param_hdr->param_size, - returned_param_size_in_bytes); - return -EINVAL; - } - - memcpy(returned_param_data, &adm_get_parameters[idx + 1], - returned_param_size_in_bytes); -done: - return ret; -} -EXPORT_SYMBOL(adm_get_pp_params); - -int adm_get_pp_topo_module_list_v2(int port_id, int copp_idx, - int32_t param_length, - int32_t *returned_params) -{ - struct adm_cmd_get_pp_topo_module_list adm_get_module_list; - bool iid_supported = q6common_is_instance_id_supported(); - int *topo_list; - int num_modules = 0; - int list_size = 0; - int port_idx, idx; - int i = 0; - atomic_t *copp_stat = NULL; - int ret = 0; - - pr_debug("%s : port_id %x", __func__, port_id); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - memset(&adm_get_module_list, 0, sizeof(adm_get_module_list)); - - adm_get_module_list.apr_hdr.pkt_size = sizeof(adm_get_module_list); - adm_get_module_list.apr_hdr.src_svc = APR_SVC_ADM; - adm_get_module_list.apr_hdr.src_domain = APR_DOMAIN_APPS; - adm_get_module_list.apr_hdr.src_port = port_id; - adm_get_module_list.apr_hdr.dest_svc = APR_SVC_ADM; - adm_get_module_list.apr_hdr.dest_domain = APR_DOMAIN_ADSP; - adm_get_module_list.apr_hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_get_module_list.apr_hdr.token = port_idx << 16 | copp_idx; - /* - * Out of band functionality is not currently utilized. - * Assume in band. - */ - if (iid_supported) { - adm_get_module_list.apr_hdr.opcode = - ADM_CMD_GET_PP_TOPO_MODULE_LIST_V2; - adm_get_module_list.param_max_size = param_length; - } else { - adm_get_module_list.apr_hdr.opcode = - ADM_CMD_GET_PP_TOPO_MODULE_LIST; - - if (param_length > U16_MAX) { - pr_err("%s: Invalid param length for V1 %d\n", __func__, - param_length); - return -EINVAL; - } - adm_get_module_list.param_max_size = param_length << 16; - } - - copp_stat = &this_adm.copp.stat[port_idx][copp_idx]; - atomic_set(copp_stat, -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *) &adm_get_module_list); - if (ret < 0) { - pr_err("%s: APR send pkt failed for port_id: 0x%x failed ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(copp_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Timeout for port_id: 0x%x\n", __func__, port_id); - ret = -ETIMEDOUT; - goto done; - } - if (atomic_read(copp_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(copp_stat))); - ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat)); - goto done; - } - - ret = 0; - - if (returned_params) { - /* - * When processing ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST IID is - * added since it is not present. Therefore, there is no need to - * do anything different if IID is not supported here as it is - * already taken care of. - */ - idx = ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH * copp_idx; - num_modules = adm_module_topo_list[idx]; - if (num_modules < 0 || num_modules > MAX_MODULES_IN_TOPO) { - pr_err("%s: Invalid number of modules returned %d\n", - __func__, num_modules); - return -EINVAL; - } - - list_size = num_modules * sizeof(struct module_instance_info); - if (param_length < list_size) { - pr_err("%s: Provided buffer not big enough to hold module-instance list, provided size %d, needed size %d\n", - __func__, param_length, list_size); - return -EINVAL; - } - - topo_list = (int32_t *) (&adm_module_topo_list[idx]); - memcpy(returned_params, topo_list, list_size); - for (i = 1; i <= num_modules; i += 2) { - pr_debug("module = 0x%x instance = 0x%x\n", - returned_params[i], returned_params[i + 1]); - } - } -done: - return ret; -} -EXPORT_SYMBOL(adm_get_pp_topo_module_list_v2); - -static void adm_callback_debug_print(struct apr_client_data *data) -{ - uint32_t *payload; - - payload = data->payload; - - if (data->payload_size >= 8) - pr_debug("%s: code = 0x%x PL#0[0x%x], PL#1[0x%x], size = %d\n", - __func__, data->opcode, payload[0], payload[1], - data->payload_size); - else if (data->payload_size >= 4) - pr_debug("%s: code = 0x%x PL#0[0x%x], size = %d\n", - __func__, data->opcode, payload[0], - data->payload_size); - else - pr_debug("%s: code = 0x%x, size = %d\n", - __func__, data->opcode, data->payload_size); -} - -/** - * adm_set_multi_ch_map - - * Update multi channel map info - * - * @channel_map: pointer with channel map info - * @path: direction or ADM path type - * - * Returns 0 on success or error on failure - */ -int adm_set_multi_ch_map(char *channel_map, int path) -{ - int idx; - - if (path == ADM_PATH_PLAYBACK) { - idx = ADM_MCH_MAP_IDX_PLAYBACK; - } else if (path == ADM_PATH_LIVE_REC) { - idx = ADM_MCH_MAP_IDX_REC; - } else { - pr_err("%s: invalid attempt to set path %d\n", __func__, path); - return -EINVAL; - } - - memcpy(multi_ch_maps[idx].channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - multi_ch_maps[idx].set_channel_map = true; - - return 0; -} -EXPORT_SYMBOL(adm_set_multi_ch_map); - -/** - * adm_get_multi_ch_map - - * Retrieves multi channel map info - * - * @channel_map: pointer to be updated with channel map - * @path: direction or ADM path type - * - * Returns 0 on success or error on failure - */ -int adm_get_multi_ch_map(char *channel_map, int path) -{ - int idx; - - if (path == ADM_PATH_PLAYBACK) { - idx = ADM_MCH_MAP_IDX_PLAYBACK; - } else if (path == ADM_PATH_LIVE_REC) { - idx = ADM_MCH_MAP_IDX_REC; - } else { - pr_err("%s: invalid attempt to get path %d\n", __func__, path); - return -EINVAL; - } - - if (multi_ch_maps[idx].set_channel_map) { - memcpy(channel_map, multi_ch_maps[idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - return 0; -} -EXPORT_SYMBOL(adm_get_multi_ch_map); - -/** - * adm_set_port_multi_ch_map - - * Update port specific channel map info - * - * @channel_map: pointer with channel map info - * @port_id: port for which chmap is set - */ -void adm_set_port_multi_ch_map(char *channel_map, int port_id) -{ - int port_idx; - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return; - } - - memcpy(port_channel_map[port_idx].channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - port_channel_map[port_idx].set_channel_map = true; -} -EXPORT_SYMBOL(adm_set_port_multi_ch_map); - -static int adm_process_get_param_response(u32 opcode, u32 idx, u32 *payload, - u32 payload_size) -{ - struct adm_cmd_rsp_get_pp_params_v5 *v5_rsp = NULL; - struct adm_cmd_rsp_get_pp_params_v6 *v6_rsp = NULL; - u32 *param_data = NULL; - int data_size = 0; - int struct_size = 0; - - if (payload == NULL) { - pr_err("%s: Payload is NULL\n", __func__); - return -EINVAL; - } - - switch (opcode) { - case ADM_CMDRSP_GET_PP_PARAMS_V5: - struct_size = sizeof(struct adm_cmd_rsp_get_pp_params_v5); - if (payload_size < struct_size) { - pr_err("%s: payload size %d < expected size %d\n", - __func__, payload_size, struct_size); - break; - } - v5_rsp = (struct adm_cmd_rsp_get_pp_params_v5 *) payload; - data_size = v5_rsp->param_hdr.param_size; - param_data = v5_rsp->param_data; - break; - case ADM_CMDRSP_GET_PP_PARAMS_V6: - struct_size = sizeof(struct adm_cmd_rsp_get_pp_params_v6); - if (payload_size < struct_size) { - pr_err("%s: payload size %d < expected size %d\n", - __func__, payload_size, struct_size); - break; - } - v6_rsp = (struct adm_cmd_rsp_get_pp_params_v6 *) payload; - data_size = v6_rsp->param_hdr.param_size; - param_data = v6_rsp->param_data; - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - return -EINVAL; - } - - /* - * Just store the returned parameter data, not the header. The calling - * function is expected to know what it asked for. Therefore, there is - * no difference between V5 and V6. - */ - if ((payload_size >= struct_size + data_size) && - (ARRAY_SIZE(adm_get_parameters) > idx) && - (ARRAY_SIZE(adm_get_parameters) > idx + 1 + data_size)) { - pr_debug("%s: Received parameter data in band\n", - __func__); - /* - * data_size is expressed in number of bytes, store in number of - * ints - */ - adm_get_parameters[idx] = - data_size / sizeof(*adm_get_parameters); - pr_debug("%s: GET_PP PARAM: received parameter length: 0x%x\n", - __func__, adm_get_parameters[idx]); - /* store params after param_size */ - memcpy(&adm_get_parameters[idx + 1], param_data, data_size); - } else if (payload_size == sizeof(uint32_t)) { - adm_get_parameters[idx] = -1; - pr_debug("%s: Out of band case, setting size to %d\n", - __func__, adm_get_parameters[idx]); - } else { - pr_err("%s: Invalid parameter combination, payload_size %d, idx %d\n", - __func__, payload_size, idx); - return -EINVAL; - } - return 0; -} - -static int adm_process_get_topo_list_response(u32 opcode, int copp_idx, - u32 num_modules, u32 *payload, - u32 payload_size) -{ - u32 *fill_list = NULL; - int idx = 0; - int i = 0; - int j = 0; - - if (payload == NULL) { - pr_err("%s: Payload is NULL\n", __func__); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid COPP index %d\n", __func__, copp_idx); - return -EINVAL; - } - - idx = ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH * copp_idx; - fill_list = adm_module_topo_list + idx; - *fill_list++ = num_modules; - for (i = 0; i < num_modules; i++) { - if (j > payload_size / sizeof(u32)) { - pr_err("%s: Invalid number of modules specified %d\n", - __func__, num_modules); - return -EINVAL; - } - - /* store module ID */ - *fill_list++ = payload[j]; - j++; - - switch (opcode) { - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST_V2: - /* store instance ID */ - *fill_list++ = payload[j]; - j++; - break; - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST: - /* Insert IID 0 when repacking */ - *fill_list++ = INSTANCE_ID_0; - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - return -EINVAL; - } - } - - return 0; -} - -static void adm_reset_data(void) -{ - int i, j; - - apr_reset(this_adm.apr); - for (i = 0; i < AFE_MAX_PORTS; i++) { - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - atomic_set(&this_adm.copp.id[i][j], - RESET_COPP_ID); - atomic_set(&this_adm.copp.cnt[i][j], 0); - atomic_set( - &this_adm.copp.topology[i][j], 0); - atomic_set(&this_adm.copp.mode[i][j], - 0); - atomic_set(&this_adm.copp.stat[i][j], - 0); - atomic_set(&this_adm.copp.rate[i][j], - 0); - atomic_set( - &this_adm.copp.channels[i][j], - 0); - atomic_set( - &this_adm.copp.bit_width[i][j], 0); - atomic_set( - &this_adm.copp.app_type[i][j], 0); - atomic_set( - &this_adm.copp.acdb_id[i][j], 0); - atomic_set( - &this_adm.copp.session_type[i][j], 0); - this_adm.copp.adm_status[i][j] = - ADM_STATUS_CALIBRATION_REQUIRED; - } - } - this_adm.apr = NULL; - cal_utils_clear_cal_block_q6maps(ADM_MAX_CAL_TYPES, - this_adm.cal_data); - mutex_lock(&this_adm.cal_data - [ADM_CUSTOM_TOP_CAL]->lock); - this_adm.set_custom_topology = 1; - mutex_unlock(&this_adm.cal_data[ - ADM_CUSTOM_TOP_CAL]->lock); - rtac_clear_mapping(ADM_RTAC_CAL); - /* - * Free the ION memory and clear the map handles - * for Source Tracking - */ - if (this_adm.sourceTrackingData.memmap.paddr != 0) { - msm_audio_ion_free( - this_adm.sourceTrackingData.dma_buf); - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = - NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - atomic_set(&this_adm.mem_map_handles[ - ADM_MEM_MAP_INDEX_SOURCE_TRACKING], 0); - } -} - -static int32_t adm_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *payload; - int port_idx, copp_idx, idx, client_id; - int num_modules; - int ret; - - if (data == NULL) { - pr_err("%s: data parameter is null\n", __func__); - return -EINVAL; - } - - payload = data->payload; - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event is received: %d %d apr[%pK]\n", - __func__, - data->reset_event, data->reset_proc, this_adm.apr); - if (this_adm.apr) - adm_reset_data(); - return 0; - } - - adm_callback_debug_print(data); - if (data->payload_size >= sizeof(uint32_t)) { - copp_idx = (data->token) & 0XFF; - port_idx = ((data->token) >> 16) & 0xFF; - client_id = ((data->token) >> 8) & 0xFF; - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port idx %d token %d\n", - __func__, port_idx, data->token); - return 0; - } - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp idx %d token %d\n", - __func__, copp_idx, data->token); - return 0; - } - if (client_id < 0 || client_id >= ADM_CLIENT_ID_MAX) { - pr_err("%s: Invalid client id %d\n", __func__, - client_id); - return 0; - } - if (data->opcode == APR_BASIC_RSP_RESULT) { - pr_debug("%s: APR_BASIC_RSP_RESULT id 0x%x\n", - __func__, payload[0]); - - if (!((client_id != ADM_CLIENT_ID_SOURCE_TRACKING) && - ((payload[0] == ADM_CMD_SET_PP_PARAMS_V5) || - (payload[0] == ADM_CMD_SET_PP_PARAMS_V6)))) { - if (data->payload_size < - (2 * sizeof(uint32_t))) { - pr_err("%s: Invalid payload size %d\n", - __func__, data->payload_size); - return 0; - } - } - - if (payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - } - switch (payload[0]) { - case ADM_CMD_SET_PP_PARAMS_V5: - case ADM_CMD_SET_PP_PARAMS_V6: - pr_debug("%s: ADM_CMD_SET_PP_PARAMS\n", - __func__); - if (client_id == ADM_CLIENT_ID_SOURCE_TRACKING) - this_adm.sourceTrackingData. - apr_cmd_status = payload[1]; - else if (rtac_make_adm_callback(payload, - data->payload_size)) - break; - /* - * if soft volume is called and already - * interrupted break out of the sequence here - */ - case ADM_CMD_DEVICE_OPEN_V5: - case ADM_CMD_DEVICE_CLOSE_V5: - case ADM_CMD_DEVICE_OPEN_V6: - case ADM_CMD_DEVICE_OPEN_V8: - pr_debug("%s: Basic callback received, wake up.\n", - __func__); - atomic_set(&this_adm.copp.stat[port_idx] - [copp_idx], payload[1]); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMD_ADD_TOPOLOGIES: - pr_debug("%s: callback received, ADM_CMD_ADD_TOPOLOGIES.\n", - __func__); - atomic_set(&this_adm.adm_stat, payload[1]); - wake_up(&this_adm.adm_wait); - break; - case ADM_CMD_MATRIX_MAP_ROUTINGS_V5: - case ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5: - pr_debug("%s: Basic callback received, wake up.\n", - __func__); - atomic_set(&this_adm.matrix_map_stat, - payload[1]); - wake_up(&this_adm.matrix_map_wait); - break; - case ADM_CMD_SHARED_MEM_UNMAP_REGIONS: - pr_debug("%s: ADM_CMD_SHARED_MEM_UNMAP_REGIONS\n", - __func__); - atomic_set(&this_adm.adm_stat, payload[1]); - wake_up(&this_adm.adm_wait); - break; - case ADM_CMD_SHARED_MEM_MAP_REGIONS: - pr_debug("%s: ADM_CMD_SHARED_MEM_MAP_REGIONS\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - if (payload[1] != 0) { - pr_err("%s: ADM map error, resuming\n", - __func__); - atomic_set(&this_adm.adm_stat, - payload[1]); - wake_up(&this_adm.adm_wait); - } - break; - case ADM_CMD_GET_PP_PARAMS_V5: - case ADM_CMD_GET_PP_PARAMS_V6: - pr_debug("%s: ADM_CMD_GET_PP_PARAMS\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* ADM_CMDRSP_GET_PP_PARAMS_V5 */ - if (client_id == - ADM_CLIENT_ID_SOURCE_TRACKING) { - this_adm.sourceTrackingData. - apr_cmd_status = payload[1]; - if (payload[1] != 0) - pr_err("%s: ADM get param error = %d\n", - __func__, payload[1]); - - atomic_set(&this_adm.copp.stat - [port_idx][copp_idx], - payload[1]); - wake_up(&this_adm.copp.wait - [port_idx][copp_idx]); - } else { - if (payload[1] != 0) { - pr_err("%s: ADM get param error = %d, resuming\n", - __func__, payload[1]); - - rtac_make_adm_callback(payload, - data->payload_size); - } - } - break; - case ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5: - case ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V6: - pr_debug("%s:callback received PSPD MTMX, wake up\n", - __func__); - atomic_set(&this_adm.copp.stat[port_idx] - [copp_idx], payload[1]); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMD_GET_PP_TOPO_MODULE_LIST: - case ADM_CMD_GET_PP_TOPO_MODULE_LIST_V2: - pr_debug("%s:ADM_CMD_GET_PP_TOPO_MODULE_LIST\n", - __func__); - if (payload[1] != 0) - pr_err("%s: ADM get topo list error = %d\n", - __func__, payload[1]); - break; - default: - pr_err("%s: Unknown Cmd: 0x%x\n", __func__, - payload[0]); - break; - } - return 0; - } - - switch (data->opcode) { - case ADM_CMDRSP_DEVICE_OPEN_V5: - case ADM_CMDRSP_DEVICE_OPEN_V6: - case ADM_CMDRSP_DEVICE_OPEN_V8: { - struct adm_cmd_rsp_device_open_v5 *open = NULL; - if (data->payload_size < - sizeof(struct adm_cmd_rsp_device_open_v5)) { - pr_err("%s: Invalid payload size %d\n", __func__, - data->payload_size); - return 0; - } - open = (struct adm_cmd_rsp_device_open_v5 *)data->payload; - if (open->copp_id == INVALID_COPP_ID) { - pr_err("%s: invalid coppid rxed %d\n", - __func__, open->copp_id); - atomic_set(&this_adm.copp.stat[port_idx] - [copp_idx], ADSP_EBADPARAM); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - } - atomic_set(&this_adm.copp.stat - [port_idx][copp_idx], payload[0]); - atomic_set(&this_adm.copp.id[port_idx][copp_idx], - open->copp_id); - pr_debug("%s: coppid rxed=%d\n", __func__, - open->copp_id); - wake_up(&this_adm.copp.wait[port_idx][copp_idx]); - } - break; - case ADM_CMDRSP_GET_PP_PARAMS_V5: - case ADM_CMDRSP_GET_PP_PARAMS_V6: - pr_debug("%s: ADM_CMDRSP_GET_PP_PARAMS\n", __func__); - if (client_id == ADM_CLIENT_ID_SOURCE_TRACKING) - this_adm.sourceTrackingData.apr_cmd_status = - payload[0]; - else if (rtac_make_adm_callback(payload, - data->payload_size)) - break; - - idx = ADM_GET_PARAMETER_LENGTH * copp_idx; - if (payload[0] == 0 && data->payload_size > 0) { - ret = adm_process_get_param_response( - data->opcode, idx, payload, - data->payload_size); - if (ret) - pr_err("%s: Failed to process get param response, error %d\n", - __func__, ret); - } else { - adm_get_parameters[idx] = -1; - pr_err("%s: ADM_CMDRSP_GET_PP_PARAMS returned error 0x%x\n", - __func__, payload[0]); - } - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], - payload[0]); - wake_up(&this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST: - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST_V2: - pr_debug("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST\n", - __func__); - if (data->payload_size >= (2 * sizeof(uint32_t))) { - num_modules = payload[1]; - pr_debug("%s: Num modules %d\n", __func__, - num_modules); - if (payload[0]) { - pr_err("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST, error = %d\n", - __func__, payload[0]); - } else if (num_modules > MAX_MODULES_IN_TOPO) { - pr_err("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST invalid num modules received, num modules = %d\n", - __func__, num_modules); - } else { - ret = adm_process_get_topo_list_response( - data->opcode, copp_idx, - num_modules, payload, - data->payload_size); - if (ret) - pr_err("%s: Failed to process get topo modules list response, error %d\n", - __func__, ret); - } - } else { - pr_err("%s: Invalid payload size %d\n", - __func__, data->payload_size); - } - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], - payload[0]); - wake_up(&this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMDRSP_SHARED_MEM_MAP_REGIONS: - pr_debug("%s: ADM_CMDRSP_SHARED_MEM_MAP_REGIONS\n", - __func__); - atomic_set(&this_adm.mem_map_handles[ - atomic_read(&this_adm.mem_map_index)], - *payload); - atomic_set(&this_adm.adm_stat, 0); - wake_up(&this_adm.adm_wait); - break; - default: - pr_err("%s: Unknown cmd:0x%x\n", __func__, - data->opcode); - break; - } - } - return 0; -} - -static int adm_memory_map_regions(phys_addr_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int ret = 0; - int i = 0; - int cmd_size = 0; - - pr_debug("%s:\n", __func__); - if (this_adm.apr == NULL) { - this_adm.apr = apr_register("ADSP", "ADM", adm_callback, - 0xFFFFFFFF, &this_adm); - if (this_adm.apr == NULL) { - pr_err("%s: Unable to register ADM\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_adm_handle(this_adm.apr); - } - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + sizeof(struct avs_shared_map_region_payload) - * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_shared_mem_map_regions *)mmap_region_cmd; - mmap_regions->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mmap_regions->hdr.pkt_size = cmd_size; - mmap_regions->hdr.src_port = 0; - - mmap_regions->hdr.dest_port = 0; - mmap_regions->hdr.token = 0; - mmap_regions->hdr.opcode = ADM_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL & 0x00ff; - mmap_regions->num_regions = bufcnt & 0x00ff; - mmap_regions->property_flag = 0x00; - - pr_debug("%s: map_regions->num_regions = %d\n", __func__, - mmap_regions->num_regions); - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - for (i = 0; i < bufcnt; i++) { - mregions->shm_addr_lsw = lower_32_bits(buf_add[i]); - mregions->shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_add[i]); - mregions->mem_size_bytes = bufsz[i]; - ++mregions; - } - - atomic_set(&this_adm.adm_stat, -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *) mmap_region_cmd); - if (ret < 0) { - pr_err("%s: mmap_regions op[0x%x]rc[%d]\n", __func__, - mmap_regions->hdr.opcode, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(this_adm.adm_wait, - atomic_read(&this_adm.adm_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory_map\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.adm_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.adm_stat))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.adm_stat)); - goto fail_cmd; - } -fail_cmd: - kfree(mmap_region_cmd); - return ret; -} - -static int adm_memory_unmap_regions(void) -{ - struct avs_cmd_shared_mem_unmap_regions unmap_regions; - int ret = 0; - - pr_debug("%s:\n", __func__); - if (this_adm.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - unmap_regions.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - unmap_regions.hdr.pkt_size = sizeof(unmap_regions); - unmap_regions.hdr.src_port = 0; - unmap_regions.hdr.dest_port = 0; - unmap_regions.hdr.token = 0; - unmap_regions.hdr.opcode = ADM_CMD_SHARED_MEM_UNMAP_REGIONS; - unmap_regions.mem_map_handle = atomic_read(&this_adm. - mem_map_handles[atomic_read(&this_adm.mem_map_index)]); - atomic_set(&this_adm.adm_stat, -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *) &unmap_regions); - if (ret < 0) { - pr_err("%s: mmap_regions op[0x%x]rc[%d]\n", __func__, - unmap_regions.hdr.opcode, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(this_adm.adm_wait, - atomic_read(&this_adm.adm_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory_unmap\n", - __func__); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.adm_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.adm_stat))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.adm_stat)); - goto fail_cmd; - } else { - pr_debug("%s: Unmap handle 0x%x succeeded\n", __func__, - unmap_regions.mem_map_handle); - } -fail_cmd: - return ret; -} - -static int remap_cal_data(struct cal_block_data *cal_block, int cal_index) -{ - int ret = 0; - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - atomic_set(&this_adm.mem_map_index, cal_index); - ret = adm_memory_map_regions(&cal_block->cal_data.paddr, 0, - (uint32_t *)&cal_block->map_data.map_size, 1); - if (ret < 0) { - pr_err("%s: ADM mmap did not work! size = %zd ret %d\n", - __func__, - cal_block->map_data.map_size, ret); - pr_debug("%s: ADM mmap did not work! addr = 0x%pK, size = %zd ret %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size, ret); - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_adm. - mem_map_handles[cal_index]); - } -done: - return ret; -} - -static void send_adm_custom_topology(void) -{ - struct cal_block_data *cal_block = NULL; - struct cmd_set_topologies adm_top; - int cal_index = ADM_CUSTOM_TOP_CAL; - int result; - - if (this_adm.cal_data[cal_index] == NULL) - goto done; - - mutex_lock(&this_adm.cal_data[cal_index]->lock); - if (!this_adm.set_custom_topology) - goto unlock; - this_adm.set_custom_topology = 0; - - cal_block = cal_utils_get_only_cal_block(this_adm.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) - goto unlock; - - pr_debug("%s: Sending cal_index %d\n", __func__, cal_index); - - result = remap_cal_data(cal_block, cal_index); - if (result) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - goto unlock; - } - atomic_set(&this_adm.mem_map_index, cal_index); - atomic_set(&this_adm.mem_map_handles[cal_index], - cal_block->map_data.q6map_handle); - - if (cal_block->cal_data.size == 0) { - pr_debug("%s: No ADM cal to send\n", __func__); - goto unlock; - } - - adm_top.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - adm_top.hdr.pkt_size = sizeof(adm_top); - adm_top.hdr.src_svc = APR_SVC_ADM; - adm_top.hdr.src_domain = APR_DOMAIN_APPS; - adm_top.hdr.src_port = 0; - adm_top.hdr.dest_svc = APR_SVC_ADM; - adm_top.hdr.dest_domain = APR_DOMAIN_ADSP; - adm_top.hdr.dest_port = 0; - adm_top.hdr.token = 0; - adm_top.hdr.opcode = ADM_CMD_ADD_TOPOLOGIES; - adm_top.payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr); - adm_top.payload_addr_msw = msm_audio_populate_upper_32_bits( - cal_block->cal_data.paddr); - adm_top.mem_map_handle = cal_block->map_data.q6map_handle; - adm_top.payload_size = cal_block->cal_data.size; - - atomic_set(&this_adm.adm_stat, -1); - pr_debug("%s: Sending ADM_CMD_ADD_TOPOLOGIES payload = 0x%pK, size = %d\n", - __func__, &cal_block->cal_data.paddr, - adm_top.payload_size); - result = apr_send_pkt(this_adm.apr, (uint32_t *)&adm_top); - if (result < 0) { - pr_err("%s: Set topologies failed payload size = %zd result %d\n", - __func__, cal_block->cal_data.size, result); - goto unlock; - } - /* Wait for the callback */ - result = wait_event_timeout(this_adm.adm_wait, - atomic_read(&this_adm.adm_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set topologies timed out payload size = %zd\n", - __func__, cal_block->cal_data.size); - goto unlock; - } else if (atomic_read(&this_adm.adm_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.adm_stat))); - result = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.adm_stat)); - goto unlock; - } -unlock: - mutex_unlock(&this_adm.cal_data[cal_index]->lock); -done: - return; -} - -static int send_adm_cal_block(int port_id, int copp_idx, - struct cal_block_data *cal_block, int perf_mode) -{ - struct mem_mapping_hdr mem_hdr; - int payload_size = 0; - int port_idx = 0; - int topology = 0; - int result = 0; - - pr_debug("%s: Port id 0x%x,\n", __func__, port_id); - - if (!cal_block) { - pr_debug("%s: No ADM cal to send for port_id = 0x%x!\n", - __func__, port_id); - result = -EINVAL; - goto done; - } - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: No ADM cal sent for port_id = 0x%x!\n", __func__, - port_id); - result = -EINVAL; - goto done; - } - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - topology = atomic_read(&this_adm.copp.topology[port_idx][copp_idx]); - if (perf_mode == LEGACY_PCM_MODE && - topology == DS2_ADM_COPP_TOPOLOGY_ID) { - pr_err("%s: perf_mode %d, topology 0x%x\n", __func__, perf_mode, - topology); - goto done; - } - - mem_hdr.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - mem_hdr.mem_map_handle = cal_block->map_data.q6map_handle; - payload_size = cal_block->cal_data.size; - - adm_set_pp_params(port_id, copp_idx, &mem_hdr, NULL, payload_size); - -done: - return result; -} - -static struct cal_block_data *adm_find_cal_by_path(int cal_index, int path) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audproc *audproc_cal_info = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - - pr_debug("%s:\n", __func__); - - list_for_each_safe(ptr, next, - &this_adm.cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - audproc_cal_info = cal_block->cal_info; - if ((audproc_cal_info->path == path) && - (cal_block->cal_data.size > 0)) - return cal_block; - } else if (cal_index == ADM_AUDVOL_CAL) { - audvol_cal_info = cal_block->cal_info; - if ((audvol_cal_info->path == path) && - (cal_block->cal_data.size > 0)) - return cal_block; - } - } - pr_debug("%s: Can't find ADM cal for cal_index %d, path %d\n", - __func__, cal_index, path); - return NULL; -} - -static struct cal_block_data *adm_find_cal_by_app_type(int cal_index, int path, - int app_type) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audproc *audproc_cal_info = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &this_adm.cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - audproc_cal_info = cal_block->cal_info; - if ((audproc_cal_info->path == path) && - (audproc_cal_info->app_type == app_type) && - (cal_block->cal_data.size > 0)) - return cal_block; - } else if (cal_index == ADM_AUDVOL_CAL) { - audvol_cal_info = cal_block->cal_info; - if ((audvol_cal_info->path == path) && - (audvol_cal_info->app_type == app_type) && - (cal_block->cal_data.size > 0)) - return cal_block; - } - } - pr_debug("%s: Can't find ADM cali for cal_index %d, path %d, app %d, defaulting to search by path\n", - __func__, cal_index, path, app_type); - return adm_find_cal_by_path(cal_index, path); -} - - -static struct cal_block_data *adm_find_cal(int cal_index, int path, - int app_type, int acdb_id, - int sample_rate) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audproc *audproc_cal_info = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - - pr_debug("%s:\n", __func__); - - list_for_each_safe(ptr, next, - &this_adm.cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - audproc_cal_info = cal_block->cal_info; - if ((audproc_cal_info->path == path) && - (audproc_cal_info->app_type == app_type) && - (audproc_cal_info->acdb_id == acdb_id) && - (audproc_cal_info->sample_rate == sample_rate) && - (cal_block->cal_data.size > 0)) - return cal_block; - } else if (cal_index == ADM_AUDVOL_CAL) { - audvol_cal_info = cal_block->cal_info; - if ((audvol_cal_info->path == path) && - (audvol_cal_info->app_type == app_type) && - (audvol_cal_info->acdb_id == acdb_id) && - (cal_block->cal_data.size > 0)) - return cal_block; - } - } - pr_debug("%s: Can't find ADM cal for cal_index %d, path %d, app %d, acdb_id %d sample_rate %d defaulting to search by app type\n", - __func__, cal_index, path, app_type, acdb_id, sample_rate); - return adm_find_cal_by_app_type(cal_index, path, app_type); -} - -static int adm_remap_and_send_cal_block(int cal_index, int port_id, - int copp_idx, struct cal_block_data *cal_block, int perf_mode, - int app_type, int acdb_id, int sample_rate) -{ - int ret = 0; - - pr_debug("%s: Sending cal_index cal %d\n", __func__, cal_index); - ret = remap_cal_data(cal_block, cal_index); - if (ret) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - goto done; - } - ret = send_adm_cal_block(port_id, copp_idx, cal_block, perf_mode); - if (ret < 0) - pr_debug("%s: No cal sent for cal_index %d, port_id = 0x%x! ret %d sample_rate %d\n", - __func__, cal_index, port_id, ret, sample_rate); -done: - return ret; -} - -static void send_adm_cal_type(int cal_index, int path, int port_id, - int copp_idx, int perf_mode, int app_type, - int acdb_id, int sample_rate) -{ - struct cal_block_data *cal_block = NULL; - int ret; - - pr_debug("%s: cal index %d\n", __func__, cal_index); - - if (this_adm.cal_data[cal_index] == NULL) { - pr_debug("%s: cal_index %d not allocated!\n", - __func__, cal_index); - goto done; - } - - mutex_lock(&this_adm.cal_data[cal_index]->lock); - cal_block = adm_find_cal(cal_index, path, app_type, acdb_id, - sample_rate); - if (cal_block == NULL) - goto unlock; - - ret = adm_remap_and_send_cal_block(cal_index, port_id, copp_idx, - cal_block, perf_mode, app_type, acdb_id, sample_rate); - - cal_utils_mark_cal_used(cal_block); -unlock: - mutex_unlock(&this_adm.cal_data[cal_index]->lock); -done: - return; -} - -static int get_cal_path(int path) -{ - if (path == 0x1) - return RX_DEVICE; - else - return TX_DEVICE; -} - -static void send_adm_cal(int port_id, int copp_idx, int path, int perf_mode, - int app_type, int acdb_id, int sample_rate, - int passthr_mode) -{ - pr_debug("%s: port id 0x%x copp_idx %d\n", __func__, port_id, copp_idx); - - if (passthr_mode != LISTEN) { - send_adm_cal_type(ADM_AUDPROC_CAL, path, port_id, copp_idx, - perf_mode, app_type, acdb_id, sample_rate); - } else { - send_adm_cal_type(ADM_LSM_AUDPROC_CAL, path, port_id, copp_idx, - perf_mode, app_type, acdb_id, sample_rate); - - send_adm_cal_type(ADM_LSM_AUDPROC_PERSISTENT_CAL, path, - port_id, copp_idx, perf_mode, app_type, - acdb_id, sample_rate); - } - - send_adm_cal_type(ADM_AUDVOL_CAL, path, port_id, copp_idx, perf_mode, - app_type, acdb_id, sample_rate); -} - -/** - * adm_connect_afe_port - - * command to send ADM connect AFE port - * - * @mode: value of mode for ADM connect AFE - * @session_id: session active to connect - * @port_id: Port ID number - * - * Returns 0 on success or error on failure - */ -int adm_connect_afe_port(int mode, int session_id, int port_id) -{ - struct adm_cmd_connect_afe_port_v5 cmd; - int ret = 0; - int port_idx, copp_idx = 0; - - pr_debug("%s: port_id: 0x%x session id:%d mode:%d\n", __func__, - port_id, session_id, mode); - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - if (this_adm.apr == NULL) { - this_adm.apr = apr_register("ADSP", "ADM", adm_callback, - 0xFFFFFFFF, &this_adm); - if (this_adm.apr == NULL) { - pr_err("%s: Unable to register ADM\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_adm_handle(this_adm.apr); - } - pr_debug("%s: Port ID 0x%x, index %d\n", __func__, port_id, port_idx); - - cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cmd.hdr.pkt_size = sizeof(cmd); - cmd.hdr.src_svc = APR_SVC_ADM; - cmd.hdr.src_domain = APR_DOMAIN_APPS; - cmd.hdr.src_port = port_id; - cmd.hdr.dest_svc = APR_SVC_ADM; - cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cmd.hdr.dest_port = 0; /* Ignored */ - cmd.hdr.token = port_idx << 16 | copp_idx; - cmd.hdr.opcode = ADM_CMD_CONNECT_AFE_PORT_V5; - - cmd.mode = mode; - cmd.session_id = session_id; - cmd.afe_port_id = port_id; - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&cmd); - if (ret < 0) { - pr_err("%s: ADM enable for port_id: 0x%x failed ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - /* Wait for the callback with copp id */ - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat[port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: ADM connect timedout for port_id: 0x%x\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - goto fail_cmd; - } - atomic_inc(&this_adm.copp.cnt[port_idx][copp_idx]); - return 0; - -fail_cmd: - - return ret; -} -EXPORT_SYMBOL(adm_connect_afe_port); - -int adm_arrange_mch_map(struct adm_cmd_device_open_v5 *open, int path, - int channel_mode, int port_idx) -{ - int rc = 0, idx; - - pr_debug("%s: channel mode %d", __func__, channel_mode); - - memset(open->dev_channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - switch (path) { - case ADM_PATH_PLAYBACK: - idx = ADM_MCH_MAP_IDX_PLAYBACK; - break; - case ADM_PATH_LIVE_REC: - case ADM_PATH_NONLIVE_REC: - idx = ADM_MCH_MAP_IDX_REC; - break; - default: - goto non_mch_path; - }; - - if ((open->dev_num_channel > 2) && - (port_channel_map[port_idx].set_channel_map || - multi_ch_maps[idx].set_channel_map)) { - if (port_channel_map[port_idx].set_channel_map) - memcpy(open->dev_channel_mapping, - port_channel_map[port_idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL); - else - memcpy(open->dev_channel_mapping, - multi_ch_maps[idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL); - } else { - if (channel_mode == 1) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_LS; - open->dev_channel_mapping[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_FC; - open->dev_channel_mapping[3] = PCM_CHANNEL_LS; - open->dev_channel_mapping[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - open->dev_channel_mapping[3] = PCM_CHANNEL_FC; - open->dev_channel_mapping[4] = PCM_CHANNEL_LS; - open->dev_channel_mapping[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 7) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_FC; - open->dev_channel_mapping[3] = PCM_CHANNEL_LFE; - open->dev_channel_mapping[4] = PCM_CHANNEL_LB; - open->dev_channel_mapping[5] = PCM_CHANNEL_RB; - open->dev_channel_mapping[6] = PCM_CHANNEL_CS; - } else if (channel_mode == 8) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - open->dev_channel_mapping[3] = PCM_CHANNEL_FC; - open->dev_channel_mapping[4] = PCM_CHANNEL_LS; - open->dev_channel_mapping[5] = PCM_CHANNEL_RS; - open->dev_channel_mapping[6] = PCM_CHANNEL_LB; - open->dev_channel_mapping[7] = PCM_CHANNEL_RB; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - goto inval_ch_mod; - } - } - -non_mch_path: -inval_ch_mod: - return rc; -} - -int adm_arrange_mch_ep2_map(struct adm_cmd_device_open_v6 *open_v6, - int channel_mode) -{ - int rc = 0; - - memset(open_v6->dev_channel_mapping_eid2, 0, - PCM_FORMAT_MAX_NUM_CHANNEL); - - if (channel_mode == 1) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_FC; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_LFE; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_FC; - open_v6->dev_channel_mapping_eid2[4] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 8) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_LFE; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_FC; - open_v6->dev_channel_mapping_eid2[4] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[5] = PCM_CHANNEL_RS; - open_v6->dev_channel_mapping_eid2[6] = PCM_CHANNEL_LB; - open_v6->dev_channel_mapping_eid2[7] = PCM_CHANNEL_RB; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - } - - return rc; -} - -static int adm_arrange_mch_map_v8( - struct adm_device_endpoint_payload *ep_payload, - int path, int channel_mode, int port_idx) -{ - int rc = 0, idx; - - memset(ep_payload->dev_channel_mapping, - 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - switch (path) { - case ADM_PATH_PLAYBACK: - idx = ADM_MCH_MAP_IDX_PLAYBACK; - break; - case ADM_PATH_LIVE_REC: - case ADM_PATH_NONLIVE_REC: - idx = ADM_MCH_MAP_IDX_REC; - break; - default: - goto non_mch_path; - }; - - if ((ep_payload->dev_num_channel > 2) && - (port_channel_map[port_idx].set_channel_map || - multi_ch_maps[idx].set_channel_map)) { - if (port_channel_map[port_idx].set_channel_map) - memcpy(ep_payload->dev_channel_mapping, - port_channel_map[port_idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - else - memcpy(ep_payload->dev_channel_mapping, - multi_ch_maps[idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } else { - if (channel_mode == 1) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 7) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_CS; - } else if (channel_mode == 8) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - } else if (channel_mode == 10) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - } else if (channel_mode == 12) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_TSR; - } else if (channel_mode == 14) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_TSR; - ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; - ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; - } else if (channel_mode == 16) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_TSR; - ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; - ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; - ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; - ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; - } else if (channel_mode == 32) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; - ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; - ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; - ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; - ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; - ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2; - ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL; - ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR; - ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC; - ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL; - ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR; - ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR; - ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC; - ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC; - ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL; - ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR; - ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW; - ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - goto inval_ch_mod; - } - } - -non_mch_path: -inval_ch_mod: - return rc; -} - -static int adm_arrange_mch_ep2_map_v8( - struct adm_device_endpoint_payload *ep_payload, - int channel_mode) -{ - int rc = 0; - - memset(ep_payload->dev_channel_mapping, 0, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (channel_mode == 1) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 8) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - } else if (channel_mode == 10) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; - } else if (channel_mode == 12) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_TSR; - } else if (channel_mode == 16) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; - ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; - ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; - ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; - ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; - } else if (channel_mode == 32) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; - ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; - ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; - ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; - ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; - ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2; - ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL; - ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR; - ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC; - ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL; - ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR; - ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR; - ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC; - ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC; - ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL; - ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR; - ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW; - ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - } - - return rc; -} - -static int adm_copp_set_ec_ref_mfc_cfg(int port_id, int copp_idx, - int sample_rate, int bps, - int in_channels, int out_channels) -{ - struct audproc_mfc_param_media_fmt mfc_cfg; - struct param_hdr_v3 param_hdr; - u16 *chmixer_params = NULL; - int rc = 0, i = 0, j = 0, param_index = 0, param_size = 0; - struct adm_device_endpoint_payload ep_payload = {0, 0, 0, {0}}; - - memset(&mfc_cfg, 0, sizeof(mfc_cfg)); - memset(&ep_payload, 0, sizeof(ep_payload)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AUDPROC_MODULE_ID_MFC_EC_REF; - param_hdr.instance_id = INSTANCE_ID_0; - - pr_debug("%s: port_id %d copp_idx %d SR %d, BW %d in_ch %d out_ch %d\n", - __func__, port_id, copp_idx, sample_rate, - bps, in_channels, out_channels); - - if (out_channels <= 0 || out_channels > AUDPROC_MFC_OUT_CHANNELS_MAX) { - pr_err("%s: unsupported out channels=%d\n", __func__, out_channels); - return -EINVAL; - } - - /* 1. Update Media Format */ - param_hdr.param_id = AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT; - param_hdr.param_size = sizeof(mfc_cfg); - - mfc_cfg.sampling_rate = sample_rate; - mfc_cfg.bits_per_sample = bps; - mfc_cfg.num_channels = out_channels; - - ep_payload.dev_num_channel = out_channels; - rc = adm_arrange_mch_ep2_map_v8(&ep_payload, out_channels); - if (rc < 0) { - pr_err("%s: unable to get map for out channels=%d\n", - __func__, out_channels); - return -EINVAL; - } - - for (i = 0; i < out_channels; i++) - mfc_cfg.channel_type[i] = (uint16_t) ep_payload.dev_channel_mapping[i]; - - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, - param_hdr, (uint8_t *) &mfc_cfg); - if (rc) { - pr_err("%s: Failed to set media format, err %d\n", __func__, rc); - return rc; - } - - /* 2. Send Channel Mixer params */ - param_size = 2 * (4 + out_channels + in_channels + (out_channels * in_channels)); - param_size = round_up(param_size, 4); - param_hdr.param_id = DEFAULT_CHMIXER_PARAM_ID_COEFF; - param_hdr.param_size = param_size; - - pr_debug("%s: chmixer param sz = %d\n", __func__, param_size); - chmixer_params = kzalloc(param_size, GFP_KERNEL); - if (!chmixer_params) { - return -ENOMEM; - } - param_index = 2; /* param[0] and [1] represents chmixer rule(always 0) */ - chmixer_params[param_index++] = out_channels; - chmixer_params[param_index++] = in_channels; - - /* output channel map is same as one set in media format */ - for (i = 0; i < out_channels; i++) - chmixer_params[param_index++] = ep_payload.dev_channel_mapping[i]; - - /* input channel map should be same as one set for ep2 during copp open */ - ep_payload.dev_num_channel = in_channels; - rc = adm_arrange_mch_ep2_map_v8(&ep_payload, in_channels); - if (rc < 0) { - pr_err("%s: unable to get in channal map\n", __func__); - goto exit; - } - for (i = 0; i < in_channels; i++) - chmixer_params[param_index++] = ep_payload.dev_channel_mapping[i]; - - for (i = 0; i < out_channels; i++) - for (j = 0; j < in_channels; j++) - chmixer_params[param_index++] = this_adm.ec_ref_chmixer_weights[i][j]; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, - param_hdr, (uint8_t *) chmixer_params); - if (rc) - pr_err("%s: Failed to set chmixer params, err %d\n", __func__, rc); - -exit: - kfree(chmixer_params); - return rc; -} - -/** - * adm_open - - * command to send ADM open - * - * @port_id: port id number - * @path: direction or ADM path type - * @rate: sample rate of session - * @channel_mode: number of channels set - * @topology: topology active for this session - * @perf_mode: performance mode like LL/ULL/.. - * @bit_width: bit width to set for copp - * @app_type: App type used for this session - * @acdb_id: ACDB ID of this device - * @session_type: type of session - * - * Returns 0 on success or error on failure - */ -int adm_open(int port_id, int path, int rate, int channel_mode, int topology, - int perf_mode, uint16_t bit_width, int app_type, int acdb_id, - int session_type) -{ - struct adm_cmd_device_open_v5 open; - struct adm_cmd_device_open_v6 open_v6; - struct adm_cmd_device_open_v8 open_v8; - struct adm_device_endpoint_payload ep1_payload; - struct adm_device_endpoint_payload ep2_payload; - int ep1_payload_size = 0; - int ep2_payload_size = 0; - int ret = 0; - int port_idx, flags; - int copp_idx = -1; - int tmp_port = q6audio_get_port_id(port_id); - void *adm_params = NULL; - int param_size; - int num_ec_ref_rx_chans = this_adm.num_ec_ref_rx_chans; - - pr_debug("%s:port %#x path:%d rate:%d mode:%d perf_mode:%d,topo_id %d\n", - __func__, port_id, path, rate, channel_mode, perf_mode, - topology); - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - if (channel_mode < 0 || channel_mode > 32) { - pr_err("%s: Invalid channel number 0x%x\n", - __func__, channel_mode); - return -EINVAL; - } - - if (this_adm.apr == NULL) { - this_adm.apr = apr_register("ADSP", "ADM", adm_callback, - 0xFFFFFFFF, &this_adm); - if (this_adm.apr == NULL) { - pr_err("%s: Unable to register ADM\n", __func__); - return -ENODEV; - } - rtac_set_adm_handle(this_adm.apr); - } - - if (perf_mode == ULL_POST_PROCESSING_PCM_MODE) { - flags = ADM_ULL_POST_PROCESSING_DEVICE_SESSION; - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || - (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) - topology = DEFAULT_COPP_TOPOLOGY; - } else if (perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) { - flags = ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION; - topology = NULL_COPP_TOPOLOGY; - rate = ULL_SUPPORTED_SAMPLE_RATE; - bit_width = ULL_SUPPORTED_BITS_PER_SAMPLE; - } else if (perf_mode == LOW_LATENCY_PCM_MODE) { - flags = ADM_LOW_LATENCY_DEVICE_SESSION; - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || - (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) - topology = DEFAULT_COPP_TOPOLOGY; - } else { - if ((path == ADM_PATH_COMPRESSED_RX) || - (path == ADM_PATH_COMPRESSED_TX)) - flags = 0; - else - flags = ADM_LEGACY_DEVICE_SESSION; - } - - if ((topology == VPM_TX_SM_ECNS_V2_COPP_TOPOLOGY) || - (topology == VPM_TX_DM_FLUENCE_EF_COPP_TOPOLOGY)) { - if ((rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_8K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_16K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_32K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_48K)) - rate = 16000; - } - if ((topology == VPM_TX_DM_FLUENCE_COPP_TOPOLOGY) || - (topology == VPM_TX_DM_RFECNS_COPP_TOPOLOGY)) { - if ((rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_8K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_16K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_32K)) - rate = 16000; - } - - if (topology == FFECNS_TOPOLOGY) { - this_adm.ffecns_port_id = port_id; - pr_debug("%s: ffecns port id =%x\n", __func__, - this_adm.ffecns_port_id); - } - - if (topology == VPM_TX_VOICE_SMECNS_V2_COPP_TOPOLOGY) - channel_mode = 1; - - /* - * Routing driver reuses the same adm for streams with the same - * app_type, sample_rate etc. - * This isn't allowed for ULL streams as per the DSP interface - */ - if (perf_mode != ULTRA_LOW_LATENCY_PCM_MODE) - copp_idx = adm_get_idx_if_copp_exists(port_idx, topology, - perf_mode, - rate, bit_width, - app_type, session_type); - - if (copp_idx < 0) { - copp_idx = adm_get_next_available_copp(port_idx); - if (copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: exceeded copp id %d\n", - __func__, copp_idx); - return -EINVAL; - } - atomic_set(&this_adm.copp.cnt[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.topology[port_idx][copp_idx], - topology); - atomic_set(&this_adm.copp.mode[port_idx][copp_idx], - perf_mode); - atomic_set(&this_adm.copp.rate[port_idx][copp_idx], - rate); - atomic_set(&this_adm.copp.channels[port_idx][copp_idx], - channel_mode); - atomic_set(&this_adm.copp.bit_width[port_idx][copp_idx], - bit_width); - atomic_set(&this_adm.copp.app_type[port_idx][copp_idx], - app_type); - atomic_set(&this_adm.copp.acdb_id[port_idx][copp_idx], - acdb_id); - atomic_set(&this_adm.copp.session_type[port_idx][copp_idx], - session_type); - set_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp.adm_status[port_idx][copp_idx]); - if ((path != ADM_PATH_COMPRESSED_RX) && - (path != ADM_PATH_COMPRESSED_TX)) - send_adm_custom_topology(); - } - - if (this_adm.copp.adm_delay[port_idx][copp_idx] && - perf_mode == LEGACY_PCM_MODE) { - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], - 1); - this_adm.copp.adm_delay[port_idx][copp_idx] = 0; - wake_up(&this_adm.copp.adm_delay_wait[port_idx][copp_idx]); - } - - /* Create a COPP if port id are not enabled */ - if (atomic_read(&this_adm.copp.cnt[port_idx][copp_idx]) == 0) { - pr_debug("%s: open ADM: port_idx: %d, copp_idx: %d\n", __func__, - port_idx, copp_idx); - if ((topology == SRS_TRUMEDIA_TOPOLOGY_ID) && - perf_mode == LEGACY_PCM_MODE) { - int res; - - atomic_set(&this_adm.mem_map_index, ADM_SRS_TRUMEDIA); - msm_dts_srs_tm_ion_memmap(&this_adm.outband_memmap); - res = adm_memory_map_regions( - &this_adm.outband_memmap.paddr, 0, - (uint32_t *)&this_adm.outband_memmap.size, 1); - if (res < 0) { - pr_err("%s: SRS adm_memory_map_regions failed! addr = 0x%pK, size = %d\n", - __func__, - (void *)this_adm.outband_memmap.paddr, - (uint32_t)this_adm.outband_memmap.size); - } - } - - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ADM_V) >= - ADSP_ADM_API_VERSION_V3)) { - memset(&open_v8, 0, sizeof(open_v8)); - memset(&ep1_payload, 0, sizeof(ep1_payload)); - memset(&ep2_payload, 0, sizeof(ep2_payload)); - - open_v8.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - open_v8.hdr.src_svc = APR_SVC_ADM; - open_v8.hdr.src_domain = APR_DOMAIN_APPS; - open_v8.hdr.src_port = tmp_port; - open_v8.hdr.dest_svc = APR_SVC_ADM; - open_v8.hdr.dest_domain = APR_DOMAIN_ADSP; - open_v8.hdr.dest_port = tmp_port; - open_v8.hdr.token = port_idx << 16 | copp_idx; - open_v8.hdr.opcode = ADM_CMD_DEVICE_OPEN_V8; - - if (this_adm.native_mode != 0) { - open_v8.flags = flags | - (this_adm.native_mode << 11); - this_adm.native_mode = 0; - } else { - open_v8.flags = flags; - } - open_v8.mode_of_operation = path; - open_v8.endpoint_id_1 = tmp_port; - open_v8.endpoint_id_2 = 0xFFFF; - open_v8.endpoint_id_3 = 0xFFFF; - - if (((this_adm.ec_ref_rx & AFE_PORT_INVALID) != - AFE_PORT_INVALID) && - (path != ADM_PATH_PLAYBACK)) { - if (this_adm.num_ec_ref_rx_chans != 0) { - open_v8.endpoint_id_2 = - this_adm.ec_ref_rx; - this_adm.ec_ref_rx = AFE_PORT_INVALID; - } else { - pr_err("%s: EC channels not set %d\n", - __func__, - this_adm.num_ec_ref_rx_chans); - return -EINVAL; - } - } - - open_v8.topology_id = topology; - open_v8.reserved = 0; - - /* variable endpoint payload */ - ep1_payload.dev_num_channel = channel_mode & 0x00FF; - ep1_payload.bit_width = bit_width; - ep1_payload.sample_rate = rate; - ret = adm_arrange_mch_map_v8(&ep1_payload, path, - channel_mode, port_idx); - if (ret) - return ret; - - pr_debug("%s: port_id=0x%x %x %x topology_id=0x%X flags %x ref_ch %x\n", - __func__, open_v8.endpoint_id_1, - open_v8.endpoint_id_2, - open_v8.endpoint_id_3, - open_v8.topology_id, - open_v8.flags, - this_adm.num_ec_ref_rx_chans); - - ep1_payload_size = 8 + - roundup(ep1_payload.dev_num_channel, 4); - param_size = sizeof(struct adm_cmd_device_open_v8) - + ep1_payload_size; - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - - if ((this_adm.num_ec_ref_rx_chans != 0) - && (path != ADM_PATH_PLAYBACK) - && (open_v8.endpoint_id_2 != 0xFFFF)) { - ep2_payload.dev_num_channel = - this_adm.num_ec_ref_rx_chans; - - if (this_adm.ec_ref_rx_bit_width != 0) { - ep2_payload.bit_width = - this_adm.ec_ref_rx_bit_width; - } else { - ep2_payload.bit_width = bit_width; - } - - if (this_adm.ec_ref_rx_sampling_rate != 0) { - ep2_payload.sample_rate = - this_adm.ec_ref_rx_sampling_rate; - } else { - ep2_payload.sample_rate = rate; - } - - pr_debug("%s: adm open_v8 eid2_channels=%d eid2_bit_width=%d eid2_rate=%d\n", - __func__, - ep2_payload.dev_num_channel, - ep2_payload.bit_width, - ep2_payload.sample_rate); - - ret = adm_arrange_mch_ep2_map_v8(&ep2_payload, - ep2_payload.dev_num_channel); - - if (ret) - return ret; - ep2_payload_size = 8 + - roundup(ep2_payload.dev_num_channel, 4); - param_size += ep2_payload_size; - } - - open_v8.hdr.pkt_size = param_size; - adm_params = kzalloc(param_size, GFP_KERNEL); - if (!adm_params) - return -ENOMEM; - memcpy(adm_params, &open_v8, sizeof(open_v8)); - memcpy(adm_params + sizeof(open_v8), - (void *)&ep1_payload, - ep1_payload_size); - - if ((this_adm.num_ec_ref_rx_chans != 0) - && (path != ADM_PATH_PLAYBACK) - && (open_v8.endpoint_id_2 != 0xFFFF)) { - this_adm.num_ec_ref_rx_chans = 0; - memcpy(adm_params + sizeof(open_v8) - + ep1_payload_size, - (void *)&ep2_payload, - ep2_payload_size); - } - - ret = apr_send_pkt(this_adm.apr, - (uint32_t *)adm_params); - if (ret < 0) { - pr_err("%s: port_id: 0x%x for[0x%x] failed %d for open_v8\n", - __func__, tmp_port, port_id, ret); - return -EINVAL; - } - kfree(adm_params); - } else { - - open.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - open.hdr.pkt_size = sizeof(open); - open.hdr.src_svc = APR_SVC_ADM; - open.hdr.src_domain = APR_DOMAIN_APPS; - open.hdr.src_port = tmp_port; - open.hdr.dest_svc = APR_SVC_ADM; - open.hdr.dest_domain = APR_DOMAIN_ADSP; - open.hdr.dest_port = tmp_port; - open.hdr.token = port_idx << 16 | copp_idx; - open.hdr.opcode = ADM_CMD_DEVICE_OPEN_V5; - open.flags = flags; - open.mode_of_operation = path; - open.endpoint_id_1 = tmp_port; - open.endpoint_id_2 = 0xFFFF; - - if (this_adm.ec_ref_rx && (path != 1) && - (afe_get_port_type(tmp_port) == MSM_AFE_PORT_TYPE_TX)) { - open.endpoint_id_2 = this_adm.ec_ref_rx; - } - - open.topology_id = topology; - - open.dev_num_channel = channel_mode & 0x00FF; - open.bit_width = bit_width; - WARN_ON((perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) && - (rate != ULL_SUPPORTED_SAMPLE_RATE)); - open.sample_rate = rate; - - ret = adm_arrange_mch_map(&open, path, channel_mode, - port_idx); - if (ret) - return ret; - - pr_debug("%s: port_id=0x%x rate=%d topology_id=0x%X\n", - __func__, open.endpoint_id_1, open.sample_rate, - open.topology_id); - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - - if ((this_adm.num_ec_ref_rx_chans != 0) && - (path != 1) && (open.endpoint_id_2 != 0xFFFF)) { - memset(&open_v6, 0, - sizeof(struct adm_cmd_device_open_v6)); - memcpy(&open_v6, &open, - sizeof(struct adm_cmd_device_open_v5)); - open_v6.hdr.opcode = ADM_CMD_DEVICE_OPEN_V6; - open_v6.hdr.pkt_size = sizeof(open_v6); - open_v6.dev_num_channel_eid2 = - this_adm.num_ec_ref_rx_chans; - - if (this_adm.ec_ref_rx_bit_width != 0) { - open_v6.bit_width_eid2 = - this_adm.ec_ref_rx_bit_width; - } else { - open_v6.bit_width_eid2 = bit_width; - } - - if (this_adm.ec_ref_rx_sampling_rate != 0) { - open_v6.sample_rate_eid2 = - this_adm.ec_ref_rx_sampling_rate; - } else { - open_v6.sample_rate_eid2 = rate; - } - - pr_debug("%s: eid2_channels=%d eid2_bit_width=%d eid2_rate=%d\n", - __func__, open_v6.dev_num_channel_eid2, - open_v6.bit_width_eid2, - open_v6.sample_rate_eid2); - - ret = adm_arrange_mch_ep2_map(&open_v6, - open_v6.dev_num_channel_eid2); - - if (ret) - return ret; - - ret = apr_send_pkt(this_adm.apr, - (uint32_t *)&open_v6); - } else { - ret = apr_send_pkt(this_adm.apr, - (uint32_t *)&open); - } - if (ret < 0) { - pr_err("%s: port_id: 0x%x for[0x%x] failed %d\n", - __func__, tmp_port, port_id, ret); - return -EINVAL; - } - } - - /* Wait for the callback with copp id */ - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) >= 0, - msecs_to_jiffies(2 * TIMEOUT_MS)); - if (!ret) { - pr_err("%s: ADM open timedout for port_id: 0x%x for [0x%x]\n", - __func__, tmp_port, port_id); - return -EINVAL; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]))); - return adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - } - } - atomic_inc(&this_adm.copp.cnt[port_idx][copp_idx]); - - /* - * Configure MFC(in ec_ref path) if chmixing param is applicable and set. - * Except channels and channel maps the media format config for this module - * should match with the COPP(EP1) config values. - */ - if (path != ADM_PATH_PLAYBACK && - this_adm.num_ec_ref_rx_chans_downmixed != 0 && - num_ec_ref_rx_chans != this_adm.num_ec_ref_rx_chans_downmixed) { - ret = adm_copp_set_ec_ref_mfc_cfg(port_id, copp_idx, - rate, bit_width, num_ec_ref_rx_chans, - this_adm.num_ec_ref_rx_chans_downmixed); - this_adm.num_ec_ref_rx_chans_downmixed = 0; - if (ret) - pr_err("%s: set EC REF MFC cfg failed, err %d\n", __func__, ret); - } - - return copp_idx; -} -EXPORT_SYMBOL(adm_open); - -/** - * adm_copp_mfc_cfg - - * command to send ADM MFC config - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @dst_sample_rate: sink sample rate - * - */ -void adm_copp_mfc_cfg(int port_id, int copp_idx, int dst_sample_rate) -{ - struct audproc_mfc_param_media_fmt mfc_cfg; - struct adm_cmd_device_open_v5 open; - struct param_hdr_v3 param_hdr; - int port_idx; - int rc = 0; - int i = 0; - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - goto fail_cmd; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - goto fail_cmd; - } - - memset(&mfc_cfg, 0, sizeof(mfc_cfg)); - memset(&open, 0, sizeof(open)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AUDPROC_MODULE_ID_MFC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT; - param_hdr.param_size = sizeof(mfc_cfg); - - mfc_cfg.sampling_rate = dst_sample_rate; - mfc_cfg.bits_per_sample = - atomic_read(&this_adm.copp.bit_width[port_idx][copp_idx]); - open.dev_num_channel = mfc_cfg.num_channels = - atomic_read(&this_adm.copp.channels[port_idx][copp_idx]); - - rc = adm_arrange_mch_map(&open, ADM_PATH_PLAYBACK, - mfc_cfg.num_channels, port_idx); - if (rc < 0) { - pr_err("%s: unable to get channal map\n", __func__); - goto fail_cmd; - } - - for (i = 0; i < mfc_cfg.num_channels; i++) - mfc_cfg.channel_type[i] = - (uint16_t) open.dev_channel_mapping[i]; - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - - pr_debug("%s: mfc config: port_idx %d copp_idx %d copp SR %d copp BW %d copp chan %d o/p SR %d\n", - __func__, port_idx, copp_idx, - atomic_read(&this_adm.copp.rate[port_idx][copp_idx]), - mfc_cfg.bits_per_sample, mfc_cfg.num_channels, - mfc_cfg.sampling_rate); - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &mfc_cfg); - if (rc) - pr_err("%s: Failed to set media format configuration data, err %d\n", - __func__, rc); - -fail_cmd: - return; -} -EXPORT_SYMBOL(adm_copp_mfc_cfg); - -static void route_set_opcode_matrix_id( - struct adm_cmd_matrix_map_routings_v5 **route_addr, - int path, uint32_t passthr_mode) -{ - struct adm_cmd_matrix_map_routings_v5 *route = *route_addr; - - switch (path) { - case ADM_PATH_PLAYBACK: - route->hdr.opcode = ADM_CMD_MATRIX_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_AUDIO_RX; - break; - case ADM_PATH_LIVE_REC: - if (passthr_mode == LISTEN) { - route->hdr.opcode = - ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_LISTEN_TX; - break; - } - /* fall through to set matrix id for non-listen case */ - case ADM_PATH_NONLIVE_REC: - route->hdr.opcode = ADM_CMD_MATRIX_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_AUDIO_TX; - break; - case ADM_PATH_COMPRESSED_RX: - route->hdr.opcode = ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_COMPRESSED_AUDIO_RX; - break; - case ADM_PATH_COMPRESSED_TX: - route->hdr.opcode = ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_COMPRESSED_AUDIO_TX; - break; - default: - pr_err("%s: Wrong path set[%d]\n", __func__, path); - break; - } - pr_debug("%s: opcode 0x%x, matrix id %d\n", - __func__, route->hdr.opcode, route->matrix_id); -} - -/** - * adm_matrix_map - - * command to send ADM matrix map for ADM copp list - * - * @path: direction or ADM path type - * @payload_map: have info of session id and associated copp_idx/num_copps - * @perf_mode: performance mode like LL/ULL/.. - * @passthr_mode: flag to indicate passthrough mode - * - * Returns 0 on success or error on failure - */ -int adm_matrix_map(int path, struct route_payload payload_map, int perf_mode, - uint32_t passthr_mode) -{ - struct adm_cmd_matrix_map_routings_v5 *route; - struct adm_session_map_node_v5 *node; - uint16_t *copps_list; - int cmd_size = 0; - int ret = 0, i = 0; - void *payload = NULL; - void *matrix_map = NULL; - int port_idx, copp_idx; - - /* Assumes port_ids have already been validated during adm_open */ - cmd_size = (sizeof(struct adm_cmd_matrix_map_routings_v5) + - sizeof(struct adm_session_map_node_v5) + - (sizeof(uint32_t) * payload_map.num_copps)); - matrix_map = kzalloc(cmd_size, GFP_KERNEL); - if (matrix_map == NULL) { - pr_err("%s: Mem alloc failed\n", __func__); - ret = -EINVAL; - return ret; - } - route = (struct adm_cmd_matrix_map_routings_v5 *)matrix_map; - - route->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - route->hdr.pkt_size = cmd_size; - route->hdr.src_svc = 0; - route->hdr.src_domain = APR_DOMAIN_APPS; - route->hdr.src_port = 0; /* Ignored */; - route->hdr.dest_svc = APR_SVC_ADM; - route->hdr.dest_domain = APR_DOMAIN_ADSP; - route->hdr.dest_port = 0; /* Ignored */; - route->hdr.token = 0; - route->num_sessions = 1; - route_set_opcode_matrix_id(&route, path, passthr_mode); - - payload = ((u8 *)matrix_map + - sizeof(struct adm_cmd_matrix_map_routings_v5)); - node = (struct adm_session_map_node_v5 *)payload; - - node->session_id = payload_map.session_id; - node->num_copps = payload_map.num_copps; - payload = (u8 *)node + sizeof(struct adm_session_map_node_v5); - copps_list = (uint16_t *)payload; - for (i = 0; i < payload_map.num_copps; i++) { - port_idx = - adm_validate_and_get_port_index(payload_map.port_id[i]); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, - payload_map.port_id[i]); - ret = -EINVAL; - goto fail_cmd; - } - copp_idx = payload_map.copp_idx[i]; - copps_list[i] = atomic_read(&this_adm.copp.id[port_idx] - [copp_idx]); - } - atomic_set(&this_adm.matrix_map_stat, -1); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *)matrix_map); - if (ret < 0) { - pr_err("%s: routing for syream %d failed ret %d\n", - __func__, payload_map.session_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - ret = wait_event_timeout(this_adm.matrix_map_wait, - atomic_read(&this_adm.matrix_map_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: routing for syream %d failed\n", __func__, - payload_map.session_id); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.matrix_map_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_adm.matrix_map_stat))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.matrix_map_stat)); - goto fail_cmd; - } - - if ((perf_mode != ULTRA_LOW_LATENCY_PCM_MODE) && - (path != ADM_PATH_COMPRESSED_RX)) { - for (i = 0; i < payload_map.num_copps; i++) { - port_idx = afe_get_port_index(payload_map.port_id[i]); - copp_idx = payload_map.copp_idx[i]; - if (port_idx < 0 || copp_idx < 0 || - (copp_idx > MAX_COPPS_PER_PORT - 1)) { - pr_err("%s: Invalid idx port_idx %d copp_idx %d\n", - __func__, port_idx, copp_idx); - continue; - } - rtac_add_adm_device(payload_map.port_id[i], - atomic_read(&this_adm.copp.id - [port_idx][copp_idx]), - get_cal_path(path), - payload_map.session_id, - payload_map.app_type[i], - payload_map.acdb_dev_id[i]); - - if (!test_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp.adm_status[port_idx] - [copp_idx])) { - pr_debug("%s: adm copp[0x%x][%d] already sent", - __func__, port_idx, copp_idx); - continue; - } - send_adm_cal(payload_map.port_id[i], copp_idx, - get_cal_path(path), perf_mode, - payload_map.app_type[i], - payload_map.acdb_dev_id[i], - payload_map.sample_rate[i], - passthr_mode); - /* ADM COPP calibration is already sent */ - clear_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp. - adm_status[port_idx][copp_idx]); - pr_debug("%s: copp_id: %d\n", __func__, - atomic_read(&this_adm.copp.id[port_idx] - [copp_idx])); - } - } - -fail_cmd: - kfree(matrix_map); - return ret; -} -EXPORT_SYMBOL(adm_matrix_map); - -/** - * adm_ec_ref_rx_id - - * Update EC ref port ID - * - */ -void adm_ec_ref_rx_id(int port_id) -{ - this_adm.ec_ref_rx = port_id; - pr_debug("%s: ec_ref_rx:%d\n", __func__, this_adm.ec_ref_rx); -} -EXPORT_SYMBOL(adm_ec_ref_rx_id); - -/** - * adm_num_ec_ref_rx_chans - - * Update EC ref number of channels - * - */ -void adm_num_ec_ref_rx_chans(int num_chans) -{ - this_adm.num_ec_ref_rx_chans = num_chans; - pr_debug("%s: num_ec_ref_rx_chans:%d\n", - __func__, this_adm.num_ec_ref_rx_chans); -} -EXPORT_SYMBOL(adm_num_ec_ref_rx_chans); - -/** - * adm_num_ec_rx_ref_chans_downmixed - - * Update EC ref num of channels(downmixed) to be fed to EC algo - * - */ -void adm_num_ec_ref_rx_chans_downmixed(int num_chans) -{ - this_adm.num_ec_ref_rx_chans_downmixed = num_chans; - pr_debug("%s: num_ec_ref_rx_chans_downmixed:%d\n", - __func__, this_adm.num_ec_ref_rx_chans_downmixed); -} -EXPORT_SYMBOL(adm_num_ec_ref_rx_chans_downmixed); - -/** - * adm_ec_ref_chmixer_weights - - * Update MFC(in ec ref) Channel Mixer Weights to be used - * for downmixing rx channels before feeding them to EC algo - * @out_channel_idx: index of output channel to which weightages are applicable - * @weights: pointer to array having input weightages - * @count: array sizeof pointer weights, max supported value is - * PCM_FORMAT_MAX_NUM_CHANNEL_V8 - * Returns 0 on success or error on failure - */ -int adm_ec_ref_chmixer_weights(int out_channel_idx, - uint16_t *weights, int count) -{ - int i = 0; - - if (weights == NULL || count <= 0 || out_channel_idx < 0 || - count > PCM_FORMAT_MAX_NUM_CHANNEL_V8 || - out_channel_idx >= PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: invalid weightages count(%d) ch_idx(%d)", - __func__, count, out_channel_idx); - return -EINVAL; - } - - for (i = 0; i < count; i++) { - this_adm.ec_ref_chmixer_weights[out_channel_idx][i] = weights[i]; - pr_debug("%s: out ch idx :%d, weight[%d] = %d\n", - __func__, out_channel_idx, i, weights[i]); - } - - return 0; -} -EXPORT_SYMBOL(adm_ec_ref_chmixer_weights); - -/** - * adm_ec_ref_rx_bit_width - - * Update EC ref bit_width - * - */ -void adm_ec_ref_rx_bit_width(int bit_width) -{ - this_adm.ec_ref_rx_bit_width = bit_width; - pr_debug("%s: ec_ref_rx_bit_width:%d\n", - __func__, this_adm.ec_ref_rx_bit_width); -} -EXPORT_SYMBOL(adm_ec_ref_rx_bit_width); - -/** - * adm_ec_ref_rx_sampling_rate - - * Update EC ref sample rate - * - */ -void adm_ec_ref_rx_sampling_rate(int sampling_rate) -{ - this_adm.ec_ref_rx_sampling_rate = sampling_rate; - pr_debug("%s: ec_ref_rx_sampling_rate:%d\n", - __func__, this_adm.ec_ref_rx_sampling_rate); -} -EXPORT_SYMBOL(adm_ec_ref_rx_sampling_rate); - -/** - * adm_set_native_mode - - * Set adm channel native mode. - * If enabled matrix mixer will be - * running in native mode for channel - * configuration for this device session. - * - */ -void adm_set_native_mode(int mode) -{ - this_adm.native_mode = mode; - pr_debug("%s: enable native_mode :%d\n", - __func__, this_adm.native_mode); -} -EXPORT_SYMBOL(adm_set_native_mode); - -/** - * adm_close - - * command to close ADM copp - * - * @port_id: Port ID number - * @perf_mode: performance mode like LL/ULL/.. - * @copp_idx: copp index assigned - * - * Returns 0 on success or error on failure - */ -int adm_close(int port_id, int perf_mode, int copp_idx) -{ - struct apr_hdr close; - - int ret = 0, port_idx; - int copp_id = RESET_COPP_ID; - - pr_debug("%s: port_id=0x%x perf_mode: %d copp_idx: %d\n", __func__, - port_id, perf_mode, copp_idx); - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", - __func__, port_id); - return -EINVAL; - } - - if ((copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp idx: %d\n", __func__, copp_idx); - return -EINVAL; - } - - port_channel_map[port_idx].set_channel_map = false; - if (this_adm.copp.adm_delay[port_idx][copp_idx] && perf_mode - == LEGACY_PCM_MODE) { - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], - 1); - this_adm.copp.adm_delay[port_idx][copp_idx] = 0; - wake_up(&this_adm.copp.adm_delay_wait[port_idx][copp_idx]); - } - - atomic_dec(&this_adm.copp.cnt[port_idx][copp_idx]); - if (!(atomic_read(&this_adm.copp.cnt[port_idx][copp_idx]))) { - copp_id = adm_get_copp_id(port_idx, copp_idx); - pr_debug("%s: Closing ADM port_idx:%d copp_idx:%d copp_id:0x%x\n", - __func__, port_idx, copp_idx, copp_id); - if ((!perf_mode) && (this_adm.outband_memmap.paddr != 0) && - (atomic_read(&this_adm.copp.topology[port_idx][copp_idx]) == - SRS_TRUMEDIA_TOPOLOGY_ID)) { - atomic_set(&this_adm.mem_map_index, - ADM_SRS_TRUMEDIA); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: adm mem unmmap err %d", - __func__, ret); - } else { - atomic_set(&this_adm.mem_map_handles - [ADM_SRS_TRUMEDIA], 0); - } - } - - - if ((afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) && - this_adm.sourceTrackingData.memmap.paddr) { - atomic_set(&this_adm.mem_map_index, - ADM_MEM_MAP_INDEX_SOURCE_TRACKING); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: adm mem unmmap err %d", - __func__, ret); - } - msm_audio_ion_free( - this_adm.sourceTrackingData.dma_buf); - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - atomic_set(&this_adm.mem_map_handles[ - ADM_MEM_MAP_INDEX_SOURCE_TRACKING], 0); - } - - close.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - close.pkt_size = sizeof(close); - close.src_svc = APR_SVC_ADM; - close.src_domain = APR_DOMAIN_APPS; - close.src_port = port_id; - close.dest_svc = APR_SVC_ADM; - close.dest_domain = APR_DOMAIN_ADSP; - close.dest_port = copp_id; - close.token = port_idx << 16 | copp_idx; - close.opcode = ADM_CMD_DEVICE_CLOSE_V5; - - atomic_set(&this_adm.copp.id[port_idx][copp_idx], - RESET_COPP_ID); - atomic_set(&this_adm.copp.cnt[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.topology[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.mode[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - atomic_set(&this_adm.copp.rate[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.channels[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.bit_width[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.app_type[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.session_type[port_idx][copp_idx], 0); - - clear_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp.adm_status[port_idx][copp_idx]); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&close); - if (ret < 0) { - pr_err("%s: ADM close failed %d\n", __func__, ret); - return -EINVAL; - } - - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: ADM cmd Route timedout for port 0x%x\n", - __func__, port_id); - return -EINVAL; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]))); - return adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - } - } - - if (perf_mode != ULTRA_LOW_LATENCY_PCM_MODE) { - pr_debug("%s: remove adm device from rtac\n", __func__); - rtac_remove_adm_device(port_id, copp_id); - } - - if (port_id == this_adm.ffecns_port_id) - this_adm.ffecns_port_id = -1; - - return 0; -} -EXPORT_SYMBOL(adm_close); - -int send_rtac_audvol_cal(void) -{ - int ret = 0; - int ret2 = 0; - int i = 0; - int copp_idx, port_idx, acdb_id, app_id, path; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - struct rtac_adm rtac_adm_data; - - mutex_lock(&this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]->lock); - - cal_block = cal_utils_get_only_cal_block( - this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s: can't find cal block!\n", __func__); - goto unlock; - } - - audvol_cal_info = cal_block->cal_info; - if (audvol_cal_info == NULL) { - pr_err("%s: audvol_cal_info is NULL!\n", __func__); - goto unlock; - } - - get_rtac_adm_data(&rtac_adm_data); - for (; i < rtac_adm_data.num_of_dev; i++) { - - acdb_id = rtac_adm_data.device[i].acdb_dev_id; - if (acdb_id == 0) - acdb_id = audvol_cal_info->acdb_id; - - app_id = rtac_adm_data.device[i].app_type; - if (app_id == 0) - app_id = audvol_cal_info->app_type; - - path = afe_get_port_type(rtac_adm_data.device[i].afe_port); - if ((acdb_id == audvol_cal_info->acdb_id) && - (app_id == audvol_cal_info->app_type) && - (path == audvol_cal_info->path)) { - - if (adm_get_indexes_from_copp_id(rtac_adm_data. - device[i].copp, &copp_idx, &port_idx) != 0) { - pr_debug("%s: Copp Id %d is not active\n", - __func__, - rtac_adm_data.device[i].copp); - continue; - } - - ret2 = adm_remap_and_send_cal_block(ADM_RTAC_AUDVOL_CAL, - rtac_adm_data.device[i].afe_port, - copp_idx, cal_block, - atomic_read(&this_adm.copp. - mode[port_idx][copp_idx]), - audvol_cal_info->app_type, - audvol_cal_info->acdb_id, - atomic_read(&this_adm.copp. - rate[port_idx][copp_idx])); - if (ret2 < 0) { - pr_debug("%s: remap and send failed for copp Id %d, acdb id %d, app type %d, path %d\n", - __func__, rtac_adm_data.device[i].copp, - audvol_cal_info->acdb_id, - audvol_cal_info->app_type, - audvol_cal_info->path); - ret = ret2; - } - } - } -unlock: - mutex_unlock(&this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]->lock); - return ret; -} - -int adm_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - result = -EINVAL; - goto done; - } - - /* valid port ID needed for callback use primary I2S */ - atomic_set(&this_adm.mem_map_index, ADM_RTAC_APR_CAL); - result = adm_memory_map_regions(&cal_block->cal_data.paddr, 0, - &cal_block->map_data.map_size, 1); - if (result < 0) { - pr_err("%s: RTAC mmap did not work! size = %d result %d\n", - __func__, - cal_block->map_data.map_size, result); - pr_debug("%s: RTAC mmap did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - - cal_block->map_data.map_handle = atomic_read( - &this_adm.mem_map_handles[ADM_RTAC_APR_CAL]); -done: - return result; -} - -int adm_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (mem_map_handle == NULL) { - pr_debug("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle != atomic_read( - &this_adm.mem_map_handles[ADM_RTAC_APR_CAL])) { - pr_err("%s: Map handles do not match! Unmapping RTAC, RTAC map 0x%x, ADM map 0x%x\n", - __func__, *mem_map_handle, atomic_read( - &this_adm.mem_map_handles[ADM_RTAC_APR_CAL])); - - /* if mismatch use handle passed in to unmap */ - atomic_set(&this_adm.mem_map_handles[ADM_RTAC_APR_CAL], - *mem_map_handle); - } - - /* valid port ID needed for callback use primary I2S */ - atomic_set(&this_adm.mem_map_index, ADM_RTAC_APR_CAL); - result = adm_memory_unmap_regions(); - if (result < 0) { - pr_debug("%s: adm_memory_unmap_regions failed, error %d\n", - __func__, result); - } else { - atomic_set(&this_adm.mem_map_handles[ADM_RTAC_APR_CAL], 0); - *mem_map_handle = 0; - } -done: - return result; -} - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case ADM_AUDPROC_CAL_TYPE: - ret = ADM_AUDPROC_CAL; - break; - case ADM_LSM_AUDPROC_CAL_TYPE: - ret = ADM_LSM_AUDPROC_CAL; - break; - case ADM_AUDVOL_CAL_TYPE: - ret = ADM_AUDVOL_CAL; - break; - case ADM_CUST_TOPOLOGY_CAL_TYPE: - ret = ADM_CUSTOM_TOP_CAL; - break; - case ADM_RTAC_INFO_CAL_TYPE: - ret = ADM_RTAC_INFO_CAL; - break; - case ADM_RTAC_APR_CAL_TYPE: - ret = ADM_RTAC_APR_CAL; - break; - case ADM_RTAC_AUDVOL_CAL_TYPE: - ret = ADM_RTAC_AUDVOL_CAL; - break; - case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: - ret = ADM_LSM_AUDPROC_PERSISTENT_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int adm_alloc_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - this_adm.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int adm_dealloc_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - this_adm.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int adm_set_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - this_adm.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == ADM_CUSTOM_TOP_CAL) { - mutex_lock(&this_adm.cal_data[ADM_CUSTOM_TOP_CAL]->lock); - this_adm.set_custom_topology = 1; - mutex_unlock(&this_adm.cal_data[ADM_CUSTOM_TOP_CAL]->lock); - } else if (cal_index == ADM_RTAC_AUDVOL_CAL) { - send_rtac_audvol_cal(); - } -done: - return ret; -} - -static int adm_map_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - atomic_set(&this_adm.mem_map_index, cal_index); - ret = adm_memory_map_regions(&cal_block->cal_data.paddr, 0, - (uint32_t *)&cal_block->map_data.map_size, 1); - if (ret < 0) { - pr_err("%s: map did not work! cal_type %i ret %d\n", - __func__, cal_index, ret); - ret = -ENODEV; - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_adm. - mem_map_handles[cal_index]); -done: - return ret; -} - -static int adm_unmap_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", - __func__); - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_err("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - atomic_set(&this_adm.mem_map_handles[cal_index], - cal_block->map_data.q6map_handle); - atomic_set(&this_adm.mem_map_index, cal_index); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: unmap did not work! cal_type %i ret %d\n", - __func__, cal_index, ret); - ret = -ENODEV; - goto done; - } - cal_block->map_data.q6map_handle = 0; -done: - return ret; -} - -static void adm_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(ADM_MAX_CAL_TYPES, this_adm.cal_data); -} - -static int adm_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{ADM_CUST_TOPOLOGY_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_AUDPROC_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_LSM_AUDPROC_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_AUDVOL_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_RTAC_INFO_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ADM_RTAC_APR_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{SRS_TRUMEDIA_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ADM_RTAC_AUDVOL_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(ADM_MAX_CAL_TYPES, this_adm.cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type! ret %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - return ret; -err: - adm_delete_cal_data(); - return ret; -} - -/** - * adm_set_volume - - * command to set volume on ADM copp - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @volume: gain value to set - * - * Returns 0 on success or error on failure - */ -int adm_set_volume(int port_id, int copp_idx, int volume) -{ - struct audproc_volume_ctrl_master_gain audproc_vol; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s: port_id %d, volume %d\n", __func__, port_id, volume); - - memset(&audproc_vol, 0, sizeof(audproc_vol)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOL_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_VOL_CTRL_MASTER_GAIN; - param_hdr.param_size = sizeof(audproc_vol); - - audproc_vol.master_gain = volume; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &audproc_vol); - if (rc) - pr_err("%s: Failed to set volume, err %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_volume); - -/** - * adm_set_softvolume - - * command to set softvolume - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @softvol_param: Params to set for softvolume - * - * Returns 0 on success or error on failure - */ -int adm_set_softvolume(int port_id, int copp_idx, - struct audproc_softvolume_params *softvol_param) -{ - struct audproc_soft_step_volume_params audproc_softvol; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s: period %d step %d curve %d\n", __func__, - softvol_param->period, softvol_param->step, - softvol_param->rampingcurve); - - memset(&audproc_softvol, 0, sizeof(audproc_softvol)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOL_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS; - param_hdr.param_size = sizeof(audproc_softvol); - - audproc_softvol.period = softvol_param->period; - audproc_softvol.step = softvol_param->step; - audproc_softvol.ramping_curve = softvol_param->rampingcurve; - - pr_debug("%s: period %d, step %d, curve %d\n", __func__, - audproc_softvol.period, audproc_softvol.step, - audproc_softvol.ramping_curve); - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &audproc_softvol); - if (rc) - pr_err("%s: Failed to set soft volume, err %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_softvolume); - -/** - * adm_set_mic_gain - - * command to set MIC gain - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @volume: gain value to set - * - * Returns 0 on success or error on failure - */ -int adm_set_mic_gain(int port_id, int copp_idx, int volume) -{ - struct admx_mic_gain mic_gain_params; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s: Setting mic gain to %d at port_id 0x%x\n", __func__, - volume, port_id); - - memset(&mic_gain_params, 0, sizeof(mic_gain_params)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = ADM_MODULE_IDX_MIC_GAIN_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = ADM_PARAM_IDX_MIC_GAIN; - param_hdr.param_size = sizeof(mic_gain_params); - - mic_gain_params.tx_mic_gain = volume; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &mic_gain_params); - if (rc) - pr_err("%s: Failed to set mic gain, err %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_mic_gain); - -/** - * adm_send_set_multichannel_ec_primary_mic_ch - - * command to set multi-ch EC primary mic - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @primary_mic_ch: channel number of primary mic - * - * Returns 0 on success or error on failure - */ -int adm_send_set_multichannel_ec_primary_mic_ch(int port_id, int copp_idx, - int primary_mic_ch) -{ - struct admx_sec_primary_mic_ch sec_primary_ch_params; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s port_id 0x%x, copp_idx 0x%x, primary_mic_ch %d\n", - __func__, port_id, copp_idx, primary_mic_ch); - - memset(&sec_primary_ch_params, 0, sizeof(sec_primary_ch_params)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOICE_TX_SECNS; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_IDX_SEC_PRIMARY_MIC_CH; - param_hdr.param_size = sizeof(sec_primary_ch_params); - - sec_primary_ch_params.version = 0; - sec_primary_ch_params.sec_primary_mic_ch = primary_mic_ch; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &sec_primary_ch_params); - if (rc) - pr_err("%s: Failed to set primary mic chanel, err %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_send_set_multichannel_ec_primary_mic_ch); - -/** - * adm_set_ffecns_effect - - * command to set effect for ffecns module - * - * @effect: effect payload - * - * Returns 0 on success or error on failure - */ -int adm_set_ffecns_effect(int effect) -{ - struct ffecns_effect ffecns_params; - struct param_hdr_v3 param_hdr; - int rc = 0; - int copp_idx = 0; - - copp_idx = adm_get_default_copp_idx(this_adm.ffecns_port_id); - if ((copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s, no active copp to query rms copp_idx:%d\n", - __func__, copp_idx); - return -EINVAL; - } - - memset(&ffecns_params, 0, sizeof(ffecns_params)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = FFECNS_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = FLUENCE_CMN_GLOBAL_EFFECT_PARAM_ID; - param_hdr.param_size = sizeof(ffecns_params); - - ffecns_params.payload = effect; - - rc = adm_pack_and_set_one_pp_param(this_adm.ffecns_port_id, copp_idx, - param_hdr, (uint8_t *) &ffecns_params); - if (rc) - pr_err("%s: Failed to set ffecns effect, err %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_ffecns_effect); - -/** - * adm_set_ffecns_freeze_event - - * command to set event for ffecns module - * - * @event: send ffecns freeze event true or false - * - * Returns 0 on success or error on failure - */ -int adm_set_ffecns_freeze_event(bool ffecns_freeze_event) -{ - struct ffv_spf_freeze_param_t ffv_param; - struct param_hdr_v3 param_hdr; - int rc = 0; - int copp_idx = 0; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&ffv_param, 0, sizeof(ffv_param)); - - ffv_param.freeze = ffecns_freeze_event ? 1 : 0; - ffv_param.source_id = 0; /*default value*/ - - copp_idx = adm_get_default_copp_idx(this_adm.ffecns_port_id); - if ((copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s, no active copp to query rms copp_idx:%d\n", - __func__, copp_idx); - return -EINVAL; - } - - param_hdr.module_id = FFECNS_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = PARAM_ID_FFV_SPF_FREEZE; - param_hdr.param_size = sizeof(ffv_param); - - rc = adm_pack_and_set_one_pp_param(this_adm.ffecns_port_id, copp_idx, - param_hdr, (uint8_t *) &ffv_param); - if (rc) - pr_err("%s: Failed to set ffecns imc event, err %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_ffecns_freeze_event); - -/** - * adm_param_enable - - * command to send params to ADM for given module - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @module_id: ADM module - * @enable: flag to enable or disable module - * - * Returns 0 on success or error on failure - */ -int adm_param_enable(int port_id, int copp_idx, int module_id, int enable) -{ - struct module_instance_info mod_inst_info; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - mod_inst_info.module_id = module_id; - mod_inst_info.instance_id = INSTANCE_ID_0; - - return adm_param_enable_v2(port_id, copp_idx, mod_inst_info, enable); -} -EXPORT_SYMBOL(adm_param_enable); - -/** - * adm_param_enable_v2 - - * command to send params to ADM for given module - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @mod_inst_info: module and instance ID info - * @enable: flag to enable or disable module - * - * Returns 0 on success or error on failure - */ -int adm_param_enable_v2(int port_id, int copp_idx, - struct module_instance_info mod_inst_info, int enable) -{ - uint32_t enable_param; - struct param_hdr_v3 param_hdr; - int rc = 0; - - if (enable < 0 || enable > 1) { - pr_err("%s: Invalid value for enable %d\n", __func__, enable); - return -EINVAL; - } - - pr_debug("%s port_id %d, module_id 0x%x, instance_id 0x%x, enable %d\n", - __func__, port_id, mod_inst_info.module_id, - mod_inst_info.instance_id, enable); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = mod_inst_info.module_id; - param_hdr.instance_id = mod_inst_info.instance_id; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = sizeof(enable_param); - - enable_param = enable; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &enable_param); - if (rc) - pr_err("%s: Failed to set enable of module(%d) instance(%d) to %d, err %d\n", - __func__, mod_inst_info.module_id, - mod_inst_info.instance_id, enable, rc); - - return rc; - -} -EXPORT_SYMBOL(adm_param_enable_v2); - -/** - * adm_send_calibration - - * send ADM calibration to DSP - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @path: direction or ADM path type - * @perf_mode: performance mode like LL/ULL/.. - * @cal_type: calibration type to use - * @params: pointer with cal data - * @size: cal size - * - * Returns 0 on success or error on failure - */ -int adm_send_calibration(int port_id, int copp_idx, int path, int perf_mode, - int cal_type, char *params, int size) -{ - - int rc = 0; - - pr_debug("%s:port_id %d, path %d, perf_mode %d, cal_type %d, size %d\n", - __func__, port_id, path, perf_mode, cal_type, size); - - /* Maps audio_dev_ctrl path definition to ACDB definition */ - if (get_cal_path(path) != RX_DEVICE) { - pr_err("%s: acdb_path %d\n", __func__, path); - rc = -EINVAL; - goto end; - } - - rc = adm_set_pp_params(port_id, copp_idx, NULL, (u8 *) params, size); - -end: - return rc; -} -EXPORT_SYMBOL(adm_send_calibration); - -/* - * adm_update_wait_parameters must be called with routing driver locks. - * adm_reset_wait_parameters must be called with routing driver locks. - * set and reset parmeters are separated to make sure it is always called - * under routing driver lock. - * adm_wait_timeout is to block until timeout or interrupted. Timeout is - * not a an error. - */ -int adm_set_wait_parameters(int port_id, int copp_idx) -{ - - int ret = 0, port_idx; - - pr_debug("%s: port_id 0x%x, copp_idx %d\n", __func__, port_id, - copp_idx); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - this_adm.copp.adm_delay[port_idx][copp_idx] = 1; - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], 0); - -end: - return ret; - -} -EXPORT_SYMBOL(adm_set_wait_parameters); - -/** - * adm_reset_wait_parameters - - * reset wait parameters or ADM delay value - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * - * Returns 0 on success or error on failure - */ -int adm_reset_wait_parameters(int port_id, int copp_idx) -{ - int ret = 0, port_idx; - - pr_debug("%s: port_id 0x%x copp_idx %d\n", __func__, port_id, - copp_idx); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], 1); - this_adm.copp.adm_delay[port_idx][copp_idx] = 0; - -end: - return ret; -} -EXPORT_SYMBOL(adm_reset_wait_parameters); - -/** - * adm_wait_timeout - - * ADM wait command after command send to DSP - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @wait_time: value in ms for command timeout - * - * Returns 0 on success or error on failure - */ -int adm_wait_timeout(int port_id, int copp_idx, int wait_time) -{ - int ret = 0, port_idx; - - pr_debug("%s: port_id 0x%x, copp_idx %d, wait_time %d\n", __func__, - port_id, copp_idx, wait_time); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - ret = wait_event_timeout( - this_adm.copp.adm_delay_wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.adm_delay_stat[port_idx][copp_idx]), - msecs_to_jiffies(wait_time)); - pr_debug("%s: return %d\n", __func__, ret); - if (ret != 0) - ret = -EINTR; -end: - pr_debug("%s: return %d--\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(adm_wait_timeout); - -/** - * adm_store_cal_data - - * Retrieve calibration data for ADM copp device - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @path: direction or copp type - * @perf_mode: performance mode like LL/ULL/.. - * @cal_index: calibration index to use - * @params: pointer to store cal data - * @size: pointer to fill with cal size - * - * Returns 0 on success or error on failure - */ -int adm_store_cal_data(int port_id, int copp_idx, int path, int perf_mode, - int cal_index, char *params, int *size) -{ - int rc = 0; - struct cal_block_data *cal_block = NULL; - int app_type, acdb_id, port_idx, sample_rate; - - if (this_adm.cal_data[cal_index] == NULL) { - pr_debug("%s: cal_index %d not allocated!\n", - __func__, cal_index); - goto end; - } - - if (get_cal_path(path) != RX_DEVICE) { - pr_debug("%s: Invalid path to store calibration %d\n", - __func__, path); - rc = -EINVAL; - goto end; - } - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - rc = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - acdb_id = atomic_read(&this_adm.copp.acdb_id[port_idx][copp_idx]); - app_type = atomic_read(&this_adm.copp.app_type[port_idx][copp_idx]); - sample_rate = atomic_read(&this_adm.copp.rate[port_idx][copp_idx]); - - mutex_lock(&this_adm.cal_data[cal_index]->lock); - cal_block = adm_find_cal(cal_index, get_cal_path(path), app_type, - acdb_id, sample_rate); - if (cal_block == NULL) - goto unlock; - - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: No ADM cal send for port_id = 0x%x!\n", - __func__, port_id); - rc = -EINVAL; - goto unlock; - } - - if (cal_index == ADM_AUDPROC_CAL || cal_index == ADM_LSM_AUDPROC_CAL) { - if (cal_block->cal_data.size > AUD_PROC_BLOCK_SIZE) { - pr_err("%s:audproc:invalid size exp/actual[%zd, %d]\n", - __func__, cal_block->cal_data.size, *size); - rc = -ENOMEM; - goto unlock; - } - } else if (cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - if (cal_block->cal_data.size > AUD_PROC_PERSIST_BLOCK_SIZE) { - pr_err("%s:persist invalid size exp/actual[%zd, %d]\n", - __func__, cal_block->cal_data.size, *size); - rc = -ENOMEM; - goto unlock; - } - } else if (cal_index == ADM_AUDVOL_CAL) { - if (cal_block->cal_data.size > AUD_VOL_BLOCK_SIZE) { - pr_err("%s:aud_vol:invalid size exp/actual[%zd, %d]\n", - __func__, cal_block->cal_data.size, *size); - rc = -ENOMEM; - goto unlock; - } - } else { - pr_debug("%s: Not valid calibration for dolby topolgy\n", - __func__); - rc = -EINVAL; - goto unlock; - } - memcpy(params, cal_block->cal_data.kvaddr, cal_block->cal_data.size); - *size = cal_block->cal_data.size; - - pr_debug("%s:port_id %d, copp_idx %d, path %d", - __func__, port_id, copp_idx, path); - pr_debug("perf_mode %d, cal_type %d, size %d\n", - perf_mode, cal_index, *size); - -unlock: - mutex_unlock(&this_adm.cal_data[cal_index]->lock); -end: - return rc; -} -EXPORT_SYMBOL(adm_store_cal_data); - -/** - * adm_send_compressed_device_mute - - * command to send mute for compressed device - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @mute_on: flag to indicate mute or unmute - * - * Returns 0 on success or error on failure - */ -int adm_send_compressed_device_mute(int port_id, int copp_idx, bool mute_on) -{ - u32 mute_param = mute_on ? 1 : 0; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s port_id: 0x%x, copp_idx %d, mute_on: %d\n", - __func__, port_id, copp_idx, mute_on); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_COMPRESSED_MUTE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_COMPRESSED_MUTE; - param_hdr.param_size = sizeof(mute_param); - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &mute_param); - if (ret) - pr_err("%s: Failed to set mute, err %d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_send_compressed_device_mute); - -/** - * adm_send_compressed_device_latency - - * command to send latency for compressed device - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @latency: latency value to pass - * - * Returns 0 on success or error on failure - */ -int adm_send_compressed_device_latency(int port_id, int copp_idx, int latency) -{ - u32 latency_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s port_id: 0x%x, copp_idx %d latency: %d\n", __func__, - port_id, copp_idx, latency); - - if (latency < 0) { - pr_err("%s: Invalid value for latency %d", __func__, latency); - return -EINVAL; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_COMPRESSED_LATENCY; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_COMPRESSED_LATENCY; - param_hdr.param_size = sizeof(latency_param); - - latency_param = latency; - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &latency_param); - if (ret) - pr_err("%s: Failed to set latency, err %d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_send_compressed_device_latency); - -/** - * adm_swap_speaker_channels - * - * Receives port_id, copp_idx, sample rate, spk_swap and - * send MFC command to swap speaker channel. - * Return zero on success. On failure returns nonzero. - * - * port_id - Passed value, port_id for which channels swap is wanted - * copp_idx - Passed value, copp_idx for which channels swap is wanted - * sample_rate - Passed value, sample rate used by app type config - * spk_swap - Passed value, spk_swap for check if swap flag is set - */ -int adm_swap_speaker_channels(int port_id, int copp_idx, - int sample_rate, bool spk_swap) -{ - struct audproc_mfc_param_media_fmt mfc_cfg; - struct param_hdr_v3 param_hdr; - uint16_t num_channels; - int port_idx = 0; - int ret = 0; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - num_channels = atomic_read(&this_adm.copp.channels[port_idx][copp_idx]); - if (num_channels != 2) { - pr_debug("%s: Invalid number of channels: %d\n", - __func__, num_channels); - return -EINVAL; - } - - memset(&mfc_cfg, 0, sizeof(mfc_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AUDPROC_MODULE_ID_MFC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT; - param_hdr.param_size = sizeof(mfc_cfg); - - mfc_cfg.sampling_rate = sample_rate; - mfc_cfg.bits_per_sample = - atomic_read(&this_adm.copp.bit_width[port_idx][copp_idx]); - mfc_cfg.num_channels = num_channels; - - /* Currently applying speaker swap for only 2 channel use case */ - if (spk_swap) { - mfc_cfg.channel_type[0] = - (uint16_t) PCM_CHANNEL_FR; - mfc_cfg.channel_type[1] = - (uint16_t) PCM_CHANNEL_FL; - } else { - mfc_cfg.channel_type[0] = - (uint16_t) PCM_CHANNEL_FL; - mfc_cfg.channel_type[1] = - (uint16_t) PCM_CHANNEL_FR; - } - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (u8 *) &mfc_cfg); - if (ret < 0) { - pr_err("%s: Failed to set swap speaker channels on port[0x%x] failed %d\n", - __func__, port_id, ret); - return ret; - } - - pr_debug("%s: mfc_cfg Set params returned success", __func__); - return 0; -} -EXPORT_SYMBOL(adm_swap_speaker_channels); - -/** - * adm_set_sound_focus - - * Update sound focus info - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @soundFocusData: sound focus data to pass - * - * Returns 0 on success or error on failure - */ -int adm_set_sound_focus(int port_id, int copp_idx, - struct sound_focus_param soundFocusData) -{ - struct adm_param_fluence_soundfocus_t soundfocus_params; - struct param_hdr_v3 param_hdr; - int ret = 0; - int i; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = VOICEPROC_PARAM_ID_FLUENCE_SOUNDFOCUS; - param_hdr.param_size = sizeof(soundfocus_params); - - memset(&(soundfocus_params), 0xFF, sizeof(soundfocus_params)); - for (i = 0; i < MAX_SECTORS; i++) { - soundfocus_params.start_angles[i] = - soundFocusData.start_angle[i]; - soundfocus_params.enables[i] = soundFocusData.enable[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData.start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData.enable[i]); - } - soundfocus_params.gain_step = soundFocusData.gain_step; - pr_debug("%s: gain_step = %d\n", __func__, soundFocusData.gain_step); - - soundfocus_params.reserved = 0; - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &soundfocus_params); - if (ret) - pr_err("%s: Failed to set sound focus params, err %d\n", - __func__, ret); - - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_set_sound_focus); - -/** - * adm_get_sound_focus - - * Retrieve sound focus info - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @soundFocusData: pointer for sound focus data to be updated with - * - * Returns 0 on success or error on failure - */ -int adm_get_sound_focus(int port_id, int copp_idx, - struct sound_focus_param *soundFocusData) -{ - int ret = 0, i; - char *params_value; - uint32_t max_param_size = 0; - struct adm_param_fluence_soundfocus_t *soundfocus_params = NULL; - struct param_hdr_v3 param_hdr; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - - max_param_size = sizeof(struct adm_param_fluence_soundfocus_t) + - sizeof(union param_hdrs); - params_value = kzalloc(max_param_size, GFP_KERNEL); - if (!params_value) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = VOICEPROC_PARAM_ID_FLUENCE_SOUNDFOCUS; - param_hdr.param_size = max_param_size; - ret = adm_get_pp_params(port_id, copp_idx, - ADM_CLIENT_ID_SOURCE_TRACKING, NULL, ¶m_hdr, - params_value); - if (ret) { - pr_err("%s: get parameters failed ret:%d\n", __func__, ret); - ret = -EINVAL; - goto done; - } - - if (this_adm.sourceTrackingData.apr_cmd_status != 0) { - pr_err("%s - get params returned error [%s]\n", - __func__, adsp_err_get_err_str( - this_adm.sourceTrackingData.apr_cmd_status)); - ret = adsp_err_get_lnx_err_code( - this_adm.sourceTrackingData.apr_cmd_status); - goto done; - } - - soundfocus_params = (struct adm_param_fluence_soundfocus_t *) - params_value; - for (i = 0; i < MAX_SECTORS; i++) { - soundFocusData->start_angle[i] = - soundfocus_params->start_angles[i]; - soundFocusData->enable[i] = soundfocus_params->enables[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData->start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData->enable[i]); - } - soundFocusData->gain_step = soundfocus_params->gain_step; - pr_debug("%s: gain_step = %d\n", __func__, soundFocusData->gain_step); - -done: - pr_debug("%s: Exit, ret = %d\n", __func__, ret); - - kfree(params_value); - return ret; -} -EXPORT_SYMBOL(adm_get_sound_focus); - -static int adm_source_tracking_alloc_map_memory(void) -{ - int ret; - - pr_debug("%s: Enter\n", __func__); - - ret = msm_audio_ion_alloc(&this_adm.sourceTrackingData.dma_buf, - AUD_PROC_BLOCK_SIZE, - &this_adm.sourceTrackingData.memmap.paddr, - &this_adm.sourceTrackingData.memmap.size, - &this_adm.sourceTrackingData.memmap.kvaddr); - if (ret) { - pr_err("%s: failed to allocate memory\n", __func__); - - ret = -EINVAL; - goto done; - } - - atomic_set(&this_adm.mem_map_index, ADM_MEM_MAP_INDEX_SOURCE_TRACKING); - ret = adm_memory_map_regions(&this_adm.sourceTrackingData.memmap.paddr, - 0, - (uint32_t *)&this_adm.sourceTrackingData.memmap.size, - 1); - if (ret < 0) { - pr_err("%s: failed to map memory, paddr = 0x%pK, size = %d\n", - __func__, - (void *)this_adm.sourceTrackingData.memmap.paddr, - (uint32_t)this_adm.sourceTrackingData.memmap.size); - - msm_audio_ion_free(this_adm.sourceTrackingData.dma_buf); - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - atomic_set(&this_adm.mem_map_handles - [ADM_MEM_MAP_INDEX_SOURCE_TRACKING], 0); - - ret = -EINVAL; - goto done; - } - ret = 0; - pr_debug("%s: paddr = 0x%pK, size = %d, mem_map_handle = 0x%x\n", - __func__, (void *)this_adm.sourceTrackingData.memmap.paddr, - (uint32_t)this_adm.sourceTrackingData.memmap.size, - atomic_read(&this_adm.mem_map_handles - [ADM_MEM_MAP_INDEX_SOURCE_TRACKING])); - -done: - pr_debug("%s: Exit, ret = %d\n", __func__, ret); - - return ret; -} - -/** - * adm_get_source_tracking - - * Retrieve source tracking info - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @sourceTrackingData: pointer for source track data to be updated with - * - * Returns 0 on success or error on failure - */ -int adm_get_source_tracking(int port_id, int copp_idx, - struct source_tracking_param *sourceTrackingData) -{ - struct adm_param_fluence_sourcetracking_t *source_tracking_params = - NULL; - struct mem_mapping_hdr mem_hdr; - struct param_hdr_v3 param_hdr; - int i = 0; - int ret = 0; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - - if (!this_adm.sourceTrackingData.memmap.paddr) { - /* Allocate and map shared memory for out of band usage */ - ret = adm_source_tracking_alloc_map_memory(); - if (ret != 0) { - ret = -EINVAL; - goto done; - } - } - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - mem_hdr.data_payload_addr_lsw = - lower_32_bits(this_adm.sourceTrackingData.memmap.paddr); - mem_hdr.data_payload_addr_msw = msm_audio_populate_upper_32_bits( - this_adm.sourceTrackingData.memmap.paddr); - mem_hdr.mem_map_handle = atomic_read( - &this_adm.mem_map_handles[ADM_MEM_MAP_INDEX_SOURCE_TRACKING]); - - param_hdr.module_id = VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = VOICEPROC_PARAM_ID_FLUENCE_SOURCETRACKING; - /* - * This size should be the max size of the calibration data + header. - * Use the union size to ensure max size is used. - */ - param_hdr.param_size = - sizeof(struct adm_param_fluence_sourcetracking_t) + - sizeof(union param_hdrs); - - /* - * Retrieving parameters out of band, so no need to provide a buffer for - * the returned parameter data as it will be at the memory location - * provided. - */ - ret = adm_get_pp_params(port_id, copp_idx, - ADM_CLIENT_ID_SOURCE_TRACKING, &mem_hdr, - ¶m_hdr, NULL); - if (ret) { - pr_err("%s: Failed to get params, error %d\n", __func__, ret); - goto done; - } - - if (this_adm.sourceTrackingData.apr_cmd_status != 0) { - pr_err("%s - get params returned error [%s]\n", - __func__, adsp_err_get_err_str( - this_adm.sourceTrackingData.apr_cmd_status)); - - ret = adsp_err_get_lnx_err_code( - this_adm.sourceTrackingData.apr_cmd_status); - goto done; - } - - /* How do we know what the param data was retrieved with for hdr size */ - source_tracking_params = - (struct adm_param_fluence_sourcetracking_t - *) (this_adm.sourceTrackingData.memmap.kvaddr + - sizeof(struct param_hdr_v1)); - for (i = 0; i < MAX_SECTORS; i++) { - sourceTrackingData->vad[i] = source_tracking_params->vad[i]; - pr_debug("%s: vad[%d] = %d\n", - __func__, i, sourceTrackingData->vad[i]); - } - sourceTrackingData->doa_speech = source_tracking_params->doa_speech; - pr_debug("%s: doa_speech = %d\n", - __func__, sourceTrackingData->doa_speech); - - for (i = 0; i < MAX_NOISE_SOURCE_INDICATORS; i++) { - sourceTrackingData->doa_noise[i] = - source_tracking_params->doa_noise[i]; - pr_debug("%s: doa_noise[%d] = %d\n", - __func__, i, sourceTrackingData->doa_noise[i]); - } - for (i = 0; i < MAX_POLAR_ACTIVITY_INDICATORS; i++) { - sourceTrackingData->polar_activity[i] = - source_tracking_params->polar_activity[i]; - pr_debug("%s: polar_activity[%d] = %d\n", - __func__, i, sourceTrackingData->polar_activity[i]); - } - - ret = 0; - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_get_source_tracking); - -/** - * adm_get_doa_tracking_mon - - * Retrieve doa tracking monitor info - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @doa_tracking_data: pointer for doa data to be updated with - * - * Returns 0 on success or error on failure - */ -int adm_get_doa_tracking_mon(int port_id, int copp_idx, - struct doa_tracking_mon_param *doa_tracking_data) -{ - int ret = 0, i; - char *params_value; - uint32_t max_param_size = 0; - struct adm_param_doa_tracking_mon_t *doa_tracking_params = NULL; - struct param_hdr_v3 param_hdr; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - - if (doa_tracking_data == NULL) { - pr_err("%s: Received NULL pointer for doa tracking data\n", - __func__); - return -EINVAL; - } - - max_param_size = sizeof(struct adm_param_doa_tracking_mon_t) + - sizeof(union param_hdrs); - params_value = kzalloc(max_param_size, GFP_KERNEL); - if (!params_value) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_FFECNS; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_FFV_DOA_TRACKING_MONITOR; - param_hdr.param_size = max_param_size; - ret = adm_get_pp_params(port_id, copp_idx, - ADM_CLIENT_ID_DEFAULT, NULL, ¶m_hdr, - params_value); - if (ret) { - pr_err("%s: get parameters failed ret:%d\n", __func__, ret); - goto done; - } - - doa_tracking_params = - (struct adm_param_doa_tracking_mon_t *)params_value; - for (i = 0; i < MAX_DOA_TRACKING_ANGLES; i++) { - doa_tracking_data->target_angle_L16[i] = - doa_tracking_params->target_angle_L16[i]; - pr_debug("%s: target angle[%d] = %d\n", - __func__, i, doa_tracking_data->target_angle_L16[i]); - } - - for (i = 0; i < MAX_DOA_TRACKING_ANGLES; i++) { - doa_tracking_data->interf_angle_L16[i] = - doa_tracking_params->interf_angle_L16[i]; - pr_debug("%s: interference angle[%d] = %d\n", - __func__, i, doa_tracking_data->interf_angle_L16[i]); - } - - for (i = 0; i < MAX_POLAR_ACTIVITY_INDICATORS; i++) { - doa_tracking_data->polar_activity[i] = - doa_tracking_params->polar_activity[i]; - } - -done: - pr_debug("%s: Exit, ret = %d\n", __func__, ret); - kfree(params_value); - return ret; -} -EXPORT_SYMBOL(adm_get_doa_tracking_mon); - -int __init adm_init(void) -{ - int i = 0, j; - - this_adm.ec_ref_rx = -1; - this_adm.ffecns_port_id = -1; - init_waitqueue_head(&this_adm.matrix_map_wait); - init_waitqueue_head(&this_adm.adm_wait); - - for (i = 0; i < AFE_MAX_PORTS; i++) { - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - atomic_set(&this_adm.copp.id[i][j], RESET_COPP_ID); - init_waitqueue_head(&this_adm.copp.wait[i][j]); - init_waitqueue_head( - &this_adm.copp.adm_delay_wait[i][j]); - } - } - - if (adm_init_cal_data()) - pr_err("%s: could not init cal data!\n", __func__); - - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - - return 0; -} - -void adm_exit(void) -{ - if (this_adm.apr) - adm_reset_data(); - adm_delete_cal_data(); -} diff --git a/techpack/audio/4.0/dsp/q6afe.c b/techpack/audio/4.0/dsp/q6afe.c deleted file mode 100644 index e3d75ccc5727..000000000000 --- a/techpack/audio/4.0/dsp/q6afe.c +++ /dev/null @@ -1,9449 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" -#include "q6afecal-hwdep.h" - -#define WAKELOCK_TIMEOUT 5000 -#define AFE_CLK_TOKEN 1024 -enum { - AFE_COMMON_RX_CAL = 0, - AFE_COMMON_TX_CAL, - AFE_LSM_TX_CAL, - AFE_AANC_CAL, - AFE_FB_SPKR_PROT_CAL, - AFE_HW_DELAY_CAL, - AFE_SIDETONE_CAL, - AFE_SIDETONE_IIR_CAL, - AFE_TOPOLOGY_CAL, - AFE_LSM_TOPOLOGY_CAL, - AFE_CUST_TOPOLOGY_CAL, - AFE_FB_SPKR_PROT_TH_VI_CAL, - AFE_FB_SPKR_PROT_EX_VI_CAL, - MAX_AFE_CAL_TYPES -}; - -enum fbsp_state { - FBSP_INCORRECT_OP_MODE, - FBSP_INACTIVE, - FBSP_WARMUP, - FBSP_IN_PROGRESS, - FBSP_SUCCESS, - FBSP_FAILED, - MAX_FBSP_STATE -}; - -static char fbsp_state[MAX_FBSP_STATE][50] = { - [FBSP_INCORRECT_OP_MODE] = "incorrect operation mode", - [FBSP_INACTIVE] = "port not started", - [FBSP_WARMUP] = "waiting for warmup", - [FBSP_IN_PROGRESS] = "in progress state", - [FBSP_SUCCESS] = "success", - [FBSP_FAILED] = "failed" -}; - -enum v_vali_state { - V_VALI_FAILED, - V_VALI_SUCCESS, - V_VALI_INCORRECT_OP_MODE, - V_VALI_INACTIVE, - V_VALI_WARMUP, - V_VALI_IN_PROGRESS, - MAX_V_VALI_STATE -}; - -enum { - USE_CALIBRATED_R0TO, - USE_SAFE_R0TO -}; - -enum { - QUICK_CALIB_DISABLE, - QUICK_CALIB_ENABLE -}; - -enum { - Q6AFE_MSM_SPKR_PROCESSING = 0, - Q6AFE_MSM_SPKR_CALIBRATION, - Q6AFE_MSM_SPKR_FTM_MODE, - Q6AFE_MSM_SPKR_V_VALI_MODE -}; - -enum { - APTX_AD_48 = 0, - APTX_AD_44_1 = 1 -}; - -enum { - AFE_MATCHED_PORT_DISABLE, - AFE_MATCHED_PORT_ENABLE -}; - -struct wlock { - struct wakeup_source ws; -}; - -static struct wlock wl; - -struct afe_ctl { - void *apr; - atomic_t state; - atomic_t status; - atomic_t clk_state; - atomic_t clk_status; - wait_queue_head_t wait[AFE_MAX_PORTS]; - wait_queue_head_t wait_wakeup; - wait_queue_head_t clk_wait; - struct task_struct *task; - wait_queue_head_t lpass_core_hw_wait; - uint32_t lpass_hw_core_client_hdl[AFE_LPASS_CORE_HW_VOTE_MAX]; - void (*tx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void (*rx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void *tx_private_data; - void *rx_private_data; - uint32_t mmap_handle; - - void (*pri_spdif_tx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void (*sec_spdif_tx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void *pri_spdif_tx_private_data; - void *sec_spdif_tx_private_data; - int pri_spdif_config_change; - int sec_spdif_config_change; - struct work_struct afe_spdif_work; - - int topology[AFE_MAX_PORTS]; - struct cal_type_data *cal_data[MAX_AFE_CAL_TYPES]; - - atomic_t mem_map_cal_handles[MAX_AFE_CAL_TYPES]; - atomic_t mem_map_cal_index; - u32 afe_cal_mode[AFE_MAX_PORTS]; - - u16 dtmf_gen_rx_portid; - struct audio_cal_info_spk_prot_cfg prot_cfg; - struct afe_spkr_prot_calib_get_resp calib_data; - struct audio_cal_info_sp_th_vi_ftm_cfg th_ftm_cfg; - struct audio_cal_info_sp_th_vi_v_vali_cfg v_vali_cfg; - struct audio_cal_info_sp_ex_vi_ftm_cfg ex_ftm_cfg; - struct afe_sp_th_vi_get_param_resp th_vi_resp; - struct afe_sp_th_vi_v_vali_get_param_resp th_vi_v_vali_resp; - struct afe_sp_ex_vi_get_param_resp ex_vi_resp; - struct afe_sp_rx_tmax_xmax_logging_resp xt_logging_resp; - struct afe_av_dev_drift_get_param_resp av_dev_drift_resp; - struct afe_doa_tracking_mon_get_param_resp doa_tracking_mon_resp; - int vi_tx_port; - int vi_rx_port; - uint32_t afe_sample_rates[AFE_MAX_PORTS]; - struct aanc_data aanc_info; - struct mutex afe_cmd_lock; - struct mutex afe_apr_lock; - struct mutex afe_clk_lock; - int set_custom_topology; - int dev_acdb_id[AFE_MAX_PORTS]; - routing_cb rt_cb; - struct audio_uevent_data *uevent_data; - /* cal info for AFE */ - struct afe_fw_info *fw_data; - u32 island_mode[AFE_MAX_PORTS]; - struct vad_config vad_cfg[AFE_MAX_PORTS]; - struct work_struct afe_dc_work; - struct notifier_block event_notifier; - /* FTM spk params */ - uint32_t initial_cal; - uint32_t v_vali_flag; -}; - -static atomic_t afe_ports_mad_type[SLIMBUS_PORT_LAST - SLIMBUS_0_RX]; -static unsigned long afe_configured_cmd; - -static struct afe_ctl this_afe; - -#define TIMEOUT_MS 1000 -#define Q6AFE_MAX_VOLUME 0x3FFF - -static int pcm_afe_instance[2]; -static int proxy_afe_instance[2]; -bool afe_close_done[2] = {true, true}; - -#define SIZEOF_CFG_CMD(y) \ - (sizeof(struct apr_hdr) + sizeof(u16) + (sizeof(struct y))) - -static int afe_get_cal_hw_delay(int32_t path, - struct audio_cal_hw_delay_entry *entry); -static int remap_cal_data(struct cal_block_data *cal_block, int cal_index); - -int afe_get_spk_initial_cal(void) -{ - return this_afe.initial_cal; -} - -void afe_get_spk_r0(int *spk_r0) -{ - uint16_t i = 0; - - for (; i < SP_V2_NUM_MAX_SPKRS; i++) - spk_r0[i] = this_afe.prot_cfg.r0[i]; -} - -void afe_get_spk_t0(int *spk_t0) -{ - uint16_t i = 0; - - for (; i < SP_V2_NUM_MAX_SPKRS; i++) - spk_t0[i] = this_afe.prot_cfg.t0[i]; -} - -int afe_get_spk_v_vali_flag(void) -{ - return this_afe.v_vali_flag; -} - -void afe_get_spk_v_vali_sts(int *spk_v_vali_sts) -{ - uint16_t i = 0; - - for (; i < SP_V2_NUM_MAX_SPKRS; i++) - spk_v_vali_sts[i] = - this_afe.th_vi_v_vali_resp.param.status[i]; -} - -void afe_set_spk_initial_cal(int initial_cal) -{ - this_afe.initial_cal = initial_cal; -} - -void afe_set_spk_v_vali_flag(int v_vali_flag) -{ - this_afe.v_vali_flag = v_vali_flag; -} - -int afe_get_topology(int port_id) -{ - int topology; - int port_index = afe_get_port_index(port_id); - - if ((port_index < 0) || (port_index >= AFE_MAX_PORTS)) { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - topology = -EINVAL; - goto done; - } - - topology = this_afe.topology[port_index]; -done: - return topology; -} - -/** - * afe_set_aanc_info - - * Update AFE AANC info - * - * @q6_aanc_info: AFE AANC info params - * - */ -void afe_set_aanc_info(struct aanc_data *q6_aanc_info) -{ - this_afe.aanc_info.aanc_active = q6_aanc_info->aanc_active; - this_afe.aanc_info.aanc_rx_port = q6_aanc_info->aanc_rx_port; - this_afe.aanc_info.aanc_tx_port = q6_aanc_info->aanc_tx_port; - - pr_debug("%s: aanc active is %d rx port is 0x%x, tx port is 0x%x\n", - __func__, - this_afe.aanc_info.aanc_active, - this_afe.aanc_info.aanc_rx_port, - this_afe.aanc_info.aanc_tx_port); -} -EXPORT_SYMBOL(afe_set_aanc_info); - -static void afe_callback_debug_print(struct apr_client_data *data) -{ - uint32_t *payload; - - payload = data->payload; - - if (data->payload_size >= 8) - pr_debug("%s: code = 0x%x PL#0[0x%x], PL#1[0x%x], size = %d\n", - __func__, data->opcode, payload[0], payload[1], - data->payload_size); - else if (data->payload_size >= 4) - pr_debug("%s: code = 0x%x PL#0[0x%x], size = %d\n", - __func__, data->opcode, payload[0], - data->payload_size); - else - pr_debug("%s: code = 0x%x, size = %d\n", - __func__, data->opcode, data->payload_size); -} - -static void av_dev_drift_afe_cb_handler(uint32_t opcode, uint32_t *payload, - uint32_t payload_size) -{ - u32 param_id; - size_t expected_size = - sizeof(u32) + sizeof(struct afe_param_id_dev_timing_stats); - - /* Get param ID depending on command type */ - param_id = (opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) ? payload[3] : - payload[2]; - if (param_id != AFE_PARAM_ID_DEV_TIMING_STATS) { - pr_err("%s: Unrecognized param ID %d\n", __func__, param_id); - return; - } - - switch (opcode) { - case AFE_PORT_CMDRSP_GET_PARAM_V2: - expected_size += sizeof(struct param_hdr_v1); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } - /* Repack response to add IID */ - this_afe.av_dev_drift_resp.status = payload[0]; - this_afe.av_dev_drift_resp.pdata.module_id = payload[1]; - this_afe.av_dev_drift_resp.pdata.instance_id = INSTANCE_ID_0; - this_afe.av_dev_drift_resp.pdata.param_id = payload[2]; - this_afe.av_dev_drift_resp.pdata.param_size = payload[3]; - memcpy(&this_afe.av_dev_drift_resp.timing_stats, &payload[4], - sizeof(struct afe_param_id_dev_timing_stats)); - break; - case AFE_PORT_CMDRSP_GET_PARAM_V3: - expected_size += sizeof(struct param_hdr_v3); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } - memcpy(&this_afe.av_dev_drift_resp, payload, - sizeof(this_afe.av_dev_drift_resp)); - break; - default: - pr_err("%s: Unrecognized command %d\n", __func__, opcode); - return; - } - - if (!this_afe.av_dev_drift_resp.status) { - atomic_set(&this_afe.state, 0); - } else { - pr_debug("%s: av_dev_drift_resp status: %d\n", __func__, - this_afe.av_dev_drift_resp.status); - atomic_set(&this_afe.state, -1); - } -} - -static void doa_tracking_mon_afe_cb_handler(uint32_t opcode, uint32_t *payload, - uint32_t payload_size) -{ - size_t expected_size = - sizeof(u32) + sizeof(struct doa_tracking_mon_param); - - if (payload[0]) { - atomic_set(&this_afe.status, payload[0]); - atomic_set(&this_afe.state, 0); - pr_err("%s: doa_tracking_mon_resp status: %d payload size %d\n", - __func__, payload[0], payload_size); - return; - } - - switch (opcode) { - case AFE_PORT_CMDRSP_GET_PARAM_V2: - expected_size += sizeof(struct param_hdr_v1); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } - /* Repack response to add IID */ - this_afe.doa_tracking_mon_resp.status = payload[0]; - this_afe.doa_tracking_mon_resp.pdata.module_id = payload[1]; - this_afe.doa_tracking_mon_resp.pdata.instance_id = - INSTANCE_ID_0; - this_afe.doa_tracking_mon_resp.pdata.param_id = payload[2]; - this_afe.doa_tracking_mon_resp.pdata.param_size = payload[3]; - memcpy(&this_afe.doa_tracking_mon_resp.doa, &payload[4], - sizeof(struct doa_tracking_mon_param)); - break; - case AFE_PORT_CMDRSP_GET_PARAM_V3: - expected_size += sizeof(struct param_hdr_v3); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } - memcpy(&this_afe.doa_tracking_mon_resp, payload, - sizeof(this_afe.doa_tracking_mon_resp)); - break; - default: - pr_err("%s: Unrecognized command %d\n", __func__, opcode); - return; - } - - atomic_set(&this_afe.state, 0); -} - -static int32_t sp_make_afe_callback(uint32_t opcode, uint32_t *payload, - uint32_t payload_size) -{ - struct param_hdr_v3 param_hdr; - u32 *data_dest = NULL; - u32 *data_start = NULL; - size_t expected_size = sizeof(u32); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* Set command specific details */ - switch (opcode) { - case AFE_PORT_CMDRSP_GET_PARAM_V2: - if (payload_size < (5 * sizeof(uint32_t))) { - pr_err("%s: Error: size %d is less than expected\n", - __func__, payload_size); - return -EINVAL; - } - expected_size += sizeof(struct param_hdr_v1); - param_hdr.module_id = payload[1]; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = payload[2]; - param_hdr.param_size = payload[3]; - data_start = &payload[4]; - break; - case AFE_PORT_CMDRSP_GET_PARAM_V3: - if (payload_size < (6 * sizeof(uint32_t))) { - pr_err("%s: Error: size %d is less than expected\n", - __func__, payload_size); - return -EINVAL; - } - expected_size += sizeof(struct param_hdr_v3); - if (payload_size < expected_size) { - pr_err("%s: Error: size %d is less than expected\n", - __func__, payload_size); - return -EINVAL; - } - memcpy(¶m_hdr, &payload[1], sizeof(struct param_hdr_v3)); - data_start = &payload[5]; - break; - default: - pr_err("%s: Unrecognized command %d\n", __func__, opcode); - return -EINVAL; - } - - switch (param_hdr.param_id) { - case AFE_PARAM_ID_CALIB_RES_CFG_V2: - expected_size += sizeof(struct asm_calib_res_cfg); - data_dest = (u32 *) &this_afe.calib_data; - break; - case AFE_PARAM_ID_SP_V2_TH_VI_FTM_PARAMS: - expected_size += sizeof(struct afe_sp_th_vi_ftm_params); - data_dest = (u32 *) &this_afe.th_vi_resp; - break; - case AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_PARAMS: - expected_size += sizeof(struct afe_sp_th_vi_v_vali_params); - data_dest = (u32 *) &this_afe.th_vi_v_vali_resp; - break; - case AFE_PARAM_ID_SP_V2_EX_VI_FTM_PARAMS: - expected_size += sizeof(struct afe_sp_ex_vi_ftm_params); - data_dest = (u32 *) &this_afe.ex_vi_resp; - break; - case AFE_PARAM_ID_SP_RX_TMAX_XMAX_LOGGING: - expected_size += sizeof( - struct afe_sp_rx_tmax_xmax_logging_param); - data_dest = (u32 *) &this_afe.xt_logging_resp; - break; - default: - pr_err("%s: Unrecognized param ID %d\n", __func__, - param_hdr.param_id); - return -EINVAL; - } - - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu for param %d\n", - __func__, payload_size, expected_size, - param_hdr.param_id); - return -EINVAL; - } - - data_dest[0] = payload[0]; - memcpy(&data_dest[1], ¶m_hdr, sizeof(struct param_hdr_v3)); - memcpy(&data_dest[5], data_start, param_hdr.param_size); - - if (!data_dest[0]) { - atomic_set(&this_afe.state, 0); - } else { - pr_debug("%s: status: %d", __func__, data_dest[0]); - atomic_set(&this_afe.state, -1); - } - - return 0; -} - -static void afe_notify_dc_presence(void) -{ - pr_debug("%s: DC detected\n", __func__); - msm_aud_evt_notifier_call_chain(MSM_AUD_DC_EVENT, NULL); - - schedule_work(&this_afe.afe_dc_work); -} - -static void afe_notify_dc_presence_work_fn(struct work_struct *work) -{ - int ret = 0; - char event[] = "DC_PRESENCE=TRUE"; - - ret = q6core_send_uevent(this_afe.uevent_data, event); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", - __func__, event, ret); -} - -static int afe_aud_event_notify(struct notifier_block *self, - unsigned long action, void *data) -{ - switch (action) { - case SWR_WAKE_IRQ_REGISTER: - afe_send_cmd_wakeup_register(data, true); - break; - case SWR_WAKE_IRQ_DEREGISTER: - afe_send_cmd_wakeup_register(data, false); - break; - default: - pr_err("%s: invalid event type: %lu\n", __func__, action); - return -EINVAL; - } - - return 0; -} - -static void afe_notify_spdif_fmt_update_work_fn(struct work_struct *work) -{ - int ret = 0; - char event_pri[] = "PRI_SPDIF_TX=MEDIA_CONFIG_CHANGE"; - char event_sec[] = "SEC_SPDIF_TX=MEDIA_CONFIG_CHANGE"; - - if (this_afe.pri_spdif_config_change) { - this_afe.pri_spdif_config_change = 0; - ret = q6core_send_uevent(this_afe.uevent_data, event_pri); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", - __func__, event_pri, ret); - } - if (this_afe.sec_spdif_config_change) { - this_afe.sec_spdif_config_change = 0; - ret = q6core_send_uevent(this_afe.uevent_data, event_sec); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", - __func__, event_sec, ret); - } -} - -static void afe_notify_spdif_fmt_update(void *payload) -{ - struct afe_port_mod_evt_rsp_hdr *evt_pl; - - evt_pl = (struct afe_port_mod_evt_rsp_hdr *)payload; - if (evt_pl->port_id == AFE_PORT_ID_PRIMARY_SPDIF_TX) - this_afe.pri_spdif_config_change = 1; - else - this_afe.sec_spdif_config_change = 1; - - schedule_work(&this_afe.afe_spdif_work); -} - -static bool afe_token_is_valid(uint32_t token) -{ - if (token >= AFE_MAX_PORTS) { - pr_err("%s: token %d is invalid.\n", __func__, token); - return false; - } - return true; -} - -static int32_t afe_callback(struct apr_client_data *data, void *priv) -{ - uint16_t i = 0; - - if (!data) { - pr_err("%s: Invalid param data\n", __func__); - return -EINVAL; - } - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: reset event = %d %d apr[%pK]\n", - __func__, - data->reset_event, data->reset_proc, this_afe.apr); - - cal_utils_clear_cal_block_q6maps(MAX_AFE_CAL_TYPES, - this_afe.cal_data); - - /* Reset the custom topology mode: to resend again to AFE. */ - mutex_lock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - this_afe.set_custom_topology = 1; - mutex_unlock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - rtac_clear_mapping(AFE_RTAC_CAL); - - if (this_afe.apr) { - apr_reset(this_afe.apr); - atomic_set(&this_afe.state, 0); - this_afe.apr = NULL; - rtac_set_afe_handle(this_afe.apr); - } - - /* Reset the core client handle in SSR/PDR use cases */ - mutex_lock(&this_afe.afe_cmd_lock); - for (i = 0; i < AFE_LPASS_CORE_HW_VOTE_MAX; i++) - this_afe.lpass_hw_core_client_hdl[i] = 0; - mutex_unlock(&this_afe.afe_cmd_lock); - - /* - * Pass reset events to proxy driver, if cb is registered - */ - if (this_afe.tx_cb) { - this_afe.tx_cb(data->opcode, data->token, - data->payload, - this_afe.tx_private_data); - this_afe.tx_cb = NULL; - } - if (this_afe.rx_cb) { - this_afe.rx_cb(data->opcode, data->token, - data->payload, - this_afe.rx_private_data); - this_afe.rx_cb = NULL; - } - - return 0; - } - afe_callback_debug_print(data); - if (data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V2 || - data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) { - uint32_t *payload = data->payload; - uint32_t param_id; - uint32_t param_id_pos = 0; - - if (!payload || (data->token >= AFE_MAX_PORTS)) { - pr_err("%s: Error: size %d payload %pK token %d\n", - __func__, data->payload_size, - payload, data->token); - return -EINVAL; - } - - if (rtac_make_afe_callback(data->payload, - data->payload_size)) - return 0; - - if (data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) - param_id_pos = 4; - else - param_id_pos = 3; - - if (data->payload_size >= param_id_pos * sizeof(uint32_t)) - param_id = payload[param_id_pos - 1]; - else { - pr_err("%s: Error: size %d is less than expected\n", - __func__, data->payload_size); - return -EINVAL; - } - - if (param_id == AUDPROC_PARAM_ID_FFV_DOA_TRACKING_MONITOR) { - doa_tracking_mon_afe_cb_handler(data->opcode, - data->payload, data->payload_size); - } else if (param_id == AFE_PARAM_ID_DEV_TIMING_STATS) { - av_dev_drift_afe_cb_handler(data->opcode, data->payload, - data->payload_size); - } else { - if (sp_make_afe_callback(data->opcode, data->payload, - data->payload_size)) - return -EINVAL; - } - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - } else if (data->opcode == AFE_EVENT_MBHC_DETECTION_SW_WA) { - msm_aud_evt_notifier_call_chain(SWR_WAKE_IRQ_EVENT, NULL); - } else if (data->opcode == - AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST) { - uint32_t *payload = data->payload; - - pr_debug("%s: AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST handle %d\n", - __func__, payload[0]); - if (data->token < AFE_LPASS_CORE_HW_VOTE_MAX) - this_afe.lpass_hw_core_client_hdl[data->token] = - payload[0]; - atomic_set(&this_afe.clk_state, 0); - atomic_set(&this_afe.clk_status, 0); - wake_up(&this_afe.lpass_core_hw_wait); - } else if (data->payload_size) { - uint32_t *payload; - uint16_t port_id = 0; - - payload = data->payload; - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size < (2 * sizeof(uint32_t))) { - pr_err("%s: Error: size %d is less than expected\n", - __func__, data->payload_size); - return -EINVAL; - } - pr_debug("%s:opcode = 0x%x cmd = 0x%x status = 0x%x token=%d\n", - __func__, data->opcode, - payload[0], payload[1], data->token); - /* payload[1] contains the error status for response */ - if (payload[1] != 0) { - if(data->token == AFE_CLK_TOKEN) - atomic_set(&this_afe.clk_status, payload[1]); - else - atomic_set(&this_afe.status, payload[1]); - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - } - switch (payload[0]) { - case AFE_PORT_CMD_SET_PARAM_V2: - case AFE_PORT_CMD_SET_PARAM_V3: - if (rtac_make_afe_callback(payload, - data->payload_size)) - return 0; - case AFE_PORT_CMD_DEVICE_STOP: - case AFE_PORT_CMD_DEVICE_START: - case AFE_PSEUDOPORT_CMD_START: - case AFE_PSEUDOPORT_CMD_STOP: - case AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS: - case AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS: - case AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER: - case AFE_PORTS_CMD_DTMF_CTL: - case AFE_SVC_CMD_SET_PARAM: - case AFE_SVC_CMD_SET_PARAM_V2: - case AFE_PORT_CMD_MOD_EVENT_CFG: - if(data->token == AFE_CLK_TOKEN) { - atomic_set(&this_afe.clk_state, 0); - wake_up(&this_afe.clk_wait); - } else { - atomic_set(&this_afe.state, 0); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - } - break; - case AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER: - break; - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2: - port_id = RT_PROXY_PORT_001_TX; - break; - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2: - port_id = RT_PROXY_PORT_001_RX; - break; - case AFE_CMD_ADD_TOPOLOGIES: - atomic_set(&this_afe.state, 0); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - pr_debug("%s: AFE_CMD_ADD_TOPOLOGIES cmd 0x%x\n", - __func__, payload[1]); - break; - case AFE_PORT_CMD_GET_PARAM_V2: - case AFE_PORT_CMD_GET_PARAM_V3: - /* - * Should only come here if there is an APR - * error or malformed APR packet. Otherwise - * response will be returned as - * AFE_PORT_CMDRSP_GET_PARAM_V2/3 - */ - pr_debug("%s: AFE Get Param opcode 0x%x token 0x%x src %d dest %d\n", - __func__, data->opcode, data->token, - data->src_port, data->dest_port); - if (payload[1] != 0) { - pr_err("%s: AFE Get Param failed with error %d\n", - __func__, payload[1]); - if (rtac_make_afe_callback( - payload, - data->payload_size)) - return 0; - } - atomic_set(&this_afe.state, payload[1]); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - break; - case AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST: - case AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST: - atomic_set(&this_afe.clk_state, 0); - if (payload[1] != 0) - atomic_set(&this_afe.clk_status, - payload[1]); - wake_up(&this_afe.lpass_core_hw_wait); - break; - case AFE_SVC_CMD_EVENT_CFG: - atomic_set(&this_afe.state, payload[1]); - wake_up(&this_afe.wait_wakeup); - break; - default: - pr_err("%s: Unknown cmd 0x%x\n", __func__, - payload[0]); - break; - } - } else if (data->opcode == - AFE_SERVICE_CMDRSP_SHARED_MEM_MAP_REGIONS) { - pr_debug("%s: mmap_handle: 0x%x, cal index %d\n", - __func__, payload[0], - atomic_read(&this_afe.mem_map_cal_index)); - if (atomic_read(&this_afe.mem_map_cal_index) != -1) - atomic_set(&this_afe.mem_map_cal_handles[ - atomic_read( - &this_afe.mem_map_cal_index)], - (uint32_t)payload[0]); - else - this_afe.mmap_handle = payload[0]; - atomic_set(&this_afe.state, 0); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - } else if (data->opcode == AFE_EVENT_RT_PROXY_PORT_STATUS) { - port_id = (uint16_t)(0x0000FFFF & payload[0]); - } else if (data->opcode == AFE_PORT_MOD_EVENT) { - u32 flag_dc_presence[2]; - uint32_t *payload = data->payload; - struct afe_port_mod_evt_rsp_hdr *evt_pl = - (struct afe_port_mod_evt_rsp_hdr *)payload; - - if (!payload || (data->token >= AFE_MAX_PORTS)) { - pr_err("%s: Error: size %d payload %pK token %d\n", - __func__, data->payload_size, - payload, data->token); - return -EINVAL; - } - if ((evt_pl->module_id == AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI) && - (evt_pl->event_id == AFE_PORT_SP_DC_DETECTION_EVENT) && - (evt_pl->payload_size == sizeof(flag_dc_presence))) { - - memcpy(&flag_dc_presence, - (uint8_t *)payload + - sizeof(struct afe_port_mod_evt_rsp_hdr), - evt_pl->payload_size); - if (flag_dc_presence[0] == 1 || - flag_dc_presence[1] == 1) { - afe_notify_dc_presence(); - } - } else if (evt_pl->port_id == AFE_PORT_ID_PRIMARY_SPDIF_TX) { - if (this_afe.pri_spdif_tx_cb) { - this_afe.pri_spdif_tx_cb(data->opcode, - data->token, data->payload, - this_afe.pri_spdif_tx_private_data); - } - afe_notify_spdif_fmt_update(data->payload); - } else if (evt_pl->port_id == AFE_PORT_ID_SECONDARY_SPDIF_TX) { - if (this_afe.sec_spdif_tx_cb) { - this_afe.sec_spdif_tx_cb(data->opcode, - data->token, data->payload, - this_afe.sec_spdif_tx_private_data); - } - afe_notify_spdif_fmt_update(data->payload); - } else { - pr_debug("%s: mod ID = 0x%x event_id = 0x%x\n", - __func__, evt_pl->module_id, - evt_pl->event_id); - } - } - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - switch (port_id) { - case RT_PROXY_PORT_001_TX: { - if (this_afe.tx_cb) { - this_afe.tx_cb(data->opcode, data->token, - data->payload, - this_afe.tx_private_data); - } - break; - } - case RT_PROXY_PORT_001_RX: { - if (this_afe.rx_cb) { - this_afe.rx_cb(data->opcode, data->token, - data->payload, - this_afe.rx_private_data); - } - break; - } - default: - pr_debug("%s: default case 0x%x\n", __func__, port_id); - break; - } - } - return 0; -} - -/** - * afe_get_port_type - - * Retrieve AFE port type whether RX or TX - * - * @port_id: AFE Port ID number - * - * Returns RX/TX type. - */ -int afe_get_port_type(u16 port_id) -{ - int ret = MSM_AFE_PORT_TYPE_RX; - - switch (port_id) { - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - ret = MSM_AFE_PORT_TYPE_TX; - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - ret = MSM_AFE_PORT_TYPE_RX; - break; - default: - /* Odd numbered ports are TX and Rx are Even numbered */ - if (port_id & 0x1) - ret = MSM_AFE_PORT_TYPE_TX; - else - ret = MSM_AFE_PORT_TYPE_RX; - break; - } - - return ret; -} -EXPORT_SYMBOL(afe_get_port_type); - -int afe_sizeof_cfg_cmd(u16 port_id) -{ - int ret_size; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SENARY_MI2S_RX: - case AFE_PORT_ID_SENARY_MI2S_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_i2s_cfg); - break; - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_meta_i2s_cfg); - break; - case HDMI_RX: - case DISPLAY_PORT_RX: - ret_size = - SIZEOF_CFG_CMD(afe_param_id_hdmi_multi_chan_audio_cfg); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - ret_size = - SIZEOF_CFG_CMD(afe_param_id_spdif_cfg_v2); - break; - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_5_TX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_slimbus_cfg); - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_pseudo_port_cfg); - break; - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_rt_proxy_port_cfg); - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_usb_audio_cfg); - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - ret_size = SIZEOF_CFG_CMD(afe_param_id_cdc_dma_cfg_t); - break; - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - default: - pr_debug("%s: default case 0x%x\n", __func__, port_id); - ret_size = SIZEOF_CFG_CMD(afe_param_id_pcm_cfg); - break; - } - return ret_size; -} - -/** - * afe_q6_interface_prepare - - * wrapper API to check Q6 AFE registered to APR otherwise registers - * - * Returns 0 on success or error on failure. - */ -int afe_q6_interface_prepare(void) -{ - int ret = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENETRESET; - } - rtac_set_afe_handle(this_afe.apr); - } - return ret; -} -EXPORT_SYMBOL(afe_q6_interface_prepare); - -/* - * afe_apr_send_pkt : returns 0 on success, negative otherwise. - */ -static int afe_apr_send_pkt(void *data, wait_queue_head_t *wait) -{ - int ret; - - mutex_lock(&this_afe.afe_apr_lock); - if (wait) - atomic_set(&this_afe.state, 1); - atomic_set(&this_afe.status, 0); - ret = apr_send_pkt(this_afe.apr, data); - if (ret > 0) { - if (wait) { - ret = wait_event_timeout(*wait, - (atomic_read(&this_afe.state) == 0), - msecs_to_jiffies(2 * TIMEOUT_MS)); - if (!ret) { - pr_err_ratelimited("%s: request timedout\n", - __func__); - ret = -ETIMEDOUT; - trace_printk("%s: wait for ADSP response timed out\n", - __func__); - } else if (atomic_read(&this_afe.status) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_afe.status))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_afe.status)); - } else { - ret = 0; - } - } else { - ret = 0; - } - } else if (ret == 0) { - pr_err("%s: packet not transmitted\n", __func__); - /* apr_send_pkt can return 0 when nothing is transmitted */ - ret = -EINVAL; - } - - pr_debug("%s: leave %d\n", __func__, ret); - mutex_unlock(&this_afe.afe_apr_lock); - return ret; -} -/* - * afe_apr_send_clk_pkt : returns 0 on success, negative otherwise. - */ -static int afe_apr_send_clk_pkt(void *data, wait_queue_head_t *wait) -{ - int ret; - - if (wait) - atomic_set(&this_afe.clk_state, 1); - atomic_set(&this_afe.clk_status, 0); - ret = apr_send_pkt(this_afe.apr, data); - if (ret > 0) { - if (wait) { - ret = wait_event_timeout(*wait, - (atomic_read(&this_afe.clk_state) == 0), - msecs_to_jiffies(2 * TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout\n", __func__); - ret = -ETIMEDOUT; - } else if (atomic_read(&this_afe.clk_status) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_afe.clk_status))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_afe.clk_status)); - } else { - ret = 0; - } - } else { - ret = 0; - } - } else if (ret == 0) { - pr_err("%s: packet not transmitted\n", __func__); - /* apr_send_pkt can return 0 when nothing is transmitted */ - ret = -EINVAL; - } - - pr_debug("%s: leave %d\n", __func__, ret); - return ret; -} - -/* This function shouldn't be called directly. Instead call q6afe_set_params. */ -static int q6afe_set_params_v2(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_port_cmd_set_param_v2 *set_param = NULL; - uint32_t size = sizeof(struct afe_port_cmd_set_param_v2); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - set_param = kzalloc(size, GFP_KERNEL); - if (set_param == NULL) - return -ENOMEM; - - set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param->apr_hdr.pkt_size = size; - set_param->apr_hdr.src_port = 0; - set_param->apr_hdr.dest_port = 0; - set_param->apr_hdr.token = index; - set_param->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; - set_param->port_id = port_id; - if (packed_data_size > U16_MAX) { - pr_err("%s: Invalid data size for set params V2 %d\n", __func__, - packed_data_size); - rc = -EINVAL; - goto done; - } - set_param->payload_size = packed_data_size; - if (mem_hdr != NULL) { - set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - memcpy(&set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(set_param, &this_afe.wait[index]); -done: - kfree(set_param); - return rc; -} - -/* This function shouldn't be called directly. Instead call q6afe_set_params. */ -static int q6afe_set_params_v3(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_port_cmd_set_param_v3 *set_param = NULL; - uint32_t size = sizeof(struct afe_port_cmd_set_param_v3); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - set_param = kzalloc(size, GFP_KERNEL); - if (set_param == NULL) - return -ENOMEM; - - set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param->apr_hdr.pkt_size = size; - set_param->apr_hdr.src_port = 0; - set_param->apr_hdr.dest_port = 0; - set_param->apr_hdr.token = index; - set_param->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; - set_param->port_id = port_id; - set_param->payload_size = packed_data_size; - if (mem_hdr != NULL) { - set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - memcpy(&set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(set_param, &this_afe.wait[index]); -done: - kfree(set_param); - return rc; -} - -static int q6afe_set_params(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - int ret = 0; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - port_id = q6audio_get_port_id(port_id); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid\n", __func__, index); - return -EINVAL; - } - - if (q6common_is_instance_id_supported()) - return q6afe_set_params_v3(port_id, index, mem_hdr, - packed_param_data, packed_data_size); - else - return q6afe_set_params_v2(port_id, index, mem_hdr, - packed_param_data, packed_data_size); -} - -static int q6afe_pack_and_set_param_in_band(u16 port_id, int index, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_param_data = NULL; - int packed_data_size = sizeof(union param_hdrs) + param_hdr.param_size; - int ret; - - packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); - if (packed_param_data == NULL) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, param_data, - &packed_data_size); - if (ret) { - pr_err("%s: Failed to pack param header and data, error %d\n", - __func__, ret); - goto fail_cmd; - } - - ret = q6afe_set_params(port_id, index, NULL, packed_param_data, - packed_data_size); - -fail_cmd: - kfree(packed_param_data); - return ret; -} - -static int q6afe_set_aanc_level(void) -{ - struct param_hdr_v3 param_hdr; - struct afe_param_id_aanc_noise_reduction aanc_noise_level; - int ret = 0; - uint16_t tx_port = 0; - - if (!this_afe.aanc_info.aanc_active) - return -EINVAL; - - pr_debug("%s: level: %d\n", __func__, this_afe.aanc_info.level); - memset(&aanc_noise_level, 0, sizeof(aanc_noise_level)); - aanc_noise_level.minor_version = 1; - aanc_noise_level.ad_beta = this_afe.aanc_info.level; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AANC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_AANC_NOISE_REDUCTION; - param_hdr.param_size = sizeof(struct afe_param_id_aanc_noise_reduction); - - tx_port = this_afe.aanc_info.aanc_tx_port; - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, - (u8 *) &aanc_noise_level); - if (ret) - pr_err("%s: AANC noise level enable failed for tx_port 0x%x ret %d\n", - __func__, tx_port, ret); - return ret; -} - -/** - * afe_set_aanc_noise_level - controls aanc noise reduction strength - * - * @level: Noise level to be controlled - * - * Returns 0 on success or error on failure. - */ -int afe_set_aanc_noise_level(int level) -{ - int ret = 0; - - if (this_afe.aanc_info.level == level) - return ret; - - mutex_lock(&this_afe.afe_cmd_lock); - this_afe.aanc_info.level = level; - ret = q6afe_set_aanc_level(); - mutex_unlock(&this_afe.afe_cmd_lock); - - return ret; -} -EXPORT_SYMBOL(afe_set_aanc_noise_level); - -/* This function shouldn't be called directly. Instead call q6afe_get_param. */ -static int q6afe_get_params_v2(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr) -{ - struct afe_port_cmd_get_param_v2 afe_get_param; - u32 param_size = param_hdr->param_size; - - memset(&afe_get_param, 0, sizeof(afe_get_param)); - afe_get_param.apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - afe_get_param.apr_hdr.pkt_size = sizeof(afe_get_param); - afe_get_param.apr_hdr.src_port = 0; - afe_get_param.apr_hdr.dest_port = 0; - afe_get_param.apr_hdr.token = index; - afe_get_param.apr_hdr.opcode = AFE_PORT_CMD_GET_PARAM_V2; - afe_get_param.port_id = port_id; - afe_get_param.payload_size = sizeof(struct param_hdr_v1) + param_size; - if (mem_hdr != NULL) - afe_get_param.mem_hdr = *mem_hdr; - /* Set MID and PID in command */ - afe_get_param.module_id = param_hdr->module_id; - afe_get_param.param_id = param_hdr->param_id; - /* Set param header in payload */ - afe_get_param.param_hdr.module_id = param_hdr->module_id; - afe_get_param.param_hdr.param_id = param_hdr->param_id; - afe_get_param.param_hdr.param_size = param_size; - - return afe_apr_send_pkt(&afe_get_param, &this_afe.wait[index]); -} - -/* This function shouldn't be called directly. Instead call q6afe_get_param. */ -static int q6afe_get_params_v3(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr) -{ - struct afe_port_cmd_get_param_v3 afe_get_param; - - memset(&afe_get_param, 0, sizeof(afe_get_param)); - afe_get_param.apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - afe_get_param.apr_hdr.pkt_size = sizeof(afe_get_param); - afe_get_param.apr_hdr.src_port = 0; - afe_get_param.apr_hdr.dest_port = 0; - afe_get_param.apr_hdr.token = index; - afe_get_param.apr_hdr.opcode = AFE_PORT_CMD_GET_PARAM_V3; - afe_get_param.port_id = port_id; - if (mem_hdr != NULL) - afe_get_param.mem_hdr = *mem_hdr; - /* Set param header in command, no payload in V3 */ - afe_get_param.param_hdr = *param_hdr; - - return afe_apr_send_pkt(&afe_get_param, &this_afe.wait[index]); -} - -/* - * Calling functions copy param data directly from this_afe. Do not copy data - * back to caller here. - */ -static int q6afe_get_params(u16 port_id, struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr) -{ - int index; - int ret; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - port_id = q6audio_get_port_id(port_id); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid\n", __func__, index); - return -EINVAL; - } - - if (q6common_is_instance_id_supported()) - return q6afe_get_params_v3(port_id, index, NULL, param_hdr); - else - return q6afe_get_params_v2(port_id, index, NULL, param_hdr); -} - -/* - * This function shouldn't be called directly. Instead call - * q6afe_svc_set_params. - */ -static int q6afe_svc_set_params_v1(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_svc_cmd_set_param_v1 *svc_set_param = NULL; - uint32_t size = sizeof(struct afe_svc_cmd_set_param_v1); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - svc_set_param = kzalloc(size, GFP_KERNEL); - if (svc_set_param == NULL) - return -ENOMEM; - - svc_set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - svc_set_param->apr_hdr.pkt_size = size; - svc_set_param->apr_hdr.src_port = 0; - svc_set_param->apr_hdr.dest_port = 0; - svc_set_param->apr_hdr.token = index; - svc_set_param->apr_hdr.opcode = AFE_SVC_CMD_SET_PARAM; - svc_set_param->payload_size = packed_data_size; - - if (mem_hdr != NULL) { - /* Out of band case. */ - svc_set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - /* In band case. */ - memcpy(&svc_set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(svc_set_param, &this_afe.wait[index]); -done: - kfree(svc_set_param); - return rc; -} - -/* - * This function shouldn't be called directly. Instead call - * q6afe_svc_set_params. - */ -static int q6afe_svc_set_params_v2(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_svc_cmd_set_param_v2 *svc_set_param = NULL; - uint16_t size = sizeof(struct afe_svc_cmd_set_param_v2); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - svc_set_param = kzalloc(size, GFP_KERNEL); - if (svc_set_param == NULL) - return -ENOMEM; - - svc_set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - svc_set_param->apr_hdr.pkt_size = size; - svc_set_param->apr_hdr.src_port = 0; - svc_set_param->apr_hdr.dest_port = 0; - svc_set_param->apr_hdr.token = index; - svc_set_param->apr_hdr.opcode = AFE_SVC_CMD_SET_PARAM_V2; - svc_set_param->payload_size = packed_data_size; - - if (mem_hdr != NULL) { - /* Out of band case. */ - svc_set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - /* In band case. */ - memcpy(&svc_set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(svc_set_param, &this_afe.wait[index]); -done: - kfree(svc_set_param); - return rc; -} - -/* - * This function shouldn't be called directly. Instead call - * q6afe_clk_set_params. - */ -static int q6afe_clk_set_params_v1(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_svc_cmd_set_param_v1 *svc_set_param = NULL; - uint32_t size = sizeof(struct afe_svc_cmd_set_param_v1); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - svc_set_param = kzalloc(size, GFP_KERNEL); - if (svc_set_param == NULL) - return -ENOMEM; - - svc_set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - svc_set_param->apr_hdr.pkt_size = size; - svc_set_param->apr_hdr.src_port = 0; - svc_set_param->apr_hdr.dest_port = 0; - svc_set_param->apr_hdr.token = AFE_CLK_TOKEN; - svc_set_param->apr_hdr.opcode = AFE_SVC_CMD_SET_PARAM; - svc_set_param->payload_size = packed_data_size; - - if (mem_hdr != NULL) { - /* Out of band case. */ - svc_set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - /* In band case. */ - memcpy(&svc_set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_clk_pkt(svc_set_param, &this_afe.clk_wait); -done: - kfree(svc_set_param); - return rc; -} - -/* - * This function shouldn't be called directly. Instead call - * q6afe_clk_set_params. - */ -static int q6afe_clk_set_params_v2(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_svc_cmd_set_param_v2 *svc_set_param = NULL; - uint16_t size = sizeof(struct afe_svc_cmd_set_param_v2); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - svc_set_param = kzalloc(size, GFP_KERNEL); - if (svc_set_param == NULL) - return -ENOMEM; - - svc_set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - svc_set_param->apr_hdr.pkt_size = size; - svc_set_param->apr_hdr.src_port = 0; - svc_set_param->apr_hdr.dest_port = 0; - svc_set_param->apr_hdr.token = AFE_CLK_TOKEN; - svc_set_param->apr_hdr.opcode = AFE_SVC_CMD_SET_PARAM_V2; - svc_set_param->payload_size = packed_data_size; - - if (mem_hdr != NULL) { - /* Out of band case. */ - svc_set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - /* In band case. */ - memcpy(&svc_set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_clk_pkt(svc_set_param, &this_afe.clk_wait); -done: - kfree(svc_set_param); - return rc; -} - -static int q6afe_clk_set_params(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size, - bool is_iid_supported) -{ - int ret; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if (is_iid_supported) - return q6afe_clk_set_params_v2(index, mem_hdr, - packed_param_data, - packed_data_size); - else - return q6afe_clk_set_params_v1(index, mem_hdr, - packed_param_data, - packed_data_size); -} - -static int q6afe_svc_set_params(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size, - bool is_iid_supported) -{ - int ret; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if (is_iid_supported) - return q6afe_svc_set_params_v2(index, mem_hdr, - packed_param_data, - packed_data_size); - else - return q6afe_svc_set_params_v1(index, mem_hdr, - packed_param_data, - packed_data_size); -} - -static int q6afe_svc_pack_and_set_param_in_band(int index, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_param_data = NULL; - u32 packed_data_size = - sizeof(struct param_hdr_v3) + param_hdr.param_size; - int ret = 0; - bool is_iid_supported = q6common_is_instance_id_supported(); - - packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - - ret = q6common_pack_pp_params_v2(packed_param_data, ¶m_hdr, - param_data, &packed_data_size, - is_iid_supported); - if (ret) { - pr_err("%s: Failed to pack parameter header and data, error %d\n", - __func__, ret); - goto done; - } - if (param_hdr.module_id == AFE_MODULE_CLOCK_SET) - ret = q6afe_clk_set_params(index, NULL, packed_param_data, - packed_data_size, is_iid_supported); - else - ret = q6afe_svc_set_params(index, NULL, packed_param_data, - packed_data_size, is_iid_supported); - -done: - kfree(packed_param_data); - return ret; -} - -static int afe_send_cal_block(u16 port_id, struct cal_block_data *cal_block) -{ - struct mem_mapping_hdr mem_hdr; - int payload_size = 0; - int result = 0; - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - - if (!cal_block) { - pr_debug("%s: No AFE cal to send!\n", __func__); - result = -EINVAL; - goto done; - } - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: AFE cal has invalid size!\n", __func__); - result = -EINVAL; - goto done; - } - - payload_size = cal_block->cal_data.size; - mem_hdr.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - mem_hdr.mem_map_handle = cal_block->map_data.q6map_handle; - - pr_debug("%s: AFE cal sent for device port = 0x%x, cal size = %zd, cal addr = 0x%pK\n", - __func__, port_id, - cal_block->cal_data.size, &cal_block->cal_data.paddr); - - result = q6afe_set_params(port_id, q6audio_get_port_index(port_id), - &mem_hdr, NULL, payload_size); - if (result) - pr_err("%s: AFE cal for port 0x%x failed %d\n", - __func__, port_id, result); - -done: - return result; -} - - -static int afe_send_custom_topology_block(struct cal_block_data *cal_block) -{ - int result = 0; - int index = 0; - struct cmd_set_topologies afe_cal; - - if (!cal_block) { - pr_err("%s: No AFE SVC cal to send!\n", __func__); - return -EINVAL; - } - if (cal_block->cal_data.size <= 0) { - pr_err("%s: AFE SVC cal has invalid size: %zd!\n", - __func__, cal_block->cal_data.size); - return -EINVAL; - } - - afe_cal.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - afe_cal.hdr.pkt_size = sizeof(afe_cal); - afe_cal.hdr.src_port = 0; - afe_cal.hdr.dest_port = 0; - afe_cal.hdr.token = index; - afe_cal.hdr.opcode = AFE_CMD_ADD_TOPOLOGIES; - - afe_cal.payload_size = cal_block->cal_data.size; - afe_cal.payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - afe_cal.payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - afe_cal.mem_map_handle = cal_block->map_data.q6map_handle; - - pr_debug("%s:cmd_id:0x%x calsize:%zd memmap_hdl:0x%x caladdr:0x%pK", - __func__, AFE_CMD_ADD_TOPOLOGIES, cal_block->cal_data.size, - afe_cal.mem_map_handle, &cal_block->cal_data.paddr); - - result = afe_apr_send_pkt(&afe_cal, &this_afe.wait[index]); - if (result) - pr_err("%s: AFE send topology for command 0x%x failed %d\n", - __func__, AFE_CMD_ADD_TOPOLOGIES, result); - - return result; -} - -static void afe_send_custom_topology(void) -{ - struct cal_block_data *cal_block = NULL; - int cal_index = AFE_CUST_TOPOLOGY_CAL; - int ret; - - if (this_afe.cal_data[cal_index] == NULL) { - pr_err("%s: cal_index %d not allocated!\n", - __func__, cal_index); - return; - } - mutex_lock(&this_afe.cal_data[cal_index]->lock); - - if (!this_afe.set_custom_topology) - goto unlock; - this_afe.set_custom_topology = 0; - cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s cal_block not found!!\n", __func__); - goto unlock; - } - - pr_debug("%s: Sending cal_index cal %d\n", __func__, cal_index); - - ret = remap_cal_data(cal_block, cal_index); - if (ret) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - goto unlock; - } - ret = afe_send_custom_topology_block(cal_block); - if (ret < 0) { - pr_err("%s: No cal sent for cal_index %d! ret %d\n", - __func__, cal_index, ret); - goto unlock; - } - pr_debug("%s:sent custom topology for AFE\n", __func__); -unlock: - mutex_unlock(&this_afe.cal_data[cal_index]->lock); -} - -static int afe_spk_ramp_dn_cfg(int port) -{ - struct param_hdr_v3 param_info; - int ret = -EINVAL; - - memset(¶m_info, 0, sizeof(param_info)); - - if (afe_get_port_type(port) != MSM_AFE_PORT_TYPE_RX) { - pr_debug("%s: port doesn't match 0x%x\n", __func__, port); - return 0; - } - if (this_afe.prot_cfg.mode == MSM_SPKR_PROT_DISABLED || - (this_afe.vi_rx_port != port)) { - pr_debug("%s: spkr protection disabled port 0x%x %d 0x%x\n", - __func__, port, ret, this_afe.vi_rx_port); - return 0; - } - param_info.module_id = AFE_MODULE_FB_SPKR_PROT_V2_RX; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_FBSP_PTONE_RAMP_CFG; - param_info.param_size = 0; - - ret = q6afe_pack_and_set_param_in_band(port, - q6audio_get_port_index(port), - param_info, NULL); - if (ret) { - pr_err("%s: Failed to set speaker ramp duration param, err %d\n", - __func__, ret); - goto fail_cmd; - } - - /* dsp needs atleast 15ms to ramp down pilot tone*/ - usleep_range(15000, 15010); - ret = 0; -fail_cmd: - pr_debug("%s: config.pdata.param_id 0x%x status %d\n", __func__, - param_info.param_id, ret); - return ret; -} - -static int afe_spk_prot_prepare(int src_port, int dst_port, int param_id, - union afe_spkr_prot_config *prot_config) -{ - struct param_hdr_v3 param_info; - int ret = -EINVAL; - - memset(¶m_info, 0, sizeof(param_info)); - - ret = q6audio_validate_port(src_port); - if (ret < 0) { - pr_err("%s: Invalid src port 0x%x ret %d", __func__, src_port, - ret); - ret = -EINVAL; - goto fail_cmd; - } - ret = q6audio_validate_port(dst_port); - if (ret < 0) { - pr_err("%s: Invalid dst port 0x%x ret %d", __func__, - dst_port, ret); - ret = -EINVAL; - goto fail_cmd; - } - - switch (param_id) { - case AFE_PARAM_ID_FBSP_MODE_RX_CFG: - case AFE_PARAM_ID_SP_RX_LIMITER_TH: - param_info.module_id = AFE_MODULE_FB_SPKR_PROT_V2_RX; - break; - case AFE_PARAM_ID_FEEDBACK_PATH_CFG: - this_afe.vi_tx_port = src_port; - this_afe.vi_rx_port = dst_port; - param_info.module_id = AFE_MODULE_FEEDBACK; - break; - /* - * AFE_PARAM_ID_SPKR_CALIB_VI_PROC_CFG_V2 is same as - * AFE_PARAM_ID_SP_V2_TH_VI_MODE_CFG. V_VALI_CFG uses - * same module TH_VI. - */ - case AFE_PARAM_ID_SPKR_CALIB_VI_PROC_CFG_V2: - case AFE_PARAM_ID_SP_V2_TH_VI_FTM_CFG: - case AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_CFG: - param_info.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_TH_VI; - break; - case AFE_PARAM_ID_SP_V2_EX_VI_MODE_CFG: - case AFE_PARAM_ID_SP_V2_EX_VI_FTM_CFG: - param_info.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI; - break; - default: - pr_err("%s: default case 0x%x\n", __func__, param_id); - goto fail_cmd; - } - - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = param_id; - param_info.param_size = sizeof(union afe_spkr_prot_config); - - ret = q6afe_pack_and_set_param_in_band(src_port, - q6audio_get_port_index(src_port), - param_info, (u8 *) prot_config); - if (ret) - pr_err("%s: port = 0x%x param = 0x%x failed %d\n", __func__, - src_port, param_id, ret); - -fail_cmd: - pr_debug("%s: config.pdata.param_id 0x%x status %d 0x%x\n", __func__, - param_info.param_id, ret, src_port); - return ret; -} - -static int afe_spkr_prot_reg_event_cfg(u16 port_id) -{ - struct afe_port_cmd_event_cfg *config; - struct afe_port_cmd_mod_evt_cfg_payload pl; - int index; - int ret; - int num_events = 1; - int cmd_size = sizeof(struct afe_port_cmd_event_cfg) + - (num_events * sizeof(struct afe_port_cmd_mod_evt_cfg_payload)); - - config = kzalloc(cmd_size, GFP_KERNEL); - if (!config) - return -ENOMEM; - - index = q6audio_get_port_index(port_id); - if (index < 0) { - pr_err("%s: Invalid index number: %d\n", __func__, index); - ret = -EINVAL; - goto fail_idx; - } - - memset(&pl, 0, sizeof(pl)); - pl.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI; - pl.event_id = AFE_PORT_SP_DC_DETECTION_EVENT; - pl.reg_flag = AFE_MODULE_REGISTER_EVENT_FLAG; - - - config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - config->hdr.pkt_size = cmd_size; - config->hdr.src_port = 0; - config->hdr.dest_port = 0; - config->hdr.token = index; - - config->hdr.opcode = AFE_PORT_CMD_MOD_EVENT_CFG; - config->port_id = q6audio_get_port_id(port_id); - config->num_events = num_events; - config->version = 1; - memcpy(config->payload, &pl, sizeof(pl)); - ret = afe_apr_send_pkt((uint32_t *) config, &this_afe.wait[index]); - -fail_idx: - kfree(config); - return ret; -} - -static void afe_send_cal_spkr_prot_tx(int port_id) -{ - union afe_spkr_prot_config afe_spk_config; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL || - this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL || - this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL] == NULL) - return; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - if ((this_afe.prot_cfg.mode != MSM_SPKR_PROT_DISABLED) && - (this_afe.vi_tx_port == port_id)) { - if (this_afe.prot_cfg.mode == - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) { - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_CALIBRATION; - afe_spk_config.vi_proc_cfg.quick_calib_flag = - this_afe.prot_cfg.quick_calib_flag; - } else { - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_PROCESSING; - } - - if (this_afe.th_ftm_cfg.mode == MSM_SPKR_PROT_IN_FTM_MODE) - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_FTM_MODE; - else if (this_afe.v_vali_cfg.mode == - MSM_SPKR_PROT_IN_V_VALI_MODE) - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_V_VALI_MODE; - afe_spk_config.vi_proc_cfg.minor_version = 1; - afe_spk_config.vi_proc_cfg.r0_cali_q24[SP_V2_SPKR_1] = - (uint32_t) this_afe.prot_cfg.r0[SP_V2_SPKR_1]; - afe_spk_config.vi_proc_cfg.r0_cali_q24[SP_V2_SPKR_2] = - (uint32_t) this_afe.prot_cfg.r0[SP_V2_SPKR_2]; - afe_spk_config.vi_proc_cfg.t0_cali_q6[SP_V2_SPKR_1] = - (uint32_t) this_afe.prot_cfg.t0[SP_V2_SPKR_1]; - afe_spk_config.vi_proc_cfg.t0_cali_q6[SP_V2_SPKR_2] = - (uint32_t) this_afe.prot_cfg.t0[SP_V2_SPKR_2]; - if (this_afe.prot_cfg.mode != MSM_SPKR_PROT_NOT_CALIBRATED) { - struct asm_spkr_calib_vi_proc_cfg *vi_proc_cfg; - - vi_proc_cfg = &afe_spk_config.vi_proc_cfg; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_1] = - USE_CALIBRATED_R0TO; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_2] = - USE_CALIBRATED_R0TO; - } else { - struct asm_spkr_calib_vi_proc_cfg *vi_proc_cfg; - - vi_proc_cfg = &afe_spk_config.vi_proc_cfg; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_1] = - USE_SAFE_R0TO; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_2] = - USE_SAFE_R0TO; - } - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SPKR_CALIB_VI_PROC_CFG_V2, - &afe_spk_config)) - pr_err("%s: SPKR_CALIB_VI_PROC_CFG failed\n", - __func__); - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - if ((this_afe.th_ftm_cfg.mode == MSM_SPKR_PROT_IN_FTM_MODE) && - (this_afe.vi_tx_port == port_id)) { - afe_spk_config.th_vi_ftm_cfg.minor_version = 1; - afe_spk_config.th_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_1] = - this_afe.th_ftm_cfg.wait_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_2] = - this_afe.th_ftm_cfg.wait_time[SP_V2_SPKR_2]; - afe_spk_config.th_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_1] = - this_afe.th_ftm_cfg.ftm_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_2] = - this_afe.th_ftm_cfg.ftm_time[SP_V2_SPKR_2]; - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_TH_VI_FTM_CFG, - &afe_spk_config)) - pr_err("%s: th vi ftm cfg failed\n", __func__); - this_afe.th_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - } else if ((this_afe.v_vali_cfg.mode == - MSM_SPKR_PROT_IN_V_VALI_MODE) && - (this_afe.vi_tx_port == port_id)) { - afe_spk_config.th_vi_v_vali_cfg.minor_version = 1; - afe_spk_config.th_vi_v_vali_cfg.wait_time_ms[SP_V2_SPKR_1] = - this_afe.v_vali_cfg.wait_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_v_vali_cfg.wait_time_ms[SP_V2_SPKR_2] = - this_afe.v_vali_cfg.wait_time[SP_V2_SPKR_2]; - afe_spk_config.th_vi_v_vali_cfg.vali_time_ms[SP_V2_SPKR_1] = - this_afe.v_vali_cfg.vali_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_v_vali_cfg.vali_time_ms[SP_V2_SPKR_2] = - this_afe.v_vali_cfg.vali_time[SP_V2_SPKR_2]; - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_CFG, - &afe_spk_config)) - pr_err("%s: th vi v-vali cfg failed\n", __func__); - - this_afe.v_vali_cfg.mode = MSM_SPKR_PROT_DISABLED; - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - if ((this_afe.ex_ftm_cfg.mode == MSM_SPKR_PROT_IN_FTM_MODE) && - (this_afe.vi_tx_port == port_id)) { - afe_spk_config.ex_vi_mode_cfg.minor_version = 1; - afe_spk_config.ex_vi_mode_cfg.operation_mode = - Q6AFE_MSM_SPKR_FTM_MODE; - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_EX_VI_MODE_CFG, - &afe_spk_config)) - pr_err("%s: ex vi mode cfg failed\n", __func__); - - afe_spk_config.ex_vi_ftm_cfg.minor_version = 1; - afe_spk_config.ex_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_1] = - this_afe.ex_ftm_cfg.wait_time[SP_V2_SPKR_1]; - afe_spk_config.ex_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_2] = - this_afe.ex_ftm_cfg.wait_time[SP_V2_SPKR_2]; - afe_spk_config.ex_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_1] = - this_afe.ex_ftm_cfg.ftm_time[SP_V2_SPKR_1]; - afe_spk_config.ex_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_2] = - this_afe.ex_ftm_cfg.ftm_time[SP_V2_SPKR_2]; - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_EX_VI_FTM_CFG, - &afe_spk_config)) - pr_err("%s: ex vi ftm cfg failed\n", __func__); - this_afe.ex_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - - /* Register for DC detection event if speaker protection is enabled */ - if (this_afe.prot_cfg.mode != MSM_SPKR_PROT_DISABLED && - (this_afe.vi_tx_port == port_id)) { - afe_spkr_prot_reg_event_cfg(port_id); - } -} - -static void afe_send_cal_spkr_prot_rx(int port_id) -{ - union afe_spkr_prot_config afe_spk_config; - union afe_spkr_prot_config afe_spk_limiter_config; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - - if (this_afe.prot_cfg.mode != MSM_SPKR_PROT_DISABLED && - (this_afe.vi_rx_port == port_id)) { - if (this_afe.prot_cfg.mode == - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) - afe_spk_config.mode_rx_cfg.mode = - Q6AFE_MSM_SPKR_CALIBRATION; - else - afe_spk_config.mode_rx_cfg.mode = - Q6AFE_MSM_SPKR_PROCESSING; - afe_spk_config.mode_rx_cfg.minor_version = 1; - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_FBSP_MODE_RX_CFG, - &afe_spk_config)) - pr_err("%s: RX MODE_VI_PROC_CFG failed\n", - __func__); - - if (afe_spk_config.mode_rx_cfg.mode == - Q6AFE_MSM_SPKR_PROCESSING) { - if (this_afe.prot_cfg.sp_version >= - AFE_API_VERSION_SUPPORT_SPV3) { - afe_spk_limiter_config.limiter_th_cfg. - minor_version = 1; - afe_spk_limiter_config.limiter_th_cfg. - lim_thr_per_calib_q27[SP_V2_SPKR_1] = - this_afe.prot_cfg.limiter_th[SP_V2_SPKR_1]; - afe_spk_limiter_config.limiter_th_cfg. - lim_thr_per_calib_q27[SP_V2_SPKR_2] = - this_afe.prot_cfg.limiter_th[SP_V2_SPKR_2]; - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_RX_LIMITER_TH, - &afe_spk_limiter_config)) - pr_err("%s: SP_RX_LIMITER_TH failed.\n", - __func__); - } else { - pr_debug("%s: SPv3 failed to apply on AFE API version=%d.\n", - __func__, - this_afe.prot_cfg.sp_version); - } - } - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); -done: - return; -} - -static int afe_send_hw_delay(u16 port_id, u32 rate) -{ - struct audio_cal_hw_delay_entry delay_entry; - struct afe_param_id_device_hw_delay_cfg hw_delay; - struct param_hdr_v3 param_info; - int ret = -EINVAL; - - pr_debug("%s:\n", __func__); - - memset(&delay_entry, 0, sizeof(delay_entry)); - memset(¶m_info, 0, sizeof(param_info)); - - delay_entry.sample_rate = rate; - if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) - ret = afe_get_cal_hw_delay(TX_DEVICE, &delay_entry); - else if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) - ret = afe_get_cal_hw_delay(RX_DEVICE, &delay_entry); - - /* - * HW delay is only used for IMS calls to sync audio with video - * It is only needed for devices & sample rates used for IMS video - * calls. Values are received from ACDB calbration files - */ - if (ret != 0) { - pr_debug("%s: debug: HW delay info not available %d\n", - __func__, ret); - goto fail_cmd; - } - - param_info.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_DEVICE_HW_DELAY; - param_info.param_size = sizeof(hw_delay); - - hw_delay.delay_in_us = delay_entry.delay_usec; - hw_delay.device_hw_delay_minor_version = - AFE_API_VERSION_DEVICE_HW_DELAY; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &hw_delay); - if (ret) - pr_err("%s: AFE hw delay for port 0x%x failed %d\n", - __func__, port_id, ret); - -fail_cmd: - pr_info("%s: port_id 0x%x rate %u delay_usec %d status %d\n", - __func__, port_id, rate, delay_entry.delay_usec, ret); - return ret; -} - -static struct cal_block_data *afe_find_cal_topo_id_by_port( - struct cal_type_data *cal_type, u16 port_id) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - int32_t path; - struct audio_cal_info_afe_top *afe_top; - int afe_port_index = q6audio_get_port_index(port_id); - - if (afe_port_index < 0) - goto err_exit; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - cal_block = list_entry(ptr, - struct cal_block_data, list); - /* Skip cal_block if it is already marked stale */ - if (cal_utils_is_cal_stale(cal_block)) - continue; - pr_info("%s: port id: 0x%x, dev_acdb_id: %d\n", __func__, - port_id, this_afe.dev_acdb_id[afe_port_index]); - path = ((afe_get_port_type(port_id) == - MSM_AFE_PORT_TYPE_TX)?(TX_DEVICE):(RX_DEVICE)); - afe_top = - (struct audio_cal_info_afe_top *)cal_block->cal_info; - if (afe_top->path == path) { - if (this_afe.dev_acdb_id[afe_port_index] > 0) { - if (afe_top->acdb_id == - this_afe.dev_acdb_id[afe_port_index]) { - pr_info("%s: top_id:%x acdb_id:%d afe_port_id:0x%x\n", - __func__, afe_top->topology, - afe_top->acdb_id, - q6audio_get_port_id(port_id)); - return cal_block; - } - } else { - pr_info("%s: top_id:%x acdb_id:%d afe_port:0x%x\n", - __func__, afe_top->topology, afe_top->acdb_id, - q6audio_get_port_id(port_id)); - return cal_block; - } - } - } - -err_exit: - return NULL; -} - -/* - * Retrieving cal_block will mark cal_block as stale. - * Hence it cannot be reused or resent unless the flag - * is reset. - */ -static int afe_get_cal_topology_id(u16 port_id, u32 *topology_id, - int cal_type_index) -{ - int ret = 0; - - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_afe_top *afe_top_info = NULL; - - if (this_afe.cal_data[cal_type_index] == NULL) { - pr_err("%s: cal_type %d not initialized\n", __func__, - cal_type_index); - return -EINVAL; - } - if (topology_id == NULL) { - pr_err("%s: topology_id is NULL\n", __func__); - return -EINVAL; - } - *topology_id = 0; - - mutex_lock(&this_afe.cal_data[cal_type_index]->lock); - cal_block = afe_find_cal_topo_id_by_port( - this_afe.cal_data[cal_type_index], port_id); - if (cal_block == NULL) { - pr_err("%s: cal_type %d not initialized for this port %d\n", - __func__, cal_type_index, port_id); - ret = -EINVAL; - goto unlock; - } - - afe_top_info = ((struct audio_cal_info_afe_top *) - cal_block->cal_info); - if (!afe_top_info->topology) { - pr_err("%s: invalid topology id : [%d, %d]\n", - __func__, afe_top_info->acdb_id, afe_top_info->topology); - ret = -EINVAL; - goto unlock; - } - *topology_id = (u32)afe_top_info->topology; - cal_utils_mark_cal_used(cal_block); - - pr_info("%s: port_id = 0x%x acdb_id = %d topology_id = 0x%x cal_type_index=%d ret=%d\n", - __func__, port_id, afe_top_info->acdb_id, - afe_top_info->topology, cal_type_index, ret); -unlock: - mutex_unlock(&this_afe.cal_data[cal_type_index]->lock); - return ret; -} - -static int afe_send_port_topology_id(u16 port_id) -{ - struct afe_param_id_set_topology_cfg topology; - struct param_hdr_v3 param_info; - u32 topology_id = 0; - int index = 0; - int ret = 0; - - memset(&topology, 0, sizeof(topology)); - memset(¶m_info, 0, sizeof(param_info)); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - - ret = afe_get_cal_topology_id(port_id, &topology_id, AFE_TOPOLOGY_CAL); - if (ret < 0) { - pr_debug("%s: Check for LSM topology\n", __func__); - ret = afe_get_cal_topology_id(port_id, &topology_id, - AFE_LSM_TOPOLOGY_CAL); - } - if (ret || !topology_id) { - pr_debug("%s: AFE port[%d] get_cal_topology[%d] invalid!\n", - __func__, port_id, topology_id); - goto done; - } - - param_info.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_SET_TOPOLOGY; - param_info.param_size = sizeof(topology); - - topology.minor_version = AFE_API_VERSION_TOPOLOGY_V1; - topology.topology_id = topology_id; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &topology); - if (ret) { - pr_err("%s: AFE set topology id enable for port 0x%x failed %d\n", - __func__, port_id, ret); - goto done; - } - - this_afe.topology[index] = topology_id; - rtac_update_afe_topology(port_id); -done: - pr_info("%s: AFE set topology id 0x%x enable for port 0x%x ret %d\n", - __func__, topology_id, port_id, ret); - return ret; - -} - - -static int afe_get_island_mode(u16 port_id, u32 *island_mode) -{ - int ret = 0; - int index = 0; - *island_mode = 0; - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - - *island_mode = this_afe.island_mode[index]; - return ret; -} - -/* - * afe_send_port_island_mode - - * for sending island mode to AFE - * - * @port_id: AFE port id number - * - * Returns 0 on success or error on failure. - */ -int afe_send_port_island_mode(u16 port_id) -{ - struct afe_param_id_island_cfg_t island_cfg; - struct param_hdr_v3 param_info; - u32 island_mode = 0; - int ret = 0; - - if (!(q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4)) { - pr_debug("%s: AFE port[%d] API version is invalid!\n", - __func__, port_id); - return 0; - } - - memset(&island_cfg, 0, sizeof(island_cfg)); - memset(¶m_info, 0, sizeof(param_info)); - - ret = afe_get_island_mode(port_id, &island_mode); - if (ret) { - pr_err("%s: AFE port[%d] get island mode is invalid!\n", - __func__, port_id); - return ret; - } - param_info.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_ISLAND_CONFIG; - param_info.param_size = sizeof(island_cfg); - - island_cfg.island_cfg_minor_version = AFE_API_VERSION_ISLAND_CONFIG; - island_cfg.island_enable = island_mode; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &island_cfg); - if (ret) { - pr_err("%s: AFE set island mode enable for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - pr_debug("%s: AFE set island mode 0x%x enable for port 0x%x ret %d\n", - __func__, island_mode, port_id, ret); - trace_printk("%s: AFE set island mode 0x%x enable for port 0x%x ret %d\n", - __func__, island_mode, port_id, ret); - return ret; -} -EXPORT_SYMBOL(afe_send_port_island_mode); - -static int afe_get_vad_preroll_cfg(u16 port_id, u32 *preroll_cfg) -{ - int ret = 0; - int index = 0; - *preroll_cfg = 0; - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - - *preroll_cfg = this_afe.vad_cfg[index].pre_roll; - return ret; -} - -int afe_send_port_vad_cfg_params(u16 port_id) -{ - struct afe_param_id_vad_cfg_t vad_cfg; - struct afe_mod_enable_param vad_enable; - struct param_hdr_v3 param_info; - u32 pre_roll_cfg = 0; - struct firmware_cal *hwdep_cal = NULL; - int ret = 0; - uint16_t port_index = 0; - - if (!(q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4)) { - pr_err("%s: AFE port[%d]: AFE API version doesn't support VAD config\n", - __func__, port_id); - return 0; - } - - port_index = afe_get_port_index(port_id); - - if (this_afe.vad_cfg[port_index].is_enable) { - memset(&vad_cfg, 0, sizeof(vad_cfg)); - memset(¶m_info, 0, sizeof(param_info)); - - ret = afe_get_vad_preroll_cfg(port_id, &pre_roll_cfg); - if (ret) { - pr_err("%s: AFE port[%d] get preroll cfg is invalid!\n", - __func__, port_id); - return ret; - } - param_info.module_id = AFE_MODULE_VAD; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_VAD_CFG; - param_info.param_size = sizeof(vad_cfg); - - vad_cfg.vad_cfg_minor_version = AFE_API_VERSION_VAD_CFG; - vad_cfg.pre_roll_in_ms = pre_roll_cfg; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &vad_cfg); - if (ret) { - pr_err("%s: AFE set vad cfg for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - - memset(¶m_info, 0, sizeof(param_info)); - - hwdep_cal = q6afecal_get_fw_cal(this_afe.fw_data, - Q6AFE_VAD_CORE_CAL); - if (!hwdep_cal) { - pr_err("%s: error in retrieving vad core calibration", - __func__); - return -EINVAL; - } - - param_info.module_id = AFE_MODULE_VAD; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_VAD_CORE_CFG; - param_info.param_size = hwdep_cal->size; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, - (u8 *) hwdep_cal->data); - if (ret) { - pr_err("%s: AFE set vad cfg for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - } - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V6) { - memset(&vad_enable, 0, sizeof(vad_enable)); - memset(¶m_info, 0, sizeof(param_info)); - param_info.module_id = AFE_MODULE_VAD; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_ENABLE; - param_info.param_size = sizeof(vad_enable); - - port_index = afe_get_port_index(port_id); - vad_enable.enable = this_afe.vad_cfg[port_index].is_enable; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &vad_enable); - if (ret) { - pr_err("%s: AFE set vad enable for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - } - - pr_debug("%s: AFE set preroll cfg %d vad core cfg port 0x%x ret %d\n", - __func__, pre_roll_cfg, port_id, ret); - return ret; -} -EXPORT_SYMBOL(afe_send_port_vad_cfg_params); - -static int remap_cal_data(struct cal_block_data *cal_block, int cal_index) -{ - int ret = 0; - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - atomic_set(&this_afe.mem_map_cal_index, cal_index); - ret = afe_cmd_memory_map(cal_block->cal_data.paddr, - cal_block->map_data.map_size); - atomic_set(&this_afe.mem_map_cal_index, -1); - if (ret < 0) { - pr_err("%s: mmap did not work! size = %zd ret %d\n", - __func__, - cal_block->map_data.map_size, ret); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_afe. - mem_map_cal_handles[cal_index]); - } -done: - return ret; -} - -static struct cal_block_data *afe_find_cal(int cal_index, int port_id) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_afe *afe_cal_info = NULL; - int afe_port_index = q6audio_get_port_index(port_id); - - pr_info("%s: cal_index %d port_id 0x%x port_index %d\n", __func__, - cal_index, port_id, afe_port_index); - if (afe_port_index < 0) { - pr_err("%s: Error getting AFE port index %d\n", - __func__, afe_port_index); - goto exit; - } - - list_for_each_safe(ptr, next, - &this_afe.cal_data[cal_index]->cal_blocks) { - cal_block = list_entry(ptr, struct cal_block_data, list); - afe_cal_info = cal_block->cal_info; - pr_info("%s: acdb_id %d dev_acdb_id %d sample_rate %d afe_sample_rates %d\n", - __func__, afe_cal_info->acdb_id, - this_afe.dev_acdb_id[afe_port_index], - afe_cal_info->sample_rate, - this_afe.afe_sample_rates[afe_port_index]); - if ((afe_cal_info->acdb_id == - this_afe.dev_acdb_id[afe_port_index]) && - (afe_cal_info->sample_rate == - this_afe.afe_sample_rates[afe_port_index])) { - pr_info("%s: cal block is a match, size is %zd\n", - __func__, cal_block->cal_data.size); - goto exit; - } - } - pr_info("%s: no matching cal_block found\n", __func__); - cal_block = NULL; - -exit: - return cal_block; -} - -static int send_afe_cal_type(int cal_index, int port_id) -{ - struct cal_block_data *cal_block = NULL; - int ret; - int afe_port_index = q6audio_get_port_index(port_id); - - pr_info("%s: cal_index is %d\n", __func__, cal_index); - - if (this_afe.cal_data[cal_index] == NULL) { - pr_warn("%s: cal_index %d not allocated!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if (afe_port_index < 0) { - pr_err("%s: Error getting AFE port index %d\n", - __func__, afe_port_index); - ret = -EINVAL; - goto done; - } - - mutex_lock(&this_afe.cal_data[cal_index]->lock); - pr_info("%s: dev_acdb_id[%d] is %d\n", - __func__, afe_port_index, - this_afe.dev_acdb_id[afe_port_index]); - if (((cal_index == AFE_COMMON_RX_CAL) || - (cal_index == AFE_COMMON_TX_CAL) || - (cal_index == AFE_LSM_TX_CAL)) && - (this_afe.dev_acdb_id[afe_port_index] > 0)) - cal_block = afe_find_cal(cal_index, port_id); - else - cal_block = cal_utils_get_only_cal_block( - this_afe.cal_data[cal_index]); - - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s cal_block not found!!\n", __func__); - ret = -EINVAL; - goto unlock; - } - - pr_info("%s: Sending cal_index cal %d\n", __func__, cal_index); - - ret = remap_cal_data(cal_block, cal_index); - if (ret) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto unlock; - } - ret = afe_send_cal_block(port_id, cal_block); - if (ret < 0) - pr_err("%s: No cal sent for cal_index %d, port_id = 0x%x! ret %d\n", - __func__, cal_index, port_id, ret); - - cal_utils_mark_cal_used(cal_block); - -unlock: - mutex_unlock(&this_afe.cal_data[cal_index]->lock); -done: - return ret; -} - -void afe_send_cal(u16 port_id) -{ - int ret; - - pr_debug("%s: port_id=0x%x\n", __func__, port_id); - - if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) { - afe_send_cal_spkr_prot_tx(port_id); - ret = send_afe_cal_type(AFE_COMMON_TX_CAL, port_id); - if (ret < 0) - send_afe_cal_type(AFE_LSM_TX_CAL, port_id); - } else if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) { - send_afe_cal_type(AFE_COMMON_RX_CAL, port_id); - afe_send_cal_spkr_prot_rx(port_id); - } -} - -int afe_turn_onoff_hw_mad(u16 mad_type, u16 enable) -{ - struct afe_param_hw_mad_ctrl mad_enable_param; - struct param_hdr_v3 param_info; - int ret; - - pr_debug("%s: enter\n", __func__); - - memset(&mad_enable_param, 0, sizeof(mad_enable_param)); - memset(¶m_info, 0, sizeof(param_info)); - param_info.module_id = AFE_MODULE_HW_MAD; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_HW_MAD_CTRL; - param_info.param_size = sizeof(mad_enable_param); - - mad_enable_param.minor_version = 1; - mad_enable_param.mad_type = mad_type; - mad_enable_param.mad_enable = enable; - - ret = q6afe_pack_and_set_param_in_band(SLIMBUS_5_TX, IDX_GLOBAL_CFG, - param_info, - (u8 *) &mad_enable_param); - if (ret) - pr_err("%s: AFE_PARAM_ID_HW_MAD_CTRL failed %d\n", __func__, - ret); - return ret; -} - -static int afe_send_slimbus_slave_cfg( - struct afe_param_cdc_slimbus_slave_cfg *sb_slave_cfg) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter\n", __func__); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_SLIMBUS_SLAVE_CFG; - param_hdr.param_size = sizeof(struct afe_param_cdc_slimbus_slave_cfg); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) sb_slave_cfg); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_SLIMBUS_SLAVE_CFG failed %d\n", - __func__, ret); - - pr_debug("%s: leave %d\n", __func__, ret); - return ret; -} - -static int afe_send_codec_reg_page_config( - struct afe_param_cdc_reg_page_cfg *cdc_reg_page_cfg) -{ - struct param_hdr_v3 param_hdr; - int ret; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_REG_PAGE_CFG; - param_hdr.param_size = sizeof(struct afe_param_cdc_reg_page_cfg); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) cdc_reg_page_cfg); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_REG_PAGE_CFG failed %d\n", - __func__, ret); - - return ret; -} - -static int afe_send_codec_reg_config( - struct afe_param_cdc_reg_cfg_data *cdc_reg_cfg) -{ - u8 *packed_param_data = NULL; - u32 packed_data_size = 0; - u32 single_param_size = 0; - u32 max_data_size = 0; - u32 max_single_param = 0; - struct param_hdr_v3 param_hdr; - int idx = 0; - int ret = -EINVAL; - bool is_iid_supported = q6common_is_instance_id_supported(); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - max_single_param = sizeof(struct param_hdr_v3) + - sizeof(struct afe_param_cdc_reg_cfg); - max_data_size = APR_MAX_BUF - sizeof(struct afe_svc_cmd_set_param_v2); - packed_param_data = kzalloc(max_data_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - - /* param_hdr is the same for all params sent, set once at top */ - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_REG_CFG; - param_hdr.param_size = sizeof(struct afe_param_cdc_reg_cfg); - - while (idx < cdc_reg_cfg->num_registers) { - memset(packed_param_data, 0, max_data_size); - packed_data_size = 0; - single_param_size = 0; - - while (packed_data_size + max_single_param < max_data_size && - idx < cdc_reg_cfg->num_registers) { - ret = q6common_pack_pp_params_v2( - packed_param_data + packed_data_size, - ¶m_hdr, (u8 *) &cdc_reg_cfg->reg_data[idx], - &single_param_size, is_iid_supported); - if (ret) { - pr_err("%s: Failed to pack parameters with error %d\n", - __func__, ret); - goto done; - } - packed_data_size += single_param_size; - idx++; - } - - ret = q6afe_svc_set_params(IDX_GLOBAL_CFG, NULL, - packed_param_data, packed_data_size, - is_iid_supported); - if (ret) { - pr_err("%s: AFE_PARAM_ID_CDC_REG_CFG failed %d\n", - __func__, ret); - break; - } - } -done: - kfree(packed_param_data); - return ret; -} - -static int afe_init_cdc_reg_config(void) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter\n", __func__); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_REG_CFG_INIT; - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - NULL); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_INIT_REG_CFG failed %d\n", - __func__, ret); - - return ret; -} - -static int afe_send_slimbus_slave_port_cfg( - struct afe_param_slimbus_slave_port_cfg *slim_slave_config, u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter, port_id = 0x%x\n", __func__, port_id); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_HW_MAD; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.reserved = 0; - param_hdr.param_id = AFE_PARAM_ID_SLIMBUS_SLAVE_PORT_CFG; - param_hdr.param_size = sizeof(struct afe_param_slimbus_slave_port_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) slim_slave_config); - if (ret) - pr_err("%s: AFE_PARAM_ID_SLIMBUS_SLAVE_PORT_CFG failed %d\n", - __func__, ret); - - pr_debug("%s: leave %d\n", __func__, ret); - return ret; -} -static int afe_aanc_port_cfg(void *apr, uint16_t tx_port, uint16_t rx_port) -{ - struct afe_param_aanc_port_cfg aanc_port_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s: tx_port 0x%x, rx_port 0x%x\n", - __func__, tx_port, rx_port); - - pr_debug("%s: AANC sample rate tx rate: %d rx rate %d\n", __func__, - this_afe.aanc_info.aanc_tx_port_sample_rate, - this_afe.aanc_info.aanc_rx_port_sample_rate); - - memset(&aanc_port_cfg, 0, sizeof(aanc_port_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* - * If aanc tx sample rate or rx sample rate is zero, skip aanc - * configuration as AFE resampler will fail for invalid sample - * rates. - */ - if (!this_afe.aanc_info.aanc_tx_port_sample_rate || - !this_afe.aanc_info.aanc_rx_port_sample_rate) { - return -EINVAL; - } - - param_hdr.module_id = AFE_MODULE_AANC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_AANC_PORT_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_aanc_port_cfg); - - aanc_port_cfg.aanc_port_cfg_minor_version = - AFE_API_VERSION_AANC_PORT_CONFIG; - aanc_port_cfg.tx_port_sample_rate = - this_afe.aanc_info.aanc_tx_port_sample_rate; - aanc_port_cfg.tx_port_channel_map[0] = AANC_TX_VOICE_MIC; - aanc_port_cfg.tx_port_channel_map[1] = AANC_TX_NOISE_MIC; - aanc_port_cfg.tx_port_channel_map[2] = AANC_TX_ERROR_MIC; - aanc_port_cfg.tx_port_channel_map[3] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[4] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[5] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[6] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[7] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_num_channels = 3; - aanc_port_cfg.rx_path_ref_port_id = rx_port; - aanc_port_cfg.ref_port_sample_rate = - this_afe.aanc_info.aanc_rx_port_sample_rate; - - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, - (u8 *) &aanc_port_cfg); - if (ret) - pr_err("%s: AFE AANC port config failed for tx_port 0x%x, rx_port 0x%x ret %d\n", - __func__, tx_port, rx_port, ret); - else - q6afe_set_aanc_level(); - - return ret; -} - -static int afe_aanc_mod_enable(void *apr, uint16_t tx_port, uint16_t enable) -{ - struct afe_mod_enable_param mod_enable; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s: tx_port 0x%x\n", __func__, tx_port); - - memset(&mod_enable, 0, sizeof(mod_enable)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AANC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_ENABLE; - param_hdr.param_size = sizeof(struct afe_mod_enable_param); - - mod_enable.enable = enable; - mod_enable.reserved = 0; - - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, (u8 *) &mod_enable); - if (ret) - pr_err("%s: AFE AANC enable failed for tx_port 0x%x ret %d\n", - __func__, tx_port, ret); - return ret; -} - -static int afe_send_bank_selection_clip( - struct afe_param_id_clip_bank_sel *param) -{ - struct param_hdr_v3 param_hdr; - int ret; - - if (!param) { - pr_err("%s: Invalid params", __func__); - return -EINVAL; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CLIP_BANK_SEL_CFG; - param_hdr.param_size = sizeof(struct afe_param_id_clip_bank_sel); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) param); - if (ret) - pr_err("%s: AFE_PARAM_ID_CLIP_BANK_SEL_CFG failed %d\n", - __func__, ret); - return ret; -} -int afe_send_aanc_version( - struct afe_param_id_cdc_aanc_version *version_cfg) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter\n", __func__); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_AANC_VERSION; - param_hdr.param_size = sizeof(struct afe_param_id_cdc_aanc_version); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) version_cfg); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_AANC_VERSION failed %d\n", - __func__, ret); - return ret; -} - -/** - * afe_port_set_mad_type - - * to update mad type - * - * @port_id: AFE port id number - * @mad_type: MAD type enum value - * - * Returns 0 on success or error on failure. - */ -int afe_port_set_mad_type(u16 port_id, enum afe_mad_type mad_type) -{ - int i; - - if (port_id == AFE_PORT_ID_TERTIARY_MI2S_TX || - port_id == AFE_PORT_ID_INT3_MI2S_TX || - port_id == AFE_PORT_ID_TX_CODEC_DMA_TX_3 || - port_id == AFE_PORT_ID_TERTIARY_TDM_TX) { - mad_type = MAD_SW_AUDIO; - return 0; - } - - i = port_id - SLIMBUS_0_RX; - if (i < 0 || i >= ARRAY_SIZE(afe_ports_mad_type)) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - atomic_set(&afe_ports_mad_type[i], mad_type); - return 0; -} -EXPORT_SYMBOL(afe_port_set_mad_type); - -/** - * afe_port_get_mad_type - - * to retrieve mad type - * - * @port_id: AFE port id number - * - * Returns valid enum value on success or MAD_HW_NONE on failure. - */ -enum afe_mad_type afe_port_get_mad_type(u16 port_id) -{ - int i; - - if (port_id == AFE_PORT_ID_TERTIARY_MI2S_TX || - port_id == AFE_PORT_ID_INT3_MI2S_TX || - port_id == AFE_PORT_ID_TX_CODEC_DMA_TX_3 || - port_id == AFE_PORT_ID_TERTIARY_TDM_TX) - return MAD_SW_AUDIO; - - i = port_id - SLIMBUS_0_RX; - if (i < 0 || i >= ARRAY_SIZE(afe_ports_mad_type)) { - pr_debug("%s: Non Slimbus port_id 0x%x\n", __func__, port_id); - return MAD_HW_NONE; - } - return (enum afe_mad_type) atomic_read(&afe_ports_mad_type[i]); -} -EXPORT_SYMBOL(afe_port_get_mad_type); - -/** - * afe_set_config - - * to configure AFE session with - * specified configuration for given config type - * - * @config_type: config type - * @config_data: configuration to pass to AFE session - * @arg: argument used in specific config types - * - * Returns 0 on success or error value on port start failure. - */ -int afe_set_config(enum afe_config_type config_type, void *config_data, int arg) -{ - int ret; - - pr_debug("%s: enter config_type %d\n", __func__, config_type); - ret = afe_q6_interface_prepare(); - if (ret) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - switch (config_type) { - case AFE_SLIMBUS_SLAVE_CONFIG: - ret = afe_send_slimbus_slave_cfg(config_data); - if (!ret) - ret = afe_init_cdc_reg_config(); - else - pr_err("%s: Sending slimbus slave config failed %d\n", - __func__, ret); - break; - case AFE_CDC_REGISTERS_CONFIG: - ret = afe_send_codec_reg_config(config_data); - break; - case AFE_SLIMBUS_SLAVE_PORT_CONFIG: - ret = afe_send_slimbus_slave_port_cfg(config_data, arg); - break; - case AFE_AANC_VERSION: - ret = afe_send_aanc_version(config_data); - break; - case AFE_CLIP_BANK_SEL: - ret = afe_send_bank_selection_clip(config_data); - break; - case AFE_CDC_CLIP_REGISTERS_CONFIG: - ret = afe_send_codec_reg_config(config_data); - break; - case AFE_CDC_REGISTER_PAGE_CONFIG: - ret = afe_send_codec_reg_page_config(config_data); - break; - default: - pr_err("%s: unknown configuration type %d", - __func__, config_type); - ret = -EINVAL; - } - - if (!ret) - set_bit(config_type, &afe_configured_cmd); - - return ret; -} -EXPORT_SYMBOL(afe_set_config); - -/* - * afe_clear_config - If SSR happens ADSP loses AFE configs, let AFE driver know - * about the state so client driver can wait until AFE is - * reconfigured. - */ -void afe_clear_config(enum afe_config_type config) -{ - clear_bit(config, &afe_configured_cmd); -} -EXPORT_SYMBOL(afe_clear_config); - -bool afe_has_config(enum afe_config_type config) -{ - return !!test_bit(config, &afe_configured_cmd); -} - -int afe_send_spdif_clk_cfg(struct afe_param_id_spdif_clk_cfg *cfg, - u16 port_id) -{ - struct afe_param_id_spdif_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SPDIF_CLK_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_spdif_clk_cfg); - - pr_debug("%s: Minor version = 0x%x clk val = %d clk root = 0x%x port id = 0x%x\n", - __func__, clk_cfg.clk_cfg_minor_version, clk_cfg.clk_value, - clk_cfg.clk_root, q6audio_get_port_id(port_id)); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE send clock config for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} - -/** - * afe_send_spdif_ch_status_cfg - - * to configure AFE session with - * specified channel status configuration - * - * @ch_status_cfg: channel status configutation - * @port_id: AFE port id number - * - * Returns 0 on success or error value on port start failure. - */ -int afe_send_spdif_ch_status_cfg(struct afe_param_id_spdif_ch_status_cfg - *ch_status_cfg, u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!ch_status_cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SPDIF_CLK_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_spdif_ch_status_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) ch_status_cfg); - if (ret < 0) - pr_err("%s: AFE send channel status for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} -EXPORT_SYMBOL(afe_send_spdif_ch_status_cfg); - -int afe_send_cmd_wakeup_register(void *handle, bool enable) -{ - struct afe_svc_cmd_evt_cfg_payload wakeup_irq; - int ret = 0; - - pr_debug("%s: enter\n", __func__); - - wakeup_irq.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - wakeup_irq.hdr.pkt_size = sizeof(wakeup_irq); - wakeup_irq.hdr.src_port = 0; - wakeup_irq.hdr.dest_port = 0; - wakeup_irq.hdr.token = 0x0; - wakeup_irq.hdr.opcode = AFE_SVC_CMD_EVENT_CFG; - wakeup_irq.event_id = AFE_EVENT_ID_MBHC_DETECTION_SW_WA; - wakeup_irq.reg_flag = enable; - pr_debug("%s: cmd wakeup register opcode[0x%x] register:%d\n", - __func__, wakeup_irq.hdr.opcode, wakeup_irq.reg_flag); - - ret = afe_apr_send_pkt(&wakeup_irq, &this_afe.wait_wakeup); - if (ret) - pr_err("%s: AFE wakeup command register %d failed %d\n", - __func__, enable, ret); - - return ret; -} -EXPORT_SYMBOL(afe_send_cmd_wakeup_register); - -static int afe_send_cmd_port_start(u16 port_id) -{ - struct afe_port_cmd_device_start start; - int ret, index; - - pr_debug("%s: enter\n", __func__); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = index; - start.hdr.opcode = AFE_PORT_CMD_DEVICE_START; - start.port_id = q6audio_get_port_id(port_id); - pr_debug("%s: cmd device start opcode[0x%x] port id[0x%x]\n", - __func__, start.hdr.opcode, start.port_id); - - ret = afe_apr_send_pkt(&start, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE enable for port 0x%x failed %d\n", __func__, - port_id, ret); - - return ret; -} - -static int afe_aanc_start(uint16_t tx_port_id, uint16_t rx_port_id) -{ - int ret; - - pr_debug("%s: Tx port is 0x%x, Rx port is 0x%x\n", - __func__, tx_port_id, rx_port_id); - ret = afe_aanc_port_cfg(this_afe.apr, tx_port_id, rx_port_id); - if (ret) { - pr_err("%s: Send AANC Port Config failed %d\n", - __func__, ret); - goto fail_cmd; - } - send_afe_cal_type(AFE_AANC_CAL, tx_port_id); - -fail_cmd: - return ret; -} - -/** - * afe_spdif_port_start - to configure AFE session with - * specified port configuration - * - * @port_id: AFE port id number - * @spdif_port: spdif port configutation - * @rate: sampling rate of port - * - * Returns 0 on success or error value on port start failure. - */ -int afe_spdif_port_start(u16 port_id, struct afe_spdif_port_config *spdif_port, - u32 rate) -{ - struct param_hdr_v3 param_hdr; - uint16_t port_index; - int ret = 0; - - if (!spdif_port) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - return ret; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - afe_send_cal(port_id); - afe_send_hw_delay(port_id, rate); - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SPDIF_CONFIG; - param_hdr.param_size = sizeof(struct afe_spdif_port_config); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) spdif_port); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[port_index] = rate; - } else { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - - if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) { - ret = afe_send_spdif_ch_status_cfg(&spdif_port->ch_status, - port_id); - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - goto fail_cmd; - } - } - - return afe_send_cmd_port_start(port_id); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_spdif_port_start); - -/** - * afe_spdif_reg_event_cfg - - * register for event from AFE spdif port - * - * @port_id: Port ID to register event - * @reg_flag: register or unregister - * @cb: callback function to invoke for events from module - * @private_data: private data to sent back in callback fn - * - * Returns 0 on success or error on failure - */ -int afe_spdif_reg_event_cfg(u16 port_id, u16 reg_flag, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data) -{ - struct afe_port_cmd_event_cfg *config; - struct afe_port_cmd_mod_evt_cfg_payload pl; - int index; - int ret; - int num_events = 1; - int cmd_size = sizeof(struct afe_port_cmd_event_cfg) + - (num_events * sizeof(struct afe_port_cmd_mod_evt_cfg_payload)); - - config = kzalloc(cmd_size, GFP_KERNEL); - if (!config) - return -ENOMEM; - - if (port_id == AFE_PORT_ID_PRIMARY_SPDIF_TX) { - this_afe.pri_spdif_tx_cb = cb; - this_afe.pri_spdif_tx_private_data = private_data; - } else if (port_id == AFE_PORT_ID_SECONDARY_SPDIF_TX) { - this_afe.sec_spdif_tx_cb = cb; - this_afe.sec_spdif_tx_private_data = private_data; - } else { - pr_err("%s: wrong port id 0x%x\n", __func__, port_id); - ret = -EINVAL; - goto fail_idx; - } - - index = q6audio_get_port_index(port_id); - if (index < 0) { - pr_err("%s: Invalid index number: %d\n", __func__, index); - ret = -EINVAL; - goto fail_idx; - } - - memset(&pl, 0, sizeof(pl)); - pl.module_id = AFE_MODULE_CUSTOM_EVENTS; - pl.event_id = AFE_PORT_FMT_UPDATE_EVENT; - pl.reg_flag = reg_flag; - - config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - config->hdr.pkt_size = cmd_size; - config->hdr.src_port = 1; - config->hdr.dest_port = 1; - config->hdr.token = index; - - config->hdr.opcode = AFE_PORT_CMD_MOD_EVENT_CFG; - config->port_id = q6audio_get_port_id(port_id); - config->num_events = num_events; - config->version = 1; - memcpy(config->payload, &pl, sizeof(pl)); - ret = afe_apr_send_pkt((uint32_t *) config, &this_afe.wait[index]); - -fail_idx: - kfree(config); - return ret; -} -EXPORT_SYMBOL(afe_spdif_reg_event_cfg); - -int afe_send_slot_mapping_cfg( - struct afe_param_id_slot_mapping_cfg *slot_mapping_cfg, - u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!slot_mapping_cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_TDM; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_slot_mapping_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) slot_mapping_cfg); - if (ret < 0) - pr_err("%s: AFE send slot mapping for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} - -int afe_send_slot_mapping_cfg_v2( - struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_cfg, - u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!slot_mapping_cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_TDM; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_slot_mapping_cfg_v2); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) slot_mapping_cfg); - if (ret < 0) - pr_err("%s: AFE send slot mapping for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} - -int afe_send_custom_tdm_header_cfg( - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg, - u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!custom_tdm_header_cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_TDM; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CUSTOM_TDM_HEADER_CONFIG; - param_hdr.param_size = - sizeof(struct afe_param_id_custom_tdm_header_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) custom_tdm_header_cfg); - if (ret < 0) - pr_err("%s: AFE send custom tdm header for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} - -/** - * afe_tdm_port_start - to configure AFE session with - * specified port configuration - * - * @port_id: AFE port id number - * @tdm_port: TDM port configutation - * @rate: sampling rate of port - * @num_groups: number of TDM groups - * - * Returns 0 on success or error value on port start failure. - */ -int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port, - u32 rate, u16 num_groups) -{ - struct param_hdr_v3 param_hdr; - int index = 0; - uint16_t port_index = 0; - enum afe_mad_type mad_type = MAD_HW_NONE; - int ret = 0; - - if (!tdm_port) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if ((index >= 0) && (index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[index] = rate; - - if (this_afe.rt_cb) - this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id); - } - - port_index = afe_get_port_index(port_id); - - /* Also send the topology id here: */ - if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) { - /* One time call: only for first time */ - afe_send_custom_topology(); - afe_send_port_topology_id(port_id); - afe_send_cal(port_id); - afe_send_hw_delay(port_id, rate); - } - - /* Start SW MAD module */ - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - if (mad_type != MAD_HW_NONE && mad_type != MAD_SW_AUDIO) { - if (!afe_has_config(AFE_CDC_REGISTERS_CONFIG) || - !afe_has_config(AFE_SLIMBUS_SLAVE_CONFIG)) { - pr_err("%s: AFE isn't configured yet for\n" - "HW MAD try Again\n", __func__); - ret = -EAGAIN; - goto fail_cmd; - } - ret = afe_turn_onoff_hw_mad(mad_type, true); - if (ret) { - pr_err("%s: afe_turn_onoff_hw_mad failed %d\n", - __func__, ret); - goto fail_cmd; - } - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_TDM_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_tdm_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &tdm_port->tdm); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[port_index] = rate; - } else { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) - ret = afe_send_slot_mapping_cfg_v2( - &tdm_port->slot_mapping_v2, port_id); - else - ret = afe_send_slot_mapping_cfg( - &tdm_port->slot_mapping, - port_id); - - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - goto fail_cmd; - } - - if (tdm_port->custom_tdm_header.header_type) { - ret = afe_send_custom_tdm_header_cfg( - &tdm_port->custom_tdm_header, port_id); - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - goto fail_cmd; - } - } - - ret = afe_send_cmd_port_start(port_id); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_tdm_port_start); - -/** - * afe_set_cal_mode - - * set cal mode for AFE calibration - * - * @port_id: AFE port id number - * @afe_cal_mode: AFE calib mode - * - */ -void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode) -{ - uint16_t port_index; - - port_index = afe_get_port_index(port_id); - this_afe.afe_cal_mode[port_index] = afe_cal_mode; -} -EXPORT_SYMBOL(afe_set_cal_mode); - -/** - * afe_set_vad_cfg - - * set configuration for VAD - * - * @port_id: AFE port id number - * @vad_enable: enable/disable vad - * @preroll_config: Preroll configuration - * - */ -void afe_set_vad_cfg(u32 vad_enable, u32 preroll_config, - u32 port_id) -{ - uint16_t port_index; - - port_index = afe_get_port_index(port_id); - this_afe.vad_cfg[port_index].is_enable = vad_enable; - this_afe.vad_cfg[port_index].pre_roll = preroll_config; -} -EXPORT_SYMBOL(afe_set_vad_cfg); - -/** - * afe_get_island_mode_cfg - - * get island mode configuration - * - * @port_id: AFE port id number - * @enable_flag: Enable or Disable - * - */ -void afe_get_island_mode_cfg(u16 port_id, u32 *enable_flag) -{ - uint16_t port_index; - - if (enable_flag) { - port_index = afe_get_port_index(port_id); - *enable_flag = this_afe.island_mode[port_index]; - } -} -EXPORT_SYMBOL(afe_get_island_mode_cfg); - -/** - * afe_set_island_mode_cfg - - * set island mode configuration - * - * @port_id: AFE port id number - * @enable_flag: Enable or Disable - * - */ -void afe_set_island_mode_cfg(u16 port_id, u32 enable_flag) -{ - uint16_t port_index; - - port_index = afe_get_port_index(port_id); - this_afe.island_mode[port_index] = enable_flag; - - trace_printk("%s: set island mode cfg 0x%x for port 0x%x\n", - __func__, this_afe.island_mode[port_index], port_id); -} -EXPORT_SYMBOL(afe_set_island_mode_cfg); - -/** - * afe_set_routing_callback - - * Update callback function for routing - * - * @cb: callback function to update with - * - */ -void afe_set_routing_callback(routing_cb cb) -{ - this_afe.rt_cb = cb; -} -EXPORT_SYMBOL(afe_set_routing_callback); - -int afe_port_send_usb_dev_param(u16 port_id, union afe_port_config *afe_config) -{ - struct afe_param_id_usb_audio_dev_params usb_dev; - struct afe_param_id_usb_audio_dev_lpcm_fmt lpcm_fmt; - struct afe_param_id_usb_audio_svc_interval svc_int; - struct param_hdr_v3 param_hdr; - int ret = 0, index = 0; - - if (!afe_config) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - goto exit; - } - - index = q6audio_get_port_index(port_id); - - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - memset(&usb_dev, 0, sizeof(usb_dev)); - memset(&lpcm_fmt, 0, sizeof(lpcm_fmt)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - - param_hdr.param_id = AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS; - param_hdr.param_size = sizeof(usb_dev); - usb_dev.cfg_minor_version = AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - usb_dev.dev_token = afe_config->usb_audio.dev_token; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &usb_dev); - if (ret) { - pr_err("%s: AFE device param cmd failed %d\n", - __func__, ret); - goto exit; - } - - param_hdr.param_id = AFE_PARAM_ID_USB_AUDIO_DEV_LPCM_FMT; - param_hdr.param_size = sizeof(lpcm_fmt); - lpcm_fmt.cfg_minor_version = AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - lpcm_fmt.endian = afe_config->usb_audio.endian; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &lpcm_fmt); - if (ret) { - pr_err("%s: AFE device param cmd LPCM_FMT failed %d\n", - __func__, ret); - goto exit; - } - param_hdr.param_id = AFE_PARAM_ID_USB_AUDIO_SVC_INTERVAL; - param_hdr.param_size = sizeof(svc_int); - svc_int.cfg_minor_version = - AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - svc_int.svc_interval = afe_config->usb_audio.service_interval; - - pr_debug("%s: AFE device param cmd sending SVC_INTERVAL %d\n", - __func__, svc_int.svc_interval); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &svc_int); - - if (ret) { - pr_err("%s: AFE device param cmd svc_interval failed %d\n", - __func__, ret); - ret = -EINVAL; - goto exit; - } -exit: - return ret; -} - -static int q6afe_send_dec_config(u16 port_id, - union afe_port_config afe_config, - struct afe_dec_config *cfg, - u32 format, - u16 afe_in_channels, u16 afe_in_bit_width) -{ - struct afe_dec_media_fmt_t dec_media_fmt; - struct avs_dec_depacketizer_id_param_t dec_depkt_id_param; - struct avs_dec_congestion_buffer_param_t dec_buffer_id_param; - struct afe_enc_dec_imc_info_param_t imc_info_param; - struct afe_port_media_type_t media_type; - struct afe_matched_port_t matched_port_param; - struct asm_aptx_ad_speech_mode_cfg_t speech_codec_init_param; - struct param_hdr_v3 param_hdr; - int ret; - u32 dec_fmt; - - memset(&dec_depkt_id_param, 0, sizeof(dec_depkt_id_param)); - memset(&dec_media_fmt, 0, sizeof(dec_media_fmt)); - memset(&imc_info_param, 0, sizeof(imc_info_param)); - memset(&media_type, 0, sizeof(media_type)); - memset(&matched_port_param, 0, sizeof(matched_port_param)); - memset(&speech_codec_init_param, 0, sizeof(speech_codec_init_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_ID_DECODER; - param_hdr.instance_id = INSTANCE_ID_0; - - pr_debug("%s: sending AFE_DECODER_PARAM_ID_DEPACKETIZER to DSP payload\n", - __func__); - param_hdr.param_id = AFE_DECODER_PARAM_ID_DEPACKETIZER_ID; - param_hdr.param_size = sizeof(struct avs_dec_depacketizer_id_param_t); - dec_depkt_id_param.dec_depacketizer_id = - AFE_MODULE_ID_DEPACKETIZER_COP_V1; - if (cfg->format == ENC_CODEC_TYPE_LDAC) - dec_depkt_id_param.dec_depacketizer_id = - AFE_MODULE_ID_DEPACKETIZER_COP; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &dec_depkt_id_param); - if (ret) { - pr_err("%s: AFE_DECODER_PARAM_ID_DEPACKETIZER for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - switch (cfg->format) { - case ASM_MEDIA_FMT_SBC: - case ASM_MEDIA_FMT_AAC_V2: - case ASM_MEDIA_FMT_MP3: - if (port_id == SLIMBUS_9_TX) { - dec_buffer_id_param.max_nr_buffers = 200; - dec_buffer_id_param.pre_buffer_size = 200; - } else { - dec_buffer_id_param.max_nr_buffers = 0; - dec_buffer_id_param.pre_buffer_size = 0; - } - pr_debug("%s: sending AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE to DSP payload\n", - __func__); - param_hdr.param_id = - AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE; - param_hdr.param_size = - sizeof(struct avs_dec_congestion_buffer_param_t); - dec_buffer_id_param.version = 0; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &dec_buffer_id_param); - if (ret) { - pr_err("%s: AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - case ASM_MEDIA_FMT_APTX_ADAPTIVE: - if (!cfg->abr_dec_cfg.is_abr_enabled) { - pr_debug("%s: sending aptx adaptive congestion buffer size to dsp\n", - __func__); - param_hdr.param_id = - AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE; - param_hdr.param_size = - sizeof(struct avs_dec_congestion_buffer_param_t); - dec_buffer_id_param.version = 0; - dec_buffer_id_param.max_nr_buffers = 226; - dec_buffer_id_param.pre_buffer_size = 226; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &dec_buffer_id_param); - if (ret) { - pr_err("%s: aptx adaptive congestion buffer size for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - } - /* fall through for abr enabled case */ - default: - pr_debug("%s:sending AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION to DSP payload\n", - __func__); - param_hdr.param_id = - AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION; - param_hdr.param_size = - sizeof(struct afe_enc_dec_imc_info_param_t); - imc_info_param.imc_info = cfg->abr_dec_cfg.imc_info; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &imc_info_param); - if (ret) { - pr_err("%s: AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - } - - pr_debug("%s: Send AFE_API_VERSION_PORT_MEDIA_TYPE to DSP\n", __func__); - param_hdr.module_id = AFE_MODULE_PORT; - param_hdr.param_id = AFE_PARAM_ID_PORT_MEDIA_TYPE; - param_hdr.param_size = sizeof(struct afe_port_media_type_t); - media_type.minor_version = AFE_API_VERSION_PORT_MEDIA_TYPE; - switch (cfg->format) { - case ASM_MEDIA_FMT_AAC_V2: - media_type.sample_rate = - cfg->data.aac_config.sample_rate; - break; - case ASM_MEDIA_FMT_SBC: - media_type.sample_rate = - cfg->data.sbc_config.sample_rate; - break; - case ASM_MEDIA_FMT_APTX_ADAPTIVE: - if (!cfg->abr_dec_cfg.is_abr_enabled) { - media_type.sample_rate = - (cfg->data.aptx_ad_config.sample_rate == APTX_AD_44_1) ? - AFE_PORT_SAMPLE_RATE_44_1K : - AFE_PORT_SAMPLE_RATE_48K; - break; - } - /* fall through for abr enabled case */ - case ASM_MEDIA_FMT_APTX_AD_SPEECH: - media_type.sample_rate = AFE_PORT_SAMPLE_RATE_32K; - break; - default: - media_type.sample_rate = - afe_config.slim_sch.sample_rate; - } - if (afe_in_bit_width) - media_type.bit_width = afe_in_bit_width; - else - media_type.bit_width = afe_config.slim_sch.bit_width; - - if (afe_in_channels) - media_type.num_channels = afe_in_channels; - else - media_type.num_channels = afe_config.slim_sch.num_channels; - media_type.data_format = AFE_PORT_DATA_FORMAT_PCM; - media_type.reserved = 0; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &media_type); - if (ret) { - pr_err("%s: AFE_API_VERSION_PORT_MEDIA_TYPE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2 && - format != ASM_MEDIA_FMT_APTX_ADAPTIVE && - format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { - pr_debug("%s:Unsuppported dec format. Ignore AFE config %u\n", - __func__, format); - goto exit; - } - - if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE && - cfg->abr_dec_cfg.is_abr_enabled) { - pr_debug("%s: Ignore AFE config for abr case\n", __func__); - goto exit; - } - if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { - pr_debug("%s: sending AFE_PARAM_ID_RATE_MATCHED_PORT to DSP payload\n", - __func__); - param_hdr.param_id = AFE_PARAM_ID_RATE_MATCHED_PORT; - param_hdr.param_size = - sizeof(struct afe_matched_port_t); - matched_port_param.minor_version = AFE_API_VERSION_PORT_MEDIA_TYPE; - matched_port_param.enable = AFE_MATCHED_PORT_ENABLE; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &matched_port_param); - if (ret) { - pr_err("%s: AFE_PARAM_ID_RATE_MATCHED_PORT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - - pr_debug("%s: sending AFE_DECODER_PARAM_ID_DEC_MEDIA_FMT to DSP payload\n", - __func__); - param_hdr.module_id = AFE_MODULE_ID_DECODER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_DECODER_PARAM_ID_DEC_FMT_ID; - param_hdr.param_size = sizeof(dec_fmt); - dec_fmt = format; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &dec_fmt); - if (ret) { - pr_err("%s: AFE_DECODER_PARAM_ID_DEC_MEDIA_FMT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - switch (cfg->format) { - case ASM_MEDIA_FMT_AAC_V2: - case ASM_MEDIA_FMT_APTX_ADAPTIVE: - param_hdr.param_size = sizeof(struct afe_dec_media_fmt_t); - - pr_debug("%s:send AVS_DECODER_PARAM_ID DEC_MEDIA_FMT to DSP payload\n", - __func__); - param_hdr.param_id = AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT; - dec_media_fmt.dec_media_config = cfg->data; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &dec_media_fmt); - if (ret) { - pr_err("%s: AVS_DECODER_PARAM_ID DEC_MEDIA_FMT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - case ASM_MEDIA_FMT_APTX_AD_SPEECH: - param_hdr.param_size = - sizeof(struct asm_aptx_ad_speech_dec_cfg_t); - - pr_debug("%s: send AVS_DECODER_PARAM_ID_APTX_AD_SPEECH_DEC_INIT to DSP payload\n", - __func__); - param_hdr.param_id = - AVS_DECODER_PARAM_ID_APTX_AD_SPEECH_DEC_INIT; - speech_codec_init_param = - cfg->data.aptx_ad_speech_config.speech_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &speech_codec_init_param); - if (ret) { - pr_err("%s: AVS_DECODER_PARAM_ID_APTX_ADAPTIVE_SPEECH_DEC_INIT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - default: - pr_debug("%s:No need to send DEC_MEDIA_FMT to DSP payload\n", - __func__); - } - -exit: - return ret; -} - -static int q6afe_send_enc_config(u16 port_id, - union afe_enc_config_data *cfg, u32 format, - union afe_port_config afe_config, - u16 afe_in_channels, u16 afe_in_bit_width, - u32 scrambler_mode, u32 mono_mode) -{ - u32 enc_fmt; - struct afe_enc_cfg_blk_param_t enc_blk_param; - struct afe_param_id_aptx_sync_mode sync_mode_param; - struct afe_id_aptx_adaptive_enc_init aptx_adaptive_enc_init; - struct avs_enc_packetizer_id_param_t enc_pkt_id_param; - struct avs_enc_set_scrambler_param_t enc_set_scrambler_param; - struct afe_enc_level_to_bitrate_map_param_t map_param; - struct afe_enc_dec_imc_info_param_t imc_info_param; - struct asm_aac_frame_size_control_t frame_ctl_param; - struct afe_port_media_type_t media_type; - struct aptx_channel_mode_param_t channel_mode_param; - struct afe_matched_port_t matched_port_param; - struct asm_aptx_ad_speech_mode_cfg_t speech_codec_init_param; - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s:update DSP for enc format = %d\n", __func__, format); - - memset(&enc_blk_param, 0, sizeof(enc_blk_param)); - memset(&sync_mode_param, 0, sizeof(sync_mode_param)); - memset(&aptx_adaptive_enc_init, 0, sizeof(aptx_adaptive_enc_init)); - memset(&enc_pkt_id_param, 0, sizeof(enc_pkt_id_param)); - memset(&enc_set_scrambler_param, 0, sizeof(enc_set_scrambler_param)); - memset(&map_param, 0, sizeof(map_param)); - memset(&imc_info_param, 0, sizeof(imc_info_param)); - memset(&frame_ctl_param, 0, sizeof(frame_ctl_param)); - memset(&media_type, 0, sizeof(media_type)); - memset(&matched_port_param, 0, sizeof(matched_port_param)); - memset(&speech_codec_init_param, 0, sizeof(speech_codec_init_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2 && - format != ASM_MEDIA_FMT_APTX && format != ASM_MEDIA_FMT_APTX_HD && - format != ASM_MEDIA_FMT_CELT && format != ASM_MEDIA_FMT_LDAC && - format != ASM_MEDIA_FMT_APTX_ADAPTIVE && - format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { - pr_err("%s:Unsuppported enc format. Ignore AFE config\n", - __func__); - return 0; - } - - param_hdr.module_id = AFE_MODULE_ID_ENCODER; - param_hdr.instance_id = INSTANCE_ID_0; - - param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENC_FMT_ID; - param_hdr.param_size = sizeof(enc_fmt); - enc_fmt = format; - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_ENC_FMT_ID payload\n", - __func__); - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &enc_fmt); - if (ret) { - pr_err("%s:unable to send AFE_ENCODER_PARAM_ID_ENC_FMT_ID", - __func__); - goto exit; - } - - if (format == ASM_MEDIA_FMT_LDAC) { - param_hdr.param_size = sizeof(struct afe_enc_cfg_blk_param_t) - - sizeof(struct afe_abr_enc_cfg_t); - enc_blk_param.enc_cfg_blk_size = - sizeof(union afe_enc_config_data) - - sizeof(struct afe_abr_enc_cfg_t); - } else if (format == ASM_MEDIA_FMT_AAC_V2) { - param_hdr.param_size = sizeof(enc_blk_param) - - sizeof(struct asm_aac_frame_size_control_t); - enc_blk_param.enc_cfg_blk_size = - sizeof(enc_blk_param.enc_blk_config) - - sizeof(struct asm_aac_frame_size_control_t); - } else if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { - param_hdr.param_size = sizeof(struct afe_enc_aptx_ad_speech_cfg_blk_param_t); - enc_blk_param.enc_cfg_blk_size = sizeof(struct asm_custom_enc_cfg_t); - } else { - param_hdr.param_size = sizeof(struct afe_enc_cfg_blk_param_t); - enc_blk_param.enc_cfg_blk_size = - sizeof(union afe_enc_config_data); - } - pr_debug("%s:send AFE_ENCODER_PARAM_ID_ENC_CFG_BLK to DSP payload\n", - __func__); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENC_CFG_BLK; - enc_blk_param.enc_blk_config = *cfg; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_blk_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_ENC_CFG_BLK for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - if (format == ASM_MEDIA_FMT_AAC_V2) { - uint32_t frame_size_ctl_value = enc_blk_param.enc_blk_config. - aac_config.frame_ctl.ctl_value; - if (frame_size_ctl_value > 0) { - param_hdr.param_id = - AFE_PARAM_ID_AAC_FRM_SIZE_CONTROL; - param_hdr.param_size = sizeof(frame_ctl_param); - frame_ctl_param.ctl_type = enc_blk_param. - enc_blk_config.aac_config.frame_ctl.ctl_type; - frame_ctl_param.ctl_value = frame_size_ctl_value; - pr_debug("%s: send AFE_PARAM_ID_AAC_FRM_SIZE_CONTROL\n", - __func__); - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &frame_ctl_param); - if (ret) { - pr_err("%s: AAC_FRM_SIZE_CONTROL failed %d\n", - __func__, ret); - goto exit; - } - } - } - - if (format == ASM_MEDIA_FMT_APTX) { - pr_debug("%s: sending AFE_PARAM_ID_APTX_SYNC_MODE to DSP", - __func__); - param_hdr.param_id = AFE_PARAM_ID_APTX_SYNC_MODE; - param_hdr.param_size = - sizeof(struct afe_param_id_aptx_sync_mode); - sync_mode_param.sync_mode = - enc_blk_param.enc_blk_config.aptx_config. - aptx_v2_cfg.sync_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &sync_mode_param); - if (ret) { - pr_err("%s: AFE_PARAM_ID_APTX_SYNC_MODE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE) { - pr_debug("%s: sending AFE_ID_APTX_ADAPTIVE_ENC_INIT to DSP\n", - __func__); - param_hdr.param_id = AFE_ID_APTX_ADAPTIVE_ENC_INIT; - param_hdr.param_size = - sizeof(struct afe_id_aptx_adaptive_enc_init); - aptx_adaptive_enc_init = - enc_blk_param.enc_blk_config.aptx_ad_config. - aptx_ad_cfg; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &aptx_adaptive_enc_init); - if (ret) { - pr_err("%s: AFE_ID_APTX_ADAPTIVE_ENC_INIT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { - pr_debug("%s: sending AVS_DECODER_PARAM_ID_APTX_AD_SPEECH_ENC_INIT to DSP\n", - __func__); - param_hdr.param_id = AVS_DECODER_PARAM_ID_APTX_AD_SPEECH_ENC_INIT; - param_hdr.param_size = - sizeof(struct asm_aptx_ad_speech_dec_cfg_t); - speech_codec_init_param = cfg->aptx_ad_speech_config.speech_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &speech_codec_init_param); - if (ret) { - pr_err("%s: AFE_ID_APTX_ADAPTIVE_ENC_INIT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_PACKETIZER to DSP\n", - __func__); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_PACKETIZER_ID; - param_hdr.param_size = sizeof(struct avs_enc_packetizer_id_param_t); - enc_pkt_id_param.enc_packetizer_id = AFE_MODULE_ID_PACKETIZER_COP; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_pkt_id_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_PACKETIZER for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - if (format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING mode= %d to DSP payload\n", - __func__, scrambler_mode); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING; - param_hdr.param_size = sizeof(struct avs_enc_set_scrambler_param_t); - enc_set_scrambler_param.enable_scrambler = scrambler_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_set_scrambler_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - - if (format == ASM_MEDIA_FMT_APTX) { - pr_debug("%s:sending CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO mode= %d to DSP payload\n", - __func__, mono_mode); - param_hdr.param_id = CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO; - param_hdr.param_size = sizeof(channel_mode_param); - channel_mode_param.channel_mode = mono_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &channel_mode_param); - - if (ret) { - pr_err("%s: CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO for port 0x%x failed %d\n", - __func__, port_id, ret); - } - } - - if ((format == ASM_MEDIA_FMT_LDAC && - cfg->ldac_config.abr_config.is_abr_enabled) || - format == ASM_MEDIA_FMT_APTX_ADAPTIVE || - format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { - if (format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP to DSP payload", - __func__); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP; - param_hdr.param_size = - sizeof(struct afe_enc_level_to_bitrate_map_param_t); - map_param.mapping_table = - cfg->ldac_config.abr_config.mapping_info; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &map_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - - pr_debug("%s: sending AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION to DSP payload", - __func__); - param_hdr.param_id = - AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION; - param_hdr.param_size = - sizeof(struct afe_enc_dec_imc_info_param_t); - if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE) - imc_info_param.imc_info = - cfg->aptx_ad_config.abr_cfg.imc_info; - else if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) - imc_info_param.imc_info = - cfg->aptx_ad_speech_config.imc_info; - else - imc_info_param.imc_info = - cfg->ldac_config.abr_config.imc_info; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &imc_info_param); - if (ret) { - pr_err("%s: AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - - pr_debug("%s:Sending AFE_API_VERSION_PORT_MEDIA_TYPE to DSP", __func__); - param_hdr.module_id = AFE_MODULE_PORT; - param_hdr.param_id = AFE_PARAM_ID_PORT_MEDIA_TYPE; - param_hdr.param_size = sizeof(struct afe_port_media_type_t); - media_type.minor_version = AFE_API_VERSION_PORT_MEDIA_TYPE; - if (format == ASM_MEDIA_FMT_LDAC) - media_type.sample_rate = - cfg->ldac_config.custom_config.sample_rate; - else if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE) - media_type.sample_rate = - cfg->aptx_ad_config.custom_cfg.sample_rate; - else if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) - media_type.sample_rate = - cfg->aptx_ad_speech_config.custom_cfg.sample_rate; - else - media_type.sample_rate = - afe_config.slim_sch.sample_rate; - - if (afe_in_bit_width) - media_type.bit_width = afe_in_bit_width; - else - media_type.bit_width = afe_config.slim_sch.bit_width; - - if (afe_in_channels) - media_type.num_channels = afe_in_channels; - else - media_type.num_channels = afe_config.slim_sch.num_channels; - media_type.data_format = AFE_PORT_DATA_FORMAT_PCM; - media_type.reserved = 0; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &media_type); - if (ret) { - pr_err("%s: AFE_API_VERSION_PORT_MEDIA_TYPE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { - pr_debug("%s: sending AFE_PARAM_ID_RATE_MATCHED_PORT to DSP payload", - __func__); - param_hdr.param_id = AFE_PARAM_ID_RATE_MATCHED_PORT; - param_hdr.param_size = - sizeof(struct afe_matched_port_t); - matched_port_param.minor_version = AFE_API_VERSION_PORT_MEDIA_TYPE; - matched_port_param.enable = AFE_MATCHED_PORT_ENABLE; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &matched_port_param); - if (ret) { - pr_err("%s: AFE_PARAM_ID_RATE_MATCHED_PORT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - -exit: - return ret; -} - -int afe_set_tws_channel_mode(u32 format, u16 port_id, u32 channel_mode) -{ - struct aptx_channel_mode_param_t channel_mode_param; - struct param_hdr_v3 param_info; - int ret = 0; - u32 param_id = 0; - - if (format == ASM_MEDIA_FMT_APTX) { - param_id = CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO; - } else if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE) { - param_id = CAPI_V2_PARAM_ID_APTX_AD_ENC_SWITCH_TO_MONO; - } else { - pr_err("%s: Not supported format 0x%x\n", __func__, format); - return -EINVAL; - } - - memset(¶m_info, 0, sizeof(param_info)); - memset(&channel_mode_param, 0, sizeof(channel_mode_param)); - - param_info.module_id = AFE_MODULE_ID_ENCODER; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = param_id; - param_info.param_size = sizeof(channel_mode_param); - - channel_mode_param.channel_mode = channel_mode; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, - (u8 *) &channel_mode_param); - if (ret) - pr_err("%s: AFE set channel mode cfg for port 0x%x failed %d\n", - __func__, port_id, ret); - - return ret; -} -EXPORT_SYMBOL(afe_set_tws_channel_mode); - -static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, - u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, - union afe_enc_config_data *enc_cfg, - u32 codec_format, u32 scrambler_mode, u32 mono_mode, - struct afe_dec_config *dec_cfg) -{ - union afe_port_config port_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - int cfg_type; - int index = 0; - enum afe_mad_type mad_type; - uint16_t port_index; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&port_cfg, 0, sizeof(port_cfg)); - - if (!afe_config) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - return ret; - } - - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { - pr_debug("%s: before incrementing pcm_afe_instance %d port_id 0x%x\n", - __func__, - pcm_afe_instance[port_id & 0x1], port_id); - port_id = VIRTUAL_ID_TO_PORTID(port_id); - pcm_afe_instance[port_id & 0x1]++; - return 0; - } - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - pr_debug("%s: before incrementing proxy_afe_instance %d port_id 0x%x\n", - __func__, - proxy_afe_instance[port_id & 0x1], port_id); - - if (!afe_close_done[port_id & 0x1]) { - /*close pcm dai corresponding to the proxy dai*/ - afe_close(port_id - 0x10); - pcm_afe_instance[port_id & 0x1]++; - pr_debug("%s: reconfigure afe port again\n", __func__); - } - proxy_afe_instance[port_id & 0x1]++; - afe_close_done[port_id & 0x1] = false; - port_id = VIRTUAL_ID_TO_PORTID(port_id); - } - - pr_info("%s: port id: 0x%x\n", __func__, port_id); - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if ((index >= 0) && (index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[index] = rate; - - if (this_afe.rt_cb) - this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id); - } - - mutex_lock(&this_afe.afe_cmd_lock); - port_index = afe_get_port_index(port_id); - - /* Also send the topology id here: */ - if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) { - /* One time call: only for first time */ - afe_send_custom_topology(); - afe_send_port_topology_id(port_id); - afe_send_cal(port_id); - afe_send_hw_delay(port_id, rate); - } - - /* Start SW MAD module */ - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - if (mad_type != MAD_HW_NONE && mad_type != MAD_SW_AUDIO) { - if (!afe_has_config(AFE_CDC_REGISTERS_CONFIG) || - !afe_has_config(AFE_SLIMBUS_SLAVE_CONFIG)) { - pr_err("%s: AFE isn't configured yet for\n" - "HW MAD try Again\n", __func__); - ret = -EAGAIN; - goto fail_cmd; - } - ret = afe_turn_onoff_hw_mad(mad_type, true); - if (ret) { - pr_err("%s: afe_turn_onoff_hw_mad failed %d\n", - __func__, ret); - goto fail_cmd; - } - } - - if ((this_afe.aanc_info.aanc_active) && - (this_afe.aanc_info.aanc_tx_port == port_id)) { - this_afe.aanc_info.aanc_tx_port_sample_rate = rate; - port_index = - afe_get_port_index(this_afe.aanc_info.aanc_rx_port); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.aanc_info.aanc_rx_port_sample_rate = - this_afe.afe_sample_rates[port_index]; - } else { - pr_err("%s: Invalid port index %d\n", - __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - ret = afe_aanc_start(this_afe.aanc_info.aanc_tx_port, - this_afe.aanc_info.aanc_rx_port); - pr_debug("%s: afe_aanc_start ret %d\n", __func__, ret); - } - - if ((port_id == AFE_PORT_ID_USB_RX) || - (port_id == AFE_PORT_ID_USB_TX)) { - ret = afe_port_send_usb_dev_param(port_id, afe_config); - if (ret) { - pr_err("%s: AFE device param for port 0x%x failed %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - } - - switch (port_id) { - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - cfg_type = AFE_PARAM_ID_PCM_CONFIG; - break; - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SENARY_MI2S_RX: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_TX: - cfg_type = AFE_PARAM_ID_I2S_CONFIG; - break; - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - cfg_type = AFE_PARAM_ID_META_I2S_CONFIG; - break; - case HDMI_RX: - case DISPLAY_PORT_RX: - cfg_type = AFE_PARAM_ID_HDMI_CONFIG; - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - cfg_type = AFE_PARAM_ID_PSEUDO_PORT_CONFIG; - break; - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_5_TX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG; - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - cfg_type = AFE_PARAM_ID_USB_AUDIO_CONFIG; - break; - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - cfg_type = AFE_PARAM_ID_RT_PROXY_CONFIG; - break; - case INT_BT_SCO_RX: - case INT_BT_A2DP_RX: - case INT_BT_SCO_TX: - case INT_FM_RX: - case INT_FM_TX: - cfg_type = AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG; - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - cfg_type = AFE_PARAM_ID_CODEC_DMA_CONFIG; - break; - default: - pr_err("%s: Invalid port id 0x%x\n", __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = cfg_type; - param_hdr.param_size = sizeof(union afe_port_config); - - port_cfg = *afe_config; - if (((enc_cfg != NULL) || (dec_cfg != NULL)) && - (codec_format != ASM_MEDIA_FMT_NONE) && - (cfg_type == AFE_PARAM_ID_SLIMBUS_CONFIG)) { - port_cfg.slim_sch.data_format = - AFE_SB_DATA_FORMAT_GENERIC_COMPRESSED; - } - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &port_cfg); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - - if ((codec_format != ASM_MEDIA_FMT_NONE) && - (cfg_type == AFE_PARAM_ID_SLIMBUS_CONFIG)) { - if (enc_cfg != NULL) { - pr_debug("%s: Found AFE encoder support for SLIMBUS format = %d\n", - __func__, codec_format); - ret = q6afe_send_enc_config(port_id, enc_cfg, - codec_format, *afe_config, - afe_in_channels, - afe_in_bit_width, - scrambler_mode, mono_mode); - if (ret) { - pr_err("%s: AFE encoder config for port 0x%x failed %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - } - if (dec_cfg != NULL) { - pr_debug("%s: Found AFE decoder support for SLIMBUS format = %d\n", - __func__, codec_format); - ret = q6afe_send_dec_config(port_id, *afe_config, - dec_cfg, codec_format, - afe_in_channels, - afe_in_bit_width); - if (ret) { - pr_err("%s: AFE decoder config for port 0x%x failed %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - } - } - - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - /* - * If afe_port_start() for tx port called before - * rx port, then aanc rx sample rate is zero. So, - * AANC state machine in AFE will not get triggered. - * Make sure to check whether aanc is active during - * afe_port_start() for rx port and if aanc rx - * sample rate is zero, call afe_aanc_start to configure - * aanc with valid sample rates. - */ - if (this_afe.aanc_info.aanc_active && - !this_afe.aanc_info.aanc_rx_port_sample_rate) { - this_afe.aanc_info.aanc_rx_port_sample_rate = - this_afe.afe_sample_rates[port_index]; - ret = afe_aanc_start(this_afe.aanc_info.aanc_tx_port, - this_afe.aanc_info.aanc_rx_port); - pr_debug("%s: afe_aanc_start ret %d\n", __func__, ret); - } - } else { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - ret = afe_send_cmd_port_start(port_id); - -fail_cmd: - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} - -/** - * afe_port_start - to configure AFE session with - * specified port configuration - * - * @port_id: AFE port id number - * @afe_config: port configutation - * @rate: sampling rate of port - * - * Returns 0 on success or error value on port start failure. - */ -int afe_port_start(u16 port_id, union afe_port_config *afe_config, - u32 rate) -{ - return __afe_port_start(port_id, afe_config, rate, - 0, 0, NULL, ASM_MEDIA_FMT_NONE, 0, 0, NULL); -} -EXPORT_SYMBOL(afe_port_start); - -/** - * afe_port_start_v2 - to configure AFE session with - * specified port configuration and encoder /decoder params - * - * @port_id: AFE port id number - * @afe_config: port configutation - * @rate: sampling rate of port - * @enc_cfg: AFE enc configuration information to setup encoder - * @afe_in_channels: AFE input channel configuration, this needs - * update only if input channel is differ from AFE output - * @dec_cfg: AFE dec configuration information to set up decoder - * - * Returns 0 on success or error value on port start failure. - */ -int afe_port_start_v2(u16 port_id, union afe_port_config *afe_config, - u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, - struct afe_enc_config *enc_cfg, - struct afe_dec_config *dec_cfg) -{ - int ret = 0; - - if (enc_cfg != NULL) - ret = __afe_port_start(port_id, afe_config, rate, - afe_in_channels, afe_in_bit_width, - &enc_cfg->data, enc_cfg->format, - enc_cfg->scrambler_mode, - enc_cfg->mono_mode, dec_cfg); - else if (dec_cfg != NULL) - ret = __afe_port_start(port_id, afe_config, rate, - afe_in_channels, afe_in_bit_width, - NULL, dec_cfg->format, 0, 0, dec_cfg); - - return ret; -} -EXPORT_SYMBOL(afe_port_start_v2); - -int afe_get_port_index(u16 port_id) -{ - switch (port_id) { - case PRIMARY_I2S_RX: return IDX_PRIMARY_I2S_RX; - case PRIMARY_I2S_TX: return IDX_PRIMARY_I2S_TX; - case AFE_PORT_ID_PRIMARY_PCM_RX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_RX; - case AFE_PORT_ID_PRIMARY_PCM_TX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_TX; - case AFE_PORT_ID_SECONDARY_PCM_RX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_RX; - case AFE_PORT_ID_SECONDARY_PCM_TX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_TX; - case AFE_PORT_ID_TERTIARY_PCM_RX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_RX; - case AFE_PORT_ID_TERTIARY_PCM_TX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_TX; - case AFE_PORT_ID_QUATERNARY_PCM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_RX; - case AFE_PORT_ID_QUATERNARY_PCM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_TX; - case AFE_PORT_ID_QUINARY_PCM_RX: - return IDX_AFE_PORT_ID_QUINARY_PCM_RX; - case AFE_PORT_ID_QUINARY_PCM_TX: - return IDX_AFE_PORT_ID_QUINARY_PCM_TX; - case AFE_PORT_ID_SENARY_PCM_RX: - return IDX_AFE_PORT_ID_SENARY_PCM_RX; - case AFE_PORT_ID_SENARY_PCM_TX: - return IDX_AFE_PORT_ID_SENARY_PCM_TX; - case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX; - case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX; - case MI2S_RX: return IDX_MI2S_RX; - case MI2S_TX: return IDX_MI2S_TX; - case HDMI_RX: return IDX_HDMI_RX; - case DISPLAY_PORT_RX: return IDX_DISPLAY_PORT_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: return IDX_PRIMARY_SPDIF_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: return IDX_PRIMARY_SPDIF_TX; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: return IDX_SECONDARY_SPDIF_RX; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: return IDX_SECONDARY_SPDIF_TX; - case RSVD_2: return IDX_RSVD_2; - case RSVD_3: return IDX_RSVD_3; - case DIGI_MIC_TX: return IDX_DIGI_MIC_TX; - case VOICE_RECORD_RX: return IDX_VOICE_RECORD_RX; - case VOICE_RECORD_TX: return IDX_VOICE_RECORD_TX; - case VOICE_PLAYBACK_TX: return IDX_VOICE_PLAYBACK_TX; - case VOICE2_PLAYBACK_TX: return IDX_VOICE2_PLAYBACK_TX; - case SLIMBUS_0_RX: return IDX_SLIMBUS_0_RX; - case SLIMBUS_0_TX: return IDX_SLIMBUS_0_TX; - case SLIMBUS_1_RX: return IDX_SLIMBUS_1_RX; - case SLIMBUS_1_TX: return IDX_SLIMBUS_1_TX; - case SLIMBUS_2_RX: return IDX_SLIMBUS_2_RX; - case SLIMBUS_2_TX: return IDX_SLIMBUS_2_TX; - case SLIMBUS_3_RX: return IDX_SLIMBUS_3_RX; - case SLIMBUS_3_TX: return IDX_SLIMBUS_3_TX; - case INT_BT_SCO_RX: return IDX_INT_BT_SCO_RX; - case INT_BT_SCO_TX: return IDX_INT_BT_SCO_TX; - case INT_BT_A2DP_RX: return IDX_INT_BT_A2DP_RX; - case INT_FM_RX: return IDX_INT_FM_RX; - case INT_FM_TX: return IDX_INT_FM_TX; - case RT_PROXY_PORT_001_RX: return IDX_RT_PROXY_PORT_001_RX; - case RT_PROXY_PORT_001_TX: return IDX_RT_PROXY_PORT_001_TX; - case SLIMBUS_4_RX: return IDX_SLIMBUS_4_RX; - case SLIMBUS_4_TX: return IDX_SLIMBUS_4_TX; - case SLIMBUS_5_RX: return IDX_SLIMBUS_5_RX; - case SLIMBUS_5_TX: return IDX_SLIMBUS_5_TX; - case SLIMBUS_6_RX: return IDX_SLIMBUS_6_RX; - case SLIMBUS_6_TX: return IDX_SLIMBUS_6_TX; - case SLIMBUS_7_RX: return IDX_SLIMBUS_7_RX; - case SLIMBUS_7_TX: return IDX_SLIMBUS_7_TX; - case SLIMBUS_8_RX: return IDX_SLIMBUS_8_RX; - case SLIMBUS_8_TX: return IDX_SLIMBUS_8_TX; - case SLIMBUS_9_RX: return IDX_SLIMBUS_9_RX; - case SLIMBUS_9_TX: return IDX_SLIMBUS_9_TX; - case AFE_PORT_ID_USB_RX: return IDX_AFE_PORT_ID_USB_RX; - case AFE_PORT_ID_USB_TX: return IDX_AFE_PORT_ID_USB_TX; - case AFE_PORT_ID_PRIMARY_MI2S_RX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_RX; - case AFE_PORT_ID_PRIMARY_MI2S_TX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_TX; - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX; - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_TX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX; - case AFE_PORT_ID_TERTIARY_MI2S_RX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX; - case AFE_PORT_ID_TERTIARY_MI2S_TX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - case AFE_PORT_ID_QUINARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_RX; - case AFE_PORT_ID_QUINARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_TX; - case AFE_PORT_ID_SENARY_MI2S_RX: - return IDX_AFE_PORT_ID_SENARY_MI2S_RX; - case AFE_PORT_ID_SENARY_MI2S_TX: - return IDX_AFE_PORT_ID_SENARY_MI2S_TX; - case AFE_PORT_ID_PRIMARY_TDM_RX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_0; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_0; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_0; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_0; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_0; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_0; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_0; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_0; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_0; - case AFE_PORT_ID_QUINARY_TDM_TX: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_0; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_TDM_RX: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_0; - case AFE_PORT_ID_SENARY_TDM_TX: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_0; - case AFE_PORT_ID_SENARY_TDM_RX_1: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_1; - case AFE_PORT_ID_SENARY_TDM_TX_1: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_1; - case AFE_PORT_ID_SENARY_TDM_RX_2: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_2; - case AFE_PORT_ID_SENARY_TDM_TX_2: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_2; - case AFE_PORT_ID_SENARY_TDM_RX_3: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_3; - case AFE_PORT_ID_SENARY_TDM_TX_3: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_3; - case AFE_PORT_ID_SENARY_TDM_RX_4: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_4; - case AFE_PORT_ID_SENARY_TDM_TX_4: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_4; - case AFE_PORT_ID_SENARY_TDM_RX_5: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_5; - case AFE_PORT_ID_SENARY_TDM_TX_5: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_5; - case AFE_PORT_ID_SENARY_TDM_RX_6: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_6; - case AFE_PORT_ID_SENARY_TDM_TX_6: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_6; - case AFE_PORT_ID_SENARY_TDM_RX_7: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_7; - case AFE_PORT_ID_SENARY_TDM_TX_7: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_7; - case AFE_PORT_ID_INT0_MI2S_RX: - return IDX_AFE_PORT_ID_INT0_MI2S_RX; - case AFE_PORT_ID_INT0_MI2S_TX: - return IDX_AFE_PORT_ID_INT0_MI2S_TX; - case AFE_PORT_ID_INT1_MI2S_RX: - return IDX_AFE_PORT_ID_INT1_MI2S_RX; - case AFE_PORT_ID_INT1_MI2S_TX: - return IDX_AFE_PORT_ID_INT1_MI2S_TX; - case AFE_PORT_ID_INT2_MI2S_RX: - return IDX_AFE_PORT_ID_INT2_MI2S_RX; - case AFE_PORT_ID_INT2_MI2S_TX: - return IDX_AFE_PORT_ID_INT2_MI2S_TX; - case AFE_PORT_ID_INT3_MI2S_RX: - return IDX_AFE_PORT_ID_INT3_MI2S_RX; - case AFE_PORT_ID_INT3_MI2S_TX: - return IDX_AFE_PORT_ID_INT3_MI2S_TX; - case AFE_PORT_ID_INT4_MI2S_RX: - return IDX_AFE_PORT_ID_INT4_MI2S_RX; - case AFE_PORT_ID_INT4_MI2S_TX: - return IDX_AFE_PORT_ID_INT4_MI2S_TX; - case AFE_PORT_ID_INT5_MI2S_RX: - return IDX_AFE_PORT_ID_INT5_MI2S_RX; - case AFE_PORT_ID_INT5_MI2S_TX: - return IDX_AFE_PORT_ID_INT5_MI2S_TX; - case AFE_PORT_ID_INT6_MI2S_RX: - return IDX_AFE_PORT_ID_INT6_MI2S_RX; - case AFE_PORT_ID_INT6_MI2S_TX: - return IDX_AFE_PORT_ID_INT6_MI2S_TX; - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - return IDX_AFE_PORT_ID_PRIMARY_META_MI2S_RX; - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - return IDX_AFE_PORT_ID_SECONDARY_META_MI2S_RX; - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_0; - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_1; - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_2; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_0; - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_0; - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_1; - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_2; - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_3; - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_3; - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_4; - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_4; - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_5; - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5; - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6; - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7; - case AFE_LOOPBACK_TX: - return IDX_AFE_LOOPBACK_TX; - case RT_PROXY_PORT_002_RX: - return IDX_RT_PROXY_PORT_002_RX; - case RT_PROXY_PORT_002_TX: - return IDX_RT_PROXY_PORT_002_TX; - default: - pr_err("%s: port 0x%x\n", __func__, port_id); - return -EINVAL; - } -} - -/** - * afe_open - - * command to open AFE port - * - * @port_id: AFE port id - * @afe_config: AFE port config to pass - * @rate: sample rate - * - * Returns 0 on success or error on failure - */ -int afe_open(u16 port_id, - union afe_port_config *afe_config, int rate) -{ - struct afe_port_cmd_device_start start; - union afe_port_config port_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - int cfg_type; - int index = 0; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&start, 0, sizeof(start)); - memset(&port_cfg, 0, sizeof(port_cfg)); - - if (!afe_config) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - return ret; - } - - pr_err("%s: port_id 0x%x rate %d\n", __func__, port_id, rate); - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", __func__, port_id, ret); - return -EINVAL; - } - - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { - pr_err("%s: wrong port 0x%x\n", __func__, port_id); - return -EINVAL; - } - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) - port_id = VIRTUAL_ID_TO_PORTID(port_id); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return -EINVAL; - } - - if ((index >= 0) && (index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[index] = rate; - - if (this_afe.rt_cb) - this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id); - } - - /* Also send the topology id here: */ - afe_send_custom_topology(); /* One time call: only for first time */ - afe_send_port_topology_id(port_id); - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Failed : Invalid Port id = 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - mutex_lock(&this_afe.afe_cmd_lock); - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - cfg_type = AFE_PARAM_ID_I2S_CONFIG; - break; - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - cfg_type = AFE_PARAM_ID_PCM_CONFIG; - break; - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SENARY_MI2S_RX: - case AFE_PORT_ID_SENARY_MI2S_TX: - cfg_type = AFE_PARAM_ID_I2S_CONFIG; - break; - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - cfg_type = AFE_PARAM_ID_META_I2S_CONFIG; - break; - case HDMI_RX: - case DISPLAY_PORT_RX: - cfg_type = AFE_PARAM_ID_HDMI_CONFIG; - break; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - cfg_type = AFE_PARAM_ID_SPDIF_CONFIG; - break; - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG; - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - cfg_type = AFE_PARAM_ID_USB_AUDIO_CONFIG; - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - cfg_type = AFE_PARAM_ID_CODEC_DMA_CONFIG; - break; - default: - pr_err("%s: Invalid port id 0x%x\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = cfg_type; - param_hdr.param_size = sizeof(union afe_port_config); - port_cfg = *afe_config; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &port_cfg); - if (ret) { - pr_err("%s: AFE enable for port 0x%x opcode[0x%x]failed %d\n", - __func__, port_id, cfg_type, ret); - goto fail_cmd; - } - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = index; - start.hdr.opcode = AFE_PORT_CMD_DEVICE_START; - start.port_id = q6audio_get_port_id(port_id); - pr_debug("%s: cmd device start opcode[0x%x] port id[0x%x]\n", - __func__, start.hdr.opcode, start.port_id); - - ret = afe_apr_send_pkt(&start, &this_afe.wait[index]); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed %d\n", __func__, - port_id, ret); - goto fail_cmd; - } - -fail_cmd: - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_open); - -/** - * afe_loopback - - * command to set loopback between AFE ports - * - * @enable: enable or disable loopback - * @rx_port: AFE RX port ID - * @tx_port: AFE TX port ID - * - * Returns 0 on success or error on failure - */ -int afe_loopback(u16 enable, u16 rx_port, u16 tx_port) -{ - struct afe_loopback_cfg_v1 lb_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&lb_param, 0, sizeof(lb_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (rx_port == MI2S_RX) - rx_port = AFE_PORT_ID_PRIMARY_MI2S_RX; - if (tx_port == MI2S_TX) - tx_port = AFE_PORT_ID_PRIMARY_MI2S_TX; - - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_CONFIG; - param_hdr.param_size = sizeof(struct afe_loopback_cfg_v1); - - lb_param.dst_port_id = rx_port; - lb_param.routing_mode = LB_MODE_DEFAULT; - lb_param.enable = (enable ? 1 : 0); - lb_param.loopback_cfg_minor_version = AFE_API_VERSION_LOOPBACK_CONFIG; - - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, (u8 *) &lb_param); - if (ret) - pr_err("%s: AFE loopback failed %d\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_loopback); - -/** - * afe_loopback_gain - - * command to set gain for AFE loopback - * - * @port_id: AFE port id - * @volume: gain value to set - * - * Returns 0 on success or error on failure - */ -int afe_loopback_gain(u16 port_id, u16 volume) -{ - struct afe_loopback_gain_per_path_param set_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&set_param, 0, sizeof(set_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Failed : Invalid Port id = 0x%x ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - - /* RX ports numbers are even .TX ports numbers are odd. */ - if (port_id % 2 == 0) { - pr_err("%s: Failed : afe loopback gain only for TX ports. port_id %d\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: port 0x%x volume %d\n", __func__, port_id, volume); - - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH; - param_hdr.param_size = sizeof(struct afe_loopback_gain_per_path_param); - set_param.rx_port_id = port_id; - set_param.gain = volume; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &set_param); - if (ret) - pr_err("%s: AFE param set failed for port 0x%x ret %d\n", - __func__, port_id, ret); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_loopback_gain); - -int afe_pseudo_port_start_nowait(u16 port_id) -{ - struct afe_pseudoport_start_command start; - int ret = 0; - - pr_debug("%s: port_id=0x%x\n", __func__, port_id); - if (this_afe.apr == NULL) { - pr_err("%s: AFE APR is not registered\n", __func__); - return -ENODEV; - } - - - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = 0; - start.hdr.opcode = AFE_PSEUDOPORT_CMD_START; - start.port_id = port_id; - start.timing = 1; - - ret = afe_apr_send_pkt(&start, NULL); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - return 0; -} - -int afe_start_pseudo_port(u16 port_id) -{ - int ret = 0; - struct afe_pseudoport_start_command start; - int index = 0; - - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", - __func__, port_id, ret); - return -EINVAL; - } - - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = 0; - start.hdr.opcode = AFE_PSEUDOPORT_CMD_START; - start.port_id = port_id; - start.timing = 1; - start.hdr.token = index; - - ret = afe_apr_send_pkt(&start, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE enable for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; -} - -int afe_pseudo_port_stop_nowait(u16 port_id) -{ - int ret = 0; - struct afe_pseudoport_stop_command stop; - int index = 0; - - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - return -EINVAL; - } - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", - __func__, port_id, ret); - return -EINVAL; - } - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = 0; - stop.hdr.opcode = AFE_PSEUDOPORT_CMD_STOP; - stop.port_id = port_id; - stop.reserved = 0; - stop.hdr.token = index; - - ret = afe_apr_send_pkt(&stop, NULL); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - - return ret; -} - -int afe_port_group_set_param(u16 group_id, - union afe_port_group_config *afe_group_config) -{ - struct param_hdr_v3 param_hdr; - int cfg_type; - int ret; - - if (!afe_group_config) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: group id: 0x%x\n", __func__, group_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - switch (group_id) { - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_SENARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_SENARY_TDM_TX: - cfg_type = AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG; - break; - default: - pr_err("%s: Invalid group id 0x%x\n", __func__, group_id); - return -EINVAL; - } - - param_hdr.module_id = AFE_MODULE_GROUP_DEVICE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = cfg_type; - param_hdr.param_size = sizeof(union afe_port_group_config); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) afe_group_config); - if (ret) - pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_CFG failed %d\n", - __func__, ret); - - return ret; -} - -/** - * afe_port_tdm_lane_config - - * to configure group TDM lane mask with specified configuration - * - * @group_id: AFE group id number - * @lane_cfg: TDM lane mask configutation - * - * Returns 0 on success or error value on failure. - */ -static int afe_port_tdm_lane_config(u16 group_id, - struct afe_param_id_tdm_lane_cfg *lane_cfg) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (lane_cfg == NULL || - lane_cfg->lane_mask == AFE_LANE_MASK_INVALID) { - pr_debug("%s: lane cfg not supported for group id: 0x%x\n", - __func__, group_id); - return ret; - } - - pr_debug("%s: group id: 0x%x lane mask 0x%x\n", __func__, - group_id, lane_cfg->lane_mask); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - param_hdr.module_id = AFE_MODULE_GROUP_DEVICE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_TDM_LANE_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_tdm_lane_cfg); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *)lane_cfg); - if (ret) - pr_err("%s: AFE_PARAM_ID_TDM_LANE_CONFIG failed %d\n", - __func__, ret); - - return ret; -} - -/** - * afe_port_group_enable - - * command to enable AFE port group - * - * @group_id: group ID for AFE port group - * @afe_group_config: config for AFE group - * @enable: flag to indicate enable or disable - * @lane_cfg: TDM lane mask configutation - * - * Returns 0 on success or error on failure - */ -int afe_port_group_enable(u16 group_id, - union afe_port_group_config *afe_group_config, - u16 enable, - struct afe_param_id_tdm_lane_cfg *lane_cfg) -{ - struct afe_group_device_enable group_enable; - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: group id: 0x%x enable: %d\n", __func__, - group_id, enable); - - memset(&group_enable, 0, sizeof(group_enable)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if (enable) { - ret = afe_port_group_set_param(group_id, afe_group_config); - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - return ret; - } - ret = afe_port_tdm_lane_config(group_id, lane_cfg); - if (ret < 0) { - pr_err("%s: afe send lane config failed %d\n", - __func__, ret); - return ret; - } - } - - param_hdr.module_id = AFE_MODULE_GROUP_DEVICE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_GROUP_DEVICE_ENABLE; - param_hdr.param_size = sizeof(struct afe_group_device_enable); - group_enable.group_id = group_id; - group_enable.enable = enable; - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) &group_enable); - if (ret) - pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_ENABLE failed %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(afe_port_group_enable); - -int afe_stop_pseudo_port(u16 port_id) -{ - int ret = 0; - struct afe_pseudoport_stop_command stop; - int index = 0; - - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - return -EINVAL; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = 0; - stop.hdr.opcode = AFE_PSEUDOPORT_CMD_STOP; - stop.port_id = port_id; - stop.reserved = 0; - stop.hdr.token = index; - - ret = afe_apr_send_pkt(&stop, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - - return ret; -} - -/** - * afe_req_mmap_handle - - * Retrieve AFE memory map handle - * - * @ac: AFE audio client - * - * Returns memory map handle - */ -uint32_t afe_req_mmap_handle(struct afe_audio_client *ac) -{ - return ac->mem_map_handle; -} -EXPORT_SYMBOL(afe_req_mmap_handle); - -/** - * q6afe_audio_client_alloc - - * Assign new AFE audio client - * - * @priv: privata data to hold for audio client - * - * Returns ac pointer on success or NULL on failure - */ -struct afe_audio_client *q6afe_audio_client_alloc(void *priv) -{ - struct afe_audio_client *ac; - int lcnt = 0; - - ac = kzalloc(sizeof(struct afe_audio_client), GFP_KERNEL); - if (!ac) - return NULL; - - ac->priv = priv; - - init_waitqueue_head(&ac->cmd_wait); - INIT_LIST_HEAD(&ac->port[0].mem_map_handle); - INIT_LIST_HEAD(&ac->port[1].mem_map_handle); - pr_debug("%s: mem_map_handle list init'ed\n", __func__); - mutex_init(&ac->cmd_lock); - for (lcnt = 0; lcnt <= OUT; lcnt++) { - mutex_init(&ac->port[lcnt].lock); - spin_lock_init(&ac->port[lcnt].dsp_lock); - } - atomic_set(&ac->cmd_state, 0); - - return ac; -} -EXPORT_SYMBOL(q6afe_audio_client_alloc); - -/** - * q6afe_audio_client_buf_alloc_contiguous - - * Allocate contiguous shared buffers - * - * @dir: RX or TX direction of AFE port - * @ac: AFE audio client handle - * @bufsz: size of each shared buffer - * @bufcnt: number of buffers - * - * Returns 0 on success or error on failure - */ -int q6afe_audio_client_buf_alloc_contiguous(unsigned int dir, - struct afe_audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt) -{ - int cnt = 0; - int rc = 0; - struct afe_audio_buffer *buf; - size_t len; - - if (!(ac) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return -EINVAL; - } - - pr_debug("%s: bufsz[%d]bufcnt[%d]\n", - __func__, - bufsz, bufcnt); - - if (ac->port[dir].buf) { - pr_debug("%s: buffer already allocated\n", __func__); - return 0; - } - mutex_lock(&ac->cmd_lock); - buf = kzalloc(((sizeof(struct afe_audio_buffer))*bufcnt), - GFP_KERNEL); - - if (!buf) { - pr_err("%s: null buf\n", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - ac->port[dir].buf = buf; - - rc = msm_audio_ion_alloc(&buf[0].dma_buf, - bufsz * bufcnt, - &buf[0].phys, &len, - &buf[0].data); - if (rc) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, rc); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - buf[0].used = dir ^ 1; - buf[0].size = bufsz; - buf[0].actual_size = bufsz; - cnt = 1; - while (cnt < bufcnt) { - if (bufsz > 0) { - buf[cnt].data = buf[0].data + (cnt * bufsz); - buf[cnt].phys = buf[0].phys + (cnt * bufsz); - if (!buf[cnt].data) { - pr_err("%s: Buf alloc failed\n", - __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - buf[cnt].used = dir ^ 1; - buf[cnt].size = bufsz; - buf[cnt].actual_size = bufsz; - pr_debug("%s: data[%pK]phys[%pK][%pK]\n", __func__, - buf[cnt].data, - &buf[cnt].phys, - &buf[cnt].phys); - } - cnt++; - } - ac->port[dir].max_buf_cnt = cnt; - mutex_unlock(&ac->cmd_lock); - return 0; -fail: - pr_err("%s: jump fail\n", __func__); - q6afe_audio_client_buf_free_contiguous(dir, ac); - return -EINVAL; -} -EXPORT_SYMBOL(q6afe_audio_client_buf_alloc_contiguous); - -/** - * afe_memory_map - - * command to map shared buffers to AFE - * - * @dma_addr_p: DMA physical address - * @dma_buf_sz: shared DMA buffer size - * @ac: AFE audio client handle - * - * Returns 0 on success or error on failure - */ -int afe_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz, - struct afe_audio_client *ac) -{ - int ret = 0; - - mutex_lock(&this_afe.afe_cmd_lock); - ac->mem_map_handle = 0; - ret = afe_cmd_memory_map(dma_addr_p, dma_buf_sz); - if (ret < 0) { - pr_err("%s: afe_cmd_memory_map failed %d\n", - __func__, ret); - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; - } - ac->mem_map_handle = this_afe.mmap_handle; - mutex_unlock(&this_afe.afe_cmd_lock); - - return ret; -} -EXPORT_SYMBOL(afe_memory_map); - -int afe_cmd_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz) -{ - int ret = 0; - int cmd_size = 0; - void *payload = NULL; - void *mmap_region_cmd = NULL; - struct afe_service_cmd_shared_mem_map_regions *mregion = NULL; - struct afe_service_shared_map_region_payload *mregion_pl = NULL; - int index = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - if (dma_buf_sz % SZ_4K != 0) { - /* - * The memory allocated by msm_audio_ion_alloc is always 4kB - * aligned, ADSP expects the size to be 4kB aligned as well - * so re-adjusts the buffer size before passing to ADSP. - */ - dma_buf_sz = PAGE_ALIGN(dma_buf_sz); - } - - cmd_size = sizeof(struct afe_service_cmd_shared_mem_map_regions) - + sizeof(struct afe_service_shared_map_region_payload); - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mregion = (struct afe_service_cmd_shared_mem_map_regions *) - mmap_region_cmd; - mregion->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion->hdr.pkt_size = cmd_size; - mregion->hdr.src_port = 0; - mregion->hdr.dest_port = 0; - mregion->hdr.token = 0; - mregion->hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS; - mregion->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mregion->num_regions = 1; - mregion->property_flag = 0x00; - /* Todo */ - index = mregion->hdr.token = IDX_RSVD_2; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct afe_service_cmd_shared_mem_map_regions)); - - mregion_pl = (struct afe_service_shared_map_region_payload *)payload; - - mregion_pl->shm_addr_lsw = lower_32_bits(dma_addr_p); - mregion_pl->shm_addr_msw = msm_audio_populate_upper_32_bits(dma_addr_p); - mregion_pl->mem_size_bytes = dma_buf_sz; - - pr_debug("%s: dma_addr_p 0x%pK , size %d\n", __func__, - &dma_addr_p, dma_buf_sz); - this_afe.mmap_handle = 0; - ret = afe_apr_send_pkt((uint32_t *) mmap_region_cmd, - &this_afe.wait[index]); - kfree(mmap_region_cmd); - return ret; -} - -int afe_cmd_memory_map_nowait(int port_id, phys_addr_t dma_addr_p, - u32 dma_buf_sz) -{ - int ret = 0; - int cmd_size = 0; - void *payload = NULL; - void *mmap_region_cmd = NULL; - struct afe_service_cmd_shared_mem_map_regions *mregion = NULL; - struct afe_service_shared_map_region_payload *mregion_pl = NULL; - int index = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", - __func__, port_id, ret); - return -EINVAL; - } - - cmd_size = sizeof(struct afe_service_cmd_shared_mem_map_regions) - + sizeof(struct afe_service_shared_map_region_payload); - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mregion = (struct afe_service_cmd_shared_mem_map_regions *) - mmap_region_cmd; - mregion->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion->hdr.pkt_size = sizeof(mregion); - mregion->hdr.src_port = 0; - mregion->hdr.dest_port = 0; - mregion->hdr.token = 0; - mregion->hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS; - mregion->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mregion->num_regions = 1; - mregion->property_flag = 0x00; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct afe_service_cmd_shared_mem_map_regions)); - mregion_pl = (struct afe_service_shared_map_region_payload *)payload; - - mregion_pl->shm_addr_lsw = lower_32_bits(dma_addr_p); - mregion_pl->shm_addr_msw = msm_audio_populate_upper_32_bits(dma_addr_p); - mregion_pl->mem_size_bytes = dma_buf_sz; - - ret = afe_apr_send_pkt(mmap_region_cmd, NULL); - if (ret) - pr_err("%s: AFE memory map cmd failed %d\n", - __func__, ret); - kfree(mmap_region_cmd); - return ret; -} - -/** - * q6afe_audio_client_buf_free_contiguous - - * frees the shared contiguous memory - * - * @dir: RX or TX direction of port - * @ac: AFE audio client handle - * - */ -int q6afe_audio_client_buf_free_contiguous(unsigned int dir, - struct afe_audio_client *ac) -{ - struct afe_audio_port_data *port; - int cnt = 0; - - mutex_lock(&ac->cmd_lock); - port = &ac->port[dir]; - if (!port->buf) { - pr_err("%s: buf is null\n", __func__); - mutex_unlock(&ac->cmd_lock); - return 0; - } - cnt = port->max_buf_cnt - 1; - - if (port->buf[0].data) { - pr_debug("%s: data[%pK], phys[%pK], dma_buf[%pK]\n", - __func__, - port->buf[0].data, - &port->buf[0].phys, - port->buf[0].dma_buf); - msm_audio_ion_free(port->buf[0].dma_buf); - port->buf[0].dma_buf = NULL; - } - - while (cnt >= 0) { - port->buf[cnt].data = NULL; - port->buf[cnt].phys = 0; - cnt--; - } - port->max_buf_cnt = 0; - kfree(port->buf); - port->buf = NULL; - mutex_unlock(&ac->cmd_lock); - return 0; -} -EXPORT_SYMBOL(q6afe_audio_client_buf_free_contiguous); - -/** - * q6afe_audio_client_free - - * frees the audio client from AFE - * - * @ac: AFE audio client handle - * - */ -void q6afe_audio_client_free(struct afe_audio_client *ac) -{ - int loopcnt; - struct afe_audio_port_data *port; - - if (!ac) { - pr_err("%s: audio client is NULL\n", __func__); - return; - } - for (loopcnt = 0; loopcnt <= OUT; loopcnt++) { - port = &ac->port[loopcnt]; - if (!port->buf) - continue; - pr_debug("%s: loopcnt = %d\n", __func__, loopcnt); - q6afe_audio_client_buf_free_contiguous(loopcnt, ac); - } - kfree(ac); -} -EXPORT_SYMBOL(q6afe_audio_client_free); - -/** - * afe_cmd_memory_unmap - - * command to unmap memory for AFE shared buffer - * - * @mem_map_handle: memory map handle to be unmapped - * - * Returns 0 on success or error on failure - */ -int afe_cmd_memory_unmap(u32 mem_map_handle) -{ - int ret = 0; - struct afe_service_cmd_shared_mem_unmap_regions mregion; - int index = 0; - - pr_debug("%s: handle 0x%x\n", __func__, mem_map_handle); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - mregion.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion.hdr.pkt_size = sizeof(mregion); - mregion.hdr.src_port = 0; - mregion.hdr.dest_port = 0; - mregion.hdr.token = 0; - mregion.hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS; - mregion.mem_map_handle = mem_map_handle; - - /* Todo */ - index = mregion.hdr.token = IDX_RSVD_2; - - atomic_set(&this_afe.status, 0); - ret = afe_apr_send_pkt(&mregion, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE memory unmap cmd failed %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(afe_cmd_memory_unmap); - -int afe_cmd_memory_unmap_nowait(u32 mem_map_handle) -{ - int ret = 0; - struct afe_service_cmd_shared_mem_unmap_regions mregion; - - pr_debug("%s: handle 0x%x\n", __func__, mem_map_handle); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - mregion.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion.hdr.pkt_size = sizeof(mregion); - mregion.hdr.src_port = 0; - mregion.hdr.dest_port = 0; - mregion.hdr.token = 0; - mregion.hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS; - mregion.mem_map_handle = mem_map_handle; - - ret = afe_apr_send_pkt(&mregion, NULL); - if (ret) - pr_err("%s: AFE memory unmap cmd failed %d\n", - __func__, ret); - return ret; -} - -/** - * afe_register_get_events - - * register for events from proxy port - * - * @port_id: Port ID to register events - * @cb: callback function to invoke for events from proxy port - * @private_data: private data to sent back in callback fn - * - * Returns 0 on success or error on failure - */ -int afe_register_get_events(u16 port_id, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data) -{ - int ret = 0; - struct afe_service_cmd_register_rt_port_driver rtproxy; - - pr_debug("%s: port_id: 0x%x\n", __func__, port_id); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - port_id = VIRTUAL_ID_TO_PORTID(port_id); - } else { - pr_err("%s: wrong port id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - if (port_id == RT_PROXY_PORT_001_TX) { - this_afe.tx_cb = cb; - this_afe.tx_private_data = private_data; - } else if (port_id == RT_PROXY_PORT_001_RX) { - this_afe.rx_cb = cb; - this_afe.rx_private_data = private_data; - } - - rtproxy.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - rtproxy.hdr.pkt_size = sizeof(rtproxy); - rtproxy.hdr.src_port = 1; - rtproxy.hdr.dest_port = 1; - rtproxy.hdr.opcode = AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER; - rtproxy.port_id = port_id; - rtproxy.reserved = 0; - - ret = afe_apr_send_pkt(&rtproxy, NULL); - if (ret) - pr_err("%s: AFE reg. rtproxy_event failed %d\n", - __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_register_get_events); - -/** - * afe_unregister_get_events - - * unregister for events from proxy port - * - * @port_id: Port ID to unregister events - * - * Returns 0 on success or error on failure - */ -int afe_unregister_get_events(u16 port_id) -{ - int ret = 0; - struct afe_service_cmd_unregister_rt_port_driver rtproxy; - int index = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - port_id = VIRTUAL_ID_TO_PORTID(port_id); - } else { - pr_err("%s: wrong port id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", __func__, port_id, ret); - return -EINVAL; - } - - rtproxy.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - rtproxy.hdr.pkt_size = sizeof(rtproxy); - rtproxy.hdr.src_port = 0; - rtproxy.hdr.dest_port = 0; - rtproxy.hdr.token = 0; - rtproxy.hdr.opcode = AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER; - rtproxy.port_id = port_id; - rtproxy.reserved = 0; - - rtproxy.hdr.token = index; - - if (port_id == RT_PROXY_PORT_001_TX) { - this_afe.tx_cb = NULL; - this_afe.tx_private_data = NULL; - } else if (port_id == RT_PROXY_PORT_001_RX) { - this_afe.rx_cb = NULL; - this_afe.rx_private_data = NULL; - } - - ret = afe_apr_send_pkt(&rtproxy, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE enable Unreg. rtproxy_event failed %d\n", - __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_unregister_get_events); - -/** - * afe_rt_proxy_port_write - - * command for AFE RT proxy port write - * - * @buf_addr_p: Physical buffer address with - * playback data to proxy port - * @mem_map_handle: memory map handle of write buffer - * @bytes: number of bytes to write - * - * Returns 0 on success or error on failure - */ -int afe_rt_proxy_port_write(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes) -{ - int ret = 0; - struct afe_port_data_cmd_rt_proxy_port_write_v2 afecmd_wr; - - if (this_afe.apr == NULL) { - pr_err("%s: register to AFE is not done\n", __func__); - ret = -ENODEV; - return ret; - } - pr_debug("%s: buf_addr_p = 0x%pK bytes = %d\n", __func__, - &buf_addr_p, bytes); - - afecmd_wr.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - afecmd_wr.hdr.pkt_size = sizeof(afecmd_wr); - afecmd_wr.hdr.src_port = 0; - afecmd_wr.hdr.dest_port = 0; - afecmd_wr.hdr.token = 0; - afecmd_wr.hdr.opcode = AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2; - afecmd_wr.port_id = RT_PROXY_PORT_001_TX; - afecmd_wr.buffer_address_lsw = lower_32_bits(buf_addr_p); - afecmd_wr.buffer_address_msw = - msm_audio_populate_upper_32_bits(buf_addr_p); - afecmd_wr.mem_map_handle = mem_map_handle; - afecmd_wr.available_bytes = bytes; - afecmd_wr.reserved = 0; - - /* - * Do not call afe_apr_send_pkt() here as it acquires - * a mutex lock inside and this function gets called in - * interrupt context leading to scheduler crash - */ - atomic_set(&this_afe.status, 0); - ret = apr_send_pkt(this_afe.apr, (uint32_t *) &afecmd_wr); - if (ret < 0) { - pr_err("%s: AFE rtproxy write to port 0x%x failed %d\n", - __func__, afecmd_wr.port_id, ret); - ret = -EINVAL; - } - - return ret; - -} -EXPORT_SYMBOL(afe_rt_proxy_port_write); - -/** - * afe_rt_proxy_port_read - - * command for AFE RT proxy port read - * - * @buf_addr_p: Physical buffer address to fill read data - * @mem_map_handle: memory map handle for buffer read - * @bytes: number of bytes to read - * - * Returns 0 on success or error on failure - */ -int afe_rt_proxy_port_read(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes) -{ - int ret = 0; - struct afe_port_data_cmd_rt_proxy_port_read_v2 afecmd_rd; - - if (this_afe.apr == NULL) { - pr_err("%s: register to AFE is not done\n", __func__); - ret = -ENODEV; - return ret; - } - pr_debug("%s: buf_addr_p = 0x%pK bytes = %d\n", __func__, - &buf_addr_p, bytes); - - afecmd_rd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - afecmd_rd.hdr.pkt_size = sizeof(afecmd_rd); - afecmd_rd.hdr.src_port = 0; - afecmd_rd.hdr.dest_port = 0; - afecmd_rd.hdr.token = 0; - afecmd_rd.hdr.opcode = AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2; - afecmd_rd.port_id = RT_PROXY_PORT_001_RX; - afecmd_rd.buffer_address_lsw = lower_32_bits(buf_addr_p); - afecmd_rd.buffer_address_msw = - msm_audio_populate_upper_32_bits(buf_addr_p); - afecmd_rd.available_bytes = bytes; - afecmd_rd.mem_map_handle = mem_map_handle; - - /* - * Do not call afe_apr_send_pkt() here as it acquires - * a mutex lock inside and this function gets called in - * interrupt context leading to scheduler crash - */ - atomic_set(&this_afe.status, 0); - ret = apr_send_pkt(this_afe.apr, (uint32_t *) &afecmd_rd); - if (ret < 0) { - pr_err("%s: AFE rtproxy read cmd to port 0x%x failed %d\n", - __func__, afecmd_rd.port_id, ret); - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(afe_rt_proxy_port_read); - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_afelb; -static struct dentry *debugfs_afelb_gain; - -static int afe_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - pr_info("%s: debug intf %s\n", __func__, (char *) file->private_data); - return 0; -} - -static int afe_get_parameters(char *buf, long int *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token != NULL) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtoul(token, base, ¶m1[cnt]) != 0) { - pr_err("%s: kstrtoul failed\n", - __func__); - return -EINVAL; - } - - token = strsep(&buf, " "); - } else { - pr_err("%s: token NULL\n", __func__); - return -EINVAL; - } - } - return 0; -} -#define AFE_LOOPBACK_ON (1) -#define AFE_LOOPBACK_OFF (0) -static ssize_t afe_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *lb_str = filp->private_data; - char lbuf[32]; - int rc; - unsigned long param[5]; - - if (cnt > sizeof(lbuf) - 1) { - pr_err("%s: cnt %zd size %zd\n", __func__, cnt, sizeof(lbuf)-1); - return -EINVAL; - } - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) { - pr_err("%s: copy from user failed %d\n", __func__, rc); - return -EFAULT; - } - - lbuf[cnt] = '\0'; - - if (!strcmp(lb_str, "afe_loopback")) { - rc = afe_get_parameters(lbuf, param, 3); - if (!rc) { - pr_info("%s: %lu %lu %lu\n", lb_str, param[0], param[1], - param[2]); - - if ((param[0] != AFE_LOOPBACK_ON) && (param[0] != - AFE_LOOPBACK_OFF)) { - pr_err("%s: Error, parameter 0 incorrect\n", - __func__); - rc = -EINVAL; - goto afe_error; - } - if ((q6audio_validate_port(param[1]) < 0) || - (q6audio_validate_port(param[2])) < 0) { - pr_err("%s: Error, invalid afe port\n", - __func__); - } - if (this_afe.apr == NULL) { - pr_err("%s: Error, AFE not opened\n", __func__); - rc = -EINVAL; - } else { - rc = afe_loopback(param[0], param[1], param[2]); - } - } else { - pr_err("%s: Error, invalid parameters\n", __func__); - rc = -EINVAL; - } - - } else if (!strcmp(lb_str, "afe_loopback_gain")) { - rc = afe_get_parameters(lbuf, param, 2); - if (!rc) { - pr_info("%s: %s %lu %lu\n", - __func__, lb_str, param[0], param[1]); - - rc = q6audio_validate_port(param[0]); - if (rc < 0) { - pr_err("%s: Error, invalid afe port %d %lu\n", - __func__, rc, param[0]); - rc = -EINVAL; - goto afe_error; - } - - if (param[1] > 100) { - pr_err("%s: Error, volume should be 0 to 100 percentage param = %lu\n", - __func__, param[1]); - rc = -EINVAL; - goto afe_error; - } - - param[1] = (Q6AFE_MAX_VOLUME * param[1]) / 100; - - if (this_afe.apr == NULL) { - pr_err("%s: Error, AFE not opened\n", __func__); - rc = -EINVAL; - } else { - rc = afe_loopback_gain(param[0], param[1]); - } - } else { - pr_err("%s: Error, invalid parameters\n", __func__); - rc = -EINVAL; - } - } - -afe_error: - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations afe_debug_fops = { - .open = afe_debug_open, - .write = afe_debug_write -}; - -static void config_debug_fs_init(void) -{ - debugfs_afelb = debugfs_create_file("afe_loopback", - 0664, NULL, (void *) "afe_loopback", - &afe_debug_fops); - - debugfs_afelb_gain = debugfs_create_file("afe_loopback_gain", - 0664, NULL, (void *) "afe_loopback_gain", - &afe_debug_fops); -} -static void config_debug_fs_exit(void) -{ - debugfs_remove(debugfs_afelb); - debugfs_remove(debugfs_afelb_gain); -} -#else -static void config_debug_fs_init(void) -{ -} -static void config_debug_fs_exit(void) -{ -} -#endif - -/** - * afe_set_dtmf_gen_rx_portid - - * Set port_id for DTMF tone generation - * - * @port_id: AFE port id - * @set: set or reset port id value for dtmf gen - * - */ -void afe_set_dtmf_gen_rx_portid(u16 port_id, int set) -{ - if (set) - this_afe.dtmf_gen_rx_portid = port_id; - else if (this_afe.dtmf_gen_rx_portid == port_id) - this_afe.dtmf_gen_rx_portid = -1; -} -EXPORT_SYMBOL(afe_set_dtmf_gen_rx_portid); - -/** - * afe_dtmf_generate_rx - command to generate AFE DTMF RX - * - * @duration_in_ms: Duration in ms for dtmf tone - * @high_freq: Higher frequency for dtmf - * @low_freq: lower frequency for dtmf - * @gain: Gain value for DTMF tone - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_dtmf_generate_rx(int64_t duration_in_ms, - uint16_t high_freq, - uint16_t low_freq, uint16_t gain) -{ - int ret = 0; - int index = 0; - struct afe_dtmf_generation_command cmd_dtmf; - - pr_debug("%s: DTMF AFE Gen\n", __func__); - - if (afe_validate_port(this_afe.dtmf_gen_rx_portid) < 0) { - pr_err("%s: Failed : Invalid Port id = 0x%x\n", - __func__, this_afe.dtmf_gen_rx_portid); - ret = -EINVAL; - goto fail_cmd; - } - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - pr_debug("%s: dur=%lld: hfreq=%d lfreq=%d gain=%d portid=0x%x\n", - __func__, - duration_in_ms, high_freq, low_freq, gain, - this_afe.dtmf_gen_rx_portid); - - cmd_dtmf.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cmd_dtmf.hdr.pkt_size = sizeof(cmd_dtmf); - cmd_dtmf.hdr.src_port = 0; - cmd_dtmf.hdr.dest_port = 0; - cmd_dtmf.hdr.token = 0; - cmd_dtmf.hdr.opcode = AFE_PORTS_CMD_DTMF_CTL; - cmd_dtmf.duration_in_ms = duration_in_ms; - cmd_dtmf.high_freq = high_freq; - cmd_dtmf.low_freq = low_freq; - cmd_dtmf.gain = gain; - cmd_dtmf.num_ports = 1; - cmd_dtmf.port_ids = q6audio_get_port_id(this_afe.dtmf_gen_rx_portid); - - index = q6audio_get_port_index(this_afe.dtmf_gen_rx_portid); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - ret = -EINVAL; - goto fail_cmd; - } - ret = afe_apr_send_pkt((uint32_t *) &cmd_dtmf, - &this_afe.wait[index]); - return ret; -fail_cmd: - pr_err("%s: failed %d\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_dtmf_generate_rx); - -static int afe_sidetone_iir(u16 tx_port_id) -{ - int ret; - uint16_t size = 0; - int cal_index = AFE_SIDETONE_IIR_CAL; - int iir_pregain = 0; - int iir_num_biquad_stages = 0; - int iir_enable; - struct cal_block_data *cal_block; - int mid; - struct afe_mod_enable_param enable; - struct afe_sidetone_iir_filter_config_params filter_data; - struct param_hdr_v3 param_hdr; - u8 *packed_param_data = NULL; - u32 packed_param_size = 0; - u32 single_param_size = 0; - struct audio_cal_info_sidetone_iir *st_iir_cal_info = NULL; - - memset(&enable, 0, sizeof(enable)); - memset(&filter_data, 0, sizeof(filter_data)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (this_afe.cal_data[cal_index] == NULL) { - pr_err("%s: cal data is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - mutex_lock(&this_afe.cal_data[cal_index]->lock); - cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s: cal_block not found\n ", __func__); - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - ret = -EINVAL; - goto done; - } - - /* Cache data from cal block while inside lock to reduce locked time */ - st_iir_cal_info = - (struct audio_cal_info_sidetone_iir *) cal_block->cal_info; - iir_pregain = st_iir_cal_info->pregain; - iir_enable = st_iir_cal_info->iir_enable; - iir_num_biquad_stages = st_iir_cal_info->num_biquad_stages; - mid = st_iir_cal_info->mid; - - /* - * calculate the actual size of payload based on no of stages - * enabled in calibration - */ - size = (MAX_SIDETONE_IIR_DATA_SIZE / MAX_NO_IIR_FILTER_STAGE) * - iir_num_biquad_stages; - /* - * For an odd number of stages, 2 bytes of padding are - * required at the end of the payload. - */ - if (iir_num_biquad_stages % 2) { - pr_debug("%s: adding 2 to size:%d\n", __func__, size); - size = size + 2; - } - memcpy(&filter_data.iir_config, &st_iir_cal_info->iir_config, size); - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - - packed_param_size = - sizeof(param_hdr) * 2 + sizeof(enable) + sizeof(filter_data); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - packed_param_size = 0; - - /* - * Set IIR enable params - */ - param_hdr.module_id = mid; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_ENABLE; - param_hdr.param_size = sizeof(enable); - enable.enable = iir_enable; - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, - (u8 *) &enable, &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - /* - * Set IIR filter config params - */ - param_hdr.module_id = mid; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SIDETONE_IIR_FILTER_CONFIG; - param_hdr.param_size = sizeof(filter_data.num_biquad_stages) + - sizeof(filter_data.pregain) + size; - filter_data.num_biquad_stages = iir_num_biquad_stages; - filter_data.pregain = iir_pregain; - ret = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, (u8 *) &filter_data, - &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - pr_debug("%s: tx(0x%x)mid(0x%x)iir_en(%d)stg(%d)gain(0x%x)size(%d)\n", - __func__, tx_port_id, mid, enable.enable, - filter_data.num_biquad_stages, filter_data.pregain, - param_hdr.param_size); - - ret = q6afe_set_params(tx_port_id, q6audio_get_port_index(tx_port_id), - NULL, packed_param_data, packed_param_size); - if (ret) - pr_err("%s: AFE sidetone failed for tx_port(0x%x)\n", - __func__, tx_port_id); - -done: - kfree(packed_param_data); - return ret; -} - -static int afe_sidetone(u16 tx_port_id, u16 rx_port_id, bool enable) -{ - int ret; - int cal_index = AFE_SIDETONE_CAL; - int sidetone_gain; - int sidetone_enable; - struct cal_block_data *cal_block; - int mid = 0; - struct afe_loopback_sidetone_gain gain_data; - struct loopback_cfg_data cfg_data; - struct param_hdr_v3 param_hdr; - u8 *packed_param_data = NULL; - u32 packed_param_size = 0; - u32 single_param_size = 0; - struct audio_cal_info_sidetone *st_cal_info = NULL; - - if (this_afe.cal_data[cal_index] == NULL) { - pr_err("%s: cal data is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - memset(&gain_data, 0, sizeof(gain_data)); - memset(&cfg_data, 0, sizeof(cfg_data)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - packed_param_size = - sizeof(param_hdr) * 2 + sizeof(gain_data) + sizeof(cfg_data); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - packed_param_size = 0; - - mutex_lock(&this_afe.cal_data[cal_index]->lock); - cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s: cal_block not found\n", __func__); - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - ret = -EINVAL; - goto done; - } - - /* Cache data from cal block while inside lock to reduce locked time */ - st_cal_info = (struct audio_cal_info_sidetone *) cal_block->cal_info; - sidetone_gain = st_cal_info->gain; - sidetone_enable = st_cal_info->enable; - mid = st_cal_info->mid; - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - - /* Set gain data. */ - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH; - param_hdr.param_size = sizeof(struct afe_loopback_sidetone_gain); - gain_data.rx_port_id = rx_port_id; - gain_data.gain = sidetone_gain; - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, - (u8 *) &gain_data, &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - /* Set configuration data. */ - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_CONFIG; - param_hdr.param_size = sizeof(struct loopback_cfg_data); - cfg_data.loopback_cfg_minor_version = AFE_API_VERSION_LOOPBACK_CONFIG; - cfg_data.dst_port_id = rx_port_id; - cfg_data.routing_mode = LB_MODE_SIDETONE; - cfg_data.enable = enable; - ret = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, (u8 *) &cfg_data, - &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - pr_debug("%s rx(0x%x) tx(0x%x) enable(%d) mid(0x%x) gain(%d) sidetone_enable(%d)\n", - __func__, rx_port_id, tx_port_id, - enable, mid, sidetone_gain, sidetone_enable); - - ret = q6afe_set_params(tx_port_id, q6audio_get_port_index(tx_port_id), - NULL, packed_param_data, packed_param_size); - if (ret) - pr_err("%s: AFE sidetone send failed for tx_port:%d rx_port:%d ret:%d\n", - __func__, tx_port_id, rx_port_id, ret); - -done: - kfree(packed_param_data); - return ret; -} - -int afe_sidetone_enable(u16 tx_port_id, u16 rx_port_id, bool enable) -{ - int ret; - int index; - - index = q6audio_get_port_index(rx_port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - ret = -EINVAL; - goto done; - } - if (q6audio_validate_port(rx_port_id) < 0) { - pr_err("%s: Invalid port 0x%x\n", - __func__, rx_port_id); - ret = -EINVAL; - goto done; - } - index = q6audio_get_port_index(tx_port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - ret = -EINVAL; - goto done; - } - if (q6audio_validate_port(tx_port_id) < 0) { - pr_err("%s: Invalid port 0x%x\n", - __func__, tx_port_id); - ret = -EINVAL; - goto done; - } - if (enable) { - ret = afe_sidetone_iir(tx_port_id); - if (ret) - goto done; - } - - ret = afe_sidetone(tx_port_id, rx_port_id, enable); - -done: - return ret; -} - -/** - * afe_set_display_stream - command to update AFE dp port params - * - * @rx_port_id: AFE port id - * @stream_idx: dp controller stream index - * @ctl_idx: dp controller index - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_display_stream(u16 rx_port_id, u32 stream_idx, u32 ctl_idx) -{ - int ret; - struct param_hdr_v3 param_hdr; - u32 packed_param_size = 0; - u8 *packed_param_data = NULL; - struct afe_display_stream_idx stream_data; - struct afe_display_ctl_idx ctl_data; - u32 single_param_size = 0; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&stream_data, 0, sizeof(stream_data)); - memset(&ctl_data, 0, sizeof(ctl_data)); - - packed_param_size = - sizeof(param_hdr) * 2 + sizeof(stream_data) + sizeof(ctl_data); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - packed_param_size = 0; - - /* Set stream index */ - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_HDMI_DP_MST_VID_IDX_CFG; - param_hdr.param_size = sizeof(struct afe_display_stream_idx); - stream_data.minor_version = 1; - stream_data.stream_idx = stream_idx; - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, - (u8 *) &stream_data, &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - /* Set controller dptx index */ - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_HDMI_DPTX_IDX_CFG; - param_hdr.param_size = sizeof(struct afe_display_ctl_idx); - ctl_data.minor_version = 1; - ctl_data.ctl_idx = ctl_idx; - ret = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, (u8 *) &ctl_data, - &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - pr_debug("%s: rx(0x%x) stream(%d) controller(%d)\n", - __func__, rx_port_id, stream_idx, ctl_idx); - - ret = q6afe_set_params(rx_port_id, q6audio_get_port_index(rx_port_id), - NULL, packed_param_data, packed_param_size); - if (ret) - pr_err("%s: AFE display stream send failed for rx_port:%d ret:%d\n", - __func__, rx_port_id, ret); - -done: - kfree(packed_param_data); - return ret; - -} -EXPORT_SYMBOL(afe_set_display_stream); - -int afe_validate_port(u16 port_id) -{ - int ret; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case HDMI_RX: - case DISPLAY_PORT_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - case RSVD_2: - case RSVD_3: - case DIGI_MIC_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case INT_BT_SCO_RX: - case INT_BT_SCO_TX: - case INT_BT_A2DP_RX: - case INT_FM_RX: - case INT_FM_TX: - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SENARY_MI2S_RX: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - case AFE_PORT_ID_SENARY_TDM_TX_7: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_TX: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - { - ret = 0; - break; - } - - default: - pr_err("%s: default ret 0x%x\n", __func__, port_id); - ret = -EINVAL; - } - - return ret; -} - -int afe_convert_virtual_to_portid(u16 port_id) -{ - int ret; - - /* - * if port_id is virtual, convert to physical.. - * if port_id is already physical, return physical - */ - if (afe_validate_port(port_id) < 0) { - if (port_id == RT_PROXY_DAI_001_RX || - port_id == RT_PROXY_DAI_001_TX || - port_id == RT_PROXY_DAI_002_RX || - port_id == RT_PROXY_DAI_002_TX) { - ret = VIRTUAL_ID_TO_PORTID(port_id); - } else { - pr_err("%s: wrong port 0x%x\n", - __func__, port_id); - ret = -EINVAL; - } - } else - ret = port_id; - - return ret; -} -int afe_port_stop_nowait(int port_id) -{ - struct afe_port_cmd_device_stop stop; - int ret = 0; - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - port_id = q6audio_convert_virtual_to_portid(port_id); - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = 0; - stop.hdr.opcode = AFE_PORT_CMD_DEVICE_STOP; - stop.port_id = port_id; - stop.reserved = 0; - - ret = afe_apr_send_pkt(&stop, NULL); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - -fail_cmd: - return ret; - -} - -/** - * afe_close - command to close AFE port - * - * @port_id: AFE port id - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_close(int port_id) -{ - struct afe_port_cmd_device_stop stop; - enum afe_mad_type mad_type; - int ret = 0; - int index = 0; - uint16_t port_index; - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) - pcm_afe_instance[port_id & 0x1] = 0; - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) - proxy_afe_instance[port_id & 0x1] = 0; - afe_close_done[port_id & 0x1] = true; - ret = -EINVAL; - goto fail_cmd; - } - pr_info("%s: port_id = 0x%x\n", __func__, port_id); - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { - pr_debug("%s: before decrementing pcm_afe_instance %d\n", - __func__, pcm_afe_instance[port_id & 0x1]); - port_id = VIRTUAL_ID_TO_PORTID(port_id); - pcm_afe_instance[port_id & 0x1]--; - if ((!(pcm_afe_instance[port_id & 0x1] == 0 && - proxy_afe_instance[port_id & 0x1] == 0)) || - afe_close_done[port_id & 0x1] == true) - return 0; - - afe_close_done[port_id & 0x1] = true; - } - - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - pr_debug("%s: before decrementing proxy_afe_instance %d\n", - __func__, proxy_afe_instance[port_id & 0x1]); - port_id = VIRTUAL_ID_TO_PORTID(port_id); - proxy_afe_instance[port_id & 0x1]--; - if ((!(pcm_afe_instance[port_id & 0x1] == 0 && - proxy_afe_instance[port_id & 0x1] == 0)) || - afe_close_done[port_id & 0x1] == true) - return 0; - - afe_close_done[port_id & 0x1] = true; - } - - port_id = q6audio_convert_virtual_to_portid(port_id); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_warn("%s: Not a valid port id 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - if (mad_type != MAD_HW_NONE && mad_type != MAD_SW_AUDIO) { - pr_debug("%s: Turn off MAD\n", __func__); - ret = afe_turn_onoff_hw_mad(mad_type, false); - if (ret) { - pr_err("%s: afe_turn_onoff_hw_mad failed %d\n", - __func__, ret); - return ret; - } - } else { - pr_debug("%s: Not a MAD port\n", __func__); - } - - mutex_lock(&this_afe.afe_cmd_lock); - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[port_index] = 0; - this_afe.topology[port_index] = 0; - this_afe.dev_acdb_id[port_index] = 0; - } else { - pr_err("%s: port %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - - if ((port_id == this_afe.aanc_info.aanc_tx_port) && - (this_afe.aanc_info.aanc_active)) { - memset(&this_afe.aanc_info, 0x00, sizeof(this_afe.aanc_info)); - ret = afe_aanc_mod_enable(this_afe.apr, port_id, 0); - if (ret) - pr_err("%s: AFE mod disable failed %d\n", - __func__, ret); - } - - /* - * even if ramp down configuration failed it is not serious enough to - * warrant bailaing out. - */ - if (afe_spk_ramp_dn_cfg(port_id) < 0) - pr_err("%s: ramp down configuration failed\n", __func__); - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = index; - stop.hdr.opcode = AFE_PORT_CMD_DEVICE_STOP; - stop.port_id = q6audio_get_port_id(port_id); - stop.reserved = 0; - - ret = afe_apr_send_pkt(&stop, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - -fail_cmd: - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_close); - -int afe_set_digital_codec_core_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg) -{ - struct afe_digital_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /*default rx port is taken to enable the codec digital clock*/ - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_INTERNAL_DIGIATL_CDC_CLK_CONFIG; - param_hdr.param_size = sizeof(struct afe_digital_clk_cfg); - clk_cfg = *cfg; - - pr_debug("%s: Minor version =0x%x clk val = %d\n" - "clk root = 0x%x resrv = 0x%x\n", - __func__, cfg->i2s_cfg_minor_version, cfg->clk_val, - cfg->clk_root, cfg->reserved); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x%x ret %d\n", __func__, - port_id, ret); - return ret; -} - -/** - * afe_set_lpass_clock - Enable AFE lpass clock - * - * @port_id: AFE port id - * @cfg: pointer to clk set struct - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_lpass_clock(u16 port_id, struct afe_clk_cfg *cfg) -{ - struct afe_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - mutex_lock(&this_afe.afe_cmd_lock); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LPAIF_CLK_CONFIG; - param_hdr.param_size = sizeof(clk_cfg); - clk_cfg = *cfg; - - pr_debug("%s: Minor version =0x%x clk val1 = %d\n" - "clk val2 = %d, clk src = 0x%x\n" - "clk root = 0x%x clk mode = 0x%x resrv = 0x%x\n" - "port id = 0x%x\n", - __func__, cfg->i2s_cfg_minor_version, - cfg->clk_val1, cfg->clk_val2, cfg->clk_src, - cfg->clk_root, cfg->clk_set_mode, - cfg->reserved, q6audio_get_port_id(port_id)); - - trace_printk("%s: Minor version =0x%x clk val1 = %d\n" - "clk val2 = %d, clk src = 0x%x\n" - "clk root = 0x%x clk mode = 0x%x resrv = 0x%x\n" - "port id = 0x%x\n", - __func__, cfg->i2s_cfg_minor_version, - cfg->clk_val1, cfg->clk_val2, cfg->clk_src, - cfg->clk_root, cfg->clk_set_mode, - cfg->reserved, q6audio_get_port_id(port_id)); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x%x ret %d\n", - __func__, port_id, ret); - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_set_lpass_clock); - -/** - * afe_set_lpass_clk_cfg - Set AFE clk config - * - * @index: port index - * @cfg: pointer to clk set struct - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - ret = -EINVAL; - return ret; - } - - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: index[%d] invalid!\n", __func__, index); - return -EINVAL; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - mutex_lock(&this_afe.afe_clk_lock); - param_hdr.module_id = AFE_MODULE_CLOCK_SET; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CLOCK_SET; - param_hdr.param_size = sizeof(struct afe_clk_set); - - - pr_debug("%s: Minor version =0x%x clk id = %d\n" - "clk freq (Hz) = %d, clk attri = 0x%x\n" - "clk root = 0x%x clk enable = 0x%x\n", - __func__, cfg->clk_set_minor_version, - cfg->clk_id, cfg->clk_freq_in_hz, cfg->clk_attri, - cfg->clk_root, cfg->enable); - - trace_printk("%s: Minor version =0x%x clk id = %d\n" - "clk freq (Hz) = %d, clk attri = 0x%x\n" - "clk root = 0x%x clk enable = 0x%x\n", - __func__, cfg->clk_set_minor_version, - cfg->clk_id, cfg->clk_freq_in_hz, cfg->clk_attri, - cfg->clk_root, cfg->enable); - - ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr, - (u8 *) cfg); - if (ret < 0) { - pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", - __func__, ret); - trace_printk("%s: AFE clk cfg failed with ret %d\n", - __func__, ret); - } - mutex_unlock(&this_afe.afe_clk_lock); - return ret; -} -EXPORT_SYMBOL(afe_set_lpass_clk_cfg); - -/** - * afe_set_lpass_clock_v2 - Enable AFE lpass clock - * - * @port_id: AFE port id - * @cfg: pointer to clk set struct - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_lpass_clock_v2(u16 port_id, struct afe_clk_set *cfg) -{ - int index = 0; - int ret = 0; - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - ret = afe_set_lpass_clk_cfg(index, cfg); - if (ret) - pr_err("%s: afe_set_lpass_clk_cfg_v2 failed %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(afe_set_lpass_clock_v2); - -int afe_set_lpass_internal_digital_codec_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg) -{ - struct afe_digital_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_INTERNAL_DIGIATL_CDC_CLK_CONFIG; - param_hdr.param_size = sizeof(clk_cfg); - clk_cfg = *cfg; - - pr_debug("%s: Minor version =0x%x clk val = %d\n" - "clk root = 0x%x resrv = 0x%x port id = 0x%x\n", - __func__, cfg->i2s_cfg_minor_version, - cfg->clk_val, cfg->clk_root, cfg->reserved, - q6audio_get_port_id(port_id)); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x0x%x ret %d\n", - __func__, port_id, ret); - - return ret; -} -/** - * afe_enable_lpass_core_shared_clock - - * Configures the core clk on LPASS. - * Need on targets where lpass provides - * clocks - * @port_id: afe port id - * @enable: enable or disable clk - * - * Returns success or failure of call. - */ -int afe_enable_lpass_core_shared_clock(u16 port_id, u32 enable) -{ - struct afe_param_id_lpass_core_shared_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - mutex_lock(&this_afe.afe_cmd_lock); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LPASS_CORE_SHARED_CLOCK_CONFIG; - param_hdr.param_size = sizeof(clk_cfg); - clk_cfg.lpass_core_shared_clk_cfg_minor_version = - AFE_API_VERSION_LPASS_CORE_SHARED_CLK_CONFIG; - clk_cfg.enable = enable; - - pr_debug("%s: port id = %d, enable = %d\n", - __func__, q6audio_get_port_id(port_id), enable); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x%x ret %d\n", - __func__, port_id, ret); - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_enable_lpass_core_shared_clock); - -/** - * q6afe_check_osr_clk_freq - - * Gets supported OSR CLK frequencies - * - * @freq: frequency to check - * - * Returns success if freq is supported. - */ -int q6afe_check_osr_clk_freq(u32 freq) -{ - int ret = 0; - - switch (freq) { - case Q6AFE_LPASS_OSR_CLK_12_P288_MHZ: - case Q6AFE_LPASS_OSR_CLK_9_P600_MHZ: - case Q6AFE_LPASS_OSR_CLK_8_P192_MHZ: - case Q6AFE_LPASS_OSR_CLK_6_P144_MHZ: - case Q6AFE_LPASS_OSR_CLK_4_P096_MHZ: - case Q6AFE_LPASS_OSR_CLK_3_P072_MHZ: - case Q6AFE_LPASS_OSR_CLK_2_P048_MHZ: - case Q6AFE_LPASS_OSR_CLK_1_P536_MHZ: - case Q6AFE_LPASS_OSR_CLK_1_P024_MHZ: - case Q6AFE_LPASS_OSR_CLK_768_kHZ: - case Q6AFE_LPASS_OSR_CLK_512_kHZ: - break; - default: - pr_err("%s: default freq 0x%x\n", - __func__, freq); - ret = -EINVAL; - } - return ret; -} -EXPORT_SYMBOL(q6afe_check_osr_clk_freq); - -static int afe_get_sp_th_vi_v_vali_data( - struct afe_sp_th_vi_v_vali_get_param *th_vi_v_vali) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!th_vi_v_vali) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_TH_VI; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_PARAMS; - param_hdr.param_size = sizeof(struct afe_sp_th_vi_v_vali_params); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret) { - pr_err("%s: Failed to get TH VI V-Vali data\n", __func__); - goto get_params_fail; - } - - th_vi_v_vali->pdata = param_hdr; - memcpy(&th_vi_v_vali->param, &this_afe.th_vi_v_vali_resp.param, - sizeof(this_afe.th_vi_v_vali_resp.param)); - pr_debug("%s: Vrms %d %d status %d %d\n", __func__, - th_vi_v_vali->param.vrms_q24[SP_V2_SPKR_1], - th_vi_v_vali->param.vrms_q24[SP_V2_SPKR_2], - th_vi_v_vali->param.status[SP_V2_SPKR_1], - th_vi_v_vali->param.status[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -int afe_get_sp_th_vi_ftm_data(struct afe_sp_th_vi_get_param *th_vi) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!th_vi) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_TH_VI; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_V2_TH_VI_FTM_PARAMS; - param_hdr.param_size = sizeof(struct afe_sp_th_vi_ftm_params); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret) { - pr_err("%s: Failed to get TH VI FTM data\n", __func__); - goto get_params_fail; - } - - th_vi->pdata = param_hdr; - memcpy(&th_vi->param, &this_afe.th_vi_resp.param, - sizeof(this_afe.th_vi_resp.param)); - pr_debug("%s: DC resistance %d %d temp %d %d status %d %d\n", - __func__, th_vi->param.dc_res_q24[SP_V2_SPKR_1], - th_vi->param.dc_res_q24[SP_V2_SPKR_2], - th_vi->param.temp_q22[SP_V2_SPKR_1], - th_vi->param.temp_q22[SP_V2_SPKR_2], - th_vi->param.status[SP_V2_SPKR_1], - th_vi->param.status[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -int afe_get_sp_ex_vi_ftm_data(struct afe_sp_ex_vi_get_param *ex_vi) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!ex_vi) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_V2_EX_VI_FTM_PARAMS; - param_hdr.param_size = sizeof(struct afe_sp_ex_vi_ftm_params); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x]failed %d\n", - __func__, port, param_hdr.param_id, ret); - goto get_params_fail; - } - - ex_vi->pdata = param_hdr; - memcpy(&ex_vi->param, &this_afe.ex_vi_resp.param, - sizeof(this_afe.ex_vi_resp.param)); - pr_debug("%s: freq %d %d resistance %d %d qfactor %d %d state %d %d\n", - __func__, ex_vi->param.freq_q20[SP_V2_SPKR_1], - ex_vi->param.freq_q20[SP_V2_SPKR_2], - ex_vi->param.resis_q24[SP_V2_SPKR_1], - ex_vi->param.resis_q24[SP_V2_SPKR_2], - ex_vi->param.qmct_q24[SP_V2_SPKR_1], - ex_vi->param.qmct_q24[SP_V2_SPKR_2], - ex_vi->param.status[SP_V2_SPKR_1], - ex_vi->param.status[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -/** - * afe_get_sp_rx_tmax_xmax_logging_data - - * command to get excursion logging data from DSP - * - * @xt_logging: excursion logging params - * @port: AFE port ID - * - * Returns 0 on success or error on failure - */ -int afe_get_sp_rx_tmax_xmax_logging_data( - struct afe_sp_rx_tmax_xmax_logging_param *xt_logging, - u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = -EINVAL; - - if (!xt_logging) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_FB_SPKR_PROT_V2_RX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_RX_TMAX_XMAX_LOGGING; - param_hdr.param_size = sizeof(struct afe_sp_rx_tmax_xmax_logging_param); - - ret = q6afe_get_params(port_id, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x]failed %d\n", - __func__, port_id, param_hdr.param_id, ret); - goto get_params_fail; - } - - memcpy(xt_logging, &this_afe.xt_logging_resp.param, - sizeof(this_afe.xt_logging_resp.param)); - pr_debug("%s: max_excursion %d %d count_exceeded_excursion %d %d max_temperature %d %d count_exceeded_temperature %d %d\n", - __func__, xt_logging->max_excursion[SP_V2_SPKR_1], - xt_logging->max_excursion[SP_V2_SPKR_2], - xt_logging->count_exceeded_excursion[SP_V2_SPKR_1], - xt_logging->count_exceeded_excursion[SP_V2_SPKR_2], - xt_logging->max_temperature[SP_V2_SPKR_1], - xt_logging->max_temperature[SP_V2_SPKR_2], - xt_logging->count_exceeded_temperature[SP_V2_SPKR_1], - xt_logging->count_exceeded_temperature[SP_V2_SPKR_2]); -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} -EXPORT_SYMBOL(afe_get_sp_rx_tmax_xmax_logging_data); - -/** - * afe_get_av_dev_drift - - * command to retrieve AV drift - * - * @timing_stats: timing stats to be updated with AV drift values - * @port: AFE port ID - * - * Returns 0 on success or error on failure - */ -int afe_get_av_dev_drift(struct afe_param_id_dev_timing_stats *timing_stats, - u16 port) -{ - struct param_hdr_v3 param_hdr; - int ret = -EINVAL; - - if (!timing_stats) { - pr_err("%s: Invalid params\n", __func__); - goto exit; - } - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_DEV_TIMING_STATS; - param_hdr.param_size = sizeof(struct afe_param_id_dev_timing_stats); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x] failed %d\n", - __func__, port, param_hdr.param_id, ret); - goto get_params_fail; - } - - memcpy(timing_stats, &this_afe.av_dev_drift_resp.timing_stats, - param_hdr.param_size); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -exit: - return ret; -} -EXPORT_SYMBOL(afe_get_av_dev_drift); - -/** - * afe_get_doa_tracking_mon - - * command to retrieve doa tracking monitor data - * - * @port: AFE port ID - * @doa_tracking_data: param to be updated with doa tracking data - * - * Returns 0 on success or error on failure - */ -int afe_get_doa_tracking_mon(u16 port, - struct doa_tracking_mon_param *doa_tracking_data) -{ - struct param_hdr_v3 param_hdr; - int ret = -EINVAL, i = 0; - - if (!doa_tracking_data) { - pr_err("%s: Invalid params\n", __func__); - goto exit; - } - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_FFNS; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_FFV_DOA_TRACKING_MONITOR; - param_hdr.param_size = sizeof(struct doa_tracking_mon_param); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x] failed %d\n", - __func__, port, param_hdr.param_id, ret); - goto get_params_fail; - } - - memcpy(doa_tracking_data, &this_afe.doa_tracking_mon_resp.doa, - param_hdr.param_size); - for (i = 0; i < MAX_DOA_TRACKING_ANGLES; i++) { - pr_debug("%s: target angle[%d] = %d\n", - __func__, i, doa_tracking_data->target_angle_L16[i]); - pr_debug("%s: interference angle[%d] = %d\n", - __func__, i, doa_tracking_data->interf_angle_L16[i]); - } - -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -exit: - return ret; -} -EXPORT_SYMBOL(afe_get_doa_tracking_mon); - -int afe_spk_prot_get_calib_data(struct afe_spkr_prot_get_vi_calib *calib_resp) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!calib_resp) { - pr_err("%s: Invalid params\n", __func__); - goto fail_cmd; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_FB_SPKR_PROT_VI_PROC_V2; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CALIB_RES_CFG_V2; - param_hdr.param_size = sizeof(struct afe_spkr_prot_get_vi_calib); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x]failed %d\n", - __func__, port, param_hdr.param_id, ret); - goto get_params_fail; - } - memcpy(&calib_resp->res_cfg, &this_afe.calib_data.res_cfg, - sizeof(this_afe.calib_data.res_cfg)); - pr_info("%s: state %s resistance %d %d\n", __func__, - fbsp_state[calib_resp->res_cfg.th_vi_ca_state], - calib_resp->res_cfg.r0_cali_q24[SP_V2_SPKR_1], - calib_resp->res_cfg.r0_cali_q24[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -fail_cmd: - return ret; -} - -/** - * afe_spk_prot_feed_back_cfg - - * command to setup spk protection feedback config - * - * @src_port: source port id - * @dst_port: destination port id - * @l_ch: left speaker active or not - * @r_ch: right speaker active or not - * @enable: flag to enable or disable - * - * Returns 0 on success or error on failure - */ -int afe_spk_prot_feed_back_cfg(int src_port, int dst_port, - int l_ch, int r_ch, u32 enable) -{ - int ret = -EINVAL; - union afe_spkr_prot_config prot_config; - int index = 0; - - if (!enable) { - pr_debug("%s: Disable Feedback tx path", __func__); - this_afe.vi_tx_port = -1; - this_afe.vi_rx_port = -1; - return 0; - } - - if ((q6audio_validate_port(src_port) < 0) || - (q6audio_validate_port(dst_port) < 0)) { - pr_err("%s: invalid ports src 0x%x dst 0x%x", - __func__, src_port, dst_port); - goto fail_cmd; - } - if (!l_ch && !r_ch) { - pr_err("%s: error ch values zero\n", __func__); - goto fail_cmd; - } - pr_debug("%s: src_port 0x%x dst_port 0x%x l_ch %d r_ch %d\n", - __func__, src_port, dst_port, l_ch, r_ch); - memset(&prot_config, 0, sizeof(prot_config)); - prot_config.feedback_path_cfg.dst_portid = - q6audio_get_port_id(dst_port); - if (l_ch) { - prot_config.feedback_path_cfg.chan_info[index++] = 1; - prot_config.feedback_path_cfg.chan_info[index++] = 2; - } - if (r_ch) { - prot_config.feedback_path_cfg.chan_info[index++] = 3; - prot_config.feedback_path_cfg.chan_info[index++] = 4; - } - prot_config.feedback_path_cfg.num_channels = index; - pr_debug("%s no of channels: %d\n", __func__, index); - prot_config.feedback_path_cfg.minor_version = 1; - ret = afe_spk_prot_prepare(src_port, dst_port, - AFE_PARAM_ID_FEEDBACK_PATH_CFG, &prot_config); -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_spk_prot_feed_back_cfg); - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case AFE_COMMON_RX_CAL_TYPE: - ret = AFE_COMMON_RX_CAL; - break; - case AFE_COMMON_TX_CAL_TYPE: - ret = AFE_COMMON_TX_CAL; - break; - case AFE_LSM_TX_CAL_TYPE: - ret = AFE_LSM_TX_CAL; - break; - case AFE_AANC_CAL_TYPE: - ret = AFE_AANC_CAL; - break; - case AFE_HW_DELAY_CAL_TYPE: - ret = AFE_HW_DELAY_CAL; - break; - case AFE_FB_SPKR_PROT_CAL_TYPE: - ret = AFE_FB_SPKR_PROT_CAL; - break; - case AFE_SIDETONE_CAL_TYPE: - ret = AFE_SIDETONE_CAL; - break; - case AFE_SIDETONE_IIR_CAL_TYPE: - ret = AFE_SIDETONE_IIR_CAL; - break; - case AFE_TOPOLOGY_CAL_TYPE: - ret = AFE_TOPOLOGY_CAL; - break; - case AFE_LSM_TOPOLOGY_CAL_TYPE: - ret = AFE_LSM_TOPOLOGY_CAL; - break; - case AFE_CUST_TOPOLOGY_CAL_TYPE: - ret = AFE_CUST_TOPOLOGY_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -int afe_alloc_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - pr_debug("%s: cal_type = %d cal_index = %d\n", - __func__, cal_type, cal_index); - - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - mutex_lock(&this_afe.afe_cmd_lock); - ret = cal_utils_alloc_cal(data_size, data, - this_afe.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - mutex_unlock(&this_afe.afe_cmd_lock); - goto done; - } - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -static int afe_dealloc_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - this_afe.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int afe_set_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - this_afe.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == AFE_CUST_TOPOLOGY_CAL) { - mutex_lock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - this_afe.set_custom_topology = 1; - pr_debug("%s:[AFE_CUSTOM_TOPOLOGY] ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - mutex_unlock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - } - -done: - return ret; -} - -static struct cal_block_data *afe_find_hw_delay_by_path( - struct cal_type_data *cal_type, int path) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - - pr_debug("%s:\n", __func__); - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (((struct audio_cal_info_hw_delay *)cal_block->cal_info) - ->path == path) { - return cal_block; - } - } - return NULL; -} - -static int afe_get_cal_hw_delay(int32_t path, - struct audio_cal_hw_delay_entry *entry) -{ - int ret = 0; - int i; - struct cal_block_data *cal_block = NULL; - struct audio_cal_hw_delay_data *hw_delay_info = NULL; - - pr_debug("%s:\n", __func__); - - if (this_afe.cal_data[AFE_HW_DELAY_CAL] == NULL) { - pr_err("%s: AFE_HW_DELAY_CAL not initialized\n", __func__); - ret = -EINVAL; - goto done; - } - if (entry == NULL) { - pr_err("%s: entry is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - if ((path >= MAX_PATH_TYPE) || (path < 0)) { - pr_err("%s: bad path: %d\n", - __func__, path); - ret = -EINVAL; - goto done; - } - - mutex_lock(&this_afe.cal_data[AFE_HW_DELAY_CAL]->lock); - cal_block = afe_find_hw_delay_by_path( - this_afe.cal_data[AFE_HW_DELAY_CAL], path); - if (cal_block == NULL) - goto unlock; - - hw_delay_info = &((struct audio_cal_info_hw_delay *) - cal_block->cal_info)->data; - if (hw_delay_info->num_entries > MAX_HW_DELAY_ENTRIES) { - pr_err("%s: invalid num entries: %d\n", - __func__, hw_delay_info->num_entries); - ret = -EINVAL; - goto unlock; - } - - for (i = 0; i < hw_delay_info->num_entries; i++) { - if (hw_delay_info->entry[i].sample_rate == - entry->sample_rate) { - entry->delay_usec = hw_delay_info->entry[i].delay_usec; - break; - } - } - if (i == hw_delay_info->num_entries) { - pr_err("%s: Unable to find delay for sample rate %d\n", - __func__, entry->sample_rate); - ret = -EFAULT; - goto unlock; - } - - cal_utils_mark_cal_used(cal_block); - pr_debug("%s: Path = %d samplerate = %u usec = %u status %d\n", - __func__, path, entry->sample_rate, entry->delay_usec, ret); -unlock: - mutex_unlock(&this_afe.cal_data[AFE_HW_DELAY_CAL]->lock); -done: - return ret; -} - -static int afe_set_cal_sp_th_vi_v_vali_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_th_vi_v_vali_cfg *cal_data = data; - - if (cal_data == NULL || data_size != sizeof(*cal_data)) - goto done; - - memcpy(&this_afe.v_vali_cfg, &cal_data->cal_info, - sizeof(this_afe.v_vali_cfg)); -done: - return ret; -} - -static int afe_set_cal_sp_th_vi_ftm_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_th_vi_ftm_cfg *cal_data = data; - - if (cal_data == NULL || data_size != sizeof(*cal_data)) - goto done; - - memcpy(&this_afe.th_ftm_cfg, &cal_data->cal_info, - sizeof(this_afe.th_ftm_cfg)); -done: - return ret; -} - -static int afe_set_cal_sp_th_vi_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_th_vi_ftm_cfg *cal_data = data; - uint32_t mode; - - if (cal_data == NULL || - data_size > sizeof(*cal_data) || - this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - mode = cal_data->cal_info.mode; - pr_debug("%s: cal_type = %d, mode = %d\n", __func__, cal_type, mode); - if (mode == MSM_SPKR_PROT_IN_FTM_MODE) { - ret = afe_set_cal_sp_th_vi_ftm_cfg(cal_type, - data_size, data); - } else if (mode == MSM_SPKR_PROT_IN_V_VALI_MODE) { - ret = afe_set_cal_sp_th_vi_v_vali_cfg(cal_type, - data_size, data); - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); -done: - return ret; -} - -static int afe_set_cal_sp_ex_vi_ftm_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_ex_vi_ftm_cfg *cal_data = data; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - pr_debug("%s: cal_type = %d\n", __func__, cal_type); - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - memcpy(&this_afe.ex_ftm_cfg, &cal_data->cal_info, - sizeof(this_afe.ex_ftm_cfg)); - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); -done: - return ret; -} - -static int afe_set_cal_fb_spkr_prot(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_fb_spk_prot_cfg *cal_data = data; - - pr_debug("%s:\n", __func__); - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL) - goto done; - if (cal_data == NULL) - goto done; - if (data_size != sizeof(*cal_data)) - goto done; - - if (cal_data->cal_info.mode == MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) - __pm_wakeup_event(&wl.ws, jiffies_to_msecs(WAKELOCK_TIMEOUT)); - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - memcpy(&this_afe.prot_cfg, &cal_data->cal_info, - sizeof(this_afe.prot_cfg)); - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); -done: - return ret; -} - -static int afe_get_cal_sp_th_vi_v_vali_param(int32_t cal_type, size_t data_size, - void *data) -{ - int i, ret = 0; - struct audio_cal_type_sp_th_vi_v_vali_param *cal_data = data; - struct afe_sp_th_vi_v_vali_get_param th_vi_v_vali; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - cal_data->cal_info.status[i] = -EINVAL; - cal_data->cal_info.vrms_q24[i] = -1; - } - if (!afe_get_sp_th_vi_v_vali_data(&th_vi_v_vali)) { - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - pr_debug("%s: v-vali param status = %d\n", - __func__, th_vi_v_vali.param.status[i]); - if (th_vi_v_vali.param.status[i] == - V_VALI_IN_PROGRESS) { - cal_data->cal_info.status[i] = -EAGAIN; - } else if (th_vi_v_vali.param.status[i] == - V_VALI_SUCCESS) { - cal_data->cal_info.status[i] = V_VALI_SUCCESS; - cal_data->cal_info.vrms_q24[i] = - th_vi_v_vali.param.vrms_q24[i]; - } - } - } - this_afe.v_vali_flag = 0; -done: - return ret; -} - -static int afe_get_cal_sp_th_vi_ftm_param(int32_t cal_type, size_t data_size, - void *data) -{ - int i, ret = 0; - struct audio_cal_type_sp_th_vi_param *cal_data = data; - struct afe_sp_th_vi_get_param th_vi; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - cal_data->cal_info.status[i] = -EINVAL; - cal_data->cal_info.r_dc_q24[i] = -1; - cal_data->cal_info.temp_q22[i] = -1; - } - if (!afe_get_sp_th_vi_ftm_data(&th_vi)) { - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - pr_debug("%s: ftm param status = %d\n", - __func__, th_vi.param.status[i]); - if (th_vi.param.status[i] == FBSP_IN_PROGRESS) { - cal_data->cal_info.status[i] = -EAGAIN; - } else if (th_vi.param.status[i] == FBSP_SUCCESS) { - cal_data->cal_info.status[i] = 0; - cal_data->cal_info.r_dc_q24[i] = - th_vi.param.dc_res_q24[i]; - cal_data->cal_info.temp_q22[i] = - th_vi.param.temp_q22[i]; - } - } - } -done: - return ret; -} - -static int afe_get_cal_sp_th_vi_param(int32_t cal_type, size_t data_size, - void *data) -{ - struct audio_cal_type_sp_th_vi_param *cal_data = data; - uint32_t mode; - int ret = 0; - - if (cal_data == NULL || - data_size > sizeof(*cal_data) || - this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL) - return 0; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - mode = cal_data->cal_info.mode; - pr_debug("%s: cal_type = %d,mode = %d\n", __func__, cal_type, mode); - if (mode == MSM_SPKR_PROT_IN_V_VALI_MODE) - ret = afe_get_cal_sp_th_vi_v_vali_param(cal_type, - data_size, data); - else - ret = afe_get_cal_sp_th_vi_ftm_param(cal_type, - data_size, data); - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - return ret; -} - -static int afe_get_cal_sp_ex_vi_ftm_param(int32_t cal_type, size_t data_size, - void *data) -{ - int i, ret = 0; - struct audio_cal_type_sp_ex_vi_param *cal_data = data; - struct afe_sp_ex_vi_get_param ex_vi; - - pr_debug("%s: cal_type = %d\n", __func__, cal_type); - if (this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - cal_data->cal_info.status[i] = -EINVAL; - cal_data->cal_info.freq_q20[i] = -1; - cal_data->cal_info.resis_q24[i] = -1; - cal_data->cal_info.qmct_q24[i] = -1; - } - if (!afe_get_sp_ex_vi_ftm_data(&ex_vi)) { - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - pr_debug("%s: ftm param status = %d\n", - __func__, ex_vi.param.status[i]); - if (ex_vi.param.status[i] == FBSP_IN_PROGRESS) { - cal_data->cal_info.status[i] = -EAGAIN; - } else if (ex_vi.param.status[i] == FBSP_SUCCESS) { - cal_data->cal_info.status[i] = 0; - cal_data->cal_info.freq_q20[i] = - ex_vi.param.freq_q20[i]; - cal_data->cal_info.resis_q24[i] = - ex_vi.param.resis_q24[i]; - cal_data->cal_info.qmct_q24[i] = - ex_vi.param.qmct_q24[i]; - } - } - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); -done: - return ret; -} - -static int afe_get_cal_fb_spkr_prot(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_fb_spk_prot_status *cal_data = data; - struct afe_spkr_prot_get_vi_calib calib_resp; - - pr_debug("%s:\n", __func__); - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL) - goto done; - if (cal_data == NULL) - goto done; - if (data_size != sizeof(*cal_data)) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - if (this_afe.prot_cfg.mode == MSM_SPKR_PROT_CALIBRATED) { - cal_data->cal_info.r0[SP_V2_SPKR_1] = - this_afe.prot_cfg.r0[SP_V2_SPKR_1]; - cal_data->cal_info.r0[SP_V2_SPKR_2] = - this_afe.prot_cfg.r0[SP_V2_SPKR_2]; - cal_data->cal_info.status = 0; - } else if (this_afe.prot_cfg.mode == - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) { - /*Call AFE to query the status*/ - cal_data->cal_info.status = -EINVAL; - cal_data->cal_info.r0[SP_V2_SPKR_1] = -1; - cal_data->cal_info.r0[SP_V2_SPKR_2] = -1; - if (!afe_spk_prot_get_calib_data(&calib_resp)) { - if (calib_resp.res_cfg.th_vi_ca_state == - FBSP_IN_PROGRESS) - cal_data->cal_info.status = -EAGAIN; - else if (calib_resp.res_cfg.th_vi_ca_state == - FBSP_SUCCESS) { - cal_data->cal_info.status = 0; - cal_data->cal_info.r0[SP_V2_SPKR_1] = - calib_resp.res_cfg.r0_cali_q24[SP_V2_SPKR_1]; - cal_data->cal_info.r0[SP_V2_SPKR_2] = - calib_resp.res_cfg.r0_cali_q24[SP_V2_SPKR_2]; - } - } - if (!cal_data->cal_info.status) { - this_afe.prot_cfg.mode = - MSM_SPKR_PROT_CALIBRATED; - this_afe.prot_cfg.r0[SP_V2_SPKR_1] = - cal_data->cal_info.r0[SP_V2_SPKR_1]; - this_afe.prot_cfg.r0[SP_V2_SPKR_2] = - cal_data->cal_info.r0[SP_V2_SPKR_2]; - } - } else { - /*Indicates calibration data is invalid*/ - cal_data->cal_info.status = -EINVAL; - cal_data->cal_info.r0[SP_V2_SPKR_1] = -1; - cal_data->cal_info.r0[SP_V2_SPKR_2] = -1; - } - this_afe.initial_cal = 0; - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - __pm_relax(&wl.ws); -done: - return ret; -} - -static int afe_map_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - atomic_set(&this_afe.mem_map_cal_index, cal_index); - ret = afe_cmd_memory_map(cal_block->cal_data.paddr, - cal_block->map_data.map_size); - atomic_set(&this_afe.mem_map_cal_index, -1); - if (ret < 0) { - pr_err("%s: mmap did not work! size = %zd ret %d\n", - __func__, - cal_block->map_data.map_size, ret); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_afe. - mem_map_cal_handles[cal_index]); -done: - return ret; -} - -static int afe_unmap_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", - __func__); - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_err("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - atomic_set(&this_afe.mem_map_cal_handles[cal_index], - cal_block->map_data.q6map_handle); - atomic_set(&this_afe.mem_map_cal_index, cal_index); - ret = afe_cmd_memory_unmap_nowait( - cal_block->map_data.q6map_handle); - atomic_set(&this_afe.mem_map_cal_index, -1); - if (ret < 0) { - pr_err("%s: unmap did not work! cal_type %i ret %d\n", - __func__, cal_index, ret); - } - cal_block->map_data.q6map_handle = 0; -done: - return ret; -} - -static void afe_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(MAX_AFE_CAL_TYPES, this_afe.cal_data); -} - -static int afe_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{AFE_COMMON_RX_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_COMMON_TX_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_LSM_TX_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_AANC_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_FB_SPKR_PROT_CAL_TYPE, - {NULL, NULL, NULL, afe_set_cal_fb_spkr_prot, - afe_get_cal_fb_spkr_prot, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_HW_DELAY_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_SIDETONE_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_SIDETONE_IIR_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, - cal_utils_match_buf_num} }, - - {{AFE_LSM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, - cal_utils_match_buf_num} }, - - {{AFE_CUST_TOPOLOGY_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE, - {NULL, NULL, NULL, afe_set_cal_sp_th_vi_cfg, - afe_get_cal_sp_th_vi_param, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE, - {NULL, NULL, NULL, afe_set_cal_sp_ex_vi_ftm_cfg, - afe_get_cal_sp_ex_vi_ftm_param, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(MAX_AFE_CAL_TYPES, this_afe.cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type! %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - return ret; -err: - afe_delete_cal_data(); - return ret; -} - -int afe_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - result = -EINVAL; - goto done; - } - - result = afe_cmd_memory_map(cal_block->cal_data.paddr, - cal_block->map_data.map_size); - if (result < 0) { - pr_err("%s: afe_cmd_memory_map failed for addr = 0x%pK, size = %d, err %d\n", - __func__, &cal_block->cal_data.paddr, - cal_block->map_data.map_size, result); - return result; - } - cal_block->map_data.map_handle = this_afe.mmap_handle; - -done: - return result; -} - -int afe_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (mem_map_handle == NULL) { - pr_err("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - goto done; - } - - result = afe_cmd_memory_unmap(*mem_map_handle); - if (result) { - pr_err("%s: AFE memory unmap failed %d, handle 0x%x\n", - __func__, result, *mem_map_handle); - goto done; - } else { - *mem_map_handle = 0; - } - -done: - return result; -} - -static void afe_release_uevent_data(struct kobject *kobj) -{ - struct audio_uevent_data *data = container_of(kobj, - struct audio_uevent_data, kobj); - - kfree(data); -} - -int __init afe_init(void) -{ - int i = 0, ret; - - atomic_set(&this_afe.state, 0); - atomic_set(&this_afe.status, 0); - atomic_set(&this_afe.clk_state, 0); - atomic_set(&this_afe.clk_status, 0); - atomic_set(&this_afe.mem_map_cal_index, -1); - this_afe.apr = NULL; - this_afe.dtmf_gen_rx_portid = -1; - this_afe.mmap_handle = 0; - this_afe.vi_tx_port = -1; - this_afe.vi_rx_port = -1; - for (i = 0; i < AFE_LPASS_CORE_HW_VOTE_MAX; i++) - this_afe.lpass_hw_core_client_hdl[i] = 0; - this_afe.prot_cfg.mode = MSM_SPKR_PROT_DISABLED; - this_afe.th_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - this_afe.ex_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - mutex_init(&this_afe.afe_cmd_lock); - mutex_init(&this_afe.afe_apr_lock); - mutex_init(&this_afe.afe_clk_lock); - for (i = 0; i < AFE_MAX_PORTS; i++) { - this_afe.afe_cal_mode[i] = AFE_CAL_MODE_DEFAULT; - this_afe.afe_sample_rates[i] = 0; - this_afe.dev_acdb_id[i] = 0; - this_afe.island_mode[i] = 0; - this_afe.vad_cfg[i].is_enable = 0; - this_afe.vad_cfg[i].pre_roll = 0; - init_waitqueue_head(&this_afe.wait[i]); - } - init_waitqueue_head(&this_afe.wait_wakeup); - init_waitqueue_head(&this_afe.lpass_core_hw_wait); - init_waitqueue_head(&this_afe.clk_wait); - wakeup_source_init(&wl.ws, "spkr-prot"); - ret = afe_init_cal_data(); - if (ret) - pr_err("%s: could not init cal data! %d\n", __func__, ret); - - config_debug_fs_init(); - - this_afe.uevent_data = kzalloc(sizeof(*(this_afe.uevent_data)), GFP_KERNEL); - if (!this_afe.uevent_data) - return -ENOMEM; - - /* - * Set release function to cleanup memory related to kobject - * before initializing the kobject. - */ - this_afe.uevent_data->ktype.release = afe_release_uevent_data; - q6core_init_uevent_data(this_afe.uevent_data, "q6afe_uevent"); - - INIT_WORK(&this_afe.afe_dc_work, afe_notify_dc_presence_work_fn); - INIT_WORK(&this_afe.afe_spdif_work, - afe_notify_spdif_fmt_update_work_fn); - - this_afe.event_notifier.notifier_call = afe_aud_event_notify; - msm_aud_evt_blocking_register_client(&this_afe.event_notifier); - - return 0; -} - -void afe_exit(void) -{ - if (this_afe.apr) { - apr_reset(this_afe.apr); - atomic_set(&this_afe.state, 0); - this_afe.apr = NULL; - rtac_set_afe_handle(this_afe.apr); - } - - q6core_destroy_uevent_data(this_afe.uevent_data); - - afe_delete_cal_data(); - - config_debug_fs_exit(); - mutex_destroy(&this_afe.afe_cmd_lock); - mutex_destroy(&this_afe.afe_apr_lock); - mutex_destroy(&this_afe.afe_clk_lock); - wakeup_source_trash(&wl.ws); -} - -/* - * afe_cal_init_hwdep - - * Initiliaze AFE HW dependent Node - * - * @card: pointer to sound card - * - */ -int afe_cal_init_hwdep(void *card) -{ - int ret = 0; - - this_afe.fw_data = kzalloc(sizeof(*(this_afe.fw_data)), - GFP_KERNEL); - if (!this_afe.fw_data) - return -ENOMEM; - - set_bit(Q6AFE_VAD_CORE_CAL, this_afe.fw_data->cal_bit); - ret = q6afe_cal_create_hwdep(this_afe.fw_data, Q6AFE_HWDEP_NODE, card); - if (ret < 0) { - pr_err("%s: couldn't create hwdep for AFE %d\n", __func__, ret); - return ret; - } - return ret; -} -EXPORT_SYMBOL(afe_cal_init_hwdep); - -/* - * afe_vote_lpass_core_hw - - * Voting for lpass core hardware - * - * @hw_block_id: id of the hardware block - * @client_name: client name - * @client_handle: client handle - * - */ -int afe_vote_lpass_core_hw(uint32_t hw_block_id, char *client_name, - uint32_t *client_handle) -{ - struct afe_cmd_remote_lpass_core_hw_vote_request hw_vote_cfg; - struct afe_cmd_remote_lpass_core_hw_vote_request *cmd_ptr = - &hw_vote_cfg; - int ret = 0; - - if (!client_handle) { - pr_err("%s: Invalid client_handle\n", __func__); - return -EINVAL; - } - - if (!client_name) { - pr_err("%s: Invalid client_name\n", __func__); - *client_handle = 0; - return -EINVAL; - } - - ret = afe_q6_interface_prepare(); - if(ret) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - mutex_lock(&this_afe.afe_clk_lock); - - memset(cmd_ptr, 0, sizeof(hw_vote_cfg)); - - cmd_ptr->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cmd_ptr->hdr.pkt_size = sizeof(hw_vote_cfg); - cmd_ptr->hdr.src_port = 0; - cmd_ptr->hdr.dest_port = 0; - cmd_ptr->hdr.token = hw_block_id; - cmd_ptr->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST; - cmd_ptr->hw_block_id = hw_block_id; - strlcpy(cmd_ptr->client_name, client_name, - sizeof(cmd_ptr->client_name)); - - pr_debug("%s: lpass core hw vote opcode[0x%x] hw id[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id); - - trace_printk("%s: lpass core hw vote opcode[0x%x] hw id[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id); - *client_handle = 0; - - ret = afe_apr_send_clk_pkt((uint32_t *)cmd_ptr, - &this_afe.lpass_core_hw_wait); - if (ret == 0) { - *client_handle = this_afe.lpass_hw_core_client_hdl[hw_block_id]; - pr_debug("%s: lpass_hw_core_client_hdl %d\n", __func__, - this_afe.lpass_hw_core_client_hdl[hw_block_id]); - } - mutex_unlock(&this_afe.afe_clk_lock); - return ret; -} -EXPORT_SYMBOL(afe_vote_lpass_core_hw); - -/* - * afe_unvote_lpass_core_hw - - * unvoting for lpass core hardware - * - * @hw_block_id: id of the hardware block - * @client_handle: client handle - * - */ -int afe_unvote_lpass_core_hw(uint32_t hw_block_id, uint32_t client_handle) -{ - struct afe_cmd_remote_lpass_core_hw_devote_request hw_vote_cfg; - struct afe_cmd_remote_lpass_core_hw_devote_request *cmd_ptr = - &hw_vote_cfg; - int ret = 0; - - ret = afe_q6_interface_prepare(); - if(ret) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - mutex_lock(&this_afe.afe_clk_lock); - - if (!this_afe.lpass_hw_core_client_hdl[hw_block_id]) { - pr_debug("%s: SSR in progress, return\n", __func__); - trace_printk("%s: SSR in progress, return\n", __func__); - goto done; - } - - memset(cmd_ptr, 0, sizeof(hw_vote_cfg)); - - cmd_ptr->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cmd_ptr->hdr.pkt_size = sizeof(hw_vote_cfg); - cmd_ptr->hdr.src_port = 0; - cmd_ptr->hdr.dest_port = 0; - cmd_ptr->hdr.token = 0; - cmd_ptr->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST; - cmd_ptr->hw_block_id = hw_block_id; - cmd_ptr->client_handle = client_handle; - - pr_debug("%s: lpass core hw unvote opcode[0x%x] hw id[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id); - - trace_printk("%s: lpass core hw unvote opcode[0x%x] hw id[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id); - - if (cmd_ptr->client_handle <= 0) { - pr_err("%s: invalid client handle\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = afe_apr_send_clk_pkt((uint32_t *)cmd_ptr, - &this_afe.lpass_core_hw_wait); -done: - mutex_unlock(&this_afe.afe_clk_lock); - return ret; -} -EXPORT_SYMBOL(afe_unvote_lpass_core_hw); diff --git a/techpack/audio/4.0/dsp/q6afecal-hwdep.c b/techpack/audio/4.0/dsp/q6afecal-hwdep.c deleted file mode 100644 index 810634f57b95..000000000000 --- a/techpack/audio/4.0/dsp/q6afecal-hwdep.c +++ /dev/null @@ -1,226 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015, 2017 - 2018, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include "q6afecal-hwdep.h" - -const int cal_size_info[Q6AFE_MAX_CAL] = { - [Q6AFE_VAD_CORE_CAL] = 132, -}; - -const char *cal_name_info[Q6AFE_MAX_CAL] = { - [Q6AFE_VAD_CORE_CAL] = "vad_core", -}; - -#define AFE_HW_NAME_LENGTH 40 - -/* - * q6afecal_get_fw_cal - - * To get calibration from AFE HW dependent node - * - * @fw_data: pointer to firmware data - * type: AFE calibration type - * - */ -struct firmware_cal *q6afecal_get_fw_cal(struct afe_fw_info *fw_data, - enum q6afe_cal_type type) -{ - if (!fw_data) { - pr_err("%s: fw_data is NULL\n", __func__); - return NULL; - } - if (type >= Q6AFE_MAX_CAL || - type < Q6AFE_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", __func__, type); - return NULL; - } - mutex_lock(&fw_data->lock); - if (!test_bit(Q6AFECAL_RECEIVED, - &fw_data->q6afecal_state[type])) { - pr_err("%s: cal not sent by userspace %d\n", - __func__, type); - mutex_unlock(&fw_data->lock); - return NULL; - } - set_bit(Q6AFECAL_INITIALISED, &fw_data->q6afecal_state[type]); - mutex_unlock(&fw_data->lock); - return fw_data->fw[type]; -} -EXPORT_SYMBOL(q6afecal_get_fw_cal); - -static int q6afecal_hwdep_ioctl_shared(struct snd_hwdep *hw, - struct q6afecal_ioctl_buffer fw_user) -{ - struct afe_fw_info *fw_data = hw->private_data; - struct firmware_cal **fw = fw_data->fw; - void *data; - - if (!test_bit(fw_user.cal_type, fw_data->cal_bit)) { - pr_err("%s: q6afe didn't set this %d!!\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.cal_type >= Q6AFE_MAX_CAL || - fw_user.cal_type < Q6AFE_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.size > cal_size_info[fw_user.cal_type] || - fw_user.size <= 0) { - pr_err("%s: incorrect firmware size %d for %s\n", - __func__, fw_user.size, - cal_name_info[fw_user.cal_type]); - return -EFAULT; - } - data = fw[fw_user.cal_type]->data; - if (copy_from_user(data, fw_user.buffer, fw_user.size)) - return -EFAULT; - fw[fw_user.cal_type]->size = fw_user.size; - mutex_lock(&fw_data->lock); - set_bit(Q6AFECAL_RECEIVED, &fw_data->q6afecal_state[fw_user.cal_type]); - mutex_unlock(&fw_data->lock); - return 0; -} - -#ifdef CONFIG_COMPAT -struct q6afecal_ioctl_buffer32 { - u32 size; - compat_uptr_t buffer; - enum q6afe_cal_type cal_type; -}; - -enum { - SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32 = - _IOW('U', 0x1, struct q6afecal_ioctl_buffer32), -}; - -static int q6afecal_hwdep_ioctl_compat(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6afecal_ioctl_buffer __user *argp = (void __user *)arg; - struct q6afecal_ioctl_buffer32 fw_user32; - struct q6afecal_ioctl_buffer fw_user_compat; - - if (cmd != SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32) { - pr_err("%s: wrong ioctl command sent %u!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user32, argp, sizeof(fw_user32))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - fw_user_compat.size = fw_user32.size; - fw_user_compat.buffer = compat_ptr(fw_user32.buffer); - fw_user_compat.cal_type = fw_user32.cal_type; - return q6afecal_hwdep_ioctl_shared(hw, fw_user_compat); -} -#else -#define q6afecal_hwdep_ioctl_compat NULL -#endif - -static int q6afecal_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6afecal_ioctl_buffer __user *argp = (void __user *)arg; - struct q6afecal_ioctl_buffer fw_user; - - if (cmd != SNDRV_IOCTL_HWDEP_VAD_CAL_TYPE) { - pr_err("%s: wrong ioctl command sent %d!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user, argp, sizeof(fw_user))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - return q6afecal_hwdep_ioctl_shared(hw, fw_user); -} - -static int q6afecal_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ - struct afe_fw_info *fw_data = hw->private_data; - - mutex_lock(&fw_data->lock); - /* clear all the calibrations */ - memset(fw_data->q6afecal_state, 0, - sizeof(fw_data->q6afecal_state)); - mutex_unlock(&fw_data->lock); - return 0; -} - -/** - * q6afe_cal_create_hwdep - - * for creating HW dependent node for AFE - * - * @data: Pointer to hold fw data - * @node: node type - * @card: Pointer to sound card - * - */ -int q6afe_cal_create_hwdep(void *data, int node, void *card) -{ - char hwname[AFE_HW_NAME_LENGTH]; - struct snd_hwdep *hwdep; - struct firmware_cal **fw; - struct afe_fw_info *fw_data = data; - int err, cal_bit; - - if (!fw_data || !card) { - pr_err("%s: Invalid parameters\n", __func__); - return -EINVAL; - } - - fw = fw_data->fw; - snprintf(hwname, strlen("Q6AFE"), "Q6AFE"); - err = snd_hwdep_new(((struct snd_soc_card *)card)->snd_card, - hwname, node, &hwdep); - if (err < 0) { - pr_err("%s: new hwdep for q6afe failed %d\n", __func__, err); - return err; - } - snprintf(hwdep->name, strlen("Q6AFECAL"), "Q6AFECAL"); - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_BE; - hwdep->private_data = fw_data; - hwdep->ops.ioctl_compat = q6afecal_hwdep_ioctl_compat; - hwdep->ops.ioctl = q6afecal_hwdep_ioctl; - hwdep->ops.release = q6afecal_hwdep_release; - mutex_init(&fw_data->lock); - - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - set_bit(Q6AFECAL_UNINITIALISED, - &fw_data->q6afecal_state[cal_bit]); - fw[cal_bit] = kzalloc(sizeof *(fw[cal_bit]), GFP_KERNEL); - if (!fw[cal_bit]) { - pr_err("%s: no memory for %s cal\n", - __func__, cal_name_info[cal_bit]); - goto end; - } - } - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - fw[cal_bit]->data = kzalloc(cal_size_info[cal_bit], - GFP_KERNEL); - if (!fw[cal_bit]->data) - goto exit; - set_bit(Q6AFECAL_INITIALISED, - &fw_data->q6afecal_state[cal_bit]); - } - return 0; -exit: - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - kfree(fw[cal_bit]->data); - fw[cal_bit]->data = NULL; - } -end: - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - kfree(fw[cal_bit]); - fw[cal_bit] = NULL; - } - return -ENOMEM; -} -EXPORT_SYMBOL(q6afe_cal_create_hwdep); diff --git a/techpack/audio/4.0/dsp/q6afecal-hwdep.h b/techpack/audio/4.0/dsp/q6afecal-hwdep.h deleted file mode 100644 index 68c48b71088a..000000000000 --- a/techpack/audio/4.0/dsp/q6afecal-hwdep.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2014, 2018, The Linux Foundation. All rights reserved. - */ -#ifndef __Q6AFECAL_HWDEP_H__ -#define __Q6AFECAL_HWDEP_H__ -#include - -enum q6afe_cal_states { - Q6AFECAL_UNINITIALISED, - Q6AFECAL_INITIALISED, - Q6AFECAL_RECEIVED -}; - -struct afe_fw_info { - struct firmware_cal *fw[Q6AFE_MAX_CAL]; - DECLARE_BITMAP(cal_bit, Q6AFE_MAX_CAL); - /* for calibration tracking */ - unsigned long q6afecal_state[Q6AFE_MAX_CAL]; - struct mutex lock; -}; - -struct firmware_cal { - u8 *data; - size_t size; -}; - -#if IS_ENABLED(CONFIG_AFE_HWDEP) -int q6afe_cal_create_hwdep(void *fw, int node, void *card); -struct firmware_cal *q6afecal_get_fw_cal(struct afe_fw_info *fw_data, - enum q6afe_cal_type type); -#else /* CONFIG_AFE_HWDEP */ -static inline int q6afe_cal_create_hwdep(void *fw, int node, void *card) -{ - return 0; -} - -static inline struct firmware_cal *q6afecal_get_fw_cal( - struct afe_fw_info *fw_data, - enum q6afe_cal_type type) -{ - return NULL; -} -#endif /* CONFIG_AFE_HWDEP */ -#endif /* __Q6AFECAL_HWDEP_H__ */ diff --git a/techpack/audio/4.0/dsp/q6asm.c b/techpack/audio/4.0/dsp/q6asm.c deleted file mode 100644 index bb1df5b24432..000000000000 --- a/techpack/audio/4.0/dsp/q6asm.c +++ /dev/null @@ -1,11331 +0,0 @@ -/* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define TIMEOUT_MS 1000 -#define TRUE 0x01 -#define FALSE 0x00 -#define SESSION_MAX 8 - -#define ENC_FRAMES_PER_BUFFER 0x01 - -enum { - ASM_TOPOLOGY_CAL = 0, - ASM_CUSTOM_TOP_CAL, - ASM_AUDSTRM_CAL, - ASM_RTAC_APR_CAL, - ASM_MAX_CAL_TYPES -}; - -union asm_token_struct { - struct { - u8 stream_id; - u8 session_id; - u8 buf_index; - u8 flags; - } _token; - u32 token; -} __packed; - - -enum { - ASM_DIRECTION_OFFSET, - ASM_CMD_NO_WAIT_OFFSET, - /* - * Offset is limited to 7 because flags is stored in u8 - * field in asm_token_structure defined above. The offset - * starts from 0. - */ - ASM_MAX_OFFSET = 7, -}; - -enum { - WAIT_CMD, - NO_WAIT_CMD -}; - -#define ASM_SET_BIT(n, x) (n |= 1 << x) -#define ASM_TEST_BIT(n, x) ((n >> x) & 1) - -/* TODO, combine them together */ -static DEFINE_MUTEX(session_lock); -struct asm_mmap { - atomic_t ref_cnt; - void *apr; -}; - -static struct asm_mmap this_mmap; - -struct audio_session { - struct audio_client *ac; - spinlock_t session_lock; - struct mutex mutex_lock_per_session; -}; -/* session id: 0 reserved */ -static struct audio_session session[ASM_ACTIVE_STREAMS_ALLOWED + 1]; - -struct asm_buffer_node { - struct list_head list; - phys_addr_t buf_phys_addr; - uint32_t mmap_hdl; -}; -static int32_t q6asm_srvc_callback(struct apr_client_data *data, void *priv); -static int32_t q6asm_callback(struct apr_client_data *data, void *priv); -static void q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg); -static void q6asm_add_hdr_custom_topology(struct audio_client *ac, - struct apr_hdr *hdr, - uint32_t pkt_size); -static void q6asm_add_hdr_async(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg); -static int q6asm_memory_map_regions(struct audio_client *ac, int dir, - uint32_t bufsz, uint32_t bufcnt, - bool is_contiguous); -static int q6asm_memory_unmap_regions(struct audio_client *ac, int dir); -static void q6asm_reset_buf_state(struct audio_client *ac); - -void *q6asm_mmap_apr_reg(void); - -static int q6asm_is_valid_session(struct apr_client_data *data, void *priv); -static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info); - -/* for ASM custom topology */ -static struct cal_type_data *cal_data[ASM_MAX_CAL_TYPES]; -static struct audio_buffer common_buf[2]; -static struct audio_client common_client; -static int set_custom_topology; -static int topology_map_handle; - -struct generic_get_data_ { - int valid; - int is_inband; - int size_in_ints; - int ints[]; -}; -static struct generic_get_data_ *generic_get_data; - -static inline void q6asm_set_flag_in_token(union asm_token_struct *asm_token, - int flag, int flag_offset) -{ - if (flag) - ASM_SET_BIT(asm_token->_token.flags, flag_offset); -} - -static inline int q6asm_get_flag_from_token(union asm_token_struct *asm_token, - int flag_offset) -{ - return ASM_TEST_BIT(asm_token->_token.flags, flag_offset); -} - -static inline void q6asm_update_token(u32 *token, u8 session_id, u8 stream_id, - u8 buf_index, u8 dir, u8 nowait_flag) -{ - union asm_token_struct asm_token; - - asm_token.token = 0; - asm_token._token.session_id = session_id; - asm_token._token.stream_id = stream_id; - asm_token._token.buf_index = buf_index; - q6asm_set_flag_in_token(&asm_token, dir, ASM_DIRECTION_OFFSET); - q6asm_set_flag_in_token(&asm_token, nowait_flag, - ASM_CMD_NO_WAIT_OFFSET); - *token = asm_token.token; -} - -static inline uint32_t q6asm_get_pcm_format_id(uint32_t media_format_block_ver) -{ - uint32_t pcm_format_id; - - switch (media_format_block_ver) { - case PCM_MEDIA_FORMAT_V5: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5; - break; - case PCM_MEDIA_FORMAT_V4: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4; - break; - case PCM_MEDIA_FORMAT_V3: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - break; - case PCM_MEDIA_FORMAT_V2: - default: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - break; - } - return pcm_format_id; -} - -/* - * q6asm_get_buf_index_from_token: - * Retrieve buffer index from token. - * - * @token: token value sent to ASM service on q6. - * Returns buffer index in the read/write commands. - */ -uint8_t q6asm_get_buf_index_from_token(uint32_t token) -{ - union asm_token_struct asm_token; - - asm_token.token = token; - return asm_token._token.buf_index; -} -EXPORT_SYMBOL(q6asm_get_buf_index_from_token); - -/* - * q6asm_get_stream_id_from_token: - * Retrieve stream id from token. - * - * @token: token value sent to ASM service on q6. - * Returns stream id. - */ -uint8_t q6asm_get_stream_id_from_token(uint32_t token) -{ - union asm_token_struct asm_token; - - asm_token.token = token; - return asm_token._token.stream_id; -} -EXPORT_SYMBOL(q6asm_get_stream_id_from_token); - -static uint32_t adsp_reg_event_opcode[] = { - ASM_STREAM_CMD_REGISTER_PP_EVENTS, - ASM_STREAM_CMD_REGISTER_ENCDEC_EVENTS, - ASM_STREAM_CMD_REGISTER_IEC_61937_FMT_UPDATE }; - -static int is_adsp_reg_event(uint32_t cmd) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(adsp_reg_event_opcode); i++) { - if (cmd == adsp_reg_event_opcode[i]) - return i; - } - return -EINVAL; -} - -static uint32_t adsp_raise_event_opcode[] = { - ASM_STREAM_PP_EVENT, - ASM_STREAM_CMD_ENCDEC_EVENTS, - ASM_IEC_61937_MEDIA_FMT_EVENT }; - -static int is_adsp_raise_event(uint32_t cmd) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(adsp_raise_event_opcode); i++) { - if (cmd == adsp_raise_event_opcode[i]) - return i; - } - return -EINVAL; -} - -#ifdef CONFIG_DEBUG_FS -#define OUT_BUFFER_SIZE 56 -#define IN_BUFFER_SIZE 24 - -static struct timeval out_cold_tv; -static struct timeval out_warm_tv; -static struct timeval out_cont_tv; -static struct timeval in_cont_tv; -static long out_enable_flag; -static long in_enable_flag; -static struct dentry *out_dentry; -static struct dentry *in_dentry; -static int in_cont_index; -/*This var is used to keep track of first write done for cold output latency */ -static int out_cold_index; -static char *out_buffer; -static char *in_buffer; - -static int audio_output_latency_dbgfs_open(struct inode *inode, - struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} -static ssize_t audio_output_latency_dbgfs_read(struct file *file, - char __user *buf, size_t count, loff_t *ppos) -{ - if (out_buffer == NULL) { - pr_err("%s: out_buffer is null\n", __func__); - return 0; - } - if (count < OUT_BUFFER_SIZE) { - pr_err("%s: read size %d exceeds buf size %zd\n", __func__, - OUT_BUFFER_SIZE, count); - return 0; - } - snprintf(out_buffer, OUT_BUFFER_SIZE, "%ld,%ld,%ld,%ld,%ld,%ld,", - out_cold_tv.tv_sec, out_cold_tv.tv_usec, out_warm_tv.tv_sec, - out_warm_tv.tv_usec, out_cont_tv.tv_sec, out_cont_tv.tv_usec); - return simple_read_from_buffer(buf, OUT_BUFFER_SIZE, ppos, - out_buffer, OUT_BUFFER_SIZE); -} -static ssize_t audio_output_latency_dbgfs_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - char *temp; - - if (count > 2*sizeof(char)) { - pr_err("%s: err count is more %zd\n", __func__, count); - return -EINVAL; - } - temp = kmalloc(2*sizeof(char), GFP_KERNEL); - - out_cold_index = 0; - - if (temp) { - if (copy_from_user(temp, buf, 2*sizeof(char))) { - pr_err("%s: copy from user failed for size %zd\n", - __func__, 2*sizeof(char)); - kfree(temp); - return -EFAULT; - } - if (!kstrtol(temp, 10, &out_enable_flag)) { - kfree(temp); - return count; - } - kfree(temp); - } - return -EINVAL; -} -static const struct file_operations audio_output_latency_debug_fops = { - .open = audio_output_latency_dbgfs_open, - .read = audio_output_latency_dbgfs_read, - .write = audio_output_latency_dbgfs_write -}; -static int audio_input_latency_dbgfs_open(struct inode *inode, - struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} -static ssize_t audio_input_latency_dbgfs_read(struct file *file, - char __user *buf, size_t count, loff_t *ppos) -{ - if (in_buffer == NULL) { - pr_err("%s: in_buffer is null\n", __func__); - return 0; - } - if (count < IN_BUFFER_SIZE) { - pr_err("%s: read size %d exceeds buf size %zd\n", __func__, - IN_BUFFER_SIZE, count); - return 0; - } - snprintf(in_buffer, IN_BUFFER_SIZE, "%ld,%ld,", - in_cont_tv.tv_sec, in_cont_tv.tv_usec); - return simple_read_from_buffer(buf, IN_BUFFER_SIZE, ppos, - in_buffer, IN_BUFFER_SIZE); -} -static ssize_t audio_input_latency_dbgfs_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - char *temp; - - if (count > 2*sizeof(char)) { - pr_err("%s: err count is more %zd\n", __func__, count); - return -EINVAL; - } - temp = kmalloc(2*sizeof(char), GFP_KERNEL); - - if (temp) { - if (copy_from_user(temp, buf, 2*sizeof(char))) { - pr_err("%s: copy from user failed for size %zd\n", - __func__, 2*sizeof(char)); - kfree(temp); - return -EFAULT; - } - if (!kstrtol(temp, 10, &in_enable_flag)) { - kfree(temp); - return count; - } - kfree(temp); - } - return -EINVAL; -} -static const struct file_operations audio_input_latency_debug_fops = { - .open = audio_input_latency_dbgfs_open, - .read = audio_input_latency_dbgfs_read, - .write = audio_input_latency_dbgfs_write -}; - -/* - * get_monotonic_timeval - - * This method returns a structure in timeval - * format (sec,microsec) by using ktime kernel - * API to get time in nano secs and then converts - * it to timeval format - * - * ktime_get [nsec]-> ktime_to_timespec [sec,nsec]-> timeval[sec,usec] - * - * Returns struct timeval -*/ -static struct timeval get_monotonic_timeval(void) -{ - static struct timeval out_tval; - - /* Get time from monotonic clock in nanoseconds */ - ktime_t kTimeNsec = ktime_get(); - - /* Convert it to timespec format and later to timeval as expected by audio HAL */ - struct timespec temp_tspec = ktime_to_timespec(kTimeNsec); - - /* Time returned above is in sec,nanosec format, needs to convert to sec,microsec */ - out_tval.tv_usec = temp_tspec.tv_nsec/1000; - out_tval.tv_sec = temp_tspec.tv_sec; - return out_tval; -} - -static void config_debug_fs_write_cb(void) -{ - if (out_enable_flag) { - /* For first Write done log the time and reset - * out_cold_index - */ - if (out_cold_index != 1) { - out_cold_tv = get_monotonic_timeval(); - pr_debug("COLD: apr_send_pkt at %ld sec %ld microsec\n", - out_cold_tv.tv_sec, - out_cold_tv.tv_usec); - out_cold_index = 1; - } - pr_debug("%s: out_enable_flag %ld\n", - __func__, out_enable_flag); - } -} -static void config_debug_fs_read_cb(void) -{ - if (in_enable_flag) { - /* when in_cont_index == 7, DSP would be - * writing into the 8th 512 byte buffer and this - * timestamp is tapped here.Once done it then writes - * to 9th 512 byte buffer.These two buffers(8th, 9th) - * reach the test application in 5th iteration and that - * timestamp is tapped at user level. The difference - * of these two timestamps gives us the time between - * the time at which dsp started filling the sample - * required and when it reached the test application. - * Hence continuous input latency - */ - if (in_cont_index == 7) { - in_cont_tv = get_monotonic_timeval(); - pr_info("%s: read buffer at %ld sec %ld microsec\n", - __func__, - in_cont_tv.tv_sec, in_cont_tv.tv_usec); - } - in_cont_index++; - } -} - -static void config_debug_fs_reset_index(void) -{ - in_cont_index = 0; -} - -static void config_debug_fs_run(void) -{ - if (out_enable_flag) { - out_cold_tv = get_monotonic_timeval(); - pr_debug("%s: COLD apr_send_pkt at %ld sec %ld microsec\n", - __func__, out_cold_tv.tv_sec, out_cold_tv.tv_usec); - } -} - -static void config_debug_fs_write(struct audio_buffer *ab) -{ - if (out_enable_flag) { - char zero_pattern[2] = {0x00, 0x00}; - /* If First two byte is non zero and last two byte - * is zero then it is warm output pattern - */ - if ((strcmp(((char *)ab->data), zero_pattern)) && - (!strcmp(((char *)ab->data + 2), zero_pattern))) { - out_warm_tv = get_monotonic_timeval(); - pr_debug("%s: WARM:apr_send_pkt at %ld sec %ld microsec\n", - __func__, - out_warm_tv.tv_sec, - out_warm_tv.tv_usec); - pr_debug("%s: Warm Pattern Matched\n", __func__); - } - /* If First two byte is zero and last two byte is - * non zero then it is cont output pattern - */ - else if ((!strcmp(((char *)ab->data), zero_pattern)) - && (strcmp(((char *)ab->data + 2), zero_pattern))) { - out_cont_tv = get_monotonic_timeval(); - pr_debug("%s: CONT:apr_send_pkt at %ld sec %ld microsec\n", - __func__, - out_cont_tv.tv_sec, - out_cont_tv.tv_usec); - pr_debug("%s: Cont Pattern Matched\n", __func__); - } - } -} -static void config_debug_fs_init(void) -{ - out_buffer = kzalloc(OUT_BUFFER_SIZE, GFP_KERNEL); - if (out_buffer == NULL) - goto outbuf_fail; - - in_buffer = kzalloc(IN_BUFFER_SIZE, GFP_KERNEL); - if (in_buffer == NULL) - goto inbuf_fail; - - out_dentry = debugfs_create_file("audio_out_latency_measurement_node", - 0664, - NULL, NULL, &audio_output_latency_debug_fops); - if (IS_ERR(out_dentry)) { - pr_err("%s: debugfs_create_file failed\n", __func__); - goto file_fail; - } - in_dentry = debugfs_create_file("audio_in_latency_measurement_node", - 0664, - NULL, NULL, &audio_input_latency_debug_fops); - if (IS_ERR(in_dentry)) { - pr_err("%s: debugfs_create_file failed\n", __func__); - goto file_fail; - } - return; -file_fail: - kfree(in_buffer); -inbuf_fail: - kfree(out_buffer); -outbuf_fail: - in_buffer = NULL; - out_buffer = NULL; -} -#else -static void config_debug_fs_write(struct audio_buffer *ab) -{ -} -static void config_debug_fs_run(void) -{ -} -static void config_debug_fs_reset_index(void) -{ -} -static void config_debug_fs_read_cb(void) -{ -} -static void config_debug_fs_write_cb(void) -{ -} -static void config_debug_fs_init(void) -{ -} -#endif - -int q6asm_mmap_apr_dereg(void) -{ - int c; - - c = atomic_sub_return(1, &this_mmap.ref_cnt); - if (c == 0) { - apr_deregister(this_mmap.apr); - common_client.mmap_apr = NULL; - pr_debug("%s: APR De-Register common port\n", __func__); - } else if (c < 0) { - pr_err("%s: APR Common Port Already Closed %d\n", - __func__, c); - atomic_set(&this_mmap.ref_cnt, 0); - } - - return 0; -} - -static int q6asm_session_alloc(struct audio_client *ac) -{ - int n; - - for (n = 1; n <= ASM_ACTIVE_STREAMS_ALLOWED; n++) { - if (!(session[n].ac)) { - session[n].ac = ac; - return n; - } - } - pr_err("%s: session not available\n", __func__); - return -ENOMEM; -} - -static int q6asm_get_session_id_from_audio_client(struct audio_client *ac) -{ - int n; - - for (n = 1; n <= ASM_ACTIVE_STREAMS_ALLOWED; n++) { - if (session[n].ac == ac) - return n; - } - - pr_debug("%s: cannot find matching audio client. ac = %pK\n", - __func__, ac); - - return 0; -} - -static bool q6asm_is_valid_audio_client(struct audio_client *ac) -{ - return q6asm_get_session_id_from_audio_client(ac) ? 1 : 0; -} - -static void q6asm_session_free(struct audio_client *ac) -{ - int session_id; - unsigned long flags = 0; - - pr_debug("%s: sessionid[%d]\n", __func__, ac->session); - session_id = ac->session; - mutex_lock(&session[session_id].mutex_lock_per_session); - rtac_remove_popp_from_adm_devices(ac->session); - spin_lock_irqsave(&(session[session_id].session_lock), flags); - session[ac->session].ac = NULL; - ac->session = 0; - ac->perf_mode = LEGACY_PCM_MODE; - ac->fptr_cache_ops = NULL; - ac->cb = NULL; - ac->priv = NULL; - kfree(ac); - ac = NULL; - spin_unlock_irqrestore(&(session[session_id].session_lock), flags); - mutex_unlock(&session[session_id].mutex_lock_per_session); -} - -static uint32_t q6asm_get_next_buf(struct audio_client *ac, - uint32_t curr_buf, uint32_t max_buf_cnt) -{ - dev_vdbg(ac->dev, "%s: curr_buf = %d, max_buf_cnt = %d\n", - __func__, curr_buf, max_buf_cnt); - curr_buf += 1; - return (curr_buf >= max_buf_cnt) ? 0 : curr_buf; -} - -static int q6asm_map_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int result = 0; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - goto done; - } - - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - common_client.apr = common_client.mmap_apr; - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - goto done; - } - - /* Use second asm buf to map memory */ - if (common_client.port[IN].buf == NULL) { - pr_err("%s: common buf is NULL\n", - __func__); - result = -EINVAL; - goto done; - } - - common_client.port[IN].buf->phys = cal_block->cal_data.paddr; - - result = q6asm_memory_map_regions(&common_client, - IN, cal_block->map_data.map_size, 1, 1); - if (result < 0) { - pr_err("%s: mmap did not work! size = %zd result %d\n", - __func__, - cal_block->map_data.map_size, result); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - - list_for_each_safe(ptr, next, - &common_client.port[IN].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == cal_block->cal_data.paddr) { - cal_block->map_data.q6map_handle = buf_node->mmap_hdl; - break; - } - } -done: - return result; -} - -static int remap_cal_data(int32_t cal_type, struct cal_block_data *cal_block) -{ - int ret = 0; - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for cal type %d!\n", - __func__, cal_type); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - - ret = q6asm_map_cal_memory(cal_type, cal_block); - if (ret < 0) { - pr_err("%s: mmap did not work! size = %zd ret %d\n", - __func__, cal_block->map_data.map_size, ret); - goto done; - } - } -done: - return ret; -} - -static int q6asm_unmap_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int result = 0; - int result2 = 0; - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_debug("%s: No address to unmap!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (common_client.mmap_apr == NULL) { - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - } - - result2 = q6asm_memory_unmap_regions(&common_client, IN); - if (result2 < 0) { - pr_err("%s: unmap failed, err %d\n", - __func__, result2); - result = result2; - } - - cal_block->map_data.q6map_handle = 0; -done: - return result; -} - -int q6asm_unmap_cal_data(int cal_type, struct cal_block_data *cal_block) -{ - int ret = 0; - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle != 0)) { - - ret = q6asm_unmap_cal_memory(cal_type, cal_block); - if (ret < 0) { - pr_err("%s: unmap did not work! size = %zd ret %d\n", - __func__, cal_block->map_data.map_size, ret); - goto done; - } - } -done: - return ret; -} - -int send_asm_custom_topology(struct audio_client *ac) -{ - struct cal_block_data *cal_block = NULL; - struct cmd_set_topologies asm_top; - int result = 0; - int result1 = 0; - - if (cal_data[ASM_CUSTOM_TOP_CAL] == NULL) - goto done; - - mutex_lock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - if (!set_custom_topology) - goto unlock; - set_custom_topology = 0; - - cal_block = cal_utils_get_only_cal_block(cal_data[ASM_CUSTOM_TOP_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) - goto unlock; - - if (cal_block->cal_data.size == 0) { - pr_debug("%s: No cal to send!\n", __func__); - goto unlock; - } - - pr_debug("%s: Sending cal_index %d\n", __func__, ASM_CUSTOM_TOP_CAL); - - result = remap_cal_data(ASM_CUST_TOPOLOGY_CAL_TYPE, cal_block); - if (result) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, ASM_CUSTOM_TOP_CAL); - goto unlock; - } - - q6asm_add_hdr_custom_topology(ac, &asm_top.hdr, sizeof(asm_top)); - atomic_set(&ac->mem_state, -1); - asm_top.hdr.opcode = ASM_CMD_ADD_TOPOLOGIES; - asm_top.payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr); - asm_top.payload_addr_msw = msm_audio_populate_upper_32_bits( - cal_block->cal_data.paddr); - asm_top.mem_map_handle = cal_block->map_data.q6map_handle; - asm_top.payload_size = cal_block->cal_data.size; - - pr_debug("%s: Sending ASM_CMD_ADD_TOPOLOGIES payload = %pK, size = %d, map handle = 0x%x\n", - __func__, &cal_block->cal_data.paddr, - asm_top.payload_size, asm_top.mem_map_handle); - - result = apr_send_pkt(ac->apr, (uint32_t *) &asm_top); - if (result < 0) { - pr_err("%s: Set topologies failed result %d\n", - __func__, result); - pr_debug("%s: Set topologies failed payload = 0x%pK\n", - __func__, &cal_block->cal_data.paddr); - goto unmap; - - } - - result = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set topologies failed timeout\n", __func__); - pr_debug("%s: Set topologies failed after timedout payload = 0x%pK\n", - __func__, &cal_block->cal_data.paddr); - result = -ETIMEDOUT; - goto unmap; - } - if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - result = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - goto unmap; - } - -unmap: - result1 = q6asm_unmap_cal_memory(ASM_CUST_TOPOLOGY_CAL_TYPE, - cal_block); - if (result1 < 0) { - result = result1; - pr_debug("%s: unmap cal failed! %d\n", __func__, result); - } -unlock: - mutex_unlock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); -done: - return result; -} - -int q6asm_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - - pr_debug("%s:\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (common_client.mmap_apr == NULL) { - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - result = -EINVAL; - goto done; - } - - /* Use second asm buf to map memory */ - if (common_client.port[OUT].buf == NULL) { - pr_err("%s: common buf is NULL\n", - __func__); - result = -EINVAL; - goto done; - } - - common_client.port[OUT].buf->phys = cal_block->cal_data.paddr; - - result = q6asm_memory_map_regions(&common_client, - OUT, cal_block->map_data.map_size, 1, 1); - if (result < 0) { - pr_err("%s: mmap did not work! size = %d result %d\n", - __func__, - cal_block->map_data.map_size, result); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - - list_for_each_safe(ptr, next, - &common_client.port[OUT].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == cal_block->cal_data.paddr) { - cal_block->map_data.map_handle = buf_node->mmap_hdl; - break; - } - } -done: - return result; -} - -int q6asm_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - int result2 = 0; - - pr_debug("%s:\n", __func__); - - if (mem_map_handle == NULL) { - pr_debug("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - goto done; - } - - if (common_client.mmap_apr == NULL) { - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - } - - - result2 = q6asm_memory_unmap_regions(&common_client, OUT); - if (result2 < 0) { - pr_err("%s: unmap failed, err %d\n", - __func__, result2); - result = result2; - } else { - *mem_map_handle = 0; - } - - result2 = q6asm_mmap_apr_dereg(); - if (result2 < 0) { - pr_err("%s: q6asm_mmap_apr_dereg failed, err %d\n", - __func__, result2); - result = result2; - } -done: - return result; -} - -int q6asm_audio_client_buf_free(unsigned int dir, - struct audio_client *ac) -{ - struct audio_port_data *port; - int cnt = 0; - int rc = 0; - - pr_debug("%s: Session id %d\n", __func__, ac->session); - mutex_lock(&ac->cmd_lock); - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - if (!port->buf) { - pr_err("%s: buf NULL\n", __func__); - mutex_unlock(&ac->cmd_lock); - return 0; - } - cnt = port->max_buf_cnt - 1; - - if (cnt >= 0) { - rc = q6asm_memory_unmap_regions(ac, dir); - if (rc < 0) - pr_err("%s: Memory_unmap_regions failed %d\n", - __func__, rc); - } - - while (cnt >= 0) { - if (port->buf[cnt].data) { - if (!rc || atomic_read(&ac->reset)) - msm_audio_ion_free( - port->buf[cnt].dma_buf); - - port->buf[cnt].dma_buf = NULL; - port->buf[cnt].data = NULL; - port->buf[cnt].phys = 0; - --(port->max_buf_cnt); - } - --cnt; - } - kfree(port->buf); - port->buf = NULL; - } - mutex_unlock(&ac->cmd_lock); - return 0; -} - -/** - * q6asm_audio_client_buf_free_contiguous - - * frees the memory buffers for ASM - * - * @dir: RX or TX direction - * @ac: audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_audio_client_buf_free_contiguous(unsigned int dir, - struct audio_client *ac) -{ - struct audio_port_data *port; - int cnt = 0; - int rc = 0; - - pr_debug("%s: Session id %d\n", __func__, ac->session); - mutex_lock(&ac->cmd_lock); - port = &ac->port[dir]; - if (!port->buf) { - mutex_unlock(&ac->cmd_lock); - return 0; - } - cnt = port->max_buf_cnt - 1; - - if (cnt >= 0) { - rc = q6asm_memory_unmap(ac, port->buf[0].phys, dir); - if (rc < 0) - pr_err("%s: Memory_unmap_regions failed %d\n", - __func__, rc); - } - - if (port->buf[0].data) { - pr_debug("%s: data[%pK], phys[%pK], dma_buf[%pK]\n", - __func__, - port->buf[0].data, - &port->buf[0].phys, - port->buf[0].dma_buf); - if (!rc || atomic_read(&ac->reset)) - msm_audio_ion_free(port->buf[0].dma_buf); - port->buf[0].dma_buf = NULL; - } - - while (cnt >= 0) { - port->buf[cnt].data = NULL; - port->buf[cnt].phys = 0; - cnt--; - } - port->max_buf_cnt = 0; - kfree(port->buf); - port->buf = NULL; - mutex_unlock(&ac->cmd_lock); - return 0; -} -EXPORT_SYMBOL(q6asm_audio_client_buf_free_contiguous); - -/** - * q6asm_audio_client_free - - * frees the audio client for ASM - * - * @ac: audio client handle - * - */ -void q6asm_audio_client_free(struct audio_client *ac) -{ - int loopcnt; - struct audio_port_data *port; - - if (!ac) { - pr_err("%s: ac %pK\n", __func__, ac); - return; - } - if (!ac->session) { - pr_err("%s: ac session invalid\n", __func__); - return; - } - - mutex_lock(&session_lock); - - pr_debug("%s: Session id %d\n", __func__, ac->session); - if (ac->io_mode & SYNC_IO_MODE) { - for (loopcnt = 0; loopcnt <= OUT; loopcnt++) { - port = &ac->port[loopcnt]; - if (!port->buf) - continue; - pr_debug("%s: loopcnt = %d\n", - __func__, loopcnt); - q6asm_audio_client_buf_free(loopcnt, ac); - } - } - - rtac_set_asm_handle(ac->session, NULL); - apr_deregister(ac->apr2); - apr_deregister(ac->apr); - q6asm_mmap_apr_dereg(); - ac->apr2 = NULL; - ac->apr = NULL; - ac->mmap_apr = NULL; - q6asm_session_free(ac); - - pr_debug("%s: APR De-Register\n", __func__); - -/*done:*/ - mutex_unlock(&session_lock); -} -EXPORT_SYMBOL(q6asm_audio_client_free); - -/** - * q6asm_set_io_mode - - * Update IO mode for ASM - * - * @ac: audio client handle - * @mode1: IO mode to update - * - * Returns 0 on success or error on failure - */ -int q6asm_set_io_mode(struct audio_client *ac, uint32_t mode1) -{ - uint32_t mode; - int ret = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - ac->io_mode &= 0xFF00; - mode = (mode1 & 0xF); - - pr_debug("%s: ac->mode after anding with FF00:0x%x,\n", - __func__, ac->io_mode); - - if ((mode == ASYNC_IO_MODE) || (mode == SYNC_IO_MODE)) { - ac->io_mode |= mode1; - pr_debug("%s: Set Mode to 0x%x\n", __func__, ac->io_mode); - } else { - pr_err("%s: Not an valid IO Mode:%d\n", __func__, ac->io_mode); - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(q6asm_set_io_mode); - -void *q6asm_mmap_apr_reg(void) -{ - if ((atomic_read(&this_mmap.ref_cnt) == 0) || - (this_mmap.apr == NULL)) { - this_mmap.apr = apr_register("ADSP", "ASM", - (apr_fn)q6asm_srvc_callback, - 0x0FFFFFFFF, &this_mmap); - if (this_mmap.apr == NULL) { - pr_debug("%s: Unable to register APR ASM common port\n", - __func__); - goto fail; - } - } - atomic_inc(&this_mmap.ref_cnt); - - return this_mmap.apr; -fail: - return NULL; -} - -/** - * q6asm_send_stream_cmd - - * command to send for ASM stream - * - * @ac: audio client handle - * @data: event data - * - * Returns 0 on success or error on failure - */ -int q6asm_send_stream_cmd(struct audio_client *ac, - struct msm_adsp_event_data *data) -{ - char *asm_params = NULL; - struct apr_hdr hdr; - int rc; - uint32_t sz = 0; - uint64_t actual_sz = 0; - int session_id = 0; - - if (!data || !ac) { - pr_err("%s: %s is NULL\n", __func__, - (!data) ? "data" : "ac"); - rc = -EINVAL; - goto done; - } - - session_id = q6asm_get_session_id_from_audio_client(ac); - if (!session_id) { - rc = -EINVAL; - goto done; - } - - if (data->event_type >= ARRAY_SIZE(adsp_reg_event_opcode)) { - pr_err("%s: event %u out of boundary of array size of (%lu)\n", - __func__, data->event_type, - (long)ARRAY_SIZE(adsp_reg_event_opcode)); - rc = -EINVAL; - goto done; - } - - actual_sz = sizeof(struct apr_hdr) + data->payload_len; - if (actual_sz > U32_MAX) { - pr_err("%s: payload size 0x%X exceeds limit\n", - __func__, data->payload_len); - rc = -EINVAL; - goto done; - } - - sz = (uint32_t)actual_sz; - asm_params = kzalloc(sz, GFP_KERNEL); - if (!asm_params) { - rc = -ENOMEM; - goto done; - } - - mutex_lock(&session[session_id].mutex_lock_per_session); - if (!q6asm_is_valid_audio_client(ac)) { - rc = -EINVAL; - goto fail_send_param; - } - - q6asm_add_hdr_async(ac, &hdr, sz, TRUE); - atomic_set(&ac->cmd_state_pp, -1); - hdr.opcode = adsp_reg_event_opcode[data->event_type]; - memcpy(asm_params, &hdr, sizeof(struct apr_hdr)); - memcpy(asm_params + sizeof(struct apr_hdr), - data->payload, data->payload_len); - rc = apr_send_pkt(ac->apr, (uint32_t *) asm_params); - if (rc < 0) { - pr_err("%s: stream event cmd apr pkt failed\n", __func__); - rc = -EINVAL; - goto fail_send_param; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state_pp) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout for stream event cmd resp\n", __func__); - rc = -ETIMEDOUT; - goto fail_send_param; - } - - if (atomic_read(&ac->cmd_state_pp) > 0) { - pr_err("%s: DSP returned error[%s] for stream event cmd\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state_pp))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state_pp)); - goto fail_send_param; - } - - rc = 0; -fail_send_param: - mutex_unlock(&session[session_id].mutex_lock_per_session); - kfree(asm_params); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_send_stream_cmd); - -/** - * q6asm_audio_client_alloc - - * Alloc audio client for ASM - * - * @cb: callback fn - * @priv: private data - * - * Returns ac pointer on success or NULL on failure - */ -struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv) -{ - struct audio_client *ac; - int n; - int lcnt = 0; - int rc = 0; - - ac = kzalloc(sizeof(struct audio_client), GFP_KERNEL); - if (!ac) - return NULL; - - mutex_lock(&session_lock); - n = q6asm_session_alloc(ac); - if (n <= 0) { - pr_err("%s: ASM Session alloc fail n=%d\n", __func__, n); - mutex_unlock(&session_lock); - kfree(ac); - goto fail_session; - } - ac->session = n; - ac->cb = cb; - ac->path_delay = UINT_MAX; - ac->priv = priv; - ac->io_mode = SYNC_IO_MODE; - ac->perf_mode = LEGACY_PCM_MODE; - ac->fptr_cache_ops = NULL; - /* DSP expects stream id from 1 */ - ac->stream_id = 1; - ac->apr = apr_register("ADSP", "ASM", - (apr_fn)q6asm_callback, - ((ac->session) << 8 | 0x0001), - ac); - - if (ac->apr == NULL) { - pr_err("%s: Registration with APR failed\n", __func__); - mutex_unlock(&session_lock); - goto fail_apr1; - } - ac->apr2 = apr_register("ADSP", "ASM", - (apr_fn)q6asm_callback, - ((ac->session) << 8 | 0x0002), - ac); - - if (ac->apr2 == NULL) { - pr_err("%s: Registration with APR-2 failed\n", __func__); - mutex_unlock(&session_lock); - goto fail_apr2; - } - - rtac_set_asm_handle(n, ac->apr); - - pr_debug("%s: Registering the common port with APR\n", __func__); - ac->mmap_apr = q6asm_mmap_apr_reg(); - if (ac->mmap_apr == NULL) { - mutex_unlock(&session_lock); - goto fail_mmap; - } - - init_waitqueue_head(&ac->cmd_wait); - init_waitqueue_head(&ac->time_wait); - init_waitqueue_head(&ac->mem_wait); - atomic_set(&ac->time_flag, 1); - atomic_set(&ac->reset, 0); - INIT_LIST_HEAD(&ac->port[0].mem_map_handle); - INIT_LIST_HEAD(&ac->port[1].mem_map_handle); - pr_debug("%s: mem_map_handle list init'ed\n", __func__); - mutex_init(&ac->cmd_lock); - for (lcnt = 0; lcnt <= OUT; lcnt++) { - mutex_init(&ac->port[lcnt].lock); - spin_lock_init(&ac->port[lcnt].dsp_lock); - } - atomic_set(&ac->cmd_state, 0); - atomic_set(&ac->cmd_state_pp, 0); - atomic_set(&ac->mem_state, 0); - - rc = send_asm_custom_topology(ac); - if (rc < 0) { - mutex_unlock(&session_lock); - goto fail_mmap; - } - - pr_debug("%s: session[%d]\n", __func__, ac->session); - - mutex_unlock(&session_lock); - - return ac; -fail_mmap: - apr_deregister(ac->apr2); -fail_apr2: - apr_deregister(ac->apr); -fail_apr1: - q6asm_session_free(ac); -fail_session: - return NULL; -} -EXPORT_SYMBOL(q6asm_audio_client_alloc); - -/** - * q6asm_get_audio_client - - * Retrieve audio client for ASM - * - * @session_id: ASM session id - * - * Returns valid pointer on success or NULL on failure - */ -struct audio_client *q6asm_get_audio_client(int session_id) -{ - if (session_id == ASM_CONTROL_SESSION) - return &common_client; - - if ((session_id <= 0) || (session_id > ASM_ACTIVE_STREAMS_ALLOWED)) { - pr_err("%s: invalid session: %d\n", __func__, session_id); - goto err; - } - - if (!(session[session_id].ac)) { - pr_err("%s: session not active: %d\n", __func__, session_id); - goto err; - } - return session[session_id].ac; -err: - return NULL; -} -EXPORT_SYMBOL(q6asm_get_audio_client); - -/** - * q6asm_audio_client_buf_alloc - - * Allocs memory from ION for ASM - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @bufsz: size of each buffer - * @bufcnt: number of buffers to alloc - * - * Returns 0 on success or error on failure - */ -int q6asm_audio_client_buf_alloc(unsigned int dir, - struct audio_client *ac, - unsigned int bufsz, - uint32_t bufcnt) -{ - int cnt = 0; - int rc = 0; - struct audio_buffer *buf; - size_t len; - - if (!(ac) || !(bufsz) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK bufsz %d dir %d\n", __func__, ac, bufsz, - dir); - return -EINVAL; - } - - pr_debug("%s: session[%d]bufsz[%d]bufcnt[%d]\n", __func__, ac->session, - bufsz, bufcnt); - - if (ac->session <= 0 || ac->session > 8) { - pr_err("%s: Session ID is invalid, session = %d\n", __func__, - ac->session); - goto fail; - } - - if (ac->io_mode & SYNC_IO_MODE) { - if (ac->port[dir].buf) { - pr_debug("%s: buffer already allocated\n", __func__); - return 0; - } - mutex_lock(&ac->cmd_lock); - if (bufcnt > (U32_MAX/sizeof(struct audio_buffer))) { - pr_err("%s: Buffer size overflows", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - buf = kzalloc(((sizeof(struct audio_buffer))*bufcnt), - GFP_KERNEL); - - if (!buf) { - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - ac->port[dir].buf = buf; - - while (cnt < bufcnt) { - if (bufsz > 0) { - if (!buf[cnt].data) { - rc = msm_audio_ion_alloc( - &buf[cnt].dma_buf, - bufsz, - &buf[cnt].phys, - &len, - &buf[cnt].data); - if (rc) { - pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", - __func__, rc); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - buf[cnt].used = 1; - buf[cnt].size = bufsz; - buf[cnt].actual_size = bufsz; - pr_debug("%s: data[%pK]phys[%pK][%pK]\n", - __func__, - buf[cnt].data, - &buf[cnt].phys, - &buf[cnt].phys); - cnt++; - } - } - } - ac->port[dir].max_buf_cnt = cnt; - - mutex_unlock(&ac->cmd_lock); - rc = q6asm_memory_map_regions(ac, dir, bufsz, cnt, 0); - if (rc < 0) { - pr_err("%s: CMD Memory_map_regions failed %d for size %d\n", - __func__, rc, bufsz); - goto fail; - } - } - return 0; -fail: - q6asm_audio_client_buf_free(dir, ac); - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_audio_client_buf_alloc); - -/** - * q6asm_audio_client_buf_alloc_contiguous - - * Alloc contiguous memory from ION for ASM - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @bufsz: size of each buffer - * @bufcnt: number of buffers to alloc - * - * Returns 0 on success or error on failure - */ -int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir, - struct audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt) -{ - int cnt = 0; - int rc = 0; - struct audio_buffer *buf; - size_t len; - int bytes_to_alloc; - - if (!(ac) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return -EINVAL; - } - - pr_debug("%s: session[%d]bufsz[%d]bufcnt[%d]\n", - __func__, ac->session, - bufsz, bufcnt); - - if (ac->session <= 0 || ac->session > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: Session ID is invalid, session = %d\n", __func__, - ac->session); - goto fail; - } - - if (ac->port[dir].buf) { - pr_err("%s: buffer already allocated\n", __func__); - return 0; - } - mutex_lock(&ac->cmd_lock); - buf = kzalloc(((sizeof(struct audio_buffer))*bufcnt), - GFP_KERNEL); - - if (!buf) { - pr_err("%s: buffer allocation failed\n", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - ac->port[dir].buf = buf; - - /* check for integer overflow */ - if ((bufcnt > 0) && ((INT_MAX / bufcnt) < bufsz)) { - pr_err("%s: integer overflow\n", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - bytes_to_alloc = bufsz * bufcnt; - - /* The size to allocate should be multiple of 4K bytes */ - bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); - - rc = msm_audio_ion_alloc(&buf[0].dma_buf, - bytes_to_alloc, - &buf[0].phys, &len, - &buf[0].data); - if (rc) { - pr_err("%s: Audio ION alloc is failed, rc = %d\n", - __func__, rc); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - buf[0].used = dir ^ 1; - buf[0].size = bufsz; - buf[0].actual_size = bufsz; - cnt = 1; - while (cnt < bufcnt) { - if (bufsz > 0) { - buf[cnt].data = buf[0].data + (cnt * bufsz); - buf[cnt].phys = buf[0].phys + (cnt * bufsz); - if (!buf[cnt].data) { - pr_err("%s: Buf alloc failed\n", - __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - buf[cnt].used = dir ^ 1; - buf[cnt].size = bufsz; - buf[cnt].actual_size = bufsz; - pr_debug("%s: data[%pK]phys[%pK][%pK]\n", - __func__, - buf[cnt].data, - &buf[cnt].phys, - &buf[cnt].phys); - } - cnt++; - } - ac->port[dir].max_buf_cnt = cnt; - mutex_unlock(&ac->cmd_lock); - rc = q6asm_memory_map_regions(ac, dir, bufsz, cnt, 1); - if (rc < 0) { - pr_err("%s: CMD Memory_map_regions failed %d for size %d\n", - __func__, rc, bufsz); - goto fail; - } - return 0; -fail: - q6asm_audio_client_buf_free_contiguous(dir, ac); - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_audio_client_buf_alloc_contiguous); - -static int32_t q6asm_srvc_callback(struct apr_client_data *data, void *priv) -{ - uint32_t dir = 0; - uint32_t i = IN; - uint32_t *payload; - unsigned long dsp_flags = 0; - unsigned long flags = 0; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - union asm_token_struct asm_token; - - struct audio_client *ac = NULL; - struct audio_port_data *port; - - int session_id; - - if (!data) { - pr_err("%s: Invalid CB\n", __func__); - return 0; - } - - payload = data->payload; - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event is received: %d %d apr[%pK]\n", - __func__, - data->reset_event, - data->reset_proc, - this_mmap.apr); - atomic_set(&this_mmap.ref_cnt, 0); - apr_reset(this_mmap.apr); - this_mmap.apr = NULL; - for (; i <= OUT; i++) { - list_for_each_safe(ptr, next, - &common_client.port[i].mem_map_handle) { - buf_node = list_entry(ptr, - struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == - common_client.port[i].buf->phys) { - list_del(&buf_node->list); - kfree(buf_node); - } - } - pr_debug("%s: Clearing custom topology\n", __func__); - } - - cal_utils_clear_cal_block_q6maps(ASM_MAX_CAL_TYPES, cal_data); - common_client.mmap_apr = NULL; - mutex_lock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - set_custom_topology = 1; - mutex_unlock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - topology_map_handle = 0; - rtac_clear_mapping(ASM_RTAC_CAL); - return 0; - } - asm_token.token = data->token; - session_id = asm_token._token.session_id; - - if ((session_id > 0 && session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_lock_irqsave(&(session[session_id].session_lock), flags); - - ac = q6asm_get_audio_client(session_id); - dir = q6asm_get_flag_from_token(&asm_token, ASM_DIRECTION_OFFSET); - - if (!ac) { - pr_debug("%s: session[%d] already freed\n", - __func__, session_id); - if ((session_id > 0 && - session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - if (data->payload_size >= 2 * sizeof(uint32_t)) { - pr_debug("%s:ptr0[0x%x]ptr1[0x%x]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]sid[%d]dir[%d]\n", - __func__, payload[0], payload[1], data->opcode, - data->token, data->payload_size, data->src_port, - data->dest_port, asm_token._token.session_id, dir); - pr_debug("%s:Payload = [0x%x] status[0x%x]\n", - __func__, payload[0], payload[1]); - } else if (data->payload_size == sizeof(uint32_t)) { - pr_debug("%s:ptr0[0x%x]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]sid[%d]dir[%d]\n", - __func__, payload[0], data->opcode, - data->token, data->payload_size, data->src_port, - data->dest_port, asm_token._token.session_id, dir); - pr_debug("%s:Payload = [0x%x]\n", - __func__, payload[0]); - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - switch (payload[0]) { - case ASM_CMD_SHARED_MEM_MAP_REGIONS: - case ASM_CMD_SHARED_MEM_UNMAP_REGIONS: - case ASM_CMD_ADD_TOPOLOGIES: - if (data->payload_size >= 2 * sizeof(uint32_t) && payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x sid:%d\n", - __func__, payload[0], payload[1], - asm_token._token.session_id); - if (payload[0] == - ASM_CMD_SHARED_MEM_UNMAP_REGIONS) - atomic_set(&ac->unmap_cb_success, 0); - - atomic_set(&ac->mem_state, payload[1]); - wake_up(&ac->mem_wait); - } else { - if (payload[0] == - ASM_CMD_SHARED_MEM_UNMAP_REGIONS) - atomic_set(&ac->unmap_cb_success, 1); - } - - if (atomic_cmpxchg(&ac->mem_state, -1, 0) == -1) - wake_up(&ac->mem_wait); - if (data->payload_size >= 2 * sizeof(uint32_t)) - dev_vdbg(ac->dev, "%s: Payload = [0x%x] status[0x%x]\n", - __func__, payload[0], payload[1]); - else - dev_vdbg(ac->dev, "%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - break; - default: - pr_debug("%s: command[0x%x] not expecting rsp\n", - __func__, payload[0]); - break; - } - if ((session_id > 0 && - session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - port = &ac->port[dir]; - - switch (data->opcode) { - case ASM_CMDRSP_SHARED_MEM_MAP_REGIONS:{ - pr_debug("%s:PL#0[0x%x] dir=0x%x s_id=0x%x\n", - __func__, payload[0], dir, asm_token._token.session_id); - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - if (atomic_cmpxchg(&ac->mem_state, -1, 0) == -1) { - ac->port[dir].tmp_hdl = payload[0]; - wake_up(&ac->mem_wait); - } - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - break; - } - case ASM_CMD_SHARED_MEM_UNMAP_REGIONS:{ - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: PL#0[0x%x]PL#1 [0x%x]\n", - __func__, payload[0], payload[1]); - else - pr_debug("%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - if (atomic_cmpxchg(&ac->mem_state, -1, 0) == -1) - wake_up(&ac->mem_wait); - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - - break; - } - default: - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: command[0x%x]success [0x%x]\n", - __func__, payload[0], payload[1]); - else - pr_debug("%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - } - if (ac->cb) - ac->cb(data->opcode, data->token, - data->payload, ac->priv); - if ((session_id > 0 && session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - - return 0; -} - -static void q6asm_process_mtmx_get_param_rsp(struct audio_client *ac, - struct asm_mtmx_strtr_get_params_cmdrsp *cmdrsp) -{ - struct asm_session_mtmx_strtr_param_session_time_v3_t *time; - - if (cmdrsp->err_code) { - dev_err_ratelimited(ac->dev, - "%s: err=%x, mod_id=%x, param_id=%x\n", - __func__, cmdrsp->err_code, - cmdrsp->param_info.module_id, - cmdrsp->param_info.param_id); - return; - } - dev_dbg_ratelimited(ac->dev, - "%s: mod_id=%x, param_id=%x\n", __func__, - cmdrsp->param_info.module_id, - cmdrsp->param_info.param_id); - - switch (cmdrsp->param_info.module_id) { - case ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC: - switch (cmdrsp->param_info.param_id) { - case ASM_SESSION_MTMX_STRTR_PARAM_SESSION_TIME_V3: - time = &cmdrsp->param_data.session_time; - dev_vdbg(ac->dev, "%s: GET_TIME_V3, time_lsw=%x, time_msw=%x, abs l %x, m %x\n", - __func__, time->session_time_lsw, - time->session_time_msw, - time->absolute_time_lsw, - time->absolute_time_msw); - ac->dsp_ts.abs_time_stamp = (uint64_t)(((uint64_t) - time->absolute_time_msw << 32) | - time->absolute_time_lsw); - ac->dsp_ts.time_stamp = (uint64_t)(((uint64_t) - time->session_time_msw << 32) | - time->session_time_lsw); - ac->dsp_ts.last_time_stamp = (uint64_t)(((uint64_t) - time->time_stamp_msw << 32) | - time->time_stamp_lsw); - if (time->flags & - ASM_SESSION_MTMX_STRTR_PARAM_STIME_TSTMP_FLG_BMASK) - dev_warn_ratelimited(ac->dev, - "%s: recv inval tstmp\n", - __func__); - if (atomic_cmpxchg(&ac->time_flag, 1, 0)) - wake_up(&ac->time_wait); - - break; - default: - dev_err(ac->dev, "%s: unexpected param_id %x\n", - __func__, cmdrsp->param_info.param_id); - break; - } - break; - default: - dev_err(ac->dev, "%s: unexpected mod_id %x\n", __func__, - cmdrsp->param_info.module_id); - break; - } -} - -static int32_t q6asm_callback(struct apr_client_data *data, void *priv) -{ - int i = 0; - struct audio_client *ac = (struct audio_client *)priv; - unsigned long dsp_flags = 0; - uint32_t *payload; - uint32_t wakeup_flag = 1; - int32_t ret = 0; - union asm_token_struct asm_token; - uint8_t buf_index; - struct msm_adsp_event_data *pp_event_package = NULL; - uint32_t payload_size = 0; - unsigned long flags = 0; - int session_id; - - if (ac == NULL) { - pr_err("%s: ac NULL\n", __func__); - return -EINVAL; - } - if (data == NULL) { - pr_err("%s: data NULL\n", __func__); - return -EINVAL; - } - - session_id = q6asm_get_session_id_from_audio_client(ac); - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: Session ID is invalid, session = %d\n", __func__, - session_id); - return -EINVAL; - } - spin_lock_irqsave(&(session[session_id].session_lock), flags); - - if (!q6asm_is_valid_audio_client(ac)) { - pr_err("%s: audio client pointer is invalid, ac = %pK\n", - __func__, ac); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return -EINVAL; - } - - payload = data->payload; - asm_token.token = data->token; - if (q6asm_get_flag_from_token(&asm_token, ASM_CMD_NO_WAIT_OFFSET)) { - pr_debug("%s: No wait command opcode[0x%x] cmd_opcode:%x\n", - __func__, data->opcode, payload ? payload[0] : 0); - wakeup_flag = 0; - } - - if (data->opcode == RESET_EVENTS) { - atomic_set(&ac->reset, 1); - if (ac->apr == NULL) { - ac->apr = ac->apr2; - ac->apr2 = NULL; - } - pr_debug("%s: Reset event is received: %d %d apr[%pK]\n", - __func__, - data->reset_event, data->reset_proc, ac->apr); - if (ac->cb) - ac->cb(data->opcode, data->token, - (uint32_t *)data->payload, ac->priv); - apr_reset(ac->apr); - ac->apr = NULL; - atomic_set(&ac->time_flag, 0); - atomic_set(&ac->cmd_state, 0); - atomic_set(&ac->mem_state, 0); - atomic_set(&ac->cmd_state_pp, 0); - wake_up(&ac->time_wait); - wake_up(&ac->cmd_wait); - wake_up(&ac->mem_wait); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - dev_vdbg(ac->dev, "%s: session[%d]opcode[0x%x] token[0x%x]payload_size[%d] src[%d] dest[%d]\n", - __func__, - ac->session, data->opcode, - data->token, data->payload_size, data->src_port, - data->dest_port); - if ((data->opcode != ASM_DATA_EVENT_RENDERED_EOS) && - (data->opcode != ASM_DATA_EVENT_EOS) && - (data->opcode != ASM_SESSION_EVENTX_OVERFLOW) && - (data->opcode != ASM_SESSION_EVENT_RX_UNDERFLOW)) { - if (payload == NULL) { - pr_err("%s: payload is null\n", __func__); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return -EINVAL; - } - if(data->payload_size >= 2 * sizeof(uint32_t)) - dev_vdbg(ac->dev, "%s: Payload = [0x%x] status[0x%x] opcode 0x%x\n", - __func__, payload[0], payload[1], data->opcode); - else - dev_vdbg(ac->dev, "%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - } - if (data->opcode == APR_BASIC_RSP_RESULT) { - switch (payload[0]) { - case ASM_STREAM_CMD_SET_PP_PARAMS_V2: - case ASM_STREAM_CMD_SET_PP_PARAMS_V3: - if (rtac_make_asm_callback(ac->session, payload, - data->payload_size)) - break; - case ASM_SESSION_CMD_PAUSE: - case ASM_SESSION_CMD_SUSPEND: - case ASM_DATA_CMD_EOS: - case ASM_STREAM_CMD_CLOSE: - case ASM_STREAM_CMD_FLUSH: - case ASM_SESSION_CMD_RUN_V2: - case ASM_SESSION_CMD_REGISTER_FORX_OVERFLOW_EVENTS: - case ASM_STREAM_CMD_FLUSH_READBUFS: - pr_debug("%s: session %d opcode 0x%x token 0x%x Payload = [0x%x] src %d dest %d\n", - __func__, ac->session, data->opcode, data->token, - payload[0], data->src_port, data->dest_port); - ret = q6asm_is_valid_session(data, priv); - if (ret != 0) { - pr_err("%s: session invalid %d\n", __func__, ret); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return ret; - } - case ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2: - case ASM_STREAM_CMD_OPEN_READ_V3: - case ASM_STREAM_CMD_OPEN_WRITE_V3: - case ASM_STREAM_CMD_OPEN_PULL_MODE_WRITE: - case ASM_STREAM_CMD_OPEN_PUSH_MODE_READ: - case ASM_STREAM_CMD_OPEN_READWRITE_V2: - case ASM_STREAM_CMD_OPEN_LOOPBACK_V2: - case ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK: - case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: - case ASM_DATA_CMD_IEC_60958_MEDIA_FMT: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2: - case ASM_STREAM_CMD_REGISTER_ENCDEC_EVENTS: - case ASM_STREAM_CMD_REGISTER_IEC_61937_FMT_UPDATE: - case ASM_DATA_CMD_REMOVE_INITIAL_SILENCE: - case ASM_DATA_CMD_REMOVE_TRAILING_SILENCE: - case ASM_SESSION_CMD_REGISTER_FOR_RX_UNDERFLOW_EVENTS: - case ASM_STREAM_CMD_OPEN_READ_COMPRESSED: - case ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED: - if (data->payload_size >= 2 * sizeof(uint32_t)) { - pr_debug("%s: session %d opcode 0x%x token 0x%x Payload = [0x%x] stat 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - payload[0], payload[1], - data->src_port, data->dest_port); - if (payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - if (wakeup_flag) { - if ((is_adsp_reg_event(payload[0]) >= - 0) || - (payload[0] == - ASM_STREAM_CMD_SET_PP_PARAMS_V2) || - (payload[0] == - ASM_STREAM_CMD_SET_PP_PARAMS_V3)) - atomic_set(&ac->cmd_state_pp, - payload[1]); - else - atomic_set(&ac->cmd_state, - payload[1]); - wake_up(&ac->cmd_wait); - } - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return 0; - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - if ((is_adsp_reg_event(payload[0]) >= 0) || - (payload[0] == ASM_STREAM_CMD_SET_PP_PARAMS_V2) || - (payload[0] == ASM_STREAM_CMD_SET_PP_PARAMS_V3)) { - if (atomic_read(&ac->cmd_state_pp) && - wakeup_flag) { - atomic_set(&ac->cmd_state_pp, 0); - wake_up(&ac->cmd_wait); - } - } else { - if (atomic_read(&ac->cmd_state) && - wakeup_flag) { - atomic_set(&ac->cmd_state, 0); - wake_up(&ac->cmd_wait); - } - } - if (ac->cb) - ac->cb(data->opcode, data->token, - (uint32_t *)data->payload, ac->priv); - break; - case ASM_CMD_ADD_TOPOLOGIES: - if (data->payload_size >= 2 * sizeof(uint32_t)) { - pr_debug("%s:Payload = [0x%x]stat[0x%x]\n", - __func__, payload[0], payload[1]); - if (payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - if (wakeup_flag) { - atomic_set(&ac->mem_state, payload[1]); - wake_up(&ac->mem_wait); - } - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return 0; - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - if (atomic_read(&ac->mem_state) && wakeup_flag) { - atomic_set(&ac->mem_state, 0); - wake_up(&ac->mem_wait); - } - if (ac->cb) - ac->cb(data->opcode, data->token, - (uint32_t *)data->payload, ac->priv); - break; - case ASM_DATA_EVENT_WATERMARK: { - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: Watermark opcode[0x%x] status[0x%x]", - __func__, payload[0], payload[1]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - break; - } - case ASM_STREAM_CMD_GET_PP_PARAMS_V2: - case ASM_STREAM_CMD_GET_PP_PARAMS_V3: - pr_debug("%s: ASM_STREAM_CMD_GET_PP_PARAMS session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, data->opcode, - data->token, data->src_port, data->dest_port); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2 */ - if (data->payload_size >= 2 * sizeof(uint32_t)) { - if (payload[1] != 0) { - pr_err("%s: ASM get param error = %d, resuming\n", - __func__, payload[1]); - rtac_make_asm_callback(ac->session, payload, - data->payload_size); - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - break; - case ASM_STREAM_CMD_REGISTER_PP_EVENTS: - pr_debug("%s: ASM_STREAM_CMD_REGISTER_PP_EVENTS session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - if (data->payload_size >= 2 * sizeof(uint32_t)) { - if (payload[1] != 0) - pr_err("%s: ASM get param error = %d, resuming\n", - __func__, payload[1]); - atomic_set(&ac->cmd_state_pp, payload[1]); - wake_up(&ac->cmd_wait); - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - break; - default: - pr_debug("%s: command[0x%x] not expecting rsp\n", - __func__, payload[0]); - break; - } - - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - switch (data->opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2:{ - struct audio_port_data *port = &ac->port[IN]; - if (data->payload_size >= 2 * sizeof(uint32_t)) - dev_vdbg(ac->dev, "%s: Rxed opcode[0x%x] status[0x%x] token[%d]", - __func__, payload[0], payload[1], - data->token); - else - dev_err(ac->dev, "%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - if (ac->io_mode & SYNC_IO_MODE) { - if (port->buf == NULL) { - pr_err("%s: Unexpected Write Done\n", - __func__); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - buf_index = asm_token._token.buf_index; - if (buf_index < 0 || buf_index >= port->max_buf_cnt) { - pr_debug("%s: Invalid buffer index %u\n", - __func__, buf_index); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - if ( data->payload_size >= 2 * sizeof(uint32_t) && - (lower_32_bits(port->buf[buf_index].phys) != - payload[0] || - msm_audio_populate_upper_32_bits( - port->buf[buf_index].phys) != payload[1])) { - pr_debug("%s: Expected addr %pK\n", - __func__, &port->buf[buf_index].phys); - pr_err("%s: rxedl[0x%x] rxedu [0x%x]\n", - __func__, payload[0], payload[1]); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - port->buf[buf_index].used = 1; - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - - config_debug_fs_write_cb(); - - for (i = 0; i < port->max_buf_cnt; i++) - dev_vdbg(ac->dev, "%s %d\n", - __func__, port->buf[i].used); - - } - break; - } - case ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2: - case ASM_STREAM_CMDRSP_GET_PP_PARAMS_V3: - pr_debug("%s: ASM_STREAM_CMDRSP_GET_PP_PARAMS session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, data->opcode, data->token, - data->src_port, data->dest_port); - if (payload[0] != 0) { - pr_err("%s: ASM_STREAM_CMDRSP_GET_PP_PARAMS returned error = 0x%x\n", - __func__, payload[0]); - } else if (generic_get_data) { - generic_get_data->valid = 1; - if (generic_get_data->is_inband) { - if (data->payload_size >= 4 * sizeof(uint32_t)) - pr_debug("%s: payload[1] = 0x%x, payload[2]=0x%x, payload[3]=0x%x\n", - __func__, payload[1], payload[2], payload[3]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, - data->payload_size); - - if (data->payload_size >= (4 + (payload[3]>>2)) * sizeof(uint32_t)) { - generic_get_data->size_in_ints = payload[3]>>2; - for (i = 0; i < payload[3]>>2; i++) { - generic_get_data->ints[i] = - payload[4+i]; - pr_debug("%s: ASM callback val %i = %i\n", - __func__, i, payload[4+i]); - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - pr_debug("%s: callback size in ints = %i\n", - __func__, - generic_get_data->size_in_ints); - } - if (atomic_read(&ac->cmd_state) && wakeup_flag) { - atomic_set(&ac->cmd_state, 0); - wake_up(&ac->cmd_wait); - } - break; - } - rtac_make_asm_callback(ac->session, payload, - data->payload_size); - break; - case ASM_DATA_EVENT_READ_DONE_V2:{ - - struct audio_port_data *port = &ac->port[OUT]; - - config_debug_fs_read_cb(); - - dev_vdbg(ac->dev, "%s: ReadDone: status=%d buff_add=0x%x act_size=%d offset=%d\n", - __func__, payload[READDONE_IDX_STATUS], - payload[READDONE_IDX_BUFADD_LSW], - payload[READDONE_IDX_SIZE], - payload[READDONE_IDX_OFFSET]); - - dev_vdbg(ac->dev, "%s: ReadDone:msw_ts=%d lsw_ts=%d memmap_hdl=0x%x flags=%d id=%d num=%d\n", - __func__, payload[READDONE_IDX_MSW_TS], - payload[READDONE_IDX_LSW_TS], - payload[READDONE_IDX_MEMMAP_HDL], - payload[READDONE_IDX_FLAGS], - payload[READDONE_IDX_SEQ_ID], - payload[READDONE_IDX_NUMFRAMES]); - - if (ac->io_mode & SYNC_IO_MODE) { - if (port->buf == NULL) { - pr_err("%s: Unexpected Read Done\n", __func__); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - buf_index = asm_token._token.buf_index; - if (buf_index < 0 || buf_index >= port->max_buf_cnt) { - pr_debug("%s: Invalid buffer index %u\n", - __func__, buf_index); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - port->buf[buf_index].used = 0; - if (lower_32_bits(port->buf[buf_index].phys) != - payload[READDONE_IDX_BUFADD_LSW] || - msm_audio_populate_upper_32_bits( - port->buf[buf_index].phys) != - payload[READDONE_IDX_BUFADD_MSW]) { - dev_vdbg(ac->dev, "%s: Expected addr %pK\n", - __func__, &port->buf[buf_index].phys); - pr_err("%s: rxedl[0x%x] rxedu[0x%x]\n", - __func__, - payload[READDONE_IDX_BUFADD_LSW], - payload[READDONE_IDX_BUFADD_MSW]); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } - port->buf[buf_index].actual_size = - payload[READDONE_IDX_SIZE]; - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - } - break; - } - case ASM_DATA_EVENT_EOS: - case ASM_DATA_EVENT_RENDERED_EOS: - pr_debug("%s: EOS ACK received: rxed session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - break; - case ASM_SESSION_EVENTX_OVERFLOW: - pr_debug("%s: ASM_SESSION_EVENTX_OVERFLOW session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - break; - case ASM_SESSION_EVENT_RX_UNDERFLOW: - pr_debug("%s: ASM_SESSION_EVENT_RX_UNDERFLOW session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - break; - case ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3: - if (data->payload_size >= 3 * sizeof(uint32_t)) { - dev_vdbg(ac->dev, "%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3, payload[0] = %d, payload[1] = %d, payload[2] = %d\n", - __func__, - payload[0], payload[1], payload[2]); - ac->dsp_ts.time_stamp = - (uint64_t)(((uint64_t)payload[2] << 32) | - payload[1]); - } else { - dev_err(ac->dev, "%s: payload size of %x is less than expected.n", - __func__, data->payload_size); - } - if (atomic_cmpxchg(&ac->time_flag, 1, 0)) - wake_up(&ac->time_wait); - break; - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - if (data->payload_size >= 4 * sizeof(uint32_t)) - pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0] = %d, payload[1] = %d, payload[2] = %d, payload[3] = %d\n", - __func__, - payload[0], payload[1], payload[2], - payload[3]); - else - pr_debug("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - break; - case ASM_SESSION_CMDRSP_GET_MTMX_STRTR_PARAMS_V2: - q6asm_process_mtmx_get_param_rsp(ac, (void *) payload); - break; - case ASM_STREAM_PP_EVENT: - case ASM_STREAM_CMD_ENCDEC_EVENTS: - case ASM_IEC_61937_MEDIA_FMT_EVENT: - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: ASM_STREAM_EVENT payload[0][0x%x] payload[1][0x%x]", - __func__, payload[0], payload[1]); - else if (data->payload_size >= sizeof(uint32_t)) - pr_debug("%s: ASM_STREAM_EVENT payload[0][0x%x]", - __func__, payload[0]); - else - pr_debug("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - i = is_adsp_raise_event(data->opcode); - if (i < 0) { - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - /* repack payload for asm_stream_pp_event - * package is composed of event type + size + actual payload - */ - payload_size = data->payload_size; - if (payload_size > UINT_MAX - sizeof(struct msm_adsp_event_data)) { - pr_err("%s: payload size = %d exceeds limit.\n", - __func__, payload_size); - spin_unlock(&(session[session_id].session_lock)); - return -EINVAL; - } - - pp_event_package = kzalloc(payload_size - + sizeof(struct msm_adsp_event_data), - GFP_ATOMIC); - if (!pp_event_package) { - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return -ENOMEM; - } - - pp_event_package->event_type = i; - pp_event_package->payload_len = payload_size; - memcpy((void *)pp_event_package->payload, - data->payload, payload_size); - if ((data->opcode == ASM_IEC_61937_MEDIA_FMT_EVENT) && - (payload_size == 4)) { - switch (payload[0]) { - case ASM_MEDIA_FMT_AC3: - ((uint32_t *)pp_event_package->payload)[0] = - SND_AUDIOCODEC_AC3; - break; - case ASM_MEDIA_FMT_EAC3: - ((uint32_t *)pp_event_package->payload)[0] = - SND_AUDIOCODEC_EAC3; - break; - case ASM_MEDIA_FMT_DTS: - ((uint32_t *)pp_event_package->payload)[0] = - SND_AUDIOCODEC_DTS; - break; - case ASM_MEDIA_FMT_TRUEHD: - ((uint32_t *)pp_event_package->payload)[0] = - SND_AUDIOCODEC_TRUEHD; - break; - case ASM_MEDIA_FMT_AAC_V2: - ((uint32_t *)pp_event_package->payload)[0] = - SND_AUDIOCODEC_AAC; - break; - default: - pr_debug("%s: Event with unknown media_fmt 0x%x\n", - __func__, payload[0]); - } - } - ac->cb(data->opcode, data->token, - (void *)pp_event_package, ac->priv); - kfree(pp_event_package); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - case ASM_SESSION_CMDRSP_ADJUST_SESSION_CLOCK_V2: - if (data->payload_size >= 3 * sizeof(uint32_t)) - pr_debug("%s: ASM_SESSION_CMDRSP_ADJUST_SESSION_CLOCK_V2 sesion %d status 0x%x msw %u lsw %u\n", - __func__, ac->session, payload[0], payload[2], - payload[1]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - wake_up(&ac->cmd_wait); - break; - case ASM_SESSION_CMDRSP_GET_PATH_DELAY_V2: - if (data->payload_size >= 3 * sizeof(uint32_t)) - pr_debug("%s: ASM_SESSION_CMDRSP_GET_PATH_DELAY_V2 session %d status 0x%x msw %u lsw %u\n", - __func__, ac->session, payload[0], payload[2], - payload[1]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - if (payload[0] == 0 && data->payload_size >= 2 * sizeof(uint32_t)) { - atomic_set(&ac->cmd_state, 0); - /* ignore msw, as a delay that large shouldn't happen */ - ac->path_delay = payload[1]; - } else { - atomic_set(&ac->cmd_state, payload[0]); - ac->path_delay = UINT_MAX; - } - wake_up(&ac->cmd_wait); - break; - } - if (ac->cb) - ac->cb(data->opcode, data->token, - data->payload, ac->priv); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; -} - -/** - * q6asm_is_cpu_buf_avail - - * retrieve next CPU buf avail - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @size: size pointer to be updated with size of buffer - * @index: index pointer to be updated with - * CPU buffer index available - * - * Returns buffer pointer on success or NULL on failure - */ -void *q6asm_is_cpu_buf_avail(int dir, struct audio_client *ac, uint32_t *size, - uint32_t *index) -{ - void *data; - unsigned char idx; - struct audio_port_data *port; - - if (!ac || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return NULL; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - - mutex_lock(&port->lock); - idx = port->cpu_buf; - if (port->buf == NULL) { - pr_err("%s: Buffer pointer null\n", __func__); - mutex_unlock(&port->lock); - return NULL; - } - /* dir 0: used = 0 means buf in use - * dir 1: used = 1 means buf in use - */ - if (port->buf[idx].used == dir) { - /* To make it more robust, we could loop and get the - * next avail buf, its risky though - */ - pr_debug("%s: Next buf idx[0x%x] not available, dir[%d]\n", - __func__, idx, dir); - mutex_unlock(&port->lock); - return NULL; - } - *size = port->buf[idx].actual_size; - *index = port->cpu_buf; - data = port->buf[idx].data; - dev_vdbg(ac->dev, "%s: session[%d]index[%d] data[%pK]size[%d]\n", - __func__, - ac->session, - port->cpu_buf, - data, *size); - /* By default increase the cpu_buf cnt - * user accesses this function,increase cpu - * buf(to avoid another api) - */ - port->buf[idx].used = dir; - port->cpu_buf = q6asm_get_next_buf(ac, port->cpu_buf, - port->max_buf_cnt); - mutex_unlock(&port->lock); - return data; - } - return NULL; -} -EXPORT_SYMBOL(q6asm_is_cpu_buf_avail); - -/** - * q6asm_cpu_buf_release - - * releases cpu buffer for ASM - * - * @dir: RX or TX direction - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_cpu_buf_release(int dir, struct audio_client *ac) -{ - struct audio_port_data *port; - int ret = 0; - int idx; - - if (!ac || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - ret = -EINVAL; - goto exit; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - mutex_lock(&port->lock); - idx = port->cpu_buf; - if (port->cpu_buf == 0) { - port->cpu_buf = port->max_buf_cnt - 1; - } else if (port->cpu_buf < port->max_buf_cnt) { - port->cpu_buf = port->cpu_buf - 1; - } else { - pr_err("%s: buffer index(%d) out of range\n", - __func__, port->cpu_buf); - ret = -EINVAL; - mutex_unlock(&port->lock); - goto exit; - } - port->buf[port->cpu_buf].used = dir ^ 1; - mutex_unlock(&port->lock); - } -exit: - return ret; -} -EXPORT_SYMBOL(q6asm_cpu_buf_release); - -/** - * q6asm_is_cpu_buf_avail_nolock - - * retrieve next CPU buf avail without lock acquire - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @size: size pointer to be updated with size of buffer - * @index: index pointer to be updated with - * CPU buffer index available - * - * Returns buffer pointer on success or NULL on failure - */ -void *q6asm_is_cpu_buf_avail_nolock(int dir, struct audio_client *ac, - uint32_t *size, uint32_t *index) -{ - void *data; - unsigned char idx; - struct audio_port_data *port; - - if (!ac || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return NULL; - } - - port = &ac->port[dir]; - - idx = port->cpu_buf; - if (port->buf == NULL) { - pr_err("%s: Buffer pointer null\n", __func__); - return NULL; - } - /* - * dir 0: used = 0 means buf in use - * dir 1: used = 1 means buf in use - */ - if (port->buf[idx].used == dir) { - /* - * To make it more robust, we could loop and get the - * next avail buf, its risky though - */ - pr_err("%s: Next buf idx[0x%x] not available, dir[%d]\n", - __func__, idx, dir); - return NULL; - } - *size = port->buf[idx].actual_size; - *index = port->cpu_buf; - data = port->buf[idx].data; - dev_vdbg(ac->dev, "%s: session[%d]index[%d] data[%pK]size[%d]\n", - __func__, ac->session, port->cpu_buf, - data, *size); - /* - * By default increase the cpu_buf cnt - * user accesses this function,increase cpu - * buf(to avoid another api) - */ - port->buf[idx].used = dir; - port->cpu_buf = q6asm_get_next_buf(ac, port->cpu_buf, - port->max_buf_cnt); - return data; -} -EXPORT_SYMBOL(q6asm_is_cpu_buf_avail_nolock); - -int q6asm_is_dsp_buf_avail(int dir, struct audio_client *ac) -{ - int ret = -1; - struct audio_port_data *port; - uint32_t idx; - - if (!ac || (dir != OUT)) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return ret; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - - mutex_lock(&port->lock); - idx = port->dsp_buf; - - if (port->buf[idx].used == (dir ^ 1)) { - /* To make it more robust, we could loop and get the - * next avail buf, its risky though - */ - pr_err("%s: Next buf idx[0x%x] not available, dir[%d]\n", - __func__, idx, dir); - mutex_unlock(&port->lock); - return ret; - } - dev_vdbg(ac->dev, "%s: session[%d]dsp_buf=%d cpu_buf=%d\n", - __func__, - ac->session, port->dsp_buf, port->cpu_buf); - ret = ((port->dsp_buf != port->cpu_buf) ? 0 : -1); - mutex_unlock(&port->lock); - } - return ret; -} - -static void __q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg, uint32_t stream_id) -{ - unsigned long flags = 0; - - dev_vdbg(ac->dev, "%s: pkt_size=%d cmd_flg=%d session=%d stream_id=%d\n", - __func__, pkt_size, cmd_flg, ac->session, stream_id); - mutex_lock(&ac->cmd_lock); - spin_lock_irqsave(&(session[ac->session].session_lock), flags); - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL", __func__); - spin_unlock_irqrestore( - &(session[ac->session].session_lock), flags); - mutex_unlock(&ac->cmd_lock); - return; - } - - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = ((struct apr_svc *)ac->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_ASM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id); - hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id); - if (cmd_flg) - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - hdr->pkt_size = pkt_size; - spin_unlock_irqrestore( - &(session[ac->session].session_lock), flags); - mutex_unlock(&ac->cmd_lock); -} - -static void q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg) -{ - __q6asm_add_hdr(ac, hdr, pkt_size, cmd_flg, ac->stream_id); -} - -static void q6asm_stream_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg, int32_t stream_id) -{ - __q6asm_add_hdr(ac, hdr, pkt_size, cmd_flg, stream_id); -} - -static void __q6asm_add_hdr_async(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg, - uint32_t stream_id, u8 no_wait_flag) -{ - dev_vdbg(ac->dev, "%s: pkt_size = %d, cmd_flg = %d, session = %d stream_id=%d\n", - __func__, pkt_size, cmd_flg, ac->session, stream_id); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - if (ac->apr == NULL) { - pr_err("%s: AC APR is NULL", __func__); - return; - } - hdr->src_svc = ((struct apr_svc *)ac->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_ASM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id); - hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id); - if (cmd_flg) { - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - no_wait_flag); - - } - hdr->pkt_size = pkt_size; -} - -static void q6asm_add_hdr_async(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg) -{ - __q6asm_add_hdr_async(ac, hdr, pkt_size, cmd_flg, - ac->stream_id, WAIT_CMD); -} - -static void q6asm_stream_add_hdr_async(struct audio_client *ac, - struct apr_hdr *hdr, uint32_t pkt_size, - uint32_t cmd_flg, int32_t stream_id) -{ - __q6asm_add_hdr_async(ac, hdr, pkt_size, cmd_flg, - stream_id, NO_WAIT_CMD); -} - -static void q6asm_add_hdr_custom_topology(struct audio_client *ac, - struct apr_hdr *hdr, - uint32_t pkt_size) -{ - pr_debug("%s: pkt_size=%d session=%d\n", - __func__, pkt_size, ac->session); - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return; - } - - mutex_lock(&ac->cmd_lock); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = ((struct apr_svc *)ac->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_ASM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((ac->session << 8) & 0xFF00) | 0x01; - hdr->dest_port = 0; - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - hdr->pkt_size = pkt_size; - mutex_unlock(&ac->cmd_lock); -} - -static void q6asm_add_mmaphdr(struct audio_client *ac, struct apr_hdr *hdr, - u32 pkt_size, int dir) -{ - pr_debug("%s: pkt size=%d\n", - __func__, pkt_size); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->src_port = 0; - hdr->dest_port = 0; - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - dir, - WAIT_CMD); - hdr->pkt_size = pkt_size; -} - -/** - * q6asm_set_pp_params - * command to set ASM parameter data - * send memory mapping header for out of band case - * send pre-packed parameter data for in band case - * - * @ac: audio client handle - * @mem_hdr: memory mapping header - * @param_data: pre-packed parameter payload - * @param_size: size of pre-packed parameter data - * - * Returns 0 on success or error on failure - */ -int q6asm_set_pp_params(struct audio_client *ac, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 param_size) -{ - struct asm_stream_cmd_set_pp_params *asm_set_param = NULL; - int pkt_size = 0; - int ret = 0; - int session_id = 0; - - if (ac == NULL) { - pr_err("%s: Audio Client is NULL\n", __func__); - return -EINVAL; - } else if (ac->apr == NULL) { - pr_err("%s: APR pointer is NULL\n", __func__); - return -EINVAL; - } - - session_id = q6asm_get_session_id_from_audio_client(ac); - if (!session_id) - return -EINVAL; - - pkt_size = sizeof(struct asm_stream_cmd_set_pp_params); - /* Add param size to packet size when sending in-band only */ - if (param_data != NULL) - pkt_size += param_size; - asm_set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!asm_set_param) - return -ENOMEM; - - mutex_lock(&session[session_id].mutex_lock_per_session); - if (!q6asm_is_valid_audio_client(ac)) { - ret = -EINVAL; - goto done; - } - - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - q6asm_add_hdr_async(ac, &asm_set_param->apr_hdr, pkt_size, TRUE); - - /* With pre-packed data, only the opcode differs from V2 and V3. */ - if (q6common_is_instance_id_supported()) - asm_set_param->apr_hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V3; - else - asm_set_param->apr_hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; - - asm_set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - /* Out of band case */ - asm_set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - /* - * In band case. Parameter data must be pre-packed with its - * header before calling this function. Use - * q6common_pack_pp_params to pack parameter data and header - * correctly. - */ - memcpy(&asm_set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both mem header and param data\n", - __func__); - ret = -EINVAL; - goto done; - } - - atomic_set(&ac->cmd_state_pp, -1); - ret = apr_send_pkt(ac->apr, (uint32_t *)asm_set_param); - if (ret < 0) { - pr_err("%s: apr send failed rc %d\n", __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(ac->cmd_wait, - atomic_read(&ac->cmd_state_pp) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout sending apr pkt\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (atomic_read(&ac->cmd_state_pp) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(&ac->cmd_state_pp))); - ret = adsp_err_get_lnx_err_code(atomic_read(&ac->cmd_state_pp)); - goto done; - } - ret = 0; -done: - mutex_unlock(&session[session_id].mutex_lock_per_session); - kfree(asm_set_param); - return ret; -} -EXPORT_SYMBOL(q6asm_set_pp_params); - -/** - * q6asm_pack_and_set_pp_param_in_band - * command to pack and set parameter data for in band case - * - * @ac: audio client handle - * @param_hdr: parameter header - * @param_data: parameter data - * - * Returns 0 on success or error on failure - */ -int q6asm_pack_and_set_pp_param_in_band(struct audio_client *ac, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_data = NULL; - u32 packed_size = sizeof(union param_hdrs) + param_hdr.param_size; - int ret = 0; - - if (ac == NULL) { - pr_err("%s: Audio Client is NULL\n", __func__); - return -EINVAL; - } - - packed_data = kzalloc(packed_size, GFP_KERNEL); - if (packed_data == NULL) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_data, ¶m_hdr, param_data, - &packed_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d\n", __func__, ret); - goto done; - } - - ret = q6asm_set_pp_params(ac, NULL, packed_data, packed_size); -done: - kfree(packed_data); - return ret; -} -EXPORT_SYMBOL(q6asm_pack_and_set_pp_param_in_band); - -/** - * q6asm_set_soft_volume_module_instance_ids - * command to set module and instance ids for soft volume - * - * @instance: soft volume instance - * @param_hdr: parameter header - * - * Returns 0 on success or error on failure - */ -int q6asm_set_soft_volume_module_instance_ids(int instance, - struct param_hdr_v3 *param_hdr) -{ - if (param_hdr == NULL) { - pr_err("%s: Param header is NULL\n", __func__); - return -EINVAL; - } - - switch (instance) { - case SOFT_VOLUME_INSTANCE_2: - param_hdr->module_id = ASM_MODULE_ID_VOL_CTRL2; - param_hdr->instance_id = INSTANCE_ID_0; - return 0; - case SOFT_VOLUME_INSTANCE_1: - param_hdr->module_id = ASM_MODULE_ID_VOL_CTRL; - param_hdr->instance_id = INSTANCE_ID_0; - return 0; - default: - pr_err("%s: Invalid instance %d\n", __func__, instance); - return -EINVAL; - } -} -EXPORT_SYMBOL(q6asm_set_soft_volume_module_instance_ids); - -/** - * q6asm_open_read_compressed - - * command to open ASM in compressed read mode - * - * @ac: Audio client handle - * @format: capture format for ASM - * @passthrough_flag: flag to indicate passthrough option - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag) -{ - int rc = 0; - struct asm_stream_cmd_open_read_compressed open; - - if (ac == NULL) { - pr_err("%s: ac[%pK] NULL\n", __func__, ac); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: APR handle[%pK] NULL\n", __func__, ac->apr); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: session[%d] wr_format[0x%x]\n", __func__, ac->session, - format); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_READ_COMPRESSED; - atomic_set(&ac->cmd_state, -1); - - /* - * Below flag indicates whether DSP shall keep IEC61937 packing or - * unpack to raw compressed format - */ - if (format == FORMAT_IEC61937) { - open.mode_flags = 0x1; - open.frames_per_buf = 1; - pr_debug("%s: Flag 1 IEC61937 output\n", __func__); - } else { - open.mode_flags = 0; - open.frames_per_buf = 1; - pr_debug("%s: Flag 0 RAW_COMPR output\n", __func__); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for OPEN_READ_COMPR rc[%d]\n", - __func__, rc); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; - -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_read_compressed); - -static int __q6asm_open_read(struct audio_client *ac, - uint32_t format, uint16_t bits_per_sample, - uint32_t pcm_format_block_ver, - bool ts_mode, uint32_t enc_cfg_id) -{ - int rc = 0x00; - struct asm_stream_cmd_open_read_v3 open; - struct q6asm_cal_info cal_info; - - config_debug_fs_reset_index(); - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_READ_V3; - /* Stream prio : High, provide meta info with encoded frames */ - open.src_endpointype = ASM_END_POINT_DEVICE_MATRIX; - - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.preprocopo_id = cal_info.topology_id; - - - open.bits_per_sample = bits_per_sample; - open.mode_flags = 0x0; - - ac->topology = open.preprocopo_id; - ac->app_type = cal_info.app_type; - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) { - open.mode_flags |= ASM_LOW_LATENCY_TX_STREAM_SESSION << - ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ; - } else { - open.mode_flags |= ASM_LEGACY_STREAM_SESSION << - ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ; - } - - switch (format) { - case FORMAT_LINEAR_PCM: - open.mode_flags |= 0x00; - open.enc_cfg_id = q6asm_get_pcm_format_id(pcm_format_block_ver); - if (ts_mode) - open.mode_flags |= ABSOLUTE_TIMESTAMP_ENABLE; - break; - case FORMAT_MPEG4_AAC: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_G711_ALAW_FS: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_G711_ALAW_FS; - break; - case FORMAT_G711_MLAW_FS: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_G711_MLAW_FS; - break; - case FORMAT_V13K: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_V13K_FS; - break; - case FORMAT_EVRC: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_EVRC_FS; - break; - case FORMAT_AMRNB: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_AMRNB_FS; - break; - case FORMAT_AMRWB: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_AMRWB_FS; - break; - case FORMAT_BESPOKE: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = enc_cfg_id; - if (ts_mode) - open.mode_flags |= ABSOLUTE_TIMESTAMP_ENABLE; - break; - default: - pr_err("%s: Invalid format 0x%x\n", - __func__, format); - rc = -EINVAL; - goto fail_cmd; - } - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open read\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - ac->io_mode |= TUN_READ_IO_MODE; - - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_open_read - - * command to open ASM in read mode - * - * @ac: Audio client handle - * @format: capture format for ASM - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read(struct audio_client *ac, - uint32_t format) -{ - return __q6asm_open_read(ac, format, 16, - PCM_MEDIA_FORMAT_V2 /*media fmt block ver*/, - false/*ts_mode*/, ENC_CFG_ID_NONE); -} -EXPORT_SYMBOL(q6asm_open_read); - -int q6asm_open_read_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V2 /*media fmt block ver*/, - false/*ts_mode*/, ENC_CFG_ID_NONE); -} - -/* - * asm_open_read_v3 - Opens audio capture session - * - * @ac: Client session handle - * @format: encoder format - * @bits_per_sample: bit width of capture session - */ -int q6asm_open_read_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V3/*media fmt block ver*/, - false/*ts_mode*/, ENC_CFG_ID_NONE); -} -EXPORT_SYMBOL(q6asm_open_read_v3); - -/* - * asm_open_read_v4 - Opens audio capture session - * - * @ac: Client session handle - * @format: encoder format - * @bits_per_sample: bit width of capture session - * @ts_mode: timestamp mode - */ -int q6asm_open_read_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, - uint32_t enc_cfg_id) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V4 /*media fmt block ver*/, - ts_mode, enc_cfg_id); -} -EXPORT_SYMBOL(q6asm_open_read_v4); - - -/* - * asm_open_read_v5 - Opens audio capture session - * - * @ac: Client session handle - * @format: encoder format - * @bits_per_sample: bit width of capture session - * @ts_mode: timestamp mode - */ -int q6asm_open_read_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, uint32_t enc_cfg_id) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V5 /*media fmt block ver*/, - ts_mode, enc_cfg_id); -} -EXPORT_SYMBOL(q6asm_open_read_v5); - - -/** - * q6asm_open_write_compressed - - * command to open ASM in compressed write mode - * - * @ac: Audio client handle - * @format: playback format for ASM - * @passthrough_flag: flag to indicate passthrough option - * - * Returns 0 on success or error on failure - */ -int q6asm_open_write_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag) -{ - int rc = 0; - struct asm_stream_cmd_open_write_compressed open; - - if (ac == NULL) { - pr_err("%s: ac[%pK] NULL\n", __func__, ac); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: APR handle[%pK] NULL\n", __func__, ac->apr); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: session[%d] wr_format[0x%x]", __func__, ac->session, - format); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED; - atomic_set(&ac->cmd_state, -1); - - switch (format) { - case FORMAT_AC3: - open.fmt_id = ASM_MEDIA_FMT_AC3; - break; - case FORMAT_EAC3: - open.fmt_id = ASM_MEDIA_FMT_EAC3; - break; - case FORMAT_DTS: - open.fmt_id = ASM_MEDIA_FMT_DTS; - break; - case FORMAT_DSD: - open.fmt_id = ASM_MEDIA_FMT_DSD; - break; - case FORMAT_GEN_COMPR: - open.fmt_id = ASM_MEDIA_FMT_GENERIC_COMPRESSED; - break; - case FORMAT_TRUEHD: - open.fmt_id = ASM_MEDIA_FMT_TRUEHD; - break; - case FORMAT_IEC61937: - open.fmt_id = ASM_MEDIA_FMT_IEC; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, format); - rc = -EINVAL; - goto fail_cmd; - } - /* Below flag indicates the DSP that Compressed audio input - * stream is not IEC 61937 or IEC 60958 packetizied - */ - if (passthrough_flag == COMPRESSED_PASSTHROUGH || - passthrough_flag == COMPRESSED_PASSTHROUGH_DSD || - passthrough_flag == COMPRESSED_PASSTHROUGH_GEN) { - open.flags = 0x0; - pr_debug("%s: Flag 0 COMPRESSED_PASSTHROUGH\n", __func__); - } else if (passthrough_flag == COMPRESSED_PASSTHROUGH_CONVERT) { - open.flags = 0x8; - pr_debug("%s: Flag 8 - COMPRESSED_PASSTHROUGH_CONVERT\n", - __func__); - } else if (passthrough_flag == COMPRESSED_PASSTHROUGH_IEC61937) { - open.flags = 0x1; - pr_debug("%s: Flag 1 - COMPRESSED_PASSTHROUGH_IEC61937\n", - __func__); - } else { - pr_err("%s: Invalid passthrough type[%d]\n", - __func__, passthrough_flag); - rc = -EINVAL; - goto fail_cmd; - } - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for OPEN_WRITE_COMPR rc[%d]\n", - __func__, rc); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; - -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_write_compressed); - -static int __q6asm_open_write(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, uint32_t stream_id, - bool is_gapless_mode, - uint32_t pcm_format_block_ver) -{ - int rc = 0x00; - struct asm_stream_cmd_open_write_v3 open; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - dev_vdbg(ac->dev, "%s: session[%d] wr_format[0x%x]\n", - __func__, ac->session, format); - - q6asm_stream_add_hdr(ac, &open.hdr, sizeof(open), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&open.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - dev_vdbg(ac->dev, "%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, open.hdr.token, stream_id, ac->session); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_WRITE_V3; - open.mode_flags = 0x00; - if (ac->perf_mode == ULL_POST_PROCESSING_PCM_MODE) - open.mode_flags |= ASM_ULL_POST_PROCESSING_STREAM_SESSION; - else if (ac->perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_ULTRA_LOW_LATENCY_STREAM_SESSION; - else if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION; - else { - open.mode_flags |= ASM_LEGACY_STREAM_SESSION; - if (is_gapless_mode) - open.mode_flags |= 1 << ASM_SHIFT_GAPLESS_MODE_FLAG; - } - - /* source endpoint : matrix */ - open.sink_endpointype = ASM_END_POINT_DEVICE_MATRIX; - open.bits_per_sample = bits_per_sample; - - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.postprocopo_id = cal_info.topology_id; - - if (ac->perf_mode != LEGACY_PCM_MODE) - open.postprocopo_id = ASM_STREAM_POSTPROCOPO_ID_NONE; - - pr_debug("%s: perf_mode %d asm_topology 0x%x bps %d\n", __func__, - ac->perf_mode, open.postprocopo_id, open.bits_per_sample); - - /* - * For Gapless playback it will use the same session for next stream, - * So use the same topology - */ - if (!ac->topology) { - ac->topology = open.postprocopo_id; - ac->app_type = cal_info.app_type; - } - switch (format) { - case FORMAT_LINEAR_PCM: - open.dec_fmt_id = q6asm_get_pcm_format_id(pcm_format_block_ver); - break; - case FORMAT_MPEG4_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_MPEG4_MULTI_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_WMA_V9: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V9_V2; - break; - case FORMAT_WMA_V10PRO: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V10PRO_V2; - break; - case FORMAT_AMRNB: - open.dec_fmt_id = ASM_MEDIA_FMT_AMRNB_FS; - break; - case FORMAT_AMRWB: - open.dec_fmt_id = ASM_MEDIA_FMT_AMRWB_FS; - break; - case FORMAT_AMR_WB_PLUS: - open.dec_fmt_id = ASM_MEDIA_FMT_AMR_WB_PLUS_V2; - break; - case FORMAT_MP3: - open.dec_fmt_id = ASM_MEDIA_FMT_MP3; - break; - case FORMAT_AC3: - open.dec_fmt_id = ASM_MEDIA_FMT_AC3; - break; - case FORMAT_EAC3: - open.dec_fmt_id = ASM_MEDIA_FMT_EAC3; - break; - case FORMAT_MP2: - open.dec_fmt_id = ASM_MEDIA_FMT_MP2; - break; - case FORMAT_FLAC: - open.dec_fmt_id = ASM_MEDIA_FMT_FLAC; - break; - case FORMAT_ALAC: - open.dec_fmt_id = ASM_MEDIA_FMT_ALAC; - break; - case FORMAT_VORBIS: - open.dec_fmt_id = ASM_MEDIA_FMT_VORBIS; - break; - case FORMAT_APE: - open.dec_fmt_id = ASM_MEDIA_FMT_APE; - break; - case FORMAT_DSD: - open.dec_fmt_id = ASM_MEDIA_FMT_DSD; - break; - case FORMAT_APTX: - open.dec_fmt_id = ASM_MEDIA_FMT_APTX; - break; - case FORMAT_GEN_COMPR: - open.dec_fmt_id = ASM_MEDIA_FMT_GENERIC_COMPRESSED; - break; - default: - pr_err("%s: Invalid format 0x%x\n", __func__, format); - rc = -EINVAL; - goto fail_cmd; - } - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open write\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - ac->io_mode |= TUN_WRITE_IO_MODE; - - return 0; -fail_cmd: - return rc; -} - -int q6asm_open_write(struct audio_client *ac, uint32_t format) -{ - return __q6asm_open_write(ac, format, 16, ac->stream_id, - false /*gapless*/, - PCM_MEDIA_FORMAT_V2 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write); - -int q6asm_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V2 /*pcm_format_block_ver*/); -} - -/* - * q6asm_open_write_v3 - Opens audio playback session - * - * @ac: Client session handle - * @format: decoder format - * @bits_per_sample: bit width of playback session - */ -int q6asm_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V3 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write_v3); - -/* - * q6asm_open_write_v4 - Opens audio playback session - * - * @ac: Client session handle - * @format: decoder format - * @bits_per_sample: bit width of playback session - */ -int q6asm_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V4 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write_v4); - -int q6asm_stream_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V2 /*pcm_format_block_ver*/); -} - -/* - * q6asm_stream_open_write_v3 - Creates audio stream for playback - * - * @ac: Client session handle - * @format: asm playback format - * @bits_per_sample: bit width of requested stream - * @stream_id: stream id of stream to be associated with this session - * @is_gapless_mode: true if gapless mode needs to be enabled - */ -int q6asm_stream_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V3 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_stream_open_write_v3); - -/* - * q6asm_open_write_v5 - Opens audio playback session - * - * @ac: Client session handle - * @format: decoder format - * @bits_per_sample: bit width of playback session - */ -int q6asm_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V5 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write_v5); - - -/* - * q6asm_stream_open_write_v4 - Creates audio stream for playback - * - * @ac: Client session handle - * @format: asm playback format - * @bits_per_sample: bit width of requested stream - * @stream_id: stream id of stream to be associated with this session - * @is_gapless_mode: true if gapless mode needs to be enabled - */ -int q6asm_stream_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V4 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_stream_open_write_v4); - -/* - * q6asm_stream_open_write_v5 - Creates audio stream for playback - * - * @ac: Client session handle - * @format: asm playback format - * @bits_per_sample: bit width of requested stream - * @stream_id: stream id of stream to be associated with this session - * @is_gapless_mode: true if gapless mode needs to be enabled - */ -int q6asm_stream_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V5 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_stream_open_write_v5); - - -static int __q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format, bool is_meta_data_mode, - uint32_t bits_per_sample, - bool overwrite_topology, int topology) -{ - int rc = 0x00; - struct asm_stream_cmd_open_readwrite_v2 open; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - pr_debug("%s: wr_format[0x%x]rd_format[0x%x]\n", - __func__, wr_format, rd_format); - - ac->io_mode |= NT_MODE; - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_READWRITE_V2; - - open.mode_flags = is_meta_data_mode ? BUFFER_META_ENABLE : 0; - open.bits_per_sample = bits_per_sample; - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.postprocopo_id = cal_info.topology_id; - - open.postprocopo_id = overwrite_topology ? - topology : open.postprocopo_id; - ac->topology = open.postprocopo_id; - ac->app_type = cal_info.app_type; - - - switch (wr_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.dec_fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - break; - case FORMAT_MPEG4_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_MPEG4_MULTI_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_WMA_V9: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V9_V2; - break; - case FORMAT_WMA_V10PRO: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V10PRO_V2; - break; - case FORMAT_AMRNB: - open.dec_fmt_id = ASM_MEDIA_FMT_AMRNB_FS; - break; - case FORMAT_AMRWB: - open.dec_fmt_id = ASM_MEDIA_FMT_AMRWB_FS; - break; - case FORMAT_AMR_WB_PLUS: - open.dec_fmt_id = ASM_MEDIA_FMT_AMR_WB_PLUS_V2; - break; - case FORMAT_V13K: - open.dec_fmt_id = ASM_MEDIA_FMT_V13K_FS; - break; - case FORMAT_EVRC: - open.dec_fmt_id = ASM_MEDIA_FMT_EVRC_FS; - break; - case FORMAT_EVRCB: - open.dec_fmt_id = ASM_MEDIA_FMT_EVRCB_FS; - break; - case FORMAT_EVRCWB: - open.dec_fmt_id = ASM_MEDIA_FMT_EVRCWB_FS; - break; - case FORMAT_MP3: - open.dec_fmt_id = ASM_MEDIA_FMT_MP3; - break; - case FORMAT_ALAC: - open.dec_fmt_id = ASM_MEDIA_FMT_ALAC; - break; - case FORMAT_APE: - open.dec_fmt_id = ASM_MEDIA_FMT_APE; - break; - case FORMAT_DSD: - open.dec_fmt_id = ASM_MEDIA_FMT_DSD; - break; - case FORMAT_G711_ALAW_FS: - open.dec_fmt_id = ASM_MEDIA_FMT_G711_ALAW_FS; - break; - case FORMAT_G711_MLAW_FS: - open.dec_fmt_id = ASM_MEDIA_FMT_G711_MLAW_FS; - break; - default: - pr_err("%s: Invalid format 0x%x\n", - __func__, wr_format); - rc = -EINVAL; - goto fail_cmd; - } - - switch (rd_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.enc_cfg_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - break; - case FORMAT_MPEG4_AAC: - open.enc_cfg_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_G711_ALAW_FS: - open.enc_cfg_id = ASM_MEDIA_FMT_G711_ALAW_FS; - break; - case FORMAT_G711_MLAW_FS: - open.enc_cfg_id = ASM_MEDIA_FMT_G711_MLAW_FS; - break; - case FORMAT_V13K: - open.enc_cfg_id = ASM_MEDIA_FMT_V13K_FS; - break; - case FORMAT_EVRC: - open.enc_cfg_id = ASM_MEDIA_FMT_EVRC_FS; - break; - case FORMAT_AMRNB: - open.enc_cfg_id = ASM_MEDIA_FMT_AMRNB_FS; - break; - case FORMAT_AMRWB: - open.enc_cfg_id = ASM_MEDIA_FMT_AMRWB_FS; - break; - case FORMAT_ALAC: - open.enc_cfg_id = ASM_MEDIA_FMT_ALAC; - break; - case FORMAT_APE: - open.enc_cfg_id = ASM_MEDIA_FMT_APE; - break; - default: - pr_err("%s: Invalid format 0x%x\n", - __func__, rd_format); - rc = -EINVAL; - goto fail_cmd; - } - dev_vdbg(ac->dev, "%s: rdformat[0x%x]wrformat[0x%x]\n", __func__, - open.enc_cfg_id, open.dec_fmt_id); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open read-write\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_open_read_write - - * command to open ASM in read/write mode - * - * @ac: Audio client handle - * @rd_format: capture format for ASM - * @wr_format: playback format for ASM - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format) -{ - return __q6asm_open_read_write(ac, rd_format, wr_format, - true/*meta data mode*/, - 16 /*bits_per_sample*/, - false /*overwrite_topology*/, 0); -} -EXPORT_SYMBOL(q6asm_open_read_write); - -/** - * q6asm_open_read_write_v2 - - * command to open ASM in bi-directional read/write mode - * - * @ac: Audio client handle - * @rd_format: capture format for ASM - * @wr_format: playback format for ASM - * @is_meta_data_mode: mode to indicate if meta data present - * @bits_per_sample: number of bits per sample - * @overwrite_topology: topology to be overwritten flag - * @topology: Topology for ASM - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read_write_v2(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format, bool is_meta_data_mode, - uint32_t bits_per_sample, bool overwrite_topology, - int topology) -{ - return __q6asm_open_read_write(ac, rd_format, wr_format, - is_meta_data_mode, bits_per_sample, - overwrite_topology, topology); -} -EXPORT_SYMBOL(q6asm_open_read_write_v2); - -/** - * q6asm_open_loopback_v2 - - * command to open ASM in loopback mode - * - * @ac: Audio client handle - * @bits_per_sample: number of bits per sample - * - * Returns 0 on success or error on failure - */ -int q6asm_open_loopback_v2(struct audio_client *ac, uint16_t bits_per_sample) -{ - int rc = 0x00; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) { - struct asm_stream_cmd_open_transcode_loopback_t open; - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK; - - open.mode_flags = 0; - open.src_endpoint_type = 0; - open.sink_endpoint_type = 0; - open.src_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - open.sink_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.audproc_topo_id = cal_info.topology_id; - - ac->app_type = cal_info.app_type; - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION; - else - open.mode_flags |= ASM_LEGACY_STREAM_SESSION; - ac->topology = open.audproc_topo_id; - open.bits_per_sample = bits_per_sample; - open.reserved = 0; - pr_debug("%s: opening a transcode_loopback with mode_flags =[%d] session[%d]\n", - __func__, open.mode_flags, ac->session); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - } else {/*if(ac->perf_mode == LEGACY_PCM_MODE)*/ - struct asm_stream_cmd_open_loopback_v2 open; - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_LOOPBACK_V2; - - open.mode_flags = 0; - open.src_endpointype = 0; - open.sink_endpointype = 0; - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.postprocopo_id = cal_info.topology_id; - - ac->app_type = cal_info.app_type; - ac->topology = open.postprocopo_id; - open.bits_per_sample = bits_per_sample; - open.reserved = 0; - pr_debug("%s: opening a loopback_v2 with mode_flags =[%d] session[%d]\n", - __func__, open.mode_flags, ac->session); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open_loopback\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_loopback_v2); - -/** - * q6asm_open_transcode_loopback - - * command to open ASM in transcode loopback mode - * - * @ac: Audio client handle - * @bits_per_sample: number of bits per sample - * @source_format: Format of clip - * @sink_format: end device supported format - * - * Returns 0 on success or error on failure - */ -int q6asm_open_transcode_loopback(struct audio_client *ac, - uint16_t bits_per_sample, - uint32_t source_format, uint32_t sink_format) -{ - int rc = 0x00; - struct asm_stream_cmd_open_transcode_loopback_t open; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK; - - open.mode_flags = 0; - open.src_endpoint_type = 0; - open.sink_endpoint_type = 0; - switch (source_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.src_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - break; - case FORMAT_AC3: - open.src_format_id = ASM_MEDIA_FMT_AC3; - break; - case FORMAT_EAC3: - open.src_format_id = ASM_MEDIA_FMT_EAC3; - break; - default: - pr_err("%s: Unsupported src fmt [%d]\n", - __func__, source_format); - return -EINVAL; - } - switch (sink_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.sink_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - break; - default: - pr_err("%s: Unsupported sink fmt [%d]\n", - __func__, sink_format); - return -EINVAL; - } - - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.audproc_topo_id = cal_info.topology_id; - - - ac->app_type = cal_info.app_type; - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION; - else - open.mode_flags |= ASM_LEGACY_STREAM_SESSION; - ac->topology = open.audproc_topo_id; - open.bits_per_sample = bits_per_sample; - open.reserved = 0; - pr_debug("%s: opening a transcode_loopback with mode_flags =[%d] session[%d]\n", - __func__, open.mode_flags, ac->session); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open_transcode_loopback\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_transcode_loopback); - -static -int q6asm_set_shared_circ_buff(struct audio_client *ac, - struct asm_stream_cmd_open_shared_io *open, - int bufsz, int bufcnt, - int dir) -{ - struct audio_buffer *buf_circ; - int bytes_to_alloc, rc; - size_t len; - - mutex_lock(&ac->cmd_lock); - - if (ac->port[dir].buf) { - pr_err("%s: Buffer already allocated\n", __func__); - rc = -EINVAL; - goto done; - } - - buf_circ = kzalloc(sizeof(struct audio_buffer), GFP_KERNEL); - - if (!buf_circ) { - rc = -ENOMEM; - goto done; - } - - bytes_to_alloc = bufsz * bufcnt; - bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); - - rc = msm_audio_ion_alloc(&buf_circ->dma_buf, - bytes_to_alloc, - &buf_circ->phys, - &len, &buf_circ->data); - - if (rc) { - pr_err("%s: Audio ION alloc is failed, rc = %d\n", __func__, - rc); - kfree(buf_circ); - goto done; - } - - ac->port[dir].buf = buf_circ; - buf_circ->used = dir ^ 1; - buf_circ->size = bytes_to_alloc; - buf_circ->actual_size = bytes_to_alloc; - memset(buf_circ->data, 0, buf_circ->actual_size); - - ac->port[dir].max_buf_cnt = 1; - - open->shared_circ_buf_mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - open->shared_circ_buf_num_regions = 1; - open->shared_circ_buf_property_flag = 0x00; - open->shared_circ_buf_start_phy_addr_lsw = - lower_32_bits(buf_circ->phys); - open->shared_circ_buf_start_phy_addr_msw = - msm_audio_populate_upper_32_bits(buf_circ->phys); - open->shared_circ_buf_size = bufsz * bufcnt; - - open->map_region_circ_buf.shm_addr_lsw = lower_32_bits(buf_circ->phys); - open->map_region_circ_buf.shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_circ->phys); - open->map_region_circ_buf.mem_size_bytes = bytes_to_alloc; - -done: - mutex_unlock(&ac->cmd_lock); - return rc; -} - - -static -int q6asm_set_shared_pos_buff(struct audio_client *ac, - struct asm_stream_cmd_open_shared_io *open, - int dir) -{ - struct audio_buffer *buf_pos = &ac->shared_pos_buf; - int rc; - size_t len; - int bytes_to_alloc = sizeof(struct asm_shared_position_buffer); - - mutex_lock(&ac->cmd_lock); - - bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); - - rc = msm_audio_ion_alloc(&buf_pos->dma_buf, - bytes_to_alloc, - &buf_pos->phys, &len, - &buf_pos->data); - - if (rc) { - pr_err("%s: Audio pos buf ION alloc is failed, rc = %d\n", - __func__, rc); - goto done; - } - - buf_pos->used = dir ^ 1; - buf_pos->size = bytes_to_alloc; - buf_pos->actual_size = bytes_to_alloc; - - open->shared_pos_buf_mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - open->shared_pos_buf_num_regions = 1; - open->shared_pos_buf_property_flag = 0x00; - open->shared_pos_buf_phy_addr_lsw = lower_32_bits(buf_pos->phys); - open->shared_pos_buf_phy_addr_msw = - msm_audio_populate_upper_32_bits(buf_pos->phys); - - open->map_region_pos_buf.shm_addr_lsw = lower_32_bits(buf_pos->phys); - open->map_region_pos_buf.shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_pos->phys); - open->map_region_pos_buf.mem_size_bytes = bytes_to_alloc; - -done: - mutex_unlock(&ac->cmd_lock); - return rc; -} - -/* - * q6asm_open_shared_io: Open an ASM session for pull mode (playback) - * or push mode (capture). - * parameters - * config - session parameters (channels, bits_per_sample, sr) - * dir - stream direction (IN for playback, OUT for capture) - * use_default_chmap: true if default channel map to be used - * channel_map: input channel map - * returns 0 if successful, error code otherwise - */ -int q6asm_open_shared_io(struct audio_client *ac, - struct shared_io_config *config, - int dir, bool use_default_chmap, u8 *channel_map) -{ - struct asm_stream_cmd_open_shared_io *open; - u8 *channel_mapping; - int i, size_of_open, num_watermarks, bufsz, bufcnt, rc, flags = 0; - struct q6asm_cal_info cal_info; - - if (!ac || !config) - return -EINVAL; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - - if (config->channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, - config->channels); - return -EINVAL; - } - - bufsz = config->bufsz; - bufcnt = config->bufcnt; - num_watermarks = 0; - - ac->config = *config; - - if (ac->session <= 0 || ac->session > SESSION_MAX) { - pr_err("%s: Session %d is out of bounds\n", - __func__, ac->session); - return -EINVAL; - } - - size_of_open = sizeof(struct asm_stream_cmd_open_shared_io) + - (sizeof(struct asm_shared_watermark_level) * num_watermarks); - - open = kzalloc(PAGE_ALIGN(size_of_open), GFP_KERNEL); - if (!open) - return -ENOMEM; - - q6asm_stream_add_hdr(ac, &open->hdr, size_of_open, TRUE, - ac->stream_id); - - atomic_set(&ac->cmd_state, 1); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x, perf %d\n", - __func__, open->hdr.token, ac->stream_id, ac->session, - ac->perf_mode); - - open->hdr.opcode = - dir == IN ? ASM_STREAM_CMD_OPEN_PULL_MODE_WRITE : - ASM_STREAM_CMD_OPEN_PUSH_MODE_READ; - - pr_debug("%s perf_mode %d\n", __func__, ac->perf_mode); - if (dir == IN) - if (ac->perf_mode == ULL_POST_PROCESSING_PCM_MODE) - flags = 4 << ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE; - else if (ac->perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) - flags = 2 << ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE; - else if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - flags = 1 << ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE; - else - pr_err("Invalid perf mode for pull write\n"); - else - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - flags = ASM_LOW_LATENCY_TX_STREAM_SESSION << - ASM_SHIFT_STREAM_PERF_FLAG_PUSH_MODE_READ; - else - pr_err("Invalid perf mode for push read\n"); - - if (flags == 0) { - pr_err("%s: Invalid mode[%d]\n", __func__, - ac->perf_mode); - kfree(open); - return -EINVAL; - - } - - pr_debug("open.mode_flags = 0x%x\n", flags); - open->mode_flags = flags; - open->endpoint_type = ASM_END_POINT_DEVICE_MATRIX; - open->topo_bits_per_sample = config->bits_per_sample; - - rc = q6asm_get_asm_topology_apptype(&cal_info); - open->topo_id = cal_info.topology_id; - - if (config->format == FORMAT_LINEAR_PCM) - open->fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - else { - pr_err("%s: Invalid format[%d]\n", __func__, config->format); - rc = -EINVAL; - goto done; - } - - rc = q6asm_set_shared_circ_buff(ac, open, bufsz, bufcnt, dir); - - if (rc) - goto done; - - ac->port[dir].tmp_hdl = 0; - - rc = q6asm_set_shared_pos_buff(ac, open, dir); - - if (rc) - goto done; - - /* asm_multi_channel_pcm_fmt_blk_v3 */ - open->fmt.num_channels = config->channels; - open->fmt.bits_per_sample = config->bits_per_sample; - open->fmt.sample_rate = config->rate; - open->fmt.is_signed = 1; - open->fmt.sample_word_size = config->sample_word_size; - - channel_mapping = open->fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - rc = q6asm_map_channels(channel_mapping, config->channels, - false); - if (rc) { - pr_err("%s: Map channels failed, ret: %d\n", - __func__, rc); - goto done; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - open->num_watermark_levels = num_watermarks; - for (i = 0; i < num_watermarks; i++) { - open->watermark[i].watermark_level_bytes = i * - ((bufsz * bufcnt) / num_watermarks); - pr_debug("%s: Watermark level set for %i\n", - __func__, - open->watermark[i].watermark_level_bytes); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) open); - if (rc < 0) { - pr_err("%s: Open failed op[0x%x]rc[%d]\n", - __func__, open->hdr.opcode, rc); - goto done; - } - - pr_debug("%s: sent open apr pkt\n", __func__); - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) <= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: Timeout. Waited for open write apr pkt rc[%d]\n", - __func__, rc); - rc = -ETIMEDOUT; - goto done; - } - - if (atomic_read(&ac->cmd_state) < 0) { - pr_err("%s: DSP returned error [%d]\n", __func__, - atomic_read(&ac->cmd_state)); - rc = -EINVAL; - goto done; - } - - ac->io_mode |= TUN_WRITE_IO_MODE; - rc = 0; -done: - kfree(open); - return rc; -} -EXPORT_SYMBOL(q6asm_open_shared_io); - -/* - * q6asm_shared_io_buf: Returns handle to the shared circular buffer being - * used for pull/push mode. - * parameters - * dir - used to identify input/output port - * returns buffer handle - */ -struct audio_buffer *q6asm_shared_io_buf(struct audio_client *ac, - int dir) -{ - struct audio_port_data *port; - - if (!ac) { - pr_err("%s: ac is null\n", __func__); - return NULL; - } - port = &ac->port[dir]; - return port->buf; -} -EXPORT_SYMBOL(q6asm_shared_io_buf); - -/* - * q6asm_shared_io_free: Frees memory allocated for a pull/push session - * parameters - * dir - port direction - * returns 0 if successful, error otherwise - */ -int q6asm_shared_io_free(struct audio_client *ac, int dir) -{ - struct audio_port_data *port; - - if (!ac) { - pr_err("%s: audio client is null\n", __func__); - return -EINVAL; - } - port = &ac->port[dir]; - mutex_lock(&ac->cmd_lock); - if (port->buf && port->buf->data) { - msm_audio_ion_free(port->buf->dma_buf); - port->buf->dma_buf = NULL; - port->max_buf_cnt = 0; - kfree(port->buf); - port->buf = NULL; - } - if (ac->shared_pos_buf.data) { - msm_audio_ion_free(ac->shared_pos_buf.dma_buf); - ac->shared_pos_buf.dma_buf = NULL; - } - mutex_unlock(&ac->cmd_lock); - return 0; -} -EXPORT_SYMBOL(q6asm_shared_io_free); - -/* - * q6asm_get_shared_pos: Returns current read index/write index as observed - * by the DSP. Note that this is an offset and iterates from [0,BUF_SIZE - 1] - * parameters - (all output) - * read_index - offset - * wall_clk_msw1 - ADSP wallclock msw - * wall_clk_lsw1 - ADSP wallclock lsw - * returns 0 if successful, -EAGAIN if DSP failed to update after some - * retries - */ -int q6asm_get_shared_pos(struct audio_client *ac, uint32_t *read_index, - uint32_t *wall_clk_msw1, uint32_t *wall_clk_lsw1) -{ - struct asm_shared_position_buffer *pos_buf; - uint32_t frame_cnt1, frame_cnt2; - int i, j; - - if (!ac) { - pr_err("%s: audio client is null\n", __func__); - return -EINVAL; - } - - pos_buf = ac->shared_pos_buf.data; - - /* always try to get the latest update in the shared pos buffer */ - for (i = 0; i < 2; i++) { - /* retry until there is an update from DSP */ - for (j = 0; j < 5; j++) { - frame_cnt1 = pos_buf->frame_counter; - if (frame_cnt1 != 0) - break; - } - - *wall_clk_msw1 = pos_buf->wall_clock_us_msw; - *wall_clk_lsw1 = pos_buf->wall_clock_us_lsw; - *read_index = pos_buf->index; - frame_cnt2 = pos_buf->frame_counter; - - if (frame_cnt1 != frame_cnt2) - continue; - return 0; - } - pr_err("%s out of tries trying to get a good read, try again\n", - __func__); - return -EAGAIN; -} -EXPORT_SYMBOL(q6asm_get_shared_pos); - -/** - * q6asm_run - - * command to set ASM to run state - * - * @ac: Audio client handle - * @flags: Flags for session - * @msw_ts: upper 32bits timestamp - * @lsw_ts: lower 32bits timestamp - * - * Returns 0 on success or error on failure - */ -int q6asm_run(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts) -{ - struct asm_session_cmd_run_v2 run; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_add_hdr(ac, &run.hdr, sizeof(run), TRUE); - atomic_set(&ac->cmd_state, -1); - - run.hdr.opcode = ASM_SESSION_CMD_RUN_V2; - run.flags = flags; - run.time_lsw = lsw_ts; - run.time_msw = msw_ts; - - config_debug_fs_run(); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &run); - if (rc < 0) { - pr_err("%s: Commmand run failed[%d]", - __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for run success", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_run); - -static int __q6asm_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts, uint32_t stream_id) -{ - struct asm_session_cmd_run_v2 run; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_stream_add_hdr_async(ac, &run.hdr, sizeof(run), TRUE, stream_id); - atomic_set(&ac->cmd_state, 1); - run.hdr.opcode = ASM_SESSION_CMD_RUN_V2; - run.flags = flags; - run.time_lsw = lsw_ts; - run.time_msw = msw_ts; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &run); - if (rc < 0) { - pr_err("%s: Commmand run failed[%d]", __func__, rc); - return -EINVAL; - } - return 0; -} - -/** - * q6asm_run_nowait - - * command to set ASM to run state with no wait for ack - * - * @ac: Audio client handle - * @flags: Flags for session - * @msw_ts: upper 32bits timestamp - * @lsw_ts: lower 32bits timestamp - * - * Returns 0 on success or error on failure - */ -int q6asm_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts) -{ - return __q6asm_run_nowait(ac, flags, msw_ts, lsw_ts, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_run_nowait); - -int q6asm_stream_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts, uint32_t stream_id) -{ - return __q6asm_run_nowait(ac, flags, msw_ts, lsw_ts, stream_id); -} - -/** - * q6asm_enc_cfg_blk_custom - - * command to set encode cfg block for custom - * - * @ac: Audio client handle - * @sample_rate: Sample rate - * @channels: number of ASM channels - * @format: custom format flag - * @cfg: generic encoder config - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_custom(struct audio_client *ac, - uint32_t sample_rate, uint32_t channels, - uint32_t format, void *cfg) -{ - struct asm_custom_enc_cfg_t_v2 enc_cfg; - int rc = 0; - uint32_t custom_size; - struct snd_enc_generic *enc_generic = (struct snd_enc_generic *) cfg; - - custom_size = enc_generic->reserved[1]; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d] size[%d] res[2]=[%d] res[3]=[%d]\n", - __func__, ac->session, custom_size, enc_generic->reserved[2], - enc_generic->reserved[3]); - - pr_debug("%s: res[4]=[%d] sr[%d] ch[%d] format[%d]\n", - __func__, enc_generic->reserved[4], sample_rate, - channels, format); - - memset(&enc_cfg, 0, sizeof(struct asm_custom_enc_cfg_t_v2)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_custom_enc_cfg_t_v2) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = ENC_FRAMES_PER_BUFFER; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.num_channels = channels; - enc_cfg.sample_rate = sample_rate; - - if (q6asm_map_channels(enc_cfg.channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - if (format == FORMAT_BESPOKE && custom_size && - custom_size <= sizeof(enc_cfg.custom_data)) { - memcpy(enc_cfg.custom_data, &enc_generic->reserved[2], - custom_size); - enc_cfg.custom_size = custom_size; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_custom); - -/** - * q6asm_enc_cfg_blk_aac - - * command to set encode cfg block for aac - * - * @ac: Audio client handle - * @frames_per_buf: number of frames per buffer - * @sample_rate: Sample rate - * @channels: number of ASM channels - * @bit_rate: Bit rate info - * @mode: mode of AAC stream encode - * @format: aac format flag - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_aac(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate, uint32_t channels, - uint32_t bit_rate, uint32_t mode, uint32_t format) -{ - struct asm_aac_enc_cfg_v2 enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]SR[%d]ch[%d]bitrate[%d]mode[%d] format[%d]\n", - __func__, ac->session, frames_per_buf, - sample_rate, channels, bit_rate, mode, format); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_aac_enc_cfg_v2) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - enc_cfg.bit_rate = bit_rate; - enc_cfg.enc_mode = mode; - enc_cfg.aac_fmt_flag = format; - enc_cfg.channel_cfg = channels; - enc_cfg.sample_rate = sample_rate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_aac); - -/** - * q6asm_enc_cfg_blk_g711 - - * command to set encode cfg block for g711 - * - * @ac: Audio client handle - * @frames_per_buf: number of frames per buffer - * @sample_rate: Sample rate - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_g711(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate) -{ - struct asm_g711_enc_cfg_v2 enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]SR[%d]\n", - __func__, ac->session, frames_per_buf, - sample_rate); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_g711_enc_cfg_v2) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - enc_cfg.sample_rate = sample_rate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_g711); - -/** - * q6asm_set_encdec_chan_map - - * command to set encdec channel map - * - * @ac: Audio client handle - * @channels: number of channels - * - * Returns 0 on success or error on failure - */ -int q6asm_set_encdec_chan_map(struct audio_client *ac, - uint32_t num_channels) -{ - struct asm_dec_out_chan_map_param chan_map; - u8 *channel_mapping; - int rc = 0; - - if (num_channels > MAX_CHAN_MAP_CHANNELS) { - pr_err("%s: Invalid channel count %d\n", __func__, - num_channels); - return -EINVAL; - } - - pr_debug("%s: Session %d, num_channels = %d\n", - __func__, ac->session, num_channels); - q6asm_add_hdr(ac, &chan_map.hdr, sizeof(chan_map), TRUE); - atomic_set(&ac->cmd_state, -1); - chan_map.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - chan_map.encdec.param_id = ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP; - chan_map.encdec.param_size = sizeof(struct asm_dec_out_chan_map_param) - - (sizeof(struct apr_hdr) + - sizeof(struct asm_stream_cmd_set_encdec_param)); - chan_map.num_channels = num_channels; - channel_mapping = chan_map.channel_mapping; - memset(channel_mapping, PCM_CHANNEL_NULL, MAX_CHAN_MAP_CHANNELS); - - if (q6asm_map_channels(channel_mapping, num_channels, false)) { - pr_err("%s: map channels failed %d\n", __func__, num_channels); - return -EINVAL; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &chan_map); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", __func__, - chan_map.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_set_encdec_chan_map); - -/* - * q6asm_enc_cfg_blk_pcm_v5 - sends encoder configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @use_back_flavor: to configure back left and right channel - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -static int q6asm_enc_cfg_blk_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size, uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_enc_cfg_v5 enc_cfg; - struct asm_enc_cfg_blk_param_v2 enc_fg_blk; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&enc_cfg, 0, sizeof(enc_cfg)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(enc_fg_blk); - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - enc_cfg.sample_word_size = sample_word_size; - enc_cfg.endianness = endianness; - enc_cfg.mode = mode; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Command open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v5); - -/* - * q6asm_enc_cfg_blk_pcm_v4 - sends encoder configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @use_back_flavor: to configure back left and right channel - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_enc_cfg_blk_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size, uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_enc_cfg_v4 enc_cfg; - struct asm_enc_cfg_blk_param_v2 enc_fg_blk; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&enc_cfg, 0, sizeof(enc_cfg)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(enc_fg_blk); - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - enc_cfg.sample_word_size = sample_word_size; - enc_cfg.endianness = endianness; - enc_cfg.mode = mode; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Command open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v4); - -/* - * q6asm_enc_cfg_blk_pcm_v3 - sends encoder configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @use_back_flavor: to configure back left and right channel - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_enc_cfg_blk_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size) -{ - struct asm_multi_channel_pcm_enc_cfg_v3 enc_cfg; - struct asm_enc_cfg_blk_param_v2 enc_fg_blk; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&enc_cfg, 0, sizeof(enc_cfg)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(enc_fg_blk); - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - enc_cfg.sample_word_size = sample_word_size; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v3); - -/** - * q6asm_enc_cfg_blk_pcm_v2 - - * command to set encode config block for pcm_v2 - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: number of bits per sample - * @use_default_chmap: Flag indicating to use default ch_map or not - * @use_back_flavor: back flavor flag - * @channel_map: Custom channel map settings - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_pcm_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, uint16_t bits_per_sample, - bool use_default_chmap, bool use_back_flavor, u8 *channel_map) -{ - struct asm_multi_channel_pcm_enc_cfg_v2 enc_cfg; - u8 *channel_mapping; - u32 frames_per_buf = 0; - - int rc = 0; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: Session %d, rate = %d, channels = %d\n", __func__, - ac->session, rate, channels); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v2); - -static int __q6asm_enc_cfg_blk_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return q6asm_enc_cfg_blk_pcm_v5(ac, rate, channels, - bits_per_sample, true, false, NULL, - sample_word_size, endianness, mode); -} - -static int __q6asm_enc_cfg_blk_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return q6asm_enc_cfg_blk_pcm_v4(ac, rate, channels, - bits_per_sample, true, false, NULL, - sample_word_size, endianness, mode); -} - -static int __q6asm_enc_cfg_blk_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - return q6asm_enc_cfg_blk_pcm_v3(ac, rate, channels, - bits_per_sample, true, false, NULL, - sample_word_size); -} - -static int __q6asm_enc_cfg_blk_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, uint16_t bits_per_sample) -{ - return q6asm_enc_cfg_blk_pcm_v2(ac, rate, channels, - bits_per_sample, true, false, NULL); -} - -/** - * q6asm_enc_cfg_blk_pcm - - * command to set encode config block for pcm - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of channels - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - return __q6asm_enc_cfg_blk_pcm(ac, rate, channels, 16); -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm); - -int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, uint16_t bits_per_sample) -{ - return __q6asm_enc_cfg_blk_pcm(ac, rate, channels, bits_per_sample); -} - -/* - * q6asm_enc_cfg_blk_pcm_format_support_v3 - sends encoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_enc_cfg_blk_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - return __q6asm_enc_cfg_blk_pcm_v3(ac, rate, channels, - bits_per_sample, sample_word_size); -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_format_support_v3); - -/* - * q6asm_enc_cfg_blk_pcm_format_support_v4 - sends encoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_enc_cfg_blk_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_enc_cfg_blk_pcm_v4(ac, rate, channels, - bits_per_sample, sample_word_size, - endianness, mode); -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_format_support_v4); - -/* - * q6asm_enc_cfg_blk_pcm_format_support_v5 - sends encoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_enc_cfg_blk_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_enc_cfg_blk_pcm_v5(ac, rate, channels, - bits_per_sample, sample_word_size, - endianness, mode); -} - -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_format_support_v5); -/** - * q6asm_enc_cfg_blk_pcm_native - - * command to set encode config block for pcm_native - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of channels - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - struct asm_multi_channel_pcm_enc_cfg_v2 enc_cfg; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: Session %d, rate = %d, channels = %d\n", __func__, - ac->session, rate, channels); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.num_channels = 0;/*channels;*/ - enc_cfg.bits_per_sample = 16; - enc_cfg.sample_rate = 0;/*rate;*/ - enc_cfg.is_signed = 1; - channel_mapping = enc_cfg.channel_mapping; - - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", __func__, channels); - return -EINVAL; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_native); - -/* - * q6asm_map_channels: - * Provide default asm channel mapping for given channel count. - * - * @channel_mapping: buffer pointer to write back channel maps. - * @channels: channel count for which channel map is required. - * @use_back_flavor: use back channels instead of surround channels. - * Returns 0 for success, -EINVAL for unsupported channel count. - */ -int q6asm_map_channels(u8 *channel_mapping, uint32_t channels, - bool use_back_flavor) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[3] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[4] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[5] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - } else if (channels == 7) { - /* - * Configured for 5.1 channel mapping + 1 channel for debug - * Can be customized based on DSP. - */ - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[5] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - lchannel_mapping[6] = PCM_CHANNEL_CS; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - } else if (channels == 10) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_LFE; - lchannel_mapping[3] = PCM_CHANNEL_FC; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - lchannel_mapping[8] = PCM_CHANNEL_TFL; - lchannel_mapping[9] = PCM_CHANNEL_TFR; - } else if (channels == 12) { - /* - * Configured for 7.1.4 channel mapping - * Todo: Needs to be checked - */ - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - lchannel_mapping[8] = PCM_CHANNEL_TFL; - lchannel_mapping[9] = PCM_CHANNEL_TFR; - lchannel_mapping[10] = PCM_CHANNEL_TSL; - lchannel_mapping[11] = PCM_CHANNEL_TSR; - } else if (channels == 14) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_LFE; - lchannel_mapping[3] = PCM_CHANNEL_FC; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - lchannel_mapping[8] = PCM_CHANNEL_TFL; - lchannel_mapping[9] = PCM_CHANNEL_TFR; - lchannel_mapping[10] = PCM_CHANNEL_TSL; - lchannel_mapping[11] = PCM_CHANNEL_TSR; - lchannel_mapping[12] = PCM_CHANNEL_FLC; - lchannel_mapping[13] = PCM_CHANNEL_FRC; - } else if (channels == 16) { - /* - * Configured for 7.1.8 channel mapping - * Todo: Needs to be checked - */ - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - lchannel_mapping[8] = PCM_CHANNEL_TFL; - lchannel_mapping[9] = PCM_CHANNEL_TFR; - lchannel_mapping[10] = PCM_CHANNEL_TSL; - lchannel_mapping[11] = PCM_CHANNEL_TSR; - lchannel_mapping[12] = PCM_CHANNEL_FLC; - lchannel_mapping[13] = PCM_CHANNEL_FRC; - lchannel_mapping[14] = PCM_CHANNEL_RLC; - lchannel_mapping[15] = PCM_CHANNEL_RRC; - } else if (channels == 32) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_LFE; - lchannel_mapping[3] = PCM_CHANNEL_FC; - lchannel_mapping[4] = PCM_CHANNEL_LS; - lchannel_mapping[5] = PCM_CHANNEL_RS; - lchannel_mapping[6] = PCM_CHANNEL_LB; - lchannel_mapping[7] = PCM_CHANNEL_RB; - lchannel_mapping[8] = PCM_CHANNEL_CS; - lchannel_mapping[9] = PCM_CHANNEL_TS; - lchannel_mapping[10] = PCM_CHANNEL_CVH; - lchannel_mapping[11] = PCM_CHANNEL_MS; - lchannel_mapping[12] = PCM_CHANNEL_FLC; - lchannel_mapping[13] = PCM_CHANNEL_FRC; - lchannel_mapping[14] = PCM_CHANNEL_RLC; - lchannel_mapping[15] = PCM_CHANNEL_RRC; - lchannel_mapping[16] = PCM_CHANNEL_LFE2; - lchannel_mapping[17] = PCM_CHANNEL_SL; - lchannel_mapping[18] = PCM_CHANNEL_SR; - lchannel_mapping[19] = PCM_CHANNEL_TFL; - lchannel_mapping[20] = PCM_CHANNEL_TFR; - lchannel_mapping[21] = PCM_CHANNEL_TC; - lchannel_mapping[22] = PCM_CHANNEL_TBL; - lchannel_mapping[23] = PCM_CHANNEL_TBR; - lchannel_mapping[24] = PCM_CHANNEL_TSL; - lchannel_mapping[25] = PCM_CHANNEL_TSR; - lchannel_mapping[26] = PCM_CHANNEL_TBC; - lchannel_mapping[27] = PCM_CHANNEL_BFC; - lchannel_mapping[28] = PCM_CHANNEL_BFL; - lchannel_mapping[29] = PCM_CHANNEL_BFR; - lchannel_mapping[30] = PCM_CHANNEL_LW; - lchannel_mapping[31] = PCM_CHANNEL_RW; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} -EXPORT_SYMBOL(q6asm_map_channels); - -/** - * q6asm_enable_sbrps - - * command to enable sbrps for ASM - * - * @ac: Audio client handle - * @sbr_ps_enable: flag for sbr_ps enable or disable - * - * Returns 0 on success or error on failure - */ -int q6asm_enable_sbrps(struct audio_client *ac, - uint32_t sbr_ps_enable) -{ - struct asm_aac_sbr_ps_flag_param sbrps; - u32 frames_per_buf = 0; - - int rc = 0; - - pr_debug("%s: Session %d\n", __func__, ac->session); - - q6asm_add_hdr(ac, &sbrps.hdr, sizeof(sbrps), TRUE); - atomic_set(&ac->cmd_state, -1); - - sbrps.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - sbrps.encdec.param_id = ASM_PARAM_ID_AAC_SBR_PS_FLAG; - sbrps.encdec.param_size = sizeof(struct asm_aac_sbr_ps_flag_param) - - sizeof(struct asm_stream_cmd_set_encdec_param); - sbrps.encblk.frames_per_buf = frames_per_buf; - sbrps.encblk.enc_cfg_blk_size = sbrps.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - sbrps.sbr_ps_flag = sbr_ps_enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &sbrps); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, - ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_AAC_SBR_PS_FLAG, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x] ", __func__, sbrps.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enable_sbrps); - -/** - * q6asm_cfg_dual_mono_aac - - * command to set config for dual mono aac - * - * @ac: Audio client handle - * @sce_left: left sce val - * @sce_right: right sce val - * - * Returns 0 on success or error on failure - */ -int q6asm_cfg_dual_mono_aac(struct audio_client *ac, - uint16_t sce_left, uint16_t sce_right) -{ - struct asm_aac_dual_mono_mapping_param dual_mono; - - int rc = 0; - - pr_debug("%s: Session %d, sce_left = %d, sce_right = %d\n", - __func__, ac->session, sce_left, sce_right); - - q6asm_add_hdr(ac, &dual_mono.hdr, sizeof(dual_mono), TRUE); - atomic_set(&ac->cmd_state, -1); - - dual_mono.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - dual_mono.encdec.param_id = ASM_PARAM_ID_AAC_DUAL_MONO_MAPPING; - dual_mono.encdec.param_size = sizeof(dual_mono.left_channel_sce) + - sizeof(dual_mono.right_channel_sce); - dual_mono.left_channel_sce = sce_left; - dual_mono.right_channel_sce = sce_right; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &dual_mono); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_AAC_DUAL_MONO_MAPPING, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", __func__, - dual_mono.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_cfg_dual_mono_aac); - -/* Support for selecting stereo mixing coefficients for B family not done */ -int q6asm_cfg_aac_sel_mix_coef(struct audio_client *ac, uint32_t mix_coeff) -{ - struct asm_aac_stereo_mix_coeff_selection_param_v2 aac_mix_coeff; - int rc = 0; - - q6asm_add_hdr(ac, &aac_mix_coeff.hdr, sizeof(aac_mix_coeff), TRUE); - atomic_set(&ac->cmd_state, -1); - aac_mix_coeff.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - aac_mix_coeff.param_id = - ASM_PARAM_ID_AAC_STEREO_MIX_COEFF_SELECTION_FLAG_V2; - aac_mix_coeff.param_size = - sizeof(struct asm_aac_stereo_mix_coeff_selection_param_v2); - aac_mix_coeff.aac_stereo_mix_coeff_flag = mix_coeff; - pr_debug("%s: mix_coeff = %u\n", __func__, mix_coeff); - rc = apr_send_pkt(ac->apr, (uint32_t *) &aac_mix_coeff); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_AAC_STEREO_MIX_COEFF_SELECTION_FLAG_V2, - rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, aac_mix_coeff.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_cfg_aac_sel_mix_coef); - -/** - * q6asm_enc_cfg_blk_qcelp - - * command to set encode config block for QCELP - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @min_rate: Minimum Enc rate - * @max_rate: Maximum Enc rate - * reduced_rate_level: Reduced rate level - * @rate_modulation_cmd: rate modulation command - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_qcelp(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t reduced_rate_level, uint16_t rate_modulation_cmd) -{ - struct asm_v13k_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] reduced_rate_level[0x%4x]rate_modulation_cmd[0x%4x]\n", - __func__, - ac->session, frames_per_buf, min_rate, max_rate, - reduced_rate_level, rate_modulation_cmd); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_v13k_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.min_rate = min_rate; - enc_cfg.max_rate = max_rate; - enc_cfg.reduced_rate_cmd = reduced_rate_level; - enc_cfg.rate_mod_cmd = rate_modulation_cmd; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for setencdec v13k resp\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_qcelp); - -/** - * q6asm_enc_cfg_blk_evrc - - * command to set encode config block for EVRC - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @min_rate: Minimum Enc rate - * @max_rate: Maximum Enc rate - * @rate_modulation_cmd: rate modulation command - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_evrc(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t rate_modulation_cmd) -{ - struct asm_evrc_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] rate_modulation_cmd[0x%4x]\n", - __func__, ac->session, - frames_per_buf, min_rate, max_rate, rate_modulation_cmd); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_evrc_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.min_rate = min_rate; - enc_cfg.max_rate = max_rate; - enc_cfg.rate_mod_cmd = rate_modulation_cmd; - enc_cfg.reserved = 0; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for encdec evrc\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_evrc); - -/** - * q6asm_enc_cfg_blk_amrnb - - * command to set encode config block for AMRNB - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @band_mode: Band mode used - * @dtx_enable: DTX en flag - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_amrnb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable) -{ - struct asm_amrnb_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]band_mode[0x%4x]dtx_enable[0x%4x]\n", - __func__, ac->session, frames_per_buf, band_mode, dtx_enable); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_amrnb_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.enc_mode = band_mode; - enc_cfg.dtx_mode = dtx_enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for set encdec amrnb\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_amrnb); - -/** - * q6asm_enc_cfg_blk_amrwb - - * command to set encode config block for AMRWB - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @band_mode: Band mode used - * @dtx_enable: DTX en flag - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_amrwb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable) -{ - struct asm_amrwb_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]band_mode[0x%4x]dtx_enable[0x%4x]\n", - __func__, ac->session, frames_per_buf, band_mode, dtx_enable); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_amrwb_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.enc_mode = band_mode; - enc_cfg.dtx_mode = dtx_enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_amrwb); - - -static int __q6asm_media_format_block_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, int stream_id, - bool use_default_chmap, char *channel_map) -{ - struct asm_multi_channel_pcm_fmt_blk_v2 fmt; - u8 *channel_mapping; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", __func__, ac->session, rate, - channels); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&fmt.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.num_channels = channels; - fmt.bits_per_sample = bits_per_sample; - fmt.sample_rate = rate; - fmt.is_signed = 1; - - channel_mapping = fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v3 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - fmt.hdr.token = ((ac->session << 8) & 0xFFFF00) | - (stream_id & 0xFF); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v4 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - fmt.hdr.token = ((ac->session << 8) & 0xFFFF00) | - (stream_id & 0xFF); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - - -static int __q6asm_media_format_block_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v5 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - fmt.hdr.token = ((ac->session << 8) & 0xFFFF00) | - (stream_id & 0xFF); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = (uint16_t) channels & 0xFFFF; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, fmt.param.num_channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_media_format_block_pcm - - * command to set mediafmt block for PCM on ASM stream - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of ASM channels - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - return __q6asm_media_format_block_pcm(ac, rate, - channels, 16, ac->stream_id, - true, NULL); -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm); - -/** - * q6asm_media_format_block_pcm_format_support - - * command to set mediafmt block for PCM format support - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of ASM channels - * @bits_per_sample: number of bits per sample - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample) -{ - return __q6asm_media_format_block_pcm(ac, rate, - channels, bits_per_sample, ac->stream_id, - true, NULL); -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support); - -int q6asm_media_format_block_pcm_format_support_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, int stream_id, - bool use_default_chmap, char *channel_map) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map); -} - -/* - * q6asm_media_format_block_pcm_format_support_v3- sends pcm decoder - * configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @stream_id: stream id of stream to be associated with this session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_media_format_block_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm_v3(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map, - sample_word_size); - -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support_v3); - -/* - * q6asm_media_format_block_pcm_format_support_v4- sends pcm decoder - * configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @stream_id: stream id of stream to be associated with this session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm_v4(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map, - sample_word_size, endianness, - mode); - -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support_v4); - - -/* - * q6asm_media_format_block_pcm_format_support_v5- sends pcm decoder - * configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @stream_id: stream id of stream to be associated with this session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm_v5(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map, - sample_word_size, endianness, - mode); - -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support_v5); - - -static int __q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample) -{ - struct asm_multi_channel_pcm_fmt_blk_v2 fmt; - u8 *channel_mapping; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", __func__, ac->session, rate, - channels); - - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.num_channels = channels; - fmt.bits_per_sample = bits_per_sample; - fmt.sample_rate = rate; - fmt.is_signed = 1; - - channel_mapping = fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_multi_ch_pcm_v3(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v3 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_multi_ch_pcm_v4(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v4 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_multi_ch_pcm_v5(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v5 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map) -{ - return __q6asm_media_format_block_multi_ch_pcm(ac, rate, - channels, use_default_chmap, channel_map, 16); -} - -int q6asm_media_format_block_multi_ch_pcm_v2( - struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample) -{ - return __q6asm_media_format_block_multi_ch_pcm(ac, rate, - channels, use_default_chmap, channel_map, - bits_per_sample); -} - -/* - * q6asm_media_format_block_multi_ch_pcm_v3 - sends pcm decoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_media_format_block_multi_ch_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - return __q6asm_media_format_block_multi_ch_pcm_v3(ac, rate, channels, - use_default_chmap, - channel_map, - bits_per_sample, - sample_word_size); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_ch_pcm_v3); - -/* - * q6asm_media_format_block_multi_ch_pcm_v4 - sends pcm decoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_multi_ch_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_media_format_block_multi_ch_pcm_v4(ac, rate, channels, - use_default_chmap, - channel_map, - bits_per_sample, - sample_word_size, - endianness, - mode); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_ch_pcm_v4); - - -/* - * q6asm_media_format_block_multi_ch_pcm_v5 - sends pcm decoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_multi_ch_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_media_format_block_multi_ch_pcm_v5(ac, rate, channels, - use_default_chmap, - channel_map, - bits_per_sample, - sample_word_size, - endianness, - mode); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_ch_pcm_v5); - - -/* - * q6asm_media_format_block_gen_compr - set up generic compress format params - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @bits_per_sample: bit width of gen compress stream - */ -int q6asm_media_format_block_gen_compr(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample) -{ - struct asm_generic_compressed_fmt_blk_t fmt; - u8 *channel_mapping; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]\n", - __func__, ac->session, rate, - channels, bits_per_sample); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.num_channels = channels; - fmt.bits_per_sample = bits_per_sample; - fmt.sampling_rate = rate; - - channel_mapping = fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - atomic_set(&ac->cmd_state, -1); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_gen_compr); - - -/* - * q6asm_media_format_block_iec - set up IEC61937 (compressed) or IEC60958 - * (pcm) format params. Both audio standards - * use the same format and are used for - * HDMI or SPDIF. - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - */ -int q6asm_media_format_block_iec(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - struct asm_iec_compressed_fmt_blk_t fmt; - int rc = 0; - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", - __func__, ac->session, rate, - channels); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - - fmt.hdr.opcode = ASM_DATA_CMD_IEC_60958_MEDIA_FMT; - fmt.num_channels = channels; - fmt.sampling_rate = rate; - - atomic_set(&ac->cmd_state, -1); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_iec); - -static int __q6asm_media_format_block_multi_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg, int stream_id) -{ - struct asm_aac_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", __func__, ac->session, - cfg->sample_rate, cfg->ch_cfg); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&fmt.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.aac_fmt_flag = cfg->format; - fmt.audio_objype = cfg->aot; - /* If zero, PCE is assumed to be available in bitstream*/ - fmt.total_size_of_PCE_bits = 0; - fmt.channel_config = cfg->ch_cfg; - fmt.sample_rate = cfg->sample_rate; - - pr_debug("%s: format=0x%x cfg_size=%d aac-cfg=0x%x aot=%d ch=%d sr=%d\n", - __func__, fmt.aac_fmt_flag, fmt.fmt_blk.fmt_blk_size, - fmt.aac_fmt_flag, - fmt.audio_objype, - fmt.channel_config, - fmt.sample_rate); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_media_format_block_multi_aac - - * command to set mediafmt block for multi_aac on ASM stream - * - * @ac: Audio client handle - * @cfg: multi_aac config - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_multi_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg) -{ - return __q6asm_media_format_block_multi_aac(ac, cfg, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_aac); - -/** - * q6asm_media_format_block_aac - - * command to set mediafmt block for aac on ASM - * - * @ac: Audio client handle - * @cfg: aac config - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg) -{ - return __q6asm_media_format_block_multi_aac(ac, cfg, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_media_format_block_aac); - -/** - * q6asm_stream_media_format_block_aac - - * command to set mediafmt block for aac on ASM stream - * - * @ac: Audio client handle - * @cfg: aac config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg, int stream_id) -{ - return __q6asm_media_format_block_multi_aac(ac, cfg, stream_id); -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_aac); - -/** - * q6asm_media_format_block_wma - - * command to set mediafmt block for wma on ASM stream - * - * @ac: Audio client handle - * @cfg: wma config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_wma(struct audio_client *ac, - void *cfg, int stream_id) -{ - struct asm_wmastdv9_fmt_blk_v2 fmt; - struct asm_wma_cfg *wma_cfg = (struct asm_wma_cfg *)cfg; - int rc = 0; - - pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x]\n", - ac->session, wma_cfg->format_tag, wma_cfg->sample_rate, - wma_cfg->ch_cfg, wma_cfg->avg_bytes_per_sec, - wma_cfg->block_align, wma_cfg->valid_bits_per_sample, - wma_cfg->ch_mask, wma_cfg->encode_opt); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - fmt.fmtag = wma_cfg->format_tag; - fmt.num_channels = wma_cfg->ch_cfg; - fmt.sample_rate = wma_cfg->sample_rate; - fmt.avg_bytes_per_sec = wma_cfg->avg_bytes_per_sec; - fmt.blk_align = wma_cfg->block_align; - fmt.bits_per_sample = - wma_cfg->valid_bits_per_sample; - fmt.channel_mask = wma_cfg->ch_mask; - fmt.enc_options = wma_cfg->encode_opt; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_wma); - -/** - * q6asm_media_format_block_wmapro - - * command to set mediafmt block for wmapro on ASM stream - * - * @ac: Audio client handle - * @cfg: wmapro config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_wmapro(struct audio_client *ac, - void *cfg, int stream_id) -{ - struct asm_wmaprov10_fmt_blk_v2 fmt; - struct asm_wmapro_cfg *wmapro_cfg = (struct asm_wmapro_cfg *)cfg; - int rc = 0; - - pr_debug("%s: session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x], adv_enc_opt[0x%4x], adv_enc_opt2[0x%8x]\n", - __func__, - ac->session, wmapro_cfg->format_tag, wmapro_cfg->sample_rate, - wmapro_cfg->ch_cfg, wmapro_cfg->avg_bytes_per_sec, - wmapro_cfg->block_align, wmapro_cfg->valid_bits_per_sample, - wmapro_cfg->ch_mask, wmapro_cfg->encode_opt, - wmapro_cfg->adv_encode_opt, wmapro_cfg->adv_encode_opt2); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.fmtag = wmapro_cfg->format_tag; - fmt.num_channels = wmapro_cfg->ch_cfg; - fmt.sample_rate = wmapro_cfg->sample_rate; - fmt.avg_bytes_per_sec = - wmapro_cfg->avg_bytes_per_sec; - fmt.blk_align = wmapro_cfg->block_align; - fmt.bits_per_sample = wmapro_cfg->valid_bits_per_sample; - fmt.channel_mask = wmapro_cfg->ch_mask; - fmt.enc_options = wmapro_cfg->encode_opt; - fmt.usAdvancedEncodeOpt = wmapro_cfg->adv_encode_opt; - fmt.advanced_enc_options2 = wmapro_cfg->adv_encode_opt2; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_wmapro); - -/** - * q6asm_media_format_block_amrwbplus - - * command to set mediafmt block for amrwbplus on ASM stream - * - * @ac: Audio client handle - * @cfg: amrwbplus config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_amrwbplus(struct audio_client *ac, - struct asm_amrwbplus_cfg *cfg) -{ - struct asm_amrwbplus_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s: session[%d]band-mode[%d]frame-fmt[%d]ch[%d]\n", - __func__, - ac->session, - cfg->amr_band_mode, - cfg->amr_frame_fmt, - cfg->num_channels); - - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - fmt.amr_frame_fmt = cfg->amr_frame_fmt; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd media format update failed.. %d\n", - __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_amrwbplus); - -/** - * q6asm_stream_media_format_block_flac - - * command to set mediafmt block for flac on ASM stream - * - * @ac: Audio client handle - * @cfg: FLAC config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_flac(struct audio_client *ac, - struct asm_flac_cfg *cfg, int stream_id) -{ - struct asm_flac_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d] rate[%d] ch[%d] size[%d] stream_id[%d]\n", - __func__, ac->session, cfg->sample_rate, cfg->ch_cfg, - cfg->sample_size, stream_id); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.is_stream_info_present = cfg->stream_info_present; - fmt.num_channels = cfg->ch_cfg; - fmt.min_blk_size = cfg->min_blk_size; - fmt.max_blk_size = cfg->max_blk_size; - fmt.sample_rate = cfg->sample_rate; - fmt.min_frame_size = cfg->min_frame_size; - fmt.max_frame_size = cfg->max_frame_size; - fmt.sample_size = cfg->sample_size; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_flac); - -/** - * q6asm_media_format_block_alac - - * command to set mediafmt block for alac on ASM stream - * - * @ac: Audio client handle - * @cfg: ALAC config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_alac(struct audio_client *ac, - struct asm_alac_cfg *cfg, int stream_id) -{ - struct asm_alac_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d]rate[%d]ch[%d]\n", __func__, - ac->session, cfg->sample_rate, cfg->num_channels); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.frame_length = cfg->frame_length; - fmt.compatible_version = cfg->compatible_version; - fmt.bit_depth = cfg->bit_depth; - fmt.pb = cfg->pb; - fmt.mb = cfg->mb; - fmt.kb = cfg->kb; - fmt.num_channels = cfg->num_channels; - fmt.max_run = cfg->max_run; - fmt.max_frame_bytes = cfg->max_frame_bytes; - fmt.avg_bit_rate = cfg->avg_bit_rate; - fmt.sample_rate = cfg->sample_rate; - fmt.channel_layout_tag = cfg->channel_layout_tag; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_alac); - -/* - * q6asm_media_format_block_g711 - sends g711 decoder configuration - * parameters - * @ac: Client session handle - * @cfg: Audio stream manager configuration parameters - * @stream_id: Stream id - */ -int q6asm_media_format_block_g711(struct audio_client *ac, - struct asm_g711_dec_cfg *cfg, int stream_id) -{ - struct asm_g711_dec_fmt_blk_v2 fmt; - int rc = 0; - - if (!ac) { - pr_err("%s: audio client is null\n", __func__); - return -EINVAL; - } - if (!cfg) { - pr_err("%s: Invalid ASM config\n", __func__); - return -EINVAL; - } - - if (stream_id <= 0) { - pr_err("%s: Invalid stream id\n", __func__); - return -EINVAL; - } - - pr_debug("%s :session[%d]rate[%d]\n", __func__, - ac->session, cfg->sample_rate); - - memset(&fmt, 0, sizeof(struct asm_g711_dec_fmt_blk_v2)); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.sample_rate = cfg->sample_rate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Command media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_g711); - -/** - * q6asm_stream_media_format_block_vorbis - - * command to set mediafmt block for vorbis on ASM stream - * - * @ac: Audio client handle - * @cfg: vorbis config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_vorbis(struct audio_client *ac, - struct asm_vorbis_cfg *cfg, int stream_id) -{ - struct asm_vorbis_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d] bit_stream_fmt[%d] stream_id[%d]\n", - __func__, ac->session, cfg->bit_stream_fmt, stream_id); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.bit_stream_fmt = cfg->bit_stream_fmt; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_vorbis); - -/** - * q6asm_media_format_block_ape - - * command to set mediafmt block for APE on ASM stream - * - * @ac: Audio client handle - * @cfg: APE config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_ape(struct audio_client *ac, - struct asm_ape_cfg *cfg, int stream_id) -{ - struct asm_ape_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d]rate[%d]ch[%d]\n", __func__, - ac->session, cfg->sample_rate, cfg->num_channels); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.compatible_version = cfg->compatible_version; - fmt.compression_level = cfg->compression_level; - fmt.format_flags = cfg->format_flags; - fmt.blocks_per_frame = cfg->blocks_per_frame; - fmt.final_frame_blocks = cfg->final_frame_blocks; - fmt.total_frames = cfg->total_frames; - fmt.bits_per_sample = cfg->bits_per_sample; - fmt.num_channels = cfg->num_channels; - fmt.sample_rate = cfg->sample_rate; - fmt.seek_table_present = cfg->seek_table_present; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_ape); - -/* - * q6asm_media_format_block_dsd- Sends DSD Decoder - * configuration parameters - * - * @ac: Client session handle - * @cfg: DSD Media Format Configuration. - * @stream_id: stream id of stream to be associated with this session - * - * Return 0 on success or negative error code on failure - */ -int q6asm_media_format_block_dsd(struct audio_client *ac, - struct asm_dsd_cfg *cfg, int stream_id) -{ - struct asm_dsd_fmt_blk_v2 fmt; - int rc; - - pr_debug("%s: session[%d] data_rate[%d] ch[%d]\n", __func__, - ac->session, cfg->dsd_data_rate, cfg->num_channels); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.num_version = cfg->num_version; - fmt.is_bitwise_big_endian = cfg->is_bitwise_big_endian; - fmt.dsd_channel_block_size = cfg->dsd_channel_block_size; - fmt.num_channels = cfg->num_channels; - fmt.dsd_data_rate = cfg->dsd_data_rate; - atomic_set(&ac->cmd_state, -1); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Command DSD media format update failed, err: %d\n", - __func__, rc); - goto done; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for DSD FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto done; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto done; - } - return 0; -done: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_dsd); - -/** - * q6asm_stream_media_format_block_aptx_dec - - * command to set mediafmt block for APTX dec on ASM stream - * - * @ac: Audio client handle - * @srate: sample rate - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_aptx_dec(struct audio_client *ac, - uint32_t srate, int stream_id) -{ - struct asm_aptx_dec_fmt_blk_v2 aptx_fmt; - int rc = 0; - - if (!ac->session) { - pr_err("%s: ac session invalid\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s :session[%d] rate[%d] stream_id[%d]\n", - __func__, ac->session, srate, stream_id); - - q6asm_stream_add_hdr(ac, &aptx_fmt.hdr, sizeof(aptx_fmt), TRUE, - stream_id); - atomic_set(&ac->cmd_state, -1); - - aptx_fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - aptx_fmt.fmtblk.fmt_blk_size = sizeof(aptx_fmt) - sizeof(aptx_fmt.hdr) - - sizeof(aptx_fmt.fmtblk); - - aptx_fmt.sample_rate = srate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &aptx_fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_aptx_dec); - -static int __q6asm_ds1_set_endp_params(struct audio_client *ac, int param_id, - int param_value, int stream_id) -{ - struct asm_dec_ddp_endp_param_v2 ddp_cfg; - int rc = 0; - - pr_debug("%s: session[%d] stream[%d],param_id[%d]param_value[%d]", - __func__, ac->session, stream_id, param_id, param_value); - - q6asm_stream_add_hdr(ac, &ddp_cfg.hdr, sizeof(ddp_cfg), TRUE, - stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&ddp_cfg.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - ddp_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - ddp_cfg.encdec.param_id = param_id; - ddp_cfg.encdec.param_size = sizeof(struct asm_dec_ddp_endp_param_v2) - - (sizeof(struct apr_hdr) + - sizeof(struct asm_stream_cmd_set_encdec_param)); - ddp_cfg.endp_param_value = param_value; - rc = apr_send_pkt(ac->apr, (uint32_t *) &ddp_cfg); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", __func__, - ddp_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_ds1_set_endp_params - - * command to set DS1 params for ASM - * - * @ac: Audio client handle - * @param_id: param id - * @param_value: value of param - * - * Returns 0 on success or error on failure - */ -int q6asm_ds1_set_endp_params(struct audio_client *ac, - int param_id, int param_value) -{ - return __q6asm_ds1_set_endp_params(ac, param_id, param_value, - ac->stream_id); -} - -/** - * q6asm_ds1_set_stream_endp_params - - * command to set DS1 params for ASM stream - * - * @ac: Audio client handle - * @param_id: param id - * @param_value: value of param - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_ds1_set_stream_endp_params(struct audio_client *ac, - int param_id, int param_value, - int stream_id) -{ - return __q6asm_ds1_set_endp_params(ac, param_id, param_value, - stream_id); -} -EXPORT_SYMBOL(q6asm_ds1_set_stream_endp_params); - -/** - * q6asm_memory_map - - * command to send memory map for ASM - * - * @ac: Audio client handle - * @buf_add: buffer address to map - * @dir: RX or TX session - * @bufsz: size of each buffer - * @bufcnt: buffer count - * - * Returns 0 on success or error on failure - */ -int q6asm_memory_map(struct audio_client *ac, phys_addr_t buf_add, int dir, - uint32_t bufsz, uint32_t bufcnt) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - struct audio_port_data *port = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - struct asm_buffer_node *buffer_node = NULL; - int rc = 0; - int cmd_size = 0; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->mmap_apr == NULL) { - pr_err("%s: mmap APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - buffer_node = kmalloc(sizeof(struct asm_buffer_node), GFP_KERNEL); - if (!buffer_node) - return -ENOMEM; - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + sizeof(struct avs_shared_map_region_payload) * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) { - rc = -EINVAL; - kfree(buffer_node); - return rc; - } - mmap_regions = (struct avs_cmd_shared_mem_map_regions *) - mmap_region_cmd; - q6asm_add_mmaphdr(ac, &mmap_regions->hdr, cmd_size, dir); - atomic_set(&ac->mem_state, -1); - mmap_regions->hdr.opcode = ASM_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mmap_regions->num_regions = bufcnt & 0x00ff; - mmap_regions->property_flag = 0x00; - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - ac->port[dir].tmp_hdl = 0; - port = &ac->port[dir]; - pr_debug("%s: buf_add 0x%pK, bufsz: %d\n", __func__, - &buf_add, bufsz); - mregions->shm_addr_lsw = lower_32_bits(buf_add); - mregions->shm_addr_msw = msm_audio_populate_upper_32_bits(buf_add); - mregions->mem_size_bytes = bufsz; - ++mregions; - - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) mmap_region_cmd); - if (rc < 0) { - pr_err("%s: mmap op[0x%x]rc[%d]\n", __func__, - mmap_regions->hdr.opcode, rc); - rc = -EINVAL; - kfree(buffer_node); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0 && - ac->port[dir].tmp_hdl), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_map\n", __func__); - rc = -ETIMEDOUT; - kfree(buffer_node); - goto fail_cmd; - } - if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s: DSP returned error[%s] for memory_map\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - kfree(buffer_node); - goto fail_cmd; - } - buffer_node->buf_phys_addr = buf_add; - buffer_node->mmap_hdl = ac->port[dir].tmp_hdl; - list_add_tail(&buffer_node->list, &ac->port[dir].mem_map_handle); - ac->port[dir].tmp_hdl = 0; - rc = 0; - -fail_cmd: - kfree(mmap_region_cmd); - return rc; -} -EXPORT_SYMBOL(q6asm_memory_map); - -/** - * q6asm_memory_unmap - - * command to send memory unmap for ASM - * - * @ac: Audio client handle - * @buf_add: buffer address to unmap - * @dir: RX or TX session - * - * Returns 0 on success or error on failure - */ -int q6asm_memory_unmap(struct audio_client *ac, phys_addr_t buf_add, int dir) -{ - struct avs_cmd_shared_mem_unmap_regions mem_unmap; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - - int rc = 0; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (this_mmap.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - q6asm_add_mmaphdr(ac, &mem_unmap.hdr, - sizeof(struct avs_cmd_shared_mem_unmap_regions), - dir); - atomic_set(&ac->mem_state, -1); - mem_unmap.hdr.opcode = ASM_CMD_SHARED_MEM_UNMAP_REGIONS; - mem_unmap.mem_map_handle = 0; - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - pr_debug("%s: Found the element\n", __func__); - mem_unmap.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - pr_debug("%s: mem_unmap-mem_map_handle: 0x%x\n", - __func__, mem_unmap.mem_map_handle); - - if (mem_unmap.mem_map_handle == 0) { - pr_err("%s: Do not send null mem handle to DSP\n", __func__); - rc = 0; - goto fail_cmd; - } - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) &mem_unmap); - if (rc < 0) { - pr_err("%s: mem_unmap op[0x%x]rc[%d]\n", __func__, - mem_unmap.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_unmap of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -ETIMEDOUT; - goto fail_cmd; - } else if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s DSP returned error [%s] map handle 0x%x\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state)), - mem_unmap.mem_map_handle); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - goto fail_cmd; - } else if (atomic_read(&ac->unmap_cb_success) == 0) { - pr_err("%s: Error in mem unmap callback of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -EINVAL; - goto fail_cmd; - } - - rc = 0; -fail_cmd: - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - list_del(&buf_node->list); - kfree(buf_node); - break; - } - } - return rc; -} -EXPORT_SYMBOL(q6asm_memory_unmap); - -/** - * q6asm_memory_map_regions - - * command to send memory map regions for ASM - * - * @ac: Audio client handle - * @dir: RX or TX session - * @bufsz: size of each buffer - * @bufcnt: buffer count - * @is_contiguous: alloc contiguous mem or not - * - * Returns 0 on success or error on failure - */ -static int q6asm_memory_map_regions(struct audio_client *ac, int dir, - uint32_t bufsz, uint32_t bufcnt, - bool is_contiguous) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - struct audio_port_data *port = NULL; - struct audio_buffer *ab = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - struct asm_buffer_node *buffer_node = NULL; - int rc = 0; - int i = 0; - uint32_t cmd_size = 0; - uint32_t bufcnt_t; - uint32_t bufsz_t; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->mmap_apr == NULL) { - pr_err("%s: mmap APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - bufcnt_t = (is_contiguous) ? 1 : bufcnt; - bufsz_t = (is_contiguous) ? (bufsz * bufcnt) : bufsz; - - if (is_contiguous) { - /* The size to memory map should be multiple of 4K bytes */ - bufsz_t = PAGE_ALIGN(bufsz_t); - } - - if (bufcnt_t > (UINT_MAX - - sizeof(struct avs_cmd_shared_mem_map_regions)) - / sizeof(struct avs_shared_map_region_payload)) { - pr_err("%s: Unsigned Integer Overflow. bufcnt_t = %u\n", - __func__, bufcnt_t); - return -EINVAL; - } - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + (sizeof(struct avs_shared_map_region_payload) - * bufcnt_t); - - - if (bufcnt > (UINT_MAX / sizeof(struct asm_buffer_node))) { - pr_err("%s: Unsigned Integer Overflow. bufcnt = %u\n", - __func__, bufcnt); - return -EINVAL; - } - - buffer_node = kzalloc(sizeof(struct asm_buffer_node) * bufcnt, - GFP_KERNEL); - if (!buffer_node) - return -ENOMEM; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) { - rc = -EINVAL; - kfree(buffer_node); - return rc; - } - mmap_regions = (struct avs_cmd_shared_mem_map_regions *) - mmap_region_cmd; - q6asm_add_mmaphdr(ac, &mmap_regions->hdr, cmd_size, dir); - atomic_set(&ac->mem_state, -1); - pr_debug("%s: mmap_region=0x%pK token=0x%x\n", __func__, - mmap_regions, ((ac->session << 8) | dir)); - - mmap_regions->hdr.opcode = ASM_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mmap_regions->num_regions = bufcnt_t; /*bufcnt & 0x00ff; */ - mmap_regions->property_flag = 0x00; - pr_debug("%s: map_regions->nregions = %d\n", __func__, - mmap_regions->num_regions); - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - ac->port[dir].tmp_hdl = 0; - port = &ac->port[dir]; - for (i = 0; i < bufcnt_t; i++) { - ab = &port->buf[i]; - mregions->shm_addr_lsw = lower_32_bits(ab->phys); - mregions->shm_addr_msw = - msm_audio_populate_upper_32_bits(ab->phys); - mregions->mem_size_bytes = bufsz_t; - ++mregions; - } - - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) mmap_region_cmd); - if (rc < 0) { - pr_err("%s: mmap_regions op[0x%x]rc[%d]\n", __func__, - mmap_regions->hdr.opcode, rc); - rc = -EINVAL; - kfree(buffer_node); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0 && - ac->port[dir].tmp_hdl), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_map\n", __func__); - rc = -ETIMEDOUT; - kfree(buffer_node); - goto fail_cmd; - } - if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s DSP returned error for memory_map [%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - kfree(buffer_node); - goto fail_cmd; - } - mutex_lock(&ac->cmd_lock); - - for (i = 0; i < bufcnt; i++) { - ab = &port->buf[i]; - buffer_node[i].buf_phys_addr = ab->phys; - buffer_node[i].mmap_hdl = ac->port[dir].tmp_hdl; - list_add_tail(&buffer_node[i].list, - &ac->port[dir].mem_map_handle); - pr_debug("%s: i=%d, bufadd[i] = 0x%pK, maphdl[i] = 0x%x\n", - __func__, i, &buffer_node[i].buf_phys_addr, - buffer_node[i].mmap_hdl); - } - ac->port[dir].tmp_hdl = 0; - mutex_unlock(&ac->cmd_lock); - rc = 0; -fail_cmd: - kfree(mmap_region_cmd); - return rc; -} -EXPORT_SYMBOL(q6asm_memory_map_regions); - -/** - * q6asm_memory_unmap_regions - - * command to send memory unmap regions for ASM - * - * @ac: Audio client handle - * @dir: RX or TX session - * - * Returns 0 on success or error on failure - */ -static int q6asm_memory_unmap_regions(struct audio_client *ac, int dir) -{ - struct avs_cmd_shared_mem_unmap_regions mem_unmap; - struct audio_port_data *port = NULL; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - phys_addr_t buf_add; - int rc = 0; - int cmd_size = 0; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->mmap_apr == NULL) { - pr_err("%s: mmap APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - cmd_size = sizeof(struct avs_cmd_shared_mem_unmap_regions); - q6asm_add_mmaphdr(ac, &mem_unmap.hdr, cmd_size, dir); - atomic_set(&ac->mem_state, -1); - port = &ac->port[dir]; - buf_add = port->buf->phys; - mem_unmap.hdr.opcode = ASM_CMD_SHARED_MEM_UNMAP_REGIONS; - mem_unmap.mem_map_handle = 0; - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - pr_debug("%s: Found the element\n", __func__); - mem_unmap.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - pr_debug("%s: mem_unmap-mem_map_handle: 0x%x\n", - __func__, mem_unmap.mem_map_handle); - - if (mem_unmap.mem_map_handle == 0) { - pr_err("%s: Do not send null mem handle to DSP\n", __func__); - rc = 0; - goto fail_cmd; - } - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) &mem_unmap); - if (rc < 0) { - pr_err("mmap_regions op[0x%x]rc[%d]\n", - mem_unmap.hdr.opcode, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_unmap of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -ETIMEDOUT; - goto fail_cmd; - } else if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - goto fail_cmd; - } else if (atomic_read(&ac->unmap_cb_success) == 0) { - pr_err("%s: Error in mem unmap callback of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -EINVAL; - goto fail_cmd; - } - rc = 0; - -fail_cmd: - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - list_del(&buf_node->list); - kfree(buf_node); - break; - } - } - return rc; -} -EXPORT_SYMBOL(q6asm_memory_unmap_regions); - -int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain) -{ - struct asm_volume_ctrl_multichannel_gain multi_ch_gain; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(¶m_info, 0, sizeof(param_info)); - memset(&multi_ch_gain, 0, sizeof(multi_ch_gain)); - - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_MULTICHANNEL_GAIN; - param_info.param_size = sizeof(multi_ch_gain); - - multi_ch_gain.gain_data[0].channeltype = PCM_CHANNEL_FL; - multi_ch_gain.gain_data[0].gain = left_gain << 15; - multi_ch_gain.gain_data[1].channeltype = PCM_CHANNEL_FR; - multi_ch_gain.gain_data[1].gain = right_gain << 15; - multi_ch_gain.num_channels = 2; - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &multi_ch_gain); - if (rc < 0) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} - -/* - * q6asm_set_multich_gain: set multiple channel gains on an ASM session - * @ac: audio client handle - * @channels: number of channels caller intends to set gains - * @gains: list of gains of audio channels - * @ch_map: list of channel mapping. Only valid if use_default is false - * @use_default: flag to indicate whether to use default mapping - */ -int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, - uint32_t *gains, uint8_t *ch_map, bool use_default) -{ - struct asm_volume_ctrl_multichannel_gain multich_gain; - struct param_hdr_v3 param_info; - int rc = 0; - int i; - u8 default_chmap[VOLUME_CONTROL_MAX_CHANNELS]; - - if (ac == NULL) { - pr_err("%s: Audio client is NULL\n", __func__); - return -EINVAL; - } - if (gains == NULL) { - dev_err(ac->dev, "%s: gain_list is NULL\n", __func__); - rc = -EINVAL; - goto done; - } - if (channels > VOLUME_CONTROL_MAX_CHANNELS) { - dev_err(ac->dev, "%s: Invalid channel count %d\n", - __func__, channels); - rc = -EINVAL; - goto done; - } - if (!use_default && ch_map == NULL) { - dev_err(ac->dev, "%s: NULL channel map\n", __func__); - rc = -EINVAL; - goto done; - } - - memset(¶m_info, 0, sizeof(param_info)); - memset(&multich_gain, 0, sizeof(multich_gain)); - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_MULTICHANNEL_GAIN; - param_info.param_size = sizeof(multich_gain); - - if (use_default) { - rc = q6asm_map_channels(default_chmap, channels, false); - if (rc < 0) - goto done; - for (i = 0; i < channels; i++) { - multich_gain.gain_data[i].channeltype = - default_chmap[i]; - multich_gain.gain_data[i].gain = gains[i] << 15; - } - } else { - for (i = 0; i < channels; i++) { - multich_gain.gain_data[i].channeltype = ch_map[i]; - multich_gain.gain_data[i].gain = gains[i] << 15; - } - } - multich_gain.num_channels = channels; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &multich_gain); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_set_multich_gain); - -/** - * q6asm_set_mute - - * command to set mute for ASM - * - * @ac: Audio client handle - * @muteflag: mute value - * - * Returns 0 on success or error on failure - */ -int q6asm_set_mute(struct audio_client *ac, int muteflag) -{ - struct asm_volume_ctrl_mute_config mute; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&mute, 0, sizeof(mute)); - memset(¶m_info, 0, sizeof(param_info)); - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_VOL_CTRL_MUTE_CONFIG; - param_info.param_size = sizeof(mute); - mute.mute_flag = muteflag; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, (u8 *) &mute); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - return rc; -} -EXPORT_SYMBOL(q6asm_set_mute); - -static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) -{ - struct asm_volume_ctrl_master_gain vol; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&vol, 0, sizeof(vol)); - memset(¶m_info, 0, sizeof(param_info)); - - rc = q6asm_set_soft_volume_module_instance_ids(instance, ¶m_info); - if (rc) { - pr_err("%s: Failed to pack soft volume module and instance IDs, error %d\n", - __func__, rc); - return rc; - } - - param_info.param_id = ASM_PARAM_ID_VOL_CTRL_MASTER_GAIN; - param_info.param_size = sizeof(vol); - vol.master_gain = volume; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, (u8 *) &vol); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} - -/** - * q6asm_set_volume - - * command to set volume for ASM - * - * @ac: Audio client handle - * @volume: volume level - * - * Returns 0 on success or error on failure - */ -int q6asm_set_volume(struct audio_client *ac, int volume) -{ - return __q6asm_set_volume(ac, volume, SOFT_VOLUME_INSTANCE_1); -} -EXPORT_SYMBOL(q6asm_set_volume); - -int q6asm_set_volume_v2(struct audio_client *ac, int volume, int instance) -{ - return __q6asm_set_volume(ac, volume, instance); -} - -/** - * q6asm_set_aptx_dec_bt_addr - - * command to aptx decoder BT addr for ASM - * - * @ac: Audio client handle - * @cfg: APTX decoder bt addr config - * - * Returns 0 on success or error on failure - */ -int q6asm_set_aptx_dec_bt_addr(struct audio_client *ac, - struct aptx_dec_bt_addr_cfg *cfg) -{ - struct aptx_dec_bt_dev_addr paylod; - int sz = 0; - int rc = 0; - - pr_debug("%s: BT addr nap %d, uap %d, lap %d\n", __func__, cfg->nap, - cfg->uap, cfg->lap); - - if (ac == NULL) { - pr_err("%s: AC handle NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - sz = sizeof(struct aptx_dec_bt_dev_addr); - q6asm_add_hdr_async(ac, &paylod.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - paylod.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - paylod.encdec.param_id = APTX_DECODER_BT_ADDRESS; - paylod.encdec.param_size = sz - sizeof(paylod.hdr) - - sizeof(paylod.encdec); - paylod.bt_addr_cfg.lap = cfg->lap; - paylod.bt_addr_cfg.uap = cfg->uap; - paylod.bt_addr_cfg.nap = cfg->nap; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &paylod); - if (rc < 0) { - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, paylod.encdec.param_id, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, - paylod.encdec.param_id); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), - paylod.encdec.param_id); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - pr_debug("%s: set BT addr is success\n", __func__); - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_set_aptx_dec_bt_addr); - -/** - * q6asm_send_ion_fd - - * command to send ION memory map for ASM - * - * @ac: Audio client handle - * @fd: ION file desc - * - * Returns 0 on success or error on failure - */ -int q6asm_send_ion_fd(struct audio_client *ac, int fd) -{ - struct dma_buf *dma_buf; - dma_addr_t paddr; - size_t pa_len = 0; - void *vaddr; - int ret; - int sz = 0; - struct avs_rtic_shared_mem_addr shm; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - - ret = msm_audio_ion_import(&dma_buf, - fd, - NULL, - 0, - &paddr, - &pa_len, - &vaddr); - if (ret) { - pr_err("%s: audio ION import failed, rc = %d\n", - __func__, ret); - ret = -ENOMEM; - goto fail_cmd; - } - /* get payload length */ - sz = sizeof(struct avs_rtic_shared_mem_addr); - q6asm_add_hdr_async(ac, &shm.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - shm.shm_buf_addr_lsw = lower_32_bits(paddr); - shm.shm_buf_addr_msw = msm_audio_populate_upper_32_bits(paddr); - shm.buf_size = pa_len; - shm.shm_buf_num_regions = 1; - shm.shm_buf_mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - shm.shm_buf_flag = 0x00; - shm.encdec.param_id = AVS_PARAM_ID_RTIC_SHARED_MEMORY_ADDR; - shm.encdec.param_size = sizeof(struct avs_rtic_shared_mem_addr) - - sizeof(struct apr_hdr) - - sizeof(struct asm_stream_cmd_set_encdec_param_v2); - shm.encdec.service_id = OUT; - shm.encdec.reserved = 0; - shm.map_region.shm_addr_lsw = shm.shm_buf_addr_lsw; - shm.map_region.shm_addr_msw = shm.shm_buf_addr_msw; - shm.map_region.mem_size_bytes = pa_len; - shm.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2; - ret = apr_send_pkt(ac->apr, (uint32_t *) &shm); - if (ret < 0) { - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, shm.encdec.param_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout, shm.encdec paramid[0x%x]\n", __func__, - shm.encdec.param_id); - ret = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s] shm.encdec paramid[0x%x]\n", - __func__, - adsp_err_get_err_str(atomic_read(&ac->cmd_state)), - shm.encdec.param_id); - ret = adsp_err_get_lnx_err_code(atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - ret = 0; -fail_cmd: - return ret; -} -EXPORT_SYMBOL(q6asm_send_ion_fd); - -/** - * q6asm_send_rtic_event_ack - - * command to send RTIC event ack - * - * @ac: Audio client handle - * @param: params for event ack - * @params_length: length of params - * - * Returns 0 on success or error on failure - */ -int q6asm_send_rtic_event_ack(struct audio_client *ac, - void *param, uint32_t params_length) -{ - char *asm_params = NULL; - int sz, rc; - struct avs_param_rtic_event_ack ack; - - if (!param || !ac) { - pr_err("%s: %s is NULL\n", __func__, - (!param) ? "param" : "ac"); - rc = -EINVAL; - goto done; - } - - sz = sizeof(struct avs_param_rtic_event_ack) + params_length; - asm_params = kzalloc(sz, GFP_KERNEL); - if (!asm_params) { - rc = -ENOMEM; - goto done; - } - - q6asm_add_hdr_async(ac, &ack.hdr, - sizeof(struct avs_param_rtic_event_ack) + - params_length, TRUE); - atomic_set(&ac->cmd_state, -1); - ack.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2; - ack.encdec.param_id = AVS_PARAM_ID_RTIC_EVENT_ACK; - ack.encdec.param_size = params_length; - ack.encdec.reserved = 0; - ack.encdec.service_id = OUT; - memcpy(asm_params, &ack, sizeof(struct avs_param_rtic_event_ack)); - memcpy(asm_params + sizeof(struct avs_param_rtic_event_ack), - param, params_length); - rc = apr_send_pkt(ac->apr, (uint32_t *) asm_params); - if (rc < 0) { - pr_err("%s: apr pkt failed for rtic event ack\n", __func__); - rc = -EINVAL; - goto fail_send_param; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout for rtic event ack cmd\n", __func__); - rc = -ETIMEDOUT; - goto fail_send_param; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s] for rtic event ack cmd\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_send_param; - } - rc = 0; - -fail_send_param: - kfree(asm_params); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_send_rtic_event_ack); - -/** - * q6asm_set_softpause - - * command to set pause for ASM - * - * @ac: Audio client handle - * @pause_param: params for pause - * - * Returns 0 on success or error on failure - */ -int q6asm_set_softpause(struct audio_client *ac, - struct asm_softpause_params *pause_param) -{ - struct asm_soft_pause_params softpause; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&softpause, 0, sizeof(softpause)); - memset(¶m_info, 0, sizeof(param_info)); - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_SOFT_PAUSE_PARAMETERS; - param_info.param_size = sizeof(softpause); - - softpause.enable_flag = pause_param->enable; - softpause.period = pause_param->period; - softpause.step = pause_param->step; - softpause.ramping_curve = pause_param->rampingcurve; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &softpause); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} -EXPORT_SYMBOL(q6asm_set_softpause); - -static int __q6asm_set_softvolume(struct audio_client *ac, - struct asm_softvolume_params *softvol_param, - int instance) -{ - struct asm_soft_step_volume_params softvol; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&softvol, 0, sizeof(softvol)); - memset(¶m_info, 0, sizeof(param_info)); - - rc = q6asm_set_soft_volume_module_instance_ids(instance, ¶m_info); - if (rc) { - pr_err("%s: Failed to pack soft volume module and instance IDs, error %d\n", - __func__, rc); - return rc; - } - - param_info.param_id = ASM_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS; - param_info.param_size = sizeof(softvol); - - softvol.period = softvol_param->period; - softvol.step = softvol_param->step; - softvol.ramping_curve = softvol_param->rampingcurve; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &softvol); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} - -/** - * q6asm_set_softvolume - - * command to set softvolume for ASM - * - * @ac: Audio client handle - * @softvol_param: params for softvol - * - * Returns 0 on success or error on failure - */ -int q6asm_set_softvolume(struct audio_client *ac, - struct asm_softvolume_params *softvol_param) -{ - return __q6asm_set_softvolume(ac, softvol_param, - SOFT_VOLUME_INSTANCE_1); -} -EXPORT_SYMBOL(q6asm_set_softvolume); - -/** - * q6asm_set_softvolume_v2 - - * command to set softvolume V2 for ASM - * - * @ac: Audio client handle - * @softvol_param: params for softvol - * @instance: instance to apply softvol - * - * Returns 0 on success or error on failure - */ -int q6asm_set_softvolume_v2(struct audio_client *ac, - struct asm_softvolume_params *softvol_param, - int instance) -{ - return __q6asm_set_softvolume(ac, softvol_param, instance); -} -EXPORT_SYMBOL(q6asm_set_softvolume_v2); - -/** - * q6asm_equalizer - - * command to set equalizer for ASM - * - * @ac: Audio client handle - * @eq_p: Equalizer params - * - * Returns 0 on success or error on failure - */ -int q6asm_equalizer(struct audio_client *ac, void *eq_p) -{ - struct asm_eq_params eq; - struct msm_audio_eq_stream_config *eq_params = NULL; - struct param_hdr_v3 param_info; - int i = 0; - int rc = 0; - - if (ac == NULL) { - pr_err("%s: Audio client is NULL\n", __func__); - return -EINVAL; - } - if (eq_p == NULL) { - pr_err("%s: [%d]: Invalid Eq param\n", __func__, ac->session); - rc = -EINVAL; - goto fail_cmd; - } - - memset(&eq, 0, sizeof(eq)); - memset(¶m_info, 0, sizeof(param_info)); - eq_params = (struct msm_audio_eq_stream_config *) eq_p; - param_info.module_id = ASM_MODULE_ID_EQUALIZER; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_EQUALIZER_PARAMETERS; - param_info.param_size = sizeof(eq); - eq.enable_flag = eq_params->enable; - eq.num_bands = eq_params->num_bands; - - pr_debug("%s: enable:%d numbands:%d\n", __func__, eq_params->enable, - eq_params->num_bands); - for (i = 0; i < eq_params->num_bands; i++) { - eq.eq_bands[i].band_idx = - eq_params->eq_bands[i].band_idx; - eq.eq_bands[i].filterype = - eq_params->eq_bands[i].filter_type; - eq.eq_bands[i].center_freq_hz = - eq_params->eq_bands[i].center_freq_hz; - eq.eq_bands[i].filter_gain = - eq_params->eq_bands[i].filter_gain; - eq.eq_bands[i].q_factor = - eq_params->eq_bands[i].q_factor; - pr_debug("%s: filter_type:%u bandnum:%d\n", __func__, - eq_params->eq_bands[i].filter_type, i); - pr_debug("%s: center_freq_hz:%u bandnum:%d\n", __func__, - eq_params->eq_bands[i].center_freq_hz, i); - pr_debug("%s: filter_gain:%d bandnum:%d\n", __func__, - eq_params->eq_bands[i].filter_gain, i); - pr_debug("%s: q_factor:%d bandnum:%d\n", __func__, - eq_params->eq_bands[i].q_factor, i); - } - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, (u8 *) &eq); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_equalizer); - -static int __q6asm_read(struct audio_client *ac, bool is_custom_len_reqd, - int len) -{ - struct asm_data_cmd_read_v2 read; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - struct audio_buffer *ab; - int dsp_buf; - struct audio_port_data *port; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[OUT]; - - q6asm_add_hdr(ac, &read.hdr, sizeof(read), FALSE); - - mutex_lock(&port->lock); - - dsp_buf = port->dsp_buf; - if (port->buf == NULL) { - pr_err("%s: buf is NULL\n", __func__); - mutex_unlock(&port->lock); - return -EINVAL; - } - ab = &port->buf[dsp_buf]; - - dev_vdbg(ac->dev, "%s: session[%d]dsp-buf[%d][%pK]cpu_buf[%d][%pK]\n", - __func__, - ac->session, - dsp_buf, - port->buf[dsp_buf].data, - port->cpu_buf, - &port->buf[port->cpu_buf].phys); - - read.hdr.opcode = ASM_DATA_CMD_READ_V2; - read.buf_addr_lsw = lower_32_bits(ab->phys); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - - list_for_each_safe(ptr, next, &ac->port[OUT].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == ab->phys) { - read.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - dev_vdbg(ac->dev, "memory_map handle in q6asm_read: [%0x]:", - read.mem_map_handle); - read.buf_size = is_custom_len_reqd ? len : ab->size; - read.seq_id = port->dsp_buf; - q6asm_update_token(&read.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - WAIT_CMD); - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - mutex_unlock(&port->lock); - dev_vdbg(ac->dev, "%s: buf add[%pK] token[0x%x] uid[%d]\n", - __func__, &ab->phys, read.hdr.token, - read.seq_id); - rc = apr_send_pkt(ac->apr, (uint32_t *) &read); - if (rc < 0) { - pr_err("%s: read op[0x%x]rc[%d]\n", - __func__, read.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} - -/** - * q6asm_read - - * command to read buffer data from DSP - * - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_read(struct audio_client *ac) -{ - return __q6asm_read(ac, false/*is_custom_len_reqd*/, 0); -} -EXPORT_SYMBOL(q6asm_read); - - -/** - * q6asm_read_v2 - - * command to read buffer data from DSP - * - * @ac: Audio client handle - * @len: buffer size to read - * - * Returns 0 on success or error on failure - */ -int q6asm_read_v2(struct audio_client *ac, uint32_t len) -{ - return __q6asm_read(ac, true /*is_custom_len_reqd*/, len); -} -EXPORT_SYMBOL(q6asm_read_v2); - -/** - * q6asm_read_nolock - - * command to read buffer data from DSP - * with no wait for ack. - * - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_read_nolock(struct audio_client *ac) -{ - struct asm_data_cmd_read_v2 read; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - struct audio_buffer *ab; - int dsp_buf; - struct audio_port_data *port; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[OUT]; - - q6asm_add_hdr_async(ac, &read.hdr, sizeof(read), FALSE); - - - dsp_buf = port->dsp_buf; - ab = &port->buf[dsp_buf]; - - dev_vdbg(ac->dev, "%s: session[%d]dsp-buf[%d][%pK]cpu_buf[%d][%pK]\n", - __func__, - ac->session, - dsp_buf, - port->buf[dsp_buf].data, - port->cpu_buf, - &port->buf[port->cpu_buf].phys); - - read.hdr.opcode = ASM_DATA_CMD_READ_V2; - read.buf_addr_lsw = lower_32_bits(ab->phys); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - read.buf_size = ab->size; - read.seq_id = port->dsp_buf; - q6asm_update_token(&read.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - WAIT_CMD); - - list_for_each_safe(ptr, next, &ac->port[OUT].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == ab->phys) { - read.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - dev_vdbg(ac->dev, "%s: buf add[%pK] token[0x%x] uid[%d]\n", - __func__, &ab->phys, read.hdr.token, - read.seq_id); - rc = apr_send_pkt(ac->apr, (uint32_t *) &read); - if (rc < 0) { - pr_err("%s: read op[0x%x]rc[%d]\n", - __func__, read.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_read_nolock); - -/** - * q6asm_async_write - - * command to write DSP buffer - * - * @ac: Audio client handle - * @param: params for async write - * - * Returns 0 on success or error on failure - */ -int q6asm_async_write(struct audio_client *ac, - struct audio_aio_write_param *param) -{ - int rc = 0; - struct asm_data_cmd_write_v2 write; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - struct audio_buffer *ab; - struct audio_port_data *port; - phys_addr_t lbuf_phys_addr; - u32 liomode; - u32 io_compressed; - u32 io_compressed_stream; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - q6asm_stream_add_hdr_async( - ac, &write.hdr, sizeof(write), TRUE, ac->stream_id); - port = &ac->port[IN]; - ab = &port->buf[port->dsp_buf]; - - /* Pass session id as token for AIO scheme */ - write.hdr.token = param->uid; - write.hdr.opcode = ASM_DATA_CMD_WRITE_V2; - write.buf_addr_lsw = lower_32_bits(param->paddr); - write.buf_addr_msw = msm_audio_populate_upper_32_bits(param->paddr); - write.buf_size = param->len; - write.timestamp_msw = param->msw_ts; - write.timestamp_lsw = param->lsw_ts; - liomode = (ASYNC_IO_MODE | NT_MODE); - io_compressed = (ASYNC_IO_MODE | COMPRESSED_IO); - io_compressed_stream = (ASYNC_IO_MODE | COMPRESSED_STREAM_IO); - - if (ac->io_mode == liomode) - lbuf_phys_addr = (param->paddr - 32); - else if (ac->io_mode == io_compressed || - ac->io_mode == io_compressed_stream) - lbuf_phys_addr = (param->paddr - param->metadata_len); - else { - if (param->flags & SET_TIMESTAMP) - lbuf_phys_addr = param->paddr - - sizeof(struct snd_codec_metadata); - else - lbuf_phys_addr = param->paddr; - } - dev_vdbg(ac->dev, "%s: token[0x%x], buf_addr[%pK], buf_size[0x%x], ts_msw[0x%x], ts_lsw[0x%x], lbuf_phys_addr: 0x[%pK]\n", - __func__, - write.hdr.token, ¶m->paddr, - write.buf_size, write.timestamp_msw, - write.timestamp_lsw, &lbuf_phys_addr); - - /* Use 0xFF00 for disabling timestamps */ - if (param->flags == 0xFF00) - write.flags = (0x00000000 | (param->flags & 0x800000FF)); - else - write.flags = (0x80000000 | param->flags); - write.flags |= param->last_buffer << ASM_SHIFT_LAST_BUFFER_FLAG; - write.seq_id = param->uid; - list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == lbuf_phys_addr) { - write.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &write); - if (rc < 0) { - pr_err("%s: write op[0x%x]rc[%d]\n", __func__, - write.hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_async_write); - -/** - * q6asm_async_read - - * command to read DSP buffer - * - * @ac: Audio client handle - * @param: params for async read - * - * Returns 0 on success or error on failure - */ -int q6asm_async_read(struct audio_client *ac, - struct audio_aio_read_param *param) -{ - int rc = 0; - struct asm_data_cmd_read_v2 read; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - phys_addr_t lbuf_phys_addr; - u32 liomode; - u32 io_compressed; - int dir = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - q6asm_add_hdr_async(ac, &read.hdr, sizeof(read), FALSE); - - /* Pass session id as token for AIO scheme */ - read.hdr.token = param->uid; - read.hdr.opcode = ASM_DATA_CMD_READ_V2; - read.buf_addr_lsw = lower_32_bits(param->paddr); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(param->paddr); - read.buf_size = param->len; - read.seq_id = param->uid; - liomode = (NT_MODE | ASYNC_IO_MODE); - io_compressed = (ASYNC_IO_MODE | COMPRESSED_IO); - if (ac->io_mode == liomode) { - lbuf_phys_addr = (param->paddr - 32); - /*legacy wma driver case*/ - dir = IN; - } else if (ac->io_mode == io_compressed) { - lbuf_phys_addr = (param->paddr - 64); - dir = OUT; - } else { - if (param->flags & COMPRESSED_TIMESTAMP_FLAG) - lbuf_phys_addr = param->paddr - - sizeof(struct snd_codec_metadata); - else - lbuf_phys_addr = param->paddr; - dir = OUT; - } - - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == lbuf_phys_addr) { - read.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &read); - if (rc < 0 && rc != -ENETRESET) { - pr_err_ratelimited("%s: read op[0x%x]rc[%d]\n", __func__, - read.hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_async_read); - -/** - * q6asm_write - - * command to write buffer data to DSP - * - * @ac: Audio client handle - * @len: buffer size - * @msw_ts: upper 32bits of timestamp - * @lsw_ts: lower 32bits of timestamp - * @flags: Flags for timestamp mode - * - * Returns 0 on success or error on failure - */ -int q6asm_write(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags) -{ - int rc = 0; - struct asm_data_cmd_write_v2 write; - struct asm_buffer_node *buf_node = NULL; - struct audio_port_data *port; - struct audio_buffer *ab; - int dsp_buf = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - dev_vdbg(ac->dev, "%s: session[%d] len=%d\n", - __func__, ac->session, len); - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[IN]; - - q6asm_add_hdr(ac, &write.hdr, sizeof(write), - FALSE); - mutex_lock(&port->lock); - - dsp_buf = port->dsp_buf; - ab = &port->buf[dsp_buf]; - - q6asm_update_token(&write.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - write.hdr.opcode = ASM_DATA_CMD_WRITE_V2; - write.buf_addr_lsw = lower_32_bits(ab->phys); - write.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - write.buf_size = len; - write.seq_id = port->dsp_buf; - write.timestamp_lsw = lsw_ts; - write.timestamp_msw = msw_ts; - /* Use 0xFF00 for disabling timestamps */ - if (flags == 0xFF00) - write.flags = (0x00000000 | (flags & 0x800000FF)); - else - write.flags = (0x80000000 | flags); - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - buf_node = list_first_entry(&ac->port[IN].mem_map_handle, - struct asm_buffer_node, - list); - write.mem_map_handle = buf_node->mmap_hdl; - - dev_vdbg(ac->dev, "%s: ab->phys[%pK]bufadd[0x%x] token[0x%x]buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" - , __func__, - &ab->phys, - write.buf_addr_lsw, - write.hdr.token, - write.seq_id, - write.buf_size, - write.mem_map_handle); - mutex_unlock(&port->lock); - - config_debug_fs_write(ab); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &write); - if (rc < 0) { - pr_err("%s: write op[0x%x]rc[%d]\n", - __func__, write.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_write); - -/** - * q6asm_write_nolock - - * command to write buffer data to DSP - * with no wait for ack. - * - * @ac: Audio client handle - * @len: buffer size - * @msw_ts: upper 32bits of timestamp - * @lsw_ts: lower 32bits of timestamp - * @flags: Flags for timestamp mode - * - * Returns 0 on success or error on failure - */ -int q6asm_write_nolock(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags) -{ - int rc = 0; - struct asm_data_cmd_write_v2 write; - struct asm_buffer_node *buf_node = NULL; - struct audio_port_data *port; - struct audio_buffer *ab; - int dsp_buf = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - dev_vdbg(ac->dev, "%s: session[%d] len=%d\n", - __func__, ac->session, len); - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[IN]; - - q6asm_add_hdr_async(ac, &write.hdr, sizeof(write), - FALSE); - - dsp_buf = port->dsp_buf; - ab = &port->buf[dsp_buf]; - - q6asm_update_token(&write.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - - write.hdr.opcode = ASM_DATA_CMD_WRITE_V2; - write.buf_addr_lsw = lower_32_bits(ab->phys); - write.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - write.buf_size = len; - write.seq_id = port->dsp_buf; - write.timestamp_lsw = lsw_ts; - write.timestamp_msw = msw_ts; - buf_node = list_first_entry(&ac->port[IN].mem_map_handle, - struct asm_buffer_node, - list); - write.mem_map_handle = buf_node->mmap_hdl; - /* Use 0xFF00 for disabling timestamps */ - if (flags == 0xFF00) - write.flags = (0x00000000 | (flags & 0x800000FF)); - else - write.flags = (0x80000000 | flags); - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - - dev_vdbg(ac->dev, "%s: ab->phys[%pK]bufadd[0x%x]token[0x%x] buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" - , __func__, - &ab->phys, - write.buf_addr_lsw, - write.hdr.token, - write.seq_id, - write.buf_size, - write.mem_map_handle); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &write); - if (rc < 0) { - pr_err("%s: write op[0x%x]rc[%d]\n", - __func__, write.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_write_nolock); - -/** - * q6asm_get_session_time_v2 - - * command to retrieve timestamp info - * - * @ac: Audio client handle - * @ses_time: pointer to fill with session timestamp info - * @abs_time: pointer to fill with AVS timestamp info - * - * Returns 0 on success or error on failure - */ -int q6asm_get_session_time_v2(struct audio_client *ac, uint64_t *ses_time, - uint64_t *abs_time) -{ - struct asm_mtmx_strtr_get_params mtmx_params; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - if (ses_time == NULL) { - pr_err("%s: tstamp args are NULL\n", __func__); - return -EINVAL; - } - - q6asm_add_hdr(ac, &mtmx_params.hdr, sizeof(mtmx_params), TRUE); - mtmx_params.hdr.opcode = ASM_SESSION_CMD_GET_MTMX_STRTR_PARAMS_V2; - mtmx_params.param_info.data_payload_addr_lsw = 0; - mtmx_params.param_info.data_payload_addr_msw = 0; - mtmx_params.param_info.mem_map_handle = 0; - mtmx_params.param_info.direction = (ac->io_mode & TUN_READ_IO_MODE - ? 1 : 0); - mtmx_params.param_info.module_id = - ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - mtmx_params.param_info.param_id = - ASM_SESSION_MTMX_STRTR_PARAM_SESSION_TIME_V3; - mtmx_params.param_info.param_max_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_session_time_v3_t); - atomic_set(&ac->time_flag, 1); - - dev_vdbg(ac->dev, "%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, mtmx_params.hdr.opcode); - rc = apr_send_pkt(ac->apr, (uint32_t *) &mtmx_params); - if (rc < 0) { - dev_err_ratelimited(ac->dev, "%s: Get Session Time failed %d\n", - __func__, rc); - return rc; - } - - rc = wait_event_timeout(ac->time_wait, - (atomic_read(&ac->time_flag) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout in getting session time from DSP\n", - __func__); - goto fail_cmd; - } - - *ses_time = ac->dsp_ts.time_stamp; - if (abs_time != NULL) - *abs_time = ac->dsp_ts.abs_time_stamp; - return 0; - -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_get_session_time_v2); - -/** - * q6asm_get_session_time - - * command to retrieve timestamp info - * - * @ac: Audio client handle - * @tstamp: pointer to fill with timestamp info - * - * Returns 0 on success or error on failure - */ -int q6asm_get_session_time(struct audio_client *ac, uint64_t *tstamp) -{ - return q6asm_get_session_time_v2(ac, tstamp, NULL); -} -EXPORT_SYMBOL(q6asm_get_session_time); - -/** - * q6asm_get_session_time_legacy - - * command to retrieve timestamp info - * - * @ac: Audio client handle - * @tstamp: pointer to fill with timestamp info - * - * Returns 0 on success or error on failure - */ -int q6asm_get_session_time_legacy(struct audio_client *ac, uint64_t *tstamp) -{ - struct apr_hdr hdr; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - if (tstamp == NULL) { - pr_err("%s: tstamp NULL\n", __func__); - return -EINVAL; - } - - q6asm_add_hdr(ac, &hdr, sizeof(hdr), TRUE); - hdr.opcode = ASM_SESSION_CMD_GET_SESSIONTIME_V3; - atomic_set(&ac->time_flag, 1); - - dev_vdbg(ac->dev, "%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, - hdr.opcode); - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", - __func__, hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->time_wait, - (atomic_read(&ac->time_flag) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout in getting session time from DSP\n", - __func__); - goto fail_cmd; - } - - *tstamp = ac->dsp_ts.time_stamp; - return 0; - -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_get_session_time_legacy); - -/** - * q6asm_send_mtmx_strtr_window - - * command to send matrix for window params - * - * @ac: Audio client handle - * @window_param: window params - * @param_id: param id for window - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_window(struct audio_client *ac, - struct asm_session_mtmx_strtr_param_window_v2_t *window_param, - uint32_t param_id) -{ - struct asm_mtmx_strtr_params matrix; - int sz = 0; - int rc = 0; - - pr_debug("%s: Window lsw is %d, window msw is %d\n", __func__, - window_param->window_lsw, window_param->window_msw); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = param_id; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t); - matrix.data.reserved = 0; - memcpy(&(matrix.config.window_param), - window_param, - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t)); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: Render window start send failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, Render window start paramid[0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_window); - -/** - * q6asm_send_mtmx_strtr_render_mode - - * command to send matrix for render mode - * - * @ac: Audio client handle - * @render_mode: rendering mode - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_render_mode(struct audio_client *ac, - uint32_t render_mode) -{ - struct asm_mtmx_strtr_params matrix; - struct asm_session_mtmx_strtr_param_render_mode_t render_param; - int sz = 0; - int rc = 0; - - pr_debug("%s: render mode is %d\n", __func__, render_mode); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if ((render_mode != ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT) && - (render_mode != ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC)) { - pr_err("%s: Invalid render mode %d\n", __func__, render_mode); - rc = -EINVAL; - goto exit; - } - - memset(&render_param, 0, - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t)); - render_param.flags = render_mode; - - memset(&matrix, 0, sizeof(struct asm_mtmx_strtr_params)); - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_MODE_CMD; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t); - matrix.data.reserved = 0; - memcpy(&(matrix.config.render_param), - &render_param, - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t)); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: Render mode send failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto exit; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, Render mode send paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto exit; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto exit; - } - rc = 0; -exit: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_render_mode); - -/** - * q6asm_send_mtmx_strtr_clk_rec_mode - - * command to send matrix for clock rec - * - * @ac: Audio client handle - * @clk_rec_mode: mode for clock rec - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_clk_rec_mode(struct audio_client *ac, - uint32_t clk_rec_mode) -{ - struct asm_mtmx_strtr_params matrix; - struct asm_session_mtmx_strtr_param_clk_rec_t clk_rec_param; - int sz = 0; - int rc = 0; - - pr_debug("%s: clk rec mode is %d\n", __func__, clk_rec_mode); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if ((clk_rec_mode != ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_NONE) && - (clk_rec_mode != ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_AUTO)) { - pr_err("%s: Invalid clk rec mode %d\n", __func__, clk_rec_mode); - rc = -EINVAL; - goto exit; - } - - memset(&clk_rec_param, 0, - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t)); - clk_rec_param.flags = clk_rec_mode; - - memset(&matrix, 0, sizeof(struct asm_mtmx_strtr_params)); - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_CMD; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t); - matrix.data.reserved = 0; - memcpy(&(matrix.config.clk_rec_param), - &clk_rec_param, - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t)); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: clk rec mode send failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto exit; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, clk rec mode send paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto exit; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto exit; - } - rc = 0; -exit: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_clk_rec_mode); - -/** - * q6asm_send_mtmx_strtr_enable_adjust_session_clock - - * command to send matrix for adjust time - * - * @ac: Audio client handle - * @enable: flag to adjust time or not - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_enable_adjust_session_clock(struct audio_client *ac, - bool enable) -{ - struct asm_mtmx_strtr_params matrix; - struct asm_session_mtmx_param_adjust_session_time_ctl_t adjust_time; - int sz = 0; - int rc = 0; - - pr_debug("%s: adjust session enable %d\n", __func__, enable); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - adjust_time.enable = enable; - memset(&matrix, 0, sizeof(struct asm_mtmx_strtr_params)); - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_param_adjust_session_time_ctl_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = ASM_SESSION_MTMX_PARAM_ADJUST_SESSION_TIME_CTL; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_param_adjust_session_time_ctl_t); - matrix.data.reserved = 0; - matrix.config.adj_time_param.enable = adjust_time.enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: enable adjust session failed failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto exit; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: enable adjust session failed failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto exit; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto exit; - } - rc = 0; -exit: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_enable_adjust_session_clock); - - -static int __q6asm_cmd(struct audio_client *ac, int cmd, uint32_t stream_id) -{ - struct apr_hdr hdr; - int rc; - atomic_t *state; - int cnt = 0; - - if (!ac) { - pr_err_ratelimited("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - q6asm_stream_add_hdr(ac, &hdr, sizeof(hdr), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, hdr.token, stream_id, ac->session); - switch (cmd) { - case CMD_PAUSE: - pr_debug("%s: CMD_PAUSE\n", __func__); - hdr.opcode = ASM_SESSION_CMD_PAUSE; - state = &ac->cmd_state; - break; - case CMD_SUSPEND: - pr_debug("%s: CMD_SUSPEND\n", __func__); - hdr.opcode = ASM_SESSION_CMD_SUSPEND; - state = &ac->cmd_state; - break; - case CMD_FLUSH: - pr_debug("%s: CMD_FLUSH\n", __func__); - hdr.opcode = ASM_STREAM_CMD_FLUSH; - state = &ac->cmd_state; - break; - case CMD_OUT_FLUSH: - pr_debug("%s: CMD_OUT_FLUSH\n", __func__); - hdr.opcode = ASM_STREAM_CMD_FLUSH_READBUFS; - state = &ac->cmd_state; - break; - case CMD_EOS: - pr_debug("%s: CMD_EOS\n", __func__); - hdr.opcode = ASM_DATA_CMD_EOS; - atomic_set(&ac->cmd_state, 0); - state = &ac->cmd_state; - break; - case CMD_CLOSE: - pr_debug("%s: CMD_CLOSE\n", __func__); - hdr.opcode = ASM_STREAM_CMD_CLOSE; - state = &ac->cmd_state; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, cmd); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, - hdr.opcode); - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", - __func__, hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, (atomic_read(state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for response opcode[0x%x]\n", - __func__, hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(state) > 0) { - pr_err("%s: DSP returned error[%s] opcode %d\n", - __func__, adsp_err_get_err_str( - atomic_read(state)), - hdr.opcode); - rc = adsp_err_get_lnx_err_code(atomic_read(state)); - goto fail_cmd; - } - - if (cmd == CMD_FLUSH) - q6asm_reset_buf_state(ac); - if (cmd == CMD_CLOSE) { - /* check if DSP return all buffers */ - if (ac->port[IN].buf) { - for (cnt = 0; cnt < ac->port[IN].max_buf_cnt; - cnt++) { - if (ac->port[IN].buf[cnt].used == IN) { - dev_vdbg(ac->dev, "Write Buf[%d] not returned\n", - cnt); - } - } - } - if (ac->port[OUT].buf) { - for (cnt = 0; cnt < ac->port[OUT].max_buf_cnt; cnt++) { - if (ac->port[OUT].buf[cnt].used == OUT) { - dev_vdbg(ac->dev, "Read Buf[%d] not returned\n", - cnt); - } - } - } - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_cmd - - * Function used to send commands for - * ASM with wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * - * Returns 0 on success or error on failure - */ -int q6asm_cmd(struct audio_client *ac, int cmd) -{ - return __q6asm_cmd(ac, cmd, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_cmd); - -/** - * q6asm_stream_cmd - - * Function used to send commands for - * ASM stream with wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * @stream_id: Stream ID - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_cmd(struct audio_client *ac, int cmd, uint32_t stream_id) -{ - return __q6asm_cmd(ac, cmd, stream_id); -} -EXPORT_SYMBOL(q6asm_stream_cmd); - -/** - * q6asm_cmd_nowait - - * Function used to send commands for - * ASM stream without wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * @stream_id: Stream ID - * - * Returns 0 on success or error on failure - */ -static int __q6asm_cmd_nowait(struct audio_client *ac, int cmd, - uint32_t stream_id) -{ - struct apr_hdr hdr; - int rc; - - if (!ac) { - pr_err_ratelimited("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - q6asm_stream_add_hdr_async(ac, &hdr, sizeof(hdr), TRUE, stream_id); - atomic_set(&ac->cmd_state, 1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, hdr.token, stream_id, ac->session); - switch (cmd) { - case CMD_PAUSE: - pr_debug("%s: CMD_PAUSE\n", __func__); - hdr.opcode = ASM_SESSION_CMD_PAUSE; - break; - case CMD_EOS: - pr_debug("%s: CMD_EOS\n", __func__); - hdr.opcode = ASM_DATA_CMD_EOS; - break; - case CMD_CLOSE: - pr_debug("%s: CMD_CLOSE\n", __func__); - hdr.opcode = ASM_STREAM_CMD_CLOSE; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, cmd); - goto fail_cmd; - } - pr_debug("%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, - hdr.opcode); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", - __func__, hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} - -int q6asm_cmd_nowait(struct audio_client *ac, int cmd) -{ - pr_debug("%s: stream_id: %d\n", __func__, ac->stream_id); - return __q6asm_cmd_nowait(ac, cmd, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_cmd_nowait); - -/** - * q6asm_stream_cmd_nowait - - * Function used to send commands for - * ASM stream without wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * @stream_id: Stream ID - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_cmd_nowait(struct audio_client *ac, int cmd, - uint32_t stream_id) -{ - pr_debug("%s: stream_id: %d\n", __func__, stream_id); - return __q6asm_cmd_nowait(ac, cmd, stream_id); -} -EXPORT_SYMBOL(q6asm_stream_cmd_nowait); - -int __q6asm_send_meta_data(struct audio_client *ac, uint32_t stream_id, - uint32_t initial_samples, uint32_t trailing_samples) -{ - struct asm_data_cmd_remove_silence silence; - int rc = 0; - - if (!ac) { - pr_err_ratelimited("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - q6asm_stream_add_hdr_async(ac, &silence.hdr, sizeof(silence), TRUE, - stream_id); - - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&silence.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, silence.hdr.token, stream_id, ac->session); - - silence.hdr.opcode = ASM_DATA_CMD_REMOVE_INITIAL_SILENCE; - silence.num_samples_to_remove = initial_samples; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &silence); - if (rc < 0) { - pr_err("%s: Commmand silence failed[%d]", __func__, rc); - - goto fail_cmd; - } - - silence.hdr.opcode = ASM_DATA_CMD_REMOVE_TRAILING_SILENCE; - silence.num_samples_to_remove = trailing_samples; - - - rc = apr_send_pkt(ac->apr, (uint32_t *) &silence); - if (rc < 0) { - pr_err("%s: Commmand silence failed[%d]", __func__, rc); - goto fail_cmd; - } - - return 0; -fail_cmd: - return -EINVAL; -} - -/** - * q6asm_stream_send_meta_data - - * command to send meta data for stream - * - * @ac: Audio client handle - * @stream_id: Stream ID - * @initial_samples: Initial samples of stream - * @trailing_samples: Trailing samples of stream - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_send_meta_data(struct audio_client *ac, uint32_t stream_id, - uint32_t initial_samples, uint32_t trailing_samples) -{ - return __q6asm_send_meta_data(ac, stream_id, initial_samples, - trailing_samples); -} -EXPORT_SYMBOL(q6asm_stream_send_meta_data); - -int q6asm_send_meta_data(struct audio_client *ac, uint32_t initial_samples, - uint32_t trailing_samples) -{ - return __q6asm_send_meta_data(ac, ac->stream_id, initial_samples, - trailing_samples); -} - -static void q6asm_reset_buf_state(struct audio_client *ac) -{ - int cnt = 0; - int loopcnt = 0; - int used; - struct audio_port_data *port = NULL; - - if (ac->io_mode & SYNC_IO_MODE) { - used = (ac->io_mode & TUN_WRITE_IO_MODE ? 1 : 0); - mutex_lock(&ac->cmd_lock); - for (loopcnt = 0; loopcnt <= OUT; loopcnt++) { - port = &ac->port[loopcnt]; - cnt = port->max_buf_cnt - 1; - port->dsp_buf = 0; - port->cpu_buf = 0; - while (cnt >= 0) { - if (!port->buf) - continue; - port->buf[cnt].used = used; - cnt--; - } - } - mutex_unlock(&ac->cmd_lock); - } -} - -/** - * q6asm_reg_tx_overflow - - * command to register for TX overflow events - * - * @ac: Audio client handle - * @enable: flag to enable or disable events - * - * Returns 0 on success or error on failure - */ -int q6asm_reg_tx_overflow(struct audio_client *ac, uint16_t enable) -{ - struct asm_session_cmd_regx_overflow tx_overflow; - int rc; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]enable[%d]\n", __func__, - ac->session, enable); - q6asm_add_hdr(ac, &tx_overflow.hdr, sizeof(tx_overflow), TRUE); - atomic_set(&ac->cmd_state, -1); - - tx_overflow.hdr.opcode = - ASM_SESSION_CMD_REGISTER_FORX_OVERFLOW_EVENTS; - /* tx overflow event: enable */ - tx_overflow.enable_flag = enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &tx_overflow); - if (rc < 0) { - pr_err("%s: tx overflow op[0x%x]rc[%d]\n", - __func__, tx_overflow.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for tx overflow\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_reg_tx_overflow); - -int q6asm_reg_rx_underflow(struct audio_client *ac, uint16_t enable) -{ - struct asm_session_cmd_rgstr_rx_underflow rx_underflow; - int rc; - - if (!ac) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]enable[%d]\n", __func__, - ac->session, enable); - q6asm_add_hdr_async(ac, &rx_underflow.hdr, sizeof(rx_underflow), FALSE); - - rx_underflow.hdr.opcode = - ASM_SESSION_CMD_REGISTER_FOR_RX_UNDERFLOW_EVENTS; - /* tx overflow event: enable */ - rx_underflow.enable_flag = enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &rx_underflow); - if (rc < 0) { - pr_err("%s: tx overflow op[0x%x]rc[%d]\n", - __func__, rx_underflow.hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} - -/** - * q6asm_adjust_session_clock - - * command to adjust session clock - * - * @ac: Audio client handle - * @adjust_time_lsw: lower 32bits - * @adjust_time_msw: upper 32bits - * - * Returns 0 on success or error on failure - */ -int q6asm_adjust_session_clock(struct audio_client *ac, - uint32_t adjust_time_lsw, - uint32_t adjust_time_msw) -{ - int rc = 0; - int sz = 0; - struct asm_session_cmd_adjust_session_clock_v2 adjust_clock; - - pr_debug("%s: adjust_time_lsw is %x, adjust_time_msw is %x\n", __func__, - adjust_time_lsw, adjust_time_msw); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - sz = sizeof(struct asm_session_cmd_adjust_session_clock_v2); - q6asm_add_hdr(ac, &adjust_clock.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - adjust_clock.hdr.opcode = ASM_SESSION_CMD_ADJUST_SESSION_CLOCK_V2; - - adjust_clock.adjustime_lsw = adjust_time_lsw; - adjust_clock.adjustime_msw = adjust_time_msw; - - - rc = apr_send_pkt(ac->apr, (uint32_t *) &adjust_clock); - if (rc < 0) { - pr_err("%s: adjust_clock send failed paramid [0x%x]\n", - __func__, adjust_clock.hdr.opcode); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, adjust_clock paramid[0x%x]\n", - __func__, adjust_clock.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_adjust_session_clock); - -/* - * q6asm_get_path_delay() - get the path delay for an audio session - * @ac: audio client handle - * - * Retrieves the current audio DSP path delay for the given audio session. - * - * Return: 0 on success, error code otherwise - */ -int q6asm_get_path_delay(struct audio_client *ac) -{ - int rc = 0; - struct apr_hdr hdr; - - if (!ac || ac->apr == NULL) { - pr_err("%s: invalid audio client\n", __func__); - return -EINVAL; - } - - hdr.opcode = ASM_SESSION_CMD_GET_PATH_DELAY_V2; - q6asm_add_hdr(ac, &hdr, sizeof(hdr), TRUE); - atomic_set(&ac->cmd_state, -1); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", __func__, - hdr.opcode, rc); - return rc; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for response opcode[0x%x]\n", - __func__, hdr.opcode); - return -ETIMEDOUT; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - return rc; - } - - return 0; -} -EXPORT_SYMBOL(q6asm_get_path_delay); - -int q6asm_get_apr_service_id(int session_id) -{ - int service_id; - - pr_debug("%s:\n", __func__); - - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: invalid session_id = %d\n", __func__, session_id); - return -EINVAL; - } - mutex_lock(&session[session_id].mutex_lock_per_session); - if (session[session_id].ac != NULL) - if ((session[session_id].ac)->apr != NULL) { - service_id = ((struct apr_svc *) - (session[session_id].ac)->apr)->id; - mutex_unlock( - &session[session_id].mutex_lock_per_session); - return service_id; - } - mutex_unlock(&session[session_id].mutex_lock_per_session); - return -EINVAL; -} - -uint8_t q6asm_get_asm_stream_id(int session_id) -{ - uint8_t stream_id = 1; - pr_debug("%s:\n", __func__); - - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: invalid session_id = %d\n", __func__, session_id); - goto done; - } - if (session[session_id].ac == NULL) { - pr_err("%s: session not created for session id = %d\n", - __func__, session_id); - goto done; - } - stream_id = (session[session_id].ac)->stream_id; - -done: - return stream_id; -} - -int q6asm_get_asm_topology(int session_id) -{ - int topology = -EINVAL; - - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: invalid session_id = %d\n", __func__, session_id); - goto done; - } - if (session[session_id].ac == NULL) { - pr_err("%s: session not created for session id = %d\n", - __func__, session_id); - goto done; - } - topology = (session[session_id].ac)->topology; -done: - return topology; -} - -int q6asm_get_asm_app_type(int session_id) -{ - int app_type = -EINVAL; - - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: invalid session_id = %d\n", __func__, session_id); - goto done; - } - if (session[session_id].ac == NULL) { - pr_err("%s: session not created for session id = %d\n", - __func__, session_id); - goto done; - } - app_type = (session[session_id].ac)->app_type; -done: - return app_type; -} - -/* - * Retrieving cal_block will mark cal_block as stale. - * Hence it cannot be reused or resent unless the flag - * is reset. - */ -static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info) -{ - struct cal_block_data *cal_block = NULL; - - cal_info->topology_id = DEFAULT_POPP_TOPOLOGY; - cal_info->app_type = DEFAULT_APP_TYPE; - - if (cal_data[ASM_TOPOLOGY_CAL] == NULL) - goto done; - - mutex_lock(&cal_data[ASM_TOPOLOGY_CAL]->lock); - cal_block = cal_utils_get_only_cal_block(cal_data[ASM_TOPOLOGY_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) - goto unlock; - cal_info->topology_id = ((struct audio_cal_info_asm_top *) - cal_block->cal_info)->topology; - cal_info->app_type = ((struct audio_cal_info_asm_top *) - cal_block->cal_info)->app_type; - - cal_utils_mark_cal_used(cal_block); - -unlock: - mutex_unlock(&cal_data[ASM_TOPOLOGY_CAL]->lock); -done: - pr_debug("%s: Using topology %d app_type %d\n", __func__, - cal_info->topology_id, cal_info->app_type); - - return 0; -} - -/** - * q6asm_send_cal - - * command to send ASM calibration - * - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_send_cal(struct audio_client *ac) -{ - struct cal_block_data *cal_block = NULL; - struct mem_mapping_hdr mem_hdr; - u32 payload_size = 0; - int rc = -EINVAL; - pr_debug("%s:\n", __func__); - - if (!ac) { - pr_err("%s: Audio client is NULL\n", __func__); - return -EINVAL; - } - if (ac->io_mode & NT_MODE) { - pr_debug("%s: called for NT MODE, exiting\n", __func__); - goto done; - } - - if (cal_data[ASM_AUDSTRM_CAL] == NULL) - goto done; - - if (ac->perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) { - rc = 0; /* no cal is required, not error case */ - goto done; - } - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - mutex_lock(&cal_data[ASM_AUDSTRM_CAL]->lock); - cal_block = cal_utils_get_only_cal_block(cal_data[ASM_AUDSTRM_CAL]); - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL\n", - __func__); - goto unlock; - } - - if (cal_utils_is_cal_stale(cal_block)) { - rc = 0; /* not error case */ - pr_debug("%s: cal_block is stale\n", - __func__); - goto unlock; - } - - if (cal_block->cal_data.size == 0) { - rc = 0; /* not error case */ - pr_debug("%s: cal_data.size is 0, don't send cal data\n", - __func__); - goto unlock; - } - - rc = remap_cal_data(ASM_AUDSTRM_CAL_TYPE, cal_block); - if (rc) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, ASM_AUDSTRM_CAL); - goto unlock; - } - - mem_hdr.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - mem_hdr.mem_map_handle = cal_block->map_data.q6map_handle; - payload_size = cal_block->cal_data.size; - - pr_debug("%s: phyaddr lsw = %x msw = %x, maphdl = %x calsize = %d\n", - __func__, mem_hdr.data_payload_addr_lsw, - mem_hdr.data_payload_addr_msw, mem_hdr.mem_map_handle, - payload_size); - - rc = q6asm_set_pp_params(ac, &mem_hdr, NULL, payload_size); - if (rc) { - pr_err("%s: audio audstrm cal send failed\n", __func__); - goto unlock; - } - - if (cal_block) - cal_utils_mark_cal_used(cal_block); - rc = 0; - -unlock: - mutex_unlock(&cal_data[ASM_AUDSTRM_CAL]->lock); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_send_cal); - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case ASM_TOPOLOGY_CAL_TYPE: - ret = ASM_TOPOLOGY_CAL; - break; - case ASM_CUST_TOPOLOGY_CAL_TYPE: - ret = ASM_CUSTOM_TOP_CAL; - break; - case ASM_AUDSTRM_CAL_TYPE: - ret = ASM_AUDSTRM_CAL; - break; - case ASM_RTAC_APR_CAL_TYPE: - ret = ASM_RTAC_APR_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int q6asm_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6asm_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6asm_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == ASM_CUSTOM_TOP_CAL) { - mutex_lock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - set_custom_topology = 1; - mutex_unlock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - } -done: - return ret; -} - -static void q6asm_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - cal_utils_destroy_cal_types(ASM_MAX_CAL_TYPES, cal_data); -} - -static int q6asm_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{ASM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - q6asm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ASM_CUST_TOPOLOGY_CAL_TYPE, - {q6asm_alloc_cal, q6asm_dealloc_cal, NULL, - q6asm_set_cal, NULL, NULL} }, - {NULL, q6asm_unmap_cal_memory, cal_utils_match_buf_num} }, - - {{ASM_AUDSTRM_CAL_TYPE, - {q6asm_alloc_cal, q6asm_dealloc_cal, NULL, - q6asm_set_cal, NULL, NULL} }, - {NULL, q6asm_unmap_cal_memory, cal_utils_match_buf_num} }, - - {{ASM_RTAC_APR_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} } - }; - pr_debug("%s\n", __func__); - - ret = cal_utils_create_cal_types(ASM_MAX_CAL_TYPES, cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type! %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - return ret; -err: - q6asm_delete_cal_data(); - return ret; -} - -static int q6asm_is_valid_session(struct apr_client_data *data, void *priv) -{ - struct audio_client *ac = (struct audio_client *)priv; - union asm_token_struct asm_token; - - asm_token.token = data->token; - if (asm_token._token.session_id != ac->session) { - pr_err("%s: Invalid session[%d] rxed expected[%d]", - __func__, asm_token._token.session_id, ac->session); - return -EINVAL; - } - return 0; -} - -int __init q6asm_init(void) -{ - int lcnt, ret; - - pr_debug("%s:\n", __func__); - - memset(session, 0, sizeof(struct audio_session) * - (ASM_ACTIVE_STREAMS_ALLOWED + 1)); - for (lcnt = 0; lcnt <= ASM_ACTIVE_STREAMS_ALLOWED; lcnt++) { - spin_lock_init(&(session[lcnt].session_lock)); - mutex_init(&(session[lcnt].mutex_lock_per_session)); - } - set_custom_topology = 1; - - /*setup common client used for cal mem map */ - common_client.session = ASM_CONTROL_SESSION; - common_client.port[0].buf = &common_buf[0]; - common_client.port[1].buf = &common_buf[1]; - init_waitqueue_head(&common_client.cmd_wait); - init_waitqueue_head(&common_client.time_wait); - init_waitqueue_head(&common_client.mem_wait); - atomic_set(&common_client.time_flag, 1); - INIT_LIST_HEAD(&common_client.port[0].mem_map_handle); - INIT_LIST_HEAD(&common_client.port[1].mem_map_handle); - mutex_init(&common_client.cmd_lock); - for (lcnt = 0; lcnt <= OUT; lcnt++) { - mutex_init(&common_client.port[lcnt].lock); - spin_lock_init(&common_client.port[lcnt].dsp_lock); - } - atomic_set(&common_client.cmd_state, 0); - atomic_set(&common_client.mem_state, 0); - - ret = q6asm_init_cal_data(); - if (ret) - pr_err("%s: could not init cal data! ret %d\n", - __func__, ret); - - config_debug_fs_init(); - - return 0; -} - -void q6asm_exit(void) -{ - q6asm_delete_cal_data(); -} diff --git a/techpack/audio/4.0/dsp/q6audio-v2.c b/techpack/audio/4.0/dsp/q6audio-v2.c deleted file mode 100644 index e3a2dc7805b7..000000000000 --- a/techpack/audio/4.0/dsp/q6audio-v2.c +++ /dev/null @@ -1,1220 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -int q6audio_get_port_index(u16 port_id) -{ - switch (port_id) { - case PRIMARY_I2S_RX: return IDX_PRIMARY_I2S_RX; - case PRIMARY_I2S_TX: return IDX_PRIMARY_I2S_TX; - case AFE_PORT_ID_PRIMARY_PCM_RX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_RX; - case AFE_PORT_ID_PRIMARY_PCM_TX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_TX; - case AFE_PORT_ID_SECONDARY_PCM_RX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_RX; - case AFE_PORT_ID_SECONDARY_PCM_TX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_TX; - case AFE_PORT_ID_TERTIARY_PCM_RX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_RX; - case AFE_PORT_ID_TERTIARY_PCM_TX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_TX; - case AFE_PORT_ID_QUATERNARY_PCM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_RX; - case AFE_PORT_ID_QUATERNARY_PCM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_TX; - case AFE_PORT_ID_QUINARY_PCM_RX: - return IDX_AFE_PORT_ID_QUINARY_PCM_RX; - case AFE_PORT_ID_QUINARY_PCM_TX: - return IDX_AFE_PORT_ID_QUINARY_PCM_TX; - case AFE_PORT_ID_SENARY_PCM_RX: - return IDX_AFE_PORT_ID_SENARY_PCM_RX; - case AFE_PORT_ID_SENARY_PCM_TX: - return IDX_AFE_PORT_ID_SENARY_PCM_TX; - case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX; - case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX; - case MI2S_RX: return IDX_MI2S_RX; - case MI2S_TX: return IDX_MI2S_TX; - case HDMI_RX: return IDX_HDMI_RX; - case DISPLAY_PORT_RX: return IDX_DISPLAY_PORT_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: return IDX_PRIMARY_SPDIF_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: return IDX_PRIMARY_SPDIF_TX; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: return IDX_SECONDARY_SPDIF_RX; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: return IDX_SECONDARY_SPDIF_TX; - case RSVD_2: return IDX_RSVD_2; - case RSVD_3: return IDX_RSVD_3; - case DIGI_MIC_TX: return IDX_DIGI_MIC_TX; - case VOICE_RECORD_RX: return IDX_VOICE_RECORD_RX; - case VOICE_RECORD_TX: return IDX_VOICE_RECORD_TX; - case VOICE_PLAYBACK_TX: return IDX_VOICE_PLAYBACK_TX; - case VOICE2_PLAYBACK_TX: return IDX_VOICE2_PLAYBACK_TX; - case SLIMBUS_0_RX: return IDX_SLIMBUS_0_RX; - case SLIMBUS_0_TX: return IDX_SLIMBUS_0_TX; - case SLIMBUS_1_RX: return IDX_SLIMBUS_1_RX; - case SLIMBUS_1_TX: return IDX_SLIMBUS_1_TX; - case SLIMBUS_2_RX: return IDX_SLIMBUS_2_RX; - case SLIMBUS_2_TX: return IDX_SLIMBUS_2_TX; - case SLIMBUS_3_RX: return IDX_SLIMBUS_3_RX; - case SLIMBUS_3_TX: return IDX_SLIMBUS_3_TX; - case SLIMBUS_4_RX: return IDX_SLIMBUS_4_RX; - case SLIMBUS_4_TX: return IDX_SLIMBUS_4_TX; - case SLIMBUS_5_RX: return IDX_SLIMBUS_5_RX; - case SLIMBUS_5_TX: return IDX_SLIMBUS_5_TX; - case SLIMBUS_6_RX: return IDX_SLIMBUS_6_RX; - case SLIMBUS_6_TX: return IDX_SLIMBUS_6_TX; - case SLIMBUS_7_RX: return IDX_SLIMBUS_7_RX; - case SLIMBUS_7_TX: return IDX_SLIMBUS_7_TX; - case SLIMBUS_8_RX: return IDX_SLIMBUS_8_RX; - case SLIMBUS_8_TX: return IDX_SLIMBUS_8_TX; - case SLIMBUS_9_RX: return IDX_SLIMBUS_9_RX; - case SLIMBUS_9_TX: return IDX_SLIMBUS_9_TX; - case INT_BT_SCO_RX: return IDX_INT_BT_SCO_RX; - case INT_BT_SCO_TX: return IDX_INT_BT_SCO_TX; - case INT_BT_A2DP_RX: return IDX_INT_BT_A2DP_RX; - case INT_FM_RX: return IDX_INT_FM_RX; - case INT_FM_TX: return IDX_INT_FM_TX; - case RT_PROXY_PORT_001_RX: return IDX_RT_PROXY_PORT_001_RX; - case RT_PROXY_PORT_001_TX: return IDX_RT_PROXY_PORT_001_TX; - case AFE_PORT_ID_PRIMARY_MI2S_RX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_RX; - case AFE_PORT_ID_PRIMARY_MI2S_TX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_TX; - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX; - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_TX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX; - case AFE_PORT_ID_TERTIARY_MI2S_RX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX; - case AFE_PORT_ID_TERTIARY_MI2S_TX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX; - case AFE_PORT_ID_QUINARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_RX; - case AFE_PORT_ID_QUINARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_TX; - case AUDIO_PORT_ID_I2S_RX: - return IDX_AUDIO_PORT_ID_I2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - case AFE_PORT_ID_PRIMARY_TDM_RX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_0; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_0; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_0; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_0; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_0; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_0; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_0; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_0; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_0; - case AFE_PORT_ID_QUINARY_TDM_TX: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_0; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_TDM_RX: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_0; - case AFE_PORT_ID_SENARY_TDM_TX: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_0; - case AFE_PORT_ID_SENARY_TDM_RX_1: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_1; - case AFE_PORT_ID_SENARY_TDM_TX_1: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_1; - case AFE_PORT_ID_SENARY_TDM_RX_2: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_2; - case AFE_PORT_ID_SENARY_TDM_TX_2: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_2; - case AFE_PORT_ID_SENARY_TDM_RX_3: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_3; - case AFE_PORT_ID_SENARY_TDM_TX_3: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_3; - case AFE_PORT_ID_SENARY_TDM_RX_4: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_4; - case AFE_PORT_ID_SENARY_TDM_TX_4: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_4; - case AFE_PORT_ID_SENARY_TDM_RX_5: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_5; - case AFE_PORT_ID_SENARY_TDM_TX_5: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_5; - case AFE_PORT_ID_SENARY_TDM_RX_6: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_6; - case AFE_PORT_ID_SENARY_TDM_TX_6: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_6; - case AFE_PORT_ID_SENARY_TDM_RX_7: - return IDX_AFE_PORT_ID_SENARY_TDM_RX_7; - case AFE_PORT_ID_SENARY_TDM_TX_7: - return IDX_AFE_PORT_ID_SENARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_MI2S_RX: - return IDX_AFE_PORT_ID_SENARY_MI2S_RX; - case AFE_PORT_ID_SENARY_MI2S_TX: - return IDX_AFE_PORT_ID_SENARY_MI2S_TX; - case AFE_PORT_ID_USB_RX: - return IDX_AFE_PORT_ID_USB_RX; - case AFE_PORT_ID_USB_TX: - return IDX_AFE_PORT_ID_USB_TX; - case AFE_PORT_ID_INT0_MI2S_RX: - return IDX_AFE_PORT_ID_INT0_MI2S_RX; - case AFE_PORT_ID_INT0_MI2S_TX: - return IDX_AFE_PORT_ID_INT0_MI2S_TX; - case AFE_PORT_ID_INT1_MI2S_RX: - return IDX_AFE_PORT_ID_INT1_MI2S_RX; - case AFE_PORT_ID_INT1_MI2S_TX: - return IDX_AFE_PORT_ID_INT1_MI2S_TX; - case AFE_PORT_ID_INT2_MI2S_RX: - return IDX_AFE_PORT_ID_INT2_MI2S_RX; - case AFE_PORT_ID_INT2_MI2S_TX: - return IDX_AFE_PORT_ID_INT2_MI2S_TX; - case AFE_PORT_ID_INT3_MI2S_RX: - return IDX_AFE_PORT_ID_INT3_MI2S_RX; - case AFE_PORT_ID_INT3_MI2S_TX: - return IDX_AFE_PORT_ID_INT3_MI2S_TX; - case AFE_PORT_ID_INT4_MI2S_RX: - return IDX_AFE_PORT_ID_INT4_MI2S_RX; - case AFE_PORT_ID_INT4_MI2S_TX: - return IDX_AFE_PORT_ID_INT4_MI2S_TX; - case AFE_PORT_ID_INT5_MI2S_RX: - return IDX_AFE_PORT_ID_INT5_MI2S_RX; - case AFE_PORT_ID_INT5_MI2S_TX: - return IDX_AFE_PORT_ID_INT5_MI2S_TX; - case AFE_PORT_ID_INT6_MI2S_RX: - return IDX_AFE_PORT_ID_INT6_MI2S_RX; - case AFE_PORT_ID_INT6_MI2S_TX: - return IDX_AFE_PORT_ID_INT6_MI2S_TX; - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - return IDX_AFE_PORT_ID_PRIMARY_META_MI2S_RX; - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - return IDX_AFE_PORT_ID_SECONDARY_META_MI2S_RX; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_0; - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_1; - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_0; - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_0; - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_1; - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_2; - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_3; - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_3; - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_4; - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_4; - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_5; - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5; - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6; - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7; - case RT_PROXY_PORT_002_RX: - return IDX_RT_PROXY_PORT_002_RX; - case RT_PROXY_PORT_002_TX: - return IDX_RT_PROXY_PORT_002_TX; - default: return -EINVAL; - } -} - -int q6audio_get_port_id(u16 port_id) -{ - switch (port_id) { - case PRIMARY_I2S_RX: return PRIMARY_I2S_RX; - case PRIMARY_I2S_TX: return PRIMARY_I2S_TX; - case AFE_PORT_ID_PRIMARY_PCM_RX: - return AFE_PORT_ID_PRIMARY_PCM_RX; - case AFE_PORT_ID_PRIMARY_PCM_TX: - return AFE_PORT_ID_PRIMARY_PCM_TX; - case AFE_PORT_ID_SECONDARY_PCM_RX: - return AFE_PORT_ID_SECONDARY_PCM_RX; - case AFE_PORT_ID_SECONDARY_PCM_TX: - return AFE_PORT_ID_SECONDARY_PCM_TX; - case AFE_PORT_ID_TERTIARY_PCM_RX: - return AFE_PORT_ID_TERTIARY_PCM_RX; - case AFE_PORT_ID_TERTIARY_PCM_TX: - return AFE_PORT_ID_TERTIARY_PCM_TX; - case AFE_PORT_ID_QUATERNARY_PCM_RX: - return AFE_PORT_ID_QUATERNARY_PCM_RX; - case AFE_PORT_ID_QUATERNARY_PCM_TX: - return AFE_PORT_ID_QUATERNARY_PCM_TX; - case AFE_PORT_ID_QUINARY_PCM_RX: - return AFE_PORT_ID_QUINARY_PCM_RX; - case AFE_PORT_ID_QUINARY_PCM_TX: - return AFE_PORT_ID_QUINARY_PCM_TX; - case AFE_PORT_ID_SENARY_PCM_RX: - return AFE_PORT_ID_SENARY_PCM_RX; - case AFE_PORT_ID_SENARY_PCM_TX: - return AFE_PORT_ID_SENARY_PCM_TX; - case SECONDARY_I2S_RX: return AFE_PORT_ID_SECONDARY_MI2S_RX; - case SECONDARY_I2S_TX: return AFE_PORT_ID_SECONDARY_MI2S_TX; - case MI2S_RX: return AFE_PORT_ID_PRIMARY_MI2S_RX; - case MI2S_TX: return AFE_PORT_ID_PRIMARY_MI2S_TX; - case HDMI_RX: return AFE_PORT_ID_MULTICHAN_HDMI_RX; - case DISPLAY_PORT_RX: - return AFE_PORT_ID_HDMI_OVER_DP_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - return AFE_PORT_ID_PRIMARY_SPDIF_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - return AFE_PORT_ID_PRIMARY_SPDIF_TX; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - return AFE_PORT_ID_SECONDARY_SPDIF_RX; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - return AFE_PORT_ID_SECONDARY_SPDIF_TX; - case RSVD_2: return IDX_RSVD_2; - case RSVD_3: return IDX_RSVD_3; - case DIGI_MIC_TX: return AFE_PORT_ID_DIGITAL_MIC_TX; - case VOICE_RECORD_RX: return AFE_PORT_ID_VOICE_RECORD_RX; - case VOICE_RECORD_TX: return AFE_PORT_ID_VOICE_RECORD_TX; - case VOICE_PLAYBACK_TX: return AFE_PORT_ID_VOICE_PLAYBACK_TX; - case VOICE2_PLAYBACK_TX: return AFE_PORT_ID_VOICE2_PLAYBACK_TX; - case SLIMBUS_0_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX; - case SLIMBUS_0_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX; - case SLIMBUS_1_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX; - case SLIMBUS_1_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX; - case SLIMBUS_2_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX; - case SLIMBUS_2_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX; - case SLIMBUS_3_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX; - case SLIMBUS_3_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX; - case SLIMBUS_4_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX; - case SLIMBUS_4_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX; - case SLIMBUS_5_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX; - case SLIMBUS_5_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; - case SLIMBUS_6_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX; - case SLIMBUS_6_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX; - case SLIMBUS_7_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_RX; - case SLIMBUS_7_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_TX; - case SLIMBUS_8_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_RX; - case SLIMBUS_8_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_TX; - case SLIMBUS_9_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_RX; - case SLIMBUS_9_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_TX; - case INT_BT_SCO_RX: return AFE_PORT_ID_INTERNAL_BT_SCO_RX; - case INT_BT_SCO_TX: return AFE_PORT_ID_INTERNAL_BT_SCO_TX; - case INT_BT_A2DP_RX: return AFE_PORT_ID_INTERNAL_BT_A2DP_RX; - case INT_FM_RX: return AFE_PORT_ID_INTERNAL_FM_RX; - case INT_FM_TX: return AFE_PORT_ID_INTERNAL_FM_TX; - case RT_PROXY_PORT_001_RX: return AFE_PORT_ID_RT_PROXY_PORT_001_RX; - case RT_PROXY_PORT_001_TX: return AFE_PORT_ID_RT_PROXY_PORT_001_TX; - case AFE_PORT_ID_PRIMARY_MI2S_RX: - return AFE_PORT_ID_PRIMARY_MI2S_RX; - case AFE_PORT_ID_PRIMARY_MI2S_TX: - return AFE_PORT_ID_PRIMARY_MI2S_TX; - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - return AFE_PORT_ID_QUATERNARY_MI2S_RX; - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - return AFE_PORT_ID_QUATERNARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX: - return AFE_PORT_ID_SECONDARY_MI2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_TX: - return AFE_PORT_ID_SECONDARY_MI2S_TX; - case AFE_PORT_ID_TERTIARY_MI2S_RX: - return AFE_PORT_ID_TERTIARY_MI2S_RX; - case AFE_PORT_ID_TERTIARY_MI2S_TX: - return AFE_PORT_ID_TERTIARY_MI2S_TX; - case AFE_PORT_ID_QUINARY_MI2S_RX: - return AFE_PORT_ID_QUINARY_MI2S_RX; - case AFE_PORT_ID_QUINARY_MI2S_TX: - return AFE_PORT_ID_QUINARY_MI2S_TX; - case AUDIO_PORT_ID_I2S_RX: - return AUDIO_PORT_ID_I2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - return AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - return AFE_PORT_ID_PRIMARY_META_MI2S_RX; - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - return AFE_PORT_ID_SECONDARY_META_MI2S_RX; - case AFE_PORT_ID_PRIMARY_TDM_RX: - return AFE_PORT_ID_PRIMARY_TDM_RX; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return AFE_PORT_ID_PRIMARY_TDM_TX; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return AFE_PORT_ID_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return AFE_PORT_ID_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return AFE_PORT_ID_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return AFE_PORT_ID_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return AFE_PORT_ID_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return AFE_PORT_ID_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return AFE_PORT_ID_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return AFE_PORT_ID_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return AFE_PORT_ID_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return AFE_PORT_ID_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return AFE_PORT_ID_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return AFE_PORT_ID_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return AFE_PORT_ID_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return AFE_PORT_ID_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return AFE_PORT_ID_SECONDARY_TDM_RX; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return AFE_PORT_ID_SECONDARY_TDM_TX; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return AFE_PORT_ID_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return AFE_PORT_ID_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return AFE_PORT_ID_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return AFE_PORT_ID_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return AFE_PORT_ID_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return AFE_PORT_ID_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return AFE_PORT_ID_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return AFE_PORT_ID_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return AFE_PORT_ID_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return AFE_PORT_ID_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return AFE_PORT_ID_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return AFE_PORT_ID_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return AFE_PORT_ID_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return AFE_PORT_ID_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return AFE_PORT_ID_TERTIARY_TDM_RX; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return AFE_PORT_ID_TERTIARY_TDM_TX; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return AFE_PORT_ID_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return AFE_PORT_ID_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return AFE_PORT_ID_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return AFE_PORT_ID_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return AFE_PORT_ID_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return AFE_PORT_ID_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return AFE_PORT_ID_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return AFE_PORT_ID_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return AFE_PORT_ID_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return AFE_PORT_ID_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return AFE_PORT_ID_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return AFE_PORT_ID_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return AFE_PORT_ID_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return AFE_PORT_ID_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return AFE_PORT_ID_QUATERNARY_TDM_RX; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return AFE_PORT_ID_QUATERNARY_TDM_TX; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return AFE_PORT_ID_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return AFE_PORT_ID_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return AFE_PORT_ID_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return AFE_PORT_ID_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return AFE_PORT_ID_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return AFE_PORT_ID_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return AFE_PORT_ID_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return AFE_PORT_ID_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return AFE_PORT_ID_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return AFE_PORT_ID_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return AFE_PORT_ID_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return AFE_PORT_ID_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return AFE_PORT_ID_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return AFE_PORT_ID_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return AFE_PORT_ID_QUINARY_TDM_RX; - case AFE_PORT_ID_QUINARY_TDM_TX: - return AFE_PORT_ID_QUINARY_TDM_TX; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return AFE_PORT_ID_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return AFE_PORT_ID_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return AFE_PORT_ID_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return AFE_PORT_ID_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return AFE_PORT_ID_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return AFE_PORT_ID_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return AFE_PORT_ID_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return AFE_PORT_ID_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return AFE_PORT_ID_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return AFE_PORT_ID_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return AFE_PORT_ID_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return AFE_PORT_ID_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return AFE_PORT_ID_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return AFE_PORT_ID_QUINARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_TDM_RX: - return AFE_PORT_ID_SENARY_TDM_RX; - case AFE_PORT_ID_SENARY_TDM_TX: - return AFE_PORT_ID_SENARY_TDM_TX; - case AFE_PORT_ID_SENARY_TDM_RX_1: - return AFE_PORT_ID_SENARY_TDM_RX_1; - case AFE_PORT_ID_SENARY_TDM_TX_1: - return AFE_PORT_ID_SENARY_TDM_TX_1; - case AFE_PORT_ID_SENARY_TDM_RX_2: - return AFE_PORT_ID_SENARY_TDM_RX_2; - case AFE_PORT_ID_SENARY_TDM_TX_2: - return AFE_PORT_ID_SENARY_TDM_TX_2; - case AFE_PORT_ID_SENARY_TDM_RX_3: - return AFE_PORT_ID_SENARY_TDM_RX_3; - case AFE_PORT_ID_SENARY_TDM_TX_3: - return AFE_PORT_ID_SENARY_TDM_TX_3; - case AFE_PORT_ID_SENARY_TDM_RX_4: - return AFE_PORT_ID_SENARY_TDM_RX_4; - case AFE_PORT_ID_SENARY_TDM_TX_4: - return AFE_PORT_ID_SENARY_TDM_TX_4; - case AFE_PORT_ID_SENARY_TDM_RX_5: - return AFE_PORT_ID_SENARY_TDM_RX_5; - case AFE_PORT_ID_SENARY_TDM_TX_5: - return AFE_PORT_ID_SENARY_TDM_TX_5; - case AFE_PORT_ID_SENARY_TDM_RX_6: - return AFE_PORT_ID_SENARY_TDM_RX_6; - case AFE_PORT_ID_SENARY_TDM_TX_6: - return AFE_PORT_ID_SENARY_TDM_TX_6; - case AFE_PORT_ID_SENARY_TDM_RX_7: - return AFE_PORT_ID_SENARY_TDM_RX_7; - case AFE_PORT_ID_SENARY_TDM_TX_7: - return AFE_PORT_ID_SENARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_MI2S_RX: - return AFE_PORT_ID_SENARY_MI2S_RX; - case AFE_PORT_ID_SENARY_MI2S_TX: - return AFE_PORT_ID_SENARY_MI2S_TX; - case AFE_PORT_ID_USB_RX: - return AFE_PORT_ID_USB_RX; - case AFE_PORT_ID_USB_TX: - return AFE_PORT_ID_USB_TX; - case AFE_PORT_ID_INT0_MI2S_RX: - return AFE_PORT_ID_INT0_MI2S_RX; - case AFE_PORT_ID_INT0_MI2S_TX: - return AFE_PORT_ID_INT0_MI2S_TX; - case AFE_PORT_ID_INT1_MI2S_RX: - return AFE_PORT_ID_INT1_MI2S_RX; - case AFE_PORT_ID_INT1_MI2S_TX: - return AFE_PORT_ID_INT1_MI2S_TX; - case AFE_PORT_ID_INT2_MI2S_RX: - return AFE_PORT_ID_INT2_MI2S_RX; - case AFE_PORT_ID_INT2_MI2S_TX: - return AFE_PORT_ID_INT2_MI2S_TX; - case AFE_PORT_ID_INT3_MI2S_RX: - return AFE_PORT_ID_INT3_MI2S_RX; - case AFE_PORT_ID_INT3_MI2S_TX: - return AFE_PORT_ID_INT3_MI2S_TX; - case AFE_PORT_ID_INT4_MI2S_RX: - return AFE_PORT_ID_INT4_MI2S_RX; - case AFE_PORT_ID_INT4_MI2S_TX: - return AFE_PORT_ID_INT4_MI2S_TX; - case AFE_PORT_ID_INT5_MI2S_RX: - return AFE_PORT_ID_INT5_MI2S_RX; - case AFE_PORT_ID_INT5_MI2S_TX: - return AFE_PORT_ID_INT5_MI2S_TX; - case AFE_PORT_ID_INT6_MI2S_RX: - return AFE_PORT_ID_INT6_MI2S_RX; - case AFE_PORT_ID_INT6_MI2S_TX: - return AFE_PORT_ID_INT6_MI2S_TX; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - return AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - return AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - return AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - return AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - return AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - return AFE_PORT_ID_VA_CODEC_DMA_TX_0; - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - return AFE_PORT_ID_VA_CODEC_DMA_TX_1; - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - return AFE_PORT_ID_VA_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - return AFE_PORT_ID_RX_CODEC_DMA_RX_0; - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - return AFE_PORT_ID_TX_CODEC_DMA_TX_0; - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - return AFE_PORT_ID_RX_CODEC_DMA_RX_1; - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - return AFE_PORT_ID_TX_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - return AFE_PORT_ID_RX_CODEC_DMA_RX_2; - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - return AFE_PORT_ID_TX_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - return AFE_PORT_ID_RX_CODEC_DMA_RX_3; - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - return AFE_PORT_ID_TX_CODEC_DMA_TX_3; - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - return AFE_PORT_ID_RX_CODEC_DMA_RX_4; - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - return AFE_PORT_ID_TX_CODEC_DMA_TX_4; - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - return AFE_PORT_ID_RX_CODEC_DMA_RX_5; - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - return AFE_PORT_ID_TX_CODEC_DMA_TX_5; - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - return AFE_PORT_ID_RX_CODEC_DMA_RX_6; - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - return AFE_PORT_ID_RX_CODEC_DMA_RX_7; - case RT_PROXY_PORT_002_RX: - return RT_PROXY_PORT_002_RX; - case RT_PROXY_PORT_002_TX: - return RT_PROXY_PORT_002_TX; - default: - pr_warn("%s: Invalid port_id %d\n", __func__, port_id); - return -EINVAL; - } -} -int q6audio_convert_virtual_to_portid(u16 port_id) -{ - int ret; - - /* if port_id is virtual, convert to physical.. - * if port_id is already physical, return physical - */ - if (q6audio_validate_port(port_id) < 0) { - if (port_id == RT_PROXY_DAI_001_RX || - port_id == RT_PROXY_DAI_001_TX || - port_id == RT_PROXY_DAI_002_RX || - port_id == RT_PROXY_DAI_002_TX) - ret = VIRTUAL_ID_TO_PORTID(port_id); - else - ret = -EINVAL; - } else - ret = port_id; - - return ret; -} - -int q6audio_is_digital_pcm_interface(u16 port_id) -{ - int ret = 0; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AUDIO_PORT_ID_I2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - case AFE_PORT_ID_SENARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_MI2S_RX: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_TX: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - break; - default: - ret = -EINVAL; - } - - return ret; -} - -/** - * q6audio_validate_port - - * validates port id - * - * @port_id: port id to validate - * - * Returns 0 on success or error on invalid port - */ -int q6audio_validate_port(u16 port_id) -{ - int ret; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case HDMI_RX: - case DISPLAY_PORT_RX: - case RSVD_2: - case RSVD_3: - case DIGI_MIC_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_5_TX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - case INT_BT_SCO_RX: - case INT_BT_SCO_TX: - case INT_BT_A2DP_RX: - case INT_FM_RX: - case INT_FM_TX: - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - case AFE_PORT_ID_PRIMARY_META_MI2S_RX: - case AFE_PORT_ID_SECONDARY_META_MI2S_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_TDM_RX: - case AFE_PORT_ID_SENARY_TDM_TX: - case AFE_PORT_ID_SENARY_TDM_RX_1: - case AFE_PORT_ID_SENARY_TDM_TX_1: - case AFE_PORT_ID_SENARY_TDM_RX_2: - case AFE_PORT_ID_SENARY_TDM_TX_2: - case AFE_PORT_ID_SENARY_TDM_RX_3: - case AFE_PORT_ID_SENARY_TDM_TX_3: - case AFE_PORT_ID_SENARY_TDM_RX_4: - case AFE_PORT_ID_SENARY_TDM_TX_4: - case AFE_PORT_ID_SENARY_TDM_RX_5: - case AFE_PORT_ID_SENARY_TDM_TX_5: - case AFE_PORT_ID_SENARY_TDM_RX_6: - case AFE_PORT_ID_SENARY_TDM_TX_6: - case AFE_PORT_ID_SENARY_TDM_RX_7: - case AFE_PORT_ID_SENARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_MI2S_RX: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_TX: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_VA_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - { - ret = 0; - break; - } - - default: - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(q6audio_validate_port); diff --git a/techpack/audio/4.0/dsp/q6common.c b/techpack/audio/4.0/dsp/q6common.c deleted file mode 100644 index b5444b134732..000000000000 --- a/techpack/audio/4.0/dsp/q6common.c +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. - */ - -#include - -struct q6common_ctl { - bool instance_id_supported; -}; - -static struct q6common_ctl common; - -/** - * q6common_update_instance_id_support - * - * Update instance ID support flag to true/false - * - * @supported: enable/disable for instance ID support - */ -void q6common_update_instance_id_support(bool supported) -{ - common.instance_id_supported = supported; -} -EXPORT_SYMBOL(q6common_update_instance_id_support); - -/** - * q6common_is_instance_id_supported - * - * Returns true/false for instance ID support - */ -bool q6common_is_instance_id_supported(void) -{ - return common.instance_id_supported; -} -EXPORT_SYMBOL(q6common_is_instance_id_supported); - -/** - * q6common_pack_pp_params - * - * Populate params header based on instance ID support and pack - * it with payload. - * Instance ID support - - * yes - param_hdr_v3 + payload - * no - param_hdr_v1 + payload - * - * @dest: destination data pointer to be packed into - * @v3_hdr: param header v3 - * @param_data: param payload - * @total_size: total size of packed data (hdr + payload) - * - * Returns 0 on success or error on failure - */ -int q6common_pack_pp_params(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size) -{ - struct param_hdr_v1 *v1_hdr = NULL; - u32 packed_size = 0; - u32 param_size = 0; - bool iid_supported = q6common_is_instance_id_supported(); - - if (dest == NULL) { - pr_err("%s: Received NULL pointer for destination\n", __func__); - return -EINVAL; - } else if (v3_hdr == NULL) { - pr_err("%s: Received NULL pointer for header\n", __func__); - return -EINVAL; - } else if (total_size == NULL) { - pr_err("%s: Received NULL pointer for total size\n", __func__); - return -EINVAL; - } - - param_size = v3_hdr->param_size; - packed_size = iid_supported ? sizeof(struct param_hdr_v3) : - sizeof(struct param_hdr_v1); - - if (iid_supported) { - memcpy(dest, v3_hdr, packed_size); - } else { - v1_hdr = (struct param_hdr_v1 *) dest; - v1_hdr->module_id = v3_hdr->module_id; - v1_hdr->param_id = v3_hdr->param_id; - - if (param_size > U16_MAX) { - pr_err("%s: Invalid param size for V1 %d\n", __func__, - param_size); - return -EINVAL; - } - v1_hdr->param_size = param_size; - v1_hdr->reserved = 0; - } - - /* - * Make param_data optional for cases when there is no data - * present as in some set cases and all get cases. - */ - if (param_data != NULL) { - memcpy(dest + packed_size, param_data, param_size); - packed_size += param_size; - } - - *total_size = packed_size; - - return 0; -} -EXPORT_SYMBOL(q6common_pack_pp_params); - -/** - * q6common_pack_pp_params_v2 - * - * Populate params header based on instance ID support and pack - * it with payload. - * Instance ID support - - * yes - param_hdr_v3 + payload - * no - param_hdr_v1 + payload - * - * @dest: destination data pointer to be packed into - * @v3_hdr: param header v3 - * @param_data: param payload - * @total_size: total size of packed data (hdr + payload) - * @iid_supported: Instance ID supported or not - * - * Returns 0 on success or error on failure - */ -int q6common_pack_pp_params_v2(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size, - bool iid_supported) -{ - struct param_hdr_v1 *v1_hdr = NULL; - u32 packed_size = 0; - u32 param_size = 0; - - if (dest == NULL) { - pr_err("%s: Received NULL pointer for destination\n", __func__); - return -EINVAL; - } else if (v3_hdr == NULL) { - pr_err("%s: Received NULL pointer for header\n", __func__); - return -EINVAL; - } else if (total_size == NULL) { - pr_err("%s: Received NULL pointer for total size\n", __func__); - return -EINVAL; - } - - param_size = v3_hdr->param_size; - packed_size = iid_supported ? sizeof(struct param_hdr_v3) : - sizeof(struct param_hdr_v1); - - if (iid_supported) { - memcpy(dest, v3_hdr, packed_size); - } else { - v1_hdr = (struct param_hdr_v1 *) dest; - v1_hdr->module_id = v3_hdr->module_id; - v1_hdr->param_id = v3_hdr->param_id; - - if (param_size > U16_MAX) { - pr_err("%s: Invalid param size for V1 %d\n", __func__, - param_size); - return -EINVAL; - } - v1_hdr->param_size = param_size; - v1_hdr->reserved = 0; - } - - /* - * Make param_data optional for cases when there is no data - * present as in some set cases and all get cases. - */ - if (param_data != NULL) { - memcpy(dest + packed_size, param_data, param_size); - packed_size += param_size; - } - - *total_size = packed_size; - - return 0; -} -EXPORT_SYMBOL(q6common_pack_pp_params_v2); diff --git a/techpack/audio/4.0/dsp/q6core.c b/techpack/audio/4.0/dsp/q6core.c deleted file mode 100644 index 7a6d16fdfcfe..000000000000 --- a/techpack/audio/4.0/dsp/q6core.c +++ /dev/null @@ -1,1948 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define TIMEOUT_MS 1000 -/* - * AVS bring up in the modem is optimized for the new - * Sub System Restart design and 100 milliseconds timeout - * is sufficient to make sure the Q6 will be ready. - */ -#define Q6_READY_TIMEOUT_MS 100 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 - -#define APR_ENOTREADY 10 -#define MEMPOOL_ID_MASK 0xFF -#define MDF_MAP_TOKEN 0xF000 - -enum { - META_CAL, - CUST_TOP_CAL, - CORE_MAX_CAL -}; - -enum ver_query_status { - VER_QUERY_UNATTEMPTED, - VER_QUERY_UNSUPPORTED, - VER_QUERY_SUPPORTED -}; - -struct q6core_avcs_ver_info { - enum ver_query_status status; - struct avcs_fwk_ver_info *ver_info; -}; - -struct q6core_str { - struct apr_svc *core_handle_q; - wait_queue_head_t bus_bw_req_wait; - wait_queue_head_t mdf_map_resp_wait; - wait_queue_head_t cmd_req_wait; - wait_queue_head_t avcs_fwk_ver_req_wait; - wait_queue_head_t lpass_npa_rsc_wait; - u32 lpass_npa_rsc_rsp_rcvd; - u32 bus_bw_resp_received; - u32 mdf_map_resp_received; - enum cmd_flags { - FLAG_NONE, - FLAG_CMDRSP_LICENSE_RESULT - } cmd_resp_received_flag; - u32 avcs_fwk_ver_resp_received; - struct mutex cmd_lock; - struct mutex ver_lock; - union { - struct avcs_cmdrsp_get_license_validation_result - cmdrsp_license_result; - } cmd_resp_payload; - u32 param; - struct cal_type_data *cal_data[CORE_MAX_CAL]; - uint32_t mem_map_cal_handle; - uint32_t mdf_mem_map_cal_handle; - uint32_t npa_client_handle; - int32_t adsp_status; - int32_t avs_state; - struct q6core_avcs_ver_info q6core_avcs_ver_info; -}; - -static struct q6core_str q6core_lcl; - -struct generic_get_data_ { - int valid; - int size_in_ints; - int ints[]; -}; -static struct generic_get_data_ *generic_get_data; - -static DEFINE_MUTEX(kset_lock); -static struct kset *audio_uevent_kset; - -static int q6core_init_uevent_kset(void) -{ - int ret = 0; - - mutex_lock(&kset_lock); - if (audio_uevent_kset) - goto done; - - /* Create a kset under /sys/kernel/ */ - audio_uevent_kset = kset_create_and_add("q6audio", NULL, kernel_kobj); - if (!audio_uevent_kset) { - pr_err("%s: error creating uevent kernel set", __func__); - ret = -EINVAL; - } -done: - mutex_unlock(&kset_lock); - return ret; -} - -static void q6core_destroy_uevent_kset(void) -{ - if (audio_uevent_kset) { - kset_unregister(audio_uevent_kset); - audio_uevent_kset = NULL; - } -} - -/** - * q6core_init_uevent_data - initialize kernel object required to send uevents. - * - * @uevent_data: uevent data (dynamically allocated memory). - * @name: name of the kernel object. - * - * Returns 0 on success or error otherwise. - */ -int q6core_init_uevent_data(struct audio_uevent_data *uevent_data, char *name) -{ - int ret = -EINVAL; - - if (!uevent_data || !name) - return ret; - - ret = q6core_init_uevent_kset(); - if (ret) - return ret; - - /* Set kset for kobject before initializing the kobject */ - uevent_data->kobj.kset = audio_uevent_kset; - - /* Initialize kobject and add it to kernel */ - ret = kobject_init_and_add(&uevent_data->kobj, &uevent_data->ktype, - NULL, "%s", name); - if (ret) { - pr_err("%s: error initializing uevent kernel object: %d", - __func__, ret); - kobject_put(&uevent_data->kobj); - return ret; - } - - /* Send kobject add event to the system */ - kobject_uevent(&uevent_data->kobj, KOBJ_ADD); - - return ret; -} -EXPORT_SYMBOL(q6core_init_uevent_data); - -/** - * q6core_destroy_uevent_data - destroy kernel object. - * - * @uevent_data: uevent data. - */ -void q6core_destroy_uevent_data(struct audio_uevent_data *uevent_data) -{ - if (uevent_data) - kobject_put(&uevent_data->kobj); -} -EXPORT_SYMBOL(q6core_destroy_uevent_data); - -/** - * q6core_send_uevent - send uevent to userspace. - * - * @uevent_data: uevent data. - * @event: event to send. - * - * Returns 0 on success or error otherwise. - */ -int q6core_send_uevent(struct audio_uevent_data *uevent_data, char *event) -{ - char *env[] = { event, NULL }; - - if (!event || !uevent_data) - return -EINVAL; - - return kobject_uevent_env(&uevent_data->kobj, KOBJ_CHANGE, env); -} -EXPORT_SYMBOL(q6core_send_uevent); - -static int parse_fwk_version_info(uint32_t *payload, uint16_t payload_size) -{ - size_t ver_size; - int num_services; - - pr_debug("%s: Payload info num services %d\n", - __func__, payload[4]); - - /* - * payload1[4] is the number of services running on DSP - * Based on this info, we copy the payload into core - * avcs version info structure. - */ - if (payload_size < 5 * sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, payload_size); - return -EINVAL; - } - num_services = payload[4]; - if (num_services > VSS_MAX_AVCS_NUM_SERVICES) { - pr_err("%s: num_services: %d greater than max services: %d\n", - __func__, num_services, VSS_MAX_AVCS_NUM_SERVICES); - return -EINVAL; - } - - /* - * Dynamically allocate memory for all - * the services based on num_services - */ - ver_size = sizeof(struct avcs_get_fwk_version) + - num_services * sizeof(struct avs_svc_api_info); - - if (payload_size < ver_size) { - pr_err("%s: payload has invalid size %d, expected size %zu\n", - __func__, payload_size, ver_size); - return -EINVAL; - } - - q6core_lcl.q6core_avcs_ver_info.ver_info = - kzalloc(ver_size, GFP_ATOMIC); - if (q6core_lcl.q6core_avcs_ver_info.ver_info == NULL) - return -ENOMEM; - - memcpy(q6core_lcl.q6core_avcs_ver_info.ver_info, (uint8_t *) payload, - ver_size); - return 0; -} - -static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv) -{ - uint32_t *payload1; - int ret = 0; - - if (data == NULL) { - pr_err("%s: data argument is null\n", __func__); - return -EINVAL; - } - - pr_debug("%s: core msg: payload len = %u, apr resp opcode = 0x%x\n", - __func__, - data->payload_size, data->opcode); - - switch (data->opcode) { - - case APR_BASIC_RSP_RESULT:{ - - if (data->payload_size == 0) { - pr_err("%s: APR_BASIC_RSP_RESULT No Payload ", - __func__); - return 0; - } - - payload1 = data->payload; - - if (data->payload_size < 2 * sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - - switch (payload1[0]) { - - case AVCS_CMD_SHARED_MEM_UNMAP_REGIONS: - pr_debug("%s: Cmd = AVCS_CMD_SHARED_MEM_UNMAP_REGIONS status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_SHARED_MEM_MAP_REGIONS: - pr_debug("%s: Cmd = AVCS_CMD_SHARED_MEM_MAP_REGIONS status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_MAP_MDF_SHARED_MEMORY: - pr_debug("%s: Cmd = AVCS_CMD_MAP_MDF_SHARED_MEMORY status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_REGISTER_TOPOLOGIES: - pr_debug("%s: Cmd = AVCS_CMD_REGISTER_TOPOLOGIES status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_DEREGISTER_TOPOLOGIES: - pr_debug("%s: Cmd = AVCS_CMD_DEREGISTER_TOPOLOGIES status[0x%x]\n", - __func__, payload1[1]); - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_GET_FWK_VERSION: - pr_debug("%s: Cmd = AVCS_CMD_GET_FWK_VERSION status[%s]\n", - __func__, adsp_err_get_err_str(payload1[1])); - /* ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - if (payload1[1] == ADSP_EUNSUPPORTED) - q6core_lcl.q6core_avcs_ver_info.status = - VER_QUERY_UNSUPPORTED; - q6core_lcl.avcs_fwk_ver_resp_received = 1; - wake_up(&q6core_lcl.avcs_fwk_ver_req_wait); - break; - case AVCS_CMD_LOAD_TOPO_MODULES: - case AVCS_CMD_UNLOAD_TOPO_MODULES: - pr_debug("%s: Cmd = %s status[%s]\n", - __func__, - (payload1[0] == AVCS_CMD_LOAD_TOPO_MODULES) ? - "AVCS_CMD_LOAD_TOPO_MODULES" : - "AVCS_CMD_UNLOAD_TOPO_MODULES", - adsp_err_get_err_str(payload1[1])); - break; - case AVCS_CMD_DESTROY_LPASS_NPA_CLIENT: - case AVCS_CMD_REQUEST_LPASS_NPA_RESOURCES: - pr_debug("%s: Cmd = AVCS_CMD_CREATE_LPASS_NPA_CLIENT/AVCS_CMD_DESTROY_LPASS_NPA_CLIENT status[%s]\n", - __func__, adsp_err_get_err_str(payload1[1])); - /* ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.lpass_npa_rsc_rsp_rcvd = 1; - wake_up(&q6core_lcl.lpass_npa_rsc_wait); - break; - default: - pr_err("%s: Invalid cmd rsp[0x%x][0x%x] opcode %d\n", - __func__, - payload1[0], payload1[1], data->opcode); - break; - } - break; - } - - case RESET_EVENTS:{ - pr_debug("%s: Reset event received in Core service\n", - __func__); - /* - * no reset for q6core_avcs_ver_info done as - * the data will not change after SSR - */ - apr_reset(q6core_lcl.core_handle_q); - q6core_lcl.core_handle_q = NULL; - break; - } - case AVCS_CMDRSP_SHARED_MEM_MAP_REGIONS: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - pr_debug("%s: AVCS_CMDRSP_SHARED_MEM_MAP_REGIONS handle %d\n", - __func__, payload1[0]); - if (data->token == MDF_MAP_TOKEN) { - q6core_lcl.mdf_mem_map_cal_handle = payload1[0]; - q6core_lcl.mdf_map_resp_received = 1; - wake_up(&q6core_lcl.mdf_map_resp_wait); - } else { - q6core_lcl.mem_map_cal_handle = payload1[0]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - } - break; - case AVCS_CMDRSP_CREATE_LPASS_NPA_CLIENT: - if (data->payload_size < 2 * sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - pr_debug("%s: AVCS_CMDRSP_CREATE_LPASS_NPA_CLIENT handle %d\n", - __func__, payload1[1]); - q6core_lcl.adsp_status = payload1[0]; - q6core_lcl.npa_client_handle = payload1[1]; - q6core_lcl.lpass_npa_rsc_rsp_rcvd = 1; - wake_up(&q6core_lcl.lpass_npa_rsc_wait); - break; - case AVCS_CMDRSP_ADSP_EVENT_GET_STATE: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - q6core_lcl.param = payload1[0]; - pr_debug("%s: Received ADSP get state response 0x%x\n", - __func__, q6core_lcl.param); - /* ensure .param is updated prior to .bus_bw_resp_received */ - wmb(); - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMDRSP_GET_LICENSE_VALIDATION_RESULT: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - pr_debug("%s: cmd = LICENSE_VALIDATION_RESULT, result = 0x%x\n", - __func__, payload1[0]); - q6core_lcl.cmd_resp_payload.cmdrsp_license_result.result - = payload1[0]; - q6core_lcl.cmd_resp_received_flag = FLAG_CMDRSP_LICENSE_RESULT; - wake_up(&q6core_lcl.cmd_req_wait); - break; - case AVCS_CMDRSP_GET_FWK_VERSION: - pr_debug("%s: Received AVCS_CMDRSP_GET_FWK_VERSION\n", - __func__); - payload1 = data->payload; - ret = parse_fwk_version_info(payload1, data->payload_size); - if (ret < 0) { - q6core_lcl.adsp_status = ret; - pr_err("%s: Failed to parse payload:%d\n", - __func__, ret); - } else { - q6core_lcl.q6core_avcs_ver_info.status = - VER_QUERY_SUPPORTED; - } - q6core_lcl.avcs_fwk_ver_resp_received = 1; - wake_up(&q6core_lcl.avcs_fwk_ver_req_wait); - break; - default: - pr_err("%s: Message id from adsp core svc: 0x%x\n", - __func__, data->opcode); - if (generic_get_data) { - generic_get_data->valid = 1; - generic_get_data->size_in_ints = - data->payload_size/sizeof(int); - pr_debug("callback size = %i\n", - data->payload_size); - memcpy(generic_get_data->ints, data->payload, - data->payload_size); - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - } - break; - } - - return 0; -} - -void ocm_core_open(void) -{ - if (q6core_lcl.core_handle_q == NULL) - q6core_lcl.core_handle_q = apr_register("ADSP", "CORE", - aprv2_core_fn_q, 0xFFFFFFFF, NULL); - pr_debug("%s: Open_q %pK\n", __func__, q6core_lcl.core_handle_q); - if (q6core_lcl.core_handle_q == NULL) - pr_err_ratelimited("%s: Unable to register CORE\n", __func__); -} - -struct cal_block_data *cal_utils_get_cal_block_by_key( - struct cal_type_data *cal_type, uint32_t key) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_metainfo *metainfo; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - metainfo = (struct audio_cal_info_metainfo *) - cal_block->cal_info; - if (metainfo->nKey != key) { - pr_debug("%s: metainfo key mismatch!!! found:%x, needed:%x\n", - __func__, metainfo->nKey, key); - } else { - pr_debug("%s: metainfo key match found", __func__); - return cal_block; - } - } - return NULL; -} - -static int q6core_send_get_avcs_fwk_ver_cmd(void) -{ - struct apr_hdr avcs_ver_cmd; - int ret; - - mutex_lock(&q6core_lcl.cmd_lock); - avcs_ver_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - avcs_ver_cmd.pkt_size = sizeof(struct apr_hdr); - avcs_ver_cmd.src_port = 0; - avcs_ver_cmd.dest_port = 0; - avcs_ver_cmd.token = 0; - avcs_ver_cmd.opcode = AVCS_CMD_GET_FWK_VERSION; - - q6core_lcl.adsp_status = 0; - q6core_lcl.avcs_fwk_ver_resp_received = 0; - - ret = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *) &avcs_ver_cmd); - if (ret < 0) { - pr_err("%s: failed to send apr packet, ret=%d\n", __func__, - ret); - goto done; - } - - ret = wait_event_timeout(q6core_lcl.avcs_fwk_ver_req_wait, - (q6core_lcl.avcs_fwk_ver_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for AVCS fwk version info\n", - __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (q6core_lcl.adsp_status < 0) { - /* - * adsp_err_get_err_str expects a positive value but we store - * the DSP error as negative to match the Linux error standard. - * Pass in the negated value so adsp_err_get_err_str returns - * the correct string. - */ - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(-q6core_lcl.adsp_status)); - ret = adsp_err_get_lnx_err_code(q6core_lcl.adsp_status); - goto done; - } - - ret = 0; - -done: - mutex_unlock(&q6core_lcl.cmd_lock); - return ret; -} - -int q6core_get_service_version(uint32_t service_id, - struct avcs_fwk_ver_info *ver_info, - size_t size) -{ - struct avcs_fwk_ver_info *cached_ver_info = NULL; - int i; - uint32_t num_services; - size_t ver_size; - int ret; - - if (ver_info == NULL) { - pr_err("%s: ver_info is NULL\n", __func__); - return -EINVAL; - } - - ret = q6core_get_fwk_version_size(service_id); - if (ret < 0) { - pr_err("%s: Failed to get service size for service id %d with error %d\n", - __func__, service_id, ret); - return ret; - } - - ver_size = ret; - if (ver_size != size) { - pr_err("%s: Expected size %zu and provided size %zu do not match\n", - __func__, ver_size, size); - return -EINVAL; - } - - cached_ver_info = q6core_lcl.q6core_avcs_ver_info.ver_info; - num_services = cached_ver_info->avcs_fwk_version.num_services; - - if (service_id == AVCS_SERVICE_ID_ALL) { - memcpy(ver_info, cached_ver_info, ver_size); - return 0; - } - - ver_info->avcs_fwk_version = cached_ver_info->avcs_fwk_version; - for (i = 0; i < num_services; i++) { - if (cached_ver_info->services[i].service_id == service_id) { - ver_info->services[0] = cached_ver_info->services[i]; - return 0; - } - } - pr_err("%s: No service matching service ID %d\n", __func__, service_id); - return -EINVAL; -} -EXPORT_SYMBOL(q6core_get_service_version); - -static int q6core_get_avcs_fwk_version(void) -{ - int ret = 0; - - mutex_lock(&(q6core_lcl.ver_lock)); - pr_debug("%s: q6core_avcs_ver_info.status(%d)\n", __func__, - q6core_lcl.q6core_avcs_ver_info.status); - - switch (q6core_lcl.q6core_avcs_ver_info.status) { - case VER_QUERY_SUPPORTED: - pr_debug("%s: AVCS FWK version query already attempted\n", - __func__); - break; - case VER_QUERY_UNSUPPORTED: - ret = -EOPNOTSUPP; - break; - case VER_QUERY_UNATTEMPTED: - pr_debug("%s: Attempting AVCS FWK version query\n", __func__); - if (q6core_is_adsp_ready()) { - ret = q6core_send_get_avcs_fwk_ver_cmd(); - } else { - pr_err("%s: ADSP is not ready to query version\n", - __func__); - ret = -ENODEV; - } - break; - default: - pr_err("%s: Invalid version query status %d\n", __func__, - q6core_lcl.q6core_avcs_ver_info.status); - ret = -EINVAL; - break; - } - mutex_unlock(&(q6core_lcl.ver_lock)); - return ret; -} - -size_t q6core_get_fwk_version_size(uint32_t service_id) -{ - int ret = 0; - uint32_t num_services; - - ret = q6core_get_avcs_fwk_version(); - if (ret) - goto done; - - if (q6core_lcl.q6core_avcs_ver_info.ver_info != NULL) { - num_services = q6core_lcl.q6core_avcs_ver_info.ver_info - ->avcs_fwk_version.num_services; - } else { - pr_err("%s: ver_info is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = sizeof(struct avcs_get_fwk_version); - if (service_id == AVCS_SERVICE_ID_ALL) - ret += num_services * sizeof(struct avs_svc_api_info); - else - ret += sizeof(struct avs_svc_api_info); -done: - return ret; -} -EXPORT_SYMBOL(q6core_get_fwk_version_size); - -/** - * q6core_get_avcs_version_per_service - - * to get api version of a particular service - * - * @service_id: id of the service - * - * Returns valid version on success or error (negative value) on failure - */ -int q6core_get_avcs_api_version_per_service(uint32_t service_id) -{ - struct avcs_fwk_ver_info *cached_ver_info = NULL; - int i; - uint32_t num_services; - int ret = 0; - - if (service_id == AVCS_SERVICE_ID_ALL) - return -EINVAL; - - ret = q6core_get_avcs_fwk_version(); - if (ret < 0) { - pr_err("%s: failure in getting AVCS version\n", __func__); - return ret; - } - - cached_ver_info = q6core_lcl.q6core_avcs_ver_info.ver_info; - num_services = cached_ver_info->avcs_fwk_version.num_services; - - for (i = 0; i < num_services; i++) { - if (cached_ver_info->services[i].service_id == service_id) - return cached_ver_info->services[i].api_version; - } - pr_err("%s: No service matching service ID %d\n", __func__, service_id); - return -EINVAL; -} -EXPORT_SYMBOL(q6core_get_avcs_api_version_per_service); - -/** - * core_set_license - - * command to set license for module - * - * @key: license key hash - * @module_id: DSP Module ID - * - * Returns 0 on success or error on failure - */ -int32_t core_set_license(uint32_t key, uint32_t module_id) -{ - struct avcs_cmd_set_license *cmd_setl = NULL; - struct cal_block_data *cal_block = NULL; - int rc = 0, packet_size = 0; - - pr_debug("%s: key:0x%x, id:0x%x\n", __func__, key, module_id); - - mutex_lock(&(q6core_lcl.cmd_lock)); - if (q6core_lcl.cal_data[META_CAL] == NULL) { - pr_err("%s: cal_data not initialized yet!!\n", __func__); - rc = -EINVAL; - goto cmd_unlock; - } - - mutex_lock(&((q6core_lcl.cal_data[META_CAL])->lock)); - cal_block = cal_utils_get_cal_block_by_key( - q6core_lcl.cal_data[META_CAL], key); - if (cal_block == NULL || - cal_block->cal_data.kvaddr == NULL || - cal_block->cal_data.size <= 0) { - pr_err("%s: Invalid cal block to send", __func__); - rc = -EINVAL; - goto cal_data_unlock; - } - - packet_size = sizeof(struct avcs_cmd_set_license) + - cal_block->cal_data.size; - /*round up total packet_size to next 4 byte boundary*/ - packet_size = ((packet_size + 0x3)>>2)<<2; - - cmd_setl = kzalloc(packet_size, GFP_KERNEL); - if (cmd_setl == NULL) { - rc = -ENOMEM; - goto cal_data_unlock; - } - - ocm_core_open(); - if (q6core_lcl.core_handle_q == NULL) { - pr_err("%s: apr registration for CORE failed\n", __func__); - rc = -ENODEV; - goto fail_cmd; - } - - cmd_setl->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cmd_setl->hdr.pkt_size = packet_size; - cmd_setl->hdr.src_port = 0; - cmd_setl->hdr.dest_port = 0; - cmd_setl->hdr.token = 0; - cmd_setl->hdr.opcode = AVCS_CMD_SET_LICENSE; - cmd_setl->id = module_id; - cmd_setl->overwrite = 1; - cmd_setl->size = cal_block->cal_data.size; - memcpy((uint8_t *)cmd_setl + sizeof(struct avcs_cmd_set_license), - cal_block->cal_data.kvaddr, - cal_block->cal_data.size); - pr_info("%s: Set license opcode=0x%x, id =0x%x, size = %d\n", - __func__, cmd_setl->hdr.opcode, - cmd_setl->id, cmd_setl->size); - rc = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *)cmd_setl); - if (rc < 0) - pr_err("%s: SET_LICENSE failed op[0x%x]rc[%d]\n", - __func__, cmd_setl->hdr.opcode, rc); - -fail_cmd: - kfree(cmd_setl); -cal_data_unlock: - mutex_unlock(&((q6core_lcl.cal_data[META_CAL])->lock)); -cmd_unlock: - mutex_unlock(&(q6core_lcl.cmd_lock)); - - return rc; -} -EXPORT_SYMBOL(core_set_license); - -/** - * core_get_license_status - - * command to retrieve license status for module - * - * @module_id: DSP Module ID - * - * Returns 0 on success or error on failure - */ -int32_t core_get_license_status(uint32_t module_id) -{ - struct avcs_cmd_get_license_validation_result get_lvr_cmd; - int ret = 0; - - pr_debug("%s: module_id 0x%x", __func__, module_id); - - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q == NULL) { - pr_err("%s: apr registration for CORE failed\n", __func__); - ret = -ENODEV; - goto fail_cmd; - } - - get_lvr_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - get_lvr_cmd.hdr.pkt_size = - sizeof(struct avcs_cmd_get_license_validation_result); - - get_lvr_cmd.hdr.src_port = 0; - get_lvr_cmd.hdr.dest_port = 0; - get_lvr_cmd.hdr.token = 0; - get_lvr_cmd.hdr.opcode = AVCS_CMD_GET_LICENSE_VALIDATION_RESULT; - get_lvr_cmd.id = module_id; - - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) &get_lvr_cmd); - if (ret < 0) { - pr_err("%s: license_validation request failed, err %d\n", - __func__, ret); - ret = -EREMOTE; - goto fail_cmd; - } - - q6core_lcl.cmd_resp_received_flag &= ~(FLAG_CMDRSP_LICENSE_RESULT); - mutex_unlock(&(q6core_lcl.cmd_lock)); - ret = wait_event_timeout(q6core_lcl.cmd_req_wait, - (q6core_lcl.cmd_resp_received_flag == - FLAG_CMDRSP_LICENSE_RESULT), - msecs_to_jiffies(TIMEOUT_MS)); - mutex_lock(&(q6core_lcl.cmd_lock)); - if (!ret) { - pr_err("%s: wait_event timeout for CMDRSP_LICENSE_RESULT\n", - __func__); - ret = -ETIME; - goto fail_cmd; - } - q6core_lcl.cmd_resp_received_flag &= ~(FLAG_CMDRSP_LICENSE_RESULT); - ret = q6core_lcl.cmd_resp_payload.cmdrsp_license_result.result; - -fail_cmd: - mutex_unlock(&(q6core_lcl.cmd_lock)); - pr_info("%s: cmdrsp_license_result.result = 0x%x for module 0x%x\n", - __func__, ret, module_id); - return ret; -} -EXPORT_SYMBOL(core_get_license_status); - -/** - * core_set_dolby_manufacturer_id - - * command to set dolby manufacturer id - * - * @manufacturer_id: Dolby manufacturer id - * - * Returns 0 on success or error on failure - */ -uint32_t core_set_dolby_manufacturer_id(int manufacturer_id) -{ - struct adsp_dolby_manufacturer_id payload; - int rc = 0; - - pr_debug("%s: manufacturer_id :%d\n", __func__, manufacturer_id); - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - payload.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - payload.hdr.pkt_size = - sizeof(struct adsp_dolby_manufacturer_id); - payload.hdr.src_port = 0; - payload.hdr.dest_port = 0; - payload.hdr.token = 0; - payload.hdr.opcode = ADSP_CMD_SET_DOLBY_MANUFACTURER_ID; - payload.manufacturer_id = manufacturer_id; - pr_debug("%s: Send Dolby security opcode=0x%x manufacturer ID = %d\n", - __func__, - payload.hdr.opcode, payload.manufacturer_id); - rc = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *)&payload); - if (rc < 0) - pr_err("%s: SET_DOLBY_MANUFACTURER_ID failed op[0x%x]rc[%d]\n", - __func__, payload.hdr.opcode, rc); - } - mutex_unlock(&(q6core_lcl.cmd_lock)); - return rc; -} -EXPORT_SYMBOL(core_set_dolby_manufacturer_id); - -int32_t q6core_load_unload_topo_modules(uint32_t topo_id, - bool preload_type) -{ - struct avcs_cmd_load_unload_topo_modules load_unload_topo_modules; - int ret = 0; - - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q == NULL) { - pr_err("%s: apr registration for CORE failed\n", __func__); - ret = -ENODEV; - goto done; - } - - memset(&load_unload_topo_modules, 0, sizeof(load_unload_topo_modules)); - load_unload_topo_modules.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - load_unload_topo_modules.hdr.pkt_size = - sizeof(struct avcs_cmd_load_unload_topo_modules); - load_unload_topo_modules.hdr.src_port = 0; - load_unload_topo_modules.hdr.dest_port = 0; - load_unload_topo_modules.hdr.token = 0; - - if (preload_type == CORE_LOAD_TOPOLOGY) - load_unload_topo_modules.hdr.opcode = - AVCS_CMD_LOAD_TOPO_MODULES; - else - load_unload_topo_modules.hdr.opcode = - AVCS_CMD_UNLOAD_TOPO_MODULES; - - load_unload_topo_modules.topology_id = topo_id; - ret = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *) &load_unload_topo_modules); - if (ret < 0) { - pr_err("%s: Load/unload topo modules failed for topology = %d ret = %d\n", - __func__, topo_id, ret); - ret = -EINVAL; - } - -done: - mutex_unlock(&(q6core_lcl.cmd_lock)); - - return ret; -} -EXPORT_SYMBOL(q6core_load_unload_topo_modules); - -/** - * q6core_is_adsp_ready - check adsp ready status - * - * Returns true if adsp is ready otherwise returns false - */ -bool q6core_is_adsp_ready(void) -{ - int rc = 0; - bool ret = false; - struct apr_hdr hdr; - - pr_debug("%s: enter\n", __func__); - memset(&hdr, 0, sizeof(hdr)); - hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, 0); - hdr.opcode = AVCS_CMD_ADSP_EVENT_GET_STATE; - - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - q6core_lcl.bus_bw_resp_received = 0; - rc = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *)&hdr); - if (rc < 0) { - pr_err_ratelimited("%s: Get ADSP state APR packet send event %d\n", - __func__, rc); - goto bail; - } - - rc = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(Q6_READY_TIMEOUT_MS)); - if (rc > 0 && q6core_lcl.bus_bw_resp_received) { - /* ensure to read updated param by callback thread */ - rmb(); - ret = !!q6core_lcl.param; - } - } -bail: - pr_debug("%s: leave, rc %d, adsp ready %d\n", __func__, rc, ret); - mutex_unlock(&(q6core_lcl.cmd_lock)); - return ret; -} -EXPORT_SYMBOL(q6core_is_adsp_ready); - -int q6core_create_lpass_npa_client(uint32_t node_id, char *client_name, - uint32_t *client_handle) -{ - struct avcs_cmd_create_lpass_npa_client_t create_lpass_npa_client; - struct avcs_cmd_create_lpass_npa_client_t *cmd_ptr = - &create_lpass_npa_client; - int ret = 0; - - if (!client_name) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - mutex_lock(&(q6core_lcl.cmd_lock)); - - memset(cmd_ptr, 0, sizeof(create_lpass_npa_client)); - - cmd_ptr->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cmd_ptr->hdr.pkt_size = sizeof(create_lpass_npa_client); - cmd_ptr->hdr.src_port = 0; - cmd_ptr->hdr.dest_port = 0; - cmd_ptr->hdr.token = 0; - cmd_ptr->hdr.opcode = AVCS_CMD_CREATE_LPASS_NPA_CLIENT; - cmd_ptr->node_id = AVCS_SLEEP_ISLAND_CORE_DRIVER_NODE_ID; - strlcpy(cmd_ptr->client_name, client_name, - sizeof(cmd_ptr->client_name)); - - pr_debug("%s: create lpass npa client opcode[0x%x] node id[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->node_id); - - *client_handle = 0; - q6core_lcl.adsp_status = 0; - q6core_lcl.lpass_npa_rsc_rsp_rcvd = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) cmd_ptr); - if (ret < 0) { - pr_err("%s: create lpass npa client failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.lpass_npa_rsc_wait, - (q6core_lcl.lpass_npa_rsc_rsp_rcvd == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for create lpass npa rsc client\n", - __func__); - ret = -ETIMEDOUT; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } - - *client_handle = q6core_lcl.npa_client_handle; - pr_debug("%s: q6core_lcl.npa_client_handle %d\n", __func__, - q6core_lcl.npa_client_handle); -done: - mutex_unlock(&q6core_lcl.cmd_lock); - return ret; -} -EXPORT_SYMBOL(q6core_create_lpass_npa_client); - -int q6core_destroy_lpass_npa_client(uint32_t client_handle) -{ - struct avcs_cmd_destroy_lpass_npa_client_t destroy_lpass_npa_client; - struct avcs_cmd_destroy_lpass_npa_client_t *cmd_ptr = - &destroy_lpass_npa_client; - int ret = 0; - - mutex_lock(&(q6core_lcl.cmd_lock)); - - memset(cmd_ptr, 0, sizeof(destroy_lpass_npa_client)); - - cmd_ptr->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cmd_ptr->hdr.pkt_size = sizeof(destroy_lpass_npa_client); - cmd_ptr->hdr.src_port = 0; - cmd_ptr->hdr.dest_port = 0; - cmd_ptr->hdr.token = 0; - cmd_ptr->hdr.opcode = AVCS_CMD_DESTROY_LPASS_NPA_CLIENT; - cmd_ptr->client_handle = client_handle; - - pr_debug("%s: dstry lpass npa client opcode[0x%x] client hdl[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->client_handle); - - q6core_lcl.adsp_status = 0; - q6core_lcl.lpass_npa_rsc_rsp_rcvd = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) cmd_ptr); - if (ret < 0) { - pr_err("%s: destroy lpass npa client failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.lpass_npa_rsc_wait, - (q6core_lcl.lpass_npa_rsc_rsp_rcvd == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for destroy lpass npa rsc client\n", - __func__); - ret = -ETIMEDOUT; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - } -done: - mutex_unlock(&q6core_lcl.cmd_lock); - return ret; -} -EXPORT_SYMBOL(q6core_destroy_lpass_npa_client); - -int q6core_request_island_transition(uint32_t client_handle, - uint32_t island_allow_mode) -{ - struct avcs_sleep_node_island_transition_config_t island_tsn_cfg; - struct avcs_sleep_node_island_transition_config_t *cmd_ptr = - &island_tsn_cfg; - int ret = 0; - - mutex_lock(&(q6core_lcl.cmd_lock)); - - memset(cmd_ptr, 0, sizeof(island_tsn_cfg)); - - cmd_ptr->req_lpass_npa_rsc.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cmd_ptr->req_lpass_npa_rsc.hdr.pkt_size = sizeof(island_tsn_cfg); - cmd_ptr->req_lpass_npa_rsc.hdr.src_port = 0; - cmd_ptr->req_lpass_npa_rsc.hdr.dest_port = 0; - cmd_ptr->req_lpass_npa_rsc.hdr.token = 0; - cmd_ptr->req_lpass_npa_rsc.hdr.opcode = - AVCS_CMD_REQUEST_LPASS_NPA_RESOURCES; - cmd_ptr->req_lpass_npa_rsc.client_handle = client_handle; - cmd_ptr->req_lpass_npa_rsc.resource_id = - AVCS_SLEEP_NODE_ISLAND_TRANSITION_RESOURCE_ID; - cmd_ptr->island_allow_mode = island_allow_mode; - - pr_debug("%s: req islnd tnsn opcode[0x%x] island_allow_mode[0x%x]\n", - __func__, cmd_ptr->req_lpass_npa_rsc.hdr.opcode, - cmd_ptr->island_allow_mode); - - q6core_lcl.adsp_status = 0; - q6core_lcl.lpass_npa_rsc_rsp_rcvd = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) cmd_ptr); - if (ret < 0) { - pr_err("%s: island tnsn cmd send failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.lpass_npa_rsc_wait, - (q6core_lcl.lpass_npa_rsc_rsp_rcvd == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for island lpass npa rsc req\n", - __func__); - ret = -ETIMEDOUT; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - } -done: - mutex_unlock(&q6core_lcl.cmd_lock); - return ret; -} -EXPORT_SYMBOL(q6core_request_island_transition); - -int q6core_map_memory_regions(phys_addr_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt, uint32_t *map_handle) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int ret = 0; - int i = 0; - int cmd_size = 0; - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + sizeof(struct avs_shared_map_region_payload) - * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_shared_mem_map_regions *)mmap_region_cmd; - mmap_regions->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mmap_regions->hdr.pkt_size = cmd_size; - mmap_regions->hdr.src_port = 0; - mmap_regions->hdr.dest_port = 0; - mmap_regions->hdr.token = 0; - mmap_regions->hdr.opcode = AVCS_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = mempool_id & 0x00ff; - mmap_regions->num_regions = bufcnt & 0x00ff; - mmap_regions->property_flag = 0x00; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - for (i = 0; i < bufcnt; i++) { - mregions->shm_addr_lsw = lower_32_bits(buf_add[i]); - mregions->shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_add[i]); - mregions->mem_size_bytes = bufsz[i]; - ++mregions; - } - - pr_debug("%s: sending memory map, addr %pK, size %d, bufcnt = %d\n", - __func__, buf_add, bufsz[0], mmap_regions->num_regions); - - *map_handle = 0; - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) - mmap_regions); - if (ret < 0) { - pr_err("%s: mmap regions failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory map\n", __func__); - ret = -ETIME; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } - - *map_handle = q6core_lcl.mem_map_cal_handle; -done: - kfree(mmap_region_cmd); - return ret; -} - -/** - * q6core_map_mdf_memory_regions - for sending MDF shared memory map information - * to ADSP. - * - * @buf_add: array of buffers. - * @mempool_id: memory pool ID - * @bufsz: size of the buffer - * @bufcnt: buffers count - * @map_handle: map handle received from ADSP - */ -int q6core_map_mdf_memory_regions(uint64_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt, uint32_t *map_handle) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int ret = 0; - int i = 0; - int cmd_size = 0; - - mutex_lock(&q6core_lcl.cmd_lock); - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + sizeof(struct avs_shared_map_region_payload) - * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_shared_mem_map_regions *)mmap_region_cmd; - mmap_regions->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mmap_regions->hdr.pkt_size = cmd_size; - mmap_regions->hdr.src_port = 0; - mmap_regions->hdr.dest_port = 0; - mmap_regions->hdr.token = MDF_MAP_TOKEN; - mmap_regions->hdr.opcode = AVCS_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = mempool_id & MEMPOOL_ID_MASK; - mmap_regions->num_regions = bufcnt & 0x00ff; - mmap_regions->property_flag = 0x00; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - for (i = 0; i < bufcnt; i++) { - mregions->shm_addr_lsw = lower_32_bits(buf_add[i]); - mregions->shm_addr_msw = upper_32_bits(buf_add[i]); - mregions->mem_size_bytes = bufsz[i]; - ++mregions; - } - - pr_debug("%s: sending MDF memory map, addr %pK, size %d, bufcnt = %d\n", - __func__, buf_add, bufsz[0], mmap_regions->num_regions); - - *map_handle = 0; - q6core_lcl.adsp_status = 0; - q6core_lcl.mdf_map_resp_received = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) - mmap_regions); - if (ret < 0) { - pr_err("%s: mmap regions failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.mdf_map_resp_wait, - (q6core_lcl.mdf_map_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory map\n", __func__); - ret = -ETIMEDOUT; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } - - *map_handle = q6core_lcl.mdf_mem_map_cal_handle; -done: - kfree(mmap_region_cmd); - mutex_unlock(&q6core_lcl.cmd_lock); - return ret; -} -EXPORT_SYMBOL(q6core_map_mdf_memory_regions); - -int q6core_memory_unmap_regions(uint32_t mem_map_handle) -{ - struct avs_cmd_shared_mem_unmap_regions unmap_regions; - int ret = 0; - - memset(&unmap_regions, 0, sizeof(unmap_regions)); - unmap_regions.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - unmap_regions.hdr.pkt_size = sizeof(unmap_regions); - unmap_regions.hdr.src_svc = APR_SVC_ADSP_CORE; - unmap_regions.hdr.src_domain = APR_DOMAIN_APPS; - unmap_regions.hdr.src_port = 0; - unmap_regions.hdr.dest_svc = APR_SVC_ADSP_CORE; - unmap_regions.hdr.dest_domain = APR_DOMAIN_ADSP; - unmap_regions.hdr.dest_port = 0; - unmap_regions.hdr.token = 0; - unmap_regions.hdr.opcode = AVCS_CMD_SHARED_MEM_UNMAP_REGIONS; - unmap_regions.mem_map_handle = mem_map_handle; - - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - - pr_debug("%s: unmap regions map handle %d\n", - __func__, mem_map_handle); - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) - &unmap_regions); - if (ret < 0) { - pr_err("%s: unmap regions failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory_unmap\n", - __func__); - ret = -ETIME; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } -done: - return ret; -} - - -int q6core_map_mdf_shared_memory(uint32_t map_handle, uint64_t *buf_add, - uint32_t proc_id, uint32_t *bufsz, uint32_t bufcnt) -{ - struct avs_cmd_map_mdf_shared_memory *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int ret = 0; - int i = 0; - int cmd_size = 0; - - mutex_lock(&q6core_lcl.cmd_lock); - cmd_size = sizeof(struct avs_cmd_map_mdf_shared_memory) - + sizeof(struct avs_shared_map_region_payload) - * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) { - mutex_unlock(&q6core_lcl.cmd_lock); - return -ENOMEM; - } - mmap_regions = (struct avs_cmd_map_mdf_shared_memory *)mmap_region_cmd; - mmap_regions->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mmap_regions->hdr.pkt_size = cmd_size; - mmap_regions->hdr.src_port = 0; - mmap_regions->hdr.dest_port = 0; - mmap_regions->hdr.token = 0; - mmap_regions->hdr.opcode = AVCS_CMD_MAP_MDF_SHARED_MEMORY; - mmap_regions->mem_map_handle = map_handle; - mmap_regions->proc_id = proc_id & 0x00ff; - mmap_regions->num_regions = bufcnt & 0x00ff; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_map_mdf_shared_memory)); - mregions = (struct avs_shared_map_region_payload *)payload; - - for (i = 0; i < bufcnt; i++) { - mregions->shm_addr_lsw = lower_32_bits(buf_add[i]); - mregions->shm_addr_msw = upper_32_bits(buf_add[i]); - mregions->mem_size_bytes = bufsz[i]; - ++mregions; - } - - pr_debug("%s: sending mdf memory map, addr %pa, size %d, bufcnt = %d\n", - __func__, buf_add, bufsz[0], mmap_regions->num_regions); - - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) - mmap_regions); - if (ret < 0) { - pr_err("%s: mdf memory map failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for mdf memory map\n", - __func__); - ret = -ETIME; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - /* - * When the remote DSP is not ready, the ADSP will validate and store - * the memory information and return APR_ENOTREADY to HLOS. The ADSP - * will map the memory with remote DSP when it is ready. HLOS should - * not treat APR_ENOTREADY as an error. - */ - if (q6core_lcl.adsp_status != -APR_ENOTREADY) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } - -done: - kfree(mmap_region_cmd); - mutex_unlock(&q6core_lcl.cmd_lock); - return ret; -} - -static int q6core_dereg_all_custom_topologies(void) -{ - int ret = 0; - struct avcs_cmd_deregister_topologies dereg_top; - - memset(&dereg_top, 0, sizeof(dereg_top)); - dereg_top.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - dereg_top.hdr.pkt_size = sizeof(dereg_top); - dereg_top.hdr.src_svc = APR_SVC_ADSP_CORE; - dereg_top.hdr.src_domain = APR_DOMAIN_APPS; - dereg_top.hdr.src_port = 0; - dereg_top.hdr.dest_svc = APR_SVC_ADSP_CORE; - dereg_top.hdr.dest_domain = APR_DOMAIN_ADSP; - dereg_top.hdr.dest_port = 0; - dereg_top.hdr.token = 0; - dereg_top.hdr.opcode = AVCS_CMD_DEREGISTER_TOPOLOGIES; - dereg_top.payload_addr_lsw = 0; - dereg_top.payload_addr_msw = 0; - dereg_top.mem_map_handle = 0; - dereg_top.payload_size = 0; - dereg_top.mode = AVCS_MODE_DEREGISTER_ALL_CUSTOM_TOPOLOGIES; - - q6core_lcl.bus_bw_resp_received = 0; - - pr_debug("%s: Deregister topologies mode %d\n", - __func__, dereg_top.mode); - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) &dereg_top); - if (ret < 0) { - pr_err("%s: Deregister topologies failed %d\n", - __func__, ret); - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for Deregister topologies\n", - __func__); - goto done; - } -done: - return ret; -} - -static int q6core_send_custom_topologies(void) -{ - int ret = 0; - int ret2 = 0; - struct cal_block_data *cal_block = NULL; - struct avcs_cmd_register_topologies reg_top; - - if (!q6core_is_adsp_ready()) { - pr_err("%s: ADSP is not ready!\n", __func__); - return -ENODEV; - } - - memset(®_top, 0, sizeof(reg_top)); - mutex_lock(&q6core_lcl.cal_data[CUST_TOP_CAL]->lock); - mutex_lock(&q6core_lcl.cmd_lock); - - cal_block = cal_utils_get_only_cal_block( - q6core_lcl.cal_data[CUST_TOP_CAL]); - if (cal_block == NULL) { - pr_debug("%s: cal block is NULL!\n", __func__); - goto unlock; - } - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: cal size is %zd not sending\n", - __func__, cal_block->cal_data.size); - goto unlock; - } - - q6core_dereg_all_custom_topologies(); - - ret = q6core_map_memory_regions(&cal_block->cal_data.paddr, - ADSP_MEMORY_MAP_SHMEM8_4K_POOL, - (uint32_t *)&cal_block->map_data.map_size, 1, - &cal_block->map_data.q6map_handle); - if (ret) { - pr_err("%s: q6core_map_memory_regions failed\n", __func__); - goto unlock; - } - - reg_top.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - reg_top.hdr.pkt_size = sizeof(reg_top); - reg_top.hdr.src_svc = APR_SVC_ADSP_CORE; - reg_top.hdr.src_domain = APR_DOMAIN_APPS; - reg_top.hdr.src_port = 0; - reg_top.hdr.dest_svc = APR_SVC_ADSP_CORE; - reg_top.hdr.dest_domain = APR_DOMAIN_ADSP; - reg_top.hdr.dest_port = 0; - reg_top.hdr.token = 0; - reg_top.hdr.opcode = AVCS_CMD_REGISTER_TOPOLOGIES; - reg_top.payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - reg_top.payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - reg_top.mem_map_handle = cal_block->map_data.q6map_handle; - reg_top.payload_size = cal_block->cal_data.size; - - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - - pr_debug("%s: Register topologies addr %pK, size %zd, map handle %d\n", - __func__, &cal_block->cal_data.paddr, cal_block->cal_data.size, - cal_block->map_data.q6map_handle); - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) ®_top); - if (ret < 0) { - pr_err("%s: Register topologies failed %d\n", - __func__, ret); - goto unmap; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for Register topologies\n", - __func__); - goto unmap; - } - - if (q6core_lcl.adsp_status < 0) - ret = q6core_lcl.adsp_status; -unmap: - ret2 = q6core_memory_unmap_regions(cal_block->map_data.q6map_handle); - if (ret2) { - pr_err("%s: q6core_memory_unmap_regions failed for map handle %d\n", - __func__, cal_block->map_data.q6map_handle); - ret = ret2; - goto unlock; - } - -unlock: - mutex_unlock(&q6core_lcl.cmd_lock); - mutex_unlock(&q6core_lcl.cal_data[CUST_TOP_CAL]->lock); - - return ret; -} - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case AUDIO_CORE_METAINFO_CAL_TYPE: - ret = META_CAL; - break; - case CORE_CUSTOM_TOPOLOGIES_CAL_TYPE: - ret = CUST_TOP_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int q6core_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - - ret = cal_utils_alloc_cal(data_size, data, - q6core_lcl.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - goto done; - } -done: - return ret; -} - -static int q6core_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - - ret = cal_utils_dealloc_cal(data_size, data, - q6core_lcl.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - goto done; - } -done: - return ret; -} - -static int q6core_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - - ret = cal_utils_set_cal(data_size, data, - q6core_lcl.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - goto done; - } - - if (cal_index == CUST_TOP_CAL) - ret = q6core_send_custom_topologies(); -done: - return ret; -} - -static void q6core_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(CORE_MAX_CAL, q6core_lcl.cal_data); -} - - -static int q6core_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{AUDIO_CORE_METAINFO_CAL_TYPE, - {q6core_alloc_cal, q6core_dealloc_cal, NULL, - q6core_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CORE_CUSTOM_TOPOLOGIES_CAL_TYPE, - {q6core_alloc_cal, q6core_dealloc_cal, NULL, - q6core_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} } - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(CORE_MAX_CAL, - q6core_lcl.cal_data, cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type!\n", - __func__); - goto err; - } - - return ret; -err: - q6core_delete_cal_data(); - return ret; -} - -static int q6core_is_avs_up(int32_t *avs_state) -{ - unsigned long timeout; - int32_t adsp_ready = 0; - int ret = 0; - - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - - /* sleep for 100ms before querying AVS up */ - msleep(100); - do { - adsp_ready = q6core_is_adsp_ready(); - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - if (adsp_ready) - break; - - /* - * ADSP will be coming up after boot up and AVS might - * not be fully up when the control reaches here. - * So, wait for 50msec before checking ADSP state again. - */ - msleep(50); - } while (time_after(timeout, jiffies)); - - *avs_state = adsp_ready; - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - - if (!adsp_ready) { - pr_err_ratelimited("%s: Timeout. ADSP Audio is not ready\n", - __func__); - ret = -ETIMEDOUT; - } - - return ret; -} - -static int q6core_ssr_enable(struct device *dev, void *data) -{ - int32_t avs_state = 0; - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - if (!q6core_lcl.avs_state) { - ret = q6core_is_avs_up(&avs_state); - if (ret < 0) - goto err; - q6core_lcl.avs_state = avs_state; - } - -err: - return ret; -} - -static void q6core_ssr_disable(struct device *dev, void *data) -{ - /* Reset AVS state to 0 */ - q6core_lcl.avs_state = 0; -} - -static const struct snd_event_ops q6core_ssr_ops = { - .enable = q6core_ssr_enable, - .disable = q6core_ssr_disable, -}; - -static int q6core_probe(struct platform_device *pdev) -{ - int32_t avs_state = 0; - int rc = 0; - - rc = q6core_is_avs_up(&avs_state); - if (rc < 0) - goto err; - q6core_lcl.avs_state = avs_state; - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - rc = -EINVAL; - goto err; - } - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - - rc = snd_event_client_register(&pdev->dev, &q6core_ssr_ops, NULL); - if (!rc) { - snd_event_notify(&pdev->dev, SND_EVENT_UP); - } else { - dev_err(&pdev->dev, - "%s: Registration with SND event fwk failed rc = %d\n", - __func__, rc); - rc = 0; - } - -err: - return rc; -} - -static int q6core_remove(struct platform_device *pdev) -{ - snd_event_client_deregister(&pdev->dev); - of_platform_depopulate(&pdev->dev); - return 0; -} - -static const struct of_device_id q6core_of_match[] = { - { .compatible = "qcom,q6core-audio", }, - {}, -}; - -static struct platform_driver q6core_driver = { - .probe = q6core_probe, - .remove = q6core_remove, - .driver = { - .name = "q6core_audio", - .owner = THIS_MODULE, - .of_match_table = q6core_of_match, - .suppress_bind_attrs = true, - } -}; - -int __init core_init(void) -{ - memset(&q6core_lcl, 0, sizeof(struct q6core_str)); - init_waitqueue_head(&q6core_lcl.bus_bw_req_wait); - init_waitqueue_head(&q6core_lcl.cmd_req_wait); - init_waitqueue_head(&q6core_lcl.avcs_fwk_ver_req_wait); - init_waitqueue_head(&q6core_lcl.mdf_map_resp_wait); - init_waitqueue_head(&q6core_lcl.lpass_npa_rsc_wait); - q6core_lcl.cmd_resp_received_flag = FLAG_NONE; - mutex_init(&q6core_lcl.cmd_lock); - mutex_init(&q6core_lcl.ver_lock); - - q6core_init_cal_data(); - q6core_init_uevent_kset(); - - return platform_driver_register(&q6core_driver); -} - -void core_exit(void) -{ - mutex_destroy(&q6core_lcl.cmd_lock); - mutex_destroy(&q6core_lcl.ver_lock); - q6core_delete_cal_data(); - q6core_destroy_uevent_kset(); - platform_driver_unregister(&q6core_driver); -} -MODULE_DESCRIPTION("ADSP core driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/q6lsm.c b/techpack/audio/4.0/dsp/q6lsm.c deleted file mode 100644 index 8ad6ed624002..000000000000 --- a/techpack/audio/4.0/dsp/q6lsm.c +++ /dev/null @@ -1,2804 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2019, Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define APR_TIMEOUT (HZ) -#define LSM_ALIGN_BOUNDARY 512 -#define LSM_SAMPLE_RATE 16000 -#define QLSM_PARAM_ID_MINOR_VERSION 1 -#define QLSM_PARAM_ID_MINOR_VERSION_2 2 - -static int lsm_afe_port; - -enum { - LSM_CUSTOM_TOP_IDX, - LSM_TOP_IDX, - LSM_CAL_IDX, - LSM_MAX_CAL_IDX -}; - -enum { - CMD_STATE_CLEARED = 0, - CMD_STATE_WAIT_RESP = 1, -}; - -enum { - LSM_INVALID_SESSION_ID = 0, - LSM_MIN_SESSION_ID = 1, - LSM_MAX_SESSION_ID = 8, - LSM_CONTROL_SESSION = 0x0F, -}; - -#define CHECK_SESSION(x) (x < LSM_MIN_SESSION_ID || x > LSM_MAX_SESSION_ID) -struct lsm_common { - void *apr; - atomic_t apr_users; - struct lsm_client common_client[LSM_MAX_SESSION_ID + 1]; - - int set_custom_topology; - struct cal_type_data *cal_data[LSM_MAX_CAL_IDX]; - - struct mutex apr_lock; -}; - -static struct lsm_common lsm_common; -static DEFINE_MUTEX(session_lock); - -/* - * mmap_handle_p can point either client->sound_model.mem_map_handle or - * lsm_common.mmap_handle_for_cal. - * mmap_lock must be held while accessing this. - */ -static spinlock_t mmap_lock; -static uint32_t *mmap_handle_p; - -static spinlock_t lsm_session_lock; -static struct lsm_client *lsm_session[LSM_MAX_SESSION_ID + 1]; - -static int q6lsm_mmapcallback(struct apr_client_data *data, void *priv); -static int q6lsm_send_cal(struct lsm_client *client, - u32 set_params_opcode, struct lsm_params_info_v2 *p_info); -static int q6lsm_memory_map_regions(struct lsm_client *client, - dma_addr_t dma_addr_p, uint32_t dma_buf_sz, - uint32_t *mmap_p); -static int q6lsm_memory_unmap_regions(struct lsm_client *client, - uint32_t handle); - -struct lsm_client_afe_data { - uint64_t fe_id; - uint16_t unprocessed_data; -}; - -static struct lsm_client_afe_data lsm_client_afe_data[LSM_MAX_SESSION_ID + 1]; - -static int q6lsm_get_session_id_from_lsm_client(struct lsm_client *client) -{ - int n; - - for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) { - if (lsm_session[n] == client) - return n; - } - pr_err("%s: cannot find matching lsm client.\n", __func__); - return LSM_INVALID_SESSION_ID; -} - -static bool q6lsm_is_valid_lsm_client(struct lsm_client *client) -{ - return q6lsm_get_session_id_from_lsm_client(client) ? 1 : 0; -} - -static int q6lsm_callback(struct apr_client_data *data, void *priv) -{ - struct lsm_client *client = (struct lsm_client *)priv; - uint32_t token; - uint32_t *payload; - - if (!client || !data) { - pr_err("%s: client %pK data %pK\n", - __func__, client, data); - WARN_ON(1); - return -EINVAL; - } - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: SSR event received 0x%x, event 0x%x, proc 0x%x\n", - __func__, data->opcode, data->reset_event, - data->reset_proc); - - mutex_lock(&session_lock); - if (!client || !q6lsm_is_valid_lsm_client(client)) { - pr_err("%s: client already freed/invalid, return\n", - __func__); - mutex_unlock(&session_lock); - return 0; - } - apr_reset(client->apr); - client->apr = NULL; - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - cal_utils_clear_cal_block_q6maps(LSM_MAX_CAL_IDX, - lsm_common.cal_data); - mutex_lock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - lsm_common.set_custom_topology = 1; - mutex_unlock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - mutex_unlock(&session_lock); - return 0; - } - - payload = data->payload; - pr_debug("%s: Session %d opcode 0x%x token 0x%x payload size %d\n" - "payload [0] = 0x%x\n", __func__, client->session, - data->opcode, data->token, data->payload_size, payload[0]); - if (data->opcode == LSM_DATA_EVENT_READ_DONE) { - struct lsm_cmd_read_done read_done; - - token = data->token; - if (data->payload_size > sizeof(read_done) || - data->payload_size < 6 * sizeof(payload[0])) { - pr_err("%s: read done error payload size %d expected size %zd\n", - __func__, data->payload_size, - sizeof(read_done)); - return -EINVAL; - } - pr_debug("%s: opcode %x status %x lsw %x msw %x mem_map handle %x\n", - __func__, data->opcode, payload[0], payload[1], - payload[2], payload[3]); - read_done.status = payload[0]; - read_done.buf_addr_lsw = payload[1]; - read_done.buf_addr_msw = payload[2]; - read_done.mem_map_handle = payload[3]; - read_done.total_size = payload[4]; - read_done.offset = payload[5]; - if (client->cb) - client->cb(data->opcode, data->token, - (void *)&read_done, - sizeof(read_done), - client->priv); - return 0; - } else if (data->opcode == APR_BASIC_RSP_RESULT) { - token = data->token; - switch (payload[0]) { - case LSM_SESSION_CMD_START: - case LSM_SESSION_CMD_STOP: - case LSM_SESSION_CMD_SET_PARAMS: - case LSM_SESSION_CMD_OPEN_TX: - case LSM_SESSION_CMD_CLOSE_TX: - case LSM_SESSION_CMD_REGISTER_SOUND_MODEL: - case LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL: - case LSM_SESSION_CMD_SHARED_MEM_UNMAP_REGIONS: - case LSM_SESSION_CMD_EOB: - case LSM_SESSION_CMD_READ: - case LSM_SESSION_CMD_OPEN_TX_V2: - case LSM_SESSION_CMD_OPEN_TX_V3: - case LSM_CMD_ADD_TOPOLOGIES: - case LSM_SESSION_CMD_SET_PARAMS_V2: - case LSM_SESSION_CMD_SET_PARAMS_V3: - if (token != client->session && - payload[0] != - LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL) { - pr_err("%s: Invalid session %d receivced expected %d\n", - __func__, token, client->session); - return -EINVAL; - } - if (data->payload_size < 2 * sizeof(payload[0])) { - pr_err("%s: payload has invalid size[%d]\n", - __func__, data->payload_size); - return -EINVAL; - } - client->cmd_err_code = payload[1]; - if (client->cmd_err_code) - pr_err("%s: cmd 0x%x failed status %d\n", - __func__, payload[0], client->cmd_err_code); - if (atomic_cmpxchg(&client->cmd_state, - CMD_STATE_WAIT_RESP, - CMD_STATE_CLEARED) == - CMD_STATE_WAIT_RESP) - wake_up(&client->cmd_wait); - break; - default: - pr_debug("%s: Unknown command 0x%x\n", - __func__, payload[0]); - break; - } - return 0; - } - - if (client->cb) - client->cb(data->opcode, data->token, data->payload, - data->payload_size, client->priv); - - return 0; -} - -static int q6lsm_session_alloc(struct lsm_client *client) -{ - unsigned long flags; - int n, ret = -ENOMEM; - - spin_lock_irqsave(&lsm_session_lock, flags); - for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) { - if (!lsm_session[n]) { - lsm_session[n] = client; - ret = n; - break; - } - } - spin_unlock_irqrestore(&lsm_session_lock, flags); - pr_debug("%s: Alloc Session %d", __func__, n); - return ret; -} - -static void q6lsm_session_free(struct lsm_client *client) -{ - unsigned long flags; - - pr_debug("%s: Freeing session ID %d\n", __func__, client->session); - spin_lock_irqsave(&lsm_session_lock, flags); - lsm_session[client->session] = NULL; - lsm_client_afe_data[client->session].fe_id = 0; - lsm_client_afe_data[client->session].unprocessed_data = 0; - spin_unlock_irqrestore(&lsm_session_lock, flags); - client->session = LSM_INVALID_SESSION_ID; -} - -static void *q6lsm_mmap_apr_reg(void) -{ - if (atomic_inc_return(&lsm_common.apr_users) == 1) { - lsm_common.apr = - apr_register("ADSP", "LSM", q6lsm_mmapcallback, - 0x0FFFFFFFF, &lsm_common); - if (!lsm_common.apr) { - pr_debug("%s: Unable to register APR LSM common port\n", - __func__); - atomic_dec(&lsm_common.apr_users); - } - } - return lsm_common.apr; -} - -static int q6lsm_mmap_apr_dereg(void) -{ - if (lsm_common.apr) { - if (atomic_read(&lsm_common.apr_users) <= 0) { - WARN("%s: APR common port already closed\n", __func__); - } else { - if (atomic_dec_return(&lsm_common.apr_users) == 0) { - apr_deregister(lsm_common.apr); - pr_debug("%s: APR De-Register common port\n", - __func__); - } - } - } - return 0; -} - -/** - * q6lsm_client_alloc - - * Allocate session for LSM client - * - * @cb: callback fn - * @priv: private data - * - * Returns LSM client handle on success or NULL on failure - */ -struct lsm_client *q6lsm_client_alloc(lsm_app_cb cb, void *priv) -{ - struct lsm_client *client; - int n; - - client = kzalloc(sizeof(struct lsm_client), GFP_KERNEL); - if (!client) - return NULL; - n = q6lsm_session_alloc(client); - if (n <= 0) { - kfree(client); - return NULL; - } - client->session = n; - client->cb = cb; - client->priv = priv; - if (CHECK_SESSION(client->session)) { - pr_err("%s: Client session %d\n", - __func__, client->session); - kfree(client); - return NULL; - } - - init_waitqueue_head(&client->cmd_wait); - mutex_init(&client->cmd_lock); - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - - pr_debug("%s: Client Session %d\n", __func__, client->session); - client->apr = apr_register("ADSP", "LSM", q6lsm_callback, - ((client->session) << 8 | client->session), - client); - - if (client->apr == NULL) { - pr_err("%s: Registration with APR failed\n", __func__); - goto fail; - } - - pr_debug("%s: Registering the common port with APR\n", __func__); - client->mmap_apr = q6lsm_mmap_apr_reg(); - if (!client->mmap_apr) { - pr_err("%s: APR registration failed\n", __func__); - goto fail; - } - - pr_debug("%s: New client allocated\n", __func__); - return client; -fail: - q6lsm_client_free(client); - return NULL; -} -EXPORT_SYMBOL(q6lsm_client_alloc); - -/** - * q6lsm_client_free - - * Performs LSM client free - * - * @client: LSM client handle - * - */ -void q6lsm_client_free(struct lsm_client *client) -{ - if (!client) - return; - if (CHECK_SESSION(client->session)) { - pr_err("%s: Invalid Session %d\n", __func__, client->session); - return; - } - apr_deregister(client->apr); - q6lsm_mmap_apr_dereg(); - client->mmap_apr = NULL; - mutex_lock(&session_lock); - q6lsm_session_free(client); - mutex_destroy(&client->cmd_lock); - kfree(client); - client = NULL; - mutex_unlock(&session_lock); -} -EXPORT_SYMBOL(q6lsm_client_free); - -/* - * q6lsm_apr_send_pkt : If wait == true, hold mutex to prevent from preempting - * other thread's wait. - * If mmap_handle_p != NULL, disable irq and spin lock to - * protect mmap_handle_p - */ -static int q6lsm_apr_send_pkt(struct lsm_client *client, void *handle, - void *data, bool wait, uint32_t *mmap_p) -{ - int ret; - unsigned long flags = 0; - struct apr_hdr *msg_hdr = (struct apr_hdr *) data; - - if (!handle) { - pr_err("%s: handle is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: enter wait %d\n", __func__, wait); - if (wait) - mutex_lock(&lsm_common.apr_lock); - if (mmap_p) { - WARN_ON(!wait); - spin_lock_irqsave(&mmap_lock, flags); - mmap_handle_p = mmap_p; - } - atomic_set(&client->cmd_state, CMD_STATE_WAIT_RESP); - client->cmd_err_code = 0; - ret = apr_send_pkt(handle, data); - if (mmap_p) - spin_unlock_irqrestore(&mmap_lock, flags); - - if (ret < 0) { - pr_err("%s: apr_send_pkt failed %d\n", __func__, ret); - } else if (wait) { - ret = wait_event_timeout(client->cmd_wait, - (atomic_read(&client->cmd_state) == - CMD_STATE_CLEARED), - APR_TIMEOUT); - if (likely(ret)) { - /* q6 returned error */ - if (client->cmd_err_code) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - client->cmd_err_code)); - ret = adsp_err_get_lnx_err_code( - client->cmd_err_code); - } else { - ret = 0; - } - } else { - pr_err("%s: wait timedout, apr_opcode = 0x%x, size = %d\n", - __func__, msg_hdr->opcode, msg_hdr->pkt_size); - /* ret = 0 means wait timed out */ - ret = -ETIMEDOUT; - } - } else { - ret = 0; - } - if (wait) - mutex_unlock(&lsm_common.apr_lock); - - if (mmap_p && *mmap_p == 0) - ret = -ENOMEM; - pr_debug("%s: leave ret %d\n", __func__, ret); - return ret; -} - -static void q6lsm_add_hdr(struct lsm_client *client, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg) -{ - pr_debug("%s: pkt_size %d cmd_flg %d session %d\n", __func__, - pkt_size, cmd_flg, client->session); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = APR_SVC_LSM; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_LSM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((client->session << 8) & 0xFF00) | client->session; - hdr->dest_port = ((client->session << 8) & 0xFF00) | client->session; - hdr->pkt_size = pkt_size; - if (cmd_flg) - hdr->token = client->session; -} - -static int q6lsm_pack_params(u8 *dest, struct param_hdr_v3 *param_info, - u8 *param_data, size_t *final_length, - u32 set_param_opcode) -{ - bool iid_supported = q6common_is_instance_id_supported(); - union param_hdrs *param_hdr = NULL; - u32 param_size = param_info->param_size; - size_t hdr_size; - size_t provided_size = *final_length; - - hdr_size = iid_supported ? sizeof(struct param_hdr_v3) : - sizeof(struct param_hdr_v2); - if (provided_size < hdr_size) { - pr_err("%s: Provided size %zu is not large enough, need %zu\n", - __func__, provided_size, hdr_size); - return -EINVAL; - } - - if (iid_supported) { - memcpy(dest, param_info, hdr_size); - } else { - /* MID, PID and structure size are the same in V1 and V2 */ - param_hdr = (union param_hdrs *) dest; - param_hdr->v2.module_id = param_info->module_id; - param_hdr->v2.param_id = param_info->param_id; - - switch (set_param_opcode) { - case LSM_SESSION_CMD_SET_PARAMS_V2: - param_hdr->v2.param_size = param_size; - break; - case LSM_SESSION_CMD_SET_PARAMS: - default: - if (param_size > U16_MAX) { - pr_err("%s: Invalid param size %d\n", __func__, - param_size); - return -EINVAL; - } - - param_hdr->v1.param_size = param_size; - param_hdr->v1.reserved = 0; - break; - } - } - - *final_length = hdr_size; - - if (param_data != NULL) { - if (provided_size < hdr_size + param_size) { - pr_err("%s: Provided size %zu is not large enough, need %zu\n", - __func__, provided_size, hdr_size + param_size); - return -EINVAL; - } - memcpy(dest + hdr_size, param_data, param_size); - *final_length += param_size; - } - return 0; -} - -static int q6lsm_set_params_v2(struct lsm_client *client, - struct mem_mapping_hdr *mem_hdr, - uint8_t *param_data, uint32_t param_size, - uint32_t set_param_opcode) -{ - struct lsm_session_cmd_set_params_v2 *lsm_set_param = NULL; - uint32_t pkt_size = 0; - int ret; - - pkt_size = sizeof(struct lsm_session_cmd_set_params_v2); - /* Only include param size in packet size when inband */ - if (param_data != NULL) - pkt_size += param_size; - - lsm_set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!lsm_set_param) - return -ENOMEM; - - q6lsm_add_hdr(client, &lsm_set_param->apr_hdr, pkt_size, true); - lsm_set_param->apr_hdr.opcode = set_param_opcode; - lsm_set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - lsm_set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - memcpy(lsm_set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both memory header and data\n", - __func__); - ret = -EINVAL; - goto done; - } - - ret = q6lsm_apr_send_pkt(client, client->apr, lsm_set_param, true, - NULL); -done: - kfree(lsm_set_param); - return ret; -} - -static int q6lsm_set_params_v3(struct lsm_client *client, - struct mem_mapping_hdr *mem_hdr, - uint8_t *param_data, uint32_t param_size) -{ - struct lsm_session_cmd_set_params_v3 *lsm_set_param = NULL; - uint16_t pkt_size = 0; - int ret = 0; - - pkt_size = sizeof(struct lsm_session_cmd_set_params_v3); - /* Only include param size in packet size when inband */ - if (param_data != NULL) - pkt_size += param_size; - - lsm_set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!lsm_set_param) - return -ENOMEM; - - q6lsm_add_hdr(client, &lsm_set_param->apr_hdr, pkt_size, true); - lsm_set_param->apr_hdr.opcode = LSM_SESSION_CMD_SET_PARAMS_V3; - lsm_set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - lsm_set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - memcpy(lsm_set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both memory header and data\n", - __func__); - ret = -EINVAL; - goto done; - } - - ret = q6lsm_apr_send_pkt(client, client->apr, lsm_set_param, true, - NULL); -done: - kfree(lsm_set_param); - return ret; -} - -static int q6lsm_set_params(struct lsm_client *client, - struct mem_mapping_hdr *mem_hdr, - uint8_t *param_data, uint32_t param_size, - uint32_t set_param_opcode) - -{ - if (q6common_is_instance_id_supported()) - return q6lsm_set_params_v3(client, mem_hdr, param_data, - param_size); - else - return q6lsm_set_params_v2(client, mem_hdr, param_data, - param_size, set_param_opcode); -} - -static int q6lsm_pack_and_set_params(struct lsm_client *client, - struct param_hdr_v3 *param_info, - uint8_t *param_data, - uint32_t set_param_opcode) - -{ - u8 *packed_data = NULL; - size_t total_size = 0; - int ret = 0; - - total_size = sizeof(union param_hdrs) + param_info->param_size; - packed_data = kzalloc(total_size, GFP_KERNEL); - if (!packed_data) - return -ENOMEM; - - ret = q6lsm_pack_params(packed_data, param_info, param_data, - &total_size, set_param_opcode); - if (ret) - goto done; - - ret = q6lsm_set_params(client, NULL, packed_data, total_size, - set_param_opcode); - -done: - kfree(packed_data); - return ret; -} - -static int q6lsm_send_custom_topologies(struct lsm_client *client) -{ - int rc; - struct cal_block_data *cal_block = NULL; - struct lsm_custom_topologies cstm_top; - - if (lsm_common.cal_data[LSM_CUSTOM_TOP_IDX] == NULL) { - pr_err("%s: LSM_CUSTOM_TOP_IDX invalid\n", __func__); - rc = -EINVAL; - goto done; - } - - lsm_common.set_custom_topology = 0; - - mutex_lock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - cal_block = cal_utils_get_only_cal_block( - lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]); - if (!cal_block) { - pr_err("%s: Cal block for LSM_CUSTOM_TOP_IDX not found\n", - __func__); - rc = -EINVAL; - goto unlock; - } - - if (cal_block->cal_data.size <= 0) { - pr_err("%s: Invalid size for LSM_CUSTOM_TOP %zd\n", - __func__, cal_block->cal_data.size); - rc = -EINVAL; - goto unlock; - } - - memset(&cstm_top, 0, sizeof(cstm_top)); - /* Map the memory for out-of-band data */ - rc = q6lsm_memory_map_regions(client, cal_block->cal_data.paddr, - cal_block->map_data.map_size, - &cal_block->map_data.q6map_handle); - if (rc < 0) { - pr_err("%s: Failed to map custom topologied, err = %d\n", - __func__, rc); - goto unlock; - } - - q6lsm_add_hdr(client, &cstm_top.hdr, - sizeof(cstm_top), true); - cstm_top.hdr.opcode = LSM_CMD_ADD_TOPOLOGIES; - - /* - * For ADD_TOPOLOGIES, the dest_port should be 0 - * Note that source port cannot be zero as it is used - * to route the response to a specific client registered - * on APR - */ - cstm_top.hdr.dest_port = 0; - - cstm_top.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cstm_top.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - cal_block->cal_data.paddr); - cstm_top.mem_map_handle = cal_block->map_data.q6map_handle; - cstm_top.buffer_size = cal_block->cal_data.size; - - rc = q6lsm_apr_send_pkt(client, client->apr, - &cstm_top, true, NULL); - if (rc) - pr_err("%s: Failed to add custom top, err = %d\n", - __func__, rc); - /* go ahead and unmap even if custom top failed */ - rc = q6lsm_memory_unmap_regions(client, - cal_block->map_data.q6map_handle); - if (rc) { - pr_err("%s: Failed to unmap, err = %d\n", - __func__, rc); - /* Even if mem unmap failed, treat the cmd as success */ - rc = 0; - } - -unlock: - mutex_unlock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); -done: - return rc; -} - -static int q6lsm_get_topology_for_app_type(struct lsm_client *client, - int app_type, uint32_t *topology) -{ - int rc = -EINVAL; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_lsm_top *lsm_top; - struct list_head *ptr; - - if (lsm_common.cal_data[LSM_TOP_IDX] == NULL) { - pr_err("%s: LSM_TOP_IDX invalid\n", __func__); - return rc; - } - - mutex_lock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); - list_for_each(ptr, &lsm_common.cal_data[LSM_TOP_IDX]->cal_blocks) { - cal_block = list_entry(ptr, struct cal_block_data, list); - if (!cal_block) { - pr_err("%s: Cal block for LSM_TOP_IDX not found\n", - __func__); - break; - } - - lsm_top = (struct audio_cal_info_lsm_top *) cal_block->cal_info; - if (!lsm_top) { - pr_err("%s: cal_info for LSM_TOP_IDX not found\n", - __func__); - break; - } - - pr_debug("%s: checking topology 0x%x, app_type 0x%x\n", - __func__, lsm_top->topology, lsm_top->app_type); - - if (app_type == 0 || lsm_top->app_type == app_type) { - *topology = lsm_top->topology; - rc = 0; - break; - } - } - mutex_unlock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); - - pr_debug("%s: found topology_id = 0x%x, app_type = 0x%x\n", - __func__, *topology, app_type); - - return rc; -} - -static int q6lsm_do_open_v3(struct lsm_client *client) -{ - int rc, app_type; - struct lsm_stream_cmd_open_tx_v3 *open_v3; - size_t cmd_size = 0; - int stage_idx = LSM_STAGE_INDEX_FIRST; - uint32_t topology_id = 0, *uint32_ptr = NULL; - - cmd_size = sizeof(struct lsm_stream_cmd_open_tx_v3); - cmd_size += client->num_stages * sizeof(struct lsm_stream_stage_info); - open_v3 = kzalloc(cmd_size, GFP_KERNEL); - if (!open_v3) - return -ENOMEM; - - q6lsm_add_hdr(client, &open_v3->hdr, cmd_size, true); - open_v3->hdr.opcode = LSM_SESSION_CMD_OPEN_TX_V3; - open_v3->num_stages = client->num_stages; - uint32_ptr = &open_v3->num_stages; - uint32_ptr++; - - for (; stage_idx < client->num_stages; stage_idx++) { - app_type = client->stage_cfg[stage_idx].app_type; - rc = q6lsm_get_topology_for_app_type(client, app_type, &topology_id); - if (rc) { - pr_err("%s: failed to get topology for stage %d\n", - __func__, stage_idx); - return -EINVAL; - } - *uint32_ptr++ = topology_id; - *uint32_ptr++ = client->stage_cfg[stage_idx].lpi_enable; - } - - rc = q6lsm_apr_send_pkt(client, client->apr, open_v3, true, NULL); - if (rc) - pr_err("%s: open_v3 failed, err = %d\n", __func__, rc); - else - client->use_topology = true; - - kfree(open_v3); - return rc; - -} - -static int q6lsm_do_open_v2(struct lsm_client *client, - uint16_t app_id) -{ - int rc; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_lsm_top *lsm_top; - struct lsm_stream_cmd_open_tx_v2 open_v2; - - if (lsm_common.cal_data[LSM_TOP_IDX] == NULL) { - pr_err("%s: LSM_TOP_IDX invalid\n", __func__); - rc = -EINVAL; - goto done; - } - - mutex_lock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); - cal_block = cal_utils_get_only_cal_block( - lsm_common.cal_data[LSM_TOP_IDX]); - if (!cal_block) { - pr_err("%s: Cal block for LSM_TOP_IDX not found\n", - __func__); - rc = -EINVAL; - goto unlock; - } - - lsm_top = (struct audio_cal_info_lsm_top *) - cal_block->cal_info; - if (!lsm_top) { - pr_err("%s: cal_info for LSM_TOP_IDX not found\n", - __func__); - rc = -EINVAL; - goto unlock; - } - - pr_debug("%s: topology_id = 0x%x, app_type = 0x%x\n", - __func__, lsm_top->topology, lsm_top->app_type); - - if (lsm_top->topology == 0) { - pr_err("%s: toplogy id not sent for app_type 0x%x\n", - __func__, lsm_top->app_type); - rc = -EINVAL; - goto unlock; - } - - client->app_id = lsm_top->app_type; - memset(&open_v2, 0, sizeof(open_v2)); - q6lsm_add_hdr(client, &open_v2.hdr, - sizeof(open_v2), true); - open_v2.topology_id = lsm_top->topology; - open_v2.hdr.opcode = LSM_SESSION_CMD_OPEN_TX_V2; - - rc = q6lsm_apr_send_pkt(client, client->apr, - &open_v2, true, NULL); - if (rc) - pr_err("%s: open_v2 failed, err = %d\n", - __func__, rc); - else - client->use_topology = true; -unlock: - mutex_unlock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); -done: - return rc; - -} - -/** - * q6lsm_sm_set_param_data - - * Update sound model param data - * - * @client: LSM client handle - * @p_info: param info - * @offset: pointer to retrieve size - * - */ -void q6lsm_sm_set_param_data(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, - size_t *offset) -{ - struct param_hdr_v3 param_hdr; - int ret; - struct lsm_sound_model *sm; - - sm = &client->stage_cfg[p_info->stage_idx].sound_model; - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = p_info->module_id; - param_hdr.instance_id = p_info->instance_id; - param_hdr.param_id = p_info->param_id; - param_hdr.param_size = p_info->param_size; - - ret = q6lsm_pack_params(sm->data, ¶m_hdr, - NULL, offset, LSM_SESSION_CMD_SET_PARAMS_V2); - if (ret) - pr_err("%s: Failed to pack params, error %d\n", __func__, ret); -} -EXPORT_SYMBOL(q6lsm_sm_set_param_data); - -/** - * q6lsm_support_multi_stage_detection - - * check for multi-stage support in adsp lsm framework service - * - * Returns true if multi-stage support available, else false - */ -bool q6lsm_adsp_supports_multi_stage_detection(void) -{ - return q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_LSM_V) >= LSM_API_VERSION_V3; -} -EXPORT_SYMBOL(q6lsm_adsp_supports_multi_stage_detection); - -/** - * q6lsm_open - - * command to open LSM session - * - * @client: LSM client handle - * @app_id: App ID for LSM - * - * Returns 0 on success or error on failure - */ -int q6lsm_open(struct lsm_client *client, uint16_t app_id) -{ - int rc = 0; - struct lsm_stream_cmd_open_tx open; - - /* Add Custom topologies if needed */ - if (lsm_common.set_custom_topology) { - rc = q6lsm_send_custom_topologies(client); - if (rc) - pr_err("%s: Failed to send cust_top, err = %d\n", - __func__, rc); - } - - /* Try to open with topology first */ - if ((client->stage_cfg[LSM_STAGE_INDEX_FIRST].app_type != 0) && - q6lsm_adsp_supports_multi_stage_detection()) - rc = q6lsm_do_open_v3(client); - else - rc = q6lsm_do_open_v2(client, app_id); - if (!rc) - /* open_v2/v3 was successful */ - goto done; - - pr_debug("%s: try without topology\n", - __func__); - - memset(&open, 0, sizeof(open)); - q6lsm_add_hdr(client, &open.hdr, sizeof(open), true); - switch (client->app_id) { - case LSM_VOICE_WAKEUP_APP_ID_V2: - open.app_id = client->app_id; - break; - default: - pr_err("%s: default err 0x%x\n", __func__, client->app_id); - rc = -EINVAL; - break; - } - - open.sampling_rate = LSM_SAMPLE_RATE; - open.hdr.opcode = LSM_SESSION_CMD_OPEN_TX; - rc = q6lsm_apr_send_pkt(client, client->apr, - &open, true, NULL); - if (rc) - pr_err("%s: Open failed opcode 0x%x, rc %d\n", - __func__, open.hdr.opcode, rc); - else - client->use_topology = false; -done: - pr_debug("%s: leave %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_open); - -static int q6lsm_send_confidence_levels(struct lsm_client *client, - struct param_hdr_v3 *param_info, - uint32_t set_param_opcode) -{ - struct lsm_param_confidence_levels *conf_levels = NULL; - uint32_t num_conf_levels = client->num_confidence_levels; - uint8_t i = 0; - uint8_t padd_size = 0; - uint32_t param_size = 0; - int rc = 0; - - /* Data must be 4 byte aligned so add any necessary padding. */ - padd_size = (4 - (num_conf_levels % 4)) - 1; - param_size = (sizeof(uint8_t) + num_conf_levels + padd_size) * - sizeof(uint8_t); - param_info->param_size = param_size; - pr_debug("%s: Set Conf Levels PARAM SIZE = %d\n", __func__, param_size); - - conf_levels = kzalloc(param_size, GFP_KERNEL); - if (!conf_levels) - return -ENOMEM; - - conf_levels->num_confidence_levels = num_conf_levels; - pr_debug("%s: Num conf_level = %d\n", __func__, num_conf_levels); - - memcpy(conf_levels->confidence_levels, client->confidence_levels, - num_conf_levels); - for (i = 0; i < num_conf_levels; i++) - pr_debug("%s: Confidence_level[%d] = %d\n", __func__, i, - conf_levels->confidence_levels[i]); - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) conf_levels, - set_param_opcode); - if (rc) - pr_err("%s: Send confidence_levels cmd failed, err = %d\n", - __func__, rc); - kfree(conf_levels); - return rc; -} - -static int q6lsm_send_param_opmode(struct lsm_client *client, - struct param_hdr_v3 *param_info, - u32 set_param_opcode) -{ - struct lsm_param_op_mode op_mode; - int rc = 0; - - memset(&op_mode, 0, sizeof(op_mode)); - param_info->param_size = sizeof(op_mode); - - op_mode.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - op_mode.mode = client->mode; - pr_debug("%s: mode = 0x%x", __func__, op_mode.mode); - - rc = q6lsm_pack_and_set_params(client, param_info, (uint8_t *) &op_mode, - set_param_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - - pr_debug("%s: leave %d\n", __func__, rc); - return rc; -} - -/** - * set_lsm_port - - * Update LSM AFE port - * - */ -void set_lsm_port(int lsm_port) -{ - lsm_afe_port = lsm_port; -} -EXPORT_SYMBOL(set_lsm_port); - -int get_lsm_port(void) -{ - return lsm_afe_port; -} - -/** - * q6lsm_set_afe_data_format - - * command to set afe data format - * - * @fe_id: FrontEnd DAI link ID - * @afe_data_format: afe data format - * - * Returns 0 on success or -EINVAL on failure - */ -int q6lsm_set_afe_data_format(uint64_t fe_id, uint16_t afe_data_format) -{ - int n = 0; - - if (0 != afe_data_format && 1 != afe_data_format) - goto done; - - pr_debug("%s: afe data is %s\n", __func__, - afe_data_format ? "unprocessed" : "processed"); - - for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) { - if (0 == lsm_client_afe_data[n].fe_id) { - lsm_client_afe_data[n].fe_id = fe_id; - lsm_client_afe_data[n].unprocessed_data = - afe_data_format; - pr_debug("%s: session ID is %d, fe_id is %d\n", - __func__, n, fe_id); - return 0; - } - } - - pr_err("%s: all lsm sessions are taken\n", __func__); -done: - return -EINVAL; -} -EXPORT_SYMBOL(q6lsm_set_afe_data_format); - -/** - * q6lsm_get_afe_data_format - - * command to get afe data format - * - * @fe_id: FrontEnd DAI link ID - * @afe_data_format: afe data format - * - */ -void q6lsm_get_afe_data_format(uint64_t fe_id, uint16_t *afe_data_format) -{ - int n = 0; - - if (NULL == afe_data_format) { - pr_err("%s: Pointer afe_data_format is NULL\n", __func__); - return; - } - - for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) { - if (fe_id == lsm_client_afe_data[n].fe_id) { - *afe_data_format = - lsm_client_afe_data[n].unprocessed_data; - pr_debug("%s: session: %d, fe_id: %d, afe data: %s\n", - __func__, n, fe_id, - *afe_data_format ? "unprocessed" : "processed"); - return; - } - } -} -EXPORT_SYMBOL(q6lsm_get_afe_data_format); - -/** - * q6lsm_set_port_connected - - * command to set LSM port connected - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_port_connected(struct lsm_client *client) -{ - struct lsm_param_connect_to_port connect_port; - struct param_hdr_v3 connectport_hdr; - u32 set_param_opcode = 0; - int rc = 0; - - memset(&connect_port, 0, sizeof(connect_port)); - memset(&connectport_hdr, 0, sizeof(connectport_hdr)); - - if (client->use_topology) { - set_param_opcode = LSM_SESSION_CMD_SET_PARAMS_V2; - connectport_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - } else { - set_param_opcode = LSM_SESSION_CMD_SET_PARAMS; - connectport_hdr.module_id = LSM_MODULE_ID_VOICE_WAKEUP; - } - connectport_hdr.instance_id = INSTANCE_ID_0; - connectport_hdr.param_id = LSM_PARAM_ID_CONNECT_TO_PORT; - connectport_hdr.param_size = sizeof(connect_port); - - client->connect_to_port = get_lsm_port(); - if (ADM_LSM_PORT_ID != client->connect_to_port) - q6lsm_get_afe_data_format(client->fe_id, - &client->unprocessed_data); - connect_port.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - connect_port.port_id = client->connect_to_port; - connect_port.unprocessed_data = client->unprocessed_data; - - rc = q6lsm_pack_and_set_params(client, &connectport_hdr, - (uint8_t *) &connect_port, - set_param_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(q6lsm_set_port_connected); - -static int q6lsm_send_param_polling_enable(struct lsm_client *client, - bool poll_en, - struct param_hdr_v3 *param_info, - u32 set_param_opcode) -{ - struct lsm_param_poll_enable polling_enable; - int rc = 0; - - memset(&polling_enable, 0, sizeof(polling_enable)); - param_info->param_size = sizeof(polling_enable); - - polling_enable.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - polling_enable.polling_enable = (poll_en) ? 1 : 0; - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) &polling_enable, - set_param_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - return rc; -} - -/** - * q6lsm_set_fwk_mode_cfg - - * command to set LSM fwk mode cfg - * - * @client: LSM client handle - * @event_mode: mode for fwk cfg - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_fwk_mode_cfg(struct lsm_client *client, - uint32_t event_mode) -{ - struct lsm_param_fwk_mode_cfg fwk_mode_cfg; - struct param_hdr_v3 fwk_mode_cfg_hdr; - int rc = 0; - - memset(&fwk_mode_cfg, 0, sizeof(fwk_mode_cfg)); - memset(&fwk_mode_cfg_hdr, 0, sizeof(fwk_mode_cfg_hdr)); - - if (!client->use_topology) { - pr_debug("%s: Ignore sending event mode\n", __func__); - return rc; - } - - fwk_mode_cfg_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - fwk_mode_cfg_hdr.instance_id = INSTANCE_ID_0; - fwk_mode_cfg_hdr.param_id = LSM_PARAM_ID_FWK_MODE_CONFIG; - fwk_mode_cfg_hdr.param_size = sizeof(fwk_mode_cfg); - - fwk_mode_cfg.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - fwk_mode_cfg.mode = event_mode; - pr_debug("%s: mode = %d\n", __func__, fwk_mode_cfg.mode); - - rc = q6lsm_pack_and_set_params(client, &fwk_mode_cfg_hdr, - (uint8_t *) &fwk_mode_cfg, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_set_fwk_mode_cfg); - -static int q6lsm_arrange_mch_map(uint8_t *ch_map, int ch_cnt) -{ - int ch_idx; - u8 mch_map[LSM_V3P0_MAX_NUM_CHANNELS] = { - PCM_CHANNEL_FL, PCM_CHANNEL_FR, PCM_CHANNEL_FC, - PCM_CHANNEL_LS, PCM_CHANNEL_RS, PCM_CHANNEL_LFE, - PCM_CHANNEL_LB, PCM_CHANNEL_RB, PCM_CHANNEL_CS}; - - - if (ch_cnt > LSM_V3P0_MAX_NUM_CHANNELS) { - pr_err("%s: invalid num_chan %d\n", __func__, ch_cnt); - return -EINVAL; - } - - if (ch_cnt == 1) { - ch_map[0] = PCM_CHANNEL_FC; - } else if (ch_cnt == 4) { - ch_map[0] = PCM_CHANNEL_FL; - ch_map[1] = PCM_CHANNEL_FR; - ch_map[2] = PCM_CHANNEL_LS; - ch_map[3] = PCM_CHANNEL_RS; - } else { - for (ch_idx = 0; ch_idx < ch_cnt; ch_idx++) - ch_map[ch_idx] = mch_map[ch_idx]; - } - - return 0; -} - -/** - * q6lsm_set_media_fmt_params - - * command to set LSM media fmt params - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_media_fmt_params(struct lsm_client *client) -{ - struct lsm_param_media_fmt media_fmt; - struct lsm_hw_params in_param = client->in_hw_params; - struct param_hdr_v3 media_fmt_hdr; - int rc = 0; - - memset(&media_fmt, 0, sizeof(media_fmt)); - memset(&media_fmt_hdr, 0, sizeof(media_fmt_hdr)); - - if (!client->use_topology) { - pr_debug("%s: Ignore sending media format\n", __func__); - goto err_ret; - } - - media_fmt_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - media_fmt_hdr.instance_id = INSTANCE_ID_0; - media_fmt_hdr.param_id = LSM_PARAM_ID_MEDIA_FMT; - media_fmt_hdr.param_size = sizeof(media_fmt); - - media_fmt.minor_version = QLSM_PARAM_ID_MINOR_VERSION_2; - media_fmt.sample_rate = in_param.sample_rate; - media_fmt.num_channels = in_param.num_chs; - media_fmt.bit_width = in_param.sample_size; - rc = q6lsm_arrange_mch_map(media_fmt.channel_mapping, - media_fmt.num_channels); - if (rc) - goto err_ret; - - pr_debug("%s: sample rate= %d, channels %d bit width %d\n", __func__, - media_fmt.sample_rate, media_fmt.num_channels, - media_fmt.bit_width); - - rc = q6lsm_pack_and_set_params(client, &media_fmt_hdr, - (uint8_t *) &media_fmt, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); -err_ret: - return rc; -} -EXPORT_SYMBOL(q6lsm_set_media_fmt_params); - -/* - * q6lsm_set_media_fmt_v2_params - - * command to set LSM media fmt (version2) params - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_media_fmt_v2_params(struct lsm_client *client) -{ - u8 *param_buf; - struct lsm_param_media_fmt_v2 *media_fmt_v2; - struct lsm_hw_params *in_param = &client->in_hw_params; - struct param_hdr_v3 media_fmt_v2_hdr; - int param_len = 0, rc = 0; - - memset(&media_fmt_v2_hdr, 0, sizeof(media_fmt_v2_hdr)); - - param_len = sizeof(*media_fmt_v2) + - (sizeof(uint8_t) * in_param->num_chs); - - /* Add padding to make sure total length is 4-byte aligned */ - if (param_len % 4) - param_len += (4 - (param_len % 4)); - - param_buf = kzalloc(param_len, GFP_KERNEL); - if (!param_buf) - return -ENOMEM; - media_fmt_v2 = (struct lsm_param_media_fmt_v2 *) param_buf; - media_fmt_v2->minor_version = QLSM_PARAM_ID_MINOR_VERSION; - media_fmt_v2->sample_rate = in_param->sample_rate; - media_fmt_v2->num_channels = in_param->num_chs; - media_fmt_v2->bit_width = in_param->sample_size; - rc = q6lsm_arrange_mch_map(media_fmt_v2->channel_mapping, - in_param->num_chs); - if (rc) - goto err_mch_map; - - media_fmt_v2_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - media_fmt_v2_hdr.instance_id = INSTANCE_ID_0; - media_fmt_v2_hdr.param_id = LSM_PARAM_ID_MEDIA_FMT_V2; - media_fmt_v2_hdr.param_size = param_len; - - pr_debug("%s: sample rate= %d, channels %d bit width %d\n", __func__, - media_fmt_v2->sample_rate, media_fmt_v2->num_channels, - media_fmt_v2->bit_width); - - rc = q6lsm_pack_and_set_params(client, &media_fmt_v2_hdr, - param_buf, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - -err_mch_map: - kfree(param_buf); - return rc; -} -EXPORT_SYMBOL(q6lsm_set_media_fmt_v2_params); - -/** - * q6lsm_set_data - - * Command to set LSM data - * - * @client: LSM client handle - * @mode: LSM detection mode value - * @detectfailure: flag for detect failure - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_data(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure) -{ - struct param_hdr_v3 param_hdr; - int rc = 0; - struct lsm_params_info_v2 p_info = {0}; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (!client->confidence_levels) { - /* - * It is possible that confidence levels are - * not provided. This is not a error condition. - * Return gracefully without any error - */ - pr_debug("%s: no conf levels to set\n", - __func__); - return rc; - } - - if (mode == LSM_MODE_KEYWORD_ONLY_DETECTION) { - client->mode = 0x01; - } else if (mode == LSM_MODE_USER_KEYWORD_DETECTION) { - client->mode = 0x03; - } else { - pr_err("%s: Incorrect detection mode %d\n", __func__, mode); - rc = -EINVAL; - goto err_ret; - } - client->mode |= detectfailure << 2; - - param_hdr.module_id = LSM_MODULE_ID_VOICE_WAKEUP; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = LSM_PARAM_ID_OPERATION_MODE; - rc = q6lsm_send_param_opmode(client, ¶m_hdr, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Failed to set lsm config params %d\n", - __func__, rc); - goto err_ret; - } - - param_hdr.param_id = LSM_PARAM_ID_MIN_CONFIDENCE_LEVELS; - rc = q6lsm_send_confidence_levels(client, ¶m_hdr, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Failed to send conf_levels, err = %d\n", - __func__, rc); - goto err_ret; - } - - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - rc = q6lsm_send_cal(client, LSM_SESSION_CMD_SET_PARAMS, &p_info); - if (rc) { - pr_err("%s: Failed to send calibration data %d\n", - __func__, rc); - goto err_ret; - } - -err_ret: - return rc; -} -EXPORT_SYMBOL(q6lsm_set_data); - -/** - * q6lsm_register_sound_model - - * Register LSM snd model - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_register_sound_model(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure) -{ - int rc; - struct lsm_cmd_reg_snd_model cmd; - struct lsm_sound_model *sm; - - memset(&cmd, 0, sizeof(cmd)); - rc = q6lsm_set_data(client, mode, detectfailure); - if (rc) { - pr_err("%s: Failed to set lsm data, err = %d\n", - __func__, rc); - return rc; - } - - sm = &client->stage_cfg[LSM_STAGE_INDEX_FIRST].sound_model; - - q6lsm_add_hdr(client, &cmd.hdr, sizeof(cmd), true); - cmd.hdr.opcode = LSM_SESSION_CMD_REGISTER_SOUND_MODEL; - cmd.model_addr_lsw = lower_32_bits(sm->phys); - cmd.model_addr_msw = msm_audio_populate_upper_32_bits(sm->phys); - cmd.model_size = sm->size; - /* read updated mem_map_handle by q6lsm_mmapcallback */ - rmb(); - cmd.mem_map_handle = sm->mem_map_handle; - - pr_debug("%s: addr %pK, size %d, handle 0x%x\n", __func__, - &sm->phys, cmd.model_size, cmd.mem_map_handle); - rc = q6lsm_apr_send_pkt(client, client->apr, &cmd, true, NULL); - if (rc) - pr_err("%s: Failed cmd op[0x%x]rc[%d]\n", __func__, - cmd.hdr.opcode, rc); - else - pr_debug("%s: Register sound model succeeded\n", __func__); - - return rc; -} -EXPORT_SYMBOL(q6lsm_register_sound_model); - -/** - * q6lsm_deregister_sound_model - - * De-register LSM snd model - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_deregister_sound_model(struct lsm_client *client) -{ - int rc; - struct lsm_cmd_reg_snd_model cmd; - /* - * With multi-stage support sm buff allocation/free usage param info - * to check stage index for which this sound model is being set, and - * to check whether sm data is sent using set param command or not. - * Hence, set param ids to '0' to indicate allocation is for legacy - * reg_sm cmd, where buffer for param header need not be allocated, - * also set stage index to LSM_STAGE_INDEX_FIRST. - */ - struct lsm_params_info_v2 p_info = {0}; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - - if (!client) { - pr_err("APR handle NULL\n"); - return -EINVAL; - } - if (!client->apr) { - pr_err("APR client handle NULL\n"); - return -EINVAL; - } - - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - - memset(&cmd, 0, sizeof(cmd)); - q6lsm_add_hdr(client, &cmd.hdr, sizeof(cmd.hdr), false); - cmd.hdr.opcode = LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL; - - rc = q6lsm_apr_send_pkt(client, client->apr, &cmd.hdr, true, NULL); - if (rc) { - pr_err("%s: Failed cmd opcode 0x%x, rc %d\n", __func__, - cmd.hdr.opcode, rc); - } else { - pr_debug("%s: Deregister sound model succeeded\n", __func__); - } - - q6lsm_snd_model_buf_free(client, &p_info); - - return rc; -} -EXPORT_SYMBOL(q6lsm_deregister_sound_model); - -static void q6lsm_add_mmaphdr(struct lsm_client *client, struct apr_hdr *hdr, - u32 pkt_size, u32 cmd_flg, u32 token) -{ - pr_debug("%s: pkt size=%d cmd_flg=%d session=%d\n", __func__, pkt_size, - cmd_flg, client->session); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->src_port = 0x00; - hdr->dest_port = client->session; - if (cmd_flg) - hdr->token = token; - hdr->pkt_size = pkt_size; -} - -static int q6lsm_memory_map_regions(struct lsm_client *client, - dma_addr_t dma_addr_p, uint32_t dma_buf_sz, - uint32_t *mmap_p) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int rc; - int cmd_size = 0; - - pr_debug("%s: dma_addr_p 0x%pK, dma_buf_sz %d, mmap_p 0x%pK, session %d\n", - __func__, &dma_addr_p, dma_buf_sz, mmap_p, - client->session); - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) + - sizeof(struct avs_shared_map_region_payload); - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_shared_mem_map_regions *)mmap_region_cmd; - q6lsm_add_mmaphdr(client, &mmap_regions->hdr, cmd_size, true, - (client->session << 8)); - - mmap_regions->hdr.opcode = LSM_SESSION_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mmap_regions->num_regions = 1; - mmap_regions->property_flag = 0x00; - payload = ((u8 *)mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - mregions->shm_addr_lsw = lower_32_bits(dma_addr_p); - mregions->shm_addr_msw = msm_audio_populate_upper_32_bits(dma_addr_p); - mregions->mem_size_bytes = dma_buf_sz; - - rc = q6lsm_apr_send_pkt(client, client->mmap_apr, mmap_region_cmd, - true, mmap_p); - if (rc) - pr_err("%s: Failed mmap_regions opcode 0x%x, rc %d\n", - __func__, mmap_regions->hdr.opcode, rc); - - pr_debug("%s: leave %d\n", __func__, rc); - kfree(mmap_region_cmd); - return rc; -} - -static int q6lsm_memory_unmap_regions(struct lsm_client *client, - uint32_t handle) -{ - struct avs_cmd_shared_mem_unmap_regions unmap; - int rc = 0; - int cmd_size = 0; - - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - cmd_size = sizeof(struct avs_cmd_shared_mem_unmap_regions); - q6lsm_add_mmaphdr(client, &unmap.hdr, cmd_size, - true, (client->session << 8)); - unmap.hdr.opcode = LSM_SESSION_CMD_SHARED_MEM_UNMAP_REGIONS; - unmap.mem_map_handle = handle; - - pr_debug("%s: unmap handle 0x%x\n", __func__, unmap.mem_map_handle); - rc = q6lsm_apr_send_pkt(client, client->mmap_apr, &unmap, true, - NULL); - if (rc) - pr_err("%s: Failed mmap_regions opcode 0x%x rc %d\n", - __func__, unmap.hdr.opcode, rc); - - return rc; -} - -static int q6lsm_send_cal(struct lsm_client *client, - u32 set_params_opcode, struct lsm_params_info_v2 *p_info) -{ - int rc = 0, stage_idx = p_info->stage_idx; - struct mem_mapping_hdr mem_hdr; - dma_addr_t lsm_cal_phy_addr; - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - - pr_debug("%s: Session id %d\n", __func__, client->session); - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - - lsm_cal_phy_addr = client->stage_cfg[stage_idx].cal_info.phys; - if (lsm_cal_phy_addr != 0) { - lsm_common.common_client[client->session].session = client->session; - mem_hdr.data_payload_addr_lsw = lower_32_bits(lsm_cal_phy_addr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(lsm_cal_phy_addr); - mem_hdr.mem_map_handle = - client->stage_cfg[stage_idx].cal_info.mem_map_handle; - - rc = q6lsm_set_params(client, &mem_hdr, NULL, - client->stage_cfg[stage_idx].cal_info.size, set_params_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - } - - return rc; -} - -static int q6lsm_snd_cal_free(struct lsm_client *client, - struct lsm_params_info_v2 *p_info) -{ - int rc = 0, stage_idx = p_info->stage_idx; - struct lsm_cal_data_info *cal = NULL; - - if (!client->stage_cfg[stage_idx].cal_info.data) - return 0; - - mutex_lock(&client->cmd_lock); - cal = &client->stage_cfg[stage_idx].cal_info; - if (cal->mem_map_handle != 0) { - rc = q6lsm_memory_unmap_regions(client, cal->mem_map_handle); - if (rc) - pr_err("%s: CMD Memory_unmap_regions failed %d\n", - __func__, rc); - cal->mem_map_handle = 0; - } - msm_audio_ion_free(cal->dma_buf); - cal->dma_buf = NULL; - cal->data = NULL; - cal->phys = 0; - mutex_unlock(&client->cmd_lock); - - return rc; -} - -static int q6lsm_snd_cal_alloc(struct lsm_client *client, - struct lsm_params_info_v2 *p_info) -{ - int rc = 0; - size_t len = 0, total_mem = 0; - struct lsm_cal_data_info *cal = NULL; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_lsm *lsm_cal_info = NULL; - struct list_head *ptr = NULL; - int app_type, stage_idx = p_info->stage_idx; - bool cal_block_found = false; - - app_type = client->stage_cfg[stage_idx].app_type; - pr_debug("%s: app_type %d, stage_idx %d\n", - __func__, app_type, stage_idx); - - mutex_lock(&client->cmd_lock); - mutex_lock(&lsm_common.cal_data[LSM_CAL_IDX]->lock); - list_for_each(ptr, &lsm_common.cal_data[LSM_CAL_IDX]->cal_blocks) { - cal_block = list_entry(ptr, struct cal_block_data, list); - lsm_cal_info = (struct audio_cal_info_lsm *) - (cal_block) ? cal_block->cal_info : NULL; - if ((cal_block && cal_block->cal_data.paddr) && - (lsm_cal_info != NULL) && - (app_type == 0 || app_type == lsm_cal_info->app_type)) { - cal_block_found = true; - len = cal_block->cal_data.size; - break; - } - } - - if (!cal_block_found) { - pr_info("%s: cal not found for stage_idx %d\n", __func__, stage_idx); - goto exit; - } - - if (!len) { - pr_debug("%s: cal size is 0, for stage_idx %d\n", __func__, stage_idx); - goto exit; - } - - cal = &client->stage_cfg[stage_idx].cal_info; - if (cal->data) { - pr_debug("%s: cal data for stage_idx(%d) is already set \n", - __func__, stage_idx); - goto exit; - } - - cal->size = len; - total_mem = PAGE_ALIGN(len); - pr_debug("%s: cal info data size %zd Total mem %zd, stage_idx %d\n", - __func__, len, total_mem, stage_idx); - - rc = msm_audio_ion_alloc(&cal->dma_buf, total_mem, - &cal->phys, &len, &cal->data); - if (rc) { - pr_err("%s: Audio ION alloc is failed for stage_idx %d, rc = %d\n", - __func__, stage_idx, rc); - cal->dma_buf = NULL; - cal->data = NULL; - goto exit; - } - - memcpy(cal->data, (uint32_t *)cal_block->cal_data.kvaddr, cal->size); - mutex_unlock(&lsm_common.cal_data[LSM_CAL_IDX]->lock); - mutex_unlock(&client->cmd_lock); - rc = q6lsm_memory_map_regions(client, cal->phys, len, &cal->mem_map_handle); - if (rc) { - pr_err("%s: CMD Memory_map_regions failed for stage_idx %d, rc = %d\n", - __func__, stage_idx, rc); - cal->mem_map_handle = 0; - goto fail; - } - - return 0; - -exit: - mutex_unlock(&client->cmd_lock); - mutex_unlock(&lsm_common.cal_data[LSM_CAL_IDX]->lock); -fail: - q6lsm_snd_cal_free(client, p_info); - return rc; -} - -/** - * q6lsm_snd_model_buf_free - - * Free memory for LSM snd model - * - * @client: LSM client handle - * @p_info: sound model param info - * - * Returns 0 on success or error on failure - */ -int q6lsm_snd_model_buf_free(struct lsm_client *client, - struct lsm_params_info_v2 *p_info) -{ - int rc = 0, stage_idx = p_info->stage_idx; - struct lsm_sound_model *sm = NULL; - - pr_debug("%s: Session id %d\n", __func__, client->session); - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - - if (!client->stage_cfg[stage_idx].sound_model.data) - return 0; - - mutex_lock(&client->cmd_lock); - sm = &client->stage_cfg[stage_idx].sound_model; - if (sm->mem_map_handle != 0) { - rc = q6lsm_memory_unmap_regions(client, sm->mem_map_handle); - if (rc) - pr_err("%s: CMD Memory_unmap_regions failed %d\n", - __func__, rc); - sm->mem_map_handle = 0; - } - msm_audio_ion_free(sm->dma_buf); - sm->dma_buf = NULL; - sm->data = NULL; - sm->phys = 0; - mutex_unlock(&client->cmd_lock); - - rc = q6lsm_snd_cal_free(client, p_info); - return rc; -} -EXPORT_SYMBOL(q6lsm_snd_model_buf_free); - -static struct lsm_client *q6lsm_get_lsm_client(int session_id) -{ - unsigned long flags; - struct lsm_client *client = NULL; - - spin_lock_irqsave(&lsm_session_lock, flags); - if (session_id < LSM_MIN_SESSION_ID || session_id > LSM_MAX_SESSION_ID) - pr_err("%s: Invalid session %d\n", __func__, session_id); - else if (!lsm_session[session_id]) - pr_err("%s: Not an active session %d\n", __func__, session_id); - else - client = lsm_session[session_id]; - spin_unlock_irqrestore(&lsm_session_lock, flags); - return client; -} - -/* - * q6lsm_mmapcallback : atomic context - */ -static int q6lsm_mmapcallback(struct apr_client_data *data, void *priv) -{ - unsigned long flags; - uint32_t command; - uint32_t retcode; - uint32_t sid; - const uint32_t *payload = data->payload; - struct lsm_client *client = NULL; - - if (data->opcode == RESET_EVENTS) { - sid = (data->token >> 8) & 0x0F; - pr_debug("%s: SSR event received 0x%x, event 0x%x,\n" - "proc 0x%x SID 0x%x\n", __func__, data->opcode, - data->reset_event, data->reset_proc, sid); - - if (sid < LSM_MIN_SESSION_ID || sid > LSM_MAX_SESSION_ID) - pr_err("%s: Invalid session %d\n", __func__, sid); - apr_reset(lsm_common.apr); - lsm_common.apr = NULL; - atomic_set(&lsm_common.apr_users, 0); - cal_utils_clear_cal_block_q6maps(LSM_MAX_CAL_IDX, - lsm_common.cal_data); - lsm_common.set_custom_topology = 1; - return 0; - } - - command = payload[0]; - retcode = payload[1]; - sid = (data->token >> 8) & 0x0F; - pr_debug("%s: opcode 0x%x command 0x%x return code 0x%x SID 0x%x\n", - __func__, data->opcode, command, retcode, sid); - client = q6lsm_get_lsm_client(sid); - if (!client) { - pr_debug("%s: Session %d already freed\n", __func__, sid); - return 0; - } - - switch (data->opcode) { - case LSM_SESSION_CMDRSP_SHARED_MEM_MAP_REGIONS: - if (atomic_read(&client->cmd_state) == CMD_STATE_WAIT_RESP) { - spin_lock_irqsave(&mmap_lock, flags); - *mmap_handle_p = command; - /* spin_unlock_irqrestore implies barrier */ - spin_unlock_irqrestore(&mmap_lock, flags); - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - } - break; - case APR_BASIC_RSP_RESULT: - switch (command) { - case LSM_SESSION_CMD_SHARED_MEM_UNMAP_REGIONS: - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - break; - case LSM_SESSION_CMD_SHARED_MEM_MAP_REGIONS: - if (retcode != 0) { - /* error state, signal to stop waiting */ - if (atomic_read(&client->cmd_state) == - CMD_STATE_WAIT_RESP) { - spin_lock_irqsave(&mmap_lock, flags); - /* implies barrier */ - spin_unlock_irqrestore(&mmap_lock, - flags); - atomic_set(&client->cmd_state, - CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - } - } - break; - default: - pr_warn("%s: Unexpected command 0x%x\n", __func__, - command); - } - /* fallthrough */ - default: - pr_debug("%s: command 0x%x return code 0x%x opcode 0x%x\n", - __func__, command, retcode, data->opcode); - break; - } - if (client->cb) - client->cb(data->opcode, data->token, - data->payload, data->payload_size, - client->priv); - return 0; -} - -/** - * q6lsm_snd_model_buf_alloc - - * Allocate memory for LSM snd model - * - * @client: LSM client handle - * @len: size of sound model - * @p_info: sound model param info - * p_info->param_id != 0 when using set param to register sound model - * - * Returns 0 on success or error on failure - */ -int q6lsm_snd_model_buf_alloc(struct lsm_client *client, size_t len, - struct lsm_params_info_v2 *p_info) -{ - int rc = -EINVAL, stage_idx = p_info->stage_idx; - size_t total_mem = 0; - struct lsm_sound_model *sm = NULL; - - if (!client) - return rc; - - pr_debug("%s:Snd Model len = %zd, stage idx %d\n", - __func__, len, stage_idx); - - mutex_lock(&client->cmd_lock); - sm = &client->stage_cfg[stage_idx].sound_model; - if (!sm->data) { - /* - * If sound model is sent as set_param, i.e. param_id != 0, - * Then memory needs to be allocated for - * set_param payload as well. - */ - if (p_info->param_id != 0) - len += sizeof(union param_hdrs); - - sm->size = len; - total_mem = PAGE_ALIGN(len); - pr_debug("%s: sm param size %zd Total mem %zd, stage_idx %d\n", - __func__, len, total_mem, stage_idx); - rc = msm_audio_ion_alloc(&sm->dma_buf, total_mem, - &sm->phys, &len, &sm->data); - if (rc) { - pr_err("%s: Audio ION alloc is failed, rc = %d, stage_idx = %d\n", - __func__, rc, stage_idx); - goto fail; - } - } else { - pr_err("%s: sound model busy, stage_idx %d\n", __func__, stage_idx); - rc = -EBUSY; - goto fail; - } - - rc = q6lsm_memory_map_regions(client, sm->phys, len, &sm->mem_map_handle); - if (rc) { - pr_err("%s: CMD Memory_map_regions failed %d, stage_idx %d\n", - __func__, rc, stage_idx); - sm->mem_map_handle = 0; - goto fail; - } - mutex_unlock(&client->cmd_lock); - - rc = q6lsm_snd_cal_alloc(client, p_info); - if (rc) { - pr_err("%s: cal alloc failed %d, stage_idx %d\n", - __func__, rc, stage_idx); - goto fail_1; - } - return rc; - -fail: - mutex_unlock(&client->cmd_lock); -fail_1: - q6lsm_snd_model_buf_free(client, p_info); - return rc; -} -EXPORT_SYMBOL(q6lsm_snd_model_buf_alloc); - -static int q6lsm_cmd(struct lsm_client *client, int opcode, bool wait) -{ - struct apr_hdr hdr; - int rc; - - pr_debug("%s: enter opcode %x wait %d\n", __func__, opcode, wait); - q6lsm_add_hdr(client, &hdr, sizeof(hdr), true); - switch (opcode) { - case LSM_SESSION_CMD_START: - case LSM_SESSION_CMD_STOP: - case LSM_SESSION_CMD_CLOSE_TX: - case LSM_SESSION_CMD_EOB: - hdr.opcode = opcode; - break; - default: - pr_err("%s: Invalid opcode 0x%x\n", __func__, opcode); - return -EINVAL; - } - rc = q6lsm_apr_send_pkt(client, client->apr, &hdr, wait, NULL); - if (rc) - pr_err("%s: Failed commmand 0x%x\n", __func__, hdr.opcode); - - pr_debug("%s: leave %d\n", __func__, rc); - return rc; -} - -static int q6lsm_send_param_epd_thres(struct lsm_client *client, void *data, - struct param_hdr_v3 *param_info) -{ - struct snd_lsm_ep_det_thres *ep_det_data = NULL; - struct lsm_param_epd_thres epd_thres; - int rc = 0; - - memset(&epd_thres, 0, sizeof(epd_thres)); - param_info->param_size = sizeof(epd_thres); - - ep_det_data = (struct snd_lsm_ep_det_thres *) data; - epd_thres.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - epd_thres.epd_begin = ep_det_data->epd_begin; - epd_thres.epd_end = ep_det_data->epd_end; - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) &epd_thres, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (unlikely(rc)) - pr_err("%s: EPD_THRESHOLD failed, rc %d\n", __func__, rc); - return rc; -} - -static int q6lsm_send_param_gain(struct lsm_client *client, u16 gain, - struct param_hdr_v3 *param_info) -{ - struct lsm_param_gain lsm_gain; - int rc = 0; - - memset(&lsm_gain, 0, sizeof(lsm_gain)); - param_info->param_size = sizeof(lsm_gain); - - lsm_gain.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - lsm_gain.gain = gain; - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) &lsm_gain, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (unlikely(rc)) - pr_err("%s: LSM_GAIN CMD send failed, rc %d\n", __func__, rc); - return rc; -} - -/** - * q6lsm_set_one_param - - * command for LSM set params - * - * @client: LSM client handle - * p_info: Params info - * data: payload based on param type - * param_type: LSM param type - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_one_param(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, void *data, - uint32_t param_type) -{ - struct param_hdr_v3 param_info; - int rc = 0; - - memset(¶m_info, 0, sizeof(param_info)); - - switch (param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: { - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_param_epd_thres(client, data, ¶m_info); - if (rc) - pr_err("%s: LSM_ENDPOINT_DETECT_THRESHOLD failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_OPERATION_MODE: { - struct snd_lsm_detect_mode *det_mode = data; - - if (det_mode->mode == LSM_MODE_KEYWORD_ONLY_DETECTION) { - client->mode = 0x01; - } else if (det_mode->mode == LSM_MODE_USER_KEYWORD_DETECTION) { - client->mode = 0x03; - } else { - pr_err("%s: Incorrect detection mode %d\n", - __func__, det_mode->mode); - return -EINVAL; - } - - client->mode |= det_mode->detect_failure << 2; - - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - - rc = q6lsm_send_param_opmode(client, ¶m_info, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: OPERATION_MODE failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_GAIN: { - struct snd_lsm_gain *lsm_gain = (struct snd_lsm_gain *) data; - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_param_gain(client, lsm_gain->gain, ¶m_info); - if (rc) - pr_err("%s: LSM_GAIN command failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_MIN_CONFIDENCE_LEVELS: - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_confidence_levels( - client, ¶m_info, LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: CONFIDENCE_LEVELS cmd failed, rc %d\n", - __func__, rc); - break; - case LSM_POLLING_ENABLE: { - struct snd_lsm_poll_enable *lsm_poll_enable = - (struct snd_lsm_poll_enable *) data; - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_param_polling_enable( - client, lsm_poll_enable->poll_en, ¶m_info, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: POLLING ENABLE cmd failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_REG_SND_MODEL: { - struct mem_mapping_hdr mem_hdr; - u32 payload_size; - struct lsm_sound_model *sm = NULL; - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - - if (q6common_is_instance_id_supported()) - payload_size = p_info->param_size + - sizeof(struct param_hdr_v3); - else - payload_size = p_info->param_size + - sizeof(struct param_hdr_v2); - - sm = &client->stage_cfg[p_info->stage_idx].sound_model; - - mem_hdr.data_payload_addr_lsw = - lower_32_bits(sm->phys); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - sm->phys), - mem_hdr.mem_map_handle = sm->mem_map_handle; - - rc = q6lsm_set_params(client, &mem_hdr, NULL, payload_size, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) { - pr_err("%s: REG_SND_MODEL failed, rc %d\n", - __func__, rc); - return rc; - } - - rc = q6lsm_send_cal(client, LSM_SESSION_CMD_SET_PARAMS, p_info); - if (rc) - pr_err("%s: Failed to send lsm cal, err = %d\n", - __func__, rc); - break; - } - - case LSM_DEREG_SND_MODEL: { - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - param_info.param_size = 0; - rc = q6lsm_pack_and_set_params(client, ¶m_info, NULL, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: DEREG_SND_MODEL failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_CUSTOM_PARAMS: { - u32 param_size = p_info->param_size; - - /* Check minimum size, V2 structure is smaller than V3 */ - if (param_size < sizeof(struct param_hdr_v2)) { - pr_err("%s: Invalid param_size %d\n", __func__, - param_size); - return -EINVAL; - } - - rc = q6lsm_set_params(client, NULL, data, param_size, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: CUSTOM_PARAMS failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_DET_EVENT_TYPE: { - struct lsm_param_det_event_type det_event_type; - struct snd_lsm_det_event_type *det_event_data = - (struct snd_lsm_det_event_type *)data; - - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - param_info.param_size = sizeof(det_event_type); - - memset(&det_event_type, 0, sizeof(det_event_type)); - - det_event_type.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - det_event_type.event_type = det_event_data->event_type; - det_event_type.mode = det_event_data->mode; - - rc = q6lsm_pack_and_set_params(client, ¶m_info, - (uint8_t *)&det_event_type, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: DET_EVENT_TYPE cmd failed, rc %d\n", - __func__, rc); - break; - } - - default: - pr_err("%s: wrong param_type 0x%x\n", - __func__, p_info->param_type); - } - - return rc; -} -EXPORT_SYMBOL(q6lsm_set_one_param); - - -/** - * q6lsm_start - - * command for LSM start - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_start(struct lsm_client *client, bool wait) -{ - return q6lsm_cmd(client, LSM_SESSION_CMD_START, wait); -} -EXPORT_SYMBOL(q6lsm_start); - -/** - * q6lsm_stop - - * command for LSM stop - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_stop(struct lsm_client *client, bool wait) -{ - return q6lsm_cmd(client, LSM_SESSION_CMD_STOP, wait); -} -EXPORT_SYMBOL(q6lsm_stop); - -/** - * q6lsm_close - - * command for LSM close - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_close(struct lsm_client *client) -{ - return q6lsm_cmd(client, LSM_SESSION_CMD_CLOSE_TX, true); -} -EXPORT_SYMBOL(q6lsm_close); - -/** - * q6lsm_lab_control - - * command to set LSM LAB control params - * - * @client: LSM client handle - * @enable: bool flag to enable or disable LAB on DSP - * @p_info: param info to be used for sending lab control param - * - * Returns 0 on success or error on failure - */ -int q6lsm_lab_control(struct lsm_client *client, u32 enable, - struct lsm_params_info_v2 *p_info) -{ - struct lsm_param_lab_enable lab_enable; - struct param_hdr_v3 lab_enable_hdr; - struct lsm_param_lab_config lab_config; - struct param_hdr_v3 lab_config_hdr; - int rc = 0; - - memset(&lab_enable, 0, sizeof(lab_enable)); - memset(&lab_enable_hdr, 0, sizeof(lab_enable_hdr)); - memset(&lab_config, 0, sizeof(lab_config)); - memset(&lab_config_hdr, 0, sizeof(lab_config_hdr)); - - if (!client) { - pr_err("%s: invalid param client %pK\n", __func__, client); - return -EINVAL; - } - - /* enable/disable lab on dsp */ - lab_enable_hdr.module_id = p_info->module_id; - lab_enable_hdr.instance_id = p_info->instance_id; - lab_enable_hdr.param_id = LSM_PARAM_ID_LAB_ENABLE; - lab_enable_hdr.param_size = sizeof(lab_enable); - lab_enable.enable = (enable) ? 1 : 0; - rc = q6lsm_pack_and_set_params(client, &lab_enable_hdr, - (uint8_t *) &lab_enable, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Lab enable failed rc %d\n", __func__, rc); - return rc; - } - if (!enable) - goto exit; - - /* lab session is being enabled set the config values */ - lab_config_hdr.module_id = p_info->module_id; - lab_config_hdr.instance_id = p_info->instance_id; - lab_config_hdr.param_id = LSM_PARAM_ID_LAB_CONFIG; - lab_config_hdr.param_size = sizeof(lab_config); - lab_config.minor_version = 1; - lab_config.wake_up_latency_ms = 250; - rc = q6lsm_pack_and_set_params(client, &lab_config_hdr, - (uint8_t *) &lab_config, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Lab config failed rc %d disable lab\n", - __func__, rc); - /* Lab config failed disable lab */ - lab_enable.enable = 0; - if (q6lsm_pack_and_set_params(client, &lab_enable_hdr, - (uint8_t *) &lab_enable, - LSM_SESSION_CMD_SET_PARAMS)) - pr_err("%s: Lab disable failed\n", __func__); - } -exit: - return rc; -} -EXPORT_SYMBOL(q6lsm_lab_control); - -/* - * q6lsm_lab_out_ch_cfg - - * Command to set the channel configuration - * for look-ahead buffer. - * - * @client: LSM client handle - * @ch_map: Channel map indicating the order - * of channels to be configured. - * @p_info: param info to be used for sending lab config param - * - * Returns 0 on success or error on failure - */ -int q6lsm_lab_out_ch_cfg(struct lsm_client *client, - u8 *ch_map, struct lsm_params_info_v2 *p_info) -{ - u8 *param_buf; - struct lsm_param_lab_out_ch_cfg *lab_out_cfg; - struct param_hdr_v3 lab_out_cfg_hdr; - struct lsm_hw_params *out_params = &client->out_hw_params; - int i, rc = 0, param_len = 0; - - param_len = sizeof(*lab_out_cfg) + - sizeof(u8) * out_params->num_chs; - - if (param_len % 4) - param_len += (4 - (param_len % 4)); - - param_buf = kzalloc(param_len, GFP_KERNEL); - if (!param_buf) - return -ENOMEM; - - lab_out_cfg = (struct lsm_param_lab_out_ch_cfg *) param_buf; - lab_out_cfg->minor_version = QLSM_PARAM_ID_MINOR_VERSION; - lab_out_cfg->num_channels = out_params->num_chs; - - for (i = 0; i < out_params->num_chs; i++) - lab_out_cfg->channel_indices[i] = ch_map[i]; - - memset(&lab_out_cfg_hdr, 0, sizeof(lab_out_cfg_hdr)); - lab_out_cfg_hdr.module_id = p_info->module_id; - lab_out_cfg_hdr.instance_id = p_info->instance_id; - lab_out_cfg_hdr.param_id = LSM_PARAM_ID_LAB_OUTPUT_CHANNEL_CONFIG; - lab_out_cfg_hdr.param_size = param_len; - - rc = q6lsm_pack_and_set_params(client, &lab_out_cfg_hdr, - param_buf, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Lab out channel config failed %d\n", - __func__, rc); - - kfree(param_buf); - - return rc; -} -EXPORT_SYMBOL(q6lsm_lab_out_ch_cfg); - -/** - * q6lsm_stop_lab - - * command to stop LSM LAB - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_stop_lab(struct lsm_client *client) -{ - int rc = 0; - - if (!client) { - pr_err("%s: invalid param client %pK\n", __func__, client); - return -EINVAL; - } - rc = q6lsm_cmd(client, LSM_SESSION_CMD_EOB, true); - if (rc) - pr_err("%s: Lab stop failed %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_stop_lab); - -/** - * q6lsm_read - - * command for LSM read - * - * @client: LSM client handle - * @lsm_cmd_read: LSM read command - * - * Returns 0 on success or error on failure - */ -int q6lsm_read(struct lsm_client *client, struct lsm_cmd_read *read) -{ - int rc = 0; - - if (!client || !read) { - pr_err("%s: Invalid params client %pK read %pK\n", __func__, - client, read); - return -EINVAL; - } - pr_debug("%s: read call memmap handle %x address %x%x size %d\n", - __func__, read->mem_map_handle, read->buf_addr_msw, - read->buf_addr_lsw, read->buf_size); - q6lsm_add_hdr(client, &read->hdr, sizeof(struct lsm_cmd_read), true); - read->hdr.opcode = LSM_SESSION_CMD_READ; - rc = q6lsm_apr_send_pkt(client, client->apr, read, false, NULL); - if (rc) - pr_err("%s: read buffer call failed rc %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_read); - -/** - * q6lsm_lab_buffer_alloc - - * Lab buffer allocation or de-alloc - * - * @client: LSM client handle - * @alloc: Allocate or free ion memory - * - * Returns 0 on success or error on failure - */ -int q6lsm_lab_buffer_alloc(struct lsm_client *client, bool alloc) -{ - int ret = 0, i = 0; - size_t allocate_size = 0, len = 0; - struct lsm_hw_params *out_params = &client->out_hw_params; - - if (!client) { - pr_err("%s: invalid client\n", __func__); - return -EINVAL; - } - if (alloc) { - if (client->lab_buffer) { - pr_err("%s: buffers are allocated period count %d period size %d\n", - __func__, - out_params->period_count, - out_params->buf_sz); - return -EINVAL; - } - allocate_size = out_params->period_count * - out_params->buf_sz; - allocate_size = PAGE_ALIGN(allocate_size); - client->lab_buffer = - kzalloc(sizeof(struct lsm_lab_buffer) * - out_params->period_count, GFP_KERNEL); - if (!client->lab_buffer) { - pr_err("%s: memory allocation for lab buffer failed count %d\n" - , __func__, - out_params->period_count); - return -ENOMEM; - } - ret = msm_audio_ion_alloc(&client->lab_buffer[0].dma_buf, - allocate_size, &client->lab_buffer[0].phys, - &len, - &client->lab_buffer[0].data); - if (ret) - pr_err("%s: ion alloc failed ret %d size %zd\n", - __func__, ret, allocate_size); - else { - ret = q6lsm_memory_map_regions(client, - client->lab_buffer[0].phys, len, - &client->lab_buffer[0].mem_map_handle); - if (ret) { - pr_err("%s: memory map filed ret %d size %zd\n", - __func__, ret, len); - msm_audio_ion_free( - client->lab_buffer[0].dma_buf); - } - } - if (ret) { - pr_err("%s: alloc lab buffer failed ret %d\n", - __func__, ret); - kfree(client->lab_buffer); - client->lab_buffer = NULL; - } else { - pr_debug("%s: Memory map handle %x phys %pK size %d\n", - __func__, - client->lab_buffer[0].mem_map_handle, - &client->lab_buffer[0].phys, - out_params->buf_sz); - - for (i = 0; i < out_params->period_count; i++) { - client->lab_buffer[i].phys = - client->lab_buffer[0].phys + - (i * out_params->buf_sz); - client->lab_buffer[i].size = - out_params->buf_sz; - client->lab_buffer[i].data = - (u8 *)(client->lab_buffer[0].data) + - (i * out_params->buf_sz); - client->lab_buffer[i].mem_map_handle = - client->lab_buffer[0].mem_map_handle; - } - } - } else { - ret = q6lsm_memory_unmap_regions(client, - client->lab_buffer[0].mem_map_handle); - if (!ret) - msm_audio_ion_free(client->lab_buffer[0].dma_buf); - else - pr_err("%s: unmap failed not freeing memory\n", - __func__); - kfree(client->lab_buffer); - client->lab_buffer = NULL; - } - return ret; -} -EXPORT_SYMBOL(q6lsm_lab_buffer_alloc); - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case LSM_CUST_TOPOLOGY_CAL_TYPE: - ret = LSM_CUSTOM_TOP_IDX; - break; - case LSM_TOPOLOGY_CAL_TYPE: - ret = LSM_TOP_IDX; - break; - case LSM_CAL_TYPE: - ret = LSM_CAL_IDX; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int q6lsm_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - lsm_common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6lsm_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - lsm_common.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6lsm_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - lsm_common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == LSM_CUSTOM_TOP_IDX) { - mutex_lock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - lsm_common.set_custom_topology = 1; - mutex_unlock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - } - -done: - return ret; -} - -static void lsm_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(LSM_MAX_CAL_IDX, lsm_common.cal_data); -} - -static int q6lsm_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{LSM_CUST_TOPOLOGY_CAL_TYPE, - {q6lsm_alloc_cal, q6lsm_dealloc_cal, NULL, - q6lsm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{LSM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - q6lsm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{LSM_CAL_TYPE, - {q6lsm_alloc_cal, q6lsm_dealloc_cal, NULL, - q6lsm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} } - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(LSM_MAX_CAL_IDX, - lsm_common.cal_data, cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type!\n", - __func__); - ret = -EINVAL; - goto err; - } - - return ret; -err: - lsm_delete_cal_data(); - return ret; -} - -int __init q6lsm_init(void) -{ - int i = 0; - - pr_debug("%s:\n", __func__); - - memset(&lsm_common, 0, sizeof(lsm_common)); - spin_lock_init(&lsm_session_lock); - spin_lock_init(&mmap_lock); - mutex_init(&lsm_common.apr_lock); - for (; i <= LSM_MAX_SESSION_ID; i++) { - lsm_common.common_client[i].session = LSM_CONTROL_SESSION; - init_waitqueue_head(&lsm_common.common_client[i].cmd_wait); - mutex_init(&lsm_common.common_client[i].cmd_lock); - atomic_set(&lsm_common.common_client[i].cmd_state, - CMD_STATE_CLEARED); - } - - if (q6lsm_init_cal_data()) - pr_err("%s: could not init cal data!\n", __func__); - - return 0; -} - -void q6lsm_exit(void) -{ - lsm_delete_cal_data(); -} diff --git a/techpack/audio/4.0/dsp/q6usm.c b/techpack/audio/4.0/dsp/q6usm.c deleted file mode 100644 index cd024fce8139..000000000000 --- a/techpack/audio/4.0/dsp/q6usm.c +++ /dev/null @@ -1,1475 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6usm.h" - -#define ADSP_MEMORY_MAP_SHMEM8_4K_POOL 3 - -#define MEM_4K_OFFSET 4095 -#define MEM_4K_MASK 0xfffff000 - -#define USM_SESSION_MAX 0x02 /* aDSP:USM limit */ - -#define READDONE_IDX_STATUS 0 - -#define WRITEDONE_IDX_STATUS 0 - -/* Standard timeout in the asynchronous ops */ -#define Q6USM_TIMEOUT_JIFFIES (1*HZ) /* 1 sec */ - -static DEFINE_MUTEX(session_lock); - -static struct us_client *session[USM_SESSION_MAX]; -static int32_t q6usm_mmapcallback(struct apr_client_data *data, void *priv); -static int32_t q6usm_callback(struct apr_client_data *data, void *priv); -static void q6usm_add_hdr(struct us_client *usc, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg); - -struct usm_mmap { - atomic_t ref_cnt; - atomic_t cmd_state; - wait_queue_head_t cmd_wait; - void *apr; - int mem_handle; -}; - -static struct usm_mmap this_mmap; - -static void q6usm_add_mmaphdr(struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg, u32 token) -{ - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->src_port = 0; - hdr->dest_port = 0; - if (cmd_flg) { - hdr->token = token; - atomic_set(&this_mmap.cmd_state, 1); - } - hdr->pkt_size = pkt_size; -} - -static int q6usm_memory_map(phys_addr_t buf_add, int dir, uint32_t bufsz, - uint32_t bufcnt, uint32_t session, uint32_t *mem_handle) -{ - struct usm_cmd_memory_map_region mem_region_map; - int rc = 0; - - if (this_mmap.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_mmaphdr(&mem_region_map.hdr, - sizeof(struct usm_cmd_memory_map_region), true, - ((session << 8) | dir)); - - mem_region_map.hdr.opcode = USM_CMD_SHARED_MEM_MAP_REGION; - mem_region_map.mempool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - - mem_region_map.num_regions = 1; - mem_region_map.flags = 0; - - mem_region_map.shm_addr_lsw = lower_32_bits(buf_add); - mem_region_map.shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_add); - mem_region_map.mem_size_bytes = bufsz * bufcnt; - - rc = apr_send_pkt(this_mmap.apr, (uint32_t *) &mem_region_map); - if (rc < 0) { - pr_err("%s: mem_map op[0x%x]rc[%d]\n", - __func__, mem_region_map.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(this_mmap.cmd_wait, - (atomic_read(&this_mmap.cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for memory_map\n", __func__); - } else { - *mem_handle = this_mmap.mem_handle; - rc = 0; - } -fail_cmd: - return rc; -} - -int q6usm_memory_unmap(phys_addr_t buf_add, int dir, uint32_t session, - uint32_t mem_handle) -{ - struct usm_cmd_memory_unmap_region mem_unmap; - int rc = 0; - - if (this_mmap.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_mmaphdr(&mem_unmap.hdr, - sizeof(struct usm_cmd_memory_unmap_region), true, - ((session << 8) | dir)); - mem_unmap.hdr.opcode = USM_CMD_SHARED_MEM_UNMAP_REGION; - mem_unmap.mem_map_handle = mem_handle; - - rc = apr_send_pkt(this_mmap.apr, (uint32_t *) &mem_unmap); - if (rc < 0) { - pr_err("%s: mem_unmap op[0x%x] rc[%d]\n", - __func__, mem_unmap.hdr.opcode, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(this_mmap.cmd_wait, - (atomic_read(&this_mmap.cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for memory_unmap\n", __func__); - } else - rc = 0; -fail_cmd: - return rc; -} - -static int q6usm_session_alloc(struct us_client *usc) -{ - int ind = 0; - - mutex_lock(&session_lock); - for (ind = 0; ind < USM_SESSION_MAX; ++ind) { - if (!session[ind]) { - session[ind] = usc; - mutex_unlock(&session_lock); - ++ind; /* session id: 0 reserved */ - pr_debug("%s: session[%d] was allocated\n", - __func__, ind); - return ind; - } - } - mutex_unlock(&session_lock); - return -ENOMEM; -} - -static void q6usm_session_free(struct us_client *usc) -{ - /* Session index was incremented during allocation */ - uint16_t ind = (uint16_t)usc->session - 1; - - pr_debug("%s: to free session[%d]\n", __func__, ind); - if (ind < USM_SESSION_MAX) { - mutex_lock(&session_lock); - session[ind] = NULL; - mutex_unlock(&session_lock); - } -} - -static int q6usm_us_client_buf_free(unsigned int dir, - struct us_client *usc) -{ - struct us_port_data *port; - int rc = 0; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT))) - return -EINVAL; - - mutex_lock(&usc->cmd_lock); - port = &usc->port[dir]; - if (port == NULL) { - mutex_unlock(&usc->cmd_lock); - return -EINVAL; - } - - if (port->data == NULL) { - mutex_unlock(&usc->cmd_lock); - return 0; - } - - rc = q6usm_memory_unmap(port->phys, dir, usc->session, - *((uint32_t *)port->ext)); - pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, - (void *)port->data, (u64)port->phys, (void *)&port->phys); - - msm_audio_ion_free(port->dma_buf); - - port->data = NULL; - port->phys = 0; - port->buf_size = 0; - port->buf_cnt = 0; - port->dma_buf = NULL; - - mutex_unlock(&usc->cmd_lock); - return rc; -} - -int q6usm_us_param_buf_free(unsigned int dir, - struct us_client *usc) -{ - struct us_port_data *port; - int rc = 0; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT))) - return -EINVAL; - - mutex_lock(&usc->cmd_lock); - port = &usc->port[dir]; - if (port == NULL) { - mutex_unlock(&usc->cmd_lock); - return -EINVAL; - } - - if (port->param_buf == NULL) { - mutex_unlock(&usc->cmd_lock); - return 0; - } - - rc = q6usm_memory_unmap(port->param_phys, dir, usc->session, - *((uint32_t *)port->param_buf_mem_handle)); - pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, - (void *)port->param_buf, (u64)port->param_phys, - (void *)&port->param_phys); - - msm_audio_ion_free(port->param_dma_buf); - - port->param_buf = NULL; - port->param_phys = 0; - port->param_buf_size = 0; - port->param_dma_buf = NULL; - - mutex_unlock(&usc->cmd_lock); - return rc; -} - -void q6usm_us_client_free(struct us_client *usc) -{ - int loopcnt = 0; - struct us_port_data *port; - uint32_t *p_mem_handle = NULL; - - if ((usc == NULL) || - !(usc->session)) - return; - - for (loopcnt = 0; loopcnt <= OUT; ++loopcnt) { - port = &usc->port[loopcnt]; - if (port->data == NULL) - continue; - pr_debug("%s: loopcnt = %d\n", __func__, loopcnt); - q6usm_us_client_buf_free(loopcnt, usc); - q6usm_us_param_buf_free(loopcnt, usc); - } - q6usm_session_free(usc); - apr_deregister(usc->apr); - - pr_debug("%s: APR De-Register\n", __func__); - - if (atomic_read(&this_mmap.ref_cnt) <= 0) { - pr_err("%s: APR Common Port Already Closed\n", __func__); - goto done; - } - - atomic_dec(&this_mmap.ref_cnt); - if (atomic_read(&this_mmap.ref_cnt) == 0) { - apr_deregister(this_mmap.apr); - pr_debug("%s: APR De-Register common port\n", __func__); - } - -done: - p_mem_handle = (uint32_t *)usc->port[IN].ext; - kfree(p_mem_handle); - kfree(usc); - pr_debug("%s:\n", __func__); -} - -struct us_client *q6usm_us_client_alloc( - void (*cb)(uint32_t, uint32_t, uint32_t *, void *), - void *priv) -{ - struct us_client *usc; - uint32_t *p_mem_handle = NULL; - int n; - int lcnt = 0; - - usc = kzalloc(sizeof(struct us_client), GFP_KERNEL); - if (usc == NULL) - return NULL; - - p_mem_handle = kzalloc(sizeof(uint32_t) * 4, GFP_KERNEL); - if (p_mem_handle == NULL) { - kfree(usc); - return NULL; - } - - n = q6usm_session_alloc(usc); - if (n <= 0) - goto fail_session; - usc->session = n; - usc->cb = cb; - usc->priv = priv; - usc->apr = apr_register("ADSP", "USM", - (apr_fn)q6usm_callback, - ((usc->session) << 8 | 0x0001), - usc); - - if (usc->apr == NULL) { - pr_err("%s: Registration with APR failed\n", __func__); - goto fail; - } - pr_debug("%s: Registering the common port with APR\n", __func__); - if (atomic_read(&this_mmap.ref_cnt) == 0) { - this_mmap.apr = apr_register("ADSP", "USM", - (apr_fn)q6usm_mmapcallback, - 0x0FFFFFFFF, &this_mmap); - if (this_mmap.apr == NULL) { - pr_err("%s: USM port registration failed\n", - __func__); - goto fail; - } - } - - atomic_inc(&this_mmap.ref_cnt); - init_waitqueue_head(&usc->cmd_wait); - mutex_init(&usc->cmd_lock); - for (lcnt = 0; lcnt <= OUT; ++lcnt) { - mutex_init(&usc->port[lcnt].lock); - spin_lock_init(&usc->port[lcnt].dsp_lock); - usc->port[lcnt].ext = (void *)p_mem_handle++; - usc->port[lcnt].param_buf_mem_handle = (void *)p_mem_handle++; - pr_err("%s: usc->port[%d].ext=%pK;\n", - __func__, lcnt, usc->port[lcnt].ext); - } - atomic_set(&usc->cmd_state, 0); - - return usc; -fail: - kfree(p_mem_handle); - q6usm_us_client_free(usc); - return NULL; -fail_session: - kfree(p_mem_handle); - kfree(usc); - return NULL; -} - -int q6usm_us_client_buf_alloc(unsigned int dir, - struct us_client *usc, - unsigned int bufsz, - unsigned int bufcnt) -{ - int rc = 0; - struct us_port_data *port = NULL; - unsigned int size = bufsz*bufcnt; - size_t len; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT)) || (size == 0) || - (usc->session <= 0 || usc->session > USM_SESSION_MAX)) { - pr_err("%s: wrong parameters: size=%d; bufcnt=%d\n", - __func__, size, bufcnt); - return -EINVAL; - } - - mutex_lock(&usc->cmd_lock); - - port = &usc->port[dir]; - - /* The size to allocate should be multiple of 4K bytes */ - size = PAGE_ALIGN(size); - - rc = msm_audio_ion_alloc(&port->dma_buf, - size, &port->phys, - &len, &port->data); - - if (rc) { - pr_err("%s: US ION allocation failed, rc = %d\n", - __func__, rc); - mutex_unlock(&usc->cmd_lock); - return -ENOMEM; - } - - port->buf_cnt = bufcnt; - port->buf_size = bufsz; - pr_debug("%s: data[%pK]; phys[%llx]; [%pK]\n", __func__, - (void *)port->data, - (u64)port->phys, - (void *)&port->phys); - - rc = q6usm_memory_map(port->phys, dir, size, 1, usc->session, - (uint32_t *)port->ext); - if (rc < 0) { - pr_err("%s: CMD Memory_map failed\n", __func__); - mutex_unlock(&usc->cmd_lock); - q6usm_us_client_buf_free(dir, usc); - q6usm_us_param_buf_free(dir, usc); - } else { - mutex_unlock(&usc->cmd_lock); - rc = 0; - } - - return rc; -} - -int q6usm_us_param_buf_alloc(unsigned int dir, - struct us_client *usc, - unsigned int bufsz) -{ - int rc = 0; - struct us_port_data *port = NULL; - unsigned int size = bufsz; - size_t len; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT)) || - (usc->session <= 0 || usc->session > USM_SESSION_MAX)) { - pr_err("%s: wrong parameters: direction=%d, bufsz=%d\n", - __func__, dir, bufsz); - return -EINVAL; - } - - mutex_lock(&usc->cmd_lock); - - port = &usc->port[dir]; - - if (bufsz == 0) { - pr_debug("%s: bufsz=0, get/set param commands are forbidden\n", - __func__); - port->param_buf = NULL; - mutex_unlock(&usc->cmd_lock); - return rc; - } - - /* The size to allocate should be multiple of 4K bytes */ - size = PAGE_ALIGN(size); - - rc = msm_audio_ion_alloc(&port->param_dma_buf, - size, &port->param_phys, - &len, &port->param_buf); - - if (rc) { - pr_err("%s: US ION allocation failed, rc = %d\n", - __func__, rc); - mutex_unlock(&usc->cmd_lock); - return -ENOMEM; - } - - port->param_buf_size = bufsz; - pr_debug("%s: param_buf[%pK]; param_phys[%llx]; [%pK]\n", __func__, - (void *)port->param_buf, - (u64)port->param_phys, - (void *)&port->param_phys); - - rc = q6usm_memory_map(port->param_phys, (IN | OUT), size, 1, - usc->session, (uint32_t *)port->param_buf_mem_handle); - if (rc < 0) { - pr_err("%s: CMD Memory_map failed\n", __func__); - mutex_unlock(&usc->cmd_lock); - q6usm_us_client_buf_free(dir, usc); - q6usm_us_param_buf_free(dir, usc); - } else { - mutex_unlock(&usc->cmd_lock); - rc = 0; - } - - return rc; -} - -static int32_t q6usm_mmapcallback(struct apr_client_data *data, void *priv) -{ - uint32_t token; - uint32_t *payload = data->payload; - - if (data->payload_size < (2 * sizeof(uint32_t))) { - pr_err("%s: payload has invalid size[%d]\n", __func__, - data->payload_size); - return -EINVAL; - } - pr_debug("%s: ptr0[0x%x]; ptr1[0x%x]; opcode[0x%x]\n", - __func__, payload[0], payload[1], data->opcode); - pr_debug("%s: token[0x%x]; payload_size[%d]; src[%d]; dest[%d];\n", - __func__, data->token, data->payload_size, - data->src_port, data->dest_port); - - if (data->opcode == APR_BASIC_RSP_RESULT) { - /* status field check */ - if (payload[1]) { - pr_err("%s: wrong response[%d] on cmd [%d]\n", - __func__, payload[1], payload[0]); - } else { - token = data->token; - switch (payload[0]) { - case USM_CMD_SHARED_MEM_UNMAP_REGION: - if (atomic_read(&this_mmap.cmd_state)) { - atomic_set(&this_mmap.cmd_state, 0); - wake_up(&this_mmap.cmd_wait); - } - /* fallthrough */ - case USM_CMD_SHARED_MEM_MAP_REGION: - /* For MEM_MAP, additional answer is waited, */ - /* therfore, no wake-up here */ - pr_debug("%s: cmd[0x%x]; result[0x%x]\n", - __func__, payload[0], payload[1]); - break; - default: - pr_debug("%s: wrong command[0x%x]\n", - __func__, payload[0]); - break; - } - } - } else { - if (data->opcode == USM_CMDRSP_SHARED_MEM_MAP_REGION) { - this_mmap.mem_handle = payload[0]; - pr_debug("%s: memory map handle = 0x%x", - __func__, payload[0]); - if (atomic_read(&this_mmap.cmd_state)) { - atomic_set(&this_mmap.cmd_state, 0); - wake_up(&this_mmap.cmd_wait); - } - } - } - return 0; -} - - -static int32_t q6usm_callback(struct apr_client_data *data, void *priv) -{ - struct us_client *usc = (struct us_client *)priv; - unsigned long dsp_flags; - uint32_t *payload = data->payload; - uint32_t token = data->token; - uint32_t opcode = Q6USM_EVENT_UNDEF; - - if (usc == NULL) { - pr_err("%s: client info is NULL\n", __func__); - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size < (2 * sizeof(uint32_t))) { - pr_err("%s: payload has invalid size[%d]\n", __func__, - data->payload_size); - return -EINVAL; - } - /* status field check */ - if (payload[1]) { - pr_err("%s: wrong response[%d] on cmd [%d]\n", - __func__, payload[1], payload[0]); - if (usc->cb) - usc->cb(data->opcode, token, - (uint32_t *)data->payload, usc->priv); - } else { - switch (payload[0]) { - case USM_SESSION_CMD_RUN: - case USM_STREAM_CMD_CLOSE: - if (token != usc->session) { - pr_err("%s: wrong token[%d]", - __func__, token); - break; - } - case USM_STREAM_CMD_OPEN_READ: - case USM_STREAM_CMD_OPEN_WRITE: - case USM_STREAM_CMD_SET_ENC_PARAM: - case USM_DATA_CMD_MEDIA_FORMAT_UPDATE: - case USM_SESSION_CMD_SIGNAL_DETECT_MODE: - case USM_STREAM_CMD_SET_PARAM: - case USM_STREAM_CMD_GET_PARAM: - if (atomic_read(&usc->cmd_state)) { - atomic_set(&usc->cmd_state, 0); - wake_up(&usc->cmd_wait); - } - if (usc->cb) - usc->cb(data->opcode, token, - (uint32_t *)data->payload, - usc->priv); - break; - default: - break; - } - } - return 0; - } - - switch (data->opcode) { - case RESET_EVENTS: { - pr_err("%s: Reset event is received: %d %d\n", - __func__, - data->reset_event, - data->reset_proc); - - opcode = RESET_EVENTS; - - apr_reset(this_mmap.apr); - this_mmap.apr = NULL; - - apr_reset(usc->apr); - usc->apr = NULL; - - break; - } - - - case USM_DATA_EVENT_READ_DONE: { - struct us_port_data *port = &usc->port[OUT]; - - opcode = Q6USM_EVENT_READ_DONE; - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - if (data->payload_size < - (sizeof(uint32_t)*(READDONE_IDX_STATUS + 1))) { - pr_err("%s: Invalid payload size for READDONE[%d]\n", - __func__, data->payload_size); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - return -EINVAL; - } - if (payload[READDONE_IDX_STATUS]) { - pr_err("%s: wrong READDONE[%d]; token[%d]\n", - __func__, - payload[READDONE_IDX_STATUS], - token); - token = USM_WRONG_TOKEN; - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } - - if (port->expected_token != token) { - u32 cpu_buf = port->cpu_buf; - - pr_err("%s: expected[%d] != token[%d]\n", - __func__, port->expected_token, token); - pr_debug("%s: dsp_buf=%d; cpu_buf=%d;\n", - __func__, port->dsp_buf, cpu_buf); - - token = USM_WRONG_TOKEN; - /* To prevent data handle continiue */ - port->expected_token = USM_WRONG_TOKEN; - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } /* port->expected_token != data->token */ - - port->expected_token = token + 1; - if (port->expected_token == port->buf_cnt) - port->expected_token = 0; - - /* gap support */ - if (port->expected_token != port->cpu_buf) { - port->dsp_buf = port->expected_token; - token = port->dsp_buf; /* for callback */ - } else - port->dsp_buf = token; - - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - break; - } /* case USM_DATA_EVENT_READ_DONE */ - - case USM_DATA_EVENT_WRITE_DONE: { - struct us_port_data *port = &usc->port[IN]; - - opcode = Q6USM_EVENT_WRITE_DONE; - if (data->payload_size < - (sizeof(uint32_t)*(WRITEDONE_IDX_STATUS + 1))) { - pr_err("%s: Invalid payload size for WRITEDONE[%d]\n", - __func__, data->payload_size); - return -EINVAL; - } - if (payload[WRITEDONE_IDX_STATUS]) { - pr_err("%s: wrong WRITEDONE_IDX_STATUS[%d]\n", - __func__, - payload[WRITEDONE_IDX_STATUS]); - break; - } - - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - port->dsp_buf = token + 1; - if (port->dsp_buf == port->buf_cnt) - port->dsp_buf = 0; - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - - break; - } /* case USM_DATA_EVENT_WRITE_DONE */ - - case USM_SESSION_EVENT_SIGNAL_DETECT_RESULT: { - pr_debug("%s: US detect result: result=%d", - __func__, - payload[0]); - opcode = Q6USM_EVENT_SIGNAL_DETECT_RESULT; - - break; - } /* case USM_SESSION_EVENT_SIGNAL_DETECT_RESULT */ - - default: - return 0; - - } /* switch */ - - if (usc->cb) - usc->cb(opcode, token, - data->payload, usc->priv); - - return 0; -} - -uint32_t q6usm_get_virtual_address(int dir, - struct us_client *usc, - struct vm_area_struct *vms) -{ - uint32_t ret = 0xffffffff; - - if (vms && (usc != NULL) && ((dir == IN) || (dir == OUT))) { - struct us_port_data *port = &usc->port[dir]; - int size = PAGE_ALIGN(port->buf_size * port->buf_cnt); - struct audio_buffer ab; - - ab.phys = port->phys; - ab.data = port->data; - ab.used = 1; - ab.size = size; - ab.actual_size = size; - ab.dma_buf = port->dma_buf; - - ret = msm_audio_ion_mmap(&ab, vms); - - } - return ret; -} - -static void q6usm_add_hdr(struct us_client *usc, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg) -{ - mutex_lock(&usc->cmd_lock); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = ((struct apr_svc *)usc->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_USM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = (usc->session << 8) | 0x0001; - hdr->dest_port = (usc->session << 8) | 0x0001; - if (cmd_flg) { - hdr->token = usc->session; - atomic_set(&usc->cmd_state, 1); - } - hdr->pkt_size = pkt_size; - mutex_unlock(&usc->cmd_lock); -} - -static uint32_t q6usm_ext2int_format(uint32_t ext_format) -{ - uint32_t int_format = INVALID_FORMAT; - - switch (ext_format) { - case FORMAT_USPS_EPOS: - int_format = US_POINT_EPOS_FORMAT_V2; - break; - case FORMAT_USRAW: - int_format = US_RAW_FORMAT_V2; - break; - case FORMAT_USPROX: - int_format = US_PROX_FORMAT_V4; - break; - case FORMAT_USGES_SYNC: - int_format = US_GES_SYNC_FORMAT; - break; - case FORMAT_USRAW_SYNC: - int_format = US_RAW_SYNC_FORMAT; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, ext_format); - break; - } - - return int_format; -} - -int q6usm_open_read(struct us_client *usc, - uint32_t format) -{ - uint32_t int_format = INVALID_FORMAT; - int rc = 0x00; - struct usm_stream_cmd_open_read open; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: client or its apr is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: session[%d]", __func__, usc->session); - - q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); - open.hdr.opcode = USM_STREAM_CMD_OPEN_READ; - open.src_endpoint = 0; /* AFE */ - open.pre_proc_top = 0; /* No preprocessing required */ - - int_format = q6usm_ext2int_format(format); - if (int_format == INVALID_FORMAT) - return -EINVAL; - - open.uMode = STREAM_PRIORITY_NORMAL; - open.format = int_format; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout, waited for OPEN_READ rc[%d]\n", - __func__, rc); - goto fail_cmd; - } else - rc = 0; -fail_cmd: - return rc; -} - - -int q6usm_enc_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg) -{ - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_cmd_encdec_cfg_blk enc_cfg_obj; - struct usm_stream_cmd_encdec_cfg_blk *enc_cfg = &enc_cfg_obj; - int rc = 0; - uint32_t total_cfg_size = - sizeof(struct usm_stream_cmd_encdec_cfg_blk); - uint32_t round_params_size = 0; - uint8_t is_allocated = 0; - - - if ((usc == NULL) || (us_cfg == NULL)) { - pr_err("%s: wrong input", __func__); - return -EINVAL; - } - - int_format = q6usm_ext2int_format(us_cfg->format_id); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong input format[%d]", - __func__, us_cfg->format_id); - return -EINVAL; - } - - /* Transparent configuration data is after enc_cfg */ - /* Integer number of u32s is required */ - round_params_size = ((us_cfg->params_size + 3)/4) * 4; - if (round_params_size > USM_MAX_CFG_DATA_SIZE) { - /* Dynamic allocated encdec_cfg_blk is required */ - /* static part use */ - round_params_size -= USM_MAX_CFG_DATA_SIZE; - total_cfg_size += round_params_size; - enc_cfg = kzalloc(total_cfg_size, GFP_KERNEL); - if (enc_cfg == NULL) { - pr_err("%s: enc_cfg[%d] allocation failed\n", - __func__, total_cfg_size); - return -ENOMEM; - } - is_allocated = 1; - } else - round_params_size = 0; - - q6usm_add_hdr(usc, &enc_cfg->hdr, total_cfg_size, true); - - enc_cfg->hdr.opcode = USM_STREAM_CMD_SET_ENC_PARAM; - enc_cfg->param_id = USM_PARAM_ID_ENCDEC_ENC_CFG_BLK; - enc_cfg->param_size = sizeof(struct usm_encode_cfg_blk)+ - round_params_size; - enc_cfg->enc_blk.frames_per_buf = 1; - enc_cfg->enc_blk.format_id = int_format; - enc_cfg->enc_blk.cfg_size = sizeof(struct usm_cfg_common)+ - USM_MAX_CFG_DATA_SIZE + - round_params_size; - memcpy(&(enc_cfg->enc_blk.cfg_common), &(us_cfg->cfg_common), - sizeof(struct usm_cfg_common)); - - /* Transparent data copy */ - memcpy(enc_cfg->enc_blk.transp_data, us_cfg->params, - us_cfg->params_size); - pr_debug("%s: cfg_size[%d], params_size[%d]\n", - __func__, - enc_cfg->enc_blk.cfg_size, - us_cfg->params_size); - pr_debug("%s: params[%d,%d,%d,%d, %d,%d,%d,%d]\n", - __func__, - enc_cfg->enc_blk.transp_data[0], - enc_cfg->enc_blk.transp_data[1], - enc_cfg->enc_blk.transp_data[2], - enc_cfg->enc_blk.transp_data[3], - enc_cfg->enc_blk.transp_data[4], - enc_cfg->enc_blk.transp_data[5], - enc_cfg->enc_blk.transp_data[6], - enc_cfg->enc_blk.transp_data[7] - ); - pr_debug("%s: srate:%d, ch=%d, bps= %d;\n", - __func__, enc_cfg->enc_blk.cfg_common.sample_rate, - enc_cfg->enc_blk.cfg_common.ch_cfg, - enc_cfg->enc_blk.cfg_common.bits_per_sample); - pr_debug("dmap:[0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x]; dev_id=0x%x\n", - enc_cfg->enc_blk.cfg_common.data_map[0], - enc_cfg->enc_blk.cfg_common.data_map[1], - enc_cfg->enc_blk.cfg_common.data_map[2], - enc_cfg->enc_blk.cfg_common.data_map[3], - enc_cfg->enc_blk.cfg_common.data_map[4], - enc_cfg->enc_blk.cfg_common.data_map[5], - enc_cfg->enc_blk.cfg_common.data_map[6], - enc_cfg->enc_blk.cfg_common.data_map[7], - enc_cfg->enc_blk.cfg_common.dev_id); - - rc = apr_send_pkt(usc->apr, (uint32_t *) enc_cfg); - if (rc < 0) { - pr_err("%s:Comamnd open failed\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg->hdr.opcode); - } else - rc = 0; - -fail_cmd: - if (is_allocated == 1) - kfree(enc_cfg); - - return rc; -} - -int q6usm_dec_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg) -{ - - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_media_format_update dec_cfg_obj; - struct usm_stream_media_format_update *dec_cfg = &dec_cfg_obj; - - int rc = 0; - uint32_t total_cfg_size = sizeof(struct usm_stream_media_format_update); - uint32_t round_params_size = 0; - uint8_t is_allocated = 0; - - - if ((usc == NULL) || (us_cfg == NULL)) { - pr_err("%s: wrong input", __func__); - return -EINVAL; - } - - int_format = q6usm_ext2int_format(us_cfg->format_id); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong input format[%d]", - __func__, us_cfg->format_id); - return -EINVAL; - } - - /* Transparent configuration data is after enc_cfg */ - /* Integer number of u32s is required */ - round_params_size = ((us_cfg->params_size + 3)/4) * 4; - if (round_params_size > USM_MAX_CFG_DATA_SIZE) { - /* Dynamic allocated encdec_cfg_blk is required */ - /* static part use */ - round_params_size -= USM_MAX_CFG_DATA_SIZE; - total_cfg_size += round_params_size; - dec_cfg = kzalloc(total_cfg_size, GFP_KERNEL); - if (dec_cfg == NULL) { - pr_err("%s:dec_cfg[%d] allocation failed\n", - __func__, total_cfg_size); - return -ENOMEM; - } - is_allocated = 1; - } else { /* static transp_data is enough */ - round_params_size = 0; - } - - q6usm_add_hdr(usc, &dec_cfg->hdr, total_cfg_size, true); - - dec_cfg->hdr.opcode = USM_DATA_CMD_MEDIA_FORMAT_UPDATE; - dec_cfg->format_id = int_format; - dec_cfg->cfg_size = sizeof(struct usm_cfg_common) + - USM_MAX_CFG_DATA_SIZE + - round_params_size; - memcpy(&(dec_cfg->cfg_common), &(us_cfg->cfg_common), - sizeof(struct usm_cfg_common)); - /* Transparent data copy */ - memcpy(dec_cfg->transp_data, us_cfg->params, us_cfg->params_size); - pr_debug("%s: cfg_size[%d], params_size[%d]; parambytes[%d,%d,%d,%d]\n", - __func__, - dec_cfg->cfg_size, - us_cfg->params_size, - dec_cfg->transp_data[0], - dec_cfg->transp_data[1], - dec_cfg->transp_data[2], - dec_cfg->transp_data[3] - ); - - rc = apr_send_pkt(usc->apr, (uint32_t *) dec_cfg); - if (rc < 0) { - pr_err("%s:Comamnd open failed\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout opcode[0x%x]\n", - __func__, dec_cfg->hdr.opcode); - } else - rc = 0; - -fail_cmd: - if (is_allocated == 1) - kfree(dec_cfg); - - return rc; -} - -int q6usm_open_write(struct us_client *usc, - uint32_t format) -{ - int rc = 0; - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_cmd_open_write open; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: session[%d]", __func__, usc->session); - - q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); - open.hdr.opcode = USM_STREAM_CMD_OPEN_WRITE; - - int_format = q6usm_ext2int_format(format); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong format[%d]", __func__, format); - return -EINVAL; - } - - open.format = int_format; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s:open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. waited for OPEN_WRITR rc[%d]\n", - __func__, rc); - goto fail_cmd; - } else - rc = 0; - -fail_cmd: - return rc; -} - -int q6usm_run(struct us_client *usc, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts) -{ - struct usm_stream_cmd_run run; - int rc = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - q6usm_add_hdr(usc, &run.hdr, sizeof(run), true); - - run.hdr.opcode = USM_SESSION_CMD_RUN; - run.flags = flags; - run.msw_ts = msw_ts; - run.lsw_ts = lsw_ts; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &run); - if (rc < 0) { - pr_err("%s: Commmand run failed[%d]\n", __func__, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for run success rc[%d]\n", - __func__, rc); - } else - rc = 0; - -fail_cmd: - return rc; -} - - - -int q6usm_read(struct us_client *usc, uint32_t read_ind) -{ - struct usm_stream_cmd_read read; - struct us_port_data *port = NULL; - int rc = 0; - u32 read_counter = 0; - u32 loop_ind = 0; - u64 buf_addr = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[OUT]; - - if (read_ind > port->buf_cnt) { - pr_err("%s: wrong read_ind[%d]\n", - __func__, read_ind); - return -EINVAL; - } - if (read_ind == port->cpu_buf) { - pr_err("%s: no free region\n", __func__); - return 0; - } - - if (read_ind > port->cpu_buf) { /* 1 range */ - read_counter = read_ind - port->cpu_buf; - } else { /* 2 ranges */ - read_counter = (port->buf_cnt - port->cpu_buf) + read_ind; - } - - q6usm_add_hdr(usc, &read.hdr, sizeof(read), false); - - read.hdr.opcode = USM_DATA_CMD_READ; - read.buf_size = port->buf_size; - buf_addr = (u64)(port->phys) + port->buf_size * (port->cpu_buf); - read.buf_addr_lsw = lower_32_bits(buf_addr); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(buf_addr); - read.mem_map_handle = *((uint32_t *)(port->ext)); - - for (loop_ind = 0; loop_ind < read_counter; ++loop_ind) { - u32 temp_cpu_buf = port->cpu_buf; - - buf_addr = (u64)(port->phys) + - port->buf_size * (port->cpu_buf); - read.buf_addr_lsw = lower_32_bits(buf_addr); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(buf_addr); - read.seq_id = port->cpu_buf; - read.hdr.token = port->cpu_buf; - read.counter = 1; - - ++(port->cpu_buf); - if (port->cpu_buf == port->buf_cnt) - port->cpu_buf = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &read); - - if (rc < 0) { - port->cpu_buf = temp_cpu_buf; - - pr_err("%s:read op[0x%x]rc[%d]\n", - __func__, read.hdr.opcode, rc); - break; - } - - rc = 0; - } /* bufs loop */ - - return rc; -} - -int q6usm_write(struct us_client *usc, uint32_t write_ind) -{ - int rc = 0; - struct usm_stream_cmd_write cmd_write; - struct us_port_data *port = NULL; - u32 current_dsp_buf = 0; - u64 buf_addr = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[IN]; - - current_dsp_buf = port->dsp_buf; - /* free region, caused by new dsp_buf report from DSP, */ - /* can be only extended */ - if (port->cpu_buf >= current_dsp_buf) { - /* 2 -part free region, including empty buffer */ - if ((write_ind <= port->cpu_buf) && - (write_ind > current_dsp_buf)) { - pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", - __func__, write_ind, - current_dsp_buf, port->cpu_buf); - return -EINVAL; - } - } else { - /* 1 -part free region */ - if ((write_ind <= port->cpu_buf) || - (write_ind > current_dsp_buf)) { - pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", - __func__, write_ind, - current_dsp_buf, port->cpu_buf); - return -EINVAL; - } - } - - q6usm_add_hdr(usc, &cmd_write.hdr, sizeof(cmd_write), false); - - cmd_write.hdr.opcode = USM_DATA_CMD_WRITE; - cmd_write.buf_size = port->buf_size; - buf_addr = (u64)(port->phys) + port->buf_size * (port->cpu_buf); - cmd_write.buf_addr_lsw = lower_32_bits(buf_addr); - cmd_write.buf_addr_msw = msm_audio_populate_upper_32_bits(buf_addr); - cmd_write.mem_map_handle = *((uint32_t *)(port->ext)); - cmd_write.res0 = 0; - cmd_write.res1 = 0; - cmd_write.res2 = 0; - - while (port->cpu_buf != write_ind) { - u32 temp_cpu_buf = port->cpu_buf; - - buf_addr = (u64)(port->phys) + - port->buf_size * (port->cpu_buf); - cmd_write.buf_addr_lsw = lower_32_bits(buf_addr); - cmd_write.buf_addr_msw = - msm_audio_populate_upper_32_bits(buf_addr); - cmd_write.seq_id = port->cpu_buf; - cmd_write.hdr.token = port->cpu_buf; - - ++(port->cpu_buf); - if (port->cpu_buf == port->buf_cnt) - port->cpu_buf = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_write); - - if (rc < 0) { - port->cpu_buf = temp_cpu_buf; - pr_err("%s:write op[0x%x];rc[%d];cpu_buf[%d]\n", - __func__, cmd_write.hdr.opcode, - rc, port->cpu_buf); - break; - } - - rc = 0; - } - - return rc; -} - -bool q6usm_is_write_buf_full(struct us_client *usc, uint32_t *free_region) -{ - struct us_port_data *port = NULL; - u32 cpu_buf = 0; - - if ((usc == NULL) || !free_region) { - pr_err("%s: input data wrong\n", __func__); - return false; - } - port = &usc->port[IN]; - cpu_buf = port->cpu_buf + 1; - if (cpu_buf == port->buf_cnt) - cpu_buf = 0; - - *free_region = port->dsp_buf; - - return cpu_buf == *free_region; -} - -int q6usm_cmd(struct us_client *usc, int cmd) -{ - struct apr_hdr hdr; - int rc = 0; - atomic_t *state; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - q6usm_add_hdr(usc, &hdr, sizeof(hdr), true); - switch (cmd) { - case CMD_CLOSE: - hdr.opcode = USM_STREAM_CMD_CLOSE; - state = &usc->cmd_state; - break; - - default: - pr_err("%s:Invalid format[%d]\n", __func__, cmd); - goto fail_cmd; - } - - rc = apr_send_pkt(usc->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Command 0x%x failed\n", __func__, hdr.opcode); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, (atomic_read(state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. waited for response opcode[0x%x]\n", - __func__, hdr.opcode); - } else - rc = 0; -fail_cmd: - return rc; -} - -int q6usm_set_us_detection(struct us_client *usc, - struct usm_session_cmd_detect_info *detect_info, - uint16_t detect_info_size) -{ - int rc = 0; - - if ((usc == NULL) || - (detect_info_size == 0) || - (detect_info == NULL)) { - pr_err("%s: wrong input: usc=0x%pK, inf_size=%d; info=0x%pK", - __func__, - usc, - detect_info_size, - detect_info); - return -EINVAL; - } - - q6usm_add_hdr(usc, &detect_info->hdr, detect_info_size, true); - - detect_info->hdr.opcode = USM_SESSION_CMD_SIGNAL_DETECT_MODE; - - rc = apr_send_pkt(usc->apr, (uint32_t *)detect_info); - if (rc < 0) { - pr_err("%s:Comamnd signal detect failed\n", __func__); - return -EINVAL; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: CMD_SIGNAL_DETECT_MODE: timeout=%d\n", - __func__, Q6USM_TIMEOUT_JIFFIES); - } else - rc = 0; - - return rc; -} - -int q6usm_set_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size) -{ - int rc = 0; - struct usm_stream_cmd_set_param cmd_set_param; - struct us_port_data *port = NULL; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[dir]; - - q6usm_add_hdr(usc, &cmd_set_param.hdr, sizeof(cmd_set_param), true); - - cmd_set_param.hdr.opcode = USM_STREAM_CMD_SET_PARAM; - cmd_set_param.buf_size = buf_size; - cmd_set_param.buf_addr_msw = - msm_audio_populate_upper_32_bits(port->param_phys); - cmd_set_param.buf_addr_lsw = lower_32_bits(port->param_phys); - cmd_set_param.mem_map_handle = - *((uint32_t *)(port->param_buf_mem_handle)); - cmd_set_param.module_id = module_id; - cmd_set_param.param_id = param_id; - cmd_set_param.hdr.token = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_set_param); - - if (rc < 0) { - pr_err("%s:write op[0x%x];rc[%d]\n", - __func__, cmd_set_param.hdr.opcode, rc); - } - - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: CMD_SET_PARAM: timeout=%d\n", - __func__, Q6USM_TIMEOUT_JIFFIES); - } else - rc = 0; - - return rc; -} - -int q6usm_get_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size) -{ - int rc = 0; - struct usm_stream_cmd_get_param cmd_get_param; - struct us_port_data *port = NULL; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[dir]; - - q6usm_add_hdr(usc, &cmd_get_param.hdr, sizeof(cmd_get_param), true); - - cmd_get_param.hdr.opcode = USM_STREAM_CMD_GET_PARAM; - cmd_get_param.buf_size = buf_size; - cmd_get_param.buf_addr_msw = - msm_audio_populate_upper_32_bits(port->param_phys); - cmd_get_param.buf_addr_lsw = lower_32_bits(port->param_phys); - cmd_get_param.mem_map_handle = - *((uint32_t *)(port->param_buf_mem_handle)); - cmd_get_param.module_id = module_id; - cmd_get_param.param_id = param_id; - cmd_get_param.hdr.token = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_get_param); - - if (rc < 0) { - pr_err("%s:write op[0x%x];rc[%d]\n", - __func__, cmd_get_param.hdr.opcode, rc); - } - - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: CMD_GET_PARAM: timeout=%d\n", - __func__, Q6USM_TIMEOUT_JIFFIES); - } else - rc = 0; - - return rc; -} - -int __init q6usm_init(void) -{ - pr_debug("%s\n", __func__); - init_waitqueue_head(&this_mmap.cmd_wait); - memset(session, 0, sizeof(session)); - return 0; -} diff --git a/techpack/audio/4.0/dsp/q6usm.h b/techpack/audio/4.0/dsp/q6usm.h deleted file mode 100644 index aa531b028495..000000000000 --- a/techpack/audio/4.0/dsp/q6usm.h +++ /dev/null @@ -1,119 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2011-2014, 2018, The Linux Foundation. All rights reserved. - */ -#ifndef __Q6_USM_H__ -#define __Q6_USM_H__ - -#include - -#define Q6USM_EVENT_UNDEF 0 -#define Q6USM_EVENT_READ_DONE 1 -#define Q6USM_EVENT_WRITE_DONE 2 -#define Q6USM_EVENT_SIGNAL_DETECT_RESULT 3 - -/* cyclic buffer with 1 gap support */ -#define USM_MIN_BUF_CNT 3 - -#define FORMAT_USPS_EPOS 0x00000000 -#define FORMAT_USRAW 0x00000001 -#define FORMAT_USPROX 0x00000002 -#define FORMAT_USGES_SYNC 0x00000003 -#define FORMAT_USRAW_SYNC 0x00000004 -#define INVALID_FORMAT 0xffffffff - -#define IN 0x000 -#define OUT 0x001 - -#define USM_WRONG_TOKEN 0xffffffff -#define USM_UNDEF_TOKEN 0xfffffffe - -#define CMD_CLOSE 0x0004 - -/* bit 0:1 represents priority of stream */ -#define STREAM_PRIORITY_NORMAL 0x0000 -#define STREAM_PRIORITY_LOW 0x0001 -#define STREAM_PRIORITY_HIGH 0x0002 - -/* bit 4 represents META enable of encoded data buffer */ -#define BUFFER_META_ENABLE 0x0010 - -struct us_port_data { - dma_addr_t phys; - /* cyclic region of buffers with 1 gap */ - void *data; - /* number of buffers in the region */ - uint32_t buf_cnt; - /* size of buffer */ - size_t buf_size; - /* write index */ - uint32_t dsp_buf; - /* read index */ - uint32_t cpu_buf; - /* expected token from dsp */ - uint32_t expected_token; - /* read or write locks */ - struct mutex lock; - spinlock_t dsp_lock; - /* ION dma_buf memory */ - struct dma_buf *dma_buf; - /* extended parameters, related to q6 variants */ - void *ext; - /* physical address of parameter buffer */ - dma_addr_t param_phys; - /* buffer which stores the parameter data */ - void *param_buf; - /* size of parameter buffer */ - uint32_t param_buf_size; - /* parameter buffer memory handle */ - void *param_buf_mem_handle; - /* ION dma_buf memory for parameter buffer */ - struct dma_buf *param_dma_buf; -}; - -struct us_client { - int session; - /* idx:1 out port, 0: in port*/ - struct us_port_data port[2]; - - struct apr_svc *apr; - struct mutex cmd_lock; - - atomic_t cmd_state; - atomic_t eos_state; - wait_queue_head_t cmd_wait; - - void (*cb)(uint32_t, uint32_t, uint32_t *, void *); - void *priv; -}; - -int q6usm_run(struct us_client *usc, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts); -int q6usm_cmd(struct us_client *usc, int cmd); -int q6usm_us_client_buf_alloc(unsigned int dir, struct us_client *usc, - unsigned int bufsz, unsigned int bufcnt); -int q6usm_us_param_buf_alloc(unsigned int dir, struct us_client *usc, - unsigned int bufsz); -int q6usm_enc_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg); -int q6usm_dec_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg); -int q6usm_read(struct us_client *usc, uint32_t read_ind); -struct us_client *q6usm_us_client_alloc( - void (*cb)(uint32_t, uint32_t, uint32_t *, void *), - void *priv); -int q6usm_open_read(struct us_client *usc, uint32_t format); -void q6usm_us_client_free(struct us_client *usc); -uint32_t q6usm_get_virtual_address(int dir, struct us_client *usc, - struct vm_area_struct *vms); -int q6usm_open_write(struct us_client *usc, uint32_t format); -int q6usm_write(struct us_client *usc, uint32_t write_ind); -bool q6usm_is_write_buf_full(struct us_client *usc, uint32_t *free_region); -int q6usm_set_us_detection(struct us_client *usc, - struct usm_session_cmd_detect_info *detect_info, - uint16_t detect_info_size); -int q6usm_set_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size); -int q6usm_get_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size); -int q6usm_init(void); - -#endif /* __Q6_USM_H__ */ diff --git a/techpack/audio/4.0/dsp/q6voice.c b/techpack/audio/4.0/dsp/q6voice.c deleted file mode 100644 index 5e90104beee0..000000000000 --- a/techpack/audio/4.0/dsp/q6voice.c +++ /dev/null @@ -1,10175 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" -#include - -#define TIMEOUT_MS 300 - - -#define CMD_STATUS_SUCCESS 0 -#define CMD_STATUS_FAIL 1 -#define NUM_CHANNELS_MONO 1 -#define NUM_CHANNELS_STEREO 2 -#define NUM_CHANNELS_THREE 3 -#define NUM_CHANNELS_QUAD 4 -#define CVP_VERSION_2 2 -#define GAIN_Q14_FORMAT(a) (a << 14) - -enum { - VOC_TOKEN_NONE, - VOIP_MEM_MAP_TOKEN, - VOC_CAL_MEM_MAP_TOKEN, - VOC_VOICE_HOST_PCM_MAP_TOKEN, - VOC_RTAC_MEM_MAP_TOKEN, - VOC_SOURCE_TRACKING_MEM_MAP_TOKEN -}; - -struct cvd_version_table cvd_version_table_mapping[CVD_INT_VERSION_MAX] = { - {CVD_VERSION_DEFAULT, CVD_INT_VERSION_DEFAULT}, - {CVD_VERSION_0_0, CVD_INT_VERSION_0_0}, - {CVD_VERSION_2_1, CVD_INT_VERSION_2_1}, - {CVD_VERSION_2_2, CVD_INT_VERSION_2_2}, - {CVD_VERSION_2_3, CVD_INT_VERSION_2_3}, - {CVD_VERSION_2_4, CVD_INT_VERSION_2_4}, -}; - -static struct common_data common; -static bool module_initialized; - -static int voice_send_enable_vocproc_cmd(struct voice_data *v); -static int voice_send_netid_timing_cmd(struct voice_data *v); -static int voice_send_attach_vocproc_cmd(struct voice_data *v); -static int voice_send_set_device_cmd(struct voice_data *v); -static int voice_send_vol_step_cmd(struct voice_data *v); -static int voice_send_mvm_unmap_memory_physical_cmd(struct voice_data *v, - uint32_t mem_handle); -static int voice_send_mvm_cal_network_cmd(struct voice_data *v); -static int voice_send_mvm_media_type_cmd(struct voice_data *v); -static int voice_send_mvm_cvd_version_cmd(struct voice_data *v); -static int voice_send_mvm_event_class_cmd(struct voice_data *v, - uint32_t event_id, - uint32_t class_id); -static int voice_send_cvs_data_exchange_mode_cmd(struct voice_data *v); -static int voice_send_cvs_packet_exchange_config_cmd(struct voice_data *v); -static int voice_set_packet_exchange_mode_and_config(uint32_t session_id, - uint32_t mode); - -static int voice_send_cvs_register_cal_cmd(struct voice_data *v); -static int voice_send_cvs_deregister_cal_cmd(struct voice_data *v); -static int voice_send_cvp_create_cmd(struct voice_data *v); -static int voice_send_cvp_register_dev_cfg_cmd(struct voice_data *v); -static int voice_send_cvp_deregister_dev_cfg_cmd(struct voice_data *v); -static int voice_send_cvp_register_cal_cmd(struct voice_data *v); -static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v); -static int voice_send_cvp_register_vol_cal_cmd(struct voice_data *v); -static int voice_send_cvp_deregister_vol_cal_cmd(struct voice_data *v); -static int voice_send_cvp_media_fmt_info_cmd(struct voice_data *v); -static int voice_send_cvp_device_channels_cmd(struct voice_data *v); -static int voice_send_cvp_media_format_cmd(struct voice_data *v, - uint32_t param_type); -static int voice_send_cvp_topology_commit_cmd(struct voice_data *v); -static int voice_send_cvp_channel_info_cmd(struct voice_data *v); -static int voice_send_cvp_channel_info_v2(struct voice_data *v, - uint32_t param_type); -static int voice_get_avcs_version_per_service(uint32_t service_id); - -static void voice_load_topo_modules(int cal_index); -static void voice_unload_topo_modules(void); - -static int voice_cvs_stop_playback(struct voice_data *v); -static int voice_cvs_start_playback(struct voice_data *v); -static int voice_cvs_start_record(struct voice_data *v, uint32_t rec_mode, - uint32_t port_id); -static int voice_cvs_stop_record(struct voice_data *v); - -static int32_t qdsp_mvm_callback(struct apr_client_data *data, void *priv); -static int32_t qdsp_cvs_callback(struct apr_client_data *data, void *priv); -static int32_t qdsp_cvp_callback(struct apr_client_data *data, void *priv); - -static int voice_send_set_pp_enable_cmd( - struct voice_data *v, struct module_instance_info mod_inst_info, - int enable); - -static int voice_send_cvp_ecns_enable_cmd(struct voice_data *v, - uint32_t module_id, int enable); - -static int is_cal_memory_allocated(void); -static bool is_cvd_version_queried(void); -static int is_voip_memory_allocated(void); -static int voice_get_cvd_int_version(char *cvd_ver_string); -static int voice_alloc_cal_mem_map_table(void); -static int voice_alloc_rtac_mem_map_table(void); -static int voice_alloc_oob_shared_mem(void); -static int voice_free_oob_shared_mem(void); -static int voice_alloc_oob_mem_table(void); -static int voice_alloc_and_map_oob_mem(struct voice_data *v); - -static struct voice_data *voice_get_session_by_idx(int idx); - -static int remap_cal_data(struct cal_block_data *cal_block, - uint32_t session_id); -static int voice_unmap_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block); - -static int is_source_tracking_shared_memomry_allocated(void); -static int voice_alloc_source_tracking_shared_memory(void); -static int voice_alloc_and_map_source_tracking_shared_memory( - struct voice_data *v); -static int voice_unmap_and_free_source_tracking_shared_memory( - struct voice_data *v); -static int voice_send_set_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param soundFocusData); -static int voice_send_get_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param *soundFocusData); -static int voice_send_get_source_tracking_cmd(struct voice_data *v, - struct source_tracking_param *sourceTrackingData); -static int voice_pack_and_set_cvp_param(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data); -static int voice_pack_and_set_cvs_ui_property(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data); - -static void voice_itr_init(struct voice_session_itr *itr, - u32 session_id) -{ - if (itr == NULL) - return; - itr->session_idx = voice_get_idx_for_session(session_id); - if (session_id == ALL_SESSION_VSID) - itr->cur_idx = 0; - else - itr->cur_idx = itr->session_idx; - -} - -static bool voice_itr_get_next_session(struct voice_session_itr *itr, - struct voice_data **voice) -{ - bool ret = false; - - if (itr == NULL) - return false; - pr_debug("%s : cur idx = %d session idx = %d\n", - __func__, itr->cur_idx, itr->session_idx); - - if (itr->cur_idx <= itr->session_idx) { - ret = true; - *voice = voice_get_session_by_idx(itr->cur_idx); - itr->cur_idx++; - } else { - *voice = NULL; - } - - return ret; -} - -static bool voice_is_valid_session_id(uint32_t session_id) -{ - bool ret = false; - - switch (session_id) { - case VOICE_SESSION_VSID: - case VOICE2_SESSION_VSID: - case VOLTE_SESSION_VSID: - case VOIP_SESSION_VSID: - case QCHAT_SESSION_VSID: - case VOWLAN_SESSION_VSID: - case VOICEMMODE1_VSID: - case VOICEMMODE2_VSID: - case ALL_SESSION_VSID: - ret = true; - break; - default: - pr_err("%s: Invalid session_id : %x\n", __func__, session_id); - - break; - } - - return ret; -} - -static u16 voice_get_mvm_handle(struct voice_data *v) -{ - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return 0; - } - - pr_debug("%s: mvm_handle %d\n", __func__, v->mvm_handle); - - return v->mvm_handle; -} - -static void voice_set_mvm_handle(struct voice_data *v, u16 mvm_handle) -{ - pr_debug("%s: mvm_handle %d\n", __func__, mvm_handle); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return; - } - - v->mvm_handle = mvm_handle; -} - -static u16 voice_get_cvs_handle(struct voice_data *v) -{ - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return 0; - } - - pr_debug("%s: cvs_handle %d\n", __func__, v->cvs_handle); - - return v->cvs_handle; -} - -static void voice_set_cvs_handle(struct voice_data *v, u16 cvs_handle) -{ - pr_debug("%s: cvs_handle %d\n", __func__, cvs_handle); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return; - } - - v->cvs_handle = cvs_handle; -} - -static u16 voice_get_cvp_handle(struct voice_data *v) -{ - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return 0; - } - - pr_debug("%s: cvp_handle %d\n", __func__, v->cvp_handle); - - return v->cvp_handle; -} - -static void voice_set_cvp_handle(struct voice_data *v, u16 cvp_handle) -{ - pr_debug("%s: cvp_handle %d\n", __func__, cvp_handle); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return; - } - - v->cvp_handle = cvp_handle; -} - -char *voc_get_session_name(u32 session_id) -{ - char *session_name = NULL; - - if (session_id == common.voice[VOC_PATH_PASSIVE].session_id) { - session_name = VOICE_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOLTE_PASSIVE].session_id) { - session_name = VOLTE_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_QCHAT_PASSIVE].session_id) { - session_name = QCHAT_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id) { - session_name = VOWLAN_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id) { - session_name = VOICEMMODE1_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id) { - session_name = VOICEMMODE2_NAME; - } else if (session_id == common.voice[VOC_PATH_FULL].session_id) { - session_name = VOIP_SESSION_NAME; - } - return session_name; -} - -/** - * voc_get_session_id - - * Get session ID of given voice session name - * - * @name: voice session name - * - * Returns session id for valid session or 0 if invalid. - */ -uint32_t voc_get_session_id(char *name) -{ - u32 session_id = 0; - - if (name != NULL) { - if (!strcmp(name, "Voice session")) - session_id = common.voice[VOC_PATH_PASSIVE].session_id; - else if (!strcmp(name, "Voice2 session")) - session_id = - common.voice[VOC_PATH_VOICE2_PASSIVE].session_id; - else if (!strcmp(name, "VoLTE session")) - session_id = - common.voice[VOC_PATH_VOLTE_PASSIVE].session_id; - else if (!strcmp(name, "QCHAT session")) - session_id = - common.voice[VOC_PATH_QCHAT_PASSIVE].session_id; - else if (!strcmp(name, "VoWLAN session")) - session_id = - common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id; - else if (!strcmp(name, "VoiceMMode1")) - session_id = - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id; - else if (!strcmp(name, "VoiceMMode2")) - session_id = - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id; - else - session_id = common.voice[VOC_PATH_FULL].session_id; - - pr_debug("%s: %s has session id 0x%x\n", __func__, name, - session_id); - } - - return session_id; -} -EXPORT_SYMBOL(voc_get_session_id); - -static struct voice_data *voice_get_session(u32 session_id) -{ - struct voice_data *v = NULL; - - switch (session_id) { - case VOICE_SESSION_VSID: - v = &common.voice[VOC_PATH_PASSIVE]; - break; - - case VOICE2_SESSION_VSID: - v = &common.voice[VOC_PATH_VOICE2_PASSIVE]; - break; - - case VOLTE_SESSION_VSID: - v = &common.voice[VOC_PATH_VOLTE_PASSIVE]; - break; - - case VOIP_SESSION_VSID: - v = &common.voice[VOC_PATH_FULL]; - break; - - case QCHAT_SESSION_VSID: - v = &common.voice[VOC_PATH_QCHAT_PASSIVE]; - break; - - case VOWLAN_SESSION_VSID: - v = &common.voice[VOC_PATH_VOWLAN_PASSIVE]; - break; - - case VOICEMMODE1_VSID: - v = &common.voice[VOC_PATH_VOICEMMODE1_PASSIVE]; - break; - - case VOICEMMODE2_VSID: - v = &common.voice[VOC_PATH_VOICEMMODE2_PASSIVE]; - break; - - case ALL_SESSION_VSID: - break; - - default: - pr_err("%s: Invalid session_id : %x\n", __func__, session_id); - - break; - } - - pr_debug("%s:session_id 0x%x session handle %pK\n", - __func__, session_id, v); - - return v; -} - -int voice_get_idx_for_session(u32 session_id) -{ - int idx = 0; - - switch (session_id) { - case VOICE_SESSION_VSID: - idx = VOC_PATH_PASSIVE; - break; - - case VOICE2_SESSION_VSID: - idx = VOC_PATH_VOICE2_PASSIVE; - break; - - case VOLTE_SESSION_VSID: - idx = VOC_PATH_VOLTE_PASSIVE; - break; - - case VOIP_SESSION_VSID: - idx = VOC_PATH_FULL; - break; - - case QCHAT_SESSION_VSID: - idx = VOC_PATH_QCHAT_PASSIVE; - break; - - case VOWLAN_SESSION_VSID: - idx = VOC_PATH_VOWLAN_PASSIVE; - break; - - case VOICEMMODE1_VSID: - idx = VOC_PATH_VOICEMMODE1_PASSIVE; - break; - - case VOICEMMODE2_VSID: - idx = VOC_PATH_VOICEMMODE2_PASSIVE; - break; - - case ALL_SESSION_VSID: - idx = MAX_VOC_SESSIONS - 1; - break; - - default: - pr_err("%s: Invalid session_id : %x\n", __func__, session_id); - - break; - } - - return idx; -} - -static struct voice_data *voice_get_session_by_idx(int idx) -{ - return ((idx < 0 || idx >= MAX_VOC_SESSIONS) ? - NULL : &common.voice[idx]); -} - -static bool is_voip_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_FULL].session_id); -} - -static bool is_volte_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_VOLTE_PASSIVE].session_id); -} - -static bool is_voice2_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_VOICE2_PASSIVE].session_id); -} - -static bool is_qchat_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_QCHAT_PASSIVE].session_id); -} - -static bool is_vowlan_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id); -} - -static bool is_voicemmode1(u32 session_id) -{ - return session_id == - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id; -} - -static bool is_voicemmode2(u32 session_id) -{ - return session_id == - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id; -} - -static bool is_voc_state_active(int voc_state) -{ - if ((voc_state == VOC_RUN) || - (voc_state == VOC_CHANGE) || - (voc_state == VOC_STANDBY)) - return true; - - return false; -} - -static void voc_set_error_state(uint16_t reset_proc) -{ - struct voice_data *v = NULL; - int i; - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - if (v != NULL) { - v->voc_state = VOC_ERROR; - v->rec_info.recording = 0; - } - } -} - -static bool is_other_session_active(u32 session_id) -{ - int i; - bool ret = false; - - /* Check if there is other active session except the input one */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - if (common.voice[i].session_id == session_id) - continue; - - if (is_voc_state_active(common.voice[i].voc_state)) { - ret = true; - break; - } - } - pr_debug("%s: ret %d\n", __func__, ret); - - return ret; -} - -static bool is_sub1_vsid(u32 session_id) -{ - bool ret; - - switch (session_id) { - case VOICE_SESSION_VSID: - case VOLTE_SESSION_VSID: - case VOWLAN_SESSION_VSID: - case VOICEMMODE1_VSID: - ret = true; - break; - default: - ret = false; - } - - return ret; -} - -static bool is_sub2_vsid(u32 session_id) -{ - bool ret; - - switch (session_id) { - case VOICE2_SESSION_VSID: - case VOICEMMODE2_VSID: - ret = true; - break; - default: - ret = false; - } - - return ret; -} - -static bool is_voice_app_id(u32 session_id) -{ - return is_sub1_vsid(session_id) || is_sub2_vsid(session_id); -} - -static void init_session_id(void) -{ - common.voice[VOC_PATH_PASSIVE].session_id = VOICE_SESSION_VSID; - common.voice[VOC_PATH_VOLTE_PASSIVE].session_id = VOLTE_SESSION_VSID; - common.voice[VOC_PATH_VOICE2_PASSIVE].session_id = VOICE2_SESSION_VSID; - common.voice[VOC_PATH_FULL].session_id = VOIP_SESSION_VSID; - common.voice[VOC_PATH_QCHAT_PASSIVE].session_id = QCHAT_SESSION_VSID; - common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id = VOWLAN_SESSION_VSID; - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id = - VOICEMMODE1_VSID; - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id = - VOICEMMODE2_VSID; -} - -static bool is_cvd_version_queried(void) -{ - bool ret = 0; - - if (!strcmp(common.cvd_version, CVD_VERSION_DEFAULT)) - ret = false; - else - ret = true; - - return ret; -} - -static int voice_get_cvd_int_version(char *cvd_ver_string) -{ - unsigned int idx; - int cvd_int_ver = CVD_INT_VERSION_DEFAULT; - - for (idx = 0; idx < CVD_INT_VERSION_MAX; idx++) { - if (strcmp((char *)cvd_ver_string, - cvd_version_table_mapping[idx].cvd_ver) == 0) { - cvd_int_ver = - cvd_version_table_mapping[idx].cvd_ver_int; - break; - } - } - return cvd_int_ver; -} - -static int voice_apr_register(uint32_t session_id) -{ - - pr_debug("%s\n", __func__); - - mutex_lock(&common.common_lock); - - /* register callback to APR */ - if (common.apr_q6_mvm == NULL) { - pr_debug("%s: Start to register MVM callback\n", __func__); - - common.apr_q6_mvm = apr_register("ADSP", "MVM", - qdsp_mvm_callback, - 0xFFFFFFFF, &common); - - if (common.apr_q6_mvm == NULL) { - pr_err("%s: Unable to register MVM\n", __func__); - goto err; - } - } - - if (common.apr_q6_cvs == NULL) { - pr_debug("%s: Start to register CVS callback\n", __func__); - - common.apr_q6_cvs = apr_register("ADSP", "CVS", - qdsp_cvs_callback, - 0xFFFFFFFF, &common); - - if (common.apr_q6_cvs == NULL) { - pr_err("%s: Unable to register CVS\n", __func__); - goto err; - } - rtac_set_voice_handle(RTAC_CVS, common.apr_q6_cvs); - } - - if (common.apr_q6_cvp == NULL) { - pr_debug("%s: Start to register CVP callback\n", __func__); - - common.apr_q6_cvp = apr_register("ADSP", "CVP", - qdsp_cvp_callback, - 0xFFFFFFFF, &common); - - if (common.apr_q6_cvp == NULL) { - pr_err("%s: Unable to register CVP\n", __func__); - goto err; - } - rtac_set_voice_handle(RTAC_CVP, common.apr_q6_cvp); - } - - mutex_unlock(&common.common_lock); - - return 0; - -err: - if (common.apr_q6_cvs != NULL) { - apr_deregister(common.apr_q6_cvs); - common.apr_q6_cvs = NULL; - rtac_set_voice_handle(RTAC_CVS, NULL); - } - if (common.apr_q6_mvm != NULL) { - apr_deregister(common.apr_q6_mvm); - common.apr_q6_mvm = NULL; - } - - mutex_unlock(&common.common_lock); - - return -ENODEV; -} - -static int voice_send_mvm_cvd_version_cmd(struct voice_data *v) -{ - int ret; - struct apr_hdr cvd_version_get_cmd; - void *apr_mvm; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - /* Send command to CVD to retrieve Version */ - cvd_version_get_cmd.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvd_version_get_cmd.pkt_size = APR_PKT_SIZE( - APR_HDR_SIZE, - sizeof(cvd_version_get_cmd) - - APR_HDR_SIZE); - cvd_version_get_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvd_version_get_cmd.dest_port = 0; - cvd_version_get_cmd.token = 0; - cvd_version_get_cmd.opcode = VSS_IVERSION_CMD_GET; - - pr_debug("%s: send CVD version get cmd, pkt size = %d\n", - __func__, cvd_version_get_cmd.pkt_size); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &cvd_version_get_cmd); - if (ret < 0) { - pr_err("%s: Error sending command\n", __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout, fall back to default\n", - __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - ret = 0; - -done: - if (ret) { - strlcpy(common.cvd_version, CVD_VERSION_0_0, - sizeof(common.cvd_version)); - } - pr_debug("%s: CVD Version retrieved=%s\n", - __func__, common.cvd_version); - - return ret; -} - -static int voice_send_mvm_event_class_cmd(struct voice_data *v, - uint32_t event_id, - uint32_t class_id) -{ - struct vss_inotify_cmd_event_class_t mvm_event; - int ret = 0; - void *apr_mvm = NULL; - u16 mvm_handle = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - - memset(&mvm_event, 0, sizeof(mvm_event)); - mvm_handle = voice_get_mvm_handle(v); - mvm_event.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_event.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_event) - APR_HDR_SIZE); - mvm_event.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_event.hdr.dest_port = mvm_handle; - mvm_event.hdr.token = 0; - mvm_event.hdr.opcode = event_id; - mvm_event.class_id = class_id; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_event); - if (ret < 0) { - pr_err("%s: Error %d sending %x event\n", __func__, ret, - event_id); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - ret = -ETIMEDOUT; - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_dual_control_cmd(struct voice_data *v) -{ - int ret = 0; - struct mvm_modem_dual_control_session_cmd mvm_voice_ctl_cmd; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - pr_debug("%s: Send Dual Control command to MVM\n", __func__); - if (!is_voip_session(v->session_id)) { - mvm_handle = voice_get_mvm_handle(v); - mvm_voice_ctl_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_voice_ctl_cmd.hdr.pkt_size = APR_PKT_SIZE( - APR_HDR_SIZE, - sizeof(mvm_voice_ctl_cmd) - - APR_HDR_SIZE); - pr_debug("%s: send mvm Voice Ctl pkt size = %d\n", - __func__, mvm_voice_ctl_cmd.hdr.pkt_size); - mvm_voice_ctl_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_voice_ctl_cmd.hdr.dest_port = mvm_handle; - mvm_voice_ctl_cmd.hdr.token = 0; - mvm_voice_ctl_cmd.hdr.opcode = - VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL; - mvm_voice_ctl_cmd.voice_ctl.enable_flag = true; - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_voice_ctl_cmd); - if (ret < 0) { - pr_err("%s: Error sending MVM Voice CTL CMD\n", - __func__); - ret = -EINVAL; - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -EINVAL; - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } - ret = 0; -fail: - return ret; -} - - -static int voice_create_mvm_cvs_session(struct voice_data *v) -{ - int ret = 0; - struct mvm_create_ctl_session_cmd mvm_session_cmd; - struct cvs_create_passive_ctl_session_cmd cvs_session_cmd; - struct cvs_create_full_ctl_session_cmd cvs_full_ctl_cmd; - struct mvm_attach_stream_cmd attach_stream_cmd; - void *apr_mvm, *apr_cvs, *apr_cvp; - u16 mvm_handle, cvs_handle, cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - apr_cvs = common.apr_q6_cvs; - apr_cvp = common.apr_q6_cvp; - - if (!apr_mvm || !apr_cvs || !apr_cvp) { - pr_err("%s: apr_mvm or apr_cvs or apr_cvp is NULL\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvs_handle = voice_get_cvs_handle(v); - cvp_handle = voice_get_cvp_handle(v); - - pr_debug("%s: mvm_hdl=%d, cvs_hdl=%d\n", __func__, - mvm_handle, cvs_handle); - /* send cmd to create mvm session and wait for response */ - - if (!mvm_handle) { - memset(mvm_session_cmd.mvm_session.name, 0, - sizeof(mvm_session_cmd.mvm_session.name)); - if (!is_voip_session(v->session_id)) { - mvm_session_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_session_cmd.hdr.pkt_size = APR_PKT_SIZE( - APR_HDR_SIZE, - sizeof(mvm_session_cmd) - - APR_HDR_SIZE); - pr_debug("%s: send mvm create session pkt size = %d\n", - __func__, mvm_session_cmd.hdr.pkt_size); - mvm_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_session_cmd.hdr.dest_port = 0; - mvm_session_cmd.hdr.token = 0; - mvm_session_cmd.hdr.opcode = - VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION; - if (is_volte_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - "default volte voice", - strlen("default volte voice")+1); - } else if (is_voice2_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOICE2_SESSION_VSID_STR, - strlen(VOICE2_SESSION_VSID_STR)+1); - } else if (is_qchat_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - QCHAT_SESSION_VSID_STR, - strlen(QCHAT_SESSION_VSID_STR)+1); - } else if (is_vowlan_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOWLAN_SESSION_VSID_STR, - strlen(VOWLAN_SESSION_VSID_STR)+1); - } else if (is_voicemmode1(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOICEMMODE1_VSID_STR, - strlen(VOICEMMODE1_VSID_STR) + 1); - } else if (is_voicemmode2(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOICEMMODE2_VSID_STR, - strlen(VOICEMMODE2_VSID_STR) + 1); - } else { - strlcpy(mvm_session_cmd.mvm_session.name, - "default modem voice", - strlen("default modem voice")+1); - } - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &mvm_session_cmd); - if (ret < 0) { - pr_err("%s: Error sending MVM_CONTROL_SESSION\n", - __func__); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } else { - pr_debug("%s: creating MVM full ctrl\n", __func__); - mvm_session_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_session_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_session_cmd) - - APR_HDR_SIZE); - mvm_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_session_cmd.hdr.dest_port = 0; - mvm_session_cmd.hdr.token = 0; - mvm_session_cmd.hdr.opcode = - VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION; - strlcpy(mvm_session_cmd.mvm_session.name, - "default voip", - strlen("default voip")+1); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &mvm_session_cmd); - if (ret < 0) { - pr_err("Fail in sending MVM_CONTROL_SESSION\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } - /* Get the created MVM handle. */ - mvm_handle = voice_get_mvm_handle(v); - } - /* send cmd to create cvs session */ - if (!cvs_handle) { - memset(cvs_session_cmd.cvs_session.name, 0, - sizeof(cvs_session_cmd.cvs_session.name)); - if (!is_voip_session(v->session_id)) { - pr_debug("%s: creating CVS passive session\n", - __func__); - - cvs_session_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_session_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_session_cmd) - - APR_HDR_SIZE); - cvs_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_session_cmd.hdr.dest_port = 0; - cvs_session_cmd.hdr.token = 0; - cvs_session_cmd.hdr.opcode = - VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION; - if (is_volte_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - "default volte voice", - strlen("default volte voice")+1); - } else if (is_voice2_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOICE2_SESSION_VSID_STR, - strlen(VOICE2_SESSION_VSID_STR)+1); - } else if (is_qchat_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - QCHAT_SESSION_VSID_STR, - strlen(QCHAT_SESSION_VSID_STR)+1); - } else if (is_vowlan_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOWLAN_SESSION_VSID_STR, - strlen(VOWLAN_SESSION_VSID_STR)+1); - } else if (is_voicemmode1(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOICEMMODE1_VSID_STR, - strlen(VOICEMMODE1_VSID_STR) + 1); - } else if (is_voicemmode2(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOICEMMODE2_VSID_STR, - strlen(VOICEMMODE2_VSID_STR) + 1); - } else { - strlcpy(cvs_session_cmd.cvs_session.name, - "default modem voice", - strlen("default modem voice")+1); - } - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, - (uint32_t *) &cvs_session_cmd); - if (ret < 0) { - pr_err("Fail in sending STREAM_CONTROL_SESSION\n"); - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - /* Get the created CVS handle. */ - cvs_handle = voice_get_cvs_handle(v); - - } else { - pr_debug("%s: creating CVS full session\n", __func__); - - cvs_full_ctl_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - - cvs_full_ctl_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_full_ctl_cmd) - - APR_HDR_SIZE); - - cvs_full_ctl_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_full_ctl_cmd.hdr.dest_port = 0; - cvs_full_ctl_cmd.hdr.token = 0; - cvs_full_ctl_cmd.hdr.opcode = - VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION; - cvs_full_ctl_cmd.cvs_session.direction = 2; - cvs_full_ctl_cmd.cvs_session.enc_media_type = - common.mvs_info.media_type; - cvs_full_ctl_cmd.cvs_session.dec_media_type = - common.mvs_info.media_type; - cvs_full_ctl_cmd.cvs_session.network_id = - common.mvs_info.network_type; - strlcpy(cvs_full_ctl_cmd.cvs_session.name, - "default q6 voice", - strlen("default q6 voice")+1); - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, - (uint32_t *) &cvs_full_ctl_cmd); - - if (ret < 0) { - pr_err("%s: Err %d sending CREATE_FULL_CTRL\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - /* Get the created CVS handle. */ - cvs_handle = voice_get_cvs_handle(v); - - /* Attach MVM to CVS. */ - pr_debug("%s: Attach MVM to stream\n", __func__); - - attach_stream_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - attach_stream_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(attach_stream_cmd) - - APR_HDR_SIZE); - attach_stream_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - attach_stream_cmd.hdr.dest_port = mvm_handle; - attach_stream_cmd.hdr.token = 0; - attach_stream_cmd.hdr.opcode = - VSS_IMVM_CMD_ATTACH_STREAM; - attach_stream_cmd.attach_stream.handle = cvs_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &attach_stream_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending ATTACH_STREAM\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } - } - return 0; - -fail: - return ret; -} - -static int voice_unmap_cal_block(struct voice_data *v, int cal_index) -{ - int result = 0; - struct cal_block_data *cal_block; - - if (common.cal_data[cal_index] == NULL) { - pr_err("%s: Cal type is NULL, index %d!\n", - __func__, cal_index); - - goto done; - } - - mutex_lock(&common.cal_data[cal_index]->lock); - cal_block = cal_utils_get_only_cal_block( - common.cal_data[cal_index]); - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL, index %d!\n", - __func__, cal_index); - - result = -EINVAL; - goto unlock; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_debug("%s: Q6 handle is not set!\n", __func__); - - result = -EINVAL; - goto unlock; - } - - result = voice_send_mvm_unmap_memory_physical_cmd( - v, cal_block->map_data.q6map_handle); - if (result) - pr_err("%s: Voice_send_mvm_unmap_memory_physical_cmd failed for session 0x%x, err %d!\n", - __func__, v->session_id, result); - - cal_block->map_data.q6map_handle = 0; -unlock: - mutex_unlock(&common.cal_data[cal_index]->lock); -done: - return result; -} - -static int voice_destroy_mvm_cvs_session(struct voice_data *v) -{ - int ret = 0; - struct mvm_detach_stream_cmd detach_stream; - struct apr_hdr mvm_destroy; - struct apr_hdr cvs_destroy; - void *apr_mvm, *apr_cvs; - u16 mvm_handle, cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - apr_cvs = common.apr_q6_cvs; - - if (!apr_mvm || !apr_cvs) { - pr_err("%s: apr_mvm or apr_cvs is NULL\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvs_handle = voice_get_cvs_handle(v); - - /* MVM, CVS sessions are destroyed only for Full control sessions. */ - if (is_voip_session(v->session_id)) { - pr_debug("%s: MVM detach stream, VOC_STATE: %d\n", __func__, - v->voc_state); - - /* Detach voice stream. */ - detach_stream.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - detach_stream.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(detach_stream) - APR_HDR_SIZE); - detach_stream.hdr.src_port = - voice_get_idx_for_session(v->session_id); - detach_stream.hdr.dest_port = mvm_handle; - detach_stream.hdr.token = 0; - detach_stream.hdr.opcode = VSS_IMVM_CMD_DETACH_STREAM; - detach_stream.detach_stream.handle = cvs_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &detach_stream); - if (ret < 0) { - pr_err("%s: Error %d sending DETACH_STREAM\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - /* Unmap memory */ - if (v->shmem_info.mem_handle != 0) { - ret = voice_send_mvm_unmap_memory_physical_cmd(v, - v->shmem_info.mem_handle); - if (ret < 0) { - pr_err("%s Memory_unmap for voip failed %d\n", - __func__, ret); - - goto fail; - } - v->shmem_info.mem_handle = 0; - } - } - - /* Unmap Source Tracking shared memory if mapped earlier */ - voice_unmap_and_free_source_tracking_shared_memory(v); - - if (is_voip_session(v->session_id) || - is_qchat_session(v->session_id) || - is_volte_session(v->session_id) || - is_vowlan_session(v->session_id) || - v->voc_state == VOC_ERROR || common.is_destroy_cvd) { - /* Destroy CVS. */ - pr_debug("%s: CVS destroy session\n", __func__); - - cvs_destroy.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_destroy.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_destroy) - APR_HDR_SIZE); - cvs_destroy.src_port = - voice_get_idx_for_session(v->session_id); - cvs_destroy.dest_port = cvs_handle; - cvs_destroy.token = 0; - cvs_destroy.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_destroy); - if (ret < 0) { - pr_err("%s: Error %d sending CVS DESTROY\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - cvs_handle = 0; - voice_set_cvs_handle(v, cvs_handle); - - /* Unmap physical memory for all calibration buffers */ - if (!is_other_session_active(v->session_id)) { - if (voice_unmap_cal_block(v, CVP_VOCPROC_CAL)) - pr_err("%s: Unmap VOCPROC cal failed\n", - __func__); - if (voice_unmap_cal_block(v, CVP_VOCVOL_CAL)) - pr_err("%s: Unmap VOCVOL cal failed\n", - __func__); - if (voice_unmap_cal_block(v, CVP_VOCDEV_CFG_CAL)) - pr_err("%s: Unmap VOCDEV_CFG cal failed\n", - __func__); - if (voice_unmap_cal_block(v, CVS_VOCSTRM_CAL)) - pr_err("%s: Unmap VOCSTRM cal failed\n", - __func__); - } - - /* Destroy MVM. */ - pr_debug("%s: MVM destroy session\n", __func__); - - mvm_destroy.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_destroy.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_destroy) - APR_HDR_SIZE); - mvm_destroy.src_port = - voice_get_idx_for_session(v->session_id); - mvm_destroy.dest_port = mvm_handle; - mvm_destroy.token = 0; - mvm_destroy.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_destroy); - if (ret < 0) { - pr_err("%s: Error %d sending MVM DESTROY\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - mvm_handle = 0; - voice_set_mvm_handle(v, mvm_handle); - } - return 0; -fail: - return ret; -} - -static int voice_send_tty_mode_cmd(struct voice_data *v) -{ - int ret = 0; - struct mvm_set_tty_mode_cmd mvm_tty_mode_cmd; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - /* send tty mode cmd to mvm */ - mvm_tty_mode_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_tty_mode_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_tty_mode_cmd) - - APR_HDR_SIZE); - pr_debug("%s: pkt size = %d\n", - __func__, mvm_tty_mode_cmd.hdr.pkt_size); - mvm_tty_mode_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_tty_mode_cmd.hdr.dest_port = mvm_handle; - mvm_tty_mode_cmd.hdr.token = 0; - mvm_tty_mode_cmd.hdr.opcode = VSS_ISTREAM_CMD_SET_TTY_MODE; - mvm_tty_mode_cmd.tty_mode.mode = v->tty_mode; - pr_debug("tty mode =%d\n", mvm_tty_mode_cmd.tty_mode.mode); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_tty_mode_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending SET_TTY_MODE\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_cvp_ecns_enable_cmd(struct voice_data *v, - uint32_t module_id, int enable) -{ - int ret; - struct cvp_set_channel_ecns_cmd_v2 cvp_set_ch_ecns_cmd; - void *apr_cvp; - u16 cvp_handle; - struct vss_icommon_param_data_ecns_t *cvp_config_param_data = - &cvp_set_ch_ecns_cmd. - cvp_set_ecns.param_data; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - memset(&cvp_set_ch_ecns_cmd, 0, - sizeof(cvp_set_ch_ecns_cmd)); - - cvp_set_ch_ecns_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_ch_ecns_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_ch_ecns_cmd) - APR_HDR_SIZE); - cvp_set_ch_ecns_cmd.hdr.src_svc = 0; - cvp_set_ch_ecns_cmd.hdr.src_domain = APR_DOMAIN_APPS; - cvp_set_ch_ecns_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_ch_ecns_cmd.hdr.dest_svc = 0; - cvp_set_ch_ecns_cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cvp_set_ch_ecns_cmd.hdr.dest_port = cvp_handle; - cvp_set_ch_ecns_cmd.hdr.token = 0; - cvp_set_ch_ecns_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2; - cvp_set_ch_ecns_cmd.cvp_set_ecns.mem_size = - sizeof(struct vss_icommon_param_data_ecns_t); - - cvp_config_param_data->module_id = module_id; - cvp_config_param_data->param_id = VOICE_PARAM_MOD_ENABLE; - cvp_config_param_data->param_size = MOD_ENABLE_PARAM_LEN; - cvp_config_param_data->reserved = 0; - cvp_config_param_data->enable = enable; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_ch_ecns_cmd); - - if (ret < 0) { - pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2 %d\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s] handle = %d\n", __func__, - adsp_err_get_err_str(v->async_err), cvp_handle); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - return ret; -} - -/** - * voc_set_ecns_enable - - * Command to set ECNS for voice module - * - * @session_id: voice session ID to send this command - * @module_id: voice module id - * @enable: enable/disable flag - * - * Returns 0 on success or error on failure - */ -int voc_set_ecns_enable(uint32_t session_id, uint32_t module_id, - uint32_t enable) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - return -EINVAL; - } - mutex_lock(&v->lock); - v->ecns_enable = enable; - v->ecns_module_id = module_id; - - if (is_voc_state_active(v->voc_state)) - ret = voice_send_cvp_ecns_enable_cmd(v, - v->ecns_module_id, v->ecns_enable); - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_set_ecns_enable); - -static int voice_send_set_pp_enable_cmd( - struct voice_data *v, struct module_instance_info mod_inst_info, - int enable) -{ - struct enable_param enable_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&enable_param, 0, sizeof(enable_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = mod_inst_info.module_id; - param_hdr.instance_id = mod_inst_info.instance_id; - param_hdr.param_id = VOICE_PARAM_MOD_ENABLE; - param_hdr.param_size = sizeof(enable_param); - enable_param.enable = enable ? 1 : 0; - - pr_debug("%s: module_id=%d, instance_id=%d, enable=%d\n", - __func__, mod_inst_info.module_id, mod_inst_info.instance_id, - enable); - - ret = voice_pack_and_set_cvs_ui_property(v, param_hdr, - (uint8_t *) &enable_param); - if (ret < 0) - pr_err("Fail: sending cvs set pp enable\n"); - - return ret; -} - -static int voice_send_hd_cmd(struct voice_data *v, int enable) -{ - struct mvm_set_hd_enable_cmd mvm_set_hd_cmd; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - mvm_handle = voice_get_mvm_handle(v); - if (!mvm_handle) { - pr_err("%s: mvm_handle is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mvm_set_hd_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_hd_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_hd_cmd) - - APR_HDR_SIZE); - mvm_set_hd_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - mvm_set_hd_cmd.hdr.dest_port = mvm_handle; - mvm_set_hd_cmd.hdr.token = 0; - - if (enable) - mvm_set_hd_cmd.hdr.opcode = VSS_IHDVOICE_CMD_ENABLE; - else - mvm_set_hd_cmd.hdr.opcode = VSS_IHDVOICE_CMD_DISABLE; - - pr_debug("%s: enable=%d\n", __func__, enable); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_hd_cmd); - if (ret < 0) { - pr_err("%s: Failed to sending mvm set HD Voice enable %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_set_dtx(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct cvs_set_enc_dtx_mode_cmd cvs_set_dtx; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - /* Set DTX */ - cvs_set_dtx.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_dtx.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_dtx) - APR_HDR_SIZE); - cvs_set_dtx.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_dtx.hdr.dest_port = cvs_handle; - cvs_set_dtx.hdr.token = 0; - cvs_set_dtx.hdr.opcode = VSS_ISTREAM_CMD_SET_ENC_DTX_MODE; - cvs_set_dtx.dtx_mode.enable = common.mvs_info.dtx_mode; - - pr_debug("%s: Setting DTX %d\n", __func__, common.mvs_info.dtx_mode); - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_dtx); - if (ret < 0) { - pr_err("%s: Error %d sending SET_DTX\n", __func__, ret); - return -EINVAL; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - return -EINVAL; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - return ret; - } - - return 0; -} - -static int voice_send_mvm_media_type_cmd(struct voice_data *v) -{ - struct vss_imvm_cmd_set_cal_media_type_t mvm_set_cal_media_type; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_set_cal_media_type.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_cal_media_type.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_cal_media_type) - - APR_HDR_SIZE); - mvm_set_cal_media_type.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_cal_media_type.hdr.dest_port = mvm_handle; - mvm_set_cal_media_type.hdr.token = 0; - mvm_set_cal_media_type.hdr.opcode = VSS_IMVM_CMD_SET_CAL_MEDIA_TYPE; - mvm_set_cal_media_type.media_id = common.mvs_info.media_type; - pr_debug("%s: setting media_id as %x\n", - __func__, mvm_set_cal_media_type.media_id); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_cal_media_type); - if (ret < 0) { - pr_err("%s: Error %d sending media type\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_dtmf_rx_detection_cmd(struct voice_data *v, - uint32_t enable) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct cvs_set_rx_dtmf_detection_cmd cvs_dtmf_rx_detection; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - /* Set SET_DTMF_RX_DETECTION */ - cvs_dtmf_rx_detection.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_dtmf_rx_detection.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_dtmf_rx_detection) - APR_HDR_SIZE); - cvs_dtmf_rx_detection.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_dtmf_rx_detection.hdr.dest_port = cvs_handle; - cvs_dtmf_rx_detection.hdr.token = 0; - cvs_dtmf_rx_detection.hdr.opcode = - VSS_ISTREAM_CMD_SET_RX_DTMF_DETECTION; - cvs_dtmf_rx_detection.cvs_dtmf_det.enable = enable; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_dtmf_rx_detection); - if (ret < 0) { - pr_err("%s: Error %d sending SET_DTMF_RX_DETECTION\n", - __func__, - ret); - return -EINVAL; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - return -EINVAL; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - return ret; - } - - return ret; -} - -/** - * voc_disable_dtmf_det_on_active_sessions - - * command to disable DTMF detection for voice sessions - * - */ -void voc_disable_dtmf_det_on_active_sessions(void) -{ - struct voice_data *v = NULL; - int i; - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - if ((v->dtmf_rx_detect_en) && - is_voc_state_active(v->voc_state)) { - - pr_debug("disable dtmf det on ses_id=%d\n", - v->session_id); - voice_send_dtmf_rx_detection_cmd(v, 0); - } - } -} -EXPORT_SYMBOL(voc_disable_dtmf_det_on_active_sessions); - -/** - * voc_enable_dtmf_rx_detection - - * command to set DTMF RX detection - * - * @session_id: voice session ID to send this command - * @enable: Enable or Disable detection - * - * Returns 0 on success or error on failure - */ -int voc_enable_dtmf_rx_detection(uint32_t session_id, uint32_t enable) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - return -EINVAL; - } - - mutex_lock(&v->lock); - v->dtmf_rx_detect_en = enable; - - if (is_voc_state_active(v->voc_state)) - ret = voice_send_dtmf_rx_detection_cmd(v, - v->dtmf_rx_detect_en); - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_enable_dtmf_rx_detection); - -/** - * voc_set_destroy_cvd_flag - - * set flag for destroy CVD session - * - * @is_destroy_cvd: bool value used to indicate - * destroy CVD session or not. - * - */ -void voc_set_destroy_cvd_flag(bool is_destroy_cvd) -{ - pr_debug("%s: %d\n", __func__, is_destroy_cvd); - common.is_destroy_cvd = is_destroy_cvd; -} -EXPORT_SYMBOL(voc_set_destroy_cvd_flag); - -/** - * voc_alloc_cal_shared_memory - - * Alloc mem map table for calibration - * - * Returns 0 on success or error on failure - */ -int voc_alloc_cal_shared_memory(void) -{ - int rc = 0; - - mutex_lock(&common.common_lock); - if (is_cal_memory_allocated()) { - pr_debug("%s: Calibration shared buffer already allocated", - __func__); - } else { - /* Allocate memory for calibration memory map table. */ - rc = voice_alloc_cal_mem_map_table(); - if ((rc < 0) && (rc != -EPROBE_DEFER)) { - pr_err("%s: Failed to allocate cal memory, err=%d", - __func__, rc); - } - } - mutex_unlock(&common.common_lock); - - return rc; -} -EXPORT_SYMBOL(voc_alloc_cal_shared_memory); - -/** - * voc_alloc_voip_shared_memory - - * Alloc mem map table for OOB - * - * Returns 0 on success or error on failure - */ -int voc_alloc_voip_shared_memory(void) -{ - int rc = 0; - - /* Allocate shared memory for OOB Voip */ - rc = voice_alloc_oob_shared_mem(); - if (rc < 0) { - pr_err("%s: Failed to alloc shared memory for OOB rc:%d\n", - __func__, rc); - } else { - /* Allocate mem map table for OOB */ - rc = voice_alloc_oob_mem_table(); - if (rc < 0) { - pr_err("%s: Failed to alloc mem map talbe rc:%d\n", - __func__, rc); - - voice_free_oob_shared_mem(); - } - } - - return rc; -} -EXPORT_SYMBOL(voc_alloc_voip_shared_memory); - -static int is_cal_memory_allocated(void) -{ - bool ret; - - if (common.cal_mem_map_table.dma_buf != NULL) - ret = true; - else - ret = false; - - return ret; -} - - -static int free_cal_map_table(void) -{ - int ret = 0; - - if (common.cal_mem_map_table.dma_buf == NULL) - goto done; - - ret = msm_audio_ion_free(common.cal_mem_map_table.dma_buf); - if (ret < 0) - pr_err("%s: msm_audio_ion_free failed:\n", __func__); - -done: - common.cal_mem_map_table.dma_buf = NULL; - return ret; -} - -static int is_rtac_memory_allocated(void) -{ - bool ret; - - if (common.rtac_mem_map_table.dma_buf != NULL) - ret = true; - else - ret = false; - - return ret; -} - -static int free_rtac_map_table(void) -{ - int ret = 0; - - if (common.rtac_mem_map_table.dma_buf == NULL) - goto done; - - ret = msm_audio_ion_free(common.rtac_mem_map_table.dma_buf); - if (ret < 0) - pr_err("%s: msm_audio_ion_free failed:\n", __func__); - -done: - common.rtac_mem_map_table.dma_buf = NULL; - return ret; -} - - -static int is_voip_memory_allocated(void) -{ - bool ret; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - if (v == NULL) { - pr_err("%s: v is NULL, session_id:%d\n", __func__, - common.voice[VOC_PATH_FULL].session_id); - - ret = false; - goto done; - } - - mutex_lock(&common.common_lock); - if (v->shmem_info.sh_buf.dma_buf != NULL) - ret = true; - else - ret = false; - mutex_unlock(&common.common_lock); - -done: - return ret; -} - -static int voice_config_cvs_vocoder_amr_rate(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct cvs_set_amr_enc_rate_cmd cvs_set_amr_rate; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvs_handle = voice_get_cvs_handle(v); - - pr_debug("%s: Setting AMR rate. Media Type: %d\n", __func__, - common.mvs_info.media_type); - - cvs_set_amr_rate.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_amr_rate.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_amr_rate) - APR_HDR_SIZE); - cvs_set_amr_rate.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_amr_rate.hdr.dest_port = cvs_handle; - cvs_set_amr_rate.hdr.token = 0; - - if (common.mvs_info.media_type == VSS_MEDIA_ID_AMR_NB_MODEM) - cvs_set_amr_rate.hdr.opcode = - VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE; - else if (common.mvs_info.media_type == VSS_MEDIA_ID_AMR_WB_MODEM) - cvs_set_amr_rate.hdr.opcode = - VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE; - - cvs_set_amr_rate.amr_rate.mode = common.mvs_info.rate; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_amr_rate); - if (ret < 0) { - pr_err("%s: Error %d sending SET_AMR_RATE\n", - __func__, ret); - - goto done; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - return 0; -done: - return ret; -} - -static int voice_config_cvs_vocoder(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - /* Set media type. */ - struct cvs_set_media_type_cmd cvs_set_media_cmd; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - cvs_set_media_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_media_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_media_cmd) - - APR_HDR_SIZE); - cvs_set_media_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_media_cmd.hdr.dest_port = cvs_handle; - cvs_set_media_cmd.hdr.token = 0; - cvs_set_media_cmd.hdr.opcode = VSS_ISTREAM_CMD_SET_MEDIA_TYPE; - cvs_set_media_cmd.media_type.tx_media_id = common.mvs_info.media_type; - cvs_set_media_cmd.media_type.rx_media_id = common.mvs_info.media_type; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_media_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending SET_MEDIA_TYPE\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - /* Set encoder properties. */ - switch (common.mvs_info.media_type) { - case VSS_MEDIA_ID_EVRC_MODEM: - case VSS_MEDIA_ID_4GV_NB_MODEM: - case VSS_MEDIA_ID_4GV_WB_MODEM: - case VSS_MEDIA_ID_4GV_NW_MODEM: { - struct cvs_set_cdma_enc_minmax_rate_cmd cvs_set_cdma_rate; - - pr_debug("Setting EVRC min-max rate\n"); - - cvs_set_cdma_rate.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_cdma_rate.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_cdma_rate) - APR_HDR_SIZE); - cvs_set_cdma_rate.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_cdma_rate.hdr.dest_port = cvs_handle; - cvs_set_cdma_rate.hdr.token = 0; - cvs_set_cdma_rate.hdr.opcode = - VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE; - cvs_set_cdma_rate.cdma_rate.min_rate = - common.mvs_info.evrc_min_rate; - cvs_set_cdma_rate.cdma_rate.max_rate = - common.mvs_info.evrc_max_rate; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_cdma_rate); - if (ret < 0) { - pr_err("%s: Error %d sending SET_EVRC_MINMAX_RATE\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - if (common.mvs_info.media_type != VSS_MEDIA_ID_EVRC_MODEM) { - ret = voice_set_dtx(v); - if (ret < 0) - goto fail; - } - - break; - } - case VSS_MEDIA_ID_AMR_NB_MODEM: - case VSS_MEDIA_ID_AMR_WB_MODEM: { - ret = voice_config_cvs_vocoder_amr_rate(v); - if (ret) { - pr_err("%s: Failed to update vocoder rate. %d\n", - __func__, ret); - - goto fail; - } - - ret = voice_set_dtx(v); - if (ret < 0) - goto fail; - - break; - } - case VSS_MEDIA_ID_G729: - case VSS_MEDIA_ID_G711_ALAW: - case VSS_MEDIA_ID_G711_MULAW: { - ret = voice_set_dtx(v); - - break; - } - default: - /* Do nothing. */ - break; - } - return 0; - -fail: - return ret; -} - -/** - * voc_update_amr_vocoder_rate - - * command to update AMR rate for voice session - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_update_amr_vocoder_rate(uint32_t session_id) -{ - int ret = 0; - struct voice_data *v; - - pr_debug("%s: session_id:%d", __func__, session_id); - - v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: v is NULL, session_id:%d\n", __func__, - session_id); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&v->lock); - ret = voice_config_cvs_vocoder_amr_rate(v); - mutex_unlock(&v->lock); - -done: - return ret; -} -EXPORT_SYMBOL(voc_update_amr_vocoder_rate); - -static int voice_send_start_voice_cmd(struct voice_data *v) -{ - struct apr_hdr mvm_start_voice_cmd; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_start_voice_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_start_voice_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_start_voice_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_start_voice_cmd pkt size = %d\n", - mvm_start_voice_cmd.pkt_size); - mvm_start_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_start_voice_cmd.dest_port = mvm_handle; - mvm_start_voice_cmd.token = 0; - mvm_start_voice_cmd.opcode = VSS_IMVM_CMD_START_VOICE; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_start_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_START_VOICE\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static void voc_get_tx_rx_topology(struct voice_data *v, - uint32_t *tx_topology_id, - uint32_t *rx_topology_id) -{ - uint32_t tx_id = 0; - uint32_t rx_id = 0; - - if (v->lch_mode == VOICE_LCH_START || v->disable_topology) { - pr_debug("%s: Setting TX and RX topology to NONE for LCH\n", - __func__); - - tx_id = VSS_IVOCPROC_TOPOLOGY_ID_NONE; - rx_id = VSS_IVOCPROC_TOPOLOGY_ID_NONE; - } else { - tx_id = voice_get_topology(CVP_VOC_TX_TOPOLOGY_CAL); - rx_id = voice_get_topology(CVP_VOC_RX_TOPOLOGY_CAL); - } - - *tx_topology_id = tx_id; - *rx_topology_id = rx_id; -} - -static int voice_send_set_device_cmd(struct voice_data *v) -{ - struct cvp_set_device_cmd cvp_setdev_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - cvp_handle = voice_get_cvp_handle(v); - - /* set device and wait for response */ - cvp_setdev_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_setdev_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_setdev_cmd) - APR_HDR_SIZE); - pr_debug(" send create cvp setdev, pkt size = %d\n", - cvp_setdev_cmd.hdr.pkt_size); - cvp_setdev_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_setdev_cmd.hdr.dest_port = cvp_handle; - cvp_setdev_cmd.hdr.token = 0; - - if (voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2) - cvp_setdev_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_SET_DEVICE_V3; - else - cvp_setdev_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_SET_DEVICE_V2; - - voc_get_tx_rx_topology(v, - &cvp_setdev_cmd.cvp_set_device_v2.tx_topology_id, - &cvp_setdev_cmd.cvp_set_device_v2.rx_topology_id); - - voice_set_topology_specific_info(v, CVP_VOC_RX_TOPOLOGY_CAL); - voice_set_topology_specific_info(v, CVP_VOC_TX_TOPOLOGY_CAL); - - cvp_setdev_cmd.cvp_set_device_v2.tx_port_id = v->dev_tx.port_id; - cvp_setdev_cmd.cvp_set_device_v2.rx_port_id = v->dev_rx.port_id; - - if (common.ec_ref_ext) { - cvp_setdev_cmd.cvp_set_device_v2.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING; - cvp_setdev_cmd.cvp_set_device_v2.ec_ref_port_id = - common.ec_media_fmt_info.port_id; - } else { - cvp_setdev_cmd.cvp_set_device_v2.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING; - cvp_setdev_cmd.cvp_set_device_v2.ec_ref_port_id = - VSS_IVOCPROC_PORT_ID_NONE; - } - pr_debug("topology=%d , tx_port_id=%d, rx_port_id=%d\n", - cvp_setdev_cmd.cvp_set_device_v2.tx_topology_id, - cvp_setdev_cmd.cvp_set_device_v2.tx_port_id, - cvp_setdev_cmd.cvp_set_device_v2.rx_port_id); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_setdev_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IVOCPROC_CMD_SET_DEVICE\n"); - goto fail; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_stop_voice_cmd(struct voice_data *v) -{ - struct apr_hdr mvm_stop_voice_cmd; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_stop_voice_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_stop_voice_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_stop_voice_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_stop_voice_cmd pkt size = %d\n", - mvm_stop_voice_cmd.pkt_size); - mvm_stop_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_stop_voice_cmd.dest_port = mvm_handle; - mvm_stop_voice_cmd.token = 0; - mvm_stop_voice_cmd.opcode = VSS_IMVM_CMD_STOP_VOICE; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_stop_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_STOP_VOICE\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} -static int voice_get_cal(struct cal_block_data **cal_block, - int cal_block_idx, - struct cal_block_data **col_data, - int col_data_idx, int session_id) -{ - int ret = 0; - - *cal_block = cal_utils_get_only_cal_block( - common.cal_data[cal_block_idx]); - if (*cal_block == NULL) { - pr_err("%s: No cal data for cal %d!\n", - __func__, cal_block_idx); - - ret = -ENODEV; - goto done; - } - ret = remap_cal_data(*cal_block, session_id); - if (ret < 0) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_block_idx); - - ret = -ENODEV; - goto done; - } - - if (col_data == NULL) - goto done; - - *col_data = cal_utils_get_only_cal_block( - common.cal_data[col_data_idx]); - if (*col_data == NULL) { - pr_err("%s: No cal data for cal %d!\n", - __func__, col_data_idx); - - ret = -ENODEV; - goto done; - } -done: - return ret; -} - -static int voice_send_cvs_register_cal_cmd(struct voice_data *v) -{ - struct cvs_register_cal_data_cmd cvs_reg_cal_cmd; - struct cal_block_data *cal_block = NULL; - struct cal_block_data *col_data = NULL; - int ret = 0; - - memset(&cvs_reg_cal_cmd, 0, sizeof(cvs_reg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[CVS_VOCSTRM_CAL]->lock); - mutex_lock(&common.cal_data[CVS_VOCSTRM_COL_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVS_VOCSTRM_CAL, &col_data, - CVS_VOCSTRM_COL_CAL, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVS_VOCSTRM_CAL); - - goto unlock; - } - - memcpy(&cvs_reg_cal_cmd.cvs_cal_data.column_info[0], - (void *) &((struct audio_cal_info_voc_col *) - col_data->cal_info)->data, - col_data->cal_data.size); - - cvs_reg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_reg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_reg_cal_cmd) - APR_HDR_SIZE); - cvs_reg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_reg_cal_cmd.hdr.dest_port = voice_get_cvs_handle(v); - cvs_reg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvs_reg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_REGISTER_STATIC_CALIBRATION_DATA; - else - cvs_reg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_REGISTER_CALIBRATION_DATA_V2; - - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_handle = - cal_block->map_data.q6map_handle; - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_size = - cal_block->cal_data.size; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_reg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVS cal\n", __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVS_VOCSTRM_COL_CAL]->lock); - mutex_unlock(&common.cal_data[CVS_VOCSTRM_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvs_deregister_cal_cmd(struct voice_data *v) -{ - struct cvs_deregister_cal_data_cmd cvs_dereg_cal_cmd; - int ret = 0; - - memset(&cvs_dereg_cal_cmd, 0, sizeof(cvs_dereg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - cvs_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_dereg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_dereg_cal_cmd) - APR_HDR_SIZE); - cvs_dereg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_dereg_cal_cmd.hdr.dest_port = voice_get_cvs_handle(v); - cvs_dereg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvs_dereg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_DEREGISTER_STATIC_CALIBRATION_DATA; - else - cvs_dereg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_DEREGISTER_CALIBRATION_DATA; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_dereg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVS cal\n", __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; - -} - -static void voice_load_topo_modules(int cal_index) -{ - uint32_t topology_id; - int ret; - - topology_id = voice_get_topology(cal_index); - ret = q6core_load_unload_topo_modules(topology_id, CORE_LOAD_TOPOLOGY); - if (ret < 0) - pr_debug("%s ret:%d load topo modules %d failed\n", - __func__, ret, topology_id); - -} - -static void voice_unload_topo_modules(void) -{ - uint32_t topology_id; - int i, ret; - - for (i = CVP_VOC_RX_TOPOLOGY_CAL; i <= CVP_VOC_TX_TOPOLOGY_CAL; i++) { - topology_id = voice_get_topology(i); - ret = q6core_load_unload_topo_modules(topology_id, - CORE_UNLOAD_TOPOLOGY); - if (ret < 0) { - pr_debug("%s ret:%d unload topo modules %d failed\n", - __func__, ret, topology_id); - } - } -} - -static int voice_send_cvp_create_cmd(struct voice_data *v) -{ - struct cvp_create_full_ctl_session_cmd cvp_session_cmd; - void *apr_cvp; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - /* create cvp session and wait for response */ - cvp_session_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_session_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_session_cmd) - APR_HDR_SIZE); - pr_debug("%s: send create cvp session, pkt size = %d\n", - __func__, cvp_session_cmd.hdr.pkt_size); - cvp_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_session_cmd.hdr.dest_port = 0; - cvp_session_cmd.hdr.token = 0; - - if (voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2) - cvp_session_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V3; - else - cvp_session_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2; - - voc_get_tx_rx_topology(v, - &cvp_session_cmd.cvp_session.tx_topology_id, - &cvp_session_cmd.cvp_session.rx_topology_id); - - voice_set_topology_specific_info(v, CVP_VOC_RX_TOPOLOGY_CAL); - voice_set_topology_specific_info(v, CVP_VOC_TX_TOPOLOGY_CAL); - - cvp_session_cmd.cvp_session.direction = 2; /*tx and rx*/ - cvp_session_cmd.cvp_session.tx_port_id = v->dev_tx.port_id; - cvp_session_cmd.cvp_session.rx_port_id = v->dev_rx.port_id; - cvp_session_cmd.cvp_session.profile_id = - VSS_ICOMMON_CAL_NETWORK_ID_NONE; - if (common.ec_ref_ext) { - cvp_session_cmd.cvp_session.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING; - cvp_session_cmd.cvp_session.ec_ref_port_id = - common.ec_media_fmt_info.port_id; - } else { - cvp_session_cmd.cvp_session.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING; - cvp_session_cmd.cvp_session.ec_ref_port_id = - VSS_IVOCPROC_PORT_ID_NONE; - } - - pr_debug("tx_topology: %d tx_port_id=%d, rx_port_id=%d, mode: 0x%x\n", - cvp_session_cmd.cvp_session.tx_topology_id, - cvp_session_cmd.cvp_session.tx_port_id, - cvp_session_cmd.cvp_session.rx_port_id, - cvp_session_cmd.cvp_session.vocproc_mode); - pr_debug("rx_topology: %d, profile_id: 0x%x, pkt_size: %d\n", - cvp_session_cmd.cvp_session.rx_topology_id, - cvp_session_cmd.cvp_session.profile_id, - cvp_session_cmd.hdr.pkt_size); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_session_cmd); - if (ret < 0) { - pr_err("Fail in sending VOCPROC_FULL_CONTROL_SESSION\n"); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_register_dev_cfg_cmd(struct voice_data *v) -{ - struct cvp_register_dev_cfg_cmd cvp_reg_dev_cfg_cmd; - struct cal_block_data *cal_block = NULL; - int ret = 0; - - memset(&cvp_reg_dev_cfg_cmd, 0, sizeof(cvp_reg_dev_cfg_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - mutex_lock(&common.cal_data[CVP_VOCDEV_CFG_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVP_VOCDEV_CFG_CAL, NULL, - 0, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVP_VOCDEV_CFG_CAL); - - goto unlock; - } - - cvp_reg_dev_cfg_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_reg_dev_cfg_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_reg_dev_cfg_cmd) - APR_HDR_SIZE); - cvp_reg_dev_cfg_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_reg_dev_cfg_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_reg_dev_cfg_cmd.hdr.token = 0; - cvp_reg_dev_cfg_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_DEVICE_CONFIG; - - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_handle = - cal_block->map_data.q6map_handle; - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_size = - cal_block->cal_data.size; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_reg_dev_cfg_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVP dev cfg cal\n", - __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVP_VOCDEV_CFG_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvp_deregister_dev_cfg_cmd(struct voice_data *v) -{ - struct cvp_deregister_dev_cfg_cmd cvp_dereg_dev_cfg_cmd; - int ret = 0; - - memset(&cvp_dereg_dev_cfg_cmd, 0, sizeof(cvp_dereg_dev_cfg_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - cvp_dereg_dev_cfg_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_dereg_dev_cfg_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_dereg_dev_cfg_cmd) - APR_HDR_SIZE); - cvp_dereg_dev_cfg_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_dereg_dev_cfg_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_dereg_dev_cfg_cmd.hdr.token = 0; - cvp_dereg_dev_cfg_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_DEVICE_CONFIG; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_dereg_dev_cfg_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVP dev cfg cal\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_register_cal_cmd(struct voice_data *v) -{ - struct cvp_register_cal_data_cmd cvp_reg_cal_cmd; - struct cal_block_data *cal_block = NULL; - struct cal_block_data *col_data = NULL; - int ret = 0; - - memset(&cvp_reg_cal_cmd, 0, sizeof(cvp_reg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); - mutex_lock(&common.cal_data[CVP_VOCPROC_COL_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVP_VOCPROC_CAL, &col_data, - CVP_VOCPROC_COL_CAL, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVP_VOCPROC_CAL); - - goto unlock; - } - - v->dev_tx.dev_id = ((struct audio_cal_info_vocproc *) - cal_block->cal_info)->tx_acdb_id; - v->dev_rx.dev_id = ((struct audio_cal_info_vocproc *) - cal_block->cal_info)->rx_acdb_id; - pr_debug("%s: %s: Tx acdb id = %d and Rx acdb id = %d", __func__, - voc_get_session_name(v->session_id), v->dev_tx.dev_id, - v->dev_rx.dev_id); - - memcpy(&cvp_reg_cal_cmd.cvp_cal_data.column_info[0], - (void *) &((struct audio_cal_info_voc_col *) - col_data->cal_info)->data, - col_data->cal_data.size); - - cvp_reg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_reg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_reg_cal_cmd) - APR_HDR_SIZE); - cvp_reg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_reg_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_reg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_reg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_STATIC_CALIBRATION_DATA; - else - cvp_reg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_CALIBRATION_DATA_V2; - - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_handle = - cal_block->map_data.q6map_handle; - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_size = - cal_block->cal_data.size; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_reg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVP cal\n", __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVP_VOCPROC_COL_CAL]->lock); - mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v) -{ - struct cvp_deregister_cal_data_cmd cvp_dereg_cal_cmd; - int ret = 0; - - memset(&cvp_dereg_cal_cmd, 0, sizeof(cvp_dereg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EPERM; - goto done; - } - - cvp_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_dereg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_dereg_cal_cmd) - APR_HDR_SIZE); - cvp_dereg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_dereg_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_dereg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_dereg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_STATIC_CALIBRATION_DATA; - else - cvp_dereg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_CALIBRATION_DATA; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_dereg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVP cal\n", __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_register_vol_cal_cmd(struct voice_data *v) -{ - struct cvp_register_vol_cal_data_cmd cvp_reg_vol_cal_cmd; - struct cal_block_data *cal_block = NULL; - struct cal_block_data *col_data = NULL; - int ret = 0; - - memset(&cvp_reg_vol_cal_cmd, 0, sizeof(cvp_reg_vol_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[CVP_VOCVOL_CAL]->lock); - mutex_lock(&common.cal_data[CVP_VOCVOL_COL_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVP_VOCVOL_CAL, &col_data, - CVP_VOCVOL_COL_CAL, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVP_VOCVOL_CAL); - - goto unlock; - } - - memcpy(&cvp_reg_vol_cal_cmd.cvp_vol_cal_data.column_info[0], - (void *) &((struct audio_cal_info_voc_col *) - col_data->cal_info)->data, - col_data->cal_data.size); - - cvp_reg_vol_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_reg_vol_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_reg_vol_cal_cmd) - APR_HDR_SIZE); - cvp_reg_vol_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_reg_vol_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_reg_vol_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_reg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_DYNAMIC_CALIBRATION_DATA; - else - cvp_reg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_VOL_CALIBRATION_DATA; - - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_handle = - cal_block->map_data.q6map_handle; - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_size = - cal_block->cal_data.size; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_reg_vol_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVP vol cal\n", __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVP_VOCVOL_COL_CAL]->lock); - mutex_unlock(&common.cal_data[CVP_VOCVOL_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvp_deregister_vol_cal_cmd(struct voice_data *v) -{ - struct cvp_deregister_vol_cal_data_cmd cvp_dereg_vol_cal_cmd; - int ret = 0; - - memset(&cvp_dereg_vol_cal_cmd, 0, sizeof(cvp_dereg_vol_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - cvp_dereg_vol_cal_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_dereg_vol_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_dereg_vol_cal_cmd) - APR_HDR_SIZE); - cvp_dereg_vol_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_dereg_vol_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_dereg_vol_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_dereg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_DYNAMIC_CALIBRATION_DATA; - else - cvp_dereg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_VOL_CALIBRATION_DATA; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_dereg_vol_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVP vol cal\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_map_memory_physical_cmd(struct voice_data *v, - struct mem_map_table *table_info, - dma_addr_t phys, - uint32_t size, - uint32_t token) -{ - struct vss_imemory_cmd_map_physical_t mvm_map_phys_cmd; - uint32_t *memtable; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!common.apr_q6_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!table_info->data) { - pr_err("%s: memory table is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - memtable = (uint32_t *) table_info->data; - - /* - * Store next table descriptor's address(64 bit) as NULL as there - * is only one memory block - */ - memtable[0] = 0; - memtable[1] = 0; - - /* Store next table descriptor's size */ - memtable[2] = 0; - - /* Store shared mem adddress (64 bit) */ - memtable[3] = lower_32_bits(phys); - memtable[4] = msm_audio_populate_upper_32_bits(phys); - - /* Store shared memory size */ - memtable[5] = size; - - mvm_map_phys_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_map_phys_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_map_phys_cmd) - APR_HDR_SIZE); - mvm_map_phys_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_map_phys_cmd.hdr.dest_port = voice_get_mvm_handle(v); - mvm_map_phys_cmd.hdr.token = token; - mvm_map_phys_cmd.hdr.opcode = VSS_IMEMORY_CMD_MAP_PHYSICAL; - - mvm_map_phys_cmd.table_descriptor.mem_address_lsw = - lower_32_bits(table_info->phys); - mvm_map_phys_cmd.table_descriptor.mem_address_msw = - msm_audio_populate_upper_32_bits(table_info->phys); - mvm_map_phys_cmd.table_descriptor.mem_size = - sizeof(struct vss_imemory_block_t) + - sizeof(struct vss_imemory_table_descriptor_t); - mvm_map_phys_cmd.is_cached = true; - mvm_map_phys_cmd.cache_line_size = 128; - mvm_map_phys_cmd.access_mask = 3; - mvm_map_phys_cmd.page_align = 4096; - mvm_map_phys_cmd.min_data_width = 8; - mvm_map_phys_cmd.max_data_width = 64; - - pr_debug("%s: next table desc: add: %lld, size: %d\n", - __func__, *((uint64_t *) memtable), - *(((uint32_t *) memtable) + 2)); - pr_debug("%s: phy add of of mem being mapped LSW:0x%x, MSW:0x%x size: %d\n", - __func__, *(((uint32_t *) memtable) + 3), - *(((uint32_t *) memtable) + 4), *(((uint32_t *) memtable) + 5)); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_mvm, (uint32_t *) &mvm_map_phys_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending mvm map phy cmd\n", __func__, ret); - - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; - -fail: - return ret; -} - -static int voice_pause_voice_call(struct voice_data *v) -{ - struct apr_hdr mvm_pause_voice_cmd; - void *apr_mvm; - int ret = 0; - - pr_debug("%s\n", __func__); - - if (v == NULL) { - pr_err("%s: Voice data is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - mvm_pause_voice_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_pause_voice_cmd.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_pause_voice_cmd) - APR_HDR_SIZE); - mvm_pause_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_pause_voice_cmd.dest_port = voice_get_mvm_handle(v); - mvm_pause_voice_cmd.token = 0; - mvm_pause_voice_cmd.opcode = VSS_IMVM_CMD_PAUSE_VOICE; - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - pr_debug("%s: send mvm_pause_voice_cmd pkt size = %d\n", - __func__, mvm_pause_voice_cmd.pkt_size); - - ret = apr_send_pkt(apr_mvm, - (uint32_t *)&mvm_pause_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_PAUSE_VOICE\n"); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_map_cal_memory(struct cal_block_data *cal_block, - uint32_t session_id) -{ - int result = 0; - int voc_index; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: Map size is 0!\n", __func__); - - result = -EINVAL; - goto done; - } - - voc_index = voice_get_idx_for_session(session_id); - if (voc_index < 0) { - pr_err("%s: Invalid session ID %d\n", __func__, session_id); - - goto done; - } - - mutex_lock(&common.common_lock); - v = &common.voice[voc_index]; - - result = voice_map_memory_physical_cmd(v, - &common.cal_mem_map_table, - (dma_addr_t)cal_block->cal_data.paddr, - cal_block->map_data.map_size, - VOC_CAL_MEM_MAP_TOKEN); - if (result < 0) { - pr_err("%s: Mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - - goto done_unlock; - } - - cal_block->map_data.q6map_handle = common.cal_mem_handle; -done_unlock: - mutex_unlock(&common.common_lock); -done: - return result; -} - -static int remap_cal_data(struct cal_block_data *cal_block, - uint32_t session_id) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for session_id %d!\n", - __func__, session_id); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - - /* cal type not used */ - ret = voice_map_cal_memory(cal_block, session_id); - if (ret < 0) { - pr_err("%s: Mmap did not work! size = %zd\n", - __func__, cal_block->map_data.map_size); - - goto done; - } - } else { - pr_debug("%s: Cal block 0x%pK, size %zd already mapped. Q6 map handle = %d\n", - __func__, &cal_block->cal_data.paddr, - cal_block->map_data.map_size, - cal_block->map_data.q6map_handle); - } -done: - return ret; -} - -static int voice_unmap_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int result = 0; - int result2 = 0; - int i; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_debug("%s: Q6 handle is not set!\n", __func__); - - result = -EINVAL; - goto done; - } - - mutex_lock(&common.common_lock); - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - result2 = voice_pause_voice_call(v); - if (result2 < 0) { - pr_err("%s: Voice_pause_voice_call failed for session 0x%x, err %d!\n", - __func__, v->session_id, result2); - - result = result2; - } - - if (cal_type == CVP_VOCPROC_DYNAMIC_CAL_TYPE) - voice_send_cvp_deregister_vol_cal_cmd(v); - else if (cal_type == CVP_VOCPROC_STATIC_CAL_TYPE) - voice_send_cvp_deregister_cal_cmd(v); - else if (cal_type == CVP_VOCDEV_CFG_CAL_TYPE) - voice_send_cvp_deregister_dev_cfg_cmd(v); - else if (cal_type == CVS_VOCSTRM_STATIC_CAL_TYPE) - voice_send_cvs_deregister_cal_cmd(v); - else - pr_err("%s: Invalid cal type %d!\n", - __func__, cal_type); - - result2 = voice_send_start_voice_cmd(v); - if (result2) { - pr_err("%s: Voice_send_start_voice_cmd failed for session 0x%x, err %d!\n", - __func__, v->session_id, result2); - - result = result2; - } - } - - if ((cal_block->map_data.q6map_handle != 0) && - (!is_other_session_active(v->session_id))) { - - result2 = voice_send_mvm_unmap_memory_physical_cmd( - v, cal_block->map_data.q6map_handle); - if (result2) { - pr_err("%s: Voice_send_mvm_unmap_memory_physical_cmd failed for session 0x%x, err %d!\n", - __func__, v->session_id, result2); - - result = result2; - } - cal_block->map_data.q6map_handle = 0; - } - mutex_unlock(&v->lock); - } - mutex_unlock(&common.common_lock); -done: - return result; -} - -int voc_register_vocproc_vol_table(void) -{ - int result = 0; - int result2 = 0; - int i; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - mutex_lock(&common.common_lock); - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - result2 = voice_send_cvp_register_vol_cal_cmd(v); - if (result2 < 0) { - pr_err("%s: Failed to register vocvol table for session 0x%x!\n", - __func__, v->session_id); - - result = result2; - /* Still try to register other sessions */ - } - } - mutex_unlock(&v->lock); - } - - mutex_unlock(&common.common_lock); - return result; -} - -int voc_deregister_vocproc_vol_table(void) -{ - int result = 0; - int success = 0; - int i; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - mutex_lock(&common.common_lock); - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - result = voice_send_cvp_deregister_vol_cal_cmd(v); - if (result < 0) { - pr_err("%s: Failed to deregister vocvol table for session 0x%x!\n", - __func__, v->session_id); - - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); - if (success) { - pr_err("%s: Try to re-register all deregistered sessions!\n", - __func__); - - voc_register_vocproc_vol_table(); - } - goto done; - } else { - success = 1; - } - } - mutex_unlock(&v->lock); - } - mutex_unlock(&common.common_lock); -done: - return result; -} - -int voc_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - - result = -EINVAL; - goto done; - } - - mutex_lock(&common.common_lock); - /* use first session */ - v = &common.voice[0]; - mutex_lock(&v->lock); - - if (!is_rtac_memory_allocated()) { - result = voice_alloc_rtac_mem_map_table(); - if (result < 0) { - pr_err("%s: RTAC alloc mem map table did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - - common.rtac_mem_map_table.dma_buf = NULL; - goto done_unlock; - } - } - - result = voice_map_memory_physical_cmd(v, - &common.rtac_mem_map_table, - (dma_addr_t)cal_block->cal_data.paddr, - cal_block->map_data.map_size, - VOC_RTAC_MEM_MAP_TOKEN); - if (result < 0) { - pr_err("%s: RTAC mmap did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - - free_rtac_map_table(); - goto done_unlock; - } - - cal_block->map_data.map_handle = common.rtac_mem_handle; -done_unlock: - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); -done: - return result; -} - -int voc_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (mem_map_handle == NULL) { - pr_debug("%s: Map handle is NULL, nothing to unmap\n", - __func__); - - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - - goto done; - } - - mutex_lock(&common.common_lock); - /* Use first session */ - /* Only used for apr wait lock */ - v = &common.voice[0]; - mutex_lock(&v->lock); - - result = voice_send_mvm_unmap_memory_physical_cmd( - v, *mem_map_handle); - if (result) { - pr_err("%s: voice_send_mvm_unmap_memory_physical_cmd Failed for session 0x%x!\n", - __func__, v->session_id); - } else { - *mem_map_handle = 0; - common.rtac_mem_handle = 0; - free_rtac_map_table(); - } - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); -done: - return result; -} - -static int voice_send_cvp_channel_info_v2(struct voice_data *v, - uint32_t param_type) -{ - int ret; - struct cvp_set_channel_info_cmd_v2 cvp_set_channel_info_cmd; - void *apr_cvp; - u16 cvp_handle; - struct vss_icommon_param_data_channel_info_v2_t - *channel_info_param_data = - &cvp_set_channel_info_cmd. - cvp_set_ch_info_param_v2.param_data; - struct vss_param_vocproc_dev_channel_info_t *channel_info = - &channel_info_param_data->channel_info; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - memset(&cvp_set_channel_info_cmd, 0, sizeof(cvp_set_channel_info_cmd)); - - cvp_set_channel_info_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_channel_info_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_channel_info_cmd) - APR_HDR_SIZE); - cvp_set_channel_info_cmd.hdr.src_svc = 0; - cvp_set_channel_info_cmd.hdr.src_domain = APR_DOMAIN_APPS; - cvp_set_channel_info_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_channel_info_cmd.hdr.dest_svc = 0; - cvp_set_channel_info_cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cvp_set_channel_info_cmd.hdr.dest_port = cvp_handle; - cvp_set_channel_info_cmd.hdr.token = 0; - cvp_set_channel_info_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2; - - cvp_set_channel_info_cmd.cvp_set_ch_info_param_v2.mem_size = - sizeof(struct vss_icommon_param_data_channel_info_v2_t); - - channel_info_param_data->module_id = VSS_MODULE_CVD_GENERIC; - channel_info_param_data->param_size = - sizeof(struct vss_param_vocproc_dev_channel_info_t); - - /* Device specific data */ - switch (param_type) { - case RX_PATH: - channel_info_param_data->param_id = - VSS_PARAM_VOCPROC_RX_CHANNEL_INFO; - channel_info->num_channels = v->dev_rx.no_of_channels; - channel_info->bits_per_sample = v->dev_rx.bits_per_sample; - memcpy(&channel_info->channel_mapping, - v->dev_rx.channel_mapping, - VSS_NUM_CHANNELS_MAX * sizeof(uint8_t)); - break; - - case TX_PATH: - channel_info_param_data->param_id = - VSS_PARAM_VOCPROC_TX_CHANNEL_INFO; - channel_info->num_channels = v->dev_tx.no_of_channels; - channel_info->bits_per_sample = v->dev_tx.bits_per_sample; - memcpy(&channel_info->channel_mapping, - v->dev_tx.channel_mapping, - VSS_NUM_CHANNELS_MAX * sizeof(uint8_t)); - break; - - case EC_REF_PATH: - channel_info_param_data->param_id = - VSS_PARAM_VOCPROC_EC_REF_CHANNEL_INFO; - channel_info->num_channels = v->dev_rx.no_of_channels; - channel_info->bits_per_sample = v->dev_rx.bits_per_sample; - memcpy(&channel_info->channel_mapping, - v->dev_rx.channel_mapping, - VSS_NUM_CHANNELS_MAX * sizeof(uint8_t)); - break; - default: - pr_err("%s: Invalid param type\n", - __func__); - ret = -EINVAL; - goto done; - } - - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_set_channel_info_cmd); - if (ret < 0) { - pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2\n", - __func__); - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s] handle = %d\n", __func__, - adsp_err_get_err_str(v->async_err), cvp_handle); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - return ret; -} - -static int voice_send_cvp_channel_info_cmd(struct voice_data *v) -{ - int ret = 0; - - ret = voice_send_cvp_channel_info_v2(v, RX_PATH); - if (ret < 0) { - pr_err("%s: Error in sending cvp_channel_info RX: %d\n", - __func__, ret); - goto done; - } - - ret = voice_send_cvp_channel_info_v2(v, TX_PATH); - if (ret < 0) { - pr_err("%s: Error in sending cvp_channel_info TX: %d\n", - __func__, ret); - goto done; - } - - ret = voice_send_cvp_channel_info_v2(v, EC_REF_PATH); - if (ret < 0) { - pr_err("%s: Error in sending cvp_channel_info EC Ref: %d\n", - __func__, ret); - goto done; - } -done: - return ret; -} - -static int voice_send_cvp_ch_mixer_info_v2(struct voice_data *v) -{ - int ret; - struct cvp_set_channel_mixer_info_cmd_v2 cvp_set_ch_mixer_info_cmd; - void *apr_cvp; - u16 cvp_handle; - struct vss_icommon_param_data_ch_mixer_v2_t *cvp_config_param_data = - &cvp_set_ch_mixer_info_cmd. - cvp_set_ch_mixer_param_v2.param_data; - struct vss_param_channel_mixer_info_t *ch_mixer_info = - &cvp_config_param_data->ch_mixer_info; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - memset(&cvp_set_ch_mixer_info_cmd, 0, - sizeof(cvp_set_ch_mixer_info_cmd)); - - cvp_set_ch_mixer_info_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_ch_mixer_info_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_ch_mixer_info_cmd) - APR_HDR_SIZE); - cvp_set_ch_mixer_info_cmd.hdr.src_svc = 0; - cvp_set_ch_mixer_info_cmd.hdr.src_domain = APR_DOMAIN_APPS; - cvp_set_ch_mixer_info_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_ch_mixer_info_cmd.hdr.dest_svc = 0; - cvp_set_ch_mixer_info_cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cvp_set_ch_mixer_info_cmd.hdr.dest_port = cvp_handle; - cvp_set_ch_mixer_info_cmd.hdr.token = VOC_GENERIC_SET_PARAM_TOKEN; - cvp_set_ch_mixer_info_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2; - cvp_set_ch_mixer_info_cmd.cvp_set_ch_mixer_param_v2.mem_size = - sizeof(struct vss_icommon_param_data_ch_mixer_v2_t); - - cvp_config_param_data->module_id = AUDPROC_MODULE_ID_MFC; - cvp_config_param_data->param_id = - AUDPROC_CHMIXER_PARAM_ID_COEFF; - cvp_config_param_data->param_size = - sizeof(struct vss_param_channel_mixer_info_t); - - ch_mixer_info->index = 0; - ch_mixer_info->num_output_channels = v->dev_rx.no_of_channels; - /* - * Configure Rx input to be mono for channel mixer as the DSP - * configures vocproc input as mono. - */ - ch_mixer_info->num_input_channels = NUM_CHANNELS_MONO; - ch_mixer_info->out_channel_map[0] = PCM_CHANNEL_L; - ch_mixer_info->out_channel_map[1] = PCM_CHANNEL_R; - ch_mixer_info->in_channel_map[0] = PCM_CHANNEL_L; - ch_mixer_info->channel_weight_coeff[0][0] = GAIN_Q14_FORMAT(1); - ch_mixer_info->channel_weight_coeff[1][0] = GAIN_Q14_FORMAT(1); - ch_mixer_info->reserved = 0; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_ch_mixer_info_cmd); - if (ret < 0) { - pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2 %d\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s] handle = %d\n", __func__, - adsp_err_get_err_str(v->async_err), cvp_handle); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - return ret; -} - -static int voice_send_cvp_mfc_config_v2(struct voice_data *v) -{ - int ret; - struct cvp_set_mfc_config_cmd_v2 cvp_set_mfc_config_cmd; - void *apr_cvp; - u16 cvp_handle; - uint8_t ch_idx; - struct vss_icommon_param_data_mfc_config_v2_t *cvp_config_param_data = - &cvp_set_mfc_config_cmd.cvp_set_mfc_param_v2.param_data; - struct vss_param_mfc_config_info_t *mfc_config_info = - &cvp_config_param_data->mfc_config_info; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - memset(&cvp_set_mfc_config_cmd, 0, sizeof(cvp_set_mfc_config_cmd)); - - cvp_set_mfc_config_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_mfc_config_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_mfc_config_cmd) - APR_HDR_SIZE); - cvp_set_mfc_config_cmd.hdr.src_svc = 0; - cvp_set_mfc_config_cmd.hdr.src_domain = APR_DOMAIN_APPS; - cvp_set_mfc_config_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_mfc_config_cmd.hdr.dest_svc = 0; - cvp_set_mfc_config_cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cvp_set_mfc_config_cmd.hdr.dest_port = cvp_handle; - cvp_set_mfc_config_cmd.hdr.token = 0; - cvp_set_mfc_config_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2; - cvp_set_mfc_config_cmd.cvp_set_mfc_param_v2.mem_size = - sizeof(struct vss_icommon_param_data_mfc_config_v2_t); - - cvp_config_param_data->module_id = AUDPROC_MODULE_ID_MFC; - cvp_config_param_data->param_id = - AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT; - cvp_config_param_data->param_size = - sizeof(struct vss_param_mfc_config_info_t); - - mfc_config_info->num_channels = v->dev_rx.no_of_channels; - mfc_config_info->bits_per_sample = 16; - mfc_config_info->sample_rate = v->dev_rx.sample_rate; - - /* - * Do not use memcpy here as channel_type in mfc_config structure is a - * uint16_t array while channel_mapping array of device is of uint8_t - */ - for (ch_idx = 0; ch_idx < VSS_NUM_CHANNELS_MAX; ch_idx++) { - mfc_config_info->channel_type[ch_idx] = - v->dev_rx.channel_mapping[ch_idx]; - } - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_mfc_config_cmd); - if (ret < 0) { - pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2 %d\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s] handle = %d\n", __func__, - adsp_err_get_err_str(v->async_err), cvp_handle); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - return ret; -} - -static int voice_send_cvp_mfc_config_cmd(struct voice_data *v) -{ - int ret = 0; - - if (common.cvp_version >= CVP_VERSION_2) { - ret = voice_send_cvp_ch_mixer_info_v2(v); - if (ret < 0) - pr_warn("%s: Set channel mixer config failed err:%d", - __func__, ret); - - ret = voice_send_cvp_mfc_config_v2(v); - if (ret < 0) - pr_warn("%s: Set MFC config failed err:%d", - __func__, ret); - } else { - pr_warn("%s: CVP Version not supported\n", __func__); - ret = -EINVAL; - } - - return ret; -} - -static int voice_get_avcs_version_per_service(uint32_t service_id) -{ - int ret = 0; - size_t ver_size; - struct avcs_fwk_ver_info *ver_info = NULL; - - if (service_id == AVCS_SERVICE_ID_ALL) { - pr_err("%s: Invalid service id: %d", __func__, - AVCS_SERVICE_ID_ALL); - return -EINVAL; - } - - ver_size = sizeof(struct avcs_get_fwk_version) + - sizeof(struct avs_svc_api_info); - ver_info = kzalloc(ver_size, GFP_KERNEL); - if (ver_info == NULL) - return -ENOMEM; - - ret = q6core_get_service_version(service_id, ver_info, ver_size); - if (ret < 0) - goto done; - - ret = ver_info->services[0].api_version; - common.is_avcs_version_queried = true; -done: - kfree(ver_info); - return ret; -} - -static void voice_mic_break_work_fn(struct work_struct *work) -{ - int ret = 0; - char event[25] = ""; - struct voice_data *v = container_of(work, struct voice_data, - voice_mic_break_work); - - snprintf(event, sizeof(event), "MIC_BREAK_STATUS=%s", - v->mic_break_status ? "TRUE" : "FALSE"); - - mutex_lock(&common.common_lock); - ret = q6core_send_uevent(common.uevent_data, event); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", __func__, event, ret); - mutex_unlock(&common.common_lock); -} - -static int voice_setup_vocproc(struct voice_data *v) -{ - struct module_instance_info mod_inst_info; - int ret = 0; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - ret = voice_send_cvp_create_cmd(v); - if (ret < 0) { - pr_err("%s: CVP create failed err:%d\n", __func__, ret); - goto fail; - } - - if (common.is_avcs_version_queried == false) - common.cvp_version = voice_get_avcs_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_CVP_V); - - if (common.cvp_version < 0) { - pr_err("%s: Invalid CVP version %d\n", - __func__, common.cvp_version); - ret = -EINVAL; - goto fail; - } - pr_debug("%s: CVP Version %d\n", __func__, common.cvp_version); - - ret = voice_send_cvp_media_fmt_info_cmd(v); - if (ret < 0) { - pr_err("%s: Set media format info failed err:%d\n", __func__, - ret); - goto fail; - } - - ret = voice_send_cvp_topology_commit_cmd(v); - if (ret < 0) { - pr_err("%s: Set topology commit failed err:%d\n", - __func__, ret); - goto fail; - } - - /* Send MFC config only when the no of channels are more than 1 */ - if (v->dev_rx.no_of_channels > NUM_CHANNELS_MONO) { - ret = voice_send_cvp_mfc_config_cmd(v); - if (ret < 0) { - pr_warn("%s: Set mfc config failed err:%d\n", - __func__, ret); - } - } - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - - voice_send_cvs_register_cal_cmd(v); - voice_send_cvp_register_dev_cfg_cmd(v); - voice_send_cvp_register_cal_cmd(v); - voice_send_cvp_register_vol_cal_cmd(v); - - /* enable vocproc */ - ret = voice_send_enable_vocproc_cmd(v); - if (ret < 0) - goto fail; - - /* attach vocproc */ - ret = voice_send_attach_vocproc_cmd(v); - if (ret < 0) - goto fail; - - /* send tty mode if tty device is used */ - voice_send_tty_mode_cmd(v); - - if (is_voip_session(v->session_id)) { - ret = voice_send_mvm_cal_network_cmd(v); - if (ret < 0) - pr_err("%s: voice_send_mvm_cal_network_cmd: %d\n", - __func__, ret); - - ret = voice_send_mvm_media_type_cmd(v); - if (ret < 0) - pr_err("%s: voice_send_mvm_media_type_cmd: %d\n", - __func__, ret); - - voice_send_netid_timing_cmd(v); - } - - if (v->st_enable && !v->tty_mode) - voice_send_set_pp_enable_cmd(v, mod_inst_info, v->st_enable); - /* Start in-call music delivery if this feature is enabled */ - if (v->music_info.play_enable) - voice_cvs_start_playback(v); - - /* Start in-call recording if this feature is enabled */ - if (v->rec_info.rec_enable) - voice_cvs_start_record(v, v->rec_info.rec_mode, - v->rec_info.port_id); - - if (v->dtmf_rx_detect_en) - voice_send_dtmf_rx_detection_cmd(v, v->dtmf_rx_detect_en); - - if (v->ecns_enable) - voice_send_cvp_ecns_enable_cmd(v, v->ecns_module_id, - v->ecns_enable); - - if (v->hd_enable) - voice_send_hd_cmd(v, v->hd_enable); - - if (common.mic_break_enable) - voice_send_mvm_event_class_cmd(v, - VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS, - VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE); - - rtac_add_voice(voice_get_cvs_handle(v), - voice_get_cvp_handle(v), - v->dev_rx.port_id, v->dev_tx.port_id, - v->dev_rx.dev_id, v->dev_tx.dev_id, - v->session_id); - - return 0; - -fail: - return ret; -} - -static int voice_send_cvp_device_channels_cmd(struct voice_data *v) -{ - int ret = 0; - struct cvp_set_dev_channels_cmd cvp_set_dev_channels_cmd; - void *apr_cvp; - u16 cvp_handle; - - if (!(voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2)) { - pr_debug("%s CVD ver %s doesn't support send_device_channels cmd\n", - __func__, common.cvd_version); - - goto done; - } - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - cvp_set_dev_channels_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_dev_channels_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_dev_channels_cmd) - APR_HDR_SIZE); - cvp_set_dev_channels_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_dev_channels_cmd.hdr.dest_port = cvp_handle; - cvp_set_dev_channels_cmd.hdr.token = 0; - cvp_set_dev_channels_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS; - cvp_set_dev_channels_cmd.cvp_set_channels.rx_num_channels = - VSS_NUM_DEV_CHANNELS_1; - cvp_set_dev_channels_cmd.cvp_set_channels.tx_num_channels = - v->dev_tx.no_of_channels; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_set_dev_channels_cmd); - if (ret < 0) { - pr_err("%s: Fail in sending VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS\n", - __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_media_fmt_info_cmd(struct voice_data *v) -{ - int ret = 0; - - if (common.cvp_version < CVP_VERSION_2) - ret = voice_send_cvp_device_channels_cmd(v); - else - ret = voice_send_cvp_channel_info_cmd(v); - - if (ret < 0) { - pr_err("%s: Set channel info failed err: %d\n", __func__, - ret); - goto done; - } - - if (voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_3) { - ret = voice_send_cvp_media_format_cmd(v, RX_PATH); - if (ret < 0) - goto done; - - ret = voice_send_cvp_media_format_cmd(v, TX_PATH); - if (ret < 0) - goto done; - - if (common.ec_ref_ext) - ret = voice_send_cvp_media_format_cmd(v, EC_REF_PATH); - } - -done: - return ret; -} - -static int voice_send_cvp_media_format_cmd(struct voice_data *v, - uint32_t param_type) -{ - struct vss_param_endpoint_media_format_info media_fmt_info; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&media_fmt_info, 0, sizeof(media_fmt_info)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - param_hdr.module_id = VSS_MODULE_CVD_GENERIC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_size = sizeof(media_fmt_info); - - switch (param_type) { - case RX_PATH: - param_hdr.param_id = VSS_PARAM_RX_PORT_ENDPOINT_MEDIA_INFO; - media_fmt_info.port_id = v->dev_rx.port_id; - media_fmt_info.num_channels = v->dev_rx.no_of_channels; - media_fmt_info.bits_per_sample = v->dev_rx.bits_per_sample; - media_fmt_info.sample_rate = v->dev_rx.sample_rate; - memcpy(&media_fmt_info.channel_mapping, - &v->dev_rx.channel_mapping, VSS_CHANNEL_MAPPING_SIZE); - break; - - case TX_PATH: - param_hdr.param_id = VSS_PARAM_TX_PORT_ENDPOINT_MEDIA_INFO; - media_fmt_info.port_id = v->dev_tx.port_id; - media_fmt_info.num_channels = v->dev_tx.no_of_channels; - media_fmt_info.bits_per_sample = v->dev_tx.bits_per_sample; - media_fmt_info.sample_rate = v->dev_tx.sample_rate; - memcpy(&media_fmt_info.channel_mapping, - &v->dev_tx.channel_mapping, VSS_CHANNEL_MAPPING_SIZE); - break; - - case EC_REF_PATH: - param_hdr.param_id = VSS_PARAM_EC_REF_PORT_ENDPOINT_MEDIA_INFO; - media_fmt_info.port_id = common.ec_media_fmt_info.port_id; - media_fmt_info.num_channels = - common.ec_media_fmt_info.num_channels; - media_fmt_info.bits_per_sample = - common.ec_media_fmt_info.bits_per_sample; - media_fmt_info.sample_rate = - common.ec_media_fmt_info.sample_rate; - memcpy(&media_fmt_info.channel_mapping, - &common.ec_media_fmt_info.channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - break; - - default: - pr_err("%s: Invalid param type %d\n", __func__, param_type); - ret = -EINVAL; - goto done; - } - - ret = voice_pack_and_set_cvp_param(v, param_hdr, - (u8 *) &media_fmt_info); - if (ret) - pr_err("%s: Failed to set media format params on CVP, err %d\n", - __func__, ret); - -done: - return ret; -} - -static int voice_send_cvp_topology_commit_cmd(struct voice_data *v) -{ - int ret = 0; - struct apr_hdr cvp_topology_commit_cmd; - void *apr_cvp; - u16 cvp_handle; - - if (!(voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2)) { - pr_debug("%s CVD version string %s doesn't support this command\n", - __func__, common.cvd_version); - - goto done; - } - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - cvp_topology_commit_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_topology_commit_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_topology_commit_cmd) - APR_HDR_SIZE); - cvp_topology_commit_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_topology_commit_cmd.dest_port = cvp_handle; - cvp_topology_commit_cmd.token = 0; - cvp_topology_commit_cmd.opcode = VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_topology_commit_cmd); - if (ret < 0) { - pr_err("%s: Fail in sending VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT\n", - __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_enable_vocproc_cmd(struct voice_data *v) -{ - int ret = 0; - struct apr_hdr cvp_enable_cmd; - void *apr_cvp; - u16 cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - cvp_handle = voice_get_cvp_handle(v); - - /* enable vocproc and wait for respose */ - cvp_enable_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_enable_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_enable_cmd) - APR_HDR_SIZE); - pr_debug("cvp_enable_cmd pkt size = %d, cvp_handle=%d\n", - cvp_enable_cmd.pkt_size, cvp_handle); - cvp_enable_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_enable_cmd.dest_port = cvp_handle; - cvp_enable_cmd.token = 0; - cvp_enable_cmd.opcode = VSS_IVOCPROC_CMD_ENABLE; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_enable_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IVOCPROC_CMD_ENABLE\n"); - goto fail; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_mvm_cal_network_cmd(struct voice_data *v) -{ - struct vss_imvm_cmd_set_cal_network_t mvm_set_cal_network; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_set_cal_network.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_cal_network.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_cal_network) - APR_HDR_SIZE); - mvm_set_cal_network.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_cal_network.hdr.dest_port = mvm_handle; - mvm_set_cal_network.hdr.token = 0; - mvm_set_cal_network.hdr.opcode = VSS_IMVM_CMD_SET_CAL_NETWORK; - mvm_set_cal_network.network_id = VSS_ICOMMON_CAL_NETWORK_ID_NONE; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_cal_network); - if (ret < 0) { - pr_err("%s: Error %d sending SET_NETWORK\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_netid_timing_cmd(struct voice_data *v) -{ - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - struct mvm_set_network_cmd mvm_set_network; - struct mvm_set_voice_timing_cmd mvm_set_voice_timing; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - ret = voice_config_cvs_vocoder(v); - if (ret < 0) { - pr_err("%s: Error %d configuring CVS voc", - __func__, ret); - goto fail; - } - /* Set network ID. */ - pr_debug("Setting network ID %x\n", common.mvs_info.network_type); - - mvm_set_network.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_network.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_network) - APR_HDR_SIZE); - mvm_set_network.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_network.hdr.dest_port = mvm_handle; - mvm_set_network.hdr.token = 0; - mvm_set_network.hdr.opcode = VSS_IMVM_CMD_SET_CAL_NETWORK; - mvm_set_network.network.network_id = common.mvs_info.network_type; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_network); - if (ret < 0) { - pr_err("%s: Error %d sending SET_NETWORK\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - /* Set voice timing. */ - pr_debug("Setting voice timing\n"); - - mvm_set_voice_timing.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_voice_timing.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_voice_timing) - - APR_HDR_SIZE); - mvm_set_voice_timing.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_voice_timing.hdr.dest_port = mvm_handle; - mvm_set_voice_timing.hdr.token = 0; - mvm_set_voice_timing.hdr.opcode = VSS_ICOMMON_CMD_SET_VOICE_TIMING; - mvm_set_voice_timing.timing.mode = 0; - mvm_set_voice_timing.timing.enc_offset = 8000; - mvm_set_voice_timing.timing.dec_req_offset = 3300; - mvm_set_voice_timing.timing.dec_offset = 8300; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_voice_timing); - if (ret < 0) { - pr_err("%s: Error %d sending SET_TIMING\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_attach_vocproc_cmd(struct voice_data *v) -{ - int ret = 0; - struct mvm_attach_vocproc_cmd mvm_a_vocproc_cmd; - void *apr_mvm; - u16 mvm_handle, cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvp_handle = voice_get_cvp_handle(v); - - /* attach vocproc and wait for response */ - mvm_a_vocproc_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_a_vocproc_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_a_vocproc_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_a_vocproc_cmd pkt size = %d\n", - mvm_a_vocproc_cmd.hdr.pkt_size); - mvm_a_vocproc_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_a_vocproc_cmd.hdr.dest_port = mvm_handle; - mvm_a_vocproc_cmd.hdr.token = 0; - mvm_a_vocproc_cmd.hdr.opcode = VSS_IMVM_CMD_ATTACH_VOCPROC; - mvm_a_vocproc_cmd.mvm_attach_cvp_handle.handle = cvp_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_a_vocproc_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_ATTACH_VOCPROC\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static void voc_update_session_params(struct voice_data *v) -{ - /* reset LCH mode */ - v->lch_mode = 0; - - /* clear disable topology setting */ - v->disable_topology = false; - - /* clear mute setting */ - v->dev_rx.dev_mute = common.default_mute_val; - v->dev_tx.dev_mute = common.default_mute_val; - v->stream_rx.stream_mute = common.default_mute_val; - v->stream_tx.stream_mute = common.default_mute_val; -} - -static int voice_destroy_vocproc(struct voice_data *v) -{ - struct mvm_detach_vocproc_cmd mvm_d_vocproc_cmd; - struct apr_hdr cvp_destroy_session_cmd; - struct module_instance_info mod_inst_info; - int ret = 0; - void *apr_mvm, *apr_cvp; - u16 mvm_handle, cvp_handle; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - apr_cvp = common.apr_q6_cvp; - - if (!apr_mvm || !apr_cvp) { - pr_err("%s: apr_mvm or apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvp_handle = voice_get_cvp_handle(v); - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - - /* disable slowtalk if st_enable is set */ - if (v->st_enable) - voice_send_set_pp_enable_cmd(v, mod_inst_info, 0); - - /* Disable HD Voice if hd_enable is set */ - if (v->hd_enable) - voice_send_hd_cmd(v, 0); - - /* stop playback or recording */ - v->music_info.force = 1; - voice_cvs_stop_playback(v); - voice_cvs_stop_record(v); - /* If voice call is active during VoLTE, SRVCC happens. - * Start recording on voice session if recording started during VoLTE. - */ - if (is_volte_session(v->session_id) && - ((common.voice[VOC_PATH_PASSIVE].voc_state == VOC_RUN) || - (common.voice[VOC_PATH_PASSIVE].voc_state == VOC_CHANGE))) { - if (v->rec_info.rec_enable) { - voice_cvs_start_record( - &common.voice[VOC_PATH_PASSIVE], - v->rec_info.rec_mode, - v->rec_info.port_id); - common.srvcc_rec_flag = true; - - pr_debug("%s: switch recording, srvcc_rec_flag %d\n", - __func__, common.srvcc_rec_flag); - } - } - - /* send stop voice cmd */ - voice_send_stop_voice_cmd(v); - - /* send stop dtmf detecton cmd */ - if (v->dtmf_rx_detect_en) - voice_send_dtmf_rx_detection_cmd(v, 0); - - if (v->ecns_enable) - voice_send_cvp_ecns_enable_cmd(v, v->ecns_module_id, 0); - - /* detach VOCPROC and wait for response from mvm */ - mvm_d_vocproc_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_d_vocproc_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_d_vocproc_cmd) - APR_HDR_SIZE); - pr_debug("mvm_d_vocproc_cmd pkt size = %d\n", - mvm_d_vocproc_cmd.hdr.pkt_size); - mvm_d_vocproc_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_d_vocproc_cmd.hdr.dest_port = mvm_handle; - mvm_d_vocproc_cmd.hdr.token = 0; - mvm_d_vocproc_cmd.hdr.opcode = VSS_IMVM_CMD_DETACH_VOCPROC; - mvm_d_vocproc_cmd.mvm_detach_cvp_handle.handle = cvp_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_d_vocproc_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_DETACH_VOCPROC\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - voice_send_cvp_deregister_vol_cal_cmd(v); - voice_send_cvp_deregister_cal_cmd(v); - voice_send_cvp_deregister_dev_cfg_cmd(v); - voice_send_cvs_deregister_cal_cmd(v); - - /* Unload topology modules */ - voice_unload_topo_modules(); - - if (common.mic_break_enable) - voice_send_mvm_event_class_cmd(v, - VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS, - VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE); - - /* destrop cvp session */ - cvp_destroy_session_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_destroy_session_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_destroy_session_cmd) - APR_HDR_SIZE); - pr_debug("cvp_destroy_session_cmd pkt size = %d\n", - cvp_destroy_session_cmd.pkt_size); - cvp_destroy_session_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_destroy_session_cmd.dest_port = cvp_handle; - cvp_destroy_session_cmd.token = 0; - cvp_destroy_session_cmd.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_destroy_session_cmd); - if (ret < 0) { - pr_err("Fail in sending APRV2_IBASIC_CMD_DESTROY_SESSION\n"); - goto fail; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - rtac_remove_voice(voice_get_cvs_handle(v)); - cvp_handle = 0; - voice_set_cvp_handle(v, cvp_handle); - return 0; -fail: - return ret; -} - -static int voice_send_mvm_unmap_memory_physical_cmd(struct voice_data *v, - uint32_t mem_handle) -{ - struct vss_imemory_cmd_unmap_t mem_unmap; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mem_unmap.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mem_unmap.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mem_unmap) - APR_HDR_SIZE); - mem_unmap.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mem_unmap.hdr.dest_port = mvm_handle; - mem_unmap.hdr.token = 0; - mem_unmap.hdr.opcode = VSS_IMEMORY_CMD_UNMAP; - mem_unmap.mem_handle = mem_handle; - - pr_debug("%s: mem_handle: 0x%x\n", __func__, mem_unmap.mem_handle); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mem_unmap); - if (ret < 0) { - pr_err("mem_unmap op[0x%x]ret[%d]\n", - mem_unmap.hdr.opcode, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; - -fail: - return ret; -} - -static int voice_send_cvs_packet_exchange_config_cmd(struct voice_data *v) -{ - struct vss_istream_cmd_set_oob_packet_exchange_config_t - packet_exchange_config_pkt; - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - packet_exchange_config_pkt.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - packet_exchange_config_pkt.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(packet_exchange_config_pkt) - - APR_HDR_SIZE); - packet_exchange_config_pkt.hdr.src_port = - voice_get_idx_for_session(v->session_id); - packet_exchange_config_pkt.hdr.dest_port = cvs_handle; - packet_exchange_config_pkt.hdr.token = 0; - packet_exchange_config_pkt.hdr.opcode = - VSS_ISTREAM_CMD_SET_OOB_PACKET_EXCHANGE_CONFIG; - packet_exchange_config_pkt.mem_handle = v->shmem_info.mem_handle; - /* dec buffer address */ - packet_exchange_config_pkt.dec_buf_addr_lsw = - lower_32_bits(v->shmem_info.sh_buf.buf[0].phys); - packet_exchange_config_pkt.dec_buf_addr_msw = - msm_audio_populate_upper_32_bits( - v->shmem_info.sh_buf.buf[0].phys); - packet_exchange_config_pkt.dec_buf_size = 4096; - /* enc buffer address */ - packet_exchange_config_pkt.enc_buf_addr_lsw = - lower_32_bits(v->shmem_info.sh_buf.buf[1].phys); - packet_exchange_config_pkt.enc_buf_addr_msw = - msm_audio_populate_upper_32_bits( - v->shmem_info.sh_buf.buf[1].phys); - packet_exchange_config_pkt.enc_buf_size = 4096; - - pr_debug("%s: dec buf add: lsw %0x msw %0x, size %d, enc buf add: lsw %0x msw %0x, size %d\n", - __func__, - packet_exchange_config_pkt.dec_buf_addr_lsw, - packet_exchange_config_pkt.dec_buf_addr_msw, - packet_exchange_config_pkt.dec_buf_size, - packet_exchange_config_pkt.enc_buf_addr_lsw, - packet_exchange_config_pkt.enc_buf_addr_msw, - packet_exchange_config_pkt.enc_buf_size); - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (uint32_t *) &packet_exchange_config_pkt); - if (ret < 0) { - pr_err("Failed to send packet exchange config cmd %d\n", ret); - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: wait_event timeout %d\n", __func__, ret); - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_cvs_data_exchange_mode_cmd(struct voice_data *v) -{ - struct vss_istream_cmd_set_packet_exchange_mode_t data_exchange_pkt; - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - data_exchange_pkt.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - data_exchange_pkt.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(data_exchange_pkt) - APR_HDR_SIZE); - data_exchange_pkt.hdr.src_port = - voice_get_idx_for_session(v->session_id); - data_exchange_pkt.hdr.dest_port = cvs_handle; - data_exchange_pkt.hdr.token = 0; - data_exchange_pkt.hdr.opcode = VSS_ISTREAM_CMD_SET_PACKET_EXCHANGE_MODE; - data_exchange_pkt.mode = VSS_ISTREAM_PACKET_EXCHANGE_MODE_OUT_OF_BAND; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (uint32_t *) &data_exchange_pkt); - if (ret < 0) { - pr_err("Failed to send data exchange mode %d\n", ret); - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: wait_event timeout %d\n", __func__, ret); - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_stream_mute_cmd(struct voice_data *v, uint16_t direction, - uint16_t mute_flag, uint32_t ramp_duration) -{ - struct cvs_set_mute_cmd cvs_mute_cmd; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!common.apr_q6_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - /* send mute/unmute to cvs */ - cvs_mute_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_mute_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_mute_cmd) - APR_HDR_SIZE); - cvs_mute_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_mute_cmd.hdr.dest_port = voice_get_cvs_handle(v); - cvs_mute_cmd.hdr.token = 0; - cvs_mute_cmd.hdr.opcode = VSS_IVOLUME_CMD_MUTE_V2; - cvs_mute_cmd.cvs_set_mute.direction = direction; - cvs_mute_cmd.cvs_set_mute.mute_flag = mute_flag; - cvs_mute_cmd.cvs_set_mute.ramp_duration_ms = ramp_duration; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_mute_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending stream mute\n", __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; - -fail: - return ret; -} - -static int voice_send_device_mute_cmd(struct voice_data *v, uint16_t direction, - uint16_t mute_flag, uint32_t ramp_duration) -{ - struct cvp_set_mute_cmd cvp_mute_cmd; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - cvp_mute_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_mute_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_mute_cmd) - APR_HDR_SIZE); - cvp_mute_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_mute_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_mute_cmd.hdr.token = 0; - cvp_mute_cmd.hdr.opcode = VSS_IVOLUME_CMD_MUTE_V2; - cvp_mute_cmd.cvp_set_mute.direction = direction; - cvp_mute_cmd.cvp_set_mute.mute_flag = mute_flag; - cvp_mute_cmd.cvp_set_mute.ramp_duration_ms = ramp_duration; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_mute_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending rx device cmd\n", __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; - -fail: - return ret; -} - -static int voice_send_vol_step_cmd(struct voice_data *v) -{ - struct cvp_set_rx_volume_step_cmd cvp_vol_step_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - cvp_handle = voice_get_cvp_handle(v); - - /* send volume index to cvp */ - cvp_vol_step_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_vol_step_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_vol_step_cmd) - APR_HDR_SIZE); - cvp_vol_step_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_vol_step_cmd.hdr.dest_port = cvp_handle; - cvp_vol_step_cmd.hdr.token = 0; - cvp_vol_step_cmd.hdr.opcode = VSS_IVOLUME_CMD_SET_STEP; - cvp_vol_step_cmd.cvp_set_vol_step.direction = VSS_IVOLUME_DIRECTION_RX; - cvp_vol_step_cmd.cvp_set_vol_step.value = v->dev_rx.volume_step_value; - cvp_vol_step_cmd.cvp_set_vol_step.ramp_duration_ms = - v->dev_rx.volume_ramp_duration_ms; - pr_debug("%s step_value:%d, ramp_duration_ms:%d", - __func__, - cvp_vol_step_cmd.cvp_set_vol_step.value, - cvp_vol_step_cmd.cvp_set_vol_step.ramp_duration_ms); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_vol_step_cmd); - if (ret < 0) { - pr_err("Fail in sending RX VOL step\n"); - return -EINVAL; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - return -EINVAL; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - return ret; - } - return 0; -} - -static int voice_cvs_start_record(struct voice_data *v, uint32_t rec_mode, - uint32_t port_id) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - - struct cvs_start_record_cmd cvs_start_record; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (!v->rec_info.recording) { - cvs_start_record.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_start_record.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_start_record) - APR_HDR_SIZE); - cvs_start_record.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_start_record.hdr.dest_port = cvs_handle; - cvs_start_record.hdr.token = 0; - cvs_start_record.hdr.opcode = VSS_IRECORD_CMD_START; - - cvs_start_record.rec_mode.port_id = - VSS_IRECORD_PORT_ID_DEFAULT; - if (rec_mode == VOC_REC_UPLINK) { - cvs_start_record.rec_mode.rx_tap_point = - VSS_IRECORD_TAP_POINT_NONE; - cvs_start_record.rec_mode.tx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - } else if (rec_mode == VOC_REC_DOWNLINK) { - cvs_start_record.rec_mode.rx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - cvs_start_record.rec_mode.tx_tap_point = - VSS_IRECORD_TAP_POINT_NONE; - } else if (rec_mode == VOC_REC_BOTH) { - cvs_start_record.rec_mode.rx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - cvs_start_record.rec_mode.tx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - if (common.rec_channel_count == - NUM_CHANNELS_STEREO) { - /* - * if channel count is not stereo, - * then default port_id and mode - * (mono) will be used - */ - cvs_start_record.rec_mode.mode = - VSS_IRECORD_MODE_TX_RX_STEREO; - cvs_start_record.rec_mode.port_id = - port_id; - } - } else { - pr_err("%s: Invalid in-call rec_mode %d\n", __func__, - rec_mode); - - ret = -EINVAL; - goto fail; - } - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_start_record); - if (ret < 0) { - pr_err("%s: Error %d sending START_RECORD\n", __func__, - ret); - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - v->rec_info.recording = 1; - } else { - pr_debug("%s: Start record already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -static int voice_cvs_stop_record(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct apr_hdr cvs_stop_record; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (v->rec_info.recording) { - cvs_stop_record.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_stop_record.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_stop_record) - APR_HDR_SIZE); - cvs_stop_record.src_port = - voice_get_idx_for_session(v->session_id); - cvs_stop_record.dest_port = cvs_handle; - cvs_stop_record.token = 0; - cvs_stop_record.opcode = VSS_IRECORD_CMD_STOP; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_stop_record); - if (ret < 0) { - pr_err("%s: Error %d sending STOP_RECORD\n", - __func__, ret); - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - v->rec_info.recording = 0; - } else { - pr_debug("%s: Stop record already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -/** - * voc_start_record - - * command to set record for voice session - * - * @port_id: Pseudo Port ID for record data - * @set: Enable or Disable for record start/stop - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_start_record(uint32_t port_id, uint32_t set, uint32_t session_id) -{ - int ret = 0; - int rec_mode = 0; - u16 cvs_handle; - int rec_set = 0; - struct voice_session_itr itr; - struct voice_data *v = NULL; - - /* check if session_id is valid */ - if (!voice_is_valid_session_id(session_id)) { - pr_err("%s: Invalid session id:%u\n", __func__, - session_id); - - return -EINVAL; - } - - voice_itr_init(&itr, session_id); - pr_debug("%s: session_id:%u\n", __func__, session_id); - - while (voice_itr_get_next_session(&itr, &v)) { - if (v == NULL) { - pr_err("%s: v is NULL, sessionid:%u\n", __func__, - session_id); - - break; - } - pr_debug("%s: port_id: %d, set: %d, v: %pK\n", - __func__, port_id, set, v); - - mutex_lock(&v->lock); - rec_mode = v->rec_info.rec_mode; - v->rec_info.port_id = port_id; - rec_set = set; - if (set) { - if ((v->rec_route_state.ul_flag != 0) && - (v->rec_route_state.dl_flag != 0)) { - pr_debug("%s: rec mode already set.\n", - __func__); - - mutex_unlock(&v->lock); - continue; - } - - if (port_id == VOICE_RECORD_TX) { - if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag == 0)) { - rec_mode = VOC_REC_UPLINK; - v->rec_route_state.ul_flag = 1; - } else if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag != 0)) { - voice_cvs_stop_record(v); - rec_mode = VOC_REC_BOTH; - v->rec_route_state.ul_flag = 1; - } - } else if (port_id == VOICE_RECORD_RX) { - if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag == 0)) { - rec_mode = VOC_REC_DOWNLINK; - v->rec_route_state.dl_flag = 1; - } else if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag == 0)) { - voice_cvs_stop_record(v); - rec_mode = VOC_REC_BOTH; - v->rec_route_state.dl_flag = 1; - } - } - rec_set = 1; - } else { - if ((v->rec_route_state.ul_flag == 0) && - (v->rec_route_state.dl_flag == 0)) { - pr_debug("%s: rec already stops.\n", - __func__); - mutex_unlock(&v->lock); - continue; - } - - if (port_id == VOICE_RECORD_TX) { - if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag == 0)) { - v->rec_route_state.ul_flag = 0; - rec_set = 0; - } else if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag != 0)) { - voice_cvs_stop_record(v); - v->rec_route_state.ul_flag = 0; - rec_mode = VOC_REC_DOWNLINK; - rec_set = 1; - } - } else if (port_id == VOICE_RECORD_RX) { - if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag != 0)) { - v->rec_route_state.dl_flag = 0; - rec_set = 0; - } else if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag != 0)) { - voice_cvs_stop_record(v); - v->rec_route_state.dl_flag = 0; - rec_mode = VOC_REC_UPLINK; - rec_set = 1; - } - } - } - pr_debug("%s: mode =%d, set =%d\n", __func__, - rec_mode, rec_set); - cvs_handle = voice_get_cvs_handle(v); - - if (cvs_handle != 0) { - if (rec_set) - ret = voice_cvs_start_record(v, rec_mode, - port_id); - else - ret = voice_cvs_stop_record(v); - } - - /* During SRVCC, recording will switch from VoLTE session to - * voice session. - * Then stop recording, need to stop recording on voice session. - */ - if ((!rec_set) && common.srvcc_rec_flag) { - pr_debug("%s, srvcc_rec_flag:%d\n", __func__, - common.srvcc_rec_flag); - - voice_cvs_stop_record(&common.voice[VOC_PATH_PASSIVE]); - common.srvcc_rec_flag = false; - } - - /* Cache the value */ - v->rec_info.rec_enable = rec_set; - v->rec_info.rec_mode = rec_mode; - - mutex_unlock(&v->lock); - } - - return ret; -} -EXPORT_SYMBOL(voc_start_record); - -static int voice_cvs_start_playback(struct voice_data *v) -{ - int ret = 0; - struct cvs_start_playback_cmd cvs_start_playback; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (!v->music_info.playing && v->music_info.count) { - cvs_start_playback.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_start_playback.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_start_playback) - APR_HDR_SIZE); - cvs_start_playback.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_start_playback.hdr.dest_port = cvs_handle; - cvs_start_playback.hdr.token = 0; - cvs_start_playback.hdr.opcode = VSS_IPLAYBACK_CMD_START; - cvs_start_playback.playback_mode.port_id = - v->music_info.port_id; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_start_playback); - - if (ret < 0) { - pr_err("%s: Error %d sending START_PLAYBACK\n", - __func__, ret); - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - v->music_info.playing = 1; - } else { - pr_debug("%s: Start playback already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -static int voice_cvs_stop_playback(struct voice_data *v) -{ - int ret = 0; - struct apr_hdr cvs_stop_playback; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (v->music_info.playing && ((!v->music_info.count) || - (v->music_info.force))) { - cvs_stop_playback.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_stop_playback.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_stop_playback) - APR_HDR_SIZE); - cvs_stop_playback.src_port = - voice_get_idx_for_session(v->session_id); - cvs_stop_playback.dest_port = cvs_handle; - cvs_stop_playback.token = 0; - - cvs_stop_playback.opcode = VSS_IPLAYBACK_CMD_STOP; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_stop_playback); - if (ret < 0) { - pr_err("%s: Error %d sending STOP_PLAYBACK\n", - __func__, ret); - - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - v->music_info.playing = 0; - v->music_info.force = 0; - } else { - pr_debug("%s: Stop playback already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -static int voc_lch_ops(struct voice_data *v, enum voice_lch_mode lch_mode) -{ - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - switch (lch_mode) { - case VOICE_LCH_START: - - ret = voc_end_voice_call(v->session_id); - if (ret < 0) - pr_err("%s: voice call end failed %d\n", - __func__, ret); - break; - case VOICE_LCH_STOP: - - ret = voc_start_voice_call(v->session_id); - if (ret < 0) { - pr_err("%s: voice call start failed %d\n", - __func__, ret); - goto done; - } - break; - default: - pr_err("%s: Invalid LCH mode: %d\n", - __func__, v->lch_mode); - break; - } -done: - return ret; -} - -/** - * voc_start_playback - - * command to set playback for voice session - * - * @set: Enable or Disable for playback start/stop - * @port_id: Pseudo Port ID for playback data - * - * Returns 0 on success or error on failure - */ -int voc_start_playback(uint32_t set, uint16_t port_id) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - u16 cvs_handle; - - pr_debug("%s port_id = %#x set = %d", __func__, port_id, set); - - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if ((v != NULL) && - (((port_id == VOICE_PLAYBACK_TX) && - is_sub1_vsid(v->session_id)) || - ((port_id == VOICE2_PLAYBACK_TX) && - is_sub2_vsid(v->session_id)))) { - - mutex_lock(&v->lock); - v->music_info.port_id = port_id; - v->music_info.play_enable = set; - if (set) - v->music_info.count++; - else - v->music_info.count--; - pr_debug("%s: music_info count=%d\n", __func__, - v->music_info.count); - - cvs_handle = voice_get_cvs_handle(v); - if (cvs_handle != 0) { - if (set) - ret = voice_cvs_start_playback(v); - else - ret = voice_cvs_stop_playback(v); - } - mutex_unlock(&v->lock); - } else { - pr_err("%s: Invalid session\n", __func__); - } - } - - return ret; -} -EXPORT_SYMBOL(voc_start_playback); - -/** - * voc_disable_topology - - * disable topology for voice session - * - * @session_id: voice session ID to send this command - * @disable: disable value - * - * Returns 0 on success or error on failure - */ -int voc_disable_topology(uint32_t session_id, uint32_t disable) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - v->disable_topology = disable; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_disable_topology); - -/** - * voc_set_incall_capture_channel_config - - * command to set channel count for record - * - * @channel_count: number of channels - * - */ -void voc_set_incall_capture_channel_config(int channel_count) -{ - common.rec_channel_count = channel_count; -} -EXPORT_SYMBOL(voc_set_incall_capture_channel_config); - -/** - * voc_get_incall_capture_channel_config - - * command to get channel count for record - * - * Returns number of channels configured for record - */ -int voc_get_incall_capture_channel_config(void) -{ - return common.rec_channel_count; -} -EXPORT_SYMBOL(voc_get_incall_capture_channel_config); - -static int voice_set_packet_exchange_mode_and_config(uint32_t session_id, - uint32_t mode) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - return -EINVAL; - } - - if (v->voc_state != VOC_RUN) - ret = voice_send_cvs_data_exchange_mode_cmd(v); - - if (ret) { - pr_err("%s: Error voice_send_data_exchange_mode_cmd %d\n", - __func__, ret); - goto fail; - } - - ret = voice_send_cvs_packet_exchange_config_cmd(v); - if (ret) { - pr_err("%s: Error: voice_send_packet_exchange_config_cmd %d\n", - __func__, ret); - goto fail; - } - - return ret; -fail: - return -EINVAL; -} - -/** - * voc_set_tx_mute - - * command to send TX mute for voice session - * - * @session_id: voice session ID to send this command - * @dir: RX or TX - * @mute: TX mute value - * @ramp_duration: Ramp duration in ms - * - * Returns 0 on success or error on failure - */ -int voc_set_tx_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - v->stream_tx.stream_mute = mute; - v->stream_tx.stream_mute_ramp_duration_ms = - ramp_duration; - if (is_voc_state_active(v->voc_state) && - (v->lch_mode == 0)) - ret = voice_send_stream_mute_cmd(v, - VSS_IVOLUME_DIRECTION_TX, - v->stream_tx.stream_mute, - v->stream_tx.stream_mute_ramp_duration_ms); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_tx_mute); - -/** - * voc_set_device_mute - - * command to set device mute for voice session - * - * @session_id: voice session ID to send this command - * @dir: RX or TX - * @mute: mute value - * @ramp_duration: Ramp duration in ms - * - * Returns 0 on success or error on failure - */ -int voc_set_device_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (dir == VSS_IVOLUME_DIRECTION_TX) { - v->dev_tx.dev_mute = mute; - v->dev_tx.dev_mute_ramp_duration_ms = - ramp_duration; - } else { - v->dev_rx.dev_mute = mute; - v->dev_rx.dev_mute_ramp_duration_ms = - ramp_duration; - } - - if (((v->voc_state == VOC_RUN) || - (v->voc_state == VOC_STANDBY)) && - (v->lch_mode == 0)) - ret = voice_send_device_mute_cmd(v, - dir, - mute, - ramp_duration); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_device_mute); - -int voc_get_rx_device_mute(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - ret = v->dev_rx.dev_mute; - - mutex_unlock(&v->lock); - - return ret; -} - -/** - * voc_set_tty_mode - - * Update tty mode for voice session - * - * @session_id: voice session ID - * @tty_mode: TTY mode value - * - * Returns 0 on success or error on failure - */ -int voc_set_tty_mode(uint32_t session_id, uint8_t tty_mode) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - v->tty_mode = tty_mode; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_set_tty_mode); - -/** - * voc_get_tty_mode - - * Retrieve tty mode for voice session - * - * @session_id: voice session ID - * - * Returns 0 on success or error on failure - */ -uint8_t voc_get_tty_mode(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - ret = v->tty_mode; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_get_tty_mode); - -/** - * voc_set_pp_enable - - * Command to set PP for voice module - * - * @session_id: voice session ID to send this command - * @module_id: voice module id - * @enable: enable/disable flag - * - * Returns 0 on success or error on failure - */ -int voc_set_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info, - uint32_t enable) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - int mid = mod_inst_info.module_id; - int iid = mod_inst_info.instance_id; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - if (!(is_voice_app_id(v->session_id))) - continue; - - mutex_lock(&v->lock); - if (mid == MODULE_ID_VOICE_MODULE_ST && - iid == INSTANCE_ID_0) - v->st_enable = enable; - - if (v->voc_state == VOC_RUN) { - if ((mid == MODULE_ID_VOICE_MODULE_ST) && - iid == INSTANCE_ID_0 && (!v->tty_mode)) - ret = voice_send_set_pp_enable_cmd( - v, mod_inst_info, enable); - } - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_pp_enable); - -/** - * voc_set_hd_enable - - * Command to set HD for voice session - * - * @session_id: voice session ID to send this command - * @enable: enable/disable flag - * - * Returns 0 on success or error on failure - */ -int voc_set_hd_enable(uint32_t session_id, uint32_t enable) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - v->hd_enable = enable; - - if (v->voc_state == VOC_RUN) - ret = voice_send_hd_cmd(v, enable); - - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_hd_enable); - -/** - * voc_set_afe_sidetone - - * Command to set sidetone at AFE - * - * @session_id: voice session ID to send this command - * @sidetone_enable: enable/disable flag for sidetone - * - * Returns 0 on success or error on failure - */ -int voc_set_afe_sidetone(uint32_t session_id, bool sidetone_enable) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - u16 rx_port, tx_port; - - common.sidetone_enable = sidetone_enable; - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - ret = -EINVAL; - break; - } - mutex_lock(&v->lock); - if (v->voc_state != VOC_RUN) { - mutex_unlock(&v->lock); - continue; - } - rx_port = v->dev_rx.port_id; - tx_port = v->dev_tx.port_id; - ret = afe_sidetone_enable(tx_port, rx_port, - sidetone_enable); - if (!ret) { - mutex_unlock(&v->lock); - break; - } - mutex_unlock(&v->lock); - } - return ret; -} -EXPORT_SYMBOL(voc_set_afe_sidetone); - -/** - * voc_get_afe_sidetone - - * Retrieve sidetone status at AFE - * - * Returns sidetone enable status - */ -bool voc_get_afe_sidetone(void) -{ - bool ret; - - ret = common.sidetone_enable; - return ret; -} -EXPORT_SYMBOL(voc_get_afe_sidetone); -int voc_get_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - if (mod_inst_info.module_id == MODULE_ID_VOICE_MODULE_ST && - mod_inst_info.instance_id == INSTANCE_ID_0) - ret = v->st_enable; - mutex_unlock(&v->lock); - - return ret; -} - -/** - * voc_set_rx_vol_step - - * command to send voice RX volume in step value - * - * @session_id: voice session ID - * @dir: direction RX or TX - * @vol_step: Volume step value - * @ramp_duration: Ramp duration in ms - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_rx_vol_step(uint32_t session_id, uint32_t dir, uint32_t vol_step, - uint32_t ramp_duration) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - pr_debug("%s session id = %#x vol = %u", __func__, session_id, - vol_step); - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - v->dev_rx.volume_step_value = vol_step; - v->dev_rx.volume_ramp_duration_ms = ramp_duration; - if (is_voc_state_active(v->voc_state)) - ret = voice_send_vol_step_cmd(v); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_rx_vol_step); - -/** - * voc_set_device_config - - * Set voice path config for RX or TX - * - * @session_id: voice session ID - * @path_dir: direction RX or TX - * @finfo: format config info - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_device_config(uint32_t session_id, uint8_t path_dir, - struct media_format_info *finfo) -{ - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: Invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - pr_debug("%s: path_dir=%d port_id=%x, channels=%d, sample_rate=%d, bits_per_sample=%d\n", - __func__, path_dir, finfo->port_id, finfo->num_channels, - finfo->sample_rate, finfo->bits_per_sample); - - mutex_lock(&v->lock); - switch (path_dir) { - case RX_PATH: - v->dev_rx.port_id = q6audio_get_port_id(finfo->port_id); - v->dev_rx.no_of_channels = finfo->num_channels; - v->dev_rx.sample_rate = finfo->sample_rate; - v->dev_rx.bits_per_sample = finfo->bits_per_sample; - memcpy(&v->dev_rx.channel_mapping, &finfo->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - break; - case TX_PATH: - v->dev_tx.port_id = q6audio_get_port_id(finfo->port_id); - v->dev_tx.no_of_channels = finfo->num_channels; - v->dev_tx.sample_rate = finfo->sample_rate; - v->dev_tx.bits_per_sample = finfo->bits_per_sample; - memcpy(&v->dev_tx.channel_mapping, &finfo->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - break; - default: - pr_err("%s: Invalid path_dir %d\n", __func__, path_dir); - return -EINVAL; - } - - mutex_unlock(&v->lock); - - return 0; -} -EXPORT_SYMBOL(voc_set_device_config); - -/** - * voc_set_ext_ec_ref_media_fmt_info - - * Update voice EC media format info - * - * @finfo: media format info - * - */ -int voc_set_ext_ec_ref_media_fmt_info(struct media_format_info *finfo) -{ - mutex_lock(&common.common_lock); - if (common.ec_ref_ext) { - common.ec_media_fmt_info.num_channels = finfo->num_channels; - common.ec_media_fmt_info.bits_per_sample = - finfo->bits_per_sample; - common.ec_media_fmt_info.sample_rate = finfo->sample_rate; - memcpy(&common.ec_media_fmt_info.channel_mapping, - &finfo->channel_mapping, VSS_CHANNEL_MAPPING_SIZE); - } else { - pr_debug("%s: Ext Ec Ref not active, returning", __func__); - } - mutex_unlock(&common.common_lock); - return 0; -} -EXPORT_SYMBOL(voc_set_ext_ec_ref_media_fmt_info); - -/** - * voc_set_route_flag - - * Set voice route state for RX or TX - * - * @session_id: voice session ID - * @path_dir: direction RX or TX - * @set: Value of route state to set - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_route_flag(uint32_t session_id, uint8_t path_dir, uint8_t set) -{ - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - pr_debug("%s: path_dir=%d, set=%d\n", __func__, path_dir, set); - - mutex_lock(&v->lock); - - if (path_dir == RX_PATH) - v->voc_route_state.rx_route_flag = set; - else - v->voc_route_state.tx_route_flag = set; - - mutex_unlock(&v->lock); - - return 0; -} -EXPORT_SYMBOL(voc_set_route_flag); - -/** - * voc_get_route_flag - - * Retrieve voice route state for RX or TX - * - * @session_id: voice session ID - * @path_dir: direction RX or TX - * - * Returns route state on success or 0 on failure - */ -uint8_t voc_get_route_flag(uint32_t session_id, uint8_t path_dir) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return 0; - } - - mutex_lock(&v->lock); - - if (path_dir == RX_PATH) - ret = v->voc_route_state.rx_route_flag; - else - ret = v->voc_route_state.tx_route_flag; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_get_route_flag); - -/** - * voc_get_mbd_enable - - * Retrieve mic break detection enable state - * - * Returns true if mic break detection is enabled or false if disabled - */ -bool voc_get_mbd_enable(void) -{ - bool enable = false; - - mutex_lock(&common.common_lock); - enable = common.mic_break_enable; - mutex_unlock(&common.common_lock); - - return enable; -} -EXPORT_SYMBOL(voc_get_mbd_enable); - -/** - * voc_set_mbd_enable - - * Set mic break detection enable state - * - * @enable: mic break detection state to set - * - * Returns 0 - */ -uint8_t voc_set_mbd_enable(bool enable) -{ - struct voice_data *v = NULL; - struct voice_session_itr itr; - bool check_and_send_event = false; - uint32_t event_id = VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS; - uint32_t class_id = VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE; - - mutex_lock(&common.common_lock); - if (common.mic_break_enable != enable) - check_and_send_event = true; - common.mic_break_enable = enable; - mutex_unlock(&common.common_lock); - - if (!check_and_send_event) - return 0; - - if (!enable) - event_id = VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS; - - memset(&itr, 0, sizeof(itr)); - - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - voice_send_mvm_event_class_cmd(v, event_id, - class_id); - } - mutex_unlock(&v->lock); - } - } - - return 0; -} -EXPORT_SYMBOL(voc_set_mbd_enable); - -/** - * voc_end_voice_call - - * command to end voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_end_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - if (v->voc_state == VOC_RUN || v->voc_state == VOC_ERROR || - v->voc_state == VOC_CHANGE || v->voc_state == VOC_STANDBY) { - - pr_debug("%s: VOC_STATE: %d\n", __func__, v->voc_state); - - ret = voice_destroy_vocproc(v); - if (ret < 0) - pr_err("%s: destroy voice failed\n", __func__); - - voc_update_session_params(v); - - voice_destroy_mvm_cvs_session(v); - - ret = voice_mhi_end(); - if (ret < 0) - pr_debug("%s: voice_mhi_end failed! %d\n", - __func__, ret); - v->voc_state = VOC_RELEASE; - } else { - pr_err("%s: Error: End voice called in state %d\n", - __func__, v->voc_state); - - ret = -EINVAL; - } - - mutex_unlock(&v->lock); - return ret; -} -EXPORT_SYMBOL(voc_end_voice_call); - -/** - * voc_standby_voice_call - - * command to standy voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_standby_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - struct apr_hdr mvm_standby_voice_cmd; - void *apr_mvm; - u16 mvm_handle; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: voc state=%d", __func__, v->voc_state); - - if (v->voc_state == VOC_RUN) { - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - mvm_handle = voice_get_mvm_handle(v); - mvm_standby_voice_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_standby_voice_cmd.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_standby_voice_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_standby_voice_cmd pkt size = %d\n", - mvm_standby_voice_cmd.pkt_size); - mvm_standby_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_standby_voice_cmd.dest_port = mvm_handle; - mvm_standby_voice_cmd.token = 0; - mvm_standby_voice_cmd.opcode = VSS_IMVM_CMD_STANDBY_VOICE; - v->mvm_state = CMD_STATUS_FAIL; - ret = apr_send_pkt(apr_mvm, - (uint32_t *)&mvm_standby_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_STANDBY_VOICE\n"); - ret = -EINVAL; - goto fail; - } - v->voc_state = VOC_STANDBY; - } -fail: - return ret; -} -EXPORT_SYMBOL(voc_standby_voice_call); - -/** - * voc_disable_device - - * command to pause call and disable voice path - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_disable_device(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: voc state=%d\n", __func__, v->voc_state); - - mutex_lock(&v->lock); - if (v->voc_state == VOC_RUN) { - ret = voice_pause_voice_call(v); - if (ret < 0) { - pr_err("%s: Pause Voice Call failed for session 0x%x, err %d!\n", - __func__, v->session_id, ret); - goto done; - } - rtac_remove_voice(voice_get_cvs_handle(v)); - voice_send_cvp_deregister_vol_cal_cmd(v); - voice_send_cvp_deregister_cal_cmd(v); - voice_send_cvp_deregister_dev_cfg_cmd(v); - - /* Unload topology modules */ - voice_unload_topo_modules(); - - v->voc_state = VOC_CHANGE; - } else { - pr_debug("%s: called in voc state=%d, No_OP\n", - __func__, v->voc_state); - } - -done: - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_disable_device); - -/** - * voc_enable_device - - * command to enable voice path and start call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_enable_device(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - struct module_instance_info mod_inst_info; - int ret = 0; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: voc state=%d\n", __func__, v->voc_state); - mutex_lock(&v->lock); - if (v->voc_state == VOC_CHANGE) { - ret = voice_send_tty_mode_cmd(v); - if (ret < 0) { - pr_err("%s: Sending TTY mode failed, ret=%d\n", - __func__, ret); - /* Not a critical error, allow voice call to continue */ - } - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - - if (v->tty_mode) { - /* disable slowtalk */ - voice_send_set_pp_enable_cmd(v, mod_inst_info, 0); - } else { - /* restore slowtalk */ - voice_send_set_pp_enable_cmd(v, mod_inst_info, - v->st_enable); - } - - ret = voice_send_set_device_cmd(v); - if (ret < 0) { - pr_err("%s: Set device failed, ret=%d\n", - __func__, ret); - goto done; - } - - ret = voice_send_cvp_media_fmt_info_cmd(v); - if (ret < 0) { - pr_err("%s: Set format failed err:%d\n", __func__, ret); - goto done; - } - - ret = voice_send_cvp_topology_commit_cmd(v); - if (ret < 0) { - pr_err("%s: Set topology commit failed\n", __func__); - goto done; - } - - /* Send MFC config only when the no of channels are > 1 */ - if (v->dev_rx.no_of_channels > NUM_CHANNELS_MONO) { - ret = voice_send_cvp_mfc_config_cmd(v); - if (ret < 0) { - pr_warn("%s: Set mfc config failed err: %d\n", - __func__, ret); - } - } - - voice_send_cvp_register_dev_cfg_cmd(v); - voice_send_cvp_register_cal_cmd(v); - voice_send_cvp_register_vol_cal_cmd(v); - - rtac_add_voice(voice_get_cvs_handle(v), - voice_get_cvp_handle(v), - v->dev_rx.port_id, v->dev_tx.port_id, - v->dev_rx.dev_id, v->dev_tx.dev_id, - v->session_id); - - ret = voice_send_start_voice_cmd(v); - if (ret < 0) { - pr_err("%s: Fail in sending START_VOICE, ret=%d\n", - __func__, ret); - goto done; - } - v->voc_state = VOC_RUN; - } else { - pr_debug("%s: called in voc state=%d, No_OP\n", - __func__, v->voc_state); - } - -done: - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_enable_device); - -/** - * voc_set_lch - - * command to set hold/unhold call state - * - * @session_id: voice session ID to send this command - * @lch_mode: LCH mode to set - * - * Returns 0 on success or error on failure - */ -int voc_set_lch(uint32_t session_id, enum voice_lch_mode lch_mode) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: Invalid session_id 0x%x\n", __func__, session_id); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&v->lock); - if (v->lch_mode == lch_mode) { - pr_debug("%s: Session %d already in LCH mode %d\n", - __func__, session_id, lch_mode); - - mutex_unlock(&v->lock); - goto done; - } - - v->lch_mode = lch_mode; - mutex_unlock(&v->lock); - - ret = voc_lch_ops(v, v->lch_mode); - if (ret < 0) { - pr_err("%s: lch ops failed %d\n", __func__, ret); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_set_lch); - -/** - * voc_resume_voice_call - - * command to resume voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_resume_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - ret = voice_send_start_voice_cmd(v); - if (ret < 0) { - pr_err("Fail in sending START_VOICE\n"); - goto fail; - } - v->voc_state = VOC_RUN; - return 0; -fail: - return -EINVAL; -} -EXPORT_SYMBOL(voc_resume_voice_call); - -/** - * voc_start_voice_call - - * command to start voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_start_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - if (v->voc_state == VOC_ERROR) { - pr_debug("%s: VOC in ERR state\n", __func__); - - voice_destroy_mvm_cvs_session(v); - v->voc_state = VOC_INIT; - } - - if ((v->voc_state == VOC_INIT) || - (v->voc_state == VOC_RELEASE)) { - ret = voice_apr_register(session_id); - if (ret < 0) { - pr_err("%s: apr register failed\n", __func__); - goto fail; - } - - if (is_cvd_version_queried()) { - pr_debug("%s: Returning the cached value %s\n", - __func__, common.cvd_version); - } else { - ret = voice_send_mvm_cvd_version_cmd(v); - if (ret < 0) - pr_debug("%s: Error retrieving CVD version %d\n", - __func__, ret); - } - - ret = voice_mhi_start(); - if (ret < 0) { - pr_debug("%s: voice_mhi_start failed! %d\n", - __func__, ret); - goto fail; - } - - ret = voice_create_mvm_cvs_session(v); - if (ret < 0) { - pr_err("create mvm and cvs failed\n"); - goto fail; - } - - if (is_voip_session(session_id)) { - /* Allocate oob mem if not already allocated and - * memory map the oob memory block. - */ - ret = voice_alloc_and_map_oob_mem(v); - if (ret < 0) { - pr_err("%s: voice_alloc_and_map_oob_mem() failed, ret:%d\n", - __func__, ret); - - goto fail; - } - - ret = voice_set_packet_exchange_mode_and_config( - session_id, - VSS_ISTREAM_PACKET_EXCHANGE_MODE_OUT_OF_BAND); - if (ret) { - pr_err("%s: Err: exchange_mode_and_config %d\n", - __func__, ret); - - goto fail; - } - } - ret = voice_send_dual_control_cmd(v); - if (ret < 0) { - pr_err("Err Dual command failed\n"); - goto fail; - } - ret = voice_setup_vocproc(v); - if (ret < 0) { - pr_err("setup voice failed\n"); - goto fail; - } - - ret = voice_send_vol_step_cmd(v); - if (ret < 0) - pr_err("voice volume failed\n"); - - ret = voice_send_stream_mute_cmd(v, - VSS_IVOLUME_DIRECTION_TX, - v->stream_tx.stream_mute, - v->stream_tx.stream_mute_ramp_duration_ms); - if (ret < 0) - pr_err("voice mute failed\n"); - - ret = voice_send_start_voice_cmd(v); - if (ret < 0) { - pr_err("start voice failed\n"); - goto fail; - } - - v->voc_state = VOC_RUN; - } else { - pr_err("%s: Error: Start voice called in state %d\n", - __func__, v->voc_state); - - ret = -EINVAL; - goto fail; - } -fail: - mutex_unlock(&v->lock); - return ret; -} -EXPORT_SYMBOL(voc_start_voice_call); - -/** - * voc_set_ext_ec_ref_port_id - - * Set EC ref port id - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_ext_ec_ref_port_id(uint16_t port_id, bool state) -{ - int ret = 0; - - mutex_lock(&common.common_lock); - if (state == true) { - if (port_id == AFE_PORT_INVALID) { - pr_err("%s: Invalid port id", __func__); - ret = -EINVAL; - goto exit; - } - common.ec_ref_ext = true; - } else { - common.ec_ref_ext = false; - } - /* Cache EC Fromat Info in common */ - common.ec_media_fmt_info.port_id = port_id; -exit: - mutex_unlock(&common.common_lock); - return ret; -} -EXPORT_SYMBOL(voc_set_ext_ec_ref_port_id); - -/** - * voc_get_ext_ec_ref_port_id - - * Retrieve EC ref port id - * - * Returns EC Ref port id if present - * otherwise AFE_PORT_INVALID - */ -int voc_get_ext_ec_ref_port_id(void) -{ - if (common.ec_ref_ext) - return common.ec_media_fmt_info.port_id; - else - return AFE_PORT_INVALID; -} -EXPORT_SYMBOL(voc_get_ext_ec_ref_port_id); - -/** - * voc_register_mvs_cb - - * Update callback info for mvs - * - * @ul_cb: Uplink callback fn - * @dl_cb: downlink callback fn - * ssr_cb: SSR callback fn - * @private_data: private data of mvs - * - */ -void voc_register_mvs_cb(ul_cb_fn ul_cb, - dl_cb_fn dl_cb, - voip_ssr_cb ssr_cb, - void *private_data) -{ - common.mvs_info.ul_cb = ul_cb; - common.mvs_info.dl_cb = dl_cb; - common.mvs_info.ssr_cb = ssr_cb; - common.mvs_info.private_data = private_data; -} -EXPORT_SYMBOL(voc_register_mvs_cb); - -/** - * voc_register_dtmf_rx_detection_cb - - * Update callback info for dtmf - * - * @dtmf_rx_ul_cb: DTMF uplink RX callback fn - * @private_data: private data of dtmf info - * - */ -void voc_register_dtmf_rx_detection_cb(dtmf_rx_det_cb_fn dtmf_rx_ul_cb, - void *private_data) -{ - common.dtmf_info.dtmf_rx_ul_cb = dtmf_rx_ul_cb; - common.dtmf_info.private_data = private_data; -} -EXPORT_SYMBOL(voc_register_dtmf_rx_detection_cb); - -/** - * voc_config_vocoder - - * Update config for mvs params. - */ -void voc_config_vocoder(uint32_t media_type, - uint32_t rate, - uint32_t network_type, - uint32_t dtx_mode, - uint32_t evrc_min_rate, - uint32_t evrc_max_rate) -{ - common.mvs_info.media_type = media_type; - common.mvs_info.rate = rate; - common.mvs_info.network_type = network_type; - common.mvs_info.dtx_mode = dtx_mode; - common.mvs_info.evrc_min_rate = evrc_min_rate; - common.mvs_info.evrc_max_rate = evrc_max_rate; -} -EXPORT_SYMBOL(voc_config_vocoder); - -static int32_t qdsp_mvm_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr = NULL, min_payload_size = 0; - struct common_data *c = NULL; - struct voice_data *v = NULL; - struct vss_evt_voice_activity *voice_act_update = NULL; - int i = 0; - struct vss_iversion_rsp_get_t *version_rsp = NULL; - - if ((data == NULL) || (priv == NULL)) { - pr_err("%s: data or priv is NULL\n", __func__); - return -EINVAL; - } - - c = priv; - - pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__, - data->payload_size, data->opcode); - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event received in Voice service\n", - __func__); - - if (common.mvs_info.ssr_cb) { - pr_debug("%s: Informing reset event to VoIP\n", - __func__); - common.mvs_info.ssr_cb(data->opcode, - common.mvs_info.private_data); - } - - apr_reset(c->apr_q6_mvm); - c->apr_q6_mvm = NULL; - - /* clean up memory handle */ - c->cal_mem_handle = 0; - c->rtac_mem_handle = 0; - cal_utils_clear_cal_block_q6maps(MAX_VOICE_CAL_TYPES, - common.cal_data); - rtac_clear_mapping(VOICE_RTAC_CAL); - - /* Sub-system restart is applicable to all sessions. */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - c->voice[i].mvm_handle = 0; - c->voice[i].shmem_info.mem_handle = 0; - } - - /* Free the ION memory and clear handles for Source Tracking */ - if (is_source_tracking_shared_memomry_allocated()) { - msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = - NULL; - } - /* clean up srvcc rec flag */ - c->srvcc_rec_flag = false; - voc_set_error_state(data->reset_proc); - return 0; - } - - pr_debug("%s: session_idx 0x%x\n", __func__, data->dest_port); - - v = voice_get_session_by_idx(data->dest_port); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size >= sizeof(ptr[0]) * 2) { - ptr = data->payload; - - pr_debug("%x %x\n", ptr[0], ptr[1]); - /* ping mvm service ACK */ - switch (ptr[0]) { - case VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION: - case VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION: - /* Passive session is used for CS call - * Full session is used for VoIP call. - */ - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - if (!ptr[1]) { - pr_debug("%s: MVM handle is %d\n", - __func__, data->src_port); - voice_set_mvm_handle(v, data->src_port); - } else - pr_err("got NACK for sending MVM create session\n"); - v->mvm_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->mvm_wait); - break; - case VSS_IMVM_CMD_START_VOICE: - case VSS_IMVM_CMD_ATTACH_VOCPROC: - case VSS_IMVM_CMD_STOP_VOICE: - case VSS_IMVM_CMD_DETACH_VOCPROC: - case VSS_ISTREAM_CMD_SET_TTY_MODE: - case APRV2_IBASIC_CMD_DESTROY_SESSION: - case VSS_IMVM_CMD_ATTACH_STREAM: - case VSS_IMVM_CMD_DETACH_STREAM: - case VSS_ICOMMON_CMD_SET_NETWORK: - case VSS_ICOMMON_CMD_SET_VOICE_TIMING: - case VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL: - case VSS_IMVM_CMD_SET_CAL_NETWORK: - case VSS_IMVM_CMD_SET_CAL_MEDIA_TYPE: - case VSS_IMEMORY_CMD_MAP_PHYSICAL: - case VSS_IMEMORY_CMD_UNMAP: - case VSS_IMVM_CMD_PAUSE_VOICE: - case VSS_IMVM_CMD_STANDBY_VOICE: - case VSS_IHDVOICE_CMD_ENABLE: - case VSS_IHDVOICE_CMD_DISABLE: - case VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS: - case VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS: - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - v->mvm_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->mvm_wait); - break; - case VSS_IVERSION_CMD_GET: - pr_debug("%s: Error retrieving CVD Version, error:%d\n", - __func__, ptr[1]); - - strlcpy(common.cvd_version, CVD_VERSION_0_0, - sizeof(common.cvd_version)); - pr_debug("%s: Fall back to default value, CVD Version = %s\n", - __func__, common.cvd_version); - - v->mvm_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->mvm_wait); - break; - default: - pr_debug("%s: not match cmd = 0x%x\n", - __func__, ptr[0]); - break; - } - } - } else if (data->opcode == VSS_IMEMORY_RSP_MAP) { - pr_debug("%s, Revd VSS_IMEMORY_RSP_MAP response\n", __func__); - - if (data->payload_size < sizeof(ptr[0])) { - pr_err("%s: payload has invalid size[%d]\n", __func__, - data->payload_size); - return -EINVAL; - } - - if (data->token == VOIP_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - v->shmem_info.mem_handle = ptr[0]; - pr_debug("%s: shared mem_handle: 0x[%x]\n", - __func__, v->shmem_info.mem_handle); - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_CAL_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - c->cal_mem_handle = ptr[0]; - - pr_debug("%s: cal mem handle 0x%x\n", - __func__, c->cal_mem_handle); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_VOICE_HOST_PCM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - common.voice_host_pcm_mem_handle = ptr[0]; - - pr_debug("%s: vhpcm mem handle 0x%x\n", - __func__, - common.voice_host_pcm_mem_handle); - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_RTAC_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - c->rtac_mem_handle = ptr[0]; - - pr_debug("%s: cal mem handle 0x%x\n", - __func__, c->rtac_mem_handle); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_SOURCE_TRACKING_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - common.source_tracking_sh_mem.mem_handle = - ptr[0]; - - pr_debug("%s: Source Tracking shared mem handle 0x%x\n", - __func__, - common.source_tracking_sh_mem.mem_handle); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else { - pr_err("%s: Unknown mem map token %d\n", - __func__, data->token); - } - } else if (data->opcode == VSS_IVERSION_RSP_GET) { - pr_debug("%s: Received VSS_IVERSION_RSP_GET\n", __func__); - - if (data->payload_size) { - min_payload_size = min_t(u32, (int)data->payload_size, - CVD_VERSION_STRING_MAX_SIZE); - version_rsp = - (struct vss_iversion_rsp_get_t *)data->payload; - memcpy(common.cvd_version, version_rsp->version, - min_payload_size); - common.cvd_version[min_payload_size - 1] = '\0'; - pr_debug("%s: CVD Version = %s\n", - __func__, common.cvd_version); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->opcode == VSS_ICOMMON_EVT_VOICE_ACTIVITY_UPDATE) { - if (data->payload_size == sizeof(struct vss_evt_voice_activity)) { - voice_act_update = - (struct vss_evt_voice_activity *) - data->payload; - - /* Drop notifications other than Mic Break */ - if ((voice_act_update->activity - != VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK) - && (voice_act_update->activity - != VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK)) - return 0; - - switch (voice_act_update->activity) { - case VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK: - v->mic_break_status = true; - break; - case VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK: - v->mic_break_status = false; - break; - } - - if (c->mic_break_enable) - schedule_work(&(v->voice_mic_break_work)); - } - } - - return 0; -} - -static int32_t qdsp_cvs_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr = NULL; - struct common_data *c = NULL; - struct voice_data *v = NULL; - int i = 0; - - if ((data == NULL) || (priv == NULL)) { - pr_err("%s: data or priv is NULL\n", __func__); - return -EINVAL; - } - - c = priv; - - pr_debug("%s: session_id 0x%x\n", __func__, data->dest_port); - pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__, - data->payload_size, data->opcode); - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event received in Voice service\n", - __func__); - - apr_reset(c->apr_q6_cvs); - c->apr_q6_cvs = NULL; - - /* Sub-system restart is applicable to all sessions. */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) - c->voice[i].cvs_handle = 0; - - cal_utils_clear_cal_block_q6maps(MAX_VOICE_CAL_TYPES, - common.cal_data); - - /* Free the ION memory and clear handles for Source Tracking */ - if (is_source_tracking_shared_memomry_allocated()) { - msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = - NULL; - } - voc_set_error_state(data->reset_proc); - return 0; - } - - v = voice_get_session_by_idx(data->dest_port); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size) { - ptr = data->payload; - - pr_debug("%x %x\n", ptr[0], ptr[1]); - if (ptr[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, ptr[0], ptr[1]); - } - /*response from CVS */ - switch (ptr[0]) { - case VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION: - case VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION: - if (!ptr[1]) { - pr_debug("%s: CVS handle is %d\n", - __func__, data->src_port); - voice_set_cvs_handle(v, data->src_port); - } else - pr_err("got NACK for sending CVS create session\n"); - v->cvs_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvs_wait); - break; - case VSS_IVOLUME_CMD_MUTE_V2: - case VSS_ISTREAM_CMD_SET_MEDIA_TYPE: - case VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE: - case VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE: - case VSS_ISTREAM_CMD_SET_ENC_DTX_MODE: - case VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE: - case APRV2_IBASIC_CMD_DESTROY_SESSION: - case VSS_ISTREAM_CMD_REGISTER_CALIBRATION_DATA_V2: - case VSS_ISTREAM_CMD_DEREGISTER_CALIBRATION_DATA: - case VSS_ISTREAM_CMD_REGISTER_STATIC_CALIBRATION_DATA: - case VSS_ISTREAM_CMD_DEREGISTER_STATIC_CALIBRATION_DATA: - case VSS_ICOMMON_CMD_MAP_MEMORY: - case VSS_ICOMMON_CMD_UNMAP_MEMORY: - case VSS_ICOMMON_CMD_SET_UI_PROPERTY: - case VSS_ICOMMON_CMD_SET_UI_PROPERTY_V2: - case VSS_IPLAYBACK_CMD_START: - case VSS_IPLAYBACK_CMD_STOP: - case VSS_IRECORD_CMD_START: - case VSS_IRECORD_CMD_STOP: - case VSS_ISTREAM_CMD_SET_PACKET_EXCHANGE_MODE: - case VSS_ISTREAM_CMD_SET_OOB_PACKET_EXCHANGE_CONFIG: - case VSS_ISTREAM_CMD_SET_RX_DTMF_DETECTION: - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - v->cvs_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvs_wait); - break; - case VSS_ICOMMON_CMD_SET_PARAM_V2: - case VSS_ICOMMON_CMD_SET_PARAM_V3: - pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM\n", - __func__); - rtac_make_voice_callback(RTAC_CVS, ptr, - data->payload_size); - break; - case VSS_ICOMMON_CMD_GET_PARAM_V2: - case VSS_ICOMMON_CMD_GET_PARAM_V3: - pr_debug("%s: VSS_ICOMMON_CMD_GET_PARAM_V2\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* VSS_ICOMMON_RSP_GET_PARAM */ - if (ptr[1] != 0) { - pr_err("%s: CVP get param error = %d, resuming\n", - __func__, ptr[1]); - rtac_make_voice_callback(RTAC_CVP, - data->payload, - data->payload_size); - } - break; - default: - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - break; - } - } - } else if (data->opcode == - VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_READY) { - int ret = 0; - u16 cvs_handle; - uint32_t *cvs_voc_pkt; - struct cvs_enc_buffer_consumed_cmd send_enc_buf_consumed_cmd; - void *apr_cvs; - - pr_debug("Encoder buffer is ready\n"); - - apr_cvs = common.apr_q6_cvs; - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - send_enc_buf_consumed_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - send_enc_buf_consumed_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(send_enc_buf_consumed_cmd) - APR_HDR_SIZE); - - send_enc_buf_consumed_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - send_enc_buf_consumed_cmd.hdr.dest_port = cvs_handle; - send_enc_buf_consumed_cmd.hdr.token = 0; - send_enc_buf_consumed_cmd.hdr.opcode = - VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_CONSUMED; - - cvs_voc_pkt = v->shmem_info.sh_buf.buf[1].data; - if (cvs_voc_pkt != NULL && common.mvs_info.ul_cb != NULL) { - if (v->shmem_info.sh_buf.buf[1].size < - ((3 * sizeof(uint32_t)) + cvs_voc_pkt[2])) { - pr_err("%s: invalid voc pkt size\n", __func__); - return -EINVAL; - } - /* cvs_voc_pkt[0] contains tx timestamp */ - common.mvs_info.ul_cb((uint8_t *)&cvs_voc_pkt[3], - cvs_voc_pkt[2], - cvs_voc_pkt[0], - common.mvs_info.private_data); - } else - pr_err("%s: cvs_voc_pkt or ul_cb is NULL\n", __func__); - - ret = apr_send_pkt(apr_cvs, - (uint32_t *) &send_enc_buf_consumed_cmd); - if (ret < 0) { - pr_err("%s: Err send ENC_BUF_CONSUMED_NOTIFY %d\n", - __func__, ret); - goto fail; - } - } else if (data->opcode == VSS_ISTREAM_EVT_SEND_ENC_BUFFER) { - pr_debug("Recd VSS_ISTREAM_EVT_SEND_ENC_BUFFER\n"); - } else if (data->opcode == - VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_REQUEST) { - int ret = 0; - u16 cvs_handle; - uint32_t *cvs_voc_pkt; - struct cvs_dec_buffer_ready_cmd send_dec_buf; - void *apr_cvs; - - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - send_dec_buf.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - - send_dec_buf.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(send_dec_buf) - APR_HDR_SIZE); - - send_dec_buf.hdr.src_port = - voice_get_idx_for_session(v->session_id); - send_dec_buf.hdr.dest_port = cvs_handle; - send_dec_buf.hdr.token = 0; - send_dec_buf.hdr.opcode = - VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_READY; - - cvs_voc_pkt = (uint32_t *)(v->shmem_info.sh_buf.buf[0].data); - if (cvs_voc_pkt != NULL && common.mvs_info.dl_cb != NULL) { - /* Set timestamp to 0 and advance the pointer */ - cvs_voc_pkt[0] = 0; - /* Set media_type and advance the pointer */ - cvs_voc_pkt[1] = common.mvs_info.media_type; - common.mvs_info.dl_cb( - (uint8_t *)&cvs_voc_pkt[2], - common.mvs_info.private_data); - ret = apr_send_pkt(apr_cvs, (uint32_t *) &send_dec_buf); - if (ret < 0) { - pr_err("%s: Err send DEC_BUF_READY_NOTIFI %d\n", - __func__, ret); - goto fail; - } - } else { - pr_debug("%s: voc_pkt or dl_cb is NULL\n", __func__); - goto fail; - } - } else if (data->opcode == VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER) { - pr_debug("Recd VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER\n"); - } else if (data->opcode == VSS_ISTREAM_EVT_SEND_DEC_BUFFER) { - pr_debug("Send dec buf resp\n"); - } else if (data->opcode == APR_RSP_ACCEPTED) { - ptr = data->payload; - if (ptr[0]) - pr_debug("%s: APR_RSP_ACCEPTED for 0x%x:\n", - __func__, ptr[0]); - } else if (data->opcode == VSS_ISTREAM_EVT_NOT_READY) { - pr_debug("Recd VSS_ISTREAM_EVT_NOT_READY\n"); - } else if (data->opcode == VSS_ISTREAM_EVT_READY) { - pr_debug("Recd VSS_ISTREAM_EVT_READY\n"); - } else if (data->opcode == VSS_ICOMMON_RSP_GET_PARAM || - data->opcode == VSS_ICOMMON_RSP_GET_PARAM_V3) { - pr_debug("%s: VSS_ICOMMON_RSP_GET_PARAM\n", __func__); - ptr = data->payload; - if (ptr[0] != 0) { - pr_err("%s: VSS_ICOMMON_RSP_GET_PARAM returned error = 0x%x\n", - __func__, ptr[0]); - } - rtac_make_voice_callback(RTAC_CVS, data->payload, - data->payload_size); - } else if (data->opcode == VSS_ISTREAM_EVT_RX_DTMF_DETECTED) { - struct vss_istream_evt_rx_dtmf_detected *dtmf_rx_detected; - uint32_t *voc_pkt = data->payload; - uint32_t pkt_len = data->payload_size; - - if ((voc_pkt != NULL) && - (pkt_len == - sizeof(struct vss_istream_evt_rx_dtmf_detected))) { - - dtmf_rx_detected = - (struct vss_istream_evt_rx_dtmf_detected *) voc_pkt; - pr_debug("RX_DTMF_DETECTED low_freq=%d high_freq=%d\n", - dtmf_rx_detected->low_freq, - dtmf_rx_detected->high_freq); - if (c->dtmf_info.dtmf_rx_ul_cb) - c->dtmf_info.dtmf_rx_ul_cb((uint8_t *)voc_pkt, - voc_get_session_name(v->session_id), - c->dtmf_info.private_data); - } else { - pr_err("Invalid packet\n"); - } - } else - pr_debug("Unknown opcode 0x%x\n", data->opcode); - -fail: - return 0; -} - -static int32_t qdsp_cvp_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr = NULL; - struct common_data *c = NULL; - struct voice_data *v = NULL; - int i = 0; - - if ((data == NULL) || (priv == NULL)) { - pr_err("%s: data or priv is NULL\n", __func__); - return -EINVAL; - } - - c = priv; - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event received in Voice service\n", - __func__); - - apr_reset(c->apr_q6_cvp); - c->apr_q6_cvp = NULL; - cal_utils_clear_cal_block_q6maps(MAX_VOICE_CAL_TYPES, - common.cal_data); - - /* Sub-system restart is applicable to all sessions. */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) - c->voice[i].cvp_handle = 0; - - /* - * Free the ION memory and clear handles for - * Source Tracking - */ - if (is_source_tracking_shared_memomry_allocated()) { - msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = - NULL; - } - voc_set_error_state(data->reset_proc); - return 0; - } - - v = voice_get_session_by_idx(data->dest_port); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size >= (2 * sizeof(uint32_t))) { - ptr = data->payload; - - pr_debug("%x %x\n", ptr[0], ptr[1]); - if (ptr[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, ptr[0], ptr[1]); - } - switch (ptr[0]) { - case VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2: - case VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V3: - /*response from CVP */ - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - if (!ptr[1]) { - voice_set_cvp_handle(v, data->src_port); - pr_debug("status: %d, cvphdl=%d\n", - ptr[1], data->src_port); - } else - pr_err("got NACK from CVP create session response\n"); - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_IVOCPROC_CMD_SET_DEVICE_V2: - case VSS_IVOCPROC_CMD_SET_DEVICE_V3: - case VSS_IVOLUME_CMD_SET_STEP: - case VSS_IVOCPROC_CMD_ENABLE: - case VSS_IVOCPROC_CMD_DISABLE: - case APRV2_IBASIC_CMD_DESTROY_SESSION: - case VSS_IVOCPROC_CMD_REGISTER_VOL_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_DEREGISTER_VOL_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_CALIBRATION_DATA_V2: - case VSS_IVOCPROC_CMD_DEREGISTER_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_DYNAMIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_DEREGISTER_DYNAMIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_STATIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_DEREGISTER_STATIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_DEVICE_CONFIG: - case VSS_IVOCPROC_CMD_DEREGISTER_DEVICE_CONFIG: - case VSS_ICOMMON_CMD_MAP_MEMORY: - case VSS_ICOMMON_CMD_UNMAP_MEMORY: - case VSS_IVOLUME_CMD_MUTE_V2: - case VSS_IVPCM_CMD_START_V2: - case VSS_IVPCM_CMD_STOP: - case VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS: - case VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT: - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_IVPCM_EVT_PUSH_BUFFER_V2: - break; - case VSS_ICOMMON_CMD_SET_PARAM_V2: - case VSS_ICOMMON_CMD_SET_PARAM_V3: - switch (data->token) { - case VOC_SET_MEDIA_FORMAT_PARAM_TOKEN: - case VOC_GENERIC_SET_PARAM_TOKEN: - pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM called by voice_send_cvp_media_format_cmd\n", - __func__); - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VOC_RTAC_SET_PARAM_TOKEN: - pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM called by rtac\n", - __func__); - rtac_make_voice_callback( - RTAC_CVP, ptr, - data->payload_size); - break; - default: - pr_debug("%s: invalid token for command VSS_ICOMMON_CMD_SET_PARAM: %d\n", - __func__, data->token); - break; - } - break; - case VSS_ICOMMON_CMD_GET_PARAM_V2: - case VSS_ICOMMON_CMD_GET_PARAM_V3: - pr_debug("%s: VSS_ICOMMON_CMD_GET_PARAM_V2\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* VSS_ICOMMON_RSP_GET_PARAM */ - if (ptr[1] != 0) { - pr_err("%s: CVP get param error = %d, resuming\n", - __func__, ptr[1]); - rtac_make_voice_callback(RTAC_CVP, - data->payload, - data->payload_size); - } - break; - case VSS_ISOUNDFOCUS_CMD_SET_SECTORS: - if (!ptr[1]) - common.is_sound_focus_resp_success = - true; - else - common.is_sound_focus_resp_success = - false; - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_ISOUNDFOCUS_CMD_GET_SECTORS: - /* - * Should only come here if there is an error - * response received from ADSP. Otherwise - * response will be returned as - * VSS_ISOUNDFOCUS_RSP_GET_SECTORS - */ - pr_err("%s: VSS_ISOUNDFOCUS_CMD_GET_SECTORS failed\n", - __func__); - - common.is_sound_focus_resp_success = false; - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_ISOURCETRACK_CMD_GET_ACTIVITY: - if (!ptr[1]) { - /* Read data from shared memory */ - memcpy(&common.sourceTrackingResponse, - common.source_tracking_sh_mem. - sh_mem_block.data, - sizeof(struct - vss_isourcetrack_activity_data_t)); - common.is_source_tracking_resp_success = - true; - } else { - common.is_source_tracking_resp_success = - false; - pr_err("%s: Error received for source tracking params\n", - __func__); - } - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - default: - pr_debug("%s: not match cmd = 0x%x\n", - __func__, ptr[0]); - break; - } - } - } else if (data->opcode == VSS_ICOMMON_RSP_GET_PARAM || - data->opcode == VSS_ICOMMON_RSP_GET_PARAM_V3) { - pr_debug("%s: VSS_ICOMMON_RSP_GET_PARAM\n", __func__); - ptr = data->payload; - if (ptr[0] != 0) { - pr_err("%s: VSS_ICOMMON_RSP_GET_PARAM returned error = 0x%x\n", - __func__, ptr[0]); - } - rtac_make_voice_callback(RTAC_CVP, data->payload, - data->payload_size); - } else if (data->opcode == VSS_IVPCM_EVT_NOTIFY_V2) { - if ((data->payload != NULL) && data->payload_size == - sizeof(struct vss_ivpcm_evt_notify_v2_t) && - common.hostpcm_info.hostpcm_evt_cb != NULL) { - common.hostpcm_info.hostpcm_evt_cb(data->payload, - voc_get_session_name(v->session_id), - common.hostpcm_info.private_data); - } - } else if (data->opcode == VSS_ISOUNDFOCUS_RSP_GET_SECTORS) { - if (data->payload && (data->payload_size == - sizeof(struct vss_isoundfocus_rsp_get_sectors_t))) { - common.is_sound_focus_resp_success = true; - memcpy(&common.soundFocusResponse, - (struct vss_isoundfocus_rsp_get_sectors_t *) - data->payload, - sizeof(struct - vss_isoundfocus_rsp_get_sectors_t)); - } else { - common.is_sound_focus_resp_success = false; - pr_debug("%s: Invalid payload received from CVD\n", - __func__); - } - v->cvp_state = CMD_STATUS_SUCCESS; - wake_up(&v->cvp_wait); - } - return 0; -} - -static int voice_free_oob_shared_mem(void) -{ - int rc = 0; - int cnt = 0; - int bufcnt = NUM_OF_BUFFERS; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - mutex_lock(&common.common_lock); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - rc = -EINVAL; - goto done; - } - - rc = msm_audio_ion_free(v->shmem_info.sh_buf.dma_buf); - v->shmem_info.sh_buf.dma_buf = NULL; - if (rc < 0) { - pr_err("%s: Error:%d freeing memory\n", __func__, rc); - - goto done; - } - - - while (cnt < bufcnt) { - v->shmem_info.sh_buf.buf[cnt].data = NULL; - v->shmem_info.sh_buf.buf[cnt].phys = 0; - cnt++; - } - - v->shmem_info.sh_buf.dma_buf = NULL; - -done: - mutex_unlock(&common.common_lock); - return rc; -} - -static int voice_alloc_oob_shared_mem(void) -{ - int cnt = 0; - int rc = 0; - size_t len; - void *mem_addr = NULL; - dma_addr_t phys; - int bufsz = BUFFER_BLOCK_SIZE; - int bufcnt = NUM_OF_BUFFERS; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - mutex_lock(&common.common_lock); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - rc = -EINVAL; - goto done; - } - - rc = msm_audio_ion_alloc(&(v->shmem_info.sh_buf.dma_buf), - bufsz * bufcnt, - &phys, &len, - &mem_addr); - if (rc < 0) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, rc); - - goto done; - } - - while (cnt < bufcnt) { - v->shmem_info.sh_buf.buf[cnt].data = mem_addr + (cnt * bufsz); - v->shmem_info.sh_buf.buf[cnt].phys = phys + (cnt * bufsz); - v->shmem_info.sh_buf.buf[cnt].size = bufsz; - cnt++; - } - - pr_debug("%s buf[0].data:[%pK], buf[0].phys:[%pK], &buf[0].phys:[%pK],\n", - __func__, - (void *)v->shmem_info.sh_buf.buf[0].data, - &v->shmem_info.sh_buf.buf[0].phys, - (void *)&v->shmem_info.sh_buf.buf[0].phys); - pr_debug("%s: buf[1].data:[%pK], buf[1].phys[%pK], &buf[1].phys[%pK]\n", - __func__, - (void *)v->shmem_info.sh_buf.buf[1].data, - &v->shmem_info.sh_buf.buf[1].phys, - (void *)&v->shmem_info.sh_buf.buf[1].phys); - - memset((void *)v->shmem_info.sh_buf.buf[0].data, 0, (bufsz * bufcnt)); - -done: - mutex_unlock(&common.common_lock); - return rc; -} - -static int voice_alloc_oob_mem_table(void) -{ - int rc = 0; - size_t len; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - mutex_lock(&common.common_lock); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - rc = -EINVAL; - goto done; - } - - rc = msm_audio_ion_alloc(&(v->shmem_info.memtbl.dma_buf), - sizeof(struct vss_imemory_table_t), - &v->shmem_info.memtbl.phys, - &len, - &(v->shmem_info.memtbl.data)); - if (rc < 0) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, rc); - - goto done; - } - - v->shmem_info.memtbl.size = sizeof(struct vss_imemory_table_t); - pr_debug("%s data[%pK]phys[%pK][%pK]\n", __func__, - (void *)v->shmem_info.memtbl.data, - &v->shmem_info.memtbl.phys, - (void *)&v->shmem_info.memtbl.phys); - -done: - mutex_unlock(&common.common_lock); - return rc; -} - -/** - * voc_send_cvp_start_vocpcm - - * command to start voice hpcm - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_start_vocpcm(uint32_t session_id, - struct vss_ivpcm_tap_point *vpcm_tp, - uint32_t no_of_tp) -{ - struct cvp_start_cmd cvp_start_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - struct voice_data *v = voice_get_session(session_id); - int i = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - - /* Fill the header */ - cvp_start_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_start_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(struct vss_ivpcm_tap_point) * no_of_tp) + - sizeof(cvp_start_cmd.vpcm_start_cmd.num_tap_points) + - sizeof(cvp_start_cmd.vpcm_start_cmd.mem_handle); - cvp_start_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - cvp_start_cmd.hdr.dest_port = cvp_handle; - cvp_start_cmd.hdr.token = 0; - cvp_start_cmd.hdr.opcode = VSS_IVPCM_CMD_START_V2; - - for (i = 0; i < no_of_tp; i++) { - cvp_start_cmd.vpcm_start_cmd.tap_points[i].tap_point = - vpcm_tp[i].tap_point; - cvp_start_cmd.vpcm_start_cmd.tap_points[i].direction = - vpcm_tp[i].direction; - cvp_start_cmd.vpcm_start_cmd.tap_points[i].sampling_rate = - vpcm_tp[i].sampling_rate; - cvp_start_cmd.vpcm_start_cmd.tap_points[i].duration = 0; - } - - cvp_start_cmd.vpcm_start_cmd.mem_handle = - common.voice_host_pcm_mem_handle; - cvp_start_cmd.vpcm_start_cmd.num_tap_points = no_of_tp; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_start_cmd); - if (ret < 0) { - pr_err("%s: Fail: sending vocpcm map memory,\n", __func__); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_start_vocpcm); - -/** - * voc_send_cvp_stop_vocpcm - - * command to stop voice hpcm - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_stop_vocpcm(uint32_t session_id) -{ - struct cvp_command vpcm_stop_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - - /* fill in the header */ - vpcm_stop_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - vpcm_stop_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(vpcm_stop_cmd) - APR_HDR_SIZE); - vpcm_stop_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - vpcm_stop_cmd.hdr.dest_port = cvp_handle; - vpcm_stop_cmd.hdr.token = 0; - vpcm_stop_cmd.hdr.opcode = VSS_IVPCM_CMD_STOP; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &vpcm_stop_cmd); - if (ret < 0) { - pr_err("Fail: sending vocpcm stop,\n"); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_stop_vocpcm); - -/** - * voc_send_cvp_map_vocpcm_memory - - * command to map memory for voice hpcm - * - * @session_id: voice session ID to send this command - * @tp_mem_table: tap point memory table of hpcm - * paddr: Physical address of hpcm memory mapped area. - * bufsize: Buffer size of memory mapped area - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_map_vocpcm_memory(uint32_t session_id, - struct mem_map_table *tp_mem_table, - phys_addr_t paddr, uint32_t bufsize) -{ - return voice_map_memory_physical_cmd(voice_get_session(session_id), - tp_mem_table, - (dma_addr_t) paddr, bufsize, - VOC_VOICE_HOST_PCM_MAP_TOKEN); -} -EXPORT_SYMBOL(voc_send_cvp_map_vocpcm_memory); - -/** - * voc_send_cvp_unmap_vocpcm_memory - - * command to unmap memory for voice hpcm - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_unmap_vocpcm_memory(uint32_t session_id) -{ - int ret = 0; - - ret = voice_send_mvm_unmap_memory_physical_cmd( - voice_get_session(session_id), - common.voice_host_pcm_mem_handle); - - if (ret == 0) - common.voice_host_pcm_mem_handle = 0; - - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_unmap_vocpcm_memory); - -/** - * voc_send_cvp_vocpcm_push_buf_evt - Send buf event command - * - * @session_id: voice session ID to send this command - * @push_buff_evt: pointer with buffer event details - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_vocpcm_push_buf_evt(uint32_t session_id, - struct vss_ivpcm_evt_push_buffer_v2_t *push_buff_evt) -{ - struct cvp_push_buf_cmd vpcm_push_buf_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto done; - } - - memset(&vpcm_push_buf_cmd, 0, sizeof(vpcm_push_buf_cmd)); - cvp_handle = voice_get_cvp_handle(v); - - /* fill in the header */ - vpcm_push_buf_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - vpcm_push_buf_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(vpcm_push_buf_cmd) - APR_HDR_SIZE); - vpcm_push_buf_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - vpcm_push_buf_cmd.hdr.dest_port = cvp_handle; - vpcm_push_buf_cmd.hdr.token = 0; - vpcm_push_buf_cmd.hdr.opcode = VSS_IVPCM_EVT_PUSH_BUFFER_V2; - - vpcm_push_buf_cmd.vpcm_evt_push_buffer.tap_point = - push_buff_evt->tap_point; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.push_buf_mask = - push_buff_evt->push_buf_mask; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.out_buf_mem_address = - push_buff_evt->out_buf_mem_address; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.in_buf_mem_address = - push_buff_evt->in_buf_mem_address; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.out_buf_mem_size = - push_buff_evt->out_buf_mem_size; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.in_buf_mem_size = - push_buff_evt->in_buf_mem_size; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.sampling_rate = - push_buff_evt->sampling_rate; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.num_in_channels = - push_buff_evt->num_in_channels; - - ret = apr_send_pkt(apr_cvp, (uint32_t *) &vpcm_push_buf_cmd); - if (ret < 0) { - pr_err("Fail: sending vocpcm map memory,\n"); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_vocpcm_push_buf_evt); - -/** - * voc_register_hpcm_evt_cb - Updates hostpcm info. - * - * @hostpcm_cb: callback function for hostpcm event - * @private_data: private data for hostpcm - * - */ -void voc_register_hpcm_evt_cb(hostpcm_cb_fn hostpcm_cb, - void *private_data) -{ - common.hostpcm_info.hostpcm_evt_cb = hostpcm_cb; - common.hostpcm_info.private_data = private_data; -} -EXPORT_SYMBOL(voc_register_hpcm_evt_cb); - -/** - * voc_deregister_hpcm_evt_cb - resets hostpcm info. - * - */ -void voc_deregister_hpcm_evt_cb(void) -{ - common.hostpcm_info.hostpcm_evt_cb = NULL; - common.hostpcm_info.private_data = NULL; -} -EXPORT_SYMBOL(voc_deregister_hpcm_evt_cb); - -/** - * voc_get_cvd_version - retrieve CVD version. - * - * @cvd_version: pointer to be updated with CVD version info. - * - * Returns 0 on success or error on failure - */ -int voc_get_cvd_version(char *cvd_version) -{ - int ret = 0; - struct voice_data *v = voice_get_session(VOICE_SESSION_VSID); - - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", - __func__, VOICE_SESSION_VSID); - - ret = -EINVAL; - goto done; - } - - if (is_cvd_version_queried()) { - pr_debug("%s: Returning the cached value %s\n", - __func__, common.cvd_version); - - goto done; - } - - /* Register callback to APR */ - ret = voice_apr_register(VOICE_SESSION_VSID); - if (ret < 0) { - pr_err("%s: apr register failed\n", __func__); - goto done; - } - - mutex_lock(&common.common_lock); - mutex_lock(&v->lock); - ret = voice_send_mvm_cvd_version_cmd(v); - if (ret < 0) { - pr_err("%s: voice_send_mvm_cvd_version_cmd failed\n", __func__); - goto unlock; - } - ret = 0; - -unlock: - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); - -done: - if (cvd_version) - memcpy(cvd_version, common.cvd_version, - CVD_VERSION_STRING_MAX_SIZE); - - return ret; -} -EXPORT_SYMBOL(voc_get_cvd_version); - -static int voice_alloc_cal_mem_map_table(void) -{ - int ret = 0; - size_t len; - - ret = msm_audio_ion_alloc(&(common.cal_mem_map_table.dma_buf), - sizeof(struct vss_imemory_table_t), - &common.cal_mem_map_table.phys, - &len, - &(common.cal_mem_map_table.data)); - if ((ret < 0) && (ret != -EPROBE_DEFER)) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, ret); - goto done; - } - - common.cal_mem_map_table.size = sizeof(struct vss_imemory_table_t); - pr_debug("%s: data %pK phys %pK\n", __func__, - common.cal_mem_map_table.data, - &common.cal_mem_map_table.phys); - -done: - return ret; -} - -static int voice_alloc_rtac_mem_map_table(void) -{ - int ret = 0; - size_t len; - - ret = msm_audio_ion_alloc( - &(common.rtac_mem_map_table.dma_buf), - sizeof(struct vss_imemory_table_t), - &common.rtac_mem_map_table.phys, - &len, - &(common.rtac_mem_map_table.data)); - if (ret < 0) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, ret); - goto done; - } - - common.rtac_mem_map_table.size = sizeof(struct vss_imemory_table_t); - pr_debug("%s: data %pK phys %pK\n", __func__, - common.rtac_mem_map_table.data, - &common.rtac_mem_map_table.phys); - -done: - return ret; -} - -static int voice_alloc_and_map_oob_mem(struct voice_data *v) -{ - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (!is_voip_memory_allocated()) { - ret = voc_alloc_voip_shared_memory(); - if (ret < 0) { - pr_err("%s: Failed to create voip oob memory %d\n", - __func__, ret); - - goto done; - } - } - - ret = voice_map_memory_physical_cmd(v, - &v->shmem_info.memtbl, - v->shmem_info.sh_buf.buf[0].phys, - v->shmem_info.sh_buf.buf[0].size * NUM_OF_BUFFERS, - VOIP_MEM_MAP_TOKEN); - if (ret) { - pr_err("%s: mvm_map_memory_phy failed %d\n", - __func__, ret); - - goto done; - } - -done: - return ret; -} - -uint32_t voice_get_topology(uint32_t topology_idx) -{ - uint32_t topology = VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT; - struct cal_block_data *cal_block = NULL; - - /* initialize as default topology */ - if (topology_idx == CVP_VOC_RX_TOPOLOGY_CAL) { - topology = VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT; - } else if (topology_idx == CVP_VOC_TX_TOPOLOGY_CAL) { - topology = VSS_IVOCPROC_TOPOLOGY_ID_NONE; - } else { - pr_err("%s: cal index %x is invalid!\n", - __func__, topology_idx); - - goto done; - } - - if (common.cal_data[topology_idx] == NULL) { - pr_err("%s: cal type is NULL for cal index %x\n", - __func__, topology_idx); - - goto done; - } - - mutex_lock(&common.cal_data[topology_idx]->lock); - cal_block = cal_utils_get_only_cal_block( - common.cal_data[topology_idx]); - if (cal_block == NULL) { - pr_debug("%s: cal_block not found for cal index %x\n", - __func__, topology_idx); - - goto unlock; - } - - topology = ((struct audio_cal_info_voc_top *) - cal_block->cal_info)->topology; -unlock: - mutex_unlock(&common.cal_data[topology_idx]->lock); -done: - pr_debug("%s: Using topology %d\n", __func__, topology); - - return topology; -} - -int voice_set_topology_specific_info(struct voice_data *v, - uint32_t topology_idx) -{ - struct cal_block_data *cal_block = NULL; - int ret = 0; - uint32_t topo_channels; - - if (common.cal_data[topology_idx] == NULL) { - pr_err("%s: cal type is NULL for cal index %x\n", - __func__, topology_idx); - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[topology_idx]->lock); - cal_block = cal_utils_get_only_cal_block( - common.cal_data[topology_idx]); - if (cal_block == NULL) { - pr_debug("%s: cal_block not found for cal index %x\n", - __func__, topology_idx); - ret = -EINVAL; - goto unlock; - } - - if (topology_idx == CVP_VOC_RX_TOPOLOGY_CAL) { - topo_channels = ((struct audio_cal_info_voc_top *) - cal_block->cal_info)->num_channels; - if (topo_channels > 0) { - v->dev_rx.no_of_channels = topo_channels; - pr_debug("%s: Topology Rx no of channels: %d", - __func__, v->dev_rx.no_of_channels); - memcpy(&v->dev_rx.channel_mapping, - &((struct audio_cal_info_voc_top *) - cal_block->cal_info)->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - } else { - pr_debug("%s: cal data is zero, default to Rx backend config\n", - __func__); - if (v->dev_rx.no_of_channels == NUM_CHANNELS_MONO) { - v->dev_rx.channel_mapping[0] = PCM_CHANNEL_FC; - } else if (v->dev_rx.no_of_channels == - NUM_CHANNELS_STEREO) { - v->dev_rx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_rx.channel_mapping[1] = PCM_CHANNEL_FR; - } else { - pr_warn("%s: Unsupported Rx num channels: %d\n", - __func__, v->dev_rx.no_of_channels); - } - } - } else if (topology_idx == CVP_VOC_TX_TOPOLOGY_CAL) { - topo_channels = ((struct audio_cal_info_voc_top *) - cal_block->cal_info)->num_channels; - if (topo_channels > 0) { - v->dev_tx.no_of_channels = topo_channels; - pr_debug("%s: Topology Tx no of channels: %d", - __func__, v->dev_tx.no_of_channels); - memcpy(&v->dev_tx.channel_mapping, - &((struct audio_cal_info_voc_top *) - cal_block->cal_info)->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - } else { - pr_debug("%s: cal data is zero, default to Tx backend config\n", - __func__); - if (v->dev_tx.no_of_channels == NUM_CHANNELS_MONO) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FC; - } else if (v->dev_tx.no_of_channels == - NUM_CHANNELS_STEREO) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR; - } else if (v->dev_tx.no_of_channels == - NUM_CHANNELS_THREE) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR; - v->dev_tx.channel_mapping[2] = PCM_CHANNEL_FC; - } else if (v->dev_tx.no_of_channels == - NUM_CHANNELS_QUAD) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR; - v->dev_tx.channel_mapping[2] = PCM_CHANNEL_LS; - v->dev_tx.channel_mapping[3] = PCM_CHANNEL_RS; - } else { - pr_warn("%s: Unsupported Tx num channels: %d\n", - __func__, v->dev_tx.no_of_channels); - } - } - } else { - pr_err("%s: topology index %x is invalid\n", - __func__, topology_idx); - } -unlock: - mutex_unlock(&common.cal_data[topology_idx]->lock); -done: - return ret; -} - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case CVP_VOC_RX_TOPOLOGY_CAL_TYPE: - ret = CVP_VOC_RX_TOPOLOGY_CAL; - break; - case CVP_VOC_TX_TOPOLOGY_CAL_TYPE: - ret = CVP_VOC_TX_TOPOLOGY_CAL; - break; - case CVP_VOCPROC_STATIC_CAL_TYPE: - ret = CVP_VOCPROC_CAL; - break; - case CVP_VOCPROC_DYNAMIC_CAL_TYPE: - ret = CVP_VOCVOL_CAL; - break; - case CVS_VOCSTRM_STATIC_CAL_TYPE: - ret = CVS_VOCSTRM_CAL; - break; - case CVP_VOCDEV_CFG_CAL_TYPE: - ret = CVP_VOCDEV_CFG_CAL; - break; - case CVP_VOCPROC_STATIC_COL_CAL_TYPE: - ret = CVP_VOCPROC_COL_CAL; - break; - case CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE: - ret = CVP_VOCVOL_COL_CAL; - break; - case CVS_VOCSTRM_STATIC_COL_CAL_TYPE: - ret = CVS_VOCSTRM_COL_CAL; - break; - case VOICE_RTAC_INFO_CAL_TYPE: - ret = VOICE_RTAC_INFO_CAL; - break; - case VOICE_RTAC_APR_CAL_TYPE: - ret = VOICE_RTAC_APR_CAL; - break; - default: - pr_err("%s: Invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int voice_prepare_volume_boost(int32_t cal_type, - size_t data_size, void *data) -{ - return voc_deregister_vocproc_vol_table(); -} - -static int voice_enable_volume_boost(int32_t cal_type, - size_t data_size, void *data) -{ - return voc_register_vocproc_vol_table(); -} - -static int voice_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - int cal_version; - - pr_debug("%s\n", __func__); - - cal_version = cal_utils_get_cal_type_version(data); - common.is_per_vocoder_cal_enabled = - !!(cal_version & PER_VOCODER_CAL_BIT_MASK); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: Cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int voice_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d!\n", - __func__, cal_index); - - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - common.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: Cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int voice_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d!\n", - __func__, cal_index); - - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: Cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - - ret = -EINVAL; - goto done; - } - /* Pre-load if it is voice Rx or Tx topology */ - if ((cal_index == CVP_VOC_RX_TOPOLOGY_CAL) || - (cal_index == CVP_VOC_TX_TOPOLOGY_CAL)) { - voice_load_topo_modules(cal_index); - } -done: - return ret; -} - -static void voice_delete_cal_data(void) -{ - pr_debug("%s\n", __func__); - - cal_utils_destroy_cal_types(MAX_VOICE_CAL_TYPES, common.cal_data); -} - -static int voice_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{CVP_VOC_RX_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVP_VOC_TX_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_STATIC_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, NULL, - voice_set_cal, NULL, NULL} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_DYNAMIC_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, - voice_prepare_volume_boost, - voice_set_cal, NULL, - voice_enable_volume_boost} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVP_VOCDEV_CFG_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, NULL, - voice_set_cal, NULL, NULL} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_STATIC_COL_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVS_VOCSTRM_STATIC_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, NULL, - voice_set_cal, NULL, NULL} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVS_VOCSTRM_STATIC_COL_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{VOICE_RTAC_INFO_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{VOICE_RTAC_APR_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - - ret = cal_utils_create_cal_types(MAX_VOICE_CAL_TYPES, common.cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: Could not create cal type!\n", - __func__); - - ret = -EINVAL; - goto err; - } - - return ret; -err: - voice_delete_cal_data(); - memset(&common, 0, sizeof(struct common_data)); - return ret; -} - -static int voice_send_set_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param soundFocusData) -{ - struct cvp_set_sound_focus_param_cmd_t cvp_set_sound_focus_param_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - int i; - - pr_debug("%s: Enter\n", __func__); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - cvp_handle = voice_get_cvp_handle(v); - - /* send Sound Focus Params to cvp */ - cvp_set_sound_focus_param_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_sound_focus_param_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_sound_focus_param_cmd) - APR_HDR_SIZE); - cvp_set_sound_focus_param_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_sound_focus_param_cmd.hdr.dest_port = cvp_handle; - cvp_set_sound_focus_param_cmd.hdr.token = 0; - cvp_set_sound_focus_param_cmd.hdr.opcode = - VSS_ISOUNDFOCUS_CMD_SET_SECTORS; - - memset(&(cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param), 0xFF, - sizeof(struct vss_isoundfocus_cmd_set_sectors_t)); - for (i = 0; i < MAX_SECTORS; i++) { - cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param. - start_angles[i] = soundFocusData.start_angle[i]; - cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param. - enables[i] = soundFocusData.enable[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData.start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData.enable[i]); - } - cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param.gain_step = - soundFocusData.gain_step; - pr_debug("%s: gain_step = %d\n", __func__, soundFocusData.gain_step); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_sound_focus_param_cmd); - if (ret < 0) { - pr_err("%s: Error in sending APR command\n", __func__); - - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - if (common.is_sound_focus_resp_success) { - ret = 0; - } else { - pr_err("%s: Error in setting sound focus params\n", __func__); - - ret = -EINVAL; - } - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -/** - * voc_set_sound_focus - sends sound focus data. - * - * @soundFocusData: sound focus data. - * - * Returns 0 on success or error on failure - */ -int voc_set_sound_focus(struct sound_focus_param soundFocusData) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - - pr_debug("%s: Enter\n", __func__); - - mutex_lock(&common.common_lock); - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state) && - (v->lch_mode != VOICE_LCH_START) && - !v->disable_topology) - ret = voice_send_set_sound_focus_cmd(v, - soundFocusData); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session\n", __func__); - - ret = -EINVAL; - break; - } - } - mutex_unlock(&common.common_lock); - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(voc_set_sound_focus); - -static int voice_send_get_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param *soundFocusData) -{ - struct apr_hdr cvp_get_sound_focus_param_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - int i; - - pr_debug("%s: Enter\n", __func__); - - if (!v) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - - /* send APR command to retrieve Sound Focus Params */ - cvp_get_sound_focus_param_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_get_sound_focus_param_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_get_sound_focus_param_cmd) - APR_HDR_SIZE); - cvp_get_sound_focus_param_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_get_sound_focus_param_cmd.dest_port = cvp_handle; - cvp_get_sound_focus_param_cmd.token = 0; - cvp_get_sound_focus_param_cmd.opcode = VSS_ISOUNDFOCUS_CMD_GET_SECTORS; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_get_sound_focus_param_cmd); - if (ret < 0) { - pr_err("%s: Error in sending APR command\n", __func__); - - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - if (common.is_sound_focus_resp_success) { - for (i = 0; i < MAX_SECTORS; i++) { - soundFocusData->start_angle[i] = - common.soundFocusResponse.start_angles[i]; - soundFocusData->enable[i] = - common.soundFocusResponse.enables[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData->start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData->enable[i]); - } - soundFocusData->gain_step = common.soundFocusResponse.gain_step; - pr_debug("%s: gain_step = %d\n", __func__, - soundFocusData->gain_step); - - common.is_sound_focus_resp_success = false; - ret = 0; - } else { - pr_err("%s: Invalid payload received from CVD\n", __func__); - - ret = -EINVAL; - } -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -/** - * voc_get_sound_focus - retrieves sound focus data. - * - * @soundFocusData: pointer to be updated with sound focus data. - * - * Returns 0 on success or error on failure - */ -int voc_get_sound_focus(struct sound_focus_param *soundFocusData) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - - pr_debug("%s: Enter\n", __func__); - - mutex_lock(&common.common_lock); - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state) && - (v->lch_mode != VOICE_LCH_START) && - !v->disable_topology) - ret = voice_send_get_sound_focus_cmd(v, - soundFocusData); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session\n", __func__); - - ret = -EINVAL; - break; - } - } - mutex_unlock(&common.common_lock); - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(voc_get_sound_focus); - -static int is_source_tracking_shared_memomry_allocated(void) -{ - bool ret; - - pr_debug("%s: Enter\n", __func__); - - if (common.source_tracking_sh_mem.sh_mem_block.dma_buf != NULL) - ret = true; - else - ret = false; - - pr_debug("%s: Exit\n", __func__); - - return ret; -} - -static int voice_alloc_source_tracking_shared_memory(void) -{ - int ret = 0; - - pr_debug("%s: Enter\n", __func__); - - ret = msm_audio_ion_alloc( - &(common.source_tracking_sh_mem.sh_mem_block.dma_buf), - BUFFER_BLOCK_SIZE, - &(common.source_tracking_sh_mem.sh_mem_block.phys), - (size_t *)&(common.source_tracking_sh_mem.sh_mem_block.size), - &(common.source_tracking_sh_mem.sh_mem_block.data)); - if (ret < 0) { - pr_err("%s: audio ION alloc failed for sh_mem block, ret = %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - memset((void *)(common.source_tracking_sh_mem.sh_mem_block.data), 0, - common.source_tracking_sh_mem.sh_mem_block.size); - - pr_debug("%s: sh_mem_block: phys:[%pK], data:[0x%pK], size:[%zd]\n", - __func__, - &(common.source_tracking_sh_mem.sh_mem_block.phys), - (void *)(common.source_tracking_sh_mem.sh_mem_block.data), - (size_t)(common.source_tracking_sh_mem.sh_mem_block.size)); - - ret = msm_audio_ion_alloc( - &(common.source_tracking_sh_mem.sh_mem_table.dma_buf), - sizeof(struct vss_imemory_table_t), - &(common.source_tracking_sh_mem.sh_mem_table.phys), - (size_t *)&(common.source_tracking_sh_mem.sh_mem_table.size), - &(common.source_tracking_sh_mem.sh_mem_table.data)); - if (ret < 0) { - pr_err("%s: audio ION alloc failed for sh_mem table, ret = %d\n", - __func__, ret); - - ret = msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.sh_mem_block.dma_buf = NULL; - if (ret < 0) - pr_err("%s: Error:%d freeing memory\n", __func__, ret); - - ret = -EINVAL; - goto done; - } - memset((void *)(common.source_tracking_sh_mem.sh_mem_table.data), 0, - common.source_tracking_sh_mem.sh_mem_table.size); - - pr_debug("%s sh_mem_table: phys:[%pK], data:[0x%pK], size:[%zd],\n", - __func__, - &(common.source_tracking_sh_mem.sh_mem_table.phys), - (void *)(common.source_tracking_sh_mem.sh_mem_table.data), - (size_t)(common.source_tracking_sh_mem.sh_mem_table.size)); - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -static int voice_alloc_and_map_source_tracking_shared_memory( - struct voice_data *v) -{ - int ret = 0; - - pr_debug("%s: Enter\n", __func__); - - ret = voice_alloc_source_tracking_shared_memory(); - if (ret) { - pr_err("%s: Failed to allocate shared memory %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = voice_map_memory_physical_cmd(v, - &(common.source_tracking_sh_mem.sh_mem_table), - common.source_tracking_sh_mem.sh_mem_block.phys, - common.source_tracking_sh_mem.sh_mem_block.size, - VOC_SOURCE_TRACKING_MEM_MAP_TOKEN); - if (ret) { - pr_err("%s: memory mapping failed %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -static int voice_unmap_and_free_source_tracking_shared_memory( - struct voice_data *v) -{ - int ret = 0; - - pr_debug("%s: Enter\n", __func__); - - if (common.source_tracking_sh_mem.mem_handle != 0) { - ret = voice_send_mvm_unmap_memory_physical_cmd(v, - common.source_tracking_sh_mem.mem_handle); - if (ret < 0) { - pr_err("%s: Memory_unmap failed err %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - } - - if (common.source_tracking_sh_mem.sh_mem_block.dma_buf == NULL) - goto done; - - ret = msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - if (ret < 0) { - pr_err("%s: Error:%d freeing memory\n", __func__, ret); - - ret = -EINVAL; - goto done; - } - -done: - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = NULL; - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -static int voice_send_get_source_tracking_cmd(struct voice_data *v, - struct source_tracking_param *sourceTrackingData) -{ - struct cvp_get_source_tracking_param_cmd_t st_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - int i; - - pr_debug("%s: Enter\n", __func__); - - if (!v) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - - cvp_handle = voice_get_cvp_handle(v); - - if (!is_source_tracking_shared_memomry_allocated()) { - ret = voice_alloc_and_map_source_tracking_shared_memory(v); - if (ret) { - pr_err("%s: Fail in allocating/mapping shared memory\n", - __func__); - - ret = -EINVAL; - goto done; - } - } - st_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - st_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(st_cmd) - APR_HDR_SIZE); - st_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - st_cmd.hdr.dest_port = cvp_handle; - st_cmd.hdr.token = 0; - st_cmd.hdr.opcode = VSS_ISOURCETRACK_CMD_GET_ACTIVITY; - - st_cmd.cvp_get_source_tracking_param.mem_handle = - common.source_tracking_sh_mem.mem_handle; - st_cmd.cvp_get_source_tracking_param.mem_address_lsw = - lower_32_bits(common.source_tracking_sh_mem.sh_mem_block.phys); - st_cmd.cvp_get_source_tracking_param.mem_address_msw = - msm_audio_populate_upper_32_bits(common.source_tracking_sh_mem. - sh_mem_block.phys); - st_cmd.cvp_get_source_tracking_param.mem_size = - (uint32_t)common.source_tracking_sh_mem.sh_mem_block.size; - pr_debug("%s: mem_handle=0x%x, mem_address_lsw=0x%x, msw=0x%x, mem_size=%d\n", - __func__, - st_cmd.cvp_get_source_tracking_param.mem_handle, - st_cmd.cvp_get_source_tracking_param.mem_address_lsw, - st_cmd.cvp_get_source_tracking_param.mem_address_msw, - (uint32_t)st_cmd.cvp_get_source_tracking_param.mem_size); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, - (uint32_t *) &st_cmd); - if (ret < 0) { - pr_err("%s: Error in sending APR command\n", __func__); - - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - if (common.is_source_tracking_resp_success) { - for (i = 0; i < MAX_SECTORS; i++) { - sourceTrackingData->vad[i] = - common.sourceTrackingResponse.voice_active[i]; - pr_debug("%s: vad[%d] = %d\n", - __func__, i, sourceTrackingData->vad[i]); - } - sourceTrackingData->doa_speech = - common.sourceTrackingResponse.talker_doa; - pr_debug("%s: doa_speech = %d\n", - __func__, sourceTrackingData->doa_speech); - - for (i = 0; i < MAX_NOISE_SOURCE_INDICATORS; i++) { - sourceTrackingData->doa_noise[i] = - common.sourceTrackingResponse.interferer_doa[i]; - pr_debug("%s: doa_noise[%d] = %d\n", - __func__, i, sourceTrackingData->doa_noise[i]); - } - for (i = 0; i < MAX_POLAR_ACTIVITY_INDICATORS; i++) { - sourceTrackingData->polar_activity[i] = - common.sourceTrackingResponse.sound_strength[i]; - pr_debug("%s: polar_activity[%d] = %d\n", - __func__, i, sourceTrackingData->polar_activity[i]); - } - common.is_source_tracking_resp_success = false; - ret = 0; - } else { - pr_err("%s: Error response received from CVD\n", __func__); - - ret = -EINVAL; - } -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -/** - * voc_get_source_tracking - retrieves source track data. - * - * @sourceTrackingData: pointer to be updated with source track data. - * - * Returns 0 on success or error on failure - */ -int voc_get_source_tracking(struct source_tracking_param *sourceTrackingData) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - - pr_debug("%s: Enter\n", __func__); - - mutex_lock(&common.common_lock); - - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state) && - (v->lch_mode != VOICE_LCH_START) && - !v->disable_topology) - ret = voice_send_get_source_tracking_cmd(v, - sourceTrackingData); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session\n", __func__); - - break; - } - } - - mutex_unlock(&common.common_lock); - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(voc_get_source_tracking); - -static int voice_set_cvp_param(struct voice_data *v, - struct vss_icommon_mem_mapping_hdr *mem_hdr, - u32 *param_data, u32 param_size) -{ - struct vss_icommon_cmd_set_param *set_param = NULL; - uint32_t pkt_size = sizeof(struct vss_icommon_cmd_set_param); - void *apr_cvp; - int ret = 0; - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - return -EINVAL; - } - - if (param_data != NULL) - pkt_size += param_size; - set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!set_param) - return -ENOMEM; - - set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param->apr_hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, pkt_size - APR_HDR_SIZE); - set_param->apr_hdr.src_svc = 0; - set_param->apr_hdr.src_domain = APR_DOMAIN_APPS; - set_param->apr_hdr.src_port = voice_get_idx_for_session(v->session_id); - set_param->apr_hdr.dest_svc = 0; - set_param->apr_hdr.dest_domain = APR_DOMAIN_ADSP; - set_param->apr_hdr.dest_port = voice_get_cvp_handle(v); - set_param->apr_hdr.token = VOC_SET_MEDIA_FORMAT_PARAM_TOKEN; - set_param->apr_hdr.opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_SET_PARAM_V3 : - VSS_ICOMMON_CMD_SET_PARAM_V2; - - set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - memcpy(set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - ret = -EINVAL; - goto done; - } - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (u32 *) set_param); - if (ret < 0) { - pr_err("%s: Failed to send apr packet, error %d\n", __func__, - ret); - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - v->cvp_state == CMD_STATUS_SUCCESS, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(v->async_err)); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; - -done: - kfree(set_param); - return ret; -} - -static int voice_pack_and_set_cvp_param(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_data = NULL; - u32 total_size = 0; - int ret = 0; - - total_size = sizeof(union param_hdrs) + param_hdr.param_size; - packed_data = kzalloc(total_size, GFP_KERNEL); - if (!packed_data) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_data, ¶m_hdr, param_data, - &total_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d", __func__, ret); - goto done; - } - - ret = voice_set_cvp_param(v, NULL, (u32 *) packed_data, total_size); - -done: - kfree(packed_data); - return ret; -} - -/* - * Out of band is not supported and there are currently no pre-packed cases, - * so pack and set in the same function. When needed, split up. - */ -static int voice_pack_and_set_cvs_ui_property(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - struct vss_icommon_cmd_set_ui_property *set_ui_property = NULL; - u32 total_size = 0; - u32 pkt_size = 0; - u32 param_size = 0; - bool iid_supported = q6common_is_instance_id_supported(); - void *apr_cvs; - int ret = 0; - - apr_cvs = common.apr_q6_cvs; - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - return -EINVAL; - } - - pkt_size = sizeof(struct vss_icommon_cmd_set_ui_property); - param_size = sizeof(union param_hdrs) + param_hdr.param_size; - total_size = pkt_size + param_size; - set_ui_property = kzalloc(total_size, GFP_KERNEL); - if (!set_ui_property) - return -ENOMEM; - - ret = q6common_pack_pp_params(set_ui_property->param_data, ¶m_hdr, - param_data, ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d", __func__, ret); - goto done; - } - - /* - * Pack the APR header after packing the data so we have the actual - * total size of the payload - */ - total_size = pkt_size + param_size; - set_ui_property->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_ui_property->apr_hdr.pkt_size = total_size; - set_ui_property->apr_hdr.src_svc = 0; - set_ui_property->apr_hdr.src_domain = APR_DOMAIN_APPS; - set_ui_property->apr_hdr.src_port = - voice_get_idx_for_session(v->session_id); - set_ui_property->apr_hdr.dest_svc = 0; - set_ui_property->apr_hdr.dest_domain = APR_DOMAIN_ADSP; - set_ui_property->apr_hdr.dest_port = voice_get_cvs_handle(v); - set_ui_property->apr_hdr.token = 0; - - set_ui_property->apr_hdr.opcode = - iid_supported ? VSS_ICOMMON_CMD_SET_UI_PROPERTY_V2 : - VSS_ICOMMON_CMD_SET_UI_PROPERTY; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (u32 *) set_ui_property); - if (ret < 0) { - pr_err("%s: Failed to send apr packet, error %d\n", __func__, - ret); - goto done; - } - - ret = wait_event_timeout(v->cvs_wait, - v->cvs_state == CMD_STATUS_SUCCESS, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(v->async_err)); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - kfree(set_ui_property); - return ret; -} - -static void voc_release_uevent_data(struct kobject *kobj) -{ - struct audio_uevent_data *data = container_of(kobj, - struct audio_uevent_data, - kobj); - kfree(data); -} - -/** - * is_voc_initialized: - * - * Returns voice module init status - * - */ -int is_voc_initialized(void) -{ - return module_initialized; -} -EXPORT_SYMBOL(is_voc_initialized); - -int __init voice_init(void) -{ - int rc = 0, i = 0; - - memset(&common, 0, sizeof(struct common_data)); - - /* set default value */ - common.default_mute_val = 0; /* default is un-mute */ - common.default_sample_val = 8000; - common.default_vol_step_val = 0; - common.default_vol_ramp_duration_ms = DEFAULT_VOLUME_RAMP_DURATION; - common.default_mute_ramp_duration_ms = DEFAULT_MUTE_RAMP_DURATION; - common.cvp_version = 0; - common.is_avcs_version_queried = false; - /* Initialize EC Ref media format info */ - common.ec_ref_ext = false; - common.ec_media_fmt_info.port_id = AFE_PORT_INVALID; - common.ec_media_fmt_info.num_channels = 0; - common.ec_media_fmt_info.bits_per_sample = 16; - common.ec_media_fmt_info.sample_rate = 8000; - memset(&common.ec_media_fmt_info.channel_mapping, 0, - VSS_CHANNEL_MAPPING_SIZE); - - /* Initialize AFE Sidetone Enable */ - common.sidetone_enable = false; - - /* Initialize MVS info. */ - common.mvs_info.network_type = VSS_NETWORK_ID_DEFAULT; - - /* Initialize is low memory flag */ - common.is_destroy_cvd = false; - - /* Initialize CVD version */ - strlcpy(common.cvd_version, CVD_VERSION_DEFAULT, - sizeof(common.cvd_version)); - /* Initialize Per-Vocoder Calibration flag */ - common.is_per_vocoder_cal_enabled = false; - - /* - * Initialize in call record channel config - * to mono - */ - common.rec_channel_count = NUM_CHANNELS_MONO; - - mutex_init(&common.common_lock); - - common.uevent_data = kzalloc(sizeof(*(common.uevent_data)), GFP_KERNEL); - if (!common.uevent_data) - return -ENOMEM; - - /* - * Set release function to cleanup memory related to kobject - * before initializing the kobject. - */ - common.uevent_data->ktype.release = voc_release_uevent_data; - q6core_init_uevent_data(common.uevent_data, "q6voice_uevent"); - common.mic_break_enable = false; - - /* Initialize session id with vsid */ - init_session_id(); - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - - /* initialize dev_rx and dev_tx */ - common.voice[i].dev_rx.dev_mute = common.default_mute_val; - common.voice[i].dev_tx.dev_mute = common.default_mute_val; - common.voice[i].dev_rx.volume_step_value = - common.default_vol_step_val; - common.voice[i].dev_rx.volume_ramp_duration_ms = - common.default_vol_ramp_duration_ms; - common.voice[i].dev_rx.dev_mute_ramp_duration_ms = - common.default_mute_ramp_duration_ms; - common.voice[i].dev_tx.dev_mute_ramp_duration_ms = - common.default_mute_ramp_duration_ms; - common.voice[i].stream_rx.stream_mute = common.default_mute_val; - common.voice[i].stream_tx.stream_mute = common.default_mute_val; - - common.voice[i].dev_tx.port_id = 0x100B; - common.voice[i].dev_rx.port_id = 0x100A; - common.voice[i].dev_tx.dev_id = 0; - common.voice[i].dev_rx.dev_id = 0; - common.voice[i].dev_tx.no_of_channels = 0; - common.voice[i].dev_rx.no_of_channels = 0; - common.voice[i].dev_tx.sample_rate = 8000; - common.voice[i].dev_rx.sample_rate = 8000; - common.voice[i].dev_tx.bits_per_sample = 16; - common.voice[i].dev_rx.bits_per_sample = 16; - memset(&common.voice[i].dev_tx.channel_mapping, 0, - VSS_CHANNEL_MAPPING_SIZE); - memset(&common.voice[i].dev_rx.channel_mapping, 0, - VSS_CHANNEL_MAPPING_SIZE); - common.voice[i].sidetone_gain = 0x512; - common.voice[i].dtmf_rx_detect_en = 0; - common.voice[i].lch_mode = 0; - common.voice[i].disable_topology = false; - - common.voice[i].voc_state = VOC_INIT; - - INIT_WORK(&common.voice[i].voice_mic_break_work, - voice_mic_break_work_fn); - - init_waitqueue_head(&common.voice[i].mvm_wait); - init_waitqueue_head(&common.voice[i].cvs_wait); - init_waitqueue_head(&common.voice[i].cvp_wait); - - mutex_init(&common.voice[i].lock); - } - - if (voice_init_cal_data()) - pr_err("%s: Could not init cal data!\n", __func__); - - if (rc == 0) - module_initialized = true; - - pr_debug("%s: rc=%d\n", __func__, rc); - return rc; -} - - -void voice_exit(void) -{ - q6core_destroy_uevent_data(common.uevent_data); - voice_delete_cal_data(); - free_cal_map_table(); -} diff --git a/techpack/audio/4.0/dsp/rtac.c b/techpack/audio/4.0/dsp/rtac.c deleted file mode 100644 index 7c7137e58cfb..000000000000 --- a/techpack/audio/4.0/dsp/rtac.c +++ /dev/null @@ -1,2084 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - - -/* Max size of payload (buf size - apr header) */ -#define MAX_PAYLOAD_SIZE 4076 -#define RTAC_MAX_ACTIVE_VOICE_COMBOS 2 -#define RTAC_MAX_ACTIVE_POPP 8 -#define RTAC_BUF_SIZE 163840 - -#define TIMEOUT_MS 1000 - -struct rtac_cal_block_data rtac_cal[MAX_RTAC_BLOCKS] = { -/* ADM_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} }, -/* ASM_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} }, -/* VOICE_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} }, -/* AFE_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} } -}; - -struct rtac_common_data { - atomic_t usage_count; - atomic_t apr_err_code; - struct mutex rtac_fops_mutex; -}; - -static struct rtac_common_data rtac_common; - -/* APR data */ -struct rtac_apr_data { - void *apr_handle; - atomic_t cmd_state; - wait_queue_head_t cmd_wait; -}; - -static struct rtac_apr_data rtac_adm_apr_data; -static struct rtac_apr_data rtac_asm_apr_data[ASM_ACTIVE_STREAMS_ALLOWED + 1]; -static struct rtac_apr_data rtac_afe_apr_data; -static struct rtac_apr_data rtac_voice_apr_data[RTAC_VOICE_MODES]; - -/* ADM info & APR */ -static struct rtac_adm rtac_adm_data; -static u32 *rtac_adm_buffer; - - -/* ASM APR */ -static u32 *rtac_asm_buffer; - -static u32 *rtac_afe_buffer; - -/* Voice info & APR */ -struct rtac_voice_data_t { - uint32_t tx_topology_id; - uint32_t rx_topology_id; - uint32_t tx_afe_topology; - uint32_t rx_afe_topology; - uint32_t tx_afe_port; - uint32_t rx_afe_port; - uint16_t cvs_handle; - uint16_t cvp_handle; - uint32_t tx_acdb_id; - uint32_t rx_acdb_id; -}; - -struct rtac_voice { - uint32_t num_of_voice_combos; - struct rtac_voice_data_t voice[RTAC_MAX_ACTIVE_VOICE_COMBOS]; -}; - -struct rtac_afe_user_data { - uint32_t buf_size; - uint32_t cmd_size; - uint32_t port_id; - union { - struct afe_rtac_user_data_set_v2 v2_set; - struct afe_rtac_user_data_set_v3 v3_set; - struct afe_rtac_user_data_get_v2 v2_get; - struct afe_rtac_user_data_get_v3 v3_get; - }; -} __packed; - -static struct rtac_voice rtac_voice_data; -static u32 *rtac_voice_buffer; -static u32 voice_session_id[RTAC_MAX_ACTIVE_VOICE_COMBOS]; - - -struct mutex rtac_adm_mutex; -struct mutex rtac_adm_apr_mutex; -struct mutex rtac_asm_apr_mutex; -struct mutex rtac_voice_mutex; -struct mutex rtac_voice_apr_mutex; -struct mutex rtac_afe_apr_mutex; - -int rtac_clear_mapping(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_debug("%s: invalid cal type %d\n", __func__, cal_type); - result = -EINVAL; - goto done; - } - - rtac_cal[cal_type].map_data.map_handle = 0; -done: - return result; -} - -int rtac_allocate_cal_buffer(uint32_t cal_type) -{ - int result = 0; - size_t len; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].cal_data.paddr != 0) { - pr_err("%s: memory already allocated! cal_type %d, paddr 0x%pK\n", - __func__, cal_type, &rtac_cal[cal_type].cal_data.paddr); - result = -EPERM; - goto done; - } - - result = msm_audio_ion_alloc(&rtac_cal[cal_type].map_data.dma_buf, - rtac_cal[cal_type].map_data.map_size, - &rtac_cal[cal_type].cal_data.paddr, - &len, - &rtac_cal[cal_type].cal_data.kvaddr); - if (result < 0) { - pr_err("%s: ION create client for RTAC failed\n", - __func__); - goto done; - } - - pr_debug("%s: cal_type %d, paddr 0x%pK, kvaddr 0x%pK, map_size 0x%x\n", - __func__, cal_type, - &rtac_cal[cal_type].cal_data.paddr, - rtac_cal[cal_type].cal_data.kvaddr, - rtac_cal[cal_type].map_data.map_size); -done: - return result; -} - -int rtac_free_cal_buffer(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].map_data.dma_buf == NULL) { - pr_debug("%s: cal_type %d not allocated!\n", - __func__, cal_type); - goto done; - } - - result = msm_audio_ion_free(rtac_cal[cal_type].map_data.dma_buf); - if (result < 0) { - pr_err("%s: ION free for RTAC failed! cal_type %d, paddr 0x%pK\n", - __func__, cal_type, &rtac_cal[cal_type].cal_data.paddr); - goto done; - } - - rtac_cal[cal_type].map_data.map_handle = 0; - rtac_cal[cal_type].map_data.dma_buf = NULL; - rtac_cal[cal_type].cal_data.size = 0; - rtac_cal[cal_type].cal_data.kvaddr = 0; - rtac_cal[cal_type].cal_data.paddr = 0; -done: - return result; -} - -int rtac_map_cal_buffer(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].map_data.map_handle != 0) { - pr_err("%s: already mapped cal_type %d\n", - __func__, cal_type); - result = -EPERM; - goto done; - } - - if (rtac_cal[cal_type].cal_data.paddr == 0) { - pr_err("%s: physical address is NULL cal_type %d\n", - __func__, cal_type); - result = -EPERM; - goto done; - } - - switch (cal_type) { - case ADM_RTAC_CAL: - result = adm_map_rtac_block(&rtac_cal[cal_type]); - break; - case ASM_RTAC_CAL: - result = q6asm_map_rtac_block(&rtac_cal[cal_type]); - break; - case VOICE_RTAC_CAL: - result = voc_map_rtac_block(&rtac_cal[cal_type]); - break; - case AFE_RTAC_CAL: - result = afe_map_rtac_block(&rtac_cal[cal_type]); - break; - } - if (result < 0) { - pr_err("%s: map RTAC failed! cal_type %d\n", - __func__, cal_type); - goto done; - } -done: - return result; -} - -int rtac_unmap_cal_buffer(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].map_data.map_handle == 0) { - pr_debug("%s: nothing to unmap cal_type %d\n", - __func__, cal_type); - goto done; - } - - switch (cal_type) { - case ADM_RTAC_CAL: - result = adm_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - case ASM_RTAC_CAL: - result = q6asm_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - case VOICE_RTAC_CAL: - result = voc_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - case AFE_RTAC_CAL: - result = afe_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - } - if (result < 0) { - pr_err("%s: unmap RTAC failed! cal_type %d\n", - __func__, cal_type); - goto done; - } -done: - return result; -} - -static int rtac_open(struct inode *inode, struct file *f) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_common.rtac_fops_mutex); - atomic_inc(&rtac_common.usage_count); - mutex_unlock(&rtac_common.rtac_fops_mutex); - return result; -} - -static int rtac_release(struct inode *inode, struct file *f) -{ - int result = 0; - int result2 = 0; - int i; - - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_common.rtac_fops_mutex); - atomic_dec(&rtac_common.usage_count); - pr_debug("%s: ref count %d!\n", __func__, - atomic_read(&rtac_common.usage_count)); - - if (atomic_read(&rtac_common.usage_count) > 0) { - mutex_unlock(&rtac_common.rtac_fops_mutex); - goto done; - } - - for (i = 0; i < MAX_RTAC_BLOCKS; i++) { - result2 = rtac_unmap_cal_buffer(i); - if (result2 < 0) { - pr_err("%s: unmap buffer failed! error %d!\n", - __func__, result2); - result = result2; - } - - result2 = rtac_free_cal_buffer(i); - if (result2 < 0) { - pr_err("%s: free buffer failed! error %d!\n", - __func__, result2); - result = result2; - } - } - mutex_unlock(&rtac_common.rtac_fops_mutex); -done: - return result; -} - - -/* ADM Info */ -void add_popp(u32 dev_idx, u32 port_id, u32 popp_id) -{ - u32 i = 0; - - for (; i < rtac_adm_data.device[dev_idx].num_of_popp; i++) - if (rtac_adm_data.device[dev_idx].popp[i].popp == popp_id) - goto done; - - if (rtac_adm_data.device[dev_idx].num_of_popp == - RTAC_MAX_ACTIVE_POPP) { - pr_err("%s, Max POPP!\n", __func__); - goto done; - } - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp].popp = popp_id; - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp].popp_topology = - q6asm_get_asm_topology(popp_id); - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp++].app_type = - q6asm_get_asm_app_type(popp_id); - - pr_debug("%s: popp_id = %d, popp topology = 0x%x, popp app type = 0x%x\n", - __func__, - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp - 1].popp, - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp - 1].popp_topology, - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp - 1].app_type); -done: - return; -} - -void rtac_update_afe_topology(u32 port_id) -{ - u32 i = 0; - - mutex_lock(&rtac_adm_mutex); - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id) { - rtac_adm_data.device[i].afe_topology = - afe_get_topology(port_id); - pr_debug("%s: port_id = 0x%x topology_id = 0x%x copp_id = %d\n", - __func__, port_id, - rtac_adm_data.device[i].afe_topology, - rtac_adm_data.device[i].copp); - } - } - mutex_unlock(&rtac_adm_mutex); -} - -void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id, - u32 app_type, u32 acdb_id) -{ - u32 i = 0; - - pr_debug("%s: num rtac devices %d port_id = %d, copp_id = %d\n", - __func__, rtac_adm_data.num_of_dev, port_id, copp_id); - - mutex_lock(&rtac_adm_mutex); - if (rtac_adm_data.num_of_dev == RTAC_MAX_ACTIVE_DEVICES) { - pr_err("%s, Can't add anymore RTAC devices!\n", __func__); - goto done; - } - - /* Check if device already added */ - if (rtac_adm_data.num_of_dev != 0) { - for (; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id && - rtac_adm_data.device[i].copp == copp_id) { - add_popp(i, port_id, popp_id); - goto done; - } - if (rtac_adm_data.device[i].num_of_popp == - RTAC_MAX_ACTIVE_POPP) { - pr_err("%s, Max POPP!\n", __func__); - goto done; - } - } - } - - /* Add device */ - rtac_adm_data.num_of_dev++; - - rtac_adm_data.device[i].topology_id = - adm_get_topology_for_port_from_copp_id(port_id, copp_id); - rtac_adm_data.device[i].afe_topology = - afe_get_topology(port_id); - rtac_adm_data.device[i].afe_port = port_id; - rtac_adm_data.device[i].copp = copp_id; - rtac_adm_data.device[i].app_type = app_type; - rtac_adm_data.device[i].acdb_dev_id = acdb_id; - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp].popp = popp_id; - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp].popp_topology = - q6asm_get_asm_topology(popp_id); - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp++].app_type = - q6asm_get_asm_app_type(popp_id); - - pr_debug("%s: topology = 0x%x, afe_topology = 0x%x, port_id = %d, copp_id = %d, app id = 0x%x, acdb id = %d, popp_id = %d, popp topology = 0x%x, popp app type = 0x%x\n", - __func__, - rtac_adm_data.device[i].topology_id, - rtac_adm_data.device[i].afe_topology, - rtac_adm_data.device[i].afe_port, - rtac_adm_data.device[i].copp, - rtac_adm_data.device[i].app_type, - rtac_adm_data.device[i].acdb_dev_id, - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp - 1].popp, - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp - 1].popp_topology, - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp - 1].app_type); -done: - mutex_unlock(&rtac_adm_mutex); -} - -static void shift_adm_devices(u32 dev_idx) -{ - for (; dev_idx < rtac_adm_data.num_of_dev; dev_idx++) { - memcpy(&rtac_adm_data.device[dev_idx], - &rtac_adm_data.device[dev_idx + 1], - sizeof(rtac_adm_data.device[dev_idx])); - memset(&rtac_adm_data.device[dev_idx + 1], 0, - sizeof(rtac_adm_data.device[dev_idx])); - } -} - -static void shift_popp(u32 copp_idx, u32 popp_idx) -{ - for (; popp_idx < rtac_adm_data.device[copp_idx].num_of_popp; - popp_idx++) { - memcpy(&rtac_adm_data.device[copp_idx].popp[popp_idx].popp, - &rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp, sizeof(uint32_t)); - memcpy(&rtac_adm_data.device[copp_idx].popp[popp_idx]. - popp_topology, - &rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp_topology, - sizeof(uint32_t)); - memset(&rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp, 0, sizeof(uint32_t)); - memset(&rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp_topology, 0, sizeof(uint32_t)); - } -} - -void rtac_remove_adm_device(u32 port_id, u32 copp_id) -{ - s32 i; - - pr_debug("%s: num rtac devices %d port_id = %d, copp_id = %d\n", - __func__, rtac_adm_data.num_of_dev, port_id, copp_id); - - mutex_lock(&rtac_adm_mutex); - /* look for device */ - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id && - rtac_adm_data.device[i].copp == copp_id) { - memset(&rtac_adm_data.device[i], 0, - sizeof(rtac_adm_data.device[i])); - rtac_adm_data.num_of_dev--; - - if (rtac_adm_data.num_of_dev >= 1) { - shift_adm_devices(i); - break; - } - } - } - - mutex_unlock(&rtac_adm_mutex); -} - -void rtac_remove_popp_from_adm_devices(u32 popp_id) -{ - s32 i, j; - - pr_debug("%s: popp_id = %d\n", __func__, popp_id); - - mutex_lock(&rtac_adm_mutex); - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - for (j = 0; j < rtac_adm_data.device[i].num_of_popp; j++) { - if (rtac_adm_data.device[i].popp[j].popp == - popp_id) { - rtac_adm_data.device[i].popp[j].popp = 0; - rtac_adm_data.device[i].popp[j]. - popp_topology = 0; - rtac_adm_data.device[i].num_of_popp--; - shift_popp(i, j); - } - } - } - mutex_unlock(&rtac_adm_mutex); -} - - -/* Voice Info */ -static void set_rtac_voice_data(int idx, u32 cvs_handle, u32 cvp_handle, - u32 rx_afe_port, u32 tx_afe_port, - u32 rx_acdb_id, u32 tx_acdb_id, - u32 session_id) -{ - rtac_voice_data.voice[idx].tx_topology_id = - voice_get_topology(CVP_VOC_TX_TOPOLOGY_CAL); - rtac_voice_data.voice[idx].rx_topology_id = - voice_get_topology(CVP_VOC_RX_TOPOLOGY_CAL); - rtac_voice_data.voice[idx].tx_afe_topology = - afe_get_topology(tx_afe_port); - rtac_voice_data.voice[idx].rx_afe_topology = - afe_get_topology(rx_afe_port); - rtac_voice_data.voice[idx].tx_afe_port = tx_afe_port; - rtac_voice_data.voice[idx].rx_afe_port = rx_afe_port; - rtac_voice_data.voice[idx].tx_acdb_id = tx_acdb_id; - rtac_voice_data.voice[idx].rx_acdb_id = rx_acdb_id; - rtac_voice_data.voice[idx].cvs_handle = cvs_handle; - rtac_voice_data.voice[idx].cvp_handle = cvp_handle; - pr_debug("%s\n%s: %x\n%s: %d %s: %d\n%s: %d %s: %d\n %s: %d\n %s: %d\n%s: %d %s: %d\n%s", - "<---- Voice Data Info ---->", "Session id", session_id, - "cvs_handle", cvs_handle, "cvp_handle", cvp_handle, - "rx_afe_topology", rtac_voice_data.voice[idx].rx_afe_topology, - "tx_afe_topology", rtac_voice_data.voice[idx].tx_afe_topology, - "rx_afe_port", rx_afe_port, "tx_afe_port", tx_afe_port, - "rx_acdb_id", rx_acdb_id, "tx_acdb_id", tx_acdb_id, - "<-----------End----------->"); - - /* Store session ID for voice RTAC */ - voice_session_id[idx] = session_id; -} - -void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port, - u32 tx_afe_port, u32 rx_acdb_id, u32 tx_acdb_id, - u32 session_id) -{ - u32 i = 0; - - pr_debug("%s\n", __func__); - mutex_lock(&rtac_voice_mutex); - - if (rtac_voice_data.num_of_voice_combos == - RTAC_MAX_ACTIVE_VOICE_COMBOS) { - pr_err("%s, Can't add anymore RTAC devices!\n", __func__); - goto done; - } - - /* Check if device already added */ - if (rtac_voice_data.num_of_voice_combos != 0) { - for (; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == - cvs_handle) { - set_rtac_voice_data(i, cvs_handle, cvp_handle, - rx_afe_port, tx_afe_port, rx_acdb_id, - tx_acdb_id, session_id); - goto done; - } - } - } - - /* Add device */ - rtac_voice_data.num_of_voice_combos++; - set_rtac_voice_data(i, cvs_handle, cvp_handle, - rx_afe_port, tx_afe_port, - rx_acdb_id, tx_acdb_id, - session_id); -done: - mutex_unlock(&rtac_voice_mutex); -} - -static void shift_voice_devices(u32 idx) -{ - for (; idx < rtac_voice_data.num_of_voice_combos - 1; idx++) { - memcpy(&rtac_voice_data.voice[idx], - &rtac_voice_data.voice[idx + 1], - sizeof(rtac_voice_data.voice[idx])); - voice_session_id[idx] = voice_session_id[idx + 1]; - } -} - -void rtac_remove_voice(u32 cvs_handle) -{ - u32 i = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_voice_mutex); - /* look for device */ - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == cvs_handle) { - shift_voice_devices(i); - rtac_voice_data.num_of_voice_combos--; - memset(&rtac_voice_data.voice[ - rtac_voice_data.num_of_voice_combos], 0, - sizeof(rtac_voice_data.voice - [rtac_voice_data.num_of_voice_combos])); - voice_session_id[rtac_voice_data.num_of_voice_combos] - = 0; - break; - } - } - mutex_unlock(&rtac_voice_mutex); -} - -static u32 get_voice_session_id_cvs(u32 cvs_handle) -{ - u32 i; - - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == cvs_handle) - return voice_session_id[i]; - } - - pr_err("%s: No voice index for CVS handle %d found returning 0\n", - __func__, cvs_handle); - return 0; -} - -static u32 get_voice_session_id_cvp(u32 cvp_handle) -{ - u32 i; - - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvp_handle == cvp_handle) - return voice_session_id[i]; - } - - pr_err("%s: No voice index for CVP handle %d found returning 0\n", - __func__, cvp_handle); - return 0; -} - -static int get_voice_index(u32 mode, u32 handle) -{ - if (mode == RTAC_CVP) - return voice_get_idx_for_session( - get_voice_session_id_cvp(handle)); - if (mode == RTAC_CVS) - return voice_get_idx_for_session( - get_voice_session_id_cvs(handle)); - - pr_err("%s: Invalid mode %d, returning 0\n", - __func__, mode); - return 0; -} - - -/* ADM APR */ -void rtac_set_adm_handle(void *handle) -{ - pr_debug("%s: handle = %pK\n", __func__, handle); - - mutex_lock(&rtac_adm_apr_mutex); - rtac_adm_apr_data.apr_handle = handle; - mutex_unlock(&rtac_adm_apr_mutex); -} - -bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size) -{ - pr_debug("%s:cmd_state = %d\n", __func__, - atomic_read(&rtac_adm_apr_data.cmd_state)); - if (atomic_read(&rtac_adm_apr_data.cmd_state) != 1) - return false; - - pr_debug("%s\n", __func__); - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_adm_apr_data.cmd_state, 0); - wake_up(&rtac_adm_apr_data.cmd_wait); - return true; -} - -int send_adm_apr(void *buf, u32 opcode) -{ - s32 result; - u32 user_buf_size = 0; - u32 bytes_returned = 0; - u32 copp_id; - u32 payload_size; - u32 data_size = 0; - int copp_idx; - int port_idx; - struct apr_hdr adm_params; - - pr_debug("%s\n", __func__); - - if (rtac_cal[ADM_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(ADM_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed!", - __func__); - goto done; - } - } - - if (rtac_cal[ADM_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(ADM_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed!", - __func__); - goto done; - } - } - - if (copy_from_user(&user_buf_size, (void *)buf, - sizeof(user_buf_size))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - if (user_buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_buf_size); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (copy_from_user(&copp_id, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy port id from user buffer\n", - __func__); - goto done; - } - - if (adm_get_indexes_from_copp_id(copp_id, &copp_idx, &port_idx) != 0) { - pr_err("%s: Copp Id-%d is not active\n", __func__, copp_id); - goto done; - } - - mutex_lock(&rtac_adm_apr_mutex); - if (rtac_adm_apr_data.apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - switch (opcode) { - case ADM_CMD_SET_PP_PARAMS_V5: - case ADM_CMD_SET_PP_PARAMS_V6: - /* set payload size to in-band payload */ - /* set data size to actual out of band payload size */ - data_size = payload_size - 4 * sizeof(u32); - if (data_size > rtac_cal[ADM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", - __func__, data_size); - result = -EINVAL; - goto err; - } - payload_size = 4 * sizeof(u32); - - /* Copy buffer to out-of-band payload */ - if (copy_from_user((void *) - rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr, - buf + 7 * sizeof(u32), data_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - - /* set payload size in packet */ - rtac_adm_buffer[8] = data_size; - break; - case ADM_CMD_GET_PP_PARAMS_V5: - case ADM_CMD_GET_PP_PARAMS_V6: - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - result = -EINVAL; - goto err; - } - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_adm_buffer + - sizeof(adm_params)/sizeof(u32), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* Pack header */ - adm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - adm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - adm_params.src_svc = APR_SVC_ADM; - adm_params.src_domain = APR_DOMAIN_APPS; - adm_params.src_port = copp_id; - adm_params.dest_svc = APR_SVC_ADM; - adm_params.dest_domain = APR_DOMAIN_ADSP; - adm_params.dest_port = copp_id; - adm_params.token = port_idx << 16 | copp_idx; - adm_params.opcode = opcode; - - /* fill for out-of-band */ - rtac_adm_buffer[5] = - lower_32_bits(rtac_cal[ADM_RTAC_CAL].cal_data.paddr); - rtac_adm_buffer[6] = - msm_audio_populate_upper_32_bits( - rtac_cal[ADM_RTAC_CAL].cal_data.paddr); - rtac_adm_buffer[7] = rtac_cal[ADM_RTAC_CAL].map_data.map_handle; - - memcpy(rtac_adm_buffer, &adm_params, sizeof(adm_params)); - atomic_set(&rtac_adm_apr_data.cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[ADM_RTAC_CAL].cal_data.paddr); - - result = apr_send_pkt(rtac_adm_apr_data.apr_handle, - (uint32_t *)rtac_adm_buffer); - if (result < 0) { - pr_err("%s: Set params failed copp = %d\n", __func__, copp_id); - goto err; - } - /* Wait for the callback */ - result = wait_event_timeout(rtac_adm_apr_data.cmd_wait, - (atomic_read(&rtac_adm_apr_data.cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set params timed out copp = %d\n", __func__, - copp_id); - goto err; - } - if (atomic_read(&rtac_common.apr_err_code)) { - pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n", - __func__, adsp_err_get_err_str(atomic_read( - &rtac_common.apr_err_code)), - opcode); - result = adsp_err_get_lnx_err_code( - atomic_read( - &rtac_common.apr_err_code)); - goto err; - } - - if (opcode == ADM_CMD_GET_PP_PARAMS_V5) { - bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data. - kvaddr)[2] + 3 * sizeof(u32); - } else if (opcode == ADM_CMD_GET_PP_PARAMS_V6) { - bytes_returned = - ((u32 *) rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr)[3] + - 4 * sizeof(u32); - } else { - bytes_returned = data_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[ADM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_buf_size) { - pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", - __func__, user_buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_adm_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_adm_apr_mutex); - return result; -} - - -/* ASM APR */ -void rtac_set_asm_handle(u32 session_id, void *handle) -{ - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_asm_apr_mutex); - rtac_asm_apr_data[session_id].apr_handle = handle; - mutex_unlock(&rtac_asm_apr_mutex); -} - -bool rtac_make_asm_callback(u32 session_id, uint32_t *payload, - u32 payload_size) -{ - if (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) != 1) - return false; - - pr_debug("%s\n", __func__); - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 0); - wake_up(&rtac_asm_apr_data[session_id].cmd_wait); - return true; -} - -int send_rtac_asm_apr(void *buf, u32 opcode) -{ - s32 result; - u32 user_buf_size = 0; - u32 bytes_returned = 0; - u32 session_id = 0; - u8 stream_id = 0; - u32 payload_size; - u32 data_size = 0; - struct apr_hdr asm_params; - - pr_debug("%s\n", __func__); - - if (rtac_cal[ASM_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(ASM_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed!", - __func__); - goto done; - } - } - - if (rtac_cal[ASM_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(ASM_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed!", - __func__); - goto done; - } - } - - if (copy_from_user(&user_buf_size, (void *)buf, - sizeof(user_buf_size))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - if (user_buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_buf_size); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (copy_from_user(&session_id, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy session id from user buffer\n", - __func__); - goto done; - } - if (session_id >= (ASM_ACTIVE_STREAMS_ALLOWED + 1)) { - pr_err("%s: Invalid Session = %d\n", __func__, session_id); - goto done; - } - - mutex_lock(&rtac_asm_apr_mutex); - if (rtac_asm_apr_data[session_id].apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - stream_id = q6asm_get_asm_stream_id(session_id); - if ((stream_id != 1) && (stream_id != 2)) { - pr_err("%s: Invalid stream id %u\n", __func__, stream_id); - result = -EINVAL; - goto err; - } - - switch (opcode) { - case ASM_STREAM_CMD_SET_PP_PARAMS_V2: - case ASM_STREAM_CMD_SET_PP_PARAMS_V3: - /* set payload size to in-band payload */ - /* set data size to actual out of band payload size */ - data_size = payload_size - 4 * sizeof(u32); - if (data_size > rtac_cal[ASM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", - __func__, data_size); - result = -EINVAL; - goto err; - } - payload_size = 4 * sizeof(u32); - - /* Copy buffer to out-of-band payload */ - if (copy_from_user((void *) - rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr, - buf + 7 * sizeof(u32), data_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - /* set payload size in packet */ - rtac_asm_buffer[8] = data_size; - break; - case ASM_STREAM_CMD_GET_PP_PARAMS_V2: - case ASM_STREAM_CMD_GET_PP_PARAMS_V3: - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - result = -EINVAL; - goto err; - } - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_asm_buffer + - sizeof(asm_params)/sizeof(u32), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* Pack header */ - asm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - asm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - asm_params.src_svc = q6asm_get_apr_service_id(session_id); - asm_params.src_domain = APR_DOMAIN_APPS; - asm_params.src_port = (session_id << 8) | stream_id; - asm_params.dest_svc = APR_SVC_ASM; - asm_params.dest_domain = APR_DOMAIN_ADSP; - asm_params.dest_port = (session_id << 8) | stream_id; - asm_params.token = session_id; - asm_params.opcode = opcode; - - /* fill for out-of-band */ - rtac_asm_buffer[5] = - lower_32_bits(rtac_cal[ASM_RTAC_CAL].cal_data.paddr); - rtac_asm_buffer[6] = - msm_audio_populate_upper_32_bits( - rtac_cal[ASM_RTAC_CAL].cal_data.paddr); - rtac_asm_buffer[7] = rtac_cal[ASM_RTAC_CAL].map_data.map_handle; - - memcpy(rtac_asm_buffer, &asm_params, sizeof(asm_params)); - atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[ASM_RTAC_CAL].cal_data.paddr); - - result = apr_send_pkt(rtac_asm_apr_data[session_id].apr_handle, - (uint32_t *)rtac_asm_buffer); - if (result < 0) { - pr_err("%s: Set params failed session = %d\n", - __func__, session_id); - goto err; - } - - /* Wait for the callback */ - result = wait_event_timeout(rtac_asm_apr_data[session_id].cmd_wait, - (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set params timed out session = %d\n", - __func__, session_id); - goto err; - } - if (atomic_read(&rtac_common.apr_err_code)) { - pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n", - __func__, adsp_err_get_err_str(atomic_read( - &rtac_common.apr_err_code)), - opcode); - result = adsp_err_get_lnx_err_code( - atomic_read( - &rtac_common.apr_err_code)); - goto err; - } - - if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V2) { - bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data. - kvaddr)[2] + 3 * sizeof(u32); - } else if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V3) { - bytes_returned = - ((u32 *) rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr)[3] + - 4 * sizeof(u32); - } else { - bytes_returned = data_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[ASM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_buf_size) { - pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", - __func__, user_buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_asm_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_asm_apr_mutex); - return result; -} - -/* AFE APR */ -void rtac_set_afe_handle(void *handle) -{ - mutex_lock(&rtac_afe_apr_mutex); - rtac_afe_apr_data.apr_handle = handle; - mutex_unlock(&rtac_afe_apr_mutex); -} - -bool rtac_make_afe_callback(uint32_t *payload, uint32_t payload_size) -{ - pr_debug("%s:cmd_state = %d\n", __func__, - atomic_read(&rtac_afe_apr_data.cmd_state)); - if (atomic_read(&rtac_afe_apr_data.cmd_state) != 1) - return false; - - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_afe_apr_data.cmd_state, 0); - wake_up(&rtac_afe_apr_data.cmd_wait); - return true; -} - -static int fill_afe_apr_hdr(struct apr_hdr *apr_hdr, uint32_t port, - uint32_t opcode, uint32_t apr_msg_size) -{ - if (apr_hdr == NULL) { - pr_err("%s: invalid APR pointer", __func__); - return -EINVAL; - } - - apr_hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - apr_hdr->pkt_size = apr_msg_size; - apr_hdr->src_svc = APR_SVC_AFE; - apr_hdr->src_domain = APR_DOMAIN_APPS; - apr_hdr->src_port = 0; - apr_hdr->dest_svc = APR_SVC_AFE; - apr_hdr->dest_domain = APR_DOMAIN_ADSP; - apr_hdr->dest_port = 0; - apr_hdr->token = port; - apr_hdr->opcode = opcode; - - return 0; - -} -static int send_rtac_afe_apr(void __user *buf, uint32_t opcode) -{ - int32_t result; - uint32_t bytes_returned = 0; - uint32_t payload_size = 0; - uint32_t port_index = 0; - uint32_t *afe_cmd = NULL; - uint32_t apr_msg_size = 0; - struct rtac_afe_user_data user_afe_buf; - struct mem_mapping_hdr *mem_hdr = NULL; - struct param_hdr_v1 *get_resp_v2; - struct param_hdr_v3 *get_resp_v3; - - pr_debug("%s\n", __func__); - - if (rtac_cal[AFE_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(AFE_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed! ret = %d\n", - __func__, result); - goto done; - } - } - - if (rtac_cal[AFE_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(AFE_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed! ret = %d\n", - __func__, result); - goto done; - } - } - - if (copy_from_user(&user_afe_buf, (void *)buf, - sizeof(struct rtac_afe_user_data))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - - if (user_afe_buf.buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_afe_buf.buf_size); - goto done; - } - - port_index = q6audio_get_port_index(user_afe_buf.port_id); - if (port_index >= AFE_MAX_PORTS) { - pr_err("%s: Invalid AFE port = 0x%x\n", - __func__, user_afe_buf.port_id); - goto done; - } - - mutex_lock(&rtac_afe_apr_mutex); - if (rtac_afe_apr_data.apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - afe_cmd = - (u32 *) rtac_afe_buffer + sizeof(struct apr_hdr) / sizeof(u32); - - switch (opcode) { - case AFE_PORT_CMD_SET_PARAM_V2: - apr_msg_size = sizeof(struct afe_port_cmd_set_param_v2); - payload_size = user_afe_buf.v2_set.payload_size; - if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid payload size = %d\n", __func__, - payload_size); - result = -EINVAL; - goto err; - } - - /* Copy the command to the rtac buffer */ - memcpy(afe_cmd, &user_afe_buf.v2_set, - sizeof(user_afe_buf.v2_set)); - - /* Copy the param data to the out-of-band location */ - if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v2_set.param_hdr), - payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - case AFE_PORT_CMD_SET_PARAM_V3: - apr_msg_size = sizeof(struct afe_port_cmd_set_param_v3); - payload_size = user_afe_buf.v3_set.payload_size; - if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid payload size = %d\n", __func__, - payload_size); - result = -EINVAL; - goto err; - } - - /* Copy the command to the rtac buffer */ - memcpy(afe_cmd, &user_afe_buf.v3_set, - sizeof(user_afe_buf.v3_set)); - - /* Copy the param data to the out-of-band location */ - if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v3_set.param_hdr), - payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - case AFE_PORT_CMD_GET_PARAM_V2: - apr_msg_size = sizeof(struct afe_port_cmd_get_param_v2); - - if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", __func__, - user_afe_buf.cmd_size); - result = -EINVAL; - goto err; - } - - /* Copy the command and param data in-band */ - if (copy_from_user(afe_cmd, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v2_get), - user_afe_buf.cmd_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - case AFE_PORT_CMD_GET_PARAM_V3: - apr_msg_size = sizeof(struct afe_port_cmd_get_param_v3); - - if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", __func__, - user_afe_buf.cmd_size); - result = -EINVAL; - goto err; - } - - /* Copy the command and param data in-band */ - if (copy_from_user(afe_cmd, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v3_get), - user_afe_buf.cmd_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* - * The memory header is in the same location in all commands. Therefore, - * it doesn't matter what command the buffer is cast into. - */ - mem_hdr = &((struct afe_port_cmd_set_param_v3 *) rtac_afe_buffer) - ->mem_hdr; - mem_hdr->data_payload_addr_lsw = - lower_32_bits(rtac_cal[AFE_RTAC_CAL].cal_data.paddr); - mem_hdr->data_payload_addr_msw = msm_audio_populate_upper_32_bits( - rtac_cal[AFE_RTAC_CAL].cal_data.paddr); - mem_hdr->mem_map_handle = rtac_cal[AFE_RTAC_CAL].map_data.map_handle; - - /* Fill the APR header at the end so we have the correct message size */ - fill_afe_apr_hdr((struct apr_hdr *) rtac_afe_buffer, - port_index, opcode, apr_msg_size); - - atomic_set(&rtac_afe_apr_data.cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[AFE_RTAC_CAL].cal_data.paddr); - - result = apr_send_pkt(rtac_afe_apr_data.apr_handle, - (uint32_t *)rtac_afe_buffer); - if (result < 0) { - pr_err("%s: Set params failed port = 0x%x, ret = %d\n", - __func__, user_afe_buf.port_id, result); - goto err; - } - /* Wait for the callback */ - result = wait_event_timeout(rtac_afe_apr_data.cmd_wait, - (atomic_read(&rtac_afe_apr_data.cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set params timed out port = 0x%x, ret = %d\n", - __func__, user_afe_buf.port_id, result); - goto err; - } - if (atomic_read(&rtac_common.apr_err_code)) { - pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n", - __func__, adsp_err_get_err_str(atomic_read( - &rtac_common.apr_err_code)), - opcode); - result = adsp_err_get_lnx_err_code( - atomic_read( - &rtac_common.apr_err_code)); - goto err; - } - - if (opcode == AFE_PORT_CMD_GET_PARAM_V2) { - get_resp_v2 = (struct param_hdr_v1 *) rtac_cal[AFE_RTAC_CAL] - .cal_data.kvaddr; - bytes_returned = - get_resp_v2->param_size + sizeof(struct param_hdr_v1); - } else if (opcode == AFE_PORT_CMD_GET_PARAM_V3) { - get_resp_v3 = (struct param_hdr_v3 *) rtac_cal[AFE_RTAC_CAL] - .cal_data.kvaddr; - bytes_returned = - get_resp_v3->param_size + sizeof(struct param_hdr_v3); - } else { - bytes_returned = payload_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[AFE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_afe_buf.buf_size) { - pr_err("%s: user size = 0x%x, returned size = 0x%x\n", __func__, - user_afe_buf.buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_afe_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_afe_apr_mutex); - return result; -} - -/* Voice APR */ -void rtac_set_voice_handle(u32 mode, void *handle) -{ - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_voice_apr_mutex); - rtac_voice_apr_data[mode].apr_handle = handle; - mutex_unlock(&rtac_voice_apr_mutex); -} - -bool rtac_make_voice_callback(u32 mode, uint32_t *payload, u32 payload_size) -{ - if ((atomic_read(&rtac_voice_apr_data[mode].cmd_state) != 1) || - (mode >= RTAC_VOICE_MODES)) - return false; - - pr_debug("%s\n", __func__); - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_voice_apr_data[mode].cmd_state, 0); - wake_up(&rtac_voice_apr_data[mode].cmd_wait); - return true; -} - -int send_voice_apr(u32 mode, void *buf, u32 opcode) -{ - s32 result; - u32 user_buf_size = 0; - u32 bytes_returned = 0; - u32 payload_size; - u32 dest_port; - u32 data_size = 0; - struct apr_hdr voice_params; - - pr_debug("%s\n", __func__); - - if (rtac_cal[VOICE_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(VOICE_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed!", - __func__); - goto done; - } - } - - if (rtac_cal[VOICE_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(VOICE_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed!", - __func__); - goto done; - } - } - - if (copy_from_user(&user_buf_size, (void *)buf, - sizeof(user_buf_size))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - if (user_buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_buf_size); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (copy_from_user(&dest_port, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy port id from user buffer\n", - __func__); - goto done; - } - - if ((mode != RTAC_CVP) && (mode != RTAC_CVS)) { - pr_err("%s: Invalid Mode for APR, mode = %d\n", - __func__, mode); - goto done; - } - - mutex_lock(&rtac_voice_apr_mutex); - if (rtac_voice_apr_data[mode].apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - switch (opcode) { - case VSS_ICOMMON_CMD_SET_PARAM_V2: - case VSS_ICOMMON_CMD_SET_PARAM_V3: - /* set payload size to in-band payload */ - /* set data size to actual out of band payload size */ - data_size = payload_size - 4 * sizeof(u32); - if (data_size > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", - __func__, data_size); - result = -EINVAL; - goto err; - } - payload_size = 4 * sizeof(u32); - - /* Copy buffer to out-of-band payload */ - if (copy_from_user((void *) - rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr, - buf + 7 * sizeof(u32), data_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - /* set payload size in packet */ - rtac_voice_buffer[8] = data_size; - /* set token for set param case */ - voice_params.token = VOC_RTAC_SET_PARAM_TOKEN; - break; - case VSS_ICOMMON_CMD_GET_PARAM_V2: - case VSS_ICOMMON_CMD_GET_PARAM_V3: - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - result = -EINVAL; - goto err; - } - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_voice_buffer + - sizeof(voice_params)/sizeof(u32), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - /* set token for get param case */ - voice_params.token = 0; - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* Pack header */ - voice_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - voice_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - voice_params.src_svc = 0; - voice_params.src_domain = APR_DOMAIN_APPS; - voice_params.src_port = get_voice_index(mode, dest_port); - voice_params.dest_svc = 0; - voice_params.dest_domain = APR_DOMAIN_MODEM; - voice_params.dest_port = (u16)dest_port; - voice_params.opcode = opcode; - - /* fill for out-of-band */ - rtac_voice_buffer[5] = rtac_cal[VOICE_RTAC_CAL].map_data.map_handle; - rtac_voice_buffer[6] = - lower_32_bits(rtac_cal[VOICE_RTAC_CAL].cal_data.paddr); - rtac_voice_buffer[7] = msm_audio_populate_upper_32_bits( - rtac_cal[VOICE_RTAC_CAL].cal_data.paddr); - - memcpy(rtac_voice_buffer, &voice_params, sizeof(voice_params)); - atomic_set(&rtac_voice_apr_data[mode].cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[VOICE_RTAC_CAL].cal_data.paddr); - - result = apr_send_pkt(rtac_voice_apr_data[mode].apr_handle, - (uint32_t *)rtac_voice_buffer); - if (result < 0) { - pr_err("%s: apr_send_pkt failed opcode = %x\n", - __func__, opcode); - goto err; - } - /* Wait for the callback */ - result = wait_event_timeout(rtac_voice_apr_data[mode].cmd_wait, - (atomic_read(&rtac_voice_apr_data[mode].cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: apr_send_pkt timed out opcode = %x\n", - __func__, opcode); - goto err; - } - if (atomic_read(&rtac_common.apr_err_code)) { - pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n", - __func__, adsp_err_get_err_str(atomic_read( - &rtac_common.apr_err_code)), - opcode); - result = adsp_err_get_lnx_err_code( - atomic_read( - &rtac_common.apr_err_code)); - goto err; - } - - if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V2) { - bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data. - kvaddr)[2] + 3 * sizeof(u32); - } else if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V3) { - bytes_returned = - ((u32 *) rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr)[3] + - 4 * sizeof(u32); - } else { - bytes_returned = data_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_buf_size) { - pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", - __func__, user_buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user, size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_voice_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_voice_apr_mutex); - return result; -} - -void get_rtac_adm_data(struct rtac_adm *adm_data) -{ - mutex_lock(&rtac_adm_mutex); - memcpy(adm_data, &rtac_adm_data, sizeof(struct rtac_adm)); - mutex_unlock(&rtac_adm_mutex); -} - - -static long rtac_ioctl_shared(struct file *f, - unsigned int cmd, void *arg) -{ - u32 opcode; - int result = 0; - if (!arg) { - pr_err("%s: No data sent to driver!\n", __func__); - result = -EFAULT; - goto done; - } - - switch (cmd) { - case AUDIO_GET_RTAC_ADM_INFO: { - mutex_lock(&rtac_adm_mutex); - if (copy_to_user((void *)arg, &rtac_adm_data, - sizeof(rtac_adm_data))) { - pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_ADM_INFO\n", - __func__); - mutex_unlock(&rtac_adm_mutex); - return -EFAULT; - } - result = sizeof(rtac_adm_data); - mutex_unlock(&rtac_adm_mutex); - break; - } - case AUDIO_GET_RTAC_VOICE_INFO: { - mutex_lock(&rtac_voice_mutex); - if (copy_to_user((void *)arg, &rtac_voice_data, - sizeof(rtac_voice_data))) { - pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_VOICE_INFO\n", - __func__); - mutex_unlock(&rtac_voice_mutex); - return -EFAULT; - } - result = sizeof(rtac_voice_data); - mutex_unlock(&rtac_voice_mutex); - break; - } - - case AUDIO_GET_RTAC_ADM_CAL: - opcode = q6common_is_instance_id_supported() ? - ADM_CMD_GET_PP_PARAMS_V6 : - ADM_CMD_GET_PP_PARAMS_V5; - result = send_adm_apr((void *) arg, opcode); - break; - case AUDIO_SET_RTAC_ADM_CAL: - opcode = q6common_is_instance_id_supported() ? - ADM_CMD_SET_PP_PARAMS_V6 : - ADM_CMD_SET_PP_PARAMS_V5; - result = send_adm_apr((void *) arg, opcode); - break; - case AUDIO_GET_RTAC_ASM_CAL: - opcode = q6common_is_instance_id_supported() ? - ASM_STREAM_CMD_GET_PP_PARAMS_V3 : - ASM_STREAM_CMD_GET_PP_PARAMS_V2; - result = send_rtac_asm_apr((void *) arg, opcode); - break; - case AUDIO_SET_RTAC_ASM_CAL: - opcode = q6common_is_instance_id_supported() ? - ASM_STREAM_CMD_SET_PP_PARAMS_V3 : - ASM_STREAM_CMD_SET_PP_PARAMS_V2; - result = send_rtac_asm_apr((void *) arg, opcode); - break; - case AUDIO_GET_RTAC_CVS_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_GET_PARAM_V3 : - VSS_ICOMMON_CMD_GET_PARAM_V2; - result = send_voice_apr(RTAC_CVS, (void *) arg, opcode); - break; - case AUDIO_SET_RTAC_CVS_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_SET_PARAM_V3 : - VSS_ICOMMON_CMD_SET_PARAM_V2; - result = send_voice_apr(RTAC_CVS, (void *) arg, opcode); - break; - case AUDIO_GET_RTAC_CVP_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_GET_PARAM_V3 : - VSS_ICOMMON_CMD_GET_PARAM_V2; - result = send_voice_apr(RTAC_CVP, (void *) arg, opcode); - break; - case AUDIO_SET_RTAC_CVP_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_SET_PARAM_V3 : - VSS_ICOMMON_CMD_SET_PARAM_V2; - result = send_voice_apr(RTAC_CVP, (void *) arg, opcode); - break; - case AUDIO_GET_RTAC_AFE_CAL: - opcode = q6common_is_instance_id_supported() ? - AFE_PORT_CMD_GET_PARAM_V3 : - AFE_PORT_CMD_GET_PARAM_V2; - result = send_rtac_afe_apr((void __user *) arg, opcode); - break; - case AUDIO_SET_RTAC_AFE_CAL: - opcode = q6common_is_instance_id_supported() ? - AFE_PORT_CMD_SET_PARAM_V3 : - AFE_PORT_CMD_SET_PARAM_V2; - result = send_rtac_afe_apr((void __user *) arg, opcode); - break; - default: - pr_err("%s: Invalid IOCTL, command = %d!\n", - __func__, cmd); - result = -EINVAL; - } -done: - return result; -} - -static long rtac_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - int result = 0; - - mutex_lock(&rtac_common.rtac_fops_mutex); - if (!arg) { - pr_err("%s: No data sent to driver!\n", __func__); - result = -EFAULT; - } else { - result = rtac_ioctl_shared(f, cmd, (void __user *)arg); - } - - mutex_unlock(&rtac_common.rtac_fops_mutex); - return result; -} - -#ifdef CONFIG_COMPAT -#define AUDIO_GET_RTAC_ADM_INFO_32 _IOR(CAL_IOCTL_MAGIC, 207, compat_uptr_t) -#define AUDIO_GET_RTAC_VOICE_INFO_32 _IOR(CAL_IOCTL_MAGIC, 208, compat_uptr_t) -#define AUDIO_GET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 209, compat_uptr_t) -#define AUDIO_SET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 210, compat_uptr_t) -#define AUDIO_GET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 211, compat_uptr_t) -#define AUDIO_SET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 212, compat_uptr_t) -#define AUDIO_GET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 213, compat_uptr_t) -#define AUDIO_SET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 214, compat_uptr_t) -#define AUDIO_GET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 215, compat_uptr_t) -#define AUDIO_SET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 216, compat_uptr_t) -#define AUDIO_GET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 217, compat_uptr_t) -#define AUDIO_SET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 218, compat_uptr_t) - -static long rtac_compat_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - int result = 0; - - mutex_lock(&rtac_common.rtac_fops_mutex); - if (!arg) { - pr_err("%s: No data sent to driver!\n", __func__); - result = -EINVAL; - goto done; - } - - switch (cmd) { - case AUDIO_GET_RTAC_ADM_INFO_32: - cmd = AUDIO_GET_RTAC_ADM_INFO; - goto process; - case AUDIO_GET_RTAC_VOICE_INFO_32: - cmd = AUDIO_GET_RTAC_VOICE_INFO; - goto process; - case AUDIO_GET_RTAC_AFE_CAL_32: - cmd = AUDIO_GET_RTAC_AFE_CAL; - goto process; - case AUDIO_SET_RTAC_AFE_CAL_32: - cmd = AUDIO_SET_RTAC_AFE_CAL; - goto process; - case AUDIO_GET_RTAC_ADM_CAL_32: - cmd = AUDIO_GET_RTAC_ADM_CAL; - goto process; - case AUDIO_SET_RTAC_ADM_CAL_32: - cmd = AUDIO_SET_RTAC_ADM_CAL; - goto process; - case AUDIO_GET_RTAC_ASM_CAL_32: - cmd = AUDIO_GET_RTAC_ASM_CAL; - goto process; - case AUDIO_SET_RTAC_ASM_CAL_32: - cmd = AUDIO_SET_RTAC_ASM_CAL; - goto process; - case AUDIO_GET_RTAC_CVS_CAL_32: - cmd = AUDIO_GET_RTAC_CVS_CAL; - goto process; - case AUDIO_SET_RTAC_CVS_CAL_32: - cmd = AUDIO_SET_RTAC_CVS_CAL; - goto process; - case AUDIO_GET_RTAC_CVP_CAL_32: - cmd = AUDIO_GET_RTAC_CVP_CAL; - goto process; - case AUDIO_SET_RTAC_CVP_CAL_32: - cmd = AUDIO_SET_RTAC_CVP_CAL; -process: - result = rtac_ioctl_shared(f, cmd, compat_ptr(arg)); - break; - default: - result = -EINVAL; - pr_err("%s: Invalid IOCTL, command = %d!\n", - __func__, cmd); - break; - } -done: - mutex_unlock(&rtac_common.rtac_fops_mutex); - return result; -} -#else -#define rtac_compat_ioctl NULL -#endif - -static const struct file_operations rtac_fops = { - .owner = THIS_MODULE, - .open = rtac_open, - .release = rtac_release, - .unlocked_ioctl = rtac_ioctl, - .compat_ioctl = rtac_compat_ioctl, -}; - -struct miscdevice rtac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_rtac", - .fops = &rtac_fops, -}; - -int __init rtac_init(void) -{ - int i = 0; - - /* Driver */ - atomic_set(&rtac_common.usage_count, 0); - atomic_set(&rtac_common.apr_err_code, 0); - mutex_init(&rtac_common.rtac_fops_mutex); - - /* ADM */ - memset(&rtac_adm_data, 0, sizeof(rtac_adm_data)); - rtac_adm_apr_data.apr_handle = NULL; - atomic_set(&rtac_adm_apr_data.cmd_state, 0); - init_waitqueue_head(&rtac_adm_apr_data.cmd_wait); - mutex_init(&rtac_adm_mutex); - mutex_init(&rtac_adm_apr_mutex); - - rtac_adm_buffer = kzalloc( - rtac_cal[ADM_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_adm_buffer == NULL) - goto nomem; - - /* ASM */ - for (i = 0; i < ASM_ACTIVE_STREAMS_ALLOWED+1; i++) { - rtac_asm_apr_data[i].apr_handle = NULL; - atomic_set(&rtac_asm_apr_data[i].cmd_state, 0); - init_waitqueue_head(&rtac_asm_apr_data[i].cmd_wait); - } - mutex_init(&rtac_asm_apr_mutex); - - rtac_asm_buffer = kzalloc( - rtac_cal[ASM_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_asm_buffer == NULL) { - kzfree(rtac_adm_buffer); - goto nomem; - } - - /* AFE */ - rtac_afe_apr_data.apr_handle = NULL; - atomic_set(&rtac_afe_apr_data.cmd_state, 0); - init_waitqueue_head(&rtac_afe_apr_data.cmd_wait); - mutex_init(&rtac_afe_apr_mutex); - - rtac_afe_buffer = kzalloc( - rtac_cal[AFE_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_afe_buffer == NULL) { - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - goto nomem; - } - - /* Voice */ - memset(&rtac_voice_data, 0, sizeof(rtac_voice_data)); - for (i = 0; i < RTAC_VOICE_MODES; i++) { - rtac_voice_apr_data[i].apr_handle = NULL; - atomic_set(&rtac_voice_apr_data[i].cmd_state, 0); - init_waitqueue_head(&rtac_voice_apr_data[i].cmd_wait); - } - mutex_init(&rtac_voice_mutex); - mutex_init(&rtac_voice_apr_mutex); - - rtac_voice_buffer = kzalloc( - rtac_cal[VOICE_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_voice_buffer == NULL) { - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - kzfree(rtac_afe_buffer); - goto nomem; - } - - if (misc_register(&rtac_misc) != 0) { - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - kzfree(rtac_afe_buffer); - kzfree(rtac_voice_buffer); - goto nomem; - } - - return 0; -nomem: - return -ENOMEM; -} - -void rtac_exit(void) -{ - misc_deregister(&rtac_misc); - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - kzfree(rtac_afe_buffer); - kzfree(rtac_voice_buffer); -} - -MODULE_DESCRIPTION("SoC QDSP6v2 Real-Time Audio Calibration driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/sp_params.c b/techpack/audio/4.0/dsp/sp_params.c deleted file mode 100644 index c84f8c79da4b..000000000000 --- a/techpack/audio/4.0/dsp/sp_params.c +++ /dev/null @@ -1,425 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -/* export or show spk params at /sys/class/spk_params/cal_data */ -#define SPK_PARAMS "spk_params" -#define CLASS_NAME "cal_data" -#define BUF_SZ 20 -#define Q22 (1<<22) -#define Q13 (1<<13) -#define Q7 (1<<7) - -struct afe_spk_ctl { - struct class *p_class; - struct device *p_dev; - struct afe_sp_rx_tmax_xmax_logging_param xt_logging; - int32_t max_temperature_rd[SP_V2_NUM_MAX_SPKR]; -}; -struct afe_spk_ctl this_afe_spk; - -static ssize_t sp_count_exceeded_temperature_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1]); - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_temperature, 0644, - sp_count_exceeded_temperature_l_show, NULL); - -static ssize_t sp_count_exceeded_temperature_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2]); - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_temperature_r, 0644, - sp_count_exceeded_temperature_r_show, NULL); - -static ssize_t sp_count_exceeded_excursion_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1]); - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_excursion, 0644, - sp_count_exceeded_excursion_l_show, NULL); - -static ssize_t sp_count_exceeded_excursion_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2]); - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_excursion_r, 0644, - sp_count_exceeded_excursion_r_show, NULL); - -static ssize_t sp_max_excursion_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - int32_t ex_val_frac; - int32_t ex_q27 = this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1]; - - ex_val_frac = ex_q27/Q13; - ex_val_frac = (ex_val_frac * 10000)/(Q7 * Q7); - ex_val_frac /= 100; - ret = snprintf(buf, BUF_SZ, "%d.%02d\n", 0, ex_val_frac); - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(max_excursion, 0644, sp_max_excursion_l_show, NULL); - -static ssize_t sp_max_excursion_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - int32_t ex_val_frac; - int32_t ex_q27 = this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2]; - - ex_val_frac = ex_q27/Q13; - ex_val_frac = (ex_val_frac * 10000)/(Q7 * Q7); - ex_val_frac /= 100; - ret = snprintf(buf, BUF_SZ, "%d.%02d\n", 0, ex_val_frac); - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(max_excursion_r, 0644, sp_max_excursion_r_show, NULL); - -static ssize_t sp_max_temperature_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1]/Q22); - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(max_temperature, 0644, sp_max_temperature_l_show, NULL); - -static ssize_t sp_max_temperature_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2]/Q22); - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(max_temperature_r, 0644, sp_max_temperature_r_show, NULL); - -static ssize_t sp_max_temperature_rd_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.max_temperature_rd[SP_V2_SPKR_1]/Q22); -} -static DEVICE_ATTR(max_temperature_rd, 0644, - sp_max_temperature_rd_l_show, NULL); - -static ssize_t sp_max_temperature_rd_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.max_temperature_rd[SP_V2_SPKR_2]/Q22); -} -static DEVICE_ATTR(max_temperature_rd_r, 0644, - sp_max_temperature_rd_r_show, NULL); - -static ssize_t q6afe_initial_cal_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", afe_get_spk_initial_cal()); -} - -static ssize_t q6afe_initial_cal_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - int initial_cal = 0; - - if (!kstrtou32(buf, 0, &initial_cal)) { - initial_cal = initial_cal > 0 ? 1 : 0; - if (initial_cal == afe_get_spk_initial_cal()) - dev_dbg(dev, "%s: same value already present\n", - __func__); - else - afe_set_spk_initial_cal(initial_cal); - } - return size; -} - -static DEVICE_ATTR(initial_cal, 0644, - q6afe_initial_cal_show, q6afe_initial_cal_store); - -static ssize_t q6afe_v_vali_flag_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", afe_get_spk_v_vali_flag()); -} - -static ssize_t q6afe_v_vali_flag_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - int v_vali_flag = 0; - - if (!kstrtou32(buf, 0, &v_vali_flag)) { - v_vali_flag = v_vali_flag > 0 ? 1 : 0; - if (v_vali_flag == afe_get_spk_v_vali_flag()) - dev_dbg(dev, "%s: same value already present\n", - __func__); - else - afe_set_spk_v_vali_flag(v_vali_flag); - } - return size; -} - -static DEVICE_ATTR(v_vali_flag, 0644, - q6afe_v_vali_flag_show, q6afe_v_vali_flag_store); - -static ssize_t q6afe_spk_r0_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int r0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_r0(r0); - return snprintf(buf, BUF_SZ, "%d\n", r0[SP_V2_SPKR_1]); -} - -static DEVICE_ATTR(spk_r0, 0644, q6afe_spk_r0_l_show, NULL); - -static ssize_t q6afe_spk_t0_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int t0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_t0(t0); - return snprintf(buf, BUF_SZ, "%d\n", t0[SP_V2_SPKR_1]); -} - -static DEVICE_ATTR(spk_t0, 0644, q6afe_spk_t0_l_show, NULL); - -static ssize_t q6afe_spk_r0_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int r0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_r0(r0); - return snprintf(buf, BUF_SZ, "%d\n", r0[SP_V2_SPKR_2]); -} - -static DEVICE_ATTR(spk_r0_r, 0644, q6afe_spk_r0_r_show, NULL); - -static ssize_t q6afe_spk_t0_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int t0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_t0(t0); - return snprintf(buf, BUF_SZ, "%d\n", t0[SP_V2_SPKR_2]); -} - -static DEVICE_ATTR(spk_t0_r, 0644, q6afe_spk_t0_r_show, NULL); - -static ssize_t q6afe_spk_v_vali_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int v_vali_sts[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_v_vali_sts(v_vali_sts); - return snprintf(buf, BUF_SZ, "%d\n", v_vali_sts[SP_V2_SPKR_1]); -} - -static DEVICE_ATTR(spk_v_vali_status, 0644, q6afe_spk_v_vali_l_show, NULL); - -static ssize_t q6afe_spk_v_vali_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int v_vali_sts[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_v_vali_sts(v_vali_sts); - return snprintf(buf, BUF_SZ, "%d\n", v_vali_sts[SP_V2_SPKR_2]); -} - -static DEVICE_ATTR(spk_v_vali_r_status, 0644, q6afe_spk_v_vali_r_show, NULL); - -static struct attribute *afe_spk_cal_attr[] = { - &dev_attr_max_excursion.attr, - &dev_attr_max_excursion_r.attr, - &dev_attr_max_temperature.attr, - &dev_attr_max_temperature_r.attr, - &dev_attr_count_exceeded_excursion.attr, - &dev_attr_count_exceeded_excursion_r.attr, - &dev_attr_count_exceeded_temperature.attr, - &dev_attr_count_exceeded_temperature_r.attr, - &dev_attr_max_temperature_rd.attr, - &dev_attr_max_temperature_rd_r.attr, - &dev_attr_initial_cal.attr, - &dev_attr_spk_r0.attr, - &dev_attr_spk_t0.attr, - &dev_attr_spk_r0_r.attr, - &dev_attr_spk_t0_r.attr, - &dev_attr_v_vali_flag.attr, - &dev_attr_spk_v_vali_status.attr, - &dev_attr_spk_v_vali_r_status.attr, - NULL, -}; - -static struct attribute_group afe_spk_cal_attr_grp = { - .attrs = afe_spk_cal_attr, -}; - - -/** - * afe_get_sp_xt_logging_data - - * to get excursion logging data from DSP - * - * @port: AFE port ID - * - * Returns 0 on success or error on failure - */ -int afe_get_sp_xt_logging_data(u16 port_id) -{ - int ret = 0; - struct afe_sp_rx_tmax_xmax_logging_param xt_logging_data; - - ret = afe_get_sp_rx_tmax_xmax_logging_data(&xt_logging_data, port_id); - if (ret) { - pr_err("%s Excursion logging fail\n", __func__); - return ret; - } - /* storing max sp param value */ - if (this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] < - xt_logging_data.max_temperature[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = - xt_logging_data.max_temperature[SP_V2_SPKR_1]; - - - if (this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] < - xt_logging_data.max_temperature[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = - xt_logging_data.max_temperature[SP_V2_SPKR_2]; - - - /* update temp for max_temperature_rd node */ - if (this_afe_spk.max_temperature_rd[SP_V2_SPKR_1] < - xt_logging_data.max_temperature[SP_V2_SPKR_1]) - this_afe_spk.max_temperature_rd[SP_V2_SPKR_1] = - xt_logging_data.max_temperature[SP_V2_SPKR_1]; - - if (this_afe_spk.max_temperature_rd[SP_V2_SPKR_2] < - xt_logging_data.max_temperature[SP_V2_SPKR_2]) - this_afe_spk.max_temperature_rd[SP_V2_SPKR_2] = - xt_logging_data.max_temperature[SP_V2_SPKR_2]; - - - if (this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] < - xt_logging_data.max_excursion[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = - xt_logging_data.max_excursion[SP_V2_SPKR_1]; - - if (this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] < - xt_logging_data.max_excursion[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = - xt_logging_data.max_excursion[SP_V2_SPKR_2]; - - if (this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] < - xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] - += xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_1]; - - if (this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] < - xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] - += xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_2]; - - if (this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] < - xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] - += xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_1]; - - if (this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] < - xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] - += xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_2]; - - return ret; -} -EXPORT_SYMBOL(afe_get_sp_xt_logging_data); - -int __init spk_params_init(void) -{ - /* initialize xt param value with 0 */ - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = 0; - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = 0; - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] = 0; - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] = 0; - - this_afe_spk.p_class = class_create(THIS_MODULE, SPK_PARAMS); - if (this_afe_spk.p_class) { - this_afe_spk.p_dev = device_create(this_afe_spk.p_class, NULL, - 1, NULL, CLASS_NAME); - if (!IS_ERR(this_afe_spk.p_dev)) { - if (sysfs_create_group(&this_afe_spk.p_dev->kobj, - &afe_spk_cal_attr_grp)) - pr_err("%s: Failed to create sysfs group\n", - __func__); - } - } - return 0; -} - -void spk_params_exit(void) -{ - pr_debug("%s\n", __func__); -} diff --git a/techpack/audio/4.0/dsp/usf.c b/techpack/audio/4.0/dsp/usf.c deleted file mode 100644 index e408c7d70f5b..000000000000 --- a/techpack/audio/4.0/dsp/usf.c +++ /dev/null @@ -1,2466 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6usm.h" -#include "usf.h" -#include "usfcdev.h" -#include "q6_init.h" - -/* The driver version*/ -#define DRV_VERSION "1.7.1" -#define USF_VERSION_ID 0x0171 - -/* Standard timeout in the asynchronous ops */ -#define USF_TIMEOUT_JIFFIES (1*HZ) /* 1 sec */ - -/* Undefined USF device */ -#define USF_UNDEF_DEV_ID 0xffff - -/* TX memory mapping flag */ -#define USF_VM_READ 1 -/* RX memory mapping flag */ -#define USF_VM_WRITE 2 - -/* Number of events, copied from the user space to kernel one */ -#define USF_EVENTS_PORTION_SIZE 20 - -/* Indexes in range definitions */ -#define MIN_IND 0 -#define MAX_IND 1 - -/* The coordinates indexes */ -#define X_IND 0 -#define Y_IND 1 -#define Z_IND 2 - -/* Shared memory limits */ -/* max_buf_size = (port_size(65535*2) * port_num(8) * group_size(3) */ -#define USF_MAX_BUF_SIZE 3145680 -#define USF_MAX_BUF_NUM 32 - -/* max size for buffer set from user space */ -#define USF_MAX_USER_BUF_SIZE 100000 - -/* Place for opreation result, received from QDSP6 */ -#define APR_RESULT_IND 1 - -/* Place for US detection result, received from QDSP6 */ -#define APR_US_DETECT_RESULT_IND 0 - -#define BITS_IN_BYTE 8 - -/* Time to stay awake after tx read event (e.g., proximity) */ -#define STAY_AWAKE_AFTER_READ_MSECS 3000 - -/* The driver states */ -enum usf_state_type { - USF_IDLE_STATE, - USF_OPENED_STATE, - USF_CONFIGURED_STATE, - USF_WORK_STATE, - USF_ADSP_RESTART_STATE, - USF_ERROR_STATE -}; - -/* The US detection status upon FW/HW based US detection results */ -enum usf_us_detect_type { - USF_US_DETECT_UNDEF, - USF_US_DETECT_YES, - USF_US_DETECT_NO -}; - -struct usf_xx_type { - /* Name of the client - event calculator */ - char client_name[USF_MAX_CLIENT_NAME_SIZE]; - /* The driver state in TX or RX direction */ - enum usf_state_type usf_state; - /* wait for q6 events mechanism */ - wait_queue_head_t wait; - /* IF with q6usm info */ - struct us_client *usc; - /* Q6:USM' Encoder/decoder configuration */ - struct us_encdec_cfg encdec_cfg; - /* Shared buffer (with Q6:USM) size */ - uint32_t buffer_size; - /* Number of the shared buffers (with Q6:USM) */ - uint32_t buffer_count; - /* Shared memory (Cyclic buffer with 1 gap) control */ - uint32_t new_region; - uint32_t prev_region; - /* Q6:USM's events handler */ - void (*cb)(uint32_t, uint32_t, uint32_t *, void *); - /* US detection result */ - enum usf_us_detect_type us_detect_type; - /* User's update info isn't acceptable */ - u8 user_upd_info_na; -}; - -struct usf_type { - /* TX device component configuration & control */ - struct usf_xx_type usf_tx; - /* RX device component configuration & control */ - struct usf_xx_type usf_rx; - /* Index into the opened device container */ - /* To prevent mutual usage of the same device */ - uint16_t dev_ind; - /* Event types, supported by device */ - uint16_t event_types; - /* The input devices are "input" module registered clients */ - struct input_dev *input_ifs[USF_MAX_EVENT_IND]; - /* Bitmap of types of events, conflicting to USF's ones */ - uint16_t conflicting_event_types; - /* Bitmap of types of events from devs, conflicting with USF */ - uint16_t conflicting_event_filters; - /* The requested buttons bitmap */ - uint16_t req_buttons_bitmap; - /* Mutex for exclusive operations (all public APIs) */ - struct mutex mutex; -}; - -struct usf_input_dev_type { - /* Input event type, supported by the input device */ - uint16_t event_type; - /* Input device name */ - const char *input_dev_name; - /* Input device registration function */ - int (*prepare_dev)(uint16_t, struct usf_type *, - struct us_input_info_type *, - const char *); - /* Input event notification function */ - void (*notify_event)(struct usf_type *, - uint16_t, - struct usf_event_type * - ); -}; - - -/* The MAX number of the supported devices */ -#define MAX_DEVS_NUMBER 1 - -/* - * code for a special button that is used to show/hide a - * hovering cursor in the input framework. Must be in - * sync with the button code definition in the framework - * (EventHub.h) - */ -#define BTN_USF_HOVERING_CURSOR 0x230 - -/* Supported buttons container */ -static const int s_button_map[] = { - BTN_STYLUS, - BTN_STYLUS2, - BTN_TOOL_PEN, - BTN_TOOL_RUBBER, - BTN_TOOL_FINGER, - BTN_USF_HOVERING_CURSOR -}; - -/* The opened devices container */ -static atomic_t s_opened_devs[MAX_DEVS_NUMBER]; - -static struct wakeup_source usf_wakeup_source; - -#define USF_NAME_PREFIX "usf_" -#define USF_NAME_PREFIX_SIZE 4 - - -static struct input_dev *allocate_dev(uint16_t ind, const char *name) -{ - struct input_dev *in_dev = input_allocate_device(); - - if (in_dev == NULL) { - pr_err("%s: input_allocate_device() failed\n", __func__); - } else { - /* Common part configuration */ - in_dev->name = name; - in_dev->phys = NULL; - in_dev->id.bustype = BUS_HOST; - in_dev->id.vendor = 0x0001; - in_dev->id.product = 0x0001; - in_dev->id.version = USF_VERSION_ID; - } - return in_dev; -} - -static int prepare_tsc_input_device(uint16_t ind, - struct usf_type *usf_info, - struct us_input_info_type *input_info, - const char *name) -{ - int i = 0; - - int num_buttons = min(ARRAY_SIZE(s_button_map), - sizeof(input_info->req_buttons_bitmap) * - BITS_IN_BYTE); - uint16_t max_buttons_bitmap = ((1 << ARRAY_SIZE(s_button_map)) - 1); - - struct input_dev *in_dev = allocate_dev(ind, name); - - if (in_dev == NULL) - return -ENOMEM; - - if (input_info->req_buttons_bitmap > max_buttons_bitmap) { - pr_err("%s: Requested buttons[%d] exceeds max buttons available[%d]\n", - __func__, - input_info->req_buttons_bitmap, - max_buttons_bitmap); - input_free_device(in_dev); - return -EINVAL; - } - - usf_info->input_ifs[ind] = in_dev; - usf_info->req_buttons_bitmap = - input_info->req_buttons_bitmap; - in_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); - in_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); - - for (i = 0; i < num_buttons; i++) - if (input_info->req_buttons_bitmap & (1 << i)) - in_dev->keybit[BIT_WORD(s_button_map[i])] |= - BIT_MASK(s_button_map[i]); - - input_set_abs_params(in_dev, ABS_X, - input_info->tsc_x_dim[MIN_IND], - input_info->tsc_x_dim[MAX_IND], - 0, 0); - input_set_abs_params(in_dev, ABS_Y, - input_info->tsc_y_dim[MIN_IND], - input_info->tsc_y_dim[MAX_IND], - 0, 0); - input_set_abs_params(in_dev, ABS_DISTANCE, - input_info->tsc_z_dim[MIN_IND], - input_info->tsc_z_dim[MAX_IND], - 0, 0); - - input_set_abs_params(in_dev, ABS_PRESSURE, - input_info->tsc_pressure[MIN_IND], - input_info->tsc_pressure[MAX_IND], - 0, 0); - - input_set_abs_params(in_dev, ABS_TILT_X, - input_info->tsc_x_tilt[MIN_IND], - input_info->tsc_x_tilt[MAX_IND], - 0, 0); - input_set_abs_params(in_dev, ABS_TILT_Y, - input_info->tsc_y_tilt[MIN_IND], - input_info->tsc_y_tilt[MAX_IND], - 0, 0); - - return 0; -} - -static int prepare_mouse_input_device(uint16_t ind, struct usf_type *usf_info, - struct us_input_info_type *input_info, - const char *name) -{ - struct input_dev *in_dev = allocate_dev(ind, name); - - if (in_dev == NULL) - return -ENOMEM; - - usf_info->input_ifs[ind] = in_dev; - in_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); - - in_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | - BIT_MASK(BTN_RIGHT) | - BIT_MASK(BTN_MIDDLE); - in_dev->relbit[0] = BIT_MASK(REL_X) | - BIT_MASK(REL_Y) | - BIT_MASK(REL_Z); - - return 0; -} - -static int prepare_keyboard_input_device( - uint16_t ind, - struct usf_type *usf_info, - struct us_input_info_type *input_info, - const char *name) -{ - struct input_dev *in_dev = allocate_dev(ind, name); - - if (in_dev == NULL) - return -ENOMEM; - - usf_info->input_ifs[ind] = in_dev; - in_dev->evbit[0] |= BIT_MASK(EV_KEY); - /* All keys are permitted */ - memset(in_dev->keybit, 0xff, sizeof(in_dev->keybit)); - - return 0; -} - -static void notify_tsc_event(struct usf_type *usf_info, - uint16_t if_ind, - struct usf_event_type *event) - -{ - int i = 0; - int num_buttons = min(ARRAY_SIZE(s_button_map), - sizeof(usf_info->req_buttons_bitmap) * - BITS_IN_BYTE); - - struct input_dev *input_if = usf_info->input_ifs[if_ind]; - struct point_event_type *pe = &(event->event_data.point_event); - - input_report_abs(input_if, ABS_X, pe->coordinates[X_IND]); - input_report_abs(input_if, ABS_Y, pe->coordinates[Y_IND]); - input_report_abs(input_if, ABS_DISTANCE, pe->coordinates[Z_IND]); - - input_report_abs(input_if, ABS_TILT_X, pe->inclinations[X_IND]); - input_report_abs(input_if, ABS_TILT_Y, pe->inclinations[Y_IND]); - - input_report_abs(input_if, ABS_PRESSURE, pe->pressure); - input_report_key(input_if, BTN_TOUCH, !!(pe->pressure)); - - for (i = 0; i < num_buttons; i++) { - uint16_t mask = (1 << i), - btn_state = !!(pe->buttons_state_bitmap & mask); - if (usf_info->req_buttons_bitmap & mask) - input_report_key(input_if, s_button_map[i], btn_state); - } - - input_sync(input_if); - - pr_debug("%s: TSC event: xyz[%d;%d;%d], incl[%d;%d], pressure[%d], buttons[%d]\n", - __func__, - pe->coordinates[X_IND], - pe->coordinates[Y_IND], - pe->coordinates[Z_IND], - pe->inclinations[X_IND], - pe->inclinations[Y_IND], - pe->pressure, - pe->buttons_state_bitmap); -} - -static void notify_mouse_event(struct usf_type *usf_info, - uint16_t if_ind, - struct usf_event_type *event) -{ - struct input_dev *input_if = usf_info->input_ifs[if_ind]; - struct mouse_event_type *me = &(event->event_data.mouse_event); - - input_report_rel(input_if, REL_X, me->rels[X_IND]); - input_report_rel(input_if, REL_Y, me->rels[Y_IND]); - input_report_rel(input_if, REL_Z, me->rels[Z_IND]); - - input_report_key(input_if, BTN_LEFT, - me->buttons_states & USF_BUTTON_LEFT_MASK); - input_report_key(input_if, BTN_MIDDLE, - me->buttons_states & USF_BUTTON_MIDDLE_MASK); - input_report_key(input_if, BTN_RIGHT, - me->buttons_states & USF_BUTTON_RIGHT_MASK); - - input_sync(input_if); - - pr_debug("%s: mouse event: dx[%d], dy[%d], buttons_states[%d]\n", - __func__, me->rels[X_IND], - me->rels[Y_IND], me->buttons_states); -} - -static void notify_key_event(struct usf_type *usf_info, - uint16_t if_ind, - struct usf_event_type *event) -{ - struct input_dev *input_if = usf_info->input_ifs[if_ind]; - struct key_event_type *ke = &(event->event_data.key_event); - - input_report_key(input_if, ke->key, ke->key_state); - input_sync(input_if); - pr_debug("%s: key event: key[%d], state[%d]\n", - __func__, - ke->key, - ke->key_state); - -} - -static struct usf_input_dev_type s_usf_input_devs[] = { - {USF_TSC_EVENT, "usf_tsc", - prepare_tsc_input_device, notify_tsc_event}, - {USF_TSC_PTR_EVENT, "usf_tsc_ptr", - prepare_tsc_input_device, notify_tsc_event}, - {USF_MOUSE_EVENT, "usf_mouse", - prepare_mouse_input_device, notify_mouse_event}, - {USF_KEYBOARD_EVENT, "usf_kb", - prepare_keyboard_input_device, notify_key_event}, - {USF_TSC_EXT_EVENT, "usf_tsc_ext", - prepare_tsc_input_device, notify_tsc_event}, -}; - -static void usf_rx_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct usf_xx_type *usf_xx = (struct usf_xx_type *) priv; - - if (usf_xx == NULL) { - pr_err("%s: the private data is NULL\n", __func__); - return; - } - - switch (opcode) { - case Q6USM_EVENT_WRITE_DONE: - wake_up(&usf_xx->wait); - break; - - case RESET_EVENTS: - pr_err("%s: received RESET_EVENTS\n", __func__); - usf_xx->usf_state = USF_ADSP_RESTART_STATE; - wake_up(&usf_xx->wait); - break; - - default: - break; - } -} - -static void usf_tx_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct usf_xx_type *usf_xx = (struct usf_xx_type *) priv; - - if (usf_xx == NULL) { - pr_err("%s: the private data is NULL\n", __func__); - return; - } - - switch (opcode) { - case Q6USM_EVENT_READ_DONE: - pr_debug("%s: acquiring %d msec wake lock\n", __func__, - STAY_AWAKE_AFTER_READ_MSECS); - __pm_wakeup_event(&usf_wakeup_source, - STAY_AWAKE_AFTER_READ_MSECS); - if (token == USM_WRONG_TOKEN) - usf_xx->usf_state = USF_ERROR_STATE; - usf_xx->new_region = token; - wake_up(&usf_xx->wait); - break; - - case Q6USM_EVENT_SIGNAL_DETECT_RESULT: - usf_xx->us_detect_type = (payload[APR_US_DETECT_RESULT_IND]) ? - USF_US_DETECT_YES : - USF_US_DETECT_NO; - - wake_up(&usf_xx->wait); - break; - - case APR_BASIC_RSP_RESULT: - if (payload[APR_RESULT_IND]) { - usf_xx->usf_state = USF_ERROR_STATE; - usf_xx->new_region = USM_WRONG_TOKEN; - wake_up(&usf_xx->wait); - } - break; - - case RESET_EVENTS: - pr_err("%s: received RESET_EVENTS\n", __func__); - usf_xx->usf_state = USF_ADSP_RESTART_STATE; - wake_up(&usf_xx->wait); - break; - - default: - break; - } -} - -static void release_xx(struct usf_xx_type *usf_xx) -{ - if (usf_xx != NULL) { - if (usf_xx->usc) { - q6usm_us_client_free(usf_xx->usc); - usf_xx->usc = NULL; - } - - if (usf_xx->encdec_cfg.params != NULL) { - kfree(usf_xx->encdec_cfg.params); - usf_xx->encdec_cfg.params = NULL; - } - } -} - -static void usf_disable(struct usf_xx_type *usf_xx) -{ - if (usf_xx != NULL) { - if ((usf_xx->usf_state != USF_IDLE_STATE) && - (usf_xx->usf_state != USF_OPENED_STATE)) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - usf_xx->usf_state = USF_OPENED_STATE; - wake_up(&usf_xx->wait); - } - release_xx(usf_xx); - } -} - -static int config_xx(struct usf_xx_type *usf_xx, struct us_xx_info_type *config) -{ - int rc = 0; - uint16_t data_map_size = 0; - uint16_t min_map_size = 0; - - if ((usf_xx == NULL) || - (config == NULL)) - return -EINVAL; - - if ((config->buf_size == 0) || - (config->buf_size > USF_MAX_BUF_SIZE) || - (config->buf_num == 0) || - (config->buf_num > USF_MAX_BUF_NUM)) { - pr_err("%s: wrong params: buf_size=%d; buf_num=%d\n", - __func__, config->buf_size, config->buf_num); - return -EINVAL; - } - - data_map_size = sizeof(usf_xx->encdec_cfg.cfg_common.data_map); - min_map_size = min(data_map_size, config->port_cnt); - - if (config->client_name != NULL) { - if (strncpy_from_user(usf_xx->client_name, - (char __user *)config->client_name, - sizeof(usf_xx->client_name) - 1) < 0) { - pr_err("%s: get client name failed\n", __func__); - return -EINVAL; - } - } - - pr_debug("%s: name=%s; buf_size:%d; dev_id:0x%x; sample_rate:%d\n", - __func__, usf_xx->client_name, config->buf_size, - config->dev_id, config->sample_rate); - - pr_debug("%s: buf_num:%d; format:%d; port_cnt:%d; data_size=%d\n", - __func__, config->buf_num, config->stream_format, - config->port_cnt, config->params_data_size); - - pr_debug("%s: id[0]=%d, id[1]=%d, id[2]=%d, id[3]=%d, id[4]=%d,\n", - __func__, - config->port_id[0], - config->port_id[1], - config->port_id[2], - config->port_id[3], - config->port_id[4]); - - pr_debug("id[5]=%d, id[6]=%d, id[7]=%d\n", - config->port_id[5], - config->port_id[6], - config->port_id[7]); - - /* q6usm allocation & configuration */ - usf_xx->buffer_size = config->buf_size; - usf_xx->buffer_count = config->buf_num; - usf_xx->encdec_cfg.cfg_common.bits_per_sample = - config->bits_per_sample; - usf_xx->encdec_cfg.cfg_common.sample_rate = config->sample_rate; - /* AFE port e.g. AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX */ - usf_xx->encdec_cfg.cfg_common.dev_id = config->dev_id; - - usf_xx->encdec_cfg.cfg_common.ch_cfg = config->port_cnt; - memcpy((void *)&usf_xx->encdec_cfg.cfg_common.data_map, - (void *)config->port_id, - min_map_size); - - usf_xx->encdec_cfg.format_id = config->stream_format; - usf_xx->encdec_cfg.params_size = config->params_data_size; - usf_xx->user_upd_info_na = 1; /* it's used in US_GET_TX_UPDATE */ - - if (config->params_data_size > 0) { /* transparent data copy */ - usf_xx->encdec_cfg.params = kzalloc(config->params_data_size, - GFP_KERNEL); - /* False memory leak here - pointer in packed struct - * is undetected by kmemleak tool - */ - kmemleak_ignore(usf_xx->encdec_cfg.params); - if (usf_xx->encdec_cfg.params == NULL) { - pr_err("%s: params memory alloc[%d] failure\n", - __func__, - config->params_data_size); - return -ENOMEM; - } - rc = copy_from_user(usf_xx->encdec_cfg.params, - (uint8_t __user *)config->params_data, - config->params_data_size); - if (rc) { - pr_err("%s: transparent data copy failure\n", - __func__); - kfree(usf_xx->encdec_cfg.params); - usf_xx->encdec_cfg.params = NULL; - return -EFAULT; - } - pr_debug("%s: params_size[%d]; params[%d,%d,%d,%d, %d]\n", - __func__, - config->params_data_size, - usf_xx->encdec_cfg.params[0], - usf_xx->encdec_cfg.params[1], - usf_xx->encdec_cfg.params[2], - usf_xx->encdec_cfg.params[3], - usf_xx->encdec_cfg.params[4] - ); - } - - usf_xx->usc = q6usm_us_client_alloc(usf_xx->cb, (void *)usf_xx); - if (!usf_xx->usc) { - pr_err("%s: Could not allocate q6usm client\n", __func__); - rc = -EFAULT; - } - - return rc; -} - -static bool usf_match(uint16_t event_type_ind, struct input_dev *dev) -{ - bool rc = false; - - rc = (event_type_ind < MAX_EVENT_TYPE_NUM) && - ((dev->name == NULL) || - strcmp(dev->name, USF_NAME_PREFIX)); - pr_debug("%s: name=[%s]; rc=%d\n", - __func__, dev->name, rc); - - return rc; -} - -static bool usf_register_conflicting_events(uint16_t event_types) -{ - bool rc = true; - uint16_t ind = 0; - uint16_t mask = 1; - - for (ind = 0; ind < MAX_EVENT_TYPE_NUM; ++ind) { - if (event_types & mask) { - rc = usfcdev_register(ind, usf_match); - if (!rc) - break; - } - mask = mask << 1; - } - - return rc; -} - -static void usf_unregister_conflicting_events(uint16_t event_types) -{ - uint16_t ind = 0; - uint16_t mask = 1; - - for (ind = 0; ind < MAX_EVENT_TYPE_NUM; ++ind) { - if (event_types & mask) - usfcdev_unregister(ind); - mask = mask << 1; - } -} - -static void usf_set_event_filters(struct usf_type *usf, uint16_t event_filters) -{ - uint16_t ind = 0; - uint16_t mask = 1; - - if (usf->conflicting_event_filters != event_filters) { - for (ind = 0; ind < MAX_EVENT_TYPE_NUM; ++ind) { - if (usf->conflicting_event_types & mask) - usfcdev_set_filter(ind, event_filters&mask); - mask = mask << 1; - } - usf->conflicting_event_filters = event_filters; - } -} - -static int register_input_device(struct usf_type *usf_info, - struct us_input_info_type *input_info) -{ - int rc = 0; - bool ret = true; - uint16_t ind = 0; - - if ((usf_info == NULL) || - (input_info == NULL) || - !(input_info->event_types & USF_ALL_EVENTS)) { - pr_err("%s: wrong input parameter(s)\n", __func__); - return -EINVAL; - } - - for (ind = 0; ind < USF_MAX_EVENT_IND; ++ind) { - if (usf_info->input_ifs[ind] != NULL) { - pr_err("%s: input_if[%d] is already allocated\n", - __func__, ind); - return -EFAULT; - } - if ((input_info->event_types & - s_usf_input_devs[ind].event_type) && - s_usf_input_devs[ind].prepare_dev) { - rc = (*s_usf_input_devs[ind].prepare_dev)( - ind, - usf_info, - input_info, - s_usf_input_devs[ind].input_dev_name); - if (rc) - return rc; - - rc = input_register_device(usf_info->input_ifs[ind]); - if (rc) { - pr_err("%s: input_reg_dev() failed; rc=%d\n", - __func__, rc); - input_free_device(usf_info->input_ifs[ind]); - usf_info->input_ifs[ind] = NULL; - } else { - usf_info->event_types |= - s_usf_input_devs[ind].event_type; - pr_debug("%s: input device[%s] was registered\n", - __func__, - s_usf_input_devs[ind].input_dev_name); - } - } /* supported event */ - } /* event types loop */ - - ret = usf_register_conflicting_events( - input_info->conflicting_event_types); - if (ret) - usf_info->conflicting_event_types = - input_info->conflicting_event_types; - - return 0; -} - - -static void handle_input_event(struct usf_type *usf_info, - uint16_t event_counter, - struct usf_event_type __user *event) -{ - uint16_t ind = 0; - uint16_t events_num = 0; - struct usf_event_type usf_events[USF_EVENTS_PORTION_SIZE]; - int rc = 0; - - if ((usf_info == NULL) || - (event == NULL) || (!event_counter)) { - return; - } - - while (event_counter > 0) { - if (event_counter > USF_EVENTS_PORTION_SIZE) { - events_num = USF_EVENTS_PORTION_SIZE; - event_counter -= USF_EVENTS_PORTION_SIZE; - } else { - events_num = event_counter; - event_counter = 0; - } - rc = copy_from_user(usf_events, - (struct usf_event_type __user *)event, - events_num * sizeof(struct usf_event_type)); - if (rc) { - pr_err("%s: copy upd_rx_info from user; rc=%d\n", - __func__, rc); - return; - } - for (ind = 0; ind < events_num; ++ind) { - struct usf_event_type *p_event = &usf_events[ind]; - uint16_t if_ind = p_event->event_type_ind; - - if ((if_ind >= USF_MAX_EVENT_IND) || - (usf_info->input_ifs[if_ind] == NULL)) - continue; /* event isn't supported */ - - if (s_usf_input_devs[if_ind].notify_event) - (*s_usf_input_devs[if_ind].notify_event)( - usf_info, - if_ind, - p_event); - } /* loop in the portion */ - } /* all events loop */ -} - -static int usf_start_tx(struct usf_xx_type *usf_xx) -{ - int rc = q6usm_run(usf_xx->usc, 0, 0, 0); - - pr_debug("%s: tx: q6usm_run; rc=%d\n", __func__, rc); - if (!rc) { - if (usf_xx->buffer_count >= USM_MIN_BUF_CNT) { - /* supply all buffers */ - rc = q6usm_read(usf_xx->usc, - usf_xx->buffer_count); - pr_debug("%s: q6usm_read[%d]\n", - __func__, rc); - - if (rc) - pr_err("%s: buf read failed", - __func__); - else - usf_xx->usf_state = - USF_WORK_STATE; - } else - usf_xx->usf_state = - USF_WORK_STATE; - } - - return rc; -} /* usf_start_tx */ - -static int usf_start_rx(struct usf_xx_type *usf_xx) -{ - int rc = q6usm_run(usf_xx->usc, 0, 0, 0); - - pr_debug("%s: rx: q6usm_run; rc=%d\n", - __func__, rc); - if (!rc) - usf_xx->usf_state = USF_WORK_STATE; - - return rc; -} /* usf_start_rx */ - -static int __usf_set_us_detection(struct usf_type *usf, - struct us_detect_info_type *detect_info) -{ - uint32_t timeout = 0; - struct usm_session_cmd_detect_info *p_allocated_memory = NULL; - struct usm_session_cmd_detect_info usm_detect_info; - struct usm_session_cmd_detect_info *p_usm_detect_info = - &usm_detect_info; - uint32_t detect_info_size = sizeof(struct usm_session_cmd_detect_info); - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - if (detect_info->us_detector != US_DETECT_FW) { - pr_err("%s: unsupported detector: %d\n", - __func__, detect_info->us_detector); - return -EINVAL; - } - - if ((detect_info->params_data_size != 0) && - (detect_info->params_data != NULL)) { - uint8_t *p_data = NULL; - - detect_info_size += detect_info->params_data_size; - p_allocated_memory = kzalloc(detect_info_size, GFP_KERNEL); - if (p_allocated_memory == NULL) { - pr_err("%s: detect_info[%d] allocation failed\n", - __func__, detect_info_size); - return -ENOMEM; - } - p_usm_detect_info = p_allocated_memory; - p_data = (uint8_t *)p_usm_detect_info + - sizeof(struct usm_session_cmd_detect_info); - - rc = copy_from_user(p_data, - (uint8_t __user *)(detect_info->params_data), - detect_info->params_data_size); - if (rc) { - pr_err("%s: copy params from user; rc=%d\n", - __func__, rc); - kfree(p_allocated_memory); - return -EFAULT; - } - p_usm_detect_info->algorithm_cfg_size = - detect_info->params_data_size; - } else - usm_detect_info.algorithm_cfg_size = 0; - - p_usm_detect_info->detect_mode = detect_info->us_detect_mode; - p_usm_detect_info->skip_interval = detect_info->skip_time; - - usf_xx->us_detect_type = USF_US_DETECT_UNDEF; - - rc = q6usm_set_us_detection(usf_xx->usc, - p_usm_detect_info, - detect_info_size); - if (rc || (detect_info->detect_timeout == USF_NO_WAIT_TIMEOUT)) { - kfree(p_allocated_memory); - return rc; - } - - /* Get US detection result */ - if (detect_info->detect_timeout == USF_INFINITIVE_TIMEOUT) { - rc = wait_event_interruptible(usf_xx->wait, - (usf_xx->us_detect_type != - USF_US_DETECT_UNDEF) || - (usf_xx->usf_state == - USF_ADSP_RESTART_STATE)); - } else { - if (detect_info->detect_timeout == USF_DEFAULT_TIMEOUT) - timeout = USF_TIMEOUT_JIFFIES; - else - timeout = detect_info->detect_timeout * HZ; - } - rc = wait_event_interruptible_timeout(usf_xx->wait, - (usf_xx->us_detect_type != - USF_US_DETECT_UNDEF) || - (usf_xx->usf_state == - USF_ADSP_RESTART_STATE), timeout); - - /* In the case of aDSP restart, "no US" is assumed */ - if (usf_xx->usf_state == USF_ADSP_RESTART_STATE) - rc = -EFAULT; - - /* In the case of timeout, "no US" is assumed */ - if (rc < 0) - pr_err("%s: Getting US detection failed rc[%d]\n", - __func__, rc); - else { - usf->usf_rx.us_detect_type = usf->usf_tx.us_detect_type; - detect_info->is_us = - (usf_xx->us_detect_type == USF_US_DETECT_YES); - } - - kfree(p_allocated_memory); - - return rc; -} /* __usf_set_us_detection */ - -static int usf_set_us_detection(struct usf_type *usf, unsigned long arg) -{ - struct us_detect_info_type detect_info; - - int rc = copy_from_user(&detect_info, - (struct us_detect_info_type __user *) arg, - sizeof(detect_info)); - - if (rc) { - pr_err("%s: copy detect_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (detect_info.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - rc = __usf_set_us_detection(usf, &detect_info); - if (rc < 0) { - pr_err("%s: set us detection failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &detect_info, - sizeof(detect_info)); - if (rc) { - pr_err("%s: copy detect_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_us_detection */ - -static int __usf_set_tx_info(struct usf_type *usf, - struct us_tx_info_type *config_tx) -{ - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - usf_xx->new_region = USM_UNDEF_TOKEN; - usf_xx->prev_region = USM_UNDEF_TOKEN; - usf_xx->cb = usf_tx_cb; - - init_waitqueue_head(&usf_xx->wait); - - if (config_tx->us_xx_info.client_name != NULL) { - int res = strncpy_from_user( - usf_xx->client_name, - (char __user *)(config_tx->us_xx_info.client_name), - sizeof(usf_xx->client_name)-1); - if (res < 0) { - pr_err("%s: get client name failed\n", - __func__); - return -EINVAL; - } - } - - rc = config_xx(usf_xx, &(config_tx->us_xx_info)); - if (rc) - return rc; - - rc = q6usm_open_read(usf_xx->usc, - usf_xx->encdec_cfg.format_id); - if (rc) - return rc; - - rc = q6usm_us_client_buf_alloc(OUT, usf_xx->usc, - usf_xx->buffer_size, - usf_xx->buffer_count); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_us_param_buf_alloc(OUT, usf_xx->usc, - config_tx->us_xx_info.max_get_set_param_buf_size); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_enc_cfg_blk(usf_xx->usc, - &usf_xx->encdec_cfg); - if (!rc && - (config_tx->input_info.event_types != USF_NO_EVENT)) { - rc = register_input_device(usf, - &(config_tx->input_info)); - } - - if (rc) - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - else - usf_xx->usf_state = USF_CONFIGURED_STATE; - - return rc; -} /* __usf_set_tx_info */ - -static int usf_set_tx_info(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_info_type config_tx; - - int rc = copy_from_user(&config_tx, - (struct us_tx_info_type __user *) arg, - sizeof(config_tx)); - - if (rc) { - pr_err("%s: copy config_tx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (config_tx.us_xx_info.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - return __usf_set_tx_info(usf, &config_tx); -} /* usf_set_tx_info */ - -static int __usf_set_rx_info(struct usf_type *usf, - struct us_rx_info_type *config_rx) -{ - struct usf_xx_type *usf_xx = &usf->usf_rx; - int rc = 0; - - usf_xx->new_region = USM_UNDEF_TOKEN; - usf_xx->prev_region = USM_UNDEF_TOKEN; - - usf_xx->cb = usf_rx_cb; - - rc = config_xx(usf_xx, &(config_rx->us_xx_info)); - if (rc) - return rc; - - rc = q6usm_open_write(usf_xx->usc, - usf_xx->encdec_cfg.format_id); - if (rc) - return rc; - - rc = q6usm_us_client_buf_alloc( - IN, - usf_xx->usc, - usf_xx->buffer_size, - usf_xx->buffer_count); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_us_param_buf_alloc(IN, usf_xx->usc, - config_rx->us_xx_info.max_get_set_param_buf_size); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_dec_cfg_blk(usf_xx->usc, - &usf_xx->encdec_cfg); - if (rc) - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - else { - init_waitqueue_head(&usf_xx->wait); - usf_xx->usf_state = USF_CONFIGURED_STATE; - } - - return rc; -} /* __usf_set_rx_info */ - -static int usf_set_rx_info(struct usf_type *usf, unsigned long arg) -{ - struct us_rx_info_type config_rx; - - int rc = copy_from_user(&config_rx, - (struct us_rx_info_type __user *) arg, - sizeof(config_rx)); - - if (rc) { - pr_err("%s: copy config_rx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (config_rx.us_xx_info.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - return __usf_set_rx_info(usf, &config_rx); -} /* usf_set_rx_info */ - -static int __usf_get_tx_update(struct usf_type *usf, - struct us_tx_update_info_type *upd_tx_info) -{ - unsigned long prev_jiffies = 0; - uint32_t timeout = 0; - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - if (!usf_xx->user_upd_info_na) { - usf_set_event_filters(usf, upd_tx_info->event_filters); - handle_input_event(usf, - upd_tx_info->event_counter, - upd_tx_info->event); - - /* Release available regions */ - rc = q6usm_read(usf_xx->usc, - upd_tx_info->free_region); - if (rc) - return rc; - } else - usf_xx->user_upd_info_na = 0; - - /* Get data ready regions */ - if (upd_tx_info->timeout == USF_INFINITIVE_TIMEOUT) { - rc = wait_event_interruptible(usf_xx->wait, - (usf_xx->prev_region != - usf_xx->new_region) || - (usf_xx->usf_state != - USF_WORK_STATE)); - } else { - if (upd_tx_info->timeout == USF_NO_WAIT_TIMEOUT) - rc = (usf_xx->prev_region != usf_xx->new_region); - else { - prev_jiffies = jiffies; - if (upd_tx_info->timeout == USF_DEFAULT_TIMEOUT) { - timeout = USF_TIMEOUT_JIFFIES; - rc = wait_event_timeout( - usf_xx->wait, - (usf_xx->prev_region != - usf_xx->new_region) || - (usf_xx->usf_state != - USF_WORK_STATE), - timeout); - } else { - timeout = upd_tx_info->timeout * HZ; - rc = wait_event_interruptible_timeout( - usf_xx->wait, - (usf_xx->prev_region != - usf_xx->new_region) || - (usf_xx->usf_state != - USF_WORK_STATE), - timeout); - } - } - if (!rc) { - pr_debug("%s: timeout. prev_j=%lu; j=%lu\n", - __func__, prev_jiffies, jiffies); - pr_debug("%s: timeout. prev=%d; new=%d\n", - __func__, usf_xx->prev_region, - usf_xx->new_region); - pr_debug("%s: timeout. free_region=%d;\n", - __func__, upd_tx_info->free_region); - if (usf_xx->prev_region == - usf_xx->new_region) { - pr_err("%s:read data: timeout\n", - __func__); - return -ETIME; - } - } - } - - if ((usf_xx->usf_state != USF_WORK_STATE) || - (rc == -ERESTARTSYS)) { - pr_err("%s: Get ready region failure; state[%d]; rc[%d]\n", - __func__, usf_xx->usf_state, rc); - return -EINTR; - } - - upd_tx_info->ready_region = usf_xx->new_region; - usf_xx->prev_region = upd_tx_info->ready_region; - - if (upd_tx_info->ready_region == USM_WRONG_TOKEN) { - pr_err("%s: TX path corrupted; prev=%d\n", - __func__, usf_xx->prev_region); - return -EIO; - } - - return rc; -} /* __usf_get_tx_update */ - -static int usf_get_tx_update(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_update_info_type upd_tx_info; - - int rc = copy_from_user(&upd_tx_info, - (struct us_tx_update_info_type __user *) arg, - sizeof(upd_tx_info)); - - if (rc < 0) { - pr_err("%s: copy upd_tx_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = __usf_get_tx_update(usf, &upd_tx_info); - if (rc < 0) { - pr_err("%s: get tx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &upd_tx_info, - sizeof(upd_tx_info)); - if (rc) { - pr_err("%s: copy upd_tx_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_tx_update */ - -static int __usf_set_rx_update(struct usf_xx_type *usf_xx, - struct us_rx_update_info_type *upd_rx_info) -{ - int rc = 0; - - /* Send available data regions */ - if (upd_rx_info->ready_region != - usf_xx->buffer_count) { - rc = q6usm_write( - usf_xx->usc, - upd_rx_info->ready_region); - if (rc) - return rc; - } - - /* Get free regions */ - rc = wait_event_timeout( - usf_xx->wait, - !q6usm_is_write_buf_full( - usf_xx->usc, - &(upd_rx_info->free_region)) || - (usf_xx->usf_state == USF_IDLE_STATE), - USF_TIMEOUT_JIFFIES); - - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. wait for write buf not full\n", - __func__); - } else { - if (usf_xx->usf_state != - USF_WORK_STATE) { - pr_err("%s: RX: state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EINTR; - } - } - - return rc; -} /* __usf_set_rx_update */ - -static int usf_set_rx_update(struct usf_xx_type *usf_xx, unsigned long arg) -{ - struct us_rx_update_info_type upd_rx_info; - - int rc = copy_from_user(&upd_rx_info, - (struct us_rx_update_info_type __user *) arg, - sizeof(upd_rx_info)); - - if (rc) { - pr_err("%s: copy upd_rx_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = __usf_set_rx_update(usf_xx, &upd_rx_info); - if (rc < 0) { - pr_err("%s: set rx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &upd_rx_info, - sizeof(upd_rx_info)); - if (rc) { - pr_err("%s: copy rx_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_rx_update */ - -static void usf_release_input(struct usf_type *usf) -{ - uint16_t ind = 0; - - usf_unregister_conflicting_events( - usf->conflicting_event_types); - usf->conflicting_event_types = 0; - for (ind = 0; ind < USF_MAX_EVENT_IND; ++ind) { - if (usf->input_ifs[ind] == NULL) - continue; - input_unregister_device(usf->input_ifs[ind]); - usf->input_ifs[ind] = NULL; - pr_debug("%s input_unregister_device[%s]\n", - __func__, - s_usf_input_devs[ind].input_dev_name); - } -} /* usf_release_input */ - -static int usf_stop_tx(struct usf_type *usf) -{ - struct usf_xx_type *usf_xx = &usf->usf_tx; - - usf_release_input(usf); - usf_disable(usf_xx); - - return 0; -} /* usf_stop_tx */ - -static int __usf_get_version(struct us_version_info_type *version_info) -{ - int rc = 0; - - if (version_info->buf_size < sizeof(DRV_VERSION)) { - pr_err("%s: buf_size (%d) < version string size (%zu)\n", - __func__, version_info->buf_size, sizeof(DRV_VERSION)); - return -EINVAL; - } - - rc = copy_to_user((void __user *)(version_info->pbuf), - DRV_VERSION, - sizeof(DRV_VERSION)); - if (rc) { - pr_err("%s: copy to version_info.pbuf; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* __usf_get_version */ - -static int usf_get_version(unsigned long arg) -{ - struct us_version_info_type version_info; - - int rc = copy_from_user(&version_info, - (struct us_version_info_type __user *) arg, - sizeof(version_info)); - - if (rc) { - pr_err("%s: copy version_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = __usf_get_version(&version_info); - if (rc < 0) { - pr_err("%s: get version failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &version_info, - sizeof(version_info)); - if (rc) { - pr_err("%s: copy version_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_version */ - -static int __usf_set_stream_param(struct usf_xx_type *usf_xx, - struct us_stream_param_type *set_stream_param, - int dir) -{ - struct us_client *usc = usf_xx->usc; - struct us_port_data *port; - int rc = 0; - - if (usc == NULL) { - pr_err("%s: usc is null\n", - __func__); - return -EFAULT; - } - - port = &usc->port[dir]; - if (port == NULL) { - pr_err("%s: port is null\n", - __func__); - return -EFAULT; - } - - if (port->param_buf == NULL) { - pr_err("%s: parameter buffer is null\n", - __func__); - return -EFAULT; - } - - if (set_stream_param->buf_size > port->param_buf_size) { - pr_err("%s: buf_size (%d) > maximum buf size (%d)\n", - __func__, set_stream_param->buf_size, - port->param_buf_size); - return -EINVAL; - } - - if (set_stream_param->buf_size == 0) { - pr_err("%s: buf_size is 0\n", __func__); - return -EINVAL; - } - - rc = copy_from_user(port->param_buf, - (uint8_t __user *) set_stream_param->pbuf, - set_stream_param->buf_size); - if (rc) { - pr_err("%s: copy param buf from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = q6usm_set_us_stream_param(dir, usc, set_stream_param->module_id, - set_stream_param->param_id, - set_stream_param->buf_size); - if (rc) { - pr_err("%s: q6usm_set_us_stream_param failed; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return rc; -} - -static int usf_set_stream_param(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type set_stream_param; - int rc = 0; - - rc = copy_from_user(&set_stream_param, - (struct us_stream_param_type __user *) arg, - sizeof(set_stream_param)); - - if (rc) { - pr_err("%s: copy set_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return __usf_set_stream_param(usf_xx, &set_stream_param, dir); -} /* usf_set_stream_param */ - -static int __usf_get_stream_param(struct usf_xx_type *usf_xx, - struct us_stream_param_type *get_stream_param, - int dir) -{ - struct us_client *usc = usf_xx->usc; - struct us_port_data *port; - int rc = 0; - - if (usc == NULL) { - pr_err("%s: us_client is null\n", - __func__); - return -EFAULT; - } - - port = &usc->port[dir]; - - if (port->param_buf == NULL) { - pr_err("%s: parameter buffer is null\n", - __func__); - return -EFAULT; - } - - if (get_stream_param->buf_size > port->param_buf_size) { - pr_err("%s: buf_size (%d) > maximum buf size (%d)\n", - __func__, get_stream_param->buf_size, - port->param_buf_size); - return -EINVAL; - } - - if (get_stream_param->buf_size == 0) { - pr_err("%s: buf_size is 0\n", __func__); - return -EINVAL; - } - - rc = q6usm_get_us_stream_param(dir, usc, get_stream_param->module_id, - get_stream_param->param_id, - get_stream_param->buf_size); - if (rc) { - pr_err("%s: q6usm_get_us_stream_param failed; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = copy_to_user((uint8_t __user *) get_stream_param->pbuf, - port->param_buf, - get_stream_param->buf_size); - if (rc) { - pr_err("%s: copy param buf to user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return rc; -} - -static int usf_get_stream_param(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type get_stream_param; - int rc = 0; - - rc = copy_from_user(&get_stream_param, - (struct us_stream_param_type __user *) arg, - sizeof(get_stream_param)); - - if (rc) { - pr_err("%s: copy get_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return __usf_get_stream_param(usf_xx, &get_stream_param, dir); -} /* usf_get_stream_param */ - -static long __usf_ioctl(struct usf_type *usf, - unsigned int cmd, - unsigned long arg) -{ - - int rc = 0; - struct usf_xx_type *usf_xx = NULL; - - switch (cmd) { - case US_START_TX: { - usf_xx = &usf->usf_tx; - if (usf_xx->usf_state == USF_CONFIGURED_STATE) - rc = usf_start_tx(usf_xx); - else { - pr_err("%s: start_tx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } - - case US_START_RX: { - usf_xx = &usf->usf_rx; - if (usf_xx->usf_state == USF_CONFIGURED_STATE) - rc = usf_start_rx(usf_xx); - else { - pr_err("%s: start_rx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } - - case US_SET_TX_INFO: { - usf_xx = &usf->usf_tx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_tx_info(usf, arg); - else { - pr_err("%s: set_tx_info: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_TX_INFO */ - - case US_SET_RX_INFO: { - usf_xx = &usf->usf_rx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_rx_info(usf, arg); - else { - pr_err("%s: set_rx_info: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_RX_INFO */ - - case US_GET_TX_UPDATE: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_get_tx_update(usf, arg); - else { - pr_err("%s: get_tx_update: wrong state[%d]\n", __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_GET_TX_UPDATE */ - - case US_SET_RX_UPDATE: { - struct usf_xx_type *usf_xx = &usf->usf_rx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_rx_update(usf_xx, arg); - else { - pr_err("%s: set_rx_update: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_RX_UPDATE */ - - case US_STOP_TX: { - usf_xx = &usf->usf_tx; - if ((usf_xx->usf_state == USF_WORK_STATE) - || (usf_xx->usf_state == USF_ADSP_RESTART_STATE)) - rc = usf_stop_tx(usf); - else { - pr_err("%s: stop_tx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } /* US_STOP_TX */ - - case US_STOP_RX: { - usf_xx = &usf->usf_rx; - if ((usf_xx->usf_state == USF_WORK_STATE) - || (usf_xx->usf_state == USF_ADSP_RESTART_STATE)) - usf_disable(usf_xx); - else { - pr_err("%s: stop_rx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } /* US_STOP_RX */ - - case US_SET_DETECTION: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_us_detection(usf, arg); - else { - pr_err("%s: set us detection: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_DETECTION */ - - case US_GET_VERSION: { - rc = usf_get_version(arg); - break; - } /* US_GET_VERSION */ - - case US_SET_TX_STREAM_PARAM: { - rc = usf_set_stream_param(&usf->usf_tx, arg, OUT); - break; - } /* US_SET_TX_STREAM_PARAM */ - - case US_GET_TX_STREAM_PARAM: { - rc = usf_get_stream_param(&usf->usf_tx, arg, OUT); - break; - } /* US_GET_TX_STREAM_PARAM */ - - case US_SET_RX_STREAM_PARAM: { - rc = usf_set_stream_param(&usf->usf_rx, arg, IN); - break; - } /* US_SET_RX_STREAM_PARAM */ - - case US_GET_RX_STREAM_PARAM: { - rc = usf_get_stream_param(&usf->usf_rx, arg, IN); - break; - } /* US_GET_RX_STREAM_PARAM */ - - default: - pr_err("%s: unsupported IOCTL command [%d]\n", - __func__, - cmd); - rc = -ENOTTY; - break; - } - - if (rc && - ((cmd == US_SET_TX_INFO) || - (cmd == US_SET_RX_INFO))) - release_xx(usf_xx); - - return rc; -} /* __usf_ioctl */ - -static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct usf_type *usf = file->private_data; - int rc = 0; - - mutex_lock(&usf->mutex); - rc = __usf_ioctl(usf, cmd, arg); - mutex_unlock(&usf->mutex); - - return rc; -} /* usf_ioctl */ - -#ifdef CONFIG_COMPAT - -#define US_SET_TX_INFO32 _IOW(USF_IOCTL_MAGIC, 0, \ - struct us_tx_info_type32) -#define US_GET_TX_UPDATE32 _IOWR(USF_IOCTL_MAGIC, 2, \ - struct us_tx_update_info_type32) -#define US_SET_RX_INFO32 _IOW(USF_IOCTL_MAGIC, 3, \ - struct us_rx_info_type32) -#define US_SET_RX_UPDATE32 _IOWR(USF_IOCTL_MAGIC, 4, \ - struct us_rx_update_info_type32) -#define US_SET_DETECTION32 _IOWR(USF_IOCTL_MAGIC, 8, \ - struct us_detect_info_type32) -#define US_GET_VERSION32 _IOWR(USF_IOCTL_MAGIC, 9, \ - struct us_version_info_type32) -#define US_SET_TX_STREAM_PARAM32 _IOW(USF_IOCTL_MAGIC, 10, \ - struct us_stream_param_type32) -#define US_GET_TX_STREAM_PARAM32 _IOWR(USF_IOCTL_MAGIC, 11, \ - struct us_stream_param_type32) -#define US_SET_RX_STREAM_PARAM32 _IOW(USF_IOCTL_MAGIC, 12, \ - struct us_stream_param_type32) -#define US_GET_RX_STREAM_PARAM32 _IOWR(USF_IOCTL_MAGIC, 13, \ - struct us_stream_param_type32) - -/* Info structure common for TX and RX */ -struct us_xx_info_type32 { -/* Input: general info */ -/* Name of the client - event calculator, ptr to char */ - const compat_uptr_t client_name; -/* Selected device identification, accepted in the kernel's CAD */ - uint32_t dev_id; -/* 0 - point_epos type; (e.g. 1 - gr_mmrd) */ - uint32_t stream_format; -/* Required sample rate in Hz */ - uint32_t sample_rate; -/* Size of a buffer (bytes) for US data transfer between the module and USF */ - uint32_t buf_size; -/* Number of the buffers for the US data transfer */ - uint16_t buf_num; -/* Number of the microphones (TX) or speakers(RX) */ - uint16_t port_cnt; -/* Microphones(TX) or speakers(RX) indexes in their enumeration */ - uint8_t port_id[USF_MAX_PORT_NUM]; -/* Bits per sample 16 or 32 */ - uint16_t bits_per_sample; -/* Input: Transparent info for encoder in the LPASS */ -/* Parameters data size in bytes */ - uint16_t params_data_size; -/* Pointer to the parameters, ptr to uint8_t */ - compat_uptr_t params_data; -/* Max size of buffer for get and set parameter */ - uint32_t max_get_set_param_buf_size; -}; - -struct us_tx_info_type32 { -/* Common info. This struct includes ptr and therefore the 32 version */ - struct us_xx_info_type32 us_xx_info; -/* Info specific for TX. This struct doesn't include long or ptr - * and therefore no 32 version - */ - struct us_input_info_type input_info; -}; - -struct us_tx_update_info_type32 { -/* Input general: */ -/* Number of calculated events */ - uint16_t event_counter; -/* Calculated events or NULL, ptr to struct usf_event_type */ - compat_uptr_t event; -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -/* Time (sec) to wait for data or special values: */ -/* USF_NO_WAIT_TIMEOUT, USF_INFINITIVE_TIMEOUT, USF_DEFAULT_TIMEOUT */ - uint32_t timeout; -/* Events (from conflicting devs) to be disabled/enabled */ - uint16_t event_filters; - -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* Pointer to the parameters, ptr to uint8_t */ - compat_uptr_t params_data; -/* Output parameters: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -}; - -struct us_rx_info_type32 { - /* Common info */ - struct us_xx_info_type32 us_xx_info; - /* Info specific for RX*/ -}; - -struct us_rx_update_info_type32 { -/* Input general: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* pPointer to the parameters, ptr to uint8_t */ - compat_uptr_t params_data; -/* Output parameters: */ -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -}; - -struct us_detect_info_type32 { -/* US detection place (HW|FW) */ -/* NA in the Active and OFF states */ - enum us_detect_place_enum us_detector; -/* US detection mode */ - enum us_detect_mode_enum us_detect_mode; -/* US data dropped during this time (msec) */ - uint32_t skip_time; -/* Transparent data size */ - uint16_t params_data_size; -/* Pointer to the transparent data, ptr to uint8_t */ - compat_uptr_t params_data; -/* Time (sec) to wait for US presence event */ - uint32_t detect_timeout; -/* Out parameter: US presence */ - bool is_us; -}; - -struct us_version_info_type32 { -/* Size of memory for the version string */ - uint16_t buf_size; -/* Pointer to the memory for the version string, ptr to char */ - compat_uptr_t pbuf; -}; - -struct us_stream_param_type32 { -/* Id of module */ - uint32_t module_id; -/* Id of parameter */ - uint32_t param_id; -/* Size of memory of the parameter buffer */ - uint32_t buf_size; -/* Pointer to the memory of the parameter buffer */ - compat_uptr_t pbuf; -}; - -static void usf_compat_xx_info_type(struct us_xx_info_type32 *us_xx_info32, - struct us_xx_info_type *us_xx_info) -{ - int i = 0; - - us_xx_info->client_name = compat_ptr(us_xx_info32->client_name); - us_xx_info->dev_id = us_xx_info32->dev_id; - us_xx_info->stream_format = us_xx_info32->stream_format; - us_xx_info->sample_rate = us_xx_info32->sample_rate; - us_xx_info->buf_size = us_xx_info32->buf_size; - us_xx_info->buf_num = us_xx_info32->buf_num; - us_xx_info->port_cnt = us_xx_info32->port_cnt; - for (i = 0; i < USF_MAX_PORT_NUM; i++) - us_xx_info->port_id[i] = us_xx_info32->port_id[i]; - us_xx_info->bits_per_sample = us_xx_info32->bits_per_sample; - us_xx_info->params_data_size = us_xx_info32->params_data_size; - us_xx_info->params_data = compat_ptr(us_xx_info32->params_data); - us_xx_info->max_get_set_param_buf_size = - us_xx_info32->max_get_set_param_buf_size; -} - -static int usf_set_tx_info32(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_info_type32 config_tx32; - struct us_tx_info_type config_tx; - - int rc = copy_from_user(&config_tx32, - (struct us_tx_info_type32 __user *) arg, - sizeof(config_tx32)); - - if (rc) { - pr_err("%s: copy config_tx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - memset(&config_tx, 0, sizeof(config_tx)); - usf_compat_xx_info_type(&(config_tx32.us_xx_info), - &(config_tx.us_xx_info)); - config_tx.input_info = config_tx32.input_info; - - return __usf_set_tx_info(usf, &config_tx); -} /* usf_set_tx_info 32*/ - -static int usf_set_rx_info32(struct usf_type *usf, unsigned long arg) -{ - struct us_rx_info_type32 config_rx32; - struct us_rx_info_type config_rx; - - int rc = copy_from_user(&config_rx32, - (struct us_rx_info_type32 __user *) arg, - sizeof(config_rx32)); - - if (rc) { - pr_err("%s: copy config_rx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - memset(&config_rx, 0, sizeof(config_rx)); - usf_compat_xx_info_type(&(config_rx32.us_xx_info), - &(config_rx.us_xx_info)); - - return __usf_set_rx_info(usf, &config_rx); -} /* usf_set_rx_info32 */ - -static int usf_get_tx_update32(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_update_info_type32 upd_tx_info32; - struct us_tx_update_info_type upd_tx_info; - - int rc = copy_from_user(&upd_tx_info32, - (struct us_tx_update_info_type32 __user *) arg, - sizeof(upd_tx_info32)); - - if (rc) { - pr_err("%s: copy upd_tx_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&upd_tx_info, 0, sizeof(upd_tx_info)); - upd_tx_info.event_counter = upd_tx_info32.event_counter; - upd_tx_info.event = compat_ptr(upd_tx_info32.event); - upd_tx_info.free_region = upd_tx_info32.free_region; - upd_tx_info.timeout = upd_tx_info32.timeout; - upd_tx_info.event_filters = upd_tx_info32.event_filters; - upd_tx_info.params_data_size = upd_tx_info32.params_data_size; - upd_tx_info.params_data = compat_ptr(upd_tx_info32.params_data); - upd_tx_info.ready_region = upd_tx_info32.ready_region; - - rc = __usf_get_tx_update(usf, &upd_tx_info); - if (rc < 0) { - pr_err("%s: get tx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* Update only the fields that were changed */ - upd_tx_info32.ready_region = upd_tx_info.ready_region; - - rc = copy_to_user((void __user *)arg, &upd_tx_info32, - sizeof(upd_tx_info32)); - if (rc) { - pr_err("%s: copy upd_tx_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_tx_update */ - -static int usf_set_rx_update32(struct usf_xx_type *usf_xx, unsigned long arg) -{ - struct us_rx_update_info_type32 upd_rx_info32; - struct us_rx_update_info_type upd_rx_info; - - int rc = copy_from_user(&upd_rx_info32, - (struct us_rx_update_info_type32 __user *) arg, - sizeof(upd_rx_info32)); - - if (rc) { - pr_err("%s: copy upd_rx_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&upd_rx_info, 0, sizeof(upd_rx_info)); - upd_rx_info.ready_region = upd_rx_info32.ready_region; - upd_rx_info.params_data_size = upd_rx_info32.params_data_size; - upd_rx_info.params_data = compat_ptr(upd_rx_info32.params_data); - upd_rx_info.free_region = upd_rx_info32.free_region; - - rc = __usf_set_rx_update(usf_xx, &upd_rx_info); - if (rc < 0) { - pr_err("%s: set rx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* Update only the fields that were changed */ - upd_rx_info32.free_region = upd_rx_info.free_region; - - rc = copy_to_user((void __user *)arg, - &upd_rx_info32, - sizeof(upd_rx_info32)); - if (rc) { - pr_err("%s: copy rx_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_rx_update32 */ - -static int usf_set_us_detection32(struct usf_type *usf, unsigned long arg) -{ - struct us_detect_info_type32 detect_info32; - struct us_detect_info_type detect_info; - - int rc = copy_from_user(&detect_info32, - (struct us_detect_info_type32 __user *) arg, - sizeof(detect_info32)); - - if (rc) { - pr_err("%s: copy detect_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (detect_info32.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - memset(&detect_info, 0, sizeof(detect_info)); - detect_info.us_detector = detect_info32.us_detector; - detect_info.us_detect_mode = detect_info32.us_detect_mode; - detect_info.skip_time = detect_info32.skip_time; - detect_info.params_data_size = detect_info32.params_data_size; - detect_info.params_data = compat_ptr(detect_info32.params_data); - detect_info.detect_timeout = detect_info32.detect_timeout; - detect_info.is_us = detect_info32.is_us; - - rc = __usf_set_us_detection(usf, &detect_info); - if (rc < 0) { - pr_err("%s: set us detection failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* Update only the fields that were changed */ - detect_info32.is_us = detect_info.is_us; - - rc = copy_to_user((void __user *)arg, - &detect_info32, - sizeof(detect_info32)); - if (rc) { - pr_err("%s: copy detect_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_us_detection32 */ - -static int usf_get_version32(unsigned long arg) -{ - struct us_version_info_type32 version_info32; - struct us_version_info_type version_info; - - int rc = copy_from_user(&version_info32, - (struct us_version_info_type32 __user *) arg, - sizeof(version_info32)); - - if (rc) { - pr_err("%s: copy version_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&version_info, 0, sizeof(version_info)); - version_info.buf_size = version_info32.buf_size; - version_info.pbuf = compat_ptr(version_info32.pbuf); - - rc = __usf_get_version(&version_info); - if (rc < 0) { - pr_err("%s: get version failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* None of the fields were changed */ - - rc = copy_to_user((void __user *)arg, - &version_info32, - sizeof(version_info32)); - if (rc) { - pr_err("%s: copy version_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_version32 */ - -static int usf_set_stream_param32(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type32 set_stream_param32; - struct us_stream_param_type set_stream_param; - int rc = 0; - - rc = copy_from_user(&set_stream_param32, - (struct us_stream_param_type32 __user *) arg, - sizeof(set_stream_param32)); - - if (rc) { - pr_err("%s: copy set_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&set_stream_param, 0, sizeof(set_stream_param)); - set_stream_param.module_id = set_stream_param32.module_id; - set_stream_param.param_id = set_stream_param32.param_id; - set_stream_param.buf_size = set_stream_param32.buf_size; - set_stream_param.pbuf = compat_ptr(set_stream_param32.pbuf); - - return __usf_set_stream_param(usf_xx, &set_stream_param, dir); -} /* usf_set_stream_param32 */ - -static int usf_get_stream_param32(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type32 get_stream_param32; - struct us_stream_param_type get_stream_param; - int rc = 0; - - rc = copy_from_user(&get_stream_param32, - (struct us_stream_param_type32 __user *) arg, - sizeof(get_stream_param32)); - - if (rc) { - pr_err("%s: copy get_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&get_stream_param, 0, sizeof(get_stream_param)); - get_stream_param.module_id = get_stream_param32.module_id; - get_stream_param.param_id = get_stream_param32.param_id; - get_stream_param.buf_size = get_stream_param32.buf_size; - get_stream_param.pbuf = compat_ptr(get_stream_param32.pbuf); - - return __usf_get_stream_param(usf_xx, &get_stream_param, dir); -} /* usf_get_stream_param32 */ - -static long __usf_compat_ioctl(struct usf_type *usf, - unsigned int cmd, - unsigned long arg) -{ - int rc = 0; - struct usf_xx_type *usf_xx = NULL; - - switch (cmd) { - case US_START_TX: - case US_START_RX: - case US_STOP_TX: - case US_STOP_RX: { - return __usf_ioctl(usf, cmd, arg); - } - - case US_SET_TX_INFO32: { - usf_xx = &usf->usf_tx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_tx_info32(usf, arg); - else { - pr_err("%s: set_tx_info32: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_TX_INFO32 */ - - case US_SET_RX_INFO32: { - usf_xx = &usf->usf_rx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_rx_info32(usf, arg); - else { - pr_err("%s: set_rx_info32: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_RX_INFO32 */ - - case US_GET_TX_UPDATE32: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_get_tx_update32(usf, arg); - else { - pr_err("%s: get_tx_update32: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_GET_TX_UPDATE32 */ - - case US_SET_RX_UPDATE32: { - struct usf_xx_type *usf_xx = &usf->usf_rx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_rx_update32(usf_xx, arg); - else { - pr_err("%s: set_rx_update: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_RX_UPDATE32 */ - - case US_SET_DETECTION32: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_us_detection32(usf, arg); - else { - pr_err("%s: set us detection: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_DETECTION32 */ - - case US_GET_VERSION32: { - rc = usf_get_version32(arg); - break; - } /* US_GET_VERSION32 */ - - case US_SET_TX_STREAM_PARAM32: { - rc = usf_set_stream_param32(&usf->usf_tx, arg, OUT); - break; - } /* US_SET_TX_STREAM_PARAM32 */ - - case US_GET_TX_STREAM_PARAM32: { - rc = usf_get_stream_param32(&usf->usf_tx, arg, OUT); - break; - } /* US_GET_TX_STREAM_PARAM32 */ - - case US_SET_RX_STREAM_PARAM32: { - rc = usf_set_stream_param32(&usf->usf_rx, arg, IN); - break; - } /* US_SET_RX_STREAM_PARAM32 */ - - case US_GET_RX_STREAM_PARAM32: { - rc = usf_get_stream_param32(&usf->usf_rx, arg, IN); - break; - } /* US_GET_RX_STREAM_PARAM32 */ - - default: - pr_err("%s: unsupported IOCTL command [%d]\n", - __func__, - cmd); - rc = -ENOTTY; - break; - } - - if (rc && - ((cmd == US_SET_TX_INFO) || - (cmd == US_SET_RX_INFO))) - release_xx(usf_xx); - - return rc; -} /* __usf_compat_ioctl */ - -static long usf_compat_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg) -{ - struct usf_type *usf = file->private_data; - int rc = 0; - - mutex_lock(&usf->mutex); - rc = __usf_compat_ioctl(usf, cmd, arg); - mutex_unlock(&usf->mutex); - - return rc; -} /* usf_compat_ioctl */ -#endif /* CONFIG_COMPAT */ - -static int usf_mmap(struct file *file, struct vm_area_struct *vms) -{ - struct usf_type *usf = file->private_data; - int dir = OUT; - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - mutex_lock(&usf->mutex); - if (vms->vm_flags & USF_VM_WRITE) { /* RX buf mapping */ - dir = IN; - usf_xx = &usf->usf_rx; - } - rc = q6usm_get_virtual_address(dir, usf_xx->usc, vms); - mutex_unlock(&usf->mutex); - - return rc; -} - -static uint16_t add_opened_dev(int minor) -{ - uint16_t ind = 0; - - for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) { - if (minor == atomic_cmpxchg(&s_opened_devs[ind], 0, minor)) { - pr_err("%s: device %d is already opened\n", - __func__, minor); - return USF_UNDEF_DEV_ID; - } else { - pr_debug("%s: device %d is added; ind=%d\n", - __func__, minor, ind); - return ind; - } - } - - pr_err("%s: there is no place for device %d\n", - __func__, minor); - return USF_UNDEF_DEV_ID; -} - -static int usf_open(struct inode *inode, struct file *file) -{ - struct usf_type *usf = NULL; - uint16_t dev_ind = 0; - int minor = MINOR(inode->i_rdev); - - dev_ind = add_opened_dev(minor); - if (dev_ind == USF_UNDEF_DEV_ID) - return -EBUSY; - - usf = kzalloc(sizeof(struct usf_type), GFP_KERNEL); - if (usf == NULL) - return -ENOMEM; - - wakeup_source_init(&usf_wakeup_source, "usf"); - - file->private_data = usf; - usf->dev_ind = dev_ind; - - usf->usf_tx.usf_state = USF_OPENED_STATE; - usf->usf_rx.usf_state = USF_OPENED_STATE; - - usf->usf_tx.us_detect_type = USF_US_DETECT_UNDEF; - usf->usf_rx.us_detect_type = USF_US_DETECT_UNDEF; - - mutex_init(&usf->mutex); - - pr_debug("%s:usf in open\n", __func__); - return 0; -} - -static int usf_release(struct inode *inode, struct file *file) -{ - struct usf_type *usf = file->private_data; - - pr_debug("%s: release entry\n", __func__); - - mutex_lock(&usf->mutex); - usf_release_input(usf); - - usf_disable(&usf->usf_tx); - usf_disable(&usf->usf_rx); - - atomic_set(&s_opened_devs[usf->dev_ind], 0); - - wakeup_source_trash(&usf_wakeup_source); - mutex_unlock(&usf->mutex); - mutex_destroy(&usf->mutex); - kfree(usf); - pr_debug("%s: release exit\n", __func__); - return 0; -} - -extern long usf_compat_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg); - -static const struct file_operations usf_fops = { - .owner = THIS_MODULE, - .open = usf_open, - .release = usf_release, - .unlocked_ioctl = usf_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = usf_compat_ioctl, -#endif /* CONFIG_COMPAT */ - .mmap = usf_mmap, -}; - -static struct miscdevice usf_misc[MAX_DEVS_NUMBER] = { - { - .minor = MISC_DYNAMIC_MINOR, - .name = "usf1", - .fops = &usf_fops, - }, -}; - -static int __init usf_init(void) -{ - int rc = 0; - uint16_t ind = 0; - - pr_debug("%s: USF SW version %s.\n", __func__, DRV_VERSION); - pr_debug("%s: Max %d devs registration\n", __func__, MAX_DEVS_NUMBER); - - for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) { - rc = misc_register(&usf_misc[ind]); - if (rc) { - pr_err("%s: misc_register() failed ind=%d; rc = %d\n", - __func__, ind, rc); - break; - } - } - if (!rc) q6usm_init(); - - return rc; -} -module_init(usf_init); - -static void __exit usf_exit(void) -{ - uint16_t ind = 0; - - for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) - misc_deregister(&usf_misc[ind]); -} -module_exit(usf_exit); -MODULE_DESCRIPTION("Ultrasound framework driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/dsp/usf.h b/techpack/audio/4.0/dsp/usf.h deleted file mode 100644 index b7e516d5920d..000000000000 --- a/techpack/audio/4.0/dsp/usf.h +++ /dev/null @@ -1,290 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. - */ - -#ifndef __USF_H__ -#define __USF_H__ - -#include -#include - -#define USF_IOCTL_MAGIC 'U' - -#define US_SET_TX_INFO _IOW(USF_IOCTL_MAGIC, 0, \ - struct us_tx_info_type) -#define US_START_TX _IO(USF_IOCTL_MAGIC, 1) -#define US_GET_TX_UPDATE _IOWR(USF_IOCTL_MAGIC, 2, \ - struct us_tx_update_info_type) -#define US_SET_RX_INFO _IOW(USF_IOCTL_MAGIC, 3, \ - struct us_rx_info_type) -#define US_SET_RX_UPDATE _IOWR(USF_IOCTL_MAGIC, 4, \ - struct us_rx_update_info_type) -#define US_START_RX _IO(USF_IOCTL_MAGIC, 5) - -#define US_STOP_TX _IO(USF_IOCTL_MAGIC, 6) -#define US_STOP_RX _IO(USF_IOCTL_MAGIC, 7) - -#define US_SET_DETECTION _IOWR(USF_IOCTL_MAGIC, 8, \ - struct us_detect_info_type) - -#define US_GET_VERSION _IOWR(USF_IOCTL_MAGIC, 9, \ - struct us_version_info_type) - -#define US_SET_TX_STREAM_PARAM _IOW(USF_IOCTL_MAGIC, 10, \ - struct us_stream_param_type) -#define US_GET_TX_STREAM_PARAM _IOWR(USF_IOCTL_MAGIC, 11, \ - struct us_stream_param_type) -#define US_SET_RX_STREAM_PARAM _IOW(USF_IOCTL_MAGIC, 12, \ - struct us_stream_param_type) -#define US_GET_RX_STREAM_PARAM _IOWR(USF_IOCTL_MAGIC, 13, \ - struct us_stream_param_type) - -/* Special timeout values */ -#define USF_NO_WAIT_TIMEOUT 0x00000000 -/* Infinitive */ -#define USF_INFINITIVE_TIMEOUT 0xffffffff -/* Default value, used by the driver */ -#define USF_DEFAULT_TIMEOUT 0xfffffffe - -/* US detection place (HW|FW) */ -enum us_detect_place_enum { -/* US is detected in HW */ - US_DETECT_HW, -/* US is detected in FW */ - US_DETECT_FW -}; - -/* US detection mode */ -enum us_detect_mode_enum { -/* US detection is disabled */ - US_DETECT_DISABLED_MODE, -/* US detection is enabled in continue mode */ - US_DETECT_CONTINUE_MODE, -/* US detection is enabled in one shot mode */ - US_DETECT_SHOT_MODE -}; - -/* Encoder (TX), decoder (RX) supported US data formats */ -#define USF_POINT_EPOS_FORMAT 0 -#define USF_RAW_FORMAT 1 - -/* Indexes of event types, produced by the calculators */ -#define USF_TSC_EVENT_IND 0 -#define USF_TSC_PTR_EVENT_IND 1 -#define USF_MOUSE_EVENT_IND 2 -#define USF_KEYBOARD_EVENT_IND 3 -#define USF_TSC_EXT_EVENT_IND 4 -#define USF_MAX_EVENT_IND 5 - -/* Types of events, produced by the calculators */ -#define USF_NO_EVENT 0 -#define USF_TSC_EVENT (1 << USF_TSC_EVENT_IND) -#define USF_TSC_PTR_EVENT (1 << USF_TSC_PTR_EVENT_IND) -#define USF_MOUSE_EVENT (1 << USF_MOUSE_EVENT_IND) -#define USF_KEYBOARD_EVENT (1 << USF_KEYBOARD_EVENT_IND) -#define USF_TSC_EXT_EVENT (1 << USF_TSC_EXT_EVENT_IND) -#define USF_ALL_EVENTS (USF_TSC_EVENT |\ - USF_TSC_PTR_EVENT |\ - USF_MOUSE_EVENT |\ - USF_KEYBOARD_EVENT |\ - USF_TSC_EXT_EVENT) - -/* min, max array dimension */ -#define MIN_MAX_DIM 2 - -/* coordinates (x,y,z) array dimension */ -#define COORDINATES_DIM 3 - -/* tilts (x,y) array dimension */ -#define TILTS_DIM 2 - -/* Max size of the client name */ -#define USF_MAX_CLIENT_NAME_SIZE 20 - -/* Max number of the ports (mics/speakers) */ -#define USF_MAX_PORT_NUM 8 - -/* Info structure common for TX and RX */ -struct us_xx_info_type { -/* Input: general info */ -/* Name of the client - event calculator */ - const char __user *client_name; -/* Selected device identification, accepted in the kernel's CAD */ - uint32_t dev_id; -/* 0 - point_epos type; (e.g. 1 - gr_mmrd) */ - uint32_t stream_format; -/* Required sample rate in Hz */ - uint32_t sample_rate; -/* Size of a buffer (bytes) for US data transfer between the module and USF */ - uint32_t buf_size; -/* Number of the buffers for the US data transfer */ - uint16_t buf_num; -/* Number of the microphones (TX) or speakers(RX) */ - uint16_t port_cnt; -/* Microphones(TX) or speakers(RX) indexes in their enumeration */ - uint8_t port_id[USF_MAX_PORT_NUM]; -/* Bits per sample 16 or 32 */ - uint16_t bits_per_sample; -/* Input: Transparent info for encoder in the LPASS */ -/* Parameters data size in bytes */ - uint16_t params_data_size; -/* Pointer to the parameters */ - uint8_t __user *params_data; -/* Max size of buffer for get and set parameter */ - uint32_t max_get_set_param_buf_size; -}; - -struct us_input_info_type { - /* Touch screen dimensions: min & max;for input module */ - int tsc_x_dim[MIN_MAX_DIM]; - int tsc_y_dim[MIN_MAX_DIM]; - int tsc_z_dim[MIN_MAX_DIM]; - /* Touch screen tilt dimensions: min & max;for input module */ - int tsc_x_tilt[MIN_MAX_DIM]; - int tsc_y_tilt[MIN_MAX_DIM]; - /* Touch screen pressure limits: min & max; for input module */ - int tsc_pressure[MIN_MAX_DIM]; - /* The requested buttons bitmap */ - uint16_t req_buttons_bitmap; - /* Bitmap of types of events (USF_X_EVENT), produced by calculator */ - uint16_t event_types; - /* Bitmap of types of events from devs, conflicting with USF */ - uint16_t conflicting_event_types; -}; - -struct us_tx_info_type { - /* Common info */ - struct us_xx_info_type us_xx_info; - /* Info specific for TX*/ - struct us_input_info_type input_info; -}; - -struct us_rx_info_type { - /* Common info */ - struct us_xx_info_type us_xx_info; - /* Info specific for RX*/ -}; - -struct point_event_type { -/* Pen coordinates (x, y, z) in units, defined by */ - int coordinates[COORDINATES_DIM]; - /* {x;y} in transparent units */ - int inclinations[TILTS_DIM]; -/* [0-1023] (10bits); 0 - pen up */ - uint32_t pressure; -/* Bitmap for button state. 1 - down, 0 - up */ - uint16_t buttons_state_bitmap; -}; - -/* Mouse buttons, supported by USF */ -#define USF_BUTTON_LEFT_MASK 1 -#define USF_BUTTON_MIDDLE_MASK 2 -#define USF_BUTTON_RIGHT_MASK 4 -struct mouse_event_type { -/* The mouse relative movement (dX, dY, dZ) */ - int rels[COORDINATES_DIM]; -/* Bitmap of mouse buttons states: 1 - down, 0 - up; */ - uint16_t buttons_states; -}; - -struct key_event_type { -/* Calculated MS key- see input.h. */ - uint32_t key; -/* Keyboard's key state: 1 - down, 0 - up; */ - uint8_t key_state; -}; - -struct usf_event_type { -/* Event sequence number */ - uint32_t seq_num; -/* Event generation system time */ - uint32_t timestamp; -/* Destination input event type index (e.g. touch screen, mouse, key) */ - uint16_t event_type_ind; - union { - struct point_event_type point_event; - struct mouse_event_type mouse_event; - struct key_event_type key_event; - } event_data; -}; - -struct us_tx_update_info_type { -/* Input general: */ -/* Number of calculated events */ - uint16_t event_counter; -/* Calculated events or NULL */ - struct usf_event_type __user *event; -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -/* Time (sec) to wait for data or special values: */ -/* USF_NO_WAIT_TIMEOUT, USF_INFINITIVE_TIMEOUT, USF_DEFAULT_TIMEOUT */ - uint32_t timeout; -/* Events (from conflicting devs) to be disabled/enabled */ - uint16_t event_filters; - -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* Pointer to the parameters */ - uint8_t __user *params_data; -/* Output parameters: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -}; - -struct us_rx_update_info_type { -/* Input general: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* pPointer to the parameters */ - uint8_t __user *params_data; -/* Output parameters: */ -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -}; - -struct us_detect_info_type { -/* US detection place (HW|FW) */ -/* NA in the Active and OFF states */ - enum us_detect_place_enum us_detector; -/* US detection mode */ - enum us_detect_mode_enum us_detect_mode; -/* US data dropped during this time (msec) */ - uint32_t skip_time; -/* Transparent data size */ - uint16_t params_data_size; -/* Pointer to the transparent data */ - uint8_t __user *params_data; -/* Time (sec) to wait for US presence event */ - uint32_t detect_timeout; -/* Out parameter: US presence */ - bool is_us; -}; - -struct us_version_info_type { -/* Size of memory for the version string */ - uint16_t buf_size; -/* Pointer to the memory for the version string */ - char __user *pbuf; -}; - -struct us_stream_param_type { -/* Id of module */ - uint32_t module_id; -/* Id of parameter */ - uint32_t param_id; -/* Size of memory of the parameter buffer */ - uint32_t buf_size; -/* Pointer to the memory of the parameter buffer */ - uint8_t __user *pbuf; -}; - -#endif /* __USF_H__ */ diff --git a/techpack/audio/4.0/dsp/usfcdev.c b/techpack/audio/4.0/dsp/usfcdev.c deleted file mode 100644 index d1ac4c0025b2..000000000000 --- a/techpack/audio/4.0/dsp/usfcdev.c +++ /dev/null @@ -1,405 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2013, 2016-2017 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "usfcdev.h" - -#define UNDEF_ID 0xffffffff -#define SLOT_CMD_ID 0 -#define MAX_RETRIES 10 - -enum usdev_event_status { - USFCDEV_EVENT_ENABLED, - USFCDEV_EVENT_DISABLING, - USFCDEV_EVENT_DISABLED, -}; - -struct usfcdev_event { - bool (*match_cb)(uint16_t, struct input_dev *dev); - bool registered_event; - bool interleaved; - enum usdev_event_status event_status; -}; -static struct usfcdev_event s_usfcdev_events[MAX_EVENT_TYPE_NUM]; - -struct usfcdev_input_command { - unsigned int type; - unsigned int code; - unsigned int value; -}; - -static long s_usf_pid; - -static bool usfcdev_filter(struct input_handle *handle, - unsigned int type, unsigned int code, int value); -static bool usfcdev_match(struct input_handler *handler, - struct input_dev *dev); -static int usfcdev_connect(struct input_handler *handler, - struct input_dev *dev, - const struct input_device_id *id); -static void usfcdev_disconnect(struct input_handle *handle); - -static const struct input_device_id usfc_tsc_ids[] = { - { - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | - INPUT_DEVICE_ID_MATCH_KEYBIT | - INPUT_DEVICE_ID_MATCH_ABSBIT, - .evbit = { BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY) }, - .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) }, - /* assumption: ABS_X & ABS_Y are in the same long */ - .absbit = { [BIT_WORD(ABS_X)] = BIT_MASK(ABS_X) | - BIT_MASK(ABS_Y) }, - }, - { - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | - INPUT_DEVICE_ID_MATCH_KEYBIT | - INPUT_DEVICE_ID_MATCH_ABSBIT, - .evbit = { BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY) }, - .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) }, - /* assumption: MT_.._X & MT_.._Y are in the same long */ - .absbit = { [BIT_WORD(ABS_MT_POSITION_X)] = - BIT_MASK(ABS_MT_POSITION_X) | - BIT_MASK(ABS_MT_POSITION_Y) }, - }, - { } /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE(input, usfc_tsc_ids); - -static struct input_handler s_usfc_handlers[MAX_EVENT_TYPE_NUM] = { - { /* TSC handler */ - .filter = usfcdev_filter, - .match = usfcdev_match, - .connect = usfcdev_connect, - .disconnect = usfcdev_disconnect, - /* .minor can be used as index in the container, */ - /* because .fops isn't supported */ - .minor = TSC_EVENT_TYPE_IND, - .name = "usfc_tsc_handler", - .id_table = usfc_tsc_ids, - }, -}; - -/* - * For each event type, there are a number conflicting devices (handles) - * The first registered device (primary) is real TSC device; it's mandatory - * Optionally, later registered devices are simulated ones. - * They are dynamically managed - * The primary device's handles are stored in the below static array - */ -static struct input_handle s_usfc_primary_handles[MAX_EVENT_TYPE_NUM] = { - { /* TSC handle */ - .handler = &s_usfc_handlers[TSC_EVENT_TYPE_IND], - .name = "usfc_tsc_handle", - }, -}; - -static struct usfcdev_input_command initial_clear_cmds[] = { - {EV_ABS, ABS_PRESSURE, 0}, - {EV_KEY, BTN_TOUCH, 0}, -}; - -static struct usfcdev_input_command slot_clear_cmds[] = { - {EV_ABS, ABS_MT_SLOT, 0}, - {EV_ABS, ABS_MT_TRACKING_ID, UNDEF_ID}, -}; - -static struct usfcdev_input_command no_filter_cmds[] = { - {EV_ABS, ABS_MT_SLOT, 0}, - {EV_ABS, ABS_MT_TRACKING_ID, UNDEF_ID}, - {EV_SYN, SYN_REPORT, 0}, -}; - -static bool usfcdev_match(struct input_handler *handler, struct input_dev *dev) -{ - bool rc = false; - int ind = handler->minor; - - pr_debug("%s: name=[%s]; ind=%d\n", __func__, dev->name, ind); - - if (s_usfcdev_events[ind].registered_event && - s_usfcdev_events[ind].match_cb) { - rc = (*s_usfcdev_events[ind].match_cb)((uint16_t)ind, dev); - pr_debug("%s: [%s]; rc=%d\n", __func__, dev->name, rc); - } - return rc; -} - -static int usfcdev_connect(struct input_handler *handler, struct input_dev *dev, - const struct input_device_id *id) -{ - int ret = 0; - uint16_t ind = handler->minor; - struct input_handle *usfc_handle = NULL; - - if (s_usfc_primary_handles[ind].dev == NULL) { - pr_debug("%s: primary device; ind=%d\n", - __func__, - ind); - usfc_handle = &s_usfc_primary_handles[ind]; - } else { - pr_debug("%s: secondary device; ind=%d\n", - __func__, - ind); - usfc_handle = kzalloc(sizeof(struct input_handle), - GFP_KERNEL); - if (!usfc_handle) - return -ENOMEM; - - usfc_handle->handler = &s_usfc_handlers[ind]; - usfc_handle->name = s_usfc_primary_handles[ind].name; - } - usfc_handle->dev = dev; - ret = input_register_handle(usfc_handle); - pr_debug("%s: name=[%s]; ind=%d; dev=0x%pK\n", - __func__, - dev->name, - ind, - usfc_handle->dev); - if (ret) - pr_err("%s: input_register_handle[%d] failed: ret=%d\n", - __func__, - ind, - ret); - else { - ret = input_open_device(usfc_handle); - if (ret) { - pr_err("%s: input_open_device[%d] failed: ret=%d\n", - __func__, - ind, - ret); - input_unregister_handle(usfc_handle); - } else - pr_debug("%s: device[%d] is opened\n", - __func__, - ind); - } - - return ret; -} - -static void usfcdev_disconnect(struct input_handle *handle) -{ - int ind = handle->handler->minor; - - input_close_device(handle); - input_unregister_handle(handle); - pr_debug("%s: handle[%d], name=[%s] is disconnected\n", - __func__, - ind, - handle->dev->name); - if (s_usfc_primary_handles[ind].dev == handle->dev) - s_usfc_primary_handles[ind].dev = NULL; - else - kfree(handle); -} - -static bool usfcdev_filter(struct input_handle *handle, - unsigned int type, unsigned int code, int value) -{ - uint16_t i = 0; - uint16_t ind = (uint16_t)handle->handler->minor; - bool rc = (s_usfcdev_events[ind].event_status != USFCDEV_EVENT_ENABLED); - - if (s_usf_pid == current->pid) { - /* Pass events from usfcdev driver */ - rc = false; - pr_debug("%s: event_type=%d; type=%d; code=%d; val=%d", - __func__, - ind, - type, - code, - value); - } else if (s_usfcdev_events[ind].event_status == - USFCDEV_EVENT_DISABLING) { - uint32_t u_value = value; - - s_usfcdev_events[ind].interleaved = true; - /* Pass events for freeing slots from TSC driver */ - for (i = 0; i < ARRAY_SIZE(no_filter_cmds); ++i) { - if ((no_filter_cmds[i].type == type) && - (no_filter_cmds[i].code == code) && - (no_filter_cmds[i].value <= u_value)) { - rc = false; - pr_debug("%s: no_filter_cmds[%d]; %d", - __func__, - i, - no_filter_cmds[i].value); - break; - } - } - } - - return rc; -} - -bool usfcdev_register( - uint16_t event_type_ind, - bool (*match_cb)(uint16_t, struct input_dev *dev)) -{ - int ret = 0; - bool rc = false; - - if ((event_type_ind >= MAX_EVENT_TYPE_NUM) || !match_cb) { - pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%pK\n", - __func__, - event_type_ind, - match_cb); - return false; - } - - if (s_usfcdev_events[event_type_ind].registered_event) { - pr_info("%s: handler[%d] was already registered\n", - __func__, - event_type_ind); - return true; - } - - s_usfcdev_events[event_type_ind].registered_event = true; - s_usfcdev_events[event_type_ind].match_cb = match_cb; - s_usfcdev_events[event_type_ind].event_status = USFCDEV_EVENT_ENABLED; - ret = input_register_handler(&s_usfc_handlers[event_type_ind]); - if (!ret) { - rc = true; - pr_debug("%s: handler[%d] was registered\n", - __func__, - event_type_ind); - } else { - s_usfcdev_events[event_type_ind].registered_event = false; - s_usfcdev_events[event_type_ind].match_cb = NULL; - pr_err("%s: handler[%d] registration failed: ret=%d\n", - __func__, - event_type_ind, - ret); - } - - return rc; -} - -void usfcdev_unregister(uint16_t event_type_ind) -{ - if (event_type_ind >= MAX_EVENT_TYPE_NUM) { - pr_err("%s: wrong input: event_type_ind=%d\n", - __func__, - event_type_ind); - return; - } - if (s_usfcdev_events[event_type_ind].registered_event) { - input_unregister_handler(&s_usfc_handlers[event_type_ind]); - pr_debug("%s: handler[%d] was unregistered\n", - __func__, - event_type_ind); - s_usfcdev_events[event_type_ind].registered_event = false; - s_usfcdev_events[event_type_ind].match_cb = NULL; - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_ENABLED; - - } -} - -static inline void usfcdev_send_cmd( - struct input_dev *dev, - struct usfcdev_input_command cmd) -{ - input_event(dev, cmd.type, cmd.code, cmd.value); -} - -static void usfcdev_clean_dev(uint16_t event_type_ind) -{ - struct input_dev *dev = NULL; - int i; - int j; - int retries = 0; - - if (event_type_ind >= MAX_EVENT_TYPE_NUM) { - pr_err("%s: wrong input: event_type_ind=%d\n", - __func__, - event_type_ind); - return; - } - /* Only primary device must exist */ - dev = s_usfc_primary_handles[event_type_ind].dev; - if (dev == NULL) { - pr_err("%s: NULL primary device\n", - __func__); - return; - } - - for (i = 0; i < ARRAY_SIZE(initial_clear_cmds); i++) - usfcdev_send_cmd(dev, initial_clear_cmds[i]); - input_sync(dev); - - /* Send commands to free all slots */ - for (i = 0; i < dev->mt->num_slots; i++) { - s_usfcdev_events[event_type_ind].interleaved = false; - if (input_mt_get_value(&dev->mt->slots[i], - ABS_MT_TRACKING_ID) < 0) { - pr_debug("%s: skipping slot %d", - __func__, i); - continue; - } - slot_clear_cmds[SLOT_CMD_ID].value = i; - for (j = 0; j < ARRAY_SIZE(slot_clear_cmds); j++) - usfcdev_send_cmd(dev, slot_clear_cmds[j]); - - if (s_usfcdev_events[event_type_ind].interleaved) { - pr_debug("%s: interleaved(%d): slot(%d)", - __func__, i, dev->mt->slot); - if (retries++ < MAX_RETRIES) { - --i; - continue; - } - pr_warn("%s: index(%d) reached max retires", - __func__, i); - } - - retries = 0; - input_sync(dev); - } -} - -bool usfcdev_set_filter(uint16_t event_type_ind, bool filter) -{ - bool rc = true; - - if (event_type_ind >= MAX_EVENT_TYPE_NUM) { - pr_err("%s: wrong input: event_type_ind=%d\n", - __func__, - event_type_ind); - return false; - } - - if (s_usfcdev_events[event_type_ind].registered_event) { - - pr_debug("%s: event_type[%d]; filter=%d\n", - __func__, - event_type_ind, - filter - ); - if (filter) { - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_DISABLING; - s_usf_pid = current->pid; - usfcdev_clean_dev(event_type_ind); - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_DISABLED; - } else - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_ENABLED; - } else { - pr_err("%s: event_type[%d] isn't registered\n", - __func__, - event_type_ind); - rc = false; - } - - return rc; -} diff --git a/techpack/audio/4.0/dsp/usfcdev.h b/techpack/audio/4.0/dsp/usfcdev.h deleted file mode 100644 index 7b8bce7b3721..000000000000 --- a/techpack/audio/4.0/dsp/usfcdev.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012, The Linux Foundation. All rights reserved. - */ -#ifndef __USFCDEV_H__ -#define __USFCDEV_H__ - -#include - -/* TSC event type index in the containers of the handlers & handles */ -#define TSC_EVENT_TYPE_IND 0 -/* Number of supported event types to be filtered */ -#define MAX_EVENT_TYPE_NUM 1 - -bool usfcdev_register( - uint16_t event_type_ind, - bool (*match_cb)(uint16_t, struct input_dev *dev)); -void usfcdev_unregister(uint16_t event_type_ind); -bool usfcdev_set_filter(uint16_t event_type_ind, bool filter); -#endif /* __USFCDEV_H__ */ diff --git a/techpack/audio/4.0/dsp/voice_mhi.c b/techpack/audio/4.0/dsp/voice_mhi.c deleted file mode 100644 index 34f5eb924d67..000000000000 --- a/techpack/audio/4.0/dsp/voice_mhi.c +++ /dev/null @@ -1,622 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG 0x0001333B - -#define VOICE_MHI_STATE_SET(a, b) ((a) |= (1UL<<(b))) -#define VOICE_MHI_STATE_RESET(a, b) ((a) &= ~(1UL<<(b))) -#define VOICE_MHI_STATE_CHECK(a, b) (1UL & (a >> b)) - -#define CMD_STATUS_SUCCESS 0 -#define CMD_STATUS_FAIL 1 -#define TIMEOUT_MS 500 -#define PORT_NUM 0x01 -#define PORT_MASK 0x03 -#define CONVERT_PORT_APR(x, y) (x << 8 | y) - -enum voice_states { - VOICE_MHI_INIT = 0, - VOICE_MHI_PROBED = VOICE_MHI_INIT, - VOICE_MHI_ADSP_UP, - VOICE_MHI_SDX_UP, - VOICE_MHI_INCALL -}; - -struct voice_mhi_addr { - dma_addr_t base; - uint32_t size; -}; - -struct voice_mhi_dev_info { - struct platform_device *pdev; - struct voice_mhi_addr phys_addr; - struct voice_mhi_addr iova_pcie; - struct voice_mhi_addr iova_adsp; -}; - -struct voice_mhi { - struct voice_mhi_dev_info dev_info; - struct mhi_device *mhi_dev; - uint32_t vote_count; - struct mutex mutex; - enum voice_states voice_mhi_state; - bool vote_enable; - bool pcie_enabled; - void *apr_mvm_handle; - struct work_struct voice_mhi_work_pcie; - struct work_struct voice_mhi_work_adsp; - wait_queue_head_t voice_mhi_wait; - u32 mvm_state; - u32 async_err; -}; - -struct vss_ipktexg_cmd_set_mailbox_memory_config_t { - struct apr_hdr hdr; - uint64_t mailbox_mem_address_adsp; - /* - * IOVA of mailbox memory for ADSP access - */ - uint64_t mailbox_mem_address_pcie; - /* - * IOVA of mailbox memory for PCIe access - */ - uint32_t mem_size; - /* - * Size of mailbox memory allocated - */ -} __packed; - -static struct voice_mhi voice_mhi_lcl; - -static int voice_mhi_pcie_up_callback(struct mhi_device *, - const struct mhi_device_id *); -static void voice_mhi_pcie_down_callback(struct mhi_device *); -static void voice_mhi_pcie_status_callback(struct mhi_device *, enum MHI_CB); -static int32_t voice_mhi_apr_callback(struct apr_client_data *data, void *priv); -static int voice_mhi_notifier_service_cb(struct notifier_block *nb, - unsigned long opcode, void *ptr); -static int voice_mhi_apr_register(void); - -static struct notifier_block voice_mhi_service_nb = { - .notifier_call = voice_mhi_notifier_service_cb, - .priority = -INT_MAX, -}; - -static const struct mhi_device_id voice_mhi_match_table[] = { - { .chan = "AUDIO_VOICE_0", .driver_data = 0 }, - {}, -}; - -static struct mhi_driver voice_mhi_driver = { - .id_table = voice_mhi_match_table, - .probe = voice_mhi_pcie_up_callback, - .remove = voice_mhi_pcie_down_callback, - .status_cb = voice_mhi_pcie_status_callback, - .driver = { - .name = "voice_mhi_audio", - .owner = THIS_MODULE, - }, -}; - -static int voice_mhi_notifier_service_cb(struct notifier_block *nb, - unsigned long opcode, void *ptr) -{ - pr_debug("%s: opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - if (voice_mhi_lcl.apr_mvm_handle) { - apr_reset(voice_mhi_lcl.apr_mvm_handle); - voice_mhi_lcl.apr_mvm_handle = NULL; - VOICE_MHI_STATE_RESET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - } - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (!VOICE_MHI_STATE_CHECK(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP)) { - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - schedule_work(&voice_mhi_lcl.voice_mhi_work_adsp); - } - break; - default: - break; - } - - return NOTIFY_OK; - -} - -static int32_t voice_mhi_apr_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr1; - - if (data == NULL) { - pr_err("%s: data is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__, - data->payload_size, data->opcode); - - switch (data->opcode) { - case APR_BASIC_RSP_RESULT: - if (data->payload_size < 2 * sizeof(uint32_t)) { - pr_err("%s: APR_BASIC_RSP_RESULT payload less than expected\n", - __func__); - return 0; - } - ptr1 = data->payload; - switch (ptr1[0]) { - case VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG: - pr_debug("%s: cmd VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG\n", - __func__); - voice_mhi_lcl.mvm_state = CMD_STATUS_SUCCESS; - voice_mhi_lcl.async_err = ptr1[1]; - wake_up(&voice_mhi_lcl.voice_mhi_wait); - break; - default: - pr_err("%s: Invalid cmd response 0x%x 0x%x\n", __func__, - ptr1[0], ptr1[1]); - break; - } - break; - case APR_RSP_ACCEPTED: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: APR_RSP_ACCEPTED payload less than expected\n", - __func__); - return 0; - } - ptr1 = data->payload; - if (ptr1[0]) - pr_debug("%s: APR_RSP_ACCEPTED for 0x%x:\n", - __func__, ptr1[0]); - break; - case RESET_EVENTS: - /* Should we handle here or audio notifier down? */ - if (voice_mhi_lcl.apr_mvm_handle) { - apr_reset(voice_mhi_lcl.apr_mvm_handle); - voice_mhi_lcl.apr_mvm_handle = NULL; - VOICE_MHI_STATE_RESET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - } - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, - data->opcode); - break; - - } - return 0; -} - -/** - * voice_mhi_start - - * Start vote for MHI/PCIe clock - * - * Returns 0 on success or error on failure - */ -int voice_mhi_start(void) -{ - int ret = 0; - - mutex_lock(&voice_mhi_lcl.mutex); - if (voice_mhi_lcl.pcie_enabled) { - if (!voice_mhi_lcl.mhi_dev) { - pr_err("%s: NULL device found\n", __func__); - ret = -EINVAL; - goto done; - } - if (voice_mhi_lcl.vote_count == 0) { - ret = mhi_device_get_sync(voice_mhi_lcl.mhi_dev, - MHI_VOTE_DEVICE); - if (ret) { - pr_err("%s: mhi_device_get_sync failed\n", - __func__); - ret = -EINVAL; - goto done; - } - pr_debug("%s: mhi_device_get_sync success\n", __func__); - } else { - /* For DSDA, no additional voting is needed */ - pr_debug("%s: mhi is already voted\n", __func__); - } - voice_mhi_lcl.vote_count++; - } else { - /* PCIe not supported - return success*/ - goto done; - } -done: - mutex_unlock(&voice_mhi_lcl.mutex); - - return ret; -} -EXPORT_SYMBOL(voice_mhi_start); - -/** - * voice_mhi_end - - * End vote for MHI/PCIe clock - * - * Returns 0 on success or error on failure - */ -int voice_mhi_end(void) -{ - mutex_lock(&voice_mhi_lcl.mutex); - if (voice_mhi_lcl.pcie_enabled) { - if (!voice_mhi_lcl.mhi_dev || voice_mhi_lcl.vote_count == 0) { - pr_err("%s: NULL device found\n", __func__); - mutex_unlock(&voice_mhi_lcl.mutex); - return -EINVAL; - } - - if (voice_mhi_lcl.vote_count == 1) - mhi_device_put(voice_mhi_lcl.mhi_dev, MHI_VOTE_DEVICE); - voice_mhi_lcl.vote_count--; - } - mutex_unlock(&voice_mhi_lcl.mutex); - - return 0; -} -EXPORT_SYMBOL(voice_mhi_end); - -static int voice_mhi_set_mailbox_memory_config(void) -{ - struct vss_ipktexg_cmd_set_mailbox_memory_config_t mb_memory_config; - int ret = 0; - void *apr_mvm; - - if (!voice_mhi_lcl.apr_mvm_handle) { - pr_err("%s: APR handle is NULL\n", __func__); - return -EINVAL; - } - - memset(&mb_memory_config, 0, sizeof(mb_memory_config)); - mb_memory_config.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mb_memory_config.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mb_memory_config) - APR_HDR_SIZE); - pr_debug("%s: pkt size = %d\n", __func__, - mb_memory_config.hdr.pkt_size); - - mutex_lock(&voice_mhi_lcl.mutex); - apr_mvm = voice_mhi_lcl.apr_mvm_handle; - - /* - * Handle can be NULL as it is not tied to any session - */ - mb_memory_config.hdr.src_port = CONVERT_PORT_APR(PORT_NUM, PORT_MASK); - mb_memory_config.hdr.dest_port = 0; - mb_memory_config.hdr.token = 0; - mb_memory_config.hdr.opcode = VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG; - mb_memory_config.mailbox_mem_address_pcie = - voice_mhi_lcl.dev_info.iova_pcie.base; - mb_memory_config.mailbox_mem_address_adsp = - voice_mhi_lcl.dev_info.iova_adsp.base; - mb_memory_config.mem_size = voice_mhi_lcl.dev_info.iova_adsp.size; - voice_mhi_lcl.mvm_state = CMD_STATUS_FAIL; - voice_mhi_lcl.async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mb_memory_config); - if (ret < 0) { - pr_err("%s: Set mailbox memory config failed ret = %d\n", - __func__, ret); - goto unlock; - } - - ret = wait_event_timeout(voice_mhi_lcl.voice_mhi_wait, - (voice_mhi_lcl.mvm_state == - CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIME; - goto unlock; - } - if (voice_mhi_lcl.async_err > 0) { - pr_err("%s: DSP returned error[%d]\n", - __func__, voice_mhi_lcl.async_err); - ret = voice_mhi_lcl.async_err; - goto unlock; - } - ret = 0; -unlock: - mutex_unlock(&voice_mhi_lcl.mutex); - return ret; -} - -static void voice_mhi_map_pcie_and_send(struct work_struct *work) -{ - dma_addr_t iova, phys_addr; - uint32_t mem_size; - struct device *md; - - mutex_lock(&voice_mhi_lcl.mutex); - if (voice_mhi_lcl.mhi_dev) { - md = &voice_mhi_lcl.mhi_dev->dev; - } else { - pr_err("%s: MHI device handle is NULL\n", __func__); - goto err; - } - - phys_addr = voice_mhi_lcl.dev_info.phys_addr.base; - mem_size = voice_mhi_lcl.dev_info.iova_pcie.size; - if (md) { - iova = dma_map_resource(md->parent, phys_addr, mem_size, - DMA_BIDIRECTIONAL, 0); - if (dma_mapping_error(md->parent, iova)) { - pr_err("%s: dma_mapping_error\n", __func__); - goto err; - } - pr_debug("%s: dma_mapping_success iova:0x%lx\n", - __func__, (unsigned long)iova); - voice_mhi_lcl.dev_info.iova_pcie.base = iova; - - if (q6core_is_adsp_ready()) { - if (VOICE_MHI_STATE_CHECK(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_SDX_UP)) { - mutex_unlock(&voice_mhi_lcl.mutex); - voice_mhi_set_mailbox_memory_config(); - return; - } - } - } - -err: - mutex_unlock(&voice_mhi_lcl.mutex); -} - -static void voice_mhi_register_apr_and_send(struct work_struct *work) -{ - int ret = 0; - - ret = voice_mhi_apr_register(); - if (ret) { - pr_err("%s: APR registration failed %d\n", __func__, ret); - return; - } - mutex_lock(&voice_mhi_lcl.mutex); - if (q6core_is_adsp_ready()) { - if (VOICE_MHI_STATE_CHECK(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_SDX_UP)) { - mutex_unlock(&voice_mhi_lcl.mutex); - voice_mhi_set_mailbox_memory_config(); - return; - } - } - mutex_unlock(&voice_mhi_lcl.mutex); -} - -static int voice_mhi_pcie_up_callback(struct mhi_device *voice_mhi_dev, - const struct mhi_device_id *id) -{ - - if ((!voice_mhi_dev) || (id != &voice_mhi_match_table[0])) { - pr_err("%s: Invalid device or table received\n", __func__); - return -EINVAL; - } - pr_debug("%s: MHI PCIe UP callback\n", __func__); - mutex_lock(&voice_mhi_lcl.mutex); - voice_mhi_lcl.mhi_dev = voice_mhi_dev; - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, VOICE_MHI_SDX_UP); - mutex_unlock(&voice_mhi_lcl.mutex); - schedule_work(&voice_mhi_lcl.voice_mhi_work_pcie); - return 0; -} - -static void voice_mhi_pcie_down_callback(struct mhi_device *voice_mhi_dev) -{ - dma_addr_t iova; - struct device *md = NULL; - - mutex_lock(&voice_mhi_lcl.mutex); - - if (voice_mhi_lcl.mhi_dev) - md = &voice_mhi_lcl.mhi_dev->dev; - - VOICE_MHI_STATE_RESET(voice_mhi_lcl.voice_mhi_state, VOICE_MHI_SDX_UP); - iova = voice_mhi_lcl.dev_info.iova_pcie.base; - - if (md) - dma_unmap_resource(md->parent, iova, PAGE_SIZE, - DMA_BIDIRECTIONAL, 0); - - voice_mhi_lcl.mhi_dev = NULL; - voice_mhi_lcl.vote_count = 0; - mutex_unlock(&voice_mhi_lcl.mutex); -} - -static void voice_mhi_pcie_status_callback(struct mhi_device *voice_mhi_dev, - enum MHI_CB mhi_cb) -{ - -} - -static int voice_mhi_apr_register(void) -{ - int ret = 0; - - mutex_lock(&voice_mhi_lcl.mutex); - voice_mhi_lcl.apr_mvm_handle = apr_register("ADSP", "MVM", - (apr_fn)voice_mhi_apr_callback, - CONVERT_PORT_APR(PORT_NUM, - PORT_MASK), - &voice_mhi_lcl); - if (voice_mhi_lcl.apr_mvm_handle == NULL) { - pr_err("%s: error in APR register\n", __func__); - ret = -ENODEV; - } - mutex_unlock(&voice_mhi_lcl.mutex); - - return ret; -} - -static int voice_mhi_probe(struct platform_device *pdev) -{ - int ret = 0; - struct device_node *node; - uint32_t mem_size = 0; - void *ptr; - dma_addr_t phys_addr, iova; - const __be32 *cell; - - pr_debug("%s:\n", __func__); - - INIT_WORK(&voice_mhi_lcl.voice_mhi_work_pcie, - voice_mhi_map_pcie_and_send); - INIT_WORK(&voice_mhi_lcl.voice_mhi_work_adsp, - voice_mhi_register_apr_and_send); - init_waitqueue_head(&voice_mhi_lcl.voice_mhi_wait); - - node = of_parse_phandle(pdev->dev.of_node, "memory-region", 0); - if (node) { - cell = of_get_property(node, "size", NULL); - if (cell) - mem_size = of_read_number(cell, 2); - else { - pr_err("%s: cell not found\n", __func__); - ret = -EINVAL; - goto done; - } - } else { - pr_err("%s: Node read failed\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mem_size = %d\n", __func__, mem_size); - - if (mem_size) { - ptr = dma_alloc_attrs(&pdev->dev, mem_size, &phys_addr, - GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); - if (IS_ERR_OR_NULL(ptr)) { - pr_err("%s: Memory alloc failed\n", __func__); - ret = -ENOMEM; - goto done; - } else { - pr_debug("%s: Memory alloc success phys_addr:0x%lx\n", - __func__, (unsigned long)phys_addr); - } - - ret = msm_audio_ion_dma_map(&phys_addr, &iova, mem_size, - DMA_BIDIRECTIONAL); - if (ret) { - pr_err("%s: dma mapping failed %d\n", __func__, ret); - goto err_free; - } - pr_debug("%s: dma_mapping_success iova:0x%lx\n", - __func__, (unsigned long)iova); - - voice_mhi_lcl.dev_info.phys_addr.base = phys_addr; - voice_mhi_lcl.dev_info.iova_adsp.base = iova; - voice_mhi_lcl.dev_info.iova_adsp.size = mem_size; - voice_mhi_lcl.dev_info.iova_pcie.size = mem_size; - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - - ret = voice_mhi_apr_register(); - /* If fails register during audio notifier UP event */ - if (ret) - pr_err("%s: APR register failed %d\n", __func__, ret); - ret = mhi_driver_register(&voice_mhi_driver); - if (ret) { - pr_err("%s: mhi register failed %d\n", __func__, ret); - goto done; - } - - ret = audio_notifier_register("voice_mhi", - AUDIO_NOTIFIER_ADSP_DOMAIN, - &voice_mhi_service_nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - - mutex_lock(&voice_mhi_lcl.mutex); - voice_mhi_lcl.dev_info.pdev = pdev; - voice_mhi_lcl.pcie_enabled = true; - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_PROBED); - mutex_unlock(&voice_mhi_lcl.mutex); - } else { - pr_err("%s: Memory size can't be zero\n", __func__); - ret = -ENOMEM; - goto done; - } - -done: - return ret; -err_free: - dma_free_attrs(&pdev->dev, mem_size, ptr, phys_addr, - DMA_ATTR_NO_KERNEL_MAPPING); - return ret; - -} - -static int voice_mhi_remove(struct platform_device *pdev) -{ - if (voice_mhi_lcl.apr_mvm_handle) - apr_reset(voice_mhi_lcl.apr_mvm_handle); - mhi_driver_unregister(&voice_mhi_driver); - memset(&voice_mhi_lcl, 0, sizeof(voice_mhi_lcl)); - return 0; -} -static const struct of_device_id voice_mhi_of_match[] = { - { .compatible = "qcom,voice-mhi-audio", }, - {}, -}; -static struct platform_driver voice_mhi_platform_driver = { - .probe = voice_mhi_probe, - .remove = voice_mhi_remove, - .driver = { - .name = "voice_mhi_audio", - .owner = THIS_MODULE, - .of_match_table = voice_mhi_of_match, - .suppress_bind_attrs = true, - } -}; - -int __init voice_mhi_init(void) -{ - int ret = 0; - - memset(&voice_mhi_lcl, 0, sizeof(voice_mhi_lcl)); - mutex_init(&voice_mhi_lcl.mutex); - - /* Add remaining init here */ - voice_mhi_lcl.pcie_enabled = false; - voice_mhi_lcl.voice_mhi_state = VOICE_MHI_INIT; - voice_mhi_lcl.vote_count = 0; - voice_mhi_lcl.apr_mvm_handle = NULL; - ret = platform_driver_register(&voice_mhi_platform_driver); - - return ret; -} - -void __exit voice_mhi_exit(void) -{ - mutex_destroy(&voice_mhi_lcl.mutex); - platform_driver_unregister(&voice_mhi_platform_driver); -} - -MODULE_DESCRIPTION("Voice MHI module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/include/Kbuild b/techpack/audio/4.0/include/Kbuild deleted file mode 100644 index bab1145bc7a7..000000000000 --- a/techpack/audio/4.0/include/Kbuild +++ /dev/null @@ -1,2 +0,0 @@ -# Top-level Makefile calls into asm-$(ARCH) -# List only non-arch directories below diff --git a/techpack/audio/4.0/include/asoc/core.h b/techpack/audio/4.0/include/asoc/core.h deleted file mode 100644 index 67c97d627d55..000000000000 --- a/techpack/audio/4.0/include/asoc/core.h +++ /dev/null @@ -1,553 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __MFD_TABLA_CORE_H__ -#define __MFD_TABLA_CORE_H__ - -#include -#include -#include -#include -#include -#include "pdata.h" - -#define WCD9XXX_MAX_IRQ_REGS 4 -#define WCD9XXX_MAX_NUM_IRQS (WCD9XXX_MAX_IRQ_REGS * 8) -#define WCD9XXX_SLIM_NUM_PORT_REG 3 -#define TABLA_VERSION_1_0 0 -#define TABLA_VERSION_1_1 1 -#define TABLA_VERSION_2_0 2 -#define TABLA_IS_1_X(ver) \ - (((ver == TABLA_VERSION_1_0) || (ver == TABLA_VERSION_1_1)) ? 1 : 0) -#define TABLA_IS_2_0(ver) ((ver == TABLA_VERSION_2_0) ? 1 : 0) - -#define WCD9XXX_SUPPLY_BUCK_NAME "cdc-vdd-buck" - -#define SITAR_VERSION_1P0 0 -#define SITAR_VERSION_1P1 1 -#define SITAR_IS_1P0(ver) \ - ((ver == SITAR_VERSION_1P0) ? 1 : 0) -#define SITAR_IS_1P1(ver) \ - ((ver == SITAR_VERSION_1P1) ? 1 : 0) - -#define TAIKO_VERSION_1_0 1 -#define TAIKO_IS_1_0(ver) \ - ((ver == TAIKO_VERSION_1_0) ? 1 : 0) - -#define TAPAN_VERSION_1_0 0 -#define TAPAN_IS_1_0(ver) \ - ((ver == TAPAN_VERSION_1_0) ? 1 : 0) - -#define TOMTOM_VERSION_1_0 1 -#define TOMTOM_IS_1_0(ver) \ - ((ver == TOMTOM_VERSION_1_0) ? 1 : 0) - -#define TASHA_VERSION_1_0 0 -#define TASHA_VERSION_1_1 1 -#define TASHA_VERSION_2_0 2 - -#define TASHA_IS_1_0(wcd) \ - ((wcd->type == WCD9335 || wcd->type == WCD9326) ? \ - ((wcd->version == TASHA_VERSION_1_0) ? 1 : 0) : 0) - -#define TASHA_IS_1_1(wcd) \ - ((wcd->type == WCD9335 || wcd->type == WCD9326) ? \ - ((wcd->version == TASHA_VERSION_1_1) ? 1 : 0) : 0) - -#define TASHA_IS_2_0(wcd) \ - ((wcd->type == WCD9335 || wcd->type == WCD9326) ? \ - ((wcd->version == TASHA_VERSION_2_0) ? 1 : 0) : 0) - -/* - * As fine version info cannot be retrieved before tavil probe. - * Define three coarse versions for possible future use before tavil probe. - */ -#define TAVIL_VERSION_1_0 0 -#define TAVIL_VERSION_1_1 1 -#define TAVIL_VERSION_WCD9340_1_0 2 -#define TAVIL_VERSION_WCD9341_1_0 3 -#define TAVIL_VERSION_WCD9340_1_1 4 -#define TAVIL_VERSION_WCD9341_1_1 5 - -#define TAVIL_IS_1_0(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_1_0 || \ - wcd->version == TAVIL_VERSION_WCD9340_1_0 || \ - wcd->version == TAVIL_VERSION_WCD9341_1_0) ? 1 : 0) : 0) -#define TAVIL_IS_1_1(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_1_1 || \ - wcd->version == TAVIL_VERSION_WCD9340_1_1 || \ - wcd->version == TAVIL_VERSION_WCD9341_1_1) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9340_1_0(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9340_1_0) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9341_1_0(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9341_1_0) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9340_1_1(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9340_1_1) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9341_1_1(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9341_1_1) ? 1 : 0) : 0) - -#define IS_CODEC_TYPE(wcd, wcdtype) \ - ((wcd->type == wcdtype) ? true : false) -#define IS_CODEC_VERSION(wcd, wcdversion) \ - ((wcd->version == wcdversion) ? true : false) - -enum { - CDC_V_1_0, - CDC_V_1_1, - CDC_V_2_0, -}; - -enum codec_variant { - WCD9XXX, - WCD9330, - WCD9335, - WCD9326, - WCD934X, -}; - -enum wcd9xxx_slim_slave_addr_type { - WCD9XXX_SLIM_SLAVE_ADDR_TYPE_0, - WCD9XXX_SLIM_SLAVE_ADDR_TYPE_1, -}; - -enum wcd9xxx_pm_state { - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_AWAKE, - WCD9XXX_PM_ASLEEP, -}; - -enum { - WCD9XXX_INTR_STATUS_BASE = 0, - WCD9XXX_INTR_CLEAR_BASE, - WCD9XXX_INTR_MASK_BASE, - WCD9XXX_INTR_LEVEL_BASE, - WCD9XXX_INTR_CLR_COMMIT, - WCD9XXX_INTR_REG_MAX, -}; - -enum wcd9xxx_intf_status { - WCD9XXX_INTERFACE_TYPE_PROBING, - WCD9XXX_INTERFACE_TYPE_SLIMBUS, - WCD9XXX_INTERFACE_TYPE_I2C, -}; - -enum { - /* INTR_REG 0 */ - WCD9XXX_IRQ_SLIMBUS = 0, - WCD9XXX_IRQ_MBHC_REMOVAL, - WCD9XXX_IRQ_MBHC_SHORT_TERM, - WCD9XXX_IRQ_MBHC_PRESS, - WCD9XXX_IRQ_MBHC_RELEASE, - WCD9XXX_IRQ_MBHC_POTENTIAL, - WCD9XXX_IRQ_MBHC_INSERTION, - WCD9XXX_IRQ_BG_PRECHARGE, - /* INTR_REG 1 */ - WCD9XXX_IRQ_PA1_STARTUP, - WCD9XXX_IRQ_PA2_STARTUP, - WCD9XXX_IRQ_PA3_STARTUP, - WCD9XXX_IRQ_PA4_STARTUP, - WCD9306_IRQ_HPH_PA_OCPR_FAULT = WCD9XXX_IRQ_PA4_STARTUP, - WCD9XXX_IRQ_PA5_STARTUP, - WCD9XXX_IRQ_MICBIAS1_PRECHARGE, - WCD9306_IRQ_HPH_PA_OCPL_FAULT = WCD9XXX_IRQ_MICBIAS1_PRECHARGE, - WCD9XXX_IRQ_MICBIAS2_PRECHARGE, - WCD9XXX_IRQ_MICBIAS3_PRECHARGE, - /* INTR_REG 2 */ - WCD9XXX_IRQ_HPH_PA_OCPL_FAULT, - WCD9XXX_IRQ_HPH_PA_OCPR_FAULT, - WCD9XXX_IRQ_EAR_PA_OCPL_FAULT, - WCD9XXX_IRQ_HPH_L_PA_STARTUP, - WCD9XXX_IRQ_HPH_R_PA_STARTUP, - WCD9320_IRQ_EAR_PA_STARTUP, - WCD9306_IRQ_MBHC_JACK_SWITCH = WCD9320_IRQ_EAR_PA_STARTUP, - WCD9310_NUM_IRQS, - WCD9XXX_IRQ_RESERVED_0 = WCD9310_NUM_IRQS, - WCD9XXX_IRQ_RESERVED_1, - WCD9330_IRQ_SVASS_ERR_EXCEPTION = WCD9310_NUM_IRQS, - WCD9330_IRQ_MBHC_JACK_SWITCH, - /* INTR_REG 3 */ - WCD9XXX_IRQ_MAD_AUDIO, - WCD9XXX_IRQ_MAD_ULTRASOUND, - WCD9XXX_IRQ_MAD_BEACON, - WCD9XXX_IRQ_SPEAKER_CLIPPING, - WCD9320_IRQ_MBHC_JACK_SWITCH, - WCD9306_NUM_IRQS, - WCD9XXX_IRQ_VBAT_MONITOR_ATTACK = WCD9306_NUM_IRQS, - WCD9XXX_IRQ_VBAT_MONITOR_RELEASE, - WCD9XXX_NUM_IRQS, - /* WCD9330 INTR1_REG 3*/ - WCD9330_IRQ_SVASS_ENGINE = WCD9XXX_IRQ_MAD_AUDIO, - WCD9330_IRQ_MAD_AUDIO, - WCD9330_IRQ_MAD_ULTRASOUND, - WCD9330_IRQ_MAD_BEACON, - WCD9330_IRQ_SPEAKER1_CLIPPING, - WCD9330_IRQ_SPEAKER2_CLIPPING, - WCD9330_IRQ_VBAT_MONITOR_ATTACK, - WCD9330_IRQ_VBAT_MONITOR_RELEASE, - WCD9330_NUM_IRQS, - WCD9XXX_IRQ_RESERVED_2 = WCD9330_NUM_IRQS, -}; - -enum { - TABLA_NUM_IRQS = WCD9310_NUM_IRQS, - SITAR_NUM_IRQS = WCD9310_NUM_IRQS, - TAIKO_NUM_IRQS = WCD9XXX_NUM_IRQS, - TAPAN_NUM_IRQS = WCD9306_NUM_IRQS, - TOMTOM_NUM_IRQS = WCD9330_NUM_IRQS, -}; - -struct intr_data { - int intr_num; - bool clear_first; -}; - -struct wcd9xxx_core_resource { - struct mutex irq_lock; - struct mutex nested_irq_lock; - - enum wcd9xxx_pm_state pm_state; - struct mutex pm_lock; - /* pm_wq notifies change of pm_state */ - wait_queue_head_t pm_wq; - struct pm_qos_request pm_qos_req; - int wlock_holders; - - - /* holds the table of interrupts per codec */ - const struct intr_data *intr_table; - int intr_table_size; - unsigned int irq_base; - unsigned int irq; - u8 irq_masks_cur[WCD9XXX_MAX_IRQ_REGS]; - u8 irq_masks_cache[WCD9XXX_MAX_IRQ_REGS]; - bool irq_level_high[WCD9XXX_MAX_NUM_IRQS]; - int num_irqs; - int num_irq_regs; - u16 intr_reg[WCD9XXX_INTR_REG_MAX]; - struct regmap *wcd_core_regmap; - - /* Pointer to parent container data structure */ - void *parent; - - struct device *dev; - struct irq_domain *domain; -}; - -/* - * data structure for Slimbus and I2S channel. - * Some of fields are only used in smilbus mode - */ -struct wcd9xxx_ch { - u32 sph; /* share channel handle - slimbus only */ - u32 ch_num; /* - * vitrual channel number, such as 128 -144. - * apply for slimbus only - */ - u16 ch_h; /* chanel handle - slimbus only */ - u16 port; /* - * tabla port for RX and TX - * such as 0-9 for TX and 10 -16 for RX - * apply for both i2s and slimbus - */ - u16 shift; /* - * shift bit for RX and TX - * apply for both i2s and slimbus - */ - struct list_head list; /* - * channel link list - * apply for both i2s and slimbus - */ -}; - -struct wcd9xxx_codec_dai_data { - u32 rate; /* sample rate */ - u32 bit_width; /* sit width 16,24,32 */ - struct list_head wcd9xxx_ch_list; /* channel list */ - u16 grph; /* slimbus group handle */ - unsigned long ch_mask; - wait_queue_head_t dai_wait; - bool bus_down_in_recovery; -}; - -#define WCD9XXX_CH(xport, xshift) \ - {.port = xport, .shift = xshift} - -enum wcd9xxx_chipid_major { - TABLA_MAJOR = cpu_to_le16(0x100), - SITAR_MAJOR = cpu_to_le16(0x101), - TAIKO_MAJOR = cpu_to_le16(0x102), - TAPAN_MAJOR = cpu_to_le16(0x103), - TOMTOM_MAJOR = cpu_to_le16(0x105), - TASHA_MAJOR = cpu_to_le16(0x0), - TASHA2P0_MAJOR = cpu_to_le16(0x107), - TAVIL_MAJOR = cpu_to_le16(0x108), -}; - -enum codec_power_states { - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD_REGION_POWER_COLLAPSE_BEGIN, - WCD_REGION_POWER_DOWN, -}; - -enum wcd_power_regions { - WCD9XXX_DIG_CORE_REGION_1, - WCD9XXX_MAX_PWR_REGIONS, -}; - -struct wcd9xxx_codec_type { - u16 id_major; - u16 id_minor; - struct mfd_cell *dev; - int size; - int num_irqs; - int version; /* -1 to retrieve version from chip version register */ - enum wcd9xxx_slim_slave_addr_type slim_slave_type; - u16 i2c_chip_status; - const struct intr_data *intr_tbl; - int intr_tbl_size; - u16 intr_reg[WCD9XXX_INTR_REG_MAX]; -}; - -struct wcd9xxx_power_region { - enum codec_power_states power_state; - u16 pwr_collapse_reg_min; - u16 pwr_collapse_reg_max; -}; - -struct wcd9xxx { - struct device *dev; - struct slim_device *slim; - struct slim_device *slim_slave; - struct mutex io_lock; - struct mutex xfer_lock; - struct mutex reset_lock; - u8 version; - - int reset_gpio; - struct device_node *wcd_rst_np; - - int (*read_dev)(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *dest, bool interface_reg); - int (*write_dev)(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src, bool interface_reg); - int (*multi_reg_write)(struct wcd9xxx *wcd9xxx, const void *data, - size_t count); - int (*dev_down)(struct wcd9xxx *wcd9xxx); - int (*post_reset)(struct wcd9xxx *wcd9xxx); - - void *ssr_priv; - bool dev_up; - - u32 num_of_supplies; - struct regulator_bulk_data *supplies; - - struct wcd9xxx_core_resource core_res; - - u16 id_minor; - u16 id_major; - - /* Slimbus or I2S port */ - u32 num_rx_port; - u32 num_tx_port; - struct wcd9xxx_ch *rx_chs; - struct wcd9xxx_ch *tx_chs; - u32 mclk_rate; - enum codec_variant type; - struct regmap *regmap; - - struct wcd9xxx_codec_type *codec_type; - bool prev_pg_valid; - u8 prev_pg; - u8 avoid_cdc_rstlow; - struct wcd9xxx_power_region *wcd9xxx_pwr[WCD9XXX_MAX_PWR_REGIONS]; -}; - -struct wcd9xxx_reg_val { - unsigned short reg; /* register address */ - u8 *buf; /* buffer to be written to reg. addr */ - int bytes; /* number of bytes to be written */ -}; - -#ifdef CONFIG_WCD9XXX_CODEC_CORE -int wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg); -int wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg, - u8 val); -int wcd9xxx_get_logical_addresses(u8 *pgd_la, u8 *inf_la); -int wcd9xxx_slim_write_repeat(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src); -int wcd9xxx_slim_reserve_bw(struct wcd9xxx *wcd9xxx, - u32 bw_ops, bool commit); -int wcd9xxx_set_power_state(struct wcd9xxx *wcd9xxx, enum codec_power_states, - enum wcd_power_regions); -int wcd9xxx_get_current_power_state(struct wcd9xxx *wcd9xxx, - enum wcd_power_regions); - -int wcd9xxx_page_write(struct wcd9xxx *wcd9xxx, unsigned short *reg); - -int wcd9xxx_slim_bulk_write(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_reg_val *bulk_reg, - unsigned int size, bool interface); - -int wcd9xxx_vote_ondemand_regulator(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_pdata *pdata, - const char *supply_name, - bool enable); - -extern int wcd9xxx_core_res_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - int num_irqs, int num_irq_regs, struct regmap *wcd_regmap); - -extern void wcd9xxx_core_res_deinit( - struct wcd9xxx_core_resource *wcd9xxx_core_res); - -extern int wcd9xxx_core_res_suspend( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - pm_message_t pmesg); - -extern int wcd9xxx_core_res_resume( - struct wcd9xxx_core_resource *wcd9xxx_core_res); - -extern int wcd9xxx_core_irq_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res); - -extern int wcd9xxx_assign_irq(struct wcd9xxx_core_resource *wcd9xxx_core_res, - unsigned int irq, - unsigned int irq_base); - -extern enum wcd9xxx_intf_status wcd9xxx_get_intf_type(void); -extern void wcd9xxx_set_intf_type(enum wcd9xxx_intf_status); - -extern enum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - enum wcd9xxx_pm_state o, - enum wcd9xxx_pm_state n); -static inline int __init wcd9xxx_irq_of_init(struct device_node *node, - struct device_node *parent) -{ - return 0; -} - -int wcd9xxx_init(void); -void wcd9xxx_exit(void); -#else -static inline int wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg) -{ - return 0; -} -static inline int wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg, - u8 val) -{ - return 0; -} -static inline int wcd9xxx_get_logical_addresses(u8 *pgd_la, u8 *inf_la) -{ - return 0; -} -static inline int wcd9xxx_slim_write_repeat(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src) -{ - return 0; -} -static inline int wcd9xxx_slim_reserve_bw(struct wcd9xxx *wcd9xxx, - u32 bw_ops, bool commit) -{ - return 0; -} -static inline int wcd9xxx_set_power_state(struct wcd9xxx *wcd9xxx, enum codec_power_states - cdc_power_state, enum wcd_power_regions pwr_region) -{ - return 0; -} -static inline int wcd9xxx_get_current_power_state(struct wcd9xxx *wcd9xxx, - enum wcd_power_regions pwr_region) -{ - return 0; -} - -static inline int wcd9xxx_page_write(struct wcd9xxx *wcd9xxx, unsigned short *reg) -{ - return 0; -} - -static inline int wcd9xxx_slim_bulk_write(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_reg_val *bulk_reg, - unsigned int size, bool interface) -{ - return 0; -} - -static inline int wcd9xxx_core_res_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - int num_irqs, int num_irq_regs, struct regmap *wcd_regmap) -{ - return 0; -} - -static inline void wcd9xxx_core_res_deinit( - struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ -} - -static inline int wcd9xxx_core_res_suspend( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - pm_message_t pmesg) -{ - return 0; -} - -static inline int wcd9xxx_core_res_resume( - struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - return 0; -} - -static inline int wcd9xxx_core_irq_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - return 0; -} -static inline int wcd9xxx_assign_irq(struct wcd9xxx_core_resource *wcd9xxx_core_res, - unsigned int irq, - unsigned int irq_base) -{ - return 0; -} - -static inline enum wcd9xxx_intf_status wcd9xxx_get_intf_type(void) -{ - return 0; -} -static inline void wcd9xxx_set_intf_type(enum wcd9xxx_intf_status int_state) -{ -} - -static inline enum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - enum wcd9xxx_pm_state o, - enum wcd9xxx_pm_state n) -{ - return 0; -} -static inline int __init wcd9xxx_irq_of_init(struct device_node *node, - struct device_node *parent) -{ - return 0; -} - -static inline int wcd9xxx_init(void) -{ - return 0; -} -static inline void wcd9xxx_exit(void) -{ -} - -#endif -#endif diff --git a/techpack/audio/4.0/include/asoc/cpe_core.h b/techpack/audio/4.0/include/asoc/cpe_core.h deleted file mode 100644 index 9f6392ce9206..000000000000 --- a/techpack/audio/4.0/include/asoc/cpe_core.h +++ /dev/null @@ -1,188 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef __CPE_CORE_H__ -#define __CPE_CORE_H__ - -#include -#include -#include -#include - -enum { - CMD_INIT_STATE = 0, - CMD_SENT, - CMD_RESP_RCVD, -}; - -enum wcd_cpe_event { - WCD_CPE_PRE_ENABLE = 1, - WCD_CPE_POST_ENABLE, - WCD_CPE_PRE_DISABLE, - WCD_CPE_POST_DISABLE, -}; - -struct wcd_cpe_afe_port_cfg { - u8 port_id; - u16 bit_width; - u16 num_channels; - u32 sample_rate; -}; - -struct lsm_out_fmt_cfg { - u8 format; - u8 pack_mode; - u8 data_path_events; - u8 transfer_mode; -}; - -struct lsm_hw_params { - u32 sample_rate; - u16 num_chs; - u16 bit_width; -}; - -struct cpe_lsm_session { - /* sound model related */ - void *snd_model_data; - u8 *conf_levels; - void *cmi_reg_handle; - - /* Clients private data */ - void *priv_d; - - void (*event_cb)(void *priv_data, - u8 detect_status, - u8 size, u8 *payload); - - struct completion cmd_comp; - struct wcd_cpe_afe_port_cfg afe_port_cfg; - struct wcd_cpe_afe_port_cfg afe_out_port_cfg; - struct mutex lsm_lock; - - u32 snd_model_size; - u32 lsm_mem_handle; - u16 cmd_err_code; - u8 id; - u8 num_confidence_levels; - u16 afe_out_port_id; - struct task_struct *lsm_lab_thread; - bool started; - - u32 lab_enable; - struct lsm_out_fmt_cfg out_fmt_cfg; - - bool is_topology_used; -}; - -struct wcd_cpe_afe_ops { - int (*afe_set_params)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg, - bool afe_mad_ctl); - - int (*afe_port_start)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_stop)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_suspend)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_resume)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_cmd_cfg)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); -}; - -struct wcd_cpe_lsm_ops { - - struct cpe_lsm_session *(*lsm_alloc_session) - (void *core_handle, void *lsm_priv_d, - void (*event_cb)(void *priv_data, - u8 detect_status, - u8 size, u8 *payload)); - - int (*lsm_dealloc_session) - (void *core_handle, struct cpe_lsm_session *session); - - int (*lsm_open_tx)(void *core_handle, - struct cpe_lsm_session *session, u16 app_id, - u16 sample_rate); - - int (*lsm_close_tx)(void *core_handle, - struct cpe_lsm_session *session); - - int (*lsm_shmem_alloc)(void *core_handle, - struct cpe_lsm_session *session, u32 size); - - int (*lsm_shmem_dealloc)(void *core_handle, - struct cpe_lsm_session *session); - - int (*lsm_register_snd_model)(void *core_handle, - struct cpe_lsm_session *session, - enum lsm_detection_mode, - bool detect_failure); - - int (*lsm_deregister_snd_model)(void *core_handle, - struct cpe_lsm_session *session); - - int (*lsm_get_afe_out_port_id)(void *core_handle, - struct cpe_lsm_session *session); - - int (*lsm_start)(void *core_handle, - struct cpe_lsm_session *session); - - int (*lsm_stop)(void *core_handle, - struct cpe_lsm_session *session); - - int (*lsm_lab_control)(void *core_handle, - struct cpe_lsm_session *session, - bool enable); - - int (*lab_ch_setup)(void *core_handle, - struct cpe_lsm_session *session, - enum wcd_cpe_event event); - - int (*lsm_set_data)(void *core_handle, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, - bool detect_failure); - int (*lsm_set_fmt_cfg)(void *core_handle, - struct cpe_lsm_session *session); - int (*lsm_set_one_param)(void *core_handle, - struct cpe_lsm_session *session, - struct lsm_params_info *p_info, - void *data, uint32_t param_type); - void (*lsm_get_snd_model_offset) - (void *core_handle, struct cpe_lsm_session *session, - size_t *offset); - int (*lsm_set_media_fmt_params)(void *core_handle, - struct cpe_lsm_session *session, - struct lsm_hw_params *param); - int (*lsm_set_port)(void *core_handle, - struct cpe_lsm_session *session, void *data); -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_CPE) -int wcd_cpe_get_lsm_ops(struct wcd_cpe_lsm_ops *lsm_ops); -int wcd_cpe_get_afe_ops(struct wcd_cpe_afe_ops *afe_ops); -void *wcd_cpe_get_core_handle(struct snd_soc_codec *codec); -#else /* CONFIG_SND_SOC_WCD_CPE */ -static inline int wcd_cpe_get_lsm_ops(struct wcd_cpe_lsm_ops *lsm_ops) -{ - return 0; -} -static inline int wcd_cpe_get_afe_ops(struct wcd_cpe_afe_ops *afe_ops) -{ - return 0; -} -static inline void *wcd_cpe_get_core_handle(struct snd_soc_codec *codec) -{ - return NULL; -} -#endif /* CONFIG_SND_SOC_WCD_CPE */ -#endif diff --git a/techpack/audio/4.0/include/asoc/msm-cdc-pinctrl.h b/techpack/audio/4.0/include/asoc/msm-cdc-pinctrl.h deleted file mode 100644 index 89fe699ccb88..000000000000 --- a/techpack/audio/4.0/include/asoc/msm-cdc-pinctrl.h +++ /dev/null @@ -1,52 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __MFD_CDC_PINCTRL_H_ -#define __MFD_CDC_PINCTRL_H_ - -#include -#include - -#if IS_ENABLED(CONFIG_MSM_CDC_PINCTRL) -extern int msm_cdc_pinctrl_select_sleep_state(struct device_node *np); -extern int msm_cdc_pinctrl_select_active_state(struct device_node *np); -extern int msm_cdc_pinctrl_get_state(struct device_node *np); -extern int msm_cdc_get_gpio_state(struct device_node *np); -extern int msm_cdc_pinctrl_set_wakeup_capable(struct device_node *np, - bool enable); -int msm_cdc_pinctrl_drv_init(void); -void msm_cdc_pinctrl_drv_exit(void); - -#else -int msm_cdc_pinctrl_select_sleep_state(struct device_node *np) -{ - return 0; -} -int msm_cdc_pinctrl_select_active_state(struct device_node *np) -{ - return 0; -} -int msm_cdc_get_gpio_state(struct device_node *np) -{ - return 0; -} -int msm_cdc_pinctrl_drv_init(void) -{ - return 0; -} -void msm_cdc_pinctrl_drv_exit(void) -{ -} -int msm_cdc_pinctrl_get_state(struct device_node *np) -{ - return true; -} -static int msm_cdc_pinctrl_set_wakeup_capable(struct device_node *np, - bool enable) -{ - return 0; -} -#endif - -#endif diff --git a/techpack/audio/4.0/include/asoc/msm-cdc-supply.h b/techpack/audio/4.0/include/asoc/msm-cdc-supply.h deleted file mode 100644 index c6aacf6bd8e3..000000000000 --- a/techpack/audio/4.0/include/asoc/msm-cdc-supply.h +++ /dev/null @@ -1,53 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2016, 2018-2019 The Linux Foundation. All rights reserved. - */ - -#ifndef __CODEC_POWER_SUPPLY_H__ -#define __CODEC_POWER_SUPPLY_H__ - -#include -#include -#include - -struct cdc_regulator { - const char *name; - int min_uV; - int max_uV; - int optimum_uA; - bool ondemand; - struct regulator *regulator; -}; - -extern int msm_cdc_get_power_supplies(struct device *dev, - struct cdc_regulator **cdc_vreg, - int *total_num_supplies); -extern int msm_cdc_disable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, char *supply_name); -extern int msm_cdc_enable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, char *supply_name); -extern int msm_cdc_disable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -extern int msm_cdc_release_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -extern int msm_cdc_enable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -extern int msm_cdc_init_supplies(struct device *dev, - struct regulator_bulk_data **supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -extern int msm_cdc_init_supplies_v2(struct device *dev, - struct regulator_bulk_data **supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, - u32 vote_regulator_on_demand); -#endif diff --git a/techpack/audio/4.0/include/asoc/pdata.h b/techpack/audio/4.0/include/asoc/pdata.h deleted file mode 100644 index 41862d4bdc50..000000000000 --- a/techpack/audio/4.0/include/asoc/pdata.h +++ /dev/null @@ -1,199 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __MFD_WCD9XXX_PDATA_H__ - -#define __MFD_WCD9XXX_PDATA_H__ - -#if IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE) -#include -#endif - -#include "msm-cdc-supply.h" - -#define MICBIAS_EXT_BYP_CAP 0x00 -#define MICBIAS_NO_EXT_BYP_CAP 0x01 - -#define SITAR_LDOH_1P95_V 0x0 -#define SITAR_LDOH_2P35_V 0x1 -#define SITAR_LDOH_2P75_V 0x2 -#define SITAR_LDOH_2P85_V 0x3 - -#define SITAR_CFILT1_SEL 0x0 -#define SITAR_CFILT2_SEL 0x1 -#define SITAR_CFILT3_SEL 0x2 - -#define WCD9XXX_LDOH_1P95_V 0x0 -#define WCD9XXX_LDOH_2P35_V 0x1 -#define WCD9XXX_LDOH_2P75_V 0x2 -#define WCD9XXX_LDOH_2P85_V 0x3 -#define WCD9XXX_LDOH_3P0_V 0x3 - -#define TABLA_LDOH_1P95_V 0x0 -#define TABLA_LDOH_2P35_V 0x1 -#define TABLA_LDOH_2P75_V 0x2 -#define TABLA_LDOH_2P85_V 0x3 - -#define TABLA_CFILT1_SEL 0x0 -#define TABLA_CFILT2_SEL 0x1 -#define TABLA_CFILT3_SEL 0x2 - -#define MAX_AMIC_CHANNEL 7 - -#define TABLA_OCP_300_MA 0x0 -#define TABLA_OCP_350_MA 0x2 -#define TABLA_OCP_365_MA 0x3 -#define TABLA_OCP_150_MA 0x4 -#define TABLA_OCP_190_MA 0x6 -#define TABLA_OCP_220_MA 0x7 - -#define TABLA_DCYCLE_255 0x0 -#define TABLA_DCYCLE_511 0x1 -#define TABLA_DCYCLE_767 0x2 -#define TABLA_DCYCLE_1023 0x3 -#define TABLA_DCYCLE_1279 0x4 -#define TABLA_DCYCLE_1535 0x5 -#define TABLA_DCYCLE_1791 0x6 -#define TABLA_DCYCLE_2047 0x7 -#define TABLA_DCYCLE_2303 0x8 -#define TABLA_DCYCLE_2559 0x9 -#define TABLA_DCYCLE_2815 0xA -#define TABLA_DCYCLE_3071 0xB -#define TABLA_DCYCLE_3327 0xC -#define TABLA_DCYCLE_3583 0xD -#define TABLA_DCYCLE_3839 0xE -#define TABLA_DCYCLE_4095 0xF - -#define WCD9XXX_MCLK_CLK_12P288MHZ 12288000 -#define WCD9XXX_MCLK_CLK_9P6HZ 9600000 - -/* Only valid for 9.6 MHz mclk */ -#define WCD9XXX_DMIC_SAMPLE_RATE_600KHZ 600000 -#define WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ 2400000 -#define WCD9XXX_DMIC_SAMPLE_RATE_3P2MHZ 3200000 -#define WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ 4800000 - -/* Only valid for 12.288 MHz mclk */ -#define WCD9XXX_DMIC_SAMPLE_RATE_768KHZ 768000 -#define WCD9XXX_DMIC_SAMPLE_RATE_2P048MHZ 2048000 -#define WCD9XXX_DMIC_SAMPLE_RATE_3P072MHZ 3072000 -#define WCD9XXX_DMIC_SAMPLE_RATE_4P096MHZ 4096000 -#define WCD9XXX_DMIC_SAMPLE_RATE_6P144MHZ 6144000 - -#define WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED 0 - -#define WCD9XXX_DMIC_CLK_DRIVE_UNDEFINED 0 - -struct wcd9xxx_amic { - /*legacy mode, txfe_enable and txfe_buff take 7 input - * each bit represent the channel / TXFE number - * and numbered as below - * bit 0 = channel 1 / TXFE1_ENABLE / TXFE1_BUFF - * bit 1 = channel 2 / TXFE2_ENABLE / TXFE2_BUFF - * ... - * bit 7 = channel 7 / TXFE7_ENABLE / TXFE7_BUFF - */ - u8 legacy_mode:MAX_AMIC_CHANNEL; - u8 txfe_enable:MAX_AMIC_CHANNEL; - u8 txfe_buff:MAX_AMIC_CHANNEL; - u8 use_pdata:MAX_AMIC_CHANNEL; -}; - -/* Each micbias can be assigned to one of three cfilters - * Vbatt_min >= .15V + ldoh_v - * ldoh_v >= .15v + cfiltx_mv - * If ldoh_v = 1.95 160 mv < cfiltx_mv < 1800 mv - * If ldoh_v = 2.35 200 mv < cfiltx_mv < 2200 mv - * If ldoh_v = 2.75 240 mv < cfiltx_mv < 2600 mv - * If ldoh_v = 2.85 250 mv < cfiltx_mv < 2700 mv - */ - -struct wcd9xxx_micbias_setting { - u8 ldoh_v; - u32 cfilt1_mv; /* in mv */ - u32 cfilt2_mv; /* in mv */ - u32 cfilt3_mv; /* in mv */ - u32 micb1_mv; - u32 micb2_mv; - u32 micb3_mv; - u32 micb4_mv; - /* Different WCD9xxx series codecs may not - * have 4 mic biases. If a codec has fewer - * mic biases, some of these properties will - * not be used. - */ - u8 bias1_cfilt_sel; - u8 bias2_cfilt_sel; - u8 bias3_cfilt_sel; - u8 bias4_cfilt_sel; - u8 bias1_cap_mode; - u8 bias2_cap_mode; - u8 bias3_cap_mode; - u8 bias4_cap_mode; - bool bias2_is_headset_only; -}; - -struct wcd9xxx_ocp_setting { - unsigned int use_pdata:1; /* 0 - use sys default as recommended */ - unsigned int num_attempts:4; /* up to 15 attempts */ - unsigned int run_time:4; /* in duty cycle */ - unsigned int wait_time:4; /* in duty cycle */ - unsigned int hph_ocp_limit:3; /* Headphone OCP current limit */ -}; - -#define WCD9XXX_MAX_REGULATOR 9 -/* - * format : TABLA__CUR_MAX - * - * from Tabla objective spec - */ - -#define WCD9XXX_CDC_VDDA_CP_CUR_MAX 500000 -#define WCD9XXX_CDC_VDDA_RX_CUR_MAX 20000 -#define WCD9XXX_CDC_VDDA_TX_CUR_MAX 20000 -#define WCD9XXX_VDDIO_CDC_CUR_MAX 5000 - -#define WCD9XXX_VDDD_CDC_D_CUR_MAX 5000 -#define WCD9XXX_VDDD_CDC_A_CUR_MAX 5000 - -#define WCD9XXX_VDD_SPKDRV_NAME "cdc-vdd-spkdrv" -#define WCD9XXX_VDD_SPKDRV2_NAME "cdc-vdd-spkdrv-2" - -struct wcd9xxx_regulator { - const char *name; - int min_uV; - int max_uV; - int optimum_uA; - bool ondemand; - struct regulator *regulator; -}; - -struct wcd9xxx_pdata { - int irq; - int irq_base; - int num_irqs; - int reset_gpio; - bool has_buck_vsel_gpio; - bool has_micb_supply_en_gpio; - struct device_node *buck_vsel_ctl_np; - struct device_node *micb_en_ctl; - struct device_node *wcd_rst_np; - struct wcd9xxx_amic amic_settings; -#if IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE) - struct slim_device slimbus_slave_device; -#endif - struct wcd9xxx_micbias_setting micbias; - struct wcd9xxx_ocp_setting ocp; - struct cdc_regulator *regulator; - int num_supplies; - u32 mclk_rate; - u32 dmic_sample_rate; - u32 mad_dmic_sample_rate; - u32 ecpp_dmic_sample_rate; - u32 dmic_clk_drv; - u16 use_pinctrl; - u32 vote_regulator_on_demand; -}; - -#endif diff --git a/techpack/audio/4.0/include/asoc/wcd-clsh.h b/techpack/audio/4.0/include/asoc/wcd-clsh.h deleted file mode 100644 index 4edf52ab8afe..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd-clsh.h +++ /dev/null @@ -1,105 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD_CLSH -#define _WCD_CLSH - -#include - -#define WCD_CLSH_STRINGIFY(s) __stringify(s) -#define CLSH_REQ_ENABLE true -#define CLSH_REQ_DISABLE false - -#define WCD_CLSH_EVENT_PRE_DAC 0x01 -#define WCD_CLSH_EVENT_POST_PA 0x02 -/* - * Basic states for Class H state machine. - * represented as a bit mask within a u8 data type - * bit 0: EAR mode - * bit 1: HPH Left mode - * bit 2: HPH Right mode - * bit 3: AUX mode - */ -#define WCD_CLSH_STATE_IDLE 0x00 -#define WCD_CLSH_STATE_EAR (0x01 << 0) -#define WCD_CLSH_STATE_HPHL (0x01 << 1) -#define WCD_CLSH_STATE_HPHR (0x01 << 2) -#define WCD_CLSH_STATE_AUX (0x01 << 3) - -/* - * Though number of CLSH states is 4, max state should be 5 - * because state array index starts from 1. - */ -#define WCD_CLSH_STATE_MAX 5 -#define NUM_CLSH_STATES (0x01 << WCD_CLSH_STATE_MAX) - -/* Derived State: Bits 1 and 2 should be set for Headphone stereo */ -#define WCD_CLSH_STATE_HPH_ST (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_HPHR) - -#define WCD_CLSH_STATE_HPHL_AUX (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_HPHR_AUX (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_HPH_ST_AUX (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_EAR_AUX (WCD_CLSH_STATE_EAR | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_HPHL_EAR (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPHR_EAR (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPH_ST_EAR (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_EAR) - -enum { - CLS_H_NORMAL = 0, /* Class-H Default */ - CLS_H_HIFI, /* Class-H HiFi */ - CLS_H_LP, /* Class-H Low Power */ - CLS_AB, /* Class-AB Low HIFI*/ - CLS_H_LOHIFI, /* LoHIFI */ - CLS_H_ULP, /* Ultra Low power */ - CLS_AB_HIFI, /* Class-AB */ - CLS_AB_LP, /* Class-AB Low Power */ - CLS_AB_LOHIFI, /* Class-AB Low HIFI */ - CLS_NONE, /* None of the above modes */ -}; - -/* Class H data that the codec driver will maintain */ -struct wcd_clsh_cdc_info { - u8 state; - int flyback_users; - int buck_users; - int interpolator_modes[WCD_CLSH_STATE_MAX]; -}; - -#ifdef CONFIG_SND_SOC_WCD9XXX_V2 -extern void wcd_cls_h_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode); - -extern void wcd_cls_h_init(struct wcd_clsh_cdc_info *clsh); -extern void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec, - int mode); -#else -extern void wcd_cls_h_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode) -{ -} - -extern void wcd_cls_h_init(struct wcd_clsh_cdc_info *clsh) -{ -} - -static inline void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec, - int mode) -{ -} -#endif /* CONFIG_SND_SOC_WCD9XXX_V2 */ - -#endif diff --git a/techpack/audio/4.0/include/asoc/wcd-irq.h b/techpack/audio/4.0/include/asoc/wcd-irq.h deleted file mode 100644 index 5460e18067c3..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd-irq.h +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#ifndef __WCD_IRQ_H_ -#define __WCD_IRQ_H_ - -#include -#include -#include - -struct wcd_irq_info { - struct regmap_irq_chip *wcd_regmap_irq_chip; - char *codec_name; - struct regmap *regmap; - struct regmap_irq_chip_data *irq_chip; - struct device *dev; -}; - -#if (IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE) | \ - IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE_V2)) -int wcd_irq_init(struct wcd_irq_info *irq_info, struct irq_domain **virq); -int wcd_irq_exit(struct wcd_irq_info *irq_info, struct irq_domain *virq); -int wcd_request_irq(struct wcd_irq_info *irq_info, int irq, const char *name, - irq_handler_t handler, void *data); -void wcd_free_irq(struct wcd_irq_info *irq_info, int irq, void *data); -void wcd_enable_irq(struct wcd_irq_info *irq_info, int irq); -void wcd_disable_irq(struct wcd_irq_info *irq_info, int irq); -#else -static inline int wcd_irq_init(struct wcd_irq_info *irq_info, - struct irq_domain **virq) -{ - return 0; -}; -static inline int wcd_irq_exit(struct wcd_irq_info *irq_info, - struct irq_domain *virq) -{ - return 0; -}; -static inline int wcd_request_irq(struct wcd_irq_info *irq_info, - int irq, const char *name, - irq_handler_t handler, void *data) -{ - return 0; -}; -static inline void wcd_free_irq(struct wcd_irq_info *irq_info, int irq, void *data); -{ -}; -static inline void wcd_enable_irq(struct wcd_irq_info *irq_info, int irq); -{ -}; -static inline void wcd_disable_irq(struct wcd_irq_info *irq_info, int irq); -{ -}; -#endif -#endif /* __WCD_IRQ_H_ */ diff --git a/techpack/audio/4.0/include/asoc/wcd-mbhc-v2-api.h b/techpack/audio/4.0/include/asoc/wcd-mbhc-v2-api.h deleted file mode 100644 index 1fa788d5b0cd..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd-mbhc-v2-api.h +++ /dev/null @@ -1,52 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD_MBHC_V2_API_H__ -#define __WCD_MBHC_V2_API_H__ - -#include "wcd-mbhc-v2.h" - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_MBHC) -int wcd_mbhc_start(struct wcd_mbhc *mbhc, - struct wcd_mbhc_config *mbhc_cfg); -void wcd_mbhc_stop(struct wcd_mbhc *mbhc); -int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_codec *codec, - const struct wcd_mbhc_cb *mbhc_cb, - const struct wcd_mbhc_intr *mbhc_cdc_intr_ids, - struct wcd_mbhc_register *wcd_mbhc_regs, - bool impedance_det_en); -int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr); -void wcd_mbhc_deinit(struct wcd_mbhc *mbhc); - -#else -static inline void wcd_mbhc_stop(struct wcd_mbhc *mbhc) -{ -} -int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_codec *codec, - const struct wcd_mbhc_cb *mbhc_cb, - const struct wcd_mbhc_intr *mbhc_cdc_intr_ids, - struct wcd_mbhc_register *wcd_mbhc_regs, - bool impedance_det_en) -{ - return 0; -} -static inline int wcd_mbhc_start(struct wcd_mbhc *mbhc, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, - uint32_t *zl, - uint32_t *zr) -{ - *zl = 0; - *zr = 0; - return -EINVAL; -} -static inline void wcd_mbhc_deinit(struct wcd_mbhc *mbhc) -{ -} -#endif - -#endif /* __WCD_MBHC_V2_API_H__ */ diff --git a/techpack/audio/4.0/include/asoc/wcd-mbhc-v2.h b/techpack/audio/4.0/include/asoc/wcd-mbhc-v2.h deleted file mode 100644 index ce3985427e18..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd-mbhc-v2.h +++ /dev/null @@ -1,612 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD_MBHC_V2_H__ -#define __WCD_MBHC_V2_H__ - -#include -#include -#include -#include "wcdcal-hwdep.h" -#include - -#define TOMBAK_MBHC_NC 0 -#define TOMBAK_MBHC_NO 1 -#define WCD_MBHC_DEF_BUTTONS 8 -#define WCD_MBHC_KEYCODE_NUM 8 -#define WCD_MBHC_USLEEP_RANGE_MARGIN_US 100 -#define WCD_MBHC_THR_HS_MICB_MV 2700 -/* z value defined in Ohms */ -#define WCD_MONO_HS_MIN_THR 2 -#define WCD_MBHC_STRINGIFY(s) __stringify(s) - -#define WCD_MBHC_REGISTER(rid, rreg, rmask, rshift, rinvert) \ -{ .id = rid, .reg = rreg, .mask = rmask, .offset = rshift, .invert = rinvert } - -#define WCD_MBHC_RSC_LOCK(mbhc) \ -{ \ - pr_debug("%s: Acquiring BCL\n", __func__); \ - mutex_lock(&mbhc->codec_resource_lock); \ - pr_debug("%s: Acquiring BCL done\n", __func__); \ -} - -#define WCD_MBHC_RSC_UNLOCK(mbhc) \ -{ \ - pr_debug("%s: Release BCL\n", __func__); \ - mutex_unlock(&mbhc->codec_resource_lock); \ -} - -#define WCD_MBHC_RSC_ASSERT_LOCKED(mbhc) \ -{ \ - WARN_ONCE(!mutex_is_locked(&mbhc->codec_resource_lock), \ - "%s: BCL should have acquired\n", __func__); \ -} - -/* - * Macros to update and read mbhc register bits. Check for - * "0" before updating or reading the register, because it - * is possible that one codec wants to write to that bit and - * other codec does not. - */ -#define WCD_MBHC_REG_UPDATE_BITS(function, val) \ -do { \ - if (mbhc->wcd_mbhc_regs[function].reg) { \ - snd_soc_update_bits(mbhc->codec, \ - mbhc->wcd_mbhc_regs[function].reg, \ - mbhc->wcd_mbhc_regs[function].mask, \ - val << (mbhc->wcd_mbhc_regs[function].offset)); \ - } \ -} while (0) - -#define WCD_MBHC_REG_READ(function, val) \ -do { \ - if (mbhc->wcd_mbhc_regs[function].reg) { \ - val = (((snd_soc_read(mbhc->codec, \ - mbhc->wcd_mbhc_regs[function].reg)) & \ - (mbhc->wcd_mbhc_regs[function].mask)) >> \ - (mbhc->wcd_mbhc_regs[function].offset)); \ - } else { \ - val = -EINVAL; \ - } \ -} while (0) - -#define WCD_MBHC_CAL_SIZE(buttons, rload) ( \ - sizeof(struct wcd_mbhc_general_cfg) + \ - sizeof(struct wcd_mbhc_plug_detect_cfg) + \ - ((sizeof(s16) + sizeof(s16)) * buttons) + \ - sizeof(struct wcd_mbhc_plug_type_cfg) + \ - sizeof(struct wcd_mbhc_btn_detect_cfg) + \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + \ - ((sizeof(u16) + sizeof(u16)) * rload) \ - ) - -#define WCD_MBHC_CAL_GENERAL_PTR(cali) ( \ - (struct wcd_mbhc_general_cfg *) cali) -#define WCD_MBHC_CAL_PLUG_DET_PTR(cali) ( \ - (struct wcd_mbhc_plug_detect_cfg *) \ - &(WCD_MBHC_CAL_GENERAL_PTR(cali)[1])) -#define WCD_MBHC_CAL_PLUG_TYPE_PTR(cali) ( \ - (struct wcd_mbhc_plug_type_cfg *) \ - &(WCD_MBHC_CAL_PLUG_DET_PTR(cali)[1])) -#define WCD_MBHC_CAL_BTN_DET_PTR(cali) ( \ - (struct wcd_mbhc_btn_detect_cfg *) \ - &(WCD_MBHC_CAL_PLUG_TYPE_PTR(cali)[1])) -#define WCD_MBHC_CAL_IMPED_DET_PTR(cali) ( \ - (struct wcd_mbhc_imped_detect_cfg *) \ - (((void *)&WCD_MBHC_CAL_BTN_DET_PTR(cali)[1]) + \ - (WCD_MBHC_CAL_BTN_DET_PTR(cali)->num_btn * \ - (sizeof(WCD_MBHC_CAL_BTN_DET_PTR(cali)->_v_btn_low[0]) + \ - sizeof(WCD_MBHC_CAL_BTN_DET_PTR(cali)->_v_btn_high[0])))) \ - ) - -#define WCD_MBHC_CAL_MIN_SIZE ( \ - sizeof(struct wcd_mbhc_general_cfg) + \ - sizeof(struct wcd_mbhc_plug_detect_cfg) + \ - sizeof(struct wcd_mbhc_plug_type_cfg) + \ - sizeof(struct wcd_mbhc_btn_detect_cfg) + \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + \ - (sizeof(u16)*2) \ - ) - -#define WCD_MBHC_CAL_BTN_SZ(cfg_ptr) ( \ - sizeof(struct wcd_mbhc_btn_detect_cfg) + \ - (cfg_ptr->num_btn * (sizeof(cfg_ptr->_v_btn_low[0]) + \ - sizeof(cfg_ptr->_v_btn_high[0])))) - -#define WCD_MBHC_CAL_IMPED_MIN_SZ ( \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + sizeof(u16) * 2) - -#define WCD_MBHC_CAL_IMPED_SZ(cfg_ptr) ( \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + \ - (cfg_ptr->_n_rload * \ - (sizeof(cfg_ptr->_rload[0]) + sizeof(cfg_ptr->_alpha[0])))) - -#define WCD_MBHC_JACK_MASK (SND_JACK_HEADSET | SND_JACK_OC_HPHL | \ - SND_JACK_OC_HPHR | SND_JACK_LINEOUT | \ - SND_JACK_MECHANICAL | SND_JACK_MICROPHONE2 | \ - SND_JACK_UNSUPPORTED) - -#define WCD_MBHC_JACK_BUTTON_MASK (SND_JACK_BTN_0 | SND_JACK_BTN_1 | \ - SND_JACK_BTN_2 | SND_JACK_BTN_3 | \ - SND_JACK_BTN_4 | SND_JACK_BTN_5) -#define OCP_ATTEMPT 20 -#define HS_DETECT_PLUG_TIME_MS (3 * 1000) -#define SPECIAL_HS_DETECT_TIME_MS (2 * 1000) -#define MBHC_BUTTON_PRESS_THRESHOLD_MIN 250 -#define GND_MIC_SWAP_THRESHOLD 4 -#define GND_MIC_USBC_SWAP_THRESHOLD 2 -#define WCD_FAKE_REMOVAL_MIN_PERIOD_MS 100 -#define HS_VREF_MIN_VAL 1400 -#define FW_READ_ATTEMPTS 15 -#define FW_READ_TIMEOUT 4000000 -#define FAKE_REM_RETRY_ATTEMPTS 3 - -#define WCD_MBHC_BTN_PRESS_COMPL_TIMEOUT_MS 50 -#define ANC_DETECT_RETRY_CNT 7 -#define WCD_MBHC_SPL_HS_CNT 1 - -enum wcd_mbhc_detect_logic { - WCD_DETECTION_LEGACY, - WCD_DETECTION_ADC, -}; - -enum wcd_mbhc_cs_mb_en_flag { - WCD_MBHC_EN_CS = 0, - WCD_MBHC_EN_MB, - WCD_MBHC_EN_PULLUP, - WCD_MBHC_EN_NONE, -}; - -enum { - WCD_MBHC_ELEC_HS_INS, - WCD_MBHC_ELEC_HS_REM, -}; - -struct wcd_mbhc; -enum wcd_mbhc_register_function { - WCD_MBHC_L_DET_EN, - WCD_MBHC_GND_DET_EN, - WCD_MBHC_MECH_DETECTION_TYPE, - WCD_MBHC_MIC_CLAMP_CTL, - WCD_MBHC_ELECT_DETECTION_TYPE, - WCD_MBHC_HS_L_DET_PULL_UP_CTRL, - WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL, - WCD_MBHC_HPHL_PLUG_TYPE, - WCD_MBHC_GND_PLUG_TYPE, - WCD_MBHC_SW_HPH_LP_100K_TO_GND, - WCD_MBHC_ELECT_SCHMT_ISRC, - WCD_MBHC_FSM_EN, - WCD_MBHC_INSREM_DBNC, - WCD_MBHC_BTN_DBNC, - WCD_MBHC_HS_VREF, - WCD_MBHC_HS_COMP_RESULT, - WCD_MBHC_IN2P_CLAMP_STATE, - WCD_MBHC_MIC_SCHMT_RESULT, - WCD_MBHC_HPHL_SCHMT_RESULT, - WCD_MBHC_HPHR_SCHMT_RESULT, - WCD_MBHC_OCP_FSM_EN, - WCD_MBHC_BTN_RESULT, - WCD_MBHC_BTN_ISRC_CTL, - WCD_MBHC_ELECT_RESULT, - WCD_MBHC_MICB_CTRL, /* Pull-up and micb control */ - WCD_MBHC_HPH_CNP_WG_TIME, - WCD_MBHC_HPHR_PA_EN, - WCD_MBHC_HPHL_PA_EN, - WCD_MBHC_HPH_PA_EN, - WCD_MBHC_SWCH_LEVEL_REMOVE, - WCD_MBHC_PULLDOWN_CTRL, - WCD_MBHC_ANC_DET_EN, - WCD_MBHC_FSM_STATUS, - WCD_MBHC_MUX_CTL, - WCD_MBHC_MOISTURE_STATUS, - WCD_MBHC_HPHR_GND, - WCD_MBHC_HPHL_GND, - WCD_MBHC_HPHL_OCP_DET_EN, - WCD_MBHC_HPHR_OCP_DET_EN, - WCD_MBHC_HPHL_OCP_STATUS, - WCD_MBHC_HPHR_OCP_STATUS, - WCD_MBHC_ADC_EN, - WCD_MBHC_ADC_COMPLETE, - WCD_MBHC_ADC_TIMEOUT, - WCD_MBHC_ADC_RESULT, - WCD_MBHC_MICB2_VOUT, - WCD_MBHC_ADC_MODE, - WCD_MBHC_DETECTION_DONE, - WCD_MBHC_ELECT_ISRC_EN, - WCD_MBHC_REG_FUNC_MAX, -}; - -enum wcd_mbhc_plug_type { - MBHC_PLUG_TYPE_INVALID = -1, - MBHC_PLUG_TYPE_NONE, - MBHC_PLUG_TYPE_HEADSET, - MBHC_PLUG_TYPE_HEADPHONE, - MBHC_PLUG_TYPE_HIGH_HPH, - MBHC_PLUG_TYPE_GND_MIC_SWAP, - MBHC_PLUG_TYPE_ANC_HEADPHONE, -}; - -enum pa_dac_ack_flags { - WCD_MBHC_HPHL_PA_OFF_ACK = 0, - WCD_MBHC_HPHR_PA_OFF_ACK, -}; - -enum anc_ack_flags { - WCD_MBHC_ANC0_OFF_ACK = 0, - WCD_MBHC_ANC1_OFF_ACK, -}; - -enum wcd_mbhc_btn_det_mem { - WCD_MBHC_BTN_DET_V_BTN_LOW, - WCD_MBHC_BTN_DET_V_BTN_HIGH -}; - -enum { - MIC_BIAS_1 = 1, - MIC_BIAS_2, - MIC_BIAS_3, - MIC_BIAS_4 -}; - -enum { - MICB_PULLUP_ENABLE, - MICB_PULLUP_DISABLE, - MICB_ENABLE, - MICB_DISABLE, -}; - -enum { - MBHC_COMMON_MICB_PRECHARGE, - MBHC_COMMON_MICB_SET_VAL, - MBHC_COMMON_MICB_TAIL_CURR, -}; - -enum wcd_notify_event { - WCD_EVENT_INVALID, - /* events for micbias ON and OFF */ - WCD_EVENT_PRE_MICBIAS_2_OFF, - WCD_EVENT_POST_MICBIAS_2_OFF, - WCD_EVENT_PRE_MICBIAS_2_ON, - WCD_EVENT_POST_MICBIAS_2_ON, - WCD_EVENT_PRE_DAPM_MICBIAS_2_OFF, - WCD_EVENT_POST_DAPM_MICBIAS_2_OFF, - WCD_EVENT_PRE_DAPM_MICBIAS_2_ON, - WCD_EVENT_POST_DAPM_MICBIAS_2_ON, - /* events for PA ON and OFF */ - WCD_EVENT_PRE_HPHL_PA_ON, - WCD_EVENT_POST_HPHL_PA_OFF, - WCD_EVENT_PRE_HPHR_PA_ON, - WCD_EVENT_POST_HPHR_PA_OFF, - WCD_EVENT_PRE_HPHL_PA_OFF, - WCD_EVENT_PRE_HPHR_PA_OFF, - WCD_EVENT_OCP_OFF, - WCD_EVENT_OCP_ON, - WCD_EVENT_LAST, -}; - -enum wcd_mbhc_event_state { - WCD_MBHC_EVENT_PA_HPHL, - WCD_MBHC_EVENT_PA_HPHR, -}; - -struct wcd_mbhc_general_cfg { - u8 t_ldoh; - u8 t_bg_fast_settle; - u8 t_shutdown_plug_rem; - u8 mbhc_nsa; - u8 mbhc_navg; - u8 v_micbias_l; - u8 v_micbias; - u8 mbhc_reserved; - u16 settle_wait; - u16 t_micbias_rampup; - u16 t_micbias_rampdown; - u16 t_supply_bringup; -} __packed; - -struct wcd_mbhc_plug_detect_cfg { - u32 mic_current; - u32 hph_current; - u16 t_mic_pid; - u16 t_ins_complete; - u16 t_ins_retry; - u16 v_removal_delta; - u8 micbias_slow_ramp; - u8 reserved0; - u8 reserved1; - u8 reserved2; -} __packed; - -struct wcd_mbhc_plug_type_cfg { - u8 av_detect; - u8 mono_detect; - u8 num_ins_tries; - u8 reserved0; - s16 v_no_mic; - s16 v_av_min; - s16 v_av_max; - s16 v_hs_min; - s16 v_hs_max; - u16 reserved1; -} __packed; - -struct wcd_mbhc_btn_detect_cfg { - s8 c[8]; - u8 nc; - u8 n_meas; - u8 mbhc_nsc; - u8 n_btn_meas; - u8 n_btn_con; - u8 num_btn; - u8 reserved0; - u8 reserved1; - u16 t_poll; - u16 t_bounce_wait; - u16 t_rel_timeout; - s16 v_btn_press_delta_sta; - s16 v_btn_press_delta_cic; - u16 t_btn0_timeout; - s16 _v_btn_low[0]; /* v_btn_low[num_btn] */ - s16 _v_btn_high[0]; /* v_btn_high[num_btn] */ - u8 _n_ready[2]; - u8 _n_cic[2]; - u8 _gain[2]; -} __packed; - -struct wcd_mbhc_imped_detect_cfg { - u8 _hs_imped_detect; - u8 _n_rload; - u8 _hph_keep_on; - u8 _repeat_rload_calc; - u16 _t_dac_ramp_time; - u16 _rhph_high; - u16 _rhph_low; - u16 _rload[0]; /* rload[n_rload] */ - u16 _alpha[0]; /* alpha[n_rload] */ - u16 _beta[3]; -} __packed; - -enum wcd_mbhc_hph_type { - WCD_MBHC_HPH_NONE = 0, - WCD_MBHC_HPH_MONO, - WCD_MBHC_HPH_STEREO, -}; - -/* - * These enum definitions are directly mapped to the register - * definitions - */ -enum mbhc_moisture_vref { - V_OFF, - V_45_MV, - V_100_MV, - V_225_MV, -}; - -enum mbhc_hs_pullup_iref { - I_DEFAULT = -1, - I_OFF = 0, - I_1P0_UA, - I_2P0_UA, - I_3P0_UA, -}; - -enum mbhc_hs_pullup_iref_v2 { - HS_PULLUP_I_DEFAULT = -1, - HS_PULLUP_I_3P0_UA = 0, - HS_PULLUP_I_2P25_UA, - HS_PULLUP_I_1P5_UA, - HS_PULLUP_I_0P75_UA, - HS_PULLUP_I_1P125_UA = 0x05, - HS_PULLUP_I_0P375_UA = 0x07, - HS_PULLUP_I_2P0_UA, - HS_PULLUP_I_1P0_UA = 0x0A, - HS_PULLUP_I_0P5_UA, - HS_PULLUP_I_0P25_UA = 0x0F, - HS_PULLUP_I_0P125_UA = 0x17, - HS_PULLUP_I_OFF, -}; - -enum mbhc_moisture_rref { - R_OFF, - R_24_KOHM, - R_84_KOHM, - R_184_KOHM, -}; - -struct wcd_mbhc_config { - bool read_fw_bin; - void *calibration; - bool detect_extn_cable; - bool mono_stero_detection; - bool (*swap_gnd_mic)(struct snd_soc_codec *codec, bool active); - bool hs_ext_micbias; - bool gnd_det_en; - int key_code[WCD_MBHC_KEYCODE_NUM]; - uint32_t linein_th; - bool moisture_en; - int mbhc_micbias; - int anc_micbias; - bool enable_anc_mic_detect; - u32 enable_usbc_analog; - bool moisture_duty_cycle_en; -}; - -struct wcd_mbhc_intr { - int mbhc_sw_intr; - int mbhc_btn_press_intr; - int mbhc_btn_release_intr; - int mbhc_hs_ins_intr; - int mbhc_hs_rem_intr; - int hph_left_ocp; - int hph_right_ocp; -}; - -struct wcd_mbhc_register { - const char *id; - u16 reg; - u8 mask; - u8 offset; - u8 invert; -}; - -struct wcd_mbhc_cb { - void (*bcs_enable) - (struct wcd_mbhc *mbhc, bool bcs_enable); - int (*enable_mb_source)(struct wcd_mbhc *mbhc, bool turn_on); - void (*trim_btn_reg)(struct snd_soc_codec *); - void (*compute_impedance)(struct wcd_mbhc *, uint32_t *, uint32_t *); - void (*set_micbias_value)(struct snd_soc_codec *); - void (*set_auto_zeroing)(struct snd_soc_codec *, bool); - struct firmware_cal * (*get_hwdep_fw_cal)(struct wcd_mbhc *, - enum wcd_cal_type); - void (*set_cap_mode)(struct snd_soc_codec *, bool, bool); - int (*register_notifier)(struct wcd_mbhc *, - struct notifier_block *nblock, - bool enable); - int (*request_irq)(struct snd_soc_codec *, - int, irq_handler_t, const char *, void *); - void (*irq_control)(struct snd_soc_codec *, - int irq, bool enable); - int (*free_irq)(struct snd_soc_codec *, - int irq, void *); - void (*clk_setup)(struct snd_soc_codec *, bool); - int (*map_btn_code_to_num)(struct snd_soc_codec *); - bool (*lock_sleep)(struct wcd_mbhc *, bool); - bool (*micbias_enable_status)(struct wcd_mbhc *, int); - void (*mbhc_bias)(struct snd_soc_codec *, bool); - void (*mbhc_common_micb_ctrl)(struct snd_soc_codec *, - int event, bool); - void (*micb_internal)(struct snd_soc_codec *, - int micb_num, bool); - bool (*hph_pa_on_status)(struct snd_soc_codec *); - void (*set_btn_thr)(struct snd_soc_codec *, s16 *, s16 *, - int num_btn, bool); - void (*hph_pull_up_control)(struct snd_soc_codec *, - enum mbhc_hs_pullup_iref); - int (*mbhc_micbias_control)(struct snd_soc_codec *, int, int req); - void (*mbhc_micb_ramp_control)(struct snd_soc_codec *, bool); - void (*skip_imped_detect)(struct snd_soc_codec *); - bool (*extn_use_mb)(struct snd_soc_codec *); - int (*mbhc_micb_ctrl_thr_mic)(struct snd_soc_codec *, int, bool); - void (*mbhc_gnd_det_ctrl)(struct snd_soc_codec *, bool); - void (*hph_pull_down_ctrl)(struct snd_soc_codec *, bool); - void (*mbhc_moisture_config)(struct wcd_mbhc *); - bool (*hph_register_recovery)(struct wcd_mbhc *); - void (*update_anc_state)(struct snd_soc_codec *codec, - bool enable, int anc_num); - bool (*is_anc_on)(struct wcd_mbhc *mbhc); - void (*hph_pull_up_control_v2)(struct snd_soc_codec *, int); - bool (*mbhc_get_moisture_status)(struct wcd_mbhc *); - void (*mbhc_moisture_polling_ctrl)(struct wcd_mbhc *, bool); - void (*mbhc_moisture_detect_en)(struct wcd_mbhc *, bool); -}; - -struct wcd_mbhc_fn { - irqreturn_t (*wcd_mbhc_hs_ins_irq)(int irq, void *data); - irqreturn_t (*wcd_mbhc_hs_rem_irq)(int irq, void *data); - void (*wcd_mbhc_detect_plug_type)(struct wcd_mbhc *mbhc); - bool (*wcd_mbhc_detect_anc_plug_type)(struct wcd_mbhc *mbhc); - void (*wcd_cancel_hs_detect_plug)(struct wcd_mbhc *mbhc, - struct work_struct *work); -}; - -struct wcd_mbhc { - /* Delayed work to report long button press */ - struct delayed_work mbhc_btn_dwork; - int buttons_pressed; - struct wcd_mbhc_config *mbhc_cfg; - const struct wcd_mbhc_cb *mbhc_cb; - - u32 hph_status; /* track headhpone status */ - u8 hphlocp_cnt; /* headphone left ocp retry */ - u8 hphrocp_cnt; /* headphone right ocp retry */ - - wait_queue_head_t wait_btn_press; - bool is_btn_press; - u8 current_plug; - bool in_swch_irq_handler; - bool hphl_swh; /*track HPHL switch NC / NO */ - bool gnd_swh; /*track GND switch NC / NO */ - u32 hs_thr; - u32 hph_thr; - u32 micb_mv; - u32 swap_thr; - u32 moist_vref; - u32 moist_iref; - u32 moist_rref; - u8 micbias1_cap_mode; /* track ext cap setting */ - u8 micbias2_cap_mode; /* track ext cap setting */ - bool hs_detect_work_stop; - bool micbias_enable; - bool btn_press_intr; - bool is_hs_recording; - bool is_extn_cable; - bool skip_imped_detection; - bool is_btn_already_regd; - bool extn_cable_hph_rem; - - struct snd_soc_codec *codec; - /* Work to perform MBHC Firmware Read */ - struct delayed_work mbhc_firmware_dwork; - const struct firmware *mbhc_fw; - struct firmware_cal *mbhc_cal; - - /* track PA/DAC state to sync with userspace */ - unsigned long hph_pa_dac_state; - unsigned long hph_anc_state; - unsigned long event_state; - unsigned long jiffies_atreport; - - /* impedance of hphl and hphr */ - uint32_t zl, zr; - bool impedance_detect; - - /* Holds type of Headset - Mono/Stereo */ - enum wcd_mbhc_hph_type hph_type; - - struct snd_soc_jack headset_jack; - struct snd_soc_jack button_jack; - struct mutex codec_resource_lock; - - /* Holds codec specific interrupt mapping */ - const struct wcd_mbhc_intr *intr_ids; - - /* Work to correct accessory type */ - struct work_struct correct_plug_swch; - struct notifier_block nblock; - - struct wcd_mbhc_register *wcd_mbhc_regs; - - struct completion btn_press_compl; - struct mutex hphl_pa_lock; - struct mutex hphr_pa_lock; - bool deinit_in_progress; - - /* Holds mbhc detection method - ADC/Legacy */ - unsigned int mbhc_detection_logic; - - unsigned long intr_status; - bool is_hph_ocp_pending; - - struct wcd_mbhc_fn *mbhc_fn; - bool force_linein; - struct device_node *fsa_np; - struct notifier_block fsa_nb; -}; - -void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type); -void wcd_mbhc_hs_elec_irq(struct wcd_mbhc *mbhc, int irq_type, bool enable); -void wcd_mbhc_elec_hs_report_unplug(struct wcd_mbhc *mbhc); -bool wcd_swch_level_remove(struct wcd_mbhc *mbhc); -void wcd_enable_curr_micbias(const struct wcd_mbhc *mbhc, - const enum wcd_mbhc_cs_mb_en_flag cs_mb_en); -void wcd_mbhc_jack_report(struct wcd_mbhc *mbhc, - struct snd_soc_jack *jack, int status, int mask); -int wcd_cancel_btn_work(struct wcd_mbhc *mbhc); -int wcd_mbhc_get_button_mask(struct wcd_mbhc *mbhc); -void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, - enum snd_jack_types jack_type); - -#endif /* __WCD_MBHC_V2_H__ */ diff --git a/techpack/audio/4.0/include/asoc/wcd934x_registers.h b/techpack/audio/4.0/include/asoc/wcd934x_registers.h deleted file mode 100644 index e529f6415650..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd934x_registers.h +++ /dev/null @@ -1,1840 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD934X_REGISTERS_H -#define _WCD934X_REGISTERS_H - -#define WCD934X_PAGE_SIZE 256 -#define WCD934X_NUM_PAGES 256 - -extern const u8 * const wcd934x_reg[WCD934X_NUM_PAGES]; - -enum { - WCD934X_PAGE_0 = 0, - WCD934X_PAGE_1, - WCD934X_PAGE_2, - WCD934X_PAGE_4 = 4, - WCD934X_PAGE_5, - WCD934X_PAGE_6, - WCD934X_PAGE_7, - WCD934X_PAGE_10 = 0xA, - WCD934X_PAGE_11, - WCD934X_PAGE_12, - WCD934X_PAGE_13, - WCD934X_PAGE_14, - WCD934X_PAGE_15, - WCD934X_PAGE_0x50, - WCD934X_PAGE_0X80, -}; - -enum { - WCD934X_WRITE = 0, - WCD934X_READ, - WCD934X_READ_WRITE, -}; - -/* Page-0 Registers */ -#define WCD934X_PAGE0_PAGE_REGISTER 0x0000 -#define WCD934X_CODEC_RPM_CLK_BYPASS 0x0001 -#define WCD934X_CODEC_RPM_CLK_GATE 0x0002 -#define WCD934X_CODEC_RPM_CLK_MCLK_CFG 0x0003 -#define WCD934X_CODEC_RPM_CLK_MCLK2_CFG 0x0004 -#define WCD934X_CODEC_RPM_I2S_DSD_CLK_SEL 0x0005 -#define WCD934X_CODEC_RPM_RST_CTL 0x0009 -#define WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL 0x0011 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0 0x0021 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE1 0x0022 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE2 0x0023 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE3 0x0024 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_CTL 0x0025 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_TEST0 0x0026 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_TEST1 0x0027 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT0 0x0029 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 0x002a -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 0x002b -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT3 0x002c -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT4 0x002d -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT5 0x002e -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT6 0x002f -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT7 0x0030 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT8 0x0031 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT9 0x0032 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT10 0x0033 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT11 0x0034 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT12 0x0035 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT13 0x0036 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14 0x0037 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT15 0x0038 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_STATUS 0x0039 -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO 0x003a -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_1 0x003b -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_2 0x003c -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_3 0x003d -#define WCD934X_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL 0x003e -#define WCD934X_CHIP_TIER_CTRL_SLNQ_WAIT_STATE_CTL 0x003f -#define WCD934X_CHIP_TIER_CTRL_I2C_ACTIVE 0x0040 -#define WCD934X_CHIP_TIER_CTRL_ALT_FUNC_EN 0x0041 -#define WCD934X_CHIP_TIER_CTRL_GPIO_CTL_OE 0x0042 -#define WCD934X_CHIP_TIER_CTRL_GPIO_CTL_DATA 0x0043 -#define WCD934X_DATA_HUB_RX0_CFG 0x0051 -#define WCD934X_DATA_HUB_RX1_CFG 0x0052 -#define WCD934X_DATA_HUB_RX2_CFG 0x0053 -#define WCD934X_DATA_HUB_RX3_CFG 0x0054 -#define WCD934X_DATA_HUB_RX4_CFG 0x0055 -#define WCD934X_DATA_HUB_RX5_CFG 0x0056 -#define WCD934X_DATA_HUB_RX6_CFG 0x0057 -#define WCD934X_DATA_HUB_RX7_CFG 0x0058 -#define WCD934X_DATA_HUB_SB_TX0_INP_CFG 0x0061 -#define WCD934X_DATA_HUB_SB_TX1_INP_CFG 0x0062 -#define WCD934X_DATA_HUB_SB_TX2_INP_CFG 0x0063 -#define WCD934X_DATA_HUB_SB_TX3_INP_CFG 0x0064 -#define WCD934X_DATA_HUB_SB_TX4_INP_CFG 0x0065 -#define WCD934X_DATA_HUB_SB_TX5_INP_CFG 0x0066 -#define WCD934X_DATA_HUB_SB_TX6_INP_CFG 0x0067 -#define WCD934X_DATA_HUB_SB_TX7_INP_CFG 0x0068 -#define WCD934X_DATA_HUB_SB_TX8_INP_CFG 0x0069 -#define WCD934X_DATA_HUB_SB_TX9_INP_CFG 0x006a -#define WCD934X_DATA_HUB_SB_TX10_INP_CFG 0x006b -#define WCD934X_DATA_HUB_SB_TX11_INP_CFG 0x006c -#define WCD934X_DATA_HUB_SB_TX13_INP_CFG 0x006e -#define WCD934X_DATA_HUB_SB_TX14_INP_CFG 0x006f -#define WCD934X_DATA_HUB_SB_TX15_INP_CFG 0x0070 -#define WCD934X_DATA_HUB_I2S_TX0_CFG 0x0071 -#define WCD934X_DATA_HUB_I2S_TX1_0_CFG 0x0073 -#define WCD934X_DATA_HUB_I2S_TX1_1_CFG 0x0074 -#define WCD934X_DATA_HUB_I2S_0_CTL 0x0081 -#define WCD934X_DATA_HUB_I2S_1_CTL 0x0082 -#define WCD934X_DATA_HUB_I2S_2_CTL 0x0083 -#define WCD934X_DATA_HUB_I2S_3_CTL 0x0084 -#define WCD934X_DATA_HUB_I2S_CLKSRC_CTL 0x0085 -#define WCD934X_DATA_HUB_I2S_COMMON_CTL 0x0086 -#define WCD934X_DATA_HUB_I2S_0_TDM_CTL 0x0087 -#define WCD934X_DATA_HUB_I2S_STATUS 0x0088 -#define WCD934X_DMA_RDMA_CTL_0 0x0091 -#define WCD934X_DMA_CH_2_3_CFG_RDMA_0 0x0092 -#define WCD934X_DMA_CH_0_1_CFG_RDMA_0 0x0093 -#define WCD934X_DMA_RDMA_CTL_1 0x0094 -#define WCD934X_DMA_CH_2_3_CFG_RDMA_1 0x0095 -#define WCD934X_DMA_CH_0_1_CFG_RDMA_1 0x0096 -#define WCD934X_DMA_RDMA_CTL_2 0x0097 -#define WCD934X_DMA_CH_2_3_CFG_RDMA_2 0x0098 -#define WCD934X_DMA_CH_0_1_CFG_RDMA_2 0x0099 -#define WCD934X_DMA_RDMA_CTL_3 0x009A -#define WCD934X_DMA_CH_2_3_CFG_RDMA_3 0x009B -#define WCD934X_DMA_CH_0_1_CFG_RDMA_3 0x009C -#define WCD934X_DMA_RDMA_CTL_4 0x009D -#define WCD934X_DMA_CH_2_3_CFG_RDMA_4 0x009E -#define WCD934X_DMA_CH_0_1_CFG_RDMA_4 0x009F -#define WCD934X_DMA_RDMA4_PRT_CFG 0x00b1 -#define WCD934X_DMA_RDMA_SBTX0_7_CFG 0x00b9 -#define WCD934X_DMA_RDMA_SBTX8_11_CFG 0x00ba -#define WCD934X_DMA_WDMA_CTL_0 0x00c1 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_0 0x00c2 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_0 0x00c3 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_0 0x00c4 -#define WCD934X_DMA_WDMA_CTL_1 0x00C6 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_1 0x00C7 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_1 0x00C8 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_1 0x00C9 -#define WCD934X_DMA_WDMA_CTL_2 0x00CB -#define WCD934X_DMA_CH_4_5_CFG_WDMA_2 0x00CC -#define WCD934X_DMA_CH_2_3_CFG_WDMA_2 0x00CD -#define WCD934X_DMA_CH_0_1_CFG_WDMA_2 0x00CE -#define WCD934X_DMA_WDMA_CTL_3 0x00D0 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_3 0x00D1 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_3 0x00D2 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_3 0x00D3 -#define WCD934X_DMA_WDMA_CTL_4 0x00D5 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_4 0x00D6 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_4 0x00D7 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_4 0x00D8 -#define WCD934X_DMA_WDMA0_PRT_CFG 0x00E1 -#define WCD934X_DMA_WDMA3_PRT_CFG 0x00E2 -#define WCD934X_DMA_WDMA4_PRT0_3_CFG 0x00E3 -#define WCD934X_DMA_WDMA4_PRT4_7_CFG 0x00E4 -#define WCD934X_PAGE1_PAGE_REGISTER 0x0100 -#define WCD934X_CPE_FLL_USER_CTL_0 0x0101 -#define WCD934X_CPE_FLL_USER_CTL_1 0x0102 -#define WCD934X_CPE_FLL_USER_CTL_2 0x0103 -#define WCD934X_CPE_FLL_USER_CTL_3 0x0104 -#define WCD934X_CPE_FLL_USER_CTL_4 0x0105 -#define WCD934X_CPE_FLL_USER_CTL_5 0x0106 -#define WCD934X_CPE_FLL_USER_CTL_6 0x0107 -#define WCD934X_CPE_FLL_USER_CTL_7 0x0108 -#define WCD934X_CPE_FLL_USER_CTL_8 0x0109 -#define WCD934X_CPE_FLL_USER_CTL_9 0x010a -#define WCD934X_CPE_FLL_L_VAL_CTL_0 0x010b -#define WCD934X_CPE_FLL_L_VAL_CTL_1 0x010c -#define WCD934X_CPE_FLL_DSM_FRAC_CTL_0 0x010d -#define WCD934X_CPE_FLL_DSM_FRAC_CTL_1 0x010e -#define WCD934X_CPE_FLL_CONFIG_CTL_0 0x010f -#define WCD934X_CPE_FLL_CONFIG_CTL_1 0x0110 -#define WCD934X_CPE_FLL_CONFIG_CTL_2 0x0111 -#define WCD934X_CPE_FLL_CONFIG_CTL_3 0x0112 -#define WCD934X_CPE_FLL_CONFIG_CTL_4 0x0113 -#define WCD934X_CPE_FLL_TEST_CTL_0 0x0114 -#define WCD934X_CPE_FLL_TEST_CTL_1 0x0115 -#define WCD934X_CPE_FLL_TEST_CTL_2 0x0116 -#define WCD934X_CPE_FLL_TEST_CTL_3 0x0117 -#define WCD934X_CPE_FLL_TEST_CTL_4 0x0118 -#define WCD934X_CPE_FLL_TEST_CTL_5 0x0119 -#define WCD934X_CPE_FLL_TEST_CTL_6 0x011a -#define WCD934X_CPE_FLL_TEST_CTL_7 0x011b -#define WCD934X_CPE_FLL_FREQ_CTL_0 0x011c -#define WCD934X_CPE_FLL_FREQ_CTL_1 0x011d -#define WCD934X_CPE_FLL_FREQ_CTL_2 0x011e -#define WCD934X_CPE_FLL_FREQ_CTL_3 0x011f -#define WCD934X_CPE_FLL_SSC_CTL_0 0x0120 -#define WCD934X_CPE_FLL_SSC_CTL_1 0x0121 -#define WCD934X_CPE_FLL_SSC_CTL_2 0x0122 -#define WCD934X_CPE_FLL_SSC_CTL_3 0x0123 -#define WCD934X_CPE_FLL_FLL_MODE 0x0124 -#define WCD934X_CPE_FLL_STATUS_0 0x0125 -#define WCD934X_CPE_FLL_STATUS_1 0x0126 -#define WCD934X_CPE_FLL_STATUS_2 0x0127 -#define WCD934X_CPE_FLL_STATUS_3 0x0128 -#define WCD934X_I2S_FLL_USER_CTL_0 0x0141 -#define WCD934X_I2S_FLL_USER_CTL_1 0x0142 -#define WCD934X_I2S_FLL_USER_CTL_2 0x0143 -#define WCD934X_I2S_FLL_USER_CTL_3 0x0144 -#define WCD934X_I2S_FLL_USER_CTL_4 0x0145 -#define WCD934X_I2S_FLL_USER_CTL_5 0x0146 -#define WCD934X_I2S_FLL_USER_CTL_6 0x0147 -#define WCD934X_I2S_FLL_USER_CTL_7 0x0148 -#define WCD934X_I2S_FLL_USER_CTL_8 0x0149 -#define WCD934X_I2S_FLL_USER_CTL_9 0x014a -#define WCD934X_I2S_FLL_L_VAL_CTL_0 0x014b -#define WCD934X_I2S_FLL_L_VAL_CTL_1 0x014c -#define WCD934X_I2S_FLL_DSM_FRAC_CTL_0 0x014d -#define WCD934X_I2S_FLL_DSM_FRAC_CTL_1 0x014e -#define WCD934X_I2S_FLL_CONFIG_CTL_0 0x014f -#define WCD934X_I2S_FLL_CONFIG_CTL_1 0x0150 -#define WCD934X_I2S_FLL_CONFIG_CTL_2 0x0151 -#define WCD934X_I2S_FLL_CONFIG_CTL_3 0x0152 -#define WCD934X_I2S_FLL_CONFIG_CTL_4 0x0153 -#define WCD934X_I2S_FLL_TEST_CTL_0 0x0154 -#define WCD934X_I2S_FLL_TEST_CTL_1 0x0155 -#define WCD934X_I2S_FLL_TEST_CTL_2 0x0156 -#define WCD934X_I2S_FLL_TEST_CTL_3 0x0157 -#define WCD934X_I2S_FLL_TEST_CTL_4 0x0158 -#define WCD934X_I2S_FLL_TEST_CTL_5 0x0159 -#define WCD934X_I2S_FLL_TEST_CTL_6 0x015a -#define WCD934X_I2S_FLL_TEST_CTL_7 0x015b -#define WCD934X_I2S_FLL_FREQ_CTL_0 0x015c -#define WCD934X_I2S_FLL_FREQ_CTL_1 0x015d -#define WCD934X_I2S_FLL_FREQ_CTL_2 0x015e -#define WCD934X_I2S_FLL_FREQ_CTL_3 0x015f -#define WCD934X_I2S_FLL_SSC_CTL_0 0x0160 -#define WCD934X_I2S_FLL_SSC_CTL_1 0x0161 -#define WCD934X_I2S_FLL_SSC_CTL_2 0x0162 -#define WCD934X_I2S_FLL_SSC_CTL_3 0x0163 -#define WCD934X_I2S_FLL_FLL_MODE 0x0164 -#define WCD934X_I2S_FLL_STATUS_0 0x0165 -#define WCD934X_I2S_FLL_STATUS_1 0x0166 -#define WCD934X_I2S_FLL_STATUS_2 0x0167 -#define WCD934X_I2S_FLL_STATUS_3 0x0168 -#define WCD934X_SB_FLL_USER_CTL_0 0x0181 -#define WCD934X_SB_FLL_USER_CTL_1 0x0182 -#define WCD934X_SB_FLL_USER_CTL_2 0x0183 -#define WCD934X_SB_FLL_USER_CTL_3 0x0184 -#define WCD934X_SB_FLL_USER_CTL_4 0x0185 -#define WCD934X_SB_FLL_USER_CTL_5 0x0186 -#define WCD934X_SB_FLL_USER_CTL_6 0x0187 -#define WCD934X_SB_FLL_USER_CTL_7 0x0188 -#define WCD934X_SB_FLL_USER_CTL_8 0x0189 -#define WCD934X_SB_FLL_USER_CTL_9 0x018a -#define WCD934X_SB_FLL_L_VAL_CTL_0 0x018b -#define WCD934X_SB_FLL_L_VAL_CTL_1 0x018c -#define WCD934X_SB_FLL_DSM_FRAC_CTL_0 0x018d -#define WCD934X_SB_FLL_DSM_FRAC_CTL_1 0x018e -#define WCD934X_SB_FLL_CONFIG_CTL_0 0x018f -#define WCD934X_SB_FLL_CONFIG_CTL_1 0x0190 -#define WCD934X_SB_FLL_CONFIG_CTL_2 0x0191 -#define WCD934X_SB_FLL_CONFIG_CTL_3 0x0192 -#define WCD934X_SB_FLL_CONFIG_CTL_4 0x0193 -#define WCD934X_SB_FLL_TEST_CTL_0 0x0194 -#define WCD934X_SB_FLL_TEST_CTL_1 0x0195 -#define WCD934X_SB_FLL_TEST_CTL_2 0x0196 -#define WCD934X_SB_FLL_TEST_CTL_3 0x0197 -#define WCD934X_SB_FLL_TEST_CTL_4 0x0198 -#define WCD934X_SB_FLL_TEST_CTL_5 0x0199 -#define WCD934X_SB_FLL_TEST_CTL_6 0x019a -#define WCD934X_SB_FLL_TEST_CTL_7 0x019b -#define WCD934X_SB_FLL_FREQ_CTL_0 0x019c -#define WCD934X_SB_FLL_FREQ_CTL_1 0x019d -#define WCD934X_SB_FLL_FREQ_CTL_2 0x019e -#define WCD934X_SB_FLL_FREQ_CTL_3 0x019f -#define WCD934X_SB_FLL_SSC_CTL_0 0x01a0 -#define WCD934X_SB_FLL_SSC_CTL_1 0x01a1 -#define WCD934X_SB_FLL_SSC_CTL_2 0x01a2 -#define WCD934X_SB_FLL_SSC_CTL_3 0x01a3 -#define WCD934X_SB_FLL_FLL_MODE 0x01a4 -#define WCD934X_SB_FLL_STATUS_0 0x01a5 -#define WCD934X_SB_FLL_STATUS_1 0x01a6 -#define WCD934X_SB_FLL_STATUS_2 0x01a7 -#define WCD934X_SB_FLL_STATUS_3 0x01a8 -#define WCD934X_PAGE2_PAGE_REGISTER 0x0200 -#define WCD934X_CPE_SS_CPE_CTL 0x0201 -#define WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0 0x0202 -#define WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_1 0x0203 -#define WCD934X_CPE_SS_PWR_CPEFLL_CTL 0x0204 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0 0x0205 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1 0x0206 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_OVERRIDE 0x0207 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0 0x0208 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1 0x0209 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2 0x020a -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3 0x020b -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4 0x020c -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_5 0x020d -#define WCD934X_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN 0x020e -#define WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL 0x020f -#define WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL 0x0210 -#define WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL1 0x0211 -#define WCD934X_CPE_SS_US_BUF_INT_PERIOD 0x0212 -#define WCD934X_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD 0x0213 -#define WCD934X_CPE_SS_SVA_CFG 0x0214 -#define WCD934X_CPE_SS_US_CFG 0x0215 -#define WCD934X_CPE_SS_MAD_CTL 0x0216 -#define WCD934X_CPE_SS_CPAR_CTL 0x0217 -#define WCD934X_CPE_SS_DMIC0_CTL 0x0218 -#define WCD934X_CPE_SS_DMIC1_CTL 0x0219 -#define WCD934X_CPE_SS_DMIC2_CTL 0x021a -#define WCD934X_CPE_SS_DMIC_CFG 0x021b -#define WCD934X_CPE_SS_CPAR_CFG 0x021c -#define WCD934X_CPE_SS_WDOG_CFG 0x021d -#define WCD934X_CPE_SS_BACKUP_INT 0x021e -#define WCD934X_CPE_SS_STATUS 0x021f -#define WCD934X_CPE_SS_CPE_OCD_CFG 0x0220 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A 0x0221 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B 0x0222 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_1A 0x0223 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_1B 0x0224 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0A 0x0225 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0B 0x0226 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1A 0x0227 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B 0x0228 -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0A 0x0229 -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0B 0x022a -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1A 0x022b -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1B 0x022c -#define WCD934X_SOC_MAD_MAIN_CTL_1 0x0281 -#define WCD934X_SOC_MAD_MAIN_CTL_2 0x0282 -#define WCD934X_SOC_MAD_AUDIO_CTL_1 0x0283 -#define WCD934X_SOC_MAD_AUDIO_CTL_2 0x0284 -#define WCD934X_SOC_MAD_AUDIO_CTL_3 0x0285 -#define WCD934X_SOC_MAD_AUDIO_CTL_4 0x0286 -#define WCD934X_SOC_MAD_AUDIO_CTL_5 0x0287 -#define WCD934X_SOC_MAD_AUDIO_CTL_6 0x0288 -#define WCD934X_SOC_MAD_AUDIO_CTL_7 0x0289 -#define WCD934X_SOC_MAD_AUDIO_CTL_8 0x028a -#define WCD934X_SOC_MAD_AUDIO_IIR_CTL_PTR 0x028b -#define WCD934X_SOC_MAD_AUDIO_IIR_CTL_VAL 0x028c -#define WCD934X_SOC_MAD_ULTR_CTL_1 0x028d -#define WCD934X_SOC_MAD_ULTR_CTL_2 0x028e -#define WCD934X_SOC_MAD_ULTR_CTL_3 0x028f -#define WCD934X_SOC_MAD_ULTR_CTL_4 0x0290 -#define WCD934X_SOC_MAD_ULTR_CTL_5 0x0291 -#define WCD934X_SOC_MAD_ULTR_CTL_6 0x0292 -#define WCD934X_SOC_MAD_ULTR_CTL_7 0x0293 -#define WCD934X_SOC_MAD_BEACON_CTL_1 0x0294 -#define WCD934X_SOC_MAD_BEACON_CTL_2 0x0295 -#define WCD934X_SOC_MAD_BEACON_CTL_3 0x0296 -#define WCD934X_SOC_MAD_BEACON_CTL_4 0x0297 -#define WCD934X_SOC_MAD_BEACON_CTL_5 0x0298 -#define WCD934X_SOC_MAD_BEACON_CTL_6 0x0299 -#define WCD934X_SOC_MAD_BEACON_CTL_7 0x029a -#define WCD934X_SOC_MAD_BEACON_CTL_8 0x029b -#define WCD934X_SOC_MAD_BEACON_IIR_CTL_PTR 0x029c -#define WCD934X_SOC_MAD_BEACON_IIR_CTL_VAL 0x029d -#define WCD934X_SOC_MAD_INP_SEL 0x029e -#define WCD934X_PAGE4_PAGE_REGISTER 0x0400 -#define WCD934X_INTR_CFG 0x0401 -#define WCD934X_INTR_CLR_COMMIT 0x0402 -#define WCD934X_INTR_PIN1_MASK0 0x0409 -#define WCD934X_INTR_PIN1_MASK1 0x040a -#define WCD934X_INTR_PIN1_MASK2 0x040b -#define WCD934X_INTR_PIN1_MASK3 0x040c -#define WCD934X_INTR_PIN1_STATUS0 0x0411 -#define WCD934X_INTR_PIN1_STATUS1 0x0412 -#define WCD934X_INTR_PIN1_STATUS2 0x0413 -#define WCD934X_INTR_PIN1_STATUS3 0x0414 -#define WCD934X_INTR_PIN1_CLEAR0 0x0419 -#define WCD934X_INTR_PIN1_CLEAR1 0x041a -#define WCD934X_INTR_PIN1_CLEAR2 0x041b -#define WCD934X_INTR_PIN1_CLEAR3 0x041c -#define WCD934X_INTR_PIN2_MASK3 0x0424 -#define WCD934X_INTR_PIN2_STATUS3 0x042c -#define WCD934X_INTR_PIN2_CLEAR3 0x0434 -#define WCD934X_INTR_CPESS_SUMRY_MASK2 0x043b -#define WCD934X_INTR_CPESS_SUMRY_MASK3 0x043c -#define WCD934X_INTR_CPESS_SUMRY_STATUS2 0x0443 -#define WCD934X_INTR_CPESS_SUMRY_STATUS3 0x0444 -#define WCD934X_INTR_CPESS_SUMRY_CLEAR2 0x044b -#define WCD934X_INTR_CPESS_SUMRY_CLEAR3 0x044c -#define WCD934X_INTR_LEVEL0 0x0461 -#define WCD934X_INTR_LEVEL1 0x0462 -#define WCD934X_INTR_LEVEL2 0x0463 -#define WCD934X_INTR_LEVEL3 0x0464 -#define WCD934X_INTR_BYPASS0 0x0469 -#define WCD934X_INTR_BYPASS1 0x046a -#define WCD934X_INTR_BYPASS2 0x046b -#define WCD934X_INTR_BYPASS3 0x046c -#define WCD934X_INTR_SET0 0x0471 -#define WCD934X_INTR_SET1 0x0472 -#define WCD934X_INTR_SET2 0x0473 -#define WCD934X_INTR_SET3 0x0474 -#define WCD934X_INTR_CODEC_MISC_MASK 0x04b1 -#define WCD934X_INTR_CODEC_MISC_STATUS 0x04b2 -#define WCD934X_INTR_CODEC_MISC_CLEAR 0x04b3 -#define WCD934X_PAGE5_PAGE_REGISTER 0x0500 -#define WCD934X_SLNQ_DIG_DEVICE 0x0501 -#define WCD934X_SLNQ_DIG_REVISION 0x0502 -#define WCD934X_SLNQ_DIG_H_COMMAND 0x0511 -#define WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_MSB 0x0512 -#define WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_LSB 0x0513 -#define WCD934X_SLNQ_DIG_MASTER_ADDRESS_MSB 0x0514 -#define WCD934X_SLNQ_DIG_MASTER_ADDRESS_LSB 0x0515 -#define WCD934X_SLNQ_DIG_SLAVE_ADDRESS_MSB 0x0516 -#define WCD934X_SLNQ_DIG_SLAVE_ADDRESS_LSB 0x0517 -#define WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_MSB 0x0518 -#define WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_LSB 0x0519 -#define WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_MSB 0x051a -#define WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_LSB 0x051b -#define WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_MSB 0x051c -#define WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_LSB 0x051d -#define WCD934X_SLNQ_DIG_COMM_CTL 0x0520 -#define WCD934X_SLNQ_DIG_FRAME_CTRL 0x0542 -#define WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH1_2 0x055c -#define WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH3_4 0x055d -#define WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH5 0x055e -#define WCD934X_SLNQ_DIG_SW_EVENT_RD 0x0561 -#define WCD934X_SLNQ_DIG_SW_EVENT_CTRL 0x0562 -#define WCD934X_SLNQ_DIG_PDM_SELECT_1 0x0563 -#define WCD934X_SLNQ_DIG_PDM_SELECT_2 0x0564 -#define WCD934X_SLNQ_DIG_PDM_SELECT_3 0x0565 -#define WCD934X_SLNQ_DIG_PDM_SAMPLING_FREQ 0x0566 -#define WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_CTL 0x0569 -#define WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_SEL 0x056a -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_MSB 0x056b -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_LSB 0x056c -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_MSB 0x056d -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_LSB 0x056e -#define WCD934X_SLNQ_DIG_RAM_CNTRL 0x0571 -#define WCD934X_SLNQ_DIG_SRAM_BANK 0x0572 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_0 0x0573 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1 0x0574 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2 0x0575 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3 0x0576 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_4 0x0577 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_5 0x0578 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_6 0x0579 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_7 0x057a -#define WCD934X_SLNQ_DIG_SRAM_BYTE_8 0x057b -#define WCD934X_SLNQ_DIG_SRAM_BYTE_9 0x057c -#define WCD934X_SLNQ_DIG_SRAM_BYTE_A 0x057d -#define WCD934X_SLNQ_DIG_SRAM_BYTE_B 0x057e -#define WCD934X_SLNQ_DIG_SRAM_BYTE_C 0x057f -#define WCD934X_SLNQ_DIG_SRAM_BYTE_D 0x0580 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_E 0x0581 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_F 0x0582 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_10 0x0583 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_11 0x0584 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_12 0x0585 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_13 0x0586 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_14 0x0587 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_15 0x0588 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_16 0x0589 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_17 0x058a -#define WCD934X_SLNQ_DIG_SRAM_BYTE_18 0x058b -#define WCD934X_SLNQ_DIG_SRAM_BYTE_19 0x058c -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1A 0x058d -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1B 0x058e -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1C 0x058f -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1D 0x0590 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1E 0x0591 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1F 0x0592 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_20 0x0593 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_21 0x0594 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_22 0x0595 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_23 0x0596 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_24 0x0597 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_25 0x0598 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_26 0x0599 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_27 0x059a -#define WCD934X_SLNQ_DIG_SRAM_BYTE_28 0x059b -#define WCD934X_SLNQ_DIG_SRAM_BYTE_29 0x059c -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2A 0x059d -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2B 0x059e -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2C 0x059f -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2D 0x05a0 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2E 0x05a1 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2F 0x05a2 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_30 0x05a3 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_31 0x05a4 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_32 0x05a5 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_33 0x05a6 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_34 0x05a7 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_35 0x05a8 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_36 0x05a9 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_37 0x05aa -#define WCD934X_SLNQ_DIG_SRAM_BYTE_38 0x05ab -#define WCD934X_SLNQ_DIG_SRAM_BYTE_39 0x05ac -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3A 0x05ad -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3B 0x05ae -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3C 0x05af -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3D 0x05b0 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3E 0x05b1 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3F 0x05b2 -#define WCD934X_SLNQ_DIG_TOP_CTRL1 0x05b3 -#define WCD934X_SLNQ_DIG_TOP_CTRL2 0x05b4 -#define WCD934X_SLNQ_DIG_PDM_CTRL 0x05b5 -#define WCD934X_SLNQ_DIG_PDM_MUTE_CTRL 0x05b6 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_CTRL 0x05b7 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_STATUS 0x05b8 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_FS 0x05b9 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_IN_SEL 0x05ba -#define WCD934X_SLNQ_DIG_GPOUT_ENABLE 0x05bb -#define WCD934X_SLNQ_DIG_GPOUT_VAL 0x05bc -#define WCD934X_SLNQ_DIG_ANA_INTERRUPT_MASK 0x05be -#define WCD934X_SLNQ_DIG_ANA_INTERRUPT_STATUS 0x05bf -#define WCD934X_SLNQ_DIG_ANA_INTERRUPT_CLR 0x05c0 -#define WCD934X_SLNQ_DIG_IP_TESTING 0x05c1 -#define WCD934X_SLNQ_DIG_INTERRUPT_CNTRL 0x05e3 -#define WCD934X_SLNQ_DIG_INTERRUPT_CNT 0x05e9 -#define WCD934X_SLNQ_DIG_INTERRUPT_CNT_MSB 0x05eb -#define WCD934X_SLNQ_DIG_INTERRUPT_CNT_LSB 0x05ec -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK0 0x05f1 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK1 0x05f2 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK2 0x05f3 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK3 0x05f4 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK4 0x05f5 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS0 0x05f6 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS1 0x05f7 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS2 0x05f8 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS3 0x05f9 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS4 0x05fa -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR0 0x05fb -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR1 0x05fc -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR2 0x05fd -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR3 0x05fe -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR4 0x05ff -#define WCD934X_ANA_PAGE_REGISTER 0x0600 -#define WCD934X_ANA_BIAS 0x0601 -#define WCD934X_ANA_RCO 0x0603 -#define WCD934X_ANA_PAGE6_SPARE2 0x0604 -#define WCD934X_ANA_PAGE6_SPARE3 0x0605 -#define WCD934X_ANA_BUCK_CTL 0x0606 -#define WCD934X_ANA_BUCK_STATUS 0x0607 -#define WCD934X_ANA_RX_SUPPLIES 0x0608 -#define WCD934X_ANA_HPH 0x0609 -#define WCD934X_ANA_EAR 0x060a -#define WCD934X_ANA_LO_1_2 0x060b -#define WCD934X_ANA_MAD_SETUP 0x060d -#define WCD934X_ANA_AMIC1 0x060e -#define WCD934X_ANA_AMIC2 0x060f -#define WCD934X_ANA_AMIC3 0x0610 -#define WCD934X_ANA_AMIC4 0x0611 -#define WCD934X_ANA_MBHC_MECH 0x0614 -#define WCD934X_ANA_MBHC_ELECT 0x0615 -#define WCD934X_ANA_MBHC_ZDET 0x0616 -#define WCD934X_ANA_MBHC_RESULT_1 0x0617 -#define WCD934X_ANA_MBHC_RESULT_2 0x0618 -#define WCD934X_ANA_MBHC_RESULT_3 0x0619 -#define WCD934X_ANA_MBHC_BTN0 0x061a -#define WCD934X_ANA_MBHC_BTN1 0x061b -#define WCD934X_ANA_MBHC_BTN2 0x061c -#define WCD934X_ANA_MBHC_BTN3 0x061d -#define WCD934X_ANA_MBHC_BTN4 0x061e -#define WCD934X_ANA_MBHC_BTN5 0x061f -#define WCD934X_ANA_MBHC_BTN6 0x0620 -#define WCD934X_ANA_MBHC_BTN7 0x0621 -#define WCD934X_ANA_MICB1 0x0622 -#define WCD934X_ANA_MICB2 0x0623 -#define WCD934X_ANA_MICB2_RAMP 0x0624 -#define WCD934X_ANA_MICB3 0x0625 -#define WCD934X_ANA_MICB4 0x0626 -#define WCD934X_ANA_VBADC 0x0627 -#define WCD934X_BIAS_CTL 0x0628 -#define WCD934X_BIAS_VBG_FINE_ADJ 0x0629 -#define WCD934X_RCO_CTRL_1 0x062e -#define WCD934X_RCO_CTRL_2 0x062f -#define WCD934X_RCO_CAL 0x0630 -#define WCD934X_RCO_CAL_1 0x0631 -#define WCD934X_RCO_CAL_2 0x0632 -#define WCD934X_RCO_TEST_CTRL 0x0633 -#define WCD934X_RCO_CAL_OUT_1 0x0634 -#define WCD934X_RCO_CAL_OUT_2 0x0635 -#define WCD934X_RCO_CAL_OUT_3 0x0636 -#define WCD934X_RCO_CAL_OUT_4 0x0637 -#define WCD934X_RCO_CAL_OUT_5 0x0638 -#define WCD934X_SIDO_MODE_1 0x063a -#define WCD934X_SIDO_MODE_2 0x063b -#define WCD934X_SIDO_MODE_3 0x063c -#define WCD934X_SIDO_MODE_4 0x063d -#define WCD934X_SIDO_VCL_1 0x063e -#define WCD934X_SIDO_VCL_2 0x063f -#define WCD934X_SIDO_VCL_3 0x0640 -#define WCD934X_SIDO_CCL_1 0x0641 -#define WCD934X_SIDO_CCL_2 0x0642 -#define WCD934X_SIDO_CCL_3 0x0643 -#define WCD934X_SIDO_CCL_4 0x0644 -#define WCD934X_SIDO_CCL_5 0x0645 -#define WCD934X_SIDO_CCL_6 0x0646 -#define WCD934X_SIDO_CCL_7 0x0647 -#define WCD934X_SIDO_CCL_8 0x0648 -#define WCD934X_SIDO_CCL_9 0x0649 -#define WCD934X_SIDO_CCL_10 0x064a -#define WCD934X_SIDO_FILTER_1 0x064b -#define WCD934X_SIDO_FILTER_2 0x064c -#define WCD934X_SIDO_DRIVER_1 0x064d -#define WCD934X_SIDO_DRIVER_2 0x064e -#define WCD934X_SIDO_DRIVER_3 0x064f -#define WCD934X_SIDO_CAL_CODE_EXT_1 0x0650 -#define WCD934X_SIDO_CAL_CODE_EXT_2 0x0651 -#define WCD934X_SIDO_CAL_CODE_OUT_1 0x0652 -#define WCD934X_SIDO_CAL_CODE_OUT_2 0x0653 -#define WCD934X_SIDO_TEST_1 0x0654 -#define WCD934X_SIDO_TEST_2 0x0655 -#define WCD934X_MBHC_CTL_CLK 0x0656 -#define WCD934X_MBHC_CTL_ANA 0x0657 -#define WCD934X_MBHC_CTL_SPARE_1 0x0658 -#define WCD934X_MBHC_CTL_SPARE_2 0x0659 -#define WCD934X_MBHC_CTL_BCS 0x065a -#define WCD934X_MBHC_STATUS_SPARE_1 0x065b -#define WCD934X_MBHC_TEST_CTL 0x065c -#define WCD934X_VBADC_SUBBLOCK_EN 0x065d -#define WCD934X_VBADC_IBIAS_FE 0x065e -#define WCD934X_VBADC_BIAS_ADC 0x065f -#define WCD934X_VBADC_FE_CTRL 0x0660 -#define WCD934X_VBADC_ADC_REF 0x0661 -#define WCD934X_VBADC_ADC_IO 0x0662 -#define WCD934X_VBADC_ADC_SAR 0x0663 -#define WCD934X_VBADC_DEBUG 0x0664 -#define WCD934X_LDOH_MODE 0x0667 -#define WCD934X_LDOH_BIAS 0x0668 -#define WCD934X_LDOH_STB_LOADS 0x0669 -#define WCD934X_LDOH_SLOWRAMP 0x066a -#define WCD934X_MICB1_TEST_CTL_1 0x066b -#define WCD934X_MICB1_TEST_CTL_2 0x066c -#define WCD934X_MICB1_TEST_CTL_3 0x066d -#define WCD934X_MICB2_TEST_CTL_1 0x066e -#define WCD934X_MICB2_TEST_CTL_2 0x066f -#define WCD934X_MICB2_TEST_CTL_3 0x0670 -#define WCD934X_MICB3_TEST_CTL_1 0x0671 -#define WCD934X_MICB3_TEST_CTL_2 0x0672 -#define WCD934X_MICB3_TEST_CTL_3 0x0673 -#define WCD934X_MICB4_TEST_CTL_1 0x0674 -#define WCD934X_MICB4_TEST_CTL_2 0x0675 -#define WCD934X_MICB4_TEST_CTL_3 0x0676 -#define WCD934X_TX_COM_ADC_VCM 0x0677 -#define WCD934X_TX_COM_BIAS_ATEST 0x0678 -#define WCD934X_TX_COM_ADC_INT1_IB 0x0679 -#define WCD934X_TX_COM_ADC_INT2_IB 0x067a -#define WCD934X_TX_COM_TXFE_DIV_CTL 0x067b -#define WCD934X_TX_COM_TXFE_DIV_START 0x067c -#define WCD934X_TX_COM_TXFE_DIV_STOP_9P6M 0x067d -#define WCD934X_TX_COM_TXFE_DIV_STOP_12P288M 0x067e -#define WCD934X_TX_1_2_TEST_EN 0x067f -#define WCD934X_TX_1_2_ADC_IB 0x0680 -#define WCD934X_TX_1_2_ATEST_REFCTL 0x0681 -#define WCD934X_TX_1_2_TEST_CTL 0x0682 -#define WCD934X_TX_1_2_TEST_BLK_EN 0x0683 -#define WCD934X_TX_1_2_TXFE_CLKDIV 0x0684 -#define WCD934X_TX_1_2_SAR1_ERR 0x0685 -#define WCD934X_TX_1_2_SAR2_ERR 0x0686 -#define WCD934X_TX_3_4_TEST_EN 0x0687 -#define WCD934X_TX_3_4_ADC_IB 0x0688 -#define WCD934X_TX_3_4_ATEST_REFCTL 0x0689 -#define WCD934X_TX_3_4_TEST_CTL 0x068a -#define WCD934X_TX_3_4_TEST_BLK_EN 0x068b -#define WCD934X_TX_3_4_TXFE_CLKDIV 0x068c -#define WCD934X_TX_3_4_SAR1_ERR 0x068d -#define WCD934X_TX_3_4_SAR2_ERR 0x068e -#define WCD934X_CLASSH_MODE_1 0x0697 -#define WCD934X_CLASSH_MODE_2 0x0698 -#define WCD934X_CLASSH_MODE_3 0x0699 -#define WCD934X_CLASSH_CTRL_VCL_1 0x069a -#define WCD934X_CLASSH_CTRL_VCL_2 0x069b -#define WCD934X_CLASSH_CTRL_CCL_1 0x069c -#define WCD934X_CLASSH_CTRL_CCL_2 0x069d -#define WCD934X_CLASSH_CTRL_CCL_3 0x069e -#define WCD934X_CLASSH_CTRL_CCL_4 0x069f -#define WCD934X_CLASSH_CTRL_CCL_5 0x06a0 -#define WCD934X_CLASSH_BUCK_TMUX_A_D 0x06a1 -#define WCD934X_CLASSH_BUCK_SW_DRV_CNTL 0x06a2 -#define WCD934X_CLASSH_SPARE 0x06a3 -#define WCD934X_FLYBACK_EN 0x06a4 -#define WCD934X_FLYBACK_VNEG_CTRL_1 0x06a5 -#define WCD934X_FLYBACK_VNEG_CTRL_2 0x06a6 -#define WCD934X_FLYBACK_VNEG_CTRL_3 0x06a7 -#define WCD934X_FLYBACK_VNEG_CTRL_4 0x06a8 -#define WCD934X_FLYBACK_VNEG_CTRL_5 0x06a9 -#define WCD934X_FLYBACK_VNEG_CTRL_6 0x06aa -#define WCD934X_FLYBACK_VNEG_CTRL_7 0x06ab -#define WCD934X_FLYBACK_VNEG_CTRL_8 0x06ac -#define WCD934X_FLYBACK_VNEG_CTRL_9 0x06ad -#define WCD934X_FLYBACK_VNEGDAC_CTRL_1 0x06ae -#define WCD934X_FLYBACK_VNEGDAC_CTRL_2 0x06af -#define WCD934X_FLYBACK_VNEGDAC_CTRL_3 0x06b0 -#define WCD934X_FLYBACK_CTRL_1 0x06b1 -#define WCD934X_FLYBACK_TEST_CTL 0x06b2 -#define WCD934X_RX_AUX_SW_CTL 0x06b3 -#define WCD934X_RX_PA_AUX_IN_CONN 0x06b4 -#define WCD934X_RX_TIMER_DIV 0x06b5 -#define WCD934X_RX_OCP_CTL 0x06b6 -#define WCD934X_RX_OCP_COUNT 0x06b7 -#define WCD934X_RX_BIAS_EAR_DAC 0x06b8 -#define WCD934X_RX_BIAS_EAR_AMP 0x06b9 -#define WCD934X_RX_BIAS_HPH_LDO 0x06ba -#define WCD934X_RX_BIAS_HPH_PA 0x06bb -#define WCD934X_RX_BIAS_HPH_RDACBUFF_CNP2 0x06bc -#define WCD934X_RX_BIAS_HPH_RDAC_LDO 0x06bd -#define WCD934X_RX_BIAS_HPH_CNP1 0x06be -#define WCD934X_RX_BIAS_HPH_LOWPOWER 0x06bf -#define WCD934X_RX_BIAS_DIFFLO_PA 0x06c0 -#define WCD934X_RX_BIAS_DIFFLO_REF 0x06c1 -#define WCD934X_RX_BIAS_DIFFLO_LDO 0x06c2 -#define WCD934X_RX_BIAS_SELO_DAC_PA 0x06c3 -#define WCD934X_RX_BIAS_BUCK_RST 0x06c4 -#define WCD934X_RX_BIAS_BUCK_VREF_ERRAMP 0x06c5 -#define WCD934X_RX_BIAS_FLYB_ERRAMP 0x06c6 -#define WCD934X_RX_BIAS_FLYB_BUFF 0x06c7 -#define WCD934X_RX_BIAS_FLYB_MID_RST 0x06c8 -#define WCD934X_HPH_L_STATUS 0x06c9 -#define WCD934X_HPH_R_STATUS 0x06ca -#define WCD934X_HPH_CNP_EN 0x06cb -#define WCD934X_HPH_CNP_WG_CTL 0x06cc -#define WCD934X_HPH_CNP_WG_TIME 0x06cd -#define WCD934X_HPH_OCP_CTL 0x06ce -#define WCD934X_HPH_AUTO_CHOP 0x06cf -#define WCD934X_HPH_CHOP_CTL 0x06d0 -#define WCD934X_HPH_PA_CTL1 0x06d1 -#define WCD934X_HPH_PA_CTL2 0x06d2 -#define WCD934X_HPH_L_EN 0x06d3 -#define WCD934X_HPH_L_TEST 0x06d4 -#define WCD934X_HPH_L_ATEST 0x06d5 -#define WCD934X_HPH_R_EN 0x06d6 -#define WCD934X_HPH_R_TEST 0x06d7 -#define WCD934X_HPH_R_ATEST 0x06d8 -#define WCD934X_HPH_RDAC_CLK_CTL1 0x06d9 -#define WCD934X_HPH_RDAC_CLK_CTL2 0x06da -#define WCD934X_HPH_RDAC_LDO_CTL 0x06db -#define WCD934X_HPH_RDAC_CHOP_CLK_LP_CTL 0x06dc -#define WCD934X_HPH_REFBUFF_UHQA_CTL 0x06dd -#define WCD934X_HPH_REFBUFF_LP_CTL 0x06de -#define WCD934X_HPH_L_DAC_CTL 0x06df -#define WCD934X_HPH_R_DAC_CTL 0x06e0 -#define WCD934X_EAR_EN_REG 0x06e1 -#define WCD934X_EAR_CMBUFF 0x06e2 -#define WCD934X_EAR_ICTL 0x06e3 -#define WCD934X_EAR_EN_DBG_CTL 0x06e4 -#define WCD934X_EAR_CNP 0x06e5 -#define WCD934X_EAR_DAC_CTL_ATEST 0x06e6 -#define WCD934X_EAR_STATUS_REG 0x06e7 -#define WCD934X_EAR_EAR_MISC 0x06e8 -#define WCD934X_DIFF_LO_MISC 0x06e9 -#define WCD934X_DIFF_LO_LO2_COMPANDER 0x06ea -#define WCD934X_DIFF_LO_LO1_COMPANDER 0x06eb -#define WCD934X_DIFF_LO_COMMON 0x06ec -#define WCD934X_DIFF_LO_BYPASS_EN 0x06ed -#define WCD934X_DIFF_LO_CNP 0x06ee -#define WCD934X_DIFF_LO_CORE_OUT_PROG 0x06ef -#define WCD934X_DIFF_LO_LDO_OUT_PROG 0x06f0 -#define WCD934X_DIFF_LO_COM_SWCAP_REFBUF_FREQ 0x06f1 -#define WCD934X_DIFF_LO_COM_PA_FREQ 0x06f2 -#define WCD934X_DIFF_LO_RESERVED_REG 0x06f3 -#define WCD934X_DIFF_LO_LO1_STATUS_1 0x06f4 -#define WCD934X_DIFF_LO_LO1_STATUS_2 0x06f5 -#define WCD934X_ANA_NEW_PAGE_REGISTER 0x0700 -#define WCD934X_HPH_NEW_ANA_HPH2 0x0701 -#define WCD934X_HPH_NEW_ANA_HPH3 0x0702 -#define WCD934X_SLNQ_ANA_EN 0x0703 -#define WCD934X_SLNQ_ANA_STATUS 0x0704 -#define WCD934X_SLNQ_ANA_LDO_CONFIG 0x0705 -#define WCD934X_SLNQ_ANA_LDO_OCP_CONFIG 0x0706 -#define WCD934X_SLNQ_ANA_TX_LDO_CONFIG 0x0707 -#define WCD934X_SLNQ_ANA_TX_DRV_CONFIG 0x0708 -#define WCD934X_SLNQ_ANA_RX_CONFIG_1 0x0709 -#define WCD934X_SLNQ_ANA_RX_CONFIG_2 0x070a -#define WCD934X_SLNQ_ANA_PLL_ENABLES 0x070b -#define WCD934X_SLNQ_ANA_PLL_PRESET 0x070c -#define WCD934X_SLNQ_ANA_PLL_STATUS 0x070d -#define WCD934X_CLK_SYS_PLL_ENABLES 0x070e -#define WCD934X_CLK_SYS_PLL_PRESET 0x070f -#define WCD934X_CLK_SYS_PLL_STATUS 0x0710 -#define WCD934X_CLK_SYS_MCLK_PRG 0x0711 -#define WCD934X_CLK_SYS_MCLK2_PRG1 0x0712 -#define WCD934X_CLK_SYS_MCLK2_PRG2 0x0713 -#define WCD934X_CLK_SYS_XO_PRG 0x0714 -#define WCD934X_CLK_SYS_XO_CAP_XTP 0x0715 -#define WCD934X_CLK_SYS_XO_CAP_XTM 0x0716 -#define WCD934X_BOOST_BST_EN_DLY 0x0718 -#define WCD934X_BOOST_CTRL_ILIM 0x0719 -#define WCD934X_BOOST_VOUT_SETTING 0x071a -#define WCD934X_SIDO_NEW_VOUT_A_STARTUP 0x071b -#define WCD934X_SIDO_NEW_VOUT_D_STARTUP 0x071c -#define WCD934X_SIDO_NEW_VOUT_D_FREQ1 0x071d -#define WCD934X_SIDO_NEW_VOUT_D_FREQ2 0x071e -#define WCD934X_MBHC_NEW_ELECT_REM_CLAMP_CTL 0x071f -#define WCD934X_MBHC_NEW_CTL_1 0x0720 -#define WCD934X_MBHC_NEW_CTL_2 0x0721 -#define WCD934X_MBHC_NEW_PLUG_DETECT_CTL 0x0722 -#define WCD934X_MBHC_NEW_ZDET_ANA_CTL 0x0723 -#define WCD934X_MBHC_NEW_ZDET_RAMP_CTL 0x0724 -#define WCD934X_MBHC_NEW_FSM_STATUS 0x0725 -#define WCD934X_MBHC_NEW_ADC_RESULT 0x0726 -#define WCD934X_TX_NEW_AMIC_4_5_SEL 0x0727 -#define WCD934X_VBADC_NEW_ADC_MODE 0x072f -#define WCD934X_VBADC_NEW_ADC_DOUTMSB 0x0730 -#define WCD934X_VBADC_NEW_ADC_DOUTLSB 0x0731 -#define WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL 0x0732 -#define WCD934X_HPH_NEW_INT_RDAC_HD2_CTL 0x0733 -#define WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_L 0x0733 -#define WCD934X_HPH_NEW_INT_RDAC_VREF_CTL 0x0734 -#define WCD934X_HPH_NEW_INT_RDAC_OVERRIDE_CTL 0x0735 -#define WCD934X_HPH_NEW_INT_RDAC_MISC1 0x0736 -#define WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_R 0x0736 -#define WCD934X_HPH_NEW_INT_PA_MISC1 0x0737 -#define WCD934X_HPH_NEW_INT_PA_MISC2 0x0738 -#define WCD934X_HPH_NEW_INT_PA_RDAC_MISC 0x0739 -#define WCD934X_HPH_NEW_INT_HPH_TIMER1 0x073a -#define WCD934X_HPH_NEW_INT_HPH_TIMER2 0x073b -#define WCD934X_HPH_NEW_INT_HPH_TIMER3 0x073c -#define WCD934X_HPH_NEW_INT_HPH_TIMER4 0x073d -#define WCD934X_HPH_NEW_INT_PA_RDAC_MISC2 0x073e -#define WCD934X_HPH_NEW_INT_PA_RDAC_MISC3 0x073f -#define WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI 0x0745 -#define WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_ULP 0x0746 -#define WCD934X_RX_NEW_INT_HPH_RDAC_LDO_LP 0x0747 -#define WCD934X_SLNQ_INT_ANA_INT_LDO_TEST 0x074b -#define WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_1 0x074c -#define WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_2 0x074d -#define WCD934X_SLNQ_INT_ANA_INT_TX_LDO_TEST 0x074e -#define WCD934X_SLNQ_INT_ANA_INT_TX_DRV_TEST 0x074f -#define WCD934X_SLNQ_INT_ANA_INT_RX_TEST 0x0750 -#define WCD934X_SLNQ_INT_ANA_INT_RX_TEST_STATUS 0x0751 -#define WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_1 0x0752 -#define WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_2 0x0753 -#define WCD934X_SLNQ_INT_ANA_INT_CLK_CTRL 0x0754 -#define WCD934X_SLNQ_INT_ANA_INT_RESERVED_1 0x0755 -#define WCD934X_SLNQ_INT_ANA_INT_RESERVED_2 0x0756 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG0 0x0757 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG1 0x0758 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG0 0x0759 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG1 0x075a -#define WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG0 0x075b -#define WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG1 0x075c -#define WCD934X_SLNQ_INT_ANA_INT_PLL_L_VAL 0x075d -#define WCD934X_SLNQ_INT_ANA_INT_PLL_M_VAL 0x075e -#define WCD934X_SLNQ_INT_ANA_INT_PLL_N_VAL 0x075f -#define WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG0 0x0760 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_PFD_CP_DSM_PROG 0x0761 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_VCO_PROG 0x0762 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG1 0x0763 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_LDO_LOCK_CFG 0x0764 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_DIG_LOCK_DET_CFG 0x0765 -#define WCD934X_CLK_SYS_INT_POST_DIV_REG0 0x076c -#define WCD934X_CLK_SYS_INT_POST_DIV_REG1 0x076d -#define WCD934X_CLK_SYS_INT_REF_DIV_REG0 0x076e -#define WCD934X_CLK_SYS_INT_REF_DIV_REG1 0x076f -#define WCD934X_CLK_SYS_INT_FILTER_REG0 0x0770 -#define WCD934X_CLK_SYS_INT_FILTER_REG1 0x0771 -#define WCD934X_CLK_SYS_INT_PLL_L_VAL 0x0772 -#define WCD934X_CLK_SYS_INT_PLL_M_VAL 0x0773 -#define WCD934X_CLK_SYS_INT_PLL_N_VAL 0x0774 -#define WCD934X_CLK_SYS_INT_TEST_REG0 0x0775 -#define WCD934X_CLK_SYS_INT_PFD_CP_DSM_PROG 0x0776 -#define WCD934X_CLK_SYS_INT_VCO_PROG 0x0777 -#define WCD934X_CLK_SYS_INT_TEST_REG1 0x0778 -#define WCD934X_CLK_SYS_INT_LDO_LOCK_CFG 0x0779 -#define WCD934X_CLK_SYS_INT_DIG_LOCK_DET_CFG 0x077a -#define WCD934X_CLK_SYS_INT_CLK_TEST1 0x077b -#define WCD934X_CLK_SYS_INT_CLK_TEST2 0x077c -#define WCD934X_CLK_SYS_INT_CLK_TEST3 0x077d -#define WCD934X_CLK_SYS_INT_XO_TEST1 0x077e -#define WCD934X_CLK_SYS_INT_XO_TEST2 0x077f -#define WCD934X_BOOST_INT_VCOMP_HYST 0x0787 -#define WCD934X_BOOST_INT_VLOOP_FILTER 0x0788 -#define WCD934X_BOOST_INT_CTRL_IDELTA 0x0789 -#define WCD934X_BOOST_INT_CTRL_ILIM_STARTUP 0x078a -#define WCD934X_BOOST_INT_CTRL_MIN_ONTIME 0x078b -#define WCD934X_BOOST_INT_CTRL_MAX_ONTIME 0x078c -#define WCD934X_BOOST_INT_CTRL_TIMING 0x078d -#define WCD934X_BOOST_INT_TMUX_A_D 0x078e -#define WCD934X_BOOST_INT_SW_DRV_CNTL 0x078f -#define WCD934X_BOOST_INT_SPARE1 0x0790 -#define WCD934X_BOOST_INT_SPARE2 0x0791 -#define WCD934X_SIDO_NEW_INT_RAMP_STATUS 0x0796 -#define WCD934X_SIDO_NEW_INT_SPARE_1 0x0797 -#define WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_A 0x0798 -#define WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_D 0x0799 -#define WCD934X_SIDO_NEW_INT_RAMP_INC_WAIT 0x079a -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_CTL 0x079b -#define WCD934X_SIDO_NEW_INT_RAMP_IBLEED_CTL 0x079c -#define WCD934X_SIDO_NEW_INT_DEBUG_CPROVR_TEST 0x079d -#define WCD934X_SIDO_NEW_INT_RAMP_CTL_A 0x079e -#define WCD934X_SIDO_NEW_INT_RAMP_CTL_D 0x079f -#define WCD934X_SIDO_NEW_INT_RAMP_TIMEOUT_PERIOD 0x07a0 -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING1 0x07a1 -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING2 0x07a2 -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING3 0x07a3 -#define WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL1 0x07a4 -#define WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL2 0x07a5 -#define WCD934X_MBHC_NEW_INT_SLNQ_HPF 0x07af -#define WCD934X_MBHC_NEW_INT_SLNQ_REF 0x07b0 -#define WCD934X_MBHC_NEW_INT_SLNQ_COMP 0x07b1 -#define WCD934X_MBHC_NEW_INT_SPARE_2 0x07b2 -#define WCD934X_PAGE10_PAGE_REGISTER 0x0a00 -#define WCD934X_CDC_ANC0_CLK_RESET_CTL 0x0a01 -#define WCD934X_CDC_ANC0_MODE_1_CTL 0x0a02 -#define WCD934X_CDC_ANC0_MODE_2_CTL 0x0a03 -#define WCD934X_CDC_ANC0_FF_SHIFT 0x0a04 -#define WCD934X_CDC_ANC0_FB_SHIFT 0x0a05 -#define WCD934X_CDC_ANC0_LPF_FF_A_CTL 0x0a06 -#define WCD934X_CDC_ANC0_LPF_FF_B_CTL 0x0a07 -#define WCD934X_CDC_ANC0_LPF_FB_CTL 0x0a08 -#define WCD934X_CDC_ANC0_SMLPF_CTL 0x0a09 -#define WCD934X_CDC_ANC0_DCFLT_SHIFT_CTL 0x0a0a -#define WCD934X_CDC_ANC0_IIR_ADAPT_CTL 0x0a0b -#define WCD934X_CDC_ANC0_IIR_COEFF_1_CTL 0x0a0c -#define WCD934X_CDC_ANC0_IIR_COEFF_2_CTL 0x0a0d -#define WCD934X_CDC_ANC0_FF_A_GAIN_CTL 0x0a0e -#define WCD934X_CDC_ANC0_FF_B_GAIN_CTL 0x0a0f -#define WCD934X_CDC_ANC0_FB_GAIN_CTL 0x0a10 -#define WCD934X_CDC_ANC0_RC_COMMON_CTL 0x0a11 -#define WCD934X_CDC_ANC0_FIFO_COMMON_CTL 0x0a13 -#define WCD934X_CDC_ANC0_RC0_STATUS_FMIN_CNTR 0x0a14 -#define WCD934X_CDC_ANC0_RC1_STATUS_FMIN_CNTR 0x0a15 -#define WCD934X_CDC_ANC0_RC0_STATUS_FMAX_CNTR 0x0a16 -#define WCD934X_CDC_ANC0_RC1_STATUS_FMAX_CNTR 0x0a17 -#define WCD934X_CDC_ANC0_STATUS_FIFO 0x0a18 -#define WCD934X_CDC_ANC1_CLK_RESET_CTL 0x0a19 -#define WCD934X_CDC_ANC1_MODE_1_CTL 0x0a1a -#define WCD934X_CDC_ANC1_MODE_2_CTL 0x0a1b -#define WCD934X_CDC_ANC1_FF_SHIFT 0x0a1c -#define WCD934X_CDC_ANC1_FB_SHIFT 0x0a1d -#define WCD934X_CDC_ANC1_LPF_FF_A_CTL 0x0a1e -#define WCD934X_CDC_ANC1_LPF_FF_B_CTL 0x0a1f -#define WCD934X_CDC_ANC1_LPF_FB_CTL 0x0a20 -#define WCD934X_CDC_ANC1_SMLPF_CTL 0x0a21 -#define WCD934X_CDC_ANC1_DCFLT_SHIFT_CTL 0x0a22 -#define WCD934X_CDC_ANC1_IIR_ADAPT_CTL 0x0a23 -#define WCD934X_CDC_ANC1_IIR_COEFF_1_CTL 0x0a24 -#define WCD934X_CDC_ANC1_IIR_COEFF_2_CTL 0x0a25 -#define WCD934X_CDC_ANC1_FF_A_GAIN_CTL 0x0a26 -#define WCD934X_CDC_ANC1_FF_B_GAIN_CTL 0x0a27 -#define WCD934X_CDC_ANC1_FB_GAIN_CTL 0x0a28 -#define WCD934X_CDC_ANC1_RC_COMMON_CTL 0x0a29 -#define WCD934X_CDC_ANC1_FIFO_COMMON_CTL 0x0a2b -#define WCD934X_CDC_ANC1_RC0_STATUS_FMIN_CNTR 0x0a2c -#define WCD934X_CDC_ANC1_RC1_STATUS_FMIN_CNTR 0x0a2d -#define WCD934X_CDC_ANC1_RC0_STATUS_FMAX_CNTR 0x0a2e -#define WCD934X_CDC_ANC1_RC1_STATUS_FMAX_CNTR 0x0a2f -#define WCD934X_CDC_ANC1_STATUS_FIFO 0x0a30 -#define WCD934X_CDC_TX0_TX_PATH_CTL 0x0a31 -#define WCD934X_CDC_TX0_TX_PATH_CFG0 0x0a32 -#define WCD934X_CDC_TX0_TX_PATH_CFG1 0x0a33 -#define WCD934X_CDC_TX0_TX_VOL_CTL 0x0a34 -#define WCD934X_CDC_TX0_TX_PATH_192_CTL 0x0a35 -#define WCD934X_CDC_TX0_TX_PATH_192_CFG 0x0a36 -#define WCD934X_CDC_TX0_TX_PATH_SEC0 0x0a37 -#define WCD934X_CDC_TX0_TX_PATH_SEC1 0x0a38 -#define WCD934X_CDC_TX0_TX_PATH_SEC2 0x0a39 -#define WCD934X_CDC_TX0_TX_PATH_SEC3 0x0a3a -#define WCD934X_CDC_TX0_TX_PATH_SEC4 0x0a3b -#define WCD934X_CDC_TX0_TX_PATH_SEC5 0x0a3c -#define WCD934X_CDC_TX0_TX_PATH_SEC6 0x0a3d -#define WCD934X_CDC_TX0_TX_PATH_SEC7 0x0a3e -#define WCD934X_CDC_TX1_TX_PATH_CTL 0x0a41 -#define WCD934X_CDC_TX1_TX_PATH_CFG0 0x0a42 -#define WCD934X_CDC_TX1_TX_PATH_CFG1 0x0a43 -#define WCD934X_CDC_TX1_TX_VOL_CTL 0x0a44 -#define WCD934X_CDC_TX1_TX_PATH_192_CTL 0x0a45 -#define WCD934X_CDC_TX1_TX_PATH_192_CFG 0x0a46 -#define WCD934X_CDC_TX1_TX_PATH_SEC0 0x0a47 -#define WCD934X_CDC_TX1_TX_PATH_SEC1 0x0a48 -#define WCD934X_CDC_TX1_TX_PATH_SEC2 0x0a49 -#define WCD934X_CDC_TX1_TX_PATH_SEC3 0x0a4a -#define WCD934X_CDC_TX1_TX_PATH_SEC4 0x0a4b -#define WCD934X_CDC_TX1_TX_PATH_SEC5 0x0a4c -#define WCD934X_CDC_TX1_TX_PATH_SEC6 0x0a4d -#define WCD934X_CDC_TX2_TX_PATH_CTL 0x0a51 -#define WCD934X_CDC_TX2_TX_PATH_CFG0 0x0a52 -#define WCD934X_CDC_TX2_TX_PATH_CFG1 0x0a53 -#define WCD934X_CDC_TX2_TX_VOL_CTL 0x0a54 -#define WCD934X_CDC_TX2_TX_PATH_192_CTL 0x0a55 -#define WCD934X_CDC_TX2_TX_PATH_192_CFG 0x0a56 -#define WCD934X_CDC_TX2_TX_PATH_SEC0 0x0a57 -#define WCD934X_CDC_TX2_TX_PATH_SEC1 0x0a58 -#define WCD934X_CDC_TX2_TX_PATH_SEC2 0x0a59 -#define WCD934X_CDC_TX2_TX_PATH_SEC3 0x0a5a -#define WCD934X_CDC_TX2_TX_PATH_SEC4 0x0a5b -#define WCD934X_CDC_TX2_TX_PATH_SEC5 0x0a5c -#define WCD934X_CDC_TX2_TX_PATH_SEC6 0x0a5d -#define WCD934X_CDC_TX3_TX_PATH_CTL 0x0a61 -#define WCD934X_CDC_TX3_TX_PATH_CFG0 0x0a62 -#define WCD934X_CDC_TX3_TX_PATH_CFG1 0x0a63 -#define WCD934X_CDC_TX3_TX_VOL_CTL 0x0a64 -#define WCD934X_CDC_TX3_TX_PATH_192_CTL 0x0a65 -#define WCD934X_CDC_TX3_TX_PATH_192_CFG 0x0a66 -#define WCD934X_CDC_TX3_TX_PATH_SEC0 0x0a67 -#define WCD934X_CDC_TX3_TX_PATH_SEC1 0x0a68 -#define WCD934X_CDC_TX3_TX_PATH_SEC2 0x0a69 -#define WCD934X_CDC_TX3_TX_PATH_SEC3 0x0a6a -#define WCD934X_CDC_TX3_TX_PATH_SEC4 0x0a6b -#define WCD934X_CDC_TX3_TX_PATH_SEC5 0x0a6c -#define WCD934X_CDC_TX3_TX_PATH_SEC6 0x0a6d -#define WCD934X_CDC_TX4_TX_PATH_CTL 0x0a71 -#define WCD934X_CDC_TX4_TX_PATH_CFG0 0x0a72 -#define WCD934X_CDC_TX4_TX_PATH_CFG1 0x0a73 -#define WCD934X_CDC_TX4_TX_VOL_CTL 0x0a74 -#define WCD934X_CDC_TX4_TX_PATH_192_CTL 0x0a75 -#define WCD934X_CDC_TX4_TX_PATH_192_CFG 0x0a76 -#define WCD934X_CDC_TX4_TX_PATH_SEC0 0x0a77 -#define WCD934X_CDC_TX4_TX_PATH_SEC1 0x0a78 -#define WCD934X_CDC_TX4_TX_PATH_SEC2 0x0a79 -#define WCD934X_CDC_TX4_TX_PATH_SEC3 0x0a7a -#define WCD934X_CDC_TX4_TX_PATH_SEC4 0x0a7b -#define WCD934X_CDC_TX4_TX_PATH_SEC5 0x0a7c -#define WCD934X_CDC_TX4_TX_PATH_SEC6 0x0a7d -#define WCD934X_CDC_TX5_TX_PATH_CTL 0x0a81 -#define WCD934X_CDC_TX5_TX_PATH_CFG0 0x0a82 -#define WCD934X_CDC_TX5_TX_PATH_CFG1 0x0a83 -#define WCD934X_CDC_TX5_TX_VOL_CTL 0x0a84 -#define WCD934X_CDC_TX5_TX_PATH_192_CTL 0x0a85 -#define WCD934X_CDC_TX5_TX_PATH_192_CFG 0x0a86 -#define WCD934X_CDC_TX5_TX_PATH_SEC0 0x0a87 -#define WCD934X_CDC_TX5_TX_PATH_SEC1 0x0a88 -#define WCD934X_CDC_TX5_TX_PATH_SEC2 0x0a89 -#define WCD934X_CDC_TX5_TX_PATH_SEC3 0x0a8a -#define WCD934X_CDC_TX5_TX_PATH_SEC4 0x0a8b -#define WCD934X_CDC_TX5_TX_PATH_SEC5 0x0a8c -#define WCD934X_CDC_TX5_TX_PATH_SEC6 0x0a8d -#define WCD934X_CDC_TX6_TX_PATH_CTL 0x0a91 -#define WCD934X_CDC_TX6_TX_PATH_CFG0 0x0a92 -#define WCD934X_CDC_TX6_TX_PATH_CFG1 0x0a93 -#define WCD934X_CDC_TX6_TX_VOL_CTL 0x0a94 -#define WCD934X_CDC_TX6_TX_PATH_192_CTL 0x0a95 -#define WCD934X_CDC_TX6_TX_PATH_192_CFG 0x0a96 -#define WCD934X_CDC_TX6_TX_PATH_SEC0 0x0a97 -#define WCD934X_CDC_TX6_TX_PATH_SEC1 0x0a98 -#define WCD934X_CDC_TX6_TX_PATH_SEC2 0x0a99 -#define WCD934X_CDC_TX6_TX_PATH_SEC3 0x0a9a -#define WCD934X_CDC_TX6_TX_PATH_SEC4 0x0a9b -#define WCD934X_CDC_TX6_TX_PATH_SEC5 0x0a9c -#define WCD934X_CDC_TX6_TX_PATH_SEC6 0x0a9d -#define WCD934X_CDC_TX7_TX_PATH_CTL 0x0aa1 -#define WCD934X_CDC_TX7_TX_PATH_CFG0 0x0aa2 -#define WCD934X_CDC_TX7_TX_PATH_CFG1 0x0aa3 -#define WCD934X_CDC_TX7_TX_VOL_CTL 0x0aa4 -#define WCD934X_CDC_TX7_TX_PATH_192_CTL 0x0aa5 -#define WCD934X_CDC_TX7_TX_PATH_192_CFG 0x0aa6 -#define WCD934X_CDC_TX7_TX_PATH_SEC0 0x0aa7 -#define WCD934X_CDC_TX7_TX_PATH_SEC1 0x0aa8 -#define WCD934X_CDC_TX7_TX_PATH_SEC2 0x0aa9 -#define WCD934X_CDC_TX7_TX_PATH_SEC3 0x0aaa -#define WCD934X_CDC_TX7_TX_PATH_SEC4 0x0aab -#define WCD934X_CDC_TX7_TX_PATH_SEC5 0x0aac -#define WCD934X_CDC_TX7_TX_PATH_SEC6 0x0aad -#define WCD934X_CDC_TX8_TX_PATH_CTL 0x0ab1 -#define WCD934X_CDC_TX8_TX_PATH_CFG0 0x0ab2 -#define WCD934X_CDC_TX8_TX_PATH_CFG1 0x0ab3 -#define WCD934X_CDC_TX8_TX_VOL_CTL 0x0ab4 -#define WCD934X_CDC_TX8_TX_PATH_192_CTL 0x0ab5 -#define WCD934X_CDC_TX8_TX_PATH_192_CFG 0x0ab6 -#define WCD934X_CDC_TX8_TX_PATH_SEC0 0x0ab7 -#define WCD934X_CDC_TX8_TX_PATH_SEC1 0x0ab8 -#define WCD934X_CDC_TX8_TX_PATH_SEC2 0x0ab9 -#define WCD934X_CDC_TX8_TX_PATH_SEC3 0x0aba -#define WCD934X_CDC_TX8_TX_PATH_SEC4 0x0abb -#define WCD934X_CDC_TX8_TX_PATH_SEC5 0x0abc -#define WCD934X_CDC_TX8_TX_PATH_SEC6 0x0abd -#define WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL 0x0ac2 -#define WCD934X_CDC_TX9_SPKR_PROT_PATH_CFG0 0x0ac3 -#define WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL 0x0ac6 -#define WCD934X_CDC_TX10_SPKR_PROT_PATH_CFG0 0x0ac7 -#define WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL 0x0aca -#define WCD934X_CDC_TX11_SPKR_PROT_PATH_CFG0 0x0acb -#define WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL 0x0ace -#define WCD934X_CDC_TX12_SPKR_PROT_PATH_CFG0 0x0acf -#define WCD934X_PAGE11_PAGE_REGISTER 0x0b00 -#define WCD934X_CDC_COMPANDER1_CTL0 0x0b01 -#define WCD934X_CDC_COMPANDER1_CTL1 0x0b02 -#define WCD934X_CDC_COMPANDER1_CTL2 0x0b03 -#define WCD934X_CDC_COMPANDER1_CTL3 0x0b04 -#define WCD934X_CDC_COMPANDER1_CTL4 0x0b05 -#define WCD934X_CDC_COMPANDER1_CTL5 0x0b06 -#define WCD934X_CDC_COMPANDER1_CTL6 0x0b07 -#define WCD934X_CDC_COMPANDER1_CTL7 0x0b08 -#define WCD934X_CDC_COMPANDER2_CTL0 0x0b09 -#define WCD934X_CDC_COMPANDER2_CTL1 0x0b0a -#define WCD934X_CDC_COMPANDER2_CTL2 0x0b0b -#define WCD934X_CDC_COMPANDER2_CTL3 0x0b0c -#define WCD934X_CDC_COMPANDER2_CTL4 0x0b0d -#define WCD934X_CDC_COMPANDER2_CTL5 0x0b0e -#define WCD934X_CDC_COMPANDER2_CTL6 0x0b0f -#define WCD934X_CDC_COMPANDER2_CTL7 0x0b10 -#define WCD934X_CDC_COMPANDER3_CTL0 0x0b11 -#define WCD934X_CDC_COMPANDER3_CTL1 0x0b12 -#define WCD934X_CDC_COMPANDER3_CTL2 0x0b13 -#define WCD934X_CDC_COMPANDER3_CTL3 0x0b14 -#define WCD934X_CDC_COMPANDER3_CTL4 0x0b15 -#define WCD934X_CDC_COMPANDER3_CTL5 0x0b16 -#define WCD934X_CDC_COMPANDER3_CTL6 0x0b17 -#define WCD934X_CDC_COMPANDER3_CTL7 0x0b18 -#define WCD934X_CDC_COMPANDER4_CTL0 0x0b19 -#define WCD934X_CDC_COMPANDER4_CTL1 0x0b1a -#define WCD934X_CDC_COMPANDER4_CTL2 0x0b1b -#define WCD934X_CDC_COMPANDER4_CTL3 0x0b1c -#define WCD934X_CDC_COMPANDER4_CTL4 0x0b1d -#define WCD934X_CDC_COMPANDER4_CTL5 0x0b1e -#define WCD934X_CDC_COMPANDER4_CTL6 0x0b1f -#define WCD934X_CDC_COMPANDER4_CTL7 0x0b20 -#define WCD934X_CDC_COMPANDER7_CTL0 0x0b31 -#define WCD934X_CDC_COMPANDER7_CTL1 0x0b32 -#define WCD934X_CDC_COMPANDER7_CTL2 0x0b33 -#define WCD934X_CDC_COMPANDER7_CTL3 0x0b34 -#define WCD934X_CDC_COMPANDER7_CTL4 0x0b35 -#define WCD934X_CDC_COMPANDER7_CTL5 0x0b36 -#define WCD934X_CDC_COMPANDER7_CTL6 0x0b37 -#define WCD934X_CDC_COMPANDER7_CTL7 0x0b38 -#define WCD934X_CDC_COMPANDER8_CTL0 0x0b39 -#define WCD934X_CDC_COMPANDER8_CTL1 0x0b3a -#define WCD934X_CDC_COMPANDER8_CTL2 0x0b3b -#define WCD934X_CDC_COMPANDER8_CTL3 0x0b3c -#define WCD934X_CDC_COMPANDER8_CTL4 0x0b3d -#define WCD934X_CDC_COMPANDER8_CTL5 0x0b3e -#define WCD934X_CDC_COMPANDER8_CTL6 0x0b3f -#define WCD934X_CDC_COMPANDER8_CTL7 0x0b40 -#define WCD934X_CDC_RX0_RX_PATH_CTL 0x0b41 -#define WCD934X_CDC_RX0_RX_PATH_CFG0 0x0b42 -#define WCD934X_CDC_RX0_RX_PATH_CFG1 0x0b43 -#define WCD934X_CDC_RX0_RX_PATH_CFG2 0x0b44 -#define WCD934X_CDC_RX0_RX_VOL_CTL 0x0b45 -#define WCD934X_CDC_RX0_RX_PATH_MIX_CTL 0x0b46 -#define WCD934X_CDC_RX0_RX_PATH_MIX_CFG 0x0b47 -#define WCD934X_CDC_RX0_RX_VOL_MIX_CTL 0x0b48 -#define WCD934X_CDC_RX0_RX_PATH_SEC0 0x0b49 -#define WCD934X_CDC_RX0_RX_PATH_SEC1 0x0b4a -#define WCD934X_CDC_RX0_RX_PATH_SEC2 0x0b4b -#define WCD934X_CDC_RX0_RX_PATH_SEC3 0x0b4c -#define WCD934X_CDC_RX0_RX_PATH_SEC5 0x0b4e -#define WCD934X_CDC_RX0_RX_PATH_SEC6 0x0b4f -#define WCD934X_CDC_RX0_RX_PATH_SEC7 0x0b50 -#define WCD934X_CDC_RX0_RX_PATH_MIX_SEC0 0x0b51 -#define WCD934X_CDC_RX0_RX_PATH_MIX_SEC1 0x0b52 -#define WCD934X_CDC_RX0_RX_PATH_DSMDEM_CTL 0x0b53 -#define WCD934X_CDC_RX1_RX_PATH_CTL 0x0b55 -#define WCD934X_CDC_RX1_RX_PATH_CFG0 0x0b56 -#define WCD934X_CDC_RX1_RX_PATH_CFG1 0x0b57 -#define WCD934X_CDC_RX1_RX_PATH_CFG2 0x0b58 -#define WCD934X_CDC_RX1_RX_VOL_CTL 0x0b59 -#define WCD934X_CDC_RX1_RX_PATH_MIX_CTL 0x0b5a -#define WCD934X_CDC_RX1_RX_PATH_MIX_CFG 0x0b5b -#define WCD934X_CDC_RX1_RX_VOL_MIX_CTL 0x0b5c -#define WCD934X_CDC_RX1_RX_PATH_SEC0 0x0b5d -#define WCD934X_CDC_RX1_RX_PATH_SEC1 0x0b5e -#define WCD934X_CDC_RX1_RX_PATH_SEC2 0x0b5f -#define WCD934X_CDC_RX1_RX_PATH_SEC3 0x0b60 -#define WCD934X_CDC_RX1_RX_PATH_SEC4 0x0b61 -#define WCD934X_CDC_RX1_RX_PATH_SEC5 0x0b62 -#define WCD934X_CDC_RX1_RX_PATH_SEC6 0x0b63 -#define WCD934X_CDC_RX1_RX_PATH_SEC7 0x0b64 -#define WCD934X_CDC_RX1_RX_PATH_MIX_SEC0 0x0b65 -#define WCD934X_CDC_RX1_RX_PATH_MIX_SEC1 0x0b66 -#define WCD934X_CDC_RX1_RX_PATH_DSMDEM_CTL 0x0b67 -#define WCD934X_CDC_RX2_RX_PATH_CTL 0x0b69 -#define WCD934X_CDC_RX2_RX_PATH_CFG0 0x0b6a -#define WCD934X_CDC_RX2_RX_PATH_CFG1 0x0b6b -#define WCD934X_CDC_RX2_RX_PATH_CFG2 0x0b6c -#define WCD934X_CDC_RX2_RX_VOL_CTL 0x0b6d -#define WCD934X_CDC_RX2_RX_PATH_MIX_CTL 0x0b6e -#define WCD934X_CDC_RX2_RX_PATH_MIX_CFG 0x0b6f -#define WCD934X_CDC_RX2_RX_VOL_MIX_CTL 0x0b70 -#define WCD934X_CDC_RX2_RX_PATH_SEC0 0x0b71 -#define WCD934X_CDC_RX2_RX_PATH_SEC1 0x0b72 -#define WCD934X_CDC_RX2_RX_PATH_SEC2 0x0b73 -#define WCD934X_CDC_RX2_RX_PATH_SEC3 0x0b74 -#define WCD934X_CDC_RX2_RX_PATH_SEC4 0x0b75 -#define WCD934X_CDC_RX2_RX_PATH_SEC5 0x0b76 -#define WCD934X_CDC_RX2_RX_PATH_SEC6 0x0b77 -#define WCD934X_CDC_RX2_RX_PATH_SEC7 0x0b78 -#define WCD934X_CDC_RX2_RX_PATH_MIX_SEC0 0x0b79 -#define WCD934X_CDC_RX2_RX_PATH_MIX_SEC1 0x0b7a -#define WCD934X_CDC_RX2_RX_PATH_DSMDEM_CTL 0x0b7b -#define WCD934X_CDC_RX3_RX_PATH_CTL 0x0b7d -#define WCD934X_CDC_RX3_RX_PATH_CFG0 0x0b7e -#define WCD934X_CDC_RX3_RX_PATH_CFG1 0x0b7f -#define WCD934X_CDC_RX3_RX_PATH_CFG2 0x0b80 -#define WCD934X_CDC_RX3_RX_VOL_CTL 0x0b81 -#define WCD934X_CDC_RX3_RX_PATH_MIX_CTL 0x0b82 -#define WCD934X_CDC_RX3_RX_PATH_MIX_CFG 0x0b83 -#define WCD934X_CDC_RX3_RX_VOL_MIX_CTL 0x0b84 -#define WCD934X_CDC_RX3_RX_PATH_SEC0 0x0b85 -#define WCD934X_CDC_RX3_RX_PATH_SEC1 0x0b86 -#define WCD934X_CDC_RX3_RX_PATH_SEC2 0x0b87 -#define WCD934X_CDC_RX3_RX_PATH_SEC3 0x0b88 -#define WCD934X_CDC_RX3_RX_PATH_SEC5 0x0b8a -#define WCD934X_CDC_RX3_RX_PATH_SEC6 0x0b8b -#define WCD934X_CDC_RX3_RX_PATH_SEC7 0x0b8c -#define WCD934X_CDC_RX3_RX_PATH_MIX_SEC0 0x0b8d -#define WCD934X_CDC_RX3_RX_PATH_MIX_SEC1 0x0b8e -#define WCD934X_CDC_RX3_RX_PATH_DSMDEM_CTL 0x0b8f -#define WCD934X_CDC_RX4_RX_PATH_CTL 0x0b91 -#define WCD934X_CDC_RX4_RX_PATH_CFG0 0x0b92 -#define WCD934X_CDC_RX4_RX_PATH_CFG1 0x0b93 -#define WCD934X_CDC_RX4_RX_PATH_CFG2 0x0b94 -#define WCD934X_CDC_RX4_RX_VOL_CTL 0x0b95 -#define WCD934X_CDC_RX4_RX_PATH_MIX_CTL 0x0b96 -#define WCD934X_CDC_RX4_RX_PATH_MIX_CFG 0x0b97 -#define WCD934X_CDC_RX4_RX_VOL_MIX_CTL 0x0b98 -#define WCD934X_CDC_RX4_RX_PATH_SEC0 0x0b99 -#define WCD934X_CDC_RX4_RX_PATH_SEC1 0x0b9a -#define WCD934X_CDC_RX4_RX_PATH_SEC2 0x0b9b -#define WCD934X_CDC_RX4_RX_PATH_SEC3 0x0b9c -#define WCD934X_CDC_RX4_RX_PATH_SEC5 0x0b9e -#define WCD934X_CDC_RX4_RX_PATH_SEC6 0x0b9f -#define WCD934X_CDC_RX4_RX_PATH_SEC7 0x0ba0 -#define WCD934X_CDC_RX4_RX_PATH_MIX_SEC0 0x0ba1 -#define WCD934X_CDC_RX4_RX_PATH_MIX_SEC1 0x0ba2 -#define WCD934X_CDC_RX4_RX_PATH_DSMDEM_CTL 0x0ba3 -#define WCD934X_CDC_RX7_RX_PATH_CTL 0x0bcd -#define WCD934X_CDC_RX7_RX_PATH_CFG0 0x0bce -#define WCD934X_CDC_RX7_RX_PATH_CFG1 0x0bcf -#define WCD934X_CDC_RX7_RX_PATH_CFG2 0x0bd0 -#define WCD934X_CDC_RX7_RX_VOL_CTL 0x0bd1 -#define WCD934X_CDC_RX7_RX_PATH_MIX_CTL 0x0bd2 -#define WCD934X_CDC_RX7_RX_PATH_MIX_CFG 0x0bd3 -#define WCD934X_CDC_RX7_RX_VOL_MIX_CTL 0x0bd4 -#define WCD934X_CDC_RX7_RX_PATH_SEC0 0x0bd5 -#define WCD934X_CDC_RX7_RX_PATH_SEC1 0x0bd6 -#define WCD934X_CDC_RX7_RX_PATH_SEC2 0x0bd7 -#define WCD934X_CDC_RX7_RX_PATH_SEC3 0x0bd8 -#define WCD934X_CDC_RX7_RX_PATH_SEC5 0x0bda -#define WCD934X_CDC_RX7_RX_PATH_SEC6 0x0bdb -#define WCD934X_CDC_RX7_RX_PATH_SEC7 0x0bdc -#define WCD934X_CDC_RX7_RX_PATH_MIX_SEC0 0x0bdd -#define WCD934X_CDC_RX7_RX_PATH_MIX_SEC1 0x0bde -#define WCD934X_CDC_RX7_RX_PATH_DSMDEM_CTL 0x0bdf -#define WCD934X_CDC_RX8_RX_PATH_CTL 0x0be1 -#define WCD934X_CDC_RX8_RX_PATH_CFG0 0x0be2 -#define WCD934X_CDC_RX8_RX_PATH_CFG1 0x0be3 -#define WCD934X_CDC_RX8_RX_PATH_CFG2 0x0be4 -#define WCD934X_CDC_RX8_RX_VOL_CTL 0x0be5 -#define WCD934X_CDC_RX8_RX_PATH_MIX_CTL 0x0be6 -#define WCD934X_CDC_RX8_RX_PATH_MIX_CFG 0x0be7 -#define WCD934X_CDC_RX8_RX_VOL_MIX_CTL 0x0be8 -#define WCD934X_CDC_RX8_RX_PATH_SEC0 0x0be9 -#define WCD934X_CDC_RX8_RX_PATH_SEC1 0x0bea -#define WCD934X_CDC_RX8_RX_PATH_SEC2 0x0beb -#define WCD934X_CDC_RX8_RX_PATH_SEC3 0x0bec -#define WCD934X_CDC_RX8_RX_PATH_SEC5 0x0bee -#define WCD934X_CDC_RX8_RX_PATH_SEC6 0x0bef -#define WCD934X_CDC_RX8_RX_PATH_SEC7 0x0bf0 -#define WCD934X_CDC_RX8_RX_PATH_MIX_SEC0 0x0bf1 -#define WCD934X_CDC_RX8_RX_PATH_MIX_SEC1 0x0bf2 -#define WCD934X_CDC_RX8_RX_PATH_DSMDEM_CTL 0x0bf3 -#define WCD934X_PAGE12_PAGE_REGISTER 0x0c00 -#define WCD934X_CDC_CLSH_CRC 0x0c01 -#define WCD934X_CDC_CLSH_DLY_CTRL 0x0c02 -#define WCD934X_CDC_CLSH_DECAY_CTRL 0x0c03 -#define WCD934X_CDC_CLSH_HPH_V_PA 0x0c04 -#define WCD934X_CDC_CLSH_EAR_V_PA 0x0c05 -#define WCD934X_CDC_CLSH_HPH_V_HD 0x0c06 -#define WCD934X_CDC_CLSH_EAR_V_HD 0x0c07 -#define WCD934X_CDC_CLSH_K1_MSB 0x0c08 -#define WCD934X_CDC_CLSH_K1_LSB 0x0c09 -#define WCD934X_CDC_CLSH_K2_MSB 0x0c0a -#define WCD934X_CDC_CLSH_K2_LSB 0x0c0b -#define WCD934X_CDC_CLSH_IDLE_CTRL 0x0c0c -#define WCD934X_CDC_CLSH_IDLE_HPH 0x0c0d -#define WCD934X_CDC_CLSH_IDLE_EAR 0x0c0e -#define WCD934X_CDC_CLSH_TEST0 0x0c0f -#define WCD934X_CDC_CLSH_TEST1 0x0c10 -#define WCD934X_CDC_CLSH_OVR_VREF 0x0c11 -#define WCD934X_CDC_BOOST0_BOOST_PATH_CTL 0x0c19 -#define WCD934X_CDC_BOOST0_BOOST_CTL 0x0c1a -#define WCD934X_CDC_BOOST0_BOOST_CFG1 0x0c1b -#define WCD934X_CDC_BOOST0_BOOST_CFG2 0x0c1c -#define WCD934X_CDC_BOOST1_BOOST_PATH_CTL 0x0c21 -#define WCD934X_CDC_BOOST1_BOOST_CTL 0x0c22 -#define WCD934X_CDC_BOOST1_BOOST_CFG1 0x0c23 -#define WCD934X_CDC_BOOST1_BOOST_CFG2 0x0c24 -#define WCD934X_CDC_VBAT_VBAT_PATH_CTL 0x0c3d -#define WCD934X_CDC_VBAT_VBAT_CFG 0x0c3e -#define WCD934X_CDC_VBAT_VBAT_ADC_CAL1 0x0c3f -#define WCD934X_CDC_VBAT_VBAT_ADC_CAL2 0x0c40 -#define WCD934X_CDC_VBAT_VBAT_ADC_CAL3 0x0c41 -#define WCD934X_CDC_VBAT_VBAT_PK_EST1 0x0c42 -#define WCD934X_CDC_VBAT_VBAT_PK_EST2 0x0c43 -#define WCD934X_CDC_VBAT_VBAT_PK_EST3 0x0c44 -#define WCD934X_CDC_VBAT_VBAT_RF_PROC1 0x0c45 -#define WCD934X_CDC_VBAT_VBAT_RF_PROC2 0x0c46 -#define WCD934X_CDC_VBAT_VBAT_TAC1 0x0c47 -#define WCD934X_CDC_VBAT_VBAT_TAC2 0x0c48 -#define WCD934X_CDC_VBAT_VBAT_TAC3 0x0c49 -#define WCD934X_CDC_VBAT_VBAT_TAC4 0x0c4a -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD1 0x0c4b -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD2 0x0c4c -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD3 0x0c4d -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD4 0x0c4e -#define WCD934X_CDC_VBAT_VBAT_DEBUG1 0x0c4f -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD_MON 0x0c50 -#define WCD934X_CDC_VBAT_VBAT_GAIN_MON_VAL 0x0c51 -#define WCD934X_CDC_VBAT_VBAT_BAN 0x0c52 -#define WCD934X_MIXING_ASRC0_CLK_RST_CTL 0x0c55 -#define WCD934X_MIXING_ASRC0_CTL0 0x0c56 -#define WCD934X_MIXING_ASRC0_CTL1 0x0c57 -#define WCD934X_MIXING_ASRC0_FIFO_CTL 0x0c58 -#define WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_LSB 0x0c59 -#define WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_MSB 0x0c5a -#define WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_LSB 0x0c5b -#define WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_MSB 0x0c5c -#define WCD934X_MIXING_ASRC0_STATUS_FIFO 0x0c5d -#define WCD934X_MIXING_ASRC1_CLK_RST_CTL 0x0c61 -#define WCD934X_MIXING_ASRC1_CTL0 0x0c62 -#define WCD934X_MIXING_ASRC1_CTL1 0x0c63 -#define WCD934X_MIXING_ASRC1_FIFO_CTL 0x0c64 -#define WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_LSB 0x0c65 -#define WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_MSB 0x0c66 -#define WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_LSB 0x0c67 -#define WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_MSB 0x0c68 -#define WCD934X_MIXING_ASRC1_STATUS_FIFO 0x0c69 -#define WCD934X_MIXING_ASRC2_CLK_RST_CTL 0x0c6d -#define WCD934X_MIXING_ASRC2_CTL0 0x0c6e -#define WCD934X_MIXING_ASRC2_CTL1 0x0c6f -#define WCD934X_MIXING_ASRC2_FIFO_CTL 0x0c70 -#define WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_LSB 0x0c71 -#define WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_MSB 0x0c72 -#define WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_LSB 0x0c73 -#define WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_MSB 0x0c74 -#define WCD934X_MIXING_ASRC2_STATUS_FIFO 0x0c75 -#define WCD934X_MIXING_ASRC3_CLK_RST_CTL 0x0c79 -#define WCD934X_MIXING_ASRC3_CTL0 0x0c7a -#define WCD934X_MIXING_ASRC3_CTL1 0x0c7b -#define WCD934X_MIXING_ASRC3_FIFO_CTL 0x0c7c -#define WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_LSB 0x0c7d -#define WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_MSB 0x0c7e -#define WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_LSB 0x0c7f -#define WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_MSB 0x0c80 -#define WCD934X_MIXING_ASRC3_STATUS_FIFO 0x0c81 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_0 0x0c85 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_1 0x0c86 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_2 0x0c87 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_3 0x0c88 -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_0 0x0c89 -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_1 0x0c8a -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_2 0x0c8b -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_3 0x0c8c -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_0 0x0c8d -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_1 0x0c8e -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_2 0x0c8f -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_3 0x0c90 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_0 0x0c91 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_1 0x0c92 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_2 0x0c93 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_3 0x0c94 -#define WCD934X_SWR_AHB_BRIDGE_ACCESS_CFG 0x0c95 -#define WCD934X_SWR_AHB_BRIDGE_ACCESS_STATUS 0x0c96 -#define WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL 0x0cb5 -#define WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1 0x0cb6 -#define WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL 0x0cb9 -#define WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1 0x0cba -#define WCD934X_SIDETONE_ASRC0_CLK_RST_CTL 0x0cbd -#define WCD934X_SIDETONE_ASRC0_CTL0 0x0cbe -#define WCD934X_SIDETONE_ASRC0_CTL1 0x0cbf -#define WCD934X_SIDETONE_ASRC0_FIFO_CTL 0x0cc0 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB 0x0cc1 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB 0x0cc2 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB 0x0cc3 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB 0x0cc4 -#define WCD934X_SIDETONE_ASRC0_STATUS_FIFO 0x0cc5 -#define WCD934X_SIDETONE_ASRC1_CLK_RST_CTL 0x0cc9 -#define WCD934X_SIDETONE_ASRC1_CTL0 0x0cca -#define WCD934X_SIDETONE_ASRC1_CTL1 0x0ccb -#define WCD934X_SIDETONE_ASRC1_FIFO_CTL 0x0ccc -#define WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_LSB 0x0ccd -#define WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_MSB 0x0cce -#define WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_LSB 0x0ccf -#define WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_MSB 0x0cd0 -#define WCD934X_SIDETONE_ASRC1_STATUS_FIFO 0x0cd1 -#define WCD934X_EC_REF_HQ0_EC_REF_HQ_PATH_CTL 0x0cd5 -#define WCD934X_EC_REF_HQ0_EC_REF_HQ_CFG0 0x0cd6 -#define WCD934X_EC_REF_HQ1_EC_REF_HQ_PATH_CTL 0x0cdd -#define WCD934X_EC_REF_HQ1_EC_REF_HQ_CFG0 0x0cde -#define WCD934X_EC_ASRC0_CLK_RST_CTL 0x0ce5 -#define WCD934X_EC_ASRC0_CTL0 0x0ce6 -#define WCD934X_EC_ASRC0_CTL1 0x0ce7 -#define WCD934X_EC_ASRC0_FIFO_CTL 0x0ce8 -#define WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_LSB 0x0ce9 -#define WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_MSB 0x0cea -#define WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_LSB 0x0ceb -#define WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_MSB 0x0cec -#define WCD934X_EC_ASRC0_STATUS_FIFO 0x0ced -#define WCD934X_EC_ASRC1_CLK_RST_CTL 0x0cf1 -#define WCD934X_EC_ASRC1_CTL0 0x0cf2 -#define WCD934X_EC_ASRC1_CTL1 0x0cf3 -#define WCD934X_EC_ASRC1_FIFO_CTL 0x0cf4 -#define WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_LSB 0x0cf5 -#define WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_MSB 0x0cf6 -#define WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_LSB 0x0cf7 -#define WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_MSB 0x0cf8 -#define WCD934X_EC_ASRC1_STATUS_FIFO 0x0cf9 -#define WCD934X_PAGE13_PAGE_REGISTER 0x0d00 -#define WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0 0x0d01 -#define WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1 0x0d02 -#define WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0 0x0d03 -#define WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1 0x0d04 -#define WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0 0x0d05 -#define WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1 0x0d06 -#define WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0 0x0d07 -#define WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1 0x0d08 -#define WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0 0x0d09 -#define WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1 0x0d0a -#define WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0 0x0d0f -#define WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1 0x0d10 -#define WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0 0x0d11 -#define WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1 0x0d12 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG0 0x0d13 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG1 0x0d14 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG2 0x0d15 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG3 0x0d16 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG4 0x0d17 -#define WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 0x0d18 -#define WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1 0x0d19 -#define WCD934X_CDC_RX_INP_MUX_ANC_CFG0 0x0d1a -#define WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0 0x0d1b -#define WCD934X_CDC_RX_INP_MUX_EC_REF_HQ_CFG0 0x0d1c -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 0x0d1d -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 0x0d1e -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0 0x0d1f -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1 0x0d20 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0 0x0d21 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1 0x0d22 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0 0x0d23 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1 0x0d25 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 0x0d26 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0 0x0d27 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0 0x0d28 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0 0x0d29 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0 0x0d2a -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX10_CFG0 0x0d2b -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX11_CFG0 0x0d2c -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX12_CFG0 0x0d2d -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX13_CFG0 0x0d2e -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0 0x0d31 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1 0x0d32 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2 0x0d33 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3 0x0d34 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0 0x0d35 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1 0x0d36 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2 0x0d37 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3 0x0d38 -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0 0x0d3a -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1 0x0d3b -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2 0x0d3c -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3 0x0d3d -#define WCD934X_CDC_CLK_RST_CTRL_MCLK_CONTROL 0x0d41 -#define WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL 0x0d42 -#define WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL 0x0d43 -#define WCD934X_CDC_CLK_RST_CTRL_DSD_CONTROL 0x0d44 -#define WCD934X_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL 0x0d45 -#define WCD934X_CDC_CLK_RST_CTRL_GFM_CONTROL 0x0d46 -#define WCD934X_CDC_PROX_DETECT_PROX_CTL 0x0d49 -#define WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD0 0x0d4a -#define WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD1 0x0d4b -#define WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB 0x0d4c -#define WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB 0x0d4d -#define WCD934X_CDC_PROX_DETECT_PROX_STATUS 0x0d4e -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_CTRL 0x0d4f -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB 0x0d50 -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB 0x0d51 -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD 0x0d52 -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD 0x0d53 -#define WCD934X_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT 0x0d54 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_PATH_CTL 0x0d55 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL 0x0d56 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL 0x0d57 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL 0x0d58 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL 0x0d59 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL 0x0d5a -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL 0x0d5b -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL 0x0d5c -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL 0x0d5d -#define WCD934X_CDC_SIDETONE_IIR0_IIR_CTL 0x0d5e -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL 0x0d5f -#define WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL 0x0d60 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL 0x0d61 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_PATH_CTL 0x0d65 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL 0x0d66 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL 0x0d67 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL 0x0d68 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL 0x0d69 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL 0x0d6a -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL 0x0d6b -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL 0x0d6c -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL 0x0d6d -#define WCD934X_CDC_SIDETONE_IIR1_IIR_CTL 0x0d6e -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL 0x0d6f -#define WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL 0x0d70 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL 0x0d71 -#define WCD934X_CDC_TOP_TOP_CFG0 0x0d81 -#define WCD934X_CDC_TOP_TOP_CFG1 0x0d82 -#define WCD934X_CDC_TOP_TOP_CFG7 0x0d88 -#define WCD934X_CDC_TOP_HPHL_COMP_WR_LSB 0x0d89 -#define WCD934X_CDC_TOP_HPHL_COMP_WR_MSB 0x0d8a -#define WCD934X_CDC_TOP_HPHL_COMP_LUT 0x0d8b -#define WCD934X_CDC_TOP_HPHL_COMP_RD_LSB 0x0d8c -#define WCD934X_CDC_TOP_HPHL_COMP_RD_MSB 0x0d8d -#define WCD934X_CDC_TOP_HPHR_COMP_WR_LSB 0x0d8e -#define WCD934X_CDC_TOP_HPHR_COMP_WR_MSB 0x0d8f -#define WCD934X_CDC_TOP_HPHR_COMP_LUT 0x0d90 -#define WCD934X_CDC_TOP_HPHR_COMP_RD_LSB 0x0d91 -#define WCD934X_CDC_TOP_HPHR_COMP_RD_MSB 0x0d92 -#define WCD934X_CDC_TOP_DIFFL_COMP_WR_LSB 0x0d93 -#define WCD934X_CDC_TOP_DIFFL_COMP_WR_MSB 0x0d94 -#define WCD934X_CDC_TOP_DIFFL_COMP_LUT 0x0d95 -#define WCD934X_CDC_TOP_DIFFL_COMP_RD_LSB 0x0d96 -#define WCD934X_CDC_TOP_DIFFL_COMP_RD_MSB 0x0d97 -#define WCD934X_CDC_TOP_DIFFR_COMP_WR_LSB 0x0d98 -#define WCD934X_CDC_TOP_DIFFR_COMP_WR_MSB 0x0d99 -#define WCD934X_CDC_TOP_DIFFR_COMP_LUT 0x0d9a -#define WCD934X_CDC_TOP_DIFFR_COMP_RD_LSB 0x0d9b -#define WCD934X_CDC_TOP_DIFFR_COMP_RD_MSB 0x0d9c -#define WCD934X_CDC_DSD0_PATH_CTL 0x0db1 -#define WCD934X_CDC_DSD0_CFG0 0x0db2 -#define WCD934X_CDC_DSD0_CFG1 0x0db3 -#define WCD934X_CDC_DSD0_CFG2 0x0db4 -#define WCD934X_CDC_DSD0_CFG3 0x0db5 -#define WCD934X_CDC_DSD0_CFG4 0x0db6 -#define WCD934X_CDC_DSD0_CFG5 0x0db7 -#define WCD934X_CDC_DSD1_PATH_CTL 0x0dc1 -#define WCD934X_CDC_DSD1_CFG0 0x0dc2 -#define WCD934X_CDC_DSD1_CFG1 0x0dc3 -#define WCD934X_CDC_DSD1_CFG2 0x0dc4 -#define WCD934X_CDC_DSD1_CFG3 0x0dc5 -#define WCD934X_CDC_DSD1_CFG4 0x0dc6 -#define WCD934X_CDC_DSD1_CFG5 0x0dc7 -#define WCD934X_CDC_RX_IDLE_DET_PATH_CTL 0x0dd1 -#define WCD934X_CDC_RX_IDLE_DET_CFG0 0x0dd2 -#define WCD934X_CDC_RX_IDLE_DET_CFG1 0x0dd3 -#define WCD934X_CDC_RX_IDLE_DET_CFG2 0x0dd4 -#define WCD934X_CDC_RX_IDLE_DET_CFG3 0x0dd5 -#define WCD934X_PAGE14_PAGE_REGISTER 0x0e00 -#define WCD934X_CDC_RATE_EST0_RE_CLK_RST_CTL 0x0e01 -#define WCD934X_CDC_RATE_EST0_RE_CTL 0x0e02 -#define WCD934X_CDC_RATE_EST0_RE_PULSE_SUPR_CTL 0x0e03 -#define WCD934X_CDC_RATE_EST0_RE_TIMER 0x0e04 -#define WCD934X_CDC_RATE_EST0_RE_BW_SW 0x0e05 -#define WCD934X_CDC_RATE_EST0_RE_THRESH 0x0e06 -#define WCD934X_CDC_RATE_EST0_RE_STATUS 0x0e07 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_CTRL 0x0e09 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_TIMER2 0x0e0c -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW1 0x0e0d -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW2 0x0e0e -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW3 0x0e0f -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW4 0x0e10 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW5 0x0e11 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW1 0x0e12 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW2 0x0e13 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW3 0x0e14 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW4 0x0e15 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW5 0x0e16 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW1 0x0e17 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW2 0x0e18 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW3 0x0e19 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW4 0x0e1a -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW5 0x0e1b -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW1 0x0e1c -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW2 0x0e1d -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW3 0x0e1e -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW4 0x0e1f -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW5 0x0e20 -#define WCD934X_CDC_RATE_EST0_RE_RMAX_DIAG 0x0e21 -#define WCD934X_CDC_RATE_EST0_RE_RMIN_DIAG 0x0e22 -#define WCD934X_CDC_RATE_EST0_RE_PH_DET 0x0e23 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_CLR 0x0e24 -#define WCD934X_CDC_RATE_EST0_RE_MB_SW_STATE 0x0e25 -#define WCD934X_CDC_RATE_EST0_RE_MAST_DIAG_STATE 0x0e26 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_7_0 0x0e27 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_15_8 0x0e28 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_23_16 0x0e29 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_31_24 0x0e2a -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_39_32 0x0e2b -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_40_43 0x0e2c -#define WCD934X_CDC_RATE_EST1_RE_CLK_RST_CTL 0x0e31 -#define WCD934X_CDC_RATE_EST1_RE_CTL 0x0e32 -#define WCD934X_CDC_RATE_EST1_RE_PULSE_SUPR_CTL 0x0e33 -#define WCD934X_CDC_RATE_EST1_RE_TIMER 0x0e34 -#define WCD934X_CDC_RATE_EST1_RE_BW_SW 0x0e35 -#define WCD934X_CDC_RATE_EST1_RE_THRESH 0x0e36 -#define WCD934X_CDC_RATE_EST1_RE_STATUS 0x0e37 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_CTRL 0x0e39 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_TIMER2 0x0e3c -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW1 0x0e3d -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW2 0x0e3e -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW3 0x0e3f -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW4 0x0e40 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW5 0x0e41 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW1 0x0e42 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW2 0x0e43 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW3 0x0e44 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW4 0x0e45 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW5 0x0e46 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW1 0x0e47 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW2 0x0e48 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW3 0x0e49 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW4 0x0e4a -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW5 0x0e4b -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW1 0x0e4c -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW2 0x0e4d -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW3 0x0e4e -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW4 0x0e4f -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW5 0x0e50 -#define WCD934X_CDC_RATE_EST1_RE_RMAX_DIAG 0x0e51 -#define WCD934X_CDC_RATE_EST1_RE_RMIN_DIAG 0x0e52 -#define WCD934X_CDC_RATE_EST1_RE_PH_DET 0x0e53 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_CLR 0x0e54 -#define WCD934X_CDC_RATE_EST1_RE_MB_SW_STATE 0x0e55 -#define WCD934X_CDC_RATE_EST1_RE_MAST_DIAG_STATE 0x0e56 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_7_0 0x0e57 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_15_8 0x0e58 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_23_16 0x0e59 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_31_24 0x0e5a -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_39_32 0x0e5b -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_40_43 0x0e5c -#define WCD934X_CDC_RATE_EST2_RE_CLK_RST_CTL 0x0e61 -#define WCD934X_CDC_RATE_EST2_RE_CTL 0x0e62 -#define WCD934X_CDC_RATE_EST2_RE_PULSE_SUPR_CTL 0x0e63 -#define WCD934X_CDC_RATE_EST2_RE_TIMER 0x0e64 -#define WCD934X_CDC_RATE_EST2_RE_BW_SW 0x0e65 -#define WCD934X_CDC_RATE_EST2_RE_THRESH 0x0e66 -#define WCD934X_CDC_RATE_EST2_RE_STATUS 0x0e67 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_CTRL 0x0e69 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_TIMER2 0x0e6c -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW1 0x0e6d -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW2 0x0e6e -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW3 0x0e6f -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW4 0x0e70 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW5 0x0e71 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW1 0x0e72 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW2 0x0e73 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW3 0x0e74 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW4 0x0e75 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW5 0x0e76 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW1 0x0e77 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW2 0x0e78 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW3 0x0e79 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW4 0x0e7a -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW5 0x0e7b -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW1 0x0e7c -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW2 0x0e7d -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW3 0x0e7e -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW4 0x0e7f -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW5 0x0e80 -#define WCD934X_CDC_RATE_EST2_RE_RMAX_DIAG 0x0e81 -#define WCD934X_CDC_RATE_EST2_RE_RMIN_DIAG 0x0e82 -#define WCD934X_CDC_RATE_EST2_RE_PH_DET 0x0e83 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_CLR 0x0e84 -#define WCD934X_CDC_RATE_EST2_RE_MB_SW_STATE 0x0e85 -#define WCD934X_CDC_RATE_EST2_RE_MAST_DIAG_STATE 0x0e86 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_7_0 0x0e87 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_15_8 0x0e88 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_23_16 0x0e89 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_31_24 0x0e8a -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_39_32 0x0e8b -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_40_43 0x0e8c -#define WCD934X_CDC_RATE_EST3_RE_CLK_RST_CTL 0x0e91 -#define WCD934X_CDC_RATE_EST3_RE_CTL 0x0e92 -#define WCD934X_CDC_RATE_EST3_RE_PULSE_SUPR_CTL 0x0e93 -#define WCD934X_CDC_RATE_EST3_RE_TIMER 0x0e94 -#define WCD934X_CDC_RATE_EST3_RE_BW_SW 0x0e95 -#define WCD934X_CDC_RATE_EST3_RE_THRESH 0x0e96 -#define WCD934X_CDC_RATE_EST3_RE_STATUS 0x0e97 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_CTRL 0x0e99 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_TIMER2 0x0e9c -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW1 0x0e9d -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW2 0x0e9e -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW3 0x0e9f -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW4 0x0ea0 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW5 0x0ea1 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW1 0x0ea2 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW2 0x0ea3 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW3 0x0ea4 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW4 0x0ea5 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW5 0x0ea6 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW1 0x0ea7 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW2 0x0ea8 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW3 0x0ea9 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW4 0x0eaa -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW5 0x0eab -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW1 0x0eac -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW2 0x0ead -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW3 0x0eae -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW4 0x0eaf -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW5 0x0eb0 -#define WCD934X_CDC_RATE_EST3_RE_RMAX_DIAG 0x0eb1 -#define WCD934X_CDC_RATE_EST3_RE_RMIN_DIAG 0x0eb2 -#define WCD934X_CDC_RATE_EST3_RE_PH_DET 0x0eb3 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_CLR 0x0eb4 -#define WCD934X_CDC_RATE_EST3_RE_MB_SW_STATE 0x0eb5 -#define WCD934X_CDC_RATE_EST3_RE_MAST_DIAG_STATE 0x0eb6 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_7_0 0x0eb7 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_15_8 0x0eb8 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_23_16 0x0eb9 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_31_24 0x0eba -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_39_32 0x0ebb -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_40_43 0x0ebc -#define WCD934X_PAGE15_PAGE_REGISTER 0x0f00 -#define WCD934X_SPLINE_SRC0_CLK_RST_CTL_0 0x0f01 -#define WCD934X_SPLINE_SRC0_STATUS 0x0f02 -#define WCD934X_SPLINE_SRC1_CLK_RST_CTL_0 0x0f19 -#define WCD934X_SPLINE_SRC1_STATUS 0x0f1a -#define WCD934X_SPLINE_SRC2_CLK_RST_CTL_0 0x0f31 -#define WCD934X_SPLINE_SRC2_STATUS 0x0f32 -#define WCD934X_SPLINE_SRC3_CLK_RST_CTL_0 0x0f49 -#define WCD934X_SPLINE_SRC3_STATUS 0x0f4a -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG0 0x0fa1 -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG1 0x0fa2 -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG2 0x0fa3 -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG3 0x0fa4 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG0 0x0fa5 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG1 0x0fa6 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG2 0x0fa7 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG3 0x0fa8 -#define WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG0 0x0fa9 -#define WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG1 0x0faa -#define WCD934X_CDC_DEBUG_RC_RE_ASRC_DEBUG_CFG0 0x0fab -#define WCD934X_CDC_DEBUG_ANC0_RC0_FIFO_CTL 0x0fac -#define WCD934X_CDC_DEBUG_ANC0_RC1_FIFO_CTL 0x0fad -#define WCD934X_CDC_DEBUG_ANC1_RC0_FIFO_CTL 0x0fae -#define WCD934X_CDC_DEBUG_ANC1_RC1_FIFO_CTL 0x0faf -#define WCD934X_CDC_DEBUG_ANC_RC_RST_DBG_CNTR 0x0fb0 -#define WCD934X_PAGE80_PAGE_REGISTER 0x5000 -#define WCD934X_CODEC_CPR_WR_DATA_0 0x5001 -#define WCD934X_CODEC_CPR_WR_DATA_1 0x5002 -#define WCD934X_CODEC_CPR_WR_DATA_2 0x5003 -#define WCD934X_CODEC_CPR_WR_DATA_3 0x5004 -#define WCD934X_CODEC_CPR_WR_ADDR_0 0x5005 -#define WCD934X_CODEC_CPR_WR_ADDR_1 0x5006 -#define WCD934X_CODEC_CPR_WR_ADDR_2 0x5007 -#define WCD934X_CODEC_CPR_WR_ADDR_3 0x5008 -#define WCD934X_CODEC_CPR_RD_ADDR_0 0x5009 -#define WCD934X_CODEC_CPR_RD_ADDR_1 0x500a -#define WCD934X_CODEC_CPR_RD_ADDR_2 0x500b -#define WCD934X_CODEC_CPR_RD_ADDR_3 0x500c -#define WCD934X_CODEC_CPR_RD_DATA_0 0x500d -#define WCD934X_CODEC_CPR_RD_DATA_1 0x500e -#define WCD934X_CODEC_CPR_RD_DATA_2 0x500f -#define WCD934X_CODEC_CPR_RD_DATA_3 0x5010 -#define WCD934X_CODEC_CPR_ACCESS_CFG 0x5011 -#define WCD934X_CODEC_CPR_ACCESS_STATUS 0x5012 -#define WCD934X_CODEC_CPR_NOM_CX_VDD 0x5021 -#define WCD934X_CODEC_CPR_SVS_CX_VDD 0x5022 -#define WCD934X_CODEC_CPR_SVS2_CX_VDD 0x5023 -#define WCD934X_CODEC_CPR_NOM_MX_VDD 0x5024 -#define WCD934X_CODEC_CPR_SVS_MX_VDD 0x5025 -#define WCD934X_CODEC_CPR_SVS2_MX_VDD 0x5026 -#define WCD934X_CODEC_CPR_SVS2_MIN_CX_VDD 0x5027 -#define WCD934X_CODEC_CPR_MAX_SVS2_STEP 0x5028 -#define WCD934X_CODEC_CPR_CTL 0x5029 -#define WCD934X_CODEC_CPR_SW_MODECHNG_STATUS 0x502a -#define WCD934X_CODEC_CPR_SW_MODECHNG_START 0x502b -#define WCD934X_CODEC_CPR_CPR_STATUS 0x502c -#define WCD934X_PAGE128_PAGE_REGISTER 0x8000 -#define WCD934X_TLMM_BIST_MODE_PINCFG 0x8001 -#define WCD934X_TLMM_RF_PA_ON_PINCFG 0x8002 -#define WCD934X_TLMM_INTR1_PINCFG 0x8003 -#define WCD934X_TLMM_INTR2_PINCFG 0x8004 -#define WCD934X_TLMM_SWR_DATA_PINCFG 0x8005 -#define WCD934X_TLMM_SWR_CLK_PINCFG 0x8006 -#define WCD934X_TLMM_I2S_2_SCK_PINCFG 0x8007 -#define WCD934X_TLMM_SLIMBUS_DATA1_PINCFG 0x8008 -#define WCD934X_TLMM_SLIMBUS_DATA2_PINCFG 0x8009 -#define WCD934X_TLMM_SLIMBUS_CLK_PINCFG 0x800a -#define WCD934X_TLMM_I2C_CLK_PINCFG 0x800b -#define WCD934X_TLMM_I2C_DATA_PINCFG 0x800c -#define WCD934X_TLMM_I2S_0_RX_PINCFG 0x800d -#define WCD934X_TLMM_I2S_0_TX_PINCFG 0x800e -#define WCD934X_TLMM_I2S_0_SCK_PINCFG 0x800f -#define WCD934X_TLMM_I2S_0_WS_PINCFG 0x8010 -#define WCD934X_TLMM_I2S_1_RX_PINCFG 0x8011 -#define WCD934X_TLMM_I2S_1_TX_PINCFG 0x8012 -#define WCD934X_TLMM_I2S_1_SCK_PINCFG 0x8013 -#define WCD934X_TLMM_I2S_1_WS_PINCFG 0x8014 -#define WCD934X_TLMM_DMIC1_CLK_PINCFG 0x8015 -#define WCD934X_TLMM_DMIC1_DATA_PINCFG 0x8016 -#define WCD934X_TLMM_DMIC2_CLK_PINCFG 0x8017 -#define WCD934X_TLMM_DMIC2_DATA_PINCFG 0x8018 -#define WCD934X_TLMM_DMIC3_CLK_PINCFG 0x8019 -#define WCD934X_TLMM_DMIC3_DATA_PINCFG 0x801a -#define WCD934X_TLMM_JTCK_PINCFG 0x801b -#define WCD934X_TLMM_GPIO1_PINCFG 0x801c -#define WCD934X_TLMM_GPIO2_PINCFG 0x801d -#define WCD934X_TLMM_GPIO3_PINCFG 0x801e -#define WCD934X_TLMM_GPIO4_PINCFG 0x801f -#define WCD934X_TLMM_SPI_S_CSN_PINCFG 0x8020 -#define WCD934X_TLMM_SPI_S_CLK_PINCFG 0x8021 -#define WCD934X_TLMM_SPI_S_DOUT_PINCFG 0x8022 -#define WCD934X_TLMM_SPI_S_DIN_PINCFG 0x8023 -#define WCD934X_TLMM_BA_N_PINCFG 0x8024 -#define WCD934X_TLMM_GPIO0_PINCFG 0x8025 -#define WCD934X_TLMM_I2S_2_RX_PINCFG 0x8026 -#define WCD934X_TLMM_I2S_2_WS_PINCFG 0x8027 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_0 0x8031 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_1 0x8032 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_2 0x8033 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_3 0x8034 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_4 0x8035 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_0 0x8036 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_1 0x8037 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_2 0x8038 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_3 0x8039 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_4 0x803a -#define WCD934X_TEST_DEBUG_PAD_DRVCTL_0 0x803b -#define WCD934X_TEST_DEBUG_PAD_DRVCTL_1 0x803c -#define WCD934X_TEST_DEBUG_PIN_STATUS 0x803d -#define WCD934X_TEST_DEBUG_NPL_DLY_TEST_1 0x803e -#define WCD934X_TEST_DEBUG_NPL_DLY_TEST_2 0x803f -#define WCD934X_TEST_DEBUG_MEM_CTRL 0x8040 -#define WCD934X_TEST_DEBUG_DEBUG_BUS_SEL 0x8041 -#define WCD934X_TEST_DEBUG_DEBUG_JTAG 0x8042 -#define WCD934X_TEST_DEBUG_DEBUG_EN_1 0x8043 -#define WCD934X_TEST_DEBUG_DEBUG_EN_2 0x8044 -#define WCD934X_TEST_DEBUG_DEBUG_EN_3 0x8045 -#define WCD934X_TEST_DEBUG_DEBUG_EN_4 0x8046 -#define WCD934X_TEST_DEBUG_DEBUG_EN_5 0x8047 -#define WCD934X_TEST_DEBUG_ANA_DTEST_DIR 0x804a -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_0 0x804b -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_1 0x804c -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_2 0x804d -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_3 0x804e -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_4 0x804f -#define WCD934X_TEST_DEBUG_SYSMEM_CTRL 0x8050 -#define WCD934X_TEST_DEBUG_SOC_SW_PWR_SEQ_DELAY 0x8051 -#define WCD934X_TEST_DEBUG_LVAL_NOM_LOW 0x8052 -#define WCD934X_TEST_DEBUG_LVAL_NOM_HIGH 0x8053 -#define WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_LOW 0x8054 -#define WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_HIGH 0x8055 -#define WCD934X_TEST_DEBUG_SPI_SLAVE_CHAR 0x8056 -#define WCD934X_TEST_DEBUG_CODEC_DIAGS 0x8057 -#define WCD934X_MAX_REGISTER 0x80FF - -/* SLIMBUS Slave Registers */ -#define WCD934X_SLIM_PGD_PORT_INT_RX_EN0 (0x30) -#define WCD934X_SLIM_PGD_PORT_INT_TX_EN0 (0x32) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_RX_0 (0x34) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_RX_1 (0x35) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_TX_0 (0x36) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_TX_1 (0x37) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_RX_0 (0x38) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_RX_1 (0x39) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_TX_0 (0x3A) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_TX_1 (0x3B) -#define WCD934X_SLIM_PGD_PORT_INT_RX_SOURCE0 (0x60) -#define WCD934X_SLIM_PGD_PORT_INT_TX_SOURCE0 (0x70) - -#endif diff --git a/techpack/audio/4.0/include/asoc/wcd9xxx-common-v2.h b/techpack/audio/4.0/include/asoc/wcd9xxx-common-v2.h deleted file mode 100644 index 35b311cb9792..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd9xxx-common-v2.h +++ /dev/null @@ -1,228 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD9XXX_COMMON_V2 - -#define _WCD9XXX_COMMON_V2 - -#define CLSH_REQ_ENABLE true -#define CLSH_REQ_DISABLE false - -#define WCD_CLSH_EVENT_PRE_DAC 0x01 -#define WCD_CLSH_EVENT_POST_PA 0x02 -#define MAX_VBAT_MONITOR_WRITES 17 -/* - * Basic states for Class H state machine. - * represented as a bit mask within a u8 data type - * bit 0: EAR mode - * bit 1: HPH Left mode - * bit 2: HPH Right mode - * bit 3: Lineout mode - */ -#define WCD_CLSH_STATE_IDLE 0x00 -#define WCD_CLSH_STATE_EAR (0x01 << 0) -#define WCD_CLSH_STATE_HPHL (0x01 << 1) -#define WCD_CLSH_STATE_HPHR (0x01 << 2) -#define WCD_CLSH_STATE_LO (0x01 << 3) - -/* - * Though number of CLSH states are 4, max state shoulbe be 5 - * because state array index starts from 1. - */ -#define WCD_CLSH_STATE_MAX 5 -#define NUM_CLSH_STATES_V2 (0x01 << WCD_CLSH_STATE_MAX) - - -/* Derived State: Bits 1 and 2 should be set for Headphone stereo */ -#define WCD_CLSH_STATE_HPH_ST (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_HPHR) - -#define WCD_CLSH_STATE_HPHL_LO (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_HPHR_LO (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_HPH_ST_LO (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_EAR_LO (WCD_CLSH_STATE_EAR | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_HPHL_EAR (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPHR_EAR (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPH_ST_EAR (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_EAR) - -enum { - CLS_H_NORMAL = 0, /* Class-H Default */ - CLS_H_HIFI, /* Class-H HiFi */ - CLS_H_LP, /* Class-H Low Power */ - CLS_AB, /* Class-AB Low HIFI*/ - CLS_H_LOHIFI, /* LoHIFI */ - CLS_H_ULP, /* Ultra Low power */ - CLS_AB_HIFI, /* Class-AB */ - CLS_NONE, /* None of the above modes */ -}; - -/* Class H data that the codec driver will maintain */ -struct wcd_clsh_cdc_data { - u8 state; - int flyback_users; - int buck_users; - int clsh_users; - int interpolator_modes[WCD_CLSH_STATE_MAX]; -}; - -struct wcd_mad_audio_header { - u32 reserved[3]; - u32 num_reg_cfg; -}; - -struct wcd_mad_microphone_info { - uint8_t input_microphone; - uint8_t cycle_time; - uint8_t settle_time; - uint8_t padding; -} __packed; - -struct wcd_mad_micbias_info { - uint8_t micbias; - uint8_t k_factor; - uint8_t external_bypass_capacitor; - uint8_t internal_biasing; - uint8_t cfilter; - uint8_t padding[3]; -} __packed; - -struct wcd_mad_rms_audio_beacon_info { - uint8_t rms_omit_samples; - uint8_t rms_comp_time; - uint8_t detection_mechanism; - uint8_t rms_diff_threshold; - uint8_t rms_threshold_lsb; - uint8_t rms_threshold_msb; - uint8_t padding[2]; - uint8_t iir_coefficients[36]; -} __packed; - -struct wcd_mad_rms_ultrasound_info { - uint8_t rms_comp_time; - uint8_t detection_mechanism; - uint8_t rms_diff_threshold; - uint8_t rms_threshold_lsb; - uint8_t rms_threshold_msb; - uint8_t padding[3]; - uint8_t iir_coefficients[36]; -} __packed; - -struct wcd_mad_audio_cal { - uint32_t version; - struct wcd_mad_microphone_info microphone_info; - struct wcd_mad_micbias_info micbias_info; - struct wcd_mad_rms_audio_beacon_info audio_info; - struct wcd_mad_rms_audio_beacon_info beacon_info; - struct wcd_mad_rms_ultrasound_info ultrasound_info; -} __packed; - -struct wcd9xxx_anc_header { - u32 reserved[3]; - u32 num_anc_slots; -}; - -struct vbat_monitor_reg { - u32 size; - u32 writes[MAX_VBAT_MONITOR_WRITES]; -} __packed; - -struct wcd_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -extern void wcd_clsh_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode); - -extern void wcd_clsh_init(struct wcd_clsh_cdc_data *clsh); -extern int wcd_clsh_get_clsh_state(struct wcd_clsh_cdc_data *clsh); -extern void wcd_clsh_imped_config(struct snd_soc_codec *codec, int imped, - bool reset); - -enum { - RESERVED = 0, - AANC_LPF_FF_FB = 1, - AANC_LPF_COEFF_MSB, - AANC_LPF_COEFF_LSB, - HW_MAD_AUDIO_ENABLE, - HW_MAD_ULTR_ENABLE, - HW_MAD_BEACON_ENABLE, - HW_MAD_AUDIO_SLEEP_TIME, - HW_MAD_ULTR_SLEEP_TIME, - HW_MAD_BEACON_SLEEP_TIME, - HW_MAD_TX_AUDIO_SWITCH_OFF, - HW_MAD_TX_ULTR_SWITCH_OFF, - HW_MAD_TX_BEACON_SWITCH_OFF, - MAD_AUDIO_INT_DEST_SELECT_REG, - MAD_ULT_INT_DEST_SELECT_REG, - MAD_BEACON_INT_DEST_SELECT_REG, - MAD_CLIP_INT_DEST_SELECT_REG, - VBAT_INT_DEST_SELECT_REG, - MAD_AUDIO_INT_MASK_REG, - MAD_ULT_INT_MASK_REG, - MAD_BEACON_INT_MASK_REG, - MAD_CLIP_INT_MASK_REG, - VBAT_INT_MASK_REG, - MAD_AUDIO_INT_STATUS_REG, - MAD_ULT_INT_STATUS_REG, - MAD_BEACON_INT_STATUS_REG, - MAD_CLIP_INT_STATUS_REG, - VBAT_INT_STATUS_REG, - MAD_AUDIO_INT_CLEAR_REG, - MAD_ULT_INT_CLEAR_REG, - MAD_BEACON_INT_CLEAR_REG, - MAD_CLIP_INT_CLEAR_REG, - VBAT_INT_CLEAR_REG, - SB_PGD_PORT_TX_WATERMARK_N, - SB_PGD_PORT_TX_ENABLE_N, - SB_PGD_PORT_RX_WATERMARK_N, - SB_PGD_PORT_RX_ENABLE_N, - SB_PGD_TX_PORTn_MULTI_CHNL_0, - SB_PGD_TX_PORTn_MULTI_CHNL_1, - SB_PGD_RX_PORTn_MULTI_CHNL_0, - SB_PGD_RX_PORTn_MULTI_CHNL_1, - AANC_FF_GAIN_ADAPTIVE, - AANC_FFGAIN_ADAPTIVE_EN, - AANC_GAIN_CONTROL, - SPKR_CLIP_PIPE_BANK_SEL, - SPKR_CLIPDET_VAL0, - SPKR_CLIPDET_VAL1, - SPKR_CLIPDET_VAL2, - SPKR_CLIPDET_VAL3, - SPKR_CLIPDET_VAL4, - SPKR_CLIPDET_VAL5, - SPKR_CLIPDET_VAL6, - SPKR_CLIPDET_VAL7, - VBAT_RELEASE_INT_DEST_SELECT_REG, - VBAT_RELEASE_INT_MASK_REG, - VBAT_RELEASE_INT_STATUS_REG, - VBAT_RELEASE_INT_CLEAR_REG, - MAD2_CLIP_INT_DEST_SELECT_REG, - MAD2_CLIP_INT_MASK_REG, - MAD2_CLIP_INT_STATUS_REG, - MAD2_CLIP_INT_CLEAR_REG, - SPKR2_CLIP_PIPE_BANK_SEL, - SPKR2_CLIPDET_VAL0, - SPKR2_CLIPDET_VAL1, - SPKR2_CLIPDET_VAL2, - SPKR2_CLIPDET_VAL3, - SPKR2_CLIPDET_VAL4, - SPKR2_CLIPDET_VAL5, - SPKR2_CLIPDET_VAL6, - SPKR2_CLIPDET_VAL7, - MAX_CFG_REGISTERS, -}; - -#endif diff --git a/techpack/audio/4.0/include/asoc/wcd9xxx-irq.h b/techpack/audio/4.0/include/asoc/wcd9xxx-irq.h deleted file mode 100644 index ff286c4b589a..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd9xxx-irq.h +++ /dev/null @@ -1,82 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2016-2017, 2019, The Linux Foundation. All rights reserved. - */ - -#include -#include "core.h" - -#ifndef __MFD_WCD9XXX_IRQ_H -#define __MFD_WCD9XXX_IRQ_H -#ifdef CONFIG_WCD9XXX_CODEC_CORE -bool wcd9xxx_lock_sleep(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_unlock_sleep(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_nested_irq_lock(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_nested_irq_unlock(struct wcd9xxx_core_resource *wcd9xxx_res); -int wcd9xxx_request_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq, - irq_handler_t handler, const char *name, void *data); - -void wcd9xxx_free_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq, void *data); -void wcd9xxx_enable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq); -void wcd9xxx_disable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq); -void wcd9xxx_disable_irq_sync(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq); - -int wcd9xxx_irq_init(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_irq_exit(struct wcd9xxx_core_resource *wcd9xxx_res); -int wcd9xxx_irq_drv_init(void); -void wcd9xxx_irq_drv_exit(void); -#else -bool wcd9xxx_lock_sleep(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - return false; -} -void wcd9xxx_unlock_sleep(struct wcd9xxx_core_resource *wcd9xxx_res) -{ -} -void wcd9xxx_nested_irq_lock(struct wcd9xxx_core_resource *wcd9xxx_res) -{ -} -void wcd9xxx_nested_irq_unlock(struct wcd9xxx_core_resource *wcd9xxx_res) -{ -} -int wcd9xxx_request_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq, - irq_handler_t handler, const char *name, void *data) -{ - return 0; -} - -void wcd9xxx_free_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq, void *data) -{ -} -void wcd9xxx_enable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ -} -void wcd9xxx_disable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq) -{ -} -void wcd9xxx_disable_irq_sync(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq) -{ -} - -int wcd9xxx_irq_init(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - return 0; -} -void wcd9xxx_irq_exit(struct wcd9xxx_core_resource *wcd9xxx_res) -{ -} -int wcd9xxx_irq_drv_init(void) -{ - return 0; -} - -void wcd9xxx_irq_drv_exit(void) -{ -} -#endif -#endif diff --git a/techpack/audio/4.0/include/asoc/wcd9xxx-regmap.h b/techpack/audio/4.0/include/asoc/wcd9xxx-regmap.h deleted file mode 100644 index 19b9de3a6363..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd9xxx-regmap.h +++ /dev/null @@ -1,60 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD9XXX_REGMAP_ -#define _WCD9XXX_REGMAP_ - -#include -#include "core.h" - -typedef int (*regmap_patch_fptr)(struct regmap *regmap, int version); - -extern struct regmap_config wcd934x_regmap_config; -extern int wcd934x_regmap_register_patch(struct regmap *regmap, - int version); - -extern struct regmap_config wcd9335_regmap_config; -extern int wcd9335_regmap_register_patch(struct regmap *regmap, - int version); - -static inline struct regmap_config *wcd9xxx_get_regmap_config(int type) -{ - struct regmap_config *regmap_config; - - switch (type) { - case WCD934X: - regmap_config = &wcd934x_regmap_config; - break; - case WCD9335: - regmap_config = &wcd9335_regmap_config; - break; - default: - regmap_config = NULL; - break; - }; - - return regmap_config; -} - -static inline regmap_patch_fptr wcd9xxx_get_regmap_reg_patch(int type) -{ - regmap_patch_fptr apply_patch; - - switch (type) { - case WCD9335: - apply_patch = wcd9335_regmap_register_patch; - break; - case WCD934X: - apply_patch = wcd934x_regmap_register_patch; - break; - default: - apply_patch = NULL; - break; - } - - return apply_patch; -} - -#endif diff --git a/techpack/audio/4.0/include/asoc/wcd9xxx-resmgr-v2.h b/techpack/audio/4.0/include/asoc/wcd9xxx-resmgr-v2.h deleted file mode 100644 index 762b42ce17b4..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd9xxx-resmgr-v2.h +++ /dev/null @@ -1,85 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD9XXX_COMMON_V2_H__ -#define __WCD9XXX_COMMON_V2_H__ - -#include -#include "core.h" - -enum wcd_clock_type { - WCD_CLK_OFF, - WCD_CLK_RCO, - WCD_CLK_MCLK, -}; - -enum { - SIDO_SOURCE_INTERNAL, - SIDO_SOURCE_RCO_BG, -}; - -struct wcd_resmgr_cb { - int (*cdc_rco_ctrl)(struct snd_soc_codec *, bool); -}; - -struct wcd9xxx_resmgr_v2 { - struct snd_soc_codec *codec; - struct wcd9xxx_core_resource *core_res; - - int master_bias_users; - int clk_mclk_users; - int clk_rco_users; - - struct mutex codec_bg_clk_lock; - struct mutex master_bias_lock; - - enum codec_variant codec_type; - enum wcd_clock_type clk_type; - - const struct wcd_resmgr_cb *resmgr_cb; - int sido_input_src; -}; - -#define WCD9XXX_V2_BG_CLK_LOCK(resmgr) \ -{ \ - struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \ - pr_debug("%s: Acquiring BG_CLK\n", __func__); \ - mutex_lock(&__resmgr->codec_bg_clk_lock); \ - pr_debug("%s: Acquiring BG_CLK done\n", __func__); \ -} - -#define WCD9XXX_V2_BG_CLK_UNLOCK(resmgr) \ -{ \ - struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \ - pr_debug("%s: Releasing BG_CLK\n", __func__); \ - mutex_unlock(&__resmgr->codec_bg_clk_lock); \ -} - -#define WCD9XXX_V2_BG_CLK_ASSERT_LOCKED(resmgr) \ -{ \ - WARN_ONCE(!mutex_is_locked(&resmgr->codec_bg_clk_lock), \ - "%s: BG_CLK lock should have acquired\n", __func__); \ -} - -int wcd_resmgr_enable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr); -int wcd_resmgr_disable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr); -struct wcd9xxx_resmgr_v2 *wcd_resmgr_init( - struct wcd9xxx_core_resource *core_res, - struct snd_soc_codec *codec); -void wcd_resmgr_remove(struct wcd9xxx_resmgr_v2 *resmgr); -int wcd_resmgr_post_init(struct wcd9xxx_resmgr_v2 *resmgr, - const struct wcd_resmgr_cb *resmgr_cb, - struct snd_soc_codec *codec); -int wcd_resmgr_enable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type); -int wcd_resmgr_disable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type); -int wcd_resmgr_get_clk_type(struct wcd9xxx_resmgr_v2 *resmgr); -void wcd_resmgr_post_ssr_v2(struct wcd9xxx_resmgr_v2 *resmgr); -void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src); -void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src); - -#endif diff --git a/techpack/audio/4.0/include/asoc/wcd9xxx-slimslave.h b/techpack/audio/4.0/include/asoc/wcd9xxx-slimslave.h deleted file mode 100644 index 70b9a4c92bbd..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd9xxx-slimslave.h +++ /dev/null @@ -1,111 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. - */ - -#ifndef __WCD9XXX_SLIMSLAVE_H_ -#define __WCD9XXX_SLIMSLAVE_H_ - -#include -#include "core.h" - - -/* - * client is expected to give port ids in the range of - * 1-10 for pre Taiko Tx ports and 1-16 for Taiko - * 1-7 for pre Taiko Rx ports and 1-16 for Tako, - * we need to add offset for getting the absolute slave - * port id before configuring the HW - */ -#define TABLA_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS 10 -#define TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS 16 - -#define SLIM_MAX_TX_PORTS TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS - -#define TABLA_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS \ - TABLA_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS -#define TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS \ - TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS - -#define TABLA_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS 7 -#define TAIKO_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS 13 - -#define SLIM_MAX_RX_PORTS TAIKO_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS - -#define SLIM_MAX_REG_ADDR (0x180 + 4 * (SLIM_MAX_RX_PORTS)) - -#define TABLA_SB_PGD_RX_PORT_MULTI_CHANNEL_0_START_PORT_ID \ - TABLA_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS -#define TAIKO_SB_PGD_RX_PORT_MULTI_CHANNEL_0_START_PORT_ID \ - TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS - -#define TABLA_SB_PGD_RX_PORT_MULTI_CHANNEL_0_END_PORT_ID 16 -#define TAIKO_SB_PGD_RX_PORT_MULTI_CHANNEL_0_END_PORT_ID 31 - -#define TABLA_SB_PGD_TX_PORT_MULTI_CHANNEL_1_END_PORT_ID 9 -#define TAIKO_SB_PGD_TX_PORT_MULTI_CHANNEL_1_END_PORT_ID 15 - -/* below details are taken from SLIMBUS slave SWI */ -#define SB_PGD_PORT_BASE 0x000 - -#define SB_PGD_PORT_CFG_BYTE_ADDR(offset, port_num) \ - (SB_PGD_PORT_BASE + offset + (1 * port_num)) - -#define SB_PGD_TX_PORT_MULTI_CHANNEL_0(port_num) \ - (SB_PGD_PORT_BASE + 0x100 + 4*port_num) -#define SB_PGD_TX_PORT_MULTI_CHANNEL_0_START_PORT_ID 0 -#define SB_PGD_TX_PORT_MULTI_CHANNEL_0_END_PORT_ID 7 - -#define SB_PGD_TX_PORT_MULTI_CHANNEL_1(port_num) \ - (SB_PGD_PORT_BASE + 0x101 + 4*port_num) -#define SB_PGD_TX_PORT_MULTI_CHANNEL_1_START_PORT_ID 8 - -#define SB_PGD_RX_PORT_MULTI_CHANNEL_0(offset, port_num) \ - (SB_PGD_PORT_BASE + offset + (4 * port_num)) - -/* slave port water mark level - * (0: 6bytes, 1: 9bytes, 2: 12 bytes, 3: 15 bytes) - */ -#define SLAVE_PORT_WATER_MARK_6BYTES 0 -#define SLAVE_PORT_WATER_MARK_9BYTES 1 -#define SLAVE_PORT_WATER_MARK_12BYTES 2 -#define SLAVE_PORT_WATER_MARK_15BYTES 3 -#define SLAVE_PORT_WATER_MARK_SHIFT 1 -#define SLAVE_PORT_ENABLE 1 -#define SLAVE_PORT_DISABLE 0 -#define WATER_MARK_VAL \ - ((SLAVE_PORT_WATER_MARK_12BYTES << SLAVE_PORT_WATER_MARK_SHIFT) | \ - (SLAVE_PORT_ENABLE)) -#define BASE_CH_NUM 128 - - -int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, - u8 wcd9xxx_pgd_la, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot); - -int wcd9xxx_deinit_slimslave(struct wcd9xxx *wcd9xxx); - -int wcd9xxx_cfg_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph); -int wcd9xxx_cfg_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph); -int wcd9xxx_close_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph); -int wcd9xxx_close_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph); -int wcd9xxx_get_channel(struct wcd9xxx *wcd9xxx, - unsigned int *rx_ch, - unsigned int *tx_ch); -int wcd9xxx_get_slave_port(unsigned int ch_num); -int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph); -int wcd9xxx_rx_vport_validation(u32 port_id, - struct list_head *codec_dai_list); -int wcd9xxx_tx_vport_validation(u32 vtable, u32 port_id, - struct wcd9xxx_codec_dai_data *codec_dai, - u32 num_codec_dais); -#endif /* __WCD9XXX_SLIMSLAVE_H_ */ diff --git a/techpack/audio/4.0/include/asoc/wcd9xxx_registers.h b/techpack/audio/4.0/include/asoc/wcd9xxx_registers.h deleted file mode 100644 index 731b72f903ba..000000000000 --- a/techpack/audio/4.0/include/asoc/wcd9xxx_registers.h +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _WCD9XXX_REGISTERS_H -#define _WCD9XXX_REGISTERS_H - -#define WCD9XXX_BASE_ADDRESS 0x3000 - -#define WCD9XXX_ANA_RX_SUPPLIES (WCD9XXX_BASE_ADDRESS+0x008) -#define WCD9XXX_ANA_HPH (WCD9XXX_BASE_ADDRESS+0x009) -#define WCD9XXX_CLASSH_MODE_2 (WCD9XXX_BASE_ADDRESS+0x098) -#define WCD9XXX_CLASSH_MODE_3 (WCD9XXX_BASE_ADDRESS+0x099) -#define WCD9XXX_FLYBACK_VNEG_CTRL_1 (WCD9XXX_BASE_ADDRESS+0x0A5) -#define WCD9XXX_FLYBACK_VNEG_CTRL_4 (WCD9XXX_BASE_ADDRESS+0x0A8) -#define WCD9XXX_FLYBACK_VNEGDAC_CTRL_2 (WCD9XXX_BASE_ADDRESS+0x0AF) -#define WCD9XXX_RX_BIAS_HPH_LOWPOWER (WCD9XXX_BASE_ADDRESS+0x0BF) -#define WCD9XXX_RX_BIAS_FLYB_BUFF (WCD9XXX_BASE_ADDRESS+0x0C7) -#define WCD9XXX_HPH_PA_CTL1 (WCD9XXX_BASE_ADDRESS+0x0D1) -#define WCD9XXX_HPH_NEW_INT_PA_MISC2 (WCD9XXX_BASE_ADDRESS+0x138) - -#endif diff --git a/techpack/audio/4.0/include/asoc/wcdcal-hwdep.h b/techpack/audio/4.0/include/asoc/wcdcal-hwdep.h deleted file mode 100644 index 310d628d2d9e..000000000000 --- a/techpack/audio/4.0/include/asoc/wcdcal-hwdep.h +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2014, 2018, The Linux Foundation. All rights reserved. - */ -#ifndef __WCD9XXX_HWDEP_H__ -#define __WCD9XXX_HWDEP_H__ -#include - -enum wcd_cal_states { - WCDCAL_UNINITIALISED, - WCDCAL_INITIALISED, - WCDCAL_RECIEVED -}; - -struct fw_info { - struct firmware_cal *fw[WCD9XXX_MAX_CAL]; - DECLARE_BITMAP(cal_bit, WCD9XXX_MAX_CAL); - /* for calibration tracking */ - unsigned long wcdcal_state[WCD9XXX_MAX_CAL]; - struct mutex lock; -}; - -struct firmware_cal { - u8 *data; - size_t size; -}; - -struct snd_soc_codec; -int wcd_cal_create_hwdep(void *fw, int node, struct snd_soc_codec *codec); -struct firmware_cal *wcdcal_get_fw_cal(struct fw_info *fw_data, - enum wcd_cal_type type); -#endif /* __WCD9XXX_HWDEP_H__ */ diff --git a/techpack/audio/4.0/include/dsp/apr_audio-v2.h b/techpack/audio/4.0/include/dsp/apr_audio-v2.h deleted file mode 100644 index 908ec649e462..000000000000 --- a/techpack/audio/4.0/include/dsp/apr_audio-v2.h +++ /dev/null @@ -1,12771 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ - - -#ifndef _APR_AUDIO_V2_H_ -#define _APR_AUDIO_V2_H_ - -#include -#include - -/* size of header needed for passing data out of band */ -#define APR_CMD_OB_HDR_SZ 12 - -/* size of header needed for getting data */ -#define APR_CMD_GET_HDR_SZ 16 - -struct param_outband { - size_t size; - void *kvaddr; - phys_addr_t paddr; -}; - -/* Common structures and definitions used for instance ID support */ -/* Instance ID definitions */ -#define INSTANCE_ID_0 0x0000 - -struct mem_mapping_hdr { - /* - * LSW of parameter data payload address. Supported values: any. - * - Must be set to zero for in-band data. - */ - u32 data_payload_addr_lsw; - - /* - * MSW of Parameter data payload address. Supported values: any. - * - Must be set to zero for in-band data. - * - In the case of 32 bit Shared memory address, MSW field must be - * set to zero. - * - In the case of 36 bit shared memory address, bit 31 to bit 4 of - * MSW must be set to zero. - */ - u32 data_payload_addr_msw; - - /* - * Memory map handle returned by DSP through - * ASM_CMD_SHARED_MEM_MAP_REGIONS command. - * Supported Values: Any. - * If memory map handle is NULL, the parameter data payloads are - * within the message payload (in-band). - * If memory map handle is non-NULL, the parameter data payloads begin - * at the address specified in the address MSW and LSW (out-of-band). - */ - u32 mem_map_handle; - -} __packed; - -/* - * Payload format for parameter data. - * Immediately following these structures are param_size bytes of parameter - * data. - */ -struct param_hdr_v1 { - /* Valid ID of the module. */ - uint32_t module_id; - - /* Valid ID of the parameter. */ - uint32_t param_id; - - /* The size of the parameter specified by the module/param ID combo */ - uint16_t param_size; - - /* This field must be set to zero. */ - uint16_t reserved; -} __packed; - -struct param_hdr_v2 { - /* Valid ID of the module. */ - uint32_t module_id; - - /* Valid ID of the parameter. */ - uint32_t param_id; - - /* The size of the parameter specified by the module/param ID combo */ - uint32_t param_size; -} __packed; - -struct param_hdr_v3 { - /* Valid ID of the module. */ - uint32_t module_id; - - /* Instance of the module. */ - uint16_t instance_id; - - /* This field must be set to zero. */ - uint16_t reserved; - - /* Valid ID of the parameter. */ - uint32_t param_id; - - /* The size of the parameter specified by the module/param ID combo */ - uint32_t param_size; -} __packed; - -/* A union of all param_hdr versions for versitility and max size */ -union param_hdrs { - struct param_hdr_v1 v1; - struct param_hdr_v2 v2; - struct param_hdr_v3 v3; -}; - -struct module_instance_info { - /* Module ID. */ - u32 module_id; - - /* Instance of the module */ - u16 instance_id; - - /* Reserved. This field must be set to zero. */ - u16 reserved; -} __packed; - -/* Begin service specific definitions and structures */ - -#define ADSP_ADM_VERSION 0x00070000 - -#define ADM_CMD_SHARED_MEM_MAP_REGIONS 0x00010322 -#define ADM_CMDRSP_SHARED_MEM_MAP_REGIONS 0x00010323 -#define ADM_CMD_SHARED_MEM_UNMAP_REGIONS 0x00010324 - -#define ADM_CMD_MATRIX_MAP_ROUTINGS_V5 0x00010325 -#define ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5 0x0001033D -/* Enumeration for an audio Rx matrix ID.*/ -#define ADM_MATRIX_ID_AUDIO_RX 0 - -#define ADM_MATRIX_ID_AUDIO_TX 1 - -#define ADM_MATRIX_ID_COMPRESSED_AUDIO_RX 2 - -#define ADM_MATRIX_ID_COMPRESSED_AUDIO_TX 3 - -#define ADM_MATRIX_ID_LISTEN_TX 4 -/* Enumeration for an audio Tx matrix ID.*/ -#define ADM_MATRIX_ID_AUDIOX 1 - -#define ADM_MAX_COPPS 5 - -/* make sure this matches with msm_audio_calibration */ -#define SP_V2_NUM_MAX_SPKR 2 - -/* Session map node structure. - * Immediately following this structure are num_copps - * entries of COPP IDs. The COPP IDs are 16 bits, so - * there might be a padding 16-bit field if num_copps - * is odd. - */ -struct adm_session_map_node_v5 { - u16 session_id; - /* Handle of the ASM session to be routed. Supported values: 1 - * to 8. - */ - - - u16 num_copps; - /* Number of COPPs to which this session is to be routed. - * Supported values: 0 < num_copps <= ADM_MAX_COPPS. - */ -} __packed; - -/* Payload of the #ADM_CMD_MATRIX_MAP_ROUTINGS_V5 command. - * Immediately following this structure are num_sessions of the session map - * node payload (adm_session_map_node_v5). - */ - -struct adm_cmd_matrix_map_routings_v5 { - struct apr_hdr hdr; - - u32 matrix_id; - /* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx - * (1). Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - u32 num_sessions; - /* Number of sessions being updated by this command (optional). */ -} __packed; - -/* This command allows a client to open a COPP/Voice Proc. TX module - * and sets up the device session: Matrix -> COPP -> AFE on the RX - * and AFE -> COPP -> Matrix on the TX. This enables PCM data to - * be transferred to/from the endpoint (AFEPortID). - * - * @return - * #ADM_CMDRSP_DEVICE_OPEN_V5 with the resulting status and COPP ID. - */ -#define ADM_CMD_DEVICE_OPEN_V5 0x00010326 - -/* This command allows a client to open a COPP/Voice Proc the - * way as ADM_CMD_DEVICE_OPEN_V5 but supports multiple endpoint2 - * channels. - * - * @return - * #ADM_CMDRSP_DEVICE_OPEN_V6 with the resulting status and - * COPP ID. - */ -#define ADM_CMD_DEVICE_OPEN_V6 0x00010356 - -/* This command allows a client to open a COPP/Voice Proc the -* way as ADM_CMD_DEVICE_OPEN_V8 but supports any number channel -* of configuration. -* -* @return -* #ADM_CMDRSP_DEVICE_OPEN_V8 with the resulting status and -* COPP ID. -*/ -#define ADM_CMD_DEVICE_OPEN_V8 0x0001036A - - -/* Definition for a low latency stream session. */ -#define ADM_LOW_LATENCY_DEVICE_SESSION 0x2000 - -/* Definition for a ultra low latency stream session. */ -#define ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION 0x4000 - -/* Definition for a ultra low latency with Post Processing stream session. */ -#define ADM_ULL_POST_PROCESSING_DEVICE_SESSION 0x8000 - -/* Definition for a legacy device session. */ -#define ADM_LEGACY_DEVICE_SESSION 0 - -/* Indicates that endpoint_id_2 is to be ignored.*/ -#define ADM_CMD_COPP_OPEN_END_POINT_ID_2_IGNORE 0xFFFF - -#define ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_RX_PATH_COPP 1 - -#define ADM_CMD_COPP_OPEN_MODE_OF_OPERATIONX_PATH_LIVE_COPP 2 - -#define ADM_CMD_COPP_OPEN_MODE_OF_OPERATIONX_PATH_NON_LIVE_COPP 3 - -/* Indicates that an audio COPP is to send/receive a mono PCM - * stream to/from - * END_POINT_ID_1. - */ -#define ADM_CMD_COPP_OPEN_CHANNEL_CONFIG_MONO 1 - -/* Indicates that an audio COPP is to send/receive a - * stereo PCM stream to/from END_POINT_ID_1. - */ -#define ADM_CMD_COPP_OPEN_CHANNEL_CONFIG_STEREO 2 - -/* Sample rate is 8000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_8K 8000 - -/* Sample rate is 16000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_16K 16000 - -/* Sample rate is 32000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_32K 32000 - -/* Sample rate is 48000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_48K 48000 - -/* Definition for a COPP live input flag bitmask.*/ -#define ADM_BIT_MASK_COPP_LIVE_INPUT_FLAG (0x0001U) - -/* Definition for a COPP live shift value bitmask.*/ -#define ADM_SHIFT_COPP_LIVE_INPUT_FLAG 0 - -/* Definition for the COPP ID bitmask.*/ -#define ADM_BIT_MASK_COPP_ID (0x0000FFFFUL) - -/* Definition for the COPP ID shift value.*/ -#define ADM_SHIFT_COPP_ID 0 - -/* Definition for the service ID bitmask.*/ -#define ADM_BIT_MASK_SERVICE_ID (0x00FF0000UL) - -/* Definition for the service ID shift value.*/ -#define ADM_SHIFT_SERVICE_ID 16 - -/* Definition for the domain ID bitmask.*/ -#define ADM_BIT_MASK_DOMAIN_ID (0xFF000000UL) - -/* Definition for the domain ID shift value.*/ -#define ADM_SHIFT_DOMAIN_ID 24 - -/* ADM device open command payload of the - * #ADM_CMD_DEVICE_OPEN_V5 command. - */ -struct adm_cmd_device_open_v5 { - struct apr_hdr hdr; - u16 flags; -/* Reserved for future use. Clients must set this field - * to zero. - */ - - u16 mode_of_operation; -/* Specifies whether the COPP must be opened on the Tx or Rx - * path. Use the ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_* macros for - * supported values and interpretation. - * Supported values: - * - 0x1 -- Rx path COPP - * - 0x2 -- Tx path live COPP - * - 0x3 -- Tx path nonlive COPP - * Live connections cause sample discarding in the Tx device - * matrix if the destination output ports do not pull them - * fast enough. Nonlive connections queue the samples - * indefinitely. - */ - - u16 endpoint_id_1; -/* Logical and physical endpoint ID of the audio path. - * If the ID is a voice processor Tx block, it receives near - * samples. Supported values: Any pseudoport, AFE Rx port, - * or AFE Tx port For a list of valid IDs, refer to - * @xhyperref{Q4,[Q4]}. - * Q4 = Hexagon Multimedia: AFE Interface Specification - */ - - u16 endpoint_id_2; -/* Logical and physical endpoint ID 2 for a voice processor - * Tx block. - * This is not applicable to audio COPP. - * Supported values: - * - AFE Rx port - * - 0xFFFF -- Endpoint 2 is unavailable and the voice - * processor Tx - * block ignores this endpoint - * When the voice processor Tx block is created on the audio - * record path, - * it can receive far-end samples from an AFE Rx port if the - * voice call - * is active. The ID of the AFE port is provided in this - * field. - * For a list of valid IDs, refer @xhyperref{Q4,[Q4]}. - */ - - u32 topology_id; -/* Audio COPP topology ID; 32-bit GUID. */ - - u16 dev_num_channel; -/* Number of channels the audio COPP sends to/receives from - * the endpoint. - * Supported values: 1 to 8. - * The value is ignored for the voice processor Tx block, - * where channel - * configuration is derived from the topology ID. - */ - - u16 bit_width; -/* Bit width (in bits) that the audio COPP sends to/receives - * from the - * endpoint. The value is ignored for the voice processing - * Tx block, - * where the PCM width is 16 bits. - */ - - u32 sample_rate; -/* Sampling rate at which the audio COPP/voice processor - * Tx block - * interfaces with the endpoint. - * Supported values for voice processor Tx: 8000, 16000, - * 48000 Hz - * Supported values for audio COPP: >0 and <=192 kHz - */ - - u8 dev_channel_mapping[8]; -/* Array of channel mapping of buffers that the audio COPP - * sends to the endpoint. Channel[i] mapping describes channel - * I inside the buffer, where 0 < i < dev_num_channel. - * This value is relevant only for an audio Rx COPP. - * For the voice processor block and Tx audio block, this field - * is set to zero and is ignored. - */ -} __packed; - -/* ADM device open command payload of the - * #ADM_CMD_DEVICE_OPEN_V6 command. - */ -struct adm_cmd_device_open_v6 { - struct apr_hdr hdr; - u16 flags; -/* Reserved for future use. Clients must set this field - * to zero. - */ - - u16 mode_of_operation; -/* Specifies whether the COPP must be opened on the Tx or Rx - * path. Use the ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_* macros for - * supported values and interpretation. - * Supported values: - * - 0x1 -- Rx path COPP - * - 0x2 -- Tx path live COPP - * - 0x3 -- Tx path nonlive COPP - * Live connections cause sample discarding in the Tx device - * matrix if the destination output ports do not pull them - * fast enough. Nonlive connections queue the samples - * indefinitely. - */ - - u16 endpoint_id_1; -/* Logical and physical endpoint ID of the audio path. - * If the ID is a voice processor Tx block, it receives near - * samples. Supported values: Any pseudoport, AFE Rx port, - * or AFE Tx port For a list of valid IDs, refer to - * @xhyperref{Q4,[Q4]}. - * Q4 = Hexagon Multimedia: AFE Interface Specification - */ - - u16 endpoint_id_2; -/* Logical and physical endpoint ID 2 for a voice processor - * Tx block. - * This is not applicable to audio COPP. - * Supported values: - * - AFE Rx port - * - 0xFFFF -- Endpoint 2 is unavailable and the voice - * processor Tx - * block ignores this endpoint - * When the voice processor Tx block is created on the audio - * record path, - * it can receive far-end samples from an AFE Rx port if the - * voice call - * is active. The ID of the AFE port is provided in this - * field. - * For a list of valid IDs, refer @xhyperref{Q4,[Q4]}. - */ - - u32 topology_id; -/* Audio COPP topology ID; 32-bit GUID. */ - - u16 dev_num_channel; -/* Number of channels the audio COPP sends to/receives from - * the endpoint. - * Supported values: 1 to 8. - * The value is ignored for the voice processor Tx block, - * where channel - * configuration is derived from the topology ID. - */ - - u16 bit_width; -/* Bit width (in bits) that the audio COPP sends to/receives - * from the - * endpoint. The value is ignored for the voice processing - * Tx block, - * where the PCM width is 16 bits. - */ - - u32 sample_rate; -/* Sampling rate at which the audio COPP/voice processor - * Tx block - * interfaces with the endpoint. - * Supported values for voice processor Tx: 8000, 16000, - * 48000 Hz - * Supported values for audio COPP: >0 and <=192 kHz - */ - - u8 dev_channel_mapping[8]; -/* Array of channel mapping of buffers that the audio COPP - * sends to the endpoint. Channel[i] mapping describes channel - * I inside the buffer, where 0 < i < dev_num_channel. - * This value is relevant only for an audio Rx COPP. - * For the voice processor block and Tx audio block, this field - * is set to zero and is ignored. - */ - - u16 dev_num_channel_eid2; -/* Number of channels the voice processor block sends - * to/receives from the endpoint2. - * Supported values: 1 to 8. - * The value is ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ - - u16 bit_width_eid2; -/* Bit width (in bits) that the voice processor sends - * to/receives from the endpoint2. - * Supported values: 16 and 24. - * The value is ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ - - u32 sample_rate_eid2; -/* Sampling rate at which the voice processor Tx block - * interfaces with the endpoint2. - * Supported values for Tx voice processor: >0 and <=384 kHz - * The value is ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ - - u8 dev_channel_mapping_eid2[8]; -/* Array of channel mapping of buffers that the voice processor - * sends to the endpoint. Channel[i] mapping describes channel - * I inside the buffer, where 0 < i < dev_num_channel. - * This value is relevant only for the Tx voice processor. - * The values are ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ -} __packed; - - -/* ADM device open endpoint payload the - * #ADM_CMD_DEVICE_OPEN_V8 command. - */ -struct adm_device_endpoint_payload { - u16 dev_num_channel; -/* Number of channels the audio COPP sends to/receives from - * the endpoint. - * Supported values: 1 to 32. - * The value is ignored for the voice processor Tx block, - * where channel - * configuration is derived from the topology ID. - */ - - u16 bit_width; -/* Bit width (in bits) that the audio COPP sends to/receives - * from the - * endpoint. The value is ignored for the voice processing - * Tx block, - * where the PCM width is 16 bits. - */ - - u32 sample_rate; -/* Sampling rate at which the audio COPP/voice processor - * Tx block - * interfaces with the endpoint. - * Supported values for voice processor Tx: 8000, 16000, - * 48000 Hz - * Supported values for audio COPP: >0 and <=192 kHz - */ - - u8 dev_channel_mapping[32]; -} __packed; - -/* ADM device open command payload of the - * #ADM_CMD_DEVICE_OPEN_V8 command. - */ -struct adm_cmd_device_open_v8 { - struct apr_hdr hdr; - u16 flags; -/* Bit width Native mode enabled : 11th bit of flag parameter -* If 11th bit of flag is set then that means matrix mixer will be -* running in native mode for bit width for this device session. -* -* Channel Native mode enabled : 12th bit of flag parameter -* If 12th bit of flag is set then that means matrix mixer will be -* running in native mode for channel configuration for this device session. -* All other bits are reserved; clients must set them to 0. -*/ - u16 mode_of_operation; -/* Specifies whether the COPP must be opened on the Tx or Rx - * path. Use the ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_* macros for - * supported values and interpretation. - * Supported values: - * - 0x1 -- Rx path COPP - * - 0x2 -- Tx path live COPP - * - 0x3 -- Tx path nonlive COPP - * Live connections cause sample discarding in the Tx device - * matrix if the destination output ports do not pull them - * fast enough. Nonlive connections queue the samples - * indefinitely. - */ - u32 topology_id; -/* Audio COPP topology ID; 32-bit GUID. */ - - - u16 endpoint_id_1; -/* Logical and physical endpoint ID of the audio path. - * If the ID is a voice processor Tx block, it receives near - * samples. - * Supported values: Any pseudoport, AFE Rx port, - * or AFE Tx port For a list of valid IDs, refer to - * @xhyperref{Q4,[Q4]}. - * Q4 = Hexagon Multimedia: AFE Interface Specification - */ - - u16 endpoint_id_2; -/* Logical and physical endpoint ID 2 for a voice processor - * Tx block. - * This is not applicable to audio COPP. - * Supported values: - * - AFE Rx port - * - 0xFFFF -- Endpoint 2 is unavailable and the voice - * processor Tx - * block ignores this endpoint - * When the voice processor Tx block is created on the audio - * record path, - * it can receive far-end samples from an AFE Rx port if the - * voice call - * is active. The ID of the AFE port is provided in this - * field. - * For a list of valid IDs, refer @xhyperref{Q4,[Q4]}. - */ - - u16 endpoint_id_3; -/* - * Logical and physical endpoint ID of the audio path. - * This indicated afe rx port in ADM loopback use cases. - * In all other use cases this should be set to 0xffff - */ - - u16 reserved; -} __packed; - -/* - * This command allows the client to close a COPP and disconnect - * the device session. - */ -#define ADM_CMD_DEVICE_CLOSE_V5 0x00010327 - -/* Sets one or more parameters to a COPP. */ -#define ADM_CMD_SET_PP_PARAMS_V5 0x00010328 -#define ADM_CMD_SET_PP_PARAMS_V6 0x0001035D - -/* - * Structure of the ADM Set PP Params command. Parameter data must be - * pre-packed with correct header for either V2 or V3 when sent in-band. - * Use q6core_pack_pp_params to pack the header and data correctly depending on - * Instance ID support. - */ -struct adm_cmd_set_pp_params { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending out of band */ - struct mem_mapping_hdr mem_hdr; - - /* - * Size in bytes of the variable payload accompanying this - * message or - * in shared memory. This is used for parsing the parameter - * payload. - */ - u32 payload_size; - - /* - * Parameter data for in band payload. This should be structured as the - * parameter header immediately followed by the parameter data. Multiple - * parameters can be set in one command by repeating the header followed - * by the data for as many parameters as need to be set. - * Use q6core_pack_pp_params to pack the header and data correctly - * depending on Instance ID support. - */ - u8 param_data[0]; -} __packed; - - -#define ASM_STREAM_CMD_REGISTER_PP_EVENTS 0x00013213 -#define ASM_STREAM_PP_EVENT 0x00013214 -#define ASM_STREAM_CMD_REGISTER_IEC_61937_FMT_UPDATE 0x1321C -#define ASM_IEC_61937_MEDIA_FMT_EVENT 0x1321D - - -#define DSP_STREAM_CMD "ADSP Stream Cmd" -#define DSP_STREAM_CALLBACK "ADSP Stream Callback Event" -#define DSP_STREAM_CALLBACK_QUEUE_SIZE 1024 - -struct dsp_stream_callback_list { - struct list_head list; - struct msm_adsp_event_data event; -}; - -struct dsp_stream_callback_prtd { - uint16_t event_count; - struct list_head event_queue; - spinlock_t prtd_spin_lock; -}; - -/* set customized mixing on matrix mixer */ -#define ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5 0x00010344 -struct adm_cmd_set_pspd_mtmx_strtr_params_v5 { - struct apr_hdr hdr; - /* LSW of parameter data payload address.*/ - u32 payload_addr_lsw; - /* MSW of parameter data payload address.*/ - u32 payload_addr_msw; - /* Memory map handle returned by ADM_CMD_SHARED_MEM_MAP_REGIONS */ - /* command. If mem_map_handle is zero implies the message is in */ - /* the payload */ - u32 mem_map_handle; - /* Size in bytes of the variable payload accompanying this */ - /* message or in shared memory. This is used for parsing the */ - /* parameter payload. */ - u32 payload_size; - u16 direction; - u16 sessionid; - u16 deviceid; - u16 reserved; -} __packed; - -/* set customized mixing on matrix mixer. - * Updated to account for both LSM as well as ASM path. - */ -#define ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V6 0x00010364 -struct adm_cmd_set_pspd_mtmx_strtr_params_v6 { - struct apr_hdr hdr; - /* LSW of parameter data payload address.*/ - u32 payload_addr_lsw; - /* MSW of parameter data payload address.*/ - u32 payload_addr_msw; - /* Memory map handle returned by ADM_CMD_SHARED_MEM_MAP_REGIONS */ - /* command. If mem_map_handle is zero implies the message is in */ - /* the payload */ - u32 mem_map_handle; - /* Size in bytes of the variable payload accompanying this */ - /* message or in shared memory. This is used for parsing the */ - /* parameter payload. */ - u32 payload_size; - u16 direction; - u16 sessionid; - u16 deviceid; - u16 stream_type; -} __packed; -/* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V5 command. - */ -#define ADM_CMDRSP_DEVICE_OPEN_V5 0x00010329 - -/* Payload of the #ADM_CMDRSP_DEVICE_OPEN_V5 message, - * which returns the - * status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V5 command. - */ -struct adm_cmd_rsp_device_open_v5 { - u32 status; - /* Status message (error code).*/ - - u16 copp_id; - /* COPP ID: Supported values: 0 <= copp_id < ADM_MAX_COPPS*/ - - u16 reserved; - /* Reserved. This field must be set to zero.*/ -} __packed; - -/* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V6 command. */ -#define ADM_CMDRSP_DEVICE_OPEN_V6 0x00010357 - -/* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V8 command. */ -#define ADM_CMDRSP_DEVICE_OPEN_V8 0x0001036B - -/* Payload of the #ADM_CMDRSP_DEVICE_OPEN_V6 message, - * which returns the - * status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V6 command - * is the exact same as ADM_CMDRSP_DEVICE_OPEN_V5. - */ - -/* This command allows a query of one COPP parameter. */ -#define ADM_CMD_GET_PP_PARAMS_V5 0x0001032A -#define ADM_CMD_GET_PP_PARAMS_V6 0x0001035E - -/* - * Structure of the ADM Get PP Params command. Parameter header must be - * packed correctly for either V2 or V3. Use q6core_pack_pp_params to pack the - * header correctly depending on Instance ID support. - */ -struct adm_cmd_get_pp_params { - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when requesting outband */ - struct mem_mapping_hdr mem_hdr; - - /* Parameter header for in band payload. */ - union param_hdrs param_hdr; -} __packed; - -/* Returns parameter values - * in response to an #ADM_CMD_GET_PP_PARAMS_V5 command. - */ -#define ADM_CMDRSP_GET_PP_PARAMS_V5 0x0001032B - -/* Payload of the #ADM_CMDRSP_GET_PP_PARAMS_V5 message, - * which returns parameter values in response - * to an #ADM_CMD_GET_PP_PARAMS_V5 command. - * Immediately following this - * structure is the param_hdr_v1 - * structure containing the pre/postprocessing - * parameter data. For an in-band - * scenario, the variable payload depends - * on the size of the parameter. - */ -struct adm_cmd_rsp_get_pp_params_v5 { - /* Status message (error code).*/ - u32 status; - - /* The header that identifies the subsequent parameter data */ - struct param_hdr_v1 param_hdr; - - /* The parameter data returned */ - u32 param_data[0]; -} __packed; - -/* - * Returns parameter values in response to an #ADM_CMD_GET_PP_PARAMS_V5/6 - * command. - */ -#define ADM_CMDRSP_GET_PP_PARAMS_V6 0x0001035F - -/* - * Payload of the #ADM_CMDRSP_GET_PP_PARAMS_V6 message, - * which returns parameter values in response - * to an #ADM_CMD_GET_PP_PARAMS_V6 command. - * Immediately following this - * structure is the param_hdr_v3 - * structure containing the pre/postprocessing - * parameter data. For an in-band - * scenario, the variable payload depends - * on the size of the parameter. - */ -struct adm_cmd_rsp_get_pp_params_v6 { - /* Status message (error code).*/ - u32 status; - - /* The header that identifies the subsequent parameter data */ - struct param_hdr_v3 param_hdr; - - /* The parameter data returned */ - u32 param_data[0]; -} __packed; - -/* Structure for holding soft stepping volume parameters. */ - -/* - * Payload of the #ASM_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS - * parameters used by the Volume Control module. - */ - -struct audproc_softvolume_params { - u32 period; - u32 step; - u32 rampingcurve; -} __packed; - -/* - * ID of the Media Format Converter (MFC) module. - * This module supports the following parameter IDs: - * #AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT - * #AUDPROC_CHMIXER_PARAM_ID_COEFF - */ -#define AUDPROC_MODULE_ID_MFC 0x00010912 - -/* ID of the Output Media Format parameters used by AUDPROC_MODULE_ID_MFC. - * - */ -#define AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT 0x00010913 - -/* Param ID of Channel Mixer used by AUDPROC_MODULE_ID_MFC */ -#define AUDPROC_CHMIXER_PARAM_ID_COEFF 0x00010342 - -/* - * ID of the Media Format Converter (MFC) module present in EC REF COPP. - * This module supports the all param IDs supported by AUDPROC_MODULE_ID_MFC. - */ -#define AUDPROC_MODULE_ID_MFC_EC_REF 0x0001092C - -#define PARAM_ID_FFV_SPF_FREEZE 0x00010960 - -struct adm_cmd_set_pp_params_v5 { - struct apr_hdr hdr; - u32 payload_addr_lsw; - /* LSW of parameter data payload address.*/ - u32 payload_addr_msw; - /* MSW of parameter data payload address.*/ - - u32 mem_map_handle; - /* - * Memory map handle returned by ADM_CMD_SHARED_MEM_MAP_REGIONS - * command. - * If mem_map_handle is zero implies the message is in - * the payload - */ - - u32 payload_size; - /* - * Size in bytes of the variable payload accompanying this - * message or - * in shared memory. This is used for parsing the parameter - * payload. - */ -} __packed; - -/* Maximum number of channels supported by MFC media fmt params */ -#define AUDPROC_MFC_OUT_CHANNELS_MAX 8 - -struct audproc_mfc_param_media_fmt { - uint32_t sampling_rate; - uint16_t bits_per_sample; - uint16_t num_channels; - uint16_t channel_type[AUDPROC_MFC_OUT_CHANNELS_MAX]; -} __packed; - -struct audproc_volume_ctrl_master_gain { - /* Linear gain in Q13 format. */ - uint16_t master_gain; - /* Clients must set this field to zero. */ - uint16_t reserved; -} __packed; - -struct audproc_soft_step_volume_params { -/* - * Period in milliseconds. - * Supported values: 0 to 15000 - */ - uint32_t period; -/* - * Step in microseconds. - * Supported values: 0 to 15000000 - */ - uint32_t step; -/* - * Ramping curve type. - * Supported values: - * - #AUDPROC_PARAM_SVC_RAMPINGCURVE_LINEAR - * - #AUDPROC_PARAM_SVC_RAMPINGCURVE_EXP - * - #AUDPROC_PARAM_SVC_RAMPINGCURVE_LOG - */ - uint32_t ramping_curve; -} __packed; - -struct audproc_enable_param_t { - /* - * Specifies whether the Audio processing module is enabled. - * This parameter is generic/common parameter to configure or - * determine the state of any audio processing module. - - * @values 0 : Disable 1: Enable - */ - uint32_t enable; -}; - -/* - * Allows a client to control the gains on various session-to-COPP paths. - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_V5 0x0001032C - -/* - * Allows a client to control the gains on various session-to-COPP paths. - * Maximum support 32 channels - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_V7 0x0001036C - -/* Indicates that the target gain in the - * current adm_session_copp_gain_v5 - * structure is to be applied to all - * the session-to-COPP paths that exist for - * the specified session. - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_COPP_ID_ALL_CONNECTED_COPPS 0xFFFF - -/* Indicates that the target gain is - * to be immediately applied to the - * specified session-to-COPP path, - * without a ramping fashion. - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE 0x0000 - -/* Enumeration for a linear ramping curve.*/ -#define ADM_CMD_MATRIX_RAMP_GAINS_RAMP_CURVE_LINEAR 0x0000 - -/* Payload of the #ADM_CMD_MATRIX_RAMP_GAINS_V5 command. - * Immediately following this structure are num_gains of the - * adm_session_copp_gain_v5structure. - */ -struct adm_cmd_matrix_ramp_gains_v5 { - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - - u16 num_gains; - /* Number of gains being applied. */ - - u16 reserved_for_align; - /* Reserved. This field must be set to zero.*/ -} __packed; - -/* Session-to-COPP path gain structure, used by the - * #ADM_CMD_MATRIX_RAMP_GAINS_V5 command. - * This structure specifies the target - * gain (per channel) that must be applied - * to a particular session-to-COPP path in - * the audio matrix. The structure can - * also be used to apply the gain globally - * to all session-to-COPP paths that - * exist for the given session. - * The aDSP uses device channel mapping to - * determine which channel gains to - * use from this command. For example, - * if the device is configured as stereo, - * the aDSP uses only target_gain_ch_1 and - * target_gain_ch_2, and it ignores - * the others. - */ -struct adm_session_copp_gain_v5 { - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to 8. - */ - - u16 copp_id; -/* Handle of the COPP. Gain will be applied on the Session ID - * COPP ID path. - */ - - u16 ramp_duration; -/* Duration (in milliseconds) of the ramp over - * which target gains are - * to be applied. Use - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE - * to indicate that gain must be applied immediately. - */ - - u16 step_duration; -/* Duration (in milliseconds) of each step in the ramp. - * This parameter is ignored if ramp_duration is equal to - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE. - * Supported value: 1 - */ - - u16 ramp_curve; -/* Type of ramping curve. - * Supported value: #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_CURVE_LINEAR - */ - - u16 reserved_for_align; - /* Reserved. This field must be set to zero. */ - - u16 target_gain_ch_1; - /* Target linear gain for channel 1 in Q13 format; */ - - u16 target_gain_ch_2; - /* Target linear gain for channel 2 in Q13 format; */ - - u16 target_gain_ch_3; - /* Target linear gain for channel 3 in Q13 format; */ - - u16 target_gain_ch_4; - /* Target linear gain for channel 4 in Q13 format; */ - - u16 target_gain_ch_5; - /* Target linear gain for channel 5 in Q13 format; */ - - u16 target_gain_ch_6; - /* Target linear gain for channel 6 in Q13 format; */ - - u16 target_gain_ch_7; - /* Target linear gain for channel 7 in Q13 format; */ - - u16 target_gain_ch_8; - /* Target linear gain for channel 8 in Q13 format; */ -} __packed; - -/* Payload of the #ADM_CMD_MATRIX_RAMP_GAINS_V7 command. - * Immediately following this structure are num_gains of the - * adm_session_copp_gain_v5structure. - */ -struct adm_cmd_matrix_ramp_gains_v7 { - struct apr_hdr hdr; - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. -*/ - - u16 num_gains; - /* Number of gains being applied. */ - - u16 reserved_for_align; - /* Reserved. This field must be set to zero.*/ -} __packed; - -/* Session-to-COPP path gain structure, used by the - * #ADM_CMD_MATRIX_RAMP_GAINS_V7 command. - * This structure specifies the target - * gain (per channel) that must be applied - * to a particular session-to-COPP path in - * the audio matrix. The structure can - * also be used to apply the gain globally - * to all session-to-COPP paths that - * exist for the given session. - * The aDSP uses device channel mapping to - * determine which channel gains to - * use from this command. For example, - * if the device is configured as stereo, - * the aDSP uses only target_gain_ch_1 and - * target_gain_ch_2, and it ignores - * the others. - */ -struct adm_session_copp_gain_v7 { - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to 8. - */ - - u16 copp_id; -/* Handle of the COPP. Gain will be applied on the Session ID - * COPP ID path. - */ - - u16 ramp_duration; -/* Duration (in milliseconds) of the ramp over - * which target gains are - * to be applied. Use - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE - * to indicate that gain must be applied immediately. - */ - - u16 step_duration; -/* Duration (in milliseconds) of each step in the ramp. - * This parameter is ignored if ramp_duration is equal to - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE. - * Supported value: 1 - */ - - u16 ramp_curve; -/* Type of ramping curve. - * Supported value: #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_CURVE_LINEAR - */ - - u16 stream_type; -/* Type of stream_type. - * Supported value: #STREAM_TYPE_ASM STREAM_TYPE_LSM - */ - u16 num_channels; -/* Number of channels on which gain needs to be applied. - * Supported value: 1 to 32. - */ - u16 reserved_for_align; - /* Reserved. This field must be set to zero. */ -} __packed; - -/* Allows to set mute/unmute on various session-to-COPP paths. - * For every session-to-COPP path (stream-device interconnection), - * mute/unmute can be set individually on the output channels. - */ -#define ADM_CMD_MATRIX_MUTE_V5 0x0001032D - -/* Allows to set mute/unmute on various session-to-COPP paths. - * For every session-to-COPP path (stream-device interconnection), - * mute/unmute can be set individually on the output channels. - */ -#define ADM_CMD_MATRIX_MUTE_V7 0x0001036D - -/* Indicates that mute/unmute in the - * current adm_session_copp_mute_v5structure - * is to be applied to all the session-to-COPP - * paths that exist for the specified session. - */ -#define ADM_CMD_MATRIX_MUTE_COPP_ID_ALL_CONNECTED_COPPS 0xFFFF - -/* Payload of the #ADM_CMD_MATRIX_MUTE_V5 command*/ -struct adm_cmd_matrix_mute_v5 { - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to 8. - */ - - u16 copp_id; -/* Handle of the COPP. - * Use ADM_CMD_MATRIX_MUTE_COPP_ID_ALL_CONNECTED_COPPS - * to indicate that mute/unmute must be applied to - * all the COPPs connected to session_id. - * Supported values: - * - 0xFFFF -- Apply mute/unmute to all connected COPPs - * - Other values -- Valid COPP ID - */ - - u8 mute_flag_ch_1; - /* Mute flag for channel 1 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_2; - /* Mute flag for channel 2 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_3; - /* Mute flag for channel 3 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_4; - /* Mute flag for channel 4 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_5; - /* Mute flag for channel 5 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_6; - /* Mute flag for channel 6 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_7; - /* Mute flag for channel 7 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_8; - /* Mute flag for channel 8 is set to unmute (0) or mute (1). */ - - u16 ramp_duration; -/* Period (in milliseconds) over which the soft mute/unmute will be - * applied. - * Supported values: 0 (Default) to 0xFFFF - * The default of 0 means mute/unmute will be applied immediately. - */ - - u16 reserved_for_align; - /* Clients must set this field to zero.*/ -} __packed; - - -/* Payload of the #ADM_CMD_MATRIX_MUTE_V7 command*/ -struct adm_cmd_matrix_mute_v7 { - struct apr_hdr hdr; - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to . - */ - - u16 copp_id; -/* Handle of the COPP. - * Use ADM_CMD_MATRIX_MUTE_COPP_ID_ALL_CONNECTED_COPPS - * to indicate that mute/unmute must be applied to - * all the COPPs connected to session_id. - * Supported values: - * - 0xFFFF -- Apply mute/unmute to all connected COPPs - * - Other values -- Valid COPP ID - */ - - u16 ramp_duration; -/* Duration (in milliseconds) of the ramp over - * which target gains are - * to be applied. Use - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE - * to indicate that gain must be applied immediately. - */ - - u16 stream_type; -/* Specify whether the stream type is connectedon the ASM or LSM - * Supported value: 1 - */ - u16 num_channels; -/* Number of channels on which gain needs to be applied - * Supported value: 1 to 32 - */ -} __packed; - - -#define ASM_PARAM_ID_AAC_STEREO_MIX_COEFF_SELECTION_FLAG_V2 (0x00010DD8) - -struct asm_aac_stereo_mix_coeff_selection_param_v2 { - struct apr_hdr hdr; - u32 param_id; - u32 param_size; - u32 aac_stereo_mix_coeff_flag; -} __packed; - -/* Allows a client to connect the desired stream to - * the desired AFE port through the stream router - * - * This command allows the client to connect specified session to - * specified AFE port. This is used for compressed streams only - * opened using the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED or - * #ASM_STREAM_CMD_OPEN_READ_COMPRESSED command. - * - * @prerequisites - * Session ID and AFE Port ID must be valid. - * #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED or - * #ASM_STREAM_CMD_OPEN_READ_COMPRESSED - * must have been called on this session. - */ - -#define ADM_CMD_CONNECT_AFE_PORT_V5 0x0001032E -#define ADM_CMD_DISCONNECT_AFE_PORT_V5 0x0001032F -/* Enumeration for the Rx stream router ID.*/ -#define ADM_STRTR_ID_RX 0 -/* Enumeration for the Tx stream router ID.*/ -#define ADM_STRTR_IDX 1 - -/* Payload of the #ADM_CMD_CONNECT_AFE_PORT_V5 command.*/ -struct adm_cmd_connect_afe_port_v5 { - struct apr_hdr hdr; - u8 mode; -/* ID of the stream router (RX/TX). Use the - * ADM_STRTR_ID_RX or ADM_STRTR_IDX macros - * to set this field. - */ - - u8 session_id; - /* Session ID of the stream to connect */ - - u16 afe_port_id; - /* Port ID of the AFE port to connect to.*/ - u32 num_channels; -/* Number of device channels - * Supported values: 2(Audio Sample Packet), - * 8 (HBR Audio Stream Sample Packet) - */ - - u32 sampling_rate; -/* Device sampling rate - * Supported values: Any - */ -} __packed; - - -/* adsp_adm_api.h */ - - -/* Port ID. Update afe_get_port_index - * when a new port is added here. - */ -#define PRIMARY_I2S_RX 0 -#define PRIMARY_I2S_TX 1 -#define SECONDARY_I2S_RX 4 -#define SECONDARY_I2S_TX 5 -#define MI2S_RX 6 -#define MI2S_TX 7 -#define HDMI_RX 8 -#define RSVD_2 9 -#define RSVD_3 10 -#define DIGI_MIC_TX 11 -#define VOICE2_PLAYBACK_TX 0x8002 -#define VOICE_RECORD_RX 0x8003 -#define VOICE_RECORD_TX 0x8004 -#define VOICE_PLAYBACK_TX 0x8005 - -/* Slimbus Multi channel port id pool */ -#define SLIMBUS_0_RX 0x4000 -#define SLIMBUS_0_TX 0x4001 -#define SLIMBUS_1_RX 0x4002 -#define SLIMBUS_1_TX 0x4003 -#define SLIMBUS_2_RX 0x4004 -#define SLIMBUS_2_TX 0x4005 -#define SLIMBUS_3_RX 0x4006 -#define SLIMBUS_3_TX 0x4007 -#define SLIMBUS_4_RX 0x4008 -#define SLIMBUS_4_TX 0x4009 -#define SLIMBUS_5_RX 0x400a -#define SLIMBUS_5_TX 0x400b -#define SLIMBUS_6_RX 0x400c -#define SLIMBUS_6_TX 0x400d -#define SLIMBUS_7_RX 0x400e -#define SLIMBUS_7_TX 0x400f -#define SLIMBUS_8_RX 0x4010 -#define SLIMBUS_8_TX 0x4011 -#define SLIMBUS_9_RX 0x4012 -#define SLIMBUS_9_TX 0x4013 -#define SLIMBUS_PORT_LAST SLIMBUS_9_TX -#define INT_BT_SCO_RX 0x3000 -#define INT_BT_SCO_TX 0x3001 -#define INT_BT_A2DP_RX 0x3002 -#define INT_FM_RX 0x3004 -#define INT_FM_TX 0x3005 -#define RT_PROXY_PORT_001_RX 0x2000 -#define RT_PROXY_PORT_001_TX 0x2001 -#define AFE_LOOPBACK_TX 0x6001 -#define DISPLAY_PORT_RX 0x6020 - -#define AFE_LANE_MASK_INVALID 0 - -#define AFE_PORT_INVALID 0xFFFF -#define SLIMBUS_INVALID AFE_PORT_INVALID - -#define AFE_PORT_CMD_START 0x000100ca - -#define AFE_EVENT_RTPORT_START 0 -#define AFE_EVENT_RTPORT_STOP 1 -#define AFE_EVENT_RTPORT_LOW_WM 2 -#define AFE_EVENT_RTPORT_HI_WM 3 - -#define ADSP_AFE_VERSION 0x00200000 - -/* Size of the range of port IDs for the audio interface. */ -#define AFE_PORT_ID_AUDIO_IF_PORT_RANGE_SIZE 0xF - -/* Size of the range of port IDs for internal BT-FM ports. */ -#define AFE_PORT_ID_INTERNAL_BT_FM_RANGE_SIZE 0x6 - -/* Size of the range of port IDs for SLIMbus® - * multichannel - * ports. - */ -#define AFE_PORT_ID_SLIMBUS_RANGE_SIZE 0xA - -/* Size of the range of port IDs for real-time proxy ports. */ -#define AFE_PORT_ID_RT_PROXY_PORT_RANGE_SIZE 0x4 - -/* Size of the range of port IDs for pseudoports. */ -#define AFE_PORT_ID_PSEUDOPORT_RANGE_SIZE 0x5 - -/* Start of the range of port IDs for the audio interface. */ -#define AFE_PORT_ID_AUDIO_IF_PORT_RANGE_START 0x1000 - -/* End of the range of port IDs for the audio interface. */ -#define AFE_PORT_ID_AUDIO_IF_PORT_RANGE_END \ - (AFE_PORT_ID_AUDIO_IF_PORT_RANGE_START +\ - AFE_PORT_ID_AUDIO_IF_PORT_RANGE_SIZE - 1) - -/* Start of the range of port IDs for real-time proxy ports. */ -#define AFE_PORT_ID_RT_PROXY_PORT_RANGE_START 0x2000 - -/* End of the range of port IDs for real-time proxy ports. */ -#define AFE_PORT_ID_RT_PROXY_PORT_RANGE_END \ - (AFE_PORT_ID_RT_PROXY_PORT_RANGE_START +\ - AFE_PORT_ID_RT_PROXY_PORT_RANGE_SIZE-1) - -/* Start of the range of port IDs for internal BT-FM devices. */ -#define AFE_PORT_ID_INTERNAL_BT_FM_RANGE_START 0x3000 - -/* End of the range of port IDs for internal BT-FM devices. */ -#define AFE_PORT_ID_INTERNAL_BT_FM_RANGE_END \ - (AFE_PORT_ID_INTERNAL_BT_FM_RANGE_START +\ - AFE_PORT_ID_INTERNAL_BT_FM_RANGE_SIZE-1) - -/* Start of the range of port IDs for SLIMbus devices. */ -#define AFE_PORT_ID_SLIMBUS_RANGE_START 0x4000 - -/* End of the range of port IDs for SLIMbus devices. */ -#define AFE_PORT_ID_SLIMBUS_RANGE_END \ - (AFE_PORT_ID_SLIMBUS_RANGE_START +\ - AFE_PORT_ID_SLIMBUS_RANGE_SIZE-1) - -/* Start of the range of port IDs for pseudoports. */ -#define AFE_PORT_ID_PSEUDOPORT_RANGE_START 0x8001 - -/* End of the range of port IDs for pseudoports. */ -#define AFE_PORT_ID_PSEUDOPORT_RANGE_END \ - (AFE_PORT_ID_PSEUDOPORT_RANGE_START +\ - AFE_PORT_ID_PSEUDOPORT_RANGE_SIZE-1) - -/* Start of the range of port IDs for TDM devices. */ -#define AFE_PORT_ID_TDM_PORT_RANGE_START 0x9000 - -/* End of the range of port IDs for TDM devices. */ -#define AFE_PORT_ID_TDM_PORT_RANGE_END \ - (AFE_PORT_ID_TDM_PORT_RANGE_START+0x60-1) - -/* Size of the range of port IDs for TDM ports. */ -#define AFE_PORT_ID_TDM_PORT_RANGE_SIZE \ - (AFE_PORT_ID_TDM_PORT_RANGE_END - \ - AFE_PORT_ID_TDM_PORT_RANGE_START+1) - -#define AFE_PORT_ID_PRIMARY_MI2S_RX 0x1000 -#define AFE_PORT_ID_PRIMARY_MI2S_TX 0x1001 -#define AFE_PORT_ID_SECONDARY_MI2S_RX 0x1002 -#define AFE_PORT_ID_SECONDARY_MI2S_TX 0x1003 -#define AFE_PORT_ID_TERTIARY_MI2S_RX 0x1004 -#define AFE_PORT_ID_TERTIARY_MI2S_TX 0x1005 -#define AFE_PORT_ID_QUATERNARY_MI2S_RX 0x1006 -#define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007 -#define AUDIO_PORT_ID_I2S_RX 0x1008 -#define AFE_PORT_ID_DIGITAL_MIC_TX 0x1009 -#define AFE_PORT_ID_PRIMARY_PCM_RX 0x100A -#define AFE_PORT_ID_PRIMARY_PCM_TX 0x100B -#define AFE_PORT_ID_SECONDARY_PCM_RX 0x100C -#define AFE_PORT_ID_SECONDARY_PCM_TX 0x100D -#define AFE_PORT_ID_MULTICHAN_HDMI_RX 0x100E -#define AFE_PORT_ID_SECONDARY_MI2S_RX_SD1 0x1010 -#define AFE_PORT_ID_TERTIARY_PCM_RX 0x1012 -#define AFE_PORT_ID_TERTIARY_PCM_TX 0x1013 -#define AFE_PORT_ID_QUATERNARY_PCM_RX 0x1014 -#define AFE_PORT_ID_QUATERNARY_PCM_TX 0x1015 -#define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016 -#define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017 -/* ID of the senary MI2S Rx port. */ -#define AFE_PORT_ID_SENARY_MI2S_RX 0x1018 -/* ID of the senary MI2S Tx port. */ -#define AFE_PORT_ID_SENARY_MI2S_TX 0x1019 - -/* ID of the Internal 0 MI2S Rx port */ -#define AFE_PORT_ID_INT0_MI2S_RX 0x102E -/* ID of the Internal 0 MI2S Tx port */ -#define AFE_PORT_ID_INT0_MI2S_TX 0x102F -/* ID of the Internal 1 MI2S Rx port */ -#define AFE_PORT_ID_INT1_MI2S_RX 0x1030 -/* ID of the Internal 1 MI2S Tx port */ -#define AFE_PORT_ID_INT1_MI2S_TX 0x1031 -/* ID of the Internal 2 MI2S Rx port */ -#define AFE_PORT_ID_INT2_MI2S_RX 0x1032 -/* ID of the Internal 2 MI2S Tx port */ -#define AFE_PORT_ID_INT2_MI2S_TX 0x1033 -/* ID of the Internal 3 MI2S Rx port */ -#define AFE_PORT_ID_INT3_MI2S_RX 0x1034 -/* ID of the Internal 3 MI2S Tx port */ -#define AFE_PORT_ID_INT3_MI2S_TX 0x1035 -/* ID of the Internal 4 MI2S Rx port */ -#define AFE_PORT_ID_INT4_MI2S_RX 0x1036 -/* ID of the Internal 4 MI2S Tx port */ -#define AFE_PORT_ID_INT4_MI2S_TX 0x1037 -/* ID of the Internal 5 MI2S Rx port */ -#define AFE_PORT_ID_INT5_MI2S_RX 0x1038 -/* ID of the Internal 5 MI2S Tx port */ -#define AFE_PORT_ID_INT5_MI2S_TX 0x1039 -/* ID of the Internal 6 MI2S Rx port */ -#define AFE_PORT_ID_INT6_MI2S_RX 0x103A -/* ID of the Internal 6 MI2S Tx port */ -#define AFE_PORT_ID_INT6_MI2S_TX 0x103B - -#define AFE_PORT_ID_QUINARY_PCM_RX 0x103C -#define AFE_PORT_ID_QUINARY_PCM_TX 0x103D - -/* ID of the senary auxiliary PCM Rx port. */ -#define AFE_PORT_ID_SENARY_PCM_RX 0x103E -/* ID of the senary auxiliary PCM Tx port. */ -#define AFE_PORT_ID_SENARY_PCM_TX 0x103F - -#define AFE_PORT_ID_PRIMARY_META_MI2S_RX 0x1300 -#define AFE_PORT_ID_SECONDARY_META_MI2S_RX 0x1302 - -#define AFE_PORT_ID_PRIMARY_SPDIF_RX 0x5000 -#define AFE_PORT_ID_PRIMARY_SPDIF_TX 0x5001 -#define AFE_PORT_ID_SECONDARY_SPDIF_RX 0x5002 -#define AFE_PORT_ID_SECONDARY_SPDIF_TX 0x5003 -#define AFE_PORT_ID_SPDIF_RX AFE_PORT_ID_PRIMARY_SPDIF_RX - -#define AFE_PORT_ID_RT_PROXY_PORT_001_RX 0x2000 -#define AFE_PORT_ID_RT_PROXY_PORT_001_TX 0x2001 -#define AFE_PORT_ID_INTERNAL_BT_SCO_RX 0x3000 -#define AFE_PORT_ID_INTERNAL_BT_SCO_TX 0x3001 -#define AFE_PORT_ID_INTERNAL_BT_A2DP_RX 0x3002 -#define AFE_PORT_ID_INTERNAL_FM_RX 0x3004 -#define AFE_PORT_ID_INTERNAL_FM_TX 0x3005 -/* SLIMbus Rx port on channel 0. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX 0x4000 -/* SLIMbus Tx port on channel 0. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX 0x4001 -/* SLIMbus Rx port on channel 1. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX 0x4002 -/* SLIMbus Tx port on channel 1. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX 0x4003 -/* SLIMbus Rx port on channel 2. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX 0x4004 -/* SLIMbus Tx port on channel 2. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX 0x4005 -/* SLIMbus Rx port on channel 3. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX 0x4006 -/* SLIMbus Tx port on channel 3. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX 0x4007 -/* SLIMbus Rx port on channel 4. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX 0x4008 -/* SLIMbus Tx port on channel 4. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX 0x4009 -/* SLIMbus Rx port on channel 5. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX 0x400a -/* SLIMbus Tx port on channel 5. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX 0x400b -/* SLIMbus Rx port on channel 6. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX 0x400c -/* SLIMbus Tx port on channel 6. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX 0x400d -/* SLIMbus Rx port on channel 7. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_RX 0x400e -/* SLIMbus Tx port on channel 7. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_TX 0x400f -/* SLIMbus Rx port on channel 8. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_RX 0x4010 -/* SLIMbus Tx port on channel 8. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_TX 0x4011 -/* SLIMbus Rx port on channel 9. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_RX 0x4012 -/* SLIMbus Tx port on channel 9. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_TX 0x4013 -/* AFE Rx port for audio over Display port */ -#define AFE_PORT_ID_HDMI_OVER_DP_RX 0x6020 -/*USB AFE port */ -#define AFE_PORT_ID_USB_RX 0x7000 -#define AFE_PORT_ID_USB_TX 0x7001 - -/* AFE WSA Codec DMA Rx port 0 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_RX_0 0xB000 - -/* AFE WSA Codec DMA Tx port 0 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_TX_0 0xB001 - -/* AFE WSA Codec DMA Rx port 1 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_RX_1 0xB002 - -/* AFE WSA Codec DMA Tx port 1 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_TX_1 0xB003 - -/* AFE WSA Codec DMA Tx port 2 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_TX_2 0xB005 - -/* AFE VA Codec DMA Tx port 0 */ -#define AFE_PORT_ID_VA_CODEC_DMA_TX_0 0xB021 - -/* AFE VA Codec DMA Tx port 1 */ -#define AFE_PORT_ID_VA_CODEC_DMA_TX_1 0xB023 - -/* AFE VA Codec DMA Tx port 2 */ -#define AFE_PORT_ID_VA_CODEC_DMA_TX_2 0xB025 - -/* AFE Rx Codec DMA Rx port 0 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_0 0xB030 - -/* AFE Tx Codec DMA Tx port 0 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_0 0xB031 - -/* AFE Rx Codec DMA Rx port 1 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_1 0xB032 - -/* AFE Tx Codec DMA Tx port 1 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_1 0xB033 - -/* AFE Rx Codec DMA Rx port 2 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_2 0xB034 - -/* AFE Tx Codec DMA Tx port 2 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_2 0xB035 - -/* AFE Rx Codec DMA Rx port 3 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_3 0xB036 - -/* AFE Tx Codec DMA Tx port 3 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_3 0xB037 - -/* AFE Rx Codec DMA Rx port 4 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_4 0xB038 - -/* AFE Tx Codec DMA Tx port 4 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_4 0xB039 - -/* AFE Rx Codec DMA Rx port 5 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_5 0xB03A - -/* AFE Tx Codec DMA Tx port 5 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_5 0xB03B - -/* AFE Rx Codec DMA Rx port 6 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_6 0xB03C - -/* AFE Rx Codec DMA Rx port 7 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_7 0xB03E - -/* Generic pseudoport 1. */ -#define AFE_PORT_ID_PSEUDOPORT_01 0x8001 -/* Generic pseudoport 2. */ -#define AFE_PORT_ID_PSEUDOPORT_02 0x8002 - -/* @xreflabel{hdr:AfePortIdPrimaryAuxPcmTx} - * Primary Aux PCM Tx port ID. - */ -#define AFE_PORT_ID_PRIMARY_PCM_TX 0x100B -/* Pseudoport that corresponds to the voice Rx path. - * For recording, the voice Rx path samples are written to this - * port and consumed by the audio path. - */ - -#define AFE_PORT_ID_VOICE_RECORD_RX 0x8003 - -/* Pseudoport that corresponds to the voice Tx path. - * For recording, the voice Tx path samples are written to this - * port and consumed by the audio path. - */ - -#define AFE_PORT_ID_VOICE_RECORD_TX 0x8004 -/* Pseudoport that corresponds to in-call voice delivery samples. - * During in-call audio delivery, the audio path delivers samples - * to this port from where the voice path delivers them on the - * Rx path. - */ -#define AFE_PORT_ID_VOICE2_PLAYBACK_TX 0x8002 -#define AFE_PORT_ID_VOICE_PLAYBACK_TX 0x8005 - -/* - * Proxyport used for voice call data processing. - * In cases like call-screening feature, where user can communicate - * with caller with the help of "call screen" mode, and without - * connecting the call with any HW input/output devices in the phon, - * voice call can use Pseudo port to start voice data processing. - */ -#define RT_PROXY_PORT_002_TX 0x2003 -#define RT_PROXY_PORT_002_RX 0x2002 - -#define AFE_PORT_ID_PRIMARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x00) -#define AFE_PORT_ID_PRIMARY_TDM_RX_1 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x02) -#define AFE_PORT_ID_PRIMARY_TDM_RX_2 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x04) -#define AFE_PORT_ID_PRIMARY_TDM_RX_3 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x06) -#define AFE_PORT_ID_PRIMARY_TDM_RX_4 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x08) -#define AFE_PORT_ID_PRIMARY_TDM_RX_5 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_PRIMARY_TDM_RX_6 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_PRIMARY_TDM_RX_7 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_PRIMARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x01) -#define AFE_PORT_ID_PRIMARY_TDM_TX_1 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x02) -#define AFE_PORT_ID_PRIMARY_TDM_TX_2 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x04) -#define AFE_PORT_ID_PRIMARY_TDM_TX_3 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x06) -#define AFE_PORT_ID_PRIMARY_TDM_TX_4 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x08) -#define AFE_PORT_ID_PRIMARY_TDM_TX_5 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_PRIMARY_TDM_TX_6 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_PRIMARY_TDM_TX_7 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_SECONDARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x10) -#define AFE_PORT_ID_SECONDARY_TDM_RX_1 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x02) -#define AFE_PORT_ID_SECONDARY_TDM_RX_2 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x04) -#define AFE_PORT_ID_SECONDARY_TDM_RX_3 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x06) -#define AFE_PORT_ID_SECONDARY_TDM_RX_4 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x08) -#define AFE_PORT_ID_SECONDARY_TDM_RX_5 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_SECONDARY_TDM_RX_6 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_SECONDARY_TDM_RX_7 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_SECONDARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x11) -#define AFE_PORT_ID_SECONDARY_TDM_TX_1 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x02) -#define AFE_PORT_ID_SECONDARY_TDM_TX_2 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x04) -#define AFE_PORT_ID_SECONDARY_TDM_TX_3 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x06) -#define AFE_PORT_ID_SECONDARY_TDM_TX_4 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x08) -#define AFE_PORT_ID_SECONDARY_TDM_TX_5 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_SECONDARY_TDM_TX_6 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_SECONDARY_TDM_TX_7 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_TERTIARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x20) -#define AFE_PORT_ID_TERTIARY_TDM_RX_1 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x02) -#define AFE_PORT_ID_TERTIARY_TDM_RX_2 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x04) -#define AFE_PORT_ID_TERTIARY_TDM_RX_3 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x06) -#define AFE_PORT_ID_TERTIARY_TDM_RX_4 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x08) -#define AFE_PORT_ID_TERTIARY_TDM_RX_5 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_TERTIARY_TDM_RX_6 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_TERTIARY_TDM_RX_7 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_TERTIARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x21) -#define AFE_PORT_ID_TERTIARY_TDM_TX_1 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x02) -#define AFE_PORT_ID_TERTIARY_TDM_TX_2 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x04) -#define AFE_PORT_ID_TERTIARY_TDM_TX_3 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x06) -#define AFE_PORT_ID_TERTIARY_TDM_TX_4 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x08) -#define AFE_PORT_ID_TERTIARY_TDM_TX_5 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_TERTIARY_TDM_TX_6 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_TERTIARY_TDM_TX_7 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_QUATERNARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x30) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_1 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x02) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_2 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x04) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_3 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x06) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_4 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x08) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_5 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_6 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_7 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_QUATERNARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x31) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_1 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x02) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_2 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x04) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_3 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x06) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_4 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x08) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_5 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_6 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_7 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_QUINARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x40) -#define AFE_PORT_ID_QUINARY_TDM_RX_1 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x02) -#define AFE_PORT_ID_QUINARY_TDM_RX_2 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x04) -#define AFE_PORT_ID_QUINARY_TDM_RX_3 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x06) -#define AFE_PORT_ID_QUINARY_TDM_RX_4 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x08) -#define AFE_PORT_ID_QUINARY_TDM_RX_5 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_QUINARY_TDM_RX_6 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_QUINARY_TDM_RX_7 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_QUINARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x41) -#define AFE_PORT_ID_QUINARY_TDM_TX_1 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x02) -#define AFE_PORT_ID_QUINARY_TDM_TX_2 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x04) -#define AFE_PORT_ID_QUINARY_TDM_TX_3 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x06) -#define AFE_PORT_ID_QUINARY_TDM_TX_4 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x08) -#define AFE_PORT_ID_QUINARY_TDM_TX_5 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_QUINARY_TDM_TX_6 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_QUINARY_TDM_TX_7 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_SENARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x50) -#define AFE_PORT_ID_SENARY_TDM_RX_1 \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x02) -#define AFE_PORT_ID_SENARY_TDM_RX_2 \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x04) -#define AFE_PORT_ID_SENARY_TDM_RX_3 \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x06) -#define AFE_PORT_ID_SENARY_TDM_RX_4 \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x08) -#define AFE_PORT_ID_SENARY_TDM_RX_5 \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_SENARY_TDM_RX_6 \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_SENARY_TDM_RX_7 \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_SENARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x51) -#define AFE_PORT_ID_SENARY_TDM_TX_1 \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x02) -#define AFE_PORT_ID_SENARY_TDM_TX_2 \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x04) -#define AFE_PORT_ID_SENARY_TDM_TX_3 \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x06) -#define AFE_PORT_ID_SENARY_TDM_TX_4 \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x08) -#define AFE_PORT_ID_SENARY_TDM_TX_5 \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_SENARY_TDM_TX_6 \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_SENARY_TDM_TX_7 \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_INVALID 0xFFFF - -#define AAC_ENC_MODE_AAC_LC 0x02 -#define AAC_ENC_MODE_AAC_P 0x05 -#define AAC_ENC_MODE_EAAC_P 0x1D - -#define AFE_PSEUDOPORT_CMD_START 0x000100cf -struct afe_pseudoport_start_command { - struct apr_hdr hdr; - u16 port_id; /* Pseudo Port 1 = 0x8000 */ - /* Pseudo Port 2 = 0x8001 */ - /* Pseudo Port 3 = 0x8002 */ - u16 timing; /* FTRT = 0 , AVTimer = 1, */ -} __packed; - -#define AFE_PSEUDOPORT_CMD_STOP 0x000100d0 -struct afe_pseudoport_stop_command { - struct apr_hdr hdr; - u16 port_id; /* Pseudo Port 1 = 0x8000 */ - /* Pseudo Port 2 = 0x8001 */ - /* Pseudo Port 3 = 0x8002 */ - u16 reserved; -} __packed; - - -#define AFE_MODULE_SIDETONE_IIR_FILTER 0x00010202 -#define AFE_PARAM_ID_ENABLE 0x00010203 - -/* Payload of the #AFE_PARAM_ID_ENABLE - * parameter, which enables or - * disables any module. - * The fixed size of this structure is four bytes. - */ - -struct afe_mod_enable_param { - u16 enable; - /* Enables (1) or disables (0) the module. */ - - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -/* ID of the configuration parameter used by the - * #AFE_MODULE_SIDETONE_IIR_FILTER module. - */ -#define AFE_PARAM_ID_SIDETONE_IIR_FILTER_CONFIG 0x00010204 -#define MAX_SIDETONE_IIR_DATA_SIZE 224 -#define MAX_NO_IIR_FILTER_STAGE 10 - -struct afe_sidetone_iir_filter_config_params { - u16 num_biquad_stages; -/* Number of stages. - * Supported values: Minimum of 5 and maximum of 10 - */ - - u16 pregain; -/* Pregain for the compensating filter response. - * Supported values: Any number in Q13 format - */ - uint8_t iir_config[MAX_SIDETONE_IIR_DATA_SIZE]; -} __packed; - -#define AFE_MODULE_LOOPBACK 0x00010205 -#define AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH 0x00010206 - -/* Used by RTAC */ -struct afe_rtac_user_data_set_v2 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* Actual size of the payload in bytes. - * This is used for parsing the parameter payload. - * Supported values: > 0 - */ - u16 payload_size; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter header for the parameter data to set */ - struct param_hdr_v1 param_hdr; - - /* The parameter data to be filled when sent inband */ - u32 *param_data; -} __packed; - -struct afe_rtac_user_data_set_v3 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - /* Reserved for future enhancements. Must be 0. */ - u16 reserved; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The size of the parameter header and parameter data */ - u32 payload_size; - - /* The parameter header for the parameter data to set */ - struct param_hdr_v3 param_hdr; - - /* The parameter data to be filled when sent inband */ - u32 *param_data; -} __packed; - -struct afe_rtac_user_data_get_v2 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* Actual size of the payload in bytes. - * This is used for parsing the parameter payload. - * Supported values: > 0 - */ - u16 payload_size; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The module ID of the parameter to get */ - u32 module_id; - - /* The parameter ID of the parameter to get */ - u32 param_id; - - /* The parameter data to be filled when sent inband */ - struct param_hdr_v1 param_hdr; -} __packed; - -struct afe_rtac_user_data_get_v3 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - /* Reserved for future enhancements. Must be 0. */ - u16 reserved; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter data to be filled when sent inband */ - struct param_hdr_v3 param_hdr; -} __packed; - -#define AFE_PORT_CMD_SET_PARAM_V2 0x000100EF -struct afe_port_cmd_set_param_v2 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* - * Actual size of the payload in bytes. - * This is used for parsing the parameter payload. - * Supported values: > 0 - */ - u16 payload_size; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter data to be filled when sent inband */ - u8 param_data[0]; -} __packed; - -#define AFE_PORT_CMD_SET_PARAM_V3 0x000100FA -struct afe_port_cmd_set_param_v3 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* Port ID of the AFE port to configure. Port interface and direction - * (Rx or Tx) to configure. An even number represents the Rx direction, - * and an odd number represents the Tx direction. - */ - u16 port_id; - - /* Reserved. This field must be set to zero. */ - u16 reserved; - - /* The memory mapping header to be used when sending outband */ - struct mem_mapping_hdr mem_hdr; - - /* The total size of the payload, including param_hdr_v3 */ - u32 payload_size; - - /* - * The parameter data to be filled when sent inband. - * Must include param_hdr packed correctly. - */ - u8 param_data[0]; -} __packed; - -/* Payload of the #AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH parameter, - * which gets/sets loopback gain of a port to an Rx port. - * The Tx port ID of the loopback is part of the set_param command. - */ - -struct afe_loopback_gain_per_path_param { - u16 rx_port_id; -/* Rx port of the loopback. */ - -u16 gain; -/* Loopback gain per path of the port. - * Supported values: Any number in Q13 format - */ -} __packed; - -/* Parameter ID used to configure and enable/disable the - * loopback path. The difference with respect to the existing - * API, AFE_PORT_CMD_LOOPBACK, is that it allows Rx port to be - * configured as source port in loopback path. Port-id in - * AFE_PORT_CMD_SET_PARAM cmd is the source port which can be - * Tx or Rx port. In addition, we can configure the type of - * routing mode to handle different use cases. - */ -#define AFE_PARAM_ID_LOOPBACK_CONFIG 0x0001020B -#define AFE_API_VERSION_LOOPBACK_CONFIG 0x1 - -enum afe_loopback_routing_mode { - LB_MODE_DEFAULT = 1, - /* Regular loopback from source to destination port */ - LB_MODE_SIDETONE, - /* Sidetone feed from Tx source to Rx destination port */ - LB_MODE_EC_REF_VOICE_AUDIO, - /* Echo canceller reference, voice + audio + DTMF */ - LB_MODE_EC_REF_VOICE - /* Echo canceller reference, voice alone */ -} __packed; - -/* Payload of the #AFE_PARAM_ID_LOOPBACK_CONFIG , - * which enables/disables one AFE loopback. - */ -struct afe_loopback_cfg_v1 { - u32 loopback_cfg_minor_version; -/* Minor version used for tracking the version of the RMC module - * configuration interface. - * Supported values: #AFE_API_VERSION_LOOPBACK_CONFIG - */ - u16 dst_port_id; - /* Destination Port Id. */ - u16 routing_mode; -/* Specifies data path type from src to dest port. - * Supported values: - * #LB_MODE_DEFAULT - * #LB_MODE_SIDETONE - * #LB_MODE_EC_REF_VOICE_AUDIO - * #LB_MODE_EC_REF_VOICE_A - * #LB_MODE_EC_REF_VOICE - */ - - u16 enable; -/* Specifies whether to enable (1) or - * disable (0) an AFE loopback. - */ - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0. - */ - -} __packed; - -struct afe_loopback_sidetone_gain { - u16 rx_port_id; - u16 gain; -} __packed; - -struct afe_display_stream_idx { - u32 minor_version; - u32 stream_idx; -} __packed; - -struct afe_display_ctl_idx { - u32 minor_version; - u32 ctl_idx; -} __packed; - -struct loopback_cfg_data { - u32 loopback_cfg_minor_version; -/* Minor version used for tracking the version of the RMC module - * configuration interface. - * Supported values: #AFE_API_VERSION_LOOPBACK_CONFIG - */ - u16 dst_port_id; - /* Destination Port Id. */ - u16 routing_mode; -/* Specifies data path type from src to dest port. - * Supported values: - * #LB_MODE_DEFAULT - * #LB_MODE_SIDETONE - * #LB_MODE_EC_REF_VOICE_AUDIO - * #LB_MODE_EC_REF_VOICE_A - * #LB_MODE_EC_REF_VOICE - */ - - u16 enable; -/* Specifies whether to enable (1) or - * disable (0) an AFE loopback. - */ - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0. - */ -} __packed; - -struct afe_st_loopback_cfg_v1 { - struct apr_hdr hdr; - struct mem_mapping_hdr mem_hdr; - struct param_hdr_v1 gain_pdata; - struct afe_loopback_sidetone_gain gain_data; - struct param_hdr_v1 cfg_pdata; - struct loopback_cfg_data cfg_data; -} __packed; - -struct afe_loopback_iir_cfg_v2 { - struct apr_hdr hdr; - struct mem_mapping_hdr param; - struct param_hdr_v1 st_iir_enable_pdata; - struct afe_mod_enable_param st_iir_mode_enable_data; - struct param_hdr_v1 st_iir_filter_config_pdata; - struct afe_sidetone_iir_filter_config_params st_iir_filter_config_data; -} __packed; - - -/* - * Param ID and related structures for AFE event - * registration. - */ -#define AFE_PORT_CMD_MOD_EVENT_CFG 0x000100FD - -struct afe_port_cmd_event_cfg { - struct apr_hdr hdr; - uint32_t version; - /* Version number. The current version is 0 */ - - uint32_t port_id; - /* - * Port ID for the AFE port hosting the modules - * being registered for the events - */ - - uint32_t num_events; - /* - * Number of events to be registered with the service - * Each event has the structure of - * afe_port_cmd_mod_evt_cfg_payload. - */ - uint8_t payload[0]; -}; - -/** Event registration for a module. */ -#define AFE_MODULE_REGISTER_EVENT_FLAG 1 - -/** Event de-registration for a module. */ -#define AFE_MODULE_DEREGISTER_EVENT_FLAG 0 - -struct afe_port_cmd_mod_evt_cfg_payload { - uint32_t module_id; - /* Valid ID of the module. */ - - uint16_t instance_id; - /* - * Valid ID of the module instance in the current topology. - * If both module_id and instance_id ID are set to 0, the event is - * registered with all modules and instances in the topology. - * If module_id is set to 0 and instance_id is set to a non-zero value, - * the payload is considered to be invalid. - */ - - uint16_t reserved; - /* Used for alignment; must be set to 0.*/ - - uint32_t event_id; - /* Unique ID of the event. */ - - uint32_t reg_flag; - /* - * Bit field for enabling or disabling event registration. - * values - * - #AFE_MODULE_REGISTER_EVENT_FLAG - * - #AFE_MODULE_DEREGISTER_EVENT_FLAG - */ -} __packed; - - -#define AFE_PORT_MOD_EVENT 0x0001010C - -struct afe_port_mod_evt_rsp_hdr { - uint32_t minor_version; - /* This indicates the minor version of the payload */ - - uint32_t port_id; - /* AFE port hosting this module */ - - uint32_t module_id; - /* Module ID which is raising the event */ - - uint16_t instance_id; - /* Instance ID of the module which is raising the event */ - - uint16_t reserved; - /* For alignment purpose, should be set to 0 */ - - uint32_t event_id; - /* Valid event ID registered by client */ - - uint32_t payload_size; - /* - * Size of the event payload - * This is followed by actual payload corresponding to the event - */ -} __packed; - -#define AFE_PORT_SP_DC_DETECTION_EVENT 0x0001010D - -#define AFE_MODULE_SPEAKER_PROTECTION 0x00010209 -#define AFE_PARAM_ID_SPKR_PROT_CONFIG 0x0001020a -#define AFE_API_VERSION_SPKR_PROT_CONFIG 0x1 -#define AFE_SPKR_PROT_EXCURSIONF_LEN 512 -struct afe_spkr_prot_cfg_param_v1 { - u32 spkr_prot_minor_version; -/* - * Minor version used for tracking the version of the - * speaker protection module configuration interface. - * Supported values: #AFE_API_VERSION_SPKR_PROT_CONFIG - */ - -int16_t win_size; -/* Analysis and synthesis window size (nWinSize). - * Supported values: 1024, 512, 256 samples - */ - -int16_t margin; -/* Allowable margin for excursion prediction, - * in L16Q15 format. This is a - * control parameter to allow - * for overestimation of peak excursion. - */ - -int16_t spkr_exc_limit; -/* Speaker excursion limit, in L16Q15 format.*/ - -int16_t spkr_resonance_freq; -/* Resonance frequency of the speaker; used - * to define a frequency range - * for signal modification. - * - * Supported values: 0 to 2000 Hz - */ - -int16_t limhresh; -/* Threshold of the hard limiter; used to - * prevent overshooting beyond a - * signal level that was set by the limiter - * prior to speaker protection. - * Supported values: 0 to 32767 - */ - -int16_t hpf_cut_off_freq; -/* High pass filter cutoff frequency. - * Supported values: 100, 200, 300 Hz - */ - -int16_t hpf_enable; -/* Specifies whether the high pass filter - * is enabled (0) or disabled (1). - */ - -int16_t reserved; -/* This field must be set to zero. */ - -int32_t amp_gain; -/* Amplifier gain in L32Q15 format. - * This is the RMS voltage at the - * loudspeaker when a 0dBFS tone - * is played in the digital domain. - */ - -int16_t excursionf[AFE_SPKR_PROT_EXCURSIONF_LEN]; -/* Array of the excursion transfer function. - * The peak excursion of the - * loudspeaker diaphragm is - * measured in millimeters for 1 Vrms Sine - * tone at all FFT bin frequencies. - * Supported values: Q15 format - */ -} __packed; - - -#define AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER 0x000100E0 - -/* Payload of the #AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER - * command, which registers a real-time port driver - * with the AFE service. - */ -struct afe_service_cmd_register_rt_port_driver { - struct apr_hdr hdr; - u16 port_id; -/* Port ID with which the real-time driver exchanges data - * (registers for events). - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -#define AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER 0x000100E1 - -/* Payload of the #AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER - * command, which unregisters a real-time port driver from - * the AFE service. - */ -struct afe_service_cmd_unregister_rt_port_driver { - struct apr_hdr hdr; - u16 port_id; -/* Port ID from which the real-time - * driver unregisters for events. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -#define AFE_EVENT_RT_PROXY_PORT_STATUS 0x00010105 -#define AFE_EVENTYPE_RT_PROXY_PORT_START 0 -#define AFE_EVENTYPE_RT_PROXY_PORT_STOP 1 -#define AFE_EVENTYPE_RT_PROXY_PORT_LOW_WATER_MARK 2 -#define AFE_EVENTYPE_RT_PROXY_PORT_HIGH_WATER_MARK 3 -#define AFE_EVENTYPE_RT_PROXY_PORT_INVALID 0xFFFF - -/* Payload of the #AFE_EVENT_RT_PROXY_PORT_STATUS - * message, which sends an event from the AFE service - * to a registered client. - */ -struct afe_event_rt_proxy_port_status { - u16 port_id; -/* Port ID to which the event is sent. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 eventype; -/* Type of event. - * Supported values: - * - #AFE_EVENTYPE_RT_PROXY_PORT_START - * - #AFE_EVENTYPE_RT_PROXY_PORT_STOP - * - #AFE_EVENTYPE_RT_PROXY_PORT_LOW_WATER_MARK - * - #AFE_EVENTYPE_RT_PROXY_PORT_HIGH_WATER_MARK - */ -} __packed; - -#define AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2 0x000100ED - -struct afe_port_data_cmd_rt_proxy_port_write_v2 { - struct apr_hdr hdr; - u16 port_id; -/* Tx (mic) proxy port ID with which the real-time - * driver exchanges data. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 reserved; - /* This field must be set to zero. */ - - u32 buffer_address_lsw; -/* LSW Address of the buffer containing the - * data from the real-time source - * device on a client. - */ - - u32 buffer_address_msw; -/* MSW Address of the buffer containing the - * data from the real-time source - * device on a client. - */ - - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory - * attributes is returned if - * AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS - * command is successful. - * Supported Values: - * - Any 32 bit value - */ - - u32 available_bytes; -/* Number of valid bytes available - * in the buffer (including all - * channels: number of bytes per - * channel = availableBytesumChannels). - * Supported values: > 0 - * - * This field must be equal to the frame - * size specified in the #AFE_PORT_AUDIO_IF_CONFIG - * command that was sent to configure this - * port. - */ -} __packed; - -#define AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2 0x000100EE - -/* Payload of the - * #AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2 command, which - * delivers an empty buffer to the AFE service. On - * acknowledgment, data is filled in the buffer. - */ -struct afe_port_data_cmd_rt_proxy_port_read_v2 { - struct apr_hdr hdr; - u16 port_id; -/* Rx proxy port ID with which the real-time - * driver exchanges data. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - * (This must be an Rx (speaker) port.) - */ - - u16 reserved; - /* This field must be set to zero. */ - - u32 buffer_address_lsw; -/* LSW Address of the buffer containing the data sent from the AFE - * service to a real-time sink device on the client. - */ - - - u32 buffer_address_msw; -/* MSW Address of the buffer containing the data sent from the AFE - * service to a real-time sink device on the client. - */ - - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory attributes is - * returned if AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS command is - * successful. - * Supported Values: - * - Any 32 bit value - */ - - u32 available_bytes; -/* Number of valid bytes available in the buffer (including all - * channels). - * Supported values: > 0 - * This field must be equal to the frame size specified in the - * #AFE_PORT_AUDIO_IF_CONFIG command that was sent to configure - * this port. - */ -} __packed; - -/* This module ID is related to device configuring like I2S,PCM, - * HDMI, SLIMBus etc. This module supports following parameter ids. - * - #AFE_PARAM_ID_I2S_CONFIG - * - #AFE_PARAM_ID_PCM_CONFIG - * - #AFE_PARAM_ID_DIGI_MIC_CONFIG - * - #AFE_PARAM_ID_HDMI_CONFIG - * - #AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG - * - #AFE_PARAM_ID_SLIMBUS_CONFIG - * - #AFE_PARAM_ID_RT_PROXY_CONFIG - */ - -#define AFE_MODULE_AUDIO_DEV_INTERFACE 0x0001020C -#define AFE_PORT_SAMPLE_RATE_8K 8000 -#define AFE_PORT_SAMPLE_RATE_16K 16000 -#define AFE_PORT_SAMPLE_RATE_32K 32000 -#define AFE_PORT_SAMPLE_RATE_44_1K 44100 -#define AFE_PORT_SAMPLE_RATE_48K 48000 -#define AFE_PORT_SAMPLE_RATE_96K 96000 -#define AFE_PORT_SAMPLE_RATE_176P4K 176400 -#define AFE_PORT_SAMPLE_RATE_192K 192000 -#define AFE_PORT_SAMPLE_RATE_352P8K 352800 -#define AFE_LINEAR_PCM_DATA 0x0 -#define AFE_NON_LINEAR_DATA 0x1 -#define AFE_LINEAR_PCM_DATA_PACKED_60958 0x2 -#define AFE_NON_LINEAR_DATA_PACKED_60958 0x3 -#define AFE_GENERIC_COMPRESSED 0x8 -#define AFE_LINEAR_PCM_DATA_PACKED_16BIT 0X6 -#define AFE_DSD_DOP_W_MARKER_DATA 0x9 - -/* This param id is used to configure I2S interface */ -#define AFE_PARAM_ID_I2S_CONFIG 0x0001020D -#define AFE_API_VERSION_I2S_CONFIG 0x1 -/* Enumeration for setting the I2S configuration - * channel_mode parameter to - * serial data wire number 1-3 (SD3). - */ -#define AFE_PORT_I2S_SD0 0x1 -#define AFE_PORT_I2S_SD1 0x2 -#define AFE_PORT_I2S_SD2 0x3 -#define AFE_PORT_I2S_SD3 0x4 -#define AFE_PORT_I2S_QUAD01 0x5 -#define AFE_PORT_I2S_QUAD23 0x6 -#define AFE_PORT_I2S_6CHS 0x7 -#define AFE_PORT_I2S_8CHS 0x8 -#define AFE_PORT_I2S_10CHS 0x9 -#define AFE_PORT_I2S_12CHS 0xA -#define AFE_PORT_I2S_14CHS 0xB -#define AFE_PORT_I2S_16CHS 0xC -#define AFE_PORT_I2S_SD4 0xD -#define AFE_PORT_I2S_SD5 0xE -#define AFE_PORT_I2S_SD6 0xF -#define AFE_PORT_I2S_SD7 0x10 -#define AFE_PORT_I2S_QUAD45 0x11 -#define AFE_PORT_I2S_QUAD67 0x12 -#define AFE_PORT_I2S_8CHS_2 0x13 -#define AFE_PORT_I2S_MONO 0x0 -#define AFE_PORT_I2S_STEREO 0x1 -#define AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL 0x0 -#define AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL 0x1 - -/* Payload of the #AFE_PARAM_ID_I2S_CONFIG - * command's (I2S configuration - * parameter). - */ -struct afe_param_id_i2s_cfg { - u32 i2s_cfg_minor_version; -/* Minor version used for tracking the version of the I2S - * configuration interface. - * Supported values: #AFE_API_VERSION_I2S_CONFIG - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - - u16 channel_mode; -/* I2S lines and multichannel operation. - * Supported values: - * - #AFE_PORT_I2S_SD0 - * - #AFE_PORT_I2S_SD1 - * - #AFE_PORT_I2S_SD2 - * - #AFE_PORT_I2S_SD3 - * - #AFE_PORT_I2S_QUAD01 - * - #AFE_PORT_I2S_QUAD23 - * - #AFE_PORT_I2S_6CHS - * - #AFE_PORT_I2S_8CHS - * - #AFE_PORT_I2S_10CHS - * - #AFE_PORT_I2S_12CHS - * - #AFE_PORT_I2S_14CHS - * - #AFE_PORT_I2S_16CHS - * - #AFE_PORT_I2S_SD4 - * - #AFE_PORT_I2S_SD5 - * - #AFE_PORT_I2S_SD6 - * - #AFE_PORT_I2S_SD7 - * - #AFE_PORT_I2S_QUAD45 - * - #AFE_PORT_I2S_QUAD67 - * - #AFE_PORT_I2S_8CHS_2 - */ - - u16 mono_stereo; -/* Specifies mono or stereo. This applies only when - * a single I2S line is used. - * Supported values: - * - #AFE_PORT_I2S_MONO - * - #AFE_PORT_I2S_STEREO - */ - - u16 ws_src; -/* Word select source: internal or external. - * Supported values: - * - #AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL - * - #AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_192K - */ - - u16 data_format; -/* data format - * Supported values: - * - #LINEAR_PCM_DATA - * - #NON_LINEAR_DATA - * - #LINEAR_PCM_DATA_PACKED_IN_60958 - * - #NON_LINEAR_DATA_PACKED_IN_60958 - * - #AFE_DSD_DOP_W_MARKER_DATA - */ - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -/* This param id is used to configure META I2S interface */ -#define AFE_PARAM_ID_META_I2S_CONFIG 0x000102C5 -#define AFE_API_VERSION_META_I2S_CONFIG 0x1 -#define MAX_NUM_I2S_META_PORT_MEMBER_PORTS 4 - -/* Payload of the #AFE_PARAM_ID_META_I2S_CONFIG - * command's (I2S configuration - * parameter). - */ -struct afe_param_id_meta_i2s_cfg { - u32 minor_version; -/* Minor version used for tracking the version of the I2S - * configuration interface. - * Supported values: #AFE_API_VERSION_META_I2S_CONFIG - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - - u16 ws_src; -/* Word select source: internal or external. - * Supported values: - * - #AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL - * - #AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_192K - */ - - u16 member_port_id[MAX_NUM_I2S_META_PORT_MEMBER_PORTS]; -/* Array of member port IDs in this meta device. - * Supported values: - * - #AFE_PORT_ID_PRIMARY_MI2S_RX - * - #AFE_PORT_ID_SECONDARY_MI2S_RX - * - #AFE_PORT_ID_TERTIARY_MI2S_RX - * - #AFE_PORT_ID_QUATERNY_MI2S_RX - * - #AFE_PORT_ID_INVALID - * - * Fill these values from index 0. Set unused index to AFE_PORT_ID_INVALID. - * - * Note: - * the first member port will act as WS master in case - * meta port ws_src is configured as AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL. - * In all other cases member ports will act as slave. - * This must be considered when HLOS enables the interface clocks - */ - - u16 member_port_channel_mode[MAX_NUM_I2S_META_PORT_MEMBER_PORTS]; -/* I2S lines and multichannel operation per member port. - * The sequence matches the sequence in member_port_id, - * value will be ignored if member port is set to AFE_PORT_ID_INVALID - * - * Supported values: - * - #AFE_PORT_I2S_SD0 - * - #AFE_PORT_I2S_SD1 - * - #AFE_PORT_I2S_SD2 - * - #AFE_PORT_I2S_SD3 - * - #AFE_PORT_I2S_QUAD01 - * - #AFE_PORT_I2S_QUAD23 - * - #AFE_PORT_I2S_6CHS - * - #AFE_PORT_I2S_8CHS - * - #AFE_PORT_I2S_10CHS - * - #AFE_PORT_I2S_12CHS - * - #AFE_PORT_I2S_14CHS - * - #AFE_PORT_I2S_16CHS - * - #AFE_PORT_I2S_SD4 - * - #AFE_PORT_I2S_SD5 - * - #AFE_PORT_I2S_SD6 - * - #AFE_PORT_I2S_SD7 - * - #AFE_PORT_I2S_QUAD45 - * - #AFE_PORT_I2S_QUAD67 - * - #AFE_PORT_I2S_8CHS_2 - */ - - u16 data_format; -/* data format - * Supported values: - * - #LINEAR_PCM_DATA - */ - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -/* - * This param id is used to configure PCM interface - */ - -#define AFE_API_VERSION_SPDIF_CONFIG_V2 0x2 -#define AFE_API_VERSION_SPDIF_CONFIG 0x1 -#define AFE_API_VERSION_SPDIF_CH_STATUS_CONFIG 0x1 -#define AFE_API_VERSION_SPDIF_CLK_CONFIG 0x1 -#define AFE_CH_STATUS_A 1 -#define AFE_CH_STATUS_B 2 - -#define AFE_PARAM_ID_SPDIF_CONFIG 0x00010244 -#define AFE_PARAM_ID_CH_STATUS_CONFIG 0x00010245 -#define AFE_PARAM_ID_SPDIF_CLK_CONFIG 0x00010246 - -#define AFE_PORT_CLK_ROOT_LPAPLL 0x3 -#define AFE_PORT_CLK_ROOT_LPAQ6PLL 0x4 - -#define AFE_MODULE_CUSTOM_EVENTS 0x00010251 - -#define AFE_PORT_FMT_UPDATE_EVENT 0x0001010E - -#define AFE_API_VERSION_EVENT_FMT_UPDATE 0x1 -#define AFE_PORT_STATUS_NO_SIGNAL 0 -#define AFE_PORT_STATUS_AUDIO_ACTIVE 1 -#define AFE_PORT_STATUS_AUDIO_EOS 2 - -struct afe_param_id_spdif_cfg_v2 { -/* Minor version used for tracking the version of the SPDIF - * configuration interface. - * Supported values: #AFE_API_VERSION_SPDIF_CONFIG, - * #AFE_API_VERSION_SPDIF_CONFIG_V2 - */ - u32 spdif_cfg_minor_version; - -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_22_05K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_44_1K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_176_4K - * - #AFE_PORT_SAMPLE_RATE_192K - */ - u32 sample_rate; - -/* data format - * Supported values: - * - #AFE_LINEAR_PCM_DATA - * - #AFE_NON_LINEAR_DATA - */ - u16 data_format; -/* Number of channels supported by the port - * - PCM - 1, Compressed Case - 2 - */ - u16 num_channels; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - u16 bit_width; -/* This field must be set to zero. */ - u16 reserved; -/* Input select for spdif input, must be set to 0 for spdif output. */ - u32 src_sel; -} __packed; - -struct afe_param_id_spdif_ch_status_cfg { - u32 ch_status_cfg_minor_version; -/* Minor version used for tracking the version of channel - * status configuration. Current supported version is 1 - */ - - u32 status_type; -/* Indicate if the channel status is for channel A or B - * Supported values: - * - #AFE_CH_STATUS_A - * - #AFE_CH_STATUS_B - */ - - u8 status_bits[24]; -/* Channel status - 192 bits for channel - * Byte ordering as defined by IEC60958-3 - */ - - u8 status_mask[24]; -/* Channel status with mask bits 1 will be applied. - * Byte ordering as defined by IEC60958-3 - */ -} __packed; - -/* deprecated */ -struct afe_param_id_spdif_clk_cfg { - u32 clk_cfg_minor_version; -/* Minor version used for tracking the version of SPDIF - * interface clock configuration. Current supported version - * is 1 - */ - - u32 clk_value; -/* Specifies the clock frequency in Hz to set - * Supported values: - * 0 - Disable the clock - * 2 (byphase) * 32 (60958 subframe size) * sampling rate * 2 - * (channels A and B) - */ - - u32 clk_root; -/* Specifies SPDIF root clk source - * Supported Values: - * - #AFE_PORT_CLK_ROOT_LPAPLL - * - #AFE_PORT_CLK_ROOT_LPAQ6PLL - */ -} __packed; - -struct afe_event_fmt_update { - /* Tracks the configuration of this event. */ - u32 minor_version; - - /* Detected port status. - * Supported values: - * - #AFE_PORT_STATUS_NO_SIGNAL - * - #AFE_PORT_STATUS_AUDIO_ACTIVE - * - #AFE_PORT_STATUS_AUDIO_EOS - */ - u32 status; - - /* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_44_1K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_88_2K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_176_4K - * - #AFE_PORT_SAMPLE_RATE_192K - */ - u32 sample_rate; - - /* Data format of the port. - * Supported values: - * - #AFE_LINEAR_PCM_DATA - * - #AFE_NON_LINEAR_DATA - */ - u16 data_format; - - /* First 6 bytes of channel status bits */ - u8 channel_status[6]; -} __packed; - -struct afe_spdif_port_config { - struct afe_param_id_spdif_cfg_v2 cfg; - struct afe_param_id_spdif_ch_status_cfg ch_status; -} __packed; - -#define AFE_PARAM_ID_PCM_CONFIG 0x0001020E -#define AFE_API_VERSION_PCM_CONFIG 0x1 -/* Enumeration for the auxiliary PCM synchronization signal - * provided by an external source. - */ - -#define AFE_PORT_PCM_SYNC_SRC_EXTERNAL 0x0 -/* Enumeration for the auxiliary PCM synchronization signal - * provided by an internal source. - */ -#define AFE_PORT_PCM_SYNC_SRC_INTERNAL 0x1 -/* Enumeration for the PCM configuration aux_mode parameter, - * which configures the auxiliary PCM interface to use - * short synchronization. - */ -#define AFE_PORT_PCM_AUX_MODE_PCM 0x0 -/* - * Enumeration for the PCM configuration aux_mode parameter, - * which configures the auxiliary PCM interface to use long - * synchronization. - */ -#define AFE_PORT_PCM_AUX_MODE_AUX 0x1 -/* - * Enumeration for setting the PCM configuration frame to 8. - */ -#define AFE_PORT_PCM_BITS_PER_FRAME_8 0x0 -/* - * Enumeration for setting the PCM configuration frame to 16. - */ -#define AFE_PORT_PCM_BITS_PER_FRAME_16 0x1 - -/* Enumeration for setting the PCM configuration frame to 32.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_32 0x2 - -/* Enumeration for setting the PCM configuration frame to 64.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_64 0x3 - -/* Enumeration for setting the PCM configuration frame to 128.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_128 0x4 - -/* Enumeration for setting the PCM configuration frame to 256.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_256 0x5 - -/* Enumeration for setting the PCM configuration - * quantype parameter to A-law with no padding. - */ -#define AFE_PORT_PCM_ALAW_NOPADDING 0x0 - -/* Enumeration for setting the PCM configuration quantype - * parameter to mu-law with no padding. - */ -#define AFE_PORT_PCM_MULAW_NOPADDING 0x1 -/* Enumeration for setting the PCM configuration quantype - * parameter to linear with no padding. - */ -#define AFE_PORT_PCM_LINEAR_NOPADDING 0x2 -/* Enumeration for setting the PCM configuration quantype - * parameter to A-law with padding. - */ -#define AFE_PORT_PCM_ALAW_PADDING 0x3 -/* Enumeration for setting the PCM configuration quantype - * parameter to mu-law with padding. - */ -#define AFE_PORT_PCM_MULAW_PADDING 0x4 -/* Enumeration for setting the PCM configuration quantype - * parameter to linear with padding. - */ -#define AFE_PORT_PCM_LINEAR_PADDING 0x5 -/* Enumeration for disabling the PCM configuration - * ctrl_data_out_enable parameter. - * The PCM block is the only master. - */ -#define AFE_PORT_PCM_CTRL_DATA_OE_DISABLE 0x0 -/* - * Enumeration for enabling the PCM configuration - * ctrl_data_out_enable parameter. The PCM block shares - * the signal with other masters. - */ -#define AFE_PORT_PCM_CTRL_DATA_OE_ENABLE 0x1 - -/* Payload of the #AFE_PARAM_ID_PCM_CONFIG command's - * (PCM configuration parameter). - */ - -struct afe_param_id_pcm_cfg { - u32 pcm_cfg_minor_version; -/* Minor version used for tracking the version of the AUX PCM - * configuration interface. - * Supported values: #AFE_API_VERSION_PCM_CONFIG - */ - - u16 aux_mode; -/* PCM synchronization setting. - * Supported values: - * - #AFE_PORT_PCM_AUX_MODE_PCM - * - #AFE_PORT_PCM_AUX_MODE_AUX - */ - - u16 sync_src; -/* Synchronization source. - * Supported values: - * - #AFE_PORT_PCM_SYNC_SRC_EXTERNAL - * - #AFE_PORT_PCM_SYNC_SRC_INTERNAL - */ - - u16 frame_setting; -/* Number of bits per frame. - * Supported values: - * - #AFE_PORT_PCM_BITS_PER_FRAME_8 - * - #AFE_PORT_PCM_BITS_PER_FRAME_16 - * - #AFE_PORT_PCM_BITS_PER_FRAME_32 - * - #AFE_PORT_PCM_BITS_PER_FRAME_64 - * - #AFE_PORT_PCM_BITS_PER_FRAME_128 - * - #AFE_PORT_PCM_BITS_PER_FRAME_256 - */ - - u16 quantype; -/* PCM quantization type. - * Supported values: - * - #AFE_PORT_PCM_ALAW_NOPADDING - * - #AFE_PORT_PCM_MULAW_NOPADDING - * - #AFE_PORT_PCM_LINEAR_NOPADDING - * - #AFE_PORT_PCM_ALAW_PADDING - * - #AFE_PORT_PCM_MULAW_PADDING - * - #AFE_PORT_PCM_LINEAR_PADDING - */ - - u16 ctrl_data_out_enable; -/* Specifies whether the PCM block shares the data-out - * signal to the drive with other masters. - * Supported values: - * - #AFE_PORT_PCM_CTRL_DATA_OE_DISABLE - * - #AFE_PORT_PCM_CTRL_DATA_OE_ENABLE - */ - u16 reserved; - /* This field must be set to zero. */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to 4 - */ - - u16 slot_number_mapping[4]; -/* Specifies the slot number for the each channel in - * multi channel scenario. - * Supported values: 1 to 32 - */ -} __packed; - -/* - * This param id is used to configure DIGI MIC interface - */ -#define AFE_PARAM_ID_DIGI_MIC_CONFIG 0x0001020F -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_DIGI_MIC_CONFIG 0x1 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to left 0. - */ - -#define AFE_PORT_DIGI_MIC_MODE_LEFT0 0x1 - -/*Enumeration for setting the digital mic configuration - * channel_mode parameter to right 0. - */ - - -#define AFE_PORT_DIGI_MIC_MODE_RIGHT0 0x2 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to left 1. - */ - -#define AFE_PORT_DIGI_MIC_MODE_LEFT1 0x3 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to right 1. - */ - -#define AFE_PORT_DIGI_MIC_MODE_RIGHT1 0x4 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to stereo 0. - */ -#define AFE_PORT_DIGI_MIC_MODE_STEREO0 0x5 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to stereo 1. - */ - - -#define AFE_PORT_DIGI_MIC_MODE_STEREO1 0x6 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to quad. - */ - -#define AFE_PORT_DIGI_MIC_MODE_QUAD 0x7 - -/* Payload of the #AFE_PARAM_ID_DIGI_MIC_CONFIG command's - * (DIGI MIC configuration - * parameter). - */ -struct afe_param_id_digi_mic_cfg { - u32 digi_mic_cfg_minor_version; -/* Minor version used for tracking the version of the DIGI Mic - * configuration interface. - * Supported values: #AFE_API_VERSION_DIGI_MIC_CONFIG - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u16 channel_mode; -/* Digital mic and multichannel operation. - * Supported values: - * - #AFE_PORT_DIGI_MIC_MODE_LEFT0 - * - #AFE_PORT_DIGI_MIC_MODE_RIGHT0 - * - #AFE_PORT_DIGI_MIC_MODE_LEFT1 - * - #AFE_PORT_DIGI_MIC_MODE_RIGHT1 - * - #AFE_PORT_DIGI_MIC_MODE_STEREO0 - * - #AFE_PORT_DIGI_MIC_MODE_STEREO1 - * - #AFE_PORT_DIGI_MIC_MODE_QUAD - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - */ -} __packed; - -/* This param id is used to configure HDMI interface */ -#define AFE_PARAM_ID_HDMI_CONFIG 0x00010210 -#define AFE_PARAM_ID_HDMI_DP_MST_VID_IDX_CFG 0x000102b5 -#define AFE_PARAM_ID_HDMI_DPTX_IDX_CFG 0x000102b6 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_HDMI_CONFIG 0x1 - -/* Payload of the #AFE_PARAM_ID_HDMI_CONFIG command, - * which configures a multichannel HDMI audio interface. - */ -struct afe_param_id_hdmi_multi_chan_audio_cfg { - u32 hdmi_cfg_minor_version; -/* Minor version used for tracking the version of the HDMI - * configuration interface. - * Supported values: #AFE_API_VERSION_HDMI_CONFIG - */ - -u16 datatype; -/* data type - * Supported values: - * - #LINEAR_PCM_DATA - * - #NON_LINEAR_DATA - * - #LINEAR_PCM_DATA_PACKED_IN_60958 - * - #NON_LINEAR_DATA_PACKED_IN_60958 - */ - -u16 channel_allocation; -/* HDMI channel allocation information for programming an HDMI - * frame. The default is 0 (Stereo). - * - * This information is defined in the HDMI standard, CEA 861-D - * (refer to @xhyperref{S1,[S1]}). The number of channels is also - * inferred from this parameter. - */ - - -u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - 22050, 44100, 176400 for compressed streams - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -/* This param id is used to configure BT or FM(RIVA) interface */ -#define AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG 0x00010211 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_INTERNAL_BT_FM_CONFIG 0x1 - -/* Payload of the #AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG - * command's BT voice/BT audio/FM configuration parameter. - */ -struct afe_param_id_internal_bt_fm_cfg { - u32 bt_fm_cfg_minor_version; -/* Minor version used for tracking the version of the BT and FM - * configuration interface. - * Supported values: #AFE_API_VERSION_INTERNAL_BT_FM_CONFIG - */ - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to 2 - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K (only for BTSCO) - * - #AFE_PORT_SAMPLE_RATE_16K (only for BTSCO) - * - #AFE_PORT_SAMPLE_RATE_48K (FM and A2DP) - */ -} __packed; - -/* This param id is used to configure SLIMBUS interface using - * shared channel approach. - */ - -/* ID of the parameter used to set the latency mode of the - * USB audio device. - */ -#define AFE_PARAM_ID_PORT_LATENCY_MODE_CONFIG 0x000102B3 - -/* Minor version used for tracking USB audio latency mode */ -#define AFE_API_MINOR_VERSION_USB_AUDIO_LATENCY_MODE 0x1 - -/* Supported AFE port latency modes */ -#define AFE_PORT_DEFAULT_LATENCY_MODE 0x0 -#define AFE_PORT_LOW_LATENCY_MODE 0x1 - -#define AFE_PARAM_ID_SLIMBUS_CONFIG 0x00010212 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_SLIMBUS_CONFIG 0x1 - -/* Enumeration for setting SLIMbus device ID 1. */ -#define AFE_SLIMBUS_DEVICE_1 0x0 - -/* Enumeration for setting SLIMbus device ID 2. */ -#define AFE_SLIMBUS_DEVICE_2 0x1 - -/* Enumeration for setting the SLIMbus data formats. */ -#define AFE_SB_DATA_FORMAT_NOT_INDICATED 0x0 - -/* Enumeration for setting the maximum number of streams per - * device. - */ - -#define AFE_PORT_MAX_AUDIO_CHAN_CNT 0x8 - -#define AFE_PORT_MAX_AUDIO_CHAN_CNT_V2 0x20 - -/* Payload of the #AFE_PORT_CMD_SLIMBUS_CONFIG command's SLIMbus - * port configuration parameter. - */ - -struct afe_param_id_slimbus_cfg { - u32 sb_cfg_minor_version; -/* Minor version used for tracking the version of the SLIMBUS - * configuration interface. - * Supported values: #AFE_API_VERSION_SLIMBUS_CONFIG - */ - - u16 slimbus_dev_id; -/* SLIMbus hardware device ID, which is required to handle - * multiple SLIMbus hardware blocks. - * Supported values: - #AFE_SLIMBUS_DEVICE_1 - #AFE_SLIMBUS_DEVICE_2 - */ - - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - - u16 data_format; -/* Data format supported by the SLIMbus hardware. The default is - * 0 (#AFE_SB_DATA_FORMAT_NOT_INDICATED), which indicates the - * hardware does not perform any format conversions before the data - * transfer. - */ - - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT - */ - - u8 shared_ch_mapping[AFE_PORT_MAX_AUDIO_CHAN_CNT]; -/* Mapping of shared channel IDs (128 to 255) to which the - * master port is to be connected. - * Shared_channel_mapping[i] represents the shared channel assigned - * for audio channel i in multichannel audio data. - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_192K - */ -} __packed; - - -/* ID of the parameter used by AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS to configure - * USB audio device parameter. It should be used with - * AFE_MODULE_AUDIO_DEV_INTERFACE - */ -#define AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS 0x000102A5 - - -/* ID of the parameter used to set the endianness value for the - * USB audio device. It should be used with - * AFE_MODULE_AUDIO_DEV_INTERFACE - */ -#define AFE_PARAM_ID_USB_AUDIO_DEV_LPCM_FMT 0x000102AA - -/* Minor version used for tracking USB audio configuration */ -#define AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_usb_audio_dev_params { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Token of actual end USB aduio device */ - u32 dev_token; -} __packed; - -struct afe_param_id_usb_audio_dev_lpcm_fmt { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Endianness of actual end USB audio device */ - u32 endian; -} __packed; - -struct afe_param_id_usb_audio_dev_latency_mode { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_LATENCY_MODE - */ - u32 minor_version; -/* latency mode for the USB audio device */ - u32 mode; -} __packed; - -#define AFE_PARAM_ID_USB_AUDIO_SVC_INTERVAL 0x000102B7 - -struct afe_param_id_usb_audio_svc_interval { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Endianness of actual end USB audio device */ - u32 svc_interval; -} __packed; - -/* ID of the parameter used by AFE_PARAM_ID_USB_AUDIO_CONFIG to configure - * USB audio interface. It should be used with AFE_MODULE_AUDIO_DEV_INTERFACE - */ -#define AFE_PARAM_ID_USB_AUDIO_CONFIG 0x000102A4 - -/* Payload of the AFE_PARAM_ID_USB_AUDIO_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_usb_audio_cfg { -/* Minor version used for tracking USB audio device configuration. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Sampling rate of the port. - * Supported values: - * - AFE_PORT_SAMPLE_RATE_8K - * - AFE_PORT_SAMPLE_RATE_11025 - * - AFE_PORT_SAMPLE_RATE_12K - * - AFE_PORT_SAMPLE_RATE_16K - * - AFE_PORT_SAMPLE_RATE_22050 - * - AFE_PORT_SAMPLE_RATE_24K - * - AFE_PORT_SAMPLE_RATE_32K - * - AFE_PORT_SAMPLE_RATE_44P1K - * - AFE_PORT_SAMPLE_RATE_48K - * - AFE_PORT_SAMPLE_RATE_96K - * - AFE_PORT_SAMPLE_RATE_192K - */ - u32 sample_rate; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - u16 bit_width; -/* Number of channels. - * Supported values: 1 and 2 - */ - u16 num_channels; -/* Data format supported by the USB. The supported value is - * 0 (#AFE_USB_AUDIO_DATA_FORMAT_LINEAR_PCM). - */ - u16 data_format; -/* this field must be 0 */ - u16 reserved; -/* device token of actual end USB aduio device */ - u32 dev_token; -/* endianness of this interface */ - u32 endian; -/* service interval */ - u32 service_interval; -} __packed; - -/* This param id is used to configure Real Time Proxy interface. */ -#define AFE_PARAM_ID_RT_PROXY_CONFIG 0x00010213 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_RT_PROXY_CONFIG 0x1 - -/* Payload of the #AFE_PARAM_ID_RT_PROXY_CONFIG - * command (real-time proxy port configuration parameter). - */ -struct afe_param_id_rt_proxy_port_cfg { - u32 rt_proxy_cfg_minor_version; -/* Minor version used for tracking the version of rt-proxy - * config interface. - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u16 interleaved; -/* Specifies whether the data exchanged between the AFE - * interface and real-time port is interleaved. - * Supported values: - 0 -- Non-interleaved (samples from each - * channel are contiguous in the buffer) - 1 -- Interleaved - * (corresponding samples from each input channel are interleaved - * within the buffer) - */ - - - u16 frame_size; -/* Size of the frames that are used for PCM exchanges with this - * port. - * Supported values: > 0, in bytes - * For example, 5 ms buffers of 16 bits and 16 kHz stereo samples - * is 5 ms * 16 samples/ms * 2 bytes/sample * 2 channels = 320 - * bytes. - */ - u16 jitter_allowance; -/* Configures the amount of jitter that the port will allow. - * Supported values: > 0 - * For example, if +/-10 ms of jitter is anticipated in the timing - * of sending frames to the port, and the configuration is 16 kHz - * mono with 16-bit samples, this field is 10 ms * 16 samples/ms * 2 - * bytes/sample = 320. - */ - - u16 low_water_mark; -/* Low watermark in bytes (including all channels). - * Supported values: - * - 0 -- Do not send any low watermark events - * - > 0 -- Low watermark for triggering an event - * If the number of bytes in an internal circular buffer is lower - * than this low_water_mark parameter, a LOW_WATER_MARK event is - * sent to applications (via the #AFE_EVENT_RT_PROXY_PORT_STATUS - * event). - * Use of watermark events is optional for debugging purposes. - */ - - u16 high_water_mark; -/* High watermark in bytes (including all channels). - * Supported values: - * - 0 -- Do not send any high watermark events - * - > 0 -- High watermark for triggering an event - * If the number of bytes in an internal circular buffer exceeds - * TOTAL_CIRC_BUF_SIZE minus high_water_mark, a high watermark event - * is sent to applications (via the #AFE_EVENT_RT_PROXY_PORT_STATUS - * event). - * The use of watermark events is optional and for debugging - * purposes. - */ - - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - */ - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT - */ - - u16 reserved; - /* For 32 bit alignment. */ -} __packed; - - -/* This param id is used to configure the Pseudoport interface */ - -#define AFE_PARAM_ID_PSEUDO_PORT_CONFIG 0x00010219 - -/* Version information used to handle future additions to the configuration - * interface (for backward compatibility). - */ -#define AFE_API_VERSION_PSEUDO_PORT_CONFIG 0x1 - -/* Enumeration for setting the timing_mode parameter to faster than real - * time. - */ -#define AFE_PSEUDOPORT_TIMING_MODE_FTRT 0x0 - -/* Enumeration for setting the timing_mode parameter to real time using - * timers. - */ -#define AFE_PSEUDOPORT_TIMING_MODE_TIMER 0x1 - -/* Payload of the AFE_PARAM_ID_PSEUDO_PORT_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_pseudo_port_cfg { - u32 pseud_port_cfg_minor_version; - /* - * Minor version used for tracking the version of the pseudoport - * configuration interface. - */ - - u16 bit_width; - /* Bit width of the sample at values 16, 24 */ - - u16 num_channels; - /* Number of channels at values 1 to 8 */ - - u16 data_format; - /* Non-linear data format supported by the pseudoport (for future use). - * At values #AFE_LINEAR_PCM_DATA - */ - - u16 timing_mode; - /* Indicates whether the pseudoport synchronizes to the clock or - * operates faster than real time. - * at values - * - #AFE_PSEUDOPORT_TIMING_MODE_FTRT - * - #AFE_PSEUDOPORT_TIMING_MODE_TIMER @tablebulletend - */ - - u32 sample_rate; - /* Sample rate at which the pseudoport will run. - * at values - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_192K @tablebulletend - */ -} __packed; - -#define AFE_PARAM_ID_TDM_CONFIG 0x0001029D - -#define AFE_API_VERSION_TDM_CONFIG 1 - -#define AFE_PORT_TDM_SHORT_SYNC_BIT_MODE 0 -#define AFE_PORT_TDM_LONG_SYNC_MODE 1 -#define AFE_PORT_TDM_SHORT_SYNC_SLOT_MODE 2 - -#define AFE_PORT_TDM_SYNC_SRC_EXTERNAL 0 -#define AFE_PORT_TDM_SYNC_SRC_INTERNAL 1 - -#define AFE_PORT_TDM_CTRL_DATA_OE_DISABLE 0 -#define AFE_PORT_TDM_CTRL_DATA_OE_ENABLE 1 - -#define AFE_PORT_TDM_SYNC_NORMAL 0 -#define AFE_PORT_TDM_SYNC_INVERT 1 - -#define AFE_PORT_TDM_DATA_DELAY_0_BCLK_CYCLE 0 -#define AFE_PORT_TDM_DATA_DELAY_1_BCLK_CYCLE 1 -#define AFE_PORT_TDM_DATA_DELAY_2_BCLK_CYCLE 2 - -/* Payload of the AFE_PARAM_ID_TDM_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_tdm_cfg { - u32 tdm_cfg_minor_version; - /* < Minor version used to track TDM configuration. - * @values #AFE_API_VERSION_TDM_CONFIG - */ - - u32 num_channels; - /* < Number of enabled slots for TDM frame. - * @values 1 to 8 - */ - - u32 sample_rate; - /* < Sampling rate of the port. - * @values - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_24K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_176P4K - * - #AFE_PORT_SAMPLE_RATE_352P8K @tablebulletend - */ - - u32 bit_width; - /* < Bit width of the sample. - * @values 16, 24 - */ - - u16 data_format; - /* < Data format: linear ,compressed, generic compresssed - * @values - * - #AFE_LINEAR_PCM_DATA - * - #AFE_NON_LINEAR_DATA - * - #AFE_GENERIC_COMPRESSED - */ - - u16 sync_mode; - /* < TDM synchronization setting. - * @values (short, long, slot) sync mode - * - #AFE_PORT_TDM_SHORT_SYNC_BIT_MODE - * - #AFE_PORT_TDM_LONG_SYNC_MODE - * - #AFE_PORT_TDM_SHORT_SYNC_SLOT_MODE @tablebulletend - */ - - u16 sync_src; - /* < Synchronization source. - * @values - * - #AFE_PORT_TDM_SYNC_SRC_EXTERNAL - * - #AFE_PORT_TDM_SYNC_SRC_INTERNAL @tablebulletend - */ - - u16 nslots_per_frame; - /* < Number of slots per frame. Typical : 1, 2, 4, 8, 16, 32. - * @values 1 - 32 - */ - - u16 ctrl_data_out_enable; - /* < Specifies whether the TDM block shares the data-out signal to the - * drive with other masters. - * @values - * - #AFE_PORT_TDM_CTRL_DATA_OE_DISABLE - * - #AFE_PORT_TDM_CTRL_DATA_OE_ENABLE @tablebulletend - */ - - u16 ctrl_invert_sync_pulse; - /* < Specifies whether to invert the sync or not. - * @values - * - #AFE_PORT_TDM_SYNC_NORMAL - * - #AFE_PORT_TDM_SYNC_INVERT @tablebulletend - */ - - u16 ctrl_sync_data_delay; - /* < Specifies the number of bit clock to delay data with respect to - * sync edge. - * @values - * - #AFE_PORT_TDM_DATA_DELAY_0_BCLK_CYCLE - * - #AFE_PORT_TDM_DATA_DELAY_1_BCLK_CYCLE - * - #AFE_PORT_TDM_DATA_DELAY_2_BCLK_CYCLE @tablebulletend - */ - - u16 slot_width; - /* < Slot width of the slot in a TDM frame. (slot_width >= bit_width) - * have to be satisfied. - * @values 16, 24, 32 - */ - - u32 slot_mask; - /* < Position of active slots. When that bit is set, - * that paricular slot is active. - * Number of active slots can be inferred by number of - * bits set in the mask. Only 8 individual bits can be enabled. - * Bits 0..31 corresponding to slot 0..31 - * @values 1 to 2^32 - 1 - */ -} __packed; - -/* ID of Time Divsion Multiplexing (TDM) module, - * which is used for configuring the AFE TDM. - * - * This module supports following parameter IDs: - * - #AFE_PORT_TDM_SLOT_CONFIG - * - * To configure the TDM interface, the client must use the - * #AFE_PORT_CMD_SET_PARAM command, and fill the module ID with the - * respective parameter IDs as listed above. - */ - -#define AFE_MODULE_TDM 0x0001028A - -/* ID of the parameter used by #AFE_MODULE_TDM to configure - * the TDM slot mapping. #AFE_PORT_CMD_SET_PARAM can use this parameter ID. - */ -#define AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG 0x00010297 - -/* Version information used to handle future additions to slot mapping - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_SLOT_MAPPING_CONFIG 0x1 - -/** Version information used to handle future additions to slot mapping -* configuration support 32 channels. -*/ -#define AFE_API_VERSION_SLOT_MAPPING_CONFIG_V2 0x2 -/* Data align type */ -#define AFE_SLOT_MAPPING_DATA_ALIGN_MSB 0 -#define AFE_SLOT_MAPPING_DATA_ALIGN_LSB 1 - -#define AFE_SLOT_MAPPING_OFFSET_INVALID 0xFFFF - -/* Payload of the AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG - * command's TDM configuration parameter. - */ -struct afe_param_id_slot_mapping_cfg { - u32 minor_version; - /* < Minor version used for tracking TDM slot configuration. - * @values #AFE_API_VERSION_TDM_SLOT_CONFIG - */ - - u16 num_channel; - /* < number of channel of the audio sample. - * @values 1, 2, 4, 6, 8 @tablebulletend - */ - - u16 bitwidth; - /* < Slot bit width for each channel - * @values 16, 24, 32 - */ - - u32 data_align_type; - /* < indicate how data packed from slot_offset for 32 slot bit width - * in case of sample bit width is 24. - * @values - * #AFE_SLOT_MAPPING_DATA_ALIGN_MSB - * #AFE_SLOT_MAPPING_DATA_ALIGN_LSB - */ - - u16 offset[AFE_PORT_MAX_AUDIO_CHAN_CNT]; - /* < Array of the slot mapping start offset in bytes for this frame. - * The bytes is counted from 0. The 0 is mapped to the 1st byte - * in or out of the digital serial data line this sub-frame belong to. - * slot_offset[] setting is per-channel based. - * The max num of channel supported is 8. - * The valid offset value must always be continuly placed in from - * index 0. - * Set offset as AFE_SLOT_MAPPING_OFFSET_INVALID for not used arrays. - * If "slot_bitwidth_per_channel" is 32 and "sample_bitwidth" is 24, - * "data_align_type" is used to indicate how 24 bit sample data in - * aligning with 32 bit slot width per-channel. - * @values, in byte - */ -} __packed; - -/* Payload of the AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG_V2 -* command's TDM configuration parameter. -*/ -struct afe_param_id_slot_mapping_cfg_v2 { - u32 minor_version; - /**< Minor version used for tracking TDM slot configuration. - * @values #AFE_API_VERSION_TDM_SLOT_CONFIG - */ - - u16 num_channel; - /**< number of channel of the audio sample. - * @values 1, 2, 4, 6, 8, 16, 32 @tablebulletend - */ - - u16 bitwidth; - /**< Slot bit width for each channel - * @values 16, 24, 32 - */ - - u32 data_align_type; - /**< indicate how data packed from slot_offset for 32 slot bit width - * in case of sample bit width is 24. - * @values - * #AFE_SLOT_MAPPING_DATA_ALIGN_MSB - * #AFE_SLOT_MAPPING_DATA_ALIGN_LSB - */ - - u16 offset[AFE_PORT_MAX_AUDIO_CHAN_CNT_V2]; - /**< Array of the slot mapping start offset in bytes for this frame. - * The bytes is counted from 0. The 0 is mapped to the 1st byte - * in or out of the digital serial data line this sub-frame belong to. - * slot_offset[] setting is per-channel based. - * The max num of channel supported is 8. - * The valid offset value must always be continuly placed in - * from index 0. - * Set offset as AFE_SLOT_MAPPING_OFFSET_INVALID for not used arrays. - * If "slot_bitwidth_per_channel" is 32 and "sample_bitwidth" is 24, - * "data_align_type" is used to indicate how 24 bit sample data in - * aligning with 32 bit slot width per-channel. - * @values, in byte - */ -} __packed; - -/** ID of the parameter used by #AFE_MODULE_TDM to configure - the customer TDM header. #AFE_PORT_CMD_SET_PARAM can use this parameter ID. -*/ -#define AFE_PARAM_ID_CUSTOM_TDM_HEADER_CONFIG 0x00010298 - -/* Version information used to handle future additions to custom TDM header - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_CUSTOM_TDM_HEADER_CONFIG 0x1 - -#define AFE_CUSTOM_TDM_HEADER_TYPE_INVALID 0x0 -#define AFE_CUSTOM_TDM_HEADER_TYPE_DEFAULT 0x1 -#define AFE_CUSTOM_TDM_HEADER_TYPE_ENTERTAINMENT_MOST 0x2 - -#define AFE_CUSTOM_TDM_HEADER_MAX_CNT 0x8 - -/* Payload of the AFE_PARAM_ID_CUSTOM_TDM_HEADER_CONFIG parameter ID */ -struct afe_param_id_custom_tdm_header_cfg { - u32 minor_version; - /* < Minor version used for tracking custom TDM header configuration. - * @values #AFE_API_VERSION_CUSTOM_TDM_HEADER_CONFIG - */ - - u16 start_offset; - /* < the slot mapping start offset in bytes from this sub-frame - * The bytes is counted from 0. The 0 is mapped to the 1st byte in or - * out of the digital serial data line this sub-frame belong to. - * @values, in byte, - * supported values are 0, 4, 8 - */ - - u16 header_width; - /* < the header width per-frame followed. - * 2 bytes for MOST/TDM case - * @values, in byte - * supported value is 2 - */ - - u16 header_type; - /* < Indicate what kind of custom TDM header it is. - * @values #AFE_CUSTOM_TDM_HEADER_TYPE_INVALID = 0 - * #AFE_CUSTOM_TDM_HEADER_TYPE_DEFAULT = 1 (for AAN channel per MOST) - * #AFE_CUSTOM_TDM_HEADER_TYPE_ENTERTAINMENT_MOST = 2 - * (for entertainment channel, which will overwrite - * AFE_API_VERSION_TDM_SAD_HEADER_TYPE_DEFAULT per MOST) - */ - - u16 num_frame_repeat; - /* < num of header followed. - * @values, supported value is 8 - */ - u16 header[AFE_CUSTOM_TDM_HEADER_MAX_CNT]; - /* < SAD header for MOST/TDM case is followed as payload as below. - * The size of followed SAD header in bytes is num_of_frame_repeat * - * header_width_per_frame, which is 2 * 8 = 16 bytes here. - * the supported payload format is in uint16_t as below - * uint16_t header0; SyncHi 0x3C Info[4] - CodecType -> 0x3C00 - * uint16_t header1; SyncLo 0xB2 Info[5] - SampleWidth -> 0xB218 - * uint16_t header2; DTCP Info Info[6] - unused -> 0x0 - * uint16_t header3; Extension Info[7] - ASAD-Value -> 0xC0 - * uint16_t header4; Reserved Info[0] - Num of bytes following -> 0x7 - * uint16_t header5; Reserved Info[1] - Media Type -> 0x0 - * uint16_t header6; Reserved Info[2] - Bitrate[kbps] - High Byte -> 0x0 - * uint16_t header7; Reserved Info[3] - Bitrate[kbps] - Low Byte -> 0x0 - */ -} __packed; - -struct afe_tdm_port_config { - struct afe_param_id_tdm_cfg tdm; - struct afe_param_id_slot_mapping_cfg slot_mapping; - struct afe_param_id_slot_mapping_cfg_v2 slot_mapping_v2; - struct afe_param_id_custom_tdm_header_cfg custom_tdm_header; -} __packed; - -#define AFE_PARAM_ID_DEVICE_HW_DELAY 0x00010243 -#define AFE_API_VERSION_DEVICE_HW_DELAY 0x1 - -struct afe_param_id_device_hw_delay_cfg { - uint32_t device_hw_delay_minor_version; - uint32_t delay_in_us; -} __packed; - -#define AFE_PARAM_ID_SET_TOPOLOGY 0x0001025A -#define AFE_API_VERSION_TOPOLOGY_V1 0x1 - -struct afe_param_id_set_topology_cfg { - /* - * Minor version used for tracking afe topology id configuration. - * @values #AFE_API_VERSION_TOPOLOGY_V1 - */ - u32 minor_version; - /* - * Id of the topology for the afe session. - * @values Any valid AFE topology ID - */ - u32 topology_id; -} __packed; - -#define MAX_ABR_LEVELS 5 - -struct afe_bit_rate_level_map_t { - /* - * Key value pair for link quality level to bitrate - * mapping in AFE - */ - uint32_t link_quality_level; - uint32_t bitrate; -} __packed; - -struct afe_quality_level_to_bitrate_info { - /* - * Number of quality levels being mapped. - * This will be equal to the size of mapping table. - */ - uint32_t num_levels; - /* - * Quality level to bitrate mapping table - */ - struct afe_bit_rate_level_map_t bit_rate_level_map[MAX_ABR_LEVELS]; -} __packed; - -struct afe_imc_dec_enc_info { - /* - * Decoder to encoder communication direction. - * Transmit = 0 / Receive = 1 - */ - uint32_t direction; - /* - * Enable / disable IMC between decoder and encoder - */ - uint32_t enable; - /* - * Purpose of IMC being set up between decoder and encoder. - * Param ID defined for link quality feedback in LPASS will - * be the default value sent as purpose. - * Supported values: - * AFE_ENCDEC_PURPOSE_ID_BT_INFO - */ - uint32_t purpose; - /* - * Unique communication instance ID. - * Data type a2dp_abr_instance used to set instance ID. - * purpose and comm_instance together form the actual key - * used in IMC registration, which must be the same for - * encoder and decoder for which IMC is being set up. - */ - uint32_t comm_instance; -} __packed; - -struct afe_abr_dec_cfg_t { - struct afe_imc_dec_enc_info imc_info; - bool is_abr_enabled; -} __packed; - -struct afe_abr_enc_cfg_t { - /* - * Link quality level to bitrate mapping info sent to DSP. - */ - struct afe_quality_level_to_bitrate_info mapping_info; - /* - * Information to set up IMC between decoder and encoder. - */ - struct afe_imc_dec_enc_info imc_info; - /* - * Flag to indicate whether ABR is enabled. - */ - bool is_abr_enabled; -} __packed; - -#define AFE_PARAM_ID_APTX_SYNC_MODE 0x00013205 - -struct afe_param_id_aptx_sync_mode { - /* - * sync mode: 0x0 = stereo sync mode (default) - * 0x01 = dual mono sync mode - * 0x02 = dual mono with no sync on either L or R - */ - uint32_t sync_mode; -} __packed; - -#define AFE_ID_APTX_ADAPTIVE_ENC_INIT 0x00013324 - -struct afe_id_aptx_adaptive_enc_init -{ - uint32_t sampling_freq; - uint32_t mtu; - uint32_t channel_mode; - uint32_t min_sink_modeA; - uint32_t max_sink_modeA; - uint32_t min_sink_modeB; - uint32_t max_sink_modeB; - uint32_t min_sink_modeC; - uint32_t max_sink_modeC; - uint32_t mode; - uint32_t input_mode; - uint32_t fade_duration; - uint8_t sink_cap[11]; -} __attribute__ ((packed)); - -/* - * Generic encoder module ID. - * This module supports the following parameter IDs: - * #AVS_ENCODER_PARAM_ID_ENC_FMT_ID (cannot be set run time) - * #AVS_ENCODER_PARAM_ID_ENC_CFG_BLK (may be set run time) - * #AVS_ENCODER_PARAM_ID_ENC_BITRATE (may be set run time) - * #AVS_ENCODER_PARAM_ID_PACKETIZER_ID (cannot be set run time) - * Opcode - AVS_MODULE_ID_ENCODER - * AFE Command AFE_PORT_CMD_SET_PARAM_V2 supports this module ID. - */ -#define AFE_MODULE_ID_ENCODER 0x00013229 - -/* Macro for defining the packetizer ID: COP. */ -#define AFE_MODULE_ID_PACKETIZER_COP 0x0001322A - -/* - * Packetizer type parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter cannot be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_PACKETIZER_ID 0x0001322E - -/* - * Encoder config block parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter may be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_ENC_CFG_BLK 0x0001322C - -/* - * Encoder format ID parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter cannot be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_ENC_FMT_ID 0x0001322B - -/* - * Decoder format ID parameter for the #AVS_MODULE_ID_DECODER module. - * This parameter cannot be set runtime. - */ -#define AFE_DECODER_PARAM_ID_DEC_FMT_ID 0x00013234 - -/* - * Encoder scrambler parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter cannot be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING 0x0001323C - -/* - * Link quality level to bitrate mapping info sent to AFE Encoder. - * This parameter may be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP 0x000132E1 - -/* - * Parameter to set up Inter Module Communication (IMC) between - * AFE Decoder and Encoder. - * This parameter may be set runtime. - */ -#define AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION 0x0001323D - -/* - * This is needed to be used only for SWB voice call use case. - * This is needed to be issued for each direction (RX AFE and TX AFE) - * along with AFE_PARAM_ID_PORT_MEDIA_TYPE - * (Issuing AF_PARAM_ID_RATE_MATCHED_PORT param alone is not useful). - */ -#define AFE_PARAM_ID_RATE_MATCHED_PORT 0x000102BE - -/* - * Purpose of IMC set up between encoder and decoder. - * Communication instance and purpose together form the - * actual key used for IMC registration. - */ -#define AFE_ENCDEC_PURPOSE_ID_BT_INFO 0x000132E2 - -#define AFE_MODULE_ID_DECODER 0x00013231 - -/* - * Macro for defining the depacketizer ID: COP. - */ -#define AFE_MODULE_ID_DEPACKETIZER_COP 0x00013233 -#define AFE_MODULE_ID_DEPACKETIZER_COP_V1 0x000132E9 - -/* - * Depacketizer type parameter for the #AVS_MODULE_ID_DECODER module. - * This parameter cannot be set runtime. - */ -#define AFE_DECODER_PARAM_ID_DEPACKETIZER_ID 0x00013235 - -#define CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO 0x0001332A - -#define CAPI_V2_PARAM_ID_APTX_AD_ENC_SWITCH_TO_MONO 0x00013354 - -struct aptx_channel_mode_param_t { - u32 channel_mode; -} __packed; -/* - * Decoder buffer ID parameter for the #AVS_MODULE_ID_DECODER module. - * This parameter cannot be set runtime. - */ -#define AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE 0x000132ec - -/* - * Data format to send compressed data - * is transmitted/received over Slimbus lines. - */ -#define AFE_SB_DATA_FORMAT_GENERIC_COMPRESSED 0x3 - -/* - * Parameter to send frame control size - * to DSP for AAC encoder in AFE. - */ -#define AFE_PARAM_ID_AAC_FRM_SIZE_CONTROL 0x000132EA - -/* - * ID for AFE port module. This will be used to define port properties. - * This module supports following parameter IDs: - * #AFE_PARAM_ID_PORT_MEDIA_TYPE - * To configure the port property, the client must use the - * #AFE_PORT_CMD_SET_PARAM_V2 command, - * and fill the module ID with the respective parameter IDs as listed above. - * @apr_hdr_fields - * Opcode -- AFE_MODULE_PORT - */ -#define AFE_MODULE_PORT 0x000102a6 - -/* - * ID of the parameter used by #AFE_MODULE_PORT to set the port media type. - * parameter ID is currently supported using#AFE_PORT_CMD_SET_PARAM_V2 command. - */ -#define AFE_PARAM_ID_PORT_MEDIA_TYPE 0x000102a7 - -/* - * Macros for defining the "data_format" field in the - * #AFE_PARAM_ID_PORT_MEDIA_TYPE - */ -#define AFE_PORT_DATA_FORMAT_PCM 0x0 -#define AFE_PORT_DATA_FORMAT_GENERIC_COMPRESSED 0x1 - -/* - * Macro for defining the "minor_version" field in the - * #AFE_PARAM_ID_PORT_MEDIA_TYPE - */ -#define AFE_API_VERSION_PORT_MEDIA_TYPE 0x1 - -#define ASM_MEDIA_FMT_NONE 0x0 - -/* - * Media format ID for SBC encode configuration. - * @par SBC encode configuration (asm_sbc_enc_cfg_t) - * @table{weak__asm__sbc__enc__cfg__t} - */ -#define ASM_MEDIA_FMT_SBC 0x00010BF2 - -/* SBC channel Mono mode.*/ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_MONO 1 - -/* SBC channel Stereo mode. */ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_STEREO 2 - -/* SBC channel Dual Mono mode. */ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_DUAL_MONO 8 - -/* SBC channel Joint Stereo mode. */ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_JOINT_STEREO 9 - -/* SBC bit allocation method = loudness. */ -#define ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS 0 - -/* SBC bit allocation method = SNR. */ -#define ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR 1 - - -/* - * Payload of the SBC encoder configuration parameters in the - * #ASM_MEDIA_FMT_SBC media format. - */ -struct asm_sbc_enc_cfg_t { - /* - * Number of subbands. - * @values 4, 8 - */ - uint32_t num_subbands; - - /* - * Size of the encoded block in samples. - * @values 4, 8, 12, 16 - */ - uint32_t blk_len; - - /* - * Mode used to allocate bits between channels. - * @values - * 0 (Native mode) - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_MONO - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_STEREO - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_DUAL_MONO - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_JOINT_STEREO - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - * If postprocessing outputs one-channel data, Mono mode is used. If - * postprocessing outputs two-channel data, Stereo mode is used. - * The number of channels must not change during encoding. - */ - uint32_t channel_mode; - - /* - * Encoder bit allocation method. - * @values - * #ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS - * #ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR @tablebulletend - */ - uint32_t alloc_method; - - /* - * Number of encoded bits per second. - * @values - * Mono channel -- Maximum of 320 kbps - * Stereo channel -- Maximum of 512 kbps @tablebulletend - */ - uint32_t bit_rate; - - /* - * Number of samples per second. - * @values 0 (Native mode), 16000, 32000, 44100, 48000 Hz - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - uint32_t sample_rate; -}; - -#define ASM_MEDIA_FMT_AAC_AOT_LC 2 -#define ASM_MEDIA_FMT_AAC_AOT_SBR 5 -#define ASM_MEDIA_FMT_AAC_AOT_PS 29 -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS 0 -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW 3 - -struct asm_aac_enc_cfg_v2_t { - - /* Encoding rate in bits per second.*/ - uint32_t bit_rate; - - /* - * Encoding mode. - * Supported values: - * #ASM_MEDIA_FMT_AAC_AOT_LC - * #ASM_MEDIA_FMT_AAC_AOT_SBR - * #ASM_MEDIA_FMT_AAC_AOT_PS - */ - uint32_t enc_mode; - - /* - * AAC format flag. - * Supported values: - * #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - */ - uint16_t aac_fmt_flag; - - /* - * Number of channels to encode. - * Supported values: - * 0 - Native mode - * 1 - Mono - * 2 - Stereo - * Other values are not supported. - * @note1hang The eAAC+ encoder mode supports only stereo. - * Native mode indicates that encoding must be performed with the - * number of channels at the input. - * The number of channels must not change during encoding. - */ - uint16_t channel_cfg; - - /* - * Number of samples per second. - * Supported values: - 0 -- Native mode - For other values, - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - uint32_t sample_rate; -} __packed; - -/* Structure to control frame size of AAC encoded frames. */ -struct asm_aac_frame_size_control_t { - /* Type of frame size control: MTU_SIZE / PEAK_BIT_RATE*/ - uint32_t ctl_type; - /* - * Control value - * MTU_SIZE: MTU size in bytes - * PEAK_BIT_RATE: Peak bitrate in bits per second. - */ - uint32_t ctl_value; -} __packed; - -struct asm_aac_enc_cfg_t { - struct asm_aac_enc_cfg_v2_t aac_cfg; - struct asm_aac_frame_size_control_t frame_ctl; -} __packed; - -/* FMT ID for apt-X Classic */ -#define ASM_MEDIA_FMT_APTX 0x000131ff - -/* FMT ID for apt-X HD */ -#define ASM_MEDIA_FMT_APTX_HD 0x00013200 - -/* FMT ID for apt-X Adaptive */ -#define ASM_MEDIA_FMT_APTX_ADAPTIVE 0x00013204 - -/* FMT ID for apt-X Adaptive speech */ -#define ASM_MEDIA_FMT_APTX_AD_SPEECH 0x00013208 - -#define PCM_CHANNEL_L 1 -#define PCM_CHANNEL_R 2 -#define PCM_CHANNEL_C 3 - -struct asm_custom_enc_cfg_t { - uint32_t sample_rate; - /* Mono or stereo */ - uint16_t num_channels; - uint16_t reserved; - /* num_ch == 1, then PCM_CHANNEL_C, - * num_ch == 2, then {PCM_CHANNEL_L, PCM_CHANNEL_R} - */ - uint8_t channel_mapping[8]; - uint32_t custom_size; -} __packed; - -struct asm_aptx_ad_speech_mode_cfg_t -{ - uint32_t speech_mode; - /* - * speech mode of codec. - * - * @values 0x0(swb), 0x4(sswb) - */ - uint32_t swapping; - /* - * byte swapping of codec. - * - * @values 0x1, enable swapping - */ -} __packed; - -struct asm_aptx_v2_enc_cfg_ext_t { - /* - * sync mode: 0x0 = stereo sync mode (default) - * 0x01 = dual mono sync mode - * 0x02 = dual mono with no sync on either L or R - */ - uint32_t sync_mode; -} __packed; - -struct asm_aptx_enc_cfg_t { - struct asm_custom_enc_cfg_t custom_cfg; - struct asm_aptx_v2_enc_cfg_ext_t aptx_v2_cfg; -} __packed; - -struct asm_aptx_ad_enc_cfg_t -{ - struct asm_custom_enc_cfg_t custom_cfg; - struct afe_id_aptx_adaptive_enc_init aptx_ad_cfg; - struct afe_abr_enc_cfg_t abr_cfg; -} __attribute__ ((packed)); - -struct asm_aptx_ad_speech_enc_cfg_t -{ - struct asm_custom_enc_cfg_t custom_cfg; - struct afe_imc_dec_enc_info imc_info; - struct asm_aptx_ad_speech_mode_cfg_t speech_mode; -} __attribute__ ((packed)); - -struct afe_matched_port_t -{ - uint32_t minor_version; - uint32_t enable; -} __attribute__ ((packed)); - -#define ASM_MEDIA_FMT_CELT 0x00013221 -struct asm_celt_specific_enc_cfg_t { - /* - * Bit rate used for encoding. - * This is used to calculate the upper threshold - * for bytes per frame if vbr_flag is 1. - * Or else, this will be used as a regular constant - * bit rate for encoder output. - * @Range : 32000 to 1536000 - * @Default: 128 - */ - uint32_t bit_rate; - /* - * Frame size used for encoding. - * @Range : 64, 128, 256, 512 - * @Default: 256 - */ - uint16_t frame_size; - /* - * complexity of algorithm. - * @Range : 0-10 - * @Default: 3 - */ - uint16_t complexity; - /* - * Switch variable for prediction feature. - * Used to choose between the level of interframe - * predictions allowed while encoding. - * @Range: - * 0: Independent Frames. - * 1: Short Term interframe prediction allowed. - * 2: Long term prediction allowed. - * @Default: 2 - */ - uint16_t prediction_mode; - /* - * Variable Bit Rate flag. - * @Default: 0 - */ - uint16_t vbr_flag; -} __packed; - -struct asm_celt_enc_cfg_t { - struct asm_custom_enc_cfg_t custom_config; - struct asm_celt_specific_enc_cfg_t celt_specific_config; -} __packed; - -#define ASM_MEDIA_FMT_LDAC 0x00013224 -#define ENC_CODEC_TYPE_LDAC 0x23000000 -struct asm_ldac_specific_enc_cfg_t { - /* - * This is used to calculate the encoder output - * bytes per frame (i.e. bytes per packet). - * Bit rate also configures the EQMID. - * The min bit rate 303000 bps is calculated for - * 44.1 kHz and 88.2 KHz sampling frequencies with - * Mobile use Quality. - * The max bit rate of 990000 bps is calculated for - * 96kHz and 48 KHz with High Quality - * @Range(in bits per second) - * 303000 for Mobile use Quality - * 606000 for standard Quality - * 909000 for High Quality - */ - uint32_t bit_rate; - /* - * The channel setting information for LDAC specification - * of Bluetooth A2DP which is determined by SRC and SNK - * devices in Bluetooth transmission. - * @Range: - * 0 for native mode - * 4 for mono - * 2 for dual channel - * 1 for stereo - */ - uint16_t channel_mode; - /* - * Maximum Transmission Unit (MTU). - * The minimum MTU that a L2CAP implementation for LDAC shall - * support is 679 bytes, because LDAC is optimized with 2-DH5 - * packet as its target. - * @Range : 679 - * @Default: 679 for LDACBT_MTU_2DH5 - */ - uint16_t mtu; -} __packed; - -struct asm_ldac_enc_cfg_t { - struct asm_custom_enc_cfg_t custom_config; - struct asm_ldac_specific_enc_cfg_t ldac_specific_config; - struct afe_abr_enc_cfg_t abr_config; -} __packed; - -struct afe_enc_fmt_id_param_t { - /* - * Supported values: - * #ASM_MEDIA_FMT_SBC - * #ASM_MEDIA_FMT_AAC_V2 - * Any OpenDSP supported values - */ - uint32_t fmt_id; -} __packed; - -struct afe_port_media_type_t { - /* - * Minor version - * @values #AFE_API_VERSION_PORT_MEDIA_TYPE. - */ - uint32_t minor_version; - - /* - * Sampling rate of the port. - * @values - * #AFE_PORT_SAMPLE_RATE_8K - * #AFE_PORT_SAMPLE_RATE_11_025K - * #AFE_PORT_SAMPLE_RATE_12K - * #AFE_PORT_SAMPLE_RATE_16K - * #AFE_PORT_SAMPLE_RATE_22_05K - * #AFE_PORT_SAMPLE_RATE_24K - * #AFE_PORT_SAMPLE_RATE_32K - * #AFE_PORT_SAMPLE_RATE_44_1K - * #AFE_PORT_SAMPLE_RATE_48K - * #AFE_PORT_SAMPLE_RATE_88_2K - * #AFE_PORT_SAMPLE_RATE_96K - * #AFE_PORT_SAMPLE_RATE_176_4K - * #AFE_PORT_SAMPLE_RATE_192K - * #AFE_PORT_SAMPLE_RATE_352_8K - * #AFE_PORT_SAMPLE_RATE_384K - */ - uint32_t sample_rate; - - /* - * Bit width of the sample. - * @values 16, 24 - */ - uint16_t bit_width; - - /* - * Number of channels. - * @values 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT - */ - uint16_t num_channels; - - /* - * Data format supported by this port. - * If the port media type and device media type are different, - * it signifies a encoding/decoding use case - * @values - * #AFE_PORT_DATA_FORMAT_PCM - * #AFE_PORT_DATA_FORMAT_GENERIC_COMPRESSED - */ - uint16_t data_format; - - /*This field must be set to zero.*/ - uint16_t reserved; -} __packed; - -/* - * Payload of the SBC decoder configuration parameters in the - * #ASM_MEDIA_FMT_SBC media format. - */ -struct asm_sbc_dec_cfg_t { - uint16_t channels; - /* - * Number of channels present in the SBC stream. - * - * @values - * - 1 -- Mono - * - 2 -- Stereo - */ - - uint32_t sample_rate; - /* - * Number of samples per second. - * - * @values 8000, 11025, 12000, 16000, 22050, 24000, 32000, - * 44100, 48000, 64000, 88200, 96000 Hz - */ -} __packed; -/* - * Payload of the MP3 decoder configuration parameters in the - * #ASM_MEDIA_FMT_MP3 media format. - */ -struct asm_mp3_dec_cfg_t { - /* All configuration is extracted from the stream */ -} __packed; - -struct asm_aac_dec_cfg_v2_t { - uint16_t aac_fmt_flag; - /* - * Bit stream format option. - * - * @values - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LOAS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADIF - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LATM - */ - - uint16_t audio_obj_type; - /* - * Audio Object Type (AOT) present in the AAC stream. - * - * @values - * - #ASM_MEDIA_FMT_AAC_AOT_LC - * - #ASM_MEDIA_FMT_AAC_AOT_SBR - * - #ASM_MEDIA_FMT_AAC_AOT_BSAC - * - #ASM_MEDIA_FMT_AAC_AOT_PS - * - * Other values are not supported. - */ - - uint16_t channel_config; - /* - * Number of channels present in the AAC stream. - * - * @values - * - 0 -- PCE - * - 1 -- Mono - * - 2 -- Stereo - * - 6 -- 5.1 content - */ - - uint16_t total_size_of_PCE_bits; - /* - * For RAW formats and if channel_config=0 (PCE), - * the client can send the bit stream containing PCE - * immediately following this structure (in band). - * - * @values @ge 0 (does not include the bits required - * for 32-bit alignment) - * - * If this field is set to 0, the PCE information is - * assumed to be available in the audio bit stream - * and not in band. - * - * If this field is greater than 0, the PCE information - * follows this structure. Additional bits might - * be required for 32-bit alignment. - */ - - uint32_t sample_rate; - /* - * Number of samples per second. - * - * @values 8000, 11025, 12000, 16000, 22050, 24000, 32000, - * 44100, 48000, 64000, 88200, 96000 Hz - * - * This field must be equal to the sample rate of the - * AAC-LC decoder output. - * - For MP4 or 3GP containers, this sample rate - * is indicated by the - * samplingFrequencyIndex field in the - * AudioSpecificConfig element. - * - For ADTS format, this sample rate is indicated by the - * samplingFrequencyIndex in the ADTS fixed header. - * - For ADIF format, this sample rate is indicated by the - * samplingFrequencyIndex in the program_config_element - * present in the ADIF header. - */ -} __packed; - -/* - * Payload of the APTX AD decoder configuration parameters in the - * #ASM_MEDIA_FMT_APTX_ADAPTIVE media format. - */ -struct asm_aptx_ad_dec_cfg_t { - uint32_t sample_rate; - /* - * Number of samples per second. - * - * @values 0x0(48000Hz), 0x1(44100Hz) - */ -} __packed; - -struct asm_aptx_ad_speech_dec_cfg_t { - struct asm_aptx_ad_speech_mode_cfg_t speech_mode; -}; - -union afe_enc_config_data { - struct asm_sbc_enc_cfg_t sbc_config; - struct asm_aac_enc_cfg_t aac_config; - struct asm_custom_enc_cfg_t custom_config; - struct asm_celt_enc_cfg_t celt_config; - struct asm_aptx_enc_cfg_t aptx_config; - struct asm_ldac_enc_cfg_t ldac_config; - struct asm_aptx_ad_enc_cfg_t aptx_ad_config; - struct asm_aptx_ad_speech_enc_cfg_t aptx_ad_speech_config; -}; - -struct afe_enc_config { - u32 format; - u32 scrambler_mode; - u32 mono_mode; - union afe_enc_config_data data; -}; - -union afe_dec_config_data { - struct asm_sbc_dec_cfg_t sbc_config; - struct asm_aac_dec_cfg_v2_t aac_config; - struct asm_mp3_dec_cfg_t mp3_config; - struct asm_aptx_ad_dec_cfg_t aptx_ad_config; - struct asm_aptx_ad_speech_dec_cfg_t aptx_ad_speech_config; -}; - -struct afe_dec_config { - u32 format; - struct afe_abr_dec_cfg_t abr_dec_cfg; - union afe_dec_config_data data; -}; - -struct afe_enc_cfg_blk_param_t { - uint32_t enc_cfg_blk_size; - /* - *Size of the encoder configuration block that follows this member - */ - union afe_enc_config_data enc_blk_config; -}; - -struct afe_enc_aptx_ad_speech_cfg_blk_param_t { - uint32_t enc_cfg_blk_size; - /* - * Size of the encoder configuration block that follows this member - */ - struct asm_custom_enc_cfg_t custom_cfg; -}; - -/* - * Payload of the AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT parameter used by - * AVS_MODULE_ID_DECODER. - */ -struct afe_dec_media_fmt_t { - union afe_dec_config_data dec_media_config; -} __packed; - -/* - * Payload of the AVS_ENCODER_PARAM_ID_PACKETIZER_ID parameter. - */ -struct avs_enc_packetizer_id_param_t { - /* - * Supported values: - * #AVS_MODULE_ID_PACKETIZER_COP - * Any OpenDSP supported values - */ - uint32_t enc_packetizer_id; -}; - -/* - * Payload of the AVS_ENCODER_PARAM_ID_ENABLE_SCRAMBLING parameter. - */ -struct avs_enc_set_scrambler_param_t { - /* - * Supported values: - * 1 : enable scrambler - * 0 : disable scrambler - */ - uint32_t enable_scrambler; -}; - -/* - * Payload of the AVS_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP parameter. - */ -struct afe_enc_level_to_bitrate_map_param_t { - /* - * Parameter for mapping link quality level to bitrate. - */ - struct afe_quality_level_to_bitrate_info mapping_table; -}; - -/* - * Payload of the AVS_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION parameter. - */ -struct afe_enc_dec_imc_info_param_t { - /* - * Parameter to set up Inter Module Communication (IMC) between - * AFE Decoder and Encoder. - */ - struct afe_imc_dec_enc_info imc_info; -}; - -/* - * Payload of the AVS_DECODER_PARAM_ID_DEPACKETIZER_ID parameter. - */ -struct avs_dec_depacketizer_id_param_t { - /* - * Supported values: - * #AFE_MODULE_ID_DEPACKETIZER_COP - * #AFE_MODULE_ID_DEPACKETIZER_COP_V1 - * Any OpenDSP supported values - */ - uint32_t dec_depacketizer_id; -}; - -struct avs_dec_congestion_buffer_param_t { - uint32_t version; - uint16_t max_nr_buffers; - /* - * Maximum number of 1ms buffers: - * 0 - 256 - */ - uint16_t pre_buffer_size; - /* - * Pre-buffering size in 1ms: - * 1 - 128 - */ -}; - -/* - * ID of the parameter used by #AVS_MODULE_ID_DECODER to configure - * the decoder mode for the AFE module. - * This parameter cannot be set at runtime. - */ -#define AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT 0x00013232 - -/* - * ID of the parameter used by #AVS_MODULE_ID_DECODER to configure - * the decoder mode of adaptive speech and byte swap mode - */ -#define AVS_DECODER_PARAM_ID_APTX_AD_SPEECH_DEC_INIT 0x0001334D - -/* - * ID of the parameter used by #AVS_MODULE_ID_ENCODER to configure - * the encoder mode of adaptive speech and byte swap mode - */ -#define AVS_DECODER_PARAM_ID_APTX_AD_SPEECH_ENC_INIT 0x0001332B - -/* ID of the parameter used by #AFE_MODULE_AUDIO_DEV_INTERFACE to configure - * the island mode for a given AFE port. - */ -#define AFE_PARAM_ID_ISLAND_CONFIG 0x000102B4 - -/* Version information used to handle future additions to codec DMA - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_ISLAND_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_ISLAND_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_island_cfg_t { - uint32_t island_cfg_minor_version; - /* Tracks the configuration of this parameter. - * Supported values: #AFE_API_VERSION_ISLAND_CONFIG - */ - - uint32_t island_enable; - /* Specifies whether island mode should be enabled or disabled for the - * use-case being setup. - * Supported values: 0 - Disable, 1 - Enable - */ -} __packed; - -/* ID of the parameter used by #AFE_MODULE_AUDIO_DEV_INTERFACE to configure - * the Codec DMA interface. - */ - -#define AFE_PARAM_ID_CODEC_DMA_CONFIG 0x000102B8 - -/* Version information used to handle future additions to codec DMA - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_CODEC_DMA_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_CODEC_DMA_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_cdc_dma_cfg_t { - uint32_t cdc_dma_cfg_minor_version; - /* Tracks the configuration of this parameter. - * Supported values: #AFE_API_VERSION_CODEC_DMA_CONFIG - */ - - uint32_t sample_rate; - /* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_11_025K - * - #AFE_PORT_SAMPLE_RATE_12K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_22_05K - * - #AFE_PORT_SAMPLE_RATE_24K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_44_1K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_88_2K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_176_4K - * - #AFE_PORT_SAMPLE_RATE_192K - * - #AFE_PORT_SAMPLE_RATE_352_8K - * - #AFE_PORT_SAMPLE_RATE_384K - */ - - uint16_t bit_width; - /* Bit width of the sample. - * Supported values: 16, 24, 32 - */ - - uint16_t data_format; - /* Data format supported by the codec DMA interface. - * Supported values: - * - #AFE_LINEAR_PCM_DATA - * - #AFE_LINEAR_PCM_DATA_PACKED_16BIT - */ - - uint16_t num_channels; - /* Number of channels. - * Supported values: 1 to Maximum number of channels supported - * for each interface - */ - - uint16_t active_channels_mask; - /* Active channels mask to denote the bit mask for active channels. - * Bits 0 to 7 denote channels 0 to 7. A 1 denotes the channel is active - * while a 0 denotes a channel is inactive. - * Supported values: - * Any mask with number of active bits equal to num_channels - */ -} __packed; - -union afe_port_config { - struct afe_param_id_pcm_cfg pcm; - struct afe_param_id_i2s_cfg i2s; - struct afe_param_id_meta_i2s_cfg meta_i2s; - struct afe_param_id_hdmi_multi_chan_audio_cfg hdmi_multi_ch; - struct afe_param_id_slimbus_cfg slim_sch; - struct afe_param_id_rt_proxy_port_cfg rtproxy; - struct afe_param_id_internal_bt_fm_cfg int_bt_fm; - struct afe_param_id_pseudo_port_cfg pseudo_port; - struct afe_param_id_device_hw_delay_cfg hw_delay; - struct afe_param_id_spdif_cfg_v2 spdif; - struct afe_param_id_set_topology_cfg topology; - struct afe_param_id_tdm_cfg tdm; - struct afe_param_id_usb_audio_cfg usb_audio; - struct afe_param_id_aptx_sync_mode sync_mode_param; - struct asm_aac_frame_size_control_t frame_ctl_param; - struct afe_enc_fmt_id_param_t enc_fmt; - struct afe_port_media_type_t media_type; - struct afe_enc_cfg_blk_param_t enc_blk_param; - struct avs_enc_packetizer_id_param_t enc_pkt_id_param; - struct avs_enc_set_scrambler_param_t enc_set_scrambler_param; - struct avs_dec_depacketizer_id_param_t dec_depkt_id_param; - struct afe_dec_media_fmt_t dec_media_fmt; - struct afe_enc_level_to_bitrate_map_param_t map_param; - struct afe_enc_dec_imc_info_param_t imc_info_param; - struct afe_param_id_cdc_dma_cfg_t cdc_dma; -} __packed; - - -/* - * AFE event registration related APIs and corresponding payloads - */ -#define AFE_SVC_CMD_EVENT_CFG 0x000100FE - -#define AFE_CMD_APPS_WAKEUP_IRQ_REGISTER_MINOR_VERSION 0x1 - -/* Flag to indicate AFE to register APPS wakeup Interrupt */ -#define AFE_APPS_WAKEUP_IRQ_REGISTER_FLAG 1 - -/* Flag to indicate AFE to de-register APPS wakeup Interrupt */ -#define AFE_APPS_WAKEUP_IRQ_DEREGISTER_FLAG 0 - -/* Default interrupt trigger value. */ -#define DEFAULT_SETTINGS 0x00000001 - -/* Interrupt is triggered only if the input signal at the source is high. */ -#define LEVEL_HIGH_TRIGGER 0x00000002 - -/* Interrupt is triggered only if the input signal at the source is low. */ -#define LEVEL_LOW_TRIGGER 0x00000003 - -/* Interrupt is triggered only if the input signal at the source transitions - *from low to high. - */ -#define RISING_EDGE_TRIGGER 0x00000004 - -/* Interrupt is triggered only if the input signal at the source transitions - *from high to low. - */ -#define FALLING_EDGE_TRIGGER 0x00000005 - -/* Macro for invalid trigger type. This should not be used. */ -#define INVALID_TRIGGER 0x00000006 - -#define AFE_EVENT_ID_MBHC_DETECTION_SW_WA 0x1 - -/* @weakgroup weak_afe_svc_cmd_evt_cfg_payload - * - * This is payload of each event that is to be - * registered with AFE service. - */ -struct afe_svc_cmd_evt_cfg_payload { - struct apr_hdr hdr; - - uint32_t event_id; -/* Unique ID of the event. - * - * @values - * -# AFE_EVENT_ID_MBHC_DETECTION_SW_WA - */ - - uint32_t reg_flag; -/* Flag for registering or de-registering an event. - * @values - * - #AFE_SVC_REGISTER_EVENT_FLAG - * - #AFE_SVC_DEREGISTER_EVENT_FLAG - */ -} __packed; - -#define AFE_EVENT_MBHC_DETECTION_SW_WA 0x0001010F - -#define AFE_PORT_CMD_DEVICE_START 0x000100E5 - -/* Payload of the #AFE_PORT_CMD_DEVICE_START.*/ -struct afe_port_cmd_device_start { - struct apr_hdr hdr; - u16 port_id; -/* Port interface and direction (Rx or Tx) to start. An even - * number represents the Rx direction, and an odd number represents - * the Tx direction. - */ - - - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0.*/ - -} __packed; - -#define AFE_PORT_CMD_DEVICE_STOP 0x000100E6 - -/* Payload of the #AFE_PORT_CMD_DEVICE_STOP. */ -struct afe_port_cmd_device_stop { - struct apr_hdr hdr; - u16 port_id; -/* Port interface and direction (Rx or Tx) to start. An even - * number represents the Rx direction, and an odd number represents - * the Tx direction. - */ - - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0.*/ -} __packed; - -#define AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS 0x000100EA - -/* Memory map regions command payload used by the - * #AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS . - * This structure allows clients to map multiple shared memory - * regions in a single command. Following this structure are - * num_regions of afe_service_shared_map_region_payload. - */ -struct afe_service_cmd_shared_mem_map_regions { - struct apr_hdr hdr; -u16 mem_pool_id; -/* Type of memory on which this memory region is mapped. - * Supported values: - * - #ADSP_MEMORY_MAP_EBI_POOL - * - #ADSP_MEMORY_MAP_SMI_POOL - * - #ADSP_MEMORY_MAP_SHMEM8_4K_POOL - * - Other values are reserved - * - * The memory pool ID implicitly defines the characteristics of the - * memory. Characteristics may include alignment type, permissions, - * etc. - * - * ADSP_MEMORY_MAP_EBI_POOL is External Buffer Interface type memory - * ADSP_MEMORY_MAP_SMI_POOL is Shared Memory Interface type memory - * ADSP_MEMORY_MAP_SHMEM8_4K_POOL is shared memory, byte - * addressable, and 4 KB aligned. - */ - - - u16 num_regions; -/* Number of regions to map. - * Supported values: - * - Any value greater than zero - */ - - u32 property_flag; -/* Configures one common property for all the regions in the - * payload. - * - * Supported values: - 0x00000000 to 0x00000001 - * - * b0 - bit 0 indicates physical or virtual mapping 0 Shared memory - * address provided in afe_service_shared_map_region_payloadis a - * physical address. The shared memory needs to be mapped( hardware - * TLB entry) and a software entry needs to be added for internal - * book keeping. - * - * 1 Shared memory address provided in - * afe_service_shared_map_region_payloadis a virtual address. The - * shared memory must not be mapped (since hardware TLB entry is - * already available) but a software entry needs to be added for - * internal book keeping. This can be useful if two services with in - * ADSP is communicating via APR. They can now directly communicate - * via the Virtual address instead of Physical address. The virtual - * regions must be contiguous. num_regions must be 1 in this case. - * - * b31-b1 - reserved bits. must be set to zero - */ - - -} __packed; -/* Map region payload used by the - * afe_service_shared_map_region_payloadstructure. - */ -struct afe_service_shared_map_region_payload { - u32 shm_addr_lsw; -/* least significant word of starting address in the memory - * region to map. It must be contiguous memory, and it must be 4 KB - * aligned. - * Supported values: - Any 32 bit value - */ - - - u32 shm_addr_msw; -/* most significant word of startng address in the memory region - * to map. For 32 bit shared memory address, this field must be set - * to zero. For 36 bit shared memory address, bit31 to bit 4 must be - * set to zero - * - * Supported values: - For 32 bit shared memory address, this field - * must be set to zero. - For 36 bit shared memory address, bit31 to - * bit 4 must be set to zero - For 64 bit shared memory address, any - * 32 bit value - */ - - - u32 mem_size_bytes; -/* Number of bytes in the region. The aDSP will always map the - * regions as virtual contiguous memory, but the memory size must be - * in multiples of 4 KB to avoid gaps in the virtually contiguous - * mapped memory. - * - * Supported values: - multiples of 4KB - */ - -} __packed; - -#define AFE_SERVICE_CMDRSP_SHARED_MEM_MAP_REGIONS 0x000100EB -struct afe_service_cmdrsp_shared_mem_map_regions { - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory attributes is - * returned iff AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS command is - * successful. In the case of failure , a generic APR error response - * is returned to the client. - * - * Supported Values: - Any 32 bit value - */ - -} __packed; -#define AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS 0x000100EC -/* Memory unmap regions command payload used by the - * #AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS - * - * This structure allows clients to unmap multiple shared memory - * regions in a single command. - */ - - -struct afe_service_cmd_shared_mem_unmap_regions { - struct apr_hdr hdr; -u32 mem_map_handle; -/* memory map handle returned by - * AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS commands - * - * Supported Values: - * - Any 32 bit value - */ -} __packed; - -/* Used by RTAC */ -struct afe_rtac_get_param_v2 { - u16 port_id; -/* Port interface and direction (Rx or Tx) to start. */ - - u16 payload_size; -/* Maximum data size of the parameter ID/module ID combination. - * This is a multiple of four bytes - * Supported values: > 0 - */ - - u32 payload_address_lsw; -/* LSW of 64 bit Payload address. Address should be 32-byte, - * 4kbyte aligned and must be contig memory. - */ - - - u32 payload_address_msw; -/* MSW of 64 bit Payload address. In case of 32-bit shared - * memory address, this field must be set to zero. In case of 36-bit - * shared memory address, bit-4 to bit-31 must be set to zero. - * Address should be 32-byte, 4kbyte aligned and must be contiguous - * memory. - */ - - u32 mem_map_handle; -/* Memory map handle returned by - * AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS commands. - * Supported Values: - NULL -- Message. The parameter data is - * in-band. - Non-NULL -- The parameter data is Out-band.Pointer to - * - the physical address in shared memory of the payload data. - * For detailed payload content, see the afe_port_param_data_v2 - * structure - */ - - - u32 module_id; -/* ID of the module to be queried. - * Supported values: Valid module ID - */ - - u32 param_id; -/* ID of the parameter to be queried. - * Supported values: Valid parameter ID - */ -} __packed; - -#define AFE_PORT_CMD_GET_PARAM_V2 0x000100F0 - -/* Payload of the #AFE_PORT_CMD_GET_PARAM_V2 command, - * which queries for one post/preprocessing parameter of a - * stream. - */ -struct afe_port_cmd_get_param_v2 { - struct apr_hdr apr_hdr; - - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* Maximum data size of the parameter ID/module ID combination. - * This is a multiple of four bytes - * Supported values: > 0 - */ - u16 payload_size; - - /* The memory mapping header to be used when requesting outband */ - struct mem_mapping_hdr mem_hdr; - - /* The module ID of the parameter data requested */ - u32 module_id; - - /* The parameter ID of the parameter data requested */ - u32 param_id; - - /* The header information for the parameter data */ - struct param_hdr_v1 param_hdr; -} __packed; - -#define AFE_PORT_CMDRSP_GET_PARAM_V2 0x00010106 - -/* Payload of the #AFE_PORT_CMDRSP_GET_PARAM_V2 message, which - * responds to an #AFE_PORT_CMD_GET_PARAM_V2 command. - * - * Immediately following this structure is the parameters structure - * (afe_port_param_data) containing the response(acknowledgment) - * parameter payload. This payload is included for an in-band - * scenario. For an address/shared memory-based set parameter, this - * payload is not needed. - */ - - -struct afe_port_cmdrsp_get_param_v2 { - u32 status; - struct param_hdr_v1 param_hdr; - u8 param_data[0]; -} __packed; - -#define AFE_PORT_CMD_GET_PARAM_V3 0x000100FB -struct afe_port_cmd_get_param_v3 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* Port ID of the AFE port to configure. Port interface and direction - * (Rx or Tx) to configure. An even number represents the Rx direction, - * and an odd number represents the Tx direction. - */ - u16 port_id; - - /* Reserved. This field must be set to zero. */ - u16 reserved; - - /* The memory mapping header to be used when requesting outband */ - struct mem_mapping_hdr mem_hdr; - - /* The header information for the parameter data */ - struct param_hdr_v3 param_hdr; -} __packed; - -#define AFE_PORT_CMDRSP_GET_PARAM_V3 0x00010108 -struct afe_port_cmdrsp_get_param_v3 { - /* The status of the command */ - uint32_t status; - - /* The header information for the parameter data */ - struct param_hdr_v3 param_hdr; - - /* The parameter data to be filled when sent inband */ - u8 param_data[0]; -} __packed; - -#define AFE_PARAM_ID_LPASS_CORE_SHARED_CLOCK_CONFIG 0x0001028C -#define AFE_API_VERSION_LPASS_CORE_SHARED_CLK_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_LPASS_CORE_SHARED_CLOCK_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_lpass_core_shared_clk_cfg { - u32 lpass_core_shared_clk_cfg_minor_version; -/* - * Minor version used for lpass core shared clock configuration - * Supported value: AFE_API_VERSION_LPASS_CORE_SHARED_CLK_CONFIG - */ - u32 enable; -/* - * Specifies whether the lpass core shared clock is - * enabled (1) or disabled (0). - */ -} __packed; - -/* adsp_afe_service_commands.h */ - -#define ADSP_MEMORY_MAP_EBI_POOL 0 - -#define ADSP_MEMORY_MAP_SMI_POOL 1 -#define ADSP_MEMORY_MAP_IMEM_POOL 2 -#define ADSP_MEMORY_MAP_SHMEM8_4K_POOL 3 -#define ADSP_MEMORY_MAP_MDF_SHMEM_4K_POOL 4 - -/* Definition of virtual memory flag */ -#define ADSP_MEMORY_MAP_VIRTUAL_MEMORY 1 - -/* Definition of physical memory flag */ -#define ADSP_MEMORY_MAP_PHYSICAL_MEMORY 0 - -#define NULL_POPP_TOPOLOGY 0x00010C68 -#define NULL_COPP_TOPOLOGY 0x00010312 -#define DEFAULT_COPP_TOPOLOGY 0x00010314 -#define DEFAULT_POPP_TOPOLOGY 0x00010BE4 -#define COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY 0x0001076B -#define COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY 0x00010774 -#define VPM_TX_SM_ECNS_V2_COPP_TOPOLOGY 0x00010F89 -#define VPM_TX_VOICE_SMECNS_V2_COPP_TOPOLOGY 0x10000003 -#define VPM_TX_DM_FLUENCE_COPP_TOPOLOGY 0x00010F72 -#define VPM_TX_QMIC_FLUENCE_COPP_TOPOLOGY 0x00010F75 -#define VPM_TX_DM_RFECNS_COPP_TOPOLOGY 0x00010F86 -#define ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX 0x10015002 -#define ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE 0x10028000 -#define VPM_TX_DM_FLUENCE_EF_COPP_TOPOLOGY 0x10000005 - -/* Memory map regions command payload used by the - * #ASM_CMD_SHARED_MEM_MAP_REGIONS ,#ADM_CMD_SHARED_MEM_MAP_REGIONS - * commands. - * - * This structure allows clients to map multiple shared memory - * regions in a single command. Following this structure are - * num_regions of avs_shared_map_region_payload. - */ - - -struct avs_cmd_shared_mem_map_regions { - struct apr_hdr hdr; - u16 mem_pool_id; -/* Type of memory on which this memory region is mapped. - * - * Supported values: - #ADSP_MEMORY_MAP_EBI_POOL - - * #ADSP_MEMORY_MAP_SMI_POOL - #ADSP_MEMORY_MAP_IMEM_POOL - * (unsupported) - #ADSP_MEMORY_MAP_SHMEM8_4K_POOL - Other values - * are reserved - * - * The memory ID implicitly defines the characteristics of the - * memory. Characteristics may include alignment type, permissions, - * etc. - * - * SHMEM8_4K is shared memory, byte addressable, and 4 KB aligned. - */ - - - u16 num_regions; - /* Number of regions to map.*/ - - u32 property_flag; -/* Configures one common property for all the regions in the - * payload. No two regions in the same memory map regions cmd can - * have differnt property. Supported values: - 0x00000000 to - * 0x00000001 - * - * b0 - bit 0 indicates physical or virtual mapping 0 shared memory - * address provided in avs_shared_map_regions_payload is physical - * address. The shared memory needs to be mapped( hardware TLB - * entry) - * - * and a software entry needs to be added for internal book keeping. - * - * 1 Shared memory address provided in MayPayload[usRegions] is - * virtual address. The shared memory must not be mapped (since - * hardware TLB entry is already available) but a software entry - * needs to be added for internal book keeping. This can be useful - * if two services with in ADSP is communicating via APR. They can - * now directly communicate via the Virtual address instead of - * Physical address. The virtual regions must be contiguous. - * - * b31-b1 - reserved bits. must be set to zero - */ - -} __packed; - -struct avs_shared_map_region_payload { - u32 shm_addr_lsw; -/* least significant word of shared memory address of the memory - * region to map. It must be contiguous memory, and it must be 4 KB - * aligned. - */ - - u32 shm_addr_msw; -/* most significant word of shared memory address of the memory - * region to map. For 32 bit shared memory address, this field must - * tbe set to zero. For 36 bit shared memory address, bit31 to bit 4 - * must be set to zero - */ - - u32 mem_size_bytes; -/* Number of bytes in the region. - * - * The aDSP will always map the regions as virtual contiguous - * memory, but the memory size must be in multiples of 4 KB to avoid - * gaps in the virtually contiguous mapped memory. - */ - -} __packed; - -struct avs_cmd_shared_mem_unmap_regions { - struct apr_hdr hdr; - u32 mem_map_handle; -/* memory map handle returned by ASM_CMD_SHARED_MEM_MAP_REGIONS - * , ADM_CMD_SHARED_MEM_MAP_REGIONS, commands - */ - -} __packed; - -/* Memory map command response payload used by the - * #ASM_CMDRSP_SHARED_MEM_MAP_REGIONS - * ,#ADM_CMDRSP_SHARED_MEM_MAP_REGIONS - */ - - -struct avs_cmdrsp_shared_mem_map_regions { - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory attributes is - * returned - */ - -} __packed; - -#define AVS_MDF_MDSP_PROC_ID 0x2 -#define AVS_MDF_SSC_PROC_ID 0x3 -#define AVS_MDF_CDSP_PROC_ID 0x4 - -/* Shared memory map command payload used by the - * #AVCS_CMD_MAP_MDF_SHARED_MEMORY. - * - * This structure allows clients to map multiple shared memory - * regions with remote processor ID. All mapped regions must be - * from the same memory pool. Following this structure are - * num_regions of avs_shared_map_region_payload. - */ -struct avs_cmd_map_mdf_shared_memory { - struct apr_hdr hdr; - uint32_t mem_map_handle; -/* Unique identifier for the shared memory address. - * - * The aDSP returns this handle for - * #AVCS_CMD_SHARED_MEM_MAP_REGIONS - * - * Supported values: - * Any 32-bit value - * - * The aDSP uses this handle to retrieve the shared memory - * attributes. This handle can be an abstract representation - * of the shared memory regions that are being mapped. - */ - - uint32_t proc_id; -/* Supported values: - * #AVS_MDF_MDSP_PROC_ID - * #AVS_MDF_SSC_PROC_ID - * #AVS_MDF_CDSP_PROC_ID - */ - - uint32_t num_regions; -/* Number of regions to be mapped with the remote DSP processor - * mentioned by proc_id field. - * - * Array of structures of avs_shared_map_region_payload will follow. - * The address fields in those arrays should correspond to the remote - * processor mentioned by proc_id. - * In case of DSPs with SMMU enabled, the address should be IOVA. - * And for DSPs without SMMU, the address should be physical address. - */ -} __packed; - -/*adsp_audio_memmap_api.h*/ - -/* ASM related data structures */ -struct asm_wma_cfg { - u16 format_tag; - u16 ch_cfg; - u32 sample_rate; - u32 avg_bytes_per_sec; - u16 block_align; - u16 valid_bits_per_sample; - u32 ch_mask; - u16 encode_opt; - u16 adv_encode_opt; - u32 adv_encode_opt2; - u32 drc_peak_ref; - u32 drc_peak_target; - u32 drc_ave_ref; - u32 drc_ave_target; -} __packed; - -struct asm_wmapro_cfg { - u16 format_tag; - u16 ch_cfg; - u32 sample_rate; - u32 avg_bytes_per_sec; - u16 block_align; - u16 valid_bits_per_sample; - u32 ch_mask; - u16 encode_opt; - u16 adv_encode_opt; - u32 adv_encode_opt2; - u32 drc_peak_ref; - u32 drc_peak_target; - u32 drc_ave_ref; - u32 drc_ave_target; -} __packed; - -struct asm_aac_cfg { - u16 format; - u16 aot; - u16 ep_config; - u16 section_data_resilience; - u16 scalefactor_data_resilience; - u16 spectral_data_resilience; - u16 ch_cfg; - u16 reserved; - u32 sample_rate; -} __packed; - -struct asm_amrwbplus_cfg { - u32 size_bytes; - u32 version; - u32 num_channels; - u32 amr_band_mode; - u32 amr_dtx_mode; - u32 amr_frame_fmt; - u32 amr_lsf_idx; -} __packed; - -struct asm_flac_cfg { - u32 sample_rate; - u32 ext_sample_rate; - u32 min_frame_size; - u32 max_frame_size; - u16 stream_info_present; - u16 min_blk_size; - u16 max_blk_size; - u16 ch_cfg; - u16 sample_size; - u16 md5_sum; -}; - -struct asm_alac_cfg { - u32 frame_length; - u8 compatible_version; - u8 bit_depth; - u8 pb; - u8 mb; - u8 kb; - u8 num_channels; - u16 max_run; - u32 max_frame_bytes; - u32 avg_bit_rate; - u32 sample_rate; - u32 channel_layout_tag; -}; - -struct asm_g711_dec_cfg { - u32 sample_rate; -}; - -struct asm_vorbis_cfg { - u32 bit_stream_fmt; -}; - -struct asm_ape_cfg { - u16 compatible_version; - u16 compression_level; - u32 format_flags; - u32 blocks_per_frame; - u32 final_frame_blocks; - u32 total_frames; - u16 bits_per_sample; - u16 num_channels; - u32 sample_rate; - u32 seek_table_present; -}; - -struct asm_dsd_cfg { - u16 num_version; - u16 is_bitwise_big_endian; - u16 dsd_channel_block_size; - u16 num_channels; - u8 channel_mapping[8]; - u32 dsd_data_rate; -}; - -struct asm_softpause_params { - u32 enable; - u32 period; - u32 step; - u32 rampingcurve; -} __packed; - -struct asm_softvolume_params { - u32 period; - u32 step; - u32 rampingcurve; -} __packed; - -#define ASM_END_POINT_DEVICE_MATRIX 0 - -#define PCM_CHANNEL_NULL 0 - -/* Front left channel. */ -#define PCM_CHANNEL_FL 1 - -/* Front right channel. */ -#define PCM_CHANNEL_FR 2 - -/* Front center channel. */ -#define PCM_CHANNEL_FC 3 - -/* Left surround channel.*/ -#define PCM_CHANNEL_LS 4 - -/* Right surround channel.*/ -#define PCM_CHANNEL_RS 5 - -/* Low frequency effect channel. */ -#define PCM_CHANNEL_LFE 6 - -/* Center surround channel; Rear center channel. */ -#define PCM_CHANNEL_CS 7 - -/* Left back channel; Rear left channel. */ -#define PCM_CHANNEL_LB 8 - -/* Right back channel; Rear right channel. */ -#define PCM_CHANNEL_RB 9 - -/* Top surround channel. */ -#define PCM_CHANNEL_TS 10 - -/* Center vertical height channel.*/ -#define PCM_CHANNEL_CVH 11 - -/* Mono surround channel.*/ -#define PCM_CHANNEL_MS 12 - -/* Front left of center. */ -#define PCM_CHANNEL_FLC 13 - -/* Front right of center. */ -#define PCM_CHANNEL_FRC 14 - -/* Rear left of center. */ -#define PCM_CHANNEL_RLC 15 - -/* Rear right of center. */ -#define PCM_CHANNEL_RRC 16 - -/* Second low frequency channel. */ -#define PCM_CHANNEL_LFE2 17 - -/* Side left channel. */ -#define PCM_CHANNEL_SL 18 - -/* Side right channel. */ -#define PCM_CHANNEL_SR 19 - -/* Top front left channel. */ -#define PCM_CHANNEL_TFL 20 - -/* Left vertical height channel. */ -#define PCM_CHANNEL_LVH 20 - -/* Top front right channel. */ -#define PCM_CHANNEL_TFR 21 - -/* Right vertical height channel. */ -#define PCM_CHANNEL_RVH 21 - -/* Top center channel. */ -#define PCM_CHANNEL_TC 22 - -/* Top back left channel. */ -#define PCM_CHANNEL_TBL 23 - -/* Top back right channel. */ -#define PCM_CHANNEL_TBR 24 - -/* Top side left channel. */ -#define PCM_CHANNEL_TSL 25 - -/* Top side right channel. */ -#define PCM_CHANNEL_TSR 26 - -/* Top back center channel. */ -#define PCM_CHANNEL_TBC 27 - -/* Bottom front center channel. */ -#define PCM_CHANNEL_BFC 28 - -/* Bottom front left channel. */ -#define PCM_CHANNEL_BFL 29 - -/* Bottom front right channel. */ -#define PCM_CHANNEL_BFR 30 - -/* Left wide channel. */ -#define PCM_CHANNEL_LW 31 - -/* Right wide channel. */ -#define PCM_CHANNEL_RW 32 - -/* Left side direct channel. */ -#define PCM_CHANNEL_LSD 33 - -/* Right side direct channel. */ -#define PCM_CHANNEL_RSD 34 - -/* Mark unused channel. */ -#define PCM_CHANNEL_UNUSED 47 - -#define PCM_CUSTOM_CHANNEL_MAP_1 48 -#define PCM_CUSTOM_CHANNEL_MAP_2 49 -#define PCM_CUSTOM_CHANNEL_MAP_3 50 -#define PCM_CUSTOM_CHANNEL_MAP_4 51 -#define PCM_CUSTOM_CHANNEL_MAP_5 52 -#define PCM_CUSTOM_CHANNEL_MAP_6 53 -#define PCM_CUSTOM_CHANNEL_MAP_7 54 -#define PCM_CUSTOM_CHANNEL_MAP_8 55 -#define PCM_CUSTOM_CHANNEL_MAP_9 56 -#define PCM_CUSTOM_CHANNEL_MAP_10 57 -#define PCM_CUSTOM_CHANNEL_MAP_11 58 -#define PCM_CUSTOM_CHANNEL_MAP_12 59 -#define PCM_CUSTOM_CHANNEL_MAP_13 60 -#define PCM_CUSTOM_CHANNEL_MAP_14 61 -#define PCM_CUSTOM_CHANNEL_MAP_15 62 -#define PCM_CUSTOM_CHANNEL_MAP_16 63 -#define PCM_MAX_CHANNEL_MAP 63 - -/* Max valid channel map index */ -#define PCM_MAX_CHMAP_ID PCM_MAX_CHANNEL_MAP - -#define PCM_FORMAT_MAX_NUM_CHANNEL 8 -#define PCM_FORMAT_MAX_CHANNELS_9 9 - -/* Used for ADM_CMD_DEVICE_OPEN_V8 */ -#define PCM_FORMAT_MAX_NUM_CHANNEL_V8 32 - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 0x00010DA5 - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 0x00010DDC - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 0x0001320C - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 0x00013222 - -#define ASM_MEDIA_FMT_EVRCB_FS 0x00010BEF - -#define ASM_MEDIA_FMT_EVRCWB_FS 0x00010BF0 - -#define ASM_MEDIA_FMT_GENERIC_COMPRESSED 0x00013212 - -#define ASM_MAX_EQ_BANDS 12 - -#define ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2 0x00010D98 - -struct asm_data_cmd_media_fmt_update_v2 { -u32 fmt_blk_size; - /* Media format block size in bytes.*/ -} __packed; - -struct asm_generic_compressed_fmt_blk_t { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - - /* - * Channel mapping array of bitstream output. - * Channel[i] mapping describes channel i inside the buffer, where - * i < num_channels. All valid used channels must be - * present at the beginning of the array. - */ - uint8_t channel_mapping[8]; - - /* - * Number of channels of the incoming bitstream. - * Supported values: 1,2,3,4,5,6,7,8 - */ - uint16_t num_channels; - - /* - * Nominal bits per sample value of the incoming bitstream. - * Supported values: 16, 32 - */ - uint16_t bits_per_sample; - - /* - * Nominal sampling rate of the incoming bitstream. - * Supported values: 8000, 11025, 16000, 22050, 24000, 32000, - * 44100, 48000, 88200, 96000, 176400, 192000, - * 352800, 384000 - */ - uint32_t sampling_rate; - -} __packed; - - -/* Command to send sample rate & channels for IEC61937 (compressed) or IEC60958 - * (pcm) streams. Both audio standards use the same format and are used for - * HDMI or SPDIF output. - */ -#define ASM_DATA_CMD_IEC_60958_MEDIA_FMT 0x0001321E - -struct asm_iec_compressed_fmt_blk_t { - struct apr_hdr hdr; - - /* - * Nominal sampling rate of the incoming bitstream. - * Supported values: 8000, 11025, 16000, 22050, 24000, 32000, - * 44100, 48000, 88200, 96000, 176400, 192000, - * 352800, 384000 - */ - uint32_t sampling_rate; - - /* - * Number of channels of the incoming bitstream. - * Supported values: 1,2,3,4,5,6,7,8 - */ - uint32_t num_channels; - -} __packed; - -struct asm_multi_channel_pcm_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - - u16 num_channels; - /* Number of channels. Supported values: 1 to 8 */ - u16 bits_per_sample; -/* Number of bits per sample per channel. * Supported values: - * 16, 24 * When used for playback, the client must send 24-bit - * samples packed in 32-bit words. The 24-bit samples must be placed - * in the most significant 24 bits of the 32-bit word. When used for - * recording, the aDSP sends 24-bit samples packed in 32-bit words. - * The 24-bit samples are placed in the most significant 24 bits of - * the 32-bit word. - */ - - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * Supported values: 2000 to 48000 - */ - - u16 is_signed; - /* Flag that indicates the samples are signed (1). */ - - u16 reserved; - /* reserved field for 32 bit alignment. must be set to zero. */ - - u8 channel_mapping[8]; -/* Channel array of size 8. - * Supported values: - * - #PCM_CHANNEL_L - * - #PCM_CHANNEL_R - * - #PCM_CHANNEL_C - * - #PCM_CHANNEL_LS - * - #PCM_CHANNEL_RS - * - #PCM_CHANNEL_LFE - * - #PCM_CHANNEL_CS - * - #PCM_CHANNEL_LB - * - #PCM_CHANNEL_RB - * - #PCM_CHANNEL_TS - * - #PCM_CHANNEL_CVH - * - #PCM_CHANNEL_MS - * - #PCM_CHANNEL_FLC - * - #PCM_CHANNEL_FRC - * - #PCM_CHANNEL_RLC - * - #PCM_CHANNEL_RRC - * - * Channel[i] mapping describes channel I. Each element i of the - * array describes channel I inside the buffer where 0 @le I < - * num_channels. An unused channel is set to zero. - */ -} __packed; - -struct asm_multi_channel_pcm_fmt_blk_v3 { - uint16_t num_channels; -/* - * Number of channels - * Supported values: 1 to 8 - */ - - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel - * Supported values: 16, 24 - */ - - uint32_t sample_rate; -/* - * Number of samples per second - * Supported values: 2000 to 48000, 96000,192000 Hz - */ - - uint16_t is_signed; -/* Flag that indicates that PCM samples are signed (1) */ - - uint16_t sample_word_size; -/* - * Size in bits of the word that holds a sample of a channel. - * Supported values: 12,24,32 - */ - - uint8_t channel_mapping[8]; -/* - * Each element, i, in the array describes channel i inside the buffer where - * 0 <= i < num_channels. Unused channels are set to 0. - */ -} __packed; - -struct asm_multi_channel_pcm_fmt_blk_v4 { - uint16_t num_channels; -/* - * Number of channels - * Supported values: 1 to 8 - */ - - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel - * Supported values: 16, 24, 32 - */ - - uint32_t sample_rate; -/* - * Number of samples per second - * Supported values: 2000 to 48000, 96000,192000 Hz - */ - - uint16_t is_signed; -/* Flag that indicates that PCM samples are signed (1) */ - - uint16_t sample_word_size; -/* - * Size in bits of the word that holds a sample of a channel. - * Supported values: 12,24,32 - */ - - uint8_t channel_mapping[8]; -/* - * Each element, i, in the array describes channel i inside the buffer where - * 0 <= i < num_channels. Unused channels are set to 0. - */ - uint16_t endianness; -/* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; -/* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - * 31 - for 24b unpacked or 32bit - */ -} __packed; - - -struct asm_multi_channel_pcm_fmt_blk_v5 { - uint16_t num_channels; -/* - * Number of channels - * Supported values: 1 to 32 - */ - - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel - * Supported values: 16, 24, 32 - */ - - uint32_t sample_rate; -/* - * Number of samples per second - * Supported values: 2000 to 48000, 96000,192000 Hz - */ - - uint16_t is_signed; -/* Flag that indicates that PCM samples are signed (1) */ - - uint16_t sample_word_size; -/* - * Size in bits of the word that holds a sample of a channel. - * Supported values: 12,24,32 - */ - uint16_t endianness; -/* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; -/* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - * 31 - for 24b unpacked or 32bit - */ - - uint8_t channel_mapping[32]; -/* - * Each element, i, in the array describes channel i inside the buffer where - * 0 <= i < num_channels. Unused channels are set to 0. - */ -} __packed; -/* - * Payload of the multichannel PCM configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 media format. - */ -struct asm_multi_channel_pcm_fmt_blk_param_v3 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - struct asm_multi_channel_pcm_fmt_blk_v3 param; -} __packed; - -/* - * Payload of the multichannel PCM configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 media format. - */ -struct asm_multi_channel_pcm_fmt_blk_param_v4 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - struct asm_multi_channel_pcm_fmt_blk_v4 param; -} __packed; - -/* - * Payload of the multichannel PCM configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 media format. - */ -struct asm_multi_channel_pcm_fmt_blk_param_v5 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - struct asm_multi_channel_pcm_fmt_blk_v5 param; -} __packed; - -struct asm_stream_cmd_set_encdec_param { - u32 param_id; - /* ID of the parameter. */ - - u32 param_size; -/* Data size of this parameter, in bytes. The size is a multiple - * of 4 bytes. - */ - -} __packed; - -struct asm_enc_cfg_blk_param_v2 { - u32 frames_per_buf; -/* Number of encoded frames to pack into each buffer. - * - * @note1hang This is only guidance information for the aDSP. The - * number of encoded frames put into each buffer (specified by the - * client) is less than or equal to this number. - */ - - u32 enc_cfg_blk_size; -/* Size in bytes of the encoder configuration block that follows - * this member. - */ - -} __packed; - -struct asm_custom_enc_cfg_t_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint32_t sample_rate; - - uint16_t num_channels; - uint16_t reserved; - /* num_ch == 1, then PCM_CHANNEL_C, - * num_ch == 2, then {PCM_CHANNEL_L, PCM_CHANNEL_R} - */ - uint8_t channel_mapping[8]; - uint32_t custom_size; - uint8_t custom_data[15]; -} __packed; - -/* @brief Dolby Digital Plus end point configuration structure - */ -struct asm_dec_ddp_endp_param_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - int endp_param_value; -} __packed; - -/* - * Payload of the multichannel PCM encoder configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 media format. - */ -struct asm_multi_channel_pcm_enc_cfg_v5 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; -/* - * Number of PCM channels. - * @values - * - 0 -- Native mode - * - 1 -- 8 channels - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - */ - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel. - * @values 16, 24 - */ - uint32_t sample_rate; -/* - * Number of samples per second. - * @values 0, 8000 to 48000 Hz - * A value of 0 indicates the native sampling rate. Encoding is - * performed at the input sampling rate. - */ - uint16_t is_signed; -/* - * Flag that indicates the PCM samples are signed (1). Currently, only - * signed PCM samples are supported. - */ - uint16_t sample_word_size; -/* - * The size in bits of the word that holds a sample of a channel. - * @values 16, 24, 32 - * 16-bit samples are always placed in 16-bit words: - * sample_word_size = 1. - * 24-bit samples can be placed in 32-bit words or in consecutive - * 24-bit words. - * - If sample_word_size = 32, 24-bit samples are placed in the - * most significant 24 bits of a 32-bit word. - * - If sample_word_size = 24, 24-bit samples are placed in - * 24-bit words. @tablebulletend - */ - uint16_t endianness; -/* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; -/* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - */ - uint8_t channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; -/* - * Channel mapping array expected at the encoder output. - * Channel[i] mapping describes channel i inside the buffer, where - * 0 @le i < num_channels. All valid used channels must be present at - * the beginning of the array. - * If Native mode is set for the channels, this field is ignored. - * @values See Section @xref{dox:PcmChannelDefs} - */ -} __packed; - -/* - * Payload of the multichannel PCM encoder configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 media format. - */ - -struct asm_multi_channel_pcm_enc_cfg_v4 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; - /* - * Number of PCM channels. - * @values - * - 0 -- Native mode - * - 1 -- 8 channels - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - */ - uint16_t bits_per_sample; - /* - * Number of bits per sample per channel. - * @values 16, 24 - */ - uint32_t sample_rate; - /* - * Number of samples per second. - * @values 0, 8000 to 48000 Hz - * A value of 0 indicates the native sampling rate. Encoding is - * performed at the input sampling rate. - */ - uint16_t is_signed; - /* - * Flag that indicates the PCM samples are signed (1). Currently, only - * signed PCM samples are supported. - */ - uint16_t sample_word_size; - /* - * The size in bits of the word that holds a sample of a channel. - * @values 16, 24, 32 - * 16-bit samples are always placed in 16-bit words: - * sample_word_size = 1. - * 24-bit samples can be placed in 32-bit words or in consecutive - * 24-bit words. - * - If sample_word_size = 32, 24-bit samples are placed in the - * most significant 24 bits of a 32-bit word. - * - If sample_word_size = 24, 24-bit samples are placed in - * 24-bit words. @tablebulletend - */ - uint8_t channel_mapping[8]; - /* - * Channel mapping array expected at the encoder output. - * Channel[i] mapping describes channel i inside the buffer, where - * 0 @le i < num_channels. All valid used channels must be present at - * the beginning of the array. - * If Native mode is set for the channels, this field is ignored. - * @values See Section @xref{dox:PcmChannelDefs} - */ - uint16_t endianness; - /* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; - /* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - * 31 - for 24b unpacked or 32bit - */ -} __packed; - -/* - * Payload of the multichannel PCM encoder configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 media format. - */ - -struct asm_multi_channel_pcm_enc_cfg_v3 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; - /* - * Number of PCM channels. - * @values - * - 0 -- Native mode - * - 1 -- 8 channels - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - */ - uint16_t bits_per_sample; - /* - * Number of bits per sample per channel. - * @values 16, 24 - */ - uint32_t sample_rate; - /* - * Number of samples per second. - * @values 0, 8000 to 48000 Hz - * A value of 0 indicates the native sampling rate. Encoding is - * performed at the input sampling rate. - */ - uint16_t is_signed; - /* - * Flag that indicates the PCM samples are signed (1). Currently, only - * signed PCM samples are supported. - */ - uint16_t sample_word_size; - /* - * The size in bits of the word that holds a sample of a channel. - * @values 16, 24, 32 - * 16-bit samples are always placed in 16-bit words: - * sample_word_size = 1. - * 24-bit samples can be placed in 32-bit words or in consecutive - * 24-bit words. - * - If sample_word_size = 32, 24-bit samples are placed in the - * most significant 24 bits of a 32-bit word. - * - If sample_word_size = 24, 24-bit samples are placed in - * 24-bit words. @tablebulletend - */ - uint8_t channel_mapping[8]; - /* - * Channel mapping array expected at the encoder output. - * Channel[i] mapping describes channel i inside the buffer, where - * 0 @le i < num_channels. All valid used channels must be present at - * the beginning of the array. - * If Native mode is set for the channels, this field is ignored. - * @values See Section @xref{dox:PcmChannelDefs} - */ -}; - -/* @brief Multichannel PCM encoder configuration structure used - * in the #ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2 command. - */ - -struct asm_multi_channel_pcm_enc_cfg_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; -/*< Number of PCM channels. - * - * Supported values: - 0 -- Native mode - 1 -- 8 Native mode - * indicates that encoding must be performed with the number of - * channels at the input. - */ - - uint16_t bits_per_sample; -/*< Number of bits per sample per channel. - * Supported values: 16, 24 - */ - - uint32_t sample_rate; -/*< Number of samples per second (in Hertz). - * - * Supported values: 0, 8000 to 48000 A value of 0 indicates the - * native sampling rate. Encoding is performed at the input sampling - * rate. - */ - - uint16_t is_signed; -/*< Specifies whether the samples are signed (1). Currently, - * only signed samples are supported. - */ - - uint16_t reserved; -/*< reserved field for 32 bit alignment. must be set to zero.*/ - - - uint8_t channel_mapping[8]; -} __packed; - -#define ASM_MEDIA_FMT_MP3 0x00010BE9 -#define ASM_MEDIA_FMT_AAC_V2 0x00010DA6 - -/* @xreflabel - * {hdr:AsmMediaFmtDolbyAac} Media format ID for the - * Dolby AAC decoder. This format ID is be used if the client wants - * to use the Dolby AAC decoder to decode MPEG2 and MPEG4 AAC - * contents. - */ - -#define ASM_MEDIA_FMT_DOLBY_AAC 0x00010D86 - -/* Enumeration for the audio data transport stream AAC format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS 0 - -/* Enumeration for low overhead audio stream AAC format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LOAS 1 - -/* Enumeration for the audio data interchange format - * AAC format. - */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADIF 2 - -/* Enumeration for the raw AAC format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW 3 - -/* Enumeration for the AAC LATM format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LATM 4 - -#define ASM_MEDIA_FMT_AAC_AOT_LC 2 -#define ASM_MEDIA_FMT_AAC_AOT_SBR 5 -#define ASM_MEDIA_FMT_AAC_AOT_PS 29 -#define ASM_MEDIA_FMT_AAC_AOT_BSAC 22 - -struct asm_aac_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - - u16 aac_fmt_flag; -/* Bitstream format option. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LOAS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADIF - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - */ - - u16 audio_objype; -/* Audio Object Type (AOT) present in the AAC stream. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_AOT_LC - * - #ASM_MEDIA_FMT_AAC_AOT_SBR - * - #ASM_MEDIA_FMT_AAC_AOT_BSAC - * - #ASM_MEDIA_FMT_AAC_AOT_PS - * - Otherwise -- Not supported - */ - - u16 channel_config; -/* Number of channels present in the AAC stream. - * Supported values: - * - 1 -- Mono - * - 2 -- Stereo - * - 6 -- 5.1 content - */ - - u16 total_size_of_PCE_bits; -/* greater or equal to zero. * -In case of RAW formats and - * channel config = 0 (PCE), client can send * the bit stream - * containing PCE immediately following this structure * (in-band). - * -This number does not include bits included for 32 bit alignment. - * -If zero, then the PCE info is assumed to be available in the - * audio -bit stream & not in-band. - */ - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * - * Supported values: 8000, 11025, 12000, 16000, 22050, 24000, 32000, - * 44100, 48000 - * - * This field must be equal to the sample rate of the AAC-LC - * decoder's output. - For MP4 or 3GP containers, this is indicated - * by the samplingFrequencyIndex field in the AudioSpecificConfig - * element. - For ADTS format, this is indicated by the - * samplingFrequencyIndex in the ADTS fixed header. - For ADIF - * format, this is indicated by the samplingFrequencyIndex in the - * program_config_element present in the ADIF header. - */ - -} __packed; - -struct asm_aac_enc_cfg_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u32 bit_rate; - /* Encoding rate in bits per second. */ - u32 enc_mode; -/* Encoding mode. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_AOT_LC - * - #ASM_MEDIA_FMT_AAC_AOT_SBR - * - #ASM_MEDIA_FMT_AAC_AOT_PS - */ - u16 aac_fmt_flag; -/* AAC format flag. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - */ - u16 channel_cfg; -/* Number of channels to encode. - * Supported values: - * - 0 -- Native mode - * - 1 -- Mono - * - 2 -- Stereo - * - Other values are not supported. - * @note1hang The eAAC+ encoder mode supports only stereo. - * Native mode indicates that encoding must be performed with the - * number of channels at the input. - * The number of channels must not change during encoding. - */ - - u32 sample_rate; -/* Number of samples per second. - * Supported values: - 0 -- Native mode - For other values, - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - -} __packed; - -#define ASM_MEDIA_FMT_G711_ALAW_FS 0x00010BF7 -#define ASM_MEDIA_FMT_G711_MLAW_FS 0x00010C2E - -struct asm_g711_enc_cfg_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u32 sample_rate; -/* - * Number of samples per second. - * Supported values: 8000, 16000 Hz - */ - -} __packed; - -struct asm_vorbis_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u32 bit_stream_fmt; -/* Bit stream format. - * Supported values: - * - 0 -- Raw bitstream - * - 1 -- Transcoded bitstream - * - * Transcoded bitstream containing the size of the frame as the first - * word in each frame. - */ - -} __packed; - -struct asm_flac_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 is_stream_info_present; -/* Specifies whether stream information is present in the FLAC format - * block. - * - * Supported values: - * - 0 -- Stream information is not present in this message - * - 1 -- Stream information is present in this message - * - * When set to 1, the FLAC bitstream was successfully parsed by the - * client, and other fields in the FLAC format block can be read by the - * decoder to get metadata stream information. - */ - - u16 num_channels; -/* Number of channels for decoding. - * Supported values: 1 to 2 - */ - - u16 min_blk_size; -/* Minimum block size (in samples) used in the stream. It must be less - * than or equal to max_blk_size. - */ - - u16 max_blk_size; -/* Maximum block size (in samples) used in the stream. If the - * minimum block size equals the maximum block size, a fixed block - * size stream is implied. - */ - - u16 md5_sum[8]; -/* MD5 signature array of the unencoded audio data. This allows the - * decoder to determine if an error exists in the audio data, even when - * the error does not result in an invalid bitstream. - */ - - u32 sample_rate; -/* Number of samples per second. - * Supported values: 8000 to 48000 Hz - */ - - u32 min_frame_size; -/* Minimum frame size used in the stream. - * Supported values: - * - > 0 bytes - * - 0 -- The value is unknown - */ - - u32 max_frame_size; -/* Maximum frame size used in the stream. - * Supported values: - * -- > 0 bytes - * -- 0 . The value is unknown - */ - - u16 sample_size; -/* Bits per sample.Supported values: 8, 16 */ - - u16 reserved; -/* Clients must set this field to zero - */ - -} __packed; - -struct asm_alac_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u32 frame_length; - u8 compatible_version; - u8 bit_depth; - u8 pb; - u8 mb; - u8 kb; - u8 num_channels; - u16 max_run; - u32 max_frame_bytes; - u32 avg_bit_rate; - u32 sample_rate; - u32 channel_layout_tag; - -} __packed; - -struct asm_g711_dec_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u32 sample_rate; -} __packed; - -struct asm_ape_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 compatible_version; - u16 compression_level; - u32 format_flags; - u32 blocks_per_frame; - u32 final_frame_blocks; - u32 total_frames; - u16 bits_per_sample; - u16 num_channels; - u32 sample_rate; - u32 seek_table_present; - -} __packed; - -struct asm_dsd_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 num_version; - u16 is_bitwise_big_endian; - u16 dsd_channel_block_size; - u16 num_channels; - u8 channel_mapping[8]; - u32 dsd_data_rate; - -} __packed; - -#define ASM_MEDIA_FMT_AMRNB_FS 0x00010BEB - -/* Enumeration for 4.75 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MR475 0 - -/* Enumeration for 5.15 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MR515 1 - -/* Enumeration for 5.90 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR59 2 - -/* Enumeration for 6.70 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR67 3 - -/* Enumeration for 7.40 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR74 4 - -/* Enumeration for 7.95 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR795 5 - -/* Enumeration for 10.20 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR102 6 - -/* Enumeration for 12.20 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR122 7 - -/* Enumeration for AMR-NB Discontinuous Transmission mode off. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_OFF 0 - -/* Enumeration for AMR-NB DTX mode VAD1. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD1 1 - -/* Enumeration for AMR-NB DTX mode VAD2. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD2 2 - -/* Enumeration for AMR-NB DTX mode auto. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_AUTO 3 - -struct asm_amrnb_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u16 enc_mode; -/* AMR-NB encoding rate. - * Supported values: - * Use the ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_* - * macros - */ - - u16 dtx_mode; -/* Specifies whether DTX mode is disabled or enabled. - * Supported values: - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_OFF - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD1 - */ -} __packed; - -#define ASM_MEDIA_FMT_AMRWB_FS 0x00010BEC - -/* Enumeration for 6.6 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR66 0 - -/* Enumeration for 8.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR885 1 - -/* Enumeration for 12.65 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1265 2 - -/* Enumeration for 14.25 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1425 3 - -/* Enumeration for 15.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1585 4 - -/* Enumeration for 18.25 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1825 5 - -/* Enumeration for 19.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1985 6 - -/* Enumeration for 23.05 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR2305 7 - -/* Enumeration for 23.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR2385 8 - -struct asm_amrwb_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u16 enc_mode; -/* AMR-WB encoding rate. - * Suupported values: - * Use the ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_* - * macros - */ - - u16 dtx_mode; -/* Specifies whether DTX mode is disabled or enabled. - * Supported values: - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_OFF - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD1 - */ -} __packed; - -#define ASM_MEDIA_FMT_V13K_FS 0x00010BED - -/* Enumeration for 14.4 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1440 0 - -/* Enumeration for 12.2 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1220 1 - -/* Enumeration for 11.2 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1120 2 - -/* Enumeration for 9.0 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR90 3 - -/* Enumeration for 7.2 kbps V13K eEncoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR720 4 - -/* Enumeration for 1/8 vocoder rate.*/ -#define ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE 1 - -/* Enumeration for 1/4 vocoder rate. */ -#define ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE 2 - -/* Enumeration for 1/2 vocoder rate. */ -#define ASM_MEDIA_FMT_VOC_HALF_RATE 3 - -/* Enumeration for full vocoder rate. */ -#define ASM_MEDIA_FMT_VOC_FULL_RATE 4 - -struct asm_v13k_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u16 max_rate; -/* Maximum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 min_rate; -/* Minimum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 reduced_rate_cmd; -/* Reduced rate command, used to change - * the average bitrate of the V13K - * vocoder. - * Supported values: - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1440 (Default) - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1220 - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1120 - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR90 - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR720 - */ - - u16 rate_mod_cmd; -/* Rate modulation command. Default = 0. - *- If bit 0=1, rate control is enabled. - *- If bit 1=1, the maximum number of consecutive full rate - * frames is limited with numbers supplied in - * bits 2 to 10. - *- If bit 1=0, the minimum number of non-full rate frames - * in between two full rate frames is forced to - * the number supplied in bits 2 to 10. In both cases, if necessary, - * half rate is used to substitute full rate. - Bits 15 to 10 are - * reserved and must all be set to zero. - */ - -} __packed; - -#define ASM_MEDIA_FMT_EVRC_FS 0x00010BEE - -/* EVRC encoder configuration structure used in the - * #ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2 command. - */ -struct asm_evrc_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u16 max_rate; -/* Maximum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 min_rate; -/* Minimum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 rate_mod_cmd; -/* Rate modulation command. Default: 0. - * - If bit 0=1, rate control is enabled. - * - If bit 1=1, the maximum number of consecutive full rate frames - * is limited with numbers supplied in bits 2 to 10. - * - * - If bit 1=0, the minimum number of non-full rate frames in - * between two full rate frames is forced to the number supplied in - * bits 2 to 10. In both cases, if necessary, half rate is used to - * substitute full rate. - * - * - Bits 15 to 10 are reserved and must all be set to zero. - */ - - u16 reserved; - /* Reserved. Clients must set this field to zero. */ -} __packed; - -#define ASM_MEDIA_FMT_WMA_V10PRO_V2 0x00010DA7 - -struct asm_wmaprov10_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 fmtag; -/* WMA format type. - * Supported values: - * - 0x162 -- WMA 9 Pro - * - 0x163 -- WMA 9 Pro Lossless - * - 0x166 -- WMA 10 Pro - * - 0x167 -- WMA 10 Pro Lossless - */ - - u16 num_channels; -/* Number of channels encoded in the input stream. - * Supported values: 1 to 8 - */ - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * Supported values: 11025, 16000, 22050, 32000, 44100, 48000, - * 88200, 96000 - */ - - u32 avg_bytes_per_sec; -/* Bitrate expressed as the average bytes per second. - * Supported values: 2000 to 96000 - */ - - u16 blk_align; -/* Size of the bitstream packet size in bytes. WMA Pro files - * have a payload of one block per bitstream packet. - * Supported values: @le 13376 - */ - - u16 bits_per_sample; -/* Number of bits per sample in the encoded WMA stream. - * Supported values: 16, 24 - */ - - u32 channel_mask; -/* Bit-packed double word (32-bits) that indicates the - * recommended speaker positions for each source channel. - */ - - u16 enc_options; -/* Bit-packed word with values that indicate whether certain - * features of the bitstream are used. - * Supported values: - 0x0001 -- ENCOPT3_PURE_LOSSLESS - 0x0006 -- - * ENCOPT3_FRM_SIZE_MOD - 0x0038 -- ENCOPT3_SUBFRM_DIV - 0x0040 -- - * ENCOPT3_WRITE_FRAMESIZE_IN_HDR - 0x0080 -- - * ENCOPT3_GENERATE_DRC_PARAMS - 0x0100 -- ENCOPT3_RTMBITS - */ - - - u16 usAdvancedEncodeOpt; - /* Advanced encoding option. */ - - u32 advanced_enc_options2; - /* Advanced encoding option 2. */ - -} __packed; - -#define ASM_MEDIA_FMT_WMA_V9_V2 0x00010DA8 -struct asm_wmastdv9_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u16 fmtag; -/* WMA format tag. - * Supported values: 0x161 (WMA 9 standard) - */ - - u16 num_channels; -/* Number of channels in the stream. - * Supported values: 1, 2 - */ - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * Supported values: 48000 - */ - - u32 avg_bytes_per_sec; - /* Bitrate expressed as the average bytes per second. */ - - u16 blk_align; -/* Block align. All WMA files with a maximum packet size of - * 13376 are supported. - */ - - - u16 bits_per_sample; -/* Number of bits per sample in the output. - * Supported values: 16 - */ - - u32 channel_mask; -/* Channel mask. - * Supported values: - * - 3 -- Stereo (front left/front right) - * - 4 -- Mono (center) - */ - - u16 enc_options; - /* Options used during encoding. */ - - u16 reserved; - -} __packed; - -#define ASM_MEDIA_FMT_WMA_V8 0x00010D91 - -struct asm_wmastdv8_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u32 bit_rate; - /* Encoding rate in bits per second. */ - - u32 sample_rate; -/* Number of samples per second. - * - * Supported values: - * - 0 -- Native mode - * - Other Supported values are 22050, 32000, 44100, and 48000. - * - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - - u16 channel_cfg; -/* Number of channels to encode. - * Supported values: - * - 0 -- Native mode - * - 1 -- Mono - * - 2 -- Stereo - * - Other values are not supported. - * - * Native mode indicates that encoding must be performed with the - * number of channels at the input. - * The number of channels must not change during encoding. - */ - - u16 reserved; - /* Reserved. Clients must set this field to zero.*/ - } __packed; - -#define ASM_MEDIA_FMT_AMR_WB_PLUS_V2 0x00010DA9 - -struct asm_amrwbplus_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u32 amr_frame_fmt; -/* AMR frame format. - * Supported values: - * - 6 -- Transport Interface Format (TIF) - * - Any other value -- File storage format (FSF) - * - * TIF stream contains 2-byte header for each frame within the - * superframe. FSF stream contains one 2-byte header per superframe. - */ - -} __packed; - -#define ASM_MEDIA_FMT_AC3 0x00010DEE -#define ASM_MEDIA_FMT_EAC3 0x00010DEF -#define ASM_MEDIA_FMT_DTS 0x00010D88 -#define ASM_MEDIA_FMT_MP2 0x00010DE9 -#define ASM_MEDIA_FMT_FLAC 0x00010C16 -#define ASM_MEDIA_FMT_ALAC 0x00012F31 -#define ASM_MEDIA_FMT_VORBIS 0x00010C15 -#define ASM_MEDIA_FMT_APE 0x00012F32 -#define ASM_MEDIA_FMT_DSD 0x00012F3E -#define ASM_MEDIA_FMT_TRUEHD 0x00013215 -/* 0x0 is used for fomat ID since ADSP dynamically determines the - * format encapsulated in the IEC61937 (compressed) or IEC60958 - * (pcm) packets. - */ -#define ASM_MEDIA_FMT_IEC 0x00000000 - -/* Media format ID for adaptive transform acoustic coding. This - * ID is used by the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED command - * only. - */ - -#define ASM_MEDIA_FMT_ATRAC 0x00010D89 - -/* Media format ID for metadata-enhanced audio transmission. - * This ID is used by the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED - * command only. - */ - -#define ASM_MEDIA_FMT_MAT 0x00010D8A - -/* adsp_media_fmt.h */ - -#define ASM_DATA_CMD_WRITE_V2 0x00010DAB - -struct asm_data_cmd_write_v2 { - struct apr_hdr hdr; - u32 buf_addr_lsw; -/* The 64 bit address msw-lsw should be a valid, mapped address. - * 64 bit address should be a multiple of 32 bytes - */ - - u32 buf_addr_msw; -/* The 64 bit address msw-lsw should be a valid, mapped address. - * 64 bit address should be a multiple of 32 bytes. - * -Address of the buffer containing the data to be decoded. - * The buffer should be aligned to a 32 byte boundary. - * -In the case of 32 bit Shared memory address, msw field must - * -be set to zero. - * -In the case of 36 bit shared memory address, bit 31 to bit 4 - * -of msw must be set to zero. - */ - u32 mem_map_handle; -/* memory map handle returned by DSP through - * ASM_CMD_SHARED_MEM_MAP_REGIONS command - */ - u32 buf_size; -/* Number of valid bytes available in the buffer for decoding. The - * first byte starts at buf_addr. - */ - - u32 seq_id; - /* Optional buffer sequence ID. */ - - u32 timestamp_lsw; -/* Lower 32 bits of the 64-bit session time in microseconds of the - * first buffer sample. - */ - - u32 timestamp_msw; -/* Upper 32 bits of the 64-bit session time in microseconds of the - * first buffer sample. - */ - - u32 flags; -/* Bitfield of flags. - * Supported values for bit 31: - * - 1 -- Valid timestamp. - * - 0 -- Invalid timestamp. - * - Use #ASM_BIT_MASKIMESTAMP_VALID_FLAG as the bitmask and - * #ASM_SHIFTIMESTAMP_VALID_FLAG as the shift value to set this bit. - * Supported values for bit 30: - * - 1 -- Last buffer. - * - 0 -- Not the last buffer. - * - * Supported values for bit 29: - * - 1 -- Continue the timestamp from the previous buffer. - * - 0 -- Timestamp of the current buffer is not related - * to the timestamp of the previous buffer. - * - Use #ASM_BIT_MASKS_CONTINUE_FLAG and #ASM_SHIFTS_CONTINUE_FLAG - * to set this bit. - * - * Supported values for bit 4: - * - 1 -- End of the frame. - * - 0 -- Not the end of frame, or this information is not known. - * - Use #ASM_BIT_MASK_EOF_FLAG as the bitmask and #ASM_SHIFT_EOF_FLAG - * as the shift value to set this bit. - * - * All other bits are reserved and must be set to 0. - * - * If bit 31=0 and bit 29=1: The timestamp of the first sample in - * this buffer continues from the timestamp of the last sample in - * the previous buffer. If there is no previous buffer (i.e., this - * is the first buffer sent after opening the stream or after a - * flush operation), or if the previous buffer does not have a valid - * timestamp, the samples in the current buffer also do not have a - * valid timestamp. They are played out as soon as possible. - * - * - * If bit 31=0 and bit 29=0: No timestamp is associated with the - * first sample in this buffer. The samples are played out as soon - * as possible. - * - * - * If bit 31=1 and bit 29 is ignored: The timestamp specified in - * this payload is honored. - * - * - * If bit 30=0: Not the last buffer in the stream. This is useful - * in removing trailing samples. - * - * - * For bit 4: The client can set this flag for every buffer sent in - * which the last byte is the end of a frame. If this flag is set, - * the buffer can contain data from multiple frames, but it should - * always end at a frame boundary. Restrictions allow the aDSP to - * detect an end of frame without requiring additional processing. - */ - -} __packed; - -#define ASM_DATA_CMD_READ_V2 0x00010DAC - -struct asm_data_cmd_read_v2 { - struct apr_hdr hdr; - u32 buf_addr_lsw; -/* the 64 bit address msw-lsw should be a valid mapped address - * and should be a multiple of 32 bytes - */ - - - u32 buf_addr_msw; -/* the 64 bit address msw-lsw should be a valid mapped address - * and should be a multiple of 32 bytes. - * - Address of the buffer where the DSP puts the encoded data, - * potentially, at an offset specified by the uOffset field in - * ASM_DATA_EVENT_READ_DONE structure. The buffer should be aligned - * to a 32 byte boundary. - * - In the case of 32 bit Shared memory address, msw field must - * - be set to zero. - * - In the case of 36 bit shared memory address, bit 31 to bit - * - 4 of msw must be set to zero. - */ - u32 mem_map_handle; -/* memory map handle returned by DSP through - * ASM_CMD_SHARED_MEM_MAP_REGIONS command. - */ - - u32 buf_size; -/* Number of bytes available for the aDSP to write. The aDSP - * starts writing from buf_addr. - */ - - u32 seq_id; - /* Optional buffer sequence ID. */ -} __packed; - -#define ASM_DATA_CMD_EOS 0x00010BDB -#define ASM_DATA_EVENT_RENDERED_EOS 0x00010C1C -#define ASM_DATA_EVENT_EOS 0x00010BDD - -#define ASM_DATA_EVENT_WRITE_DONE_V2 0x00010D99 -struct asm_data_event_write_done_v2 { - u32 buf_addr_lsw; - /* lsw of the 64 bit address */ - u32 buf_addr_msw; - /* msw of the 64 bit address. address given by the client in - * ASM_DATA_CMD_WRITE_V2 command. - */ - u32 mem_map_handle; - /* memory map handle in the ASM_DATA_CMD_WRITE_V2 */ - - u32 status; -/* Status message (error code) that indicates whether the - * referenced buffer has been successfully consumed. - * Supported values: Refer to @xhyperref{Q3,[Q3]} - */ -} __packed; - -#define ASM_DATA_EVENT_READ_DONE_V2 0x00010D9A - -/* Definition of the frame metadata flag bitmask.*/ -#define ASM_BIT_MASK_FRAME_METADATA_FLAG (0x40000000UL) - -/* Definition of the frame metadata flag shift value. */ -#define ASM_SHIFT_FRAME_METADATA_FLAG 30 - -struct asm_data_event_read_done_v2 { - u32 status; -/* Status message (error code). - * Supported values: Refer to @xhyperref{Q3,[Q3]} - */ - -u32 buf_addr_lsw; -/* 64 bit address msw-lsw is a valid, mapped address. 64 bit - * address is a multiple of 32 bytes. - */ - -u32 buf_addr_msw; -/* 64 bit address msw-lsw is a valid, mapped address. 64 bit - * address is a multiple of 32 bytes. - * - * -Same address provided by the client in ASM_DATA_CMD_READ_V2 - * -In the case of 32 bit Shared memory address, msw field is set to - * zero. - * -In the case of 36 bit shared memory address, bit 31 to bit 4 - * -of msw is set to zero. - */ - -u32 mem_map_handle; -/* memory map handle in the ASM_DATA_CMD_READ_V2 */ - -u32 enc_framesotal_size; -/* Total size of the encoded frames in bytes. - * Supported values: >0 - */ - -u32 offset; -/* Offset (from buf_addr) to the first byte of the first encoded - * frame. All encoded frames are consecutive, starting from this - * offset. - * Supported values: > 0 - */ - -u32 timestamp_lsw; -/* Lower 32 bits of the 64-bit session time in microseconds of - * the first sample in the buffer. If Bit 5 of mode_flags flag of - * ASM_STREAM_CMD_OPEN_READ_V2 is 1 then the 64 bit timestamp is - * absolute capture time otherwise it is relative session time. The - * absolute timestamp doesn't reset unless the system is reset. - */ - - -u32 timestamp_msw; -/* Upper 32 bits of the 64-bit session time in microseconds of - * the first sample in the buffer. - */ - - -u32 flags; -/* Bitfield of flags. Bit 30 indicates whether frame metadata is - * present. If frame metadata is present, num_frames consecutive - * instances of @xhyperref{hdr:FrameMetaData,Frame metadata} start - * at the buffer address. - * Supported values for bit 31: - * - 1 -- Timestamp is valid. - * - 0 -- Timestamp is invalid. - * - Use #ASM_BIT_MASKIMESTAMP_VALID_FLAG and - * #ASM_SHIFTIMESTAMP_VALID_FLAG to set this bit. - * - * Supported values for bit 30: - * - 1 -- Frame metadata is present. - * - 0 -- Frame metadata is absent. - * - Use #ASM_BIT_MASK_FRAME_METADATA_FLAG and - * #ASM_SHIFT_FRAME_METADATA_FLAG to set this bit. - * - * All other bits are reserved; the aDSP sets them to 0. - */ - -u32 num_frames; -/* Number of encoded frames in the buffer. */ - -u32 seq_id; -/* Optional buffer sequence ID. */ -} __packed; - -struct asm_data_read_buf_metadata_v2 { - u32 offset; -/* Offset from buf_addr in #ASM_DATA_EVENT_READ_DONE_PAYLOAD to - * the frame associated with this metadata. - * Supported values: > 0 - */ - -u32 frm_size; -/* Size of the encoded frame in bytes. - * Supported values: > 0 - */ - -u32 num_encoded_pcm_samples; -/* Number of encoded PCM samples (per channel) in the frame - * associated with this metadata. - * Supported values: > 0 - */ - -u32 timestamp_lsw; -/* Lower 32 bits of the 64-bit session time in microseconds of the - * first sample for this frame. - * If Bit 5 of mode_flags flag of ASM_STREAM_CMD_OPEN_READ_V2 is 1 - * then the 64 bit timestamp is absolute capture time otherwise it - * is relative session time. The absolute timestamp doesn't reset - * unless the system is reset. - */ - - -u32 timestamp_msw; -/* Lower 32 bits of the 64-bit session time in microseconds of the - * first sample for this frame. - */ - -u32 flags; -/* Frame flags. - * Supported values for bit 31: - * - 1 -- Time stamp is valid - * - 0 -- Time stamp is not valid - * - All other bits are reserved; the aDSP sets them to 0. - */ -} __packed; - -/* Notifies the client of a change in the data sampling rate or - * Channel mode. This event is raised by the decoder service. The - * event is enabled through the mode flags of - * #ASM_STREAM_CMD_OPEN_WRITE_V2 or - * #ASM_STREAM_CMD_OPEN_READWRITE_V2. - The decoder detects a change - * in the output sampling frequency or the number/positioning of - * output channels, or if it is the first frame decoded.The new - * sampling frequency or the new channel configuration is - * communicated back to the client asynchronously. - */ - -#define ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY 0x00010C65 - -/* Payload of the #ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY event. - * This event is raised when the following conditions are both true: - * - The event is enabled through the mode_flags of - * #ASM_STREAM_CMD_OPEN_WRITE_V2 or - * #ASM_STREAM_CMD_OPEN_READWRITE_V2. - The decoder detects a change - * in either the output sampling frequency or the number/positioning - * of output channels, or if it is the first frame decoded. - * This event is not raised (even if enabled) if the decoder is - * MIDI, because - */ - - -struct asm_data_event_sr_cm_change_notify { - u32 sample_rate; -/* New sampling rate (in Hertz) after detecting a change in the - * bitstream. - * Supported values: 2000 to 48000 - */ - - u16 num_channels; -/* New number of channels after detecting a change in the - * bitstream. - * Supported values: 1 to 8 - */ - - - u16 reserved; - /* Reserved for future use. This field must be set to 0.*/ - - u8 channel_mapping[8]; - -} __packed; - -/* Notifies the client of a data sampling rate or channel mode - * change. This event is raised by the encoder service. - * This event is raised when : - * - Native mode encoding was requested in the encoder - * configuration (i.e., the channel number was 0), the sample rate - * was 0, or both were 0. - * - * - The input data frame at the encoder is the first one, or the - * sampling rate/channel mode is different from the previous input - * data frame. - * - */ -#define ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY 0x00010BDE - -struct asm_data_event_enc_sr_cm_change_notify { - u32 sample_rate; -/* New sampling rate (in Hertz) after detecting a change in the - * input data. - * Supported values: 2000 to 48000 - */ - - - u16 num_channels; -/* New number of channels after detecting a change in the input - * data. Supported values: 1 to 8 - */ - - - u16 bits_per_sample; -/* New bits per sample after detecting a change in the input - * data. - * Supported values: 16, 24 - */ - - - u8 channel_mapping[8]; - -} __packed; -#define ASM_DATA_CMD_IEC_60958_FRAME_RATE 0x00010D87 - - -/* Payload of the #ASM_DATA_CMD_IEC_60958_FRAME_RATE command, - * which is used to indicate the IEC 60958 frame rate of a given - * packetized audio stream. - */ - -struct asm_data_cmd_iec_60958_frame_rate { - u32 frame_rate; -/* IEC 60958 frame rate of the incoming IEC 61937 packetized stream. - * Supported values: Any valid frame rate - */ -} __packed; - -/* adsp_asm_data_commands.h*/ -/* Definition of the stream ID bitmask.*/ -#define ASM_BIT_MASK_STREAM_ID (0x000000FFUL) - -/* Definition of the stream ID shift value.*/ -#define ASM_SHIFT_STREAM_ID 0 - -/* Definition of the session ID bitmask.*/ -#define ASM_BIT_MASK_SESSION_ID (0x0000FF00UL) - -/* Definition of the session ID shift value.*/ -#define ASM_SHIFT_SESSION_ID 8 - -/* Definition of the service ID bitmask.*/ -#define ASM_BIT_MASK_SERVICE_ID (0x00FF0000UL) - -/* Definition of the service ID shift value.*/ -#define ASM_SHIFT_SERVICE_ID 16 - -/* Definition of the domain ID bitmask.*/ -#define ASM_BIT_MASK_DOMAIN_ID (0xFF000000UL) - -/* Definition of the domain ID shift value.*/ -#define ASM_SHIFT_DOMAIN_ID 24 - -#define ASM_CMD_SHARED_MEM_MAP_REGIONS 0x00010D92 -#define ASM_CMDRSP_SHARED_MEM_MAP_REGIONS 0x00010D93 -#define ASM_CMD_SHARED_MEM_UNMAP_REGIONS 0x00010D94 - -/* adsp_asm_service_commands.h */ - -#define ASM_MAX_SESSION_ID (15) - -/* Maximum number of sessions.*/ -#define ASM_MAX_NUM_SESSIONS ASM_MAX_SESSION_ID - -/* Maximum number of streams per session.*/ -#define ASM_MAX_STREAMS_PER_SESSION (8) -#define ASM_SESSION_CMD_RUN_V2 0x00010DAA -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_IMMEDIATE 0 -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_ABSOLUTEIME 1 -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_RELATIVEIME 2 -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_WITH_DELAY 3 - -#define ASM_BIT_MASK_RUN_STARTIME (0x00000003UL) - -/* Bit shift value used to specify the start time for the - * ASM_SESSION_CMD_RUN_V2 command. - */ -#define ASM_SHIFT_RUN_STARTIME 0 -struct asm_session_cmd_run_v2 { - struct apr_hdr hdr; - u32 flags; -/* Specifies whether to run immediately or at a specific - * rendering time or with a specified delay. Run with delay is - * useful for delaying in case of ASM loopback opened through - * ASM_STREAM_CMD_OPEN_LOOPBACK_V2. Use #ASM_BIT_MASK_RUN_STARTIME - * and #ASM_SHIFT_RUN_STARTIME to set this 2-bit flag. - * - * - *Bits 0 and 1 can take one of four possible values: - * - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_IMMEDIATE - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_ABSOLUTEIME - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_RELATIVEIME - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_WITH_DELAY - * - *All other bits are reserved; clients must set them to zero. - */ - - u32 time_lsw; -/* Lower 32 bits of the time in microseconds used to align the - * session origin time. When bits 0-1 of flags is - * ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, time lsw is the lsw of - * the delay in us. For ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, - * maximum value of the 64 bit delay is 150 ms. - */ - - u32 time_msw; -/* Upper 32 bits of the time in microseconds used to align the - * session origin time. When bits 0-1 of flags is - * ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, time msw is the msw of - * the delay in us. For ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, - * maximum value of the 64 bit delay is 150 ms. - */ - -} __packed; - -#define ASM_SESSION_CMD_PAUSE 0x00010BD3 -#define ASM_SESSION_CMD_SUSPEND 0x00010DEC -#define ASM_SESSION_CMD_GET_SESSIONTIME_V3 0x00010D9D -#define ASM_SESSION_CMD_REGISTER_FOR_RX_UNDERFLOW_EVENTS 0x00010BD5 - -struct asm_session_cmd_rgstr_rx_underflow { - struct apr_hdr hdr; - u16 enable_flag; -/* Specifies whether a client is to receive events when an Rx - * session underflows. - * Supported values: - * - 0 -- Do not send underflow events - * - 1 -- Send underflow events - */ - u16 reserved; - /* Reserved. This field must be set to zero.*/ -} __packed; - -#define ASM_SESSION_CMD_REGISTER_FORX_OVERFLOW_EVENTS 0x00010BD6 - -struct asm_session_cmd_regx_overflow { - struct apr_hdr hdr; - u16 enable_flag; -/* Specifies whether a client is to receive events when a Tx - * session overflows. - * Supported values: - * - 0 -- Do not send overflow events - * - 1 -- Send overflow events - */ - - u16 reserved; - /* Reserved. This field must be set to zero.*/ -} __packed; - -#define ASM_SESSION_EVENT_RX_UNDERFLOW 0x00010C17 -#define ASM_SESSION_EVENTX_OVERFLOW 0x00010C18 -#define ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3 0x00010D9E - -struct asm_session_cmdrsp_get_sessiontime_v3 { - u32 status; - /* Status message (error code). - * Supported values: Refer to @xhyperref{Q3,[Q3]} - */ - - u32 sessiontime_lsw; - /* Lower 32 bits of the current session time in microseconds.*/ - - u32 sessiontime_msw; - /* Upper 32 bits of the current session time in microseconds.*/ - - u32 absolutetime_lsw; -/* Lower 32 bits in micro seconds of the absolute time at which - * the * sample corresponding to the above session time gets - * rendered * to hardware. This absolute time may be slightly in the - * future or past. - */ - - - u32 absolutetime_msw; -/* Upper 32 bits in micro seconds of the absolute time at which - * the * sample corresponding to the above session time gets - * rendered to * hardware. This absolute time may be slightly in the - * future or past. - */ - -} __packed; - -#define ASM_SESSION_CMD_ADJUST_SESSION_CLOCK_V2 0x00010D9F - -struct asm_session_cmd_adjust_session_clock_v2 { - struct apr_hdr hdr; -u32 adjustime_lsw; -/* Lower 32 bits of the signed 64-bit quantity that specifies the - * adjustment time in microseconds to the session clock. - * - * Positive values indicate advancement of the session clock. - * Negative values indicate delay of the session clock. - */ - - - u32 adjustime_msw; -/* Upper 32 bits of the signed 64-bit quantity that specifies - * the adjustment time in microseconds to the session clock. - * Positive values indicate advancement of the session clock. - * Negative values indicate delay of the session clock. - */ - -} __packed; - -#define ASM_SESSION_CMDRSP_ADJUST_SESSION_CLOCK_V2 0x00010DA0 - -struct asm_session_cmdrsp_adjust_session_clock_v2 { - u32 status; -/* Status message (error code). - * Supported values: Refer to @xhyperref{Q3,[Q3]} - * An error means the session clock is not adjusted. In this case, - * the next two fields are irrelevant. - */ - - - u32 actual_adjustime_lsw; -/* Lower 32 bits of the signed 64-bit quantity that specifies - * the actual adjustment in microseconds performed by the aDSP. - * A positive value indicates advancement of the session clock. A - * negative value indicates delay of the session clock. - */ - - - u32 actual_adjustime_msw; -/* Upper 32 bits of the signed 64-bit quantity that specifies - * the actual adjustment in microseconds performed by the aDSP. - * A positive value indicates advancement of the session clock. A - * negative value indicates delay of the session clock. - */ - - - u32 cmd_latency_lsw; -/* Lower 32 bits of the unsigned 64-bit quantity that specifies - * the amount of time in microseconds taken to perform the session - * clock adjustment. - */ - - - u32 cmd_latency_msw; -/* Upper 32 bits of the unsigned 64-bit quantity that specifies - * the amount of time in microseconds taken to perform the session - * clock adjustment. - */ - -} __packed; - -#define ASM_SESSION_CMD_GET_PATH_DELAY_V2 0x00010DAF -#define ASM_SESSION_CMDRSP_GET_PATH_DELAY_V2 0x00010DB0 - -struct asm_session_cmdrsp_get_path_delay_v2 { - u32 status; -/* Status message (error code). Whether this get delay operation - * is successful or not. Delay value is valid only if status is - * success. - * Supported values: Refer to @xhyperref{Q5,[Q5]} - */ - - u32 audio_delay_lsw; - /* Upper 32 bits of the aDSP delay in microseconds. */ - - u32 audio_delay_msw; - /* Lower 32 bits of the aDSP delay in microseconds. */ - -} __packed; - -/* adsp_asm_session_command.h*/ -#define ASM_STREAM_CMD_OPEN_WRITE_V3 0x00010DB3 - -#define ASM_LOW_LATENCY_STREAM_SESSION 0x10000000 - -#define ASM_ULTRA_LOW_LATENCY_STREAM_SESSION 0x20000000 - -#define ASM_ULL_POST_PROCESSING_STREAM_SESSION 0x40000000 - -#define ASM_LEGACY_STREAM_SESSION 0 - - -struct asm_stream_cmd_open_write_v3 { - struct apr_hdr hdr; - uint32_t mode_flags; -/* Mode flags that configure the stream to notify the client - * whenever it detects an SR/CM change at the input to its POPP. - * Supported values for bits 0 to 1: - * - Reserved; clients must set them to zero. - * Supported values for bit 2: - * - 0 -- SR/CM change notification event is disabled. - * - 1 -- SR/CM change notification event is enabled. - * - Use #ASM_BIT_MASK_SR_CM_CHANGE_NOTIFY_FLAG and - * #ASM_SHIFT_SR_CM_CHANGE_NOTIFY_FLAG to set or get this bit. - * - * Supported values for bit 31: - * - 0 -- Stream to be opened in on-Gapless mode. - * - 1 -- Stream to be opened in Gapless mode. In Gapless mode, - * successive streams must be opened with same session ID but - * different stream IDs. - * - * - Use #ASM_BIT_MASK_GAPLESS_MODE_FLAG and - * #ASM_SHIFT_GAPLESS_MODE_FLAG to set or get this bit. - * - * - * @note1hang MIDI and DTMF streams cannot be opened in Gapless mode. - */ - - uint16_t sink_endpointype; -/*< Sink point type. - * Supported values: - * - 0 -- Device matrix - * - Other values are reserved. - * - * The device matrix is the gateway to the hardware ports. - */ - - uint16_t bits_per_sample; -/*< Number of bits per sample processed by ASM modules. - * Supported values: 16 and 24 bits per sample - */ - - uint32_t postprocopo_id; -/*< Specifies the topology (order of processing) of - * postprocessing algorithms. None means no postprocessing. - * Supported values: - * - #ASM_STREAM_POSTPROCOPO_ID_DEFAULT - * - #ASM_STREAM_POSTPROCOPO_ID_MCH_PEAK_VOL - * - #ASM_STREAM_POSTPROCOPO_ID_NONE - * - * This field can also be enabled through SetParams flags. - */ - - uint32_t dec_fmt_id; -/*< Configuration ID of the decoder media format. - * - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_ADPCM - * - #ASM_MEDIA_FMT_MP3 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_DOLBY_AAC - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_AMR_WB_PLUS_V2 - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_WMA_V10PRO_V2 - * - #ASM_MEDIA_FMT_WMA_V9_V2 - * - #ASM_MEDIA_FMT_AC3 - * - #ASM_MEDIA_FMT_EAC3 - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_FR_FS - * - #ASM_MEDIA_FMT_VORBIS - * - #ASM_MEDIA_FMT_FLAC - * - #ASM_MEDIA_FMT_ALAC - * - #ASM_MEDIA_FMT_APE - * - #ASM_MEDIA_FMT_EXAMPLE - */ -} __packed; - -#define ASM_STREAM_CMD_OPEN_PULL_MODE_WRITE 0x00010DD9 - -/* Bitmask for the stream_perf_mode subfield. */ -#define ASM_BIT_MASK_STREAM_PERF_FLAG_PULL_MODE_WRITE 0xE0000000UL - -/* Bitmask for the stream_perf_mode subfield. */ -#define ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE 29 - -#define ASM_STREAM_CMD_OPEN_PUSH_MODE_READ 0x00010DDA - -#define ASM_BIT_MASK_STREAM_PERF_FLAG_PUSH_MODE_READ 0xE0000000UL - -#define ASM_SHIFT_STREAM_PERF_FLAG_PUSH_MODE_READ 29 - -#define ASM_DATA_EVENT_WATERMARK 0x00010DDB - -struct asm_shared_position_buffer { - volatile uint32_t frame_counter; -/* Counter used to handle interprocessor synchronization issues. - * When frame_counter is 0: read_index, wall_clock_us_lsw, and - * wall_clock_us_msw are invalid. - * Supported values: >= 0. - */ - - volatile uint32_t index; -/* Index in bytes from where the aDSP is reading/writing. - * Supported values: 0 to circular buffer size - 1 - */ - - volatile uint32_t wall_clock_us_lsw; -/* Lower 32 bits of the 64-bit wall clock time in microseconds when the - * read index was updated. - * Supported values: >= 0 - */ - - volatile uint32_t wall_clock_us_msw; -/* Upper 32 bits of the 64 bit wall clock time in microseconds when the - * read index was updated - * Supported values: >= 0 - */ -} __packed; - -struct asm_shared_watermark_level { - uint32_t watermark_level_bytes; -} __packed; - -struct asm_stream_cmd_open_shared_io { - struct apr_hdr hdr; - uint32_t mode_flags; - uint16_t endpoint_type; - uint16_t topo_bits_per_sample; - uint32_t topo_id; - uint32_t fmt_id; - uint32_t shared_pos_buf_phy_addr_lsw; - uint32_t shared_pos_buf_phy_addr_msw; - uint16_t shared_pos_buf_mem_pool_id; - uint16_t shared_pos_buf_num_regions; - uint32_t shared_pos_buf_property_flag; - uint32_t shared_circ_buf_start_phy_addr_lsw; - uint32_t shared_circ_buf_start_phy_addr_msw; - uint32_t shared_circ_buf_size; - uint16_t shared_circ_buf_mem_pool_id; - uint16_t shared_circ_buf_num_regions; - uint32_t shared_circ_buf_property_flag; - uint32_t num_watermark_levels; - struct asm_multi_channel_pcm_fmt_blk_v3 fmt; - struct avs_shared_map_region_payload map_region_pos_buf; - struct avs_shared_map_region_payload map_region_circ_buf; - struct asm_shared_watermark_level watermark[0]; -} __packed; - -#define ASM_STREAM_CMD_OPEN_READ_V3 0x00010DB4 - -/* Definition of the timestamp type flag bitmask */ -#define ASM_BIT_MASKIMESTAMPYPE_FLAG (0x00000020UL) - -/* Definition of the timestamp type flag shift value. */ -#define ASM_SHIFTIMESTAMPYPE_FLAG 5 - -/* Relative timestamp is identified by this value.*/ -#define ASM_RELATIVEIMESTAMP 0 - -/* Absolute timestamp is identified by this value.*/ -#define ASM_ABSOLUTEIMESTAMP 1 - -/* Bit value for Low Latency Tx stream subfield */ -#define ASM_LOW_LATENCY_TX_STREAM_SESSION 1 - -/* Bit shift for the stream_perf_mode subfield. */ -#define ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ 29 - -struct asm_stream_cmd_open_read_v3 { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags that indicate whether meta information per encoded - * frame is to be provided. - * Supported values for bit 4: - * - * - 0 -- Return data buffer contains all encoded frames only; it - * does not contain frame metadata. - * - * - 1 -- Return data buffer contains an array of metadata and - * encoded frames. - * - * - Use #ASM_BIT_MASK_META_INFO_FLAG as the bitmask and - * #ASM_SHIFT_META_INFO_FLAG as the shift value for this bit. - * - * - * Supported values for bit 5: - * - * - ASM_RELATIVEIMESTAMP -- ASM_DATA_EVENT_READ_DONE_V2 will have - * - relative time-stamp. - * - ASM_ABSOLUTEIMESTAMP -- ASM_DATA_EVENT_READ_DONE_V2 will - * - have absolute time-stamp. - * - * - Use #ASM_BIT_MASKIMESTAMPYPE_FLAG as the bitmask and - * #ASM_SHIFTIMESTAMPYPE_FLAG as the shift value for this bit. - * - * All other bits are reserved; clients must set them to zero. - */ - - u32 src_endpointype; -/* Specifies the endpoint providing the input samples. - * Supported values: - * - 0 -- Device matrix - * - All other values are reserved; clients must set them to zero. - * Otherwise, an error is returned. - * The device matrix is the gateway from the tunneled Tx ports. - */ - - u32 preprocopo_id; -/* Specifies the topology (order of processing) of preprocessing - * algorithms. None means no preprocessing. - * Supported values: - * - #ASM_STREAM_PREPROCOPO_ID_DEFAULT - * - #ASM_STREAM_PREPROCOPO_ID_NONE - * - * This field can also be enabled through SetParams flags. - */ - - u32 enc_cfg_id; -/* Media configuration ID for encoded output. - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_EXAMPLE - * - #ASM_MEDIA_FMT_WMA_V8 - */ - - u16 bits_per_sample; -/* Number of bits per sample processed by ASM modules. - * Supported values: 16 and 24 bits per sample - */ - - u16 reserved; -/* Reserved for future use. This field must be set to zero.*/ -} __packed; - -#define ASM_POPP_OUTPUT_SR_NATIVE_RATE 0 - -/* Enumeration for the maximum sampling rate at the POPP output.*/ -#define ASM_POPP_OUTPUT_SR_MAX_RATE 48000 - -#define ASM_STREAM_CMD_OPEN_READWRITE_V2 0x00010D8D -#define ASM_STREAM_CMD_OPEN_READWRITE_V2 0x00010D8D - -struct asm_stream_cmd_open_readwrite_v2 { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags. - * Supported values for bit 2: - * - 0 -- SR/CM change notification event is disabled. - * - 1 -- SR/CM change notification event is enabled. Use - * #ASM_BIT_MASK_SR_CM_CHANGE_NOTIFY_FLAG and - * #ASM_SHIFT_SR_CM_CHANGE_NOTIFY_FLAG to set or - * getting this flag. - * - * Supported values for bit 4: - * - 0 -- Return read data buffer contains all encoded frames only; it - * does not contain frame metadata. - * - 1 -- Return read data buffer contains an array of metadata and - * encoded frames. - * - * All other bits are reserved; clients must set them to zero. - */ - - u32 postprocopo_id; -/* Specifies the topology (order of processing) of postprocessing - * algorithms. None means no postprocessing. - * - * Supported values: - * - #ASM_STREAM_POSTPROCOPO_ID_DEFAULT - * - #ASM_STREAM_POSTPROCOPO_ID_MCH_PEAK_VOL - * - #ASM_STREAM_POSTPROCOPO_ID_NONE - */ - - u32 dec_fmt_id; -/* Specifies the media type of the input data. PCM indicates that - * no decoding must be performed, e.g., this is an NT encoder - * session. - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_ADPCM - * - #ASM_MEDIA_FMT_MP3 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_DOLBY_AAC - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_WMA_V10PRO_V2 - * - #ASM_MEDIA_FMT_WMA_V9_V2 - * - #ASM_MEDIA_FMT_AMR_WB_PLUS_V2 - * - #ASM_MEDIA_FMT_AC3 - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_EXAMPLE - */ - - u32 enc_cfg_id; -/* Specifies the media type for the output of the stream. PCM - * indicates that no encoding must be performed, e.g., this is an NT - * decoder session. - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_EXAMPLE - * - #ASM_MEDIA_FMT_WMA_V8 - */ - - u16 bits_per_sample; -/* Number of bits per sample processed by ASM modules. - * Supported values: 16 and 24 bits per sample - */ - - u16 reserved; -/* Reserved for future use. This field must be set to zero.*/ - -} __packed; - -#define ASM_STREAM_CMD_OPEN_LOOPBACK_V2 0x00010D8E -struct asm_stream_cmd_open_loopback_v2 { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags. - * Bit 0-31: reserved; client should set these bits to 0 - */ - u16 src_endpointype; - /* Endpoint type. 0 = Tx Matrix */ - u16 sink_endpointype; - /* Endpoint type. 0 = Rx Matrix */ - u32 postprocopo_id; -/* Postprocessor topology ID. Specifies the topology of - * postprocessing algorithms. - */ - - u16 bits_per_sample; -/* The number of bits per sample processed by ASM modules - * Supported values: 16 and 24 bits per sample - */ - u16 reserved; -/* Reserved for future use. This field must be set to zero. */ -} __packed; - - -#define ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK 0x00010DBA - -/* Bitmask for the stream's Performance mode. */ -#define ASM_BIT_MASK_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK \ - (0x70000000UL) - -/* Bit shift for the stream's Performance mode. */ -#define ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK 28 - -/* Bitmask for the decoder converter enable flag. */ -#define ASM_BIT_MASK_DECODER_CONVERTER_FLAG (0x00000078UL) - -/* Shift value for the decoder converter enable flag. */ -#define ASM_SHIFT_DECODER_CONVERTER_FLAG 3 - -/* Converter mode is None (Default). */ -#define ASM_CONVERTER_MODE_NONE 0 - -/* Converter mode is DDP-to-DD. */ -#define ASM_DDP_DD_CONVERTER_MODE 1 - -/* Identifies a special converter mode where source and sink formats - * are the same but postprocessing must applied. Therefore, Decode - * @rarrow Re-encode is necessary. - */ -#define ASM_POST_PROCESS_CONVERTER_MODE 2 - - -struct asm_stream_cmd_open_transcode_loopback_t { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode Flags specifies the performance mode in which this stream - * is to be opened. - * Supported values{for bits 30 to 28}(stream_perf_mode flag) - * - * #ASM_LEGACY_STREAM_SESSION -- This mode ensures backward - * compatibility to the original behavior - * of ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK - * - * #ASM_LOW_LATENCY_STREAM_SESSION -- Opens a loopback session by using - * shortened buffers in low latency POPP - * - Recommendation: Do not enable high latency algorithms. They might - * negate the benefits of opening a low latency stream, and they - * might also suffer quality degradation from unexpected jitter. - * - This Low Latency mode is supported only for PCM In and PCM Out - * loopbacks. An error is returned if Low Latency mode is opened for - * other transcode loopback modes. - * - To configure this subfield, use - * ASM_BIT_MASK_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK and - * ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK. - * - * Supported values{for bits 6 to 3} (decoder-converter compatibility) - * #ASM_CONVERTER_MODE_NONE (0x0) -- Default - * #ASM_DDP_DD_CONVERTER_MODE (0x1) - * #ASM_POST_PROCESS_CONVERTER_MODE (0x2) - * 0x3-0xF -- Reserved for future use - * - Use #ASM_BIT_MASK_DECODER_CONVERTER_FLAG and - * ASM_SHIFT_DECODER_CONVERTER_FLAG to set this bit - * All other bits are reserved; clients must set them to 0. - */ - - u32 src_format_id; -/* Specifies the media format of the input audio stream. - * - * Supported values - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 - * - #ASM_MEDIA_FMT_DTS - * - #ASM_MEDIA_FMT_EAC3_DEC - * - #ASM_MEDIA_FMT_EAC3 - * - #ASM_MEDIA_FMT_AC3_DEC - * - #ASM_MEDIA_FMT_AC3 - */ - u32 sink_format_id; -/* Specifies the media format of the output stream. - * - * Supported values - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 - * - #ASM_MEDIA_FMT_DTS (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_EAC3_DEC (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_EAC3 (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_AC3_DEC (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_AC3 (not supported in Low Latency mode) - */ - - u32 audproc_topo_id; -/* Postprocessing topology ID, which specifies the topology (order of - * processing) of postprocessing algorithms. - * - * Supported values - * - #ASM_STREAM_POSTPROC_TOPO_ID_DEFAULT - * - #ASM_STREAM_POSTPROC_TOPO_ID_PEAKMETER - * - #ASM_STREAM_POSTPROC_TOPO_ID_MCH_PEAK_VOL - * - #ASM_STREAM_POSTPROC_TOPO_ID_NONE - * Topologies can be added through #ASM_CMD_ADD_TOPOLOGIES. - * This field is ignored for the Converter mode, in which no - * postprocessing is performed. - */ - - u16 src_endpoint_type; -/* Specifies the source endpoint that provides the input samples. - * - * Supported values - * - 0 -- Tx device matrix or stream router (gateway to the hardware - * ports) - * - All other values are reserved - * Clients must set this field to 0. Otherwise, an error is returned. - */ - - u16 sink_endpoint_type; -/* Specifies the sink endpoint type. - * - * Supported values - * - 0 -- Rx device matrix or stream router (gateway to the hardware - * ports) - * - All other values are reserved - * Clients must set this field to 0. Otherwise, an error is returned. - */ - - u16 bits_per_sample; -/* Number of bits per sample processed by the ASM modules. - * Supported values 16, 24 - */ - - u16 reserved; -/* This field must be set to 0. - */ -} __packed; - - -#define ASM_STREAM_CMD_CLOSE 0x00010BCD -#define ASM_STREAM_CMD_FLUSH 0x00010BCE - - -#define ASM_STREAM_CMD_FLUSH_READBUFS 0x00010C09 -#define ASM_STREAM_CMD_SET_PP_PARAMS_V2 0x00010DA1 -#define ASM_STREAM_CMD_SET_PP_PARAMS_V3 0x0001320D - -/* - * Structure for the ASM Stream Set PP Params command. Parameter data must be - * pre-packed with the correct header for either V2 or V3 when sent in-band. - * Use q6core_pack_pp_params to pack the header and data correctly depending on - * Instance ID support. - */ -struct asm_stream_cmd_set_pp_params { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending out of band */ - struct mem_mapping_hdr mem_hdr; - - /* The total size of the payload, including the parameter header */ - u32 payload_size; - - /* The parameter data to be filled when sent inband. Parameter data - * must be pre-packed with parameter header and then copied here. Use - * q6core_pack_pp_params to pack the header and param data correctly. - */ - u32 param_data[0]; -} __packed; - -#define ASM_STREAM_CMD_GET_PP_PARAMS_V2 0x00010DA2 -#define ASM_STREAM_CMD_GET_PP_PARAMS_V3 0x0001320E - -struct asm_stream_cmd_get_pp_params_v2 { - u32 data_payload_addr_lsw; - /* LSW of the parameter data payload address. */ - u32 data_payload_addr_msw; -/* MSW of the parameter data payload address. - * - Size of the shared memory, if specified, shall be large enough - * to contain the whole ParamData payload, including Module ID, - * Param ID, Param Size, and Param Values - * - Must be set to zero for in-band data - * - In the case of 32 bit Shared memory address, msw field must be - * set to zero. - * - In the case of 36 bit shared memory address, bit 31 to bit 4 of - * msw must be set to zero. - */ - - u32 mem_map_handle; -/* Supported Values: Any. - * memory map handle returned by DSP through ASM_CMD_SHARED_MEM_MAP_REGIONS - * command. - * if mmhandle is NULL, the ParamData payloads in the ACK are within the - * message payload (in-band). - * If mmhandle is non-NULL, the ParamData payloads in the ACK begin at the - * address specified in the address msw and lsw. - * (out-of-band). - */ - - u32 module_id; -/* Unique module ID. */ - - u32 param_id; -/* Unique parameter ID. */ - - u16 param_max_size; -/* Maximum data size of the module_id/param_id combination. This - * is a multiple of 4 bytes. - */ - - - u16 reserved; -/* Reserved for backward compatibility. Clients must set this - * field to zero. - */ -} __packed; - -#define ASM_STREAM_CMD_SET_ENCDEC_PARAM 0x00010C10 - -#define ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2 0x00013218 - -struct asm_stream_cmd_set_encdec_param_v2 { - u16 service_id; - /* 0 - ASM_ENCODER_SVC; 1 - ASM_DECODER_SVC */ - - u16 reserved; - - u32 param_id; - /* ID of the parameter. */ - - u32 param_size; - /* - * Data size of this parameter, in bytes. The size is a multiple - * of 4 bytes. - */ -} __packed; - -#define ASM_STREAM_CMD_REGISTER_ENCDEC_EVENTS 0x00013219 - -#define ASM_STREAM_CMD_ENCDEC_EVENTS 0x0001321A - -#define AVS_PARAM_ID_RTIC_SHARED_MEMORY_ADDR 0x00013237 - -struct avs_rtic_shared_mem_addr { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param_v2 encdec; - u32 shm_buf_addr_lsw; - /* Lower 32 bit of the RTIC shared memory */ - - u32 shm_buf_addr_msw; - /* Upper 32 bit of the RTIC shared memory */ - - u32 buf_size; - /* Size of buffer */ - - u16 shm_buf_mem_pool_id; - /* ADSP_MEMORY_MAP_SHMEM8_4K_POOL */ - - u16 shm_buf_num_regions; - /* number of regions to map */ - - u32 shm_buf_flag; - /* buffer property flag */ - - struct avs_shared_map_region_payload map_region; - /* memory map region*/ -} __packed; - -#define AVS_PARAM_ID_RTIC_EVENT_ACK 0x00013238 - -struct avs_param_rtic_event_ack { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param_v2 encdec; -} __packed; - -#define ASM_PARAM_ID_ENCDEC_BITRATE 0x00010C13 - -struct asm_bitrate_param { - u32 bitrate; -/* Maximum supported bitrate. Only the AAC encoder is supported.*/ - -} __packed; - -#define ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2 0x00010DA3 -#define ASM_PARAM_ID_AAC_SBR_PS_FLAG 0x00010C63 - -/* Flag to turn off both SBR and PS processing, if they are - * present in the bitstream. - */ - -#define ASM_AAC_SBR_OFF_PS_OFF (2) - -/* Flag to turn on SBR but turn off PS processing,if they are - * present in the bitstream. - */ - -#define ASM_AAC_SBR_ON_PS_OFF (1) - -/* Flag to turn on both SBR and PS processing, if they are - * present in the bitstream (default behavior). - */ - - -#define ASM_AAC_SBR_ON_PS_ON (0) - -/* Structure for an AAC SBR PS processing flag. */ - -/* Payload of the #ASM_PARAM_ID_AAC_SBR_PS_FLAG parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -struct asm_aac_sbr_ps_flag_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u32 sbr_ps_flag; -/* Control parameter to enable or disable SBR/PS processing in - * the AAC bitstream. Use the following macros to set this field: - * - #ASM_AAC_SBR_OFF_PS_OFF -- Turn off both SBR and PS - * processing, if they are present in the bitstream. - * - #ASM_AAC_SBR_ON_PS_OFF -- Turn on SBR processing, but not PS - * processing, if they are present in the bitstream. - * - #ASM_AAC_SBR_ON_PS_ON -- Turn on both SBR and PS processing, - * if they are present in the bitstream (default behavior). - * - All other values are invalid. - * Changes are applied to the next decoded frame. - */ -} __packed; - -#define ASM_PARAM_ID_AAC_DUAL_MONO_MAPPING 0x00010C64 - -/* First single channel element in a dual mono bitstream.*/ -#define ASM_AAC_DUAL_MONO_MAP_SCE_1 (1) - -/* Second single channel element in a dual mono bitstream.*/ -#define ASM_AAC_DUAL_MONO_MAP_SCE_2 (2) - -/* Structure for AAC decoder dual mono channel mapping. */ - - -struct asm_aac_dual_mono_mapping_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - u16 left_channel_sce; - u16 right_channel_sce; - -} __packed; - -#define ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2 0x00010DA4 -#define ASM_STREAM_CMDRSP_GET_PP_PARAMS_V3 0x0001320F - -struct asm_stream_cmdrsp_get_pp_params_v2 { - u32 status; -} __packed; - -#define ASM_PARAM_ID_AC3_KARAOKE_MODE 0x00010D73 - -/* Enumeration for both vocals in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_NO_VOCAL (0) - -/* Enumeration for only the left vocal in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_LEFT_VOCAL (1) - -/* Enumeration for only the right vocal in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_RIGHT_VOCAL (2) - -/* Enumeration for both vocal channels in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_BOTH_VOCAL (3) -#define ASM_PARAM_ID_AC3_DRC_MODE 0x00010D74 -/* Enumeration for the Custom Analog mode.*/ -#define AC3_DRC_MODE_CUSTOM_ANALOG (0) - -/* Enumeration for the Custom Digital mode.*/ -#define AC3_DRC_MODE_CUSTOM_DIGITAL (1) -/* Enumeration for the Line Out mode (light compression).*/ -#define AC3_DRC_MODE_LINE_OUT (2) - -/* Enumeration for the RF remodulation mode (heavy compression).*/ -#define AC3_DRC_MODE_RF_REMOD (3) -#define ASM_PARAM_ID_AC3_DUAL_MONO_MODE 0x00010D75 - -/* Enumeration for playing dual mono in stereo mode.*/ -#define AC3_DUAL_MONO_MODE_STEREO (0) - -/* Enumeration for playing left mono.*/ -#define AC3_DUAL_MONO_MODE_LEFT_MONO (1) - -/* Enumeration for playing right mono.*/ -#define AC3_DUAL_MONO_MODE_RIGHT_MONO (2) - -/* Enumeration for mixing both dual mono channels and playing them.*/ -#define AC3_DUAL_MONO_MODE_MIXED_MONO (3) -#define ASM_PARAM_ID_AC3_STEREO_DOWNMIX_MODE 0x00010D76 - -/* Enumeration for using the Downmix mode indicated in the bitstream. */ - -#define AC3_STEREO_DOWNMIX_MODE_AUTO_DETECT (0) - -/* Enumeration for Surround Compatible mode (preserves the - * surround information). - */ - -#define AC3_STEREO_DOWNMIX_MODE_LT_RT (1) -/* Enumeration for Mono Compatible mode (if the output is to be - * further downmixed to mono). - */ - -#define AC3_STEREO_DOWNMIX_MODE_LO_RO (2) - -/* ID of the AC3 PCM scale factor parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -#define ASM_PARAM_ID_AC3_PCM_SCALEFACTOR 0x00010D78 - -/* ID of the AC3 DRC boost scale factor parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -#define ASM_PARAM_ID_AC3_DRC_BOOST_SCALEFACTOR 0x00010D79 - -/* ID of the AC3 DRC cut scale factor parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -#define ASM_PARAM_ID_AC3_DRC_CUT_SCALEFACTOR 0x00010D7A - -/* Structure for AC3 Generic Parameter. */ - -/* Payload of the AC3 parameters in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -struct asm_ac3_generic_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u32 generic_parameter; -/* AC3 generic parameter. Select from one of the following - * possible values. - * - * For #ASM_PARAM_ID_AC3_KARAOKE_MODE, supported values are: - * - AC3_KARAOKE_MODE_NO_VOCAL - * - AC3_KARAOKE_MODE_LEFT_VOCAL - * - AC3_KARAOKE_MODE_RIGHT_VOCAL - * - AC3_KARAOKE_MODE_BOTH_VOCAL - * - * For #ASM_PARAM_ID_AC3_DRC_MODE, supported values are: - * - AC3_DRC_MODE_CUSTOM_ANALOG - * - AC3_DRC_MODE_CUSTOM_DIGITAL - * - AC3_DRC_MODE_LINE_OUT - * - AC3_DRC_MODE_RF_REMOD - * - * For #ASM_PARAM_ID_AC3_DUAL_MONO_MODE, supported values are: - * - AC3_DUAL_MONO_MODE_STEREO - * - AC3_DUAL_MONO_MODE_LEFT_MONO - * - AC3_DUAL_MONO_MODE_RIGHT_MONO - * - AC3_DUAL_MONO_MODE_MIXED_MONO - * - * For #ASM_PARAM_ID_AC3_STEREO_DOWNMIX_MODE, supported values are: - * - AC3_STEREO_DOWNMIX_MODE_AUTO_DETECT - * - AC3_STEREO_DOWNMIX_MODE_LT_RT - * - AC3_STEREO_DOWNMIX_MODE_LO_RO - * - * For #ASM_PARAM_ID_AC3_PCM_SCALEFACTOR, supported values are - * 0 to 1 in Q31 format. - * - * For #ASM_PARAM_ID_AC3_DRC_BOOST_SCALEFACTOR, supported values are - * 0 to 1 in Q31 format. - * - * For #ASM_PARAM_ID_AC3_DRC_CUT_SCALEFACTOR, supported values are - * 0 to 1 in Q31 format. - */ -} __packed; - -/* Enumeration for Raw mode (no downmixing), which specifies - * that all channels in the bitstream are to be played out as is - * without any downmixing. (Default) - */ - -#define WMAPRO_CHANNEL_MASK_RAW (-1) - -/* Enumeration for setting the channel mask to 0. The 7.1 mode - * (Home Theater) is assigned. - */ - - -#define WMAPRO_CHANNEL_MASK_ZERO 0x0000 - -/* Speaker layout mask for one channel (Home Theater, mono). - * - Speaker front center - */ -#define WMAPRO_CHANNEL_MASK_1_C 0x0004 - -/* Speaker layout mask for two channels (Home Theater, stereo). - * - Speaker front left - * - Speaker front right - */ -#define WMAPRO_CHANNEL_MASK_2_L_R 0x0003 - -/* Speaker layout mask for three channels (Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - */ -#define WMAPRO_CHANNEL_MASK_3_L_C_R 0x0007 - -/* Speaker layout mask for two channels (stereo). - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_2_Bl_Br 0x0030 - -/* Speaker layout mask for four channels. - * - Speaker front left - * - Speaker front right - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_4_L_R_Bl_Br 0x0033 - -/* Speaker layout mask for four channels (Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back center - */ -#define WMAPRO_CHANNEL_MASK_4_L_R_C_Bc_HT 0x0107 -/* Speaker layout mask for five channels. - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_5_L_C_R_Bl_Br 0x0037 - -/* Speaker layout mask for five channels (5 mode, Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_5_L_C_R_Sl_Sr_HT 0x0607 -/* Speaker layout mask for six channels (5.1 mode). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Bl_Br_SLF 0x003F -/* Speaker layout mask for six channels (5.1 mode, Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Sl_Sr_SLF_HT 0x060F -/* Speaker layout mask for six channels (5.1 mode, no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - * - Speaker back center - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Bl_Br_Bc 0x0137 -/* Speaker layout mask for six channels (5.1 mode, Home Theater, - * no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back center - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Sl_Sr_Bc_HT 0x0707 - -/* Speaker layout mask for seven channels (6.1 mode). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker back left - * - Speaker back right - * - Speaker back center - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Bl_Br_Bc_SLF 0x013F - -/* Speaker layout mask for seven channels (6.1 mode, Home - * Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker back center - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Sl_Sr_Bc_SLF_HT 0x070F - -/* Speaker layout mask for seven channels (6.1 mode, no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - * - Speaker front left of center - * - Speaker front right of center - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Bl_Br_SFLOC_SFROC 0x00F7 - -/* Speaker layout mask for seven channels (6.1 mode, Home - * Theater, no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker side left - * - Speaker side right - * - Speaker front left of center - * - Speaker front right of center - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Sl_Sr_SFLOC_SFROC_HT 0x0637 - -/* Speaker layout mask for eight channels (7.1 mode). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - * - Speaker low frequency - * - Speaker front left of center - * - Speaker front right of center - */ -#define WMAPRO_CHANNEL_MASK_7DOT1_L_C_R_Bl_Br_SLF_SFLOC_SFROC \ - 0x00FF - -/* Speaker layout mask for eight channels (7.1 mode, Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker side left - * - Speaker side right - * - Speaker low frequency - * - Speaker front left of center - * - Speaker front right of center - * - */ -#define WMAPRO_CHANNEL_MASK_7DOT1_L_C_R_Sl_Sr_SLF_SFLOC_SFROC_HT \ - 0x063F - -#define ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP 0x00010D82 - -/* Maximum number of decoder output channels. */ -#define MAX_CHAN_MAP_CHANNELS 16 - -/* Structure for decoder output channel mapping. */ - -/* Payload of the #ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -struct asm_dec_out_chan_map_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - u32 num_channels; -/* Number of decoder output channels. - * Supported values: 0 to #MAX_CHAN_MAP_CHANNELS - * - * A value of 0 indicates native channel mapping, which is valid - * only for NT mode. This means the output of the decoder is to be - * preserved as is. - */ - u8 channel_mapping[MAX_CHAN_MAP_CHANNELS]; -} __packed; - -#define ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED 0x00010D84 - -/* Bitmask for the IEC 61937 enable flag.*/ -#define ASM_BIT_MASK_IEC_61937_STREAM_FLAG (0x00000001UL) - -/* Shift value for the IEC 61937 enable flag.*/ -#define ASM_SHIFT_IEC_61937_STREAM_FLAG 0 - -/* Bitmask for the IEC 60958 enable flag.*/ -#define ASM_BIT_MASK_IEC_60958_STREAM_FLAG (0x00000002UL) - -/* Shift value for the IEC 60958 enable flag.*/ -#define ASM_SHIFT_IEC_60958_STREAM_FLAG 1 - -/* Payload format for open write compressed command */ - -/* Payload format for the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED - * command, which opens a stream for a given session ID and stream ID - * to be rendered in the compressed format. - */ - -struct asm_stream_cmd_open_write_compressed { - struct apr_hdr hdr; - u32 flags; -/* Mode flags that configure the stream for a specific format. - * Supported values: - * - Bit 0 -- IEC 61937 compatibility - * - 0 -- Stream is not in IEC 61937 format - * - 1 -- Stream is in IEC 61937 format - * - Bit 1 -- IEC 60958 compatibility - * - 0 -- Stream is not in IEC 60958 format - * - 1 -- Stream is in IEC 60958 format - * - Bits 2 to 31 -- 0 (Reserved) - * - * For the same stream, bit 0 cannot be set to 0 and bit 1 cannot - * be set to 1. A compressed stream connot have IEC 60958 - * packetization applied without IEC 61937 packetization. - * @note1hang Currently, IEC 60958 packetized input streams are not - * supported. - */ - - - u32 fmt_id; -/* Specifies the media type of the HDMI stream to be opened. - * Supported values: - * - #ASM_MEDIA_FMT_AC3 - * - #ASM_MEDIA_FMT_EAC3 - * - #ASM_MEDIA_FMT_DTS - * - #ASM_MEDIA_FMT_ATRAC - * - #ASM_MEDIA_FMT_MAT - * - * @note1hang This field must be set to a valid media type even if - * IEC 61937 packetization is not performed by the aDSP. - */ - -} __packed; - - -/* Indicates the number of samples per channel to be removed from the - * beginning of the stream. - */ -#define ASM_DATA_CMD_REMOVE_INITIAL_SILENCE 0x00010D67 - -/* Indicates the number of samples per channel to be removed from - * the end of the stream. - */ -#define ASM_DATA_CMD_REMOVE_TRAILING_SILENCE 0x00010D68 - -struct asm_data_cmd_remove_silence { - struct apr_hdr hdr; - u32 num_samples_to_remove; - /* < Number of samples per channel to be removed. - * @values 0 to (2@sscr{32}-1) - */ -} __packed; - -#define ASM_STREAM_CMD_OPEN_READ_COMPRESSED 0x00010D95 - -/* Bitmask for the IEC 61937 to 61937 pass-through capture. */ -#define ASM_BIT_MASK_IEC_61937_PASS_THROUGH_FLAG (0x00000001UL) - -/* Shift value for the IEC 61937 to 61937 pass-through capture. */ -#define ASM_SHIFT_IEC_61937_PASS_THROUGH_FLAG 0 - -struct asm_stream_cmd_open_read_compressed { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags that indicate whether meta information per encoded - * frame is to be provided and packaging. - * Supported values for bit 0: (IEC 61937 pass-through mode) - * - 0 -- Unpack the IEC 61937 format stream to RAW compressed format - * - 1 -- Pass-through transfer of the IEC 61937 format stream - * - Use #ASM_BIT_MASK_IEC_61937_PASS_THROUGH_FLAG to set the bitmask - * and #ASM_SHIFT_IEC_61937_PASS_THROUGH_FLAG to set the shift value - * for this bit. - * Supported values for bit 4: - * - 0 -- Return data buffer contains all encoded frames only; it does - * not contain frame metadata. - * - 1 -- Return data buffer contains an array of metadata and encoded - * frames. - * - Use #ASM_BIT_MASK_META_INFO_FLAG to set the bitmask and - * #ASM_SHIFT_META_INFO_FLAG to set the shift value for this bit. - * All other bits are reserved; clients must set them to zero. - */ - - u32 frames_per_buf; -/* Indicates the number of frames that need to be returned per - * read buffer - * Supported values: should be greater than 0 for IEC to RAW compressed - * unpack mode. - * Value is don't care for IEC 61937 pass-through mode. - */ - -} __packed; - -/* adsp_asm_stream_commands.h*/ - - -/* adsp_asm_api.h (no changes)*/ -#define ASM_STREAM_POSTPROCOPO_ID_DEFAULT \ - 0x00010BE4 -#define ASM_STREAM_POSTPROCOPO_ID_PEAKMETER \ - 0x00010D83 -#define ASM_STREAM_POSTPROCOPO_ID_NONE \ - 0x00010C68 -#define ASM_STREAM_POSTPROCOPO_ID_MCH_PEAK_VOL \ - 0x00010D8B -#define ASM_STREAM_PREPROCOPO_ID_DEFAULT \ - ASM_STREAM_POSTPROCOPO_ID_DEFAULT -#define ASM_STREAM_PREPROCOPO_ID_NONE \ - ASM_STREAM_POSTPROCOPO_ID_NONE -#define ADM_CMD_COPP_OPENOPOLOGY_ID_NONE_AUDIO_COPP \ - 0x00010312 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_MONO_AUDIO_COPP \ - 0x00010313 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_AUDIO_COPP \ - 0x00010314 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_IIR_AUDIO_COPP\ - 0x00010704 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_MONO_AUDIO_COPP_MBDRCV2\ - 0x0001070D -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_AUDIO_COPP_MBDRCV2\ - 0x0001070E -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_IIR_AUDIO_COPP_MBDRCV2\ - 0x0001070F -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_AUDIO_COPP_MBDRC_V3 \ - 0x11000000 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_MCH_PEAK_VOL \ - 0x0001031B -#define ADM_CMD_COPP_OPENOPOLOGY_ID_MIC_MONO_AUDIO_COPP 0x00010315 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_MIC_STEREO_AUDIO_COPP 0x00010316 -#define AUDPROC_COPPOPOLOGY_ID_MCHAN_IIR_AUDIO 0x00010715 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_DEFAULT_AUDIO_COPP 0x00010BE3 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_PEAKMETER_AUDIO_COPP 0x00010317 -#define AUDPROC_MODULE_ID_AIG 0x00010716 -#define AUDPROC_PARAM_ID_AIG_ENABLE 0x00010717 -#define AUDPROC_PARAM_ID_AIG_CONFIG 0x00010718 - -struct Audio_AigParam { - uint16_t mode; -/*< Mode word for enabling AIG/SIG mode . - * Byte offset: 0 - */ - int16_t staticGainL16Q12; -/*< Static input gain when aigMode is set to 1. - * Byte offset: 2 - */ - int16_t initialGainDBL16Q7; -/*= 0 for clock frequency to set @tablebulletend - */ - uint32_t clk_freq_in_hz; - - /* Use to specific divider for two clocks if needed. - * Set to Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO for no divider - * relation clocks - * @values - * - #Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO - * - #Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVIDEND - * - #Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVISOR @tablebulletend - */ - uint16_t clk_attri; - - /* - * Specifies the root clock source. - * Currently, only Q6AFE_LPASS_CLK_ROOT_DEFAULT is valid - * @values - * - 0 @tablebulletend - */ - uint16_t clk_root; - - /* - * for enable and disable clock. - * "clk_freq_in_hz", "clk_attri", and "clk_root" - * are ignored in disable clock case. - * @values  - * - 0 -- Disabled - * - 1 -- Enabled @tablebulletend - */ - uint32_t enable; -}; - -struct afe_clk_cfg { -/* Minor version used for tracking the version of the I2S - * configuration interface. - * Supported values: #AFE_API_VERSION_I2S_CONFIG - */ - u32 i2s_cfg_minor_version; - -/* clk value 1 in MHz. */ - u32 clk_val1; - -/* clk value 2 in MHz. */ - u32 clk_val2; - -/* clk_src - * #Q6AFE_LPASS_CLK_SRC_EXTERNAL - * #Q6AFE_LPASS_CLK_SRC_INTERNAL - */ - - u16 clk_src; - -/* clk_root -0 for default */ - u16 clk_root; - -/* clk_set_mode - * #Q6AFE_LPASS_MODE_BOTH_INVALID - * #Q6AFE_LPASS_MODE_CLK1_VALID - * #Q6AFE_LPASS_MODE_CLK2_VALID - * #Q6AFE_LPASS_MODE_BOTH_VALID - */ - u16 clk_set_mode; - -/* This param id is used to configure I2S clk */ - u16 reserved; -} __packed; - -/* This param id is used to configure I2S clk */ -#define AFE_PARAM_ID_LPAIF_CLK_CONFIG 0x00010238 -#define AFE_MODULE_CLOCK_SET 0x0001028F -#define AFE_PARAM_ID_CLOCK_SET 0x00010290 - -enum afe_lpass_digital_clk_src { - Q6AFE_LPASS_DIGITAL_ROOT_INVALID, - Q6AFE_LPASS_DIGITAL_ROOT_PRI_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_SEC_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_TER_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_QUAD_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_CDC_ROOT_CLK, -} __packed; - -/* This param id is used to configure internal clk */ -#define AFE_PARAM_ID_INTERNAL_DIGIATL_CDC_CLK_CONFIG 0x00010239 - -struct afe_digital_clk_cfg { -/* Minor version used for tracking the version of the I2S - * configuration interface. - * Supported values: #AFE_API_VERSION_I2S_CONFIG - */ - u32 i2s_cfg_minor_version; - -/* clk value in MHz. */ - u32 clk_val; - -/* INVALID - * PRI_MI2S_OSR - * SEC_MI2S_OSR - * TER_MI2S_OSR - * QUAD_MI2S_OSR - * DIGT_CDC_ROOT - */ - u16 clk_root; - -/* This field must be set to zero. */ - u16 reserved; -} __packed; - -/* - * Opcode for AFE to start DTMF. - */ -#define AFE_PORTS_CMD_DTMF_CTL 0x00010102 - -/** DTMF payload.*/ -struct afe_dtmf_generation_command { - struct apr_hdr hdr; - - /* - * Duration of the DTMF tone in ms. - * -1 -> continuous, - * 0 -> disable - */ - int64_t duration_in_ms; - - /* - * The DTMF high tone frequency. - */ - uint16_t high_freq; - - /* - * The DTMF low tone frequency. - */ - uint16_t low_freq; - - /* - * The DTMF volume setting - */ - uint16_t gain; - - /* - * The number of ports to enable/disable on. - */ - uint16_t num_ports; - - /* - * The Destination ports - array . - * For DTMF on multiple ports, portIds needs to - * be populated numPorts times. - */ - uint16_t port_ids; - - /* - * variable for 32 bit alignment of APR packet. - */ - uint16_t reserved; -} __packed; - -enum afe_config_type { - AFE_SLIMBUS_SLAVE_PORT_CONFIG, - AFE_SLIMBUS_SLAVE_CONFIG, - AFE_CDC_REGISTERS_CONFIG, - AFE_AANC_VERSION, - AFE_CDC_CLIP_REGISTERS_CONFIG, - AFE_CLIP_BANK_SEL, - AFE_CDC_REGISTER_PAGE_CONFIG, - AFE_MAX_CONFIG_TYPES, -}; - -struct afe_param_slimbus_slave_port_cfg { - uint32_t minor_version; - uint16_t slimbus_dev_id; - uint16_t slave_dev_pgd_la; - uint16_t slave_dev_intfdev_la; - uint16_t bit_width; - uint16_t data_format; - uint16_t num_channels; - uint16_t slave_port_mapping[AFE_PORT_MAX_AUDIO_CHAN_CNT]; -} __packed; - -struct afe_param_cdc_slimbus_slave_cfg { - uint32_t minor_version; - uint32_t device_enum_addr_lsw; - uint32_t device_enum_addr_msw; - uint16_t tx_slave_port_offset; - uint16_t rx_slave_port_offset; -} __packed; - -struct afe_param_cdc_reg_cfg { - uint32_t minor_version; - uint32_t reg_logical_addr; - uint32_t reg_field_type; - uint32_t reg_field_bit_mask; - uint16_t reg_bit_width; - uint16_t reg_offset_scale; -} __packed; - -#define AFE_API_VERSION_CDC_REG_PAGE_CFG 1 - -enum { - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_0 = 0, - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_1, - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_2, - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_3, -}; - -struct afe_param_cdc_reg_page_cfg { - uint32_t minor_version; - uint32_t enable; - uint32_t proc_id; -} __packed; - -struct afe_param_cdc_reg_cfg_data { - uint32_t num_registers; - struct afe_param_cdc_reg_cfg *reg_data; -} __packed; - -struct afe_svc_cmd_set_param_v1 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The total size of the payload, including param_hdr_v3 */ - uint32_t payload_size; - - /* The memory mapping header to be used when sending outband */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter data to be filled when sent inband */ - u32 param_data[0]; -} __packed; - -struct afe_svc_cmd_set_param_v2 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending outband */ - struct mem_mapping_hdr mem_hdr; - - /* The total size of the payload, including param_hdr_v3 */ - u32 payload_size; - - /* The parameter data to be filled when sent inband */ - u32 param_data[0]; -} __packed; - -struct afe_param_hw_mad_ctrl { - uint32_t minor_version; - uint16_t mad_type; - uint16_t mad_enable; -} __packed; - -struct afe_port_cmd_set_aanc_acdb_table { - struct apr_hdr hdr; - struct mem_mapping_hdr mem_hdr; -} __packed; - -/* Dolby DAP topology */ -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0x0001033B -#define DS2_ADM_COPP_TOPOLOGY_ID 0x1301033B - -/* RMS value from DSP */ -#define RMS_MODULEID_APPI_PASSTHRU 0x10009011 -#define RMS_PARAM_FIRST_SAMPLE 0x10009012 -#define RMS_PAYLOAD_LEN 4 - -/* Customized mixing in matix mixer */ -#define MTMX_MODULE_ID_DEFAULT_CHMIXER 0x00010341 -#define DEFAULT_CHMIXER_PARAM_ID_COEFF 0x00010342 -#define CUSTOM_STEREO_PAYLOAD_SIZE 9 -#define CUSTOM_STEREO_CMD_PARAM_SIZE 24 -#define CUSTOM_STEREO_NUM_OUT_CH 0x0002 -#define CUSTOM_STEREO_NUM_IN_CH 0x0002 -#define CUSTOM_STEREO_INDEX_PARAM 0x0002 -#define Q14_GAIN_ZERO_POINT_FIVE 0x2000 -#define Q14_GAIN_UNITY 0x4000 - -/* Ultrasound supported formats */ -#define US_POINT_EPOS_FORMAT_V2 0x0001272D -#define US_RAW_FORMAT_V2 0x0001272C -#define US_PROX_FORMAT_V4 0x0001273B -#define US_RAW_SYNC_FORMAT 0x0001272F -#define US_GES_SYNC_FORMAT 0x00012730 - -#define AFE_MODULE_GROUP_DEVICE 0x00010254 -#define AFE_PARAM_ID_GROUP_DEVICE_CFG 0x00010255 -#define AFE_PARAM_ID_GROUP_DEVICE_ENABLE 0x00010256 -#define AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX 0x1102 - -/* Payload of the #AFE_PARAM_ID_GROUP_DEVICE_CFG - * parameter, which configures max of 8 AFE ports - * into a group. - * The fixed size of this structure is sixteen bytes. - */ -struct afe_group_device_group_cfg { - u32 minor_version; - u16 group_id; - u16 num_channels; - u16 port_id[8]; -} __packed; - -#define AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_SENARY_TDM_RX \ - (AFE_PORT_ID_SENARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_SENARY_TDM_TX \ - (AFE_PORT_ID_SENARY_TDM_TX + 0x100) - -/* ID of the parameter used by #AFE_MODULE_GROUP_DEVICE to configure the - * group device. #AFE_SVC_CMD_SET_PARAM can use this parameter ID. - * - * Requirements: - * - Configure the group before the member ports in the group are - * configured and started. - * - Enable the group only after it is configured. - * - Stop all member ports in the group before disabling the group. - */ -#define AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG 0x0001029E - -/* Version information used to handle future additions to - * AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG processing (for backward compatibility). - */ -#define AFE_API_VERSION_GROUP_DEVICE_TDM_CONFIG 0x1 - -/* Number of AFE ports in group device */ -#define AFE_GROUP_DEVICE_NUM_PORTS 8 - -/* Payload of the AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG parameter ID - * used by AFE_MODULE_GROUP_DEVICE. - */ -struct afe_param_id_group_device_tdm_cfg { - u32 group_device_cfg_minor_version; - /* Minor version used to track group device configuration. - * @values #AFE_API_VERSION_GROUP_DEVICE_TDM_CONFIG - */ - - u16 group_id; - /* ID for the group device. - * @values - * - #AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX - * - #AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX - * - #AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX - * - #AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX - */ - - u16 reserved; - /* 0 */ - - u16 port_id[AFE_GROUP_DEVICE_NUM_PORTS]; - /* Array of member port IDs of this group. - * @values - * - #AFE_PORT_ID_PRIMARY_TDM_RX - * - #AFE_PORT_ID_PRIMARY_TDM_RX_1 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_2 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_3 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_4 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_5 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_6 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_7 - - * - #AFE_PORT_ID_PRIMARY_TDM_TX - * - #AFE_PORT_ID_PRIMARY_TDM_TX_1 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_2 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_3 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_4 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_5 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_6 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_7 - - * - #AFE_PORT_ID_SECONDARY_TDM_RX - * - #AFE_PORT_ID_SECONDARY_TDM_RX_1 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_2 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_3 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_4 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_5 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_6 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_7 - - * - #AFE_PORT_ID_SECONDARY_TDM_TX - * - #AFE_PORT_ID_SECONDARY_TDM_TX_1 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_2 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_3 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_4 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_5 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_6 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_7 - - * - #AFE_PORT_ID_TERTIARY_TDM_RX - * - #AFE_PORT_ID_TERTIARY_TDM_RX_1 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_2 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_3 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_4 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_5 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_6 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_7 - - * - #AFE_PORT_ID_TERTIARY_TDM_TX - * - #AFE_PORT_ID_TERTIARY_TDM_TX_1 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_2 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_3 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_4 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_5 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_6 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_7 - - * - #AFE_PORT_ID_QUATERNARY_TDM_RX - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_1 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_2 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_3 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_4 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_5 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_6 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_7 - - * - #AFE_PORT_ID_QUATERNARY_TDM_TX - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_1 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_2 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_3 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_4 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_5 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_6 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_7 - * @tablebulletend - */ - - u32 num_channels; - /* Number of enabled slots for TDM frame. - * @values 1 to 8 - */ - - u32 sample_rate; - /* Sampling rate of the port. - * @values - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_24K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_48K @tablebulletend - */ - - u32 bit_width; - /* Bit width of the sample. - * @values 16, 24, (32) - */ - - u16 nslots_per_frame; - /* Number of slots per frame. Typical : 1, 2, 4, 8, 16, 32. - * @values 1 - 32 - */ - - u16 slot_width; - /* Slot width of the slot in a TDM frame. (slot_width >= bit_width) - * have to be satisfied. - * @values 16, 24, 32 - */ - - u32 slot_mask; - /* Position of active slots. When that bit is set, that paricular - * slot is active. - * Number of active slots can be inferred by number of bits set in - * the mask. Only 8 individual bits can be enabled. - * Bits 0..31 corresponding to slot 0..31 - * @values 1 to 2^32 -1 - */ -} __packed; - -/* Payload of the #AFE_PARAM_ID_GROUP_DEVICE_ENABLE - * parameter, which enables or - * disables any module. - * The fixed size of this structure is four bytes. - */ - -struct afe_group_device_enable { - u16 group_id; - /* valid value is AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX */ - u16 enable; - /* Enables (1) or disables (0) the module. */ -} __packed; - -union afe_port_group_config { - struct afe_group_device_group_cfg group_cfg; - struct afe_group_device_enable group_enable; - struct afe_param_id_group_device_tdm_cfg tdm_cfg; -} __packed; - -/* ID of the parameter used by #AFE_MODULE_AUDIO_DEV_INTERFACE to specify - * the timing statistics of the corresponding device interface. - * Client can periodically query for the device time statistics to help adjust - * the PLL based on the drift value. The get param command must be sent to - * AFE port ID corresponding to device interface - - * This parameter ID supports following get param commands: - * #AFE_PORT_CMD_GET_PARAM_V2 and - * #AFE_PORT_CMD_GET_PARAM_V3. - */ -#define AFE_PARAM_ID_DEV_TIMING_STATS 0x000102AD - -/* Version information used to handle future additions to AFE device - * interface timing statistics (for backward compatibility). - */ -#define AFE_API_VERSION_DEV_TIMING_STATS 0x1 - -/* Enumeration for specifying a sink(Rx) device */ -#define AFE_SINK_DEVICE 0x0 - -/* Enumeration for specifying a source(Tx) device */ -#define AFE_SOURCE_DEVICE 0x1 - -/* Enumeration for specifying the drift reference is of type AV Timer */ -#define AFE_REF_TIMER_TYPE_AVTIMER 0x0 - -/* Message payload structure for the - * AFE_PARAM_ID_DEV_TIMING_STATS parameter. - */ -struct afe_param_id_dev_timing_stats { - /* Minor version used to track the version of device interface timing - * statistics. Currently, the supported version is 1. - * @values #AFE_API_VERSION_DEV_TIMING_STATS - */ - u32 minor_version; - - /* Indicates the device interface direction as either - * source (Tx) or sink (Rx). - * @values - * #AFE_SINK_DEVICE - * #AFE_SOURCE_DEVICE - */ - u16 device_direction; - - /* Reference timer for drift accumulation and time stamp information. - * @values - * #AFE_REF_TIMER_TYPE_AVTIMER @tablebulletend - */ - u16 reference_timer; - - /* - * Flag to indicate if resync is required on the client side for - * drift correction. Flag is set to TRUE for the first get_param - * response after device interface starts. This flag value can be - * used by client to identify if device interface restart has - * happened and if any re-sync is required at their end for drift - * correction. - * @values - * 0: FALSE (Resync not required) - * 1: TRUE (Resync required) @tablebulletend - */ - u32 resync_flag; - - /* Accumulated drift value in microseconds. This value is updated - * every 100th ms. - * Positive drift value indicates AV timer is running faster than device - * Negative drift value indicates AV timer is running slower than device - * @values Any valid int32 number - */ - s32 acc_drift_value; - - /* Lower 32 bits of the 64-bit absolute timestamp of reference - * timer in microseconds. - - * This timestamp corresponds to the time when the drift values - * are accumlated for every 100th ms. - * @values Any valid uint32 number - */ - u32 ref_timer_abs_ts_lsw; - - /* Upper 32 bits of the 64-bit absolute timestamp of reference - * timer in microseconds. - * This timestamp corresponds to the time when the drift values - * are accumlated for every 100th ms. - * @values Any valid uint32 number - */ - u32 ref_timer_abs_ts_msw; -} __packed; - -struct afe_av_dev_drift_get_param_resp { - uint32_t status; - struct param_hdr_v3 pdata; - struct afe_param_id_dev_timing_stats timing_stats; -} __packed; - -/* Command for Matrix or Stream Router */ -#define ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2 0x00010DCE -/* Module for AVSYNC */ -#define ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC 0x00010DC6 - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC to specify the - * render window start value. This parameter is supported only for a Set - * command (not a Get command) in the Rx direction - * (#ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2). - * Render window start is a value (session time minus timestamp, or ST-TS) - * below which frames are held, and after which frames are immediately - * rendered. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2 0x00010DD1 - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC to specify the - * render window end value. This parameter is supported only for a Set - * command (not a Get command) in the Rx direction - * (#ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2). Render window end is a value - * (session time minus timestamp) above which frames are dropped, and below - * which frames are immediately rendered. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2 0x00010DD2 - -/* Generic payload of the window parameters in the - * #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC module. - * This payload is supported only for a Set command - * (not a Get command) on the Rx path. - */ -struct asm_session_mtmx_strtr_param_window_v2_t { - u32 window_lsw; - /* Lower 32 bits of the render window start value. */ - - u32 window_msw; - /* Upper 32 bits of the render window start value. - * - * The 64-bit number formed by window_lsw and window_msw specifies a - * signed 64-bit window value in microseconds. The sign extension is - * necessary. This value is used by the following parameter IDs: - * #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2 - * #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2 - * #ASM_SESSION_MTMX_STRTR_PARAM_STAT_WINDOW_START_V2 - * #ASM_SESSION_MTMX_STRTR_PARAM_STAT_WINDOW_END_V2 - * The value depends on which parameter ID is used. - * The aDSP honors the windows at a granularity of 1 ms. - */ -}; - -struct asm_session_cmd_set_mtmx_strstr_params_v2 { - uint32_t data_payload_addr_lsw; - /* Lower 32 bits of the 64-bit data payload address. */ - - uint32_t data_payload_addr_msw; - /* Upper 32 bits of the 64-bit data payload address. - * If the address is not sent (NULL), the message is in the payload. - * If the address is sent (non-NULL), the parameter data payloads - * begin at the specified address. - */ - - uint32_t mem_map_handle; - /* Unique identifier for an address. This memory map handle is returned - * by the aDSP through the #ASM_CMD_SHARED_MEM_MAP_REGIONS command. - * values - * - NULL -- Parameter data payloads are within the message payload - * (in-band). - * - Non-NULL -- Parameter data payloads begin at the address specified - * in the data_payload_addr_lsw and data_payload_addr_msw fields - * (out-of-band). - */ - - uint32_t data_payload_size; - /* Actual size of the variable payload accompanying the message, or in - * shared memory. This field is used for parsing the parameter payload. - * values > 0 bytes - */ - - uint32_t direction; - /* Direction of the entity (matrix mixer or stream router) on which - * the parameter is to be set. - * values - * - 0 -- Rx (for Rx stream router or Rx matrix mixer) - * - 1 -- Tx (for Tx stream router or Tx matrix mixer) - */ -}; - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC which allows the - * audio client choose the rendering decision that the audio DSP should use. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_MODE_CMD 0x00012F0D - -/* Indicates that rendering decision will be based on default rate - * (session clock based rendering, device driven). - * 1. The default session clock based rendering is inherently driven - * by the timing of the device. - * 2. After the initial decision is made (first buffer after a run - * command), subsequent data rendering decisions are made with - * respect to the rate at which the device is rendering, thus deriving - * its timing from the device. - * 3. While this decision making is simple, it has some inherent limitations - * (mentioned in the next section). - * 4. If this API is not set, the session clock based rendering will be assumed - * and this will ensure that the DSP is backward compatible. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT 0 - -/* Indicates that rendering decision will be based on local clock rate. - * 1. In the DSP loopback/client loopback use cases (frame based - * inputs), the incoming data into audio DSP is time-stamped at the - * local clock rate (STC). - * 2. This TS rate may match the incoming data rate or maybe different - * from the incoming data rate. - * 3. Regardless, the data will be time-stamped with local STC and - * therefore, the client is recommended to set this mode for these - * use cases. This method is inherently more robust to sequencing - * (AFE Start/Stop) and device switches, among other benefits. - * 4. This API will inform the DSP to compare every incoming buffer TS - * against local STC. - * 5. DSP will continue to honor render windows APIs, as before. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC 1 - -/* Structure for rendering decision parameter */ -struct asm_session_mtmx_strtr_param_render_mode_t { - /* Specifies the type of rendering decision the audio DSP should use. - * - * @values - * - #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT - * - #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC - */ - u32 flags; -} __packed; - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC which allows the - * audio client to specify the clock recovery mechanism that the audio DSP - * should use. - */ - -#define ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_CMD 0x00012F0E - -/* Indicates that default clock recovery will be used (no clock recovery). - * If the client wishes that no clock recovery be done, the client can - * choose this. This means that no attempt will made by the DSP to try and - * match the rates of the input and output audio. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_NONE 0 - -/* Indicates that independent clock recovery needs to be used. - * 1. In the DSP loopback/client loopback use cases (frame based inputs), - * the client should choose the independent clock recovery option. - * 2. This basically de-couples the audio and video from knowing each others - * clock sources and lets the audio DSP independently rate match the input - * and output rates. - * 3. After drift detection, the drift correction is achieved by either pulling - * the PLLs (if applicable) or by stream to device rate matching - * (for PCM use cases) by comparing drift with respect to STC. - * 4. For passthrough use cases, since the PLL pulling is the only option, - * a best effort will be made. - * If PLL pulling is not possible / available, the rendering will be - * done without rate matching. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_AUTO 1 - -/* Payload of the #ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC parameter. - */ -struct asm_session_mtmx_strtr_param_clk_rec_t { - /* Specifies the type of clock recovery that the audio DSP should - * use for rate matching. - */ - - /* @values - * #ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_DEFAULT - * #ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_INDEPENDENT - */ - u32 flags; -} __packed; - - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC to - * realize smoother adjustment of audio session clock for a specified session. - * The desired audio session clock adjustment(in micro seconds) is specified - * using the command #ASM_SESSION_CMD_ADJUST_SESSION_CLOCK_V2. - * Delaying/Advancing the session clock would be implemented by inserting - * interpolated/dropping audio samples in the playback path respectively. - * Also, this parameter has to be configured before the Audio Session is put - * to RUN state to avoid cold start latency/glitches in the playback. - */ - -#define ASM_SESSION_MTMX_PARAM_ADJUST_SESSION_TIME_CTL 0x00013217 - -struct asm_session_mtmx_param_adjust_session_time_ctl_t { - /* Specifies whether the module is enabled or not - * @values - * 0 -- disabled - * 1 -- enabled - */ - u32 enable; -}; - -union asm_session_mtmx_strtr_param_config { - struct asm_session_mtmx_strtr_param_window_v2_t window_param; - struct asm_session_mtmx_strtr_param_render_mode_t render_param; - struct asm_session_mtmx_strtr_param_clk_rec_t clk_rec_param; - struct asm_session_mtmx_param_adjust_session_time_ctl_t adj_time_param; -} __packed; - -struct asm_mtmx_strtr_params { - struct apr_hdr hdr; - struct asm_session_cmd_set_mtmx_strstr_params_v2 param; - struct param_hdr_v1 data; - union asm_session_mtmx_strtr_param_config config; -} __packed; - -#define ASM_SESSION_CMD_GET_MTMX_STRTR_PARAMS_V2 0x00010DCF -#define ASM_SESSION_CMDRSP_GET_MTMX_STRTR_PARAMS_V2 0x00010DD0 - -#define ASM_SESSION_MTMX_STRTR_PARAM_SESSION_TIME_V3 0x00012F0B -#define ASM_SESSION_MTMX_STRTR_PARAM_STIME_TSTMP_FLG_BMASK (0x80000000UL) - -struct asm_session_cmd_get_mtmx_strstr_params_v2 { - uint32_t data_payload_addr_lsw; - /* Lower 32 bits of the 64-bit data payload address. */ - - uint32_t data_payload_addr_msw; - /* - * Upper 32 bits of the 64-bit data payload address. - * If the address is not sent (NULL), the message is in the payload. - * If the address is sent (non-NULL), the parameter data payloads - * begin at the specified address. - */ - - uint32_t mem_map_handle; - /* - * Unique identifier for an address. This memory map handle is returned - * by the aDSP through the #ASM_CMD_SHARED_MEM_MAP_REGIONS command. - * values - * - NULL -- Parameter data payloads are within the message payload - * (in-band). - * - Non-NULL -- Parameter data payloads begin at the address specified - * in the data_payload_addr_lsw and data_payload_addr_msw fields - * (out-of-band). - */ - uint32_t direction; - /* - * Direction of the entity (matrix mixer or stream router) on which - * the parameter is to be set. - * values - * - 0 -- Rx (for Rx stream router or Rx matrix mixer) - * - 1 -- Tx (for Tx stream router or Tx matrix mixer) - */ - uint32_t module_id; - /* Unique module ID. */ - - uint32_t param_id; - /* Unique parameter ID. */ - - uint32_t param_max_size; -}; - -struct asm_session_mtmx_strtr_param_session_time_v3_t { - uint32_t session_time_lsw; - /* Lower 32 bits of the current session time in microseconds */ - - uint32_t session_time_msw; - /* - * Upper 32 bits of the current session time in microseconds. - * The 64-bit number formed by session_time_lsw and session_time_msw - * is treated as signed. - */ - - uint32_t absolute_time_lsw; - /* - * Lower 32 bits of the 64-bit absolute time in microseconds. - * This is the time when the sample corresponding to the - * session_time_lsw is rendered to the hardware. This absolute - * time can be slightly in the future or past. - */ - - uint32_t absolute_time_msw; - /* - * Upper 32 bits of the 64-bit absolute time in microseconds. - * This is the time when the sample corresponding to the - * session_time_msw is rendered to hardware. This absolute - * time can be slightly in the future or past. The 64-bit number - * formed by absolute_time_lsw and absolute_time_msw is treated as - * unsigned. - */ - - uint32_t time_stamp_lsw; - /* Lower 32 bits of the last processed timestamp in microseconds */ - - uint32_t time_stamp_msw; - /* - * Upper 32 bits of the last processed timestamp in microseconds. - * The 64-bit number formed by time_stamp_lsw and time_stamp_lsw - * is treated as unsigned. - */ - - uint32_t flags; - /* - * Keeps track of any additional flags needed. - * @values{for bit 31} - * - 0 -- Uninitialized/invalid - * - 1 -- Valid - * All other bits are reserved; clients must set them to zero. - */ -}; - -union asm_session_mtmx_strtr_data_type { - struct asm_session_mtmx_strtr_param_session_time_v3_t session_time; -}; - -struct asm_mtmx_strtr_get_params { - struct apr_hdr hdr; - struct asm_session_cmd_get_mtmx_strstr_params_v2 param_info; -} __packed; - -struct asm_mtmx_strtr_get_params_cmdrsp { - uint32_t err_code; - struct param_hdr_v1 param_info; - union asm_session_mtmx_strtr_data_type param_data; -} __packed; - -#define AUDPROC_MODULE_ID_RESAMPLER 0x00010719 - -enum { - LEGACY_PCM = 0, - COMPRESSED_PASSTHROUGH, - COMPRESSED_PASSTHROUGH_CONVERT, - COMPRESSED_PASSTHROUGH_DSD, - LISTEN, - COMPRESSED_PASSTHROUGH_GEN, - COMPRESSED_PASSTHROUGH_IEC61937 -}; - -#define AUDPROC_MODULE_ID_COMPRESSED_MUTE 0x00010770 -#define AUDPROC_PARAM_ID_COMPRESSED_MUTE 0x00010771 - -struct adm_set_compressed_device_mute { - u32 mute_on; -} __packed; - -#define AUDPROC_MODULE_ID_COMPRESSED_LATENCY 0x0001076E -#define AUDPROC_PARAM_ID_COMPRESSED_LATENCY 0x0001076F - -struct adm_set_compressed_device_latency { - u32 latency; -} __packed; - -#define VOICEPROC_MODULE_ID_GENERIC_TX 0x00010EF6 -#define VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX 0x00010F35 -#define VOICEPROC_PARAM_ID_FLUENCE_SOUNDFOCUS 0x00010E37 -#define VOICEPROC_PARAM_ID_FLUENCE_SOURCETRACKING 0x00010E38 -#define MAX_SECTORS 8 -#define MAX_NOISE_SOURCE_INDICATORS 3 -#define MAX_POLAR_ACTIVITY_INDICATORS 360 -#define MAX_DOA_TRACKING_ANGLES 2 - -struct sound_focus_param { - uint16_t start_angle[MAX_SECTORS]; - uint8_t enable[MAX_SECTORS]; - uint16_t gain_step; -} __packed; - -struct source_tracking_param { - uint8_t vad[MAX_SECTORS]; - uint16_t doa_speech; - uint16_t doa_noise[MAX_NOISE_SOURCE_INDICATORS]; - uint8_t polar_activity[MAX_POLAR_ACTIVITY_INDICATORS]; -} __packed; - -struct doa_tracking_mon_param { - uint16_t target_angle_L16[MAX_DOA_TRACKING_ANGLES]; - uint16_t interf_angle_L16[MAX_DOA_TRACKING_ANGLES]; - uint8_t polar_activity[MAX_POLAR_ACTIVITY_INDICATORS]; -} __packed; - -struct adm_param_fluence_soundfocus_t { - uint16_t start_angles[MAX_SECTORS]; - uint8_t enables[MAX_SECTORS]; - uint16_t gain_step; - uint16_t reserved; -} __packed; - -struct adm_param_fluence_sourcetracking_t { - uint8_t vad[MAX_SECTORS]; - uint16_t doa_speech; - uint16_t doa_noise[MAX_NOISE_SOURCE_INDICATORS]; - uint8_t polar_activity[MAX_POLAR_ACTIVITY_INDICATORS]; -} __packed; - -struct adm_param_doa_tracking_mon_t { - uint16_t target_angle_L16[MAX_DOA_TRACKING_ANGLES]; - uint16_t interf_angle_L16[MAX_DOA_TRACKING_ANGLES]; - uint8_t polar_activity[MAX_POLAR_ACTIVITY_INDICATORS]; -} __packed; - -struct afe_doa_tracking_mon_get_param_resp { - uint32_t status; - struct param_hdr_v3 pdata; - struct doa_tracking_mon_param doa; -} __packed; - -#define AUDPROC_MODULE_ID_AUDIOSPHERE 0x00010916 -#define AUDPROC_PARAM_ID_AUDIOSPHERE_ENABLE 0x00010917 -#define AUDPROC_PARAM_ID_AUDIOSPHERE_STRENGTH 0x00010918 -#define AUDPROC_PARAM_ID_AUDIOSPHERE_CONFIG_MODE 0x00010919 - -#define AUDPROC_PARAM_ID_AUDIOSPHERE_COEFFS_STEREO_INPUT 0x0001091A -#define AUDPROC_PARAM_ID_AUDIOSPHERE_COEFFS_MULTICHANNEL_INPUT 0x0001091B -#define AUDPROC_PARAM_ID_AUDIOSPHERE_DESIGN_STEREO_INPUT 0x0001091C -#define AUDPROC_PARAM_ID_AUDIOSPHERE_DESIGN_MULTICHANNEL_INPUT 0x0001091D - -#define AUDPROC_PARAM_ID_AUDIOSPHERE_OPERATING_INPUT_MEDIA_INFO 0x0001091E - -#define AUDPROC_MODULE_ID_VOICE_TX_SECNS 0x10027059 -#define AUDPROC_PARAM_IDX_SEC_PRIMARY_MIC_CH 0x10014444 - -#define AUDPROC_MODULE_ID_FFECNS 0x00010952 -#define AUDPROC_MODULE_ID_FFNS 0x00010962 -#define AUDPROC_PARAM_ID_FFV_DOA_TRACKING_PARAM 0x0001097C -#define AUDPROC_PARAM_ID_FFV_DOA_TRACKING_MONITOR 0x0001097D - -struct admx_sec_primary_mic_ch { - uint16_t version; - uint16_t reserved; - uint16_t sec_primary_mic_ch; - uint16_t reserved1; -} __packed; - -#define FFECNS_MODULE_ID 0x00010952 -#define FLUENCE_CMN_GLOBAL_EFFECT_PARAM_ID 0x00010EAF -#define FFECNS_TOPOLOGY 0X10028003 - -struct ffecns_effect { - uint32_t payload; -}; - -/** ID of the Voice Activity Detection (VAD) module, which is used to - * configure AFE VAD. - */ -#define AFE_MODULE_VAD 0x000102B9 - -/** ID of the parameter used by #AFE_MODULE_VAD to configure the VAD. - */ -#define AFE_PARAM_ID_VAD_CFG 0x000102BA - -#define AFE_API_VERSION_VAD_CFG 0x1 - -/* Payload of the AFE_PARAM_ID_VAD_CONFIG parameter used by - * AFE_MODULE_VAD. - */ -struct afe_param_id_vad_cfg_t { - uint32_t vad_cfg_minor_version; - /** Tracks the configuration of this parameter. - * Supported Values: #AFE_API_VERSION_VAD_CFG - */ - - uint32_t pre_roll_in_ms; - /** Pre-roll period in ms. - * Supported Values: 0x0 to 0x3E8 - */ -} __packed; - -#define AFE_PARAM_ID_VAD_CORE_CFG 0x000102BB - -/** - * This parameter is should be used to configure the AFE TDM - * interface lane configuration. - * Regular TDM interface ports: - * This parameter ID must be used with module ID - * AFE_MODULE_AUDIO_DEV_INTERFACE and set using the AFE_PORT_CMD_SET_PARAM_V3 - * command for the AFE TDM interface port IDs. - * Group device TDM interface ports: - * This parameter ID must be used with module ID AFE_MODULE_GROUP_DEVICE - * and set using the AFE_SVC_CMD_SET_PARAM_V2 command for the AFE TDM group IDs. - */ -#define AFE_PARAM_ID_TDM_LANE_CONFIG 0x000102C1 - -/* Payload of the AFE_PARAM_ID_TDM_LANE_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_tdm_lane_cfg { - uint16_t port_id; - /** ID of the TDM interface. - * For regular TDM interfaces value corresponds to valid port ID. - * For group devices TDM interface value corresponds to valid group device ID. - */ - - uint16_t lane_mask; - /** Position of the active lanes. Bits 0 to N correspond to lanes 0 to N. - * 1 to 2^N-1 When a bit is set, the corresponding lane is active. - * The number of active lanes can be inferred from the number of bits - * set in the mask. - */ -}; - -#endif /*_APR_AUDIO_V2_H_ */ diff --git a/techpack/audio/4.0/include/dsp/audio_cal_utils.h b/techpack/audio/4.0/include/dsp/audio_cal_utils.h deleted file mode 100644 index 0607815037f0..000000000000 --- a/techpack/audio/4.0/include/dsp/audio_cal_utils.h +++ /dev/null @@ -1,98 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2014, 2018, The Linux Foundation. All rights reserved. - */ -#ifndef _AUDIO_CAL_UTILS_H -#define _AUDIO_CAL_UTILS_H - -#include -#include -#include -#include - -struct cal_data { - size_t size; - void *kvaddr; - phys_addr_t paddr; -}; - -struct mem_map_data { - size_t map_size; - int32_t q6map_handle; - int32_t ion_map_handle; - struct dma_buf *dma_buf; -}; - -struct cal_block_data { - size_t client_info_size; - void *client_info; - void *cal_info; - struct list_head list; - struct cal_data cal_data; - bool cal_stale; - struct mem_map_data map_data; - int32_t buffer_number; -}; - -struct cal_util_callbacks { - int (*map_cal) - (int32_t cal_type, struct cal_block_data *cal_block); - int (*unmap_cal) - (int32_t cal_type, struct cal_block_data *cal_block); - bool (*match_block) - (struct cal_block_data *cal_block, void *user_data); -}; - -struct cal_type_info { - struct audio_cal_reg reg; - struct cal_util_callbacks cal_util_callbacks; -}; - -struct cal_type_data { - struct cal_type_info info; - struct mutex lock; - struct list_head cal_blocks; -}; - - -/* to register & degregister with cal util driver */ -int cal_utils_create_cal_types(int num_cal_types, - struct cal_type_data **cal_type, - struct cal_type_info *info); -void cal_utils_destroy_cal_types(int num_cal_types, - struct cal_type_data **cal_type); - -/* common functions for callbacks */ -int cal_utils_alloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info); -int cal_utils_dealloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type); -int cal_utils_set_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info); - -/* use for SSR */ -void cal_utils_clear_cal_block_q6maps(int num_cal_types, - struct cal_type_data **cal_type); - - -/* common matching functions used to add blocks */ -bool cal_utils_match_buf_num(struct cal_block_data *cal_block, - void *user_data); - -/* common matching functions to find cal blocks */ -struct cal_block_data *cal_utils_get_only_cal_block( - struct cal_type_data *cal_type); - -/* Size of calibration specific data */ -size_t get_cal_info_size(int32_t cal_type); -size_t get_user_cal_type_size(int32_t cal_type); - -/* Version of the cal type*/ -int32_t cal_utils_get_cal_type_version(void *cal_type_data); - -void cal_utils_mark_cal_used(struct cal_block_data *cal_block); - -bool cal_utils_is_cal_stale(struct cal_block_data *cal_block); -#endif diff --git a/techpack/audio/4.0/include/dsp/audio_calibration.h b/techpack/audio/4.0/include/dsp/audio_calibration.h deleted file mode 100644 index a68c768cb8de..000000000000 --- a/techpack/audio/4.0/include/dsp/audio_calibration.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2014, 2017, The Linux Foundation. All rights reserved. - */ -#ifndef _AUDIO_CALIBRATION_H -#define _AUDIO_CALIBRATION_H - -#include - -/* Used by driver in buffer_number field to notify client - * To update all blocks, for example: freeing all memory - */ -#define ALL_CAL_BLOCKS -1 - - -struct audio_cal_callbacks { - int (*alloc)(int32_t cal_type, size_t data_size, void *data); - int (*dealloc)(int32_t cal_type, size_t data_size, void *data); - int (*pre_cal)(int32_t cal_type, size_t data_size, void *data); - int (*set_cal)(int32_t cal_type, size_t data_size, void *data); - int (*get_cal)(int32_t cal_type, size_t data_size, void *data); - int (*post_cal)(int32_t cal_type, size_t data_size, void *data); -}; - -struct audio_cal_reg { - int32_t cal_type; - struct audio_cal_callbacks callbacks; -}; - -int audio_cal_register(int num_cal_types, struct audio_cal_reg *reg_data); -int audio_cal_deregister(int num_cal_types, struct audio_cal_reg *reg_data); - -#endif diff --git a/techpack/audio/4.0/include/dsp/audio_notifier.h b/techpack/audio/4.0/include/dsp/audio_notifier.h deleted file mode 100644 index bc1a286c59ee..000000000000 --- a/techpack/audio/4.0/include/dsp/audio_notifier.h +++ /dev/null @@ -1,97 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2016, 2018, The Linux Foundation. All rights reserved. - */ - -#ifndef __AUDIO_NOTIFIER_H_ -#define __AUDIO_NOTIFIER_H_ - -/* State of the notifier domain */ -enum { - AUDIO_NOTIFIER_SERVICE_DOWN, - AUDIO_NOTIFIER_SERVICE_UP -}; - -/* Service order determines connection priority - * Highest number connected first - */ -enum { - AUDIO_NOTIFIER_SSR_SERVICE, - AUDIO_NOTIFIER_PDR_SERVICE, - AUDIO_NOTIFIER_MAX_SERVICES -}; - -enum { - AUDIO_NOTIFIER_ADSP_DOMAIN, - AUDIO_NOTIFIER_MODEM_DOMAIN, - AUDIO_NOTIFIER_MAX_DOMAINS -}; - -/* Structure populated in void *data of nb function - * callback used for audio_notifier_register - */ -struct audio_notifier_cb_data { - int service; - int domain; -}; - -#if IS_ENABLED(CONFIG_MSM_QDSP6_NOTIFIER) - -/* - * Use audio_notifier_register to register any audio - * clients who need to be notified of a remote process. - * This API will determine and register the client with - * the best available subsystem (SSR or PDR) for that - * domain (Adsp or Modem). When an event is sent from that - * domain the notifier block callback function will be called. - * - * client_name - A unique user name defined by the client. - * If the same name is used for multiple calls each will - * be tracked & called back separately and a single call - * to deregister will delete them all. - * domain - Domain the client wants to get events from. - * AUDIO_NOTIFIER_ADSP_DOMAIN - * AUDIO_NOTIFIER_MODEM_DOMAIN - * *nb - Pointer to a notifier block. Provide a callback function - * to be notified of an even on that domain. - * - * nb_func(struct notifier_block *this, unsigned long opcode, void *data) - * this - pointer to own nb - * opcode - event from registered domain - * AUDIO_NOTIFIER_SERVICE_DOWN - * AUDIO_NOTIFIER_SERVICE_UP - * *data - pointer to struct audio_notifier_cb_data - * - * Returns: Success: 0 - * Error: -# - */ -int audio_notifier_register(char *client_name, int domain, - struct notifier_block *nb); - -/* - * Use audio_notifier_deregister to deregister the clients from - * all domains registered using audio_notifier_register that - * match the client name. - * - * client_name - Unique user name used in audio_notifier_register. - * Returns: Success: 0 - * Error: -# - */ -int audio_notifier_deregister(char *client_name); - -#else - -static inline int audio_notifier_register(char *client_name, int domain, - struct notifier_block *nb) -{ - return 0; -} - -static inline int audio_notifier_deregister(char *client_name) -{ - return 0; -} - -#endif /* CONFIG_MSM_QDSP6_NOTIFIER */ - -#endif diff --git a/techpack/audio/4.0/include/dsp/digital-cdc-rsc-mgr.h b/techpack/audio/4.0/include/dsp/digital-cdc-rsc-mgr.h deleted file mode 100644 index 685cd5c1fc5f..000000000000 --- a/techpack/audio/4.0/include/dsp/digital-cdc-rsc-mgr.h +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2020, The Linux Foundation. All rights reserved. - */ - -#ifndef DIGITAL_CDC_RSC_MGR_H -#define DIGITAL_CDC_RSC_MGR_H - -#ifdef CONFIG_DIGITAL_CDC_RSC_MGR - -int digital_cdc_rsc_mgr_hw_vote_enable(struct clk* vote_handle); -void digital_cdc_rsc_mgr_hw_vote_disable(struct clk* vote_handle); -void digital_cdc_rsc_mgr_hw_vote_reset(struct clk* vote_handle); - -#else - -static inline int digital_cdc_rsc_mgr_hw_vote_enable(struct clk* vote_handle) -{ - return 0; -} - -static inline void digital_cdc_rsc_mgr_hw_vote_disable(struct clk* vote_handle) -{ -} - -static inline void digital_cdc_rsc_mgr_hw_vote_reset(struct clk* vote_handle) -{ -} - -#endif /* CONFIG_DIGITAL_CDC_RSC_MGR */ - -#endif /* DIGITAL_CDC_RSC_MGR_H */ diff --git a/techpack/audio/4.0/include/dsp/msm-audio-effects-q6-v2.h b/techpack/audio/4.0/include/dsp/msm-audio-effects-q6-v2.h deleted file mode 100644 index b1fad6d6a6f4..000000000000 --- a/techpack/audio/4.0/include/dsp/msm-audio-effects-q6-v2.h +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_AUDIO_EFFECTS_H -#define _MSM_AUDIO_EFFECTS_H - -#include - -#define MAX_PP_PARAMS_SZ 128 - -bool msm_audio_effects_is_effmodule_supp_in_top(int effect_module, - int topology); - -int msm_audio_effects_enable_extn(struct audio_client *ac, - struct msm_nt_eff_all_config *effects, - bool flag); - -int msm_audio_effects_reverb_handler(struct audio_client *ac, - struct reverb_params *reverb, - long *values); - -int msm_audio_effects_bass_boost_handler(struct audio_client *ac, - struct bass_boost_params *bass_boost, - long *values); - -int msm_audio_effects_pbe_handler(struct audio_client *ac, - struct pbe_params *pbe, - long *values); - -int msm_audio_effects_virtualizer_handler(struct audio_client *ac, - struct virtualizer_params *virtualizer, - long *values); - -int msm_audio_effects_popless_eq_handler(struct audio_client *ac, - struct eq_params *eq, - long *values); - -int msm_audio_effects_volume_handler(struct audio_client *ac, - struct soft_volume_params *vol, - long *values); - -int msm_audio_effects_volume_handler_v2(struct audio_client *ac, - struct soft_volume_params *vol, - long *values, int instance); -#endif /*_MSM_AUDIO_EFFECTS_H*/ diff --git a/techpack/audio/4.0/include/dsp/msm-audio-event-notify.h b/techpack/audio/4.0/include/dsp/msm-audio-event-notify.h deleted file mode 100644 index 8c515e2d8a9e..000000000000 --- a/techpack/audio/4.0/include/dsp/msm-audio-event-notify.h +++ /dev/null @@ -1,61 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __MSM_AUDIO_EVENT_NOTIFY_H_ -#define __MSM_AUDIO_EVENT_NOTIFY_H_ - -#include - -#if (IS_ENABLED(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) || \ - IS_ENABLED(CONFIG_SND_SOC_MSM_QDSP6V2_VM)) -int msm_aud_evt_register_client(struct notifier_block *nb); -int msm_aud_evt_unregister_client(struct notifier_block *nb); -int msm_aud_evt_notifier_call_chain(unsigned long val, void *v); -int msm_aud_evt_blocking_register_client(struct notifier_block *nb); -int msm_aud_evt_blocking_unregister_client(struct notifier_block *nb); -int msm_aud_evt_blocking_notifier_call_chain(unsigned long val, void *v); -#else -static inline int msm_aud_evt_register_client(struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_unregister_client(struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_notifier_call_chain(unsigned long val, void *v) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_blocking_register_client( - struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_blocking_unregister_client( - struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_blocking_notifier_call_chain( - unsigned long val, void *v) -{ - return -ENOSYS; -} -#endif - -enum { - MSM_AUD_DC_EVENT = 1, - SWR_WAKE_IRQ_REGISTER, - SWR_WAKE_IRQ_DEREGISTER, - SWR_WAKE_IRQ_EVENT, -}; - -#endif diff --git a/techpack/audio/4.0/include/dsp/msm-dts-srs-tm-config.h b/techpack/audio/4.0/include/dsp/msm-dts-srs-tm-config.h deleted file mode 100644 index 337ea131a1c3..000000000000 --- a/techpack/audio/4.0/include/dsp/msm-dts-srs-tm-config.h +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2014, 2017-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _MSM_DTS_SRS_TM_CONFIG_H_ -#define _MSM_DTS_SRS_TM_CONFIG_H_ - -#include -#include - -struct param_outband; - -#ifdef CONFIG_DTS_SRS_TM - -union srs_trumedia_params_u { - struct srs_trumedia_params srs_params; - __u16 raw_params[1]; -}; - -void msm_dts_srs_tm_ion_memmap(struct param_outband *po_); -void msm_dts_srs_tm_init(int port_id, int copp_idx); -void msm_dts_srs_tm_deinit(int port_id); -void msm_dts_srs_tm_add_controls(struct snd_soc_platform *platform); -#else -static inline void msm_dts_srs_tm_ion_memmap(struct param_outband *po_) { } -static inline void msm_dts_srs_tm_init(int port_id, int copp_idx) { } -static inline void msm_dts_srs_tm_deinit(int port_id) { } -static inline void msm_dts_srs_tm_add_controls( - struct snd_soc_platform *platform) { } - -#endif - -#endif diff --git a/techpack/audio/4.0/include/dsp/msm_audio_ion.h b/techpack/audio/4.0/include/dsp/msm_audio_ion.h deleted file mode 100644 index 9ac5ca30e080..000000000000 --- a/techpack/audio/4.0/include/dsp/msm_audio_ion.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2013-2015, 2017-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _LINUX_MSM_AUDIO_ION_H -#define _LINUX_MSM_AUDIO_ION_H -#include -#include -#include -#include - -enum { - MSM_AUDIO_ION_INV_CACHES = 0, - MSM_AUDIO_ION_CLEAN_CACHES, -}; - -int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz, - dma_addr_t *paddr, size_t *pa_len, void **vaddr); - -int msm_audio_ion_import(struct dma_buf **dma_buf, int fd, - unsigned long *ionflag, size_t bufsz, - dma_addr_t *paddr, size_t *pa_len, void **vaddr); -int msm_audio_ion_free(struct dma_buf *dma_buf); -int msm_audio_ion_mmap(struct audio_buffer *abuff, struct vm_area_struct *vma); -int msm_audio_ion_cache_operations(struct audio_buffer *abuff, int cache_op); - -u32 msm_audio_populate_upper_32_bits(dma_addr_t pa); -int msm_audio_ion_get_smmu_info(struct device **cb_dev, u64 *smmu_sid); - -int msm_audio_ion_dma_map(dma_addr_t *phys_addr, dma_addr_t *iova_base, - u32 size, enum dma_data_direction dir); -#endif /* _LINUX_MSM_AUDIO_ION_H */ diff --git a/techpack/audio/4.0/include/dsp/msm_mdf.h b/techpack/audio/4.0/include/dsp/msm_mdf.h deleted file mode 100644 index 6f143db2ddab..000000000000 --- a/techpack/audio/4.0/include/dsp/msm_mdf.h +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _LINUX_MSM_MDF_H -#define _LINUX_MSM_MDF_H - -#ifdef CONFIG_MSM_MDF - -/** - * msm_mdf_mem_init - allocate and map memory to ADSP be shared - * across multiple remote DSPs. - */ -int msm_mdf_mem_init(void); - -/** - * msm_mdf_mem_init - unmap and free memory to ADSP. - */ -int msm_mdf_mem_deinit(void); - -#else - -static inline int msm_mdf_mem_init(void) -{ - return 0; -} - -static inline int msm_mdf_mem_deinit(void) -{ - return 0; -} - -#endif /* CONFIG_MSM_MDF */ - -#endif /* _LINUX_MSM_MDF_H */ diff --git a/techpack/audio/4.0/include/dsp/q6adm-v2.h b/techpack/audio/4.0/include/dsp/q6adm-v2.h deleted file mode 100644 index 9f5fef8cfbd6..000000000000 --- a/techpack/audio/4.0/include/dsp/q6adm-v2.h +++ /dev/null @@ -1,230 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ -#ifndef __Q6_ADM_V2_H__ -#define __Q6_ADM_V2_H__ - - -#define ADM_PATH_PLAYBACK 0x1 -#define ADM_PATH_LIVE_REC 0x2 -#define ADM_PATH_NONLIVE_REC 0x3 -#define ADM_PATH_COMPRESSED_RX 0x5 -#define ADM_PATH_COMPRESSED_TX 0x6 -#include -#include -#include - -#define MAX_MODULES_IN_TOPO 16 -#define ADM_GET_TOPO_MODULE_LIST_LENGTH\ - ((MAX_MODULES_IN_TOPO + 1) * sizeof(uint32_t)) -#define ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH \ - ((MAX_MODULES_IN_TOPO + 1) * 2 * sizeof(uint32_t)) -#define AUD_PROC_BLOCK_SIZE 4096 -#define AUD_VOL_BLOCK_SIZE 4096 -#define AUD_PROC_PERSIST_BLOCK_SIZE (2 * 1024 * 1020) -#define AUDIO_RX_CALIBRATION_SIZE (AUD_PROC_BLOCK_SIZE + \ - AUD_VOL_BLOCK_SIZE) -enum { - ADM_CUSTOM_TOP_CAL = 0, - ADM_AUDPROC_CAL, - ADM_LSM_AUDPROC_CAL, - ADM_AUDVOL_CAL, - ADM_RTAC_INFO_CAL, - ADM_RTAC_APR_CAL, - ADM_SRS_TRUMEDIA, - ADM_RTAC_AUDVOL_CAL, - ADM_LSM_AUDPROC_PERSISTENT_CAL, - ADM_MAX_CAL_TYPES -}; - -enum { - ADM_MEM_MAP_INDEX_SOURCE_TRACKING = ADM_MAX_CAL_TYPES, - ADM_MEM_MAP_INDEX_MAX -}; - -enum { - ADM_CLIENT_ID_DEFAULT = 0, - ADM_CLIENT_ID_SOURCE_TRACKING, - ADM_CLIENT_ID_MAX, -}; - -#define MAX_COPPS_PER_PORT 0x8 -#define ADM_MAX_CHANNELS 32 - -#define ADSP_ADM_API_VERSION_V3 3 - -/* multiple copp per stream. */ -struct route_payload { - unsigned int copp_idx[MAX_COPPS_PER_PORT]; - unsigned int port_id[MAX_COPPS_PER_PORT]; - int app_type[MAX_COPPS_PER_PORT]; - int acdb_dev_id[MAX_COPPS_PER_PORT]; - int sample_rate[MAX_COPPS_PER_PORT]; - unsigned short num_copps; - unsigned int session_id; -}; - -struct default_chmixer_param_id_coeff { - uint32_t index; - uint16_t num_output_channels; - uint16_t num_input_channels; -}; - -struct msm_pcm_channel_mixer { - int output_channel; - int input_channels[ADM_MAX_CHANNELS]; - bool enable; - int rule; - int channel_weight[ADM_MAX_CHANNELS][ADM_MAX_CHANNELS]; - int port_idx; - int input_channel; - uint16_t in_ch_map[ADM_MAX_CHANNELS]; - uint16_t out_ch_map[ADM_MAX_CHANNELS]; - bool override_in_ch_map; - bool override_out_ch_map; -}; - -struct ffv_spf_freeze_param_t { - uint16_t freeze; - uint16_t source_id; -}; - -int srs_trumedia_open(int port_id, int copp_idx, __s32 srs_tech_id, - void *srs_params); - -int adm_dts_eagle_set(int port_id, int copp_idx, int param_id, - void *data, uint32_t size); - -int adm_dts_eagle_get(int port_id, int copp_idx, int param_id, - void *data, uint32_t size); - -void adm_copp_mfc_cfg(int port_id, int copp_idx, int dst_sample_rate); - -int adm_get_pp_params(int port_id, int copp_idx, uint32_t client_id, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr, u8 *returned_param_data); - -int adm_send_params_v5(int port_id, int copp_idx, char *params, - uint32_t params_length); - -int adm_set_pp_params(int port_id, int copp_idx, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 params_size); - -int adm_pack_and_set_one_pp_param(int port_id, int copp_idx, - struct param_hdr_v3 param_hdr, - u8 *param_data); - -int adm_open(int port, int path, int rate, int mode, int topology, - int perf_mode, uint16_t bits_per_sample, - int app_type, int acdbdev_id, int session_type); - -int adm_map_rtac_block(struct rtac_cal_block_data *cal_block); - -int adm_unmap_rtac_block(uint32_t *mem_map_handle); - -int adm_close(int port, int topology, int perf_mode); - -int adm_matrix_map(int path, struct route_payload payload_map, - int perf_mode, uint32_t passthr_mode); - -int adm_connect_afe_port(int mode, int session_id, int port_id); - -void adm_ec_ref_rx_id(int port_id); - -void adm_num_ec_ref_rx_chans(int num_chans); - -void adm_num_ec_ref_rx_chans_downmixed(int num_chans); - -int adm_ec_ref_chmixer_weights(int out_channel_idx, - uint16_t *weights, int count); - -void adm_ec_ref_rx_bit_width(int bit_width); - -void adm_ec_ref_rx_sampling_rate(int sampling_rate); - -int adm_get_lowlatency_copp_id(int port_id); - -int adm_set_multi_ch_map(char *channel_map, int path); - -int adm_get_multi_ch_map(char *channel_map, int path); - -void adm_set_port_multi_ch_map(char *channel_map, int port_id); - -int adm_validate_and_get_port_index(int port_id); - -int adm_get_default_copp_idx(int port_id); - -int adm_get_topology_for_port_from_copp_id(int port_id, int copp_id); - -int adm_get_topology_for_port_copp_idx(int port_id, int copp_idx); - -int adm_get_indexes_from_copp_id(int copp_id, int *port_idx, int *copp_idx); - -int adm_set_stereo_to_custom_stereo(int port_id, int copp_idx, - unsigned int session_id, - char *params, uint32_t params_length); - -int adm_get_pp_topo_module_list(int port_id, int copp_idx, int32_t param_length, - char *params); - -int adm_get_pp_topo_module_list_v2(int port_id, int copp_idx, - int32_t param_length, - int32_t *returned_params); - -int adm_set_volume(int port_id, int copp_idx, int volume); - -int adm_set_softvolume(int port_id, int copp_idx, - struct audproc_softvolume_params *softvol_param); - -int adm_set_mic_gain(int port_id, int copp_idx, int volume); - -int adm_send_set_multichannel_ec_primary_mic_ch(int port_id, int copp_idx, - int primary_mic_ch); - -int adm_set_ffecns_effect(int effect); - -int adm_param_enable(int port_id, int copp_idx, int module_id, int enable); - -int adm_param_enable_v2(int port_id, int copp_idx, - struct module_instance_info mod_inst_info, int enable); - -int adm_send_calibration(int port_id, int copp_idx, int path, int perf_mode, - int cal_type, char *params, int size); - -int adm_set_wait_parameters(int port_id, int copp_idx); - -int adm_reset_wait_parameters(int port_id, int copp_idx); - -int adm_wait_timeout(int port_id, int copp_idx, int wait_time); - -int adm_store_cal_data(int port_id, int copp_idx, int path, int perf_mode, - int cal_type, char *params, int *size); - -int adm_send_compressed_device_mute(int port_id, int copp_idx, bool mute_on); - -int adm_send_compressed_device_latency(int port_id, int copp_idx, int latency); -int adm_set_sound_focus(int port_id, int copp_idx, - struct sound_focus_param soundFocusData); -int adm_get_sound_focus(int port_id, int copp_idx, - struct sound_focus_param *soundFocusData); -int adm_get_source_tracking(int port_id, int copp_idx, - struct source_tracking_param *sourceTrackingData); -int adm_get_doa_tracking_mon(int port_id, int copp_idx, - struct doa_tracking_mon_param *doa_tracking_data); -int adm_set_custom_chmix_cfg(int port_id, int copp_idx, - unsigned int session_id, char *params, - uint32_t params_length, int direction, - int stream_type); -int adm_swap_speaker_channels(int port_id, int copp_idx, int sample_rate, - bool spk_swap); -int adm_programable_channel_mixer(int port_id, int copp_idx, int session_id, - int session_type, - struct msm_pcm_channel_mixer *ch_mixer, - int channel_index); -void msm_dts_srs_acquire_lock(void); -void msm_dts_srs_release_lock(void); -void adm_set_native_mode(int mode); -int adm_set_ffecns_freeze_event(bool ffecns_freeze_event); -#endif /* __Q6_ADM_V2_H__ */ diff --git a/techpack/audio/4.0/include/dsp/q6afe-v2.h b/techpack/audio/4.0/include/dsp/q6afe-v2.h deleted file mode 100644 index 73a7cf872a61..000000000000 --- a/techpack/audio/4.0/include/dsp/q6afe-v2.h +++ /dev/null @@ -1,538 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. - */ -#ifndef __Q6AFE_V2_H__ -#define __Q6AFE_V2_H__ -#include -#include - -#define IN 0x000 -#define OUT 0x001 -#define MSM_AFE_MONO 0 -#define MSM_AFE_CH_STEREO 1 -#define MSM_AFE_MONO_RIGHT 1 -#define MSM_AFE_MONO_LEFT 2 -#define MSM_AFE_STEREO 3 -#define MSM_AFE_4CHANNELS 4 -#define MSM_AFE_6CHANNELS 6 -#define MSM_AFE_8CHANNELS 8 -#define MSM_AFE_10CHANNELS 10 -#define MSM_AFE_12CHANNELS 12 -#define MSM_AFE_14CHANNELS 14 -#define MSM_AFE_16CHANNELS 16 - -#define MSM_AFE_I2S_FORMAT_LPCM 0 -#define MSM_AFE_I2S_FORMAT_COMPR 1 -#define MSM_AFE_I2S_FORMAT_IEC60958_LPCM 2 -#define MSM_AFE_I2S_FORMAT_IEC60958_COMPR 3 - -#define MSM_AFE_PORT_TYPE_RX 0 -#define MSM_AFE_PORT_TYPE_TX 1 - -#define RT_PROXY_DAI_001_RX 0xE0 -#define RT_PROXY_DAI_001_TX 0xF0 -#define RT_PROXY_DAI_002_RX 0xF1 -#define RT_PROXY_DAI_002_TX 0xE1 -#define VIRTUAL_ID_TO_PORTID(val) ((val & 0xF) | 0x2000) - -#define AFE_CLK_VERSION_V1 1 -#define AFE_CLK_VERSION_V2 2 - -#define AFE_API_VERSION_SUPPORT_SPV3 2 -#define AFE_API_VERSION_V3 3 -/* for VAD and Island mode */ -#define AFE_API_VERSION_V4 4 -/* for VAD enable */ -#define AFE_API_VERSION_V6 6 - - -typedef int (*routing_cb)(int port); - -enum { - /* IDX 0->4 */ - IDX_PRIMARY_I2S_RX, - IDX_PRIMARY_I2S_TX, - IDX_AFE_PORT_ID_PRIMARY_PCM_RX, - IDX_AFE_PORT_ID_PRIMARY_PCM_TX, - IDX_SECONDARY_I2S_RX, - /* IDX 5->9 */ - IDX_SECONDARY_I2S_TX, - IDX_MI2S_RX, - IDX_MI2S_TX, - IDX_HDMI_RX, - IDX_RSVD_2, - /* IDX 10->14 */ - IDX_RSVD_3, - IDX_DIGI_MIC_TX, - IDX_VOICE_RECORD_RX, - IDX_VOICE_RECORD_TX, - IDX_VOICE_PLAYBACK_TX, - /* IDX 15->19 */ - IDX_SLIMBUS_0_RX, - IDX_SLIMBUS_0_TX, - IDX_SLIMBUS_1_RX, - IDX_SLIMBUS_1_TX, - IDX_SLIMBUS_2_RX, - /* IDX 20->24 */ - IDX_SLIMBUS_2_TX, - IDX_SLIMBUS_3_RX, - IDX_SLIMBUS_3_TX, - IDX_SLIMBUS_4_RX, - IDX_SLIMBUS_4_TX, - /* IDX 25->29 */ - IDX_SLIMBUS_5_RX, - IDX_SLIMBUS_5_TX, - IDX_INT_BT_SCO_RX, - IDX_INT_BT_SCO_TX, - IDX_INT_BT_A2DP_RX, - /* IDX 30->34 */ - IDX_INT_FM_RX, - IDX_INT_FM_TX, - IDX_RT_PROXY_PORT_001_RX, - IDX_RT_PROXY_PORT_001_TX, - IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX, - /* IDX 35->39 */ - IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX, - IDX_AFE_PORT_ID_SECONDARY_MI2S_RX, - IDX_AFE_PORT_ID_SECONDARY_MI2S_TX, - IDX_AFE_PORT_ID_TERTIARY_MI2S_RX, - IDX_AFE_PORT_ID_TERTIARY_MI2S_TX, - /* IDX 40->44 */ - IDX_AFE_PORT_ID_PRIMARY_MI2S_RX, - IDX_AFE_PORT_ID_PRIMARY_MI2S_TX, - IDX_AFE_PORT_ID_SECONDARY_PCM_RX, - IDX_AFE_PORT_ID_SECONDARY_PCM_TX, - IDX_VOICE2_PLAYBACK_TX, - /* IDX 45->49 */ - IDX_SLIMBUS_6_RX, - IDX_SLIMBUS_6_TX, - IDX_PRIMARY_SPDIF_RX, - IDX_GLOBAL_CFG, - IDX_AUDIO_PORT_ID_I2S_RX, - /* IDX 50->54 */ - IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1, - IDX_AFE_PORT_ID_QUINARY_MI2S_RX, - IDX_AFE_PORT_ID_QUINARY_MI2S_TX, - IDX_AFE_PORT_ID_SENARY_MI2S_RX, - IDX_AFE_PORT_ID_SENARY_MI2S_TX, - /* IDX 55->118 */ - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_0, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_0, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_1, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_1, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_2, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_2, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_3, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_3, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_4, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_4, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_5, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_5, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_6, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_6, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_7, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_7, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_0, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_0, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_1, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_1, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_2, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_2, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_3, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_3, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_4, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_4, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_5, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_5, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_6, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_6, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_7, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_7, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_0, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_0, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_1, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_1, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_2, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_2, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_3, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_3, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_4, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_4, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_5, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_5, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_6, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_6, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_7, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_7, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_0, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_0, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_1, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_1, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_2, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_2, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_3, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_3, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_4, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_4, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_5, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_5, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_6, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_6, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7, - /* IDX 119->122 */ - IDX_SLIMBUS_7_RX, - IDX_SLIMBUS_7_TX, - IDX_SLIMBUS_8_RX, - IDX_SLIMBUS_8_TX, - /* IDX 123-> 124 */ - IDX_AFE_PORT_ID_USB_RX, - IDX_AFE_PORT_ID_USB_TX, - /* IDX 125 */ - IDX_DISPLAY_PORT_RX, - /* IDX 126-> 129 */ - IDX_AFE_PORT_ID_TERTIARY_PCM_RX, - IDX_AFE_PORT_ID_TERTIARY_PCM_TX, - IDX_AFE_PORT_ID_QUATERNARY_PCM_RX, - IDX_AFE_PORT_ID_QUATERNARY_PCM_TX, - /* IDX 130-> 143 */ - IDX_AFE_PORT_ID_INT0_MI2S_RX, - IDX_AFE_PORT_ID_INT0_MI2S_TX, - IDX_AFE_PORT_ID_INT1_MI2S_RX, - IDX_AFE_PORT_ID_INT1_MI2S_TX, - IDX_AFE_PORT_ID_INT2_MI2S_RX, - IDX_AFE_PORT_ID_INT2_MI2S_TX, - IDX_AFE_PORT_ID_INT3_MI2S_RX, - IDX_AFE_PORT_ID_INT3_MI2S_TX, - IDX_AFE_PORT_ID_INT4_MI2S_RX, - IDX_AFE_PORT_ID_INT4_MI2S_TX, - IDX_AFE_PORT_ID_INT5_MI2S_RX, - IDX_AFE_PORT_ID_INT5_MI2S_TX, - IDX_AFE_PORT_ID_INT6_MI2S_RX, - IDX_AFE_PORT_ID_INT6_MI2S_TX, - /* IDX 144-> 161 */ - IDX_AFE_PORT_ID_QUINARY_PCM_RX, - IDX_AFE_PORT_ID_QUINARY_PCM_TX, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_0, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_0, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_1, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_1, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_2, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_2, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_3, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_3, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_4, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_4, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_5, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_5, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_6, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_6, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_7, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_7, - /* IDX 162 to 183 */ - IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_0, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_0, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_1, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_1, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_2, - IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_0, - IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_1, - IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_2, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_0, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_0, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_1, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_1, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_2, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_2, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_3, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_3, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_4, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_4, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_5, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7, - /* IDX 184 to 186 */ - IDX_SECONDARY_SPDIF_RX, - IDX_PRIMARY_SPDIF_TX, - IDX_SECONDARY_SPDIF_TX, - /* IDX 187 to 188 */ - IDX_SLIMBUS_9_RX, - IDX_SLIMBUS_9_TX, - /* IDX 189 -> 191 */ - IDX_AFE_PORT_ID_SENARY_PCM_RX, - IDX_AFE_PORT_ID_SENARY_PCM_TX, - IDX_AFE_LOOPBACK_TX, - /* IDX 192-> 207 */ - IDX_AFE_PORT_ID_SENARY_TDM_RX_0, - IDX_AFE_PORT_ID_SENARY_TDM_TX_0, - IDX_AFE_PORT_ID_SENARY_TDM_RX_1, - IDX_AFE_PORT_ID_SENARY_TDM_TX_1, - IDX_AFE_PORT_ID_SENARY_TDM_RX_2, - IDX_AFE_PORT_ID_SENARY_TDM_TX_2, - IDX_AFE_PORT_ID_SENARY_TDM_RX_3, - IDX_AFE_PORT_ID_SENARY_TDM_TX_3, - IDX_AFE_PORT_ID_SENARY_TDM_RX_4, - IDX_AFE_PORT_ID_SENARY_TDM_TX_4, - IDX_AFE_PORT_ID_SENARY_TDM_RX_5, - IDX_AFE_PORT_ID_SENARY_TDM_TX_5, - IDX_AFE_PORT_ID_SENARY_TDM_RX_6, - IDX_AFE_PORT_ID_SENARY_TDM_TX_6, - IDX_AFE_PORT_ID_SENARY_TDM_RX_7, - IDX_AFE_PORT_ID_SENARY_TDM_TX_7, - /* IDX 208-> 209 */ - IDX_AFE_PORT_ID_PRIMARY_META_MI2S_RX, - IDX_AFE_PORT_ID_SECONDARY_META_MI2S_RX, - /* IDX 210-> 211 */ - IDX_RT_PROXY_PORT_002_RX, - IDX_RT_PROXY_PORT_002_TX, - AFE_MAX_PORTS -}; - -enum afe_mad_type { - MAD_HW_NONE = 0x00, - MAD_HW_AUDIO = 0x01, - MAD_HW_BEACON = 0x02, - MAD_HW_ULTRASOUND = 0x04, - MAD_SW_AUDIO = 0x05, -}; - -enum afe_cal_mode { - AFE_CAL_MODE_DEFAULT = 0x00, - AFE_CAL_MODE_NONE, -}; - -enum afe_vad_cfg_type { - AFE_VAD_ENABLE = 0x00, - AFE_VAD_PREROLL, -}; - -struct vad_config { - u32 is_enable; - u32 pre_roll; -}; - -struct afe_audio_buffer { - dma_addr_t phys; - void *data; - uint32_t used; - uint32_t size;/* size of buffer */ - uint32_t actual_size; /* actual number of bytes read by DSP */ - struct dma_buf *dma_buf; -}; - -struct afe_audio_port_data { - struct afe_audio_buffer *buf; - uint32_t max_buf_cnt; - uint32_t dsp_buf; - uint32_t cpu_buf; - struct list_head mem_map_handle; - uint32_t tmp_hdl; - /* read or write locks */ - struct mutex lock; - spinlock_t dsp_lock; -}; - -struct afe_audio_client { - atomic_t cmd_state; - /* Relative or absolute TS */ - uint32_t time_flag; - void *priv; - uint64_t time_stamp; - struct mutex cmd_lock; - /* idx:1 out port, 0: in port*/ - struct afe_audio_port_data port[2]; - wait_queue_head_t cmd_wait; - uint32_t mem_map_handle; -}; - -struct aanc_data { - bool aanc_active; - uint16_t aanc_rx_port; - uint16_t aanc_tx_port; - uint32_t aanc_rx_port_sample_rate; - uint32_t aanc_tx_port_sample_rate; - int level; -}; - -int afe_open(u16 port_id, union afe_port_config *afe_config, int rate); -int afe_close(int port_id); -int afe_loopback(u16 enable, u16 rx_port, u16 tx_port); -int afe_sidetone_enable(u16 tx_port_id, u16 rx_port_id, bool enable); -int afe_set_display_stream(u16 rx_port_id, u32 stream_idx, u32 ctl_idx); -int afe_loopback_gain(u16 port_id, u16 volume); -int afe_validate_port(u16 port_id); -int afe_get_port_index(u16 port_id); -int afe_get_topology(int port_id); -int afe_start_pseudo_port(u16 port_id); -int afe_stop_pseudo_port(u16 port_id); -uint32_t afe_req_mmap_handle(struct afe_audio_client *ac); -int afe_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz, - struct afe_audio_client *ac); -int afe_cmd_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz); -int afe_cmd_memory_map_nowait(int port_id, phys_addr_t dma_addr_p, - u32 dma_buf_sz); -int afe_cmd_memory_unmap(u32 dma_addr_p); -int afe_cmd_memory_unmap_nowait(u32 dma_addr_p); -void afe_set_dtmf_gen_rx_portid(u16 rx_port_id, int set); -int afe_dtmf_generate_rx(int64_t duration_in_ms, - uint16_t high_freq, - uint16_t low_freq, uint16_t gain); -int afe_register_get_events(u16 port_id, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data); -int afe_unregister_get_events(u16 port_id); -int afe_rt_proxy_port_write(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes); -int afe_rt_proxy_port_read(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes); -void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode); -void afe_set_vad_cfg(u32 vad_enable, u32 preroll_config, - u32 port_id); -void afe_set_island_mode_cfg(u16 port_id, u32 enable_flag); -void afe_get_island_mode_cfg(u16 port_id, u32 *enable_flag); -int afe_port_start(u16 port_id, union afe_port_config *afe_config, - u32 rate); -int afe_set_tws_channel_mode(u32 foramt, u16 port_id, u32 channel_mode); -int afe_port_start_v2(u16 port_id, union afe_port_config *afe_config, - u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, - struct afe_enc_config *enc_config, - struct afe_dec_config *dec_config); -int afe_spk_prot_feed_back_cfg(int src_port, int dst_port, - int l_ch, int r_ch, u32 enable); -int afe_spk_prot_get_calib_data(struct afe_spkr_prot_get_vi_calib *calib); -int afe_port_stop_nowait(int port_id); -int afe_apply_gain(u16 port_id, u16 gain); -int afe_q6_interface_prepare(void); -int afe_get_port_type(u16 port_id); -int q6afe_audio_client_buf_alloc_contiguous(unsigned int dir, - struct afe_audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt); -struct afe_audio_client *q6afe_audio_client_alloc(void *priv); -int q6afe_audio_client_buf_free_contiguous(unsigned int dir, - struct afe_audio_client *ac); -void q6afe_audio_client_free(struct afe_audio_client *ac); -/* if port_id is virtual, convert to physical.. - * if port_id is already physical, return physical - */ -int afe_convert_virtual_to_portid(u16 port_id); - -int afe_pseudo_port_start_nowait(u16 port_id); -int afe_pseudo_port_stop_nowait(u16 port_id); -int afe_set_lpass_clock(u16 port_id, struct afe_clk_cfg *cfg); -int afe_set_lpass_clock_v2(u16 port_id, struct afe_clk_set *cfg); -int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg); -int afe_set_digital_codec_core_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg); -int afe_set_lpass_internal_digital_codec_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg); -int afe_enable_lpass_core_shared_clock(u16 port_id, u32 enable); - -int q6afe_check_osr_clk_freq(u32 freq); - -int afe_send_spdif_clk_cfg(struct afe_param_id_spdif_clk_cfg *cfg, - u16 port_id); -int afe_send_spdif_ch_status_cfg(struct afe_param_id_spdif_ch_status_cfg - *ch_status_cfg, u16 port_id); - -int afe_spdif_port_start(u16 port_id, struct afe_spdif_port_config *spdif_port, - u32 rate); - -int afe_spdif_reg_event_cfg(u16 port_id, u16 reg_flag, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data); - -int afe_turn_onoff_hw_mad(u16 mad_type, u16 mad_enable); -int afe_port_set_mad_type(u16 port_id, enum afe_mad_type mad_type); -enum afe_mad_type afe_port_get_mad_type(u16 port_id); -int afe_set_config(enum afe_config_type config_type, void *config_data, - int arg); -void afe_clear_config(enum afe_config_type config); -bool afe_has_config(enum afe_config_type config); - -void afe_set_aanc_info(struct aanc_data *aanc_info); -int afe_set_aanc_noise_level(int val); -int afe_port_group_set_param(u16 group_id, - union afe_port_group_config *afe_group_config); -int afe_port_group_enable(u16 group_id, - union afe_port_group_config *afe_group_config, u16 enable, - struct afe_param_id_tdm_lane_cfg *lane_cfg); -int afe_unmap_rtac_block(uint32_t *mem_map_handle); -int afe_map_rtac_block(struct rtac_cal_block_data *cal_block); -int afe_send_slot_mapping_cfg( - struct afe_param_id_slot_mapping_cfg *slot_mapping_cfg, - u16 port_id); -int afe_send_custom_tdm_header_cfg( - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg, - u16 port_id); -int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port, - u32 rate, u16 num_groups); -void afe_set_routing_callback(routing_cb cb); -int afe_get_av_dev_drift(struct afe_param_id_dev_timing_stats *timing_stats, - u16 port); -int afe_get_sp_rx_tmax_xmax_logging_data( - struct afe_sp_rx_tmax_xmax_logging_param *xt_logging, - u16 port_id); -int afe_cal_init_hwdep(void *card); -int afe_send_port_island_mode(u16 port_id); -int afe_send_port_vad_cfg_params(u16 port_id); -int afe_send_cmd_wakeup_register(void *handle, bool enable); -void afe_register_wakeup_irq_callback( - void (*afe_cb_wakeup_irq)(void *handle)); -int afe_get_doa_tracking_mon(u16 port_id, - struct doa_tracking_mon_param *doa_tracking_data); - -enum { - AFE_LPASS_CORE_HW_BLOCK_ID_NONE, - AFE_LPASS_CORE_HW_RSVD, - AFE_LPASS_CORE_HW_BLOCK_ID_AVTIMER, - AFE_LPASS_CORE_HW_MACRO_BLOCK, - AFE_LPASS_CORE_HW_DCODEC_BLOCK, - AFE_LPASS_CORE_HW_VOTE_MAX -}; - -/* Handles audio-video timer (avtimer) and BTSC vote requests from clients. - */ -#define AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST 0x000100f4 - -struct afe_cmd_remote_lpass_core_hw_vote_request { - struct apr_hdr hdr; - uint32_t hw_block_id; - /* ID of the hardware block. */ - char client_name[8]; - /* Name of the client. */ -} __packed; - -#define AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST 0x000100f5 - -struct afe_cmd_rsp_remote_lpass_core_hw_vote_request { - uint32_t client_handle; - /**< Handle of the client. */ -} __packed; - -#define AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST 0x000100f6 - -struct afe_cmd_remote_lpass_core_hw_devote_request { - struct apr_hdr hdr; - uint32_t hw_block_id; - /**< ID of the hardware block.*/ - - uint32_t client_handle; - /**< Handle of the client.*/ -} __packed; - -int afe_vote_lpass_core_hw(uint32_t hw_block_id, char *client_name, - uint32_t *client_handle); -int afe_unvote_lpass_core_hw(uint32_t hw_block_id, uint32_t client_handle); -int afe_get_spk_initial_cal(void); -void afe_get_spk_r0(int *spk_r0); -void afe_get_spk_t0(int *spk_t0); -int afe_get_spk_v_vali_flag(void); -void afe_get_spk_v_vali_sts(int *spk_v_vali_sts); -void afe_set_spk_initial_cal(int initial_cal); -void afe_set_spk_v_vali_flag(int v_vali_flag); -#endif /* __Q6AFE_V2_H__ */ diff --git a/techpack/audio/4.0/include/dsp/q6asm-v2.h b/techpack/audio/4.0/include/dsp/q6asm-v2.h deleted file mode 100644 index 5ad8fb0f6abe..000000000000 --- a/techpack/audio/4.0/include/dsp/q6asm-v2.h +++ /dev/null @@ -1,756 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ -#ifndef __Q6_ASM_V2_H__ -#define __Q6_ASM_V2_H__ - -#include -#include -#include -#include -#include - -#define IN 0x000 -#define OUT 0x001 -#define CH_MODE_MONO 0x001 -#define CH_MODE_STEREO 0x002 - -#define FORMAT_LINEAR_PCM 0x0000 -#define FORMAT_DTMF 0x0001 -#define FORMAT_ADPCM 0x0002 -#define FORMAT_YADPCM 0x0003 -#define FORMAT_MP3 0x0004 -#define FORMAT_MPEG4_AAC 0x0005 -#define FORMAT_AMRNB 0x0006 -#define FORMAT_AMRWB 0x0007 -#define FORMAT_V13K 0x0008 -#define FORMAT_EVRC 0x0009 -#define FORMAT_EVRCB 0x000a -#define FORMAT_EVRCWB 0x000b -#define FORMAT_MIDI 0x000c -#define FORMAT_SBC 0x000d -#define FORMAT_WMA_V10PRO 0x000e -#define FORMAT_WMA_V9 0x000f -#define FORMAT_AMR_WB_PLUS 0x0010 -#define FORMAT_MPEG4_MULTI_AAC 0x0011 -#define FORMAT_MULTI_CHANNEL_LINEAR_PCM 0x0012 -#define FORMAT_AC3 0x0013 -#define FORMAT_EAC3 0x0014 -#define FORMAT_MP2 0x0015 -#define FORMAT_FLAC 0x0016 -#define FORMAT_ALAC 0x0017 -#define FORMAT_VORBIS 0x0018 -#define FORMAT_APE 0x0019 -#define FORMAT_G711_ALAW_FS 0x001a -#define FORMAT_G711_MLAW_FS 0x001b -#define FORMAT_DTS 0x001c -#define FORMAT_DSD 0x001d -#define FORMAT_APTX 0x001e -#define FORMAT_GEN_COMPR 0x001f -#define FORMAT_TRUEHD 0x0020 -#define FORMAT_IEC61937 0x0021 -#define FORMAT_BESPOKE 0x0022 - -#define ENCDEC_SBCBITRATE 0x0001 -#define ENCDEC_IMMEDIATE_DECODE 0x0002 -#define ENCDEC_CFG_BLK 0x0003 - -#define ENC_CFG_ID_NONE 0x0000 - -#define CMD_PAUSE 0x0001 -#define CMD_FLUSH 0x0002 -#define CMD_EOS 0x0003 -#define CMD_CLOSE 0x0004 -#define CMD_OUT_FLUSH 0x0005 -#define CMD_SUSPEND 0x0006 - -/* bit 0:1 represents priority of stream */ -#define STREAM_PRIORITY_NORMAL 0x0000 -#define STREAM_PRIORITY_LOW 0x0001 -#define STREAM_PRIORITY_HIGH 0x0002 - -/* bit 4 represents META enable of encoded data buffer */ -#define BUFFER_META_ENABLE 0x0010 - -/* bit 5 represents timestamp */ -/* bit 5 - 0 -- ASM_DATA_EVENT_READ_DONE will have relative time-stamp*/ -/* bit 5 - 1 -- ASM_DATA_EVENT_READ_DONE will have absolute time-stamp*/ -#define ABSOLUTE_TIMESTAMP_ENABLE 0x0020 - -/* Enable Sample_Rate/Channel_Mode notification event from Decoder */ -#define SR_CM_NOTIFY_ENABLE 0x0004 - -#define TUN_WRITE_IO_MODE 0x0008 /* tunnel read write mode */ -#define TUN_READ_IO_MODE 0x0004 /* tunnel read write mode */ -#define SYNC_IO_MODE 0x0001 -#define ASYNC_IO_MODE 0x0002 -#define COMPRESSED_IO 0x0040 -#define COMPRESSED_STREAM_IO 0x0080 -#define NT_MODE 0x0400 - -#define NO_TIMESTAMP 0xFF00 -#define SET_TIMESTAMP 0x0000 - -#define SOFT_PAUSE_ENABLE 1 -#define SOFT_PAUSE_DISABLE 0 - -#define ASM_ACTIVE_STREAMS_ALLOWED 0xF -/* Control session is used for mapping calibration memory */ -#define ASM_CONTROL_SESSION (ASM_ACTIVE_STREAMS_ALLOWED + 1) - -#define ASM_SHIFT_GAPLESS_MODE_FLAG 31 -#define ASM_SHIFT_LAST_BUFFER_FLAG 30 - -#define ASM_LITTLE_ENDIAN 0 -#define ASM_BIG_ENDIAN 1 - -#define ADSP_ASM_API_VERSION_V2 2 - -/* PCM_MEDIA_FORMAT_Version */ -enum { - PCM_MEDIA_FORMAT_V2 = 0, - PCM_MEDIA_FORMAT_V3, - PCM_MEDIA_FORMAT_V4, - PCM_MEDIA_FORMAT_V5, -}; - -/* PCM format modes in DSP */ -enum { - DEFAULT_QF = 0, - Q15 = 15, - Q23 = 23, - Q31 = 31, -}; - -/* payload structure bytes */ -#define READDONE_IDX_STATUS 0 -#define READDONE_IDX_BUFADD_LSW 1 -#define READDONE_IDX_BUFADD_MSW 2 -#define READDONE_IDX_MEMMAP_HDL 3 -#define READDONE_IDX_SIZE 4 -#define READDONE_IDX_OFFSET 5 -#define READDONE_IDX_LSW_TS 6 -#define READDONE_IDX_MSW_TS 7 -#define READDONE_IDX_FLAGS 8 -#define READDONE_IDX_NUMFRAMES 9 -#define READDONE_IDX_SEQ_ID 10 - -#define SOFT_PAUSE_PERIOD 30 /* ramp up/down for 30ms */ -#define SOFT_PAUSE_STEP 0 /* Step value 0ms or 0us */ -enum { - SOFT_PAUSE_CURVE_LINEAR = 0, - SOFT_PAUSE_CURVE_EXP, - SOFT_PAUSE_CURVE_LOG, -}; - -#define SOFT_VOLUME_PERIOD 30 /* ramp up/down for 30ms */ -#define SOFT_VOLUME_STEP 0 /* Step value 0ms or 0us */ -enum { - SOFT_VOLUME_CURVE_LINEAR = 0, - SOFT_VOLUME_CURVE_EXP, - SOFT_VOLUME_CURVE_LOG, -}; - -#define SOFT_VOLUME_INSTANCE_1 1 -#define SOFT_VOLUME_INSTANCE_2 2 - -typedef void (*app_cb)(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv); - -struct audio_buffer { - dma_addr_t phys; - void *data; - uint32_t used; - uint32_t size;/* size of buffer */ - uint32_t actual_size; /* actual number of bytes read by DSP */ - struct dma_buf *dma_buf; -}; - -struct audio_aio_write_param { - phys_addr_t paddr; - uint32_t len; - uint32_t uid; - uint32_t lsw_ts; - uint32_t msw_ts; - uint32_t flags; - uint32_t metadata_len; - uint32_t last_buffer; -}; - -struct audio_aio_read_param { - phys_addr_t paddr; - uint32_t len; - uint32_t uid; - uint32_t flags;/*meta data flags*/ -}; - -struct audio_port_data { - struct audio_buffer *buf; - uint32_t max_buf_cnt; - uint32_t dsp_buf; - uint32_t cpu_buf; - struct list_head mem_map_handle; - uint32_t tmp_hdl; - /* read or write locks */ - struct mutex lock; - spinlock_t dsp_lock; -}; - -struct shared_io_config { - uint32_t format; - uint16_t bits_per_sample; - uint32_t rate; - uint32_t channels; - uint16_t sample_word_size; - uint32_t bufsz; - uint32_t bufcnt; -}; - -struct dsp_timestamp { - uint64_t time_stamp; - uint64_t abs_time_stamp; - uint64_t last_time_stamp; -}; - -struct audio_client { - int session; - app_cb cb; - atomic_t cmd_state; - atomic_t cmd_state_pp; - /* Relative or absolute TS */ - atomic_t time_flag; - atomic_t nowait_cmd_cnt; - atomic_t mem_state; - void *priv; - uint32_t io_mode; - struct dsp_timestamp dsp_ts; - struct apr_svc *apr; - struct apr_svc *mmap_apr; - struct apr_svc *apr2; - struct mutex cmd_lock; - /* idx:1 out port, 0: in port*/ - struct audio_port_data port[2]; - wait_queue_head_t cmd_wait; - wait_queue_head_t time_wait; - wait_queue_head_t mem_wait; - int perf_mode; - int stream_id; - struct device *dev; - int topology; - int app_type; - /* audio cache operations fptr*/ - int (*fptr_cache_ops)(struct audio_buffer *abuff, int cache_op); - atomic_t unmap_cb_success; - atomic_t reset; - /* holds latest DSP pipeline delay */ - uint32_t path_delay; - /* shared io */ - struct audio_buffer shared_pos_buf; - struct shared_io_config config; -}; - -struct q6asm_cal_info { - int topology_id; - int app_type; -}; - -void q6asm_audio_client_free(struct audio_client *ac); - -struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv); - -struct audio_client *q6asm_get_audio_client(int session_id); - -int q6asm_audio_client_buf_alloc(unsigned int dir/* 1:Out,0:In */, - struct audio_client *ac, - unsigned int bufsz, - uint32_t bufcnt); -int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir - /* 1:Out,0:In */, - struct audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt); - -int q6asm_audio_client_buf_free_contiguous(unsigned int dir, - struct audio_client *ac); - -int q6asm_set_pp_params(struct audio_client *ac, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 param_size); - -int q6asm_pack_and_set_pp_param_in_band(struct audio_client *ac, - struct param_hdr_v3 param_hdr, - u8 *param_data); - -int q6asm_set_soft_volume_module_instance_ids(int instance, - struct param_hdr_v3 *param_hdr); - -int q6asm_open_read(struct audio_client *ac, uint32_t format - /*, uint16_t bits_per_sample*/); - -int q6asm_open_read_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_read_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_read_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, - uint32_t enc_cfg_id); - -int q6asm_open_read_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, - uint32_t enc_cfg_id); - -int q6asm_open_write(struct audio_client *ac, uint32_t format - /*, uint16_t bits_per_sample*/); - -int q6asm_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_shared_io(struct audio_client *ac, - struct shared_io_config *c, int dir, - bool use_default_chmap, u8 *channel_map); - -int q6asm_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_stream_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_stream_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_stream_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_stream_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_open_read_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag); - -int q6asm_open_write_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag); - -int q6asm_open_read_write(struct audio_client *ac, - uint32_t rd_format, - uint32_t wr_format); - -int q6asm_open_read_write_v2(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format, bool is_meta_data_mode, - uint32_t bits_per_sample, bool overwrite_topology, - int topology); - -int q6asm_open_loopback_v2(struct audio_client *ac, - uint16_t bits_per_sample); - -int q6asm_open_transcode_loopback(struct audio_client *ac, - uint16_t bits_per_sample, uint32_t source_format, - uint32_t sink_format); - -int q6asm_write(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags); -int q6asm_write_nolock(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags); - -int q6asm_async_write(struct audio_client *ac, - struct audio_aio_write_param *param); - -int q6asm_async_read(struct audio_client *ac, - struct audio_aio_read_param *param); - -int q6asm_read(struct audio_client *ac); -int q6asm_read_v2(struct audio_client *ac, uint32_t len); -int q6asm_read_nolock(struct audio_client *ac); - -int q6asm_memory_map(struct audio_client *ac, phys_addr_t buf_add, - int dir, uint32_t bufsz, uint32_t bufcnt); - -int q6asm_memory_unmap(struct audio_client *ac, phys_addr_t buf_add, - int dir); - -struct audio_buffer *q6asm_shared_io_buf(struct audio_client *ac, int dir); - -int q6asm_shared_io_free(struct audio_client *ac, int dir); - -int q6asm_get_shared_pos(struct audio_client *ac, uint32_t *si, uint32_t *msw, - uint32_t *lsw); - -int q6asm_map_rtac_block(struct rtac_cal_block_data *cal_block); - -int q6asm_unmap_rtac_block(uint32_t *mem_map_handle); - -int q6asm_send_cal(struct audio_client *ac); - -int q6asm_run(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts); - -int q6asm_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts); - -int q6asm_stream_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts, uint32_t stream_id); - -int q6asm_reg_tx_overflow(struct audio_client *ac, uint16_t enable); - -int q6asm_reg_rx_underflow(struct audio_client *ac, uint16_t enable); - -int q6asm_cmd(struct audio_client *ac, int cmd); - -int q6asm_stream_cmd(struct audio_client *ac, int cmd, uint32_t stream_id); - -int q6asm_cmd_nowait(struct audio_client *ac, int cmd); - -int q6asm_stream_cmd_nowait(struct audio_client *ac, int cmd, - uint32_t stream_id); - -void *q6asm_is_cpu_buf_avail(int dir, struct audio_client *ac, - uint32_t *size, uint32_t *idx); - -int q6asm_cpu_buf_release(int dir, struct audio_client *ac); - -void *q6asm_is_cpu_buf_avail_nolock(int dir, struct audio_client *ac, - uint32_t *size, uint32_t *idx); - -int q6asm_is_dsp_buf_avail(int dir, struct audio_client *ac); - -/* File format specific configurations to be added below */ - -int q6asm_enc_cfg_blk_aac(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate, uint32_t channels, - uint32_t bit_rate, - uint32_t mode, uint32_t format); - -int q6asm_enc_cfg_blk_g711(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate); - -int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_enc_cfg_blk_pcm_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - bool use_default_chmap, bool use_back_flavor, - u8 *channel_map); - -int q6asm_enc_cfg_blk_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size); - -int q6asm_enc_cfg_blk_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size, uint16_t endianness, - uint16_t mode); - -int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample); - -int q6asm_enc_cfg_blk_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size); - -int q6asm_enc_cfg_blk_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_enc_cfg_blk_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_enc_cfg_blk_custom(struct audio_client *ac, - uint32_t sample_rate, uint32_t channels, - uint32_t format, void *cfg); - -int q6asm_set_encdec_chan_map(struct audio_client *ac, - uint32_t num_channels); - -int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_enable_sbrps(struct audio_client *ac, - uint32_t sbr_ps); - -int q6asm_cfg_dual_mono_aac(struct audio_client *ac, - uint16_t sce_left, uint16_t sce_right); - -int q6asm_cfg_aac_sel_mix_coef(struct audio_client *ac, uint32_t mix_coeff); - -int q6asm_enc_cfg_blk_qcelp(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t reduced_rate_level, uint16_t rate_modulation_cmd); - -int q6asm_enc_cfg_blk_evrc(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t rate_modulation_cmd); - -int q6asm_enc_cfg_blk_amrnb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable); - -int q6asm_enc_cfg_blk_amrwb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable); - -int q6asm_media_format_block_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_media_format_block_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample); - -int q6asm_media_format_block_pcm_format_support_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, int stream_id, - bool use_default_chmap, char *channel_map); - -int q6asm_media_format_block_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size); - -int q6asm_media_format_block_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map); - -int q6asm_media_format_block_multi_ch_pcm_v2( - struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample); -int q6asm_media_format_block_gen_compr( - struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample); - -int q6asm_media_format_block_iec( - struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_media_format_block_multi_ch_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size); - -int q6asm_media_format_block_multi_ch_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_multi_ch_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg); - -int q6asm_stream_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg, int stream_id); - -int q6asm_media_format_block_multi_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg); - -int q6asm_media_format_block_wma(struct audio_client *ac, - void *cfg, int stream_id); - -int q6asm_media_format_block_wmapro(struct audio_client *ac, - void *cfg, int stream_id); - -int q6asm_media_format_block_amrwbplus(struct audio_client *ac, - struct asm_amrwbplus_cfg *cfg); - -int q6asm_stream_media_format_block_flac(struct audio_client *ac, - struct asm_flac_cfg *cfg, int stream_id); - -int q6asm_media_format_block_alac(struct audio_client *ac, - struct asm_alac_cfg *cfg, int stream_id); - -int q6asm_media_format_block_g711(struct audio_client *ac, - struct asm_g711_dec_cfg *cfg, int stream_id); - -int q6asm_stream_media_format_block_vorbis(struct audio_client *ac, - struct asm_vorbis_cfg *cfg, int stream_id); - -int q6asm_media_format_block_ape(struct audio_client *ac, - struct asm_ape_cfg *cfg, int stream_id); - -int q6asm_media_format_block_dsd(struct audio_client *ac, - struct asm_dsd_cfg *cfg, int stream_id); - -int q6asm_stream_media_format_block_aptx_dec(struct audio_client *ac, - uint32_t sr, int stream_id); - -int q6asm_ds1_set_endp_params(struct audio_client *ac, - int param_id, int param_value); - -/* Send stream based end params */ -int q6asm_ds1_set_stream_endp_params(struct audio_client *ac, int param_id, - int param_value, int stream_id); - -/* PP specific */ -int q6asm_equalizer(struct audio_client *ac, void *eq); - -/* Send Volume Command */ -int q6asm_set_volume(struct audio_client *ac, int volume); - -/* Send Volume Command */ -int q6asm_set_volume_v2(struct audio_client *ac, int volume, int instance); - -/* DTS Eagle Params */ -int q6asm_dts_eagle_set(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id); -int q6asm_dts_eagle_get(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id); - -/* Send aptx decoder BT address */ -int q6asm_set_aptx_dec_bt_addr(struct audio_client *ac, - struct aptx_dec_bt_addr_cfg *cfg); - -/* Set SoftPause Params */ -int q6asm_set_softpause(struct audio_client *ac, - struct asm_softpause_params *param); - -/* Set Softvolume Params */ -int q6asm_set_softvolume(struct audio_client *ac, - struct asm_softvolume_params *param); - -/* Set Softvolume Params */ -int q6asm_set_softvolume_v2(struct audio_client *ac, - struct asm_softvolume_params *param, int instance); - -/* Send left-right channel gain */ -int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain); - -/* Send multi channel gain */ -int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, - uint32_t *gains, uint8_t *ch_map, bool use_default); - -/* Enable Mute/unmute flag */ -int q6asm_set_mute(struct audio_client *ac, int muteflag); - -int q6asm_get_session_time(struct audio_client *ac, uint64_t *tstamp); -int q6asm_get_session_time_v2(struct audio_client *ac, uint64_t *ses_time, - uint64_t *abs_time); -int q6asm_get_session_time_legacy(struct audio_client *ac, uint64_t *tstamp); - -int q6asm_send_stream_cmd(struct audio_client *ac, - struct msm_adsp_event_data *data); - -int q6asm_send_ion_fd(struct audio_client *ac, int fd); - -int q6asm_send_rtic_event_ack(struct audio_client *ac, - void *param, uint32_t params_length); - -/* Client can set the IO mode to either AIO/SIO mode */ -int q6asm_set_io_mode(struct audio_client *ac, uint32_t mode); - -/* Get Service ID for APR communication */ -int q6asm_get_apr_service_id(int session_id); - -/* Common format block without any payload */ -int q6asm_media_format_block(struct audio_client *ac, uint32_t format); - -/* Send the meta data to remove initial and trailing silence */ -int q6asm_send_meta_data(struct audio_client *ac, uint32_t initial_samples, - uint32_t trailing_samples); - -/* Send the stream meta data to remove initial and trailing silence */ -int q6asm_stream_send_meta_data(struct audio_client *ac, uint32_t stream_id, - uint32_t initial_samples, uint32_t trailing_samples); - -uint8_t q6asm_get_asm_stream_id(int session_id); -int q6asm_get_asm_topology(int session_id); -int q6asm_get_asm_app_type(int session_id); - -int q6asm_send_mtmx_strtr_window(struct audio_client *ac, - struct asm_session_mtmx_strtr_param_window_v2_t *window_param, - uint32_t param_id); - -/* Configure DSP render mode */ -int q6asm_send_mtmx_strtr_render_mode(struct audio_client *ac, - uint32_t render_mode); - -/* Configure DSP clock recovery mode */ -int q6asm_send_mtmx_strtr_clk_rec_mode(struct audio_client *ac, - uint32_t clk_rec_mode); - -/* Enable adjust session clock in DSP */ -int q6asm_send_mtmx_strtr_enable_adjust_session_clock(struct audio_client *ac, - bool enable); - -/* Retrieve the current DSP path delay */ -int q6asm_get_path_delay(struct audio_client *ac); - -/* Helper functions to retrieve data from token */ -uint8_t q6asm_get_buf_index_from_token(uint32_t token); -uint8_t q6asm_get_stream_id_from_token(uint32_t token); - -/* Adjust session clock in DSP */ -int q6asm_adjust_session_clock(struct audio_client *ac, - uint32_t adjust_time_lsw, - uint32_t adjust_time_msw); - -/* Provide default asm channel mapping for given channel count */ -int q6asm_map_channels(u8 *channel_mapping, uint32_t channels, - bool use_back_flavor); -#endif /* __Q6_ASM_H__ */ diff --git a/techpack/audio/4.0/include/dsp/q6audio-v2.h b/techpack/audio/4.0/include/dsp/q6audio-v2.h deleted file mode 100644 index 079d0b14b585..000000000000 --- a/techpack/audio/4.0/include/dsp/q6audio-v2.h +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2013, 2015, The Linux Foundation. All rights reserved. - */ - -#ifndef _Q6_AUDIO_H_ -#define _Q6_AUDIO_H_ - -#include - -enum { - LEGACY_PCM_MODE = 0, - LOW_LATENCY_PCM_MODE, - ULTRA_LOW_LATENCY_PCM_MODE, - ULL_POST_PROCESSING_PCM_MODE, -}; - - -int q6audio_get_port_index(u16 port_id); - -int q6audio_convert_virtual_to_portid(u16 port_id); - -int q6audio_validate_port(u16 port_id); - -int q6audio_is_digital_pcm_interface(u16 port_id); - -int q6audio_get_port_id(u16 port_id); - -#endif diff --git a/techpack/audio/4.0/include/dsp/q6common.h b/techpack/audio/4.0/include/dsp/q6common.h deleted file mode 100644 index 7250a138ed04..000000000000 --- a/techpack/audio/4.0/include/dsp/q6common.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __Q6COMMON_H__ -#define __Q6COMMON_H__ - -#include - -void q6common_update_instance_id_support(bool supported); -bool q6common_is_instance_id_supported(void); -int q6common_pack_pp_params(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size); -int q6common_pack_pp_params_v2(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size, - bool iid_supported); -#endif /* __Q6COMMON_H__ */ diff --git a/techpack/audio/4.0/include/dsp/q6core.h b/techpack/audio/4.0/include/dsp/q6core.h deleted file mode 100644 index 210471cd2d15..000000000000 --- a/techpack/audio/4.0/include/dsp/q6core.h +++ /dev/null @@ -1,310 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __Q6CORE_H__ -#define __Q6CORE_H__ -#include -#include - - - -#define AVCS_CMD_ADSP_EVENT_GET_STATE 0x0001290C -#define AVCS_CMDRSP_ADSP_EVENT_GET_STATE 0x0001290D -#define AVCS_API_VERSION_V4 4 -#define APRV2_IDS_SERVICE_ID_ADSP_CORE_V (0x3) - -bool q6core_is_adsp_ready(void); - -int avcs_core_query_timer_offset(int64_t *av_offset, int32_t clock_id); -int q6core_get_service_version(uint32_t service_id, - struct avcs_fwk_ver_info *ver_info, - size_t size); -size_t q6core_get_fwk_version_size(uint32_t service_id); - -struct audio_uevent_data { - struct kobject kobj; - struct kobj_type ktype; -}; - -int q6core_init_uevent_data(struct audio_uevent_data *uevent_data, char *name); -void q6core_destroy_uevent_data(struct audio_uevent_data *uevent_data); -int q6core_send_uevent(struct audio_uevent_data *uevent_data, char *name); -int q6core_get_avcs_api_version_per_service(uint32_t service_id); - -#define ADSP_CMD_SET_DTS_EAGLE_DATA_ID 0x00012919 -#define DTS_EAGLE_LICENSE_ID 0x00028346 -struct adsp_dts_eagle { - struct apr_hdr hdr; - uint32_t id; - uint32_t overwrite; - uint32_t size; - char data[]; -}; -int core_dts_eagle_set(int size, char *data); -int core_dts_eagle_get(int id, int size, char *data); - -#define ADSP_CMD_SET_DOLBY_MANUFACTURER_ID 0x00012918 - -struct adsp_dolby_manufacturer_id { - struct apr_hdr hdr; - int manufacturer_id; -}; - -uint32_t core_set_dolby_manufacturer_id(int manufacturer_id); - -/* Dolby Surround1 Module License ID. This ID is used as an identifier - * for DS1 license via ADSP generic license mechanism. - * Please refer AVCS_CMD_SET_LICENSE for more details. - */ -#define DOLBY_DS1_LICENSE_ID 0x00000001 - -#define AVCS_CMD_SET_LICENSE 0x00012919 -struct avcs_cmd_set_license { - struct apr_hdr hdr; - uint32_t id; /**< A unique ID used to refer to this license */ - uint32_t overwrite; - /* 0 = do not overwrite an existing license with this id. - * 1 = overwrite an existing license with this id. - */ - uint32_t size; - /**< Size in bytes of the license data following this header. */ - /* uint8_t* data , data and padding follows this structure - * total packet size needs to be multiple of 4 Bytes - */ - -}; - -#define AVCS_CMD_GET_LICENSE_VALIDATION_RESULT 0x0001291A -struct avcs_cmd_get_license_validation_result { - struct apr_hdr hdr; - uint32_t id; /**< A unique ID used to refer to this license */ -}; - -#define AVCS_CMDRSP_GET_LICENSE_VALIDATION_RESULT 0x0001291B -struct avcs_cmdrsp_get_license_validation_result { - uint32_t result; - /* ADSP_EOK if the license validation result was successfully retrieved. - * ADSP_ENOTEXIST if there is no license with the given id. - * ADSP_ENOTIMPL if there is no validation function for a license - * with this id. - */ - uint32_t size; - /* Length in bytes of the result that follows this structure*/ -}; - -/* Set Q6 topologies */ -/* - * Registers custom topologies in the aDSP for - * use in audio, voice, AFE and LSM. - */ - - -#define AVCS_CMD_SHARED_MEM_MAP_REGIONS 0x00012924 -#define AVCS_CMDRSP_SHARED_MEM_MAP_REGIONS 0x00012925 -#define AVCS_CMD_SHARED_MEM_UNMAP_REGIONS 0x00012926 - -/* Commands the AVCS to map multiple shared memory regions with remote - * processor ID. All mapped regions must be from the same memory pool. - * - * Return: - * ADSP_EOK : SUCCESS - * ADSP_EHANDLE : Failed due to incorrect handle. - * ADSP_EBADPARAM : Failed due to bad parameters. - * - * Dependencies: - * The mem_map_handle should be obtained earlier - * using AVCS_CMD_SHARED_MEM_MAP_REGIONS with pool ID - * ADSP_MEMORY_MAP_MDF_SHMEM_4K_POOL. - */ -#define AVCS_CMD_MAP_MDF_SHARED_MEMORY 0x00012930 - -#define AVCS_CMD_REGISTER_TOPOLOGIES 0x00012923 - -/* The payload for the AVCS_CMD_REGISTER_TOPOLOGIES command */ -struct avcs_cmd_register_topologies { - struct apr_hdr hdr; - uint32_t payload_addr_lsw; - /* Lower 32 bits of the topology buffer address. */ - - uint32_t payload_addr_msw; - /* Upper 32 bits of the topology buffer address. */ - - uint32_t mem_map_handle; - /* Unique identifier for an address. - * -This memory map handle is returned by the aDSP through the - * memory map command. - * -NULL mem_map_handle is interpreted as in-band parameter - * passing. - * -Client has the flexibility to choose in-band or out-of-band. - * -Out-of-band is recommended in this case. - */ - - uint32_t payload_size; - /* Size in bytes of the valid data in the topology buffer. */ -} __packed; - - -#define AVCS_CMD_DEREGISTER_TOPOLOGIES 0x0001292a - -/* The payload for the AVCS_CMD_DEREGISTER_TOPOLOGIES command */ -struct avcs_cmd_deregister_topologies { - struct apr_hdr hdr; - uint32_t payload_addr_lsw; - /* Lower 32 bits of the topology buffer address. */ - - uint32_t payload_addr_msw; - /* Upper 32 bits of the topology buffer address. */ - - uint32_t mem_map_handle; - /* Unique identifier for an address. - * -This memory map handle is returned by the aDSP through the - * memory map command. - * -NULL mem_map_handle is interpreted as in-band parameter - * passing. - * -Client has the flexibility to choose in-band or out-of-band. - * -Out-of-band is recommended in this case. - */ - - uint32_t payload_size; - /* Size in bytes of the valid data in the topology buffer. */ - - uint32_t mode; - /* 1: Deregister selected topologies - * 2: Deregister all topologies - */ -} __packed; - -#define AVCS_MODE_DEREGISTER_ALL_CUSTOM_TOPOLOGIES 2 - -#define AVCS_CMD_LOAD_TOPO_MODULES 0x0001296C - -#define AVCS_CMD_UNLOAD_TOPO_MODULES 0x0001296D - -#define CORE_LOAD_TOPOLOGY 0 - -#define CORE_UNLOAD_TOPOLOGY 1 - -struct avcs_cmd_load_unload_topo_modules { - struct apr_hdr hdr; - uint32_t topology_id; -} __packed; - -/* This command allows a remote client(HLOS) creates a client to LPASS NPA - * resource node. Currently, this command supports only the NPA Sleep resource - * "/island/core/drivers" node ID. - */ -#define AVCS_CMD_CREATE_LPASS_NPA_CLIENT 0x00012985 - -#define AVCS_SLEEP_ISLAND_CORE_DRIVER_NODE_ID 0x00000001 - -struct avcs_cmd_create_lpass_npa_client_t { - struct apr_hdr hdr; - uint32_t node_id; - /* Unique ID of the NPA node. - * @values - * - #AVCS_SLEEP_ISLAND_CORE_DRIVER_NODE_ID - */ - - char client_name[16]; - /* Client name, up to a maximum of sixteen characters.*/ -}; - -/* In response to the #AVCS_CMD_CREATE_LPASS_NPA_CLIENT command, the AVCS - * returns the handle to remote HLOS client. - */ -#define AVCS_CMDRSP_CREATE_LPASS_NPA_CLIENT 0x00012986 - -struct avcs_cmdrsp_create_lpass_npa_client_t { - uint32_t status; - /* Status message (error code). - * @values - * - ADSP_EOK -- Create was successful - * - ADSP_EFAILED -- Create failed - */ - - uint32_t client_handle; - /* Handle of the client.*/ -}; - -/* The remote HLOS client use this command to issue the request to the npa - * resource. Remote client(HLOS) must send the valid npa client handle and - * resource id info. - */ -#define AVCS_CMD_REQUEST_LPASS_NPA_RESOURCES 0x00012987 - -#define AVCS_SLEEP_NODE_ISLAND_TRANSITION_RESOURCE_ID 0x00000001 - -#define SLEEP_RESTRICT_ISLAND 0x0 -#define SLEEP_ALLOW_ISLAND 0x1 - -/* Immediately following this structure is the resource request configuration - * data payload. Payload varies depend on the resource_id requested. - * Currently supported only island transition payload. - */ -struct avcs_cmd_request_lpass_npa_resources_t { - struct apr_hdr hdr; - uint32_t client_handle; - /* Handle of the client. - * @values - * - Valid uint32 number - */ - - uint32_t resource_id; - /* Unique ID of the NPA resource ID. - * @values - * - #AVCS_SLEEP_NODE_ISLAND_TRANSITION_RESOURCE_ID - */ -}; - -/* This structure contains the sleep node resource payload data. - */ -struct avcs_sleep_node_island_transition_config_t { - struct avcs_cmd_request_lpass_npa_resources_t req_lpass_npa_rsc; - uint32_t island_allow_mode; - /* Specifies the island state. - * @values - * - #SLEEP_RESTRICT_ISLAND - * - #SLEEP_ALLOW_ISLAND - */ -}; - -/* This command allows remote client(HLOS) to destroy the npa node client - * handle, which is created using the #AVCS_CMD_CREATE_LPASS_NPA_CLIENT command. - * Remote client(HLOS) must send the valid npa client handle. - */ -#define AVCS_CMD_DESTROY_LPASS_NPA_CLIENT 0x00012988 - -struct avcs_cmd_destroy_lpass_npa_client_t { - struct apr_hdr hdr; - uint32_t client_handle; - /* Handle of the client. - * @values - * - Valid uint32 number - */ -}; - -int q6core_map_memory_regions(phys_addr_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt, uint32_t *map_handle); -int q6core_memory_unmap_regions(uint32_t mem_map_handle); - -int q6core_map_mdf_memory_regions(uint64_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt, uint32_t *map_handle); - -int q6core_map_mdf_shared_memory(uint32_t map_handle, uint64_t *buf_add, - uint32_t proc_id, uint32_t *bufsz, uint32_t bufcnt); - -int32_t core_set_license(uint32_t key, uint32_t module_id); -int32_t core_get_license_status(uint32_t module_id); - -int32_t q6core_load_unload_topo_modules(uint32_t topology_id, - bool preload_type); - -int q6core_create_lpass_npa_client(uint32_t node_id, char *client_name, - uint32_t *client_handle); -int q6core_destroy_lpass_npa_client(uint32_t client_handle); -int q6core_request_island_transition(uint32_t client_handle, - uint32_t island_allow_mode); - -#endif /* __Q6CORE_H__ */ diff --git a/techpack/audio/4.0/include/dsp/q6lsm.h b/techpack/audio/4.0/include/dsp/q6lsm.h deleted file mode 100644 index 02897d98e06d..000000000000 --- a/techpack/audio/4.0/include/dsp/q6lsm.h +++ /dev/null @@ -1,304 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. - */ -#ifndef __Q6LSM_H__ -#define __Q6LSM_H__ - -#include -#include -#include -#include -#include - -#define MAX_NUM_CONFIDENCE 20 - -#define ADM_LSM_PORT_ID 0xADCB - -#define LSM_MAX_NUM_CHANNELS 8 -#define LSM_V3P0_MAX_NUM_CHANNELS 9 - -#define LSM_API_VERSION_V3 3 - -#define MAX_LSM_SESSIONS 8 - -typedef void (*lsm_app_cb)(uint32_t opcode, uint32_t token, - uint32_t *payload, uint16_t client_size, void *priv); - -struct lsm_sound_model { - dma_addr_t phys; - void *data; - size_t size; /* size of buffer */ - uint32_t actual_size; /* actual number of bytes read by DSP */ - struct dma_buf *dma_buf; - uint32_t mem_map_handle; -}; - -struct snd_lsm_event_status_v2 { - uint16_t status; - uint16_t payload_size; - uint8_t confidence_value[0]; -}; - -struct lsm_lab_buffer { - dma_addr_t phys; - void *data; - size_t size; - struct dma_buf *dma_buf; - uint32_t mem_map_handle; -}; - -struct lsm_hw_params { - u16 sample_rate; - u16 sample_size; - u32 buf_sz; - u32 period_count; - u16 num_chs; -}; - -struct lsm_cal_data_info { - dma_addr_t phys; - void *data; - size_t size; - struct dma_buf *dma_buf; - uint32_t mem_map_handle; -}; - -struct lsm_stage_config { - uint32_t app_type; - uint32_t topology_id; - bool lpi_enable; - bool lab_enable; - struct lsm_sound_model sound_model; - struct lsm_cal_data_info cal_info; -}; - - -struct lsm_client { - int session; - lsm_app_cb cb; - atomic_t cmd_state; - void *priv; - struct apr_svc *apr; - struct apr_svc *mmap_apr; - struct mutex cmd_lock; - wait_queue_head_t cmd_wait; - uint32_t cmd_err_code; - uint16_t mode; - uint16_t connect_to_port; - uint8_t num_confidence_levels; - uint8_t *confidence_levels; - bool opened; - bool started; - uint32_t app_id; - bool lab_enable; - bool lab_started; - struct lsm_lab_buffer *lab_buffer; - struct lsm_hw_params out_hw_params; - struct lsm_hw_params in_hw_params; - bool use_topology; - int session_state; - bool poll_enable; - int perf_mode; - uint32_t event_mode; - uint32_t event_type; - uint32_t num_stages; - struct lsm_stage_config stage_cfg[LSM_MAX_STAGES_PER_SESSION]; - uint64_t fe_id; - uint16_t unprocessed_data; -}; - -struct lsm_stream_cmd_open_tx { - struct apr_hdr hdr; - uint16_t app_id; - uint16_t reserved; - uint32_t sampling_rate; -} __packed; - -struct lsm_stream_cmd_open_tx_v2 { - struct apr_hdr hdr; - uint32_t topology_id; -} __packed; - -struct lsm_stream_stage_info { - uint32_t topology_id; - uint32_t island_enable; -} __packed; - -struct lsm_stream_cmd_open_tx_v3 { - struct apr_hdr hdr; - uint32_t num_stages; - struct lsm_stream_stage_info stage_info[0]; -} __packed; - -struct lsm_custom_topologies { - struct apr_hdr hdr; - uint32_t data_payload_addr_lsw; - uint32_t data_payload_addr_msw; - uint32_t mem_map_handle; - uint32_t buffer_size; -} __packed; - -struct lsm_session_cmd_set_params_v2 { - struct apr_hdr apr_hdr; - uint32_t payload_size; - struct mem_mapping_hdr mem_hdr; - u32 param_data[0]; -} __packed; - -struct lsm_session_cmd_set_params_v3 { - struct apr_hdr apr_hdr; - struct mem_mapping_hdr mem_hdr; - uint32_t payload_size; - u32 param_data[0]; -} __packed; - -struct lsm_param_op_mode { - uint32_t minor_version; - uint16_t mode; - uint16_t reserved; -} __packed; - -struct lsm_param_connect_to_port { - uint32_t minor_version; - /* AFE port id that receives voice wake up data */ - uint16_t port_id; - uint16_t unprocessed_data; -} __packed; - -struct lsm_param_poll_enable { - uint32_t minor_version; - /* indicates to voice wakeup that HW MAD/SW polling is enabled or not */ - uint32_t polling_enable; -} __packed; - -struct lsm_param_fwk_mode_cfg { - uint32_t minor_version; - uint32_t mode; -} __packed; - -struct lsm_param_media_fmt { - uint32_t minor_version; - uint32_t sample_rate; - uint16_t num_channels; - uint16_t bit_width; - uint8_t channel_mapping[LSM_MAX_NUM_CHANNELS]; -} __packed; - -struct lsm_param_media_fmt_v2 { - uint32_t minor_version; - uint32_t sample_rate; - uint16_t bit_width; - uint16_t num_channels; - uint8_t channel_mapping[0]; -} __packed; - - -struct lsm_param_confidence_levels { - uint8_t num_confidence_levels; - uint8_t confidence_levels[0]; -} __packed; - -struct lsm_param_epd_thres { - uint32_t minor_version; - uint32_t epd_begin; - uint32_t epd_end; -} __packed; - -struct lsm_param_gain { - uint32_t minor_version; - uint16_t gain; - uint16_t reserved; -} __packed; - -struct lsm_cmd_reg_snd_model { - struct apr_hdr hdr; - uint32_t model_size; - uint32_t model_addr_lsw; - uint32_t model_addr_msw; - uint32_t mem_map_handle; -} __packed; - -struct lsm_param_lab_enable { - uint16_t enable; - uint16_t reserved; -} __packed; - -struct lsm_param_lab_config { - uint32_t minor_version; - uint32_t wake_up_latency_ms; -} __packed; - -struct lsm_param_lab_out_ch_cfg { - uint32_t minor_version; - uint32_t num_channels; - uint8_t channel_indices[0]; -} __packed; - -struct lsm_cmd_read { - struct apr_hdr hdr; - uint32_t buf_addr_lsw; - uint32_t buf_addr_msw; - uint32_t mem_map_handle; - uint32_t buf_size; -} __packed; - -struct lsm_cmd_read_done { - struct apr_hdr hdr; - uint32_t status; - uint32_t buf_addr_lsw; - uint32_t buf_addr_msw; - uint32_t mem_map_handle; - uint32_t total_size; - uint32_t offset; - uint32_t timestamp_lsw; - uint32_t timestamp_msw; - uint32_t flags; -} __packed; - -struct lsm_param_det_event_type { - uint32_t minor_version; - uint32_t event_type; - uint32_t mode; -} __packed; - -struct lsm_client *q6lsm_client_alloc(lsm_app_cb cb, void *priv); -void q6lsm_client_free(struct lsm_client *client); -int q6lsm_open(struct lsm_client *client, uint16_t app_id); -int q6lsm_start(struct lsm_client *client, bool wait); -int q6lsm_stop(struct lsm_client *client, bool wait); -int q6lsm_snd_model_buf_alloc(struct lsm_client *client, size_t len, - struct lsm_params_info_v2 *p_info); -int q6lsm_snd_model_buf_free(struct lsm_client *client, - struct lsm_params_info_v2 *p_info); -int q6lsm_close(struct lsm_client *client); -int q6lsm_register_sound_model(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure); -int q6lsm_set_data(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure); -int q6lsm_deregister_sound_model(struct lsm_client *client); -void set_lsm_port(int lsm_port); -int get_lsm_port(void); -int q6lsm_lab_control(struct lsm_client *client, u32 enable, - struct lsm_params_info_v2 *p_info); -int q6lsm_stop_lab(struct lsm_client *client); -int q6lsm_read(struct lsm_client *client, struct lsm_cmd_read *read); -int q6lsm_lab_buffer_alloc(struct lsm_client *client, bool alloc); -int q6lsm_set_one_param(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, void *data, - uint32_t param_type); -void q6lsm_sm_set_param_data(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, - size_t *offset); -int q6lsm_set_port_connected(struct lsm_client *client); -int q6lsm_set_fwk_mode_cfg(struct lsm_client *client, uint32_t event_mode); -int q6lsm_set_media_fmt_params(struct lsm_client *client); -int q6lsm_set_media_fmt_v2_params(struct lsm_client *client); -int q6lsm_lab_out_ch_cfg(struct lsm_client *client, u8 *ch_map, - struct lsm_params_info_v2 *p_info); -bool q6lsm_adsp_supports_multi_stage_detection(void); -int q6lsm_set_afe_data_format(uint64_t fe_id, uint16_t afe_data_format); -void q6lsm_get_afe_data_format(uint64_t fe_id, uint16_t *afe_data_format); -#endif /* __Q6LSM_H__ */ diff --git a/techpack/audio/4.0/include/dsp/q6voice.h b/techpack/audio/4.0/include/dsp/q6voice.h deleted file mode 100644 index 35ace4eed388..000000000000 --- a/techpack/audio/4.0/include/dsp/q6voice.h +++ /dev/null @@ -1,2149 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - */ -#ifndef __QDSP6VOICE_H__ -#define __QDSP6VOICE_H__ - -#include -#include -#include -#include -#include - -#define MAX_VOC_PKT_SIZE 642 -#define SESSION_NAME_LEN 20 -#define NUM_OF_MEMORY_BLOCKS 1 -#define NUM_OF_BUFFERS 2 -#define VSS_NUM_CHANNELS_MAX 32 -#define VSS_CHANNEL_MAPPING_SIZE (sizeof(uint8_t) * VSS_NUM_CHANNELS_MAX) -/* - * BUFFER BLOCK SIZE based on - * the supported page size - */ -#define BUFFER_BLOCK_SIZE 4096 - -#define MAX_COL_INFO_SIZE 324 - -#define VOC_REC_UPLINK 0x00 -#define VOC_REC_DOWNLINK 0x01 -#define VOC_REC_BOTH 0x02 - -#define VSS_IVERSION_CMD_GET 0x00011378 -#define VSS_IVERSION_RSP_GET 0x00011379 -#define CVD_VERSION_STRING_MAX_SIZE 31 -#define CVD_VERSION_DEFAULT "" -#define CVD_VERSION_0_0 "0.0" -#define CVD_VERSION_2_1 "2.1" -#define CVD_VERSION_2_2 "2.2" -#define CVD_VERSION_2_3 "2.3" -#define CVD_VERSION_2_4 "2.4" - -#define CVD_INT_VERSION_DEFAULT 0 -#define CVD_INT_VERSION_0_0 1 -#define CVD_INT_VERSION_2_1 2 -#define CVD_INT_VERSION_2_2 3 -#define CVD_INT_VERSION_2_3 4 -#define CVD_INT_VERSION_2_4 5 -#define CVD_INT_VERSION_LAST CVD_INT_VERSION_2_4 -#define CVD_INT_VERSION_MAX (CVD_INT_VERSION_LAST + 1) - -struct cvd_version_table { - char cvd_ver[CVD_VERSION_STRING_MAX_SIZE]; - int cvd_ver_int; -}; - -int voc_get_cvd_version(char *cvd_version); - -/* Payload structure for the VSS_IVERSION_RSP_GET command response */ -struct vss_iversion_rsp_get_t { - char version[CVD_VERSION_STRING_MAX_SIZE]; - /* NULL-terminated version string */ -}; - -enum { - CVP_VOC_RX_TOPOLOGY_CAL = 0, - CVP_VOC_TX_TOPOLOGY_CAL, - CVP_VOCPROC_CAL, - CVP_VOCVOL_CAL, - CVP_VOCDEV_CFG_CAL, - CVP_VOCPROC_COL_CAL, - CVP_VOCVOL_COL_CAL, - CVS_VOCSTRM_CAL, - CVS_VOCSTRM_COL_CAL, - VOICE_RTAC_INFO_CAL, - VOICE_RTAC_APR_CAL, - MAX_VOICE_CAL_TYPES -}; - -struct voice_header { - uint32_t id; - uint32_t data_len; -}; - -struct voice_init { - struct voice_header hdr; - void *cb_handle; -}; - -/* Stream information payload structure */ -struct stream_data { - uint32_t stream_mute; - uint32_t stream_mute_ramp_duration_ms; -}; - -/* Device information payload structure */ -struct device_data { - uint32_t dev_mute; - uint32_t sample_rate; - uint16_t bits_per_sample; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; - uint32_t enabled; - uint32_t dev_id; - uint32_t port_id; - uint32_t volume_step_value; - uint32_t volume_ramp_duration_ms; - uint32_t dev_mute_ramp_duration_ms; - uint32_t no_of_channels; -}; - -/* - * Format information structure to match - * vss_param_endpoint_media_format_info_t - */ -struct media_format_info { - uint32_t port_id; - uint16_t num_channels; - uint16_t bits_per_sample; - uint32_t sample_rate; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -}; - -enum { - VOC_GENERIC_SET_PARAM_TOKEN = 0, - VOC_RTAC_SET_PARAM_TOKEN, - VOC_SET_MEDIA_FORMAT_PARAM_TOKEN, - VOC_SET_PARAM_TOKEN_MAX -}; - -struct voice_dev_route_state { - u16 rx_route_flag; - u16 tx_route_flag; -}; - -struct voice_rec_route_state { - u16 ul_flag; - u16 dl_flag; -}; - -enum { - VOC_INIT = 0, - VOC_RUN, - VOC_CHANGE, - VOC_RELEASE, - VOC_ERROR, - VOC_STANDBY, -}; - -struct mem_buffer { - dma_addr_t phys; - void *data; - uint32_t size; /* size of buffer */ -}; - -struct share_mem_buf { - struct dma_buf *dma_buf; - struct mem_buffer buf[NUM_OF_BUFFERS]; -}; - -struct mem_map_table { - dma_addr_t phys; - void *data; - size_t size; /* size of buffer */ - struct dma_buf *dma_buf; -}; - -/* Common */ -#define VSS_ICOMMON_CMD_SET_UI_PROPERTY 0x00011103 -#define VSS_ICOMMON_CMD_SET_UI_PROPERTY_V2 0x00013248 -/* Set a UI property */ -#define VSS_ICOMMON_CMD_MAP_MEMORY 0x00011025 -#define VSS_ICOMMON_CMD_UNMAP_MEMORY 0x00011026 -/* General shared memory; byte-accessible, 4 kB-aligned. */ -#define VSS_ICOMMON_MAP_MEMORY_SHMEM8_4K_POOL 3 - -struct vss_icommon_cmd_map_memory_t { - uint32_t phys_addr; - /* Physical address of a memory region; must be at least - * 4 kB aligned. - */ - - uint32_t mem_size; - /* Number of bytes in the region; should be a multiple of 32. */ - - uint16_t mem_pool_id; - /* Type of memory being provided. The memory ID implicitly defines - * the characteristics of the memory. The characteristics might include - * alignment type, permissions, etc. - * Memory pool ID. Possible values: - * 3 -- VSS_ICOMMON_MEM_TYPE_SHMEM8_4K_POOL. - */ -} __packed; - -struct vss_icommon_cmd_unmap_memory_t { - uint32_t phys_addr; - /* Physical address of a memory region; must be at least - * 4 kB aligned. - */ -} __packed; - -struct vss_map_memory_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_map_memory_t vss_map_mem; -} __packed; - -struct vss_unmap_memory_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_unmap_memory_t vss_unmap_mem; -} __packed; - -struct vss_param_endpoint_media_format_info { - /* AFE port ID to which this media format corresponds to. */ - uint32_t port_id; - /* - * Number of channels of data. - * Supported values: 1 to 8 - */ - uint16_t num_channels; - /* - * Bits per sample of data. - * Supported values: 16 and 24 - */ - uint16_t bits_per_sample; - /* - * Sampling rate in Hz. - * Supported values: 8000, 11025, 16000, 22050, 24000, 32000, - * 44100, 48000, 88200, 96000, 176400, and 192000 - */ - uint32_t sample_rate; - /* - * The channel[i] mapping describes channel i. Each element i - * of the array describes channel i inside the data buffer. An - * unused or unknown channel is set to 0. - */ - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -} __packed; - -struct vss_param_vocproc_dev_channel_info_t { - uint32_t num_channels; - uint32_t bits_per_sample; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -} __packed; - -struct vss_param_channel_mixer_info_t { - uint32_t index; - uint16_t num_output_channels; - uint16_t num_input_channels; - uint16_t out_channel_map[2]; - uint16_t in_channel_map[1]; - uint16_t channel_weight_coeff[2][1]; - uint16_t reserved; -} __packed; - -struct vss_param_mfc_config_info_t { - uint32_t sample_rate; - uint16_t bits_per_sample; - uint16_t num_channels; - uint16_t channel_type[VSS_NUM_CHANNELS_MAX]; -} __packed; - -struct vss_icommon_param_data_channel_info_v2_t { - /* Valid ID of the module. */ - uint32_t module_id; - /* Valid ID of the parameter. */ - uint32_t param_id; - /* - * Data size of the structure relating to the param_id/module_id - * combination in uint8_t bytes. - */ - uint16_t param_size; - /* This field must be set to zero. */ - uint16_t reserved; - struct vss_param_vocproc_dev_channel_info_t channel_info; -} __packed; - -struct vss_icommon_cmd_set_param_channel_info_v2_t { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; - /* Size of the parameter data payload in bytes. */ - uint32_t mem_size; - struct vss_icommon_param_data_channel_info_v2_t param_data; -} __packed; - -struct vss_icommon_param_data_ch_mixer_v2_t { - /* Valid ID of the module. */ - uint32_t module_id; - /* Valid ID of the parameter. */ - uint32_t param_id; - /* - * Data size of the structure relating to the param_id/module_id - * combination in uint8_t bytes. - */ - uint16_t param_size; - /* This field must be set to zero. */ - uint16_t reserved; - struct vss_param_channel_mixer_info_t ch_mixer_info; -} __packed; - -struct vss_icommon_param_data_ecns_t { - /* Valid ID of the module. */ - uint32_t module_id; - /* Valid ID of the parameter. */ - uint32_t param_id; - /* - * Data size of the structure relating to the param_id/module_id - * combination in uint8_t bytes. - */ - uint16_t param_size; - /* This field must be set to zero. */ - uint16_t reserved; - uint32_t enable; -} __packed; - -struct vss_icommon_cmd_set_param_ch_mixer_v2_t { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; - /* Size of the parameter data payload in bytes. */ - uint32_t mem_size; - - struct vss_icommon_param_data_ch_mixer_v2_t param_data; -} __packed; - - -struct vss_icommon_cmd_set_ecns_enable_t { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; - /* Size of the parameter data payload in bytes. */ - uint32_t mem_size; - - struct vss_icommon_param_data_ecns_t param_data; -} __packed; - -struct vss_icommon_param_data_mfc_config_v2_t { - /* Valid ID of the module. */ - uint32_t module_id; - /* Valid ID of the parameter. */ - uint32_t param_id; - /* - * Data size of the structure relating to the param_id/module_id - * combination in uint8_t bytes. - */ - uint16_t param_size; - /* This field must be set to zero. */ - uint16_t reserved; - struct vss_param_mfc_config_info_t mfc_config_info; -} __packed; - -struct vss_icommon_cmd_set_param_mfc_config_v2_t { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; - /* Size of the parameter data payload in bytes. */ - uint32_t mem_size; - - struct vss_icommon_param_data_mfc_config_v2_t param_data; -} __packed; - -struct vss_icommon_mem_mapping_hdr { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; -} __packed; - -struct vss_icommon_cmd_set_param { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending outband */ - struct vss_icommon_mem_mapping_hdr mem_hdr; - - /* Size of the parameter data payload in bytes. */ - uint32_t payload_size; - - /* - * Parameter data payload when inband. Should have size param_size. - * Bit size of payload must be a multiple of 4. - */ - uint8_t param_data[0]; -} __packed; - -/* TO MVM commands */ -#define VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION 0x000110FF -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL 0x00011327 -/* - * VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL - * Description: This command is required to let MVM know - * who is in control of session. - * Payload: Defined by vss_imvm_cmd_set_policy_dual_control_t. - * Result: Wait for APRV2_IBASIC_RSP_RESULT response. - */ - -#define VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION 0x000110FE -/* Create a new full control MVM session. */ - -#define APRV2_IBASIC_CMD_DESTROY_SESSION 0x0001003C -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_ATTACH_STREAM 0x0001123C -/* Attach a stream to the MVM. */ - -#define VSS_IMVM_CMD_DETACH_STREAM 0x0001123D -/* Detach a stream from the MVM. */ - -#define VSS_IMVM_CMD_ATTACH_VOCPROC 0x0001123E -/* Attach a vocproc to the MVM. The MVM will symmetrically connect this vocproc - * to all the streams currently attached to it. - */ - -#define VSS_IMVM_CMD_DETACH_VOCPROC 0x0001123F -/* Detach a vocproc from the MVM. The MVM will symmetrically disconnect this - * vocproc from all the streams to which it is currently attached. - */ - -#define VSS_IMVM_CMD_START_VOICE 0x00011190 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_STANDBY_VOICE 0x00011191 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_STOP_VOICE 0x00011192 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_PAUSE_VOICE 0x0001137D -/* No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ISTREAM_CMD_ATTACH_VOCPROC 0x000110F8 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ISTREAM_CMD_DETACH_VOCPROC 0x000110F9 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - - -#define VSS_ISTREAM_CMD_SET_TTY_MODE 0x00011196 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ICOMMON_CMD_SET_NETWORK 0x0001119C -/* Set the network type. */ - -#define VSS_ICOMMON_CMD_SET_VOICE_TIMING 0x000111E0 -/* Set the voice timing parameters. */ - -#define VSS_IMEMORY_CMD_MAP_PHYSICAL 0x00011334 -#define VSS_IMEMORY_RSP_MAP 0x00011336 -#define VSS_IMEMORY_CMD_UNMAP 0x00011337 -#define VSS_IMVM_CMD_SET_CAL_NETWORK 0x0001137A -#define VSS_IMVM_CMD_SET_CAL_MEDIA_TYPE 0x0001137B -#define VSS_IHDVOICE_CMD_ENABLE 0x000130A2 -#define VSS_IHDVOICE_CMD_DISABLE 0x000130A3 - -/* To listen for events from MVM module */ -#define VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS 0x00012E56 -/* To cancel listening for events from MVM module */ -#define VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS 0x00012E57 -/* To receive ongoing voice activity notification */ -#define VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE 0x000131EF -/* Voice activity notification from MVM */ -#define VSS_ICOMMON_EVT_VOICE_ACTIVITY_UPDATE 0x000131F0 -/* Mic path is broken. */ -#define VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK 0x000131F3 -/* Mic path is restored. */ -#define VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK 0x000131F4 - -enum msm_audio_voc_rate { - VOC_0_RATE, /* Blank frame */ - VOC_8_RATE, /* 1/8 rate */ - VOC_4_RATE, /* 1/4 rate */ - VOC_2_RATE, /* 1/2 rate */ - VOC_1_RATE, /* Full rate */ - VOC_8_RATE_NC /* Noncritical 1/8 rate */ -}; - -struct vss_istream_cmd_set_tty_mode_t { - uint32_t mode; - /**< - * TTY mode. - * - * 0 : TTY disabled - * 1 : HCO - * 2 : VCO - * 3 : FULL - */ -} __packed; - -struct vss_istream_cmd_attach_vocproc_t { - uint16_t handle; - /**< Handle of vocproc being attached. */ -} __packed; - -struct vss_istream_cmd_detach_vocproc_t { - uint16_t handle; - /**< Handle of vocproc being detached. */ -} __packed; - -struct vss_imvm_cmd_attach_stream_t { - uint16_t handle; - /* The stream handle to attach. */ -} __packed; - -struct vss_imvm_cmd_detach_stream_t { - uint16_t handle; - /* The stream handle to detach. */ -} __packed; - -struct vss_icommon_cmd_set_network_t { - uint32_t network_id; - /* Network ID. (Refer to VSS_NETWORK_ID_XXX). */ -} __packed; - -struct vss_icommon_cmd_set_voice_timing_t { - uint16_t mode; - /* - * The vocoder frame synchronization mode. - * - * 0 : No frame sync. - * 1 : Hard VFR (20ms Vocoder Frame Reference interrupt). - */ - uint16_t enc_offset; - /* - * The offset in microseconds from the VFR to deliver a Tx vocoder - * packet. The offset should be less than 20000us. - */ - uint16_t dec_req_offset; - /* - * The offset in microseconds from the VFR to request for an Rx vocoder - * packet. The offset should be less than 20000us. - */ - uint16_t dec_offset; - /* - * The offset in microseconds from the VFR to indicate the deadline to - * receive an Rx vocoder packet. The offset should be less than 20000us. - * Rx vocoder packets received after this deadline are not guaranteed to - * be processed. - */ -} __packed; - -struct vss_imvm_cmd_create_control_session_t { - char name[SESSION_NAME_LEN]; - /* - * A variable-sized stream name. - * - * The stream name size is the payload size minus the size of the other - * fields. - */ -} __packed; - - -struct vss_imvm_cmd_set_policy_dual_control_t { - bool enable_flag; - /* Set to TRUE to enable modem state machine control */ -} __packed; - -struct mvm_attach_vocproc_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_attach_vocproc_t mvm_attach_cvp_handle; -} __packed; - -struct mvm_detach_vocproc_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_detach_vocproc_t mvm_detach_cvp_handle; -} __packed; - -struct mvm_create_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_create_control_session_t mvm_session; -} __packed; - -struct mvm_modem_dual_control_session_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_set_policy_dual_control_t voice_ctl; -} __packed; - -struct mvm_set_tty_mode_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_tty_mode_t tty_mode; -} __packed; - -struct mvm_attach_stream_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_attach_stream_t attach_stream; -} __packed; - -struct mvm_detach_stream_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_detach_stream_t detach_stream; -} __packed; - -struct mvm_set_network_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_network_t network; -} __packed; - -struct mvm_set_voice_timing_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_voice_timing_t timing; -} __packed; - -struct mvm_set_hd_enable_cmd { - struct apr_hdr hdr; -} __packed; - -struct vss_imemory_table_descriptor_t { - uint32_t mem_address_lsw; - uint32_t mem_address_msw; - /* - * Base physical address of the table. The address must be aligned - * to LCM( cache_line_size, page_align, max_data_width ), where the - * attributes are specified in #VSS_IMEMORY_CMD_MAP_PHYSICAL, and - * LCM = Least Common Multiple. The table at the address must have - * the format specified by #vss_imemory_table_t. - */ - uint32_t mem_size; - /* Size in bytes of the table. */ -} __packed; - -struct vss_imemory_block_t { - uint64_t mem_address; - /* - * Base address of the memory block. The address is virtual for virtual - * memory and physical for physical memory. The address must be aligned - * to LCM( cache_line_size, page_align, max_data_width ), where the - * attributes are specified in VSS_IMEMORY_CMD_MAP_VIRTUAL or - * VSS_IMEMORY_CMD_MAP_PHYSICAL, and LCM = Least Common Multiple. - */ - uint32_t mem_size; - /* - * Size in bytes of the memory block. The size must be multiple of - * page_align, where page_align is specified in - * VSS_IMEMORY_CMD_MAP_VIRTUAL or #VSS_IMEMORY_CMD_MAP_PHYSICAL. - */ -} __packed; - -struct vss_imemory_table_t { - struct vss_imemory_table_descriptor_t next_table_descriptor; - /* - * Specifies the next table. If there is no next table, - * set the size of the table to 0 and the table address is ignored. - */ - struct vss_imemory_block_t blocks[NUM_OF_MEMORY_BLOCKS]; - /* Specifies one ore more memory blocks. */ -} __packed; - -struct vss_imemory_cmd_map_physical_t { - struct apr_hdr hdr; - struct vss_imemory_table_descriptor_t table_descriptor; - bool is_cached; - /* - * Indicates cached or uncached memory. Supported values: - * TRUE - Cached. - */ - uint16_t cache_line_size; - /* Cache line size in bytes. Supported values: 128 */ - uint32_t access_mask; - /* - * CVD's access permission to the memory while it is mapped. - * Supported values: - * bit 0 - If set, the memory is readable. - * bit 1 - If set, the memory is writable. - */ - uint32_t page_align; - /* Page frame alignment in bytes. Supported values: 4096 */ - uint8_t min_data_width; - /* - * Minimum native data type width in bits that can be accessed. - * Supported values: 8 - */ - uint8_t max_data_width; - /* - * Maximum native data type width in bits that can be accessed. - * Supported values: 64 - */ -} __packed; - -struct vss_imvm_cmd_set_cal_network_t { - struct apr_hdr hdr; - uint32_t network_id; -} __packed; - -struct vss_imvm_cmd_set_cal_media_type_t { - struct apr_hdr hdr; - uint32_t media_id; -} __packed; - -struct vss_imemory_cmd_unmap_t { - struct apr_hdr hdr; - uint32_t mem_handle; -} __packed; - -/* - * Payload structure for VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS and - * VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS commands. - */ -struct vss_inotify_cmd_event_class_t { - struct apr_hdr hdr; - /* Event class ID to listen for. */ - uint32_t class_id; -} __packed; - -/* Payload structure for the VSS_ICOMMOM_EVT_VOICE_ACTIVITY_UPDATE event. */ -struct vss_evt_voice_activity { - uint32_t activity; - /* - * Specifies the voice acitivity. - * @values - * #VSS_ICOMMON_VOICE_ACTIVITY_VPTX_MUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_VPTX_UNMUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK - * #VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_STREAM_TX_MUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_STREAM_TX_UNMUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_VOCPROC_TX_MUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_VOCPROC_TX_UNMUTE - */ -} __packed; - -/* TO CVS commands */ -#define VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION 0x00011140 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION 0x000110F7 -/* Create a new full control stream session. */ - -#define APRV2_IBASIC_CMD_DESTROY_SESSION 0x0001003C - -/* - * This command changes the mute setting. The new mute setting will - * be applied over the specified ramp duration. - */ -#define VSS_IVOLUME_CMD_MUTE_V2 0x0001138B - -#define VSS_ISTREAM_CMD_REGISTER_CALIBRATION_DATA_V2 0x00011369 - -#define VSS_ISTREAM_CMD_DEREGISTER_CALIBRATION_DATA 0x0001127A - -#define VSS_ISTREAM_CMD_REGISTER_STATIC_CALIBRATION_DATA 0x0001307D -#define VSS_ISTREAM_CMD_DEREGISTER_STATIC_CALIBRATION_DATA 0x0001307E - -#define VSS_ISTREAM_CMD_SET_MEDIA_TYPE 0x00011186 -/* Set media type on the stream. */ - -#define VSS_ISTREAM_EVT_SEND_ENC_BUFFER 0x00011015 -/* Event sent by the stream to its client to provide an encoded packet. */ - -#define VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER 0x00011017 -/* Event sent by the stream to its client requesting for a decoder packet. - * The client should respond with a VSS_ISTREAM_EVT_SEND_DEC_BUFFER event. - */ - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_REQUEST 0x0001136E - -#define VSS_ISTREAM_EVT_SEND_DEC_BUFFER 0x00011016 -/* Event sent by the client to the stream in response to a - * VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER event, providing a decoder packet. - */ - -#define VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE 0x0001113E -/* Set AMR encoder rate. */ - -#define VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE 0x0001113F -/* Set AMR-WB encoder rate. */ - -#define VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE 0x00011019 -/* Set encoder minimum and maximum rate. */ - -#define VSS_ISTREAM_CMD_SET_ENC_DTX_MODE 0x0001101D -/* Set encoder DTX mode. */ - -#define MODULE_ID_VOICE_MODULE_ST 0x00010EE3 -#define VOICE_PARAM_MOD_ENABLE 0x00010E00 -#define MOD_ENABLE_PARAM_LEN 4 - -#define VSS_IPLAYBACK_CMD_START 0x000112BD -/* Start in-call music delivery on the Tx voice path. */ - -#define VSS_IPLAYBACK_CMD_STOP 0x00011239 -/* Stop the in-call music delivery on the Tx voice path. */ - -#define VSS_IPLAYBACK_PORT_ID_DEFAULT 0x0000FFFF -/* Default AFE port ID. */ - -#define VSS_IPLAYBACK_PORT_ID_VOICE 0x00008005 -/* AFE port ID for VOICE 1. */ - -#define VSS_IPLAYBACK_PORT_ID_VOICE2 0x00008002 -/* AFE port ID for VOICE 2. */ - -#define VSS_IRECORD_CMD_START 0x000112BE -/* Start in-call conversation recording. */ -#define VSS_IRECORD_CMD_STOP 0x00011237 -/* Stop in-call conversation recording. */ - -#define VSS_IRECORD_PORT_ID_DEFAULT 0x0000FFFF -/* Default AFE port ID. */ - -#define VSS_IRECORD_TAP_POINT_NONE 0x00010F78 -/* Indicates no tapping for specified path. */ - -#define VSS_IRECORD_TAP_POINT_STREAM_END 0x00010F79 -/* Indicates that specified path should be tapped at the end of the stream. */ - -#define VSS_IRECORD_MODE_TX_RX_STEREO 0x00010F7A -/* Select Tx on left channel and Rx on right channel. */ - -#define VSS_IRECORD_MODE_TX_RX_MIXING 0x00010F7B -/* Select mixed Tx and Rx paths. */ - -#define VSS_PARAM_VOCPROC_TX_CHANNEL_INFO 0x0001328E - -#define VSS_PARAM_VOCPROC_RX_CHANNEL_INFO 0x0001328F - -#define VSS_PARAM_VOCPROC_EC_REF_CHANNEL_INFO 0x00013290 - -#define VSS_PARAM_TX_PORT_ENDPOINT_MEDIA_INFO 0x00013253 - -#define VSS_PARAM_RX_PORT_ENDPOINT_MEDIA_INFO 0x00013254 - -#define VSS_PARAM_EC_REF_PORT_ENDPOINT_MEDIA_INFO 0x00013255 - -#define VSS_MODULE_CVD_GENERIC 0x0001316E - -#define VSS_ISTREAM_EVT_NOT_READY 0x000110FD - -#define VSS_ISTREAM_EVT_READY 0x000110FC - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_READY 0x0001136F -/*notify dsp that decoder buffer is ready*/ - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_READY 0x0001136C -/*dsp notifying client that encoder buffer is ready*/ - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_CONSUMED 0x0001136D -/*notify dsp that encoder buffer is consumed*/ - -#define VSS_ISTREAM_CMD_SET_OOB_PACKET_EXCHANGE_CONFIG 0x0001136B - -#define VSS_ISTREAM_PACKET_EXCHANGE_MODE_INBAND 0 -/* In-band packet exchange mode. */ - -#define VSS_ISTREAM_PACKET_EXCHANGE_MODE_OUT_OF_BAND 1 -/* Out-of-band packet exchange mode. */ - -#define VSS_ISTREAM_CMD_SET_PACKET_EXCHANGE_MODE 0x0001136A - -struct vss_iplayback_cmd_start_t { - uint16_t port_id; - /* - * AFE Port ID from which the audio samples are available. - * To use the default AFE pseudo port (0x8005), set this value to - * #VSS_IPLAYBACK_PORT_ID_DEFAULT. - */ -} __packed; - -struct vss_irecord_cmd_start_t { - uint32_t rx_tap_point; - /* Tap point to use on the Rx path. Supported values are: - * VSS_IRECORD_TAP_POINT_NONE : Do not record Rx path. - * VSS_IRECORD_TAP_POINT_STREAM_END : Rx tap point is at the end of - * the stream. - */ - uint32_t tx_tap_point; - /* Tap point to use on the Tx path. Supported values are: - * VSS_IRECORD_TAP_POINT_NONE : Do not record tx path. - * VSS_IRECORD_TAP_POINT_STREAM_END : Tx tap point is at the end of - * the stream. - */ - uint16_t port_id; - /* AFE Port ID to which the conversation recording stream needs to be - * sent. Set this to #VSS_IRECORD_PORT_ID_DEFAULT to use default AFE - * pseudo ports (0x8003 for Rx and 0x8004 for Tx). - */ - uint32_t mode; - /* Recording Mode. The mode parameter value is ignored if the port_id - * is set to #VSS_IRECORD_PORT_ID_DEFAULT. - * The supported values: - * #VSS_IRECORD_MODE_TX_RX_STEREO - * #VSS_IRECORD_MODE_TX_RX_MIXING - */ -} __packed; - -struct vss_istream_cmd_create_passive_control_session_t { - char name[SESSION_NAME_LEN]; - /**< - * A variable-sized stream name. - * - * The stream name size is the payload size minus the size of the other - * fields. - */ -} __packed; - -#define VSS_IVOLUME_DIRECTION_TX 0 -#define VSS_IVOLUME_DIRECTION_RX 1 - -#define VSS_IVOLUME_MUTE_OFF 0 -#define VSS_IVOLUME_MUTE_ON 1 - -#define DEFAULT_MUTE_RAMP_DURATION 500 -#define DEFAULT_VOLUME_RAMP_DURATION 20 -#define MAX_RAMP_DURATION 5000 - -struct vss_ivolume_cmd_mute_v2_t { - uint16_t direction; - /* - * The direction field sets the direction to apply the mute command. - * The Supported values: - * VSS_IVOLUME_DIRECTION_TX - * VSS_IVOLUME_DIRECTION_RX - */ - uint16_t mute_flag; - /* - * Turn mute on or off. The Supported values: - * VSS_IVOLUME_MUTE_OFF - * VSS_IVOLUME_MUTE_ON - */ - uint16_t ramp_duration_ms; - /* - * Mute change ramp duration in milliseconds. - * The Supported values: 0 to 5000. - */ -} __packed; - -struct vss_istream_cmd_create_full_control_session_t { - uint16_t direction; - /* - * Stream direction. - * - * 0 : TX only - * 1 : RX only - * 2 : TX and RX - * 3 : TX and RX loopback - */ - uint32_t enc_media_type; - /* Tx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ - uint32_t dec_media_type; - /* Rx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ - uint32_t network_id; - /* Network ID. (Refer to VSS_NETWORK_ID_XXX). */ - char name[SESSION_NAME_LEN]; - /* - * A variable-sized stream name. - * - * The stream name size is the payload size minus the size of the other - * fields. - */ -} __packed; - -struct vss_istream_cmd_set_media_type_t { - uint32_t rx_media_id; - /* Set the Rx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ - uint32_t tx_media_id; - /* Set the Tx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ -} __packed; - -struct vss_istream_evt_send_enc_buffer_t { - uint32_t media_id; - /* Media ID of the packet. */ - uint8_t packet_data[MAX_VOC_PKT_SIZE]; - /* Packet data buffer. */ -} __packed; - -struct vss_istream_evt_send_dec_buffer_t { - uint32_t media_id; - /* Media ID of the packet. */ - uint8_t packet_data[MAX_VOC_PKT_SIZE]; - /* Packet data. */ -} __packed; - -struct vss_istream_cmd_voc_amr_set_enc_rate_t { - uint32_t mode; - /* Set the AMR encoder rate. - * - * 0x00000000 : 4.75 kbps - * 0x00000001 : 5.15 kbps - * 0x00000002 : 5.90 kbps - * 0x00000003 : 6.70 kbps - * 0x00000004 : 7.40 kbps - * 0x00000005 : 7.95 kbps - * 0x00000006 : 10.2 kbps - * 0x00000007 : 12.2 kbps - */ -} __packed; - -struct vss_istream_cmd_voc_amrwb_set_enc_rate_t { - uint32_t mode; - /* Set the AMR-WB encoder rate. - * - * 0x00000000 : 6.60 kbps - * 0x00000001 : 8.85 kbps - * 0x00000002 : 12.65 kbps - * 0x00000003 : 14.25 kbps - * 0x00000004 : 15.85 kbps - * 0x00000005 : 18.25 kbps - * 0x00000006 : 19.85 kbps - * 0x00000007 : 23.05 kbps - * 0x00000008 : 23.85 kbps - */ -} __packed; - -struct vss_istream_cmd_cdma_set_enc_minmax_rate_t { - uint16_t min_rate; - /* Set the lower bound encoder rate. - * - * 0x0000 : Blank frame - * 0x0001 : Eighth rate - * 0x0002 : Quarter rate - * 0x0003 : Half rate - * 0x0004 : Full rate - */ - uint16_t max_rate; - /* Set the upper bound encoder rate. - * - * 0x0000 : Blank frame - * 0x0001 : Eighth rate - * 0x0002 : Quarter rate - * 0x0003 : Half rate - * 0x0004 : Full rate - */ -} __packed; - -struct vss_istream_cmd_set_enc_dtx_mode_t { - uint32_t enable; - /* Toggle DTX on or off. - * - * 0 : Disables DTX - * 1 : Enables DTX - */ -} __packed; - -struct vss_istream_cmd_register_calibration_data_v2_t { - uint32_t cal_mem_handle; - /* Handle to the shared memory that holds the calibration data. */ - uint32_t cal_mem_address_lsw; - uint32_t cal_mem_address_msw; - /* Location of calibration data. */ - uint32_t cal_mem_size; - /* Size of the calibration data in bytes. */ - uint8_t column_info[MAX_COL_INFO_SIZE]; - /* - * Column info contains the number of columns and the array of columns - * in the calibration table. The order in which the columns are provided - * here must match the order in which they exist in the calibration - * table provided. - */ -} __packed; - -struct enable_param { - uint16_t enable; - uint16_t reserved_field; - /* Reserved, set to 0. */ -}; - -struct vss_icommon_cmd_set_ui_property { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The parameter data to be filled when sent inband */ - u8 param_data[0]; -} __packed; - -/* - * Event sent by the stream to the client that enables Rx DTMF - * detection whenever DTMF is detected in the Rx path. - * - * The DTMF detection feature can only be used to detect DTMF - * frequencies as listed in the vss_istream_evt_rx_dtmf_detected_t - * structure. - */ - -#define VSS_ISTREAM_EVT_RX_DTMF_DETECTED 0x0001101A - -struct vss_istream_cmd_set_rx_dtmf_detection { - /* - * Enables/disables Rx DTMF detection - * - * Possible values are - * 0 - disable - * 1 - enable - * - */ - uint32_t enable; -}; - -#define VSS_ISTREAM_CMD_SET_RX_DTMF_DETECTION 0x00011027 - -struct vss_istream_evt_rx_dtmf_detected { - uint16_t low_freq; - /* - * Detected low frequency. Possible values: - * 697 Hz - * 770 Hz - * 852 Hz - * 941 Hz - */ - uint16_t high_freq; - /* - * Detected high frequency. Possible values: - * 1209 Hz - * 1336 Hz - * 1477 Hz - * 1633 Hz - */ -}; - -struct cvs_set_rx_dtmf_detection_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_rx_dtmf_detection cvs_dtmf_det; -} __packed; - - -struct cvs_create_passive_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_create_passive_control_session_t cvs_session; -} __packed; - -struct cvs_create_full_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_create_full_control_session_t cvs_session; -} __packed; - -struct cvs_destroy_session_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvs_set_mute_cmd { - struct apr_hdr hdr; - struct vss_ivolume_cmd_mute_v2_t cvs_set_mute; -} __packed; - -struct cvs_set_media_type_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_media_type_t media_type; -} __packed; - -struct cvs_send_dec_buf_cmd { - struct apr_hdr hdr; - struct vss_istream_evt_send_dec_buffer_t dec_buf; -} __packed; - -struct cvs_set_amr_enc_rate_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_voc_amr_set_enc_rate_t amr_rate; -} __packed; - -struct cvs_set_amrwb_enc_rate_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_voc_amrwb_set_enc_rate_t amrwb_rate; -} __packed; - -struct cvs_set_cdma_enc_minmax_rate_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_cdma_set_enc_minmax_rate_t cdma_rate; -} __packed; - -struct cvs_set_enc_dtx_mode_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_enc_dtx_mode_t dtx_mode; -} __packed; - -struct cvs_register_cal_data_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_register_calibration_data_v2_t cvs_cal_data; -} __packed; - -struct cvs_deregister_cal_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvs_start_record_cmd { - struct apr_hdr hdr; - struct vss_irecord_cmd_start_t rec_mode; -} __packed; - -struct cvs_start_playback_cmd { - struct apr_hdr hdr; - struct vss_iplayback_cmd_start_t playback_mode; -} __packed; - -struct cvs_dec_buffer_ready_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvs_enc_buffer_consumed_cmd { - struct apr_hdr hdr; -} __packed; - -struct vss_istream_cmd_set_oob_packet_exchange_config_t { - struct apr_hdr hdr; - uint32_t mem_handle; - uint32_t enc_buf_addr_lsw; - uint32_t enc_buf_addr_msw; - uint32_t enc_buf_size; - uint32_t dec_buf_addr_lsw; - uint32_t dec_buf_addr_msw; - uint32_t dec_buf_size; -} __packed; - -struct vss_istream_cmd_set_packet_exchange_mode_t { - struct apr_hdr hdr; - uint32_t mode; -} __packed; - -/* TO CVP commands */ - -#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION 0x000100C3 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define APRV2_IBASIC_CMD_DESTROY_SESSION 0x0001003C - -#define VSS_IVOCPROC_CMD_SET_DEVICE_V2 0x000112C6 - -#define VSS_IVOCPROC_CMD_SET_DEVICE_V3 0x0001316A - -#define VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS 0x00013199 - -#define VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT 0x00013198 - -#define VSS_IVOCPROC_CMD_SET_VP3_DATA 0x000110EB - -#define VSS_IVOLUME_CMD_SET_STEP 0x000112C2 - -#define VSS_IVOCPROC_CMD_ENABLE 0x000100C6 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IVOCPROC_CMD_DISABLE 0x000110E1 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -/* - * Registers the memory that contains device specific configuration data with - * the vocproc. The client must register device configuration data with the - * vocproc that corresponds with the device being set on the vocproc. - */ -#define VSS_IVOCPROC_CMD_REGISTER_DEVICE_CONFIG 0x00011371 - -/* - * Deregisters the memory that holds device configuration data from the - vocproc. -*/ -#define VSS_IVOCPROC_CMD_DEREGISTER_DEVICE_CONFIG 0x00011372 - -#define CVD_CAL_DATA_FORMAT_MINOR_VERSION_V0 0x00000000 -#define CVD_CAL_DATA_FORMAT_MINOR_VERSION_V1 0x00000001 -#define VSS_IVOCPROC_CMD_REGISTER_CALIBRATION_DATA_V2 0x00011373 -#define VSS_IVOCPROC_CMD_DEREGISTER_CALIBRATION_DATA 0x00011276 - -#define VSS_IVOCPROC_CMD_REGISTER_VOL_CALIBRATION_DATA 0x00011374 -#define VSS_IVOCPROC_CMD_DEREGISTER_VOL_CALIBRATION_DATA 0x00011375 - -#define VSS_IVOCPROC_CMD_REGISTER_STATIC_CALIBRATION_DATA 0x00013079 -#define VSS_IVOCPROC_CMD_DEREGISTER_STATIC_CALIBRATION_DATA 0x0001307A - -#define VSS_IVOCPROC_CMD_REGISTER_DYNAMIC_CALIBRATION_DATA 0x0001307B -#define VSS_IVOCPROC_CMD_DEREGISTER_DYNAMIC_CALIBRATION_DATA 0x0001307C - -#define VSS_IVOCPROC_TOPOLOGY_ID_NONE 0x00010F70 -#define VSS_IVOCPROC_TOPOLOGY_ID_TX_SM_ECNS_V2 0x00010F89 -#define VSS_IVOCPROC_TOPOLOGY_ID_TX_DM_FLUENCE 0x00010F72 - -#define VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT 0x00010F77 - -/* Newtwork IDs */ -#define VSS_ICOMMON_CAL_NETWORK_ID_NONE 0x0001135E - -/* Select internal mixing mode. */ -#define VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING 0x00010F7C - -/* Select external mixing mode. */ -#define VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING 0x00010F7D - -/* Default AFE port ID. Applicable to Tx and Rx. */ -#define VSS_IVOCPROC_PORT_ID_NONE 0xFFFF - -#define VSS_NETWORK_ID_DEFAULT 0x00010037 - -/* Voice over Internet Protocol (VoIP) network ID. Common for all bands.*/ -#define VSS_NETWORK_ID_VOIP 0x00011362 - -/* Media types */ -#define VSS_MEDIA_ID_EVRC_MODEM 0x00010FC2 -/* 80-VF690-47 CDMA enhanced variable rate vocoder modem format. */ -#define VSS_MEDIA_ID_AMR_NB_MODEM 0x00010FC6 -/* 80-VF690-47 UMTS AMR-NB vocoder modem format. */ -#define VSS_MEDIA_ID_AMR_WB_MODEM 0x00010FC7 -/* 80-VF690-47 UMTS AMR-WB vocoder modem format. */ - -#define VSS_MEDIA_ID_PCM_8_KHZ 0x00010FCB -#define VSS_MEDIA_ID_PCM_16_KHZ 0x00010FCC -#define VSS_MEDIA_ID_PCM_32_KHZ 0x00010FD9 -#define VSS_MEDIA_ID_PCM_48_KHZ 0x00010FD6 - -/* Linear PCM (16-bit, little-endian). */ -#define VSS_MEDIA_ID_G711_ALAW 0x00010FCD -/* G.711 a-law (contains two 10ms vocoder frames). */ -#define VSS_MEDIA_ID_G711_MULAW 0x00010FCE -/* G.711 mu-law (contains two 10ms vocoder frames). */ -#define VSS_MEDIA_ID_G729 0x00010FD0 -/* G.729AB (contains two 10ms vocoder frames. */ -#define VSS_MEDIA_ID_4GV_NB_MODEM 0x00010FC3 -/*CDMA EVRC-B vocoder modem format */ -#define VSS_MEDIA_ID_4GV_WB_MODEM 0x00010FC4 -/*CDMA EVRC-WB vocoder modem format */ -#define VSS_MEDIA_ID_4GV_NW_MODEM 0x00010FC5 -/*CDMA EVRC-NW vocoder modem format */ - -#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2 0x000112BF -#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V3 0x00013169 - -#define VSS_NUM_DEV_CHANNELS_1 1 -#define VSS_NUM_DEV_CHANNELS_2 2 -#define VSS_NUM_DEV_CHANNELS_3 3 -#define VSS_NUM_DEV_CHANNELS_4 4 - -struct vss_ivocproc_cmd_create_full_control_session_v2_t { - uint16_t direction; - /* - * Vocproc direction. The supported values: - * VSS_IVOCPROC_DIRECTION_RX - * VSS_IVOCPROC_DIRECTION_TX - * VSS_IVOCPROC_DIRECTION_RX_TX - */ - uint16_t tx_port_id; - /* - * Tx device port ID to which the vocproc connects. If a port ID is - * not being supplied, set this to #VSS_IVOCPROC_PORT_ID_NONE. - */ - uint32_t tx_topology_id; - /* - * Tx path topology ID. If a topology ID is not being supplied, set - * this to #VSS_IVOCPROC_TOPOLOGY_ID_NONE. - */ - uint16_t rx_port_id; - /* - * Rx device port ID to which the vocproc connects. If a port ID is - * not being supplied, set this to #VSS_IVOCPROC_PORT_ID_NONE. - */ - uint32_t rx_topology_id; - /* - * Rx path topology ID. If a topology ID is not being supplied, set - * this to #VSS_IVOCPROC_TOPOLOGY_ID_NONE. - */ - uint32_t profile_id; - /* Voice calibration profile ID. */ - uint32_t vocproc_mode; - /* - * Vocproc mode. The supported values: - * VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING - * VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING - */ - uint16_t ec_ref_port_id; - /* - * Port ID to which the vocproc connects for receiving echo - * cancellation reference signal. If a port ID is not being supplied, - * set this to #VSS_IVOCPROC_PORT_ID_NONE. This parameter value is - * ignored when the vocproc_mode parameter is set to - * VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING. - */ - char name[SESSION_NAME_LEN]; - /* - * Session name string used to identify a session that can be shared - * with passive controllers (optional). The string size, including the - * NULL termination character, is limited to 31 characters. - */ -} __packed; - -struct vss_ivocproc_cmd_set_volume_index_t { - uint16_t vol_index; - /* - * Volume index utilized by the vocproc to index into the volume table - * provided in VSS_IVOCPROC_CMD_CACHE_VOLUME_CALIBRATION_TABLE and set - * volume on the VDSP. - */ -} __packed; - -struct vss_ivolume_cmd_set_step_t { - uint16_t direction; - /* - * The direction field sets the direction to apply the volume command. - * The supported values: - * #VSS_IVOLUME_DIRECTION_RX - */ - uint32_t value; - /* - * Volume step used to find the corresponding linear volume and - * the best match index in the registered volume calibration table. - */ - uint16_t ramp_duration_ms; - /* - * Volume change ramp duration in milliseconds. - * The supported values: 0 to 5000. - */ -} __packed; - -struct vss_ivocproc_cmd_set_device_v2_t { - uint16_t tx_port_id; - /* - * TX device port ID which vocproc will connect to. - * VSS_IVOCPROC_PORT_ID_NONE means vocproc will not connect to any port. - */ - uint32_t tx_topology_id; - /* - * TX leg topology ID. - * VSS_IVOCPROC_TOPOLOGY_ID_NONE means vocproc does not contain any - * pre/post-processing blocks and is pass-through. - */ - uint16_t rx_port_id; - /* - * RX device port ID which vocproc will connect to. - * VSS_IVOCPROC_PORT_ID_NONE means vocproc will not connect to any port. - */ - uint32_t rx_topology_id; - /* - * RX leg topology ID. - * VSS_IVOCPROC_TOPOLOGY_ID_NONE means vocproc does not contain any - * pre/post-processing blocks and is pass-through. - */ - uint32_t vocproc_mode; - /* Vocproc mode. The supported values: - * VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING - 0x00010F7C - * VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING - 0x00010F7D - */ - uint16_t ec_ref_port_id; - /* Port ID to which the vocproc connects for receiving - * echo - */ -} __packed; - -struct vss_ivocproc_cmd_register_device_config_t { - uint32_t mem_handle; - /* - * Handle to the shared memory that holds the per-network calibration - * data. - */ - uint32_t mem_address_lsw; - uint32_t mem_address_msw; - /* Location of calibration data. */ - uint32_t mem_size; - /* Size of the calibration data in bytes. */ -} __packed; - -struct vss_ivocproc_cmd_register_calibration_data_v2_t { - uint32_t cal_mem_handle; - /* - * Handle to the shared memory that holds the per-network calibration - * data. - */ - uint32_t cal_mem_address_lsw; - uint32_t cal_mem_address_msw; - /* Location of calibration data. */ - uint32_t cal_mem_size; - /* Size of the calibration data in bytes. */ - uint8_t column_info[MAX_COL_INFO_SIZE]; - /* - * Column info contains the number of columns and the array of columns - * in the calibration table. The order in which the columns are provided - * here must match the order in which they exist in the calibration - * table provided. - */ -} __packed; - -struct vss_ivocproc_cmd_register_volume_cal_data_t { - uint32_t cal_mem_handle; - /* - * Handle to the shared memory that holds the volume calibration - * data. - */ - uint32_t cal_mem_address_lsw; - uint32_t cal_mem_address_msw; - /* Location of volume calibration data. */ - uint32_t cal_mem_size; - /* Size of the volume calibration data in bytes. */ - uint8_t column_info[MAX_COL_INFO_SIZE]; - /* - * Column info contains the number of columns and the array of columns - * in the calibration table. The order in which the columns are provided - * here must match the order in which they exist in the calibration - * table provided. - */ -} __packed; - -struct vss_ivocproc_cmd_topology_set_dev_channels_t { - uint16_t tx_num_channels; - /* - * Number of Mics. - * Supported values - * 1 VSS_NUM_DEV_CHANNELS_1 - * 2 VSS_NUM_DEV_CHANNELS_2 - * 3 VSS_NUM_DEV_CHANNELS_3 - * 4 VSS_NUM_DEV_CHANNELS_4 - */ - uint16_t rx_num_channels; - /* - * Number of speaker channels. - * Supported values - * 1 VSS_NUM_DEV_CHANNELS_1 - */ -} __packed; - -/* Starts a vocoder PCM session */ -#define VSS_IVPCM_CMD_START_V2 0x00011339 - -/* Default tap point location on the TX path. */ -#define VSS_IVPCM_TAP_POINT_TX_DEFAULT 0x00011289 - -/* Default tap point location on the RX path. */ -#define VSS_IVPCM_TAP_POINT_RX_DEFAULT 0x0001128A - -/* Indicates tap point direction is output. */ -#define VSS_IVPCM_TAP_POINT_DIR_OUT 0 - -/* Indicates tap point direction is input. */ -#define VSS_IVPCM_TAP_POINT_DIR_IN 1 - -/* Indicates tap point direction is output and input. */ -#define VSS_IVPCM_TAP_POINT_DIR_OUT_IN 2 - - -#define VSS_IVPCM_SAMPLING_RATE_AUTO 0 - -/* Indicates 8 KHz vocoder PCM sampling rate. */ -#define VSS_IVPCM_SAMPLING_RATE_8K 8000 - -/* Indicates 16 KHz vocoder PCM sampling rate. */ -#define VSS_IVPCM_SAMPLING_RATE_16K 16000 - -/* RX and TX */ -#define MAX_TAP_POINTS_SUPPORTED 2 - -struct vss_ivpcm_tap_point { - uint32_t tap_point; - uint16_t direction; - uint16_t sampling_rate; - uint16_t duration; -} __packed; - - -struct vss_ivpcm_cmd_start_v2_t { - uint32_t mem_handle; - uint32_t num_tap_points; - struct vss_ivpcm_tap_point tap_points[MAX_TAP_POINTS_SUPPORTED]; -} __packed; - -#define VSS_IVPCM_EVT_PUSH_BUFFER_V2 0x0001133A - -/* Push buffer event mask indicating output buffer is filled. */ -#define VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER 1 - -/* Push buffer event mask indicating input buffer is consumed. */ -#define VSS_IVPCM_PUSH_BUFFER_MASK_INPUT_BUFFER 2 - - -struct vss_ivpcm_evt_push_buffer_v2_t { - uint32_t tap_point; - uint32_t push_buf_mask; - uint64_t out_buf_mem_address; - uint16_t out_buf_mem_size; - uint64_t in_buf_mem_address; - uint16_t in_buf_mem_size; - uint16_t sampling_rate; - uint16_t num_in_channels; -} __packed; - -#define VSS_IVPCM_EVT_NOTIFY_V2 0x0001133B - -/* Notify event mask indicates output buffer is filled. */ -#define VSS_IVPCM_NOTIFY_MASK_OUTPUT_BUFFER 1 - -/* Notify event mask indicates input buffer is consumed. */ -#define VSS_IVPCM_NOTIFY_MASK_INPUT_BUFFER 2 - -/* Notify event mask indicates a timetick */ -#define VSS_IVPCM_NOTIFY_MASK_TIMETICK 4 - -/* Notify event mask indicates an error occurred in output buffer operation */ -#define VSS_IVPCM_NOTIFY_MASK_OUTPUT_ERROR 8 - -/* Notify event mask indicates an error occurred in input buffer operation */ -#define VSS_IVPCM_NOTIFY_MASK_INPUT_ERROR 16 - - -struct vss_ivpcm_evt_notify_v2_t { - uint32_t tap_point; - uint32_t notify_mask; - uint64_t out_buff_addr; - uint64_t in_buff_addr; - uint16_t filled_out_size; - uint16_t request_buf_size; - uint16_t sampling_rate; - uint16_t num_out_channels; -} __packed; - -struct cvp_start_cmd { - struct apr_hdr hdr; - struct vss_ivpcm_cmd_start_v2_t vpcm_start_cmd; -} __packed; - -struct cvp_push_buf_cmd { - struct apr_hdr hdr; - struct vss_ivpcm_evt_push_buffer_v2_t vpcm_evt_push_buffer; -} __packed; - -#define VSS_IVPCM_CMD_STOP 0x0001100B - -struct cvp_create_full_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_create_full_control_session_v2_t cvp_session; -} __packed; - -struct cvp_command { - struct apr_hdr hdr; -} __packed; - -struct cvp_set_device_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_set_device_v2_t cvp_set_device_v2; -} __packed; - -struct cvp_set_dev_channels_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_topology_set_dev_channels_t cvp_set_channels; -} __packed; - -struct cvp_set_channel_info_cmd_v2 { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_param_channel_info_v2_t - cvp_set_ch_info_param_v2; -} __packed; - -struct cvp_set_channel_mixer_info_cmd_v2 { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_param_ch_mixer_v2_t - cvp_set_ch_mixer_param_v2; -} __packed; - -struct cvp_set_mfc_config_cmd_v2 { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_param_mfc_config_v2_t cvp_set_mfc_param_v2; -} __packed; - -struct cvp_set_vp3_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_set_channel_ecns_cmd_v2 { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_ecns_enable_t cvp_set_ecns; -} __packed; - -struct cvp_set_rx_volume_index_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_set_volume_index_t cvp_set_vol_idx; -} __packed; - -struct cvp_set_rx_volume_step_cmd { - struct apr_hdr hdr; - struct vss_ivolume_cmd_set_step_t cvp_set_vol_step; -} __packed; - -struct cvp_register_dev_cfg_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_register_device_config_t cvp_dev_cfg_data; -} __packed; - -struct cvp_deregister_dev_cfg_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_register_cal_data_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_register_calibration_data_v2_t cvp_cal_data; -} __packed; - -struct cvp_deregister_cal_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_register_vol_cal_data_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_register_volume_cal_data_t cvp_vol_cal_data; -} __packed; - -struct cvp_deregister_vol_cal_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_set_mute_cmd { - struct apr_hdr hdr; - struct vss_ivolume_cmd_mute_v2_t cvp_set_mute; -} __packed; - -/* CB for up-link packets. */ -typedef void (*ul_cb_fn)(uint8_t *voc_pkt, - uint32_t pkt_len, - uint32_t timestamp, - void *private_data); - -/* CB for down-link packets. */ -typedef void (*dl_cb_fn)(uint8_t *voc_pkt, - void *private_data); - -/* CB for DTMF RX Detection */ -typedef void (*dtmf_rx_det_cb_fn)(uint8_t *pkt, - char *session, - void *private_data); - -typedef void (*voip_ssr_cb) (uint32_t opcode, - void *private_data); - -typedef void (*hostpcm_cb_fn)(uint8_t *data, - char *session, - void *private_data); - -struct mvs_driver_info { - uint32_t media_type; - uint32_t rate; - uint32_t network_type; - uint32_t dtx_mode; - ul_cb_fn ul_cb; - dl_cb_fn dl_cb; - voip_ssr_cb ssr_cb; - void *private_data; - uint32_t evrc_min_rate; - uint32_t evrc_max_rate; -}; - -struct dtmf_driver_info { - dtmf_rx_det_cb_fn dtmf_rx_ul_cb; - void *private_data; -}; - -struct hostpcm_driver_info { - hostpcm_cb_fn hostpcm_evt_cb; - void *private_data; -}; - -struct incall_rec_info { - uint32_t rec_enable; - uint32_t rec_mode; - uint32_t recording; - uint32_t port_id; -}; - -struct incall_music_info { - uint32_t play_enable; - uint32_t playing; - int count; - int force; - uint16_t port_id; -}; - -struct share_memory_info { - u32 mem_handle; - struct share_mem_buf sh_buf; - struct mem_map_table memtbl; -}; - -#define VSS_ISOUNDFOCUS_CMD_SET_SECTORS 0x00013133 -#define VSS_ISOUNDFOCUS_CMD_GET_SECTORS 0x00013134 -#define VSS_ISOUNDFOCUS_RSP_GET_SECTORS 0x00013135 -#define VSS_ISOURCETRACK_CMD_GET_ACTIVITY 0x00013136 - -struct vss_isoundfocus_cmd_set_sectors_t { - uint16_t start_angles[8]; - uint8_t enables[8]; - uint16_t gain_step; -} __packed; - -/* Payload of the VSS_ISOUNDFOCUS_RSP_GET_SECTORS response */ -struct vss_isoundfocus_rsp_get_sectors_t { - uint16_t start_angles[8]; - uint8_t enables[8]; - uint16_t gain_step; -} __packed; - -struct cvp_set_sound_focus_param_cmd_t { - struct apr_hdr hdr; - struct vss_isoundfocus_cmd_set_sectors_t cvp_set_sound_focus_param; -} __packed; - -/* Payload structure for the VSS_ISOURCETRACK_CMD_GET_ACTIVITY command */ -struct vss_isourcetrack_cmd_get_activity_t { - uint32_t mem_handle; - uint32_t mem_address_lsw; - uint32_t mem_address_msw; - uint32_t mem_size; -} __packed; - -struct cvp_get_source_tracking_param_cmd_t { - struct apr_hdr hdr; - struct vss_isourcetrack_cmd_get_activity_t - cvp_get_source_tracking_param; -} __packed; - -/* Structure for the sound activity data */ -struct vss_isourcetrack_activity_data_t { - uint8_t voice_active[8]; - uint16_t talker_doa; - uint16_t interferer_doa[3]; - uint8_t sound_strength[360]; -} __packed; - -struct shared_mem_info { - uint32_t mem_handle; - struct mem_map_table sh_mem_block; - struct mem_map_table sh_mem_table; -}; - -struct voice_data { - int voc_state;/*INIT, CHANGE, RELEASE, RUN */ - - /* Shared mem to store decoder and encoder packets */ - struct share_memory_info shmem_info; - - wait_queue_head_t mvm_wait; - wait_queue_head_t cvs_wait; - wait_queue_head_t cvp_wait; - - /* Cache the values related to Rx and Tx devices */ - struct device_data dev_rx; - struct device_data dev_tx; - - /* Cache the values related to Rx and Tx streams */ - struct stream_data stream_rx; - struct stream_data stream_tx; - - u32 mvm_state; - u32 cvs_state; - u32 cvp_state; - - u32 async_err; - - /* Handle to MVM in the Q6 */ - u16 mvm_handle; - /* Handle to CVS in the Q6 */ - u16 cvs_handle; - /* Handle to CVP in the Q6 */ - u16 cvp_handle; - - struct mutex lock; - - bool disable_topology; - - uint16_t sidetone_gain; - uint8_t tty_mode; - /* slowtalk enable value */ - uint32_t st_enable; - uint32_t hd_enable; - uint32_t dtmf_rx_detect_en; - /* Local Call Hold mode */ - uint8_t lch_mode; - - struct voice_dev_route_state voc_route_state; - - u32 session_id; - - struct incall_rec_info rec_info; - - struct incall_music_info music_info; - - struct voice_rec_route_state rec_route_state; - - bool mic_break_status; - struct work_struct voice_mic_break_work; - - uint32_t ecns_enable; - uint32_t ecns_module_id; - -}; - -#define MAX_VOC_SESSIONS 8 - -struct common_data { - /* these default values are for all devices */ - uint32_t default_mute_val; - uint32_t default_sample_val; - uint32_t default_vol_step_val; - uint32_t default_vol_ramp_duration_ms; - uint32_t default_mute_ramp_duration_ms; - bool ec_ref_ext; - struct media_format_info ec_media_fmt_info; - - /* APR to MVM in the Q6 */ - void *apr_q6_mvm; - /* APR to CVS in the Q6 */ - void *apr_q6_cvs; - /* APR to CVP in the Q6 */ - void *apr_q6_cvp; - - struct cal_type_data *cal_data[MAX_VOICE_CAL_TYPES]; - - struct mem_map_table cal_mem_map_table; - uint32_t cal_mem_handle; - - struct mem_map_table rtac_mem_map_table; - uint32_t rtac_mem_handle; - - uint32_t voice_host_pcm_mem_handle; - - struct mutex common_lock; - - struct mvs_driver_info mvs_info; - - struct dtmf_driver_info dtmf_info; - - struct hostpcm_driver_info hostpcm_info; - - struct voice_data voice[MAX_VOC_SESSIONS]; - - bool srvcc_rec_flag; - bool is_destroy_cvd; - char cvd_version[CVD_VERSION_STRING_MAX_SIZE]; - int cvp_version; - bool is_avcs_version_queried; - bool is_per_vocoder_cal_enabled; - bool is_sound_focus_resp_success; - bool is_source_tracking_resp_success; - struct vss_isoundfocus_rsp_get_sectors_t soundFocusResponse; - struct shared_mem_info source_tracking_sh_mem; - struct vss_isourcetrack_activity_data_t sourceTrackingResponse; - bool sidetone_enable; - bool mic_break_enable; - struct audio_uevent_data *uevent_data; - int32_t rec_channel_count; -}; - -struct voice_session_itr { - int cur_idx; - int session_idx; -}; - -void voc_register_mvs_cb(ul_cb_fn ul_cb, - dl_cb_fn dl_cb, - voip_ssr_cb ssr_cb, - void *private_data); - -void voc_register_dtmf_rx_detection_cb(dtmf_rx_det_cb_fn dtmf_rx_ul_cb, - void *private_data); - -void voc_config_vocoder(uint32_t media_type, - uint32_t rate, - uint32_t network_type, - uint32_t dtx_mode, - uint32_t evrc_min_rate, - uint32_t evrc_max_rate); - -enum { - DEV_RX = 0, - DEV_TX, -}; - -enum { - RX_PATH = 0, - TX_PATH, - EC_REF_PATH, -}; - -#define VOC_PATH_PASSIVE 0 -#define VOC_PATH_FULL 1 -#define VOC_PATH_VOLTE_PASSIVE 2 -#define VOC_PATH_VOICE2_PASSIVE 3 -#define VOC_PATH_QCHAT_PASSIVE 4 -#define VOC_PATH_VOWLAN_PASSIVE 5 -#define VOC_PATH_VOICEMMODE1_PASSIVE 6 -#define VOC_PATH_VOICEMMODE2_PASSIVE 7 - -#define MAX_SESSION_NAME_LEN 32 -#define VOICE_SESSION_NAME "Voice session" -#define VOIP_SESSION_NAME "VoIP session" -#define VOLTE_SESSION_NAME "VoLTE session" -#define VOICE2_SESSION_NAME "Voice2 session" -#define QCHAT_SESSION_NAME "QCHAT session" -#define VOWLAN_SESSION_NAME "VoWLAN session" -#define VOICEMMODE1_NAME "VoiceMMode1" -#define VOICEMMODE2_NAME "VoiceMMode2" - -#define VOICE2_SESSION_VSID_STR "10DC1000" -#define QCHAT_SESSION_VSID_STR "10803000" -#define VOWLAN_SESSION_VSID_STR "10002000" -#define VOICEMMODE1_VSID_STR "11C05000" -#define VOICEMMODE2_VSID_STR "11DC5000" -#define VOICE_SESSION_VSID 0x10C01000 -#define VOICE2_SESSION_VSID 0x10DC1000 -#define VOLTE_SESSION_VSID 0x10C02000 -#define VOIP_SESSION_VSID 0x10004000 -#define QCHAT_SESSION_VSID 0x10803000 -#define VOWLAN_SESSION_VSID 0x10002000 -#define VOICEMMODE1_VSID 0x11C05000 -#define VOICEMMODE2_VSID 0x11DC5000 -#define ALL_SESSION_VSID 0xFFFFFFFF -#define VSID_MAX ALL_SESSION_VSID - -/* called by alsa driver */ -int voc_set_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info, - uint32_t enable); -int voc_get_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info); -int voc_set_hd_enable(uint32_t session_id, uint32_t enable); -uint8_t voc_get_tty_mode(uint32_t session_id); -int voc_set_tty_mode(uint32_t session_id, uint8_t tty_mode); -int voc_start_voice_call(uint32_t session_id); -int voc_end_voice_call(uint32_t session_id); -int voc_standby_voice_call(uint32_t session_id); -int voc_resume_voice_call(uint32_t session_id); -int voc_set_lch(uint32_t session_id, enum voice_lch_mode lch_mode); -int voc_set_rx_vol_step(uint32_t session_id, uint32_t dir, uint32_t vol_step, - uint32_t ramp_duration); -int voc_set_tx_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration); -int voc_set_device_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration); -int voc_get_rx_device_mute(uint32_t session_id); -int voc_set_route_flag(uint32_t session_id, uint8_t path_dir, uint8_t set); -uint8_t voc_get_route_flag(uint32_t session_id, uint8_t path_dir); -bool voc_get_mbd_enable(void); -int voc_set_ecns_enable(uint32_t session_id, uint32_t module_id, - uint32_t enable); -uint8_t voc_set_mbd_enable(bool enable); -int voc_enable_dtmf_rx_detection(uint32_t session_id, uint32_t enable); -void voc_disable_dtmf_det_on_active_sessions(void); -int voc_alloc_cal_shared_memory(void); -int voc_alloc_voip_shared_memory(void); -int is_voc_initialized(void); -int voc_register_vocproc_vol_table(void); -int voc_deregister_vocproc_vol_table(void); -int voc_send_cvp_map_vocpcm_memory(uint32_t session_id, - struct mem_map_table *tp_mem_table, - phys_addr_t paddr, uint32_t bufsize); -int voc_send_cvp_unmap_vocpcm_memory(uint32_t session_id); -int voc_send_cvp_start_vocpcm(uint32_t session_id, - struct vss_ivpcm_tap_point *vpcm_tp, - uint32_t no_of_tp); -int voc_send_cvp_vocpcm_push_buf_evt(uint32_t session_id, - struct vss_ivpcm_evt_push_buffer_v2_t *push_buff_evt); -int voc_send_cvp_stop_vocpcm(uint32_t session_id); -void voc_register_hpcm_evt_cb(hostpcm_cb_fn hostpcm_cb, - void *private_data); -void voc_deregister_hpcm_evt_cb(void); - -int voc_map_rtac_block(struct rtac_cal_block_data *cal_block); -int voc_unmap_rtac_block(uint32_t *mem_map_handle); - -uint32_t voc_get_session_id(char *name); - -int voc_start_playback(uint32_t set, uint16_t port_id); -int voc_start_record(uint32_t port_id, uint32_t set, uint32_t session_id); -int voice_get_idx_for_session(u32 session_id); -int voc_set_ext_ec_ref_port_id(uint16_t port_id, bool state); -int voc_get_ext_ec_ref_port_id(void); -int voc_set_ext_ec_ref_media_fmt_info(struct media_format_info *finfo); -int voc_update_amr_vocoder_rate(uint32_t session_id); -int voc_disable_device(uint32_t session_id); -int voc_enable_device(uint32_t session_id); -void voc_set_destroy_cvd_flag(bool is_destroy_cvd); -int voc_disable_topology(uint32_t session_id, uint32_t disable); -int voc_set_device_config(uint32_t session_id, uint8_t path_dir, - struct media_format_info *finfo); -uint32_t voice_get_topology(uint32_t topology_idx); -void voc_set_incall_capture_channel_config(int channel_count); -int voc_get_incall_capture_channel_config(void); -int voice_set_topology_specific_info(struct voice_data *v, - uint32_t topology_idx); -int voc_set_sound_focus(struct sound_focus_param sound_focus_param); -int voc_get_sound_focus(struct sound_focus_param *soundFocusData); -int voc_get_source_tracking(struct source_tracking_param *sourceTrackingData); -int voc_set_afe_sidetone(uint32_t session_id, bool sidetone_enable); -bool voc_get_afe_sidetone(void); -#endif diff --git a/techpack/audio/4.0/include/dsp/rtac.h b/techpack/audio/4.0/include/dsp/rtac.h deleted file mode 100644 index 7507384405d6..000000000000 --- a/techpack/audio/4.0/include/dsp/rtac.h +++ /dev/null @@ -1,90 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2011, 2013-2015, 2017-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef __RTAC_H__ -#define __RTAC_H__ - -#include - -/* Voice Modes */ -#define RTAC_CVP 0 -#define RTAC_CVS 1 -#define RTAC_VOICE_MODES 2 - -#define RTAC_MAX_ACTIVE_DEVICES 6 -#define RTAC_MAX_ACTIVE_POPP 8 - -#define DEFAULT_APP_TYPE 0x00011130 - -enum { - ADM_RTAC_CAL, - ASM_RTAC_CAL, - VOICE_RTAC_CAL, - AFE_RTAC_CAL, - MAX_RTAC_BLOCKS -}; - -struct rtac_cal_mem_map_data { - uint32_t map_size; - uint32_t map_handle; - struct dma_buf *dma_buf; -}; - -struct rtac_cal_data { - size_t size; - void *kvaddr; - phys_addr_t paddr; -}; - -struct rtac_cal_block_data { - struct rtac_cal_mem_map_data map_data; - struct rtac_cal_data cal_data; -}; - -struct rtac_popp_data { - uint32_t popp; - uint32_t popp_topology; - uint32_t app_type; -}; - -struct rtac_adm_data { - uint32_t topology_id; - uint32_t afe_topology; - uint32_t afe_port; - uint32_t copp; - uint32_t num_of_popp; - uint32_t app_type; - uint32_t acdb_dev_id; - struct rtac_popp_data popp[RTAC_MAX_ACTIVE_POPP]; -}; - -struct rtac_adm { - uint32_t num_of_dev; - struct rtac_adm_data device[RTAC_MAX_ACTIVE_DEVICES]; -}; - -void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id, - u32 app_type, u32 acdb_dev_id); -void rtac_remove_adm_device(u32 port_id, u32 copp_id); -void rtac_remove_popp_from_adm_devices(u32 popp_id); -void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port, - u32 tx_afe_port, u32 rx_acdb_id, u32 tx_acdb_id, u32 session_id); -void rtac_remove_voice(u32 cvs_handle); -void rtac_set_adm_handle(void *handle); -bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size); -void rtac_copy_adm_payload_to_user(void *payload, u32 payload_size); -void rtac_set_asm_handle(u32 session_id, void *handle); -bool rtac_make_asm_callback(u32 session_id, uint32_t *payload, - u32 payload_size); -void rtac_copy_asm_payload_to_user(void *payload, u32 payload_size); -void rtac_set_voice_handle(u32 mode, void *handle); -bool rtac_make_voice_callback(u32 mode, uint32_t *payload, u32 payload_size); -void rtac_copy_voice_payload_to_user(void *payload, u32 payload_size); -int rtac_clear_mapping(uint32_t cal_type); -bool rtac_make_afe_callback(uint32_t *payload, u32 payload_size); -void rtac_set_afe_handle(void *handle); -void get_rtac_adm_data(struct rtac_adm *adm_data); -void rtac_update_afe_topology(u32 port_id); -#endif diff --git a/techpack/audio/4.0/include/dsp/sp_params.h b/techpack/audio/4.0/include/dsp/sp_params.h deleted file mode 100644 index ddc756ee8c9d..000000000000 --- a/techpack/audio/4.0/include/dsp/sp_params.h +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __SP_PARAMS_H__ -#define __SP_PARAMS_H__ - -#if IS_ENABLED(CONFIG_XT_LOGGING) -int afe_get_sp_xt_logging_data(u16 port_id); -#else -static inline int afe_get_sp_xt_logging_data(u16 port_id) -{ - return 0; -} -#endif - -#endif /* __SP_PARAMS_H__ */ - diff --git a/techpack/audio/4.0/include/dsp/voice_mhi.h b/techpack/audio/4.0/include/dsp/voice_mhi.h deleted file mode 100644 index 7cde32ae6242..000000000000 --- a/techpack/audio/4.0/include/dsp/voice_mhi.h +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __VOICE_MHI_H__ -#define __VOICE_MHI_H__ - -#ifdef CONFIG_VOICE_MHI -int voice_mhi_start(void); -int voice_mhi_end(void); -#else -static inline int voice_mhi_start(void) -{ - return 0; -} - -static inline int voice_mhi_end(void) -{ - return 0; -} -#endif - -#endif diff --git a/techpack/audio/4.0/include/ipc/apr.h b/techpack/audio/4.0/include/ipc/apr.h deleted file mode 100644 index 7aecee265530..000000000000 --- a/techpack/audio/4.0/include/ipc/apr.h +++ /dev/null @@ -1,189 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2010-2017, 2019, The Linux Foundation. All rights reserved. - */ -#ifndef __APR_H_ -#define __APR_H_ - -#include -#include - -enum apr_subsys_state { - APR_SUBSYS_DOWN, - APR_SUBSYS_UP, - APR_SUBSYS_LOADED, -}; - -struct apr_q6 { - void *pil; - atomic_t q6_state; - atomic_t modem_state; - struct mutex lock; -}; - -struct apr_hdr { - uint16_t hdr_field; - uint16_t pkt_size; - uint8_t src_svc; - uint8_t src_domain; - uint16_t src_port; - uint8_t dest_svc; - uint8_t dest_domain; - uint16_t dest_port; - uint32_t token; - uint32_t opcode; -}; - -#define APR_HDR_LEN(hdr_len) ((hdr_len)/4) -#define APR_PKT_SIZE(hdr_len, payload_len) ((hdr_len) + (payload_len)) -#define APR_HDR_FIELD(msg_type, hdr_len, ver)\ - (((msg_type & 0x3) << 8) | ((hdr_len & 0xF) << 4) | (ver & 0xF)) - -#define APR_HDR_SIZE sizeof(struct apr_hdr) - -/* Version */ -#define APR_PKT_VER 0x0 - -/* Command and Response Types */ -#define APR_MSG_TYPE_EVENT 0x0 -#define APR_MSG_TYPE_CMD_RSP 0x1 -#define APR_MSG_TYPE_SEQ_CMD 0x2 -#define APR_MSG_TYPE_NSEQ_CMD 0x3 -#define APR_MSG_TYPE_MAX 0x04 - -/* APR Basic Response Message */ -#define APR_BASIC_RSP_RESULT 0x000110E8 -#define APR_RSP_ACCEPTED 0x000100BE - -/* Domain IDs */ -#define APR_DOMAIN_SIM 0x1 -#define APR_DOMAIN_PC 0x2 -#define APR_DOMAIN_MODEM 0x3 -#define APR_DOMAIN_ADSP 0x4 -#define APR_DOMAIN_APPS 0x5 -#define APR_DOMAIN_MAX 0x6 - -/* ADSP service IDs */ -#define APR_SVC_TEST_CLIENT 0x2 -#define APR_SVC_ADSP_CORE 0x3 -#define APR_SVC_AFE 0x4 -#define APR_SVC_VSM 0x5 -#define APR_SVC_VPM 0x6 -#define APR_SVC_ASM 0x7 -#define APR_SVC_ADM 0x8 -#define APR_SVC_ADSP_MVM 0x09 -#define APR_SVC_ADSP_CVS 0x0A -#define APR_SVC_ADSP_CVP 0x0B -#define APR_SVC_USM 0x0C -#define APR_SVC_LSM 0x0D -#define APR_SVC_VIDC 0x16 -#define APR_SVC_MAX 0x17 - -/* Modem Service IDs */ -#define APR_SVC_MVS 0x3 -#define APR_SVC_MVM 0x4 -#define APR_SVC_CVS 0x5 -#define APR_SVC_CVP 0x6 -#define APR_SVC_SRD 0x7 - -/* APR Port IDs */ -#define APR_MAX_PORTS 0x80 - -#define APR_NAME_MAX 0x40 - -#define RESET_EVENTS 0x000130D7 - -#define LPASS_RESTART_EVENT 0x1000 -#define LPASS_RESTART_READY 0x1001 - -struct apr_client_data { - uint16_t reset_event; - uint16_t reset_proc; - uint16_t payload_size; - uint16_t hdr_len; - uint16_t msg_type; - uint16_t src; - uint16_t dest_svc; - uint16_t src_port; - uint16_t dest_port; - uint32_t token; - uint32_t opcode; - void *payload; -}; - -typedef int32_t (*apr_fn)(struct apr_client_data *data, void *priv); - -struct apr_svc { - uint16_t id; - uint16_t dest_id; - uint16_t client_id; - uint16_t dest_domain; - uint8_t rvd; - uint8_t port_cnt; - uint8_t svc_cnt; - uint8_t need_reset; - apr_fn port_fn[APR_MAX_PORTS]; - void *port_priv[APR_MAX_PORTS]; - apr_fn fn; - void *priv; - struct mutex m_lock; - spinlock_t w_lock; - uint8_t pkt_owner; -#ifdef CONFIG_MSM_QDSP6_APRV2_VM - uint16_t vm_dest_svc; - uint32_t vm_handle; -#endif -}; - -struct apr_client { - uint8_t id; - uint8_t svc_cnt; - uint8_t rvd; - struct mutex m_lock; - struct apr_svc_ch_dev *handle; - struct apr_svc svc[APR_SVC_MAX]; -}; - -struct apr_rx_intents { - int num_of_intents; - uint32_t size; -}; - -struct apr_pkt_cfg { - uint8_t pkt_owner; - struct apr_rx_intents intents; -}; - -int apr_load_adsp_image(void); -struct apr_client *apr_get_client(int dest_id, int client_id); -int apr_wait_for_device_up(int dest_id); -int apr_get_svc(const char *svc_name, int dest_id, int *client_id, - int *svc_idx, int *svc_id); -void apr_cb_func(void *buf, int len, void *priv); -struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn, - uint32_t src_port, void *priv); -inline int apr_fill_hdr(void *handle, uint32_t *buf, uint16_t src_port, - uint16_t msg_type, uint16_t dest_port, - uint32_t token, uint32_t opcode, uint16_t len); - -int apr_send_pkt(void *handle, uint32_t *buf); -int apr_deregister(void *handle); -void subsys_notif_register(char *client_name, int domain, - struct notifier_block *nb); -void subsys_notif_deregister(char *client_name); -int apr_get_dest_id(char *dest); -uint16_t apr_get_data_src(struct apr_hdr *hdr); -void change_q6_state(int state); -void q6audio_dsp_not_responding(void); -void apr_reset(void *handle); -enum apr_subsys_state apr_get_subsys_state(void); -enum apr_subsys_state apr_get_modem_state(void); -void apr_set_modem_state(enum apr_subsys_state state); -enum apr_subsys_state apr_get_q6_state(void); -int apr_set_q6_state(enum apr_subsys_state state); -void apr_set_subsys_state(void); -const char *apr_get_lpass_subsys_name(void); -uint16_t apr_get_reset_domain(uint16_t proc); -int apr_start_rx_rt(void *handle); -int apr_end_rx_rt(void *handle); -#endif diff --git a/techpack/audio/4.0/include/ipc/apr_tal.h b/techpack/audio/4.0/include/ipc/apr_tal.h deleted file mode 100644 index 6a4fbdfc5ef0..000000000000 --- a/techpack/audio/4.0/include/ipc/apr_tal.h +++ /dev/null @@ -1,85 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2010-2011, 2016-2018 The Linux Foundation. All rights reserved. - */ -#ifndef __APR_TAL_H_ -#define __APR_TAL_H_ - -#include -#include -#include - -/* APR Client IDs */ -#define APR_CLIENT_AUDIO 0x0 -#define APR_CLIENT_VOICE 0x1 -#define APR_CLIENT_MAX 0x2 - -#define APR_DL_SMD 0 -#define APR_DL_MAX 1 - -#define APR_DEST_MODEM 0 -#define APR_DEST_QDSP6 1 -#define APR_DEST_MAX 2 - -#if defined(CONFIG_MSM_QDSP6_APRV2_GLINK) || \ - defined(CONFIG_MSM_QDSP6_APRV3_GLINK) -#define APR_MAX_BUF 512 -#else -#define APR_MAX_BUF 8092 -#endif - -#define APR_DEFAULT_NUM_OF_INTENTS 20 - -#define APR_OPEN_TIMEOUT_MS 5000 - -enum { - /* If client sets the pkt_owner to APR_PKT_OWNER_DRIVER, APR - * driver will allocate a buffer, where the user packet is - * copied into, for each and every single Tx transmission. - * The buffer is thereafter passed to underlying link layer - * and freed upon the notification received from the link layer - * that the packet has been consumed. - */ - APR_PKT_OWNER_DRIVER, - /* If client sets the pkt_owner to APR_PKT_OWNER_CLIENT, APR - * will pass the user packet memory address directly to underlying - * link layer. In this case it is the client's responsibility to - * make sure the packet is intact until being notified that the - * packet has been consumed. - */ - APR_PKT_OWNER_CLIENT, -}; - -struct apr_pkt_priv { - /* This property is only applicable for APR over Glink. - * It is ignored in APR over SMD cases. - */ - uint8_t pkt_owner; -}; - -typedef void (*apr_svc_cb_fn)(void *buf, int len, void *priv); -struct apr_svc_ch_dev *apr_tal_open(uint32_t svc, uint32_t dest, - uint32_t dl, apr_svc_cb_fn func, void *priv); -int apr_tal_write(struct apr_svc_ch_dev *apr_ch, void *data, - struct apr_pkt_priv *pkt_priv, int len); -int apr_tal_close(struct apr_svc_ch_dev *apr_ch); -int apr_tal_rx_intents_config(struct apr_svc_ch_dev *apr_ch, - int num_of_intents, uint32_t size); -int apr_tal_init(void); -void apr_tal_exit(void); -int apr_tal_start_rx_rt(struct apr_svc_ch_dev *apr_ch); -int apr_tal_end_rx_rt(struct apr_svc_ch_dev *apr_ch); - -struct apr_svc_ch_dev { - void *handle; - spinlock_t w_lock; - spinlock_t r_lock; - struct mutex m_lock; - apr_svc_cb_fn func; - wait_queue_head_t wait; - void *priv; - unsigned int channel_state; - bool if_remote_intent_ready; -}; - -#endif diff --git a/techpack/audio/4.0/include/ipc/apr_us.h b/techpack/audio/4.0/include/ipc/apr_us.h deleted file mode 100644 index 27075ef35962..000000000000 --- a/techpack/audio/4.0/include/ipc/apr_us.h +++ /dev/null @@ -1,185 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. - */ -#ifndef __APR_US_H__ -#define __APR_US_H__ - -#include - -/* ======================================================================= */ -/* Session Level commands */ - -#define USM_SESSION_CMD_RUN 0x00012306 -struct usm_stream_cmd_run { - struct apr_hdr hdr; - u32 flags; - u32 msw_ts; - u32 lsw_ts; -} __packed; - -/* Stream level commands */ -#define USM_STREAM_CMD_OPEN_READ 0x00012309 -struct usm_stream_cmd_open_read { - struct apr_hdr hdr; - u32 uMode; - u32 src_endpoint; - u32 pre_proc_top; - u32 format; -} __packed; - -#define USM_STREAM_CMD_OPEN_WRITE 0x00011271 -struct usm_stream_cmd_open_write { - struct apr_hdr hdr; - u32 format; -} __packed; - - -#define USM_STREAM_CMD_CLOSE 0x0001230A - -#define USM_STREAM_CMD_SET_PARAM 0x00012731 -struct usm_stream_cmd_set_param { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 module_id; - u32 param_id; -} __packed; - -#define USM_STREAM_CMD_GET_PARAM 0x00012732 -struct usm_stream_cmd_get_param { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 module_id; - u32 param_id; -} __packed; - -/* Encoder configuration definitions */ -#define USM_STREAM_CMD_SET_ENC_PARAM 0x0001230B -/* Decoder configuration definitions */ -#define USM_DATA_CMD_MEDIA_FORMAT_UPDATE 0x00011272 - -/* Encoder/decoder configuration block */ -#define USM_PARAM_ID_ENCDEC_ENC_CFG_BLK 0x0001230D - -/* Max number of static located ports (bytes) */ -#define USM_MAX_PORT_NUMBER 8 - -/* Max number of static located transparent data (bytes) */ -#define USM_MAX_CFG_DATA_SIZE 100 - -/* Parameter structures used in USM_STREAM_CMD_SET_ENCDEC_PARAM command */ -/* common declarations */ -struct usm_cfg_common { - u16 ch_cfg; - u16 bits_per_sample; - u32 sample_rate; - u32 dev_id; - u8 data_map[USM_MAX_PORT_NUMBER]; -} __packed; - -struct us_encdec_cfg { - u32 format_id; - struct usm_cfg_common cfg_common; - u16 params_size; - u8 *params; -} __packed; - -/* Start/stop US signal detection */ -#define USM_SESSION_CMD_SIGNAL_DETECT_MODE 0x00012719 - -struct usm_session_cmd_detect_info { - struct apr_hdr hdr; - u32 detect_mode; - u32 skip_interval; - u32 algorithm_cfg_size; -} __packed; - -/* US signal detection result */ -#define USM_SESSION_EVENT_SIGNAL_DETECT_RESULT 0x00012720 - -/* ======================================================================= */ -/* Session Level commands */ -#define USM_CMD_SHARED_MEM_MAP_REGION 0x00012728 -struct usm_cmd_memory_map_region { - struct apr_hdr hdr; - u16 mempool_id; - u16 num_regions; - u32 flags; - u32 shm_addr_lsw; - u32 shm_addr_msw; - u32 mem_size_bytes; -} __packed; - -#define USM_CMDRSP_SHARED_MEM_MAP_REGION 0x00012729 -struct usm_cmdrsp_memory_map_region { - u32 mem_map_handle; -} __packed; - -#define USM_CMD_SHARED_MEM_UNMAP_REGION 0x0001272A -struct usm_cmd_memory_unmap_region { - struct apr_hdr hdr; - u32 mem_map_handle; -} __packed; - -#define USM_DATA_CMD_READ 0x00012724 -struct usm_stream_cmd_read { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 seq_id; - u32 counter; -} __packed; - -#define USM_DATA_EVENT_READ_DONE 0x00012725 - -#define USM_DATA_CMD_WRITE 0x00012726 -struct usm_stream_cmd_write { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 seq_id; - u32 res0; - u32 res1; - u32 res2; -} __packed; - -#define USM_DATA_EVENT_WRITE_DONE 0x00012727 - -struct usm_stream_media_format_update { - struct apr_hdr hdr; - u32 format_id; - /* = sizeof(usm_cfg_common)+|transp_data| */ - u32 cfg_size; - struct usm_cfg_common cfg_common; - /* Transparent configuration data for specific encoder */ - u8 transp_data[USM_MAX_CFG_DATA_SIZE]; -} __packed; - -struct usm_encode_cfg_blk { - u32 frames_per_buf; - u32 format_id; - /* = sizeof(usm_cfg_common)+|transp_data| */ - u32 cfg_size; - struct usm_cfg_common cfg_common; - /* Transparent configuration data for specific encoder */ - u8 transp_data[USM_MAX_CFG_DATA_SIZE]; -} __packed; - -struct usm_stream_cmd_encdec_cfg_blk { - struct apr_hdr hdr; - u32 param_id; - u32 param_size; - struct usm_encode_cfg_blk enc_blk; -} __packed; - -#endif /* __APR_US_H__ */ diff --git a/techpack/audio/4.0/include/ipc/aprv2_vm.h b/techpack/audio/4.0/include/ipc/aprv2_vm.h deleted file mode 100644 index ce61c1a2b2f3..000000000000 --- a/techpack/audio/4.0/include/ipc/aprv2_vm.h +++ /dev/null @@ -1,108 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2016-2017, 2019 The Linux Foundation. All rights reserved. - */ -#ifndef __APRV2_VM_H__ -#define __APRV2_VM_H__ - -#define APRV2_VM_MAX_DNS_SIZE (31) - /* Includes NULL character. */ -#define APRV2_VM_PKT_SERVICE_ID_MASK (0x00FF) - /* Bitmask of the service ID field. */ - -/* Packet Structure Definition */ -struct aprv2_vm_packet_t { - uint32_t header; - uint16_t src_addr; - uint16_t src_port; - uint16_t dst_addr; - uint16_t dst_port; - uint32_t token; - uint32_t opcode; -}; - -/** - * In order to send command/event via MM HAB, the following buffer - * format shall be followed, where the buffer is provided to the - * HAB send API. - * |-----cmd_id or evt_id -----| <- 32 bit, e.g. APRV2_VM_CMDID_REGISTER - * |-----cmd payload ----------| e.g. aprv2_vm_cmd_register_t - * | ... | - * - * In order to receive a command response or event ack, the following - * buffer format shall be followed, where the buffer is provided to - * the HAB receive API. - * |-----cmd response ---------| e.g. aprv2_vm_cmd_register_rsp_t - * | ... | - */ - -/* Registers a service with the backend APR driver. */ -#define APRV2_VM_CMDID_REGISTER (0x00000001) - -struct aprv2_vm_cmd_register_t { - uint32_t name_size; - /**< The service name string size in bytes. */ - char name[APRV2_VM_MAX_DNS_SIZE]; - /**< - * The service name string to register. - * - * A NULL name means the service does not have a name. - */ - uint16_t addr; - /**< - * The address to register. - * - * A zero value means to auto-generate a free dynamic address. - * A non-zero value means to directly use the statically assigned address. - */ -}; - -struct aprv2_vm_cmd_register_rsp_t { - int32_t status; - /**< The status of registration. */ - uint32_t handle; - /**< The registered service handle. */ - uint16_t addr; - /**< The actual registered address. */ -}; - -#define APRV2_VM_CMDID_DEREGISTER (0x00000002) - -struct aprv2_vm_cmd_deregister_t { - uint32_t handle; - /**< The registered service handle. */ -}; - -struct aprv2_vm_cmd_deregister_rsp_t { - int32_t status; - /**< The status of de-registration. */ -}; - -#define APRV2_VM_CMDID_ASYNC_SEND (0x00000003) - -struct aprv2_vm_cmd_async_send_t { - uint32_t handle; - /**< The registered service handle. */ - struct aprv2_vm_packet_t pkt_header; - /**< The packet header. */ - /* The apr packet payload follows */ -}; - -struct aprv2_vm_cmd_async_send_rsp_t { - int32_t status; - /**< The status of send. */ -}; - -#define APRV2_VM_EVT_RX_PKT_AVAILABLE (0x00000004) - -struct aprv2_vm_evt_rx_pkt_available_t { - struct aprv2_vm_packet_t pkt_header; - /**< The packet header. */ - /* The apr packet payload follows */ -}; - -struct aprv2_vm_ack_rx_pkt_available_t { - int32_t status; -}; - -#endif /* __APRV2_VM_H__ */ diff --git a/techpack/audio/4.0/include/soc/internal.h b/techpack/audio/4.0/include/soc/internal.h deleted file mode 100644 index 4b97c126d330..000000000000 --- a/techpack/audio/4.0/include/soc/internal.h +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Register map access API internal header - * - * Copyright 2011 Wolfson Microelectronics plc - * - * Author: Mark Brown - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _REGMAP_INTERNAL_H -#define _REGMAP_INTERNAL_H - -#include -#include -#include -#include -#include - -struct regmap; -struct regcache_ops; - -struct regmap_debugfs_off_cache { - struct list_head list; - off_t min; - off_t max; - unsigned int base_reg; - unsigned int max_reg; -}; - -struct regmap_format { - size_t buf_size; - size_t reg_bytes; - size_t pad_bytes; - size_t val_bytes; - void (*format_write)(struct regmap *map, - unsigned int reg, unsigned int val); - void (*format_reg)(void *buf, unsigned int reg, unsigned int shift); - void (*format_val)(void *buf, unsigned int val, unsigned int shift); - unsigned int (*parse_val)(const void *buf); - void (*parse_inplace)(void *buf); -}; - -struct regmap_async { - struct list_head list; - struct regmap *map; - void *work_buf; -}; - -struct regmap { - union { - struct mutex mutex; - struct { - spinlock_t spinlock; - unsigned long spinlock_flags; - }; - }; - regmap_lock lock; - regmap_unlock unlock; - void *lock_arg; /* This is passed to lock/unlock functions */ - gfp_t alloc_flags; - - struct device *dev; /* Device we do I/O on */ - void *work_buf; /* Scratch buffer used to format I/O */ - struct regmap_format format; /* Buffer format */ - const struct regmap_bus *bus; - void *bus_context; - const char *name; - - bool async; - spinlock_t async_lock; - wait_queue_head_t async_waitq; - struct list_head async_list; - struct list_head async_free; - int async_ret; - -#ifdef CONFIG_DEBUG_FS - struct dentry *debugfs; - const char *debugfs_name; - - unsigned int debugfs_reg_len; - unsigned int debugfs_val_len; - unsigned int debugfs_tot_len; - - struct list_head debugfs_off_cache; - struct mutex cache_lock; - - unsigned int dump_address; - unsigned int dump_count; -#endif - - unsigned int max_register; - bool (*writeable_reg)(struct device *dev, unsigned int reg); - bool (*readable_reg)(struct device *dev, unsigned int reg); - bool (*volatile_reg)(struct device *dev, unsigned int reg); - bool (*precious_reg)(struct device *dev, unsigned int reg); - const struct regmap_access_table *wr_table; - const struct regmap_access_table *rd_table; - const struct regmap_access_table *volatile_table; - const struct regmap_access_table *precious_table; - - int (*reg_read)(void *context, unsigned int reg, unsigned int *val); - int (*reg_write)(void *context, unsigned int reg, unsigned int val); - int (*reg_update_bits)(void *context, unsigned int reg, - unsigned int mask, unsigned int val); - - bool defer_caching; - - unsigned long read_flag_mask; - unsigned long write_flag_mask; - - /* number of bits to (left) shift the reg value when formatting*/ - int reg_shift; - int reg_stride; - int reg_stride_order; - - /* regcache specific members */ - const struct regcache_ops *cache_ops; - enum regcache_type cache_type; - - /* number of bytes in reg_defaults_raw */ - unsigned int cache_size_raw; - /* number of bytes per word in reg_defaults_raw */ - unsigned int cache_word_size; - /* number of entries in reg_defaults */ - unsigned int num_reg_defaults; - /* number of entries in reg_defaults_raw */ - unsigned int num_reg_defaults_raw; - - /* if set, only the cache is modified not the HW */ - bool cache_only; - /* if set, only the HW is modified not the cache */ - bool cache_bypass; - /* if set, remember to free reg_defaults_raw */ - bool cache_free; - - struct reg_default *reg_defaults; - const void *reg_defaults_raw; - void *cache; - /* if set, the cache contains newer data than the HW */ - bool cache_dirty; - /* if set, the HW registers are known to match map->reg_defaults */ - bool no_sync_defaults; - - struct reg_sequence *patch; - int patch_regs; - - /* if set, converts bulk read to single read */ - bool use_single_read; - /* if set, converts bulk read to single read */ - bool use_single_write; - /* if set, the device supports multi write mode */ - bool can_multi_write; - - /* if set, raw reads/writes are limited to this size */ - size_t max_raw_read; - size_t max_raw_write; - - struct rb_root range_tree; - void *selector_work_buf; /* Scratch buffer used for selector */ -}; - -struct regcache_ops { - const char *name; - enum regcache_type type; - int (*init)(struct regmap *map); - int (*exit)(struct regmap *map); -#ifdef CONFIG_DEBUG_FS - void (*debugfs_init)(struct regmap *map); -#endif - int (*read)(struct regmap *map, unsigned int reg, unsigned int *value); - int (*write)(struct regmap *map, unsigned int reg, unsigned int value); - int (*sync)(struct regmap *map, unsigned int min, unsigned int max); - int (*drop)(struct regmap *map, unsigned int min, unsigned int max); -}; - -bool regmap_cached(struct regmap *map, unsigned int reg); -bool regmap_writeable(struct regmap *map, unsigned int reg); -bool regmap_readable(struct regmap *map, unsigned int reg); -bool regmap_volatile(struct regmap *map, unsigned int reg); -bool regmap_precious(struct regmap *map, unsigned int reg); - -int _regmap_write(struct regmap *map, unsigned int reg, - unsigned int val); - -struct regmap_range_node { - struct rb_node node; - const char *name; - struct regmap *map; - - unsigned int range_min; - unsigned int range_max; - - unsigned int selector_reg; - unsigned int selector_mask; - int selector_shift; - - unsigned int window_start; - unsigned int window_len; -}; - -struct regmap_field { - struct regmap *regmap; - unsigned int mask; - /* lsb */ - unsigned int shift; - unsigned int reg; - - unsigned int id_size; - unsigned int id_offset; -}; - -#ifdef CONFIG_DEBUG_FS -extern void regmap_debugfs_initcall(void); -extern void regmap_debugfs_init(struct regmap *map, const char *name); -extern void regmap_debugfs_exit(struct regmap *map); -#else -static inline void regmap_debugfs_initcall(void) { } -static inline void regmap_debugfs_init(struct regmap *map, const char *name) { } -static inline void regmap_debugfs_exit(struct regmap *map) { } -#endif - -/* regcache core declarations */ -int regcache_init(struct regmap *map, const struct regmap_config *config); -void regcache_exit(struct regmap *map); -int regcache_read(struct regmap *map, - unsigned int reg, unsigned int *value); -int regcache_write(struct regmap *map, - unsigned int reg, unsigned int value); -int regcache_sync(struct regmap *map); -int regcache_sync_block(struct regmap *map, void *block, - unsigned long *cache_present, - unsigned int block_base, unsigned int start, - unsigned int end); - -static inline const void *regcache_get_val_addr(struct regmap *map, - const void *base, - unsigned int idx) -{ - return base + (map->cache_word_size * idx); -} - -unsigned int regcache_get_val(struct regmap *map, const void *base, - unsigned int idx); -bool regcache_set_val(struct regmap *map, void *base, unsigned int idx, - unsigned int val); -int regcache_lookup_reg(struct regmap *map, unsigned int reg); - -int _regmap_raw_write(struct regmap *map, unsigned int reg, - const void *val, size_t val_len); - -void regmap_async_complete_cb(struct regmap_async *async, int ret); - -enum regmap_endian regmap_get_val_endian(struct device *dev, - const struct regmap_bus *bus, - const struct regmap_config *config); - -extern struct regcache_ops regcache_rbtree_ops; -extern struct regcache_ops regcache_lzo_ops; -extern struct regcache_ops regcache_flat_ops; - -static inline const char *regmap_name(const struct regmap *map) -{ - if (map->dev) - return dev_name(map->dev); - - return map->name; -} - -static inline unsigned int regmap_get_offset(const struct regmap *map, - unsigned int index) -{ - if (map->reg_stride_order >= 0) - return index << map->reg_stride_order; - else - return index * map->reg_stride; -} - -static inline unsigned int regcache_get_index_by_order(const struct regmap *map, - unsigned int reg) -{ - return reg >> map->reg_stride_order; -} - -#endif diff --git a/techpack/audio/4.0/include/soc/snd_event.h b/techpack/audio/4.0/include/soc/snd_event.h deleted file mode 100644 index 6561afad45bf..000000000000 --- a/techpack/audio/4.0/include/soc/snd_event.h +++ /dev/null @@ -1,79 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef _SND_EVENT_H_ -#define _SND_EVENT_H_ - -enum { - SND_EVENT_DOWN = 0, - SND_EVENT_UP, -}; - -struct snd_event_clients; - -struct snd_event_ops { - int (*enable)(struct device *dev, void *data); - void (*disable)(struct device *dev, void *data); -}; - -#ifdef CONFIG_SND_EVENT -int snd_event_client_register(struct device *dev, - const struct snd_event_ops *snd_ev_ops, - void *data); -int snd_event_client_deregister(struct device *dev); -int snd_event_master_register(struct device *dev, - const struct snd_event_ops *ops, - struct snd_event_clients *clients, - void *data); -int snd_event_master_deregister(struct device *dev); -int snd_event_notify(struct device *dev, unsigned int state); - -void snd_event_mstr_add_client(struct snd_event_clients **snd_clients, - int (*compare)(struct device *, void *), - void *data); -static inline bool is_snd_event_fwk_enabled(void) -{ - return 1; -} -#else -static inline int snd_event_client_register(struct device *dev, - const struct snd_event_ops *snd_ev_ops, - void *data) -{ - return 0; -} -static inline int snd_event_client_deregister(struct device *dev) -{ - return 0; -} -static inline int snd_event_master_register(struct device *dev, - const struct snd_event_ops *ops, - struct snd_event_clients *clients, - void *data) -{ - return 0; -} -static inline int snd_event_master_deregister(struct device *dev) -{ - return 0; -} -static inline int snd_event_notify(struct device *dev, unsigned int state) -{ - return 0; -} - -static inline void snd_event_mstr_add_client(struct snd_event_clients **snd_clients, - int (*compare)(struct device *, void *), - void *data) -{ - return; -} -static inline bool is_snd_event_fwk_enabled(void) -{ - return 0; -} - -#endif /* CONFIG_SND_EVENT */ -#endif /* _SND_EVENT_H_ */ diff --git a/techpack/audio/4.0/include/soc/soundwire.h b/techpack/audio/4.0/include/soc/soundwire.h deleted file mode 100644 index 37a00c750ecf..000000000000 --- a/techpack/audio/4.0/include/soc/soundwire.h +++ /dev/null @@ -1,350 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2018, 2020, The Linux Foundation. All rights reserved. - */ - -#ifndef _LINUX_SOUNDWIRE_H -#define _LINUX_SOUNDWIRE_H -#include -#include -#include -#include - -#define SWR_CLK_RATE_0P6MHZ 600000 -#define SWR_CLK_RATE_1P2MHZ 1200000 -#define SWR_CLK_RATE_2P4MHZ 2400000 -#define SWR_CLK_RATE_4P8MHZ 4800000 -#define SWR_CLK_RATE_9P6MHZ 9600000 -#define SWR_CLK_RATE_11P2896MHZ 1128960 - -extern struct bus_type soundwire_type; - -/* Soundwire supports max. of 8 channels per port */ -#define SWR_MAX_CHANNEL_NUM 8 -/* Soundwire supports max. of 14 ports on each device */ -#define SWR_MAX_DEV_PORT_NUM 14 -/* Maximum number of slave devices that a master can control */ -#define SWR_MAX_DEV_NUM 11 -/* Maximum number of ports on master so that it can accommodate all the port - * configurations of all devices - */ -#define SWR_MAX_MSTR_PORT_NUM (SWR_MAX_DEV_NUM * SWR_MAX_DEV_PORT_NUM) - -/* Indicates soundwire devices group information */ -enum { - SWR_GROUP_NONE = 0, - SWR_GROUP_12 = 12, - SWR_GROUP_13 = 13, - SWR_BROADCAST = 15, -}; - -/* - * struct swr_port_info - represents new soundwire frame shape - * with full data ports - * @list: link with other soundwire port info nodes - * @dev_num: logical device number of the soundwire slave device - * @port_en: flag indicates whether the port is enabled - * @slave_port_id: logical port number of the soundwire slave device - * @offset1: sample offset indicating the offset of the channel - * from the start of the frame - * @offset2: channel offset indicating offset between to channels - * @hstart: start offset for subframe window. - * @hstop: start offset for subframe window. - * @master_port_id: logical port number of corresponding soundwire master device - * @blk_grp_count: grouping count for n.o of channels. - * @blk_pack_mode: packing mode for channels in each port. - * @sinterval: sample interval indicates spacing from one sample - * event to the next - * @ch_en: channels enabled in a port. - * @req_ch: channels requested to be enabled in a port. - * @num_ch: number of channels enabled in a port - * @ch_rate: sampling rate of the channel with which data will be - * transferred - * - * Soundwire frame shape is created based on swr_port_info struct - * parameters. - */ -struct swr_port_info { - u8 dev_num; - u8 port_en; - u8 slave_port_id; - u8 offset1; - u8 offset2; - u8 sinterval; - struct list_head list; - u8 master_port_id; - u8 hstart; - u8 hstop; - u8 blk_grp_count; - u8 blk_pack_mode; - u8 word_length; - u8 lane_ctrl; - u8 ch_en; - u8 req_ch; - u8 num_ch; - u32 ch_rate; -}; - -/* - * struct swr_params - represent transfer of data from soundwire slave - * to soundwire master - * @tid: transaction ID to track each transaction - * @dev_num: logical device number of the soundwire slave device - * @num_port: number of ports that needs to be configured - * @port_id: array of logical port numbers of the soundwire slave device - * @num_ch: array of number of channels enabled - * @ch_rate: array of sampling rate of different channels that need to - * be configured - * @ch_en: array of channels mask for all the ports - * @port_type: the required master port type - */ -struct swr_params { - u8 tid; - u8 dev_num; - u8 num_port; - u8 port_id[SWR_MAX_DEV_PORT_NUM]; - u8 num_ch[SWR_MAX_DEV_PORT_NUM]; - u32 ch_rate[SWR_MAX_DEV_PORT_NUM]; - u8 ch_en[SWR_MAX_DEV_PORT_NUM]; - u8 port_type[SWR_MAX_DEV_PORT_NUM]; -}; - -/* - * struct swr_reg - struct to handle soundwire slave register read/writes - * @tid: transaction id for reg read/writes - * @dev_id: logical device number of the soundwire slave device - * @regaddr: 16 bit regaddr of soundwire slave - * @buf: value to be written/read to/from regaddr - * @len: length of the buffer buf - */ -struct swr_reg { - u8 tid; - u8 dev_id; - u32 regaddr; - u32 *buf; - u32 len; -}; - -/* - * struct swr_master - Interface to the soundwire master controller - * @dev: device interface to this driver - * @list: link with other soundwire master controllers - * @bus_num: board/SoC specific identifier for a soundwire master - * @mlock: mutex protecting master data structures - * @devices: list of devices on this master - * @port: logical port numbers of the soundwire master. This array - * can hold maximum master ports which is equal to number of slave - * devices multiplied by number of ports in each slave device - * @port_txn: table of port config transactions with transaction id - * @reg_txn: table of register transactions with transaction id - * @last_tid: size of table port_txn (can't grow beyond 256 since - * tid is 8 bits) - * @num_port: number of active ports on soundwire master - * @gr_sid: slave id used by the group for write operations - * @connect_port: callback for configuration of soundwire port(s) - * @disconnect_port: callback for disable of soundwire port(s) - * @read: callback for soundwire slave register read - * @write: callback for soundwire slave register write - * @get_logical_dev_num: callback to get soundwire slave logical - * device number - * @port_en_mask: bit mask of active ports on soundwire master - */ -struct swr_master { - struct device dev; - struct list_head list; - unsigned int bus_num; - struct mutex mlock; - struct list_head devices; - struct swr_port_info port[SWR_MAX_MSTR_PORT_NUM]; - struct swr_params **port_txn; - struct swr_reg **reg_txn; - u8 last_tid; - u8 num_port; - u8 num_dev; - u8 gr_sid; - int (*connect_port)(struct swr_master *mstr, struct swr_params *txn); - int (*disconnect_port)(struct swr_master *mstr, struct swr_params *txn); - int (*read)(struct swr_master *mstr, u8 dev_num, u16 reg_addr, - void *buf, u32 len); - int (*write)(struct swr_master *mstr, u8 dev_num, u16 reg_addr, - const void *buf); - int (*bulk_write)(struct swr_master *master, u8 dev_num, void *reg, - const void *buf, size_t len); - int (*get_logical_dev_num)(struct swr_master *mstr, u64 dev_id, - u8 *dev_num); - int (*slvdev_datapath_control)(struct swr_master *mstr, bool enable); - bool (*remove_from_group)(struct swr_master *mstr); - void (*device_wakeup_vote)(struct swr_master *mstr); - void (*device_wakeup_unvote)(struct swr_master *mstr); - u16 port_en_mask; - -}; - -static inline struct swr_master *to_swr_master(struct device *dev) -{ - return dev ? container_of(dev, struct swr_master, dev) : NULL; -} - -/* - * struct swr_device - represent a soundwire slave device - * @name: indicates the name of the device, defined in devicetree - * binding under soundwire slave device node as a compatible field. - * @master: soundwire master managing the bus hosting this device - * @driver: Device's driver. Pointer to access routines - * @dev_list: list of devices on a controller - * @dev_num: logical device number of the soundwire slave device - * @dev: driver model representation of the device - * @addr: represents "ea-addr" which is unique-id of soundwire slave - * device - * @group_id: group id supported by the slave device - * @slave_irq: irq handle of slave to be invoked by master - * during slave interrupt - */ -struct swr_device { - char name[SOUNDWIRE_NAME_SIZE]; - struct swr_master *master; - struct swr_driver *driver; - struct list_head dev_list; - u8 dev_num; - struct device dev; - u64 addr; - u8 group_id; - struct irq_domain *slave_irq; - bool slave_irq_pending; -}; - -static inline struct swr_device *to_swr_device(struct device *dev) -{ - return dev ? container_of(dev, struct swr_device, dev) : NULL; -} - -/* - * struct swr_driver - Manage soundwire slave device driver - * @probe: binds this driver to soundwire device - * @remove: unbinds this driver from soundwire device - * @shutdown: standard shutdown callback used during power down/halt - * @suspend: standard suspend callback used during system suspend - * @resume: standard resume callback used during system resume - * @driver: soundwire device drivers should initialize name and - * owner field of this structure - * @id_table: list of soundwire devices supported by this driver - */ -struct swr_driver { - int (*probe)(struct swr_device *swr); - int (*remove)(struct swr_device *swr); - void (*shutdown)(struct swr_device *swr); - int (*suspend)(struct swr_device *swr, pm_message_t pmesg); - int (*resume)(struct swr_device *swr); - int (*device_up)(struct swr_device *swr); - int (*device_down)(struct swr_device *swr); - int (*reset_device)(struct swr_device *swr); - struct device_driver driver; - const struct swr_device_id *id_table; -}; - -static inline struct swr_driver *to_swr_driver(struct device_driver *drv) -{ - return drv ? container_of(drv, struct swr_driver, driver) : NULL; -} - -/* - * struct swr_boardinfo - Declare board info for soundwire device bringup - * @name: name to initialize swr_device.name - * @bus_num: identifies which soundwire master parents the soundwire - * slave_device - * @addr: represents "ea-addr" of soundwire slave device - * @of_node: pointer to OpenFirmware device node - * @swr_slave: device to be registered with soundwire - */ -struct swr_boardinfo { - char name[SOUNDWIRE_NAME_SIZE]; - int bus_num; - u64 addr; - struct device_node *of_node; - struct swr_device *swr_slave; -}; - -static inline void *swr_get_ctrl_data(const struct swr_master *master) -{ - return master ? dev_get_drvdata(&master->dev) : NULL; -} - -static inline void swr_set_ctrl_data(struct swr_master *master, void *data) -{ - dev_set_drvdata(&master->dev, data); -} - -static inline void *swr_get_dev_data(const struct swr_device *dev) -{ - return dev ? dev_get_drvdata(&dev->dev) : NULL; -} - -static inline void swr_set_dev_data(struct swr_device *dev, void *data) -{ - dev_set_drvdata(&dev->dev, data); -} - -extern int swr_startup_devices(struct swr_device *swr_dev); - -extern struct swr_device *swr_new_device(struct swr_master *master, - struct swr_boardinfo const *info); - -extern int of_register_swr_devices(struct swr_master *master); - -extern void swr_port_response(struct swr_master *mstr, u8 tid); - -extern int swr_get_logical_dev_num(struct swr_device *dev, u64 dev_id, - u8 *dev_num); - -extern int swr_read(struct swr_device *dev, u8 dev_num, u16 reg_addr, - void *buf, u32 len); - -extern int swr_write(struct swr_device *dev, u8 dev_num, u16 reg_addr, - const void *buf); - -extern int swr_bulk_write(struct swr_device *dev, u8 dev_num, void *reg_addr, - const void *buf, size_t len); - -extern int swr_connect_port(struct swr_device *dev, u8 *port_id, u8 num_port, - u8 *ch_mask, u32 *ch_rate, u8 *num_ch, - u8 *port_type); - -extern int swr_disconnect_port(struct swr_device *dev, - u8 *port_id, u8 num_port, u8 *ch_mask, - u8 *port_type); - -extern int swr_set_device_group(struct swr_device *swr_dev, u8 id); - -extern int swr_driver_register(struct swr_driver *drv); - -extern void swr_driver_unregister(struct swr_driver *drv); - -extern int swr_add_device(struct swr_master *master, - struct swr_device *swrdev); -extern void swr_remove_device(struct swr_device *swr); - -extern void swr_master_add_boarddevices(struct swr_master *master); - -extern void swr_unregister_master(struct swr_master *master); - -extern int swr_register_master(struct swr_master *master); - -extern int swr_device_up(struct swr_device *swr_dev); - -extern int swr_device_down(struct swr_device *swr_dev); - -extern int swr_reset_device(struct swr_device *swr_dev); - -extern int swr_slvdev_datapath_control(struct swr_device *swr_dev, u8 dev_num, - bool enable); -extern int swr_remove_from_group(struct swr_device *dev, u8 dev_num); - -extern void swr_remove_device(struct swr_device *swr_dev); - -extern struct swr_device *get_matching_swr_slave_device(struct device_node *np); - -extern int swr_device_wakeup_vote(struct swr_device *dev); - -extern int swr_device_wakeup_unvote(struct swr_device *dev); - -#endif /* _LINUX_SOUNDWIRE_H */ diff --git a/techpack/audio/4.0/include/soc/swr-common.h b/techpack/audio/4.0/include/soc/swr-common.h deleted file mode 100644 index 92b79c79a9fb..000000000000 --- a/techpack/audio/4.0/include/soc/swr-common.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015, 2017-2018 The Linux Foundation. All rights reserved. - */ - -#ifndef _LINUX_SWR_COMMON_H -#define _LINUX_SWR_COMMON_H -#include -#include -#include -#include - -enum { - SWR_UC0 = 0, - SWR_UC1, - SWR_UC_MAX, -}; - -struct port_params { - u8 si; - u8 off1; - u8 off2; - u8 hstart;/* head start */ - u8 hstop; /* head stop */ - u8 wd_len;/* word length */ - u8 bp_mode; /* block pack mode */ - u8 bgp_ctrl;/* block group control */ - u8 lane_ctrl;/* lane to be used */ -}; - -struct swrm_port_config { - u32 size; - u32 uc; - void *params; -}; - -struct swr_mstr_port_map { - u32 id; - u32 uc; - struct port_params *swr_port_params; -}; - -#define SWR_MSTR_PORT_LEN 8 /* Number of master ports */ - -#endif /* _LINUX_SWR_COMMON_H */ diff --git a/techpack/audio/4.0/include/soc/swr-wcd.h b/techpack/audio/4.0/include/soc/swr-wcd.h deleted file mode 100644 index 0c0912785c2b..000000000000 --- a/techpack/audio/4.0/include/soc/swr-wcd.h +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015, 2017-2019 The Linux Foundation. All rights reserved. - */ - -#ifndef _LINUX_SWR_WCD_H -#define _LINUX_SWR_WCD_H -#include -#include -#include -#include - -enum { - SWR_CH_MAP, - SWR_DEVICE_DOWN, - SWR_DEVICE_UP, - SWR_SUBSYS_RESTART, - SWR_SET_NUM_RX_CH, - SWR_CLK_FREQ, - SWR_DEVICE_SSR_DOWN, - SWR_DEVICE_SSR_UP, - SWR_REGISTER_WAKE_IRQ, - SWR_SET_PORT_MAP, - SWR_REQ_CLK_SWITCH, - SWR_REGISTER_WAKEUP, - SWR_DEREGISTER_WAKEUP, -}; - -struct swr_mstr_port { - int num_port; - u8 *port; -}; - -#define MCLK_FREQ 9600000 -#define MCLK_FREQ_LP 600000 -#define MCLK_FREQ_NATIVE 11289600 - -#if (IS_ENABLED(CONFIG_SOUNDWIRE_WCD_CTRL) || \ - IS_ENABLED(CONFIG_SOUNDWIRE_MSTR_CTRL)) -extern int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data); -#else /* CONFIG_SOUNDWIRE_WCD_CTRL */ -static inline int swrm_wcd_notify(struct platform_device *pdev, u32 id, - void *data) -{ - return 0; -} -#endif /* CONFIG_SOUNDWIRE_WCD_CTRL */ -#endif /* _LINUX_SWR_WCD_H */ diff --git a/techpack/audio/4.0/include/soc/wcd-spi-ac.h b/techpack/audio/4.0/include/soc/wcd-spi-ac.h deleted file mode 100644 index e07d235e9ca1..000000000000 --- a/techpack/audio/4.0/include/soc/wcd-spi-ac.h +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#ifndef __WCD_SPI_AC_H__ -#define __WCD_SPI_AC_H__ - -#include -#include - -enum wcd_spi_acc_req { - WCD_SPI_ACCESS_REQUEST, - WCD_SPI_ACCESS_RELEASE, - WCD_SPI_ACCESS_MAX, -}; - -#define WCD_SPI_AC_DATA_TRANSFER BIT(0) -#define WCD_SPI_AC_CONCURRENCY BIT(1) -#define WCD_SPI_AC_REMOTE_DOWN BIT(2) -#define WCD_SPI_AC_SVC_OFFLINE BIT(3) -#define WCD_SPI_AC_UNINITIALIZED BIT(4) - -#if IS_ENABLED(CONFIG_WCD_SPI_AC) -int wcd_spi_access_ctl(struct device *dev, - enum wcd_spi_acc_req req, - u32 reason); -#else -int wcd_spi_access_ctl(struct device *dev, - enum wcd_spi_acc_req req, - u32 reason) -{ - return 0; -} -#endif /* end of CONFIG_WCD_SPI_AC */ - -#endif /* end of __WCD_SPI_AC_H__ */ diff --git a/techpack/audio/4.0/include/uapi/Android.mk b/techpack/audio/4.0/include/uapi/Android.mk deleted file mode 100644 index f19a6c20337e..000000000000 --- a/techpack/audio/4.0/include/uapi/Android.mk +++ /dev/null @@ -1,30 +0,0 @@ -# Use this by setting -# LOCAL_HEADER_LIBRARIES := audio_kernel_headers - -LOCAL_PATH := $(call my-dir) -MYLOCAL_PATH := $(LOCAL_PATH) - -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/include - -AUDIO_KERNEL_HEADERS := $(call all-named-files-under,*.h,linux) $(call all-named-files-under,*.h,sound) - -HEADER_INSTALL_DIR := kernel/msm-$(TARGET_KERNEL_VERSION)/scripts - -BUILD_ROOT_RELATIVE := ../../../../../../../ - -include $(CLEAR_VARS) -LOCAL_MODULE := audio_kernel_headers -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_PREBUILT_INT_KERNEL) -LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr - -GEN := $(addprefix $(UAPI_OUT)/,$(AUDIO_KERNEL_HEADERS)) -$(GEN): $(KERNEL_USR) -$(GEN): PRIVATE_PATH := $(MYLOCAL_PATH) -$(GEN): PRIVATE_CUSTOM_TOOL = $(shell cd $(PRODUCT_OUT)/obj/KERNEL_OBJ; $(BUILD_ROOT_RELATIVE)$(HEADER_INSTALL_DIR)/headers_install.sh $(BUILD_ROOT_RELATIVE)$(dir $@) $(BUILD_ROOT_RELATIVE)$(subst $(UAPI_OUT),$(MYLOCAL_PATH),$(dir $@)) $(notdir $@)) -$(GEN): $(addprefix $(MYLOCAL_PATH)/,$(AUDIO_KERNEL_HEADERS)) - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES := $(GEN) -LOCAL_EXPORT_C_INCLUDE_DIRS := $(UAPI_OUT) - -include $(BUILD_HEADER_LIBRARY) diff --git a/techpack/audio/4.0/include/uapi/Kbuild b/techpack/audio/4.0/include/uapi/Kbuild deleted file mode 100644 index 2eb179d4de95..000000000000 --- a/techpack/audio/4.0/include/uapi/Kbuild +++ /dev/null @@ -1,6 +0,0 @@ -# UAPI Header export list -# Top-level Makefile calls into asm-$(ARCH) -# List only non-arch directories below - -header-y += linux/ -header-y += sound/ diff --git a/techpack/audio/4.0/include/uapi/linux/Kbuild b/techpack/audio/4.0/include/uapi/linux/Kbuild deleted file mode 100644 index 9b93abebc4b7..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/Kbuild +++ /dev/null @@ -1,21 +0,0 @@ -# UAPI Header export list -header-y += avtimer.h -header-y += msm_audio.h -header-y += msm_audio_aac.h -header-y += msm_audio_ac3.h -header-y += msm_audio_amrnb.h -header-y += msm_audio_amrwb.h -header-y += msm_audio_amrwbplus.h -header-y += msm_audio_calibration.h -header-y += msm_audio_mvs.h -header-y += msm_audio_qcp.h -header-y += msm_audio_sbc.h -header-y += msm_audio_voicememo.h -header-y += msm_audio_wma.h -header-y += msm_audio_wmapro.h -header-y += msm_audio_alac.h -header-y += msm_audio_ape.h -header-y += msm_audio_g711.h -header-y += msm_audio_g711_dec.h -header-y += mfd/ -header-y += wcd-spi-ac-params.h diff --git a/techpack/audio/4.0/include/uapi/linux/avtimer.h b/techpack/audio/4.0/include/uapi/linux/avtimer.h deleted file mode 100644 index 96b5483fbf2e..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/avtimer.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _UAPI_AVTIMER_H -#define _UAPI_AVTIMER_H - -#include - -#define MAJOR_NUM 100 - -#define IOCTL_GET_AVTIMER_TICK _IOR(MAJOR_NUM, 0, uint64_t) - -#endif diff --git a/techpack/audio/4.0/include/uapi/linux/mfd/Kbuild b/techpack/audio/4.0/include/uapi/linux/mfd/Kbuild deleted file mode 100644 index 9377c98b0aa3..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/mfd/Kbuild +++ /dev/null @@ -1 +0,0 @@ -header-y += wcd9xxx/ diff --git a/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/Kbuild b/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/Kbuild deleted file mode 100644 index 8e55965bbe7e..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/Kbuild +++ /dev/null @@ -1,2 +0,0 @@ -header-y += wcd9xxx_registers.h -header-y += wcd9320_registers.h diff --git a/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h b/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h deleted file mode 100644 index 63ab62419559..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h +++ /dev/null @@ -1,1399 +0,0 @@ -#ifndef WCD9320_REGISTERS_H -#define WCD9320_REGISTERS_H - -#include - -#define TAIKO_A_CHIP_CTL WCD9XXX_A_CHIP_CTL -#define TAIKO_A_CHIP_CTL__POR WCD9XXX_A_CHIP_CTL__POR -#define TAIKO_A_CHIP_STATUS WCD9XXX_A_CHIP_STATUS -#define TAIKO_A_CHIP_STATUS__POR WCD9XXX_A_CHIP_STATUS__POR -#define TAIKO_A_CHIP_ID_BYTE_0 WCD9XXX_A_CHIP_ID_BYTE_0 -#define TAIKO_A_CHIP_ID_BYTE_0__POR WCD9XXX_A_CHIP_ID_BYTE_0__POR -#define TAIKO_A_CHIP_ID_BYTE_1 WCD9XXX_A_CHIP_ID_BYTE_1 -#define TAIKO_A_CHIP_ID_BYTE_1__POR WCD9XXX_A_CHIP_ID_BYTE_1__POR -#define TAIKO_A_CHIP_ID_BYTE_2 WCD9XXX_A_CHIP_ID_BYTE_2 -#define TAIKO_A_CHIP_ID_BYTE_2__POR WCD9XXX_A_CHIP_ID_BYTE_2__POR -#define TAIKO_A_CHIP_ID_BYTE_3 WCD9XXX_A_CHIP_ID_BYTE_3 -#define TAIKO_A_CHIP_ID_BYTE_3__POR WCD9XXX_A_CHIP_ID_BYTE_3__POR -#define TAIKO_A_CHIP_VERSION WCD9XXX_A_CHIP_VERSION -#define TAIKO_A_CHIP_VERSION__POR WCD9XXX_A_CHIP_VERSION__POR -#define TAIKO_A_SB_VERSION WCD9XXX_A_SB_VERSION -#define TAIKO_A_SB_VERSION__POR WCD9XXX_A_SB_VERSION__POR -#define TAIKO_A_SLAVE_ID_1 WCD9XXX_A_SLAVE_ID_1 -#define TAIKO_A_SLAVE_ID_1__POR WCD9XXX_A_SLAVE_ID_1__POR -#define TAIKO_A_SLAVE_ID_2 WCD9XXX_A_SLAVE_ID_2 -#define TAIKO_A_SLAVE_ID_2__POR WCD9XXX_A_SLAVE_ID_2__POR -#define TAIKO_A_SLAVE_ID_3 WCD9XXX_A_SLAVE_ID_3 -#define TAIKO_A_SLAVE_ID_3__POR WCD9XXX_A_SLAVE_ID_3__POR -#define TAIKO_A_PIN_CTL_OE0 (0x010) -#define TAIKO_A_PIN_CTL_OE0__POR (0x00) -#define TAIKO_A_PIN_CTL_OE1 (0x011) -#define TAIKO_A_PIN_CTL_OE1__POR (0x00) -#define TAIKO_A_PIN_CTL_DATA0 (0x012) -#define TAIKO_A_PIN_CTL_DATA0__POR (0x00) -#define TAIKO_A_PIN_CTL_DATA1 (0x013) -#define TAIKO_A_PIN_CTL_DATA1__POR (0x00) -#define TAIKO_A_HDRIVE_GENERIC (0x018) -#define TAIKO_A_HDRIVE_GENERIC__POR (0x00) -#define TAIKO_A_HDRIVE_OVERRIDE (0x019) -#define TAIKO_A_HDRIVE_OVERRIDE__POR (0x08) -#define TAIKO_A_ANA_CSR_WAIT_STATE (0x020) -#define TAIKO_A_ANA_CSR_WAIT_STATE__POR (0x44) -#define TAIKO_A_PROCESS_MONITOR_CTL0 (0x040) -#define TAIKO_A_PROCESS_MONITOR_CTL0__POR (0x80) -#define TAIKO_A_PROCESS_MONITOR_CTL1 (0x041) -#define TAIKO_A_PROCESS_MONITOR_CTL1__POR (0x00) -#define TAIKO_A_PROCESS_MONITOR_CTL2 (0x042) -#define TAIKO_A_PROCESS_MONITOR_CTL2__POR (0x00) -#define TAIKO_A_PROCESS_MONITOR_CTL3 (0x043) -#define TAIKO_A_PROCESS_MONITOR_CTL3__POR (0x01) -#define TAIKO_A_QFUSE_CTL (0x048) -#define TAIKO_A_QFUSE_CTL__POR (0x00) -#define TAIKO_A_QFUSE_STATUS (0x049) -#define TAIKO_A_QFUSE_STATUS__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT0 (0x04A) -#define TAIKO_A_QFUSE_DATA_OUT0__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT1 (0x04B) -#define TAIKO_A_QFUSE_DATA_OUT1__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT2 (0x04C) -#define TAIKO_A_QFUSE_DATA_OUT2__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT3 (0x04D) -#define TAIKO_A_QFUSE_DATA_OUT3__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT4 (0x04E) -#define TAIKO_A_QFUSE_DATA_OUT4__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT5 (0x04F) -#define TAIKO_A_QFUSE_DATA_OUT5__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT6 (0x050) -#define TAIKO_A_QFUSE_DATA_OUT6__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT7 (0x051) -#define TAIKO_A_QFUSE_DATA_OUT7__POR (0x00) -#define TAIKO_A_CDC_CTL WCD9XXX_A_CDC_CTL -#define TAIKO_A_CDC_CTL__POR WCD9XXX_A_CDC_CTL__POR -#define TAIKO_A_LEAKAGE_CTL WCD9XXX_A_LEAKAGE_CTL -#define TAIKO_A_LEAKAGE_CTL__POR WCD9XXX_A_LEAKAGE_CTL__POR -#define TAIKO_A_INTR_MODE (0x090) -#define TAIKO_A_INTR_MODE__POR (0x00) -#define TAIKO_A_INTR_MASK0 (0x094) -#define TAIKO_A_INTR_MASK0__POR (0xFF) -#define TAIKO_A_INTR_MASK1 (0x095) -#define TAIKO_A_INTR_MASK1__POR (0xFF) -#define TAIKO_A_INTR_MASK2 (0x096) -#define TAIKO_A_INTR_MASK2__POR (0x3F) -#define TAIKO_A_INTR_MASK3 (0x097) -#define TAIKO_A_INTR_MASK3__POR (0x3F) -#define TAIKO_A_INTR_STATUS0 (0x098) -#define TAIKO_A_INTR_STATUS0__POR (0x00) -#define TAIKO_A_INTR_STATUS1 (0x099) -#define TAIKO_A_INTR_STATUS1__POR (0x00) -#define TAIKO_A_INTR_STATUS2 (0x09A) -#define TAIKO_A_INTR_STATUS2__POR (0x00) -#define TAIKO_A_INTR_STATUS3 (0x09B) -#define TAIKO_A_INTR_STATUS3__POR (0x00) -#define TAIKO_A_INTR_CLEAR0 (0x09C) -#define TAIKO_A_INTR_CLEAR0__POR (0x00) -#define TAIKO_A_INTR_CLEAR1 (0x09D) -#define TAIKO_A_INTR_CLEAR1__POR (0x00) -#define TAIKO_A_INTR_CLEAR2 (0x09E) -#define TAIKO_A_INTR_CLEAR2__POR (0x00) -#define TAIKO_A_INTR_CLEAR3 (0x09F) -#define TAIKO_A_INTR_CLEAR3__POR (0x00) -#define TAIKO_A_INTR_LEVEL0 (0x0A0) -#define TAIKO_A_INTR_LEVEL0__POR (0x01) -#define TAIKO_A_INTR_LEVEL1 (0x0A1) -#define TAIKO_A_INTR_LEVEL1__POR (0x00) -#define TAIKO_A_INTR_LEVEL2 (0x0A2) -#define TAIKO_A_INTR_LEVEL2__POR (0x00) -#define TAIKO_A_INTR_LEVEL3 (0x0A3) -#define TAIKO_A_INTR_LEVEL3__POR (0x00) -#define TAIKO_A_INTR_TEST0 (0x0A4) -#define TAIKO_A_INTR_TEST0__POR (0x00) -#define TAIKO_A_INTR_TEST1 (0x0A5) -#define TAIKO_A_INTR_TEST1__POR (0x00) -#define TAIKO_A_INTR_TEST2 (0x0A6) -#define TAIKO_A_INTR_TEST2__POR (0x00) -#define TAIKO_A_INTR_TEST3 (0x0A7) -#define TAIKO_A_INTR_TEST3__POR (0x00) -#define TAIKO_A_INTR_SET0 (0x0A8) -#define TAIKO_A_INTR_SET0__POR (0x00) -#define TAIKO_A_INTR_SET1 (0x0A9) -#define TAIKO_A_INTR_SET1__POR (0x00) -#define TAIKO_A_INTR_SET2 (0x0AA) -#define TAIKO_A_INTR_SET2__POR (0x00) -#define TAIKO_A_INTR_SET3 (0x0AB) -#define TAIKO_A_INTR_SET3__POR (0x00) -#define TAIKO_A_INTR_DESTN0 (0x0AC) -#define TAIKO_A_INTR_DESTN0__POR (0x00) -#define TAIKO_A_INTR_DESTN1 (0x0AD) -#define TAIKO_A_INTR_DESTN1__POR (0x00) -#define TAIKO_A_INTR_DESTN2 (0x0AE) -#define TAIKO_A_INTR_DESTN2__POR (0x00) -#define TAIKO_A_INTR_DESTN3 (0x0AF) -#define TAIKO_A_INTR_DESTN3__POR (0x00) -#define TAIKO_A_CDC_TX_I2S_SCK_MODE (0x0C0) -#define TAIKO_A_CDC_TX_I2S_SCK_MODE__POR (0x00) -#define TAIKO_A_CDC_TX_I2S_WS_MODE (0x0C1) -#define TAIKO_A_CDC_TX_I2S_WS_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_DATA0_MODE (0x0C4) -#define TAIKO_A_CDC_DMIC_DATA0_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_CLK0_MODE (0x0C5) -#define TAIKO_A_CDC_DMIC_CLK0_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_DATA1_MODE (0x0C6) -#define TAIKO_A_CDC_DMIC_DATA1_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_CLK1_MODE (0x0C7) -#define TAIKO_A_CDC_DMIC_CLK1_MODE__POR (0x00) -#define TAIKO_A_CDC_RX_I2S_SCK_MODE (0x0C8) -#define TAIKO_A_CDC_RX_I2S_SCK_MODE__POR (0x00) -#define TAIKO_A_CDC_RX_I2S_WS_MODE (0x0C9) -#define TAIKO_A_CDC_RX_I2S_WS_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_DATA2_MODE (0x0CA) -#define TAIKO_A_CDC_DMIC_DATA2_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_CLK2_MODE (0x0CB) -#define TAIKO_A_CDC_DMIC_CLK2_MODE__POR (0x00) -#define TAIKO_A_CDC_INTR1_MODE (0x0CC) -#define TAIKO_A_CDC_INTR1_MODE__POR (0x00) -#define TAIKO_A_CDC_SB_NRZ_SEL_MODE (0x0CD) -#define TAIKO_A_CDC_SB_NRZ_SEL_MODE__POR (0x00) -#define TAIKO_A_CDC_INTR2_MODE (0x0CE) -#define TAIKO_A_CDC_INTR2_MODE__POR (0x00) -#define TAIKO_A_CDC_RF_PA_ON_MODE (0x0CF) -#define TAIKO_A_CDC_RF_PA_ON_MODE__POR (0x00) -#define TAIKO_A_BIAS_REF_CTL (0x100) -#define TAIKO_A_BIAS_REF_CTL__POR (0x1C) -#define TAIKO_A_BIAS_CENTRAL_BG_CTL (0x101) -#define TAIKO_A_BIAS_CENTRAL_BG_CTL__POR (0x50) -#define TAIKO_A_BIAS_PRECHRG_CTL (0x102) -#define TAIKO_A_BIAS_PRECHRG_CTL__POR (0x07) -#define TAIKO_A_BIAS_CURR_CTL_1 (0x103) -#define TAIKO_A_BIAS_CURR_CTL_1__POR (0x52) -#define TAIKO_A_BIAS_CURR_CTL_2 (0x104) -#define TAIKO_A_BIAS_CURR_CTL_2__POR (0x00) -#define TAIKO_A_BIAS_OSC_BG_CTL (0x105) -#define TAIKO_A_BIAS_OSC_BG_CTL__POR (0x16) -#define TAIKO_A_CLK_BUFF_EN1 (0x108) -#define TAIKO_A_CLK_BUFF_EN1__POR (0x04) -#define TAIKO_A_CLK_BUFF_EN2 (0x109) -#define TAIKO_A_CLK_BUFF_EN2__POR (0x02) -#define TAIKO_A_LDO_H_MODE_1 (0x110) -#define TAIKO_A_LDO_H_MODE_1__POR (0x65) -#define TAIKO_A_LDO_H_MODE_2 (0x111) -#define TAIKO_A_LDO_H_MODE_2__POR (0xA8) -#define TAIKO_A_LDO_H_LOOP_CTL (0x112) -#define TAIKO_A_LDO_H_LOOP_CTL__POR (0x6B) -#define TAIKO_A_LDO_H_COMP_1 (0x113) -#define TAIKO_A_LDO_H_COMP_1__POR (0x84) -#define TAIKO_A_LDO_H_COMP_2 (0x114) -#define TAIKO_A_LDO_H_COMP_2__POR (0xE0) -#define TAIKO_A_LDO_H_BIAS_1 (0x115) -#define TAIKO_A_LDO_H_BIAS_1__POR (0x6D) -#define TAIKO_A_LDO_H_BIAS_2 (0x116) -#define TAIKO_A_LDO_H_BIAS_2__POR (0xA5) -#define TAIKO_A_LDO_H_BIAS_3 (0x117) -#define TAIKO_A_LDO_H_BIAS_3__POR (0x60) -#define TAIKO_A_VBAT_CLK (0x118) -#define TAIKO_A_VBAT_CLK__POR (0x03) -#define TAIKO_A_VBAT_LOOP (0x119) -#define TAIKO_A_VBAT_LOOP__POR (0x02) -#define TAIKO_A_VBAT_REF (0x11A) -#define TAIKO_A_VBAT_REF__POR (0x20) -#define TAIKO_A_VBAT_ADC_TEST (0x11B) -#define TAIKO_A_VBAT_ADC_TEST__POR (0x00) -#define TAIKO_A_VBAT_FE (0x11C) -#define TAIKO_A_VBAT_FE__POR (0x48) -#define TAIKO_A_VBAT_BIAS_1 (0x11D) -#define TAIKO_A_VBAT_BIAS_1__POR (0x03) -#define TAIKO_A_VBAT_BIAS_2 (0x11E) -#define TAIKO_A_VBAT_BIAS_2__POR (0x00) -#define TAIKO_A_VBAT_ADC_DATA_MSB (0x11F) -#define TAIKO_A_VBAT_ADC_DATA_MSB__POR (0x00) -#define TAIKO_A_VBAT_ADC_DATA_LSB (0x120) -#define TAIKO_A_VBAT_ADC_DATA_LSB__POR (0x00) -#define TAIKO_A_MICB_CFILT_1_CTL (0x128) -#define TAIKO_A_MICB_CFILT_1_CTL__POR (0x40) -#define TAIKO_A_MICB_CFILT_1_VAL (0x129) -#define TAIKO_A_MICB_CFILT_1_VAL__POR (0x80) -#define TAIKO_A_MICB_CFILT_1_PRECHRG (0x12A) -#define TAIKO_A_MICB_CFILT_1_PRECHRG__POR (0x38) -#define TAIKO_A_MICB_1_CTL (0x12B) -#define TAIKO_A_MICB_1_CTL__POR (0x16) -#define TAIKO_A_MICB_1_INT_RBIAS (0x12C) -#define TAIKO_A_MICB_1_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_1_MBHC (0x12D) -#define TAIKO_A_MICB_1_MBHC__POR (0x01) -#define TAIKO_A_MICB_CFILT_2_CTL (0x12E) -#define TAIKO_A_MICB_CFILT_2_CTL__POR (0x40) -#define TAIKO_A_MICB_CFILT_2_VAL (0x12F) -#define TAIKO_A_MICB_CFILT_2_VAL__POR (0x80) -#define TAIKO_A_MICB_CFILT_2_PRECHRG (0x130) -#define TAIKO_A_MICB_CFILT_2_PRECHRG__POR (0x38) -#define TAIKO_A_MICB_2_CTL (0x131) -#define TAIKO_A_MICB_2_CTL__POR (0x16) -#define TAIKO_A_MICB_2_INT_RBIAS (0x132) -#define TAIKO_A_MICB_2_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_2_MBHC (0x133) -#define TAIKO_A_MICB_2_MBHC__POR (0x02) -#define TAIKO_A_MICB_CFILT_3_CTL (0x134) -#define TAIKO_A_MICB_CFILT_3_CTL__POR (0x40) -#define TAIKO_A_MICB_CFILT_3_VAL (0x135) -#define TAIKO_A_MICB_CFILT_3_VAL__POR (0x80) -#define TAIKO_A_MICB_CFILT_3_PRECHRG (0x136) -#define TAIKO_A_MICB_CFILT_3_PRECHRG__POR (0x38) -#define TAIKO_A_MICB_3_CTL (0x137) -#define TAIKO_A_MICB_3_CTL__POR (0x16) -#define TAIKO_A_MICB_3_INT_RBIAS (0x138) -#define TAIKO_A_MICB_3_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_3_MBHC (0x139) -#define TAIKO_A_MICB_3_MBHC__POR (0x00) -#define TAIKO_A_MICB_4_CTL (0x13D) -#define TAIKO_A_MICB_4_CTL__POR (0x16) -#define TAIKO_A_MICB_4_INT_RBIAS (0x13E) -#define TAIKO_A_MICB_4_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_4_MBHC (0x13F) -#define TAIKO_A_MICB_4_MBHC__POR (0x01) -#define TAIKO_A_MBHC_INSERT_DETECT (0x14A) -#define TAIKO_A_MBHC_INSERT_DETECT__POR (0x00) -#define TAIKO_A_MBHC_INSERT_DET_STATUS (0x14B) -#define TAIKO_A_MBHC_INSERT_DET_STATUS__POR (0x00) -#define TAIKO_A_TX_COM_BIAS (0x14C) -#define TAIKO_A_TX_COM_BIAS__POR (0xF0) -#define TAIKO_A_MBHC_SCALING_MUX_1 (0x14E) -#define TAIKO_A_MBHC_SCALING_MUX_1__POR (0x00) -#define TAIKO_A_MBHC_SCALING_MUX_2 (0x14F) -#define TAIKO_A_MBHC_SCALING_MUX_2__POR (0x80) -#define TAIKO_A_MAD_ANA_CTRL (0x150) -#define TAIKO_A_MAD_ANA_CTRL__POR (0xF1) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_1 (0x151) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_1__POR (0x00) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_2 (0x152) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_2__POR (0x80) -#define TAIKO_A_TX_1_2_EN (0x153) -#define TAIKO_A_TX_1_2_EN__POR (0x00) -#define TAIKO_A_TX_1_2_TEST_EN (0x154) -#define TAIKO_A_TX_1_2_TEST_EN__POR (0xCC) -#define TAIKO_A_TX_1_2_ADC_CH1 (0x155) -#define TAIKO_A_TX_1_2_ADC_CH1__POR (0x44) -#define TAIKO_A_TX_1_2_ADC_CH2 (0x156) -#define TAIKO_A_TX_1_2_ADC_CH2__POR (0x44) -#define TAIKO_A_TX_1_2_ATEST_REFCTRL (0x157) -#define TAIKO_A_TX_1_2_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_1_2_TEST_CTL (0x158) -#define TAIKO_A_TX_1_2_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_1_2_TEST_BLOCK_EN (0x159) -#define TAIKO_A_TX_1_2_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_TX_1_2_TXFE_CLKDIV (0x15A) -#define TAIKO_A_TX_1_2_TXFE_CLKDIV__POR (0x55) -#define TAIKO_A_TX_1_2_SAR_ERR_CH1 (0x15B) -#define TAIKO_A_TX_1_2_SAR_ERR_CH1__POR (0x00) -#define TAIKO_A_TX_1_2_SAR_ERR_CH2 (0x15C) -#define TAIKO_A_TX_1_2_SAR_ERR_CH2__POR (0x00) -#define TAIKO_A_TX_3_4_EN (0x15D) -#define TAIKO_A_TX_3_4_EN__POR (0x00) -#define TAIKO_A_TX_3_4_TEST_EN (0x15E) -#define TAIKO_A_TX_3_4_TEST_EN__POR (0xCC) -#define TAIKO_A_TX_3_4_ADC_CH3 (0x15F) -#define TAIKO_A_TX_3_4_ADC_CH3__POR (0x44) -#define TAIKO_A_TX_3_4_ADC_CH4 (0x160) -#define TAIKO_A_TX_3_4_ADC_CH4__POR (0x44) -#define TAIKO_A_TX_3_4_ATEST_REFCTRL (0x161) -#define TAIKO_A_TX_3_4_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_3_4_TEST_CTL (0x162) -#define TAIKO_A_TX_3_4_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_3_4_TEST_BLOCK_EN (0x163) -#define TAIKO_A_TX_3_4_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_TX_3_4_TXFE_CKDIV (0x164) -#define TAIKO_A_TX_3_4_TXFE_CKDIV__POR (0x55) -#define TAIKO_A_TX_3_4_SAR_ERR_CH3 (0x165) -#define TAIKO_A_TX_3_4_SAR_ERR_CH3__POR (0x00) -#define TAIKO_A_TX_3_4_SAR_ERR_CH4 (0x166) -#define TAIKO_A_TX_3_4_SAR_ERR_CH4__POR (0x00) -#define TAIKO_A_TX_5_6_EN (0x167) -#define TAIKO_A_TX_5_6_EN__POR (0x11) -#define TAIKO_A_TX_5_6_TEST_EN (0x168) -#define TAIKO_A_TX_5_6_TEST_EN__POR (0xCC) -#define TAIKO_A_TX_5_6_ADC_CH5 (0x169) -#define TAIKO_A_TX_5_6_ADC_CH5__POR (0x44) -#define TAIKO_A_TX_5_6_ADC_CH6 (0x16A) -#define TAIKO_A_TX_5_6_ADC_CH6__POR (0x44) -#define TAIKO_A_TX_5_6_ATEST_REFCTRL (0x16B) -#define TAIKO_A_TX_5_6_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_5_6_TEST_CTL (0x16C) -#define TAIKO_A_TX_5_6_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_5_6_TEST_BLOCK_EN (0x16D) -#define TAIKO_A_TX_5_6_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_TX_5_6_TXFE_CKDIV (0x16E) -#define TAIKO_A_TX_5_6_TXFE_CKDIV__POR (0x55) -#define TAIKO_A_TX_5_6_SAR_ERR_CH5 (0x16F) -#define TAIKO_A_TX_5_6_SAR_ERR_CH5__POR (0x00) -#define TAIKO_A_TX_5_6_SAR_ERR_CH6 (0x170) -#define TAIKO_A_TX_5_6_SAR_ERR_CH6__POR (0x00) -#define TAIKO_A_TX_7_MBHC_EN (0x171) -#define TAIKO_A_TX_7_MBHC_EN__POR (0x0C) -#define TAIKO_A_TX_7_MBHC_ATEST_REFCTRL (0x172) -#define TAIKO_A_TX_7_MBHC_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_7_MBHC_ADC (0x173) -#define TAIKO_A_TX_7_MBHC_ADC__POR (0x44) -#define TAIKO_A_TX_7_MBHC_TEST_CTL (0x174) -#define TAIKO_A_TX_7_MBHC_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_7_MBHC_SAR_ERR (0x175) -#define TAIKO_A_TX_7_MBHC_SAR_ERR__POR (0x00) -#define TAIKO_A_TX_7_TXFE_CLKDIV (0x176) -#define TAIKO_A_TX_7_TXFE_CLKDIV__POR (0x0B) -#define TAIKO_A_BUCK_MODE_1 (0x181) -#define TAIKO_A_BUCK_MODE_1__POR (0x21) -#define TAIKO_A_BUCK_MODE_2 (0x182) -#define TAIKO_A_BUCK_MODE_2__POR (0xFF) -#define TAIKO_A_BUCK_MODE_3 (0x183) -#define TAIKO_A_BUCK_MODE_3__POR (0xCC) -#define TAIKO_A_BUCK_MODE_4 (0x184) -#define TAIKO_A_BUCK_MODE_4__POR (0x3A) -#define TAIKO_A_BUCK_MODE_5 (0x185) -#define TAIKO_A_BUCK_MODE_5__POR (0x00) -#define TAIKO_A_BUCK_CTRL_VCL_1 (0x186) -#define TAIKO_A_BUCK_CTRL_VCL_1__POR (0x48) -#define TAIKO_A_BUCK_CTRL_VCL_2 (0x187) -#define TAIKO_A_BUCK_CTRL_VCL_2__POR (0xA3) -#define TAIKO_A_BUCK_CTRL_VCL_3 (0x188) -#define TAIKO_A_BUCK_CTRL_VCL_3__POR (0x82) -#define TAIKO_A_BUCK_CTRL_CCL_1 (0x189) -#define TAIKO_A_BUCK_CTRL_CCL_1__POR (0xAB) -#define TAIKO_A_BUCK_CTRL_CCL_2 (0x18A) -#define TAIKO_A_BUCK_CTRL_CCL_2__POR (0xDC) -#define TAIKO_A_BUCK_CTRL_CCL_3 (0x18B) -#define TAIKO_A_BUCK_CTRL_CCL_3__POR (0x6A) -#define TAIKO_A_BUCK_CTRL_CCL_4 (0x18C) -#define TAIKO_A_BUCK_CTRL_CCL_4__POR (0x58) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_1 (0x18D) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_1__POR (0x50) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_2 (0x18E) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_2__POR (0x64) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_3 (0x18F) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_3__POR (0x77) -#define TAIKO_A_BUCK_TMUX_A_D (0x190) -#define TAIKO_A_BUCK_TMUX_A_D__POR (0x00) -#define TAIKO_A_NCP_BUCKREF (0x191) -#define TAIKO_A_NCP_BUCKREF__POR (0x00) -#define TAIKO_A_NCP_EN (0x192) -#define TAIKO_A_NCP_EN__POR (0xFE) -#define TAIKO_A_NCP_CLK (0x193) -#define TAIKO_A_NCP_CLK__POR (0x94) -#define TAIKO_A_NCP_STATIC (0x194) -#define TAIKO_A_NCP_STATIC__POR (0x28) -#define TAIKO_A_NCP_VTH_LOW (0x195) -#define TAIKO_A_NCP_VTH_LOW__POR (0x88) -#define TAIKO_A_NCP_VTH_HIGH (0x196) -#define TAIKO_A_NCP_VTH_HIGH__POR (0xA0) -#define TAIKO_A_NCP_ATEST (0x197) -#define TAIKO_A_NCP_ATEST__POR (0x00) -#define TAIKO_A_NCP_DTEST (0x198) -#define TAIKO_A_NCP_DTEST__POR (0x00) -#define TAIKO_A_NCP_DLY1 (0x199) -#define TAIKO_A_NCP_DLY1__POR (0x06) -#define TAIKO_A_NCP_DLY2 (0x19A) -#define TAIKO_A_NCP_DLY2__POR (0x06) -#define TAIKO_A_RX_AUX_SW_CTL (0x19B) -#define TAIKO_A_RX_AUX_SW_CTL__POR (0x00) -#define TAIKO_A_RX_PA_AUX_IN_CONN (0x19C) -#define TAIKO_A_RX_PA_AUX_IN_CONN__POR (0x00) -#define TAIKO_A_RX_COM_TIMER_DIV (0x19E) -#define TAIKO_A_RX_COM_TIMER_DIV__POR (0xE8) -#define TAIKO_A_RX_COM_OCP_CTL (0x19F) -#define TAIKO_A_RX_COM_OCP_CTL__POR (0x1F) -#define TAIKO_A_RX_COM_OCP_COUNT (0x1A0) -#define TAIKO_A_RX_COM_OCP_COUNT__POR (0x77) -#define TAIKO_A_RX_COM_DAC_CTL (0x1A1) -#define TAIKO_A_RX_COM_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_COM_BIAS (0x1A2) -#define TAIKO_A_RX_COM_BIAS__POR (0x00) -#define TAIKO_A_RX_HPH_AUTO_CHOP (0x1A4) -#define TAIKO_A_RX_HPH_AUTO_CHOP__POR (0x38) -#define TAIKO_A_RX_HPH_CHOP_CTL (0x1A5) -#define TAIKO_A_RX_HPH_CHOP_CTL__POR (0xB4) -#define TAIKO_A_RX_HPH_BIAS_PA (0x1A6) -#define TAIKO_A_RX_HPH_BIAS_PA__POR (0xAA) -#define TAIKO_A_RX_HPH_BIAS_LDO (0x1A7) -#define TAIKO_A_RX_HPH_BIAS_LDO__POR (0x87) -#define TAIKO_A_RX_HPH_BIAS_CNP (0x1A8) -#define TAIKO_A_RX_HPH_BIAS_CNP__POR (0x8A) -#define TAIKO_A_RX_HPH_BIAS_WG_OCP (0x1A9) -#define TAIKO_A_RX_HPH_BIAS_WG_OCP__POR (0x2A) -#define TAIKO_A_RX_HPH_OCP_CTL (0x1AA) -#define TAIKO_A_RX_HPH_OCP_CTL__POR (0x68) -#define TAIKO_A_RX_HPH_CNP_EN (0x1AB) -#define TAIKO_A_RX_HPH_CNP_EN__POR (0x80) -#define TAIKO_A_RX_HPH_CNP_WG_CTL (0x1AC) -#define TAIKO_A_RX_HPH_CNP_WG_CTL__POR (0xDE) -#define TAIKO_A_RX_HPH_CNP_WG_TIME (0x1AD) -#define TAIKO_A_RX_HPH_CNP_WG_TIME__POR (0x2A) -#define TAIKO_A_RX_HPH_L_GAIN (0x1AE) -#define TAIKO_A_RX_HPH_L_GAIN__POR (0x00) -#define TAIKO_A_RX_HPH_L_TEST (0x1AF) -#define TAIKO_A_RX_HPH_L_TEST__POR (0x00) -#define TAIKO_A_RX_HPH_L_PA_CTL (0x1B0) -#define TAIKO_A_RX_HPH_L_PA_CTL__POR (0x40) -#define TAIKO_A_RX_HPH_L_DAC_CTL (0x1B1) -#define TAIKO_A_RX_HPH_L_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_HPH_L_ATEST (0x1B2) -#define TAIKO_A_RX_HPH_L_ATEST__POR (0x00) -#define TAIKO_A_RX_HPH_L_STATUS (0x1B3) -#define TAIKO_A_RX_HPH_L_STATUS__POR (0x00) -#define TAIKO_A_RX_HPH_R_GAIN (0x1B4) -#define TAIKO_A_RX_HPH_R_GAIN__POR (0x00) -#define TAIKO_A_RX_HPH_R_TEST (0x1B5) -#define TAIKO_A_RX_HPH_R_TEST__POR (0x00) -#define TAIKO_A_RX_HPH_R_PA_CTL (0x1B6) -#define TAIKO_A_RX_HPH_R_PA_CTL__POR (0x40) -#define TAIKO_A_RX_HPH_R_DAC_CTL (0x1B7) -#define TAIKO_A_RX_HPH_R_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_HPH_R_ATEST (0x1B8) -#define TAIKO_A_RX_HPH_R_ATEST__POR (0x00) -#define TAIKO_A_RX_HPH_R_STATUS (0x1B9) -#define TAIKO_A_RX_HPH_R_STATUS__POR (0x00) -#define TAIKO_A_RX_EAR_BIAS_PA (0x1BA) -#define TAIKO_A_RX_EAR_BIAS_PA__POR (0xA6) -#define TAIKO_A_RX_EAR_BIAS_CMBUFF (0x1BB) -#define TAIKO_A_RX_EAR_BIAS_CMBUFF__POR (0xA0) -#define TAIKO_A_RX_EAR_EN (0x1BC) -#define TAIKO_A_RX_EAR_EN__POR (0x00) -#define TAIKO_A_RX_EAR_GAIN (0x1BD) -#define TAIKO_A_RX_EAR_GAIN__POR (0x02) -#define TAIKO_A_RX_EAR_CMBUFF (0x1BE) -#define TAIKO_A_RX_EAR_CMBUFF__POR (0x04) -#define TAIKO_A_RX_EAR_ICTL (0x1BF) -#define TAIKO_A_RX_EAR_ICTL__POR (0x40) -#define TAIKO_A_RX_EAR_CCOMP (0x1C0) -#define TAIKO_A_RX_EAR_CCOMP__POR (0x08) -#define TAIKO_A_RX_EAR_VCM (0x1C1) -#define TAIKO_A_RX_EAR_VCM__POR (0x03) -#define TAIKO_A_RX_EAR_CNP (0x1C2) -#define TAIKO_A_RX_EAR_CNP__POR (0xF2) -#define TAIKO_A_RX_EAR_DAC_CTL_ATEST (0x1C3) -#define TAIKO_A_RX_EAR_DAC_CTL_ATEST__POR (0x00) -#define TAIKO_A_RX_EAR_STATUS (0x1C5) -#define TAIKO_A_RX_EAR_STATUS__POR (0x04) -#define TAIKO_A_RX_LINE_BIAS_PA (0x1C6) -#define TAIKO_A_RX_LINE_BIAS_PA__POR (0xA8) -#define TAIKO_A_RX_BUCK_BIAS1 (0x1C7) -#define TAIKO_A_RX_BUCK_BIAS1__POR (0x42) -#define TAIKO_A_RX_BUCK_BIAS2 (0x1C8) -#define TAIKO_A_RX_BUCK_BIAS2__POR (0x84) -#define TAIKO_A_RX_LINE_COM (0x1C9) -#define TAIKO_A_RX_LINE_COM__POR (0x80) -#define TAIKO_A_RX_LINE_CNP_EN (0x1CA) -#define TAIKO_A_RX_LINE_CNP_EN__POR (0x00) -#define TAIKO_A_RX_LINE_CNP_WG_CTL (0x1CB) -#define TAIKO_A_RX_LINE_CNP_WG_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_CNP_WG_TIME (0x1CC) -#define TAIKO_A_RX_LINE_CNP_WG_TIME__POR (0x04) -#define TAIKO_A_RX_LINE_1_GAIN (0x1CD) -#define TAIKO_A_RX_LINE_1_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_1_TEST (0x1CE) -#define TAIKO_A_RX_LINE_1_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_1_DAC_CTL (0x1CF) -#define TAIKO_A_RX_LINE_1_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_1_STATUS (0x1D0) -#define TAIKO_A_RX_LINE_1_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_2_GAIN (0x1D1) -#define TAIKO_A_RX_LINE_2_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_2_TEST (0x1D2) -#define TAIKO_A_RX_LINE_2_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_2_DAC_CTL (0x1D3) -#define TAIKO_A_RX_LINE_2_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_2_STATUS (0x1D4) -#define TAIKO_A_RX_LINE_2_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_3_GAIN (0x1D5) -#define TAIKO_A_RX_LINE_3_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_3_TEST (0x1D6) -#define TAIKO_A_RX_LINE_3_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_3_DAC_CTL (0x1D7) -#define TAIKO_A_RX_LINE_3_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_3_STATUS (0x1D8) -#define TAIKO_A_RX_LINE_3_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_4_GAIN (0x1D9) -#define TAIKO_A_RX_LINE_4_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_4_TEST (0x1DA) -#define TAIKO_A_RX_LINE_4_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_4_DAC_CTL (0x1DB) -#define TAIKO_A_RX_LINE_4_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_4_STATUS (0x1DC) -#define TAIKO_A_RX_LINE_4_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_CNP_DBG (0x1DD) -#define TAIKO_A_RX_LINE_CNP_DBG__POR (0x00) -#define TAIKO_A_SPKR_DRV_EN (0x1DF) -#define TAIKO_A_SPKR_DRV_EN__POR (0x6F) -#define TAIKO_A_SPKR_DRV_GAIN (0x1E0) -#define TAIKO_A_SPKR_DRV_GAIN__POR (0x00) -#define TAIKO_A_SPKR_DRV_DAC_CTL (0x1E1) -#define TAIKO_A_SPKR_DRV_DAC_CTL__POR (0x04) -#define TAIKO_A_SPKR_DRV_OCP_CTL (0x1E2) -#define TAIKO_A_SPKR_DRV_OCP_CTL__POR (0x98) -#define TAIKO_A_SPKR_DRV_CLIP_DET (0x1E3) -#define TAIKO_A_SPKR_DRV_CLIP_DET__POR (0x48) -#define TAIKO_A_SPKR_DRV_IEC (0x1E4) -#define TAIKO_A_SPKR_DRV_IEC__POR (0x20) -#define TAIKO_A_SPKR_DRV_DBG_DAC (0x1E5) -#define TAIKO_A_SPKR_DRV_DBG_DAC__POR (0x05) -#define TAIKO_A_SPKR_DRV_DBG_PA (0x1E6) -#define TAIKO_A_SPKR_DRV_DBG_PA__POR (0x18) -#define TAIKO_A_SPKR_DRV_DBG_PWRSTG (0x1E7) -#define TAIKO_A_SPKR_DRV_DBG_PWRSTG__POR (0x00) -#define TAIKO_A_SPKR_DRV_BIAS_LDO (0x1E8) -#define TAIKO_A_SPKR_DRV_BIAS_LDO__POR (0x45) -#define TAIKO_A_SPKR_DRV_BIAS_INT (0x1E9) -#define TAIKO_A_SPKR_DRV_BIAS_INT__POR (0xA5) -#define TAIKO_A_SPKR_DRV_BIAS_PA (0x1EA) -#define TAIKO_A_SPKR_DRV_BIAS_PA__POR (0x55) -#define TAIKO_A_SPKR_DRV_STATUS_OCP (0x1EB) -#define TAIKO_A_SPKR_DRV_STATUS_OCP__POR (0x00) -#define TAIKO_A_SPKR_DRV_STATUS_PA (0x1EC) -#define TAIKO_A_SPKR_DRV_STATUS_PA__POR (0x00) -#define TAIKO_A_SPKR_PROT_EN (0x1ED) -#define TAIKO_A_SPKR_PROT_EN__POR (0x00) -#define TAIKO_A_SPKR_PROT_ADC_EN (0x1EE) -#define TAIKO_A_SPKR_PROT_ADC_EN__POR (0x44) -#define TAIKO_A_SPKR_PROT_ISENSE_BIAS (0x1EF) -#define TAIKO_A_SPKR_PROT_ISENSE_BIAS__POR (0x44) -#define TAIKO_A_SPKR_PROT_VSENSE_BIAS (0x1F0) -#define TAIKO_A_SPKR_PROT_VSENSE_BIAS__POR (0x44) -#define TAIKO_A_SPKR_PROT_ADC_ATEST_REFCTRL (0x1F1) -#define TAIKO_A_SPKR_PROT_ADC_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_SPKR_PROT_ADC_TEST_CTL (0x1F2) -#define TAIKO_A_SPKR_PROT_ADC_TEST_CTL__POR (0x38) -#define TAIKO_A_SPKR_PROT_TEST_BLOCK_EN (0x1F3) -#define TAIKO_A_SPKR_PROT_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_SPKR_PROT_ATEST (0x1F4) -#define TAIKO_A_SPKR_PROT_ATEST__POR (0x00) -#define TAIKO_A_SPKR_PROT_V_SAR_ERR (0x1F5) -#define TAIKO_A_SPKR_PROT_V_SAR_ERR__POR (0x00) -#define TAIKO_A_SPKR_PROT_I_SAR_ERR (0x1F6) -#define TAIKO_A_SPKR_PROT_I_SAR_ERR__POR (0x00) -#define TAIKO_A_SPKR_PROT_LDO_CTRL (0x1F7) -#define TAIKO_A_SPKR_PROT_LDO_CTRL__POR (0x00) -#define TAIKO_A_SPKR_PROT_ISENSE_CTRL (0x1F8) -#define TAIKO_A_SPKR_PROT_ISENSE_CTRL__POR (0x00) -#define TAIKO_A_SPKR_PROT_VSENSE_CTRL (0x1F9) -#define TAIKO_A_SPKR_PROT_VSENSE_CTRL__POR (0x00) -#define TAIKO_A_RC_OSC_FREQ (0x1FA) -#define TAIKO_A_RC_OSC_FREQ__POR (0x46) -#define TAIKO_A_RC_OSC_TEST (0x1FB) -#define TAIKO_A_RC_OSC_TEST__POR (0x0A) -#define TAIKO_A_RC_OSC_STATUS (0x1FC) -#define TAIKO_A_RC_OSC_STATUS__POR (0x18) -#define TAIKO_A_RC_OSC_TUNER (0x1FD) -#define TAIKO_A_RC_OSC_TUNER__POR (0x00) -#define TAIKO_A_MBHC_HPH (0x1FE) -#define TAIKO_A_MBHC_HPH__POR (0x44) -#define TAIKO_A_CDC_ANC1_B1_CTL (0x200) -#define TAIKO_A_CDC_ANC1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_B1_CTL (0x280) -#define TAIKO_A_CDC_ANC2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_SHIFT (0x201) -#define TAIKO_A_CDC_ANC1_SHIFT__POR (0x00) -#define TAIKO_A_CDC_ANC2_SHIFT (0x281) -#define TAIKO_A_CDC_ANC2_SHIFT__POR (0x00) -#define TAIKO_A_CDC_ANC1_IIR_B1_CTL (0x202) -#define TAIKO_A_CDC_ANC1_IIR_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_IIR_B1_CTL (0x282) -#define TAIKO_A_CDC_ANC2_IIR_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_IIR_B2_CTL (0x203) -#define TAIKO_A_CDC_ANC1_IIR_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_IIR_B2_CTL (0x283) -#define TAIKO_A_CDC_ANC2_IIR_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_IIR_B3_CTL (0x204) -#define TAIKO_A_CDC_ANC1_IIR_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_IIR_B3_CTL (0x284) -#define TAIKO_A_CDC_ANC2_IIR_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_LPF_B1_CTL (0x206) -#define TAIKO_A_CDC_ANC1_LPF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_LPF_B1_CTL (0x286) -#define TAIKO_A_CDC_ANC2_LPF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_LPF_B2_CTL (0x207) -#define TAIKO_A_CDC_ANC1_LPF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_LPF_B2_CTL (0x287) -#define TAIKO_A_CDC_ANC2_LPF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_SPARE (0x209) -#define TAIKO_A_CDC_ANC1_SPARE__POR (0x00) -#define TAIKO_A_CDC_ANC2_SPARE (0x289) -#define TAIKO_A_CDC_ANC2_SPARE__POR (0x00) -#define TAIKO_A_CDC_ANC1_SMLPF_CTL (0x20A) -#define TAIKO_A_CDC_ANC1_SMLPF_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_SMLPF_CTL (0x28A) -#define TAIKO_A_CDC_ANC2_SMLPF_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_DCFLT_CTL (0x20B) -#define TAIKO_A_CDC_ANC1_DCFLT_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_DCFLT_CTL (0x28B) -#define TAIKO_A_CDC_ANC2_DCFLT_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_GAIN_CTL (0x20C) -#define TAIKO_A_CDC_ANC1_GAIN_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_GAIN_CTL (0x28C) -#define TAIKO_A_CDC_ANC2_GAIN_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_B2_CTL (0x20D) -#define TAIKO_A_CDC_ANC1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_B2_CTL (0x28D) -#define TAIKO_A_CDC_ANC2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_TX1_VOL_CTL_TIMER (0x220) -#define TAIKO_A_CDC_TX1_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX2_VOL_CTL_TIMER (0x228) -#define TAIKO_A_CDC_TX2_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX3_VOL_CTL_TIMER (0x230) -#define TAIKO_A_CDC_TX3_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX4_VOL_CTL_TIMER (0x238) -#define TAIKO_A_CDC_TX4_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX5_VOL_CTL_TIMER (0x240) -#define TAIKO_A_CDC_TX5_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX6_VOL_CTL_TIMER (0x248) -#define TAIKO_A_CDC_TX6_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX7_VOL_CTL_TIMER (0x250) -#define TAIKO_A_CDC_TX7_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX8_VOL_CTL_TIMER (0x258) -#define TAIKO_A_CDC_TX8_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX9_VOL_CTL_TIMER (0x260) -#define TAIKO_A_CDC_TX9_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX10_VOL_CTL_TIMER (0x268) -#define TAIKO_A_CDC_TX10_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX1_VOL_CTL_GAIN (0x221) -#define TAIKO_A_CDC_TX1_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX2_VOL_CTL_GAIN (0x229) -#define TAIKO_A_CDC_TX2_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX3_VOL_CTL_GAIN (0x231) -#define TAIKO_A_CDC_TX3_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX4_VOL_CTL_GAIN (0x239) -#define TAIKO_A_CDC_TX4_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX5_VOL_CTL_GAIN (0x241) -#define TAIKO_A_CDC_TX5_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX6_VOL_CTL_GAIN (0x249) -#define TAIKO_A_CDC_TX6_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX7_VOL_CTL_GAIN (0x251) -#define TAIKO_A_CDC_TX7_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX8_VOL_CTL_GAIN (0x259) -#define TAIKO_A_CDC_TX8_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX9_VOL_CTL_GAIN (0x261) -#define TAIKO_A_CDC_TX9_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX10_VOL_CTL_GAIN (0x269) -#define TAIKO_A_CDC_TX10_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX1_VOL_CTL_CFG (0x222) -#define TAIKO_A_CDC_TX1_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX2_VOL_CTL_CFG (0x22A) -#define TAIKO_A_CDC_TX2_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX3_VOL_CTL_CFG (0x232) -#define TAIKO_A_CDC_TX3_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX4_VOL_CTL_CFG (0x23A) -#define TAIKO_A_CDC_TX4_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX5_VOL_CTL_CFG (0x242) -#define TAIKO_A_CDC_TX5_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX6_VOL_CTL_CFG (0x24A) -#define TAIKO_A_CDC_TX6_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX7_VOL_CTL_CFG (0x252) -#define TAIKO_A_CDC_TX7_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX8_VOL_CTL_CFG (0x25A) -#define TAIKO_A_CDC_TX8_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX9_VOL_CTL_CFG (0x262) -#define TAIKO_A_CDC_TX9_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX10_VOL_CTL_CFG (0x26A) -#define TAIKO_A_CDC_TX10_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX1_MUX_CTL (0x223) -#define TAIKO_A_CDC_TX1_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX2_MUX_CTL (0x22B) -#define TAIKO_A_CDC_TX2_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX3_MUX_CTL (0x233) -#define TAIKO_A_CDC_TX3_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX4_MUX_CTL (0x23B) -#define TAIKO_A_CDC_TX4_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX5_MUX_CTL (0x243) -#define TAIKO_A_CDC_TX5_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX6_MUX_CTL (0x24B) -#define TAIKO_A_CDC_TX6_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX7_MUX_CTL (0x253) -#define TAIKO_A_CDC_TX7_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX8_MUX_CTL (0x25B) -#define TAIKO_A_CDC_TX8_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX9_MUX_CTL (0x263) -#define TAIKO_A_CDC_TX9_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX10_MUX_CTL (0x26B) -#define TAIKO_A_CDC_TX10_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX1_CLK_FS_CTL (0x224) -#define TAIKO_A_CDC_TX1_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX2_CLK_FS_CTL (0x22C) -#define TAIKO_A_CDC_TX2_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX3_CLK_FS_CTL (0x234) -#define TAIKO_A_CDC_TX3_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX4_CLK_FS_CTL (0x23C) -#define TAIKO_A_CDC_TX4_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX5_CLK_FS_CTL (0x244) -#define TAIKO_A_CDC_TX5_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX6_CLK_FS_CTL (0x24C) -#define TAIKO_A_CDC_TX6_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX7_CLK_FS_CTL (0x254) -#define TAIKO_A_CDC_TX7_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX8_CLK_FS_CTL (0x25C) -#define TAIKO_A_CDC_TX8_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX9_CLK_FS_CTL (0x264) -#define TAIKO_A_CDC_TX9_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX10_CLK_FS_CTL (0x26C) -#define TAIKO_A_CDC_TX10_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX1_DMIC_CTL (0x225) -#define TAIKO_A_CDC_TX1_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX2_DMIC_CTL (0x22D) -#define TAIKO_A_CDC_TX2_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX3_DMIC_CTL (0x235) -#define TAIKO_A_CDC_TX3_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX4_DMIC_CTL (0x23D) -#define TAIKO_A_CDC_TX4_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX5_DMIC_CTL (0x245) -#define TAIKO_A_CDC_TX5_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX6_DMIC_CTL (0x24D) -#define TAIKO_A_CDC_TX6_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX7_DMIC_CTL (0x255) -#define TAIKO_A_CDC_TX7_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX8_DMIC_CTL (0x25D) -#define TAIKO_A_CDC_TX8_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX9_DMIC_CTL (0x265) -#define TAIKO_A_CDC_TX9_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX10_DMIC_CTL (0x26D) -#define TAIKO_A_CDC_TX10_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B1_CTL (0x278) -#define TAIKO_A_CDC_DEBUG_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B2_CTL (0x279) -#define TAIKO_A_CDC_DEBUG_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B3_CTL (0x27A) -#define TAIKO_A_CDC_DEBUG_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B4_CTL (0x27B) -#define TAIKO_A_CDC_DEBUG_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B5_CTL (0x27C) -#define TAIKO_A_CDC_DEBUG_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B6_CTL (0x27D) -#define TAIKO_A_CDC_DEBUG_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B7_CTL (0x27E) -#define TAIKO_A_CDC_DEBUG_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_SRC1_PDA_CFG (0x2A0) -#define TAIKO_A_CDC_SRC1_PDA_CFG__POR (0x00) -#define TAIKO_A_CDC_SRC2_PDA_CFG (0x2A8) -#define TAIKO_A_CDC_SRC2_PDA_CFG__POR (0x00) -#define TAIKO_A_CDC_SRC1_FS_CTL (0x2A1) -#define TAIKO_A_CDC_SRC1_FS_CTL__POR (0x1B) -#define TAIKO_A_CDC_SRC2_FS_CTL (0x2A9) -#define TAIKO_A_CDC_SRC2_FS_CTL__POR (0x1B) -#define TAIKO_A_CDC_RX1_B1_CTL (0x2B0) -#define TAIKO_A_CDC_RX1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B1_CTL (0x2B8) -#define TAIKO_A_CDC_RX2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B1_CTL (0x2C0) -#define TAIKO_A_CDC_RX3_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B1_CTL (0x2C8) -#define TAIKO_A_CDC_RX4_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B1_CTL (0x2D0) -#define TAIKO_A_CDC_RX5_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B1_CTL (0x2D8) -#define TAIKO_A_CDC_RX6_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B1_CTL (0x2E0) -#define TAIKO_A_CDC_RX7_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B2_CTL (0x2B1) -#define TAIKO_A_CDC_RX1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B2_CTL (0x2B9) -#define TAIKO_A_CDC_RX2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B2_CTL (0x2C1) -#define TAIKO_A_CDC_RX3_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B2_CTL (0x2C9) -#define TAIKO_A_CDC_RX4_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B2_CTL (0x2D1) -#define TAIKO_A_CDC_RX5_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B2_CTL (0x2D9) -#define TAIKO_A_CDC_RX6_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B2_CTL (0x2E1) -#define TAIKO_A_CDC_RX7_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B3_CTL (0x2B2) -#define TAIKO_A_CDC_RX1_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B3_CTL (0x2BA) -#define TAIKO_A_CDC_RX2_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B3_CTL (0x2C2) -#define TAIKO_A_CDC_RX3_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B3_CTL (0x2CA) -#define TAIKO_A_CDC_RX4_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B3_CTL (0x2D2) -#define TAIKO_A_CDC_RX5_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B3_CTL (0x2DA) -#define TAIKO_A_CDC_RX6_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B3_CTL (0x2E2) -#define TAIKO_A_CDC_RX7_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B4_CTL (0x2B3) -#define TAIKO_A_CDC_RX1_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B4_CTL (0x2BB) -#define TAIKO_A_CDC_RX2_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B4_CTL (0x2C3) -#define TAIKO_A_CDC_RX3_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B4_CTL (0x2CB) -#define TAIKO_A_CDC_RX4_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B4_CTL (0x2D3) -#define TAIKO_A_CDC_RX5_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B4_CTL (0x2DB) -#define TAIKO_A_CDC_RX6_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B4_CTL (0x2E3) -#define TAIKO_A_CDC_RX7_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B5_CTL (0x2B4) -#define TAIKO_A_CDC_RX1_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX2_B5_CTL (0x2BC) -#define TAIKO_A_CDC_RX2_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX3_B5_CTL (0x2C4) -#define TAIKO_A_CDC_RX3_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX4_B5_CTL (0x2CC) -#define TAIKO_A_CDC_RX4_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX5_B5_CTL (0x2D4) -#define TAIKO_A_CDC_RX5_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX6_B5_CTL (0x2DC) -#define TAIKO_A_CDC_RX6_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX7_B5_CTL (0x2E4) -#define TAIKO_A_CDC_RX7_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX1_B6_CTL (0x2B5) -#define TAIKO_A_CDC_RX1_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX2_B6_CTL (0x2BD) -#define TAIKO_A_CDC_RX2_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX3_B6_CTL (0x2C5) -#define TAIKO_A_CDC_RX3_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX4_B6_CTL (0x2CD) -#define TAIKO_A_CDC_RX4_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX5_B6_CTL (0x2D5) -#define TAIKO_A_CDC_RX5_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX6_B6_CTL (0x2DD) -#define TAIKO_A_CDC_RX6_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX7_B6_CTL (0x2E5) -#define TAIKO_A_CDC_RX7_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX1_VOL_CTL_B1_CTL (0x2B6) -#define TAIKO_A_CDC_RX1_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_VOL_CTL_B1_CTL (0x2BE) -#define TAIKO_A_CDC_RX2_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_VOL_CTL_B1_CTL (0x2C6) -#define TAIKO_A_CDC_RX3_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_VOL_CTL_B1_CTL (0x2CE) -#define TAIKO_A_CDC_RX4_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_VOL_CTL_B1_CTL (0x2D6) -#define TAIKO_A_CDC_RX5_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_VOL_CTL_B1_CTL (0x2DE) -#define TAIKO_A_CDC_RX6_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_VOL_CTL_B1_CTL (0x2E6) -#define TAIKO_A_CDC_RX7_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL (0x2B7) -#define TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL (0x2BF) -#define TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL (0x2C7) -#define TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL (0x2CF) -#define TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL (0x2D7) -#define TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL (0x2DF) -#define TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_VOL_CTL_B2_CTL (0x2E7) -#define TAIKO_A_CDC_RX7_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_VBAT_CFG (0x2E8) -#define TAIKO_A_CDC_VBAT_CFG__POR (0x1A) -#define TAIKO_A_CDC_VBAT_ADC_CAL1 (0x2E9) -#define TAIKO_A_CDC_VBAT_ADC_CAL1__POR (0x00) -#define TAIKO_A_CDC_VBAT_ADC_CAL2 (0x2EA) -#define TAIKO_A_CDC_VBAT_ADC_CAL2__POR (0x00) -#define TAIKO_A_CDC_VBAT_ADC_CAL3 (0x2EB) -#define TAIKO_A_CDC_VBAT_ADC_CAL3__POR (0x04) -#define TAIKO_A_CDC_VBAT_PK_EST1 (0x2EC) -#define TAIKO_A_CDC_VBAT_PK_EST1__POR (0xE0) -#define TAIKO_A_CDC_VBAT_PK_EST2 (0x2ED) -#define TAIKO_A_CDC_VBAT_PK_EST2__POR (0x01) -#define TAIKO_A_CDC_VBAT_PK_EST3 (0x2EE) -#define TAIKO_A_CDC_VBAT_PK_EST3__POR (0x40) -#define TAIKO_A_CDC_VBAT_RF_PROC1 (0x2EF) -#define TAIKO_A_CDC_VBAT_RF_PROC1__POR (0x2A) -#define TAIKO_A_CDC_VBAT_RF_PROC2 (0x2F0) -#define TAIKO_A_CDC_VBAT_RF_PROC2__POR (0x86) -#define TAIKO_A_CDC_VBAT_TAC1 (0x2F1) -#define TAIKO_A_CDC_VBAT_TAC1__POR (0x70) -#define TAIKO_A_CDC_VBAT_TAC2 (0x2F2) -#define TAIKO_A_CDC_VBAT_TAC2__POR (0x18) -#define TAIKO_A_CDC_VBAT_TAC3 (0x2F3) -#define TAIKO_A_CDC_VBAT_TAC3__POR (0x18) -#define TAIKO_A_CDC_VBAT_TAC4 (0x2F4) -#define TAIKO_A_CDC_VBAT_TAC4__POR (0x03) -#define TAIKO_A_CDC_VBAT_GAIN_UPD1 (0x2F5) -#define TAIKO_A_CDC_VBAT_GAIN_UPD1__POR (0x01) -#define TAIKO_A_CDC_VBAT_GAIN_UPD2 (0x2F6) -#define TAIKO_A_CDC_VBAT_GAIN_UPD2__POR (0x00) -#define TAIKO_A_CDC_VBAT_GAIN_UPD3 (0x2F7) -#define TAIKO_A_CDC_VBAT_GAIN_UPD3__POR (0x64) -#define TAIKO_A_CDC_VBAT_GAIN_UPD4 (0x2F8) -#define TAIKO_A_CDC_VBAT_GAIN_UPD4__POR (0x01) -#define TAIKO_A_CDC_VBAT_DEBUG1 (0x2F9) -#define TAIKO_A_CDC_VBAT_DEBUG1__POR (0x00) -#define TAIKO_A_CDC_CLK_ANC_RESET_CTL (0x300) -#define TAIKO_A_CDC_CLK_ANC_RESET_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_RESET_CTL (0x301) -#define TAIKO_A_CDC_CLK_RX_RESET_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_RESET_B1_CTL (0x302) -#define TAIKO_A_CDC_CLK_TX_RESET_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_RESET_B2_CTL (0x303) -#define TAIKO_A_CDC_CLK_TX_RESET_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_DMIC_B1_CTL (0x304) -#define TAIKO_A_CDC_CLK_DMIC_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_DMIC_B2_CTL (0x305) -#define TAIKO_A_CDC_CLK_DMIC_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_I2S_CTL (0x306) -#define TAIKO_A_CDC_CLK_RX_I2S_CTL__POR (0x03) -#define TAIKO_A_CDC_CLK_TX_I2S_CTL (0x307) -#define TAIKO_A_CDC_CLK_TX_I2S_CTL__POR (0x03) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B1_CTL (0x308) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B2_CTL (0x309) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL (0x30A) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL (0x30B) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_OTHR_CTL (0x30C) -#define TAIKO_A_CDC_CLK_OTHR_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RDAC_CLK_EN_CTL (0x30D) -#define TAIKO_A_CDC_CLK_RDAC_CLK_EN_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_ANC_CLK_EN_CTL (0x30E) -#define TAIKO_A_CDC_CLK_ANC_CLK_EN_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_B1_CTL (0x30F) -#define TAIKO_A_CDC_CLK_RX_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_B2_CTL (0x310) -#define TAIKO_A_CDC_CLK_RX_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_MCLK_CTL (0x311) -#define TAIKO_A_CDC_CLK_MCLK_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_PDM_CTL (0x312) -#define TAIKO_A_CDC_CLK_PDM_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_SD_CTL (0x313) -#define TAIKO_A_CDC_CLK_SD_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_POWER_CTL (0x314) -#define TAIKO_A_CDC_CLK_POWER_CTL__POR (0x00) -#define TAIKO_A_CDC_CLSH_B1_CTL (0x320) -#define TAIKO_A_CDC_CLSH_B1_CTL__POR (0xE4) -#define TAIKO_A_CDC_CLSH_B2_CTL (0x321) -#define TAIKO_A_CDC_CLSH_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLSH_B3_CTL (0x322) -#define TAIKO_A_CDC_CLSH_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CLSH_BUCK_NCP_VARS (0x323) -#define TAIKO_A_CDC_CLSH_BUCK_NCP_VARS__POR (0x00) -#define TAIKO_A_CDC_CLSH_IDLE_HPH_THSD (0x324) -#define TAIKO_A_CDC_CLSH_IDLE_HPH_THSD__POR (0x12) -#define TAIKO_A_CDC_CLSH_IDLE_EAR_THSD (0x325) -#define TAIKO_A_CDC_CLSH_IDLE_EAR_THSD__POR (0x0C) -#define TAIKO_A_CDC_CLSH_FCLKONLY_HPH_THSD (0x326) -#define TAIKO_A_CDC_CLSH_FCLKONLY_HPH_THSD__POR (0x18) -#define TAIKO_A_CDC_CLSH_FCLKONLY_EAR_THSD (0x327) -#define TAIKO_A_CDC_CLSH_FCLKONLY_EAR_THSD__POR (0x23) -#define TAIKO_A_CDC_CLSH_K_ADDR (0x328) -#define TAIKO_A_CDC_CLSH_K_ADDR__POR (0x00) -#define TAIKO_A_CDC_CLSH_K_DATA (0x329) -#define TAIKO_A_CDC_CLSH_K_DATA__POR (0xA4) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_L (0x32A) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_L__POR (0xD7) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_U (0x32B) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_U__POR (0x05) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_L (0x32C) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_L__POR (0x60) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_U (0x32D) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_U__POR (0x09) -#define TAIKO_A_CDC_CLSH_V_PA_HD_EAR (0x32E) -#define TAIKO_A_CDC_CLSH_V_PA_HD_EAR__POR (0x00) -#define TAIKO_A_CDC_CLSH_V_PA_HD_HPH (0x32F) -#define TAIKO_A_CDC_CLSH_V_PA_HD_HPH__POR (0x00) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_EAR (0x330) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_EAR__POR (0x00) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_HPH (0x331) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_HPH__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B1_CTL (0x340) -#define TAIKO_A_CDC_IIR1_GAIN_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B1_CTL (0x350) -#define TAIKO_A_CDC_IIR2_GAIN_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B2_CTL (0x341) -#define TAIKO_A_CDC_IIR1_GAIN_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B2_CTL (0x351) -#define TAIKO_A_CDC_IIR2_GAIN_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B3_CTL (0x342) -#define TAIKO_A_CDC_IIR1_GAIN_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B3_CTL (0x352) -#define TAIKO_A_CDC_IIR2_GAIN_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B4_CTL (0x343) -#define TAIKO_A_CDC_IIR1_GAIN_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B4_CTL (0x353) -#define TAIKO_A_CDC_IIR2_GAIN_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B5_CTL (0x344) -#define TAIKO_A_CDC_IIR1_GAIN_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B5_CTL (0x354) -#define TAIKO_A_CDC_IIR2_GAIN_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B6_CTL (0x345) -#define TAIKO_A_CDC_IIR1_GAIN_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B6_CTL (0x355) -#define TAIKO_A_CDC_IIR2_GAIN_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B7_CTL (0x346) -#define TAIKO_A_CDC_IIR1_GAIN_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B7_CTL (0x356) -#define TAIKO_A_CDC_IIR2_GAIN_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B8_CTL (0x347) -#define TAIKO_A_CDC_IIR1_GAIN_B8_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B8_CTL (0x357) -#define TAIKO_A_CDC_IIR2_GAIN_B8_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_CTL (0x348) -#define TAIKO_A_CDC_IIR1_CTL__POR (0x40) -#define TAIKO_A_CDC_IIR2_CTL (0x358) -#define TAIKO_A_CDC_IIR2_CTL__POR (0x40) -#define TAIKO_A_CDC_IIR1_GAIN_TIMER_CTL (0x349) -#define TAIKO_A_CDC_IIR1_GAIN_TIMER_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_TIMER_CTL (0x359) -#define TAIKO_A_CDC_IIR2_GAIN_TIMER_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_COEF_B1_CTL (0x34A) -#define TAIKO_A_CDC_IIR1_COEF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_COEF_B1_CTL (0x35A) -#define TAIKO_A_CDC_IIR2_COEF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_COEF_B2_CTL (0x34B) -#define TAIKO_A_CDC_IIR1_COEF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_COEF_B2_CTL (0x35B) -#define TAIKO_A_CDC_IIR2_COEF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_TOP_GAIN_UPDATE (0x360) -#define TAIKO_A_CDC_TOP_GAIN_UPDATE__POR (0x00) -#define TAIKO_A_CDC_COMP0_B1_CTL (0x368) -#define TAIKO_A_CDC_COMP0_B1_CTL__POR (0x30) -#define TAIKO_A_CDC_COMP1_B1_CTL (0x370) -#define TAIKO_A_CDC_COMP1_B1_CTL__POR (0x30) -#define TAIKO_A_CDC_COMP2_B1_CTL (0x378) -#define TAIKO_A_CDC_COMP2_B1_CTL__POR (0x30) -#define TAIKO_A_CDC_COMP0_B2_CTL (0x369) -#define TAIKO_A_CDC_COMP0_B2_CTL__POR (0xB5) -#define TAIKO_A_CDC_COMP1_B2_CTL (0x371) -#define TAIKO_A_CDC_COMP1_B2_CTL__POR (0xB5) -#define TAIKO_A_CDC_COMP2_B2_CTL (0x379) -#define TAIKO_A_CDC_COMP2_B2_CTL__POR (0xB5) -#define TAIKO_A_CDC_COMP0_B3_CTL (0x36A) -#define TAIKO_A_CDC_COMP0_B3_CTL__POR (0x28) -#define TAIKO_A_CDC_COMP1_B3_CTL (0x372) -#define TAIKO_A_CDC_COMP1_B3_CTL__POR (0x28) -#define TAIKO_A_CDC_COMP2_B3_CTL (0x37A) -#define TAIKO_A_CDC_COMP2_B3_CTL__POR (0x28) -#define TAIKO_A_CDC_COMP0_B4_CTL (0x36B) -#define TAIKO_A_CDC_COMP0_B4_CTL__POR (0x3C) -#define TAIKO_A_CDC_COMP1_B4_CTL (0x373) -#define TAIKO_A_CDC_COMP1_B4_CTL__POR (0x3C) -#define TAIKO_A_CDC_COMP2_B4_CTL (0x37B) -#define TAIKO_A_CDC_COMP2_B4_CTL__POR (0x3C) -#define TAIKO_A_CDC_COMP0_B5_CTL (0x36C) -#define TAIKO_A_CDC_COMP0_B5_CTL__POR (0x1F) -#define TAIKO_A_CDC_COMP1_B5_CTL (0x374) -#define TAIKO_A_CDC_COMP1_B5_CTL__POR (0x1F) -#define TAIKO_A_CDC_COMP2_B5_CTL (0x37C) -#define TAIKO_A_CDC_COMP2_B5_CTL__POR (0x1F) -#define TAIKO_A_CDC_COMP0_B6_CTL (0x36D) -#define TAIKO_A_CDC_COMP0_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_COMP1_B6_CTL (0x375) -#define TAIKO_A_CDC_COMP1_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_COMP2_B6_CTL (0x37D) -#define TAIKO_A_CDC_COMP2_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_COMP0_SHUT_DOWN_STATUS (0x36E) -#define TAIKO_A_CDC_COMP0_SHUT_DOWN_STATUS__POR (0x03) -#define TAIKO_A_CDC_COMP1_SHUT_DOWN_STATUS (0x376) -#define TAIKO_A_CDC_COMP1_SHUT_DOWN_STATUS__POR (0x03) -#define TAIKO_A_CDC_COMP2_SHUT_DOWN_STATUS (0x37E) -#define TAIKO_A_CDC_COMP2_SHUT_DOWN_STATUS__POR (0x03) -#define TAIKO_A_CDC_COMP0_FS_CFG (0x36F) -#define TAIKO_A_CDC_COMP0_FS_CFG__POR (0x03) -#define TAIKO_A_CDC_COMP1_FS_CFG (0x377) -#define TAIKO_A_CDC_COMP1_FS_CFG__POR (0x03) -#define TAIKO_A_CDC_COMP2_FS_CFG (0x37F) -#define TAIKO_A_CDC_COMP2_FS_CFG__POR (0x03) -#define TAIKO_A_CDC_CONN_RX1_B1_CTL (0x380) -#define TAIKO_A_CDC_CONN_RX1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX1_B2_CTL (0x381) -#define TAIKO_A_CDC_CONN_RX1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX1_B3_CTL (0x382) -#define TAIKO_A_CDC_CONN_RX1_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX2_B1_CTL (0x383) -#define TAIKO_A_CDC_CONN_RX2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX2_B2_CTL (0x384) -#define TAIKO_A_CDC_CONN_RX2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX2_B3_CTL (0x385) -#define TAIKO_A_CDC_CONN_RX2_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX3_B1_CTL (0x386) -#define TAIKO_A_CDC_CONN_RX3_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX3_B2_CTL (0x387) -#define TAIKO_A_CDC_CONN_RX3_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX4_B1_CTL (0x388) -#define TAIKO_A_CDC_CONN_RX4_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX4_B2_CTL (0x389) -#define TAIKO_A_CDC_CONN_RX4_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX5_B1_CTL (0x38A) -#define TAIKO_A_CDC_CONN_RX5_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX5_B2_CTL (0x38B) -#define TAIKO_A_CDC_CONN_RX5_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX6_B1_CTL (0x38C) -#define TAIKO_A_CDC_CONN_RX6_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX6_B2_CTL (0x38D) -#define TAIKO_A_CDC_CONN_RX6_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX7_B1_CTL (0x38E) -#define TAIKO_A_CDC_CONN_RX7_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX7_B2_CTL (0x38F) -#define TAIKO_A_CDC_CONN_RX7_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX7_B3_CTL (0x390) -#define TAIKO_A_CDC_CONN_RX7_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_ANC_B1_CTL (0x391) -#define TAIKO_A_CDC_CONN_ANC_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_ANC_B2_CTL (0x392) -#define TAIKO_A_CDC_CONN_ANC_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B1_CTL (0x393) -#define TAIKO_A_CDC_CONN_TX_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B2_CTL (0x394) -#define TAIKO_A_CDC_CONN_TX_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B3_CTL (0x395) -#define TAIKO_A_CDC_CONN_TX_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B4_CTL (0x396) -#define TAIKO_A_CDC_CONN_TX_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B1_CTL (0x397) -#define TAIKO_A_CDC_CONN_EQ1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B2_CTL (0x398) -#define TAIKO_A_CDC_CONN_EQ1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B3_CTL (0x399) -#define TAIKO_A_CDC_CONN_EQ1_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B4_CTL (0x39A) -#define TAIKO_A_CDC_CONN_EQ1_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B1_CTL (0x39B) -#define TAIKO_A_CDC_CONN_EQ2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B2_CTL (0x39C) -#define TAIKO_A_CDC_CONN_EQ2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B3_CTL (0x39D) -#define TAIKO_A_CDC_CONN_EQ2_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B4_CTL (0x39E) -#define TAIKO_A_CDC_CONN_EQ2_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC1_B1_CTL (0x39F) -#define TAIKO_A_CDC_CONN_SRC1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC1_B2_CTL (0x3A0) -#define TAIKO_A_CDC_CONN_SRC1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC2_B1_CTL (0x3A1) -#define TAIKO_A_CDC_CONN_SRC2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC2_B2_CTL (0x3A2) -#define TAIKO_A_CDC_CONN_SRC2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B1_CTL (0x3A3) -#define TAIKO_A_CDC_CONN_TX_SB_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B2_CTL (0x3A4) -#define TAIKO_A_CDC_CONN_TX_SB_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B3_CTL (0x3A5) -#define TAIKO_A_CDC_CONN_TX_SB_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B4_CTL (0x3A6) -#define TAIKO_A_CDC_CONN_TX_SB_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B5_CTL (0x3A7) -#define TAIKO_A_CDC_CONN_TX_SB_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B6_CTL (0x3A8) -#define TAIKO_A_CDC_CONN_TX_SB_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B7_CTL (0x3A9) -#define TAIKO_A_CDC_CONN_TX_SB_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B8_CTL (0x3AA) -#define TAIKO_A_CDC_CONN_TX_SB_B8_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B9_CTL (0x3AB) -#define TAIKO_A_CDC_CONN_TX_SB_B9_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B10_CTL (0x3AC) -#define TAIKO_A_CDC_CONN_TX_SB_B10_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B11_CTL (0x3AD) -#define TAIKO_A_CDC_CONN_TX_SB_B11_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX_SB_B1_CTL (0x3AE) -#define TAIKO_A_CDC_CONN_RX_SB_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX_SB_B2_CTL (0x3AF) -#define TAIKO_A_CDC_CONN_RX_SB_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_CLSH_CTL (0x3B0) -#define TAIKO_A_CDC_CONN_CLSH_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_MISC (0x3B1) -#define TAIKO_A_CDC_CONN_MISC__POR (0x01) -#define TAIKO_A_CDC_CONN_MAD (0x3B2) -#define TAIKO_A_CDC_CONN_MAD__POR (0x01) -#define TAIKO_A_CDC_MBHC_EN_CTL (0x3C0) -#define TAIKO_A_CDC_MBHC_EN_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_FIR_B1_CFG (0x3C1) -#define TAIKO_A_CDC_MBHC_FIR_B1_CFG__POR (0x00) -#define TAIKO_A_CDC_MBHC_FIR_B2_CFG (0x3C2) -#define TAIKO_A_CDC_MBHC_FIR_B2_CFG__POR (0x06) -#define TAIKO_A_CDC_MBHC_TIMER_B1_CTL (0x3C3) -#define TAIKO_A_CDC_MBHC_TIMER_B1_CTL__POR (0x03) -#define TAIKO_A_CDC_MBHC_TIMER_B2_CTL (0x3C4) -#define TAIKO_A_CDC_MBHC_TIMER_B2_CTL__POR (0x09) -#define TAIKO_A_CDC_MBHC_TIMER_B3_CTL (0x3C5) -#define TAIKO_A_CDC_MBHC_TIMER_B3_CTL__POR (0x1E) -#define TAIKO_A_CDC_MBHC_TIMER_B4_CTL (0x3C6) -#define TAIKO_A_CDC_MBHC_TIMER_B4_CTL__POR (0x45) -#define TAIKO_A_CDC_MBHC_TIMER_B5_CTL (0x3C7) -#define TAIKO_A_CDC_MBHC_TIMER_B5_CTL__POR (0x04) -#define TAIKO_A_CDC_MBHC_TIMER_B6_CTL (0x3C8) -#define TAIKO_A_CDC_MBHC_TIMER_B6_CTL__POR (0x78) -#define TAIKO_A_CDC_MBHC_B1_STATUS (0x3C9) -#define TAIKO_A_CDC_MBHC_B1_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B2_STATUS (0x3CA) -#define TAIKO_A_CDC_MBHC_B2_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B3_STATUS (0x3CB) -#define TAIKO_A_CDC_MBHC_B3_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B4_STATUS (0x3CC) -#define TAIKO_A_CDC_MBHC_B4_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B5_STATUS (0x3CD) -#define TAIKO_A_CDC_MBHC_B5_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B1_CTL (0x3CE) -#define TAIKO_A_CDC_MBHC_B1_CTL__POR (0xC0) -#define TAIKO_A_CDC_MBHC_B2_CTL (0x3CF) -#define TAIKO_A_CDC_MBHC_B2_CTL__POR (0x5D) -#define TAIKO_A_CDC_MBHC_VOLT_B1_CTL (0x3D0) -#define TAIKO_A_CDC_MBHC_VOLT_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B2_CTL (0x3D1) -#define TAIKO_A_CDC_MBHC_VOLT_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B3_CTL (0x3D2) -#define TAIKO_A_CDC_MBHC_VOLT_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B4_CTL (0x3D3) -#define TAIKO_A_CDC_MBHC_VOLT_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B5_CTL (0x3D4) -#define TAIKO_A_CDC_MBHC_VOLT_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B6_CTL (0x3D5) -#define TAIKO_A_CDC_MBHC_VOLT_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B7_CTL (0x3D6) -#define TAIKO_A_CDC_MBHC_VOLT_B7_CTL__POR (0xFF) -#define TAIKO_A_CDC_MBHC_VOLT_B8_CTL (0x3D7) -#define TAIKO_A_CDC_MBHC_VOLT_B8_CTL__POR (0x07) -#define TAIKO_A_CDC_MBHC_VOLT_B9_CTL (0x3D8) -#define TAIKO_A_CDC_MBHC_VOLT_B9_CTL__POR (0xFF) -#define TAIKO_A_CDC_MBHC_VOLT_B10_CTL (0x3D9) -#define TAIKO_A_CDC_MBHC_VOLT_B10_CTL__POR (0x7F) -#define TAIKO_A_CDC_MBHC_VOLT_B11_CTL (0x3DA) -#define TAIKO_A_CDC_MBHC_VOLT_B11_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B12_CTL (0x3DB) -#define TAIKO_A_CDC_MBHC_VOLT_B12_CTL__POR (0x80) -#define TAIKO_A_CDC_MBHC_CLK_CTL (0x3DC) -#define TAIKO_A_CDC_MBHC_CLK_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_INT_CTL (0x3DD) -#define TAIKO_A_CDC_MBHC_INT_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_DEBUG_CTL (0x3DE) -#define TAIKO_A_CDC_MBHC_DEBUG_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_SPARE (0x3DF) -#define TAIKO_A_CDC_MBHC_SPARE__POR (0x00) -#define TAIKO_A_CDC_MAD_MAIN_CTL_1 (0x3E0) -#define TAIKO_A_CDC_MAD_MAIN_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_MAIN_CTL_2 (0x3E1) -#define TAIKO_A_CDC_MAD_MAIN_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_1 (0x3E2) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_2 (0x3E3) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_3 (0x3E4) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_3__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_4 (0x3E5) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_4__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_5 (0x3E6) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_5__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_6 (0x3E7) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_6__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_7 (0x3E8) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_7__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_8 (0x3E9) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_8__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_PTR (0x3EA) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_PTR__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_VAL (0x3EB) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_VAL__POR (0x40) -#define TAIKO_A_CDC_MAD_ULTR_CTL_1 (0x3EC) -#define TAIKO_A_CDC_MAD_ULTR_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_2 (0x3ED) -#define TAIKO_A_CDC_MAD_ULTR_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_3 (0x3EE) -#define TAIKO_A_CDC_MAD_ULTR_CTL_3__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_4 (0x3EF) -#define TAIKO_A_CDC_MAD_ULTR_CTL_4__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_5 (0x3F0) -#define TAIKO_A_CDC_MAD_ULTR_CTL_5__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_6 (0x3F1) -#define TAIKO_A_CDC_MAD_ULTR_CTL_6__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_7 (0x3F2) -#define TAIKO_A_CDC_MAD_ULTR_CTL_7__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_1 (0x3F3) -#define TAIKO_A_CDC_MAD_BEACON_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_2 (0x3F4) -#define TAIKO_A_CDC_MAD_BEACON_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_3 (0x3F5) -#define TAIKO_A_CDC_MAD_BEACON_CTL_3__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_4 (0x3F6) -#define TAIKO_A_CDC_MAD_BEACON_CTL_4__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_5 (0x3F7) -#define TAIKO_A_CDC_MAD_BEACON_CTL_5__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_6 (0x3F8) -#define TAIKO_A_CDC_MAD_BEACON_CTL_6__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_7 (0x3F9) -#define TAIKO_A_CDC_MAD_BEACON_CTL_7__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_8 (0x3FA) -#define TAIKO_A_CDC_MAD_BEACON_CTL_8__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_PTR (0x3FB) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_PTR__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_VAL (0x3FC) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_VAL__POR (0x00) - -/* Taiko v2+ registers */ -#define TAIKO_A_CDC_TX_1_GAIN (0x153) -#define TAIKO_A_CDC_TX_1_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_2_GAIN (0x155) -#define TAIKO_A_CDC_TX_2_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_1_2_ADC_IB (0x156) -#define TAIKO_A_CDC_TX_1_2_ADC_IB__POR (0x44) -#define TAIKO_A_CDC_TX_3_GAIN (0x15D) -#define TAIKO_A_CDC_TX_3_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_4_GAIN (0x15F) -#define TAIKO_A_CDC_TX_4_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_3_4_ADC_IB (0x160) -#define TAIKO_A_CDC_TX_3_4_ADC_IB__POR (0x44) -#define TAIKO_A_CDC_TX_5_GAIN (0x167) -#define TAIKO_A_CDC_TX_5_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_6_GAIN (0x169) -#define TAIKO_A_CDC_TX_6_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_5_6_ADC_IB (0x16A) -#define TAIKO_A_CDC_TX_5_6_ADC_IB__POR (0x44) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL0 (0x270) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL0__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL1 (0x271) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL1__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL2 (0x272) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL2__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL3 (0x273) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL3__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL4 (0x274) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL4__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL5 (0x275) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL5__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL6 (0x276) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL6__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL7 (0x277) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL7__POR (0x00) -#define TAIKO_A_CDC_VBAT_GAIN_UPD_MON (0x2FA) -#define TAIKO_A_CDC_VBAT_GAIN_UPD_MON__POR (0x00) -#define TAIKO_A_CDC_VBAT_GAIN_MON_VAL (0x2FB) -#define TAIKO_A_CDC_VBAT_GAIN_MON_VAL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B1_CTL (0x361) -#define TAIKO_A_CDC_PA_RAMP_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B2_CTL (0x362) -#define TAIKO_A_CDC_PA_RAMP_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B3_CTL (0x363) -#define TAIKO_A_CDC_PA_RAMP_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B4_CTL (0x364) -#define TAIKO_A_CDC_PA_RAMP_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_B1_CTL (0x365) -#define TAIKO_A_CDC_SPKR_CLIPDET_B1_CTL__POR (0x00) - -/* SLIMBUS Slave Registers */ -#define TAIKO_SLIM_PGD_PORT_INT_EN0 (0x30) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_RX_0 (0x34) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_RX_1 (0x35) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_TX_0 (0x36) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_TX_1 (0x37) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_RX_0 (0x38) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_RX_1 (0x39) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_TX_0 (0x3A) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_TX_1 (0x3B) -#define TAIKO_SLIM_PGD_PORT_INT_RX_SOURCE0 (0x60) -#define TAIKO_SLIM_PGD_PORT_INT_TX_SOURCE0 (0x70) - -/* Macros for Packing Register Writes into a U32 */ -#define TAIKO_PACKED_REG_SIZE sizeof(u32) - -#define TAIKO_CODEC_PACK_ENTRY(reg, mask, val) ((val & 0xff)|\ - ((mask & 0xff) << 8)|((reg & 0xffff) << 16)) - -#define TAIKO_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ - do { \ - ((reg) = ((packed >> 16) & (0xffff))); \ - ((mask) = ((packed >> 8) & (0xff))); \ - ((val) = ((packed) & (0xff))); \ - } while (0); - -#endif diff --git a/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h b/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h deleted file mode 100644 index 7902cfbafad8..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h +++ /dev/null @@ -1,361 +0,0 @@ -#ifndef WCD9XXX_CODEC_DIGITAL_H - -#define WCD9XXX_CODEC_DIGITAL_H - -#define WCD9XXX_A_CHIP_CTL (0x00) -#define WCD9XXX_A_CHIP_CTL__POR (0x00000000) -#define WCD9XXX_A_CHIP_STATUS (0x01) -#define WCD9XXX_A_CHIP_STATUS__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_0 (0x04) -#define WCD9XXX_A_CHIP_ID_BYTE_0__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_1 (0x05) -#define WCD9XXX_A_CHIP_ID_BYTE_1__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_2 (0x06) -#define WCD9XXX_A_CHIP_ID_BYTE_2__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_3 (0x07) -#define WCD9XXX_A_CHIP_ID_BYTE_3__POR (0x00000001) -#define WCD9XXX_A_CHIP_VERSION (0x08) -#define WCD9XXX_A_CHIP_VERSION__POR (0x00000020) -#define WCD9XXX_A_SB_VERSION (0x09) -#define WCD9XXX_A_SB_VERSION__POR (0x00000010) -#define WCD9XXX_A_SLAVE_ID_1 (0x0C) -#define WCD9XXX_A_SLAVE_ID_1__POR (0x00000077) -#define WCD9XXX_A_SLAVE_ID_2 (0x0D) -#define WCD9XXX_A_SLAVE_ID_2__POR (0x00000066) -#define WCD9XXX_A_SLAVE_ID_3 (0x0E) -#define WCD9XXX_A_SLAVE_ID_3__POR (0x00000055) -#define WCD9XXX_A_CDC_CTL (0x80) -#define WCD9XXX_A_CDC_CTL__POR (0x00000000) -#define WCD9XXX_A_LEAKAGE_CTL (0x88) -#define WCD9XXX_A_LEAKAGE_CTL__POR (0x00000004) -#define WCD9XXX_A_INTR_MODE (0x90) -#define WCD9XXX_A_INTR_MASK0 (0x94) -#define WCD9XXX_A_INTR_STATUS0 (0x98) -#define WCD9XXX_A_INTR_CLEAR0 (0x9C) -#define WCD9XXX_A_INTR_LEVEL0 (0xA0) -#define WCD9XXX_A_INTR_LEVEL1 (0xA1) -#define WCD9XXX_A_INTR_LEVEL2 (0xA2) -#define WCD9XXX_A_RX_HPH_CNP_EN (0x1AB) -#define WCD9XXX_A_RX_HPH_CNP_EN__POR (0x80) -#define WCD9XXX_A_RX_HPH_CNP_EN (0x1AB) -#define WCD9XXX_A_RX_HPH_CNP_EN__POR (0x80) -#define WCD9XXX_A_BIAS_CENTRAL_BG_CTL (0x101) -#define WCD9XXX_A_BIAS_CENTRAL_BG_CTL__POR (0x50) -#define WCD9XXX_A_CLK_BUFF_EN1 (0x108) -#define WCD9XXX_A_CLK_BUFF_EN1__POR (0x04) -#define WCD9XXX_A_CLK_BUFF_EN2 (0x109) -#define WCD9XXX_A_CLK_BUFF_EN2__POR (0x02) -#define WCD9XXX_A_RX_COM_BIAS (0x1A2) -#define WCD9XXX_A_RX_COM_BIAS__POR (0x00) -#define WCD9XXX_A_RC_OSC_FREQ (0x1FA) -#define WCD9XXX_A_RC_OSC_FREQ__POR (0x46) -#define WCD9XXX_A_BIAS_OSC_BG_CTL (0x105) -#define WCD9XXX_A_BIAS_OSC_BG_CTL__POR (0x16) -#define WCD9XXX_A_RC_OSC_TEST (0x1FB) -#define WCD9XXX_A_RC_OSC_TEST__POR (0x0A) -#define WCD9XXX_A_CDC_CLK_MCLK_CTL (0x311) -#define WCD9XXX_A_CDC_CLK_MCLK_CTL__POR (0x00) - -#define WCD9XXX_A_CDC_MBHC_EN_CTL (0x3C0) -#define WCD9XXX_A_CDC_MBHC_EN_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_FIR_B1_CFG (0x3C1) -#define WCD9XXX_A_CDC_MBHC_FIR_B1_CFG__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_FIR_B2_CFG (0x3C2) -#define WCD9XXX_A_CDC_MBHC_FIR_B2_CFG__POR (0x06) -#define WCD9XXX_A_CDC_MBHC_TIMER_B1_CTL (0x3C3) -#define WCD9XXX_A_CDC_MBHC_TIMER_B1_CTL__POR (0x03) -#define WCD9XXX_A_CDC_MBHC_TIMER_B2_CTL (0x3C4) -#define WCD9XXX_A_CDC_MBHC_TIMER_B2_CTL__POR (0x09) -#define WCD9XXX_A_CDC_MBHC_TIMER_B3_CTL (0x3C5) -#define WCD9XXX_A_CDC_MBHC_TIMER_B3_CTL__POR (0x1E) -#define WCD9XXX_A_CDC_MBHC_TIMER_B4_CTL (0x3C6) -#define WCD9XXX_A_CDC_MBHC_TIMER_B4_CTL__POR (0x45) -#define WCD9XXX_A_CDC_MBHC_TIMER_B5_CTL (0x3C7) -#define WCD9XXX_A_CDC_MBHC_TIMER_B5_CTL__POR (0x04) -#define WCD9XXX_A_CDC_MBHC_TIMER_B6_CTL (0x3C8) -#define WCD9XXX_A_CDC_MBHC_TIMER_B6_CTL__POR (0x78) -#define WCD9XXX_A_CDC_MBHC_B1_STATUS (0x3C9) -#define WCD9XXX_A_CDC_MBHC_B1_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B2_STATUS (0x3CA) -#define WCD9XXX_A_CDC_MBHC_B2_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B3_STATUS (0x3CB) -#define WCD9XXX_A_CDC_MBHC_B3_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B4_STATUS (0x3CC) -#define WCD9XXX_A_CDC_MBHC_B4_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B5_STATUS (0x3CD) -#define WCD9XXX_A_CDC_MBHC_B5_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B1_CTL (0x3CE) -#define WCD9XXX_A_CDC_MBHC_B1_CTL__POR (0xC0) -#define WCD9XXX_A_CDC_MBHC_B2_CTL (0x3CF) -#define WCD9XXX_A_CDC_MBHC_B2_CTL__POR (0x5D) -#define WCD9XXX_A_CDC_MBHC_VOLT_B1_CTL (0x3D0) -#define WCD9XXX_A_CDC_MBHC_VOLT_B1_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B2_CTL (0x3D1) -#define WCD9XXX_A_CDC_MBHC_VOLT_B2_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL (0x3D2) -#define WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL (0x3D3) -#define WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL (0x3D4) -#define WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL (0x3D5) -#define WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B7_CTL (0x3D6) -#define WCD9XXX_A_CDC_MBHC_VOLT_B7_CTL__POR (0xFF) -#define WCD9XXX_A_CDC_MBHC_VOLT_B8_CTL (0x3D7) -#define WCD9XXX_A_CDC_MBHC_VOLT_B8_CTL__POR (0x07) -#define WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL (0x3D8) -#define WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL__POR (0xFF) -#define WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL (0x3D9) -#define WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL__POR (0x7F) -#define WCD9XXX_A_CDC_MBHC_VOLT_B11_CTL (0x3DA) -#define WCD9XXX_A_CDC_MBHC_VOLT_B11_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B12_CTL (0x3DB) -#define WCD9XXX_A_CDC_MBHC_VOLT_B12_CTL__POR (0x80) -#define WCD9XXX_A_CDC_MBHC_CLK_CTL (0x3DC) -#define WCD9XXX_A_CDC_MBHC_CLK_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_INT_CTL (0x3DD) -#define WCD9XXX_A_CDC_MBHC_INT_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_DEBUG_CTL (0x3DE) -#define WCD9XXX_A_CDC_MBHC_DEBUG_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_SPARE (0x3DF) -#define WCD9XXX_A_CDC_MBHC_SPARE__POR (0x00) -#define WCD9XXX_A_MBHC_SCALING_MUX_1 (0x14E) -#define WCD9XXX_A_MBHC_SCALING_MUX_1__POR (0x00) -#define WCD9XXX_A_RX_HPH_OCP_CTL (0x1AA) -#define WCD9XXX_A_RX_HPH_OCP_CTL__POR (0x68) -#define WCD9XXX_A_MICB_1_CTL (0x12B) -#define WCD9XXX_A_MICB_1_CTL__POR (0x16) -#define WCD9XXX_A_MICB_1_INT_RBIAS (0x12C) -#define WCD9XXX_A_MICB_1_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_1_MBHC (0x12D) -#define WCD9XXX_A_MICB_1_MBHC__POR (0x01) -#define WCD9XXX_A_MICB_CFILT_2_CTL (0x12E) -#define WCD9XXX_A_MICB_CFILT_2_CTL__POR (0x40) -#define WCD9XXX_A_MICB_CFILT_2_VAL (0x12F) -#define WCD9XXX_A_MICB_CFILT_2_VAL__POR (0x80) -#define WCD9XXX_A_MICB_CFILT_2_PRECHRG (0x130) -#define WCD9XXX_A_MICB_CFILT_2_PRECHRG__POR (0x38) -#define WCD9XXX_A_MICB_2_CTL (0x131) -#define WCD9XXX_A_MICB_2_CTL__POR (0x16) -#define WCD9XXX_A_MICB_2_INT_RBIAS (0x132) -#define WCD9XXX_A_MICB_2_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_2_MBHC (0x133) -#define WCD9XXX_A_MICB_2_MBHC__POR (0x02) -#define WCD9XXX_A_MICB_CFILT_3_CTL (0x134) -#define WCD9XXX_A_MICB_CFILT_3_CTL__POR (0x40) -#define WCD9XXX_A_MICB_CFILT_3_VAL (0x135) -#define WCD9XXX_A_MICB_CFILT_3_VAL__POR (0x80) -#define WCD9XXX_A_MICB_CFILT_3_PRECHRG (0x136) -#define WCD9XXX_A_MICB_CFILT_3_PRECHRG__POR (0x38) -#define WCD9XXX_A_MICB_3_CTL (0x137) -#define WCD9XXX_A_MICB_3_CTL__POR (0x16) -#define WCD9XXX_A_MICB_3_INT_RBIAS (0x138) -#define WCD9XXX_A_MICB_3_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_3_MBHC (0x139) -#define WCD9XXX_A_MICB_3_MBHC__POR (0x00) -#define WCD9XXX_A_MICB_4_CTL (0x13D) -#define WCD9XXX_A_MICB_4_CTL__POR (0x16) -#define WCD9XXX_A_MICB_4_INT_RBIAS (0x13E) -#define WCD9XXX_A_MICB_4_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_4_MBHC (0x13F) -#define WCD9XXX_A_MICB_4_MBHC__POR (0x01) -#define WCD9XXX_A_MICB_CFILT_1_VAL (0x129) -#define WCD9XXX_A_MICB_CFILT_1_VAL__POR (0x80) -#define WCD9XXX_A_RX_HPH_L_STATUS (0x1B3) -#define WCD9XXX_A_RX_HPH_L_STATUS__POR (0x00) -#define WCD9XXX_A_MBHC_HPH (0x1FE) -#define WCD9XXX_A_MBHC_HPH__POR (0x44) -#define WCD9XXX_A_RX_HPH_CNP_WG_TIME (0x1AD) -#define WCD9XXX_A_RX_HPH_CNP_WG_TIME__POR (0x2A) -#define WCD9XXX_A_RX_HPH_R_DAC_CTL (0x1B7) -#define WCD9XXX_A_RX_HPH_R_DAC_CTL__POR (0x00) -#define WCD9XXX_A_RX_HPH_L_DAC_CTL (0x1B1) -#define WCD9XXX_A_RX_HPH_L_DAC_CTL__POR (0x00) -#define WCD9XXX_A_TX_7_MBHC_EN (0x171) -#define WCD9XXX_A_TX_7_MBHC_EN__POR (0x0C) -#define WCD9XXX_A_PIN_CTL_OE0 (0x010) -#define WCD9XXX_A_PIN_CTL_OE0__POR (0x00) -#define WCD9XXX_A_PIN_CTL_OE1 (0x011) -#define WCD9XXX_A_PIN_CTL_OE1__POR (0x00) -#define WCD9XXX_A_MICB_CFILT_1_CTL (0x128) -#define WCD9XXX_A_LDO_H_MODE_1 (0x110) -#define WCD9XXX_A_LDO_H_MODE_1__POR (0x65) -#define WCD9XXX_A_MICB_CFILT_1_CTL__POR (0x40) -#define WCD9XXX_A_TX_7_MBHC_TEST_CTL (0x174) -#define WCD9XXX_A_TX_7_MBHC_TEST_CTL__POR (0x38) -#define WCD9XXX_A_MBHC_SCALING_MUX_2 (0x14F) -#define WCD9XXX_A_MBHC_SCALING_MUX_2__POR (0x80) -#define WCD9XXX_A_TX_COM_BIAS (0x14C) -#define WCD9XXX_A_TX_COM_BIAS__POR (0xF0) - -#define WCD9XXX_A_MBHC_INSERT_DETECT (0x14A) /* TAIKO and later */ -#define WCD9XXX_A_MBHC_INSERT_DETECT__POR (0x00) -#define WCD9XXX_A_MBHC_INSERT_DET_STATUS (0x14B) /* TAIKO and later */ -#define WCD9XXX_A_MBHC_INSERT_DET_STATUS__POR (0x00) -#define WCD9XXX_A_MAD_ANA_CTRL (0x150) -#define WCD9XXX_A_MAD_ANA_CTRL__POR (0xF1) - - -#define WCD9XXX_A_CDC_CLK_OTHR_CTL (0x30C) -#define WCD9XXX_A_CDC_CLK_OTHR_CTL__POR (0x00) - -/* Class H related common registers */ -#define WCD9XXX_A_BUCK_MODE_1 (0x181) -#define WCD9XXX_A_BUCK_MODE_1__POR (0x21) -#define WCD9XXX_A_BUCK_MODE_2 (0x182) -#define WCD9XXX_A_BUCK_MODE_2__POR (0xFF) -#define WCD9XXX_A_BUCK_MODE_3 (0x183) -#define WCD9XXX_A_BUCK_MODE_3__POR (0xCC) -#define WCD9XXX_A_BUCK_MODE_4 (0x184) -#define WCD9XXX_A_BUCK_MODE_4__POR (0x3A) -#define WCD9XXX_A_BUCK_MODE_5 (0x185) -#define WCD9XXX_A_BUCK_MODE_5__POR (0x00) -#define WCD9XXX_A_BUCK_CTRL_VCL_1 (0x186) -#define WCD9XXX_A_BUCK_CTRL_VCL_1__POR (0x48) -#define WCD9XXX_A_BUCK_CTRL_VCL_2 (0x187) -#define WCD9XXX_A_BUCK_CTRL_VCL_2__POR (0xA3) -#define WCD9XXX_A_BUCK_CTRL_VCL_3 (0x188) -#define WCD9XXX_A_BUCK_CTRL_VCL_3__POR (0x82) -#define WCD9XXX_A_BUCK_CTRL_CCL_1 (0x189) -#define WCD9XXX_A_BUCK_CTRL_CCL_1__POR (0xAB) -#define WCD9XXX_A_BUCK_CTRL_CCL_2 (0x18A) -#define WCD9XXX_A_BUCK_CTRL_CCL_2__POR (0xDC) -#define WCD9XXX_A_BUCK_CTRL_CCL_3 (0x18B) -#define WCD9XXX_A_BUCK_CTRL_CCL_3__POR (0x6A) -#define WCD9XXX_A_BUCK_CTRL_CCL_4 (0x18C) -#define WCD9XXX_A_BUCK_CTRL_CCL_4__POR (0x58) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_1 (0x18D) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_1__POR (0x50) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_2 (0x18E) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_2__POR (0x64) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_3 (0x18F) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_3__POR (0x77) -#define WCD9XXX_A_BUCK_TMUX_A_D (0x190) -#define WCD9XXX_A_BUCK_TMUX_A_D__POR (0x00) -#define WCD9XXX_A_NCP_EN (0x192) -#define WCD9XXX_A_NCP_EN__POR (0xFE) -#define WCD9XXX_A_NCP_STATIC (0x194) -#define WCD9XXX_A_NCP_STATIC__POR (0x28) -#define WCD9XXX_A_NCP_BUCKREF (0x191) -#define WCD9XXX_A_NCP_BUCKREF__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_B1_CTL (0x320) -#define WCD9XXX_A_CDC_CLSH_B1_CTL__POR (0xE4) -#define WCD9XXX_A_CDC_CLSH_B2_CTL (0x321) -#define WCD9XXX_A_CDC_CLSH_B2_CTL__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_B3_CTL (0x322) -#define WCD9XXX_A_CDC_CLSH_B3_CTL__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_BUCK_NCP_VARS (0x323) -#define WCD9XXX_A_CDC_CLSH_BUCK_NCP_VARS__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_IDLE_HPH_THSD (0x324) -#define WCD9XXX_A_CDC_CLSH_IDLE_HPH_THSD__POR (0x12) -#define WCD9XXX_A_CDC_CLSH_IDLE_EAR_THSD (0x325) -#define WCD9XXX_A_CDC_CLSH_IDLE_EAR_THSD__POR (0x0C) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_HPH_THSD (0x326) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_HPH_THSD__POR (0x18) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_EAR_THSD (0x327) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_EAR_THSD__POR (0x23) -#define WCD9XXX_A_CDC_CLSH_K_ADDR (0x328) -#define WCD9XXX_A_CDC_CLSH_K_ADDR__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_K_DATA (0x329) -#define WCD9XXX_A_CDC_CLSH_K_DATA__POR (0xA4) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_L (0x32A) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_L__POR (0xD7) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_U (0x32B) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_U__POR (0x05) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_L (0x32C) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_L__POR (0x60) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_U (0x32D) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_U__POR (0x09) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_EAR (0x32E) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_EAR__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_HPH (0x32F) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_HPH__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_EAR (0x330) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_EAR__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_HPH (0x331) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_HPH__POR (0x00) - -#define WCD9XXX_A_CDC_RX1_B6_CTL (0x2B5) -#define WCD9XXX_A_CDC_RX1_B6_CTL__POR (0x80) -#define WCD9XXX_A_CDC_RX2_B6_CTL (0x2BD) -#define WCD9XXX_A_CDC_RX2_B6_CTL__POR (0x80) -#define WCD9XXX_A_RX_HPH_L_GAIN (0x1AE) -#define WCD9XXX_A_RX_HPH_L_GAIN__POR (0x00) -#define WCD9XXX_A_RX_HPH_R_GAIN (0x1B4) -#define WCD9XXX_A_RX_HPH_R_GAIN__POR (0x00) -#define WCD9XXX_A_RX_HPH_CHOP_CTL (0x1A5) -#define WCD9XXX_A_RX_HPH_CHOP_CTL__POR (0xB4) -#define WCD9XXX_A_RX_HPH_BIAS_PA (0x1A6) -#define WCD9XXX_A_RX_HPH_BIAS_PA__POR (0x7A) -#define WCD9XXX_A_RX_HPH_L_TEST (0x1AF) -#define WCD9XXX_A_RX_HPH_L_TEST__POR (0x00) -#define WCD9XXX_A_RX_HPH_R_TEST (0x1B5) -#define WCD9XXX_A_RX_HPH_R_TEST__POR (0x00) -#define WCD9XXX_A_CDC_CLK_RX_B1_CTL (0x30F) -#define WCD9XXX_A_CDC_CLK_RX_B1_CTL__POR (0x00) -#define WCD9XXX_A_NCP_CLK (0x193) -#define WCD9XXX_A_NCP_CLK__POR (0x94) -#define WCD9XXX_A_RX_HPH_BIAS_WG_OCP (0x1A9) -#define WCD9XXX_A_RX_HPH_BIAS_WG_OCP__POR (0x2A) -#define WCD9XXX_A_RX_HPH_CNP_WG_CTL (0x1AC) -#define WCD9XXX_A_RX_HPH_CNP_WG_CTL__POR (0xDE) -#define WCD9XXX_A_RX_HPH_L_PA_CTL (0x1B0) -#define WCD9XXX_A_RX_HPH_L_PA_CTL__POR (0x42) -#define WCD9XXX_A_RX_HPH_R_PA_CTL (0x1B6) -#define WCD9XXX_A_RX_HPH_R_PA_CTL__POR (0x42) -#define WCD9XXX_A_CDC_CONN_RX2_B1_CTL (0x383) -#define WCD9XXX_A_CDC_CONN_RX2_B1_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B1_CTL (0x361) -#define WCD9XXX_A_CDC_PA_RAMP_B1_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B2_CTL (0x362) -#define WCD9XXX_A_CDC_PA_RAMP_B2_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B3_CTL (0x363) -#define WCD9XXX_A_CDC_PA_RAMP_B3_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B4_CTL (0x364) -#define WCD9XXX_A_CDC_PA_RAMP_B4_CTL__POR (0x00) - -#define WCD9330_A_LEAKAGE_CTL (0x03C) -#define WCD9330_A_LEAKAGE_CTL__POR (0x04) -#define WCD9330_A_CDC_CTL (0x034) -#define WCD9330_A_CDC_CTL__POR (0x00) - -/* Class-H registers for codecs from and above WCD9335 */ -#define WCD9XXX_A_CDC_RX0_RX_PATH_CFG0 (0xB42) -#define WCD9XXX_A_CDC_RX1_RX_PATH_CFG0 (0xB56) -#define WCD9XXX_A_CDC_RX2_RX_PATH_CFG0 (0xB6A) -#define WCD9XXX_A_CDC_CLSH_K1_MSB (0xC08) -#define WCD9XXX_A_CDC_CLSH_K1_LSB (0xC09) -#define WCD9XXX_A_ANA_RX_SUPPLIES (0x608) -#define WCD9XXX_A_ANA_HPH (0x609) -#define WCD9XXX_A_CDC_CLSH_CRC (0xC01) -#define WCD9XXX_FLYBACK_EN (0x6A4) -#define WCD9XXX_FLYBACK_VNEG_CTRL_1 (0x6A5) -#define WCD9XXX_FLYBACK_VNEGDAC_CTRL_2 (0x6AF) -#define WCD9XXX_RX_BIAS_FLYB_BUFF (0x6C7) -#define WCD9XXX_HPH_L_EN (0x6D3) -#define WCD9XXX_HPH_R_EN (0x6D6) -#define WCD9XXX_HPH_REFBUFF_UHQA_CTL (0x6DD) -#define WCD9XXX_CLASSH_CTRL_VCL_2 (0x69B) -#define WCD9XXX_CDC_CLSH_HPH_V_PA (0xC04) -#define WCD9XXX_CDC_RX0_RX_PATH_SEC0 (0xB49) -#define WCD9XXX_CDC_RX1_RX_PATH_CTL (0xB55) -#define WCD9XXX_CDC_RX2_RX_PATH_CTL (0xB69) -#define WCD9XXX_CDC_CLK_RST_CTRL_MCLK_CONTROL (0xD41) -#define WCD9XXX_CLASSH_CTRL_CCL_1 (0x69C) - -/* RX Gain control registers of codecs from and above WCD9335 */ -#define WCD9XXX_CDC_RX1_RX_VOL_CTL (0xB59) -#define WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL (0xB5C) -#define WCD9XXX_CDC_RX1_RX_PATH_SEC1 (0xB5E) -#define WCD9XXX_CDC_RX2_RX_VOL_CTL (0xB6D) -#define WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL (0xB70) -#define WCD9XXX_CDC_RX2_RX_PATH_SEC1 (0xB72) - -/* Class-H registers for codecs from and above WCD934X */ -#define WCD9XXX_HPH_CNP_WG_CTL (0x06cc) -#define WCD9XXX_FLYBACK_VNEG_CTRL_4 (0x06a8) -#define WCD9XXX_HPH_NEW_INT_PA_MISC2 (0x0738) -#define WCD9XXX_RX_BIAS_HPH_LOWPOWER (0x06bf) -#define WCD9XXX_HPH_PA_CTL1 (0x06d1) -#endif diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio.h b/techpack/audio/4.0/include/uapi/linux/msm_audio.h deleted file mode 100644 index 21ded047b808..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio.h +++ /dev/null @@ -1,466 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2012, 2014, 2017 The Linux Foundation. All rights reserved. - */ - -#ifndef _UAPI_LINUX_MSM_AUDIO_H -#define _UAPI_LINUX_MSM_AUDIO_H - -#include -#include - -/* PCM Audio */ - -#define AUDIO_IOCTL_MAGIC 'a' - -#define AUDIO_START _IOW(AUDIO_IOCTL_MAGIC, 0, unsigned int) -#define AUDIO_STOP _IOW(AUDIO_IOCTL_MAGIC, 1, unsigned int) -#define AUDIO_FLUSH _IOW(AUDIO_IOCTL_MAGIC, 2, unsigned int) -#define AUDIO_GET_CONFIG _IOR(AUDIO_IOCTL_MAGIC, 3, \ - struct msm_audio_config) -#define AUDIO_SET_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 4, \ - struct msm_audio_config) -#define AUDIO_GET_STATS _IOR(AUDIO_IOCTL_MAGIC, 5, \ - struct msm_audio_stats) -#define AUDIO_ENABLE_AUDPP _IOW(AUDIO_IOCTL_MAGIC, 6, unsigned int) -#define AUDIO_SET_ADRC _IOW(AUDIO_IOCTL_MAGIC, 7, unsigned int) -#define AUDIO_SET_EQ _IOW(AUDIO_IOCTL_MAGIC, 8, unsigned int) -#define AUDIO_SET_RX_IIR _IOW(AUDIO_IOCTL_MAGIC, 9, unsigned int) -#define AUDIO_SET_VOLUME _IOW(AUDIO_IOCTL_MAGIC, 10, unsigned int) -#define AUDIO_PAUSE _IOW(AUDIO_IOCTL_MAGIC, 11, unsigned int) -#define AUDIO_PLAY_DTMF _IOW(AUDIO_IOCTL_MAGIC, 12, unsigned int) -#define AUDIO_GET_EVENT _IOR(AUDIO_IOCTL_MAGIC, 13, \ - struct msm_audio_event) -#define AUDIO_ABORT_GET_EVENT _IOW(AUDIO_IOCTL_MAGIC, 14, unsigned int) -#define AUDIO_REGISTER_PMEM _IOW(AUDIO_IOCTL_MAGIC, 15, unsigned int) -#define AUDIO_DEREGISTER_PMEM _IOW(AUDIO_IOCTL_MAGIC, 16, unsigned int) -#define AUDIO_ASYNC_WRITE _IOW(AUDIO_IOCTL_MAGIC, 17, \ - struct msm_audio_aio_buf) -#define AUDIO_ASYNC_READ _IOW(AUDIO_IOCTL_MAGIC, 18, \ - struct msm_audio_aio_buf) -#define AUDIO_SET_INCALL _IOW(AUDIO_IOCTL_MAGIC, 19, struct msm_voicerec_mode) -#define AUDIO_GET_NUM_SND_DEVICE _IOR(AUDIO_IOCTL_MAGIC, 20, unsigned int) -#define AUDIO_GET_SND_DEVICES _IOWR(AUDIO_IOCTL_MAGIC, 21, \ - struct msm_snd_device_list) -#define AUDIO_ENABLE_SND_DEVICE _IOW(AUDIO_IOCTL_MAGIC, 22, unsigned int) -#define AUDIO_DISABLE_SND_DEVICE _IOW(AUDIO_IOCTL_MAGIC, 23, unsigned int) -#define AUDIO_ROUTE_STREAM _IOW(AUDIO_IOCTL_MAGIC, 24, \ - struct msm_audio_route_config) -#define AUDIO_GET_PCM_CONFIG _IOR(AUDIO_IOCTL_MAGIC, 30, unsigned int) -#define AUDIO_SET_PCM_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 31, unsigned int) -#define AUDIO_SWITCH_DEVICE _IOW(AUDIO_IOCTL_MAGIC, 32, unsigned int) -#define AUDIO_SET_MUTE _IOW(AUDIO_IOCTL_MAGIC, 33, unsigned int) -#define AUDIO_UPDATE_ACDB _IOW(AUDIO_IOCTL_MAGIC, 34, unsigned int) -#define AUDIO_START_VOICE _IOW(AUDIO_IOCTL_MAGIC, 35, unsigned int) -#define AUDIO_STOP_VOICE _IOW(AUDIO_IOCTL_MAGIC, 36, unsigned int) -#define AUDIO_REINIT_ACDB _IOW(AUDIO_IOCTL_MAGIC, 39, unsigned int) -#define AUDIO_OUTPORT_FLUSH _IOW(AUDIO_IOCTL_MAGIC, 40, unsigned short) -#define AUDIO_SET_ERR_THRESHOLD_VALUE _IOW(AUDIO_IOCTL_MAGIC, 41, \ - unsigned short) -#define AUDIO_GET_BITSTREAM_ERROR_INFO _IOR(AUDIO_IOCTL_MAGIC, 42, \ - struct msm_audio_bitstream_error_info) - -#define AUDIO_SET_SRS_TRUMEDIA_PARAM _IOW(AUDIO_IOCTL_MAGIC, 43, unsigned int) - -/* Qualcomm technologies inc extensions */ -#define AUDIO_SET_STREAM_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 80, \ - struct msm_audio_stream_config) -#define AUDIO_GET_STREAM_CONFIG _IOR(AUDIO_IOCTL_MAGIC, 81, \ - struct msm_audio_stream_config) -#define AUDIO_GET_SESSION_ID _IOR(AUDIO_IOCTL_MAGIC, 82, unsigned short) -#define AUDIO_GET_STREAM_INFO _IOR(AUDIO_IOCTL_MAGIC, 83, \ - struct msm_audio_bitstream_info) -#define AUDIO_SET_PAN _IOW(AUDIO_IOCTL_MAGIC, 84, unsigned int) -#define AUDIO_SET_QCONCERT_PLUS _IOW(AUDIO_IOCTL_MAGIC, 85, unsigned int) -#define AUDIO_SET_MBADRC _IOW(AUDIO_IOCTL_MAGIC, 86, unsigned int) -#define AUDIO_SET_VOLUME_PATH _IOW(AUDIO_IOCTL_MAGIC, 87, \ - struct msm_vol_info) -#define AUDIO_SET_MAX_VOL_ALL _IOW(AUDIO_IOCTL_MAGIC, 88, unsigned int) -#define AUDIO_ENABLE_AUDPRE _IOW(AUDIO_IOCTL_MAGIC, 89, unsigned int) -#define AUDIO_SET_AGC _IOW(AUDIO_IOCTL_MAGIC, 90, unsigned int) -#define AUDIO_SET_NS _IOW(AUDIO_IOCTL_MAGIC, 91, unsigned int) -#define AUDIO_SET_TX_IIR _IOW(AUDIO_IOCTL_MAGIC, 92, unsigned int) -#define AUDIO_GET_BUF_CFG _IOW(AUDIO_IOCTL_MAGIC, 93, \ - struct msm_audio_buf_cfg) -#define AUDIO_SET_BUF_CFG _IOW(AUDIO_IOCTL_MAGIC, 94, \ - struct msm_audio_buf_cfg) -#define AUDIO_SET_ACDB_BLK _IOW(AUDIO_IOCTL_MAGIC, 95, \ - struct msm_acdb_cmd_device) -#define AUDIO_GET_ACDB_BLK _IOW(AUDIO_IOCTL_MAGIC, 96, \ - struct msm_acdb_cmd_device) - -#define AUDIO_REGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 97, \ - struct msm_audio_ion_info) -#define AUDIO_DEREGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 98, \ - struct msm_audio_ion_info) -#define AUDIO_SET_EFFECTS_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 99, \ - struct msm_hwacc_effects_config) -#define AUDIO_EFFECTS_SET_BUF_LEN _IOW(AUDIO_IOCTL_MAGIC, 100, \ - struct msm_hwacc_buf_cfg) -#define AUDIO_EFFECTS_GET_BUF_AVAIL _IOW(AUDIO_IOCTL_MAGIC, 101, \ - struct msm_hwacc_buf_avail) -#define AUDIO_EFFECTS_WRITE _IOW(AUDIO_IOCTL_MAGIC, 102, void *) -#define AUDIO_EFFECTS_READ _IOWR(AUDIO_IOCTL_MAGIC, 103, void *) -#define AUDIO_EFFECTS_SET_PP_PARAMS _IOW(AUDIO_IOCTL_MAGIC, 104, void *) - -#define AUDIO_PM_AWAKE _IOW(AUDIO_IOCTL_MAGIC, 105, unsigned int) -#define AUDIO_PM_RELAX _IOW(AUDIO_IOCTL_MAGIC, 106, unsigned int) - -#define AUDIO_MAX_COMMON_IOCTL_NUM 107 - - -#define HANDSET_MIC 0x01 -#define HANDSET_SPKR 0x02 -#define HEADSET_MIC 0x03 -#define HEADSET_SPKR_MONO 0x04 -#define HEADSET_SPKR_STEREO 0x05 -#define SPKR_PHONE_MIC 0x06 -#define SPKR_PHONE_MONO 0x07 -#define SPKR_PHONE_STEREO 0x08 -#define BT_SCO_MIC 0x09 -#define BT_SCO_SPKR 0x0A -#define BT_A2DP_SPKR 0x0B -#define TTY_HEADSET_MIC 0x0C -#define TTY_HEADSET_SPKR 0x0D - -/* Default devices are not supported in a */ -/* device switching context. Only supported */ -/* for stream devices. */ -/* DO NOT USE */ -#define DEFAULT_TX 0x0E -#define DEFAULT_RX 0x0F - -#define BT_A2DP_TX 0x10 - -#define HEADSET_MONO_PLUS_SPKR_MONO_RX 0x11 -#define HEADSET_MONO_PLUS_SPKR_STEREO_RX 0x12 -#define HEADSET_STEREO_PLUS_SPKR_MONO_RX 0x13 -#define HEADSET_STEREO_PLUS_SPKR_STEREO_RX 0x14 - -#define I2S_RX 0x20 -#define I2S_TX 0x21 - -#define ADRC_ENABLE 0x0001 -#define EQUALIZER_ENABLE 0x0002 -#define IIR_ENABLE 0x0004 -#define QCONCERT_PLUS_ENABLE 0x0008 -#define MBADRC_ENABLE 0x0010 -#define SRS_ENABLE 0x0020 -#define SRS_DISABLE 0x0040 - -#define AGC_ENABLE 0x0001 -#define NS_ENABLE 0x0002 -#define TX_IIR_ENABLE 0x0004 -#define FLUENCE_ENABLE 0x0008 - -#define VOC_REC_UPLINK 0x00 -#define VOC_REC_DOWNLINK 0x01 -#define VOC_REC_BOTH 0x02 - -struct msm_audio_config { - uint32_t buffer_size; - uint32_t buffer_count; - uint32_t channel_count; - uint32_t sample_rate; - uint32_t type; - uint32_t meta_field; - uint32_t bits; - uint32_t unused[3]; -}; - -struct msm_audio_stream_config { - uint32_t buffer_size; - uint32_t buffer_count; -}; - -struct msm_audio_buf_cfg { - uint32_t meta_info_enable; - uint32_t frames_per_buf; -}; - -struct msm_audio_stats { - uint32_t byte_count; - uint32_t sample_count; - uint32_t unused[2]; -}; - -struct msm_audio_ion_info { - int fd; - void *vaddr; -}; - -struct msm_audio_pmem_info { - int fd; - void *vaddr; -}; - -struct msm_audio_aio_buf { - void *buf_addr; - uint32_t buf_len; - uint32_t data_len; - void *private_data; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -/* Audio routing */ - -#define SND_IOCTL_MAGIC 's' - -#define SND_MUTE_UNMUTED 0 -#define SND_MUTE_MUTED 1 - -struct msm_mute_info { - uint32_t mute; - uint32_t path; -}; - -struct msm_vol_info { - uint32_t vol; - uint32_t path; -}; - -struct msm_voicerec_mode { - uint32_t rec_mode; -}; - -struct msm_snd_device_config { - uint32_t device; - uint32_t ear_mute; - uint32_t mic_mute; -}; - -#define SND_SET_DEVICE _IOW(SND_IOCTL_MAGIC, 2, struct msm_device_config *) - -enum cad_device_path_type { - CAD_DEVICE_PATH_RX, /*For Decoding session*/ - CAD_DEVICE_PATH_TX, /* For Encoding session*/ - CAD_DEVICE_PATH_RX_TX, /* For Voice call */ - CAD_DEVICE_PATH_LB, /* For loopback (FM Analog)*/ - CAD_DEVICE_PATH_MAX -}; - -struct cad_devices_type { - uint32_t rx_device; - uint32_t tx_device; - enum cad_device_path_type pathtype; -}; - -struct msm_cad_device_config { - struct cad_devices_type device; - uint32_t ear_mute; - uint32_t mic_mute; -}; - -#define CAD_SET_DEVICE _IOW(SND_IOCTL_MAGIC, 2, struct msm_cad_device_config *) - -#define SND_METHOD_VOICE 0 -#define SND_METHOD_MIDI 4 - -struct msm_snd_volume_config { - uint32_t device; - uint32_t method; - uint32_t volume; -}; - -#define SND_SET_VOLUME _IOW(SND_IOCTL_MAGIC, 3, struct msm_snd_volume_config *) - -struct msm_cad_volume_config { - struct cad_devices_type device; - uint32_t method; - uint32_t volume; -}; - -#define CAD_SET_VOLUME _IOW(SND_IOCTL_MAGIC, 3, struct msm_cad_volume_config *) - -/* Returns the number of SND endpoints supported. */ - -#define SND_GET_NUM_ENDPOINTS _IOR(SND_IOCTL_MAGIC, 4, unsigned int *) - -struct msm_snd_endpoint { - int id; /* input and output */ - char name[64]; /* output only */ -}; - -/* Takes an index between 0 and one less than the number returned by - * SND_GET_NUM_ENDPOINTS, and returns the SND index and name of a - * SND endpoint. On input, the .id field contains the number of the - * endpoint, and on exit it contains the SND index, while .name contains - * the description of the endpoint. - */ - -#define SND_GET_ENDPOINT _IOWR(SND_IOCTL_MAGIC, 5, struct msm_snd_endpoint *) - - -#define SND_AVC_CTL _IOW(SND_IOCTL_MAGIC, 6, unsigned int *) -#define SND_AGC_CTL _IOW(SND_IOCTL_MAGIC, 7, unsigned int *) - -/*return the number of CAD endpoints supported. */ - -#define CAD_GET_NUM_ENDPOINTS _IOR(SND_IOCTL_MAGIC, 4, unsigned int *) - -struct msm_cad_endpoint { - int id; /* input and output */ - char name[64]; /* output only */ -}; - -/* Takes an index between 0 and one less than the number returned by - * SND_GET_NUM_ENDPOINTS, and returns the CAD index and name of a - * CAD endpoint. On input, the .id field contains the number of the - * endpoint, and on exit it contains the SND index, while .name contains - * the description of the endpoint. - */ - -#define CAD_GET_ENDPOINT _IOWR(SND_IOCTL_MAGIC, 5, struct msm_cad_endpoint *) - -struct msm_audio_pcm_config { - uint32_t pcm_feedback; /* 0 - disable > 0 - enable */ - uint32_t buffer_count; /* Number of buffers to allocate */ - uint32_t buffer_size; /* Size of buffer for capturing of - * PCM samples - */ -}; - -#define AUDIO_EVENT_SUSPEND 0 -#define AUDIO_EVENT_RESUME 1 -#define AUDIO_EVENT_WRITE_DONE 2 -#define AUDIO_EVENT_READ_DONE 3 -#define AUDIO_EVENT_STREAM_INFO 4 -#define AUDIO_EVENT_BITSTREAM_ERROR_INFO 5 - -#define AUDIO_CODEC_TYPE_MP3 0 -#define AUDIO_CODEC_TYPE_AAC 1 - -struct msm_audio_bitstream_info { - uint32_t codec_type; - uint32_t chan_info; - uint32_t sample_rate; - uint32_t bit_stream_info; - uint32_t bit_rate; - uint32_t unused[3]; -}; - -struct msm_audio_bitstream_error_info { - uint32_t dec_id; - uint32_t err_msg_indicator; - uint32_t err_type; -}; - -union msm_audio_event_payload { - struct msm_audio_aio_buf aio_buf; - struct msm_audio_bitstream_info stream_info; - struct msm_audio_bitstream_error_info error_info; - int reserved; -}; - -struct msm_audio_event { - int event_type; - int timeout_ms; - union msm_audio_event_payload event_payload; -}; - -#define MSM_SNDDEV_CAP_RX 0x1 -#define MSM_SNDDEV_CAP_TX 0x2 -#define MSM_SNDDEV_CAP_VOICE 0x4 - -struct msm_snd_device_info { - uint32_t dev_id; - uint32_t dev_cap; /* bitmask describe capability of device */ - char dev_name[64]; -}; - -struct msm_snd_device_list { - uint32_t num_dev; /* Indicate number of device info to be retrieved */ - struct msm_snd_device_info *list; -}; - -struct msm_dtmf_config { - uint16_t path; - uint16_t dtmf_hi; - uint16_t dtmf_low; - uint16_t duration; - uint16_t tx_gain; - uint16_t rx_gain; - uint16_t mixing; -}; - -#define AUDIO_ROUTE_STREAM_VOICE_RX 0 -#define AUDIO_ROUTE_STREAM_VOICE_TX 1 -#define AUDIO_ROUTE_STREAM_PLAYBACK 2 -#define AUDIO_ROUTE_STREAM_REC 3 - -struct msm_audio_route_config { - uint32_t stream_type; - uint32_t stream_id; - uint32_t dev_id; -}; - -#define AUDIO_MAX_EQ_BANDS 12 - -struct msm_audio_eq_band { - uint16_t band_idx; /* The band index, 0 .. 11 */ - uint32_t filter_type; /* Filter band type */ - uint32_t center_freq_hz; /* Filter band center frequency */ - uint32_t filter_gain; /* Filter band initial gain (dB) */ - /* Range is +12 dB to -12 dB with 1dB increments. */ - uint32_t q_factor; -} __attribute__ ((packed)); - -struct msm_audio_eq_stream_config { - uint32_t enable; /* Number of consequtive bands specified */ - uint32_t num_bands; - struct msm_audio_eq_band eq_bands[AUDIO_MAX_EQ_BANDS]; -} __attribute__ ((packed)); - -struct msm_acdb_cmd_device { - uint32_t command_id; - uint32_t device_id; - uint32_t network_id; - uint32_t sample_rate_id; /* Actual sample rate value */ - uint32_t interface_id; /* See interface id's above */ - uint32_t algorithm_block_id; /* See enumerations above */ - uint32_t total_bytes; /* Length in bytes used by buffer */ - uint32_t *phys_buf; /* Physical Address of data */ -}; - -struct msm_hwacc_data_config { - __u32 buf_size; - __u32 num_buf; - __u32 num_channels; - __u8 channel_map[8]; - __u32 sample_rate; - __u32 bits_per_sample; -}; - -struct msm_hwacc_buf_cfg { - __u32 input_len; - __u32 output_len; -}; - -struct msm_hwacc_buf_avail { - __u32 input_num_avail; - __u32 output_num_avail; -}; - -struct msm_hwacc_effects_config { - struct msm_hwacc_data_config input; - struct msm_hwacc_data_config output; - struct msm_hwacc_buf_cfg buf_cfg; - __u32 meta_mode_enabled; - __u32 overwrite_topology; - __s32 topology; -}; - -#define ADSP_STREAM_PP_EVENT 0 -#define ADSP_STREAM_ENCDEC_EVENT 1 -#define ADSP_STREAM_IEC_61937_FMT_UPDATE_EVENT 2 -#define ADSP_STREAM_EVENT_MAX 3 - -struct msm_adsp_event_data { - __u32 event_type; - __u32 payload_len; - __u8 payload[0]; -}; - -#endif diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_aac.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_aac.h deleted file mode 100644 index 7e1e1b72424a..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_aac.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AAC_H -#define _UAPI_MSM_AUDIO_AAC_H - -#include - -#define AUDIO_SET_AAC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config) -#define AUDIO_GET_AAC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config) - -#define AUDIO_SET_AAC_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_aac_enc_config) - -#define AUDIO_GET_AAC_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+4), struct msm_audio_aac_enc_config) - -#define AUDIO_SET_AAC_MIX_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+5), uint32_t) - -#define AUDIO_AAC_FORMAT_ADTS -1 -#define AUDIO_AAC_FORMAT_RAW 0x0000 -#define AUDIO_AAC_FORMAT_PSUEDO_RAW 0x0001 -#define AUDIO_AAC_FORMAT_LOAS 0x0002 -#define AUDIO_AAC_FORMAT_ADIF 0x0003 - -#define AUDIO_AAC_OBJECT_LC 0x0002 -#define AUDIO_AAC_OBJECT_LTP 0x0004 -#define AUDIO_AAC_OBJECT_ERLC 0x0011 -#define AUDIO_AAC_OBJECT_BSAC 0x0016 - -#define AUDIO_AAC_SEC_DATA_RES_ON 0x0001 -#define AUDIO_AAC_SEC_DATA_RES_OFF 0x0000 - -#define AUDIO_AAC_SCA_DATA_RES_ON 0x0001 -#define AUDIO_AAC_SCA_DATA_RES_OFF 0x0000 - -#define AUDIO_AAC_SPEC_DATA_RES_ON 0x0001 -#define AUDIO_AAC_SPEC_DATA_RES_OFF 0x0000 - -#define AUDIO_AAC_SBR_ON_FLAG_ON 0x0001 -#define AUDIO_AAC_SBR_ON_FLAG_OFF 0x0000 - -#define AUDIO_AAC_SBR_PS_ON_FLAG_ON 0x0001 -#define AUDIO_AAC_SBR_PS_ON_FLAG_OFF 0x0000 - -/* Primary channel on both left and right channels */ -#define AUDIO_AAC_DUAL_MONO_PL_PR 0 -/* Secondary channel on both left and right channels */ -#define AUDIO_AAC_DUAL_MONO_SL_SR 1 -/* Primary channel on right channel and 2nd on left channel */ -#define AUDIO_AAC_DUAL_MONO_SL_PR 2 -/* 2nd channel on right channel and primary on left channel */ -#define AUDIO_AAC_DUAL_MONO_PL_SR 3 - -struct msm_audio_aac_config { - signed short format; - unsigned short audio_object; - unsigned short ep_config; /* 0 ~ 3 useful only obj = ERLC */ - unsigned short aac_section_data_resilience_flag; - unsigned short aac_scalefactor_data_resilience_flag; - unsigned short aac_spectral_data_resilience_flag; - unsigned short sbr_on_flag; - unsigned short sbr_ps_on_flag; - unsigned short dual_mono_mode; - unsigned short channel_configuration; - unsigned short sample_rate; -}; - -struct msm_audio_aac_enc_config { - uint32_t channels; - uint32_t sample_rate; - uint32_t bit_rate; - uint32_t stream_format; -}; - -#endif /* _UAPI_MSM_AUDIO_AAC_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_ac3.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_ac3.h deleted file mode 100644 index 1df6e6949ccf..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_ac3.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AC3_H -#define _UAPI_MSM_AUDIO_AC3_H - -#include - -#define AUDIO_SET_AC3_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_GET_AC3_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) - -#define AUDAC3_DEF_WORDSIZE 0 -#define AUDAC3_DEF_USER_DOWNMIX_FLAG 0x0 -#define AUDAC3_DEF_USER_KARAOKE_FLAG 0x0 -#define AUDAC3_DEF_ERROR_CONCEALMENT 0 -#define AUDAC3_DEF_MAX_REPEAT_COUNT 0 - -struct msm_audio_ac3_config { - unsigned short numChans; - unsigned short wordSize; - unsigned short kCapableMode; - unsigned short compMode; - unsigned short outLfeOn; - unsigned short outputMode; - unsigned short stereoMode; - unsigned short dualMonoMode; - unsigned short fsCod; - unsigned short pcmScaleFac; - unsigned short dynRngScaleHi; - unsigned short dynRngScaleLow; - unsigned short user_downmix_flag; - unsigned short user_karaoke_flag; - unsigned short dm_address_high; - unsigned short dm_address_low; - unsigned short ko_address_high; - unsigned short ko_address_low; - unsigned short error_concealment; - unsigned short max_rep_count; - unsigned short channel_routing_mode[6]; -}; - -#endif /* _UAPI_MSM_AUDIO_AC3_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_alac.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_alac.h deleted file mode 100644 index 5476e96d06fc..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_alac.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_ALAC_H -#define _UAPI_MSM_AUDIO_ALAC_H - -#define AUDIO_GET_ALAC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_alac_config) -#define AUDIO_SET_ALAC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_alac_config) - -struct msm_audio_alac_config { - uint32_t frameLength; - uint8_t compatVersion; - uint8_t bitDepth; - uint8_t pb; /* currently unused */ - uint8_t mb; /* currently unused */ - uint8_t kb; /* currently unused */ - uint8_t channelCount; - uint16_t maxRun; /* currently unused */ - uint32_t maxSize; - uint32_t averageBitRate; - uint32_t sampleRate; - uint32_t channelLayout; -}; - -#endif /* _UAPI_MSM_AUDIO_ALAC_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_amrnb.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_amrnb.h deleted file mode 100644 index 619f928f7175..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_amrnb.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AMRNB_H -#define _UAPI_MSM_AUDIO_AMRNB_H - -#include - -#define AUDIO_GET_AMRNB_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_SET_AMRNB_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) -#define AUDIO_GET_AMRNB_ENC_CONFIG_V2 _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+2), \ - struct msm_audio_amrnb_enc_config_v2) -#define AUDIO_SET_AMRNB_ENC_CONFIG_V2 _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), \ - struct msm_audio_amrnb_enc_config_v2) - -struct msm_audio_amrnb_enc_config { - unsigned short voicememoencweight1; - unsigned short voicememoencweight2; - unsigned short voicememoencweight3; - unsigned short voicememoencweight4; - unsigned short dtx_mode_enable; /* 0xFFFF - enable, 0- disable */ - unsigned short test_mode_enable; /* 0xFFFF - enable, 0- disable */ - unsigned short enc_mode; /* 0-MR475,1-MR515,2-MR59,3-MR67,4-MR74 - * 5-MR795, 6- MR102, 7- MR122(default) - */ -}; - -struct msm_audio_amrnb_enc_config_v2 { - uint32_t band_mode; - uint32_t dtx_enable; - uint32_t frame_format; -}; -#endif /* _UAPI_MSM_AUDIO_AMRNB_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_amrwb.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_amrwb.h deleted file mode 100644 index 51240389988f..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_amrwb.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AMRWB_H -#define _UAPI_MSM_AUDIO_AMRWB_H - -#include - -#define AUDIO_GET_AMRWB_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), \ - struct msm_audio_amrwb_enc_config) -#define AUDIO_SET_AMRWB_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), \ - struct msm_audio_amrwb_enc_config) - -struct msm_audio_amrwb_enc_config { - uint32_t band_mode; - uint32_t dtx_enable; - uint32_t frame_format; -}; -#endif /* _UAPI_MSM_AUDIO_AMRWB_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_amrwbplus.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_amrwbplus.h deleted file mode 100644 index ba2d06e99aa1..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_amrwbplus.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AMR_WB_PLUS_H -#define _UAPI_MSM_AUDIO_AMR_WB_PLUS_H - -#define AUDIO_GET_AMRWBPLUS_CONFIG_V2 _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+2), struct msm_audio_amrwbplus_config_v2) -#define AUDIO_SET_AMRWBPLUS_CONFIG_V2 _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_amrwbplus_config_v2) - -struct msm_audio_amrwbplus_config_v2 { - unsigned int size_bytes; - unsigned int version; - unsigned int num_channels; - unsigned int amr_band_mode; - unsigned int amr_dtx_mode; - unsigned int amr_frame_fmt; - unsigned int amr_lsf_idx; -}; -#endif /* _UAPI_MSM_AUDIO_AMR_WB_PLUS_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_ape.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_ape.h deleted file mode 100644 index 587d3bc1832d..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_ape.h +++ /dev/null @@ -1,26 +0,0 @@ -/* The following structure has been taken - * from Monkey's Audio SDK with permission - */ - -#ifndef _UAPI_MSM_AUDIO_APE_H -#define _UAPI_MSM_AUDIO_APE_H - -#define AUDIO_GET_APE_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_ape_config) -#define AUDIO_SET_APE_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_ape_config) - -struct msm_audio_ape_config { - uint16_t compatibleVersion; - uint16_t compressionLevel; - uint32_t formatFlags; - uint32_t blocksPerFrame; - uint32_t finalFrameBlocks; - uint32_t totalFrames; - uint16_t bitsPerSample; - uint16_t numChannels; - uint32_t sampleRate; - uint32_t seekTablePresent; -}; - -#endif /* _UAPI_MSM_AUDIO_APE_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_calibration.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_calibration.h deleted file mode 100644 index 35b596062247..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_calibration.h +++ /dev/null @@ -1,808 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_CALIBRATION_H -#define _UAPI_MSM_AUDIO_CALIBRATION_H - -#include -#include - -#define CAL_IOCTL_MAGIC 'a' - -#define AUDIO_ALLOCATE_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 200, void *) -#define AUDIO_DEALLOCATE_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 201, void *) -#define AUDIO_PREPARE_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 202, void *) -#define AUDIO_SET_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 203, void *) -#define AUDIO_GET_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 204, void *) -#define AUDIO_POST_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 205, void *) - -/* For Real-Time Audio Calibration */ -#define AUDIO_GET_RTAC_ADM_INFO _IOR(CAL_IOCTL_MAGIC, \ - 207, void *) -#define AUDIO_GET_RTAC_VOICE_INFO _IOR(CAL_IOCTL_MAGIC, \ - 208, void *) -#define AUDIO_GET_RTAC_ADM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 209, void *) -#define AUDIO_SET_RTAC_ADM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 210, void *) -#define AUDIO_GET_RTAC_ASM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 211, void *) -#define AUDIO_SET_RTAC_ASM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 212, void *) -#define AUDIO_GET_RTAC_CVS_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 213, void *) -#define AUDIO_SET_RTAC_CVS_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 214, void *) -#define AUDIO_GET_RTAC_CVP_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 215, void *) -#define AUDIO_SET_RTAC_CVP_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 216, void *) -#define AUDIO_GET_RTAC_AFE_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 217, void *) -#define AUDIO_SET_RTAC_AFE_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 218, void *) -enum { - CVP_VOC_RX_TOPOLOGY_CAL_TYPE = 0, - CVP_VOC_TX_TOPOLOGY_CAL_TYPE, - CVP_VOCPROC_STATIC_CAL_TYPE, - CVP_VOCPROC_DYNAMIC_CAL_TYPE, - CVS_VOCSTRM_STATIC_CAL_TYPE, - CVP_VOCDEV_CFG_CAL_TYPE, - CVP_VOCPROC_STATIC_COL_CAL_TYPE, - CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE, - CVS_VOCSTRM_STATIC_COL_CAL_TYPE, - - ADM_TOPOLOGY_CAL_TYPE, - ADM_CUST_TOPOLOGY_CAL_TYPE, - ADM_AUDPROC_CAL_TYPE, - ADM_AUDVOL_CAL_TYPE, - - ASM_TOPOLOGY_CAL_TYPE, - ASM_CUST_TOPOLOGY_CAL_TYPE, - ASM_AUDSTRM_CAL_TYPE, - - AFE_COMMON_RX_CAL_TYPE, - AFE_COMMON_TX_CAL_TYPE, - AFE_ANC_CAL_TYPE, - AFE_AANC_CAL_TYPE, - AFE_FB_SPKR_PROT_CAL_TYPE, - AFE_HW_DELAY_CAL_TYPE, - AFE_SIDETONE_CAL_TYPE, - AFE_TOPOLOGY_CAL_TYPE, - AFE_CUST_TOPOLOGY_CAL_TYPE, - - LSM_CUST_TOPOLOGY_CAL_TYPE, - LSM_TOPOLOGY_CAL_TYPE, - LSM_CAL_TYPE, - - ADM_RTAC_INFO_CAL_TYPE, - VOICE_RTAC_INFO_CAL_TYPE, - ADM_RTAC_APR_CAL_TYPE, - ASM_RTAC_APR_CAL_TYPE, - VOICE_RTAC_APR_CAL_TYPE, - - MAD_CAL_TYPE, - ULP_AFE_CAL_TYPE, - ULP_LSM_CAL_TYPE, - - DTS_EAGLE_CAL_TYPE, - AUDIO_CORE_METAINFO_CAL_TYPE, - SRS_TRUMEDIA_CAL_TYPE, - - CORE_CUSTOM_TOPOLOGIES_CAL_TYPE, - ADM_RTAC_AUDVOL_CAL_TYPE, - - ULP_LSM_TOPOLOGY_ID_CAL_TYPE, - AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE, - AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE, - AFE_SIDETONE_IIR_CAL_TYPE, - AFE_LSM_TOPOLOGY_CAL_TYPE, - AFE_LSM_TX_CAL_TYPE, - ADM_LSM_TOPOLOGY_CAL_TYPE, - ADM_LSM_AUDPROC_CAL_TYPE, - ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, - MAX_CAL_TYPES, -}; - -#define AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE -#define AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE - -#define AFE_SIDETONE_IIR_CAL_TYPE AFE_SIDETONE_IIR_CAL_TYPE - -#define AFE_LSM_TOPOLOGY_CAL_TYPE AFE_LSM_TOPOLOGY_CAL_TYPE -#define AFE_LSM_TX_CAL_TYPE AFE_LSM_TX_CAL_TYPE -#define ADM_LSM_TOPOLOGY_CAL_TYPE ADM_LSM_TOPOLOGY_CAL_TYPE -#define ADM_LSM_AUDPROC_CAL_TYPE ADM_LSM_AUDPROC_CAL_TYPE -#define ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE -#define LSM_CAL_TYPES - -#define TOPOLOGY_SPECIFIC_CHANNEL_INFO -#define MSM_SPKR_PROT_SPV3 - -enum { - VERSION_0_0, -}; - -enum { - PER_VOCODER_CAL_BIT_MASK = 0x10000, -}; - -#define MAX_IOCTL_CMD_SIZE 512 - -/* common structures */ - -struct audio_cal_header { - int32_t data_size; - int32_t version; - int32_t cal_type; - int32_t cal_type_size; -}; - -struct audio_cal_type_header { - int32_t version; - int32_t buffer_number; -}; - -struct audio_cal_data { - /* Size of cal data at mem_handle allocation or at vaddr */ - int32_t cal_size; - /* If mem_handle if shared memory is used*/ - int32_t mem_handle; - /* size of virtual memory if shared memory not used */ -}; - - -/* AUDIO_ALLOCATE_CALIBRATION */ -struct audio_cal_type_alloc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_alloc { - struct audio_cal_header hdr; - struct audio_cal_type_alloc cal_type; -}; - - -/* AUDIO_DEALLOCATE_CALIBRATION */ -struct audio_cal_type_dealloc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_dealloc { - struct audio_cal_header hdr; - struct audio_cal_type_dealloc cal_type; -}; - - -/* AUDIO_PREPARE_CALIBRATION */ -struct audio_cal_type_prepare { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_prepare { - struct audio_cal_header hdr; - struct audio_cal_type_prepare cal_type; -}; - - -/* AUDIO_POST_CALIBRATION */ -struct audio_cal_type_post { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_post { - struct audio_cal_header hdr; - struct audio_cal_type_post cal_type; -}; - -/*AUDIO_CORE_META_INFO */ - -struct audio_cal_info_metainfo { - uint32_t nKey; -}; - -/* Cal info types */ -enum { - RX_DEVICE, - TX_DEVICE, - MAX_PATH_TYPE -}; - -struct audio_cal_info_adm_top { - int32_t topology; - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; - int32_t sample_rate; -}; - -struct audio_cal_info_audproc { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; - int32_t sample_rate; -}; - -struct audio_cal_info_audvol { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; - int32_t vol_index; -}; - -struct audio_cal_info_afe { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t sample_rate; -}; - -struct audio_cal_info_afe_top { - int32_t topology; - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t sample_rate; -}; - -struct audio_cal_info_asm_top { - int32_t topology; - int32_t app_type; -}; - -struct audio_cal_info_audstrm { - int32_t app_type; -}; - -struct audio_cal_info_aanc { - int32_t acdb_id; -}; - -#define MAX_HW_DELAY_ENTRIES 25 - -struct audio_cal_hw_delay_entry { - uint32_t sample_rate; - uint32_t delay_usec; -}; - -struct audio_cal_hw_delay_data { - uint32_t num_entries; - struct audio_cal_hw_delay_entry entry[MAX_HW_DELAY_ENTRIES]; -}; - -struct audio_cal_info_hw_delay { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t property_type; - struct audio_cal_hw_delay_data data; -}; - -enum msm_spkr_prot_states { - MSM_SPKR_PROT_CALIBRATED, - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS, - MSM_SPKR_PROT_DISABLED, - MSM_SPKR_PROT_NOT_CALIBRATED, - MSM_SPKR_PROT_PRE_CALIBRATED, - MSM_SPKR_PROT_IN_FTM_MODE, - MSM_SPKR_PROT_IN_V_VALI_MODE -}; -#define MSM_SPKR_PROT_IN_FTM_MODE MSM_SPKR_PROT_IN_FTM_MODE -#define MSM_SPKR_PROT_IN_V_VALI_MODE MSM_SPKR_PROT_IN_V_VALI_MODE - -enum msm_spkr_count { - SP_V2_SPKR_1, - SP_V2_SPKR_2, - SP_V2_NUM_MAX_SPKRS -}; - -struct audio_cal_info_spk_prot_cfg { - int32_t r0[SP_V2_NUM_MAX_SPKRS]; - int32_t t0[SP_V2_NUM_MAX_SPKRS]; - uint32_t quick_calib_flag; - uint32_t mode; - /* - * 0 - Start spk prot - * 1 - Start calib - * 2 - Disable spk prot - */ -#ifdef MSM_SPKR_PROT_SPV3 - uint32_t sp_version; - int32_t limiter_th[SP_V2_NUM_MAX_SPKRS]; -#endif -}; - -struct audio_cal_info_sp_th_vi_ftm_cfg { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - /* - * 0 - normal running mode - * 1 - Calibration - * 2 - FTM mode - */ - uint32_t wait_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t ftm_time[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_sp_th_vi_v_vali_cfg { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - /* - * 0 - normal running mode - * 1 - Calibration - * 2 - FTM mode - * 3 - V-Validation mode - */ - uint32_t wait_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t vali_time[SP_V2_NUM_MAX_SPKRS]; - -}; - -struct audio_cal_info_sp_ex_vi_ftm_cfg { - uint32_t wait_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t ftm_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t mode; - /* - * 0 - normal running mode - * 2 - FTM mode - */ -}; - -struct audio_cal_info_sp_ex_vi_param { - int32_t freq_q20[SP_V2_NUM_MAX_SPKRS]; - int32_t resis_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t qmct_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t status[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_sp_th_vi_param { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - int32_t r_dc_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t temp_q22[SP_V2_NUM_MAX_SPKRS]; - int32_t status[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_sp_th_vi_v_vali_param { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - uint32_t vrms_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t status[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_msm_spk_prot_status { - int32_t r0[SP_V2_NUM_MAX_SPKRS]; - int32_t status; -}; - -struct audio_cal_info_sidetone { - uint16_t enable; - uint16_t gain; - int32_t tx_acdb_id; - int32_t rx_acdb_id; - int32_t mid; - int32_t pid; -}; - -#define MAX_SIDETONE_IIR_DATA_SIZE 224 -#define MAX_NO_IIR_FILTER_STAGE 10 - -struct audio_cal_info_sidetone_iir { - uint16_t iir_enable; - uint16_t num_biquad_stages; - uint16_t pregain; - int32_t tx_acdb_id; - int32_t rx_acdb_id; - int32_t mid; - int32_t pid; - uint8_t iir_config[MAX_SIDETONE_IIR_DATA_SIZE]; -}; -struct audio_cal_info_lsm_top { - int32_t topology; - int32_t acdb_id; - int32_t app_type; -}; - - -struct audio_cal_info_lsm { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; -}; - -#define VSS_NUM_CHANNELS_MAX 32 - -struct audio_cal_info_voc_top { - int32_t topology; - int32_t acdb_id; -#ifdef TOPOLOGY_SPECIFIC_CHANNEL_INFO - uint32_t num_channels; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -#endif -}; - -struct audio_cal_info_vocproc { - int32_t tx_acdb_id; - int32_t rx_acdb_id; - int32_t tx_sample_rate; - int32_t rx_sample_rate; -}; - -enum { - DEFAULT_FEATURE_SET, - VOL_BOOST_FEATURE_SET, -}; - -struct audio_cal_info_vocvol { - int32_t tx_acdb_id; - int32_t rx_acdb_id; - /* DEFAULT_ or VOL_BOOST_FEATURE_SET */ - int32_t feature_set; -}; - -struct audio_cal_info_vocdev_cfg { - int32_t tx_acdb_id; - int32_t rx_acdb_id; -}; - -#define MAX_VOICE_COLUMNS 20 - -union audio_cal_col_na { - uint8_t val8; - uint16_t val16; - uint32_t val32; - uint64_t val64; -} __packed; - -struct audio_cal_col { - uint32_t id; - uint32_t type; - union audio_cal_col_na na_value; -} __packed; - -struct audio_cal_col_data { - uint32_t num_columns; - struct audio_cal_col column[MAX_VOICE_COLUMNS]; -} __packed; - -struct audio_cal_info_voc_col { - int32_t table_id; - int32_t tx_acdb_id; - int32_t rx_acdb_id; - struct audio_cal_col_data data; -}; - -/* AUDIO_SET_CALIBRATION & */ -struct audio_cal_type_basic { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_basic { - struct audio_cal_header hdr; - struct audio_cal_type_basic cal_type; -}; - -struct audio_cal_type_adm_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_adm_top cal_info; -}; - -struct audio_cal_adm_top { - struct audio_cal_header hdr; - struct audio_cal_type_adm_top cal_type; -}; - -struct audio_cal_type_metainfo { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_metainfo cal_info; -}; - -struct audio_core_metainfo { - struct audio_cal_header hdr; - struct audio_cal_type_metainfo cal_type; -}; - -struct audio_cal_type_audproc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_audproc cal_info; -}; - -struct audio_cal_audproc { - struct audio_cal_header hdr; - struct audio_cal_type_audproc cal_type; -}; - -struct audio_cal_type_audvol { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_audvol cal_info; -}; - -struct audio_cal_audvol { - struct audio_cal_header hdr; - struct audio_cal_type_audvol cal_type; -}; - -struct audio_cal_type_asm_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_asm_top cal_info; -}; - -struct audio_cal_asm_top { - struct audio_cal_header hdr; - struct audio_cal_type_asm_top cal_type; -}; - -struct audio_cal_type_audstrm { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_audstrm cal_info; -}; - -struct audio_cal_audstrm { - struct audio_cal_header hdr; - struct audio_cal_type_audstrm cal_type; -}; - -struct audio_cal_type_afe { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_afe cal_info; -}; - -struct audio_cal_afe { - struct audio_cal_header hdr; - struct audio_cal_type_afe cal_type; -}; - -struct audio_cal_type_afe_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_afe_top cal_info; -}; - -struct audio_cal_afe_top { - struct audio_cal_header hdr; - struct audio_cal_type_afe_top cal_type; -}; - -struct audio_cal_type_aanc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_aanc cal_info; -}; - -struct audio_cal_aanc { - struct audio_cal_header hdr; - struct audio_cal_type_aanc cal_type; -}; - -struct audio_cal_type_fb_spk_prot_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_spk_prot_cfg cal_info; -}; - -struct audio_cal_fb_spk_prot_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_fb_spk_prot_cfg cal_type; -}; - -struct audio_cal_type_sp_th_vi_ftm_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_ftm_cfg cal_info; -}; - -struct audio_cal_sp_th_vi_ftm_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_ftm_cfg cal_type; -}; - -struct audio_cal_type_sp_th_vi_v_vali_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_v_vali_cfg cal_info; -}; - -struct audio_cal_sp_th_vi_v_vali_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_v_vali_cfg cal_type; -}; - -struct audio_cal_type_sp_ex_vi_ftm_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_ex_vi_ftm_cfg cal_info; -}; - -struct audio_cal_sp_ex_vi_ftm_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_sp_ex_vi_ftm_cfg cal_type; -}; -struct audio_cal_type_hw_delay { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_hw_delay cal_info; -}; - -struct audio_cal_hw_delay { - struct audio_cal_header hdr; - struct audio_cal_type_hw_delay cal_type; -}; - -struct audio_cal_type_sidetone { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sidetone cal_info; -}; - -struct audio_cal_sidetone { - struct audio_cal_header hdr; - struct audio_cal_type_sidetone cal_type; -}; - -struct audio_cal_type_sidetone_iir { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sidetone_iir cal_info; -}; - -struct audio_cal_sidetone_iir { - struct audio_cal_header hdr; - struct audio_cal_type_sidetone_iir cal_type; -}; - -struct audio_cal_type_lsm_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_lsm_top cal_info; -}; - -struct audio_cal_lsm_top { - struct audio_cal_header hdr; - struct audio_cal_type_lsm_top cal_type; -}; - -struct audio_cal_type_lsm { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_lsm cal_info; -}; - -struct audio_cal_lsm { - struct audio_cal_header hdr; - struct audio_cal_type_lsm cal_type; -}; - -struct audio_cal_type_voc_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_voc_top cal_info; -}; - -struct audio_cal_voc_top { - struct audio_cal_header hdr; - struct audio_cal_type_voc_top cal_type; -}; - -struct audio_cal_type_vocproc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_vocproc cal_info; -}; - -struct audio_cal_vocproc { - struct audio_cal_header hdr; - struct audio_cal_type_vocproc cal_type; -}; - -struct audio_cal_type_vocvol { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_vocvol cal_info; -}; - -struct audio_cal_vocvol { - struct audio_cal_header hdr; - struct audio_cal_type_vocvol cal_type; -}; - -struct audio_cal_type_vocdev_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_vocdev_cfg cal_info; -}; - -struct audio_cal_vocdev_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_vocdev_cfg cal_type; -}; - -struct audio_cal_type_voc_col { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_voc_col cal_info; -}; - -struct audio_cal_voc_col { - struct audio_cal_header hdr; - struct audio_cal_type_voc_col cal_type; -}; - -/* AUDIO_GET_CALIBRATION */ -struct audio_cal_type_fb_spk_prot_status { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_msm_spk_prot_status cal_info; -}; - -struct audio_cal_fb_spk_prot_status { - struct audio_cal_header hdr; - struct audio_cal_type_fb_spk_prot_status cal_type; -}; - -struct audio_cal_type_sp_th_vi_param { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_param cal_info; -}; - -struct audio_cal_sp_th_vi_param { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_param cal_type; -}; - -struct audio_cal_type_sp_th_vi_v_vali_param { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_v_vali_param cal_info; -}; - -struct audio_cal_sp_th_vi_v_vali_param { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_v_vali_param cal_type; -}; -struct audio_cal_type_sp_ex_vi_param { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_ex_vi_param cal_info; -}; - -struct audio_cal_sp_ex_vi_param { - struct audio_cal_header hdr; - struct audio_cal_type_sp_ex_vi_param cal_type; -}; -#endif /* _UAPI_MSM_AUDIO_CALIBRATION_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_g711.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_g711.h deleted file mode 100644 index 48ebd6a1131e..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_g711.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_G711_H -#define _UAPI_MSM_AUDIO_G711_H - -#include - -struct msm_audio_g711_enc_config { - uint32_t sample_rate; -}; - -#define AUDIO_SET_G711_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_enc_config) - -#define AUDIO_GET_G711_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_enc_config) - - -#endif /* _UAPI_MSM_AUDIO_G711_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_g711_dec.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_g711_dec.h deleted file mode 100644 index ff7e4ce39fd5..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_g711_dec.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_G711_H -#define _UAPI_MSM_AUDIO_G711_H - -#include - -struct msm_audio_g711_dec_config { - uint32_t sample_rate; -}; - -#define AUDIO_SET_G711_DEC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_dec_config) - -#define AUDIO_GET_G711_DEC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_dec_config) - -#endif /* _UAPI_MSM_AUDIO_G711_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_mvs.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_mvs.h deleted file mode 100644 index 5b76bf99a701..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_mvs.h +++ /dev/null @@ -1,155 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_MVS_H -#define _UAPI_MSM_AUDIO_MVS_H - -#include - -#define AUDIO_GET_MVS_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM + 0), unsigned int) -#define AUDIO_SET_MVS_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM + 1), unsigned int) - -/* MVS modes */ -#define MVS_MODE_IS733 0x1 /*QCELP 13K*/ -#define MVS_MODE_IS127 0x2 /*EVRC-8k*/ -#define MVS_MODE_4GV_NB 0x3 /*EVRC-B*/ -#define MVS_MODE_4GV_WB 0x4 /*EVRC-WB*/ -#define MVS_MODE_AMR 0x5 -#define MVS_MODE_EFR 0x6 -#define MVS_MODE_FR 0x7 -#define MVS_MODE_HR 0x8 -#define MVS_MODE_LINEAR_PCM 0x9 -#define MVS_MODE_G711 0xA -#define MVS_MODE_PCM 0xC -#define MVS_MODE_AMR_WB 0xD -#define MVS_MODE_G729A 0xE -#define MVS_MODE_G711A 0xF -#define MVS_MODE_G722 0x10 -#define MVS_MODE_PCM_WB 0x12 - -enum msm_audio_amr_mode { - MVS_AMR_MODE_0475, /* AMR 4.75 kbps */ - MVS_AMR_MODE_0515, /* AMR 5.15 kbps */ - MVS_AMR_MODE_0590, /* AMR 5.90 kbps */ - MVS_AMR_MODE_0670, /* AMR 6.70 kbps */ - MVS_AMR_MODE_0740, /* AMR 7.40 kbps */ - MVS_AMR_MODE_0795, /* AMR 7.95 kbps */ - MVS_AMR_MODE_1020, /* AMR 10.20 kbps */ - MVS_AMR_MODE_1220, /* AMR 12.20 kbps */ - MVS_AMR_MODE_0660, /* AMR-WB 6.60 kbps */ - MVS_AMR_MODE_0885, /* AMR-WB 8.85 kbps */ - MVS_AMR_MODE_1265, /* AMR-WB 12.65 kbps */ - MVS_AMR_MODE_1425, /* AMR-WB 14.25 kbps */ - MVS_AMR_MODE_1585, /* AMR-WB 15.85 kbps */ - MVS_AMR_MODE_1825, /* AMR-WB 18.25 kbps */ - MVS_AMR_MODE_1985, /* AMR-WB 19.85 kbps */ - MVS_AMR_MODE_2305, /* AMR-WB 23.05 kbps */ - MVS_AMR_MODE_2385, /* AMR-WB 23.85 kbps */ - MVS_AMR_MODE_UNDEF -}; - -/* The MVS VOC rate type is used to identify the rate of QCELP 13K(IS733), - * EVRC(IS127), 4GV, or 4GV-WB frame. - */ -enum msm_audio_voc_rate { - MVS_VOC_0_RATE, /* Blank frame */ - MVS_VOC_8_RATE, /* 1/8 rate */ - MVS_VOC_4_RATE, /* 1/4 rate */ - MVS_VOC_2_RATE, /* 1/2 rate */ - MVS_VOC_1_RATE, /* Full rate */ - MVS_VOC_ERASURE, /* erasure frame */ - MVS_VOC_RATE_MAX, - MVS_VOC_RATE_UNDEF = MVS_VOC_RATE_MAX -}; - -enum msm_audio_amr_frame_type { - MVS_AMR_SPEECH_GOOD, /* Good speech frame */ - MVS_AMR_SPEECH_DEGRADED, /* Speech degraded */ - MVS_AMR_ONSET, /* Onset */ - MVS_AMR_SPEECH_BAD, /* Corrupt speech frame (bad CRC) */ - MVS_AMR_SID_FIRST, /* First silence descriptor */ - MVS_AMR_SID_UPDATE, /* Comfort noise frame */ - MVS_AMR_SID_BAD, /* Corrupt SID frame (bad CRC) */ - MVS_AMR_NO_DATA, /* Nothing to transmit */ - MVS_AMR_SPEECH_LOST /* Downlink speech lost */ -}; - -enum msm_audio_g711a_mode { - MVS_G711A_MODE_MULAW, - MVS_G711A_MODE_ALAW -}; - -enum msm_audio_g711_mode { - MVS_G711_MODE_MULAW, - MVS_G711_MODE_ALAW -}; - -enum mvs_g722_mode_type { - MVS_G722_MODE_01, - MVS_G722_MODE_02, - MVS_G722_MODE_03, - MVS_G722_MODE_MAX, - MVS_G722_MODE_UNDEF -}; - -enum msm_audio_g711a_frame_type { - MVS_G711A_SPEECH_GOOD, - MVS_G711A_SID, - MVS_G711A_NO_DATA, - MVS_G711A_ERASURE -}; - -enum msm_audio_g729a_frame_type { - MVS_G729A_NO_DATA, - MVS_G729A_SPEECH_GOOD, - MVS_G729A_SID, - MVS_G729A_ERASURE -}; - -struct min_max_rate { - uint32_t min_rate; - uint32_t max_rate; -}; - -struct msm_audio_mvs_config { - uint32_t mvs_mode; - uint32_t rate_type; - struct min_max_rate min_max_rate; - uint32_t dtx_mode; -}; - -#define MVS_MAX_VOC_PKT_SIZE 640 - -struct gsm_header { - uint8_t bfi; - uint8_t sid; - uint8_t taf; - uint8_t ufi; -}; - -struct q6_msm_audio_mvs_frame { - union { - uint32_t frame_type; - uint32_t packet_rate; - struct gsm_header gsm_frame_type; - } header; - uint32_t len; - uint8_t voc_pkt[MVS_MAX_VOC_PKT_SIZE]; - -}; - -struct msm_audio_mvs_frame { - uint32_t frame_type; - uint32_t len; - uint8_t voc_pkt[MVS_MAX_VOC_PKT_SIZE]; - -}; - -#define Q5V2_MVS_MAX_VOC_PKT_SIZE 320 - -struct q5v2_msm_audio_mvs_frame { - uint32_t frame_type; - uint32_t len; - uint8_t voc_pkt[Q5V2_MVS_MAX_VOC_PKT_SIZE]; - -}; -#endif /* _UAPI_MSM_AUDIO_MVS_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_qcp.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_qcp.h deleted file mode 100644 index fdb234e91acf..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_qcp.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_QCP_H -#define _UAPI_MSM_AUDIO_QCP_H - -#include - -#define AUDIO_SET_QCELP_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - 0, struct msm_audio_qcelp_enc_config) - -#define AUDIO_GET_QCELP_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - 1, struct msm_audio_qcelp_enc_config) - -#define AUDIO_SET_EVRC_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - 2, struct msm_audio_evrc_enc_config) - -#define AUDIO_GET_EVRC_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - 3, struct msm_audio_evrc_enc_config) - -#define CDMA_RATE_BLANK 0x00 -#define CDMA_RATE_EIGHTH 0x01 -#define CDMA_RATE_QUARTER 0x02 -#define CDMA_RATE_HALF 0x03 -#define CDMA_RATE_FULL 0x04 -#define CDMA_RATE_ERASURE 0x05 - -struct msm_audio_qcelp_enc_config { - uint32_t cdma_rate; - uint32_t min_bit_rate; - uint32_t max_bit_rate; -}; - -struct msm_audio_evrc_enc_config { - uint32_t cdma_rate; - uint32_t min_bit_rate; - uint32_t max_bit_rate; -}; - -#endif /* _UAPI_MSM_AUDIO_QCP_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_sbc.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_sbc.h deleted file mode 100644 index 1c7c63da3da7..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_sbc.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_SBC_H -#define _UAPI_MSM_AUDIO_SBC_H - -#include - -#define AUDIO_SET_SBC_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_sbc_enc_config) - -#define AUDIO_GET_SBC_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_sbc_enc_config) - -#define AUDIO_SBC_BA_LOUDNESS 0x0 -#define AUDIO_SBC_BA_SNR 0x1 - -#define AUDIO_SBC_MODE_MONO 0x0 -#define AUDIO_SBC_MODE_DUAL 0x1 -#define AUDIO_SBC_MODE_STEREO 0x2 -#define AUDIO_SBC_MODE_JSTEREO 0x3 - -#define AUDIO_SBC_BANDS_8 0x1 - -#define AUDIO_SBC_BLOCKS_4 0x0 -#define AUDIO_SBC_BLOCKS_8 0x1 -#define AUDIO_SBC_BLOCKS_12 0x2 -#define AUDIO_SBC_BLOCKS_16 0x3 - -struct msm_audio_sbc_enc_config { - uint32_t channels; - uint32_t sample_rate; - uint32_t bit_allocation; - uint32_t number_of_subbands; - uint32_t number_of_blocks; - uint32_t bit_rate; - uint32_t mode; -}; -#endif /* _UAPI_MSM_AUDIO_SBC_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_voicememo.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_voicememo.h deleted file mode 100644 index a7a7a4df17d5..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_voicememo.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_VOICEMEMO_H -#define _UAPI_MSM_AUDIO_VOICEMEMO_H - -#include - -#define AUDIO_GET_VOICEMEMO_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_SET_VOICEMEMO_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) - -/* rec_type */ -enum rpc_voc_rec_dir_type { - RPC_VOC_REC_NONE, - RPC_VOC_REC_FORWARD, - RPC_VOC_REC_REVERSE, - RPC_VOC_REC_BOTH, - RPC_VOC_MAX_REC_TYPE -}; - -/* capability */ -enum rpc_voc_capability_type { - RPC_VOC_CAP_IS733 = 4, - RPC_VOC_CAP_IS127 = 8, - RPC_VOC_CAP_AMR = 64, - RPC_VOC_CAP_32BIT_DUMMY = 2147483647 -}; - -/* Rate */ -enum rpc_voc_rate_type { - RPC_VOC_0_RATE = 0, - RPC_VOC_8_RATE, - RPC_VOC_4_RATE, - RPC_VOC_2_RATE, - RPC_VOC_1_RATE, - RPC_VOC_ERASURE, - RPC_VOC_ERR_RATE, - RPC_VOC_AMR_RATE_475 = 0, - RPC_VOC_AMR_RATE_515 = 1, - RPC_VOC_AMR_RATE_590 = 2, - RPC_VOC_AMR_RATE_670 = 3, - RPC_VOC_AMR_RATE_740 = 4, - RPC_VOC_AMR_RATE_795 = 5, - RPC_VOC_AMR_RATE_1020 = 6, - RPC_VOC_AMR_RATE_1220 = 7, -}; - -/* frame_format */ -enum rpc_voc_pb_len_rate_var_type { - RPC_VOC_PB_NATIVE_QCP = 3, - RPC_VOC_PB_AMR, - RPC_VOC_PB_EVB -}; - -struct msm_audio_voicememo_config { - uint32_t rec_type; - uint32_t rec_interval_ms; - uint32_t auto_stop_ms; - uint32_t capability; - uint32_t max_rate; - uint32_t min_rate; - uint32_t frame_format; - uint32_t dtx_enable; - uint32_t data_req_ms; -}; - -#endif /* _UAPI_MSM_AUDIO_VOICEMEMO_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_wma.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_wma.h deleted file mode 100644 index 523fadef08d1..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_wma.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_WMA_H -#define _UAPI_MSM_AUDIO_WMA_H - -#define AUDIO_GET_WMA_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_SET_WMA_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) - -#define AUDIO_GET_WMA_CONFIG_V2 _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+2), struct msm_audio_wma_config_v2) -#define AUDIO_SET_WMA_CONFIG_V2 _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_wma_config_v2) - -struct msm_audio_wma_config { - unsigned short armdatareqthr; - unsigned short channelsdecoded; - unsigned short wmabytespersec; - unsigned short wmasamplingfreq; - unsigned short wmaencoderopts; -}; - -struct msm_audio_wma_config_v2 { - unsigned short format_tag; - unsigned short numchannels; - uint32_t samplingrate; - uint32_t avgbytespersecond; - unsigned short block_align; - unsigned short validbitspersample; - uint32_t channelmask; - unsigned short encodeopt; -}; - -#endif /* _UAPI_MSM_AUDIO_WMA_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/msm_audio_wmapro.h b/techpack/audio/4.0/include/uapi/linux/msm_audio_wmapro.h deleted file mode 100644 index 64cbf9e079d6..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/msm_audio_wmapro.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_WMAPRO_H -#define _UAPI_MSM_AUDIO_WMAPRO_H - -#define AUDIO_GET_WMAPRO_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_wmapro_config) -#define AUDIO_SET_WMAPRO_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_wmapro_config) - -struct msm_audio_wmapro_config { - unsigned short armdatareqthr; - uint8_t validbitspersample; - uint8_t numchannels; - unsigned short formattag; - uint32_t samplingrate; - uint32_t avgbytespersecond; - unsigned short asfpacketlength; - uint32_t channelmask; - unsigned short encodeopt; - unsigned short advancedencodeopt; - uint32_t advancedencodeopt2; -}; -#endif /* _UAPI_MSM_AUDIO_WMAPRO_H */ diff --git a/techpack/audio/4.0/include/uapi/linux/wcd-spi-ac-params.h b/techpack/audio/4.0/include/uapi/linux/wcd-spi-ac-params.h deleted file mode 100644 index e397bf215ab8..000000000000 --- a/techpack/audio/4.0/include/uapi/linux/wcd-spi-ac-params.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef __UAPI_WCD_SPI_AC_PARAMS_H__ -#define __UAPI_WCD_SPI_AC_PARAMS_H__ - -#include - -#define WCD_SPI_AC_CMD_CONC_BEGIN 0x01 -#define WCD_SPI_AC_CMD_CONC_END 0x02 -#define WCD_SPI_AC_CMD_BUF_DATA 0x03 - -#define WCD_SPI_AC_MAX_BUFFERS 2 -#define WCD_SPI_AC_MAX_CH_PER_BUF 8 - -#define WCD_SPI_AC_CLIENT_CDEV_NAME "wcd-spi-ac-client" -#define WCD_SPI_AC_PROCFS_DIR_NAME "wcd-spi-ac" -#define WCD_SPI_AC_PROCFS_STATE_NAME "svc-state" - -/* - * wcd_spi_ac_buf_data: - * Buffer address for one buffer. Should have data - * for all the channels. If channels are unused, the - * value must be NULL. - * - * @addr: - * Address where each channel of the buffer starts. - */ -struct wcd_spi_ac_buf_data { - __u32 addr[WCD_SPI_AC_MAX_CH_PER_BUF]; -} __packed; - -/* - * wcd_spi_ac_write_cmd: - * Data sent to the driver's write interface should - * be packed in this format. - * - * @cmd_type: - * Indicates the type of command that is sent. Should - * be one of the valid commands defined with - * WCD_SPI_AC_CMD_* - * @payload: - * No payload for: - * WCD_SPI_AC_CMD_CONC_BEGIN - * WCD_SPI_AC_CMD_CONC_END - * Upto WCD_SPI_AC_MAX_BUFFERS of type - * struct wcd_spi_ac_buf_data for: - * WCD_SPI_AC_CMD_BUF_DATA - */ -struct wcd_spi_ac_write_cmd { - __u32 cmd_type; - __u8 payload[0]; -} __packed; - -#endif /* end of __UAPI_WCD_SPI_AC_PARAMS_H__ */ diff --git a/techpack/audio/4.0/include/uapi/sound/Kbuild b/techpack/audio/4.0/include/uapi/sound/Kbuild deleted file mode 100644 index 175fb6f63359..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/Kbuild +++ /dev/null @@ -1,8 +0,0 @@ -# UAPI Header export list -header-y += lsm_params.h -header-y += audio_slimslave.h -header-y += audio_effects.h -header-y += devdep_params.h -header-y += msmcal-hwdep.h -header-y += wcd-dsp-glink.h -header-y += voice_params.h diff --git a/techpack/audio/4.0/include/uapi/sound/audio_effects.h b/techpack/audio/4.0/include/uapi/sound/audio_effects.h deleted file mode 100644 index f38b2121a56e..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/audio_effects.h +++ /dev/null @@ -1,365 +0,0 @@ -#ifndef _AUDIO_EFFECTS_H -#define _AUDIO_EFFECTS_H - -/** AUDIO EFFECTS **/ - - -/* CONFIG GET/SET */ -#define CONFIG_CACHE 0 -#define CONFIG_SET 1 -#define CONFIG_GET 2 - -/* CONFIG HEADER */ -/* - * MODULE_ID, - * DEVICE, - * NUM_COMMANDS, - * COMMAND_ID_1, - * CONFIG_CACHE/SET/GET, - * OFFSET_1, - * LENGTH_1, - * VALUES_1, - * ..., - * ..., - * COMMAND_ID_2, - * CONFIG_CACHE/SET/GET, - * OFFSET_2, - * LENGTH_2, - * VALUES_2, - * ..., - * ..., - * COMMAND_ID_3, - * ... - */ - - -/* CONFIG PARAM IDs */ -#define VIRTUALIZER_MODULE 0x00001000 -#define VIRTUALIZER_ENABLE 0x00001001 -#define VIRTUALIZER_STRENGTH 0x00001002 -#define VIRTUALIZER_OUT_TYPE 0x00001003 -#define VIRTUALIZER_GAIN_ADJUST 0x00001004 -#define VIRTUALIZER_ENABLE_PARAM_LEN 1 -#define VIRTUALIZER_STRENGTH_PARAM_LEN 1 -#define VIRTUALIZER_OUT_TYPE_PARAM_LEN 1 -#define VIRTUALIZER_GAIN_ADJUST_PARAM_LEN 1 - -#define REVERB_MODULE 0x00002000 -#define REVERB_ENABLE 0x00002001 -#define REVERB_MODE 0x00002002 -#define REVERB_PRESET 0x00002003 -#define REVERB_WET_MIX 0x00002004 -#define REVERB_GAIN_ADJUST 0x00002005 -#define REVERB_ROOM_LEVEL 0x00002006 -#define REVERB_ROOM_HF_LEVEL 0x00002007 -#define REVERB_DECAY_TIME 0x00002008 -#define REVERB_DECAY_HF_RATIO 0x00002009 -#define REVERB_REFLECTIONS_LEVEL 0x0000200a -#define REVERB_REFLECTIONS_DELAY 0x0000200b -#define REVERB_LEVEL 0x0000200c -#define REVERB_DELAY 0x0000200d -#define REVERB_DIFFUSION 0x0000200e -#define REVERB_DENSITY 0x0000200f -#define REVERB_ENABLE_PARAM_LEN 1 -#define REVERB_MODE_PARAM_LEN 1 -#define REVERB_PRESET_PARAM_LEN 1 -#define REVERB_WET_MIX_PARAM_LEN 1 -#define REVERB_GAIN_ADJUST_PARAM_LEN 1 -#define REVERB_ROOM_LEVEL_PARAM_LEN 1 -#define REVERB_ROOM_HF_LEVEL_PARAM_LEN 1 -#define REVERB_DECAY_TIME_PARAM_LEN 1 -#define REVERB_DECAY_HF_RATIO_PARAM_LEN 1 -#define REVERB_REFLECTIONS_LEVEL_PARAM_LEN 1 -#define REVERB_REFLECTIONS_DELAY_PARAM_LEN 1 -#define REVERB_LEVEL_PARAM_LEN 1 -#define REVERB_DELAY_PARAM_LEN 1 -#define REVERB_DIFFUSION_PARAM_LEN 1 -#define REVERB_DENSITY_PARAM_LEN 1 - -#define BASS_BOOST_MODULE 0x00003000 -#define BASS_BOOST_ENABLE 0x00003001 -#define BASS_BOOST_MODE 0x00003002 -#define BASS_BOOST_STRENGTH 0x00003003 -#define BASS_BOOST_ENABLE_PARAM_LEN 1 -#define BASS_BOOST_MODE_PARAM_LEN 1 -#define BASS_BOOST_STRENGTH_PARAM_LEN 1 - -#define EQ_MODULE 0x00004000 -#define EQ_ENABLE 0x00004001 -#define EQ_CONFIG 0x00004002 -#define EQ_NUM_BANDS 0x00004003 -#define EQ_BAND_LEVELS 0x00004004 -#define EQ_BAND_LEVEL_RANGE 0x00004005 -#define EQ_BAND_FREQS 0x00004006 -#define EQ_SINGLE_BAND_FREQ_RANGE 0x00004007 -#define EQ_SINGLE_BAND_FREQ 0x00004008 -#define EQ_BAND_INDEX 0x00004009 -#define EQ_PRESET_ID 0x0000400a -#define EQ_NUM_PRESETS 0x0000400b -#define EQ_PRESET_NAME 0x0000400c -#define EQ_ENABLE_PARAM_LEN 1 -#define EQ_CONFIG_PARAM_LEN 3 -#define EQ_CONFIG_PER_BAND_PARAM_LEN 5 -#define EQ_NUM_BANDS_PARAM_LEN 1 -#define EQ_BAND_LEVELS_PARAM_LEN 13 -#define EQ_BAND_LEVEL_RANGE_PARAM_LEN 2 -#define EQ_BAND_FREQS_PARAM_LEN 13 -#define EQ_SINGLE_BAND_FREQ_RANGE_PARAM_LEN 2 -#define EQ_SINGLE_BAND_FREQ_PARAM_LEN 1 -#define EQ_BAND_INDEX_PARAM_LEN 1 -#define EQ_PRESET_ID_PARAM_LEN 1 -#define EQ_NUM_PRESETS_PARAM_LEN 1 -#define EQ_PRESET_NAME_PARAM_LEN 32 - -#define EQ_TYPE_NONE 0 -#define EQ_BASS_BOOST 1 -#define EQ_BASS_CUT 2 -#define EQ_TREBLE_BOOST 3 -#define EQ_TREBLE_CUT 4 -#define EQ_BAND_BOOST 5 -#define EQ_BAND_CUT 6 - -#define SOFT_VOLUME_MODULE 0x00006000 -#define SOFT_VOLUME_ENABLE 0x00006001 -#define SOFT_VOLUME_GAIN_2CH 0x00006002 -#define SOFT_VOLUME_GAIN_MASTER 0x00006003 -#define SOFT_VOLUME_ENABLE_PARAM_LEN 1 -#define SOFT_VOLUME_GAIN_2CH_PARAM_LEN 2 -#define SOFT_VOLUME_GAIN_MASTER_PARAM_LEN 1 - -#define SOFT_VOLUME2_MODULE 0x00007000 -#define SOFT_VOLUME2_ENABLE 0x00007001 -#define SOFT_VOLUME2_GAIN_2CH 0x00007002 -#define SOFT_VOLUME2_GAIN_MASTER 0x00007003 -#define SOFT_VOLUME2_ENABLE_PARAM_LEN SOFT_VOLUME_ENABLE_PARAM_LEN -#define SOFT_VOLUME2_GAIN_2CH_PARAM_LEN SOFT_VOLUME_GAIN_2CH_PARAM_LEN -#define SOFT_VOLUME2_GAIN_MASTER_PARAM_LEN \ - SOFT_VOLUME_GAIN_MASTER_PARAM_LEN - -#define PBE_CONF_MODULE_ID 0x00010C2A -#define PBE_CONF_PARAM_ID 0x00010C49 - -#define PBE_MODULE 0x00008000 -#define PBE_ENABLE 0x00008001 -#define PBE_CONFIG 0x00008002 -#define PBE_ENABLE_PARAM_LEN 1 -#define PBE_CONFIG_PARAM_LEN 28 - -/* Command Payload length and size for Non-IID commands */ -#define COMMAND_PAYLOAD_LEN 3 -#define COMMAND_PAYLOAD_SZ (COMMAND_PAYLOAD_LEN * sizeof(uint32_t)) -/* Command Payload length and size for IID commands */ -#define COMMAND_IID_PAYLOAD_LEN 4 -#define COMMAND_IID_PAYLOAD_SZ (COMMAND_IID_PAYLOAD_LEN * sizeof(uint32_t)) -#define MAX_INBAND_PARAM_SZ 4096 -#define Q27_UNITY (1 << 27) -#define Q8_UNITY (1 << 8) -#define CUSTOM_OPENSL_PRESET 18 - -#define VIRTUALIZER_ENABLE_PARAM_SZ \ - (VIRTUALIZER_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define VIRTUALIZER_STRENGTH_PARAM_SZ \ - (VIRTUALIZER_STRENGTH_PARAM_LEN*sizeof(uint32_t)) -#define VIRTUALIZER_OUT_TYPE_PARAM_SZ \ - (VIRTUALIZER_OUT_TYPE_PARAM_LEN*sizeof(uint32_t)) -#define VIRTUALIZER_GAIN_ADJUST_PARAM_SZ \ - (VIRTUALIZER_GAIN_ADJUST_PARAM_LEN*sizeof(uint32_t)) -struct virtualizer_params { - uint32_t device; - uint32_t enable_flag; - uint32_t strength; - uint32_t out_type; - int32_t gain_adjust; -}; - -#define NUM_OSL_REVERB_PRESETS_SUPPORTED 6 -#define REVERB_ENABLE_PARAM_SZ \ - (REVERB_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_MODE_PARAM_SZ \ - (REVERB_MODE_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_PRESET_PARAM_SZ \ - (REVERB_PRESET_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_WET_MIX_PARAM_SZ \ - (REVERB_WET_MIX_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_GAIN_ADJUST_PARAM_SZ \ - (REVERB_GAIN_ADJUST_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_ROOM_LEVEL_PARAM_SZ \ - (REVERB_ROOM_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_ROOM_HF_LEVEL_PARAM_SZ \ - (REVERB_ROOM_HF_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DECAY_TIME_PARAM_SZ \ - (REVERB_DECAY_TIME_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DECAY_HF_RATIO_PARAM_SZ \ - (REVERB_DECAY_HF_RATIO_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_REFLECTIONS_LEVEL_PARAM_SZ \ - (REVERB_REFLECTIONS_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_REFLECTIONS_DELAY_PARAM_SZ \ - (REVERB_REFLECTIONS_DELAY_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_LEVEL_PARAM_SZ \ - (REVERB_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DELAY_PARAM_SZ \ - (REVERB_DELAY_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DIFFUSION_PARAM_SZ \ - (REVERB_DIFFUSION_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DENSITY_PARAM_SZ \ - (REVERB_DENSITY_PARAM_LEN*sizeof(uint32_t)) -struct reverb_params { - uint32_t device; - uint32_t enable_flag; - uint32_t mode; - uint32_t preset; - uint32_t wet_mix; - int32_t gain_adjust; - int32_t room_level; - int32_t room_hf_level; - uint32_t decay_time; - uint32_t decay_hf_ratio; - int32_t reflections_level; - uint32_t reflections_delay; - int32_t level; - uint32_t delay; - uint32_t diffusion; - uint32_t density; -}; - -#define BASS_BOOST_ENABLE_PARAM_SZ \ - (BASS_BOOST_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define BASS_BOOST_MODE_PARAM_SZ \ - (BASS_BOOST_MODE_PARAM_LEN*sizeof(uint32_t)) -#define BASS_BOOST_STRENGTH_PARAM_SZ \ - (BASS_BOOST_STRENGTH_PARAM_LEN*sizeof(uint32_t)) -struct bass_boost_params { - uint32_t device; - uint32_t enable_flag; - uint32_t mode; - uint32_t strength; -}; - - -#define MAX_EQ_BANDS 12 -#define MAX_OSL_EQ_BANDS 5 -#define EQ_ENABLE_PARAM_SZ \ - (EQ_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define EQ_CONFIG_PARAM_SZ \ - (EQ_CONFIG_PARAM_LEN*sizeof(uint32_t)) -#define EQ_CONFIG_PER_BAND_PARAM_SZ \ - (EQ_CONFIG_PER_BAND_PARAM_LEN*sizeof(uint32_t)) -#define EQ_CONFIG_PARAM_MAX_LEN (EQ_CONFIG_PARAM_LEN+\ - MAX_EQ_BANDS*EQ_CONFIG_PER_BAND_PARAM_LEN) -#define EQ_CONFIG_PARAM_MAX_SZ \ - (EQ_CONFIG_PARAM_MAX_LEN*sizeof(uint32_t)) -#define EQ_NUM_BANDS_PARAM_SZ \ - (EQ_NUM_BANDS_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_LEVELS_PARAM_SZ \ - (EQ_BAND_LEVELS_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_LEVEL_RANGE_PARAM_SZ \ - (EQ_BAND_LEVEL_RANGE_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_FREQS_PARAM_SZ \ - (EQ_BAND_FREQS_PARAM_LEN*sizeof(uint32_t)) -#define EQ_SINGLE_BAND_FREQ_RANGE_PARAM_SZ \ - (EQ_SINGLE_BAND_FREQ_RANGE_PARAM_LEN*sizeof(uint32_t)) -#define EQ_SINGLE_BAND_FREQ_PARAM_SZ \ - (EQ_SINGLE_BAND_FREQ_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_INDEX_PARAM_SZ \ - (EQ_BAND_INDEX_PARAM_LEN*sizeof(uint32_t)) -#define EQ_PRESET_ID_PARAM_SZ \ - (EQ_PRESET_ID_PARAM_LEN*sizeof(uint32_t)) -#define EQ_NUM_PRESETS_PARAM_SZ \ - (EQ_NUM_PRESETS_PARAM_LEN*sizeof(uint8_t)) -struct eq_config_t { - int32_t eq_pregain; - int32_t preset_id; - uint32_t num_bands; -}; -struct eq_per_band_config_t { - int32_t band_idx; - uint32_t filter_type; - uint32_t freq_millihertz; - int32_t gain_millibels; - uint32_t quality_factor; -}; -struct eq_per_band_freq_range_t { - uint32_t band_index; - uint32_t min_freq_millihertz; - uint32_t max_freq_millihertz; -}; - -struct eq_params { - uint32_t device; - uint32_t enable_flag; - struct eq_config_t config; - struct eq_per_band_config_t per_band_cfg[MAX_EQ_BANDS]; - struct eq_per_band_freq_range_t per_band_freq_range[MAX_EQ_BANDS]; - uint32_t band_index; - uint32_t freq_millihertz; -}; - -#define PBE_ENABLE_PARAM_SZ \ - (PBE_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define PBE_CONFIG_PARAM_SZ \ - (PBE_CONFIG_PARAM_LEN*sizeof(uint16_t)) -struct pbe_config_t { - int16_t real_bass_mix; - int16_t bass_color_control; - uint16_t main_chain_delay; - uint16_t xover_filter_order; - uint16_t bandpass_filter_order; - int16_t drc_delay; - uint16_t rms_tav; - int16_t exp_threshold; - uint16_t exp_slope; - int16_t comp_threshold; - uint16_t comp_slope; - uint16_t makeup_gain; - uint32_t comp_attack; - uint32_t comp_release; - uint32_t exp_attack; - uint32_t exp_release; - int16_t limiter_bass_threshold; - int16_t limiter_high_threshold; - int16_t limiter_bass_makeup_gain; - int16_t limiter_high_makeup_gain; - int16_t limiter_bass_gc; - int16_t limiter_high_gc; - int16_t limiter_delay; - uint16_t reserved; - /* place holder for filter coeffs to be followed */ - int32_t p1LowPassCoeffs[5*2]; - int32_t p1HighPassCoeffs[5*2]; - int32_t p1BandPassCoeffs[5*3]; - int32_t p1BassShelfCoeffs[5]; - int32_t p1TrebleShelfCoeffs[5]; -} __packed; - -struct pbe_params { - uint32_t device; - uint32_t enable_flag; - uint32_t cfg_len; - struct pbe_config_t config; -}; - -#define SOFT_VOLUME_ENABLE_PARAM_SZ \ - (SOFT_VOLUME_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define SOFT_VOLUME_GAIN_MASTER_PARAM_SZ \ - (SOFT_VOLUME_GAIN_MASTER_PARAM_LEN*sizeof(uint32_t)) -#define SOFT_VOLUME_GAIN_2CH_PARAM_SZ \ - (SOFT_VOLUME_GAIN_2CH_PARAM_LEN*sizeof(uint16_t)) -struct soft_volume_params { - uint32_t device; - uint32_t enable_flag; - uint32_t master_gain; - uint32_t left_gain; - uint32_t right_gain; -}; - -struct msm_nt_eff_all_config { - struct bass_boost_params bass_boost; - struct pbe_params pbe; - struct virtualizer_params virtualizer; - struct reverb_params reverb; - struct eq_params equalizer; - struct soft_volume_params saplus_vol; - struct soft_volume_params topo_switch_vol; -}; - -#endif /*_MSM_AUDIO_EFFECTS_H*/ diff --git a/techpack/audio/4.0/include/uapi/sound/audio_slimslave.h b/techpack/audio/4.0/include/uapi/sound/audio_slimslave.h deleted file mode 100644 index 316a5573f5b4..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/audio_slimslave.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __AUDIO_SLIMSLAVE_H__ -#define __AUDIO_SLIMSLAVE_H__ - -#include -#include - -#define AUDIO_SLIMSLAVE_IOCTL_NAME "audio_slimslave" -#define AUDIO_SLIMSLAVE_MAGIC 'S' - -#define AUDIO_SLIMSLAVE_IOCTL_UNVOTE _IO(AUDIO_SLIMSLAVE_MAGIC, 0x00) -#define AUDIO_SLIMSLAVE_IOCTL_VOTE _IO(AUDIO_SLIMSLAVE_MAGIC, 0x01) - -enum { - AUDIO_SLIMSLAVE_UNVOTE, - AUDIO_SLIMSLAVE_VOTE -}; - -#endif diff --git a/techpack/audio/4.0/include/uapi/sound/devdep_params.h b/techpack/audio/4.0/include/uapi/sound/devdep_params.h deleted file mode 100644 index abdf10636f4d..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/devdep_params.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _DEV_DEP_H -#define _DEV_DEP_H - -struct dolby_param_data { - int32_t version; - int32_t device_id; - int32_t be_id; - int32_t param_id; - int32_t length; - int32_t __user *data; -}; - -struct dolby_param_license { - int32_t dmid; - int32_t license_key; -}; - -#define SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM\ - _IOWR('U', 0x10, struct dolby_param_data) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM\ - _IOR('U', 0x11, struct dolby_param_data) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND\ - _IOWR('U', 0x13, struct dolby_param_data) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE\ - _IOWR('U', 0x14, struct dolby_param_license) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER\ - _IOR('U', 0x15, struct dolby_param_data) - -#define DTS_EAGLE_MODULE 0x00005000 -#define DTS_EAGLE_MODULE_ENABLE 0x00005001 -#define EAGLE_DRIVER_ID 0xF2 -#define DTS_EAGLE_IOCTL_GET_CACHE_SIZE _IOR(EAGLE_DRIVER_ID, 0, int) -#define DTS_EAGLE_IOCTL_SET_CACHE_SIZE _IOW(EAGLE_DRIVER_ID, 1, int) -#define DTS_EAGLE_IOCTL_GET_PARAM _IOR(EAGLE_DRIVER_ID, 2, void*) -#define DTS_EAGLE_IOCTL_SET_PARAM _IOW(EAGLE_DRIVER_ID, 3, void*) -#define DTS_EAGLE_IOCTL_SET_CACHE_BLOCK _IOW(EAGLE_DRIVER_ID, 4, void*) -#define DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE _IOW(EAGLE_DRIVER_ID, 5, void*) -#define DTS_EAGLE_IOCTL_GET_LICENSE _IOR(EAGLE_DRIVER_ID, 6, void*) -#define DTS_EAGLE_IOCTL_SET_LICENSE _IOW(EAGLE_DRIVER_ID, 7, void*) -#define DTS_EAGLE_IOCTL_SEND_LICENSE _IOW(EAGLE_DRIVER_ID, 8, int) -#define DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS _IOW(EAGLE_DRIVER_ID, 9, void*) -#define DTS_EAGLE_FLAG_IOCTL_PRE (1<<30) -#define DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE (1<<31) -#define DTS_EAGLE_FLAG_IOCTL_GETFROMCORE DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE -#define DTS_EAGLE_FLAG_IOCTL_MASK (~(DTS_EAGLE_FLAG_IOCTL_PRE | \ - DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE)) -#define DTS_EAGLE_FLAG_ALSA_GET (1<<31) - -struct dts_eagle_param_desc { - uint32_t id; - uint32_t size; - int32_t offset; - uint32_t device; -} __packed; - -#define HWDEP_FE_BASE 3000 /*unique base for FE hw dep nodes*/ -struct snd_pcm_mmap_fd { - int32_t dir; - int32_t fd; - int32_t size; - int32_t actual_size; -}; - -struct snd_pcm_prsnt_position { - uint64_t timestamp; - uint64_t frames; - int32_t clock_id; -}; - -#define SNDRV_PCM_IOCTL_MMAP_DATA_FD _IOWR('U', 0xd2, struct snd_pcm_mmap_fd) -#define SNDRV_PCM_IOCTL_DSP_POSITION\ - _IOWR('U', 0xd3, struct snd_pcm_prsnt_position) - -#endif diff --git a/techpack/audio/4.0/include/uapi/sound/lsm_params.h b/techpack/audio/4.0/include/uapi/sound/lsm_params.h deleted file mode 100644 index 57dc3be5d454..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/lsm_params.h +++ /dev/null @@ -1,315 +0,0 @@ -#ifndef _UAPI_LSM_PARAMS_H__ -#define _UAPI_LSM_PARAMS_H__ - -#define LSM_POLLING_ENABLE_SUPPORT -#define LSM_EVENT_TIMESTAMP_MODE_SUPPORT - -#include -#include - -#define SNDRV_LSM_VERSION SNDRV_PROTOCOL_VERSION(0, 3, 1) - -#define LSM_MAX_STAGES_PER_SESSION 2 -#define LSM_STAGE_INDEX_FIRST 0 - -#define LSM_OUT_FORMAT_PCM (0) -#define LSM_OUT_FORMAT_ADPCM (1 << 0) - -#define LSM_OUT_DATA_RAW (0) -#define LSM_OUT_DATA_PACKED (1) - -#define LSM_OUT_DATA_EVENTS_DISABLED (0) -#define LSM_OUT_DATA_EVENTS_ENABLED (1) - -#define LSM_OUT_TRANSFER_MODE_RT (0) -#define LSM_OUT_TRANSFER_MODE_FTRT (1) - -#define LSM_ENDPOINT_DETECT_THRESHOLD (0) -#define LSM_OPERATION_MODE (1) -#define LSM_GAIN (2) -#define LSM_MIN_CONFIDENCE_LEVELS (3) -#define LSM_REG_SND_MODEL (4) -#define LSM_DEREG_SND_MODEL (5) -#define LSM_CUSTOM_PARAMS (6) -#define LSM_POLLING_ENABLE (7) -#define LSM_DET_EVENT_TYPE (8) -#define LSM_LAB_CONTROL (9) -#define LSM_PARAMS_MAX (LSM_LAB_CONTROL + 1) - -#define LSM_EVENT_NON_TIME_STAMP_MODE (0) -#define LSM_EVENT_TIME_STAMP_MODE (1) - -#define LSM_DET_EVENT_TYPE_LEGACY (0) -#define LSM_DET_EVENT_TYPE_GENERIC (1) - -/* Valid sample rates for input hw_params */ -#define LSM_INPUT_SAMPLE_RATE_16K 16000 -#define LSM_INPUT_SAMPLE_RATE_48K 48000 - -/* Valid bit-widths for input hw_params */ -#define LSM_INPUT_BIT_WIDTH_16 16 -#define LSM_INPUT_BIT_WIDTH_24 24 - -/* Min and Max channels for input hw_params */ -#define LSM_INPUT_NUM_CHANNELS_MIN 1 -#define LSM_INPUT_NUM_CHANNELS_MAX 9 - -enum lsm_app_id { - LSM_VOICE_WAKEUP_APP_ID = 1, - LSM_VOICE_WAKEUP_APP_ID_V2 = 2, -}; - -enum lsm_detection_mode { - LSM_MODE_KEYWORD_ONLY_DETECTION = 1, - LSM_MODE_USER_KEYWORD_DETECTION -}; - -enum lsm_vw_status { - LSM_VOICE_WAKEUP_STATUS_RUNNING = 1, - LSM_VOICE_WAKEUP_STATUS_DETECTED, - LSM_VOICE_WAKEUP_STATUS_END_SPEECH, - LSM_VOICE_WAKEUP_STATUS_REJECTED -}; - -/* - * Data for LSM_ENDPOINT_DETECT_THRESHOLD param_type - * @epd_begin: Begin threshold - * @epd_end: End threshold - */ -struct snd_lsm_ep_det_thres { - __u32 epd_begin; - __u32 epd_end; -}; - -/* - * Data for LSM_OPERATION_MODE param_type - * @mode: The detection mode to be used - * @detect_failure: Setting to enable failure detections. - */ -struct snd_lsm_detect_mode { - enum lsm_detection_mode mode; - bool detect_failure; -}; - -/* - * Data for LSM_GAIN param_type - * @gain: The gain to be applied on LSM - */ -struct snd_lsm_gain { - __u16 gain; -}; - -/* - * Data for LSM_POLLING_ENABLE param_type - * @poll_en: Polling enable or disable - */ -struct snd_lsm_poll_enable { - bool poll_en; -}; - -/* - * Data for LSM_DET_EVENT_TYPE param_type - * @event_type: LSM_DET_EVENT_TYPE_LEGACY or LSM_DET_EVENT_TYPE_GENERIC - * @mode: Type of information in detection event payload - */ -struct snd_lsm_det_event_type { - __u32 event_type; - __u32 mode; -}; - -struct snd_lsm_sound_model_v2 { - __u8 __user *data; - __u8 *confidence_level; - __u32 data_size; - enum lsm_detection_mode detection_mode; - __u8 num_confidence_levels; - bool detect_failure; -}; - -struct snd_lsm_session_data { - enum lsm_app_id app_id; -}; - -/* - * Stage info for multi-stage session - * @app_type: acdb app_type to be used to map topology/cal for the stage - * @lpi_enable: low power island mode applicable for the stage - */ -struct snd_lsm_stage_info { - __u32 app_type; - __u32 lpi_enable; -}; - -/* - * Session info for multi-stage session - * @app_id: VoiceWakeup engine id, this is now used to just validate input arg - * @num_stages: number of detection stages to be used - * @stage_info: stage info for each of the stage being used, ordered by index - */ -struct snd_lsm_session_data_v2 { - enum lsm_app_id app_id; - __u32 num_stages; - struct snd_lsm_stage_info stage_info[LSM_MAX_STAGES_PER_SESSION]; -}; - -/* - * Data for LSM_LAB_CONTROL param_type - * @enable: lab enable or disable - */ -struct snd_lsm_lab_control { - __u32 enable; -}; - -struct snd_lsm_event_status { - __u16 status; - __u16 payload_size; - __u8 payload[0]; -}; - -struct snd_lsm_event_status_v3 { - __u32 timestamp_lsw; - __u32 timestamp_msw; - __u16 status; - __u16 payload_size; - __u8 payload[0]; -}; - -struct snd_lsm_detection_params { - __u8 *conf_level; - enum lsm_detection_mode detect_mode; - __u8 num_confidence_levels; - bool detect_failure; - bool poll_enable; -}; - -/* - * Param info for each parameter type - * @module_id: Module to which parameter is to be set - * @param_id: Parameter that is to be set - * @param_size: size (in number of bytes) for the data - * in param_data. - * For confidence levels, this is num_conf_levels - * For REG_SND_MODEL, this is size of sound model - * For CUSTOM_PARAMS, this is size of the entire blob of data - * @param_data: Data for the parameter. - * For some param_types this is a structure defined, ex: LSM_GAIN - * For CONFIDENCE_LEVELS, this is array of confidence levels - * For REG_SND_MODEL, this is the sound model data - * For CUSTOM_PARAMS, this is the blob of custom data. - * @param_type: Parameter type as defined in values upto LSM_PARAMS_MAX - */ -struct lsm_params_info { - __u32 module_id; - __u32 param_id; - __u32 param_size; - __u8 __user *param_data; - uint32_t param_type; -}; - -/* - * Param info(version 2) for each parameter type - * - * Existing member variables: - * @module_id: Module to which parameter is to be set - * @param_id: Parameter that is to be set - * @param_size: size (in number of bytes) for the data - * in param_data. - * For confidence levels, this is num_conf_levels - * For REG_SND_MODEL, this is size of sound model - * For CUSTOM_PARAMS, this is size of the entire blob of data - * @param_data: Data for the parameter. - * For some param_types this is a structure defined, ex: LSM_GAIN - * For CONFIDENCE_LEVELS, this is array of confidence levels - * For REG_SND_MODEL, this is the sound model data - * For CUSTOM_PARAMS, this is the blob of custom data. - * @param_type: Parameter type as defined in values upto LSM_PARAMS_MAX - * - * Member variables applicable only to V2: - * @instance_id: instance id of the param to which parameter is to be set - * @stage_idx: detection stage for which the param is applicable - */ -struct lsm_params_info_v2 { - __u32 module_id; - __u32 param_id; - __u32 param_size; - __u8 __user *param_data; - uint32_t param_type; - __u16 instance_id; - __u16 stage_idx; -}; - -/* - * Data passed to the SET_PARAM_V2 IOCTL - * @num_params: Number of params that are to be set - * should not be greater than LSM_PARAMS_MAX - * @params: Points to an array of lsm_params_info - * Each entry points to one parameter to set - * @data_size: size (in bytes) for params - * should be equal to - * num_params * sizeof(struct lsm_parms_info) - */ -struct snd_lsm_module_params { - __u8 __user *params; - __u32 num_params; - __u32 data_size; -}; - -/* - * Data passed to LSM_OUT_FORMAT_CFG IOCTL - * @format: The media format enum - * @packing: indicates the packing method used for data path - * @events: indicates whether data path events need to be enabled - * @transfer_mode: indicates whether FTRT mode or RT mode. - */ -struct snd_lsm_output_format_cfg { - __u8 format; - __u8 packing; - __u8 events; - __u8 mode; -}; - -/* - * Data passed to SNDRV_LSM_SET_INPUT_HW_PARAMS ioctl - * - * @sample_rate: Sample rate of input to lsm. - * valid values are 16000 and 48000 - * @bit_width: Bit width of audio samples input to lsm. - * valid values are 16 and 24 - * @num_channels: Number of channels input to lsm. - * valid values are range from 1 to 16 - */ -struct snd_lsm_input_hw_params { - __u32 sample_rate; - __u16 bit_width; - __u16 num_channels; -} __packed; - -#define SNDRV_LSM_DEREG_SND_MODEL _IOW('U', 0x01, int) -#define SNDRV_LSM_EVENT_STATUS _IOW('U', 0x02, struct snd_lsm_event_status) -#define SNDRV_LSM_ABORT_EVENT _IOW('U', 0x03, int) -#define SNDRV_LSM_START _IOW('U', 0x04, int) -#define SNDRV_LSM_STOP _IOW('U', 0x05, int) -#define SNDRV_LSM_SET_SESSION_DATA _IOW('U', 0x06, struct snd_lsm_session_data) -#define SNDRV_LSM_REG_SND_MODEL_V2 _IOW('U', 0x07,\ - struct snd_lsm_sound_model_v2) -#define SNDRV_LSM_LAB_CONTROL _IOW('U', 0x08, uint32_t) -#define SNDRV_LSM_STOP_LAB _IO('U', 0x09) -#define SNDRV_LSM_SET_PARAMS _IOW('U', 0x0A, \ - struct snd_lsm_detection_params) -#define SNDRV_LSM_SET_MODULE_PARAMS _IOW('U', 0x0B, \ - struct snd_lsm_module_params) -#define SNDRV_LSM_OUT_FORMAT_CFG _IOW('U', 0x0C, \ - struct snd_lsm_output_format_cfg) -#define SNDRV_LSM_SET_PORT _IO('U', 0x0D) -#define SNDRV_LSM_SET_FWK_MODE_CONFIG _IOW('U', 0x0E, uint32_t) -#define SNDRV_LSM_EVENT_STATUS_V3 _IOW('U', 0x0F, \ - struct snd_lsm_event_status_v3) -#define SNDRV_LSM_GENERIC_DET_EVENT _IOW('U', 0x10, struct snd_lsm_event_status) -#define SNDRV_LSM_SET_INPUT_HW_PARAMS _IOW('U', 0x11, \ - struct snd_lsm_input_hw_params) -#define SNDRV_LSM_SET_SESSION_DATA_V2 _IOW('U', 0x12, \ - struct snd_lsm_session_data_v2) -#define SNDRV_LSM_SET_MODULE_PARAMS_V2 _IOW('U', 0x13, \ - struct snd_lsm_module_params) - -#endif diff --git a/techpack/audio/4.0/include/uapi/sound/msmcal-hwdep.h b/techpack/audio/4.0/include/uapi/sound/msmcal-hwdep.h deleted file mode 100644 index f2891863fa47..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/msmcal-hwdep.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _CALIB_HWDEP_H -#define _CALIB_HWDEP_H - -#define WCD9XXX_CODEC_HWDEP_NODE 1000 -#define AQT1000_CODEC_HWDEP_NODE 1001 -#define Q6AFE_HWDEP_NODE 1002 -enum wcd_cal_type { - WCD9XXX_MIN_CAL, - WCD9XXX_ANC_CAL = WCD9XXX_MIN_CAL, - WCD9XXX_MAD_CAL, - WCD9XXX_MBHC_CAL, - WCD9XXX_VBAT_CAL, - WCD9XXX_MAX_CAL, -}; - -struct wcdcal_ioctl_buffer { - __u32 size; - __u8 __user *buffer; - enum wcd_cal_type cal_type; -}; - -#define SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE \ - _IOW('U', 0x1, struct wcdcal_ioctl_buffer) - -enum q6afe_cal_type { - Q6AFE_MIN_CAL, - Q6AFE_VAD_CORE_CAL = Q6AFE_MIN_CAL, - Q6AFE_MAX_CAL, -}; - -struct q6afecal_ioctl_buffer { - __u32 size; - __u8 __user *buffer; - enum q6afe_cal_type cal_type; -}; - -#define SNDRV_IOCTL_HWDEP_VAD_CAL_TYPE \ - _IOW('U', 0x1, struct q6afecal_ioctl_buffer) - -#endif /*_CALIB_HWDEP_H*/ diff --git a/techpack/audio/4.0/include/uapi/sound/voice_params.h b/techpack/audio/4.0/include/uapi/sound/voice_params.h deleted file mode 100644 index 43e3b9d0aa49..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/voice_params.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __VOICE_PARAMS_H__ -#define __VOICE_PARAMS_H__ - -#include -#include - -enum voice_lch_mode { - VOICE_LCH_START = 1, - VOICE_LCH_STOP -}; - -#define SNDRV_VOICE_IOCTL_LCH _IOW('U', 0x00, enum voice_lch_mode) - -#endif diff --git a/techpack/audio/4.0/include/uapi/sound/wcd-dsp-glink.h b/techpack/audio/4.0/include/uapi/sound/wcd-dsp-glink.h deleted file mode 100644 index 39d128d370a0..000000000000 --- a/techpack/audio/4.0/include/uapi/sound/wcd-dsp-glink.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _WCD_DSP_GLINK_H -#define _WCD_DSP_GLINK_H - -#include - -#define WDSP_CH_NAME_MAX_LEN 50 - -enum { - WDSP_REG_PKT = 1, - WDSP_CMD_PKT, - WDSP_READY_PKT, -}; -#define WDSP_READY_PKT WDSP_READY_PKT - -/* - * struct wdsp_reg_pkt - Glink channel information structure format - * @no_of_channels: Number of glink channels to open - * @payload[0]: Dynamic array contains all the glink channels information - */ -struct wdsp_reg_pkt { - __u8 no_of_channels; - __u8 payload[0]; -}; - -/* - * struct wdsp_cmd_pkt - WDSP command packet format - * @ch_name: Name of the glink channel - * @payload_size: Size of the payload - * @payload[0]: Actual data payload - */ -struct wdsp_cmd_pkt { - char ch_name[WDSP_CH_NAME_MAX_LEN]; - __u32 payload_size; - __u8 payload[0]; -}; - -/* - * struct wdsp_write_pkt - Format that userspace send the data to driver. - * @pkt_type: Type of the packet(REG or CMD PKT) - * @payload[0]: Payload is either cmd or reg pkt structure based on pkt type - */ -struct wdsp_write_pkt { - __u8 pkt_type; - __u8 payload[0]; -}; - -/* - * struct wdsp_glink_ch_cfg - Defines the glink channel configuration. - * @ch_name: Name of the glink channel - * @latency_in_us: Latency specified in micro seconds for QOS - * @no_of_intents: Number of intents prequeued - * @intents_size[0]: Dynamic array to specify size of each intent - */ -struct wdsp_glink_ch_cfg { - char name[WDSP_CH_NAME_MAX_LEN]; - __u32 latency_in_us; - __u32 no_of_intents; - __u32 intents_size[0]; -}; -#endif /* _WCD_DSP_GLINK_H */ diff --git a/techpack/audio/4.0/ipc/Android.mk b/techpack/audio/4.0/ipc/Android.mk deleted file mode 100644 index 25b98dd09d9b..000000000000 --- a/techpack/audio/4.0/ipc/Android.mk +++ /dev/null @@ -1,81 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -AUDIO_SELECT := CONFIG_SND_SOC_SA8155=m -else -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) atoll kona lito),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=apr_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_apr.ko -LOCAL_MODULE_KBUILD_NAME := apr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET)),true) -ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), msmnile_au msmnile_gvmq)) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wglink.ko -LOCAL_MODULE_KBUILD_NAME := wglink_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -endif -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/ipc/Kbuild b/techpack/audio/4.0/ipc/Kbuild deleted file mode 100644 index e71da4eb80c2..000000000000 --- a/techpack/audio/4.0/ipc/Kbuild +++ /dev/null @@ -1,184 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -# These are configurable via Kconfig for kernel-based builds -# Need to explicitly configure for Android-based builds -KDIR := $(TOP)/kernel/msm-4.19 - -ifeq ($(KERNEL_BUILD), 1) - AUDIO_ROOT := $(KDIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - ifdef CONFIG_SND_SOC_SA8155 - include $(AUDIO_ROOT)/config/sa8155auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sa8155autoconf.h - else - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_QTI_GVM), y) - include $(AUDIO_ROOT)/config/gvmauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ IPC ############ - -ifdef CONFIG_MSM_QDSP6_APRV2_RPMSG -APRV_GLINK += apr.o -APRV_GLINK += apr_v2.o -APRV_GLINK += apr_tal_rpmsg.o -endif - -ifdef CONFIG_MSM_QDSP6_APRV3_RPMSG -APRV_GLINK += apr.o -APRV_GLINK += apr_v3.o -APRV_GLINK += apr_tal_rpmsg.o -endif - -ifdef CONFIG_MSM_QDSP6_APRV2_VM -APRV_GLINK += apr_vm.o -APRV_GLINK += apr_v2.o -endif - -ifdef CONFIG_WCD_DSP_GLINK -WDSP_GLINK += wcd-dsp-glink.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_ATOLL), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - endif - -endif - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif -# If the module name is not "wlan", then the define MULTI_IF_NAME to be the -# same a the QCA CHIP name. The host driver will then append MULTI_IF_NAME to -# any string that must be unique for all instances of the driver on the system. -# This allows multiple instances of the driver with different module names. -# If the module name is wlan, leave MULTI_IF_NAME undefined and the code will -# treat the driver as the primary driver. -ifneq ($(MODNAME), qdsp6v2) -CHIP_NAME ?= $(MODNAME) -CDEFINES += -DMULTI_IF_NAME=\"$(CHIP_NAME)\" -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_MSM_QDSP6_APRV2_RPMSG) += apr_dlkm.o -obj-$(CONFIG_MSM_QDSP6_APRV3_RPMSG) += apr_dlkm.o -obj-$(CONFIG_MSM_QDSP6_APRV2_VM) += apr_dlkm.o -apr_dlkm-y := $(APRV_GLINK) - -obj-$(CONFIG_WCD_DSP_GLINK) += wglink_dlkm.o -wglink_dlkm-y := $(WDSP_GLINK) - -# inject some build related information diff --git a/techpack/audio/4.0/ipc/apr.c b/techpack/audio/4.0/ipc/apr.c deleted file mode 100644 index 033f6b24f45f..000000000000 --- a/techpack/audio/4.0/ipc/apr.c +++ /dev/null @@ -1,1248 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2010-2014, 2016-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define APR_PKT_IPC_LOG_PAGE_CNT 2 - -static struct apr_q6 q6; -static struct apr_client client[APR_DEST_MAX][APR_CLIENT_MAX]; -static void *apr_pkt_ctx; -static wait_queue_head_t modem_wait; -static bool is_modem_up; -static char *subsys_name = NULL; -/* Subsystem restart: QDSP6 data, functions */ -static struct workqueue_struct *apr_reset_workqueue; -static void apr_reset_deregister(struct work_struct *work); -static void dispatch_event(unsigned long code, uint16_t proc); -struct apr_reset_work { - void *handle; - struct work_struct work; -}; - -struct apr_chld_device { - struct platform_device *pdev; - struct list_head node; -}; - -struct apr_private { - struct device *dev; - spinlock_t apr_lock; - bool is_initial_boot; - struct work_struct add_chld_dev_work; -}; - -static struct apr_private *apr_priv; -static bool apr_cf_debug; - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_apr_debug; -static ssize_t apr_debug_write(struct file *filp, const char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - char cmd; - - if (copy_from_user(&cmd, ubuf, 1)) - return -EFAULT; - - apr_cf_debug = (cmd == '1') ? true : false; - - return cnt; -} - -static const struct file_operations apr_debug_ops = { - .write = apr_debug_write, -}; -#endif - -#define APR_PKT_INFO(x...) \ -do { \ - if (apr_pkt_ctx) \ - ipc_log_string(apr_pkt_ctx, ": "x); \ -} while (0) - - -struct apr_svc_table { - char name[64]; - int idx; - int id; - int client_id; -}; - -static const struct apr_svc_table svc_tbl_qdsp6[] = { - { - .name = "AFE", - .idx = 0, - .id = APR_SVC_AFE, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "ASM", - .idx = 1, - .id = APR_SVC_ASM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "ADM", - .idx = 2, - .id = APR_SVC_ADM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "CORE", - .idx = 3, - .id = APR_SVC_ADSP_CORE, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "TEST", - .idx = 4, - .id = APR_SVC_TEST_CLIENT, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "MVM", - .idx = 5, - .id = APR_SVC_ADSP_MVM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "CVS", - .idx = 6, - .id = APR_SVC_ADSP_CVS, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "CVP", - .idx = 7, - .id = APR_SVC_ADSP_CVP, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "USM", - .idx = 8, - .id = APR_SVC_USM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "VIDC", - .idx = 9, - .id = APR_SVC_VIDC, - }, - { - .name = "LSM", - .idx = 10, - .id = APR_SVC_LSM, - .client_id = APR_CLIENT_AUDIO, - }, -}; - -static struct apr_svc_table svc_tbl_voice[] = { - { - .name = "VSM", - .idx = 0, - .id = APR_SVC_VSM, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "VPM", - .idx = 1, - .id = APR_SVC_VPM, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "MVS", - .idx = 2, - .id = APR_SVC_MVS, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "MVM", - .idx = 3, - .id = APR_SVC_MVM, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "CVS", - .idx = 4, - .id = APR_SVC_CVS, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "CVP", - .idx = 5, - .id = APR_SVC_CVP, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "SRD", - .idx = 6, - .id = APR_SVC_SRD, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "TEST", - .idx = 7, - .id = APR_SVC_TEST_CLIENT, - .client_id = APR_CLIENT_VOICE, - }, -}; - -/** - * apr_get_modem_state: - * - * Returns current modem load status - * - */ -enum apr_subsys_state apr_get_modem_state(void) -{ - return atomic_read(&q6.modem_state); -} -EXPORT_SYMBOL(apr_get_modem_state); - -/** - * apr_set_modem_state - Update modem load status. - * - * @state: State to update modem load status - * - */ -void apr_set_modem_state(enum apr_subsys_state state) -{ - atomic_set(&q6.modem_state, state); -} -EXPORT_SYMBOL(apr_set_modem_state); - -enum apr_subsys_state apr_cmpxchg_modem_state(enum apr_subsys_state prev, - enum apr_subsys_state new) -{ - return atomic_cmpxchg(&q6.modem_state, prev, new); -} - -static void apr_modem_down(unsigned long opcode) -{ - apr_set_modem_state(APR_SUBSYS_DOWN); - dispatch_event(opcode, APR_DEST_MODEM); -} - -static void apr_modem_up(void) -{ - if (apr_cmpxchg_modem_state(APR_SUBSYS_DOWN, APR_SUBSYS_UP) == - APR_SUBSYS_DOWN) - wake_up(&modem_wait); - is_modem_up = 1; -} - -enum apr_subsys_state apr_get_q6_state(void) -{ - return atomic_read(&q6.q6_state); -} -EXPORT_SYMBOL(apr_get_q6_state); - -int apr_set_q6_state(enum apr_subsys_state state) -{ - pr_debug("%s: setting adsp state %d\n", __func__, state); - if (state < APR_SUBSYS_DOWN || state > APR_SUBSYS_LOADED) - return -EINVAL; - atomic_set(&q6.q6_state, state); - return 0; -} -EXPORT_SYMBOL(apr_set_q6_state); - -static void apr_ssr_disable(struct device *dev, void *data) -{ - apr_set_q6_state(APR_SUBSYS_DOWN); -} - -static const struct snd_event_ops apr_ssr_ops = { - .disable = apr_ssr_disable, -}; - -static void apr_adsp_down(unsigned long opcode) -{ - pr_info("%s: Q6 is Down\n", __func__); - snd_event_notify(apr_priv->dev, SND_EVENT_DOWN); - apr_set_q6_state(APR_SUBSYS_DOWN); - dispatch_event(opcode, APR_DEST_QDSP6); -} - -static void apr_add_child_devices(struct work_struct *work) -{ - int ret; - - ret = of_platform_populate(apr_priv->dev->of_node, - NULL, NULL, apr_priv->dev); - if (ret) - dev_err(apr_priv->dev, "%s: failed to add child nodes, ret=%d\n", - __func__, ret); -} - -static void apr_adsp_up(void) -{ - pr_info("%s: Q6 is Up\n", __func__); - apr_set_q6_state(APR_SUBSYS_LOADED); - - spin_lock(&apr_priv->apr_lock); - if (apr_priv->is_initial_boot) - schedule_work(&apr_priv->add_chld_dev_work); - spin_unlock(&apr_priv->apr_lock); - snd_event_notify(apr_priv->dev, SND_EVENT_UP); -} - -int apr_load_adsp_image(void) -{ - int rc = 0; - - mutex_lock(&q6.lock); - if (apr_get_q6_state() == APR_SUBSYS_UP) { - q6.pil = subsystem_get("adsp"); - if (IS_ERR(q6.pil)) { - rc = PTR_ERR(q6.pil); - pr_err("APR: Unable to load q6 image, error:%d\n", rc); - } else { - apr_set_q6_state(APR_SUBSYS_LOADED); - pr_debug("APR: Image is loaded, stated\n"); - } - } else if (apr_get_q6_state() == APR_SUBSYS_LOADED) { - pr_debug("APR: q6 image already loaded\n"); - } else { - pr_debug("APR: cannot load state %d\n", apr_get_q6_state()); - } - mutex_unlock(&q6.lock); - return rc; -} - -struct apr_client *apr_get_client(int dest_id, int client_id) -{ - return &client[dest_id][client_id]; -} - -/** - * apr_send_pkt - Clients call to send packet - * to destination processor. - * - * @handle: APR service handle - * @buf: payload to send to destination processor. - * - * Returns Bytes(>0)pkt_size on success or error on failure. - */ -int apr_send_pkt(void *handle, uint32_t *buf) -{ - struct apr_svc *svc = handle; - struct apr_client *clnt; - struct apr_hdr *hdr; - uint16_t dest_id; - uint16_t client_id; - uint16_t w_len; - int rc; - unsigned long flags; - - if (!handle || !buf) { - pr_err("APR: Wrong parameters for %s\n", - !handle ? "handle" : "buf"); - return -EINVAL; - } - if (svc->need_reset) { - pr_err_ratelimited("apr: send_pkt service need reset\n"); - return -ENETRESET; - } - - if ((svc->dest_id == APR_DEST_QDSP6) && - (apr_get_q6_state() != APR_SUBSYS_LOADED)) { - pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); - return -ENETRESET; - } else if ((svc->dest_id == APR_DEST_MODEM) && - (apr_get_modem_state() == APR_SUBSYS_DOWN)) { - pr_err("apr: Still Modem is not Up\n"); - return -ENETRESET; - } - - spin_lock_irqsave(&svc->w_lock, flags); - dest_id = svc->dest_id; - client_id = svc->client_id; - clnt = &client[dest_id][client_id]; - - if (!client[dest_id][client_id].handle) { - pr_err_ratelimited("APR: Still service is not yet opened\n"); - spin_unlock_irqrestore(&svc->w_lock, flags); - return -EINVAL; - } - hdr = (struct apr_hdr *)buf; - - hdr->src_domain = APR_DOMAIN_APPS; - hdr->src_svc = svc->id; - hdr->dest_domain = svc->dest_domain; - hdr->dest_svc = svc->id; - - if (unlikely(apr_cf_debug)) { - APR_PKT_INFO( - "Tx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode, - hdr->token); - } - - rc = apr_tal_write(clnt->handle, buf, - (struct apr_pkt_priv *)&svc->pkt_owner, - hdr->pkt_size); - if (rc >= 0) { - w_len = rc; - if (w_len != hdr->pkt_size) { - pr_err("%s: Unable to write whole APR pkt successfully: %d\n", - __func__, rc); - rc = -EINVAL; - } - } else { - pr_err_ratelimited("%s: Write APR pkt failed with error %d\n", - __func__, rc); - if (rc == -ECONNRESET) { - pr_err_ratelimited("%s: Received reset error from tal\n", - __func__); - rc = -ENETRESET; - } - } - spin_unlock_irqrestore(&svc->w_lock, flags); - - return rc; -} -EXPORT_SYMBOL(apr_send_pkt); - -int apr_pkt_config(void *handle, struct apr_pkt_cfg *cfg) -{ - struct apr_svc *svc = (struct apr_svc *)handle; - uint16_t dest_id; - uint16_t client_id; - struct apr_client *clnt; - - if (!handle) { - pr_err("%s: Invalid handle\n", __func__); - return -EINVAL; - } - - if (svc->need_reset) { - pr_err("%s: service need reset\n", __func__); - return -ENETRESET; - } - - svc->pkt_owner = cfg->pkt_owner; - dest_id = svc->dest_id; - client_id = svc->client_id; - clnt = &client[dest_id][client_id]; - - return apr_tal_rx_intents_config(clnt->handle, - cfg->intents.num_of_intents, cfg->intents.size); -} - -/** - * apr_register - Clients call to register - * to APR. - * - * @dest: destination processor - * @svc_name: name of service to register as - * @svc_fn: callback function to trigger when response - * ack or packets received from destination processor. - * @src_port: Port number within a service - * @priv: private data of client, passed back in cb fn. - * - * Returns apr_svc handle on success or NULL on failure. - */ -struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn, - uint32_t src_port, void *priv) -{ - struct apr_client *clnt; - int client_id = 0; - int svc_idx = 0; - int svc_id = 0; - int dest_id = 0; - int domain_id = 0; - int temp_port = 0; - struct apr_svc *svc = NULL; - int rc = 0; - bool can_open_channel = true; - - if (!dest || !svc_name || !svc_fn) - return NULL; - - if (!strcmp(dest, "ADSP")) - domain_id = APR_DOMAIN_ADSP; - else if (!strcmp(dest, "MODEM")) { - /* Don't request for SMD channels if destination is MODEM, - * as these channels are no longer used and these clients - * are to listen only for MODEM SSR events - */ - can_open_channel = false; - domain_id = APR_DOMAIN_MODEM; - } else { - pr_err("APR: wrong destination\n"); - goto done; - } - - dest_id = apr_get_dest_id(dest); - - if (dest_id == APR_DEST_QDSP6) { - if (apr_get_q6_state() != APR_SUBSYS_LOADED) { - pr_err_ratelimited("%s: adsp not up\n", __func__); - return NULL; - } - pr_debug("%s: adsp Up\n", __func__); - } else if (dest_id == APR_DEST_MODEM) { - if (apr_get_modem_state() == APR_SUBSYS_DOWN) { - if (is_modem_up) { - pr_err("%s: modem shutdown due to SSR, ret", - __func__); - return NULL; - } - pr_debug("%s: Wait for modem to bootup\n", __func__); - rc = wait_event_interruptible_timeout(modem_wait, - (apr_get_modem_state() == APR_SUBSYS_UP), - (1 * HZ)); - if (rc == 0) { - pr_err("%s: Modem is not Up\n", __func__); - return NULL; - } - } - pr_debug("%s: modem Up\n", __func__); - } - - if (apr_get_svc(svc_name, domain_id, &client_id, &svc_idx, &svc_id)) { - pr_err_ratelimited("%s: apr_get_svc failed\n", __func__); - goto done; - } - - clnt = &client[dest_id][client_id]; - mutex_lock(&clnt->m_lock); - if (!clnt->handle && can_open_channel) { - clnt->handle = apr_tal_open(client_id, dest_id, - APR_DL_SMD, apr_cb_func, NULL); - if (!clnt->handle) { - svc = NULL; - pr_err_ratelimited("APR: Unable to open handle\n"); - mutex_unlock(&clnt->m_lock); - goto done; - } - } - mutex_unlock(&clnt->m_lock); - svc = &clnt->svc[svc_idx]; - mutex_lock(&svc->m_lock); - clnt->id = client_id; - if (svc->need_reset) { - mutex_unlock(&svc->m_lock); - pr_err_ratelimited("APR: Service needs reset\n"); - svc = NULL; - goto done; - } - svc->id = svc_id; - svc->dest_id = dest_id; - svc->client_id = client_id; - svc->dest_domain = domain_id; - svc->pkt_owner = APR_PKT_OWNER_DRIVER; - - if (src_port != 0xFFFFFFFF) { - temp_port = ((src_port >> 8) * 8) + (src_port & 0xFF); - pr_debug("port = %d t_port = %d\n", src_port, temp_port); - if (temp_port >= APR_MAX_PORTS || temp_port < 0) { - pr_err("APR: temp_port out of bounds\n"); - mutex_unlock(&svc->m_lock); - return NULL; - } - if (!svc->svc_cnt) - clnt->svc_cnt++; - svc->port_cnt++; - svc->port_fn[temp_port] = svc_fn; - svc->port_priv[temp_port] = priv; - svc->svc_cnt++; - } else { - if (!svc->fn) { - if (!svc->svc_cnt) - clnt->svc_cnt++; - svc->fn = svc_fn; - svc->priv = priv; - svc->svc_cnt++; - } - } - - mutex_unlock(&svc->m_lock); -done: - return svc; -} -EXPORT_SYMBOL(apr_register); - - -void apr_cb_func(void *buf, int len, void *priv) -{ - struct apr_client_data data; - struct apr_client *apr_client; - struct apr_svc *c_svc; - struct apr_hdr *hdr; - uint16_t hdr_size; - uint16_t msg_type; - uint16_t ver; - uint16_t src; - uint16_t svc; - uint16_t clnt; - int i; - int temp_port = 0; - uint32_t *ptr; - - pr_debug("APR2: len = %d\n", len); - ptr = buf; - pr_debug("\n*****************\n"); - for (i = 0; i < len/4; i++) - pr_debug("%x ", ptr[i]); - pr_debug("\n"); - pr_debug("\n*****************\n"); - - if (!buf || len <= APR_HDR_SIZE) { - pr_err("APR: Improper apr pkt received:%pK %d\n", buf, len); - return; - } - hdr = buf; - - ver = hdr->hdr_field; - ver = (ver & 0x000F); - if (ver > APR_PKT_VER + 1) { - pr_err("APR: Wrong version: %d\n", ver); - return; - } - - hdr_size = hdr->hdr_field; - hdr_size = ((hdr_size & 0x00F0) >> 0x4) * 4; - if (hdr_size < APR_HDR_SIZE) { - pr_err("APR: Wrong hdr size:%d\n", hdr_size); - return; - } - - if (hdr->pkt_size < APR_HDR_SIZE) { - pr_err("APR: Wrong paket size\n"); - return; - } - - if (hdr->pkt_size < hdr_size) { - pr_err("APR: Packet size less than header size\n"); - return; - } - - msg_type = hdr->hdr_field; - msg_type = (msg_type >> 0x08) & 0x0003; - if (msg_type >= APR_MSG_TYPE_MAX && msg_type != APR_BASIC_RSP_RESULT) { - pr_err("APR: Wrong message type: %d\n", msg_type); - return; - } - - if (hdr->src_domain >= APR_DOMAIN_MAX || - hdr->dest_domain >= APR_DOMAIN_MAX || - hdr->src_svc >= APR_SVC_MAX || - hdr->dest_svc >= APR_SVC_MAX) { - pr_err("APR: Wrong APR header\n"); - return; - } - - svc = hdr->dest_svc; - if (hdr->src_domain == APR_DOMAIN_MODEM) { - if (svc == APR_SVC_MVS || svc == APR_SVC_MVM || - svc == APR_SVC_CVS || svc == APR_SVC_CVP || - svc == APR_SVC_TEST_CLIENT) - clnt = APR_CLIENT_VOICE; - else { - pr_err("APR: Wrong svc :%d\n", svc); - return; - } - } else if (hdr->src_domain == APR_DOMAIN_ADSP) { - if (svc == APR_SVC_AFE || svc == APR_SVC_ASM || - svc == APR_SVC_VSM || svc == APR_SVC_VPM || - svc == APR_SVC_ADM || svc == APR_SVC_ADSP_CORE || - svc == APR_SVC_USM || - svc == APR_SVC_TEST_CLIENT || svc == APR_SVC_ADSP_MVM || - svc == APR_SVC_ADSP_CVS || svc == APR_SVC_ADSP_CVP || - svc == APR_SVC_LSM) - clnt = APR_CLIENT_AUDIO; - else if (svc == APR_SVC_VIDC) - clnt = APR_CLIENT_AUDIO; - else { - pr_err("APR: Wrong svc :%d\n", svc); - return; - } - } else { - pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain); - return; - } - - src = apr_get_data_src(hdr); - if (src == APR_DEST_MAX) - return; - - pr_debug("src =%d clnt = %d\n", src, clnt); - apr_client = &client[src][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) - if (apr_client->svc[i].id == svc) { - pr_debug("%d\n", apr_client->svc[i].id); - c_svc = &apr_client->svc[i]; - break; - } - - if (i == APR_SVC_MAX) { - pr_err("APR: service is not registered\n"); - return; - } - pr_debug("svc_idx = %d\n", i); - pr_debug("%x %x %x %pK %pK\n", c_svc->id, c_svc->dest_id, - c_svc->client_id, c_svc->fn, c_svc->priv); - data.payload_size = hdr->pkt_size - hdr_size; - data.opcode = hdr->opcode; - data.src = src; - data.src_port = hdr->src_port; - data.dest_port = hdr->dest_port; - data.token = hdr->token; - data.msg_type = msg_type; - data.payload = NULL; - if (data.payload_size > 0) - data.payload = (char *)hdr + hdr_size; - - if (unlikely(apr_cf_debug)) { - if (hdr->opcode == APR_BASIC_RSP_RESULT && data.payload) { - uint32_t *ptr = data.payload; - - APR_PKT_INFO( - "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X] rc[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, - hdr->opcode, hdr->token, ptr[1]); - } else { - APR_PKT_INFO( - "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode, - hdr->token); - } - } - - temp_port = ((data.dest_port >> 8) * 8) + (data.dest_port & 0xFF); - if (((temp_port >= 0) && (temp_port < APR_MAX_PORTS)) - && (c_svc->port_cnt && c_svc->port_fn[temp_port])) - c_svc->port_fn[temp_port](&data, - c_svc->port_priv[temp_port]); - else if (c_svc->fn) - c_svc->fn(&data, c_svc->priv); - else - pr_err("APR: Rxed a packet for NULL callback\n"); -} - -int apr_get_svc(const char *svc_name, int domain_id, int *client_id, - int *svc_idx, int *svc_id) -{ - int i; - int size; - struct apr_svc_table *tbl; - int ret = 0; - - if (domain_id == APR_DOMAIN_ADSP) { - tbl = (struct apr_svc_table *)&svc_tbl_qdsp6; - size = ARRAY_SIZE(svc_tbl_qdsp6); - } else { - tbl = (struct apr_svc_table *)&svc_tbl_voice; - size = ARRAY_SIZE(svc_tbl_voice); - } - - for (i = 0; i < size; i++) { - if (!strcmp(svc_name, tbl[i].name)) { - *client_id = tbl[i].client_id; - *svc_idx = tbl[i].idx; - *svc_id = tbl[i].id; - break; - } - } - - pr_debug("%s: svc_name = %s c_id = %d domain_id = %d\n", - __func__, svc_name, *client_id, domain_id); - if (i == size) { - pr_err("%s: APR: Wrong svc name %s\n", __func__, svc_name); - ret = -EINVAL; - } - - return ret; -} - -static void apr_reset_deregister(struct work_struct *work) -{ - struct apr_svc *handle = NULL; - struct apr_reset_work *apr_reset = - container_of(work, struct apr_reset_work, work); - - handle = apr_reset->handle; - pr_debug("%s:handle[%pK]\n", __func__, handle); - apr_deregister(handle); - kfree(apr_reset); -} - -/** - * apr_start_rx_rt - Clients call to vote for thread - * priority upgrade whenever needed. - * - * @handle: APR service handle - * - * Returns 0 on success or error otherwise. - */ -int apr_start_rx_rt(void *handle) -{ - int rc = 0; - struct apr_svc *svc = handle; - uint16_t dest_id = 0; - uint16_t client_id = 0; - - if (!svc) { - pr_err("%s: Invalid APR handle\n", __func__); - return -EINVAL; - } - - mutex_lock(&svc->m_lock); - dest_id = svc->dest_id; - client_id = svc->client_id; - - if ((client_id >= APR_CLIENT_MAX) || (dest_id >= APR_DEST_MAX)) { - pr_err("%s: %s invalid. client_id = %u, dest_id = %u\n", - __func__, - client_id >= APR_CLIENT_MAX ? "Client ID" : "Dest ID", - client_id, dest_id); - rc = -EINVAL; - goto exit; - } - - if (!client[dest_id][client_id].handle) { - pr_err("%s: Client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - rc = apr_tal_start_rx_rt(client[dest_id][client_id].handle); - if (rc) - pr_err("%s: failed to set RT thread priority for APR RX. rc = %d\n", - __func__, rc); - -exit: - mutex_unlock(&svc->m_lock); - return rc; -} -EXPORT_SYMBOL(apr_start_rx_rt); - -/** - * apr_end_rx_rt - Clients call to unvote for thread - * priority upgrade (perviously voted with - * apr_start_rx_rt()). - * - * @handle: APR service handle - * - * Returns 0 on success or error otherwise. - */ -int apr_end_rx_rt(void *handle) -{ - int rc = 0; - struct apr_svc *svc = handle; - uint16_t dest_id = 0; - uint16_t client_id = 0; - - if (!svc) { - pr_err("%s: Invalid APR handle\n", __func__); - return -EINVAL; - } - - mutex_lock(&svc->m_lock); - dest_id = svc->dest_id; - client_id = svc->client_id; - - if ((client_id >= APR_CLIENT_MAX) || (dest_id >= APR_DEST_MAX)) { - pr_err("%s: %s invalid. client_id = %u, dest_id = %u\n", - __func__, - client_id >= APR_CLIENT_MAX ? "Client ID" : "Dest ID", - client_id, dest_id); - rc = -EINVAL; - goto exit; - } - - if (!client[dest_id][client_id].handle) { - pr_err("%s: Client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - rc = apr_tal_end_rx_rt(client[dest_id][client_id].handle); - if (rc) - pr_err("%s: failed to reset RT thread priority for APR RX. rc = %d\n", - __func__, rc); - -exit: - mutex_unlock(&svc->m_lock); - return rc; -} -EXPORT_SYMBOL(apr_end_rx_rt); - -/** - * apr_deregister - Clients call to de-register - * from APR. - * - * @handle: APR service handle to de-register - * - * Returns 0 on success or -EINVAL on error. - */ -int apr_deregister(void *handle) -{ - struct apr_svc *svc = handle; - struct apr_client *clnt; - uint16_t dest_id; - uint16_t client_id; - - if (!handle) - return -EINVAL; - - mutex_lock(&svc->m_lock); - if (!svc->svc_cnt) { - pr_err("%s: svc already deregistered. svc = %pK\n", - __func__, svc); - mutex_unlock(&svc->m_lock); - return -EINVAL; - } - - dest_id = svc->dest_id; - client_id = svc->client_id; - clnt = &client[dest_id][client_id]; - - if (svc->svc_cnt > 0) { - if (svc->port_cnt) - svc->port_cnt--; - svc->svc_cnt--; - if (!svc->svc_cnt) { - client[dest_id][client_id].svc_cnt--; - pr_debug("%s: service is reset %pK\n", __func__, svc); - } - } - - if (!svc->svc_cnt) { - svc->priv = NULL; - svc->id = 0; - svc->fn = NULL; - svc->dest_id = 0; - svc->client_id = 0; - svc->need_reset = 0x0; - } - if (client[dest_id][client_id].handle && - !client[dest_id][client_id].svc_cnt) { - apr_tal_close(client[dest_id][client_id].handle); - client[dest_id][client_id].handle = NULL; - } - mutex_unlock(&svc->m_lock); - - return 0; -} -EXPORT_SYMBOL(apr_deregister); - -/** - * apr_reset - sets up workqueue to de-register - * the given APR service handle. - * - * @handle: APR service handle - * - */ -void apr_reset(void *handle) -{ - struct apr_reset_work *apr_reset_worker = NULL; - - if (!handle) - return; - pr_debug("%s: handle[%pK]\n", __func__, handle); - - if (apr_reset_workqueue == NULL) { - pr_err("%s: apr_reset_workqueue is NULL\n", __func__); - return; - } - - apr_reset_worker = kzalloc(sizeof(struct apr_reset_work), - GFP_ATOMIC); - - if (apr_reset_worker == NULL) { - pr_err("%s: mem failure\n", __func__); - return; - } - - apr_reset_worker->handle = handle; - INIT_WORK(&apr_reset_worker->work, apr_reset_deregister); - queue_work(apr_reset_workqueue, &apr_reset_worker->work); -} -EXPORT_SYMBOL(apr_reset); - -/* Dispatch the Reset events to Modem and audio clients */ -static void dispatch_event(unsigned long code, uint16_t proc) -{ - struct apr_client *apr_client; - struct apr_client_data data; - struct apr_svc *svc; - uint16_t clnt; - int i, j; - - memset(&data, 0, sizeof(data)); - data.opcode = RESET_EVENTS; - data.reset_event = code; - - /* Service domain can be different from the processor */ - data.reset_proc = apr_get_reset_domain(proc); - - clnt = APR_CLIENT_AUDIO; - apr_client = &client[proc][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) { - mutex_lock(&apr_client->svc[i].m_lock); - if (apr_client->svc[i].fn) { - apr_client->svc[i].need_reset = 0x1; - apr_client->svc[i].fn(&data, apr_client->svc[i].priv); - } - if (apr_client->svc[i].port_cnt) { - svc = &(apr_client->svc[i]); - svc->need_reset = 0x1; - for (j = 0; j < APR_MAX_PORTS; j++) - if (svc->port_fn[j]) - svc->port_fn[j](&data, - svc->port_priv[j]); - } - mutex_unlock(&apr_client->svc[i].m_lock); - } - - clnt = APR_CLIENT_VOICE; - apr_client = &client[proc][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) { - mutex_lock(&apr_client->svc[i].m_lock); - if (apr_client->svc[i].fn) { - apr_client->svc[i].need_reset = 0x1; - apr_client->svc[i].fn(&data, apr_client->svc[i].priv); - } - if (apr_client->svc[i].port_cnt) { - svc = &(apr_client->svc[i]); - svc->need_reset = 0x1; - for (j = 0; j < APR_MAX_PORTS; j++) - if (svc->port_fn[j]) - svc->port_fn[j](&data, - svc->port_priv[j]); - } - mutex_unlock(&apr_client->svc[i].m_lock); - } -} - -static int apr_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - struct audio_notifier_cb_data *cb_data = data; - - if (cb_data == NULL) { - pr_err("%s: Callback data is NULL!\n", __func__); - goto done; - } - - pr_debug("%s: Service opcode 0x%lx, domain %d\n", - __func__, opcode, cb_data->domain); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore down notifications during - * initial boot. There is no benefit from error - * recovery notifications during initial boot - * up since everything is expected to be down. - */ - spin_lock(&apr_priv->apr_lock); - if (apr_priv->is_initial_boot) { - spin_unlock(&apr_priv->apr_lock); - break; - } - spin_unlock(&apr_priv->apr_lock); - if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN) - apr_modem_down(opcode); - else - apr_adsp_down(opcode); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN) - apr_modem_up(); - else - apr_adsp_up(); - spin_lock(&apr_priv->apr_lock); - apr_priv->is_initial_boot = false; - spin_unlock(&apr_priv->apr_lock); - break; - default: - break; - } -done: - return NOTIFY_OK; -} - -static struct notifier_block adsp_service_nb = { - .notifier_call = apr_notifier_service_cb, - .priority = 0, -}; - -static struct notifier_block modem_service_nb = { - .notifier_call = apr_notifier_service_cb, - .priority = 0, -}; - -#ifdef CONFIG_DEBUG_FS -static int __init apr_debug_init(void) -{ - debugfs_apr_debug = debugfs_create_file("msm_apr_debug", - S_IFREG | 0444, NULL, NULL, - &apr_debug_ops); - return 0; -} -#else -static int __init apr_debug_init(void) -{ - return 0; -} -#endif - -static void apr_cleanup(void) -{ - int i, j, k; - - of_platform_depopulate(apr_priv->dev); - subsys_notif_deregister(subsys_name); - if (apr_reset_workqueue) { - flush_workqueue(apr_reset_workqueue); - destroy_workqueue(apr_reset_workqueue); - } - mutex_destroy(&q6.lock); - for (i = 0; i < APR_DEST_MAX; i++) { - for (j = 0; j < APR_CLIENT_MAX; j++) { - mutex_destroy(&client[i][j].m_lock); - for (k = 0; k < APR_SVC_MAX; k++) - mutex_destroy(&client[i][j].svc[k].m_lock); - } - } -#ifdef CONFIG_DEBUG_FS - debugfs_remove(debugfs_apr_debug); -#endif -} - -static int apr_probe(struct platform_device *pdev) -{ - int i, j, k, ret = 0; - - init_waitqueue_head(&modem_wait); - - apr_priv = devm_kzalloc(&pdev->dev, sizeof(*apr_priv), GFP_KERNEL); - if (!apr_priv) - return -ENOMEM; - - apr_priv->dev = &pdev->dev; - spin_lock_init(&apr_priv->apr_lock); - INIT_WORK(&apr_priv->add_chld_dev_work, apr_add_child_devices); - - for (i = 0; i < APR_DEST_MAX; i++) - for (j = 0; j < APR_CLIENT_MAX; j++) { - mutex_init(&client[i][j].m_lock); - for (k = 0; k < APR_SVC_MAX; k++) { - mutex_init(&client[i][j].svc[k].m_lock); - spin_lock_init(&client[i][j].svc[k].w_lock); - } - } - apr_set_subsys_state(); - mutex_init(&q6.lock); - apr_reset_workqueue = create_singlethread_workqueue("apr_driver"); - if (!apr_reset_workqueue) { - apr_priv = NULL; - return -ENOMEM; - } - - apr_pkt_ctx = ipc_log_context_create(APR_PKT_IPC_LOG_PAGE_CNT, - "apr", 0); - if (!apr_pkt_ctx) - pr_err("%s: Unable to create ipc log context\n", __func__); - - spin_lock(&apr_priv->apr_lock); - apr_priv->is_initial_boot = true; - spin_unlock(&apr_priv->apr_lock); - ret = of_property_read_string(pdev->dev.of_node, - "qcom,subsys-name", - (const char **)(&subsys_name)); - if (ret) { - pr_err("%s: missing subsys-name entry in dt node\n", __func__); - return -EINVAL; - } - - if (!strcmp(subsys_name, "apr_adsp")) { - subsys_notif_register("apr_adsp", - AUDIO_NOTIFIER_ADSP_DOMAIN, - &adsp_service_nb); - } else if (!strcmp(subsys_name, "apr_modem")) { - subsys_notif_register("apr_modem", - AUDIO_NOTIFIER_MODEM_DOMAIN, - &modem_service_nb); - } else { - pr_err("%s: invalid subsys-name %s\n", __func__, subsys_name); - return -EINVAL; - } - - apr_tal_init(); - - ret = snd_event_client_register(&pdev->dev, &apr_ssr_ops, NULL); - if (ret) { - pr_err("%s: Registration with SND event fwk failed ret = %d\n", - __func__, ret); - ret = 0; - } - - return apr_debug_init(); -} - -static int apr_remove(struct platform_device *pdev) -{ - snd_event_client_deregister(&pdev->dev); - apr_cleanup(); - apr_tal_exit(); - apr_priv = NULL; - return 0; -} - -static const struct of_device_id apr_machine_of_match[] = { - { .compatible = "qcom,msm-audio-apr", }, - {}, -}; - -static struct platform_driver apr_driver = { - .probe = apr_probe, - .remove = apr_remove, - .driver = { - .name = "audio_apr", - .owner = THIS_MODULE, - .of_match_table = apr_machine_of_match, - .suppress_bind_attrs = true, - } -}; - -module_platform_driver(apr_driver); - -MODULE_DESCRIPTION("APR DRIVER"); -MODULE_LICENSE("GPL v2"); -MODULE_DEVICE_TABLE(of, apr_machine_of_match); diff --git a/techpack/audio/4.0/ipc/apr_tal_rpmsg.c b/techpack/audio/4.0/ipc/apr_tal_rpmsg.c deleted file mode 100644 index c8830d1c25cc..000000000000 --- a/techpack/audio/4.0/ipc/apr_tal_rpmsg.c +++ /dev/null @@ -1,317 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -enum apr_channel_state { - APR_CH_DISCONNECTED, - APR_CH_CONNECTED, -}; - -#define APR_MAXIMUM_NUM_OF_RETRIES 2 - -static struct apr_svc_ch_dev - apr_svc_ch[APR_DL_MAX][APR_DEST_MAX][APR_CLIENT_MAX]; - -/** - * apr_tal_write() - Write a message across to the remote processor - * @apr_ch: apr channel handle - * @data: buffer that needs to be transferred over the channel - * @pkt_priv: private data of the packet - * @len: length of the buffer - * - * Returns len of buffer successfully transferred on success - * and an appropriate error value on failure. - */ -int apr_tal_write(struct apr_svc_ch_dev *apr_ch, void *data, - struct apr_pkt_priv *pkt_priv, int len) -{ - int rc = 0, retries = 0; - unsigned long flags; - struct rpmsg_device *rpdev = NULL; - - if (!apr_ch || len > APR_MAX_BUF || - apr_ch->channel_state != APR_CH_CONNECTED) - return -EINVAL; - - spin_lock_irqsave(&apr_ch->w_lock, flags); - rpdev = apr_ch->handle; - if (!rpdev) { - spin_unlock_irqrestore(&apr_ch->w_lock, flags); - return -EINVAL; - } - - do { - if (rc == -EAGAIN) - udelay(50); - rc = rpmsg_trysend(rpdev->ept, data, len); - } while (rc == -EAGAIN && retries++ < APR_MAXIMUM_NUM_OF_RETRIES); - spin_unlock_irqrestore(&apr_ch->w_lock, flags); - - if (rc) - pr_err("%s: Unable to send the packet, rc:%d\n", __func__, rc); - else - rc = len; - - return rc; -} -EXPORT_SYMBOL(apr_tal_write); - -/** - * apr_tal_rx_intents_config() - Configure glink intents for remote processor - * @apr_ch: apr channel handle - * @num_of_intents: number of intents - * @size: size of the intents - * - * This api is not supported with RPMSG. Returns 0 to indicate success - */ -int apr_tal_rx_intents_config(struct apr_svc_ch_dev *apr_ch, - int num_of_intents, uint32_t size) -{ - pr_debug("%s: NO-OP\n", __func__); - return 0; -} -EXPORT_SYMBOL(apr_tal_rx_intents_config); - -/** - * apr_tal_start_rx_rt() - Set RT thread priority for APR RX transfer - * @apr_ch: apr channel handle - * - * This api is not supported with RPMSG as message transfer occurs - * in client's context. Returns 0 to indicate success. - */ -int apr_tal_start_rx_rt(struct apr_svc_ch_dev *apr_ch) -{ - pr_debug("%s: NO-OP\n", __func__); - return 0; -} -EXPORT_SYMBOL(apr_tal_start_rx_rt); - -/** - * apr_tal_end_rx_rt() - Remove RT thread priority for APR RX transfer - * @apr_ch: apr channel handle - * - * This api is not supported with RPMSG. Returns 0 to indicate success - */ -int apr_tal_end_rx_rt(struct apr_svc_ch_dev *apr_ch) -{ - pr_debug("%s: NO-OP\n", __func__); - return 0; -} -EXPORT_SYMBOL(apr_tal_end_rx_rt); - -/** - * apr_tal_open() - Open a transport channel for data transfer - * on remote processor. - * @clnt: apr client, audio or voice - * @dest: destination remote processor for which apr channel is requested for. - * @dl: type of data link - * @func: callback function to handle data transfer from remote processor - * @priv: private data of the client - * - * Returns apr_svc_ch_dev handle on success and NULL on failure. - */ -struct apr_svc_ch_dev *apr_tal_open(uint32_t clnt, uint32_t dest, uint32_t dl, - apr_svc_cb_fn func, void *priv) -{ - int rc = 0; - struct apr_svc_ch_dev *apr_ch = NULL; - - if ((clnt != APR_CLIENT_AUDIO) || (dest >= APR_DEST_MAX) || - (dl != APR_DL_SMD)) { - pr_err("%s: Invalid params, clnt:%d, dest:%d, dl:%d\n", - __func__, clnt, dest, dl); - return NULL; - } - apr_ch = &apr_svc_ch[dl][dest][clnt]; - mutex_lock(&apr_ch->m_lock); - if (!apr_ch->handle) { - rc = wait_event_timeout(apr_ch->wait, - (apr_ch->channel_state == APR_CH_CONNECTED), 5 * HZ); - - if (rc == 0) { - pr_err("%s: TIMEOUT for APR_CH_CONNECTED event\n", - __func__); - rc = -ETIMEDOUT; - goto unlock; - } - } - - pr_debug("%s: Channel connected, returning handle :%pK\n", - __func__, apr_ch->handle); - apr_ch->func = func; - apr_ch->priv = priv; - -unlock: - mutex_unlock(&apr_ch->m_lock); - return rc ? NULL : apr_ch; -} -EXPORT_SYMBOL(apr_tal_open); - -/** - * apr_tal_close() - Close transport channel on remote processor. - * @apr_ch: apr channel handle - * - * Returns 0 on success and an appropriate error value on failure. - */ -int apr_tal_close(struct apr_svc_ch_dev *apr_ch) -{ - int rc = 0; - - if (!apr_ch || !apr_ch->handle) { - rc = -EINVAL; - goto exit; - } - - mutex_lock(&apr_ch->m_lock); - apr_ch->func = NULL; - apr_ch->priv = NULL; - mutex_unlock(&apr_ch->m_lock); - -exit: - return rc; -} -EXPORT_SYMBOL(apr_tal_close); - -static int apr_tal_rpmsg_callback(struct rpmsg_device *rpdev, - void *data, int len, void *priv, u32 addr) -{ - struct apr_svc_ch_dev *apr_ch = dev_get_drvdata(&rpdev->dev); - unsigned long flags; - - if (!apr_ch || !data) { - pr_err("%s: Invalid apr_ch or ptr\n", __func__); - return -EINVAL; - } - - dev_dbg(&rpdev->dev, "%s: Rx packet received, len:%d\n", - __func__, len); - - spin_lock_irqsave(&apr_ch->r_lock, flags); - if (apr_ch->func) - apr_ch->func((void *)data, len, apr_ch->priv); - spin_unlock_irqrestore(&apr_ch->r_lock, flags); - - return 0; -} - -static int apr_tal_rpmsg_probe(struct rpmsg_device *rpdev) -{ - struct apr_svc_ch_dev *apr_ch = NULL; - int ret = 0; - const char* dest; - - ret = of_property_read_string(rpdev->dev.parent->of_node, - "mbox-names", &dest); - - if(ret < 0){ - pr_err("%s no parent source pid found\n", __func__); - return -EINVAL; - } - - if (!strcmp(rpdev->id.name, "apr_audio_svc")) { - dev_info(&rpdev->dev, "%s: Channel[%s] state[Up]\n", - __func__, rpdev->id.name); - } else { - dev_err(&rpdev->dev, "%s, Invalid Channel [%s]\n", - __func__, rpdev->id.name); - return -EINVAL; - } - if(strstr(dest, "adsp")) { - apr_ch = - &apr_svc_ch[APR_DL_SMD][APR_DEST_QDSP6][APR_CLIENT_AUDIO]; - apr_ch->handle = rpdev; - apr_ch->channel_state = APR_CH_CONNECTED; - dev_set_drvdata(&rpdev->dev, apr_ch); - wake_up(&apr_ch->wait); - } else if(strstr(dest, "mpss")) { - apr_ch = - &apr_svc_ch[APR_DL_SMD][APR_DEST_MODEM][APR_CLIENT_AUDIO]; - apr_ch->handle = rpdev; - apr_ch->channel_state = APR_CH_CONNECTED; - dev_set_drvdata(&rpdev->dev, apr_ch); - wake_up(&apr_ch->wait); - } else { - dev_err(&rpdev->dev, "%s, unsupported dest %s\n", - __func__, dest); - return -EINVAL; - } - - return ret; -} - -static void apr_tal_rpmsg_remove(struct rpmsg_device *rpdev) -{ - struct apr_svc_ch_dev *apr_ch = dev_get_drvdata(&rpdev->dev); - - if (!apr_ch) { - dev_err(&rpdev->dev, "%s: Invalid apr_ch\n", __func__); - return; - } - - dev_info(&rpdev->dev, "%s: Channel[%s] state[Down]\n", - __func__, rpdev->id.name); - apr_ch->handle = NULL; - apr_ch->channel_state = APR_CH_DISCONNECTED; - dev_set_drvdata(&rpdev->dev, NULL); -} - -static const struct rpmsg_device_id apr_tal_rpmsg_match[] = { - { "apr_audio_svc" }, - {} -}; - -static struct rpmsg_driver apr_tal_rpmsg_driver = { - .probe = apr_tal_rpmsg_probe, - .remove = apr_tal_rpmsg_remove, - .callback = apr_tal_rpmsg_callback, - .id_table = apr_tal_rpmsg_match, - .drv = { - .name = "apr_tal_rpmsg", - }, -}; - -/** - * apr_tal_int() - Registers rpmsg driver with rpmsg framework. - * - * Returns 0 on success and an appropriate error value on failure. - */ -int apr_tal_init(void) -{ - int i, j, k; - int ret; - - memset(apr_svc_ch, 0, sizeof(struct apr_svc_ch_dev)); - for (i = 0; i < APR_DL_MAX; i++) { - for (j = 0; j < APR_DEST_MAX; j++) { - for (k = 0; k < APR_CLIENT_MAX; k++) { - init_waitqueue_head(&apr_svc_ch[i][j][k].wait); - spin_lock_init(&apr_svc_ch[i][j][k].w_lock); - spin_lock_init(&apr_svc_ch[i][j][k].r_lock); - mutex_init(&apr_svc_ch[i][j][k].m_lock); - } - } - } - ret = register_rpmsg_driver(&apr_tal_rpmsg_driver); - return ret; -} -EXPORT_SYMBOL(apr_tal_init); - -/** - * apr_tal_exit() - De-register rpmsg driver with rpmsg framework. - */ -void apr_tal_exit(void) -{ - unregister_rpmsg_driver(&apr_tal_rpmsg_driver); -} -EXPORT_SYMBOL(apr_tal_exit); - diff --git a/techpack/audio/4.0/ipc/apr_v2.c b/techpack/audio/4.0/ipc/apr_v2.c deleted file mode 100644 index d748a5e1f126..000000000000 --- a/techpack/audio/4.0/ipc/apr_v2.c +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -/** - * apr_get_subsys_state - get Q6 subsys status - * - * Returns apr_subsys_state - */ -enum apr_subsys_state apr_get_subsys_state(void) -{ - return apr_get_q6_state(); -} -EXPORT_SYMBOL(apr_get_subsys_state); - -void apr_set_subsys_state(void) -{ - apr_set_q6_state(APR_SUBSYS_DOWN); - apr_set_modem_state(APR_SUBSYS_UP); -} - -uint16_t apr_get_data_src(struct apr_hdr *hdr) -{ - if (hdr->src_domain == APR_DOMAIN_MODEM) - return APR_DEST_MODEM; - else if (hdr->src_domain == APR_DOMAIN_ADSP) - return APR_DEST_QDSP6; - - pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain); - return APR_DEST_MAX; /*RETURN INVALID VALUE*/ -} - -int apr_get_dest_id(char *dest) -{ - if (!strcmp(dest, "ADSP")) - return APR_DEST_QDSP6; - else - return APR_DEST_MODEM; -} - -void subsys_notif_register(char *client_name, int domain, - struct notifier_block *nb) -{ - int ret; - - ret = audio_notifier_register(client_name, domain, nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed for domain %d ret = %d\n", - __func__, domain, ret); -} - -void subsys_notif_deregister(char *client_name) -{ - int ret; - - ret = audio_notifier_deregister(client_name); - if (ret < 0) - pr_err("%s: Audio notifier de-register failed for client %s\n", - __func__, client_name); -} - -uint16_t apr_get_reset_domain(uint16_t proc) -{ - return proc; -} diff --git a/techpack/audio/4.0/ipc/apr_v3.c b/techpack/audio/4.0/ipc/apr_v3.c deleted file mode 100644 index 4160beee4836..000000000000 --- a/techpack/audio/4.0/ipc/apr_v3.c +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2013-2016, 2019 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include - -#define DEST_ID APR_DEST_MODEM - -/** - * apr_get_subsys_state - get modem subsys status - * - * Returns apr_subsys_state - */ -enum apr_subsys_state apr_get_subsys_state(void) -{ - return apr_get_modem_state(); -} -EXPORT_SYMBOL(apr_get_subsys_state); - -void apr_set_subsys_state(void) -{ - apr_set_modem_state(APR_SUBSYS_DOWN); -} - -uint16_t apr_get_data_src(struct apr_hdr *hdr) -{ - return DEST_ID; -} - -int apr_get_dest_id(char *dest) -{ - return DEST_ID; -} - -void subsys_notif_register(char *client_name, int domain, - struct notifier_block *nb) -{ - int ret; - - if (domain != AUDIO_NOTIFIER_MODEM_DOMAIN) { - pr_debug("%s: Unused domain %d not registering with notifier\n", - __func__, domain); - return; - } - - ret = audio_notifier_register(client_name, domain, nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed for domain %d ret = %d\n", - __func__, domain, ret); -} - -void subsys_notif_deregister(char *client_name) -{ - int ret; - - ret = audio_notifier_deregister(client_name); - if (ret < 0) - pr_err("%s: Audio notifier de-register failed for client %s\n", - __func__, client_name); -} - -uint16_t apr_get_reset_domain(uint16_t proc) -{ - return APR_DEST_QDSP6; -} diff --git a/techpack/audio/4.0/ipc/apr_vm.c b/techpack/audio/4.0/ipc/apr_vm.c deleted file mode 100644 index 1b66013b8cf4..000000000000 --- a/techpack/audio/4.0/ipc/apr_vm.c +++ /dev/null @@ -1,1479 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2010-2014, 2016-2020 The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define APR_PKT_IPC_LOG_PAGE_CNT 2 -#define APR_VM_CB_THREAD_NAME "apr_vm_cb_thread" -#define APR_TX_BUF_SIZE 4096 -#define APR_RX_BUF_SIZE 4096 - -static struct apr_q6 q6; -static struct apr_client client[APR_DEST_MAX][APR_CLIENT_MAX]; -static void *apr_pkt_ctx; -static wait_queue_head_t modem_wait; -static bool is_modem_up; -static char *subsys_name = NULL; -/* Subsystem restart: QDSP6 data, functions */ -static struct workqueue_struct *apr_reset_workqueue; -static void apr_reset_deregister(struct work_struct *work); -static void dispatch_event(unsigned long code, uint16_t proc); -struct apr_reset_work { - void *handle; - struct work_struct work; -}; - -struct apr_chld_device { - struct platform_device *pdev; - struct list_head node; -}; - -struct apr_private { - struct device *dev; - spinlock_t apr_lock; - bool is_initial_boot; - struct work_struct add_chld_dev_work; -}; - -static struct apr_private *apr_priv; -static bool apr_cf_debug; - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_apr_debug; -static ssize_t apr_debug_write(struct file *filp, const char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - char cmd; - - if (copy_from_user(&cmd, ubuf, 1)) - return -EFAULT; - - apr_cf_debug = (cmd == '1') ? true : false; - - return cnt; -} - -static const struct file_operations apr_debug_ops = { - .write = apr_debug_write, -}; -#endif - -#define APR_PKT_INFO(x...) \ -do { \ - if (apr_pkt_ctx) \ - ipc_log_string(apr_pkt_ctx, ": "x); \ -} while (0) - -/* hab handle */ -static uint32_t hab_handle_tx; -static uint32_t hab_handle_rx; -static char apr_tx_buf[APR_TX_BUF_SIZE]; -static char apr_rx_buf[APR_RX_BUF_SIZE]; -static spinlock_t hab_tx_lock; - -/* apr callback thread task */ -static struct task_struct *apr_vm_cb_thread_task; -static int pid; - - -struct apr_svc_table { - char name[64]; - int idx; - int id; - int dest_svc; - int client_id; - int handle; -}; - -/* - * src svc should be assigned dynamically through apr registration: - * 1. replace with a proper string name for registration. - * e.g. "qcom.apps.lnx." + name - * 2. register apr BE, retrieve dynamic src svc address, - * apr handle and store in svc tbl. - */ - -static struct mutex m_lock_tbl_qdsp6; - -static struct apr_svc_table svc_tbl_qdsp6[] = { - { - .name = "AFE", - .idx = 0, - .id = 0, - .dest_svc = APR_SVC_AFE, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "ASM", - .idx = 1, - .id = 0, - .dest_svc = APR_SVC_ASM, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "ADM", - .idx = 2, - .id = 0, - .dest_svc = APR_SVC_ADM, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "CORE", - .idx = 3, - .id = 0, - .dest_svc = APR_SVC_ADSP_CORE, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "TEST", - .idx = 4, - .id = 0, - .dest_svc = APR_SVC_TEST_CLIENT, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "MVM", - .idx = 5, - .id = 0, - .dest_svc = APR_SVC_ADSP_MVM, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "CVS", - .idx = 6, - .id = 0, - .dest_svc = APR_SVC_ADSP_CVS, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "CVP", - .idx = 7, - .id = 0, - .dest_svc = APR_SVC_ADSP_CVP, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "USM", - .idx = 8, - .id = 0, - .dest_svc = APR_SVC_USM, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, - { - .name = "VIDC", - .idx = 9, - .id = 0, - .dest_svc = APR_SVC_VIDC, - .handle = 0, - }, - { - .name = "LSM", - .idx = 10, - .id = 0, - .dest_svc = APR_SVC_LSM, - .client_id = APR_CLIENT_AUDIO, - .handle = 0, - }, -}; - -static struct mutex m_lock_tbl_voice; - -static struct apr_svc_table svc_tbl_voice[] = { - { - .name = "VSM", - .idx = 0, - .id = 0, - .dest_svc = APR_SVC_VSM, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, - { - .name = "VPM", - .idx = 1, - .id = 0, - .dest_svc = APR_SVC_VPM, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, - { - .name = "MVS", - .idx = 2, - .id = 0, - .dest_svc = APR_SVC_MVS, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, - { - .name = "MVM", - .idx = 3, - .id = 0, - .dest_svc = APR_SVC_MVM, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, - { - .name = "CVS", - .idx = 4, - .id = 0, - .dest_svc = APR_SVC_CVS, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, - { - .name = "CVP", - .idx = 5, - .id = 0, - .dest_svc = APR_SVC_CVP, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, - { - .name = "SRD", - .idx = 6, - .id = 0, - .dest_svc = APR_SVC_SRD, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, - { - .name = "TEST", - .idx = 7, - .id = 0, - .dest_svc = APR_SVC_TEST_CLIENT, - .client_id = APR_CLIENT_VOICE, - .handle = 0, - }, -}; - -/** - * apr_get_modem_state: - * - * Returns current modem load status - * - */ -enum apr_subsys_state apr_get_modem_state(void) -{ - return atomic_read(&q6.modem_state); -} -EXPORT_SYMBOL(apr_get_modem_state); - -/** - * apr_set_modem_state - Update modem load status. - * - * @state: State to update modem load status - * - */ -void apr_set_modem_state(enum apr_subsys_state state) -{ - atomic_set(&q6.modem_state, state); -} -EXPORT_SYMBOL(apr_set_modem_state); - -enum apr_subsys_state apr_cmpxchg_modem_state(enum apr_subsys_state prev, - enum apr_subsys_state new) -{ - return atomic_cmpxchg(&q6.modem_state, prev, new); -} - -static void apr_modem_down(unsigned long opcode) -{ - apr_set_modem_state(APR_SUBSYS_DOWN); - dispatch_event(opcode, APR_DEST_MODEM); -} - -static void apr_modem_up(void) -{ - if (apr_cmpxchg_modem_state(APR_SUBSYS_DOWN, APR_SUBSYS_UP) == - APR_SUBSYS_DOWN) - wake_up(&modem_wait); - is_modem_up = 1; -} - -enum apr_subsys_state apr_get_q6_state(void) -{ - return atomic_read(&q6.q6_state); -} -EXPORT_SYMBOL(apr_get_q6_state); - -int apr_set_q6_state(enum apr_subsys_state state) -{ - pr_debug("%s: setting adsp state %d\n", __func__, state); - if (state < APR_SUBSYS_DOWN || state > APR_SUBSYS_LOADED) - return -EINVAL; - atomic_set(&q6.q6_state, state); - return 0; -} -EXPORT_SYMBOL(apr_set_q6_state); - -static void apr_ssr_disable(struct device *dev, void *data) -{ - apr_set_q6_state(APR_SUBSYS_DOWN); -} - -static const struct snd_event_ops apr_ssr_ops = { - .disable = apr_ssr_disable, -}; - -static void apr_adsp_down(unsigned long opcode) -{ - pr_info("%s: Q6 is Down\n", __func__); - snd_event_notify(apr_priv->dev, SND_EVENT_DOWN); - apr_set_q6_state(APR_SUBSYS_DOWN); - dispatch_event(opcode, APR_DEST_QDSP6); -} - -static void apr_add_child_devices(struct work_struct *work) -{ - int ret; - - ret = of_platform_populate(apr_priv->dev->of_node, - NULL, NULL, apr_priv->dev); - if (ret) - dev_err(apr_priv->dev, "%s: failed to add child nodes, ret=%d\n", - __func__, ret); -} - -static void apr_adsp_up(void) -{ - pr_info("%s: Q6 is Up\n", __func__); - apr_set_q6_state(APR_SUBSYS_LOADED); - - spin_lock(&apr_priv->apr_lock); - if (apr_priv->is_initial_boot) - schedule_work(&apr_priv->add_chld_dev_work); - spin_unlock(&apr_priv->apr_lock); - snd_event_notify(apr_priv->dev, SND_EVENT_UP); -} - -int apr_load_adsp_image(void) -{ - int rc = 0; - - mutex_lock(&q6.lock); - if (apr_get_q6_state() == APR_SUBSYS_UP) { - q6.pil = subsystem_get("adsp"); - if (IS_ERR(q6.pil)) { - rc = PTR_ERR(q6.pil); - pr_err("APR: Unable to load q6 image, error:%d\n", rc); - } else { - apr_set_q6_state(APR_SUBSYS_LOADED); - pr_debug("APR: Image is loaded, stated\n"); - } - } else if (apr_get_q6_state() == APR_SUBSYS_LOADED) { - pr_debug("APR: q6 image already loaded\n"); - } else { - pr_debug("APR: cannot load state %d\n", apr_get_q6_state()); - } - mutex_unlock(&q6.lock); - return rc; -} - -struct apr_client *apr_get_client(int dest_id, int client_id) -{ - return &client[dest_id][client_id]; -} - -static int apr_vm_nb_receive(int32_t handle, void *dest_buff, - uint32_t *size_bytes, uint32_t timeout) -{ - int rc; - uint32_t dest_buff_bytes = *size_bytes; - unsigned long delay = jiffies + (HZ / 2); - - do { - *size_bytes = dest_buff_bytes; - rc = habmm_socket_recv(handle, - dest_buff, - size_bytes, - timeout, - HABMM_SOCKET_RECV_FLAGS_NON_BLOCKING); - } while (time_before(jiffies, delay) && (rc == -EAGAIN) && - (*size_bytes == 0)); - - return rc; -} - -static int apr_vm_cb_process_evt(char *buf, int len) -{ - struct apr_client_data data = {0,}; - struct apr_client *apr_client; - struct apr_svc *c_svc; - struct apr_hdr *hdr; - uint16_t hdr_size; - uint16_t msg_type; - uint16_t ver; - uint16_t src; - uint16_t svc; - uint16_t clnt; - int i; - int temp_port = 0; - uint32_t *ptr; - uint32_t evt_id; - - pr_debug("APR: len = %d\n", len); - ptr = (uint32_t *)buf; - pr_debug("\n*****************\n"); - for (i = 0; i < len/4; i++) - pr_debug("%x ", ptr[i]); - pr_debug("\n"); - pr_debug("\n*****************\n"); - - if (!buf || len <= APR_HDR_SIZE + sizeof(uint32_t)) { - pr_err("APR: Improper apr pkt received: %p %d\n", buf, len); - return -EINVAL; - } - - evt_id = *((int32_t *)buf); - if (evt_id != APRV2_VM_EVT_RX_PKT_AVAILABLE) { - pr_err("APR: Wrong evt id: %d\n", evt_id); - return -EINVAL; - } - hdr = (struct apr_hdr *)(buf + sizeof(uint32_t)); - - ver = hdr->hdr_field; - ver = (ver & 0x000F); - if (ver > APR_PKT_VER + 1) { - pr_err("APR: Wrong version: %d\n", ver); - return -EINVAL; - } - - hdr_size = hdr->hdr_field; - hdr_size = ((hdr_size & 0x00F0) >> 0x4) * 4; - if (hdr_size < APR_HDR_SIZE) { - pr_err("APR: Wrong hdr size:%d\n", hdr_size); - return -EINVAL; - } - - if (hdr->pkt_size < APR_HDR_SIZE) { - pr_err("APR: Wrong paket size\n"); - return -EINVAL; - } - - msg_type = hdr->hdr_field; - msg_type = (msg_type >> 0x08) & 0x0003; - if (msg_type >= APR_MSG_TYPE_MAX && msg_type != APR_BASIC_RSP_RESULT) { - pr_err("APR: Wrong message type: %d\n", msg_type); - return -EINVAL; - } - - /* - * dest_svc is dynamic created by apr service - * no need to check the range of dest_svc - */ - if (hdr->src_domain >= APR_DOMAIN_MAX || - hdr->dest_domain >= APR_DOMAIN_MAX || - hdr->src_svc >= APR_SVC_MAX) { - pr_err("APR: Wrong APR header\n"); - return -EINVAL; - } - - svc = hdr->dest_svc; - if (hdr->src_domain == APR_DOMAIN_MODEM) - clnt = APR_CLIENT_VOICE; - else if (hdr->src_domain == APR_DOMAIN_ADSP) - clnt = APR_CLIENT_AUDIO; - else { - pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain); - return -EINVAL; - } - - src = apr_get_data_src(hdr); - if (src == APR_DEST_MAX) - return -EINVAL; - - pr_debug("src =%d clnt = %d\n", src, clnt); - apr_client = &client[src][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) - if (apr_client->svc[i].id == svc) { - pr_debug("svc_id = %d\n", apr_client->svc[i].id); - c_svc = &apr_client->svc[i]; - break; - } - - if (i == APR_SVC_MAX) { - pr_err("APR: service is not registered\n"); - return -ENXIO; - } - - pr_debug("svc_idx = %d\n", i); - pr_debug("%x %x %x %p %p\n", c_svc->id, c_svc->dest_id, - c_svc->client_id, c_svc->fn, c_svc->priv); - - data.payload_size = hdr->pkt_size - hdr_size; - data.opcode = hdr->opcode; - data.src = src; - data.src_port = hdr->src_port; - data.dest_port = hdr->dest_port; - data.token = hdr->token; - data.msg_type = msg_type; - if (data.payload_size > 0) - data.payload = (char *)hdr + hdr_size; - - if (unlikely(apr_cf_debug)) { - if (hdr->opcode == APR_BASIC_RSP_RESULT && data.payload) { - uint32_t *ptr = data.payload; - - APR_PKT_INFO( - "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X] rc[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, - hdr->opcode, hdr->token, ptr[1]); - } else { - APR_PKT_INFO( - "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode, - hdr->token); - } - } - - temp_port = ((data.dest_port >> 8) * 8) + (data.dest_port & 0xFF); - pr_debug("port = %d t_port = %d\n", data.src_port, temp_port); - if (((temp_port >= 0) && (temp_port < APR_MAX_PORTS)) - && (c_svc->port_cnt && c_svc->port_fn[temp_port])) - c_svc->port_fn[temp_port](&data, c_svc->port_priv[temp_port]); - else if (c_svc->fn) - c_svc->fn(&data, c_svc->priv); - else - pr_err("APR: Rxed a packet for NULL callback\n"); - - return 0; -} - -static int apr_vm_cb_thread(void *data) -{ - uint32_t apr_rx_buf_len; - struct aprv2_vm_ack_rx_pkt_available_t apr_ack; - unsigned long delay = jiffies + (HZ / 2); - int status = 0; - int ret = 0; - - while (1) { - do { - apr_rx_buf_len = sizeof(apr_rx_buf); - ret = habmm_socket_recv(hab_handle_rx, - (void *)&apr_rx_buf, - &apr_rx_buf_len, - 0xFFFFFFFF, - 0); - } while (time_before(jiffies, delay) && (ret == -EINTR) && - (apr_rx_buf_len == 0)); - if (ret) { - pr_err("%s: habmm_socket_recv failed %d\n", - __func__, ret); - break; - } - - status = apr_vm_cb_process_evt(apr_rx_buf, apr_rx_buf_len); - - apr_ack.status = status; - ret = habmm_socket_send(hab_handle_rx, - (void *)&apr_ack, - sizeof(apr_ack), - 0); - if (ret) { - pr_err("%s: habmm_socket_send failed %d\n", - __func__, ret); - /* TODO: break if send failed ? */ - break; - } - } - - return ret; -} - -static int apr_vm_get_svc(const char *svc_name, int domain_id, int *client_id, - int *svc_idx, int *svc_id, int *dest_svc, int *handle) -{ - int i; - int size; - struct apr_svc_table *tbl; - struct mutex *lock; - struct aprv2_vm_cmd_register_rsp_t apr_rsp; - uint32_t apr_len; - int ret = 0; - struct { - uint32_t cmd_id; - struct aprv2_vm_cmd_register_t reg_cmd; - } tx_data; - - if (domain_id == APR_DOMAIN_ADSP) { - tbl = svc_tbl_qdsp6; - size = ARRAY_SIZE(svc_tbl_qdsp6); - lock = &m_lock_tbl_qdsp6; - } else { - tbl = svc_tbl_voice; - size = ARRAY_SIZE(svc_tbl_voice); - lock = &m_lock_tbl_voice; - } - - mutex_lock(lock); - for (i = 0; i < size; i++) { - if (!strcmp(svc_name, tbl[i].name)) { - *client_id = tbl[i].client_id; - *svc_idx = tbl[i].idx; - if (!tbl[i].id && !tbl[i].handle) { - /* need to register a new service */ - memset((void *) &tx_data, 0, sizeof(tx_data)); - - apr_len = sizeof(tx_data); - tx_data.cmd_id = APRV2_VM_CMDID_REGISTER; - tx_data.reg_cmd.name_size = snprintf( - tx_data.reg_cmd.name, - APRV2_VM_MAX_DNS_SIZE, - "qcom.apps.lnx.%s", - svc_name); - tx_data.reg_cmd.addr = 0; - ret = habmm_socket_send(hab_handle_tx, - (void *) &tx_data, - apr_len, - 0); - if (ret) { - pr_err("%s: habmm_socket_send failed %d\n", - __func__, ret); - mutex_unlock(lock); - return ret; - } - /* wait for response */ - apr_len = sizeof(apr_rsp); - ret = apr_vm_nb_receive(hab_handle_tx, - (void *)&apr_rsp, - &apr_len, - 0xFFFFFFFF); - if (ret) { - pr_err("%s: apr_vm_nb_receive failed %d\n", - __func__, ret); - mutex_unlock(lock); - return ret; - } - if (apr_rsp.status) { - pr_err("%s: apr_vm_nb_receive status %d\n", - __func__, apr_rsp.status); - ret = apr_rsp.status; - mutex_unlock(lock); - return ret; - } - /* update svc table */ - tbl[i].handle = apr_rsp.handle; - tbl[i].id = apr_rsp.addr & - APRV2_VM_PKT_SERVICE_ID_MASK; - } - *svc_id = tbl[i].id; - *dest_svc = tbl[i].dest_svc; - *handle = tbl[i].handle; - break; - } - } - mutex_unlock(lock); - - pr_debug("%s: svc_name = %s client_id = %d domain_id = %d\n", - __func__, svc_name, *client_id, domain_id); - pr_debug("%s: src_svc = %d dest_svc = %d handle = %d\n", - __func__, *svc_id, *dest_svc, *handle); - - if (i == size) { - pr_err("%s: APR: Wrong svc name %s\n", __func__, svc_name); - ret = -EINVAL; - } - - return ret; -} - -static int apr_vm_rel_svc(int domain_id, int svc_id, int handle) -{ - int i; - int size; - struct apr_svc_table *tbl; - struct mutex *lock; - struct aprv2_vm_cmd_deregister_rsp_t apr_rsp; - uint32_t apr_len; - int ret = 0; - struct { - uint32_t cmd_id; - struct aprv2_vm_cmd_deregister_t dereg_cmd; - } tx_data; - - if (domain_id == APR_DOMAIN_ADSP) { - tbl = svc_tbl_qdsp6; - size = ARRAY_SIZE(svc_tbl_qdsp6); - lock = &m_lock_tbl_qdsp6; - } else { - tbl = svc_tbl_voice; - size = ARRAY_SIZE(svc_tbl_voice); - lock = &m_lock_tbl_voice; - } - - mutex_lock(lock); - for (i = 0; i < size; i++) { - if (tbl[i].id == svc_id && tbl[i].handle == handle) { - /* need to deregister a service */ - memset((void *) &tx_data, 0, sizeof(tx_data)); - - apr_len = sizeof(tx_data); - tx_data.cmd_id = APRV2_VM_CMDID_DEREGISTER; - tx_data.dereg_cmd.handle = handle; - ret = habmm_socket_send(hab_handle_tx, - (void *) &tx_data, - apr_len, - 0); - if (ret) - pr_err("%s: habmm_socket_send failed %d\n", - __func__, ret); - /* - * TODO: if send failed, should not wait for recv. - * should clear regardless? - */ - /* wait for response */ - apr_len = sizeof(apr_rsp); - ret = apr_vm_nb_receive(hab_handle_tx, - (void *)&apr_rsp, - &apr_len, - 0xFFFFFFFF); - if (ret) - pr_err("%s: apr_vm_nb_receive failed %d\n", - __func__, ret); - if (apr_rsp.status) { - pr_err("%s: apr_vm_nb_receive status %d\n", - __func__, apr_rsp.status); - ret = apr_rsp.status; - } - /* clear svc table */ - tbl[i].handle = 0; - tbl[i].id = 0; - break; - } - } - mutex_unlock(lock); - - if (i == size) { - pr_err("%s: APR: Wrong svc id %d handle %d\n", - __func__, svc_id, handle); - ret = -EINVAL; - } - - return ret; -} - -static void apr_vm_set_subsys_state(void) -{ - /* set default subsys state in vm env. - * Both q6 and modem should be in LOADED state, - * since vm boots up at late stage after pm. - */ - apr_set_q6_state(APR_SUBSYS_LOADED); - apr_set_modem_state(APR_SUBSYS_LOADED); - - spin_lock(&apr_priv->apr_lock); - if (apr_priv->is_initial_boot) - schedule_work(&apr_priv->add_chld_dev_work); - spin_unlock(&apr_priv->apr_lock); - snd_event_notify(apr_priv->dev, SND_EVENT_UP); -} - -/** - * apr_send_pkt - Clients call to send packet - * to destination processor. - * - * @handle: APR service handle - * @buf: payload to send to destination processor. - * - * Returns Bytes(>0)pkt_size on success or error on failure. - */ -int apr_send_pkt(void *handle, uint32_t *buf) -{ - struct apr_svc *svc = handle; - struct apr_hdr *hdr; - unsigned long flags; - uint32_t *cmd_id = (uint32_t *)apr_tx_buf; - struct aprv2_vm_cmd_async_send_t *apr_send = - (struct aprv2_vm_cmd_async_send_t *)(apr_tx_buf + - sizeof(uint32_t)); - uint32_t apr_send_len; - struct aprv2_vm_cmd_async_send_rsp_t apr_rsp; - uint32_t apr_rsp_len; - int ret = 0; - - if (!handle || !buf) { - pr_err("APR: Wrong parameters\n"); - return -EINVAL; - } - if (svc->need_reset) { - pr_err("apr: send_pkt service need reset\n"); - return -ENETRESET; - } - - if ((svc->dest_id == APR_DEST_QDSP6) && - (apr_get_q6_state() != APR_SUBSYS_LOADED)) { - pr_err("%s: Still dsp is not Up\n", __func__); - return -ENETRESET; - } else if ((svc->dest_id == APR_DEST_MODEM) && - (apr_get_modem_state() == APR_SUBSYS_DOWN)) { - pr_err("apr: Still Modem is not Up\n"); - return -ENETRESET; - } - - spin_lock_irqsave(&svc->w_lock, flags); - if (!svc->id || !svc->vm_handle) { - pr_err("APR: Still service is not yet opened\n"); - ret = -EINVAL; - goto done; - } - hdr = (struct apr_hdr *)buf; - - hdr->src_domain = APR_DOMAIN_APPS; - hdr->src_svc = svc->id; - hdr->dest_domain = svc->dest_domain; - hdr->dest_svc = svc->vm_dest_svc; - - if (unlikely(apr_cf_debug)) { - APR_PKT_INFO( - "Tx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode, - hdr->token); - } - - memset((void *)&apr_tx_buf, 0, sizeof(apr_tx_buf)); - /* pkt_size + cmd_id + handle */ - apr_send_len = hdr->pkt_size + sizeof(uint32_t) * 2; - *cmd_id = APRV2_VM_CMDID_ASYNC_SEND; - apr_send->handle = svc->vm_handle; - - /* safe check */ - if (hdr->pkt_size > APR_TX_BUF_SIZE - (sizeof(uint32_t) * 2)) { - pr_err("APR: Wrong pkt size %d\n", hdr->pkt_size); - ret = -ENOMEM; - goto done; - } - memcpy(&apr_send->pkt_header, buf, hdr->pkt_size); - - ret = habmm_socket_send(hab_handle_tx, - (void *)&apr_tx_buf, - apr_send_len, - 0); - if (ret) { - pr_err("%s: habmm_socket_send failed %d\n", - __func__, ret); - goto done; - } - /* wait for response */ - apr_rsp_len = sizeof(apr_rsp); - ret = apr_vm_nb_receive(hab_handle_tx, - (void *)&apr_rsp, - &apr_rsp_len, - 0xFFFFFFFF); - if (ret) { - pr_err("%s: apr_vm_nb_receive failed %d\n", - __func__, ret); - goto done; - } - if (apr_rsp.status) { - pr_err("%s: apr_vm_nb_receive status %d\n", - __func__, apr_rsp.status); - /* should translate status properly */ - ret = -ECOMM; - goto done; - } - - /* upon successful send, return packet size */ - ret = hdr->pkt_size; - -done: - spin_unlock_irqrestore(&svc->w_lock, flags); - return ret; -} -EXPORT_SYMBOL(apr_send_pkt); - -/** - * apr_register - Clients call to register - * to APR. - * - * @dest: destination processor - * @svc_name: name of service to register as - * @svc_fn: callback function to trigger when response - * ack or packets received from destination processor. - * @src_port: Port number within a service - * @priv: private data of client, passed back in cb fn. - * - * Returns apr_svc handle on success or NULL on failure. - */ -struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn, - uint32_t src_port, void *priv) -{ - struct apr_client *clnt; - int client_id = 0; - int svc_idx = 0; - int svc_id = 0; - int dest_id = 0; - int domain_id = 0; - int temp_port = 0; - struct apr_svc *svc = NULL; - int rc = 0; - bool can_open_channel = true; - int dest_svc = 0; - int handle = 0; - - if (!dest || !svc_name || !svc_fn) - return NULL; - - if (!strcmp(dest, "ADSP")) - domain_id = APR_DOMAIN_ADSP; - else if (!strcmp(dest, "MODEM")) { - /* Don't request for SMD channels if destination is MODEM, - * as these channels are no longer used and these clients - * are to listen only for MODEM SSR events - */ - can_open_channel = false; - domain_id = APR_DOMAIN_MODEM; - } else { - pr_err("APR: wrong destination\n"); - goto done; - } - - dest_id = apr_get_dest_id(dest); - - if (dest_id == APR_DEST_QDSP6) { - if (apr_get_q6_state() != APR_SUBSYS_LOADED) { - pr_err("%s: adsp not up\n", __func__); - return NULL; - } - pr_debug("%s: adsp Up\n", __func__); - } else if (dest_id == APR_DEST_MODEM) { - if (apr_get_modem_state() == APR_SUBSYS_DOWN) { - if (is_modem_up) { - pr_err("%s: modem shutdown due to SSR, ret", - __func__); - return NULL; - } - pr_debug("%s: Wait for modem to bootup\n", __func__); - rc = wait_event_interruptible_timeout(modem_wait, - (apr_get_modem_state() == APR_SUBSYS_UP), - (1 * HZ)); - if (rc == 0) { - pr_err("%s: Modem is not Up\n", __func__); - return NULL; - } - } - pr_debug("%s: modem Up\n", __func__); - } - - if (apr_vm_get_svc(svc_name, domain_id, &client_id, &svc_idx, &svc_id, - &dest_svc, &handle)) { - pr_err("%s: apr_vm_get_svc failed\n", __func__); - goto done; - } - - clnt = &client[dest_id][client_id]; - svc = &clnt->svc[svc_idx]; - mutex_lock(&svc->m_lock); - clnt->id = client_id; - if (svc->need_reset) { - mutex_unlock(&svc->m_lock); - pr_err("APR: Service needs reset\n"); - svc = NULL; - goto done; - } - svc->id = svc_id; - svc->vm_dest_svc = dest_svc; - svc->dest_id = dest_id; - svc->client_id = client_id; - svc->dest_domain = domain_id; - svc->pkt_owner = APR_PKT_OWNER_DRIVER; - svc->vm_handle = handle; - - if (src_port != 0xFFFFFFFF) { - temp_port = ((src_port >> 8) * 8) + (src_port & 0xFF); - pr_debug("port = %d t_port = %d\n", src_port, temp_port); - if (temp_port >= APR_MAX_PORTS || temp_port < 0) { - pr_err("APR: temp_port out of bounds\n"); - mutex_unlock(&svc->m_lock); - return NULL; - } - if (!svc->port_cnt && !svc->svc_cnt) - clnt->svc_cnt++; - svc->port_cnt++; - svc->port_fn[temp_port] = svc_fn; - svc->port_priv[temp_port] = priv; - } else { - if (!svc->fn) { - if (!svc->port_cnt && !svc->svc_cnt) - clnt->svc_cnt++; - svc->fn = svc_fn; - if (svc->port_cnt) - svc->svc_cnt++; - svc->priv = priv; - } - } - - mutex_unlock(&svc->m_lock); -done: - return svc; -} -EXPORT_SYMBOL(apr_register); - -static void apr_reset_deregister(struct work_struct *work) -{ - struct apr_svc *handle = NULL; - struct apr_reset_work *apr_reset = - container_of(work, struct apr_reset_work, work); - - handle = apr_reset->handle; - pr_debug("%s:handle[%pK]\n", __func__, handle); - apr_deregister(handle); - kfree(apr_reset); -} - -/** - * apr_start_rx_rt - Clients call to vote for thread - * priority upgrade whenever needed. - * - * @handle: APR service handle - * - * Returns 0 on success or error otherwise. - */ -int apr_start_rx_rt(void *handle) -{ - int rc = 0; - return rc; -} -EXPORT_SYMBOL(apr_start_rx_rt); - -/** - * apr_end_rx_rt - Clients call to unvote for thread - * priority upgrade (perviously voted with - * apr_start_rx_rt()). - * - * @handle: APR service handle - * - * Returns 0 on success or error otherwise. - */ -int apr_end_rx_rt(void *handle) -{ - int rc = 0; - return rc; -} -EXPORT_SYMBOL(apr_end_rx_rt); - - -/** - * apr_deregister - Clients call to de-register - * from APR. - * - * @handle: APR service handle to de-register - * - * Returns 0 on success or -EINVAL on error. - */ -int apr_deregister(void *handle) -{ - struct apr_svc *svc = handle; - struct apr_client *clnt; - uint16_t dest_id; - uint16_t client_id; - - if (!handle) - return -EINVAL; - - mutex_lock(&svc->m_lock); - dest_id = svc->dest_id; - client_id = svc->client_id; - clnt = &client[dest_id][client_id]; - - if (svc->port_cnt > 0 || svc->svc_cnt > 0) { - if (svc->port_cnt) - svc->port_cnt--; - else if (svc->svc_cnt) - svc->svc_cnt--; - if (!svc->port_cnt && !svc->svc_cnt) { - client[dest_id][client_id].svc_cnt--; - svc->need_reset = 0x0; - } - } else if (client[dest_id][client_id].svc_cnt > 0) { - client[dest_id][client_id].svc_cnt--; - if (!client[dest_id][client_id].svc_cnt) { - svc->need_reset = 0x0; - pr_debug("%s: service is reset %p\n", __func__, svc); - } - } - - if (!svc->port_cnt && !svc->svc_cnt) { - if (apr_vm_rel_svc(svc->dest_domain, svc->id, svc->vm_handle)) - pr_err("%s: apr_vm_rel_svc failed\n", __func__); - svc->priv = NULL; - svc->id = 0; - svc->vm_dest_svc = 0; - svc->fn = NULL; - svc->dest_id = 0; - svc->client_id = 0; - svc->need_reset = 0x0; - svc->vm_handle = 0; - } - mutex_unlock(&svc->m_lock); - - return 0; -} -EXPORT_SYMBOL(apr_deregister); - -/** - * apr_reset - sets up workqueue to de-register - * the given APR service handle. - * - * @handle: APR service handle - * - */ -void apr_reset(void *handle) -{ - struct apr_reset_work *apr_reset_worker = NULL; - - if (!handle) - return; - pr_debug("%s: handle[%pK]\n", __func__, handle); - - if (apr_reset_workqueue == NULL) { - pr_err("%s: apr_reset_workqueue is NULL\n", __func__); - return; - } - - apr_reset_worker = kzalloc(sizeof(struct apr_reset_work), - GFP_ATOMIC); - - if (apr_reset_worker == NULL) { - pr_err("%s: mem failure\n", __func__); - return; - } - - apr_reset_worker->handle = handle; - INIT_WORK(&apr_reset_worker->work, apr_reset_deregister); - queue_work(apr_reset_workqueue, &apr_reset_worker->work); -} -EXPORT_SYMBOL(apr_reset); - -/* Dispatch the Reset events to Modem and audio clients */ -static void dispatch_event(unsigned long code, uint16_t proc) -{ - struct apr_client *apr_client; - struct apr_client_data data; - struct apr_svc *svc; - uint16_t clnt; - int i, j; - - memset(&data, 0, sizeof(data)); - data.opcode = RESET_EVENTS; - data.reset_event = code; - - /* Service domain can be different from the processor */ - data.reset_proc = apr_get_reset_domain(proc); - - clnt = APR_CLIENT_AUDIO; - apr_client = &client[proc][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) { - mutex_lock(&apr_client->svc[i].m_lock); - if (apr_client->svc[i].fn) { - apr_client->svc[i].need_reset = 0x1; - apr_client->svc[i].fn(&data, apr_client->svc[i].priv); - } - if (apr_client->svc[i].port_cnt) { - svc = &(apr_client->svc[i]); - svc->need_reset = 0x1; - for (j = 0; j < APR_MAX_PORTS; j++) - if (svc->port_fn[j]) - svc->port_fn[j](&data, - svc->port_priv[j]); - } - mutex_unlock(&apr_client->svc[i].m_lock); - } - - clnt = APR_CLIENT_VOICE; - apr_client = &client[proc][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) { - mutex_lock(&apr_client->svc[i].m_lock); - if (apr_client->svc[i].fn) { - apr_client->svc[i].need_reset = 0x1; - apr_client->svc[i].fn(&data, apr_client->svc[i].priv); - } - if (apr_client->svc[i].port_cnt) { - svc = &(apr_client->svc[i]); - svc->need_reset = 0x1; - for (j = 0; j < APR_MAX_PORTS; j++) - if (svc->port_fn[j]) - svc->port_fn[j](&data, - svc->port_priv[j]); - } - mutex_unlock(&apr_client->svc[i].m_lock); - } -} - -static int apr_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - struct audio_notifier_cb_data *cb_data = data; - - if (cb_data == NULL) { - pr_err("%s: Callback data is NULL!\n", __func__); - goto done; - } - - pr_debug("%s: Service opcode 0x%lx, domain %d\n", - __func__, opcode, cb_data->domain); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore down notifications during - * initial boot. There is no benefit from error - * recovery notifications during initial boot - * up since everything is expected to be down. - */ - spin_lock(&apr_priv->apr_lock); - if (apr_priv->is_initial_boot) { - spin_unlock(&apr_priv->apr_lock); - break; - } - spin_unlock(&apr_priv->apr_lock); - if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN) - apr_modem_down(opcode); - else - apr_adsp_down(opcode); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN) - apr_modem_up(); - else - apr_adsp_up(); - spin_lock(&apr_priv->apr_lock); - apr_priv->is_initial_boot = false; - spin_unlock(&apr_priv->apr_lock); - break; - default: - break; - } -done: - return NOTIFY_OK; -} - -static struct notifier_block adsp_service_nb = { - .notifier_call = apr_notifier_service_cb, - .priority = 0, -}; - -static struct notifier_block modem_service_nb = { - .notifier_call = apr_notifier_service_cb, - .priority = 0, -}; - -#ifdef CONFIG_DEBUG_FS -static int __init apr_debug_init(void) -{ - debugfs_apr_debug = debugfs_create_file("msm_apr_debug", - S_IFREG | 0444, NULL, NULL, - &apr_debug_ops); - return 0; -} -#else -static int __init apr_debug_init(void) -{ - return 0; -} -#endif - -static void apr_cleanup(void) -{ - int i, j, k; - - of_platform_depopulate(apr_priv->dev); - subsys_notif_deregister(subsys_name); - if (apr_reset_workqueue) { - flush_workqueue(apr_reset_workqueue); - destroy_workqueue(apr_reset_workqueue); - } - mutex_destroy(&q6.lock); - for (i = 0; i < APR_DEST_MAX; i++) { - for (j = 0; j < APR_CLIENT_MAX; j++) { - mutex_destroy(&client[i][j].m_lock); - for (k = 0; k < APR_SVC_MAX; k++) - mutex_destroy(&client[i][j].svc[k].m_lock); - } - } -#ifdef CONFIG_DEBUG_FS - debugfs_remove(debugfs_apr_debug); -#endif -} - -static int apr_probe(struct platform_device *pdev) -{ - int i, j, k, ret = 0; - - init_waitqueue_head(&modem_wait); - - apr_priv = devm_kzalloc(&pdev->dev, sizeof(*apr_priv), GFP_KERNEL); - if (!apr_priv) - return -ENOMEM; - - apr_priv->dev = &pdev->dev; - spin_lock_init(&apr_priv->apr_lock); - INIT_WORK(&apr_priv->add_chld_dev_work, apr_add_child_devices); - - /* open apr channel tx and rx, store as global */ - ret = habmm_socket_open(&hab_handle_tx, - MM_AUD_1, - 0xFFFFFFFF, - HABMM_SOCKET_OPEN_FLAGS_SINGLE_BE_SINGLE_FE); - if (ret) { - pr_err("%s: habmm_socket_open tx failed %d\n", __func__, ret); - return ret; - } - spin_lock_init(&hab_tx_lock); - - ret = habmm_socket_open(&hab_handle_rx, - MM_AUD_2, - 0xFFFFFFFF, - HABMM_SOCKET_OPEN_FLAGS_SINGLE_BE_SINGLE_FE); - if (ret) { - pr_err("%s: habmm_socket_open rx failed %d\n", __func__, ret); - habmm_socket_close(hab_handle_tx); - return ret; - } - pr_info("%s: hab_handle_tx %x hab_handle_rx %x\n", - __func__, hab_handle_tx, hab_handle_rx); - - /* create apr ch rx cb thread */ - apr_vm_cb_thread_task = kthread_run(apr_vm_cb_thread, - NULL, - APR_VM_CB_THREAD_NAME); - if (IS_ERR(apr_vm_cb_thread_task)) { - ret = PTR_ERR(apr_vm_cb_thread_task); - pr_err("%s: kthread_run failed %d\n", __func__, ret); - habmm_socket_close(hab_handle_tx); - habmm_socket_close(hab_handle_rx); - return ret; - } - pid = apr_vm_cb_thread_task->pid; - pr_info("%s: apr_vm_cb_thread started pid %d\n", - __func__, pid); - - for (i = 0; i < APR_DEST_MAX; i++) - for (j = 0; j < APR_CLIENT_MAX; j++) { - mutex_init(&client[i][j].m_lock); - for (k = 0; k < APR_SVC_MAX; k++) { - mutex_init(&client[i][j].svc[k].m_lock); - spin_lock_init(&client[i][j].svc[k].w_lock); - } - } - spin_lock(&apr_priv->apr_lock); - apr_priv->is_initial_boot = true; - spin_unlock(&apr_priv->apr_lock); - apr_vm_set_subsys_state(); - mutex_init(&q6.lock); - apr_reset_workqueue = create_singlethread_workqueue("apr_driver"); - if (!apr_reset_workqueue) { - habmm_socket_close(hab_handle_tx); - habmm_socket_close(hab_handle_rx); - kthread_stop(apr_vm_cb_thread_task); - apr_priv = NULL; - return -ENOMEM; - } - - apr_pkt_ctx = ipc_log_context_create(APR_PKT_IPC_LOG_PAGE_CNT, - "apr", 0); - if (!apr_pkt_ctx) - pr_err("%s: Unable to create ipc log context\n", __func__); - - ret = of_property_read_string(pdev->dev.of_node, - "qcom,subsys-name", - (const char **)(&subsys_name)); - if (ret) { - pr_err("%s: missing subsys-name entry in dt node\n", __func__); - return -EINVAL; - } - - if (!strcmp(subsys_name, "apr_adsp")) { - subsys_notif_register("apr_adsp", - AUDIO_NOTIFIER_ADSP_DOMAIN, - &adsp_service_nb); - } else if (!strcmp(subsys_name, "apr_modem")) { - subsys_notif_register("apr_modem", - AUDIO_NOTIFIER_MODEM_DOMAIN, - &modem_service_nb); - } else { - pr_err("%s: invalid subsys-name %s\n", __func__, subsys_name); - return -EINVAL; - } - - ret = snd_event_client_register(&pdev->dev, &apr_ssr_ops, NULL); - if (ret) { - pr_err("%s: Registration with SND event fwk failed ret = %d\n", - __func__, ret); - ret = 0; - } - - return apr_debug_init(); -} - -static int apr_remove(struct platform_device *pdev) -{ - habmm_socket_close(hab_handle_tx); - habmm_socket_close(hab_handle_rx); - kthread_stop(apr_vm_cb_thread_task); - snd_event_client_deregister(&pdev->dev); - apr_cleanup(); - apr_priv = NULL; - return 0; -} - -static const struct of_device_id apr_machine_of_match[] = { - { .compatible = "qcom,msm-audio-apr", }, - {}, -}; - -static struct platform_driver apr_driver = { - .probe = apr_probe, - .remove = apr_remove, - .driver = { - .name = "audio_apr", - .owner = THIS_MODULE, - .of_match_table = apr_machine_of_match, - } -}; - -module_platform_driver(apr_driver); - -MODULE_DESCRIPTION("APR DRIVER"); -MODULE_LICENSE("GPL v2"); -MODULE_DEVICE_TABLE(of, apr_machine_of_match); diff --git a/techpack/audio/4.0/ipc/wcd-dsp-glink.c b/techpack/audio/4.0/ipc/wcd-dsp-glink.c deleted file mode 100644 index a6eb044ff262..000000000000 --- a/techpack/audio/4.0/ipc/wcd-dsp-glink.c +++ /dev/null @@ -1,775 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "sound/wcd-dsp-glink.h" - -#define WDSP_GLINK_DRIVER_NAME "wcd-dsp-glink" -#define WDSP_MAX_WRITE_SIZE (256 * 1024) -#define WDSP_MAX_READ_SIZE (4 * 1024) -#define WDSP_WRITE_PKT_SIZE (sizeof(struct wdsp_write_pkt)) -#define WDSP_CMD_PKT_SIZE (sizeof(struct wdsp_cmd_pkt)) - -#define MINOR_NUMBER_COUNT 1 -#define RESP_QUEUE_SIZE 3 -#define TIMEOUT_MS 2000 - -enum wdsp_ch_state { - WDSP_CH_DISCONNECTED, - WDSP_CH_CONNECTED, -}; - -struct wdsp_glink_dev { - struct class *cls; - struct device *dev; - struct cdev cdev; - dev_t dev_num; -}; - -struct wdsp_rsp_que { - /* Size of valid data in buffer */ - u32 buf_size; - - /* Response buffer */ - u8 buf[WDSP_MAX_READ_SIZE]; -}; - -struct wdsp_ch { - struct wdsp_glink_priv *wpriv; - /* rpmsg handle */ - void *handle; - /* Channel states like connect, disconnect */ - int ch_state; - char ch_name[RPMSG_NAME_SIZE]; - spinlock_t ch_lock; -}; - -struct wdsp_tx_buf { - struct work_struct tx_work; - - /* Glink channel information */ - struct wdsp_ch *ch; - - /* Tx buffer to send to glink */ - u8 buf[0]; -}; - -struct wdsp_glink_priv { - /* Respone buffer related */ - u8 rsp_cnt; - struct wdsp_rsp_que rsp[RESP_QUEUE_SIZE]; - u8 write_idx; - u8 read_idx; - struct completion rsp_complete; - spinlock_t rsp_lock; - - /* Glink channel related */ - int no_of_channels; - struct wdsp_ch **ch; - struct workqueue_struct *work_queue; - /* Wait for all channels state before sending any command */ - wait_queue_head_t ch_state_wait; - - struct wdsp_glink_dev *wdev; - struct device *dev; -}; -static struct wdsp_glink_priv *wpriv; - -static struct wdsp_ch *wdsp_get_ch(char *ch_name) -{ - int i; - - for (i = 0; i < wpriv->no_of_channels; i++) { - if (!strcmp(ch_name, wpriv->ch[i]->ch_name)) - return wpriv->ch[i]; - } - return NULL; -} - -/* - * wdsp_rpmsg_callback - Rpmsg callback for responses - * rpdev: Rpmsg device structure - * data: Pointer to the Rx data - * len: Size of the Rx data - * priv: Private pointer to the channel - * addr: Address variable - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_rpmsg_callback(struct rpmsg_device *rpdev, void *data, - int len, void *priv, u32 addr__unused) -{ - struct wdsp_ch *ch = dev_get_drvdata(&rpdev->dev); - struct wdsp_glink_priv *wpriv; - unsigned long flags; - u8 *rx_buf; - u8 rsp_cnt = 0; - - if (!ch || !data) { - pr_err("%s: Invalid ch or data\n", __func__); - return -EINVAL; - } - - wpriv = ch->wpriv; - rx_buf = (u8 *)data; - if (len > WDSP_MAX_READ_SIZE) { - dev_info_ratelimited(wpriv->dev, "%s: Size %d is greater than allowed %d\n", - __func__, len, WDSP_MAX_READ_SIZE); - len = WDSP_MAX_READ_SIZE; - } - dev_dbg_ratelimited(wpriv->dev, "%s: copy into buffer %d\n", __func__, - wpriv->rsp_cnt); - - if (wpriv->rsp_cnt >= RESP_QUEUE_SIZE) { - dev_info_ratelimited(wpriv->dev, "%s: Resp Queue is Full. Ignore new one.\n", - __func__); - return -EINVAL; - } - spin_lock_irqsave(&wpriv->rsp_lock, flags); - rsp_cnt = wpriv->rsp_cnt; - memcpy(wpriv->rsp[wpriv->write_idx].buf, rx_buf, len); - wpriv->rsp[wpriv->write_idx].buf_size = len; - wpriv->write_idx = (wpriv->write_idx + 1) % RESP_QUEUE_SIZE; - wpriv->rsp_cnt = ++rsp_cnt; - spin_unlock_irqrestore(&wpriv->rsp_lock, flags); - - complete(&wpriv->rsp_complete); - - return 0; -} - -/* - * wdsp_rpmsg_probe - Rpmsg channel probe function - * rpdev: Rpmsg device structure - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_rpmsg_probe(struct rpmsg_device *rpdev) -{ - struct wdsp_ch *ch; - - ch = wdsp_get_ch(rpdev->id.name); - if (!ch) { - dev_err(&rpdev->dev, "%s, Invalid Channel [%s]\n", - __func__, rpdev->id.name); - return -EINVAL; - } - - dev_dbg(&rpdev->dev, "%s: Channel[%s] state[Up]\n", - __func__, rpdev->id.name); - - spin_lock(&ch->ch_lock); - ch->handle = rpdev; - ch->ch_state = WDSP_CH_CONNECTED; - spin_unlock(&ch->ch_lock); - dev_set_drvdata(&rpdev->dev, ch); - wake_up(&wpriv->ch_state_wait); - - return 0; -} - -/* - * wdsp_rpmsg_remove - Rpmsg channel remove function - * rpdev: Rpmsg device structure - */ -static void wdsp_rpmsg_remove(struct rpmsg_device *rpdev) -{ - struct wdsp_ch *ch = dev_get_drvdata(&rpdev->dev); - - if (!ch) { - dev_err(&rpdev->dev, "%s: Invalid ch\n", __func__); - return; - } - - dev_dbg(&rpdev->dev, "%s: Channel[%s] state[Down]\n", - __func__, rpdev->id.name); - spin_lock(&ch->ch_lock); - ch->handle = NULL; - ch->ch_state = WDSP_CH_DISCONNECTED; - spin_unlock(&ch->ch_lock); - dev_set_drvdata(&rpdev->dev, NULL); -} - -static bool wdsp_is_ch_connected(struct wdsp_glink_priv *wpriv) -{ - int i; - - for (i = 0; i < wpriv->no_of_channels; i++) { - spin_lock(&wpriv->ch[i]->ch_lock); - if (wpriv->ch[i]->ch_state != WDSP_CH_CONNECTED) { - spin_unlock(&wpriv->ch[i]->ch_lock); - return false; - } - spin_unlock(&wpriv->ch[i]->ch_lock); - } - return true; -} - -static int wdsp_wait_for_all_ch_connect(struct wdsp_glink_priv *wpriv) -{ - int ret; - - ret = wait_event_timeout(wpriv->ch_state_wait, - wdsp_is_ch_connected(wpriv), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - dev_err_ratelimited(wpriv->dev, "%s: All channels are not connected\n", - __func__); - ret = -ETIMEDOUT; - goto err; - } - ret = 0; - -err: - return ret; -} - -/* - * wdsp_tx_buf_work - Work queue function to send tx buffer to glink - * work: Work structure - */ -static void wdsp_tx_buf_work(struct work_struct *work) -{ - struct wdsp_glink_priv *wpriv; - struct wdsp_ch *ch; - struct wdsp_tx_buf *tx_buf; - struct wdsp_write_pkt *wpkt; - struct wdsp_cmd_pkt *cpkt; - int ret = 0; - struct rpmsg_device *rpdev = NULL; - - tx_buf = container_of(work, struct wdsp_tx_buf, - tx_work); - ch = tx_buf->ch; - wpriv = ch->wpriv; - wpkt = (struct wdsp_write_pkt *)tx_buf->buf; - cpkt = (struct wdsp_cmd_pkt *)wpkt->payload; - - dev_dbg(wpriv->dev, "%s: ch name = %s, payload size = %d\n", - __func__, cpkt->ch_name, cpkt->payload_size); - - spin_lock(&ch->ch_lock); - rpdev = ch->handle; - if (rpdev && ch->ch_state == WDSP_CH_CONNECTED) { - spin_unlock(&ch->ch_lock); - ret = rpmsg_send(rpdev->ept, cpkt->payload, - cpkt->payload_size); - if (ret < 0) - dev_err(wpriv->dev, "%s: rpmsg send failed, ret = %d\n", - __func__, ret); - } else { - spin_unlock(&ch->ch_lock); - if (rpdev) - dev_err(wpriv->dev, "%s: channel %s is not in connected state\n", - __func__, ch->ch_name); - else - dev_err(wpriv->dev, "%s: rpdev is NULL\n", __func__); - } - vfree(tx_buf); -} - -/* - * wdsp_glink_read - Read API to send the data to userspace - * file: Pointer to the file structure - * buf: Pointer to the userspace buffer - * count: Number bytes to read from the file - * ppos: Pointer to the position into the file - * Returns 0 on success and an appropriate error value on failure - */ -static ssize_t wdsp_glink_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - int ret = 0, ret1 = 0; - struct wdsp_rsp_que *read_rsp = NULL; - struct wdsp_glink_priv *wpriv; - unsigned long flags; - - wpriv = (struct wdsp_glink_priv *)file->private_data; - if (!wpriv) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - if (count > WDSP_MAX_READ_SIZE) { - dev_info_ratelimited(wpriv->dev, "%s: count = %zd is more than WDSP_MAX_READ_SIZE\n", - __func__, count); - count = WDSP_MAX_READ_SIZE; - } - /* - * Complete signal has given from gwdsp_rpmsg_callback() - * or from flush API. Also use interruptible wait_for_completion API - * to allow the system to go in suspend. - */ - ret = wait_for_completion_interruptible(&wpriv->rsp_complete); - if (ret < 0) - return ret; - - read_rsp = kzalloc(sizeof(struct wdsp_rsp_que), GFP_KERNEL); - if (!read_rsp) - return -ENOMEM; - - spin_lock_irqsave(&wpriv->rsp_lock, flags); - if (wpriv->rsp_cnt) { - wpriv->rsp_cnt--; - dev_dbg(wpriv->dev, "%s: rsp_cnt=%d read from buffer %d\n", - __func__, wpriv->rsp_cnt, wpriv->read_idx); - - memcpy(read_rsp, &wpriv->rsp[wpriv->read_idx], - sizeof(struct wdsp_rsp_que)); - wpriv->read_idx = (wpriv->read_idx + 1) % RESP_QUEUE_SIZE; - spin_unlock_irqrestore(&wpriv->rsp_lock, flags); - - if (count < read_rsp->buf_size) { - ret1 = copy_to_user(buf, read_rsp->buf, count); - /* Return the number of bytes copied */ - ret = count; - } else { - ret1 = copy_to_user(buf, read_rsp->buf, - read_rsp->buf_size); - /* Return the number of bytes copied */ - ret = read_rsp->buf_size; - } - - if (ret1) { - dev_err_ratelimited(wpriv->dev, "%s: copy_to_user failed %d\n", - __func__, ret); - ret = -EFAULT; - goto done; - } - } else { - /* - * This will execute only if flush API is called or - * something wrong with ref_cnt - */ - dev_dbg(wpriv->dev, "%s: resp count = %d\n", __func__, - wpriv->rsp_cnt); - spin_unlock_irqrestore(&wpriv->rsp_lock, flags); - ret = -EINVAL; - } - -done: - kfree(read_rsp); - return ret; -} - -/* - * wdsp_glink_write - Write API to receive the data from userspace - * file: Pointer to the file structure - * buf: Pointer to the userspace buffer - * count: Number bytes to read from the file - * ppos: Pointer to the position into the file - * Returns 0 on success and an appropriate error value on failure - */ -static ssize_t wdsp_glink_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - int ret = 0, i, tx_buf_size; - struct wdsp_write_pkt *wpkt; - struct wdsp_cmd_pkt *cpkt; - struct wdsp_tx_buf *tx_buf; - struct wdsp_glink_priv *wpriv; - size_t pkt_max_size; - - wpriv = (struct wdsp_glink_priv *)file->private_data; - if (!wpriv) { - pr_err("%s: Invalid private data\n", __func__); - ret = -EINVAL; - goto done; - } - - if ((count < WDSP_WRITE_PKT_SIZE) || - (count > WDSP_MAX_WRITE_SIZE)) { - dev_err_ratelimited(wpriv->dev, "%s: Invalid count = %zd\n", - __func__, count); - ret = -EINVAL; - goto done; - } - - dev_dbg(wpriv->dev, "%s: count = %zd\n", __func__, count); - - tx_buf_size = count + sizeof(struct wdsp_tx_buf); - tx_buf = vzalloc(tx_buf_size); - if (!tx_buf) { - ret = -ENOMEM; - goto done; - } - - ret = copy_from_user(tx_buf->buf, buf, count); - if (ret) { - dev_err_ratelimited(wpriv->dev, "%s: copy_from_user failed %d\n", - __func__, ret); - ret = -EFAULT; - goto free_buf; - } - - wpkt = (struct wdsp_write_pkt *)tx_buf->buf; - switch (wpkt->pkt_type) { - case WDSP_REG_PKT: - /* Keep this case to support backward compatibility */ - vfree(tx_buf); - break; - case WDSP_READY_PKT: - ret = wdsp_wait_for_all_ch_connect(wpriv); - if (ret < 0) - dev_err_ratelimited(wpriv->dev, "%s: Channels not in connected state\n", - __func__); - vfree(tx_buf); - break; - case WDSP_CMD_PKT: - if (count <= (WDSP_WRITE_PKT_SIZE + WDSP_CMD_PKT_SIZE)) { - dev_err_ratelimited(wpriv->dev, "%s: Invalid cmd pkt size = %zd\n", - __func__, count); - ret = -EINVAL; - goto free_buf; - } - cpkt = (struct wdsp_cmd_pkt *)wpkt->payload; - pkt_max_size = sizeof(struct wdsp_write_pkt) + - sizeof(struct wdsp_cmd_pkt) + - cpkt->payload_size; - if (count < pkt_max_size) { - dev_err_ratelimited(wpriv->dev, "%s: Invalid cmd pkt count = %zd, pkt_size = %zd\n", - __func__, count, pkt_max_size); - ret = -EINVAL; - goto free_buf; - } - for (i = 0; i < wpriv->no_of_channels; i++) { - if (!strcmp(cpkt->ch_name, wpriv->ch[i]->ch_name)) { - tx_buf->ch = wpriv->ch[i]; - break; - } - } - if (!tx_buf->ch) { - dev_err_ratelimited(wpriv->dev, "%s: Failed to get channel\n", - __func__); - ret = -EINVAL; - goto free_buf; - } - dev_dbg(wpriv->dev, "%s: requested ch_name: %s, pkt_size: %zd\n", - __func__, cpkt->ch_name, pkt_max_size); - - spin_lock(&tx_buf->ch->ch_lock); - if (tx_buf->ch->ch_state != WDSP_CH_CONNECTED) { - spin_unlock(&tx_buf->ch->ch_lock); - ret = -ENETRESET; - dev_err_ratelimited(wpriv->dev, "%s: Channels are not in connected state\n", - __func__); - goto free_buf; - } - spin_unlock(&tx_buf->ch->ch_lock); - - INIT_WORK(&tx_buf->tx_work, wdsp_tx_buf_work); - queue_work(wpriv->work_queue, &tx_buf->tx_work); - break; - default: - dev_err_ratelimited(wpriv->dev, "%s: Invalid packet type\n", - __func__); - ret = -EINVAL; - vfree(tx_buf); - break; - } - goto done; - -free_buf: - vfree(tx_buf); - -done: - return ret; -} - -/* - * wdsp_glink_open - Open API to initialize private data - * inode: Pointer to the inode structure - * file: Pointer to the file structure - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_glink_open(struct inode *inode, struct file *file) -{ - - pr_debug("%s: wpriv = %pK\n", __func__, wpriv); - file->private_data = wpriv; - - return 0; -} - -/* - * wdsp_glink_flush - Flush API to unblock read. - * file: Pointer to the file structure - * id: Lock owner ID - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_glink_flush(struct file *file, fl_owner_t id) -{ - struct wdsp_glink_priv *wpriv; - - wpriv = (struct wdsp_glink_priv *)file->private_data; - if (!wpriv) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - complete(&wpriv->rsp_complete); - - return 0; -} - -/* - * wdsp_glink_release - Release API to clean up resources. - * Whenever a file structure is shared across multiple threads, - * release won't be invoked until all copies are closed - * (file->f_count.counter should be 0). If we need to flush pending - * data when any copy is closed, you should implement the flush method. - * - * inode: Pointer to the inode structure - * file: Pointer to the file structure - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_glink_release(struct inode *inode, struct file *file) -{ - pr_debug("%s: file->private_data = %pK\n", __func__, - file->private_data); - file->private_data = NULL; - - return 0; -} - -static struct rpmsg_driver wdsp_rpmsg_driver = { - .probe = wdsp_rpmsg_probe, - .remove = wdsp_rpmsg_remove, - .callback = wdsp_rpmsg_callback, - /* Update this dynamically before register_rpmsg() */ - .id_table = NULL, - .drv = { - .name = "wdsp_rpmsg", - }, -}; - -static int wdsp_register_rpmsg(struct platform_device *pdev, - struct wdsp_glink_dev *wdev) -{ - int ret = 0; - int i, no_of_channels; - struct rpmsg_device_id *wdsp_rpmsg_id_table, *id_table; - const char *ch_name = NULL; - - wpriv = devm_kzalloc(&pdev->dev, - sizeof(struct wdsp_glink_priv), GFP_KERNEL); - if (!wpriv) - return -ENOMEM; - - no_of_channels = of_property_count_strings(pdev->dev.of_node, - "qcom,wdsp-channels"); - if (no_of_channels < 0) { - dev_err(&pdev->dev, "%s: channel name parse error %d\n", - __func__, no_of_channels); - return -EINVAL; - } - - wpriv->ch = devm_kzalloc(&pdev->dev, - (sizeof(struct wdsp_glink_priv *) * no_of_channels), - GFP_KERNEL); - if (!wpriv->ch) - return -ENOMEM; - - for (i = 0; i < no_of_channels; i++) { - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wdsp-channels", i, - &ch_name); - if (ret) { - dev_err(&pdev->dev, "%s: channel name parse error %d\n", - __func__, ret); - return -EINVAL; - } - wpriv->ch[i] = devm_kzalloc(&pdev->dev, - sizeof(struct wdsp_glink_priv), - GFP_KERNEL); - if (!wpriv->ch[i]) - return -ENOMEM; - - strlcpy(wpriv->ch[i]->ch_name, ch_name, RPMSG_NAME_SIZE); - wpriv->ch[i]->wpriv = wpriv; - spin_lock_init(&wpriv->ch[i]->ch_lock); - } - init_waitqueue_head(&wpriv->ch_state_wait); - init_completion(&wpriv->rsp_complete); - spin_lock_init(&wpriv->rsp_lock); - - wpriv->wdev = wdev; - wpriv->dev = wdev->dev; - wpriv->work_queue = create_singlethread_workqueue("wdsp_glink_wq"); - if (!wpriv->work_queue) { - dev_err(&pdev->dev, "%s: Error creating wdsp_glink_wq\n", - __func__); - return -EINVAL; - } - - wdsp_rpmsg_id_table = devm_kzalloc(&pdev->dev, - (sizeof(struct rpmsg_device_id) * - (no_of_channels + 1)), - GFP_KERNEL); - if (!wdsp_rpmsg_id_table) { - ret = -ENOMEM; - goto err; - } - - wpriv->no_of_channels = no_of_channels; - id_table = wdsp_rpmsg_id_table; - for (i = 0; i < no_of_channels; i++) { - strlcpy(id_table->name, wpriv->ch[i]->ch_name, - RPMSG_NAME_SIZE); - id_table++; - } - wdsp_rpmsg_driver.id_table = wdsp_rpmsg_id_table; - ret = register_rpmsg_driver(&wdsp_rpmsg_driver); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Rpmsg driver register failed, err = %d\n", - __func__, ret); - goto err; - } - - return 0; - -err: - destroy_workqueue(wpriv->work_queue); - return ret; -} - -static const struct file_operations wdsp_glink_fops = { - .owner = THIS_MODULE, - .open = wdsp_glink_open, - .read = wdsp_glink_read, - .write = wdsp_glink_write, - .flush = wdsp_glink_flush, - .release = wdsp_glink_release, -}; - -static int wdsp_glink_probe(struct platform_device *pdev) -{ - int ret; - struct wdsp_glink_dev *wdev; - - wdev = devm_kzalloc(&pdev->dev, sizeof(*wdev), GFP_KERNEL); - if (!wdev) { - ret = -ENOMEM; - goto done; - } - - ret = alloc_chrdev_region(&wdev->dev_num, 0, MINOR_NUMBER_COUNT, - WDSP_GLINK_DRIVER_NAME); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Failed to alloc char dev, err = %d\n", - __func__, ret); - goto err_chrdev; - } - - wdev->cls = class_create(THIS_MODULE, WDSP_GLINK_DRIVER_NAME); - if (IS_ERR(wdev->cls)) { - ret = PTR_ERR(wdev->cls); - dev_err(&pdev->dev, "%s: Failed to create class, err = %d\n", - __func__, ret); - goto err_class; - } - - wdev->dev = device_create(wdev->cls, NULL, wdev->dev_num, - NULL, WDSP_GLINK_DRIVER_NAME); - if (IS_ERR(wdev->dev)) { - ret = PTR_ERR(wdev->dev); - dev_err(&pdev->dev, "%s: Failed to create device, err = %d\n", - __func__, ret); - goto err_dev_create; - } - - cdev_init(&wdev->cdev, &wdsp_glink_fops); - ret = cdev_add(&wdev->cdev, wdev->dev_num, MINOR_NUMBER_COUNT); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Failed to register char dev, err = %d\n", - __func__, ret); - goto err_cdev_add; - } - - ret = wdsp_register_rpmsg(pdev, wdev); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Failed to register with rpmsg, err = %d\n", - __func__, ret); - goto err_cdev_add; - } - platform_set_drvdata(pdev, wpriv); - - goto done; - -err_cdev_add: - device_destroy(wdev->cls, wdev->dev_num); - -err_dev_create: - class_destroy(wdev->cls); - -err_class: - unregister_chrdev_region(0, MINOR_NUMBER_COUNT); - -err_chrdev: -done: - return ret; -} - -static int wdsp_glink_remove(struct platform_device *pdev) -{ - struct wdsp_glink_priv *wpriv = platform_get_drvdata(pdev); - - unregister_rpmsg_driver(&wdsp_rpmsg_driver); - - if (wpriv) { - flush_workqueue(wpriv->work_queue); - destroy_workqueue(wpriv->work_queue); - if (wpriv->wdev) { - cdev_del(&wpriv->wdev->cdev); - device_destroy(wpriv->wdev->cls, wpriv->wdev->dev_num); - class_destroy(wpriv->wdev->cls); - unregister_chrdev_region(0, MINOR_NUMBER_COUNT); - } - } - - return 0; -} - -static const struct of_device_id wdsp_glink_of_match[] = { - {.compatible = "qcom,wcd-dsp-glink"}, - { } -}; -MODULE_DEVICE_TABLE(of, wdsp_glink_of_match); - -static struct platform_driver wdsp_glink_driver = { - .probe = wdsp_glink_probe, - .remove = wdsp_glink_remove, - .driver = { - .name = WDSP_GLINK_DRIVER_NAME, - .owner = THIS_MODULE, - .of_match_table = wdsp_glink_of_match, - .suppress_bind_attrs = true, - }, -}; - -static int __init wdsp_glink_init(void) -{ - return platform_driver_register(&wdsp_glink_driver); -} - -static void __exit wdsp_glink_exit(void) -{ - platform_driver_unregister(&wdsp_glink_driver); -} - -module_init(wdsp_glink_init); -module_exit(wdsp_glink_exit); -MODULE_DESCRIPTION("SoC WCD_DSP GLINK Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/soc/Android.mk b/techpack/audio/4.0/soc/Android.mk deleted file mode 100644 index 83101fceaded..000000000000 --- a/techpack/audio/4.0/soc/Android.mk +++ /dev/null @@ -1,103 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE) $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,kona),true) -AUDIO_SELECT := CONFIG_SND_SOC_KONA=m -endif - -ifeq ($(call is-board-platform,lito),true) -AUDIO_SELECT := CONFIG_SND_SOC_LITO=m -endif - -ifeq ($(call is-board-platform,atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_ATOLL=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=soc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) atoll kona lito),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_lpi.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_lpi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) kona), true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_wcd.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_wcd_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr.ko -LOCAL_MODULE_KBUILD_NAME := swr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr_ctrl.ko -LOCAL_MODULE_KBUILD_NAME := swr_ctrl_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, $(MSMSTEPPE) kona lito atoll),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_snd_event.ko -LOCAL_MODULE_KBUILD_NAME := snd_event_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/4.0/soc/Kbuild b/techpack/audio/4.0/soc/Kbuild deleted file mode 100644 index 87102079e9ae..000000000000 --- a/techpack/audio/4.0/soc/Kbuild +++ /dev/null @@ -1,185 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.19 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_KONA), y) - include $(AUDIO_ROOT)/config/konaauto.conf - INCS += -include $(AUDIO_ROOT)/config/konaautoconf.h - endif - ifeq ($(CONFIG_ARCH_LITO), y) - include $(AUDIO_ROOT)/config/litoauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/litoautoconf.h - endif - ifeq ($(CONFIG_ARCH_ATOLL), y) - include $(AUDIO_ROOT)/4.0/config/atollauto.conf - export - INCS += -include $(AUDIO_ROOT)/4.0/config/atollautoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -ifeq ($(CONFIG_ARCH_ATOLL), y) - UAPI_DIR := uapi - UAPI_INC := -I$(AUDIO_ROOT)/4.0/include/$(UAPI_DIR) - COMMON_DIR := include - COMMON_INC := -I$(AUDIO_ROOT)/4.0/$(COMMON_DIR) -endif - -############ SoC Modules ############ - -# for pinctrl WCD driver -ifdef CONFIG_PINCTRL_WCD - PINCTRL_WCD_OBJS += pinctrl-wcd.o -endif - -# for pinctrl LPI driver -ifdef CONFIG_PINCTRL_LPI - PINCTRL_LPI_OBJS += pinctrl-lpi.o -endif - -# for soundwire driver -ifdef CONFIG_SOUNDWIRE_WCD_CTRL - SWR_CTRL_OBJS += swr-wcd-ctrl.o -endif - -# for new soundwire driver -ifdef CONFIG_SOUNDWIRE_MSTR_CTRL - SWR_CTRL_OBJS += swr-mstr-ctrl.o -endif - -ifdef CONFIG_SOUNDWIRE - SWR_OBJS += regmap-swr.o - SWR_OBJS += soundwire.o -endif - -ifdef CONFIG_SND_EVENT - SND_EVENT_OBJS += snd_event.o -endif - -ifdef CONFIG_WCD_SPI_AC - WCD_SPI_ACC_CTL_OBJS += wcd-spi-ac.o - WCD_SPI_ACC_CTL_OBJS += wcd_spi_ctl_v01.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM6150), y) - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers - else - KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers - endif -endif - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_PINCTRL_WCD) += pinctrl_wcd_dlkm.o -pinctrl_wcd_dlkm-y := $(PINCTRL_WCD_OBJS) - -obj-$(CONFIG_PINCTRL_LPI) += pinctrl_lpi_dlkm.o -pinctrl_lpi_dlkm-y := $(PINCTRL_LPI_OBJS) - -obj-$(CONFIG_SOUNDWIRE) += swr_dlkm.o -swr_dlkm-y := $(SWR_OBJS) - -obj-$(CONFIG_SND_EVENT) += snd_event_dlkm.o -snd_event_dlkm-y := $(SND_EVENT_OBJS) - -obj-$(CONFIG_SOUNDWIRE_WCD_CTRL) += swr_ctrl_dlkm.o -obj-$(CONFIG_SOUNDWIRE_MSTR_CTRL) += swr_ctrl_dlkm.o -swr_ctrl_dlkm-y := $(SWR_CTRL_OBJS) - -obj-$(CONFIG_WCD_SPI_AC) += wcd_spi_acc_ctl_dlkm.o -wcd_spi_acc_ctl_dlkm-y := $(WCD_SPI_ACC_CTL_OBJS) - -# inject some build related information diff --git a/techpack/audio/4.0/soc/core.h b/techpack/audio/4.0/soc/core.h deleted file mode 100644 index 7880c3adc450..000000000000 --- a/techpack/audio/4.0/soc/core.h +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Core private header for the pin control subsystem - * - * Copyright (C) 2011 ST-Ericsson SA - * Written on behalf of Linaro for ST-Ericsson - * - * Author: Linus Walleij - * - * License terms: GNU General Public License (GPL) version 2 - */ - -#include -#include -#include -#include -#include - -struct pinctrl_gpio_range; - -/** - * struct pinctrl_dev - pin control class device - * @node: node to include this pin controller in the global pin controller list - * @desc: the pin controller descriptor supplied when initializing this pin - * controller - * @pin_desc_tree: each pin descriptor for this pin controller is stored in - * this radix tree - * @pin_group_tree: optionally each pin group can be stored in this radix tree - * @num_groups: optionally number of groups can be kept here - * @pin_function_tree: optionally each function can be stored in this radix tree - * @num_functions: optionally number of functions can be kept here - * @gpio_ranges: a list of GPIO ranges that is handled by this pin controller, - * ranges are added to this list at runtime - * @dev: the device entry for this pin controller - * @owner: module providing the pin controller, used for refcounting - * @driver_data: driver data for drivers registering to the pin controller - * subsystem - * @p: result of pinctrl_get() for this device - * @hog_default: default state for pins hogged by this device - * @hog_sleep: sleep state for pins hogged by this device - * @mutex: mutex taken on each pin controller specific action - * @device_root: debugfs root for this device - */ -struct pinctrl_dev { - struct list_head node; - struct pinctrl_desc *desc; - struct radix_tree_root pin_desc_tree; -#ifdef CONFIG_GENERIC_PINCTRL_GROUPS - struct radix_tree_root pin_group_tree; - unsigned int num_groups; -#endif -#ifdef CONFIG_GENERIC_PINMUX_FUNCTIONS - struct radix_tree_root pin_function_tree; - unsigned int num_functions; -#endif - struct list_head gpio_ranges; - struct device *dev; - struct module *owner; - void *driver_data; - struct pinctrl *p; - struct pinctrl_state *hog_default; - struct pinctrl_state *hog_sleep; - struct mutex mutex; -#ifdef CONFIG_DEBUG_FS - struct dentry *device_root; -#endif -}; - -/** - * struct pinctrl - per-device pin control state holder - * @node: global list node - * @dev: the device using this pin control handle - * @states: a list of states for this device - * @state: the current state - * @dt_maps: the mapping table chunks dynamically parsed from device tree for - * this device, if any - * @users: reference count - */ -struct pinctrl { - struct list_head node; - struct device *dev; - struct list_head states; - struct pinctrl_state *state; - struct list_head dt_maps; - struct kref users; -}; - -/** - * struct pinctrl_state - a pinctrl state for a device - * @node: list node for struct pinctrl's @states field - * @name: the name of this state - * @settings: a list of settings for this state - */ -struct pinctrl_state { - struct list_head node; - const char *name; - struct list_head settings; -}; - -/** - * struct pinctrl_setting_mux - setting data for MAP_TYPE_MUX_GROUP - * @group: the group selector to program - * @func: the function selector to program - */ -struct pinctrl_setting_mux { - unsigned group; - unsigned func; -}; - -/** - * struct pinctrl_setting_configs - setting data for MAP_TYPE_CONFIGS_* - * @group_or_pin: the group selector or pin ID to program - * @configs: a pointer to an array of config parameters/values to program into - * hardware. Each individual pin controller defines the format and meaning - * of config parameters. - * @num_configs: the number of entries in array @configs - */ -struct pinctrl_setting_configs { - unsigned group_or_pin; - unsigned long *configs; - unsigned num_configs; -}; - -/** - * struct pinctrl_setting - an individual mux or config setting - * @node: list node for struct pinctrl_settings's @settings field - * @type: the type of setting - * @pctldev: pin control device handling to be programmed. Not used for - * PIN_MAP_TYPE_DUMMY_STATE. - * @dev_name: the name of the device using this state - * @data: Data specific to the setting type - */ -struct pinctrl_setting { - struct list_head node; - enum pinctrl_map_type type; - struct pinctrl_dev *pctldev; - const char *dev_name; - union { - struct pinctrl_setting_mux mux; - struct pinctrl_setting_configs configs; - } data; -}; - -/** - * struct pin_desc - pin descriptor for each physical pin in the arch - * @pctldev: corresponding pin control device - * @name: a name for the pin, e.g. the name of the pin/pad/finger on a - * datasheet or such - * @dynamic_name: if the name of this pin was dynamically allocated - * @drv_data: driver-defined per-pin data. pinctrl core does not touch this - * @mux_usecount: If zero, the pin is not claimed, and @owner should be NULL. - * If non-zero, this pin is claimed by @owner. This field is an integer - * rather than a boolean, since pinctrl_get() might process multiple - * mapping table entries that refer to, and hence claim, the same group - * or pin, and each of these will increment the @usecount. - * @mux_owner: The name of device that called pinctrl_get(). - * @mux_setting: The most recent selected mux setting for this pin, if any. - * @gpio_owner: If pinctrl_request_gpio() was called for this pin, this is - * the name of the GPIO that "owns" this pin. - */ -struct pin_desc { - struct pinctrl_dev *pctldev; - const char *name; - bool dynamic_name; - void *drv_data; - /* These fields only added when supporting pinmux drivers */ -#ifdef CONFIG_PINMUX - unsigned mux_usecount; - const char *mux_owner; - const struct pinctrl_setting_mux *mux_setting; - const char *gpio_owner; -#endif -}; - -/** - * struct pinctrl_maps - a list item containing part of the mapping table - * @node: mapping table list node - * @maps: array of mapping table entries - * @num_maps: the number of entries in @maps - */ -struct pinctrl_maps { - struct list_head node; - const struct pinctrl_map *maps; - unsigned num_maps; -}; - -#ifdef CONFIG_GENERIC_PINCTRL_GROUPS - -/** - * struct group_desc - generic pin group descriptor - * @name: name of the pin group - * @pins: array of pins that belong to the group - * @num_pins: number of pins in the group - * @data: pin controller driver specific data - */ -struct group_desc { - const char *name; - int *pins; - int num_pins; - void *data; -}; - -int pinctrl_generic_get_group_count(struct pinctrl_dev *pctldev); - -const char *pinctrl_generic_get_group_name(struct pinctrl_dev *pctldev, - unsigned int group_selector); - -int pinctrl_generic_get_group_pins(struct pinctrl_dev *pctldev, - unsigned int group_selector, - const unsigned int **pins, - unsigned int *npins); - -struct group_desc *pinctrl_generic_get_group(struct pinctrl_dev *pctldev, - unsigned int group_selector); - -int pinctrl_generic_add_group(struct pinctrl_dev *pctldev, const char *name, - int *gpins, int ngpins, void *data); - -int pinctrl_generic_remove_group(struct pinctrl_dev *pctldev, - unsigned int group_selector); - -static inline int -pinctrl_generic_remove_last_group(struct pinctrl_dev *pctldev) -{ - return pinctrl_generic_remove_group(pctldev, pctldev->num_groups - 1); -} - -#endif /* CONFIG_GENERIC_PINCTRL_GROUPS */ - -struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *dev_name); -struct pinctrl_dev *get_pinctrl_dev_from_of_node(struct device_node *np); -int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name); -const char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin); -int pinctrl_get_group_selector(struct pinctrl_dev *pctldev, - const char *pin_group); - -static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev, - unsigned int pin) -{ - return radix_tree_lookup(&pctldev->pin_desc_tree, pin); -} - -extern struct pinctrl_gpio_range * -pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev, - unsigned int pin); - -int pinctrl_register_map(const struct pinctrl_map *maps, unsigned num_maps, - bool dup); -void pinctrl_unregister_map(const struct pinctrl_map *map); - -extern int pinctrl_force_sleep(struct pinctrl_dev *pctldev); -extern int pinctrl_force_default(struct pinctrl_dev *pctldev); - -extern struct mutex pinctrl_maps_mutex; -extern struct list_head pinctrl_maps; - -#define for_each_maps(_maps_node_, _i_, _map_) \ - list_for_each_entry(_maps_node_, &pinctrl_maps, node) \ - for (_i_ = 0, _map_ = &_maps_node_->maps[_i_]; \ - _i_ < _maps_node_->num_maps; \ - _i_++, _map_ = &_maps_node_->maps[_i_]) diff --git a/techpack/audio/4.0/soc/pinctrl-lpi.c b/techpack/audio/4.0/soc/pinctrl-lpi.c deleted file mode 100644 index 969e7c3cdb80..000000000000 --- a/techpack/audio/4.0/soc/pinctrl-lpi.c +++ /dev/null @@ -1,956 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "core.h" -#include "pinctrl-utils.h" - -#define LPI_AUTO_SUSPEND_DELAY 100 /* delay in msec */ -#define LPI_AUTO_SUSPEND_DELAY_ERROR 1 /* delay in msec */ - -#define LPI_ADDRESS_SIZE 0x20000 -#define LPI_SLEW_ADDRESS_SIZE 0x1000 - -#define LPI_GPIO_REG_VAL_CTL 0x00 -#define LPI_GPIO_REG_DIR_CTL 0x04 - -#define LPI_SLEW_REG_VAL_CTL 0x00 -#define LPI_SLEW_RATE_MAX 0x03 -#define LPI_SLEW_BITS_SIZE 0x02 -#define LPI_SLEW_OFFSET_INVALID 0xFFFFFFFF - -#define LPI_GPIO_REG_PULL_SHIFT 0x0 -#define LPI_GPIO_REG_PULL_MASK 0x3 - -#define LPI_GPIO_REG_FUNCTION_SHIFT 0x2 -#define LPI_GPIO_REG_FUNCTION_MASK 0x3C - -#define LPI_GPIO_REG_OUT_STRENGTH_SHIFT 0x6 -#define LPI_GPIO_REG_OUT_STRENGTH_MASK 0x1C0 - -#define LPI_GPIO_REG_OE_SHIFT 0x9 -#define LPI_GPIO_REG_OE_MASK 0x200 - -#define LPI_GPIO_REG_DIR_SHIFT 0x1 -#define LPI_GPIO_REG_DIR_MASK 0x2 - -#define LPI_GPIO_BIAS_DISABLE 0x0 -#define LPI_GPIO_PULL_DOWN 0x1 -#define LPI_GPIO_KEEPER 0x2 -#define LPI_GPIO_PULL_UP 0x3 - -#define LPI_GPIO_FUNC_GPIO "gpio" -#define LPI_GPIO_FUNC_FUNC1 "func1" -#define LPI_GPIO_FUNC_FUNC2 "func2" -#define LPI_GPIO_FUNC_FUNC3 "func3" -#define LPI_GPIO_FUNC_FUNC4 "func4" -#define LPI_GPIO_FUNC_FUNC5 "func5" - -static bool lpi_dev_up; -static struct device *lpi_dev; - -/* The index of each function in lpi_gpio_functions[] array */ -enum lpi_gpio_func_index { - LPI_GPIO_FUNC_INDEX_GPIO = 0x00, - LPI_GPIO_FUNC_INDEX_FUNC1 = 0x01, - LPI_GPIO_FUNC_INDEX_FUNC2 = 0x02, - LPI_GPIO_FUNC_INDEX_FUNC3 = 0x03, - LPI_GPIO_FUNC_INDEX_FUNC4 = 0x04, - LPI_GPIO_FUNC_INDEX_FUNC5 = 0x05, -}; - -/** - * struct lpi_gpio_pad - keep current GPIO settings - * @offset: stores one of gpio_offset or slew_offset at a given time. - * @gpio_offset: Nth GPIO in supported GPIOs. - * @slew_offset: Nth GPIO's position in slew register in supported GPIOs. - * @output_enabled: Set to true if GPIO output logic is enabled. - * @value: value of a pin - * @base: stores one of gpio_base or slew_base at a given time. - * @gpio_base: Address base of LPI GPIO PAD. - * @slew_base: Address base of LPI SLEW PAD. - * @lpi_slew_reg: Address for lpi slew reg. - * @pullup: Constant current which flow through GPIO output buffer. - * @strength: No, Low, Medium, High - * @function: See lpi_gpio_functions[] - */ -struct lpi_gpio_pad { - u32 offset; - u32 gpio_offset; - u32 slew_offset; - bool output_enabled; - bool value; - char __iomem *base; - char __iomem *gpio_base; - char __iomem *slew_base; - char __iomem *lpi_slew_reg; - unsigned int pullup; - unsigned int strength; - unsigned int function; -}; - -struct lpi_gpio_state { - struct device *dev; - struct pinctrl_dev *ctrl; - struct gpio_chip chip; - char __iomem *base; - struct clk *lpass_core_hw_vote; - struct clk *lpass_audio_hw_vote; - struct mutex slew_access_lock; - bool core_hw_vote_status; - struct mutex core_hw_vote_lock; -}; - -static const char *const lpi_gpio_groups[] = { - "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", - "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", - "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", - "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", - "gpio29", "gpio30", "gpio31", -}; - -#define LPI_TLMM_MAX_PINS 100 -static u32 lpi_offset[LPI_TLMM_MAX_PINS]; -static u32 lpi_slew_offset[LPI_TLMM_MAX_PINS]; -static u32 lpi_slew_base[LPI_TLMM_MAX_PINS]; - -static const char *const lpi_gpio_functions[] = { - [LPI_GPIO_FUNC_INDEX_GPIO] = LPI_GPIO_FUNC_GPIO, - [LPI_GPIO_FUNC_INDEX_FUNC1] = LPI_GPIO_FUNC_FUNC1, - [LPI_GPIO_FUNC_INDEX_FUNC2] = LPI_GPIO_FUNC_FUNC2, - [LPI_GPIO_FUNC_INDEX_FUNC3] = LPI_GPIO_FUNC_FUNC3, - [LPI_GPIO_FUNC_INDEX_FUNC4] = LPI_GPIO_FUNC_FUNC4, - [LPI_GPIO_FUNC_INDEX_FUNC5] = LPI_GPIO_FUNC_FUNC5, -}; - -int lpi_pinctrl_runtime_suspend(struct device *dev); - -static int lpi_gpio_read(struct lpi_gpio_pad *pad, unsigned int addr) -{ - int ret = 0; - struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); - - if (!lpi_dev_up) { - pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", - __func__); - return 0; - } - pm_runtime_get_sync(lpi_dev); - mutex_lock(&state->core_hw_vote_lock); - if (!state->core_hw_vote_status) { - pr_err_ratelimited("%s: core hw vote clk is not enabled\n", - __func__); - ret = -EINVAL; - goto err; - } - - ret = ioread32(pad->base + pad->offset + addr); - if (ret < 0) - pr_err("%s: read 0x%x failed\n", __func__, addr); - -err: - mutex_unlock(&state->core_hw_vote_lock); - pm_runtime_mark_last_busy(lpi_dev); - pm_runtime_put_autosuspend(lpi_dev); - return ret; -} - -static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, - unsigned int val) -{ - struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); - int ret = 0; - - if (!lpi_dev_up) { - pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", - __func__); - return 0; - } - pm_runtime_get_sync(lpi_dev); - mutex_lock(&state->core_hw_vote_lock); - if (!state->core_hw_vote_status) { - pr_err_ratelimited("%s: core hw vote clk is not enabled\n", - __func__); - ret = -EINVAL; - goto err; - } - - iowrite32(val, pad->base + pad->offset + addr); -err: - mutex_unlock(&state->core_hw_vote_lock); - pm_runtime_mark_last_busy(lpi_dev); - pm_runtime_put_autosuspend(lpi_dev); - return ret; -} - -static int lpi_gpio_get_groups_count(struct pinctrl_dev *pctldev) -{ - /* Every PIN is a group */ - return pctldev->desc->npins; -} - -static const char *lpi_gpio_get_group_name(struct pinctrl_dev *pctldev, - unsigned int pin) -{ - return pctldev->desc->pins[pin].name; -} - -static int lpi_gpio_get_group_pins(struct pinctrl_dev *pctldev, - unsigned int pin, - const unsigned int **pins, - unsigned int *num_pins) -{ - *pins = &pctldev->desc->pins[pin].number; - *num_pins = 1; - return 0; -} - -static const struct pinctrl_ops lpi_gpio_pinctrl_ops = { - .get_groups_count = lpi_gpio_get_groups_count, - .get_group_name = lpi_gpio_get_group_name, - .get_group_pins = lpi_gpio_get_group_pins, - .dt_node_to_map = pinconf_generic_dt_node_to_map_group, - .dt_free_map = pinctrl_utils_free_map, -}; - -static int lpi_gpio_get_functions_count(struct pinctrl_dev *pctldev) -{ - return ARRAY_SIZE(lpi_gpio_functions); -} - -static const char *lpi_gpio_get_function_name(struct pinctrl_dev *pctldev, - unsigned int function) -{ - return lpi_gpio_functions[function]; -} - -static int lpi_gpio_get_function_groups(struct pinctrl_dev *pctldev, - unsigned int function, - const char *const **groups, - unsigned *const num_qgroups) -{ - *groups = lpi_gpio_groups; - *num_qgroups = pctldev->desc->npins; - return 0; -} - -static int lpi_gpio_set_mux(struct pinctrl_dev *pctldev, unsigned int function, - unsigned int pin) -{ - struct lpi_gpio_pad *pad; - unsigned int val; - - pad = pctldev->desc->pins[pin].drv_data; - - pad->function = function; - - val = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - val &= ~(LPI_GPIO_REG_FUNCTION_MASK); - val |= pad->function << LPI_GPIO_REG_FUNCTION_SHIFT; - lpi_gpio_write(pad, LPI_GPIO_REG_VAL_CTL, val); - return 0; -} - -static const struct pinmux_ops lpi_gpio_pinmux_ops = { - .get_functions_count = lpi_gpio_get_functions_count, - .get_function_name = lpi_gpio_get_function_name, - .get_function_groups = lpi_gpio_get_function_groups, - .set_mux = lpi_gpio_set_mux, -}; - -static int lpi_config_get(struct pinctrl_dev *pctldev, - unsigned int pin, unsigned long *config) -{ - unsigned int param = pinconf_to_config_param(*config); - struct lpi_gpio_pad *pad; - unsigned int arg; - - pad = pctldev->desc->pins[pin].drv_data; - - switch (param) { - case PIN_CONFIG_BIAS_DISABLE: - arg = pad->pullup = LPI_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_DOWN: - arg = pad->pullup == LPI_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_BUS_HOLD: - arg = pad->pullup = LPI_GPIO_KEEPER; - break; - case PIN_CONFIG_BIAS_PULL_UP: - arg = pad->pullup == LPI_GPIO_PULL_UP; - break; - case PIN_CONFIG_INPUT_ENABLE: - case PIN_CONFIG_OUTPUT: - arg = pad->output_enabled; - break; - default: - return -EINVAL; - } - - *config = pinconf_to_config_packed(param, arg); - return 0; -} - -static unsigned int lpi_drive_to_regval(u32 arg) -{ - return (arg/2 - 1); -} - -static int lpi_config_set(struct pinctrl_dev *pctldev, unsigned int pin, - unsigned long *configs, unsigned int nconfs) -{ - struct lpi_gpio_pad *pad; - unsigned int param, arg; - int i, ret = 0; - volatile unsigned long val; - struct lpi_gpio_state *state = dev_get_drvdata(pctldev->dev); - - pad = pctldev->desc->pins[pin].drv_data; - - for (i = 0; i < nconfs; i++) { - param = pinconf_to_config_param(configs[i]); - arg = pinconf_to_config_argument(configs[i]); - - dev_dbg(pctldev->dev, "%s: param: %d arg: %d pin: %d\n", - __func__, param, arg, pin); - - switch (param) { - case PIN_CONFIG_BIAS_DISABLE: - pad->pullup = LPI_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_DOWN: - pad->pullup = LPI_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_BUS_HOLD: - pad->pullup = LPI_GPIO_KEEPER; - break; - case PIN_CONFIG_BIAS_PULL_UP: - pad->pullup = LPI_GPIO_PULL_UP; - break; - case PIN_CONFIG_INPUT_ENABLE: - pad->output_enabled = false; - break; - case PIN_CONFIG_OUTPUT: - pad->output_enabled = true; - pad->value = arg; - break; - case PIN_CONFIG_DRIVE_STRENGTH: - pad->strength = arg; - break; - case PIN_CONFIG_SLEW_RATE: - if (pad->slew_base == NULL || - pad->slew_offset == LPI_SLEW_OFFSET_INVALID) { - dev_dbg(pctldev->dev, "%s: invalid slew settings for pin: %d\n", - __func__, pin); - goto set_gpio; - } - if (arg > LPI_SLEW_RATE_MAX) { - dev_err(pctldev->dev, "%s: invalid slew rate %u for pin: %d\n", - __func__, arg, pin); - goto set_gpio; - } - pad->base = pad->slew_base; - pad->offset = 0; - mutex_lock(&state->slew_access_lock); - if (pad->lpi_slew_reg != NULL) { - pad->base = pad->lpi_slew_reg; - lpi_gpio_write(pad, LPI_SLEW_REG_VAL_CTL, arg); - pad->base = pad->slew_base; - goto slew_exit; - } - val = lpi_gpio_read(pad, LPI_SLEW_REG_VAL_CTL); - pad->offset = pad->slew_offset; - for (i = 0; i < LPI_SLEW_BITS_SIZE; i++) { - if (arg & 0x01) - set_bit(pad->offset, &val); - else - clear_bit(pad->offset, &val); - pad->offset++; - arg = arg >> 1; - } - pad->offset = 0; - lpi_gpio_write(pad, LPI_SLEW_REG_VAL_CTL, val); -slew_exit: - mutex_unlock(&state->slew_access_lock); - break; - default: - ret = -EINVAL; - goto done; - } - } - -set_gpio: - pad->base = pad->gpio_base; - pad->offset = pad->gpio_offset; - val = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - val &= ~(LPI_GPIO_REG_PULL_MASK | LPI_GPIO_REG_OUT_STRENGTH_MASK | - LPI_GPIO_REG_OE_MASK); - val |= pad->pullup << LPI_GPIO_REG_PULL_SHIFT; - val |= lpi_drive_to_regval(pad->strength) << - LPI_GPIO_REG_OUT_STRENGTH_SHIFT; - if (pad->output_enabled) - val |= pad->value << LPI_GPIO_REG_OE_SHIFT; - - lpi_gpio_write(pad, LPI_GPIO_REG_VAL_CTL, val); - lpi_gpio_write(pad, LPI_GPIO_REG_DIR_CTL, - pad->output_enabled << LPI_GPIO_REG_DIR_SHIFT); -done: - return ret; -} - -static const struct pinconf_ops lpi_gpio_pinconf_ops = { - .is_generic = true, - .pin_config_group_get = lpi_config_get, - .pin_config_group_set = lpi_config_set, -}; - -static int lpi_gpio_direction_input(struct gpio_chip *chip, unsigned int pin) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1); - - return lpi_config_set(state->ctrl, pin, &config, 1); -} - -static int lpi_gpio_direction_output(struct gpio_chip *chip, - unsigned int pin, int val) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, val); - - return lpi_config_set(state->ctrl, pin, &config, 1); -} - -static int lpi_gpio_get(struct gpio_chip *chip, unsigned int pin) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - struct lpi_gpio_pad *pad; - int value; - - pad = state->ctrl->desc->pins[pin].drv_data; - - value = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - return value; -} - -static void lpi_gpio_set(struct gpio_chip *chip, unsigned int pin, int value) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, value); - - lpi_config_set(state->ctrl, pin, &config, 1); -} - -static int lpi_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - static bool initial_boot = true; - struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - if (initial_boot) { - initial_boot = false; - break; - } - snd_event_notify(lpi_dev, SND_EVENT_DOWN); - lpi_dev_up = false; - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (initial_boot) - initial_boot = false; - - /* Reset HW votes after SSR */ - if (!lpi_dev_up) { - if (state->lpass_core_hw_vote) - digital_cdc_rsc_mgr_hw_vote_reset( - state->lpass_core_hw_vote); - if (state->lpass_audio_hw_vote) - digital_cdc_rsc_mgr_hw_vote_reset( - state->lpass_audio_hw_vote); - } - - lpi_dev_up = true; - snd_event_notify(lpi_dev, SND_EVENT_UP); - break; - default: - break; - } - return NOTIFY_OK; -} - -int lpi_pinctrl_suspend(struct device *dev) -{ - int ret = 0; - - trace_printk("%s: system suspend\n", __func__); - dev_dbg(dev, "%s: system suspend\n", __func__); - - if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) { - ret = lpi_pinctrl_runtime_suspend(dev); - if (!ret) { - /* - * Synchronize runtime-pm and system-pm states: - * At this point, we are already suspended. If - * runtime-pm still thinks its active, then - * make sure its status is in sync with HW - * status. The three below calls let the - * runtime-pm know that we are suspended - * already without re-invoking the suspend - * callback - */ - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - - return ret; -} - -int lpi_pinctrl_resume(struct device *dev) -{ - return 0; -} - -static struct notifier_block service_nb = { - .notifier_call = lpi_notifier_service_cb, - .priority = -INT_MAX, -}; - -static void lpi_pinctrl_ssr_disable(struct device *dev, void *data) -{ - trace_printk("%s: enter\n", __func__); - lpi_dev_up = false; - lpi_pinctrl_suspend(dev); -} - -static const struct snd_event_ops lpi_pinctrl_ssr_ops = { - .disable = lpi_pinctrl_ssr_disable, -}; - -#ifdef CONFIG_DEBUG_FS -#include - -static unsigned int lpi_regval_to_drive(u32 val) -{ - return (val + 1) * 2; -} - -static void lpi_gpio_dbg_show_one(struct seq_file *s, - struct pinctrl_dev *pctldev, - struct gpio_chip *chip, - unsigned int offset, - unsigned int gpio) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - struct pinctrl_pin_desc pindesc; - struct lpi_gpio_pad *pad; - unsigned int func; - int is_out; - int drive; - int pull; - u32 ctl_reg; - - static const char * const pulls[] = { - "no pull", - "pull down", - "keeper", - "pull up" - }; - - pctldev = pctldev ? : state->ctrl; - pindesc = pctldev->desc->pins[offset]; - pad = pctldev->desc->pins[offset].drv_data; - ctl_reg = lpi_gpio_read(pad, LPI_GPIO_REG_DIR_CTL); - is_out = (ctl_reg & LPI_GPIO_REG_DIR_MASK) >> LPI_GPIO_REG_DIR_SHIFT; - ctl_reg = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - - func = (ctl_reg & LPI_GPIO_REG_FUNCTION_MASK) >> - LPI_GPIO_REG_FUNCTION_SHIFT; - drive = (ctl_reg & LPI_GPIO_REG_OUT_STRENGTH_MASK) >> - LPI_GPIO_REG_OUT_STRENGTH_SHIFT; - pull = (ctl_reg & LPI_GPIO_REG_PULL_MASK) >> LPI_GPIO_REG_PULL_SHIFT; - - seq_printf(s, " %-8s: %-3s %d", - pindesc.name, is_out ? "out" : "in", func); - seq_printf(s, " %dmA", lpi_regval_to_drive(drive)); - seq_printf(s, " %s", pulls[pull]); -} - -static void lpi_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) -{ - unsigned int gpio = chip->base; - unsigned int i; - - for (i = 0; i < chip->ngpio; i++, gpio++) { - lpi_gpio_dbg_show_one(s, NULL, chip, i, gpio); - seq_puts(s, "\n"); - } -} - -#else -#define lpi_gpio_dbg_show NULL -#endif - -static const struct gpio_chip lpi_gpio_template = { - .direction_input = lpi_gpio_direction_input, - .direction_output = lpi_gpio_direction_output, - .get = lpi_gpio_get, - .set = lpi_gpio_set, - .request = gpiochip_generic_request, - .free = gpiochip_generic_free, - .dbg_show = lpi_gpio_dbg_show, -}; - -static int lpi_pinctrl_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct pinctrl_pin_desc *pindesc; - struct pinctrl_desc *pctrldesc; - struct lpi_gpio_pad *pad, *pads; - struct lpi_gpio_state *state; - int ret, npins, i; - char __iomem *lpi_base; - char __iomem *slew_base; - u32 reg, slew_reg; - struct clk *lpass_core_hw_vote = NULL; - struct clk *lpass_audio_hw_vote = NULL; - - ret = of_property_read_u32(dev->of_node, "reg", ®); - if (ret < 0) { - dev_err(dev, "missing base address\n"); - return ret; - } - - ret = of_property_read_u32(dev->of_node, "qcom,num-gpios", &npins); - if (ret < 0) - return ret; - - WARN_ON(npins > ARRAY_SIZE(lpi_gpio_groups)); - - ret = of_property_read_u32_array(dev->of_node, "qcom,lpi-offset-tbl", - lpi_offset, npins); - if (ret < 0) { - dev_err(dev, "error in reading lpi offset table: %d\n", ret); - return ret; - } - - ret = of_property_read_u32_array(dev->of_node, - "qcom,lpi-slew-offset-tbl", - lpi_slew_offset, npins); - if (ret < 0) { - for (i = 0; i < npins; i++) - lpi_slew_offset[i] = LPI_SLEW_OFFSET_INVALID; - dev_dbg(dev, "%s: error in reading lpi slew offset table: %d\n", - __func__, ret); - } - - ret = of_property_read_u32_array(dev->of_node, - "qcom,lpi-slew-base-tbl", - lpi_slew_base, npins); - if (ret < 0) { - for (i = 0; i < npins; i++) - lpi_slew_base[i] = LPI_SLEW_OFFSET_INVALID; - dev_dbg(dev, "%s: error in reading lpi slew table: %d\n", - __func__, ret); - } - - state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); - if (!state) - return -ENOMEM; - - platform_set_drvdata(pdev, state); - - state->dev = &pdev->dev; - - slew_reg = 0; - ret = of_property_read_u32(dev->of_node, "qcom,slew-reg", &slew_reg); - if (!ret) { - slew_base = devm_ioremap(dev, slew_reg, LPI_SLEW_ADDRESS_SIZE); - if (slew_base == NULL) { - dev_err(dev, - "%s devm_ioremap failed for slew rate reg\n", - __func__); - ret = -ENOMEM; - goto err_io; - } - } else { - slew_base = NULL; - dev_dbg(dev, "error in reading lpi slew register: %d\n", - __func__, ret); - } - - pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL); - if (!pindesc) - return -ENOMEM; - - pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL); - if (!pads) - return -ENOMEM; - - pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL); - if (!pctrldesc) - return -ENOMEM; - - pctrldesc->pctlops = &lpi_gpio_pinctrl_ops; - pctrldesc->pmxops = &lpi_gpio_pinmux_ops; - pctrldesc->confops = &lpi_gpio_pinconf_ops; - pctrldesc->owner = THIS_MODULE; - pctrldesc->name = dev_name(dev); - pctrldesc->pins = pindesc; - pctrldesc->npins = npins; - - lpi_base = devm_ioremap(dev, reg, LPI_ADDRESS_SIZE); - if (lpi_base == NULL) { - dev_err(dev, "%s devm_ioremap failed\n", __func__); - return -ENOMEM; - } - - state->base = lpi_base; - - for (i = 0; i < npins; i++, pindesc++) { - pad = &pads[i]; - pindesc->drv_data = pad; - pindesc->number = i; - pindesc->name = lpi_gpio_groups[i]; - - pad->gpio_base = lpi_base; - pad->slew_base = slew_base; - pad->base = pad->gpio_base; - - pad->gpio_offset = lpi_offset[i]; - pad->slew_offset = lpi_slew_offset[i]; - pad->offset = pad->gpio_offset; - pad->lpi_slew_reg = NULL; - if ((lpi_slew_base[i] != LPI_SLEW_OFFSET_INVALID) && - lpi_slew_base[i]) - pad->lpi_slew_reg = devm_ioremap(dev, - lpi_slew_base[i], 0x4); - } - - state->chip = lpi_gpio_template; - state->chip.parent = dev; - state->chip.base = -1; - state->chip.ngpio = npins; - state->chip.label = dev_name(dev); - state->chip.of_gpio_n_cells = 2; - state->chip.can_sleep = false; - - mutex_init(&state->slew_access_lock); - mutex_init(&state->core_hw_vote_lock); - - state->ctrl = devm_pinctrl_register(dev, pctrldesc, state); - if (IS_ERR(state->ctrl)) - return PTR_ERR(state->ctrl); - - ret = gpiochip_add_data(&state->chip, state); - if (ret) { - dev_err(state->dev, "can't add gpio chip\n"); - goto err_chip; - } - - ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, npins); - if (ret) { - dev_err(dev, "failed to add pin range\n"); - goto err_range; - } - - lpi_dev = &pdev->dev; - lpi_dev_up = true; - ret = audio_notifier_register("lpi_tlmm", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - if (ret < 0) { - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - goto err_range; - } - - ret = snd_event_client_register(dev, &lpi_pinctrl_ssr_ops, NULL); - if (!ret) { - snd_event_notify(dev, SND_EVENT_UP); - } else { - dev_err(dev, "%s: snd_event registration failed, ret [%d]\n", - __func__, ret); - goto err_snd_evt; - } - - /* Register LPASS core hw vote */ - lpass_core_hw_vote = devm_clk_get(&pdev->dev, "lpass_core_hw_vote"); - if (IS_ERR(lpass_core_hw_vote)) { - ret = PTR_ERR(lpass_core_hw_vote); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_core_hw_vote", ret); - lpass_core_hw_vote = NULL; - ret = 0; - } - state->lpass_core_hw_vote = lpass_core_hw_vote; - - /* Register LPASS audio hw vote */ - lpass_audio_hw_vote = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote"); - if (IS_ERR(lpass_audio_hw_vote)) { - ret = PTR_ERR(lpass_audio_hw_vote); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_audio_hw_vote", ret); - lpass_audio_hw_vote = NULL; - ret = 0; - } - state->lpass_audio_hw_vote = lpass_audio_hw_vote; - - state->core_hw_vote_status = false; - pm_runtime_set_autosuspend_delay(&pdev->dev, LPI_AUTO_SUSPEND_DELAY); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - pm_runtime_enable(&pdev->dev); - - return 0; - -err_snd_evt: - audio_notifier_deregister("lpi_tlmm"); -err_range: - gpiochip_remove(&state->chip); -err_chip: - mutex_destroy(&state->core_hw_vote_lock); - mutex_destroy(&state->slew_access_lock); -err_io: - return ret; -} - -static int lpi_pinctrl_remove(struct platform_device *pdev) -{ - struct lpi_gpio_state *state = platform_get_drvdata(pdev); - - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - - snd_event_client_deregister(&pdev->dev); - audio_notifier_deregister("lpi_tlmm"); - gpiochip_remove(&state->chip); - mutex_destroy(&state->core_hw_vote_lock); - mutex_destroy(&state->slew_access_lock); - - return 0; -} - -static const struct of_device_id lpi_pinctrl_of_match[] = { - { .compatible = "qcom,lpi-pinctrl" }, /* Generic */ - { }, -}; - -MODULE_DEVICE_TABLE(of, lpi_pinctrl_of_match); - -int lpi_pinctrl_runtime_resume(struct device *dev) -{ - struct lpi_gpio_state *state = dev_get_drvdata(dev); - int ret = 0; - struct clk *hw_vote = state->lpass_core_hw_vote; - - trace_printk("%s: enter\n", __func__); - if (state->lpass_core_hw_vote == NULL) { - dev_dbg(dev, "%s: Invalid core hw node\n", __func__); - if (state->lpass_audio_hw_vote == NULL) { - dev_dbg(dev, "%s: Invalid audio hw node\n", __func__); - return 0; - } - hw_vote = state->lpass_audio_hw_vote; - } - - mutex_lock(&state->core_hw_vote_lock); - ret = digital_cdc_rsc_mgr_hw_vote_enable(hw_vote); - if (ret < 0) { - pm_runtime_set_autosuspend_delay(dev, - LPI_AUTO_SUSPEND_DELAY_ERROR); - dev_err(dev, "%s:lpass core hw island enable failed\n", - __func__); - goto exit; - } else { - state->core_hw_vote_status = true; - } - - pm_runtime_set_autosuspend_delay(dev, LPI_AUTO_SUSPEND_DELAY); - -exit: - mutex_unlock(&state->core_hw_vote_lock); - trace_printk("%s: exit\n", __func__); - return 0; -} - -int lpi_pinctrl_runtime_suspend(struct device *dev) -{ - struct lpi_gpio_state *state = dev_get_drvdata(dev); - struct clk *hw_vote = state->lpass_core_hw_vote; - - trace_printk("%s: enter\n", __func__); - if (state->lpass_core_hw_vote == NULL) { - dev_dbg(dev, "%s: Invalid core hw node\n", __func__); - if (state->lpass_audio_hw_vote == NULL) { - dev_dbg(dev, "%s: Invalid audio hw node\n", __func__); - return 0; - } - hw_vote = state->lpass_audio_hw_vote; - } - - mutex_lock(&state->core_hw_vote_lock); - if (state->core_hw_vote_status) { - digital_cdc_rsc_mgr_hw_vote_disable(hw_vote); - state->core_hw_vote_status = false; - } - mutex_unlock(&state->core_hw_vote_lock); - trace_printk("%s: exit\n", __func__); - return 0; -} - -static const struct dev_pm_ops lpi_pinctrl_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - lpi_pinctrl_suspend, - lpi_pinctrl_resume - ) - SET_RUNTIME_PM_OPS( - lpi_pinctrl_runtime_suspend, - lpi_pinctrl_runtime_resume, - NULL - ) -}; - -static struct platform_driver lpi_pinctrl_driver = { - .driver = { - .name = "qcom-lpi-pinctrl", - .pm = &lpi_pinctrl_dev_pm_ops, - .of_match_table = lpi_pinctrl_of_match, - .suppress_bind_attrs = true, - }, - .probe = lpi_pinctrl_probe, - .remove = lpi_pinctrl_remove, -}; - -module_platform_driver(lpi_pinctrl_driver); - -MODULE_DESCRIPTION("QTI LPI GPIO pin control driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/soc/pinctrl-utils.h b/techpack/audio/4.0/soc/pinctrl-utils.h deleted file mode 100644 index 8f9f2d28c5b8..000000000000 --- a/techpack/audio/4.0/soc/pinctrl-utils.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Utils functions to implement the pincontrol driver. - * - * Copyright (c) 2013, NVIDIA Corporation. - * - * Author: Laxman Dewangan - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, - * whether express or implied; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307, USA - */ -#ifndef __PINCTRL_UTILS_H__ -#define __PINCTRL_UTILS_H__ - -int pinctrl_utils_reserve_map(struct pinctrl_dev *pctldev, - struct pinctrl_map **map, unsigned *reserved_maps, - unsigned *num_maps, unsigned reserve); -int pinctrl_utils_add_map_mux(struct pinctrl_dev *pctldev, - struct pinctrl_map **map, unsigned *reserved_maps, - unsigned *num_maps, const char *group, - const char *function); -int pinctrl_utils_add_map_configs(struct pinctrl_dev *pctldev, - struct pinctrl_map **map, unsigned *reserved_maps, - unsigned *num_maps, const char *group, - unsigned long *configs, unsigned num_configs, - enum pinctrl_map_type type); -int pinctrl_utils_add_config(struct pinctrl_dev *pctldev, - unsigned long **configs, unsigned *num_configs, - unsigned long config); -void pinctrl_utils_free_map(struct pinctrl_dev *pctldev, - struct pinctrl_map *map, unsigned num_maps); - -#endif /* __PINCTRL_UTILS_H__ */ diff --git a/techpack/audio/4.0/soc/pinctrl-wcd.c b/techpack/audio/4.0/soc/pinctrl-wcd.c deleted file mode 100644 index 437563f0a8a0..000000000000 --- a/techpack/audio/4.0/soc/pinctrl-wcd.c +++ /dev/null @@ -1,428 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2016-2017, 2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "core.h" -#include "pinctrl-utils.h" - -#define WCD_REG_DIR_CTL WCD934X_CHIP_TIER_CTRL_GPIO_CTL_OE -#define WCD_REG_VAL_CTL WCD934X_CHIP_TIER_CTRL_GPIO_CTL_DATA -#define WCD_GPIO_PULL_UP 1 -#define WCD_GPIO_PULL_DOWN 2 -#define WCD_GPIO_BIAS_DISABLE 3 -#define WCD_GPIO_STRING_LEN 20 - -/** - * struct wcd_gpio_pad - keep current GPIO settings - * @offset: offset of gpio. - * @is_valid: Set to false, when GPIO in high Z state. - * @value: value of a pin - * @output_enabled: Set to true if GPIO is output and false if it is input - * @pullup: Constant current which flow through GPIO output buffer. - * @strength: Drive strength of a pin - */ -struct wcd_gpio_pad { - u16 offset; - bool is_valid; - bool value; - bool output_enabled; - unsigned int pullup; - unsigned int strength; -}; - -struct wcd_gpio_priv { - struct device *dev; - struct regmap *map; - struct pinctrl_dev *ctrl; - struct gpio_chip chip; -}; - -static int wcd_gpio_read(struct wcd_gpio_priv *priv_data, - struct wcd_gpio_pad *pad, unsigned int addr) -{ - unsigned int val; - int ret; - - ret = regmap_read(priv_data->map, addr, &val); - if (ret < 0) - dev_err(priv_data->dev, "%s: read 0x%x failed\n", - __func__, addr); - else - ret = (val >> pad->offset); - - return ret; -} - -static int wcd_gpio_write(struct wcd_gpio_priv *priv_data, - struct wcd_gpio_pad *pad, unsigned int addr, - unsigned int val) -{ - int ret; - - ret = regmap_update_bits(priv_data->map, addr, (1 << pad->offset), - val << pad->offset); - if (ret < 0) - dev_err(priv_data->dev, "write 0x%x failed\n", addr); - - return ret; -} - -static int wcd_get_groups_count(struct pinctrl_dev *pctldev) -{ - return pctldev->desc->npins; -} - -static const char *wcd_get_group_name(struct pinctrl_dev *pctldev, - unsigned int pin) -{ - return pctldev->desc->pins[pin].name; -} - -static int wcd_get_group_pins(struct pinctrl_dev *pctldev, unsigned int pin, - const unsigned int **pins, unsigned int *num_pins) -{ - *pins = &pctldev->desc->pins[pin].number; - *num_pins = 1; - return 0; -} - -static const struct pinctrl_ops wcd_pinctrl_ops = { - .get_groups_count = wcd_get_groups_count, - .get_group_name = wcd_get_group_name, - .get_group_pins = wcd_get_group_pins, - .dt_node_to_map = pinconf_generic_dt_node_to_map_group, - .dt_free_map = pinctrl_utils_free_map, -}; - -static int wcd_config_get(struct pinctrl_dev *pctldev, - unsigned int pin, unsigned long *config) -{ - unsigned int param = pinconf_to_config_param(*config); - struct wcd_gpio_pad *pad; - unsigned int arg; - - pad = pctldev->desc->pins[pin].drv_data; - - switch (param) { - case PIN_CONFIG_BIAS_PULL_DOWN: - arg = pad->pullup == WCD_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_DISABLE: - arg = pad->pullup = WCD_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_UP: - arg = pad->pullup == WCD_GPIO_PULL_UP; - break; - case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: - arg = !pad->is_valid; - break; - case PIN_CONFIG_INPUT_ENABLE: - arg = pad->output_enabled; - break; - case PIN_CONFIG_OUTPUT: - arg = pad->value; - break; - default: - return -EINVAL; - } - - *config = pinconf_to_config_packed(param, arg); - return 0; -} - -static int wcd_config_set(struct pinctrl_dev *pctldev, unsigned int pin, - unsigned long *configs, unsigned int nconfs) -{ - struct wcd_gpio_priv *priv_data = pinctrl_dev_get_drvdata(pctldev); - struct wcd_gpio_pad *pad; - unsigned int param, arg; - int i, ret; - - pad = pctldev->desc->pins[pin].drv_data; - - for (i = 0; i < nconfs; i++) { - param = pinconf_to_config_param(configs[i]); - arg = pinconf_to_config_argument(configs[i]); - - dev_dbg(priv_data->dev, "%s: param: %d arg: %d", - __func__, param, arg); - - switch (param) { - case PIN_CONFIG_BIAS_DISABLE: - pad->pullup = WCD_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_UP: - pad->pullup = WCD_GPIO_PULL_UP; - break; - case PIN_CONFIG_BIAS_PULL_DOWN: - pad->pullup = WCD_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: - pad->is_valid = false; - break; - case PIN_CONFIG_INPUT_ENABLE: - pad->output_enabled = false; - break; - case PIN_CONFIG_OUTPUT: - pad->output_enabled = true; - pad->value = arg; - break; - case PIN_CONFIG_DRIVE_STRENGTH: - pad->strength = arg; - break; - default: - ret = -EINVAL; - goto done; - } - } - - if (pad->output_enabled) { - ret = wcd_gpio_write(priv_data, pad, WCD_REG_DIR_CTL, - pad->output_enabled); - if (ret < 0) - goto done; - ret = wcd_gpio_write(priv_data, pad, WCD_REG_VAL_CTL, - pad->value); - } else - ret = wcd_gpio_write(priv_data, pad, WCD_REG_DIR_CTL, - pad->output_enabled); -done: - return ret; -} - -static const struct pinconf_ops wcd_pinconf_ops = { - .is_generic = true, - .pin_config_group_get = wcd_config_get, - .pin_config_group_set = wcd_config_set, -}; - -static int wcd_gpio_direction_input(struct gpio_chip *chip, unsigned int pin) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1); - - return wcd_config_set(priv_data->ctrl, pin, &config, 1); -} - -static int wcd_gpio_direction_output(struct gpio_chip *chip, - unsigned int pin, int val) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, val); - - return wcd_config_set(priv_data->ctrl, pin, &config, 1); -} - -static int wcd_gpio_get(struct gpio_chip *chip, unsigned int pin) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - struct wcd_gpio_pad *pad; - int value; - - pad = priv_data->ctrl->desc->pins[pin].drv_data; - - if (!pad->is_valid) - return -EINVAL; - - value = wcd_gpio_read(priv_data, pad, WCD_REG_VAL_CTL); - return value; -} - -static void wcd_gpio_set(struct gpio_chip *chip, unsigned int pin, int value) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, value); - - wcd_config_set(priv_data->ctrl, pin, &config, 1); -} - -static const struct gpio_chip wcd_gpio_chip = { - .direction_input = wcd_gpio_direction_input, - .direction_output = wcd_gpio_direction_output, - .get = wcd_gpio_get, - .set = wcd_gpio_set, -}; - -static int wcd_pinctrl_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct pinctrl_pin_desc *pindesc; - struct pinctrl_desc *pctrldesc; - struct wcd_gpio_pad *pad, *pads; - struct wcd_gpio_priv *priv_data; - int ret, i, j; - u32 npins; - char **name; - - ret = of_property_read_u32(dev->of_node, "qcom,num-gpios", &npins); - if (ret) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,num-gpios", dev->of_node->full_name); - ret = -EINVAL; - goto err_priv_alloc; - } - if (!npins) { - dev_err(dev, "%s: no.of pins are 0\n", __func__); - ret = -EINVAL; - goto err_priv_alloc; - } - - priv_data = devm_kzalloc(dev, sizeof(*priv_data), GFP_KERNEL); - if (!priv_data) { - ret = -ENOMEM; - goto err_priv_alloc; - } - - priv_data->dev = dev; - priv_data->map = dev_get_regmap(dev->parent, NULL); - if (!priv_data->map) { - dev_err(dev, "%s: failed to get regmap\n", __func__); - ret = -EINVAL; - goto err_regmap; - } - - pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL); - if (!pindesc) { - ret = -ENOMEM; - goto err_pinsec_alloc; - } - - pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL); - if (!pads) { - ret = -ENOMEM; - goto err_pads_alloc; - } - - pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL); - if (!pctrldesc) { - ret = -ENOMEM; - goto err_pinctrl_alloc; - } - - pctrldesc->pctlops = &wcd_pinctrl_ops; - pctrldesc->confops = &wcd_pinconf_ops; - pctrldesc->owner = THIS_MODULE; - pctrldesc->name = dev_name(dev); - pctrldesc->pins = pindesc; - pctrldesc->npins = npins; - - name = devm_kcalloc(dev, npins, sizeof(char *), GFP_KERNEL); - if (!name) { - ret = -ENOMEM; - goto err_name_alloc; - } - for (i = 0; i < npins; i++, pindesc++) { - name[i] = devm_kzalloc(dev, sizeof(char) * WCD_GPIO_STRING_LEN, - GFP_KERNEL); - if (!name[i]) { - ret = -ENOMEM; - goto err_pin; - } - pad = &pads[i]; - pindesc->drv_data = pad; - pindesc->number = i; - snprintf(name[i], (WCD_GPIO_STRING_LEN - 1), "gpio%d", (i+1)); - pindesc->name = name[i]; - pad->offset = i; - pad->is_valid = true; - } - - priv_data->chip = wcd_gpio_chip; - priv_data->chip.parent = dev; - priv_data->chip.base = -1; - priv_data->chip.ngpio = npins; - priv_data->chip.label = dev_name(dev); - priv_data->chip.of_gpio_n_cells = 2; - priv_data->chip.can_sleep = false; - - priv_data->ctrl = devm_pinctrl_register(dev, pctrldesc, priv_data); - if (IS_ERR(priv_data->ctrl)) { - dev_err(dev, "%s: failed to register to pinctrl\n", __func__); - ret = PTR_ERR(priv_data->ctrl); - goto err_pin; - } - - ret = gpiochip_add_data(&priv_data->chip, priv_data); - if (ret) { - dev_err(dev, "%s: can't add gpio chip\n", __func__); - goto err_pin; - } - - ret = gpiochip_add_pin_range(&priv_data->chip, dev_name(dev), 0, 0, - npins); - if (ret) { - dev_err(dev, "%s: failed to add pin range\n", __func__); - goto err_range; - } - platform_set_drvdata(pdev, priv_data); - - return 0; - -err_range: - gpiochip_remove(&priv_data->chip); -err_pin: - for (j = 0; j < i; j++) - devm_kfree(dev, name[j]); - devm_kfree(dev, name); -err_name_alloc: - devm_kfree(dev, pctrldesc); -err_pinctrl_alloc: - devm_kfree(dev, pads); -err_pads_alloc: - devm_kfree(dev, pindesc); -err_pinsec_alloc: -err_regmap: - devm_kfree(dev, priv_data); -err_priv_alloc: - return ret; -} - -static int wcd_pinctrl_remove(struct platform_device *pdev) -{ - struct wcd_gpio_priv *priv_data = platform_get_drvdata(pdev); - - gpiochip_remove(&priv_data->chip); - - return 0; -} - -static const struct of_device_id wcd_pinctrl_of_match[] = { - { .compatible = "qcom,wcd-pinctrl" }, - { }, -}; - -MODULE_DEVICE_TABLE(of, wcd_pinctrl_of_match); - -static struct platform_driver wcd_pinctrl_driver = { - .driver = { - .name = "qcom-wcd-pinctrl", - .of_match_table = wcd_pinctrl_of_match, - .suppress_bind_attrs = true, - }, - .probe = wcd_pinctrl_probe, - .remove = wcd_pinctrl_remove, -}; - -module_platform_driver(wcd_pinctrl_driver); - -MODULE_DESCRIPTION("Qualcomm Technologies, Inc WCD GPIO pin control driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/soc/regmap-swr.c b/techpack/audio/4.0/soc/regmap-swr.c deleted file mode 100644 index 4d8fbb8c708b..000000000000 --- a/techpack/audio/4.0/soc/regmap-swr.c +++ /dev/null @@ -1,208 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - - -static int regmap_swr_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_len) -{ - struct device *dev = context; - struct swr_device *swr = to_swr_device(dev); - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - size_t val_bytes; - int i, ret = 0; - u16 reg_addr = 0; - u8 *value; - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - addr_bytes = map->format.reg_bytes; - if (swr == NULL) { - dev_err(dev, "%s: swr device is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != addr_bytes) { - dev_err(dev, "%s: reg size %zd bytes not supported\n", - __func__, reg_size); - return -EINVAL; - } - reg_addr = *(u16 *)reg; - val_bytes = map->format.val_bytes; - /* val_len = val_bytes * val_count */ - for (i = 0; i < (val_len / val_bytes); i++) { - value = (u8 *)val + (val_bytes * i); - ret = swr_write(swr, swr->dev_num, (reg_addr + i), value); - if (ret < 0) { - dev_err(dev, "%s: write reg 0x%x failed, err %d\n", - __func__, (reg_addr + i), ret); - break; - } - } - return ret; -} - -static int regmap_swr_raw_multi_reg_write(void *context, const void *data, - size_t count) -{ - struct device *dev = context; - struct swr_device *swr = to_swr_device(dev); - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - size_t val_bytes; - size_t pad_bytes; - size_t num_regs; - int i = 0; - int ret = 0; - u16 *reg; - u8 *val; - u8 *buf; - - if (swr == NULL) { - dev_err(dev, "%s: swr device is NULL\n", __func__); - return -EINVAL; - } - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - addr_bytes = map->format.reg_bytes; - val_bytes = map->format.val_bytes; - pad_bytes = map->format.pad_bytes; - - if (addr_bytes + val_bytes + pad_bytes == 0) { - dev_err(dev, "%s: sum of addr, value and pad is 0\n", __func__); - return -EINVAL; - } - num_regs = count / (addr_bytes + val_bytes + pad_bytes); - - reg = kcalloc(num_regs, sizeof(u16), GFP_KERNEL); - if (!reg) - return -ENOMEM; - - val = kcalloc(num_regs, sizeof(u8), GFP_KERNEL); - if (!val) { - ret = -ENOMEM; - goto mem_fail; - } - - buf = (u8 *)data; - for (i = 0; i < num_regs; i++) { - reg[i] = *(u16 *)buf; - buf += (map->format.reg_bytes + map->format.pad_bytes); - val[i] = *buf; - buf += map->format.val_bytes; - } - ret = swr_bulk_write(swr, swr->dev_num, reg, val, num_regs); - if (ret) - dev_err(dev, "%s: multi reg write failed\n", __func__); - - kfree(val); -mem_fail: - kfree(reg); - return ret; -} - -static int regmap_swr_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - size_t val_bytes; - size_t pad_bytes; - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - addr_bytes = map->format.reg_bytes; - val_bytes = map->format.val_bytes; - pad_bytes = map->format.pad_bytes; - - WARN_ON(count < addr_bytes); - - if (count > (addr_bytes + val_bytes + pad_bytes)) - return regmap_swr_raw_multi_reg_write(context, data, count); - else - return regmap_swr_gather_write(context, data, addr_bytes, - (data + addr_bytes), - (count - addr_bytes)); -} - -static int regmap_swr_read(void *context, - const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct swr_device *swr = to_swr_device(dev); - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - int ret = 0; - u16 reg_addr = 0; - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - addr_bytes = map->format.reg_bytes; - if (swr == NULL) { - dev_err(dev, "%s: swr is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != addr_bytes) { - dev_err(dev, "%s: register size %zd bytes not supported\n", - __func__, reg_size); - return -EINVAL; - } - reg_addr = *(u16 *)reg; - ret = swr_read(swr, swr->dev_num, reg_addr, val, val_size); - if (ret < 0) - dev_err(dev, "%s: codec reg 0x%x read failed %d\n", - __func__, reg_addr, ret); - return ret; -} - -static struct regmap_bus regmap_swr = { - .write = regmap_swr_write, - .gather_write = regmap_swr_gather_write, - .read = regmap_swr_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -struct regmap *__regmap_init_swr(struct swr_device *swr, - const struct regmap_config *config, - struct lock_class_key *lock_key, - const char *lock_name) -{ - return __regmap_init(&swr->dev, ®map_swr, &swr->dev, config, - lock_key, lock_name); -} -EXPORT_SYMBOL(__regmap_init_swr); - -struct regmap *__devm_regmap_init_swr(struct swr_device *swr, - const struct regmap_config *config, - struct lock_class_key *lock_key, - const char *lock_name) -{ - return __devm_regmap_init(&swr->dev, ®map_swr, &swr->dev, config, - lock_key, lock_name); -} -EXPORT_SYMBOL(__devm_regmap_init_swr); - -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/soc/snd_event.c b/techpack/audio/4.0/soc/snd_event.c deleted file mode 100644 index ace76b2e85a7..000000000000 --- a/techpack/audio/4.0/soc/snd_event.c +++ /dev/null @@ -1,494 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include - -struct snd_event_client { - struct list_head node; - - struct device *dev; - const struct snd_event_ops *ops; - void *data; - - bool attached; - bool state; -}; - -struct snd_event_client_array { - struct device *dev; - struct snd_event_client *clnt; - void *data; - int (*compare)(struct device *, void *); -}; - -struct snd_event_clients { - size_t num_clients; - struct snd_event_client_array *cl_arr; -}; - -struct snd_master { - struct device *dev; - const struct snd_event_ops *ops; - void *data; - - bool state; - bool fwk_state; - bool clients_found; - struct snd_event_clients *clients; -}; - -static DEFINE_MUTEX(snd_event_mutex); -static LIST_HEAD(snd_event_client_list); -static struct snd_master *master; - -static struct snd_event_client *find_snd_event_client(struct device *dev) -{ - struct snd_event_client *c; - - list_for_each_entry(c, &snd_event_client_list, node) - if ((c->dev == dev) && c->ops) - return c; - - return NULL; -} - -static int check_and_update_fwk_state(void) -{ - bool new_fwk_state = true; - struct snd_event_client *c; - int ret = 0; - int i = 0; - - for (i = 0; i < master->clients->num_clients; i++) { - c = master->clients->cl_arr[i].clnt; - new_fwk_state &= c->state; - } - new_fwk_state &= master->state; - - if (master->fwk_state ^ new_fwk_state) { - if (new_fwk_state) { - for (i = 0; i < master->clients->num_clients; i++) { - c = master->clients->cl_arr[i].clnt; - if (c->ops->enable) { - ret = c->ops->enable(c->dev, c->data); - if (ret) { - dev_err(c->dev, - "%s: enable failed\n", - __func__); - goto dev_en_failed; - } - } - } - if (master->ops->enable) { - ret = master->ops->enable(master->dev, - master->data); - if (ret) { - dev_err(master->dev, - "%s: enable failed\n", - __func__); - goto mstr_en_failed; - } - } - } else { - if (master->ops->disable) - master->ops->disable(master->dev, - master->data); - for (i = 0; i < master->clients->num_clients; i++) { - c = master->clients->cl_arr[i].clnt; - if (c->ops->disable) - c->ops->disable(c->dev, c->data); - } - } - master->fwk_state = new_fwk_state; - } - goto exit; - -mstr_en_failed: - i = master->clients->num_clients; -dev_en_failed: - for (; i > 0; i--) { - c = master->clients->cl_arr[i - 1].clnt; - if (c->ops->disable) - c->ops->disable(c->dev, c->data); - } -exit: - return ret; -} - -static int snd_event_find_clients(struct snd_master *master) -{ - struct snd_event_clients *clients = master->clients; - int i = 0; - int ret = 0; - - for (i = 0; i < clients->num_clients; i++) { - struct snd_event_client_array *c_arr = &clients->cl_arr[i]; - struct snd_event_client *c; - - if (c_arr->dev) { - pr_err("%s: client already present dev=%pK\n", - __func__, c_arr->dev); - continue; - } - - list_for_each_entry(c, &snd_event_client_list, node) { - if (c->attached) - continue; - - if (c_arr->compare(c->dev, c_arr->data)) { - dev_dbg(master->dev, - "%s: found client, dev=%pK\n", - __func__, c->dev); - c_arr->dev = c->dev; - c_arr->clnt = c; - c->attached = true; - break; - } - } - if (!c_arr->dev) { - dev_dbg(master->dev, - "%s: failed to find some client\n", - __func__); - ret = -ENXIO; - break; - } - } - - return ret; -} - -/* - * snd_event_client_register - Register a client with the SND event FW - * - * @dev: Pointer to the "struct device" associated with the client - * @snd_ev_ops: Pointer to the snd_event_ops struct for the client containing - * callback functions - * @data: Pointer to any additional data that the caller wants to get back - * with callback functions - * - * Returns 0 on success or error on failure. - */ -int snd_event_client_register(struct device *dev, - const struct snd_event_ops *snd_ev_ops, - void *data) -{ - struct snd_event_client *c; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - c = kzalloc(sizeof(*c), GFP_KERNEL); - if (!c) - return -ENOMEM; - - c->dev = dev; - c->ops = snd_ev_ops; - c->data = data; - - dev_dbg(dev, "%s: adding client to SND event FW (ops %pK)\n", - __func__, snd_ev_ops); - - mutex_lock(&snd_event_mutex); - list_add_tail(&c->node, &snd_event_client_list); - - if (master && !master->clients_found) { - if (snd_event_find_clients(master)) { - dev_dbg(dev, "%s: Failed to find all clients\n", - __func__); - goto exit; - } - master->clients_found = true; - } - -exit: - mutex_unlock(&snd_event_mutex); - return 0; -} -EXPORT_SYMBOL(snd_event_client_register); - -/* - * snd_event_client_deregister - Remove a client from the SND event FW - * - * @dev: Pointer to the "struct device" associated with the client - * - * Returns 0 on success or error on failure. - */ -int snd_event_client_deregister(struct device *dev) -{ - struct snd_event_client *c; - int ret = 0; - int i = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (list_empty(&snd_event_client_list)) { - dev_dbg(dev, "%s: No SND client registered\n", __func__); - ret = -ENODEV; - goto exit; - } - - c = find_snd_event_client(dev); - if (!c || (c->dev != dev)) { - dev_dbg(dev, "%s: No matching snd dev found\n", __func__); - ret = -ENODEV; - goto exit; - } - - c->state = false; - - if (master && master->clients_found) { - struct snd_event_client *d; - bool dev_found = false; - - for (i = 0; i < master->clients->num_clients; i++) { - d = master->clients->cl_arr[i].clnt; - if (c->dev == d->dev) { - dev_found = true; - break; - } - } - if (dev_found) { - ret = check_and_update_fwk_state(); - master->clients_found = false; - } - } - - list_del(&c->node); - kfree(c); -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_client_deregister); - -/* - * snd_event_mstr_add_client - Add a client to the master's list of clients - * - * @snd_clients: list of clients associated with this master - * @compare: Pointer to the compare callback function that master will use to - * confirm the clients - * @data: Address to any additional data that the master wants to get back with - * compare callback functions - */ -void snd_event_mstr_add_client(struct snd_event_clients **snd_clients, - int (*compare)(struct device *, void *), - void *data) -{ - struct snd_event_clients *client = *snd_clients; - - if (IS_ERR(client)) { - pr_err("%s: snd_clients is invalid\n", __func__); - return; - } - - if (!client) { - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) { - *snd_clients = ERR_PTR(-ENOMEM); - return; - } - client->cl_arr = kzalloc(sizeof(struct snd_event_client_array), - GFP_KERNEL); - if (!client->cl_arr) { - *snd_clients = ERR_PTR(-ENOMEM); - return; - } - *snd_clients = client; - } else { - struct snd_event_client_array *new; - - new = krealloc(client->cl_arr, - (client->num_clients + 1) * sizeof(*new), - GFP_KERNEL | __GFP_ZERO); - if (!new) { - *snd_clients = ERR_PTR(-ENOMEM); - return; - } - client->cl_arr = new; - } - - client->cl_arr[client->num_clients].dev = NULL; - client->cl_arr[client->num_clients].data = data; - client->cl_arr[client->num_clients].compare = compare; - client->num_clients++; -} -EXPORT_SYMBOL(snd_event_mstr_add_client); - -/* - * snd_event_master_register - Register a master with the SND event FW - * - * @dev: Pointer to the "struct device" associated with the master - * @ops: Pointer to the snd_event_ops struct for the master containing - * callback functions - * @clients: List of clients for the master - * @data: Pointer to any additional data that the caller wants to get back - * with callback functions - * - * Returns 0 on success or error on failure. - * - * Prerequisite: - * clients list must not be empty. - * All clients for the master must have to be registered by calling - * snd_event_mstr_add_client() before calling this API to register a - * master with SND event fwk. - */ -int snd_event_master_register(struct device *dev, - const struct snd_event_ops *ops, - struct snd_event_clients *clients, - void *data) -{ - struct snd_master *new_master; - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (master) { - dev_err(dev, "%s: master already allocated with %pK\n", - __func__, master->dev); - ret = -EALREADY; - goto exit; - } - mutex_unlock(&snd_event_mutex); - - if (!clients || IS_ERR(clients)) { - dev_err(dev, "%s: Invalid clients ptr\n", __func__); - return -EINVAL; - } - - new_master = kzalloc(sizeof(*new_master), GFP_KERNEL); - if (!new_master) - return -ENOMEM; - - new_master->dev = dev; - new_master->ops = ops; - new_master->data = data; - new_master->clients = clients; - - dev_dbg(dev, "adding master to SND event FW (ops %pK)\n", ops); - - mutex_lock(&snd_event_mutex); - - master = new_master; - - ret = snd_event_find_clients(master); - if (ret) { - dev_dbg(dev, "%s: Failed to find all clients\n", __func__); - ret = 0; - goto exit; - } - master->clients_found = true; - -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_master_register); - -/* - * snd_event_master_deregister - Remove a master from the SND event FW - * - * @dev: Pointer to the "struct device" associated with the master - * - * Returns 0 on success or error on failure. - */ -int snd_event_master_deregister(struct device *dev) -{ - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (!master) { - dev_dbg(dev, "%s: No master found\n", __func__); - ret = -ENODEV; - goto exit; - } - - if (master->dev != dev) { - dev_dbg(dev, "%s: device is not a Master\n", __func__); - ret = -ENXIO; - goto exit; - } - - master->state = false; - - if (master && master->clients_found) - ret = check_and_update_fwk_state(); - - kfree(master->clients->cl_arr); - kfree(master->clients); - kfree(master); - master = NULL; -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_master_deregister); - -/* - * snd_event_notify - Update the state of the Master/client in the SND event FW - * - * @dev: Pointer to the "struct device" associated with the master/client - * @state: UP/DOWN state of the caller (master/client) - * - * Returns 0 on success or error on failure. - */ -int snd_event_notify(struct device *dev, unsigned int state) -{ - struct snd_event_client *c; - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (list_empty(&snd_event_client_list) && !master) { - dev_err(dev, "%s: No device registered\n", __func__); - ret = -ENODEV; - goto exit; - } - - c = find_snd_event_client(dev); - if (!c && (!master || (master->dev != dev))) { - dev_err(dev, "%s: No snd dev entry found\n", __func__); - ret = -ENXIO; - goto exit; - } - - if (c) - c->state = !!state; - else - master->state = !!state; - - if (master && master->clients_found) - ret = check_and_update_fwk_state(); - -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_notify); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SND event module"); diff --git a/techpack/audio/4.0/soc/soundwire.c b/techpack/audio/4.0/soc/soundwire.c deleted file mode 100644 index 72a94ace1482..000000000000 --- a/techpack/audio/4.0/soc/soundwire.c +++ /dev/null @@ -1,1123 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct boardinfo { - struct list_head list; - struct swr_boardinfo board_info; -}; - -static LIST_HEAD(board_list); -static LIST_HEAD(swr_master_list); -static DEFINE_MUTEX(board_lock); -static DEFINE_IDR(master_idr); -static DEFINE_MUTEX(swr_lock); - -static struct device_type swr_dev_type; - -#define SOUNDWIRE_NAME_SIZE 32 - -static void swr_master_put(struct swr_master *master) -{ - if (master) - put_device(&master->dev); -} - -static struct swr_master *swr_master_get(struct swr_master *master) -{ - if (!master || !get_device(&master->dev)) - return NULL; - return master; -} - -static void swr_dev_release(struct device *dev) -{ - struct swr_device *swr_dev = to_swr_device(dev); - struct swr_master *master; - - if (!swr_dev) - return; - master = swr_dev->master; - if (!master) - return; - mutex_lock(&master->mlock); - list_del_init(&swr_dev->dev_list); - mutex_unlock(&master->mlock); - swr_master_put(swr_dev->master); - kfree(swr_dev); -} - -/** - * swr_remove_device - remove a soundwire device - * @swr_dev: soundwire device to remove - * - * Remove a soundwire device. Go through the soundwire - * device list that master has and remove swr_dev from - * it. - */ -void swr_remove_device(struct swr_device *swr_dev) -{ - struct swr_device *swr_dev_loop, *safe; - - /* - * master still has reference to all nodes and deletes - * at platform_unregister, so need to init the deleted - * entry - */ - list_for_each_entry_safe(swr_dev_loop, safe, - &swr_dev->master->devices, - dev_list) { - if (swr_dev == swr_dev_loop) - list_del_init(&swr_dev_loop->dev_list); - } -} -EXPORT_SYMBOL(swr_remove_device); - -/** - * swr_new_device - instantiate a new soundwire device - * @master: Controller to which device is connected - * @info: Describes the soundwire device - * Context: can sleep - * - * Create a soundwire device. Binding is handled through driver model - * probe/remove methods. A driver may be bound to this device when - * the function gets returned. - * - * Returns a soundwire new device or NULL - */ -struct swr_device *swr_new_device(struct swr_master *master, - struct swr_boardinfo const *info) -{ - int result; - struct swr_device *swr; - - if (!master || !swr_master_get(master)) { - pr_err("%s: master is NULL\n", __func__); - return NULL; - } - - swr = kzalloc(sizeof(*swr), GFP_KERNEL); - if (!swr) { - put_device(&master->dev); - return NULL; - } - swr->master = master; - swr->addr = info->addr; - strlcpy(swr->name, info->name, sizeof(swr->name)); - swr->dev.type = &swr_dev_type; - swr->dev.parent = &master->dev; - swr->dev.bus = &soundwire_type; - swr->dev.release = swr_dev_release; - swr->dev.of_node = info->of_node; - mutex_lock(&master->mlock); - list_add_tail(&swr->dev_list, &master->devices); - mutex_unlock(&master->mlock); - - dev_set_name(&swr->dev, "%s.%lx", swr->name, swr->addr); - result = device_register(&swr->dev); - if (result) { - dev_err(&master->dev, "device [%s] register failed err %d\n", - swr->name, result); - goto err_out; - } - dev_dbg(&master->dev, "Device [%s] registered with bus id %s\n", - swr->name, dev_name(&swr->dev)); - return swr; - -err_out: - dev_dbg(&master->dev, "Failed to register swr device %s at 0x%lx %d\n", - swr->name, swr->addr, result); - swr_master_put(master); - kfree(swr); - return NULL; -} -EXPORT_SYMBOL(swr_new_device); - -/** - * of_register_swr_devices - register child devices on to the soundwire bus - * @master: pointer to soundwire master device - * - * Registers a soundwire device for each child node of master node which has - * a "swr-devid" property - * - */ -int of_register_swr_devices(struct swr_master *master) -{ - struct swr_device *swr; - struct device_node *node; - - if (!master->dev.of_node) - return -EINVAL; - - for_each_available_child_of_node(master->dev.of_node, node) { - struct swr_boardinfo info = {}; - u64 addr; - - dev_dbg(&master->dev, "of_swr:register %s\n", node->full_name); - - if (of_modalias_node(node, info.name, sizeof(info.name)) < 0) { - dev_err(&master->dev, "of_swr:modalias failure %s\n", - node->full_name); - continue; - } - if (of_property_read_u64(node, "reg", &addr)) { - dev_err(&master->dev, "of_swr:invalid reg %s\n", - node->full_name); - continue; - } - info.addr = addr; - info.of_node = of_node_get(node); - master->num_dev++; - swr = swr_new_device(master, &info); - if (!swr) { - dev_err(&master->dev, "of_swr: Register failed %s\n", - node->full_name); - of_node_put(node); - master->num_dev--; - continue; - } - } - return 0; -} -EXPORT_SYMBOL(of_register_swr_devices); - -/** - * swr_port_response - response from master to free the completed transaction - * @mstr: pointer to soundwire master device - * @tid: transaction id that indicates transaction to be freed. - * - * Master calls this function to free the compeleted transaction memory - */ -void swr_port_response(struct swr_master *mstr, u8 tid) -{ - struct swr_params *txn; - - txn = mstr->port_txn[tid]; - - if (txn == NULL) { - dev_err(&mstr->dev, "%s: transaction is already NULL\n", - __func__); - return; - } - mstr->port_txn[tid] = NULL; - kfree(txn); -} -EXPORT_SYMBOL(swr_port_response); - -/** - * swr_remove_from_group - remove soundwire slave devices from group - * @dev: pointer to the soundwire slave device - * dev_num: device number of the soundwire slave device - * - * Returns error code for failure and 0 for success - */ -int swr_remove_from_group(struct swr_device *dev, u8 dev_num) -{ - struct swr_master *master; - - if (!dev) - return -ENODEV; - - master = dev->master; - if (!master) - return -EINVAL; - - if (!dev->group_id) - return 0; - - if (master->gr_sid != dev_num) - return 0; - - if (master->remove_from_group && master->remove_from_group(master)) - dev_dbg(&master->dev, "%s: falling back to GROUP_NONE\n", - __func__); - - return 0; -} -EXPORT_SYMBOL(swr_remove_from_group); - -/** - * swr_slvdev_datapath_control - Enables/Disables soundwire slave device - * data path - * @dev: pointer to soundwire slave device - * @dev_num: device number of the soundwire slave device - * - * Returns error code for failure and 0 for success - */ -int swr_slvdev_datapath_control(struct swr_device *dev, u8 dev_num, - bool enable) -{ - struct swr_master *master; - int ret = 0; - - if (!dev) - return -ENODEV; - - master = dev->master; - if (!master) - return -EINVAL; - - if (dev->group_id) { - /* Broadcast */ - if (master->gr_sid != dev_num) { - if (!master->gr_sid) - master->gr_sid = dev_num; - else - return 0; - } - } - - if (master->slvdev_datapath_control) - ret = master->slvdev_datapath_control(master, enable); - - return ret; -} -EXPORT_SYMBOL(swr_slvdev_datapath_control); - -/** - * swr_connect_port - enable soundwire slave port(s) - * @dev: pointer to soundwire slave device - * @port_id: logical port id(s) of soundwire slave device - * @num_port: number of slave device ports need to be enabled - * @ch_mask: channels for each port that needs to be enabled - * @ch_rate: rate at which each port/channels operate - * @num_ch: number of channels for each port - * - * soundwire slave device call swr_connect_port API to enable all/some of - * its ports and corresponding channels and channel rate. This API will - * call master connect_port callback function to calculate frame structure - * and enable master and slave ports - */ -int swr_connect_port(struct swr_device *dev, u8 *port_id, u8 num_port, - u8 *ch_mask, u32 *ch_rate, u8 *num_ch, u8 *port_type) -{ - u8 i = 0; - int ret = 0; - struct swr_params *txn = NULL; - struct swr_params **temp_txn = NULL; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - if (num_port > SWR_MAX_DEV_PORT_NUM) { - dev_err(&master->dev, "%s: num_port %d exceeds max port %d\n", - __func__, num_port, SWR_MAX_DEV_PORT_NUM); - return -EINVAL; - } - - /* - * create "txn" to accommodate ports enablement of - * different slave devices calling swr_connect_port at the - * same time. Once master process the txn data, it calls - * swr_port_response() to free the transaction. Maximum - * of 256 transactions can be allocated. - */ - txn = kzalloc(sizeof(struct swr_params), GFP_KERNEL); - if (!txn) - return -ENOMEM; - - mutex_lock(&master->mlock); - for (i = 0; i < master->last_tid; i++) { - if (master->port_txn[i] == NULL) - break; - } - if (i >= master->last_tid) { - if (master->last_tid == 255) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Max tid reached\n", - __func__); - return -ENOMEM; - } - temp_txn = krealloc(master->port_txn, - (i + 1) * sizeof(struct swr_params *), - GFP_KERNEL); - if (!temp_txn) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Not able to allocate\n" - "master port transaction memory\n", - __func__); - return -ENOMEM; - } - master->port_txn = temp_txn; - master->last_tid++; - } - master->port_txn[i] = txn; - mutex_unlock(&master->mlock); - txn->tid = i; - - txn->dev_num = dev->dev_num; - txn->num_port = num_port; - for (i = 0; i < num_port; i++) { - txn->port_id[i] = port_id[i]; - txn->num_ch[i] = num_ch[i]; - txn->ch_rate[i] = ch_rate[i]; - txn->ch_en[i] = ch_mask[i]; - txn->port_type[i] = port_type[i]; - } - ret = master->connect_port(master, txn); - return ret; -} -EXPORT_SYMBOL(swr_connect_port); - -/** - * swr_disconnect_port - disable soundwire slave port(s) - * @dev: pointer to soundwire slave device - * @port_id: logical port id(s) of soundwire slave device - * @num_port: number of slave device ports need to be disabled - * - * soundwire slave device call swr_disconnect_port API to disable all/some of - * its ports. This API will call master disconnect_port callback function to - * disable master and slave port and (re)configure frame structure - */ -int swr_disconnect_port(struct swr_device *dev, u8 *port_id, u8 num_port, - u8 *ch_mask, u8 *port_type) -{ - u8 i = 0; - int ret; - struct swr_params *txn = NULL; - struct swr_params **temp_txn = NULL; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - - if (num_port > SWR_MAX_DEV_PORT_NUM) { - dev_err(&master->dev, "%s: num_port %d exceeds max port %d\n", - __func__, num_port, SWR_MAX_DEV_PORT_NUM); - return -EINVAL; - } - - txn = kzalloc(sizeof(struct swr_params), GFP_KERNEL); - if (!txn) - return -ENOMEM; - - mutex_lock(&master->mlock); - for (i = 0; i < master->last_tid; i++) { - if (master->port_txn[i] == NULL) - break; - } - if (i >= master->last_tid) { - if (master->last_tid == 255) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Max tid reached\n", - __func__); - return -ENOMEM; - } - temp_txn = krealloc(master->port_txn, - (i + 1) * sizeof(struct swr_params *), - GFP_KERNEL); - if (!temp_txn) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Not able to allocate\n" - "master port transaction memory\n", - __func__); - return -ENOMEM; - } - master->port_txn = temp_txn; - master->last_tid++; - } - master->port_txn[i] = txn; - mutex_unlock(&master->mlock); - txn->tid = i; - - txn->dev_num = dev->dev_num; - txn->num_port = num_port; - for (i = 0; i < num_port; i++) { - txn->port_id[i] = port_id[i]; - txn->ch_en[i] = ch_mask[i]; - txn->port_type[i] = port_type[i]; - } - ret = master->disconnect_port(master, txn); - return ret; -} -EXPORT_SYMBOL(swr_disconnect_port); - -/** - * swr_get_logical_dev_num - Get soundwire slave logical device number - * @dev: pointer to soundwire slave device - * @dev_id: physical device id of soundwire slave device - * @dev_num: pointer to logical device num of soundwire slave device - * - * This API will get the logical device number of soundwire slave device - */ -int swr_get_logical_dev_num(struct swr_device *dev, u64 dev_id, - u8 *dev_num) -{ - int ret = 0; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&master->mlock); - ret = master->get_logical_dev_num(master, dev_id, dev_num); - if (ret) { - pr_err("%s: Error %d to get logical addr for device %llx\n", - __func__, ret, dev_id); - } - mutex_unlock(&master->mlock); - return ret; -} -EXPORT_SYMBOL(swr_get_logical_dev_num); - -/** - * swr_device_wakeup_vote - Wakeup master and slave devices from clock stop - * @dev: pointer to soundwire slave device - * - * This API will wake up soundwire master and slave device(s) from - * clock stop. - */ -int swr_device_wakeup_vote(struct swr_device *dev) -{ - int ret = 0; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&master->mlock); - if (master->device_wakeup_vote) - master->device_wakeup_vote(master); - else - ret = -EINVAL; - mutex_unlock(&master->mlock); - - return ret; -} -EXPORT_SYMBOL(swr_device_wakeup_vote); - -/** - * swr_device_wakeup_unvote - Unvote Wakeup so that master and slave - * devices can go back to clock stop - * @dev: pointer to soundwire slave device - * - * This API will remove vote for wakeup so that soundwire master and - * slave device(s) can go back to clock stop. - */ -int swr_device_wakeup_unvote(struct swr_device *dev) -{ - int ret = 0; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&master->mlock); - if (master->device_wakeup_unvote) - master->device_wakeup_unvote(master); - else - ret = -EINVAL; - mutex_unlock(&master->mlock); - - return ret; -} -EXPORT_SYMBOL(swr_device_wakeup_unvote); - -/** - * swr_read - read soundwire slave device registers - * @dev: pointer to soundwire slave device - * @dev_num: logical device num of soundwire slave device - * @reg_addr: base register address that needs to be read - * @buf: pointer to store the values of registers from base address - * @len: length of the buffer - * - * This API will read the value of the register address from - * soundwire slave device - */ -int swr_read(struct swr_device *dev, u8 dev_num, u16 reg_addr, - void *buf, u32 len) -{ - struct swr_master *master = dev->master; - - if (!master) - return -EINVAL; - return master->read(master, dev_num, reg_addr, buf, len); -} -EXPORT_SYMBOL(swr_read); - -/** - * swr_bulk_write - write soundwire slave device registers - * @dev: pointer to soundwire slave device - * @dev_num: logical device num of soundwire slave device - * @reg_addr: register address of soundwire slave device - * @buf: contains value of register address - * @len: indicates number of registers - * - * This API will write the value of the register address to - * soundwire slave device - */ -int swr_bulk_write(struct swr_device *dev, u8 dev_num, void *reg, - const void *buf, size_t len) -{ - struct swr_master *master; - - if (!dev || !dev->master) - return -EINVAL; - - master = dev->master; - if (dev->group_id) { - if (master->gr_sid != dev_num) { - if (!master->gr_sid) - master->gr_sid = dev_num; - else - return 0; - } - dev_num = dev->group_id; - } - if (master->bulk_write) - return master->bulk_write(master, dev_num, reg, buf, len); - - return -EOPNOTSUPP; -} -EXPORT_SYMBOL(swr_bulk_write); - -/** - * swr_write - write soundwire slave device registers - * @dev: pointer to soundwire slave device - * @dev_num: logical device num of soundwire slave device - * @reg_addr: register address of soundwire slave device - * @buf: contains value of register address - * - * This API will write the value of the register address to - * soundwire slave device - */ -int swr_write(struct swr_device *dev, u8 dev_num, u16 reg_addr, - const void *buf) -{ - struct swr_master *master = dev->master; - - if (!master) - return -EINVAL; - - if (dev->group_id) { - if (master->gr_sid != dev_num) { - if (!master->gr_sid) - master->gr_sid = dev_num; - else - return 0; - } - dev_num = dev->group_id; - } - return master->write(master, dev_num, reg_addr, buf); -} -EXPORT_SYMBOL(swr_write); - -/** - * swr_device_up - Function to bringup the soundwire slave device - * @swr_dev: pointer to soundwire slave device - * Context: can sleep - * - * This API will be called by soundwire master to bringup the slave - * device. - */ -int swr_device_up(struct swr_device *swr_dev) -{ - struct device *dev; - const struct swr_driver *sdrv; - - if (!swr_dev) - return -EINVAL; - - dev = &swr_dev->dev; - sdrv = to_swr_driver(dev->driver); - if (!sdrv) - return 0; - - if (sdrv->device_up) - return sdrv->device_up(to_swr_device(dev)); - - return -ENODEV; -} -EXPORT_SYMBOL(swr_device_up); - -/** - * swr_device_down - Function to call soundwire slave device down - * @swr_dev: pointer to soundwire slave device - * Context: can sleep - * - * This API will be called by soundwire master to put slave device in - * shutdown state. - */ -int swr_device_down(struct swr_device *swr_dev) -{ - struct device *dev; - const struct swr_driver *sdrv; - - if (!swr_dev) - return -EINVAL; - - dev = &swr_dev->dev; - sdrv = to_swr_driver(dev->driver); - if (!sdrv) - return 0; - - if (sdrv->device_down) - return sdrv->device_down(to_swr_device(dev)); - - return -ENODEV; -} -EXPORT_SYMBOL(swr_device_down); - -/** - * swr_reset_device - reset soundwire slave device - * @swr_dev: pointer to soundwire slave device - * Context: can sleep - * - * This API will be called by soundwire master to reset the slave - * device when the slave device is not responding or in undefined - * state - */ -int swr_reset_device(struct swr_device *swr_dev) -{ - struct device *dev; - const struct swr_driver *sdrv; - - if (!swr_dev) - return -EINVAL; - - dev = &swr_dev->dev; - sdrv = to_swr_driver(dev->driver); - if (!sdrv) - return -EINVAL; - - if (sdrv->reset_device) - return sdrv->reset_device(to_swr_device(dev)); - - return -ENODEV; -} -EXPORT_SYMBOL(swr_reset_device); - -/** - * swr_set_device_group - Assign group id to the slave devices - * @swr_dev: pointer to soundwire slave device - * @id: group id to be assigned to slave device - * Context: can sleep - * - * This API will be called either from soundwire master or slave - * device to assign group id. - */ -int swr_set_device_group(struct swr_device *swr_dev, u8 id) -{ - struct swr_master *master; - - if (!swr_dev) - return -EINVAL; - - swr_dev->group_id = id; - master = swr_dev->master; - if (!id && master) - master->gr_sid = 0; - - return 0; -} -EXPORT_SYMBOL(swr_set_device_group); - -static int swr_drv_probe(struct device *dev) -{ - const struct swr_driver *sdrv = to_swr_driver(dev->driver); - - if (!sdrv) - return -EINVAL; - - if (sdrv->probe) - return sdrv->probe(to_swr_device(dev)); - return -ENODEV; -} - -static int swr_drv_remove(struct device *dev) -{ - const struct swr_driver *sdrv = to_swr_driver(dev->driver); - - if (!sdrv) - return -EINVAL; - - if (sdrv->remove) - return sdrv->remove(to_swr_device(dev)); - return -ENODEV; -} - -static void swr_drv_shutdown(struct device *dev) -{ - const struct swr_driver *sdrv = to_swr_driver(dev->driver); - - if (!sdrv) - return; - - if (sdrv->shutdown) - sdrv->shutdown(to_swr_device(dev)); -} - -/** - * swr_driver_register - register a soundwire driver - * @drv: the driver to register - * Context: can sleep - */ -int swr_driver_register(struct swr_driver *drv) -{ - drv->driver.bus = &soundwire_type; - if (drv->probe) - drv->driver.probe = swr_drv_probe; - if (drv->remove) - drv->driver.remove = swr_drv_remove; - - if (drv->shutdown) - drv->driver.shutdown = swr_drv_shutdown; - - return driver_register(&drv->driver); -} -EXPORT_SYMBOL(swr_driver_register); - -/** - * swr_driver_unregister - unregister a soundwire driver - * @drv: the driver to unregister - */ -void swr_driver_unregister(struct swr_driver *drv) -{ - if (drv) - driver_unregister(&drv->driver); -} -EXPORT_SYMBOL(swr_driver_unregister); - -static void swr_match_ctrl_to_boardinfo(struct swr_master *master, - struct swr_boardinfo *bi) -{ - struct swr_device *swr; - - if (master->bus_num != bi->bus_num) { - dev_dbg(&master->dev, - "%s: master# %d and bi# %d does not match\n", - __func__, master->bus_num, bi->bus_num); - return; - } - - swr = swr_new_device(master, bi); - if (!swr) - dev_err(&master->dev, "can't create new device for %s\n", - bi->swr_slave->name); -} - -/** - * swr_master_add_boarddevices - Add devices registered by board info - * @master: master to which these devices are to be added to. - * - * This API is called by master when it is up and running. If devices - * on a master were registered before master, this will make sure that - * they get probed when master is up. - */ -void swr_master_add_boarddevices(struct swr_master *master) -{ - struct boardinfo *bi; - - mutex_lock(&board_lock); - list_add_tail(&master->list, &swr_master_list); - list_for_each_entry(bi, &board_list, list) - swr_match_ctrl_to_boardinfo(master, &bi->board_info); - mutex_unlock(&board_lock); -} -EXPORT_SYMBOL(swr_master_add_boarddevices); - -struct swr_device *get_matching_swr_slave_device(struct device_node *np) -{ - struct swr_device *swr = NULL; - struct swr_master *master; - bool found = false; - - mutex_lock(&board_lock); - list_for_each_entry(master, &swr_master_list, list) { - mutex_lock(&master->mlock); - list_for_each_entry(swr, &master->devices, dev_list) { - if (swr->dev.of_node == np) { - found = true; - mutex_unlock(&master->mlock); - goto exit; - } - } - mutex_unlock(&master->mlock); - } -exit: - mutex_unlock(&board_lock); - if (!found) - return NULL; - return swr; -} -EXPORT_SYMBOL(get_matching_swr_slave_device); - -static void swr_unregister_device(struct swr_device *swr) -{ - if (swr) - device_unregister(&swr->dev); -} - -static void swr_master_release(struct device *dev) -{ - /* kfree of master done at swrm_remove of device */ -} - -#define swr_master_attr_gr NULL -static struct device_type swr_master_type = { - .groups = swr_master_attr_gr, - .release = swr_master_release, -}; - -static int __unregister(struct device *dev, void *null) -{ - swr_unregister_device(to_swr_device(dev)); - return 0; -} - -/** - * swr_unregister_master - unregister soundwire master controller - * @master: the master being unregistered - * - * This API is called by master controller driver to unregister - * master controller that was registered by swr_register_master API. - */ -void swr_unregister_master(struct swr_master *master) -{ - int dummy; - struct swr_master *m_ctrl; - - mutex_lock(&swr_lock); - m_ctrl = idr_find(&master_idr, master->bus_num); - mutex_unlock(&swr_lock); - if (m_ctrl != master) - return; - - mutex_lock(&board_lock); - list_del(&master->list); - mutex_unlock(&board_lock); - - /* free bus id */ - mutex_lock(&swr_lock); - idr_remove(&master_idr, master->bus_num); - mutex_unlock(&swr_lock); - - dummy = device_for_each_child(&master->dev, NULL, __unregister); - device_unregister(&master->dev); -} -EXPORT_SYMBOL(swr_unregister_master); - -/** - * swr_register_master - register soundwire master controller - * @master: master to be registered - * - * This API will register master with the framework. master->bus_num - * is the desired number with which soundwire framework registers the - * master. - */ -int swr_register_master(struct swr_master *master) -{ - int id; - int status = 0; - - mutex_lock(&swr_lock); - id = of_alias_get_id(master->dev.of_node, "swr"); - - if (id >= 0) - master->bus_num = id; - id = idr_alloc(&master_idr, master, master->bus_num, - master->bus_num + 1, GFP_KERNEL); - mutex_unlock(&swr_lock); - if (id < 0) - return id; - - master->bus_num = id; - /* Can't register until driver model init */ - if (WARN_ON(!soundwire_type.p)) { - status = -EAGAIN; - goto done; - } - - dev_set_name(&master->dev, "swr%u", master->bus_num); - master->dev.bus = &soundwire_type; - master->dev.type = &swr_master_type; - mutex_init(&master->mlock); - status = device_register(&master->dev); - if (status < 0) - goto done; - - INIT_LIST_HEAD(&master->devices); - pr_debug("%s: SWR master registered successfully %s\n", - __func__, dev_name(&master->dev)); - return 0; - -done: - idr_remove(&master_idr, master->bus_num); - return status; -} -EXPORT_SYMBOL(swr_register_master); - -#define swr_device_attr_gr NULL -#define swr_device_uevent NULL -static struct device_type swr_dev_type = { - .groups = swr_device_attr_gr, - .uevent = swr_device_uevent, - .release = swr_dev_release, -}; - -static const struct swr_device_id *swr_match(const struct swr_device_id *id, - const struct swr_device *swr_dev) -{ - while (id->name[0]) { - if (strcmp(swr_dev->name, id->name) == 0) - return id; - id++; - } - return NULL; -} - -static int swr_device_match(struct device *dev, struct device_driver *driver) -{ - struct swr_device *swr_dev; - struct swr_driver *drv = to_swr_driver(driver); - - if (!drv) - return -EINVAL; - - if (dev->type == &swr_dev_type) { - swr_dev = to_swr_device(dev); - if (!swr_dev) - return -EINVAL; - } else { - return 0; - } - - if (drv->id_table) - return swr_match(drv->id_table, swr_dev) != NULL; - - if (driver->name) - return strcmp(swr_dev->name, driver->name) == 0; - return 0; -} -#ifdef CONFIG_PM_SLEEP -static int swr_legacy_suspend(struct device *dev, pm_message_t mesg) -{ - struct swr_device *swr_dev = NULL; - struct swr_driver *driver; - - if (dev->type == &swr_dev_type) - swr_dev = to_swr_device(dev); - - if (!swr_dev || !dev->driver) - return 0; - - driver = to_swr_driver(dev->driver); - if (!driver->suspend) - return 0; - - return driver->suspend(swr_dev, mesg); -} - -static int swr_legacy_resume(struct device *dev) -{ - struct swr_device *swr_dev = NULL; - struct swr_driver *driver; - - if (dev->type == &swr_dev_type) - swr_dev = to_swr_device(dev); - - if (!swr_dev || !dev->driver) - return 0; - - driver = to_swr_driver(dev->driver); - if (!driver->resume) - return 0; - - return driver->resume(swr_dev); -} - -static int swr_pm_suspend(struct device *dev) -{ - const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; - - if (pm) - return pm_generic_suspend(dev); - else - return swr_legacy_suspend(dev, PMSG_SUSPEND); -} - -static int swr_pm_resume(struct device *dev) -{ - const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; - - if (pm) - return pm_generic_resume(dev); - else - return swr_legacy_resume(dev); -} -#else -#define swr_pm_suspend NULL -#define swr_pm_resume NULL -#endif /*CONFIG_PM_SLEEP*/ - -static const struct dev_pm_ops soundwire_pm = { - .suspend = swr_pm_suspend, - .resume = swr_pm_resume, - SET_RUNTIME_PM_OPS( - pm_generic_suspend, - pm_generic_resume, - NULL - ) -}; - -struct device soundwire_dev = { - .init_name = "soundwire", -}; - -struct bus_type soundwire_type = { - .name = "soundwire", - .match = swr_device_match, - .pm = &soundwire_pm, -}; -EXPORT_SYMBOL(soundwire_type); - -static void __exit soundwire_exit(void) -{ - device_unregister(&soundwire_dev); - bus_unregister(&soundwire_type); -} - -static int __init soundwire_init(void) -{ - int retval; - - retval = bus_register(&soundwire_type); - if (!retval) - retval = device_register(&soundwire_dev); - - if (retval) - bus_unregister(&soundwire_type); - - return retval; -} -module_init(soundwire_init); -module_exit(soundwire_exit); - - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Soundwire module"); -MODULE_ALIAS("platform:soundwire"); diff --git a/techpack/audio/4.0/soc/swr-mstr-ctrl.c b/techpack/audio/4.0/soc/swr-mstr-ctrl.c deleted file mode 100644 index 847c90d71fb3..000000000000 --- a/techpack/audio/4.0/soc/swr-mstr-ctrl.c +++ /dev/null @@ -1,3735 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "swrm_registers.h" -#include "swr-mstr-ctrl.h" - -#define SWR_NUM_PORTS 4 /* TODO - Get this info from DT */ - -#define SWRM_FRAME_SYNC_SEL 4000 /* 4KHz */ -#define SWRM_FRAME_SYNC_SEL_NATIVE 3675 /* 3.675KHz */ -#define SWRM_SYSTEM_RESUME_TIMEOUT_MS 700 -#define SWRM_SYS_SUSPEND_WAIT 1 - -#define SWRM_DSD_PARAMS_PORT 4 - -#define SWR_BROADCAST_CMD_ID 0x0F -#define SWR_AUTO_SUSPEND_DELAY 1 /* delay in sec */ -#define SWR_DEV_ID_MASK 0xFFFFFFFFFFFF -#define SWR_REG_VAL_PACK(data, dev, id, reg) \ - ((reg) | ((id) << 16) | ((dev) << 20) | ((data) << 24)) - -#define SWR_INVALID_PARAM 0xFF -#define SWR_HSTOP_MAX_VAL 0xF -#define SWR_HSTART_MIN_VAL 0x0 - -#define ERR_AUTO_SUSPEND_TIMER_VAL 0x1 - -#define SWRM_INTERRUPT_STATUS_MASK 0x1FDFD -#define SWRM_LINK_STATUS_RETRY_CNT 100 - -#define SWRM_ROW_48 48 -#define SWRM_ROW_50 50 -#define SWRM_ROW_64 64 -#define SWRM_COL_02 02 -#define SWRM_COL_16 16 - -/* pm runtime auto suspend timer in msecs */ -static int auto_suspend_timer = SWR_AUTO_SUSPEND_DELAY * 1000; -module_param(auto_suspend_timer, int, 0664); -MODULE_PARM_DESC(auto_suspend_timer, "timer for auto suspend"); - -enum { - SWR_NOT_PRESENT, /* Device is detached/not present on the bus */ - SWR_ATTACHED_OK, /* Device is attached */ - SWR_ALERT, /* Device alters master for any interrupts */ - SWR_RESERVED, /* Reserved */ -}; - -enum { - MASTER_ID_WSA = 1, - MASTER_ID_RX, - MASTER_ID_TX -}; - -enum { - ENABLE_PENDING, - DISABLE_PENDING -}; - -enum { - LPASS_HW_CORE, - LPASS_AUDIO_CORE, -}; - -#define TRUE 1 -#define FALSE 0 - -#define SWRM_MAX_PORT_REG 120 -#define SWRM_MAX_INIT_REG 11 - -#define MAX_FIFO_RD_FAIL_RETRY 3 - -static bool swrm_lock_sleep(struct swr_mstr_ctrl *swrm); -static void swrm_unlock_sleep(struct swr_mstr_ctrl *swrm); -static u32 swr_master_read(struct swr_mstr_ctrl *swrm, unsigned int reg_addr); -static void swr_master_write(struct swr_mstr_ctrl *swrm, u16 reg_addr, u32 val); - - -static u8 swrm_get_clk_div(int mclk_freq, int bus_clk_freq) -{ - int clk_div = 0; - u8 div_val = 0; - - if (!mclk_freq || !bus_clk_freq) - return 0; - - clk_div = (mclk_freq / bus_clk_freq); - - switch (clk_div) { - case 32: - div_val = 5; - break; - case 16: - div_val = 4; - break; - case 8: - div_val = 3; - break; - case 4: - div_val = 2; - break; - case 2: - div_val = 1; - break; - case 1: - default: - div_val = 0; - break; - } - - return div_val; -} - -static bool swrm_is_msm_variant(int val) -{ - return (val == SWRM_VERSION_1_3); -} - -#ifdef CONFIG_DEBUG_FS -static int swrm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t swrm_reg_show(struct swr_mstr_ctrl *swrm, char __user *ubuf, - size_t count, loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[SWR_MSTR_MAX_BUF_LEN]; - int rem = 0; - - if (!ubuf || !ppos) - return 0; - - i = ((int) *ppos + SWR_MSTR_START_REG_ADDR); - rem = i%4; - - if (rem) - i = (i - rem); - - for (; i <= SWR_MSTR_MAX_REG_ADDR; i += 4) { - usleep_range(100, 150); - reg_val = swr_master_read(swrm, i); - len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i, reg_val); - if (len < 0) { - pr_err("%s: fail to fill the buffer\n", __func__); - total = -EFAULT; - goto copy_err; - } - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t swrm_debug_reg_dump(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - struct swr_mstr_ctrl *swrm; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - swrm = file->private_data; - if (!swrm) - return -EINVAL; - - if (*ppos < 0) - return -EINVAL; - - return swrm_reg_show(swrm, ubuf, count, ppos); -} - -static ssize_t swrm_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_MSTR_RD_BUF_LEN]; - struct swr_mstr_ctrl *swrm = NULL; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - swrm = file->private_data; - if (!swrm) - return -EINVAL; - - if (*ppos < 0) - return -EINVAL; - - snprintf(lbuf, sizeof(lbuf), "0x%x\n", swrm->read_data); - - return simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); -} - -static ssize_t swrm_debug_peek_write(struct file *file, const char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_MSTR_RD_BUF_LEN]; - int rc; - u32 param[5]; - struct swr_mstr_ctrl *swrm = NULL; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - swrm = file->private_data; - if (!swrm) - return -EINVAL; - - if (*ppos < 0) - return -EINVAL; - - if (count > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, count); - if (rc) - return -EFAULT; - - lbuf[count] = '\0'; - rc = get_parameters(lbuf, param, 1); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && (rc == 0)) - swrm->read_data = swr_master_read(swrm, param[0]); - else - rc = -EINVAL; - - if (rc == 0) - rc = count; - else - dev_err(swrm->dev, "%s: rc = %d\n", __func__, rc); - - return rc; -} - -static ssize_t swrm_debug_write(struct file *file, - const char __user *ubuf, size_t count, loff_t *ppos) -{ - char lbuf[SWR_MSTR_WR_BUF_LEN]; - int rc; - u32 param[5]; - struct swr_mstr_ctrl *swrm; - - if (!file || !ppos || !ubuf) - return -EINVAL; - - swrm = file->private_data; - if (!swrm) - return -EINVAL; - - if (count > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, count); - if (rc) - return -EFAULT; - - lbuf[count] = '\0'; - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && - (param[1] <= 0xFFFFFFFF) && - (rc == 0)) - swr_master_write(swrm, param[0], param[1]); - else - rc = -EINVAL; - - if (rc == 0) - rc = count; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations swrm_debug_read_ops = { - .open = swrm_debug_open, - .write = swrm_debug_peek_write, - .read = swrm_debug_read, -}; - -static const struct file_operations swrm_debug_write_ops = { - .open = swrm_debug_open, - .write = swrm_debug_write, -}; - -static const struct file_operations swrm_debug_dump_ops = { - .open = swrm_debug_open, - .read = swrm_debug_reg_dump, -}; -#endif - -static void swrm_reg_dump(struct swr_mstr_ctrl *swrm, - u32 *reg, u32 *val, int len, const char* func) -{ - int i = 0; - - for (i = 0; i < len; i++) - dev_dbg(swrm->dev, "%s: reg = 0x%x val = 0x%x\n", - func, reg[i], val[i]); -} - -static bool is_swr_clk_needed(struct swr_mstr_ctrl *swrm) -{ - return ((swrm->version <= SWRM_VERSION_1_5_1) ? true : false); -} - -static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm, - int core_type, bool enable) -{ - int ret = 0; - - mutex_lock(&swrm->devlock); - if (core_type == LPASS_HW_CORE) { - if (swrm->lpass_core_hw_vote) { - if (enable) { - if (!swrm->dev_up) { - dev_dbg(swrm->dev, "%s: device is down or SSR state\n", - __func__); - trace_printk("%s: device is down or SSR state\n", - __func__); - mutex_unlock(&swrm->devlock); - return -ENODEV; - } - if (++swrm->hw_core_clk_en == 1) { - ret = - digital_cdc_rsc_mgr_hw_vote_enable( - swrm->lpass_core_hw_vote); - if (ret < 0) { - dev_err(swrm->dev, - "%s:lpass core hw enable failed\n", - __func__); - --swrm->hw_core_clk_en; - } - } - } else { - --swrm->hw_core_clk_en; - if (swrm->hw_core_clk_en < 0) - swrm->hw_core_clk_en = 0; - else if (swrm->hw_core_clk_en == 0) - digital_cdc_rsc_mgr_hw_vote_disable( - swrm->lpass_core_hw_vote); - } - } - } - if (core_type == LPASS_AUDIO_CORE) { - if (swrm->lpass_core_audio) { - if (enable) { - if (!swrm->dev_up) { - dev_dbg(swrm->dev, "%s: device is down or SSR state\n", - __func__); - trace_printk("%s: device is down or SSR state\n", - __func__); - mutex_unlock(&swrm->devlock); - return -ENODEV; - } - if (++swrm->aud_core_clk_en == 1) { - ret = - digital_cdc_rsc_mgr_hw_vote_enable( - swrm->lpass_core_audio); - if (ret < 0) { - dev_err(swrm->dev, - "%s:lpass audio hw enable failed\n", - __func__); - --swrm->aud_core_clk_en; - } - } - } else { - --swrm->aud_core_clk_en; - if (swrm->aud_core_clk_en < 0) - swrm->aud_core_clk_en = 0; - else if (swrm->aud_core_clk_en == 0) - digital_cdc_rsc_mgr_hw_vote_disable( - swrm->lpass_core_audio); - } - } - } - - mutex_unlock(&swrm->devlock); - dev_dbg(swrm->dev, "%s: hw_clk_en: %d audio_core_clk_en: %d\n", - __func__, swrm->hw_core_clk_en, swrm->aud_core_clk_en); - trace_printk("%s: hw_clk_en: %d audio_core_clk_en: %d\n", - __func__, swrm->hw_core_clk_en, swrm->aud_core_clk_en); - return ret; -} - -static int swrm_get_ssp_period(struct swr_mstr_ctrl *swrm, - int row, int col, - int frame_sync) -{ - if (!swrm || !row || !col || !frame_sync) - return 1; - - return ((swrm->bus_clk * 2) / ((row * col) * frame_sync)); -} - -static int swrm_core_vote_request(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - - if (!swrm->handle) - return -EINVAL; - - mutex_lock(&swrm->clklock); - if (!swrm->dev_up) { - ret = -ENODEV; - goto exit; - } - if (swrm->core_vote) { - ret = swrm->core_vote(swrm->handle, true); - if (ret) - dev_err_ratelimited(swrm->dev, - "%s: core vote request failed\n", __func__); - } -exit: - mutex_unlock(&swrm->clklock); - - return ret; -} - -static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable) -{ - int ret = 0; - - if (!swrm->clk || !swrm->handle) - return -EINVAL; - - mutex_lock(&swrm->clklock); - if (enable) { - if (!swrm->dev_up) { - ret = -ENODEV; - goto exit; - } - if (is_swr_clk_needed(swrm)) { - if (swrm->core_vote) { - ret = swrm->core_vote(swrm->handle, true); - if (ret) { - dev_err_ratelimited(swrm->dev, - "%s: core vote request failed\n", - __func__); - goto exit; - } - } - } - swrm->clk_ref_count++; - if (swrm->clk_ref_count == 1) { - trace_printk("%s: clock enable count %d", - __func__, swrm->clk_ref_count); - ret = swrm->clk(swrm->handle, true); - if (ret) { - dev_err_ratelimited(swrm->dev, - "%s: clock enable req failed", - __func__); - --swrm->clk_ref_count; - } - } - } else if (--swrm->clk_ref_count == 0) { - trace_printk("%s: clock disable count %d", - __func__, swrm->clk_ref_count); - swrm->clk(swrm->handle, false); - complete(&swrm->clk_off_complete); - } - if (swrm->clk_ref_count < 0) { - dev_err(swrm->dev, "%s: swrm clk count mismatch\n", __func__); - swrm->clk_ref_count = 0; - } - -exit: - mutex_unlock(&swrm->clklock); - return ret; -} - -static int swrm_ahb_write(struct swr_mstr_ctrl *swrm, - u16 reg, u32 *value) -{ - u32 temp = (u32)(*value); - int ret = 0; - - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) - goto err; - - if (is_swr_clk_needed(swrm)) { - ret = swrm_clk_request(swrm, TRUE); - if (ret) { - dev_err_ratelimited(swrm->dev, - "%s: clock request failed\n", - __func__); - goto err; - } - } else if (swrm_core_vote_request(swrm)) { - goto err; - } - - iowrite32(temp, swrm->swrm_dig_base + reg); - if (is_swr_clk_needed(swrm)) - swrm_clk_request(swrm, FALSE); -err: - mutex_unlock(&swrm->devlock); - return ret; -} - -static int swrm_ahb_read(struct swr_mstr_ctrl *swrm, - u16 reg, u32 *value) -{ - u32 temp = 0; - int ret = 0; - - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) - goto err; - - if (is_swr_clk_needed(swrm)) { - ret = swrm_clk_request(swrm, TRUE); - if (ret) { - dev_err_ratelimited(swrm->dev, "%s: clock request failed\n", - __func__); - goto err; - } - } else if (swrm_core_vote_request(swrm)) { - goto err; - } - - temp = ioread32(swrm->swrm_dig_base + reg); - *value = temp; - if (is_swr_clk_needed(swrm)) - swrm_clk_request(swrm, FALSE); -err: - mutex_unlock(&swrm->devlock); - return ret; -} - -static u32 swr_master_read(struct swr_mstr_ctrl *swrm, unsigned int reg_addr) -{ - u32 val = 0; - - if (swrm->read) - val = swrm->read(swrm->handle, reg_addr); - else - swrm_ahb_read(swrm, reg_addr, &val); - return val; -} - -static void swr_master_write(struct swr_mstr_ctrl *swrm, u16 reg_addr, u32 val) -{ - if (swrm->write) - swrm->write(swrm->handle, reg_addr, val); - else - swrm_ahb_write(swrm, reg_addr, &val); -} - -static int swr_master_bulk_write(struct swr_mstr_ctrl *swrm, u32 *reg_addr, - u32 *val, unsigned int length) -{ - int i = 0; - - if (swrm->bulk_write) - swrm->bulk_write(swrm->handle, reg_addr, val, length); - else { - mutex_lock(&swrm->iolock); - for (i = 0; i < length; i++) { - /* wait for FIFO WR command to complete to avoid overflow */ - /* - * Reduce sleep from 100us to 50us to meet KPIs - * This still meets the hardware spec - */ - usleep_range(50, 55); - swr_master_write(swrm, reg_addr[i], val[i]); - } - mutex_unlock(&swrm->iolock); - } - return 0; -} - -static bool swrm_check_link_status(struct swr_mstr_ctrl *swrm, bool active) -{ - int retry = SWRM_LINK_STATUS_RETRY_CNT; - int ret = false; - int status = active ? 0x1 : 0x0; - int comp_sts = 0x0; - - if ((swrm->version <= SWRM_VERSION_1_5_1)) - return true; - - do { - comp_sts = swr_master_read(swrm, SWRM_COMP_STATUS) & 0x01; - /* check comp status and status requested met */ - if ((comp_sts && status) || (!comp_sts && !status)) { - ret = true; - break; - } - retry--; - usleep_range(500, 510); - } while (retry); - - if (retry == 0) - dev_err(swrm->dev, "%s: link status not %s\n", __func__, - active ? "connected" : "disconnected"); - - return ret; -} - -static bool swrm_is_port_en(struct swr_master *mstr) -{ - return !!(mstr->num_port); -} - -static void copy_port_tables(struct swr_mstr_ctrl *swrm, - struct port_params *params) -{ - u8 i; - struct port_params *config = params; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - /* wsa uses single frame structure for all configurations */ - if (!swrm->mport_cfg[i].port_en) - continue; - swrm->mport_cfg[i].sinterval = config[i].si; - swrm->mport_cfg[i].offset1 = config[i].off1; - swrm->mport_cfg[i].offset2 = config[i].off2; - swrm->mport_cfg[i].hstart = config[i].hstart; - swrm->mport_cfg[i].hstop = config[i].hstop; - swrm->mport_cfg[i].blk_pack_mode = config[i].bp_mode; - swrm->mport_cfg[i].blk_grp_count = config[i].bgp_ctrl; - swrm->mport_cfg[i].word_length = config[i].wd_len; - swrm->mport_cfg[i].lane_ctrl = config[i].lane_ctrl; - } -} -static int swrm_get_port_config(struct swr_mstr_ctrl *swrm) -{ - struct port_params *params; - u32 usecase = 0; - - /* TODO - Send usecase information to avoid checking for master_id */ - if (swrm->mport_cfg[SWRM_DSD_PARAMS_PORT].port_en && - (swrm->master_id == MASTER_ID_RX)) - usecase = 1; - - params = swrm->port_param[usecase]; - copy_port_tables(swrm, params); - - return 0; -} - -static int swrm_get_master_port(struct swr_mstr_ctrl *swrm, u8 *mstr_port_id, - u8 *mstr_ch_mask, u8 mstr_prt_type, - u8 slv_port_id) -{ - int i, j; - *mstr_port_id = 0; - - for (i = 1; i <= swrm->num_ports; i++) { - for (j = 0; j < SWR_MAX_CH_PER_PORT; j++) { - if (swrm->port_mapping[i][j].port_type == mstr_prt_type) - goto found; - } - } -found: - if (i > swrm->num_ports || j == SWR_MAX_CH_PER_PORT) { - dev_err(swrm->dev, "%s: port type not supported by master\n", - __func__); - return -EINVAL; - } - /* id 0 corresponds to master port 1 */ - *mstr_port_id = i - 1; - *mstr_ch_mask = swrm->port_mapping[i][j].ch_mask; - - return 0; - -} - -static u32 swrm_get_packed_reg_val(u8 *cmd_id, u8 cmd_data, - u8 dev_addr, u16 reg_addr) -{ - u32 val; - u8 id = *cmd_id; - - if (id != SWR_BROADCAST_CMD_ID) { - if (id < 14) - id += 1; - else - id = 0; - *cmd_id = id; - } - val = SWR_REG_VAL_PACK(cmd_data, dev_addr, id, reg_addr); - - return val; -} - -static int swrm_cmd_fifo_rd_cmd(struct swr_mstr_ctrl *swrm, int *cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr, - u32 len) -{ - u32 val; - u32 retry_attempt = 0; - - mutex_lock(&swrm->iolock); - val = swrm_get_packed_reg_val(&swrm->rcmd_id, len, dev_addr, reg_addr); - if (swrm->read) { - /* skip delay if read is handled in platform driver */ - swr_master_write(swrm, SWRM_CMD_FIFO_RD_CMD, val); - } else { - /* wait for FIFO RD to complete to avoid overflow */ - usleep_range(100, 105); - swr_master_write(swrm, SWRM_CMD_FIFO_RD_CMD, val); - /* wait for FIFO RD CMD complete to avoid overflow */ - usleep_range(250, 255); - } -retry_read: - *cmd_data = swr_master_read(swrm, SWRM_CMD_FIFO_RD_FIFO_ADDR); - dev_dbg(swrm->dev, "%s: reg: 0x%x, cmd_id: 0x%x, rcmd_id: 0x%x, \ - dev_num: 0x%x, cmd_data: 0x%x\n", __func__, reg_addr, - cmd_id, swrm->rcmd_id, dev_addr, *cmd_data); - if ((((*cmd_data) & 0xF00) >> 8) != swrm->rcmd_id) { - if (retry_attempt < MAX_FIFO_RD_FAIL_RETRY) { - /* wait 500 us before retry on fifo read failure */ - usleep_range(500, 505); - if (retry_attempt == (MAX_FIFO_RD_FAIL_RETRY - 1)) { - swr_master_write(swrm, SWRM_CMD_FIFO_CMD, 0x1); - swr_master_write(swrm, SWRM_CMD_FIFO_RD_CMD, val); - } - retry_attempt++; - goto retry_read; - } else { - dev_err_ratelimited(swrm->dev, "%s: reg: 0x%x, cmd_id: 0x%x, \ - rcmd_id: 0x%x, dev_num: 0x%x, cmd_data: 0x%x\n", - __func__, reg_addr, cmd_id, swrm->rcmd_id, - dev_addr, *cmd_data); - - dev_err_ratelimited(swrm->dev, - "%s: failed to read fifo\n", __func__); - } - } - mutex_unlock(&swrm->iolock); - - return 0; -} - -static int swrm_cmd_fifo_wr_cmd(struct swr_mstr_ctrl *swrm, u8 cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr) -{ - u32 val; - int ret = 0; - - mutex_lock(&swrm->iolock); - if (!cmd_id) - val = swrm_get_packed_reg_val(&swrm->wcmd_id, cmd_data, - dev_addr, reg_addr); - else - val = swrm_get_packed_reg_val(&cmd_id, cmd_data, - dev_addr, reg_addr); - dev_dbg(swrm->dev, "%s: reg: 0x%x, cmd_id: 0x%x,wcmd_id: 0x%x, \ - dev_num: 0x%x, cmd_data: 0x%x\n", __func__, - reg_addr, cmd_id, swrm->wcmd_id,dev_addr, cmd_data); - swr_master_write(swrm, SWRM_CMD_FIFO_WR_CMD, val); - /* - * wait for FIFO WR command to complete to avoid overflow - * skip delay if write is handled in platform driver. - */ - if(!swrm->write) - usleep_range(150, 155); - if (cmd_id == 0xF) { - /* - * sleep for 10ms for MSM soundwire variant to allow broadcast - * command to complete. - */ - if (swrm_is_msm_variant(swrm->version)) - usleep_range(10000, 10100); - else - wait_for_completion_timeout(&swrm->broadcast, - (2 * HZ/10)); - } - mutex_unlock(&swrm->iolock); - return ret; -} - -static int swrm_read(struct swr_master *master, u8 dev_num, u16 reg_addr, - void *buf, u32 len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int val; - u8 *reg_val = (u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (!dev_num) { - dev_err(&master->dev, "%s: invalid slave dev num\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return 0; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - ret = swrm_cmd_fifo_rd_cmd(swrm, &val, dev_num, 0, reg_addr, len); - - if (!ret) - *reg_val = (u8)val; - - pm_runtime_put_autosuspend(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - return ret; -} - -static int swrm_write(struct swr_master *master, u8 dev_num, u16 reg_addr, - const void *buf) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - u8 reg_val = *(u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (!dev_num) { - dev_err(&master->dev, "%s: invalid slave dev num\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return 0; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - ret = swrm_cmd_fifo_wr_cmd(swrm, reg_val, dev_num, 0, reg_addr); - - pm_runtime_put_autosuspend(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - return ret; -} - -static int swrm_bulk_write(struct swr_master *master, u8 dev_num, void *reg, - const void *buf, size_t len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int i; - u32 *val; - u32 *swr_fifo_reg; - - if (!swrm || !swrm->handle) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (len <= 0) - return -EINVAL; - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return 0; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - if (dev_num) { - swr_fifo_reg = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!swr_fifo_reg) { - ret = -ENOMEM; - goto err; - } - val = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!val) { - ret = -ENOMEM; - goto mem_fail; - } - - for (i = 0; i < len; i++) { - val[i] = swrm_get_packed_reg_val(&swrm->wcmd_id, - ((u8 *)buf)[i], - dev_num, - ((u16 *)reg)[i]); - swr_fifo_reg[i] = SWRM_CMD_FIFO_WR_CMD; - } - ret = swr_master_bulk_write(swrm, swr_fifo_reg, val, len); - if (ret) { - dev_err(&master->dev, "%s: bulk write failed\n", - __func__); - ret = -EINVAL; - } - } else { - dev_err(&master->dev, - "%s: No support of Bulk write for master regs\n", - __func__); - ret = -EINVAL; - goto err; - } - kfree(val); -mem_fail: - kfree(swr_fifo_reg); -err: - pm_runtime_put_autosuspend(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - return ret; -} - -static u8 get_inactive_bank_num(struct swr_mstr_ctrl *swrm) -{ - return (swr_master_read(swrm, SWRM_MCP_STATUS) & - SWRM_MCP_STATUS_BANK_NUM_MASK) ? 0 : 1; -} - -static void enable_bank_switch(struct swr_mstr_ctrl *swrm, u8 bank, - u8 row, u8 col) -{ - swrm_cmd_fifo_wr_cmd(swrm, ((row << 3) | col), 0xF, 0xF, - SWRS_SCP_FRAME_CTRL_BANK(bank)); -} - -static void swrm_switch_frame_shape(struct swr_mstr_ctrl *swrm, int mclk_freq) -{ - u8 bank; - u32 n_row, n_col; - u32 value = 0; - u32 row = 0, col = 0; - u8 ssp_period = 0; - int frame_sync = SWRM_FRAME_SYNC_SEL; - - if (mclk_freq == MCLK_FREQ_NATIVE) { - n_col = SWR_MAX_COL; - col = SWRM_COL_16; - n_row = SWR_ROW_64; - row = SWRM_ROW_64; - frame_sync = SWRM_FRAME_SYNC_SEL_NATIVE; - } else { - n_col = SWR_MIN_COL; - col = SWRM_COL_02; - n_row = SWR_ROW_50; - row = SWRM_ROW_50; - frame_sync = SWRM_FRAME_SYNC_SEL; - } - - bank = get_inactive_bank_num(swrm); - ssp_period = swrm_get_ssp_period(swrm, row, col, frame_sync); - dev_dbg(swrm->dev, "%s: ssp_period: %d\n", __func__, ssp_period); - value = ((n_row << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (n_col << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - ((ssp_period - 1) << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - swr_master_write(swrm, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - enable_bank_switch(swrm, bank, n_row, n_col); -} - -static struct swr_port_info *swrm_get_port_req(struct swrm_mports *mport, - u8 slv_port, u8 dev_num) -{ - struct swr_port_info *port_req = NULL; - - list_for_each_entry(port_req, &mport->port_req_list, list) { - /* Store dev_id instead of dev_num if enumeration is changed run_time */ - if ((port_req->slave_port_id == slv_port) - && (port_req->dev_num == dev_num)) - return port_req; - } - return NULL; -} - -static bool swrm_remove_from_group(struct swr_master *master) -{ - struct swr_device *swr_dev; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - bool is_removed = false; - - if (!swrm) - goto end; - - mutex_lock(&swrm->mlock); - if ((swrm->num_rx_chs > 1) && - (swrm->num_rx_chs == swrm->num_cfg_devs)) { - list_for_each_entry(swr_dev, &master->devices, - dev_list) { - swr_dev->group_id = SWR_GROUP_NONE; - master->gr_sid = 0; - } - is_removed = true; - } - mutex_unlock(&swrm->mlock); - -end: - return is_removed; -} - -int swrm_get_clk_div_rate(int mclk_freq, int bus_clk_freq) -{ - if (!bus_clk_freq) - return mclk_freq; - - if (mclk_freq == SWR_CLK_RATE_9P6MHZ) { - if (bus_clk_freq <= SWR_CLK_RATE_0P6MHZ) - bus_clk_freq = SWR_CLK_RATE_0P6MHZ; - else if (bus_clk_freq <= SWR_CLK_RATE_1P2MHZ) - bus_clk_freq = SWR_CLK_RATE_1P2MHZ; - else if (bus_clk_freq <= SWR_CLK_RATE_2P4MHZ) - bus_clk_freq = SWR_CLK_RATE_2P4MHZ; - else if (bus_clk_freq <= SWR_CLK_RATE_4P8MHZ) - bus_clk_freq = SWR_CLK_RATE_4P8MHZ; - else if (bus_clk_freq <= SWR_CLK_RATE_9P6MHZ) - bus_clk_freq = SWR_CLK_RATE_9P6MHZ; - } else if (mclk_freq == SWR_CLK_RATE_11P2896MHZ) - bus_clk_freq = SWR_CLK_RATE_11P2896MHZ; - - return bus_clk_freq; -} - -static int swrm_update_bus_clk(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - int agg_clk = 0; - int i; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) - agg_clk += swrm->mport_cfg[i].ch_rate; - - if (agg_clk) - swrm->bus_clk = swrm_get_clk_div_rate(swrm->mclk_freq, - agg_clk); - else - swrm->bus_clk = swrm->mclk_freq; - - dev_dbg(swrm->dev, "%s: all_port_clk: %d, bus_clk: %d\n", - __func__, agg_clk, swrm->bus_clk); - - return ret; -} - -static void swrm_disable_ports(struct swr_master *master, - u8 bank) -{ - u32 value; - struct swr_port_info *port_req; - int i; - struct swrm_mports *mport; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - - for (i = 0; i < SWR_MSTR_PORT_LEN ; i++) { - - mport = &(swrm->mport_cfg[i]); - if (!mport->port_en) - continue; - - list_for_each_entry(port_req, &mport->port_req_list, list) { - /* skip ports with no change req's*/ - if (port_req->req_ch == port_req->ch_en) - continue; - - swrm_cmd_fifo_wr_cmd(swrm, port_req->req_ch, - port_req->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_req->slave_port_id, - bank)); - dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x\n", - __func__, i, - (SWRM_DP_PORT_CTRL_BANK(i + 1, bank))); - } - value = ((mport->req_ch) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - value |= ((mport->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((mport->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= mport->sinterval; - - swr_master_write(swrm, - 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); - } -} - -static void swrm_cleanup_disabled_port_reqs(struct swr_master *master) -{ - struct swr_port_info *port_req, *next; - int i; - struct swrm_mports *mport; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - mport = &(swrm->mport_cfg[i]); - list_for_each_entry_safe(port_req, next, - &mport->port_req_list, list) { - /* skip ports without new ch req */ - if (port_req->ch_en == port_req->req_ch) - continue; - - /* remove new ch req's*/ - port_req->ch_en = port_req->req_ch; - - /* If no streams enabled on port, remove the port req */ - if (port_req->ch_en == 0) { - list_del(&port_req->list); - kfree(port_req); - } - } - /* remove new ch req's on mport*/ - mport->ch_en = mport->req_ch; - - if (!(mport->ch_en)) { - mport->port_en = false; - master->port_en_mask &= ~i; - } - } -} -static void swrm_copy_data_port_config(struct swr_master *master, u8 bank) -{ - u32 value, slv_id; - struct swr_port_info *port_req; - int i; - struct swrm_mports *mport; - u32 reg[SWRM_MAX_PORT_REG]; - u32 val[SWRM_MAX_PORT_REG]; - int len = 0; - u8 hparams; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - mport = &(swrm->mport_cfg[i]); - if (!mport->port_en) - continue; - - list_for_each_entry(port_req, &mport->port_req_list, list) { - slv_id = port_req->slave_port_id; - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port_req->req_ch, - port_req->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(slv_id, - bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(mport->sinterval, - port_req->dev_num, 0x00, - SWRS_DP_SAMPLE_CONTROL_1_BANK(slv_id, - bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(mport->offset1, - port_req->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_1_BANK(slv_id, - bank)); - - if (mport->offset2 != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(mport->offset2, - port_req->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_2_BANK( - slv_id, bank)); - } - if (mport->hstart != SWR_INVALID_PARAM - && mport->hstop != SWR_INVALID_PARAM) { - hparams = (mport->hstart << 4) | mport->hstop; - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(hparams, - port_req->dev_num, 0x00, - SWRS_DP_HCONTROL_BANK(slv_id, - bank)); - } - if (mport->word_length != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->word_length, - port_req->dev_num, 0x00, - SWRS_DP_BLOCK_CONTROL_1(slv_id)); - } - if (mport->blk_pack_mode != SWR_INVALID_PARAM - && swrm->master_id != MASTER_ID_WSA) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->blk_pack_mode, - port_req->dev_num, 0x00, - SWRS_DP_BLOCK_CONTROL_3_BANK(slv_id, - bank)); - } - if (mport->blk_grp_count != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->blk_grp_count, - port_req->dev_num, 0x00, - SWRS_DP_BLOCK_CONTROL_2_BANK(slv_id, - bank)); - } - if (mport->lane_ctrl != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->lane_ctrl, - port_req->dev_num, 0x00, - SWRS_DP_LANE_CONTROL_BANK(slv_id, - bank)); - } - port_req->ch_en = port_req->req_ch; - } - value = ((mport->req_ch) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - - if (mport->offset2 != SWR_INVALID_PARAM) - value |= ((mport->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((mport->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= mport->sinterval; - - - 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); - - if (mport->lane_ctrl != SWR_INVALID_PARAM) { - 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); - val[len++] = mport->word_length; - } - - if (mport->blk_grp_count != SWR_INVALID_PARAM) { - 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); - hparams = (mport->hstop << 4) | mport->hstart; - val[len++] = hparams; - } else { - 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); - val[len++] = mport->blk_pack_mode; - } - mport->ch_en = mport->req_ch; - - } - swrm_reg_dump(swrm, reg, val, len, __func__); - swr_master_bulk_write(swrm, reg, val, len); -} - -static void swrm_apply_port_config(struct swr_master *master) -{ - u8 bank; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - - bank = get_inactive_bank_num(swrm); - dev_dbg(swrm->dev, "%s: enter bank: %d master_ports: %d\n", - __func__, bank, master->num_port); - - - swrm_cmd_fifo_wr_cmd(swrm, 0x01, 0xF, 0x00, - SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(bank)); - - swrm_copy_data_port_config(master, bank); -} - -static int swrm_slvdev_datapath_control(struct swr_master *master, bool enable) -{ - u8 bank; - u32 value = 0, n_row = 0, n_col = 0; - u32 row = 0, col = 0; - int bus_clk_div_factor; - int ret; - u8 ssp_period = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int mask = (SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_CLK_DIV_VALUE_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_BMSK); - u8 inactive_bank; - int frame_sync = SWRM_FRAME_SYNC_SEL; - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return -EFAULT; - } - - mutex_lock(&swrm->mlock); - - /* - * During disable if master is already down, which implies an ssr/pdr - * scenario, just mark ports as disabled and exit - */ - if (swrm->state == SWR_MSTR_SSR && !enable) { - if (!test_bit(DISABLE_PENDING, &swrm->port_req_pending)) { - dev_dbg(swrm->dev, "%s:No pending disconn port req\n", - __func__); - goto exit; - } - clear_bit(DISABLE_PENDING, &swrm->port_req_pending); - swrm_cleanup_disabled_port_reqs(master); - if (!swrm_is_port_en(master)) { - dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n", - __func__); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - } - goto exit; - } - bank = get_inactive_bank_num(swrm); - - if (enable) { - if (!test_bit(ENABLE_PENDING, &swrm->port_req_pending)) { - dev_dbg(swrm->dev, "%s:No pending connect port req\n", - __func__); - goto exit; - } - clear_bit(ENABLE_PENDING, &swrm->port_req_pending); - ret = swrm_get_port_config(swrm); - if (ret) { - /* cannot accommodate ports */ - swrm_cleanup_disabled_port_reqs(master); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - swr_master_write(swrm, SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, - SWRM_INTERRUPT_STATUS_MASK); - /* apply the new port config*/ - swrm_apply_port_config(master); - } else { - if (!test_bit(DISABLE_PENDING, &swrm->port_req_pending)) { - dev_dbg(swrm->dev, "%s:No pending disconn port req\n", - __func__); - goto exit; - } - clear_bit(DISABLE_PENDING, &swrm->port_req_pending); - swrm_disable_ports(master, bank); - } - dev_dbg(swrm->dev, "%s: enable: %d, cfg_devs: %d freq %d\n", - __func__, enable, swrm->num_cfg_devs, swrm->mclk_freq); - - if (enable) { - /* set col = 16 */ - n_col = SWR_MAX_COL; - col = SWRM_COL_16; - if (swrm->bus_clk == MCLK_FREQ_LP) { - n_col = SWR_MIN_COL; - col = SWRM_COL_02; - } - } else { - /* - * Do not change to col = 2 if there are still active ports - */ - if (!master->num_port) { - n_col = SWR_MIN_COL; - col = SWRM_COL_02; - } else { - n_col = SWR_MAX_COL; - col = SWRM_COL_16; - } - } - /* Use default 50 * x, frame shape. Change based on mclk */ - if (swrm->mclk_freq == MCLK_FREQ_NATIVE) { - dev_dbg(swrm->dev, "setting 64 x %d frameshape\n", col); - n_row = SWR_ROW_64; - row = SWRM_ROW_64; - frame_sync = SWRM_FRAME_SYNC_SEL_NATIVE; - } else { - dev_dbg(swrm->dev, "setting 50 x %d frameshape\n", col); - n_row = SWR_ROW_50; - row = SWRM_ROW_50; - frame_sync = SWRM_FRAME_SYNC_SEL; - } - ssp_period = swrm_get_ssp_period(swrm, row, col, frame_sync); - bus_clk_div_factor = swrm_get_clk_div(swrm->mclk_freq, swrm->bus_clk); - dev_dbg(swrm->dev, "%s: ssp_period: %d, bus_clk_div:%d\n", - __func__, ssp_period, bus_clk_div_factor); - value = swr_master_read(swrm, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank)); - value &= (~mask); - value |= ((n_row << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (n_col << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - (bus_clk_div_factor << - SWRM_MCP_FRAME_CTRL_BANK_CLK_DIV_VALUE_SHFT) | - ((ssp_period - 1) << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - swr_master_write(swrm, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - dev_dbg(swrm->dev, "%s: regaddr: 0x%x, value: 0x%x\n", __func__, - SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - enable_bank_switch(swrm, bank, n_row, n_col); - inactive_bank = bank ? 0 : 1; - - if (enable) - swrm_copy_data_port_config(master, inactive_bank); - else { - swrm_disable_ports(master, inactive_bank); - swrm_cleanup_disabled_port_reqs(master); - } - if (!swrm_is_port_en(master)) { - dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n", - __func__); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - } -exit: - mutex_unlock(&swrm->mlock); -return 0; -} - -static int swrm_connect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i; - struct swr_port_info *port_req; - int ret = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - struct swrm_mports *mport; - u8 mstr_port_id, mstr_ch_msk; - - dev_dbg(&master->dev, "%s: enter\n", __func__); - if (!portinfo) - return -EINVAL; - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - mutex_lock(&swrm->mlock); - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - mutex_unlock(&swrm->devlock); - if (!swrm_is_port_en(master)) - pm_runtime_get_sync(swrm->dev); - - for (i = 0; i < portinfo->num_port; i++) { - ret = swrm_get_master_port(swrm, &mstr_port_id, &mstr_ch_msk, - portinfo->port_type[i], - portinfo->port_id[i]); - if (ret) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - goto port_fail; - } - - mport = &(swrm->mport_cfg[mstr_port_id]); - /* get port req */ - port_req = swrm_get_port_req(mport, portinfo->port_id[i], - portinfo->dev_num); - if (!port_req) { - dev_dbg(&master->dev, "%s: new req:port id %d dev %d\n", - __func__, portinfo->port_id[i], - portinfo->dev_num); - port_req = kzalloc(sizeof(struct swr_port_info), - GFP_KERNEL); - if (!port_req) { - ret = -ENOMEM; - goto mem_fail; - } - port_req->dev_num = portinfo->dev_num; - port_req->slave_port_id = portinfo->port_id[i]; - port_req->num_ch = portinfo->num_ch[i]; - port_req->ch_rate = portinfo->ch_rate[i]; - port_req->ch_en = 0; - port_req->master_port_id = mstr_port_id; - list_add(&port_req->list, &mport->port_req_list); - } - port_req->req_ch |= portinfo->ch_en[i]; - - dev_dbg(&master->dev, - "%s: mstr port %d, slv port %d ch_rate %d num_ch %d\n", - __func__, port_req->master_port_id, - port_req->slave_port_id, port_req->ch_rate, - port_req->num_ch); - /* Put the port req on master port */ - mport = &(swrm->mport_cfg[mstr_port_id]); - mport->port_en = true; - mport->req_ch |= mstr_ch_msk; - master->port_en_mask |= (1 << mstr_port_id); - if (swrm->clk_stop_mode0_supp && - (mport->ch_rate < portinfo->ch_rate[i])) { - mport->ch_rate = portinfo->ch_rate[i]; - swrm_update_bus_clk(swrm); - } - } - master->num_port += portinfo->num_port; - set_bit(ENABLE_PENDING, &swrm->port_req_pending); - swr_port_response(master, portinfo->tid); - - mutex_unlock(&swrm->mlock); - return 0; - -port_fail: -mem_fail: - /* cleanup port reqs in error condition */ - swrm_cleanup_disabled_port_reqs(master); - mutex_unlock(&swrm->mlock); - return ret; -} - -static int swrm_disconnect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i, ret = 0; - struct swr_port_info *port_req; - struct swrm_mports *mport; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - u8 mstr_port_id, mstr_ch_mask; - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - if (!portinfo) { - dev_err(&master->dev, "%s: portinfo is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->mlock); - - for (i = 0; i < portinfo->num_port; i++) { - - ret = swrm_get_master_port(swrm, &mstr_port_id, &mstr_ch_mask, - portinfo->port_type[i], portinfo->port_id[i]); - if (ret) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - mport = &(swrm->mport_cfg[mstr_port_id]); - /* get port req */ - port_req = swrm_get_port_req(mport, portinfo->port_id[i], - portinfo->dev_num); - - if (!port_req) { - dev_err(&master->dev, "%s:port not enabled : port %d\n", - __func__, portinfo->port_id[i]); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - port_req->req_ch &= ~portinfo->ch_en[i]; - mport->req_ch &= ~mstr_ch_mask; - if (swrm->clk_stop_mode0_supp && !mport->req_ch) { - mport->ch_rate = 0; - swrm_update_bus_clk(swrm); - } - } - master->num_port -= portinfo->num_port; - set_bit(DISABLE_PENDING, &swrm->port_req_pending); - swr_port_response(master, portinfo->tid); - mutex_unlock(&swrm->mlock); - - return 0; -} - -static int swrm_find_alert_slave(struct swr_mstr_ctrl *swrm, - int status, u8 *devnum) -{ - int i; - bool found = false; - - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if ((status & SWRM_MCP_SLV_STATUS_MASK) == SWR_ALERT) { - *devnum = i; - found = true; - break; - } - status >>= 2; - } - if (found) - return 0; - else - return -EINVAL; -} - -static void swrm_enable_slave_irq(struct swr_mstr_ctrl *swrm) -{ - int i; - int status = 0; - - status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - if (!status) { - dev_dbg_ratelimited(swrm->dev, "%s: slaves status is 0x%x\n", - __func__, status); - return; - } - dev_dbg(swrm->dev, "%s: slave status: 0x%x\n", __func__, status); - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if (status & SWRM_MCP_SLV_STATUS_MASK) { - swrm_cmd_fifo_wr_cmd(swrm, 0xFF, i, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, i, 0x0, - SWRS_SCP_INT_STATUS_MASK_1); - } - status >>= 2; - } -} - -static int swrm_check_slave_change_status(struct swr_mstr_ctrl *swrm, - int status, u8 *devnum) -{ - int i; - int new_sts = status; - int ret = SWR_NOT_PRESENT; - - if (status != swrm->slave_status) { - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if ((status & SWRM_MCP_SLV_STATUS_MASK) != - (swrm->slave_status & SWRM_MCP_SLV_STATUS_MASK)) { - ret = (status & SWRM_MCP_SLV_STATUS_MASK); - *devnum = i; - break; - } - status >>= 2; - swrm->slave_status >>= 2; - } - swrm->slave_status = new_sts; - } - return ret; -} - -static irqreturn_t swr_mstr_interrupt(int irq, void *dev) -{ - struct swr_mstr_ctrl *swrm = dev; - u32 value, intr_sts, intr_sts_masked; - u32 temp = 0; - u32 status, chg_sts, i; - u8 devnum = 0; - int ret = IRQ_HANDLED; - struct swr_device *swr_dev; - struct swr_master *mstr = &swrm->master; - - trace_printk("%s enter\n", __func__); - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - return IRQ_NONE; - } - - mutex_lock(&swrm->reslock); - if (swrm_clk_request(swrm, true)) { - dev_err_ratelimited(swrm->dev, "%s:clk request failed\n", - __func__); - mutex_unlock(&swrm->reslock); - goto exit; - } - mutex_unlock(&swrm->reslock); - - intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS); - intr_sts_masked = intr_sts & swrm->intr_mask; - - trace_printk("%s: status: 0x%x \n", __func__, intr_sts_masked); -handle_irq: - for (i = 0; i < SWRM_INTERRUPT_MAX; i++) { - value = intr_sts_masked & (1 << i); - if (!value) - continue; - - switch (value) { - case SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ: - dev_dbg(swrm->dev, "Trigger irq to slave device\n"); - status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - ret = swrm_find_alert_slave(swrm, status, &devnum); - if (ret) { - dev_err_ratelimited(swrm->dev, - "no slave alert found.spurious interrupt\n"); - break; - } - swrm_cmd_fifo_rd_cmd(swrm, &temp, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1, 1); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - swrm_cmd_fifo_wr_cmd(swrm, 0x0, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - - - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - if (swr_dev->dev_num != devnum) - continue; - if (swr_dev->slave_irq) { - do { - swr_dev->slave_irq_pending = 0; - handle_nested_irq( - irq_find_mapping( - swr_dev->slave_irq, 0)); - } while (swr_dev->slave_irq_pending); - } - - } - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED: - dev_dbg(swrm->dev, "SWR new slave attached\n"); - break; - case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS: - status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - if (status == swrm->slave_status) { - dev_dbg(swrm->dev, - "%s: No change in slave status: %d\n", - __func__, status); - break; - } - chg_sts = swrm_check_slave_change_status(swrm, status, - &devnum); - switch (chg_sts) { - case SWR_NOT_PRESENT: - dev_dbg(swrm->dev, "device %d got detached\n", - devnum); - break; - case SWR_ATTACHED_OK: - dev_dbg(swrm->dev, "device %d got attached\n", - devnum); - /* enable host irq from slave device*/ - swrm_cmd_fifo_wr_cmd(swrm, 0xFF, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0, - SWRS_SCP_INT_STATUS_MASK_1); - - break; - case SWR_ALERT: - dev_dbg(swrm->dev, - "device %d has pending interrupt\n", - devnum); - break; - } - break; - case SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET: - dev_err_ratelimited(swrm->dev, - "SWR bus clsh detected\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO overflow\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO underflow\n"); - break; - case SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR write FIFO overflow\n"); - break; - case SWRM_INTERRUPT_STATUS_CMD_ERROR: - value = swr_master_read(swrm, SWRM_CMD_FIFO_STATUS); - dev_err_ratelimited(swrm->dev, - "SWR CMD error, fifo status 0x%x, flushing fifo\n", - value); - swr_master_write(swrm, SWRM_CMD_FIFO_CMD, 0x1); - break; - case SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION: - dev_err_ratelimited(swrm->dev, "SWR Port collision detected\n"); - swrm->intr_mask &= ~SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION; - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, swrm->intr_mask); - break; - case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH: - dev_dbg(swrm->dev, "SWR read enable valid mismatch\n"); - swrm->intr_mask &= - ~SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH; - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, swrm->intr_mask); - break; - case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED: - complete(&swrm->broadcast); - dev_dbg(swrm->dev, "SWR cmd id finished\n"); - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_AUTO_ENUM_FINISHED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL: - break; - case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED: - complete(&swrm->reset); - break; - case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED: - break; - default: - dev_err_ratelimited(swrm->dev, - "SWR unknown interrupt\n"); - ret = IRQ_NONE; - break; - } - } - swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, intr_sts); - swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, 0x0); - - intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS); - intr_sts_masked = intr_sts & swrm->intr_mask; - - if (intr_sts_masked) { - dev_dbg(swrm->dev, "%s: new interrupt received\n", __func__); - goto handle_irq; - } - - mutex_lock(&swrm->reslock); - swrm_clk_request(swrm, false); - mutex_unlock(&swrm->reslock); -exit: - swrm_unlock_sleep(swrm); - trace_printk("%s exit\n", __func__); - return ret; -} - -static irqreturn_t swr_mstr_interrupt_v2(int irq, void *dev) -{ - struct swr_mstr_ctrl *swrm = dev; - u32 value, intr_sts, intr_sts_masked; - u32 temp = 0; - u32 status, chg_sts, i; - u8 devnum = 0; - int ret = IRQ_HANDLED; - struct swr_device *swr_dev; - struct swr_master *mstr = &swrm->master; - - trace_printk("%s enter\n", __func__); - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - return IRQ_NONE; - } - - mutex_lock(&swrm->reslock); - if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) { - ret = IRQ_NONE; - goto exit; - } - if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) { - ret = IRQ_NONE; - goto err_audio_hw_vote; - } - ret = swrm_clk_request(swrm, true); - if (ret) { - dev_err(dev, "%s: swrm clk failed\n", __func__); - ret = IRQ_NONE; - goto err_audio_core_vote; - } - mutex_unlock(&swrm->reslock); - - intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS); - intr_sts_masked = intr_sts & swrm->intr_mask; - - dev_dbg(swrm->dev, "%s: status: 0x%x \n", __func__, intr_sts_masked); - trace_printk("%s: status: 0x%x \n", __func__, intr_sts_masked); -handle_irq: - for (i = 0; i < SWRM_INTERRUPT_MAX; i++) { - value = intr_sts_masked & (1 << i); - if (!value) - continue; - - switch (value) { - case SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ: - dev_dbg(swrm->dev, "%s: Trigger irq to slave device\n", - __func__); - status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - ret = swrm_find_alert_slave(swrm, status, &devnum); - if (ret) { - dev_err_ratelimited(swrm->dev, - "%s: no slave alert found.spurious interrupt\n", - __func__); - break; - } - swrm_cmd_fifo_rd_cmd(swrm, &temp, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1, 1); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - swrm_cmd_fifo_wr_cmd(swrm, 0x0, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - - - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - if (swr_dev->dev_num != devnum) - continue; - if (swr_dev->slave_irq) { - do { - swr_dev->slave_irq_pending = 0; - handle_nested_irq( - irq_find_mapping( - swr_dev->slave_irq, 0)); - } while (swr_dev->slave_irq_pending); - } - - } - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED: - dev_dbg(swrm->dev, "%s: SWR new slave attached\n", - __func__); - break; - case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS: - status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - swrm_enable_slave_irq(swrm); - if (status == swrm->slave_status) { - dev_dbg(swrm->dev, - "%s: No change in slave status: %d\n", - __func__, status); - break; - } - chg_sts = swrm_check_slave_change_status(swrm, status, - &devnum); - switch (chg_sts) { - case SWR_NOT_PRESENT: - dev_dbg(swrm->dev, - "%s: device %d got detached\n", - __func__, devnum); - if (devnum == 0) { - /* - * enable host irq if device 0 detached - * as hw will mask host_irq at slave - * but will not unmask it afterwards. - */ - swrm_cmd_fifo_wr_cmd(swrm, 0xFF, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0, - SWRS_SCP_INT_STATUS_MASK_1); - } - break; - case SWR_ATTACHED_OK: - dev_dbg(swrm->dev, - "%s: device %d got attached\n", - __func__, devnum); - /* enable host irq from slave device*/ - swrm_cmd_fifo_wr_cmd(swrm, 0xFF, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0, - SWRS_SCP_INT_STATUS_MASK_1); - - break; - case SWR_ALERT: - dev_dbg(swrm->dev, - "%s: device %d has pending interrupt\n", - __func__, devnum); - break; - } - break; - case SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET: - dev_err_ratelimited(swrm->dev, - "%s: SWR bus clsh detected\n", - __func__); - swrm->intr_mask &= - ~SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET; - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, - swrm->intr_mask); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "%s: SWR read FIFO overflow\n", - __func__); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW: - dev_dbg(swrm->dev, "%s: SWR read FIFO underflow\n", - __func__); - break; - case SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "%s: SWR write FIFO overflow\n", - __func__); - swr_master_write(swrm, SWRM_CMD_FIFO_CMD, 0x1); - break; - case SWRM_INTERRUPT_STATUS_CMD_ERROR: - value = swr_master_read(swrm, SWRM_CMD_FIFO_STATUS); - dev_err_ratelimited(swrm->dev, - "%s: SWR CMD error, fifo status 0x%x, flushing fifo\n", - __func__, value); - swr_master_write(swrm, SWRM_CMD_FIFO_CMD, 0x1); - break; - case SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION: - dev_err_ratelimited(swrm->dev, - "%s: SWR Port collision detected\n", - __func__); - swrm->intr_mask &= ~SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION; - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, swrm->intr_mask); - break; - case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH: - dev_dbg(swrm->dev, - "%s: SWR read enable valid mismatch\n", - __func__); - swrm->intr_mask &= - ~SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH; - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, swrm->intr_mask); - break; - case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED: - complete(&swrm->broadcast); - dev_dbg(swrm->dev, "%s: SWR cmd id finished\n", - __func__); - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED_V2: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL_V2: - break; - case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED_V2: - swrm_check_link_status(swrm, 0x1); - break; - case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED_V2: - break; - case SWRM_INTERRUPT_STATUS_EXT_CLK_STOP_WAKEUP: - if (swrm->state == SWR_MSTR_UP) - dev_dbg(swrm->dev, - "%s:SWR Master is already up\n", - __func__); - else - dev_err_ratelimited(swrm->dev, - "%s: SWR wokeup during clock stop\n", - __func__); - /* It might be possible the slave device gets reset - * and slave interrupt gets missed. So re-enable - * Host IRQ and process slave pending - * interrupts, if any. - */ - swrm_enable_slave_irq(swrm); - break; - default: - dev_err_ratelimited(swrm->dev, - "%s: SWR unknown interrupt value: %d\n", - __func__, value); - ret = IRQ_NONE; - break; - } - } - swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, intr_sts); - swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, 0x0); - - intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS); - intr_sts_masked = intr_sts & swrm->intr_mask; - - if (intr_sts_masked) { - dev_dbg(swrm->dev, "%s: new interrupt received 0x%x\n", - __func__, intr_sts_masked); - goto handle_irq; - } - - mutex_lock(&swrm->reslock); - swrm_clk_request(swrm, false); -err_audio_core_vote: - swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false); - -err_audio_hw_vote: - swrm_request_hw_vote(swrm, LPASS_HW_CORE, false); -exit: - mutex_unlock(&swrm->reslock); - swrm_unlock_sleep(swrm); - trace_printk("%s exit\n", __func__); - return ret; -} - -static irqreturn_t swrm_wakeup_interrupt(int irq, void *dev) -{ - struct swr_mstr_ctrl *swrm = dev; - int ret = IRQ_HANDLED; - - if (!swrm || !(swrm->dev)) { - pr_err("%s: swrm or dev is null\n", __func__); - return IRQ_NONE; - } - - trace_printk("%s enter\n", __func__); - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - if (swrm->wake_irq > 0) { - if (unlikely(!irq_get_irq_data(swrm->wake_irq))) { - pr_err("%s: irq data is NULL\n", __func__); - mutex_unlock(&swrm->devlock); - return IRQ_NONE; - } - mutex_lock(&swrm->irq_lock); - if (!irqd_irq_disabled( - irq_get_irq_data(swrm->wake_irq))) - disable_irq_nosync(swrm->wake_irq); - mutex_unlock(&swrm->irq_lock); - } - mutex_unlock(&swrm->devlock); - return ret; - } - mutex_unlock(&swrm->devlock); - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - goto exit; - } - if (swrm->wake_irq > 0) { - if (unlikely(!irq_get_irq_data(swrm->wake_irq))) { - pr_err("%s: irq data is NULL\n", __func__); - return IRQ_NONE; - } - mutex_lock(&swrm->irq_lock); - if (!irqd_irq_disabled( - irq_get_irq_data(swrm->wake_irq))) - disable_irq_nosync(swrm->wake_irq); - mutex_unlock(&swrm->irq_lock); - } - pm_runtime_get_sync(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - swrm_unlock_sleep(swrm); -exit: - trace_printk("%s exit\n", __func__); - return ret; -} - -static void swrm_wakeup_work(struct work_struct *work) -{ - struct swr_mstr_ctrl *swrm; - - swrm = container_of(work, struct swr_mstr_ctrl, - wakeup_work); - if (!swrm || !(swrm->dev)) { - pr_err("%s: swrm or dev is null\n", __func__); - return; - } - - trace_printk("%s enter\n", __func__); - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - goto exit; - } - mutex_unlock(&swrm->devlock); - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - goto exit; - } - pm_runtime_get_sync(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - swrm_unlock_sleep(swrm); -exit: - trace_printk("%s exit\n", __func__); - pm_relax(swrm->dev); -} - -static int swrm_get_device_status(struct swr_mstr_ctrl *swrm, u8 devnum) -{ - u32 val; - - swrm->slave_status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - val = (swrm->slave_status >> (devnum * 2)); - val &= SWRM_MCP_SLV_STATUS_MASK; - return val; -} - -static int swrm_get_logical_dev_num(struct swr_master *mstr, u64 dev_id, - u8 *dev_num) -{ - int i; - u64 id = 0; - int ret = -EINVAL; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - struct swr_device *swr_dev; - u32 num_dev = 0; - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return ret; - } - if (swrm->num_dev) - num_dev = swrm->num_dev; - else - num_dev = mstr->num_dev; - - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return ret; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - for (i = 1; i < (num_dev + 1); i++) { - id = ((u64)(swr_master_read(swrm, - SWRM_ENUMERATOR_SLAVE_DEV_ID_2(i))) << 32); - id |= swr_master_read(swrm, - SWRM_ENUMERATOR_SLAVE_DEV_ID_1(i)); - - /* - * As pm_runtime_get_sync() brings all slaves out of reset - * update logical device number for all slaves. - */ - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - if (swr_dev->addr == (id & SWR_DEV_ID_MASK)) { - u32 status = swrm_get_device_status(swrm, i); - - if ((status == 0x01) || (status == 0x02)) { - swr_dev->dev_num = i; - if ((id & SWR_DEV_ID_MASK) == dev_id) { - *dev_num = i; - ret = 0; - } - dev_dbg(swrm->dev, - "%s: devnum %d is assigned for dev addr %lx\n", - __func__, i, swr_dev->addr); - } - } - } - } - if (ret) - dev_err(swrm->dev, "%s: device 0x%llx is not ready\n", - __func__, dev_id); - - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - return ret; -} - -static void swrm_device_wakeup_vote(struct swr_master *mstr) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - return; - } - mutex_lock(&swrm->reslock); - if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) - dev_err(swrm->dev, "%s:lpass core hw enable failed\n", - __func__); - if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) - dev_err(swrm->dev, "%s:lpass audio hw enable failed\n", - __func__); - mutex_unlock(&swrm->reslock); - - pm_runtime_get_sync(swrm->dev); -} - -static void swrm_device_wakeup_unvote(struct swr_master *mstr) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - - mutex_lock(&swrm->reslock); - swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false); - swrm_request_hw_vote(swrm, LPASS_HW_CORE, false); - mutex_unlock(&swrm->reslock); - - swrm_unlock_sleep(swrm); -} - -static int swrm_master_init(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - u32 val; - u8 row_ctrl = SWR_ROW_50; - u8 col_ctrl = SWR_MIN_COL; - u8 ssp_period = 1; - u8 retry_cmd_num = 3; - u32 reg[SWRM_MAX_INIT_REG]; - u32 value[SWRM_MAX_INIT_REG]; - u32 temp = 0; - int len = 0; - - ssp_period = swrm_get_ssp_period(swrm, SWRM_ROW_50, - SWRM_COL_02, SWRM_FRAME_SYNC_SEL); - dev_dbg(swrm->dev, "%s: ssp_period: %d\n", __func__, ssp_period); - - /* Clear Rows and Cols */ - val = ((row_ctrl << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (col_ctrl << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - ((ssp_period - 1) << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - - reg[len] = SWRM_MCP_FRAME_CTRL_BANK_ADDR(0); - value[len++] = val; - - /* Set Auto enumeration flag */ - reg[len] = SWRM_ENUMERATOR_CFG_ADDR; - value[len++] = 1; - - /* Configure No pings */ - val = swr_master_read(swrm, SWRM_MCP_CFG_ADDR); - val &= ~SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK; - val |= (0x1f << SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT); - reg[len] = SWRM_MCP_CFG_ADDR; - value[len++] = val; - - /* Configure number of retries of a read/write cmd */ - val = (retry_cmd_num << SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT); - reg[len] = SWRM_CMD_FIFO_CFG_ADDR; - value[len++] = val; - - reg[len] = SWRM_MCP_BUS_CTRL_ADDR; - value[len++] = 0x2; - - /* Set IRQ to PULSE */ - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x02; - - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x03; - - reg[len] = SWRM_INTERRUPT_CLEAR; - value[len++] = 0xFFFFFFFF; - - swrm->intr_mask = SWRM_INTERRUPT_STATUS_MASK; - /* Mask soundwire interrupts */ - reg[len] = SWRM_INTERRUPT_MASK_ADDR; - value[len++] = swrm->intr_mask; - - reg[len] = SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN; - value[len++] = swrm->intr_mask; - - swr_master_bulk_write(swrm, reg, value, len); - - if (!swrm_check_link_status(swrm, 0x1)) { - dev_err(swrm->dev, - "%s: swr link failed to connect\n", - __func__); - return -EINVAL; - } - /* - * For SWR master version 1.5.1, continue - * execute on command ignore. - */ - /* Execute it for versions >= 1.5.1 */ - if (swrm->version >= SWRM_VERSION_1_5_1) - swr_master_write(swrm, SWRM_CMD_FIFO_CFG_ADDR, - (swr_master_read(swrm, - SWRM_CMD_FIFO_CFG_ADDR) | 0x80000000)); - - /* SW workaround to gate hw_ctl for SWR version >=1.6 */ - if (swrm->version >= SWRM_VERSION_1_6) { - if (swrm->swrm_hctl_reg) { - temp = ioread32(swrm->swrm_hctl_reg); - temp &= 0xFFFFFFFD; - iowrite32(temp, swrm->swrm_hctl_reg); - } - } - return ret; -} - -static int swrm_event_notify(struct notifier_block *self, - unsigned long action, void *data) -{ - struct swr_mstr_ctrl *swrm = container_of(self, struct swr_mstr_ctrl, - event_notifier); - - if (!swrm || !(swrm->dev)) { - pr_err("%s: swrm or dev is NULL\n", __func__); - return -EINVAL; - } - switch (action) { - case MSM_AUD_DC_EVENT: - schedule_work(&(swrm->dc_presence_work)); - break; - case SWR_WAKE_IRQ_EVENT: - if (swrm->ipc_wakeup && !swrm->ipc_wakeup_triggered) { - swrm->ipc_wakeup_triggered = true; - pm_stay_awake(swrm->dev); - schedule_work(&swrm->wakeup_work); - } - break; - default: - dev_err(swrm->dev, "%s: invalid event type: %lu\n", - __func__, action); - return -EINVAL; - } - - return 0; -} - -static void swrm_notify_work_fn(struct work_struct *work) -{ - struct swr_mstr_ctrl *swrm = container_of(work, struct swr_mstr_ctrl, - dc_presence_work); - - if (!swrm || !swrm->pdev) { - pr_err("%s: swrm or pdev is NULL\n", __func__); - return; - } - swrm_wcd_notify(swrm->pdev, SWR_DEVICE_DOWN, NULL); -} - -static int swrm_probe(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm; - struct swr_ctrl_platform_data *pdata; - u32 i, num_ports, port_num, port_type, ch_mask, swrm_hctl_reg = 0; - u32 *temp, map_size, map_length, ch_iter = 0, old_port_num = 0; - int ret = 0; - struct clk *lpass_core_hw_vote = NULL; - struct clk *lpass_core_audio = NULL; - - /* Allocate soundwire master driver structure */ - swrm = devm_kzalloc(&pdev->dev, sizeof(struct swr_mstr_ctrl), - GFP_KERNEL); - if (!swrm) { - ret = -ENOMEM; - goto err_memory_fail; - } - swrm->pdev = pdev; - swrm->dev = &pdev->dev; - platform_set_drvdata(pdev, swrm); - swr_set_ctrl_data(&swrm->master, swrm); - pdata = dev_get_platdata(&pdev->dev); - if (!pdata) { - dev_err(&pdev->dev, "%s: pdata from parent is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->handle = (void *)pdata->handle; - if (!swrm->handle) { - dev_err(&pdev->dev, "%s: swrm->handle is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - ret = of_property_read_u32(pdev->dev.of_node, "qcom,swr_master_id", - &swrm->master_id); - if (ret) { - dev_err(&pdev->dev, "%s: failed to get master id\n", __func__); - goto err_pdata_fail; - } - if (!(of_property_read_u32(pdev->dev.of_node, - "swrm-io-base", &swrm->swrm_base_reg))) - ret = of_property_read_u32(pdev->dev.of_node, - "swrm-io-base", &swrm->swrm_base_reg); - if (!swrm->swrm_base_reg) { - swrm->read = pdata->read; - if (!swrm->read) { - dev_err(&pdev->dev, "%s: swrm->read is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->write = pdata->write; - if (!swrm->write) { - dev_err(&pdev->dev, "%s: swrm->write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->bulk_write = pdata->bulk_write; - if (!swrm->bulk_write) { - dev_err(&pdev->dev, "%s: swrm->bulk_write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - } else { - swrm->swrm_dig_base = devm_ioremap(&pdev->dev, - swrm->swrm_base_reg, SWRM_MAX_REGISTER); - } - - swrm->core_vote = pdata->core_vote; - if (!(of_property_read_u32(pdev->dev.of_node, - "qcom,swrm-hctl-reg", &swrm_hctl_reg))) - swrm->swrm_hctl_reg = devm_ioremap(&pdev->dev, - swrm_hctl_reg, 0x4); - swrm->clk = pdata->clk; - if (!swrm->clk) { - dev_err(&pdev->dev, "%s: swrm->clk is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - if (of_property_read_u32(pdev->dev.of_node, - "qcom,swr-clock-stop-mode0", - &swrm->clk_stop_mode0_supp)) { - swrm->clk_stop_mode0_supp = FALSE; - } - - ret = of_property_read_u32(swrm->dev->of_node, "qcom,swr-num-dev", - &swrm->num_dev); - if (ret) { - dev_dbg(&pdev->dev, "%s: Looking up %s property failed\n", - __func__, "qcom,swr-num-dev"); - } else { - if (swrm->num_dev > SWRM_NUM_AUTO_ENUM_SLAVES) { - dev_err(&pdev->dev, "%s: num_dev %d > max limit %d\n", - __func__, swrm->num_dev, - SWRM_NUM_AUTO_ENUM_SLAVES); - ret = -EINVAL; - goto err_pdata_fail; - } - } - - /* Parse soundwire port mapping */ - ret = of_property_read_u32(pdev->dev.of_node, "qcom,swr-num-ports", - &num_ports); - if (ret) { - dev_err(swrm->dev, "%s: Failed to get num_ports\n", __func__); - goto err_pdata_fail; - } - swrm->num_ports = num_ports; - - if (!of_find_property(pdev->dev.of_node, "qcom,swr-port-mapping", - &map_size)) { - dev_err(swrm->dev, "missing port mapping\n"); - goto err_pdata_fail; - } - - map_length = map_size / (3 * sizeof(u32)); - if (num_ports > SWR_MSTR_PORT_LEN) { - dev_err(&pdev->dev, "%s:invalid number of swr ports\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - temp = devm_kzalloc(&pdev->dev, map_size, GFP_KERNEL); - - if (!temp) { - ret = -ENOMEM; - goto err_pdata_fail; - } - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,swr-port-mapping", temp, 3 * map_length); - if (ret) { - dev_err(swrm->dev, "%s: Failed to read port mapping\n", - __func__); - goto err_pdata_fail; - } - - for (i = 0; i < map_length; i++) { - port_num = temp[3 * i]; - port_type = temp[3 * i + 1]; - ch_mask = temp[3 * i + 2]; - - if (port_num != old_port_num) - ch_iter = 0; - swrm->port_mapping[port_num][ch_iter].port_type = port_type; - swrm->port_mapping[port_num][ch_iter++].ch_mask = ch_mask; - old_port_num = port_num; - } - devm_kfree(&pdev->dev, temp); - - swrm->reg_irq = pdata->reg_irq; - swrm->master.read = swrm_read; - swrm->master.write = swrm_write; - swrm->master.bulk_write = swrm_bulk_write; - swrm->master.get_logical_dev_num = swrm_get_logical_dev_num; - swrm->master.connect_port = swrm_connect_port; - swrm->master.disconnect_port = swrm_disconnect_port; - swrm->master.slvdev_datapath_control = swrm_slvdev_datapath_control; - swrm->master.remove_from_group = swrm_remove_from_group; - swrm->master.device_wakeup_vote = swrm_device_wakeup_vote; - swrm->master.device_wakeup_unvote = swrm_device_wakeup_unvote; - swrm->master.dev.parent = &pdev->dev; - swrm->master.dev.of_node = pdev->dev.of_node; - swrm->master.num_port = 0; - swrm->rcmd_id = 0; - swrm->wcmd_id = 0; - swrm->slave_status = 0; - swrm->num_rx_chs = 0; - swrm->clk_ref_count = 0; - swrm->swr_irq_wakeup_capable = 0; - swrm->mclk_freq = MCLK_FREQ; - swrm->bus_clk = MCLK_FREQ; - swrm->dev_up = true; - swrm->state = SWR_MSTR_UP; - swrm->ipc_wakeup = false; - swrm->ipc_wakeup_triggered = false; - init_completion(&swrm->reset); - init_completion(&swrm->broadcast); - init_completion(&swrm->clk_off_complete); - mutex_init(&swrm->irq_lock); - mutex_init(&swrm->mlock); - mutex_init(&swrm->reslock); - mutex_init(&swrm->force_down_lock); - mutex_init(&swrm->iolock); - mutex_init(&swrm->clklock); - mutex_init(&swrm->devlock); - mutex_init(&swrm->pm_lock); - swrm->wlock_holders = 0; - swrm->pm_state = SWRM_PM_SLEEPABLE; - init_waitqueue_head(&swrm->pm_wq); - pm_qos_add_request(&swrm->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - for (i = 0 ; i < SWR_MSTR_PORT_LEN; i++) - INIT_LIST_HEAD(&swrm->mport_cfg[i].port_req_list); - - /* Register LPASS core hw vote */ - lpass_core_hw_vote = devm_clk_get(&pdev->dev, "lpass_core_hw_vote"); - if (IS_ERR(lpass_core_hw_vote)) { - ret = PTR_ERR(lpass_core_hw_vote); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_core_hw_vote", ret); - lpass_core_hw_vote = NULL; - ret = 0; - } - swrm->lpass_core_hw_vote = lpass_core_hw_vote; - - /* Register LPASS audio core vote */ - lpass_core_audio = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote"); - if (IS_ERR(lpass_core_audio)) { - ret = PTR_ERR(lpass_core_audio); - dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "lpass_core_audio", ret); - lpass_core_audio = NULL; - ret = 0; - } - swrm->lpass_core_audio = lpass_core_audio; - - if (swrm->reg_irq) { - ret = swrm->reg_irq(swrm->handle, swr_mstr_interrupt, swrm, - SWR_IRQ_REGISTER); - if (ret) { - dev_err(&pdev->dev, "%s: IRQ register failed ret %d\n", - __func__, ret); - goto err_irq_fail; - } - } else { - swrm->irq = platform_get_irq_byname(pdev, "swr_master_irq"); - if (swrm->irq < 0) { - dev_err(swrm->dev, "%s() error getting irq hdle: %d\n", - __func__, swrm->irq); - goto err_irq_fail; - } - - ret = request_threaded_irq(swrm->irq, NULL, - swr_mstr_interrupt_v2, - IRQF_TRIGGER_RISING | IRQF_ONESHOT, - "swr_master_irq", swrm); - if (ret) { - dev_err(swrm->dev, "%s: Failed to request irq %d\n", - __func__, ret); - goto err_irq_fail; - } - - } - /* Make inband tx interrupts as wakeup capable for slave irq */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,swr-mstr-irq-wakeup-capable", - &swrm->swr_irq_wakeup_capable); - if (ret) - dev_dbg(swrm->dev, "%s: swrm irq wakeup capable not defined\n", - __func__); - if (swrm->swr_irq_wakeup_capable) - irq_set_irq_wake(swrm->irq, 1); - ret = swr_register_master(&swrm->master); - if (ret) { - dev_err(&pdev->dev, "%s: error adding swr master\n", __func__); - goto err_mstr_fail; - } - - /* Add devices registered with board-info as the - * controller will be up now - */ - swr_master_add_boarddevices(&swrm->master); - mutex_lock(&swrm->mlock); - swrm_clk_request(swrm, true); - swrm->version = swr_master_read(swrm, SWRM_COMP_HW_VERSION); - ret = swrm_master_init(swrm); - if (ret < 0) { - dev_err(&pdev->dev, - "%s: Error in master Initialization , err %d\n", - __func__, ret); - mutex_unlock(&swrm->mlock); - goto err_mstr_init_fail; - } - - mutex_unlock(&swrm->mlock); - INIT_WORK(&swrm->wakeup_work, swrm_wakeup_work); - - if (pdev->dev.of_node) - of_register_swr_devices(&swrm->master); - -#ifdef CONFIG_DEBUG_FS - swrm->debugfs_swrm_dent = debugfs_create_dir(dev_name(&pdev->dev), 0); - if (!IS_ERR(swrm->debugfs_swrm_dent)) { - swrm->debugfs_peek = debugfs_create_file("swrm_peek", - S_IFREG | 0444, swrm->debugfs_swrm_dent, - (void *) swrm, &swrm_debug_read_ops); - - swrm->debugfs_poke = debugfs_create_file("swrm_poke", - S_IFREG | 0444, swrm->debugfs_swrm_dent, - (void *) swrm, &swrm_debug_write_ops); - - swrm->debugfs_reg_dump = debugfs_create_file("swrm_reg_dump", - S_IFREG | 0444, swrm->debugfs_swrm_dent, - (void *) swrm, - &swrm_debug_dump_ops); - } -#endif - ret = device_init_wakeup(swrm->dev, true); - if (ret) { - dev_err(swrm->dev, "Device wakeup init failed: %d\n", ret); - goto err_irq_wakeup_fail; - } - - pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_active(&pdev->dev); - pm_runtime_enable(&pdev->dev); - pm_runtime_mark_last_busy(&pdev->dev); - - INIT_WORK(&swrm->dc_presence_work, swrm_notify_work_fn); - swrm->event_notifier.notifier_call = swrm_event_notify; - msm_aud_evt_register_client(&swrm->event_notifier); - - return 0; -err_irq_wakeup_fail: - device_init_wakeup(swrm->dev, false); -err_mstr_init_fail: - swr_unregister_master(&swrm->master); -err_mstr_fail: - if (swrm->reg_irq) - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); - else if (swrm->irq) - free_irq(swrm->irq, swrm); -err_irq_fail: - mutex_destroy(&swrm->irq_lock); - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->force_down_lock); - mutex_destroy(&swrm->iolock); - mutex_destroy(&swrm->clklock); - mutex_destroy(&swrm->pm_lock); - pm_qos_remove_request(&swrm->pm_qos_req); - -err_pdata_fail: -err_memory_fail: - return ret; -} - -static int swrm_remove(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - if (swrm->reg_irq) - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); - else if (swrm->irq) - free_irq(swrm->irq, swrm); - else if (swrm->wake_irq > 0) - free_irq(swrm->wake_irq, swrm); - if (swrm->swr_irq_wakeup_capable) - irq_set_irq_wake(swrm->irq, 0); - cancel_work_sync(&swrm->wakeup_work); - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - swr_unregister_master(&swrm->master); - msm_aud_evt_unregister_client(&swrm->event_notifier); - device_init_wakeup(swrm->dev, false); - mutex_destroy(&swrm->irq_lock); - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->iolock); - mutex_destroy(&swrm->clklock); - mutex_destroy(&swrm->force_down_lock); - mutex_destroy(&swrm->pm_lock); - pm_qos_remove_request(&swrm->pm_qos_req); - devm_kfree(&pdev->dev, swrm); - return 0; -} - -static int swrm_clk_pause(struct swr_mstr_ctrl *swrm) -{ - u32 val; - - dev_dbg(swrm->dev, "%s: state: %d\n", __func__, swrm->state); - swr_master_write(swrm, SWRM_INTERRUPT_MASK_ADDR, 0x1FDFD); - val = swr_master_read(swrm, SWRM_MCP_CFG_ADDR); - val |= SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK; - swr_master_write(swrm, SWRM_MCP_CFG_ADDR, val); - - return 0; -} - -#ifdef CONFIG_PM -static int swrm_runtime_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - bool swrm_clk_req_err = false; - bool hw_core_err = false; - bool aud_core_err = false; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - - dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n", - __func__, swrm->state); - trace_printk("%s: pm_runtime: resume, state:%d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - - if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) { - dev_err(dev, "%s:lpass core hw enable failed\n", - __func__); - hw_core_err = true; - } - if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) { - dev_err(dev, "%s:lpass audio hw enable failed\n", - __func__); - aud_core_err = true; - } - - if ((swrm->state == SWR_MSTR_DOWN) || - (swrm->state == SWR_MSTR_SSR && swrm->dev_up)) { - if (swrm->clk_stop_mode0_supp) { - if (swrm->wake_irq > 0) { - if (unlikely(!irq_get_irq_data - (swrm->wake_irq))) { - pr_err("%s: irq data is NULL\n", - __func__); - mutex_unlock(&swrm->reslock); - return IRQ_NONE; - } - mutex_lock(&swrm->irq_lock); - if (!irqd_irq_disabled( - irq_get_irq_data(swrm->wake_irq))) - disable_irq_nosync(swrm->wake_irq); - mutex_unlock(&swrm->irq_lock); - } - if (swrm->ipc_wakeup) - msm_aud_evt_blocking_notifier_call_chain( - SWR_WAKE_IRQ_DEREGISTER, (void *)swrm); - } - - if (swrm_clk_request(swrm, true)) { - /* - * Set autosuspend timer to 1 for - * master to enter into suspend. - */ - swrm_clk_req_err = true; - goto exit; - } - if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) { - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_up(swr_dev); - if (ret == -ENODEV) { - dev_dbg(dev, - "%s slave device up not implemented\n", - __func__); - trace_printk( - "%s slave device up not implemented\n", - __func__); - ret = 0; - } else if (ret) { - dev_err(dev, - "%s: failed to wakeup swr dev %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - goto exit; - } - } - swr_master_write(swrm, SWRM_COMP_SW_RESET, 0x01); - swr_master_write(swrm, SWRM_COMP_SW_RESET, 0x01); - swrm_master_init(swrm); - /* wait for hw enumeration to complete */ - usleep_range(100, 105); - if (!swrm_check_link_status(swrm, 0x1)) - dev_dbg(dev, "%s:failed in connecting, ssr?\n", - __func__); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, 0xF, 0x0, - SWRS_SCP_INT_STATUS_MASK_1); - if (swrm->state == SWR_MSTR_SSR) { - mutex_unlock(&swrm->reslock); - enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL); - mutex_lock(&swrm->reslock); - } - } else { - /*wake up from clock stop*/ - swr_master_write(swrm, SWRM_MCP_BUS_CTRL_ADDR, 0x2); - /* clear and enable bus clash interrupt */ - swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, 0x08); - swrm->intr_mask |= 0x08; - swr_master_write(swrm, SWRM_INTERRUPT_MASK_ADDR, - swrm->intr_mask); - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, - swrm->intr_mask); - usleep_range(100, 105); - if (!swrm_check_link_status(swrm, 0x1)) - dev_dbg(dev, "%s:failed in connecting, ssr?\n", - __func__); - } - swrm->state = SWR_MSTR_UP; - } -exit: - if (!aud_core_err) - swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false); - if (!hw_core_err) - swrm_request_hw_vote(swrm, LPASS_HW_CORE, false); - if (swrm_clk_req_err) - pm_runtime_set_autosuspend_delay(&pdev->dev, - ERR_AUTO_SUSPEND_TIMER_VAL); - else - pm_runtime_set_autosuspend_delay(&pdev->dev, - auto_suspend_timer); - mutex_unlock(&swrm->reslock); - - trace_printk("%s: pm_runtime: resume done, state:%d\n", - __func__, swrm->state); - return ret; -} - -static int swrm_runtime_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - bool hw_core_err = false; - bool aud_core_err = false; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - int current_state = 0; - - trace_printk("%s: pm_runtime: suspend state: %d\n", - __func__, swrm->state); - dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - mutex_lock(&swrm->force_down_lock); - current_state = swrm->state; - mutex_unlock(&swrm->force_down_lock); - - if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) { - dev_err(dev, "%s:lpass core hw enable failed\n", - __func__); - hw_core_err = true; - } - if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) { - dev_err(dev, "%s:lpass audio hw enable failed\n", - __func__); - aud_core_err = true; - } - - if ((current_state == SWR_MSTR_UP) || - (current_state == SWR_MSTR_SSR)) { - - if ((current_state != SWR_MSTR_SSR) && - swrm_is_port_en(&swrm->master)) { - dev_dbg(dev, "%s ports are enabled\n", __func__); - trace_printk("%s ports are enabled\n", __func__); - ret = -EBUSY; - goto exit; - } - if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) { - dev_err(dev, "%s: clk stop mode not supported or SSR entry\n", - __func__); - mutex_unlock(&swrm->reslock); - enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL); - mutex_lock(&swrm->reslock); - if (!swrm->clk_stop_mode0_supp) { - swrm_clk_pause(swrm); - } else { - /* Mask bus clash interrupt */ - swrm->intr_mask &= ~((u32)0x08); - swr_master_write(swrm, - SWRM_INTERRUPT_MASK_ADDR, - swrm->intr_mask); - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, - swrm->intr_mask); - mutex_unlock(&swrm->reslock); - /* clock stop sequence */ - swrm_cmd_fifo_wr_cmd(swrm, 0x2, 0xF, 0xF, - SWRS_SCP_CONTROL); - mutex_lock(&swrm->reslock); - } - swr_master_write(swrm, SWRM_COMP_CFG_ADDR, 0x00); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_down(swr_dev); - if (ret == -ENODEV) { - dev_dbg_ratelimited(dev, - "%s slave device down not implemented\n", - __func__); - trace_printk( - "%s slave device down not implemented\n", - __func__); - ret = 0; - } else if (ret) { - dev_err(dev, - "%s: failed to shutdown swr dev %d\n", - __func__, swr_dev->dev_num); - trace_printk( - "%s: failed to shutdown swr dev %d\n", - __func__, swr_dev->dev_num); - goto exit; - } - } - trace_printk("%s: clk stop mode not supported or SSR exit\n", - __func__); - } else { - /* Mask bus clash interrupt */ - swrm->intr_mask &= ~((u32)0x08); - swr_master_write(swrm, SWRM_INTERRUPT_MASK_ADDR, - swrm->intr_mask); - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, - swrm->intr_mask); - mutex_unlock(&swrm->reslock); - /* clock stop sequence */ - swrm_cmd_fifo_wr_cmd(swrm, 0x2, 0xF, 0xF, - SWRS_SCP_CONTROL); - mutex_lock(&swrm->reslock); - usleep_range(100, 105); - } - if (!swrm_check_link_status(swrm, 0x0)) - dev_dbg(dev, "%s:failed in disconnecting, ssr?\n", - __func__); - ret = swrm_clk_request(swrm, false); - if (ret) { - dev_err(dev, "%s: swrmn clk failed\n", __func__); - ret = 0; - goto exit; - } - - if (swrm->clk_stop_mode0_supp) { - if (swrm->wake_irq > 0) { - enable_irq(swrm->wake_irq); - } else if (swrm->ipc_wakeup) { - msm_aud_evt_blocking_notifier_call_chain( - SWR_WAKE_IRQ_REGISTER, (void *)swrm); - swrm->ipc_wakeup_triggered = false; - } - } - - } - /* Retain SSR state until resume */ - if (current_state != SWR_MSTR_SSR) - swrm->state = SWR_MSTR_DOWN; -exit: - if (!aud_core_err) - swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false); - if (!hw_core_err) - swrm_request_hw_vote(swrm, LPASS_HW_CORE, false); - mutex_unlock(&swrm->reslock); - trace_printk("%s: pm_runtime: suspend done state: %d\n", - __func__, swrm->state); - return ret; -} -#endif /* CONFIG_PM */ - -static int swrm_device_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - - dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state); - trace_printk("%s: swrm state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) { - ret = swrm_runtime_suspend(dev); - if (!ret) { - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - - return 0; -} - -static int swrm_device_down(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state); - trace_printk("%s: swrm state: %d\n", __func__, swrm->state); - - mutex_lock(&swrm->force_down_lock); - swrm->state = SWR_MSTR_SSR; - mutex_unlock(&swrm->force_down_lock); - - swrm_device_suspend(dev); - return 0; -} - -int swrm_register_wake_irq(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - int irq, dir_apps_irq; - - if (!swrm->ipc_wakeup) { - irq = of_get_named_gpio(swrm->dev->of_node, - "qcom,swr-wakeup-irq", 0); - if (gpio_is_valid(irq)) { - swrm->wake_irq = gpio_to_irq(irq); - if (swrm->wake_irq < 0) { - dev_err(swrm->dev, - "Unable to configure irq\n"); - return swrm->wake_irq; - } - } else { - dir_apps_irq = platform_get_irq_byname(swrm->pdev, - "swr_wake_irq"); - if (dir_apps_irq < 0) { - dev_err(swrm->dev, - "TLMM connect gpio not found\n"); - return -EINVAL; - } - swrm->wake_irq = dir_apps_irq; - } - ret = request_threaded_irq(swrm->wake_irq, NULL, - swrm_wakeup_interrupt, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - "swr_wake_irq", swrm); - if (ret) { - dev_err(swrm->dev, "%s: Failed to request irq %d\n", - __func__, ret); - return -EINVAL; - } - irq_set_irq_wake(swrm->wake_irq, 1); - } - return ret; -} - -static int swrm_alloc_port_mem(struct device *dev, struct swr_mstr_ctrl *swrm, - u32 uc, u32 size) -{ - if (!swrm->port_param) { - swrm->port_param = devm_kzalloc(dev, - sizeof(swrm->port_param) * SWR_UC_MAX, - GFP_KERNEL); - if (!swrm->port_param) - return -ENOMEM; - } - if (!swrm->port_param[uc]) { - swrm->port_param[uc] = devm_kcalloc(dev, size, - sizeof(struct port_params), - GFP_KERNEL); - if (!swrm->port_param[uc]) - return -ENOMEM; - } else { - dev_err_ratelimited(swrm->dev, "%s: called more than once\n", - __func__); - } - - return 0; -} - -static int swrm_copy_port_config(struct swr_mstr_ctrl *swrm, - struct swrm_port_config *port_cfg, - u32 size) -{ - int idx; - struct port_params *params; - int uc = port_cfg->uc; - int ret = 0; - - for (idx = 0; idx < size; idx++) { - params = &((struct port_params *)port_cfg->params)[idx]; - if (!params) { - dev_err(swrm->dev, "%s: Invalid params\n", __func__); - ret = -EINVAL; - break; - } - memcpy(&swrm->port_param[uc][idx], params, - sizeof(struct port_params)); - } - - return ret; -} - -/** - * swrm_wcd_notify - parent device can notify to soundwire master through - * this function - * @pdev: pointer to platform device structure - * @id: command id from parent to the soundwire master - * @data: data from parent device to soundwire master - */ -int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data) -{ - struct swr_mstr_ctrl *swrm; - int ret = 0; - struct swr_master *mstr; - struct swr_device *swr_dev; - struct swrm_port_config *port_cfg; - - if (!pdev) { - pr_err("%s: pdev is NULL\n", __func__); - return -EINVAL; - } - swrm = platform_get_drvdata(pdev); - if (!swrm) { - dev_err(&pdev->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - mstr = &swrm->master; - - switch (id) { - case SWR_REQ_CLK_SWITCH: - /* This will put soundwire in clock stop mode and disable the - * clocks, if there is no active usecase running, so that the - * next activity on soundwire will request clock from new clock - * source. - */ - if (!data) { - dev_err(swrm->dev, "%s: data is NULL for id:%d\n", - __func__, id); - ret = -EINVAL; - break; - } - mutex_lock(&swrm->mlock); - if (swrm->clk_src != *(int *)data) { - if (swrm->state == SWR_MSTR_UP) - swrm_device_suspend(&pdev->dev); - swrm->clk_src = *(int *)data; - } - mutex_unlock(&swrm->mlock); - break; - case SWR_CLK_FREQ: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - if (swrm->mclk_freq != *(int *)data) { - dev_dbg(swrm->dev, "%s: freq change: force mstr down\n", __func__); - if (swrm->state == SWR_MSTR_DOWN) - dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n", - __func__, swrm->state); - else { - swrm->mclk_freq = *(int *)data; - swrm->bus_clk = swrm->mclk_freq; - swrm_switch_frame_shape(swrm, - swrm->bus_clk); - swrm_device_suspend(&pdev->dev); - } - /* - * add delay to ensure clk release happen - * if interrupt triggered for clk stop, - * wait for it to exit - */ - usleep_range(10000, 10500); - } - swrm->mclk_freq = *(int *)data; - swrm->bus_clk = swrm->mclk_freq; - mutex_unlock(&swrm->mlock); - } - break; - case SWR_DEVICE_SSR_DOWN: - trace_printk("%s: swr device down called\n", __func__); - mutex_lock(&swrm->mlock); - if (swrm->state == SWR_MSTR_DOWN) - dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n", - __func__, swrm->state); - else - swrm_device_down(&pdev->dev); - mutex_lock(&swrm->devlock); - swrm->dev_up = false; - swrm->hw_core_clk_en = 0; - swrm->aud_core_clk_en = 0; - mutex_unlock(&swrm->devlock); - mutex_lock(&swrm->reslock); - swrm->state = SWR_MSTR_SSR; - mutex_unlock(&swrm->reslock); - mutex_unlock(&swrm->mlock); - break; - case SWR_DEVICE_SSR_UP: - /* wait for clk voting to be zero */ - trace_printk("%s: swr device up called\n", __func__); - reinit_completion(&swrm->clk_off_complete); - if (swrm->clk_ref_count && - !wait_for_completion_timeout(&swrm->clk_off_complete, - msecs_to_jiffies(500))) - dev_err(swrm->dev, "%s: clock voting not zero\n", - __func__); - - mutex_lock(&swrm->devlock); - swrm->dev_up = true; - mutex_unlock(&swrm->devlock); - break; - case SWR_DEVICE_DOWN: - dev_dbg(swrm->dev, "%s: swr master down called\n", __func__); - trace_printk("%s: swr master down called\n", __func__); - mutex_lock(&swrm->mlock); - if (swrm->state == SWR_MSTR_DOWN) - dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n", - __func__, swrm->state); - else - swrm_device_down(&pdev->dev); - mutex_unlock(&swrm->mlock); - break; - case SWR_DEVICE_UP: - dev_dbg(swrm->dev, "%s: swr master up called\n", __func__); - trace_printk("%s: swr master up called\n", __func__); - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - dev_dbg(swrm->dev, "SSR not complete yet\n"); - mutex_unlock(&swrm->devlock); - return -EBUSY; - } - mutex_unlock(&swrm->devlock); - mutex_lock(&swrm->mlock); - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_get_sync(&pdev->dev); - mutex_lock(&swrm->reslock); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_reset_device(swr_dev); - if (ret == -ENODEV) { - dev_dbg_ratelimited(swrm->dev, - "%s slave reset not implemented\n", - __func__); - ret = 0; - } else if (ret) { - dev_err(swrm->dev, - "%s: failed to reset swr device %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - } - } - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_put_autosuspend(&pdev->dev); - mutex_unlock(&swrm->reslock); - mutex_unlock(&swrm->mlock); - break; - case SWR_SET_NUM_RX_CH: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - swrm->num_rx_chs = *(int *)data; - if ((swrm->num_rx_chs > 1) && !swrm->num_cfg_devs) { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_BROADCAST); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } else { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_GROUP_NONE); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } - mutex_unlock(&swrm->mlock); - } - break; - case SWR_REGISTER_WAKE_IRQ: - if (!data) { - dev_err(swrm->dev, "%s: reg wake irq data is NULL\n", - __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - swrm->ipc_wakeup = *(u32 *)data; - ret = swrm_register_wake_irq(swrm); - if (ret) - dev_err(swrm->dev, "%s: register wake_irq failed\n", - __func__); - mutex_unlock(&swrm->mlock); - } - break; - case SWR_REGISTER_WAKEUP: - msm_aud_evt_blocking_notifier_call_chain( - SWR_WAKE_IRQ_REGISTER, (void *)swrm); - break; - case SWR_DEREGISTER_WAKEUP: - msm_aud_evt_blocking_notifier_call_chain( - SWR_WAKE_IRQ_DEREGISTER, (void *)swrm); - break; - case SWR_SET_PORT_MAP: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL for id=%d\n", - __func__, id); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - port_cfg = (struct swrm_port_config *)data; - if (!port_cfg->size) { - ret = -EINVAL; - goto done; - } - ret = swrm_alloc_port_mem(&pdev->dev, swrm, - port_cfg->uc, port_cfg->size); - if (!ret) - swrm_copy_port_config(swrm, port_cfg, - port_cfg->size); -done: - mutex_unlock(&swrm->mlock); - } - break; - default: - dev_err(swrm->dev, "%s: swr master unknown id %d\n", - __func__, id); - break; - } - return ret; -} -EXPORT_SYMBOL(swrm_wcd_notify); - -/* - * swrm_pm_cmpxchg: - * Check old state and exchange with pm new state - * if old state matches with current state - * - * @swrm: pointer to wcd core resource - * @o: pm old state - * @n: pm new state - * - * Returns old state - */ -static enum swrm_pm_state swrm_pm_cmpxchg( - struct swr_mstr_ctrl *swrm, - enum swrm_pm_state o, - enum swrm_pm_state n) -{ - enum swrm_pm_state old; - - if (!swrm) - return o; - - mutex_lock(&swrm->pm_lock); - old = swrm->pm_state; - if (old == o) - swrm->pm_state = n; - mutex_unlock(&swrm->pm_lock); - - return old; -} - -static bool swrm_lock_sleep(struct swr_mstr_ctrl *swrm) -{ - enum swrm_pm_state os; - - /* - * swrm_{lock/unlock}_sleep will be called by swr irq handler - * and slave wake up requests.. - * - * If system didn't resume, we can simply return false so - * IRQ handler can return without handling IRQ. - */ - mutex_lock(&swrm->pm_lock); - if (swrm->wlock_holders++ == 0) { - dev_dbg(swrm->dev, "%s: holding wake lock\n", __func__); - pm_qos_update_request(&swrm->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - pm_stay_awake(swrm->dev); - } - mutex_unlock(&swrm->pm_lock); - - if (!wait_event_timeout(swrm->pm_wq, - ((os = swrm_pm_cmpxchg(swrm, - SWRM_PM_SLEEPABLE, - SWRM_PM_AWAKE)) == - SWRM_PM_SLEEPABLE || - (os == SWRM_PM_AWAKE)), - msecs_to_jiffies( - SWRM_SYSTEM_RESUME_TIMEOUT_MS))) { - dev_err(swrm->dev, "%s: system didn't resume within %dms, s %d, w %d\n", - __func__, SWRM_SYSTEM_RESUME_TIMEOUT_MS, swrm->pm_state, - swrm->wlock_holders); - swrm_unlock_sleep(swrm); - return false; - } - wake_up_all(&swrm->pm_wq); - return true; -} - -static void swrm_unlock_sleep(struct swr_mstr_ctrl *swrm) -{ - mutex_lock(&swrm->pm_lock); - if (--swrm->wlock_holders == 0) { - dev_dbg(swrm->dev, "%s: releasing wake lock pm_state %d -> %d\n", - __func__, swrm->pm_state, SWRM_PM_SLEEPABLE); - /* - * if swrm_lock_sleep failed, pm_state would be still - * swrm_PM_ASLEEP, don't overwrite - */ - if (likely(swrm->pm_state == SWRM_PM_AWAKE)) - swrm->pm_state = SWRM_PM_SLEEPABLE; - pm_qos_update_request(&swrm->pm_qos_req, - PM_QOS_DEFAULT_VALUE); - pm_relax(swrm->dev); - } - mutex_unlock(&swrm->pm_lock); - wake_up_all(&swrm->pm_wq); -} - -#ifdef CONFIG_PM_SLEEP -static int swrm_suspend(struct device *dev) -{ - int ret = -EBUSY; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system suspend, state: %d\n", __func__, swrm->state); - - mutex_lock(&swrm->pm_lock); - - if (swrm->pm_state == SWRM_PM_SLEEPABLE) { - dev_dbg(swrm->dev, "%s: suspending system, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - swrm->pm_state = SWRM_PM_ASLEEP; - } else if (swrm->pm_state == SWRM_PM_AWAKE) { - /* - * unlock to wait for pm_state == SWRM_PM_SLEEPABLE - * then set to SWRM_PM_ASLEEP - */ - dev_dbg(swrm->dev, "%s: waiting to suspend system, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - mutex_unlock(&swrm->pm_lock); - if (!(wait_event_timeout(swrm->pm_wq, swrm_pm_cmpxchg( - swrm, SWRM_PM_SLEEPABLE, - SWRM_PM_ASLEEP) == - SWRM_PM_SLEEPABLE, - msecs_to_jiffies( - SWRM_SYS_SUSPEND_WAIT)))) { - dev_dbg(swrm->dev, "%s: suspend failed state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - return -EBUSY; - } else { - dev_dbg(swrm->dev, - "%s: done, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - } - mutex_lock(&swrm->pm_lock); - } else if (swrm->pm_state == SWRM_PM_ASLEEP) { - dev_dbg(swrm->dev, "%s: system is already suspended, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - } - - mutex_unlock(&swrm->pm_lock); - - if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) { - ret = swrm_runtime_suspend(dev); - if (!ret) { - /* - * Synchronize runtime-pm and system-pm states: - * At this point, we are already suspended. If - * runtime-pm still thinks its active, then - * make sure its status is in sync with HW - * status. The three below calls let the - * runtime-pm know that we are suspended - * already without re-invoking the suspend - * callback - */ - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - if (ret == -EBUSY) { - /* - * There is a possibility that some audio stream is active - * during suspend. We dont want to return suspend failure in - * that case so that display and relevant components can still - * go to suspend. - * If there is some other error, then it should be passed-on - * to system level suspend - */ - ret = 0; - } - return ret; -} - -static int swrm_resume(struct device *dev) -{ - int ret = 0; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system resume, state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspend(dev)) { - ret = swrm_runtime_resume(dev); - if (!ret) { - pm_runtime_mark_last_busy(dev); - pm_request_autosuspend(dev); - } - } - mutex_lock(&swrm->pm_lock); - if (swrm->pm_state == SWRM_PM_ASLEEP) { - dev_dbg(swrm->dev, - "%s: resuming system, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - swrm->pm_state = SWRM_PM_SLEEPABLE; - } else { - dev_dbg(swrm->dev, "%s: system is already awake, state %d wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - } - mutex_unlock(&swrm->pm_lock); - wake_up_all(&swrm->pm_wq); - - return ret; -} -#endif /* CONFIG_PM_SLEEP */ - -static const struct dev_pm_ops swrm_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - swrm_suspend, - swrm_resume - ) - SET_RUNTIME_PM_OPS( - swrm_runtime_suspend, - swrm_runtime_resume, - NULL - ) -}; - -static const struct of_device_id swrm_dt_match[] = { - { - .compatible = "qcom,swr-mstr", - }, - {} -}; - -static struct platform_driver swr_mstr_driver = { - .probe = swrm_probe, - .remove = swrm_remove, - .driver = { - .name = SWR_WCD_NAME, - .owner = THIS_MODULE, - .pm = &swrm_dev_pm_ops, - .of_match_table = swrm_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int __init swrm_init(void) -{ - return platform_driver_register(&swr_mstr_driver); -} -module_init(swrm_init); - -static void __exit swrm_exit(void) -{ - platform_driver_unregister(&swr_mstr_driver); -} -module_exit(swrm_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SoundWire Master Controller"); -MODULE_ALIAS("platform:swr-mstr"); diff --git a/techpack/audio/4.0/soc/swr-mstr-ctrl.h b/techpack/audio/4.0/soc/swr-mstr-ctrl.h deleted file mode 100644 index ce0b64d57766..000000000000 --- a/techpack/audio/4.0/soc/swr-mstr-ctrl.h +++ /dev/null @@ -1,192 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. - */ - -#ifndef _SWR_WCD_CTRL_H -#define _SWR_WCD_CTRL_H -#include -#include -#include -#include -#include - -#ifdef CONFIG_DEBUG_FS -#include -#include - -#define SWR_MSTR_MAX_REG_ADDR 0x1740 -#define SWR_MSTR_START_REG_ADDR 0x00 -#define SWR_MSTR_MAX_BUF_LEN 32 -#define BYTES_PER_LINE 12 -#define SWR_MSTR_RD_BUF_LEN 8 -#define SWR_MSTR_WR_BUF_LEN 32 -#endif - -#define SWR_ROW_48 0 -#define SWR_ROW_50 1 -#define SWR_ROW_64 3 -#define SWR_COL_04 1 /* Cols = 4 */ -#define SWR_MAX_COL 7 /* Cols = 16 */ -#define SWR_MIN_COL 0 /* Cols = 2 */ - -#define SWR_WCD_NAME "swr-wcd" - -#define SWR_MSTR_PORT_LEN 8 /* Number of master ports */ - -#define SWRM_VERSION_1_0 0x01010000 -#define SWRM_VERSION_1_2 0x01030000 -#define SWRM_VERSION_1_3 0x01040000 -#define SWRM_VERSION_1_5 0x01050000 -#define SWRM_VERSION_1_5_1 0x01050001 -#define SWRM_VERSION_1_6 0x01060000 - -#define SWR_MAX_CH_PER_PORT 8 - -#define SWRM_NUM_AUTO_ENUM_SLAVES 6 - -enum { - SWR_MSTR_PAUSE, - SWR_MSTR_RESUME, - SWR_MSTR_UP, - SWR_MSTR_DOWN, - SWR_MSTR_SSR, -}; - -enum swrm_pm_state { - SWRM_PM_SLEEPABLE, - SWRM_PM_AWAKE, - SWRM_PM_ASLEEP, -}; - -enum { - SWR_IRQ_FREE, - SWR_IRQ_REGISTER, -}; - -enum { - SWR_DAC_PORT, - SWR_COMP_PORT, - SWR_BOOST_PORT, - SWR_VISENSE_PORT, -}; - -struct usecase { - u8 num_port; - u8 num_ch; - u32 chrate; -}; - -struct swrm_mports { - struct list_head port_req_list; - bool port_en; - u8 ch_en; - u8 req_ch; - u8 offset1; - u8 offset2; - u8 sinterval; - u8 hstart; - u8 hstop; - u8 blk_grp_count; - u8 blk_pack_mode; - u8 word_length; - u8 lane_ctrl; - u32 ch_rate; -}; - -struct swrm_port_type { - u8 port_type; - u8 ch_mask; -}; - -struct swr_ctrl_platform_data { - void *handle; /* holds priv data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*core_vote)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); -}; - -struct swr_mstr_ctrl { - struct swr_master master; - struct device *dev; - struct resource *supplies; - struct clk *mclk; - int clk_ref_count; - struct completion clk_off_complete; - struct completion reset; - struct completion broadcast; - struct mutex clklock; - struct mutex iolock; - struct mutex devlock; - struct mutex mlock; - struct mutex reslock; - struct mutex pm_lock; - struct mutex irq_lock; - u32 swrm_base_reg; - char __iomem *swrm_dig_base; - char __iomem *swrm_hctl_reg; - u8 rcmd_id; - u8 wcmd_id; - u32 master_id; - void *handle; /* SWR Master handle from client for read and writes */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*core_vote)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); - int irq; - int wake_irq; - int version; - int mclk_freq; - int bus_clk; - u32 num_dev; - int slave_status; - struct swrm_mports mport_cfg[SWR_MAX_MSTR_PORT_NUM]; - struct list_head port_req_list; - unsigned long port_req_pending; - int state; - struct platform_device *pdev; - int num_rx_chs; - u8 num_cfg_devs; - struct mutex force_down_lock; - int force_down_state; - struct notifier_block event_notifier; - struct work_struct dc_presence_work; - u8 num_ports; - struct swrm_port_type - port_mapping[SWR_MSTR_PORT_LEN][SWR_MAX_CH_PER_PORT]; - int swr_irq; - u32 clk_stop_mode0_supp; - struct work_struct wakeup_work; - u32 ipc_wakeup; - bool dev_up; - bool ipc_wakeup_triggered; - struct pm_qos_request pm_qos_req; - enum swrm_pm_state pm_state; - wait_queue_head_t pm_wq; - int wlock_holders; - u32 intr_mask; - struct port_params **port_param; - struct clk *lpass_core_hw_vote; - struct clk *lpass_core_audio; - u8 num_usecase; - u32 swr_irq_wakeup_capable; - int hw_core_clk_en; - int aud_core_clk_en; - int clk_src; -#ifdef CONFIG_DEBUG_FS - struct dentry *debugfs_swrm_dent; - struct dentry *debugfs_peek; - struct dentry *debugfs_poke; - struct dentry *debugfs_reg_dump; - unsigned int read_data; -#endif -}; - -#endif /* _SWR_WCD_CTRL_H */ diff --git a/techpack/audio/4.0/soc/swr-wcd-ctrl.c b/techpack/audio/4.0/soc/swr-wcd-ctrl.c deleted file mode 100644 index 66409f8cec91..000000000000 --- a/techpack/audio/4.0/soc/swr-wcd-ctrl.c +++ /dev/null @@ -1,1956 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "swrm_registers.h" -#include "swr-wcd-ctrl.h" - -#define SWR_BROADCAST_CMD_ID 0x0F -#define SWR_AUTO_SUSPEND_DELAY 3 /* delay in sec */ -#define SWR_DEV_ID_MASK 0xFFFFFFFF -#define SWR_REG_VAL_PACK(data, dev, id, reg) \ - ((reg) | ((id) << 16) | ((dev) << 20) | ((data) << 24)) - -/* pm runtime auto suspend timer in msecs */ -static int auto_suspend_timer = SWR_AUTO_SUSPEND_DELAY * 1000; -module_param(auto_suspend_timer, int, 0664); -MODULE_PARM_DESC(auto_suspend_timer, "timer for auto suspend"); - -static u8 mstr_ports[] = {100, 101, 102, 103, 104, 105, 106, 107}; -static u8 mstr_port_type[] = {SWR_DAC_PORT, SWR_COMP_PORT, SWR_BOOST_PORT, - SWR_DAC_PORT, SWR_COMP_PORT, SWR_BOOST_PORT, - SWR_VISENSE_PORT, SWR_VISENSE_PORT}; - -struct usecase uc[] = { - {0, 0, 0}, /* UC0: no ports */ - {1, 1, 2400}, /* UC1: Spkr */ - {1, 4, 600}, /* UC2: Compander */ - {1, 2, 300}, /* UC3: Smart Boost */ - {1, 2, 1200}, /* UC4: VI Sense */ - {4, 9, 4500}, /* UC5: Spkr + Comp + SB + VI */ - {8, 18, 9000}, /* UC6: 2*(Spkr + Comp + SB + VI) */ - {2, 2, 4800}, /* UC7: 2*Spkr */ - {2, 5, 3000}, /* UC8: Spkr + Comp */ - {4, 10, 6000}, /* UC9: 2*(Spkr + Comp) */ - {3, 7, 3300}, /* UC10: Spkr + Comp + SB */ - {6, 14, 6600}, /* UC11: 2*(Spkr + Comp + SB) */ - {2, 3, 2700}, /* UC12: Spkr + SB */ - {4, 6, 5400}, /* UC13: 2*(Spkr + SB) */ - {3, 5, 3900}, /* UC14: Spkr + SB + VI */ - {6, 10, 7800}, /* UC15: 2*(Spkr + SB + VI) */ - {2, 3, 3600}, /* UC16: Spkr + VI */ - {4, 6, 7200}, /* UC17: 2*(Spkr + VI) */ - {3, 7, 4200}, /* UC18: Spkr + Comp + VI */ - {6, 14, 8400}, /* UC19: 2*(Spkr + Comp + VI) */ -}; -#define MAX_USECASE ARRAY_SIZE(uc) - -struct port_params pp[MAX_USECASE][SWR_MSTR_PORT_LEN] = { - /* UC 0 */ - { - {0, 0, 0}, - }, - /* UC 1 */ - { - {7, 1, 0}, - }, - /* UC 2 */ - { - {31, 2, 0}, - }, - /* UC 3 */ - { - {63, 12, 31}, - }, - /* UC 4 */ - { - {15, 7, 0}, - }, - /* UC 5 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - {15, 7, 0}, - }, - /* UC 6 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - {15, 7, 0}, - {7, 6, 0}, - {31, 18, 0}, - {63, 13, 31}, - {15, 10, 0}, - }, - /* UC 7 */ - { - {7, 1, 0}, - {7, 6, 0}, - - }, - /* UC 8 */ - { - {7, 1, 0}, - {31, 2, 0}, - }, - /* UC 9 */ - { - {7, 1, 0}, - {31, 2, 0}, - {7, 6, 0}, - {31, 18, 0}, - }, - /* UC 10 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - }, - /* UC 11 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - {7, 6, 0}, - {31, 18, 0}, - {63, 13, 31}, - }, - /* UC 12 */ - { - {7, 1, 0}, - {63, 12, 31}, - }, - /* UC 13 */ - { - {7, 1, 0}, - {63, 12, 31}, - {7, 6, 0}, - {63, 13, 31}, - }, - /* UC 14 */ - { - {7, 1, 0}, - {63, 12, 31}, - {15, 7, 0}, - }, - /* UC 15 */ - { - {7, 1, 0}, - {63, 12, 31}, - {15, 7, 0}, - {7, 6, 0}, - {63, 13, 31}, - {15, 10, 0}, - }, - /* UC 16 */ - { - {7, 1, 0}, - {15, 7, 0}, - }, - /* UC 17 */ - { - {7, 1, 0}, - {15, 7, 0}, - {7, 6, 0}, - {15, 10, 0}, - }, - /* UC 18 */ - { - {7, 1, 0}, - {31, 2, 0}, - {15, 7, 0}, - }, - /* UC 19 */ - { - {7, 1, 0}, - {31, 2, 0}, - {15, 7, 0}, - {7, 6, 0}, - {31, 18, 0}, - {15, 10, 0}, - }, -}; - -enum { - SWR_NOT_PRESENT, /* Device is detached/not present on the bus */ - SWR_ATTACHED_OK, /* Device is attached */ - SWR_ALERT, /* Device alters master for any interrupts */ - SWR_RESERVED, /* Reserved */ -}; - -#define SWRM_MAX_PORT_REG 40 -#define SWRM_MAX_INIT_REG 8 - -#define SWR_MSTR_MAX_REG_ADDR 0x1740 -#define SWR_MSTR_START_REG_ADDR 0x00 -#define SWR_MSTR_MAX_BUF_LEN 32 -#define BYTES_PER_LINE 12 -#define SWR_MSTR_RD_BUF_LEN 8 -#define SWR_MSTR_WR_BUF_LEN 32 - -static void swrm_copy_data_port_config(struct swr_master *master, - u8 inactive_bank); -static struct swr_mstr_ctrl *dbgswrm; -static struct dentry *debugfs_swrm_dent; -static struct dentry *debugfs_peek; -static struct dentry *debugfs_poke; -static struct dentry *debugfs_reg_dump; -static unsigned int read_data; - - -static bool swrm_is_msm_variant(int val) -{ - return (val == SWRM_VERSION_1_3); -} - -static int swrm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t swrm_reg_show(char __user *ubuf, size_t count, - loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[SWR_MSTR_MAX_BUF_LEN]; - - if (!ubuf || !ppos) - return 0; - - for (i = (((int) *ppos / BYTES_PER_LINE) + SWR_MSTR_START_REG_ADDR); - i <= SWR_MSTR_MAX_REG_ADDR; i += 4) { - reg_val = dbgswrm->read(dbgswrm->handle, i); - len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i, reg_val); - if (len < 0) { - pr_err("%s: fail to fill the buffer\n", __func__); - total = -EFAULT; - goto copy_err; - } - - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t swrm_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_MSTR_RD_BUF_LEN]; - char *access_str; - ssize_t ret_cnt; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - access_str = file->private_data; - if (*ppos < 0) - return -EINVAL; - - if (!strcmp(access_str, "swrm_peek")) { - snprintf(lbuf, sizeof(lbuf), "0x%x\n", read_data); - ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); - } else if (!strcmp(access_str, "swrm_reg_dump")) { - ret_cnt = swrm_reg_show(ubuf, count, ppos); - } else { - pr_err("%s: %s not permitted to read\n", __func__, access_str); - ret_cnt = -EPERM; - } - return ret_cnt; -} - -static ssize_t swrm_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char lbuf[SWR_MSTR_WR_BUF_LEN]; - int rc; - u32 param[5]; - char *access_str; - - if (!filp || !ppos || !ubuf) - return -EINVAL; - - access_str = filp->private_data; - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - if (!strcmp(access_str, "swrm_poke")) { - /* write */ - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && - (param[1] <= 0xFFFFFFFF) && - (rc == 0)) - rc = dbgswrm->write(dbgswrm->handle, param[0], - param[1]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "swrm_peek")) { - /* read */ - rc = get_parameters(lbuf, param, 1); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && (rc == 0)) - read_data = dbgswrm->read(dbgswrm->handle, param[0]); - else - rc = -EINVAL; - } - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations swrm_debug_ops = { - .open = swrm_debug_open, - .write = swrm_debug_write, - .read = swrm_debug_read, -}; - -static int swrm_set_ch_map(struct swr_mstr_ctrl *swrm, void *data) -{ - struct swr_mstr_port *pinfo = (struct swr_mstr_port *)data; - - swrm->mstr_port = kzalloc(sizeof(struct swr_mstr_port), GFP_KERNEL); - if (swrm->mstr_port == NULL) - return -ENOMEM; - swrm->mstr_port->num_port = pinfo->num_port; - swrm->mstr_port->port = kzalloc((pinfo->num_port * sizeof(u8)), - GFP_KERNEL); - if (!swrm->mstr_port->port) { - kfree(swrm->mstr_port); - swrm->mstr_port = NULL; - return -ENOMEM; - } - memcpy(swrm->mstr_port->port, pinfo->port, pinfo->num_port); - return 0; -} - -static bool swrm_is_port_en(struct swr_master *mstr) -{ - return !!(mstr->num_port); -} - -static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable) -{ - if (!swrm->clk || !swrm->handle) - return -EINVAL; - - if (enable) { - swrm->clk_ref_count++; - if (swrm->clk_ref_count == 1) { - swrm->clk(swrm->handle, true); - swrm->state = SWR_MSTR_UP; - } - } else if (--swrm->clk_ref_count == 0) { - swrm->clk(swrm->handle, false); - swrm->state = SWR_MSTR_DOWN; - } else if (swrm->clk_ref_count < 0) { - pr_err("%s: swrm clk count mismatch\n", __func__); - swrm->clk_ref_count = 0; - } - return 0; -} - -static int swrm_get_port_config(struct swr_master *master) -{ - u32 ch_rate = 0; - u32 num_ch = 0; - int i, uc_idx; - u32 portcount = 0; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - if (master->port[i].port_en) { - ch_rate += master->port[i].ch_rate; - num_ch += master->port[i].num_ch; - portcount++; - } - } - for (i = 0; i < ARRAY_SIZE(uc); i++) { - if ((uc[i].num_port == portcount) && - (uc[i].num_ch == num_ch) && - (uc[i].chrate == ch_rate)) { - uc_idx = i; - break; - } - } - - if (i >= ARRAY_SIZE(uc)) { - dev_err(&master->dev, - "%s: usecase port:%d, num_ch:%d, chrate:%d not found\n", - __func__, master->num_port, num_ch, ch_rate); - return -EINVAL; - } - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - if (master->port[i].port_en) { - master->port[i].sinterval = pp[uc_idx][i].si; - master->port[i].offset1 = pp[uc_idx][i].off1; - master->port[i].offset2 = pp[uc_idx][i].off2; - } - } - return 0; -} - -static int swrm_get_master_port(u8 *mstr_port_id, u8 slv_port_id) -{ - int i; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - if (mstr_ports[i] == slv_port_id) { - *mstr_port_id = i; - return 0; - } - } - return -EINVAL; -} - -static u32 swrm_get_packed_reg_val(u8 *cmd_id, u8 cmd_data, - u8 dev_addr, u16 reg_addr) -{ - u32 val; - u8 id = *cmd_id; - - if (id != SWR_BROADCAST_CMD_ID) { - if (id < 14) - id += 1; - else - id = 0; - *cmd_id = id; - } - val = SWR_REG_VAL_PACK(cmd_data, dev_addr, id, reg_addr); - - return val; -} - -static int swrm_cmd_fifo_rd_cmd(struct swr_mstr_ctrl *swrm, int *cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr, - u32 len) -{ - u32 val; - int ret = 0; - - val = swrm_get_packed_reg_val(&swrm->rcmd_id, len, dev_addr, reg_addr); - ret = swrm->write(swrm->handle, SWRM_CMD_FIFO_RD_CMD, val); - if (ret < 0) { - dev_err(swrm->dev, "%s: reg 0x%x write failed, err:%d\n", - __func__, val, ret); - goto err; - } - *cmd_data = swrm->read(swrm->handle, SWRM_CMD_FIFO_RD_FIFO_ADDR); - dev_dbg(swrm->dev, - "%s: reg: 0x%x, cmd_id: 0x%x, dev_id: 0x%x, cmd_data: 0x%x\n", - __func__, reg_addr, cmd_id, dev_addr, *cmd_data); -err: - return ret; -} - -static int swrm_cmd_fifo_wr_cmd(struct swr_mstr_ctrl *swrm, u8 cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr) -{ - u32 val; - int ret = 0; - - if (!cmd_id) - val = swrm_get_packed_reg_val(&swrm->wcmd_id, cmd_data, - dev_addr, reg_addr); - else - val = swrm_get_packed_reg_val(&cmd_id, cmd_data, - dev_addr, reg_addr); - - dev_dbg(swrm->dev, - "%s: reg: 0x%x, cmd_id: 0x%x, dev_id: 0x%x, cmd_data: 0x%x\n", - __func__, reg_addr, cmd_id, dev_addr, cmd_data); - ret = swrm->write(swrm->handle, SWRM_CMD_FIFO_WR_CMD, val); - if (ret < 0) { - dev_err(swrm->dev, "%s: reg 0x%x write failed, err:%d\n", - __func__, val, ret); - goto err; - } - if (cmd_id == 0xF) { - /* - * sleep for 10ms for MSM soundwire variant to allow broadcast - * command to complete. - */ - if (swrm_is_msm_variant(swrm->version)) - usleep_range(10000, 10100); - else - wait_for_completion_timeout(&swrm->broadcast, - (2 * HZ/10)); - } -err: - return ret; -} - -static int swrm_read(struct swr_master *master, u8 dev_num, u16 reg_addr, - void *buf, u32 len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int val; - u8 *reg_val = (u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - - if (dev_num) - ret = swrm_cmd_fifo_rd_cmd(swrm, &val, dev_num, 0, reg_addr, - len); - else - val = swrm->read(swrm->handle, reg_addr); - - if (!ret) - *reg_val = (u8)val; - - pm_runtime_mark_last_busy(&swrm->pdev->dev); - - return ret; -} - -static int swrm_write(struct swr_master *master, u8 dev_num, u16 reg_addr, - const void *buf) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - u8 reg_val = *(u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - - if (dev_num) - ret = swrm_cmd_fifo_wr_cmd(swrm, reg_val, dev_num, 0, reg_addr); - else - ret = swrm->write(swrm->handle, reg_addr, reg_val); - - pm_runtime_mark_last_busy(&swrm->pdev->dev); - - return ret; -} - -static int swrm_bulk_write(struct swr_master *master, u8 dev_num, void *reg, - const void *buf, size_t len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int i; - u32 *val; - u32 *swr_fifo_reg; - - if (!swrm || !swrm->handle) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (len <= 0) - return -EINVAL; - - if (dev_num) { - swr_fifo_reg = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!swr_fifo_reg) { - ret = -ENOMEM; - goto err; - } - val = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!val) { - ret = -ENOMEM; - goto mem_fail; - } - - for (i = 0; i < len; i++) { - val[i] = swrm_get_packed_reg_val(&swrm->wcmd_id, - ((u8 *)buf)[i], - dev_num, - ((u16 *)reg)[i]); - swr_fifo_reg[i] = SWRM_CMD_FIFO_WR_CMD; - } - ret = swrm->bulk_write(swrm->handle, swr_fifo_reg, val, len); - if (ret) { - dev_err(&master->dev, "%s: bulk write failed\n", - __func__); - ret = -EINVAL; - } - } else { - dev_err(&master->dev, - "%s: No support of Bulk write for master regs\n", - __func__); - ret = -EINVAL; - goto err; - } - kfree(val); -mem_fail: - kfree(swr_fifo_reg); -err: - pm_runtime_mark_last_busy(&swrm->pdev->dev); - return ret; -} - -static u8 get_inactive_bank_num(struct swr_mstr_ctrl *swrm) -{ - return (swrm->read(swrm->handle, SWRM_MCP_STATUS) & - SWRM_MCP_STATUS_BANK_NUM_MASK) ? 0 : 1; -} - -static void enable_bank_switch(struct swr_mstr_ctrl *swrm, u8 bank, - u8 row, u8 col) -{ - /* apply div2 setting for inactive bank before bank switch */ - swrm_cmd_fifo_wr_cmd(swrm, 0x01, 0xF, 0x00, - SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(bank)); - - swrm_cmd_fifo_wr_cmd(swrm, ((row << 3) | col), 0xF, 0xF, - SWRS_SCP_FRAME_CTRL_BANK(bank)); -} - -static struct swr_port_info *swrm_get_port(struct swr_master *master, - u8 port_id) -{ - int i; - struct swr_port_info *port = NULL; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - port = &master->port[i]; - if (port->slave_port_id == port_id) { - dev_dbg(&master->dev, "%s: port_id: %d, index: %d\n", - __func__, port_id, i); - return port; - } - } - - return NULL; -} - -static struct swr_port_info *swrm_get_avail_port(struct swr_master *master) -{ - int i; - struct swr_port_info *port = NULL; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - port = &master->port[i]; - if (port->port_en) - continue; - - dev_dbg(&master->dev, "%s: port_id: %d, index: %d\n", - __func__, port->slave_port_id, i); - return port; - } - - return NULL; -} - -static struct swr_port_info *swrm_get_enabled_port(struct swr_master *master, - u8 port_id) -{ - int i; - struct swr_port_info *port = NULL; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - port = &master->port[i]; - if ((port->slave_port_id == port_id) && (port->port_en == true)) - break; - } - if (i == SWR_MSTR_PORT_LEN) - port = NULL; - return port; -} - -static bool swrm_remove_from_group(struct swr_master *master) -{ - struct swr_device *swr_dev; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - bool is_removed = false; - - if (!swrm) - goto end; - - mutex_lock(&swrm->mlock); - if ((swrm->num_rx_chs > 1) && - (swrm->num_rx_chs == swrm->num_cfg_devs)) { - list_for_each_entry(swr_dev, &master->devices, - dev_list) { - swr_dev->group_id = SWR_GROUP_NONE; - master->gr_sid = 0; - } - is_removed = true; - } - mutex_unlock(&swrm->mlock); - -end: - return is_removed; -} - -static void swrm_cleanup_disabled_data_ports(struct swr_master *master, - u8 bank) -{ - u32 value; - struct swr_port_info *port; - int i; - int port_type; - struct swrm_mports *mport, *mport_next = NULL; - int port_disable_cnt = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - mport = list_first_entry_or_null(&swrm->mport_list, - struct swrm_mports, - list); - if (!mport) { - dev_err(swrm->dev, "%s: list is empty\n", __func__); - return; - } - - for (i = 0; i < master->num_port; i++) { - port = swrm_get_port(master, mstr_ports[mport->id]); - if (!port || port->ch_en) - goto inc_loop; - - port_disable_cnt++; - port_type = mstr_port_type[mport->id]; - value = ((port->ch_en) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - value |= ((port->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((port->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= port->sinterval; - - swrm->write(swrm->handle, - SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank), - value); - swrm_cmd_fifo_wr_cmd(swrm, 0x00, port->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank)); - - dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n", - __func__, mport->id, - (SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank)), value); - -inc_loop: - mport_next = list_next_entry(mport, list); - if (port && !port->ch_en) { - list_del(&mport->list); - kfree(mport); - } - if (!mport_next) { - dev_err(swrm->dev, "%s: end of list\n", __func__); - break; - } - mport = mport_next; - } - master->num_port -= port_disable_cnt; - - dev_dbg(swrm->dev, "%s:disable ports: %d, active ports (rem): %d\n", - __func__, port_disable_cnt, master->num_port); -} - -static int swrm_slvdev_datapath_control(struct swr_master *master, - bool enable) -{ - u8 bank; - u32 value, n_col; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int mask = (SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_BMSK); - u8 inactive_bank; - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return 0; - } - - bank = get_inactive_bank_num(swrm); - - dev_dbg(swrm->dev, "%s: enable: %d, cfg_devs: %d\n", - __func__, enable, swrm->num_cfg_devs); - - if (enable) { - /* set Row = 48 and col = 16 */ - n_col = SWR_MAX_COL; - } else { - /* - * Do not change to 48x2 if number of channels configured - * as stereo and if disable datapath is called for the - * first slave device - */ - if (swrm->num_cfg_devs > 0) - n_col = SWR_MAX_COL; - else - n_col = SWR_MIN_COL; - - /* - * All ports are already disabled, no need to perform - * bank-switch and copy operation. This case can arise - * when speaker channels are enabled in stereo mode with - * BROADCAST and disabled in GROUP_NONE - */ - if (master->num_port == 0) - return 0; - } - - value = swrm->read(swrm->handle, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank)); - value &= (~mask); - value |= ((0 << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (n_col << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - (0 << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - swrm->write(swrm->handle, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - dev_dbg(swrm->dev, "%s: regaddr: 0x%x, value: 0x%x\n", __func__, - SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - enable_bank_switch(swrm, bank, SWR_MAX_ROW, n_col); - - inactive_bank = bank ? 0 : 1; - if (enable) - swrm_copy_data_port_config(master, inactive_bank); - else - swrm_cleanup_disabled_data_ports(master, inactive_bank); - - if (!swrm_is_port_en(master)) { - dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n", - __func__); - pm_runtime_mark_last_busy(&swrm->pdev->dev); - pm_runtime_put_autosuspend(&swrm->pdev->dev); - } - return 0; -} - -static void swrm_apply_port_config(struct swr_master *master) -{ - u8 bank; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - - bank = get_inactive_bank_num(swrm); - dev_dbg(swrm->dev, "%s: enter bank: %d master_ports: %d\n", - __func__, bank, master->num_port); - - swrm_copy_data_port_config(master, bank); -} - -static void swrm_copy_data_port_config(struct swr_master *master, u8 bank) -{ - u32 value; - struct swr_port_info *port; - int i; - int port_type; - struct swrm_mports *mport; - u32 reg[SWRM_MAX_PORT_REG]; - u32 val[SWRM_MAX_PORT_REG]; - int len = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - mport = list_first_entry_or_null(&swrm->mport_list, - struct swrm_mports, - list); - if (!mport) { - dev_err(swrm->dev, "%s: list is empty\n", __func__); - return; - } - for (i = 0; i < master->num_port; i++) { - - port = swrm_get_enabled_port(master, mstr_ports[mport->id]); - if (!port) - continue; - port_type = mstr_port_type[mport->id]; - if (!port->dev_num || (port->dev_num > master->num_dev)) { - dev_dbg(swrm->dev, "%s: invalid device id = %d\n", - __func__, port->dev_num); - continue; - } - value = ((port->ch_en) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - value |= ((port->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((port->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= port->sinterval; - - reg[len] = SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank); - val[len++] = value; - - dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n", - __func__, mport->id, - (SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank)), value); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->ch_en, port->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->sinterval, - port->dev_num, 0x00, - SWRS_DP_SAMPLE_CONTROL_1_BANK(port_type, bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->offset1, - port->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_1_BANK(port_type, bank)); - - if (port_type != 0) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->offset2, - port->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_2_BANK(port_type, - bank)); - } - mport = list_next_entry(mport, list); - if (!mport) { - dev_err(swrm->dev, "%s: end of list\n", __func__); - break; - } - } - swrm->bulk_write(swrm->handle, reg, val, len); -} - -static int swrm_connect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i; - struct swr_port_info *port; - int ret = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - struct swrm_mports *mport; - struct list_head *ptr, *next; - - dev_dbg(&master->dev, "%s: enter\n", __func__); - if (!portinfo) - return -EINVAL; - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - mutex_lock(&swrm->mlock); - if (!swrm_is_port_en(master)) - pm_runtime_get_sync(&swrm->pdev->dev); - - for (i = 0; i < portinfo->num_port; i++) { - mport = kzalloc(sizeof(struct swrm_mports), GFP_KERNEL); - if (!mport) { - ret = -ENOMEM; - goto mem_fail; - } - ret = swrm_get_master_port(&mport->id, - portinfo->port_id[i]); - if (ret < 0) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - goto port_fail; - } - port = swrm_get_avail_port(master); - if (!port) { - dev_err(&master->dev, - "%s: avail ports not found!\n", __func__); - goto port_fail; - } - list_add(&mport->list, &swrm->mport_list); - port->dev_num = portinfo->dev_num; - port->slave_port_id = portinfo->port_id[i]; - port->num_ch = portinfo->num_ch[i]; - port->ch_rate = portinfo->ch_rate[i]; - port->ch_en = portinfo->ch_en[i]; - port->port_en = true; - dev_dbg(&master->dev, - "%s: mstr port %d, slv port %d ch_rate %d num_ch %d\n", - __func__, mport->id, port->slave_port_id, port->ch_rate, - port->num_ch); - } - master->num_port += portinfo->num_port; - if (master->num_port >= SWR_MSTR_PORT_LEN) - master->num_port = SWR_MSTR_PORT_LEN; - - swrm_get_port_config(master); - swr_port_response(master, portinfo->tid); - swrm->num_cfg_devs += 1; - dev_dbg(&master->dev, "%s: cfg_devs: %d, rx_chs: %d\n", - __func__, swrm->num_cfg_devs, swrm->num_rx_chs); - if (swrm->num_rx_chs > 1) { - if (swrm->num_rx_chs == swrm->num_cfg_devs) - swrm_apply_port_config(master); - } else { - swrm_apply_port_config(master); - } - mutex_unlock(&swrm->mlock); - return 0; - -port_fail: - kfree(mport); -mem_fail: - list_for_each_safe(ptr, next, &swrm->mport_list) { - mport = list_entry(ptr, struct swrm_mports, list); - for (i = 0; i < portinfo->num_port; i++) { - if (portinfo->port_id[i] == mstr_ports[mport->id]) { - port = swrm_get_port(master, - portinfo->port_id[i]); - if (port) - port->ch_en = false; - list_del(&mport->list); - kfree(mport); - break; - } - } - } - mutex_unlock(&swrm->mlock); - return ret; -} - -static int swrm_disconnect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i; - struct swr_port_info *port; - u8 bank; - u32 value; - int ret = 0; - u8 mport_id = 0; - int port_type = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - if (!portinfo) { - dev_err(&master->dev, "%s: portinfo is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->mlock); - bank = get_inactive_bank_num(swrm); - for (i = 0; i < portinfo->num_port; i++) { - ret = swrm_get_master_port(&mport_id, - portinfo->port_id[i]); - if (ret < 0) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - port = swrm_get_enabled_port(master, portinfo->port_id[i]); - if (!port) { - dev_dbg(&master->dev, "%s: port %d already disabled\n", - __func__, portinfo->port_id[i]); - continue; - } - port_type = mstr_port_type[mport_id]; - port->dev_num = portinfo->dev_num; - port->port_en = false; - port->ch_en = 0; - value = port->ch_en << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT; - value |= (port->offset2 << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= (port->offset1 << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= port->sinterval; - - - swrm->write(swrm->handle, - SWRM_DP_PORT_CTRL_BANK((mport_id+1), bank), - value); - swrm_cmd_fifo_wr_cmd(swrm, 0x00, port->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank)); - } - - swr_port_response(master, portinfo->tid); - swrm->num_cfg_devs -= 1; - dev_dbg(&master->dev, "%s: cfg_devs: %d, rx_chs: %d, active ports: %d\n", - __func__, swrm->num_cfg_devs, swrm->num_rx_chs, - master->num_port); - mutex_unlock(&swrm->mlock); - - return 0; -} - -static int swrm_check_slave_change_status(struct swr_mstr_ctrl *swrm, - int status, u8 *devnum) -{ - int i; - int new_sts = status; - int ret = SWR_NOT_PRESENT; - - if (status != swrm->slave_status) { - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if ((status & SWRM_MCP_SLV_STATUS_MASK) != - (swrm->slave_status & SWRM_MCP_SLV_STATUS_MASK)) { - ret = (status & SWRM_MCP_SLV_STATUS_MASK); - *devnum = i; - break; - } - status >>= 2; - swrm->slave_status >>= 2; - } - swrm->slave_status = new_sts; - } - return ret; -} - -static irqreturn_t swr_mstr_interrupt(int irq, void *dev) -{ - struct swr_mstr_ctrl *swrm = dev; - u32 value, intr_sts; - int status, chg_sts, i; - u8 devnum = 0; - int ret = IRQ_HANDLED; - - mutex_lock(&swrm->reslock); - swrm_clk_request(swrm, true); - mutex_unlock(&swrm->reslock); - - intr_sts = swrm->read(swrm->handle, SWRM_INTERRUPT_STATUS); - intr_sts &= SWRM_INTERRUPT_STATUS_RMSK; - for (i = 0; i < SWRM_INTERRUPT_MAX; i++) { - value = intr_sts & (1 << i); - if (!value) - continue; - - swrm->write(swrm->handle, SWRM_INTERRUPT_CLEAR, value); - switch (value) { - case SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ: - dev_dbg(swrm->dev, "SWR slave pend irq\n"); - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED: - dev_dbg(swrm->dev, "SWR new slave attached\n"); - break; - case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS: - status = swrm->read(swrm->handle, SWRM_MCP_SLV_STATUS); - if (status == swrm->slave_status) { - dev_dbg(swrm->dev, - "%s: No change in slave status: %d\n", - __func__, status); - break; - } - chg_sts = swrm_check_slave_change_status(swrm, status, - &devnum); - switch (chg_sts) { - case SWR_NOT_PRESENT: - dev_dbg(swrm->dev, "device %d got detached\n", - devnum); - break; - case SWR_ATTACHED_OK: - dev_dbg(swrm->dev, "device %d got attached\n", - devnum); - break; - case SWR_ALERT: - dev_dbg(swrm->dev, - "device %d has pending interrupt\n", - devnum); - break; - } - break; - case SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET: - dev_err_ratelimited(swrm->dev, "SWR bus clash detected\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO overflow\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO underflow\n"); - break; - case SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR write FIFO overflow\n"); - break; - case SWRM_INTERRUPT_STATUS_CMD_ERROR: - value = swrm->read(swrm->handle, SWRM_CMD_FIFO_STATUS); - dev_err_ratelimited(swrm->dev, - "SWR CMD error, fifo status 0x%x, flushing fifo\n", - value); - swrm->write(swrm->handle, SWRM_CMD_FIFO_CMD, 0x1); - break; - case SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION: - dev_dbg(swrm->dev, "SWR Port collision detected\n"); - break; - case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH: - dev_dbg(swrm->dev, "SWR read enable valid mismatch\n"); - break; - case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED: - complete(&swrm->broadcast); - dev_dbg(swrm->dev, "SWR cmd id finished\n"); - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_AUTO_ENUM_FINISHED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL: - break; - case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED: - complete(&swrm->reset); - break; - case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED: - break; - default: - dev_err_ratelimited(swrm->dev, "SWR unknown interrupt\n"); - ret = IRQ_NONE; - break; - } - } - - mutex_lock(&swrm->reslock); - swrm_clk_request(swrm, false); - mutex_unlock(&swrm->reslock); - return ret; -} - -static int swrm_get_device_status(struct swr_mstr_ctrl *swrm, u8 devnum) -{ - u32 val; - - swrm->slave_status = swrm->read(swrm->handle, SWRM_MCP_SLV_STATUS); - val = (swrm->slave_status >> (devnum * 2)); - val &= SWRM_MCP_SLV_STATUS_MASK; - return val; -} - -static int swrm_get_logical_dev_num(struct swr_master *mstr, u64 dev_id, - u8 *dev_num) -{ - int i; - u64 id = 0; - int ret = -EINVAL; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - struct swr_device *swr_dev; - u32 num_dev = 0; - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return ret; - } - if (swrm->num_dev) - num_dev = swrm->num_dev; - else - num_dev = mstr->num_dev; - - pm_runtime_get_sync(&swrm->pdev->dev); - for (i = 1; i < (num_dev + 1); i++) { - id = ((u64)(swrm->read(swrm->handle, - SWRM_ENUMERATOR_SLAVE_DEV_ID_2(i))) << 32); - id |= swrm->read(swrm->handle, - SWRM_ENUMERATOR_SLAVE_DEV_ID_1(i)); - /* - * As pm_runtime_get_sync() brings all slaves out of reset - * update logical device number for all slaves. - */ - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - if (swr_dev->addr == (id & SWR_DEV_ID_MASK)) { - u32 status = swrm_get_device_status(swrm, i); - - if ((status == 0x01) || (status == 0x02)) { - swr_dev->dev_num = i; - if ((id & SWR_DEV_ID_MASK) == dev_id) { - *dev_num = i; - ret = 0; - } - dev_dbg(swrm->dev, "%s: devnum %d is assigned for dev addr %lx\n", - __func__, i, swr_dev->addr); - } - } - } - } - if (ret) - dev_err(swrm->dev, "%s: device 0x%llx is not ready\n", - __func__, dev_id); - - pm_runtime_mark_last_busy(&swrm->pdev->dev); - pm_runtime_put_autosuspend(&swrm->pdev->dev); - return ret; -} -static int swrm_master_init(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - u32 val; - u8 row_ctrl = SWR_MAX_ROW; - u8 col_ctrl = SWR_MIN_COL; - u8 ssp_period = 1; - u8 retry_cmd_num = 3; - u32 reg[SWRM_MAX_INIT_REG]; - u32 value[SWRM_MAX_INIT_REG]; - int len = 0; - - /* Clear Rows and Cols */ - val = ((row_ctrl << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (col_ctrl << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - (ssp_period << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - - reg[len] = SWRM_MCP_FRAME_CTRL_BANK_ADDR(0); - value[len++] = val; - - /* Set Auto enumeration flag */ - reg[len] = SWRM_ENUMERATOR_CFG_ADDR; - value[len++] = 1; - - /* Mask soundwire interrupts */ - reg[len] = SWRM_INTERRUPT_MASK_ADDR; - value[len++] = 0x1FFFD; - - /* Configure No pings */ - val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR); - val &= ~SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK; - val |= (0x1f << SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT); - reg[len] = SWRM_MCP_CFG_ADDR; - value[len++] = val; - - /* Configure number of retries of a read/write cmd */ - val = (retry_cmd_num << SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT); - reg[len] = SWRM_CMD_FIFO_CFG_ADDR; - value[len++] = val; - - /* Set IRQ to PULSE */ - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x02; - - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x03; - - reg[len] = SWRM_INTERRUPT_CLEAR; - value[len++] = 0x08; - - swrm->bulk_write(swrm->handle, reg, value, len); - - return ret; -} - -static int swrm_event_notify(struct notifier_block *self, - unsigned long action, void *data) -{ - struct swr_mstr_ctrl *swrm = container_of(self, struct swr_mstr_ctrl, - event_notifier); - if (!swrm || !swrm->pdev) { - pr_err("%s: swrm or pdev is NULL\n", __func__); - return -EINVAL; - } - if (action != MSM_AUD_DC_EVENT) { - dev_err(&swrm->pdev->dev, "%s: invalid event type: %lu\n", __func__, action); - return -EINVAL; - } - - schedule_work(&(swrm->dc_presence_work)); - - return 0; -} - -static void swrm_notify_work_fn(struct work_struct *work) -{ - struct swr_mstr_ctrl *swrm = container_of(work, struct swr_mstr_ctrl, - dc_presence_work); - swrm_wcd_notify(swrm->pdev, SWR_DEVICE_DOWN, NULL); -} - -static int swrm_probe(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm; - struct swr_ctrl_platform_data *pdata; - int ret; - - /* Allocate soundwire master driver structure */ - swrm = kzalloc(sizeof(struct swr_mstr_ctrl), GFP_KERNEL); - if (!swrm) { - ret = -ENOMEM; - goto err_memory_fail; - } - swrm->dev = &pdev->dev; - swrm->pdev = pdev; - platform_set_drvdata(pdev, swrm); - swr_set_ctrl_data(&swrm->master, swrm); - pdata = dev_get_platdata(&pdev->dev); - if (!pdata) { - dev_err(&pdev->dev, "%s: pdata from parent is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->handle = (void *)pdata->handle; - if (!swrm->handle) { - dev_err(&pdev->dev, "%s: swrm->handle is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->read = pdata->read; - if (!swrm->read) { - dev_err(&pdev->dev, "%s: swrm->read is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->write = pdata->write; - if (!swrm->write) { - dev_err(&pdev->dev, "%s: swrm->write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->bulk_write = pdata->bulk_write; - if (!swrm->bulk_write) { - dev_err(&pdev->dev, "%s: swrm->bulk_write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->clk = pdata->clk; - if (!swrm->clk) { - dev_err(&pdev->dev, "%s: swrm->clk is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->reg_irq = pdata->reg_irq; - if (!swrm->reg_irq) { - dev_err(&pdev->dev, "%s: swrm->reg_irq is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->master.read = swrm_read; - swrm->master.write = swrm_write; - swrm->master.bulk_write = swrm_bulk_write; - swrm->master.get_logical_dev_num = swrm_get_logical_dev_num; - swrm->master.connect_port = swrm_connect_port; - swrm->master.disconnect_port = swrm_disconnect_port; - swrm->master.slvdev_datapath_control = swrm_slvdev_datapath_control; - swrm->master.remove_from_group = swrm_remove_from_group; - swrm->master.dev.parent = &pdev->dev; - swrm->master.dev.of_node = pdev->dev.of_node; - swrm->master.num_port = 0; - swrm->num_enum_slaves = 0; - swrm->rcmd_id = 0; - swrm->wcmd_id = 0; - swrm->slave_status = 0; - swrm->num_rx_chs = 0; - swrm->clk_ref_count = 0; - swrm->state = SWR_MSTR_RESUME; - init_completion(&swrm->reset); - init_completion(&swrm->broadcast); - mutex_init(&swrm->mlock); - INIT_LIST_HEAD(&swrm->mport_list); - mutex_init(&swrm->reslock); - mutex_init(&swrm->force_down_lock); - - ret = of_property_read_u32(swrm->dev->of_node, "qcom,swr-num-dev", - &swrm->num_dev); - if (ret) - dev_dbg(&pdev->dev, "%s: Looking up %s property failed\n", - __func__, "qcom,swr-num-dev"); - else { - if (swrm->num_dev > SWR_MAX_SLAVE_DEVICES) { - dev_err(&pdev->dev, "%s: num_dev %d > max limit %d\n", - __func__, swrm->num_dev, SWR_MAX_SLAVE_DEVICES); - ret = -EINVAL; - goto err_pdata_fail; - } - } - ret = swrm->reg_irq(swrm->handle, swr_mstr_interrupt, swrm, - SWR_IRQ_REGISTER); - if (ret) { - dev_err(&pdev->dev, "%s: IRQ register failed ret %d\n", - __func__, ret); - goto err_irq_fail; - } - - ret = swr_register_master(&swrm->master); - if (ret) { - dev_err(&pdev->dev, "%s: error adding swr master\n", __func__); - goto err_mstr_fail; - } - - /* Add devices registered with board-info as the - * controller will be up now - */ - swr_master_add_boarddevices(&swrm->master); - mutex_lock(&swrm->mlock); - swrm_clk_request(swrm, true); - ret = swrm_master_init(swrm); - if (ret < 0) { - dev_err(&pdev->dev, - "%s: Error in master Initializaiton, err %d\n", - __func__, ret); - mutex_unlock(&swrm->mlock); - goto err_mstr_fail; - } - swrm->version = swrm->read(swrm->handle, SWRM_COMP_HW_VERSION); - - mutex_unlock(&swrm->mlock); - - if (pdev->dev.of_node) - of_register_swr_devices(&swrm->master); - - dbgswrm = swrm; - debugfs_swrm_dent = debugfs_create_dir(dev_name(&pdev->dev), 0); - if (!IS_ERR(debugfs_swrm_dent)) { - debugfs_peek = debugfs_create_file("swrm_peek", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_peek", &swrm_debug_ops); - - debugfs_poke = debugfs_create_file("swrm_poke", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_poke", &swrm_debug_ops); - - debugfs_reg_dump = debugfs_create_file("swrm_reg_dump", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_reg_dump", - &swrm_debug_ops); - } - pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_active(&pdev->dev); - pm_runtime_enable(&pdev->dev); - pm_runtime_mark_last_busy(&pdev->dev); - - INIT_WORK(&swrm->dc_presence_work, swrm_notify_work_fn); - swrm->event_notifier.notifier_call = swrm_event_notify; - msm_aud_evt_register_client(&swrm->event_notifier); - - return 0; -err_mstr_fail: - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); -err_irq_fail: - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->force_down_lock); -err_pdata_fail: - kfree(swrm); -err_memory_fail: - return ret; -} - -static int swrm_remove(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - if (swrm->reg_irq) - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); - if (swrm->mstr_port) { - kfree(swrm->mstr_port->port); - swrm->mstr_port->port = NULL; - kfree(swrm->mstr_port); - swrm->mstr_port = NULL; - } - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - swr_unregister_master(&swrm->master); - msm_aud_evt_unregister_client(&swrm->event_notifier); - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->force_down_lock); - kfree(swrm); - return 0; -} - -static int swrm_clk_pause(struct swr_mstr_ctrl *swrm) -{ - u32 val; - - dev_dbg(swrm->dev, "%s: state: %d\n", __func__, swrm->state); - swrm->write(swrm->handle, SWRM_INTERRUPT_MASK_ADDR, 0x1FDFD); - val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR); - val |= SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK; - swrm->write(swrm->handle, SWRM_MCP_CFG_ADDR, val); - swrm->state = SWR_MSTR_PAUSE; - - return 0; -} - -#ifdef CONFIG_PM -static int swrm_runtime_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - - dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - if ((swrm->state == SWR_MSTR_PAUSE) || - (swrm->state == SWR_MSTR_DOWN)) { - if (swrm->state == SWR_MSTR_DOWN) { - if (swrm_clk_request(swrm, true)) - goto exit; - } - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_up(swr_dev); - if (ret) { - dev_err(dev, - "%s: failed to wakeup swr dev %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - goto exit; - } - } - swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01); - swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01); - swrm_master_init(swrm); - } -exit: - pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); - mutex_unlock(&swrm->reslock); - return ret; -} - -static int swrm_runtime_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - int current_state = 0; - - dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - mutex_lock(&swrm->force_down_lock); - current_state = swrm->state; - mutex_unlock(&swrm->force_down_lock); - if ((current_state == SWR_MSTR_RESUME) || - (current_state == SWR_MSTR_UP) || - (current_state == SWR_MSTR_SSR)) { - - if ((current_state != SWR_MSTR_SSR) && - swrm_is_port_en(&swrm->master)) { - dev_dbg(dev, "%s ports are enabled\n", __func__); - ret = -EBUSY; - goto exit; - } - swrm_clk_pause(swrm); - swrm->write(swrm->handle, SWRM_COMP_CFG_ADDR, 0x00); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_down(swr_dev); - if (ret) { - dev_err(dev, - "%s: failed to shutdown swr dev %d\n", - __func__, swr_dev->dev_num); - goto exit; - } - } - swrm_clk_request(swrm, false); - } -exit: - mutex_unlock(&swrm->reslock); - return ret; -} -#endif /* CONFIG_PM */ - -static int swrm_device_down(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - - dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state); - - mutex_lock(&swrm->force_down_lock); - swrm->state = SWR_MSTR_SSR; - mutex_unlock(&swrm->force_down_lock); - /* Use pm runtime function to tear down */ - ret = pm_runtime_put_sync_suspend(dev); - pm_runtime_get_noresume(dev); - - return ret; -} - -/** - * swrm_wcd_notify - parent device can notify to soundwire master through - * this function - * @pdev: pointer to platform device structure - * @id: command id from parent to the soundwire master - * @data: data from parent device to soundwire master - */ -int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data) -{ - struct swr_mstr_ctrl *swrm; - int ret = 0; - struct swr_master *mstr; - struct swr_device *swr_dev; - - if (!pdev) { - pr_err("%s: pdev is NULL\n", __func__); - return -EINVAL; - } - swrm = platform_get_drvdata(pdev); - if (!swrm) { - dev_err(&pdev->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - mstr = &swrm->master; - - switch (id) { - case SWR_CH_MAP: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - ret = swrm_set_ch_map(swrm, data); - } - break; - case SWR_DEVICE_DOWN: - dev_dbg(swrm->dev, "%s: swr master down called\n", __func__); - mutex_lock(&swrm->mlock); - if ((swrm->state == SWR_MSTR_PAUSE) || - (swrm->state == SWR_MSTR_DOWN)) - dev_dbg(swrm->dev, "%s: SWR master is already Down: %d\n", - __func__, swrm->state); - else - swrm_device_down(&pdev->dev); - mutex_unlock(&swrm->mlock); - break; - case SWR_DEVICE_UP: - dev_dbg(swrm->dev, "%s: swr master up called\n", __func__); - mutex_lock(&swrm->mlock); - mutex_lock(&swrm->reslock); - if ((swrm->state == SWR_MSTR_RESUME) || - (swrm->state == SWR_MSTR_UP)) { - dev_dbg(swrm->dev, "%s: SWR master is already UP: %d\n", - __func__, swrm->state); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) - swr_reset_device(swr_dev); - } else { - pm_runtime_mark_last_busy(&pdev->dev); - mutex_unlock(&swrm->reslock); - pm_runtime_get_sync(&pdev->dev); - mutex_lock(&swrm->reslock); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_reset_device(swr_dev); - if (ret) { - dev_err(swrm->dev, - "%s: failed to reset swr device %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - } - } - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_put_autosuspend(&pdev->dev); - } - mutex_unlock(&swrm->reslock); - mutex_unlock(&swrm->mlock); - break; - case SWR_SET_NUM_RX_CH: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - swrm->num_rx_chs = *(int *)data; - if ((swrm->num_rx_chs > 1) && !swrm->num_cfg_devs) { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_BROADCAST); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } else { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_GROUP_NONE); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } - mutex_unlock(&swrm->mlock); - } - break; - default: - dev_err(swrm->dev, "%s: swr master unknown id %d\n", - __func__, id); - break; - } - return ret; -} -EXPORT_SYMBOL(swrm_wcd_notify); - -#ifdef CONFIG_PM_SLEEP -static int swrm_suspend(struct device *dev) -{ - int ret = -EBUSY; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system suspend, state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) { - ret = swrm_runtime_suspend(dev); - if (!ret) { - /* - * Synchronize runtime-pm and system-pm states: - * At this point, we are already suspended. If - * runtime-pm still thinks its active, then - * make sure its status is in sync with HW - * status. The three below calls let the - * runtime-pm know that we are suspended - * already without re-invoking the suspend - * callback - */ - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - if (ret == -EBUSY) { - /* - * There is a possibility that some audio stream is active - * during suspend. We dont want to return suspend failure in - * that case so that display and relevant components can still - * go to suspend. - * If there is some other error, then it should be passed-on - * to system level suspend - */ - ret = 0; - } - return ret; -} - -static int swrm_resume(struct device *dev) -{ - int ret = 0; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system resume, state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspend(dev)) { - ret = swrm_runtime_resume(dev); - if (!ret) { - pm_runtime_mark_last_busy(dev); - pm_request_autosuspend(dev); - } - } - return ret; -} -#endif /* CONFIG_PM_SLEEP */ - -static const struct dev_pm_ops swrm_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - swrm_suspend, - swrm_resume - ) - SET_RUNTIME_PM_OPS( - swrm_runtime_suspend, - swrm_runtime_resume, - NULL - ) -}; - -static const struct of_device_id swrm_dt_match[] = { - { - .compatible = "qcom,swr-wcd", - }, - {} -}; - -static struct platform_driver swr_mstr_driver = { - .probe = swrm_probe, - .remove = swrm_remove, - .driver = { - .name = SWR_WCD_NAME, - .owner = THIS_MODULE, - .pm = &swrm_dev_pm_ops, - .of_match_table = swrm_dt_match, - .suppress_bind_attrs = true, - }, -}; - -static int __init swrm_init(void) -{ - return platform_driver_register(&swr_mstr_driver); -} -module_init(swrm_init); - -static void __exit swrm_exit(void) -{ - platform_driver_unregister(&swr_mstr_driver); -} -module_exit(swrm_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("WCD SoundWire Controller"); -MODULE_ALIAS("platform:swr-wcd"); diff --git a/techpack/audio/4.0/soc/swr-wcd-ctrl.h b/techpack/audio/4.0/soc/swr-wcd-ctrl.h deleted file mode 100644 index 20baa5a39246..000000000000 --- a/techpack/audio/4.0/soc/swr-wcd-ctrl.h +++ /dev/null @@ -1,109 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _SWR_WCD_CTRL_H -#define _SWR_WCD_CTRL_H -#include -#include - -#define SWR_MAX_ROW 0 /* Rows = 48 */ -#define SWR_MAX_COL 7 /* Cols = 16 */ -#define SWR_MIN_COL 0 /* Cols = 2 */ - -#define SWR_WCD_NAME "swr-wcd" - -#define SWR_MSTR_PORT_LEN 8 /* Number of master ports */ - -#define SWR_MAX_SLAVE_DEVICES 11 - -#define SWRM_VERSION_1_0 0x01010000 -#define SWRM_VERSION_1_2 0x01030000 -#define SWRM_VERSION_1_3 0x01040000 - -enum { - SWR_MSTR_PAUSE, - SWR_MSTR_RESUME, - SWR_MSTR_UP, - SWR_MSTR_DOWN, - SWR_MSTR_SSR, -}; - -enum { - SWR_IRQ_FREE, - SWR_IRQ_REGISTER, -}; - -enum { - SWR_DAC_PORT, - SWR_COMP_PORT, - SWR_BOOST_PORT, - SWR_VISENSE_PORT, -}; - -struct usecase { - u8 num_port; - u8 num_ch; - u32 chrate; -}; - -struct port_params { - u8 si; - u8 off1; - u8 off2; -}; - -struct swrm_mports { - struct list_head list; - u8 id; -}; - -struct swr_ctrl_platform_data { - void *handle; /* holds priv data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); -}; - -struct swr_mstr_ctrl { - struct swr_master master; - struct device *dev; - struct resource *supplies; - struct clk *mclk; - int clk_ref_count; - struct completion reset; - struct completion broadcast; - struct mutex mlock; - struct mutex reslock; - u8 rcmd_id; - u8 wcmd_id; - void *handle; /* SWR Master handle from client for read and writes */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); - int irq; - int version; - u32 num_dev; - int num_enum_slaves; - int slave_status; - struct swr_mstr_port *mstr_port; - struct list_head mport_list; - int state; - struct platform_device *pdev; - int num_rx_chs; - u8 num_cfg_devs; - struct mutex force_down_lock; - int force_down_state; - - struct notifier_block event_notifier; - struct work_struct dc_presence_work; -}; - -#endif /* _SWR_WCD_CTRL_H */ diff --git a/techpack/audio/4.0/soc/swrm_registers.h b/techpack/audio/4.0/soc/swrm_registers.h deleted file mode 100644 index 63fe4ca744c4..000000000000 --- a/techpack/audio/4.0/soc/swrm_registers.h +++ /dev/null @@ -1,249 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2015, 2018-2019 The Linux Foundation. All rights reserved. - */ - -#ifndef _SWRM_REGISTERS_H -#define _SWRM_REGISTERS_H - -#define SWRM_BASE_ADDRESS 0x00 - -#define SWRM_COMP_HW_VERSION SWRM_BASE_ADDRESS -#define SWRM_COMP_CFG_ADDR (SWRM_BASE_ADDRESS+0x00000004) -#define SWRM_COMP_CFG_RMSK 0x3 -#define SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_BMSK 0x2 -#define SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_SHFT 0x1 -#define SWRM_COMP_CFG_ENABLE_BMSK 0x1 -#define SWRM_COMP_CFG_ENABLE_SHFT 0x0 - -#define SWRM_COMP_SW_RESET (SWRM_BASE_ADDRESS+0x00000008) -#define SWRM_COMP_STATUS (SWRM_BASE_ADDRESS+0x00000014) - -#define SWRM_COMP_PARAMS (SWRM_BASE_ADDRESS+0x100) -#define SWRM_COMP_PARAMS_DOUT_PORTS_MASK 0x0000001F -#define SWRM_COMP_PARAMS_DIN_PORTS_MASK 0x000003E0 -#define SWRM_COMP_PARAMS_WR_FIFO_DEPTH 0x00007C00 -#define SWRM_COMP_PARAMS_RD_FIFO_DEPTH 0x000F8000 -#define SWRM_COMP_PARAMS_AUTO_ENUM_SLAVES 0x00F00000 -#define SWRM_COMP_PARAMS_DATA_LANES 0x07000000 - -#define SWRM_COMP_MASTER_ID (SWRM_BASE_ADDRESS+0x104) - -#define SWRM_INTERRUPT_STATUS (SWRM_BASE_ADDRESS+0x00000200) -#define SWRM_INTERRUPT_STATUS_RMSK 0x1FFFD - -#define SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ 0x1 -#define SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED 0x2 -#define SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS 0x4 -#define SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET 0x8 -#define SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW 0x10 -#define SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW 0x20 -#define SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW 0x40 -#define SWRM_INTERRUPT_STATUS_CMD_ERROR 0x80 -#define SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION 0x100 -#define SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH 0x200 -#define SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED 0x400 -#define SWRM_INTERRUPT_STATUS_NEW_SLAVE_AUTO_ENUM_FINISHED 0x800 -#define SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED 0x1000 -#define SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL 0x2000 -#define SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED 0x4000 -#define SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED 0x8000 -#define SWRM_INTERRUPT_STATUS_ERROR_PORT_TEST 0x10000 - -#define SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED_V2 0x800 -#define SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL_V2 0x1000 -#define SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED_V2 0x2000 -#define SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED_V2 0x4000 -#define SWRM_INTERRUPT_STATUS_ERROR_PORT_TEST_V2 0x8000 -#define SWRM_INTERRUPT_STATUS_EXT_CLK_STOP_WAKEUP 0x10000 - -#define SWRM_INTERRUPT_MASK_ADDR (SWRM_BASE_ADDRESS+0x00000204) -#define SWRM_INTERRUPT_MASK_RMSK 0x1FFFF - -#define SWRM_INTERRUPT_MASK_SLAVE_PEND_IRQ_BMSK 0x1 -#define SWRM_INTERRUPT_MASK_SLAVE_PEND_IRQ_SHFT 0x0 - -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_ATTACHED_BMSK 0x2 -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_ATTACHED_SHFT 0x1 - -#define SWRM_INTERRUPT_MASK_CHANGE_ENUM_SLAVE_STATUS_BMSK 0x4 -#define SWRM_INTERRUPT_MASK_CHANGE_ENUM_SLAVE_STATUS_SHFT 0x2 - -#define SWRM_INTERRUPT_MASK_MASTER_CLASH_DET_BMSK 0x8 -#define SWRM_INTERRUPT_MASK_MASTER_CLASH_DET_SHFT 0x3 - -#define SWRM_INTERRUPT_MASK_RD_FIFO_OVERFLOW_BMSK 0x10 -#define SWRM_INTERRUPT_MASK_RD_FIFO_OVERFLOW_SHFT 0x4 - -#define SWRM_INTERRUPT_MASK_RD_FIFO_UNDERFLOW_BMSK 0x20 -#define SWRM_INTERRUPT_MASK_RD_FIFO_UNDERFLOW_SHFT 0x5 - -#define SWRM_INTERRUPT_MASK_WR_CMD_FIFO_OVERFLOW_BMSK 0x40 -#define SWRM_INTERRUPT_MASK_WR_CMD_FIFO_OVERFLOW_SHFT 0x6 - -#define SWRM_INTERRUPT_MASK_CMD_ERROR_BMSK 0x80 -#define SWRM_INTERRUPT_MASK_CMD_ERROR_SHFT 0x7 - -#define SWRM_INTERRUPT_MASK_DOUT_PORT_COLLISION_BMSK 0x100 -#define SWRM_INTERRUPT_MASK_DOUT_PORT_COLLISION_SHFT 0x8 - -#define SWRM_INTERRUPT_MASK_READ_EN_RD_VALID_MISMATCH_BMSK 0x200 -#define SWRM_INTERRUPT_MASK_READ_EN_RD_VALID_MISMATCH_SHFT 0x9 - -#define SWRM_INTERRUPT_MASK_SPECIAL_CMD_ID_FINISHED_BMSK 0x400 -#define SWRM_INTERRUPT_MASK_SPECIAL_CMD_ID_FINISHED_SHFT 0xA - -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_AUTO_ENUM_FINISHED_BMSK 0x800 -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_AUTO_ENUM_FINISHED_SHFT 0xB - -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_FAILED_BMSK 0x1000 -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_FAILED_SHFT 0xC - -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_TABLE_IS_FULL_BMSK 0x2000 -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_TABLE_IS_FULL_SHFT 0xD - -#define SWRM_INTERRUPT_MASK_BUS_RESET_FINISHED_BMSK 0x4000 -#define SWRM_INTERRUPT_MASK_BUS_RESET_FINISHED_SHFT 0xE - -#define SWRM_INTERRUPT_MASK_CLK_STOP_FINISHED_BMSK 0x8000 -#define SWRM_INTERRUPT_MASK_CLK_STOP_FINISHED_SHFT 0xF - -#define SWRM_INTERRUPT_MASK_ERROR_PORT_TEST_BMSK 0x10000 -#define SWRM_INTERRUPT_MASK_ERROR_PORT_TEST_SHFT 0x10 - -#define SWRM_INTERRUPT_MAX 0x11 - -#define SWRM_INTERRUPT_CLEAR (SWRM_BASE_ADDRESS+0x00000208) - -#define SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN (SWRM_BASE_ADDRESS+0x00000210) - -#define SWRM_CMD_FIFO_WR_CMD (SWRM_BASE_ADDRESS + 0x00000300) -#define SWRM_CMD_FIFO_WR_CMD_MASK 0xFFFFFFFF -#define SWRM_CMD_FIFO_RD_CMD (SWRM_BASE_ADDRESS + 0x00000304) -#define SWRM_CMD_FIFO_RD_CMD_MASK 0xFFFFFFF -#define SWRM_CMD_FIFO_CMD (SWRM_BASE_ADDRESS + 0x00000308) -#define SWRM_CMD_FIFO_STATUS (SWRM_BASE_ADDRESS + 0x0000030C) - -#define SWRM_CMD_FIFO_STATUS_WR_CMD_FIFO_CNT_MASK 0x1F00 -#define SWRM_CMD_FIFO_STATUS_RD_CMD_FIFO_CNT_MASK 0x7C00000 - -#define SWRM_CMD_FIFO_CFG_ADDR (SWRM_BASE_ADDRESS+0x00000314) -#define SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_BMSK 0x7 -#define SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT 0x0 - -#define SWRM_CMD_FIFO_RD_FIFO_ADDR (SWRM_BASE_ADDRESS + 0x00000318) - -#define SWRM_ENUMERATOR_CFG_ADDR (SWRM_BASE_ADDRESS+0x00000500) -#define SWRM_ENUMERATOR_CFG_AUTO_ENUM_EN_BMSK 0x1 -#define SWRM_ENUMERATOR_CFG_AUTO_ENUM_EN_SHFT 0x0 - -#define SWRM_ENUMERATOR_SLAVE_DEV_ID_1(m) (SWRM_BASE_ADDRESS+0x530+0x8*m) -#define SWRM_ENUMERATOR_SLAVE_DEV_ID_2(m) (SWRM_BASE_ADDRESS+0x534+0x8*m) - -#define SWRM_MCP_FRAME_CTRL_BANK_ADDR(m) (SWRM_BASE_ADDRESS+0x101C+0x40*m) -#define SWRM_MCP_FRAME_CTRL_BANK_RMSK 0x00ff07ff -#define SWRM_MCP_FRAME_CTRL_BANK_SHFT 0 -#define SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_BMSK 0xff0000 -#define SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT 16 -#define SWRM_MCP_FRAME_CTRL_BANK_PHASE_BMSK 0xf800 -#define SWRM_MCP_FRAME_CTRL_BANK_PHASE_SHFT 11 -#define SWRM_MCP_FRAME_CTRL_BANK_CLK_DIV_VALUE_BMSK 0x700 -#define SWRM_MCP_FRAME_CTRL_BANK_CLK_DIV_VALUE_SHFT 8 -#define SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK 0xF8 -#define SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT 3 -#define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK 0x7 -#define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT 0 - -#define SWRM_MCP_BUS_CTRL_ADDR (SWRM_BASE_ADDRESS+0x00001044) -#define SWRM_MCP_BUS_CTRL_BUS_RESET_BMSK 0x1 -#define SWRM_MCP_BUS_CTRL_BUS_RESET_SHFT 0x0 -#define SWRM_MCP_BUS_CTRL_CLK_START_BMSK 0x2 -#define SWRM_MCP_BUS_CTRL_CLK_START_SHFT 0x1 - -#define SWRM_MCP_CFG_ADDR (SWRM_BASE_ADDRESS+0x00001048) -#define SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK 0x3E0000 -#define SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT 0x11 -#define SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK 0x02 - -#define SWRM_MCP_STATUS (SWRM_BASE_ADDRESS+0x104C) -#define SWRM_MCP_STATUS_BANK_NUM_MASK 0x01 - -#define SWRM_MCP_SLV_STATUS (SWRM_BASE_ADDRESS+0x1090) -#define SWRM_MCP_SLV_STATUS_MASK 0x03 - -#define SWRM_DP_PORT_CTRL_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001124 + \ - 0x100*(n-1) + \ - 0x40*m) -#define SWRM_DP_PORT_CTRL_BANK_MASK 0xFFFFFFFF -#define SWRM_DP_PORT_CTRL_EN_CHAN_MASK 0xFF000000 -#define SWRM_DP_PORT_CTRL_EN_CHAN_SHFT 0x18 -#define SWRM_DP_PORT_CTRL_OFFSET2_SHFT 0x10 -#define SWRM_DP_PORT_CTRL_OFFSET1_SHFT 0x08 -#define SWRM_DP_PORT_CTRL_SAMPLE_INTERVAL 0x00 - -#define SWRM_DP_PORT_CTRL_2_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001128 + \ - 0x100*(n-1) + \ - 0x40*m) - -#define SWRM_DP_BLOCK_CTRL_1(n) (SWRM_BASE_ADDRESS + \ - 0x0000112C + \ - 0x100*(n-1)) - -#define SWRM_DP_BLOCK_CTRL2_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001130 + \ - 0x100*(n-1) + \ - 0x40*m) - -#define SWRM_DP_PORT_HCTRL_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001134 + \ - 0x100*(n-1) + \ - 0x40*m) - -#define SWRM_DP_BLOCK_CTRL3_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001138 + \ - 0x100*(n-1) + \ - 0x40*m) - - -#define SWRM_DIN_DPn_PCM_PORT_CTRL(n) (SWRM_BASE_ADDRESS + \ - 0x00001054 + 0x100*(n-1)) - -#define SWRM_MAX_REGISTER SWRM_DIN_DPn_PCM_PORT_CTRL(7) - -/* Soundwire Slave Register definition */ - -#define SWRS_BASE_ADDRESS 0x00 - -#define SWRS_DP_REG_OFFSET(port, bank) ((0x100*port)+(0x10*bank)) - -#define SWRS_SCP_INT_STATUS_CLEAR_1 0x40 -#define SWRS_SCP_INT_STATUS_MASK_1 0x41 - -#define SWRS_SCP_CONTROL 0x44 -#define SWRS_DP_BLOCK_CONTROL_1(n) (SWRS_BASE_ADDRESS + 0x103 + \ - 0x100 * n) - -#define SWRS_DP_CHANNEL_ENABLE_BANK(n, m) (SWRS_BASE_ADDRESS + 0x120 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_BLOCK_CONTROL_2_BANK(n, m) (SWRS_BASE_ADDRESS + 0x121 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_SAMPLE_CONTROL_1_BANK(n, m) (SWRS_BASE_ADDRESS + 0x122 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_OFFSET_CONTROL_1_BANK(n, m) (SWRS_BASE_ADDRESS + 0x124 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_OFFSET_CONTROL_2_BANK(n, m) (SWRS_BASE_ADDRESS + 0x125 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_HCONTROL_BANK(n, m) (SWRS_BASE_ADDRESS + 0x126 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_BLOCK_CONTROL_3_BANK(n, m) (SWRS_BASE_ADDRESS + 0x127 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_LANE_CONTROL_BANK(n, m) (SWRS_BASE_ADDRESS + 0x128 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_SCP_FRAME_CTRL_BANK(m) (SWRS_BASE_ADDRESS + 0x60 + \ - 0x10*m) -#define SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(m) (SWRS_BASE_ADDRESS + 0xE0 + \ - 0x10*m) - -#endif /* _SWRM_REGISTERS_H */ diff --git a/techpack/audio/4.0/soc/wcd-spi-ac.c b/techpack/audio/4.0/soc/wcd-spi-ac.c deleted file mode 100644 index 2a822b2b1b37..000000000000 --- a/techpack/audio/4.0/soc/wcd-spi-ac.c +++ /dev/null @@ -1,991 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wcd_spi_ctl_v01.h" - -#define WCD_SPI_AC_PFS_ENTRY_MAX_LEN 16 -#define WCD_SPI_AC_WRITE_CMD_MIN_SIZE \ - (sizeof(struct wcd_spi_ac_write_cmd)) -#define WCD_SPI_AC_WRITE_CMD_MAX_SIZE \ - (WCD_SPI_AC_WRITE_CMD_MIN_SIZE + \ - (WCD_SPI_AC_MAX_BUFFERS * \ - sizeof(struct wcd_spi_ac_buf_data))) - -#define WCD_SPI_AC_MUTEX_LOCK(dev, lock) \ -{ \ - dev_dbg(dev, "%s: mutex_lock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_lock(&lock); \ -} - -#define WCD_SPI_AC_MUTEX_UNLOCK(dev, lock) \ -{ \ - dev_dbg(dev, "%s: mutex_unlock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_unlock(&lock); \ -} - -/* - * All bits of status should be cleared for SPI access - * to be released. - */ -#define WCD_SPI_AC_STATUS_RELEASE_ACCESS 0x00 -#define WCD_SPI_AC_LOCAL_ACCESS 0x00 -#define WCD_SPI_AC_REMOTE_ACCESS 0x01 -#define WCD_SPI_CTL_INS_ID 0 -#define WCD_SPI_AC_QMI_TIMEOUT_MS 100 - -struct wcd_spi_ac_priv { - - /* Pointer to device for this driver */ - struct device *dev; - - /* Pointer to parent's device */ - struct device *parent; - - /* char dev related */ - struct class *cls; - struct device *chardev; - struct cdev cdev; - dev_t cdev_num; - - /* proc entry related */ - struct proc_dir_entry *pfs_root; - struct proc_dir_entry *pfs_status; - - /* service status related */ - u8 svc_offline; - u8 svc_offline_change; - wait_queue_head_t svc_poll_wait; - struct mutex status_lock; - - /* state maintenence related */ - u32 state; - struct mutex state_lock; - u8 current_access; - - /* qmi related */ - struct qmi_handle *qmi_hdl; - struct work_struct svc_arr_work; - struct work_struct svc_exit_work; - struct notifier_block nb; - struct mutex svc_lock; - struct workqueue_struct *qmi_wq; - struct work_struct recv_msg_work; -}; - - -static void wcd_spi_ac_status_change(struct wcd_spi_ac_priv *ac, - u8 online) -{ - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->status_lock); - ac->svc_offline = !online; - /* Make sure the write is complete */ - wmb(); - xchg(&ac->svc_offline_change, 1); - wake_up_interruptible(&ac->svc_poll_wait); - dev_dbg(ac->dev, - "%s request %u offline %u off_change %u\n", - __func__, online, ac->svc_offline, - ac->svc_offline_change); - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->status_lock); -} - -static int wcd_spi_ac_status_open(struct inode *inode, - struct file *file) -{ - struct wcd_spi_ac_priv *ac = PDE_DATA(inode); - - file->private_data = ac; - - return 0; -} - -static ssize_t wcd_spi_ac_status_read(struct file *file, - char __user *buffer, - size_t count, loff_t *offset) -{ - struct wcd_spi_ac_priv *ac; - char buf[WCD_SPI_AC_PFS_ENTRY_MAX_LEN]; - int len, ret; - u8 offline; - - ac = (struct wcd_spi_ac_priv *) file->private_data; - if (!ac) { - pr_err("%s: Invalid private data for status\n", - __func__); - return -EINVAL; - } - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->status_lock); - offline = ac->svc_offline; - /* Make sure the read is complete */ - rmb(); - dev_dbg(ac->dev, "%s: offline = %sline\n", - __func__, offline ? "off" : "on"); - len = snprintf(buf, sizeof(buf), "%s\n", - offline ? "OFFLINE" : "ONLINE"); - ret = simple_read_from_buffer(buffer, count, offset, buf, len); - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->status_lock); - - return ret; -} - -static unsigned int wcd_spi_ac_status_poll(struct file *file, - poll_table *wait) -{ - struct wcd_spi_ac_priv *ac; - unsigned int ret = 0; - - ac = (struct wcd_spi_ac_priv *) file->private_data; - if (!ac) { - pr_err("%s: Invalid private data for status\n", - __func__); - return -EINVAL; - } - - dev_dbg(ac->dev, "%s: Poll wait, svc = %s\n", - __func__, ac->svc_offline ? "offline" : "online"); - poll_wait(file, &ac->svc_poll_wait, wait); - dev_dbg(ac->dev, "%s: Woken up Poll wait, svc = %s\n", - __func__, ac->svc_offline ? "offline" : "online"); - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->status_lock); - if (xchg(&ac->svc_offline_change, 0)) - ret = POLLIN | POLLPRI | POLLRDNORM; - dev_dbg(ac->dev, "%s: ret (%d) from poll_wait\n", - __func__, ret); - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->status_lock); - - return ret; -} - -static const struct file_operations wcd_spi_ac_status_ops = { - .owner = THIS_MODULE, - .open = wcd_spi_ac_status_open, - .read = wcd_spi_ac_status_read, - .poll = wcd_spi_ac_status_poll, -}; - -static int wcd_spi_ac_procfs_init(struct wcd_spi_ac_priv *ac) -{ - int ret = 0; - - ac->pfs_root = proc_mkdir(WCD_SPI_AC_PROCFS_DIR_NAME, NULL); - if (!ac->pfs_root) { - dev_err(ac->dev, "%s: proc_mkdir failed\n", __func__); - return -EINVAL; - } - - ac->pfs_status = proc_create_data(WCD_SPI_AC_PROCFS_STATE_NAME, - 0444, ac->pfs_root, - &wcd_spi_ac_status_ops, - ac); - if (!ac->pfs_status) { - dev_err(ac->dev, "%s: proc_create_data failed\n", - __func__); - ret = -EINVAL; - goto rmdir_root; - } - - proc_set_size(ac->pfs_status, WCD_SPI_AC_PFS_ENTRY_MAX_LEN); - - return 0; - -rmdir_root: - proc_remove(ac->pfs_root); - return ret; -} - -static void wcd_spi_ac_procfs_deinit(struct wcd_spi_ac_priv *ac) -{ - proc_remove(ac->pfs_status); - proc_remove(ac->pfs_root); -} - -static int wcd_spi_ac_request_access(struct wcd_spi_ac_priv *ac, - bool is_svc_locked) -{ - struct wcd_spi_req_access_msg_v01 req; - struct wcd_spi_req_access_resp_v01 rsp; - struct msg_desc req_desc, rsp_desc; - int ret = 0; - - dev_dbg(ac->dev, "%s: is_svc_locked = %s\n", - __func__, is_svc_locked ? "true" : "false"); - - memset(&req, 0, sizeof(req)); - memset(&rsp, 0, sizeof(rsp)); - - req.reason_valid = 1; - req.reason = ac->state & 0x03; - - req_desc.max_msg_len = WCD_SPI_REQ_ACCESS_MSG_V01_MAX_MSG_LEN; - req_desc.msg_id = WCD_SPI_REQ_ACCESS_MSG_V01; - req_desc.ei_array = wcd_spi_req_access_msg_v01_ei; - - rsp_desc.max_msg_len = WCD_SPI_REQ_ACCESS_RESP_V01_MAX_MSG_LEN; - rsp_desc.msg_id = WCD_SPI_REQ_ACCESS_RESP_V01; - rsp_desc.ei_array = wcd_spi_req_access_resp_v01_ei; - - if (!is_svc_locked) - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->svc_lock); - - ret = qmi_send_req_wait(ac->qmi_hdl, - &req_desc, &req, sizeof(req), - &rsp_desc, &rsp, sizeof(rsp), - WCD_SPI_AC_QMI_TIMEOUT_MS); - if (ret) { - dev_err(ac->dev, "%s: msg send failed %d\n", - __func__, ret); - goto done; - } - - if (rsp.resp.result != QMI_RESULT_SUCCESS_V01) { - ret = -EIO; - dev_err(ac->dev, "%s: qmi resp error %d\n", - __func__, rsp.resp.result); - } -done: - if (!is_svc_locked) - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->svc_lock); - - return ret; -} - -static int wcd_spi_ac_release_access(struct wcd_spi_ac_priv *ac, - bool is_svc_locked) -{ - struct wcd_spi_rel_access_msg_v01 req; - struct wcd_spi_rel_access_resp_v01 rsp; - struct msg_desc req_desc, rsp_desc; - int ret = 0; - - dev_dbg(ac->dev, "%s: is_svc_locked = %s\n", - __func__, is_svc_locked ? "true" : "false"); - - memset(&req, 0, sizeof(req)); - memset(&rsp, 0, sizeof(rsp)); - - req_desc.max_msg_len = WCD_SPI_REL_ACCESS_MSG_V01_MAX_MSG_LEN; - req_desc.msg_id = WCD_SPI_REL_ACCESS_MSG_V01; - req_desc.ei_array = wcd_spi_rel_access_msg_v01_ei; - - rsp_desc.max_msg_len = WCD_SPI_REL_ACCESS_RESP_V01_MAX_MSG_LEN; - rsp_desc.msg_id = WCD_SPI_REL_ACCESS_RESP_V01; - rsp_desc.ei_array = wcd_spi_rel_access_resp_v01_ei; - - if (!is_svc_locked) - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->svc_lock); - - ret = qmi_send_req_wait(ac->qmi_hdl, - &req_desc, &req, sizeof(req), - &rsp_desc, &rsp, sizeof(rsp), - WCD_SPI_AC_QMI_TIMEOUT_MS); - if (ret) { - dev_err(ac->dev, "%s: msg send failed %d\n", - __func__, ret); - goto done; - } - - if (rsp.resp.result != QMI_RESULT_SUCCESS_V01) { - ret = -EIO; - dev_err(ac->dev, "%s: qmi resp error %d\n", - __func__, rsp.resp.result); - } -done: - if (!is_svc_locked) - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->svc_lock); - return ret; -} - -static int wcd_spi_ac_buf_msg( - struct wcd_spi_ac_priv *ac, - u8 *data, int data_sz) -{ - struct wcd_spi_ac_buf_data *buf_data; - struct wcd_spi_buff_msg_v01 req; - struct wcd_spi_buff_resp_v01 rsp; - struct msg_desc req_desc, rsp_desc; - int ret = 0; - - memset(&req, 0, sizeof(req)); - memset(&rsp, 0, sizeof(rsp)); - - buf_data = (struct wcd_spi_ac_buf_data *) data; - memcpy(req.buff_addr_1, buf_data, - sizeof(*buf_data)); - - if (data_sz - sizeof(*buf_data) != 0) { - req.buff_addr_2_valid = 1; - buf_data++; - memcpy(req.buff_addr_2, buf_data, - sizeof(*buf_data)); - } - - req_desc.max_msg_len = WCD_SPI_BUFF_MSG_V01_MAX_MSG_LEN; - req_desc.msg_id = WCD_SPI_BUFF_MSG_V01; - req_desc.ei_array = wcd_spi_buff_msg_v01_ei; - - rsp_desc.max_msg_len = WCD_SPI_BUFF_RESP_V01_MAX_MSG_LEN; - rsp_desc.msg_id = WCD_SPI_BUFF_RESP_V01; - rsp_desc.ei_array = wcd_spi_buff_resp_v01_ei; - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->svc_lock); - ret = qmi_send_req_wait(ac->qmi_hdl, - &req_desc, &req, sizeof(req), - &rsp_desc, &rsp, sizeof(rsp), - WCD_SPI_AC_QMI_TIMEOUT_MS); - - if (ret) { - dev_err(ac->dev, "%s: msg send failed %d\n", - __func__, ret); - goto done; - } - - if (rsp.resp.result != QMI_RESULT_SUCCESS_V01) { - ret = -EIO; - dev_err(ac->dev, "%s: qmi resp error %d\n", - __func__, rsp.resp.result); - } -done: - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->svc_lock); - return ret; - -} - -/* - * wcd_spi_ac_set_sync: Sets the current status of the SPI - * bus and requests access if not - * already accesible. - * @ac: pointer to the drivers private data - * @value: value to be set in the status mask - * @is_svc_locked: flag to indicate if svc_lock is acquired by caller - */ -static int wcd_spi_ac_set_sync(struct wcd_spi_ac_priv *ac, - u32 value, bool is_svc_locked) -{ - int ret = 0; - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->state_lock); - ac->state |= value; - /* any non-zero state indicates us to request SPI access */ - wmb(); - dev_dbg(ac->dev, "%s: current state = 0x%x, current access 0x%x\n", - __func__, ac->state, ac->current_access); - if (ac->current_access == WCD_SPI_AC_REMOTE_ACCESS) { - dev_dbg(ac->dev, - "%s: requesting access, state = 0x%x\n", - __func__, ac->state); - ret = wcd_spi_ac_request_access(ac, is_svc_locked); - if (!ret) - ac->current_access = WCD_SPI_AC_LOCAL_ACCESS; - } - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->state_lock); - - return ret; -} - -/* - * wcd_spi_ac_clear_sync: Clears the current status of the SPI - * bus and releases access if applicable - * @ac: pointer to the drivers private data - * @value: value to be cleared in the status mask - * @is_svc_locked: flag to indicate if svc_lock is acquired by caller - */ -static int wcd_spi_ac_clear_sync(struct wcd_spi_ac_priv *ac, - u32 value, bool is_svc_locked) -{ - int ret = 0; - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->state_lock); - ac->state &= ~(value); - /* make sure value is written before read */ - wmb(); - dev_dbg(ac->dev, "%s: current state = 0x%x, current access 0x%x\n", - __func__, ac->state, ac->current_access); - /* state should be zero to release SPI access */ - if (!ac->state && - ac->current_access == WCD_SPI_AC_LOCAL_ACCESS) { - dev_dbg(ac->dev, - "%s: releasing access, state = 0x%x\n", - __func__, ac->state); - ret = wcd_spi_ac_release_access(ac, is_svc_locked); - if (!ret) - ac->current_access = WCD_SPI_AC_REMOTE_ACCESS; - } - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->state_lock); - - return ret; - -} - -/* - * wcd_spi_access_ctl: API to request/release the access - * to wcd-spi bus. - * @dev: handle to the wcd-spi-ac device - * @request: enum to indicate access request or access release - * @reason: reason for request/release. Must be one of the - * valid reasons. - * Returns success if the access handover was sucessful, - * negative error code otherwise. - */ -int wcd_spi_access_ctl(struct device *dev, - enum wcd_spi_acc_req request, - u32 reason) -{ - struct wcd_spi_ac_priv *ac; - int ret = 0; - - if (!dev) { - pr_err("%s: invalid device\n", __func__); - return -EINVAL; - } - - /* only data_transfer and remote_down are valid reasons */ - if (reason != WCD_SPI_AC_DATA_TRANSFER && - reason != WCD_SPI_AC_REMOTE_DOWN) { - pr_err("%s: Invalid reason 0x%x\n", - __func__, reason); - return -EINVAL; - } - - ac = (struct wcd_spi_ac_priv *) dev_get_drvdata(dev); - if (!ac) { - dev_err(dev, "%s: invalid driver data\n", __func__); - return -EINVAL; - } - - dev_dbg(dev, "%s: request = 0x%x, reason = 0x%x\n", - __func__, request, reason); - - switch (request) { - case WCD_SPI_ACCESS_REQUEST: - ret = wcd_spi_ac_set_sync(ac, reason, false); - if (ret) - dev_err(dev, "%s: set_sync(0x%x) failed %d\n", - __func__, reason, ret); - break; - case WCD_SPI_ACCESS_RELEASE: - ret = wcd_spi_ac_clear_sync(ac, reason, false); - if (ret) - dev_err(dev, "%s: clear_sync(0x%x) failed %d\n", - __func__, reason, ret); - break; - default: - dev_err(dev, "%s: invalid request 0x%x\n", - __func__, request); - break; - } - - return ret; -} -EXPORT_SYMBOL(wcd_spi_access_ctl); - -static int wcd_spi_ac_cdev_open(struct inode *inode, - struct file *file) -{ - struct wcd_spi_ac_priv *ac; - int ret = 0; - - ac = container_of(inode->i_cdev, struct wcd_spi_ac_priv, cdev); - if (!ac) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->status_lock); - if (ac->svc_offline) { - dev_err(ac->dev, "%s: SVC is not online, cannot open driver\n", - __func__); - ret = -ENODEV; - goto done; - } - - file->private_data = ac; - -done: - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->status_lock); - return ret; -} - -static ssize_t wcd_spi_ac_cdev_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - struct wcd_spi_ac_priv *ac; - struct wcd_spi_ac_write_cmd *cmd_buf; - int ret = 0; - int data_sz; - - ac = (struct wcd_spi_ac_priv *) file->private_data; - if (!ac) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - if (count < WCD_SPI_AC_WRITE_CMD_MIN_SIZE || - count > WCD_SPI_AC_WRITE_CMD_MAX_SIZE) { - dev_err(ac->dev, "%s: Invalid write count %zd\n", - __func__, count); - return -EINVAL; - } - - cmd_buf = kzalloc(count, GFP_KERNEL); - if (!cmd_buf) - return -ENOMEM; - - if (get_user(cmd_buf->cmd_type, buf)) { - dev_err(ac->dev, "%s: get_user failed\n", __func__); - ret = -EFAULT; - goto free_cmd_buf; - } - - dev_dbg(ac->dev, "%s: write cmd type 0x%x\n", - __func__, cmd_buf->cmd_type); - - switch (cmd_buf->cmd_type) { - - case WCD_SPI_AC_CMD_CONC_BEGIN: - ret = wcd_spi_ac_set_sync(ac, WCD_SPI_AC_CONCURRENCY, false); - if (ret) { - dev_err(ac->dev, "%s: set_sync(CONC) fail %d\n", - __func__, ret); - goto free_cmd_buf; - } - - break; - - case WCD_SPI_AC_CMD_CONC_END: - ret = wcd_spi_ac_clear_sync(ac, WCD_SPI_AC_CONCURRENCY, false); - if (ret) { - dev_err(ac->dev, "%s: clear_sync(CONC) fail %d\n", - __func__, ret); - goto free_cmd_buf; - } - - break; - - case WCD_SPI_AC_CMD_BUF_DATA: - - /* Read the buffer details and send to service */ - data_sz = count - sizeof(cmd_buf->cmd_type); - - if (!data_sz || - (data_sz % sizeof(struct wcd_spi_ac_buf_data))) { - dev_err(ac->dev, "%s: size %d not multiple of %ld\n", - __func__, data_sz, - sizeof(struct wcd_spi_ac_buf_data)); - goto free_cmd_buf; - } - - if (data_sz / sizeof(struct wcd_spi_ac_buf_data) > - WCD_SPI_AC_MAX_BUFFERS) { - dev_err(ac->dev, "%s: invalid size %d\n", - __func__, data_sz); - goto free_cmd_buf; - } - - if (copy_from_user(cmd_buf->payload, - buf + sizeof(cmd_buf->cmd_type), - data_sz)) { - dev_err(ac->dev, "%s: copy_from_user failed\n", - __func__); - ret = -EFAULT; - goto free_cmd_buf; - } - - ret = wcd_spi_ac_buf_msg(ac, cmd_buf->payload, data_sz); - if (ret) { - dev_err(ac->dev, "%s: _buf_msg failed %d\n", - __func__, ret); - goto free_cmd_buf; - } - - ret = wcd_spi_ac_clear_sync(ac, WCD_SPI_AC_UNINITIALIZED, - false); - if (ret) { - dev_err(ac->dev, "%s: clear_sync 0x%lx failed %d\n", - __func__, WCD_SPI_AC_UNINITIALIZED, ret); - goto free_cmd_buf; - } - break; - default: - dev_err(ac->dev, "%s: Invalid cmd_type 0x%x\n", - __func__, cmd_buf->cmd_type); - ret = -EINVAL; - goto free_cmd_buf; - } - -free_cmd_buf: - - kfree(cmd_buf); - if (!ret) - ret = count; - - return ret; -} - -static int wcd_spi_ac_cdev_release(struct inode *inode, - struct file *file) -{ - struct wcd_spi_ac_priv *ac; - int ret = 0; - - ac = (struct wcd_spi_ac_priv *) file->private_data; - if (!ac) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - ret = wcd_spi_ac_set_sync(ac, WCD_SPI_AC_UNINITIALIZED, false); - if (ret) - dev_err(ac->dev, "%s: set_sync(UNINITIALIZED) failed %d\n", - __func__, ret); - return ret; -} - -static const struct file_operations wcd_spi_ac_cdev_fops = { - .owner = THIS_MODULE, - .open = wcd_spi_ac_cdev_open, - .write = wcd_spi_ac_cdev_write, - .release = wcd_spi_ac_cdev_release, -}; - -static int wcd_spi_ac_reg_chardev(struct wcd_spi_ac_priv *ac) -{ - int ret; - - ret = alloc_chrdev_region(&ac->cdev_num, 0, 1, - WCD_SPI_AC_CLIENT_CDEV_NAME); - if (ret) { - dev_err(ac->dev, "%s: alloc_chrdev_region failed %d\n", - __func__, ret); - return ret; - } - - ac->cls = class_create(THIS_MODULE, WCD_SPI_AC_CLIENT_CDEV_NAME); - if (IS_ERR(ac->cls)) { - ret = PTR_ERR(ac->cls); - dev_err(ac->dev, "%s: class_create failed %d\n", - __func__, ret); - goto unregister_chrdev; - } - - ac->chardev = device_create(ac->cls, NULL, ac->cdev_num, - NULL, WCD_SPI_AC_CLIENT_CDEV_NAME); - if (IS_ERR(ac->chardev)) { - ret = PTR_ERR(ac->chardev); - dev_err(ac->dev, "%s: device_create failed %d\n", - __func__, ret); - goto destroy_class; - } - - cdev_init(&ac->cdev, &wcd_spi_ac_cdev_fops); - ret = cdev_add(&ac->cdev, ac->cdev_num, 1); - if (ret) { - dev_err(ac->dev, "%s: cdev_add failed %d\n", - __func__, ret); - goto destroy_device; - } - - return 0; - -destroy_device: - device_destroy(ac->cls, ac->cdev_num); - -destroy_class: - class_destroy(ac->cls); - -unregister_chrdev: - unregister_chrdev_region(0, 1); - return ret; -} - -static int wcd_spi_ac_unreg_chardev(struct wcd_spi_ac_priv *ac) -{ - cdev_del(&ac->cdev); - device_destroy(ac->cls, ac->cdev_num); - class_destroy(ac->cls); - unregister_chrdev_region(0, 1); - - return 0; -} - -static void wcd_spi_ac_recv_msg(struct work_struct *work) -{ - struct wcd_spi_ac_priv *ac; - int rc = 0; - - ac = container_of(work, struct wcd_spi_ac_priv, - recv_msg_work); - if (!ac) { - pr_err("%s: Invalid private data\n", __func__); - return; - } - - do { - dev_dbg(ac->dev, "%s: msg received, rc = %d\n", - __func__, rc); - } while ((rc = qmi_recv_msg(ac->qmi_hdl)) == 0); - - if (rc != -ENOMSG) - dev_err(ac->dev, "%s: qmi_recv_msg failed %d\n", - __func__, rc); -} - -static void wcd_spi_ac_clnt_notify(struct qmi_handle *hdl, - enum qmi_event_type event, void *priv_data) -{ - struct wcd_spi_ac_priv *ac; - - if (!priv_data) { - pr_err("%s: Invalid private data\n", __func__); - return; - } - - ac = (struct wcd_spi_ac_priv *) priv_data; - - switch (event) { - case QMI_RECV_MSG: - queue_work(ac->qmi_wq, &ac->recv_msg_work); - break; - default: - break; - } -} - -static void wcd_spi_ac_svc_arrive(struct work_struct *work) -{ - struct wcd_spi_ac_priv *ac; - int ret; - - ac = container_of(work, struct wcd_spi_ac_priv, - svc_arr_work); - if (!ac) { - pr_err("%s: Invalid private data\n", - __func__); - return; - } - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->svc_lock); - ac->qmi_hdl = qmi_handle_create(wcd_spi_ac_clnt_notify, - ac); - if (!ac->qmi_hdl) { - dev_err(ac->dev, "%s: qmi_handle_create failed\n", - __func__); - goto done; - } - - ret = qmi_connect_to_service(ac->qmi_hdl, - WCD_SPI_CTL_SERVICE_ID_V01, - WCD_SPI_CTL_SERVICE_VERS_V01, - WCD_SPI_CTL_INS_ID); - if (ret) { - dev_err(ac->dev, "%s, cant connect to service, error %d\n", - __func__, ret); - qmi_handle_destroy(ac->qmi_hdl); - ac->qmi_hdl = NULL; - goto done; - } - - /* Mark service as online */ - wcd_spi_ac_status_change(ac, 1); - - /* - * update the state and clear the WCD_SPI_AC_SVC_OFFLINE - * bit to indicate that the service is now online. - */ - ret = wcd_spi_ac_clear_sync(ac, WCD_SPI_AC_SVC_OFFLINE, true); - if (ret) - dev_err(ac->dev, "%s: clear_sync(SVC_OFFLINE) failed %d\n", - __func__, ret); -done: - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->svc_lock); - -} - -static void wcd_spi_ac_svc_exit(struct work_struct *work) -{ - struct wcd_spi_ac_priv *ac; - int ret = 0; - - ac = container_of(work, struct wcd_spi_ac_priv, - svc_exit_work); - if (!ac) { - pr_err("%s: Invalid private data\n", - __func__); - return; - } - - WCD_SPI_AC_MUTEX_LOCK(ac->dev, ac->svc_lock); - ret = wcd_spi_ac_set_sync(ac, WCD_SPI_AC_SVC_OFFLINE, true); - if (ret) - dev_err(ac->dev, "%s: set_sync(SVC_OFFLINE) failed %d\n", - __func__, ret); - qmi_handle_destroy(ac->qmi_hdl); - ac->qmi_hdl = NULL; - wcd_spi_ac_status_change(ac, 0); - WCD_SPI_AC_MUTEX_UNLOCK(ac->dev, ac->svc_lock); -} - -static int wcd_spi_ac_svc_event(struct notifier_block *this, - unsigned long event, - void *data) -{ - struct wcd_spi_ac_priv *ac; - - ac = container_of(this, struct wcd_spi_ac_priv, nb); - if (!ac) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - dev_dbg(ac->dev, "%s: event = 0x%lx", __func__, event); - - switch (event) { - case QMI_SERVER_ARRIVE: - schedule_work(&ac->svc_arr_work); - break; - case QMI_SERVER_EXIT: - schedule_work(&ac->svc_exit_work); - break; - default: - dev_err(ac->dev, "%s unhandled event %ld\n", - __func__, event); - break; - } - - return 0; -} - -static int wcd_spi_ac_probe(struct platform_device *pdev) -{ - struct wcd_spi_ac_priv *ac; - struct device *parent = pdev->dev.parent; - int ret = 0; - - ac = devm_kzalloc(&pdev->dev, sizeof(*ac), - GFP_KERNEL); - if (!ac) - return -ENOMEM; - - ac->dev = &pdev->dev; - ac->parent = parent; - - ret = wcd_spi_ac_reg_chardev(ac); - if (ret) - return ret; - - ret = wcd_spi_ac_procfs_init(ac); - if (ret) - goto unreg_chardev; - - mutex_init(&ac->status_lock); - mutex_init(&ac->state_lock); - mutex_init(&ac->svc_lock); - init_waitqueue_head(&ac->svc_poll_wait); - ac->svc_offline = 1; - ac->state = (WCD_SPI_AC_SVC_OFFLINE | - WCD_SPI_AC_UNINITIALIZED); - ac->current_access = WCD_SPI_AC_LOCAL_ACCESS; - - ac->nb.notifier_call = wcd_spi_ac_svc_event; - INIT_WORK(&ac->svc_arr_work, wcd_spi_ac_svc_arrive); - INIT_WORK(&ac->svc_exit_work, wcd_spi_ac_svc_exit); - INIT_WORK(&ac->recv_msg_work, wcd_spi_ac_recv_msg); - - ac->qmi_wq = create_singlethread_workqueue("qmi_wq"); - if (!ac->qmi_wq) { - dev_err(&pdev->dev, - "%s: create_singlethread_workqueue failed\n", - __func__); - goto deinit_procfs; - } - - dev_set_drvdata(&pdev->dev, ac); - - ret = qmi_svc_event_notifier_register( - WCD_SPI_CTL_SERVICE_ID_V01, - WCD_SPI_CTL_SERVICE_VERS_V01, - WCD_SPI_CTL_INS_ID, - &ac->nb); - if (ret) { - dev_err(&pdev->dev, - "%s: qmi_svc_event_notifier_register failed %d\n", - __func__, ret); - goto destroy_wq; - } - - return 0; - -destroy_wq: - destroy_workqueue(ac->qmi_wq); - dev_set_drvdata(&pdev->dev, NULL); -deinit_procfs: - wcd_spi_ac_procfs_deinit(ac); - mutex_destroy(&ac->status_lock); - mutex_destroy(&ac->state_lock); - mutex_destroy(&ac->svc_lock); -unreg_chardev: - wcd_spi_ac_unreg_chardev(ac); - return ret; -} - -static int wcd_spi_ac_remove(struct platform_device *pdev) -{ - struct wcd_spi_ac_priv *ac; - - ac = dev_get_drvdata(&pdev->dev); - qmi_svc_event_notifier_unregister( - WCD_SPI_CTL_SERVICE_ID_V01, - WCD_SPI_CTL_SERVICE_VERS_V01, - WCD_SPI_CTL_INS_ID, - &ac->nb); - if (ac->qmi_wq) - destroy_workqueue(ac->qmi_wq); - wcd_spi_ac_unreg_chardev(ac); - wcd_spi_ac_procfs_deinit(ac); - mutex_destroy(&ac->status_lock); - mutex_destroy(&ac->state_lock); - mutex_destroy(&ac->svc_lock); - - return 0; -} - -static const struct of_device_id wcd_spi_ac_of_match[] = { - { .compatible = "qcom,wcd-spi-ac" }, - { }, -}; - -MODULE_DEVICE_TABLE(of, wcd_spi_ac_of_match); - -static struct platform_driver wcd_spi_ac_driver = { - .driver = { - .name = "qcom,wcd-spi-ac", - .of_match_table = wcd_spi_ac_of_match, - .suppress_bind_attrs = true, - }, - .probe = wcd_spi_ac_probe, - .remove = wcd_spi_ac_remove, -}; - -module_platform_driver(wcd_spi_ac_driver); - -MODULE_DESCRIPTION("WCD SPI access control driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/4.0/soc/wcd_spi_ctl_v01.c b/techpack/audio/4.0/soc/wcd_spi_ctl_v01.c deleted file mode 100644 index a803fd0dcdbf..000000000000 --- a/techpack/audio/4.0/soc/wcd_spi_ctl_v01.c +++ /dev/null @@ -1,129 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ -#include -#include -#include "wcd_spi_ctl_v01.h" - -struct elem_info wcd_spi_req_access_msg_v01_ei[] = { - { - .data_type = QMI_OPT_FLAG, - .elem_len = 1, - .elem_size = sizeof(u8), - .is_array = NO_ARRAY, - .tlv_type = 0x10, - .offset = offsetof(struct wcd_spi_req_access_msg_v01, - reason_valid), - }, - { - .data_type = QMI_UNSIGNED_8_BYTE, - .elem_len = 1, - .elem_size = sizeof(u64), - .is_array = NO_ARRAY, - .tlv_type = 0x10, - .offset = offsetof(struct wcd_spi_req_access_msg_v01, - reason), - }, - { - .data_type = QMI_EOTI, - .is_array = NO_ARRAY, - .tlv_type = QMI_COMMON_TLV_TYPE, - }, -}; - -struct elem_info wcd_spi_req_access_resp_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, - .elem_size = sizeof(struct qmi_response_type_v01), - .is_array = NO_ARRAY, - .tlv_type = 0x02, - .offset = offsetof(struct wcd_spi_req_access_resp_v01, - resp), - .ei_array = get_qmi_response_type_v01_ei(), - }, - { - .data_type = QMI_EOTI, - .is_array = NO_ARRAY, - .tlv_type = QMI_COMMON_TLV_TYPE, - }, -}; - -struct elem_info wcd_spi_rel_access_msg_v01_ei[] = { - { - .data_type = QMI_EOTI, - .is_array = NO_ARRAY, - .tlv_type = QMI_COMMON_TLV_TYPE, - }, -}; - -struct elem_info wcd_spi_rel_access_resp_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, - .elem_size = sizeof(struct qmi_response_type_v01), - .is_array = NO_ARRAY, - .tlv_type = 0x02, - .offset = offsetof(struct wcd_spi_rel_access_resp_v01, - resp), - .ei_array = get_qmi_response_type_v01_ei(), - }, - { - .data_type = QMI_EOTI, - .is_array = NO_ARRAY, - .tlv_type = QMI_COMMON_TLV_TYPE, - }, -}; - -struct elem_info wcd_spi_buff_msg_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = WCD_SPI_BUFF_CHANNELS_MAX_V01, - .elem_size = sizeof(u32), - .is_array = STATIC_ARRAY, - .tlv_type = 0x01, - .offset = offsetof(struct wcd_spi_buff_msg_v01, - buff_addr_1), - }, - { - .data_type = QMI_OPT_FLAG, - .elem_len = 1, - .elem_size = sizeof(u8), - .is_array = NO_ARRAY, - .tlv_type = 0x10, - .offset = offsetof(struct wcd_spi_buff_msg_v01, - buff_addr_2_valid), - }, - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = WCD_SPI_BUFF_CHANNELS_MAX_V01, - .elem_size = sizeof(u32), - .is_array = STATIC_ARRAY, - .tlv_type = 0x10, - .offset = offsetof(struct wcd_spi_buff_msg_v01, - buff_addr_2), - }, - { - .data_type = QMI_EOTI, - .is_array = NO_ARRAY, - .tlv_type = QMI_COMMON_TLV_TYPE, - }, -}; - -struct elem_info wcd_spi_buff_resp_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, - .elem_size = sizeof(struct qmi_response_type_v01), - .is_array = NO_ARRAY, - .tlv_type = 0x02, - .offset = offsetof(struct wcd_spi_buff_resp_v01, - resp), - .ei_array = get_qmi_response_type_v01_ei(), - }, - { - .data_type = QMI_EOTI, - .is_array = NO_ARRAY, - .tlv_type = QMI_COMMON_TLV_TYPE, - }, -}; diff --git a/techpack/audio/4.0/soc/wcd_spi_ctl_v01.h b/techpack/audio/4.0/soc/wcd_spi_ctl_v01.h deleted file mode 100644 index 683caa4166d7..000000000000 --- a/techpack/audio/4.0/soc/wcd_spi_ctl_v01.h +++ /dev/null @@ -1,62 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - */ -#ifndef WCD_SPI_CTL_V01_H -#define WCD_SPI_CTL_V01_H - -#define WCD_SPI_CTL_SERVICE_ID_V01 0x421 -#define WCD_SPI_CTL_SERVICE_VERS_V01 0x01 - -#define WCD_SPI_BUFF_RESP_V01 0x0022 -#define WCD_SPI_REL_ACCESS_RESP_V01 0x0021 -#define WCD_SPI_REQ_ACCESS_MSG_V01 0x0020 -#define WCD_SPI_BUFF_MSG_V01 0x0022 -#define WCD_SPI_REL_ACCESS_MSG_V01 0x0021 -#define WCD_SPI_REQ_ACCESS_RESP_V01 0x0020 - -#define WCD_SPI_BUFF_CHANNELS_MAX_V01 0x08 - -#define WCD_SPI_REQ_DATA_TRANSFER_V01 ((u64)0x01ULL) -#define WCD_SPI_REQ_CONCURRENCY_V01 ((u64)0x02ULL) -#define WCD_SPI_REQ_REMOTE_DOWN_V01 ((u64)0x04ULL) - -struct wcd_spi_req_access_msg_v01 { - u8 reason_valid; - u64 reason; -}; -#define WCD_SPI_REQ_ACCESS_MSG_V01_MAX_MSG_LEN 11 -extern struct elem_info wcd_spi_req_access_msg_v01_ei[]; - -struct wcd_spi_req_access_resp_v01 { - struct qmi_response_type_v01 resp; -}; -#define WCD_SPI_REQ_ACCESS_RESP_V01_MAX_MSG_LEN 7 -extern struct elem_info wcd_spi_req_access_resp_v01_ei[]; - -struct wcd_spi_rel_access_msg_v01 { - char placeholder; -}; -#define WCD_SPI_REL_ACCESS_MSG_V01_MAX_MSG_LEN 0 -extern struct elem_info wcd_spi_rel_access_msg_v01_ei[]; - -struct wcd_spi_rel_access_resp_v01 { - struct qmi_response_type_v01 resp; -}; -#define WCD_SPI_REL_ACCESS_RESP_V01_MAX_MSG_LEN 7 -extern struct elem_info wcd_spi_rel_access_resp_v01_ei[]; - -struct wcd_spi_buff_msg_v01 { - u32 buff_addr_1[WCD_SPI_BUFF_CHANNELS_MAX_V01]; - u8 buff_addr_2_valid; - u32 buff_addr_2[WCD_SPI_BUFF_CHANNELS_MAX_V01]; -}; -#define WCD_SPI_BUFF_MSG_V01_MAX_MSG_LEN 70 -extern struct elem_info wcd_spi_buff_msg_v01_ei[]; - -struct wcd_spi_buff_resp_v01 { - struct qmi_response_type_v01 resp; -}; -#define WCD_SPI_BUFF_RESP_V01_MAX_MSG_LEN 7 -extern struct elem_info wcd_spi_buff_resp_v01_ei[]; - -#endif diff --git a/techpack/audio/Android.mk b/techpack/audio/Android.mk deleted file mode 100644 index 1df2cfb9da17..000000000000 --- a/techpack/audio/Android.mk +++ /dev/null @@ -1,83 +0,0 @@ -# Android makefile for audio kernel modules -MY_LOCAL_PATH := $(call my-dir) - -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) $(TRINKET)),true) -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/include - -$(shell mkdir -p $(UAPI_OUT)/linux;) -$(shell mkdir -p $(UAPI_OUT)/sound;) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/codecs/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd934x/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/tfa98xx/Module.symvers) - -include $(MY_LOCAL_PATH)/include/uapi/Android.mk -include $(MY_LOCAL_PATH)/ipc/Android.mk -include $(MY_LOCAL_PATH)/dsp/Android.mk -include $(MY_LOCAL_PATH)/dsp/codecs/Android.mk -include $(MY_LOCAL_PATH)/soc/Android.mk -include $(MY_LOCAL_PATH)/asoc/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/wcd934x/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/tas2557/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/cs35l41/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/tfa98xx/Android.mk -endif - -ifeq ($(call is-board-platform-in-list, atoll),true) -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/include - -$(shell mkdir -p $(UAPI_OUT)/linux;) -$(shell mkdir -p $(UAPI_OUT)/sound;) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/ipc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/dsp/codecs/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/soc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/Module.symvers) - -include $(MY_LOCAL_PATH)/4.0/include/uapi/Android.mk -include $(MY_LOCAL_PATH)/4.0/ipc/Android.mk -include $(MY_LOCAL_PATH)/4.0/dsp/Android.mk -include $(MY_LOCAL_PATH)/4.0/dsp/codecs/Android.mk -include $(MY_LOCAL_PATH)/4.0/soc/Android.mk -include $(MY_LOCAL_PATH)/4.0/asoc/Android.mk -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/Android.mk -endif - -ifeq ($(call is-board-platform-in-list,sdm670 msmnile),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/aqt1000/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/aqt1000/Android.mk -endif - -ifeq ($(call is-board-platform-in-list, $(MSMSTEPPE) $(TRINKET)),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/bolero/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/bolero/Android.mk -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd937x/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/wcd937x/Android.mk -endif - -ifeq ($(call is-board-platform-in-list, atoll),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/bolero/Module.symvers) -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/bolero/Android.mk -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/wcd937x/Module.symvers) -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/wcd937x/Android.mk -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/4.0/asoc/codecs/wcd938x/Module.symvers) -include $(MY_LOCAL_PATH)/4.0/asoc/codecs/wcd938x/Android.mk -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/sdm660_cdc/Module.symvers) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/msm_sdw/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/sdm660_cdc/Android.mk -include $(MY_LOCAL_PATH)/asoc/codecs/msm_sdw/Android.mk -endif - -ifeq ($(call is-board-platform-in-list,msmnile),true) -$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd9360/Module.symvers) -include $(MY_LOCAL_PATH)/asoc/codecs/wcd9360/Android.mk -endif diff --git a/techpack/audio/Makefile b/techpack/audio/Makefile deleted file mode 100644 index b242d9755a30..000000000000 --- a/techpack/audio/Makefile +++ /dev/null @@ -1,78 +0,0 @@ -# auto-detect subdirs -ifeq ($(CONFIG_ARCH_SDM845), y) -include $(srctree)/techpack/audio/config/sdm845auto.conf -export -ifeq ($(CONFIG_ARCH_SDM660), y) -include $(srctree)/techpack/audio/config/sdm660auto_static.conf -export -endif -endif -ifeq ($(CONFIG_ARCH_SDM670), y) -include $(srctree)/techpack/audio/config/sdm670auto_static.conf -export -endif -ifeq ($(CONFIG_ARCH_SDXPOORWILLS), y) -include $(srctree)/techpack/audio/config/sdxpoorwillsauto.conf -export -endif -ifeq ($(CONFIG_ARCH_SM8150), y) -include $(srctree)/techpack/audio/config/sm8150auto.conf -export -endif -ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) -include $(srctree)/techpack/audio/config/sm8150auto.conf -export -endif - -# Use USERINCLUDE when you must reference the UAPI directories only. -USERINCLUDE += \ - -I$(srctree)/techpack/audio/include/uapi \ - -# Use LINUXINCLUDE when you must reference the include/ directory. -# Needed to be compatible with the O= option -LINUXINCLUDE += \ - -I$(srctree)/techpack/audio/include/uapi \ - -I$(srctree)/techpack/audio/include/elliptic \ - -I$(srctree)/techpack/audio/include - -#for mius start -ifeq ($(CONFIG_US_PROXIMITY), y) -LINUXINCLUDE += \ - -I$(srctree)/techpack/audio/include/mius -endif -#for mius end - -ifeq ($(CONFIG_ARCH_SDM845), y) -LINUXINCLUDE += \ - -include $(srctree)/techpack/audio/config/sdm845autoconf.h -endif -ifeq ($(CONFIG_ARCH_SDM660), y) -LINUXINCLUDE += \ - -include $(srctree)/techpack/audio/config/sdm660autoconf.h -endif -ifeq ($(CONFIG_ARCH_SDM670), y) -LINUXINCLUDE += \ - -include $(srctree)/techpack/audio/config/sdm670autoconf.h -endif -ifeq ($(CONFIG_ARCH_SDXPOORWILLS), y) -LINUXINCLUDE += \ - -include $(srctree)/techpack/audio/config/sdxpoorwillsautoconf.h -endif -ifeq ($(CONFIG_ARCH_SM8150), y) -LINUXINCLUDE += \ - -include $(srctree)/techpack/audio/config/sm8150autoconf.h -endif -ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) -LINUXINCLUDE += \ - -include $(srctree)/techpack/audio/config/sm8150autoconf.h -endif - -obj-y += soc/ -obj-y += dsp/ -#for mius start -ifeq ($(CONFIG_US_PROXIMITY), y) -obj-y += dsp/mius -endif -#for mius end -obj-y += ipc/ -obj-y += asoc/ diff --git a/techpack/audio/Makefile.am b/techpack/audio/Makefile.am deleted file mode 100644 index cc7fbe8f8999..000000000000 --- a/techpack/audio/Makefile.am +++ /dev/null @@ -1,79 +0,0 @@ -AUDIO_ROOT=$(PWD) -UAPI_OUT=$(PWD) -HEADER_INSTALL_DIR=$(KERNEL_SRC)/scripts -KERNEL_BINARY_DIR=$(KERNEL_SRC)/../kernel-build-artifacts - -KBUILD_OPTIONS := AUDIO_ROOT=$(PWD) -KBUILD_OPTIONS += MODNAME=audio -KBUILD_OPTIONS += UAPI_OUT=$(PWD) - -AUDIO_KERNEL_HEADERS_PATH1 = $(shell ls ./include/uapi/linux/*.h) -AUDIO_KERNEL_HEADERS_PATH2 = $(shell ls ./include/uapi/linux/mfd/wcd9xxx/*.h) -AUDIO_KERNEL_HEADERS_PATH3 = $(shell ls ./include/uapi/sound/*.h) - -ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sdm670 qcs605)) -KBUILD_OPTIONS += CONFIG_ARCH_SDM670=y -endif -ifeq ($(TARGET_SUPPORT),sdm660) -KBUILD_OPTIONS += CONFIG_ARCH_SDM660=y -endif -ifeq ($(TARGET_SUPPORT),sdm845) -KBUILD_OPTIONS += CONFIG_ARCH_SDM845=y -endif -ifeq ($(TARGET_SUPPORT),apq8053) -KBUILD_OPTIONS += CONFIG_ARCH_SDM450=y -endif -ifeq ($(TARGET_SUPPORT),qcs40x) -KBUILD_OPTIONS += CONFIG_ARCH_QCS405=y -endif -ifeq ($(TARGET_SUPPORT), sdmsteppe) -KBUILD_OPTIONS += CONFIG_ARCH_SM6150=y -endif - -obj-m := ipc/ -obj-m += dsp/ -obj-m += dsp/codecs/ -obj-m += soc/ -obj-m += asoc/ -obj-m += asoc/codecs/ -ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sdm670 sdm660 qcs605 sdmsteppe)) -obj-m += asoc/codecs/wcd934x/ -endif -ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), apq8053 sdm670 sdm660 qcs605)) -obj-m += asoc/codecs/sdm660_cdc/ -endif -ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sdm670 sdm660 qcs605)) -obj-m += asoc/codecs/msm_sdw/ -endif -ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), qcs40x)) -obj-m += asoc/codecs/bolero/ -obj-m += asoc/codecs/csra66x0/ -obj-m += asoc/codecs/ep92/ -endif -ifeq ($(TARGET_SUPPORT), sdmsteppe) -obj-m += asoc/codecs/bolero/ -obj-m += asoc/codecs/wcd937x/ -endif - -all: - $(shell rm -fr $(shell pwd)/soc/core.h) - $(shell ln -s $(KERNEL_SRC)/drivers/pinctrl/core.h $(shell pwd)/soc/core.h) - $(shell rm -fr $(shell pwd)/include/soc/internal.h) - $(shell ln -s $(KERNEL_SRC)/drivers/base/regmap/internal.h $(shell pwd)/include/soc/internal.h) - $(shell rm -fr $(shell pwd)/soc/pinctrl-utils.h) - $(shell ln -s $(KERNEL_SRC)/drivers/pinctrl/pinctrl-utils.h $(shell pwd)/soc/pinctrl-utils.h) - $(shell mkdir $(shell pwd)/linux) - $(shell mkdir $(shell pwd)/sound) - $(shell mkdir $(shell pwd)/linux/mfd) - $(shell mkdir $(shell pwd)/linux/mfd/wcd9xxx) - $(shell cd $(KERNEL_BINARY_DIR) && $(KERNEL_SRC)/scripts/headers_install.sh $(UAPI_OUT)/linux/ $(AUDIO_ROOT)/include/uapi/linux/ $(notdir $(AUDIO_KERNEL_HEADERS_PATH1))) - $(shell cd $(KERNEL_BINARY_DIR) && $(KERNEL_SRC)/scripts/headers_install.sh $(UAPI_OUT)/linux/mfd/wcd9xxx/ $(AUDIO_ROOT)/include/uapi/linux/mfd/wcd9xxx/ $(notdir $(AUDIO_KERNEL_HEADERS_PATH2))) - $(shell cd $(KERNEL_BINARY_DIR) && $(KERNEL_SRC)/scripts/headers_install.sh $(UAPI_OUT)/sound/ $(AUDIO_ROOT)/include/uapi/sound/ $(notdir $(AUDIO_KERNEL_HEADERS_PATH3))) - $(MAKE) -C $(KERNEL_SRC) M=$(shell pwd) modules $(KBUILD_OPTIONS) - -modules_install: - $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(shell pwd) modules_install - -clean: - rm -f *.o *.ko *.mod.c *.mod.o *~ .*.cmd Module.symvers - rm -rf .tmp_versions diff --git a/techpack/audio/NOTICE b/techpack/audio/NOTICE deleted file mode 100644 index 9ad222017a76..000000000000 --- a/techpack/audio/NOTICE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2009-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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -________________________________________ - -Copyright (C) 2008 Google, Inc. -Copyright (C) 2008 HTC Corporation -Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. diff --git a/techpack/audio/asoc/Android.mk b/techpack/audio/asoc/Android.mk deleted file mode 100644 index 3a495a5e3fa7..000000000000 --- a/techpack/audio/asoc/Android.mk +++ /dev/null @@ -1,93 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -TARGET := sdm845 -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -TARGET := sdm660 -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -TARGET := sdm670 -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -TARGET := msmnile -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll),true) -TARGET := talos -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -TARGET := trinket -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=platform_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_platform.ko -LOCAL_MODULE_KBUILD_NAME := platform_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605 $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_cpe_lsm.ko -LOCAL_MODULE_KBUILD_NAME := cpe_lsm_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_machine_$(TARGET).ko -LOCAL_MODULE_KBUILD_NAME := machine_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/Kbuild b/techpack/audio/asoc/Kbuild deleted file mode 100644 index 5e0106a2f345..000000000000 --- a/techpack/audio/asoc/Kbuild +++ /dev/null @@ -1,259 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ ASoC Drivers ############ - - -# for SDM6xx sound card driver -ifdef CONFIG_SND_SOC_SDM660 - MACHINE_OBJS += sdm660-common.o -endif - -ifdef CONFIG_SND_SOC_SDM670 - MACHINE_OBJS += sdm660-common.o -endif - -# for SDM6xx sound card driver -ifdef CONFIG_SND_SOC_INT_CODEC - MACHINE_OBJS += sdm660-internal.o -endif - -# for SDM6xx sound card driver -ifdef CONFIG_SND_SOC_EXT_CODEC - MACHINE_OBJS += sdm660-external.o - MACHINE_OBJS += sdm660-ext-dai-links.o -endif - -# for SDM845 sound card driver -ifdef CONFIG_SND_SOC_MACHINE_SDM845 - MACHINE_OBJS += sdm845.o -endif - -# for SM8150 sound card driver -ifdef CONFIG_SND_SOC_SM8150 - MACHINE_OBJS += sm8150.o - MACHINE_OBJS += machine_815x_init.o -endif - -# for SA8155 sound card driver -ifdef CONFIG_SND_SOC_SA8155 - MACHINE_OBJS += sa8155.o -endif - -# for SM6150 sound card driver -ifdef CONFIG_SND_SOC_SM6150 - MACHINE_OBJS += sm6150.o -endif - -# for qcs405 sound card driver -ifdef CONFIG_SND_SOC_QCS405 - MACHINE_OBJS += qcs405.o -endif - -ifdef CONFIG_SND_SOC_CPE - CPE_LSM_OBJS += msm-cpe-lsm.o -endif - -ifdef CONFIG_SND_SOC_QDSP6V2 - PLATFORM_OBJS += msm-audio-effects-q6-v2.o - PLATFORM_OBJS += msm-compress-q6-v2.o - PLATFORM_OBJS += msm-dai-fe.o - PLATFORM_OBJS += msm-dai-q6-hdmi-v2.o - PLATFORM_OBJS += msm-dai-q6-v2.o - PLATFORM_OBJS += msm-dai-slim.o - PLATFORM_OBJS += msm-dai-stub-v2.o - PLATFORM_OBJS += msm-lsm-client.o - PLATFORM_OBJS += msm-pcm-afe-v2.o - PLATFORM_OBJS += msm-pcm-dtmf-v2.o - PLATFORM_OBJS += msm-pcm-hostless.o - PLATFORM_OBJS += msm-pcm-host-voice-v2.o - PLATFORM_OBJS += msm-pcm-loopback-v2.o - PLATFORM_OBJS += msm-pcm-q6-noirq.o - PLATFORM_OBJS += msm-pcm-q6-v2.o - PLATFORM_OBJS += msm-pcm-routing-v2.o - PLATFORM_OBJS += msm-pcm-voice-v2.o - PLATFORM_OBJS += msm-pcm-voip-v2.o - PLATFORM_OBJS += msm-transcode-loopback-q6-v2.o - PLATFORM_OBJS += platform_init.o -endif -ifdef CONFIG_DOLBY_DS2 - PLATFORM_OBJS += msm-ds2-dap-config.o -endif -ifdef CONFIG_DOLBY_LICENSE - PLATFORM_OBJS += msm-ds2-dap-config.o -endif -ifdef CONFIG_SND_HWDEP_ROUTING - PLATFORM_OBJS += msm-pcm-routing-devdep.o -endif -ifdef CONFIG_QTI_PP - PLATFORM_OBJS += msm-qti-pp-config.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -D__linux__ \ - -DCONFIG_SND_SOC_TFA9874_FOR_DAVI - -ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT),cepheus hercules orion)) - CDEFINES += -DCONFIG_SND_SOC_CS35L41_FOR_CEPH -endif - - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd934x/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd937x/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/sdm660_cdc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/msm_sdw/Module.symvers -endif -ifeq ($(KERNEL_BUILD), 1) - obj-y += codecs/ -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_QDSP6V2) += platform_dlkm.o -platform_dlkm-y := $(PLATFORM_OBJS) - -obj-$(CONFIG_SND_SOC_MACHINE_SDM845) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_SM8150) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_SM6150) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_QCS405) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_EXT_CODEC) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_INT_CODEC) += machine_dlkm.o -machine_dlkm-y := $(MACHINE_OBJS) - -obj-$(CONFIG_SND_SOC_CPE) += cpe_lsm_dlkm.o -cpe_lsm_dlkm-y := $(CPE_LSM_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/Android.mk b/techpack/audio/asoc/codecs/Android.mk deleted file mode 100644 index d2b787ae412f..000000000000 --- a/techpack/audio/asoc/codecs/Android.mk +++ /dev/null @@ -1,137 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform,$(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd_core_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_core.ko -LOCAL_MODULE_KBUILD_NAME := wcd_core_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9xxx.ko -LOCAL_MODULE_KBUILD_NAME := wcd9xxx_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,sdm670 sdm660 qcs605 $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_cpe.ko -LOCAL_MODULE_KBUILD_NAME := wcd_cpe_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd_spi.ko -LOCAL_MODULE_KBUILD_NAME := wcd_spi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605 $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9335.ko -LOCAL_MODULE_KBUILD_NAME := wcd9335_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa881x.ko -LOCAL_MODULE_KBUILD_NAME := wsa881x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_stub.ko -LOCAL_MODULE_KBUILD_NAME := stub_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_mbhc.ko -LOCAL_MODULE_KBUILD_NAME := mbhc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_hdmi.ko -LOCAL_MODULE_KBUILD_NAME := hdmi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/Kbuild b/techpack/audio/asoc/codecs/Kbuild deleted file mode 100644 index f31dfbfb7645..000000000000 --- a/techpack/audio/asoc/codecs/Kbuild +++ /dev/null @@ -1,252 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ ASoC Codecs ############ -ifdef CONFIG_WCD9XXX_CODEC_CORE - CORE_OBJS += wcd9xxx-rst.o - CORE_OBJS += wcd9xxx-core-init.o - CORE_OBJS += wcd9xxx-core.o - CORE_OBJS += wcd9xxx-irq.o - CORE_OBJS += wcd9xxx-slimslave.o - CORE_OBJS += wcd9xxx-utils.o - CORE_OBJS += wcd9335-regmap.o - CORE_OBJS += wcd9335-tables.o - CORE_OBJS += msm-cdc-pinctrl.o - CORE_OBJS += msm-cdc-supply.o - CORE_OBJS += wcd934x/wcd934x-regmap.o - CORE_OBJS += wcd934x/wcd934x-tables.o - CORE_OBJS += wcd9360/wcd9360-regmap.o -endif - -ifdef CONFIG_SND_SOC_WCD9XXX_V2 - WCD9XXX_OBJS += wcd-clsh.o - WCD9XXX_OBJS += wcd9xxx-common-v2.o - WCD9XXX_OBJS += wcd9xxx-resmgr-v2.o - WCD9XXX_OBJS += wcdcal-hwdep.o - WCD9XXX_OBJS += wcd9xxx-soc-init.o - WCD9XXX_OBJS += wcd-dsp-utils.o - WCD9XXX_OBJS += wcd-dsp-mgr.o - WCD9XXX_OBJS += audio-ext-clk-up.o -endif - -ifdef CONFIG_SND_SOC_WCD9335 - WCD9335_OBJS += wcd9335.o -endif - -ifdef CONFIG_SND_SOC_WSA881X - WSA881X_OBJS += wsa881x.o - WSA881X_OBJS += wsa881x-tables.o - WSA881X_OBJS += wsa881x-regmap.o - WSA881X_OBJS += wsa881x-temp-sensor.o -endif - -ifdef CONFIG_SND_SOC_WSA881X_ANALOG - WSA881X_ANALOG_OBJS += wsa881x-analog.o - WSA881X_ANALOG_OBJS += wsa881x-tables-analog.o - WSA881X_ANALOG_OBJS += wsa881x-regmap-analog.o - WSA881X_ANALOG_OBJS += wsa881x-temp-sensor.o -endif - -ifdef CONFIG_SND_SOC_MSM_STUB - STUB_OBJS += msm_stub.o -endif -ifdef CONFIG_SND_SOC_WCD_SPI - SPI_OBJS += wcd-spi.o -endif - -ifdef CONFIG_SND_SOC_WCD_CPE - WCD_CPE_OBJS += wcd_cpe_core.o - WCD_CPE_OBJS += wcd_cpe_services.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC - MBHC_OBJS += wcd-mbhc-v2.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC_ADC - MBHC_OBJS += wcd-mbhc-adc.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC_LEGACY - MBHC_OBJS += wcd-mbhc-legacy.o -endif - -ifdef CONFIG_SND_SOC_MSM_HDMI_CODEC_RX - HDMICODEC_OBJS += msm_hdmi_codec_rx.o -endif - -ifdef CONFIG_SND_SOC_WCD_IRQ - CORE_OBJS += wcd-irq.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -D__linux__ \ - -DGOOGLE_HOTWORD - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(KERNEL_BUILD), 1) - obj-y += wcd934x/ - obj-y += sdm660_cdc/ - obj-y += msm_sdw/ - obj-y += wcd9360/ - obj-y += tas2557/ - obj-y += cs35l41/ - obj-y += wcd937x/ - obj-y += tfa98xx/ -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_WCD9XXX_CODEC_CORE) += wcd_core_dlkm.o -wcd_core_dlkm-y := $(CORE_OBJS) - -obj-$(CONFIG_SND_SOC_WCD9XXX_V2) += wcd9xxx_dlkm.o -wcd9xxx_dlkm-y := $(WCD9XXX_OBJS) - -obj-$(CONFIG_SND_SOC_WCD9335) += wcd9335_dlkm.o -wcd9335_dlkm-y := $(WCD9335_OBJS) - -obj-$(CONFIG_SND_SOC_WSA881X) += wsa881x_dlkm.o -wsa881x_dlkm-y := $(WSA881X_OBJS) - -obj-$(CONFIG_SND_SOC_WSA881X_ANALOG) += wsa881x_analog_dlkm.o -wsa881x_analog_dlkm-y := $(WSA881X_ANALOG_OBJS) - -obj-$(CONFIG_SND_SOC_MSM_STUB) += stub_dlkm.o -stub_dlkm-y := $(STUB_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_CPE) += wcd_cpe_dlkm.o -wcd_cpe_dlkm-y := $(WCD_CPE_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_SPI) += wcd_spi_dlkm.o -wcd_spi_dlkm-y := $(SPI_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_MBHC) += mbhc_dlkm.o -mbhc_dlkm-y := $(MBHC_OBJS) - -obj-$(CONFIG_SND_SOC_MSM_HDMI_CODEC_RX) += hdmi_dlkm.o -hdmi_dlkm-y := $(HDMICODEC_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/Kbuild.bk b/techpack/audio/asoc/codecs/Kbuild.bk deleted file mode 100755 index 0f68ffe3c38b..000000000000 --- a/techpack/audio/asoc/codecs/Kbuild.bk +++ /dev/null @@ -1,214 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ ASoC Codecs ############ -ifdef CONFIG_WCD9XXX_CODEC_CORE - CORE_OBJS += wcd9xxx-rst.o - CORE_OBJS += wcd9xxx-core-init.o - CORE_OBJS += wcd9xxx-core.o - CORE_OBJS += wcd9xxx-irq.o - CORE_OBJS += wcd9xxx-slimslave.o - CORE_OBJS += wcd9xxx-utils.o - CORE_OBJS += wcd9335-regmap.o - CORE_OBJS += wcd9335-tables.o - CORE_OBJS += msm-cdc-pinctrl.o - CORE_OBJS += msm-cdc-supply.o - CORE_OBJS += wcd934x/wcd934x-regmap.o - CORE_OBJS += wcd934x/wcd934x-tables.o - CORE_OBJS += wcd9360/wcd9360-regmap.o -endif - -ifdef CONFIG_SND_SOC_WCD9XXX_V2 - WCD9XXX_OBJS += wcd9xxx-common-v2.o - WCD9XXX_OBJS += wcd9xxx-resmgr-v2.o - WCD9XXX_OBJS += wcdcal-hwdep.o - WCD9XXX_OBJS += wcd9xxx-soc-init.o - WCD9XXX_OBJS += wcd-dsp-utils.o - WCD9XXX_OBJS += wcd-dsp-mgr.o - WCD9XXX_OBJS += audio-ext-clk-up.o -endif - -ifdef CONFIG_SND_SOC_WCD9335 - WCD9335_OBJS += wcd9335.o -endif - -ifdef CONFIG_SND_SOC_WSA881X - WSA881X_OBJS += wsa881x.o - WSA881X_OBJS += wsa881x-tables.o - WSA881X_OBJS += wsa881x-regmap.o - WSA881X_OBJS += wsa881x-temp-sensor.o -endif - -ifdef CONFIG_SND_SOC_MSM_STUB - STUB_OBJS += msm_stub.o -endif -ifdef CONFIG_SND_SOC_WCD_SPI - SPI_OBJS += wcd-spi.o -endif - -ifdef CONFIG_SND_SOC_WCD_CPE - WCD_CPE_OBJS += wcd_cpe_core.o - WCD_CPE_OBJS += wcd_cpe_services.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC - MBHC_OBJS += wcd-mbhc-v2.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC_ADC - MBHC_OBJS += wcd-mbhc-adc.o -endif - -ifdef CONFIG_SND_SOC_WCD_MBHC_LEGACY - MBHC_OBJS += wcd-mbhc-legacy.o -endif - -ifdef CONFIG_SND_SOC_MSM_HDMI_CODEC_RX - HDMICODEC_OBJS += msm_hdmi_codec_rx.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(KERNEL_BUILD), 1) - obj-y += wcd934x/ - obj-y += sdm660_cdc/ - obj-y += msm_sdw/ - obj-y += tas2557/ - obj-y += cs35l41/ -endif -# Module information used by KBuild framework -obj-$(CONFIG_WCD9XXX_CODEC_CORE) += wcd_core_dlkm.o -wcd_core_dlkm-y := $(CORE_OBJS) - -obj-$(CONFIG_SND_SOC_WCD9XXX_V2) += wcd9xxx_dlkm.o -wcd9xxx_dlkm-y := $(WCD9XXX_OBJS) - -obj-$(CONFIG_SND_SOC_WCD9335) += wcd9335_dlkm.o -wcd9335_dlkm-y := $(WCD9335_OBJS) - -obj-$(CONFIG_SND_SOC_WSA881X) += wsa881x_dlkm.o -wsa881x_dlkm-y := $(WSA881X_OBJS) - -obj-$(CONFIG_SND_SOC_MSM_STUB) += stub_dlkm.o -stub_dlkm-y := $(STUB_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_CPE) += wcd_cpe_dlkm.o -wcd_cpe_dlkm-y := $(WCD_CPE_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_SPI) += wcd_spi_dlkm.o -wcd_spi_dlkm-y := $(SPI_OBJS) - -obj-$(CONFIG_SND_SOC_WCD_MBHC) += mbhc_dlkm.o -mbhc_dlkm-y := $(MBHC_OBJS) - -obj-$(CONFIG_SND_SOC_MSM_HDMI_CODEC_RX) += hdmi_dlkm.o -hdmi_dlkm-y := $(HDMICODEC_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/aqt1000/Android.mk b/techpack/audio/asoc/codecs/aqt1000/Android.mk deleted file mode 100644 index ac26f6d52469..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/Android.mk +++ /dev/null @@ -1,41 +0,0 @@ -# Android makefile for audio kernel modules - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,sdm670),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=aqt1000_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_aqt1000_cdc.ko -LOCAL_MODULE_KBUILD_NAME := aqt1000_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/aqt1000/Kbuild b/techpack/audio/asoc/codecs/aqt1000/Kbuild deleted file mode 100644 index 9de949aab15f..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/Kbuild +++ /dev/null @@ -1,123 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -# for AQT1000 Codec -ifeq ($(CONFIG_SND_SOC_AQT1000), m) - AQT1000_CDC_OBJS += aqt1000-regmap.o - AQT1000_CDC_OBJS += aqt1000-utils.o - AQT1000_CDC_OBJS += aqt1000-core.o - AQT1000_CDC_OBJS += aqt1000-irq.o - AQT1000_CDC_OBJS += aqt1000-clsh.o - AQT1000_CDC_OBJS += aqt1000.o - AQT1000_CDC_OBJS += aqt1000-mbhc.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/aqt1000/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_AQT1000) += aqt1000_cdc_dlkm.o -aqt1000_cdc_dlkm-y := $(AQT1000_CDC_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-api.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-api.h deleted file mode 100644 index ef2e5267fe77..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-api.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef AQT1000_API_H -#define AQT1000_API_H - -#include -#include -#include -#include - -extern int aqt_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int volt, int micb_num); -extern int aqt_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable); -extern int aqt_get_micb_vout_ctl_val(u32 micb_mv); -extern int aqt_micbias_control(struct snd_soc_codec *codec, int micb_num, - int req, bool is_dapm); - -#endif /* AQT1000_API_H */ diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.c b/techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.c deleted file mode 100644 index 640795dc7900..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.c +++ /dev/null @@ -1,805 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include "aqt1000-registers.h" -#include "aqt1000-clsh.h" - -#define AQT_USLEEP_RANGE 50 -#define MAX_IMPED_PARAMS 6 - -enum aqt_vref_dac_sel { - VREF_N1P9V = 0, - VREF_N1P86V, - VREF_N181V, - VREF_N1P74V, - VREF_N1P7V, - VREF_N0P9V, - VREF_N1P576V, - VREF_N1P827V, -}; - -enum aqt_vref_ctl { - CONTROLLER = 0, - I2C, -}; - -enum aqt_hd2_res_div_ctl { - DISCONNECT = 0, - P5_0P35, - P75_0P68, - P82_0P77, - P9_0P87, -}; - -enum aqt_curr_bias_err_amp { - I_0P25UA = 0, - I_0P5UA, - I_0P75UA, - I_1UA, - I_1P25UA, - I_1P5UA, - I_1P75UA, - I_2UA, -}; - -static const struct aqt_reg_mask_val imped_table_aqt[][MAX_IMPED_PARAMS] = { - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xf2}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xf2}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xf4}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xf4}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xf7}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xf7}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xf9}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xf9}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xfa}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xfa}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xfb}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xfb}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xfc}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xfc}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {AQT1000_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, -}; - -static const struct aqt_imped_val imped_index[] = { - {4, 0}, - {5, 1}, - {6, 2}, - {7, 3}, - {8, 4}, - {9, 5}, - {10, 6}, - {11, 7}, - {12, 8}, - {13, 9}, -}; - -static void (*clsh_state_fp[NUM_CLSH_STATES])(struct snd_soc_codec *, - struct aqt_clsh_cdc_data *, - u8 req_state, bool en, int mode); - -static int get_impedance_index(int imped) -{ - int i = 0; - - if (imped < imped_index[i].imped_val) { - pr_debug("%s, detected impedance is less than 4 Ohm\n", - __func__); - i = 0; - goto ret; - } - if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) { - pr_debug("%s, detected impedance is greater than 12 Ohm\n", - __func__); - i = ARRAY_SIZE(imped_index) - 1; - goto ret; - } - for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) { - if (imped >= imped_index[i].imped_val && - imped < imped_index[i + 1].imped_val) - break; - } -ret: - pr_debug("%s: selected impedance index = %d\n", - __func__, imped_index[i].index); - return imped_index[i].index; -} - -/* - * Function: aqt_clsh_imped_config - * Params: codec, imped, reset - * Description: - * This function updates HPHL and HPHR gain settings - * according to the impedance value. - */ -void aqt_clsh_imped_config(struct snd_soc_codec *codec, int imped, bool reset) -{ - int i; - int index = 0; - int table_size; - - static const struct aqt_reg_mask_val - (*imped_table_ptr)[MAX_IMPED_PARAMS]; - - table_size = ARRAY_SIZE(imped_table_aqt); - imped_table_ptr = imped_table_aqt; - - /* reset = 1, which means request is to reset the register values */ - if (reset) { - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, 0); - return; - } - index = get_impedance_index(imped); - if (index >= (ARRAY_SIZE(imped_index) - 1)) { - pr_debug("%s, impedance not in range = %d\n", __func__, imped); - return; - } - if (index >= table_size) { - pr_debug("%s, impedance index not in range = %d\n", __func__, - index); - return; - } - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, - imped_table_ptr[index][i].val); -} -EXPORT_SYMBOL(aqt_clsh_imped_config); - -static const char *mode_to_str(int mode) -{ - switch (mode) { - case CLS_H_NORMAL: - return "CLS_H_NORMAL"; - case CLS_H_HIFI: - return "CLS_H_HIFI"; - case CLS_H_LOHIFI: - return "CLS_H_LOHIFI"; - case CLS_H_LP: - return "CLS_H_LP"; - case CLS_H_ULP: - return "CLS_H_ULP"; - case CLS_AB: - return "CLS_AB"; - case CLS_AB_HIFI: - return "CLS_AB_HIFI"; - default: - return "CLS_H_INVALID"; - }; -} - -static const char *const state_to_str[] = { - [AQT_CLSH_STATE_IDLE] = "STATE_IDLE", - [AQT_CLSH_STATE_HPHL] = "STATE_HPH_L", - [AQT_CLSH_STATE_HPHR] = "STATE_HPH_R", - [AQT_CLSH_STATE_HPH_ST] = "STATE_HPH_ST", -}; - -static inline void -aqt_enable_clsh_block(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *clsh_d, bool enable) -{ - if ((enable && ++clsh_d->clsh_users == 1) || - (!enable && --clsh_d->clsh_users == 0)) - snd_soc_update_bits(codec, AQT1000_CDC_CLSH_CRC, 0x01, - (u8) enable); - if (clsh_d->clsh_users < 0) - clsh_d->clsh_users = 0; - dev_dbg(codec->dev, "%s: clsh_users %d, enable %d", __func__, - clsh_d->clsh_users, enable); -} - -static inline bool aqt_clsh_enable_status(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, AQT1000_CDC_CLSH_CRC) & 0x01; -} - -static inline int aqt_clsh_get_int_mode(struct aqt_clsh_cdc_data *clsh_d, - int clsh_state) -{ - int mode; - - if ((clsh_state != AQT_CLSH_STATE_HPHL) && - (clsh_state != AQT_CLSH_STATE_HPHR)) - mode = CLS_NONE; - else - mode = clsh_d->interpolator_modes[ffs(clsh_state)]; - - return mode; -} - -static inline void aqt_clsh_set_int_mode(struct aqt_clsh_cdc_data *clsh_d, - int clsh_state, int mode) -{ - if ((clsh_state != AQT_CLSH_STATE_HPHL) && - (clsh_state != AQT_CLSH_STATE_HPHR)) - return; - - clsh_d->interpolator_modes[ffs(clsh_state)] = mode; -} - -static inline void aqt_clsh_set_buck_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - 0x08, 0x08); /* set to HIFI */ - else - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - 0x08, 0x00); /* set to default */ -} - -static inline void aqt_clsh_set_flyback_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - 0x04, 0x04); /* set to HIFI */ - else - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - 0x04, 0x00); /* set to Default */ -} - -static inline void aqt_clsh_gm3_boost_disable(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) { - snd_soc_update_bits(codec, AQT1000_HPH_CNP_WG_CTL, - 0x80, 0x0); /* disable GM3 Boost */ - snd_soc_update_bits(codec, AQT1000_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x80); - } else { - snd_soc_update_bits(codec, AQT1000_HPH_CNP_WG_CTL, - 0x80, 0x80); /* set to Default */ - snd_soc_update_bits(codec, AQT1000_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x70); - } -} - -static inline void aqt_clsh_flyback_dac_ctl(struct snd_soc_codec *codec, - int vref) -{ - snd_soc_update_bits(codec, AQT1000_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, (vref << 5)); -} - -static inline void aqt_clsh_mode_vref_ctl(struct snd_soc_codec *codec, - int vref_ctl) -{ - if (vref_ctl == I2C) { - snd_soc_update_bits(codec, AQT1000_CLASSH_MODE_3, 0x02, 0x02); - snd_soc_update_bits(codec, AQT1000_CLASSH_MODE_2, 0xFF, 0x1C); - } else { - snd_soc_update_bits(codec, AQT1000_CLASSH_MODE_2, 0xFF, 0x3A); - snd_soc_update_bits(codec, AQT1000_CLASSH_MODE_3, 0x02, 0x00); - } -} - -static inline void aqt_clsh_buck_current_bias_ctl(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, AQT1000_BUCK_5V_IBIAS_CTL_4, - 0x70, (I_2UA << 4)); - snd_soc_update_bits(codec, AQT1000_BUCK_5V_IBIAS_CTL_4, - 0x07, I_0P25UA); - snd_soc_update_bits(codec, AQT1000_BUCK_5V_CTRL_CCL_2, - 0x3F, 0x3F); - } else { - snd_soc_update_bits(codec, AQT1000_BUCK_5V_IBIAS_CTL_4, - 0x70, (I_1UA << 4)); - snd_soc_update_bits(codec, AQT1000_BUCK_5V_IBIAS_CTL_4, - 0x07, I_1UA); - snd_soc_update_bits(codec, AQT1000_BUCK_5V_CTRL_CCL_2, - 0x3F, 0x20); - } -} - -static inline void aqt_clsh_rdac_hd2_ctl(struct snd_soc_codec *codec, - u8 hd2_div_ctl, u8 state) -{ - u16 reg = 0; - - if (state == AQT_CLSH_STATE_HPHL) - reg = AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_L; - else if (state == AQT_CLSH_STATE_HPHR) - reg = AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_R; - else - dev_err(codec->dev, "%s: Invalid state: %d\n", - __func__, state); - if (!reg) - snd_soc_update_bits(codec, reg, 0x0F, hd2_div_ctl); -} - -static inline void aqt_clsh_force_iq_ctl(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_LOHIFI || mode == CLS_AB) { - snd_soc_update_bits(codec, AQT1000_HPH_NEW_INT_PA_MISC2, - 0x20, 0x20); - snd_soc_update_bits(codec, AQT1000_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0xC0); - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL1, - 0x0E, 0x02); - } else { - - snd_soc_update_bits(codec, AQT1000_HPH_NEW_INT_PA_MISC2, - 0x20, 0x0); - snd_soc_update_bits(codec, AQT1000_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0x80); - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL1, - 0x0E, 0x06); - } -} - -static void aqt_clsh_buck_ctrl(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *clsh_d, - int mode, - bool enable) -{ - /* enable/disable buck */ - if ((enable && (++clsh_d->buck_users == 1)) || - (!enable && (--clsh_d->buck_users == 0))) - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - (1 << 7), (enable << 7)); - dev_dbg(codec->dev, "%s: buck_users %d, enable %d, mode: %s", - __func__, clsh_d->buck_users, enable, mode_to_str(mode)); - /* - * 500us sleep is required after buck enable/disable - * as per HW requirement - */ - usleep_range(500, 500 + AQT_USLEEP_RANGE); -} - -static void aqt_clsh_flyback_ctrl(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *clsh_d, - int mode, - bool enable) -{ - /* enable/disable flyback */ - if ((enable && (++clsh_d->flyback_users == 1)) || - (!enable && (--clsh_d->flyback_users == 0))) { - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - (1 << 6), (enable << 6)); - /* 100usec delay is needed as per HW requirement */ - usleep_range(100, 110); - } - dev_dbg(codec->dev, "%s: flyback_users %d, enable %d, mode: %s", - __func__, clsh_d->flyback_users, enable, mode_to_str(mode)); - /* - * 500us sleep is required after flyback enable/disable - * as per HW requirement - */ - usleep_range(500, 500 + AQT_USLEEP_RANGE); -} - -static void aqt_clsh_set_hph_mode(struct snd_soc_codec *codec, - int mode) -{ - u8 val = 0; - u8 gain = 0; - u8 res_val = VREF_FILT_R_0OHM; - u8 ipeak = DELTA_I_50MA; - - switch (mode) { - case CLS_H_NORMAL: - res_val = VREF_FILT_R_50KOHM; - val = 0x00; - gain = DAC_GAIN_0DB; - ipeak = DELTA_I_50MA; - break; - case CLS_AB: - val = 0x00; - gain = DAC_GAIN_0DB; - ipeak = DELTA_I_50MA; - break; - case CLS_AB_HIFI: - val = 0x08; - break; - case CLS_H_HIFI: - val = 0x08; - gain = DAC_GAIN_M0P2DB; - ipeak = DELTA_I_50MA; - break; - case CLS_H_LOHIFI: - val = 0x00; - break; - case CLS_H_ULP: - val = 0x0C; - break; - case CLS_H_LP: - val = 0x04; - ipeak = DELTA_I_30MA; - break; - default: - return; - }; - - if (mode == CLS_H_LOHIFI || mode == CLS_AB) - val = 0x04; - - snd_soc_update_bits(codec, AQT1000_ANA_HPH, 0x0C, val); -} - -static void aqt_clsh_set_buck_regulator_mode(struct snd_soc_codec *codec, - int mode) -{ - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - 0x02, 0x00); -} - -static void aqt_clsh_state_hph_st(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_AB || mode == CLS_AB_HIFI) - return; - - if (is_enable) { - if (req_state == AQT_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (req_state == AQT_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } else { - if (req_state == AQT_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - if (req_state == AQT_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - } -} - -static void aqt_clsh_state_hph_r(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_err(codec->dev, "%s: Normal mode not applicable for hph_r\n", - __func__); - return; - } - - if (is_enable) { - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - aqt_enable_clsh_block(codec, clsh_d, true); - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, AQT1000_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, AQT1000_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } - aqt_clsh_set_buck_regulator_mode(codec, mode); - aqt_clsh_set_flyback_mode(codec, mode); - aqt_clsh_gm3_boost_disable(codec, mode); - aqt_clsh_flyback_dac_ctl(codec, VREF_N0P9V); - aqt_clsh_mode_vref_ctl(codec, I2C); - aqt_clsh_force_iq_ctl(codec, mode); - aqt_clsh_rdac_hd2_ctl(codec, P82_0P77, req_state); - aqt_clsh_flyback_ctrl(codec, clsh_d, mode, true); - aqt_clsh_flyback_dac_ctl(codec, VREF_N1P827V); - aqt_clsh_set_buck_mode(codec, mode); - aqt_clsh_buck_ctrl(codec, clsh_d, mode, true); - aqt_clsh_mode_vref_ctl(codec, CONTROLLER); - aqt_clsh_buck_current_bias_ctl(codec, true); - aqt_clsh_set_hph_mode(codec, mode); - } else { - aqt_clsh_set_hph_mode(codec, CLS_H_NORMAL); - aqt_clsh_buck_current_bias_ctl(codec, false); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - aqt_enable_clsh_block(codec, clsh_d, false); - } - /* buck and flyback set to default mode and disable */ - aqt_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - aqt_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - aqt_clsh_rdac_hd2_ctl(codec, P5_0P35, req_state); - aqt_clsh_force_iq_ctl(codec, CLS_H_NORMAL); - aqt_clsh_gm3_boost_disable(codec, CLS_H_NORMAL); - aqt_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - aqt_clsh_set_buck_mode(codec, CLS_H_NORMAL); - aqt_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void aqt_clsh_state_hph_l(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_err(codec->dev, "%s: Normal mode not applicable for hph_l\n", - __func__); - return; - } - - if (is_enable) { - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - aqt_enable_clsh_block(codec, clsh_d, true); - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, AQT1000_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, AQT1000_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - } - aqt_clsh_set_buck_regulator_mode(codec, mode); - aqt_clsh_set_flyback_mode(codec, mode); - aqt_clsh_gm3_boost_disable(codec, mode); - aqt_clsh_flyback_dac_ctl(codec, VREF_N0P9V); - aqt_clsh_mode_vref_ctl(codec, I2C); - aqt_clsh_force_iq_ctl(codec, mode); - aqt_clsh_rdac_hd2_ctl(codec, P82_0P77, req_state); - aqt_clsh_flyback_ctrl(codec, clsh_d, mode, true); - aqt_clsh_flyback_dac_ctl(codec, VREF_N1P827V); - aqt_clsh_set_buck_mode(codec, mode); - aqt_clsh_buck_ctrl(codec, clsh_d, mode, true); - aqt_clsh_mode_vref_ctl(codec, CONTROLLER); - aqt_clsh_buck_current_bias_ctl(codec, true); - aqt_clsh_set_hph_mode(codec, mode); - } else { - aqt_clsh_set_hph_mode(codec, CLS_H_NORMAL); - aqt_clsh_buck_current_bias_ctl(codec, false); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - aqt_enable_clsh_block(codec, clsh_d, false); - } - /* set buck and flyback to Default Mode */ - aqt_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - aqt_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - aqt_clsh_rdac_hd2_ctl(codec, P5_0P35, req_state); - aqt_clsh_force_iq_ctl(codec, CLS_H_NORMAL); - aqt_clsh_gm3_boost_disable(codec, CLS_H_NORMAL); - aqt_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - aqt_clsh_set_buck_mode(codec, CLS_H_NORMAL); - aqt_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void aqt_clsh_state_err(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_err(codec->dev, - "%s Wrong request for class H state machine requested to %s %s", - __func__, is_enable ? "enable" : "disable", - state_to_str[req_state]); -} - -/* - * Function: aqt_clsh_is_state_valid - * Params: state - * Description: - * Provides information on valid states of Class H configuration - */ -static bool aqt_clsh_is_state_valid(u8 state) -{ - switch (state) { - case AQT_CLSH_STATE_IDLE: - case AQT_CLSH_STATE_HPHL: - case AQT_CLSH_STATE_HPHR: - case AQT_CLSH_STATE_HPH_ST: - return true; - default: - return false; - }; -} - -/* - * Function: aqt_clsh_fsm - * Params: codec, cdc_clsh_d, req_state, req_type, clsh_event - * Description: - * This function handles PRE DAC and POST DAC conditions of different devices - * and updates class H configuration of different combination of devices - * based on validity of their states. cdc_clsh_d will contain current - * class h state information - */ -void aqt_clsh_fsm(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode) -{ - u8 old_state, new_state; - - switch (clsh_event) { - case AQT_CLSH_EVENT_PRE_DAC: - old_state = cdc_clsh_d->state; - new_state = old_state | req_state; - - if (!aqt_clsh_is_state_valid(new_state)) { - dev_err(codec->dev, - "%s: Class-H not a valid new state: %s\n", - __func__, state_to_str[new_state]); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, state_to_str[new_state]); - return; - } - cdc_clsh_d->state = new_state; - aqt_clsh_set_int_mode(cdc_clsh_d, req_state, int_mode); - (*clsh_state_fp[new_state]) (codec, cdc_clsh_d, req_state, - CLSH_REQ_ENABLE, int_mode); - dev_dbg(codec->dev, - "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str[old_state], - state_to_str[cdc_clsh_d->state]); - break; - case AQT_CLSH_EVENT_POST_PA: - old_state = cdc_clsh_d->state; - new_state = old_state & (~req_state); - if (new_state < NUM_CLSH_STATES) { - if (!aqt_clsh_is_state_valid(old_state)) { - dev_err(codec->dev, - "%s:Invalid old state:%s\n", - __func__, state_to_str[old_state]); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__,state_to_str[new_state]); - return; - } - (*clsh_state_fp[old_state]) (codec, cdc_clsh_d, - req_state, CLSH_REQ_DISABLE, - int_mode); - cdc_clsh_d->state = new_state; - aqt_clsh_set_int_mode(cdc_clsh_d, req_state, CLS_NONE); - dev_dbg(codec->dev, "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str[old_state], - state_to_str[cdc_clsh_d->state]); - } - break; - }; -} -EXPORT_SYMBOL(aqt_clsh_fsm); - -/* - * Function: aqt_clsh_get_clsh_state - * Params: clsh - * Description: - * This function returns the state of the class H controller - */ -int aqt_clsh_get_clsh_state(struct aqt_clsh_cdc_data *clsh) -{ - return clsh->state; -} -EXPORT_SYMBOL(aqt_clsh_get_clsh_state); - -/* - * Function: aqt_clsh_init - * Params: clsh - * Description: - * This function initializes the class H controller - */ -void aqt_clsh_init(struct aqt_clsh_cdc_data *clsh) -{ - int i; - - clsh->state = AQT_CLSH_STATE_IDLE; - - for (i = 0; i < NUM_CLSH_STATES; i++) - clsh_state_fp[i] = aqt_clsh_state_err; - - clsh_state_fp[AQT_CLSH_STATE_HPHL] = aqt_clsh_state_hph_l; - clsh_state_fp[AQT_CLSH_STATE_HPHR] = aqt_clsh_state_hph_r; - clsh_state_fp[AQT_CLSH_STATE_HPH_ST] = aqt_clsh_state_hph_st; - /* Set interpolator modes to NONE */ - aqt_clsh_set_int_mode(clsh, AQT_CLSH_STATE_HPHL, CLS_NONE); - aqt_clsh_set_int_mode(clsh, AQT_CLSH_STATE_HPHR, CLS_NONE); - clsh->flyback_users = 0; - clsh->buck_users = 0; - clsh->clsh_users = 0; -} -EXPORT_SYMBOL(aqt_clsh_init); diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.h deleted file mode 100644 index 4a829b0c6925..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-clsh.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _AQT1000_CLSH_H -#define _AQT1000_CLSH_H - -#include -#include -#include -#include - -#define CLSH_REQ_ENABLE true -#define CLSH_REQ_DISABLE false - -#define AQT_CLSH_EVENT_PRE_DAC 0x01 -#define AQT_CLSH_EVENT_POST_PA 0x02 -/* - * Basic states for Class H state machine. - * represented as a bit mask within a u8 data type - * bit 0: HPH Left mode - * bit 1: HPH Right mode - */ -#define AQT_CLSH_STATE_IDLE 0x00 -#define AQT_CLSH_STATE_HPHL (0x01 << 0) -#define AQT_CLSH_STATE_HPHR (0x01 << 1) - -/* - * Though number of CLSH states are 2, max state shoulbe be 3 - * because state array index starts from 1. - */ -#define AQT_CLSH_STATE_MAX 3 -#define NUM_CLSH_STATES (0x01 << AQT_CLSH_STATE_MAX) - - -/* Derived State: Bits 1 and 2 should be set for Headphone stereo */ -#define AQT_CLSH_STATE_HPH_ST (AQT_CLSH_STATE_HPHL | \ - AQT_CLSH_STATE_HPHR) - -enum { - CLS_H_NORMAL = 0, /* Class-H Default */ - CLS_H_HIFI, /* Class-H HiFi */ - CLS_H_LP, /* Class-H Low Power */ - CLS_AB, /* Class-AB Low HIFI*/ - CLS_H_LOHIFI, /* LoHIFI */ - CLS_H_ULP, /* Ultra Low power */ - CLS_AB_HIFI, /* Class-AB */ - CLS_NONE, /* None of the above modes */ -}; - -enum { - DAC_GAIN_0DB = 0, - DAC_GAIN_0P2DB, - DAC_GAIN_0P4DB, - DAC_GAIN_0P6DB, - DAC_GAIN_0P8DB, - DAC_GAIN_M0P2DB, - DAC_GAIN_M0P4DB, - DAC_GAIN_M0P6DB, -}; - -enum { - VREF_FILT_R_0OHM = 0, - VREF_FILT_R_25KOHM, - VREF_FILT_R_50KOHM, - VREF_FILT_R_100KOHM, -}; - -enum { - DELTA_I_0MA, - DELTA_I_10MA, - DELTA_I_20MA, - DELTA_I_30MA, - DELTA_I_40MA, - DELTA_I_50MA, -}; - -struct aqt_imped_val { - u32 imped_val; - u8 index; -}; - -struct aqt_clsh_cdc_data { - u8 state; - int flyback_users; - int buck_users; - int clsh_users; - int interpolator_modes[AQT_CLSH_STATE_MAX]; -}; - -struct aqt_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -extern void aqt_clsh_fsm(struct snd_soc_codec *codec, - struct aqt_clsh_cdc_data *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode); - -extern void aqt_clsh_init(struct aqt_clsh_cdc_data *clsh); -extern int aqt_clsh_get_clsh_state(struct aqt_clsh_cdc_data *clsh); -extern void aqt_clsh_imped_config(struct snd_soc_codec *codec, int imped, - bool reset); - -#endif /* _AQT1000_CLSH_H */ diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-core.c b/techpack/audio/asoc/codecs/aqt1000/aqt1000-core.c deleted file mode 100644 index e6313c13eafb..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-core.c +++ /dev/null @@ -1,646 +0,0 @@ -/* Copyright (c) 2011-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../msm-cdc-pinctrl.h" -#include "../msm-cdc-supply.h" -#include "aqt1000-registers.h" -#include "aqt1000-internal.h" -#include "aqt1000.h" -#include "aqt1000-utils.h" -#include "aqt1000-irq.h" - -static int aqt1000_bringup(struct aqt1000 *aqt) -{ - struct aqt1000_pdata *pdata; - u8 clk_div = 0, mclk = 1; - - if (!aqt->regmap) { - dev_err(aqt->dev, "%s: aqt regmap is NULL\n", __func__); - return -EINVAL; - } - - /* Bringup register write sequence */ - regmap_update_bits(aqt->regmap, AQT1000_BUCK_5V_CTRL_CCL_1, 0xF0, 0xF0); - regmap_update_bits(aqt->regmap, AQT1000_BIAS_CCOMP_FINE_ADJ, - 0xF0, 0x90); - regmap_update_bits(aqt->regmap, AQT1000_ANA_BIAS, 0x80, 0x80); - regmap_update_bits(aqt->regmap, AQT1000_ANA_BIAS, 0x40, 0x40); - - /* Added 1msec sleep as per HW requirement */ - usleep_range(1000, 1010); - - regmap_update_bits(aqt->regmap, AQT1000_ANA_BIAS, 0x40, 0x00); - - clk_div = 0x04; /* Assumption is CLK DIV 2 */ - pdata = dev_get_platdata(aqt->dev); - if (pdata) { - if (pdata->mclk_rate == AQT1000_CLK_12P288MHZ) - mclk = 0; - clk_div = (((pdata->ext_clk_rate / pdata->mclk_rate) >> 1) - << 2); - } - regmap_update_bits(aqt->regmap, AQT1000_CHIP_CFG0_CLK_CFG_MCLK, - 0x03, mclk); - - regmap_update_bits(aqt->regmap, AQT1000_CLK_SYS_MCLK1_PRG, - 0x0C, clk_div); - - /* Source clock enable */ - regmap_update_bits(aqt->regmap, AQT1000_CLK_SYS_MCLK1_PRG, 0x02, 0x02); - - /* Ungate the source clock */ - regmap_update_bits(aqt->regmap, AQT1000_CLK_SYS_MCLK1_PRG, 0x10, 0x10); - - /* Set the I2S_HS_CLK reference to CLK DIV 2 */ - regmap_update_bits(aqt->regmap, AQT1000_CLK_SYS_MCLK2_I2S_HS_CLK_PRG, - 0x60, 0x20); - - /* Set the PLL preset to CLK9P6M_IN_12P288M_OUT */ - regmap_update_bits(aqt->regmap, AQT1000_CLK_SYS_PLL_PRESET, 0x0F, 0x02); - - /* Enable clock PLL */ - regmap_update_bits(aqt->regmap, AQT1000_CLK_SYS_PLL_ENABLES, - 0x01, 0x01); - - /* Add 100usec delay as per HW requirement */ - usleep_range(100, 110); - - /* Set AQT to I2S Master */ - regmap_update_bits(aqt->regmap, AQT1000_I2S_I2S_0_CTL, 0x02, 0x02); - - /* Enable I2S HS clock */ - regmap_update_bits(aqt->regmap, AQT1000_CLK_SYS_MCLK2_I2S_HS_CLK_PRG, - 0x01, 0x01); - - regmap_update_bits(aqt->regmap, AQT1000_CHIP_CFG0_CLK_CFG_MCLK, - 0x04, 0x00); - - /* Add 100usec delay as per HW requirement */ - usleep_range(100, 110); - regmap_update_bits(aqt->regmap, AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(aqt->regmap, AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - regmap_update_bits(aqt->regmap, AQT1000_CHIP_CFG0_CLK_CTL_CDC_DIG, - 0x01, 0x01); - - /* Codec digital reset */ - regmap_update_bits(aqt->regmap, AQT1000_CHIP_CFG0_RST_CTL, 0x01, 0x01); - /* Add 100usec delay as per HW requirement */ - usleep_range(100, 110); - - return 0; -} - -static int aqt1000_device_init(struct aqt1000 *aqt) -{ - int ret = 0; - - mutex_init(&aqt->io_lock); - mutex_init(&aqt->xfer_lock); - mutex_init(&aqt->cdc_bg_clk_lock); - mutex_init(&aqt->master_bias_lock); - - ret = aqt1000_bringup(aqt); - if (ret) { - ret = -EPROBE_DEFER; - goto done; - } - - ret = aqt_irq_init(aqt); - if (ret) - goto done; - - return ret; -done: - mutex_destroy(&aqt->io_lock); - mutex_destroy(&aqt->xfer_lock); - mutex_destroy(&aqt->cdc_bg_clk_lock); - mutex_destroy(&aqt->master_bias_lock); - return ret; -} - -static int aqt1000_i2c_write(struct aqt1000 *aqt1000, unsigned short reg, - void *val, int bytes) -{ - struct i2c_msg *msg; - int ret = 0; - u8 reg_addr = 0; - u8 data[bytes + 1]; - struct aqt1000_i2c *aqt1000_i2c; - u8 *value = (u8 *)val; - - aqt1000_i2c = &aqt1000->i2c_dev; - if (aqt1000_i2c == NULL || aqt1000_i2c->client == NULL) { - pr_err("%s: Failed to get device info\n", __func__); - return -ENODEV; - } - reg_addr = (u8)reg; - msg = &aqt1000_i2c->xfer_msg[0]; - msg->addr = aqt1000_i2c->client->addr; - msg->len = bytes + 1; - msg->flags = 0; - data[0] = reg; - data[1] = *value; - msg->buf = data; - ret = i2c_transfer(aqt1000_i2c->client->adapter, - aqt1000_i2c->xfer_msg, 1); - /* Try again if the write fails */ - if (ret != 1) { - ret = i2c_transfer(aqt1000_i2c->client->adapter, - aqt1000_i2c->xfer_msg, 1); - if (ret != 1) { - dev_err(aqt1000->dev, - "%s: I2C write failed, reg: 0x%x ret: %d\n", - __func__, reg, ret); - return ret; - } - } - dev_dbg(aqt1000->dev, "%s: write success register = %x val = %x\n", - __func__, reg, data[1]); - return 0; -} - -static int aqt1000_i2c_read(struct aqt1000 *aqt1000, unsigned short reg, - void *dst, int bytes) -{ - struct i2c_msg *msg; - int ret = 0; - u8 reg_addr = 0; - struct aqt1000_i2c *aqt1000_i2c; - u8 i = 0; - unsigned char *dest = (unsigned char *)dst; - - aqt1000_i2c = &aqt1000->i2c_dev; - if (aqt1000_i2c == NULL || aqt1000_i2c->client == NULL) { - pr_err("%s: Failed to get device info\n", __func__); - return -ENODEV; - } - for (i = 0; i < bytes; i++) { - reg_addr = (u8)reg++; - msg = &aqt1000_i2c->xfer_msg[0]; - msg->addr = aqt1000_i2c->client->addr; - msg->len = 1; - msg->flags = 0; - msg->buf = ®_addr; - - msg = &aqt1000_i2c->xfer_msg[1]; - msg->addr = aqt1000_i2c->client->addr; - msg->len = 1; - msg->flags = I2C_M_RD; - msg->buf = dest++; - ret = i2c_transfer(aqt1000_i2c->client->adapter, - aqt1000_i2c->xfer_msg, 2); - - /* Try again if read fails first time */ - if (ret != 2) { - ret = i2c_transfer(aqt1000_i2c->client->adapter, - aqt1000_i2c->xfer_msg, 2); - if (ret != 2) { - dev_err(aqt1000->dev, - "%s: I2C read failed, reg: 0x%x\n", - __func__, reg); - return ret; - } - } - } - return 0; -} - -static int aqt1000_reset(struct device *dev) -{ - struct aqt1000 *aqt1000; - int rc = 0; - - if (!dev) - return -ENODEV; - - aqt1000 = dev_get_drvdata(dev); - if (!aqt1000) - return -EINVAL; - - if (!aqt1000->aqt_rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - if (!msm_cdc_pinctrl_get_state(aqt1000->aqt_rst_np)) { - rc = msm_cdc_pinctrl_select_sleep_state(aqt1000->aqt_rst_np); - if (rc) { - dev_err(dev, "%s: aqt sleep state request fail!\n", - __func__); - return rc; - } - - /* 20ms sleep required after pulling the reset gpio to LOW */ - msleep(20); - - rc = msm_cdc_pinctrl_select_active_state(aqt1000->aqt_rst_np); - if (rc) { - dev_err(dev, - "%s: aqt active state request fail, ret: %d\n", - __func__, rc); - return rc; - } - /* 20ms sleep required after pulling the reset gpio to HIGH */ - msleep(20); - } - - return rc; -} - -static int aqt1000_read_of_property_u32(struct device *dev, const char *name, - u32 *val) -{ - int rc = 0; - - rc = of_property_read_u32(dev->of_node, name, val); - if (rc) - dev_err(dev, "%s: Looking up %s property in node %s failed", - __func__, name, dev->of_node->full_name); - - return rc; -} - -static void aqt1000_dt_parse_micbias_info(struct device *dev, - struct aqt1000_micbias_setting *mb) -{ - u32 prop_val; - int rc; - - if (of_find_property(dev->of_node, "qcom,cdc-micbias-ldoh-v", NULL)) { - rc = aqt1000_read_of_property_u32(dev, - "qcom,cdc-micbias-ldoh-v", - &prop_val); - if (!rc) - mb->ldoh_v = (u8)prop_val; - } - - /* MB1 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias-cfilt1-mv", - NULL)) { - rc = aqt1000_read_of_property_u32(dev, - "qcom,cdc-micbias-cfilt1-mv", - &prop_val); - if (!rc) - mb->cfilt1_mv = prop_val; - - rc = aqt1000_read_of_property_u32(dev, - "qcom,cdc-micbias1-cfilt-sel", - &prop_val); - if (!rc) - mb->bias1_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias1-mv", - NULL)) { - rc = aqt1000_read_of_property_u32(dev, - "qcom,cdc-micbias1-mv", - &prop_val); - if (!rc) - mb->micb1_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias1 DT property not found\n", - __func__); - } - - /* Print micbias info */ - dev_dbg(dev, "%s: ldoh_v %u cfilt1_mv %u micb1_mv %u \n", __func__, - (u32)mb->ldoh_v, (u32)mb->cfilt1_mv, (u32)mb->micb1_mv); -} - -static struct aqt1000_pdata *aqt1000_populate_dt_data(struct device *dev) -{ - struct aqt1000_pdata *pdata; - u32 prop_val; - - if (!dev || !dev->of_node) - return NULL; - - pdata = devm_kzalloc(dev, sizeof(struct aqt1000_pdata), - GFP_KERNEL); - if (!pdata) - return NULL; - - /* Parse power supplies */ - msm_cdc_get_power_supplies(dev, &pdata->regulator, - &pdata->num_supplies); - if (!pdata->regulator || (pdata->num_supplies <= 0)) { - dev_err(dev, "%s: no power supplies defined for codec\n", - __func__); - goto err_power_sup; - } - - /* Parse micbias info */ - aqt1000_dt_parse_micbias_info(dev, &pdata->micbias); - - pdata->aqt_rst_np = of_parse_phandle(dev->of_node, - "qcom,aqt-rst-gpio-node", 0); - if (!pdata->aqt_rst_np) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,aqt-rst-gpio-node", - dev->of_node->full_name); - goto err_parse_dt_prop; - } - - if (!(aqt1000_read_of_property_u32(dev, "qcom,cdc-ext-clk-rate", - &prop_val))) - pdata->ext_clk_rate = prop_val; - if (pdata->ext_clk_rate != AQT1000_CLK_24P576MHZ && - pdata->ext_clk_rate != AQT1000_CLK_19P2MHZ && - pdata->ext_clk_rate != AQT1000_CLK_12P288MHZ) { - /* Use the default ext_clk_rate if the DT value is wrong */ - pdata->ext_clk_rate = AQT1000_CLK_9P6MHZ; - } - - prop_val = 0; - if (!(aqt1000_read_of_property_u32(dev, "qcom,cdc-mclk-clk-rate", - &prop_val))) - pdata->mclk_rate = prop_val; - - if (pdata->mclk_rate != AQT1000_CLK_9P6MHZ && - pdata->mclk_rate != AQT1000_CLK_12P288MHZ) { - dev_err(dev, "%s: Invalid mclk_rate = %u\n", __func__, - pdata->mclk_rate); - goto err_parse_dt_prop; - } - if (pdata->ext_clk_rate % pdata->mclk_rate) { - dev_err(dev, - "%s: Invalid clock group, ext_clk = %d mclk = %d\n", - __func__, pdata->ext_clk_rate, pdata->mclk_rate); - goto err_parse_dt_prop; - } - - pdata->irq_gpio = of_get_named_gpio(dev->of_node, - "qcom,gpio-connect", 0); - if (!gpio_is_valid(pdata->irq_gpio)) { - dev_err(dev, "%s: TLMM connect gpio not found\n", __func__); - goto err_parse_dt_prop; - } - - return pdata; - -err_parse_dt_prop: - devm_kfree(dev, pdata->regulator); - pdata->regulator = NULL; - pdata->num_supplies = 0; -err_power_sup: - devm_kfree(dev, pdata); - return NULL; -} - -static int aqt1000_bringdown(struct device *dev) -{ - /* No sequence for teardown */ - - return 0; -} - -static void aqt1000_device_exit(struct aqt1000 *aqt) -{ - aqt_irq_exit(aqt); - aqt1000_bringdown(aqt->dev); - mutex_destroy(&aqt->io_lock); - mutex_destroy(&aqt->xfer_lock); - mutex_destroy(&aqt->cdc_bg_clk_lock); - mutex_destroy(&aqt->master_bias_lock); -} - -static int aqt1000_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct aqt1000 *aqt1000 = NULL; - struct aqt1000_pdata *pdata = NULL; - int ret = 0; - - pdata = aqt1000_populate_dt_data(&client->dev); - if (!pdata) { - dev_err(&client->dev, - "%s: Fail to obtain pdata from device tree\n", - __func__); - ret = -EINVAL; - goto fail; - } - client->dev.platform_data = pdata; - - aqt1000 = devm_kzalloc(&client->dev, sizeof(struct aqt1000), - GFP_KERNEL); - if (!aqt1000) { - ret = -ENOMEM; - goto fail; - } - - aqt1000->regmap = aqt1000_regmap_init(&client->dev, - &aqt1000_regmap_config); - if (IS_ERR(aqt1000->regmap)) { - ret = PTR_ERR(aqt1000->regmap); - dev_err(&client->dev, - "%s: Failed to init register map: %d\n", - __func__, ret); - goto fail; - } - aqt1000->aqt_rst_np = pdata->aqt_rst_np; - if (!aqt1000->aqt_rst_np) { - dev_err(&client->dev, "%s: pinctrl not used for rst_n\n", - __func__); - ret = -EINVAL; - goto fail; - } - - if (i2c_check_functionality(client->adapter, - I2C_FUNC_I2C) == 0) { - dev_dbg(&client->dev, "%s: can't talk I2C?\n", __func__); - ret = -EIO; - goto fail; - } - dev_set_drvdata(&client->dev, aqt1000); - aqt1000->dev = &client->dev; - aqt1000->dev_up = true; - aqt1000->mclk_rate = pdata->mclk_rate; - aqt1000->irq = client->irq; - - aqt1000->num_of_supplies = pdata->num_supplies; - ret = msm_cdc_init_supplies(aqt1000->dev, &aqt1000->supplies, - pdata->regulator, - pdata->num_supplies); - if (!aqt1000->supplies) { - dev_err(aqt1000->dev, "%s: Cannot init aqt supplies\n", - __func__); - goto err_codec; - } - ret = msm_cdc_enable_static_supplies(aqt1000->dev, - aqt1000->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(aqt1000->dev, "%s: aqt static supply enable failed!\n", - __func__); - goto err_codec; - } - /* 5 usec sleep is needed as per HW requirement */ - usleep_range(5, 10); - - ret = aqt1000_reset(aqt1000->dev); - if (ret) { - dev_err(aqt1000->dev, "%s: Codec reset failed\n", __func__); - goto err_supplies; - } - - aqt1000->i2c_dev.client = client; - aqt1000->read_dev = aqt1000_i2c_read; - aqt1000->write_dev = aqt1000_i2c_write; - - ret = aqt1000_device_init(aqt1000); - if (ret) { - pr_err("%s: error, initializing device failed (%d)\n", - __func__, ret); - goto err_supplies; - } - - pm_runtime_set_active(aqt1000->dev); - pm_runtime_enable(aqt1000->dev); - - ret = aqt_register_codec(&client->dev); - if (ret) { - dev_err(aqt1000->dev, "%s: Codec registration failed\n", - __func__); - goto err_cdc_register; - } - - return ret; - -err_cdc_register: - pm_runtime_disable(aqt1000->dev); - aqt1000_device_exit(aqt1000); -err_supplies: - msm_cdc_release_supplies(aqt1000->dev, aqt1000->supplies, - pdata->regulator, - pdata->num_supplies); - pdata->regulator = NULL; - pdata->num_supplies = 0; -err_codec: - devm_kfree(&client->dev, aqt1000); - dev_set_drvdata(&client->dev, NULL); -fail: - return ret; -} - -static int aqt1000_i2c_remove(struct i2c_client *client) -{ - struct aqt1000 *aqt; - struct aqt1000_pdata *pdata = client->dev.platform_data; - - aqt = dev_get_drvdata(&client->dev); - - pm_runtime_disable(aqt->dev); - msm_cdc_release_supplies(aqt->dev, aqt->supplies, - pdata->regulator, - pdata->num_supplies); - aqt1000_device_exit(aqt); - dev_set_drvdata(&client->dev, NULL); - return 0; -} - -#ifdef CONFIG_PM -static int aqt1000_runtime_resume(struct device *dev) -{ - dev_dbg(dev, "%s system resume\n", __func__); - - return 0; -} - -static int aqt1000_runtime_suspend(struct device *dev) -{ - dev_dbg(dev, "%s system suspend\n", __func__); - - return 0; -} -#endif - -#ifdef CONFIG_PM_SLEEP -static int aqt1000_i2c_resume(struct device *dev) -{ - pr_debug("%s system resume\n", __func__); - return 0; -} - -static int aqt1000_i2c_suspend(struct device *dev) -{ - pr_debug("%s system suspend\n", __func__); - return 0; -} -#endif - -static struct i2c_device_id aqt1000_id_table[] = { - {"aqt1000-i2c", 0}, - {} -}; -MODULE_DEVICE_TABLE(i2c, aqt1000_id_table); - -static const struct dev_pm_ops aqt1000_i2c_pm_ops = { - SET_RUNTIME_PM_OPS(aqt1000_runtime_suspend, - aqt1000_runtime_resume, NULL) - SET_SYSTEM_SLEEP_PM_OPS(aqt1000_i2c_suspend, - aqt1000_i2c_resume) -}; - -static const struct of_device_id aqt_match_table[] = { - {.compatible = "qcom,aqt1000-i2c-codec"}, - {} -}; -MODULE_DEVICE_TABLE(of, aqt_match_table); - -static struct i2c_driver aqt1000_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "aqt1000-i2c-codec", -#ifdef CONFIG_PM_SLEEP - .pm = &aqt1000_i2c_pm_ops, -#endif - .of_match_table = aqt_match_table, - }, - .id_table = aqt1000_id_table, - .probe = aqt1000_i2c_probe, - .remove = aqt1000_i2c_remove, -}; - -static int __init aqt1000_init(void) -{ - return i2c_add_driver(&aqt1000_i2c_driver); -} -module_init(aqt1000_init); - -static void __exit aqt1000_exit(void) -{ - i2c_del_driver(&aqt1000_i2c_driver); -} -module_exit(aqt1000_exit); - -MODULE_DESCRIPTION("AQT1000 Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-internal.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-internal.h deleted file mode 100644 index 19b4b57b176d..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-internal.h +++ /dev/null @@ -1,170 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _AQT1000_INTERNAL_H -#define _AQT1000_INTERNAL_H - -#include -#include -#include - -#define AQT1000_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\ - SNDRV_PCM_RATE_384000) -/* Fractional Rates */ -#define AQT1000_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ - SNDRV_PCM_RATE_176400) - -#define AQT1000_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE) - -#define AQT1000_FORMATS_S16_S24_S32_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -#define AQT1000_FORMATS_S16_LE (SNDRV_PCM_FMTBIT_S16_LE) - -/* Macros for packing register writes into a U32 */ -#define AQT1000_PACKED_REG_SIZE sizeof(u32) -#define AQT1000_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ - do { \ - ((reg) = ((packed >> 16) & (0xffff))); \ - ((mask) = ((packed >> 8) & (0xff))); \ - ((val) = ((packed) & (0xff))); \ - } while (0) - -#define STRING(name) #name -#define AQT_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define AQT_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define AQT_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - - -#define AQT1000_INTERP_MUX_NUM_INPUTS 3 -#define AQT1000_RX_PATH_CTL_OFFSET 20 - -#define BYTE_BIT_MASK(nr) (1 << ((nr) % BITS_PER_BYTE)) - -#define AQT1000_REG_BITS 8 -#define AQT1000_MAX_VALID_ADC_MUX 3 - -#define AQT1000_AMIC_PWR_LEVEL_LP 0 -#define AQT1000_AMIC_PWR_LEVEL_DEFAULT 1 -#define AQT1000_AMIC_PWR_LEVEL_HP 2 -#define AQT1000_AMIC_PWR_LVL_MASK 0x60 -#define AQT1000_AMIC_PWR_LVL_SHIFT 0x5 - -#define AQT1000_DEC_PWR_LVL_MASK 0x06 -#define AQT1000_DEC_PWR_LVL_DF 0x00 -#define AQT1000_DEC_PWR_LVL_LP 0x02 -#define AQT1000_DEC_PWR_LVL_HP 0x04 -#define AQT1000_STRING_LEN 100 - -#define AQT1000_CDC_SIDETONE_IIR_COEFF_MAX 5 - -#define AQT1000_MAX_MICBIAS 1 -#define DAPM_MICBIAS1_STANDALONE "MIC BIAS1 Standalone" - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -enum { - AUDIO_NOMINAL, - HPH_PA_DELAY, - CLSH_Z_CONFIG, - ANC_MIC_AMIC1, - ANC_MIC_AMIC2, - ANC_MIC_AMIC3, -}; - -enum { - INTn_1_INP_SEL_ZERO = 0, - INTn_1_INP_SEL_DEC0, - INTn_1_INP_SEL_DEC1, - INTn_1_INP_SEL_IIR0, - INTn_1_INP_SEL_IIR1, - INTn_1_INP_SEL_RX0, - INTn_1_INP_SEL_RX1, -}; - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_PROXIMITY, -}; - -/* Codec supports 2 IIR filters */ -enum { - IIR0 = 0, - IIR1, - IIR_MAX, -}; - -enum { - ASRC_IN_HPHL, - ASRC_IN_HPHR, - ASRC_INVALID, -}; - -enum { - CONV_88P2K_TO_384K, - CONV_96K_TO_352P8K, - CONV_352P8K_TO_384K, - CONV_384K_TO_352P8K, - CONV_384K_TO_384K, - CONV_96K_TO_384K, -}; - -enum aqt_notify_event { - AQT_EVENT_INVALID, - /* events for micbias ON and OFF */ - AQT_EVENT_PRE_MICBIAS_1_OFF, - AQT_EVENT_POST_MICBIAS_1_OFF, - AQT_EVENT_PRE_MICBIAS_1_ON, - AQT_EVENT_POST_MICBIAS_1_ON, - AQT_EVENT_PRE_DAPM_MICBIAS_1_OFF, - AQT_EVENT_POST_DAPM_MICBIAS_1_OFF, - AQT_EVENT_PRE_DAPM_MICBIAS_1_ON, - AQT_EVENT_POST_DAPM_MICBIAS_1_ON, - /* events for PA ON and OFF */ - AQT_EVENT_PRE_HPHL_PA_ON, - AQT_EVENT_POST_HPHL_PA_OFF, - AQT_EVENT_PRE_HPHR_PA_ON, - AQT_EVENT_POST_HPHR_PA_OFF, - AQT_EVENT_PRE_HPHL_PA_OFF, - AQT_EVENT_PRE_HPHR_PA_OFF, - AQT_EVENT_OCP_OFF, - AQT_EVENT_OCP_ON, - AQT_EVENT_LAST, -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -extern struct regmap_config aqt1000_regmap_config; -extern int aqt_register_codec(struct device *dev); - -#endif /* _AQT1000_INTERNAL_H */ diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.c b/techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.c deleted file mode 100644 index 321b490befee..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.c +++ /dev/null @@ -1,289 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pdata.h" -#include "aqt1000.h" - -#include "aqt1000-registers.h" -#include "aqt1000-irq.h" - -static const struct regmap_irq aqt1000_irqs[AQT1000_NUM_IRQS] = { - REGMAP_IRQ_REG(AQT1000_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x01), - REGMAP_IRQ_REG(AQT1000_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x02), - REGMAP_IRQ_REG(AQT1000_IRQ_MBHC_ELECT_INS_REM_DET, 0, 0x04), - REGMAP_IRQ_REG(AQT1000_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 0, 0x08), - REGMAP_IRQ_REG(AQT1000_IRQ_MBHC_SW_DET, 0, 0x10), - REGMAP_IRQ_REG(AQT1000_IRQ_HPH_PA_OCPL_FAULT, 0, 0x20), - REGMAP_IRQ_REG(AQT1000_IRQ_HPH_PA_OCPR_FAULT, 0, 0x40), - REGMAP_IRQ_REG(AQT1000_IRQ_HPH_PA_CNPL_COMPLETE, 0, 0x80), - REGMAP_IRQ_REG(AQT1000_IRQ_HPH_PA_CNPR_COMPLETE, 1, 0x01), - REGMAP_IRQ_REG(AQT1000_CDC_HPHL_SURGE, 1, 0x02), - REGMAP_IRQ_REG(AQT1000_CDC_HPHR_SURGE, 1, 0x04), -}; - -static const struct regmap_irq_chip aqt_regmap_irq_chip = { - .name = "AQT1000", - .irqs = aqt1000_irqs, - .num_irqs = ARRAY_SIZE(aqt1000_irqs), - .num_regs = 2, - .status_base = AQT1000_INTR_CTRL_INT_STATUS_2, - .mask_base = AQT1000_INTR_CTRL_INT_MASK_2, - .unmask_base = AQT1000_INTR_CTRL_INT_CLEAR_2, - .ack_base = AQT1000_INTR_CTRL_INT_STATUS_2, - .runtime_pm = true, -}; - -static int aqt_map_irq(struct aqt1000 *aqt, int irq) -{ - return regmap_irq_get_virq(aqt->irq_chip, irq); -} - -/** - * aqt_request_irq: Request a thread handler for the given IRQ - * @aqt: pointer to aqt1000 structure - * @irq: irq number - * @name: name for the IRQ thread - * @handler: irq handler - * @data: data pointer - * - * Returns 0 on success or error on failure - */ -int aqt_request_irq(struct aqt1000 *aqt, int irq, const char *name, - irq_handler_t handler, void *data) -{ - irq = aqt_map_irq(aqt, irq); - if (irq < 0) - return irq; - - return request_threaded_irq(irq, NULL, handler, - IRQF_ONESHOT | IRQF_TRIGGER_RISING, - name, data); -} -EXPORT_SYMBOL(aqt_request_irq); - -/** - * aqt_free_irq: Free the IRQ resources allocated during request_irq - * @aqt: pointer to aqt1000 structure - * @irq: irq number - * @data: data pointer - */ -void aqt_free_irq(struct aqt1000 *aqt, int irq, void *data) -{ - irq = aqt_map_irq(aqt, irq); - if (irq < 0) - return; - - free_irq(irq, data); -} -EXPORT_SYMBOL(aqt_free_irq); - -/** - * aqt_enable_irq: Enable the given IRQ - * @aqt: pointer to aqt1000 structure - * @irq: irq number - */ -void aqt_enable_irq(struct aqt1000 *aqt, int irq) -{ - if (aqt) - enable_irq(aqt_map_irq(aqt, irq)); -} -EXPORT_SYMBOL(aqt_enable_irq); - -/** - * aqt_disable_irq: Disable the given IRQ - * @aqt: pointer to aqt1000 structure - * @irq: irq number - */ -void aqt_disable_irq(struct aqt1000 *aqt, int irq) -{ - if (aqt) - disable_irq(aqt_map_irq(aqt, irq)); -} -EXPORT_SYMBOL(aqt_disable_irq); - -static irqreturn_t aqt_irq_thread(int irq, void *data) -{ - int ret = 0; - u8 sts[2]; - struct aqt1000 *aqt = data; - int num_irq_regs = aqt->num_irq_regs; - struct aqt1000_pdata *pdata; - - pdata = dev_get_platdata(aqt->dev); - - memset(sts, 0, sizeof(sts)); - ret = regmap_bulk_read(aqt->regmap, AQT1000_INTR_CTRL_INT_STATUS_2, - sts, num_irq_regs); - if (ret < 0) { - dev_err(aqt->dev, "%s: Failed to read intr status: %d\n", - __func__, ret); - } else if (ret == 0) { - while (gpio_get_value_cansleep(pdata->irq_gpio)) - handle_nested_irq(irq_find_mapping(aqt->virq, 0)); - } - - return IRQ_HANDLED; -} - -static void aqt_irq_disable(struct irq_data *data) -{ -} - -static void aqt_irq_enable(struct irq_data *data) -{ -} - -static struct irq_chip aqt_irq_chip = { - .name = "AQT", - .irq_disable = aqt_irq_disable, - .irq_enable = aqt_irq_enable, -}; - -static struct lock_class_key aqt_irq_lock_class; - -static int aqt_irq_map(struct irq_domain *irqd, unsigned int virq, - irq_hw_number_t hw) -{ - struct aqt1000 *data = irqd->host_data; - - irq_set_chip_data(virq, data); - irq_set_chip_and_handler(virq, &aqt_irq_chip, handle_simple_irq); - irq_set_lockdep_class(virq, &aqt_irq_lock_class); - irq_set_nested_thread(virq, 1); - irq_set_noprobe(virq); - - return 0; -} - -static const struct irq_domain_ops aqt_domain_ops = { - .map = aqt_irq_map, - .xlate = irq_domain_xlate_twocell, -}; - -/** - * aqt_irq_init: Initializes IRQ module - * @aqt: pointer to aqt1000 structure - * - * Returns 0 on success or error on failure - */ -int aqt_irq_init(struct aqt1000 *aqt) -{ - int i, ret; - unsigned int flags = IRQF_ONESHOT; - struct irq_data *irq_data; - struct aqt1000_pdata *pdata; - - if (!aqt) { - pr_err("%s: Null pointer handle\n", __func__); - return -EINVAL; - } - - pdata = dev_get_platdata(aqt->dev); - if (!pdata) { - dev_err(aqt->dev, "%s: Invalid platform data\n", __func__); - return -EINVAL; - } - - /* Select default if not defined in DT */ - flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT; - if (pdata->irq_flags) - flags = pdata->irq_flags; - - if (pdata->irq_gpio) { - aqt->irq = gpio_to_irq(pdata->irq_gpio); - ret = devm_gpio_request_one(aqt->dev, pdata->irq_gpio, - GPIOF_IN, "AQT IRQ"); - if (ret) { - dev_err(aqt->dev, "%s: Failed to request gpio %d\n", - __func__, ret); - pdata->irq_gpio = 0; - return ret; - } - } - - irq_data = irq_get_irq_data(aqt->irq); - if (!irq_data) { - dev_err(aqt->dev, "%s: Invalid IRQ: %d\n", - __func__, aqt->irq); - return -EINVAL; - } - - aqt->num_irq_regs = aqt_regmap_irq_chip.num_regs; - for (i = 0; i < aqt->num_irq_regs; i++) { - regmap_write(aqt->regmap, - (AQT1000_INTR_CTRL_INT_TYPE_2 + i), 0); - } - - aqt->virq = irq_domain_add_linear(NULL, 1, &aqt_domain_ops, aqt); - if (!aqt->virq) { - dev_err(aqt->dev, "%s: Failed to add IRQ domain\n", __func__); - ret = -EINVAL; - goto err; - } - ret = regmap_add_irq_chip(aqt->regmap, - irq_create_mapping(aqt->virq, 0), - IRQF_ONESHOT, 0, &aqt_regmap_irq_chip, - &aqt->irq_chip); - if (ret) { - dev_err(aqt->dev, "%s: Failed to add IRQs: %d\n", - __func__, ret); - goto err; - } - - ret = request_threaded_irq(aqt->irq, NULL, aqt_irq_thread, flags, - "aqt", aqt); - if (ret) { - dev_err(aqt->dev, "%s: failed to register irq: %d\n", - __func__, ret); - goto err_irq; - } - - return 0; - -err_irq: - regmap_del_irq_chip(irq_create_mapping(aqt->virq, 1), aqt->irq_chip); -err: - return ret; -} -EXPORT_SYMBOL(aqt_irq_init); - -/** - * aqt_irq_exit: Uninitialize regmap IRQ and free IRQ resources - * @aqt: pointer to aqt1000 structure - * - * Returns 0 on success or error on failure - */ -int aqt_irq_exit(struct aqt1000 *aqt) -{ - if (!aqt) { - pr_err("%s: Null pointer handle\n", __func__); - return -EINVAL; - } - regmap_del_irq_chip(irq_create_mapping(aqt->virq, 1), aqt->irq_chip); - free_irq(aqt->irq, aqt); - - return 0; -} -EXPORT_SYMBOL(aqt_irq_exit); diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.h deleted file mode 100644 index 60be49c21163..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-irq.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __AQT1000_IRQ_H_ -#define __AQT1000_IRQ_H_ - -#include -#include -#include - -enum { - /* INTR_CTRL_INT_MASK_2 */ - AQT1000_IRQ_MBHC_BUTTON_RELEASE_DET = 0, - AQT1000_IRQ_MBHC_BUTTON_PRESS_DET, - AQT1000_IRQ_MBHC_ELECT_INS_REM_DET, - AQT1000_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - AQT1000_IRQ_MBHC_SW_DET, - AQT1000_IRQ_HPH_PA_OCPL_FAULT, - AQT1000_IRQ_HPH_PA_OCPR_FAULT, - AQT1000_IRQ_HPH_PA_CNPL_COMPLETE, - - /* INTR_CTRL_INT_MASK_3 */ - AQT1000_IRQ_HPH_PA_CNPR_COMPLETE, - AQT1000_CDC_HPHL_SURGE, - AQT1000_CDC_HPHR_SURGE, - AQT1000_NUM_IRQS, -}; - -int aqt_request_irq(struct aqt1000 *aqt, int irq, const char *name, - irq_handler_t handler, void *data); -void aqt_free_irq(struct aqt1000 *aqt, int irq, void *data); -int aqt_irq_init(struct aqt1000 *aqt); -int aqt_irq_exit(struct aqt1000 *aqt); -void aqt_enable_irq(struct aqt1000 *aqt, int irq); -void aqt_disable_irq(struct aqt1000 *aqt, int irq); - -#endif /* __AQT1000_IRQ_H_ */ diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.c b/techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.c deleted file mode 100644 index 24f14a46e55e..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.c +++ /dev/null @@ -1,1058 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "aqt1000.h" -#include "aqt1000-api.h" -#include "aqt1000-mbhc.h" -#include "aqt1000-registers.h" -#include "aqt1000-irq.h" -#include "pdata.h" -#include "../wcdcal-hwdep.h" -#include "../wcd-mbhc-v2-api.h" - -#define AQT_ZDET_SUPPORTED true -/* Z value defined in milliohm */ -#define AQT_ZDET_VAL_32 32000 -#define AQT_ZDET_VAL_400 400000 -#define AQT_ZDET_VAL_1200 1200000 -#define AQT_ZDET_VAL_100K 100000000 -/* Z floating defined in ohms */ -#define AQT_ZDET_FLOATING_IMPEDANCE 0x0FFFFFFE - -#define AQT_ZDET_NUM_MEASUREMENTS 900 -#define AQT_MBHC_GET_C1(c) ((c & 0xC000) >> 14) -#define AQT_MBHC_GET_X1(x) (x & 0x3FFF) -/* Z value compared in milliOhm */ -#define AQT_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) -#define AQT_MBHC_ZDET_CONST (86 * 16384) -#define AQT_MBHC_MOISTURE_RREF R_24_KOHM - -static struct wcd_mbhc_register - wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { - WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN", - AQT1000_ANA_MBHC_MECH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN", - AQT1000_ANA_MBHC_MECH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE", - AQT1000_ANA_MBHC_MECH, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL", - AQT1000_MBHC_NEW_PLUG_DETECT_CTL, 0x30, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE", - AQT1000_ANA_MBHC_ELECT, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL", - AQT1000_MBHC_NEW_INT_MECH_DET_CURRENT, 0x1F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL", - AQT1000_ANA_MBHC_MECH, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE", - AQT1000_ANA_MBHC_MECH, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE", - AQT1000_ANA_MBHC_MECH, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND", - AQT1000_ANA_MBHC_MECH, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC", - AQT1000_ANA_MBHC_ELECT, 0x06, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN", - AQT1000_ANA_MBHC_ELECT, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC", - AQT1000_MBHC_NEW_PLUG_DETECT_CTL, 0x0F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC", - AQT1000_MBHC_NEW_CTL_1, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF", - AQT1000_MBHC_NEW_CTL_2, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT", - AQT1000_ANA_MBHC_RESULT_3, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT", - AQT1000_ANA_MBHC_RESULT_3, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT", - AQT1000_ANA_MBHC_RESULT_3, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT", - AQT1000_ANA_MBHC_RESULT_3, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN", - AQT1000_HPH_OCP_CTL, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT", - AQT1000_ANA_MBHC_RESULT_3, 0x07, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL", - AQT1000_ANA_MBHC_ELECT, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT", - AQT1000_ANA_MBHC_RESULT_3, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL", - AQT1000_ANA_MICB1, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME", - AQT1000_HPH_CNP_WG_TIME, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN", - AQT1000_ANA_HPH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN", - AQT1000_ANA_HPH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN", - AQT1000_ANA_HPH, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", - AQT1000_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", - 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", - AQT1000_MBHC_CTL_BCS, 0x02, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", - AQT1000_MBHC_NEW_FSM_STATUS, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", - AQT1000_MBHC_NEW_CTL_2, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_DET_EN", - AQT1000_HPH_L_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_DET_EN", - AQT1000_HPH_R_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_STATUS", - AQT1000_INTR_CTRL_INT_STATUS_2, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_STATUS", - AQT1000_INTR_CTRL_INT_STATUS_2, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_EN", - AQT1000_MBHC_NEW_CTL_1, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_COMPLETE", AQT1000_MBHC_NEW_FSM_STATUS, - 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_TIMEOUT", AQT1000_MBHC_NEW_FSM_STATUS, - 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_RESULT", AQT1000_MBHC_NEW_ADC_RESULT, - 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB2_VOUT", AQT1000_ANA_MICB1, 0x3F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_MODE", - AQT1000_MBHC_NEW_CTL_1, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_DETECTION_DONE", - AQT1000_MBHC_NEW_CTL_1, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_ISRC_EN", - AQT1000_ANA_MBHC_ZDET, 0x02, 1, 0), -}; - -static const struct wcd_mbhc_intr intr_ids = { - .mbhc_sw_intr = AQT1000_IRQ_MBHC_SW_DET, - .mbhc_btn_press_intr = AQT1000_IRQ_MBHC_BUTTON_PRESS_DET, - .mbhc_btn_release_intr = AQT1000_IRQ_MBHC_BUTTON_RELEASE_DET, - .mbhc_hs_ins_intr = AQT1000_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - .mbhc_hs_rem_intr = AQT1000_IRQ_MBHC_ELECT_INS_REM_DET, - .hph_left_ocp = AQT1000_IRQ_HPH_PA_OCPL_FAULT, - .hph_right_ocp = AQT1000_IRQ_HPH_PA_OCPR_FAULT, -}; - -struct aqt_mbhc_zdet_param { - u16 ldo_ctl; - u16 noff; - u16 nshift; - u16 btn5; - u16 btn6; - u16 btn7; -}; - -static int aqt_mbhc_request_irq(struct snd_soc_codec *codec, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - struct aqt1000 *aqt = dev_get_drvdata(codec->dev); - - return aqt_request_irq(aqt, irq, name, handler, data); -} - -static void aqt_mbhc_irq_control(struct snd_soc_codec *codec, - int irq, bool enable) -{ - struct aqt1000 *aqt = dev_get_drvdata(codec->dev); - - if (enable) - aqt_enable_irq(aqt, irq); - else - aqt_disable_irq(aqt, irq); -} - -static int aqt_mbhc_free_irq(struct snd_soc_codec *codec, - int irq, void *data) -{ - struct aqt1000 *aqt = dev_get_drvdata(codec->dev); - - aqt_free_irq(aqt, irq, data); - - return 0; -} - -static void aqt_mbhc_clk_setup(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_CTL_1, - 0x80, 0x80); - else - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_CTL_1, - 0x80, 0x00); -} - -static int aqt_mbhc_btn_to_num(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, AQT1000_ANA_MBHC_RESULT_3) & 0x7; -} - -static void aqt_mbhc_mbhc_bias_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_ELECT, - 0x01, 0x01); - else - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_ELECT, - 0x01, 0x00); -} - -static void aqt_mbhc_program_btn_thr(struct snd_soc_codec *codec, - s16 *btn_low, s16 *btn_high, - int num_btn, bool is_micbias) -{ - int i; - int vth; - - if (num_btn > WCD_MBHC_DEF_BUTTONS) { - dev_err(codec->dev, "%s: invalid number of buttons: %d\n", - __func__, num_btn); - return; - } - - for (i = 0; i < num_btn; i++) { - vth = ((btn_high[i] * 2) / 25) & 0x3F; - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_BTN0 + i, - 0xFC, vth << 2); - dev_dbg(codec->dev, "%s: btn_high[%d]: %d, vth: %d\n", - __func__, i, btn_high[i], vth); - } -} - -static bool aqt_mbhc_lock_sleep(struct wcd_mbhc *mbhc, bool lock) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct aqt1000 *aqt = dev_get_drvdata(codec->dev); - bool ret = 0; - - dev_dbg(aqt->dev, "%s: lock: %d\n", __func__, lock); - - return ret; -} - -static int aqt_mbhc_register_notifier(struct wcd_mbhc *mbhc, - struct notifier_block *nblock, - bool enable) -{ - struct aqt1000_mbhc *aqt_mbhc; - - aqt_mbhc = container_of(mbhc, struct aqt1000_mbhc, wcd_mbhc); - - if (enable) - return blocking_notifier_chain_register(&aqt_mbhc->notifier, - nblock); - else - return blocking_notifier_chain_unregister( - &aqt_mbhc->notifier, nblock); -} - -static bool aqt_mbhc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num) -{ - u8 val; - - if (micb_num == MIC_BIAS_1) { - val = ((snd_soc_read(mbhc->codec, AQT1000_ANA_MICB1) & 0xC0) - >> 6); - if (val == 0x01) - return true; - } - return false; -} - -static bool aqt_mbhc_hph_pa_on_status(struct snd_soc_codec *codec) -{ - return (snd_soc_read(codec, AQT1000_ANA_HPH) & 0xC0) ? true : false; -} - -static void aqt_mbhc_hph_l_pull_up_control(struct snd_soc_codec *codec, - int pull_up_cur) -{ - /* Default pull up current to 2uA */ - if (pull_up_cur > HS_PULLUP_I_OFF || pull_up_cur < HS_PULLUP_I_3P0_UA || - pull_up_cur == HS_PULLUP_I_DEFAULT) - pull_up_cur = HS_PULLUP_I_2P0_UA; - - dev_dbg(codec->dev, "%s: HS pull up current:%d\n", - __func__, pull_up_cur); - - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_INT_MECH_DET_CURRENT, - 0x1F, pull_up_cur); -} - -static int aqt_mbhc_request_micbias(struct snd_soc_codec *codec, - int micb_num, int req) -{ - int ret = 0; - - /* - * If micbias is requested, make sure that there - * is vote to enable mclk - */ - if (req == MICB_ENABLE) - aqt_cdc_mclk_enable(codec, true); - - ret = aqt_micbias_control(codec, micb_num, req, false); - - /* - * Release vote for mclk while requesting for - * micbias disable - */ - if (req == MICB_DISABLE) - aqt_cdc_mclk_enable(codec, false); - - return ret; -} - -static void aqt_mbhc_micb_ramp_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, AQT1000_ANA_MICB1_RAMP, - 0x1C, 0x0C); - snd_soc_update_bits(codec, AQT1000_ANA_MICB1_RAMP, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, AQT1000_ANA_MICB1_RAMP, - 0x80, 0x00); - snd_soc_update_bits(codec, AQT1000_ANA_MICB1_RAMP, - 0x1C, 0x00); - } -} - -static struct firmware_cal *aqt_get_hwdep_fw_cal(struct wcd_mbhc *mbhc, - enum wcd_cal_type type) -{ - struct aqt1000_mbhc *aqt_mbhc; - struct firmware_cal *hwdep_cal; - struct snd_soc_codec *codec = mbhc->codec; - - aqt_mbhc = container_of(mbhc, struct aqt1000_mbhc, wcd_mbhc); - - if (!codec) { - pr_err("%s: NULL codec pointer\n", __func__); - return NULL; - } - hwdep_cal = wcdcal_get_fw_cal(aqt_mbhc->fw_data, type); - if (!hwdep_cal) - dev_err(codec->dev, "%s: cal not sent by %d\n", - __func__, type); - - return hwdep_cal; -} - -static int aqt_mbhc_micb_ctrl_threshold_mic(struct snd_soc_codec *codec, - int micb_num, bool req_en) -{ - struct aqt1000_pdata *pdata = dev_get_platdata(codec->dev); - int rc, micb_mv; - - if (micb_num != MIC_BIAS_1) - return -EINVAL; - - /* - * If device tree micbias level is already above the minimum - * voltage needed to detect threshold microphone, then do - * not change the micbias, just return. - */ - if (pdata->micbias.micb1_mv >= WCD_MBHC_THR_HS_MICB_MV) - return 0; - - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : pdata->micbias.micb1_mv; - - rc = aqt_mbhc_micb_adjust_voltage(codec, micb_mv, MIC_BIAS_1); - - return rc; -} - -static inline void aqt_mbhc_get_result_params(struct aqt1000 *aqt, - s16 *d1_a, u16 noff, - int32_t *zdet) -{ - int i; - int val, val1; - s16 c1; - s32 x1, d1; - int32_t denom; - int minCode_param[] = { - 3277, 1639, 820, 410, 205, 103, 52, 26 - }; - - regmap_update_bits(aqt->regmap, AQT1000_ANA_MBHC_ZDET, 0x20, 0x20); - for (i = 0; i < AQT_ZDET_NUM_MEASUREMENTS; i++) { - regmap_read(aqt->regmap, AQT1000_ANA_MBHC_RESULT_2, &val); - if (val & 0x80) - break; - } - val = val << 0x8; - regmap_read(aqt->regmap, AQT1000_ANA_MBHC_RESULT_1, &val1); - val |= val1; - regmap_update_bits(aqt->regmap, AQT1000_ANA_MBHC_ZDET, 0x20, 0x00); - x1 = AQT_MBHC_GET_X1(val); - c1 = AQT_MBHC_GET_C1(val); - /* If ramp is not complete, give additional 5ms */ - if ((c1 < 2) && x1) - usleep_range(5000, 5050); - - if (!c1 || !x1) { - dev_dbg(aqt->dev, - "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", - __func__, c1, x1); - goto ramp_down; - } - d1 = d1_a[c1]; - denom = (x1 * d1) - (1 << (14 - noff)); - if (denom > 0) - *zdet = (AQT_MBHC_ZDET_CONST * 1000) / denom; - else if (x1 < minCode_param[noff]) - *zdet = AQT_ZDET_FLOATING_IMPEDANCE; - - dev_dbg(aqt->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", - __func__, d1, c1, x1, *zdet); -ramp_down: - i = 0; - while (x1) { - regmap_bulk_read(aqt->regmap, - AQT1000_ANA_MBHC_RESULT_1, (u8 *)&val, 2); - x1 = AQT_MBHC_GET_X1(val); - i++; - if (i == AQT_ZDET_NUM_MEASUREMENTS) - break; - } -} - -static void aqt_mbhc_zdet_ramp(struct snd_soc_codec *codec, - struct aqt_mbhc_zdet_param *zdet_param, - int32_t *zl, int32_t *zr, s16 *d1_a) -{ - struct aqt1000 *aqt = dev_get_drvdata(codec->dev); - int32_t zdet = 0; - - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_ZDET_ANA_CTL, 0x70, - zdet_param->ldo_ctl << 4); - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_BTN5, 0xFC, - zdet_param->btn5); - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_BTN6, 0xFC, - zdet_param->btn6); - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_BTN7, 0xFC, - zdet_param->btn7); - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_ZDET_ANA_CTL, 0x0F, - zdet_param->noff); - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_ZDET_RAMP_CTL, 0x0F, - zdet_param->nshift); - - if (!zl) - goto z_right; - /* Start impedance measurement for HPH_L */ - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_ZDET, 0x80, 0x80); - dev_dbg(aqt->dev, "%s: ramp for HPH_L, noff = %d\n", - __func__, zdet_param->noff); - aqt_mbhc_get_result_params(aqt, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_ZDET, 0x80, 0x00); - - *zl = zdet; - -z_right: - if (!zr) - return; - /* Start impedance measurement for HPH_R */ - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_ZDET, 0x40, 0x40); - dev_dbg(aqt->dev, "%s: ramp for HPH_R, noff = %d\n", - __func__, zdet_param->noff); - aqt_mbhc_get_result_params(aqt, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_ZDET, 0x40, 0x00); - - *zr = zdet; -} - -static inline void aqt_wcd_mbhc_qfuse_cal(struct snd_soc_codec *codec, - int32_t *z_val, int flag_l_r) -{ - s16 q1; - int q1_cal; - - if (*z_val < (AQT_ZDET_VAL_400/1000)) - q1 = snd_soc_read(codec, - AQT1000_CHIP_CFG0_EFUSE_VAL_OUT1 + (2 * flag_l_r)); - else - q1 = snd_soc_read(codec, - AQT1000_CHIP_CFG0_EFUSE_VAL_OUT2 + (2 * flag_l_r)); - if (q1 & 0x80) - q1_cal = (10000 - ((q1 & 0x7F) * 25)); - else - q1_cal = (10000 + (q1 * 25)); - if (q1_cal > 0) - *z_val = ((*z_val) * 10000) / q1_cal; -} - -static void aqt_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct aqt1000 *aqt = dev_get_drvdata(codec->dev); - s16 reg0, reg1, reg2, reg3, reg4; - int32_t z1L, z1R, z1Ls; - int zMono, z_diff1, z_diff2; - bool is_fsm_disable = false; - struct aqt_mbhc_zdet_param zdet_param[] = { - {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */ - {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */ - {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */ - {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */ - }; - struct aqt_mbhc_zdet_param *zdet_param_ptr = NULL; - s16 d1_a[][4] = { - {0, 30, 90, 30}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - }; - s16 *d1 = NULL; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - reg0 = snd_soc_read(codec, AQT1000_ANA_MBHC_BTN5); - reg1 = snd_soc_read(codec, AQT1000_ANA_MBHC_BTN6); - reg2 = snd_soc_read(codec, AQT1000_ANA_MBHC_BTN7); - reg3 = snd_soc_read(codec, AQT1000_MBHC_CTL_CLK); - reg4 = snd_soc_read(codec, AQT1000_MBHC_NEW_ZDET_ANA_CTL); - - if (snd_soc_read(codec, AQT1000_ANA_MBHC_ELECT) & 0x80) { - is_fsm_disable = true; - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_ELECT, 0x80, 0x00); - } - - /* For NO-jack, disable L_DET_EN before Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_MECH, 0x80, 0x00); - - /* Turn off 100k pull down on HPHL */ - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_MECH, 0x01, 0x00); - - /* First get impedance on Left */ - d1 = d1_a[1]; - zdet_param_ptr = &zdet_param[1]; - aqt_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - - if (!AQT_MBHC_IS_SECOND_RAMP_REQUIRED(z1L)) - goto left_ch_impedance; - - /* Second ramp for left ch */ - if (z1L < AQT_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1L > AQT_ZDET_VAL_400) && (z1L <= AQT_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1L > AQT_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - aqt_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - -left_ch_impedance: - if ((z1L == AQT_ZDET_FLOATING_IMPEDANCE) || - (z1L > AQT_ZDET_VAL_100K)) { - *zl = AQT_ZDET_FLOATING_IMPEDANCE; - zdet_param_ptr = &zdet_param[1]; - d1 = d1_a[1]; - } else { - *zl = z1L/1000; - aqt_wcd_mbhc_qfuse_cal(codec, zl, 0); - } - dev_dbg(codec->dev, "%s: impedance on HPH_L = %d(ohms)\n", - __func__, *zl); - - /* Start of right impedance ramp and calculation */ - aqt_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - if (AQT_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) { - if (((z1R > AQT_ZDET_VAL_1200) && - (zdet_param_ptr->noff == 0x6)) || - ((*zl) != AQT_ZDET_FLOATING_IMPEDANCE)) - goto right_ch_impedance; - /* Second ramp for right ch */ - if (z1R < AQT_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1R > AQT_ZDET_VAL_400) && - (z1R <= AQT_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1R > AQT_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - aqt_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - } -right_ch_impedance: - if ((z1R == AQT_ZDET_FLOATING_IMPEDANCE) || - (z1R > AQT_ZDET_VAL_100K)) { - *zr = AQT_ZDET_FLOATING_IMPEDANCE; - } else { - *zr = z1R/1000; - aqt_wcd_mbhc_qfuse_cal(codec, zr, 1); - } - dev_dbg(codec->dev, "%s: impedance on HPH_R = %d(ohms)\n", - __func__, *zr); - - /* Mono/stereo detection */ - if ((*zl == AQT_ZDET_FLOATING_IMPEDANCE) && - (*zr == AQT_ZDET_FLOATING_IMPEDANCE)) { - dev_dbg(codec->dev, - "%s: plug type is invalid or extension cable\n", - __func__); - goto zdet_complete; - } - if ((*zl == AQT_ZDET_FLOATING_IMPEDANCE) || - (*zr == AQT_ZDET_FLOATING_IMPEDANCE) || - ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) || - ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) { - dev_dbg(codec->dev, - "%s: Mono plug type with one ch floating or shorted to GND\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - goto zdet_complete; - } - snd_soc_update_bits(codec, AQT1000_HPH_R_ATEST, 0x02, 0x02); - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL2, 0x40, 0x01); - if (*zl < (AQT_ZDET_VAL_32/1000)) - aqt_mbhc_zdet_ramp(codec, &zdet_param[0], &z1Ls, NULL, d1); - else - aqt_mbhc_zdet_ramp(codec, &zdet_param[1], &z1Ls, NULL, d1); - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL2, 0x40, 0x00); - snd_soc_update_bits(codec, AQT1000_HPH_R_ATEST, 0x02, 0x00); - z1Ls /= 1000; - aqt_wcd_mbhc_qfuse_cal(codec, &z1Ls, 0); - /* Parallel of left Z and 9 ohm pull down resistor */ - zMono = ((*zl) * 9) / ((*zl) + 9); - z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); - z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); - if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) { - dev_dbg(codec->dev, "%s: stereo plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } else { - dev_dbg(codec->dev, "%s: MONO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } - -zdet_complete: - snd_soc_write(codec, AQT1000_ANA_MBHC_BTN5, reg0); - snd_soc_write(codec, AQT1000_ANA_MBHC_BTN6, reg1); - snd_soc_write(codec, AQT1000_ANA_MBHC_BTN7, reg2); - /* Turn on 100k pull down on HPHL */ - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_MECH, 0x01, 0x01); - - /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_MECH, 0x80, 0x80); - - snd_soc_write(codec, AQT1000_MBHC_NEW_ZDET_ANA_CTL, reg4); - snd_soc_write(codec, AQT1000_MBHC_CTL_CLK, reg3); - if (is_fsm_disable) - regmap_update_bits(aqt->regmap, - AQT1000_ANA_MBHC_ELECT, 0x80, 0x80); -} - -static void aqt_mbhc_gnd_det_ctrl(struct snd_soc_codec *codec, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_MECH, - 0x02, 0x02); - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_MECH, - 0x40, 0x40); - } else { - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_MECH, - 0x40, 0x00); - snd_soc_update_bits(codec, AQT1000_ANA_MBHC_MECH, - 0x02, 0x00); - } -} - -static void aqt_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL2, - 0x40, 0x40); - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL2, - 0x10, 0x10); - } else { - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL2, - 0x40, 0x00); - snd_soc_update_bits(codec, AQT1000_HPH_PA_CTL2, - 0x10, 0x00); - } -} - -static void aqt_mbhc_moisture_config(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - /* Do not enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - snd_soc_update_bits(codec, AQT1000_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); -} - -static void aqt_update_anc_state(struct snd_soc_codec *codec, bool enable, - int anc_num) -{ - if (enable) - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_CFG0 + - (20 * anc_num), 0x10, 0x10); - else - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_CFG0 + - (20 * anc_num), 0x10, 0x00); -} - -static bool aqt_is_anc_on(struct wcd_mbhc *mbhc) -{ - bool anc_on = false; - u16 ancl, ancr; - - ancl = - (snd_soc_read(mbhc->codec, AQT1000_CDC_RX1_RX_PATH_CFG0)) & 0x10; - ancr = - (snd_soc_read(mbhc->codec, AQT1000_CDC_RX2_RX_PATH_CFG0)) & 0x10; - - anc_on = !!(ancl | ancr); - - return anc_on; -} - -static const struct wcd_mbhc_cb mbhc_cb = { - .request_irq = aqt_mbhc_request_irq, - .irq_control = aqt_mbhc_irq_control, - .free_irq = aqt_mbhc_free_irq, - .clk_setup = aqt_mbhc_clk_setup, - .map_btn_code_to_num = aqt_mbhc_btn_to_num, - .mbhc_bias = aqt_mbhc_mbhc_bias_control, - .set_btn_thr = aqt_mbhc_program_btn_thr, - .lock_sleep = aqt_mbhc_lock_sleep, - .register_notifier = aqt_mbhc_register_notifier, - .micbias_enable_status = aqt_mbhc_micb_en_status, - .hph_pa_on_status = aqt_mbhc_hph_pa_on_status, - .hph_pull_up_control_v2 = aqt_mbhc_hph_l_pull_up_control, - .mbhc_micbias_control = aqt_mbhc_request_micbias, - .mbhc_micb_ramp_control = aqt_mbhc_micb_ramp_control, - .get_hwdep_fw_cal = aqt_get_hwdep_fw_cal, - .mbhc_micb_ctrl_thr_mic = aqt_mbhc_micb_ctrl_threshold_mic, - .compute_impedance = aqt_wcd_mbhc_calc_impedance, - .mbhc_gnd_det_ctrl = aqt_mbhc_gnd_det_ctrl, - .hph_pull_down_ctrl = aqt_mbhc_hph_pull_down_ctrl, - .mbhc_moisture_config = aqt_mbhc_moisture_config, - .update_anc_state = aqt_update_anc_state, - .is_anc_on = aqt_is_anc_on, -}; - -static int aqt_get_hph_type(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - struct aqt1000_mbhc *aqt_mbhc = aqt->mbhc; - struct wcd_mbhc *mbhc; - - if (!aqt_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mbhc = &aqt_mbhc->wcd_mbhc; - - ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; - dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); - - return 0; -} - -static int aqt_hph_impedance_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t zl, zr; - bool hphr; - struct soc_multi_mixer_control *mc; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - struct aqt1000_mbhc *aqt_mbhc = aqt->mbhc; - - if (!aqt_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - wcd_mbhc_get_impedance(&aqt_mbhc->wcd_mbhc, &zl, &zr); - dev_dbg(codec->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); - ucontrol->value.integer.value[0] = hphr ? zr : zl; - - return 0; -} - -static const struct snd_kcontrol_new hph_type_detect_controls[] = { - SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, - aqt_get_hph_type, NULL), -}; - -static const struct snd_kcontrol_new impedance_detect_controls[] = { - SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0, - aqt_hph_impedance_get, NULL), - SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0, - aqt_hph_impedance_get, NULL), -}; - -/* - * aqt_mbhc_get_impedance: get impedance of headphone left and right channels - * @aqt_mbhc: handle to struct aqt_mbhc * - * @zl: handle to left-ch impedance - * @zr: handle to right-ch impedance - * return 0 for success or error code in case of failure - */ -int aqt_mbhc_get_impedance(struct aqt1000_mbhc *aqt_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (!aqt_mbhc) { - pr_err("%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - if (!zl || !zr) { - pr_err("%s: zl or zr null!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_get_impedance(&aqt_mbhc->wcd_mbhc, zl, zr); -} -EXPORT_SYMBOL(aqt_mbhc_get_impedance); - -/* - * aqt_mbhc_hs_detect: starts mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - * @mbhc_cfg: handle to mbhc configuration structure - * return 0 if mbhc_start is success or error code in case of failure - */ -int aqt_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - struct aqt1000 *aqt; - struct aqt1000_mbhc *aqt_mbhc; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - aqt = snd_soc_codec_get_drvdata(codec); - if (!aqt) { - pr_err("%s: aqt is NULL\n", __func__); - return -EINVAL; - } - - aqt_mbhc = aqt->mbhc; - if (!aqt_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_start(&aqt_mbhc->wcd_mbhc, mbhc_cfg); -} -EXPORT_SYMBOL(aqt_mbhc_hs_detect); - -/* - * aqt_mbhc_hs_detect_exit: stop mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - */ -void aqt_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ - struct aqt1000 *aqt; - struct aqt1000_mbhc *aqt_mbhc; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - aqt = snd_soc_codec_get_drvdata(codec); - if (!aqt) { - pr_err("%s: aqt is NULL\n", __func__); - return; - } - - aqt_mbhc = aqt->mbhc; - if (!aqt_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return; - } - wcd_mbhc_stop(&aqt_mbhc->wcd_mbhc); -} -EXPORT_SYMBOL(aqt_mbhc_hs_detect_exit); - -/* - * aqt_mbhc_post_ssr_init: initialize mbhc for aqt post subsystem restart - * @mbhc: poniter to aqt_mbhc structure - * @codec: handle to snd_soc_codec * - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int aqt_mbhc_post_ssr_init(struct aqt1000_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - int ret; - struct wcd_mbhc *wcd_mbhc; - - if (!mbhc || !codec) - return -EINVAL; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - return -EINVAL; - } - - wcd_mbhc_deinit(wcd_mbhc); - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, AQT_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(aqt_mbhc_post_ssr_init); - -/* - * aqt_mbhc_init: initialize mbhc for aqt - * @mbhc: poniter to aqt_mbhc struct pointer to store the configs - * @codec: handle to snd_soc_codec * - * @fw_data: handle to firmware data - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int aqt_mbhc_init(struct aqt1000_mbhc **mbhc, struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - struct aqt1000_mbhc *aqt_mbhc; - struct wcd_mbhc *wcd_mbhc; - int ret; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - aqt_mbhc = devm_kzalloc(codec->dev, sizeof(struct aqt1000_mbhc), - GFP_KERNEL); - if (!aqt_mbhc) - return -ENOMEM; - - aqt_mbhc->aqt = dev_get_drvdata(codec->dev); - aqt_mbhc->fw_data = fw_data; - BLOCKING_INIT_NOTIFIER_HEAD(&aqt_mbhc->notifier); - wcd_mbhc = &aqt_mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - - /* Setting default mbhc detection logic to ADC */ - wcd_mbhc->mbhc_detection_logic = WCD_DETECTION_ADC; - - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, - &intr_ids, wcd_mbhc_registers, - AQT_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto err; - } - - (*mbhc) = aqt_mbhc; - snd_soc_add_codec_controls(codec, impedance_detect_controls, - ARRAY_SIZE(impedance_detect_controls)); - snd_soc_add_codec_controls(codec, hph_type_detect_controls, - ARRAY_SIZE(hph_type_detect_controls)); - - return 0; -err: - devm_kfree(codec->dev, aqt_mbhc); - return ret; -} -EXPORT_SYMBOL(aqt_mbhc_init); - -/* - * aqt_mbhc_deinit: deinitialize mbhc for aqt - * @codec: handle to snd_soc_codec * - */ -void aqt_mbhc_deinit(struct snd_soc_codec *codec) -{ - struct aqt1000 *aqt; - struct aqt1000_mbhc *aqt_mbhc; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - aqt = snd_soc_codec_get_drvdata(codec); - if (!aqt) { - pr_err("%s: aqt is NULL\n", __func__); - return; - } - - aqt_mbhc = aqt->mbhc; - if (aqt_mbhc) { - wcd_mbhc_deinit(&aqt_mbhc->wcd_mbhc); - devm_kfree(codec->dev, aqt_mbhc); - } -} -EXPORT_SYMBOL(aqt_mbhc_deinit); diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.h deleted file mode 100644 index bdf0f5a69cf8..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-mbhc.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __AQT1000_MBHC_H__ -#define __AQT1000_MBHC_H__ -#include "../wcd-mbhc-v2.h" - -struct aqt1000_mbhc { - struct wcd_mbhc wcd_mbhc; - struct blocking_notifier_head notifier; - struct aqt1000 *aqt; - struct fw_info *fw_data; - bool mbhc_started; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_AQT1000) -extern int aqt_mbhc_init(struct aqt1000_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data); -extern void aqt_mbhc_hs_detect_exit(struct snd_soc_codec *codec); -extern int aqt_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg); -extern void aqt_mbhc_deinit(struct snd_soc_codec *codec); -extern int aqt_mbhc_post_ssr_init(struct aqt1000_mbhc *mbhc, - struct snd_soc_codec *codec); -extern int aqt_mbhc_get_impedance(struct aqt1000_mbhc *aqt_mbhc, - uint32_t *zl, uint32_t *zr); -#else -static inline int aqt_mbhc_init(struct aqt1000_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - return 0; -} -static inline void aqt_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ -} -static inline int aqt_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline void aqt_mbhc_deinit(struct snd_soc_codec *codec) -{ -} -static inline int aqt_mbhc_post_ssr_init(struct aqt1000_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - return 0; -} - -static inline int aqt_mbhc_get_impedance(struct aqt1000_mbhc *aqt_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (zl) - *zl = 0; - if (zr) - *zr = 0; - return -EINVAL; -} -#endif - -#endif /* __AQT1000_MBHC_H__ */ diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-reg-defaults.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-reg-defaults.h deleted file mode 100644 index 5a5da25fa725..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-reg-defaults.h +++ /dev/null @@ -1,1616 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _AQT1000_REG_DEFAULTS_H -#define _AQT1000_REG_DEFAULTS_H - -#include -#include "aqt1000-registers.h" - -#define AQT1000_REG(reg) ((reg) & 0xFF) -#define AQT1000_PAGE_SIZE 256 - -enum { - AQT1000_PAGE_0 = 0, - AQT1000_PAGE_1, - AQT1000_PAGE_2, - AQT1000_PAGE_5 = 5, - AQT1000_PAGE_6, - AQT1000_PAGE_7, - AQT1000_PAGE_10 = 0xA, - AQT1000_PAGE_11, - AQT1000_PAGE_12, - AQT1000_PAGE_13, - AQT1000_PAGE_15 = 0xF, - AQT1000_PAGE_128, - AQT1000_PAGE_MAX, -}; - -enum { - AQT1000_WO = 0, - AQT1000_RO, - AQT1000_RW, -}; - -static const struct reg_default aqt1000_defaults[] = { - {AQT1000_CHIP_CFG1_PWR_MEM_SD, 0x07}, - {AQT1000_CHIP_CFG1_PWR_SYS_MEM_SD_RAM, 0x00}, - {AQT1000_CHIP_CFG1_PWR_SYS_MEM_SD_ROM, 0x00}, - {AQT1000_CHIP_CFG1_PWR_SYS_MEM_FORCE_DS_RAM, 0x00}, - {AQT1000_CHIP_CFG1_PWR_SYS_MEM_FORCE_DS_ROM, 0x00}, - {AQT1000_CHIP_CFG1_CLK_CFG_FLL, 0x20}, - {AQT1000_CHIP_CFG1_CLK_CFG_SPI_M, 0x01}, - {AQT1000_CHIP_CFG1_CLK_CFG_I2C_M, 0x01}, - {AQT1000_CHIP_CFG1_CLK_CFG_UART, 0x01}, - {AQT1000_CHIP_CFG1_RST_USB_SS, 0x0E}, - {AQT1000_CHIP_CFG1_RST_BLSP, 0x0F}, - {AQT1000_CHIP_CFG1_RST_BUS_MTRX, 0x00}, - {AQT1000_CHIP_CFG1_RST_MISC, 0x00}, - {AQT1000_CHIP_CFG1_ANA_WAIT_STATE_CTL, 0xCC}, - {AQT1000_PAGE1_PAGE_REGISTER, 0x00}, - {AQT1000_FLL_USER_CTL_0, 0x71}, - {AQT1000_FLL_USER_CTL_1, 0x34}, - {AQT1000_FLL_USER_CTL_2, 0x0B}, - {AQT1000_FLL_USER_CTL_3, 0x02}, - {AQT1000_FLL_USER_CTL_4, 0x04}, - {AQT1000_FLL_USER_CTL_5, 0x02}, - {AQT1000_FLL_USER_CTL_6, 0x6E}, - {AQT1000_FLL_USER_CTL_7, 0x00}, - {AQT1000_FLL_USER_CTL_8, 0x94}, - {AQT1000_FLL_USER_CTL_9, 0x70}, - {AQT1000_FLL_L_VAL_CTL_0, 0x34}, - {AQT1000_FLL_L_VAL_CTL_1, 0x00}, - {AQT1000_FLL_DSM_FRAC_CTL_0, 0x00}, - {AQT1000_FLL_DSM_FRAC_CTL_1, 0xFF}, - {AQT1000_FLL_CONFIG_CTL_0, 0x6B}, - {AQT1000_FLL_CONFIG_CTL_1, 0x05}, - {AQT1000_FLL_CONFIG_CTL_2, 0x08}, - {AQT1000_FLL_CONFIG_CTL_3, 0x00}, - {AQT1000_FLL_CONFIG_CTL_4, 0x10}, - {AQT1000_FLL_TEST_CTL_0, 0x80}, - {AQT1000_FLL_TEST_CTL_1, 0x00}, - {AQT1000_FLL_TEST_CTL_2, 0x00}, - {AQT1000_FLL_TEST_CTL_3, 0x00}, - {AQT1000_FLL_TEST_CTL_4, 0x00}, - {AQT1000_FLL_TEST_CTL_5, 0x00}, - {AQT1000_FLL_TEST_CTL_6, 0x04}, - {AQT1000_FLL_TEST_CTL_7, 0x33}, - {AQT1000_FLL_FREQ_CTL_0, 0x00}, - {AQT1000_FLL_FREQ_CTL_1, 0x00}, - {AQT1000_FLL_FREQ_CTL_2, 0x00}, - {AQT1000_FLL_FREQ_CTL_3, 0x00}, - {AQT1000_FLL_SSC_CTL_0, 0x00}, - {AQT1000_FLL_SSC_CTL_1, 0x00}, - {AQT1000_FLL_SSC_CTL_2, 0x00}, - {AQT1000_FLL_SSC_CTL_3, 0x00}, - {AQT1000_FLL_FLL_MODE, 0xA0}, - {AQT1000_FLL_STATUS_0, 0x00}, - {AQT1000_FLL_STATUS_1, 0x00}, - {AQT1000_FLL_STATUS_2, 0x00}, - {AQT1000_FLL_STATUS_3, 0x00}, - {AQT1000_PAGE2_PAGE_REGISTER, 0x00}, - {AQT1000_I2S_I2S_0_TX_CFG, 0x00}, - {AQT1000_I2S_I2S_0_RX_CFG, 0x00}, - {AQT1000_I2S_I2S_0_CTL, 0x0C}, - {AQT1000_I2S_I2S_CLKSRC_CTL, 0x01}, - {AQT1000_I2S_I2S_HS_CLK_CTL, 0x00}, - {AQT1000_I2S_I2S_0_RST, 0x00}, - {AQT1000_I2S_SHADOW_I2S_0_CTL, 0x00}, - {AQT1000_I2S_SHADOW_I2S_0_RX_CFG, 0x09}, - {AQT1000_PAGE5_PAGE_REGISTER, 0x00}, - {AQT1000_INTR_CTRL_MCU_INT_POLARITY, 0x00}, - {AQT1000_INTR_CTRL_INT_MASK_0, 0xFE}, - {AQT1000_INTR_CTRL_INT_MASK_1, 0xFF}, - {AQT1000_INTR_CTRL_INT_MASK_2, 0xFF}, - {AQT1000_INTR_CTRL_INT_MASK_3, 0xEF}, - {AQT1000_INTR_CTRL_INT_MASK_4, 0x3B}, - {AQT1000_INTR_CTRL_INT_MASK_5, 0xFF}, - {AQT1000_INTR_CTRL_INT_MASK_6, 0x3F}, - {AQT1000_INTR_CTRL_INT_STATUS_0, 0x00}, - {AQT1000_INTR_CTRL_INT_STATUS_1, 0x00}, - {AQT1000_INTR_CTRL_INT_STATUS_2, 0x00}, - {AQT1000_INTR_CTRL_INT_STATUS_3, 0x00}, - {AQT1000_INTR_CTRL_INT_STATUS_4, 0x00}, - {AQT1000_INTR_CTRL_INT_STATUS_5, 0x00}, - {AQT1000_INTR_CTRL_INT_STATUS_6, 0x00}, - {AQT1000_INTR_CTRL_INT_CLEAR_0, 0x00}, - {AQT1000_INTR_CTRL_INT_CLEAR_1, 0x00}, - {AQT1000_INTR_CTRL_INT_CLEAR_2, 0x00}, - {AQT1000_INTR_CTRL_INT_CLEAR_3, 0x00}, - {AQT1000_INTR_CTRL_INT_CLEAR_4, 0x00}, - {AQT1000_INTR_CTRL_INT_CLEAR_5, 0x00}, - {AQT1000_INTR_CTRL_INT_CLEAR_6, 0x00}, - {AQT1000_INTR_CTRL_INT_TYPE_0, 0xEF}, - {AQT1000_INTR_CTRL_INT_TYPE_1, 0x03}, - {AQT1000_INTR_CTRL_INT_TYPE_2, 0x00}, - {AQT1000_INTR_CTRL_INT_TYPE_3, 0x20}, - {AQT1000_INTR_CTRL_INT_TYPE_4, 0x44}, - {AQT1000_INTR_CTRL_INT_TYPE_5, 0x00}, - {AQT1000_INTR_CTRL_INT_TYPE_6, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_EN_0, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_EN_1, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_EN_2, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_EN_3, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_EN_4, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_EN_5, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_EN_6, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_VAL_0, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_VAL_1, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_VAL_2, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_VAL_3, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_VAL_4, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_VAL_5, 0x00}, - {AQT1000_INTR_CTRL_INT_TEST_VAL_6, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_0, 0x02}, - {AQT1000_INTR_CTRL_INT_DEST_1, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_2, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_3, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_4, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_5, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_6, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_7, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_8, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_9, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_10, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_11, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_12, 0x00}, - {AQT1000_INTR_CTRL_INT_DEST_13, 0x00}, - {AQT1000_INTR_CTRL_CLR_COMMIT, 0x00}, - {AQT1000_ANA_PAGE_REGISTER, 0x00}, - {AQT1000_ANA_BIAS, 0x00}, - {AQT1000_ANA_RX_SUPPLIES, 0x00}, - {AQT1000_ANA_HPH, 0x0C}, - {AQT1000_ANA_AMIC1, 0x20}, - {AQT1000_ANA_AMIC2, 0x00}, - {AQT1000_ANA_AMIC3, 0x20}, - {AQT1000_ANA_AMIC3_HPF, 0x00}, - {AQT1000_ANA_MBHC_MECH, 0x39}, - {AQT1000_ANA_MBHC_ELECT, 0x08}, - {AQT1000_ANA_MBHC_ZDET, 0x00}, - {AQT1000_ANA_MBHC_RESULT_1, 0x00}, - {AQT1000_ANA_MBHC_RESULT_2, 0x00}, - {AQT1000_ANA_MBHC_RESULT_3, 0x00}, - {AQT1000_ANA_MBHC_BTN0, 0x00}, - {AQT1000_ANA_MBHC_BTN1, 0x10}, - {AQT1000_ANA_MBHC_BTN2, 0x20}, - {AQT1000_ANA_MBHC_BTN3, 0x30}, - {AQT1000_ANA_MBHC_BTN4, 0x40}, - {AQT1000_ANA_MBHC_BTN5, 0x50}, - {AQT1000_ANA_MBHC_BTN6, 0x60}, - {AQT1000_ANA_MBHC_BTN7, 0x70}, - {AQT1000_ANA_MICB1, 0x10}, - {AQT1000_ANA_MICB1_RAMP, 0x00}, - {AQT1000_BIAS_CTL, 0x28}, - {AQT1000_BIAS_CCOMP_FINE_ADJ, 0x75}, - {AQT1000_LED_LED_MODE_SEL_R, 0x00}, - {AQT1000_LED_LED_MISC_R, 0x00}, - {AQT1000_LED_LED_MODE_SEL_G, 0x00}, - {AQT1000_LED_LED_MISC_G, 0x00}, - {AQT1000_LED_LED_MODE_SEL_B, 0x00}, - {AQT1000_LED_LED_MISC_B, 0x00}, - {AQT1000_LDOH_MODE, 0x1D}, - {AQT1000_LDOH_BIAS, 0x00}, - {AQT1000_LDOH_STB_LOADS, 0x00}, - {AQT1000_LDOH_MISC1, 0x00}, - {AQT1000_LDOL_VDDCX_ADJUST, 0x01}, - {AQT1000_LDOL_DISABLE_LDOL, 0x00}, - {AQT1000_BUCK_5V_EN_CTL, 0x03}, - {AQT1000_BUCK_5V_VOUT_SEL, 0x03}, - {AQT1000_BUCK_5V_CTRL_VCL_1, 0x03}, - {AQT1000_BUCK_5V_CTRL_VCL_2, 0x21}, - {AQT1000_BUCK_5V_CTRL_CCL_2, 0x20}, - {AQT1000_BUCK_5V_CTRL_CCL_1, 0xA1}, - {AQT1000_BUCK_5V_CTRL_CCL_3, 0x02}, - {AQT1000_BUCK_5V_CTRL_CCL_4, 0x05}, - {AQT1000_BUCK_5V_CTRL_CCL_5, 0x00}, - {AQT1000_BUCK_5V_IBIAS_CTL_1, 0x37}, - {AQT1000_BUCK_5V_IBIAS_CTL_2, 0x00}, - {AQT1000_BUCK_5V_IBIAS_CTL_3, 0x33}, - {AQT1000_BUCK_5V_IBIAS_CTL_4, 0x33}, - {AQT1000_BUCK_5V_IBIAS_CTL_5, 0x00}, - {AQT1000_BUCK_5V_ATEST_DTEST_CTL, 0x00}, - {AQT1000_PON_BG_CTRL, 0x80}, - {AQT1000_PON_TEST_CTRL, 0x00}, - {AQT1000_MBHC_CTL_CLK, 0x30}, - {AQT1000_MBHC_CTL_ANA, 0x00}, - {AQT1000_MBHC_CTL_SPARE_1, 0x00}, - {AQT1000_MBHC_CTL_SPARE_2, 0x00}, - {AQT1000_MBHC_CTL_BCS, 0x00}, - {AQT1000_MBHC_MOISTURE_DET_FSM_STATUS, 0x00}, - {AQT1000_MBHC_TEST_CTL, 0x00}, - {AQT1000_MICB1_TEST_CTL_1, 0x1A}, - {AQT1000_MICB1_TEST_CTL_2, 0x18}, - {AQT1000_MICB1_TEST_CTL_3, 0xA4}, - {AQT1000_MICB1_MISC_MICB1_INM_RES_BIAS, 0x00}, - {AQT1000_MICB1_MISC_MICB_MISC1, 0x00}, - {AQT1000_MICB1_MISC_MICB_MISC2, 0x00}, - {AQT1000_TX_COM_ADC_VCM, 0x39}, - {AQT1000_TX_COM_BIAS_ATEST, 0xC0}, - {AQT1000_TX_COM_ADC_INT1_IB, 0x6F}, - {AQT1000_TX_COM_ADC_INT2_IB, 0x4F}, - {AQT1000_TX_COM_TXFE_DIV_CTL, 0x2E}, - {AQT1000_TX_COM_TXFE_DIV_START, 0x00}, - {AQT1000_TX_COM_TXFE_DIV_STOP_9P6M, 0xC7}, - {AQT1000_TX_COM_TXFE_DIV_STOP_12P288M, 0xFF}, - {AQT1000_TX_1_2_TEST_EN, 0xCC}, - {AQT1000_TX_1_2_ADC_IB, 0x09}, - {AQT1000_TX_1_2_ATEST_REFCTL, 0x0A}, - {AQT1000_TX_1_2_TEST_CTL, 0x38}, - {AQT1000_TX_1_2_TEST_BLK_EN, 0xFF}, - {AQT1000_TX_1_2_TXFE_CLKDIV, 0x00}, - {AQT1000_TX_1_2_SAR1_ERR, 0x00}, - {AQT1000_TX_1_2_SAR2_ERR, 0x00}, - {AQT1000_TX_3_TEST_EN, 0xC0}, - {AQT1000_TX_3_ADC_IB, 0x09}, - {AQT1000_TX_3_ATEST_REFCTL, 0x0A}, - {AQT1000_TX_3_TEST_CTL, 0x38}, - {AQT1000_TX_3_TEST_BLK_EN, 0xFE}, - {AQT1000_TX_3_TXFE_CLKDIV, 0x00}, - {AQT1000_TX_3_SAR1_ERR, 0x00}, - {AQT1000_TX_3_SAR2_ERR, 0x00}, - {AQT1000_TX_ATEST1_2_SEL, 0x60}, - {AQT1000_CLASSH_MODE_1, 0x40}, - {AQT1000_CLASSH_MODE_2, 0x3A}, - {AQT1000_CLASSH_MODE_3, 0x00}, - {AQT1000_CLASSH_CTRL_VCL_1, 0x70}, - {AQT1000_CLASSH_CTRL_VCL_2, 0x82}, - {AQT1000_CLASSH_CTRL_CCL_1, 0x31}, - {AQT1000_CLASSH_CTRL_CCL_2, 0x80}, - {AQT1000_CLASSH_CTRL_CCL_3, 0x80}, - {AQT1000_CLASSH_CTRL_CCL_4, 0x51}, - {AQT1000_CLASSH_CTRL_CCL_5, 0x00}, - {AQT1000_CLASSH_BUCK_TMUX_A_D, 0x00}, - {AQT1000_CLASSH_BUCK_SW_DRV_CNTL, 0x77}, - {AQT1000_CLASSH_SPARE, 0x00}, - {AQT1000_FLYBACK_EN, 0x4E}, - {AQT1000_FLYBACK_VNEG_CTRL_1, 0x0B}, - {AQT1000_FLYBACK_VNEG_CTRL_2, 0x45}, - {AQT1000_FLYBACK_VNEG_CTRL_3, 0x74}, - {AQT1000_FLYBACK_VNEG_CTRL_4, 0x7F}, - {AQT1000_FLYBACK_VNEG_CTRL_5, 0x83}, - {AQT1000_FLYBACK_VNEG_CTRL_6, 0x98}, - {AQT1000_FLYBACK_VNEG_CTRL_7, 0xA9}, - {AQT1000_FLYBACK_VNEG_CTRL_8, 0x68}, - {AQT1000_FLYBACK_VNEG_CTRL_9, 0x64}, - {AQT1000_FLYBACK_VNEGDAC_CTRL_1, 0xED}, - {AQT1000_FLYBACK_VNEGDAC_CTRL_2, 0xF0}, - {AQT1000_FLYBACK_VNEGDAC_CTRL_3, 0xA6}, - {AQT1000_FLYBACK_CTRL_1, 0x65}, - {AQT1000_FLYBACK_TEST_CTL, 0x00}, - {AQT1000_RX_AUX_SW_CTL, 0x00}, - {AQT1000_RX_PA_AUX_IN_CONN, 0x00}, - {AQT1000_RX_TIMER_DIV, 0x32}, - {AQT1000_RX_OCP_CTL, 0x1F}, - {AQT1000_RX_OCP_COUNT, 0x77}, - {AQT1000_RX_BIAS_ATEST, 0x00}, - {AQT1000_RX_BIAS_MISC1, 0xAA}, - {AQT1000_RX_BIAS_HPH_LDO, 0xA9}, - {AQT1000_RX_BIAS_HPH_PA, 0xAA}, - {AQT1000_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A}, - {AQT1000_RX_BIAS_HPH_RDAC_LDO, 0x88}, - {AQT1000_RX_BIAS_HPH_CNP1, 0x82}, - {AQT1000_RX_BIAS_HPH_LOWPOWER, 0x82}, - {AQT1000_RX_BIAS_MISC2, 0x80}, - {AQT1000_RX_BIAS_MISC3, 0x88}, - {AQT1000_RX_BIAS_MISC4, 0x88}, - {AQT1000_RX_BIAS_MISC5, 0xA8}, - {AQT1000_RX_BIAS_BUCK_RST, 0x08}, - {AQT1000_RX_BIAS_BUCK_VREF_ERRAMP, 0x44}, - {AQT1000_RX_BIAS_FLYB_ERRAMP, 0x40}, - {AQT1000_RX_BIAS_FLYB_BUFF, 0xAA}, - {AQT1000_RX_BIAS_FLYB_MID_RST, 0x14}, - {AQT1000_HPH_L_STATUS, 0x04}, - {AQT1000_HPH_R_STATUS, 0x04}, - {AQT1000_HPH_CNP_EN, 0x80}, - {AQT1000_HPH_CNP_WG_CTL, 0x9A}, - {AQT1000_HPH_CNP_WG_TIME, 0x14}, - {AQT1000_HPH_OCP_CTL, 0x28}, - {AQT1000_HPH_AUTO_CHOP, 0x16}, - {AQT1000_HPH_CHOP_CTL, 0x83}, - {AQT1000_HPH_PA_CTL1, 0x46}, - {AQT1000_HPH_PA_CTL2, 0x50}, - {AQT1000_HPH_L_EN, 0x80}, - {AQT1000_HPH_L_TEST, 0xE0}, - {AQT1000_HPH_L_ATEST, 0x50}, - {AQT1000_HPH_R_EN, 0x80}, - {AQT1000_HPH_R_TEST, 0xE0}, - {AQT1000_HPH_R_ATEST, 0x54}, - {AQT1000_HPH_RDAC_CLK_CTL1, 0x99}, - {AQT1000_HPH_RDAC_CLK_CTL2, 0x9B}, - {AQT1000_HPH_RDAC_LDO_CTL, 0x33}, - {AQT1000_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00}, - {AQT1000_HPH_REFBUFF_UHQA_CTL, 0xA8}, - {AQT1000_HPH_REFBUFF_LP_CTL, 0x0E}, - {AQT1000_HPH_L_DAC_CTL, 0x00}, - {AQT1000_HPH_R_DAC_CTL, 0x00}, - {AQT1000_HPHLR_SURGE_COMP_SEL, 0x55}, - {AQT1000_HPHLR_SURGE_EN, 0x1D}, - {AQT1000_HPHLR_SURGE_MISC1, 0xA0}, - {AQT1000_HPHLR_SURGE_STATUS, 0x00}, - {AQT1000_ANA_NEW_PAGE_REGISTER, 0x00}, - {AQT1000_HPH_NEW_ANA_HPH2, 0x00}, - {AQT1000_HPH_NEW_ANA_HPH3, 0x00}, - {AQT1000_CLK_SYS_MCLK1_PRG, 0x09}, - {AQT1000_CLK_SYS_MCLK2_I2S_HS_CLK_PRG, 0x20}, - {AQT1000_CLK_SYS_XO_CAP_XTP, 0x3F}, - {AQT1000_CLK_SYS_XO_CAP_XTM, 0x3F}, - {AQT1000_CLK_SYS_PLL_ENABLES, 0x00}, - {AQT1000_CLK_SYS_PLL_PRESET, 0x00}, - {AQT1000_CLK_SYS_PLL_STATUS, 0x00}, - {AQT1000_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00}, - {AQT1000_MBHC_NEW_CTL_1, 0x02}, - {AQT1000_MBHC_NEW_CTL_2, 0x05}, - {AQT1000_MBHC_NEW_PLUG_DETECT_CTL, 0x29}, - {AQT1000_MBHC_NEW_ZDET_ANA_CTL, 0x0F}, - {AQT1000_MBHC_NEW_ZDET_RAMP_CTL, 0x00}, - {AQT1000_MBHC_NEW_FSM_STATUS, 0x00}, - {AQT1000_MBHC_NEW_ADC_RESULT, 0x00}, - {AQT1000_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40}, - {AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81}, - {AQT1000_HPH_NEW_INT_RDAC_VREF_CTL, 0x10}, - {AQT1000_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00}, - {AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81}, - {AQT1000_HPH_NEW_INT_PA_MISC1, 0x22}, - {AQT1000_HPH_NEW_INT_PA_MISC2, 0x00}, - {AQT1000_HPH_NEW_INT_PA_RDAC_MISC, 0x00}, - {AQT1000_HPH_NEW_INT_HPH_TIMER1, 0xFE}, - {AQT1000_HPH_NEW_INT_HPH_TIMER2, 0x02}, - {AQT1000_HPH_NEW_INT_HPH_TIMER3, 0x4E}, - {AQT1000_HPH_NEW_INT_HPH_TIMER4, 0x54}, - {AQT1000_HPH_NEW_INT_PA_RDAC_MISC2, 0x80}, - {AQT1000_HPH_NEW_INT_PA_RDAC_MISC3, 0x00}, - {AQT1000_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62}, - {AQT1000_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01}, - {AQT1000_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11}, - {AQT1000_CLK_SYS_INT_CLK_TEST1, 0x00}, - {AQT1000_CLK_SYS_INT_XO_TEST1, 0x98}, - {AQT1000_CLK_SYS_INT_XO_TEST2, 0x00}, - {AQT1000_CLK_SYS_INT_POST_DIV_REG0, 0x00}, - {AQT1000_CLK_SYS_INT_POST_DIV_REG1, 0x00}, - {AQT1000_CLK_SYS_INT_REF_DIV_REG0, 0x00}, - {AQT1000_CLK_SYS_INT_REF_DIV_REG1, 0x00}, - {AQT1000_CLK_SYS_INT_FILTER_REG0, 0x00}, - {AQT1000_CLK_SYS_INT_FILTER_REG1, 0x00}, - {AQT1000_CLK_SYS_INT_PLL_L_VAL, 0x00}, - {AQT1000_CLK_SYS_INT_PLL_M_VAL, 0x00}, - {AQT1000_CLK_SYS_INT_PLL_N_VAL, 0x00}, - {AQT1000_CLK_SYS_INT_TEST_REG0, 0x00}, - {AQT1000_CLK_SYS_INT_PFD_CP_DSM_PROG, 0x00}, - {AQT1000_CLK_SYS_INT_VCO_PROG, 0x00}, - {AQT1000_CLK_SYS_INT_TEST_REG1, 0x00}, - {AQT1000_CLK_SYS_INT_LDO_LOCK_CFG, 0x00}, - {AQT1000_CLK_SYS_INT_DIG_LOCK_DET_CFG, 0x00}, - {AQT1000_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57}, - {AQT1000_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01}, - {AQT1000_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00}, - {AQT1000_MBHC_NEW_INT_SPARE_2, 0x00}, - {AQT1000_PAGE10_PAGE_REGISTER, 0x00}, - {AQT1000_CDC_ANC0_CLK_RESET_CTL, 0x00}, - {AQT1000_CDC_ANC0_MODE_1_CTL, 0x00}, - {AQT1000_CDC_ANC0_MODE_2_CTL, 0x00}, - {AQT1000_CDC_ANC0_FF_SHIFT, 0x00}, - {AQT1000_CDC_ANC0_FB_SHIFT, 0x00}, - {AQT1000_CDC_ANC0_LPF_FF_A_CTL, 0x00}, - {AQT1000_CDC_ANC0_LPF_FF_B_CTL, 0x00}, - {AQT1000_CDC_ANC0_LPF_FB_CTL, 0x00}, - {AQT1000_CDC_ANC0_SMLPF_CTL, 0x00}, - {AQT1000_CDC_ANC0_DCFLT_SHIFT_CTL, 0x00}, - {AQT1000_CDC_ANC0_IIR_ADAPT_CTL, 0x00}, - {AQT1000_CDC_ANC0_IIR_COEFF_1_CTL, 0x00}, - {AQT1000_CDC_ANC0_IIR_COEFF_2_CTL, 0x00}, - {AQT1000_CDC_ANC0_FF_A_GAIN_CTL, 0x00}, - {AQT1000_CDC_ANC0_FF_B_GAIN_CTL, 0x00}, - {AQT1000_CDC_ANC0_FB_GAIN_CTL, 0x00}, - {AQT1000_CDC_ANC0_RC_COMMON_CTL, 0x00}, - {AQT1000_CDC_ANC0_FIFO_COMMON_CTL, 0x88}, - {AQT1000_CDC_ANC0_RC0_STATUS_FMIN_CNTR, 0x00}, - {AQT1000_CDC_ANC0_RC1_STATUS_FMIN_CNTR, 0x00}, - {AQT1000_CDC_ANC0_RC0_STATUS_FMAX_CNTR, 0x00}, - {AQT1000_CDC_ANC0_RC1_STATUS_FMAX_CNTR, 0x00}, - {AQT1000_CDC_ANC0_STATUS_FIFO, 0x00}, - {AQT1000_CDC_ANC1_CLK_RESET_CTL, 0x00}, - {AQT1000_CDC_ANC1_MODE_1_CTL, 0x00}, - {AQT1000_CDC_ANC1_MODE_2_CTL, 0x00}, - {AQT1000_CDC_ANC1_FF_SHIFT, 0x00}, - {AQT1000_CDC_ANC1_FB_SHIFT, 0x00}, - {AQT1000_CDC_ANC1_LPF_FF_A_CTL, 0x00}, - {AQT1000_CDC_ANC1_LPF_FF_B_CTL, 0x00}, - {AQT1000_CDC_ANC1_LPF_FB_CTL, 0x00}, - {AQT1000_CDC_ANC1_SMLPF_CTL, 0x00}, - {AQT1000_CDC_ANC1_DCFLT_SHIFT_CTL, 0x00}, - {AQT1000_CDC_ANC1_IIR_ADAPT_CTL, 0x00}, - {AQT1000_CDC_ANC1_IIR_COEFF_1_CTL, 0x00}, - {AQT1000_CDC_ANC1_IIR_COEFF_2_CTL, 0x00}, - {AQT1000_CDC_ANC1_FF_A_GAIN_CTL, 0x00}, - {AQT1000_CDC_ANC1_FF_B_GAIN_CTL, 0x00}, - {AQT1000_CDC_ANC1_FB_GAIN_CTL, 0x00}, - {AQT1000_CDC_ANC1_RC_COMMON_CTL, 0x00}, - {AQT1000_CDC_ANC1_FIFO_COMMON_CTL, 0x88}, - {AQT1000_CDC_ANC1_RC0_STATUS_FMIN_CNTR, 0x00}, - {AQT1000_CDC_ANC1_RC1_STATUS_FMIN_CNTR, 0x00}, - {AQT1000_CDC_ANC1_RC0_STATUS_FMAX_CNTR, 0x00}, - {AQT1000_CDC_ANC1_RC1_STATUS_FMAX_CNTR, 0x00}, - {AQT1000_CDC_ANC1_STATUS_FIFO, 0x00}, - {AQT1000_CDC_TX0_TX_PATH_CTL, 0x04}, - {AQT1000_CDC_TX0_TX_PATH_CFG0, 0x10}, - {AQT1000_CDC_TX0_TX_PATH_CFG1, 0x03}, - {AQT1000_CDC_TX0_TX_VOL_CTL, 0x00}, - {AQT1000_CDC_TX0_TX_PATH_SEC0, 0x00}, - {AQT1000_CDC_TX0_TX_PATH_SEC1, 0x00}, - {AQT1000_CDC_TX0_TX_PATH_SEC2, 0x01}, - {AQT1000_CDC_TX0_TX_PATH_SEC3, 0x3C}, - {AQT1000_CDC_TX0_TX_PATH_SEC4, 0x20}, - {AQT1000_CDC_TX0_TX_PATH_SEC5, 0x00}, - {AQT1000_CDC_TX0_TX_PATH_SEC6, 0x00}, - {AQT1000_CDC_TX1_TX_PATH_CTL, 0x04}, - {AQT1000_CDC_TX1_TX_PATH_CFG0, 0x10}, - {AQT1000_CDC_TX1_TX_PATH_CFG1, 0x03}, - {AQT1000_CDC_TX1_TX_VOL_CTL, 0x00}, - {AQT1000_CDC_TX1_TX_PATH_SEC0, 0x00}, - {AQT1000_CDC_TX1_TX_PATH_SEC1, 0x00}, - {AQT1000_CDC_TX1_TX_PATH_SEC2, 0x01}, - {AQT1000_CDC_TX1_TX_PATH_SEC3, 0x3C}, - {AQT1000_CDC_TX1_TX_PATH_SEC4, 0x20}, - {AQT1000_CDC_TX1_TX_PATH_SEC5, 0x00}, - {AQT1000_CDC_TX1_TX_PATH_SEC6, 0x00}, - {AQT1000_CDC_TX2_TX_PATH_CTL, 0x04}, - {AQT1000_CDC_TX2_TX_PATH_CFG0, 0x10}, - {AQT1000_CDC_TX2_TX_PATH_CFG1, 0x03}, - {AQT1000_CDC_TX2_TX_VOL_CTL, 0x00}, - {AQT1000_CDC_TX2_TX_PATH_SEC0, 0x00}, - {AQT1000_CDC_TX2_TX_PATH_SEC1, 0x00}, - {AQT1000_CDC_TX2_TX_PATH_SEC2, 0x01}, - {AQT1000_CDC_TX2_TX_PATH_SEC3, 0x3C}, - {AQT1000_CDC_TX2_TX_PATH_SEC4, 0x20}, - {AQT1000_CDC_TX2_TX_PATH_SEC5, 0x00}, - {AQT1000_CDC_TX2_TX_PATH_SEC6, 0x00}, - {AQT1000_CDC_TX2_TX_PATH_SEC7, 0x25}, - {AQT1000_PAGE11_PAGE_REGISTER, 0x00}, - {AQT1000_CDC_COMPANDER1_CTL0, 0x60}, - {AQT1000_CDC_COMPANDER1_CTL1, 0xDB}, - {AQT1000_CDC_COMPANDER1_CTL2, 0xFF}, - {AQT1000_CDC_COMPANDER1_CTL3, 0x35}, - {AQT1000_CDC_COMPANDER1_CTL4, 0xFF}, - {AQT1000_CDC_COMPANDER1_CTL5, 0x00}, - {AQT1000_CDC_COMPANDER1_CTL6, 0x01}, - {AQT1000_CDC_COMPANDER1_CTL7, 0x26}, - {AQT1000_CDC_COMPANDER2_CTL0, 0x60}, - {AQT1000_CDC_COMPANDER2_CTL1, 0xDB}, - {AQT1000_CDC_COMPANDER2_CTL2, 0xFF}, - {AQT1000_CDC_COMPANDER2_CTL3, 0x35}, - {AQT1000_CDC_COMPANDER2_CTL4, 0xFF}, - {AQT1000_CDC_COMPANDER2_CTL5, 0x00}, - {AQT1000_CDC_COMPANDER2_CTL6, 0x01}, - {AQT1000_CDC_COMPANDER2_CTL7, 0x26}, - {AQT1000_CDC_RX1_RX_PATH_CTL, 0x04}, - {AQT1000_CDC_RX1_RX_PATH_CFG0, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_CFG1, 0x64}, - {AQT1000_CDC_RX1_RX_PATH_CFG2, 0x8F}, - {AQT1000_CDC_RX1_RX_VOL_CTL, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_MIX_CTL, 0x04}, - {AQT1000_CDC_RX1_RX_PATH_MIX_CFG, 0x7E}, - {AQT1000_CDC_RX1_RX_VOL_MIX_CTL, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_SEC0, 0xFC}, - {AQT1000_CDC_RX1_RX_PATH_SEC1, 0x08}, - {AQT1000_CDC_RX1_RX_PATH_SEC2, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_SEC3, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_SEC4, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_SEC5, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_SEC6, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_SEC7, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_MIX_SEC0, 0x08}, - {AQT1000_CDC_RX1_RX_PATH_MIX_SEC1, 0x00}, - {AQT1000_CDC_RX1_RX_PATH_DSMDEM_CTL, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_CTL, 0x04}, - {AQT1000_CDC_RX2_RX_PATH_CFG0, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_CFG1, 0x64}, - {AQT1000_CDC_RX2_RX_PATH_CFG2, 0x8F}, - {AQT1000_CDC_RX2_RX_VOL_CTL, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_MIX_CTL, 0x04}, - {AQT1000_CDC_RX2_RX_PATH_MIX_CFG, 0x7E}, - {AQT1000_CDC_RX2_RX_VOL_MIX_CTL, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_SEC0, 0xFC}, - {AQT1000_CDC_RX2_RX_PATH_SEC1, 0x08}, - {AQT1000_CDC_RX2_RX_PATH_SEC2, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_SEC3, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_SEC4, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_SEC5, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_SEC6, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_SEC7, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_MIX_SEC0, 0x08}, - {AQT1000_CDC_RX2_RX_PATH_MIX_SEC1, 0x00}, - {AQT1000_CDC_RX2_RX_PATH_DSMDEM_CTL, 0x00}, - {AQT1000_CDC_EQ_IIR0_PATH_CTL, 0x00}, - {AQT1000_CDC_EQ_IIR0_PATH_CFG0, 0x1F}, - {AQT1000_CDC_EQ_IIR0_PATH_CFG1, 0x00}, - {AQT1000_CDC_EQ_IIR0_PATH_CFG2, 0x00}, - {AQT1000_CDC_EQ_IIR0_PATH_CFG3, 0x00}, - {AQT1000_CDC_EQ_IIR0_COEF_CFG0, 0x00}, - {AQT1000_CDC_EQ_IIR0_COEF_CFG1, 0x00}, - {AQT1000_CDC_EQ_IIR1_PATH_CTL, 0x00}, - {AQT1000_CDC_EQ_IIR1_PATH_CFG0, 0x1F}, - {AQT1000_CDC_EQ_IIR1_PATH_CFG1, 0x00}, - {AQT1000_CDC_EQ_IIR1_PATH_CFG2, 0x00}, - {AQT1000_CDC_EQ_IIR1_PATH_CFG3, 0x00}, - {AQT1000_CDC_EQ_IIR1_COEF_CFG0, 0x00}, - {AQT1000_CDC_EQ_IIR1_COEF_CFG1, 0x00}, - {AQT1000_PAGE12_PAGE_REGISTER, 0x00}, - {AQT1000_CDC_CLSH_CRC, 0x00}, - {AQT1000_CDC_CLSH_DLY_CTRL, 0x03}, - {AQT1000_CDC_CLSH_DECAY_CTRL, 0x02}, - {AQT1000_CDC_CLSH_HPH_V_PA, 0x1C}, - {AQT1000_CDC_CLSH_EAR_V_PA, 0x39}, - {AQT1000_CDC_CLSH_HPH_V_HD, 0x0C}, - {AQT1000_CDC_CLSH_EAR_V_HD, 0x0C}, - {AQT1000_CDC_CLSH_K1_MSB, 0x01}, - {AQT1000_CDC_CLSH_K1_LSB, 0x00}, - {AQT1000_CDC_CLSH_K2_MSB, 0x00}, - {AQT1000_CDC_CLSH_K2_LSB, 0x80}, - {AQT1000_CDC_CLSH_IDLE_CTRL, 0x00}, - {AQT1000_CDC_CLSH_IDLE_HPH, 0x00}, - {AQT1000_CDC_CLSH_IDLE_EAR, 0x00}, - {AQT1000_CDC_CLSH_TEST0, 0x07}, - {AQT1000_CDC_CLSH_TEST1, 0x00}, - {AQT1000_CDC_CLSH_OVR_VREF, 0x00}, - {AQT1000_MIXING_ASRC0_CLK_RST_CTL, 0x00}, - {AQT1000_MIXING_ASRC0_CTL0, 0x00}, - {AQT1000_MIXING_ASRC0_CTL1, 0x00}, - {AQT1000_MIXING_ASRC0_FIFO_CTL, 0xA8}, - {AQT1000_MIXING_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, - {AQT1000_MIXING_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, - {AQT1000_MIXING_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, - {AQT1000_MIXING_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, - {AQT1000_MIXING_ASRC0_STATUS_FIFO, 0x00}, - {AQT1000_MIXING_ASRC1_CLK_RST_CTL, 0x00}, - {AQT1000_MIXING_ASRC1_CTL0, 0x00}, - {AQT1000_MIXING_ASRC1_CTL1, 0x00}, - {AQT1000_MIXING_ASRC1_FIFO_CTL, 0xA8}, - {AQT1000_MIXING_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, - {AQT1000_MIXING_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, - {AQT1000_MIXING_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, - {AQT1000_MIXING_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, - {AQT1000_MIXING_ASRC1_STATUS_FIFO, 0x00}, - {AQT1000_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04}, - {AQT1000_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00}, - {AQT1000_SIDETONE_ASRC0_CLK_RST_CTL, 0x00}, - {AQT1000_SIDETONE_ASRC0_CTL0, 0x00}, - {AQT1000_SIDETONE_ASRC0_CTL1, 0x00}, - {AQT1000_SIDETONE_ASRC0_FIFO_CTL, 0xA8}, - {AQT1000_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, - {AQT1000_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, - {AQT1000_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, - {AQT1000_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, - {AQT1000_SIDETONE_ASRC0_STATUS_FIFO, 0x00}, - {AQT1000_EC_REF_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, - {AQT1000_EC_REF_HQ0_EC_REF_HQ_CFG0, 0x01}, - {AQT1000_EC_REF_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, - {AQT1000_EC_REF_HQ1_EC_REF_HQ_CFG0, 0x01}, - {AQT1000_EC_ASRC0_CLK_RST_CTL, 0x00}, - {AQT1000_EC_ASRC0_CTL0, 0x00}, - {AQT1000_EC_ASRC0_CTL1, 0x00}, - {AQT1000_EC_ASRC0_FIFO_CTL, 0xA8}, - {AQT1000_EC_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, - {AQT1000_EC_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, - {AQT1000_EC_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, - {AQT1000_EC_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, - {AQT1000_EC_ASRC0_STATUS_FIFO, 0x00}, - {AQT1000_EC_ASRC1_CLK_RST_CTL, 0x00}, - {AQT1000_EC_ASRC1_CTL0, 0x00}, - {AQT1000_EC_ASRC1_CTL1, 0x00}, - {AQT1000_EC_ASRC1_FIFO_CTL, 0xA8}, - {AQT1000_EC_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, - {AQT1000_EC_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, - {AQT1000_EC_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, - {AQT1000_EC_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, - {AQT1000_EC_ASRC1_STATUS_FIFO, 0x00}, - {AQT1000_PAGE13_PAGE_REGISTER, 0x00}, - {AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG1, 0x00}, - {AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG1, 0x00}, - {AQT1000_CDC_RX_INP_MUX_EQ_IIR_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_DSD_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_RX_MIX_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_ANC_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 0x00}, - {AQT1000_CDC_RX_INP_MUX_EC_REF_HQ_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX10_CFG1, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX11_CFG1, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX12_CFG1, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 0x00}, - {AQT1000_CDC_TX_INP_MUX_ADC_MUX13_CFG1, 0x00}, - {AQT1000_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00}, - {AQT1000_CDC_IF_ROUTER_TX_MUX_CFG0, 0x00}, - {AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, - {AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, - {AQT1000_CDC_CLK_RST_CTRL_DSD_CONTROL, 0x00}, - {AQT1000_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL, 0x0F}, - {AQT1000_CDC_CLK_RST_CTRL_GFM_CONTROL, 0x00}, - {AQT1000_CDC_CLK_RST_CTRL_I2S_CONTROL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_PATH_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_CTL, 0x40}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00}, - {AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00}, - {AQT1000_CDC_TOP_TOP_CFG0, 0x00}, - {AQT1000_CDC_TOP_HPHL_COMP_WR_LSB, 0x00}, - {AQT1000_CDC_TOP_HPHL_COMP_WR_MSB, 0x00}, - {AQT1000_CDC_TOP_HPHL_COMP_LUT, 0x00}, - {AQT1000_CDC_TOP_HPHL_COMP_RD_LSB, 0x00}, - {AQT1000_CDC_TOP_HPHL_COMP_RD_MSB, 0x00}, - {AQT1000_CDC_TOP_HPHR_COMP_WR_LSB, 0x00}, - {AQT1000_CDC_TOP_HPHR_COMP_WR_MSB, 0x00}, - {AQT1000_CDC_TOP_HPHR_COMP_LUT, 0x00}, - {AQT1000_CDC_TOP_HPHR_COMP_RD_LSB, 0x00}, - {AQT1000_CDC_TOP_HPHR_COMP_RD_MSB, 0x00}, - {AQT1000_CDC_DSD0_PATH_CTL, 0x00}, - {AQT1000_CDC_DSD0_CFG0, 0x00}, - {AQT1000_CDC_DSD0_CFG1, 0x00}, - {AQT1000_CDC_DSD0_CFG2, 0x42}, - {AQT1000_CDC_DSD0_CFG3, 0x00}, - {AQT1000_CDC_DSD0_CFG4, 0x02}, - {AQT1000_CDC_DSD0_CFG5, 0x00}, - {AQT1000_CDC_DSD1_PATH_CTL, 0x00}, - {AQT1000_CDC_DSD1_CFG0, 0x00}, - {AQT1000_CDC_DSD1_CFG1, 0x00}, - {AQT1000_CDC_DSD1_CFG2, 0x42}, - {AQT1000_CDC_DSD1_CFG3, 0x00}, - {AQT1000_CDC_DSD1_CFG4, 0x02}, - {AQT1000_CDC_DSD1_CFG5, 0x00}, - {AQT1000_CDC_RX_IDLE_DET_PATH_CTL, 0x00}, - {AQT1000_CDC_RX_IDLE_DET_CFG0, 0x07}, - {AQT1000_CDC_RX_IDLE_DET_CFG1, 0x3C}, - {AQT1000_CDC_RX_IDLE_DET_CFG2, 0x00}, - {AQT1000_CDC_RX_IDLE_DET_CFG3, 0x00}, - {AQT1000_CDC_DOP_DET_CTL, 0x00}, - {AQT1000_CDC_DOP_DET_CFG0, 0xFA}, - {AQT1000_CDC_DOP_DET_CFG1, 0x05}, - {AQT1000_CDC_DOP_DET_CFG2, 0x00}, - {AQT1000_CDC_DOP_DET_CFG3, 0x33}, - {AQT1000_CDC_DOP_DET_CFG4, 0x20}, - {AQT1000_CDC_DOP_DET_STATUS0, 0x00}, - {AQT1000_PAGE15_PAGE_REGISTER, 0x00}, - {AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG0, 0x1B}, - {AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG1, 0x24}, - {AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG2, 0x00}, - {AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG3, 0x08}, - {AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG0, 0x1B}, - {AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG1, 0x24}, - {AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG2, 0x00}, - {AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG3, 0x08}, - {AQT1000_CDC_DEBUG_RC_RE_ASRC_DEBUG_CFG0, 0x00}, - {AQT1000_CDC_DEBUG_ANC0_RC0_FIFO_CTL, 0x4C}, - {AQT1000_CDC_DEBUG_ANC0_RC1_FIFO_CTL, 0x4C}, - {AQT1000_CDC_DEBUG_ANC1_RC0_FIFO_CTL, 0x4C}, - {AQT1000_CDC_DEBUG_ANC1_RC1_FIFO_CTL, 0x4C}, - {AQT1000_CDC_DEBUG_ANC_RC_RST_DBG_CNTR, 0x00}, - {AQT1000_PAGE128_PAGE_REGISTER, 0x00}, - {AQT1000_TLMM_SPI_CLK_PINCFG, 0x00}, - {AQT1000_TLMM_SPI_MOSI_PINCFG, 0x00}, - {AQT1000_TLMM_SPI_MISO_PINCFG, 0x00}, - {AQT1000_TLMM_SPI_CS_N_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO1_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO2_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO3_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO4_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO5_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO6_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO7_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO8_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO9_PINCFG, 0x00}, - {AQT1000_TLMM_GPIO10_PINCFG, 0x00}, - {AQT1000_PAD_CTRL_PAD_PDN_CTRL_0, 0x00}, - {AQT1000_PAD_CTRL_PAD_PDN_CTRL_1, 0x00}, - {AQT1000_PAD_CTRL_PAD_PU_CTRL_0, 0x00}, - {AQT1000_PAD_CTRL_PAD_PU_CTRL_1, 0x00}, - {AQT1000_PAD_CTRL_GPIO_CTL_0_OE, 0x00}, - {AQT1000_PAD_CTRL_GPIO_CTL_1_OE, 0x00}, - {AQT1000_PAD_CTRL_GPIO_CTL_0_DATA, 0x00}, - {AQT1000_PAD_CTRL_GPIO_CTL_1_DATA, 0x00}, - {AQT1000_PAD_CTRL_PAD_DRVCTL, 0x00}, - {AQT1000_PAD_CTRL_PIN_STATUS, 0x00}, - {AQT1000_PAD_CTRL_MEM_CTRL, 0x00}, - {AQT1000_PAD_CTRL_PAD_INP_DISABLE_0, 0x00}, - {AQT1000_PAD_CTRL_PAD_INP_DISABLE_1, 0x00}, - {AQT1000_PAD_CTRL_PIN_CTL_OE_0, 0x00}, - {AQT1000_PAD_CTRL_PIN_CTL_OE_1, 0x00}, - {AQT1000_PAD_CTRL_PIN_CTL_DATA_0, 0x00}, - {AQT1000_PAD_CTRL_PIN_CTL_DATA_1, 0x00}, - {AQT1000_PAD_CTRL_USB_PHY_CLK_DIV, 0x0F}, - {AQT1000_PAD_CTRL_DEBUG_BUS_CDC, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_BUS_SEL, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_EN_1, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_EN_2, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_EN_3, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_EN_4, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_EN_5, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_0, 0x00}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_1, 0x01}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_2, 0x02}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_3, 0x03}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_4, 0x04}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_5, 0x05}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_6, 0x06}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_7, 0x07}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_8, 0x08}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_9, 0x09}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_10, 0x0A}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_11, 0x0B}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_12, 0x0C}, - {AQT1000_PAD_CTRL_DEBUG_MUX_BIT_13, 0x0D}, - {AQT1000_PAD_CTRL_DEBUG_READ_0, 0x0D}, - {AQT1000_PAD_CTRL_DEBUG_READ_1, 0x0D}, - {AQT1000_PAD_CTRL_DEBUG_READ_2, 0x0D}, - {AQT1000_PAD_CTRL_DEBUG_READ_3, 0x0D}, - {AQT1000_PAD_CTRL_FPGA_CTL, 0x00}, -}; - -const u8 aqt1000_page0_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE0_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_CHIP_ID_BYTE0)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_CHIP_ID_BYTE1)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_CHIP_ID_BYTE2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_CHIP_ID_BYTE3)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_TEST0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_TEST1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT0)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT1)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT3)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT4)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT5)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT6)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT7)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT8)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT9)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT10)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT11)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT12)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT13)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT14)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_VAL_OUT15)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_I2C_SLAVE_ID_NONNEGO)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_I2C_SLAVE_ID_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_I2C_SLAVE_ID_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_I2C_SLAVE_ID_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_I2C_ACTIVE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_CLK_CFG_MCLK)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_CLK_CFG_MCLK2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_CLK_CTL_CDC_DIG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_RST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_TEST0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_TEST1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT0)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT1)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT3)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT4)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT5)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT6)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT7)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT8)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT9)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT10)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT11)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT12)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT13)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT14)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT15)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG0_EFUSE2_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CHIP_CFG1_PWR_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_BUS_MTRX_CFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_DMA_BUS_VOTE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_USB_BUS_VOTE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_BLSP_BUS_VOTE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_PWR_MEM_SD)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_PWR_SYS_MEM_SD_RAM)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_PWR_SYS_MEM_SD_ROM)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_PWR_SYS_MEM_FORCE_DS_RAM)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_PWR_SYS_MEM_FORCE_DS_ROM)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_CLK_CFG_FLL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_CLK_CFG_SPI_M)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_CLK_CFG_I2C_M)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_CLK_CFG_UART)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_RST_USB_SS)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_RST_BLSP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_RST_BUS_MTRX)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_RST_MISC)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CHIP_CFG1_ANA_WAIT_STATE_CTL)] = AQT1000_RW, -}; - -const u8 aqt1000_page1_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE1_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_8)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_USER_CTL_9)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_L_VAL_CTL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_L_VAL_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_DSM_FRAC_CTL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_DSM_FRAC_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_CONFIG_CTL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_CONFIG_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_CONFIG_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_CONFIG_CTL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_CONFIG_CTL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_TEST_CTL_7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_FREQ_CTL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_FREQ_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_FREQ_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_FREQ_CTL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_SSC_CTL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_SSC_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_SSC_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_SSC_CTL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_FLL_MODE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLL_STATUS_0)] = AQT1000_RO, - [AQT1000_REG(AQT1000_FLL_STATUS_1)] = AQT1000_RO, - [AQT1000_REG(AQT1000_FLL_STATUS_2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_FLL_STATUS_3)] = AQT1000_RO, -}; - -const u8 aqt1000_page2_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE2_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_I2S_0_TX_CFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_I2S_0_RX_CFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_I2S_0_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_I2S_CLKSRC_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_I2S_HS_CLK_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_I2S_0_RST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_SHADOW_I2S_0_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_I2S_SHADOW_I2S_0_RX_CFG)] = AQT1000_RW, -}; - -const u8 aqt1000_page5_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE5_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_MCU_INT_POLARITY)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_MASK_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_MASK_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_MASK_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_MASK_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_MASK_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_MASK_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_MASK_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_STATUS_0)] = AQT1000_RO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_STATUS_1)] = AQT1000_RO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_STATUS_2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_STATUS_3)] = AQT1000_RO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_STATUS_4)] = AQT1000_RO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_STATUS_5)] = AQT1000_RO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_STATUS_6)] = AQT1000_RO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_CLEAR_0)] = AQT1000_WO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_CLEAR_1)] = AQT1000_WO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_CLEAR_2)] = AQT1000_WO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_CLEAR_3)] = AQT1000_WO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_CLEAR_4)] = AQT1000_WO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_CLEAR_5)] = AQT1000_WO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_CLEAR_6)] = AQT1000_WO, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TYPE_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TYPE_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TYPE_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TYPE_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TYPE_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TYPE_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TYPE_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_EN_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_EN_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_EN_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_EN_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_EN_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_EN_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_EN_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_VAL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_VAL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_VAL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_VAL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_VAL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_VAL_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_TEST_VAL_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_8)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_9)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_10)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_11)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_12)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_INT_DEST_13)] = AQT1000_RW, - [AQT1000_REG(AQT1000_INTR_CTRL_CLR_COMMIT)] = AQT1000_WO, -}; - -const u8 aqt1000_page6_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_ANA_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_BIAS)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_RX_SUPPLIES)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_HPH)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_AMIC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_AMIC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_AMIC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_AMIC3_HPF)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_MECH)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_ELECT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_ZDET)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_RESULT_1)] = AQT1000_RO, - [AQT1000_REG(AQT1000_ANA_MBHC_RESULT_2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_ANA_MBHC_RESULT_3)] = AQT1000_RO, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MBHC_BTN7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MICB1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_ANA_MICB1_RAMP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BIAS_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BIAS_CCOMP_FINE_ADJ)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LED_LED_MODE_SEL_R)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LED_LED_MISC_R)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LED_LED_MODE_SEL_G)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LED_LED_MISC_G)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LED_LED_MODE_SEL_B)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LED_LED_MISC_B)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LDOH_MODE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LDOH_BIAS)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LDOH_STB_LOADS)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LDOH_MISC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LDOL_VDDCX_ADJUST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_LDOL_DISABLE_LDOL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_EN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_VOUT_SEL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_CTRL_VCL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_CTRL_VCL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_CTRL_CCL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_CTRL_CCL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_CTRL_CCL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_CTRL_CCL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_CTRL_CCL_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_IBIAS_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_IBIAS_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_IBIAS_CTL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_IBIAS_CTL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_IBIAS_CTL_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_BUCK_5V_ATEST_DTEST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PON_BG_CTRL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PON_TEST_CTRL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_CTL_CLK)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_CTL_ANA)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_CTL_SPARE_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_CTL_SPARE_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_CTL_BCS)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_MOISTURE_DET_FSM_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MBHC_TEST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MICB1_TEST_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MICB1_TEST_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MICB1_TEST_CTL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MICB1_MISC_MICB1_INM_RES_BIAS)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MICB1_MISC_MICB_MISC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MICB1_MISC_MICB_MISC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_ADC_VCM)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_BIAS_ATEST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_ADC_INT1_IB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_ADC_INT2_IB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_TXFE_DIV_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_TXFE_DIV_START)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_TXFE_DIV_STOP_9P6M)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_COM_TXFE_DIV_STOP_12P288M)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_1_2_TEST_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_1_2_ADC_IB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_1_2_ATEST_REFCTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_1_2_TEST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_1_2_TEST_BLK_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_1_2_TXFE_CLKDIV)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_1_2_SAR1_ERR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_TX_1_2_SAR2_ERR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_TX_3_TEST_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_3_ADC_IB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_3_ATEST_REFCTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_3_TEST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_3_TEST_BLK_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_3_TXFE_CLKDIV)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TX_3_SAR1_ERR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_TX_3_SAR2_ERR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_TX_ATEST1_2_SEL)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CLASSH_MODE_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_MODE_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_MODE_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_CTRL_VCL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_CTRL_VCL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_CTRL_CCL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_CTRL_CCL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_CTRL_CCL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_CTRL_CCL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_CTRL_CCL_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_BUCK_TMUX_A_D)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_BUCK_SW_DRV_CNTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLASSH_SPARE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_8)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEG_CTRL_9)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEGDAC_CTRL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEGDAC_CTRL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_VNEGDAC_CTRL_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_CTRL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_FLYBACK_TEST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_AUX_SW_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_PA_AUX_IN_CONN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_TIMER_DIV)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_OCP_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_OCP_COUNT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_ATEST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_MISC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_HPH_LDO)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_HPH_PA)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_HPH_RDACBUFF_CNP2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_HPH_RDAC_LDO)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_HPH_CNP1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_HPH_LOWPOWER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_MISC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_MISC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_MISC4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_MISC5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_BUCK_RST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_BUCK_VREF_ERRAMP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_FLYB_ERRAMP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_FLYB_BUFF)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_BIAS_FLYB_MID_RST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_L_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_HPH_R_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_HPH_CNP_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_CNP_WG_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_CNP_WG_TIME)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_OCP_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_AUTO_CHOP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_CHOP_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_PA_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_PA_CTL2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_L_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_L_TEST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_L_ATEST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_R_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_R_TEST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_R_ATEST)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_RDAC_CLK_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_RDAC_CLK_CTL2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_RDAC_LDO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_RDAC_CHOP_CLK_LP_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_REFBUFF_UHQA_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_REFBUFF_LP_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_L_DAC_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_R_DAC_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPHLR_SURGE_COMP_SEL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPHLR_SURGE_EN)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPHLR_SURGE_MISC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPHLR_SURGE_STATUS)] = AQT1000_RO, -}; - -const u8 aqt1000_page7_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_ANA_NEW_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_ANA_HPH2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_ANA_HPH3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_MCLK1_PRG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_MCLK2_I2S_HS_CLK_PRG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_XO_CAP_XTP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_XO_CAP_XTM)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_PLL_ENABLES)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_PLL_PRESET)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_PLL_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MBHC_NEW_ELECT_REM_CLAMP_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_CTL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_CTL_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_PLUG_DETECT_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_ZDET_ANA_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_ZDET_RAMP_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_FSM_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MBHC_NEW_ADC_RESULT)] = AQT1000_RO, - [AQT1000_REG(AQT1000_HPH_NEW_INT_RDAC_GAIN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_L)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_RDAC_VREF_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_RDAC_OVERRIDE_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_R)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_PA_MISC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_PA_MISC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_PA_RDAC_MISC)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_HPH_TIMER1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_HPH_TIMER2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_HPH_TIMER3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_HPH_TIMER4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_PA_RDAC_MISC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_HPH_NEW_INT_PA_RDAC_MISC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_NEW_INT_HPH_RDAC_BIAS_ULP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_RX_NEW_INT_HPH_RDAC_LDO_LP)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_CLK_TEST1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_XO_TEST1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_XO_TEST2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_POST_DIV_REG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_POST_DIV_REG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_REF_DIV_REG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_REF_DIV_REG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_FILTER_REG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_FILTER_REG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_PLL_L_VAL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_PLL_M_VAL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_PLL_N_VAL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_TEST_REG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_PFD_CP_DSM_PROG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_VCO_PROG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_TEST_REG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_LDO_LOCK_CFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CLK_SYS_INT_DIG_LOCK_DET_CFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL)] = - AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_INT_MECH_DET_CURRENT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MBHC_NEW_INT_SPARE_2)] = AQT1000_RW, -}; - -const u8 aqt1000_page10_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE10_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_CLK_RESET_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_MODE_1_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_MODE_2_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_FF_SHIFT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_FB_SHIFT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_LPF_FF_A_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_LPF_FF_B_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_LPF_FB_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_SMLPF_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_DCFLT_SHIFT_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_IIR_ADAPT_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_IIR_COEFF_1_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_IIR_COEFF_2_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_FF_A_GAIN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_FF_B_GAIN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_FB_GAIN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_RC_COMMON_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_FIFO_COMMON_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC0_RC0_STATUS_FMIN_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC0_RC1_STATUS_FMIN_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC0_RC0_STATUS_FMAX_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC0_RC1_STATUS_FMAX_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC0_STATUS_FIFO)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC1_CLK_RESET_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_MODE_1_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_MODE_2_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_FF_SHIFT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_FB_SHIFT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_LPF_FF_A_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_LPF_FF_B_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_LPF_FB_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_SMLPF_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_DCFLT_SHIFT_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_IIR_ADAPT_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_IIR_COEFF_1_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_IIR_COEFF_2_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_FF_A_GAIN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_FF_B_GAIN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_FB_GAIN_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_RC_COMMON_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_FIFO_COMMON_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_ANC1_RC0_STATUS_FMIN_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC1_RC1_STATUS_FMIN_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC1_RC0_STATUS_FMAX_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC1_RC1_STATUS_FMAX_CNTR)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_ANC1_STATUS_FIFO)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_VOL_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_SEC0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_SEC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_SEC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_SEC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_SEC4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_SEC5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX0_TX_PATH_SEC6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_VOL_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_SEC0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_SEC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_SEC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_SEC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_SEC4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_SEC5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX1_TX_PATH_SEC6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_VOL_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX2_TX_PATH_SEC7)] = AQT1000_RW, -}; - -const u8 aqt1000_page11_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE11_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL6)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_COMPANDER1_CTL7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL6)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_COMPANDER2_CTL7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_VOL_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_MIX_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_MIX_CFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_VOL_MIX_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_SEC7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_MIX_SEC0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_MIX_SEC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX1_RX_PATH_DSMDEM_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_VOL_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_MIX_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_MIX_CFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_VOL_MIX_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_SEC7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_MIX_SEC0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_MIX_SEC1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX2_RX_PATH_DSMDEM_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR0_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR0_PATH_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR0_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR0_PATH_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR0_PATH_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR0_COEF_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR0_COEF_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR1_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR1_PATH_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR1_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR1_PATH_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR1_PATH_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR1_COEF_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_EQ_IIR1_COEF_CFG1)] = AQT1000_RW, -}; - -const u8 aqt1000_page12_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE12_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_CRC)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_DLY_CTRL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_DECAY_CTRL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_HPH_V_PA)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_EAR_V_PA)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_HPH_V_HD)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_EAR_V_HD)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_K1_MSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_K1_LSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_K2_MSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_K2_LSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_IDLE_CTRL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_IDLE_HPH)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_IDLE_EAR)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_TEST0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_TEST1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLSH_OVR_VREF)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC0_CLK_RST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC0_CTL0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC0_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC0_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC0_STATUS_FMIN_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC0_STATUS_FMIN_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC0_STATUS_FMAX_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC0_STATUS_FMAX_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC0_STATUS_FIFO)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC1_CLK_RST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC1_CTL0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC1_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC1_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_MIXING_ASRC1_STATUS_FMIN_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC1_STATUS_FMIN_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC1_STATUS_FMAX_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC1_STATUS_FMAX_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_MIXING_ASRC1_STATUS_FIFO)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_CLK_RST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_CTL0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_SIDETONE_ASRC0_STATUS_FIFO)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_REF_HQ0_EC_REF_HQ_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_REF_HQ0_EC_REF_HQ_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_REF_HQ1_EC_REF_HQ_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_REF_HQ1_EC_REF_HQ_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC0_CLK_RST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC0_CTL0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC0_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC0_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC0_STATUS_FMIN_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC0_STATUS_FMIN_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC0_STATUS_FMAX_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC0_STATUS_FMAX_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC0_STATUS_FIFO)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC1_CLK_RST_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC1_CTL0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC1_CTL1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC1_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_EC_ASRC1_STATUS_FMIN_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC1_STATUS_FMIN_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC1_STATUS_FMAX_CNTR_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC1_STATUS_FMAX_CNTR_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_EC_ASRC1_STATUS_FIFO)] = AQT1000_RO, -}; - -const u8 aqt1000_page13_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE13_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_EQ_IIR_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_DSD_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_RX_MIX_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_ANC_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_INP_MUX_EC_REF_HQ_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX10_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX10_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX11_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX11_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX12_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX12_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX13_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TX_INP_MUX_ADC_MUX13_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0)] = - AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_IF_ROUTER_TX_MUX_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLK_RST_CTRL_DSD_CONTROL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLK_RST_CTRL_GFM_CONTROL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_CLK_RST_CTRL_I2S_CONTROL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL)] = - AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_TOP_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_HPHL_COMP_WR_LSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_HPHL_COMP_WR_MSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_HPHL_COMP_LUT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_HPHL_COMP_RD_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_TOP_HPHL_COMP_RD_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_TOP_HPHR_COMP_WR_LSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_HPHR_COMP_WR_MSB)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_HPHR_COMP_LUT)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_TOP_HPHR_COMP_RD_LSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_TOP_HPHR_COMP_RD_MSB)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_DSD0_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD0_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD0_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD0_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD0_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD0_CFG4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD0_CFG5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD1_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD1_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD1_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD1_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD1_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD1_CFG4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DSD1_CFG5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_IDLE_DET_PATH_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_IDLE_DET_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_IDLE_DET_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_IDLE_DET_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_RX_IDLE_DET_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DOP_DET_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DOP_DET_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DOP_DET_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DOP_DET_CFG2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DOP_DET_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DOP_DET_CFG4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DOP_DET_STATUS0)] = AQT1000_RO, -}; - -const u8 aqt1000_page15_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE15_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_RC_RE_ASRC_DEBUG_CFG0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_ANC0_RC0_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_ANC0_RC1_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_ANC1_RC0_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_ANC1_RC1_FIFO_CTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_CDC_DEBUG_ANC_RC_RST_DBG_CNTR)] = AQT1000_RW, -}; - -const u8 aqt1000_page128_reg_access[AQT1000_PAGE_SIZE] = { - [AQT1000_REG(AQT1000_PAGE128_PAGE_REGISTER)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_SPI_CLK_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_SPI_MOSI_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_SPI_MISO_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_SPI_CS_N_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO1_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO2_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO3_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO4_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO5_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO6_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO7_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO8_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO9_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_TLMM_GPIO10_PINCFG)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PAD_PDN_CTRL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PAD_PDN_CTRL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PAD_PU_CTRL_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PAD_PU_CTRL_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_GPIO_CTL_0_OE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_GPIO_CTL_1_OE)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_GPIO_CTL_0_DATA)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_GPIO_CTL_1_DATA)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PAD_DRVCTL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PIN_STATUS)] = AQT1000_RO, - [AQT1000_REG(AQT1000_PAD_CTRL_MEM_CTRL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PAD_INP_DISABLE_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PAD_INP_DISABLE_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PIN_CTL_OE_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PIN_CTL_OE_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PIN_CTL_DATA_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_PIN_CTL_DATA_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_USB_PHY_CLK_DIV)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_BUS_CDC)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_BUS_SEL)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_EN_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_EN_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_EN_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_EN_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_EN_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_0)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_1)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_2)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_3)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_4)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_5)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_6)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_7)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_8)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_9)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_10)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_11)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_12)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_MUX_BIT_13)] = AQT1000_RW, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_READ_0)] = AQT1000_RO, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_READ_1)] = AQT1000_RO, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_READ_2)] = AQT1000_RO, - [AQT1000_REG(AQT1000_PAD_CTRL_DEBUG_READ_3)] = AQT1000_RO, - [AQT1000_REG(AQT1000_PAD_CTRL_FPGA_CTL)] = AQT1000_RW, -}; - -const u8 * const aqt1000_reg[AQT1000_PAGE_MAX] = { - [AQT1000_PAGE_0] = aqt1000_page0_reg_access, - [AQT1000_PAGE_1] = aqt1000_page1_reg_access, - [AQT1000_PAGE_2] = aqt1000_page2_reg_access, - [AQT1000_PAGE_5] = aqt1000_page5_reg_access, - [AQT1000_PAGE_6] = aqt1000_page6_reg_access, - [AQT1000_PAGE_7] = aqt1000_page7_reg_access, - [AQT1000_PAGE_10] = aqt1000_page10_reg_access, - [AQT1000_PAGE_11] = aqt1000_page11_reg_access, - [AQT1000_PAGE_12] = aqt1000_page12_reg_access, - [AQT1000_PAGE_13] = aqt1000_page13_reg_access, - [AQT1000_PAGE_15] = aqt1000_page15_reg_access, - [AQT1000_PAGE_128] = aqt1000_page128_reg_access, -}; - -#endif /* _AQT1000_REG_DEFAULTS_H */ diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-registers.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-registers.h deleted file mode 100644 index 9033466656f7..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-registers.h +++ /dev/null @@ -1,881 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _AQT1000_REGISTERS_H -#define _AQT1000_REGISTERS_H - -#define AQT1000_PAGE0_BASE (0x00000000) -#define AQT1000_PAGE0_PAGE_REGISTER (0x00000000) -#define AQT1000_CHIP_CFG0_BASE (0x00000001) -#define AQT1000_CHIP_CFG0_CHIP_ID_BYTE0 (0x00000001) -#define AQT1000_CHIP_CFG0_CHIP_ID_BYTE1 (0x00000002) -#define AQT1000_CHIP_CFG0_CHIP_ID_BYTE2 (0x00000003) -#define AQT1000_CHIP_CFG0_CHIP_ID_BYTE3 (0x00000004) -#define AQT1000_CHIP_CFG0_EFUSE_CTL (0x00000005) -#define AQT1000_CHIP_CFG0_EFUSE_TEST0 (0x00000006) -#define AQT1000_CHIP_CFG0_EFUSE_TEST1 (0x00000007) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT0 (0x00000009) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT1 (0x0000000A) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT2 (0x0000000B) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT3 (0x0000000C) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT4 (0x0000000D) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT5 (0x0000000E) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT6 (0x0000000F) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT7 (0x00000010) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT8 (0x00000011) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT9 (0x00000012) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT10 (0x00000013) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT11 (0x00000014) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT12 (0x00000015) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT13 (0x00000016) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT14 (0x00000017) -#define AQT1000_CHIP_CFG0_EFUSE_VAL_OUT15 (0x00000018) -#define AQT1000_CHIP_CFG0_EFUSE_STATUS (0x00000019) -#define AQT1000_CHIP_CFG0_I2C_SLAVE_ID_NONNEGO (0x0000001A) -#define AQT1000_CHIP_CFG0_I2C_SLAVE_ID_1 (0x0000001B) -#define AQT1000_CHIP_CFG0_I2C_SLAVE_ID_2 (0x0000001C) -#define AQT1000_CHIP_CFG0_I2C_SLAVE_ID_3 (0x0000001D) -#define AQT1000_CHIP_CFG0_I2C_ACTIVE (0x00000020) -#define AQT1000_CHIP_CFG0_CLK_CFG_MCLK (0x00000021) -#define AQT1000_CHIP_CFG0_CLK_CFG_MCLK2 (0x00000022) -#define AQT1000_CHIP_CFG0_CLK_CTL_CDC_DIG (0x00000023) -#define AQT1000_CHIP_CFG0_RST_CTL (0x00000032) -#define AQT1000_CHIP_CFG0_EFUSE2_CTL (0x0000003D) -#define AQT1000_CHIP_CFG0_EFUSE2_TEST0 (0x0000003E) -#define AQT1000_CHIP_CFG0_EFUSE2_TEST1 (0x0000003F) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT0 (0x00000040) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT1 (0x00000041) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT2 (0x00000042) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT3 (0x00000043) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT4 (0x00000044) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT5 (0x00000045) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT6 (0x00000046) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT7 (0x00000047) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT8 (0x00000048) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT9 (0x00000049) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT10 (0x0000004A) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT11 (0x0000004B) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT12 (0x0000004C) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT13 (0x0000004D) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT14 (0x0000004E) -#define AQT1000_CHIP_CFG0_EFUSE2_VAL_OUT15 (0x0000004F) -#define AQT1000_CHIP_CFG0_EFUSE2_STATUS (0x00000050) -#define AQT1000_CHIP_CFG1_BASE (0x00000051) -#define AQT1000_CHIP_CFG1_PWR_CTL (0x00000051) -#define AQT1000_CHIP_CFG1_BUS_MTRX_CFG (0x00000052) -#define AQT1000_CHIP_CFG1_DMA_BUS_VOTE (0x00000053) -#define AQT1000_CHIP_CFG1_USB_BUS_VOTE (0x00000054) -#define AQT1000_CHIP_CFG1_BLSP_BUS_VOTE (0x00000055) -#define AQT1000_CHIP_CFG1_PWR_MEM_SD (0x00000059) -#define AQT1000_CHIP_CFG1_PWR_SYS_MEM_SD_RAM (0x0000005C) -#define AQT1000_CHIP_CFG1_PWR_SYS_MEM_SD_ROM (0x0000005D) -#define AQT1000_CHIP_CFG1_PWR_SYS_MEM_FORCE_DS_RAM (0x0000005E) -#define AQT1000_CHIP_CFG1_PWR_SYS_MEM_FORCE_DS_ROM (0x0000005F) -#define AQT1000_CHIP_CFG1_CLK_CFG_FLL (0x00000061) -#define AQT1000_CHIP_CFG1_CLK_CFG_SPI_M (0x00000062) -#define AQT1000_CHIP_CFG1_CLK_CFG_I2C_M (0x00000063) -#define AQT1000_CHIP_CFG1_CLK_CFG_UART (0x00000064) -#define AQT1000_CHIP_CFG1_RST_USB_SS (0x00000071) -#define AQT1000_CHIP_CFG1_RST_BLSP (0x00000072) -#define AQT1000_CHIP_CFG1_RST_BUS_MTRX (0x00000073) -#define AQT1000_CHIP_CFG1_RST_MISC (0x00000074) -#define AQT1000_CHIP_CFG1_ANA_WAIT_STATE_CTL (0x00000081) -#define AQT1000_PAGE1_BASE (0x00000100) -#define AQT1000_PAGE1_PAGE_REGISTER (0x00000100) -#define AQT1000_FLL_BASE (0x00000101) -#define AQT1000_FLL_USER_CTL_0 (0x00000101) -#define AQT1000_FLL_USER_CTL_1 (0x00000102) -#define AQT1000_FLL_USER_CTL_2 (0x00000103) -#define AQT1000_FLL_USER_CTL_3 (0x00000104) -#define AQT1000_FLL_USER_CTL_4 (0x00000105) -#define AQT1000_FLL_USER_CTL_5 (0x00000106) -#define AQT1000_FLL_USER_CTL_6 (0x00000107) -#define AQT1000_FLL_USER_CTL_7 (0x00000108) -#define AQT1000_FLL_USER_CTL_8 (0x00000109) -#define AQT1000_FLL_USER_CTL_9 (0x0000010A) -#define AQT1000_FLL_L_VAL_CTL_0 (0x0000010B) -#define AQT1000_FLL_L_VAL_CTL_1 (0x0000010C) -#define AQT1000_FLL_DSM_FRAC_CTL_0 (0x0000010D) -#define AQT1000_FLL_DSM_FRAC_CTL_1 (0x0000010E) -#define AQT1000_FLL_CONFIG_CTL_0 (0x0000010F) -#define AQT1000_FLL_CONFIG_CTL_1 (0x00000110) -#define AQT1000_FLL_CONFIG_CTL_2 (0x00000111) -#define AQT1000_FLL_CONFIG_CTL_3 (0x00000112) -#define AQT1000_FLL_CONFIG_CTL_4 (0x00000113) -#define AQT1000_FLL_TEST_CTL_0 (0x00000114) -#define AQT1000_FLL_TEST_CTL_1 (0x00000115) -#define AQT1000_FLL_TEST_CTL_2 (0x00000116) -#define AQT1000_FLL_TEST_CTL_3 (0x00000117) -#define AQT1000_FLL_TEST_CTL_4 (0x00000118) -#define AQT1000_FLL_TEST_CTL_5 (0x00000119) -#define AQT1000_FLL_TEST_CTL_6 (0x0000011A) -#define AQT1000_FLL_TEST_CTL_7 (0x0000011B) -#define AQT1000_FLL_FREQ_CTL_0 (0x0000011C) -#define AQT1000_FLL_FREQ_CTL_1 (0x0000011D) -#define AQT1000_FLL_FREQ_CTL_2 (0x0000011E) -#define AQT1000_FLL_FREQ_CTL_3 (0x0000011F) -#define AQT1000_FLL_SSC_CTL_0 (0x00000120) -#define AQT1000_FLL_SSC_CTL_1 (0x00000121) -#define AQT1000_FLL_SSC_CTL_2 (0x00000122) -#define AQT1000_FLL_SSC_CTL_3 (0x00000123) -#define AQT1000_FLL_FLL_MODE (0x00000124) -#define AQT1000_FLL_STATUS_0 (0x00000125) -#define AQT1000_FLL_STATUS_1 (0x00000126) -#define AQT1000_FLL_STATUS_2 (0x00000127) -#define AQT1000_FLL_STATUS_3 (0x00000128) -#define AQT1000_PAGE2_BASE (0x00000200) -#define AQT1000_PAGE2_PAGE_REGISTER (0x00000200) -#define AQT1000_I2S_BASE (0x00000201) -#define AQT1000_I2S_I2S_0_TX_CFG (0x00000201) -#define AQT1000_I2S_I2S_0_RX_CFG (0x00000202) -#define AQT1000_I2S_I2S_0_CTL (0x00000203) -#define AQT1000_I2S_I2S_CLKSRC_CTL (0x00000204) -#define AQT1000_I2S_I2S_HS_CLK_CTL (0x00000205) -#define AQT1000_I2S_I2S_0_RST (0x00000206) -#define AQT1000_I2S_SHADOW_I2S_0_CTL (0x00000207) -#define AQT1000_I2S_SHADOW_I2S_0_RX_CFG (0x00000208) -#define AQT1000_PAGE5_BASE (0x00000500) -#define AQT1000_PAGE5_PAGE_REGISTER (0x00000500) -#define AQT1000_INTR_CTRL_INTR_CTRL_BASE (0x00000501) -#define AQT1000_INTR_CTRL_MCU_INT_POLARITY (0x00000501) -#define AQT1000_INTR_CTRL_INT_MASK_0 (0x00000502) -#define AQT1000_INTR_CTRL_INT_MASK_1 (0x00000503) -#define AQT1000_INTR_CTRL_INT_MASK_2 (0x00000504) -#define AQT1000_INTR_CTRL_INT_MASK_3 (0x00000505) -#define AQT1000_INTR_CTRL_INT_MASK_4 (0x00000506) -#define AQT1000_INTR_CTRL_INT_MASK_5 (0x00000507) -#define AQT1000_INTR_CTRL_INT_MASK_6 (0x00000508) -#define AQT1000_INTR_CTRL_INT_STATUS_0 (0x00000509) -#define AQT1000_INTR_CTRL_INT_STATUS_1 (0x0000050A) -#define AQT1000_INTR_CTRL_INT_STATUS_2 (0x0000050B) -#define AQT1000_INTR_CTRL_INT_STATUS_3 (0x0000050C) -#define AQT1000_INTR_CTRL_INT_STATUS_4 (0x0000050D) -#define AQT1000_INTR_CTRL_INT_STATUS_5 (0x0000050E) -#define AQT1000_INTR_CTRL_INT_STATUS_6 (0x0000050F) -#define AQT1000_INTR_CTRL_INT_CLEAR_0 (0x00000510) -#define AQT1000_INTR_CTRL_INT_CLEAR_1 (0x00000511) -#define AQT1000_INTR_CTRL_INT_CLEAR_2 (0x00000512) -#define AQT1000_INTR_CTRL_INT_CLEAR_3 (0x00000513) -#define AQT1000_INTR_CTRL_INT_CLEAR_4 (0x00000514) -#define AQT1000_INTR_CTRL_INT_CLEAR_5 (0x00000515) -#define AQT1000_INTR_CTRL_INT_CLEAR_6 (0x00000516) -#define AQT1000_INTR_CTRL_INT_TYPE_0 (0x00000517) -#define AQT1000_INTR_CTRL_INT_TYPE_1 (0x00000518) -#define AQT1000_INTR_CTRL_INT_TYPE_2 (0x00000519) -#define AQT1000_INTR_CTRL_INT_TYPE_3 (0x0000051A) -#define AQT1000_INTR_CTRL_INT_TYPE_4 (0x0000051B) -#define AQT1000_INTR_CTRL_INT_TYPE_5 (0x0000051C) -#define AQT1000_INTR_CTRL_INT_TYPE_6 (0x0000051D) -#define AQT1000_INTR_CTRL_INT_TEST_EN_0 (0x0000051E) -#define AQT1000_INTR_CTRL_INT_TEST_EN_1 (0x0000051F) -#define AQT1000_INTR_CTRL_INT_TEST_EN_2 (0x00000520) -#define AQT1000_INTR_CTRL_INT_TEST_EN_3 (0x00000521) -#define AQT1000_INTR_CTRL_INT_TEST_EN_4 (0x00000522) -#define AQT1000_INTR_CTRL_INT_TEST_EN_5 (0x00000523) -#define AQT1000_INTR_CTRL_INT_TEST_EN_6 (0x00000524) -#define AQT1000_INTR_CTRL_INT_TEST_VAL_0 (0x00000525) -#define AQT1000_INTR_CTRL_INT_TEST_VAL_1 (0x00000526) -#define AQT1000_INTR_CTRL_INT_TEST_VAL_2 (0x00000527) -#define AQT1000_INTR_CTRL_INT_TEST_VAL_3 (0x00000528) -#define AQT1000_INTR_CTRL_INT_TEST_VAL_4 (0x00000529) -#define AQT1000_INTR_CTRL_INT_TEST_VAL_5 (0x0000052A) -#define AQT1000_INTR_CTRL_INT_TEST_VAL_6 (0x0000052B) -#define AQT1000_INTR_CTRL_INT_DEST_0 (0x0000052C) -#define AQT1000_INTR_CTRL_INT_DEST_1 (0x0000052D) -#define AQT1000_INTR_CTRL_INT_DEST_2 (0x0000052E) -#define AQT1000_INTR_CTRL_INT_DEST_3 (0x0000052F) -#define AQT1000_INTR_CTRL_INT_DEST_4 (0x00000530) -#define AQT1000_INTR_CTRL_INT_DEST_5 (0x00000531) -#define AQT1000_INTR_CTRL_INT_DEST_6 (0x00000532) -#define AQT1000_INTR_CTRL_INT_DEST_7 (0x00000533) -#define AQT1000_INTR_CTRL_INT_DEST_8 (0x00000534) -#define AQT1000_INTR_CTRL_INT_DEST_9 (0x00000535) -#define AQT1000_INTR_CTRL_INT_DEST_10 (0x00000536) -#define AQT1000_INTR_CTRL_INT_DEST_11 (0x00000537) -#define AQT1000_INTR_CTRL_INT_DEST_12 (0x00000538) -#define AQT1000_INTR_CTRL_INT_DEST_13 (0x00000539) -#define AQT1000_INTR_CTRL_CLR_COMMIT (0x000005E1) -#define AQT1000_ANA_BASE (0x00000600) -#define AQT1000_ANA_PAGE_REGISTER (0x00000600) -#define AQT1000_ANA_BIAS (0x00000601) -#define AQT1000_ANA_RX_SUPPLIES (0x00000608) -#define AQT1000_ANA_HPH (0x00000609) -#define AQT1000_ANA_AMIC1 (0x0000060E) -#define AQT1000_ANA_AMIC2 (0x0000060F) -#define AQT1000_ANA_AMIC3 (0x00000610) -#define AQT1000_ANA_AMIC3_HPF (0x00000611) -#define AQT1000_ANA_MBHC_MECH (0x00000614) -#define AQT1000_ANA_MBHC_ELECT (0x00000615) -#define AQT1000_ANA_MBHC_ZDET (0x00000616) -#define AQT1000_ANA_MBHC_RESULT_1 (0x00000617) -#define AQT1000_ANA_MBHC_RESULT_2 (0x00000618) -#define AQT1000_ANA_MBHC_RESULT_3 (0x00000619) -#define AQT1000_ANA_MBHC_BTN0 (0x0000061A) -#define AQT1000_ANA_MBHC_BTN1 (0x0000061B) -#define AQT1000_ANA_MBHC_BTN2 (0x0000061C) -#define AQT1000_ANA_MBHC_BTN3 (0x0000061D) -#define AQT1000_ANA_MBHC_BTN4 (0x0000061E) -#define AQT1000_ANA_MBHC_BTN5 (0x0000061F) -#define AQT1000_ANA_MBHC_BTN6 (0x00000620) -#define AQT1000_ANA_MBHC_BTN7 (0x00000621) -#define AQT1000_ANA_MICB1 (0x00000622) -#define AQT1000_ANA_MICB1_RAMP (0x00000624) -#define AQT1000_BIAS_BASE (0x00000628) -#define AQT1000_BIAS_CTL (0x00000628) -#define AQT1000_BIAS_CCOMP_FINE_ADJ (0x00000629) -#define AQT1000_LED_BASE (0x0000062E) -#define AQT1000_LED_LED_MODE_SEL_R (0x0000062E) -#define AQT1000_LED_LED_MISC_R (0x0000062F) -#define AQT1000_LED_LED_MODE_SEL_G (0x00000630) -#define AQT1000_LED_LED_MISC_G (0x00000631) -#define AQT1000_LED_LED_MODE_SEL_B (0x00000632) -#define AQT1000_LED_LED_MISC_B (0x00000633) -#define AQT1000_LDOH_BASE (0x0000063A) -#define AQT1000_LDOH_MODE (0x0000063A) -#define AQT1000_LDOH_BIAS (0x0000063B) -#define AQT1000_LDOH_STB_LOADS (0x0000063C) -#define AQT1000_LDOH_MISC1 (0x0000063D) -#define AQT1000_LDOL_BASE (0x00000640) -#define AQT1000_LDOL_VDDCX_ADJUST (0x00000640) -#define AQT1000_LDOL_DISABLE_LDOL (0x00000641) -#define AQT1000_BUCK_5V_BASE (0x00000644) -#define AQT1000_BUCK_5V_EN_CTL (0x00000644) -#define AQT1000_BUCK_5V_VOUT_SEL (0x00000645) -#define AQT1000_BUCK_5V_CTRL_VCL_1 (0x00000646) -#define AQT1000_BUCK_5V_CTRL_VCL_2 (0x00000647) -#define AQT1000_BUCK_5V_CTRL_CCL_2 (0x00000648) -#define AQT1000_BUCK_5V_CTRL_CCL_1 (0x00000649) -#define AQT1000_BUCK_5V_CTRL_CCL_3 (0x0000064A) -#define AQT1000_BUCK_5V_CTRL_CCL_4 (0x0000064B) -#define AQT1000_BUCK_5V_CTRL_CCL_5 (0x0000064C) -#define AQT1000_BUCK_5V_IBIAS_CTL_1 (0x0000064D) -#define AQT1000_BUCK_5V_IBIAS_CTL_2 (0x0000064E) -#define AQT1000_BUCK_5V_IBIAS_CTL_3 (0x0000064F) -#define AQT1000_BUCK_5V_IBIAS_CTL_4 (0x00000650) -#define AQT1000_BUCK_5V_IBIAS_CTL_5 (0x00000651) -#define AQT1000_BUCK_5V_ATEST_DTEST_CTL (0x00000652) -#define AQT1000_PON_BASE (0x00000653) -#define AQT1000_PON_BG_CTRL (0x00000653) -#define AQT1000_PON_TEST_CTRL (0x00000654) -#define AQT1000_MBHC_BASE (0x00000656) -#define AQT1000_MBHC_CTL_CLK (0x00000656) -#define AQT1000_MBHC_CTL_ANA (0x00000657) -#define AQT1000_MBHC_CTL_SPARE_1 (0x00000658) -#define AQT1000_MBHC_CTL_SPARE_2 (0x00000659) -#define AQT1000_MBHC_CTL_BCS (0x0000065A) -#define AQT1000_MBHC_MOISTURE_DET_FSM_STATUS (0x0000065B) -#define AQT1000_MBHC_TEST_CTL (0x0000065C) -#define AQT1000_MICB1_BASE (0x0000066B) -#define AQT1000_MICB1_TEST_CTL_1 (0x0000066B) -#define AQT1000_MICB1_TEST_CTL_2 (0x0000066C) -#define AQT1000_MICB1_TEST_CTL_3 (0x0000066D) -#define AQT1000_MICB1_MISC_BASE (0x0000066E) -#define AQT1000_MICB1_MISC_MICB1_INM_RES_BIAS (0x0000066E) -#define AQT1000_MICB1_MISC_MICB_MISC1 (0x0000066F) -#define AQT1000_MICB1_MISC_MICB_MISC2 (0x00000670) -#define AQT1000_TX_COM_BASE (0x00000677) -#define AQT1000_TX_COM_ADC_VCM (0x00000677) -#define AQT1000_TX_COM_BIAS_ATEST (0x00000678) -#define AQT1000_TX_COM_ADC_INT1_IB (0x00000679) -#define AQT1000_TX_COM_ADC_INT2_IB (0x0000067A) -#define AQT1000_TX_COM_TXFE_DIV_CTL (0x0000067B) -#define AQT1000_TX_COM_TXFE_DIV_START (0x0000067C) -#define AQT1000_TX_COM_TXFE_DIV_STOP_9P6M (0x0000067D) -#define AQT1000_TX_COM_TXFE_DIV_STOP_12P288M (0x0000067E) -#define AQT1000_TX_1_2_BASE (0x0000067F) -#define AQT1000_TX_1_2_TEST_EN (0x0000067F) -#define AQT1000_TX_1_2_ADC_IB (0x00000680) -#define AQT1000_TX_1_2_ATEST_REFCTL (0x00000681) -#define AQT1000_TX_1_2_TEST_CTL (0x00000682) -#define AQT1000_TX_1_2_TEST_BLK_EN (0x00000683) -#define AQT1000_TX_1_2_TXFE_CLKDIV (0x00000684) -#define AQT1000_TX_1_2_SAR1_ERR (0x00000685) -#define AQT1000_TX_1_2_SAR2_ERR (0x00000686) -#define AQT1000_TX_3_BASE (0x00000687) -#define AQT1000_TX_3_TEST_EN (0x00000687) -#define AQT1000_TX_3_ADC_IB (0x00000688) -#define AQT1000_TX_3_ATEST_REFCTL (0x00000689) -#define AQT1000_TX_3_TEST_CTL (0x0000068A) -#define AQT1000_TX_3_TEST_BLK_EN (0x0000068B) -#define AQT1000_TX_3_TXFE_CLKDIV (0x0000068C) -#define AQT1000_TX_3_SAR1_ERR (0x0000068D) -#define AQT1000_TX_3_SAR2_ERR (0x0000068E) -#define AQT1000_TX_BASE (0x0000068F) -#define AQT1000_TX_ATEST1_2_SEL (0x0000068F) -#define AQT1000_CLASSH_BASE (0x00000697) -#define AQT1000_CLASSH_MODE_1 (0x00000697) -#define AQT1000_CLASSH_MODE_2 (0x00000698) -#define AQT1000_CLASSH_MODE_3 (0x00000699) -#define AQT1000_CLASSH_CTRL_VCL_1 (0x0000069A) -#define AQT1000_CLASSH_CTRL_VCL_2 (0x0000069B) -#define AQT1000_CLASSH_CTRL_CCL_1 (0x0000069C) -#define AQT1000_CLASSH_CTRL_CCL_2 (0x0000069D) -#define AQT1000_CLASSH_CTRL_CCL_3 (0x0000069E) -#define AQT1000_CLASSH_CTRL_CCL_4 (0x0000069F) -#define AQT1000_CLASSH_CTRL_CCL_5 (0x000006A0) -#define AQT1000_CLASSH_BUCK_TMUX_A_D (0x000006A1) -#define AQT1000_CLASSH_BUCK_SW_DRV_CNTL (0x000006A2) -#define AQT1000_CLASSH_SPARE (0x000006A3) -#define AQT1000_FLYBACK_BASE (0x000006A4) -#define AQT1000_FLYBACK_EN (0x000006A4) -#define AQT1000_FLYBACK_VNEG_CTRL_1 (0x000006A5) -#define AQT1000_FLYBACK_VNEG_CTRL_2 (0x000006A6) -#define AQT1000_FLYBACK_VNEG_CTRL_3 (0x000006A7) -#define AQT1000_FLYBACK_VNEG_CTRL_4 (0x000006A8) -#define AQT1000_FLYBACK_VNEG_CTRL_5 (0x000006A9) -#define AQT1000_FLYBACK_VNEG_CTRL_6 (0x000006AA) -#define AQT1000_FLYBACK_VNEG_CTRL_7 (0x000006AB) -#define AQT1000_FLYBACK_VNEG_CTRL_8 (0x000006AC) -#define AQT1000_FLYBACK_VNEG_CTRL_9 (0x000006AD) -#define AQT1000_FLYBACK_VNEGDAC_CTRL_1 (0x000006AE) -#define AQT1000_FLYBACK_VNEGDAC_CTRL_2 (0x000006AF) -#define AQT1000_FLYBACK_VNEGDAC_CTRL_3 (0x000006B0) -#define AQT1000_FLYBACK_CTRL_1 (0x000006B1) -#define AQT1000_FLYBACK_TEST_CTL (0x000006B2) -#define AQT1000_RX_BASE (0x000006B3) -#define AQT1000_RX_AUX_SW_CTL (0x000006B3) -#define AQT1000_RX_PA_AUX_IN_CONN (0x000006B4) -#define AQT1000_RX_TIMER_DIV (0x000006B5) -#define AQT1000_RX_OCP_CTL (0x000006B6) -#define AQT1000_RX_OCP_COUNT (0x000006B7) -#define AQT1000_RX_BIAS_ATEST (0x000006B8) -#define AQT1000_RX_BIAS_MISC1 (0x000006B9) -#define AQT1000_RX_BIAS_HPH_LDO (0x000006BA) -#define AQT1000_RX_BIAS_HPH_PA (0x000006BB) -#define AQT1000_RX_BIAS_HPH_RDACBUFF_CNP2 (0x000006BC) -#define AQT1000_RX_BIAS_HPH_RDAC_LDO (0x000006BD) -#define AQT1000_RX_BIAS_HPH_CNP1 (0x000006BE) -#define AQT1000_RX_BIAS_HPH_LOWPOWER (0x000006BF) -#define AQT1000_RX_BIAS_MISC2 (0x000006C0) -#define AQT1000_RX_BIAS_MISC3 (0x000006C1) -#define AQT1000_RX_BIAS_MISC4 (0x000006C2) -#define AQT1000_RX_BIAS_MISC5 (0x000006C3) -#define AQT1000_RX_BIAS_BUCK_RST (0x000006C4) -#define AQT1000_RX_BIAS_BUCK_VREF_ERRAMP (0x000006C5) -#define AQT1000_RX_BIAS_FLYB_ERRAMP (0x000006C6) -#define AQT1000_RX_BIAS_FLYB_BUFF (0x000006C7) -#define AQT1000_RX_BIAS_FLYB_MID_RST (0x000006C8) -#define AQT1000_HPH_BASE (0x000006C9) -#define AQT1000_HPH_L_STATUS (0x000006C9) -#define AQT1000_HPH_R_STATUS (0x000006CA) -#define AQT1000_HPH_CNP_EN (0x000006CB) -#define AQT1000_HPH_CNP_WG_CTL (0x000006CC) -#define AQT1000_HPH_CNP_WG_TIME (0x000006CD) -#define AQT1000_HPH_OCP_CTL (0x000006CE) -#define AQT1000_HPH_AUTO_CHOP (0x000006CF) -#define AQT1000_HPH_CHOP_CTL (0x000006D0) -#define AQT1000_HPH_PA_CTL1 (0x000006D1) -#define AQT1000_HPH_PA_CTL2 (0x000006D2) -#define AQT1000_HPH_L_EN (0x000006D3) -#define AQT1000_HPH_L_TEST (0x000006D4) -#define AQT1000_HPH_L_ATEST (0x000006D5) -#define AQT1000_HPH_R_EN (0x000006D6) -#define AQT1000_HPH_R_TEST (0x000006D7) -#define AQT1000_HPH_R_ATEST (0x000006D8) -#define AQT1000_HPH_RDAC_CLK_CTL1 (0x000006D9) -#define AQT1000_HPH_RDAC_CLK_CTL2 (0x000006DA) -#define AQT1000_HPH_RDAC_LDO_CTL (0x000006DB) -#define AQT1000_HPH_RDAC_CHOP_CLK_LP_CTL (0x000006DC) -#define AQT1000_HPH_REFBUFF_UHQA_CTL (0x000006DD) -#define AQT1000_HPH_REFBUFF_LP_CTL (0x000006DE) -#define AQT1000_HPH_L_DAC_CTL (0x000006DF) -#define AQT1000_HPH_R_DAC_CTL (0x000006E0) -#define AQT1000_HPHLR_BASE (0x000006E1) -#define AQT1000_HPHLR_SURGE_COMP_SEL (0x000006E1) -#define AQT1000_HPHLR_SURGE_EN (0x000006E2) -#define AQT1000_HPHLR_SURGE_MISC1 (0x000006E3) -#define AQT1000_HPHLR_SURGE_STATUS (0x000006E4) -#define AQT1000_ANA_NEW_BASE (0x00000700) -#define AQT1000_ANA_NEW_PAGE_REGISTER (0x00000700) -#define AQT1000_HPH_NEW_BASE (0x00000701) -#define AQT1000_HPH_NEW_ANA_HPH2 (0x00000701) -#define AQT1000_HPH_NEW_ANA_HPH3 (0x00000702) -#define AQT1000_CLK_SYS_BASE (0x0000070E) -#define AQT1000_CLK_SYS_MCLK1_PRG (0x0000070E) -#define AQT1000_CLK_SYS_MCLK2_I2S_HS_CLK_PRG (0x0000070F) -#define AQT1000_CLK_SYS_XO_CAP_XTP (0x00000710) -#define AQT1000_CLK_SYS_XO_CAP_XTM (0x00000711) -#define AQT1000_CLK_SYS_PLL_ENABLES (0x00000712) -#define AQT1000_CLK_SYS_PLL_PRESET (0x00000713) -#define AQT1000_CLK_SYS_PLL_STATUS (0x00000714) -#define AQT1000_MBHC_NEW_BASE (0x0000071F) -#define AQT1000_MBHC_NEW_ELECT_REM_CLAMP_CTL (0x0000071F) -#define AQT1000_MBHC_NEW_CTL_1 (0x00000720) -#define AQT1000_MBHC_NEW_CTL_2 (0x00000721) -#define AQT1000_MBHC_NEW_PLUG_DETECT_CTL (0x00000722) -#define AQT1000_MBHC_NEW_ZDET_ANA_CTL (0x00000723) -#define AQT1000_MBHC_NEW_ZDET_RAMP_CTL (0x00000724) -#define AQT1000_MBHC_NEW_FSM_STATUS (0x00000725) -#define AQT1000_MBHC_NEW_ADC_RESULT (0x00000726) -#define AQT1000_HPH_NEW_INT_BASE (0x00000732) -#define AQT1000_HPH_NEW_INT_RDAC_GAIN_CTL (0x00000732) -#define AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_L (0x00000733) -#define AQT1000_HPH_NEW_INT_RDAC_VREF_CTL (0x00000734) -#define AQT1000_HPH_NEW_INT_RDAC_OVERRIDE_CTL (0x00000735) -#define AQT1000_HPH_NEW_INT_RDAC_HD2_CTL_R (0x00000736) -#define AQT1000_HPH_NEW_INT_PA_MISC1 (0x00000737) -#define AQT1000_HPH_NEW_INT_PA_MISC2 (0x00000738) -#define AQT1000_HPH_NEW_INT_PA_RDAC_MISC (0x00000739) -#define AQT1000_HPH_NEW_INT_HPH_TIMER1 (0x0000073A) -#define AQT1000_HPH_NEW_INT_HPH_TIMER2 (0x0000073B) -#define AQT1000_HPH_NEW_INT_HPH_TIMER3 (0x0000073C) -#define AQT1000_HPH_NEW_INT_HPH_TIMER4 (0x0000073D) -#define AQT1000_HPH_NEW_INT_PA_RDAC_MISC2 (0x0000073E) -#define AQT1000_HPH_NEW_INT_PA_RDAC_MISC3 (0x0000073F) -#define AQT1000_RX_NEW_INT_BASE (0x00000745) -#define AQT1000_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI (0x00000745) -#define AQT1000_RX_NEW_INT_HPH_RDAC_BIAS_ULP (0x00000746) -#define AQT1000_RX_NEW_INT_HPH_RDAC_LDO_LP (0x00000747) -#define AQT1000_CLK_SYS_INT_BASE (0x0000076C) -#define AQT1000_CLK_SYS_INT_CLK_TEST1 (0x0000076C) -#define AQT1000_CLK_SYS_INT_XO_TEST1 (0x0000076D) -#define AQT1000_CLK_SYS_INT_XO_TEST2 (0x0000076E) -#define AQT1000_CLK_SYS_INT_POST_DIV_REG0 (0x0000076F) -#define AQT1000_CLK_SYS_INT_POST_DIV_REG1 (0x00000770) -#define AQT1000_CLK_SYS_INT_REF_DIV_REG0 (0x00000771) -#define AQT1000_CLK_SYS_INT_REF_DIV_REG1 (0x00000772) -#define AQT1000_CLK_SYS_INT_FILTER_REG0 (0x00000773) -#define AQT1000_CLK_SYS_INT_FILTER_REG1 (0x00000774) -#define AQT1000_CLK_SYS_INT_PLL_L_VAL (0x00000775) -#define AQT1000_CLK_SYS_INT_PLL_M_VAL (0x00000776) -#define AQT1000_CLK_SYS_INT_PLL_N_VAL (0x00000777) -#define AQT1000_CLK_SYS_INT_TEST_REG0 (0x00000778) -#define AQT1000_CLK_SYS_INT_PFD_CP_DSM_PROG (0x00000779) -#define AQT1000_CLK_SYS_INT_VCO_PROG (0x0000077A) -#define AQT1000_CLK_SYS_INT_TEST_REG1 (0x0000077B) -#define AQT1000_CLK_SYS_INT_LDO_LOCK_CFG (0x0000077C) -#define AQT1000_CLK_SYS_INT_DIG_LOCK_DET_CFG (0x0000077D) -#define AQT1000_MBHC_NEW_INT_BASE (0x000007AF) -#define AQT1000_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL (0x000007AF) -#define AQT1000_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL (0x000007B0) -#define AQT1000_MBHC_NEW_INT_MECH_DET_CURRENT (0x000007B1) -#define AQT1000_MBHC_NEW_INT_SPARE_2 (0x000007B2) -#define AQT1000_PAGE10_BASE (0x00000A00) -#define AQT1000_PAGE10_PAGE_REGISTER (0x00000A00) -#define AQT1000_CDC_ANC0_BASE (0x00000A01) -#define AQT1000_CDC_ANC0_CLK_RESET_CTL (0x00000A01) -#define AQT1000_CDC_ANC0_MODE_1_CTL (0x00000A02) -#define AQT1000_CDC_ANC0_MODE_2_CTL (0x00000A03) -#define AQT1000_CDC_ANC0_FF_SHIFT (0x00000A04) -#define AQT1000_CDC_ANC0_FB_SHIFT (0x00000A05) -#define AQT1000_CDC_ANC0_LPF_FF_A_CTL (0x00000A06) -#define AQT1000_CDC_ANC0_LPF_FF_B_CTL (0x00000A07) -#define AQT1000_CDC_ANC0_LPF_FB_CTL (0x00000A08) -#define AQT1000_CDC_ANC0_SMLPF_CTL (0x00000A09) -#define AQT1000_CDC_ANC0_DCFLT_SHIFT_CTL (0x00000A0A) -#define AQT1000_CDC_ANC0_IIR_ADAPT_CTL (0x00000A0B) -#define AQT1000_CDC_ANC0_IIR_COEFF_1_CTL (0x00000A0C) -#define AQT1000_CDC_ANC0_IIR_COEFF_2_CTL (0x00000A0D) -#define AQT1000_CDC_ANC0_FF_A_GAIN_CTL (0x00000A0E) -#define AQT1000_CDC_ANC0_FF_B_GAIN_CTL (0x00000A0F) -#define AQT1000_CDC_ANC0_FB_GAIN_CTL (0x00000A10) -#define AQT1000_CDC_ANC0_RC_COMMON_CTL (0x00000A11) -#define AQT1000_CDC_ANC0_FIFO_COMMON_CTL (0x00000A13) -#define AQT1000_CDC_ANC0_RC0_STATUS_FMIN_CNTR (0x00000A14) -#define AQT1000_CDC_ANC0_RC1_STATUS_FMIN_CNTR (0x00000A15) -#define AQT1000_CDC_ANC0_RC0_STATUS_FMAX_CNTR (0x00000A16) -#define AQT1000_CDC_ANC0_RC1_STATUS_FMAX_CNTR (0x00000A17) -#define AQT1000_CDC_ANC0_STATUS_FIFO (0x00000A18) -#define AQT1000_CDC_ANC1_BASE (0x00000A19) -#define AQT1000_CDC_ANC1_CLK_RESET_CTL (0x00000A19) -#define AQT1000_CDC_ANC1_MODE_1_CTL (0x00000A1A) -#define AQT1000_CDC_ANC1_MODE_2_CTL (0x00000A1B) -#define AQT1000_CDC_ANC1_FF_SHIFT (0x00000A1C) -#define AQT1000_CDC_ANC1_FB_SHIFT (0x00000A1D) -#define AQT1000_CDC_ANC1_LPF_FF_A_CTL (0x00000A1E) -#define AQT1000_CDC_ANC1_LPF_FF_B_CTL (0x00000A1F) -#define AQT1000_CDC_ANC1_LPF_FB_CTL (0x00000A20) -#define AQT1000_CDC_ANC1_SMLPF_CTL (0x00000A21) -#define AQT1000_CDC_ANC1_DCFLT_SHIFT_CTL (0x00000A22) -#define AQT1000_CDC_ANC1_IIR_ADAPT_CTL (0x00000A23) -#define AQT1000_CDC_ANC1_IIR_COEFF_1_CTL (0x00000A24) -#define AQT1000_CDC_ANC1_IIR_COEFF_2_CTL (0x00000A25) -#define AQT1000_CDC_ANC1_FF_A_GAIN_CTL (0x00000A26) -#define AQT1000_CDC_ANC1_FF_B_GAIN_CTL (0x00000A27) -#define AQT1000_CDC_ANC1_FB_GAIN_CTL (0x00000A28) -#define AQT1000_CDC_ANC1_RC_COMMON_CTL (0x00000A29) -#define AQT1000_CDC_ANC1_FIFO_COMMON_CTL (0x00000A2B) -#define AQT1000_CDC_ANC1_RC0_STATUS_FMIN_CNTR (0x00000A2C) -#define AQT1000_CDC_ANC1_RC1_STATUS_FMIN_CNTR (0x00000A2D) -#define AQT1000_CDC_ANC1_RC0_STATUS_FMAX_CNTR (0x00000A2E) -#define AQT1000_CDC_ANC1_RC1_STATUS_FMAX_CNTR (0x00000A2F) -#define AQT1000_CDC_ANC1_STATUS_FIFO (0x00000A30) -#define AQT1000_CDC_TX0_BASE (0x00000A31) -#define AQT1000_CDC_TX0_TX_PATH_CTL (0x00000A31) -#define AQT1000_CDC_TX0_TX_PATH_CFG0 (0x00000A32) -#define AQT1000_CDC_TX0_TX_PATH_CFG1 (0x00000A33) -#define AQT1000_CDC_TX0_TX_VOL_CTL (0x00000A34) -#define AQT1000_CDC_TX0_TX_PATH_SEC0 (0x00000A37) -#define AQT1000_CDC_TX0_TX_PATH_SEC1 (0x00000A38) -#define AQT1000_CDC_TX0_TX_PATH_SEC2 (0x00000A39) -#define AQT1000_CDC_TX0_TX_PATH_SEC3 (0x00000A3A) -#define AQT1000_CDC_TX0_TX_PATH_SEC4 (0x00000A3B) -#define AQT1000_CDC_TX0_TX_PATH_SEC5 (0x00000A3C) -#define AQT1000_CDC_TX0_TX_PATH_SEC6 (0x00000A3D) -#define AQT1000_CDC_TX1_BASE (0x00000A41) -#define AQT1000_CDC_TX1_TX_PATH_CTL (0x00000A41) -#define AQT1000_CDC_TX1_TX_PATH_CFG0 (0x00000A42) -#define AQT1000_CDC_TX1_TX_PATH_CFG1 (0x00000A43) -#define AQT1000_CDC_TX1_TX_VOL_CTL (0x00000A44) -#define AQT1000_CDC_TX1_TX_PATH_SEC0 (0x00000A47) -#define AQT1000_CDC_TX1_TX_PATH_SEC1 (0x00000A48) -#define AQT1000_CDC_TX1_TX_PATH_SEC2 (0x00000A49) -#define AQT1000_CDC_TX1_TX_PATH_SEC3 (0x00000A4A) -#define AQT1000_CDC_TX1_TX_PATH_SEC4 (0x00000A4B) -#define AQT1000_CDC_TX1_TX_PATH_SEC5 (0x00000A4C) -#define AQT1000_CDC_TX1_TX_PATH_SEC6 (0x00000A4D) -#define AQT1000_CDC_TX2_BASE (0x00000A51) -#define AQT1000_CDC_TX2_TX_PATH_CTL (0x00000A51) -#define AQT1000_CDC_TX2_TX_PATH_CFG0 (0x00000A52) -#define AQT1000_CDC_TX2_TX_PATH_CFG1 (0x00000A53) -#define AQT1000_CDC_TX2_TX_VOL_CTL (0x00000A54) -#define AQT1000_CDC_TX2_TX_PATH_SEC0 (0x00000A57) -#define AQT1000_CDC_TX2_TX_PATH_SEC1 (0x00000A58) -#define AQT1000_CDC_TX2_TX_PATH_SEC2 (0x00000A59) -#define AQT1000_CDC_TX2_TX_PATH_SEC3 (0x00000A5A) -#define AQT1000_CDC_TX2_TX_PATH_SEC4 (0x00000A5B) -#define AQT1000_CDC_TX2_TX_PATH_SEC5 (0x00000A5C) -#define AQT1000_CDC_TX2_TX_PATH_SEC6 (0x00000A5D) -#define AQT1000_CDC_TX2_TX_PATH_SEC7 (0x00000A5E) -#define AQT1000_PAGE11_BASE (0x00000B00) -#define AQT1000_PAGE11_PAGE_REGISTER (0x00000B00) -#define AQT1000_CDC_COMPANDER1_BASE (0x00000B01) -#define AQT1000_CDC_COMPANDER1_CTL0 (0x00000B01) -#define AQT1000_CDC_COMPANDER1_CTL1 (0x00000B02) -#define AQT1000_CDC_COMPANDER1_CTL2 (0x00000B03) -#define AQT1000_CDC_COMPANDER1_CTL3 (0x00000B04) -#define AQT1000_CDC_COMPANDER1_CTL4 (0x00000B05) -#define AQT1000_CDC_COMPANDER1_CTL5 (0x00000B06) -#define AQT1000_CDC_COMPANDER1_CTL6 (0x00000B07) -#define AQT1000_CDC_COMPANDER1_CTL7 (0x00000B08) -#define AQT1000_CDC_COMPANDER2_BASE (0x00000B09) -#define AQT1000_CDC_COMPANDER2_CTL0 (0x00000B09) -#define AQT1000_CDC_COMPANDER2_CTL1 (0x00000B0A) -#define AQT1000_CDC_COMPANDER2_CTL2 (0x00000B0B) -#define AQT1000_CDC_COMPANDER2_CTL3 (0x00000B0C) -#define AQT1000_CDC_COMPANDER2_CTL4 (0x00000B0D) -#define AQT1000_CDC_COMPANDER2_CTL5 (0x00000B0E) -#define AQT1000_CDC_COMPANDER2_CTL6 (0x00000B0F) -#define AQT1000_CDC_COMPANDER2_CTL7 (0x00000B10) -#define AQT1000_CDC_RX1_BASE (0x00000B55) -#define AQT1000_CDC_RX1_RX_PATH_CTL (0x00000B55) -#define AQT1000_CDC_RX1_RX_PATH_CFG0 (0x00000B56) -#define AQT1000_CDC_RX1_RX_PATH_CFG1 (0x00000B57) -#define AQT1000_CDC_RX1_RX_PATH_CFG2 (0x00000B58) -#define AQT1000_CDC_RX1_RX_VOL_CTL (0x00000B59) -#define AQT1000_CDC_RX1_RX_PATH_MIX_CTL (0x00000B5A) -#define AQT1000_CDC_RX1_RX_PATH_MIX_CFG (0x00000B5B) -#define AQT1000_CDC_RX1_RX_VOL_MIX_CTL (0x00000B5C) -#define AQT1000_CDC_RX1_RX_PATH_SEC0 (0x00000B5D) -#define AQT1000_CDC_RX1_RX_PATH_SEC1 (0x00000B5E) -#define AQT1000_CDC_RX1_RX_PATH_SEC2 (0x00000B5F) -#define AQT1000_CDC_RX1_RX_PATH_SEC3 (0x00000B60) -#define AQT1000_CDC_RX1_RX_PATH_SEC4 (0x00000B61) -#define AQT1000_CDC_RX1_RX_PATH_SEC5 (0x00000B62) -#define AQT1000_CDC_RX1_RX_PATH_SEC6 (0x00000B63) -#define AQT1000_CDC_RX1_RX_PATH_SEC7 (0x00000B64) -#define AQT1000_CDC_RX1_RX_PATH_MIX_SEC0 (0x00000B65) -#define AQT1000_CDC_RX1_RX_PATH_MIX_SEC1 (0x00000B66) -#define AQT1000_CDC_RX1_RX_PATH_DSMDEM_CTL (0x00000B67) -#define AQT1000_CDC_RX2_BASE (0x00000B69) -#define AQT1000_CDC_RX2_RX_PATH_CTL (0x00000B69) -#define AQT1000_CDC_RX2_RX_PATH_CFG0 (0x00000B6A) -#define AQT1000_CDC_RX2_RX_PATH_CFG1 (0x00000B6B) -#define AQT1000_CDC_RX2_RX_PATH_CFG2 (0x00000B6C) -#define AQT1000_CDC_RX2_RX_VOL_CTL (0x00000B6D) -#define AQT1000_CDC_RX2_RX_PATH_MIX_CTL (0x00000B6E) -#define AQT1000_CDC_RX2_RX_PATH_MIX_CFG (0x00000B6F) -#define AQT1000_CDC_RX2_RX_VOL_MIX_CTL (0x00000B70) -#define AQT1000_CDC_RX2_RX_PATH_SEC0 (0x00000B71) -#define AQT1000_CDC_RX2_RX_PATH_SEC1 (0x00000B72) -#define AQT1000_CDC_RX2_RX_PATH_SEC2 (0x00000B73) -#define AQT1000_CDC_RX2_RX_PATH_SEC3 (0x00000B74) -#define AQT1000_CDC_RX2_RX_PATH_SEC4 (0x00000B75) -#define AQT1000_CDC_RX2_RX_PATH_SEC5 (0x00000B76) -#define AQT1000_CDC_RX2_RX_PATH_SEC6 (0x00000B77) -#define AQT1000_CDC_RX2_RX_PATH_SEC7 (0x00000B78) -#define AQT1000_CDC_RX2_RX_PATH_MIX_SEC0 (0x00000B79) -#define AQT1000_CDC_RX2_RX_PATH_MIX_SEC1 (0x00000B7A) -#define AQT1000_CDC_RX2_RX_PATH_DSMDEM_CTL (0x00000B7B) -#define AQT1000_CDC_EQ_IIR0_BASE (0x00000BD1) -#define AQT1000_CDC_EQ_IIR0_PATH_CTL (0x00000BD1) -#define AQT1000_CDC_EQ_IIR0_PATH_CFG0 (0x00000BD2) -#define AQT1000_CDC_EQ_IIR0_PATH_CFG1 (0x00000BD3) -#define AQT1000_CDC_EQ_IIR0_PATH_CFG2 (0x00000BD4) -#define AQT1000_CDC_EQ_IIR0_PATH_CFG3 (0x00000BD5) -#define AQT1000_CDC_EQ_IIR0_COEF_CFG0 (0x00000BD6) -#define AQT1000_CDC_EQ_IIR0_COEF_CFG1 (0x00000BD7) -#define AQT1000_CDC_EQ_IIR1_BASE (0x00000BE1) -#define AQT1000_CDC_EQ_IIR1_PATH_CTL (0x00000BE1) -#define AQT1000_CDC_EQ_IIR1_PATH_CFG0 (0x00000BE2) -#define AQT1000_CDC_EQ_IIR1_PATH_CFG1 (0x00000BE3) -#define AQT1000_CDC_EQ_IIR1_PATH_CFG2 (0x00000BE4) -#define AQT1000_CDC_EQ_IIR1_PATH_CFG3 (0x00000BE5) -#define AQT1000_CDC_EQ_IIR1_COEF_CFG0 (0x00000BE6) -#define AQT1000_CDC_EQ_IIR1_COEF_CFG1 (0x00000BE7) -#define AQT1000_PAGE12_BASE (0x00000C00) -#define AQT1000_PAGE12_PAGE_REGISTER (0x00000C00) -#define AQT1000_CDC_CLSH_CDC_CLSH_BASE (0x00000C01) -#define AQT1000_CDC_CLSH_CRC (0x00000C01) -#define AQT1000_CDC_CLSH_DLY_CTRL (0x00000C02) -#define AQT1000_CDC_CLSH_DECAY_CTRL (0x00000C03) -#define AQT1000_CDC_CLSH_HPH_V_PA (0x00000C04) -#define AQT1000_CDC_CLSH_EAR_V_PA (0x00000C05) -#define AQT1000_CDC_CLSH_HPH_V_HD (0x00000C06) -#define AQT1000_CDC_CLSH_EAR_V_HD (0x00000C07) -#define AQT1000_CDC_CLSH_K1_MSB (0x00000C08) -#define AQT1000_CDC_CLSH_K1_LSB (0x00000C09) -#define AQT1000_CDC_CLSH_K2_MSB (0x00000C0A) -#define AQT1000_CDC_CLSH_K2_LSB (0x00000C0B) -#define AQT1000_CDC_CLSH_IDLE_CTRL (0x00000C0C) -#define AQT1000_CDC_CLSH_IDLE_HPH (0x00000C0D) -#define AQT1000_CDC_CLSH_IDLE_EAR (0x00000C0E) -#define AQT1000_CDC_CLSH_TEST0 (0x00000C0F) -#define AQT1000_CDC_CLSH_TEST1 (0x00000C10) -#define AQT1000_CDC_CLSH_OVR_VREF (0x00000C11) -#define AQT1000_MIXING_ASRC0_BASE (0x00000C55) -#define AQT1000_MIXING_ASRC0_CLK_RST_CTL (0x00000C55) -#define AQT1000_MIXING_ASRC0_CTL0 (0x00000C56) -#define AQT1000_MIXING_ASRC0_CTL1 (0x00000C57) -#define AQT1000_MIXING_ASRC0_FIFO_CTL (0x00000C58) -#define AQT1000_MIXING_ASRC0_STATUS_FMIN_CNTR_LSB (0x00000C59) -#define AQT1000_MIXING_ASRC0_STATUS_FMIN_CNTR_MSB (0x00000C5A) -#define AQT1000_MIXING_ASRC0_STATUS_FMAX_CNTR_LSB (0x00000C5B) -#define AQT1000_MIXING_ASRC0_STATUS_FMAX_CNTR_MSB (0x00000C5C) -#define AQT1000_MIXING_ASRC0_STATUS_FIFO (0x00000C5D) -#define AQT1000_MIXING_ASRC1_BASE (0x00000C61) -#define AQT1000_MIXING_ASRC1_CLK_RST_CTL (0x00000C61) -#define AQT1000_MIXING_ASRC1_CTL0 (0x00000C62) -#define AQT1000_MIXING_ASRC1_CTL1 (0x00000C63) -#define AQT1000_MIXING_ASRC1_FIFO_CTL (0x00000C64) -#define AQT1000_MIXING_ASRC1_STATUS_FMIN_CNTR_LSB (0x00000C65) -#define AQT1000_MIXING_ASRC1_STATUS_FMIN_CNTR_MSB (0x00000C66) -#define AQT1000_MIXING_ASRC1_STATUS_FMAX_CNTR_LSB (0x00000C67) -#define AQT1000_MIXING_ASRC1_STATUS_FMAX_CNTR_MSB (0x00000C68) -#define AQT1000_MIXING_ASRC1_STATUS_FIFO (0x00000C69) -#define AQT1000_CDC_SIDETONE_SRC0_BASE (0x00000CB5) -#define AQT1000_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL (0x00000CB5) -#define AQT1000_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1 (0x00000CB6) -#define AQT1000_SIDETONE_ASRC0_BASE (0x00000CBD) -#define AQT1000_SIDETONE_ASRC0_CLK_RST_CTL (0x00000CBD) -#define AQT1000_SIDETONE_ASRC0_CTL0 (0x00000CBE) -#define AQT1000_SIDETONE_ASRC0_CTL1 (0x00000CBF) -#define AQT1000_SIDETONE_ASRC0_FIFO_CTL (0x00000CC0) -#define AQT1000_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB (0x00000CC1) -#define AQT1000_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB (0x00000CC2) -#define AQT1000_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB (0x00000CC3) -#define AQT1000_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB (0x00000CC4) -#define AQT1000_SIDETONE_ASRC0_STATUS_FIFO (0x00000CC5) -#define AQT1000_EC_REF_HQ0_BASE (0x00000CD5) -#define AQT1000_EC_REF_HQ0_EC_REF_HQ_PATH_CTL (0x00000CD5) -#define AQT1000_EC_REF_HQ0_EC_REF_HQ_CFG0 (0x00000CD6) -#define AQT1000_EC_REF_HQ1_BASE (0x00000CDD) -#define AQT1000_EC_REF_HQ1_EC_REF_HQ_PATH_CTL (0x00000CDD) -#define AQT1000_EC_REF_HQ1_EC_REF_HQ_CFG0 (0x00000CDE) -#define AQT1000_EC_ASRC0_BASE (0x00000CE5) -#define AQT1000_EC_ASRC0_CLK_RST_CTL (0x00000CE5) -#define AQT1000_EC_ASRC0_CTL0 (0x00000CE6) -#define AQT1000_EC_ASRC0_CTL1 (0x00000CE7) -#define AQT1000_EC_ASRC0_FIFO_CTL (0x00000CE8) -#define AQT1000_EC_ASRC0_STATUS_FMIN_CNTR_LSB (0x00000CE9) -#define AQT1000_EC_ASRC0_STATUS_FMIN_CNTR_MSB (0x00000CEA) -#define AQT1000_EC_ASRC0_STATUS_FMAX_CNTR_LSB (0x00000CEB) -#define AQT1000_EC_ASRC0_STATUS_FMAX_CNTR_MSB (0x00000CEC) -#define AQT1000_EC_ASRC0_STATUS_FIFO (0x00000CED) -#define AQT1000_EC_ASRC1_BASE (0x00000CF1) -#define AQT1000_EC_ASRC1_CLK_RST_CTL (0x00000CF1) -#define AQT1000_EC_ASRC1_CTL0 (0x00000CF2) -#define AQT1000_EC_ASRC1_CTL1 (0x00000CF3) -#define AQT1000_EC_ASRC1_FIFO_CTL (0x00000CF4) -#define AQT1000_EC_ASRC1_STATUS_FMIN_CNTR_LSB (0x00000CF5) -#define AQT1000_EC_ASRC1_STATUS_FMIN_CNTR_MSB (0x00000CF6) -#define AQT1000_EC_ASRC1_STATUS_FMAX_CNTR_LSB (0x00000CF7) -#define AQT1000_EC_ASRC1_STATUS_FMAX_CNTR_MSB (0x00000CF8) -#define AQT1000_EC_ASRC1_STATUS_FIFO (0x00000CF9) -#define AQT1000_PAGE13_BASE (0x00000D00) -#define AQT1000_PAGE13_PAGE_REGISTER (0x00000D00) -#define AQT1000_CDC_RX_INP_MUX_CDC_RX_INP_MUX_BASE (0x00000D01) -#define AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG0 (0x00000D03) -#define AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG1 (0x00000D04) -#define AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG0 (0x00000D05) -#define AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG1 (0x00000D06) -#define AQT1000_CDC_RX_INP_MUX_EQ_IIR_CFG0 (0x00000D11) -#define AQT1000_CDC_RX_INP_MUX_DSD_CFG0 (0x00000D12) -#define AQT1000_CDC_RX_INP_MUX_RX_MIX_CFG0 (0x00000D13) -#define AQT1000_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 (0x00000D18) -#define AQT1000_CDC_RX_INP_MUX_ANC_CFG0 (0x00000D1A) -#define AQT1000_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0 (0x00000D1B) -#define AQT1000_CDC_RX_INP_MUX_EC_REF_HQ_CFG0 (0x00000D1C) -#define AQT1000_CDC_TX_INP_MUX_CDC_TX_INP_MUX_BASE (0x00000D1D) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG0 (0x00000D1D) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG1 (0x00000D1E) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG0 (0x00000D1F) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG1 (0x00000D20) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG0 (0x00000D21) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG1 (0x00000D22) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX10_CFG0 (0x00000D29) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX10_CFG1 (0x00000D2A) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX11_CFG0 (0x00000D2B) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX11_CFG1 (0x00000D2C) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX12_CFG0 (0x00000D2D) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX12_CFG1 (0x00000D2E) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX13_CFG0 (0x00000D2F) -#define AQT1000_CDC_TX_INP_MUX_ADC_MUX13_CFG1 (0x00000D30) -#define AQT1000_CDC_SIDETONE_IIR_INP_MUX_CDC_SIDETONE_IIR_INP_MUX_BASE (0xD31) -#define AQT1000_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0 (0x00000D31) -#define AQT1000_CDC_IF_ROUTER_CDC_IF_ROUTER_BASE (0x00000D3D) -#define AQT1000_CDC_IF_ROUTER_TX_MUX_CFG0 (0x00000D3D) -#define AQT1000_CDC_CLK_RST_CTRL_CDC_CLK_RST_CTRL_BASE (0x00000D41) -#define AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL (0x00000D41) -#define AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL (0x00000D42) -#define AQT1000_CDC_CLK_RST_CTRL_DSD_CONTROL (0x00000D44) -#define AQT1000_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL (0x00000D45) -#define AQT1000_CDC_CLK_RST_CTRL_GFM_CONTROL (0x00000D46) -#define AQT1000_CDC_CLK_RST_CTRL_I2S_CONTROL (0x00000D47) -#define AQT1000_CDC_SIDETONE_IIR0_BASE (0x00000D55) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_PATH_CTL (0x00000D55) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL (0x00000D56) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL (0x00000D57) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL (0x00000D58) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL (0x00000D59) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL (0x00000D5A) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL (0x00000D5B) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL (0x00000D5C) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL (0x00000D5D) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_CTL (0x00000D5E) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL (0x00000D5F) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL (0x00000D60) -#define AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL (0x00000D61) -#define AQT1000_CDC_TOP_CDC_TOP_BASE (0x00000D81) -#define AQT1000_CDC_TOP_TOP_CFG0 (0x00000D81) -#define AQT1000_CDC_TOP_HPHL_COMP_WR_LSB (0x00000D89) -#define AQT1000_CDC_TOP_HPHL_COMP_WR_MSB (0x00000D8A) -#define AQT1000_CDC_TOP_HPHL_COMP_LUT (0x00000D8B) -#define AQT1000_CDC_TOP_HPHL_COMP_RD_LSB (0x00000D8C) -#define AQT1000_CDC_TOP_HPHL_COMP_RD_MSB (0x00000D8D) -#define AQT1000_CDC_TOP_HPHR_COMP_WR_LSB (0x00000D8E) -#define AQT1000_CDC_TOP_HPHR_COMP_WR_MSB (0x00000D8F) -#define AQT1000_CDC_TOP_HPHR_COMP_LUT (0x00000D90) -#define AQT1000_CDC_TOP_HPHR_COMP_RD_LSB (0x00000D91) -#define AQT1000_CDC_TOP_HPHR_COMP_RD_MSB (0x00000D92) -#define AQT1000_CDC_DSD0_BASE (0x00000DB1) -#define AQT1000_CDC_DSD0_PATH_CTL (0x00000DB1) -#define AQT1000_CDC_DSD0_CFG0 (0x00000DB2) -#define AQT1000_CDC_DSD0_CFG1 (0x00000DB3) -#define AQT1000_CDC_DSD0_CFG2 (0x00000DB4) -#define AQT1000_CDC_DSD0_CFG3 (0x00000DB5) -#define AQT1000_CDC_DSD0_CFG4 (0x00000DB6) -#define AQT1000_CDC_DSD0_CFG5 (0x00000DB7) -#define AQT1000_CDC_DSD1_BASE (0x00000DC1) -#define AQT1000_CDC_DSD1_PATH_CTL (0x00000DC1) -#define AQT1000_CDC_DSD1_CFG0 (0x00000DC2) -#define AQT1000_CDC_DSD1_CFG1 (0x00000DC3) -#define AQT1000_CDC_DSD1_CFG2 (0x00000DC4) -#define AQT1000_CDC_DSD1_CFG3 (0x00000DC5) -#define AQT1000_CDC_DSD1_CFG4 (0x00000DC6) -#define AQT1000_CDC_DSD1_CFG5 (0x00000DC7) -#define AQT1000_CDC_RX_IDLE_DET_CDC_RX_IDLE_DET_BASE (0x00000DD1) -#define AQT1000_CDC_RX_IDLE_DET_PATH_CTL (0x00000DD1) -#define AQT1000_CDC_RX_IDLE_DET_CFG0 (0x00000DD2) -#define AQT1000_CDC_RX_IDLE_DET_CFG1 (0x00000DD3) -#define AQT1000_CDC_RX_IDLE_DET_CFG2 (0x00000DD4) -#define AQT1000_CDC_RX_IDLE_DET_CFG3 (0x00000DD5) -#define AQT1000_CDC_DOP_DET_CDC_DOP_DET_BASE (0x00000DD9) -#define AQT1000_CDC_DOP_DET_CTL (0x00000DD9) -#define AQT1000_CDC_DOP_DET_CFG0 (0x00000DDA) -#define AQT1000_CDC_DOP_DET_CFG1 (0x00000DDB) -#define AQT1000_CDC_DOP_DET_CFG2 (0x00000DDC) -#define AQT1000_CDC_DOP_DET_CFG3 (0x00000DDD) -#define AQT1000_CDC_DOP_DET_CFG4 (0x00000DDE) -#define AQT1000_CDC_DOP_DET_STATUS0 (0x00000DE1) -#define AQT1000_PAGE15_BASE (0x00000F00) -#define AQT1000_PAGE15_PAGE_REGISTER (0x00000F00) -#define AQT1000_CDC_DEBUG_CDC_DEBUG_BASE (0x00000FA1) -#define AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG0 (0x00000FA1) -#define AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG1 (0x00000FA2) -#define AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG2 (0x00000FA3) -#define AQT1000_CDC_DEBUG_DSD0_DEBUG_CFG3 (0x00000FA4) -#define AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG0 (0x00000FA5) -#define AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG1 (0x00000FA6) -#define AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG2 (0x00000FA7) -#define AQT1000_CDC_DEBUG_DSD1_DEBUG_CFG3 (0x00000FA8) -#define AQT1000_CDC_DEBUG_RC_RE_ASRC_DEBUG_CFG0 (0x00000FAB) -#define AQT1000_CDC_DEBUG_ANC0_RC0_FIFO_CTL (0x00000FAC) -#define AQT1000_CDC_DEBUG_ANC0_RC1_FIFO_CTL (0x00000FAD) -#define AQT1000_CDC_DEBUG_ANC1_RC0_FIFO_CTL (0x00000FAE) -#define AQT1000_CDC_DEBUG_ANC1_RC1_FIFO_CTL (0x00000FAF) -#define AQT1000_CDC_DEBUG_ANC_RC_RST_DBG_CNTR (0x00000FB0) -#define AQT1000_PAGE128_BASE (0x00008000) -#define AQT1000_PAGE128_PAGE_REGISTER (0x00008000) -#define AQT1000_TLMM_TLMM_BASE (0x00008001) -#define AQT1000_TLMM_SPI_CLK_PINCFG (0x00008001) -#define AQT1000_TLMM_SPI_MOSI_PINCFG (0x00008002) -#define AQT1000_TLMM_SPI_MISO_PINCFG (0x00008003) -#define AQT1000_TLMM_SPI_CS_N_PINCFG (0x00008004) -#define AQT1000_TLMM_GPIO1_PINCFG (0x00008005) -#define AQT1000_TLMM_GPIO2_PINCFG (0x00008006) -#define AQT1000_TLMM_GPIO3_PINCFG (0x00008007) -#define AQT1000_TLMM_GPIO4_PINCFG (0x00008008) -#define AQT1000_TLMM_GPIO5_PINCFG (0x00008009) -#define AQT1000_TLMM_GPIO6_PINCFG (0x0000800A) -#define AQT1000_TLMM_GPIO7_PINCFG (0x0000800B) -#define AQT1000_TLMM_GPIO8_PINCFG (0x0000800C) -#define AQT1000_TLMM_GPIO9_PINCFG (0x0000800D) -#define AQT1000_TLMM_GPIO10_PINCFG (0x0000800E) -#define AQT1000_PAD_CTRL_PAD_CTRL_BASE (0x00008031) -#define AQT1000_PAD_CTRL_PAD_PDN_CTRL_0 (0x00008031) -#define AQT1000_PAD_CTRL_PAD_PDN_CTRL_1 (0x00008032) -#define AQT1000_PAD_CTRL_PAD_PU_CTRL_0 (0x00008033) -#define AQT1000_PAD_CTRL_PAD_PU_CTRL_1 (0x00008034) -#define AQT1000_PAD_CTRL_GPIO_CTL_0_OE (0x00008036) -#define AQT1000_PAD_CTRL_GPIO_CTL_1_OE (0x00008037) -#define AQT1000_PAD_CTRL_GPIO_CTL_0_DATA (0x00008038) -#define AQT1000_PAD_CTRL_GPIO_CTL_1_DATA (0x00008039) -#define AQT1000_PAD_CTRL_PAD_DRVCTL (0x0000803A) -#define AQT1000_PAD_CTRL_PIN_STATUS (0x0000803B) -#define AQT1000_PAD_CTRL_MEM_CTRL (0x0000803C) -#define AQT1000_PAD_CTRL_PAD_INP_DISABLE_0 (0x0000803E) -#define AQT1000_PAD_CTRL_PAD_INP_DISABLE_1 (0x0000803F) -#define AQT1000_PAD_CTRL_PIN_CTL_OE_0 (0x00008040) -#define AQT1000_PAD_CTRL_PIN_CTL_OE_1 (0x00008041) -#define AQT1000_PAD_CTRL_PIN_CTL_DATA_0 (0x00008042) -#define AQT1000_PAD_CTRL_PIN_CTL_DATA_1 (0x00008043) -#define AQT1000_PAD_CTRL_USB_PHY_CLK_DIV (0x00008044) -#define AQT1000_PAD_CTRL_DEBUG_BUS_CDC (0x00008045) -#define AQT1000_PAD_CTRL_DEBUG_BUS_SEL (0x00008046) -#define AQT1000_PAD_CTRL_DEBUG_EN_1 (0x00008047) -#define AQT1000_PAD_CTRL_DEBUG_EN_2 (0x00008048) -#define AQT1000_PAD_CTRL_DEBUG_EN_3 (0x00008049) -#define AQT1000_PAD_CTRL_DEBUG_EN_4 (0x0000804A) -#define AQT1000_PAD_CTRL_DEBUG_EN_5 (0x0000804B) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_0 (0x0000804C) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_1 (0x0000804D) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_2 (0x0000804E) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_3 (0x0000804F) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_4 (0x00008050) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_5 (0x00008051) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_6 (0x00008052) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_7 (0x00008053) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_8 (0x00008054) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_9 (0x00008055) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_10 (0x00008056) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_11 (0x00008057) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_12 (0x00008058) -#define AQT1000_PAD_CTRL_DEBUG_MUX_BIT_13 (0x00008059) -#define AQT1000_PAD_CTRL_DEBUG_READ_0 (0x0000805A) -#define AQT1000_PAD_CTRL_DEBUG_READ_1 (0x0000805B) -#define AQT1000_PAD_CTRL_DEBUG_READ_2 (0x0000805C) -#define AQT1000_PAD_CTRL_DEBUG_READ_3 (0x0000805D) -#define AQT1000_PAD_CTRL_FPGA_CTL (0x00008061) -#define AQT1000_MAX_REGISTER (0x000080FF) - -#endif /*_AQT_REGISTERS_H*/ diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-regmap.c b/techpack/audio/asoc/codecs/aqt1000/aqt1000-regmap.c deleted file mode 100644 index e38c32748f31..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-regmap.c +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "aqt1000-registers.h" -#include "aqt1000-reg-defaults.h" -#include "aqt1000-internal.h" - -static bool aqt1000_is_readable_register(struct device *dev, unsigned int reg) -{ - u8 pg_num, reg_offset; - const u8 *reg_tbl = NULL; - - /* - * Get the page number from MSB of codec register. If its 0x80, assign - * the corresponding page index PAGE_0x80. - */ - pg_num = reg >> 0x8; - if (pg_num == 0x80) - pg_num = AQT1000_PAGE_128; - else if (pg_num > 15) - return false; - - reg_tbl = aqt1000_reg[pg_num]; - reg_offset = reg & 0xFF; - - if (reg_tbl && reg_tbl[reg_offset]) - return true; - else - return false; -} - -static bool aqt1000_is_volatile_register(struct device *dev, unsigned int reg) -{ - u8 pg_num, reg_offset; - const u8 *reg_tbl = NULL; - - pg_num = reg >> 0x8; - if (pg_num == 0x80) - pg_num = AQT1000_PAGE_128; - else if (pg_num > 15) - return false; - - reg_tbl = aqt1000_reg[pg_num]; - reg_offset = reg & 0xFF; - - if (reg_tbl && reg_tbl[reg_offset] == AQT1000_RO) - return true; - - /* IIR Coeff registers are not cacheable */ - if ((reg >= AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL) && - (reg <= AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL)) - return true; - - if ((reg >= AQT1000_CDC_ANC0_IIR_COEFF_1_CTL) && - (reg <= AQT1000_CDC_ANC0_FB_GAIN_CTL)) - return true; - - if ((reg >= AQT1000_CDC_ANC1_IIR_COEFF_1_CTL) && - (reg <= AQT1000_CDC_ANC1_FB_GAIN_CTL)) - return true; - - /* - * Need to mark volatile for registers that are writable but - * only few bits are read-only - */ - switch (reg) { - case AQT1000_BUCK_5V_CTRL_CCL_1: - case AQT1000_BIAS_CCOMP_FINE_ADJ: - case AQT1000_ANA_BIAS: - case AQT1000_BUCK_5V_IBIAS_CTL_4: - case AQT1000_BUCK_5V_CTRL_CCL_2: - case AQT1000_CHIP_CFG0_RST_CTL: - case AQT1000_CHIP_CFG0_CLK_CTL_CDC_DIG: - case AQT1000_CHIP_CFG0_CLK_CFG_MCLK: - case AQT1000_CHIP_CFG0_EFUSE_CTL: - case AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL: - case AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL: - case AQT1000_ANA_RX_SUPPLIES: - case AQT1000_ANA_MBHC_MECH: - case AQT1000_ANA_MBHC_ELECT: - case AQT1000_ANA_MBHC_ZDET: - case AQT1000_ANA_MICB1: - case AQT1000_BUCK_5V_EN_CTL: - return true; - } - - return false; -} - -struct regmap_config aqt1000_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = aqt1000_defaults, - .num_reg_defaults = ARRAY_SIZE(aqt1000_defaults), - .max_register = AQT1000_MAX_REGISTER, - .volatile_reg = aqt1000_is_volatile_register, - .readable_reg = aqt1000_is_readable_register, -}; diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-routing.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-routing.h deleted file mode 100644 index 7ae3276ff79a..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-routing.h +++ /dev/null @@ -1,174 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef AQT1000_ROUTING_H -#define AQT1000_ROUTING_H - -#include - -const struct snd_soc_dapm_route aqt_audio_map[] = { - - /* CDC Tx interface */ - - {"AQT AIF1 CAP", NULL, "AQT AIF1 CAP Mixer"}, - {"AQT AIF1 CAP Mixer", "TX0", "AQT TX0_MUX"}, - {"AQT AIF1 CAP Mixer", "TX1", "AQT TX1_MUX"}, - - {"AQT TX0_MUX", "DEC_L", "AQT ADC0 MUX"}, - {"AQT TX0_MUX", "DEC_R", "AQT ADC1 MUX"}, - {"AQT TX0_MUX", "DEC_V", "AQT ADC2 MUX"}, - - {"AQT TX1_MUX", "DEC_L", "AQT ADC0 MUX"}, - {"AQT TX1_MUX", "DEC_R", "AQT ADC1 MUX"}, - {"AQT TX1_MUX", "DEC_V", "AQT ADC2 MUX"}, - - {"AQT ADC0 MUX", "AMIC", "AQT AMIC0_MUX"}, - {"AQT ADC0 MUX", "ANC_FB0", "AQT ANC_FB_TUNE0"}, - {"AQT ADC0 MUX", "ANC_FB1", "AQT ANC_FB_TUNE1"}, - - {"AQT ADC1 MUX", "AMIC", "AQT AMIC1_MUX"}, - {"AQT ADC1 MUX", "ANC_FB0", "AQT ANC_FB_TUNE0"}, - {"AQT ADC1 MUX", "ANC_FB1", "AQT ANC_FB_TUNE1"}, - - {"AQT ADC2 MUX", "AMIC", "AQT AMIC2_MUX"}, - {"AQT ADC2 MUX", "ANC_FB0", "AQT ANC_FB_TUNE0"}, - {"AQT ADC2 MUX", "ANC_FB1", "AQT ANC_FB_TUNE1"}, - - {"AQT AMIC0_MUX", "ADC_L", "AQT ADC_L"}, - {"AQT AMIC0_MUX", "ADC_R", "AQT ADC_R"}, - {"AQT AMIC0_MUX", "ADC_V", "AQT ADC_V"}, - - {"AQT AMIC1_MUX", "ADC_L", "AQT ADC_L"}, - {"AQT AMIC1_MUX", "ADC_R", "AQT ADC_R"}, - {"AQT AMIC1_MUX", "ADC_V", "AQT ADC_V"}, - - {"AQT AMIC2_MUX", "ADC_L", "AQT ADC_L"}, - {"AQT AMIC2_MUX", "ADC_R", "AQT ADC_R"}, - {"AQT AMIC2_MUX", "ADC_V", "AQT ADC_V"}, - - {"AQT ADC_L", NULL, "AQT AMIC1"}, - {"AQT ADC_R", NULL, "AQT AMIC2"}, - {"AQT ADC_V", NULL, "AQT AMIC3"}, - - {"AQT AMIC10_MUX", "ADC_L", "AQT ADC_L"}, - {"AQT AMIC10_MUX", "ADC_R", "AQT ADC_R"}, - {"AQT AMIC10_MUX", "ADC_V", "AQT ADC_V"}, - - {"AQT AMIC11_MUX", "ADC_L", "AQT ADC_L"}, - {"AQT AMIC11_MUX", "ADC_R", "AQT ADC_R"}, - {"AQT AMIC11_MUX", "ADC_V", "AQT ADC_V"}, - - {"AQT AMIC12_MUX", "ADC_L", "AQT ADC_L"}, - {"AQT AMIC12_MUX", "ADC_R", "AQT ADC_R"}, - {"AQT AMIC12_MUX", "ADC_V", "AQT ADC_V"}, - - {"AQT AMIC13_MUX", "ADC_L", "AQT ADC_L"}, - {"AQT AMIC13_MUX", "ADC_R", "AQT ADC_R"}, - {"AQT AMIC13_MUX", "ADC_V", "AQT ADC_V"}, - - {"AQT ANC OUT HPHL Enable", "Switch", "AQT AMIC10_MUX"}, - {"AQT ANC OUT HPHL Enable", "Switch", "AQT AMIC11_MUX"}, - {"AQT ANC OUT HPHR Enable", "Switch", "AQT AMIC12_MUX"}, - {"AQT ANC OUT HPHR Enable", "Switch", "AQT AMIC13_MUX"}, - - {"AQT RX INT1 MIX2", NULL, "AQT ANC OUT HPHL Enable"}, - {"AQT RX INT2 MIX2", NULL, "AQT ANC OUT HPHR Enable"}, - - {"AQT ANC0 FB MUX", "ANC_IN_HPHL", "AQT RX INT1 MIX2"}, - {"AQT ANC1 FB MUX", "ANC_IN_HPHR", "AQT RX INT2 MIX2"}, - - {"AQT I2S_L RX", NULL, "AQT AIF1 PB"}, - {"AQT I2S_R RX", NULL, "AQT AIF1 PB"}, - - {"AQT RX INT1_1 MUX", "I2S0_L", "AQT I2S_L RX"}, - {"AQT RX INT1_1 MUX", "I2S0_R", "AQT I2S_R RX"}, - {"AQT RX INT1_1 MUX", "DEC_L", "AQT ADC0 MUX"}, - {"AQT RX INT1_1 MUX", "DEC_R", "AQT ADC1 MUX"}, - {"AQT RX INT1_1 MUX", "DEC_V", "AQT ADC2 MUX"}, - - {"AQT RX INT2_1 MUX", "I2S0_L", "AQT I2S_L RX"}, - {"AQT RX INT2_1 MUX", "I2S0_R", "AQT I2S_R RX"}, - {"AQT RX INT2_1 MUX", "DEC_L", "AQT ADC0 MUX"}, - {"AQT RX INT2_1 MUX", "DEC_R", "AQT ADC1 MUX"}, - {"AQT RX INT2_1 MUX", "DEC_V", "AQT ADC2 MUX"}, - - {"AQT RX INT1_2 MUX", "I2S0_L", "AQT I2S_L RX"}, - {"AQT RX INT1_2 MUX", "I2S0_R", "AQT I2S_R RX"}, - {"AQT RX INT1_2 MUX", "DEC_L", "AQT ADC0 MUX"}, - {"AQT RX INT1_2 MUX", "DEC_R", "AQT ADC1 MUX"}, - {"AQT RX INT1_2 MUX", "DEC_V", "AQT ADC2 MUX"}, - {"AQT RX INT1_2 MUX", "IIR0", "AQT IIR0"}, - - {"AQT RX INT2_2 MUX", "I2S0_L", "AQT I2S_L RX"}, - {"AQT RX INT2_2 MUX", "I2S0_R", "AQT I2S_R RX"}, - {"AQT RX INT2_2 MUX", "DEC_L", "AQT ADC0 MUX"}, - {"AQT RX INT2_2 MUX", "DEC_R", "AQT ADC1 MUX"}, - {"AQT RX INT2_2 MUX", "DEC_V", "AQT ADC2 MUX"}, - {"AQT RX INT2_2 MUX", "IIR0", "AQT IIR0"}, - - {"AQT RX INT1_1 INTERP", NULL, "AQT RX INT1_1 MUX"}, - {"AQT RX INT1 MIX1", NULL, "AQT RX INT1_1 INTERP"}, - {"AQT RX INT1 MIX2", NULL, "AQT RX INT1 MIX1"}, - - {"AQT RX INT1_2 INTERP", NULL, "AQT RX INT1_2 MUX"}, - {"AQT RX INT1 MIX1", NULL, "AQT RX INT1_2 INTERP"}, - - {"AQT ASRC0 MUX", "ASRC_IN_HPHL", "AQT RX INT1_2 INTERP"}, - {"AQT RX INT1 MIX1", "HPHL Switch", "AQT ASRC0 MUX"}, - - {"AQT RX INT2_1 INTERP", NULL, "AQT RX INT2_1 MUX"}, - {"AQT RX INT2 MIX1", NULL, "AQT RX INT2_1 INTERP"}, - {"AQT RX INT2 MIX2", NULL, "AQT RX INT2 MIX1"}, - - {"AQT RX INT2_2 INTERP", NULL, "AQT RX INT2_2 MUX"}, - {"AQT RX INT2 MIX1", NULL, "AQT RX INT2_2 INTERP"}, - - {"AQT ASRC1 MUX", "ASRC_IN_HPHR", "AQT RX INT2_2 INTERP"}, - {"AQT RX INT2 MIX1", "HPHR Switch", "AQT ASRC1 MUX"}, - - {"AQT RX INT1 DEM MUX", "CLSH_DSM_OUT", "AQT RX INT1 MIX2"}, - {"AQT RX INT1 DAC", NULL, "AQT RX INT1 DEM MUX"}, - {"AQT RX INT1 DAC", NULL, "AQT RX_BIAS"}, - {"AQT RX_BIAS", NULL, "AQT MCLK"}, - {"AQT MIC BIAS1", NULL, "AQT MCLK"}, - {"AQT HPHL PA", NULL, "AQT RX INT1 DAC"}, - {"AQT HPHL", NULL, "AQT HPHL PA"}, - - {"AQT RX INT2 DEM MUX", "CLSH_DSM_OUT", "AQT RX INT2 MIX2"}, - {"AQT RX INT2 DAC", NULL, "AQT RX INT2 DEM MUX"}, - {"AQT RX INT2 DAC", NULL, "AQT RX_BIAS"}, - {"AQT HPHR PA", NULL, "AQT RX INT2 DAC"}, - {"AQT HPHR", NULL, "AQT HPHR PA"}, - - {"AQT ANC HPHL PA", NULL, "AQT RX INT1 DAC"}, - {"AQT ANC HPHL", NULL, "AQT ANC HPHL PA"}, - - {"AQT ANC HPHR PA", NULL, "AQT RX INT2 DAC"}, - {"AQT ANC HPHR", NULL, "AQT ANC HPHR PA"}, - - {"AQT IIR0", NULL, "AQT ADC2 MUX"}, - {"AQT SRC0", NULL, "AQT IIR0"}, - {"AQT RX ST MUX", "SRC0", "AQT SRC0"}, - - {"AQT RX INT1 MIX2", NULL, "AQT RX ST MUX"}, - {"AQT RX INT2 MIX2", NULL, "AQT RX ST MUX"}, - - /* Native clk main path routing */ - {"AQT RX INT1_1 NATIVE MUX", "ON", "AQT RX INT1_1 MUX"}, - {"AQT RX INT1_1 INTERP", NULL, "AQT RX INT1_1 NATIVE MUX"}, - {"AQT RX INT1_1 NATIVE MUX", NULL, "AQT RX INT1 NATIVE SUPPLY"}, - - {"AQT RX INT2_1 NATIVE MUX", "ON", "AQT RX INT2_1 MUX"}, - {"AQT RX INT2_1 INTERP", NULL, "AQT RX INT2_1 NATIVE MUX"}, - {"AQT RX INT2_1 NATIVE MUX", NULL, "AQT RX INT2 NATIVE SUPPLY"}, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.c b/techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.c deleted file mode 100644 index f1c16de8a686..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.c +++ /dev/null @@ -1,199 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include "aqt1000.h" -#include "aqt1000-utils.h" - -#define REG_BYTES 2 -#define VAL_BYTES 1 -/* - * Page Register Address that APP Proc uses to - * access codec registers is identified as 0x00 - */ -#define PAGE_REG_ADDR 0x00 - -static int aqt_page_write(struct aqt1000 *aqt, unsigned short *reg) -{ - int ret = 0; - unsigned short c_reg, reg_addr; - u8 pg_num, prev_pg_num; - - c_reg = *reg; - pg_num = c_reg >> 8; - reg_addr = c_reg & 0xff; - if (aqt->prev_pg_valid) { - prev_pg_num = aqt->prev_pg; - if (prev_pg_num != pg_num) { - ret = aqt->write_dev( - aqt, PAGE_REG_ADDR, - (void *) &pg_num, 1); - if (ret < 0) - dev_err(aqt->dev, - "%s: page write error, pg_num: 0x%x\n", - __func__, pg_num); - else { - aqt->prev_pg = pg_num; - dev_dbg(aqt->dev, "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - } else { - ret = aqt->write_dev( - aqt, PAGE_REG_ADDR, (void *) &pg_num, 1); - if (ret < 0) - dev_err(aqt->dev, - "%s: page write error, pg_num: 0x%x\n", - __func__, pg_num); - else { - aqt->prev_pg = pg_num; - aqt->prev_pg_valid = true; - dev_dbg(aqt->dev, "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - *reg = reg_addr; - return ret; -} - -static int regmap_bus_read(void *context, const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct aqt1000 *aqt = dev_get_drvdata(dev); - unsigned short c_reg, rreg; - int ret, i; - - if (!aqt) { - dev_err(dev, "%s: aqt is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - - mutex_lock(&aqt->io_lock); - c_reg = *(u16 *)reg; - rreg = c_reg; - - ret = aqt_page_write(aqt, &c_reg); - if (ret) - goto err; - ret = aqt->read_dev(aqt, c_reg, val, val_size); - if (ret < 0) - dev_err(dev, "%s: Codec read failed (%d), reg: 0x%x, size:%zd\n", - __func__, ret, rreg, val_size); - else { - for (i = 0; i < val_size; i++) - dev_dbg(dev, "%s: Read 0x%02x from 0x%x\n", - __func__, ((u8 *)val)[i], rreg + i); - } -err: - mutex_unlock(&aqt->io_lock); - return ret; -} - -static int regmap_bus_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_size) -{ - struct device *dev = context; - struct aqt1000 *aqt = dev_get_drvdata(dev); - unsigned short c_reg, rreg; - int ret, i; - - if (!aqt) { - dev_err(dev, "%s: aqt is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - mutex_lock(&aqt->io_lock); - c_reg = *(u16 *)reg; - rreg = c_reg; - - ret = aqt_page_write(aqt, &c_reg); - if (ret) - goto err; - - for (i = 0; i < val_size; i++) - dev_dbg(dev, "Write %02x to 0x%x\n", ((u8 *)val)[i], - rreg + i); - - ret = aqt->write_dev(aqt, c_reg, (void *) val, val_size); - if (ret < 0) - dev_err(dev, "%s: Codec write failed (%d), reg:0x%x, size:%zd\n", - __func__, ret, rreg, val_size); - -err: - mutex_unlock(&aqt->io_lock); - return ret; -} - -static int regmap_bus_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct aqt1000 *aqt = dev_get_drvdata(dev); - - if (!aqt) - return -EINVAL; - - WARN_ON(count < REG_BYTES); - - return regmap_bus_gather_write(context, data, REG_BYTES, - data + REG_BYTES, - count - REG_BYTES); -} - -static struct regmap_bus regmap_bus_config = { - .write = regmap_bus_write, - .gather_write = regmap_bus_gather_write, - .read = regmap_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -/* - * aqt1000_regmap_init: - * Initialize aqt1000 register map - * - * @dev: pointer to wcd device - * @config: pointer to register map config - * - * Returns pointer to regmap structure for success - * or NULL in case of failure. - */ -struct regmap *aqt1000_regmap_init(struct device *dev, - const struct regmap_config *config) -{ - return devm_regmap_init(dev, ®map_bus_config, dev, config); -} -EXPORT_SYMBOL(aqt1000_regmap_init); diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.h deleted file mode 100644 index 9f68cf12b064..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000-utils.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD9XXX_UTILS_H__ -#define __WCD9XXX_UTILS_H__ - -#include -#include -#include - -struct regmap *aqt1000_regmap_init(struct device *dev, - const struct regmap_config *config); -#endif diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000.c b/techpack/audio/asoc/codecs/aqt1000/aqt1000.c deleted file mode 100644 index 8463d8223060..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000.c +++ /dev/null @@ -1,3470 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "aqt1000-registers.h" -#include "aqt1000.h" -#include "aqt1000-api.h" -#include "aqt1000-mbhc.h" -#include "aqt1000-routing.h" -#include "../wcdcal-hwdep.h" -#include "aqt1000-internal.h" - -#define AQT1000_TX_UNMUTE_DELAY_MS 40 -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define AQT_VERSION_ENTRY_SIZE 17 -#define AQT_VOUT_CTL_TO_MICB(x) (1000 + x *50) - -static struct interp_sample_rate sr_val_tbl[] = { - {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5}, - {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA}, - {176400, 0xB}, {352800, 0xC}, -}; - -static int tx_unmute_delay = AQT1000_TX_UNMUTE_DELAY_MS; -module_param(tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path"); - -static void aqt_codec_set_tx_hold(struct snd_soc_codec *, u16, bool); - -/* Cutoff frequency for high pass filter */ -static const char * const cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ" -}; - -static const char * const rx_cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ", - "CF_NEG_3DB_0P48HZ" -}; - -struct aqt1000_anc_header { - u32 reserved[3]; - u32 num_anc_slots; -}; - -static SOC_ENUM_SINGLE_DECL(cf_dec0_enum, AQT1000_CDC_TX0_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec1_enum, AQT1000_CDC_TX1_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec2_enum, AQT1000_CDC_TX2_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int1_1_enum, AQT1000_CDC_RX1_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int1_2_enum, AQT1000_CDC_RX1_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int2_1_enum, AQT1000_CDC_RX2_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int2_2_enum, AQT1000_CDC_RX2_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const DECLARE_TLV_DB_SCALE(hph_gain, -3000, 150, 0); -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 150, 0); -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -static int aqt_get_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = aqt->anc_slot; - return 0; -} - -static int aqt_put_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - aqt->anc_slot = ucontrol->value.integer.value[0]; - return 0; -} - -static int aqt_get_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = (aqt->anc_func == true ? 1 : 0); - return 0; -} - -static int aqt_put_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - mutex_lock(&aqt->codec_mutex); - aqt->anc_func = (!ucontrol->value.integer.value[0] ? false : true); - dev_dbg(codec->dev, "%s: anc_func %x", __func__, aqt->anc_func); - - if (aqt->anc_func == true) { - snd_soc_dapm_enable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_disable_pin(dapm, "HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "HPHL"); - snd_soc_dapm_disable_pin(dapm, "HPHR"); - } else { - snd_soc_dapm_disable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_enable_pin(dapm, "HPHL"); - snd_soc_dapm_enable_pin(dapm, "HPHR"); - snd_soc_dapm_enable_pin(dapm, "HPHL PA"); - snd_soc_dapm_enable_pin(dapm, "HPHR PA"); - } - mutex_unlock(&aqt->codec_mutex); - - snd_soc_dapm_sync(dapm); - return 0; -} - -static const char *const aqt_anc_func_text[] = {"OFF", "ON"}; -static const struct soc_enum aqt_anc_func_enum = - SOC_ENUM_SINGLE_EXT(2, aqt_anc_func_text); - -static int aqt_rx_hph_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = aqt->hph_mode; - return 0; -} - -static int aqt_rx_hph_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - u32 mode_val; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (mode_val == 0) { - dev_warn(codec->dev, "%s:Invalid HPH Mode, default to Cls-H LOHiFi\n", - __func__); - mode_val = CLS_H_LOHIFI; - } - aqt->hph_mode = mode_val; - return 0; -} - -static const char * const rx_hph_mode_mux_text[] = { - "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", - "CLS_H_ULP", "CLS_AB_HIFI", -}; - -static const struct soc_enum rx_hph_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), - rx_hph_mode_mux_text); - -static int aqt_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = (snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_CTL) & - (1 << band_idx)) != 0; - - dev_dbg(codec->dev, "%s: IIR0 band #%d enable %d\n", __func__, - band_idx, (uint32_t)ucontrol->value.integer.value[0]); - - return 0; -} - -static int aqt_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - bool iir_band_en_status; - int value = ucontrol->value.integer.value[0]; - - /* Mask first 5 bits, 6-8 are reserved */ - snd_soc_update_bits(codec, AQT1000_CDC_SIDETONE_IIR0_IIR_CTL, - (1 << band_idx), (value << band_idx)); - - iir_band_en_status = ((snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_CTL) & - (1 << band_idx)) != 0); - dev_dbg(codec->dev, "%s: IIR0 band #%d enable %d\n", __func__, - band_idx, iir_band_en_status); - - return 0; -} - -static uint32_t aqt_get_iir_band_coeff(struct snd_soc_codec *codec, - int band_idx, int coeff_idx) -{ - uint32_t value = 0; - - /* Address does not automatically update if reading */ - snd_soc_write(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t)) & 0x7F); - - value |= snd_soc_read(codec, AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL); - - snd_soc_write(codec, AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 1) & 0x7F); - - value |= (snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL) << 8); - - snd_soc_write(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 2) & 0x7F); - - value |= (snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL) << 16); - - snd_soc_write(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 3) & 0x7F); - - /* Mask bits top 2 bits since they are reserved */ - value |= ((snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL) - & 0x3F) << 24); - - return value; -} - -static int aqt_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - aqt_get_iir_band_coeff(codec, band_idx, 0); - ucontrol->value.integer.value[1] = - aqt_get_iir_band_coeff(codec, band_idx, 1); - ucontrol->value.integer.value[2] = - aqt_get_iir_band_coeff(codec, band_idx, 2); - ucontrol->value.integer.value[3] = - aqt_get_iir_band_coeff(codec, band_idx, 3); - ucontrol->value.integer.value[4] = - aqt_get_iir_band_coeff(codec, band_idx, 4); - - dev_dbg(codec->dev, "%s: IIR band #%d b0 = 0x%x\n" - "%s: IIR band #%d b1 = 0x%x\n" - "%s: IIR band #%d b2 = 0x%x\n" - "%s: IIR band #%d a1 = 0x%x\n" - "%s: IIR band #%d a2 = 0x%x\n", - __func__, band_idx, - (uint32_t)ucontrol->value.integer.value[0], - __func__, band_idx, - (uint32_t)ucontrol->value.integer.value[1], - __func__, band_idx, - (uint32_t)ucontrol->value.integer.value[2], - __func__, band_idx, - (uint32_t)ucontrol->value.integer.value[3], - __func__, band_idx, - (uint32_t)ucontrol->value.integer.value[4]); - - return 0; -} - -static void aqt_set_iir_band_coeff(struct snd_soc_codec *codec, - int band_idx, uint32_t value) -{ - snd_soc_write(codec, - (AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL), - (value & 0xFF)); - - snd_soc_write(codec, - (AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL), - (value >> 8) & 0xFF); - - snd_soc_write(codec, - (AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL), - (value >> 16) & 0xFF); - - /* Mask top 2 bits, 7-8 are reserved */ - snd_soc_write(codec, - (AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL), - (value >> 24) & 0x3F); -} - -static int aqt_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int coeff_idx; - - /* - * Mask top bit it is reserved - * Updates addr automatically for each B2 write - */ - snd_soc_write(codec, - (AQT1000_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - for (coeff_idx = 0; coeff_idx < AQT1000_CDC_SIDETONE_IIR_COEFF_MAX; - coeff_idx++) { - aqt_set_iir_band_coeff(codec, band_idx, - ucontrol->value.integer.value[coeff_idx]); - } - - dev_dbg(codec->dev, "%s: IIR band #%d b0 = 0x%x\n" - "%s: IIR band #%d b1 = 0x%x\n" - "%s: IIR band #%d b2 = 0x%x\n" - "%s: IIR band #%d a1 = 0x%x\n" - "%s: IIR band #%d a2 = 0x%x\n", - __func__, band_idx, - aqt_get_iir_band_coeff(codec, band_idx, 0), - __func__, band_idx, - aqt_get_iir_band_coeff(codec, band_idx, 1), - __func__, band_idx, - aqt_get_iir_band_coeff(codec, band_idx, 2), - __func__, band_idx, - aqt_get_iir_band_coeff(codec, band_idx, 3), - __func__, band_idx, - aqt_get_iir_band_coeff(codec, band_idx, 4)); - - return 0; -} - -static int aqt_compander_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = aqt->comp_enabled[comp]; - return 0; -} - -static int aqt_compander_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, aqt->comp_enabled[comp], value); - aqt->comp_enabled[comp] = value; - - /* Any specific register configuration for compander */ - switch (comp) { - case COMPANDER_1: - /* Set Gain Source Select based on compander enable/disable */ - snd_soc_update_bits(codec, AQT1000_HPH_L_EN, 0x20, - (value ? 0x00:0x20)); - break; - case COMPANDER_2: - snd_soc_update_bits(codec, AQT1000_HPH_R_EN, 0x20, - (value ? 0x00:0x20)); - break; - default: - /* - * if compander is not enabled for any interpolator, - * it does not cause any audio failure, so do not - * return error in this case, but just print a log - */ - dev_warn(codec->dev, "%s: unknown compander: %d\n", - __func__, comp); - }; - return 0; -} - -static int aqt_hph_asrc_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int index = -EINVAL; - - if (!strcmp(kcontrol->id.name, "AQT ASRC0 Output Mode")) - index = ASRC0; - if (!strcmp(kcontrol->id.name, "AQT ASRC1 Output Mode")) - index = ASRC1; - - if (aqt && (index >= 0) && (index < ASRC_MAX)) - aqt->asrc_output_mode[index] = - ucontrol->value.integer.value[0]; - - return 0; -} - -static int aqt_hph_asrc_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int val = 0; - int index = -EINVAL; - - if (!strcmp(kcontrol->id.name, "AQT ASRC0 Output Mode")) - index = ASRC0; - if (!strcmp(kcontrol->id.name, "AQT ASRC1 Output Mode")) - index = ASRC1; - - if (aqt && (index >= 0) && (index < ASRC_MAX)) - val = aqt->asrc_output_mode[index]; - - ucontrol->value.integer.value[0] = val; - - return 0; -} - -static const char * const asrc_mode_text[] = { - "INT", "FRAC" -}; -static SOC_ENUM_SINGLE_EXT_DECL(asrc_mode_enum, asrc_mode_text); - -static int aqt_hph_idle_detect_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int val = 0; - - if (aqt) - val = aqt->idle_det_cfg.hph_idle_detect_en; - - ucontrol->value.integer.value[0] = val; - - return 0; -} - -static int aqt_hph_idle_detect_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - if (aqt) - aqt->idle_det_cfg.hph_idle_detect_en = - ucontrol->value.integer.value[0]; - - return 0; -} - -static const char * const hph_idle_detect_text[] = { - "OFF", "ON" -}; - -static SOC_ENUM_SINGLE_EXT_DECL(hph_idle_detect_enum, hph_idle_detect_text); - -static int aqt_amic_pwr_lvl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u16 amic_reg = 0; - - if (!strcmp(kcontrol->id.name, "AQT AMIC_1_2 PWR MODE")) - amic_reg = AQT1000_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AQT AMIC_3 PWR MODE")) - amic_reg = AQT1000_ANA_AMIC3; - - if (amic_reg) - ucontrol->value.integer.value[0] = - (snd_soc_read(codec, amic_reg) & - AQT1000_AMIC_PWR_LVL_MASK) >> - AQT1000_AMIC_PWR_LVL_SHIFT; - return 0; -} - -static int aqt_amic_pwr_lvl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u32 mode_val; - u16 amic_reg = 0; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (!strcmp(kcontrol->id.name, "AQT AMIC_1_2 PWR MODE")) - amic_reg = AQT1000_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AQT AMIC_3 PWR MODE")) - amic_reg = AQT1000_ANA_AMIC3; - - if (amic_reg) - snd_soc_update_bits(codec, amic_reg, AQT1000_AMIC_PWR_LVL_MASK, - mode_val << AQT1000_AMIC_PWR_LVL_SHIFT); - return 0; -} - -static const char * const amic_pwr_lvl_text[] = { - "LOW_PWR", "DEFAULT", "HIGH_PERF", "HYBRID" -}; - -static SOC_ENUM_SINGLE_EXT_DECL(amic_pwr_lvl_enum, amic_pwr_lvl_text); - -static const struct snd_kcontrol_new aqt_snd_controls[] = { - SOC_SINGLE_TLV("AQT HPHL Volume", AQT1000_HPH_L_EN, 0, 24, 1, hph_gain), - SOC_SINGLE_TLV("AQT HPHR Volume", AQT1000_HPH_R_EN, 0, 24, 1, hph_gain), - SOC_SINGLE_TLV("AQT ADC1 Volume", AQT1000_ANA_AMIC1, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("AQT ADC2 Volume", AQT1000_ANA_AMIC2, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("AQT ADC3 Volume", AQT1000_ANA_AMIC3, 0, 20, 0, - analog_gain), - - SOC_SINGLE_SX_TLV("AQT RX1 Digital Volume", AQT1000_CDC_RX1_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("AQT RX2 Digital Volume", AQT1000_CDC_RX2_RX_VOL_CTL, - 0, -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("AQT DEC0 Volume", AQT1000_CDC_TX0_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("AQT DEC1 Volume", AQT1000_CDC_TX1_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("AQT DEC2 Volume", AQT1000_CDC_TX2_TX_VOL_CTL, 0, - -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("AQT IIR0 INP0 Volume", - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("AQT IIR0 INP1 Volume", - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("AQT IIR0 INP2 Volume", - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("AQT IIR0 INP3 Volume", - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_EXT("AQT ANC Slot", SND_SOC_NOPM, 0, 100, 0, - aqt_get_anc_slot, aqt_put_anc_slot), - SOC_ENUM_EXT("AQT ANC Function", aqt_anc_func_enum, aqt_get_anc_func, - aqt_put_anc_func), - - SOC_ENUM("AQT TX0 HPF cut off", cf_dec0_enum), - SOC_ENUM("AQT TX1 HPF cut off", cf_dec1_enum), - SOC_ENUM("AQT TX2 HPF cut off", cf_dec2_enum), - - SOC_ENUM("AQT RX INT1_1 HPF cut off", cf_int1_1_enum), - SOC_ENUM("AQT RX INT1_2 HPF cut off", cf_int1_2_enum), - SOC_ENUM("AQT RX INT2_1 HPF cut off", cf_int2_1_enum), - SOC_ENUM("AQT RX INT2_2 HPF cut off", cf_int2_2_enum), - - SOC_ENUM_EXT("AQT RX HPH Mode", rx_hph_mode_mux_enum, - aqt_rx_hph_mode_get, aqt_rx_hph_mode_put), - - SOC_SINGLE_EXT("AQT IIR0 Enable Band1", IIR0, BAND1, 1, 0, - aqt_iir_enable_audio_mixer_get, - aqt_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("AQT IIR0 Enable Band2", IIR0, BAND2, 1, 0, - aqt_iir_enable_audio_mixer_get, - aqt_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("AQT IIR0 Enable Band3", IIR0, BAND3, 1, 0, - aqt_iir_enable_audio_mixer_get, - aqt_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("AQT IIR0 Enable Band4", IIR0, BAND4, 1, 0, - aqt_iir_enable_audio_mixer_get, - aqt_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("AQT IIR0 Enable Band5", IIR0, BAND5, 1, 0, - aqt_iir_enable_audio_mixer_get, - aqt_iir_enable_audio_mixer_put), - - SOC_SINGLE_MULTI_EXT("AQT IIR0 Band1", IIR0, BAND1, 255, 0, 5, - aqt_iir_band_audio_mixer_get, aqt_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("AQT IIR0 Band2", IIR0, BAND2, 255, 0, 5, - aqt_iir_band_audio_mixer_get, aqt_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("AQT IIR0 Band3", IIR0, BAND3, 255, 0, 5, - aqt_iir_band_audio_mixer_get, aqt_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("AQT IIR0 Band4", IIR0, BAND4, 255, 0, 5, - aqt_iir_band_audio_mixer_get, aqt_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("AQT IIR0 Band5", IIR0, BAND5, 255, 0, 5, - aqt_iir_band_audio_mixer_get, aqt_iir_band_audio_mixer_put), - - SOC_SINGLE_EXT("AQT COMP1 Switch", SND_SOC_NOPM, COMPANDER_1, 1, 0, - aqt_compander_get, aqt_compander_put), - SOC_SINGLE_EXT("AQT COMP2 Switch", SND_SOC_NOPM, COMPANDER_2, 1, 0, - aqt_compander_get, aqt_compander_put), - - SOC_ENUM_EXT("AQT ASRC0 Output Mode", asrc_mode_enum, - aqt_hph_asrc_mode_get, aqt_hph_asrc_mode_put), - SOC_ENUM_EXT("AQT ASRC1 Output Mode", asrc_mode_enum, - aqt_hph_asrc_mode_get, aqt_hph_asrc_mode_put), - - SOC_ENUM_EXT("AQT HPH Idle Detect", hph_idle_detect_enum, - aqt_hph_idle_detect_get, aqt_hph_idle_detect_put), - - SOC_ENUM_EXT("AQT AMIC_1_2 PWR MODE", amic_pwr_lvl_enum, - aqt_amic_pwr_lvl_get, aqt_amic_pwr_lvl_put), - SOC_ENUM_EXT("AQT AMIC_3 PWR MODE", amic_pwr_lvl_enum, - aqt_amic_pwr_lvl_get, aqt_amic_pwr_lvl_put), -}; - -static int aqt_codec_enable_rx_bias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - aqt->rx_bias_count++; - if (aqt->rx_bias_count == 1) { - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - 0x01, 0x01); - } - break; - case SND_SOC_DAPM_POST_PMD: - aqt->rx_bias_count--; - if (!aqt->rx_bias_count) - snd_soc_update_bits(codec, AQT1000_ANA_RX_SUPPLIES, - 0x01, 0x00); - break; - }; - dev_dbg(codec->dev, "%s: Current RX BIAS user count: %d\n", __func__, - aqt->rx_bias_count); - - return 0; -} - -/* - * aqt_mbhc_micb_adjust_voltage: adjust specific micbias voltage - * @codec: handle to snd_soc_codec * - * @req_volt: micbias voltage to be set - * @micb_num: micbias to be set, e.g. micbias1 or micbias2 - * - * return 0 if adjustment is success or error code in case of failure - */ -int aqt_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, int micb_num) -{ - struct aqt1000 *aqt; - int cur_vout_ctl, req_vout_ctl; - int micb_reg, micb_val, micb_en; - int ret = 0; - - if (!codec) { - pr_err("%s: Invalid codec pointer\n", __func__); - return -EINVAL; - } - - if (micb_num != MIC_BIAS_1) - return -EINVAL; - else - micb_reg = AQT1000_ANA_MICB1; - - aqt = snd_soc_codec_get_drvdata(codec); - mutex_lock(&aqt->micb_lock); - - /* - * If requested micbias voltage is same as current micbias - * voltage, then just return. Otherwise, adjust voltage as - * per requested value. If micbias is already enabled, then - * to avoid slow micbias ramp-up or down enable pull-up - * momentarily, change the micbias value and then re-enable - * micbias. - */ - micb_val = snd_soc_read(codec, micb_reg); - micb_en = (micb_val & 0xC0) >> 6; - cur_vout_ctl = micb_val & 0x3F; - - req_vout_ctl = aqt_get_micb_vout_ctl_val(req_volt); - if (req_vout_ctl < 0) { - ret = -EINVAL; - goto exit; - } - if (cur_vout_ctl == req_vout_ctl) { - ret = 0; - goto exit; - } - - dev_dbg(codec->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", - __func__, micb_num, AQT_VOUT_CTL_TO_MICB(cur_vout_ctl), - req_volt, micb_en); - - if (micb_en == 0x1) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - - snd_soc_update_bits(codec, micb_reg, 0x3F, req_vout_ctl); - - if (micb_en == 0x1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - /* - * Add 2ms delay as per HW requirement after enabling - * micbias - */ - usleep_range(2000, 2100); - } -exit: - mutex_unlock(&aqt->micb_lock); - - return ret; -} -EXPORT_SYMBOL(aqt_mbhc_micb_adjust_voltage); - -/* - * aqt_micbias_control: enable/disable micbias - * @codec: handle to snd_soc_codec * - * @micb_num: micbias to be enabled/disabled, e.g. micbias1 or micbias2 - * @req: control requested, enable/disable or pullup enable/disable - * @is_dapm: triggered by dapm or not - * - * return 0 if control is success or error code in case of failure - */ -int aqt_micbias_control(struct snd_soc_codec *codec, - int micb_num, int req, bool is_dapm) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - u16 micb_reg; - int pre_off_event = 0, post_off_event = 0; - int post_on_event = 0, post_dapm_off = 0; - int post_dapm_on = 0; - int ret = 0; - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = AQT1000_ANA_MICB1; - pre_off_event = AQT_EVENT_PRE_MICBIAS_1_OFF; - post_off_event = AQT_EVENT_POST_MICBIAS_1_OFF; - post_on_event = AQT_EVENT_POST_MICBIAS_1_ON; - post_dapm_on = AQT_EVENT_POST_DAPM_MICBIAS_1_ON; - post_dapm_off = AQT_EVENT_POST_DAPM_MICBIAS_1_OFF; - break; - default: - dev_err(codec->dev, "%s: Invalid micbias number: %d\n", - __func__, micb_num); - return -EINVAL; - } - mutex_lock(&aqt->micb_lock); - - switch (req) { - case MICB_PULLUP_ENABLE: - aqt->pullup_ref++; - if ((aqt->pullup_ref == 1) && - (aqt->micb_ref == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - break; - case MICB_PULLUP_DISABLE: - if (aqt->pullup_ref > 0) - aqt->pullup_ref--; - if ((aqt->pullup_ref == 0) && - (aqt->micb_ref == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - break; - case MICB_ENABLE: - aqt->micb_ref++; - if (aqt->micb_ref == 1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - if (post_on_event && aqt->mbhc) - blocking_notifier_call_chain( - &aqt->mbhc->notifier, - post_on_event, - &aqt->mbhc->wcd_mbhc); - } - if (is_dapm && post_dapm_on && aqt->mbhc) - blocking_notifier_call_chain(&aqt->mbhc->notifier, - post_dapm_on, &aqt->mbhc->wcd_mbhc); - break; - case MICB_DISABLE: - if (aqt->micb_ref > 0) - aqt->micb_ref--; - if ((aqt->micb_ref == 0) && - (aqt->pullup_ref > 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - else if ((aqt->micb_ref == 0) && - (aqt->pullup_ref == 0)) { - if (pre_off_event && aqt->mbhc) - blocking_notifier_call_chain( - &aqt->mbhc->notifier, - pre_off_event, - &aqt->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - if (post_off_event && aqt->mbhc) - blocking_notifier_call_chain( - &aqt->mbhc->notifier, - post_off_event, - &aqt->mbhc->wcd_mbhc); - } - if (is_dapm && post_dapm_off && aqt->mbhc) - blocking_notifier_call_chain(&aqt->mbhc->notifier, - post_dapm_off, &aqt->mbhc->wcd_mbhc); - break; - default: - dev_err(codec->dev, "%s: Invalid micbias request: %d\n", - __func__, req); - ret = -EINVAL; - break; - }; - - if (!ret) - dev_dbg(codec->dev, - "%s: micb_num:%d, micb_ref: %d, pullup_ref: %d\n", - __func__, micb_num, aqt->micb_ref, aqt->pullup_ref); - - mutex_unlock(&aqt->micb_lock); - - return ret; -} -EXPORT_SYMBOL(aqt_micbias_control); - -static int __aqt_codec_enable_micbias(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "AQT MIC BIAS1", sizeof("AQT MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* - * MIC BIAS can also be requested by MBHC, - * so use ref count to handle micbias pullup - * and enable requests - */ - aqt_micbias_control(codec, micb_num, MICB_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - /* wait for cnp time */ - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - aqt_micbias_control(codec, micb_num, MICB_DISABLE, true); - break; - }; - - return 0; -} - -static int aqt_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return __aqt_codec_enable_micbias(w, event); -} - -static int aqt_codec_enable_i2s_block(struct snd_soc_codec *codec) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&aqt->i2s_lock); - if (++aqt->i2s_users == 1) - snd_soc_update_bits(codec, AQT1000_I2S_I2S_0_CTL, 0x01, 0x01); - mutex_unlock(&aqt->i2s_lock); - - return 0; -} - -static int aqt_codec_disable_i2s_block(struct snd_soc_codec *codec) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&aqt->i2s_lock); - if (--aqt->i2s_users == 0) - snd_soc_update_bits(codec, AQT1000_I2S_I2S_0_CTL, 0x01, 0x00); - - if (aqt->i2s_users < 0) - dev_warn(codec->dev, "%s: i2s_users count (%d) < 0\n", - __func__, aqt->i2s_users); - mutex_unlock(&aqt->i2s_lock); - - return 0; -} - -static int aqt_codec_enable_i2s_tx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - aqt_codec_enable_i2s_block(codec); - break; - case SND_SOC_DAPM_POST_PMD: - aqt_codec_disable_i2s_block(codec); - break; - } - dev_dbg(codec->dev, "%s: event: %d\n", __func__, event); - - return 0; -} - -static int aqt_codec_enable_i2s_rx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - aqt_codec_enable_i2s_block(codec); - break; - case SND_SOC_DAPM_POST_PMD: - aqt_codec_disable_i2s_block(codec); - break; - } - dev_dbg(codec->dev, "%s: event: %d\n", __func__, event); - - return 0; -} - -static const char * const tx_mux_text[] = { - "ZERO", "DEC_L", "DEC_R", "DEC_V", -}; -AQT_DAPM_ENUM(tx0, AQT1000_CDC_IF_ROUTER_TX_MUX_CFG0, 0, tx_mux_text); -AQT_DAPM_ENUM(tx1, AQT1000_CDC_IF_ROUTER_TX_MUX_CFG0, 2, tx_mux_text); - -static const char * const tx_adc_mux_text[] = { - "AMIC", "ANC_FB0", "ANC_FB1", -}; -AQT_DAPM_ENUM(tx_adc0, AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0, - tx_adc_mux_text); -AQT_DAPM_ENUM(tx_adc1, AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0, - tx_adc_mux_text); -AQT_DAPM_ENUM(tx_adc2, AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0, - tx_adc_mux_text); - -static int aqt_find_amic_input(struct snd_soc_codec *codec, int adc_mux_n) -{ - u8 mask; - u16 adc_mux_in_reg = 0, amic_mux_sel_reg = 0; - bool is_amic; - - if (adc_mux_n > 2) - return 0; - - if (adc_mux_n < 3) { - adc_mux_in_reg = AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - adc_mux_n; - mask = 0x03; - amic_mux_sel_reg = AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - 2 * adc_mux_n; - } - is_amic = (((snd_soc_read(codec, adc_mux_in_reg) & mask)) == 0); - if (!is_amic) - return 0; - - return snd_soc_read(codec, amic_mux_sel_reg) & 0x07; -} - -static u16 aqt_codec_get_amic_pwlvl_reg(struct snd_soc_codec *codec, int amic) -{ - u16 pwr_level_reg = 0; - - switch (amic) { - case 1: - case 2: - pwr_level_reg = AQT1000_ANA_AMIC1; - break; - case 3: - pwr_level_reg = AQT1000_ANA_AMIC3; - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic); - break; - } - - return pwr_level_reg; -} - -static void aqt_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work; - struct hpf_work *hpf_work; - struct aqt1000 *aqt; - struct snd_soc_codec *codec; - u16 dec_cfg_reg, amic_reg, go_bit_reg; - u8 hpf_cut_off_freq; - int amic_n; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - aqt = hpf_work->aqt; - codec = aqt->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = AQT1000_CDC_TX0_TX_PATH_CFG0 + 16 * hpf_work->decimator; - go_bit_reg = dec_cfg_reg + 7; - - dev_dbg(codec->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - amic_n = aqt_find_amic_input(codec, hpf_work->decimator); - if (amic_n) { - amic_reg = AQT1000_ANA_AMIC1 + amic_n - 1; - aqt_codec_set_tx_hold(codec, amic_reg, false); - } - snd_soc_update_bits(codec, dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, go_bit_reg, 0x02, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, go_bit_reg, 0x02, 0x00); -} - -static void aqt_tx_mute_update_callback(struct work_struct *work) -{ - struct tx_mute_work *tx_mute_dwork; - struct aqt1000 *aqt; - struct delayed_work *delayed_work; - struct snd_soc_codec *codec; - u16 tx_vol_ctl_reg, hpf_gate_reg; - - delayed_work = to_delayed_work(work); - tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork); - aqt = tx_mute_dwork->aqt; - codec = aqt->codec; - - tx_vol_ctl_reg = AQT1000_CDC_TX0_TX_PATH_CTL + - 16 * tx_mute_dwork->decimator; - hpf_gate_reg = AQT1000_CDC_TX0_TX_PATH_SEC2 + - 16 * tx_mute_dwork->decimator; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); -} - -static int aqt_codec_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - char *widget_name = NULL; - char *dec = NULL; - unsigned int decimator = 0; - u8 amic_n = 0; - u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg; - u16 tx_gain_ctl_reg; - int ret = 0; - u8 hpf_cut_off_freq; - - dev_dbg(codec->dev, "%s: event: %d\n", __func__, event); - widget_name = kstrndup(w->name, 15, GFP_KERNEL); - if (!widget_name) - return -ENOMEM; - - dec = strpbrk(widget_name, "012"); - if (!dec) { - dev_err(codec->dev, "%s: decimator index not found\n", - __func__); - ret = -EINVAL; - goto out; - } - - ret = kstrtouint(dec, 10, &decimator); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, widget_name); - ret = -EINVAL; - goto out; - } - dev_dbg(codec->dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = AQT1000_CDC_TX0_TX_PATH_CTL + 16 * decimator; - hpf_gate_reg = AQT1000_CDC_TX0_TX_PATH_SEC2 + 16 * decimator; - dec_cfg_reg = AQT1000_CDC_TX0_TX_PATH_CFG0 + 16 * decimator; - tx_gain_ctl_reg = AQT1000_CDC_TX0_TX_VOL_CTL + 16 * decimator; - - amic_n = aqt_find_amic_input(codec, decimator); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (amic_n) - pwr_level_reg = aqt_codec_get_amic_pwlvl_reg(codec, - amic_n); - if (pwr_level_reg) { - switch ((snd_soc_read(codec, pwr_level_reg) & - AQT1000_AMIC_PWR_LVL_MASK) >> - AQT1000_AMIC_PWR_LVL_SHIFT) { - case AQT1000_AMIC_PWR_LEVEL_LP: - snd_soc_update_bits(codec, dec_cfg_reg, - AQT1000_DEC_PWR_LVL_MASK, - AQT1000_DEC_PWR_LVL_LP); - break; - - case AQT1000_AMIC_PWR_LEVEL_HP: - snd_soc_update_bits(codec, dec_cfg_reg, - AQT1000_DEC_PWR_LVL_MASK, - AQT1000_DEC_PWR_LVL_HP); - break; - case AQT1000_AMIC_PWR_LEVEL_DEFAULT: - default: - snd_soc_update_bits(codec, dec_cfg_reg, - AQT1000_DEC_PWR_LVL_MASK, - AQT1000_DEC_PWR_LVL_DF); - break; - } - } - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - - aqt->tx_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per - * HW spec. - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x00); - } - /* schedule work queue to Remove Mute */ - schedule_delayed_work(&aqt->tx_mute_dwork[decimator].dwork, - msecs_to_jiffies(tx_unmute_delay)); - if (aqt->tx_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) - schedule_delayed_work( - &aqt->tx_hpf_work[decimator].dwork, - msecs_to_jiffies(300)); - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, tx_gain_ctl_reg)); - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - aqt->tx_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &aqt->tx_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per - * HW spec. - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x00); - } - } - cancel_delayed_work_sync( - &aqt->tx_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - snd_soc_update_bits(codec, dec_cfg_reg, - AQT1000_DEC_PWR_LVL_MASK, - AQT1000_DEC_PWR_LVL_DF); - break; - } - -out: - kfree(widget_name); - return ret; -} - -static const char * const tx_amic_text[] = { - "ZERO", "ADC_L", "ADC_R", "ADC_V", -}; -AQT_DAPM_ENUM(tx_amic0, AQT1000_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, tx_amic_text); -AQT_DAPM_ENUM(tx_amic1, AQT1000_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, tx_amic_text); -AQT_DAPM_ENUM(tx_amic2, AQT1000_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, tx_amic_text); - -AQT_DAPM_ENUM(tx_amic10, AQT1000_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0, - tx_amic_text); -AQT_DAPM_ENUM(tx_amic11, AQT1000_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0, - tx_amic_text); -AQT_DAPM_ENUM(tx_amic12, AQT1000_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 0, - tx_amic_text); -AQT_DAPM_ENUM(tx_amic13, AQT1000_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 0, - tx_amic_text); - -static int aqt_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - aqt_codec_set_tx_hold(codec, w->reg, true); - break; - default: - break; - } - - return 0; -} - -static const struct snd_kcontrol_new anc_hphl_pa_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_hphr_pa_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static int aqt_config_compander(struct snd_soc_codec *codec, int interp_n, - int event) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int comp; - u16 comp_ctl0_reg, rx_path_cfg0_reg; - - comp = interp_n; - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp, aqt->comp_enabled[comp]); - - if (!aqt->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = AQT1000_CDC_COMPANDER1_CTL0 + (comp * 8); - rx_path_cfg0_reg = AQT1000_CDC_RX1_RX_PATH_CFG0 + (comp * 20); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -static void aqt_codec_idle_detect_control(struct snd_soc_codec *codec, - int interp, int event) -{ - int reg = 0, mask, val; - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - if (!aqt->idle_det_cfg.hph_idle_detect_en) - return; - - if (interp == INTERP_HPHL) { - reg = AQT1000_CDC_RX_IDLE_DET_PATH_CTL; - mask = 0x01; - val = 0x01; - } - if (interp == INTERP_HPHR) { - reg = AQT1000_CDC_RX_IDLE_DET_PATH_CTL; - mask = 0x02; - val = 0x02; - } - - if (reg && SND_SOC_DAPM_EVENT_ON(event)) - snd_soc_update_bits(codec, reg, mask, val); - - if (reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, reg, mask, 0x00); - aqt->idle_det_cfg.hph_idle_thr = 0; - snd_soc_write(codec, AQT1000_CDC_RX_IDLE_DET_CFG3, 0x0); - } -} - -static void aqt_codec_hphdelay_lutbypass(struct snd_soc_codec *codec, - u16 interp_idx, int event) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - u8 hph_dly_mask; - u16 hph_lut_bypass_reg = 0; - u16 hph_comp_ctrl7 = 0; - - - switch (interp_idx) { - case INTERP_HPHL: - hph_dly_mask = 1; - hph_lut_bypass_reg = AQT1000_CDC_TOP_HPHL_COMP_LUT; - hph_comp_ctrl7 = AQT1000_CDC_COMPANDER1_CTL7; - break; - case INTERP_HPHR: - hph_dly_mask = 2; - hph_lut_bypass_reg = AQT1000_CDC_TOP_HPHR_COMP_LUT; - hph_comp_ctrl7 = AQT1000_CDC_COMPANDER2_CTL7; - break; - default: - break; - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, AQT1000_CDC_CLSH_TEST0, - hph_dly_mask, 0x0); - snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x80); - if (aqt->hph_mode == CLS_H_ULP) - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x20); - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, AQT1000_CDC_CLSH_TEST0, - hph_dly_mask, hph_dly_mask); - snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x00); - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x0); - } -} - -static int aqt_codec_enable_interp_clk(struct snd_soc_codec *codec, - int event, int interp_idx) -{ - struct aqt1000 *aqt; - u16 main_reg, dsm_reg; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - aqt = snd_soc_codec_get_drvdata(codec); - main_reg = AQT1000_CDC_RX1_RX_PATH_CTL + (interp_idx * 20); - dsm_reg = AQT1000_CDC_RX1_RX_PATH_DSMDEM_CTL + (interp_idx * 20); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - if (aqt->main_clk_users[interp_idx] == 0) { - /* Main path PGA mute enable */ - snd_soc_update_bits(codec, main_reg, 0x10, 0x10); - /* Clk enable */ - snd_soc_update_bits(codec, dsm_reg, 0x01, 0x01); - snd_soc_update_bits(codec, main_reg, 0x20, 0x20); - aqt_codec_idle_detect_control(codec, interp_idx, - event); - aqt_codec_hphdelay_lutbypass(codec, interp_idx, - event); - aqt_config_compander(codec, interp_idx, event); - } - aqt->main_clk_users[interp_idx]++; - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - aqt->main_clk_users[interp_idx]--; - if (aqt->main_clk_users[interp_idx] <= 0) { - aqt->main_clk_users[interp_idx] = 0; - aqt_config_compander(codec, interp_idx, event); - aqt_codec_hphdelay_lutbypass(codec, interp_idx, - event); - aqt_codec_idle_detect_control(codec, interp_idx, - event); - /* Clk Disable */ - snd_soc_update_bits(codec, main_reg, 0x20, 0x00); - snd_soc_update_bits(codec, dsm_reg, 0x01, 0x00); - /* Reset enable and disable */ - snd_soc_update_bits(codec, main_reg, 0x40, 0x40); - snd_soc_update_bits(codec, main_reg, 0x40, 0x00); - /* Reset rate to 48K*/ - snd_soc_update_bits(codec, main_reg, 0x0F, 0x04); - } - } - - dev_dbg(codec->dev, "%s event %d main_clk_users %d\n", - __func__, event, aqt->main_clk_users[interp_idx]); - - return aqt->main_clk_users[interp_idx]; -} - -static int aqt_anc_out_switch_cb(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - aqt_codec_enable_interp_clk(codec, event, w->shift); - - return 0; -} - -static const char * const anc0_fb_mux_text[] = { - "ZERO", "ANC_IN_HPHL", -}; - -static const char * const anc1_fb_mux_text[] = { - "ZERO", "ANC_IN_HPHR", -}; - -AQT_DAPM_ENUM(anc0_fb, AQT1000_CDC_RX_INP_MUX_ANC_CFG0, 0, anc0_fb_mux_text); -AQT_DAPM_ENUM(anc1_fb, AQT1000_CDC_RX_INP_MUX_ANC_CFG0, 3, anc1_fb_mux_text); - -static const char *const rx_int1_1_mux_text[] = { - "ZERO", "MAIN_DMA_L", "I2S0_L", "I2S0_R", "DEC_L", "DEC_R", "DEC_V", - "SHADOW_I2S0_L", "MAIN_DMA_R" -}; - -static const char *const rx_int1_2_mux_text[] = { - "ZERO", "MIX_DMA_L", "I2S0_L", "I2S0_R", "DEC_L", "DEC_R", "DEC_V", - "IIR0", "MIX_DMA_R" -}; - -static const char *const rx_int2_1_mux_text[] = { - "ZERO", "MAIN_DMA_R", "I2S0_L", "I2S0_R", "DEC_L", "DEC_R", "DEC_V", - "SHADOW_I2S0_R", "MAIN_DMA_L" -}; - -static const char *const rx_int2_2_mux_text[] = { - "ZERO", "MIX_DMA_R", "I2S0_L", "I2S0_R", "DEC_L", "DEC_R", "DEC_V", - "IIR0", "MIX_DMA_L" -}; - -AQT_DAPM_ENUM(rx_int1_1, AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, - rx_int1_1_mux_text); -AQT_DAPM_ENUM(rx_int1_2, AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, - rx_int1_2_mux_text); -AQT_DAPM_ENUM(rx_int2_1, AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, - rx_int2_1_mux_text); -AQT_DAPM_ENUM(rx_int2_2, AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, - rx_int2_2_mux_text); - -static int aqt_codec_set_idle_detect_thr(struct snd_soc_codec *codec, - int interp, int path_type) -{ - int port_id[4] = { 0, 0, 0, 0 }; - int *port_ptr, num_ports; - int bit_width = 0; - int mux_reg = 0, mux_reg_val = 0; - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int idle_thr; - - if ((interp != INTERP_HPHL) && (interp != INTERP_HPHR)) - return 0; - - if (!aqt->idle_det_cfg.hph_idle_detect_en) - return 0; - - port_ptr = &port_id[0]; - num_ports = 0; - - if (path_type == INTERP_MIX_PATH) { - if (interp == INTERP_HPHL) - mux_reg = AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG1; - else - mux_reg = AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG1; - } - - if (path_type == INTERP_MAIN_PATH) { - if (interp == INTERP_HPHL) - mux_reg = AQT1000_CDC_RX_INP_MUX_RX_INT1_CFG0; - else - mux_reg = AQT1000_CDC_RX_INP_MUX_RX_INT2_CFG0; - } - mux_reg_val = snd_soc_read(codec, mux_reg); - - /* Read bit width from I2S reg if mux is set to I2S0_L or I2S0_R */ - if (mux_reg_val == 0x02 || mux_reg_val == 0x03) - bit_width = ((snd_soc_read(codec, AQT1000_I2S_I2S_0_CTL) & - 0x40) >> 6); - - switch (bit_width) { - case 1: /* 16 bit */ - idle_thr = 0xff; /* F16 */ - break; - case 0: /* 32 bit */ - default: - idle_thr = 0x03; /* F22 */ - break; - } - - dev_dbg(codec->dev, "%s: (new) idle_thr: %d, (cur) idle_thr: %d\n", - __func__, idle_thr, aqt->idle_det_cfg.hph_idle_thr); - - if ((aqt->idle_det_cfg.hph_idle_thr == 0) || - (idle_thr < aqt->idle_det_cfg.hph_idle_thr)) { - snd_soc_write(codec, AQT1000_CDC_RX_IDLE_DET_CFG3, idle_thr); - aqt->idle_det_cfg.hph_idle_thr = idle_thr; - } - - return 0; -} - -static int aqt_codec_enable_main_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg = 0; - int val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (w->shift >= AQT1000_NUM_INTERPOLATORS) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - }; - - gain_reg = AQT1000_CDC_RX1_RX_VOL_CTL + (w->shift * - AQT1000_RX_PATH_CTL_OFFSET); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - aqt_codec_enable_interp_clk(codec, event, w->shift); - break; - case SND_SOC_DAPM_POST_PMU: - aqt_codec_set_idle_detect_thr(codec, w->shift, - INTERP_MAIN_PATH); - /* apply gain after int clk is enabled */ - val = snd_soc_read(codec, gain_reg); - snd_soc_write(codec, gain_reg, val); - break; - case SND_SOC_DAPM_POST_PMD: - aqt_codec_enable_interp_clk(codec, event, w->shift); - break; - }; - - return 0; -} - -static int aqt_codec_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg = 0; - u16 mix_reg = 0; - - if (w->shift >= AQT1000_NUM_INTERPOLATORS) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - }; - gain_reg = AQT1000_CDC_RX1_RX_VOL_MIX_CTL + - (w->shift * AQT1000_RX_PATH_CTL_OFFSET); - mix_reg = AQT1000_CDC_RX1_RX_PATH_MIX_CTL + - (w->shift * AQT1000_RX_PATH_CTL_OFFSET); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - aqt_codec_enable_interp_clk(codec, event, w->shift); - /* Clk enable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x20); - break; - case SND_SOC_DAPM_POST_PMU: - aqt_codec_set_idle_detect_thr(codec, w->shift, - INTERP_MIX_PATH); - break; - case SND_SOC_DAPM_POST_PMD: - /* Clk Disable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x00); - aqt_codec_enable_interp_clk(codec, event, w->shift); - /* Reset enable and disable */ - snd_soc_update_bits(codec, mix_reg, 0x40, 0x40); - snd_soc_update_bits(codec, mix_reg, 0x40, 0x00); - - break; - }; - dev_dbg(codec->dev, "%s event %d name %s\n", __func__, event, w->name); - - return 0; -} - -static const char * const rx_int1_1_interp_mux_text[] = { - "ZERO", "RX INT1_1 MUX", -}; - -static const char * const rx_int2_1_interp_mux_text[] = { - "ZERO", "RX INT2_1 MUX", -}; - -static const char * const rx_int1_2_interp_mux_text[] = { - "ZERO", "RX INT1_2 MUX", -}; - -static const char * const rx_int2_2_interp_mux_text[] = { - "ZERO", "RX INT2_2 MUX", -}; - -AQT_DAPM_ENUM(rx_int1_1_interp, SND_SOC_NOPM, 0, rx_int1_1_interp_mux_text); -AQT_DAPM_ENUM(rx_int2_1_interp, SND_SOC_NOPM, 0, rx_int2_1_interp_mux_text); - -AQT_DAPM_ENUM(rx_int1_2_interp, SND_SOC_NOPM, 0, rx_int1_2_interp_mux_text); -AQT_DAPM_ENUM(rx_int2_2_interp, SND_SOC_NOPM, 0, rx_int2_2_interp_mux_text); - -static const char * const asrc0_mux_text[] = { - "ZERO", "ASRC_IN_HPHL", -}; - -static const char * const asrc1_mux_text[] = { - "ZERO", "ASRC_IN_HPHR", -}; - -AQT_DAPM_ENUM(asrc0, AQT1000_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 0, - asrc0_mux_text); -AQT_DAPM_ENUM(asrc1, AQT1000_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 2, - asrc1_mux_text); - -static int aqt_get_asrc_mode(struct aqt1000 *aqt, int asrc, - u8 main_sr, u8 mix_sr) -{ - u8 asrc_output_mode; - int asrc_mode = CONV_88P2K_TO_384K; - - if ((asrc < 0) || (asrc >= ASRC_MAX)) - return 0; - - asrc_output_mode = aqt->asrc_output_mode[asrc]; - - if (asrc_output_mode) { - /* - * If Mix sample rate is < 96KHz, use 96K to 352.8K - * conversion, or else use 384K to 352.8K conversion - */ - if (mix_sr < 5) - asrc_mode = CONV_96K_TO_352P8K; - else - asrc_mode = CONV_384K_TO_352P8K; - } else { - /* Integer main and Fractional mix path */ - if (main_sr < 8 && mix_sr > 9) { - asrc_mode = CONV_352P8K_TO_384K; - } else if (main_sr > 8 && mix_sr < 8) { - /* Fractional main and Integer mix path */ - if (mix_sr < 5) - asrc_mode = CONV_96K_TO_352P8K; - else - asrc_mode = CONV_384K_TO_352P8K; - } else if (main_sr < 8 && mix_sr < 8) { - /* Integer main and Integer mix path */ - asrc_mode = CONV_96K_TO_384K; - } - } - - return asrc_mode; -} - -static int aqt_codec_enable_asrc_resampler(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int asrc = 0, ret = 0; - u8 cfg; - u16 cfg_reg = 0; - u16 ctl_reg = 0; - u16 clk_reg = 0; - u16 asrc_ctl = 0; - u16 mix_ctl_reg = 0; - u16 paired_reg = 0; - u8 main_sr, mix_sr, asrc_mode = 0; - - cfg = snd_soc_read(codec, AQT1000_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0); - if (!(cfg & 0xFF)) { - dev_err(codec->dev, "%s: ASRC%u input not selected\n", - __func__, w->shift); - return -EINVAL; - } - - switch (w->shift) { - case ASRC0: - if ((cfg & 0x03) == 0x01) { - cfg_reg = AQT1000_CDC_RX1_RX_PATH_CFG0; - ctl_reg = AQT1000_CDC_RX1_RX_PATH_CTL; - clk_reg = AQT1000_MIXING_ASRC0_CLK_RST_CTL; - paired_reg = AQT1000_MIXING_ASRC1_CLK_RST_CTL; - asrc_ctl = AQT1000_MIXING_ASRC0_CTL1; - } - break; - case ASRC1: - if ((cfg & 0x0C) == 0x4) { - cfg_reg = AQT1000_CDC_RX2_RX_PATH_CFG0; - ctl_reg = AQT1000_CDC_RX2_RX_PATH_CTL; - clk_reg = AQT1000_MIXING_ASRC1_CLK_RST_CTL; - paired_reg = AQT1000_MIXING_ASRC0_CLK_RST_CTL; - asrc_ctl = AQT1000_MIXING_ASRC1_CTL1; - } - break; - default: - dev_err(codec->dev, "%s: Invalid asrc:%u\n", __func__, - w->shift); - ret = -EINVAL; - break; - }; - - if ((cfg_reg == 0) || (ctl_reg == 0) || (clk_reg == 0) || - (asrc_ctl == 0) || ret) - goto done; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if ((snd_soc_read(codec, clk_reg) & 0x02) || - (snd_soc_read(codec, paired_reg) & 0x02)) { - snd_soc_update_bits(codec, clk_reg, 0x02, 0x00); - snd_soc_update_bits(codec, paired_reg, 0x02, 0x00); - } - snd_soc_update_bits(codec, cfg_reg, 0x80, 0x80); - snd_soc_update_bits(codec, clk_reg, 0x01, 0x01); - main_sr = snd_soc_read(codec, ctl_reg) & 0x0F; - mix_ctl_reg = ctl_reg + 5; - mix_sr = snd_soc_read(codec, mix_ctl_reg) & 0x0F; - asrc_mode = aqt_get_asrc_mode(aqt, asrc, - main_sr, mix_sr); - dev_dbg(codec->dev, "%s: main_sr:%d mix_sr:%d asrc_mode %d\n", - __func__, main_sr, mix_sr, asrc_mode); - snd_soc_update_bits(codec, asrc_ctl, 0x07, asrc_mode); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, asrc_ctl, 0x07, 0x00); - snd_soc_update_bits(codec, cfg_reg, 0x80, 0x00); - snd_soc_update_bits(codec, clk_reg, 0x03, 0x02); - break; - }; - -done: - return ret; -} - -static int aqt_codec_enable_anc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - const char *filename; - const struct firmware *fw; - int i; - int ret = 0; - int num_anc_slots; - struct aqt1000_anc_header *anc_head; - struct firmware_cal *hwdep_cal = NULL; - u32 anc_writes_size = 0; - u32 anc_cal_size = 0; - int anc_size_remaining; - u32 *anc_ptr; - u16 reg; - u8 mask, val; - size_t cal_size; - const void *data; - - if (!aqt->anc_func) - return 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - hwdep_cal = wcdcal_get_fw_cal(aqt->fw_data, WCD9XXX_ANC_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration, cal_size %zd", - __func__, cal_size); - } else { - filename = "AQT1000/AQT1000_anc.bin"; - ret = request_firmware(&fw, filename, codec->dev); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to acquire ANC data: %d\n", - __func__, ret); - return ret; - } - if (!fw) { - dev_err(codec->dev, "%s: Failed to get anc fw\n", - __func__); - return -ENODEV; - } - data = fw->data; - cal_size = fw->size; - dev_dbg(codec->dev, "%s: using request_firmware calibration\n", - __func__); - } - if (cal_size < sizeof(struct aqt1000_anc_header)) { - dev_err(codec->dev, "%s: Invalid cal_size %zd\n", - __func__, cal_size); - ret = -EINVAL; - goto err; - } - /* First number is the number of register writes */ - anc_head = (struct aqt1000_anc_header *)(data); - anc_ptr = (u32 *)(data + sizeof(struct aqt1000_anc_header)); - anc_size_remaining = cal_size - - sizeof(struct aqt1000_anc_header); - num_anc_slots = anc_head->num_anc_slots; - - if (aqt->anc_slot >= num_anc_slots) { - dev_err(codec->dev, "%s: Invalid ANC slot selected\n", - __func__); - ret = -EINVAL; - goto err; - } - for (i = 0; i < num_anc_slots; i++) { - if (anc_size_remaining < AQT1000_PACKED_REG_SIZE) { - dev_err(codec->dev, "%s: Invalid register format\n", - __func__); - ret = -EINVAL; - goto err; - } - anc_writes_size = (u32)(*anc_ptr); - anc_size_remaining -= sizeof(u32); - anc_ptr += 1; - - if ((anc_writes_size * AQT1000_PACKED_REG_SIZE) > - anc_size_remaining) { - dev_err(codec->dev, "%s: Invalid register format\n", - __func__); - ret = -EINVAL; - goto err; - } - - if (aqt->anc_slot == i) - break; - - anc_size_remaining -= (anc_writes_size * - AQT1000_PACKED_REG_SIZE); - anc_ptr += anc_writes_size; - } - if (i == num_anc_slots) { - dev_err(codec->dev, "%s: Selected ANC slot not present\n", - __func__); - ret = -EINVAL; - goto err; - } - - i = 0; - anc_cal_size = anc_writes_size; - /* Rate converter clk enable and set bypass mode */ - if (!strcmp(w->name, "AQT RX INT1 DAC")) { - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_RC_COMMON_CTL, - 0x05, 0x05); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_FIFO_COMMON_CTL, - 0x66, 0x66); - anc_writes_size = anc_cal_size / 2; - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_CLK_RESET_CTL, 0x39, 0x39); - } else if (!strcmp(w->name, "AQT RX INT2 DAC")) { - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_RC_COMMON_CTL, - 0x05, 0x05); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_FIFO_COMMON_CTL, - 0x66, 0x66); - i = anc_cal_size / 2; - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_CLK_RESET_CTL, 0x39, 0x39); - } - - for (; i < anc_writes_size; i++) { - AQT1000_CODEC_UNPACK_ENTRY(anc_ptr[i], reg, mask, val); - snd_soc_write(codec, reg, (val & mask)); - } - if (!strcmp(w->name, "AQT RX INT1 DAC")) - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_CLK_RESET_CTL, 0x08, 0x08); - else if (!strcmp(w->name, "AQT RX INT2 DAC")) - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_CLK_RESET_CTL, 0x08, 0x08); - - if (!hwdep_cal) - release_firmware(fw); - break; - - case SND_SOC_DAPM_POST_PMU: - /* Remove ANC Rx from reset */ - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_CLK_RESET_CTL, - 0x08, 0x00); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_CLK_RESET_CTL, - 0x08, 0x00); - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, AQT1000_CDC_ANC0_RC_COMMON_CTL, - 0x05, 0x00); - if (!strcmp(w->name, "AQT ANC HPHL PA")) { - snd_soc_update_bits(codec, AQT1000_CDC_ANC0_MODE_1_CTL, - 0x30, 0x00); - /* 50 msec sleep is needed to avoid click and pop as - * per HW requirement - */ - msleep(50); - snd_soc_update_bits(codec, AQT1000_CDC_ANC0_MODE_1_CTL, - 0x01, 0x00); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_CLK_RESET_CTL, - 0x38, 0x38); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_CLK_RESET_CTL, - 0x07, 0x00); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC0_CLK_RESET_CTL, - 0x38, 0x00); - } else if (!strcmp(w->name, "AQT ANC HPHR PA")) { - snd_soc_update_bits(codec, AQT1000_CDC_ANC1_MODE_1_CTL, - 0x30, 0x00); - /* 50 msec sleep is needed to avoid click and pop as - * per HW requirement - */ - msleep(50); - snd_soc_update_bits(codec, AQT1000_CDC_ANC1_MODE_1_CTL, - 0x01, 0x00); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_CLK_RESET_CTL, - 0x38, 0x38); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_CLK_RESET_CTL, - 0x07, 0x00); - snd_soc_update_bits(codec, - AQT1000_CDC_ANC1_CLK_RESET_CTL, - 0x38, 0x00); - } - break; - } - - return 0; -err: - if (!hwdep_cal) - release_firmware(fw); - return ret; -} - -static void aqt_codec_override(struct snd_soc_codec *codec, int mode, - int event) -{ - if (mode == CLS_AB || mode == CLS_AB_HIFI) { - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - AQT1000_ANA_RX_SUPPLIES, 0x02, 0x02); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - AQT1000_ANA_RX_SUPPLIES, 0x02, 0x00); - break; - } - } -} - -static void aqt_codec_set_tx_hold(struct snd_soc_codec *codec, - u16 amic_reg, bool set) -{ - u8 mask = 0x20; - u8 val; - - if (amic_reg == AQT1000_ANA_AMIC1 || - amic_reg == AQT1000_ANA_AMIC3) - mask = 0x40; - - val = set ? mask : 0x00; - - switch (amic_reg) { - case AQT1000_ANA_AMIC1: - case AQT1000_ANA_AMIC2: - snd_soc_update_bits(codec, AQT1000_ANA_AMIC2, mask, val); - break; - case AQT1000_ANA_AMIC3: - snd_soc_update_bits(codec, AQT1000_ANA_AMIC3_HPF, mask, val); - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic_reg); - break; - } -} - -static void aqt_codec_clear_anc_tx_hold(struct aqt1000 *aqt) -{ - if (test_and_clear_bit(ANC_MIC_AMIC1, &aqt->status_mask)) - aqt_codec_set_tx_hold(aqt->codec, AQT1000_ANA_AMIC1, false); - if (test_and_clear_bit(ANC_MIC_AMIC2, &aqt->status_mask)) - aqt_codec_set_tx_hold(aqt->codec, AQT1000_ANA_AMIC2, false); - if (test_and_clear_bit(ANC_MIC_AMIC3, &aqt->status_mask)) - aqt_codec_set_tx_hold(aqt->codec, AQT1000_ANA_AMIC3, false); -} - -static const char * const rx_int_dem_inp_mux_text[] = { - "NORMAL_DSM_OUT", "CLSH_DSM_OUT", -}; - -static int aqt_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - unsigned short look_ahead_dly_reg = AQT1000_CDC_RX1_RX_PATH_CFG0; - - val = ucontrol->value.enumerated.item[0]; - if (val >= e->items) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - if (e->reg == AQT1000_CDC_RX1_RX_PATH_SEC0) - look_ahead_dly_reg = AQT1000_CDC_RX1_RX_PATH_CFG0; - else if (e->reg == AQT1000_CDC_RX2_RX_PATH_SEC0) - look_ahead_dly_reg = AQT1000_CDC_RX2_RX_PATH_CFG0; - - /* Set Look Ahead Delay */ - snd_soc_update_bits(codec, look_ahead_dly_reg, - 0x08, (val ? 0x08 : 0x00)); - /* Set DEM INP Select */ - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -AQT_DAPM_ENUM_EXT(rx_int1_dem, AQT1000_CDC_RX1_RX_PATH_SEC0, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - aqt_int_dem_inp_mux_put); -AQT_DAPM_ENUM_EXT(rx_int2_dem, AQT1000_CDC_RX2_RX_PATH_SEC0, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - aqt_int_dem_inp_mux_put); - -static int aqt_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int hph_mode = aqt->hph_mode; - u8 dem_inp; - int ret = 0; - uint32_t impedl = 0; - uint32_t impedr = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d hph_mode: %d\n", __func__, - w->name, event, hph_mode); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (aqt->anc_func) { - ret = aqt_codec_enable_anc(w, kcontrol, event); - /* 40 msec delay is needed to avoid click and pop */ - msleep(40); - } - /* Read DEM INP Select */ - dem_inp = snd_soc_read(codec, AQT1000_CDC_RX1_RX_PATH_SEC0) & - 0x03; - if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) || - (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) { - dev_err(codec->dev, "%s: DEM Input not set correctly, hph_mode: %d\n", - __func__, hph_mode); - return -EINVAL; - } - /* Disable AutoChop timer during power up */ - snd_soc_update_bits(codec, AQT1000_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - - aqt_clsh_fsm(codec, &aqt->clsh_d, - AQT_CLSH_EVENT_PRE_DAC, - AQT_CLSH_STATE_HPHL, - hph_mode); - - if (aqt->anc_func) - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_CFG0, - 0x10, 0x10); - - ret = aqt_mbhc_get_impedance(aqt->mbhc, - &impedl, &impedr); - if (!ret) { - aqt_clsh_imped_config(codec, impedl, false); - set_bit(CLSH_Z_CONFIG, &aqt->status_mask); - } else { - dev_dbg(codec->dev, "%s: Failed to get mbhc impedance %d\n", - __func__, ret); - ret = 0; - } - break; - case SND_SOC_DAPM_POST_PMD: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - aqt_clsh_fsm(codec, &aqt->clsh_d, - AQT_CLSH_EVENT_POST_PA, - AQT_CLSH_STATE_HPHL, - hph_mode); - if (test_bit(CLSH_Z_CONFIG, &aqt->status_mask)) { - aqt_clsh_imped_config(codec, impedl, true); - clear_bit(CLSH_Z_CONFIG, &aqt->status_mask); - } - break; - default: - break; - }; - - return ret; -} - -static int aqt_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int hph_mode = aqt->hph_mode; - u8 dem_inp; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d hph_mode: %d\n", __func__, - w->name, event, hph_mode); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (aqt->anc_func) { - ret = aqt_codec_enable_anc(w, kcontrol, event); - /* 40 msec delay is needed to avoid click and pop */ - msleep(40); - } - /* Read DEM INP Select */ - dem_inp = snd_soc_read(codec, AQT1000_CDC_RX2_RX_PATH_SEC0) & - 0x03; - if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) || - (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) { - dev_err(codec->dev, "%s: DEM Input not set correctly, hph_mode: %d\n", - __func__, hph_mode); - return -EINVAL; - } - /* Disable AutoChop timer during power up */ - snd_soc_update_bits(codec, AQT1000_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - aqt_clsh_fsm(codec, &aqt->clsh_d, - AQT_CLSH_EVENT_PRE_DAC, - AQT_CLSH_STATE_HPHR, - hph_mode); - if (aqt->anc_func) - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_CFG0, - 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - aqt_clsh_fsm(codec, &aqt->clsh_d, - AQT_CLSH_EVENT_POST_PA, - AQT_CLSH_STATE_HPHR, - hph_mode); - break; - default: - break; - }; - - return 0; -} - -static int aqt_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if ((!(strcmp(w->name, "AQT ANC HPHR PA"))) && - (test_bit(HPH_PA_DELAY, &aqt->status_mask))) - snd_soc_update_bits(codec, AQT1000_ANA_HPH, 0xC0, 0xC0); - - set_bit(HPH_PA_DELAY, &aqt->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - if ((!(strcmp(w->name, "AQT ANC HPHR PA")))) { - if ((snd_soc_read(codec, AQT1000_ANA_HPH) & 0xC0) - != 0xC0) - /* - * If PA_EN is not set (potentially in ANC case) - * then do nothing for POST_PMU and let left - * channel handle everything. - */ - break; - } - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is needed. - */ - if (test_bit(HPH_PA_DELAY, &aqt->status_mask)) { - if (!aqt->comp_enabled[COMPANDER_2]) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &aqt->status_mask); - } - if (aqt->anc_func) { - /* Clear Tx FE HOLD if both PAs are enabled */ - if ((snd_soc_read(aqt->codec, AQT1000_ANA_HPH) & - 0xC0) == 0xC0) - aqt_codec_clear_anc_tx_hold(aqt); - } - - snd_soc_update_bits(codec, AQT1000_HPH_R_TEST, 0x01, 0x01); - - /* Remove mute */ - snd_soc_update_bits(codec, AQT1000_CDC_RX2_RX_PATH_CTL, - 0x10, 0x00); - /* Enable GM3 boost */ - snd_soc_update_bits(codec, AQT1000_HPH_CNP_WG_CTL, - 0x80, 0x80); - /* Enable AutoChop timer at the end of power up */ - snd_soc_update_bits(codec, AQT1000_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, AQT1000_CDC_RX2_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x00); - if (!(strcmp(w->name, "AQT ANC HPHR PA"))) { - dev_dbg(codec->dev, - "%s:Do everything needed for left channel\n", - __func__); - /* Do everything needed for left channel */ - snd_soc_update_bits(codec, AQT1000_HPH_L_TEST, - 0x01, 0x01); - - /* Remove mute */ - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_CTL, - 0x10, 0x00); - - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, - AQT1000_CDC_RX1_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x00); - - /* Remove ANC Rx from reset */ - ret = aqt_codec_enable_anc(w, kcontrol, event); - } - aqt_codec_override(codec, aqt->hph_mode, event); - break; - case SND_SOC_DAPM_PRE_PMD: - blocking_notifier_call_chain(&aqt->mbhc->notifier, - AQT_EVENT_PRE_HPHR_PA_OFF, - &aqt->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, AQT1000_HPH_R_TEST, 0x01, 0x00); - snd_soc_update_bits(codec, AQT1000_CDC_RX2_RX_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, AQT1000_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x10); - if (!(strcmp(w->name, "AQT ANC HPHR PA"))) - snd_soc_update_bits(codec, AQT1000_ANA_HPH, 0x40, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 5ms sleep is required after PA disable. If compander is - * disabled, then 20ms delay is needed after PA disable. - */ - if (!aqt->comp_enabled[COMPANDER_2]) - usleep_range(20000, 20100); - else - usleep_range(5000, 5100); - aqt_codec_override(codec, aqt->hph_mode, event); - blocking_notifier_call_chain(&aqt->mbhc->notifier, - AQT_EVENT_POST_HPHR_PA_OFF, - &aqt->mbhc->wcd_mbhc); - if (!(strcmp(w->name, "AQT ANC HPHR PA"))) { - ret = aqt_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_CFG0, - 0x10, 0x00); - } - break; - }; - - return ret; -} - -static int aqt_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if ((!(strcmp(w->name, "AQT ANC HPHL PA"))) && - (test_bit(HPH_PA_DELAY, &aqt->status_mask))) - snd_soc_update_bits(codec, AQT1000_ANA_HPH, - 0xC0, 0xC0); - set_bit(HPH_PA_DELAY, &aqt->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - if (!(strcmp(w->name, "AQT ANC HPHL PA"))) { - if ((snd_soc_read(codec, AQT1000_ANA_HPH) & 0xC0) - != 0xC0) - /* - * If PA_EN is not set (potentially in ANC - * case) then do nothing for POST_PMU and - * let right channel handle everything. - */ - break; - } - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is needed. - */ - if (test_bit(HPH_PA_DELAY, &aqt->status_mask)) { - if (!aqt->comp_enabled[COMPANDER_1]) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &aqt->status_mask); - } - if (aqt->anc_func) { - /* Clear Tx FE HOLD if both PAs are enabled */ - if ((snd_soc_read(aqt->codec, AQT1000_ANA_HPH) & - 0xC0) == 0xC0) - aqt_codec_clear_anc_tx_hold(aqt); - } - - snd_soc_update_bits(codec, AQT1000_HPH_L_TEST, 0x01, 0x01); - /* Remove Mute on primary path */ - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_CTL, - 0x10, 0x00); - /* Enable GM3 boost */ - snd_soc_update_bits(codec, AQT1000_HPH_CNP_WG_CTL, - 0x80, 0x80); - /* Enable AutoChop timer at the end of power up */ - snd_soc_update_bits(codec, AQT1000_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, AQT1000_CDC_RX1_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x00); - if (!(strcmp(w->name, "AQT ANC HPHL PA"))) { - dev_dbg(codec->dev, - "%s:Do everything needed for right channel\n", - __func__); - - /* Do everything needed for right channel */ - snd_soc_update_bits(codec, AQT1000_HPH_R_TEST, - 0x01, 0x01); - - /* Remove mute */ - snd_soc_update_bits(codec, AQT1000_CDC_RX2_RX_PATH_CTL, - 0x10, 0x00); - - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, - AQT1000_CDC_RX2_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - AQT1000_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x00); - /* Remove ANC Rx from reset */ - ret = aqt_codec_enable_anc(w, kcontrol, event); - } - aqt_codec_override(codec, aqt->hph_mode, event); - break; - case SND_SOC_DAPM_PRE_PMD: - blocking_notifier_call_chain(&aqt->mbhc->notifier, - AQT_EVENT_PRE_HPHL_PA_OFF, - &aqt->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, AQT1000_HPH_L_TEST, 0x01, 0x00); - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x10); - if (!(strcmp(w->name, "AQT ANC HPHL PA"))) - snd_soc_update_bits(codec, AQT1000_ANA_HPH, - 0x80, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 5ms sleep is required after PA disable. If compander is - * disabled, then 20ms delay is needed after PA disable. - */ - if (!aqt->comp_enabled[COMPANDER_1]) - usleep_range(20000, 20100); - else - usleep_range(5000, 5100); - aqt_codec_override(codec, aqt->hph_mode, event); - blocking_notifier_call_chain(&aqt->mbhc->notifier, - AQT_EVENT_POST_HPHL_PA_OFF, - &aqt->mbhc->wcd_mbhc); - if (!(strcmp(w->name, "AQT ANC HPHL PA"))) { - ret = aqt_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, - AQT1000_CDC_RX1_RX_PATH_CFG0, 0x10, 0x00); - } - break; - }; - - return ret; -} - -static int aqt_codec_set_iir_gain(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: /* fall through */ - case SND_SOC_DAPM_PRE_PMD: - if (strnstr(w->name, "AQT IIR0", sizeof("AQT IIR0"))) { - snd_soc_write(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - AQT1000_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)); - } - break; - } - return 0; -} - -static int aqt_enable_native_supply(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (++aqt->native_clk_users == 1) { - snd_soc_update_bits(codec, AQT1000_CLK_SYS_PLL_ENABLES, - 0x01, 0x01); - /* 100usec is needed as per HW requirement */ - usleep_range(100, 120); - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x02); - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x10, 0x10); - } - break; - case SND_SOC_DAPM_PRE_PMD: - if (aqt->native_clk_users && - (--aqt->native_clk_users == 0)) { - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x10, 0x00); - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x00); - snd_soc_update_bits(codec, AQT1000_CLK_SYS_PLL_ENABLES, - 0x01, 0x00); - } - break; - } - - dev_dbg(codec->dev, "%s: native_clk_users: %d, event: %d\n", - __func__, aqt->native_clk_users, event); - - return 0; -} - -static const char * const native_mux_text[] = { - "OFF", "ON", -}; - -AQT_DAPM_ENUM(int1_1_native, SND_SOC_NOPM, 0, native_mux_text); -AQT_DAPM_ENUM(int2_1_native, SND_SOC_NOPM, 0, native_mux_text); - -static int aqt_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = aqt_cdc_mclk_enable(codec, true); - break; - case SND_SOC_DAPM_POST_PMD: - ret = aqt_cdc_mclk_enable(codec, false); - break; - } - - return ret; -} - -static int aif_cap_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static int aif_cap_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static const struct snd_kcontrol_new aif1_cap_mixer[] = { - SOC_SINGLE_EXT("TX0", SND_SOC_NOPM, AQT_TX0, 1, 0, - aif_cap_mixer_get, aif_cap_mixer_put), - SOC_SINGLE_EXT("TX1", SND_SOC_NOPM, AQT_TX1, 1, 0, - aif_cap_mixer_get, aif_cap_mixer_put), -}; - -static const char * const rx_inp_st_mux_text[] = { - "ZERO", "SRC0", -}; -AQT_DAPM_ENUM(rx_inp_st, AQT1000_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4, - rx_inp_st_mux_text); - -static const struct snd_soc_dapm_widget aqt_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY("AQT MCLK", SND_SOC_NOPM, 0, 0, aqt_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT_E("AQT AIF1 CAP", "AQT AIF1 Capture", 0, - SND_SOC_NOPM, AIF1_CAP, 0, aqt_codec_enable_i2s_tx, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("AQT AIF1 CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0, - aif1_cap_mixer, ARRAY_SIZE(aif1_cap_mixer)), - - AQT_DAPM_MUX("AQT TX0_MUX", 0, tx0), - AQT_DAPM_MUX("AQT TX1_MUX", 0, tx1), - - SND_SOC_DAPM_MUX_E("AQT ADC0 MUX", AQT1000_CDC_TX0_TX_PATH_CTL, 5, 0, - &tx_adc0_mux, aqt_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("AQT ADC1 MUX", AQT1000_CDC_TX1_TX_PATH_CTL, 5, 0, - &tx_adc1_mux, aqt_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("AQT ADC2 MUX", AQT1000_CDC_TX2_TX_PATH_CTL, 5, 0, - &tx_adc2_mux, aqt_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - AQT_DAPM_MUX("AQT AMIC0_MUX", 0, tx_amic0), - AQT_DAPM_MUX("AQT AMIC1_MUX", 0, tx_amic1), - AQT_DAPM_MUX("AQT AMIC2_MUX", 0, tx_amic2), - - SND_SOC_DAPM_ADC_E("AQT ADC_L", NULL, AQT1000_ANA_AMIC1, 7, 0, - aqt_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("AQT ADC_R", NULL, AQT1000_ANA_AMIC2, 7, 0, - aqt_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("AQT ADC_V", NULL, AQT1000_ANA_AMIC3, 7, 0, - aqt_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - - AQT_DAPM_MUX("AQT AMIC10_MUX", 0, tx_amic10), - AQT_DAPM_MUX("AQT AMIC11_MUX", 0, tx_amic11), - AQT_DAPM_MUX("AQT AMIC12_MUX", 0, tx_amic12), - AQT_DAPM_MUX("AQT AMIC13_MUX", 0, tx_amic13), - - SND_SOC_DAPM_SWITCH_E("AQT ANC OUT HPHL Enable", SND_SOC_NOPM, - INTERP_HPHL, 0, &anc_hphl_pa_switch, aqt_anc_out_switch_cb, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SWITCH_E("AQT ANC OUT HPHR Enable", SND_SOC_NOPM, - INTERP_HPHR, 0, &anc_hphr_pa_switch, aqt_anc_out_switch_cb, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_MIXER("AQT RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("AQT RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - - AQT_DAPM_MUX("AQT ANC0 FB MUX", 0, anc0_fb), - AQT_DAPM_MUX("AQT ANC1 FB MUX", 0, anc1_fb), - - SND_SOC_DAPM_INPUT("AQT AMIC1"), - SND_SOC_DAPM_INPUT("AQT AMIC2"), - SND_SOC_DAPM_INPUT("AQT AMIC3"), - - SND_SOC_DAPM_MIXER("AQT I2S_L RX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("AQT I2S_R RX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_AIF_IN_E("AQT AIF1 PB", "AQT AIF1 Playback", 0, - SND_SOC_NOPM, AIF1_PB, 0, aqt_codec_enable_i2s_rx, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("AQT RX INT1_1 MUX", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int1_1_mux, aqt_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("AQT RX INT2_1 MUX", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int2_1_mux, aqt_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("AQT RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int1_2_mux, aqt_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("AQT RX INT2_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int2_2_mux, aqt_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - AQT_DAPM_MUX("AQT RX INT1_1 INTERP", 0, rx_int1_1_interp), - AQT_DAPM_MUX("AQT RX INT1_2 INTERP", 0, rx_int1_2_interp), - AQT_DAPM_MUX("AQT RX INT2_1 INTERP", 0, rx_int2_1_interp), - AQT_DAPM_MUX("AQT RX INT2_2 INTERP", 0, rx_int2_2_interp), - - SND_SOC_DAPM_MIXER("AQT RX INT1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("AQT RX INT2 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("AQT ASRC0 MUX", SND_SOC_NOPM, ASRC0, 0, - &asrc0_mux, aqt_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("AQT ASRC1 MUX", SND_SOC_NOPM, ASRC1, 0, - &asrc1_mux, aqt_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - AQT_DAPM_MUX("AQT RX INT1 DEM MUX", 0, rx_int1_dem), - AQT_DAPM_MUX("AQT RX INT2 DEM MUX", 0, rx_int2_dem), - - SND_SOC_DAPM_DAC_E("AQT RX INT1 DAC", NULL, AQT1000_ANA_HPH, - 5, 0, aqt_codec_hphl_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("AQT RX INT2 DAC", NULL, AQT1000_ANA_HPH, - 4, 0, aqt_codec_hphr_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_PGA_E("AQT HPHL PA", AQT1000_ANA_HPH, 7, 0, NULL, 0, - aqt_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("AQT HPHR PA", AQT1000_ANA_HPH, 6, 0, NULL, 0, - aqt_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("AQT ANC HPHL PA", SND_SOC_NOPM, 0, 0, NULL, 0, - aqt_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("AQT ANC HPHR PA", SND_SOC_NOPM, 0, 0, NULL, 0, - aqt_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("AQT HPHL"), - SND_SOC_DAPM_OUTPUT("AQT HPHR"), - SND_SOC_DAPM_OUTPUT("AQT ANC HPHL"), - SND_SOC_DAPM_OUTPUT("AQT ANC HPHR"), - - SND_SOC_DAPM_MIXER_E("AQT IIR0", AQT1000_CDC_SIDETONE_IIR0_IIR_PATH_CTL, - 4, 0, NULL, 0, aqt_codec_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_MIXER("AQT SRC0", - AQT1000_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - - SND_SOC_DAPM_MICBIAS_E("AQT MIC BIAS1", SND_SOC_NOPM, 0, 0, - aqt_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("AQT RX_BIAS", SND_SOC_NOPM, 0, 0, - aqt_codec_enable_rx_bias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("AQT RX INT1 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_HPHL, 0, aqt_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("AQT RX INT2 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_HPHR, 0, aqt_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - AQT_DAPM_MUX("AQT RX INT1_1 NATIVE MUX", 0, int1_1_native), - AQT_DAPM_MUX("AQT RX INT2_1 NATIVE MUX", 0, int2_1_native), - - SND_SOC_DAPM_MUX("AQT RX ST MUX", - AQT1000_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2, 0, - &rx_inp_st_mux), -}; - -static int aqt_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - return 0; -} - -static void aqt_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); -} - -static int aqt_set_decimator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - u8 tx_fs_rate = 0; - u8 tx_mux_sel = 0, tx0_mux_sel = 0, tx1_mux_sel = 0; - u16 tx_path_ctl_reg = 0; - - switch (sample_rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - default: - dev_err(codec->dev, "%s: Invalid TX sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - - }; - - /* Find which decimator path is enabled */ - tx_mux_sel = snd_soc_read(codec, AQT1000_CDC_IF_ROUTER_TX_MUX_CFG0); - tx0_mux_sel = (tx_mux_sel & 0x03); - tx1_mux_sel = (tx_mux_sel & 0xC0); - - if (tx0_mux_sel) { - tx_path_ctl_reg = AQT1000_CDC_TX0_TX_PATH_CTL + - ((tx0_mux_sel - 1) * 16); - snd_soc_update_bits(codec, tx_path_ctl_reg, 0x0F, tx_fs_rate); - } - - if (tx1_mux_sel) { - tx_path_ctl_reg = AQT1000_CDC_TX0_TX_PATH_CTL + - ((tx1_mux_sel - 1) * 16); - snd_soc_update_bits(codec, tx_path_ctl_reg, 0x0F, tx_fs_rate); - } - - return 0; -} - -static int aqt_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - int rate_val = 0; - int i; - - for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) { - if (sample_rate == sr_val_tbl[i].sample_rate) { - rate_val = sr_val_tbl[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) { - dev_err(codec->dev, "%s: Unsupported sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - } - - /* TODO - Set the rate only to enabled path */ - /* Set Primary interpolator rate */ - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_CTL, - 0x0F, (u8)rate_val); - snd_soc_update_bits(codec, AQT1000_CDC_RX2_RX_PATH_CTL, - 0x0F, (u8)rate_val); - - /* Set mixing path interpolator rate */ - snd_soc_update_bits(codec, AQT1000_CDC_RX1_RX_PATH_MIX_CTL, - 0x0F, (u8)rate_val); - snd_soc_update_bits(codec, AQT1000_CDC_RX2_RX_PATH_MIX_CTL, - 0x0F, (u8)rate_val); - - return 0; -} - -static int aqt_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - return 0; -} - -static int aqt_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(dai->codec); - int ret = 0; - - dev_dbg(aqt->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = aqt_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - dev_err(aqt->dev, "%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - switch (params_width(params)) { - case 16: - aqt->dai[dai->id].bit_width = 16; - break; - case 24: - aqt->dai[dai->id].bit_width = 24; - break; - case 32: - aqt->dai[dai->id].bit_width = 32; - break; - default: - return -EINVAL; - } - aqt->dai[dai->id].rate = params_rate(params); - break; - case SNDRV_PCM_STREAM_CAPTURE: - ret = aqt_set_decimator_rate(dai, params_rate(params)); - if (ret) { - dev_err(aqt->dev, - "%s: cannot set TX Decimator rate: %d\n", - __func__, ret); - return ret; - } - switch (params_width(params)) { - case 16: - aqt->dai[dai->id].bit_width = 16; - break; - case 24: - aqt->dai[dai->id].bit_width = 24; - break; - default: - dev_err(aqt->dev, "%s: Invalid format 0x%x\n", - __func__, params_width(params)); - return -EINVAL; - }; - aqt->dai[dai->id].rate = params_rate(params); - break; - default: - dev_err(aqt->dev, "%s: Invalid stream type %d\n", __func__, - substream->stream); - return -EINVAL; - }; - - return 0; -} - -static struct snd_soc_dai_ops aqt_dai_ops = { - .startup = aqt_startup, - .shutdown = aqt_shutdown, - .hw_params = aqt_hw_params, - .prepare = aqt_prepare, -}; - -struct snd_soc_dai_driver aqt_dai[] = { - { - .name = "aqt_rx1", - .id = AIF1_PB, - .playback = { - .stream_name = "AQT AIF1 Playback", - .rates = AQT1000_RATES_MASK | AQT1000_FRAC_RATES_MASK, - .formats = AQT1000_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &aqt_dai_ops, - }, - { - .name = "aqt_tx1", - .id = AIF1_CAP, - .capture = { - .stream_name = "AQT AIF1 Capture", - .rates = AQT1000_RATES_MASK, - .formats = AQT1000_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &aqt_dai_ops, - }, -}; - -static int aqt_enable_mclk(struct aqt1000 *aqt) -{ - struct snd_soc_codec *codec = aqt->codec; - - /* Enable mclk requires master bias to be enabled first */ - if (aqt->master_bias_users <= 0) { - dev_err(aqt->dev, - "%s: Cannot turn on MCLK, BG is not enabled\n", - __func__); - return -EINVAL; - } - - if (++aqt->mclk_users == 1) { - /* Set clock div 2 */ - snd_soc_update_bits(codec, - AQT1000_CLK_SYS_MCLK1_PRG, 0x0C, 0x04); - snd_soc_update_bits(codec, - AQT1000_CLK_SYS_MCLK1_PRG, 0x10, 0x10); - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - /* - * 10us sleep is required after clock is enabled - * as per HW requirement - */ - usleep_range(10, 15); - } - - dev_dbg(aqt->dev, "%s: mclk_users: %d\n", __func__, aqt->mclk_users); - - return 0; -} - -static int aqt_disable_mclk(struct aqt1000 *aqt) -{ - struct snd_soc_codec *codec = aqt->codec; - - if (aqt->mclk_users <= 0) { - dev_err(aqt->dev, "%s: No mclk users, cannot disable mclk\n", - __func__); - return -EINVAL; - } - - if (--aqt->mclk_users == 0) { - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - snd_soc_update_bits(codec, - AQT1000_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - snd_soc_update_bits(codec, - AQT1000_CLK_SYS_MCLK1_PRG, 0x10, 0x00); - } - - dev_dbg(codec->dev, "%s: mclk_users: %d\n", __func__, aqt->mclk_users); - - return 0; -} - -static int aqt_enable_master_bias(struct aqt1000 *aqt) -{ - struct snd_soc_codec *codec = aqt->codec; - - mutex_lock(&aqt->master_bias_lock); - - aqt->master_bias_users++; - if (aqt->master_bias_users == 1) { - snd_soc_update_bits(codec, AQT1000_ANA_BIAS, 0x80, 0x80); - snd_soc_update_bits(codec, AQT1000_ANA_BIAS, 0x40, 0x40); - /* - * 1ms delay is required after pre-charge is enabled - * as per HW requirement - */ - usleep_range(1000, 1100); - snd_soc_update_bits(codec, AQT1000_ANA_BIAS, 0x40, 0x00); - } - - mutex_unlock(&aqt->master_bias_lock); - - return 0; -} - -static int aqt_disable_master_bias(struct aqt1000 *aqt) -{ - struct snd_soc_codec *codec = aqt->codec; - - mutex_lock(&aqt->master_bias_lock); - if (aqt->master_bias_users <= 0) { - mutex_unlock(&aqt->master_bias_lock); - return -EINVAL; - } - - aqt->master_bias_users--; - if (aqt->master_bias_users == 0) - snd_soc_update_bits(codec, AQT1000_ANA_BIAS, 0x80, 0x00); - mutex_unlock(&aqt->master_bias_lock); - - return 0; -} - -static int aqt_cdc_req_mclk_enable(struct aqt1000 *aqt, - bool enable) -{ - int ret = 0; - - if (enable) { - ret = clk_prepare_enable(aqt->ext_clk); - if (ret) { - dev_err(aqt->dev, "%s: ext clk enable failed\n", - __func__); - goto done; - } - /* Get BG */ - aqt_enable_master_bias(aqt); - /* Get MCLK */ - aqt_enable_mclk(aqt); - } else { - /* put MCLK */ - aqt_disable_mclk(aqt); - /* put BG */ - if (aqt_disable_master_bias(aqt)) - dev_err(aqt->dev, "%s: master bias disable failed\n", - __func__); - clk_disable_unprepare(aqt->ext_clk); - } - -done: - return ret; -} - -static int __aqt_cdc_mclk_enable_locked(struct aqt1000 *aqt, - bool enable) -{ - int ret = 0; - - dev_dbg(aqt->dev, "%s: mclk_enable = %u\n", __func__, enable); - - if (enable) - ret = aqt_cdc_req_mclk_enable(aqt, true); - else - aqt_cdc_req_mclk_enable(aqt, false); - - return ret; -} - -static int __aqt_cdc_mclk_enable(struct aqt1000 *aqt, - bool enable) -{ - int ret; - - mutex_lock(&aqt->cdc_bg_clk_lock); - ret = __aqt_cdc_mclk_enable_locked(aqt, enable); - mutex_unlock(&aqt->cdc_bg_clk_lock); - - return ret; -} - -/** - * aqt_cdc_mclk_enable - Enable/disable codec mclk - * - * @codec: codec instance - * @enable: Indicates clk enable or disable - * - * Returns 0 on Success and error on failure - */ -int aqt_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - return __aqt_cdc_mclk_enable(aqt, enable); -} -EXPORT_SYMBOL(aqt_cdc_mclk_enable); - -/* - * aqt_get_micb_vout_ctl_val: converts micbias from volts to register value - * @micb_mv: micbias in mv - * - * return register value converted - */ -int aqt_get_micb_vout_ctl_val(u32 micb_mv) -{ - /* min micbias voltage is 1V and maximum is 2.85V */ - if (micb_mv < 1000 || micb_mv > 2850) { - pr_err("%s: unsupported micbias voltage\n", __func__); - return -EINVAL; - } - - return (micb_mv - 1000) / 50; -} -EXPORT_SYMBOL(aqt_get_micb_vout_ctl_val); - -static int aqt_set_micbias(struct aqt1000 *aqt, - struct aqt1000_pdata *pdata) -{ - struct snd_soc_codec *codec = aqt->codec; - int vout_ctl_1; - - if (!pdata) { - dev_err(codec->dev, "%s: NULL pdata\n", __func__); - return -ENODEV; - } - - /* set micbias voltage */ - vout_ctl_1 = aqt_get_micb_vout_ctl_val(pdata->micbias.micb1_mv); - if (vout_ctl_1 < 0) - return -EINVAL; - - snd_soc_update_bits(codec, AQT1000_ANA_MICB1, 0x3F, vout_ctl_1); - - return 0; -} - -static ssize_t aqt_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - char buffer[AQT_VERSION_ENTRY_SIZE]; - int len = 0; - - len = snprintf(buffer, sizeof(buffer), "AQT1000_1_0\n"); - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops aqt_codec_info_ops = { - .read = aqt_codec_version_read, -}; - -/* - * aqt_codec_info_create_codec_entry - creates aqt1000 module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates aqt1000 module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int aqt_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct aqt1000 *aqt; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - aqt = snd_soc_codec_get_drvdata(codec); - if (!aqt) { - dev_dbg(codec->dev, "%s: aqt is NULL\n", __func__); - return -EINVAL; - } - card = codec->component.card; - aqt->entry = snd_info_create_subdir(codec_root->module, - "aqt1000", codec_root); - if (!aqt->entry) { - dev_dbg(codec->dev, "%s: failed to create aqt1000 entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - aqt->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create aqt1000 version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = aqt; - version_entry->size = AQT_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &aqt_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - aqt->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(aqt_codec_info_create_codec_entry); - -static const struct aqt_reg_mask_val aqt_codec_reg_init[] = { - {AQT1000_CHIP_CFG0_EFUSE_CTL, 0x01, 0x01}, -}; - -static const struct aqt_reg_mask_val aqt_codec_reg_update[] = { - {AQT1000_LDOH_MODE, 0x1F, 0x0B}, - {AQT1000_MICB1_TEST_CTL_2, 0x07, 0x01}, - {AQT1000_MICB1_MISC_MICB1_INM_RES_BIAS, 0x03, 0x02}, - {AQT1000_MICB1_MISC_MICB1_INM_RES_BIAS, 0x0C, 0x08}, - {AQT1000_MICB1_MISC_MICB1_INM_RES_BIAS, 0x30, 0x20}, - {AQT1000_CDC_TX0_TX_PATH_CFG1, 0x01, 0x00}, - {AQT1000_CDC_TX1_TX_PATH_CFG1, 0x01, 0x00}, - {AQT1000_CDC_TX2_TX_PATH_CFG1, 0x01, 0x00}, -}; - -static void aqt_codec_init_reg(struct aqt1000 *priv) -{ - struct snd_soc_codec *codec = priv->codec; - u32 i; - - for (i = 0; i < ARRAY_SIZE(aqt_codec_reg_init); i++) - snd_soc_update_bits(codec, - aqt_codec_reg_init[i].reg, - aqt_codec_reg_init[i].mask, - aqt_codec_reg_init[i].val); -} - -static void aqt_codec_update_reg(struct aqt1000 *priv) -{ - struct snd_soc_codec *codec = priv->codec; - u32 i; - - for (i = 0; i < ARRAY_SIZE(aqt_codec_reg_update); i++) - snd_soc_update_bits(codec, - aqt_codec_reg_update[i].reg, - aqt_codec_reg_update[i].mask, - aqt_codec_reg_update[i].val); - -} - -static int aqt_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct aqt1000 *aqt; - struct aqt1000_pdata *pdata; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int i, ret = 0; - - dev_dbg(codec->dev, "%s()\n", __func__); - aqt = snd_soc_codec_get_drvdata(codec); - - mutex_init(&aqt->codec_mutex); - mutex_init(&aqt->i2s_lock); - /* Class-H Init */ - aqt_clsh_init(&aqt->clsh_d); - /* Default HPH Mode to Class-H Low HiFi */ - aqt->hph_mode = CLS_H_LOHIFI; - - aqt->fw_data = devm_kzalloc(codec->dev, sizeof(*(aqt->fw_data)), - GFP_KERNEL); - if (!aqt->fw_data) - goto err; - - set_bit(WCD9XXX_ANC_CAL, aqt->fw_data->cal_bit); - set_bit(WCD9XXX_MBHC_CAL, aqt->fw_data->cal_bit); - - /* Register for Clock */ - aqt->ext_clk = clk_get(aqt->dev, "aqt_clk"); - if (IS_ERR(aqt->ext_clk)) { - dev_err(aqt->dev, "%s: clk get %s failed\n", - __func__, "aqt_ext_clk"); - goto err_clk; - } - - ret = wcd_cal_create_hwdep(aqt->fw_data, - AQT1000_CODEC_HWDEP_NODE, codec); - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - goto err_hwdep; - } - - /* Initialize MBHC module */ - ret = aqt_mbhc_init(&aqt->mbhc, codec, aqt->fw_data); - if (ret) { - pr_err("%s: mbhc initialization failed\n", __func__); - goto err_hwdep; - } - aqt->codec = codec; - for (i = 0; i < COMPANDER_MAX; i++) - aqt->comp_enabled[i] = 0; - - aqt_cdc_mclk_enable(codec, true); - aqt_codec_init_reg(aqt); - aqt_cdc_mclk_enable(codec, false); - - /* Add 100usec delay as per HW requirement */ - usleep_range(100, 110); - - aqt_codec_update_reg(aqt); - - pdata = dev_get_platdata(codec->dev); - - /* If 1.8v is supplied externally, then disable internal 1.8v supply */ - for (i = 0; i < pdata->num_supplies; i++) { - if (!strcmp(pdata->regulator->name, "aqt_vdd1p8")) { - snd_soc_update_bits(codec, AQT1000_BUCK_5V_EN_CTL, - 0x03, 0x00); - dev_dbg(codec->dev, "%s: Disabled internal supply\n", - __func__); - break; - } - } - - aqt_set_micbias(aqt, pdata); - - snd_soc_dapm_add_routes(dapm, aqt_audio_map, - ARRAY_SIZE(aqt_audio_map)); - - for (i = 0; i < NUM_CODEC_DAIS; i++) { - INIT_LIST_HEAD(&aqt->dai[i].ch_list); - init_waitqueue_head(&aqt->dai[i].dai_wait); - } - - for (i = 0; i < AQT1000_NUM_DECIMATORS; i++) { - aqt->tx_hpf_work[i].aqt = aqt; - aqt->tx_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&aqt->tx_hpf_work[i].dwork, - aqt_tx_hpf_corner_freq_callback); - - aqt->tx_mute_dwork[i].aqt = aqt; - aqt->tx_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&aqt->tx_mute_dwork[i].dwork, - aqt_tx_mute_update_callback); - } - - mutex_lock(&aqt->codec_mutex); - snd_soc_dapm_disable_pin(dapm, "AQT ANC HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "AQT ANC HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "AQT ANC HPHL"); - snd_soc_dapm_disable_pin(dapm, "AQT ANC HPHR"); - mutex_unlock(&aqt->codec_mutex); - - snd_soc_dapm_ignore_suspend(dapm, "AQT AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AQT AIF1 Capture"); - - snd_soc_dapm_sync(dapm); - - return ret; - -err_hwdep: - clk_put(aqt->ext_clk); -err_clk: - devm_kfree(codec->dev, aqt->fw_data); - aqt->fw_data = NULL; -err: - mutex_destroy(&aqt->i2s_lock); - mutex_destroy(&aqt->codec_mutex); - return ret; -} - -static int aqt_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct aqt1000 *aqt = snd_soc_codec_get_drvdata(codec); - - /* Deinitialize MBHC module */ - aqt_mbhc_deinit(codec); - aqt->mbhc = NULL; - mutex_destroy(&aqt->i2s_lock); - mutex_destroy(&aqt->codec_mutex); - clk_put(aqt->ext_clk); - - return 0; -} - -static struct regmap *aqt_get_regmap(struct device *dev) -{ - struct aqt1000 *control = dev_get_drvdata(dev); - - return control->regmap; -} - -struct snd_soc_codec_driver snd_cdc_dev_aqt = { - .probe = aqt_soc_codec_probe, - .remove = aqt_soc_codec_remove, - .get_regmap = aqt_get_regmap, - .component_driver = { - .controls = aqt_snd_controls, - .num_controls = ARRAY_SIZE(aqt_snd_controls), - .dapm_widgets = aqt_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(aqt_dapm_widgets), - .dapm_routes = aqt_audio_map, - .num_dapm_routes = ARRAY_SIZE(aqt_audio_map), - }, -}; - -/* - * aqt_register_codec: Register the device to ASoC - * @dev: device - * - * return 0 success or error code in case of failure - */ -int aqt_register_codec(struct device *dev) -{ - return snd_soc_register_codec(dev, &snd_cdc_dev_aqt, aqt_dai, - ARRAY_SIZE(aqt_dai)); -} -EXPORT_SYMBOL(aqt_register_codec); diff --git a/techpack/audio/asoc/codecs/aqt1000/aqt1000.h b/techpack/audio/asoc/codecs/aqt1000/aqt1000.h deleted file mode 100644 index 7b870db7a492..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/aqt1000.h +++ /dev/null @@ -1,229 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef AQT1000_H -#define AQT1000_H - -#include -#include -#include -#include -#include "pdata.h" -#include "aqt1000-clsh.h" - -#define AQT1000_MAX_MICBIAS 1 -#define AQT1000_NUM_INTERPOLATORS 2 -#define AQT1000_NUM_DECIMATORS 3 -#define AQT1000_VOUT_CTL_TO_MICB(v) (1000 + v * 50) -#define AQT1000_RX_PATH_CTL_OFFSET 20 - -#define AQT1000_CLK_24P576MHZ 24576000 -#define AQT1000_CLK_19P2MHZ 19200000 -#define AQT1000_CLK_12P288MHZ 12288000 -#define AQT1000_CLK_9P6MHZ 9600000 - -#define AQT1000_ST_IIR_COEFF_MAX 5 - -enum { - AQT1000_RX0 = 0, - AQT1000_RX1, - AQT1000_RX_MAX, -}; - -enum { - AQT_NONE, - AQT_MCLK, - AQT_RCO, -}; - -enum { - AQT_TX0 = 0, - AQT_TX1, -}; - -enum { - ASRC0, - ASRC1, - ASRC_MAX, -}; - -/* Each IIR has 5 Filter Stages */ -enum { - BAND1 = 0, - BAND2, - BAND3, - BAND4, - BAND5, - BAND_MAX, -}; - -enum { - AQT1000_TX0 = 0, - AQT1000_TX1, - AQT1000_TX2, - AQT1000_TX_MAX, -}; - -enum { - INTERP_HPHL, - INTERP_HPHR, - INTERP_MAX, -}; - -enum { - INTERP_MAIN_PATH, - INTERP_MIX_PATH, -}; - -enum { - COMPANDER_1, /* HPH_L */ - COMPANDER_2, /* HPH_R */ - COMPANDER_MAX, -}; - -enum { - AIF1_PB = 0, - AIF1_CAP, - NUM_CODEC_DAIS, -}; - -struct aqt_codec_dai_data { - u32 rate; - u32 *ch_num; - u32 ch_act; - u32 ch_tot; -}; - -struct aqt_idle_detect_config { - u8 hph_idle_thr; - u8 hph_idle_detect_en; -}; - -struct aqt1000_i2c { - struct i2c_client *client; - struct i2c_msg xfer_msg[2]; - struct mutex xfer_lock; - int mod_id; -}; - -struct aqt1000_cdc_dai_data { - u32 rate; /* sample rate */ - u32 bit_width; /* sit width 16,24,32 */ - struct list_head ch_list; - wait_queue_head_t dai_wait; -}; - -struct tx_mute_work { - struct aqt1000 *aqt; - u8 decimator; - struct delayed_work dwork; -}; - -struct hpf_work { - struct aqt1000 *aqt; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -struct aqt1000 { - struct device *dev; - struct mutex io_lock; - struct mutex xfer_lock; - struct mutex reset_lock; - - struct device_node *aqt_rst_np; - - int (*read_dev)(struct aqt1000 *aqt, unsigned short reg, - void *dest, int bytes); - int (*write_dev)(struct aqt1000 *aqt, unsigned short reg, - void *src, int bytes); - - u32 num_of_supplies; - struct regulator_bulk_data *supplies; - - u32 mclk_rate; - struct regmap *regmap; - struct snd_soc_codec *codec; - bool dev_up; - bool prev_pg_valid; - u8 prev_pg; - - struct aqt1000_i2c i2c_dev; - - /* Codec params */ - - /* ANC related */ - u32 anc_slot; - bool anc_func; - - /* compander */ - int comp_enabled[COMPANDER_MAX]; - - /* class h specific data */ - struct aqt_clsh_cdc_data clsh_d; - - /* Interpolator Mode Select for HPH_L and HPH_R */ - u32 hph_mode; - - unsigned long status_mask; - - struct aqt1000_cdc_dai_data dai[NUM_CODEC_DAIS]; - - struct mutex micb_lock; - - struct clk *ext_clk; - - /* mbhc module */ - struct aqt1000_mbhc *mbhc; - - struct mutex codec_mutex; - - /* cal info for codec */ - struct fw_info *fw_data; - - int native_clk_users; - /* ASRC users count */ - int asrc_users[ASRC_MAX]; - int asrc_output_mode[ASRC_MAX]; - /* Main path clock users count */ - int main_clk_users[AQT1000_NUM_INTERPOLATORS]; - - struct aqt_idle_detect_config idle_det_cfg; - u32 rx_bias_count; - - s32 micb_ref; - s32 pullup_ref; - int master_bias_users; - int mclk_users; - int i2s_users; - - struct hpf_work tx_hpf_work[AQT1000_NUM_DECIMATORS]; - struct tx_mute_work tx_mute_dwork[AQT1000_NUM_DECIMATORS]; - - struct mutex master_bias_lock; - struct mutex cdc_bg_clk_lock; - struct mutex i2s_lock; - - /* Interrupt */ - struct regmap_irq_chip_data *irq_chip; - int num_irq_regs; - struct irq_domain *virq; - int irq; - int irq_base; - - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; -}; - -#endif /* AQT1000_H */ diff --git a/techpack/audio/asoc/codecs/aqt1000/pdata.h b/techpack/audio/asoc/codecs/aqt1000/pdata.h deleted file mode 100644 index 2c29848d7989..000000000000 --- a/techpack/audio/asoc/codecs/aqt1000/pdata.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _AQT1000_PDATA_H_ -#define _AQT1000_PDATA_H_ - -#include -#include -#include "../msm-cdc-supply.h" - -struct aqt1000_micbias_setting { - u8 ldoh_v; - u32 cfilt1_mv; - u32 micb1_mv; - u8 bias1_cfilt_sel; -}; - -struct aqt1000_pdata { - unsigned int irq_gpio; - unsigned int irq_flags; - struct cdc_regulator *regulator; - int num_supplies; - struct aqt1000_micbias_setting micbias; - struct device_node *aqt_rst_np; - u32 mclk_rate; - u32 ext_clk_rate; - u32 ext_1p8v_supply; -}; - -#endif /* _AQT1000_PDATA_H_ */ diff --git a/techpack/audio/asoc/codecs/audio-ext-clk-up.c b/techpack/audio/asoc/codecs/audio-ext-clk-up.c deleted file mode 100644 index f4e89028ad3f..000000000000 --- a/techpack/audio/asoc/codecs/audio-ext-clk-up.c +++ /dev/null @@ -1,624 +0,0 @@ -/* Copyright (c) 2015-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../../../drivers/clk/qcom/common.h" -#include -#include -#include -#include -#include "audio-ext-clk-up.h" - -enum { - AUDIO_EXT_CLK_PMI, - AUDIO_EXT_CLK_LNBB2, - AUDIO_EXT_CLK_LPASS, - AUDIO_EXT_CLK_LPASS2, - AUDIO_EXT_CLK_LPASS3, - AUDIO_EXT_CLK_LPASS4, - AUDIO_EXT_CLK_LPASS5, - AUDIO_EXT_CLK_LPASS6, - AUDIO_EXT_CLK_LPASS7, - AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE, - AUDIO_EXT_CLK_PM660_PMI, - AUDIO_EXT_CLK_LPASS_MAX, - AUDIO_EXT_CLK_MAX = AUDIO_EXT_CLK_LPASS_MAX, -}; - -struct pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *sleep; - struct pinctrl_state *active; - char __iomem *base; -}; - -struct audio_ext_clk { - struct pinctrl_info pnctrl_info; - struct clk_fixed_factor fact; - int gpio; -}; - -struct audio_ext_clk_priv { - struct device *dev; - int clk_src; - struct afe_clk_set clk_cfg; - struct audio_ext_clk audio_clk; - const char *clk_name; - uint32_t lpass_core_hwvote_client_handle; -}; - -static inline struct audio_ext_clk_priv *to_audio_clk(struct clk_hw *hw) -{ - return container_of(hw, struct audio_ext_clk_priv, audio_clk.fact.hw); -} - -static int audio_ext_clk_prepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - int ret; - - if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && - (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { - clk_priv->clk_cfg.enable = 1; - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); - if (ret < 0) { - pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", - __func__); - return ret; - } - } - - if (pnctrl_info->pinctrl) { - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->active); - if (ret) { - pr_err("%s: active state select failed with %d\n", - __func__, ret); - return -EIO; - } - } - - if (pnctrl_info->base) - iowrite32(1, pnctrl_info->base); - return 0; -} - -static void audio_ext_clk_unprepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - int ret; - - if (pnctrl_info->pinctrl) { - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) { - pr_err("%s: active state select failed with %d\n", - __func__, ret); - return; - } - } - - if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && - (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { - clk_priv->clk_cfg.enable = 0; - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); - if (ret < 0) - pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", - __func__, ret); - } - - if (pnctrl_info->base) - iowrite32(0, pnctrl_info->base); -} - -static u8 audio_ext_clk_get_parent(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - int num_parents = clk_hw_get_num_parents(hw); - const char * const *parent_names = hw->init->parent_names; - u8 i = 0, ret = hw->init->num_parents + 1; - - if ((clk_priv->clk_src == AUDIO_EXT_CLK_PMI) && clk_priv->clk_name) { - for (i = 0; i < num_parents; i++) { - if (!strcmp(parent_names[i], clk_priv->clk_name)) - ret = i; - } - pr_debug("%s: parent index = %u\n", __func__, ret); - return ret; - } else - return 0; -} - -static int lpass_hw_vote_prepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - int ret = 0; - int32_t avs_state = 0; - uint32_t *client_handle = &clk_priv->lpass_core_hwvote_client_handle; - - if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { - ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_MACRO_BLOCK, - "LPASS_HW_MACRO", - client_handle); - if (ret < 0) { - pr_err("%s lpass core hw vote failed %d\n", - __func__, ret); - /* - * DSP returns -EBUSY when AVS services are not up - * Check for AVS state and then retry voting - * for core hw clock. - */ - if (ret == -EBUSY) { - q6core_is_avs_up(&avs_state); - if (avs_state) - ret = afe_vote_lpass_core_hw( - AFE_LPASS_CORE_HW_MACRO_BLOCK, - "LPASS_HW_MACRO", - client_handle); - } - return ret; - } - } - - return 0; -} - -static void lpass_hw_vote_unprepare(struct clk_hw *hw) -{ - struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); - int ret = 0; - - if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { - ret = afe_unvote_lpass_core_hw( - AFE_LPASS_CORE_HW_MACRO_BLOCK, - clk_priv->lpass_core_hwvote_client_handle); - if (ret < 0) - pr_err("%s lpass core hw vote failed %d\n", - __func__, ret); - } -} - -static const struct clk_ops audio_ext_clk_ops = { - .prepare = audio_ext_clk_prepare, - .unprepare = audio_ext_clk_unprepare, - .get_parent = audio_ext_clk_get_parent, -}; - -static const struct clk_ops lpass_hw_vote_ops = { - .prepare = lpass_hw_vote_prepare, - .unprepare = lpass_hw_vote_unprepare, -}; - -static const char * const audio_ext_pmi_div_clk[] = { - "qpnp_clkdiv_1", - "pms405_div_clk1", - "pm6150_div_clk1", - "pm6125_div_clk1", -}; - -static int audio_ext_clk_dummy_prepare(struct clk_hw *hw) -{ - return 0; -} - -static void audio_ext_clk_dummy_unprepare(struct clk_hw *hw) -{ - -} - -static const struct clk_ops audio_ext_clk_dummy_ops = { - .prepare = audio_ext_clk_dummy_prepare, - .unprepare = audio_ext_clk_dummy_unprepare, -}; - -static struct audio_ext_clk audio_clk_array[] = { - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_ext_pmi_clk", - .parent_names = audio_ext_pmi_div_clk, - .num_parents = - ARRAY_SIZE(audio_ext_pmi_div_clk), - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_ext_pmi_lnbb_clk", - .parent_names = (const char *[]) - { "ln_bb_clk2" }, - .num_parents = 1, - .ops = &audio_ext_clk_dummy_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk2", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk3", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk4", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk5", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk6", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_lpass_mclk7", - .ops = &audio_ext_clk_ops, - }, - }, - }, - { - .pnctrl_info = {NULL}, - .fact = { - .hw.init = &(struct clk_init_data){ - .name = "lpass_hw_vote_clk", - .ops = &lpass_hw_vote_ops, - }, - }, - }, - { - .gpio = -EINVAL, - .fact = { - .mult = 1, - .div = 1, - .hw.init = &(struct clk_init_data){ - .name = "audio_ext_pm660_pmi_clk", - .parent_names = (const char *[]){ "div_clk1" }, - .num_parents = 1, - .ops = &audio_ext_clk_dummy_ops, - }, - }, - }, -}; - -static int audio_get_pinctrl(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev); - struct pinctrl_info *pnctrl_info; - struct pinctrl *pinctrl; - int ret; - u32 reg; - - pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - if (pnctrl_info->pinctrl) { - dev_err(dev, "%s: already requested before\n", - __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(dev); - if (IS_ERR_OR_NULL(pinctrl)) { - dev_err(dev, "%s: Unable to get pinctrl handle\n", - __func__); - return -EINVAL; - } - pnctrl_info->pinctrl = pinctrl; - /* get all state handles from Device Tree */ - pnctrl_info->sleep = pinctrl_lookup_state(pinctrl, "sleep"); - if (IS_ERR(pnctrl_info->sleep)) { - dev_err(dev, "%s: could not get sleep pinstate\n", - __func__); - goto err; - } - pnctrl_info->active = pinctrl_lookup_state(pinctrl, "active"); - if (IS_ERR(pnctrl_info->active)) { - dev_err(dev, "%s: could not get active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) { - dev_err(dev, "%s: Disable TLMM pins failed with %d\n", - __func__, ret); - goto err; - } - - ret = of_property_read_u32(dev->of_node, "qcom,mclk-clk-reg", ®); - if (ret < 0) { - dev_dbg(dev, "%s: miss mclk reg\n", __func__); - } else { - pnctrl_info->base = ioremap(reg, sizeof(u32)); - if (pnctrl_info->base == NULL) { - dev_err(dev, "%s ioremap failed\n", __func__); - goto err; - } - } - - return 0; - -err: - devm_pinctrl_put(pnctrl_info->pinctrl); - return -EINVAL; -} - -static int audio_put_pinctrl(struct platform_device *pdev) -{ - struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev); - struct pinctrl_info *pnctrl_info = NULL; - - pnctrl_info = &clk_priv->audio_clk.pnctrl_info; - if (pnctrl_info && pnctrl_info->pinctrl) { - devm_pinctrl_put(pnctrl_info->pinctrl); - pnctrl_info->pinctrl = NULL; - } - - return 0; -} - -static int audio_get_clk_data(struct platform_device *pdev) -{ - int ret; - struct clk *audio_clk; - struct clk_hw *clkhw; - struct clk_onecell_data *clk_data; - struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev); - - clk_data = devm_kzalloc(&pdev->dev, sizeof(*clk_data), GFP_KERNEL); - if (!clk_data) - return -ENOMEM; - - clk_data->clk_num = 1; - clk_data->clks = devm_kzalloc(&pdev->dev, - sizeof(struct clk *), - GFP_KERNEL); - if (!clk_data->clks) - return -ENOMEM; - - clkhw = &clk_priv->audio_clk.fact.hw; - audio_clk = devm_clk_register(&pdev->dev, clkhw); - if (IS_ERR(audio_clk)) { - dev_err(&pdev->dev, - "%s: clock register failed for clk_src = %d\\n", - __func__, clk_priv->clk_src); - ret = PTR_ERR(audio_clk); - return ret; - } - clk_data->clks[0] = audio_clk; - - ret = of_clk_add_provider(pdev->dev.of_node, - of_clk_src_onecell_get, clk_data); - if (ret) - dev_err(&pdev->dev, "%s: clock add failed for clk_src = %d\n", - __func__, clk_priv->clk_src); - - return ret; -} - -static int audio_ref_clk_probe(struct platform_device *pdev) -{ - int ret; - struct audio_ext_clk_priv *clk_priv; - u32 clk_freq = 0, clk_id = 0, clk_src = 0, use_pinctrl = 0; - int clk_gpio; - - clk_priv = devm_kzalloc(&pdev->dev, sizeof(*clk_priv), GFP_KERNEL); - if (!clk_priv) - return -ENOMEM; - - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-ext-clk-src", - &clk_src); - if (ret) { - dev_err(&pdev->dev, "%s: could not get clk source, ret = %d\n", - __func__, ret); - return ret; - } - - if (clk_src >= AUDIO_EXT_CLK_MAX) { - dev_err(&pdev->dev, "%s: Invalid clk source = %d\n", - __func__, clk_src); - return -EINVAL; - } - clk_priv->clk_name = NULL; - clk_priv->clk_src = clk_src; - memcpy(&clk_priv->audio_clk, &audio_clk_array[clk_src], - sizeof(struct audio_ext_clk)); - - /* Init lpass clk default values */ - clk_priv->clk_cfg.clk_set_minor_version = - Q6AFE_LPASS_CLK_CONFIG_API_VERSION; - clk_priv->clk_cfg.clk_id = Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR; - clk_priv->clk_cfg.clk_freq_in_hz = Q6AFE_LPASS_OSR_CLK_9_P600_MHZ; - clk_priv->clk_cfg.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; - - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-lpass-ext-clk-freq", - &clk_freq); - if (!ret) - clk_priv->clk_cfg.clk_freq_in_hz = clk_freq; - - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-lpass-clk-id", - &clk_id); - if (!ret) - clk_priv->clk_cfg.clk_id = clk_id; - - dev_dbg(&pdev->dev, "%s: ext-clk freq: %d, lpass clk_id: %d, clk_src: %d\n", - __func__, clk_priv->clk_cfg.clk_freq_in_hz, - clk_priv->clk_cfg.clk_id, clk_priv->clk_src); - platform_set_drvdata(pdev, clk_priv); - - ret = of_property_read_string(pdev->dev.of_node, "pmic-clock-names", - &clk_priv->clk_name); - if (ret) - dev_dbg(&pdev->dev, "%s: could not find pmic clock names\n", - __func__); - /* - * property qcom,use-pinctrl to be defined in DTSI to val 1 - * for clock nodes using pinctrl - */ - of_property_read_u32(pdev->dev.of_node, "qcom,use-pinctrl", - &use_pinctrl); - dev_dbg(&pdev->dev, "%s: use-pinctrl : %d\n", - __func__, use_pinctrl); - - if (use_pinctrl) { - ret = audio_get_pinctrl(pdev); - if (ret) { - dev_err(&pdev->dev, "%s: Parsing PMI pinctrl failed\n", - __func__); - return ret; - } - } - - clk_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,audio-ref-clk-gpio", 0); - if (clk_gpio > 0) { - ret = gpio_request(clk_gpio, "EXT_CLK"); - if (ret) { - dev_err(&pdev->dev, - "Request ext clk gpio failed %d, err:%d\n", - clk_gpio, ret); - return ret; - } - if (of_property_read_bool(pdev->dev.of_node, - "qcom,node_has_rpm_clock")) { - clk_priv->audio_clk.gpio = clk_gpio; - } - } - - ret = audio_get_clk_data(pdev); - if (ret) { - dev_err(&pdev->dev, "%s: clk_init is failed\n", - __func__); - if (use_pinctrl) - audio_put_pinctrl(pdev); - if (clk_priv->audio_clk.gpio > 0) - gpio_free(clk_priv->audio_clk.gpio); - return ret; - } - - return 0; -} - -static int audio_ref_clk_remove(struct platform_device *pdev) -{ - struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev); - - audio_put_pinctrl(pdev); - if (clk_priv->audio_clk.gpio > 0) - gpio_free(clk_priv->audio_clk.gpio); - - return 0; -} - -static const struct of_device_id audio_ref_clk_match[] = { - {.compatible = "qcom,audio-ref-clk"}, - {} -}; -MODULE_DEVICE_TABLE(of, audio_ref_clk_match); - -static struct platform_driver audio_ref_clk_driver = { - .driver = { - .name = "audio-ref-clk", - .owner = THIS_MODULE, - .of_match_table = audio_ref_clk_match, - }, - .probe = audio_ref_clk_probe, - .remove = audio_ref_clk_remove, -}; - -int audio_ref_clk_platform_init(void) -{ - return platform_driver_register(&audio_ref_clk_driver); -} - -void audio_ref_clk_platform_exit(void) -{ - platform_driver_unregister(&audio_ref_clk_driver); -} - -MODULE_DESCRIPTION("Audio Ref Up Clock module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/audio-ext-clk-up.h b/techpack/audio/asoc/codecs/audio-ext-clk-up.h deleted file mode 100644 index 8a0232e11d0f..000000000000 --- a/techpack/audio/asoc/codecs/audio-ext-clk-up.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __AUDIO_EXT_CLK_UP_H_ -#define __AUDIO_EXT_CLK_UP_H_ - -int audio_ref_clk_platform_init(void); -void audio_ref_clk_platform_exit(void); - -#endif diff --git a/techpack/audio/asoc/codecs/audio-ext-clk.c b/techpack/audio/asoc/codecs/audio-ext-clk.c deleted file mode 100644 index 72f16f5848dd..000000000000 --- a/techpack/audio/asoc/codecs/audio-ext-clk.c +++ /dev/null @@ -1,348 +0,0 @@ -/* 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio-ext-clk-up.h" - -struct pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *sleep; - struct pinctrl_state *active; -}; - -struct audio_ext_ap_clk { - bool enabled; - int gpio; - struct clk c; -}; - -struct audio_ext_pmi_clk { - int gpio; - struct clk c; -}; - -struct audio_ext_ap_clk2 { - bool enabled; - struct pinctrl_info pnctrl_info; - struct clk c; -}; - -static struct afe_clk_set clk2_config = { - Q6AFE_LPASS_CLK_CONFIG_API_VERSION, - Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR, - Q6AFE_LPASS_IBIT_CLK_11_P2896_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, -}; - -static inline struct audio_ext_ap_clk *to_audio_ap_clk(struct clk *clk) -{ - return container_of(clk, struct audio_ext_ap_clk, c); -} - -static int audio_ext_clk_prepare(struct clk *clk) -{ - struct audio_ext_ap_clk *audio_clk = to_audio_ap_clk(clk); - - pr_debug("%s: gpio: %d\n", __func__, audio_clk->gpio); - if (gpio_is_valid(audio_clk->gpio)) - return gpio_direction_output(audio_clk->gpio, 1); - return 0; -} - -static void audio_ext_clk_unprepare(struct clk *clk) -{ - struct audio_ext_ap_clk *audio_clk = to_audio_ap_clk(clk); - - pr_debug("%s: gpio: %d\n", __func__, audio_clk->gpio); - if (gpio_is_valid(audio_clk->gpio)) - gpio_direction_output(audio_clk->gpio, 0); -} - -static inline struct audio_ext_ap_clk2 *to_audio_ap_clk2(struct clk *clk) -{ - return container_of(clk, struct audio_ext_ap_clk2, c); -} - -static int audio_ext_clk2_prepare(struct clk *clk) -{ - struct audio_ext_ap_clk2 *audio_clk2 = to_audio_ap_clk2(clk); - struct pinctrl_info *pnctrl_info = &audio_clk2->pnctrl_info; - int ret; - - - if (!pnctrl_info->pinctrl || !pnctrl_info->active) - return 0; - - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->active); - if (ret) { - pr_err("%s: active state select failed with %d\n", - __func__, ret); - return -EIO; - } - - clk2_config.enable = 1; - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk2_config); - if (ret < 0) { - pr_err("%s: failed to set clock, ret = %d\n", __func__, ret); - return -EINVAL; - } - - return 0; -} - -static void audio_ext_clk2_unprepare(struct clk *clk) -{ - struct audio_ext_ap_clk2 *audio_clk2 = to_audio_ap_clk2(clk); - struct pinctrl_info *pnctrl_info = &audio_clk2->pnctrl_info; - int ret; - - if (!pnctrl_info->pinctrl || !pnctrl_info->sleep) - return; - - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) - pr_err("%s: sleep state select failed with %d\n", - __func__, ret); - - clk2_config.enable = 0; - ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk2_config); - if (ret < 0) - pr_err("%s: failed to reset clock, ret = %d\n", __func__, ret); -} - -static const struct clk_ops audio_ext_ap_clk_ops = { - .prepare = audio_ext_clk_prepare, - .unprepare = audio_ext_clk_unprepare, -}; - -static const struct clk_ops audio_ext_ap_clk2_ops = { - .prepare = audio_ext_clk2_prepare, - .unprepare = audio_ext_clk2_unprepare, -}; - -static struct audio_ext_pmi_clk audio_pmi_clk = { - .gpio = -EINVAL, - .c = { - .dbg_name = "audio_ext_pmi_clk", - .ops = &clk_ops_dummy, - CLK_INIT(audio_pmi_clk.c), - }, -}; - -static struct audio_ext_pmi_clk audio_pmi_lnbb_clk = { - .gpio = -EINVAL, - .c = { - .dbg_name = "audio_ext_pmi_lnbb_clk", - .ops = &clk_ops_dummy, - CLK_INIT(audio_pmi_lnbb_clk.c), - }, -}; - -static struct audio_ext_ap_clk audio_ap_clk = { - .gpio = -EINVAL, - .c = { - .dbg_name = "audio_ext_ap_clk", - .ops = &audio_ext_ap_clk_ops, - CLK_INIT(audio_ap_clk.c), - }, -}; - -static struct audio_ext_ap_clk2 audio_ap_clk2 = { - .c = { - .dbg_name = "audio_ext_ap_clk2", - .ops = &audio_ext_ap_clk2_ops, - CLK_INIT(audio_ap_clk2.c), - }, -}; - -static struct clk_lookup audio_ref_clock[] = { - CLK_LIST(audio_ap_clk), - CLK_LIST(audio_pmi_clk), - CLK_LIST(audio_pmi_lnbb_clk), - CLK_LIST(audio_ap_clk2), -}; - -static int audio_get_pinctrl(struct platform_device *pdev) -{ - struct pinctrl_info *pnctrl_info; - struct pinctrl *pinctrl; - int ret; - - pnctrl_info = &audio_ap_clk2.pnctrl_info; - - if (pnctrl_info->pinctrl) { - dev_dbg(&pdev->dev, "%s: already requested before\n", - __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(pinctrl)) { - dev_dbg(&pdev->dev, "%s: Unable to get pinctrl handle\n", - __func__); - return -EINVAL; - } - pnctrl_info->pinctrl = pinctrl; - /* get all state handles from Device Tree */ - pnctrl_info->sleep = pinctrl_lookup_state(pinctrl, "sleep"); - if (IS_ERR(pnctrl_info->sleep)) { - dev_err(&pdev->dev, "%s: could not get sleep pinstate\n", - __func__); - goto err; - } - pnctrl_info->active = pinctrl_lookup_state(pinctrl, "active"); - if (IS_ERR(pnctrl_info->active)) { - dev_err(&pdev->dev, "%s: could not get active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pnctrl_info->pinctrl, - pnctrl_info->sleep); - if (ret) { - dev_err(&pdev->dev, "%s: Disable TLMM pins failed with %d\n", - __func__, ret); - goto err; - } - return 0; - -err: - devm_pinctrl_put(pnctrl_info->pinctrl); - return -EINVAL; -} - -static int audio_ref_clk_probe(struct platform_device *pdev) -{ - int clk_gpio; - int ret; - struct clk *audio_clk; - - clk_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,audio-ref-clk-gpio", 0); - if (clk_gpio > 0) { - ret = gpio_request(clk_gpio, "EXT_CLK"); - if (ret) { - dev_err(&pdev->dev, - "Request ext clk gpio failed %d, err:%d\n", - clk_gpio, ret); - goto err; - } - if (of_property_read_bool(pdev->dev.of_node, - "qcom,node_has_rpm_clock")) { - audio_clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(audio_clk)) { - dev_err(&pdev->dev, "Failed to get RPM div clk\n"); - ret = PTR_ERR(audio_clk); - goto err_gpio; - } - audio_pmi_clk.c.parent = audio_clk; - audio_pmi_clk.gpio = clk_gpio; - } else - audio_ap_clk.gpio = clk_gpio; - - } else { - if (of_property_read_bool(pdev->dev.of_node, - "qcom,node_has_rpm_clock")) { - audio_clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(audio_clk)) { - dev_err(&pdev->dev, "Failed to get lnbbclk2\n"); - ret = PTR_ERR(audio_clk); - goto err; - } - audio_pmi_lnbb_clk.c.parent = audio_clk; - audio_pmi_lnbb_clk.gpio = -EINVAL; - } - } - - ret = audio_get_pinctrl(pdev); - if (ret) - dev_dbg(&pdev->dev, "%s: Parsing pinctrl failed\n", - __func__); - - ret = of_msm_clock_register(pdev->dev.of_node, audio_ref_clock, - ARRAY_SIZE(audio_ref_clock)); - if (ret) { - dev_err(&pdev->dev, "%s: audio ref clock register failed\n", - __func__); - goto err_gpio; - } - - return 0; - -err_gpio: - gpio_free(clk_gpio); - -err: - return ret; -} - -static int audio_ref_clk_remove(struct platform_device *pdev) -{ - struct pinctrl_info *pnctrl_info = &audio_ap_clk2.pnctrl_info; - - if (audio_pmi_clk.gpio > 0) - gpio_free(audio_pmi_clk.gpio); - else if (audio_ap_clk.gpio > 0) - gpio_free(audio_ap_clk.gpio); - - if (pnctrl_info->pinctrl) { - devm_pinctrl_put(pnctrl_info->pinctrl); - pnctrl_info->pinctrl = NULL; - } - - return 0; -} - -static const struct of_device_id audio_ref_clk_match[] = { - {.compatible = "qcom,audio-ref-clk"}, - {} -}; -MODULE_DEVICE_TABLE(of, audio_ref_clk_match); - -static struct platform_driver audio_ref_clk_driver = { - .driver = { - .name = "audio-ref-clk", - .owner = THIS_MODULE, - .of_match_table = audio_ref_clk_match, - }, - .probe = audio_ref_clk_probe, - .remove = audio_ref_clk_remove, -}; - -int audio_ref_clk_platform_init(void) -{ - return platform_driver_register(&audio_ref_clk_driver); -} - -void audio_ref_clk_platform_exit(void) -{ - platform_driver_unregister(&audio_ref_clk_driver); -} - -MODULE_DESCRIPTION("Audio Ref Clock module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/bolero/Android.mk b/techpack/audio/asoc/codecs/bolero/Android.mk deleted file mode 100644 index ab7224434aa4..000000000000 --- a/techpack/audio/asoc/codecs/bolero/Android.mk +++ /dev/null @@ -1,82 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=bolero_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_bolero_cdc.ko -LOCAL_MODULE_KBUILD_NAME := bolero_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa_macro.ko -LOCAL_MODULE_KBUILD_NAME := wsa_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_va_macro.ko -LOCAL_MODULE_KBUILD_NAME := va_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_tx_macro.ko -LOCAL_MODULE_KBUILD_NAME := tx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_rx_macro.ko -LOCAL_MODULE_KBUILD_NAME := rx_macro_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/bolero/Kbuild b/techpack/audio/asoc/codecs/bolero/Kbuild deleted file mode 100644 index 1ee35c873473..000000000000 --- a/techpack/audio/asoc/codecs/bolero/Kbuild +++ /dev/null @@ -1,147 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ BOLERO ############ - -# for BOLERO Codec -ifdef CONFIG_SND_SOC_BOLERO - BOLERO_OBJS += bolero-cdc.o - BOLERO_OBJS += bolero-cdc-utils.o - BOLERO_OBJS += bolero-cdc-regmap.o - BOLERO_OBJS += bolero-cdc-tables.o -endif - -ifdef CONFIG_WSA_MACRO - WSA_OBJS += wsa-macro.o -endif - -ifdef CONFIG_VA_MACRO - VA_OBJS += va-macro.o -endif - -ifdef CONFIG_TX_MACRO - TX_OBJS += tx-macro.o -endif - -ifdef CONFIG_RX_MACRO - RX_OBJS += rx-macro.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_BOLERO) += bolero_cdc_dlkm.o -bolero_cdc_dlkm-y := $(BOLERO_OBJS) - -obj-$(CONFIG_WSA_MACRO) += wsa_macro_dlkm.o -wsa_macro_dlkm-y := $(WSA_OBJS) - -obj-$(CONFIG_VA_MACRO) += va_macro_dlkm.o -va_macro_dlkm-y := $(VA_OBJS) - -obj-$(CONFIG_TX_MACRO) += tx_macro_dlkm.o -tx_macro_dlkm-y := $(TX_OBJS) - -obj-$(CONFIG_RX_MACRO) += rx_macro_dlkm.o -rx_macro_dlkm-y := $(RX_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/bolero/bolero-cdc-registers.h b/techpack/audio/asoc/codecs/bolero/bolero-cdc-registers.h deleted file mode 100644 index d413ff9616f8..000000000000 --- a/techpack/audio/asoc/codecs/bolero/bolero-cdc-registers.h +++ /dev/null @@ -1,840 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _BOLERO_CDC_REGISTERS_H -#define _BOLERO_CDC_REGISTERS_H - -#define TX_START_OFFSET 0x0000 - -#define BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL (TX_START_OFFSET + 0x0000) -#define BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL (TX_START_OFFSET + 0x0004) -#define BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL (TX_START_OFFSET + 0x0008) -#define BOLERO_CDC_TX_TOP_CSR_TOP_CFG0 (TX_START_OFFSET + 0x0080) -#define BOLERO_CDC_TX_TOP_CSR_ANC_CFG (TX_START_OFFSET + 0x0084) -#define BOLERO_CDC_TX_TOP_CSR_SWR_CTRL (TX_START_OFFSET + 0x0088) -#define BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK (TX_START_OFFSET + 0x0090) -#define BOLERO_CDC_TX_TOP_CSR_DEBUG_BUS (TX_START_OFFSET + 0x0094) -#define BOLERO_CDC_TX_TOP_CSR_DEBUG_EN (TX_START_OFFSET + 0x0098) -#define BOLERO_CDC_TX_TOP_CSR_TX_I2S_CTL (TX_START_OFFSET + 0x00A4) -#define BOLERO_CDC_TX_TOP_CSR_I2S_CLK (TX_START_OFFSET + 0x00A8) -#define BOLERO_CDC_TX_TOP_CSR_I2S_RESET (TX_START_OFFSET + 0x00AC) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL (TX_START_OFFSET + 0x00C0) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL (TX_START_OFFSET + 0x00C4) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL (TX_START_OFFSET + 0x00C8) -#define BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL (TX_START_OFFSET + 0x00CC) -#define BOLERO_CDC_TX_TOP_CSR_SWR_AMIC0_CTL (TX_START_OFFSET + 0x00D0) -#define BOLERO_CDC_TX_TOP_CSR_SWR_AMIC1_CTL (TX_START_OFFSET + 0x00D4) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 (TX_START_OFFSET + 0x0100) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 (TX_START_OFFSET + 0x0104) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0 (TX_START_OFFSET + 0x0108) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1 (TX_START_OFFSET + 0x010C) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0 (TX_START_OFFSET + 0x0110) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1 (TX_START_OFFSET + 0x0114) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0 (TX_START_OFFSET + 0x0118) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1 (TX_START_OFFSET + 0x011C) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0 (TX_START_OFFSET + 0x0120) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1 (TX_START_OFFSET + 0x0124) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0 (TX_START_OFFSET + 0x0128) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1 (TX_START_OFFSET + 0x012C) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0 (TX_START_OFFSET + 0x0130) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1 (TX_START_OFFSET + 0x0134) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0 (TX_START_OFFSET + 0x0138) -#define BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1 (TX_START_OFFSET + 0x013C) -#define BOLERO_CDC_TX_ANC0_CLK_RESET_CTL (TX_START_OFFSET + 0x0200) -#define BOLERO_CDC_TX_ANC0_MODE_1_CTL (TX_START_OFFSET + 0x0204) -#define BOLERO_CDC_TX_ANC0_MODE_2_CTL (TX_START_OFFSET + 0x0208) -#define BOLERO_CDC_TX_ANC0_FF_SHIFT (TX_START_OFFSET + 0x020C) -#define BOLERO_CDC_TX_ANC0_FB_SHIFT (TX_START_OFFSET + 0x0210) -#define BOLERO_CDC_TX_ANC0_LPF_FF_A_CTL (TX_START_OFFSET + 0x0214) -#define BOLERO_CDC_TX_ANC0_LPF_FF_B_CTL (TX_START_OFFSET + 0x0218) -#define BOLERO_CDC_TX_ANC0_LPF_FB_CTL (TX_START_OFFSET + 0x021C) -#define BOLERO_CDC_TX_ANC0_SMLPF_CTL (TX_START_OFFSET + 0x0220) -#define BOLERO_CDC_TX_ANC0_DCFLT_SHIFT_CTL (TX_START_OFFSET + 0x0224) -#define BOLERO_CDC_TX_ANC0_IIR_ADAPT_CTL (TX_START_OFFSET + 0x0228) -#define BOLERO_CDC_TX_ANC0_IIR_COEFF_1_CTL (TX_START_OFFSET + 0x022C) -#define BOLERO_CDC_TX_ANC0_IIR_COEFF_2_CTL (TX_START_OFFSET + 0x0230) -#define BOLERO_CDC_TX_ANC0_FF_A_GAIN_CTL (TX_START_OFFSET + 0x0234) -#define BOLERO_CDC_TX_ANC0_FF_B_GAIN_CTL (TX_START_OFFSET + 0x0238) -#define BOLERO_CDC_TX_ANC0_FB_GAIN_CTL (TX_START_OFFSET + 0x023C) -#define BOLERO_CDC_TX0_TX_PATH_CTL (TX_START_OFFSET + 0x0400) -#define BOLERO_CDC_TX0_TX_PATH_CFG0 (TX_START_OFFSET + 0x0404) -#define BOLERO_CDC_TX0_TX_PATH_CFG1 (TX_START_OFFSET + 0x0408) -#define BOLERO_CDC_TX0_TX_VOL_CTL (TX_START_OFFSET + 0x040C) -#define BOLERO_CDC_TX0_TX_PATH_SEC0 (TX_START_OFFSET + 0x0410) -#define BOLERO_CDC_TX0_TX_PATH_SEC1 (TX_START_OFFSET + 0x0414) -#define BOLERO_CDC_TX0_TX_PATH_SEC2 (TX_START_OFFSET + 0x0418) -#define BOLERO_CDC_TX0_TX_PATH_SEC3 (TX_START_OFFSET + 0x041C) -#define BOLERO_CDC_TX0_TX_PATH_SEC4 (TX_START_OFFSET + 0x0420) -#define BOLERO_CDC_TX0_TX_PATH_SEC5 (TX_START_OFFSET + 0x0424) -#define BOLERO_CDC_TX0_TX_PATH_SEC6 (TX_START_OFFSET + 0x0428) -#define BOLERO_CDC_TX0_TX_PATH_SEC7 (TX_START_OFFSET + 0x042C) -#define BOLERO_CDC_TX1_TX_PATH_CTL (TX_START_OFFSET + 0x0480) -#define BOLERO_CDC_TX1_TX_PATH_CFG0 (TX_START_OFFSET + 0x0484) -#define BOLERO_CDC_TX1_TX_PATH_CFG1 (TX_START_OFFSET + 0x0488) -#define BOLERO_CDC_TX1_TX_VOL_CTL (TX_START_OFFSET + 0x048C) -#define BOLERO_CDC_TX1_TX_PATH_SEC0 (TX_START_OFFSET + 0x0490) -#define BOLERO_CDC_TX1_TX_PATH_SEC1 (TX_START_OFFSET + 0x0494) -#define BOLERO_CDC_TX1_TX_PATH_SEC2 (TX_START_OFFSET + 0x0498) -#define BOLERO_CDC_TX1_TX_PATH_SEC3 (TX_START_OFFSET + 0x049C) -#define BOLERO_CDC_TX1_TX_PATH_SEC4 (TX_START_OFFSET + 0x04A0) -#define BOLERO_CDC_TX1_TX_PATH_SEC5 (TX_START_OFFSET + 0x04A4) -#define BOLERO_CDC_TX1_TX_PATH_SEC6 (TX_START_OFFSET + 0x04A8) -#define BOLERO_CDC_TX2_TX_PATH_CTL (TX_START_OFFSET + 0x0500) -#define BOLERO_CDC_TX2_TX_PATH_CFG0 (TX_START_OFFSET + 0x0504) -#define BOLERO_CDC_TX2_TX_PATH_CFG1 (TX_START_OFFSET + 0x0508) -#define BOLERO_CDC_TX2_TX_VOL_CTL (TX_START_OFFSET + 0x050C) -#define BOLERO_CDC_TX2_TX_PATH_SEC0 (TX_START_OFFSET + 0x0510) -#define BOLERO_CDC_TX2_TX_PATH_SEC1 (TX_START_OFFSET + 0x0514) -#define BOLERO_CDC_TX2_TX_PATH_SEC2 (TX_START_OFFSET + 0x0518) -#define BOLERO_CDC_TX2_TX_PATH_SEC3 (TX_START_OFFSET + 0x051C) -#define BOLERO_CDC_TX2_TX_PATH_SEC4 (TX_START_OFFSET + 0x0520) -#define BOLERO_CDC_TX2_TX_PATH_SEC5 (TX_START_OFFSET + 0x0524) -#define BOLERO_CDC_TX2_TX_PATH_SEC6 (TX_START_OFFSET + 0x0528) -#define BOLERO_CDC_TX3_TX_PATH_CTL (TX_START_OFFSET + 0x0580) -#define BOLERO_CDC_TX3_TX_PATH_CFG0 (TX_START_OFFSET + 0x0584) -#define BOLERO_CDC_TX3_TX_PATH_CFG1 (TX_START_OFFSET + 0x0588) -#define BOLERO_CDC_TX3_TX_VOL_CTL (TX_START_OFFSET + 0x058C) -#define BOLERO_CDC_TX3_TX_PATH_SEC0 (TX_START_OFFSET + 0x0590) -#define BOLERO_CDC_TX3_TX_PATH_SEC1 (TX_START_OFFSET + 0x0594) -#define BOLERO_CDC_TX3_TX_PATH_SEC2 (TX_START_OFFSET + 0x0598) -#define BOLERO_CDC_TX3_TX_PATH_SEC3 (TX_START_OFFSET + 0x059C) -#define BOLERO_CDC_TX3_TX_PATH_SEC4 (TX_START_OFFSET + 0x05A0) -#define BOLERO_CDC_TX3_TX_PATH_SEC5 (TX_START_OFFSET + 0x05A4) -#define BOLERO_CDC_TX3_TX_PATH_SEC6 (TX_START_OFFSET + 0x05A8) -#define BOLERO_CDC_TX4_TX_PATH_CTL (TX_START_OFFSET + 0x0600) -#define BOLERO_CDC_TX4_TX_PATH_CFG0 (TX_START_OFFSET + 0x0604) -#define BOLERO_CDC_TX4_TX_PATH_CFG1 (TX_START_OFFSET + 0x0608) -#define BOLERO_CDC_TX4_TX_VOL_CTL (TX_START_OFFSET + 0x060C) -#define BOLERO_CDC_TX4_TX_PATH_SEC0 (TX_START_OFFSET + 0x0610) -#define BOLERO_CDC_TX4_TX_PATH_SEC1 (TX_START_OFFSET + 0x0614) -#define BOLERO_CDC_TX4_TX_PATH_SEC2 (TX_START_OFFSET + 0x0618) -#define BOLERO_CDC_TX4_TX_PATH_SEC3 (TX_START_OFFSET + 0x061C) -#define BOLERO_CDC_TX4_TX_PATH_SEC4 (TX_START_OFFSET + 0x0620) -#define BOLERO_CDC_TX4_TX_PATH_SEC5 (TX_START_OFFSET + 0x0624) -#define BOLERO_CDC_TX4_TX_PATH_SEC6 (TX_START_OFFSET + 0x0628) -#define BOLERO_CDC_TX5_TX_PATH_CTL (TX_START_OFFSET + 0x0680) -#define BOLERO_CDC_TX5_TX_PATH_CFG0 (TX_START_OFFSET + 0x0684) -#define BOLERO_CDC_TX5_TX_PATH_CFG1 (TX_START_OFFSET + 0x0688) -#define BOLERO_CDC_TX5_TX_VOL_CTL (TX_START_OFFSET + 0x068C) -#define BOLERO_CDC_TX5_TX_PATH_SEC0 (TX_START_OFFSET + 0x0690) -#define BOLERO_CDC_TX5_TX_PATH_SEC1 (TX_START_OFFSET + 0x0694) -#define BOLERO_CDC_TX5_TX_PATH_SEC2 (TX_START_OFFSET + 0x0698) -#define BOLERO_CDC_TX5_TX_PATH_SEC3 (TX_START_OFFSET + 0x069C) -#define BOLERO_CDC_TX5_TX_PATH_SEC4 (TX_START_OFFSET + 0x06A0) -#define BOLERO_CDC_TX5_TX_PATH_SEC5 (TX_START_OFFSET + 0x06A4) -#define BOLERO_CDC_TX5_TX_PATH_SEC6 (TX_START_OFFSET + 0x06A8) -#define BOLERO_CDC_TX6_TX_PATH_CTL (TX_START_OFFSET + 0x0700) -#define BOLERO_CDC_TX6_TX_PATH_CFG0 (TX_START_OFFSET + 0x0704) -#define BOLERO_CDC_TX6_TX_PATH_CFG1 (TX_START_OFFSET + 0x0708) -#define BOLERO_CDC_TX6_TX_VOL_CTL (TX_START_OFFSET + 0x070C) -#define BOLERO_CDC_TX6_TX_PATH_SEC0 (TX_START_OFFSET + 0x0710) -#define BOLERO_CDC_TX6_TX_PATH_SEC1 (TX_START_OFFSET + 0x0714) -#define BOLERO_CDC_TX6_TX_PATH_SEC2 (TX_START_OFFSET + 0x0718) -#define BOLERO_CDC_TX6_TX_PATH_SEC3 (TX_START_OFFSET + 0x071C) -#define BOLERO_CDC_TX6_TX_PATH_SEC4 (TX_START_OFFSET + 0x0720) -#define BOLERO_CDC_TX6_TX_PATH_SEC5 (TX_START_OFFSET + 0x0724) -#define BOLERO_CDC_TX6_TX_PATH_SEC6 (TX_START_OFFSET + 0x0728) -#define BOLERO_CDC_TX7_TX_PATH_CTL (TX_START_OFFSET + 0x0780) -#define BOLERO_CDC_TX7_TX_PATH_CFG0 (TX_START_OFFSET + 0x0784) -#define BOLERO_CDC_TX7_TX_PATH_CFG1 (TX_START_OFFSET + 0x0788) -#define BOLERO_CDC_TX7_TX_VOL_CTL (TX_START_OFFSET + 0x078C) -#define BOLERO_CDC_TX7_TX_PATH_SEC0 (TX_START_OFFSET + 0x0790) -#define BOLERO_CDC_TX7_TX_PATH_SEC1 (TX_START_OFFSET + 0x0794) -#define BOLERO_CDC_TX7_TX_PATH_SEC2 (TX_START_OFFSET + 0x0798) -#define BOLERO_CDC_TX7_TX_PATH_SEC3 (TX_START_OFFSET + 0x079C) -#define BOLERO_CDC_TX7_TX_PATH_SEC4 (TX_START_OFFSET + 0x07A0) -#define BOLERO_CDC_TX7_TX_PATH_SEC5 (TX_START_OFFSET + 0x07A4) -#define BOLERO_CDC_TX7_TX_PATH_SEC6 (TX_START_OFFSET + 0x07A8) -#define TX_MAX_OFFSET (TX_START_OFFSET + 0x07A8) - -#define BOLERO_CDC_TX_MACRO_MAX 0x1EB /* 7A8/4 = 1EA + 1 */ - -#define RX_START_OFFSET 0x1000 -#define BOLERO_CDC_RX_TOP_TOP_CFG0 (RX_START_OFFSET + 0x0000) -#define BOLERO_CDC_RX_TOP_SWR_CTRL (RX_START_OFFSET + 0x0008) -#define BOLERO_CDC_RX_TOP_DEBUG (RX_START_OFFSET + 0x000C) -#define BOLERO_CDC_RX_TOP_DEBUG_BUS (RX_START_OFFSET + 0x0010) -#define BOLERO_CDC_RX_TOP_DEBUG_EN0 (RX_START_OFFSET + 0x0014) -#define BOLERO_CDC_RX_TOP_DEBUG_EN1 (RX_START_OFFSET + 0x0018) -#define BOLERO_CDC_RX_TOP_DEBUG_EN2 (RX_START_OFFSET + 0x001C) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB (RX_START_OFFSET + 0x0020) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB (RX_START_OFFSET + 0x0024) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_LUT (RX_START_OFFSET + 0x0028) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB (RX_START_OFFSET + 0x002C) -#define BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB (RX_START_OFFSET + 0x0030) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB (RX_START_OFFSET + 0x0034) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB (RX_START_OFFSET + 0x0038) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_LUT (RX_START_OFFSET + 0x003C) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB (RX_START_OFFSET + 0x0040) -#define BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB (RX_START_OFFSET + 0x0044) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG0 (RX_START_OFFSET + 0x0070) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG1 (RX_START_OFFSET + 0x0074) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2 (RX_START_OFFSET + 0x0078) -#define BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG3 (RX_START_OFFSET + 0x007C) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG0 (RX_START_OFFSET + 0x0080) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG1 (RX_START_OFFSET + 0x0084) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2 (RX_START_OFFSET + 0x0088) -#define BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG3 (RX_START_OFFSET + 0x008C) -#define BOLERO_CDC_RX_TOP_RX_I2S_CTL (RX_START_OFFSET + 0x0090) -#define BOLERO_CDC_RX_TOP_TX_I2S2_CTL (RX_START_OFFSET + 0x0094) -#define BOLERO_CDC_RX_TOP_I2S_CLK (RX_START_OFFSET + 0x0098) -#define BOLERO_CDC_RX_TOP_I2S_RESET (RX_START_OFFSET + 0x009C) -#define BOLERO_CDC_RX_TOP_I2S_MUX (RX_START_OFFSET + 0x00A0) -#define BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL (RX_START_OFFSET + 0x0100) -#define BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL \ - (RX_START_OFFSET + 0x0104) -#define BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL (RX_START_OFFSET + 0x0108) -#define BOLERO_CDC_RX_CLK_RST_CTRL_DSD_CONTROL (RX_START_OFFSET + 0x010C) -#define BOLERO_CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL \ - (RX_START_OFFSET + 0x0110) -#define BOLERO_CDC_RX_SOFTCLIP_CRC (RX_START_OFFSET + 0x0140) -#define BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL (RX_START_OFFSET + 0x0144) -#define BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0 (RX_START_OFFSET + 0x0180) -#define BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1 (RX_START_OFFSET + 0x0184) -#define BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0 (RX_START_OFFSET + 0x0188) -#define BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1 (RX_START_OFFSET + 0x018C) -#define BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0 (RX_START_OFFSET + 0x0190) -#define BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1 (RX_START_OFFSET + 0x0194) -#define BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4 (RX_START_OFFSET + 0x0198) -#define BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5 (RX_START_OFFSET + 0x019C) -#define BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 (RX_START_OFFSET + 0x01A0) -#define BOLERO_CDC_RX_CLSH_CRC (RX_START_OFFSET + 0x0200) -#define BOLERO_CDC_RX_CLSH_DLY_CTRL (RX_START_OFFSET + 0x0204) -#define BOLERO_CDC_RX_CLSH_DECAY_CTRL (RX_START_OFFSET + 0x0208) -#define BOLERO_CDC_RX_CLSH_HPH_V_PA (RX_START_OFFSET + 0x020C) -#define BOLERO_CDC_RX_CLSH_EAR_V_PA (RX_START_OFFSET + 0x0210) -#define BOLERO_CDC_RX_CLSH_HPH_V_HD (RX_START_OFFSET + 0x0214) -#define BOLERO_CDC_RX_CLSH_EAR_V_HD (RX_START_OFFSET + 0x0218) -#define BOLERO_CDC_RX_CLSH_K1_MSB (RX_START_OFFSET + 0x021C) -#define BOLERO_CDC_RX_CLSH_K1_LSB (RX_START_OFFSET + 0x0220) -#define BOLERO_CDC_RX_CLSH_K2_MSB (RX_START_OFFSET + 0x0224) -#define BOLERO_CDC_RX_CLSH_K2_LSB (RX_START_OFFSET + 0x0228) -#define BOLERO_CDC_RX_CLSH_IDLE_CTRL (RX_START_OFFSET + 0x022C) -#define BOLERO_CDC_RX_CLSH_IDLE_HPH (RX_START_OFFSET + 0x0230) -#define BOLERO_CDC_RX_CLSH_IDLE_EAR (RX_START_OFFSET + 0x0234) -#define BOLERO_CDC_RX_CLSH_TEST0 (RX_START_OFFSET + 0x0238) -#define BOLERO_CDC_RX_CLSH_TEST1 (RX_START_OFFSET + 0x023C) -#define BOLERO_CDC_RX_CLSH_OVR_VREF (RX_START_OFFSET + 0x0240) -#define BOLERO_CDC_RX_CLSH_CLSG_CTL (RX_START_OFFSET + 0x0244) -#define BOLERO_CDC_RX_CLSH_CLSG_CFG1 (RX_START_OFFSET + 0x0248) -#define BOLERO_CDC_RX_CLSH_CLSG_CFG2 (RX_START_OFFSET + 0x024C) -#define BOLERO_CDC_RX_BCL_VBAT_PATH_CTL (RX_START_OFFSET + 0x0280) -#define BOLERO_CDC_RX_BCL_VBAT_CFG (RX_START_OFFSET + 0x0284) -#define BOLERO_CDC_RX_BCL_VBAT_ADC_CAL1 (RX_START_OFFSET + 0x0288) -#define BOLERO_CDC_RX_BCL_VBAT_ADC_CAL2 (RX_START_OFFSET + 0x028C) -#define BOLERO_CDC_RX_BCL_VBAT_ADC_CAL3 (RX_START_OFFSET + 0x0290) -#define BOLERO_CDC_RX_BCL_VBAT_PK_EST1 (RX_START_OFFSET + 0x0294) -#define BOLERO_CDC_RX_BCL_VBAT_PK_EST2 (RX_START_OFFSET + 0x0298) -#define BOLERO_CDC_RX_BCL_VBAT_PK_EST3 (RX_START_OFFSET + 0x029C) -#define BOLERO_CDC_RX_BCL_VBAT_RF_PROC1 (RX_START_OFFSET + 0x02A0) -#define BOLERO_CDC_RX_BCL_VBAT_RF_PROC2 (RX_START_OFFSET + 0x02A4) -#define BOLERO_CDC_RX_BCL_VBAT_TAC1 (RX_START_OFFSET + 0x02A8) -#define BOLERO_CDC_RX_BCL_VBAT_TAC2 (RX_START_OFFSET + 0x02AC) -#define BOLERO_CDC_RX_BCL_VBAT_TAC3 (RX_START_OFFSET + 0x02B0) -#define BOLERO_CDC_RX_BCL_VBAT_TAC4 (RX_START_OFFSET + 0x02B4) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD1 (RX_START_OFFSET + 0x02B8) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD2 (RX_START_OFFSET + 0x02BC) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD3 (RX_START_OFFSET + 0x02C0) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD4 (RX_START_OFFSET + 0x02C4) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD5 (RX_START_OFFSET + 0x02C8) -#define BOLERO_CDC_RX_BCL_VBAT_DEBUG1 (RX_START_OFFSET + 0x02CC) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD_MON (RX_START_OFFSET + 0x02D0) -#define BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL (RX_START_OFFSET + 0x02D4) -#define BOLERO_CDC_RX_BCL_VBAT_BAN (RX_START_OFFSET + 0x02D8) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1 (RX_START_OFFSET + 0x02DC) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2 (RX_START_OFFSET + 0x02E0) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3 (RX_START_OFFSET + 0x02E4) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4 (RX_START_OFFSET + 0x02E8) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5 (RX_START_OFFSET + 0x02EC) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6 (RX_START_OFFSET + 0x02F0) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7 (RX_START_OFFSET + 0x02F4) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8 (RX_START_OFFSET + 0x02F8) -#define BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9 (RX_START_OFFSET + 0x02FC) -#define BOLERO_CDC_RX_BCL_VBAT_ATTN1 (RX_START_OFFSET + 0x0300) -#define BOLERO_CDC_RX_BCL_VBAT_ATTN2 (RX_START_OFFSET + 0x0304) -#define BOLERO_CDC_RX_BCL_VBAT_ATTN3 (RX_START_OFFSET + 0x0308) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1 (RX_START_OFFSET + 0x030C) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL2 (RX_START_OFFSET + 0x0310) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1 (RX_START_OFFSET + 0x0314) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2 (RX_START_OFFSET + 0x0318) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3 (RX_START_OFFSET + 0x031C) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG4 (RX_START_OFFSET + 0x0320) -#define BOLERO_CDC_RX_BCL_VBAT_DECODE_ST (RX_START_OFFSET + 0x0324) -#define BOLERO_CDC_RX_INTR_CTRL_CFG (RX_START_OFFSET + 0x0340) -#define BOLERO_CDC_RX_INTR_CTRL_CLR_COMMIT (RX_START_OFFSET + 0x0344) -#define BOLERO_CDC_RX_INTR_CTRL_PIN1_MASK0 (RX_START_OFFSET + 0x0360) -#define BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0 (RX_START_OFFSET + 0x0368) -#define BOLERO_CDC_RX_INTR_CTRL_PIN1_CLEAR0 (RX_START_OFFSET + 0x0370) -#define BOLERO_CDC_RX_INTR_CTRL_PIN2_MASK0 (RX_START_OFFSET + 0x0380) -#define BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0 (RX_START_OFFSET + 0x0388) -#define BOLERO_CDC_RX_INTR_CTRL_PIN2_CLEAR0 (RX_START_OFFSET + 0x0390) -#define BOLERO_CDC_RX_INTR_CTRL_LEVEL0 (RX_START_OFFSET + 0x03C0) -#define BOLERO_CDC_RX_INTR_CTRL_BYPASS0 (RX_START_OFFSET + 0x03C8) -#define BOLERO_CDC_RX_INTR_CTRL_SET0 (RX_START_OFFSET + 0x03D0) -#define BOLERO_CDC_RX_RX0_RX_PATH_CTL (RX_START_OFFSET + 0x0400) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG0 (RX_START_OFFSET + 0x0404) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG1 (RX_START_OFFSET + 0x0408) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG2 (RX_START_OFFSET + 0x040C) -#define BOLERO_CDC_RX_RX0_RX_PATH_CFG3 (RX_START_OFFSET + 0x0410) -#define BOLERO_CDC_RX_RX0_RX_VOL_CTL (RX_START_OFFSET + 0x0414) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL (RX_START_OFFSET + 0x0418) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_CFG (RX_START_OFFSET + 0x041C) -#define BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL (RX_START_OFFSET + 0x0420) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC1 (RX_START_OFFSET + 0x0424) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC2 (RX_START_OFFSET + 0x0428) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC3 (RX_START_OFFSET + 0x042C) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC4 (RX_START_OFFSET + 0x0430) -#define BOLERO_CDC_RX_RX0_RX_PATH_SEC7 (RX_START_OFFSET + 0x0434) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC0 (RX_START_OFFSET + 0x0438) -#define BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC1 (RX_START_OFFSET + 0x043C) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL (RX_START_OFFSET + 0x0440) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA1 (RX_START_OFFSET + 0x0444) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA2 (RX_START_OFFSET + 0x0448) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA3 (RX_START_OFFSET + 0x044C) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA4 (RX_START_OFFSET + 0x0450) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA5 (RX_START_OFFSET + 0x0454) -#define BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA6 (RX_START_OFFSET + 0x0458) -#define BOLERO_CDC_RX_RX1_RX_PATH_CTL (RX_START_OFFSET + 0x0480) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG0 (RX_START_OFFSET + 0x0484) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG1 (RX_START_OFFSET + 0x0488) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG2 (RX_START_OFFSET + 0x048C) -#define BOLERO_CDC_RX_RX1_RX_PATH_CFG3 (RX_START_OFFSET + 0x0490) -#define BOLERO_CDC_RX_RX1_RX_VOL_CTL (RX_START_OFFSET + 0x0494) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_CTL (RX_START_OFFSET + 0x0498) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_CFG (RX_START_OFFSET + 0x049C) -#define BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL (RX_START_OFFSET + 0x04A0) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC1 (RX_START_OFFSET + 0x04A4) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC2 (RX_START_OFFSET + 0x04A8) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC3 (RX_START_OFFSET + 0x04AC) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC4 (RX_START_OFFSET + 0x04B0) -#define BOLERO_CDC_RX_RX1_RX_PATH_SEC7 (RX_START_OFFSET + 0x04B4) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC0 (RX_START_OFFSET + 0x04B8) -#define BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC1 (RX_START_OFFSET + 0x04BC) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL (RX_START_OFFSET + 0x04C0) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA1 (RX_START_OFFSET + 0x04C4) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA2 (RX_START_OFFSET + 0x04C8) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA3 (RX_START_OFFSET + 0x04CC) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA4 (RX_START_OFFSET + 0x04D0) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA5 (RX_START_OFFSET + 0x04D4) -#define BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA6 (RX_START_OFFSET + 0x04D8) -#define BOLERO_CDC_RX_RX2_RX_PATH_CTL (RX_START_OFFSET + 0x0500) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG0 (RX_START_OFFSET + 0x0504) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG1 (RX_START_OFFSET + 0x0508) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG2 (RX_START_OFFSET + 0x050C) -#define BOLERO_CDC_RX_RX2_RX_PATH_CFG3 (RX_START_OFFSET + 0x0510) -#define BOLERO_CDC_RX_RX2_RX_VOL_CTL (RX_START_OFFSET + 0x0514) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_CTL (RX_START_OFFSET + 0x0518) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_CFG (RX_START_OFFSET + 0x051C) -#define BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL (RX_START_OFFSET + 0x0520) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC0 (RX_START_OFFSET + 0x0524) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC1 (RX_START_OFFSET + 0x0528) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC2 (RX_START_OFFSET + 0x052C) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC3 (RX_START_OFFSET + 0x0530) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC4 (RX_START_OFFSET + 0x0534) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC5 (RX_START_OFFSET + 0x0538) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC6 (RX_START_OFFSET + 0x053C) -#define BOLERO_CDC_RX_RX2_RX_PATH_SEC7 (RX_START_OFFSET + 0x0540) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC0 (RX_START_OFFSET + 0x0544) -#define BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC1 (RX_START_OFFSET + 0x0548) -#define BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL (RX_START_OFFSET + 0x054C) -#define BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL (RX_START_OFFSET + 0x0780) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG0 (RX_START_OFFSET + 0x0784) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG1 (RX_START_OFFSET + 0x0788) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG2 (RX_START_OFFSET + 0x078C) -#define BOLERO_CDC_RX_IDLE_DETECT_CFG3 (RX_START_OFFSET + 0x0790) -#define BOLERO_CDC_RX_COMPANDER0_CTL0 (RX_START_OFFSET + 0x0800) -#define BOLERO_CDC_RX_COMPANDER0_CTL1 (RX_START_OFFSET + 0x0804) -#define BOLERO_CDC_RX_COMPANDER0_CTL2 (RX_START_OFFSET + 0x0808) -#define BOLERO_CDC_RX_COMPANDER0_CTL3 (RX_START_OFFSET + 0x080C) -#define BOLERO_CDC_RX_COMPANDER0_CTL4 (RX_START_OFFSET + 0x0810) -#define BOLERO_CDC_RX_COMPANDER0_CTL5 (RX_START_OFFSET + 0x0814) -#define BOLERO_CDC_RX_COMPANDER0_CTL6 (RX_START_OFFSET + 0x0818) -#define BOLERO_CDC_RX_COMPANDER0_CTL7 (RX_START_OFFSET + 0x081C) -#define BOLERO_CDC_RX_COMPANDER1_CTL0 (RX_START_OFFSET + 0x0840) -#define BOLERO_CDC_RX_COMPANDER1_CTL1 (RX_START_OFFSET + 0x0844) -#define BOLERO_CDC_RX_COMPANDER1_CTL2 (RX_START_OFFSET + 0x0848) -#define BOLERO_CDC_RX_COMPANDER1_CTL3 (RX_START_OFFSET + 0x084C) -#define BOLERO_CDC_RX_COMPANDER1_CTL4 (RX_START_OFFSET + 0x0850) -#define BOLERO_CDC_RX_COMPANDER1_CTL5 (RX_START_OFFSET + 0x0854) -#define BOLERO_CDC_RX_COMPANDER1_CTL6 (RX_START_OFFSET + 0x0858) -#define BOLERO_CDC_RX_COMPANDER1_CTL7 (RX_START_OFFSET + 0x085C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL \ - (RX_START_OFFSET + 0x0A00) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL \ - (RX_START_OFFSET + 0x0A04) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL \ - (RX_START_OFFSET + 0x0A08) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL \ - (RX_START_OFFSET + 0x0A0C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL \ - (RX_START_OFFSET + 0x0A10) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL \ - (RX_START_OFFSET + 0x0A14) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL \ - (RX_START_OFFSET + 0x0A18) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL \ - (RX_START_OFFSET + 0x0A1C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL \ - (RX_START_OFFSET + 0x0A20) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL (RX_START_OFFSET + 0x0A24) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL \ - (RX_START_OFFSET + 0x0A28) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL \ - (RX_START_OFFSET + 0x0A2C) -#define BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL \ - (RX_START_OFFSET + 0x0A30) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL \ - (RX_START_OFFSET + 0x0A80) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL \ - (RX_START_OFFSET + 0x0A84) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL \ - (RX_START_OFFSET + 0x0A88) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL \ - (RX_START_OFFSET + 0x0A8C) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL \ - (RX_START_OFFSET + 0x0A90) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL \ - (RX_START_OFFSET + 0x0A94) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL \ - (RX_START_OFFSET + 0x0A98) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL \ - (RX_START_OFFSET + 0x0A9C) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL \ - (RX_START_OFFSET + 0x0AA0) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_CTL (RX_START_OFFSET + 0x0AA4) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL \ - (RX_START_OFFSET + 0x0AA8) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL \ - (RX_START_OFFSET + 0x0AAC) -#define BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL \ - (RX_START_OFFSET + 0x0AB0) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0 (RX_START_OFFSET + 0x0B00) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1 (RX_START_OFFSET + 0x0B04) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2 (RX_START_OFFSET + 0x0B08) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3 (RX_START_OFFSET + 0x0B0C) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0 (RX_START_OFFSET + 0x0B10) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1 (RX_START_OFFSET + 0x0B14) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2 (RX_START_OFFSET + 0x0B18) -#define BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3 (RX_START_OFFSET + 0x0B1C) -#define BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL \ - (RX_START_OFFSET + 0x0B40) -#define BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1 \ - (RX_START_OFFSET + 0x0B44) -#define BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL \ - (RX_START_OFFSET + 0x0B50) -#define BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1 \ - (RX_START_OFFSET + 0x0B54) -#define BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL \ - (RX_START_OFFSET + 0x0C00) -#define BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 (RX_START_OFFSET + 0x0C04) -#define BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL \ - (RX_START_OFFSET + 0x0C40) -#define BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0 (RX_START_OFFSET + 0x0C44) -#define BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL \ - (RX_START_OFFSET + 0x0C80) -#define BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0 (RX_START_OFFSET + 0x0C84) -#define BOLERO_CDC_RX_EC_ASRC0_CLK_RST_CTL (RX_START_OFFSET + 0x0D00) -#define BOLERO_CDC_RX_EC_ASRC0_CTL0 (RX_START_OFFSET + 0x0D04) -#define BOLERO_CDC_RX_EC_ASRC0_CTL1 (RX_START_OFFSET + 0x0D08) -#define BOLERO_CDC_RX_EC_ASRC0_FIFO_CTL (RX_START_OFFSET + 0x0D0C) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB \ - (RX_START_OFFSET + 0x0D10) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB \ - (RX_START_OFFSET + 0x0D14) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB \ - (RX_START_OFFSET + 0x0D18) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB \ - (RX_START_OFFSET + 0x0D1C) -#define BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO (RX_START_OFFSET + 0x0D20) -#define BOLERO_CDC_RX_EC_ASRC1_CLK_RST_CTL (RX_START_OFFSET + 0x0D40) -#define BOLERO_CDC_RX_EC_ASRC1_CTL0 (RX_START_OFFSET + 0x0D44) -#define BOLERO_CDC_RX_EC_ASRC1_CTL1 (RX_START_OFFSET + 0x0D48) -#define BOLERO_CDC_RX_EC_ASRC1_FIFO_CTL (RX_START_OFFSET + 0x0D4C) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB \ - (RX_START_OFFSET + 0x0D50) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB \ - (RX_START_OFFSET + 0x0D54) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB \ - (RX_START_OFFSET + 0x0D58) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB \ - (RX_START_OFFSET + 0x0D5C) -#define BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO (RX_START_OFFSET + 0x0D60) -#define BOLERO_CDC_RX_EC_ASRC2_CLK_RST_CTL (RX_START_OFFSET + 0x0D80) -#define BOLERO_CDC_RX_EC_ASRC2_CTL0 (RX_START_OFFSET + 0x0D84) -#define BOLERO_CDC_RX_EC_ASRC2_CTL1 (RX_START_OFFSET + 0x0D88) -#define BOLERO_CDC_RX_EC_ASRC2_FIFO_CTL (RX_START_OFFSET + 0x0D8C) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB \ - (RX_START_OFFSET + 0x0D90) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB \ - (RX_START_OFFSET + 0x0D94) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB \ - (RX_START_OFFSET + 0x0D98) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB \ - (RX_START_OFFSET + 0x0D9C) -#define BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO (RX_START_OFFSET + 0x0DA0) -#define BOLERO_CDC_RX_DSD0_PATH_CTL (RX_START_OFFSET + 0x0F00) -#define BOLERO_CDC_RX_DSD0_CFG0 (RX_START_OFFSET + 0x0F04) -#define BOLERO_CDC_RX_DSD0_CFG1 (RX_START_OFFSET + 0x0F08) -#define BOLERO_CDC_RX_DSD0_CFG2 (RX_START_OFFSET + 0x0F0C) -#define BOLERO_CDC_RX_DSD1_PATH_CTL (RX_START_OFFSET + 0x0F80) -#define BOLERO_CDC_RX_DSD1_CFG0 (RX_START_OFFSET + 0x0F84) -#define BOLERO_CDC_RX_DSD1_CFG1 (RX_START_OFFSET + 0x0F88) -#define BOLERO_CDC_RX_DSD1_CFG2 (RX_START_OFFSET + 0x0F8C) -#define RX_MAX_OFFSET (RX_START_OFFSET + 0x0F8C) - -#define BOLERO_CDC_RX_MACRO_MAX 0x3E4 /* F8C/4 = 3E3 + 1 */ - -/* WSA - macro#2 */ -#define WSA_START_OFFSET 0x2000 -#define BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL \ - (WSA_START_OFFSET + 0x0000) -#define BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL \ - (WSA_START_OFFSET + 0x0004) -#define BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL (WSA_START_OFFSET + 0x0008) -#define BOLERO_CDC_WSA_TOP_TOP_CFG0 (WSA_START_OFFSET + 0x0080) -#define BOLERO_CDC_WSA_TOP_TOP_CFG1 (WSA_START_OFFSET + 0x0084) -#define BOLERO_CDC_WSA_TOP_FREQ_MCLK (WSA_START_OFFSET + 0x0088) -#define BOLERO_CDC_WSA_TOP_DEBUG_BUS_SEL (WSA_START_OFFSET + 0x008C) -#define BOLERO_CDC_WSA_TOP_DEBUG_EN0 (WSA_START_OFFSET + 0x0090) -#define BOLERO_CDC_WSA_TOP_DEBUG_EN1 (WSA_START_OFFSET + 0x0094) -#define BOLERO_CDC_WSA_TOP_DEBUG_DSM_LB (WSA_START_OFFSET + 0x0098) -#define BOLERO_CDC_WSA_TOP_RX_I2S_CTL (WSA_START_OFFSET + 0x009C) -#define BOLERO_CDC_WSA_TOP_TX_I2S_CTL (WSA_START_OFFSET + 0x00A0) -#define BOLERO_CDC_WSA_TOP_I2S_CLK (WSA_START_OFFSET + 0x00A4) -#define BOLERO_CDC_WSA_TOP_I2S_RESET (WSA_START_OFFSET + 0x00A8) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 (WSA_START_OFFSET + 0x0100) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1 (WSA_START_OFFSET + 0x0104) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0 (WSA_START_OFFSET + 0x0108) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1 (WSA_START_OFFSET + 0x010C) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0 (WSA_START_OFFSET + 0x0110) -#define BOLERO_CDC_WSA_RX_INP_MUX_RX_EC_CFG0 (WSA_START_OFFSET + 0x0114) -#define BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0 (WSA_START_OFFSET + 0x0118) -/* VBAT registers */ -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL (WSA_START_OFFSET + 0x0180) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG (WSA_START_OFFSET + 0x0184) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL1 (WSA_START_OFFSET + 0x0188) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL2 (WSA_START_OFFSET + 0x018C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL3 (WSA_START_OFFSET + 0x0190) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST1 (WSA_START_OFFSET + 0x0194) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST2 (WSA_START_OFFSET + 0x0198) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST3 (WSA_START_OFFSET + 0x019C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC1 (WSA_START_OFFSET + 0x01A0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC2 (WSA_START_OFFSET + 0x01A4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC1 (WSA_START_OFFSET + 0x01A8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC2 (WSA_START_OFFSET + 0x01AC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC3 (WSA_START_OFFSET + 0x01B0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC4 (WSA_START_OFFSET + 0x01B4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD1 (WSA_START_OFFSET + 0x01B8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD2 (WSA_START_OFFSET + 0x01BC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD3 (WSA_START_OFFSET + 0x01C0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD4 (WSA_START_OFFSET + 0x01C4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD5 (WSA_START_OFFSET + 0x01C8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DEBUG1 (WSA_START_OFFSET + 0x01CC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD_MON \ - (WSA_START_OFFSET + 0x01D0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL \ - (WSA_START_OFFSET + 0x01D4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BAN (WSA_START_OFFSET + 0x01D8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1 \ - (WSA_START_OFFSET + 0x01DC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2 \ - (WSA_START_OFFSET + 0x01E0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3 \ - (WSA_START_OFFSET + 0x01E4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4 \ - (WSA_START_OFFSET + 0x01E8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5 \ - (WSA_START_OFFSET + 0x01EC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6 \ - (WSA_START_OFFSET + 0x01F0) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7 \ - (WSA_START_OFFSET + 0x01F4) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8 \ - (WSA_START_OFFSET + 0x01F8) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9 \ - (WSA_START_OFFSET + 0x01FC) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN1 (WSA_START_OFFSET + 0x0200) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN2 (WSA_START_OFFSET + 0x0204) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN3 (WSA_START_OFFSET + 0x0208) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1 \ - (WSA_START_OFFSET + 0x020C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL2 \ - (WSA_START_OFFSET + 0x0210) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1 \ - (WSA_START_OFFSET + 0x0214) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2 \ - (WSA_START_OFFSET + 0x0218) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3 \ - (WSA_START_OFFSET + 0x021C) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4 \ - (WSA_START_OFFSET + 0x0220) -#define BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST (WSA_START_OFFSET + 0x0224) -#define BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x0244) -#define BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x0248) -#define BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x0264) -#define BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x0268) -#define BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x0284) -#define BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x0288) -#define BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL (WSA_START_OFFSET + 0x02A4) -#define BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0 (WSA_START_OFFSET + 0x02A8) -#define BOLERO_CDC_WSA_INTR_CTRL_CFG (WSA_START_OFFSET + 0x0340) -#define BOLERO_CDC_WSA_INTR_CTRL_CLR_COMMIT (WSA_START_OFFSET + 0x0344) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN1_MASK0 (WSA_START_OFFSET + 0x0360) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0 (WSA_START_OFFSET + 0x0368) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN1_CLEAR0 (WSA_START_OFFSET + 0x0370) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN2_MASK0 (WSA_START_OFFSET + 0x0380) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0 (WSA_START_OFFSET + 0x0388) -#define BOLERO_CDC_WSA_INTR_CTRL_PIN2_CLEAR0 (WSA_START_OFFSET + 0x0390) -#define BOLERO_CDC_WSA_INTR_CTRL_LEVEL0 (WSA_START_OFFSET + 0x03C0) -#define BOLERO_CDC_WSA_INTR_CTRL_BYPASS0 (WSA_START_OFFSET + 0x03C8) -#define BOLERO_CDC_WSA_INTR_CTRL_SET0 (WSA_START_OFFSET + 0x03D0) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CTL (WSA_START_OFFSET + 0x0400) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG0 (WSA_START_OFFSET + 0x0404) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG1 (WSA_START_OFFSET + 0x0408) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG2 (WSA_START_OFFSET + 0x040C) -#define BOLERO_CDC_WSA_RX0_RX_PATH_CFG3 (WSA_START_OFFSET + 0x0410) -#define BOLERO_CDC_WSA_RX0_RX_VOL_CTL (WSA_START_OFFSET + 0x0414) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL (WSA_START_OFFSET + 0x0418) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG (WSA_START_OFFSET + 0x041C) -#define BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL (WSA_START_OFFSET + 0x0420) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC0 (WSA_START_OFFSET + 0x0424) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC1 (WSA_START_OFFSET + 0x0428) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC2 (WSA_START_OFFSET + 0x042C) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC3 (WSA_START_OFFSET + 0x0430) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC5 (WSA_START_OFFSET + 0x0438) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC6 (WSA_START_OFFSET + 0x043C) -#define BOLERO_CDC_WSA_RX0_RX_PATH_SEC7 (WSA_START_OFFSET + 0x0440) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0 (WSA_START_OFFSET + 0x0444) -#define BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC1 (WSA_START_OFFSET + 0x0448) -#define BOLERO_CDC_WSA_RX0_RX_PATH_DSMDEM_CTL (WSA_START_OFFSET + 0x044C) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CTL (WSA_START_OFFSET + 0x0480) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG0 (WSA_START_OFFSET + 0x0484) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG1 (WSA_START_OFFSET + 0x0488) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG2 (WSA_START_OFFSET + 0x048C) -#define BOLERO_CDC_WSA_RX1_RX_PATH_CFG3 (WSA_START_OFFSET + 0x0490) -#define BOLERO_CDC_WSA_RX1_RX_VOL_CTL (WSA_START_OFFSET + 0x0494) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL (WSA_START_OFFSET + 0x0498) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG (WSA_START_OFFSET + 0x049C) -#define BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL (WSA_START_OFFSET + 0x04A0) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC0 (WSA_START_OFFSET + 0x04A4) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC1 (WSA_START_OFFSET + 0x04A8) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC2 (WSA_START_OFFSET + 0x04AC) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC3 (WSA_START_OFFSET + 0x04B0) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC5 (WSA_START_OFFSET + 0x04B8) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC6 (WSA_START_OFFSET + 0x04BC) -#define BOLERO_CDC_WSA_RX1_RX_PATH_SEC7 (WSA_START_OFFSET + 0x04C0) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0 (WSA_START_OFFSET + 0x04C4) -#define BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC1 (WSA_START_OFFSET + 0x04C8) -#define BOLERO_CDC_WSA_RX1_RX_PATH_DSMDEM_CTL (WSA_START_OFFSET + 0x04CC) -#define BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL (WSA_START_OFFSET + 0x0500) -#define BOLERO_CDC_WSA_BOOST0_BOOST_CTL (WSA_START_OFFSET + 0x0504) -#define BOLERO_CDC_WSA_BOOST0_BOOST_CFG1 (WSA_START_OFFSET + 0x0508) -#define BOLERO_CDC_WSA_BOOST0_BOOST_CFG2 (WSA_START_OFFSET + 0x050C) -#define BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL (WSA_START_OFFSET + 0x0540) -#define BOLERO_CDC_WSA_BOOST1_BOOST_CTL (WSA_START_OFFSET + 0x0544) -#define BOLERO_CDC_WSA_BOOST1_BOOST_CFG1 (WSA_START_OFFSET + 0x0548) -#define BOLERO_CDC_WSA_BOOST1_BOOST_CFG2 (WSA_START_OFFSET + 0x054C) -#define BOLERO_CDC_WSA_COMPANDER0_CTL0 (WSA_START_OFFSET + 0x0580) -#define BOLERO_CDC_WSA_COMPANDER0_CTL1 (WSA_START_OFFSET + 0x0584) -#define BOLERO_CDC_WSA_COMPANDER0_CTL2 (WSA_START_OFFSET + 0x0588) -#define BOLERO_CDC_WSA_COMPANDER0_CTL3 (WSA_START_OFFSET + 0x058C) -#define BOLERO_CDC_WSA_COMPANDER0_CTL4 (WSA_START_OFFSET + 0x0590) -#define BOLERO_CDC_WSA_COMPANDER0_CTL5 (WSA_START_OFFSET + 0x0594) -#define BOLERO_CDC_WSA_COMPANDER0_CTL6 (WSA_START_OFFSET + 0x0598) -#define BOLERO_CDC_WSA_COMPANDER0_CTL7 (WSA_START_OFFSET + 0x059C) -#define BOLERO_CDC_WSA_COMPANDER1_CTL0 (WSA_START_OFFSET + 0x05C0) -#define BOLERO_CDC_WSA_COMPANDER1_CTL1 (WSA_START_OFFSET + 0x05C4) -#define BOLERO_CDC_WSA_COMPANDER1_CTL2 (WSA_START_OFFSET + 0x05C8) -#define BOLERO_CDC_WSA_COMPANDER1_CTL3 (WSA_START_OFFSET + 0x05CC) -#define BOLERO_CDC_WSA_COMPANDER1_CTL4 (WSA_START_OFFSET + 0x05D0) -#define BOLERO_CDC_WSA_COMPANDER1_CTL5 (WSA_START_OFFSET + 0x05D4) -#define BOLERO_CDC_WSA_COMPANDER1_CTL6 (WSA_START_OFFSET + 0x05D8) -#define BOLERO_CDC_WSA_COMPANDER1_CTL7 (WSA_START_OFFSET + 0x05DC) -#define BOLERO_CDC_WSA_SOFTCLIP0_CRC (WSA_START_OFFSET + 0x0600) -#define BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL (WSA_START_OFFSET + 0x0604) -#define BOLERO_CDC_WSA_SOFTCLIP1_CRC (WSA_START_OFFSET + 0x0640) -#define BOLERO_CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL (WSA_START_OFFSET + 0x0644) -#define BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL \ - (WSA_START_OFFSET + 0x0680) -#define BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 (WSA_START_OFFSET + 0x0684) -#define BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL \ - (WSA_START_OFFSET + 0x06C0) -#define BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0 (WSA_START_OFFSET + 0x06C4) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL (WSA_START_OFFSET + 0x0700) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_CTL0 (WSA_START_OFFSET + 0x0704) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_CTL1 (WSA_START_OFFSET + 0x0708) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_FIFO_CTL (WSA_START_OFFSET + 0x070C) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB \ - (WSA_START_OFFSET + 0x0710) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB \ - (WSA_START_OFFSET + 0x0714) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB \ - (WSA_START_OFFSET + 0x0718) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB \ - (WSA_START_OFFSET + 0x071C) -#define BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO (WSA_START_OFFSET + 0x0720) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL (WSA_START_OFFSET + 0x0740) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_CTL0 (WSA_START_OFFSET + 0x0744) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_CTL1 (WSA_START_OFFSET + 0x0748) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_FIFO_CTL (WSA_START_OFFSET + 0x074C) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB \ - (WSA_START_OFFSET + 0x0750) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB \ - (WSA_START_OFFSET + 0x0754) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB \ - (WSA_START_OFFSET + 0x0758) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB \ - (WSA_START_OFFSET + 0x075C) -#define BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO (WSA_START_OFFSET + 0x0760) -#define WSA_MAX_OFFSET (WSA_START_OFFSET + 0x0760) - -#define BOLERO_CDC_WSA_MACRO_MAX 0x1D9 /* 0x760/4 = 0x1D8 + 1 registers */ - -/* VA macro registers */ -#define VA_START_OFFSET 0x3000 -#define BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL (VA_START_OFFSET + 0x0000) -#define BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL \ - (VA_START_OFFSET + 0x0004) -#define BOLERO_CDC_VA_TOP_CSR_TOP_CFG0 (VA_START_OFFSET + 0x0080) -#define BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL (VA_START_OFFSET + 0x0084) -#define BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL (VA_START_OFFSET + 0x0088) -#define BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL (VA_START_OFFSET + 0x008C) -#define BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL (VA_START_OFFSET + 0x0090) -#define BOLERO_CDC_VA_TOP_CSR_DMIC_CFG (VA_START_OFFSET + 0x0094) -#define BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS (VA_START_OFFSET + 0x009C) -#define BOLERO_CDC_VA_TOP_CSR_DEBUG_EN (VA_START_OFFSET + 0x00A0) -#define BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL (VA_START_OFFSET + 0x00A4) -#define BOLERO_CDC_VA_TOP_CSR_I2S_CLK (VA_START_OFFSET + 0x00A8) -#define BOLERO_CDC_VA_TOP_CSR_I2S_RESET (VA_START_OFFSET + 0x00AC) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_0 (VA_START_OFFSET + 0x00C0) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_1 (VA_START_OFFSET + 0x00C4) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_2 (VA_START_OFFSET + 0x00C8) -#define BOLERO_CDC_VA_TOP_CSR_CORE_ID_3 (VA_START_OFFSET + 0x00CC) -#define VA_TOP_MAX_OFFSET (VA_START_OFFSET + 0x00CC) - -#define BOLERO_CDC_VA_MACRO_TOP_MAX 0x34 /* 0x0CC/4 = 0x33 + 1 = 0x34 */ - -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0 (VA_START_OFFSET + 0x0100) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1 (VA_START_OFFSET + 0x0104) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0 (VA_START_OFFSET + 0x0108) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1 (VA_START_OFFSET + 0x010C) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0 (VA_START_OFFSET + 0x0110) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1 (VA_START_OFFSET + 0x0114) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0 (VA_START_OFFSET + 0x0118) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1 (VA_START_OFFSET + 0x011C) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0 (VA_START_OFFSET + 0x0120) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1 (VA_START_OFFSET + 0x0124) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0 (VA_START_OFFSET + 0x0128) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1 (VA_START_OFFSET + 0x012C) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0 (VA_START_OFFSET + 0x0130) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1 (VA_START_OFFSET + 0x0134) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0 (VA_START_OFFSET + 0x0138) -#define BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1 (VA_START_OFFSET + 0x013C) - -#define BOLERO_CDC_VA_TX0_TX_PATH_CTL (VA_START_OFFSET + 0x0400) -#define BOLERO_CDC_VA_TX0_TX_PATH_CFG0 (VA_START_OFFSET + 0x0404) -#define BOLERO_CDC_VA_TX0_TX_PATH_CFG1 (VA_START_OFFSET + 0x0408) -#define BOLERO_CDC_VA_TX0_TX_VOL_CTL (VA_START_OFFSET + 0x040C) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC0 (VA_START_OFFSET + 0x0410) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC1 (VA_START_OFFSET + 0x0414) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC2 (VA_START_OFFSET + 0x0418) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC3 (VA_START_OFFSET + 0x041C) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC4 (VA_START_OFFSET + 0x0420) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC5 (VA_START_OFFSET + 0x0424) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC6 (VA_START_OFFSET + 0x0428) -#define BOLERO_CDC_VA_TX0_TX_PATH_SEC7 (VA_START_OFFSET + 0x042C) -#define BOLERO_CDC_VA_TX1_TX_PATH_CTL (VA_START_OFFSET + 0x0480) -#define BOLERO_CDC_VA_TX1_TX_PATH_CFG0 (VA_START_OFFSET + 0x0484) -#define BOLERO_CDC_VA_TX1_TX_PATH_CFG1 (VA_START_OFFSET + 0x0488) -#define BOLERO_CDC_VA_TX1_TX_VOL_CTL (VA_START_OFFSET + 0x048C) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC0 (VA_START_OFFSET + 0x0490) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC1 (VA_START_OFFSET + 0x0494) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC2 (VA_START_OFFSET + 0x0498) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC3 (VA_START_OFFSET + 0x049C) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC4 (VA_START_OFFSET + 0x04A0) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC5 (VA_START_OFFSET + 0x04A4) -#define BOLERO_CDC_VA_TX1_TX_PATH_SEC6 (VA_START_OFFSET + 0x04A8) -#define BOLERO_CDC_VA_TX2_TX_PATH_CTL (VA_START_OFFSET + 0x0500) -#define BOLERO_CDC_VA_TX2_TX_PATH_CFG0 (VA_START_OFFSET + 0x0504) -#define BOLERO_CDC_VA_TX2_TX_PATH_CFG1 (VA_START_OFFSET + 0x0508) -#define BOLERO_CDC_VA_TX2_TX_VOL_CTL (VA_START_OFFSET + 0x050C) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC0 (VA_START_OFFSET + 0x0510) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC1 (VA_START_OFFSET + 0x0514) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC2 (VA_START_OFFSET + 0x0518) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC3 (VA_START_OFFSET + 0x051C) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC4 (VA_START_OFFSET + 0x0520) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC5 (VA_START_OFFSET + 0x0524) -#define BOLERO_CDC_VA_TX2_TX_PATH_SEC6 (VA_START_OFFSET + 0x0528) -#define BOLERO_CDC_VA_TX3_TX_PATH_CTL (VA_START_OFFSET + 0x0580) -#define BOLERO_CDC_VA_TX3_TX_PATH_CFG0 (VA_START_OFFSET + 0x0584) -#define BOLERO_CDC_VA_TX3_TX_PATH_CFG1 (VA_START_OFFSET + 0x0588) -#define BOLERO_CDC_VA_TX3_TX_VOL_CTL (VA_START_OFFSET + 0x058C) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC0 (VA_START_OFFSET + 0x0590) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC1 (VA_START_OFFSET + 0x0594) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC2 (VA_START_OFFSET + 0x0598) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC3 (VA_START_OFFSET + 0x059C) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC4 (VA_START_OFFSET + 0x05A0) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC5 (VA_START_OFFSET + 0x05A4) -#define BOLERO_CDC_VA_TX3_TX_PATH_SEC6 (VA_START_OFFSET + 0x05A8) -#define BOLERO_CDC_VA_TX4_TX_PATH_CTL (VA_START_OFFSET + 0x0600) -#define BOLERO_CDC_VA_TX4_TX_PATH_CFG0 (VA_START_OFFSET + 0x0604) -#define BOLERO_CDC_VA_TX4_TX_PATH_CFG1 (VA_START_OFFSET + 0x0608) -#define BOLERO_CDC_VA_TX4_TX_VOL_CTL (VA_START_OFFSET + 0x060C) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC0 (VA_START_OFFSET + 0x0610) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC1 (VA_START_OFFSET + 0x0614) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC2 (VA_START_OFFSET + 0x0618) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC3 (VA_START_OFFSET + 0x061C) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC4 (VA_START_OFFSET + 0x0620) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC5 (VA_START_OFFSET + 0x0624) -#define BOLERO_CDC_VA_TX4_TX_PATH_SEC6 (VA_START_OFFSET + 0x0628) -#define BOLERO_CDC_VA_TX5_TX_PATH_CTL (VA_START_OFFSET + 0x0680) -#define BOLERO_CDC_VA_TX5_TX_PATH_CFG0 (VA_START_OFFSET + 0x0684) -#define BOLERO_CDC_VA_TX5_TX_PATH_CFG1 (VA_START_OFFSET + 0x0688) -#define BOLERO_CDC_VA_TX5_TX_VOL_CTL (VA_START_OFFSET + 0x068C) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC0 (VA_START_OFFSET + 0x0690) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC1 (VA_START_OFFSET + 0x0694) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC2 (VA_START_OFFSET + 0x0698) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC3 (VA_START_OFFSET + 0x069C) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC4 (VA_START_OFFSET + 0x06A0) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC5 (VA_START_OFFSET + 0x06A4) -#define BOLERO_CDC_VA_TX5_TX_PATH_SEC6 (VA_START_OFFSET + 0x06A8) -#define BOLERO_CDC_VA_TX6_TX_PATH_CTL (VA_START_OFFSET + 0x0700) -#define BOLERO_CDC_VA_TX6_TX_PATH_CFG0 (VA_START_OFFSET + 0x0704) -#define BOLERO_CDC_VA_TX6_TX_PATH_CFG1 (VA_START_OFFSET + 0x0708) -#define BOLERO_CDC_VA_TX6_TX_VOL_CTL (VA_START_OFFSET + 0x070C) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC0 (VA_START_OFFSET + 0x0710) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC1 (VA_START_OFFSET + 0x0714) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC2 (VA_START_OFFSET + 0x0718) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC3 (VA_START_OFFSET + 0x071C) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC4 (VA_START_OFFSET + 0x0720) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC5 (VA_START_OFFSET + 0x0724) -#define BOLERO_CDC_VA_TX6_TX_PATH_SEC6 (VA_START_OFFSET + 0x0728) -#define BOLERO_CDC_VA_TX7_TX_PATH_CTL (VA_START_OFFSET + 0x0780) -#define BOLERO_CDC_VA_TX7_TX_PATH_CFG0 (VA_START_OFFSET + 0x0784) -#define BOLERO_CDC_VA_TX7_TX_PATH_CFG1 (VA_START_OFFSET + 0x0788) -#define BOLERO_CDC_VA_TX7_TX_VOL_CTL (VA_START_OFFSET + 0x078C) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC0 (VA_START_OFFSET + 0x0790) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC1 (VA_START_OFFSET + 0x0794) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC2 (VA_START_OFFSET + 0x0798) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC3 (VA_START_OFFSET + 0x079C) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC4 (VA_START_OFFSET + 0x07A0) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC5 (VA_START_OFFSET + 0x07A4) -#define BOLERO_CDC_VA_TX7_TX_PATH_SEC6 (VA_START_OFFSET + 0x07A8) -#define VA_MAX_OFFSET (VA_START_OFFSET + 0x07A8) - -#define BOLERO_CDC_VA_MACRO_MAX 0x1EB /* 7A8/4 = 1EA + 1 = 1EB */ - -#define BOLERO_CDC_MAX_REGISTER VA_MAX_OFFSET - -#define BOLERO_REG(reg) (((reg) & 0x0FFF)/4) - -#endif diff --git a/techpack/audio/asoc/codecs/bolero/bolero-cdc-regmap.c b/techpack/audio/asoc/codecs/bolero/bolero-cdc-regmap.c deleted file mode 100644 index ecc13243d999..000000000000 --- a/techpack/audio/asoc/codecs/bolero/bolero-cdc-regmap.c +++ /dev/null @@ -1,862 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "bolero-cdc.h" -#include "internal.h" - -static const struct reg_default bolero_defaults[] = { - /* TX Macro */ - { BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, 0x00 }, - { BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00 }, - { BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_TOP_CFG0, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_ANC_CFG, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_DEBUG_BUS, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_DEBUG_EN, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_TX_I2S_CTL, 0x0C}, - { BOLERO_CDC_TX_TOP_CSR_I2S_CLK, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_I2S_RESET, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_AMIC0_CTL, 0x00}, - { BOLERO_CDC_TX_TOP_CSR_SWR_AMIC1_CTL, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0x00}, - { BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1, 0x00}, - { BOLERO_CDC_TX_ANC0_CLK_RESET_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_MODE_1_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_MODE_2_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FF_SHIFT, 0x00}, - { BOLERO_CDC_TX_ANC0_FB_SHIFT, 0x00}, - { BOLERO_CDC_TX_ANC0_LPF_FF_A_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_LPF_FF_B_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_LPF_FB_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_SMLPF_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_DCFLT_SHIFT_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_IIR_ADAPT_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_IIR_COEFF_1_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_IIR_COEFF_2_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FF_A_GAIN_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FF_B_GAIN_CTL, 0x00}, - { BOLERO_CDC_TX_ANC0_FB_GAIN_CTL, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX0_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX0_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX0_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX0_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX0_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX0_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX0_TX_PATH_SEC7, 0x25}, - { BOLERO_CDC_TX1_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX1_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX1_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX1_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX1_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX1_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX1_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX1_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX2_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX2_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX2_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX2_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX2_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX2_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX2_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX3_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX3_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX3_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX3_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX3_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX3_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX3_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX4_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX4_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX4_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX4_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX4_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX4_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX4_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX5_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX5_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX5_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX5_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX5_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX5_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX5_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX6_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX6_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX6_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX6_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX6_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX6_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX6_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_TX7_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_TX7_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_TX7_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_TX7_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_TX7_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_TX7_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_TX7_TX_PATH_SEC6, 0x00}, - - /* RX Macro */ - { BOLERO_CDC_RX_TOP_TOP_CFG0, 0x00}, - { BOLERO_CDC_RX_TOP_SWR_CTRL, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_BUS, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_EN0, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_EN1, 0x00}, - { BOLERO_CDC_RX_TOP_DEBUG_EN2, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_LUT, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_LUT, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB, 0x00}, - { BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB, 0x00}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG0, 0x11}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG1, 0x20}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2, 0x00}, - { BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG3, 0x00}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG0, 0x11}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG1, 0x20}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2, 0x00}, - { BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG3, 0x00}, - { BOLERO_CDC_RX_TOP_RX_I2S_CTL, 0x0C}, - { BOLERO_CDC_RX_TOP_TX_I2S2_CTL, 0x0C}, - { BOLERO_CDC_RX_TOP_I2S_CLK, 0x0C}, - { BOLERO_CDC_RX_TOP_I2S_RESET, 0x00}, - { BOLERO_CDC_RX_TOP_I2S_MUX, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_DSD_CONTROL, 0x00}, - { BOLERO_CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL, 0x08}, - { BOLERO_CDC_RX_SOFTCLIP_CRC, 0x00}, - { BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x38}, - { BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0x00}, - { BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5, 0x00}, - { BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00}, - { BOLERO_CDC_RX_CLSH_CRC, 0x00}, - { BOLERO_CDC_RX_CLSH_DLY_CTRL, 0x03}, - { BOLERO_CDC_RX_CLSH_DECAY_CTRL, 0x02}, - { BOLERO_CDC_RX_CLSH_HPH_V_PA, 0x1C}, - { BOLERO_CDC_RX_CLSH_EAR_V_PA, 0x39}, - { BOLERO_CDC_RX_CLSH_HPH_V_HD, 0x0C}, - { BOLERO_CDC_RX_CLSH_EAR_V_HD, 0x0C}, - { BOLERO_CDC_RX_CLSH_K1_MSB, 0x01}, - { BOLERO_CDC_RX_CLSH_K1_LSB, 0x00}, - { BOLERO_CDC_RX_CLSH_K2_MSB, 0x00}, - { BOLERO_CDC_RX_CLSH_K2_LSB, 0x80}, - { BOLERO_CDC_RX_CLSH_IDLE_CTRL, 0x00}, - { BOLERO_CDC_RX_CLSH_IDLE_HPH, 0x00}, - { BOLERO_CDC_RX_CLSH_IDLE_EAR, 0x00}, - { BOLERO_CDC_RX_CLSH_TEST0, 0x07}, - { BOLERO_CDC_RX_CLSH_TEST1, 0x00}, - { BOLERO_CDC_RX_CLSH_OVR_VREF, 0x00}, - { BOLERO_CDC_RX_CLSH_CLSG_CTL, 0x02}, - { BOLERO_CDC_RX_CLSH_CLSG_CFG1, 0x9A}, - { BOLERO_CDC_RX_CLSH_CLSG_CFG2, 0x10}, - { BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_CFG, 0x10}, - { BOLERO_CDC_RX_BCL_VBAT_ADC_CAL1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_ADC_CAL2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_ADC_CAL3, 0x04}, - { BOLERO_CDC_RX_BCL_VBAT_PK_EST1, 0xE0}, - { BOLERO_CDC_RX_BCL_VBAT_PK_EST2, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_PK_EST3, 0x40}, - { BOLERO_CDC_RX_BCL_VBAT_RF_PROC1, 0x2A}, - { BOLERO_CDC_RX_BCL_VBAT_RF_PROC1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_TAC1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_TAC2, 0x18}, - { BOLERO_CDC_RX_BCL_VBAT_TAC3, 0x18}, - { BOLERO_CDC_RX_BCL_VBAT_TAC4, 0x03}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD1, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD3, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD4, 0x64}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD5, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_DEBUG1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD_MON, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BAN, 0x0C}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, 0x77}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, 0x4B}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, 0x01}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_ATTN1, 0x04}, - { BOLERO_CDC_RX_BCL_VBAT_ATTN2, 0x08}, - { BOLERO_CDC_RX_BCL_VBAT_ATTN3, 0x0C}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0xE0}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG4, 0x00}, - { BOLERO_CDC_RX_BCL_VBAT_DECODE_ST, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_CFG, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_CLR_COMMIT, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN1_MASK0, 0xFF}, - { BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN1_CLEAR0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN2_MASK0, 0xFF}, - { BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_PIN2_CLEAR0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_LEVEL0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_BYPASS0, 0x00}, - { BOLERO_CDC_RX_INTR_CTRL_SET0, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC4, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL, 0x08}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA1, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA2, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA3, 0x00}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA4, 0x55}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA5, 0x55}, - { BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA6, 0x55}, - { BOLERO_CDC_RX_RX1_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC4, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL, 0x08}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA1, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA2, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA3, 0x00}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA4, 0x55}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA5, 0x55}, - { BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA6, 0x55}, - { BOLERO_CDC_RX_RX2_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_RX_RX2_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC0, 0x04}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC4, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC5, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC6, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL, 0x00}, - { BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG0, 0x07}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG1, 0x3C}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG2, 0x00}, - { BOLERO_CDC_RX_IDLE_DETECT_CFG3, 0x00}, - { BOLERO_CDC_RX_COMPANDER0_CTL0, 0x60}, - { BOLERO_CDC_RX_COMPANDER0_CTL1, 0xDB}, - { BOLERO_CDC_RX_COMPANDER0_CTL2, 0xFF}, - { BOLERO_CDC_RX_COMPANDER0_CTL3, 0x35}, - { BOLERO_CDC_RX_COMPANDER0_CTL4, 0xFF}, - { BOLERO_CDC_RX_COMPANDER0_CTL5, 0x00}, - { BOLERO_CDC_RX_COMPANDER0_CTL6, 0x01}, - { BOLERO_CDC_RX_COMPANDER0_CTL7, 0x28}, - { BOLERO_CDC_RX_COMPANDER1_CTL0, 0x60}, - { BOLERO_CDC_RX_COMPANDER1_CTL1, 0xDB}, - { BOLERO_CDC_RX_COMPANDER1_CTL2, 0xFF}, - { BOLERO_CDC_RX_COMPANDER1_CTL3, 0x35}, - { BOLERO_CDC_RX_COMPANDER1_CTL4, 0xFF}, - { BOLERO_CDC_RX_COMPANDER1_CTL5, 0x00}, - { BOLERO_CDC_RX_COMPANDER1_CTL6, 0x01}, - { BOLERO_CDC_RX_COMPANDER1_CTL7, 0x28}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL, 0x40}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_CTL, 0x40}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL, 0x00}, - { BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0x00}, - { BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0x00}, - { BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00}, - { BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL, 0x04}, - { BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_RX_EC_ASRC0_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_CTL0, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_CTL1, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_FIFO_CTL, 0xA8}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_CTL0, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_CTL1, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_FIFO_CTL, 0xA8}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_CTL0, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_CTL1, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_FIFO_CTL, 0xA8}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO, 0x00}, - { BOLERO_CDC_RX_DSD0_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_DSD0_CFG0, 0x00}, - { BOLERO_CDC_RX_DSD0_CFG1, 0x62}, - { BOLERO_CDC_RX_DSD0_CFG2, 0x96}, - { BOLERO_CDC_RX_DSD1_PATH_CTL, 0x00}, - { BOLERO_CDC_RX_DSD1_CFG0, 0x00}, - { BOLERO_CDC_RX_DSD1_CFG1, 0x62}, - { BOLERO_CDC_RX_DSD1_CFG2, 0x96}, - - /* WSA Macro */ - { BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, - { BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, - { BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 0x00}, - { BOLERO_CDC_WSA_TOP_TOP_CFG0, 0x00}, - { BOLERO_CDC_WSA_TOP_TOP_CFG1, 0x00}, - { BOLERO_CDC_WSA_TOP_FREQ_MCLK, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_BUS_SEL, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_EN0, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_EN1, 0x00}, - { BOLERO_CDC_WSA_TOP_DEBUG_DSM_LB, 0x88}, - { BOLERO_CDC_WSA_TOP_RX_I2S_CTL, 0x0C}, - { BOLERO_CDC_WSA_TOP_TX_I2S_CTL, 0x0C}, - { BOLERO_CDC_WSA_TOP_I2S_CLK, 0x02}, - { BOLERO_CDC_WSA_TOP_I2S_RESET, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_RX_EC_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, 0x10}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL3, 0x04}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST1, 0xE0}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST2, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST3, 0x40}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC1, 0x2A}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC2, 0x18}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC3, 0x18}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC4, 0x03}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD1, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD3, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD4, 0x64}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD5, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DEBUG1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD_MON, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BAN, 0x0C}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2, 0x77}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5, 0x4B}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7, 0x01}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN1, 0x04}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN2, 0x08}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN3, 0x0C}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1, 0xE0}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4, 0x00}, - { BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST, 0x00}, - { BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x02}, - { BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_CFG, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_CLR_COMMIT, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN1_MASK0, 0xFF}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN1_CLEAR0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN2_MASK0, 0xFF}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_PIN2_CLEAR0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_LEVEL0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_BYPASS0, 0x00}, - { BOLERO_CDC_WSA_INTR_CTRL_SET0, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CTL, 0x04}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_WSA_RX0_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC0, 0x04}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC5, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC6, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_WSA_RX0_RX_PATH_DSMDEM_CTL, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG0, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG1, 0x64}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG2, 0x8F}, - { BOLERO_CDC_WSA_RX1_RX_PATH_CFG3, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_VOL_CTL, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL, 0x04}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x7E}, - { BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC0, 0x04}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC1, 0x08}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC2, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC3, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC5, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC6, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_SEC7, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0, 0x08}, - { BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC1, 0x00}, - { BOLERO_CDC_WSA_RX1_RX_PATH_DSMDEM_CTL, 0x00}, - { BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0xD0}, - { BOLERO_CDC_WSA_BOOST0_BOOST_CFG1, 0x89}, - { BOLERO_CDC_WSA_BOOST0_BOOST_CFG2, 0x04}, - { BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0xD0}, - { BOLERO_CDC_WSA_BOOST1_BOOST_CFG1, 0x89}, - { BOLERO_CDC_WSA_BOOST1_BOOST_CFG2, 0x04}, - { BOLERO_CDC_WSA_COMPANDER0_CTL0, 0x60}, - { BOLERO_CDC_WSA_COMPANDER0_CTL1, 0xDB}, - { BOLERO_CDC_WSA_COMPANDER0_CTL2, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x35}, - { BOLERO_CDC_WSA_COMPANDER0_CTL4, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER0_CTL5, 0x00}, - { BOLERO_CDC_WSA_COMPANDER0_CTL6, 0x01}, - { BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x28}, - { BOLERO_CDC_WSA_COMPANDER1_CTL0, 0x60}, - { BOLERO_CDC_WSA_COMPANDER1_CTL1, 0xDB}, - { BOLERO_CDC_WSA_COMPANDER1_CTL2, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x35}, - { BOLERO_CDC_WSA_COMPANDER1_CTL4, 0xFF}, - { BOLERO_CDC_WSA_COMPANDER1_CTL5, 0x00}, - { BOLERO_CDC_WSA_COMPANDER1_CTL6, 0x01}, - { BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x28}, - { BOLERO_CDC_WSA_SOFTCLIP0_CRC, 0x00}, - { BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38}, - { BOLERO_CDC_WSA_SOFTCLIP1_CRC, 0x00}, - { BOLERO_CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38}, - { BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, - { BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0, 0x01}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_CTL0, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_CTL1, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_FIFO_CTL, 0xA8}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_CTL0, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_CTL1, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_FIFO_CTL, 0xA8}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, - { BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO, 0x00}, - - /* VA macro */ - { BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, - { BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, 0x80}, - { BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_DEBUG_EN, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL, 0x0C}, - { BOLERO_CDC_VA_TOP_CSR_I2S_CLK, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_I2S_RESET, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_0, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_1, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_2, 0x00}, - { BOLERO_CDC_VA_TOP_CSR_CORE_ID_3, 0x00}, - - /* VA core */ - { BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0, 0x00}, - { BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX0_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX0_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX0_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX0_TX_PATH_SEC7, 0x25}, - { BOLERO_CDC_VA_TX1_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX1_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX1_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX1_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX1_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX2_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX2_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX2_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX2_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX3_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX3_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX3_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX3_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX4_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX4_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX4_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX4_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX5_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX5_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX5_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX5_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX6_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX6_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX6_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX6_TX_PATH_SEC6, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_CTL, 0x04}, - { BOLERO_CDC_VA_TX7_TX_PATH_CFG0, 0x10}, - { BOLERO_CDC_VA_TX7_TX_PATH_CFG1, 0x0B}, - { BOLERO_CDC_VA_TX7_TX_VOL_CTL, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC0, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC1, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC2, 0x01}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC3, 0x3C}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC4, 0x20}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC5, 0x00}, - { BOLERO_CDC_VA_TX7_TX_PATH_SEC6, 0x00}, -}; - -static bool bolero_is_readable_register(struct device *dev, - unsigned int reg) -{ - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 reg_offset; - int macro_id; - u8 *reg_tbl = NULL; - - if (!priv) - return false; - - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg); - if (macro_id < 0 || !priv->macros_supported[macro_id]) - return false; - - reg_tbl = bolero_reg_access[macro_id]; - reg_offset = (reg - macro_id_base_offset[macro_id])/4; - - if (reg_tbl) - return (reg_tbl[reg_offset] & RD_REG); - - return false; -} - -static bool bolero_is_writeable_register(struct device *dev, - unsigned int reg) -{ - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 reg_offset; - int macro_id; - const u8 *reg_tbl = NULL; - - if (!priv) - return false; - - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg); - if (macro_id < 0 || !priv->macros_supported[macro_id]) - return false; - - reg_tbl = bolero_reg_access[macro_id]; - reg_offset = (reg - macro_id_base_offset[macro_id])/4; - - if (reg_tbl) - return (reg_tbl[reg_offset] & WR_REG); - - return false; -} - -static bool bolero_is_volatile_register(struct device *dev, - unsigned int reg) -{ - /* Update volatile list for rx/tx macros */ - switch (reg) { - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_0: - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_1: - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_2: - case BOLERO_CDC_VA_TOP_CSR_CORE_ID_3: - case BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL: - case BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST: - case BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0: - case BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0: - case BOLERO_CDC_WSA_COMPANDER0_CTL6: - case BOLERO_CDC_WSA_COMPANDER1_CTL6: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: - case BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB: - case BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB: - case BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB: - case BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB: - case BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2: - case BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2: - case BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL: - case BOLERO_CDC_RX_BCL_VBAT_DECODE_ST: - case BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0: - case BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0: - case BOLERO_CDC_RX_COMPANDER0_CTL6: - case BOLERO_CDC_RX_COMPANDER1_CTL6: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB: - case BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO: - return true; - } - return false; -} - -const struct regmap_config bolero_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .reg_stride = 4, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = bolero_defaults, - .num_reg_defaults = ARRAY_SIZE(bolero_defaults), - .max_register = BOLERO_CDC_MAX_REGISTER, - .writeable_reg = bolero_is_writeable_register, - .volatile_reg = bolero_is_volatile_register, - .readable_reg = bolero_is_readable_register, -}; diff --git a/techpack/audio/asoc/codecs/bolero/bolero-cdc-tables.c b/techpack/audio/asoc/codecs/bolero/bolero-cdc-tables.c deleted file mode 100644 index 2407ac70e8f3..000000000000 --- a/techpack/audio/asoc/codecs/bolero/bolero-cdc-tables.c +++ /dev/null @@ -1,768 +0,0 @@ -/* - * Copyright (c) 2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "bolero-cdc.h" -#include "internal.h" - -u8 bolero_tx_reg_access[BOLERO_CDC_TX_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_ANC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_AMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_TOP_CSR_SWR_AMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_CLK_RESET_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_MODE_1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_MODE_2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_SHIFT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FB_SHIFT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FF_A_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FF_B_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_LPF_FB_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_SMLPF_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_DCFLT_SHIFT_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_ADAPT_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_COEFF_1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_IIR_COEFF_2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_A_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FF_B_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_ANC0_FB_GAIN_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX0_TX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX1_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX2_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX3_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX4_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX5_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX6_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_TX7_TX_PATH_SEC6)] = RD_WR_REG, -}; - -u8 bolero_rx_reg_access[BOLERO_CDC_RX_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_RX_TOP_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_SWR_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_EN0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_EN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DEBUG_EN2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_WR_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_WR_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_LUT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_RD_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHL_COMP_RD_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_WR_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_WR_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_LUT)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_RD_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_HPHR_COMP_RD_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD0_DEBUG_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_DSD1_DEBUG_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_RX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_TX_I2S2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_TOP_I2S_MUX)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_DSD_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SOFTCLIP_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_DLY_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_DECAY_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_HPH_V_PA)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_EAR_V_PA)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_HPH_V_HD)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_EAR_V_HD)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K1_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K1_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K2_MSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_K2_LSB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_IDLE_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_IDLE_HPH)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_IDLE_EAR)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_TEST0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_TEST1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_OVR_VREF)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CLSG_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CLSG_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_CLSH_CLSG_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ADC_CAL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ADC_CAL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ADC_CAL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PK_EST1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PK_EST2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_PK_EST3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_RF_PROC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_RF_PROC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_TAC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DEBUG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_UPD_MON)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_GAIN_MON_VAL)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BAN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ATTN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ATTN2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_ATTN3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_BCL_VBAT_DECODE_ST)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_CLR_COMMIT)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN1_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN1_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN1_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN2_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN2_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_PIN2_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_LEVEL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_BYPASS0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_INTR_CTRL_SET0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX0_RX_PATH_DSM_DATA6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX1_RX_PATH_DSM_DATA6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IDLE_DETECT_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER0_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_COMPANDER1_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL)] = - RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL)] = - RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC0_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC1_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_EC_ASRC2_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD0_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_RX_DSD1_CFG2)] = RD_WR_REG, -}; - -u8 bolero_va_reg_access[BOLERO_CDC_VA_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_1)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_3)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX0_TX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX1_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX2_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX3_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX4_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX5_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX6_TX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TX7_TX_PATH_SEC6)] = RD_WR_REG, -}; - -u8 bolero_va_top_reg_access[BOLERO_CDC_VA_MACRO_TOP_MAX] = { - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DMIC_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_BUS)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_DEBUG_EN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_1)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_2)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_VA_TOP_CSR_CORE_ID_3)] = RD_REG, -}; - -u8 bolero_wsa_reg_access[BOLERO_CDC_WSA_MACRO_MAX] = { - [BOLERO_REG(BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_TOP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_TOP_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_FREQ_MCLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_BUS_SEL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_EN0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_EN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_DEBUG_DSM_LB)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_RX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_TX_I2S_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_I2S_CLK)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TOP_I2S_RESET)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_RX_EC_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_ADC_CAL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_PK_EST3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_RF_PROC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_TAC4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DEBUG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_UPD_MON)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BAN)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_ATTN3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_CLR_COMMIT)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN1_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN1_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN2_MASK0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN2_STATUS0)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_PIN2_CLEAR0)] = WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_LEVEL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_BYPASS0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_INTR_CTRL_SET0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX0_RX_PATH_DSMDEM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_CFG3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_VOL_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC6)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_SEC7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_RX1_RX_PATH_DSMDEM_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST0_BOOST_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_CFG1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_BOOST1_BOOST_CFG2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER0_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL2)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL3)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL4)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL5)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL6)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_COMPANDER1_CTL7)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP0_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP1_CRC)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC0_STATUS_FIFO)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_CTL0)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_CTL1)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_FIFO_CTL)] = RD_WR_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB)] = RD_REG, - [BOLERO_REG(BOLERO_CDC_WSA_SPLINE_ASRC1_STATUS_FIFO)] = RD_REG, -}; - -u8 *bolero_reg_access[MAX_MACRO] = { - [TX_MACRO] = bolero_tx_reg_access, - [RX_MACRO] = bolero_rx_reg_access, - [WSA_MACRO] = bolero_wsa_reg_access, - [VA_MACRO] = bolero_va_reg_access, -}; diff --git a/techpack/audio/asoc/codecs/bolero/bolero-cdc-utils.c b/techpack/audio/asoc/codecs/bolero/bolero-cdc-utils.c deleted file mode 100644 index b7f41420d0fe..000000000000 --- a/techpack/audio/asoc/codecs/bolero/bolero-cdc-utils.c +++ /dev/null @@ -1,186 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "bolero-cdc.h" -#include "internal.h" - -#define REG_BYTES 2 -#define VAL_BYTES 1 - -const u16 macro_id_base_offset[MAX_MACRO] = { - TX_START_OFFSET, - RX_START_OFFSET, - WSA_START_OFFSET, - VA_START_OFFSET, -}; - -int bolero_get_macro_id(bool va_no_dec_flag, u16 reg) -{ - if (reg >= TX_START_OFFSET - && reg <= TX_MAX_OFFSET) - return TX_MACRO; - if (reg >= RX_START_OFFSET - && reg <= RX_MAX_OFFSET) - return RX_MACRO; - if (reg >= WSA_START_OFFSET - && reg <= WSA_MAX_OFFSET) - return WSA_MACRO; - if (!va_no_dec_flag && - (reg >= VA_START_OFFSET && - reg <= VA_MAX_OFFSET)) - return VA_MACRO; - if (va_no_dec_flag && - (reg >= VA_START_OFFSET && - reg <= VA_TOP_MAX_OFFSET)) - return VA_MACRO; - - return -EINVAL; -} - -static int regmap_bus_read(void *context, const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 *reg_p; - u16 __reg; - int macro_id, i; - u8 temp = 0; - int ret = -EINVAL; - - if (!priv) { - dev_err(dev, "%s: priv is NULL\n", __func__); - return ret; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return ret; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return ret; - } - - reg_p = (u16 *)reg; - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg_p[0]); - if (macro_id < 0 || !priv->macros_supported[macro_id]) { - dev_err_ratelimited(dev, - "%s: Unsupported macro %d or reg 0x%x is invalid\n", - __func__, macro_id, reg_p[0]); - return ret; - } - mutex_lock(&priv->io_lock); - for (i = 0; i < val_size; i++) { - __reg = (reg_p[0] + i * 4) - macro_id_base_offset[macro_id]; - ret = priv->read_dev(priv, macro_id, __reg, &temp); - if (ret < 0) { - dev_err_ratelimited(dev, - "%s: Codec read failed (%d), reg: 0x%x, size:%zd\n", - __func__, ret, reg_p[0] + i * 4, val_size); - break; - } - ((u8 *)val)[i] = temp; - dev_dbg(dev, "%s: Read 0x%02x from reg 0x%x\n", - __func__, temp, reg_p[0] + i * 4); - } - mutex_unlock(&priv->io_lock); - - return ret; -} - -static int regmap_bus_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_size) -{ - struct device *dev = context; - struct bolero_priv *priv = dev_get_drvdata(dev); - u16 *reg_p; - u16 __reg; - int macro_id, i; - int ret = -EINVAL; - - if (!priv) { - dev_err(dev, "%s: priv is NULL\n", __func__); - return ret; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return ret; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return ret; - } - - reg_p = (u16 *)reg; - macro_id = bolero_get_macro_id(priv->va_without_decimation, - reg_p[0]); - if (macro_id < 0 || !priv->macros_supported[macro_id]) { - dev_err_ratelimited(dev, - "%s: Unsupported macro-id %d or reg 0x%x is invalid\n", - __func__, macro_id, reg_p[0]); - return ret; - } - mutex_lock(&priv->io_lock); - for (i = 0; i < val_size; i++) { - __reg = (reg_p[0] + i * 4) - macro_id_base_offset[macro_id]; - ret = priv->write_dev(priv, macro_id, __reg, ((u8 *)val)[i]); - if (ret < 0) { - dev_err_ratelimited(dev, - "%s: Codec write failed (%d), reg:0x%x, size:%zd\n", - __func__, ret, reg_p[0] + i * 4, val_size); - break; - } - dev_dbg(dev, "Write %02x to reg 0x%x\n", ((u8 *)val)[i], - reg_p[0] + i * 4); - } - mutex_unlock(&priv->io_lock); - return ret; -} - -static int regmap_bus_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct bolero_priv *priv = dev_get_drvdata(dev); - - if (!priv) - return -EINVAL; - - if (count < REG_BYTES) { - dev_err(dev, "%s: count %zd bytes < %d, not supported\n", - __func__, count, REG_BYTES); - return -EINVAL; - } - - return regmap_bus_gather_write(context, data, REG_BYTES, - data + REG_BYTES, - count - REG_BYTES); -} - -static struct regmap_bus regmap_bus_config = { - .write = regmap_bus_write, - .gather_write = regmap_bus_gather_write, - .read = regmap_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -struct regmap *bolero_regmap_init(struct device *dev, - const struct regmap_config *config) -{ - return devm_regmap_init(dev, ®map_bus_config, dev, config); -} diff --git a/techpack/audio/asoc/codecs/bolero/bolero-cdc.c b/techpack/audio/asoc/codecs/bolero/bolero-cdc.c deleted file mode 100644 index 02998fc4373a..000000000000 --- a/techpack/audio/asoc/codecs/bolero/bolero-cdc.c +++ /dev/null @@ -1,1010 +0,0 @@ -/* Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "bolero-cdc.h" -#include "internal.h" - -#define BOLERO_VERSION_1_0 0x0001 -#define BOLERO_VERSION_1_1 0x0002 -#define BOLERO_VERSION_1_2 0x0003 -#define BOLERO_VERSION_ENTRY_SIZE 32 -#define BOLERO_CDC_STRING_LEN 80 - -static struct snd_soc_codec_driver bolero; - -/* MCLK_MUX table for all macros */ -static u16 bolero_mclk_mux_tbl[MAX_MACRO][MCLK_MUX_MAX] = { - {TX_MACRO, VA_MACRO}, - {TX_MACRO, RX_MACRO}, - {TX_MACRO, WSA_MACRO}, - {TX_MACRO, VA_MACRO}, -}; - -static void bolero_ahb_write_device(char __iomem *io_base, - u16 reg, u8 value) -{ - u32 temp = (u32)(value) & 0x000000FF; - - iowrite32(temp, io_base + reg); -} - -static void bolero_ahb_read_device(char __iomem *io_base, - u16 reg, u8 *value) -{ - u32 temp; - - temp = ioread32(io_base + reg); - *value = (u8)temp; -} - -static int __bolero_reg_read(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 *val) -{ - int ret = -EINVAL; - u16 current_mclk_mux_macro; - - mutex_lock(&priv->clk_lock); - if (!priv->dev_up) { - dev_dbg_ratelimited(priv->dev, - "%s: SSR in progress, exit\n", __func__); - goto err; - } - current_mclk_mux_macro = - priv->current_mclk_mux_macro[macro_id]; - if (!priv->macro_params[current_mclk_mux_macro].mclk_fn) { - dev_dbg_ratelimited(priv->dev, - "%s: mclk_fn not init for macro-id:%d, current_mclk_mux_macro:%d\n", - __func__, macro_id, current_mclk_mux_macro); - goto err; - } - ret = priv->macro_params[current_mclk_mux_macro].mclk_fn( - priv->macro_params[current_mclk_mux_macro].dev, true); - if (ret) { - dev_dbg_ratelimited(priv->dev, - "%s: clock enable failed for macro-id:%d, current_mclk_mux_macro:%d\n", - __func__, macro_id, current_mclk_mux_macro); - goto err; - } - bolero_ahb_read_device( - priv->macro_params[macro_id].io_base, reg, val); - priv->macro_params[current_mclk_mux_macro].mclk_fn( - priv->macro_params[current_mclk_mux_macro].dev, false); -err: - mutex_unlock(&priv->clk_lock); - return ret; -} - -static int __bolero_reg_write(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 val) -{ - int ret = -EINVAL; - u16 current_mclk_mux_macro; - - mutex_lock(&priv->clk_lock); - if (!priv->dev_up) { - dev_dbg_ratelimited(priv->dev, - "%s: SSR in progress, exit\n", __func__); - goto err; - } - current_mclk_mux_macro = - priv->current_mclk_mux_macro[macro_id]; - if (!priv->macro_params[current_mclk_mux_macro].mclk_fn) { - dev_dbg_ratelimited(priv->dev, - "%s: mclk_fn not init for macro-id:%d, current_mclk_mux_macro:%d\n", - __func__, macro_id, current_mclk_mux_macro); - goto err; - } - ret = priv->macro_params[current_mclk_mux_macro].mclk_fn( - priv->macro_params[current_mclk_mux_macro].dev, true); - if (ret) { - dev_dbg_ratelimited(priv->dev, - "%s: clock enable failed for macro-id:%d, current_mclk_mux_macro:%d\n", - __func__, macro_id, current_mclk_mux_macro); - goto err; - } - bolero_ahb_write_device( - priv->macro_params[macro_id].io_base, reg, val); - priv->macro_params[current_mclk_mux_macro].mclk_fn( - priv->macro_params[current_mclk_mux_macro].dev, false); -err: - mutex_unlock(&priv->clk_lock); - return ret; -} - -static int bolero_cdc_update_wcd_event(void *handle, u16 event, u32 data) -{ - struct bolero_priv *priv = (struct bolero_priv *)handle; - - if (!priv) { - pr_err("%s:Invalid bolero priv handle\n", __func__); - return -EINVAL; - } - - switch (event) { - case WCD_BOLERO_EVT_RX_MUTE: - if (priv->macro_params[RX_MACRO].event_handler) - priv->macro_params[RX_MACRO].event_handler(priv->codec, - BOLERO_MACRO_EVT_RX_MUTE, data); - break; - case WCD_BOLERO_EVT_IMPED_TRUE: - if (priv->macro_params[RX_MACRO].event_handler) - priv->macro_params[RX_MACRO].event_handler(priv->codec, - BOLERO_MACRO_EVT_IMPED_TRUE, data); - break; - case WCD_BOLERO_EVT_IMPED_FALSE: - if (priv->macro_params[RX_MACRO].event_handler) - priv->macro_params[RX_MACRO].event_handler(priv->codec, - BOLERO_MACRO_EVT_IMPED_FALSE, data); - break; - case WCD_BOLERO_EVT_BCS_CLK_OFF: - if (priv->macro_params[TX_MACRO].event_handler) - priv->macro_params[TX_MACRO].event_handler( - priv->codec, - BOLERO_MACRO_EVT_BCS_CLK_OFF, data); - break; - default: - dev_err(priv->dev, "%s: Invalid event %d trigger from wcd\n", - __func__, event); - return -EINVAL; - } - return 0; -} - -static int bolero_cdc_register_notifier(void *handle, - struct notifier_block *nblock, - bool enable) -{ - struct bolero_priv *priv = (struct bolero_priv *)handle; - - if (!priv) { - pr_err("%s: bolero priv is null\n", __func__); - return -EINVAL; - } - if (enable) - return blocking_notifier_chain_register(&priv->notifier, - nblock); - - return blocking_notifier_chain_unregister(&priv->notifier, - nblock); -} - -static void bolero_cdc_notifier_call(struct bolero_priv *priv, - u32 data) -{ - dev_dbg(priv->dev, "%s: notifier call, data:%d\n", __func__, data); - blocking_notifier_call_chain(&priv->notifier, - data, (void *)priv->wcd_dev); -} - -static bool bolero_is_valid_macro_dev(struct device *dev) -{ - if (of_device_is_compatible(dev->parent->of_node, "qcom,bolero-codec")) - return true; - - return false; -} - -static bool bolero_is_valid_codec_dev(struct device *dev) -{ - if (of_device_is_compatible(dev->of_node, "qcom,bolero-codec")) - return true; - - return false; -} - -/** - * bolero_clear_amic_tx_hold - clears AMIC register on analog codec - * - * @dev: bolero device ptr. - * - */ -void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n) -{ - struct bolero_priv *priv; - u16 event; - u16 amic = 0; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return; - } - - if (!bolero_is_valid_codec_dev(dev)) { - pr_err("%s: invalid codec\n", __func__); - return; - } - priv = dev_get_drvdata(dev); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return; - } - event = BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR; - if (adc_n == BOLERO_ADC0) - amic = 0x1; - else if (adc_n == BOLERO_ADC2) - amic = 0x2; - else if (adc_n == BOLERO_ADC3) - amic = 0x3; - else - return; - - bolero_cdc_notifier_call(priv, (amic << 0x10 | event)); -} -EXPORT_SYMBOL(bolero_clear_amic_tx_hold); - -/** - * bolero_get_device_ptr - Get child or macro device ptr - * - * @dev: bolero device ptr. - * @macro_id: ID of macro calling this API. - * - * Returns dev ptr on success or NULL on error. - */ -struct device *bolero_get_device_ptr(struct device *dev, u16 macro_id) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return NULL; - } - - if (!bolero_is_valid_codec_dev(dev)) { - pr_err("%s: invalid codec\n", __func__); - return NULL; - } - priv = dev_get_drvdata(dev); - if (!priv || (macro_id >= MAX_MACRO)) { - dev_err(dev, "%s: priv is null or invalid macro\n", __func__); - return NULL; - } - - return priv->macro_params[macro_id].dev; -} -EXPORT_SYMBOL(bolero_get_device_ptr); - -static int bolero_copy_dais_from_macro(struct bolero_priv *priv) -{ - struct snd_soc_dai_driver *dai_ptr; - u16 macro_idx; - - /* memcpy into bolero_dais all macro dais */ - if (!priv->bolero_dais) - priv->bolero_dais = devm_kzalloc(priv->dev, - priv->num_dais * - sizeof( - struct snd_soc_dai_driver), - GFP_KERNEL); - if (!priv->bolero_dais) - return -ENOMEM; - - dai_ptr = priv->bolero_dais; - - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (priv->macro_params[macro_idx].dai_ptr) { - memcpy(dai_ptr, - priv->macro_params[macro_idx].dai_ptr, - priv->macro_params[macro_idx].num_dais * - sizeof(struct snd_soc_dai_driver)); - dai_ptr += priv->macro_params[macro_idx].num_dais; - } - } - return 0; -} - -/** - * bolero_register_macro - Registers macro to bolero - * - * @dev: macro device ptr. - * @macro_id: ID of macro calling this API. - * @ops: macro params to register. - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_register_macro(struct device *dev, u16 macro_id, - struct macro_ops *ops) -{ - struct bolero_priv *priv; - int ret = -EINVAL; - - if (!dev || !ops) { - pr_err("%s: dev or ops is null\n", __func__); - return -EINVAL; - } - if (!bolero_is_valid_macro_dev(dev)) { - dev_err(dev, "%s: child device for macro:%d not added yet\n", - __func__, macro_id); - return -EINVAL; - } - priv = dev_get_drvdata(dev->parent); - if (!priv || (macro_id >= MAX_MACRO)) { - dev_err(dev, "%s: priv is null or invalid macro\n", __func__); - return -EINVAL; - } - - priv->macro_params[macro_id].init = ops->init; - priv->macro_params[macro_id].exit = ops->exit; - priv->macro_params[macro_id].io_base = ops->io_base; - priv->macro_params[macro_id].num_dais = ops->num_dais; - priv->macro_params[macro_id].dai_ptr = ops->dai_ptr; - priv->macro_params[macro_id].mclk_fn = ops->mclk_fn; - priv->macro_params[macro_id].event_handler = ops->event_handler; - priv->macro_params[macro_id].dev = dev; - priv->current_mclk_mux_macro[macro_id] = - bolero_mclk_mux_tbl[macro_id][MCLK_MUX0]; - if (macro_id == TX_MACRO) - priv->macro_params[macro_id].reg_wake_irq = ops->reg_wake_irq; - - priv->num_dais += ops->num_dais; - priv->num_macros_registered++; - priv->macros_supported[macro_id] = true; - - if (priv->num_macros_registered == priv->num_macros) { - ret = bolero_copy_dais_from_macro(priv); - if (ret < 0) { - dev_err(dev, "%s: copy_dais failed\n", __func__); - return ret; - } - if (priv->macros_supported[TX_MACRO] == false) { - bolero_mclk_mux_tbl[WSA_MACRO][MCLK_MUX0] = WSA_MACRO; - priv->current_mclk_mux_macro[WSA_MACRO] = WSA_MACRO; - bolero_mclk_mux_tbl[VA_MACRO][MCLK_MUX0] = VA_MACRO; - priv->current_mclk_mux_macro[VA_MACRO] = VA_MACRO; - } - ret = snd_soc_register_codec(dev->parent, &bolero, - priv->bolero_dais, priv->num_dais); - if (ret < 0) { - dev_err(dev, "%s: register codec failed\n", __func__); - return ret; - } - } - return 0; -} -EXPORT_SYMBOL(bolero_register_macro); - -/** - * bolero_unregister_macro - De-Register macro from bolero - * - * @dev: macro device ptr. - * @macro_id: ID of macro calling this API. - * - */ -void bolero_unregister_macro(struct device *dev, u16 macro_id) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return; - } - if (!bolero_is_valid_macro_dev(dev)) { - dev_err(dev, "%s: macro:%d not in valid registered macro-list\n", - __func__, macro_id); - return; - } - priv = dev_get_drvdata(dev->parent); - if (!priv || (macro_id >= MAX_MACRO)) { - dev_err(dev, "%s: priv is null or invalid macro\n", __func__); - return; - } - - priv->macro_params[macro_id].init = NULL; - priv->macro_params[macro_id].num_dais = 0; - priv->macro_params[macro_id].dai_ptr = NULL; - priv->macro_params[macro_id].mclk_fn = NULL; - priv->macro_params[macro_id].event_handler = NULL; - priv->macro_params[macro_id].dev = NULL; - if (macro_id == TX_MACRO) - priv->macro_params[macro_id].reg_wake_irq = NULL; - - priv->num_dais -= priv->macro_params[macro_id].num_dais; - priv->num_macros_registered--; - - /* UNREGISTER CODEC HERE */ - if (priv->num_macros - 1 == priv->num_macros_registered) - snd_soc_unregister_codec(dev->parent); -} -EXPORT_SYMBOL(bolero_unregister_macro); - -/** - * bolero_request_clock - request for clock enable/disable - * - * @dev: macro device ptr. - * @macro_id: ID of macro calling this API. - * @mclk_mux_id: MCLK_MUX ID. - * @enable: enable or disable clock flag - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_request_clock(struct device *dev, u16 macro_id, - enum mclk_mux mclk_mux_id, - bool enable) -{ - struct bolero_priv *priv; - u16 mclk_mux0_macro, mclk_mux1_macro; - int ret = 0, ret1 = 0; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return -EINVAL; - } - if (!bolero_is_valid_macro_dev(dev)) { - dev_err(dev, "%s: macro:%d not in valid registered macro-list\n", - __func__, macro_id); - return -EINVAL; - } - priv = dev_get_drvdata(dev->parent); - if (!priv || (macro_id >= MAX_MACRO)) { - dev_err(dev, "%s: priv is null or invalid macro\n", __func__); - return -EINVAL; - } - - mutex_lock(&priv->clk_lock); - - mclk_mux0_macro = bolero_mclk_mux_tbl[macro_id][MCLK_MUX0]; - switch (mclk_mux_id) { - case MCLK_MUX0: - ret = priv->macro_params[mclk_mux0_macro].mclk_fn( - priv->macro_params[mclk_mux0_macro].dev, enable); - if (ret < 0) { - dev_err_ratelimited(dev, - "%s: MCLK_MUX0 %s failed for macro:%d, mclk_mux0_macro:%d\n", - __func__, - enable ? "enable" : "disable", - macro_id, mclk_mux0_macro); - goto err; - } - break; - case MCLK_MUX1: - mclk_mux1_macro = bolero_mclk_mux_tbl[macro_id][MCLK_MUX1]; - ret = priv->macro_params[mclk_mux0_macro].mclk_fn( - priv->macro_params[mclk_mux0_macro].dev, - true); - if (ret < 0) { - dev_err_ratelimited(dev, - "%s: MCLK_MUX0 en failed for macro:%d mclk_mux0_macro:%d\n", - __func__, macro_id, mclk_mux0_macro); - /* - * for disable case, need to proceed still for mclk_mux1 - * counter to decrement - */ - if (enable) - goto err; - } - /* - * need different return value as ret variable - * is used to track mclk_mux0 enable success or fail - */ - ret1 = priv->macro_params[mclk_mux1_macro].mclk_fn( - priv->macro_params[mclk_mux1_macro].dev, enable); - if (ret1 < 0) - dev_err_ratelimited(dev, - "%s: MCLK_MUX1 %s failed for macro:%d, mclk_mux1_macro:%d\n", - __func__, - enable ? "enable" : "disable", - macro_id, mclk_mux1_macro); - /* disable mclk_mux0 only if ret is success(0) */ - if (!ret) - priv->macro_params[mclk_mux0_macro].mclk_fn( - priv->macro_params[mclk_mux0_macro].dev, - false); - if (enable && ret1) - goto err; - break; - case MCLK_MUX_MAX: - default: - dev_err(dev, "%s: invalid mclk_mux_id: %d\n", - __func__, mclk_mux_id); - ret = -EINVAL; - goto err; - } - if (enable) - priv->current_mclk_mux_macro[macro_id] = - bolero_mclk_mux_tbl[macro_id][mclk_mux_id]; - else - priv->current_mclk_mux_macro[macro_id] = - bolero_mclk_mux_tbl[macro_id][MCLK_MUX0]; -err: - mutex_unlock(&priv->clk_lock); - return ret; -} -EXPORT_SYMBOL(bolero_request_clock); - -void bolero_wsa_pa_on(struct device *dev) -{ - struct bolero_priv *priv; - - if (!dev) { - pr_err("%s: dev is null\n", __func__); - return; - } - if (!bolero_is_valid_macro_dev(dev)) { - dev_err(dev, "%s: not a valid child dev\n", - __func__); - return; - } - priv = dev_get_drvdata(dev->parent); - if (!priv) { - dev_err(dev, "%s: priv is null\n", __func__); - return; - } - - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_PA_ON_POST_FSCLK); -} -EXPORT_SYMBOL(bolero_wsa_pa_on); - -static ssize_t bolero_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct bolero_priv *priv; - char buffer[BOLERO_VERSION_ENTRY_SIZE]; - int len = 0; - - priv = (struct bolero_priv *) entry->private_data; - if (!priv) { - pr_err("%s: bolero priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->version) { - case BOLERO_VERSION_1_0: - len = snprintf(buffer, sizeof(buffer), "BOLERO_1_0\n"); - break; - case BOLERO_VERSION_1_1: - len = snprintf(buffer, sizeof(buffer), "BOLERO_1_1\n"); - break; - case BOLERO_VERSION_1_2: - len = snprintf(buffer, sizeof(buffer), "BOLERO_1_2\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static int bolero_ssr_enable(struct device *dev, void *data) -{ - struct bolero_priv *priv = data; - int macro_idx; - - if (priv->initial_boot) { - priv->initial_boot = false; - return 0; - } - - if (priv->macro_params[VA_MACRO].event_handler) - priv->macro_params[VA_MACRO].event_handler(priv->codec, - BOLERO_MACRO_EVT_WAIT_VA_CLK_RESET, 0x0); - - /* reset clock to force enable any clock disabled in ssr */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (!priv->macro_params[macro_idx].event_handler) - continue; - priv->macro_params[macro_idx].event_handler(priv->codec, - BOLERO_MACRO_EVT_CLK_RESET, 0x0); - } - regcache_cache_only(priv->regmap, false); - /* call ssr event for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (!priv->macro_params[macro_idx].event_handler) - continue; - priv->macro_params[macro_idx].event_handler(priv->codec, - BOLERO_MACRO_EVT_SSR_UP, 0x0); - } - mutex_lock(&priv->clk_lock); - priv->dev_up = true; - mutex_unlock(&priv->clk_lock); - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_SSR_UP); - return 0; -} - -static void bolero_ssr_disable(struct device *dev, void *data) -{ - struct bolero_priv *priv = data; - int macro_idx; - - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_PA_OFF_PRE_SSR); - regcache_cache_only(priv->regmap, true); - - mutex_lock(&priv->clk_lock); - priv->dev_up = false; - mutex_unlock(&priv->clk_lock); - /* call ssr event for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (!priv->macro_params[macro_idx].event_handler) - continue; - priv->macro_params[macro_idx].event_handler(priv->codec, - BOLERO_MACRO_EVT_SSR_DOWN, 0x0); - } - bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_SSR_DOWN); -} - -static struct snd_info_entry_ops bolero_info_ops = { - .read = bolero_version_read, -}; - -static const struct snd_event_ops bolero_ssr_ops = { - .enable = bolero_ssr_enable, - .disable = bolero_ssr_disable, -}; - -/* - * bolero_info_create_codec_entry - creates bolero module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates bolero module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int bolero_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct bolero_priv *priv; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (priv->entry) { - dev_dbg(priv->dev, - "%s:bolero module already created\n", __func__); - return 0; - } - card = codec->component.card; - priv->entry = snd_info_create_subdir(codec_root->module, - "bolero", codec_root); - if (!priv->entry) { - dev_dbg(codec->dev, "%s: failed to create bolero entry\n", - __func__); - return -ENOMEM; - } - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - priv->entry); - if (!version_entry) { - dev_err(codec->dev, "%s: failed to create bolero version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = priv; - version_entry->size = BOLERO_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &bolero_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - priv->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(bolero_info_create_codec_entry); - -/** - * bolero_register_wake_irq - Register wake irq of Tx macro - * - * @codec: codec ptr. - * @ipc_wakeup: bool to identify ipc_wakeup to be used or HW interrupt line. - * - * Return: 0 on success or negative error code on failure. - */ -int bolero_register_wake_irq(struct snd_soc_codec *codec, u32 ipc_wakeup) -{ - struct bolero_priv *priv = NULL; - - if (!codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - if (!bolero_is_valid_codec_dev(priv->dev)) { - dev_err(codec->dev, "%s: invalid codec\n", __func__); - return -EINVAL; - } - - if (priv->macro_params[TX_MACRO].reg_wake_irq) - priv->macro_params[TX_MACRO].reg_wake_irq(codec, ipc_wakeup); - - return 0; -} -EXPORT_SYMBOL(bolero_register_wake_irq); - -static int bolero_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct bolero_priv *priv = dev_get_drvdata(codec->dev); - int macro_idx, ret = 0; - - /* call init for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { - if (priv->macro_params[macro_idx].init) { - ret = priv->macro_params[macro_idx].init(codec); - if (ret < 0) { - dev_err(codec->dev, - "%s: init for macro %d failed\n", - __func__, macro_idx); - goto err; - } - } - } - priv->codec = codec; - /* - * In order for the ADIE RTC to differentiate between targets - * version info is used. - * Assign 1.0 for target with only one macro - * Assign 1.1 for target with two macros - * Assign 1.2 for target with more than two macros - */ - if (priv->num_macros_registered == 1) - priv->version = BOLERO_VERSION_1_0; - else if (priv->num_macros_registered == 2) - priv->version = BOLERO_VERSION_1_1; - else if (priv->num_macros_registered > 2) - priv->version = BOLERO_VERSION_1_2; - - ret = snd_event_client_register(priv->dev, &bolero_ssr_ops, priv); - if (!ret) { - snd_event_notify(priv->dev, SND_EVENT_UP); - } else { - dev_err(codec->dev, - "%s: Registration with SND event FWK failed ret = %d\n", - __func__, ret); - goto err; - } - - dev_dbg(codec->dev, "%s: bolero soc codec probe success\n", __func__); -err: - return ret; -} - -static int bolero_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct bolero_priv *priv = dev_get_drvdata(codec->dev); - int macro_idx; - - snd_event_client_deregister(priv->dev); - /* call exit for supported macros */ - for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) - if (priv->macro_params[macro_idx].exit) - priv->macro_params[macro_idx].exit(codec); - - return 0; -} - -static struct regmap *bolero_get_regmap(struct device *dev) -{ - struct bolero_priv *priv = dev_get_drvdata(dev); - - return priv->regmap; -} - -static struct snd_soc_codec_driver bolero = { - .probe = bolero_soc_codec_probe, - .remove = bolero_soc_codec_remove, - .get_regmap = bolero_get_regmap, -}; - -static void bolero_add_child_devices(struct work_struct *work) -{ - struct bolero_priv *priv; - bool wcd937x_node = false; - struct platform_device *pdev; - struct device_node *node; - int ret = 0, count = 0; - struct wcd_ctrl_platform_data *platdata = NULL; - char plat_dev_name[BOLERO_CDC_STRING_LEN] = ""; - - priv = container_of(work, struct bolero_priv, - bolero_add_child_devices_work); - if (!priv) { - pr_err("%s: Memory for bolero priv does not exist\n", - __func__); - return; - } - if (!priv->dev || !priv->dev->of_node) { - dev_err(priv->dev, "%s: DT node for bolero does not exist\n", - __func__); - return; - } - - platdata = &priv->plat_data; - priv->child_count = 0; - - for_each_available_child_of_node(priv->dev->of_node, node) { - wcd937x_node = false; - if (strnstr(node->name, "wcd937x", strlen("wcd937x")) != NULL) - wcd937x_node = true; - - strlcpy(plat_dev_name, node->name, - (BOLERO_CDC_STRING_LEN - 1)); - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = priv->dev; - pdev->dev.of_node = node; - - if (wcd937x_node) { - priv->dev->platform_data = platdata; - priv->wcd_dev = &pdev->dev; - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - platform_device_put(pdev); - goto fail_pdev_add; - } - - if (priv->child_count < BOLERO_CDC_CHILD_DEVICES_MAX) - priv->pdev_child_devices[priv->child_count++] = pdev; - else - goto err; - } - return; -fail_pdev_add: - for (count = 0; count < priv->child_count; count++) - platform_device_put(priv->pdev_child_devices[count]); -err: - return; -} - -static int bolero_probe(struct platform_device *pdev) -{ - struct bolero_priv *priv; - u32 num_macros = 0; - int ret; - u32 slew_reg1 = 0, slew_reg2 = 0; - u32 slew_val1 = 0, slew_val2 = 0; - char __iomem *slew_io_base1 = NULL, *slew_io_base2 = NULL; - - priv = devm_kzalloc(&pdev->dev, sizeof(struct bolero_priv), - GFP_KERNEL); - if (!priv) - return -ENOMEM; - ret = of_property_read_u32(pdev->dev.of_node, "qcom,num-macros", - &num_macros); - if (ret) { - dev_err(&pdev->dev, - "%s:num-macros property not found\n", - __func__); - return ret; - } - priv->num_macros = num_macros; - if (priv->num_macros > MAX_MACRO) { - dev_err(&pdev->dev, - "%s:num_macros(%d) > MAX_MACRO(%d) than supported\n", - __func__, priv->num_macros, MAX_MACRO); - return -EINVAL; - } - priv->va_without_decimation = of_property_read_bool(pdev->dev.of_node, - "qcom,va-without-decimation"); - if (priv->va_without_decimation) - bolero_reg_access[VA_MACRO] = bolero_va_top_reg_access; - - priv->dev = &pdev->dev; - priv->dev_up = true; - priv->initial_boot = true; - priv->regmap = bolero_regmap_init(priv->dev, - &bolero_regmap_config); - if (IS_ERR_OR_NULL((void *)(priv->regmap))) { - dev_err(&pdev->dev, "%s:regmap init failed\n", __func__); - return -EINVAL; - } - priv->read_dev = __bolero_reg_read; - priv->write_dev = __bolero_reg_write; - - priv->plat_data.handle = (void *) priv; - priv->plat_data.update_wcd_event = bolero_cdc_update_wcd_event; - priv->plat_data.register_notifier = bolero_cdc_register_notifier; - - dev_set_drvdata(&pdev->dev, priv); - mutex_init(&priv->io_lock); - mutex_init(&priv->clk_lock); - - ret = of_property_read_u32(pdev->dev.of_node, "slew_rate_reg1", - &slew_reg1); - - ret |= of_property_read_u32(pdev->dev.of_node, "slew_rate_val1", - &slew_val1); - if (!ret) { - slew_io_base1 = devm_ioremap(&pdev->dev, slew_reg1, 0x4); - if (!slew_io_base1) { - dev_err(&pdev->dev, "%s: ioremap failed for slew reg 1\n", - __func__); - return -ENOMEM; - } - /* update slew rate for tx/rx swr interface */ - iowrite32(slew_val1, slew_io_base1); - } - ret = of_property_read_u32(pdev->dev.of_node, "slew_rate_reg2", - &slew_reg2); - - ret |= of_property_read_u32(pdev->dev.of_node, "slew_rate_val2", - &slew_val2); - - if (!ret) { - slew_io_base2 = devm_ioremap(&pdev->dev, slew_reg2, 0x4); - if (!slew_io_base2) { - dev_err(&pdev->dev, "%s: ioremap failed for slew reg 2\n", - __func__); - return -ENOMEM; - } - /* update slew rate for tx/rx swr interface */ - iowrite32(slew_val2, slew_io_base2); - } - INIT_WORK(&priv->bolero_add_child_devices_work, - bolero_add_child_devices); - schedule_work(&priv->bolero_add_child_devices_work); - - return 0; -} - -static int bolero_remove(struct platform_device *pdev) -{ - struct bolero_priv *priv = dev_get_drvdata(&pdev->dev); - - if (!priv) - return -EINVAL; - - of_platform_depopulate(&pdev->dev); - mutex_destroy(&priv->io_lock); - mutex_destroy(&priv->clk_lock); - return 0; -} - -static const struct of_device_id bolero_dt_match[] = { - {.compatible = "qcom,bolero-codec"}, - {} -}; -MODULE_DEVICE_TABLE(of, bolero_dt_match); - -static struct platform_driver bolero_drv = { - .driver = { - .name = "bolero-codec", - .owner = THIS_MODULE, - .of_match_table = bolero_dt_match, - }, - .probe = bolero_probe, - .remove = bolero_remove, -}; - -module_platform_driver(bolero_drv); - -MODULE_DESCRIPTION("Bolero driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/bolero/bolero-cdc.h b/techpack/audio/asoc/codecs/bolero/bolero-cdc.h deleted file mode 100644 index 3a65f136ef1e..000000000000 --- a/techpack/audio/asoc/codecs/bolero/bolero-cdc.h +++ /dev/null @@ -1,127 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef BOLERO_CDC_H -#define BOLERO_CDC_H - -#include -#include - -enum { - START_MACRO, - TX_MACRO = START_MACRO, - RX_MACRO, - WSA_MACRO, - VA_MACRO, - MAX_MACRO -}; - -enum mclk_mux { - MCLK_MUX0, - MCLK_MUX1, - MCLK_MUX_MAX -}; - -enum { - BOLERO_ADC0 = 1, - BOLERO_ADC1, - BOLERO_ADC2, - BOLERO_ADC3, - BOLERO_ADC_MAX -}; - -enum { - BOLERO_MACRO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ - BOLERO_MACRO_EVT_IMPED_TRUE, /* for imped true */ - BOLERO_MACRO_EVT_IMPED_FALSE, /* for imped false */ - BOLERO_MACRO_EVT_SSR_DOWN, - BOLERO_MACRO_EVT_SSR_UP, - BOLERO_MACRO_EVT_WAIT_VA_CLK_RESET, - BOLERO_MACRO_EVT_CLK_RESET, - BOLERO_MACRO_EVT_REG_WAKE_IRQ, - BOLERO_MACRO_EVT_BCS_CLK_OFF -}; - -struct macro_ops { - int (*init)(struct snd_soc_codec *codec); - int (*exit)(struct snd_soc_codec *codec); - u16 num_dais; - struct device *dev; - struct snd_soc_dai_driver *dai_ptr; - int (*mclk_fn)(struct device *dev, bool enable); - int (*event_handler)(struct snd_soc_codec *codec, u16 event, - u32 data); - int (*reg_wake_irq)(struct snd_soc_codec *codec, u32 data); - char __iomem *io_base; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_BOLERO) -int bolero_register_macro(struct device *dev, u16 macro_id, - struct macro_ops *ops); -void bolero_unregister_macro(struct device *dev, u16 macro_id); -struct device *bolero_get_device_ptr(struct device *dev, u16 macro_id); -int bolero_request_clock(struct device *dev, u16 macro_id, - enum mclk_mux mclk_mux_id, - bool enable); -int bolero_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -int bolero_register_wake_irq(struct snd_soc_codec *codec, u32 data); -void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n); -void bolero_wsa_pa_on(struct device *dev); -#else -static inline int bolero_register_macro(struct device *dev, - u16 macro_id, - struct macro_ops *ops) -{ - return 0; -} - -static inline void bolero_unregister_macro(struct device *dev, u16 macro_id) -{ -} - -static inline struct device *bolero_get_device_ptr(struct device *dev, - u16 macro_id) -{ - return NULL; -} - -static inline int bolero_request_clock(struct device *dev, u16 macro_id, - enum mclk_mux mclk_mux_id, - bool enable) -{ - return 0; -} - -static int bolero_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} - -static inline void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n) -{ -} - -static inline int bolero_register_wake_irq(struct snd_soc_codec *codec, - u32 data) -{ - return 0; -} - -static void bolero_wsa_pa_on(struct device *dev) -{ -} -#endif /* CONFIG_SND_SOC_BOLERO */ -#endif /* BOLERO_CDC_H */ diff --git a/techpack/audio/asoc/codecs/bolero/internal.h b/techpack/audio/asoc/codecs/bolero/internal.h deleted file mode 100644 index 8acefbe1c9ea..000000000000 --- a/techpack/audio/asoc/codecs/bolero/internal.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _BOLERO_INTERNAL_H -#define _BOLERO_INTERNAL_H - -#include "bolero-cdc-registers.h" - -#define BOLERO_CDC_CHILD_DEVICES_MAX 5 - -/* from bolero to WCD events */ -enum { - BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR = 1, - BOLERO_WCD_EVT_PA_OFF_PRE_SSR, - BOLERO_WCD_EVT_SSR_DOWN, - BOLERO_WCD_EVT_SSR_UP, - BOLERO_WCD_EVT_PA_ON_POST_FSCLK, -}; - -enum { - REG_NO_ACCESS, - RD_REG, - WR_REG, - RD_WR_REG -}; - -/* from WCD to bolero events */ -enum { - WCD_BOLERO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ - WCD_BOLERO_EVT_IMPED_TRUE, /* for imped true */ - WCD_BOLERO_EVT_IMPED_FALSE, /* for imped false */ - WCD_BOLERO_EVT_BCS_CLK_OFF, -}; - -struct wcd_ctrl_platform_data { - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -struct bolero_priv { - struct device *dev; - struct snd_soc_codec *codec; - struct regmap *regmap; - struct mutex io_lock; - struct mutex clk_lock; - bool va_without_decimation; - bool macros_supported[MAX_MACRO]; - bool dev_up; - bool initial_boot; - struct macro_ops macro_params[MAX_MACRO]; - struct snd_soc_dai_driver *bolero_dais; - u16 num_dais; - u16 num_macros_registered; - u16 num_macros; - u16 current_mclk_mux_macro[MAX_MACRO]; - struct work_struct bolero_add_child_devices_work; - u32 version; - - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - - int (*read_dev)(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 *val); - int (*write_dev)(struct bolero_priv *priv, - u16 macro_id, u16 reg, u8 val); - struct platform_device *pdev_child_devices - [BOLERO_CDC_CHILD_DEVICES_MAX]; - u16 child_count; - struct wcd_ctrl_platform_data plat_data; - struct device *wcd_dev; - struct blocking_notifier_head notifier; -}; - -struct regmap *bolero_regmap_init(struct device *dev, - const struct regmap_config *config); -int bolero_get_macro_id(bool va_no_dec_flag, u16 reg); - -extern const struct regmap_config bolero_regmap_config; -extern u8 *bolero_reg_access[MAX_MACRO]; -extern u8 bolero_va_top_reg_access[BOLERO_CDC_VA_MACRO_TOP_MAX]; -extern const u16 macro_id_base_offset[MAX_MACRO]; - -#endif diff --git a/techpack/audio/asoc/codecs/bolero/rx-macro.c b/techpack/audio/asoc/codecs/bolero/rx-macro.c deleted file mode 100644 index b1c111f6de5e..000000000000 --- a/techpack/audio/asoc/codecs/bolero/rx-macro.c +++ /dev/null @@ -1,3747 +0,0 @@ -/* Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" -#include "../msm-cdc-pinctrl.h" - -#define RX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\ - SNDRV_PCM_RATE_384000) -/* Fractional Rates */ -#define RX_MACRO_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800) - -#define RX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) - -#define RX_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_48000) -#define RX_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_352P8KHZ 352800 - -#define RX_MACRO_MAX_OFFSET 0x1000 - -#define RX_MACRO_MAX_DMA_CH_PER_PORT 2 -#define RX_SWR_STRING_LEN 80 -#define RX_MACRO_CHILD_DEVICES_MAX 3 - -#define RX_MACRO_INTERP_MUX_NUM_INPUTS 3 -#define RX_MACRO_SIDETONE_IIR_COEFF_MAX 5 - -#define STRING(name) #name -#define RX_MACRO_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define RX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define RX_MACRO_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -#define RX_MACRO_RX_PATH_OFFSET 0x80 -#define RX_MACRO_COMP_OFFSET 0x40 - -#define MAX_IMPED_PARAMS 6 - -#define RX_MACRO_EC_MIX_TX0_MASK 0xf0 -#define RX_MACRO_EC_MIX_TX1_MASK 0x0f -#define RX_MACRO_EC_MIX_TX2_MASK 0x0f - -struct wcd_imped_val { - u32 imped_val; - u8 index; -}; - -static const struct wcd_imped_val imped_index[] = { - {4, 0}, - {5, 1}, - {6, 2}, - {7, 3}, - {8, 4}, - {9, 5}, - {10, 6}, - {11, 7}, - {12, 8}, - {13, 9}, -}; - -struct rx_macro_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -static const struct rx_macro_reg_mask_val imped_table[][MAX_IMPED_PARAMS] = { - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01}, - {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01}, - }, -}; - -enum { - INTERP_HPHL, - INTERP_HPHR, - INTERP_AUX, - INTERP_MAX -}; - -enum { - RX_MACRO_RX0, - RX_MACRO_RX1, - RX_MACRO_RX2, - RX_MACRO_RX3, - RX_MACRO_RX4, - RX_MACRO_RX5, - RX_MACRO_PORTS_MAX -}; - -enum { - RX_MACRO_COMP1, /* HPH_L */ - RX_MACRO_COMP2, /* HPH_R */ - RX_MACRO_COMP_MAX -}; - -enum { - RX_MACRO_EC0_MUX = 0, - RX_MACRO_EC1_MUX, - RX_MACRO_EC2_MUX, - RX_MACRO_EC_MUX_MAX, -}; - -enum { - INTn_1_INP_SEL_ZERO = 0, - INTn_1_INP_SEL_DEC0, - INTn_1_INP_SEL_DEC1, - INTn_1_INP_SEL_IIR0, - INTn_1_INP_SEL_IIR1, - INTn_1_INP_SEL_RX0, - INTn_1_INP_SEL_RX1, - INTn_1_INP_SEL_RX2, - INTn_1_INP_SEL_RX3, - INTn_1_INP_SEL_RX4, - INTn_1_INP_SEL_RX5, -}; - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_RX2, - INTn_2_INP_SEL_RX3, - INTn_2_INP_SEL_RX4, - INTn_2_INP_SEL_RX5, -}; - -enum { - INTERP_MAIN_PATH, - INTERP_MIX_PATH, -}; - -/* Codec supports 2 IIR filters */ -enum { - IIR0 = 0, - IIR1, - IIR_MAX, -}; - -/* Each IIR has 5 Filter Stages */ -enum { - BAND1 = 0, - BAND2, - BAND3, - BAND4, - BAND5, - BAND_MAX, -}; - -struct rx_macro_idle_detect_config { - u8 hph_idle_thr; - u8 hph_idle_detect_en; -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -static struct interp_sample_rate sr_val_tbl[] = { - {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5}, - {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA}, - {176400, 0xB}, {352800, 0xC}, -}; - -struct rx_macro_bcl_pmic_params { - u8 id; - u8 sid; - u8 ppid; -}; - -static int rx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai); -static int rx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot); -static int rx_macro_digital_mute(struct snd_soc_dai *dai, int mute); -static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int rx_macro_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int rx_macro_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int rx_macro_enable_interp_clk(struct snd_soc_codec *codec, - int event, int interp_idx); - -/* Hold instance to soundwire platform device */ -struct rx_swr_ctrl_data { - struct platform_device *rx_swr_pdev; -}; - -struct rx_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -enum { - RX_MACRO_AIF_INVALID = 0, - RX_MACRO_AIF1_PB, - RX_MACRO_AIF2_PB, - RX_MACRO_AIF3_PB, - RX_MACRO_AIF4_PB, - RX_MACRO_AIF_ECHO, - RX_MACRO_MAX_DAIS, -}; - -enum { - RX_MACRO_AIF1_CAP = 0, - RX_MACRO_AIF2_CAP, - RX_MACRO_AIF3_CAP, - RX_MACRO_MAX_AIF_CAP_DAIS -}; -/* - * @dev: rx macro device pointer - * @comp_enabled: compander enable mixer value set - * @prim_int_users: Users of interpolator - * @rx_mclk_users: RX MCLK users count - * @vi_feed_value: VI sense mask - * @swr_clk_lock: to lock swr master clock operations - * @swr_ctrl_data: SoundWire data structure - * @swr_plat_data: Soundwire platform data - * @rx_macro_add_child_devices_work: work for adding child devices - * @rx_swr_gpio_p: used by pinctrl API - * @rx_core_clk: MCLK for rx macro - * @rx_npl_clk: NPL clock for RX soundwire - * @codec: codec handle - */ -struct rx_macro_priv { - struct device *dev; - int comp_enabled[RX_MACRO_COMP_MAX]; - /* Main path clock users count */ - int main_clk_users[INTERP_MAX]; - int rx_port_value[RX_MACRO_PORTS_MAX]; - u16 prim_int_users[INTERP_MAX]; - int rx_mclk_users; - int swr_clk_users; - bool dapm_mclk_enable; - bool reset_swr; - int clsh_users; - int rx_mclk_cnt; - bool is_native_on; - bool is_ear_mode_on; - bool dev_up; - bool hph_pwr_mode; - bool hph_hd2_mode; - u16 mclk_mux; - struct mutex mclk_lock; - struct mutex swr_clk_lock; - struct mutex clk_lock; - struct rx_swr_ctrl_data *swr_ctrl_data; - struct rx_swr_ctrl_platform_data swr_plat_data; - struct work_struct rx_macro_add_child_devices_work; - struct device_node *rx_swr_gpio_p; - struct clk *rx_core_clk; - struct clk *rx_npl_clk; - struct snd_soc_codec *codec; - unsigned long active_ch_mask[RX_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[RX_MACRO_MAX_DAIS]; - u16 bit_width[RX_MACRO_MAX_DAIS]; - char __iomem *rx_io_base; - char __iomem *rx_mclk_mode_muxsel; - struct rx_macro_idle_detect_config idle_det_cfg; - u8 sidetone_coeff_array[IIR_MAX][BAND_MAX] - [RX_MACRO_SIDETONE_IIR_COEFF_MAX * 4]; - - struct platform_device *pdev_child_devices - [RX_MACRO_CHILD_DEVICES_MAX]; - int child_count; - int is_softclip_on; - int softclip_clk_users; - struct rx_macro_bcl_pmic_params bcl_pmic_params; -}; - -static struct snd_soc_dai_driver rx_macro_dai[]; -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -static const char * const rx_int_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5" -}; - -static const char * const rx_prim_mix_text[] = { - "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2", - "RX3", "RX4", "RX5" -}; - -static const char * const rx_sidetone_mix_text[] = { - "ZERO", "SRC0", "SRC1", "SRC_SUM" -}; - -static const char * const iir_inp_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", - "RX0", "RX1", "RX2", "RX3", "RX4", "RX5" -}; - -static const char * const rx_int_dem_inp_mux_text[] = { - "NORMAL_DSM_OUT", "CLSH_DSM_OUT", -}; - -static const char * const rx_int0_1_interp_mux_text[] = { - "ZERO", "RX INT0_1 MIX1", -}; - -static const char * const rx_int1_1_interp_mux_text[] = { - "ZERO", "RX INT1_1 MIX1", -}; - -static const char * const rx_int2_1_interp_mux_text[] = { - "ZERO", "RX INT2_1 MIX1", -}; - -static const char * const rx_int0_2_interp_mux_text[] = { - "ZERO", "RX INT0_2 MUX", -}; - -static const char * const rx_int1_2_interp_mux_text[] = { - "ZERO", "RX INT1_2 MUX", -}; - -static const char * const rx_int2_2_interp_mux_text[] = { - "ZERO", "RX INT2_2 MUX", -}; - -static const char *const rx_macro_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB" -}; - -static const char *const rx_macro_ear_mode_text[] = {"OFF", "ON"}; -static const struct soc_enum rx_macro_ear_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_ear_mode_text); - -static const char *const rx_macro_hph_hd2_mode_text[] = {"OFF", "ON"}; -static const struct soc_enum rx_macro_hph_hd2_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_hd2_mode_text); - -static const char *const rx_macro_hph_pwr_mode_text[] = {"ULP", "LOHIFI"}; -static const struct soc_enum rx_macro_hph_pwr_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_pwr_mode_text); - -static const char * const rx_macro_vbat_bcl_gsm_mode_text[] = {"OFF", "ON"}; -static const struct soc_enum rx_macro_vbat_bcl_gsm_mode_enum = - SOC_ENUM_SINGLE_EXT(2, rx_macro_vbat_bcl_gsm_mode_text); - -static const struct snd_kcontrol_new rx_int2_1_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("RX AUX VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const char * const hph_idle_detect_text[] = {"OFF", "ON"}; - -static SOC_ENUM_SINGLE_EXT_DECL(hph_idle_detect_enum, hph_idle_detect_text); - -RX_MACRO_DAPM_ENUM(rx_int0_2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, - rx_int_mix_mux_text); -RX_MACRO_DAPM_ENUM(rx_int1_2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, - rx_int_mix_mux_text); -RX_MACRO_DAPM_ENUM(rx_int2_2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, - rx_int_mix_mux_text); - - -RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 4, - rx_prim_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 4, - rx_prim_mix_text); - -RX_MACRO_DAPM_ENUM(rx_int0_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2, - rx_sidetone_mix_text); -RX_MACRO_DAPM_ENUM(rx_int1_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4, - rx_sidetone_mix_text); -RX_MACRO_DAPM_ENUM(rx_int2_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6, - rx_sidetone_mix_text); - -RX_MACRO_DAPM_ENUM(iir0_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir0_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir0_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir0_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0, - iir_inp_mux_text); -RX_MACRO_DAPM_ENUM(iir1_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0, - iir_inp_mux_text); - -RX_MACRO_DAPM_ENUM(rx_int0_1_interp, SND_SOC_NOPM, 0, - rx_int0_1_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int1_1_interp, SND_SOC_NOPM, 0, - rx_int1_1_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int2_1_interp, SND_SOC_NOPM, 0, - rx_int2_1_interp_mux_text); - -RX_MACRO_DAPM_ENUM(rx_int0_2_interp, SND_SOC_NOPM, 0, - rx_int0_2_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int1_2_interp, SND_SOC_NOPM, 0, - rx_int1_2_interp_mux_text); -RX_MACRO_DAPM_ENUM(rx_int2_2_interp, SND_SOC_NOPM, 0, - rx_int2_2_interp_mux_text); - -RX_MACRO_DAPM_ENUM_EXT(rx_int0_dem_inp, BOLERO_CDC_RX_RX0_RX_PATH_CFG1, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - rx_macro_int_dem_inp_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_int1_dem_inp, BOLERO_CDC_RX_RX1_RX_PATH_CFG1, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - rx_macro_int_dem_inp_mux_put); - -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx0, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx1, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx2, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx3, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx4, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); -RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx5, SND_SOC_NOPM, 0, rx_macro_mux_text, - rx_macro_mux_get, rx_macro_mux_put); - -static const char * const rx_echo_mux_text[] = { - "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2" -}; - -static const struct soc_enum rx_mix_tx2_mux_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5, 0, 4, - rx_echo_mux_text); - -static const struct snd_kcontrol_new rx_mix_tx2_mux = - SOC_DAPM_ENUM("RX MIX TX2_MUX Mux", rx_mix_tx2_mux_enum); - -static const struct soc_enum rx_mix_tx1_mux_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0, 4, - rx_echo_mux_text); - -static const struct snd_kcontrol_new rx_mix_tx1_mux = - SOC_DAPM_ENUM("RX MIX TX1_MUX Mux", rx_mix_tx1_mux_enum); - -static const struct soc_enum rx_mix_tx0_mux_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 4, 4, - rx_echo_mux_text); - -static const struct snd_kcontrol_new rx_mix_tx0_mux = - SOC_DAPM_ENUM("RX MIX TX0_MUX Mux", rx_mix_tx0_mux_enum); - -static struct snd_soc_dai_ops rx_macro_dai_ops = { - .hw_params = rx_macro_hw_params, - .get_channel_map = rx_macro_get_channel_map, - .digital_mute = rx_macro_digital_mute, -}; - -static struct snd_soc_dai_driver rx_macro_dai[] = { - { - .name = "rx_macro_rx1", - .id = RX_MACRO_AIF1_PB, - .playback = { - .stream_name = "RX_MACRO_AIF1 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_rx2", - .id = RX_MACRO_AIF2_PB, - .playback = { - .stream_name = "RX_MACRO_AIF2 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_rx3", - .id = RX_MACRO_AIF3_PB, - .playback = { - .stream_name = "RX_MACRO_AIF3 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_rx4", - .id = RX_MACRO_AIF4_PB, - .playback = { - .stream_name = "RX_MACRO_AIF4 Playback", - .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES, - .formats = RX_MACRO_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &rx_macro_dai_ops, - }, - { - .name = "rx_macro_echo", - .id = RX_MACRO_AIF_ECHO, - .capture = { - .stream_name = "RX_AIF_ECHO Capture", - .rates = RX_MACRO_ECHO_RATES, - .formats = RX_MACRO_ECHO_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 3, - }, - .ops = &rx_macro_dai_ops, - }, -}; - -static int get_impedance_index(int imped) -{ - int i = 0; - - if (imped < imped_index[i].imped_val) { - pr_debug("%s, detected impedance is less than %d Ohm\n", - __func__, imped_index[i].imped_val); - i = 0; - goto ret; - } - if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) { - pr_debug("%s, detected impedance is greater than %d Ohm\n", - __func__, - imped_index[ARRAY_SIZE(imped_index) - 1].imped_val); - i = ARRAY_SIZE(imped_index) - 1; - goto ret; - } - for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) { - if (imped >= imped_index[i].imped_val && - imped < imped_index[i + 1].imped_val) - break; - } -ret: - pr_debug("%s: selected impedance index = %d\n", - __func__, imped_index[i].index); - return imped_index[i].index; -} - -/* - * rx_macro_wcd_clsh_imped_config - - * This function updates HPHL and HPHR gain settings - * according to the impedance value. - * - * @codec: codec pointer handle - * @imped: impedance value of HPHL/R - * @reset: bool variable to reset registers when teardown - */ -static void rx_macro_wcd_clsh_imped_config(struct snd_soc_codec *codec, - int imped, bool reset) -{ - int i; - int index = 0; - int table_size; - - static const struct rx_macro_reg_mask_val - (*imped_table_ptr)[MAX_IMPED_PARAMS]; - - table_size = ARRAY_SIZE(imped_table); - imped_table_ptr = imped_table; - /* reset = 1, which means request is to reset the register values */ - if (reset) { - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, 0); - return; - } - index = get_impedance_index(imped); - if (index >= (ARRAY_SIZE(imped_index) - 1)) { - pr_debug("%s, impedance not in range = %d\n", __func__, imped); - return; - } - if (index >= table_size) { - pr_debug("%s, impedance index not in range = %d\n", __func__, - index); - return; - } - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, - imped_table_ptr[index][i].val); -} - -static bool rx_macro_get_data(struct snd_soc_codec *codec, - struct device **rx_dev, - struct rx_macro_priv **rx_priv, - const char *func_name) -{ - *rx_dev = bolero_get_device_ptr(codec->dev, RX_MACRO); - - if (!(*rx_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - - *rx_priv = dev_get_drvdata((*rx_dev)); - if (!(*rx_priv)) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - - if (!(*rx_priv)->codec) { - dev_err(codec->dev, - "%s: rx_priv codec is not initialized!\n", func_name); - return false; - } - - return true; -} - -static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val = 0; - unsigned short look_ahead_dly_reg = - BOLERO_CDC_RX_RX0_RX_PATH_CFG0; - - val = ucontrol->value.enumerated.item[0]; - if (val >= e->items) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - if (e->reg == BOLERO_CDC_RX_RX0_RX_PATH_CFG1) - look_ahead_dly_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0; - else if (e->reg == BOLERO_CDC_RX_RX1_RX_PATH_CFG1) - look_ahead_dly_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0; - - /* Set Look Ahead Delay */ - snd_soc_update_bits(codec, look_ahead_dly_reg, - 0x08, (val ? 0x08 : 0x00)); - /* Set DEM INP Select */ - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int rx_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_1_mix1_inp = 0; - u32 j = 0, port = 0; - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u16 int_fs_reg = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - u8 inp0_sel = 0, inp1_sel = 0, inp2_sel = 0; - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id], - RX_MACRO_PORTS_MAX) { - int_1_mix1_inp = port; - if ((int_1_mix1_inp < RX_MACRO_RX0) || - (int_1_mix1_inp > RX_MACRO_PORTS_MAX)) { - pr_err("%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0; - - /* - * Loop through all interpolator MUX inputs and find out - * to which interpolator input, the rx port - * is connected - */ - for (j = 0; j < INTERP_MAX; j++) { - int_mux_cfg1 = int_mux_cfg0 + 4; - - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - inp0_sel = int_mux_cfg0_val & 0x0F; - inp1_sel = (int_mux_cfg0_val >> 4) & 0x0F; - inp2_sel = (int_mux_cfg1_val >> 4) & 0x0F; - if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || - (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) || - (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) { - int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - 0x80 * j; - pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_1\n", - __func__, dai->id, j); - pr_debug("%s: set INT%u_1 sample rate to %u\n", - __func__, j, sample_rate); - /* sample_rate is in Hz */ - snd_soc_update_bits(codec, int_fs_reg, - 0x0F, rate_reg_val); - } - int_mux_cfg0 += 8; - } - } - - return 0; -} - -static int rx_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_2_inp = 0; - u32 j = 0, port = 0; - u16 int_mux_cfg1 = 0, int_fs_reg = 0; - u8 int_mux_cfg1_val = 0; - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id], - RX_MACRO_PORTS_MAX) { - int_2_inp = port; - if ((int_2_inp < RX_MACRO_RX0) || - (int_2_inp > RX_MACRO_PORTS_MAX)) { - pr_err("%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg1 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1; - for (j = 0; j < INTERP_MAX; j++) { - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) & - 0x0F; - if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) { - int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + - 0x80 * j; - pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_2\n", - __func__, dai->id, j); - pr_debug("%s: set INT%u_2 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, - 0x0F, rate_reg_val); - } - int_mux_cfg1 += 8; - } - } - return 0; -} - -static bool rx_macro_is_fractional_sample_rate(u32 sample_rate) -{ - switch (sample_rate) { - case SAMPLING_RATE_44P1KHZ: - case SAMPLING_RATE_88P2KHZ: - case SAMPLING_RATE_176P4KHZ: - case SAMPLING_RATE_352P8KHZ: - return true; - default: - return false; - } - return false; -} - -static int rx_macro_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - int rate_val = 0; - int i = 0, ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - - for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) { - if (sample_rate == sr_val_tbl[i].sample_rate) { - rate_val = sr_val_tbl[i].rate_val; - if (rx_macro_is_fractional_sample_rate(sample_rate)) - rx_priv->is_native_on = true; - else - rx_priv->is_native_on = false; - break; - } - } - if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) { - dev_err(codec->dev, "%s: Unsupported sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - } - - ret = rx_macro_set_prim_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - ret = rx_macro_set_mix_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - - return ret; -} - -static int rx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct snd_soc_codec *codec = dai->codec; - int ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = rx_macro_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - pr_err("%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - rx_priv->bit_width[dai->id] = params_width(params); - break; - case SNDRV_PCM_STREAM_CAPTURE: - default: - break; - } - return 0; -} - -static int rx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - unsigned int temp = 0, ch_mask = 0; - u16 val = 0, mask = 0, cnt = 0, i = 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case RX_MACRO_AIF1_PB: - case RX_MACRO_AIF2_PB: - case RX_MACRO_AIF3_PB: - case RX_MACRO_AIF4_PB: - for_each_set_bit(temp, &rx_priv->active_ch_mask[dai->id], - RX_MACRO_PORTS_MAX) { - ch_mask |= (1 << temp); - if (++i == RX_MACRO_MAX_DMA_CH_PER_PORT) - break; - } - /* - * CDC_DMA_RX_0 port drives RX0/RX1 -- ch_mask 0x1/0x2/0x3 - * CDC_DMA_RX_1 port drives RX2/RX3 -- ch_mask 0x1/0x2/0x3 - * CDC_DMA_RX_2 port drives RX4 -- ch_mask 0x1 - * CDC_DMA_RX_3 port drives RX5 -- ch_mask 0x1 - * AIFn can pair to any CDC_DMA_RX_n port. - * In general, below convention is used:: - * CDC_DMA_RX_0(AIF1)/CDC_DMA_RX_1(AIF2)/ - * CDC_DMA_RX_2(AIF3)/CDC_DMA_RX_3(AIF4) - * Above is reflected in machine driver BE dailink - */ - if (ch_mask & 0x0C) - ch_mask = ch_mask >> 2; - if ((ch_mask & 0x10) || (ch_mask & 0x20)) - ch_mask = 0x1; - *rx_slot = ch_mask; - *rx_num = i; - break; - case RX_MACRO_AIF_ECHO: - val = snd_soc_read(codec, - BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4); - if (val & RX_MACRO_EC_MIX_TX0_MASK) { - mask |= 0x1; - cnt++; - } - if (val & RX_MACRO_EC_MIX_TX1_MASK) { - mask |= 0x2; - cnt++; - } - val = snd_soc_read(codec, - BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5); - if (val & RX_MACRO_EC_MIX_TX2_MASK) { - mask |= 0x4; - cnt++; - } - *tx_slot = mask; - *tx_num = cnt; - break; - default: - dev_err(rx_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static int rx_macro_digital_mute(struct snd_soc_dai *dai, int mute) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - uint16_t j = 0, reg = 0, mix_reg = 0, dsm_reg = 0; - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - - if (mute) - return 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case RX_MACRO_AIF1_PB: - case RX_MACRO_AIF2_PB: - case RX_MACRO_AIF3_PB: - case RX_MACRO_AIF4_PB: - for (j = 0; j < INTERP_MAX; j++) { - reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - (j * RX_MACRO_RX_PATH_OFFSET); - mix_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + - (j * RX_MACRO_RX_PATH_OFFSET); - dsm_reg = BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL + - (j * RX_MACRO_RX_PATH_OFFSET); - if (j == INTERP_AUX) - dsm_reg = BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL; - int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0 + j * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - if (snd_soc_read(codec, dsm_reg) & 0x01) { - if (int_mux_cfg0_val || (int_mux_cfg1_val & 0xF0)) - snd_soc_update_bits(codec, reg, 0x20, 0x20); - if (int_mux_cfg1_val & 0x0F) { - snd_soc_update_bits(codec, reg, 0x20, 0x20); - snd_soc_update_bits(codec, mix_reg, 0x20, 0x20); - } - } - } - break; - default: - break; - } - return 0; -} - -static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv, - bool mclk_enable, bool dapm) -{ - struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL); - int ret = 0, mclk_mux = MCLK_MUX0; - - if (regmap == NULL) { - dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(rx_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, rx_priv->rx_mclk_users); - - mutex_lock(&rx_priv->mclk_lock); - if (mclk_enable) { - if (rx_priv->rx_mclk_users == 0) { - if (rx_priv->is_native_on) - mclk_mux = MCLK_MUX1; - ret = bolero_request_clock(rx_priv->dev, - RX_MACRO, mclk_mux, true); - if (ret < 0) { - dev_err_ratelimited(rx_priv->dev, - "%s: rx request clock enable failed\n", - __func__); - goto exit; - } - rx_priv->mclk_mux = mclk_mux; - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - RX_START_OFFSET, - RX_MAX_OFFSET); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - } - rx_priv->rx_mclk_users++; - } else { - if (rx_priv->rx_mclk_users <= 0) { - dev_err(rx_priv->dev, "%s: clock already disabled\n", - __func__); - rx_priv->rx_mclk_users = 0; - goto exit; - } - rx_priv->rx_mclk_users--; - if (rx_priv->rx_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - mclk_mux = rx_priv->mclk_mux; - bolero_request_clock(rx_priv->dev, - RX_MACRO, mclk_mux, false); - rx_priv->mclk_mux = MCLK_MUX0; - } - } -exit: - mutex_unlock(&rx_priv->mclk_lock); - return ret; -} - -static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - int mclk_freq = MCLK_FREQ; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(rx_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (rx_priv->is_native_on) - mclk_freq = MCLK_FREQ_NATIVE; - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_CLK_FREQ, &mclk_freq); - ret = rx_macro_mclk_enable(rx_priv, 1, true); - if (ret) - rx_priv->dapm_mclk_enable = false; - else - rx_priv->dapm_mclk_enable = true; - break; - case SND_SOC_DAPM_POST_PMD: - if (rx_priv->dapm_mclk_enable) - ret = rx_macro_mclk_enable(rx_priv, 0, true); - break; - default: - dev_err(rx_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int rx_macro_mclk_reset(struct device *dev) -{ - struct rx_macro_priv *rx_priv = dev_get_drvdata(dev); - int count = 0; - - mutex_lock(&rx_priv->clk_lock); - while (__clk_is_enabled(rx_priv->rx_core_clk)) { - clk_disable_unprepare(rx_priv->rx_npl_clk); - clk_disable_unprepare(rx_priv->rx_core_clk); - count++; - } - dev_dbg(rx_priv->dev, - "%s: clock reset after ssr, count %d\n", __func__, count); - while (count) { - clk_prepare_enable(rx_priv->rx_core_clk); - clk_prepare_enable(rx_priv->rx_npl_clk); - count--; - } - - mutex_unlock(&rx_priv->clk_lock); - return 0; -} - -static int rx_macro_mclk_ctrl(struct device *dev, bool enable) -{ - struct rx_macro_priv *rx_priv = dev_get_drvdata(dev); - int ret = 0; - - mutex_lock(&rx_priv->clk_lock); - if (enable) { - ret = clk_prepare_enable(rx_priv->rx_core_clk); - if (ret < 0) { - dev_err_ratelimited(dev, "%s:rx mclk enable failed\n", __func__); - goto exit; - } - ret = clk_prepare_enable(rx_priv->rx_npl_clk); - if (ret < 0) { - clk_disable_unprepare(rx_priv->rx_core_clk); - dev_err(dev, "%s:rx npl_clk enable failed\n", - __func__); - goto exit; - } - if (rx_priv->rx_mclk_cnt++ == 0) { - if (rx_priv->dev_up) - iowrite32(0x1, rx_priv->rx_mclk_mode_muxsel); - } - } else { - if (rx_priv->rx_mclk_cnt <= 0) { - dev_dbg(dev, "%s:rx mclk already disabled\n", __func__); - rx_priv->rx_mclk_cnt = 0; - goto exit; - } - if (--rx_priv->rx_mclk_cnt == 0) { - if (rx_priv->dev_up) - iowrite32(0x0, rx_priv->rx_mclk_mode_muxsel); - } - clk_disable_unprepare(rx_priv->rx_npl_clk); - clk_disable_unprepare(rx_priv->rx_core_clk); - } -exit: - mutex_unlock(&rx_priv->clk_lock); - return ret; -} - -static int rx_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - u16 reg = 0, reg_mix = 0, rx_idx = 0, mute = 0x0, val = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_RX_MUTE: - rx_idx = data >> 0x10; - mute = data & 0xffff; - val = mute ? 0x10 : 0x00; - reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (rx_idx * - RX_MACRO_RX_PATH_OFFSET); - reg_mix = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + (rx_idx * - RX_MACRO_RX_PATH_OFFSET); - snd_soc_update_bits(codec, reg, 0x10, val); - snd_soc_update_bits(codec, reg_mix, 0x10, val); - break; - case BOLERO_MACRO_EVT_IMPED_TRUE: - rx_macro_wcd_clsh_imped_config(codec, data, true); - break; - case BOLERO_MACRO_EVT_IMPED_FALSE: - rx_macro_wcd_clsh_imped_config(codec, data, false); - break; - case BOLERO_MACRO_EVT_SSR_DOWN: - rx_priv->dev_up = false; - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_DEVICE_DOWN, NULL); - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - break; - case BOLERO_MACRO_EVT_SSR_UP: - rx_priv->dev_up = true; - /* reset swr after ssr/pdr */ - rx_priv->reset_swr = true; - /* enable&disable MCLK_MUX1 to reset GFMUX reg */ - bolero_request_clock(rx_priv->dev, - RX_MACRO, MCLK_MUX1, true); - bolero_request_clock(rx_priv->dev, - RX_MACRO, MCLK_MUX1, false); - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - break; - case BOLERO_MACRO_EVT_CLK_RESET: - rx_macro_mclk_reset(rx_dev); - break; - } - return 0; -} - -static int rx_macro_find_playback_dai_id_for_port(int port_id, - struct rx_macro_priv *rx_priv) -{ - int i = 0; - - for (i = RX_MACRO_AIF1_PB; i < RX_MACRO_MAX_DAIS; i++) { - if (test_bit(port_id, &rx_priv->active_ch_mask[i])) - return i; - } - - return -EINVAL; -} - -static int rx_macro_set_idle_detect_thr(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp, int path_type) -{ - int port_id[4] = { 0, 0, 0, 0 }; - int *port_ptr = NULL; - int num_ports = 0; - int bit_width = 0, i = 0; - int mux_reg = 0, mux_reg_val = 0; - int dai_id = 0, idle_thr = 0; - - if ((interp != INTERP_HPHL) && (interp != INTERP_HPHR)) - return 0; - - if (!rx_priv->idle_det_cfg.hph_idle_detect_en) - return 0; - - port_ptr = &port_id[0]; - num_ports = 0; - - /* - * Read interpolator MUX input registers and find - * which cdc_dma port is connected and store the port - * numbers in port_id array. - */ - if (path_type == INTERP_MIX_PATH) { - mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1 + - 2 * interp; - mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f; - - if ((mux_reg_val >= INTn_2_INP_SEL_RX0) && - (mux_reg_val <= INTn_2_INP_SEL_RX5)) { - *port_ptr++ = mux_reg_val - 1; - num_ports++; - } - } - - if (path_type == INTERP_MAIN_PATH) { - mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0 + - 2 * (interp - 1); - mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f; - i = RX_MACRO_INTERP_MUX_NUM_INPUTS; - - while (i) { - if ((mux_reg_val >= INTn_1_INP_SEL_RX0) && - (mux_reg_val <= INTn_1_INP_SEL_RX5)) { - *port_ptr++ = mux_reg_val - - INTn_1_INP_SEL_RX0; - num_ports++; - } - mux_reg_val = (snd_soc_read(codec, mux_reg) & - 0xf0) >> 4; - mux_reg += 1; - i--; - } - } - - dev_dbg(codec->dev, "%s: num_ports: %d, ports[%d %d %d %d]\n", - __func__, num_ports, port_id[0], port_id[1], - port_id[2], port_id[3]); - - i = 0; - while (num_ports) { - dai_id = rx_macro_find_playback_dai_id_for_port(port_id[i++], - rx_priv); - - if ((dai_id >= 0) && (dai_id < RX_MACRO_MAX_DAIS)) { - dev_dbg(codec->dev, "%s: dai_id: %d bit_width: %d\n", - __func__, dai_id, - rx_priv->bit_width[dai_id]); - - if (rx_priv->bit_width[dai_id] > bit_width) - bit_width = rx_priv->bit_width[dai_id]; - } - num_ports--; - } - - switch (bit_width) { - case 16: - idle_thr = 0xff; /* F16 */ - break; - case 24: - case 32: - idle_thr = 0x03; /* F22 */ - break; - default: - idle_thr = 0x00; - break; - } - - dev_dbg(codec->dev, "%s: (new) idle_thr: %d, (cur) idle_thr: %d\n", - __func__, idle_thr, rx_priv->idle_det_cfg.hph_idle_thr); - - if ((rx_priv->idle_det_cfg.hph_idle_thr == 0) || - (idle_thr < rx_priv->idle_det_cfg.hph_idle_thr)) { - snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, idle_thr); - rx_priv->idle_det_cfg.hph_idle_thr = idle_thr; - } - - return 0; -} - -static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg = 0, mix_reg = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - if (w->shift >= INTERP_MAX) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - } - - gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL + - (w->shift * RX_MACRO_RX_PATH_OFFSET); - mix_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + - (w->shift * RX_MACRO_RX_PATH_OFFSET); - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift, - INTERP_MIX_PATH); - rx_macro_enable_interp_clk(codec, event, w->shift); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, gain_reg, - snd_soc_read(codec, gain_reg)); - break; - case SND_SOC_DAPM_POST_PMD: - /* Clk Disable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x00); - rx_macro_enable_interp_clk(codec, event, w->shift); - /* Reset enable and disable */ - snd_soc_update_bits(codec, mix_reg, 0x40, 0x40); - snd_soc_update_bits(codec, mix_reg, 0x40, 0x00); - break; - } - - return 0; -} - -static bool rx_macro_adie_lb(struct snd_soc_codec *codec, int interp_idx) -{ - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - u8 int_n_inp0 = 0, int_n_inp1 = 0, int_n_inp2 = 0; - - int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - - int_n_inp0 = int_mux_cfg0_val & 0x0F; - if (int_n_inp0 == INTn_1_INP_SEL_DEC0 || - int_n_inp0 == INTn_1_INP_SEL_DEC1 || - int_n_inp0 == INTn_1_INP_SEL_IIR0 || - int_n_inp0 == INTn_1_INP_SEL_IIR1) - return true; - - int_n_inp1 = int_mux_cfg0_val >> 4; - if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || - int_n_inp1 == INTn_1_INP_SEL_DEC1 || - int_n_inp1 == INTn_1_INP_SEL_IIR0 || - int_n_inp1 == INTn_1_INP_SEL_IIR1) - return true; - - int_n_inp2 = int_mux_cfg1_val >> 4; - if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || - int_n_inp2 == INTn_1_INP_SEL_DEC1 || - int_n_inp2 == INTn_1_INP_SEL_IIR0 || - int_n_inp2 == INTn_1_INP_SEL_IIR1) - return true; - - return false; -} - -static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg = 0; - u16 reg = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (w->shift >= INTERP_MAX) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - } - - reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (w->shift * - RX_MACRO_RX_PATH_OFFSET); - gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_CTL + (w->shift * - RX_MACRO_RX_PATH_OFFSET); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift, - INTERP_MAIN_PATH); - rx_macro_enable_interp_clk(codec, event, w->shift); - if (rx_macro_adie_lb(codec, w->shift)) - snd_soc_update_bits(codec, reg, 0x20, 0x20); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, gain_reg, - snd_soc_read(codec, gain_reg)); - break; - case SND_SOC_DAPM_POST_PMD: - rx_macro_enable_interp_clk(codec, event, w->shift); - break; - } - - return 0; -} - -static int rx_macro_config_compander(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp_n, int event) -{ - int comp = 0; - u16 comp_ctl0_reg = 0, rx_path_cfg0_reg = 0; - - /* AUX does not have compander */ - if (interp_n == INTERP_AUX) - return 0; - - comp = interp_n; - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, rx_priv->comp_enabled[comp]); - - if (!rx_priv->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 + - (comp * RX_MACRO_COMP_OFFSET); - rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 + - (comp * RX_MACRO_RX_PATH_OFFSET); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -static void rx_macro_enable_softclip_clk(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - bool enable) -{ - if (enable) { - if (rx_priv->softclip_clk_users == 0) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_CRC, - 0x01, 0x01); - rx_priv->softclip_clk_users++; - } else { - rx_priv->softclip_clk_users--; - if (rx_priv->softclip_clk_users == 0) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_CRC, - 0x01, 0x00); - } -} - -static int rx_macro_config_softclip(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int event) -{ - dev_dbg(codec->dev, "%s: event %d, enabled %d\n", - __func__, event, rx_priv->is_softclip_on); - - if (!rx_priv->is_softclip_on) - return 0; - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Softclip clock */ - rx_macro_enable_softclip_clk(codec, rx_priv, true); - /* Enable Softclip control */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x01); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, - BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x00); - rx_macro_enable_softclip_clk(codec, rx_priv, false); - } - - return 0; -} - -static inline void -rx_macro_enable_clsh_block(struct rx_macro_priv *rx_priv, bool enable) -{ - if ((enable && ++rx_priv->clsh_users == 1) || - (!enable && --rx_priv->clsh_users == 0)) - snd_soc_update_bits(rx_priv->codec, - BOLERO_CDC_RX_CLSH_CRC, 0x01, - (u8) enable); - if (rx_priv->clsh_users < 0) - rx_priv->clsh_users = 0; - dev_dbg(rx_priv->dev, "%s: clsh_users %d, enable %d", __func__, - rx_priv->clsh_users, enable); -} - -static int rx_macro_config_classh(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp_n, int event) -{ - if (SND_SOC_DAPM_EVENT_OFF(event)) { - rx_macro_enable_clsh_block(rx_priv, false); - return 0; - } - - if (!SND_SOC_DAPM_EVENT_ON(event)) - return 0; - - rx_macro_enable_clsh_block(rx_priv, true); - if (interp_n == INTERP_HPHL || - interp_n == INTERP_HPHR) { - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_MSB, - 0x0F, 0x00); - } - switch (interp_n) { - case INTERP_HPHL: - if (rx_priv->is_ear_mode_on) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_CLSH_HPH_V_PA, - 0x3F, 0x39); - else - snd_soc_update_bits(codec, - BOLERO_CDC_RX_CLSH_HPH_V_PA, - 0x3F, 0x1C); - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL, - 0x07, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG0, - 0x40, 0x40); - break; - case INTERP_HPHR: - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_HPH_V_PA, - 0x3F, 0x1C); - snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL, - 0x07, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG0, - 0x40, 0x40); - break; - case INTERP_AUX: - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG0, - 0x08, 0x08); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG0, - 0x10, 0x10); - break; - } - - return 0; -} - -static void rx_macro_hd2_control(struct snd_soc_codec *codec, - u16 interp_idx, int event) -{ - u16 hd2_scale_reg = 0; - u16 hd2_enable_reg = 0; - - switch (interp_idx) { - case INTERP_HPHL: - hd2_scale_reg = BOLERO_CDC_RX_RX0_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0; - break; - case INTERP_HPHR: - hd2_scale_reg = BOLERO_CDC_RX_RX1_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0; - break; - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x14); - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04); - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00); - } -} - -static int rx_macro_hph_idle_detect_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct rx_macro_priv *rx_priv = NULL; - struct device *rx_dev = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - rx_priv->idle_det_cfg.hph_idle_detect_en; - - return 0; -} - -static int rx_macro_hph_idle_detect_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct rx_macro_priv *rx_priv = NULL; - struct device *rx_dev = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->idle_det_cfg.hph_idle_detect_en = - ucontrol->value.integer.value[0]; - - return 0; -} - -static int rx_macro_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->comp_enabled[comp]; - return 0; -} - -static int rx_macro_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, rx_priv->comp_enabled[comp], value); - rx_priv->comp_enabled[comp] = value; - - return 0; -} - -static int rx_macro_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - rx_priv->rx_port_value[widget->shift]; - return 0; -} - -static int rx_macro_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - u32 rx_port_value = ucontrol->value.integer.value[0]; - u32 aif_rst = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - aif_rst = rx_priv->rx_port_value[widget->shift]; - if (!rx_port_value) { - if (aif_rst == 0) { - dev_err(rx_dev, "%s:AIF reset already\n", __func__); - return 0; - } - if (aif_rst > RX_MACRO_AIF4_PB) { - dev_err(rx_dev, "%s: Invalid AIF reset\n", __func__); - return 0; - } - } - rx_priv->rx_port_value[widget->shift] = rx_port_value; - - dev_dbg(rx_dev, "%s: mux input: %d, mux output: %d, aif_rst: %d\n", - __func__, rx_port_value, widget->shift, aif_rst); - - switch (rx_port_value) { - case 0: - if (rx_priv->active_ch_cnt[aif_rst]) { - clear_bit(widget->shift, - &rx_priv->active_ch_mask[aif_rst]); - rx_priv->active_ch_cnt[aif_rst]--; - } - break; - case 1: - case 2: - case 3: - case 4: - set_bit(widget->shift, - &rx_priv->active_ch_mask[rx_port_value]); - rx_priv->active_ch_cnt[rx_port_value]++; - break; - default: - dev_err(codec->dev, - "%s:Invalid AIF_ID for RX_MACRO MUX %d\n", - __func__, rx_port_value); - goto err; - } - - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - return 0; -err: - return -EINVAL; -} - -static int rx_macro_get_ear_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->is_ear_mode_on; - return 0; -} - -static int rx_macro_put_ear_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->is_ear_mode_on = - (!ucontrol->value.integer.value[0] ? false : true); - return 0; -} - -static int rx_macro_get_hph_hd2_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->hph_hd2_mode; - return 0; -} - -static int rx_macro_put_hph_hd2_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->hph_hd2_mode = ucontrol->value.integer.value[0]; - return 0; -} - -static int rx_macro_get_hph_pwr_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->hph_pwr_mode; - return 0; -} - -static int rx_macro_put_hph_pwr_mode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->hph_pwr_mode = ucontrol->value.integer.value[0]; - return 0; -} - -static int rx_macro_vbat_bcl_gsm_mode_func_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ucontrol->value.integer.value[0] = - ((snd_soc_read(codec, BOLERO_CDC_RX_BCL_VBAT_CFG) & 0x04) ? - 1 : 0); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int rx_macro_vbat_bcl_gsm_mode_func_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - /* Set Vbat register configuration for GSM mode bit based on value */ - if (ucontrol->value.integer.value[0]) - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x04, 0x04); - else - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x04, 0x00); - - return 0; -} - -static int rx_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = rx_priv->is_softclip_on; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int rx_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->is_softclip_on = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: soft clip enable = %d\n", __func__, - rx_priv->is_softclip_on); - - return 0; -} - -static int rx_macro_enable_vbat(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Enable clock for VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x10); - /* Enable VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x01); - /* Update interpolator with 384K path */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x80, 0x80); - /* Update DSM FS rate */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, - 0x02, 0x02); - /* Use attenuation mode */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x02, 0x00); - /* BCL block needs softclip clock to be enabled */ - rx_macro_enable_softclip_clk(codec, rx_priv, true); - /* Enable VBAT at channel level */ - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x02, 0x02); - /* Set the ATTK1 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - /* Set the ATTK2 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - /* Set the ATTK3 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x80, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, - 0x02, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG, - 0x02, 0x02); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1, - 0x02, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - rx_macro_enable_softclip_clk(codec, rx_priv, false); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x00); - break; - default: - dev_err(rx_dev, "%s: Invalid event %d\n", __func__, event); - break; - } - return 0; -} - -static void rx_macro_idle_detect_control(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - int interp, int event) -{ - int reg = 0, mask = 0, val = 0; - - if (!rx_priv->idle_det_cfg.hph_idle_detect_en) - return; - - if (interp == INTERP_HPHL) { - reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL; - mask = 0x01; - val = 0x01; - } - if (interp == INTERP_HPHR) { - reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL; - mask = 0x02; - val = 0x02; - } - - if (reg && SND_SOC_DAPM_EVENT_ON(event)) - snd_soc_update_bits(codec, reg, mask, val); - - if (reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, reg, mask, 0x00); - rx_priv->idle_det_cfg.hph_idle_thr = 0; - snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, 0x0); - } -} - -static void rx_macro_hphdelay_lutbypass(struct snd_soc_codec *codec, - struct rx_macro_priv *rx_priv, - u16 interp_idx, int event) -{ - u16 hph_lut_bypass_reg = 0; - u16 hph_comp_ctrl7 = 0; - - switch (interp_idx) { - case INTERP_HPHL: - hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHL_COMP_LUT; - hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER0_CTL7; - break; - case INTERP_HPHR: - hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHR_COMP_LUT; - hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER1_CTL7; - break; - default: - break; - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) { - if (interp_idx == INTERP_HPHL) { - if (rx_priv->is_ear_mode_on) - snd_soc_update_bits(codec, - BOLERO_CDC_RX_RX0_RX_PATH_CFG1, - 0x02, 0x02); - else - snd_soc_update_bits(codec, - hph_lut_bypass_reg, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, - hph_lut_bypass_reg, - 0x80, 0x80); - } - if (rx_priv->hph_pwr_mode) - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x00); - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG1, - 0x02, 0x00); - snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x00); - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x20); - } -} - -static int rx_macro_enable_interp_clk(struct snd_soc_codec *codec, - int event, int interp_idx) -{ - u16 main_reg = 0, dsm_reg = 0, rx_cfg2_reg = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - main_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - (interp_idx * RX_MACRO_RX_PATH_OFFSET); - dsm_reg = BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL + - (interp_idx * RX_MACRO_RX_PATH_OFFSET); - if (interp_idx == INTERP_AUX) - dsm_reg = BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL; - rx_cfg2_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG2 + - (interp_idx * RX_MACRO_RX_PATH_OFFSET); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - if (rx_priv->main_clk_users[interp_idx] == 0) { - /* Main path PGA mute enable */ - snd_soc_update_bits(codec, main_reg, 0x10, 0x10); - snd_soc_update_bits(codec, dsm_reg, 0x01, 0x01); - snd_soc_update_bits(codec, rx_cfg2_reg, 0x03, 0x03); - rx_macro_idle_detect_control(codec, rx_priv, - interp_idx, event); - if (rx_priv->hph_hd2_mode) - rx_macro_hd2_control(codec, interp_idx, event); - rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx, - event); - rx_macro_config_compander(codec, rx_priv, - interp_idx, event); - if (interp_idx == INTERP_AUX) - rx_macro_config_softclip(codec, rx_priv, - event); - rx_macro_config_classh(codec, rx_priv, - interp_idx, event); - } - rx_priv->main_clk_users[interp_idx]++; - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - rx_priv->main_clk_users[interp_idx]--; - if (rx_priv->main_clk_users[interp_idx] <= 0) { - rx_priv->main_clk_users[interp_idx] = 0; - /* Clk Disable */ - snd_soc_update_bits(codec, dsm_reg, 0x01, 0x00); - snd_soc_update_bits(codec, main_reg, 0x20, 0x00); - /* Reset enable and disable */ - snd_soc_update_bits(codec, main_reg, 0x40, 0x40); - snd_soc_update_bits(codec, main_reg, 0x40, 0x00); - /* Reset rate to 48K*/ - snd_soc_update_bits(codec, main_reg, 0x0F, 0x04); - snd_soc_update_bits(codec, rx_cfg2_reg, 0x03, 0x00); - rx_macro_config_classh(codec, rx_priv, - interp_idx, event); - rx_macro_config_compander(codec, rx_priv, - interp_idx, event); - if (interp_idx == INTERP_AUX) - rx_macro_config_softclip(codec, rx_priv, - event); - rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx, - event); - if (rx_priv->hph_hd2_mode) - rx_macro_hd2_control(codec, interp_idx, event); - rx_macro_idle_detect_control(codec, rx_priv, - interp_idx, event); - } - } - - dev_dbg(codec->dev, "%s event %d main_clk_users %d\n", - __func__, event, rx_priv->main_clk_users[interp_idx]); - - return rx_priv->main_clk_users[interp_idx]; -} - -static int rx_macro_enable_rx_path_clk(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 sidetone_reg = 0, fs_reg = 0; - - dev_dbg(codec->dev, "%s %d %d\n", __func__, event, w->shift); - sidetone_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG1 + - RX_MACRO_RX_PATH_OFFSET * (w->shift); - fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + - RX_MACRO_RX_PATH_OFFSET * (w->shift); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - rx_macro_enable_interp_clk(codec, event, w->shift); - snd_soc_update_bits(codec, fs_reg, 0x20, 0x20); - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x00); - rx_macro_enable_interp_clk(codec, event, w->shift); - break; - default: - break; - }; - return 0; -} - -static void rx_macro_restore_iir_coeff(struct rx_macro_priv *rx_priv, int iir_idx, - int band_idx) -{ - u16 reg_add = 0, coeff_idx = 0, idx = 0; - struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL); - - if (regmap == NULL) { - dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__); - return; - } - - regmap_write(regmap, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - reg_add = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx; - - /* 5 coefficients per band and 4 writes per coefficient */ - for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX; - coeff_idx++) { - /* Four 8 bit values(one 32 bit) per coefficient */ - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - regmap_write(regmap, reg_add, - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]); - } -} - -static int rx_macro_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - /* IIR filter band registers are at integer multiples of 0x80 */ - u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx; - - ucontrol->value.integer.value[0] = (snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0; - - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0]); - return 0; -} - -static int rx_macro_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - bool iir_band_en_status = 0; - int value = ucontrol->value.integer.value[0]; - u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_macro_restore_iir_coeff(rx_priv, iir_idx, band_idx); - - /* Mask first 5 bits, 6-8 are reserved */ - snd_soc_update_bits(codec, iir_reg, (1 << band_idx), - (value << band_idx)); - - iir_band_en_status = ((snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0); - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, iir_band_en_status); - return 0; -} - -static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - int coeff_idx) -{ - uint32_t value = 0; - - /* Address does not automatically update if reading */ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t)) & 0x7F); - - value |= snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx)); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 1) & 0x7F); - - value |= (snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 0x80 * iir_idx)) << 8); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 2) & 0x7F); - - value |= (snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 0x80 * iir_idx)) << 16); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 3) & 0x7F); - - /* Mask bits top 2 bits since they are reserved */ - value |= ((snd_soc_read(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) & 0x3F) << 24); - - return value; -} - -static int rx_macro_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - get_iir_band_coeff(codec, iir_idx, band_idx, 0); - ucontrol->value.integer.value[1] = - get_iir_band_coeff(codec, iir_idx, band_idx, 1); - ucontrol->value.integer.value[2] = - get_iir_band_coeff(codec, iir_idx, band_idx, 2); - ucontrol->value.integer.value[3] = - get_iir_band_coeff(codec, iir_idx, band_idx, 3); - ucontrol->value.integer.value[4] = - get_iir_band_coeff(codec, iir_idx, band_idx, 4); - - dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[1], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[2], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[3], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[4]); - return 0; -} - -static void set_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - uint32_t value) -{ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value & 0xFF)); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value >> 8) & 0xFF); - - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value >> 16) & 0xFF); - - /* Mask top 2 bits, 7-8 are reserved */ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx), - (value >> 24) & 0x3F); -} - -static int rx_macro_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int coeff_idx, idx = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - /* - * Mask top bit it is reserved - * Updates addr automatically for each B2 write - */ - snd_soc_write(codec, - (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - /* Store the coefficients in sidetone coeff array */ - for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX; - coeff_idx++) { - uint32_t value = ucontrol->value.integer.value[coeff_idx]; - - set_iir_band_coeff(codec, iir_idx, band_idx, value); - - /* Four 8 bit values(one 32 bit) per coefficient */ - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value & 0xFF); - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 8) & 0xFF; - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 16) & 0xFF; - rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 24) & 0xFF; - } - - pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 0), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 1), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 2), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 3), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 4)); - return 0; -} - -static int rx_macro_set_iir_gain(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: /* fall through */ - case SND_SOC_DAPM_PRE_PMD: - if (strnstr(w->name, "IIR0", sizeof("IIR0"))) { - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL)); - } else { - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL)); - } - break; - } - return 0; -} - -static const struct snd_kcontrol_new rx_macro_snd_controls[] = { - SOC_SINGLE_SX_TLV("RX_RX0 Digital Volume", - BOLERO_CDC_RX_RX0_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX1 Digital Volume", - BOLERO_CDC_RX_RX1_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX2 Digital Volume", - BOLERO_CDC_RX_RX2_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX0 Mix Digital Volume", - BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX1 Mix Digital Volume", - BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX_RX2 Mix Digital Volume", - BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - - SOC_SINGLE_EXT("RX_COMP1 Switch", SND_SOC_NOPM, RX_MACRO_COMP1, 1, 0, - rx_macro_get_compander, rx_macro_set_compander), - SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0, - rx_macro_get_compander, rx_macro_set_compander), - - SOC_ENUM_EXT("HPH Idle Detect", hph_idle_detect_enum, - rx_macro_hph_idle_detect_get, rx_macro_hph_idle_detect_put), - - SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum, - rx_macro_get_ear_mode, rx_macro_put_ear_mode), - - SOC_ENUM_EXT("RX_HPH HD2 Mode", rx_macro_hph_hd2_mode_enum, - rx_macro_get_hph_hd2_mode, rx_macro_put_hph_hd2_mode), - - SOC_ENUM_EXT("RX_HPH_PWR_MODE", rx_macro_hph_pwr_mode_enum, - rx_macro_get_hph_pwr_mode, rx_macro_put_hph_pwr_mode), - - SOC_ENUM_EXT("RX_GSM mode Enable", rx_macro_vbat_bcl_gsm_mode_enum, - rx_macro_vbat_bcl_gsm_mode_func_get, - rx_macro_vbat_bcl_gsm_mode_func_put), - SOC_SINGLE_EXT("RX_Softclip Enable", SND_SOC_NOPM, 0, 1, 0, - rx_macro_soft_clip_enable_get, - rx_macro_soft_clip_enable_put), - - SOC_SINGLE_SX_TLV("IIR0 INP0 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP1 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP2 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP3 Volume", - BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP0 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP1 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP2 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP3 Volume", - BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - - SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0, - rx_macro_iir_enable_audio_mixer_get, - rx_macro_iir_enable_audio_mixer_put), - - SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5, - rx_macro_iir_band_audio_mixer_get, - rx_macro_iir_band_audio_mixer_put), -}; - -static int rx_macro_enable_echo(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - u16 val = 0, ec_hq_reg = 0; - int ec_tx = 0; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - dev_dbg(rx_dev, "%s %d %s\n", __func__, event, w->name); - - val = snd_soc_read(codec, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4); - if (!(strcmp(w->name, "RX MIX TX0 MUX"))) - ec_tx = ((val & 0xf0) >> 0x4) - 1; - else if (!(strcmp(w->name, "RX MIX TX1 MUX"))) - ec_tx = (val & 0x0f) - 1; - - val = snd_soc_read(codec, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG5); - if (!(strcmp(w->name, "RX MIX TX2 MUX"))) - ec_tx = (val & 0x0f) - 1; - - if (ec_tx < 0 || (ec_tx >= RX_MACRO_EC_MUX_MAX)) { - dev_err(rx_dev, "%s: EC mix control not set correctly\n", - __func__); - return -EINVAL; - } - ec_hq_reg = BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL + - 0x40 * ec_tx; - snd_soc_update_bits(codec, ec_hq_reg, 0x01, 0x01); - ec_hq_reg = BOLERO_CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 + - 0x40 * ec_tx; - /* default set to 48k */ - snd_soc_update_bits(codec, ec_hq_reg, 0x1E, 0x08); - - return 0; -} - -static const struct snd_soc_dapm_widget rx_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("RX AIF1 PB", "RX_MACRO_AIF1 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("RX AIF2 PB", "RX_MACRO_AIF2 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("RX AIF3 PB", "RX_MACRO_AIF3 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("RX AIF4 PB", "RX_MACRO_AIF4 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_OUT("RX AIF_ECHO", "RX_AIF_ECHO Capture", 0, - SND_SOC_NOPM, 0, 0), - - RX_MACRO_DAPM_MUX("RX_MACRO RX0 MUX", RX_MACRO_RX0, rx_macro_rx0), - RX_MACRO_DAPM_MUX("RX_MACRO RX1 MUX", RX_MACRO_RX1, rx_macro_rx1), - RX_MACRO_DAPM_MUX("RX_MACRO RX2 MUX", RX_MACRO_RX2, rx_macro_rx2), - RX_MACRO_DAPM_MUX("RX_MACRO RX3 MUX", RX_MACRO_RX3, rx_macro_rx3), - RX_MACRO_DAPM_MUX("RX_MACRO RX4 MUX", RX_MACRO_RX4, rx_macro_rx4), - RX_MACRO_DAPM_MUX("RX_MACRO RX5 MUX", RX_MACRO_RX5, rx_macro_rx5), - - SND_SOC_DAPM_MIXER("RX_RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX_RX5", SND_SOC_NOPM, 0, 0, NULL, 0), - - RX_MACRO_DAPM_MUX("IIR0 INP0 MUX", 0, iir0_inp0), - RX_MACRO_DAPM_MUX("IIR0 INP1 MUX", 0, iir0_inp1), - RX_MACRO_DAPM_MUX("IIR0 INP2 MUX", 0, iir0_inp2), - RX_MACRO_DAPM_MUX("IIR0 INP3 MUX", 0, iir0_inp3), - RX_MACRO_DAPM_MUX("IIR1 INP0 MUX", 0, iir1_inp0), - RX_MACRO_DAPM_MUX("IIR1 INP1 MUX", 0, iir1_inp1), - RX_MACRO_DAPM_MUX("IIR1 INP2 MUX", 0, iir1_inp2), - RX_MACRO_DAPM_MUX("IIR1 INP3 MUX", 0, iir1_inp3), - - SND_SOC_DAPM_MUX_E("RX MIX TX0 MUX", SND_SOC_NOPM, - RX_MACRO_EC0_MUX, 0, - &rx_mix_tx0_mux, rx_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX MIX TX1 MUX", SND_SOC_NOPM, - RX_MACRO_EC1_MUX, 0, - &rx_mix_tx1_mux, rx_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX MIX TX2 MUX", SND_SOC_NOPM, - RX_MACRO_EC2_MUX, 0, - &rx_mix_tx2_mux, rx_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("IIR0", BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL, - 4, 0, NULL, 0, rx_macro_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER_E("IIR1", BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL, - 4, 0, NULL, 0, rx_macro_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER("SRC0", BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SRC1", BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - - RX_MACRO_DAPM_MUX("RX INT0 DEM MUX", 0, rx_int0_dem_inp), - RX_MACRO_DAPM_MUX("RX INT1 DEM MUX", 0, rx_int1_dem_inp), - - SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int0_2_mux, rx_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int1_2_mux, rx_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0, - &rx_int2_2_mux, rx_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP0", 0, rx_int0_1_mix_inp0), - RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP1", 0, rx_int0_1_mix_inp1), - RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP2", 0, rx_int0_1_mix_inp2), - RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP0", 0, rx_int1_1_mix_inp0), - RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP1", 0, rx_int1_1_mix_inp1), - RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP2", 0, rx_int1_1_mix_inp2), - RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP0", 0, rx_int2_1_mix_inp0), - RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP1", 0, rx_int2_1_mix_inp1), - RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP2", 0, rx_int2_1_mix_inp2), - - SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int0_1_interp_mux, rx_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int1_1_interp_mux, rx_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0, - &rx_int2_1_interp_mux, rx_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - RX_MACRO_DAPM_MUX("RX INT0_2 INTERP", 0, rx_int0_2_interp), - RX_MACRO_DAPM_MUX("RX INT1_2 INTERP", 0, rx_int1_2_interp), - RX_MACRO_DAPM_MUX("RX INT2_2 INTERP", 0, rx_int2_2_interp), - - SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL, - 0, &rx_int0_mix2_inp_mux, rx_macro_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR, - 0, &rx_int1_mix2_inp_mux, rx_macro_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_AUX, - 0, &rx_int2_mix2_inp_mux, rx_macro_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("RX INT2_1 VBAT", SND_SOC_NOPM, - 0, 0, rx_int2_1_vbat_mix_switch, - ARRAY_SIZE(rx_int2_1_vbat_mix_switch), - rx_macro_enable_vbat, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_OUTPUT("HPHL_OUT"), - SND_SOC_DAPM_OUTPUT("HPHR_OUT"), - SND_SOC_DAPM_OUTPUT("AUX_OUT"), - - SND_SOC_DAPM_INPUT("RX_TX DEC0_INP"), - SND_SOC_DAPM_INPUT("RX_TX DEC1_INP"), - SND_SOC_DAPM_INPUT("RX_TX DEC2_INP"), - SND_SOC_DAPM_INPUT("RX_TX DEC3_INP"), - - SND_SOC_DAPM_SUPPLY_S("RX_MCLK", 0, SND_SOC_NOPM, 0, 0, - rx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route rx_audio_map[] = { - {"RX AIF1 PB", NULL, "RX_MCLK"}, - {"RX AIF2 PB", NULL, "RX_MCLK"}, - {"RX AIF3 PB", NULL, "RX_MCLK"}, - {"RX AIF4 PB", NULL, "RX_MCLK"}, - - {"RX_MACRO RX0 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX1 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX2 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX3 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX4 MUX", "AIF1_PB", "RX AIF1 PB"}, - {"RX_MACRO RX5 MUX", "AIF1_PB", "RX AIF1 PB"}, - - {"RX_MACRO RX0 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX1 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX2 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX3 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX4 MUX", "AIF2_PB", "RX AIF2 PB"}, - {"RX_MACRO RX5 MUX", "AIF2_PB", "RX AIF2 PB"}, - - {"RX_MACRO RX0 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX1 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX2 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX3 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX4 MUX", "AIF3_PB", "RX AIF3 PB"}, - {"RX_MACRO RX5 MUX", "AIF3_PB", "RX AIF3 PB"}, - - {"RX_MACRO RX0 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX1 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX2 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX3 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX4 MUX", "AIF4_PB", "RX AIF4 PB"}, - {"RX_MACRO RX5 MUX", "AIF4_PB", "RX AIF4 PB"}, - - {"RX_RX0", NULL, "RX_MACRO RX0 MUX"}, - {"RX_RX1", NULL, "RX_MACRO RX1 MUX"}, - {"RX_RX2", NULL, "RX_MACRO RX2 MUX"}, - {"RX_RX3", NULL, "RX_MACRO RX3 MUX"}, - {"RX_RX4", NULL, "RX_MACRO RX4 MUX"}, - {"RX_RX5", NULL, "RX_MACRO RX5 MUX"}, - - {"RX INT0_1 MIX1 INP0", "RX0", "RX_RX0"}, - {"RX INT0_1 MIX1 INP0", "RX1", "RX_RX1"}, - {"RX INT0_1 MIX1 INP0", "RX2", "RX_RX2"}, - {"RX INT0_1 MIX1 INP0", "RX3", "RX_RX3"}, - {"RX INT0_1 MIX1 INP0", "RX4", "RX_RX4"}, - {"RX INT0_1 MIX1 INP0", "RX5", "RX_RX5"}, - {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP1", "RX0", "RX_RX0"}, - {"RX INT0_1 MIX1 INP1", "RX1", "RX_RX1"}, - {"RX INT0_1 MIX1 INP1", "RX2", "RX_RX2"}, - {"RX INT0_1 MIX1 INP1", "RX3", "RX_RX3"}, - {"RX INT0_1 MIX1 INP1", "RX4", "RX_RX4"}, - {"RX INT0_1 MIX1 INP1", "RX5", "RX_RX5"}, - {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP2", "RX0", "RX_RX0"}, - {"RX INT0_1 MIX1 INP2", "RX1", "RX_RX1"}, - {"RX INT0_1 MIX1 INP2", "RX2", "RX_RX2"}, - {"RX INT0_1 MIX1 INP2", "RX3", "RX_RX3"}, - {"RX INT0_1 MIX1 INP2", "RX4", "RX_RX4"}, - {"RX INT0_1 MIX1 INP2", "RX5", "RX_RX5"}, - {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT1_1 MIX1 INP0", "RX0", "RX_RX0"}, - {"RX INT1_1 MIX1 INP0", "RX1", "RX_RX1"}, - {"RX INT1_1 MIX1 INP0", "RX2", "RX_RX2"}, - {"RX INT1_1 MIX1 INP0", "RX3", "RX_RX3"}, - {"RX INT1_1 MIX1 INP0", "RX4", "RX_RX4"}, - {"RX INT1_1 MIX1 INP0", "RX5", "RX_RX5"}, - {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP1", "RX0", "RX_RX0"}, - {"RX INT1_1 MIX1 INP1", "RX1", "RX_RX1"}, - {"RX INT1_1 MIX1 INP1", "RX2", "RX_RX2"}, - {"RX INT1_1 MIX1 INP1", "RX3", "RX_RX3"}, - {"RX INT1_1 MIX1 INP1", "RX4", "RX_RX4"}, - {"RX INT1_1 MIX1 INP1", "RX5", "RX_RX5"}, - {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP2", "RX0", "RX_RX0"}, - {"RX INT1_1 MIX1 INP2", "RX1", "RX_RX1"}, - {"RX INT1_1 MIX1 INP2", "RX2", "RX_RX2"}, - {"RX INT1_1 MIX1 INP2", "RX3", "RX_RX3"}, - {"RX INT1_1 MIX1 INP2", "RX4", "RX_RX4"}, - {"RX INT1_1 MIX1 INP2", "RX5", "RX_RX5"}, - {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT2_1 MIX1 INP0", "RX0", "RX_RX0"}, - {"RX INT2_1 MIX1 INP0", "RX1", "RX_RX1"}, - {"RX INT2_1 MIX1 INP0", "RX2", "RX_RX2"}, - {"RX INT2_1 MIX1 INP0", "RX3", "RX_RX3"}, - {"RX INT2_1 MIX1 INP0", "RX4", "RX_RX4"}, - {"RX INT2_1 MIX1 INP0", "RX5", "RX_RX5"}, - {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP1", "RX0", "RX_RX0"}, - {"RX INT2_1 MIX1 INP1", "RX1", "RX_RX1"}, - {"RX INT2_1 MIX1 INP1", "RX2", "RX_RX2"}, - {"RX INT2_1 MIX1 INP1", "RX3", "RX_RX3"}, - {"RX INT2_1 MIX1 INP1", "RX4", "RX_RX4"}, - {"RX INT2_1 MIX1 INP1", "RX5", "RX_RX5"}, - {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP2", "RX0", "RX_RX0"}, - {"RX INT2_1 MIX1 INP2", "RX1", "RX_RX1"}, - {"RX INT2_1 MIX1 INP2", "RX2", "RX_RX2"}, - {"RX INT2_1 MIX1 INP2", "RX3", "RX_RX3"}, - {"RX INT2_1 MIX1 INP2", "RX4", "RX_RX4"}, - {"RX INT2_1 MIX1 INP2", "RX5", "RX_RX5"}, - {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"}, - - {"RX MIX TX0 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX AIF_ECHO", NULL, "RX MIX TX0 MUX"}, - {"RX AIF_ECHO", NULL, "RX MIX TX1 MUX"}, - {"RX AIF_ECHO", NULL, "RX MIX TX2 MUX"}, - {"RX AIF_ECHO", NULL, "RX_MCLK"}, - - /* Mixing path INT0 */ - {"RX INT0_2 MUX", "RX0", "RX_RX0"}, - {"RX INT0_2 MUX", "RX1", "RX_RX1"}, - {"RX INT0_2 MUX", "RX2", "RX_RX2"}, - {"RX INT0_2 MUX", "RX3", "RX_RX3"}, - {"RX INT0_2 MUX", "RX4", "RX_RX4"}, - {"RX INT0_2 MUX", "RX5", "RX_RX5"}, - {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"}, - - /* Mixing path INT1 */ - {"RX INT1_2 MUX", "RX0", "RX_RX0"}, - {"RX INT1_2 MUX", "RX1", "RX_RX1"}, - {"RX INT1_2 MUX", "RX2", "RX_RX2"}, - {"RX INT1_2 MUX", "RX3", "RX_RX3"}, - {"RX INT1_2 MUX", "RX4", "RX_RX4"}, - {"RX INT1_2 MUX", "RX5", "RX_RX5"}, - {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"}, - {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"}, - - /* Mixing path INT2 */ - {"RX INT2_2 MUX", "RX0", "RX_RX0"}, - {"RX INT2_2 MUX", "RX1", "RX_RX1"}, - {"RX INT2_2 MUX", "RX2", "RX_RX2"}, - {"RX INT2_2 MUX", "RX3", "RX_RX3"}, - {"RX INT2_2 MUX", "RX4", "RX_RX4"}, - {"RX INT2_2 MUX", "RX5", "RX_RX5"}, - {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"}, - {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"}, - - {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"}, - {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"}, - {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"}, - {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"}, - {"HPHL_OUT", NULL, "RX INT0 DEM MUX"}, - {"HPHL_OUT", NULL, "RX_MCLK"}, - - {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"}, - {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"}, - {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"}, - {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"}, - {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX2"}, - {"HPHR_OUT", NULL, "RX INT1 DEM MUX"}, - {"HPHR_OUT", NULL, "RX_MCLK"}, - - {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"}, - - {"RX INT2_1 VBAT", "RX AUX VBAT Enable", "RX INT2_1 INTERP"}, - {"RX INT2 SEC MIX", NULL, "RX INT2_1 VBAT"}, - - {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"}, - {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"}, - {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"}, - {"AUX_OUT", NULL, "RX INT2 MIX2"}, - {"AUX_OUT", NULL, "RX_MCLK"}, - - {"IIR0", NULL, "RX_MCLK"}, - {"IIR0", NULL, "IIR0 INP0 MUX"}, - {"IIR0 INP0 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP0 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP0 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP0 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP0 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP0 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP0 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP0 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP0 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP0 MUX", "RX5", "RX_RX5"}, - {"IIR0", NULL, "IIR0 INP1 MUX"}, - {"IIR0 INP1 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP1 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP1 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP1 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP1 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP1 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP1 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP1 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP1 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP1 MUX", "RX5", "RX_RX5"}, - {"IIR0", NULL, "IIR0 INP2 MUX"}, - {"IIR0 INP2 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP2 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP2 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP2 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP2 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP2 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP2 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP2 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP2 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP2 MUX", "RX5", "RX_RX5"}, - {"IIR0", NULL, "IIR0 INP3 MUX"}, - {"IIR0 INP3 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR0 INP3 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR0 INP3 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR0 INP3 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR0 INP3 MUX", "RX0", "RX_RX0"}, - {"IIR0 INP3 MUX", "RX1", "RX_RX1"}, - {"IIR0 INP3 MUX", "RX2", "RX_RX2"}, - {"IIR0 INP3 MUX", "RX3", "RX_RX3"}, - {"IIR0 INP3 MUX", "RX4", "RX_RX4"}, - {"IIR0 INP3 MUX", "RX5", "RX_RX5"}, - - {"IIR1", NULL, "RX_MCLK"}, - {"IIR1", NULL, "IIR1 INP0 MUX"}, - {"IIR1 INP0 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP0 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP0 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP0 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP0 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP0 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP0 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP0 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP0 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP0 MUX", "RX5", "RX_RX5"}, - {"IIR1", NULL, "IIR1 INP1 MUX"}, - {"IIR1 INP1 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP1 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP1 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP1 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP1 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP1 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP1 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP1 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP1 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP1 MUX", "RX5", "RX_RX5"}, - {"IIR1", NULL, "IIR1 INP2 MUX"}, - {"IIR1 INP2 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP2 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP2 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP2 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP2 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP2 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP2 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP2 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP2 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP2 MUX", "RX5", "RX_RX5"}, - {"IIR1", NULL, "IIR1 INP3 MUX"}, - {"IIR1 INP3 MUX", "DEC0", "RX_TX DEC0_INP"}, - {"IIR1 INP3 MUX", "DEC1", "RX_TX DEC1_INP"}, - {"IIR1 INP3 MUX", "DEC2", "RX_TX DEC2_INP"}, - {"IIR1 INP3 MUX", "DEC3", "RX_TX DEC3_INP"}, - {"IIR1 INP3 MUX", "RX0", "RX_RX0"}, - {"IIR1 INP3 MUX", "RX1", "RX_RX1"}, - {"IIR1 INP3 MUX", "RX2", "RX_RX2"}, - {"IIR1 INP3 MUX", "RX3", "RX_RX3"}, - {"IIR1 INP3 MUX", "RX4", "RX_RX4"}, - {"IIR1 INP3 MUX", "RX5", "RX_RX5"}, - - {"SRC0", NULL, "IIR0"}, - {"SRC1", NULL, "IIR1"}, - {"RX INT0 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT0 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT1 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT1 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT2 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT2 MIX2 INP", "SRC1", "SRC1"}, -}; - -static int rx_swrm_clock(void *handle, bool enable) -{ - struct rx_macro_priv *rx_priv = (struct rx_macro_priv *) handle; - struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&rx_priv->swr_clk_lock); - - dev_dbg(rx_priv->dev, "%s: swrm clock %s\n", - __func__, (enable ? "enable" : "disable")); - if (enable) { - if (rx_priv->swr_clk_users == 0) { - ret = rx_macro_mclk_enable(rx_priv, 1, true); - if (ret < 0) { - dev_err_ratelimited(rx_priv->dev, - "%s: rx request clock enable failed\n", - __func__); - goto exit; - } - if (rx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - if (rx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x00); - rx_priv->reset_swr = false; - msm_cdc_pinctrl_select_active_state( - rx_priv->rx_swr_gpio_p); - } - rx_priv->swr_clk_users++; - } else { - if (rx_priv->swr_clk_users <= 0) { - dev_err(rx_priv->dev, - "%s: rx swrm clock users already reset\n", - __func__); - rx_priv->swr_clk_users = 0; - goto exit; - } - rx_priv->swr_clk_users--; - if (rx_priv->swr_clk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - msm_cdc_pinctrl_select_sleep_state( - rx_priv->rx_swr_gpio_p); - rx_macro_mclk_enable(rx_priv, 0, true); - } - } - dev_dbg(rx_priv->dev, "%s: swrm clock users %d\n", - __func__, rx_priv->swr_clk_users); -exit: - mutex_unlock(&rx_priv->swr_clk_lock); - return ret; -} - -static void rx_macro_init_bcl_pmic_reg(struct snd_soc_codec *codec) -{ - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return; - } - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return; - - switch (rx_priv->bcl_pmic_params.id) { - case 0: - /* Enable ID0 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x02, 0x02); - /* Update MC_SID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0x0F, - rx_priv->bcl_pmic_params.sid); - /* Update MC_PPID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2, 0xFF, - rx_priv->bcl_pmic_params.ppid); - break; - case 1: - /* Enable ID1 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x01, 0x01); - /* Update MC_SID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3, 0x0F, - rx_priv->bcl_pmic_params.sid); - /* Update MC_PPID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0xFF, - rx_priv->bcl_pmic_params.ppid); - break; - default: - dev_err(rx_dev, "%s: PMIC ID is invalid %d\n", - __func__, rx_priv->bcl_pmic_params.id); - break; - } -} - -static int rx_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret = 0; - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - rx_dev = bolero_get_device_ptr(codec->dev, RX_MACRO); - if (!rx_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - rx_priv = dev_get_drvdata(rx_dev); - if (!rx_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - - ret = snd_soc_dapm_new_controls(dapm, rx_macro_dapm_widgets, - ARRAY_SIZE(rx_macro_dapm_widgets)); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add controls\n", __func__); - return ret; - } - ret = snd_soc_dapm_add_routes(dapm, rx_audio_map, - ARRAY_SIZE(rx_audio_map)); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add routes\n", __func__); - return ret; - } - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add widgets\n", __func__); - return ret; - } - ret = snd_soc_add_codec_controls(codec, rx_macro_snd_controls, - ARRAY_SIZE(rx_macro_snd_controls)); - if (ret < 0) { - dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__); - return ret; - } - rx_priv->dev_up = true; - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF2 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF3 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF4 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "AUX_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC0_INP"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC1_INP"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC2_INP"); - snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC3_INP"); - snd_soc_dapm_sync(dapm); - - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x07, 0x02); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x07, 0x02); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x07, 0x02); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x03, 0x02); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x03, 0x02); - snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x03, 0x02); - - rx_priv->codec = codec; - rx_macro_init_bcl_pmic_reg(codec); - - return 0; -} - -static int rx_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *rx_dev = NULL; - struct rx_macro_priv *rx_priv = NULL; - - if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) - return -EINVAL; - - rx_priv->codec = NULL; - - return 0; -} - -static void rx_macro_add_child_devices(struct work_struct *work) -{ - struct rx_macro_priv *rx_priv = NULL; - struct platform_device *pdev = NULL; - struct device_node *node = NULL; - struct rx_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL; - int ret = 0; - u16 count = 0, ctrl_num = 0; - struct rx_swr_ctrl_platform_data *platdata = NULL; - char plat_dev_name[RX_SWR_STRING_LEN] = ""; - bool rx_swr_master_node = false; - - rx_priv = container_of(work, struct rx_macro_priv, - rx_macro_add_child_devices_work); - if (!rx_priv) { - pr_err("%s: Memory for rx_priv does not exist\n", - __func__); - return; - } - - if (!rx_priv->dev) { - pr_err("%s: RX device does not exist\n", __func__); - return; - } - - if(!rx_priv->dev->of_node) { - dev_err(rx_priv->dev, - "%s: DT node for RX dev does not exist\n", __func__); - return; - } - - platdata = &rx_priv->swr_plat_data; - rx_priv->child_count = 0; - - for_each_available_child_of_node(rx_priv->dev->of_node, node) { - rx_swr_master_node = false; - if (strnstr(node->name, "rx_swr_master", - strlen("rx_swr_master")) != NULL) - rx_swr_master_node = true; - - if(rx_swr_master_node) - strlcpy(plat_dev_name, "rx_swr_ctrl", - (RX_SWR_STRING_LEN - 1)); - else - strlcpy(plat_dev_name, node->name, - (RX_SWR_STRING_LEN - 1)); - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(rx_priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = rx_priv->dev; - pdev->dev.of_node = node; - - if (rx_swr_master_node) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (rx_swr_master_node) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct rx_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - ret = -ENOMEM; - goto fail_pdev_add; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].rx_swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - rx_priv->swr_ctrl_data = swr_ctrl_data; - } - if (rx_priv->child_count < RX_MACRO_CHILD_DEVICES_MAX) - rx_priv->pdev_child_devices[ - rx_priv->child_count++] = pdev; - else - goto err; - } - return; -fail_pdev_add: - for (count = 0; count < rx_priv->child_count; count++) - platform_device_put(rx_priv->pdev_child_devices[count]); -err: - return; -} - -static void rx_macro_init_ops(struct macro_ops *ops, char __iomem *rx_io_base) -{ - memset(ops, 0, sizeof(struct macro_ops)); - ops->init = rx_macro_init; - ops->exit = rx_macro_deinit; - ops->io_base = rx_io_base; - ops->dai_ptr = rx_macro_dai; - ops->num_dais = ARRAY_SIZE(rx_macro_dai); - ops->mclk_fn = rx_macro_mclk_ctrl; - ops->event_handler = rx_macro_event_handler; -} - -static int rx_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops = {0}; - struct rx_macro_priv *rx_priv = NULL; - u32 rx_base_addr = 0, muxsel = 0; - char __iomem *rx_io_base = NULL, *muxsel_io = NULL; - int ret = 0; - struct clk *rx_core_clk = NULL, *rx_npl_clk = NULL; - u8 bcl_pmic_params[3]; - - rx_priv = devm_kzalloc(&pdev->dev, sizeof(struct rx_macro_priv), - GFP_KERNEL); - if (!rx_priv) - return -ENOMEM; - - rx_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &rx_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - ret = of_property_read_u32(pdev->dev.of_node, "qcom,rx_mclk_mode_muxsel", - &muxsel); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - rx_priv->rx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,rx-swr-gpios", 0); - if (!rx_priv->rx_swr_gpio_p) { - dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n", - __func__); - return -EINVAL; - } - rx_io_base = devm_ioremap(&pdev->dev, rx_base_addr, - RX_MACRO_MAX_OFFSET); - if (!rx_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -ENOMEM; - } - rx_priv->rx_io_base = rx_io_base; - muxsel_io = devm_ioremap(&pdev->dev, muxsel, 0x4); - if (!muxsel_io) { - dev_err(&pdev->dev, "%s: ioremap failed for muxsel\n", - __func__); - return -ENOMEM; - } - rx_priv->rx_mclk_mode_muxsel = muxsel_io; - rx_priv->reset_swr = true; - INIT_WORK(&rx_priv->rx_macro_add_child_devices_work, - rx_macro_add_child_devices); - rx_priv->swr_plat_data.handle = (void *) rx_priv; - rx_priv->swr_plat_data.read = NULL; - rx_priv->swr_plat_data.write = NULL; - rx_priv->swr_plat_data.bulk_write = NULL; - rx_priv->swr_plat_data.clk = rx_swrm_clock; - rx_priv->swr_plat_data.handle_irq = NULL; - - /* Register MCLK for rx macro */ - rx_core_clk = devm_clk_get(&pdev->dev, "rx_core_clk"); - if (IS_ERR(rx_core_clk)) { - ret = PTR_ERR(rx_core_clk); - dev_err(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "rx_core_clk", ret); - return ret; - } - rx_priv->rx_core_clk = rx_core_clk; - /* Register npl clk for soundwire */ - rx_npl_clk = devm_clk_get(&pdev->dev, "rx_npl_clk"); - if (IS_ERR(rx_npl_clk)) { - ret = PTR_ERR(rx_npl_clk); - dev_err(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "rx_npl_clk", ret); - return ret; - } - rx_priv->rx_npl_clk = rx_npl_clk; - - ret = of_property_read_u8_array(pdev->dev.of_node, - "qcom,rx-bcl-pmic-params", bcl_pmic_params, - sizeof(bcl_pmic_params)); - if (ret) { - dev_dbg(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "qcom,rx-bcl-pmic-params"); - } else { - rx_priv->bcl_pmic_params.id = bcl_pmic_params[0]; - rx_priv->bcl_pmic_params.sid = bcl_pmic_params[1]; - rx_priv->bcl_pmic_params.ppid = bcl_pmic_params[2]; - } - - dev_set_drvdata(&pdev->dev, rx_priv); - mutex_init(&rx_priv->mclk_lock); - mutex_init(&rx_priv->swr_clk_lock); - mutex_init(&rx_priv->clk_lock); - rx_macro_init_ops(&ops, rx_io_base); - - ret = bolero_register_macro(&pdev->dev, RX_MACRO, &ops); - if (ret) { - dev_err(&pdev->dev, - "%s: register macro failed\n", __func__); - goto err_reg_macro; - } - schedule_work(&rx_priv->rx_macro_add_child_devices_work); - - return 0; - -err_reg_macro: - mutex_destroy(&rx_priv->mclk_lock); - mutex_destroy(&rx_priv->swr_clk_lock); - mutex_destroy(&rx_priv->clk_lock); - return ret; -} - -static int rx_macro_remove(struct platform_device *pdev) -{ - struct rx_macro_priv *rx_priv = NULL; - u16 count = 0; - - rx_priv = dev_get_drvdata(&pdev->dev); - - if (!rx_priv) - return -EINVAL; - - for (count = 0; count < rx_priv->child_count && - count < RX_MACRO_CHILD_DEVICES_MAX; count++) - platform_device_unregister(rx_priv->pdev_child_devices[count]); - - bolero_unregister_macro(&pdev->dev, RX_MACRO); - mutex_destroy(&rx_priv->mclk_lock); - mutex_destroy(&rx_priv->swr_clk_lock); - mutex_destroy(&rx_priv->clk_lock); - kfree(rx_priv->swr_ctrl_data); - return 0; -} - -static const struct of_device_id rx_macro_dt_match[] = { - {.compatible = "qcom,rx-macro"}, - {} -}; - -static struct platform_driver rx_macro_driver = { - .driver = { - .name = "rx_macro", - .owner = THIS_MODULE, - .of_match_table = rx_macro_dt_match, - }, - .probe = rx_macro_probe, - .remove = rx_macro_remove, -}; - -module_platform_driver(rx_macro_driver); - -MODULE_DESCRIPTION("RX macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/bolero/tx-macro.c b/techpack/audio/asoc/codecs/bolero/tx-macro.c deleted file mode 100644 index 883f8107a70e..000000000000 --- a/techpack/audio/asoc/codecs/bolero/tx-macro.c +++ /dev/null @@ -1,1991 +0,0 @@ -/* Copyright (c) 2018-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" -#include "../msm-cdc-pinctrl.h" - -#define TX_MACRO_MAX_OFFSET 0x1000 - -#define NUM_DECIMATORS 8 - -#define TX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define TX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED 0 -#define TX_MACRO_MCLK_FREQ 9600000 -#define TX_MACRO_TX_PATH_OFFSET 0x80 -#define TX_MACRO_SWR_MIC_MUX_SEL_MASK 0xF -#define TX_MACRO_ADC_MUX_CFG_OFFSET 0x2 - -#define TX_MACRO_TX_UNMUTE_DELAY_MS 40 - -static int tx_unmute_delay = TX_MACRO_TX_UNMUTE_DELAY_MS; -module_param(tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path"); - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -static int tx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai); -static int tx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot); - -#define TX_MACRO_SWR_STRING_LEN 80 -#define TX_MACRO_CHILD_DEVICES_MAX 3 - -/* Hold instance to soundwire platform device */ -struct tx_macro_swr_ctrl_data { - struct platform_device *tx_swr_pdev; -}; - -struct tx_macro_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -enum { - TX_MACRO_AIF_INVALID = 0, - TX_MACRO_AIF1_CAP, - TX_MACRO_AIF2_CAP, - TX_MACRO_MAX_DAIS -}; - -enum { - TX_MACRO_DEC0, - TX_MACRO_DEC1, - TX_MACRO_DEC2, - TX_MACRO_DEC3, - TX_MACRO_DEC4, - TX_MACRO_DEC5, - TX_MACRO_DEC6, - TX_MACRO_DEC7, - TX_MACRO_DEC_MAX, -}; - -enum { - TX_MACRO_CLK_DIV_2, - TX_MACRO_CLK_DIV_3, - TX_MACRO_CLK_DIV_4, - TX_MACRO_CLK_DIV_6, - TX_MACRO_CLK_DIV_8, - TX_MACRO_CLK_DIV_16, -}; - -enum { - MSM_DMIC, - SWR_MIC, - ANC_FB_TUNE1 -}; - -struct tx_mute_work { - struct tx_macro_priv *tx_priv; - u32 decimator; - struct delayed_work dwork; -}; - -struct hpf_work { - struct tx_macro_priv *tx_priv; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -struct tx_macro_priv { - struct device *dev; - bool dec_active[NUM_DECIMATORS]; - int tx_mclk_users; - int swr_clk_users; - bool dapm_mclk_enable; - bool reset_swr; - struct clk *tx_core_clk; - struct clk *tx_npl_clk; - struct mutex mclk_lock; - struct mutex swr_clk_lock; - struct mutex clk_lock; - struct snd_soc_codec *codec; - struct device_node *tx_swr_gpio_p; - struct tx_macro_swr_ctrl_data *swr_ctrl_data; - struct tx_macro_swr_ctrl_platform_data swr_plat_data; - struct work_struct tx_macro_add_child_devices_work; - struct hpf_work tx_hpf_work[NUM_DECIMATORS]; - struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS]; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - s32 dmic_6_7_clk_cnt; - u16 dmic_clk_div; - unsigned long active_ch_mask[TX_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS]; - char __iomem *tx_io_base; - struct platform_device *pdev_child_devices - [TX_MACRO_CHILD_DEVICES_MAX]; - int child_count; - bool bcs_enable; - bool bcs_clk_en; - bool hs_slow_insert_complete; -}; - -static bool tx_macro_get_data(struct snd_soc_codec *codec, - struct device **tx_dev, - struct tx_macro_priv **tx_priv, - const char *func_name) -{ - *tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO); - if (!(*tx_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - - *tx_priv = dev_get_drvdata((*tx_dev)); - if (!(*tx_priv)) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - - if (!(*tx_priv)->codec) { - dev_err(codec->dev, - "%s: tx_priv->codec not initialized!\n", func_name); - return false; - } - - return true; -} - -static int tx_macro_mclk_enable(struct tx_macro_priv *tx_priv, - bool mclk_enable) -{ - struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(tx_priv->dev, "%s: mclk_enable = %u,clk_users= %d\n", - __func__, mclk_enable, tx_priv->tx_mclk_users); - - mutex_lock(&tx_priv->mclk_lock); - if (mclk_enable) { - if (tx_priv->tx_mclk_users == 0) { - ret = bolero_request_clock(tx_priv->dev, - TX_MACRO, MCLK_MUX0, true); - if (ret < 0) { - dev_err_ratelimited(tx_priv->dev, - "%s: request clock enable failed\n", - __func__); - goto exit; - } - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - TX_START_OFFSET, - TX_MAX_OFFSET); - /* 9.6MHz MCLK, set value 0x00 if other frequency */ - regmap_update_bits(regmap, - BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - } - tx_priv->tx_mclk_users++; - } else { - if (tx_priv->tx_mclk_users <= 0) { - dev_err(tx_priv->dev, "%s: clock already disabled\n", - __func__); - tx_priv->tx_mclk_users = 0; - goto exit; - } - tx_priv->tx_mclk_users--; - if (tx_priv->tx_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - bolero_request_clock(tx_priv->dev, - TX_MACRO, MCLK_MUX0, false); - } - } -exit: - mutex_unlock(&tx_priv->mclk_lock); - return ret; -} - -static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - dev_dbg(tx_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = tx_macro_mclk_enable(tx_priv, 1); - if (ret) - tx_priv->dapm_mclk_enable = false; - else - tx_priv->dapm_mclk_enable = true; - break; - case SND_SOC_DAPM_POST_PMD: - if (tx_priv->dapm_mclk_enable) - ret = tx_macro_mclk_enable(tx_priv, 0); - break; - default: - dev_err(tx_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int tx_macro_mclk_reset(struct device *dev) -{ - struct tx_macro_priv *tx_priv = dev_get_drvdata(dev); - int count = 0; - - mutex_lock(&tx_priv->clk_lock); - while (__clk_is_enabled(tx_priv->tx_core_clk)) { - clk_disable_unprepare(tx_priv->tx_npl_clk); - clk_disable_unprepare(tx_priv->tx_core_clk); - count++; - } - dev_dbg(tx_priv->dev, - "%s: clock reset after ssr, count %d\n", __func__, count); - while (count) { - clk_prepare_enable(tx_priv->tx_core_clk); - clk_prepare_enable(tx_priv->tx_npl_clk); - count--; - } - mutex_unlock(&tx_priv->clk_lock); - return 0; -} - -static int tx_macro_mclk_ctrl(struct device *dev, bool enable) -{ - struct tx_macro_priv *tx_priv = dev_get_drvdata(dev); - int ret = 0; - - mutex_lock(&tx_priv->clk_lock); - if (enable) { - ret = clk_prepare_enable(tx_priv->tx_core_clk); - if (ret < 0) { - dev_err_ratelimited(dev, "%s:tx mclk enable failed\n", __func__); - goto exit; - } - ret = clk_prepare_enable(tx_priv->tx_npl_clk); - if (ret < 0) { - dev_err(dev, "%s:tx npl_clk enable failed\n", - __func__); - clk_disable_unprepare(tx_priv->tx_core_clk); - goto exit; - } - } else { - clk_disable_unprepare(tx_priv->tx_npl_clk); - clk_disable_unprepare(tx_priv->tx_core_clk); - } - -exit: - mutex_unlock(&tx_priv->clk_lock); - return ret; -} - -static int tx_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_SSR_DOWN: - swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEVICE_DOWN, NULL); - swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - break; - case BOLERO_MACRO_EVT_SSR_UP: - /* reset swr after ssr/pdr */ - tx_priv->reset_swr = true; - swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - break; - case BOLERO_MACRO_EVT_CLK_RESET: - tx_macro_mclk_reset(tx_dev); - break; - case BOLERO_MACRO_EVT_BCS_CLK_OFF: - if (tx_priv->bcs_clk_en) - snd_soc_update_bits(codec, - BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, data << 6); - if (data) - tx_priv->hs_slow_insert_complete = true; - else - tx_priv->hs_slow_insert_complete = false; - break; - } - return 0; -} - -static int tx_macro_reg_wake_irq(struct snd_soc_codec *codec, - u32 data) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - u32 ipc_wakeup = data; - int ret = 0; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_REGISTER_WAKE_IRQ, &ipc_wakeup); - - return ret; -} - -static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work = NULL; - struct hpf_work *hpf_work = NULL; - struct tx_macro_priv *tx_priv = NULL; - struct snd_soc_codec *codec = NULL; - u16 dec_cfg_reg = 0, hpf_gate_reg = 0; - u8 hpf_cut_off_freq = 0; - u16 adc_mux_reg = 0, adc_n = 0, adc_reg = 0; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - tx_priv = hpf_work->tx_priv; - codec = tx_priv->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 + - TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 + - TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - - dev_dbg(codec->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - TX_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator; - if (snd_soc_read(codec, adc_mux_reg) & SWR_MIC) { - adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - TX_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator; - adc_n = snd_soc_read(codec, adc_reg) & - TX_MACRO_SWR_MIC_MUX_SEL_MASK; - if (adc_n >= BOLERO_ADC_MAX) - goto tx_hpf_set; - /* analog mic clear TX hold */ - bolero_clear_amic_tx_hold(codec->dev, adc_n); - } -tx_hpf_set: - snd_soc_update_bits(codec, dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, 0x03, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, 0x03, 0x01); -} - -static void tx_macro_mute_update_callback(struct work_struct *work) -{ - struct tx_mute_work *tx_mute_dwork = NULL; - struct snd_soc_codec *codec = NULL; - struct tx_macro_priv *tx_priv = NULL; - struct delayed_work *delayed_work = NULL; - u16 tx_vol_ctl_reg = 0; - u8 decimator = 0; - - delayed_work = to_delayed_work(work); - tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork); - tx_priv = tx_mute_dwork->tx_priv; - codec = tx_priv->codec; - decimator = tx_mute_dwork->decimator; - - tx_vol_ctl_reg = - BOLERO_CDC_TX0_TX_PATH_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n", - __func__, decimator); -} - -static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val = 0; - u16 mic_sel_reg = 0; - - val = ucontrol->value.enumerated.item[0]; - if (val > e->items - 1) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - switch (e->reg) { - case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0: - mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0: - mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0: - mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0: - mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0: - mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0: - mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0: - mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0; - break; - case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0: - mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0; - break; - default: - dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n", - __func__, e->reg); - return -EINVAL; - } - if (strnstr(widget->name, "SMIC", strlen(widget->name))) { - if (val != 0) { - if (val < 5) - snd_soc_update_bits(codec, mic_sel_reg, - 1 << 7, 0x0 << 7); - else - snd_soc_update_bits(codec, mic_sel_reg, - 1 << 7, 0x1 << 7); - } - } else { - /* DMIC selected */ - if (val != 0) - snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, 1 << 7); - } - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - if (enable) { - set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); - tx_priv->active_ch_cnt[dai_id]++; - } else { - tx_priv->active_ch_cnt[dai_id]--; - clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); - } - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} -static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tx_macro_priv *tx_priv = NULL; - struct device *tx_dev = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = tx_priv->bcs_enable; - - return 0; -} - -static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tx_macro_priv *tx_priv = NULL; - struct device *tx_dev = NULL; - int value = ucontrol->value.integer.value[0]; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - tx_priv->bcs_enable = value; - - return 0; -} - -static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u8 dmic_clk_en = 0x01; - u16 dmic_clk_reg = 0; - s32 *dmic_clk_cnt = NULL; - unsigned int dmic = 0; - int ret = 0; - char *wname = NULL; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - wname = strpbrk(w->name, "01234567"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(tx_priv->dmic_0_1_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL; - break; - case 2: - case 3: - dmic_clk_cnt = &(tx_priv->dmic_2_3_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL; - break; - case 4: - case 5: - dmic_clk_cnt = &(tx_priv->dmic_4_5_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL; - break; - case 6: - case 7: - dmic_clk_cnt = &(tx_priv->dmic_6_7_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - } - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - (*dmic_clk_cnt)++; - if (*dmic_clk_cnt == 1) { - snd_soc_update_bits(codec, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - 0x80, 0x00); - - snd_soc_update_bits(codec, dmic_clk_reg, - 0x0E, tx_priv->dmic_clk_div << 0x1); - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, dmic_clk_en); - } - break; - case SND_SOC_DAPM_POST_PMD: - (*dmic_clk_cnt)--; - if (*dmic_clk_cnt == 0) - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, 0); - break; - } - - return 0; -} - -static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - unsigned int decimator = 0; - u16 tx_vol_ctl_reg = 0; - u16 dec_cfg_reg = 0; - u16 hpf_gate_reg = 0; - u16 tx_gain_ctl_reg = 0; - u8 hpf_cut_off_freq = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - decimator = w->shift; - - dev_dbg(codec->dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 + - TX_MACRO_TX_PATH_OFFSET * decimator; - dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 + - TX_MACRO_TX_PATH_OFFSET * decimator; - tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x20); - snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x00); - - hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - /* schedule work queue to Remove Mute */ - schedule_delayed_work(&tx_priv->tx_mute_dwork[decimator].dwork, - msecs_to_jiffies(tx_unmute_delay)); - if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) { - schedule_delayed_work( - &tx_priv->tx_hpf_work[decimator].dwork, - msecs_to_jiffies(300)); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per HW spec - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x00); - } - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, tx_gain_ctl_reg)); - if (tx_priv->bcs_enable) { - snd_soc_update_bits(codec, dec_cfg_reg, - 0x01, 0x01); - tx_priv->bcs_clk_en = true; - if (tx_priv->hs_slow_insert_complete) - snd_soc_update_bits(codec, - BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, - 0x40); - } - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &tx_priv->tx_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required - * as per HW spec - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x00); - } - } - cancel_delayed_work_sync( - &tx_priv->tx_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x00); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - if (tx_priv->bcs_enable) { - snd_soc_update_bits(codec, dec_cfg_reg, - 0x01, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_TX0_TX_PATH_SEC7, - 0x40, 0x00); - tx_priv->bcs_clk_en = false; - } - break; - } - return 0; -} - -static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return 0; -} - -/* Cutoff frequency for high pass filter */ -static const char * const cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ" -}; - -static SOC_ENUM_SINGLE_DECL(cf_dec0_enum, BOLERO_CDC_TX0_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec1_enum, BOLERO_CDC_TX1_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec2_enum, BOLERO_CDC_TX2_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec3_enum, BOLERO_CDC_TX3_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec4_enum, BOLERO_CDC_TX4_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec5_enum, BOLERO_CDC_TX5_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec6_enum, BOLERO_CDC_TX6_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec7_enum, BOLERO_CDC_TX7_TX_PATH_CFG0, 5, - cf_text); - -static int tx_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - int tx_fs_rate = -EINVAL; - struct snd_soc_codec *codec = dai->codec; - u32 decimator = 0; - u32 sample_rate = 0; - u16 tx_fs_reg = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - sample_rate = params_rate(params); - switch (sample_rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - case 384000: - tx_fs_rate = 7; - break; - default: - dev_err(codec->dev, "%s: Invalid TX sample rate: %d\n", - __func__, params_rate(params)); - return -EINVAL; - } - for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id], - TX_MACRO_DEC_MAX) { - if (decimator >= 0) { - tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL + - TX_MACRO_TX_PATH_OFFSET * decimator; - dev_dbg(codec->dev, "%s: set DEC%u rate to %u\n", - __func__, decimator, sample_rate); - snd_soc_update_bits(codec, tx_fs_reg, 0x0F, - tx_fs_rate); - } else { - dev_err(codec->dev, - "%s: ERROR: Invalid decimator: %d\n", - __func__, decimator); - return -EINVAL; - } - } - return 0; -} - -static int tx_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case TX_MACRO_AIF1_CAP: - case TX_MACRO_AIF2_CAP: - *tx_slot = tx_priv->active_ch_mask[dai->id]; - *tx_num = tx_priv->active_ch_cnt[dai->id]; - break; - default: - dev_err(tx_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static struct snd_soc_dai_ops tx_macro_dai_ops = { - .hw_params = tx_macro_hw_params, - .get_channel_map = tx_macro_get_channel_map, -}; - -static struct snd_soc_dai_driver tx_macro_dai[] = { - { - .name = "tx_macro_tx1", - .id = TX_MACRO_AIF1_CAP, - .capture = { - .stream_name = "TX_AIF1 Capture", - .rates = TX_MACRO_RATES, - .formats = TX_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &tx_macro_dai_ops, - }, - { - .name = "tx_macro_tx2", - .id = TX_MACRO_AIF2_CAP, - .capture = { - .stream_name = "TX_AIF2 Capture", - .rates = TX_MACRO_RATES, - .formats = TX_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &tx_macro_dai_ops, - }, -}; - -#define STRING(name) #name -#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define TX_MACRO_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -static const char * const adc_mux_text[] = { - "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1" -}; - -TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1, - 0, adc_mux_text); -TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1, - 0, adc_mux_text); - - -static const char * const dmic_mux_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", - "DMIC4", "DMIC5", "DMIC6", "DMIC7" -}; - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -static const char * const smic_mux_text[] = { - "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", - "SWR_DMIC0", "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", - "SWR_DMIC4", "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7" -}; - -TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -TX_MACRO_DAPM_ENUM_EXT(tx_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - tx_macro_put_dec_enum); - -static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0, - tx_macro_tx_mixer_get, tx_macro_tx_mixer_put), -}; - -static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0), - - SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0, - SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0), - - SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0, - tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)), - - SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0, - tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)), - - - TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0), - TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1), - TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2), - TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3), - TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4), - TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5), - TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6), - TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7), - - TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0), - TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1), - TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2), - TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3), - TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4), - TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5), - TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6), - TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7), - - SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0, - tx_macro_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0, - tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("TX SWR_ADC0"), - SND_SOC_DAPM_INPUT("TX SWR_ADC1"), - SND_SOC_DAPM_INPUT("TX SWR_ADC2"), - SND_SOC_DAPM_INPUT("TX SWR_ADC3"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC0"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC1"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC2"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC3"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC4"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC5"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC6"), - SND_SOC_DAPM_INPUT("TX SWR_DMIC7"), - - SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM, - TX_MACRO_DEC0, 0, - &tx_dec0_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM, - TX_MACRO_DEC1, 0, - &tx_dec1_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM, - TX_MACRO_DEC2, 0, - &tx_dec2_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM, - TX_MACRO_DEC3, 0, - &tx_dec3_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM, - TX_MACRO_DEC4, 0, - &tx_dec4_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM, - TX_MACRO_DEC5, 0, - &tx_dec5_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM, - TX_MACRO_DEC6, 0, - &tx_dec6_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM, - TX_MACRO_DEC7, 0, - &tx_dec7_mux, tx_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0, - tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route tx_audio_map[] = { - {"TX_AIF1 CAP", NULL, "TX_MCLK"}, - {"TX_AIF2 CAP", NULL, "TX_MCLK"}, - - {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"}, - {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"}, - - {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"}, - {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"}, - - {"TX DEC0 MUX", NULL, "TX_MCLK"}, - {"TX DEC1 MUX", NULL, "TX_MCLK"}, - {"TX DEC2 MUX", NULL, "TX_MCLK"}, - {"TX DEC3 MUX", NULL, "TX_MCLK"}, - {"TX DEC4 MUX", NULL, "TX_MCLK"}, - {"TX DEC5 MUX", NULL, "TX_MCLK"}, - {"TX DEC6 MUX", NULL, "TX_MCLK"}, - {"TX DEC7 MUX", NULL, "TX_MCLK"}, - - {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"}, - {"TX DMIC MUX0", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX0", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX0", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX0", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX0", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX0", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX0", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX0", "DMIC7", "TX DMIC7"}, - - {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"}, - {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"}, - {"TX DMIC MUX1", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX1", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX1", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX1", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX1", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX1", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX1", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX1", "DMIC7", "TX DMIC7"}, - - {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"}, - {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"}, - {"TX DMIC MUX2", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX2", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX2", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX2", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX2", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX2", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX2", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX2", "DMIC7", "TX DMIC7"}, - - {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"}, - {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"}, - {"TX DMIC MUX3", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX3", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX3", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX3", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX3", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX3", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX3", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX3", "DMIC7", "TX DMIC7"}, - - {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"}, - {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"}, - {"TX DMIC MUX4", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX4", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX4", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX4", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX4", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX4", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX4", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX4", "DMIC7", "TX DMIC7"}, - - {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"}, - {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"}, - {"TX DMIC MUX5", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX5", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX5", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX5", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX5", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX5", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX5", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX5", "DMIC7", "TX DMIC7"}, - - {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"}, - {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"}, - {"TX DMIC MUX6", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX6", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX6", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX6", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX6", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX6", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX6", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX6", "DMIC7", "TX DMIC7"}, - - {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"}, - {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"}, - - {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"}, - {"TX DMIC MUX7", "DMIC0", "TX DMIC0"}, - {"TX DMIC MUX7", "DMIC1", "TX DMIC1"}, - {"TX DMIC MUX7", "DMIC2", "TX DMIC2"}, - {"TX DMIC MUX7", "DMIC3", "TX DMIC3"}, - {"TX DMIC MUX7", "DMIC4", "TX DMIC4"}, - {"TX DMIC MUX7", "DMIC5", "TX DMIC5"}, - {"TX DMIC MUX7", "DMIC6", "TX DMIC6"}, - {"TX DMIC MUX7", "DMIC7", "TX DMIC7"}, - - {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"}, - {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"}, - {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"}, - {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"}, - {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"}, - {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"}, - {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"}, - {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"}, - {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"}, - {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"}, - {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"}, - {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"}, - {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"}, -}; - -static const struct snd_kcontrol_new tx_macro_snd_controls[] = { - SOC_SINGLE_SX_TLV("TX_DEC0 Volume", - BOLERO_CDC_TX0_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC1 Volume", - BOLERO_CDC_TX1_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC2 Volume", - BOLERO_CDC_TX2_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC3 Volume", - BOLERO_CDC_TX3_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC4 Volume", - BOLERO_CDC_TX4_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC5 Volume", - BOLERO_CDC_TX5_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC6 Volume", - BOLERO_CDC_TX6_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("TX_DEC7 Volume", - BOLERO_CDC_TX7_TX_VOL_CTL, - 0, -84, 40, digital_gain), - - SOC_ENUM("TX0 HPF cut off", cf_dec0_enum), - - SOC_ENUM("TX1 HPF cut off", cf_dec1_enum), - - SOC_ENUM("TX2 HPF cut off", cf_dec2_enum), - - SOC_ENUM("TX3 HPF cut off", cf_dec3_enum), - - SOC_ENUM("TX4 HPF cut off", cf_dec4_enum), - - SOC_ENUM("TX5 HPF cut off", cf_dec5_enum), - - SOC_ENUM("TX6 HPF cut off", cf_dec6_enum), - - SOC_ENUM("TX7 HPF cut off", cf_dec7_enum), - - SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0, - tx_macro_get_bcs, tx_macro_set_bcs), -}; - -static int tx_macro_swrm_clock(void *handle, bool enable) -{ - struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle; - struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&tx_priv->swr_clk_lock); - - dev_dbg(tx_priv->dev, "%s: swrm clock %s\n", - __func__, (enable ? "enable" : "disable")); - if (enable) { - if (tx_priv->swr_clk_users == 0) { - ret = tx_macro_mclk_enable(tx_priv, 1); - if (ret < 0) { - dev_err_ratelimited(tx_priv->dev, - "%s: request clock enable failed\n", - __func__); - goto exit; - } - if (tx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - if (tx_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x00); - tx_priv->reset_swr = false; - msm_cdc_pinctrl_select_active_state( - tx_priv->tx_swr_gpio_p); - } - tx_priv->swr_clk_users++; - } else { - if (tx_priv->swr_clk_users <= 0) { - dev_err(tx_priv->dev, - "tx swrm clock users already 0\n"); - tx_priv->swr_clk_users = 0; - goto exit; - } - tx_priv->swr_clk_users--; - if (tx_priv->swr_clk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - msm_cdc_pinctrl_select_sleep_state( - tx_priv->tx_swr_gpio_p); - tx_macro_mclk_enable(tx_priv, 0); - } - } - dev_dbg(tx_priv->dev, "%s: swrm clock users %d\n", - __func__, tx_priv->swr_clk_users); -exit: - mutex_unlock(&tx_priv->swr_clk_lock); - return ret; -} - -static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, - struct tx_macro_priv *tx_priv) -{ - u32 div_factor = TX_MACRO_CLK_DIV_2; - u32 mclk_rate = TX_MACRO_MCLK_FREQ; - - if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) - goto undefined_rate; - - div_factor = mclk_rate / dmic_sample_rate; - - switch (div_factor) { - case 2: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2; - break; - case 3: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3; - break; - case 4: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4; - break; - case 6: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6; - break; - case 8: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8; - break; - case 16: - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16; - break; - default: - /* Any other DIV factor is invalid */ - goto undefined_rate; - } - - /* Valid dmic DIV factors */ - dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - - return dmic_sample_rate; - -undefined_rate: - dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n", - __func__, dmic_sample_rate, mclk_rate); - dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED; - - return dmic_sample_rate; -} - -static int tx_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret = 0, i = 0; - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO); - if (!tx_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - tx_priv = dev_get_drvdata(tx_dev); - if (!tx_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets, - ARRAY_SIZE(tx_macro_dapm_widgets)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add controls\n", __func__); - return ret; - } - - ret = snd_soc_dapm_add_routes(dapm, tx_audio_map, - ARRAY_SIZE(tx_audio_map)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add routes\n", __func__); - return ret; - } - - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add widgets\n", __func__); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, tx_macro_snd_controls, - ARRAY_SIZE(tx_macro_snd_controls)); - if (ret < 0) { - dev_err(tx_dev, "%s: Failed to add snd_ctls\n", __func__); - return ret; - } - - snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC0"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC6"); - snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC7"); - snd_soc_dapm_sync(dapm); - - for (i = 0; i < NUM_DECIMATORS; i++) { - tx_priv->tx_hpf_work[i].tx_priv = tx_priv; - tx_priv->tx_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork, - tx_macro_tx_hpf_corner_freq_callback); - } - - for (i = 0; i < NUM_DECIMATORS; i++) { - tx_priv->tx_mute_dwork[i].tx_priv = tx_priv; - tx_priv->tx_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork, - tx_macro_mute_update_callback); - } - tx_priv->codec = codec; - snd_soc_update_bits(codec, - BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x0E); - - return 0; -} - -static int tx_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - - if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__)) - return -EINVAL; - - tx_priv->codec = NULL; - return 0; -} - -static void tx_macro_add_child_devices(struct work_struct *work) -{ - struct tx_macro_priv *tx_priv = NULL; - struct platform_device *pdev = NULL; - struct device_node *node = NULL; - struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL; - int ret = 0; - u16 count = 0, ctrl_num = 0; - struct tx_macro_swr_ctrl_platform_data *platdata = NULL; - char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = ""; - bool tx_swr_master_node = false; - - tx_priv = container_of(work, struct tx_macro_priv, - tx_macro_add_child_devices_work); - if (!tx_priv) { - pr_err("%s: Memory for tx_priv does not exist\n", - __func__); - return; - } - - if (!tx_priv->dev) { - pr_err("%s: tx dev does not exist\n", __func__); - return; - } - - if (!tx_priv->dev->of_node) { - dev_err(tx_priv->dev, - "%s: DT node for tx_priv does not exist\n", __func__); - return; - } - - platdata = &tx_priv->swr_plat_data; - tx_priv->child_count = 0; - - for_each_available_child_of_node(tx_priv->dev->of_node, node) { - tx_swr_master_node = false; - if (strnstr(node->name, "tx_swr_master", - strlen("tx_swr_master")) != NULL) - tx_swr_master_node = true; - - if (tx_swr_master_node) - strlcpy(plat_dev_name, "tx_swr_ctrl", - (TX_MACRO_SWR_STRING_LEN - 1)); - else - strlcpy(plat_dev_name, node->name, - (TX_MACRO_SWR_STRING_LEN - 1)); - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = tx_priv->dev; - pdev->dev.of_node = node; - - if (tx_swr_master_node) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (tx_swr_master_node) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct tx_macro_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - ret = -ENOMEM; - goto fail_pdev_add; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - tx_priv->swr_ctrl_data = swr_ctrl_data; - } - if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX) - tx_priv->pdev_child_devices[ - tx_priv->child_count++] = pdev; - else - goto err; - } - return; -fail_pdev_add: - for (count = 0; count < tx_priv->child_count; count++) - platform_device_put(tx_priv->pdev_child_devices[count]); -err: - return; -} - -static void tx_macro_init_ops(struct macro_ops *ops, - char __iomem *tx_io_base) -{ - memset(ops, 0, sizeof(struct macro_ops)); - ops->init = tx_macro_init; - ops->exit = tx_macro_deinit; - ops->io_base = tx_io_base; - ops->dai_ptr = tx_macro_dai; - ops->num_dais = ARRAY_SIZE(tx_macro_dai); - ops->mclk_fn = tx_macro_mclk_ctrl; - ops->event_handler = tx_macro_event_handler; - ops->reg_wake_irq = tx_macro_reg_wake_irq; -} - -static int tx_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops = {0}; - struct tx_macro_priv *tx_priv = NULL; - u32 tx_base_addr = 0, sample_rate = 0; - char __iomem *tx_io_base = NULL; - struct clk *tx_core_clk = NULL, *tx_npl_clk = NULL; - int ret = 0; - const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate"; - - tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv), - GFP_KERNEL); - if (!tx_priv) - return -ENOMEM; - platform_set_drvdata(pdev, tx_priv); - - tx_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &tx_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - dev_set_drvdata(&pdev->dev, tx_priv); - tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,tx-swr-gpios", 0); - if (!tx_priv->tx_swr_gpio_p) { - dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n", - __func__); - return -EINVAL; - } - tx_io_base = devm_ioremap(&pdev->dev, - tx_base_addr, TX_MACRO_MAX_OFFSET); - if (!tx_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -ENOMEM; - } - tx_priv->tx_io_base = tx_io_base; - ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate, - &sample_rate); - if (ret) { - dev_err(&pdev->dev, - "%s: could not find sample_rate entry in dt\n", - __func__); - tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2; - } else { - if (tx_macro_validate_dmic_sample_rate( - sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED) - return -EINVAL; - } - tx_priv->reset_swr = true; - INIT_WORK(&tx_priv->tx_macro_add_child_devices_work, - tx_macro_add_child_devices); - tx_priv->swr_plat_data.handle = (void *) tx_priv; - tx_priv->swr_plat_data.read = NULL; - tx_priv->swr_plat_data.write = NULL; - tx_priv->swr_plat_data.bulk_write = NULL; - tx_priv->swr_plat_data.clk = tx_macro_swrm_clock; - tx_priv->swr_plat_data.handle_irq = NULL; - /* Register MCLK for tx macro */ - tx_core_clk = devm_clk_get(&pdev->dev, "tx_core_clk"); - if (IS_ERR(tx_core_clk)) { - ret = PTR_ERR(tx_core_clk); - dev_err(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "tx_core_clk", ret); - return ret; - } - tx_priv->tx_core_clk = tx_core_clk; - /* Register npl clk for soundwire */ - tx_npl_clk = devm_clk_get(&pdev->dev, "tx_npl_clk"); - if (IS_ERR(tx_npl_clk)) { - ret = PTR_ERR(tx_npl_clk); - dev_err(&pdev->dev, "%s: clk get %s failed %d\n", - __func__, "tx_npl_clk", ret); - return ret; - } - tx_priv->tx_npl_clk = tx_npl_clk; - - mutex_init(&tx_priv->mclk_lock); - mutex_init(&tx_priv->swr_clk_lock); - mutex_init(&tx_priv->clk_lock); - tx_macro_init_ops(&ops, tx_io_base); - ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops); - if (ret) { - dev_err(&pdev->dev, - "%s: register macro failed\n", __func__); - goto err_reg_macro; - } - schedule_work(&tx_priv->tx_macro_add_child_devices_work); - return 0; -err_reg_macro: - mutex_destroy(&tx_priv->mclk_lock); - mutex_destroy(&tx_priv->swr_clk_lock); - mutex_destroy(&tx_priv->clk_lock); - return ret; -} - -static int tx_macro_remove(struct platform_device *pdev) -{ - struct tx_macro_priv *tx_priv = NULL; - u16 count = 0; - - tx_priv = platform_get_drvdata(pdev); - - if (!tx_priv) - return -EINVAL; - - kfree(tx_priv->swr_ctrl_data); - for (count = 0; count < tx_priv->child_count && - count < TX_MACRO_CHILD_DEVICES_MAX; count++) - platform_device_unregister(tx_priv->pdev_child_devices[count]); - - mutex_destroy(&tx_priv->mclk_lock); - mutex_destroy(&tx_priv->swr_clk_lock); - mutex_destroy(&tx_priv->clk_lock); - bolero_unregister_macro(&pdev->dev, TX_MACRO); - return 0; -} - - -static const struct of_device_id tx_macro_dt_match[] = { - {.compatible = "qcom,tx-macro"}, - {} -}; - -static struct platform_driver tx_macro_driver = { - .driver = { - .name = "tx_macro", - .owner = THIS_MODULE, - .of_match_table = tx_macro_dt_match, - }, - .probe = tx_macro_probe, - .remove = tx_macro_remove, -}; - -module_platform_driver(tx_macro_driver); - -MODULE_DESCRIPTION("TX macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/bolero/va-macro.c b/techpack/audio/asoc/codecs/bolero/va-macro.c deleted file mode 100644 index 6319a4776808..000000000000 --- a/techpack/audio/asoc/codecs/bolero/va-macro.c +++ /dev/null @@ -1,1669 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" - -#define VA_MACRO_MAX_OFFSET 0x1000 - -#define VA_MACRO_NUM_DECIMATORS 8 - -#define VA_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define VA_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED 0 -#define VA_MACRO_MCLK_FREQ 9600000 -#define VA_MACRO_TX_PATH_OFFSET 0x80 -#define VA_MACRO_TX_DMIC_CLK_DIV_MASK 0x0E -#define VA_MACRO_TX_DMIC_CLK_DIV_SHFT 0x01 - -#define BOLERO_CDC_VA_TX_UNMUTE_DELAY_MS 40 -#define MAX_RETRY_ATTEMPTS 200 - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); -static int va_tx_unmute_delay = BOLERO_CDC_VA_TX_UNMUTE_DELAY_MS; -module_param(va_tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(va_tx_unmute_delay, "delay to unmute the tx path"); - -enum { - VA_MACRO_AIF_INVALID = 0, - VA_MACRO_AIF1_CAP, - VA_MACRO_AIF2_CAP, - VA_MACRO_MAX_DAIS, -}; - -enum { - VA_MACRO_DEC0, - VA_MACRO_DEC1, - VA_MACRO_DEC2, - VA_MACRO_DEC3, - VA_MACRO_DEC4, - VA_MACRO_DEC5, - VA_MACRO_DEC6, - VA_MACRO_DEC7, - VA_MACRO_DEC_MAX, -}; - -enum { - VA_MACRO_CLK_DIV_2, - VA_MACRO_CLK_DIV_3, - VA_MACRO_CLK_DIV_4, - VA_MACRO_CLK_DIV_6, - VA_MACRO_CLK_DIV_8, - VA_MACRO_CLK_DIV_16, -}; - -struct va_mute_work { - struct va_macro_priv *va_priv; - u32 decimator; - struct delayed_work dwork; -}; - -struct hpf_work { - struct va_macro_priv *va_priv; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -struct va_macro_priv { - struct device *dev; - bool dec_active[VA_MACRO_NUM_DECIMATORS]; - bool va_without_decimation; - struct clk *va_core_clk; - struct mutex mclk_lock; - struct snd_soc_codec *codec; - struct hpf_work va_hpf_work[VA_MACRO_NUM_DECIMATORS]; - struct va_mute_work va_mute_dwork[VA_MACRO_NUM_DECIMATORS]; - unsigned long active_ch_mask[VA_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[VA_MACRO_MAX_DAIS]; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - s32 dmic_6_7_clk_cnt; - u16 dmic_clk_div; - u16 va_mclk_users; - char __iomem *va_io_base; - struct regulator *micb_supply; - u32 micb_voltage; - u32 micb_current; - int micb_users; -}; - -static bool va_macro_get_data(struct snd_soc_codec *codec, - struct device **va_dev, - struct va_macro_priv **va_priv, - const char *func_name) -{ - *va_dev = bolero_get_device_ptr(codec->dev, VA_MACRO); - if (!(*va_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - *va_priv = dev_get_drvdata((*va_dev)); - if (!(*va_priv) || !(*va_priv)->codec) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - return true; -} - -static int va_macro_mclk_enable(struct va_macro_priv *va_priv, - bool mclk_enable, bool dapm) -{ - struct regmap *regmap = dev_get_regmap(va_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(va_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(va_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, va_priv->va_mclk_users); - - mutex_lock(&va_priv->mclk_lock); - if (mclk_enable) { - if (va_priv->va_mclk_users == 0) { - ret = bolero_request_clock(va_priv->dev, - VA_MACRO, MCLK_MUX0, true); - if (ret < 0) { - dev_err(va_priv->dev, - "%s: va request clock en failed\n", - __func__); - goto exit; - } - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - VA_START_OFFSET, - VA_MAX_OFFSET); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, - 0x02, 0x02); - } - va_priv->va_mclk_users++; - } else { - if (va_priv->va_mclk_users <= 0) { - dev_err(va_priv->dev, "%s: clock already disabled\n", - __func__); - va_priv->va_mclk_users = 0; - goto exit; - } - va_priv->va_mclk_users--; - if (va_priv->va_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, - 0x02, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - bolero_request_clock(va_priv->dev, - VA_MACRO, MCLK_MUX0, false); - } - } -exit: - mutex_unlock(&va_priv->mclk_lock); - return ret; -} - -static int va_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int retry_cnt = MAX_RETRY_ATTEMPTS; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_WAIT_VA_CLK_RESET: - while ((va_priv->va_mclk_users != 0) && (retry_cnt != 0)) { - dev_dbg_ratelimited(va_dev, "%s:retry_cnt: %d\n", - __func__, retry_cnt); - /* - * Userspace takes 10 seconds to close - * the session when pcm_start fails due to concurrency - * with PDR/SSR. Loop and check every 20ms till 10 - * seconds for va_mclk user count to get reset to 0 - * which ensures userspace teardown is done and SSR - * powerup seq can proceed. - */ - msleep(20); - retry_cnt--; - } - if (retry_cnt == 0) - dev_err(va_dev, - "%s: va_mclk_users is non-zero still, audio SSR fail!!\n", - __func__); - break; - default: - break; - } - return 0; -} - -static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = va_macro_mclk_enable(va_priv, 1, true); - break; - case SND_SOC_DAPM_POST_PMD: - va_macro_mclk_enable(va_priv, 0, true); - break; - default: - dev_err(va_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int va_macro_mclk_ctrl(struct device *dev, bool enable) -{ - struct va_macro_priv *va_priv = dev_get_drvdata(dev); - int ret = 0; - - if (enable) { - ret = clk_prepare_enable(va_priv->va_core_clk); - if (ret < 0) { - dev_err(dev, "%s:va mclk enable failed\n", __func__); - goto exit; - } - } else { - clk_disable_unprepare(va_priv->va_core_clk); - } - -exit: - return ret; -} - -static void va_macro_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work; - struct hpf_work *hpf_work; - struct va_macro_priv *va_priv; - struct snd_soc_codec *codec; - u16 dec_cfg_reg, hpf_gate_reg; - u8 hpf_cut_off_freq; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - va_priv = hpf_work->va_priv; - codec = va_priv->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = BOLERO_CDC_VA_TX0_TX_PATH_CFG0 + - VA_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - hpf_gate_reg = BOLERO_CDC_VA_TX0_TX_PATH_SEC2 + - VA_MACRO_TX_PATH_OFFSET * hpf_work->decimator; - - dev_dbg(va_priv->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - snd_soc_update_bits(codec, dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, 0x03, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, 0x03, 0x01); -} - -static void va_macro_mute_update_callback(struct work_struct *work) -{ - struct va_mute_work *va_mute_dwork; - struct snd_soc_codec *codec = NULL; - struct va_macro_priv *va_priv; - struct delayed_work *delayed_work; - u16 tx_vol_ctl_reg, decimator; - - delayed_work = to_delayed_work(work); - va_mute_dwork = container_of(delayed_work, struct va_mute_work, dwork); - va_priv = va_mute_dwork->va_priv; - codec = va_priv->codec; - decimator = va_mute_dwork->decimator; - - tx_vol_ctl_reg = - BOLERO_CDC_VA_TX0_TX_PATH_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - dev_dbg(va_priv->dev, "%s: decimator %u unmute\n", - __func__, decimator); -} - -static int va_macro_put_dec_enum(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - u16 mic_sel_reg; - - val = ucontrol->value.enumerated.item[0]; - if (val > e->items - 1) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - switch (e->reg) { - case BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX0_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX1_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX2_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX3_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX4_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX5_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX6_TX_PATH_CFG0; - break; - case BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0: - mic_sel_reg = BOLERO_CDC_VA_TX7_TX_PATH_CFG0; - break; - default: - dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n", - __func__, e->reg); - return -EINVAL; - } - /* DMIC selected */ - if (val != 0) - snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, 1 << 7); - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int va_macro_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (test_bit(dec_id, &va_priv->active_ch_mask[dai_id])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int va_macro_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 dec_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (enable) { - set_bit(dec_id, &va_priv->active_ch_mask[dai_id]); - va_priv->active_ch_cnt[dai_id]++; - } else { - clear_bit(dec_id, &va_priv->active_ch_mask[dai_id]); - va_priv->active_ch_cnt[dai_id]--; - } - - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} - -static int va_macro_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u8 dmic_clk_en = 0x01; - u16 dmic_clk_reg; - s32 *dmic_clk_cnt; - unsigned int dmic; - int ret; - char *wname; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - wname = strpbrk(w->name, "01234567"); - if (!wname) { - dev_err(va_dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(va_dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(va_priv->dmic_0_1_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL; - break; - case 2: - case 3: - dmic_clk_cnt = &(va_priv->dmic_2_3_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL; - break; - case 4: - case 5: - dmic_clk_cnt = &(va_priv->dmic_4_5_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL; - break; - case 6: - case 7: - dmic_clk_cnt = &(va_priv->dmic_6_7_clk_cnt); - dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL; - break; - default: - dev_err(va_dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - } - dev_dbg(va_dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - (*dmic_clk_cnt)++; - if (*dmic_clk_cnt == 1) { - snd_soc_update_bits(codec, - BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, - 0x80, 0x00); - snd_soc_update_bits(codec, dmic_clk_reg, - VA_MACRO_TX_DMIC_CLK_DIV_MASK, - va_priv->dmic_clk_div << - VA_MACRO_TX_DMIC_CLK_DIV_SHFT); - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, dmic_clk_en); - } - break; - case SND_SOC_DAPM_POST_PMD: - (*dmic_clk_cnt)--; - if (*dmic_clk_cnt == 0) { - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, 0); - } - break; - } - - return 0; -} - -static int va_macro_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - unsigned int decimator; - u16 tx_vol_ctl_reg, dec_cfg_reg, hpf_gate_reg; - u16 tx_gain_ctl_reg; - u8 hpf_cut_off_freq; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - decimator = w->shift; - - dev_dbg(va_dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = BOLERO_CDC_VA_TX0_TX_PATH_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - hpf_gate_reg = BOLERO_CDC_VA_TX0_TX_PATH_SEC2 + - VA_MACRO_TX_PATH_OFFSET * decimator; - dec_cfg_reg = BOLERO_CDC_VA_TX0_TX_PATH_CFG0 + - VA_MACRO_TX_PATH_OFFSET * decimator; - tx_gain_ctl_reg = BOLERO_CDC_VA_TX0_TX_VOL_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - /* Enable TX CLK */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x20); - snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x00); - - hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - va_priv->va_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per HW spec - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x00); - } - /* schedule work queue to Remove Mute */ - schedule_delayed_work(&va_priv->va_mute_dwork[decimator].dwork, - msecs_to_jiffies(va_tx_unmute_delay)); - if (va_priv->va_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) - schedule_delayed_work( - &va_priv->va_hpf_work[decimator].dwork, - msecs_to_jiffies(300)); - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, tx_gain_ctl_reg)); - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - va_priv->va_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &va_priv->va_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required - * as per HW spec - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x00); - } - } - cancel_delayed_work_sync( - &va_priv->va_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - /* Disable TX CLK */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x00); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - break; - } - return 0; -} - -static int va_macro_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - int ret = 0; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - if (!va_priv->micb_supply) { - dev_err(va_dev, - "%s:regulator not provided in dtsi\n", __func__); - return -EINVAL; - } - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (va_priv->micb_users++ > 0) - return 0; - ret = regulator_set_voltage(va_priv->micb_supply, - va_priv->micb_voltage, - va_priv->micb_voltage); - if (ret) { - dev_err(va_dev, "%s: Setting voltage failed, err = %d\n", - __func__, ret); - return ret; - } - ret = regulator_set_load(va_priv->micb_supply, - va_priv->micb_current); - if (ret) { - dev_err(va_dev, "%s: Setting current failed, err = %d\n", - __func__, ret); - return ret; - } - ret = regulator_enable(va_priv->micb_supply); - if (ret) { - dev_err(va_dev, "%s: regulator enable failed, err = %d\n", - __func__, ret); - return ret; - } - break; - case SND_SOC_DAPM_POST_PMD: - if (--va_priv->micb_users > 0) - return 0; - if (va_priv->micb_users < 0) { - va_priv->micb_users = 0; - dev_dbg(va_dev, "%s: regulator already disabled\n", - __func__); - return 0; - } - ret = regulator_disable(va_priv->micb_supply); - if (ret) { - dev_err(va_dev, "%s: regulator disable failed, err = %d\n", - __func__, ret); - return ret; - } - regulator_set_voltage(va_priv->micb_supply, 0, - va_priv->micb_voltage); - regulator_set_load(va_priv->micb_supply, 0); - break; - } - return 0; -} - -static int va_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - int tx_fs_rate = -EINVAL; - struct snd_soc_codec *codec = dai->codec; - u32 decimator, sample_rate; - u16 tx_fs_reg = 0; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - dev_dbg(va_dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - sample_rate = params_rate(params); - switch (sample_rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - case 384000: - tx_fs_rate = 7; - break; - default: - dev_err(va_dev, "%s: Invalid TX sample rate: %d\n", - __func__, params_rate(params)); - return -EINVAL; - } - for_each_set_bit(decimator, &va_priv->active_ch_mask[dai->id], - VA_MACRO_DEC_MAX) { - if (decimator >= 0) { - tx_fs_reg = BOLERO_CDC_VA_TX0_TX_PATH_CTL + - VA_MACRO_TX_PATH_OFFSET * decimator; - dev_dbg(va_dev, "%s: set DEC%u rate to %u\n", - __func__, decimator, sample_rate); - snd_soc_update_bits(codec, tx_fs_reg, 0x0F, - tx_fs_rate); - } else { - dev_err(va_dev, - "%s: ERROR: Invalid decimator: %d\n", - __func__, decimator); - return -EINVAL; - } - } - return 0; -} - -static int va_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case VA_MACRO_AIF1_CAP: - case VA_MACRO_AIF2_CAP: - *tx_slot = va_priv->active_ch_mask[dai->id]; - *tx_num = va_priv->active_ch_cnt[dai->id]; - break; - default: - dev_err(va_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static struct snd_soc_dai_ops va_macro_dai_ops = { - .hw_params = va_macro_hw_params, - .get_channel_map = va_macro_get_channel_map, -}; - -static struct snd_soc_dai_driver va_macro_dai[] = { - { - .name = "va_macro_tx1", - .id = VA_MACRO_AIF1_CAP, - .capture = { - .stream_name = "VA_AIF1 Capture", - .rates = VA_MACRO_RATES, - .formats = VA_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &va_macro_dai_ops, - }, - { - .name = "va_macro_tx2", - .id = VA_MACRO_AIF2_CAP, - .capture = { - .stream_name = "VA_AIF2 Capture", - .rates = VA_MACRO_RATES, - .formats = VA_MACRO_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &va_macro_dai_ops, - }, -}; - -#define STRING(name) #name -#define VA_MACRO_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define VA_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define VA_MACRO_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -static const char * const adc_mux_text[] = { - "MSM_DMIC", "SWR_MIC" -}; - -VA_MACRO_DAPM_ENUM(va_dec0, BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec1, BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec2, BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec3, BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec4, BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec5, BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec6, BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG1, - 0, adc_mux_text); -VA_MACRO_DAPM_ENUM(va_dec7, BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG1, - 0, adc_mux_text); - -static const char * const dmic_mux_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", - "DMIC4", "DMIC5", "DMIC6", "DMIC7" -}; - -VA_MACRO_DAPM_ENUM_EXT(va_dmic0, BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic1, BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic2, BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic3, BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic4, BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic5, BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic6, BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_dmic7, BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0, - 4, dmic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -static const char * const smic_mux_text[] = { - "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", - "SWR_DMIC0", "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", - "SWR_DMIC4", "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7" -}; - -VA_MACRO_DAPM_ENUM_EXT(va_smic0, BOLERO_CDC_VA_INP_MUX_ADC_MUX0_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic1, BOLERO_CDC_VA_INP_MUX_ADC_MUX1_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic2, BOLERO_CDC_VA_INP_MUX_ADC_MUX2_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic3, BOLERO_CDC_VA_INP_MUX_ADC_MUX3_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic4, BOLERO_CDC_VA_INP_MUX_ADC_MUX4_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic5, BOLERO_CDC_VA_INP_MUX_ADC_MUX5_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic6, BOLERO_CDC_VA_INP_MUX_ADC_MUX6_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -VA_MACRO_DAPM_ENUM_EXT(va_smic7, BOLERO_CDC_VA_INP_MUX_ADC_MUX7_CFG0, - 0, smic_mux_text, snd_soc_dapm_get_enum_double, - va_macro_put_dec_enum); - -static const struct snd_kcontrol_new va_aif1_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, VA_MACRO_DEC4, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, VA_MACRO_DEC5, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, VA_MACRO_DEC6, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, VA_MACRO_DEC7, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_kcontrol_new va_aif2_cap_mixer[] = { - SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, VA_MACRO_DEC0, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, VA_MACRO_DEC1, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, VA_MACRO_DEC2, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, VA_MACRO_DEC3, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, VA_MACRO_DEC4, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, VA_MACRO_DEC5, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, VA_MACRO_DEC6, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), - SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, VA_MACRO_DEC7, 1, 0, - va_macro_tx_mixer_get, va_macro_tx_mixer_put), -}; - -static const struct snd_soc_dapm_widget va_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_OUT("VA_AIF1 CAP", "VA_AIF1 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF1_CAP, 0), - - SND_SOC_DAPM_AIF_OUT("VA_AIF2 CAP", "VA_AIF2 Capture", 0, - SND_SOC_NOPM, VA_MACRO_AIF2_CAP, 0), - - SND_SOC_DAPM_MIXER("VA_AIF1_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF1_CAP, 0, - va_aif1_cap_mixer, ARRAY_SIZE(va_aif1_cap_mixer)), - - SND_SOC_DAPM_MIXER("VA_AIF2_CAP Mixer", SND_SOC_NOPM, - VA_MACRO_AIF2_CAP, 0, - va_aif2_cap_mixer, ARRAY_SIZE(va_aif2_cap_mixer)), - - - VA_MACRO_DAPM_MUX("VA DMIC MUX0", 0, va_dmic0), - VA_MACRO_DAPM_MUX("VA DMIC MUX1", 0, va_dmic1), - VA_MACRO_DAPM_MUX("VA DMIC MUX2", 0, va_dmic2), - VA_MACRO_DAPM_MUX("VA DMIC MUX3", 0, va_dmic3), - VA_MACRO_DAPM_MUX("VA DMIC MUX4", 0, va_dmic4), - VA_MACRO_DAPM_MUX("VA DMIC MUX5", 0, va_dmic5), - VA_MACRO_DAPM_MUX("VA DMIC MUX6", 0, va_dmic6), - VA_MACRO_DAPM_MUX("VA DMIC MUX7", 0, va_dmic7), - - VA_MACRO_DAPM_MUX("VA SMIC MUX0", 0, va_smic0), - VA_MACRO_DAPM_MUX("VA SMIC MUX1", 0, va_smic1), - VA_MACRO_DAPM_MUX("VA SMIC MUX2", 0, va_smic2), - VA_MACRO_DAPM_MUX("VA SMIC MUX3", 0, va_smic3), - VA_MACRO_DAPM_MUX("VA SMIC MUX4", 0, va_smic4), - VA_MACRO_DAPM_MUX("VA SMIC MUX5", 0, va_smic5), - VA_MACRO_DAPM_MUX("VA SMIC MUX6", 0, va_smic6), - VA_MACRO_DAPM_MUX("VA SMIC MUX7", 0, va_smic7), - - SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0, - va_macro_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC0", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC1", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC2", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC3", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC4", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC5", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC6", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("VA DMIC7", NULL, SND_SOC_NOPM, 0, 0, - va_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("VA SWR_ADC0"), - SND_SOC_DAPM_INPUT("VA SWR_ADC1"), - SND_SOC_DAPM_INPUT("VA SWR_ADC2"), - SND_SOC_DAPM_INPUT("VA SWR_ADC3"), - SND_SOC_DAPM_INPUT("VA SWR_MIC0"), - SND_SOC_DAPM_INPUT("VA SWR_MIC1"), - SND_SOC_DAPM_INPUT("VA SWR_MIC2"), - SND_SOC_DAPM_INPUT("VA SWR_MIC3"), - SND_SOC_DAPM_INPUT("VA SWR_MIC4"), - SND_SOC_DAPM_INPUT("VA SWR_MIC5"), - SND_SOC_DAPM_INPUT("VA SWR_MIC6"), - SND_SOC_DAPM_INPUT("VA SWR_MIC7"), - - SND_SOC_DAPM_MUX_E("VA DEC0 MUX", SND_SOC_NOPM, VA_MACRO_DEC0, 0, - &va_dec0_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC1 MUX", SND_SOC_NOPM, VA_MACRO_DEC1, 0, - &va_dec1_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC2 MUX", SND_SOC_NOPM, VA_MACRO_DEC2, 0, - &va_dec2_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC3 MUX", SND_SOC_NOPM, VA_MACRO_DEC3, 0, - &va_dec3_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC4 MUX", SND_SOC_NOPM, VA_MACRO_DEC4, 0, - &va_dec4_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC5 MUX", SND_SOC_NOPM, VA_MACRO_DEC5, 0, - &va_dec5_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC6 MUX", SND_SOC_NOPM, VA_MACRO_DEC6, 0, - &va_dec6_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("VA DEC7 MUX", SND_SOC_NOPM, VA_MACRO_DEC7, 0, - &va_dec7_mux, va_macro_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("VA_MCLK", -1, SND_SOC_NOPM, 0, 0, - va_macro_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_widget va_macro_wod_dapm_widgets[] = { - SND_SOC_DAPM_SUPPLY_S("VA_MCLK", -1, SND_SOC_NOPM, 0, 0, - va_macro_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route va_audio_map[] = { - {"VA_AIF1 CAP", NULL, "VA_MCLK"}, - {"VA_AIF2 CAP", NULL, "VA_MCLK"}, - - {"VA_AIF1 CAP", NULL, "VA_AIF1_CAP Mixer"}, - {"VA_AIF2 CAP", NULL, "VA_AIF2_CAP Mixer"}, - - {"VA_AIF1_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC4", "VA DEC4 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC5", "VA DEC5 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC6", "VA DEC6 MUX"}, - {"VA_AIF1_CAP Mixer", "DEC7", "VA DEC7 MUX"}, - - {"VA_AIF2_CAP Mixer", "DEC0", "VA DEC0 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC1", "VA DEC1 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC2", "VA DEC2 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC3", "VA DEC3 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC4", "VA DEC4 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC5", "VA DEC5 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC6", "VA DEC6 MUX"}, - {"VA_AIF2_CAP Mixer", "DEC7", "VA DEC7 MUX"}, - - {"VA DEC0 MUX", "MSM_DMIC", "VA DMIC MUX0"}, - {"VA DMIC MUX0", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX0", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX0", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX0", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX0", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX0", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX0", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX0", "DMIC7", "VA DMIC7"}, - - {"VA DEC0 MUX", "SWR_MIC", "VA SMIC MUX0"}, - {"VA SMIC MUX0", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX0", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX0", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX0", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX0", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX0", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX0", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX0", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX0", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX0", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX0", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX0", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC1 MUX", "MSM_DMIC", "VA DMIC MUX1"}, - {"VA DMIC MUX1", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX1", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX1", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX1", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX1", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX1", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX1", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX1", "DMIC7", "VA DMIC7"}, - - {"VA DEC1 MUX", "SWR_MIC", "VA SMIC MUX1"}, - {"VA SMIC MUX1", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX1", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX1", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX1", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX1", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX1", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX1", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX1", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX1", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX1", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX1", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX1", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC2 MUX", "MSM_DMIC", "VA DMIC MUX2"}, - {"VA DMIC MUX2", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX2", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX2", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX2", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX2", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX2", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX2", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX2", "DMIC7", "VA DMIC7"}, - - {"VA DEC2 MUX", "SWR_MIC", "VA SMIC MUX2"}, - {"VA SMIC MUX2", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX2", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX2", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX2", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX2", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX2", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX2", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX2", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX2", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX2", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX2", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX2", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC3 MUX", "MSM_DMIC", "VA DMIC MUX3"}, - {"VA DMIC MUX3", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX3", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX3", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX3", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX3", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX3", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX3", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX3", "DMIC7", "VA DMIC7"}, - - {"VA DEC3 MUX", "SWR_MIC", "VA SMIC MUX3"}, - {"VA SMIC MUX3", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX3", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX3", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX3", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX3", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX3", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX3", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX3", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX3", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX3", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX3", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX3", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC4 MUX", "MSM_DMIC", "VA DMIC MUX4"}, - {"VA DMIC MUX4", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX4", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX4", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX4", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX4", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX4", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX4", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX4", "DMIC7", "VA DMIC7"}, - - {"VA DEC4 MUX", "SWR_MIC", "VA SMIC MUX4"}, - {"VA SMIC MUX4", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX4", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX4", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX4", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX4", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX4", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX4", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX4", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX4", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX4", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX4", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX4", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC5 MUX", "MSM_DMIC", "VA DMIC MUX5"}, - {"VA DMIC MUX5", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX5", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX5", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX5", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX5", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX5", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX5", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX5", "DMIC7", "VA DMIC7"}, - - {"VA DEC5 MUX", "SWR_MIC", "VA SMIC MUX5"}, - {"VA SMIC MUX5", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX5", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX5", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX5", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX5", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX5", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX5", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX5", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX5", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX5", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX5", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX5", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC6 MUX", "MSM_DMIC", "VA DMIC MUX6"}, - {"VA DMIC MUX6", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX6", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX6", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX6", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX6", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX6", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX6", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX6", "DMIC7", "VA DMIC7"}, - - {"VA DEC6 MUX", "SWR_MIC", "VA SMIC MUX6"}, - {"VA SMIC MUX6", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX6", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX6", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX6", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX6", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX6", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX6", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX6", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX6", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX6", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX6", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX6", "SWR_DMIC7", "VA SWR_MIC7"}, - - {"VA DEC7 MUX", "MSM_DMIC", "VA DMIC MUX7"}, - {"VA DMIC MUX7", "DMIC0", "VA DMIC0"}, - {"VA DMIC MUX7", "DMIC1", "VA DMIC1"}, - {"VA DMIC MUX7", "DMIC2", "VA DMIC2"}, - {"VA DMIC MUX7", "DMIC3", "VA DMIC3"}, - {"VA DMIC MUX7", "DMIC4", "VA DMIC4"}, - {"VA DMIC MUX7", "DMIC5", "VA DMIC5"}, - {"VA DMIC MUX7", "DMIC6", "VA DMIC6"}, - {"VA DMIC MUX7", "DMIC7", "VA DMIC7"}, - - {"VA DEC7 MUX", "SWR_MIC", "VA SMIC MUX7"}, - {"VA SMIC MUX7", "ADC0", "VA SWR_ADC0"}, - {"VA SMIC MUX7", "ADC1", "VA SWR_ADC1"}, - {"VA SMIC MUX7", "ADC2", "VA SWR_ADC2"}, - {"VA SMIC MUX7", "ADC3", "VA SWR_ADC3"}, - {"VA SMIC MUX7", "SWR_DMIC0", "VA SWR_MIC0"}, - {"VA SMIC MUX7", "SWR_DMIC1", "VA SWR_MIC1"}, - {"VA SMIC MUX7", "SWR_DMIC2", "VA SWR_MIC2"}, - {"VA SMIC MUX7", "SWR_DMIC3", "VA SWR_MIC3"}, - {"VA SMIC MUX7", "SWR_DMIC4", "VA SWR_MIC4"}, - {"VA SMIC MUX7", "SWR_DMIC5", "VA SWR_MIC5"}, - {"VA SMIC MUX7", "SWR_DMIC6", "VA SWR_MIC6"}, - {"VA SMIC MUX7", "SWR_DMIC7", "VA SWR_MIC7"}, -}; - -static const struct snd_kcontrol_new va_macro_snd_controls[] = { - SOC_SINGLE_SX_TLV("VA_DEC0 Volume", - BOLERO_CDC_VA_TX0_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC1 Volume", - BOLERO_CDC_VA_TX1_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC2 Volume", - BOLERO_CDC_VA_TX2_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC3 Volume", - BOLERO_CDC_VA_TX3_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC4 Volume", - BOLERO_CDC_VA_TX4_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC5 Volume", - BOLERO_CDC_VA_TX5_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC6 Volume", - BOLERO_CDC_VA_TX6_TX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("VA_DEC7 Volume", - BOLERO_CDC_VA_TX7_TX_VOL_CTL, - 0, -84, 40, digital_gain), -}; - -static int va_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, - struct va_macro_priv *va_priv) -{ - u32 div_factor; - u32 mclk_rate = VA_MACRO_MCLK_FREQ; - - if (dmic_sample_rate == VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) - goto undefined_rate; - - div_factor = mclk_rate / dmic_sample_rate; - - switch (div_factor) { - case 2: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_2; - break; - case 3: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_3; - break; - case 4: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_4; - break; - case 6: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_6; - break; - case 8: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_8; - break; - case 16: - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_16; - break; - default: - /* Any other DIV factor is invalid */ - goto undefined_rate; - } - - /* Valid dmic DIV factors */ - dev_dbg(va_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - - return dmic_sample_rate; - -undefined_rate: - dev_dbg(va_priv->dev, "%s: Invalid rate %d, for mclk %d\n", - __func__, dmic_sample_rate, mclk_rate); - dmic_sample_rate = VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED; - - return dmic_sample_rate; -} - -static int va_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret, i; - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - va_dev = bolero_get_device_ptr(codec->dev, VA_MACRO); - if (!va_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - va_priv = dev_get_drvdata(va_dev); - if (!va_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - - if (va_priv->va_without_decimation) { - ret = snd_soc_dapm_new_controls(dapm, va_macro_wod_dapm_widgets, - ARRAY_SIZE(va_macro_wod_dapm_widgets)); - if (ret < 0) { - dev_err(va_dev, - "%s: Failed to add without dec controls\n", - __func__); - return ret; - } - va_priv->codec = codec; - return 0; - } - - ret = snd_soc_dapm_new_controls(dapm, va_macro_dapm_widgets, - ARRAY_SIZE(va_macro_dapm_widgets)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add controls\n", __func__); - return ret; - } - - ret = snd_soc_dapm_add_routes(dapm, va_audio_map, - ARRAY_SIZE(va_audio_map)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add routes\n", __func__); - return ret; - } - - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add widgets\n", __func__); - return ret; - } - ret = snd_soc_add_codec_controls(codec, va_macro_snd_controls, - ARRAY_SIZE(va_macro_snd_controls)); - if (ret < 0) { - dev_err(va_dev, "%s: Failed to add snd_ctls\n", __func__); - return ret; - } - - snd_soc_dapm_ignore_suspend(dapm, "VA_AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "VA_AIF2 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC0"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC1"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC2"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC3"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC0"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC1"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC2"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC3"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC4"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC5"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC6"); - snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC7"); - snd_soc_dapm_sync(dapm); - - for (i = 0; i < VA_MACRO_NUM_DECIMATORS; i++) { - va_priv->va_hpf_work[i].va_priv = va_priv; - va_priv->va_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&va_priv->va_hpf_work[i].dwork, - va_macro_tx_hpf_corner_freq_callback); - } - - for (i = 0; i < VA_MACRO_NUM_DECIMATORS; i++) { - va_priv->va_mute_dwork[i].va_priv = va_priv; - va_priv->va_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&va_priv->va_mute_dwork[i].dwork, - va_macro_mute_update_callback); - } - va_priv->codec = codec; - - return 0; -} - -static int va_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *va_dev = NULL; - struct va_macro_priv *va_priv = NULL; - - if (!va_macro_get_data(codec, &va_dev, &va_priv, __func__)) - return -EINVAL; - - va_priv->codec = NULL; - return 0; -} - -static void va_macro_init_ops(struct macro_ops *ops, - char __iomem *va_io_base, - bool va_without_decimation) -{ - memset(ops, 0, sizeof(struct macro_ops)); - if (!va_without_decimation) { - ops->dai_ptr = va_macro_dai; - ops->num_dais = ARRAY_SIZE(va_macro_dai); - } else { - ops->dai_ptr = NULL; - ops->num_dais = 0; - } - ops->init = va_macro_init; - ops->exit = va_macro_deinit; - ops->io_base = va_io_base; - ops->mclk_fn = va_macro_mclk_ctrl; - ops->event_handler = va_macro_event_handler; -} - -static int va_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops; - struct va_macro_priv *va_priv; - u32 va_base_addr, sample_rate = 0; - char __iomem *va_io_base; - struct clk *va_core_clk; - bool va_without_decimation = false; - const char *micb_supply_str = "va-vdd-micb-supply"; - const char *micb_supply_str1 = "va-vdd-micb"; - const char *micb_voltage_str = "qcom,va-vdd-micb-voltage"; - const char *micb_current_str = "qcom,va-vdd-micb-current"; - int ret = 0; - const char *dmic_sample_rate = "qcom,va-dmic-sample-rate"; - - va_priv = devm_kzalloc(&pdev->dev, sizeof(struct va_macro_priv), - GFP_KERNEL); - if (!va_priv) - return -ENOMEM; - - va_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &va_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - va_without_decimation = of_property_read_bool(pdev->dev.parent->of_node, - "qcom,va-without-decimation"); - - va_priv->va_without_decimation = va_without_decimation; - ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate, - &sample_rate); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %d entry in dt\n", - __func__, sample_rate); - va_priv->dmic_clk_div = VA_MACRO_CLK_DIV_2; - } else { - if (va_macro_validate_dmic_sample_rate( - sample_rate, va_priv) == VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED) - return -EINVAL; - } - - va_io_base = devm_ioremap(&pdev->dev, va_base_addr, - VA_MAX_OFFSET); - if (!va_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -EINVAL; - } - va_priv->va_io_base = va_io_base; - /* Register MCLK for va macro */ - va_core_clk = devm_clk_get(&pdev->dev, "va_core_clk"); - if (IS_ERR(va_core_clk)) { - ret = PTR_ERR(va_core_clk); - dev_err(&pdev->dev, "%s: clk get %s failed\n", - __func__, "va_core_clk"); - return ret; - } - va_priv->va_core_clk = va_core_clk; - - if (of_parse_phandle(pdev->dev.of_node, micb_supply_str, 0)) { - va_priv->micb_supply = devm_regulator_get(&pdev->dev, - micb_supply_str1); - if (IS_ERR(va_priv->micb_supply)) { - ret = PTR_ERR(va_priv->micb_supply); - dev_err(&pdev->dev, - "%s:Failed to get micbias supply for VA Mic %d\n", - __func__, ret); - return ret; - } - ret = of_property_read_u32(pdev->dev.of_node, - micb_voltage_str, - &va_priv->micb_voltage); - if (ret) { - dev_err(&pdev->dev, - "%s:Looking up %s property in node %s failed\n", - __func__, micb_voltage_str, - pdev->dev.of_node->full_name); - return ret; - } - ret = of_property_read_u32(pdev->dev.of_node, - micb_current_str, - &va_priv->micb_current); - if (ret) { - dev_err(&pdev->dev, - "%s:Looking up %s property in node %s failed\n", - __func__, micb_current_str, - pdev->dev.of_node->full_name); - return ret; - } - } - - mutex_init(&va_priv->mclk_lock); - dev_set_drvdata(&pdev->dev, va_priv); - va_macro_init_ops(&ops, va_io_base, va_without_decimation); - ret = bolero_register_macro(&pdev->dev, VA_MACRO, &ops); - if (ret < 0) { - dev_err(&pdev->dev, "%s: register macro failed\n", __func__); - goto reg_macro_fail; - } - return ret; - -reg_macro_fail: - mutex_destroy(&va_priv->mclk_lock); - return ret; -} - -static int va_macro_remove(struct platform_device *pdev) -{ - struct va_macro_priv *va_priv; - - va_priv = dev_get_drvdata(&pdev->dev); - - if (!va_priv) - return -EINVAL; - - bolero_unregister_macro(&pdev->dev, VA_MACRO); - mutex_destroy(&va_priv->mclk_lock); - return 0; -} - - -static const struct of_device_id va_macro_dt_match[] = { - {.compatible = "qcom,va-macro"}, - {} -}; - -static struct platform_driver va_macro_driver = { - .driver = { - .name = "va_macro", - .owner = THIS_MODULE, - .of_match_table = va_macro_dt_match, - }, - .probe = va_macro_probe, - .remove = va_macro_remove, -}; - -module_platform_driver(va_macro_driver); - -MODULE_DESCRIPTION("VA macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/bolero/wsa-macro.c b/techpack/audio/asoc/codecs/bolero/wsa-macro.c deleted file mode 100644 index 470ecf4a3af9..000000000000 --- a/techpack/audio/asoc/codecs/bolero/wsa-macro.c +++ /dev/null @@ -1,3100 +0,0 @@ -/* Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "bolero-cdc.h" -#include "bolero-cdc-registers.h" -#include "wsa-macro.h" -#include "../msm-cdc-pinctrl.h" - -#define WSA_MACRO_MAX_OFFSET 0x1000 - -#define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define WSA_MACRO_RX_MIX_RATES (SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -#define WSA_MACRO_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) - -#define WSA_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_48000) -#define WSA_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define NUM_INTERPOLATORS 2 - -#define WSA_MACRO_MUX_INP_SHFT 0x3 -#define WSA_MACRO_MUX_INP_MASK1 0x07 -#define WSA_MACRO_MUX_INP_MASK2 0x38 -#define WSA_MACRO_MUX_CFG_OFFSET 0x8 -#define WSA_MACRO_MUX_CFG1_OFFSET 0x4 -#define WSA_MACRO_RX_COMP_OFFSET 0x40 -#define WSA_MACRO_RX_SOFTCLIP_OFFSET 0x40 -#define WSA_MACRO_RX_PATH_OFFSET 0x80 -#define WSA_MACRO_RX_PATH_CFG3_OFFSET 0x10 -#define WSA_MACRO_RX_PATH_DSMDEM_OFFSET 0x4C -#define WSA_MACRO_FS_RATE_MASK 0x0F - -#define WSA_MACRO_MAX_DMA_CH_PER_PORT 0x2 - -enum { - WSA_MACRO_RX0 = 0, - WSA_MACRO_RX1, - WSA_MACRO_RX_MIX, - WSA_MACRO_RX_MIX0 = WSA_MACRO_RX_MIX, - WSA_MACRO_RX_MIX1, - WSA_MACRO_RX_MAX, -}; - -enum { - WSA_MACRO_TX0 = 0, - WSA_MACRO_TX1, - WSA_MACRO_TX_MAX, -}; - -enum { - WSA_MACRO_EC0_MUX = 0, - WSA_MACRO_EC1_MUX, - WSA_MACRO_EC_MUX_MAX, -}; - -enum { - WSA_MACRO_COMP1, /* SPK_L */ - WSA_MACRO_COMP2, /* SPK_R */ - WSA_MACRO_COMP_MAX -}; - -enum { - WSA_MACRO_SOFTCLIP0, /* RX0 */ - WSA_MACRO_SOFTCLIP1, /* RX1 */ - WSA_MACRO_SOFTCLIP_MAX -}; - -enum { - INTn_1_INP_SEL_ZERO = 0, - INTn_1_INP_SEL_RX0, - INTn_1_INP_SEL_RX1, - INTn_1_INP_SEL_RX2, - INTn_1_INP_SEL_RX3, - INTn_1_INP_SEL_DEC0, - INTn_1_INP_SEL_DEC1, -}; - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_RX2, - INTn_2_INP_SEL_RX3, -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -/* - * Structure used to update codec - * register defaults after reset - */ -struct wsa_macro_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -static struct interp_sample_rate int_prim_sample_rate_val[] = { - {8000, 0x0}, /* 8K */ - {16000, 0x1}, /* 16K */ - {24000, -EINVAL},/* 24K */ - {32000, 0x3}, /* 32K */ - {48000, 0x4}, /* 48K */ - {96000, 0x5}, /* 96K */ - {192000, 0x6}, /* 192K */ - {384000, 0x7}, /* 384K */ - {44100, 0x8}, /* 44.1K */ -}; - -static struct interp_sample_rate int_mix_sample_rate_val[] = { - {48000, 0x4}, /* 48K */ - {96000, 0x5}, /* 96K */ - {192000, 0x6}, /* 192K */ -}; - -#define WSA_MACRO_SWR_STRING_LEN 80 - -static int wsa_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai); -static int wsa_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot); -static int wsa_macro_digital_mute(struct snd_soc_dai *dai, int mute); -/* Hold instance to soundwire platform device */ -struct wsa_macro_swr_ctrl_data { - struct platform_device *wsa_swr_pdev; -}; - -struct wsa_macro_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -struct wsa_macro_bcl_pmic_params { - u8 id; - u8 sid; - u8 ppid; -}; - -enum { - WSA_MACRO_AIF_INVALID = 0, - WSA_MACRO_AIF1_PB, - WSA_MACRO_AIF_MIX1_PB, - WSA_MACRO_AIF_VI, - WSA_MACRO_AIF_ECHO, - WSA_MACRO_MAX_DAIS, -}; - -#define WSA_MACRO_CHILD_DEVICES_MAX 3 - -/* - * @dev: wsa macro device pointer - * @comp_enabled: compander enable mixer value set - * @ec_hq: echo HQ enable mixer value set - * @prim_int_users: Users of interpolator - * @wsa_mclk_users: WSA MCLK users count - * @swr_clk_users: SWR clk users count - * @vi_feed_value: VI sense mask - * @mclk_lock: to lock mclk operations - * @swr_clk_lock: to lock swr master clock operations - * @swr_ctrl_data: SoundWire data structure - * @swr_plat_data: Soundwire platform data - * @wsa_macro_add_child_devices_work: work for adding child devices - * @wsa_swr_gpio_p: used by pinctrl API - * @wsa_core_clk: MCLK for wsa macro - * @wsa_npl_clk: NPL clock for WSA soundwire - * @codec: codec handle - * @rx_0_count: RX0 interpolation users - * @rx_1_count: RX1 interpolation users - * @active_ch_mask: channel mask for all AIF DAIs - * @active_ch_cnt: channel count of all AIF DAIs - * @rx_port_value: mixer ctl value of WSA RX MUXes - * @wsa_io_base: Base address of WSA macro addr space - */ -struct wsa_macro_priv { - struct device *dev; - int comp_enabled[WSA_MACRO_COMP_MAX]; - int ec_hq[WSA_MACRO_RX1 + 1]; - u16 prim_int_users[WSA_MACRO_RX1 + 1]; - u16 wsa_mclk_users; - u16 swr_clk_users; - bool dapm_mclk_enable; - bool reset_swr; - unsigned int vi_feed_value; - struct mutex mclk_lock; - struct mutex swr_clk_lock; - struct mutex clk_lock; - struct wsa_macro_swr_ctrl_data *swr_ctrl_data; - struct wsa_macro_swr_ctrl_platform_data swr_plat_data; - struct work_struct wsa_macro_add_child_devices_work; - struct device_node *wsa_swr_gpio_p; - struct clk *wsa_core_clk; - struct clk *wsa_npl_clk; - struct snd_soc_codec *codec; - int rx_0_count; - int rx_1_count; - unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS]; - unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS]; - int rx_port_value[WSA_MACRO_RX_MAX]; - char __iomem *wsa_io_base; - struct platform_device *pdev_child_devices - [WSA_MACRO_CHILD_DEVICES_MAX]; - int child_count; - int ear_spkr_gain; - int spkr_gain_offset; - int spkr_mode; - int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; - int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; - struct wsa_macro_bcl_pmic_params bcl_pmic_params; - int wsa_digital_mute_status[WSA_MACRO_RX_MAX]; -}; - -static int wsa_macro_config_ear_spkr_gain(struct snd_soc_codec *codec, - struct wsa_macro_priv *wsa_priv, - int event, int gain_reg); -static struct snd_soc_dai_driver wsa_macro_dai[]; -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -static const char *const rx_text[] = { - "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "DEC0", "DEC1" -}; - -static const char *const rx_mix_text[] = { - "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1" -}; - -static const char *const rx_mix_ec_text[] = { - "ZERO", "RX_MIX_TX0", "RX_MIX_TX1" -}; - -static const char *const rx_mux_text[] = { - "ZERO", "AIF1_PB", "AIF_MIX1_PB" -}; - -static const char *const rx_sidetone_mix_text[] = { - "ZERO", "SRC0" -}; - -static const char * const wsa_macro_ear_spkr_pa_gain_text[] = { - "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", - "G_4_DB", "G_5_DB", "G_6_DB" -}; - -static const char * const wsa_macro_speaker_boost_stage_text[] = { - "NO_MAX_STATE", "MAX_STATE_1", "MAX_STATE_2" -}; - -static const char * const wsa_macro_vbat_bcl_gsm_mode_text[] = { - "OFF", "ON" -}; - -static const struct snd_kcontrol_new wsa_int0_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("WSA RX0 VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new wsa_int1_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("WSA RX1 VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_ear_spkr_pa_gain_enum, - wsa_macro_ear_spkr_pa_gain_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_spkr_boost_stage_enum, - wsa_macro_speaker_boost_stage_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_vbat_bcl_gsm_mode_enum, - wsa_macro_vbat_bcl_gsm_mode_text); - -/* RX INT0 */ -static const struct soc_enum rx0_prim_inp0_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, - 0, 7, rx_text); - -static const struct soc_enum rx0_prim_inp1_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, - 3, 7, rx_text); - -static const struct soc_enum rx0_prim_inp2_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, - 3, 7, rx_text); - -static const struct soc_enum rx0_mix_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, - 0, 5, rx_mix_text); - -static const struct soc_enum rx0_sidetone_mix_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text); - -static const struct snd_kcontrol_new rx0_prim_inp0_mux = - SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum); - -static const struct snd_kcontrol_new rx0_prim_inp1_mux = - SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum); - -static const struct snd_kcontrol_new rx0_prim_inp2_mux = - SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum); - -static const struct snd_kcontrol_new rx0_mix_mux = - SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum); - -static const struct snd_kcontrol_new rx0_sidetone_mix_mux = - SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum); - -/* RX INT1 */ -static const struct soc_enum rx1_prim_inp0_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, - 0, 7, rx_text); - -static const struct soc_enum rx1_prim_inp1_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, - 3, 7, rx_text); - -static const struct soc_enum rx1_prim_inp2_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, - 3, 7, rx_text); - -static const struct soc_enum rx1_mix_chain_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, - 0, 5, rx_mix_text); - -static const struct snd_kcontrol_new rx1_prim_inp0_mux = - SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum); - -static const struct snd_kcontrol_new rx1_prim_inp1_mux = - SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum); - -static const struct snd_kcontrol_new rx1_prim_inp2_mux = - SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum); - -static const struct snd_kcontrol_new rx1_mix_mux = - SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum); - -static const struct soc_enum rx_mix_ec0_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, - 0, 3, rx_mix_ec_text); - -static const struct soc_enum rx_mix_ec1_enum = - SOC_ENUM_SINGLE(BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, - 3, 3, rx_mix_ec_text); - -static const struct snd_kcontrol_new rx_mix_ec0_mux = - SOC_DAPM_ENUM("WSA RX_MIX EC0_Mux", rx_mix_ec0_enum); - -static const struct snd_kcontrol_new rx_mix_ec1_mux = - SOC_DAPM_ENUM("WSA RX_MIX EC1_Mux", rx_mix_ec1_enum); - -static struct snd_soc_dai_ops wsa_macro_dai_ops = { - .hw_params = wsa_macro_hw_params, - .get_channel_map = wsa_macro_get_channel_map, - .digital_mute = wsa_macro_digital_mute, -}; - -static struct snd_soc_dai_driver wsa_macro_dai[] = { - { - .name = "wsa_macro_rx1", - .id = WSA_MACRO_AIF1_PB, - .playback = { - .stream_name = "WSA_AIF1 Playback", - .rates = WSA_MACRO_RX_RATES, - .formats = WSA_MACRO_RX_FORMATS, - .rate_max = 384000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &wsa_macro_dai_ops, - }, - { - .name = "wsa_macro_rx_mix", - .id = WSA_MACRO_AIF_MIX1_PB, - .playback = { - .stream_name = "WSA_AIF_MIX1 Playback", - .rates = WSA_MACRO_RX_MIX_RATES, - .formats = WSA_MACRO_RX_FORMATS, - .rate_max = 192000, - .rate_min = 48000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &wsa_macro_dai_ops, - }, - { - .name = "wsa_macro_vifeedback", - .id = WSA_MACRO_AIF_VI, - .capture = { - .stream_name = "WSA_AIF_VI Capture", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, - .formats = WSA_MACRO_RX_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &wsa_macro_dai_ops, - }, - { - .name = "wsa_macro_echo", - .id = WSA_MACRO_AIF_ECHO, - .capture = { - .stream_name = "WSA_AIF_ECHO Capture", - .rates = WSA_MACRO_ECHO_RATES, - .formats = WSA_MACRO_ECHO_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &wsa_macro_dai_ops, - }, -}; - -static const struct wsa_macro_reg_mask_val wsa_macro_spkr_default[] = { - {BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x58}, -}; - -static const struct wsa_macro_reg_mask_val wsa_macro_spkr_mode1[] = { - {BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x80, 0x00}, - {BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x80, 0x00}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x01, 0x00}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x44}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x44}, -}; - -static bool wsa_macro_get_data(struct snd_soc_codec *codec, - struct device **wsa_dev, - struct wsa_macro_priv **wsa_priv, - const char *func_name) -{ - *wsa_dev = bolero_get_device_ptr(codec->dev, WSA_MACRO); - if (!(*wsa_dev)) { - dev_err(codec->dev, - "%s: null device for macro!\n", func_name); - return false; - } - *wsa_priv = dev_get_drvdata((*wsa_dev)); - if (!(*wsa_priv) || !(*wsa_priv)->codec) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", func_name); - return false; - } - return true; -} - -/** - * wsa_macro_set_spkr_gain_offset - offset the speaker path - * gain with the given offset value. - * - * @codec: codec instance - * @offset: Indicates speaker path gain offset value. - * - * Returns 0 on success or -EINVAL on error. - */ -int wsa_macro_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return -EINVAL; - } - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->spkr_gain_offset = offset; - return 0; -} -EXPORT_SYMBOL(wsa_macro_set_spkr_gain_offset); - -/** - * wsa_macro_set_spkr_mode - Configures speaker compander and smartboost - * settings based on speaker mode. - * - * @codec: codec instance - * @mode: Indicates speaker configuration mode. - * - * Returns 0 on success or -EINVAL on error. - */ -int wsa_macro_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - int i; - const struct wsa_macro_reg_mask_val *regs; - int size; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return -EINVAL; - } - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (mode) { - case WSA_MACRO_SPKR_MODE_1: - regs = wsa_macro_spkr_mode1; - size = ARRAY_SIZE(wsa_macro_spkr_mode1); - break; - default: - regs = wsa_macro_spkr_default; - size = ARRAY_SIZE(wsa_macro_spkr_default); - break; - } - - wsa_priv->spkr_mode = mode; - for (i = 0; i < size; i++) - snd_soc_update_bits(codec, regs[i].reg, - regs[i].mask, regs[i].val); - return 0; -} -EXPORT_SYMBOL(wsa_macro_set_spkr_mode); - -static int wsa_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai, - u8 int_prim_fs_rate_reg_val, - u32 sample_rate) -{ - u8 int_1_mix1_inp; - u32 j, port; - u16 int_mux_cfg0, int_mux_cfg1; - u16 int_fs_reg; - u8 int_mux_cfg0_val, int_mux_cfg1_val; - u8 inp0_sel, inp1_sel, inp2_sel; - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - for_each_set_bit(port, &wsa_priv->active_ch_mask[dai->id], - WSA_MACRO_RX_MAX) { - int_1_mix1_inp = port; - if ((int_1_mix1_inp < WSA_MACRO_RX0) || - (int_1_mix1_inp > WSA_MACRO_RX_MIX1)) { - dev_err(wsa_dev, - "%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg0 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0; - - /* - * Loop through all interpolator MUX inputs and find out - * to which interpolator input, the cdc_dma rx port - * is connected - */ - for (j = 0; j < NUM_INTERPOLATORS; j++) { - int_mux_cfg1 = int_mux_cfg0 + WSA_MACRO_MUX_CFG1_OFFSET; - - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - inp0_sel = int_mux_cfg0_val & WSA_MACRO_MUX_INP_MASK1; - inp1_sel = (int_mux_cfg0_val >> - WSA_MACRO_MUX_INP_SHFT) & - WSA_MACRO_MUX_INP_MASK1; - inp2_sel = (int_mux_cfg1_val >> - WSA_MACRO_MUX_INP_SHFT) & - WSA_MACRO_MUX_INP_MASK1; - if ((inp0_sel == (int_1_mix1_inp + - INTn_1_INP_SEL_RX0)) || - (inp1_sel == (int_1_mix1_inp + - INTn_1_INP_SEL_RX0)) || - (inp2_sel == int_1_mix1_inp + - INTn_1_INP_SEL_RX0)) { - int_fs_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - WSA_MACRO_RX_PATH_OFFSET * j; - dev_dbg(wsa_dev, - "%s: AIF_PB DAI(%d) connected to INT%u_1\n", - __func__, dai->id, j); - dev_dbg(wsa_dev, - "%s: set INT%u_1 sample rate to %u\n", - __func__, j, sample_rate); - /* sample_rate is in Hz */ - snd_soc_update_bits(codec, int_fs_reg, - WSA_MACRO_FS_RATE_MASK, - int_prim_fs_rate_reg_val); - } - int_mux_cfg0 += WSA_MACRO_MUX_CFG_OFFSET; - } - } - - return 0; -} - -static int wsa_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai, - u8 int_mix_fs_rate_reg_val, - u32 sample_rate) -{ - u8 int_2_inp; - u32 j, port; - u16 int_mux_cfg1, int_fs_reg; - u8 int_mux_cfg1_val; - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - - for_each_set_bit(port, &wsa_priv->active_ch_mask[dai->id], - WSA_MACRO_RX_MAX) { - int_2_inp = port; - if ((int_2_inp < WSA_MACRO_RX0) || - (int_2_inp > WSA_MACRO_RX_MIX1)) { - dev_err(wsa_dev, - "%s: Invalid RX port, Dai ID is %d\n", - __func__, dai->id); - return -EINVAL; - } - - int_mux_cfg1 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1; - for (j = 0; j < NUM_INTERPOLATORS; j++) { - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) & - WSA_MACRO_MUX_INP_MASK1; - if (int_mux_cfg1_val == (int_2_inp + - INTn_2_INP_SEL_RX0)) { - int_fs_reg = - BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL + - WSA_MACRO_RX_PATH_OFFSET * j; - - dev_dbg(wsa_dev, - "%s: AIF_PB DAI(%d) connected to INT%u_2\n", - __func__, dai->id, j); - dev_dbg(wsa_dev, - "%s: set INT%u_2 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, - WSA_MACRO_FS_RATE_MASK, - int_mix_fs_rate_reg_val); - } - int_mux_cfg1 += WSA_MACRO_MUX_CFG_OFFSET; - } - } - return 0; -} - -static int wsa_macro_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - int rate_val = 0; - int i, ret; - - /* set mixing path rate */ - for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) { - if (sample_rate == - int_mix_sample_rate_val[i].sample_rate) { - rate_val = - int_mix_sample_rate_val[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || - (rate_val < 0)) - goto prim_rate; - ret = wsa_macro_set_mix_interpolator_rate(dai, - (u8) rate_val, sample_rate); -prim_rate: - /* set primary path sample rate */ - for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) { - if (sample_rate == - int_prim_sample_rate_val[i].sample_rate) { - rate_val = - int_prim_sample_rate_val[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || - (rate_val < 0)) - return -EINVAL; - ret = wsa_macro_set_prim_interpolator_rate(dai, - (u8) rate_val, sample_rate); - return ret; -} - -static int wsa_macro_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct snd_soc_codec *codec = dai->codec; - int ret; - - dev_dbg(codec->dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = wsa_macro_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - dev_err(codec->dev, - "%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - break; - case SNDRV_PCM_STREAM_CAPTURE: - default: - break; - } - return 0; -} - -static int wsa_macro_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - unsigned int temp = 0, ch_mask = 0, i = 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv = dev_get_drvdata(wsa_dev); - if (!wsa_priv) - return -EINVAL; - - switch (dai->id) { - case WSA_MACRO_AIF_VI: - case WSA_MACRO_AIF_ECHO: - *tx_slot = wsa_priv->active_ch_mask[dai->id]; - *tx_num = wsa_priv->active_ch_cnt[dai->id]; - break; - case WSA_MACRO_AIF1_PB: - case WSA_MACRO_AIF_MIX1_PB: - for_each_set_bit(temp, &wsa_priv->active_ch_mask[dai->id], - WSA_MACRO_RX_MAX) { - ch_mask |= (1 << temp); - if (++i == WSA_MACRO_MAX_DMA_CH_PER_PORT) - break; - } - if (ch_mask & 0x0C) - ch_mask = ch_mask >> 0x2; - *rx_slot = ch_mask; - *rx_num = i; - break; - default: - dev_err(wsa_dev, "%s: Invalid AIF\n", __func__); - break; - } - return 0; -} - -static int wsa_macro_digital_mute(struct snd_soc_dai *dai, int mute) -{ - struct snd_soc_codec *codec = dai->codec; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - uint16_t j = 0, reg = 0, mix_reg = 0, dsm_reg = 0; - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - - if (mute) - return 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (dai->id) { - case WSA_MACRO_AIF1_PB: - case WSA_MACRO_AIF_MIX1_PB: - for (j = 0; j < NUM_INTERPOLATORS; j++) { - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - (j * WSA_MACRO_RX_PATH_OFFSET); - mix_reg = BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL + - (j * WSA_MACRO_RX_PATH_OFFSET); - dsm_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - (j * WSA_MACRO_RX_PATH_OFFSET) + - WSA_MACRO_RX_PATH_DSMDEM_OFFSET; - int_mux_cfg0 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + j * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - if (snd_soc_read(codec, dsm_reg) & 0x01) { - if (int_mux_cfg0_val || (int_mux_cfg1_val & 0x38)) - snd_soc_update_bits(codec, reg, 0x20, 0x20); - if (int_mux_cfg1_val & 0x07) { - snd_soc_update_bits(codec, reg, 0x20, 0x20); - snd_soc_update_bits(codec, mix_reg, 0x20, 0x20); - } - } - } - bolero_wsa_pa_on(wsa_dev); - break; - default: - break; - } - return 0; -} -static int wsa_macro_mclk_enable(struct wsa_macro_priv *wsa_priv, - bool mclk_enable, bool dapm) -{ - struct regmap *regmap = dev_get_regmap(wsa_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(wsa_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(wsa_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, wsa_priv->wsa_mclk_users); - - mutex_lock(&wsa_priv->mclk_lock); - if (mclk_enable) { - if (wsa_priv->wsa_mclk_users == 0) { - ret = bolero_request_clock(wsa_priv->dev, - WSA_MACRO, MCLK_MUX0, true); - if (ret < 0) { - dev_err_ratelimited(wsa_priv->dev, - "%s: wsa request clock enable failed\n", - __func__); - goto exit; - } - regcache_mark_dirty(regmap); - regcache_sync_region(regmap, - WSA_START_OFFSET, - WSA_MAX_OFFSET); - /* 9.6MHz MCLK, set value 0x00 if other frequency */ - regmap_update_bits(regmap, - BOLERO_CDC_WSA_TOP_FREQ_MCLK, 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - } - wsa_priv->wsa_mclk_users++; - } else { - if (wsa_priv->wsa_mclk_users <= 0) { - dev_err(wsa_priv->dev, "%s: clock already disabled\n", - __func__); - wsa_priv->wsa_mclk_users = 0; - goto exit; - } - wsa_priv->wsa_mclk_users--; - if (wsa_priv->wsa_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - bolero_request_clock(wsa_priv->dev, - WSA_MACRO, MCLK_MUX0, false); - } - } -exit: - mutex_unlock(&wsa_priv->mclk_lock); - return ret; -} - -static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(wsa_dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = wsa_macro_mclk_enable(wsa_priv, 1, true); - if (ret) - wsa_priv->dapm_mclk_enable = false; - else - wsa_priv->dapm_mclk_enable = true; - break; - case SND_SOC_DAPM_POST_PMD: - if (wsa_priv->dapm_mclk_enable) - wsa_macro_mclk_enable(wsa_priv, 0, true); - break; - default: - dev_err(wsa_priv->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int wsa_macro_mclk_reset(struct device *dev) -{ - struct wsa_macro_priv *wsa_priv = dev_get_drvdata(dev); - int count = 0; - - mutex_lock(&wsa_priv->clk_lock); - while (__clk_is_enabled(wsa_priv->wsa_core_clk)) { - clk_disable_unprepare(wsa_priv->wsa_npl_clk); - clk_disable_unprepare(wsa_priv->wsa_core_clk); - count++; - } - dev_dbg(wsa_priv->dev, - "%s: clock reset after ssr, count %d\n", __func__, count); - while (count) { - clk_prepare_enable(wsa_priv->wsa_core_clk); - clk_prepare_enable(wsa_priv->wsa_npl_clk); - count--; - } - mutex_unlock(&wsa_priv->clk_lock); - return 0; -} - -static int wsa_macro_mclk_ctrl(struct device *dev, bool enable) -{ - struct wsa_macro_priv *wsa_priv = dev_get_drvdata(dev); - int ret = 0; - - if (!wsa_priv) - return -EINVAL; - - mutex_lock(&wsa_priv->clk_lock); - if (enable) { - ret = clk_prepare_enable(wsa_priv->wsa_core_clk); - if (ret < 0) { - dev_err_ratelimited(dev, "%s:wsa mclk enable failed\n", __func__); - goto exit; - } - ret = clk_prepare_enable(wsa_priv->wsa_npl_clk); - if (ret < 0) { - dev_err(dev, "%s:wsa npl_clk enable failed\n", - __func__); - clk_disable_unprepare(wsa_priv->wsa_core_clk); - goto exit; - } - } else { - clk_disable_unprepare(wsa_priv->wsa_npl_clk); - clk_disable_unprepare(wsa_priv->wsa_core_clk); - } -exit: - mutex_unlock(&wsa_priv->clk_lock); - return ret; -} - -static int wsa_macro_event_handler(struct snd_soc_codec *codec, u16 event, - u32 data) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - if (!(wsa_priv->swr_ctrl_data)) - return -EINVAL; - - switch (event) { - case BOLERO_MACRO_EVT_SSR_DOWN: - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_DOWN, NULL); - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - break; - case BOLERO_MACRO_EVT_SSR_UP: - /* reset swr after ssr/pdr */ - wsa_priv->reset_swr = true; - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - break; - case BOLERO_MACRO_EVT_CLK_RESET: - wsa_macro_mclk_reset(wsa_dev); - break; - } - return 0; -} - -static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - dev_dbg(wsa_dev, "%s: spkr1 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - } - if (test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - dev_dbg(wsa_dev, "%s: spkr2 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x0F, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x20, 0x00); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - /* Disable V&I sensing */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - dev_dbg(wsa_dev, "%s: spkr1 disabled\n", __func__); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - } - if (test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - /* Disable V&I sensing */ - dev_dbg(wsa_dev, "%s: spkr2 disabled\n", __func__); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, - 0x10, 0x00); - } - break; - } - - return 0; -} - -static int wsa_macro_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg; - int offset_val = 0; - int val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - switch (w->reg) { - case BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL: - gain_reg = BOLERO_CDC_WSA_RX0_RX_VOL_MIX_CTL; - break; - case BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL: - gain_reg = BOLERO_CDC_WSA_RX1_RX_VOL_MIX_CTL; - break; - default: - dev_err(codec->dev, "%s: No gain register avail for %s\n", - __func__, w->name); - return 0; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, w->reg, 0x20, 0x00); - break; - } - - return 0; -} - -static void wsa_macro_hd2_control(struct snd_soc_codec *codec, - u16 reg, int event) -{ - u16 hd2_scale_reg; - u16 hd2_enable_reg = 0; - - if (reg == BOLERO_CDC_WSA_RX0_RX_PATH_CTL) { - hd2_scale_reg = BOLERO_CDC_WSA_RX0_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CFG0; - } - if (reg == BOLERO_CDC_WSA_RX1_RX_PATH_CTL) { - hd2_scale_reg = BOLERO_CDC_WSA_RX1_RX_PATH_SEC3; - hd2_enable_reg = BOLERO_CDC_WSA_RX1_RX_PATH_CFG0; - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x10); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x01); - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04); - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00); - } -} - -static int wsa_macro_enable_swr(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ch_cnt; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (!(strnstr(w->name, "RX0", sizeof("WSA_RX0"))) && - !wsa_priv->rx_0_count) - wsa_priv->rx_0_count++; - if (!(strnstr(w->name, "RX1", sizeof("WSA_RX1"))) && - !wsa_priv->rx_1_count) - wsa_priv->rx_1_count++; - ch_cnt = wsa_priv->rx_0_count + wsa_priv->rx_1_count; - - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_UP, NULL); - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - break; - case SND_SOC_DAPM_POST_PMD: - if (!(strnstr(w->name, "RX0", sizeof("WSA_RX0"))) && - wsa_priv->rx_0_count) - wsa_priv->rx_0_count--; - if (!(strnstr(w->name, "RX1", sizeof("WSA_RX1"))) && - wsa_priv->rx_1_count) - wsa_priv->rx_1_count--; - ch_cnt = wsa_priv->rx_0_count + wsa_priv->rx_1_count; - - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - break; - } - dev_dbg(wsa_priv->dev, "%s: current swr ch cnt: %d\n", - __func__, wsa_priv->rx_0_count + wsa_priv->rx_1_count); - - return 0; -} - -static int wsa_macro_config_compander(struct snd_soc_codec *codec, - int comp, int event) -{ - u16 comp_ctl0_reg, rx_path_cfg0_reg; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, wsa_priv->comp_enabled[comp]); - - if (!wsa_priv->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = BOLERO_CDC_WSA_COMPANDER0_CTL0 + - (comp * WSA_MACRO_RX_COMP_OFFSET); - rx_path_cfg0_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CFG0 + - (comp * WSA_MACRO_RX_PATH_OFFSET); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -static void wsa_macro_enable_softclip_clk(struct snd_soc_codec *codec, - struct wsa_macro_priv *wsa_priv, - int path, - bool enable) -{ - u16 softclip_clk_reg = BOLERO_CDC_WSA_SOFTCLIP0_CRC + - (path * WSA_MACRO_RX_SOFTCLIP_OFFSET); - u8 softclip_mux_mask = (1 << path); - u8 softclip_mux_value = (1 << path); - - dev_dbg(codec->dev, "%s: path %d, enable %d\n", - __func__, path, enable); - if (enable) { - if (wsa_priv->softclip_clk_users[path] == 0) { - snd_soc_update_bits(codec, - softclip_clk_reg, 0x01, 0x01); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, - softclip_mux_mask, softclip_mux_value); - } - wsa_priv->softclip_clk_users[path]++; - } else { - wsa_priv->softclip_clk_users[path]--; - if (wsa_priv->softclip_clk_users[path] == 0) { - snd_soc_update_bits(codec, - softclip_clk_reg, 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, - softclip_mux_mask, 0x00); - } - } -} - -static int wsa_macro_config_softclip(struct snd_soc_codec *codec, - int path, int event) -{ - u16 softclip_ctrl_reg = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int softclip_path = 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - if (path == WSA_MACRO_COMP1) - softclip_path = WSA_MACRO_SOFTCLIP0; - else if (path == WSA_MACRO_COMP2) - softclip_path = WSA_MACRO_SOFTCLIP1; - - dev_dbg(codec->dev, "%s: event %d path %d, enabled %d\n", - __func__, event, softclip_path, - wsa_priv->is_softclip_on[softclip_path]); - - if (!wsa_priv->is_softclip_on[softclip_path]) - return 0; - - softclip_ctrl_reg = BOLERO_CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL + - (softclip_path * WSA_MACRO_RX_SOFTCLIP_OFFSET); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Softclip clock and mux */ - wsa_macro_enable_softclip_clk(codec, wsa_priv, softclip_path, - true); - /* Enable Softclip control */ - snd_soc_update_bits(codec, softclip_ctrl_reg, 0x01, 0x01); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, softclip_ctrl_reg, 0x01, 0x00); - wsa_macro_enable_softclip_clk(codec, wsa_priv, softclip_path, - false); - } - - return 0; -} - -static bool wsa_macro_adie_lb(struct snd_soc_codec *codec, int interp_idx) -{ - u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; - u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; - u8 int_n_inp0 = 0, int_n_inp1 = 0, int_n_inp2 = 0; - - int_mux_cfg0 = BOLERO_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8; - int_mux_cfg1 = int_mux_cfg0 + 4; - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - - int_n_inp0 = int_mux_cfg0_val & 0x0F; - if (int_n_inp0 == INTn_1_INP_SEL_DEC0 || - int_n_inp0 == INTn_1_INP_SEL_DEC1) - return true; - - int_n_inp1 = int_mux_cfg0_val >> 4; - if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || - int_n_inp1 == INTn_1_INP_SEL_DEC1) - return true; - - int_n_inp2 = int_mux_cfg1_val >> 4; - if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || - int_n_inp2 == INTn_1_INP_SEL_DEC1) - return true; - - return false; -} - -static int wsa_macro_enable_main_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 reg = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL + - WSA_MACRO_RX_PATH_OFFSET * w->shift; - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (wsa_macro_adie_lb(codec, w->shift)) { - snd_soc_update_bits(codec, reg, 0x20, 0x20); - bolero_wsa_pa_on(wsa_dev); - } - break; - default: - break; - } - return 0; -} - -static int wsa_macro_interp_get_primary_reg(u16 reg, u16 *ind) -{ - u16 prim_int_reg = 0; - - switch (reg) { - case BOLERO_CDC_WSA_RX0_RX_PATH_CTL: - case BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL: - prim_int_reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL; - *ind = 0; - break; - case BOLERO_CDC_WSA_RX1_RX_PATH_CTL: - case BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL: - prim_int_reg = BOLERO_CDC_WSA_RX1_RX_PATH_CTL; - *ind = 1; - break; - } - - return prim_int_reg; -} - -static int wsa_macro_enable_prim_interpolator( - struct snd_soc_codec *codec, - u16 reg, int event) -{ - u16 prim_int_reg; - u16 ind = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - prim_int_reg = wsa_macro_interp_get_primary_reg(reg, &ind); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wsa_priv->prim_int_users[ind]++; - if (wsa_priv->prim_int_users[ind] == 1) { - snd_soc_update_bits(codec, - prim_int_reg + WSA_MACRO_RX_PATH_CFG3_OFFSET, - 0x03, 0x03); - snd_soc_update_bits(codec, prim_int_reg, - 0x10, 0x10); - wsa_macro_hd2_control(codec, prim_int_reg, event); - snd_soc_update_bits(codec, - prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, - 0x1, 0x1); - } - if ((reg != prim_int_reg) && - ((snd_soc_read(codec, prim_int_reg)) & 0x10)) - snd_soc_update_bits(codec, reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - wsa_priv->prim_int_users[ind]--; - if (wsa_priv->prim_int_users[ind] == 0) { - snd_soc_update_bits(codec, prim_int_reg, - 1 << 0x5, 0 << 0x5); - snd_soc_update_bits(codec, - prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET, - 0x1, 0x0); - snd_soc_update_bits(codec, prim_int_reg, - 0x40, 0x40); - snd_soc_update_bits(codec, prim_int_reg, - 0x40, 0x00); - wsa_macro_hd2_control(codec, prim_int_reg, event); - } - break; - } - - dev_dbg(codec->dev, "%s: primary interpolator: INT%d, users: %d\n", - __func__, ind, wsa_priv->prim_int_users[ind]); - return 0; -} - -static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 gain_reg; - u16 reg; - int val; - int offset_val = 0; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (!(strcmp(w->name, "WSA_RX INT0 INTERP"))) { - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL; - gain_reg = BOLERO_CDC_WSA_RX0_RX_VOL_CTL; - } else if (!(strcmp(w->name, "WSA_RX INT1 INTERP"))) { - reg = BOLERO_CDC_WSA_RX1_RX_PATH_CTL; - gain_reg = BOLERO_CDC_WSA_RX1_RX_VOL_CTL; - } else { - dev_err(codec->dev, "%s: Interpolator reg not found\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Reset if needed */ - wsa_macro_enable_prim_interpolator(codec, reg, event); - break; - case SND_SOC_DAPM_POST_PMU: - wsa_macro_config_compander(codec, w->shift, event); - wsa_macro_config_softclip(codec, w->shift, event); - /* apply gain after int clk is enabled */ - if ((wsa_priv->spkr_gain_offset == - WSA_MACRO_GAIN_OFFSET_M1P5_DB) && - (wsa_priv->comp_enabled[WSA_MACRO_COMP1] || - wsa_priv->comp_enabled[WSA_MACRO_COMP2]) && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL || - gain_reg == BOLERO_CDC_WSA_RX1_RX_VOL_CTL)) { - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX0_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX1_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - wsa_macro_config_ear_spkr_gain(codec, wsa_priv, - event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - wsa_macro_config_compander(codec, w->shift, event); - wsa_macro_config_softclip(codec, w->shift, event); - wsa_macro_enable_prim_interpolator(codec, reg, event); - if ((wsa_priv->spkr_gain_offset == - WSA_MACRO_GAIN_OFFSET_M1P5_DB) && - (wsa_priv->comp_enabled[WSA_MACRO_COMP1] || - wsa_priv->comp_enabled[WSA_MACRO_COMP2]) && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL || - gain_reg == BOLERO_CDC_WSA_RX1_RX_VOL_CTL)) { - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX0_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX0_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX1_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX1_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - wsa_macro_config_ear_spkr_gain(codec, wsa_priv, - event, gain_reg); - break; - } - - return 0; -} - -static int wsa_macro_config_ear_spkr_gain(struct snd_soc_codec *codec, - struct wsa_macro_priv *wsa_priv, - int event, int gain_reg) -{ - int comp_gain_offset, val; - - switch (wsa_priv->spkr_mode) { - /* Compander gain in WSA_MACRO_SPKR_MODE1 case is 12 dB */ - case WSA_MACRO_SPKR_MODE_1: - comp_gain_offset = -12; - break; - /* Default case compander gain is 15 dB */ - default: - comp_gain_offset = -15; - break; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* Apply ear spkr gain only if compander is enabled */ - if (wsa_priv->comp_enabled[WSA_MACRO_COMP1] && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL) && - (wsa_priv->ear_spkr_gain != 0)) { - /* For example, val is -8(-12+5-1) for 4dB of gain */ - val = comp_gain_offset + wsa_priv->ear_spkr_gain - 1; - snd_soc_write(codec, gain_reg, val); - - dev_dbg(wsa_priv->dev, "%s: RX0 Volume %d dB\n", - __func__, val); - } - break; - case SND_SOC_DAPM_POST_PMD: - /* - * Reset RX0 volume to 0 dB if compander is enabled and - * ear_spkr_gain is non-zero. - */ - if (wsa_priv->comp_enabled[WSA_MACRO_COMP1] && - (gain_reg == BOLERO_CDC_WSA_RX0_RX_VOL_CTL) && - (wsa_priv->ear_spkr_gain != 0)) { - snd_soc_write(codec, gain_reg, 0x0); - - dev_dbg(wsa_priv->dev, "%s: Reset RX0 Volume to 0 dB\n", - __func__); - } - break; - } - - return 0; -} - -static int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 boost_path_ctl, boost_path_cfg1; - u16 reg, reg_mix; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (!strcmp(w->name, "WSA_RX INT0 CHAIN")) { - boost_path_ctl = BOLERO_CDC_WSA_BOOST0_BOOST_PATH_CTL; - boost_path_cfg1 = BOLERO_CDC_WSA_RX0_RX_PATH_CFG1; - reg = BOLERO_CDC_WSA_RX0_RX_PATH_CTL; - reg_mix = BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL; - } else if (!strcmp(w->name, "WSA_RX INT1 CHAIN")) { - boost_path_ctl = BOLERO_CDC_WSA_BOOST1_BOOST_PATH_CTL; - boost_path_cfg1 = BOLERO_CDC_WSA_RX1_RX_PATH_CFG1; - reg = BOLERO_CDC_WSA_RX1_RX_PATH_CTL; - reg_mix = BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL; - } else { - dev_err(codec->dev, "%s: unknown widget: %s\n", - __func__, w->name); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x01); - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x10); - if ((snd_soc_read(codec, reg_mix)) & 0x10) - snd_soc_update_bits(codec, reg_mix, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, reg, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x00); - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x00); - break; - } - - return 0; -} - - -static int wsa_macro_enable_vbat(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - u16 vbat_path_cfg = 0; - int softclip_path = 0; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - if (!strcmp(w->name, "WSA_RX INT0 VBAT")) { - vbat_path_cfg = BOLERO_CDC_WSA_RX0_RX_PATH_CFG1; - softclip_path = WSA_MACRO_SOFTCLIP0; - } else if (!strcmp(w->name, "WSA_RX INT1 VBAT")) { - vbat_path_cfg = BOLERO_CDC_WSA_RX1_RX_PATH_CFG1; - softclip_path = WSA_MACRO_SOFTCLIP1; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Enable clock for VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL, 0x10, 0x10); - /* Enable VBAT block */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, 0x01, 0x01); - /* Update interpolator with 384K path */ - snd_soc_update_bits(codec, vbat_path_cfg, 0x80, 0x80); - /* Use attenuation mode */ - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x02, 0x00); - /* - * BCL block needs softclip clock and mux config to be enabled - */ - wsa_macro_enable_softclip_clk(codec, wsa_priv, softclip_path, - true); - /* Enable VBAT at channel level */ - snd_soc_update_bits(codec, vbat_path_cfg, 0x02, 0x02); - /* Set the ATTK1 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - /* Set the ATTK2 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - /* Set the ATTK3 gain */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x03); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, vbat_path_cfg, 0x80, 0x00); - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x02, 0x02); - snd_soc_update_bits(codec, vbat_path_cfg, 0x02, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD1, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD2, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD3, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD4, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD5, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD6, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD7, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD8, - 0xFF, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_BCL_GAIN_UPD9, - 0xFF, 0x00); - wsa_macro_enable_softclip_clk(codec, wsa_priv, softclip_path, - false); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, 0x01, 0x00); - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_PATH_CTL, 0x10, 0x00); - break; - default: - dev_err(wsa_dev, "%s: Invalid event %d\n", __func__, event); - break; - } - return 0; -} - -static int wsa_macro_enable_echo(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - u16 val, ec_tx = 0, ec_hq_reg; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(wsa_dev, "%s %d %s\n", __func__, event, w->name); - - val = snd_soc_read(codec, BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0); - if (!(strcmp(w->name, "WSA RX_MIX EC0_MUX"))) - ec_tx = (val & 0x07) - 1; - else - ec_tx = ((val & 0x38) >> 0x3) - 1; - - if (ec_tx < 0 || ec_tx >= (WSA_MACRO_RX1 + 1)) { - dev_err(wsa_dev, "%s: EC mix control not set correctly\n", - __func__); - return -EINVAL; - } - if (wsa_priv->ec_hq[ec_tx]) { - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, - 0x1 << ec_tx, 0x1 << ec_tx); - ec_hq_reg = BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL + - 0x20 * ec_tx; - snd_soc_update_bits(codec, ec_hq_reg, 0x01, 0x01); - ec_hq_reg = BOLERO_CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 + - 0x20 * ec_tx; - /* default set to 48k */ - snd_soc_update_bits(codec, ec_hq_reg, 0x1E, 0x08); - } - - return 0; -} - -static int wsa_macro_get_ec_hq(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int ec_tx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->ec_hq[ec_tx]; - return 0; -} - -static int wsa_macro_set_ec_hq(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int ec_tx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(wsa_dev, "%s: enable current %d, new %d\n", - __func__, wsa_priv->ec_hq[ec_tx], value); - wsa_priv->ec_hq[ec_tx] = value; - - return 0; -} - -static int wsa_macro_get_rx_mute_status(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int wsa_rx_shift = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - wsa_priv->wsa_digital_mute_status[wsa_rx_shift]; - return 0; -} - -static int wsa_macro_set_rx_mute_status(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int value = ucontrol->value.integer.value[0]; - int wsa_rx_shift = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - switch (wsa_rx_shift) { - case 0: - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX0_RX_PATH_CTL, - 0x10, value << 4); - break; - case 1: - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX1_RX_PATH_CTL, - 0x10, value << 4); - break; - case 2: - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL, - 0x10, value << 4); - break; - case 3: - snd_soc_update_bits(codec, BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL, - 0x10, value << 4); - break; - default: - pr_err("%s: invalid argument rx_shift = %d\n", __func__, - wsa_rx_shift); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: WSA Digital Mute RX %d Enable %d\n", - __func__, wsa_rx_shift, value); - wsa_priv->wsa_digital_mute_status[wsa_rx_shift] = value; - return 0; -} - -static int wsa_macro_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->comp_enabled[comp]; - return 0; -} - -static int wsa_macro_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, wsa_priv->comp_enabled[comp], value); - wsa_priv->comp_enabled[comp] = value; - - return 0; -} - -static int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->ear_spkr_gain; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->ear_spkr_gain = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: gain = %d\n", __func__, - wsa_priv->ear_spkr_gain); - - return 0; -} - -static int wsa_macro_spkr_left_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, BOLERO_CDC_WSA_BOOST0_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_spkr_left_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, BOLERO_CDC_WSA_BOOST0_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int wsa_macro_spkr_right_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, BOLERO_CDC_WSA_BOOST1_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_spkr_right_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, BOLERO_CDC_WSA_BOOST1_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int wsa_macro_rx_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - wsa_priv->rx_port_value[widget->shift]; - return 0; -} - -static int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - u32 rx_port_value = ucontrol->value.integer.value[0]; - u32 bit_input = 0; - u32 aif_rst; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - aif_rst = wsa_priv->rx_port_value[widget->shift]; - if (!rx_port_value) { - if (aif_rst == 0) { - dev_err(wsa_dev, "%s: AIF reset already\n", __func__); - return 0; - } - if (aif_rst >= WSA_MACRO_RX_MAX) { - dev_err(wsa_dev, "%s: Invalid AIF reset\n", __func__); - return 0; - } - } - wsa_priv->rx_port_value[widget->shift] = rx_port_value; - - bit_input = widget->shift; - - dev_dbg(wsa_dev, - "%s: mux input: %d, mux output: %d, bit: %d\n", - __func__, rx_port_value, widget->shift, bit_input); - - switch (rx_port_value) { - case 0: - if (wsa_priv->active_ch_cnt[aif_rst]) { - clear_bit(bit_input, - &wsa_priv->active_ch_mask[aif_rst]); - wsa_priv->active_ch_cnt[aif_rst]--; - } - break; - case 1: - case 2: - set_bit(bit_input, - &wsa_priv->active_ch_mask[rx_port_value]); - wsa_priv->active_ch_cnt[rx_port_value]++; - break; - default: - dev_err(wsa_dev, - "%s: Invalid AIF_ID for WSA RX MUX %d\n", - __func__, rx_port_value); - return -EINVAL; - } - - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - return 0; -} - -static int wsa_macro_vbat_bcl_gsm_mode_func_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ucontrol->value.integer.value[0] = - ((snd_soc_read(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG) & 0x04) ? - 1 : 0); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_vbat_bcl_gsm_mode_func_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - /* Set Vbat register configuration for GSM mode bit based on value */ - if (ucontrol->value.integer.value[0]) - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x04, 0x04); - else - snd_soc_update_bits(codec, BOLERO_CDC_WSA_VBAT_BCL_VBAT_CFG, - 0x04, 0x00); - - return 0; -} - -static int wsa_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int path = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - ucontrol->value.integer.value[0] = wsa_priv->is_softclip_on[path]; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - int path = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->is_softclip_on[path] = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: soft clip enable for %d: %d\n", __func__, - path, wsa_priv->is_softclip_on[path]); - - return 0; -} - -static const struct snd_kcontrol_new wsa_macro_snd_controls[] = { - SOC_ENUM_EXT("EAR SPKR PA Gain", wsa_macro_ear_spkr_pa_gain_enum, - wsa_macro_ear_spkr_pa_gain_get, - wsa_macro_ear_spkr_pa_gain_put), - SOC_ENUM_EXT("SPKR Left Boost Max State", - wsa_macro_spkr_boost_stage_enum, - wsa_macro_spkr_left_boost_stage_get, - wsa_macro_spkr_left_boost_stage_put), - SOC_ENUM_EXT("SPKR Right Boost Max State", - wsa_macro_spkr_boost_stage_enum, - wsa_macro_spkr_right_boost_stage_get, - wsa_macro_spkr_right_boost_stage_put), - SOC_ENUM_EXT("GSM mode Enable", wsa_macro_vbat_bcl_gsm_mode_enum, - wsa_macro_vbat_bcl_gsm_mode_func_get, - wsa_macro_vbat_bcl_gsm_mode_func_put), - SOC_SINGLE_EXT("WSA_Softclip0 Enable", SND_SOC_NOPM, - WSA_MACRO_SOFTCLIP0, 1, 0, - wsa_macro_soft_clip_enable_get, - wsa_macro_soft_clip_enable_put), - SOC_SINGLE_EXT("WSA_Softclip1 Enable", SND_SOC_NOPM, - WSA_MACRO_SOFTCLIP1, 1, 0, - wsa_macro_soft_clip_enable_get, - wsa_macro_soft_clip_enable_put), - SOC_SINGLE_SX_TLV("WSA_RX0 Digital Volume", - BOLERO_CDC_WSA_RX0_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("WSA_RX1 Digital Volume", - BOLERO_CDC_WSA_RX1_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_EXT("WSA_RX0 Digital Mute", SND_SOC_NOPM, WSA_MACRO_RX0, 1, - 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_RX1 Digital Mute", SND_SOC_NOPM, WSA_MACRO_RX1, 1, - 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_RX0_MIX Digital Mute", SND_SOC_NOPM, - WSA_MACRO_RX_MIX0, 1, 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_RX1_MIX Digital Mute", SND_SOC_NOPM, - WSA_MACRO_RX_MIX1, 1, 0, wsa_macro_get_rx_mute_status, - wsa_macro_set_rx_mute_status), - SOC_SINGLE_EXT("WSA_COMP1 Switch", SND_SOC_NOPM, WSA_MACRO_COMP1, 1, 0, - wsa_macro_get_compander, wsa_macro_set_compander), - SOC_SINGLE_EXT("WSA_COMP2 Switch", SND_SOC_NOPM, WSA_MACRO_COMP2, 1, 0, - wsa_macro_get_compander, wsa_macro_set_compander), - SOC_SINGLE_EXT("WSA_RX0 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX0, - 1, 0, wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), - SOC_SINGLE_EXT("WSA_RX1 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX1, - 1, 0, wsa_macro_get_ec_hq, wsa_macro_set_ec_hq), -}; - -static const struct soc_enum rx_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_mux_text), rx_mux_text); - -static const struct snd_kcontrol_new rx_mux[WSA_MACRO_RX_MAX] = { - SOC_DAPM_ENUM_EXT("WSA RX0 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), - SOC_DAPM_ENUM_EXT("WSA RX1 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), - SOC_DAPM_ENUM_EXT("WSA RX_MIX0 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), - SOC_DAPM_ENUM_EXT("WSA RX_MIX1 Mux", rx_mux_enum, - wsa_macro_rx_mux_get, wsa_macro_rx_mux_put), -}; - -static int wsa_macro_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 spk_tx_id = mixer->shift; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - if (test_bit(spk_tx_id, &wsa_priv->active_ch_mask[dai_id])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - return 0; -} - -static int wsa_macro_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 spk_tx_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->vi_feed_value = ucontrol->value.integer.value[0]; - - if (enable) { - if (spk_tx_id == WSA_MACRO_TX0 && - !test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - set_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]++; - } - if (spk_tx_id == WSA_MACRO_TX1 && - !test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - set_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]++; - } - } else { - if (spk_tx_id == WSA_MACRO_TX0 && - test_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - clear_bit(WSA_MACRO_TX0, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]--; - } - if (spk_tx_id == WSA_MACRO_TX1 && - test_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI])) { - clear_bit(WSA_MACRO_TX1, - &wsa_priv->active_ch_mask[WSA_MACRO_AIF_VI]); - wsa_priv->active_ch_cnt[WSA_MACRO_AIF_VI]--; - } - } - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); - - return 0; -} - -static const struct snd_kcontrol_new aif_vi_mixer[] = { - SOC_SINGLE_EXT("WSA_SPKR_VI_1", SND_SOC_NOPM, WSA_MACRO_TX0, 1, 0, - wsa_macro_vi_feed_mixer_get, - wsa_macro_vi_feed_mixer_put), - SOC_SINGLE_EXT("WSA_SPKR_VI_2", SND_SOC_NOPM, WSA_MACRO_TX1, 1, 0, - wsa_macro_vi_feed_mixer_get, - wsa_macro_vi_feed_mixer_put), -}; - -static const struct snd_soc_dapm_widget wsa_macro_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("WSA AIF_MIX1 PB", "WSA_AIF_MIX1 Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_OUT_E("WSA AIF_VI", "WSA_AIF_VI Capture", 0, - SND_SOC_NOPM, WSA_MACRO_AIF_VI, 0, - wsa_macro_enable_vi_feedback, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT("WSA AIF_ECHO", "WSA_AIF_ECHO Capture", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_MIXER("WSA_AIF_VI Mixer", SND_SOC_NOPM, WSA_MACRO_AIF_VI, - 0, aif_vi_mixer, ARRAY_SIZE(aif_vi_mixer)), - SND_SOC_DAPM_MUX_E("WSA RX_MIX EC0_MUX", SND_SOC_NOPM, - WSA_MACRO_EC0_MUX, 0, - &rx_mix_ec0_mux, wsa_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA RX_MIX EC1_MUX", SND_SOC_NOPM, - WSA_MACRO_EC1_MUX, 0, - &rx_mix_ec1_mux, wsa_macro_enable_echo, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("WSA RX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX0, 0, - &rx_mux[WSA_MACRO_RX0]), - SND_SOC_DAPM_MUX("WSA RX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX1, 0, - &rx_mux[WSA_MACRO_RX1]), - SND_SOC_DAPM_MUX("WSA RX_MIX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 0, - &rx_mux[WSA_MACRO_RX_MIX0]), - SND_SOC_DAPM_MUX("WSA RX_MIX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 0, - &rx_mux[WSA_MACRO_RX_MIX1]), - - SND_SOC_DAPM_MIXER("WSA RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA RX_MIX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA RX_MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0, - &rx0_prim_inp0_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0, - &rx0_prim_inp1_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0, - &rx0_prim_inp2_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CTL, - 0, 0, &rx0_mix_mux, wsa_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0, - &rx1_prim_inp0_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0, - &rx1_prim_inp1_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0, - &rx1_prim_inp2_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CTL, - 0, 0, &rx1_mix_mux, wsa_macro_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 MIX", SND_SOC_NOPM, - 0, 0, NULL, 0, wsa_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 MIX", SND_SOC_NOPM, - 1, 0, NULL, 0, wsa_macro_enable_main_path, - SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_MIXER("WSA_RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("WSA_RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("WSA_RX0 INT0 SIDETONE MIX", - BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 4, 0, - &rx0_sidetone_mix_mux, wsa_macro_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_INPUT("WSA SRC0_INP"), - - SND_SOC_DAPM_INPUT("WSA_TX DEC0_INP"), - SND_SOC_DAPM_INPUT("WSA_TX DEC1_INP"), - - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 INTERP", SND_SOC_NOPM, - WSA_MACRO_COMP1, 0, NULL, 0, wsa_macro_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 INTERP", SND_SOC_NOPM, - WSA_MACRO_COMP2, 0, NULL, 0, wsa_macro_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, wsa_macro_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, wsa_macro_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("WSA_RX INT0 VBAT", SND_SOC_NOPM, - 0, 0, wsa_int0_vbat_mix_switch, - ARRAY_SIZE(wsa_int0_vbat_mix_switch), - wsa_macro_enable_vbat, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("WSA_RX INT1 VBAT", SND_SOC_NOPM, - 0, 0, wsa_int1_vbat_mix_switch, - ARRAY_SIZE(wsa_int1_vbat_mix_switch), - wsa_macro_enable_vbat, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("VIINPUT_WSA"), - - SND_SOC_DAPM_OUTPUT("WSA_SPK1 OUT"), - SND_SOC_DAPM_OUTPUT("WSA_SPK2 OUT"), - - SND_SOC_DAPM_SUPPLY_S("WSA_MCLK", 0, SND_SOC_NOPM, 0, 0, - wsa_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -static const struct snd_soc_dapm_route wsa_audio_map[] = { - /* VI Feedback */ - {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_1", "VIINPUT_WSA"}, - {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_2", "VIINPUT_WSA"}, - {"WSA AIF_VI", NULL, "WSA_AIF_VI Mixer"}, - {"WSA AIF_VI", NULL, "WSA_MCLK"}, - - {"WSA RX_MIX EC0_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, - {"WSA RX_MIX EC1_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"}, - {"WSA RX_MIX EC0_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, - {"WSA RX_MIX EC1_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"}, - {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC0_MUX"}, - {"WSA AIF_ECHO", NULL, "WSA RX_MIX EC1_MUX"}, - {"WSA AIF_ECHO", NULL, "WSA_MCLK"}, - - {"WSA AIF1 PB", NULL, "WSA_MCLK"}, - {"WSA AIF_MIX1 PB", NULL, "WSA_MCLK"}, - - {"WSA RX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, - {"WSA RX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, - {"WSA RX_MIX0 MUX", "AIF1_PB", "WSA AIF1 PB"}, - {"WSA RX_MIX1 MUX", "AIF1_PB", "WSA AIF1 PB"}, - - {"WSA RX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - {"WSA RX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - {"WSA RX_MIX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - {"WSA RX_MIX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"}, - - {"WSA RX0", NULL, "WSA RX0 MUX"}, - {"WSA RX1", NULL, "WSA RX1 MUX"}, - {"WSA RX_MIX0", NULL, "WSA RX_MIX0 MUX"}, - {"WSA RX_MIX1", NULL, "WSA RX_MIX1 MUX"}, - - {"WSA_RX0 INP0", "RX0", "WSA RX0"}, - {"WSA_RX0 INP0", "RX1", "WSA RX1"}, - {"WSA_RX0 INP0", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 INP0", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX0 INP0", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX0 INP0", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP0"}, - - {"WSA_RX0 INP1", "RX0", "WSA RX0"}, - {"WSA_RX0 INP1", "RX1", "WSA RX1"}, - {"WSA_RX0 INP1", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 INP1", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX0 INP1", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX0 INP1", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP1"}, - - {"WSA_RX0 INP2", "RX0", "WSA RX0"}, - {"WSA_RX0 INP2", "RX1", "WSA RX1"}, - {"WSA_RX0 INP2", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 INP2", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX0 INP2", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX0 INP2", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP2"}, - - {"WSA_RX0 MIX INP", "RX0", "WSA RX0"}, - {"WSA_RX0 MIX INP", "RX1", "WSA RX1"}, - {"WSA_RX0 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX0 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX0 MIX INP"}, - - {"WSA_RX INT0 SEC MIX", NULL, "WSA_RX INT0 MIX"}, - {"WSA_RX INT0 INTERP", NULL, "WSA_RX INT0 SEC MIX"}, - {"WSA_RX0 INT0 SIDETONE MIX", "SRC0", "WSA SRC0_INP"}, - {"WSA_RX INT0 INTERP", NULL, "WSA_RX0 INT0 SIDETONE MIX"}, - {"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 INTERP"}, - - {"WSA_RX INT0 VBAT", "WSA RX0 VBAT Enable", "WSA_RX INT0 INTERP"}, - {"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 VBAT"}, - - {"WSA_SPK1 OUT", NULL, "WSA_RX INT0 CHAIN"}, - {"WSA_SPK1 OUT", NULL, "WSA_MCLK"}, - - {"WSA_RX1 INP0", "RX0", "WSA RX0"}, - {"WSA_RX1 INP0", "RX1", "WSA RX1"}, - {"WSA_RX1 INP0", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 INP0", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX1 INP0", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX1 INP0", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP0"}, - - {"WSA_RX1 INP1", "RX0", "WSA RX0"}, - {"WSA_RX1 INP1", "RX1", "WSA RX1"}, - {"WSA_RX1 INP1", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 INP1", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX1 INP1", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX1 INP1", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP1"}, - - {"WSA_RX1 INP2", "RX0", "WSA RX0"}, - {"WSA_RX1 INP2", "RX1", "WSA RX1"}, - {"WSA_RX1 INP2", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 INP2", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX1 INP2", "DEC0", "WSA_TX DEC0_INP"}, - {"WSA_RX1 INP2", "DEC1", "WSA_TX DEC1_INP"}, - {"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP2"}, - - {"WSA_RX1 MIX INP", "RX0", "WSA RX0"}, - {"WSA_RX1 MIX INP", "RX1", "WSA RX1"}, - {"WSA_RX1 MIX INP", "RX_MIX0", "WSA RX_MIX0"}, - {"WSA_RX1 MIX INP", "RX_MIX1", "WSA RX_MIX1"}, - {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX1 MIX INP"}, - - {"WSA_RX INT1 SEC MIX", NULL, "WSA_RX INT1 MIX"}, - {"WSA_RX INT1 INTERP", NULL, "WSA_RX INT1 SEC MIX"}, - - {"WSA_RX INT1 VBAT", "WSA RX1 VBAT Enable", "WSA_RX INT1 INTERP"}, - {"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 VBAT"}, - - {"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 INTERP"}, - {"WSA_SPK2 OUT", NULL, "WSA_RX INT1 CHAIN"}, - {"WSA_SPK2 OUT", NULL, "WSA_MCLK"}, -}; - -static const struct wsa_macro_reg_mask_val wsa_macro_reg_init[] = { - {BOLERO_CDC_WSA_BOOST0_BOOST_CFG1, 0x3F, 0x12}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CFG2, 0x1C, 0x08}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x1E, 0x18}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CFG1, 0x3F, 0x12}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CFG2, 0x1C, 0x08}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x1E, 0x18}, - {BOLERO_CDC_WSA_BOOST0_BOOST_CTL, 0x70, 0x58}, - {BOLERO_CDC_WSA_BOOST1_BOOST_CTL, 0x70, 0x58}, - {BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 0x08, 0x08}, - {BOLERO_CDC_WSA_RX1_RX_PATH_CFG1, 0x08, 0x08}, - {BOLERO_CDC_WSA_TOP_TOP_CFG1, 0x02, 0x02}, - {BOLERO_CDC_WSA_TOP_TOP_CFG1, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80}, - {BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX0_RX_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX1_RX_PATH_CFG0, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x01, 0x01}, - {BOLERO_CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x01, 0x01}, -}; - -static void wsa_macro_init_bcl_pmic_reg(struct snd_soc_codec *codec) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return; - } - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return; - - switch (wsa_priv->bcl_pmic_params.id) { - case 0: - /* Enable ID0 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1, 0x02, 0x02); - /* Update MC_SID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG1, 0x0F, - wsa_priv->bcl_pmic_params.sid); - /* Update MC_PPID0 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG2, 0xFF, - wsa_priv->bcl_pmic_params.ppid); - break; - case 1: - /* Enable ID1 to listen to respective PMIC group interrupts */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CTL1, 0x01, 0x01); - /* Update MC_SID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG3, 0x0F, - wsa_priv->bcl_pmic_params.sid); - /* Update MC_PPID1 */ - snd_soc_update_bits(codec, - BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_CFG4, 0xFF, - wsa_priv->bcl_pmic_params.ppid); - break; - default: - dev_err(wsa_dev, "%s: PMIC ID is invalid %d\n", - __func__, wsa_priv->bcl_pmic_params.id); - break; - } -} - -static void wsa_macro_init_reg(struct snd_soc_codec *codec) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(wsa_macro_reg_init); i++) - snd_soc_update_bits(codec, - wsa_macro_reg_init[i].reg, - wsa_macro_reg_init[i].mask, - wsa_macro_reg_init[i].val); - - wsa_macro_init_bcl_pmic_reg(codec); -} - -static int wsa_swrm_clock(void *handle, bool enable) -{ - struct wsa_macro_priv *wsa_priv = (struct wsa_macro_priv *) handle; - struct regmap *regmap = dev_get_regmap(wsa_priv->dev->parent, NULL); - int ret = 0; - - if (regmap == NULL) { - dev_err(wsa_priv->dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&wsa_priv->swr_clk_lock); - - dev_dbg(wsa_priv->dev, "%s: swrm clock %s\n", - __func__, (enable ? "enable" : "disable")); - if (enable) { - if (wsa_priv->swr_clk_users == 0) { - ret = wsa_macro_mclk_enable(wsa_priv, 1, true); - if (ret < 0) { - dev_err_ratelimited(wsa_priv->dev, - "%s: wsa request clock enable failed\n", - __func__); - goto exit; - } - if (wsa_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x02); - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - if (wsa_priv->reset_swr) - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x02, 0x00); - wsa_priv->reset_swr = false; - msm_cdc_pinctrl_select_active_state( - wsa_priv->wsa_swr_gpio_p); - } - wsa_priv->swr_clk_users++; - } else { - if (wsa_priv->swr_clk_users <= 0) { - dev_err(wsa_priv->dev, "%s: clock already disabled\n", - __func__); - wsa_priv->swr_clk_users = 0; - goto exit; - } - wsa_priv->swr_clk_users--; - if (wsa_priv->swr_clk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - msm_cdc_pinctrl_select_sleep_state( - wsa_priv->wsa_swr_gpio_p); - wsa_macro_mclk_enable(wsa_priv, 0, true); - } - } - dev_dbg(wsa_priv->dev, "%s: swrm clock users %d\n", - __func__, wsa_priv->swr_clk_users); -exit: - mutex_unlock(&wsa_priv->swr_clk_lock); - return ret; -} - -static int wsa_macro_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret; - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - wsa_dev = bolero_get_device_ptr(codec->dev, WSA_MACRO); - if (!wsa_dev) { - dev_err(codec->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - wsa_priv = dev_get_drvdata(wsa_dev); - if (!wsa_priv) { - dev_err(codec->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - - ret = snd_soc_dapm_new_controls(dapm, wsa_macro_dapm_widgets, - ARRAY_SIZE(wsa_macro_dapm_widgets)); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add controls\n", __func__); - return ret; - } - - ret = snd_soc_dapm_add_routes(dapm, wsa_audio_map, - ARRAY_SIZE(wsa_audio_map)); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add routes\n", __func__); - return ret; - } - - ret = snd_soc_dapm_new_widgets(dapm->card); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add widgets\n", __func__); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, wsa_macro_snd_controls, - ARRAY_SIZE(wsa_macro_snd_controls)); - if (ret < 0) { - dev_err(wsa_dev, "%s: Failed to add snd_ctls\n", __func__); - return ret; - } - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_MIX1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_VI Capture"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_ECHO Capture"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA"); - snd_soc_dapm_ignore_suspend(dapm, "WSA SRC0_INP"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_TX DEC0_INP"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_TX DEC1_INP"); - snd_soc_dapm_sync(dapm); - - wsa_priv->codec = codec; - wsa_priv->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_0_DB; - wsa_macro_init_reg(codec); - - return 0; -} - -static int wsa_macro_deinit(struct snd_soc_codec *codec) -{ - struct device *wsa_dev = NULL; - struct wsa_macro_priv *wsa_priv = NULL; - - if (!wsa_macro_get_data(codec, &wsa_dev, &wsa_priv, __func__)) - return -EINVAL; - - wsa_priv->codec = NULL; - - return 0; -} - -static void wsa_macro_add_child_devices(struct work_struct *work) -{ - struct wsa_macro_priv *wsa_priv; - struct platform_device *pdev; - struct device_node *node; - struct wsa_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp; - int ret; - u16 count = 0, ctrl_num = 0; - struct wsa_macro_swr_ctrl_platform_data *platdata; - char plat_dev_name[WSA_MACRO_SWR_STRING_LEN]; - - wsa_priv = container_of(work, struct wsa_macro_priv, - wsa_macro_add_child_devices_work); - if (!wsa_priv) { - pr_err("%s: Memory for wsa_priv does not exist\n", - __func__); - return; - } - if (!wsa_priv->dev || !wsa_priv->dev->of_node) { - dev_err(wsa_priv->dev, - "%s: DT node for wsa_priv does not exist\n", __func__); - return; - } - - platdata = &wsa_priv->swr_plat_data; - wsa_priv->child_count = 0; - - for_each_available_child_of_node(wsa_priv->dev->of_node, node) { - if (strnstr(node->name, "wsa_swr_master", - strlen("wsa_swr_master")) != NULL) - strlcpy(plat_dev_name, "wsa_swr_ctrl", - (WSA_MACRO_SWR_STRING_LEN - 1)); - else if (strnstr(node->name, "msm_cdc_pinctrl", - strlen("msm_cdc_pinctrl")) != NULL) - strlcpy(plat_dev_name, node->name, - (WSA_MACRO_SWR_STRING_LEN - 1)); - else - continue; - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(wsa_priv->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = wsa_priv->dev; - pdev->dev.of_node = node; - - if (strnstr(node->name, "wsa_swr_master", - strlen("wsa_swr_master")) != NULL) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (!strcmp(node->name, "wsa_swr_master")) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct wsa_macro_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - dev_err(&pdev->dev, "out of memory\n"); - ret = -ENOMEM; - goto err; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].wsa_swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - wsa_priv->swr_ctrl_data = swr_ctrl_data; - } - if (wsa_priv->child_count < WSA_MACRO_CHILD_DEVICES_MAX) - wsa_priv->pdev_child_devices[ - wsa_priv->child_count++] = pdev; - else - goto err; - } - - return; -fail_pdev_add: - for (count = 0; count < wsa_priv->child_count; count++) - platform_device_put(wsa_priv->pdev_child_devices[count]); -err: - return; -} - -static void wsa_macro_init_ops(struct macro_ops *ops, - char __iomem *wsa_io_base) -{ - memset(ops, 0, sizeof(struct macro_ops)); - ops->init = wsa_macro_init; - ops->exit = wsa_macro_deinit; - ops->io_base = wsa_io_base; - ops->dai_ptr = wsa_macro_dai; - ops->num_dais = ARRAY_SIZE(wsa_macro_dai); - ops->mclk_fn = wsa_macro_mclk_ctrl; - ops->event_handler = wsa_macro_event_handler; -} - -static int wsa_macro_probe(struct platform_device *pdev) -{ - struct macro_ops ops; - struct wsa_macro_priv *wsa_priv; - u32 wsa_base_addr; - char __iomem *wsa_io_base; - int ret = 0; - struct clk *wsa_core_clk, *wsa_npl_clk; - u8 bcl_pmic_params[3]; - - wsa_priv = devm_kzalloc(&pdev->dev, sizeof(struct wsa_macro_priv), - GFP_KERNEL); - if (!wsa_priv) - return -ENOMEM; - - wsa_priv->dev = &pdev->dev; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &wsa_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - wsa_priv->wsa_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-swr-gpios", 0); - if (!wsa_priv->wsa_swr_gpio_p) { - dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n", - __func__); - return -EINVAL; - } - wsa_io_base = devm_ioremap(&pdev->dev, - wsa_base_addr, WSA_MACRO_MAX_OFFSET); - if (!wsa_io_base) { - dev_err(&pdev->dev, "%s: ioremap failed\n", __func__); - return -EINVAL; - } - wsa_priv->wsa_io_base = wsa_io_base; - wsa_priv->reset_swr = true; - INIT_WORK(&wsa_priv->wsa_macro_add_child_devices_work, - wsa_macro_add_child_devices); - wsa_priv->swr_plat_data.handle = (void *) wsa_priv; - wsa_priv->swr_plat_data.read = NULL; - wsa_priv->swr_plat_data.write = NULL; - wsa_priv->swr_plat_data.bulk_write = NULL; - wsa_priv->swr_plat_data.clk = wsa_swrm_clock; - wsa_priv->swr_plat_data.handle_irq = NULL; - - /* Register MCLK for wsa macro */ - wsa_core_clk = devm_clk_get(&pdev->dev, "wsa_core_clk"); - if (IS_ERR(wsa_core_clk)) { - ret = PTR_ERR(wsa_core_clk); - dev_err(&pdev->dev, "%s: clk get %s failed\n", - __func__, "wsa_core_clk"); - return ret; - } - wsa_priv->wsa_core_clk = wsa_core_clk; - /* Register npl clk for soundwire */ - wsa_npl_clk = devm_clk_get(&pdev->dev, "wsa_npl_clk"); - if (IS_ERR(wsa_npl_clk)) { - ret = PTR_ERR(wsa_npl_clk); - dev_err(&pdev->dev, "%s: clk get %s failed\n", - __func__, "wsa_npl_clk"); - return ret; - } - wsa_priv->wsa_npl_clk = wsa_npl_clk; - - ret = of_property_read_u8_array(pdev->dev.of_node, - "qcom,wsa-bcl-pmic-params", bcl_pmic_params, - sizeof(bcl_pmic_params)); - if (ret) { - dev_dbg(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "qcom,wsa-bcl-pmic-params"); - } else { - wsa_priv->bcl_pmic_params.id = bcl_pmic_params[0]; - wsa_priv->bcl_pmic_params.sid = bcl_pmic_params[1]; - wsa_priv->bcl_pmic_params.ppid = bcl_pmic_params[2]; - } - - dev_set_drvdata(&pdev->dev, wsa_priv); - mutex_init(&wsa_priv->mclk_lock); - mutex_init(&wsa_priv->swr_clk_lock); - mutex_init(&wsa_priv->clk_lock); - wsa_macro_init_ops(&ops, wsa_io_base); - ret = bolero_register_macro(&pdev->dev, WSA_MACRO, &ops); - if (ret < 0) { - dev_err(&pdev->dev, "%s: register macro failed\n", __func__); - goto reg_macro_fail; - } - schedule_work(&wsa_priv->wsa_macro_add_child_devices_work); - return ret; -reg_macro_fail: - mutex_destroy(&wsa_priv->mclk_lock); - mutex_destroy(&wsa_priv->swr_clk_lock); - mutex_destroy(&wsa_priv->clk_lock); - return ret; -} - -static int wsa_macro_remove(struct platform_device *pdev) -{ - struct wsa_macro_priv *wsa_priv; - u16 count = 0; - - wsa_priv = dev_get_drvdata(&pdev->dev); - - if (!wsa_priv) - return -EINVAL; - - for (count = 0; count < wsa_priv->child_count && - count < WSA_MACRO_CHILD_DEVICES_MAX; count++) - platform_device_unregister(wsa_priv->pdev_child_devices[count]); - - bolero_unregister_macro(&pdev->dev, WSA_MACRO); - mutex_destroy(&wsa_priv->mclk_lock); - mutex_destroy(&wsa_priv->swr_clk_lock); - mutex_destroy(&wsa_priv->clk_lock); - return 0; -} - -static const struct of_device_id wsa_macro_dt_match[] = { - {.compatible = "qcom,wsa-macro"}, - {} -}; - -static struct platform_driver wsa_macro_driver = { - .driver = { - .name = "wsa_macro", - .owner = THIS_MODULE, - .of_match_table = wsa_macro_dt_match, - }, - .probe = wsa_macro_probe, - .remove = wsa_macro_remove, -}; - -module_platform_driver(wsa_macro_driver); - -MODULE_DESCRIPTION("WSA macro driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/bolero/wsa-macro.h b/techpack/audio/asoc/codecs/bolero/wsa-macro.h deleted file mode 100644 index ec1aa9a280f6..000000000000 --- a/techpack/audio/asoc/codecs/bolero/wsa-macro.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef WSA_MACRO_H -#define WSA_MACRO_H - -/* - * Selects compander and smart boost settings - * for a given speaker mode - */ -enum { - WSA_MACRO_SPKR_MODE_DEFAULT, - WSA_MACRO_SPKR_MODE_1, /* COMP Gain = 12dB, Smartboost Max = 5.5V */ -}; - -/* Rx path gain offsets */ -enum { - WSA_MACRO_GAIN_OFFSET_M1P5_DB, - WSA_MACRO_GAIN_OFFSET_0_DB, -}; - - -#if IS_ENABLED(CONFIG_WSA_MACRO) -extern int wsa_macro_set_spkr_mode(struct snd_soc_codec *codec, int mode); -extern int wsa_macro_set_spkr_gain_offset(struct snd_soc_codec *codec, - int offset); -#else /* CONFIG_WSA_MACRO */ -static inline int wsa_macro_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - return 0; -} -static inline int wsa_macro_set_spkr_gain_offset(struct snd_soc_codec *codec, - int offset); -{ - return 0; -} -#endif /* CONFIG_WSA_MACRO */ -#endif diff --git a/techpack/audio/asoc/codecs/core.h b/techpack/audio/asoc/codecs/core.h deleted file mode 100644 index 7d9fcd2db268..000000000000 --- a/techpack/audio/asoc/codecs/core.h +++ /dev/null @@ -1,444 +0,0 @@ -/* Copyright (c) 2011-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MFD_TABLA_CORE_H__ -#define __MFD_TABLA_CORE_H__ - -#include -#include -#include -#include -#include - -#define WCD9XXX_MAX_IRQ_REGS 4 -#define WCD9XXX_MAX_NUM_IRQS (WCD9XXX_MAX_IRQ_REGS * 8) -#define WCD9XXX_SLIM_NUM_PORT_REG 3 -#define TABLA_VERSION_1_0 0 -#define TABLA_VERSION_1_1 1 -#define TABLA_VERSION_2_0 2 -#define TABLA_IS_1_X(ver) \ - (((ver == TABLA_VERSION_1_0) || (ver == TABLA_VERSION_1_1)) ? 1 : 0) -#define TABLA_IS_2_0(ver) ((ver == TABLA_VERSION_2_0) ? 1 : 0) - -#define WCD9XXX_SUPPLY_BUCK_NAME "cdc-vdd-buck" - -#define SITAR_VERSION_1P0 0 -#define SITAR_VERSION_1P1 1 -#define SITAR_IS_1P0(ver) \ - ((ver == SITAR_VERSION_1P0) ? 1 : 0) -#define SITAR_IS_1P1(ver) \ - ((ver == SITAR_VERSION_1P1) ? 1 : 0) - -#define TAIKO_VERSION_1_0 1 -#define TAIKO_IS_1_0(ver) \ - ((ver == TAIKO_VERSION_1_0) ? 1 : 0) - -#define TAPAN_VERSION_1_0 0 -#define TAPAN_IS_1_0(ver) \ - ((ver == TAPAN_VERSION_1_0) ? 1 : 0) - -#define TOMTOM_VERSION_1_0 1 -#define TOMTOM_IS_1_0(ver) \ - ((ver == TOMTOM_VERSION_1_0) ? 1 : 0) - -#define TASHA_VERSION_1_0 0 -#define TASHA_VERSION_1_1 1 -#define TASHA_VERSION_2_0 2 - -#define TASHA_IS_1_0(wcd) \ - ((wcd->type == WCD9335 || wcd->type == WCD9326) ? \ - ((wcd->version == TASHA_VERSION_1_0) ? 1 : 0) : 0) - -#define TASHA_IS_1_1(wcd) \ - ((wcd->type == WCD9335 || wcd->type == WCD9326) ? \ - ((wcd->version == TASHA_VERSION_1_1) ? 1 : 0) : 0) - -#define TASHA_IS_2_0(wcd) \ - ((wcd->type == WCD9335 || wcd->type == WCD9326) ? \ - ((wcd->version == TASHA_VERSION_2_0) ? 1 : 0) : 0) - -/* - * As fine version info cannot be retrieved before tavil probe. - * Define three coarse versions for possible future use before tavil probe. - */ -#define TAVIL_VERSION_1_0 0 -#define TAVIL_VERSION_1_1 1 -#define TAVIL_VERSION_WCD9340_1_0 2 -#define TAVIL_VERSION_WCD9341_1_0 3 -#define TAVIL_VERSION_WCD9340_1_1 4 -#define TAVIL_VERSION_WCD9341_1_1 5 - -#define TAVIL_IS_1_0(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_1_0 || \ - wcd->version == TAVIL_VERSION_WCD9340_1_0 || \ - wcd->version == TAVIL_VERSION_WCD9341_1_0) ? 1 : 0) : 0) -#define TAVIL_IS_1_1(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_1_1 || \ - wcd->version == TAVIL_VERSION_WCD9340_1_1 || \ - wcd->version == TAVIL_VERSION_WCD9341_1_1) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9340_1_0(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9340_1_0) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9341_1_0(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9341_1_0) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9340_1_1(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9340_1_1) ? 1 : 0) : 0) -#define TAVIL_IS_WCD9341_1_1(wcd) \ - ((wcd->type == WCD934X) ? \ - ((wcd->version == TAVIL_VERSION_WCD9341_1_1) ? 1 : 0) : 0) - -#define IS_CODEC_TYPE(wcd, wcdtype) \ - ((wcd->type == wcdtype) ? true : false) -#define IS_CODEC_VERSION(wcd, wcdversion) \ - ((wcd->version == wcdversion) ? true : false) - -#define PAHU_VERSION_1_0 0 - -enum { - CDC_V_1_0, - CDC_V_1_1, - CDC_V_2_0, -}; - -enum codec_variant { - WCD9XXX, - WCD9330, - WCD9335, - WCD9326, - WCD934X, - WCD9360, -}; - -enum wcd9xxx_slim_slave_addr_type { - WCD9XXX_SLIM_SLAVE_ADDR_TYPE_0, - WCD9XXX_SLIM_SLAVE_ADDR_TYPE_1, -}; - -enum wcd9xxx_pm_state { - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_AWAKE, - WCD9XXX_PM_ASLEEP, -}; - -enum { - WCD9XXX_INTR_STATUS_BASE = 0, - WCD9XXX_INTR_CLEAR_BASE, - WCD9XXX_INTR_MASK_BASE, - WCD9XXX_INTR_LEVEL_BASE, - WCD9XXX_INTR_CLR_COMMIT, - WCD9XXX_INTR_REG_MAX, -}; - -enum wcd9xxx_intf_status { - WCD9XXX_INTERFACE_TYPE_PROBING, - WCD9XXX_INTERFACE_TYPE_SLIMBUS, - WCD9XXX_INTERFACE_TYPE_I2C, -}; - -enum { - /* INTR_REG 0 */ - WCD9XXX_IRQ_SLIMBUS = 0, - WCD9XXX_IRQ_MBHC_REMOVAL, - WCD9XXX_IRQ_MBHC_SHORT_TERM, - WCD9XXX_IRQ_MBHC_PRESS, - WCD9XXX_IRQ_MBHC_RELEASE, - WCD9XXX_IRQ_MBHC_POTENTIAL, - WCD9XXX_IRQ_MBHC_INSERTION, - WCD9XXX_IRQ_BG_PRECHARGE, - /* INTR_REG 1 */ - WCD9XXX_IRQ_PA1_STARTUP, - WCD9XXX_IRQ_PA2_STARTUP, - WCD9XXX_IRQ_PA3_STARTUP, - WCD9XXX_IRQ_PA4_STARTUP, - WCD9306_IRQ_HPH_PA_OCPR_FAULT = WCD9XXX_IRQ_PA4_STARTUP, - WCD9XXX_IRQ_PA5_STARTUP, - WCD9XXX_IRQ_MICBIAS1_PRECHARGE, - WCD9306_IRQ_HPH_PA_OCPL_FAULT = WCD9XXX_IRQ_MICBIAS1_PRECHARGE, - WCD9XXX_IRQ_MICBIAS2_PRECHARGE, - WCD9XXX_IRQ_MICBIAS3_PRECHARGE, - /* INTR_REG 2 */ - WCD9XXX_IRQ_HPH_PA_OCPL_FAULT, - WCD9XXX_IRQ_HPH_PA_OCPR_FAULT, - WCD9XXX_IRQ_EAR_PA_OCPL_FAULT, - WCD9XXX_IRQ_HPH_L_PA_STARTUP, - WCD9XXX_IRQ_HPH_R_PA_STARTUP, - WCD9320_IRQ_EAR_PA_STARTUP, - WCD9306_IRQ_MBHC_JACK_SWITCH = WCD9320_IRQ_EAR_PA_STARTUP, - WCD9310_NUM_IRQS, - WCD9XXX_IRQ_RESERVED_0 = WCD9310_NUM_IRQS, - WCD9XXX_IRQ_RESERVED_1, - WCD9330_IRQ_SVASS_ERR_EXCEPTION = WCD9310_NUM_IRQS, - WCD9330_IRQ_MBHC_JACK_SWITCH, - /* INTR_REG 3 */ - WCD9XXX_IRQ_MAD_AUDIO, - WCD9XXX_IRQ_MAD_ULTRASOUND, - WCD9XXX_IRQ_MAD_BEACON, - WCD9XXX_IRQ_SPEAKER_CLIPPING, - WCD9320_IRQ_MBHC_JACK_SWITCH, - WCD9306_NUM_IRQS, - WCD9XXX_IRQ_VBAT_MONITOR_ATTACK = WCD9306_NUM_IRQS, - WCD9XXX_IRQ_VBAT_MONITOR_RELEASE, - WCD9XXX_NUM_IRQS, - /* WCD9330 INTR1_REG 3*/ - WCD9330_IRQ_SVASS_ENGINE = WCD9XXX_IRQ_MAD_AUDIO, - WCD9330_IRQ_MAD_AUDIO, - WCD9330_IRQ_MAD_ULTRASOUND, - WCD9330_IRQ_MAD_BEACON, - WCD9330_IRQ_SPEAKER1_CLIPPING, - WCD9330_IRQ_SPEAKER2_CLIPPING, - WCD9330_IRQ_VBAT_MONITOR_ATTACK, - WCD9330_IRQ_VBAT_MONITOR_RELEASE, - WCD9330_NUM_IRQS, - WCD9XXX_IRQ_RESERVED_2 = WCD9330_NUM_IRQS, -}; - -enum { - TABLA_NUM_IRQS = WCD9310_NUM_IRQS, - SITAR_NUM_IRQS = WCD9310_NUM_IRQS, - TAIKO_NUM_IRQS = WCD9XXX_NUM_IRQS, - TAPAN_NUM_IRQS = WCD9306_NUM_IRQS, - TOMTOM_NUM_IRQS = WCD9330_NUM_IRQS, -}; - -struct intr_data { - int intr_num; - bool clear_first; -}; - -struct wcd9xxx_core_resource { - struct mutex irq_lock; - struct mutex nested_irq_lock; - - enum wcd9xxx_pm_state pm_state; - struct mutex pm_lock; - /* pm_wq notifies change of pm_state */ - wait_queue_head_t pm_wq; - struct pm_qos_request pm_qos_req; - int wlock_holders; - - - /* holds the table of interrupts per codec */ - const struct intr_data *intr_table; - int intr_table_size; - unsigned int irq_base; - unsigned int irq; - u8 irq_masks_cur[WCD9XXX_MAX_IRQ_REGS]; - u8 irq_masks_cache[WCD9XXX_MAX_IRQ_REGS]; - bool irq_level_high[WCD9XXX_MAX_NUM_IRQS]; - int num_irqs; - int num_irq_regs; - u16 intr_reg[WCD9XXX_INTR_REG_MAX]; - struct regmap *wcd_core_regmap; - - /* Pointer to parent container data structure */ - void *parent; - - struct device *dev; - struct irq_domain *domain; -}; - -/* - * data structure for Slimbus and I2S channel. - * Some of fields are only used in smilbus mode - */ -struct wcd9xxx_ch { - u32 sph; /* share channel handle - slimbus only */ - u32 ch_num; /* - * vitrual channel number, such as 128 -144. - * apply for slimbus only - */ - u16 ch_h; /* chanel handle - slimbus only */ - u16 port; /* - * tabla port for RX and TX - * such as 0-9 for TX and 10 -16 for RX - * apply for both i2s and slimbus - */ - u16 shift; /* - * shift bit for RX and TX - * apply for both i2s and slimbus - */ - struct list_head list; /* - * channel link list - * apply for both i2s and slimbus - */ -}; - -struct wcd9xxx_codec_dai_data { - u32 rate; /* sample rate */ - u32 bit_width; /* sit width 16,24,32 */ - struct list_head wcd9xxx_ch_list; /* channel list */ - u16 grph; /* slimbus group handle */ - unsigned long ch_mask; - wait_queue_head_t dai_wait; - bool bus_down_in_recovery; -}; - -#define WCD9XXX_CH(xport, xshift) \ - {.port = xport, .shift = xshift} - -enum wcd9xxx_chipid_major { - TABLA_MAJOR = cpu_to_le16(0x100), - SITAR_MAJOR = cpu_to_le16(0x101), - TAIKO_MAJOR = cpu_to_le16(0x102), - TAPAN_MAJOR = cpu_to_le16(0x103), - TOMTOM_MAJOR = cpu_to_le16(0x105), - TASHA_MAJOR = cpu_to_le16(0x0), - TASHA2P0_MAJOR = cpu_to_le16(0x107), - TAVIL_MAJOR = cpu_to_le16(0x108), - PAHU_MAJOR = cpu_to_le16(0x109), -}; - -enum codec_power_states { - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD_REGION_POWER_COLLAPSE_BEGIN, - WCD_REGION_POWER_DOWN, -}; - -enum wcd_power_regions { - WCD9XXX_DIG_CORE_REGION_1, - WCD9XXX_MAX_PWR_REGIONS, -}; - -struct wcd9xxx_codec_type { - u16 id_major; - u16 id_minor; - struct mfd_cell *dev; - int size; - int num_irqs; - int version; /* -1 to retrieve version from chip version register */ - enum wcd9xxx_slim_slave_addr_type slim_slave_type; - u16 i2c_chip_status; - const struct intr_data *intr_tbl; - int intr_tbl_size; - u16 intr_reg[WCD9XXX_INTR_REG_MAX]; -}; - -struct wcd9xxx_power_region { - enum codec_power_states power_state; - u16 pwr_collapse_reg_min; - u16 pwr_collapse_reg_max; -}; - -struct wcd9xxx { - struct device *dev; - struct slim_device *slim; - struct slim_device *slim_slave; - struct mutex io_lock; - struct mutex xfer_lock; - struct mutex reset_lock; - u8 version; - - int reset_gpio; - struct device_node *wcd_rst_np; - - int (*read_dev)(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *dest, bool interface_reg); - int (*write_dev)(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src, bool interface_reg); - int (*multi_reg_write)(struct wcd9xxx *wcd9xxx, const void *data, - size_t count); - int (*dev_down)(struct wcd9xxx *wcd9xxx); - int (*post_reset)(struct wcd9xxx *wcd9xxx); - - void *ssr_priv; - bool dev_up; - - u32 num_of_supplies; - struct regulator_bulk_data *supplies; - - struct wcd9xxx_core_resource core_res; - - u16 id_minor; - u16 id_major; - - /* Slimbus or I2S port */ - u32 num_rx_port; - u32 num_tx_port; - struct wcd9xxx_ch *rx_chs; - struct wcd9xxx_ch *tx_chs; - u32 mclk_rate; - enum codec_variant type; - struct regmap *regmap; - - struct wcd9xxx_codec_type *codec_type; - bool prev_pg_valid; - u8 prev_pg; - u8 avoid_cdc_rstlow; - struct wcd9xxx_power_region *wcd9xxx_pwr[WCD9XXX_MAX_PWR_REGIONS]; -}; - -struct wcd9xxx_reg_val { - unsigned short reg; /* register address */ - u8 *buf; /* buffer to be written to reg. addr */ - int bytes; /* number of bytes to be written */ -}; - -int wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg); -int wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg, - u8 val); -int wcd9xxx_get_logical_addresses(u8 *pgd_la, u8 *inf_la); -int wcd9xxx_slim_write_repeat(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src); -int wcd9xxx_slim_reserve_bw(struct wcd9xxx *wcd9xxx, - u32 bw_ops, bool commit); -int wcd9xxx_set_power_state(struct wcd9xxx *wcd9xxx, enum codec_power_states, - enum wcd_power_regions); -int wcd9xxx_get_current_power_state(struct wcd9xxx *wcd9xxx, - enum wcd_power_regions); - -int wcd9xxx_page_write(struct wcd9xxx *wcd9xxx, unsigned short *reg); - -int wcd9xxx_slim_bulk_write(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_reg_val *bulk_reg, - unsigned int size, bool interface); - -extern int wcd9xxx_core_res_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - int num_irqs, int num_irq_regs, struct regmap *wcd_regmap); - -extern void wcd9xxx_core_res_deinit( - struct wcd9xxx_core_resource *wcd9xxx_core_res); - -extern int wcd9xxx_core_res_suspend( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - pm_message_t pmesg); - -extern int wcd9xxx_core_res_resume( - struct wcd9xxx_core_resource *wcd9xxx_core_res); - -extern int wcd9xxx_core_irq_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res); - -extern int wcd9xxx_assign_irq(struct wcd9xxx_core_resource *wcd9xxx_core_res, - unsigned int irq, - unsigned int irq_base); - -extern enum wcd9xxx_intf_status wcd9xxx_get_intf_type(void); -extern void wcd9xxx_set_intf_type(enum wcd9xxx_intf_status); - -extern enum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - enum wcd9xxx_pm_state o, - enum wcd9xxx_pm_state n); -static inline int __init wcd9xxx_irq_of_init(struct device_node *node, - struct device_node *parent) -{ - return 0; -} - -int wcd9xxx_init(void); -void wcd9xxx_exit(void); -#endif diff --git a/techpack/audio/asoc/codecs/cpe_cmi.h b/techpack/audio/asoc/codecs/cpe_cmi.h deleted file mode 100644 index c145a8a64261..000000000000 --- a/techpack/audio/asoc/codecs/cpe_cmi.h +++ /dev/null @@ -1,492 +0,0 @@ -/* - * Copyright (c) 2014-2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __CPE_CMI_H__ -#define __CPE_CMI_H__ - -#include - -#define CPE_AFE_PORT_1_TX 1 -#define CPE_AFE_PORT_3_TX 3 -#define CPE_AFE_PORT_ID_2_OUT 0x02 -#define CMI_INBAND_MESSAGE_SIZE 127 - -/* - * Multiple mad types can be supported at once. - * these values can be OR'ed to form the set of - * supported mad types - */ -#define MAD_TYPE_AUDIO (1 << 0) -#define MAD_TYPE_BEACON (1 << 1) -#define MAD_TYPE_ULTRASND (1 << 2) - -/* Core service command opcodes */ -#define CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC (0x3001) -#define CPE_CORE_SVC_CMDRSP_SHARED_MEM_ALLOC (0x3002) -#define CPE_CORE_SVC_CMD_SHARED_MEM_DEALLOC (0x3003) -#define CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ (0x3004) -#define CPE_CORE_SVC_EVENT_SYSTEM_BOOT (0x3005) -/* core service command opcodes for WCD9335 */ -#define CPE_CORE_SVC_CMD_CFG_CLK_PLAN (0x3006) -#define CPE_CORE_SVC_CMD_CLK_FREQ_REQUEST (0x3007) - -#define CPE_BOOT_SUCCESS 0x00 -#define CPE_BOOT_FAILED 0x01 - -#define CPE_CORE_VERSION_SYSTEM_BOOT_EVENT 0x01 - -/* LSM Service command opcodes */ -#define CPE_LSM_SESSION_CMD_OPEN_TX (0x2000) -#define CPE_LSM_SESSION_CMD_SET_PARAMS (0x2001) -#define CPE_LSM_SESSION_CMD_REGISTER_SOUND_MODEL (0x2002) -#define CPE_LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL (0x2003) -#define CPE_LSM_SESSION_CMD_START (0x2004) -#define CPE_LSM_SESSION_CMD_STOP (0x2005) -#define CPE_LSM_SESSION_EVENT_DETECTION_STATUS_V2 (0x2006) -#define CPE_LSM_SESSION_CMD_CLOSE_TX (0x2007) -#define CPE_LSM_SESSION_CMD_SHARED_MEM_ALLOC (0x2008) -#define CPE_LSM_SESSION_CMDRSP_SHARED_MEM_ALLOC (0x2009) -#define CPE_LSM_SESSION_CMD_SHARED_MEM_DEALLOC (0x200A) -#define CPE_LSM_SESSION_CMD_TX_BUFF_OUTPUT_CONFIG (0x200f) -#define CPE_LSM_SESSION_CMD_OPEN_TX_V2 (0x200D) -#define CPE_LSM_SESSION_CMD_SET_PARAMS_V2 (0x200E) - -/* LSM Service module and param IDs */ -#define CPE_LSM_MODULE_ID_VOICE_WAKEUP (0x00012C00) -#define CPE_LSM_MODULE_ID_VOICE_WAKEUP_V2 (0x00012C0D) -#define CPE_LSM_MODULE_FRAMEWORK (0x00012C0E) - -#define CPE_LSM_PARAM_ID_ENDPOINT_DETECT_THRESHOLD (0x00012C01) -#define CPE_LSM_PARAM_ID_OPERATION_MODE (0x00012C02) -#define CPE_LSM_PARAM_ID_GAIN (0x00012C03) -#define CPE_LSM_PARAM_ID_CONNECT_TO_PORT (0x00012C04) -#define CPE_LSM_PARAM_ID_MIN_CONFIDENCE_LEVELS (0x00012C07) - -/* LSM LAB command opcodes */ -#define CPE_LSM_SESSION_CMD_EOB 0x0000200B -#define CPE_LSM_MODULE_ID_LAB 0x00012C08 -/* used for enable/disable lab*/ -#define CPE_LSM_PARAM_ID_LAB_ENABLE 0x00012C09 -/* used for T in LAB config DSP internal buffer*/ -#define CPE_LSM_PARAM_ID_LAB_CONFIG 0x00012C0A -#define CPE_LSM_PARAM_ID_REGISTER_SOUND_MODEL (0x00012C14) -#define CPE_LSM_PARAM_ID_DEREGISTER_SOUND_MODEL (0x00012C15) -#define CPE_LSM_PARAM_ID_MEDIA_FMT (0x00012C1E) - -/* AFE Service command opcodes */ -#define CPE_AFE_PORT_CMD_START (0x1001) -#define CPE_AFE_PORT_CMD_STOP (0x1002) -#define CPE_AFE_PORT_CMD_SUSPEND (0x1003) -#define CPE_AFE_PORT_CMD_RESUME (0x1004) -#define CPE_AFE_PORT_CMD_SHARED_MEM_ALLOC (0x1005) -#define CPE_AFE_PORT_CMDRSP_SHARED_MEM_ALLOC (0x1006) -#define CPE_AFE_PORT_CMD_SHARED_MEM_DEALLOC (0x1007) -#define CPE_AFE_PORT_CMD_GENERIC_CONFIG (0x1008) -#define CPE_AFE_SVC_CMD_LAB_MODE (0x1009) - -/* AFE Service module and param IDs */ -#define CPE_AFE_CMD_SET_PARAM (0x1000) -#define CPE_AFE_MODULE_ID_SW_MAD (0x0001022D) -#define CPE_AFE_PARAM_ID_SW_MAD_CFG (0x0001022E) -#define CPE_AFE_PARAM_ID_SVM_MODEL (0x0001022F) - -#define CPE_AFE_MODULE_HW_MAD (0x00010230) -#define CPE_AFE_PARAM_ID_HW_MAD_CTL (0x00010232) -#define CPE_AFE_PARAM_ID_HW_MAD_CFG (0x00010231) - -#define CPE_AFE_MODULE_AUDIO_DEV_INTERFACE (0x0001020C) -#define CPE_AFE_PARAM_ID_GENERIC_PORT_CONFIG (0x00010253) - -#define CPE_CMI_BASIC_RSP_OPCODE (0x0001) -#define CPE_HDR_MAX_PLD_SIZE (0x7F) - -#define CMI_OBM_FLAG_IN_BAND 0 -#define CMI_OBM_FLAG_OUT_BAND 1 - -#define CMI_SHMEM_ALLOC_FAILED 0xff - -/* - * Future Service ID's can be added one line - * before the CMI_CPE_SERVICE_ID_MAX - */ -enum { - CMI_CPE_SERVICE_ID_MIN = 0, - CMI_CPE_CORE_SERVICE_ID, - CMI_CPE_AFE_SERVICE_ID, - CMI_CPE_LSM_SERVICE_ID, - CMI_CPE_SERVICE_ID_MAX, -}; - -#define CPE_LSM_SESSION_ID_MAX 2 - -#define IS_VALID_SESSION_ID(s_id) \ - (s_id <= CPE_LSM_SESSION_ID_MAX) - -#define IS_VALID_SERVICE_ID(s_id) \ - (s_id > CMI_CPE_SERVICE_ID_MIN && \ - s_id < CMI_CPE_SERVICE_ID_MAX) - -#define IS_VALID_PLD_SIZE(p_size) \ - (p_size <= CPE_HDR_MAX_PLD_SIZE) - -#define CMI_HDR_SET_OPCODE(hdr, cmd) (hdr->opcode = cmd) - - -#define CMI_HDR_SET(hdr_info, mask, shift, value) \ - (hdr_info = (((hdr_info) & ~(mask)) | \ - ((value << shift) & mask))) - -#define SVC_ID_SHIFT 4 -#define SVC_ID_MASK (0x07 << SVC_ID_SHIFT) - -#define SESSION_ID_SHIFT 0 -#define SESSION_ID_MASK (0x0F << SESSION_ID_SHIFT) - -#define PAYLD_SIZE_SHIFT 0 -#define PAYLD_SIZE_MASK (0x7F << PAYLD_SIZE_SHIFT) - -#define OBM_FLAG_SHIFT 7 -#define OBM_FLAG_MASK (1 << OBM_FLAG_SHIFT) - -#define VERSION_SHIFT 7 -#define VERSION_MASK (1 << VERSION_SHIFT) - -#define CMI_HDR_SET_SERVICE(hdr, s_id) \ - CMI_HDR_SET(hdr->hdr_info, SVC_ID_MASK,\ - SVC_ID_SHIFT, s_id) -#define CMI_HDR_GET_SERVICE(hdr) \ - ((hdr->hdr_info >> SVC_ID_SHIFT) & \ - (SVC_ID_MASK >> SVC_ID_SHIFT)) - - -#define CMI_HDR_SET_SESSION(hdr, s_id) \ - CMI_HDR_SET(hdr->hdr_info, SESSION_ID_MASK,\ - SESSION_ID_SHIFT, s_id) - -#define CMI_HDR_GET_SESSION_ID(hdr) \ - ((hdr->hdr_info >> SESSION_ID_SHIFT) & \ - (SESSION_ID_MASK >> SESSION_ID_SHIFT)) - -#define CMI_GET_HEADER(msg) ((struct cmi_hdr *)(msg)) -#define CMI_GET_PAYLOAD(msg) ((void *)(CMI_GET_HEADER(msg) + 1)) -#define CMI_GET_OPCODE(msg) (CMI_GET_HEADER(msg)->opcode) - -#define CMI_HDR_SET_VERSION(hdr, ver) \ - CMI_HDR_SET(hdr->hdr_info, VERSION_MASK, \ - VERSION_SHIFT, ver) - -#define CMI_HDR_SET_PAYLOAD_SIZE(hdr, p_size) \ - CMI_HDR_SET(hdr->pld_info, PAYLD_SIZE_MASK, \ - PAYLD_SIZE_SHIFT, p_size) - -#define CMI_HDR_GET_PAYLOAD_SIZE(hdr) \ - ((hdr->pld_info >> PAYLD_SIZE_SHIFT) & \ - (PAYLD_SIZE_MASK >> PAYLD_SIZE_SHIFT)) - -#define CMI_HDR_SET_OBM(hdr, obm_flag) \ - CMI_HDR_SET(hdr->pld_info, OBM_FLAG_MASK, \ - OBM_FLAG_SHIFT, obm_flag) - -#define CMI_HDR_GET_OBM_FLAG(hdr) \ - ((hdr->pld_info >> OBM_FLAG_SHIFT) & \ - (OBM_FLAG_MASK >> OBM_FLAG_SHIFT)) - -struct cmi_hdr { - /* - * bits 0:3 is session id - * bits 4:6 is service id - * bit 7 is the version flag - */ - u8 hdr_info; - - /* - * bits 0:6 is payload size in case of in-band message - * bits 0:6 is size (OBM message size) - * bit 7 is the OBM flag - */ - u8 pld_info; - - /* 16 bit command opcode */ - u16 opcode; -} __packed; - -union cpe_addr { - u64 msw_lsw; - void *kvaddr; -} __packed; - -struct cmi_obm { - u32 version; - u32 size; - union cpe_addr data_ptr; - u32 mem_handle; -} __packed; - -struct cmi_obm_msg { - struct cmi_hdr hdr; - struct cmi_obm pld; -} __packed; - -struct cmi_core_svc_event_system_boot { - u8 status; - u8 version; - u16 sfr_buff_size; - u32 sfr_buff_address; -} __packed; - -struct cmi_core_svc_cmd_shared_mem_alloc { - u32 size; -} __packed; - -struct cmi_core_svc_cmdrsp_shared_mem_alloc { - u32 addr; -} __packed; - -struct cmi_core_svc_cmd_clk_freq_request { - u32 clk_freq; -} __packed; - -struct cmi_msg_transport { - u32 size; - u32 addr; -} __packed; - -struct cmi_basic_rsp_result { - u8 status; -} __packed; - -struct cpe_lsm_cmd_open_tx { - struct cmi_hdr hdr; - u16 app_id; - u16 reserved; - u32 sampling_rate; -} __packed; - -struct cpe_lsm_cmd_open_tx_v2 { - struct cmi_hdr hdr; - u32 topology_id; -} __packed; - -struct cpe_cmd_shmem_alloc { - struct cmi_hdr hdr; - u32 size; -} __packed; - -struct cpe_cmdrsp_shmem_alloc { - struct cmi_hdr hdr; - u32 addr; -} __packed; - -struct cpe_cmd_shmem_dealloc { - struct cmi_hdr hdr; - u32 addr; -} __packed; - -struct cpe_lsm_event_detect_v2 { - struct cmi_hdr hdr; - u8 detection_status; - u8 size; - u8 payload[0]; -} __packed; - -struct cpe_lsm_psize_res { - u16 param_size; - u16 reserved; -} __packed; - -union cpe_lsm_param_size { - u32 param_size; - struct cpe_lsm_psize_res sr; -} __packed; - -struct cpe_param_data { - u32 module_id; - u32 param_id; - union cpe_lsm_param_size p_size; -} __packed; - -struct cpe_lsm_param_epd_thres { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u32 epd_begin; - u32 epd_end; -} __packed; - -struct cpe_lsm_param_gain { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u16 gain; - u16 reserved; -} __packed; - -struct cpe_afe_hw_mad_ctrl { - struct cpe_param_data param; - u32 minor_version; - u16 mad_type; - u16 mad_enable; -} __packed; - -struct cpe_afe_port_cfg { - struct cpe_param_data param; - u32 minor_version; - u16 bit_width; - u16 num_channels; - u32 sample_rate; -} __packed; - -struct cpe_afe_cmd_port_cfg { - struct cmi_hdr hdr; - u8 bit_width; - u8 num_channels; - u16 buffer_size; - u32 sample_rate; -} __packed; - -struct cpe_afe_params { - struct cmi_hdr hdr; - struct cpe_afe_hw_mad_ctrl hw_mad_ctrl; - struct cpe_afe_port_cfg port_cfg; -} __packed; - -struct cpe_afe_svc_cmd_mode { - struct cmi_hdr hdr; - u8 mode; -} __packed; - -struct cpe_lsm_param_opmode { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u16 mode; - u16 reserved; -} __packed; - -struct cpe_lsm_param_connectport { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u16 afe_port_id; - u16 reserved; -} __packed; - -/* - * This cannot be sent to CPE as is, - * need to append the conf_levels dynamically - */ -struct cpe_lsm_conf_level { - struct cmi_hdr hdr; - struct cpe_param_data param; - u8 num_active_models; -} __packed; - -struct cpe_lsm_output_format_cfg { - struct cmi_hdr hdr; - u8 format; - u8 packing; - u8 data_path_events; -} __packed; - -struct cpe_lsm_lab_enable { - struct cpe_param_data param; - u16 enable; - u16 reserved; -} __packed; - -struct cpe_lsm_control_lab { - struct cmi_hdr hdr; - struct cpe_lsm_lab_enable lab_enable; -} __packed; - -struct cpe_lsm_lab_config { - struct cpe_param_data param; - u32 minor_ver; - u32 latency; -} __packed; - -struct cpe_lsm_lab_latency_config { - struct cmi_hdr hdr; - struct cpe_lsm_lab_config latency_cfg; -} __packed; - -struct cpe_lsm_media_fmt_param { - struct cmi_hdr hdr; - struct cpe_param_data param; - u32 minor_version; - u32 sample_rate; - u16 num_channels; - u16 bit_width; -} __packed; - - -#define CPE_PARAM_LSM_LAB_LATENCY_SIZE (\ - sizeof(struct cpe_lsm_lab_latency_config) - \ - sizeof(struct cmi_hdr)) -#define PARAM_SIZE_LSM_LATENCY_SIZE (\ - sizeof(struct cpe_lsm_lab_config) - \ - sizeof(struct cpe_param_data)) -#define CPE_PARAM_SIZE_LSM_LAB_CONTROL (\ - sizeof(struct cpe_lsm_control_lab) - \ - sizeof(struct cmi_hdr)) -#define PARAM_SIZE_LSM_CONTROL_SIZE (sizeof(struct cpe_lsm_lab_enable) - \ - sizeof(struct cpe_param_data)) -#define PARAM_SIZE_AFE_HW_MAD_CTRL (sizeof(struct cpe_afe_hw_mad_ctrl) - \ - sizeof(struct cpe_param_data)) -#define PARAM_SIZE_AFE_PORT_CFG (sizeof(struct cpe_afe_port_cfg) - \ - sizeof(struct cpe_param_data)) -#define CPE_AFE_PARAM_PAYLOAD_SIZE (sizeof(struct cpe_afe_params) - \ - sizeof(struct cmi_hdr)) - -#define OPEN_CMD_PAYLOAD_SIZE (sizeof(struct cpe_lsm_cmd_open_tx) - \ - sizeof(struct cmi_hdr)) -#define OPEN_V2_CMD_PAYLOAD_SIZE (sizeof(struct cpe_lsm_cmd_open_tx_v2) - \ - sizeof(struct cmi_hdr)) -#define SHMEM_ALLOC_CMD_PLD_SIZE (sizeof(struct cpe_cmd_shmem_alloc) - \ - sizeof(struct cmi_hdr)) - -#define SHMEM_DEALLOC_CMD_PLD_SIZE (sizeof(struct cpe_cmd_shmem_dealloc) - \ - sizeof(struct cmi_hdr)) -#define OUT_FMT_CFG_CMD_PAYLOAD_SIZE ( \ - sizeof(struct cpe_lsm_output_format_cfg) - \ - sizeof(struct cmi_hdr)) - -#define CPE_AFE_CMD_PORT_CFG_PAYLOAD_SIZE \ - (sizeof(struct cpe_afe_cmd_port_cfg) - \ - sizeof(struct cmi_hdr)) - -#define CPE_AFE_CMD_MODE_PAYLOAD_SIZE \ - (sizeof(struct cpe_afe_svc_cmd_mode) - \ - sizeof(struct cmi_hdr)) -#define CPE_CMD_EPD_THRES_PLD_SIZE (sizeof(struct cpe_lsm_param_epd_thres) - \ - sizeof(struct cmi_hdr)) -#define CPE_EPD_THRES_PARAM_SIZE ((CPE_CMD_EPD_THRES_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#define CPE_CMD_OPMODE_PLD_SIZE (sizeof(struct cpe_lsm_param_opmode) - \ - sizeof(struct cmi_hdr)) -#define CPE_OPMODE_PARAM_SIZE ((CPE_CMD_OPMODE_PLD_SIZE) -\ - sizeof(struct cpe_param_data)) -#define CPE_CMD_CONNECTPORT_PLD_SIZE \ - (sizeof(struct cpe_lsm_param_connectport) - \ - sizeof(struct cmi_hdr)) -#define CPE_CONNECTPORT_PARAM_SIZE ((CPE_CMD_CONNECTPORT_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#define CPE_CMD_GAIN_PLD_SIZE (sizeof(struct cpe_lsm_param_gain) - \ - sizeof(struct cmi_hdr)) -#define CPE_GAIN_PARAM_SIZE ((CPE_CMD_GAIN_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#define CPE_MEDIA_FMT_PLD_SIZE (sizeof(struct cpe_lsm_media_fmt_param) - \ - sizeof(struct cmi_hdr)) -#define CPE_MEDIA_FMT_PARAM_SIZE ((CPE_MEDIA_FMT_PLD_SIZE) - \ - sizeof(struct cpe_param_data)) -#endif /* __CPE_CMI_H__ */ diff --git a/techpack/audio/asoc/codecs/cpe_core.h b/techpack/audio/asoc/codecs/cpe_core.h deleted file mode 100644 index 99504c5c9625..000000000000 --- a/techpack/audio/asoc/codecs/cpe_core.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2013-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __CPE_CORE_H__ -#define __CPE_CORE_H__ - -#include -#include -#include -#include - -enum { - CMD_INIT_STATE = 0, - CMD_SENT, - CMD_RESP_RCVD, -}; - -enum wcd_cpe_event { - WCD_CPE_PRE_ENABLE = 1, - WCD_CPE_POST_ENABLE, - WCD_CPE_PRE_DISABLE, - WCD_CPE_POST_DISABLE, -}; - -struct wcd_cpe_afe_port_cfg { - u8 port_id; - u16 bit_width; - u16 num_channels; - u32 sample_rate; -}; - -struct lsm_out_fmt_cfg { - u8 format; - u8 pack_mode; - u8 data_path_events; - u8 transfer_mode; -}; - -struct lsm_hw_params { - u32 sample_rate; - u16 num_chs; - u16 bit_width; -}; - -struct cpe_lsm_session { - /* sound model related */ - void *snd_model_data; - u8 *conf_levels; - void *cmi_reg_handle; - - /* Clients private data */ - void *priv_d; - - void (*event_cb)(void *priv_data, - u8 detect_status, - u8 size, u8 *payload); - - struct completion cmd_comp; - struct wcd_cpe_afe_port_cfg afe_port_cfg; - struct wcd_cpe_afe_port_cfg afe_out_port_cfg; - struct mutex lsm_lock; - - u32 snd_model_size; - u32 lsm_mem_handle; - u16 cmd_err_code; - u8 id; - u8 num_confidence_levels; - u16 afe_out_port_id; - struct task_struct *lsm_lab_thread; - bool started; - - u32 lab_enable; - struct lsm_out_fmt_cfg out_fmt_cfg; - - bool is_topology_used; -}; - -struct wcd_cpe_afe_ops { - int (*afe_set_params)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg, - bool afe_mad_ctl); - - int (*afe_port_start)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_stop)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_suspend)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_resume)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); - - int (*afe_port_cmd_cfg)(void *core_handle, - struct wcd_cpe_afe_port_cfg *cfg); -}; - -struct wcd_cpe_lsm_ops { - - struct cpe_lsm_session *(*lsm_alloc_session) - (void *core_handle, void *lsm_priv_d, - void (*event_cb)(void *priv_data, - u8 detect_status, - u8 size, u8 *payload)); - - int (*lsm_dealloc_session) - (void *core_handle, struct cpe_lsm_session *); - - int (*lsm_open_tx)(void *core_handle, - struct cpe_lsm_session *, u16, u16); - - int (*lsm_close_tx)(void *core_handle, - struct cpe_lsm_session *); - - int (*lsm_shmem_alloc)(void *core_handle, - struct cpe_lsm_session *, u32 size); - - int (*lsm_shmem_dealloc)(void *core_handle, - struct cpe_lsm_session *); - - int (*lsm_register_snd_model)(void *core_handle, - struct cpe_lsm_session *, - enum lsm_detection_mode, bool); - - int (*lsm_deregister_snd_model)(void *core_handle, - struct cpe_lsm_session *); - - int (*lsm_get_afe_out_port_id)(void *core_handle, - struct cpe_lsm_session *session); - - int (*lsm_start)(void *core_handle, - struct cpe_lsm_session *); - - int (*lsm_stop)(void *core_handle, - struct cpe_lsm_session *); - - int (*lsm_lab_control)(void *core_handle, - struct cpe_lsm_session *session, - bool enable); - - int (*lab_ch_setup)(void *core_handle, - struct cpe_lsm_session *session, - enum wcd_cpe_event event); - - int (*lsm_set_data)(void *core_handle, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, - bool detect_failure); - int (*lsm_set_fmt_cfg)(void *core_handle, - struct cpe_lsm_session *session); - int (*lsm_set_one_param)(void *core_handle, - struct cpe_lsm_session *session, - struct lsm_params_info *p_info, - void *data, uint32_t param_type); - void (*lsm_get_snd_model_offset) - (void *core_handle, struct cpe_lsm_session *, - size_t *offset); - int (*lsm_set_media_fmt_params)(void *core_handle, - struct cpe_lsm_session *session, - struct lsm_hw_params *param); - int (*lsm_set_port)(void *core_handle, - struct cpe_lsm_session *session, void *data); -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_CPE) -int wcd_cpe_get_lsm_ops(struct wcd_cpe_lsm_ops *lsm_ops); -int wcd_cpe_get_afe_ops(struct wcd_cpe_afe_ops *afe_ops); -void *wcd_cpe_get_core_handle(struct snd_soc_codec *codec); -#else /* CONFIG_SND_SOC_WCD_CPE */ -static inline int wcd_cpe_get_lsm_ops(struct wcd_cpe_lsm_ops *lsm_ops) -{ - return 0; -} -static inline int wcd_cpe_get_afe_ops(struct wcd_cpe_afe_ops *afe_ops) -{ - return 0; -} -static inline void *wcd_cpe_get_core_handle(struct snd_soc_codec *codec) -{ - return NULL; -} -#endif /* CONFIG_SND_SOC_WCD_CPE */ -#endif diff --git a/techpack/audio/asoc/codecs/cpe_err.h b/techpack/audio/asoc/codecs/cpe_err.h deleted file mode 100644 index b70dc490fb1a..000000000000 --- a/techpack/audio/asoc/codecs/cpe_err.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __CPE_ERR__ -#define __CPE_ERR__ - -#include - -/* ERROR CODES */ -/* Success. The operation completed with no errors. */ -#define CPE_EOK 0x00000000 -/* General failure. */ -#define CPE_EFAILED 0x00000001 -/* Bad operation parameter. */ -#define CPE_EBADPARAM 0x00000002 -/* Unsupported routine or operation. */ -#define CPE_EUNSUPPORTED 0x00000003 -/* Unsupported version. */ -#define CPE_EVERSION 0x00000004 -/* Unexpected problem encountered. */ -#define CPE_EUNEXPECTED 0x00000005 -/* Unhandled problem occurred. */ -#define CPE_EPANIC 0x00000006 -/* Unable to allocate resource. */ -#define CPE_ENORESOURCE 0x00000007 -/* Invalid handle. */ -#define CPE_EHANDLE 0x00000008 -/* Operation is already processed. */ -#define CPE_EALREADY 0x00000009 -/* Operation is not ready to be processed. */ -#define CPE_ENOTREADY 0x0000000A -/* Operation is pending completion. */ -#define CPE_EPENDING 0x0000000B -/* Operation could not be accepted or processed. */ -#define CPE_EBUSY 0x0000000C -/* Operation aborted due to an error. */ -#define CPE_EABORTED 0x0000000D -/* Operation preempted by a higher priority. */ -#define CPE_EPREEMPTED 0x0000000E -/* Operation requests intervention to complete. */ -#define CPE_ECONTINUE 0x0000000F -/* Operation requests immediate intervention to complete. */ -#define CPE_EIMMEDIATE 0x00000010 -/* Operation is not implemented. */ -#define CPE_ENOTIMPL 0x00000011 -/* Operation needs more data or resources. */ -#define CPE_ENEEDMORE 0x00000012 -/* Operation does not have memory. */ -#define CPE_ENOMEMORY 0x00000014 -/* Item does not exist. */ -#define CPE_ENOTEXIST 0x00000015 -/* Operation is finished. */ -#define CPE_ETERMINATED 0x00000016 -/* Max count for adsp error code sent to HLOS*/ -#define CPE_ERR_MAX (CPE_ETERMINATED + 1) - - -/* ERROR STRING */ -/* Success. The operation completed with no errors. */ -#define CPE_EOK_STR "CPE_EOK" -/* General failure. */ -#define CPE_EFAILED_STR "CPE_EFAILED" -/* Bad operation parameter. */ -#define CPE_EBADPARAM_STR "CPE_EBADPARAM" -/* Unsupported routine or operation. */ -#define CPE_EUNSUPPORTED_STR "CPE_EUNSUPPORTED" -/* Unsupported version. */ -#define CPE_EVERSION_STR "CPE_EVERSION" -/* Unexpected problem encountered. */ -#define CPE_EUNEXPECTED_STR "CPE_EUNEXPECTED" -/* Unhandled problem occurred. */ -#define CPE_EPANIC_STR "CPE_EPANIC" -/* Unable to allocate resource. */ -#define CPE_ENORESOURCE_STR "CPE_ENORESOURCE" -/* Invalid handle. */ -#define CPE_EHANDLE_STR "CPE_EHANDLE" -/* Operation is already processed. */ -#define CPE_EALREADY_STR "CPE_EALREADY" -/* Operation is not ready to be processed. */ -#define CPE_ENOTREADY_STR "CPE_ENOTREADY" -/* Operation is pending completion. */ -#define CPE_EPENDING_STR "CPE_EPENDING" -/* Operation could not be accepted or processed. */ -#define CPE_EBUSY_STR "CPE_EBUSY" -/* Operation aborted due to an error. */ -#define CPE_EABORTED_STR "CPE_EABORTED" -/* Operation preempted by a higher priority. */ -#define CPE_EPREEMPTED_STR "CPE_EPREEMPTED" -/* Operation requests intervention to complete. */ -#define CPE_ECONTINUE_STR "CPE_ECONTINUE" -/* Operation requests immediate intervention to complete. */ -#define CPE_EIMMEDIATE_STR "CPE_EIMMEDIATE" -/* Operation is not implemented. */ -#define CPE_ENOTIMPL_STR "CPE_ENOTIMPL" -/* Operation needs more data or resources. */ -#define CPE_ENEEDMORE_STR "CPE_ENEEDMORE" -/* Operation does not have memory. */ -#define CPE_ENOMEMORY_STR "CPE_ENOMEMORY" -/* Item does not exist. */ -#define CPE_ENOTEXIST_STR "CPE_ENOTEXIST" -/* Operation is finished. */ -#define CPE_ETERMINATED_STR "CPE_ETERMINATED" -/* Unexpected error code. */ -#define CPE_ERR_MAX_STR "CPE_ERR_MAX" - - -struct cpe_err_code { - int lnx_err_code; - char *cpe_err_str; -}; - - -static struct cpe_err_code cpe_err_code_info[CPE_ERR_MAX+1] = { - { 0, CPE_EOK_STR}, - { -ENOTRECOVERABLE, CPE_EFAILED_STR}, - { -EINVAL, CPE_EBADPARAM_STR}, - { -EOPNOTSUPP, CPE_EUNSUPPORTED_STR}, - { -ENOPROTOOPT, CPE_EVERSION_STR}, - { -ENOTRECOVERABLE, CPE_EUNEXPECTED_STR}, - { -ENOTRECOVERABLE, CPE_EPANIC_STR}, - { -ENOSPC, CPE_ENORESOURCE_STR}, - { -EBADR, CPE_EHANDLE_STR}, - { -EALREADY, CPE_EALREADY_STR}, - { -EPERM, CPE_ENOTREADY_STR}, - { -EINPROGRESS, CPE_EPENDING_STR}, - { -EBUSY, CPE_EBUSY_STR}, - { -ECANCELED, CPE_EABORTED_STR}, - { -EAGAIN, CPE_EPREEMPTED_STR}, - { -EAGAIN, CPE_ECONTINUE_STR}, - { -EAGAIN, CPE_EIMMEDIATE_STR}, - { -EAGAIN, CPE_ENOTIMPL_STR}, - { -ENODATA, CPE_ENEEDMORE_STR}, - { -EADV, CPE_ERR_MAX_STR}, - { -ENOMEM, CPE_ENOMEMORY_STR}, - { -ENODEV, CPE_ENOTEXIST_STR}, - { -EADV, CPE_ETERMINATED_STR}, - { -EADV, CPE_ERR_MAX_STR}, -}; - -static inline int cpe_err_get_lnx_err_code(u32 cpe_error) -{ - if (cpe_error > CPE_ERR_MAX) - return cpe_err_code_info[CPE_ERR_MAX].lnx_err_code; - else - return cpe_err_code_info[cpe_error].lnx_err_code; -} - -static inline char *cpe_err_get_err_str(u32 cpe_error) -{ - if (cpe_error > CPE_ERR_MAX) - return cpe_err_code_info[CPE_ERR_MAX].cpe_err_str; - else - return cpe_err_code_info[cpe_error].cpe_err_str; -} - -#endif diff --git a/techpack/audio/asoc/codecs/cs35l41/Android.mk b/techpack/audio/asoc/codecs/cs35l41/Android.mk deleted file mode 100755 index 9b2b116f0487..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/Android.mk +++ /dev/null @@ -1,55 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - #AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=cs35l41_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_cs35l41.ko -LOCAL_MODULE_KBUILD_NAME := cs35l41_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/cs35l41/Kbuild b/techpack/audio/asoc/codecs/cs35l41/Kbuild deleted file mode 100755 index aa7e59a9130f..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/Kbuild +++ /dev/null @@ -1,116 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ CS35L41 ############ - -# for CS35L41 Codec -ifdef CONFIG_SND_SOC_CS35L41 - CS35L41_OBJS += cs35l41.o - CS35L41_OBJS += cs35l41-i2c.o - CS35L41_OBJS += cs35l41-tables.o - CS35L41_OBJS += wm_adsp.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_CS35L41) += cs35l41_dlkm.o -cs35l41_dlkm-y := $(CS35L41_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/cs35l41/Kconfig b/techpack/audio/asoc/codecs/cs35l41/Kconfig deleted file mode 100755 index 111d2a1ab555..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/Kconfig +++ /dev/null @@ -1,1066 +0,0 @@ -# Helper to resolve issues with configs that have SPI enabled but I2C -# modular, meaning we can't build the codec driver in with I2C support. -# We use an ordered list of conditional defaults to pick the appropriate -# setting - SPI can't be modular so that case doesn't need to be covered. -config SND_SOC_I2C_AND_SPI - tristate - default m if I2C=m - default y if I2C=y - default y if SPI_MASTER=y - -menu "CODEC drivers" - -config SND_SOC_ALL_CODECS - tristate "Build all ASoC CODEC drivers" - depends on COMPILE_TEST - select SND_SOC_88PM860X if MFD_88PM860X - select SND_SOC_L3 - select SND_SOC_AB8500_CODEC if ABX500_CORE - select SND_SOC_AC97_CODEC - select SND_SOC_AD1836 if SPI_MASTER - select SND_SOC_AD193X_SPI if SPI_MASTER - select SND_SOC_AD193X_I2C if I2C - select SND_SOC_AD1980 if SND_SOC_AC97_BUS - select SND_SOC_AD73311 - select SND_SOC_ADAU1373 if I2C - select SND_SOC_ADAU1761_I2C if I2C - select SND_SOC_ADAU1761_SPI if SPI - select SND_SOC_ADAU1781_I2C if I2C - select SND_SOC_ADAU1781_SPI if SPI - select SND_SOC_ADAV801 if SPI_MASTER - select SND_SOC_ADAV803 if I2C - select SND_SOC_ADAU1977_SPI if SPI_MASTER - select SND_SOC_ADAU1977_I2C if I2C - select SND_SOC_ADAU1701 if I2C - select SND_SOC_ADS117X - select SND_SOC_AK4104 if SPI_MASTER - select SND_SOC_AK4535 if I2C - select SND_SOC_AK4554 - select SND_SOC_AK4613 if I2C - select SND_SOC_AK4641 if I2C - select SND_SOC_AK4642 if I2C - select SND_SOC_AK4671 if I2C - select SND_SOC_AK5386 - select SND_SOC_ALC5623 if I2C - select SND_SOC_ALC5632 if I2C - select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC - select SND_SOC_CIRRUS_PSIA - select SND_SOC_CS35L32 if I2C - select SND_SOC_CS35L33 if I2C - select SND_SOC_CS35L34 if I2C - select SND_SOC_CS35L35 if I2C - select SND_SOC_CS35L36 if I2C - select SND_SOC_CS35L41_SPI if SPI_MASTER - select SND_SOC_CS35L41_I2C if I2C - select SND_SOC_CS42L42_I2C if I2C - select SND_SOC_CS42L51_I2C if I2C - select SND_SOC_CS42L52 if I2C && INPUT - select SND_SOC_CS42L56 if I2C && INPUT - select SND_SOC_CS42L73 if I2C - select SND_SOC_CS4265 if I2C - select SND_SOC_CS4270 if I2C - select SND_SOC_CS4271_I2C if I2C - select SND_SOC_CS4271_SPI if SPI_MASTER - select SND_SOC_CS42XX8_I2C if I2C - select SND_SOC_CS4349 if I2C - select SND_SOC_CS43130 if I2C - select SND_SOC_CS47L24 if MFD_CS47L24 - select SND_SOC_CS53L30 if I2C - select SND_SOC_CX20442 if TTY - select SND_SOC_DA7210 if SND_SOC_I2C_AND_SPI - select SND_SOC_DA7213 if I2C - select SND_SOC_DA7218 if I2C - select SND_SOC_DA7219 if I2C - select SND_SOC_DA732X if I2C - select SND_SOC_DA9055 if I2C - select SND_SOC_DMIC - select SND_SOC_BT_SCO - select SND_SOC_ES8328_SPI if SPI_MASTER - select SND_SOC_ES8328_I2C if I2C - select SND_SOC_GTM601 - select SND_SOC_HDAC_HDMI - select SND_SOC_ICS43432 - select SND_SOC_INNO_RK3036 - select SND_SOC_ISABELLE if I2C - select SND_SOC_JZ4740_CODEC - select SND_SOC_LM4857 if I2C - select SND_SOC_LM49453 if I2C - select SND_SOC_MAX98088 if I2C - select SND_SOC_MAX98090 if I2C - select SND_SOC_MAX98095 if I2C - select SND_SOC_MAX98357A if GPIOLIB - select SND_SOC_MAX9867 if I2C - select SND_SOC_MAX98925 if I2C - select SND_SOC_MAX98926 if I2C - select SND_SOC_MAX9850 if I2C - select SND_SOC_MAX9768 if I2C - select SND_SOC_MAX9877 if I2C - select SND_SOC_MC13783 if MFD_MC13XXX - select SND_SOC_ML26124 if I2C - select SND_SOC_NAU8825 if I2C - select SND_SOC_PCM1681 if I2C - select SND_SOC_PCM179X_I2C if I2C - select SND_SOC_PCM179X_SPI if SPI_MASTER - select SND_SOC_PCM3008 - select SND_SOC_PCM3168A_I2C if I2C - select SND_SOC_PCM3168A_SPI if SPI_MASTER - select SND_SOC_PCM512x_I2C if I2C - select SND_SOC_PCM512x_SPI if SPI_MASTER - select SND_SOC_RT286 if I2C - select SND_SOC_RT298 if I2C - select SND_SOC_RT5514 if I2C - select SND_SOC_RT5616 if I2C - select SND_SOC_RT5631 if I2C - select SND_SOC_RT5640 if I2C - select SND_SOC_RT5645 if I2C - select SND_SOC_RT5651 if I2C - select SND_SOC_RT5659 if I2C - select SND_SOC_RT5670 if I2C - select SND_SOC_RT5677 if I2C && SPI_MASTER - select SND_SOC_SGTL5000 if I2C - select SND_SOC_SI476X if MFD_SI476X_CORE - select SND_SOC_SIRF_AUDIO_CODEC - select SND_SOC_SN95031 if INTEL_SCU_IPC - select SND_SOC_SPDIF - select SND_SOC_SSM2518 if I2C - select SND_SOC_SSM2602_SPI if SPI_MASTER - select SND_SOC_SSM2602_I2C if I2C - select SND_SOC_SSM4567 if I2C - select SND_SOC_STA32X if I2C - select SND_SOC_STA350 if I2C - select SND_SOC_STA529 if I2C - select SND_SOC_STAC9766 if SND_SOC_AC97_BUS - select SND_SOC_STI_SAS - select SND_SOC_TAS2552 if I2C - select SND_SOC_TAS5086 if I2C - select SND_SOC_TAS571X if I2C - select SND_SOC_TFA9879 if I2C - select SND_SOC_TLV320AIC23_I2C if I2C - select SND_SOC_TLV320AIC23_SPI if SPI_MASTER - select SND_SOC_TLV320AIC26 if SPI_MASTER - select SND_SOC_TLV320AIC31XX if I2C - select SND_SOC_TLV320AIC32X4 if I2C - select SND_SOC_TLV320AIC3X if I2C - select SND_SOC_TPA6130A2 if I2C - select SND_SOC_TLV320DAC33 if I2C - select SND_SOC_TS3A227E if I2C - select SND_SOC_TWL4030 if TWL4030_CORE - select SND_SOC_TWL6040 if TWL6040_CORE - select SND_SOC_UDA134X - select SND_SOC_UDA1380 if I2C - select SND_SOC_WL1273 if MFD_WL1273_CORE - select SND_SOC_WM0010 if SPI_MASTER - select SND_SOC_WM1250_EV1 if I2C - select SND_SOC_WM2000 if I2C - select SND_SOC_WM2200 if I2C - select SND_SOC_WM5100 if I2C - select SND_SOC_WM5102 if MFD_WM5102 - select SND_SOC_WM5110 if MFD_WM5110 - select SND_SOC_WM8350 if MFD_WM8350 - select SND_SOC_WM8400 if MFD_WM8400 - select SND_SOC_WM8510 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8523 if I2C - select SND_SOC_WM8580 if I2C - select SND_SOC_WM8711 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8727 - select SND_SOC_WM8728 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8731 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8737 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8741 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8750 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8753 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8770 if SPI_MASTER - select SND_SOC_WM8776 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8782 - select SND_SOC_WM8804_I2C if I2C - select SND_SOC_WM8804_SPI if SPI_MASTER - select SND_SOC_WM8900 if I2C - select SND_SOC_WM8903 if I2C - select SND_SOC_WM8904 if I2C - select SND_SOC_WM8940 if I2C - select SND_SOC_WM8955 if I2C - select SND_SOC_WM8960 if I2C - select SND_SOC_WM8961 if I2C - select SND_SOC_WM8962 if I2C && INPUT - select SND_SOC_WM8971 if I2C - select SND_SOC_WM8974 if I2C - select SND_SOC_WM8978 if I2C - select SND_SOC_WM8983 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8985 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8988 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8990 if I2C - select SND_SOC_WM8991 if I2C - select SND_SOC_WM8993 if I2C - select SND_SOC_WM8994 if MFD_WM8994 - select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8996 if I2C - select SND_SOC_WM8997 if MFD_WM8997 - select SND_SOC_WM8998 if MFD_WM8998 - select SND_SOC_WM9081 if I2C - select SND_SOC_WM9090 if I2C - select SND_SOC_WM9705 if SND_SOC_AC97_BUS - select SND_SOC_WM9712 if SND_SOC_AC97_BUS - select SND_SOC_WM9713 if SND_SOC_AC97_BUS - help - Normally ASoC codec drivers are only built if a machine driver which - uses them is also built since they are only usable with a machine - driver. Selecting this option will allow these drivers to be built - without an explicit machine driver for test and development purposes. - - Support for the bus types used to access the codecs to be built must - be selected separately. - - If unsure select "N". - -config SND_SOC_88PM860X - tristate - -config SND_SOC_ARIZONA - tristate - default y if SND_SOC_CS47L24=y - default y if SND_SOC_WM5102=y - default y if SND_SOC_WM5110=y - default y if SND_SOC_WM8997=y - default y if SND_SOC_WM8998=y - default m if SND_SOC_CS47L24=m - default m if SND_SOC_WM5102=m - default m if SND_SOC_WM5110=m - default m if SND_SOC_WM8997=m - default m if SND_SOC_WM8998=m - -config SND_SOC_WM_HUBS - tristate - default y if SND_SOC_WM8993=y || SND_SOC_WM8994=y - default m if SND_SOC_WM8993=m || SND_SOC_WM8994=m - -config SND_SOC_WM_ADSP - tristate - select SND_SOC_COMPRESS - default y if SND_SOC_CS47L24=y - default y if SND_SOC_WM5102=y - default y if SND_SOC_WM5110=y - default y if SND_SOC_WM2200=y - default m if SND_SOC_CS47L24=m - default m if SND_SOC_WM5102=m - default m if SND_SOC_WM5110=m - default m if SND_SOC_WM2200=m - -config SND_SOC_AB8500_CODEC - tristate - -config SND_SOC_AC97_CODEC - tristate "Build generic ASoC AC97 CODEC driver" - select SND_AC97_CODEC - select SND_SOC_AC97_BUS - -config SND_SOC_AD1836 - tristate - -config SND_SOC_AD193X - tristate - -config SND_SOC_AD193X_SPI - tristate - select SND_SOC_AD193X - -config SND_SOC_AD193X_I2C - tristate - select SND_SOC_AD193X - -config SND_SOC_AD1980 - select REGMAP_AC97 - tristate - -config SND_SOC_AD73311 - tristate - -config SND_SOC_ADAU1373 - tristate - -config SND_SOC_ADAU1701 - tristate "Analog Devices ADAU1701 CODEC" - depends on I2C - select SND_SOC_SIGMADSP_I2C - -config SND_SOC_ADAU17X1 - tristate - select SND_SOC_SIGMADSP_REGMAP - -config SND_SOC_ADAU1761 - tristate - select SND_SOC_ADAU17X1 - -config SND_SOC_ADAU1761_I2C - tristate - select SND_SOC_ADAU1761 - select REGMAP_I2C - -config SND_SOC_ADAU1761_SPI - tristate - select SND_SOC_ADAU1761 - select REGMAP_SPI - -config SND_SOC_ADAU1781 - select SND_SOC_ADAU17X1 - tristate - -config SND_SOC_ADAU1781_I2C - tristate - select SND_SOC_ADAU1781 - select REGMAP_I2C - -config SND_SOC_ADAU1781_SPI - tristate - select SND_SOC_ADAU1781 - select REGMAP_SPI - -config SND_SOC_ADAU1977 - tristate - -config SND_SOC_ADAU1977_SPI - tristate - select SND_SOC_ADAU1977 - select REGMAP_SPI - -config SND_SOC_ADAU1977_I2C - tristate - select SND_SOC_ADAU1977 - select REGMAP_I2C - -config SND_SOC_ADAV80X - tristate - -config SND_SOC_ADAV801 - tristate - select SND_SOC_ADAV80X - -config SND_SOC_ADAV803 - tristate - select SND_SOC_ADAV80X - -config SND_SOC_ADS117X - tristate - -config SND_SOC_AK4104 - tristate "AKM AK4104 CODEC" - depends on SPI_MASTER - -config SND_SOC_AK4535 - tristate - -config SND_SOC_AK4554 - tristate "AKM AK4554 CODEC" - -config SND_SOC_AK4613 - tristate "AKM AK4613 CODEC" - depends on I2C - -config SND_SOC_AK4641 - tristate - -config SND_SOC_AK4642 - tristate "AKM AK4642 CODEC" - depends on I2C - -config SND_SOC_AK4671 - tristate - -config SND_SOC_AK5386 - tristate "AKM AK5638 CODEC" - -config SND_SOC_ALC5623 - tristate "Realtek ALC5623 CODEC" - depends on I2C - -config SND_SOC_ALC5632 - tristate - -config SND_SOC_CQ0093VC - tristate - -config SND_SOC_CIRRUS_PSIA - tristate "Cirrus Logic PSIA Stub" - -config SND_SOC_CS35L32 - tristate "Cirrus Logic CS35L32 CODEC" - depends on I2C - -config SND_SOC_CS35L33 - tristate "Cirrus Logic CS35L33 CODEC" - depends on I2C - -config SND_SOC_CS35L34 - tristate "Cirrus Logic CS35L34 CODEC" - depends on I2C - -config SND_SOC_CS35L35 - tristate "Cirrus Logic CS35L35 CODEC" - depends on I2C - -config SND_SOC_CS35L36 - tristate "Cirrus Logic CS35L36 CODEC" - depends on I2C - -config SND_SOC_CS35L41 - tristate - select SND_SOC_WM_ADSP - -config SND_SOC_CS35L41_SPI - tristate "Cirrus Logic CS35L41 CODEC (SPI)" - depends on SPI_MASTER - select SND_SOC_CS35L41 - select REGMAP_SPI - -config SND_SOC_CS35L41_I2C - tristate "Cirrus Logic CS35L41 CODEC (I2C)" - depends on I2C - select SND_SOC_CS35L41 - select REGMAP_I2C - -config SND_SOC_CS42L42 - tristate "Cirrus Logic CS42L42 CODEC" - depends on I2C - -config SND_SOC_CS42L51 - tristate - -config SND_SOC_CS42L51_I2C - tristate "Cirrus Logic CS42L51 CODEC (I2C)" - depends on I2C - select SND_SOC_CS42L51 - -config SND_SOC_CS42L51 - tristate - -config SND_SOC_CS42L52 - tristate "Cirrus Logic CS42L52 CODEC" - depends on I2C && INPUT - -config SND_SOC_CS42L56 - tristate "Cirrus Logic CS42L56 CODEC" - depends on I2C && INPUT - -config SND_SOC_CS42L73 - tristate "Cirrus Logic CS42L73 CODEC" - depends on I2C - -config SND_SOC_CS4265 - tristate "Cirrus Logic CS4265 CODEC" - depends on I2C - select REGMAP_I2C - -# Cirrus Logic CS4270 Codec -config SND_SOC_CS4270 - tristate "Cirrus Logic CS4270 CODEC" - depends on I2C - -# Cirrus Logic CS4270 Codec VD = 3.3V Errata -# Select if you are affected by the errata where the part will not function -# if MCLK divide-by-1.5 is selected and VD is set to 3.3V. The driver will -# not select any sample rates that require MCLK to be divided by 1.5. -config SND_SOC_CS4270_VD33_ERRATA - bool - depends on SND_SOC_CS4270 - -config SND_SOC_CS4271 - tristate - -config SND_SOC_CS4271_I2C - tristate "Cirrus Logic CS4271 CODEC (I2C)" - depends on I2C - select SND_SOC_CS4271 - select REGMAP_I2C - -config SND_SOC_CS4271_SPI - tristate "Cirrus Logic CS4271 CODEC (SPI)" - depends on SPI_MASTER - select SND_SOC_CS4271 - select REGMAP_SPI - -config SND_SOC_CS42XX8 - tristate - -config SND_SOC_CS42XX8_I2C - tristate "Cirrus Logic CS42448/CS42888 CODEC (I2C)" - depends on I2C - select SND_SOC_CS42XX8 - select REGMAP_I2C - -# Cirrus Logic CS4349 HiFi DAC -config SND_SOC_CS4349 - tristate "Cirrus Logic CS4349 CODEC" - depends on I2C - -# Cirrus Logic CS43130 HiFi DAC -config SND_SOC_CS43130 - tristate "Cirrus Logic CS43130 CODEC" - depends on I2C - -config SND_SOC_CS47L24 - tristate - -config SND_SOC_CS53L30 - tristate "Cirrus Logic CS53L30 CODEC" - depends on I2C - -config SND_SOC_CX20442 - tristate - depends on TTY - -config SND_SOC_JZ4740_CODEC - select REGMAP_MMIO - tristate - -config SND_SOC_L3 - tristate - -config SND_SOC_DA7210 - tristate - -config SND_SOC_DA7213 - tristate - -config SND_SOC_DA7218 - tristate - -config SND_SOC_DA7219 - tristate - -config SND_SOC_DA732X - tristate - -config SND_SOC_DA9055 - tristate - -config SND_SOC_BT_SCO - tristate - -config SND_SOC_DMIC - tristate - -config SND_SOC_ES8328 - tristate "Everest Semi ES8328 CODEC" - -config SND_SOC_ES8328_I2C - tristate - select SND_SOC_ES8328 - -config SND_SOC_ES8328_SPI - tristate - select SND_SOC_ES8328 - -config SND_SOC_GTM601 - tristate 'GTM601 UMTS modem audio codec' - -config SND_SOC_HDAC_HDMI - tristate - select SND_HDA_EXT_CORE - select SND_PCM_ELD - select HDMI - -config SND_SOC_ICS43432 - tristate - -config SND_SOC_INNO_RK3036 - tristate "Inno codec driver for RK3036 SoC" - select REGMAP_MMIO - -config SND_SOC_ISABELLE - tristate - -config SND_SOC_LM49453 - tristate - -config SND_SOC_MAX98088 - tristate - -config SND_SOC_MAX98090 - tristate - -config SND_SOC_MAX98095 - tristate - -config SND_SOC_MAX98357A - tristate - -config SND_SOC_MAX9867 - tristate - -config SND_SOC_MAX98925 - tristate - -config SND_SOC_MAX98926 - tristate - -config SND_SOC_MAX9850 - tristate - -config SND_SOC_PCM1681 - tristate "Texas Instruments PCM1681 CODEC" - depends on I2C - -config SND_SOC_PCM179X - tristate - -config SND_SOC_PCM179X_I2C - tristate "Texas Instruments PCM179X CODEC (I2C)" - depends on I2C - select SND_SOC_PCM179X - help - Enable support for Texas Instruments PCM179x CODEC. - Select this if your PCM179x is connected via an I2C bus. - -config SND_SOC_PCM179X_SPI - tristate "Texas Instruments PCM179X CODEC (SPI)" - depends on SPI_MASTER - select SND_SOC_PCM179X - help - Enable support for Texas Instruments PCM179x CODEC. - Select this if your PCM179x is connected via an SPI bus. - -config SND_SOC_PCM3008 - tristate - -config SND_SOC_PCM3168A - tristate - -config SND_SOC_PCM3168A_I2C - tristate "Texas Instruments PCM3168A CODEC - I2C" - depends on I2C - select SND_SOC_PCM3168A - select REGMAP_I2C - -config SND_SOC_PCM3168A_SPI - tristate "Texas Instruments PCM3168A CODEC - SPI" - depends on SPI_MASTER - select SND_SOC_PCM3168A - select REGMAP_SPI - -config SND_SOC_PCM512x - tristate - -config SND_SOC_PCM512x_I2C - tristate "Texas Instruments PCM512x CODECs - I2C" - depends on I2C - select SND_SOC_PCM512x - select REGMAP_I2C - -config SND_SOC_PCM512x_SPI - tristate "Texas Instruments PCM512x CODECs - SPI" - depends on SPI_MASTER - select SND_SOC_PCM512x - select REGMAP_SPI - -config SND_SOC_RL6231 - tristate - default y if SND_SOC_RT5514=y - default y if SND_SOC_RT5616=y - default y if SND_SOC_RT5640=y - default y if SND_SOC_RT5645=y - default y if SND_SOC_RT5651=y - default y if SND_SOC_RT5659=y - default y if SND_SOC_RT5670=y - default y if SND_SOC_RT5677=y - default m if SND_SOC_RT5514=m - default m if SND_SOC_RT5616=m - default m if SND_SOC_RT5640=m - default m if SND_SOC_RT5645=m - default m if SND_SOC_RT5651=m - default m if SND_SOC_RT5659=m - default m if SND_SOC_RT5670=m - default m if SND_SOC_RT5677=m - -config SND_SOC_RL6347A - tristate - default y if SND_SOC_RT286=y - default y if SND_SOC_RT298=y - default m if SND_SOC_RT286=m - default m if SND_SOC_RT298=m - -config SND_SOC_RT286 - tristate - depends on I2C - -config SND_SOC_RT298 - tristate - depends on I2C - -config SND_SOC_RT5514 - tristate - -config SND_SOC_RT5616 - tristate "Realtek RT5616 CODEC" - depends on I2C - -config SND_SOC_RT5631 - tristate "Realtek ALC5631/RT5631 CODEC" - depends on I2C - -config SND_SOC_RT5640 - tristate - -config SND_SOC_RT5645 - tristate - -config SND_SOC_RT5651 - tristate - -config SND_SOC_RT5659 - tristate - -config SND_SOC_RT5670 - tristate - -config SND_SOC_RT5677 - tristate - select REGMAP_I2C - select REGMAP_IRQ - -config SND_SOC_RT5677_SPI - tristate - default SND_SOC_RT5677 && SPI - -#Freescale sgtl5000 codec -config SND_SOC_SGTL5000 - tristate "Freescale SGTL5000 CODEC" - depends on I2C - -config SND_SOC_SI476X - tristate - -config SND_SOC_SIGMADSP - tristate - select CRC32 - -config SND_SOC_SIGMADSP_I2C - tristate - select SND_SOC_SIGMADSP - -config SND_SOC_SIGMADSP_REGMAP - tristate - select SND_SOC_SIGMADSP - -config SND_SOC_SIRF_AUDIO_CODEC - tristate "SiRF SoC internal audio codec" - select REGMAP_MMIO - -config SND_SOC_SN95031 - tristate - -config SND_SOC_SPDIF - tristate "S/PDIF CODEC" - -config SND_SOC_SSM2518 - tristate - -config SND_SOC_SSM2602 - tristate - -config SND_SOC_SSM2602_SPI - tristate "Analog Devices SSM2602 CODEC - SPI" - depends on SPI_MASTER - select SND_SOC_SSM2602 - select REGMAP_SPI - -config SND_SOC_SSM2602_I2C - tristate "Analog Devices SSM2602 CODEC - I2C" - depends on I2C - select SND_SOC_SSM2602 - select REGMAP_I2C - -config SND_SOC_SSM4567 - tristate "Analog Devices ssm4567 amplifier driver support" - depends on I2C - -config SND_SOC_STA32X - tristate "STA326, STA328 and STA329 speaker amplifier" - depends on I2C - select REGMAP_I2C - -config SND_SOC_STA350 - tristate "STA350 speaker amplifier" - depends on I2C - -config SND_SOC_STA529 - tristate - -config SND_SOC_STAC9766 - tristate - -config SND_SOC_STI_SAS - tristate "codec Audio support for STI SAS codec" - -config SND_SOC_TAS2552 - tristate "Texas Instruments TAS2552 Mono Audio amplifier" - depends on I2C - -config SND_SOC_TAS5086 - tristate "Texas Instruments TAS5086 speaker amplifier" - depends on I2C - -config SND_SOC_TAS571X - tristate "Texas Instruments TAS5711/TAS5717/TAS5719 power amplifiers" - depends on I2C - -config SND_SOC_TFA9879 - tristate "NXP Semiconductors TFA9879 amplifier" - depends on I2C - -config SND_SOC_TLV320AIC23 - tristate - -config SND_SOC_TLV320AIC23_I2C - tristate "Texas Instruments TLV320AIC23 audio CODEC - I2C" - depends on I2C - select SND_SOC_TLV320AIC23 - -config SND_SOC_TLV320AIC23_SPI - tristate "Texas Instruments TLV320AIC23 audio CODEC - SPI" - depends on SPI_MASTER - select SND_SOC_TLV320AIC23 - -config SND_SOC_TLV320AIC26 - tristate - depends on SPI - -config SND_SOC_TLV320AIC31XX - tristate "Texas Instruments TLV320AIC31xx CODECs" - depends on I2C - select REGMAP_I2C - -config SND_SOC_TLV320AIC32X4 - tristate - -config SND_SOC_TLV320AIC3X - tristate "Texas Instruments TLV320AIC3x CODECs" - depends on I2C - -config SND_SOC_TLV320DAC33 - tristate - -config SND_SOC_TS3A227E - tristate "TI Headset/Mic detect and keypress chip" - depends on I2C - -config SND_SOC_TWL4030 - select MFD_TWL4030_AUDIO - tristate - -config SND_SOC_TWL6040 - tristate - -config SND_SOC_UDA134X - tristate - -config SND_SOC_UDA1380 - tristate - -config SND_SOC_WL1273 - tristate - -config SND_SOC_WM0010 - tristate - -config SND_SOC_WM1250_EV1 - tristate - -config SND_SOC_WM2000 - tristate - -config SND_SOC_WM2200 - tristate - -config SND_SOC_WM5100 - tristate - -config SND_SOC_WM5102 - tristate - -config SND_SOC_WM5110 - tristate - -config SND_SOC_WM8350 - tristate - -config SND_SOC_WM8400 - tristate - -config SND_SOC_WM8510 - tristate "Wolfson Microelectronics WM8510 CODEC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8523 - tristate "Wolfson Microelectronics WM8523 DAC" - depends on I2C - -config SND_SOC_WM8580 - tristate "Wolfson Microelectronics WM8523 CODEC" - depends on I2C - -config SND_SOC_WM8711 - tristate "Wolfson Microelectronics WM8711 CODEC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8727 - tristate - -config SND_SOC_WM8728 - tristate "Wolfson Microelectronics WM8728 DAC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8731 - tristate "Wolfson Microelectronics WM8731 CODEC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8737 - tristate "Wolfson Microelectronics WM8737 ADC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8741 - tristate "Wolfson Microelectronics WM8737 DAC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8750 - tristate "Wolfson Microelectronics WM8750 CODEC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8753 - tristate "Wolfson Microelectronics WM8753 CODEC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8770 - tristate "Wolfson Microelectronics WM8770 CODEC" - depends on SPI_MASTER - -config SND_SOC_WM8776 - tristate "Wolfson Microelectronics WM8776 CODEC" - depends on SND_SOC_I2C_AND_SPI - -config SND_SOC_WM8782 - tristate - -config SND_SOC_WM8804 - tristate - -config SND_SOC_WM8804_I2C - tristate "Wolfson Microelectronics WM8804 S/PDIF transceiver I2C" - depends on I2C - select SND_SOC_WM8804 - select REGMAP_I2C - -config SND_SOC_WM8804_SPI - tristate "Wolfson Microelectronics WM8804 S/PDIF transceiver SPI" - depends on SPI_MASTER - select SND_SOC_WM8804 - select REGMAP_SPI - -config SND_SOC_WM8900 - tristate - -config SND_SOC_WM8903 - tristate "Wolfson Microelectronics WM8903 CODEC" - depends on I2C - -config SND_SOC_WM8904 - tristate - -config SND_SOC_WM8940 - tristate - -config SND_SOC_WM8955 - tristate - -config SND_SOC_WM8960 - tristate - -config SND_SOC_WM8961 - tristate - -config SND_SOC_WM8962 - tristate "Wolfson Microelectronics WM8962 CODEC" - depends on I2C && INPUT - -config SND_SOC_WM8971 - tristate - -config SND_SOC_WM8974 - tristate "Wolfson Microelectronics WM8974 codec" - depends on I2C - -config SND_SOC_WM8978 - tristate "Wolfson Microelectronics WM8978 codec" - depends on I2C - -config SND_SOC_WM8983 - tristate - -config SND_SOC_WM8985 - tristate - -config SND_SOC_WM8988 - tristate - -config SND_SOC_WM8990 - tristate - -config SND_SOC_WM8991 - tristate - -config SND_SOC_WM8993 - tristate - -config SND_SOC_WM8994 - tristate - -config SND_SOC_WM8995 - tristate - -config SND_SOC_WM8996 - tristate - -config SND_SOC_WM8997 - tristate - -config SND_SOC_WM8998 - tristate - -config SND_SOC_WM9081 - tristate - -config SND_SOC_WM9090 - tristate - -config SND_SOC_WM9705 - tristate - -config SND_SOC_WM9712 - tristate - -config SND_SOC_WM9713 - tristate - select REGMAP_AC97 - -# Amp -config SND_SOC_LM4857 - tristate - -config SND_SOC_MAX9768 - tristate - -config SND_SOC_MAX9877 - tristate - -config SND_SOC_MC13783 - tristate - -config SND_SOC_ML26124 - tristate - -config SND_SOC_NAU8825 - tristate - -config SND_SOC_TPA6130A2 - tristate "Texas Instruments TPA6130A2 headphone amplifier" - depends on I2C - -endmenu diff --git a/techpack/audio/asoc/codecs/cs35l41/Makefile b/techpack/audio/asoc/codecs/cs35l41/Makefile deleted file mode 100755 index e7e3ce8cf43a..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/Makefile +++ /dev/null @@ -1,433 +0,0 @@ -snd-soc-88pm860x-objs := 88pm860x-codec.o -snd-soc-ab8500-codec-objs := ab8500-codec.o -snd-soc-ac97-objs := ac97.o -snd-soc-ad1836-objs := ad1836.o -snd-soc-ad193x-objs := ad193x.o -snd-soc-ad193x-spi-objs := ad193x-spi.o -snd-soc-ad193x-i2c-objs := ad193x-i2c.o -snd-soc-ad1980-objs := ad1980.o -snd-soc-ad73311-objs := ad73311.o -snd-soc-adau1373-objs := adau1373.o -snd-soc-adau1701-objs := adau1701.o -snd-soc-adau17x1-objs := adau17x1.o -snd-soc-adau1761-objs := adau1761.o -snd-soc-adau1761-i2c-objs := adau1761-i2c.o -snd-soc-adau1761-spi-objs := adau1761-spi.o -snd-soc-adau1781-objs := adau1781.o -snd-soc-adau1781-i2c-objs := adau1781-i2c.o -snd-soc-adau1781-spi-objs := adau1781-spi.o -snd-soc-adau1977-objs := adau1977.o -snd-soc-adau1977-spi-objs := adau1977-spi.o -snd-soc-adau1977-i2c-objs := adau1977-i2c.o -snd-soc-adav80x-objs := adav80x.o -snd-soc-adav801-objs := adav801.o -snd-soc-adav803-objs := adav803.o -snd-soc-ads117x-objs := ads117x.o -snd-soc-ak4104-objs := ak4104.o -snd-soc-ak4535-objs := ak4535.o -snd-soc-ak4554-objs := ak4554.o -snd-soc-ak4613-objs := ak4613.o -snd-soc-ak4641-objs := ak4641.o -snd-soc-ak4642-objs := ak4642.o -snd-soc-ak4671-objs := ak4671.o -snd-soc-ak5386-objs := ak5386.o -snd-soc-arizona-objs := arizona.o -snd-soc-cq93vc-objs := cq93vc.o -snd-soc-cirrus-psia-objs := cirrus-psia.o -snd-soc-cs35l32-objs := cs35l32.o -snd-soc-cs35l33-objs := cs35l33.o -snd-soc-cs35l34-objs := cs35l34.o -snd-soc-cs35l35-objs := cs35l35.o -snd-soc-cs35l36-objs := cs35l36.o cs35l36-tables.o -snd-soc-cs35l41-objs := cs35l41.o -snd-soc-cs35l41-spi-objs := cs35l41-spi.o cs35l41-tables.o -snd-soc-cs35l41-i2c-objs := cs35l41-i2c.o cs35l41-tables.o -snd-soc-cs42l42-objs := cs42l42.o -snd-soc-cs42l51-objs := cs42l51.o -snd-soc-cs42l51-i2c-objs := cs42l51-i2c.o -snd-soc-cs42l52-objs := cs42l52.o -snd-soc-cs42l56-objs := cs42l56.o -snd-soc-cs42l73-objs := cs42l73.o -snd-soc-cs4265-objs := cs4265.o -snd-soc-cs4270-objs := cs4270.o -snd-soc-cs4271-objs := cs4271.o -snd-soc-cs4271-i2c-objs := cs4271-i2c.o -snd-soc-cs4271-spi-objs := cs4271-spi.o -snd-soc-cs42xx8-objs := cs42xx8.o -snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o -snd-soc-cs4349-objs := cs4349.o -snd-soc-cs43130-objs := cs43130.o -snd-soc-cs47l24-objs := cs47l24.o -snd-soc-cs53l30-objs := cs53l30.o -snd-soc-cx20442-objs := cx20442.o -snd-soc-da7210-objs := da7210.o -snd-soc-da7213-objs := da7213.o -snd-soc-da7218-objs := da7218.o -snd-soc-da7219-objs := da7219.o da7219-aad.o -snd-soc-da732x-objs := da732x.o -snd-soc-da9055-objs := da9055.o -snd-soc-bt-sco-objs := bt-sco.o -snd-soc-dmic-objs := dmic.o -snd-soc-es8328-objs := es8328.o -snd-soc-es8328-i2c-objs := es8328-i2c.o -snd-soc-es8328-spi-objs := es8328-spi.o -snd-soc-gtm601-objs := gtm601.o -snd-soc-hdac-hdmi-objs := hdac_hdmi.o -snd-soc-ics43432-objs := ics43432.o -snd-soc-inno-rk3036-objs := inno_rk3036.o -snd-soc-isabelle-objs := isabelle.o -snd-soc-jz4740-codec-objs := jz4740.o -snd-soc-l3-objs := l3.o -snd-soc-lm4857-objs := lm4857.o -snd-soc-lm49453-objs := lm49453.o -snd-soc-max9768-objs := max9768.o -snd-soc-max98088-objs := max98088.o -snd-soc-max98090-objs := max98090.o -snd-soc-max98095-objs := max98095.o -snd-soc-max98357a-objs := max98357a.o -snd-soc-max9867-objs := max9867.o -snd-soc-max98925-objs := max98925.o -snd-soc-max98926-objs := max98926.o -snd-soc-max9850-objs := max9850.o -snd-soc-mc13783-objs := mc13783.o -snd-soc-ml26124-objs := ml26124.o -snd-soc-nau8825-objs := nau8825.o -snd-soc-pcm1681-objs := pcm1681.o -snd-soc-pcm179x-codec-objs := pcm179x.o -snd-soc-pcm179x-i2c-objs := pcm179x-i2c.o -snd-soc-pcm179x-spi-objs := pcm179x-spi.o -snd-soc-pcm3008-objs := pcm3008.o -snd-soc-pcm3168a-objs := pcm3168a.o -snd-soc-pcm3168a-i2c-objs := pcm3168a-i2c.o -snd-soc-pcm3168a-spi-objs := pcm3168a-spi.o -snd-soc-pcm512x-objs := pcm512x.o -snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o -snd-soc-pcm512x-spi-objs := pcm512x-spi.o -snd-soc-rl6231-objs := rl6231.o -snd-soc-rl6347a-objs := rl6347a.o -snd-soc-rt286-objs := rt286.o -snd-soc-rt298-objs := rt298.o -snd-soc-rt5514-objs := rt5514.o -snd-soc-rt5616-objs := rt5616.o -snd-soc-rt5631-objs := rt5631.o -snd-soc-rt5640-objs := rt5640.o -snd-soc-rt5645-objs := rt5645.o -snd-soc-rt5651-objs := rt5651.o -snd-soc-rt5659-objs := rt5659.o -snd-soc-rt5670-objs := rt5670.o -snd-soc-rt5677-objs := rt5677.o -snd-soc-rt5677-spi-objs := rt5677-spi.o -snd-soc-sgtl5000-objs := sgtl5000.o -snd-soc-alc5623-objs := alc5623.o -snd-soc-alc5632-objs := alc5632.o -snd-soc-sigmadsp-objs := sigmadsp.o -snd-soc-sigmadsp-i2c-objs := sigmadsp-i2c.o -snd-soc-sigmadsp-regmap-objs := sigmadsp-regmap.o -snd-soc-si476x-objs := si476x.o -snd-soc-sirf-audio-codec-objs := sirf-audio-codec.o -snd-soc-sn95031-objs := sn95031.o -snd-soc-spdif-tx-objs := spdif_transmitter.o -snd-soc-spdif-rx-objs := spdif_receiver.o -snd-soc-ssm2518-objs := ssm2518.o -snd-soc-ssm2602-objs := ssm2602.o -snd-soc-ssm2602-spi-objs := ssm2602-spi.o -snd-soc-ssm2602-i2c-objs := ssm2602-i2c.o -snd-soc-ssm4567-objs := ssm4567.o -snd-soc-sta32x-objs := sta32x.o -snd-soc-sta350-objs := sta350.o -snd-soc-sta529-objs := sta529.o -snd-soc-stac9766-objs := stac9766.o -snd-soc-sti-sas-objs := sti-sas.o -snd-soc-tas5086-objs := tas5086.o -snd-soc-tas571x-objs := tas571x.o -snd-soc-tfa9879-objs := tfa9879.o -snd-soc-tlv320aic23-objs := tlv320aic23.o -snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o -snd-soc-tlv320aic23-spi-objs := tlv320aic23-spi.o -snd-soc-tlv320aic26-objs := tlv320aic26.o -snd-soc-tlv320aic31xx-objs := tlv320aic31xx.o -snd-soc-tlv320aic32x4-objs := tlv320aic32x4.o -snd-soc-tlv320aic3x-objs := tlv320aic3x.o -snd-soc-tlv320dac33-objs := tlv320dac33.o -snd-soc-ts3a227e-objs := ts3a227e.o -snd-soc-twl4030-objs := twl4030.o -snd-soc-twl6040-objs := twl6040.o -snd-soc-uda134x-objs := uda134x.o -snd-soc-uda1380-objs := uda1380.o -snd-soc-wl1273-objs := wl1273.o -snd-soc-wm-adsp-objs := wm_adsp.o -snd-soc-wm0010-objs := wm0010.o -snd-soc-wm1250-ev1-objs := wm1250-ev1.o -snd-soc-wm2000-objs := wm2000.o -snd-soc-wm2200-objs := wm2200.o -snd-soc-wm5100-objs := wm5100.o wm5100-tables.o -snd-soc-wm5102-objs := wm5102.o -snd-soc-wm5110-objs := wm5110.o -snd-soc-wm8350-objs := wm8350.o -snd-soc-wm8400-objs := wm8400.o -snd-soc-wm8510-objs := wm8510.o -snd-soc-wm8523-objs := wm8523.o -snd-soc-wm8580-objs := wm8580.o -snd-soc-wm8711-objs := wm8711.o -snd-soc-wm8727-objs := wm8727.o -snd-soc-wm8728-objs := wm8728.o -snd-soc-wm8731-objs := wm8731.o -snd-soc-wm8737-objs := wm8737.o -snd-soc-wm8741-objs := wm8741.o -snd-soc-wm8750-objs := wm8750.o -snd-soc-wm8753-objs := wm8753.o -snd-soc-wm8770-objs := wm8770.o -snd-soc-wm8776-objs := wm8776.o -snd-soc-wm8782-objs := wm8782.o -snd-soc-wm8804-objs := wm8804.o -snd-soc-wm8804-i2c-objs := wm8804-i2c.o -snd-soc-wm8804-spi-objs := wm8804-spi.o -snd-soc-wm8900-objs := wm8900.o -snd-soc-wm8903-objs := wm8903.o -snd-soc-wm8904-objs := wm8904.o -snd-soc-wm8996-objs := wm8996.o -snd-soc-wm8940-objs := wm8940.o -snd-soc-wm8955-objs := wm8955.o -snd-soc-wm8960-objs := wm8960.o -snd-soc-wm8961-objs := wm8961.o -snd-soc-wm8962-objs := wm8962.o -snd-soc-wm8971-objs := wm8971.o -snd-soc-wm8974-objs := wm8974.o -snd-soc-wm8978-objs := wm8978.o -snd-soc-wm8983-objs := wm8983.o -snd-soc-wm8985-objs := wm8985.o -snd-soc-wm8988-objs := wm8988.o -snd-soc-wm8990-objs := wm8990.o -snd-soc-wm8991-objs := wm8991.o -snd-soc-wm8993-objs := wm8993.o -snd-soc-wm8994-objs := wm8994.o wm8958-dsp2.o -snd-soc-wm8995-objs := wm8995.o -snd-soc-wm8997-objs := wm8997.o -snd-soc-wm8998-objs := wm8998.o -snd-soc-wm9081-objs := wm9081.o -snd-soc-wm9090-objs := wm9090.o -snd-soc-wm9705-objs := wm9705.o -snd-soc-wm9712-objs := wm9712.o -snd-soc-wm9713-objs := wm9713.o -snd-soc-wm-hubs-objs := wm_hubs.o - -# Amp -snd-soc-max9877-objs := max9877.o -snd-soc-tpa6130a2-objs := tpa6130a2.o -snd-soc-tas2552-objs := tas2552.o - -obj-$(CONFIG_SND_SOC_88PM860X) += snd-soc-88pm860x.o -obj-$(CONFIG_SND_SOC_AB8500_CODEC) += snd-soc-ab8500-codec.o -obj-$(CONFIG_SND_SOC_AC97_CODEC) += snd-soc-ac97.o -obj-$(CONFIG_SND_SOC_AD1836) += snd-soc-ad1836.o -obj-$(CONFIG_SND_SOC_AD193X) += snd-soc-ad193x.o -obj-$(CONFIG_SND_SOC_AD193X_SPI) += snd-soc-ad193x-spi.o -obj-$(CONFIG_SND_SOC_AD193X_I2C) += snd-soc-ad193x-i2c.o -obj-$(CONFIG_SND_SOC_AD1980) += snd-soc-ad1980.o -obj-$(CONFIG_SND_SOC_AD73311) += snd-soc-ad73311.o -obj-$(CONFIG_SND_SOC_ADAU1373) += snd-soc-adau1373.o -obj-$(CONFIG_SND_SOC_ADAU1701) += snd-soc-adau1701.o -obj-$(CONFIG_SND_SOC_ADAU17X1) += snd-soc-adau17x1.o -obj-$(CONFIG_SND_SOC_ADAU1761) += snd-soc-adau1761.o -obj-$(CONFIG_SND_SOC_ADAU1761_I2C) += snd-soc-adau1761-i2c.o -obj-$(CONFIG_SND_SOC_ADAU1761_SPI) += snd-soc-adau1761-spi.o -obj-$(CONFIG_SND_SOC_ADAU1781) += snd-soc-adau1781.o -obj-$(CONFIG_SND_SOC_ADAU1781_I2C) += snd-soc-adau1781-i2c.o -obj-$(CONFIG_SND_SOC_ADAU1781_SPI) += snd-soc-adau1781-spi.o -obj-$(CONFIG_SND_SOC_ADAU1977) += snd-soc-adau1977.o -obj-$(CONFIG_SND_SOC_ADAU1977_SPI) += snd-soc-adau1977-spi.o -obj-$(CONFIG_SND_SOC_ADAU1977_I2C) += snd-soc-adau1977-i2c.o -obj-$(CONFIG_SND_SOC_ADAV80X) += snd-soc-adav80x.o -obj-$(CONFIG_SND_SOC_ADAV801) += snd-soc-adav801.o -obj-$(CONFIG_SND_SOC_ADAV803) += snd-soc-adav803.o -obj-$(CONFIG_SND_SOC_ADS117X) += snd-soc-ads117x.o -obj-$(CONFIG_SND_SOC_AK4104) += snd-soc-ak4104.o -obj-$(CONFIG_SND_SOC_AK4535) += snd-soc-ak4535.o -obj-$(CONFIG_SND_SOC_AK4554) += snd-soc-ak4554.o -obj-$(CONFIG_SND_SOC_AK4613) += snd-soc-ak4613.o -obj-$(CONFIG_SND_SOC_AK4641) += snd-soc-ak4641.o -obj-$(CONFIG_SND_SOC_AK4642) += snd-soc-ak4642.o -obj-$(CONFIG_SND_SOC_AK4671) += snd-soc-ak4671.o -obj-$(CONFIG_SND_SOC_AK5386) += snd-soc-ak5386.o -obj-$(CONFIG_SND_SOC_ALC5623) += snd-soc-alc5623.o -obj-$(CONFIG_SND_SOC_ALC5632) += snd-soc-alc5632.o -obj-$(CONFIG_SND_SOC_ARIZONA) += snd-soc-arizona.o -obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o -obj-$(CONFIG_SND_SOC_CIRRUS_PSIA) += snd-soc-cirrus-psia.o -obj-$(CONFIG_SND_SOC_CS35L32) += snd-soc-cs35l32.o -obj-$(CONFIG_SND_SOC_CS35L33) += snd-soc-cs35l33.o -obj-$(CONFIG_SND_SOC_CS35L34) += snd-soc-cs35l34.o -obj-$(CONFIG_SND_SOC_CS35L35) += snd-soc-cs35l35.o -obj-$(CONFIG_SND_SOC_CS35L41) += snd-soc-cs35l41.o -obj-$(CONFIG_SND_SOC_CS35L41_SPI) += snd-soc-cs35l41-spi.o -obj-$(CONFIG_SND_SOC_CS35L41_I2C) += snd-soc-cs35l41-i2c.o -obj-$(CONFIG_SND_SOC_CS35L36) += snd-soc-cs35l36.o -obj-$(CONFIG_SND_SOC_CS42L42) += snd-soc-cs42l42.o -obj-$(CONFIG_SND_SOC_CS42L51) += snd-soc-cs42l51.o -obj-$(CONFIG_SND_SOC_CS42L51_I2C) += snd-soc-cs42l51-i2c.o -obj-$(CONFIG_SND_SOC_CS42L52) += snd-soc-cs42l52.o -obj-$(CONFIG_SND_SOC_CS42L56) += snd-soc-cs42l56.o -obj-$(CONFIG_SND_SOC_CS42L73) += snd-soc-cs42l73.o -obj-$(CONFIG_SND_SOC_CS4265) += snd-soc-cs4265.o -obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o -obj-$(CONFIG_SND_SOC_CS4271) += snd-soc-cs4271.o -obj-$(CONFIG_SND_SOC_CS4271_I2C) += snd-soc-cs4271-i2c.o -obj-$(CONFIG_SND_SOC_CS4271_SPI) += snd-soc-cs4271-spi.o -obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o -obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o -obj-$(CONFIG_SND_SOC_CS4349) += snd-soc-cs4349.o -obj-$(CONFIG_SND_SOC_CS43130) += snd-soc-cs43130.o -obj-$(CONFIG_SND_SOC_CS47L24) += snd-soc-cs47l24.o -obj-$(CONFIG_SND_SOC_CS53L30) += snd-soc-cs53l30.o -obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o -obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o -obj-$(CONFIG_SND_SOC_DA7213) += snd-soc-da7213.o -obj-$(CONFIG_SND_SOC_DA7218) += snd-soc-da7218.o -obj-$(CONFIG_SND_SOC_DA7219) += snd-soc-da7219.o -obj-$(CONFIG_SND_SOC_DA732X) += snd-soc-da732x.o -obj-$(CONFIG_SND_SOC_DA9055) += snd-soc-da9055.o -obj-$(CONFIG_SND_SOC_BT_SCO) += snd-soc-bt-sco.o -obj-$(CONFIG_SND_SOC_DMIC) += snd-soc-dmic.o -obj-$(CONFIG_SND_SOC_ES8328) += snd-soc-es8328.o -obj-$(CONFIG_SND_SOC_ES8328_I2C)+= snd-soc-es8328-i2c.o -obj-$(CONFIG_SND_SOC_ES8328_SPI)+= snd-soc-es8328-spi.o -obj-$(CONFIG_SND_SOC_GTM601) += snd-soc-gtm601.o -obj-$(CONFIG_SND_SOC_HDAC_HDMI) += snd-soc-hdac-hdmi.o -obj-$(CONFIG_SND_SOC_ICS43432) += snd-soc-ics43432.o -obj-$(CONFIG_SND_SOC_INNO_RK3036) += snd-soc-inno-rk3036.o -obj-$(CONFIG_SND_SOC_ISABELLE) += snd-soc-isabelle.o -obj-$(CONFIG_SND_SOC_JZ4740_CODEC) += snd-soc-jz4740-codec.o -obj-$(CONFIG_SND_SOC_L3) += snd-soc-l3.o -obj-$(CONFIG_SND_SOC_LM4857) += snd-soc-lm4857.o -obj-$(CONFIG_SND_SOC_LM49453) += snd-soc-lm49453.o -obj-$(CONFIG_SND_SOC_MAX9768) += snd-soc-max9768.o -obj-$(CONFIG_SND_SOC_MAX98088) += snd-soc-max98088.o -obj-$(CONFIG_SND_SOC_MAX98090) += snd-soc-max98090.o -obj-$(CONFIG_SND_SOC_MAX98095) += snd-soc-max98095.o -obj-$(CONFIG_SND_SOC_MAX98357A) += snd-soc-max98357a.o -obj-$(CONFIG_SND_SOC_MAX9867) += snd-soc-max9867.o -obj-$(CONFIG_SND_SOC_MAX98925) += snd-soc-max98925.o -obj-$(CONFIG_SND_SOC_MAX98926) += snd-soc-max98926.o -obj-$(CONFIG_SND_SOC_MAX9850) += snd-soc-max9850.o -obj-$(CONFIG_SND_SOC_MC13783) += snd-soc-mc13783.o -obj-$(CONFIG_SND_SOC_ML26124) += snd-soc-ml26124.o -obj-$(CONFIG_SND_SOC_NAU8825) += snd-soc-nau8825.o -obj-$(CONFIG_SND_SOC_PCM1681) += snd-soc-pcm1681.o -obj-$(CONFIG_SND_SOC_PCM179X) += snd-soc-pcm179x-codec.o -obj-$(CONFIG_SND_SOC_PCM179X_I2C) += snd-soc-pcm179x-i2c.o -obj-$(CONFIG_SND_SOC_PCM179X_SPI) += snd-soc-pcm179x-spi.o -obj-$(CONFIG_SND_SOC_PCM3008) += snd-soc-pcm3008.o -obj-$(CONFIG_SND_SOC_PCM3168A) += snd-soc-pcm3168a.o -obj-$(CONFIG_SND_SOC_PCM3168A_I2C) += snd-soc-pcm3168a-i2c.o -obj-$(CONFIG_SND_SOC_PCM3168A_SPI) += snd-soc-pcm3168a-spi.o -obj-$(CONFIG_SND_SOC_PCM512x) += snd-soc-pcm512x.o -obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o -obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o -obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o -obj-$(CONFIG_SND_SOC_RL6347A) += snd-soc-rl6347a.o -obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o -obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o -obj-$(CONFIG_SND_SOC_RT5514) += snd-soc-rt5514.o -obj-$(CONFIG_SND_SOC_RT5616) += snd-soc-rt5616.o -obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o -obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o -obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o -obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o -obj-$(CONFIG_SND_SOC_RT5659) += snd-soc-rt5659.o -obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o -obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o -obj-$(CONFIG_SND_SOC_RT5677_SPI) += snd-soc-rt5677-spi.o -obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o -obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o -obj-$(CONFIG_SND_SOC_SIGMADSP_I2C) += snd-soc-sigmadsp-i2c.o -obj-$(CONFIG_SND_SOC_SIGMADSP_REGMAP) += snd-soc-sigmadsp-regmap.o -obj-$(CONFIG_SND_SOC_SI476X) += snd-soc-si476x.o -obj-$(CONFIG_SND_SOC_SN95031) +=snd-soc-sn95031.o -obj-$(CONFIG_SND_SOC_SPDIF) += snd-soc-spdif-rx.o snd-soc-spdif-tx.o -obj-$(CONFIG_SND_SOC_SSM2518) += snd-soc-ssm2518.o -obj-$(CONFIG_SND_SOC_SSM2602) += snd-soc-ssm2602.o -obj-$(CONFIG_SND_SOC_SSM2602_SPI) += snd-soc-ssm2602-spi.o -obj-$(CONFIG_SND_SOC_SSM2602_I2C) += snd-soc-ssm2602-i2c.o -obj-$(CONFIG_SND_SOC_SSM4567) += snd-soc-ssm4567.o -obj-$(CONFIG_SND_SOC_STA32X) += snd-soc-sta32x.o -obj-$(CONFIG_SND_SOC_STA350) += snd-soc-sta350.o -obj-$(CONFIG_SND_SOC_STA529) += snd-soc-sta529.o -obj-$(CONFIG_SND_SOC_STAC9766) += snd-soc-stac9766.o -obj-$(CONFIG_SND_SOC_STI_SAS) += snd-soc-sti-sas.o -obj-$(CONFIG_SND_SOC_TAS2552) += snd-soc-tas2552.o -obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o -obj-$(CONFIG_SND_SOC_TAS571X) += snd-soc-tas571x.o -obj-$(CONFIG_SND_SOC_TFA9879) += snd-soc-tfa9879.o -obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o -obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o -obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) += snd-soc-tlv320aic23-spi.o -obj-$(CONFIG_SND_SOC_TLV320AIC26) += snd-soc-tlv320aic26.o -obj-$(CONFIG_SND_SOC_TLV320AIC31XX) += snd-soc-tlv320aic31xx.o -obj-$(CONFIG_SND_SOC_TLV320AIC32X4) += snd-soc-tlv320aic32x4.o -obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o -obj-$(CONFIG_SND_SOC_TLV320DAC33) += snd-soc-tlv320dac33.o -obj-$(CONFIG_SND_SOC_TS3A227E) += snd-soc-ts3a227e.o -obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o -obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o -obj-$(CONFIG_SND_SOC_UDA134X) += snd-soc-uda134x.o -obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o -obj-$(CONFIG_SND_SOC_WL1273) += snd-soc-wl1273.o -obj-$(CONFIG_SND_SOC_WM0010) += snd-soc-wm0010.o -obj-$(CONFIG_SND_SOC_WM1250_EV1) += snd-soc-wm1250-ev1.o -obj-$(CONFIG_SND_SOC_WM2000) += snd-soc-wm2000.o -obj-$(CONFIG_SND_SOC_WM2200) += snd-soc-wm2200.o -obj-$(CONFIG_SND_SOC_WM5100) += snd-soc-wm5100.o -obj-$(CONFIG_SND_SOC_WM5102) += snd-soc-wm5102.o -obj-$(CONFIG_SND_SOC_WM5110) += snd-soc-wm5110.o -obj-$(CONFIG_SND_SOC_WM8350) += snd-soc-wm8350.o -obj-$(CONFIG_SND_SOC_WM8400) += snd-soc-wm8400.o -obj-$(CONFIG_SND_SOC_WM8510) += snd-soc-wm8510.o -obj-$(CONFIG_SND_SOC_WM8523) += snd-soc-wm8523.o -obj-$(CONFIG_SND_SOC_WM8580) += snd-soc-wm8580.o -obj-$(CONFIG_SND_SOC_WM8711) += snd-soc-wm8711.o -obj-$(CONFIG_SND_SOC_WM8727) += snd-soc-wm8727.o -obj-$(CONFIG_SND_SOC_WM8728) += snd-soc-wm8728.o -obj-$(CONFIG_SND_SOC_WM8731) += snd-soc-wm8731.o -obj-$(CONFIG_SND_SOC_WM8737) += snd-soc-wm8737.o -obj-$(CONFIG_SND_SOC_WM8741) += snd-soc-wm8741.o -obj-$(CONFIG_SND_SOC_WM8750) += snd-soc-wm8750.o -obj-$(CONFIG_SND_SOC_WM8753) += snd-soc-wm8753.o -obj-$(CONFIG_SND_SOC_WM8770) += snd-soc-wm8770.o -obj-$(CONFIG_SND_SOC_WM8776) += snd-soc-wm8776.o -obj-$(CONFIG_SND_SOC_WM8782) += snd-soc-wm8782.o -obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.o -obj-$(CONFIG_SND_SOC_WM8804_I2C) += snd-soc-wm8804-i2c.o -obj-$(CONFIG_SND_SOC_WM8804_SPI) += snd-soc-wm8804-spi.o -obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o -obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o -obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o -obj-$(CONFIG_SND_SOC_WM8996) += snd-soc-wm8996.o -obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o -obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o -obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o -obj-$(CONFIG_SND_SOC_WM8961) += snd-soc-wm8961.o -obj-$(CONFIG_SND_SOC_WM8962) += snd-soc-wm8962.o -obj-$(CONFIG_SND_SOC_WM8971) += snd-soc-wm8971.o -obj-$(CONFIG_SND_SOC_WM8974) += snd-soc-wm8974.o -obj-$(CONFIG_SND_SOC_WM8978) += snd-soc-wm8978.o -obj-$(CONFIG_SND_SOC_WM8983) += snd-soc-wm8983.o -obj-$(CONFIG_SND_SOC_WM8985) += snd-soc-wm8985.o -obj-$(CONFIG_SND_SOC_WM8988) += snd-soc-wm8988.o -obj-$(CONFIG_SND_SOC_WM8990) += snd-soc-wm8990.o -obj-$(CONFIG_SND_SOC_WM8991) += snd-soc-wm8991.o -obj-$(CONFIG_SND_SOC_WM8993) += snd-soc-wm8993.o -obj-$(CONFIG_SND_SOC_WM8994) += snd-soc-wm8994.o -obj-$(CONFIG_SND_SOC_WM8995) += snd-soc-wm8995.o -obj-$(CONFIG_SND_SOC_WM8997) += snd-soc-wm8997.o -obj-$(CONFIG_SND_SOC_WM8998) += snd-soc-wm8998.o -obj-$(CONFIG_SND_SOC_WM9081) += snd-soc-wm9081.o -obj-$(CONFIG_SND_SOC_WM9090) += snd-soc-wm9090.o -obj-$(CONFIG_SND_SOC_WM9705) += snd-soc-wm9705.o -obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o -obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o -obj-$(CONFIG_SND_SOC_WM_ADSP) += snd-soc-wm-adsp.o -obj-$(CONFIG_SND_SOC_WM_HUBS) += snd-soc-wm-hubs.o - -# Amp -obj-$(CONFIG_SND_SOC_MAX9877) += snd-soc-max9877.o -obj-$(CONFIG_SND_SOC_TPA6130A2) += snd-soc-tpa6130a2.o diff --git a/techpack/audio/asoc/codecs/cs35l41/cs35l41-i2c.c b/techpack/audio/asoc/codecs/cs35l41/cs35l41-i2c.c deleted file mode 100755 index 7631de66daab..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/cs35l41-i2c.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * cs35l41-i2c.c -- CS35l41 I2C driver - * - * Copyright 2017 Cirrus Logic, Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: David Rhodes - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wm_adsp.h" -#include "cs35l41.h" -#include - -static struct regmap_config cs35l41_regmap_i2c = { - .reg_bits = 32, - .val_bits = 32, - .reg_stride = 4, - .reg_format_endian = REGMAP_ENDIAN_BIG, - .val_format_endian = REGMAP_ENDIAN_BIG, - .max_register = CS35L41_LASTREG, - .reg_defaults = cs35l41_reg, - .num_reg_defaults = ARRAY_SIZE(cs35l41_reg), - .volatile_reg = cs35l41_volatile_reg, - .readable_reg = cs35l41_readable_reg, - .precious_reg = cs35l41_precious_reg, - .cache_type = REGCACHE_RBTREE, -}; - -static const struct i2c_device_id cs35l41_id_i2c[] = { - {"cs35l40", 0}, - {"cs35l41", 0}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, cs35l41_id_i2c); - -static int cs35l41_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct cs35l41_private *cs35l41; - struct device *dev = &client->dev; - struct cs35l41_platform_data *pdata = dev_get_platdata(dev); - const struct regmap_config *regmap_config = &cs35l41_regmap_i2c; - int ret; - - - dev_info(dev, "cs35l41 i2c probe start\n"); - - cs35l41 = devm_kzalloc(dev, sizeof(struct cs35l41_private), GFP_KERNEL); - - if (cs35l41 == NULL) - return -ENOMEM; - - cs35l41->dev = dev; - cs35l41->irq = client->irq; - cs35l41->bus_spi = false; - - i2c_set_clientdata(client, cs35l41); - cs35l41->regmap = devm_regmap_init_i2c(client, regmap_config); - if (IS_ERR(cs35l41->regmap)) { - ret = PTR_ERR(cs35l41->regmap); - dev_err(cs35l41->dev, "Failed to allocate register map: %d\n", - ret); - return ret; - } - - return cs35l41_probe(cs35l41, pdata); -} - -static int cs35l41_i2c_remove(struct i2c_client *client) -{ - struct cs35l41_private *cs35l41 = i2c_get_clientdata(client); - - regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, 0xFFFFFFFF); - wm_adsp2_remove(&cs35l41->dsp); - regulator_bulk_disable(cs35l41->num_supplies, cs35l41->supplies); - snd_soc_unregister_codec(cs35l41->dev); - return 0; -} - -static const struct of_device_id cs35l41_of_match[] = { - {.compatible = "cirrus,cs35l40"}, - {.compatible = "cirrus,cs35l41"}, - {}, -}; -MODULE_DEVICE_TABLE(of, cs35l41_of_match); - -static struct i2c_driver cs35l41_i2c_driver = { - .driver = { - .name = "cs35l41", - .of_match_table = cs35l41_of_match, - }, - .id_table = cs35l41_id_i2c, - .probe = cs35l41_i2c_probe, - .remove = cs35l41_i2c_remove, -}; - -module_i2c_driver(cs35l41_i2c_driver); - -MODULE_DESCRIPTION("I2C CS35L41 driver"); -MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, "); -MODULE_LICENSE("GPL"); diff --git a/techpack/audio/asoc/codecs/cs35l41/cs35l41-spi.c b/techpack/audio/asoc/codecs/cs35l41/cs35l41-spi.c deleted file mode 100755 index 5cad9ea1d97a..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/cs35l41-spi.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * cs35l41-spi.c -- CS35l41 SPI driver - * - * Copyright 2017 Cirrus Logic, Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: David Rhodes - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wm_adsp.h" -#include "cs35l41.h" -#include - -static struct regmap_config cs35l41_regmap_spi = { - .reg_bits = 32, - .val_bits = 32, - .pad_bits = 16, - .reg_stride = 4, - .reg_format_endian = REGMAP_ENDIAN_BIG, - .val_format_endian = REGMAP_ENDIAN_BIG, - .max_register = CS35L41_LASTREG, - .reg_defaults = cs35l41_reg, - .num_reg_defaults = ARRAY_SIZE(cs35l41_reg), - .volatile_reg = cs35l41_volatile_reg, - .readable_reg = cs35l41_readable_reg, - .cache_type = REGCACHE_RBTREE, -}; - -static const struct spi_device_id cs35l41_id_spi[] = { - {"cs35l40", 0}, - {"cs35l41", 0}, - {} -}; - -MODULE_DEVICE_TABLE(spi, cs35l41_id_spi); - -static int cs35l41_spi_probe(struct spi_device *spi) -{ - const struct regmap_config *regmap_config = &cs35l41_regmap_spi; - struct cs35l41_platform_data *pdata = - dev_get_platdata(&spi->dev); - struct cs35l41_private *cs35l41; - int ret; - - cs35l41 = devm_kzalloc(&spi->dev, - sizeof(struct cs35l41_private), - GFP_KERNEL); - if (cs35l41 == NULL) - return -ENOMEM; - - spi_set_drvdata(spi, cs35l41); - cs35l41->regmap = devm_regmap_init_spi(spi, regmap_config); - if (IS_ERR(cs35l41->regmap)) { - ret = PTR_ERR(cs35l41->regmap); - dev_err(&spi->dev, "Failed to allocate register map: %d\n", - ret); - return ret; - } - - cs35l41->dev = &spi->dev; - cs35l41->irq = spi->irq; - - return cs35l41_probe(cs35l41, pdata); -} - -static int cs35l41_spi_remove(struct spi_device *spi) -{ - struct cs35l41_private *cs35l41 = spi_get_drvdata(spi); - - regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, 0xFFFFFFFF); - wm_adsp2_remove(&cs35l41->dsp); - regulator_bulk_disable(cs35l41->num_supplies, cs35l41->supplies); - snd_soc_unregister_codec(cs35l41->dev); - return 0; -} - -static const struct of_device_id cs35l41_of_match[] = { - {.compatible = "cirrus,cs35l40"}, - {.compatible = "cirrus,cs35l41"}, - {}, -}; -MODULE_DEVICE_TABLE(of, cs35l41_of_match); - -static struct spi_driver cs35l41_spi_driver = { - .driver = { - .name = "cs35l41", - .of_match_table = cs35l41_of_match, - }, - .id_table = cs35l41_id_spi, - .probe = cs35l41_spi_probe, - .remove = cs35l41_spi_remove, -}; - -module_spi_driver(cs35l41_spi_driver); - -MODULE_DESCRIPTION("SPI CS35L41 driver"); -MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, "); -MODULE_LICENSE("GPL"); diff --git a/techpack/audio/asoc/codecs/cs35l41/cs35l41-tables.c b/techpack/audio/asoc/codecs/cs35l41/cs35l41-tables.c deleted file mode 100755 index 8275754283e3..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/cs35l41-tables.c +++ /dev/null @@ -1,946 +0,0 @@ -/* - * cs35l41-tables.c -- CS35L41 ALSA SoC audio driver - * - * Copyright 2018 Cirrus Logic, Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: Brian Austin - * David Rhodes - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include "cs35l41.h" - -const struct reg_default cs35l41_reg[CS35L41_MAX_CACHE_REG] = { - {CS35L41_TEST_KEY_CTL, 0x00000000}, - {CS35L41_USER_KEY_CTL, 0x00000000}, - {CS35L41_OTP_CTRL0, 0x00006418}, - {CS35L41_OTP_CTRL1, 0x00000000}, - {CS35L41_OTP_CTRL3, 0x00000000}, - {CS35L41_OTP_CTRL4, 0x00000000}, - {CS35L41_OTP_CTRL5, 0x00000030}, - {CS35L41_OTP_CTRL6, 0x00000000}, - {CS35L41_OTP_CTRL7, 0x00000000}, - {CS35L41_OTP_CTRL8, 0x00000000}, - {CS35L41_PWR_CTRL1, 0x00000000}, - {CS35L41_PWR_CTRL3, 0x01000010}, - {CS35L41_CTRL_OVRRIDE, 0x00000002}, - {CS35L41_AMP_OUT_MUTE, 0x00000000}, - {CS35L41_PROTECT_REL_ERR_IGN, 0x00000000}, - {CS35L41_GPIO_PAD_CONTROL, 0x00000000}, - {CS35L41_JTAG_CONTROL, 0x00000000}, - {CS35L41_PLL_CLK_CTRL, 0x00000010}, - {CS35L41_DSP_CLK_CTRL, 0x00000003}, - {CS35L41_GLOBAL_CLK_CTRL, 0x00000003}, - {CS35L41_DATA_FS_SEL, 0x00000000}, - {CS35L41_MDSYNC_EN, 0x00000200}, - {CS35L41_MDSYNC_TX_ID, 0x00000000}, - {CS35L41_MDSYNC_PWR_CTRL, 0x00000002}, - {CS35L41_MDSYNC_DATA_TX, 0x00000000}, - {CS35L41_MDSYNC_TX_STATUS, 0x00000002}, - {CS35L41_MDSYNC_DATA_RX, 0x00000000}, - {CS35L41_MDSYNC_RX_STATUS, 0x00000002}, - {CS35L41_MDSYNC_ERR_STATUS, 0x00000000}, - {CS35L41_MDSYNC_SYNC_PTE2, 0x00000000}, - {CS35L41_MDSYNC_SYNC_PTE3, 0x00000000}, - {CS35L41_MDSYNC_SYNC_MSM_STATUS, 0x00000000}, - {CS35L41_BSTCVRT_VCTRL1, 0x00000000}, - {CS35L41_BSTCVRT_VCTRL2, 0x00000001}, - {CS35L41_BSTCVRT_PEAK_CUR, 0x0000004A}, - {CS35L41_BSTCVRT_SFT_RAMP, 0x00000003}, - {CS35L41_BSTCVRT_COEFF, 0x00002424}, - {CS35L41_BSTCVRT_SLOPE_LBST, 0x00007500}, - {CS35L41_BSTCVRT_SW_FREQ, 0x01008000}, - {CS35L41_BSTCVRT_DCM_CTRL, 0x00002001}, - {CS35L41_BSTCVRT_DCM_MODE_FORCE, 0x00000000}, - {CS35L41_BSTCVRT_OVERVOLT_CTRL, 0x00000130}, - {CS35L41_VI_VOL_POL, 0x08000800}, - {CS35L41_DTEMP_WARN_THLD, 0x00000002}, - {CS35L41_DTEMP_EN, 0x00000000}, - {CS35L41_VPVBST_FS_SEL, 0x00000001}, - {CS35L41_SP_ENABLES, 0x00000000}, - {CS35L41_SP_RATE_CTRL, 0x00000028}, - {CS35L41_SP_FORMAT, 0x10100200}, - {CS35L41_SP_HIZ_CTRL, 0x00000002}, - {CS35L41_SP_FRAME_TX_SLOT, 0x03020100}, - {CS35L41_SP_FRAME_RX_SLOT, 0x00000100}, - {CS35L41_SP_TX_WL, 0x00000010}, - {CS35L41_SP_RX_WL, 0x00000018}, - {CS35L41_DAC_PCM1_SRC, 0x00000008}, - {CS35L41_ASP_TX1_SRC, 0x00000018}, - {CS35L41_ASP_TX2_SRC, 0x00000019}, - {CS35L41_ASP_TX3_SRC, 0x00000020}, - {CS35L41_ASP_TX4_SRC, 0x00000021}, - {CS35L41_DSP1_RX1_SRC, 0x00000008}, - {CS35L41_DSP1_RX2_SRC, 0x00000009}, - {CS35L41_DSP1_RX3_SRC, 0x00000018}, - {CS35L41_DSP1_RX4_SRC, 0x00000019}, - {CS35L41_DSP1_RX5_SRC, 0x00000020}, - {CS35L41_DSP1_RX6_SRC, 0x00000021}, - {CS35L41_DSP1_RX7_SRC, 0x0000003A}, - {CS35L41_DSP1_RX8_SRC, 0x00000001}, - {CS35L41_NGATE1_SRC, 0x00000008}, - {CS35L41_NGATE2_SRC, 0x00000009}, - {CS35L41_AMP_DIG_VOL_CTRL, 0x00008000}, - {CS35L41_VPBR_CFG, 0x02AA1905}, - {CS35L41_VBBR_CFG, 0x02AA1905}, - {CS35L41_VPBR_STATUS, 0x00000000}, - {CS35L41_VBBR_STATUS, 0x00000000}, - {CS35L41_OVERTEMP_CFG, 0x00000001}, - {CS35L41_AMP_ERR_VOL, 0x00000000}, - {CS35L41_VOL_STATUS_TO_DSP, 0x00000000}, - {CS35L41_CLASSH_CFG, 0x000B0405}, - {CS35L41_WKFET_CFG, 0x00000111}, - {CS35L41_NG_CFG, 0x00000033}, - {CS35L41_AMP_GAIN_CTRL, 0x00000273}, - {CS35L41_DAC_MSM_CFG, 0x00580000}, - {CS35L41_GPIO1_CTRL1, 0xE1000001}, - {CS35L41_GPIO2_CTRL1, 0xE1000001}, - {CS35L41_MIXER_NGATE_CFG, 0x00000000}, - {CS35L41_MIXER_NGATE_CH1_CFG, 0x00000303}, - {CS35L41_MIXER_NGATE_CH2_CFG, 0x00000303}, - {CS35L41_CLOCK_DETECT_1, 0x00000000}, - {CS35L41_TIMER1_CONTROL, 0x00000000}, - {CS35L41_TIMER1_COUNT_PRESET, 0x00000000}, - {CS35L41_TIMER1_START_STOP, 0x00000000}, - {CS35L41_TIMER1_STATUS, 0x00000000}, - {CS35L41_TIMER1_COUNT_READBACK, 0x00000000}, - {CS35L41_TIMER1_DSP_CLK_CFG, 0x00000000}, - {CS35L41_TIMER1_DSP_CLK_STATUS, 0x00000000}, - {CS35L41_TIMER2_CONTROL, 0x00000000}, - {CS35L41_TIMER2_COUNT_PRESET, 0x00000000}, - {CS35L41_TIMER2_START_STOP, 0x00000000}, - {CS35L41_TIMER2_STATUS, 0x00000000}, - {CS35L41_TIMER2_COUNT_READBACK, 0x00000000}, - {CS35L41_TIMER2_DSP_CLK_CFG, 0x00000000}, - {CS35L41_TIMER2_DSP_CLK_STATUS, 0x00000000}, - {CS35L41_DFT_JTAG_CONTROL, 0x00000000}, - {CS35L41_DIE_STS1, 0x00000000}, - {CS35L41_DIE_STS2, 0x00000000}, - {CS35L41_TEMP_CAL1, 0x00000000}, - {CS35L41_TEMP_CAL2, 0x00000000}, -}; - -bool cs35l41_readable_reg(struct device *dev, unsigned int reg) -{ - switch (reg) { - case CS35L41_DEVID: - case CS35L41_REVID: - case CS35L41_FABID: - case CS35L41_RELID: - case CS35L41_OTPID: - case CS35L41_TEST_KEY_CTL: - case CS35L41_USER_KEY_CTL: - case CS35L41_OTP_CTRL0: - case CS35L41_OTP_CTRL3: - case CS35L41_OTP_CTRL4: - case CS35L41_OTP_CTRL5: - case CS35L41_OTP_CTRL6: - case CS35L41_OTP_CTRL7: - case CS35L41_OTP_CTRL8: - case CS35L41_PWR_CTRL1: - case CS35L41_PWR_CTRL2: - case CS35L41_PWR_CTRL3: - case CS35L41_CTRL_OVRRIDE: - case CS35L41_AMP_OUT_MUTE: - case CS35L41_PROTECT_REL_ERR_IGN: - case CS35L41_GPIO_PAD_CONTROL: - case CS35L41_JTAG_CONTROL: - case CS35L41_PLL_CLK_CTRL: - case CS35L41_DSP_CLK_CTRL: - case CS35L41_GLOBAL_CLK_CTRL: - case CS35L41_DATA_FS_SEL: - case CS35L41_MDSYNC_EN: - case CS35L41_MDSYNC_TX_ID: - case CS35L41_MDSYNC_PWR_CTRL: - case CS35L41_MDSYNC_DATA_TX: - case CS35L41_MDSYNC_TX_STATUS: - case CS35L41_MDSYNC_DATA_RX: - case CS35L41_MDSYNC_RX_STATUS: - case CS35L41_MDSYNC_ERR_STATUS: - case CS35L41_MDSYNC_SYNC_PTE2: - case CS35L41_MDSYNC_SYNC_PTE3: - case CS35L41_MDSYNC_SYNC_MSM_STATUS: - case CS35L41_BSTCVRT_VCTRL1: - case CS35L41_BSTCVRT_VCTRL2: - case CS35L41_BSTCVRT_PEAK_CUR: - case CS35L41_BSTCVRT_SFT_RAMP: - case CS35L41_BSTCVRT_COEFF: - case CS35L41_BSTCVRT_SLOPE_LBST: - case CS35L41_BSTCVRT_SW_FREQ: - case CS35L41_BSTCVRT_DCM_CTRL: - case CS35L41_BSTCVRT_DCM_MODE_FORCE: - case CS35L41_BSTCVRT_OVERVOLT_CTRL: - case CS35L41_VI_VOL_POL: - case CS35L41_DTEMP_WARN_THLD: - case CS35L41_DTEMP_CFG: - case CS35L41_DTEMP_EN: - case CS35L41_VPVBST_FS_SEL: - case CS35L41_SP_ENABLES: - case CS35L41_SP_RATE_CTRL: - case CS35L41_SP_FORMAT: - case CS35L41_SP_HIZ_CTRL: - case CS35L41_SP_FRAME_TX_SLOT: - case CS35L41_SP_FRAME_RX_SLOT: - case CS35L41_SP_TX_WL: - case CS35L41_SP_RX_WL: - case CS35L41_DAC_PCM1_SRC: - case CS35L41_ASP_TX1_SRC: - case CS35L41_ASP_TX2_SRC: - case CS35L41_ASP_TX3_SRC: - case CS35L41_ASP_TX4_SRC: - case CS35L41_DSP1_RX1_SRC: - case CS35L41_DSP1_RX2_SRC: - case CS35L41_DSP1_RX3_SRC: - case CS35L41_DSP1_RX4_SRC: - case CS35L41_DSP1_RX5_SRC: - case CS35L41_DSP1_RX6_SRC: - case CS35L41_DSP1_RX7_SRC: - case CS35L41_DSP1_RX8_SRC: - case CS35L41_NGATE1_SRC: - case CS35L41_NGATE2_SRC: - case CS35L41_AMP_DIG_VOL_CTRL: - case CS35L41_VPBR_CFG: - case CS35L41_VBBR_CFG: - case CS35L41_VPBR_STATUS: - case CS35L41_VBBR_STATUS: - case CS35L41_OVERTEMP_CFG: - case CS35L41_AMP_ERR_VOL: - case CS35L41_VOL_STATUS_TO_DSP: - case CS35L41_CLASSH_CFG: - case CS35L41_WKFET_CFG: - case CS35L41_NG_CFG: - case CS35L41_AMP_GAIN_CTRL: - case CS35L41_DAC_MSM_CFG: - case CS35L41_IRQ1_CFG: - case CS35L41_IRQ1_STATUS: - case CS35L41_IRQ1_STATUS1: - case CS35L41_IRQ1_STATUS2: - case CS35L41_IRQ1_STATUS3: - case CS35L41_IRQ1_STATUS4: - case CS35L41_IRQ1_RAW_STATUS1: - case CS35L41_IRQ1_RAW_STATUS2: - case CS35L41_IRQ1_RAW_STATUS3: - case CS35L41_IRQ1_RAW_STATUS4: - case CS35L41_IRQ1_MASK1: - case CS35L41_IRQ1_MASK2: - case CS35L41_IRQ1_MASK3: - case CS35L41_IRQ1_MASK4: - case CS35L41_IRQ1_FRC1: - case CS35L41_IRQ1_FRC2: - case CS35L41_IRQ1_FRC3: - case CS35L41_IRQ1_FRC4: - case CS35L41_IRQ1_EDGE1: - case CS35L41_IRQ1_EDGE4: - case CS35L41_IRQ1_POL1: - case CS35L41_IRQ1_POL2: - case CS35L41_IRQ1_POL3: - case CS35L41_IRQ1_POL4: - case CS35L41_IRQ1_DB3: - case CS35L41_IRQ2_CFG: - case CS35L41_IRQ2_STATUS: - case CS35L41_IRQ2_STATUS1: - case CS35L41_IRQ2_STATUS2: - case CS35L41_IRQ2_STATUS3: - case CS35L41_IRQ2_STATUS4: - case CS35L41_IRQ2_RAW_STATUS1: - case CS35L41_IRQ2_RAW_STATUS2: - case CS35L41_IRQ2_RAW_STATUS3: - case CS35L41_IRQ2_RAW_STATUS4: - case CS35L41_IRQ2_MASK1: - case CS35L41_IRQ2_MASK2: - case CS35L41_IRQ2_MASK3: - case CS35L41_IRQ2_MASK4: - case CS35L41_IRQ2_FRC1: - case CS35L41_IRQ2_FRC2: - case CS35L41_IRQ2_FRC3: - case CS35L41_IRQ2_FRC4: - case CS35L41_IRQ2_EDGE1: - case CS35L41_IRQ2_EDGE4: - case CS35L41_IRQ2_POL1: - case CS35L41_IRQ2_POL2: - case CS35L41_IRQ2_POL3: - case CS35L41_IRQ2_POL4: - case CS35L41_IRQ2_DB3: - case CS35L41_GPIO_STATUS1: - case CS35L41_GPIO1_CTRL1: - case CS35L41_GPIO2_CTRL1: - case CS35L41_MIXER_NGATE_CFG: - case CS35L41_MIXER_NGATE_CH1_CFG: - case CS35L41_MIXER_NGATE_CH2_CFG: - case CS35L41_DSP_MBOX_1 ... CS35L41_DSP_VIRT2_MBOX_8: - case CS35L41_CLOCK_DETECT_1: - case CS35L41_TIMER1_CONTROL: - case CS35L41_TIMER1_COUNT_PRESET: - case CS35L41_TIMER1_STATUS: - case CS35L41_TIMER1_COUNT_READBACK: - case CS35L41_TIMER1_DSP_CLK_CFG: - case CS35L41_TIMER1_DSP_CLK_STATUS: - case CS35L41_TIMER2_CONTROL: - case CS35L41_TIMER2_COUNT_PRESET: - case CS35L41_TIMER2_STATUS: - case CS35L41_TIMER2_COUNT_READBACK: - case CS35L41_TIMER2_DSP_CLK_CFG: - case CS35L41_TIMER2_DSP_CLK_STATUS: - case CS35L41_DFT_JTAG_CONTROL: - case CS35L41_DIE_STS1: - case CS35L41_DIE_STS2: - case CS35L41_TEMP_CAL1: - case CS35L41_TEMP_CAL2: - case CS35L41_DSP1_TIMESTAMP_COUNT: - case CS35L41_DSP1_SYS_ID: - case CS35L41_DSP1_SYS_VERSION: - case CS35L41_DSP1_SYS_CORE_ID: - case CS35L41_DSP1_SYS_AHB_ADDR: - case CS35L41_DSP1_SYS_XSRAM_SIZE: - case CS35L41_DSP1_SYS_YSRAM_SIZE: - case CS35L41_DSP1_SYS_PSRAM_SIZE: - case CS35L41_DSP1_SYS_PM_BOOT_SIZE: - case CS35L41_DSP1_SYS_FEATURES: - case CS35L41_DSP1_SYS_FIR_FILTERS: - case CS35L41_DSP1_SYS_LMS_FILTERS: - case CS35L41_DSP1_SYS_XM_BANK_SIZE: - case CS35L41_DSP1_SYS_YM_BANK_SIZE: - case CS35L41_DSP1_SYS_PM_BANK_SIZE: - case CS35L41_DSP1_AHBM_WIN0_CTRL0: - case CS35L41_DSP1_AHBM_WIN0_CTRL1: - case CS35L41_DSP1_AHBM_WIN1_CTRL0: - case CS35L41_DSP1_AHBM_WIN1_CTRL1: - case CS35L41_DSP1_AHBM_WIN2_CTRL0: - case CS35L41_DSP1_AHBM_WIN2_CTRL1: - case CS35L41_DSP1_AHBM_WIN3_CTRL0: - case CS35L41_DSP1_AHBM_WIN3_CTRL1: - case CS35L41_DSP1_AHBM_WIN4_CTRL0: - case CS35L41_DSP1_AHBM_WIN4_CTRL1: - case CS35L41_DSP1_AHBM_WIN5_CTRL0: - case CS35L41_DSP1_AHBM_WIN5_CTRL1: - case CS35L41_DSP1_AHBM_WIN6_CTRL0: - case CS35L41_DSP1_AHBM_WIN6_CTRL1: - case CS35L41_DSP1_AHBM_WIN7_CTRL0: - case CS35L41_DSP1_AHBM_WIN7_CTRL1: - case CS35L41_DSP1_AHBM_WIN_DBG_CTRL0: - case CS35L41_DSP1_AHBM_WIN_DBG_CTRL1: - case CS35L41_DSP1_DEBUG: - case CS35L41_DSP1_TIMER_CTRL: - case CS35L41_DSP1_RX1_RATE: - case CS35L41_DSP1_RX2_RATE: - case CS35L41_DSP1_RX3_RATE: - case CS35L41_DSP1_RX4_RATE: - case CS35L41_DSP1_RX5_RATE: - case CS35L41_DSP1_RX6_RATE: - case CS35L41_DSP1_RX7_RATE: - case CS35L41_DSP1_RX8_RATE: - case CS35L41_DSP1_TX1_RATE: - case CS35L41_DSP1_TX2_RATE: - case CS35L41_DSP1_TX3_RATE: - case CS35L41_DSP1_TX4_RATE: - case CS35L41_DSP1_TX5_RATE: - case CS35L41_DSP1_TX6_RATE: - case CS35L41_DSP1_TX7_RATE: - case CS35L41_DSP1_TX8_RATE: - case CS35L41_DSP1_NMI_CTRL1: - case CS35L41_DSP1_NMI_CTRL2: - case CS35L41_DSP1_NMI_CTRL3: - case CS35L41_DSP1_NMI_CTRL4: - case CS35L41_DSP1_NMI_CTRL5: - case CS35L41_DSP1_NMI_CTRL6: - case CS35L41_DSP1_NMI_CTRL7: - case CS35L41_DSP1_NMI_CTRL8: - case CS35L41_DSP1_RESUME_CTRL: - case CS35L41_DSP1_IRQ1_CTRL: - case CS35L41_DSP1_IRQ2_CTRL: - case CS35L41_DSP1_IRQ3_CTRL: - case CS35L41_DSP1_IRQ4_CTRL: - case CS35L41_DSP1_IRQ5_CTRL: - case CS35L41_DSP1_IRQ6_CTRL: - case CS35L41_DSP1_IRQ7_CTRL: - case CS35L41_DSP1_IRQ8_CTRL: - case CS35L41_DSP1_IRQ9_CTRL: - case CS35L41_DSP1_IRQ10_CTRL: - case CS35L41_DSP1_IRQ11_CTRL: - case CS35L41_DSP1_IRQ12_CTRL: - case CS35L41_DSP1_IRQ13_CTRL: - case CS35L41_DSP1_IRQ14_CTRL: - case CS35L41_DSP1_IRQ15_CTRL: - case CS35L41_DSP1_IRQ16_CTRL: - case CS35L41_DSP1_IRQ17_CTRL: - case CS35L41_DSP1_IRQ18_CTRL: - case CS35L41_DSP1_IRQ19_CTRL: - case CS35L41_DSP1_IRQ20_CTRL: - case CS35L41_DSP1_IRQ21_CTRL: - case CS35L41_DSP1_IRQ22_CTRL: - case CS35L41_DSP1_IRQ23_CTRL: - case CS35L41_DSP1_SCRATCH1: - case CS35L41_DSP1_SCRATCH2: - case CS35L41_DSP1_SCRATCH3: - case CS35L41_DSP1_SCRATCH4: - case CS35L41_DSP1_CCM_CORE_CTRL: - case CS35L41_DSP1_CCM_CLK_OVERRIDE: - case CS35L41_DSP1_XM_MSTR_EN: - case CS35L41_DSP1_XM_CORE_PRI: - case CS35L41_DSP1_XM_AHB_PACK_PL_PRI: - case CS35L41_DSP1_XM_AHB_UP_PL_PRI: - case CS35L41_DSP1_XM_ACCEL_PL0_PRI: - case CS35L41_DSP1_XM_NPL0_PRI: - case CS35L41_DSP1_YM_MSTR_EN: - case CS35L41_DSP1_YM_CORE_PRI: - case CS35L41_DSP1_YM_AHB_PACK_PL_PRI: - case CS35L41_DSP1_YM_AHB_UP_PL_PRI: - case CS35L41_DSP1_YM_ACCEL_PL0_PRI: - case CS35L41_DSP1_YM_NPL0_PRI: - case CS35L41_DSP1_PM_MSTR_EN: - case CS35L41_DSP1_PM_PATCH0_ADDR: - case CS35L41_DSP1_PM_PATCH0_EN: - case CS35L41_DSP1_PM_PATCH0_DATA_LO: - case CS35L41_DSP1_PM_PATCH0_DATA_HI: - case CS35L41_DSP1_PM_PATCH1_ADDR: - case CS35L41_DSP1_PM_PATCH1_EN: - case CS35L41_DSP1_PM_PATCH1_DATA_LO: - case CS35L41_DSP1_PM_PATCH1_DATA_HI: - case CS35L41_DSP1_PM_PATCH2_ADDR: - case CS35L41_DSP1_PM_PATCH2_EN: - case CS35L41_DSP1_PM_PATCH2_DATA_LO: - case CS35L41_DSP1_PM_PATCH2_DATA_HI: - case CS35L41_DSP1_PM_PATCH3_ADDR: - case CS35L41_DSP1_PM_PATCH3_EN: - case CS35L41_DSP1_PM_PATCH3_DATA_LO: - case CS35L41_DSP1_PM_PATCH3_DATA_HI: - case CS35L41_DSP1_PM_PATCH4_ADDR: - case CS35L41_DSP1_PM_PATCH4_EN: - case CS35L41_DSP1_PM_PATCH4_DATA_LO: - case CS35L41_DSP1_PM_PATCH4_DATA_HI: - case CS35L41_DSP1_PM_PATCH5_ADDR: - case CS35L41_DSP1_PM_PATCH5_EN: - case CS35L41_DSP1_PM_PATCH5_DATA_LO: - case CS35L41_DSP1_PM_PATCH5_DATA_HI: - case CS35L41_DSP1_PM_PATCH6_ADDR: - case CS35L41_DSP1_PM_PATCH6_EN: - case CS35L41_DSP1_PM_PATCH6_DATA_LO: - case CS35L41_DSP1_PM_PATCH6_DATA_HI: - case CS35L41_DSP1_PM_PATCH7_ADDR: - case CS35L41_DSP1_PM_PATCH7_EN: - case CS35L41_DSP1_PM_PATCH7_DATA_LO: - case CS35L41_DSP1_PM_PATCH7_DATA_HI: - case CS35L41_DSP1_MPU_XM_ACCESS0: - case CS35L41_DSP1_MPU_YM_ACCESS0: - case CS35L41_DSP1_MPU_WNDW_ACCESS0: - case CS35L41_DSP1_MPU_XREG_ACCESS0: - case CS35L41_DSP1_MPU_YREG_ACCESS0: - case CS35L41_DSP1_MPU_XM_ACCESS1: - case CS35L41_DSP1_MPU_YM_ACCESS1: - case CS35L41_DSP1_MPU_WNDW_ACCESS1: - case CS35L41_DSP1_MPU_XREG_ACCESS1: - case CS35L41_DSP1_MPU_YREG_ACCESS1: - case CS35L41_DSP1_MPU_XM_ACCESS2: - case CS35L41_DSP1_MPU_YM_ACCESS2: - case CS35L41_DSP1_MPU_WNDW_ACCESS2: - case CS35L41_DSP1_MPU_XREG_ACCESS2: - case CS35L41_DSP1_MPU_YREG_ACCESS2: - case CS35L41_DSP1_MPU_XM_ACCESS3: - case CS35L41_DSP1_MPU_YM_ACCESS3: - case CS35L41_DSP1_MPU_WNDW_ACCESS3: - case CS35L41_DSP1_MPU_XREG_ACCESS3: - case CS35L41_DSP1_MPU_YREG_ACCESS3: - case CS35L41_DSP1_MPU_XM_VIO_ADDR: - case CS35L41_DSP1_MPU_XM_VIO_STATUS: - case CS35L41_DSP1_MPU_YM_VIO_ADDR: - case CS35L41_DSP1_MPU_YM_VIO_STATUS: - case CS35L41_DSP1_MPU_PM_VIO_ADDR: - case CS35L41_DSP1_MPU_PM_VIO_STATUS: - case CS35L41_DSP1_MPU_LOCK_CONFIG: - case CS35L41_DSP1_MPU_WDT_RST_CTRL: - case CS35L41_DSP1_STRMARB_MSTR0_CFG0: - case CS35L41_DSP1_STRMARB_MSTR0_CFG1: - case CS35L41_DSP1_STRMARB_MSTR0_CFG2: - case CS35L41_DSP1_STRMARB_MSTR1_CFG0: - case CS35L41_DSP1_STRMARB_MSTR1_CFG1: - case CS35L41_DSP1_STRMARB_MSTR1_CFG2: - case CS35L41_DSP1_STRMARB_MSTR2_CFG0: - case CS35L41_DSP1_STRMARB_MSTR2_CFG1: - case CS35L41_DSP1_STRMARB_MSTR2_CFG2: - case CS35L41_DSP1_STRMARB_MSTR3_CFG0: - case CS35L41_DSP1_STRMARB_MSTR3_CFG1: - case CS35L41_DSP1_STRMARB_MSTR3_CFG2: - case CS35L41_DSP1_STRMARB_MSTR4_CFG0: - case CS35L41_DSP1_STRMARB_MSTR4_CFG1: - case CS35L41_DSP1_STRMARB_MSTR4_CFG2: - case CS35L41_DSP1_STRMARB_MSTR5_CFG0: - case CS35L41_DSP1_STRMARB_MSTR5_CFG1: - case CS35L41_DSP1_STRMARB_MSTR5_CFG2: - case CS35L41_DSP1_STRMARB_MSTR6_CFG0: - case CS35L41_DSP1_STRMARB_MSTR6_CFG1: - case CS35L41_DSP1_STRMARB_MSTR6_CFG2: - case CS35L41_DSP1_STRMARB_MSTR7_CFG0: - case CS35L41_DSP1_STRMARB_MSTR7_CFG1: - case CS35L41_DSP1_STRMARB_MSTR7_CFG2: - case CS35L41_DSP1_STRMARB_TX0_CFG0: - case CS35L41_DSP1_STRMARB_TX0_CFG1: - case CS35L41_DSP1_STRMARB_TX1_CFG0: - case CS35L41_DSP1_STRMARB_TX1_CFG1: - case CS35L41_DSP1_STRMARB_TX2_CFG0: - case CS35L41_DSP1_STRMARB_TX2_CFG1: - case CS35L41_DSP1_STRMARB_TX3_CFG0: - case CS35L41_DSP1_STRMARB_TX3_CFG1: - case CS35L41_DSP1_STRMARB_TX4_CFG0: - case CS35L41_DSP1_STRMARB_TX4_CFG1: - case CS35L41_DSP1_STRMARB_TX5_CFG0: - case CS35L41_DSP1_STRMARB_TX5_CFG1: - case CS35L41_DSP1_STRMARB_TX6_CFG0: - case CS35L41_DSP1_STRMARB_TX6_CFG1: - case CS35L41_DSP1_STRMARB_TX7_CFG0: - case CS35L41_DSP1_STRMARB_TX7_CFG1: - case CS35L41_DSP1_STRMARB_RX0_CFG0: - case CS35L41_DSP1_STRMARB_RX0_CFG1: - case CS35L41_DSP1_STRMARB_RX1_CFG0: - case CS35L41_DSP1_STRMARB_RX1_CFG1: - case CS35L41_DSP1_STRMARB_RX2_CFG0: - case CS35L41_DSP1_STRMARB_RX2_CFG1: - case CS35L41_DSP1_STRMARB_RX3_CFG0: - case CS35L41_DSP1_STRMARB_RX3_CFG1: - case CS35L41_DSP1_STRMARB_RX4_CFG0: - case CS35L41_DSP1_STRMARB_RX4_CFG1: - case CS35L41_DSP1_STRMARB_RX5_CFG0: - case CS35L41_DSP1_STRMARB_RX5_CFG1: - case CS35L41_DSP1_STRMARB_RX6_CFG0: - case CS35L41_DSP1_STRMARB_RX6_CFG1: - case CS35L41_DSP1_STRMARB_RX7_CFG0: - case CS35L41_DSP1_STRMARB_RX7_CFG1: - case CS35L41_DSP1_STRMARB_IRQ0_CFG0: - case CS35L41_DSP1_STRMARB_IRQ0_CFG1: - case CS35L41_DSP1_STRMARB_IRQ0_CFG2: - case CS35L41_DSP1_STRMARB_IRQ1_CFG0: - case CS35L41_DSP1_STRMARB_IRQ1_CFG1: - case CS35L41_DSP1_STRMARB_IRQ1_CFG2: - case CS35L41_DSP1_STRMARB_IRQ2_CFG0: - case CS35L41_DSP1_STRMARB_IRQ2_CFG1: - case CS35L41_DSP1_STRMARB_IRQ2_CFG2: - case CS35L41_DSP1_STRMARB_IRQ3_CFG0: - case CS35L41_DSP1_STRMARB_IRQ3_CFG1: - case CS35L41_DSP1_STRMARB_IRQ3_CFG2: - case CS35L41_DSP1_STRMARB_IRQ4_CFG0: - case CS35L41_DSP1_STRMARB_IRQ4_CFG1: - case CS35L41_DSP1_STRMARB_IRQ4_CFG2: - case CS35L41_DSP1_STRMARB_IRQ5_CFG0: - case CS35L41_DSP1_STRMARB_IRQ5_CFG1: - case CS35L41_DSP1_STRMARB_IRQ5_CFG2: - case CS35L41_DSP1_STRMARB_IRQ6_CFG0: - case CS35L41_DSP1_STRMARB_IRQ6_CFG1: - case CS35L41_DSP1_STRMARB_IRQ6_CFG2: - case CS35L41_DSP1_STRMARB_IRQ7_CFG0: - case CS35L41_DSP1_STRMARB_IRQ7_CFG1: - case CS35L41_DSP1_STRMARB_IRQ7_CFG2: - case CS35L41_DSP1_STRMARB_RESYNC_MSK: - case CS35L41_DSP1_STRMARB_ERR_STATUS: - case CS35L41_DSP1_INTPCTL_RES_STATIC: - case CS35L41_DSP1_INTPCTL_RES_DYN: - case CS35L41_DSP1_INTPCTL_NMI_CTRL: - case CS35L41_DSP1_INTPCTL_IRQ_INV: - case CS35L41_DSP1_INTPCTL_IRQ_MODE: - case CS35L41_DSP1_INTPCTL_IRQ_EN: - case CS35L41_DSP1_INTPCTL_IRQ_MSK: - case CS35L41_DSP1_INTPCTL_IRQ_ERR: - case CS35L41_DSP1_INTPCTL_IRQ_PEND: - case CS35L41_DSP1_INTPCTL_TESTBITS: - case CS35L41_DSP1_WDT_CONTROL: - case CS35L41_DSP1_WDT_STATUS: - case CS35L41_OTP_TRIM_1: - case CS35L41_OTP_TRIM_2: - case CS35L41_OTP_TRIM_3: - case CS35L41_OTP_TRIM_4: - case CS35L41_OTP_TRIM_5: - case CS35L41_OTP_TRIM_6: - case CS35L41_OTP_TRIM_7: - case CS35L41_OTP_TRIM_8: - case CS35L41_OTP_TRIM_9: - case CS35L41_OTP_TRIM_10: - case CS35L41_OTP_TRIM_11: - case CS35L41_OTP_TRIM_12: - case CS35L41_OTP_TRIM_13: - case CS35L41_OTP_TRIM_14: - case CS35L41_OTP_TRIM_15: - case CS35L41_OTP_TRIM_16: - case CS35L41_OTP_TRIM_17: - case CS35L41_OTP_TRIM_18: - case CS35L41_OTP_TRIM_19: - case CS35L41_OTP_TRIM_20: - case CS35L41_OTP_TRIM_21: - case CS35L41_OTP_TRIM_22: - case CS35L41_OTP_TRIM_23: - case CS35L41_OTP_TRIM_24: - case CS35L41_OTP_TRIM_25: - case CS35L41_OTP_TRIM_26: - case CS35L41_OTP_TRIM_27: - case CS35L41_OTP_TRIM_28: - case CS35L41_OTP_TRIM_29: - case CS35L41_OTP_TRIM_30: - case CS35L41_OTP_TRIM_31: - case CS35L41_OTP_TRIM_32: - case CS35L41_OTP_TRIM_33: - case CS35L41_OTP_TRIM_34: - case CS35L41_OTP_TRIM_35: - case CS35L41_OTP_TRIM_36: - case CS35L41_OTP_MEM0 ... CS35L41_OTP_MEM31: - case CS35L41_DSP1_XMEM_PACK_0 ... CS35L41_DSP1_XMEM_PACK_3068: - case CS35L41_DSP1_XMEM_UNPACK32_0 ... CS35L41_DSP1_XMEM_UNPACK32_2046: - case CS35L41_DSP1_XMEM_UNPACK24_0 ... CS35L41_DSP1_XMEM_UNPACK24_4093: - case CS35L41_DSP1_YMEM_PACK_0 ... CS35L41_DSP1_YMEM_PACK_1532: - case CS35L41_DSP1_YMEM_UNPACK32_0 ... CS35L41_DSP1_YMEM_UNPACK32_1022: - case CS35L41_DSP1_YMEM_UNPACK24_0 ... CS35L41_DSP1_YMEM_UNPACK24_2045: - case CS35L41_DSP1_PMEM_0 ... CS35L41_DSP1_PMEM_5114: - /*test regs*/ - case CS35L41_PLL_OVR: - case CS35L41_BST_TEST_DUTY: - case CS35L41_DIGPWM_IOCTRL: - return true; - default: - return false; - } -} - -bool cs35l41_precious_reg(struct device *dev, unsigned int reg) -{ - switch (reg) { - case CS35L41_OTP_MEM0 ... CS35L41_OTP_MEM31: - return true; - default: - return false; - } -} - -bool cs35l41_volatile_reg(struct device *dev, unsigned int reg) -{ - switch (reg) { - case CS35L41_DEVID: - case CS35L41_SFT_RESET: - case CS35L41_FABID: - case CS35L41_REVID: - case CS35L41_DTEMP_EN: - case CS35L41_IRQ1_STATUS: - case CS35L41_IRQ1_STATUS1: - case CS35L41_IRQ1_STATUS2: - case CS35L41_IRQ1_STATUS3: - case CS35L41_IRQ1_STATUS4: - case CS35L41_IRQ1_RAW_STATUS1: - case CS35L41_IRQ1_RAW_STATUS2: - case CS35L41_IRQ1_RAW_STATUS3: - case CS35L41_IRQ1_RAW_STATUS4: - case CS35L41_IRQ1_FRC1: - case CS35L41_IRQ1_FRC2: - case CS35L41_IRQ1_FRC3: - case CS35L41_IRQ1_FRC4: - case CS35L41_IRQ1_EDGE1: - case CS35L41_IRQ1_EDGE4: - case CS35L41_IRQ1_POL1: - case CS35L41_IRQ1_POL2: - case CS35L41_IRQ1_POL3: - case CS35L41_IRQ1_POL4: - case CS35L41_IRQ1_DB3: - case CS35L41_IRQ2_STATUS: - case CS35L41_IRQ2_STATUS1: - case CS35L41_IRQ2_STATUS2: - case CS35L41_IRQ2_STATUS3: - case CS35L41_IRQ2_STATUS4: - case CS35L41_IRQ2_RAW_STATUS1: - case CS35L41_IRQ2_RAW_STATUS2: - case CS35L41_IRQ2_RAW_STATUS3: - case CS35L41_IRQ2_RAW_STATUS4: - case CS35L41_IRQ2_FRC1: - case CS35L41_IRQ2_FRC2: - case CS35L41_IRQ2_FRC3: - case CS35L41_IRQ2_FRC4: - case CS35L41_IRQ2_EDGE1: - case CS35L41_IRQ2_EDGE4: - case CS35L41_IRQ2_POL1: - case CS35L41_IRQ2_POL2: - case CS35L41_IRQ2_POL3: - case CS35L41_IRQ2_POL4: - case CS35L41_IRQ2_DB3: - case CS35L41_GPIO_STATUS1: - case CS35L41_OTP_TRIM_1: - case CS35L41_OTP_TRIM_2: - case CS35L41_OTP_TRIM_3: - case CS35L41_OTP_TRIM_4: - case CS35L41_OTP_TRIM_5: - case CS35L41_OTP_TRIM_6: - case CS35L41_OTP_TRIM_7: - case CS35L41_OTP_TRIM_8: - case CS35L41_OTP_TRIM_9: - case CS35L41_OTP_TRIM_10: - case CS35L41_OTP_TRIM_11: - case CS35L41_OTP_TRIM_12: - case CS35L41_OTP_TRIM_13: - case CS35L41_OTP_TRIM_14: - case CS35L41_OTP_TRIM_15: - case CS35L41_OTP_TRIM_16: - case CS35L41_OTP_TRIM_17: - case CS35L41_OTP_TRIM_18: - case CS35L41_OTP_TRIM_19: - case CS35L41_OTP_TRIM_20: - case CS35L41_OTP_TRIM_21: - case CS35L41_OTP_TRIM_22: - case CS35L41_OTP_TRIM_23: - case CS35L41_OTP_TRIM_24: - case CS35L41_OTP_TRIM_25: - case CS35L41_OTP_TRIM_26: - case CS35L41_OTP_TRIM_27: - case CS35L41_OTP_TRIM_28: - case CS35L41_OTP_TRIM_29: - case CS35L41_OTP_TRIM_30: - case CS35L41_OTP_TRIM_31: - case CS35L41_OTP_TRIM_32: - case CS35L41_OTP_TRIM_33: - case CS35L41_OTP_TRIM_34: - case CS35L41_OTP_TRIM_35: - case CS35L41_OTP_TRIM_36: - case CS35L41_DSP_MBOX_1 ... CS35L41_DSP_VIRT2_MBOX_8: - case CS35L41_DSP1_XMEM_PACK_0 ... CS35L41_DSP1_XMEM_PACK_3068: - case CS35L41_DSP1_XMEM_UNPACK32_0 ... CS35L41_DSP1_XMEM_UNPACK32_2046: - case CS35L41_DSP1_XMEM_UNPACK24_0 ... CS35L41_DSP1_XMEM_UNPACK24_4093: - case CS35L41_DSP1_YMEM_PACK_0 ... CS35L41_DSP1_YMEM_PACK_1532: - case CS35L41_DSP1_YMEM_UNPACK32_0 ... CS35L41_DSP1_YMEM_UNPACK32_1022: - case CS35L41_DSP1_YMEM_UNPACK24_0 ... CS35L41_DSP1_YMEM_UNPACK24_2045: - case CS35L41_DSP1_PMEM_0 ... CS35L41_DSP1_PMEM_5114: - case CS35L41_DSP1_CCM_CORE_CTRL ... CS35L41_DSP1_WDT_STATUS: - case CS35L41_OTP_MEM0 ... CS35L41_OTP_MEM31: - return true; - default: - return false; - } -} - -static const struct cs35l41_otp_packed_element_t - otp_map_1[CS35L41_NUM_OTP_ELEM] = { - /* addr shift size */ - {0x00002030, 0, 4}, /*TRIM_OSC_FREQ_TRIM*/ - {0x00002030, 7, 1}, /*TRIM_OSC_TRIM_DONE*/ - {0x0000208c, 24, 6}, /*TST_DIGREG_VREF_TRIM*/ - {0x00002090, 14, 4}, /*TST_REF_TRIM*/ - {0x00002090, 10, 4}, /*TST_REF_TEMPCO_TRIM*/ - {0x0000300C, 11, 4}, /*PLL_LDOA_TST_VREF_TRIM*/ - {0x0000394C, 23, 2}, /*BST_ATEST_CM_VOFF*/ - {0x00003950, 0, 7}, /*BST_ATRIM_IADC_OFFSET*/ - {0x00003950, 8, 7}, /*BST_ATRIM_IADC_GAIN1*/ - {0x00003950, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET1*/ - {0x00003950, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN1*/ - {0x00003954, 0, 7}, /*BST_ATRIM_IADC_OFFSET2*/ - {0x00003954, 8, 7}, /*BST_ATRIM_IADC_GAIN2*/ - {0x00003954, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET2*/ - {0x00003954, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN2*/ - {0x00003958, 0, 7}, /*BST_ATRIM_IADC_OFFSET3*/ - {0x00003958, 8, 7}, /*BST_ATRIM_IADC_GAIN3*/ - {0x00003958, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET3*/ - {0x00003958, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN3*/ - {0x0000395C, 0, 7}, /*BST_ATRIM_IADC_OFFSET4*/ - {0x0000395C, 8, 7}, /*BST_ATRIM_IADC_GAIN4*/ - {0x0000395C, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET4*/ - {0x0000395C, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN4*/ - {0x0000416C, 0, 8}, /*VMON_GAIN_OTP_VAL*/ - {0x00004160, 0, 7}, /*VMON_OFFSET_OTP_VAL*/ - {0x0000416C, 8, 8}, /*IMON_GAIN_OTP_VAL*/ - {0x00004160, 16, 10}, /*IMON_OFFSET_OTP_VAL*/ - {0x0000416C, 16, 12}, /*VMON_CM_GAIN_OTP_VAL*/ - {0x0000416C, 28, 1}, /*VMON_CM_GAIN_SIGN_OTP_VAL*/ - {0x00004170, 0, 6}, /*IMON_CAL_TEMPCO_OTP_VAL*/ - {0x00004170, 6, 1}, /*IMON_CAL_TEMPCO_SIGN_OTP*/ - {0x00004170, 8, 6}, /*IMON_CAL_TEMPCO2_OTP_VAL*/ - {0x00004170, 14, 1}, /*IMON_CAL_TEMPCO2_DN_UPB_OTP_VAL*/ - {0x00004170, 16, 9}, /*IMON_CAL_TEMPCO_TBASE_OTP_VAL*/ - {0x00004360, 0, 5}, /*TEMP_GAIN_OTP_VAL*/ - {0x00004360, 6, 9}, /*TEMP_OFFSET_OTP_VAL*/ - {0x00004448, 0, 8}, /*VP_SARADC_OFFSET*/ - {0x00004448, 8, 8}, /*VP_GAIN_INDEX*/ - {0x00004448, 16, 8}, /*VBST_SARADC_OFFSET*/ - {0x00004448, 24, 8}, /*VBST_GAIN_INDEX*/ - {0x0000444C, 0, 3}, /*ANA_SELINVREF*/ - {0x00006E30, 0, 5}, /*GAIN_ERR_COEFF_0*/ - {0x00006E30, 8, 5}, /*GAIN_ERR_COEFF_1*/ - {0x00006E30, 16, 5}, /*GAIN_ERR_COEFF_2*/ - {0x00006E30, 24, 5}, /*GAIN_ERR_COEFF_3*/ - {0x00006E34, 0, 5}, /*GAIN_ERR_COEFF_4*/ - {0x00006E34, 8, 5}, /*GAIN_ERR_COEFF_5*/ - {0x00006E34, 16, 5}, /*GAIN_ERR_COEFF_6*/ - {0x00006E34, 24, 5}, /*GAIN_ERR_COEFF_7*/ - {0x00006E38, 0, 5}, /*GAIN_ERR_COEFF_8*/ - {0x00006E38, 8, 5}, /*GAIN_ERR_COEFF_9*/ - {0x00006E38, 16, 5}, /*GAIN_ERR_COEFF_10*/ - {0x00006E38, 24, 5}, /*GAIN_ERR_COEFF_11*/ - {0x00006E3C, 0, 5}, /*GAIN_ERR_COEFF_12*/ - {0x00006E3C, 8, 5}, /*GAIN_ERR_COEFF_13*/ - {0x00006E3C, 16, 5}, /*GAIN_ERR_COEFF_14*/ - {0x00006E3C, 24, 5}, /*GAIN_ERR_COEFF_15*/ - {0x00006E40, 0, 5}, /*GAIN_ERR_COEFF_16*/ - {0x00006E40, 8, 5}, /*GAIN_ERR_COEFF_17*/ - {0x00006E40, 16, 5}, /*GAIN_ERR_COEFF_18*/ - {0x00006E40, 24, 5}, /*GAIN_ERR_COEFF_19*/ - {0x00006E44, 0, 5}, /*GAIN_ERR_COEFF_20*/ - {0x00006E48, 0, 10}, /*VOFF_GAIN_0*/ - {0x00006E48, 10, 10}, /*VOFF_GAIN_1*/ - {0x00006E48, 20, 10}, /*VOFF_GAIN_2*/ - {0x00006E4C, 0, 10}, /*VOFF_GAIN_3*/ - {0x00006E4C, 10, 10}, /*VOFF_GAIN_4*/ - {0x00006E4C, 20, 10}, /*VOFF_GAIN_5*/ - {0x00006E50, 0, 10}, /*VOFF_GAIN_6*/ - {0x00006E50, 10, 10}, /*VOFF_GAIN_7*/ - {0x00006E50, 20, 10}, /*VOFF_GAIN_8*/ - {0x00006E54, 0, 10}, /*VOFF_GAIN_9*/ - {0x00006E54, 10, 10}, /*VOFF_GAIN_10*/ - {0x00006E54, 20, 10}, /*VOFF_GAIN_11*/ - {0x00006E58, 0, 10}, /*VOFF_GAIN_12*/ - {0x00006E58, 10, 10}, /*VOFF_GAIN_13*/ - {0x00006E58, 20, 10}, /*VOFF_GAIN_14*/ - {0x00006E5C, 0, 10}, /*VOFF_GAIN_15*/ - {0x00006E5C, 10, 10}, /*VOFF_GAIN_16*/ - {0x00006E5C, 20, 10}, /*VOFF_GAIN_17*/ - {0x00006E60, 0, 10}, /*VOFF_GAIN_18*/ - {0x00006E60, 10, 10}, /*VOFF_GAIN_19*/ - {0x00006E60, 20, 10}, /*VOFF_GAIN_20*/ - {0x00006E64, 0, 10}, /*VOFF_INT1*/ - {0x00007418, 7, 5}, /*DS_SPK_INT1_CAP_TRIM*/ - {0x0000741C, 0, 5}, /*DS_SPK_INT2_CAP_TRIM*/ - {0x0000741C, 11, 4}, /*DS_SPK_LPF_CAP_TRIM*/ - {0x0000741C, 19, 4}, /*DS_SPK_QUAN_CAP_TRIM*/ - {0x00007434, 17, 1}, /*FORCE_CAL*/ - {0x00007434, 18, 7}, /*CAL_OVERRIDE*/ - {0x00007068, 0, 9}, /*MODIX*/ - {0x0000410C, 7, 1}, /*VIMON_DLY_NOT_COMB*/ - {0x0000400C, 0, 7}, /*VIMON_DLY*/ - {0x00000000, 0, 1}, /*extra bit*/ - {0x00017040, 0, 8}, /*X_COORDINATE*/ - {0x00017040, 8, 8}, /*Y_COORDINATE*/ - {0x00017040, 16, 8}, /*WAFER_ID*/ - {0x00017040, 24, 8}, /*DVS*/ - {0x00017044, 0, 24}, /*LOT_NUMBER*/ -}; - -static const struct cs35l41_otp_packed_element_t - otp_map_2[CS35L41_NUM_OTP_ELEM] = { - /* addr shift size */ - {0x00002030, 0, 4}, /*TRIM_OSC_FREQ_TRIM*/ - {0x00002030, 7, 1}, /*TRIM_OSC_TRIM_DONE*/ - {0x0000208c, 24, 6}, /*TST_DIGREG_VREF_TRIM*/ - {0x00002090, 14, 4}, /*TST_REF_TRIM*/ - {0x00002090, 10, 4}, /*TST_REF_TEMPCO_TRIM*/ - {0x0000300C, 11, 4}, /*PLL_LDOA_TST_VREF_TRIM*/ - {0x0000394C, 23, 2}, /*BST_ATEST_CM_VOFF*/ - {0x00003950, 0, 7}, /*BST_ATRIM_IADC_OFFSET*/ - {0x00003950, 8, 7}, /*BST_ATRIM_IADC_GAIN1*/ - {0x00003950, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET1*/ - {0x00003950, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN1*/ - {0x00003954, 0, 7}, /*BST_ATRIM_IADC_OFFSET2*/ - {0x00003954, 8, 7}, /*BST_ATRIM_IADC_GAIN2*/ - {0x00003954, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET2*/ - {0x00003954, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN2*/ - {0x00003958, 0, 7}, /*BST_ATRIM_IADC_OFFSET3*/ - {0x00003958, 8, 7}, /*BST_ATRIM_IADC_GAIN3*/ - {0x00003958, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET3*/ - {0x00003958, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN3*/ - {0x0000395C, 0, 7}, /*BST_ATRIM_IADC_OFFSET4*/ - {0x0000395C, 8, 7}, /*BST_ATRIM_IADC_GAIN4*/ - {0x0000395C, 16, 8}, /*BST_ATRIM_IPKCOMP_OFFSET4*/ - {0x0000395C, 24, 8}, /*BST_ATRIM_IPKCOMP_GAIN4*/ - {0x0000416C, 0, 8}, /*VMON_GAIN_OTP_VAL*/ - {0x00004160, 0, 7}, /*VMON_OFFSET_OTP_VAL*/ - {0x0000416C, 8, 8}, /*IMON_GAIN_OTP_VAL*/ - {0x00004160, 16, 10}, /*IMON_OFFSET_OTP_VAL*/ - {0x0000416C, 16, 12}, /*VMON_CM_GAIN_OTP_VAL*/ - {0x0000416C, 28, 1}, /*VMON_CM_GAIN_SIGN_OTP_VAL*/ - {0x00004170, 0, 6}, /*IMON_CAL_TEMPCO_OTP_VAL*/ - {0x00004170, 6, 1}, /*IMON_CAL_TEMPCO_SIGN_OTP*/ - {0x00004170, 8, 6}, /*IMON_CAL_TEMPCO2_OTP_VAL*/ - {0x00004170, 14, 1}, /*IMON_CAL_TEMPCO2_DN_UPB_OTP_VAL*/ - {0x00004170, 16, 9}, /*IMON_CAL_TEMPCO_TBASE_OTP_VAL*/ - {0x00004360, 0, 5}, /*TEMP_GAIN_OTP_VAL*/ - {0x00004360, 6, 9}, /*TEMP_OFFSET_OTP_VAL*/ - {0x00004448, 0, 8}, /*VP_SARADC_OFFSET*/ - {0x00004448, 8, 8}, /*VP_GAIN_INDEX*/ - {0x00004448, 16, 8}, /*VBST_SARADC_OFFSET*/ - {0x00004448, 24, 8}, /*VBST_GAIN_INDEX*/ - {0x0000444C, 0, 3}, /*ANA_SELINVREF*/ - {0x00006E30, 0, 5}, /*GAIN_ERR_COEFF_0*/ - {0x00006E30, 8, 5}, /*GAIN_ERR_COEFF_1*/ - {0x00006E30, 16, 5}, /*GAIN_ERR_COEFF_2*/ - {0x00006E30, 24, 5}, /*GAIN_ERR_COEFF_3*/ - {0x00006E34, 0, 5}, /*GAIN_ERR_COEFF_4*/ - {0x00006E34, 8, 5}, /*GAIN_ERR_COEFF_5*/ - {0x00006E34, 16, 5}, /*GAIN_ERR_COEFF_6*/ - {0x00006E34, 24, 5}, /*GAIN_ERR_COEFF_7*/ - {0x00006E38, 0, 5}, /*GAIN_ERR_COEFF_8*/ - {0x00006E38, 8, 5}, /*GAIN_ERR_COEFF_9*/ - {0x00006E38, 16, 5}, /*GAIN_ERR_COEFF_10*/ - {0x00006E38, 24, 5}, /*GAIN_ERR_COEFF_11*/ - {0x00006E3C, 0, 5}, /*GAIN_ERR_COEFF_12*/ - {0x00006E3C, 8, 5}, /*GAIN_ERR_COEFF_13*/ - {0x00006E3C, 16, 5}, /*GAIN_ERR_COEFF_14*/ - {0x00006E3C, 24, 5}, /*GAIN_ERR_COEFF_15*/ - {0x00006E40, 0, 5}, /*GAIN_ERR_COEFF_16*/ - {0x00006E40, 8, 5}, /*GAIN_ERR_COEFF_17*/ - {0x00006E40, 16, 5}, /*GAIN_ERR_COEFF_18*/ - {0x00006E40, 24, 5}, /*GAIN_ERR_COEFF_19*/ - {0x00006E44, 0, 5}, /*GAIN_ERR_COEFF_20*/ - {0x00006E48, 0, 10}, /*VOFF_GAIN_0*/ - {0x00006E48, 10, 10}, /*VOFF_GAIN_1*/ - {0x00006E48, 20, 10}, /*VOFF_GAIN_2*/ - {0x00006E4C, 0, 10}, /*VOFF_GAIN_3*/ - {0x00006E4C, 10, 10}, /*VOFF_GAIN_4*/ - {0x00006E4C, 20, 10}, /*VOFF_GAIN_5*/ - {0x00006E50, 0, 10}, /*VOFF_GAIN_6*/ - {0x00006E50, 10, 10}, /*VOFF_GAIN_7*/ - {0x00006E50, 20, 10}, /*VOFF_GAIN_8*/ - {0x00006E54, 0, 10}, /*VOFF_GAIN_9*/ - {0x00006E54, 10, 10}, /*VOFF_GAIN_10*/ - {0x00006E54, 20, 10}, /*VOFF_GAIN_11*/ - {0x00006E58, 0, 10}, /*VOFF_GAIN_12*/ - {0x00006E58, 10, 10}, /*VOFF_GAIN_13*/ - {0x00006E58, 20, 10}, /*VOFF_GAIN_14*/ - {0x00006E5C, 0, 10}, /*VOFF_GAIN_15*/ - {0x00006E5C, 10, 10}, /*VOFF_GAIN_16*/ - {0x00006E5C, 20, 10}, /*VOFF_GAIN_17*/ - {0x00006E60, 0, 10}, /*VOFF_GAIN_18*/ - {0x00006E60, 10, 10}, /*VOFF_GAIN_19*/ - {0x00006E60, 20, 10}, /*VOFF_GAIN_20*/ - {0x00006E64, 0, 10}, /*VOFF_INT1*/ - {0x00007418, 7, 5}, /*DS_SPK_INT1_CAP_TRIM*/ - {0x0000741C, 0, 5}, /*DS_SPK_INT2_CAP_TRIM*/ - {0x0000741C, 11, 4}, /*DS_SPK_LPF_CAP_TRIM*/ - {0x0000741C, 19, 4}, /*DS_SPK_QUAN_CAP_TRIM*/ - {0x00007434, 17, 1}, /*FORCE_CAL*/ - {0x00007434, 18, 7}, /*CAL_OVERRIDE*/ - {0x00007068, 0, 9}, /*MODIX*/ - {0x0000410C, 7, 1}, /*VIMON_DLY_NOT_COMB*/ - {0x0000400C, 0, 7}, /*VIMON_DLY*/ - {0x00004000, 11, 1}, /*VMON_POL*/ - {0x00017040, 0, 8}, /*X_COORDINATE*/ - {0x00017040, 8, 8}, /*Y_COORDINATE*/ - {0x00017040, 16, 8}, /*WAFER_ID*/ - {0x00017040, 24, 8}, /*DVS*/ - {0x00017044, 0, 24}, /*LOT_NUMBER*/ -}; - -const struct cs35l41_otp_map_element_t - cs35l41_otp_map_map[CS35L41_NUM_OTP_MAPS] = { - { - .id = 0x01, - .map = otp_map_1, - .num_elements = CS35L41_NUM_OTP_ELEM, - .bit_offset = 16, - .word_offset = 2, - }, - { - .id = 0x02, - .map = otp_map_2, - .num_elements = CS35L41_NUM_OTP_ELEM, - .bit_offset = 16, - .word_offset = 2, - }, - { - .id = 0x06, - .map = otp_map_2, - .num_elements = CS35L41_NUM_OTP_ELEM, - .bit_offset = 16, - .word_offset = 2, - }, -}; diff --git a/techpack/audio/asoc/codecs/cs35l41/cs35l41.c b/techpack/audio/asoc/codecs/cs35l41/cs35l41.c deleted file mode 100755 index d0ecfa550c13..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/cs35l41.c +++ /dev/null @@ -1,2081 +0,0 @@ -/* - * cs35l41.c -- CS35l41 ALSA SoC audio driver - * - * Copyright 2018 Cirrus Logic, Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: David Rhodes - * Brian Austin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wm_adsp.h" -#include "cs35l41.h" -#include - -static const char * const cs35l41_supplies[] = { - "VA", - "VP", -}; - -struct cs35l41_pll_sysclk_config { - int freq; - int clk_cfg; -}; - -static const struct cs35l41_pll_sysclk_config cs35l41_pll_sysclk[] = { - { 32768, 0x00 }, - { 8000, 0x01 }, - { 11025, 0x02 }, - { 12000, 0x03 }, - { 16000, 0x04 }, - { 22050, 0x05 }, - { 24000, 0x06 }, - { 32000, 0x07 }, - { 44100, 0x08 }, - { 48000, 0x09 }, - { 88200, 0x0A }, - { 96000, 0x0B }, - { 128000, 0x0C }, - { 176400, 0x0D }, - { 192000, 0x0E }, - { 256000, 0x0F }, - { 352800, 0x10 }, - { 384000, 0x11 }, - { 512000, 0x12 }, - { 705600, 0x13 }, - { 750000, 0x14 }, - { 768000, 0x15 }, - { 1000000, 0x16 }, - { 1024000, 0x17 }, - { 1200000, 0x18 }, - { 1411200, 0x19 }, - { 1500000, 0x1A }, - { 1536000, 0x1B }, - { 2000000, 0x1C }, - { 2048000, 0x1D }, - { 2400000, 0x1E }, - { 2822400, 0x1F }, - { 3000000, 0x20 }, - { 3072000, 0x21 }, - { 3200000, 0x22 }, - { 4000000, 0x23 }, - { 4096000, 0x24 }, - { 4800000, 0x25 }, - { 5644800, 0x26 }, - { 6000000, 0x27 }, - { 6144000, 0x28 }, - { 6250000, 0x29 }, - { 6400000, 0x2A }, - { 6500000, 0x2B }, - { 6750000, 0x2C }, - { 7526400, 0x2D }, - { 8000000, 0x2E }, - { 8192000, 0x2F }, - { 9600000, 0x30 }, - { 11289600, 0x31 }, - { 12000000, 0x32 }, - { 12288000, 0x33 }, - { 12500000, 0x34 }, - { 12800000, 0x35 }, - { 13000000, 0x36 }, - { 13500000, 0x37 }, - { 19200000, 0x38 }, - { 22579200, 0x39 }, - { 24000000, 0x3A }, - { 24576000, 0x3B }, - { 25000000, 0x3C }, - { 25600000, 0x3D }, - { 26000000, 0x3E }, - { 27000000, 0x3F }, -}; - -static const unsigned char cs35l41_bst_k1_table[4][5] = { - {0x24, 0x32, 0x32, 0x4F, 0x57}, - {0x24, 0x32, 0x32, 0x4F, 0x57}, - {0x40, 0x32, 0x32, 0x4F, 0x57}, - {0x40, 0x32, 0x32, 0x4F, 0x57} -}; - -static const unsigned char cs35l41_bst_k2_table[4][5] = { - {0x24, 0x49, 0x66, 0xA3, 0xEA}, - {0x24, 0x49, 0x66, 0xA3, 0xEA}, - {0x48, 0x49, 0x66, 0xA3, 0xEA}, - {0x48, 0x49, 0x66, 0xA3, 0xEA} -}; - -static const unsigned char cs35l41_bst_slope_table[4] = { - 0x75, 0x6B, 0x3B, 0x28}; - -static int cs35l41_codec_set_sysclk(struct snd_soc_codec *codec, - int clk_id, int source, unsigned int freq, - int dir); - -static int cs35l41_dsp_power_ev(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (cs35l41->halo_booted == false) - wm_halo_early_event(w, kcontrol, event); - else - cs35l41->dsp.booted = true; - - return 0; - case SND_SOC_DAPM_PRE_PMD: - if (cs35l41->halo_booted == false) { - wm_halo_early_event(w, kcontrol, event); - wm_halo_event(w, kcontrol, event); - } - default: - return 0; - } -} - -static int cs35l41_dsp_load_ev(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (cs35l41->halo_booted == false) { - wm_halo_event(w, kcontrol, event); - cs35l41->halo_booted = true; - } - default: - return 0; - } -} - -static int cs35l41_halo_booted_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = cs35l41->halo_booted; - - return 0; -} - -static int cs35l41_halo_booted_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - cs35l41->halo_booted = ucontrol->value.integer.value[0]; - - return 0; -} - -static int vendor_id_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = VENDOR_ID_NONE; - - if (cs35l41->pdata.spk_id_gpio_p) - ucontrol->value.integer.value[0] = spk_id_get(cs35l41->pdata.spk_id_gpio_p); - - return 0; -} - -static const DECLARE_TLV_DB_RANGE(dig_vol_tlv, - 0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1), - 1, 913, TLV_DB_SCALE_ITEM(-10200, 25, 0)); -static DECLARE_TLV_DB_SCALE(amp_gain_tlv, 0, 1, 1); - -static const struct snd_kcontrol_new dre_ctrl = - SOC_DAPM_SINGLE("Switch", CS35L41_PWR_CTRL3, 20, 1, 0); - -static const char * const cs35l41_pcm_sftramp_text[] = { - "Off", ".5ms", "1ms", "2ms", "4ms", "8ms", "15ms", "30ms"}; - -static SOC_ENUM_SINGLE_DECL(pcm_sft_ramp, - CS35L41_AMP_DIG_VOL_CTRL, 0, - cs35l41_pcm_sftramp_text); - -static const char * const cs35l41_cspl_cmd_text[] = { - "CSPL_MBOX_CMD_RESUME", - "CSPL_MBOX_CMD_REINIT", - "CSPL_MBOX_CMD_STOP_PRE_REINIT", -}; - -static const unsigned int cs35l41_cspl_cmd_val[] = { - (unsigned int)CSPL_MBOX_CMD_RESUME, - (unsigned int)CSPL_MBOX_CMD_REINIT, - (unsigned int)CSPL_MBOX_CMD_STOP_PRE_REINIT, -}; - -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_cspl_cmd, SND_SOC_NOPM, 0, 0, - cs35l41_cspl_cmd_text, cs35l41_cspl_cmd_val); - -static bool cs35l41_is_csplmboxsts_correct(enum cs35l41_cspl_mboxcmd cmd, - enum cs35l41_cspl_mboxstate sts) -{ - switch (cmd) { - case CSPL_MBOX_CMD_NONE: - case CSPL_MBOX_CMD_UNKNOWN_CMD: - return true; - case CSPL_MBOX_CMD_PAUSE: - return (sts == CSPL_MBOX_STS_PAUSED); - case CSPL_MBOX_CMD_RESUME: - return (sts == CSPL_MBOX_STS_RUNNING); - case CSPL_MBOX_CMD_REINIT: - return (sts == CSPL_MBOX_STS_RUNNING); - case CSPL_MBOX_CMD_STOP_PRE_REINIT: - return (sts == CSPL_MBOX_STS_RDY_FOR_REINIT); - default: - return false; - } -} - -static int cs35l41_set_csplmboxcmd(struct cs35l41_private *cs35l41, - enum cs35l41_cspl_mboxcmd cmd) -{ - int ret; - unsigned int sts; - - /* Reset DSP sticky bit */ - regmap_write(cs35l41->regmap, CS35L41_IRQ2_STATUS2, - 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT); - - /* Reset AP sticky bit */ - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS2, - 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT); - - /* - * Set mailbox cmd - */ - reinit_completion(&cs35l41->mbox_cmd); - /* Unmask DSP INT */ - regmap_update_bits(cs35l41->regmap, CS35L41_IRQ2_MASK2, - 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT, 0); - /* Unmask AP INT */ - regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK2, - 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT, 0); - regmap_write(cs35l41->regmap, CS35L41_CSPL_MBOX_CMD_DRV, cmd); - ret = wait_for_completion_timeout(&cs35l41->mbox_cmd, - msecs_to_jiffies(CS35L41_MBOXWAIT)); - if (ret == 0) { - dev_err(cs35l41->dev, - "Timout waiting for DSP to set mbox cmd\n"); - ret = -ETIMEDOUT; - } - - /* Mask AP INT */ - regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK2, - 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT, - 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT); - /* Mask DSP INT */ - regmap_update_bits(cs35l41->regmap, CS35L41_IRQ2_MASK2, - 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT, - 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT); - - if (regmap_read(cs35l41->regmap, - CS35L41_CSPL_MBOX_STS, &sts) < 0) { - dev_err(cs35l41->dev, "Failed to read %u\n", - CS35L41_CSPL_MBOX_STS); - ret = -EACCES; - } - - if (!cs35l41_is_csplmboxsts_correct(cmd, - (enum cs35l41_cspl_mboxstate)sts)) { - dev_err(cs35l41->dev, - "Failed to set mailbox(cmd: %u, sts: %u)\n", cmd, sts); - ret = -ENOMSG; - } - - return ret; -} - -static int cs35l41_cspl_cmd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - struct soc_enum *soc_enum; - unsigned int i = ucontrol->value.enumerated.item[0]; - - soc_enum = (struct soc_enum *)kcontrol->private_value; - - if (i >= soc_enum->items) { - dev_err(codec->dev, "Invalid mixer input (%u)\n", i); - return -EINVAL; - } - - cs35l41->cspl_cmd = soc_enum->values[i]; - - return 0; -} - -static int cs35l41_cspl_cmd_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - struct soc_enum *soc_enum; - unsigned int i; - int ret = 0; - - soc_enum = (struct soc_enum *)kcontrol->private_value; - - for (i = 0; i < soc_enum->items; i++) { - if (cs35l41->cspl_cmd == soc_enum->values[i]) - break; - } - - if (i >= soc_enum->items) { - /* Cannot find value */ - dev_err(cs35l41->dev, "Cannot find cspl cmd\n"); - i = 0; - ret = -EINVAL; - } - - ucontrol->value.enumerated.item[0] = i; - - return ret; -} -static const char *virt_text[] = { "None", "Ref"}; -static SOC_ENUM_SINGLE_DECL(virt_enum, - SND_SOC_NOPM, 2, virt_text); - -static const struct snd_kcontrol_new virt_mux = - SOC_DAPM_ENUM("Virt Connect", virt_enum); - -static const char * const cs35l41_pcm_source_texts[] = {"None", "ASP", "DSP"}; -static const unsigned int cs35l41_pcm_source_values[] = {0x00, 0x08, 0x32}; -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_pcm_source_enum, - CS35L41_DAC_PCM1_SRC, - 0, CS35L41_ASP_SOURCE_MASK, - cs35l41_pcm_source_texts, - cs35l41_pcm_source_values); - -static const struct snd_kcontrol_new pcm_source_mux = - SOC_DAPM_ENUM("PCM Source", cs35l41_pcm_source_enum); - -static const char * const cs35l41_tx_input_texts[] = {"Zero", "ASPRX1", - "ASPRX2", "VMON", - "IMON", "VPMON", - "DSPTX1", "DSPTX2"}; -static const unsigned int cs35l41_tx_input_values[] = {0x00, - CS35L41_INPUT_SRC_ASPRX1, - CS35L41_INPUT_SRC_ASPRX2, - CS35L41_INPUT_SRC_VMON, - CS35L41_INPUT_SRC_IMON, - CS35L41_INPUT_SRC_VPMON, - CS35L41_INPUT_DSP_TX1, - CS35L41_INPUT_DSP_TX2}; - -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx1_enum, - CS35L41_ASP_TX1_SRC, - 0, CS35L41_ASP_SOURCE_MASK, - cs35l41_tx_input_texts, - cs35l41_tx_input_values); - -static const struct snd_kcontrol_new asp_tx1_mux = - SOC_DAPM_ENUM("ASPTX1 SRC", cs35l41_asptx1_enum); - -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx2_enum, - CS35L41_ASP_TX2_SRC, - 0, CS35L41_ASP_SOURCE_MASK, - cs35l41_tx_input_texts, - cs35l41_tx_input_values); - -static const struct snd_kcontrol_new asp_tx2_mux = - SOC_DAPM_ENUM("ASPTX2 SRC", cs35l41_asptx2_enum); - -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx3_enum, - CS35L41_ASP_TX3_SRC, - 0, CS35L41_ASP_SOURCE_MASK, - cs35l41_tx_input_texts, - cs35l41_tx_input_values); - -static const struct snd_kcontrol_new asp_tx3_mux = - SOC_DAPM_ENUM("ASPTX3 SRC", cs35l41_asptx3_enum); - -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_asptx4_enum, - CS35L41_ASP_TX4_SRC, - 0, CS35L41_ASP_SOURCE_MASK, - cs35l41_tx_input_texts, - cs35l41_tx_input_values); - -static const struct snd_kcontrol_new asp_tx4_mux = - SOC_DAPM_ENUM("ASPTX4 SRC", cs35l41_asptx4_enum); - -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_dsprx1_enum, - CS35L41_DSP1_RX1_SRC, - 0, CS35L41_ASP_SOURCE_MASK, - cs35l41_tx_input_texts, - cs35l41_tx_input_values); - -static const struct snd_kcontrol_new dsp_rx1_mux = - SOC_DAPM_ENUM("DSPRX1 SRC", cs35l41_dsprx1_enum); - -static SOC_VALUE_ENUM_SINGLE_DECL(cs35l41_dsprx2_enum, - CS35L41_DSP1_RX2_SRC, - 0, CS35L41_ASP_SOURCE_MASK, - cs35l41_tx_input_texts, - cs35l41_tx_input_values); - -static const struct snd_kcontrol_new dsp_rx2_mux = - SOC_DAPM_ENUM("DSPRX2 SRC", cs35l41_dsprx2_enum); - -static const char *const vendor_id_text[] = {"None", "AAC", "SSI", "GOER", "Unknown"}; -static const struct soc_enum vendor_id[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(vendor_id_text), vendor_id_text), -}; - -static const struct snd_kcontrol_new cs35l41_aud_controls[] = { - SOC_SINGLE_SX_TLV("Digital PCM Volume", CS35L41_AMP_DIG_VOL_CTRL, - 3, 0x4CF, 0x391, dig_vol_tlv), - SOC_SINGLE_TLV("AMP PCM Gain", CS35L41_AMP_GAIN_CTRL, 5, 0x14, 0, - amp_gain_tlv), - SOC_SINGLE_RANGE("ASPTX1 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 0, - 0, 7, 0), - SOC_SINGLE_RANGE("ASPTX2 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 8, - 0, 7, 0), - SOC_SINGLE_RANGE("ASPTX3 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 16, - 0, 7, 0), - SOC_SINGLE_RANGE("ASPTX4 Slot Position", CS35L41_SP_FRAME_TX_SLOT, 24, - 0, 7, 0), - SOC_SINGLE_RANGE("ASPRX1 Slot Position", CS35L41_SP_FRAME_RX_SLOT, 0, - 0, 7, 0), - SOC_SINGLE_RANGE("ASPRX2 Slot Position", CS35L41_SP_FRAME_RX_SLOT, 8, - 0, 7, 0), - SOC_ENUM("PCM Soft Ramp", pcm_sft_ramp), - SOC_VALUE_ENUM_EXT("CSPL Command", cs35l41_cspl_cmd, - cs35l41_cspl_cmd_get, cs35l41_cspl_cmd_put), - SOC_SINGLE_EXT("DSP Booted", SND_SOC_NOPM, 0, 1, 0, - cs35l41_halo_booted_get, cs35l41_halo_booted_put), - WM_ADSP2_PRELOAD_SWITCH("DSP1", 1), - SOC_ENUM_EXT("SPK ID", vendor_id, vendor_id_get, NULL), -}; - -static const struct cs35l41_otp_map_element_t *cs35l41_find_otp_map(u32 otp_id) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(cs35l41_otp_map_map); i++) { - if (cs35l41_otp_map_map[i].id == otp_id) - return &cs35l41_otp_map_map[i]; - } - - return NULL; -} - -static int cs35l41_otp_unpack(void *data) -{ - struct cs35l41_private *cs35l41 = data; - u32 otp_mem[32]; - int i; - int bit_offset, word_offset; - unsigned int bit_sum = 8; - u32 otp_val, otp_id_reg; - const struct cs35l41_otp_map_element_t *otp_map_match; - const struct cs35l41_otp_packed_element_t *otp_map; - int ret; - struct spi_device *spi = NULL; - u32 orig_spi_freq = 0; - - ret = regmap_read(cs35l41->regmap, CS35L41_OTPID, &otp_id_reg); - if (ret < 0) { - dev_err(cs35l41->dev, "Read OTP ID failed\n"); - return -EINVAL; - } - - otp_map_match = cs35l41_find_otp_map(otp_id_reg); - - if (otp_map_match == NULL) { - dev_err(cs35l41->dev, "OTP Map matching ID %d not found\n", - otp_id_reg); - return -EINVAL; - } - - if (cs35l41->bus_spi) { - spi = to_spi_device(cs35l41->dev); - orig_spi_freq = spi->max_speed_hz; - spi->max_speed_hz = CS35L41_SPI_MAX_FREQ_OTP; - spi_setup(spi); - } - - #define MAX_BULK_READ_SIZE 4 - for (i = 0; i < CS35L41_OTP_SIZE_WORDS / MAX_BULK_READ_SIZE; i++) { - ret = regmap_bulk_read(cs35l41->regmap, CS35L41_OTP_MEM0 + i * 4 * MAX_BULK_READ_SIZE, - &otp_mem[i * MAX_BULK_READ_SIZE], MAX_BULK_READ_SIZE); - } - - if (ret < 0) { - dev_err(cs35l41->dev, "Read OTP Mem failed\n"); - return -EINVAL; - } - - if (cs35l41->bus_spi) { - spi->max_speed_hz = orig_spi_freq; - spi_setup(spi); - } - - otp_map = otp_map_match->map; - - bit_offset = otp_map_match->bit_offset; - word_offset = otp_map_match->word_offset; - - ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x00000055); - if (ret < 0) { - dev_err(cs35l41->dev, "Write Unlock key failed 1/2\n"); - return -EINVAL; - } - ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x000000AA); - if (ret < 0) { - dev_err(cs35l41->dev, "Write Unlock key failed 2/2\n"); - return -EINVAL; - } - - for (i = 0; i < otp_map_match->num_elements; i++) { - dev_dbg(cs35l41->dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d\n", - bit_offset, word_offset, bit_sum % 32); - if (bit_offset + otp_map[i].size - 1 >= 32) { - otp_val = (otp_mem[word_offset] & - GENMASK(31, bit_offset)) >> - bit_offset; - otp_val |= (otp_mem[++word_offset] & - GENMASK(bit_offset + - otp_map[i].size - 33, 0)) << - (32 - bit_offset); - bit_offset += otp_map[i].size - 32; - } else { - - otp_val = (otp_mem[word_offset] & - GENMASK(bit_offset + otp_map[i].size - 1, - bit_offset)) >> bit_offset; - bit_offset += otp_map[i].size; - } - bit_sum += otp_map[i].size; - - if (bit_offset == 32) { - bit_offset = 0; - word_offset++; - } - - if (otp_map[i].reg != 0) { - ret = regmap_update_bits(cs35l41->regmap, - otp_map[i].reg, - GENMASK(otp_map[i].shift + - otp_map[i].size - 1, - otp_map[i].shift), - otp_val << otp_map[i].shift); - if (ret < 0) { - dev_err(cs35l41->dev, "Write OTP val failed\n"); - return -EINVAL; - } - } - } - - ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x000000CC); - if (ret < 0) { - dev_err(cs35l41->dev, "Write Lock key failed 1/2\n"); - return -EINVAL; - } - ret = regmap_write(cs35l41->regmap, CS35L41_TEST_KEY_CTL, 0x00000033); - if (ret < 0) { - dev_err(cs35l41->dev, "Write Lock key failed 2/2\n"); - return -EINVAL; - } - - return 0; -} - -static irqreturn_t cs35l41_irq(int irq, void *data) -{ - struct cs35l41_private *cs35l41 = data; - unsigned int status[4]; - unsigned int masks[4]; - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(status); i++) { - regmap_read(cs35l41->regmap, - CS35L41_IRQ1_STATUS1 + (i * CS35L41_REGSTRIDE), - &status[i]); - regmap_read(cs35l41->regmap, - CS35L41_IRQ1_MASK1 + (i * CS35L41_REGSTRIDE), - &masks[i]); - } - - /* Check to see if unmasked bits are active */ - if (!(status[0] & ~masks[0]) && !(status[1] & ~masks[1]) && - !(status[2] & ~masks[2]) && !(status[3] & ~masks[3])) - return IRQ_NONE; - - if (status[1] & (1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT)) { - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS2, - 1 << CS35L41_CSPL_MBOX_CMD_FW_SHIFT); - complete(&cs35l41->mbox_cmd); - } - - if (status[0] & CS35L41_PUP_DONE_MASK) { - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_PUP_DONE_MASK); - complete(&cs35l41->global_pup_done); - } - - if (status[0] & CS35L41_PDN_DONE_MASK) { - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_PDN_DONE_MASK); - complete(&cs35l41->global_pdn_done); - } - - /* - * The following interrupts require a - * protection release cycle to get the - * speaker out of Safe-Mode. - */ - if (status[0] & CS35L41_AMP_SHORT_ERR) { - dev_crit(cs35l41->dev, "Amp short error\n"); - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_AMP_SHORT_ERR); - regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_AMP_SHORT_ERR_RLS, - CS35L41_AMP_SHORT_ERR_RLS); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_AMP_SHORT_ERR_RLS, 0); - } - - if (status[0] & CS35L41_TEMP_WARN) { - dev_crit(cs35l41->dev, "Over temperature warning\n"); - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_TEMP_WARN); - regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_TEMP_WARN_ERR_RLS, - CS35L41_TEMP_WARN_ERR_RLS); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_TEMP_WARN_ERR_RLS, 0); - } - - if (status[0] & CS35L41_TEMP_ERR) { - dev_crit(cs35l41->dev, "Over temperature error\n"); - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_TEMP_ERR); - regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_TEMP_ERR_RLS, - CS35L41_TEMP_ERR_RLS); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_TEMP_ERR_RLS, 0); - } - - if (status[0] & CS35L41_BST_OVP_ERR) { - dev_crit(cs35l41->dev, "VBST Over Voltage error\n"); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_BST_EN_MASK, 0); - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_BST_OVP_ERR); - regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_BST_OVP_ERR_RLS, - CS35L41_BST_OVP_ERR_RLS); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_BST_OVP_ERR_RLS, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_BST_EN_MASK, - CS35L41_BST_EN_DEFAULT << - CS35L41_BST_EN_SHIFT); - } - - if (status[0] & CS35L41_BST_DCM_UVP_ERR) { - dev_crit(cs35l41->dev, "DCM VBST Under Voltage Error\n"); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_BST_EN_MASK, 0); - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_BST_DCM_UVP_ERR); - regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_BST_UVP_ERR_RLS, - CS35L41_BST_UVP_ERR_RLS); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_BST_UVP_ERR_RLS, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_BST_EN_MASK, - CS35L41_BST_EN_DEFAULT << - CS35L41_BST_EN_SHIFT); - } - - if (status[0] & CS35L41_BST_SHORT_ERR) { - dev_crit(cs35l41->dev, "LBST error: powering off!\n"); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_BST_EN_MASK, 0); - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_BST_SHORT_ERR); - regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_BST_SHORT_ERR_RLS, - CS35L41_BST_SHORT_ERR_RLS); - regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, - CS35L41_BST_SHORT_ERR_RLS, 0); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_BST_EN_MASK, - CS35L41_BST_EN_DEFAULT << - CS35L41_BST_EN_SHIFT); - } - - if (status[3] & CS35L41_OTP_BOOT_DONE) { - regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK4, - CS35L41_OTP_BOOT_DONE, CS35L41_OTP_BOOT_DONE); - } - - return IRQ_HANDLED; -} - -static const struct reg_sequence cs35l41_pup_patch[] = { - {0x00000040, 0x00000055}, - {0x00000040, 0x000000AA}, - {0x00002084, 0x002F1AA0}, - {0x00000040, 0x000000CC}, - {0x00000040, 0x00000033}, -}; - -static const struct reg_sequence cs35l41_pdn_patch[] = { - {0x00000040, 0x00000055}, - {0x00000040, 0x000000AA}, - {0x00002084, 0x002F1AA3}, - {0x00000040, 0x000000CC}, - {0x00000040, 0x00000033}, -}; - -static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - pr_debug("++++>CSPL: %s, event = %d.\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_POST_PMU: - regmap_multi_reg_write_bypassed(cs35l41->regmap, - cs35l41_pup_patch, - ARRAY_SIZE(cs35l41_pup_patch)); - - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL1, - CS35L41_GLOBAL_EN_MASK, - 1 << CS35L41_GLOBAL_EN_SHIFT); - - usleep_range(1000, 1100); - - if (cs35l41->halo_booted) { - if (cs35l41->cspl_cmd == CSPL_MBOX_CMD_STOP_PRE_REINIT) - /* Send this command on power down event */ - ret = cs35l41_set_csplmboxcmd(cs35l41, - CSPL_MBOX_CMD_RESUME); - else - ret = cs35l41_set_csplmboxcmd(cs35l41, - cs35l41->cspl_cmd); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (cs35l41->halo_booted) { - if (cs35l41->cspl_cmd == CSPL_MBOX_CMD_STOP_PRE_REINIT) - ret = cs35l41_set_csplmboxcmd(cs35l41, - cs35l41->cspl_cmd); - else - ret = cs35l41_set_csplmboxcmd(cs35l41, - CSPL_MBOX_CMD_PAUSE); - } - - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL1, - CS35L41_GLOBAL_EN_MASK, 0); - - usleep_range(1000, 1100); - - regmap_multi_reg_write_bypassed(cs35l41->regmap, - cs35l41_pdn_patch, - ARRAY_SIZE(cs35l41_pdn_patch)); - break; - default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); - ret = -EINVAL; - } - pr_debug("----CSPL: %s.\n", __func__); - return ret; -} - -static const struct snd_soc_dapm_widget cs35l41_dapm_widgets[] = { - - SND_SOC_DAPM_SPK("DSP1 Preload", NULL), - SND_SOC_DAPM_SUPPLY_S("DSP1 Preloader", 100, - SND_SOC_NOPM, 0, 0, cs35l41_dsp_power_ev, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_OUT_DRV_E("DSP1", SND_SOC_NOPM, 0, 0, NULL, 0, - cs35l41_dsp_load_ev, SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_OUTPUT("SPK"), - - SND_SOC_DAPM_AIF_IN("ASPRX1", NULL, 0, CS35L41_SP_ENABLES, 16, 0), - SND_SOC_DAPM_AIF_IN("ASPRX2", NULL, 0, CS35L41_SP_ENABLES, 17, 0), - SND_SOC_DAPM_AIF_OUT("ASPTX1", NULL, 0, CS35L41_SP_ENABLES, 0, 0), - SND_SOC_DAPM_AIF_OUT("ASPTX2", NULL, 0, CS35L41_SP_ENABLES, 1, 0), - SND_SOC_DAPM_AIF_OUT("ASPTX3", NULL, 0, CS35L41_SP_ENABLES, 2, 0), - SND_SOC_DAPM_AIF_OUT("ASPTX4", NULL, 0, CS35L41_SP_ENABLES, 3, 0), - - SND_SOC_DAPM_ADC("VMON ADC", NULL, CS35L41_PWR_CTRL2, 12, 0), - SND_SOC_DAPM_ADC("IMON ADC", NULL, CS35L41_PWR_CTRL2, 13, 0), - SND_SOC_DAPM_ADC("VPMON ADC", NULL, CS35L41_PWR_CTRL2, 8, 0), - SND_SOC_DAPM_ADC("VBSTMON ADC", NULL, CS35L41_PWR_CTRL2, 9, 0), - SND_SOC_DAPM_ADC("TEMPMON ADC", NULL, CS35L41_PWR_CTRL2, 10, 0), - SND_SOC_DAPM_ADC("CLASS H", NULL, CS35L41_PWR_CTRL3, 4, 0), - - SND_SOC_DAPM_OUT_DRV_E("Main AMP", CS35L41_PWR_CTRL2, 0, 0, NULL, 0, - cs35l41_main_amp_event, - SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_INPUT("VP"), - SND_SOC_DAPM_INPUT("VBST"), - SND_SOC_DAPM_INPUT("ISENSE"), - SND_SOC_DAPM_INPUT("VSENSE"), - SND_SOC_DAPM_INPUT("TEMP"), - - SND_SOC_DAPM_MUX("ASPTX Ref", SND_SOC_NOPM, 0, 0, &virt_mux), - SND_SOC_DAPM_MUX("ASP TX1 Source", SND_SOC_NOPM, 0, 0, &asp_tx1_mux), - SND_SOC_DAPM_MUX("ASP TX2 Source", SND_SOC_NOPM, 0, 0, &asp_tx2_mux), - SND_SOC_DAPM_MUX("ASP TX3 Source", SND_SOC_NOPM, 0, 0, &asp_tx3_mux), - SND_SOC_DAPM_MUX("ASP TX4 Source", SND_SOC_NOPM, 0, 0, &asp_tx4_mux), - SND_SOC_DAPM_MUX("DSP RX1 Source", SND_SOC_NOPM, 0, 0, &dsp_rx1_mux), - SND_SOC_DAPM_MUX("DSP RX2 Source", SND_SOC_NOPM, 0, 0, &dsp_rx2_mux), - SND_SOC_DAPM_MUX("PCM Source", SND_SOC_NOPM, 0, 0, &pcm_source_mux), - SND_SOC_DAPM_SWITCH("DRE", SND_SOC_NOPM, 0, 0, &dre_ctrl), - -}; - -static const struct snd_soc_dapm_route cs35l41_audio_map[] = { - - { "DSP1", NULL, "DSP1 Preloader" }, - { "DSP1 Preload", NULL, "DSP1 Preloader" }, - - {"DSP RX1 Source", "VMON", "VMON ADC"}, - {"DSP RX1 Source", "IMON", "IMON ADC"}, - {"DSP RX1 Source", "VPMON", "VPMON ADC"}, - {"DSP RX1 Source", "DSPTX1", "DSP1"}, - {"DSP RX1 Source", "DSPTX2", "DSP1"}, - {"DSP RX1 Source", "ASPRX1", "ASPRX1"}, - {"DSP RX1 Source", "ASPRX2", "ASPRX2"}, - {"DSP RX1 Source", "Zero", "ASPRX1"}, - {"DSP1", NULL, "DSP RX1 Source"}, - - {"DSP RX2 Source", "VMON", "VMON ADC"}, - {"DSP RX2 Source", "IMON", "IMON ADC"}, - {"DSP RX2 Source", "VPMON", "VPMON ADC"}, - {"DSP RX2 Source", "DSPTX1", "DSP1"}, - {"DSP RX2 Source", "DSPTX2", "DSP1"}, - {"DSP RX2 Source", "ASPRX1", "ASPRX1"}, - {"DSP RX2 Source", "ASPRX2", "ASPRX2"}, - {"DSP RX2 Source", "Zero", "ASPRX1"}, - {"DSP1", NULL, "DSP RX2 Source"}, - - {"ASP TX1 Source", "VMON", "VMON ADC"}, - {"ASP TX1 Source", "IMON", "IMON ADC"}, - {"ASP TX1 Source", "VPMON", "VPMON ADC"}, - {"ASP TX1 Source", "DSPTX1", "DSP1"}, - {"ASP TX1 Source", "DSPTX2", "DSP1"}, - {"ASP TX1 Source", "ASPRX1", "ASPRX1" }, - {"ASP TX1 Source", "ASPRX2", "ASPRX2" }, - {"ASP TX2 Source", "VMON", "VMON ADC"}, - {"ASP TX2 Source", "IMON", "IMON ADC"}, - {"ASP TX2 Source", "VPMON", "VPMON ADC"}, - {"ASP TX2 Source", "DSPTX1", "DSP1"}, - {"ASP TX2 Source", "DSPTX2", "DSP1"}, - {"ASP TX2 Source", "ASPRX1", "ASPRX1" }, - {"ASP TX2 Source", "ASPRX2", "ASPRX2" }, - {"ASP TX3 Source", "VMON", "VMON ADC"}, - {"ASP TX3 Source", "IMON", "IMON ADC"}, - {"ASP TX3 Source", "VPMON", "VPMON ADC"}, - {"ASP TX3 Source", "DSPTX1", "DSP1"}, - {"ASP TX3 Source", "DSPTX2", "DSP1"}, - {"ASP TX3 Source", "ASPRX1", "ASPRX1" }, - {"ASP TX3 Source", "ASPRX2", "ASPRX2" }, - {"ASP TX4 Source", "VMON", "VMON ADC"}, - {"ASP TX4 Source", "IMON", "IMON ADC"}, - {"ASP TX4 Source", "VPMON", "VPMON ADC"}, - {"ASP TX4 Source", "DSPTX1", "DSP1"}, - {"ASP TX4 Source", "DSPTX2", "DSP1"}, - {"ASP TX4 Source", "ASPRX1", "ASPRX1" }, - {"ASP TX4 Source", "ASPRX2", "ASPRX2" }, - {"ASPTX1", NULL, "ASP TX1 Source"}, - {"ASPTX2", NULL, "ASP TX2 Source"}, - {"ASPTX3", NULL, "ASP TX3 Source"}, - {"ASPTX4", NULL, "ASP TX4 Source"}, - {"AMP Capture", NULL, "ASPTX1"}, - {"AMP Capture", NULL, "ASPTX2"}, - {"AMP Capture", NULL, "ASPTX3"}, - {"AMP Capture", NULL, "ASPTX4"}, - - {"VMON ADC", NULL, "ASPRX1"}, - {"IMON ADC", NULL, "ASPRX1"}, - {"VPMON ADC", NULL, "ASPRX1"}, - {"TEMPMON ADC", NULL, "ASPRX1"}, - {"VBSTMON ADC", NULL, "ASPRX1"}, - - {"DSP1", NULL, "IMON ADC"}, - {"DSP1", NULL, "VMON ADC"}, - {"DSP1", NULL, "VBSTMON ADC"}, - {"DSP1", NULL, "VPMON ADC"}, - {"DSP1", NULL, "TEMPMON ADC"}, - - {"ASPRX1", NULL, "AMP Playback"}, - {"ASPRX2", NULL, "AMP Playback"}, - {"DRE", "Switch", "CLASS H"}, - {"Main AMP", NULL, "CLASS H"}, - {"Main AMP", NULL, "DRE"}, - {"SPK", NULL, "Main AMP"}, - {"Main AMP", NULL, "ASPTX Ref"}, - {"ASPTX Ref", "Ref", "ASPTX1"}, - {"ASPTX Ref", "Ref", "ASPTX2"}, - {"PCM Source", "ASP", "ASPRX1"}, - {"PCM Source", "DSP", "DSP1"}, - {"CLASS H", NULL, "PCM Source"}, - -}; - -static const struct wm_adsp_region cs35l41_dsp1_regions[] = { - { .type = WMFW_HALO_PM_PACKED, .base = CS35L41_DSP1_PMEM_0 }, - { .type = WMFW_HALO_XM_PACKED, .base = CS35L41_DSP1_XMEM_PACK_0 }, - { .type = WMFW_HALO_YM_PACKED, .base = CS35L41_DSP1_YMEM_PACK_0 }, - {. type = WMFW_ADSP2_XM, .base = CS35L41_DSP1_XMEM_UNPACK24_0}, - {. type = WMFW_ADSP2_YM, .base = CS35L41_DSP1_YMEM_UNPACK24_0}, -}; - -static int cs35l41_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) -{ - struct cs35l41_private *cs35l41 = - snd_soc_codec_get_drvdata(codec_dai->codec); - unsigned int asp_fmt, lrclk_fmt, sclk_fmt, slave_mode; - - pr_debug("++++>CSPL: %s, fmt = %d.\n", __func__, fmt); - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBM_CFM: - slave_mode = 1; - break; - case SND_SOC_DAIFMT_CBS_CFS: - slave_mode = 0; - break; - default: - dev_warn(cs35l41->dev, "cs35l41_set_dai_fmt: Mixed master mode unsupported\n"); - return -EINVAL; - } - - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_SCLK_MSTR_MASK, - slave_mode << CS35L41_SCLK_MSTR_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_LRCLK_MSTR_MASK, - slave_mode << CS35L41_LRCLK_MSTR_SHIFT); - - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { - case SND_SOC_DAIFMT_DSP_A: - asp_fmt = 0; - cs35l41->i2s_mode = false; - cs35l41->dspa_mode = true; - break; - case SND_SOC_DAIFMT_I2S: - asp_fmt = 2; - cs35l41->i2s_mode = true; - cs35l41->dspa_mode = false; - break; - default: - dev_warn(cs35l41->dev, "cs35l41_set_dai_fmt: Invalid or unsupported DAI format\n"); - return -EINVAL; - } - - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_ASP_FMT_MASK, - asp_fmt << CS35L41_ASP_FMT_SHIFT); - - switch (fmt & SND_SOC_DAIFMT_INV_MASK) { - case SND_SOC_DAIFMT_NB_IF: - lrclk_fmt = 1; - sclk_fmt = 0; - break; - case SND_SOC_DAIFMT_IB_NF: - lrclk_fmt = 0; - sclk_fmt = 1; - break; - case SND_SOC_DAIFMT_IB_IF: - lrclk_fmt = 1; - sclk_fmt = 1; - break; - case SND_SOC_DAIFMT_NB_NF: - lrclk_fmt = 0; - sclk_fmt = 0; - break; - default: - dev_warn(cs35l41->dev, "cs35l41_set_dai_fmt: Invalid DAI clock INV\n"); - return -EINVAL; - } - - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_LRCLK_INV_MASK, - lrclk_fmt << CS35L41_LRCLK_INV_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_SCLK_INV_MASK, - sclk_fmt << CS35L41_SCLK_INV_SHIFT); - - pr_debug("---->CSPL: %s, fmt = %d.\n", __func__, fmt); - return 0; -} - -struct cs35l41_global_fs_config { - int rate; - int fs_cfg; -}; - -static const struct cs35l41_global_fs_config cs35l41_fs_rates[] = { - { 12000, 0x01 }, - { 24000, 0x02 }, - { 48000, 0x03 }, - { 96000, 0x04 }, - { 192000, 0x05 }, - { 11025, 0x09 }, - { 22050, 0x0A }, - { 44100, 0x0B }, - { 88200, 0x0C }, - { 176400, 0x0D }, - { 8000, 0x11 }, - { 16000, 0x12 }, - { 32000, 0x13 }, -}; - -static int cs35l41_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(dai->codec); - int i; - unsigned int rate = params_rate(params); - u8 asp_width, asp_wl; - - pr_debug("++++>CSPL: %s.\n", __func__); - for (i = 0; i < ARRAY_SIZE(cs35l41_fs_rates); i++) { - if (rate == cs35l41_fs_rates[i].rate) - break; - } - regmap_update_bits(cs35l41->regmap, CS35L41_GLOBAL_CLK_CTRL, - CS35L41_GLOBAL_FS_MASK, - cs35l41_fs_rates[i].fs_cfg << CS35L41_GLOBAL_FS_SHIFT); - - asp_wl = params_width(params); - asp_width = params_physical_width(params); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_ASP_WIDTH_RX_MASK, - asp_width << CS35L41_ASP_WIDTH_RX_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_SP_RX_WL, - CS35L41_ASP_RX_WL_MASK, - asp_wl << CS35L41_ASP_RX_WL_SHIFT); - if (cs35l41->i2s_mode || cs35l41->dspa_mode) { - regmap_update_bits(cs35l41->regmap, - CS35L41_SP_FRAME_RX_SLOT, - CS35L41_ASP_RX1_SLOT_MASK, - ((cs35l41->pdata.right_channel) ? 1 : 0) - << CS35L41_ASP_RX1_SLOT_SHIFT); - regmap_update_bits(cs35l41->regmap, - CS35L41_SP_FRAME_RX_SLOT, - CS35L41_ASP_RX2_SLOT_MASK, - ((cs35l41->pdata.right_channel) ? 0 : 1) - << CS35L41_ASP_RX2_SLOT_SHIFT); - } - } else { - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_ASP_WIDTH_TX_MASK, - asp_width << CS35L41_ASP_WIDTH_TX_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_SP_TX_WL, - CS35L41_ASP_TX_WL_MASK, - asp_wl << CS35L41_ASP_TX_WL_SHIFT); - } - - pr_debug("---->CSPL: %s.\n", __func__); - return 0; -} - -static int cs35l41_get_clk_config(int freq) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(cs35l41_pll_sysclk); i++) { - if (cs35l41_pll_sysclk[i].freq == freq) - return cs35l41_pll_sysclk[i].clk_cfg; - } - - return -EINVAL; -} - -#if 0 -static const unsigned int cs35l41_src_rates[] = { - 8000, 12000, 11025, 16000, 22050, 24000, 32000, - 44100, 48000, 88200, 96000, 176400, 192000 -}; - -static const struct snd_pcm_hw_constraint_list cs35l41_constraints = { - .count = ARRAY_SIZE(cs35l41_src_rates), - .list = cs35l41_src_rates, -}; -#endif - -static int cs35l41_pcm_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - - struct snd_soc_codec *codec = dai->codec; - pr_debug("++++>CSPL: %s.\n", __func__); - - cs35l41_set_dai_fmt(dai, SND_SOC_DAIFMT_CBS_CFS|SND_SOC_DAIFMT_I2S); - cs35l41_codec_set_sysclk(codec, 0, 0, 1536000, 0); -#if 0 - if (substream->runtime) - return snd_pcm_hw_constraint_list(substream->runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, &cs35l41_constraints); -#endif - pr_debug("---->CSPL: %s.\n", __func__); - return 0; -} - -static int cs35l41_codec_set_sysclk(struct snd_soc_codec *codec, - int clk_id, int source, unsigned int freq, - int dir) -{ - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - int val = 0; - cs35l41->extclk_freq = freq; - - pr_debug("++++>CSPL: %s: clk_id = %d, src = %d, freq = %d, dir = %d.\n", __func__, clk_id, source, freq, dir); - dev_info(codec->dev, "%s: clk_id=%d, src=%d, freq=%d\n", __func__, clk_id, source, freq); - - switch (clk_id) { - case 0: - cs35l41->clksrc = CS35L41_PLLSRC_SCLK; - break; - case 1: - cs35l41->clksrc = CS35L41_PLLSRC_LRCLK; - break; - case 2: - cs35l41->clksrc = CS35L41_PLLSRC_PDMCLK; - break; - case 3: - cs35l41->clksrc = CS35L41_PLLSRC_SELF; - break; - case 4: - cs35l41->clksrc = CS35L41_PLLSRC_MCLK; - break; - default: - dev_err(codec->dev, "Invalid CLK Config\n"); - return -EINVAL; - } - - cs35l41->extclk_cfg = cs35l41_get_clk_config(freq); - - if (cs35l41->extclk_cfg < 0) { - dev_err(codec->dev, "Invalid CLK Config: %d, freq: %u\n", - cs35l41->extclk_cfg, freq); - return -EINVAL; - } - - regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, - CS35L41_PLL_OPENLOOP_MASK, - 1 << CS35L41_PLL_OPENLOOP_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, - CS35L41_REFCLK_FREQ_MASK, - cs35l41->extclk_cfg << CS35L41_REFCLK_FREQ_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, - CS35L41_PLL_CLK_EN_MASK, - 0 << CS35L41_PLL_CLK_EN_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, - CS35L41_PLL_CLK_SEL_MASK, cs35l41->clksrc); - regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, - CS35L41_PLL_OPENLOOP_MASK, - 0 << CS35L41_PLL_OPENLOOP_SHIFT); - regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, - CS35L41_PLL_CLK_EN_MASK, - 1 << CS35L41_PLL_CLK_EN_SHIFT); - - regmap_read(cs35l41->regmap, CS35L41_PLL_CLK_CTRL, &val); - dev_info(codec->dev, "%s: 0x%x <== 0x%x\n",__func__, CS35L41_PLL_CLK_CTRL, val); - pr_debug("---->CSPL: %s.\n", __func__); - - return 0; -} - -static int cs35l41_dai_set_sysclk(struct snd_soc_dai *dai, - int clk_id, unsigned int freq, int dir) -{ - struct snd_soc_codec *codec = dai->codec; - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - pr_debug("++++>CSPL: %s: clk_id=%d, freq=%d, dir=%d\n", __func__, clk_id, freq, dir); - if (cs35l41_get_clk_config(freq) < 0) { - dev_err(codec->dev, "Invalid CLK Config freq: %u\n", freq); - return -EINVAL; - } - - if (clk_id == CS35L41_PLLSRC_SCLK) - cs35l41->sclk = freq; - pr_debug("---->CSPL: %s.\n", __func__); - - return 0; -} - -static int cs35l41_digital_mute(struct snd_soc_dai *dai, int mute) -{ - struct snd_soc_codec *codec = dai->codec; - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - dev_dbg(cs35l41->dev, "%s: %d\n", __func__, mute); - pr_debug("++++>CSPL: %s, mute = %d.\n", __func__, mute); - - if (mute) { - regmap_update_bits(cs35l41->regmap,0x6000, - 0x7ff << 3, 0x400 << 3 | 0x7); - mdelay(30); - } else { - regmap_update_bits(cs35l41->regmap,0x6000, - 0x7ff << 3, 0x0 << 3 | 0x4 ); - } - - pr_debug("---->CSPL: %s.\n", __func__); - return 0; -} - -static int cs35l41_boost_config(struct cs35l41_private *cs35l41, - int boost_ind, int boost_cap, int boost_ipk) -{ - int ret; - unsigned char bst_lbst_val, bst_cbst_range, bst_ipk_scaled; - struct regmap *regmap = cs35l41->regmap; - struct device *dev = cs35l41->dev; - - switch (boost_ind) { - case 1000: /* 1.0 uH */ - bst_lbst_val = 0; - break; - case 1200: /* 1.2 uH */ - bst_lbst_val = 1; - break; - case 1500: /* 1.5 uH */ - bst_lbst_val = 2; - break; - case 2200: /* 2.2 uH */ - bst_lbst_val = 3; - break; - default: - dev_err(dev, "Invalid boost inductor value: %d nH\n", - boost_ind); - return -EINVAL; - } - - switch (boost_cap) { - case 0 ... 19: - bst_cbst_range = 0; - break; - case 20 ... 50: - bst_cbst_range = 1; - break; - case 51 ... 100: - bst_cbst_range = 2; - break; - case 101 ... 200: - bst_cbst_range = 3; - break; - default: /* 201 uF and greater */ - bst_cbst_range = 4; - } - - ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_COEFF, - CS35L41_BST_K1_MASK, - cs35l41_bst_k1_table[bst_lbst_val][bst_cbst_range] - << CS35L41_BST_K1_SHIFT); - if (ret) { - dev_err(dev, "Failed to write boost K1 coefficient\n"); - return ret; - } - - ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_COEFF, - CS35L41_BST_K2_MASK, - cs35l41_bst_k2_table[bst_lbst_val][bst_cbst_range] - << CS35L41_BST_K2_SHIFT); - if (ret) { - dev_err(dev, "Failed to write boost K2 coefficient\n"); - return ret; - } - - ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_SLOPE_LBST, - CS35L41_BST_SLOPE_MASK, - cs35l41_bst_slope_table[bst_lbst_val] - << CS35L41_BST_SLOPE_SHIFT); - if (ret) { - dev_err(dev, "Failed to write boost slope coefficient\n"); - return ret; - } - - ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_SLOPE_LBST, - CS35L41_BST_LBST_VAL_MASK, - bst_lbst_val << CS35L41_BST_LBST_VAL_SHIFT); - if (ret) { - dev_err(dev, "Failed to write boost inductor value\n"); - return ret; - } - - if ((boost_ipk < 1600) || (boost_ipk > 4500)) { - dev_err(dev, "Invalid boost inductor peak current: %d mA\n", - boost_ipk); - return -EINVAL; - } - bst_ipk_scaled = ((boost_ipk - 1600) / 50) + 0x10; - - ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_PEAK_CUR, - CS35L41_BST_IPK_MASK, - bst_ipk_scaled << CS35L41_BST_IPK_SHIFT); - if (ret) { - dev_err(dev, "Failed to write boost inductor peak current\n"); - return ret; - } - - return 0; -} - -static int cs35l41_codec_probe(struct snd_soc_codec *codec) -{ - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct classh_cfg *classh = &cs35l41->pdata.classh_config; - int ret; - - /* Set Platform Data */ - /* Required */ - if (cs35l41->pdata.bst_ipk && - cs35l41->pdata.bst_ind && cs35l41->pdata.bst_cap) { - ret = cs35l41_boost_config(cs35l41, cs35l41->pdata.bst_ind, - cs35l41->pdata.bst_cap, - cs35l41->pdata.bst_ipk); - if (ret) { - dev_err(cs35l41->dev, "Error in Boost DT config\n"); - return ret; - } - } else { - dev_err(cs35l41->dev, "Incomplete Boost component DT config\n"); - return -EINVAL; - } - - /* Optional */ - if (cs35l41->pdata.sclk_frc) - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_SCLK_FRC_MASK, - cs35l41->pdata.sclk_frc << - CS35L41_SCLK_FRC_SHIFT); - - if (cs35l41->pdata.lrclk_frc) - regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT, - CS35L41_LRCLK_FRC_MASK, - cs35l41->pdata.lrclk_frc << - CS35L41_LRCLK_FRC_SHIFT); - - if (cs35l41->pdata.amp_gain_zc) - regmap_update_bits(cs35l41->regmap, CS35L41_AMP_GAIN_CTRL, - CS35L41_AMP_GAIN_ZC_MASK, - cs35l41->pdata.amp_gain_zc << - CS35L41_AMP_GAIN_ZC_SHIFT); - - if (cs35l41->pdata.bst_vctrl) - regmap_update_bits(cs35l41->regmap, CS35L41_BSTCVRT_VCTRL1, - CS35L41_BST_CTL_MASK, cs35l41->pdata.bst_vctrl); - - if (cs35l41->pdata.temp_warn_thld) - regmap_update_bits(cs35l41->regmap, CS35L41_DTEMP_WARN_THLD, - CS35L41_TEMP_THLD_MASK, - cs35l41->pdata.temp_warn_thld); - - if (cs35l41->pdata.dout_hiz <= CS35L41_ASP_DOUT_HIZ_MASK && - cs35l41->pdata.dout_hiz >= 0) - regmap_update_bits(cs35l41->regmap, CS35L41_SP_HIZ_CTRL, - CS35L41_ASP_DOUT_HIZ_MASK, - cs35l41->pdata.dout_hiz); - - if (cs35l41->pdata.ng_enable) { - regmap_update_bits(cs35l41->regmap, - CS35L41_MIXER_NGATE_CH1_CFG, - CS35L41_NG_ENABLE_MASK, - CS35L41_NG_ENABLE_MASK); - regmap_update_bits(cs35l41->regmap, - CS35L41_MIXER_NGATE_CH2_CFG, - CS35L41_NG_ENABLE_MASK, - CS35L41_NG_ENABLE_MASK); - - if (cs35l41->pdata.ng_pcm_thld) { - regmap_update_bits(cs35l41->regmap, - CS35L41_MIXER_NGATE_CH1_CFG, - CS35L41_NG_THLD_MASK, - cs35l41->pdata.ng_pcm_thld); - regmap_update_bits(cs35l41->regmap, - CS35L41_MIXER_NGATE_CH2_CFG, - CS35L41_NG_THLD_MASK, - cs35l41->pdata.ng_pcm_thld); - } - - if (cs35l41->pdata.ng_delay) { - regmap_update_bits(cs35l41->regmap, - CS35L41_MIXER_NGATE_CH1_CFG, - CS35L41_NG_DELAY_MASK, - cs35l41->pdata.ng_delay << - CS35L41_NG_DELAY_SHIFT); - regmap_update_bits(cs35l41->regmap, - CS35L41_MIXER_NGATE_CH2_CFG, - CS35L41_NG_DELAY_MASK, - cs35l41->pdata.ng_delay << - CS35L41_NG_DELAY_SHIFT); - } - } - - if (classh->classh_algo_enable) { - if (classh->classh_bst_override) - regmap_update_bits(cs35l41->regmap, - CS35L41_BSTCVRT_VCTRL2, - CS35L41_BST_CTL_SEL_MASK, - CS35L41_BST_CTL_SEL_REG); - if (classh->classh_bst_max_limit) - regmap_update_bits(cs35l41->regmap, - CS35L41_BSTCVRT_VCTRL2, - CS35L41_BST_LIM_MASK, - classh->classh_bst_max_limit << - CS35L41_BST_LIM_SHIFT); - if (classh->classh_mem_depth) - regmap_update_bits(cs35l41->regmap, - CS35L41_CLASSH_CFG, - CS35L41_CH_MEM_DEPTH_MASK, - classh->classh_mem_depth << - CS35L41_CH_MEM_DEPTH_SHIFT); - if (classh->classh_headroom) - regmap_update_bits(cs35l41->regmap, - CS35L41_CLASSH_CFG, - CS35L41_CH_HDRM_CTL_MASK, - classh->classh_headroom << - CS35L41_CH_HDRM_CTL_SHIFT); - if (classh->classh_release_rate) - regmap_update_bits(cs35l41->regmap, - CS35L41_CLASSH_CFG, - CS35L41_CH_REL_RATE_MASK, - classh->classh_release_rate << - CS35L41_CH_REL_RATE_SHIFT); - if (classh->classh_wk_fet_delay) - regmap_update_bits(cs35l41->regmap, - CS35L41_WKFET_CFG, - CS35L41_CH_WKFET_DLY_MASK, - classh->classh_wk_fet_delay << - CS35L41_CH_WKFET_DLY_SHIFT); - if (classh->classh_wk_fet_thld) - regmap_update_bits(cs35l41->regmap, - CS35L41_WKFET_CFG, - CS35L41_CH_WKFET_THLD_MASK, - classh->classh_wk_fet_thld << - CS35L41_CH_WKFET_THLD_SHIFT); - } - - wm_adsp2_codec_probe(&cs35l41->dsp, codec); - - snd_soc_dapm_ignore_suspend(dapm, "AMP Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AMP Capture"); - snd_soc_dapm_ignore_suspend(dapm, "Main AMP"); - snd_soc_dapm_ignore_suspend(dapm, "SPK"); - snd_soc_dapm_ignore_suspend(dapm, "VP"); - snd_soc_dapm_ignore_suspend(dapm, "VBST"); - snd_soc_dapm_ignore_suspend(dapm, "ISENSE"); - snd_soc_dapm_ignore_suspend(dapm, "VSENSE"); - snd_soc_dapm_ignore_suspend(dapm, "TEMP"); - snd_soc_dapm_ignore_suspend(dapm, "DSP1 Preloader"); - snd_soc_dapm_ignore_suspend(dapm, "DSP1 Preload"); - - return 0; -} - -static int cs35l41_irq_gpio_config(struct cs35l41_private *cs35l41) -{ - struct irq_cfg *irq_gpio_cfg1 = &cs35l41->pdata.irq_config1; - struct irq_cfg *irq_gpio_cfg2 = &cs35l41->pdata.irq_config2; - int irq_pol = IRQF_TRIGGER_NONE; - - if (irq_gpio_cfg1->is_present) { - if (irq_gpio_cfg1->irq_pol_inv) - regmap_update_bits(cs35l41->regmap, - CS35L41_GPIO1_CTRL1, - CS35L41_GPIO_POL_MASK, - CS35L41_GPIO_POL_MASK); - if (irq_gpio_cfg1->irq_out_en) - regmap_update_bits(cs35l41->regmap, - CS35L41_GPIO1_CTRL1, - CS35L41_GPIO_DIR_MASK, - 0); - if (irq_gpio_cfg1->irq_src_sel) - regmap_update_bits(cs35l41->regmap, - CS35L41_GPIO_PAD_CONTROL, - CS35L41_GPIO1_CTRL_MASK, - irq_gpio_cfg1->irq_src_sel << - CS35L41_GPIO1_CTRL_SHIFT); - } - - if (irq_gpio_cfg2->is_present) { - if (irq_gpio_cfg2->irq_pol_inv) - regmap_update_bits(cs35l41->regmap, - CS35L41_GPIO2_CTRL1, - CS35L41_GPIO_POL_MASK, - CS35L41_GPIO_POL_MASK); - if (irq_gpio_cfg2->irq_out_en) - regmap_update_bits(cs35l41->regmap, - CS35L41_GPIO2_CTRL1, - CS35L41_GPIO_DIR_MASK, - 0); - if (irq_gpio_cfg2->irq_src_sel) - regmap_update_bits(cs35l41->regmap, - CS35L41_GPIO_PAD_CONTROL, - CS35L41_GPIO2_CTRL_MASK, - irq_gpio_cfg2->irq_src_sel << - CS35L41_GPIO2_CTRL_SHIFT); - } - - if (irq_gpio_cfg2->irq_src_sel == - (CS35L41_GPIO_CTRL_ACTV_LO | CS35L41_VALID_PDATA)) - irq_pol = IRQF_TRIGGER_LOW; - else if (irq_gpio_cfg2->irq_src_sel == - (CS35L41_GPIO_CTRL_ACTV_HI | CS35L41_VALID_PDATA)) - irq_pol = IRQF_TRIGGER_HIGH; - - return irq_pol; -} - -static int cs35l41_codec_remove(struct snd_soc_codec *codec) -{ - struct cs35l41_private *cs35l41 = snd_soc_codec_get_drvdata(codec); - - wm_adsp2_codec_remove(&cs35l41->dsp, codec); - return 0; -} - -static const struct snd_soc_dai_ops cs35l41_ops = { - .startup = cs35l41_pcm_startup, - .set_fmt = cs35l41_set_dai_fmt, - .hw_params = cs35l41_pcm_hw_params, - .set_sysclk = cs35l41_dai_set_sysclk, - .digital_mute = cs35l41_digital_mute, -}; - -static struct snd_soc_dai_driver cs35l41_dai[] = { - { - .name = "cs35l41-pcm", - .id = 0, - .playback = { - .stream_name = "AMP Playback", - .channels_min = 1, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_KNOT, - .formats = CS35L41_RX_FORMATS, - }, - .capture = { - .stream_name = "AMP Capture", - .channels_min = 1, - .channels_max = 8, - .rates = SNDRV_PCM_RATE_KNOT, - .formats = CS35L41_TX_FORMATS, - }, - .ops = &cs35l41_ops, - .symmetric_rates = 1, - }, -}; - - - -static struct snd_soc_codec_driver soc_codec_dev_cs35l41 = { - .probe = cs35l41_codec_probe, - .remove = cs35l41_codec_remove, - .component_driver = { - .dapm_widgets = cs35l41_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs35l41_dapm_widgets), - .dapm_routes = cs35l41_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs35l41_audio_map), - .controls = cs35l41_aud_controls, - .num_controls = ARRAY_SIZE(cs35l41_aud_controls), - }, - .set_sysclk = cs35l41_codec_set_sysclk, - .ignore_pmdown_time = false, - .idle_bias_off = true, -}; - -int spk_id_get(struct device_node *np) -{ - int id; - int state; - - state = spk_id_get_pin_3state(np); - if (state < 0) { - pr_err("%s: Can not get id pin state, %d\n", __func__, state); - return VENDOR_ID_NONE; - } - - switch (state) { - case PIN_PULL_DOWN: - id = VENDOR_ID_AAC; - break; - case PIN_PULL_UP: - id = VENDOR_ID_UNKNOWN; - break; - case PIN_FLOAT: - id = VENDOR_ID_GOER; - break; - default: - id = VENDOR_ID_UNKNOWN; - break; - } - return id; -} - -static int cs35l41_handle_of_data(struct device *dev, - struct cs35l41_platform_data *pdata) -{ - struct device_node *np = dev->of_node; - unsigned int val; - int ret; - struct device_node *sub_node; - struct classh_cfg *classh_config = &pdata->classh_config; - struct irq_cfg *irq_gpio1_config = &pdata->irq_config1; - struct irq_cfg *irq_gpio2_config = &pdata->irq_config2; - - if (!np) - return 0; - - pdata->right_channel = of_property_read_bool(np, - "cirrus,right-channel-amp"); - pdata->sclk_frc = of_property_read_bool(np, - "cirrus,sclk-force-output"); - pdata->lrclk_frc = of_property_read_bool(np, - "cirrus,lrclk-force-output"); - pdata->amp_gain_zc = of_property_read_bool(np, - "cirrus,amp-gain-zc"); - - if (of_property_read_u32(np, "cirrus,temp-warn_threshold", &val) >= 0) - pdata->temp_warn_thld = val | CS35L41_VALID_PDATA; - - ret = of_property_read_u32(np, "cirrus,boost-ctl-millivolt", &val); - if (ret >= 0) { - if (val < 2550 || val > 11000) { - dev_err(dev, - "Invalid Boost Voltage %u mV\n", val); - return -EINVAL; - } - pdata->bst_vctrl = ((val - 2550) / 100) + 1; - } - - ret = of_property_read_u32(np, "cirrus,boost-peak-milliamp", &val); - if (ret >= 0) - pdata->bst_ipk = val; - - ret = of_property_read_u32(np, "cirrus,boost-ind-nanohenry", &val); - if (ret >= 0) - pdata->bst_ind = val; - - ret = of_property_read_u32(np, "cirrus,boost-cap-microfarad", &val); - if (ret >= 0) - pdata->bst_cap = val; - - ret = of_property_read_u32(np, "cirrus,asp-sdout-hiz", &val); - if (ret >= 0) - pdata->dout_hiz = val; - else - pdata->dout_hiz = -1; - - pdata->ng_enable = of_property_read_bool(np, - "cirrus,noise-gate-enable"); - if (of_property_read_u32(np, "cirrus,noise-gate-threshold", &val) >= 0) - pdata->ng_pcm_thld = val | CS35L41_VALID_PDATA; - if (of_property_read_u32(np, "cirrus,noise-gate-delay", &val) >= 0) - pdata->ng_delay = val | CS35L41_VALID_PDATA; - - pdata->spk_id_gpio_p = of_parse_phandle(np, - "cirrus,spk-id-pin", 0); - if (!pdata->spk_id_gpio_p) { - dev_err(dev, "property %s not detected in node %s", - "cirrus,spk-id-pin", np->full_name); - pdata->mnSpkType = VENDOR_ID_NONE; - } else { - pdata->mnSpkType = spk_id_get(pdata->spk_id_gpio_p); - } - dev_info(dev, "spk is is %d", pdata->mnSpkType); - - sub_node = of_get_child_by_name(np, "cirrus,classh-internal-algo"); - classh_config->classh_algo_enable = sub_node ? true : false; - - if (classh_config->classh_algo_enable) { - classh_config->classh_bst_override = - of_property_read_bool(sub_node, - "cirrus,classh-bst-overide"); - - ret = of_property_read_u32(sub_node, - "cirrus,classh-bst-max-limit", - &val); - if (ret >= 0) { - val |= CS35L41_VALID_PDATA; - classh_config->classh_bst_max_limit = val; - } - - ret = of_property_read_u32(sub_node, "cirrus,classh-mem-depth", - &val); - if (ret >= 0) { - val |= CS35L41_VALID_PDATA; - classh_config->classh_mem_depth = val; - } - - ret = of_property_read_u32(sub_node, - "cirrus,classh-release-rate", &val); - if (ret >= 0) - classh_config->classh_release_rate = val; - - ret = of_property_read_u32(sub_node, "cirrus,classh-headroom", - &val); - if (ret >= 0) { - val |= CS35L41_VALID_PDATA; - classh_config->classh_headroom = val; - } - - ret = of_property_read_u32(sub_node, - "cirrus,classh-wk-fet-delay", &val); - if (ret >= 0) { - val |= CS35L41_VALID_PDATA; - classh_config->classh_wk_fet_delay = val; - } - - ret = of_property_read_u32(sub_node, - "cirrus,classh-wk-fet-thld", &val); - if (ret >= 0) - classh_config->classh_wk_fet_thld = val; - } - of_node_put(sub_node); - - /* GPIO1 Pin Config */ - sub_node = of_get_child_by_name(np, "cirrus,gpio-config1"); - irq_gpio1_config->is_present = sub_node ? true : false; - if (irq_gpio1_config->is_present) { - irq_gpio1_config->irq_pol_inv = of_property_read_bool(sub_node, - "cirrus,gpio-polarity-invert"); - irq_gpio1_config->irq_out_en = of_property_read_bool(sub_node, - "cirrus,gpio-output-enable"); - ret = of_property_read_u32(sub_node, "cirrus,gpio-src-select", - &val); - if (ret >= 0) { - val |= CS35L41_VALID_PDATA; - irq_gpio1_config->irq_src_sel = val; - } - } - of_node_put(sub_node); - - /* GPIO2 Pin Config */ - sub_node = of_get_child_by_name(np, "cirrus,gpio-config2"); - irq_gpio2_config->is_present = sub_node ? true : false; - if (irq_gpio2_config->is_present) { - irq_gpio2_config->irq_pol_inv = of_property_read_bool(sub_node, - "cirrus,gpio-polarity-invert"); - irq_gpio2_config->irq_out_en = of_property_read_bool(sub_node, - "cirrus,gpio-output-enable"); - ret = of_property_read_u32(sub_node, "cirrus,gpio-src-select", - &val); - if (ret >= 0) { - val |= CS35L41_VALID_PDATA; - irq_gpio2_config->irq_src_sel = val; - } - } - of_node_put(sub_node); - - return 0; -} - -static const struct reg_sequence cs35l41_reva0_errata_patch[] = { - {0x00000040, 0x00005555}, - {0x00000040, 0x0000AAAA}, - {0x00003854, 0x05180240}, - {CS35L41_VIMON_SPKMON_RESYNC, 0x00000000}, - {CS35L41_OTP_TRIM_30, 0x9091A1C8}, - {0x00003014, 0x0200EE0E}, - {CS35L41_BSTCVRT_DCM_CTRL, 0x00000051}, - {0x00000054, 0x00000004}, - {CS35L41_IRQ1_DB3, 0x00000000}, - {CS35L41_IRQ2_DB3, 0x00000000}, - {CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000}, - {CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000}, - {CS35L41_ASP_CONTROL4, 0x00000000}, - {0x00000040, 0x0000CCCC}, - {0x00000040, 0x00003333}, -}; - -static const struct reg_sequence cs35l41_revb0_errata_patch[] = { - {0x00000040, 0x00005555}, - {0x00000040, 0x0000AAAA}, - {CS35L41_VIMON_SPKMON_RESYNC, 0x00000000}, - {CS35L41_BSTCVRT_DCM_CTRL, 0x00000051}, - {CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000}, - {CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000}, - {CS35L41_ASP_CONTROL4, 0x00000000}, - {0x00000040, 0x0000CCCC}, - {0x00000040, 0x00003333}, -}; - -static int cs35l41_dsp_init(struct cs35l41_private *cs35l41) -{ - struct wm_adsp *dsp; - int ret; - - dsp = &cs35l41->dsp; - dsp->part = "cs35l41"; - dsp->num = 1; - dsp->type = WMFW_HALO; - dsp->rev = 0; - dsp->dev = cs35l41->dev; - dsp->regmap = cs35l41->regmap; - - dsp->base = CS35L41_DSP1_CTRL_BASE; - dsp->base_sysinfo = CS35L41_DSP1_SYS_ID; - dsp->mem = cs35l41_dsp1_regions; - dsp->num_mems = ARRAY_SIZE(cs35l41_dsp1_regions); - dsp->unlock_all = true; - - dsp->n_rx_rates = CS35L41_DSP_N_RX_RATES; - dsp->n_tx_rates = CS35L41_DSP_N_TX_RATES; - ret = wm_halo_init(dsp); - cs35l41->halo_booted = false; - - regmap_write(cs35l41->regmap, CS35L41_DSP1_RX5_SRC, - CS35L41_INPUT_SRC_VPMON); - regmap_write(cs35l41->regmap, CS35L41_DSP1_RX6_SRC, - CS35L41_INPUT_SRC_CLASSH); - regmap_write(cs35l41->regmap, CS35L41_DSP1_RX7_SRC, - CS35L41_INPUT_SRC_TEMPMON); - regmap_write(cs35l41->regmap, CS35L41_DSP1_RX8_SRC, - CS35L41_INPUT_SRC_RSVD); - - return ret; -} - -int cs35l41_probe(struct cs35l41_private *cs35l41, - struct cs35l41_platform_data *pdata) -{ - int ret; - u32 regid, reg_revid, i, mtl_revid, int_status, chipid_match; - int timeout = 100; - int irq_pol = 0; - - dev_info(cs35l41->dev, "cs35l41 proble\n" ); - - /* Default to RESUME cmd */ - cs35l41->cspl_cmd = (unsigned int)CSPL_MBOX_CMD_RESUME; - - for (i = 0; i < ARRAY_SIZE(cs35l41_supplies); i++) - cs35l41->supplies[i].supply = cs35l41_supplies[i]; - - cs35l41->num_supplies = ARRAY_SIZE(cs35l41_supplies); - - ret = devm_regulator_bulk_get(cs35l41->dev, cs35l41->num_supplies, - cs35l41->supplies); - if (ret != 0) { - dev_err(cs35l41->dev, - "Failed to request core supplies: %d\n", - ret); - return ret; - } - - if (pdata) { - cs35l41->pdata = *pdata; - } else if (cs35l41->dev->of_node) { - ret = cs35l41_handle_of_data(cs35l41->dev, &cs35l41->pdata); - if (ret != 0) - return ret; - } else { - ret = -EINVAL; - goto err; - } - - ret = regulator_bulk_enable(cs35l41->num_supplies, cs35l41->supplies); - if (ret != 0) { - dev_err(cs35l41->dev, - "Failed to enable core supplies: %d\n", ret); - return ret; - } - - /* returning NULL can be an option if in stereo mode */ - cs35l41->reset_gpio = of_get_named_gpio(cs35l41->dev->of_node, - "cs,cdc-reset-gpio", 0); - - dev_err(cs35l41->dev, "Set GPIO %d as RESET pin\n", cs35l41->reset_gpio); - if (!gpio_is_valid(cs35l41->reset_gpio)) { - dev_err(cs35l41->dev, "GPIO %d is invalid!\n", cs35l41->reset_gpio); - } - - if (cs35l41->reset_gpio) { - dev_err(cs35l41->dev, "Reset cs35l41\n"); - /* satisfy minimum reset pulse width spec */ - usleep_range(2000, 2100); - - gpio_direction_output(cs35l41->reset_gpio, 0); - msleep(5); - gpio_direction_output(cs35l41->reset_gpio, 1); - msleep(2); - } - - usleep_range(2000, 2100); - - do { - if (timeout == 0) { - dev_err(cs35l41->dev, - "Timeout waiting for OTP_BOOT_DONE\n"); - ret = -EBUSY; - goto err; - } - usleep_range(1000, 1100); - regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS4, &int_status); - timeout--; - } while (!(int_status & CS35L41_OTP_BOOT_DONE)); - - regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS3, &int_status); - if (int_status & CS35L41_OTP_BOOT_ERR) { - dev_err(cs35l41->dev, "OTP Boot error\n"); - ret = -EINVAL; - goto err; - } - - ret = regmap_read(cs35l41->regmap, CS35L41_DEVID, ®id); - if (ret < 0) { - dev_err(cs35l41->dev, "Get Device ID failed\n"); - goto err; - } - - ret = regmap_read(cs35l41->regmap, CS35L41_REVID, ®_revid); - if (ret < 0) { - dev_err(cs35l41->dev, "Get Revision ID failed\n"); - goto err; - } - - mtl_revid = reg_revid & CS35L41_MTLREVID_MASK; - - /* CS35L41 will have even MTLREVID - * CS35L41R will have odd MTLREVID - */ - chipid_match = (mtl_revid % 2) ? CS35L41R_CHIP_ID : CS35L41_CHIP_ID; - if (regid != chipid_match) { - dev_err(cs35l41->dev, "CS35L41 Device ID (%X). Expected ID %X\n", - regid, chipid_match); - ret = -ENODEV; - goto err; - } - - irq_pol = cs35l41_irq_gpio_config(cs35l41); - - init_completion(&cs35l41->global_pdn_done); - init_completion(&cs35l41->global_pup_done); - - init_completion(&cs35l41->mbox_cmd); - - ret = devm_request_threaded_irq(cs35l41->dev, cs35l41->irq, NULL, - cs35l41_irq, irq_pol | IRQF_ONESHOT, - "cs35l41", cs35l41); - - /* CS35L41 needs INT for PDN_DONE */ - if (ret != 0) { - dev_err(cs35l41->dev, "Failed to request IRQ: %d\n", cs35l41->irq); - //goto err; - } - - /* Set interrupt masks for critical errors */ - regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, - CS35L41_INT1_MASK_DEFAULT); - - switch (reg_revid) { - case CS35L41_REVID_A0: - ret = regmap_multi_reg_write(cs35l41->regmap, - cs35l41_reva0_errata_patch, - ARRAY_SIZE(cs35l41_reva0_errata_patch)); - if (ret < 0) { - dev_err(cs35l41->dev, - "Failed to apply A0 errata patch %d\n", ret); - goto err; - } - break; - case CS35L41_REVID_B0: - ret = regmap_multi_reg_write(cs35l41->regmap, - cs35l41_revb0_errata_patch, - ARRAY_SIZE(cs35l41_revb0_errata_patch)); - if (ret < 0) { - dev_err(cs35l41->dev, - "Failed to apply B0 errata patch %d\n", ret); - goto err; - } - break; - } - - ret = cs35l41_otp_unpack(cs35l41); - if (ret < 0) { - dev_err(cs35l41->dev, "OTP Unpack failed\n"); - goto err; - } - - cs35l41_dsp_init(cs35l41); - - ret = snd_soc_register_codec(cs35l41->dev, &soc_codec_dev_cs35l41, - cs35l41_dai, ARRAY_SIZE(cs35l41_dai)); - if (ret < 0) { - dev_err(cs35l41->dev, "%s: Register codec failed\n", __func__); - goto err; - } - - dev_info(cs35l41->dev, "Cirrus Logic CS35L41 (%x), Revision: %02X\n", - regid, reg_revid); - -err: - regulator_bulk_disable(cs35l41->num_supplies, cs35l41->supplies); - return ret; -} - -MODULE_DESCRIPTION("ASoC CS35L41 driver"); -MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, "); -MODULE_LICENSE("GPL"); diff --git a/techpack/audio/asoc/codecs/cs35l41/cs35l41.h b/techpack/audio/asoc/codecs/cs35l41/cs35l41.h deleted file mode 100755 index 9ebbe2b791ac..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/cs35l41.h +++ /dev/null @@ -1,765 +0,0 @@ -/* - * cs35l41.h -- CS35L41 ALSA SoC audio driver - * - * Copyright 2018 Cirrus Logic, Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: Brian Austin - * David Rhodes - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#ifndef __CS35L41_H__ -#define __CS35L41_H__ - -#include - -#define CS35L41_FIRSTREG 0x00000000 -#define CS35L41_LASTREG 0x03804FE8 -#define CS35L41_DEVID 0x00000000 -#define CS35L41_REVID 0x00000004 -#define CS35L41_FABID 0x00000008 -#define CS35L41_RELID 0x0000000C -#define CS35L41_OTPID 0x00000010 -#define CS35L41_SFT_RESET 0x00000020 -#define CS35L41_TEST_KEY_CTL 0x00000040 -#define CS35L41_USER_KEY_CTL 0x00000044 -#define CS35L41_OTP_MEM0 0x00000400 -#define CS35L41_OTP_MEM31 0x0000047C -#define CS35L41_OTP_CTRL0 0x00000500 -#define CS35L41_OTP_CTRL1 0x00000504 -#define CS35L41_OTP_CTRL3 0x00000508 -#define CS35L41_OTP_CTRL4 0x0000050C -#define CS35L41_OTP_CTRL5 0x00000510 -#define CS35L41_OTP_CTRL6 0x00000514 -#define CS35L41_OTP_CTRL7 0x00000518 -#define CS35L41_OTP_CTRL8 0x0000051C -#define CS35L41_PWR_CTRL1 0x00002014 -#define CS35L41_PWR_CTRL2 0x00002018 -#define CS35L41_PWR_CTRL3 0x0000201C -#define CS35L41_CTRL_OVRRIDE 0x00002020 -#define CS35L41_AMP_OUT_MUTE 0x00002024 -#define CS35L41_PROTECT_REL_ERR_IGN 0x00002034 -#define CS35L41_GPIO_PAD_CONTROL 0x0000242C -#define CS35L41_JTAG_CONTROL 0x00002438 -#define CS35L41_PLL_CLK_CTRL 0x00002C04 -#define CS35L41_DSP_CLK_CTRL 0x00002C08 -#define CS35L41_GLOBAL_CLK_CTRL 0x00002C0C -#define CS35L41_DATA_FS_SEL 0x00002C10 -#define CS35L41_MDSYNC_EN 0x00003400 -#define CS35L41_MDSYNC_TX_ID 0x00003408 -#define CS35L41_MDSYNC_PWR_CTRL 0x0000340C -#define CS35L41_MDSYNC_DATA_TX 0x00003410 -#define CS35L41_MDSYNC_TX_STATUS 0x00003414 -#define CS35L41_MDSYNC_DATA_RX 0x0000341C -#define CS35L41_MDSYNC_RX_STATUS 0x00003420 -#define CS35L41_MDSYNC_ERR_STATUS 0x00003424 -#define CS35L41_MDSYNC_SYNC_PTE2 0x00003528 -#define CS35L41_MDSYNC_SYNC_PTE3 0x0000352C -#define CS35L41_MDSYNC_SYNC_MSM_STATUS 0x0000353C -#define CS35L41_BSTCVRT_VCTRL1 0x00003800 -#define CS35L41_BSTCVRT_VCTRL2 0x00003804 -#define CS35L41_BSTCVRT_PEAK_CUR 0x00003808 -#define CS35L41_BSTCVRT_SFT_RAMP 0x0000380C -#define CS35L41_BSTCVRT_COEFF 0x00003810 -#define CS35L41_BSTCVRT_SLOPE_LBST 0x00003814 -#define CS35L41_BSTCVRT_SW_FREQ 0x00003818 -#define CS35L41_BSTCVRT_DCM_CTRL 0x0000381C -#define CS35L41_BSTCVRT_DCM_MODE_FORCE 0x00003820 -#define CS35L41_BSTCVRT_OVERVOLT_CTRL 0x00003830 -#define CS35L41_VI_VOL_POL 0x00004000 -#define CS35L41_VIMON_SPKMON_RESYNC 0x00004100 -#define CS35L41_DTEMP_WARN_THLD 0x00004220 -#define CS35L41_DTEMP_CFG 0x00004224 -#define CS35L41_DTEMP_EN 0x00004308 -#define CS35L41_VPVBST_FS_SEL 0x00004400 -#define CS35L41_SP_ENABLES 0x00004800 -#define CS35L41_SP_RATE_CTRL 0x00004804 -#define CS35L41_SP_FORMAT 0x00004808 -#define CS35L41_SP_HIZ_CTRL 0x0000480C -#define CS35L41_SP_FRAME_TX_SLOT 0x00004810 -#define CS35L41_SP_FRAME_RX_SLOT 0x00004820 -#define CS35L41_SP_TX_WL 0x00004830 -#define CS35L41_SP_RX_WL 0x00004840 -#define CS35L41_ASP_CONTROL4 0x00004854 -#define CS35L41_DAC_PCM1_SRC 0x00004C00 -#define CS35L41_ASP_TX1_SRC 0x00004C20 -#define CS35L41_ASP_TX2_SRC 0x00004C24 -#define CS35L41_ASP_TX3_SRC 0x00004C28 -#define CS35L41_ASP_TX4_SRC 0x00004C2C -#define CS35L41_DSP1_RX1_SRC 0x00004C40 -#define CS35L41_DSP1_RX2_SRC 0x00004C44 -#define CS35L41_DSP1_RX3_SRC 0x00004C48 -#define CS35L41_DSP1_RX4_SRC 0x00004C4C -#define CS35L41_DSP1_RX5_SRC 0x00004C50 -#define CS35L41_DSP1_RX6_SRC 0x00004C54 -#define CS35L41_DSP1_RX7_SRC 0x00004C58 -#define CS35L41_DSP1_RX8_SRC 0x00004C5C -#define CS35L41_NGATE1_SRC 0x00004C60 -#define CS35L41_NGATE2_SRC 0x00004C64 -#define CS35L41_AMP_DIG_VOL_CTRL 0x00006000 -#define CS35L41_VPBR_CFG 0x00006404 -#define CS35L41_VBBR_CFG 0x00006408 -#define CS35L41_VPBR_STATUS 0x0000640C -#define CS35L41_VBBR_STATUS 0x00006410 -#define CS35L41_OVERTEMP_CFG 0x00006414 -#define CS35L41_AMP_ERR_VOL 0x00006418 -#define CS35L41_VOL_STATUS_TO_DSP 0x00006450 -#define CS35L41_CLASSH_CFG 0x00006800 -#define CS35L41_WKFET_CFG 0x00006804 -#define CS35L41_NG_CFG 0x00006808 -#define CS35L41_AMP_GAIN_CTRL 0x00006C04 -#define CS35L41_DAC_MSM_CFG 0x00007400 -#define CS35L41_IRQ1_CFG 0x00010000 -#define CS35L41_IRQ1_STATUS 0x00010004 -#define CS35L41_IRQ1_STATUS1 0x00010010 -#define CS35L41_IRQ1_STATUS2 0x00010014 -#define CS35L41_IRQ1_STATUS3 0x00010018 -#define CS35L41_IRQ1_STATUS4 0x0001001C -#define CS35L41_IRQ1_RAW_STATUS1 0x00010090 -#define CS35L41_IRQ1_RAW_STATUS2 0x00010094 -#define CS35L41_IRQ1_RAW_STATUS3 0x00010098 -#define CS35L41_IRQ1_RAW_STATUS4 0x0001009C -#define CS35L41_IRQ1_MASK1 0x00010110 -#define CS35L41_IRQ1_MASK2 0x00010114 -#define CS35L41_IRQ1_MASK3 0x00010118 -#define CS35L41_IRQ1_MASK4 0x0001011C -#define CS35L41_IRQ1_FRC1 0x00010190 -#define CS35L41_IRQ1_FRC2 0x00010194 -#define CS35L41_IRQ1_FRC3 0x00010198 -#define CS35L41_IRQ1_FRC4 0x0001019C -#define CS35L41_IRQ1_EDGE1 0x00010210 -#define CS35L41_IRQ1_EDGE4 0x0001021C -#define CS35L41_IRQ1_POL1 0x00010290 -#define CS35L41_IRQ1_POL2 0x00010294 -#define CS35L41_IRQ1_POL3 0x00010298 -#define CS35L41_IRQ1_POL4 0x0001029C -#define CS35L41_IRQ1_DB3 0x00010318 -#define CS35L41_IRQ2_CFG 0x00010800 -#define CS35L41_IRQ2_STATUS 0x00010804 -#define CS35L41_IRQ2_STATUS1 0x00010810 -#define CS35L41_IRQ2_STATUS2 0x00010814 -#define CS35L41_IRQ2_STATUS3 0x00010818 -#define CS35L41_IRQ2_STATUS4 0x0001081C -#define CS35L41_IRQ2_RAW_STATUS1 0x00010890 -#define CS35L41_IRQ2_RAW_STATUS2 0x00010894 -#define CS35L41_IRQ2_RAW_STATUS3 0x00010898 -#define CS35L41_IRQ2_RAW_STATUS4 0x0001089C -#define CS35L41_IRQ2_MASK1 0x00010910 -#define CS35L41_IRQ2_MASK2 0x00010914 -#define CS35L41_IRQ2_MASK3 0x00010918 -#define CS35L41_IRQ2_MASK4 0x0001091C -#define CS35L41_IRQ2_FRC1 0x00010990 -#define CS35L41_IRQ2_FRC2 0x00010994 -#define CS35L41_IRQ2_FRC3 0x00010998 -#define CS35L41_IRQ2_FRC4 0x0001099C -#define CS35L41_IRQ2_EDGE1 0x00010A10 -#define CS35L41_IRQ2_EDGE4 0x00010A1C -#define CS35L41_IRQ2_POL1 0x00010A90 -#define CS35L41_IRQ2_POL2 0x00010A94 -#define CS35L41_IRQ2_POL3 0x00010A98 -#define CS35L41_IRQ2_POL4 0x00010A9C -#define CS35L41_IRQ2_DB3 0x00010B18 -#define CS35L41_GPIO_STATUS1 0x00011000 -#define CS35L41_GPIO1_CTRL1 0x00011008 -#define CS35L41_GPIO2_CTRL1 0x0001100C -#define CS35L41_MIXER_NGATE_CFG 0x00012000 -#define CS35L41_MIXER_NGATE_CH1_CFG 0x00012004 -#define CS35L41_MIXER_NGATE_CH2_CFG 0x00012008 -#define CS35L41_DSP_MBOX_1 0x00013000 -#define CS35L41_DSP_MBOX_2 0x00013004 -#define CS35L41_DSP_MBOX_3 0x00013008 -#define CS35L41_DSP_MBOX_4 0x0001300C -#define CS35L41_DSP_MBOX_5 0x00013010 -#define CS35L41_DSP_MBOX_6 0x00013014 -#define CS35L41_DSP_MBOX_7 0x00013018 -#define CS35L41_DSP_MBOX_8 0x0001301C -#define CS35L41_DSP_VIRT1_MBOX_1 0x00013020 -#define CS35L41_DSP_VIRT1_MBOX_2 0x00013024 -#define CS35L41_DSP_VIRT1_MBOX_3 0x00013028 -#define CS35L41_DSP_VIRT1_MBOX_4 0x0001302C -#define CS35L41_DSP_VIRT1_MBOX_5 0x00013030 -#define CS35L41_DSP_VIRT1_MBOX_6 0x00013034 -#define CS35L41_DSP_VIRT1_MBOX_7 0x00013038 -#define CS35L41_DSP_VIRT1_MBOX_8 0x0001303C -#define CS35L41_DSP_VIRT2_MBOX_1 0x00013040 -#define CS35L41_DSP_VIRT2_MBOX_2 0x00013044 -#define CS35L41_DSP_VIRT2_MBOX_3 0x00013048 -#define CS35L41_DSP_VIRT2_MBOX_4 0x0001304C -#define CS35L41_DSP_VIRT2_MBOX_5 0x00013050 -#define CS35L41_DSP_VIRT2_MBOX_6 0x00013054 -#define CS35L41_DSP_VIRT2_MBOX_7 0x00013058 -#define CS35L41_DSP_VIRT2_MBOX_8 0x0001305C -#define CS35L41_CLOCK_DETECT_1 0x00014000 -#define CS35L41_TIMER1_CONTROL 0x00015000 -#define CS35L41_TIMER1_COUNT_PRESET 0x00015004 -#define CS35L41_TIMER1_START_STOP 0x0001500C -#define CS35L41_TIMER1_STATUS 0x00015010 -#define CS35L41_TIMER1_COUNT_READBACK 0x00015014 -#define CS35L41_TIMER1_DSP_CLK_CFG 0x00015018 -#define CS35L41_TIMER1_DSP_CLK_STATUS 0x0001501C -#define CS35L41_TIMER2_CONTROL 0x00015100 -#define CS35L41_TIMER2_COUNT_PRESET 0x00015104 -#define CS35L41_TIMER2_START_STOP 0x0001510C -#define CS35L41_TIMER2_STATUS 0x00015110 -#define CS35L41_TIMER2_COUNT_READBACK 0x00015114 -#define CS35L41_TIMER2_DSP_CLK_CFG 0x00015118 -#define CS35L41_TIMER2_DSP_CLK_STATUS 0x0001511C -#define CS35L41_DFT_JTAG_CONTROL 0x00016000 -#define CS35L41_DIE_STS1 0x00017040 -#define CS35L41_DIE_STS2 0x00017044 -#define CS35L41_TEMP_CAL1 0x00017048 -#define CS35L41_TEMP_CAL2 0x0001704C -#define CS35L41_DSP1_XMEM_PACK_0 0x02000000 -#define CS35L41_DSP1_XMEM_PACK_3068 0x02002FF0 -#define CS35L41_DSP1_XMEM_UNPACK32_0 0x02400000 -#define CS35L41_DSP1_XMEM_UNPACK32_2046 0x02401FF8 -#define CS35L41_DSP1_TIMESTAMP_COUNT 0x025C0800 -#define CS35L41_DSP1_SYS_ID 0x025E0000 -#define CS35L41_DSP1_SYS_VERSION 0x025E0004 -#define CS35L41_DSP1_SYS_CORE_ID 0x025E0008 -#define CS35L41_DSP1_SYS_AHB_ADDR 0x025E000C -#define CS35L41_DSP1_SYS_XSRAM_SIZE 0x025E0010 -#define CS35L41_DSP1_SYS_YSRAM_SIZE 0x025E0018 -#define CS35L41_DSP1_SYS_PSRAM_SIZE 0x025E0020 -#define CS35L41_DSP1_SYS_PM_BOOT_SIZE 0x025E0028 -#define CS35L41_DSP1_SYS_FEATURES 0x025E002C -#define CS35L41_DSP1_SYS_FIR_FILTERS 0x025E0030 -#define CS35L41_DSP1_SYS_LMS_FILTERS 0x025E0034 -#define CS35L41_DSP1_SYS_XM_BANK_SIZE 0x025E0038 -#define CS35L41_DSP1_SYS_YM_BANK_SIZE 0x025E003C -#define CS35L41_DSP1_SYS_PM_BANK_SIZE 0x025E0040 -#define CS35L41_DSP1_AHBM_WIN0_CTRL0 0x025E2000 -#define CS35L41_DSP1_AHBM_WIN0_CTRL1 0x025E2004 -#define CS35L41_DSP1_AHBM_WIN1_CTRL0 0x025E2008 -#define CS35L41_DSP1_AHBM_WIN1_CTRL1 0x025E200C -#define CS35L41_DSP1_AHBM_WIN2_CTRL0 0x025E2010 -#define CS35L41_DSP1_AHBM_WIN2_CTRL1 0x025E2014 -#define CS35L41_DSP1_AHBM_WIN3_CTRL0 0x025E2018 -#define CS35L41_DSP1_AHBM_WIN3_CTRL1 0x025E201C -#define CS35L41_DSP1_AHBM_WIN4_CTRL0 0x025E2020 -#define CS35L41_DSP1_AHBM_WIN4_CTRL1 0x025E2024 -#define CS35L41_DSP1_AHBM_WIN5_CTRL0 0x025E2028 -#define CS35L41_DSP1_AHBM_WIN5_CTRL1 0x025E202C -#define CS35L41_DSP1_AHBM_WIN6_CTRL0 0x025E2030 -#define CS35L41_DSP1_AHBM_WIN6_CTRL1 0x025E2034 -#define CS35L41_DSP1_AHBM_WIN7_CTRL0 0x025E2038 -#define CS35L41_DSP1_AHBM_WIN7_CTRL1 0x025E203C -#define CS35L41_DSP1_AHBM_WIN_DBG_CTRL0 0x025E2040 -#define CS35L41_DSP1_AHBM_WIN_DBG_CTRL1 0x025E2044 -#define CS35L41_DSP1_XMEM_UNPACK24_0 0x02800000 -#define CS35L41_DSP1_XMEM_UNPACK24_4093 0x02803FF4 -#define CS35L41_DSP1_CTRL_BASE 0x02B80000 -#define CS35L41_DSP1_CORE_SOFT_RESET 0x02B80010 -#define CS35L41_DSP1_DEBUG 0x02B80040 -#define CS35L41_DSP1_TIMER_CTRL 0x02B80048 -#define CS35L41_DSP1_STREAM_ARB_CTRL 0x02B80050 -#define CS35L41_DSP1_RX1_RATE 0x02B80080 -#define CS35L41_DSP1_RX2_RATE 0x02B80088 -#define CS35L41_DSP1_RX3_RATE 0x02B80090 -#define CS35L41_DSP1_RX4_RATE 0x02B80098 -#define CS35L41_DSP1_RX5_RATE 0x02B800A0 -#define CS35L41_DSP1_RX6_RATE 0x02B800A8 -#define CS35L41_DSP1_RX7_RATE 0x02B800B0 -#define CS35L41_DSP1_RX8_RATE 0x02B800B8 -#define CS35L41_DSP1_TX1_RATE 0x02B80280 -#define CS35L41_DSP1_TX2_RATE 0x02B80288 -#define CS35L41_DSP1_TX3_RATE 0x02B80290 -#define CS35L41_DSP1_TX4_RATE 0x02B80298 -#define CS35L41_DSP1_TX5_RATE 0x02B802A0 -#define CS35L41_DSP1_TX6_RATE 0x02B802A8 -#define CS35L41_DSP1_TX7_RATE 0x02B802B0 -#define CS35L41_DSP1_TX8_RATE 0x02B802B8 -#define CS35L41_DSP1_NMI_CTRL1 0x02B80480 -#define CS35L41_DSP1_NMI_CTRL2 0x02B80488 -#define CS35L41_DSP1_NMI_CTRL3 0x02B80490 -#define CS35L41_DSP1_NMI_CTRL4 0x02B80498 -#define CS35L41_DSP1_NMI_CTRL5 0x02B804A0 -#define CS35L41_DSP1_NMI_CTRL6 0x02B804A8 -#define CS35L41_DSP1_NMI_CTRL7 0x02B804B0 -#define CS35L41_DSP1_NMI_CTRL8 0x02B804B8 -#define CS35L41_DSP1_RESUME_CTRL 0x02B80500 -#define CS35L41_DSP1_IRQ1_CTRL 0x02B80508 -#define CS35L41_DSP1_IRQ2_CTRL 0x02B80510 -#define CS35L41_DSP1_IRQ3_CTRL 0x02B80518 -#define CS35L41_DSP1_IRQ4_CTRL 0x02B80520 -#define CS35L41_DSP1_IRQ5_CTRL 0x02B80528 -#define CS35L41_DSP1_IRQ6_CTRL 0x02B80530 -#define CS35L41_DSP1_IRQ7_CTRL 0x02B80538 -#define CS35L41_DSP1_IRQ8_CTRL 0x02B80540 -#define CS35L41_DSP1_IRQ9_CTRL 0x02B80548 -#define CS35L41_DSP1_IRQ10_CTRL 0x02B80550 -#define CS35L41_DSP1_IRQ11_CTRL 0x02B80558 -#define CS35L41_DSP1_IRQ12_CTRL 0x02B80560 -#define CS35L41_DSP1_IRQ13_CTRL 0x02B80568 -#define CS35L41_DSP1_IRQ14_CTRL 0x02B80570 -#define CS35L41_DSP1_IRQ15_CTRL 0x02B80578 -#define CS35L41_DSP1_IRQ16_CTRL 0x02B80580 -#define CS35L41_DSP1_IRQ17_CTRL 0x02B80588 -#define CS35L41_DSP1_IRQ18_CTRL 0x02B80590 -#define CS35L41_DSP1_IRQ19_CTRL 0x02B80598 -#define CS35L41_DSP1_IRQ20_CTRL 0x02B805A0 -#define CS35L41_DSP1_IRQ21_CTRL 0x02B805A8 -#define CS35L41_DSP1_IRQ22_CTRL 0x02B805B0 -#define CS35L41_DSP1_IRQ23_CTRL 0x02B805B8 -#define CS35L41_DSP1_SCRATCH1 0x02B805C0 -#define CS35L41_DSP1_SCRATCH2 0x02B805C8 -#define CS35L41_DSP1_SCRATCH3 0x02B805D0 -#define CS35L41_DSP1_SCRATCH4 0x02B805D8 -#define CS35L41_DSP1_CCM_CORE_CTRL 0x02BC1000 -#define CS35L41_DSP1_CCM_CLK_OVERRIDE 0x02BC1008 -#define CS35L41_DSP1_XM_MSTR_EN 0x02BC2000 -#define CS35L41_DSP1_XM_CORE_PRI 0x02BC2008 -#define CS35L41_DSP1_XM_AHB_PACK_PL_PRI 0x02BC2010 -#define CS35L41_DSP1_XM_AHB_UP_PL_PRI 0x02BC2018 -#define CS35L41_DSP1_XM_ACCEL_PL0_PRI 0x02BC2020 -#define CS35L41_DSP1_XM_NPL0_PRI 0x02BC2078 -#define CS35L41_DSP1_YM_MSTR_EN 0x02BC20C0 -#define CS35L41_DSP1_YM_CORE_PRI 0x02BC20C8 -#define CS35L41_DSP1_YM_AHB_PACK_PL_PRI 0x02BC20D0 -#define CS35L41_DSP1_YM_AHB_UP_PL_PRI 0x02BC20D8 -#define CS35L41_DSP1_YM_ACCEL_PL0_PRI 0x02BC20E0 -#define CS35L41_DSP1_YM_NPL0_PRI 0x02BC2138 -#define CS35L41_DSP1_PM_MSTR_EN 0x02BC2180 -#define CS35L41_DSP1_PM_PATCH0_ADDR 0x02BC2188 -#define CS35L41_DSP1_PM_PATCH0_EN 0x02BC218C -#define CS35L41_DSP1_PM_PATCH0_DATA_LO 0x02BC2190 -#define CS35L41_DSP1_PM_PATCH0_DATA_HI 0x02BC2194 -#define CS35L41_DSP1_PM_PATCH1_ADDR 0x02BC2198 -#define CS35L41_DSP1_PM_PATCH1_EN 0x02BC219C -#define CS35L41_DSP1_PM_PATCH1_DATA_LO 0x02BC21A0 -#define CS35L41_DSP1_PM_PATCH1_DATA_HI 0x02BC21A4 -#define CS35L41_DSP1_PM_PATCH2_ADDR 0x02BC21A8 -#define CS35L41_DSP1_PM_PATCH2_EN 0x02BC21AC -#define CS35L41_DSP1_PM_PATCH2_DATA_LO 0x02BC21B0 -#define CS35L41_DSP1_PM_PATCH2_DATA_HI 0x02BC21B4 -#define CS35L41_DSP1_PM_PATCH3_ADDR 0x02BC21B8 -#define CS35L41_DSP1_PM_PATCH3_EN 0x02BC21BC -#define CS35L41_DSP1_PM_PATCH3_DATA_LO 0x02BC21C0 -#define CS35L41_DSP1_PM_PATCH3_DATA_HI 0x02BC21C4 -#define CS35L41_DSP1_PM_PATCH4_ADDR 0x02BC21C8 -#define CS35L41_DSP1_PM_PATCH4_EN 0x02BC21CC -#define CS35L41_DSP1_PM_PATCH4_DATA_LO 0x02BC21D0 -#define CS35L41_DSP1_PM_PATCH4_DATA_HI 0x02BC21D4 -#define CS35L41_DSP1_PM_PATCH5_ADDR 0x02BC21D8 -#define CS35L41_DSP1_PM_PATCH5_EN 0x02BC21DC -#define CS35L41_DSP1_PM_PATCH5_DATA_LO 0x02BC21E0 -#define CS35L41_DSP1_PM_PATCH5_DATA_HI 0x02BC21E4 -#define CS35L41_DSP1_PM_PATCH6_ADDR 0x02BC21E8 -#define CS35L41_DSP1_PM_PATCH6_EN 0x02BC21EC -#define CS35L41_DSP1_PM_PATCH6_DATA_LO 0x02BC21F0 -#define CS35L41_DSP1_PM_PATCH6_DATA_HI 0x02BC21F4 -#define CS35L41_DSP1_PM_PATCH7_ADDR 0x02BC21F8 -#define CS35L41_DSP1_PM_PATCH7_EN 0x02BC21FC -#define CS35L41_DSP1_PM_PATCH7_DATA_LO 0x02BC2200 -#define CS35L41_DSP1_PM_PATCH7_DATA_HI 0x02BC2204 -#define CS35L41_DSP1_MPU_XM_ACCESS0 0x02BC3000 -#define CS35L41_DSP1_MPU_YM_ACCESS0 0x02BC3004 -#define CS35L41_DSP1_MPU_WNDW_ACCESS0 0x02BC3008 -#define CS35L41_DSP1_MPU_XREG_ACCESS0 0x02BC300C -#define CS35L41_DSP1_MPU_YREG_ACCESS0 0x02BC3014 -#define CS35L41_DSP1_MPU_XM_ACCESS1 0x02BC3018 -#define CS35L41_DSP1_MPU_YM_ACCESS1 0x02BC301C -#define CS35L41_DSP1_MPU_WNDW_ACCESS1 0x02BC3020 -#define CS35L41_DSP1_MPU_XREG_ACCESS1 0x02BC3024 -#define CS35L41_DSP1_MPU_YREG_ACCESS1 0x02BC302C -#define CS35L41_DSP1_MPU_XM_ACCESS2 0x02BC3030 -#define CS35L41_DSP1_MPU_YM_ACCESS2 0x02BC3034 -#define CS35L41_DSP1_MPU_WNDW_ACCESS2 0x02BC3038 -#define CS35L41_DSP1_MPU_XREG_ACCESS2 0x02BC303C -#define CS35L41_DSP1_MPU_YREG_ACCESS2 0x02BC3044 -#define CS35L41_DSP1_MPU_XM_ACCESS3 0x02BC3048 -#define CS35L41_DSP1_MPU_YM_ACCESS3 0x02BC304C -#define CS35L41_DSP1_MPU_WNDW_ACCESS3 0x02BC3050 -#define CS35L41_DSP1_MPU_XREG_ACCESS3 0x02BC3054 -#define CS35L41_DSP1_MPU_YREG_ACCESS3 0x02BC305C -#define CS35L41_DSP1_MPU_XM_VIO_ADDR 0x02BC3100 -#define CS35L41_DSP1_MPU_XM_VIO_STATUS 0x02BC3104 -#define CS35L41_DSP1_MPU_YM_VIO_ADDR 0x02BC3108 -#define CS35L41_DSP1_MPU_YM_VIO_STATUS 0x02BC310C -#define CS35L41_DSP1_MPU_PM_VIO_ADDR 0x02BC3110 -#define CS35L41_DSP1_MPU_PM_VIO_STATUS 0x02BC3114 -#define CS35L41_DSP1_MPU_LOCK_CONFIG 0x02BC3140 -#define CS35L41_DSP1_MPU_WDT_RST_CTRL 0x02BC3180 -#define CS35L41_DSP1_STRMARB_MSTR0_CFG0 0x02BC5000 -#define CS35L41_DSP1_STRMARB_MSTR0_CFG1 0x02BC5004 -#define CS35L41_DSP1_STRMARB_MSTR0_CFG2 0x02BC5008 -#define CS35L41_DSP1_STRMARB_MSTR1_CFG0 0x02BC5010 -#define CS35L41_DSP1_STRMARB_MSTR1_CFG1 0x02BC5014 -#define CS35L41_DSP1_STRMARB_MSTR1_CFG2 0x02BC5018 -#define CS35L41_DSP1_STRMARB_MSTR2_CFG0 0x02BC5020 -#define CS35L41_DSP1_STRMARB_MSTR2_CFG1 0x02BC5024 -#define CS35L41_DSP1_STRMARB_MSTR2_CFG2 0x02BC5028 -#define CS35L41_DSP1_STRMARB_MSTR3_CFG0 0x02BC5030 -#define CS35L41_DSP1_STRMARB_MSTR3_CFG1 0x02BC5034 -#define CS35L41_DSP1_STRMARB_MSTR3_CFG2 0x02BC5038 -#define CS35L41_DSP1_STRMARB_MSTR4_CFG0 0x02BC5040 -#define CS35L41_DSP1_STRMARB_MSTR4_CFG1 0x02BC5044 -#define CS35L41_DSP1_STRMARB_MSTR4_CFG2 0x02BC5048 -#define CS35L41_DSP1_STRMARB_MSTR5_CFG0 0x02BC5050 -#define CS35L41_DSP1_STRMARB_MSTR5_CFG1 0x02BC5054 -#define CS35L41_DSP1_STRMARB_MSTR5_CFG2 0x02BC5058 -#define CS35L41_DSP1_STRMARB_MSTR6_CFG0 0x02BC5060 -#define CS35L41_DSP1_STRMARB_MSTR6_CFG1 0x02BC5064 -#define CS35L41_DSP1_STRMARB_MSTR6_CFG2 0x02BC5068 -#define CS35L41_DSP1_STRMARB_MSTR7_CFG0 0x02BC5070 -#define CS35L41_DSP1_STRMARB_MSTR7_CFG1 0x02BC5074 -#define CS35L41_DSP1_STRMARB_MSTR7_CFG2 0x02BC5078 -#define CS35L41_DSP1_STRMARB_TX0_CFG0 0x02BC5200 -#define CS35L41_DSP1_STRMARB_TX0_CFG1 0x02BC5204 -#define CS35L41_DSP1_STRMARB_TX1_CFG0 0x02BC5208 -#define CS35L41_DSP1_STRMARB_TX1_CFG1 0x02BC520C -#define CS35L41_DSP1_STRMARB_TX2_CFG0 0x02BC5210 -#define CS35L41_DSP1_STRMARB_TX2_CFG1 0x02BC5214 -#define CS35L41_DSP1_STRMARB_TX3_CFG0 0x02BC5218 -#define CS35L41_DSP1_STRMARB_TX3_CFG1 0x02BC521C -#define CS35L41_DSP1_STRMARB_TX4_CFG0 0x02BC5220 -#define CS35L41_DSP1_STRMARB_TX4_CFG1 0x02BC5224 -#define CS35L41_DSP1_STRMARB_TX5_CFG0 0x02BC5228 -#define CS35L41_DSP1_STRMARB_TX5_CFG1 0x02BC522C -#define CS35L41_DSP1_STRMARB_TX6_CFG0 0x02BC5230 -#define CS35L41_DSP1_STRMARB_TX6_CFG1 0x02BC5234 -#define CS35L41_DSP1_STRMARB_TX7_CFG0 0x02BC5238 -#define CS35L41_DSP1_STRMARB_TX7_CFG1 0x02BC523C -#define CS35L41_DSP1_STRMARB_RX0_CFG0 0x02BC5400 -#define CS35L41_DSP1_STRMARB_RX0_CFG1 0x02BC5404 -#define CS35L41_DSP1_STRMARB_RX1_CFG0 0x02BC5408 -#define CS35L41_DSP1_STRMARB_RX1_CFG1 0x02BC540C -#define CS35L41_DSP1_STRMARB_RX2_CFG0 0x02BC5410 -#define CS35L41_DSP1_STRMARB_RX2_CFG1 0x02BC5414 -#define CS35L41_DSP1_STRMARB_RX3_CFG0 0x02BC5418 -#define CS35L41_DSP1_STRMARB_RX3_CFG1 0x02BC541C -#define CS35L41_DSP1_STRMARB_RX4_CFG0 0x02BC5420 -#define CS35L41_DSP1_STRMARB_RX4_CFG1 0x02BC5424 -#define CS35L41_DSP1_STRMARB_RX5_CFG0 0x02BC5428 -#define CS35L41_DSP1_STRMARB_RX5_CFG1 0x02BC542C -#define CS35L41_DSP1_STRMARB_RX6_CFG0 0x02BC5430 -#define CS35L41_DSP1_STRMARB_RX6_CFG1 0x02BC5434 -#define CS35L41_DSP1_STRMARB_RX7_CFG0 0x02BC5438 -#define CS35L41_DSP1_STRMARB_RX7_CFG1 0x02BC543C -#define CS35L41_DSP1_STRMARB_IRQ0_CFG0 0x02BC5600 -#define CS35L41_DSP1_STRMARB_IRQ0_CFG1 0x02BC5604 -#define CS35L41_DSP1_STRMARB_IRQ0_CFG2 0x02BC5608 -#define CS35L41_DSP1_STRMARB_IRQ1_CFG0 0x02BC5610 -#define CS35L41_DSP1_STRMARB_IRQ1_CFG1 0x02BC5614 -#define CS35L41_DSP1_STRMARB_IRQ1_CFG2 0x02BC5618 -#define CS35L41_DSP1_STRMARB_IRQ2_CFG0 0x02BC5620 -#define CS35L41_DSP1_STRMARB_IRQ2_CFG1 0x02BC5624 -#define CS35L41_DSP1_STRMARB_IRQ2_CFG2 0x02BC5628 -#define CS35L41_DSP1_STRMARB_IRQ3_CFG0 0x02BC5630 -#define CS35L41_DSP1_STRMARB_IRQ3_CFG1 0x02BC5634 -#define CS35L41_DSP1_STRMARB_IRQ3_CFG2 0x02BC5638 -#define CS35L41_DSP1_STRMARB_IRQ4_CFG0 0x02BC5640 -#define CS35L41_DSP1_STRMARB_IRQ4_CFG1 0x02BC5644 -#define CS35L41_DSP1_STRMARB_IRQ4_CFG2 0x02BC5648 -#define CS35L41_DSP1_STRMARB_IRQ5_CFG0 0x02BC5650 -#define CS35L41_DSP1_STRMARB_IRQ5_CFG1 0x02BC5654 -#define CS35L41_DSP1_STRMARB_IRQ5_CFG2 0x02BC5658 -#define CS35L41_DSP1_STRMARB_IRQ6_CFG0 0x02BC5660 -#define CS35L41_DSP1_STRMARB_IRQ6_CFG1 0x02BC5664 -#define CS35L41_DSP1_STRMARB_IRQ6_CFG2 0x02BC5668 -#define CS35L41_DSP1_STRMARB_IRQ7_CFG0 0x02BC5670 -#define CS35L41_DSP1_STRMARB_IRQ7_CFG1 0x02BC5674 -#define CS35L41_DSP1_STRMARB_IRQ7_CFG2 0x02BC5678 -#define CS35L41_DSP1_STRMARB_RESYNC_MSK 0x02BC5A00 -#define CS35L41_DSP1_STRMARB_ERR_STATUS 0x02BC5A08 -#define CS35L41_DSP1_INTPCTL_RES_STATIC 0x02BC6000 -#define CS35L41_DSP1_INTPCTL_RES_DYN 0x02BC6004 -#define CS35L41_DSP1_INTPCTL_NMI_CTRL 0x02BC6008 -#define CS35L41_DSP1_INTPCTL_IRQ_INV 0x02BC6010 -#define CS35L41_DSP1_INTPCTL_IRQ_MODE 0x02BC6014 -#define CS35L41_DSP1_INTPCTL_IRQ_EN 0x02BC6018 -#define CS35L41_DSP1_INTPCTL_IRQ_MSK 0x02BC601C -#define CS35L41_DSP1_INTPCTL_IRQ_FLUSH 0x02BC6020 -#define CS35L41_DSP1_INTPCTL_IRQ_MSKCLR 0x02BC6024 -#define CS35L41_DSP1_INTPCTL_IRQ_FRC 0x02BC6028 -#define CS35L41_DSP1_INTPCTL_IRQ_MSKSET 0x02BC602C -#define CS35L41_DSP1_INTPCTL_IRQ_ERR 0x02BC6030 -#define CS35L41_DSP1_INTPCTL_IRQ_PEND 0x02BC6034 -#define CS35L41_DSP1_INTPCTL_IRQ_GEN 0x02BC6038 -#define CS35L41_DSP1_INTPCTL_TESTBITS 0x02BC6040 -#define CS35L41_DSP1_WDT_CONTROL 0x02BC7000 -#define CS35L41_DSP1_WDT_STATUS 0x02BC7008 -#define CS35L41_DSP1_YMEM_PACK_0 0x02C00000 -#define CS35L41_DSP1_YMEM_PACK_1532 0x02C017F0 -#define CS35L41_DSP1_YMEM_UNPACK32_0 0x03000000 -#define CS35L41_DSP1_YMEM_UNPACK32_1022 0x03000FF8 -#define CS35L41_DSP1_YMEM_UNPACK24_0 0x03400000 -#define CS35L41_DSP1_YMEM_UNPACK24_2045 0x03401FF4 -#define CS35L41_DSP1_PMEM_0 0x03800000 -#define CS35L41_DSP1_PMEM_5114 0x03804FE8 - -/*test regs for emulation bringup*/ -#define CS35L41_PLL_OVR 0x00003018 -#define CS35L41_BST_TEST_DUTY 0x00003900 -#define CS35L41_DIGPWM_IOCTRL 0x0000706C - -/*registers populated by OTP*/ -#define CS35L41_OTP_TRIM_1 0x0000208c -#define CS35L41_OTP_TRIM_2 0x00002090 -#define CS35L41_OTP_TRIM_3 0x00003010 -#define CS35L41_OTP_TRIM_4 0x0000300C -#define CS35L41_OTP_TRIM_5 0x0000394C -#define CS35L41_OTP_TRIM_6 0x00003950 -#define CS35L41_OTP_TRIM_7 0x00003954 -#define CS35L41_OTP_TRIM_8 0x00003958 -#define CS35L41_OTP_TRIM_9 0x0000395C -#define CS35L41_OTP_TRIM_10 0x0000416C -#define CS35L41_OTP_TRIM_11 0x00004160 -#define CS35L41_OTP_TRIM_12 0x00004170 -#define CS35L41_OTP_TRIM_13 0x00004360 -#define CS35L41_OTP_TRIM_14 0x00004448 -#define CS35L41_OTP_TRIM_15 0x0000444C -#define CS35L41_OTP_TRIM_16 0x00006E30 -#define CS35L41_OTP_TRIM_17 0x00006E34 -#define CS35L41_OTP_TRIM_18 0x00006E38 -#define CS35L41_OTP_TRIM_19 0x00006E3C -#define CS35L41_OTP_TRIM_20 0x00006E40 -#define CS35L41_OTP_TRIM_21 0x00006E44 -#define CS35L41_OTP_TRIM_22 0x00006E48 -#define CS35L41_OTP_TRIM_23 0x00006E4C -#define CS35L41_OTP_TRIM_24 0x00006E50 -#define CS35L41_OTP_TRIM_25 0x00006E54 -#define CS35L41_OTP_TRIM_26 0x00006E58 -#define CS35L41_OTP_TRIM_27 0x00006E5C -#define CS35L41_OTP_TRIM_28 0x00006E60 -#define CS35L41_OTP_TRIM_29 0x00006E64 -#define CS35L41_OTP_TRIM_30 0x00007418 -#define CS35L41_OTP_TRIM_31 0x0000741C -#define CS35L41_OTP_TRIM_32 0x00007434 -#define CS35L41_OTP_TRIM_33 0x00007068 -#define CS35L41_OTP_TRIM_34 0x0000410C -#define CS35L41_OTP_TRIM_35 0x0000400C -#define CS35L41_OTP_TRIM_36 0x00002030 - -#define CS35L41_MAX_CACHE_REG 0x0000006B -#define CS35L41_OTP_SIZE_WORDS 32 -#define CS35L41_NUM_OTP_ELEM 100 -#define CS35L41_NUM_OTP_MAPS 3 - -#define CS35L41_VALID_PDATA 0x80000000 - -#define CS35L41_SCLK_MSTR_MASK 0x10 -#define CS35L41_SCLK_MSTR_SHIFT 4 -#define CS35L41_LRCLK_MSTR_MASK 0x01 -#define CS35L41_LRCLK_MSTR_SHIFT 0 -#define CS35L41_SCLK_INV_MASK 0x40 -#define CS35L41_SCLK_INV_SHIFT 6 -#define CS35L41_LRCLK_INV_MASK 0x04 -#define CS35L41_LRCLK_INV_SHIFT 2 -#define CS35L41_SCLK_FRC_MASK 0x20 -#define CS35L41_SCLK_FRC_SHIFT 5 -#define CS35L41_LRCLK_FRC_MASK 0x02 -#define CS35L41_LRCLK_FRC_SHIFT 1 - -#define CS35L41_AMP_GAIN_ZC_MASK 0x0400 -#define CS35L41_AMP_GAIN_ZC_SHIFT 10 - -#define CS35L41_BST_CTL_MASK 0xFF -#define CS35L41_BST_CTL_SEL_MASK 0x03 -#define CS35L41_BST_CTL_SEL_REG 0x00 -#define CS35L41_BST_CTL_SEL_CLASSH 0x01 -#define CS35L41_BST_IPK_MASK 0x7F -#define CS35L41_BST_IPK_SHIFT 0 -#define CS35L41_BST_LIM_MASK 0x4 -#define CS35L41_BST_LIM_SHIFT 2 -#define CS35L41_BST_K1_MASK 0x000000FF -#define CS35L41_BST_K1_SHIFT 0 -#define CS35L41_BST_K2_MASK 0x0000FF00 -#define CS35L41_BST_K2_SHIFT 8 -#define CS35L41_BST_SLOPE_MASK 0x0000FF00 -#define CS35L41_BST_SLOPE_SHIFT 8 -#define CS35L41_BST_LBST_VAL_MASK 0x00000003 -#define CS35L41_BST_LBST_VAL_SHIFT 0 - -#define CS35L41_TEMP_THLD_MASK 0x03 -#define CS35L41_VMON_IMON_VOL_MASK 0x07FF07FF -#define CS35L41_PDM_MODE_MASK 0x01 -#define CS35L41_PDM_MODE_SHIFT 0 - -#define CS35L41_CH_MEM_DEPTH_MASK 0x07 -#define CS35L41_CH_MEM_DEPTH_SHIFT 0 -#define CS35L41_CH_HDRM_CTL_MASK 0x007F0000 -#define CS35L41_CH_HDRM_CTL_SHIFT 16 -#define CS35L41_CH_REL_RATE_MASK 0xFF00 -#define CS35L41_CH_REL_RATE_SHIFT 8 -#define CS35L41_CH_WKFET_DLY_MASK 0x001C -#define CS35L41_CH_WKFET_DLY_SHIFT 2 -#define CS35L41_CH_WKFET_THLD_MASK 0x0F00 -#define CS35L41_CH_WKFET_THLD_SHIFT 8 - -#define CS35L41_NG_ENABLE_MASK 0x00010000 -#define CS35L41_NG_ENABLE_SHIFT 16 -#define CS35L41_NG_THLD_MASK 0x7 -#define CS35L41_NG_THLD_SHIFT 0 -#define CS35L41_NG_DELAY_MASK 0x0F00 -#define CS35L41_NG_DELAY_SHIFT 8 - -#define CS35L41_ASP_FMT_MASK 0x0700 -#define CS35L41_ASP_FMT_SHIFT 8 -#define CS35L41_ASP_DOUT_HIZ_MASK 0x03 -#define CS35L41_ASP_DOUT_HIZ_SHIFT 0 -#define CS35L41_ASP_WIDTH_16 0x10 -#define CS35L41_ASP_WIDTH_24 0x18 -#define CS35L41_ASP_WIDTH_32 0x20 -#define CS35L41_ASP_WIDTH_TX_MASK 0xFF0000 -#define CS35L41_ASP_WIDTH_TX_SHIFT 16 -#define CS35L41_ASP_WIDTH_RX_MASK 0xFF000000 -#define CS35L41_ASP_WIDTH_RX_SHIFT 24 -#define CS35L41_ASP_RX1_SLOT_MASK 0x3F -#define CS35L41_ASP_RX1_SLOT_SHIFT 0 -#define CS35L41_ASP_RX2_SLOT_MASK 0x3F00 -#define CS35L41_ASP_RX2_SLOT_SHIFT 8 -#define CS35L41_ASP_RX_WL_MASK 0x3F -#define CS35L41_ASP_TX_WL_MASK 0x3F -#define CS35L41_ASP_RX_WL_SHIFT 0 -#define CS35L41_ASP_TX_WL_SHIFT 0 -#define CS35L41_ASP_SOURCE_MASK 0x7F - -#define CS35L41_INPUT_SRC_ASPRX1 0x08 -#define CS35L41_INPUT_SRC_ASPRX2 0x09 -#define CS35L41_INPUT_SRC_VMON 0x18 -#define CS35L41_INPUT_SRC_IMON 0x19 -#define CS35L41_INPUT_SRC_CLASSH 0x21 -#define CS35L41_INPUT_SRC_VPMON 0x28 -#define CS35L41_INPUT_SRC_VBSTMON 0x29 -#define CS35L41_INPUT_SRC_TEMPMON 0x3A -#define CS35L41_INPUT_SRC_RSVD 0x3B -#define CS35L41_INPUT_DSP_TX1 0x32 -#define CS35L41_INPUT_DSP_TX2 0x33 - -#define CS35L41_PLL_CLK_SEL_MASK 0x07 -#define CS35L41_PLL_CLK_SEL_SHIFT 0 -#define CS35L41_PLL_CLK_EN_MASK 0x10 -#define CS35L41_PLL_CLK_EN_SHIFT 4 -#define CS35L41_PLL_OPENLOOP_MASK 0x0800 -#define CS35L41_PLL_OPENLOOP_SHIFT 11 -#define CS35L41_PLLSRC_SCLK 0 -#define CS35L41_PLLSRC_LRCLK 1 -#define CS35L41_PLLSRC_SELF 3 -#define CS35L41_PLLSRC_PDMCLK 4 -#define CS35L41_PLLSRC_MCLK 5 -#define CS35L41_PLLSRC_SWIRE 7 -#define CS35L41_REFCLK_FREQ_MASK 0x7E0 -#define CS35L41_REFCLK_FREQ_SHIFT 5 - -#define CS35L41_GLOBAL_FS_MASK 0x1F -#define CS35L41_GLOBAL_FS_SHIFT 0 - -#define CS35L41_GLOBAL_EN_MASK 0x01 -#define CS35L41_GLOBAL_EN_SHIFT 0 -#define CS35L41_BST_EN_MASK 0x0030 -#define CS35L41_BST_EN_SHIFT 4 -#define CS35L41_BST_EN_DEFAULT 0x2 - -#define CS35L41_PDN_DONE_MASK 0x00800000 -#define CS35L41_PDN_DONE_SHIFT 23 -#define CS35L41_PUP_DONE_MASK 0x01000000 -#define CS35L41_PUP_DONE_SHIFT 24 - -#define CS35L36_PUP_DONE_IRQ_UNMASK 0x5F -#define CS35L36_PUP_DONE_IRQ_MASK 0xBF - -#define CS35L41_AMP_SHORT_ERR 0x80000000 -#define CS35L41_BST_SHORT_ERR 0x0100 -#define CS35L41_TEMP_WARN 0x8000 -#define CS35L41_TEMP_ERR 0x00020000 -#define CS35L41_BST_OVP_ERR 0x40 -#define CS35L41_BST_DCM_UVP_ERR 0x80 -#define CS35L41_OTP_BOOT_DONE 0x02 -#define CS35L41_PLL_UNLOCK 0x10 -#define CS35L41_OTP_BOOT_ERR 0x80000000 - -#define CS35L41_AMP_SHORT_ERR_RLS 0x02 -#define CS35L41_BST_SHORT_ERR_RLS 0x04 -#define CS35L41_BST_OVP_ERR_RLS 0x08 -#define CS35L41_BST_UVP_ERR_RLS 0x10 -#define CS35L41_TEMP_WARN_ERR_RLS 0x20 -#define CS35L41_TEMP_ERR_RLS 0x40 - -#define CS35L41_INT1_MASK_DEFAULT 0x7FFCFE3F -#define CS35L41_INT1_UNMASK_PUP 0xFEFFFFFF -#define CS35L41_INT1_UNMASK_PDN 0xFF7FFFFF - -#define CS35L41_GPIO_DIR_MASK 0x80000000 -#define CS35L41_GPIO1_CTRL_MASK 0x00030000 -#define CS35L41_GPIO1_CTRL_SHIFT 16 -#define CS35L41_GPIO2_CTRL_MASK 0x07000000 -#define CS35L41_GPIO2_CTRL_SHIFT 24 -#define CS35L41_GPIO_CTRL_ACTV_LO 4 -#define CS35L41_GPIO_CTRL_ACTV_HI 5 -#define CS35L41_GPIO_POL_MASK 0x1000 -#define CS35L41_GPIO_POL_SHIFT 12 - -#define CS35L41_CHIP_ID 0x35a40 -#define CS35L41R_CHIP_ID 0x35b40 -#define CS35L41_MTLREVID_MASK 0x0F -#define CS35L41_REVID_A0 0xA0 -#define CS35L41_REVID_B0 0xB0 - -#define CS35L41_DSP_N_RX_RATES 8 -#define CS35L41_DSP_N_TX_RATES 8 -#define CS35L41_HALO_CORE_RESET 0x00000200 - -#define CS35L41_SPI_MAX_FREQ_OTP 4000000 - -#define CS35L41_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE) -#define CS35L41_TX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE \ - | SNDRV_PCM_FMTBIT_S32_LE) - -bool cs35l41_readable_reg(struct device *dev, unsigned int reg); -bool cs35l41_precious_reg(struct device *dev, unsigned int reg); -bool cs35l41_volatile_reg(struct device *dev, unsigned int reg); - -struct cs35l41_otp_packed_element_t { - u32 reg; - u8 shift; - u8 size; -}; - -struct cs35l41_otp_map_element_t { - u32 id; - u32 num_elements; - const struct cs35l41_otp_packed_element_t *map; - u32 bit_offset; - u32 word_offset; -}; - -extern const struct reg_default cs35l41_reg[CS35L41_MAX_CACHE_REG]; -extern const struct cs35l41_otp_map_element_t - cs35l41_otp_map_map[CS35L41_NUM_OTP_MAPS]; - -#define CS35L41_REGSTRIDE 4 -#define CS35L41_MBOXWAIT 100 - -#define CS35L41_DSP_VIRT1_MBOX_SHIFT 20 -#define CS35L41_DSP_VIRT2_MBOX_SHIFT 21 -#define CS35L41_CSPL_MBOX_STS CS35L41_DSP_MBOX_2 -/* Firmware update following reg */ -#define CS35L41_CSPL_MBOX_CMD_FW CS35L41_DSP_VIRT2_MBOX_1 -#define CS35L41_CSPL_MBOX_CMD_FW_SHIFT CS35L41_DSP_VIRT2_MBOX_SHIFT -/* Driver update following reg */ -#define CS35L41_CSPL_MBOX_CMD_DRV CS35L41_DSP_VIRT1_MBOX_1 -#define CS35L41_CSPL_MBOX_CMD_DRV_SHIFT CS35L41_DSP_VIRT1_MBOX_SHIFT - -enum cs35l41_cspl_mboxstate { - CSPL_MBOX_STS_RUNNING = 0, - CSPL_MBOX_STS_PAUSED = 1, - CSPL_MBOX_STS_RDY_FOR_REINIT = 2, -}; - -enum cs35l41_cspl_mboxcmd { - CSPL_MBOX_CMD_NONE = 0, - CSPL_MBOX_CMD_PAUSE = 1, - CSPL_MBOX_CMD_RESUME = 2, - CSPL_MBOX_CMD_REINIT = 3, - CSPL_MBOX_CMD_STOP_PRE_REINIT = 4, - CSPL_MBOX_CMD_UNKNOWN_CMD = -1, - CSPL_MBOX_CMD_INVALID_SEQUENCE = -2, -}; - -#endif /*__CS35L41_H__*/ diff --git a/techpack/audio/asoc/codecs/cs35l41/cs35l41.txt b/techpack/audio/asoc/codecs/cs35l41/cs35l41.txt deleted file mode 100755 index 9ce49ac9ac68..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/cs35l41.txt +++ /dev/null @@ -1,184 +0,0 @@ -CS35L41 Speaker Amplifier - -Required properties: - - - compatible : "cirrus,cs35l41" - "cirrus,cs35l40" - - - reg : the SPI chip select line for the device - - - VA-supply, VP-supply : power supplies for the device, - as covered in - Documentation/devicetree/bindings/regulator/regulator.txt. - -Optional properties: - - cirrus,sclk-force-output : Audio serial port SCLK force - output control. Forces the SCLK to continue to drive even - if no ASP_TXn channels are enabled. - - - cirrus,lrclk-force-output : Audio serial port LRCLK force - output control. Forces the LRCLK to continue to drive even - if no ASP_TXn channels are enabled. - - - cirrus,right-channel-amp : Boolean to determine which channel - the amplifier is to receive the audio data on. If present the - amplifier receives data on the right channel of I2S data. - If not present the amplifier receives data on the left - channel of I2S data - - - cirrus,boost-ctl-millivolt : Boost Voltage Value. Configures the - boost converter's output voltage in mV. The range is from 2550 mV to - 11000 mV with increments of 50 mV. - (Default) VP - - Boost hardware configuration: - - These three properties should be used together to specify the external - component configuration of the part. See section 4.3.6 of the datasheet - for details regarding how these values are used to configure the - digital boost converter's control loop. - - - cirrus,boost-peak-milliamp : Boost-converter peak current limit in mA. - Configures the peak current by monitoring the current through the boost FET. - Range starts at 1600 mA and goes to a maximum of 4500 mA with increments - of 50 mA. - (Default) 4.50 Amps - - - cirrus,boost-ind-nanohenry : Boost inductor value, expressed in nH. Valid - values include 1000, 1200, 1500 and 2200. - - - cirrus,boost-cap-microfarad : Total equivalent boost capacitance on the VBST - and VAMP pins, derated at 11 volts DC. The value must be rounded to the - nearest integer and expressed in uF. - - - cirrus,amp-gain-zc : Boolean to determine whether to use the amplifier - gain-change zero-crossing feature. If the feature is enabled, any - user-controlled amplifier gain change will occur on a zero-crossing point. - (Default) Disabled - - - cirrus,temp-warn-threshold : Amplifier overtemperature warning threshold. - Configures the threshold at which the overtemperature warning condition occurs. - When the threshold is met, the ovetemperature warning attenuation is applied - and the TEMP_WARN_EINT interrupt status bit is set. - If TEMP_WARN_MASK = 0, INTb is asserted. - - 0 = 105C - 1 = 115C - 2 = 125C (Default) - 3 = 135C - - - cirrus,noise-gate-enable : DSP Noise Gate feature. If present, noise - gate feature will be enabled. - - - cirrus,noise-gate-threshold : Threshold of audio signal input which the - noise gate considers the input audio to be at a low enough level to be - valid to enter a noise gating state of operation. - - 0 = -66 dBFS - 1 = -72 dBFS - 2 = -78 dBFS - 3 = -84 dBFS (default) - 4 = -90 dBFS - 5 = -96 dBFS - 6 = -102 dBFS - 7 = -108 dBFS - - - cirrus,noise-gate-delay : Time that the incoming audio signal must be - below the noise gate threshold prior to entering a noise gated state - - 0 = 5 ms - 1 = 10 ms - 2 = 25 ms - 3 = 50 ms (default) - 4 = 100 ms - 5 = 250 ms - 6 = 500 ms - 7 = 1 s - 8 = 5 s - 9 = 10 s - 10 = 20 s - 11 = 30 s - 12 = 40 s - 13 = 50 s - 14 = 60 s - 15 = 120 s - -Optional H/G Algorithm sub-node: - - The cs35l41 node can have a single "cirrus,classh-internal-algo" sub-node - that will disable automatic control of the internal H/G Algorithm. - - It is strongly recommended that the Datasheet be referenced when adjusting - or using these Class H Algorithm controls over the internal Algorithm. - Serious damage can occur to the Device and surrounding components. - - - cirrus,classh-internal-algo : Sub-node for the Internal Class H Algorithm - See Section 4.4 Internal Class H Algorithm in the Datasheet. - If not used, the device manages the ClassH Algorithm internally. - -Optional properties for the "cirrus,classh-internal-algo" Sub-node - - Section 7.9 Boost Control - - cirrus,classh-bst-overide : Boolean - - cirrus,classh-bst-max-limit - - Section 7.17 Class H, Weak-FET Control - - cirrus,classh-headroom - - cirrus,classh-release-rate - - cirrus,classh-mem-depth - - cirrus,classh-wk-fet-delay - - cirrus,classh-wk-fet-thld - - -Optional GPIO1 sub-node: - -The cs35l41 node can have an single "cirrus,gpio-config1" sub-node for -configuring the GPIO1 pin. - -- cirrus,gpio-polarity-invert : Boolean which specifies whether the GPIO1 -level is inverted. If this property is not present the level is not inverted. - -- cirrus,gpio-output-enable : Boolean which specifies whether the GPIO1 pin -is configured as an output. If this property is not present the -pin will be configured as an input. - -- cirrus,gpio-src-select : Configures the function of the GPIO1 pin. -Note that the options are different from the GPIO2 pin. - -0 = High Impedance (Default) -1 = GPIO -2 = Sync -3 = MCLK input - - -Optional GPIO2 sub-node: - -The cs35l41 node can have an single "cirrus,gpio-config2" sub-node for -configuring the GPIO1 pin. - -- cirrus,gpio-polarity-invert : Boolean which specifies whether the GPIO2 -level is inverted. If this property is not present the level is not inverted. - -- cirrus,gpio-output-enable : Boolean which specifies whether the GPIO2 pin -is configured as an output. If this property is not present the -pin will be configured as an input. - -- cirrus,gpio-src-select : Configures the function of the GPIO2 pin. -Note that the options are different from the GPIO1 pin. - -0 = High Impedance (Default) -1 = GPIO -2 = Open Drain INTB -3 = MCLK input -4 = Push-pull INTB (active low) -5 = Push-pull INT (active high) - - -Example: - -cs35l41: cs35l41@2 { - compatible = "cirrus,cs35l41"; - reg = <2>; - VA-supply = <&dummy_vreg>; - VP-supply = <&dummy_vreg>; -}; diff --git a/techpack/audio/asoc/codecs/cs35l41/wm_adsp.c b/techpack/audio/asoc/codecs/cs35l41/wm_adsp.c deleted file mode 100755 index 8c8c129d2194..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/wm_adsp.c +++ /dev/null @@ -1,5113 +0,0 @@ -/* - * wm_adsp.c -- Wolfson ADSP support - * - * Copyright 2012 Wolfson Microelectronics plc - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: Mark Brown - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -//#define WM_ADSP_DEBUG -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wm_adsp.h" - -#define adsp_crit(_dsp, fmt, ...) \ - dev_crit(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) -#define adsp_err(_dsp, fmt, ...) \ - dev_err(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) -#define adsp_warn(_dsp, fmt, ...) \ - dev_warn(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) -#define adsp_info(_dsp, fmt, ...) \ - dev_info(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) -#define adsp_dbg(_dsp, fmt, ...) \ - dev_info(_dsp->dev, "DSP%d: " fmt, _dsp->num, ##__VA_ARGS__) - -#define MAXBULK 4 /* Max byte I2C bulk limit */ - -#define ADSP1_CONTROL_1 0x00 -#define ADSP1_CONTROL_2 0x02 -#define ADSP1_CONTROL_3 0x03 -#define ADSP1_CONTROL_4 0x04 -#define ADSP1_CONTROL_5 0x06 -#define ADSP1_CONTROL_6 0x07 -#define ADSP1_CONTROL_7 0x08 -#define ADSP1_CONTROL_8 0x09 -#define ADSP1_CONTROL_9 0x0A -#define ADSP1_CONTROL_10 0x0B -#define ADSP1_CONTROL_11 0x0C -#define ADSP1_CONTROL_12 0x0D -#define ADSP1_CONTROL_13 0x0F -#define ADSP1_CONTROL_14 0x10 -#define ADSP1_CONTROL_15 0x11 -#define ADSP1_CONTROL_16 0x12 -#define ADSP1_CONTROL_17 0x13 -#define ADSP1_CONTROL_18 0x14 -#define ADSP1_CONTROL_19 0x16 -#define ADSP1_CONTROL_20 0x17 -#define ADSP1_CONTROL_21 0x18 -#define ADSP1_CONTROL_22 0x1A -#define ADSP1_CONTROL_23 0x1B -#define ADSP1_CONTROL_24 0x1C -#define ADSP1_CONTROL_25 0x1E -#define ADSP1_CONTROL_26 0x20 -#define ADSP1_CONTROL_27 0x21 -#define ADSP1_CONTROL_28 0x22 -#define ADSP1_CONTROL_29 0x23 -#define ADSP1_CONTROL_30 0x24 -#define ADSP1_CONTROL_31 0x26 - -/* - * ADSP1 Control 19 - */ -#define ADSP1_WDMA_BUFFER_LENGTH_MASK 0x00FF /* DSP1_WDMA_BUFFER_LENGTH - [7:0] */ -#define ADSP1_WDMA_BUFFER_LENGTH_SHIFT 0 /* DSP1_WDMA_BUFFER_LENGTH - [7:0] */ -#define ADSP1_WDMA_BUFFER_LENGTH_WIDTH 8 /* DSP1_WDMA_BUFFER_LENGTH - [7:0] */ - - -/* - * ADSP1 Control 30 - */ -#define ADSP1_DBG_CLK_ENA 0x0008 /* DSP1_DBG_CLK_ENA */ -#define ADSP1_DBG_CLK_ENA_MASK 0x0008 /* DSP1_DBG_CLK_ENA */ -#define ADSP1_DBG_CLK_ENA_SHIFT 3 /* DSP1_DBG_CLK_ENA */ -#define ADSP1_DBG_CLK_ENA_WIDTH 1 /* DSP1_DBG_CLK_ENA */ -#define ADSP1_SYS_ENA 0x0004 /* DSP1_SYS_ENA */ -#define ADSP1_SYS_ENA_MASK 0x0004 /* DSP1_SYS_ENA */ -#define ADSP1_SYS_ENA_SHIFT 2 /* DSP1_SYS_ENA */ -#define ADSP1_SYS_ENA_WIDTH 1 /* DSP1_SYS_ENA */ -#define ADSP1_CORE_ENA 0x0002 /* DSP1_CORE_ENA */ -#define ADSP1_CORE_ENA_MASK 0x0002 /* DSP1_CORE_ENA */ -#define ADSP1_CORE_ENA_SHIFT 1 /* DSP1_CORE_ENA */ -#define ADSP1_CORE_ENA_WIDTH 1 /* DSP1_CORE_ENA */ -#define ADSP1_START 0x0001 /* DSP1_START */ -#define ADSP1_START_MASK 0x0001 /* DSP1_START */ -#define ADSP1_START_SHIFT 0 /* DSP1_START */ -#define ADSP1_START_WIDTH 1 /* DSP1_START */ - -/* - * ADSP1 Control 31 - */ -#define ADSP1_CLK_SEL_MASK 0x0007 /* CLK_SEL_ENA */ -#define ADSP1_CLK_SEL_SHIFT 0 /* CLK_SEL_ENA */ -#define ADSP1_CLK_SEL_WIDTH 3 /* CLK_SEL_ENA */ - -#define ADSP2_CONTROL 0x0 -#define ADSP2_CLOCKING 0x1 -#define ADSP2V2_CLOCKING 0x2 -#define ADSP2_STATUS1 0x4 -#define ADSP2_WDMA_CONFIG_1 0x30 -#define ADSP2_WDMA_CONFIG_2 0x31 -#define ADSP2V2_WDMA_CONFIG_2 0x32 -#define ADSP2_RDMA_CONFIG_1 0x34 - -#define ADSP2_SCRATCH0 0x40 -#define ADSP2_SCRATCH1 0x41 -#define ADSP2_SCRATCH2 0x42 -#define ADSP2_SCRATCH3 0x43 - -#define ADSP2V2_SCRATCH0_1 0x40 -#define ADSP2V2_SCRATCH2_3 0x42 - -/* - * ADSP2 Control - */ - -#define ADSP2_MEM_ENA 0x0010 /* DSP1_MEM_ENA */ -#define ADSP2_MEM_ENA_MASK 0x0010 /* DSP1_MEM_ENA */ -#define ADSP2_MEM_ENA_SHIFT 4 /* DSP1_MEM_ENA */ -#define ADSP2_MEM_ENA_WIDTH 1 /* DSP1_MEM_ENA */ -#define ADSP2_SYS_ENA 0x0004 /* DSP1_SYS_ENA */ -#define ADSP2_SYS_ENA_MASK 0x0004 /* DSP1_SYS_ENA */ -#define ADSP2_SYS_ENA_SHIFT 2 /* DSP1_SYS_ENA */ -#define ADSP2_SYS_ENA_WIDTH 1 /* DSP1_SYS_ENA */ -#define ADSP2_CORE_ENA 0x0002 /* DSP1_CORE_ENA */ -#define ADSP2_CORE_ENA_MASK 0x0002 /* DSP1_CORE_ENA */ -#define ADSP2_CORE_ENA_SHIFT 1 /* DSP1_CORE_ENA */ -#define ADSP2_CORE_ENA_WIDTH 1 /* DSP1_CORE_ENA */ -#define ADSP2_START 0x0001 /* DSP1_START */ -#define ADSP2_START_MASK 0x0001 /* DSP1_START */ -#define ADSP2_START_SHIFT 0 /* DSP1_START */ -#define ADSP2_START_WIDTH 1 /* DSP1_START */ - -/* - * ADSP2 clocking - */ -#define ADSP2_CLK_SEL_MASK 0x0007 /* CLK_SEL_ENA */ -#define ADSP2_CLK_SEL_SHIFT 0 /* CLK_SEL_ENA */ -#define ADSP2_CLK_SEL_WIDTH 3 /* CLK_SEL_ENA */ - -/* - * ADSP2V2 clocking - */ -#define ADSP2V2_CLK_SEL_MASK 0x70000 /* CLK_SEL_ENA */ -#define ADSP2V2_CLK_SEL_SHIFT 16 /* CLK_SEL_ENA */ -#define ADSP2V2_CLK_SEL_WIDTH 3 /* CLK_SEL_ENA */ - -#define ADSP2V2_RATE_MASK 0x7800 /* DSP_RATE */ -#define ADSP2V2_RATE_SHIFT 11 /* DSP_RATE */ -#define ADSP2V2_RATE_WIDTH 4 /* DSP_RATE */ - -/* - * ADSP2 Status 1 - */ -#define ADSP2_RAM_RDY 0x0001 -#define ADSP2_RAM_RDY_MASK 0x0001 -#define ADSP2_RAM_RDY_SHIFT 0 -#define ADSP2_RAM_RDY_WIDTH 1 - -/* - * ADSP2 Lock support - */ -#define ADSP2_LOCK_CODE_0 0x5555 -#define ADSP2_LOCK_CODE_1 0xAAAA - -#define ADSP2_WATCHDOG 0x0A -#define ADSP2_BUS_ERR_ADDR 0x52 -#define ADSP2_REGION_LOCK_STATUS 0x64 -#define ADSP2_LOCK_REGION_1_LOCK_REGION_0 0x66 -#define ADSP2_LOCK_REGION_3_LOCK_REGION_2 0x68 -#define ADSP2_LOCK_REGION_5_LOCK_REGION_4 0x6A -#define ADSP2_LOCK_REGION_7_LOCK_REGION_6 0x6C -#define ADSP2_LOCK_REGION_9_LOCK_REGION_8 0x6E -#define ADSP2_LOCK_REGION_CTRL 0x7A -#define ADSP2_PMEM_ERR_ADDR_XMEM_ERR_ADDR 0x7C - -#define ADSP2_REGION_LOCK_ERR_MASK 0x8000 -#define ADSP2_SLAVE_ERR_MASK 0x4000 -#define ADSP2_WDT_TIMEOUT_STS_MASK 0x2000 -#define ADSP2_CTRL_ERR_PAUSE_ENA 0x0002 -#define ADSP2_CTRL_ERR_EINT 0x0001 - -#define ADSP2_BUS_ERR_ADDR_MASK 0x00FFFFFF -#define ADSP2_XMEM_ERR_ADDR_MASK 0x0000FFFF -#define ADSP2_PMEM_ERR_ADDR_MASK 0x7FFF0000 -#define ADSP2_PMEM_ERR_ADDR_SHIFT 16 -#define ADSP2_WDT_ENA_MASK 0xFFFFFFFD - -#define ADSP2_LOCK_REGION_SHIFT 16 - -#define ADSP_MAX_STD_CTRL_SIZE 512 - -#define WM_ADSP_ACKED_CTL_TIMEOUT_MS 100 -#define WM_ADSP_ACKED_CTL_N_QUICKPOLLS 10 -#define WM_ADSP_ACKED_CTL_MIN_VALUE 0 -#define WM_ADSP_ACKED_CTL_MAX_VALUE 0xFFFFFF - -/* - * Event control messages - */ -#define WM_ADSP_FW_EVENT_SHUTDOWN 0x000001 - -/* - * HALO system info - */ -#define HALO_SYS_INFO_XM_SRAM_SIZE 0x00010 -#define HALO_SYS_INFO_YM_SRAM_SIZE 0x00018 -#define HALO_SYS_INFO_XM_BANK_SIZE 0x00038 -#define HALO_SYS_INFO_YM_BANK_SIZE 0x0003c -#define HALO_AHBM_WINDOW_DEBUG_0 0x02040 -#define HALO_AHBM_WINDOW_DEBUG_1 0x02044 - -/* - * HALO core - */ -#define HALO_SAMPLE_RATE_RX1 0x00080 -#define HALO_SAMPLE_RATE_TX1 0x00280 -#define HALO_SCRATCH1 0x005c0 -#define HALO_CCM_CORE_CONTROL 0x41000 - -/* - * HALO Lock support - */ -#define HALO_MPU_UNLOCK_CODE_0 0x5555 -#define HALO_MPU_UNLOCK_CODE_1 0xaaaa - -/* - * HALO MPU banks - */ -#define HALO_MPU_XMEM_ACCESS_0 0x43000 -#define HALO_MPU_YMEM_ACCESS_0 0x43004 -#define HALO_MPU_WINDOW_ACCESS_0 0x43008 -#define HALO_MPU_XREG_ACCESS_0 0x4300C -#define HALO_MPU_YREG_ACCESS_0 0x43014 -#define HALO_MPU_XMEM_ACCESS_1 0x43018 -#define HALO_MPU_YMEM_ACCESS_1 0x4301C -#define HALO_MPU_WINDOW_ACCESS_1 0x43020 -#define HALO_MPU_XREG_ACCESS_1 0x43024 -#define HALO_MPU_YREG_ACCESS_1 0x4302C -#define HALO_MPU_XMEM_ACCESS_2 0x43030 -#define HALO_MPU_YMEM_ACCESS_2 0x43034 -#define HALO_MPU_WINDOW_ACCESS_2 0x43038 -#define HALO_MPU_XREG_ACCESS_2 0x4303C -#define HALO_MPU_YREG_ACCESS_2 0x43044 -#define HALO_MPU_XMEM_ACCESS_3 0x43048 -#define HALO_MPU_YMEM_ACCESS_3 0x4304C -#define HALO_MPU_WINDOW_ACCESS_3 0x43050 -#define HALO_MPU_XREG_ACCESS_3 0x43054 -#define HALO_MPU_YREG_ACCESS_3 0x4305C -#define HALO_MPU_XM_VIO_ADDR 0x43100 -#define HALO_MPU_XM_VIO_STATUS 0x43104 -#define HALO_MPU_YM_VIO_ADDR 0x43108 -#define HALO_MPU_YM_VIO_STATUS 0x4310C -#define HALO_MPU_PM_VIO_ADDR 0x43110 -#define HALO_MPU_PM_VIO_STATUS 0x43114 -#define HALO_MPU_LOCK_CONFIG 0x43140 - -/* - * HALO stream arb - */ -#define HALO_STREAM_ARB_MSTR0_CONFIG_0 0x45000 -#define HALO_STREAM_ARB_MSTR0_CONFIG_1 0x45004 -#define HALO_STREAM_ARB_MSTR0_CONFIG_2 0x45008 -#define HALO_STREAM_ARB_MSTR1_CONFIG_0 0x45010 -#define HALO_STREAM_ARB_MSTR1_CONFIG_1 0x45014 -#define HALO_STREAM_ARB_MSTR1_CONFIG_2 0x45018 -#define HALO_STREAM_ARB_MSTR2_CONFIG_0 0x45020 -#define HALO_STREAM_ARB_MSTR2_CONFIG_1 0x45024 -#define HALO_STREAM_ARB_MSTR2_CONFIG_2 0x45028 -#define HALO_STREAM_ARB_MSTR3_CONFIG_0 0x45030 -#define HALO_STREAM_ARB_MSTR3_CONFIG_1 0x45034 -#define HALO_STREAM_ARB_MSTR3_CONFIG_2 0x45038 -#define HALO_STREAM_ARB_MSTR4_CONFIG_0 0x45040 -#define HALO_STREAM_ARB_MSTR4_CONFIG_1 0x45044 -#define HALO_STREAM_ARB_MSTR4_CONFIG_2 0x45048 -#define HALO_STREAM_ARB_MSTR5_CONFIG_0 0x45050 -#define HALO_STREAM_ARB_MSTR5_CONFIG_1 0x45054 -#define HALO_STREAM_ARB_MSTR5_CONFIG_2 0x45058 - -#define HALO_STREAM_ARB_TX1_CONFIG_0 0x45200 -#define HALO_STREAM_ARB_TX1_CONFIG_1 0x45204 -#define HALO_STREAM_ARB_TX2_CONFIG_0 0x45208 -#define HALO_STREAM_ARB_TX2_CONFIG_1 0x4520C -#define HALO_STREAM_ARB_TX3_CONFIG_0 0x45210 -#define HALO_STREAM_ARB_TX3_CONFIG_1 0x45214 -#define HALO_STREAM_ARB_TX4_CONFIG_0 0x45218 -#define HALO_STREAM_ARB_TX4_CONFIG_1 0x4521C -#define HALO_STREAM_ARB_TX5_CONFIG_0 0x45220 -#define HALO_STREAM_ARB_TX5_CONFIG_1 0x45224 -#define HALO_STREAM_ARB_TX6_CONFIG_0 0x45228 -#define HALO_STREAM_ARB_TX6_CONFIG_1 0x4522C -#define HALO_STREAM_ARB_TX7_CONFIG_0 0x45230 -#define HALO_STREAM_ARB_TX7_CONFIG_1 0x45234 -#define HALO_STREAM_ARB_TX8_CONFIG_0 0x45238 -#define HALO_STREAM_ARB_TX8_CONFIG_1 0x4523C -#define HALO_STREAM_ARB_RX1_CONFIG_0 0x45400 -#define HALO_STREAM_ARB_RX1_CONFIG_1 0x45404 -#define HALO_STREAM_ARB_RX2_CONFIG_0 0x45408 -#define HALO_STREAM_ARB_RX2_CONFIG_1 0x4540C -#define HALO_STREAM_ARB_RX3_CONFIG_0 0x45410 -#define HALO_STREAM_ARB_RX3_CONFIG_1 0x45414 -#define HALO_STREAM_ARB_RX4_CONFIG_0 0x45418 -#define HALO_STREAM_ARB_RX4_CONFIG_1 0x4541C -#define HALO_STREAM_ARB_RX5_CONFIG_0 0x45420 -#define HALO_STREAM_ARB_RX5_CONFIG_1 0x45424 -#define HALO_STREAM_ARB_RX6_CONFIG_0 0x45428 -#define HALO_STREAM_ARB_RX6_CONFIG_1 0x4542C -#define HALO_STREAM_ARB_RX7_CONFIG_0 0x45430 -#define HALO_STREAM_ARB_RX7_CONFIG_1 0x45434 -#define HALO_STREAM_ARB_RX8_CONFIG_0 0x45438 -#define HALO_STREAM_ARB_RX8_CONFIG_1 0x4543C - -#define HALO_STREAM_ARB_IRQ0_CONFIG_0 0x45600 -#define HALO_STREAM_ARB_IRQ0_CONFIG_1 0x45604 -#define HALO_STREAM_ARB_IRQ0_CONFIG_2 0x45608 -#define HALO_STREAM_ARB_IRQ1_CONFIG_0 0x45610 -#define HALO_STREAM_ARB_IRQ1_CONFIG_1 0x45614 -#define HALO_STREAM_ARB_IRQ1_CONFIG_2 0x45618 -#define HALO_STREAM_ARB_IRQ2_CONFIG_0 0x45620 -#define HALO_STREAM_ARB_IRQ2_CONFIG_1 0x45624 -#define HALO_STREAM_ARB_IRQ2_CONFIG_2 0x45628 -#define HALO_STREAM_ARB_IRQ3_CONFIG_0 0x45630 -#define HALO_STREAM_ARB_IRQ3_CONFIG_1 0x45634 -#define HALO_STREAM_ARB_IRQ3_CONFIG_2 0x45638 -#define HALO_STREAM_ARB_IRQ4_CONFIG_0 0x45640 -#define HALO_STREAM_ARB_IRQ4_CONFIG_1 0x45644 -#define HALO_STREAM_ARB_IRQ4_CONFIG_2 0x45648 -#define HALO_STREAM_ARB_IRQ5_CONFIG_0 0x45650 -#define HALO_STREAM_ARB_IRQ5_CONFIG_1 0x45654 -#define HALO_STREAM_ARB_IRQ5_CONFIG_2 0x45658 -#define HALO_STREAM_ARB_IRQ6_CONFIG_0 0x45660 -#define HALO_STREAM_ARB_IRQ6_CONFIG_1 0x45664 -#define HALO_STREAM_ARB_IRQ6_CONFIG_2 0x45668 -#define HALO_STREAM_ARB_IRQ7_CONFIG_0 0x45670 -#define HALO_STREAM_ARB_IRQ7_CONFIG_1 0x45674 -#define HALO_STREAM_ARB_IRQ7_CONFIG_2 0x45678 - -#define HALO_INTP_CTL_NMI_CONTROL 0x46008 - -/* - * HALO_AHBM_WINDOW_DEBUG_1 - */ -#define HALO_AHBM_CORE_ERR_ADDR_MASK 0x0fffff00 -#define HALO_AHBM_CORE_ERR_ADDR_SHIFT 8 -#define HALO_AHBM_ADDR_ERR_MASK 0x00000080 -#define HALO_AHBM_LOCKED_ERR_MASK 0x00000040 -#define HALO_AHBM_SIZE_ERR_MASK 0x00000020 -#define HALO_AHBM_MODE_ERR_MASK 0x00000010 -#define HALO_AHBM_AHB_ERR_MASK 0x00000001 - -/* - * HALO_SAMPLE_RATE_[RX|TX]n - */ -#define HALO_DSP_RATE_SHIFT 0 -#define HALO_DSP_RATE_MASK 0x1f - -/* - * HALO_CCM_CORE_CONTROL - */ -#define HALO_CORE_EN 0x00000001 -#define HALO_CORE_EN_MASK 0x00000001 -#define HALO_CORE_EN_SHIFT 0 -#define HALO_CORE_EN_WIDTH 1 -#define HALO_CORE_RESET 0x00000200 - -/* - * HALO_MPU_?M_VIO_STATUS - */ -#define HALO_MPU_VIO_STS_MASK 0x007e0000 -#define HALO_MPU_VIO_STS_SHIFT 17 -#define HALO_MPU_VIO_ERR_MASK 0x00010000 -#define HALO_MPU_VIO_ERR_SHIFT 16 -#define HALO_MPU_VIO_ERR_WR_MASK 0x00008000 -#define HALO_MPU_VIO_ERR_WR_SHIFT 15 -#define HALO_MPU_VIO_ERR_SRC_MASK 0x00007fff -#define HALO_MPU_VIO_ERR_SRC_SHIFT 0 - -#define HALO_MPU_VIO_SRAM 0x01 -#define HALO_MPU_VIO_REG 0x02 -#define HALO_MPU_VIO_AHB 0x04 -#define HALO_MPU_VIO_EREG 0x08 -#define HALO_MPU_VIO_EXTERNAL_MEM 0x10 -#define HALO_MPU_VIO_NON_EXIST 0x20 - -/* - * HALO_STREAM_ARB_MSTRn_CONFIG_0 - */ -#define HALO_STREAM_ARB_MSTR_EN_MASK 0x1 - -/* - * HALO_STREAM_ARB_[TX|RX]n_CONFIG_0 - * HALO_STREAM_ARB_IRQn_CONFIG_0 - */ -#define HALO_STREAM_ARB_MSTR_SEL_DEFAULT 0xfc - -static const unsigned int halo_mpu_access[18] = { - HALO_MPU_WINDOW_ACCESS_0, - HALO_MPU_XREG_ACCESS_0, - HALO_MPU_YREG_ACCESS_0, - HALO_MPU_XMEM_ACCESS_1, - HALO_MPU_YMEM_ACCESS_1, - HALO_MPU_WINDOW_ACCESS_1, - HALO_MPU_XREG_ACCESS_1, - HALO_MPU_YREG_ACCESS_1, - HALO_MPU_XMEM_ACCESS_2, - HALO_MPU_YMEM_ACCESS_2, - HALO_MPU_WINDOW_ACCESS_2, - HALO_MPU_XREG_ACCESS_2, - HALO_MPU_YREG_ACCESS_2, - HALO_MPU_XMEM_ACCESS_3, - HALO_MPU_YMEM_ACCESS_3, - HALO_MPU_WINDOW_ACCESS_3, - HALO_MPU_XREG_ACCESS_3, - HALO_MPU_YREG_ACCESS_3, -}; - -struct wm_adsp_buf { - struct list_head list; - void *buf; -}; - -static struct wm_adsp_buf *wm_adsp_buf_alloc(const void *src, size_t len, - struct list_head *list) -{ - struct wm_adsp_buf *buf = kzalloc(sizeof(*buf), GFP_KERNEL); - - if (buf == NULL) - return NULL; - - buf->buf = kmemdup(src, len, GFP_KERNEL | GFP_DMA); - if (!buf->buf) { - kfree(buf); - return NULL; - } - memcpy(buf->buf, src, len); - - if (list) - list_add_tail(&buf->list, list); - - return buf; -} - -static void wm_adsp_buf_free(struct list_head *list) -{ - while (!list_empty(list)) { - struct wm_adsp_buf *buf = list_first_entry(list, - struct wm_adsp_buf, - list); - list_del(&buf->list); - kfree(buf->buf); - kfree(buf); - } -} - -#define WM_ADSP_FW_MBC_VSS 0 -#define WM_ADSP_FW_HIFI 1 -#define WM_ADSP_FW_TX 2 -#define WM_ADSP_FW_TX_SPK 3 -#define WM_ADSP_FW_RX 4 -#define WM_ADSP_FW_RX_ANC 5 -#define WM_ADSP_FW_CTRL 6 -#define WM_ADSP_FW_ASR 7 -#define WM_ADSP_FW_TRACE 8 -#define WM_ADSP_FW_SPK_PROT 9 -#define WM_ADSP_FW_DIAG 10 -#define WM_ADSP_FW_CALIB 11 - -#define WM_ADSP_NUM_FW 12 - -#define AMBIENT_DEFAULT 30 -#define CAL_R_DEFAULT 8392 -#define CAL_STATUS_DEFAULT 1 - -static const char *wm_adsp_fw_text[WM_ADSP_NUM_FW] = { - [WM_ADSP_FW_MBC_VSS] = "MBC/VSS", - [WM_ADSP_FW_HIFI] = "MasterHiFi", - [WM_ADSP_FW_TX] = "Tx", - [WM_ADSP_FW_TX_SPK] = "Tx Speaker", - [WM_ADSP_FW_RX] = "Rx", - [WM_ADSP_FW_RX_ANC] = "Rx ANC", - [WM_ADSP_FW_CTRL] = "Voice Ctrl", - [WM_ADSP_FW_ASR] = "ASR Assist", - [WM_ADSP_FW_TRACE] = "Dbg Trace", - [WM_ADSP_FW_SPK_PROT] = "Protection", - [WM_ADSP_FW_DIAG] = "Diag", - [WM_ADSP_FW_CALIB] = "Diag Z", -}; - -struct wm_adsp_system_config_xm_hdr { - __be32 sys_enable; - __be32 fw_id; - __be32 fw_rev; - __be32 boot_status; - __be32 watchdog; - __be32 dma_buffer_size; - __be32 rdma[6]; - __be32 wdma[8]; - __be32 build_job_name[3]; - __be32 build_job_number; -}; - -struct wm_adsp_alg_xm_struct { - __be32 magic; - __be32 smoothing; - __be32 threshold; - __be32 host_buf_ptr; - __be32 start_seq; - __be32 high_water_mark; - __be32 low_water_mark; - __be64 smoothed_power; -}; - -struct wm_adsp_buffer { - __be32 X_buf_base; /* XM base addr of first X area */ - __be32 X_buf_size; /* Size of 1st X area in words */ - __be32 X_buf_base2; /* XM base addr of 2nd X area */ - __be32 X_buf_brk; /* Total X size in words */ - __be32 Y_buf_base; /* YM base addr of Y area */ - __be32 wrap; /* Total size X and Y in words */ - __be32 high_water_mark; /* Point at which IRQ is asserted */ - __be32 irq_count; /* bits 1-31 count IRQ assertions */ - __be32 irq_ack; /* acked IRQ count, bit 0 enables IRQ */ - __be32 next_write_index; /* word index of next write */ - __be32 next_read_index; /* word index of next read */ - __be32 error; /* error if any */ - __be32 oldest_block_index; /* word index of oldest surviving */ - __be32 requested_rewind; /* how many blocks rewind was done */ - __be32 reserved_space; /* internal */ - __be32 min_free; /* min free space since stream start */ - __be32 blocks_written[2]; /* total blocks written (64 bit) */ - __be32 words_written[2]; /* total words written (64 bit) */ -}; - -struct wm_adsp_compr; - -struct wm_adsp_compr_buf { - struct wm_adsp *dsp; - struct wm_adsp_compr *compr; - - struct wm_adsp_buffer_region *regions; - u32 host_buf_ptr; - - u32 error; - u32 irq_count; - int read_index; - int avail; -}; - -struct wm_adsp_compr { - struct wm_adsp *dsp; - struct wm_adsp_compr_buf *buf; - - struct snd_compr_stream *stream; - struct snd_compressed_buffer size; - - u32 *raw_buf; - unsigned int copied_total; - - unsigned int sample_rate; -}; - -#define WM_ADSP_DATA_WORD_SIZE 3 - -#define WM_ADSP_MIN_FRAGMENTS 1 -#define WM_ADSP_MAX_FRAGMENTS 256 -#define WM_ADSP_MIN_FRAGMENT_SIZE (64 * WM_ADSP_DATA_WORD_SIZE) -#define WM_ADSP_MAX_FRAGMENT_SIZE (4096 * WM_ADSP_DATA_WORD_SIZE) - -#define WM_ADSP_ALG_XM_STRUCT_MAGIC 0x49aec7 - -#define HOST_BUFFER_FIELD(field) \ - (offsetof(struct wm_adsp_buffer, field) / sizeof(__be32)) - -#define ALG_XM_FIELD(field) \ - (offsetof(struct wm_adsp_alg_xm_struct, field) / sizeof(__be32)) - -static int wm_adsp_buffer_init(struct wm_adsp *dsp); -static int wm_adsp_buffer_free(struct wm_adsp *dsp); - -struct wm_adsp_buffer_region { - unsigned int offset; - unsigned int cumulative_size; - unsigned int mem_type; - unsigned int base_addr; -}; - -struct wm_adsp_buffer_region_def { - unsigned int mem_type; - unsigned int base_offset; - unsigned int size_offset; -}; - -static const struct wm_adsp_buffer_region_def default_regions[] = { - { - .mem_type = WMFW_ADSP2_XM, - .base_offset = HOST_BUFFER_FIELD(X_buf_base), - .size_offset = HOST_BUFFER_FIELD(X_buf_size), - }, - { - .mem_type = WMFW_ADSP2_XM, - .base_offset = HOST_BUFFER_FIELD(X_buf_base2), - .size_offset = HOST_BUFFER_FIELD(X_buf_brk), - }, - { - .mem_type = WMFW_ADSP2_YM, - .base_offset = HOST_BUFFER_FIELD(Y_buf_base), - .size_offset = HOST_BUFFER_FIELD(wrap), - }, -}; - -struct wm_adsp_fw_caps { - u32 id; - struct snd_codec_desc desc; - int num_regions; - const struct wm_adsp_buffer_region_def *region_defs; -}; - -static const struct wm_adsp_fw_caps ctrl_caps[] = { - { - .id = SND_AUDIOCODEC_BESPOKE, - .desc = { - .max_ch = 1, - .sample_rates = { 16000 }, - .num_sample_rates = 1, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .num_regions = ARRAY_SIZE(default_regions), - .region_defs = default_regions, - }, -}; - -static const struct wm_adsp_fw_caps trace_caps[] = { - { - .id = SND_AUDIOCODEC_BESPOKE, - .desc = { - .max_ch = 8, - .sample_rates = { - 4000, 8000, 11025, 12000, 16000, 22050, - 24000, 32000, 44100, 48000, 64000, 88200, - 96000, 176400, 192000 - }, - .num_sample_rates = 15, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .num_regions = ARRAY_SIZE(default_regions), - .region_defs = default_regions, - }, -}; - -static const struct { - const char *file; - int compr_direction; - int num_caps; - const struct wm_adsp_fw_caps *caps; - bool voice_trigger; -} wm_adsp_fw[WM_ADSP_NUM_FW] = { - [WM_ADSP_FW_MBC_VSS] = { .file = "mbc-vss" }, - [WM_ADSP_FW_HIFI] = { .file = "hifi" }, - [WM_ADSP_FW_TX] = { .file = "tx" }, - [WM_ADSP_FW_TX_SPK] = { .file = "tx-spk" }, - [WM_ADSP_FW_RX] = { .file = "rx" }, - [WM_ADSP_FW_RX_ANC] = { .file = "rx-anc" }, - [WM_ADSP_FW_CTRL] = { - .file = "ctrl", - .compr_direction = SND_COMPRESS_CAPTURE, - .num_caps = ARRAY_SIZE(ctrl_caps), - .caps = ctrl_caps, - .voice_trigger = true, - }, - [WM_ADSP_FW_ASR] = { .file = "asr" }, - [WM_ADSP_FW_TRACE] = { - .file = "trace", - .compr_direction = SND_COMPRESS_CAPTURE, - .num_caps = ARRAY_SIZE(trace_caps), - .caps = trace_caps, - }, - [WM_ADSP_FW_SPK_PROT] = { .file = "spk-prot" }, - [WM_ADSP_FW_DIAG] = { .file = "diag" }, - [WM_ADSP_FW_CALIB] = { .file = "diag-z" }, -}; - -struct wm_coeff_ctl_ops { - int (*xget)(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - int (*xput)(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -}; - -struct wm_coeff_ctl { - const char *name; - const char *fw_name; - struct wm_adsp_alg_region alg_region; - struct wm_coeff_ctl_ops ops; - struct wm_adsp *dsp; - unsigned int enabled:1; - struct list_head list; - void *cache; - unsigned int offset; - size_t len; - unsigned int set:1; - struct soc_bytes_ext bytes_ext; - unsigned int flags; - unsigned int type; -}; - -static const char *wm_adsp_mem_region_name(unsigned int type) -{ - switch (type) { - case WMFW_ADSP1_PM: - return "PM"; - case WMFW_HALO_PM_PACKED: - return "PM_PACKED"; - case WMFW_ADSP1_DM: - return "DM"; - case WMFW_ADSP2_XM: - return "XM"; - case WMFW_HALO_XM_PACKED: - return "XM_PACKED"; - case WMFW_ADSP2_YM: - return "YM"; - case WMFW_HALO_YM_PACKED: - return "YM_PACKED"; - case WMFW_ADSP1_ZM: - return "ZM"; - default: - return NULL; - } -} -static int wm_halo_apply_calibration(struct snd_soc_dapm_widget *w); -static int wm_adsp_k_ctl_put(struct wm_adsp *dsp, const char *name, int value); -static int wm_adsp_k_ctl_get(struct wm_adsp *dsp, const char *name); - -#ifdef CONFIG_DEBUG_FS -static void wm_adsp_debugfs_save_wmfwname(struct wm_adsp *dsp, const char *s) -{ - char *tmp = kasprintf(GFP_KERNEL, "%s\n", s); - - kfree(dsp->wmfw_file_name); - dsp->wmfw_file_name = tmp; -} - -static void wm_adsp_debugfs_save_binname(struct wm_adsp *dsp, const char *s) -{ - char *tmp = kasprintf(GFP_KERNEL, "%s\n", s); - - kfree(dsp->bin_file_name); - dsp->bin_file_name = tmp; -} - -static void wm_adsp_debugfs_clear(struct wm_adsp *dsp) -{ - kfree(dsp->wmfw_file_name); - kfree(dsp->bin_file_name); - dsp->wmfw_file_name = NULL; - dsp->bin_file_name = NULL; -} - -static ssize_t wm_adsp_debugfs_wmfw_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct wm_adsp *dsp = file->private_data; - ssize_t ret; - - mutex_lock(&dsp->pwr_lock); - - if (!dsp->wmfw_file_name || !dsp->booted) - ret = 0; - else - ret = simple_read_from_buffer(user_buf, count, ppos, - dsp->wmfw_file_name, - strlen(dsp->wmfw_file_name)); - - mutex_unlock(&dsp->pwr_lock); - return ret; -} - -static ssize_t wm_adsp_debugfs_bin_read(struct file *file, - char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct wm_adsp *dsp = file->private_data; - ssize_t ret; - - mutex_lock(&dsp->pwr_lock); - - if (!dsp->bin_file_name || !dsp->booted) - ret = 0; - else - ret = simple_read_from_buffer(user_buf, count, ppos, - dsp->bin_file_name, - strlen(dsp->bin_file_name)); - - mutex_unlock(&dsp->pwr_lock); - return ret; -} - -static const struct { - const char *name; - const struct file_operations fops; -} wm_adsp_debugfs_fops[] = { - { - .name = "wmfw_file_name", - .fops = { - .open = simple_open, - .read = wm_adsp_debugfs_wmfw_read, - }, - }, - { - .name = "bin_file_name", - .fops = { - .open = simple_open, - .read = wm_adsp_debugfs_bin_read, - }, - }, -}; - -static void wm_adsp2_init_debugfs(struct wm_adsp *dsp, - struct snd_soc_codec *codec) -{ - struct dentry *root = NULL; - char *root_name; - int i; - - if (!codec->component.debugfs_root) { - adsp_err(dsp, "No codec debugfs root\n"); - goto err; - } - - root_name = kmalloc(PAGE_SIZE, GFP_KERNEL); - if (!root_name) - goto err; - - snprintf(root_name, PAGE_SIZE, "dsp%d", dsp->num); - root = debugfs_create_dir(root_name, codec->component.debugfs_root); - kfree(root_name); - - if (!root) - goto err; - - if (!debugfs_create_bool("booted", S_IRUGO, root, &dsp->booted)) - goto err; - - if (!debugfs_create_bool("running", S_IRUGO, root, &dsp->running)) - goto err; - - if (!debugfs_create_x32("fw_id", S_IRUGO, root, &dsp->fw_id)) - goto err; - - if (!debugfs_create_x32("fw_version", S_IRUGO, root, - &dsp->fw_id_version)) - goto err; - - for (i = 0; i < ARRAY_SIZE(wm_adsp_debugfs_fops); ++i) { - if (!debugfs_create_file(wm_adsp_debugfs_fops[i].name, - S_IRUGO, root, dsp, - &wm_adsp_debugfs_fops[i].fops)) - goto err; - } - - dsp->debugfs_root = root; - return; - -err: - debugfs_remove_recursive(root); - adsp_err(dsp, "Failed to create debugfs\n"); -} - -static void wm_adsp2_cleanup_debugfs(struct wm_adsp *dsp) -{ - wm_adsp_debugfs_clear(dsp); - debugfs_remove_recursive(dsp->debugfs_root); -} -#else -static inline void wm_adsp2_init_debugfs(struct wm_adsp *dsp, - struct snd_soc_codec *codec) -{ -} - -static inline void wm_adsp2_cleanup_debugfs(struct wm_adsp *dsp) -{ -} - -static inline void wm_adsp_debugfs_save_wmfwname(struct wm_adsp *dsp, - const char *s) -{ -} - -static inline void wm_adsp_debugfs_save_binname(struct wm_adsp *dsp, - const char *s) -{ -} - -static inline void wm_adsp_debugfs_clear(struct wm_adsp *dsp) -{ -} -#endif - -static int wm_adsp_fw_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = dsp[e->shift_l].fw; - - return 0; -} - -static int wm_adsp_fw_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - if (ucontrol->value.enumerated.item[0] == dsp[e->shift_l].fw) - return 0; - - if (ucontrol->value.enumerated.item[0] >= WM_ADSP_NUM_FW) - return -EINVAL; - - mutex_lock(&dsp[e->shift_l].pwr_lock); - - if (dsp[e->shift_l].booted || dsp[e->shift_l].compr) - ret = -EBUSY; - else - dsp[e->shift_l].fw = ucontrol->value.enumerated.item[0]; - - mutex_unlock(&dsp[e->shift_l].pwr_lock); - - return ret; -} - -static int wm_adsp_cal_z_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = dsp->cal_z; - - return 0; -} - -static int wm_adsp_cal_z_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - dsp->cal_z = ucontrol->value.enumerated.item[0]; - dsp->cal_chksum = dsp->cal_z + CAL_STATUS_DEFAULT; - - dev_info(codec->dev, "cal_z = %d\n", dsp->cal_z); - - return 0; -} - -static int wm_adsp_ambient_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = dsp->ambient; - - return 0; -} - -static int wm_adsp_ambient_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - dsp->ambient = ucontrol->value.enumerated.item[0]; - - dev_info(codec->dev, "ambient = %d\n", dsp->ambient); - - return 0; -} - -static int wm_adsp_cal_status_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = dsp->cal_status; - - return 0; -} - -static int wm_adsp_cal_status_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - dsp->cal_status = ucontrol->value.enumerated.item[0]; - - dev_info(codec->dev, "cal_status = %d\n", dsp->cal_status); - - return 0; -} - -static int wm_adsp_cal_chksum_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = dsp->cal_chksum; - - return 0; -} - -static int wm_adsp_cal_chksum_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - dsp->cal_chksum = ucontrol->value.enumerated.item[0]; - - dev_info(codec->dev, "cal_chksum = %d\n", dsp->cal_chksum); - - return 0; -} - -static int wm_adsp_block_bypass_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = dsp->block_bypass; - - return 0; -} - -static int wm_adsp_block_bypass_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - dsp->block_bypass = ucontrol->value.enumerated.item[0]; - - switch(dsp->block_bypass) { - case 0: - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00000000); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_EQ", 0x00000000); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_ACTI", 0x00000000); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_MBL", 0x00000000); - break; - case 1: - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00400001); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_EQ", 0x00400001); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_ACTI", 0x00400001); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_MBL", 0x00400001); - break; - default: - break; - } - - dev_info(codec->dev, "block_bypass = %d\n", dsp->block_bypass); - - return 0; -} - -static int wm_adsp_block_bypass_in_enh_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = dsp->block_bypass_in_enh; - - return 0; -} - -static int wm_adsp_block_bypass_in_enh_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - dsp->block_bypass_in_enh = ucontrol->value.enumerated.item[0]; - - switch(dsp->block_bypass_in_enh) { - case 0: - dev_info(codec->dev, "block_bypass_in_enh = %d, put 0x00000000.\n", dsp->block_bypass_in_enh); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00000000); - break; - case 1: - dev_info(codec->dev, "block_bypass_in_enh = %d, put 0x00400001.\n", dsp->block_bypass_in_enh); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd BYPASS_IN_ENH", 0x00400001); - break; - default: - break; - } - - dev_info(codec->dev, "block_bypass_in_enh = %d\n", dsp->block_bypass_in_enh); - - return 0; -} - -static const struct soc_enum wm_adsp_fw_enum[] = { - SOC_ENUM_SINGLE(0, 0, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), - SOC_ENUM_SINGLE(0, 1, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), - SOC_ENUM_SINGLE(0, 2, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), - SOC_ENUM_SINGLE(0, 3, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), - SOC_ENUM_SINGLE(0, 4, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), - SOC_ENUM_SINGLE(0, 5, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), - SOC_ENUM_SINGLE(0, 6, ARRAY_SIZE(wm_adsp_fw_text), wm_adsp_fw_text), -}; -static const char *wm_adsp_block_bypass_text[2] = {"Off", "On"}; -static const struct soc_enum wm_adsp_block_bypass_enum[] = { - SOC_ENUM_SINGLE(0, 0, ARRAY_SIZE(wm_adsp_block_bypass_text), wm_adsp_block_bypass_text), -}; -const struct snd_kcontrol_new wm_adsp_fw_controls[] = { - SOC_ENUM_EXT("DSP1 Firmware", wm_adsp_fw_enum[0], - wm_adsp_fw_get, wm_adsp_fw_put), - SOC_ENUM_EXT("DSP2 Firmware", wm_adsp_fw_enum[1], - wm_adsp_fw_get, wm_adsp_fw_put), - SOC_ENUM_EXT("DSP3 Firmware", wm_adsp_fw_enum[2], - wm_adsp_fw_get, wm_adsp_fw_put), - SOC_ENUM_EXT("DSP4 Firmware", wm_adsp_fw_enum[3], - wm_adsp_fw_get, wm_adsp_fw_put), - SOC_ENUM_EXT("DSP5 Firmware", wm_adsp_fw_enum[4], - wm_adsp_fw_get, wm_adsp_fw_put), - SOC_ENUM_EXT("DSP6 Firmware", wm_adsp_fw_enum[5], - wm_adsp_fw_get, wm_adsp_fw_put), - SOC_ENUM_EXT("DSP7 Firmware", wm_adsp_fw_enum[6], - wm_adsp_fw_get, wm_adsp_fw_put), -}; - -const struct snd_kcontrol_new wm_adsp_cal_controls[] = { - /* In Halo DSP, values are 24-bit */ - SOC_SINGLE_EXT("DSP Set CAL_Z", SND_SOC_NOPM, 0, 0xFFFFFF, 0, - wm_adsp_cal_z_get, wm_adsp_cal_z_put), - SOC_SINGLE_EXT("DSP Set AMBIENT", SND_SOC_NOPM, 0, 0xFFFFFF, 0, - wm_adsp_ambient_get, wm_adsp_ambient_put), - SOC_SINGLE_EXT("DSP Set CAL_STATUS", SND_SOC_NOPM, 0, 0xFFFFFF, 0, - wm_adsp_cal_status_get, wm_adsp_cal_status_put), - SOC_SINGLE_EXT("DSP Set CAL_CHKSUM", SND_SOC_NOPM, 0, 0xFFFFFF, 0, - wm_adsp_cal_chksum_get, wm_adsp_cal_chksum_put), - SOC_ENUM_EXT("DSP Block Bypass", wm_adsp_block_bypass_enum[0], - wm_adsp_block_bypass_get, wm_adsp_block_bypass_put), - SOC_ENUM_EXT("DSP Block Bypass_IN_ENH", wm_adsp_block_bypass_enum[0], - wm_adsp_block_bypass_in_enh_get, wm_adsp_block_bypass_in_enh_put), -}; -EXPORT_SYMBOL_GPL(wm_adsp_cal_controls); - -static struct wm_adsp_region const *wm_adsp_find_region(struct wm_adsp *dsp, - int type) -{ - int i; - - for (i = 0; i < dsp->num_mems; i++) - if (dsp->mem[i].type == type) - return &dsp->mem[i]; - - return NULL; -} - -static unsigned int wm_adsp_region_to_reg(struct wm_adsp *dsp, - struct wm_adsp_region const *mem, - unsigned int offset) -{ - if (WARN_ON(!mem)) - return offset; - switch (dsp->type) { - case WMFW_ADSP1: - case WMFW_ADSP2: - switch (mem->type) { - case WMFW_ADSP1_PM: - return mem->base + (offset * 3); - case WMFW_ADSP1_DM: - return mem->base + (offset * 2); - case WMFW_ADSP2_XM: - return mem->base + (offset * 2); - case WMFW_ADSP2_YM: - return mem->base + (offset * 2); - case WMFW_ADSP1_ZM: - return mem->base + (offset * 2); - default: - WARN(1, "Unknown memory region type"); - return offset; - } - case WMFW_HALO: - switch (mem->type) { - case WMFW_ADSP2_XM: - return mem->base + (offset * 4); - case WMFW_ADSP2_YM: - return mem->base + (offset * 4); - case WMFW_HALO_XM_PACKED: - return (mem->base + (offset * 3)) & ~0x3; - case WMFW_HALO_YM_PACKED: - return (mem->base + (offset * 3)) & ~0x3; - case WMFW_HALO_PM_PACKED: - return mem->base + (offset * 5); - default: - WARN(1, "Unknown memory region type"); - return offset; - } - default: - WARN(1, "Unknown DSP type"); - return offset; - } -} -static int wm_adsp2_raw_read(size_t maxbulk, struct regmap *map, - unsigned int reg, void *val, size_t len) -{ - int ret; - size_t read_len = 0; - size_t toread_len; - - while ((len - read_len) > 0) { - toread_len = (len - read_len) > maxbulk ? - maxbulk : (len - read_len); - ret = regmap_raw_read(map, reg + read_len, - val + read_len, toread_len); - if (ret < 0) { - printk("%s failed, toread_len:%u reg base:%u reg:%u read_len:%u\n", - __func__, toread_len, reg, - reg + read_len, read_len); - return ret; - } - read_len += toread_len; - } - - return 0; -} - -static void wm_adsp2_show_fw_status(struct wm_adsp *dsp) -{ - u16 scratch[4]; - int ret; - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, dsp->base + ADSP2_SCRATCH0, - scratch, sizeof(scratch)); - if (ret) { - adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); - return; - } - - adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", - be16_to_cpu(scratch[0]), - be16_to_cpu(scratch[1]), - be16_to_cpu(scratch[2]), - be16_to_cpu(scratch[3])); -} - -static void wm_adsp2v2_show_fw_status(struct wm_adsp *dsp) -{ - u32 scratch[2]; - int ret; - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, dsp->base + ADSP2V2_SCRATCH0_1, - scratch, sizeof(scratch)); - - if (ret) { - adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); - return; - } - - scratch[0] = be32_to_cpu(scratch[0]); - scratch[1] = be32_to_cpu(scratch[1]); - - adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", - scratch[0] & 0xFFFF, - scratch[0] >> 16, - scratch[1] & 0xFFFF, - scratch[1] >> 16); -} - -static void wm_halo_show_fw_status(struct wm_adsp *dsp) -{ - u32 scratch[4]; - int ret; - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, dsp->base + HALO_SCRATCH1, - scratch, sizeof(scratch)); - if (ret) { - adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); - return; - } - - adsp_dbg(dsp, "FW SCRATCH 1:0x%x 2:0x%x 3:0x%x 4:0x%x\n", - be32_to_cpu(scratch[0]), - be32_to_cpu(scratch[1]), - be32_to_cpu(scratch[2]), - be32_to_cpu(scratch[3])); -} - -static inline struct wm_coeff_ctl *bytes_ext_to_ctl(struct soc_bytes_ext *ext) -{ - return container_of(ext, struct wm_coeff_ctl, bytes_ext); -} - -static int wm_coeff_base_reg(struct wm_coeff_ctl *ctl, unsigned int *reg) -{ - const struct wm_adsp_alg_region *alg_region = &ctl->alg_region; - struct wm_adsp *dsp = ctl->dsp; - const struct wm_adsp_region *mem; - - mem = wm_adsp_find_region(dsp, alg_region->type); - if (!mem) { - adsp_err(dsp, "No base for region %x\n", - alg_region->type); - return -EINVAL; - } - - *reg = wm_adsp_region_to_reg(dsp, mem, - ctl->alg_region.base + ctl->offset); - - return 0; -} - -static int wm_coeff_info(struct snd_kcontrol *kctl, - struct snd_ctl_elem_info *uinfo) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - - switch (ctl->type) { - case WMFW_CTL_TYPE_ACKED: - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->value.integer.min = WM_ADSP_ACKED_CTL_MIN_VALUE; - uinfo->value.integer.max = WM_ADSP_ACKED_CTL_MAX_VALUE; - uinfo->value.integer.step = 1; - uinfo->count = 1; - break; - default: - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = ctl->len; - break; - } - - return 0; -} - -static int wm_coeff_write_acked_control(struct wm_coeff_ctl *ctl, - unsigned int event_id) -{ - struct wm_adsp *dsp = ctl->dsp; - u32 val = cpu_to_be32(event_id); - unsigned int reg; - int i, ret; - - ret = wm_coeff_base_reg(ctl, ®); - if (ret) - return ret; - - adsp_dbg(dsp, "Sending 0x%x to acked control alg 0x%x %s:0x%x\n", - event_id, ctl->alg_region.alg, - wm_adsp_mem_region_name(ctl->alg_region.type), ctl->offset); - - ret = regmap_raw_write(dsp->regmap, reg, &val, sizeof(val)); - if (ret) { - adsp_err(dsp, "Failed to write %x: %d\n", reg, ret); - return ret; - } - - /* - * Poll for ack, we initially poll at ~1ms intervals for firmwares - * that respond quickly, then go to ~10ms polls. A firmware is unlikely - * to ack instantly so we do the first 1ms delay before reading the - * control to avoid a pointless bus transaction - */ - for (i = 0; i < WM_ADSP_ACKED_CTL_TIMEOUT_MS;) { - switch (i) { - case 0 ... WM_ADSP_ACKED_CTL_N_QUICKPOLLS - 1: - usleep_range(1000, 2000); - i++; - break; - default: - usleep_range(10000, 20000); - i += 10; - break; - } - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, reg, &val, sizeof(val)); - if (ret) { - adsp_err(dsp, "Failed to read %x: %d\n", reg, ret); - return ret; - } - - if (val == 0) { - adsp_dbg(dsp, "Acked control ACKED at poll %u\n", i); - return 0; - } - } - - adsp_warn(dsp, "Acked control @0x%x alg:0x%x %s:0x%x timed out\n", - reg, ctl->alg_region.alg, - wm_adsp_mem_region_name(ctl->alg_region.type), - ctl->offset); - - return -ETIMEDOUT; -} - -static int wm_coeff_write_control(struct wm_coeff_ctl *ctl, - const void *buf, size_t len) -{ - struct wm_adsp *dsp = ctl->dsp; - void *scratch; - int ret; - unsigned int reg; - - ret = wm_coeff_base_reg(ctl, ®); - if (ret) - return ret; - - scratch = kmemdup(buf, len, GFP_KERNEL | GFP_DMA); - if (!scratch) - return -ENOMEM; - - ret = regmap_raw_write(dsp->regmap, reg, scratch, - len); - if (ret) { - adsp_err(dsp, "Failed to write %zu bytes to %x: %d\n", - len, reg, ret); - kfree(scratch); - return ret; - } - adsp_dbg(dsp, "Wrote %zu bytes to %x\n", len, reg); - - kfree(scratch); - - return 0; -} - -static int wm_coeff_put(struct snd_kcontrol *kctl, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - char *p = ucontrol->value.bytes.data; - int ret = 0; - - mutex_lock(&ctl->dsp->pwr_lock); - - if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) - ret = -EPERM; - else - memcpy(ctl->cache, p, ctl->len); - - ctl->set = 1; - if (ctl->enabled && ctl->dsp->running) - ret = wm_coeff_write_control(ctl, p, ctl->len); - - mutex_unlock(&ctl->dsp->pwr_lock); - - return ret; -} - -static int wm_coeff_tlv_put(struct snd_kcontrol *kctl, - const unsigned int __user *bytes, unsigned int size) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - int ret = 0; - - mutex_lock(&ctl->dsp->pwr_lock); - - if (copy_from_user(ctl->cache, bytes, size)) { - ret = -EFAULT; - } else { - ctl->set = 1; - if (ctl->enabled && ctl->dsp->running) - ret = wm_coeff_write_control(ctl, ctl->cache, size); - else if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) - ret = -EPERM; - } - - mutex_unlock(&ctl->dsp->pwr_lock); - - return ret; -} - -static int wm_coeff_put_acked(struct snd_kcontrol *kctl, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - unsigned int val = ucontrol->value.integer.value[0]; - int ret; - - if (val == 0) - return 0; /* 0 means no event */ - - mutex_lock(&ctl->dsp->pwr_lock); - - if (ctl->enabled && ctl->dsp->running) - ret = wm_coeff_write_acked_control(ctl, val); - else - ret = -EPERM; - - mutex_unlock(&ctl->dsp->pwr_lock); - - return ret; -} - -static int wm_coeff_read_control(struct wm_coeff_ctl *ctl, - void *buf, size_t len) -{ - struct wm_adsp *dsp = ctl->dsp; - void *scratch; - int ret; - unsigned int reg; - - ret = wm_coeff_base_reg(ctl, ®); - if (ret) - return ret; - - scratch = kmalloc(len, GFP_KERNEL | GFP_DMA); - if (!scratch) - return -ENOMEM; - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, reg, scratch, len); - if (ret) { - adsp_err(dsp, "Failed to read %zu bytes from %x: %d\n", - len, reg, ret); - kfree(scratch); - return ret; - } - adsp_dbg(dsp, "Read %zu bytes from %x\n", len, reg); - - memcpy(buf, scratch, len); - kfree(scratch); - - return 0; -} - -static int wm_coeff_get(struct snd_kcontrol *kctl, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - char *p = ucontrol->value.bytes.data; - int ret = 0; - - mutex_lock(&ctl->dsp->pwr_lock); - - if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { - if (ctl->enabled && ctl->dsp->running) - ret = wm_coeff_read_control(ctl, p, ctl->len); - else - ret = -EPERM; - } else { - if (!ctl->flags && ctl->enabled && ctl->dsp->running) - ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); - - memcpy(p, ctl->cache, ctl->len); - } - - mutex_unlock(&ctl->dsp->pwr_lock); - - return ret; -} - -static int wm_coeff_tlv_get(struct snd_kcontrol *kctl, - unsigned int __user *bytes, unsigned int size) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - int ret = 0; - - mutex_lock(&ctl->dsp->pwr_lock); - - if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { - if (ctl->enabled && ctl->dsp->running) - ret = wm_coeff_read_control(ctl, ctl->cache, size); - else - ret = -EPERM; - } else { - if (!ctl->flags && ctl->enabled && ctl->dsp->running) - ret = wm_coeff_read_control(ctl, ctl->cache, size); - } - - if (!ret && copy_to_user(bytes, ctl->cache, size)) - ret = -EFAULT; - - mutex_unlock(&ctl->dsp->pwr_lock); - - return ret; -} - -static int wm_coeff_get_acked(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Although it's not useful to read an acked control, we must satisfy - * user-side assumptions that all controls are readable and that a - * write of the same value should be filtered out (it's valid to send - * the same event number again to the firmware). We therefore return 0, - * meaning "no event" so valid event numbers will always be a change - */ - ucontrol->value.integer.value[0] = 0; - - return 0; -} - -struct wmfw_ctl_work { - struct wm_adsp *dsp; - struct wm_coeff_ctl *ctl; - struct work_struct work; -}; - -static unsigned int wmfw_convert_flags(unsigned int in, unsigned int len) -{ - unsigned int out, rd, wr, vol; - - if (len > ADSP_MAX_STD_CTRL_SIZE) { - rd = SNDRV_CTL_ELEM_ACCESS_TLV_READ; - wr = SNDRV_CTL_ELEM_ACCESS_TLV_WRITE; - vol = SNDRV_CTL_ELEM_ACCESS_VOLATILE; - - out = SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK; - } else { - rd = SNDRV_CTL_ELEM_ACCESS_READ; - wr = SNDRV_CTL_ELEM_ACCESS_WRITE; - vol = SNDRV_CTL_ELEM_ACCESS_VOLATILE; - - out = 0; - } - - if (in) { - if (in & WMFW_CTL_FLAG_READABLE) - out |= rd; - if (in & WMFW_CTL_FLAG_WRITEABLE) - out |= wr; - if (in & WMFW_CTL_FLAG_VOLATILE) - out |= vol; - } else { - out |= rd | wr | vol; - } - - return out; -} - - -static int wmfw_add_ctl(struct wm_adsp *dsp, struct wm_coeff_ctl *ctl) -{ - struct snd_kcontrol_new *kcontrol; - int ret; - - if (!ctl || !ctl->name) - return -EINVAL; - - kcontrol = kzalloc(sizeof(*kcontrol), GFP_KERNEL); - if (!kcontrol) - return -ENOMEM; - - kcontrol->name = ctl->name; - kcontrol->info = wm_coeff_info; - kcontrol->iface = SNDRV_CTL_ELEM_IFACE_MIXER; - kcontrol->tlv.c = snd_soc_bytes_tlv_callback; - kcontrol->private_value = (unsigned long)&ctl->bytes_ext; - kcontrol->access = wmfw_convert_flags(ctl->flags, ctl->len); - - switch (ctl->type) { - case WMFW_CTL_TYPE_ACKED: - kcontrol->get = wm_coeff_get_acked; - kcontrol->put = wm_coeff_put_acked; - break; - default: - kcontrol->get = wm_coeff_get; - kcontrol->put = wm_coeff_put; - - ctl->bytes_ext.max = ctl->len; - ctl->bytes_ext.get = wm_coeff_tlv_get; - ctl->bytes_ext.put = wm_coeff_tlv_put; - break; - } - - ret = snd_soc_add_codec_controls(dsp->codec, kcontrol, 1); - if (ret < 0) - goto err_kcontrol; - - kfree(kcontrol); - - return 0; - -err_kcontrol: - kfree(kcontrol); - return ret; -} - -static int wm_coeff_init_control_caches(struct wm_adsp *dsp) -{ - struct wm_coeff_ctl *ctl; - int ret; - - list_for_each_entry(ctl, &dsp->ctl_list, list) { - if (!ctl->enabled || ctl->set) - continue; - if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) - continue; - - ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); - if (ret < 0) - return ret; - } - - return 0; -} - -static int wm_coeff_sync_controls(struct wm_adsp *dsp) -{ - struct wm_coeff_ctl *ctl; - int ret; - - list_for_each_entry(ctl, &dsp->ctl_list, list) { - if (!ctl->enabled) - continue; - if (ctl->set && !(ctl->flags & WMFW_CTL_FLAG_VOLATILE)) { - ret = wm_coeff_write_control(ctl, ctl->cache, ctl->len); - if (ret < 0) - return ret; - } - } - - return 0; -} - -static void wm_adsp_signal_event_controls(struct wm_adsp *dsp, - unsigned int event) -{ - struct wm_coeff_ctl *ctl; - int ret; - - list_for_each_entry(ctl, &dsp->ctl_list, list) { - if (ctl->type != WMFW_CTL_TYPE_HOSTEVENT) - continue; - - if (!ctl->enabled) - continue; - - ret = wm_coeff_write_acked_control(ctl, event); - if (ret) - adsp_warn(dsp, - "Failed to send 0x%x event to alg 0x%x (%d)\n", - event, ctl->alg_region.alg, ret); - } -} - -static void wm_adsp_ctl_work(struct work_struct *work) -{ - struct wmfw_ctl_work *ctl_work = container_of(work, - struct wmfw_ctl_work, - work); - - wmfw_add_ctl(ctl_work->dsp, ctl_work->ctl); - kfree(ctl_work); -} - -static void wm_adsp_free_ctl_blk(struct wm_coeff_ctl *ctl) -{ - kfree(ctl->cache); - kfree(ctl->name); - kfree(ctl); -} - -static int wm_adsp_create_control(struct wm_adsp *dsp, - const struct wm_adsp_alg_region *alg_region, - unsigned int offset, unsigned int len, - const char *subname, unsigned int subname_len, - unsigned int flags, unsigned int type) -{ - struct wm_coeff_ctl *ctl; - struct wmfw_ctl_work *ctl_work; - char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; - const char *region_name; - int ret; - - region_name = wm_adsp_mem_region_name(alg_region->type); - if (!region_name) { - adsp_err(dsp, "Unknown region type: %d\n", alg_region->type); - return -EINVAL; - } - - switch (dsp->fw_ver) { - case 0: - case 1: - snprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, "DSP%d %s %x", - dsp->num, region_name, alg_region->alg); - break; - default: - ret = snprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, - "DSP%d%c %.12s %x", dsp->num, *region_name, - wm_adsp_fw_text[dsp->fw], alg_region->alg); - - /* Truncate the subname from the start if it is too long */ - if (subname) { - int avail = SNDRV_CTL_ELEM_ID_NAME_MAXLEN - ret - 2; - int skip = 0; - - if (subname_len > avail) - skip = subname_len - avail; - - snprintf(name + ret, - SNDRV_CTL_ELEM_ID_NAME_MAXLEN - ret, " %.*s", - subname_len - skip, subname + skip); - } - break; - } - - list_for_each_entry(ctl, &dsp->ctl_list, list) { - if (!strcmp(ctl->name, name)) { - if (!ctl->enabled) - ctl->enabled = 1; - return 0; - } - } - - ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); - if (!ctl) - return -ENOMEM; - ctl->fw_name = wm_adsp_fw_text[dsp->fw]; - ctl->alg_region = *alg_region; - ctl->name = kmemdup(name, strlen(name) + 1, GFP_KERNEL); - if (!ctl->name) { - ret = -ENOMEM; - goto err_ctl; - } - ctl->enabled = 1; - ctl->set = 0; - ctl->ops.xget = wm_coeff_get; - ctl->ops.xput = wm_coeff_put; - ctl->dsp = dsp; - - ctl->flags = flags; - ctl->type = type; - ctl->offset = offset; - ctl->len = len; - ctl->cache = kzalloc(ctl->len, GFP_KERNEL); - if (!ctl->cache) { - ret = -ENOMEM; - goto err_ctl_name; - } - - list_add(&ctl->list, &dsp->ctl_list); - - if (flags & WMFW_CTL_FLAG_SYS) - return 0; - - ctl_work = kzalloc(sizeof(*ctl_work), GFP_KERNEL); - if (!ctl_work) { - ret = -ENOMEM; - goto err_ctl_cache; - } - - ctl_work->dsp = dsp; - ctl_work->ctl = ctl; - INIT_WORK(&ctl_work->work, wm_adsp_ctl_work); - schedule_work(&ctl_work->work); - - return 0; - -err_ctl_cache: - kfree(ctl->cache); -err_ctl_name: - kfree(ctl->name); -err_ctl: - kfree(ctl); - - return ret; -} - -struct wm_coeff_parsed_alg { - int id; - const u8 *name; - int name_len; - int ncoeff; -}; - -struct wm_coeff_parsed_coeff { - int offset; - int mem_type; - const u8 *name; - int name_len; - int ctl_type; - int flags; - int len; -}; - -static int wm_coeff_parse_string(int bytes, const u8 **pos, const u8 **str) -{ - int length; - - switch (bytes) { - case 1: - length = **pos; - break; - case 2: - length = le16_to_cpu(*((__le16 *)*pos)); - break; - default: - return 0; - } - - if (str) - *str = *pos + bytes; - - *pos += ((length + bytes) + 3) & ~0x03; - - return length; -} - -static int wm_coeff_parse_int(int bytes, const u8 **pos) -{ - int val = 0; - - switch (bytes) { - case 2: - val = le16_to_cpu(*((__le16 *)*pos)); - break; - case 4: - val = le32_to_cpu(*((__le32 *)*pos)); - break; - default: - break; - } - - *pos += bytes; - - return val; -} - -static inline void wm_coeff_parse_alg(struct wm_adsp *dsp, const u8 **data, - struct wm_coeff_parsed_alg *blk) -{ - const struct wmfw_adsp_alg_data *raw; - - switch (dsp->fw_ver) { - case 0: - case 1: - raw = (const struct wmfw_adsp_alg_data *)*data; - *data = raw->data; - - blk->id = le32_to_cpu(raw->id); - blk->name = raw->name; - blk->name_len = strlen(raw->name); - blk->ncoeff = le32_to_cpu(raw->ncoeff); - break; - default: - blk->id = wm_coeff_parse_int(sizeof(raw->id), data); - blk->name_len = wm_coeff_parse_string(sizeof(u8), data, - &blk->name); - wm_coeff_parse_string(sizeof(u16), data, NULL); - blk->ncoeff = wm_coeff_parse_int(sizeof(raw->ncoeff), data); - break; - } - - adsp_dbg(dsp, "Algorithm ID: %#x\n", blk->id); - adsp_dbg(dsp, "Algorithm name: %.*s\n", blk->name_len, blk->name); - adsp_dbg(dsp, "# of coefficient descriptors: %#x\n", blk->ncoeff); -} - -static inline void wm_coeff_parse_coeff(struct wm_adsp *dsp, const u8 **data, - struct wm_coeff_parsed_coeff *blk) -{ - const struct wmfw_adsp_coeff_data *raw; - const u8 *tmp; - int length; - - switch (dsp->fw_ver) { - case 0: - case 1: - raw = (const struct wmfw_adsp_coeff_data *)*data; - *data = *data + sizeof(raw->hdr) + le32_to_cpu(raw->hdr.size); - - blk->offset = le16_to_cpu(raw->hdr.offset); - blk->mem_type = le16_to_cpu(raw->hdr.type); - blk->name = raw->name; - blk->name_len = strlen(raw->name); - blk->ctl_type = le16_to_cpu(raw->ctl_type); - blk->flags = le16_to_cpu(raw->flags); - blk->len = le32_to_cpu(raw->len); - break; - default: - tmp = *data; - blk->offset = wm_coeff_parse_int(sizeof(raw->hdr.offset), &tmp); - blk->mem_type = wm_coeff_parse_int(sizeof(raw->hdr.type), &tmp); - length = wm_coeff_parse_int(sizeof(raw->hdr.size), &tmp); - blk->name_len = wm_coeff_parse_string(sizeof(u8), &tmp, - &blk->name); - wm_coeff_parse_string(sizeof(u8), &tmp, NULL); - wm_coeff_parse_string(sizeof(u16), &tmp, NULL); - blk->ctl_type = wm_coeff_parse_int(sizeof(raw->ctl_type), &tmp); - blk->flags = wm_coeff_parse_int(sizeof(raw->flags), &tmp); - blk->len = wm_coeff_parse_int(sizeof(raw->len), &tmp); - - *data = *data + sizeof(raw->hdr) + length; - break; - } - - adsp_dbg(dsp, "\tCoefficient type: %#x\n", blk->mem_type); - adsp_dbg(dsp, "\tCoefficient offset: %#x\n", blk->offset); - adsp_dbg(dsp, "\tCoefficient name: %.*s\n", blk->name_len, blk->name); - adsp_dbg(dsp, "\tCoefficient flags: %#x\n", blk->flags); - adsp_dbg(dsp, "\tALSA control type: %#x\n", blk->ctl_type); - adsp_dbg(dsp, "\tALSA control len: %#x\n", blk->len); -} - -static int wm_adsp_check_coeff_flags(struct wm_adsp *dsp, - const struct wm_coeff_parsed_coeff *coeff_blk, - unsigned int f_required, - unsigned int f_illegal) -{ - if ((coeff_blk->flags & f_illegal) || - ((coeff_blk->flags & f_required) != f_required)) { - adsp_err(dsp, "Illegal flags 0x%x for control type 0x%x\n", - coeff_blk->flags, coeff_blk->ctl_type); - return -EINVAL; - } - - return 0; -} - -static int wm_adsp_parse_coeff(struct wm_adsp *dsp, - const struct wmfw_region *region) -{ - struct wm_adsp_alg_region alg_region = {}; - struct wm_coeff_parsed_alg alg_blk; - struct wm_coeff_parsed_coeff coeff_blk; - const u8 *data = region->data; - int i, ret; - - wm_coeff_parse_alg(dsp, &data, &alg_blk); - for (i = 0; i < alg_blk.ncoeff; i++) { - wm_coeff_parse_coeff(dsp, &data, &coeff_blk); - - switch (coeff_blk.ctl_type) { - case SNDRV_CTL_ELEM_TYPE_BYTES: - break; - case WMFW_CTL_TYPE_ACKED: - if (coeff_blk.flags & WMFW_CTL_FLAG_SYS) - continue; /* ignore */ - - ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk, - WMFW_CTL_FLAG_VOLATILE | - WMFW_CTL_FLAG_WRITEABLE | - WMFW_CTL_FLAG_READABLE, - 0); - if (ret) - return -EINVAL; - break; - case WMFW_CTL_TYPE_HOSTEVENT: - ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk, - WMFW_CTL_FLAG_SYS | - WMFW_CTL_FLAG_VOLATILE | - WMFW_CTL_FLAG_WRITEABLE | - WMFW_CTL_FLAG_READABLE, - 0); - if (ret) - return -EINVAL; - break; - default: - adsp_err(dsp, "Unknown control type: %d\n", - coeff_blk.ctl_type); - return -EINVAL; - } - - alg_region.type = coeff_blk.mem_type; - alg_region.alg = alg_blk.id; - - ret = wm_adsp_create_control(dsp, &alg_region, - coeff_blk.offset, - coeff_blk.len, - coeff_blk.name, - coeff_blk.name_len, - coeff_blk.flags, - coeff_blk.ctl_type); - if (ret < 0) - adsp_err(dsp, "Failed to create control: %.*s, %d\n", - coeff_blk.name_len, coeff_blk.name, ret); - } - - return 0; -} - -static int wm_adsp_load(struct wm_adsp *dsp) -{ - LIST_HEAD(buf_list); - const struct firmware *firmware; - struct regmap *regmap = dsp->regmap; - unsigned int pos = 0; - const struct wmfw_header *header; - const struct wmfw_adsp1_sizes *adsp1_sizes; - const struct wmfw_adsp2_sizes *adsp2_sizes; - const struct wmfw_footer *footer; - const struct wmfw_region *region; - const struct wm_adsp_region *mem; - const char *region_name; - char *file, *text = NULL; - struct wm_adsp_buf *buf; -#ifdef WM_ADSP_DEBUG - void *bufVerify; -#endif - unsigned int reg; - int regions = 0; - int ret, offset, type, sizes; -#ifdef WM_ADSP_DEBUG - size_t i; - bool verifyOk = true; - int tempA, tempB; - int* pTempA, *pTempB; - int max_failures = 666666; - int num_failures = 0; - int whileLoopCount = 0; -#endif - file = kzalloc(PAGE_SIZE, GFP_KERNEL); - if (file == NULL) - return -ENOMEM; - - snprintf(file, PAGE_SIZE, "%s-dsp%d-%s.wmfw", dsp->part, dsp->num, - wm_adsp_fw[dsp->fw].file); - file[PAGE_SIZE - 1] = '\0'; - - ret = request_firmware(&firmware, file, dsp->dev); - if (ret != 0) { - adsp_err(dsp, "Failed to request '%s'\n", file); - goto out; - } - ret = -EINVAL; - - pos = sizeof(*header) + sizeof(*adsp1_sizes) + sizeof(*footer); - if (pos >= firmware->size) { - adsp_err(dsp, "%s: file too short, %zu bytes\n", - file, firmware->size); - goto out_fw; - } - - header = (void *)&firmware->data[0]; - - if (memcmp(&header->magic[0], "WMFW", 4) != 0) { - adsp_err(dsp, "%s: invalid magic\n", file); - goto out_fw; - } - - switch (dsp->type) { - case WMFW_ADSP1: - case WMFW_ADSP2: - switch (header->ver) { - case 0: - adsp_warn(dsp, "%s: Deprecated file format %d\n", - file, header->ver); - break; - case 1: - case 2: - break; - default: - adsp_err(dsp, "%s: unknown file format %d\n", - file, header->ver); - goto out_fw; - } - break; - case WMFW_HALO: - switch (header->ver) { - case 1: - case 2: - /* - * we are required to load these for testing purposes - * but this format is not allowed for production fw - */ - adsp_warn(dsp, - "%s: Not a production firmware (deprecated file format %d)\n", - file, header->ver); - break; - case 3: - break; - default: - adsp_err(dsp, "%s: unknown file format %d\n", - file, header->ver); - goto out_fw; - } - } - - adsp_info(dsp, "Firmware version: %d\n", header->ver); - dsp->fw_ver = header->ver; - - if (header->core != dsp->type) { - adsp_err(dsp, "%s: invalid core %d != %d\n", - file, header->core, dsp->type); - goto out_fw; - } - - switch (dsp->type) { - case WMFW_ADSP1: - pos = sizeof(*header) + sizeof(*adsp1_sizes) + sizeof(*footer); - adsp1_sizes = (void *)&(header[1]); - footer = (void *)&(adsp1_sizes[1]); - sizes = sizeof(*adsp1_sizes); - - adsp_dbg(dsp, "%s: %d DM, %d PM, %d ZM\n", - file, le32_to_cpu(adsp1_sizes->dm), - le32_to_cpu(adsp1_sizes->pm), - le32_to_cpu(adsp1_sizes->zm)); - break; - - case WMFW_HALO: - case WMFW_ADSP2: - pos = sizeof(*header) + sizeof(*adsp2_sizes) + sizeof(*footer); - adsp2_sizes = (void *)&(header[1]); - footer = (void *)&(adsp2_sizes[1]); - sizes = sizeof(*adsp2_sizes); - - adsp_dbg(dsp, "%s: %d XM, %d YM %d PM, %d ZM\n", - file, le32_to_cpu(adsp2_sizes->xm), - le32_to_cpu(adsp2_sizes->ym), - le32_to_cpu(adsp2_sizes->pm), - le32_to_cpu(adsp2_sizes->zm)); - break; - - default: - WARN(1, "Unknown DSP type"); - goto out_fw; - } - - if (le32_to_cpu(header->len) != sizeof(*header) + - sizes + sizeof(*footer)) { - adsp_err(dsp, "%s: unexpected header length %d\n", - file, le32_to_cpu(header->len)); - goto out_fw; - } - - adsp_dbg(dsp, "%s: timestamp %llu\n", file, - le64_to_cpu(footer->timestamp)); - - while (pos < firmware->size && - pos - firmware->size > sizeof(*region)) { -#ifdef WM_ADSP_DEBUG - num_failures = 0; -#endif - region = (void *)&(firmware->data[pos]); - region_name = "Unknown"; - reg = 0; - text = NULL; - offset = le32_to_cpu(region->offset) & 0xffffff; - type = be32_to_cpu(region->type) & 0xff; - mem = wm_adsp_find_region(dsp, type); - - switch (type) { - case WMFW_NAME_TEXT: - region_name = "Firmware name"; - text = kzalloc(le32_to_cpu(region->len) + 1, - GFP_KERNEL); - break; - case WMFW_ALGORITHM_DATA: - region_name = "Algorithm"; - ret = wm_adsp_parse_coeff(dsp, region); - if (ret != 0) - goto out_fw; - break; - case WMFW_INFO_TEXT: - region_name = "Information"; - text = kzalloc(le32_to_cpu(region->len) + 1, - GFP_KERNEL); - break; - case WMFW_ABSOLUTE: - region_name = "Absolute"; - reg = offset; - break; - case WMFW_ADSP1_PM: - case WMFW_ADSP1_DM: - case WMFW_ADSP2_XM: - case WMFW_ADSP2_YM: - case WMFW_ADSP1_ZM: - case WMFW_HALO_PM_PACKED: - case WMFW_HALO_XM_PACKED: - case WMFW_HALO_YM_PACKED: - region_name = wm_adsp_mem_region_name(type); - reg = wm_adsp_region_to_reg(dsp, mem, offset); - break; - default: - adsp_warn(dsp, - "%s.%d: Unknown region type %x at %d(%x)\n", - file, regions, type, pos, pos); - break; - } - - adsp_dbg(dsp, "%s.%d: %d bytes at %d in %s\n", file, - regions, le32_to_cpu(region->len), offset, - region_name); - - if ((pos + le32_to_cpu(region->len) + sizeof(*region)) > - firmware->size) { - adsp_err(dsp, - "%s.%d: %s region len %d bytes exceeds file length %zu\n", - file, regions, region_name, - le32_to_cpu(region->len), firmware->size); - ret = -EINVAL; - goto out_fw; - } - - if (text) { - memcpy(text, region->data, le32_to_cpu(region->len)); - adsp_info(dsp, "%s: %s\n", file, text); - kfree(text); - text = NULL; - } - - if (reg) { - buf = wm_adsp_buf_alloc(region->data, - le32_to_cpu(region->len), - &buf_list); - if (!buf) { - adsp_err(dsp, "Out of memory\n"); - ret = -ENOMEM; - goto out_fw; - } -#ifdef WM_ADSP_DEBUG - bufVerify = vmalloc(le32_to_cpu(region->len)); - if (!bufVerify) { - adsp_err(dsp, "Could not allocate memory for verification buffer\n"); - ret = -ENOMEM; - goto out_fw; - } -#endif - - ret = regmap_raw_write_async(regmap, reg, buf->buf, - le32_to_cpu(region->len)); - - if (ret != 0) { - adsp_err(dsp, - "%s.%d: Failed to write %d bytes at %d in %s: %d\n", - file, regions, - le32_to_cpu(region->len), offset, - region_name, ret); - goto out_fw; - } -#ifdef WM_ADSP_DEBUG - /* abb. 3/5/18 - DEBUG. Wait for this write to complete - Then we will read back the registers and verify contents */ - adsp_info(dsp, "%s: Waiting to complete async write\n", __func__); - ret = regmap_async_complete(regmap); - if (ret != 0) { - adsp_err(dsp, "[1] Failed to complete async write: %d\n", ret); - goto out_fw; - } - adsp_err(dsp, "%s: Async write completed\n", __func__); - - ret = wm_adsp2_raw_read(MAXBULK, regmap, reg, bufVerify, le32_to_cpu(region->len)); - - adsp_err(dsp, "%s: Beginning Verification (loop %d)\n", __func__, whileLoopCount); - adsp_err(dsp, "%s: Total loop length: %d\n", __func__, le32_to_cpu(region->len) / 4); - pTempA = (int *)buf->buf; - pTempB = (int *)bufVerify; - for (i=0; i < le32_to_cpu(region->len) / 4; i++) { - tempA = pTempA[i]; - tempB = pTempB[i]; - - if (tempA != tempB) { - adsp_err(dsp, "** Verify failed on reg 0x%x at i=%zu (wrote 0x%x vs read 0x%x)\n", - reg, i, tempA, tempB); - verifyOk = false; - num_failures++; - } - - if (num_failures >= max_failures) { - adsp_err(dsp, "** Too many failed register verifies (hit max of %d). Exiting\n", - max_failures); - break; - } - } - - vfree(bufVerify); -#endif - } - - pos += le32_to_cpu(region->len) + sizeof(*region); - regions++; -#ifdef WM_ADSP_DEBUG - whileLoopCount++; -#endif - } - - ret = regmap_async_complete(regmap); - if (ret != 0) { - adsp_err(dsp, "Failed to complete async write: %d\n", ret); - goto out_fw; - } - - if (pos > firmware->size) - adsp_warn(dsp, "%s.%d: %zu bytes at end of file\n", - file, regions, pos - firmware->size); - - wm_adsp_debugfs_save_wmfwname(dsp, file); - -out_fw: - regmap_async_complete(regmap); - wm_adsp_buf_free(&buf_list); - release_firmware(firmware); - kfree(text); -out: - kfree(file); -#ifdef WM_ADSP_DEBUG - adsp_err(dsp, "wm_adsp_load- with verifyOk = %d and ret = %d", - verifyOk, ret); -#endif - return ret; -} - -static void wm_adsp_ctl_fixup_base(struct wm_adsp *dsp, - const struct wm_adsp_alg_region *alg_region) -{ - struct wm_coeff_ctl *ctl; - - list_for_each_entry(ctl, &dsp->ctl_list, list) { - if (ctl->fw_name == wm_adsp_fw_text[dsp->fw] && - alg_region->alg == ctl->alg_region.alg && - alg_region->type == ctl->alg_region.type) { - ctl->alg_region.base = alg_region->base; - } - } -} - -static void *wm_adsp_read_algs(struct wm_adsp *dsp, size_t n_algs, - unsigned int pos, unsigned int len) -{ - void *alg; - int ret; - __be32 val; - - if (n_algs == 0) { - adsp_err(dsp, "No algorithms\n"); - return ERR_PTR(-EINVAL); - } - - if (n_algs > 1024) { - adsp_err(dsp, "Algorithm count %zx excessive\n", n_algs); - return ERR_PTR(-EINVAL); - } - - /* Read the terminator first to validate the length */ - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, pos + len, &val, sizeof(val)); - if (ret != 0) { - adsp_err(dsp, "Failed to read algorithm list end: %d\n", - ret); - return ERR_PTR(ret); - } - - if (be32_to_cpu(val) != 0xbedead) - adsp_warn(dsp, "Algorithm list end %x 0x%x != 0xbedead\n", - pos + len, be32_to_cpu(val)); - - alg = kzalloc(len * 2, GFP_KERNEL | GFP_DMA); - if (!alg) - return ERR_PTR(-ENOMEM); - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, pos, alg, len * 2); - if (ret != 0) { - adsp_err(dsp, "Failed to read algorithm list: %d\n", ret); - kfree(alg); - return ERR_PTR(ret); - } - - return alg; -} - -static struct wm_adsp_alg_region * - wm_adsp_find_alg_region(struct wm_adsp *dsp, int type, unsigned int id) -{ - struct wm_adsp_alg_region *alg_region; - - list_for_each_entry(alg_region, &dsp->alg_regions, list) { - if (id == alg_region->alg && type == alg_region->type) - return alg_region; - } - - return NULL; -} - -static struct wm_adsp_alg_region *wm_adsp_create_region(struct wm_adsp *dsp, - int type, __be32 id, - __be32 base) -{ - struct wm_adsp_alg_region *alg_region; - - alg_region = kzalloc(sizeof(*alg_region), GFP_KERNEL); - if (!alg_region) - return ERR_PTR(-ENOMEM); - - alg_region->type = type; - alg_region->alg = be32_to_cpu(id); - alg_region->base = be32_to_cpu(base); - - list_add_tail(&alg_region->list, &dsp->alg_regions); - - if (dsp->fw_ver > 0) - wm_adsp_ctl_fixup_base(dsp, alg_region); - - return alg_region; -} - -static void wm_adsp_free_alg_regions(struct wm_adsp *dsp) -{ - struct wm_adsp_alg_region *alg_region; - - while (!list_empty(&dsp->alg_regions)) { - alg_region = list_first_entry(&dsp->alg_regions, - struct wm_adsp_alg_region, - list); - list_del(&alg_region->list); - kfree(alg_region); - } -} - -static int wm_adsp1_setup_algs(struct wm_adsp *dsp) -{ - struct wmfw_adsp1_id_hdr adsp1_id; - struct wmfw_adsp1_alg_hdr *adsp1_alg; - struct wm_adsp_alg_region *alg_region; - const struct wm_adsp_region *mem; - unsigned int pos, len; - size_t n_algs; - int i, ret; - - mem = wm_adsp_find_region(dsp, WMFW_ADSP1_DM); - if (WARN_ON(!mem)) - return -EINVAL; - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, mem->base, &adsp1_id, - sizeof(adsp1_id)); - if (ret != 0) { - adsp_err(dsp, "Failed to read algorithm info: %d\n", - ret); - return ret; - } - - n_algs = be32_to_cpu(adsp1_id.n_algs); - dsp->fw_id = be32_to_cpu(adsp1_id.fw.id); - adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n", - dsp->fw_id, - (be32_to_cpu(adsp1_id.fw.ver) & 0xff0000) >> 16, - (be32_to_cpu(adsp1_id.fw.ver) & 0xff00) >> 8, - be32_to_cpu(adsp1_id.fw.ver) & 0xff, - n_algs); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_ZM, - adsp1_id.fw.id, adsp1_id.zm); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_DM, - adsp1_id.fw.id, adsp1_id.dm); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - pos = sizeof(adsp1_id) / 2; - len = (sizeof(*adsp1_alg) * n_algs) / 2; - - adsp1_alg = wm_adsp_read_algs(dsp, n_algs, mem->base + pos, len); - if (IS_ERR(adsp1_alg)) - return PTR_ERR(adsp1_alg); - - for (i = 0; i < n_algs; i++) { - adsp_info(dsp, "%d: ID %x v%d.%d.%d DM@%x ZM@%x\n", - i, be32_to_cpu(adsp1_alg[i].alg.id), - (be32_to_cpu(adsp1_alg[i].alg.ver) & 0xff0000) >> 16, - (be32_to_cpu(adsp1_alg[i].alg.ver) & 0xff00) >> 8, - be32_to_cpu(adsp1_alg[i].alg.ver) & 0xff, - be32_to_cpu(adsp1_alg[i].dm), - be32_to_cpu(adsp1_alg[i].zm)); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_DM, - adsp1_alg[i].alg.id, - adsp1_alg[i].dm); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - if (dsp->fw_ver == 0) { - if (i + 1 < n_algs) { - len = be32_to_cpu(adsp1_alg[i + 1].dm); - len -= be32_to_cpu(adsp1_alg[i].dm); - len *= 4; - wm_adsp_create_control(dsp, alg_region, 0, - len, NULL, 0, 0, - SNDRV_CTL_ELEM_TYPE_BYTES); - } else { - adsp_warn(dsp, "Missing length info for region DM with ID %x\n", - be32_to_cpu(adsp1_alg[i].alg.id)); - } - } - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP1_ZM, - adsp1_alg[i].alg.id, - adsp1_alg[i].zm); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - if (dsp->fw_ver == 0) { - if (i + 1 < n_algs) { - len = be32_to_cpu(adsp1_alg[i + 1].zm); - len -= be32_to_cpu(adsp1_alg[i].zm); - len *= 4; - wm_adsp_create_control(dsp, alg_region, 0, - len, NULL, 0, 0, - SNDRV_CTL_ELEM_TYPE_BYTES); - } else { - adsp_warn(dsp, "Missing length info for region ZM with ID %x\n", - be32_to_cpu(adsp1_alg[i].alg.id)); - } - } - } - -out: - kfree(adsp1_alg); - return ret; -} - -static int wm_adsp2_setup_algs(struct wm_adsp *dsp) -{ - struct wmfw_adsp2_id_hdr adsp2_id; - struct wmfw_adsp2_alg_hdr *adsp2_alg; - struct wm_adsp_alg_region *alg_region; - const struct wm_adsp_region *mem; - unsigned int pos, len; - size_t n_algs; - int i, ret; - - mem = wm_adsp_find_region(dsp, WMFW_ADSP2_XM); - if (WARN_ON(!mem)) - return -EINVAL; - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, mem->base, &adsp2_id, - sizeof(adsp2_id)); - if (ret != 0) { - adsp_err(dsp, "Failed to read algorithm info: %d\n", - ret); - return ret; - } - - n_algs = be32_to_cpu(adsp2_id.n_algs); - dsp->fw_id = be32_to_cpu(adsp2_id.fw.id); - dsp->fw_id_version = be32_to_cpu(adsp2_id.fw.ver); - dsp->fw_vendor_id = 0; - adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n", - dsp->fw_id, - (dsp->fw_id_version & 0xff0000) >> 16, - (dsp->fw_id_version & 0xff00) >> 8, - dsp->fw_id_version & 0xff, - n_algs); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, - adsp2_id.fw.id, adsp2_id.xm); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, - adsp2_id.fw.id, adsp2_id.ym); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - switch (dsp->type) { - case WMFW_HALO: - pos = sizeof(adsp2_id); - len = sizeof(*adsp2_alg) * n_algs; - break; - default: - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_ZM, - adsp2_id.fw.id, adsp2_id.zm); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - pos = sizeof(adsp2_id) / 2; - len = (sizeof(*adsp2_alg) * n_algs) / 2; - break; - } - - adsp2_alg = wm_adsp_read_algs(dsp, n_algs, mem->base + pos, len); - if (IS_ERR(adsp2_alg)) - return PTR_ERR(adsp2_alg); - - for (i = 0; i < n_algs; i++) { - adsp_info(dsp, - "%d: ID %x v%d.%d.%d XM@%x YM@%x ZM@%x\n", - i, be32_to_cpu(adsp2_alg[i].alg.id), - (be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff0000) >> 16, - (be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff00) >> 8, - be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff, - be32_to_cpu(adsp2_alg[i].xm), - be32_to_cpu(adsp2_alg[i].ym), - be32_to_cpu(adsp2_alg[i].zm)); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, - adsp2_alg[i].alg.id, - adsp2_alg[i].xm); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - if (dsp->fw_ver == 0) { - if (i + 1 < n_algs) { - len = be32_to_cpu(adsp2_alg[i + 1].xm); - len -= be32_to_cpu(adsp2_alg[i].xm); - len *= 4; - wm_adsp_create_control(dsp, alg_region, 0, - len, NULL, 0, 0, - SNDRV_CTL_ELEM_TYPE_BYTES); - } else { - adsp_warn(dsp, "Missing length info for region XM with ID %x\n", - be32_to_cpu(adsp2_alg[i].alg.id)); - } - } - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, - adsp2_alg[i].alg.id, - adsp2_alg[i].ym); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - if (dsp->fw_ver == 0) { - if (i + 1 < n_algs) { - len = be32_to_cpu(adsp2_alg[i + 1].ym); - len -= be32_to_cpu(adsp2_alg[i].ym); - len *= 4; - wm_adsp_create_control(dsp, alg_region, 0, - len, NULL, 0, 0, - SNDRV_CTL_ELEM_TYPE_BYTES); - } else { - adsp_warn(dsp, "Missing length info for region YM with ID %x\n", - be32_to_cpu(adsp2_alg[i].alg.id)); - } - } - - /* no ZM on HALO */ - if (dsp->type == WMFW_HALO) - continue; - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_ZM, - adsp2_alg[i].alg.id, - adsp2_alg[i].zm); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - if (dsp->fw_ver == 0) { - if (i + 1 < n_algs) { - len = be32_to_cpu(adsp2_alg[i + 1].zm); - len -= be32_to_cpu(adsp2_alg[i].zm); - len *= 4; - wm_adsp_create_control(dsp, alg_region, 0, - len, NULL, 0, 0, - SNDRV_CTL_ELEM_TYPE_BYTES); - } else { - adsp_warn(dsp, "Missing length info for region ZM with ID %x\n", - be32_to_cpu(adsp2_alg[i].alg.id)); - } - } - } - -out: - kfree(adsp2_alg); - return ret; -} - -static int wm_halo_setup_algs(struct wm_adsp *dsp) -{ - struct wmfw_halo_id_hdr halo_id; - struct wmfw_halo_alg_hdr *halo_alg; - struct wm_adsp_alg_region *alg_region; - const struct wm_adsp_region *mem; - unsigned int pos, len, block_rev; - size_t n_algs; - int i, ret; - - mem = wm_adsp_find_region(dsp, WMFW_ADSP2_XM); - if (WARN_ON(!mem)) - return -EINVAL; - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, mem->base, &halo_id, - sizeof(halo_id)); - if (ret != 0) { - adsp_err(dsp, "Failed to read algorithm info: %d\n", - ret); - return ret; - } - - block_rev = be32_to_cpu(halo_id.fw.block_rev) >> 16; - switch (block_rev) { - case 3: - break; - default: - adsp_err(dsp, "Unknown firmware ID block version 0x%x\n", - block_rev); - return -EINVAL; - } - - n_algs = be32_to_cpu(halo_id.n_algs); - dsp->fw_id = be32_to_cpu(halo_id.fw.id); - dsp->fw_id_version = be32_to_cpu(halo_id.fw.ver); - dsp->fw_vendor_id = be32_to_cpu(halo_id.fw.vendor_id); - adsp_info(dsp, "Firmware: %x vendor: 0x%x v%d.%d.%d, %zu algorithms\n", - dsp->fw_id, - dsp->fw_vendor_id, - (dsp->fw_id_version & 0xff0000) >> 16, - (dsp->fw_id_version & 0xff00) >> 8, - dsp->fw_id_version & 0xff, - n_algs); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, - halo_id.fw.id, halo_id.xm_base); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - alg_region = wm_adsp_create_region(dsp, WMFW_HALO_XM_PACKED, - halo_id.fw.id, halo_id.xm_base); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, - halo_id.fw.id, halo_id.ym_base); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - alg_region = wm_adsp_create_region(dsp, WMFW_HALO_YM_PACKED, - halo_id.fw.id, halo_id.ym_base); - if (IS_ERR(alg_region)) - return PTR_ERR(alg_region); - - pos = sizeof(halo_id); - len = (sizeof(*halo_alg) * n_algs); - - halo_alg = wm_adsp_read_algs(dsp, n_algs, mem->base + pos, len); - if (IS_ERR(halo_alg)) - return PTR_ERR(halo_alg); - - for (i = 0; i < n_algs; i++) { - adsp_info(dsp, - "%d: ID %x v%d.%d.%d XM@%x YM@%x\n", - i, be32_to_cpu(halo_alg[i].alg.id), - (be32_to_cpu(halo_alg[i].alg.ver) & 0xff0000) >> 16, - (be32_to_cpu(halo_alg[i].alg.ver) & 0xff00) >> 8, - be32_to_cpu(halo_alg[i].alg.ver) & 0xff, - be32_to_cpu(halo_alg[i].xm_base), - be32_to_cpu(halo_alg[i].ym_base)); - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_XM, - halo_alg[i].alg.id, - halo_alg[i].xm_base); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - - alg_region = wm_adsp_create_region(dsp, WMFW_HALO_XM_PACKED, - halo_alg[i].alg.id, - halo_alg[i].xm_base); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - - alg_region = wm_adsp_create_region(dsp, WMFW_ADSP2_YM, - halo_alg[i].alg.id, - halo_alg[i].ym_base); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - - alg_region = wm_adsp_create_region(dsp, WMFW_HALO_YM_PACKED, - halo_alg[i].alg.id, - halo_alg[i].ym_base); - if (IS_ERR(alg_region)) { - ret = PTR_ERR(alg_region); - goto out; - } - } - -out: - kfree(halo_alg); - return ret; -} - -static int wm_adsp_load_coeff(struct wm_adsp *dsp) -{ - LIST_HEAD(buf_list); - struct regmap *regmap = dsp->regmap; - struct wmfw_coeff_hdr *hdr; - struct wmfw_coeff_item *blk; - const struct firmware *firmware; - const struct wm_adsp_region *mem; - struct wm_adsp_alg_region *alg_region; - const char *region_name; - int ret, pos, blocks, type, offset, reg; - char *file; - struct wm_adsp_buf *buf; - - file = kzalloc(PAGE_SIZE, GFP_KERNEL); - if (file == NULL) - return -ENOMEM; - - snprintf(file, PAGE_SIZE, "%s-dsp%d-%s.bin", dsp->part, dsp->num, - wm_adsp_fw[dsp->fw].file); - file[PAGE_SIZE - 1] = '\0'; - - ret = request_firmware(&firmware, file, dsp->dev); - if (ret != 0) { - adsp_warn(dsp, "Failed to request '%s'\n", file); - ret = 0; - goto out; - } - ret = -EINVAL; - - if (sizeof(*hdr) >= firmware->size) { - adsp_err(dsp, "%s: file too short, %zu bytes\n", - file, firmware->size); - goto out_fw; - } - - hdr = (void *)&firmware->data[0]; - if (memcmp(hdr->magic, "WMDR", 4) != 0) { - adsp_err(dsp, "%s: invalid magic\n", file); - goto out_fw; - } - - switch (be32_to_cpu(hdr->rev) & 0xff) { - case 1: - break; - default: - adsp_err(dsp, "%s: Unsupported coefficient file format %d\n", - file, be32_to_cpu(hdr->rev) & 0xff); - ret = -EINVAL; - goto out_fw; - } - - adsp_dbg(dsp, "%s: v%d.%d.%d\n", file, - (le32_to_cpu(hdr->ver) >> 16) & 0xff, - (le32_to_cpu(hdr->ver) >> 8) & 0xff, - le32_to_cpu(hdr->ver) & 0xff); - - pos = le32_to_cpu(hdr->len); - - blocks = 0; - while (pos < firmware->size && - pos - firmware->size > sizeof(*blk)) { - blk = (void *)(&firmware->data[pos]); - - type = le16_to_cpu(blk->type); - offset = le16_to_cpu(blk->offset); - - adsp_dbg(dsp, "%s.%d: %x v%d.%d.%d\n", - file, blocks, le32_to_cpu(blk->id), - (le32_to_cpu(blk->ver) >> 16) & 0xff, - (le32_to_cpu(blk->ver) >> 8) & 0xff, - le32_to_cpu(blk->ver) & 0xff); - adsp_dbg(dsp, "%s.%d: %d bytes at 0x%x in %x\n", - file, blocks, le32_to_cpu(blk->len), offset, type); - - reg = 0; - region_name = "Unknown"; - switch (type) { - case (WMFW_NAME_TEXT << 8): - case (WMFW_INFO_TEXT << 8): - break; - case (WMFW_ABSOLUTE << 8): - /* - * Old files may use this for global - * coefficients. - */ - if (le32_to_cpu(blk->id) == dsp->fw_id && - offset == 0) { - region_name = "global coefficients"; - mem = wm_adsp_find_region(dsp, type); - if (!mem) { - adsp_err(dsp, "No ZM\n"); - break; - } - reg = wm_adsp_region_to_reg(dsp, mem, 0); - - } else { - region_name = "register"; - reg = offset; - } - break; - - case WMFW_ADSP1_DM: - case WMFW_ADSP1_ZM: - case WMFW_ADSP2_XM: - case WMFW_ADSP2_YM: - case WMFW_HALO_XM_PACKED: - case WMFW_HALO_YM_PACKED: - case WMFW_HALO_PM_PACKED: - adsp_dbg(dsp, "%s.%d: %d bytes in %x for %x\n", - file, blocks, le32_to_cpu(blk->len), - type, le32_to_cpu(blk->id)); - - mem = wm_adsp_find_region(dsp, type); - if (!mem) { - adsp_err(dsp, "No base for region %x\n", type); - break; - } - - alg_region = wm_adsp_find_alg_region(dsp, type, - le32_to_cpu(blk->id)); - if (alg_region) { - reg = alg_region->base; - reg = wm_adsp_region_to_reg(dsp, mem, reg); - reg += offset; - } else { - adsp_err(dsp, "No %x for algorithm %x\n", - type, le32_to_cpu(blk->id)); - } - break; - - default: - adsp_err(dsp, "%s.%d: Unknown region type %x at %d\n", - file, blocks, type, pos); - break; - } - - if (reg) { - if ((pos + le32_to_cpu(blk->len) + sizeof(*blk)) > - firmware->size) { - adsp_err(dsp, - "%s.%d: %s region len %d bytes exceeds file length %zu\n", - file, blocks, region_name, - le32_to_cpu(blk->len), - firmware->size); - ret = -EINVAL; - goto out_fw; - } - - buf = wm_adsp_buf_alloc(blk->data, - le32_to_cpu(blk->len), - &buf_list); - if (!buf) { - adsp_err(dsp, "Out of memory\n"); - ret = -ENOMEM; - goto out_fw; - } - - adsp_dbg(dsp, "%s.%d: Writing %d bytes at %x\n", - file, blocks, le32_to_cpu(blk->len), - reg); - ret = regmap_raw_write_async(regmap, reg, buf->buf, - le32_to_cpu(blk->len)); - if (ret != 0) { - adsp_err(dsp, - "%s.%d: Failed to write to %x in %s: %d\n", - file, blocks, reg, region_name, ret); - } - } - - pos += (le32_to_cpu(blk->len) + sizeof(*blk) + 3) & ~0x03; - blocks++; - } - - ret = regmap_async_complete(regmap); - if (ret != 0) - adsp_err(dsp, "Failed to complete async write: %d\n", ret); - - if (pos > firmware->size) - adsp_warn(dsp, "%s.%d: %zu bytes at end of file\n", - file, blocks, pos - firmware->size); - - wm_adsp_debugfs_save_binname(dsp, file); - -out_fw: - regmap_async_complete(regmap); - release_firmware(firmware); - wm_adsp_buf_free(&buf_list); -out: - kfree(file); - return ret; -} - -int wm_adsp1_init(struct wm_adsp *dsp) -{ - INIT_LIST_HEAD(&dsp->alg_regions); - - mutex_init(&dsp->pwr_lock); - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp1_init); - -int wm_adsp1_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); - struct wm_adsp *dsp = &dsps[w->shift]; - struct wm_coeff_ctl *ctl; - int ret; - unsigned int val; - - dsp->codec = codec; - - mutex_lock(&dsp->pwr_lock); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, - ADSP1_SYS_ENA, ADSP1_SYS_ENA); - - /* - * For simplicity set the DSP clock rate to be the - * SYSCLK rate rather than making it configurable. - */ - if (dsp->sysclk_reg) { - ret = regmap_read(dsp->regmap, dsp->sysclk_reg, &val); - if (ret != 0) { - adsp_err(dsp, "Failed to read SYSCLK state: %d\n", - ret); - goto err_mutex; - } - - val = (val & dsp->sysclk_mask) >> dsp->sysclk_shift; - - ret = regmap_update_bits(dsp->regmap, - dsp->base + ADSP1_CONTROL_31, - ADSP1_CLK_SEL_MASK, val); - if (ret != 0) { - adsp_err(dsp, "Failed to set clock rate: %d\n", - ret); - goto err_mutex; - } - } - - ret = wm_adsp_load(dsp); - if (ret != 0) - goto err_ena; - - ret = wm_adsp1_setup_algs(dsp); - if (ret != 0) - goto err_ena; - - ret = wm_adsp_load_coeff(dsp); - if (ret != 0) - goto err_ena; - - /* Initialize caches for enabled and unset controls */ - ret = wm_coeff_init_control_caches(dsp); - if (ret != 0) - goto err_ena; - - /* Sync set controls */ - ret = wm_coeff_sync_controls(dsp); - if (ret != 0) - goto err_ena; - - dsp->booted = true; - - /* Start the core running */ - regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, - ADSP1_CORE_ENA | ADSP1_START, - ADSP1_CORE_ENA | ADSP1_START); - - dsp->running = true; - break; - - case SND_SOC_DAPM_PRE_PMD: - dsp->running = false; - dsp->booted = false; - - /* Halt the core */ - regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, - ADSP1_CORE_ENA | ADSP1_START, 0); - - regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_19, - ADSP1_WDMA_BUFFER_LENGTH_MASK, 0); - - regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, - ADSP1_SYS_ENA, 0); - - list_for_each_entry(ctl, &dsp->ctl_list, list) - ctl->enabled = 0; - - - wm_adsp_free_alg_regions(dsp); - break; - - default: - break; - } - - mutex_unlock(&dsp->pwr_lock); - - return 0; - -err_ena: - regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, - ADSP1_SYS_ENA, 0); -err_mutex: - mutex_unlock(&dsp->pwr_lock); - - return ret; -} -EXPORT_SYMBOL_GPL(wm_adsp1_event); - -static int wm_adsp2_ena(struct wm_adsp *dsp) -{ - unsigned int val; - int ret, count; - - switch (dsp->rev) { - case 0: - ret = regmap_update_bits_async(dsp->regmap, - dsp->base + ADSP2_CONTROL, - ADSP2_SYS_ENA, ADSP2_SYS_ENA); - if (ret != 0) - return ret; - break; - default: - break; - } - - /* Wait for the RAM to start, should be near instantaneous */ - for (count = 0; count < 10; ++count) { - ret = regmap_read(dsp->regmap, dsp->base + ADSP2_STATUS1, &val); - if (ret != 0) - return ret; - - if (val & ADSP2_RAM_RDY) - break; - - usleep_range(250, 500); - } - - if (!(val & ADSP2_RAM_RDY)) { - adsp_err(dsp, "Failed to start DSP RAM\n"); - return -EBUSY; - } - - adsp_dbg(dsp, "RAM ready after %d polls\n", count); - - return 0; -} - -static void wm_adsp2_boot_work(struct work_struct *work) -{ - struct wm_adsp *dsp = container_of(work, - struct wm_adsp, - boot_work); - int ret; - - mutex_lock(&dsp->pwr_lock); - - ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, - ADSP2_MEM_ENA, ADSP2_MEM_ENA); - if (ret != 0) - goto err_mutex; - - ret = wm_adsp2_ena(dsp); - if (ret != 0) - goto err_mem; - - ret = wm_adsp_load(dsp); - if (ret != 0) - goto err_ena; - - ret = wm_adsp2_setup_algs(dsp); - if (ret != 0) - goto err_ena; - - ret = wm_adsp_load_coeff(dsp); - if (ret != 0) - goto err_ena; - - /* Initialize caches for enabled and unset controls */ - ret = wm_coeff_init_control_caches(dsp); - if (ret != 0) - goto err_ena; - - switch (dsp->rev) { - case 0: - /* Turn DSP back off until we are ready to run */ - ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, - ADSP2_SYS_ENA, 0); - if (ret != 0) - goto err_ena; - break; - default: - break; - } - - dsp->booted = true; - - mutex_unlock(&dsp->pwr_lock); - - return; - -err_ena: - regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, - ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0); -err_mem: - regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, - ADSP2_MEM_ENA, 0); -err_mutex: - mutex_unlock(&dsp->pwr_lock); -} - -static int wm_halo_set_rate_block(struct wm_adsp *dsp, - unsigned int rate_base, - unsigned int n_rates, - const u8 *rate_cache) -{ - unsigned int addr = dsp->base + rate_base, val; - int ret, i; - - for (i = 0; i < n_rates; ++i) { - val = rate_cache[i] << HALO_DSP_RATE_SHIFT; - - ret = regmap_update_bits(dsp->regmap, - addr + (i * 8), - HALO_DSP_RATE_MASK, - val); - if (ret) { - adsp_err(dsp, "Failed to set rate: %d\n", ret); - return ret; - } - - adsp_dbg(dsp, "Set rate %d to 0x%x\n", i, val); - } - - return 0; -} - -static int wm_halo_clear_stream_arb(struct wm_adsp *dsp) -{ - struct regmap *regmap = dsp->regmap; - unsigned int dspbase = dsp->base, reg; - u32 values[3] = {0, 0, 0}; - int ret; - - /* disable stream arbiter masters */ - for (reg = dspbase + HALO_STREAM_ARB_MSTR0_CONFIG_0; - reg <= dspbase + HALO_STREAM_ARB_MSTR5_CONFIG_0; - reg += 0x10) { - ret = regmap_update_bits(regmap, reg, - HALO_STREAM_ARB_MSTR_EN_MASK, 0); - if (ret) - goto error; - } - - /* clear stream arbiter masters */ - for (reg = dspbase + HALO_STREAM_ARB_MSTR0_CONFIG_0; - reg <= dspbase + HALO_STREAM_ARB_MSTR5_CONFIG_0; - reg += 0x10) { - ret = regmap_bulk_write(regmap, reg, values, 3); - if (ret) - goto error; - } - - /* clear stream arbiter channel configs */ - for (reg = dspbase + HALO_STREAM_ARB_TX1_CONFIG_0; - reg <= dspbase + HALO_STREAM_ARB_RX8_CONFIG_0; - reg += 0x8) { - ret = regmap_write(regmap, reg, - HALO_STREAM_ARB_MSTR_SEL_DEFAULT); - if (ret) - goto error; - } - - /* clear stream arbiter interrupt registers */ - values[0] = HALO_STREAM_ARB_MSTR_SEL_DEFAULT; - for (reg = dspbase + HALO_STREAM_ARB_IRQ0_CONFIG_0; - reg <= dspbase + HALO_STREAM_ARB_IRQ7_CONFIG_1; - reg += 0x10) { - ret = regmap_bulk_write(regmap, reg, values, 2); - if (ret) - goto error; - } - return 0; - -error: - adsp_err(dsp, - "Error while clearing stream arbiter config (reg 0x%x): %d\n", - reg, ret); - return ret; -} - -static int wm_halo_configure_mpu(struct wm_adsp *dsp) -{ - struct regmap *regmap = dsp->regmap; - int i = 0, len = 0, ret; - unsigned int sysinfo_base = dsp->base_sysinfo, dsp_base = dsp->base; - unsigned int xm_sz, xm_bank_sz, ym_sz, ym_bank_sz; - unsigned int xm_acc_cfg, ym_acc_cfg; - unsigned int lock_cfg; - - ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_XM_BANK_SIZE, - &xm_bank_sz); - if (ret) { - adsp_err(dsp, "Failed to read XM bank size.\n"); - goto err; - } - - if (!xm_bank_sz) { - adsp_err(dsp, "Failed to configure MPU (XM_BANK_SIZE = 0)\n"); - goto err; - } - - ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_YM_BANK_SIZE, - &ym_bank_sz); - if (ret) { - adsp_err(dsp, "Failed to read YM bank size.\n"); - goto err; - } - - if (!ym_bank_sz) { - adsp_err(dsp, "Failed to configure MPU (YM_BANK_SIZE = 0)\n"); - goto err; - } - - ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_XM_SRAM_SIZE, - &xm_sz); - if (ret) { - adsp_err(dsp, "Failed to read XM size.\n"); - goto err; - } - - ret = regmap_read(regmap, sysinfo_base + HALO_SYS_INFO_YM_SRAM_SIZE, - &ym_sz); - if (ret) { - adsp_err(dsp, "Failed to read YM size.\n"); - goto err; - } - - adsp_dbg(dsp, - "XM size 0x%x XM bank size 0x%x YM size 0x%x YM bank size 0x%x\n", - xm_sz, xm_bank_sz, ym_sz, ym_bank_sz); - - /* calculate amount of banks to unlock */ - xm_acc_cfg = (1 << (xm_sz / xm_bank_sz)) - 1; - ym_acc_cfg = (1 << (ym_sz / ym_bank_sz)) - 1; - - /* unlock MPU */ - ret = regmap_write(regmap, dsp_base + HALO_MPU_LOCK_CONFIG, - HALO_MPU_UNLOCK_CODE_0); - if (ret) { - adsp_err(dsp, "Error while unlocking MPU: %d\n", ret); - goto err; - } - - ret = regmap_write(regmap, dsp_base + HALO_MPU_LOCK_CONFIG, - HALO_MPU_UNLOCK_CODE_1); - if (ret) { - adsp_err(dsp, "Error while unlocking MPU: %d\n", ret); - goto err; - } - - adsp_dbg(dsp, "Unlocking XM (cfg: %x) and YM (cfg: %x)", - xm_acc_cfg, ym_acc_cfg); - - /* unlock XMEM and YMEM */ - ret = regmap_write(regmap, dsp_base + HALO_MPU_XMEM_ACCESS_0, - xm_acc_cfg); - if (ret) - goto err; - - ret = regmap_write(regmap, dsp_base + HALO_MPU_YMEM_ACCESS_0, - ym_acc_cfg); - if (ret) - goto err; - - len = sizeof(halo_mpu_access) / sizeof(halo_mpu_access[0]); - lock_cfg = (dsp->unlock_all) ? 0xFFFFFFFF : 0; - /* configure all other banks */ - for (i = 0; i < len; i++) { /* TODO: think if can be done without LUT */ - ret = regmap_write(regmap, dsp_base + halo_mpu_access[i], - lock_cfg); - if (ret) - goto err; - } - - /* lock MPU */ - ret = regmap_write(regmap, dsp_base + HALO_MPU_LOCK_CONFIG, 0); - if (ret) - adsp_err(dsp, "Error while locking MPU: %d\n", ret); - -err: - return ret; -} - -static void wm_halo_boot_work(struct work_struct *work) -{ - struct wm_adsp *dsp = container_of(work, - struct wm_adsp, - boot_work); - int ret; - - mutex_lock(&dsp->pwr_lock); - - ret = wm_adsp_load(dsp); - if (ret != 0) - goto err; - - switch (dsp->fw_ver) { - case 1: - case 2: - ret = wm_adsp2_setup_algs(dsp); - if (ret != 0) - goto err; - break; - default: - ret = wm_halo_setup_algs(dsp); - if (ret != 0) - goto err; - break; - } - - ret = wm_adsp_load_coeff(dsp); - if (ret != 0) - goto err; - - /* Initialize caches for enabled and unset controls */ - ret = wm_coeff_init_control_caches(dsp); - if (ret != 0) - goto err; - - dsp->booted = true; - - mutex_unlock(&dsp->pwr_lock); - - return; - -err: - regmap_update_bits(dsp->regmap, dsp->base + HALO_CCM_CORE_CONTROL, - HALO_CORE_EN, 0); - mutex_unlock(&dsp->pwr_lock); -} - -static void wm_adsp2_set_dspclk(struct wm_adsp *dsp, unsigned int freq) -{ - int ret; - - switch (dsp->rev) { - case 0: - ret = regmap_update_bits_async(dsp->regmap, - dsp->base + ADSP2_CLOCKING, - ADSP2_CLK_SEL_MASK, - freq << ADSP2_CLK_SEL_SHIFT); - if (ret) { - adsp_err(dsp, "Failed to set clock rate: %d\n", ret); - return; - } - break; - default: - /* clock is handled by parent codec driver */ - break; - } -} - -int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = dsp->preloaded; - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp2_preloader_get); - -int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - char preload[32]; - - snprintf(preload, ARRAY_SIZE(preload), "DSP%u Preload", mc->shift); - - dsp->preloaded = ucontrol->value.integer.value[0]; - - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_force_enable_pin(dapm, preload); - else - snd_soc_dapm_disable_pin(dapm, preload); - - snd_soc_dapm_sync(dapm); - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put); - -static void wm_adsp_stop_watchdog(struct wm_adsp *dsp) -{ - switch (dsp->rev) { - case 0: - case 1: - return; - default: - regmap_update_bits(dsp->regmap, dsp->base + ADSP2_WATCHDOG, - ADSP2_WDT_ENA_MASK, 0); - } -} - -int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event, - unsigned int freq) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); - struct wm_adsp *dsp = &dsps[w->shift]; - struct wm_coeff_ctl *ctl; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wm_adsp2_set_dspclk(dsp, freq); - queue_work(system_unbound_wq, &dsp->boot_work); - break; - case SND_SOC_DAPM_PRE_PMD: - mutex_lock(&dsp->pwr_lock); - - wm_adsp_debugfs_clear(dsp); - - dsp->fw_id = 0; - dsp->fw_id_version = 0; - - dsp->booted = false; - - regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, - ADSP2_MEM_ENA, 0); - - list_for_each_entry(ctl, &dsp->ctl_list, list) - ctl->enabled = 0; - - wm_adsp_free_alg_regions(dsp); - - mutex_unlock(&dsp->pwr_lock); - - adsp_dbg(dsp, "Shutdown complete\n"); - break; - default: - break; - } - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp2_early_event); - -int wm_halo_early_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); - struct wm_adsp *dsp = &dsps[w->shift]; - struct wm_coeff_ctl *ctl; - int ret; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = regmap_update_bits(dsp->regmap, - dsp->base + HALO_CCM_CORE_CONTROL, - HALO_CORE_RESET, HALO_CORE_RESET); - if (ret != 0) { - adsp_err(dsp, "Error while resetting core: %d\n", ret); - return ret; - } - - queue_work(system_unbound_wq, &dsp->boot_work); - break; - case SND_SOC_DAPM_PRE_PMD: - mutex_lock(&dsp->pwr_lock); - - wm_adsp_debugfs_clear(dsp); - - dsp->fw_id = 0; - dsp->fw_id_version = 0; - - dsp->booted = false; - - list_for_each_entry(ctl, &dsp->ctl_list, list) - ctl->enabled = 0; - - wm_adsp_free_alg_regions(dsp); - - mutex_unlock(&dsp->pwr_lock); - - adsp_dbg(dsp, "Shutdown complete\n"); - break; - default: - break; - } - - return 0; -} -EXPORT_SYMBOL_GPL(wm_halo_early_event); - -int wm_adsp2_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); - struct wm_adsp *dsp = &dsps[w->shift]; - int ret; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - flush_work(&dsp->boot_work); - - mutex_lock(&dsp->pwr_lock); - - if (!dsp->booted) { - ret = -EIO; - goto err; - } - - ret = wm_adsp2_ena(dsp); - if (ret != 0) - goto err; - - /* Sync set controls */ - ret = wm_coeff_sync_controls(dsp); - if (ret != 0) - goto err; - - wm_adsp2_lock(dsp, dsp->lock_regions); - - ret = regmap_update_bits(dsp->regmap, - dsp->base + ADSP2_CONTROL, - ADSP2_CORE_ENA | ADSP2_START, - ADSP2_CORE_ENA | ADSP2_START); - if (ret != 0) - goto err; - - if (wm_adsp_fw[dsp->fw].num_caps != 0) { - ret = wm_adsp_buffer_init(dsp); - if (ret < 0) - goto err; - } - - dsp->running = true; - - mutex_unlock(&dsp->pwr_lock); - - break; - - case SND_SOC_DAPM_PRE_PMD: - /* Tell the firmware to cleanup */ - wm_adsp_signal_event_controls(dsp, WM_ADSP_FW_EVENT_SHUTDOWN); - - wm_adsp_stop_watchdog(dsp); - - /* Log firmware state, it can be useful for analysis */ - switch (dsp->rev) { - case 0: - wm_adsp2_show_fw_status(dsp); - break; - default: - wm_adsp2v2_show_fw_status(dsp); - break; - } - - mutex_lock(&dsp->pwr_lock); - - dsp->running = false; - - regmap_update_bits(dsp->regmap, - dsp->base + ADSP2_CONTROL, - ADSP2_CORE_ENA | ADSP2_START, 0); - - /* Make sure DMAs are quiesced */ - switch (dsp->rev) { - case 0: - regmap_write(dsp->regmap, - dsp->base + ADSP2_RDMA_CONFIG_1, 0); - regmap_write(dsp->regmap, - dsp->base + ADSP2_WDMA_CONFIG_1, 0); - regmap_write(dsp->regmap, - dsp->base + ADSP2_WDMA_CONFIG_2, 0); - - regmap_update_bits(dsp->regmap, - dsp->base + ADSP2_CONTROL, - ADSP2_SYS_ENA, 0); - break; - default: - regmap_write(dsp->regmap, - dsp->base + ADSP2_RDMA_CONFIG_1, 0); - regmap_write(dsp->regmap, - dsp->base + ADSP2_WDMA_CONFIG_1, 0); - regmap_write(dsp->regmap, - dsp->base + ADSP2V2_WDMA_CONFIG_2, 0); - break; - } - - if (wm_adsp_fw[dsp->fw].num_caps != 0) - wm_adsp_buffer_free(dsp); - - mutex_unlock(&dsp->pwr_lock); - - adsp_dbg(dsp, "Execution stopped\n"); - break; - - default: - break; - } - - return 0; -err: - regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, - ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0); - mutex_unlock(&dsp->pwr_lock); - return ret; -} -EXPORT_SYMBOL_GPL(wm_adsp2_event); - -int wm_halo_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); - struct wm_adsp *dsp = &dsps[w->shift]; - int ret; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - flush_work(&dsp->boot_work); - - mutex_lock(&dsp->pwr_lock); - - if (!dsp->booted) { - ret = -EIO; - goto err; - } - wm_halo_apply_calibration(w); - /* Sync set controls */ - ret = wm_coeff_sync_controls(dsp); - if (ret != 0) - goto err; - - //wm_halo_apply_calibration(w); - - adsp_dbg(dsp, "Setting RX rates.\n"); - ret = wm_halo_set_rate_block(dsp, HALO_SAMPLE_RATE_RX1, - dsp->n_rx_rates, dsp->rx_rate_cache); - if (ret) { - adsp_err(dsp, "Failed to set RX rates.\n"); - goto err; - } - - adsp_dbg(dsp, "Setting TX rates.\n"); - ret = wm_halo_set_rate_block(dsp, HALO_SAMPLE_RATE_TX1, - dsp->n_tx_rates, dsp->tx_rate_cache); - if (ret) { - adsp_err(dsp, "Failed to set TX rates.\n"); - goto err; - } - - ret = wm_halo_clear_stream_arb(dsp); - if (ret != 0) - goto err; - - /* disable NMI */ - ret = regmap_write(dsp->regmap, dsp->base + - HALO_INTP_CTL_NMI_CONTROL, 0); - if (ret != 0) { - adsp_err(dsp, "Error while disabling NMI: %d\n", ret); - goto err; - } - - ret = wm_halo_configure_mpu(dsp); - if (ret != 0) - goto err; - - ret = regmap_update_bits(dsp->regmap, - dsp->base + HALO_CCM_CORE_CONTROL, - HALO_CORE_EN, HALO_CORE_EN); - - if (ret != 0) - goto err; - - if (wm_adsp_fw[dsp->fw].num_caps != 0) { - ret = wm_adsp_buffer_init(dsp); - if (ret < 0) - goto err; - } - - dsp->running = true; - - mutex_unlock(&dsp->pwr_lock); - - break; - case SND_SOC_DAPM_PRE_PMD: - /* Tell the firmware to cleanup */ - wm_adsp_signal_event_controls(dsp, WM_ADSP_FW_EVENT_SHUTDOWN); - - /* Log firmware state, it can be useful for analysis */ - wm_halo_show_fw_status(dsp); - - mutex_lock(&dsp->pwr_lock); - - dsp->running = false; - - regmap_update_bits(dsp->regmap, - dsp->base + HALO_CCM_CORE_CONTROL, - HALO_CORE_EN, 0); - - wm_halo_clear_stream_arb(dsp); - - if (wm_adsp_fw[dsp->fw].num_caps != 0) - wm_adsp_buffer_free(dsp); - - mutex_unlock(&dsp->pwr_lock); - - adsp_info(dsp, "Execution stopped\n"); - break; - default: - break; - } - - return 0; -err: - mutex_unlock(&dsp->pwr_lock); - regmap_update_bits(dsp->regmap, dsp->base + HALO_CCM_CORE_CONTROL, - HALO_CORE_EN, 0); - return ret; -} -EXPORT_SYMBOL_GPL(wm_halo_event); - -static int wm_coeff_k_put(struct snd_kcontrol *kctl, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - char *p = ucontrol->value.bytes.data; - int ret = 0; - - if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { - ret = 0; - } else - memcpy(ctl->cache, p, ctl->len); - - ctl->set = 1; - ret = wm_coeff_write_control(ctl, p, ctl->len); - - - return ret; -} -static int wm_coeff_k_get(struct snd_kcontrol *kctl, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_bytes_ext *bytes_ext = - (struct soc_bytes_ext *)kctl->private_value; - struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); - char *p = ucontrol->value.bytes.data; - int ret = 0; - - if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { - ret = wm_coeff_read_control(ctl, p, ctl->len); - } else { - ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); - memcpy(p, ctl->cache, ctl->len); - } - - return ret; -} -static int wm_adsp_k_ctl_put(struct wm_adsp *dsp, const char *name, int value) -{ - struct snd_kcontrol *kctl = NULL; - struct snd_ctl_elem_value ucontrol; - struct snd_soc_card *card = dsp->codec->component.card; - - kctl = snd_soc_card_get_kcontrol(card, name); - if (kctl == NULL) { - adsp_warn(dsp, "%s: %s isn't found\n", __func__, name); - return -1; - } - - adsp_dbg(dsp, "%s: %s:0x%x\n", __func__, kctl->id.name, value); - value = cpu_to_be32(value); - memcpy((char *)ucontrol.value.bytes.data, (char *)&value, sizeof(value)); - wm_coeff_k_put(kctl, &ucontrol); - - return 0; -} - -static int wm_adsp_k_ctl_get(struct wm_adsp *dsp, const char *name) -{ - struct snd_kcontrol *kctl = NULL; - struct snd_ctl_elem_value ucontrol; - struct snd_soc_card *card = dsp->codec->component.card; - - int value = 0; - - kctl = snd_soc_card_get_kcontrol(card, name); - if (kctl == NULL) { - adsp_warn(dsp, "%s: %s isn't found\n", __func__, name); - return -1; - } - - wm_coeff_k_get(kctl, &ucontrol); - memcpy((char *)&value, (char *)ucontrol.value.bytes.data, sizeof(value)); - value = be32_to_cpu(value); - - adsp_dbg(dsp, "%s: %s:0x%x\n", __func__, kctl->id.name, value); - - return 0; -} - -static int wm_halo_apply_calibration(struct snd_soc_dapm_widget *w) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); - struct wm_adsp *dsp = &dsps[w->shift]; - - switch(dsp->fw) { - case WM_ADSP_FW_CALIB: - adsp_warn(dsp, "Set ambient %d, only for Z Diagnostic\n", dsp->ambient); - wm_adsp_k_ctl_put(dsp, "DSP1X Diag Z cd CAL_AMBIENT", dsp->ambient); - break; - case WM_ADSP_FW_DIAG: - adsp_warn(dsp, "Set ambient %d, only for Diagnostic\n", dsp->ambient); - wm_adsp_k_ctl_put(dsp, "DSP1X Diag cd CAL_AMBIENT", dsp->ambient); - break; - case WM_ADSP_FW_SPK_PROT: - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd CAL_R", dsp->cal_z); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd CAL_STATUS", dsp->cal_status); - wm_adsp_k_ctl_put(dsp, "DSP1X Protection cd CAL_CHECKSUM", dsp->cal_chksum); - wm_adsp_k_ctl_get(dsp, "DSP1X Protection cd CAL_R"); - wm_adsp_k_ctl_get(dsp, "DSP1X Protection cd CAL_STATUS"); - wm_adsp_k_ctl_get(dsp, "DSP1X Protection cd CAL_CHECKSUM"); - break; - default: - break; - } - - adsp_warn(dsp, "Do thing'\n"); - return 0; -} - - -int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - char preload[32]; - - snprintf(preload, ARRAY_SIZE(preload), "DSP%d Preload", dsp->num); - snd_soc_dapm_disable_pin(dapm, preload); - - wm_adsp2_init_debugfs(dsp, codec); - - dsp->codec = codec; - - snd_soc_add_codec_controls(codec, - wm_adsp_cal_controls, - ARRAY_SIZE(wm_adsp_cal_controls)); - - return snd_soc_add_codec_controls(codec, - &wm_adsp_fw_controls[dsp->num - 1], - 1); -} -EXPORT_SYMBOL_GPL(wm_adsp2_codec_probe); - -int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec) -{ - wm_adsp2_cleanup_debugfs(dsp); - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp2_codec_remove); - -int wm_adsp2_init(struct wm_adsp *dsp) -{ - int ret; - - switch (dsp->rev) { - case 0: - /* - * Disable the DSP memory by default when in reset for a small - * power saving. - */ - ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, - ADSP2_MEM_ENA, 0); - if (ret) { - adsp_err(dsp, - "Failed to clear memory retention: %d\n", ret); - return ret; - } - break; - default: - break; - } - - INIT_LIST_HEAD(&dsp->alg_regions); - INIT_LIST_HEAD(&dsp->ctl_list); - INIT_WORK(&dsp->boot_work, wm_adsp2_boot_work); - - mutex_init(&dsp->pwr_lock); - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp2_init); - -int wm_halo_init(struct wm_adsp *dsp) -{ - INIT_LIST_HEAD(&dsp->alg_regions); - INIT_LIST_HEAD(&dsp->ctl_list); - INIT_WORK(&dsp->boot_work, wm_halo_boot_work); - - mutex_init(&dsp->pwr_lock); - - dsp->rx_rate_cache = kcalloc(dsp->n_rx_rates, sizeof(u8), GFP_KERNEL); - dsp->tx_rate_cache = kcalloc(dsp->n_tx_rates, sizeof(u8), GFP_KERNEL); - - dsp->ambient = AMBIENT_DEFAULT; - dsp->cal_z = CAL_R_DEFAULT; - dsp->cal_status = CAL_STATUS_DEFAULT; - dsp->cal_chksum = CAL_R_DEFAULT + CAL_STATUS_DEFAULT; - return 0; -} -EXPORT_SYMBOL_GPL(wm_halo_init); - -void wm_adsp2_remove(struct wm_adsp *dsp) -{ - struct wm_coeff_ctl *ctl; - - while (!list_empty(&dsp->ctl_list)) { - ctl = list_first_entry(&dsp->ctl_list, struct wm_coeff_ctl, - list); - list_del(&ctl->list); - wm_adsp_free_ctl_blk(ctl); - } - - kfree(dsp->rx_rate_cache); - kfree(dsp->tx_rate_cache); -} -EXPORT_SYMBOL_GPL(wm_adsp2_remove); - -static inline int wm_adsp_compr_attached(struct wm_adsp_compr *compr) -{ - return compr->buf != NULL; -} - -static int wm_adsp_compr_attach(struct wm_adsp_compr *compr) -{ - /* - * Note this will be more complex once each DSP can support multiple - * streams - */ - if (!compr->dsp->buffer) - return -EINVAL; - - compr->buf = compr->dsp->buffer; - compr->buf->compr = compr; - - return 0; -} - -static void wm_adsp_compr_detach(struct wm_adsp_compr *compr) -{ - if (!compr) - return; - - /* Wake the poll so it can see buffer is no longer attached */ - if (compr->stream) - snd_compr_fragment_elapsed(compr->stream); - - if (wm_adsp_compr_attached(compr)) { - compr->buf->compr = NULL; - compr->buf = NULL; - } -} - -int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream) -{ - struct wm_adsp_compr *compr; - int ret = 0; - - mutex_lock(&dsp->pwr_lock); - - if (wm_adsp_fw[dsp->fw].num_caps == 0) { - adsp_err(dsp, "Firmware does not support compressed API\n"); - ret = -ENXIO; - goto out; - } - - if (wm_adsp_fw[dsp->fw].compr_direction != stream->direction) { - adsp_err(dsp, "Firmware does not support stream direction\n"); - ret = -EINVAL; - goto out; - } - - if (dsp->compr) { - /* It is expect this limitation will be removed in future */ - adsp_err(dsp, "Only a single stream supported per DSP\n"); - ret = -EBUSY; - goto out; - } - - compr = kzalloc(sizeof(*compr), GFP_KERNEL); - if (!compr) { - ret = -ENOMEM; - goto out; - } - - compr->dsp = dsp; - compr->stream = stream; - - dsp->compr = compr; - - stream->runtime->private_data = compr; - -out: - mutex_unlock(&dsp->pwr_lock); - - return ret; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_open); - -int wm_adsp_compr_free(struct snd_compr_stream *stream) -{ - struct wm_adsp_compr *compr = stream->runtime->private_data; - struct wm_adsp *dsp = compr->dsp; - - mutex_lock(&dsp->pwr_lock); - - wm_adsp_compr_detach(compr); - dsp->compr = NULL; - - kfree(compr->raw_buf); - kfree(compr); - - mutex_unlock(&dsp->pwr_lock); - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_free); - -static int wm_adsp_compr_check_params(struct snd_compr_stream *stream, - struct snd_compr_params *params) -{ - struct wm_adsp_compr *compr = stream->runtime->private_data; - struct wm_adsp *dsp = compr->dsp; - const struct wm_adsp_fw_caps *caps; - const struct snd_codec_desc *desc; - int i, j; - - if (params->buffer.fragment_size < WM_ADSP_MIN_FRAGMENT_SIZE || - params->buffer.fragment_size > WM_ADSP_MAX_FRAGMENT_SIZE || - params->buffer.fragments < WM_ADSP_MIN_FRAGMENTS || - params->buffer.fragments > WM_ADSP_MAX_FRAGMENTS || - params->buffer.fragment_size % WM_ADSP_DATA_WORD_SIZE) { - adsp_err(dsp, "Invalid buffer fragsize=%d fragments=%d\n", - params->buffer.fragment_size, - params->buffer.fragments); - - return -EINVAL; - } - - for (i = 0; i < wm_adsp_fw[dsp->fw].num_caps; i++) { - caps = &wm_adsp_fw[dsp->fw].caps[i]; - desc = &caps->desc; - - if (caps->id != params->codec.id) - continue; - - if (stream->direction == SND_COMPRESS_PLAYBACK) { - if (desc->max_ch < params->codec.ch_out) - continue; - } else { - if (desc->max_ch < params->codec.ch_in) - continue; - } - - if (!(desc->formats & (1 << params->codec.format))) - continue; - - for (j = 0; j < desc->num_sample_rates; ++j) - if (desc->sample_rates[j] == params->codec.sample_rate) - return 0; - } - - adsp_err(dsp, "Invalid params id=%u ch=%u,%u rate=%u fmt=%u\n", - params->codec.id, params->codec.ch_in, params->codec.ch_out, - params->codec.sample_rate, params->codec.format); - return -EINVAL; -} - -static inline unsigned int wm_adsp_compr_frag_words(struct wm_adsp_compr *compr) -{ - return compr->size.fragment_size / WM_ADSP_DATA_WORD_SIZE; -} - -int wm_adsp_compr_set_params(struct snd_compr_stream *stream, - struct snd_compr_params *params) -{ - struct wm_adsp_compr *compr = stream->runtime->private_data; - unsigned int size; - int ret; - - ret = wm_adsp_compr_check_params(stream, params); - if (ret) - return ret; - - compr->size = params->buffer; - - adsp_dbg(compr->dsp, "fragment_size=%d fragments=%d\n", - compr->size.fragment_size, compr->size.fragments); - - size = wm_adsp_compr_frag_words(compr) * sizeof(*compr->raw_buf); - compr->raw_buf = kmalloc(size, GFP_DMA | GFP_KERNEL); - if (!compr->raw_buf) - return -ENOMEM; - - compr->sample_rate = params->codec.sample_rate; - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_set_params); - -int wm_adsp_compr_get_caps(struct snd_compr_stream *stream, - struct snd_compr_caps *caps) -{ - struct wm_adsp_compr *compr = stream->runtime->private_data; - int fw = compr->dsp->fw; - int i; - - if (wm_adsp_fw[fw].caps) { - for (i = 0; i < wm_adsp_fw[fw].num_caps; i++) - caps->codecs[i] = wm_adsp_fw[fw].caps[i].id; - - caps->num_codecs = i; - caps->direction = wm_adsp_fw[fw].compr_direction; - - caps->min_fragment_size = WM_ADSP_MIN_FRAGMENT_SIZE; - caps->max_fragment_size = WM_ADSP_MAX_FRAGMENT_SIZE; - caps->min_fragments = WM_ADSP_MIN_FRAGMENTS; - caps->max_fragments = WM_ADSP_MAX_FRAGMENTS; - } - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_get_caps); - -static int wm_adsp_read_data_block(struct wm_adsp *dsp, int mem_type, - unsigned int mem_addr, - unsigned int num_words, u32 *data) -{ - struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type); - unsigned int i, reg; - int ret; - - if (!mem) - return -EINVAL; - - reg = wm_adsp_region_to_reg(dsp, mem, mem_addr); - - ret = wm_adsp2_raw_read(MAXBULK, dsp->regmap, reg, data, - sizeof(*data) * num_words); - if (ret < 0) - return ret; - - for (i = 0; i < num_words; ++i) - data[i] = be32_to_cpu(data[i]) & 0x00ffffffu; - - return 0; -} - -static inline int wm_adsp_read_data_word(struct wm_adsp *dsp, int mem_type, - unsigned int mem_addr, u32 *data) -{ - return wm_adsp_read_data_block(dsp, mem_type, mem_addr, 1, data); -} - -static int wm_adsp_write_data_word(struct wm_adsp *dsp, int mem_type, - unsigned int mem_addr, u32 data) -{ - struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type); - unsigned int reg; - - if (!mem) - return -EINVAL; - - reg = wm_adsp_region_to_reg(dsp, mem, mem_addr); - - data = cpu_to_be32(data & 0x00ffffffu); - - return regmap_raw_write(dsp->regmap, reg, &data, sizeof(data)); -} - -static inline int wm_adsp_buffer_read(struct wm_adsp_compr_buf *buf, - unsigned int field_offset, u32 *data) -{ - return wm_adsp_read_data_word(buf->dsp, WMFW_ADSP2_XM, - buf->host_buf_ptr + field_offset, data); -} - -static inline int wm_adsp_buffer_write(struct wm_adsp_compr_buf *buf, - unsigned int field_offset, u32 data) -{ - return wm_adsp_write_data_word(buf->dsp, WMFW_ADSP2_XM, - buf->host_buf_ptr + field_offset, data); -} - -static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf) -{ - struct wm_adsp_alg_region *alg_region; - struct wm_adsp *dsp = buf->dsp; - u32 xmalg, addr, magic; - int i, ret; - - alg_region = wm_adsp_find_alg_region(dsp, WMFW_ADSP2_XM, dsp->fw_id); - xmalg = sizeof(struct wm_adsp_system_config_xm_hdr) / sizeof(__be32); - - addr = alg_region->base + xmalg + ALG_XM_FIELD(magic); - ret = wm_adsp_read_data_word(dsp, WMFW_ADSP2_XM, addr, &magic); - if (ret < 0) - return ret; - - if (magic != WM_ADSP_ALG_XM_STRUCT_MAGIC) - return -EINVAL; - - addr = alg_region->base + xmalg + ALG_XM_FIELD(host_buf_ptr); - for (i = 0; i < 5; ++i) { - ret = wm_adsp_read_data_word(dsp, WMFW_ADSP2_XM, addr, - &buf->host_buf_ptr); - if (ret < 0) - return ret; - - if (buf->host_buf_ptr) - break; - - usleep_range(1000, 2000); - } - - if (!buf->host_buf_ptr) - return -EIO; - - adsp_dbg(dsp, "host_buf_ptr=%x\n", buf->host_buf_ptr); - - return 0; -} - -static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf) -{ - const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps; - struct wm_adsp_buffer_region *region; - u32 offset = 0; - int i, ret; - - for (i = 0; i < caps->num_regions; ++i) { - region = &buf->regions[i]; - - region->offset = offset; - region->mem_type = caps->region_defs[i].mem_type; - - ret = wm_adsp_buffer_read(buf, caps->region_defs[i].base_offset, - ®ion->base_addr); - if (ret < 0) - return ret; - - ret = wm_adsp_buffer_read(buf, caps->region_defs[i].size_offset, - &offset); - if (ret < 0) - return ret; - - region->cumulative_size = offset; - - adsp_dbg(buf->dsp, - "region=%d type=%d base=%04x off=%04x size=%04x\n", - i, region->mem_type, region->base_addr, - region->offset, region->cumulative_size); - } - - return 0; -} - -static int wm_adsp_buffer_init(struct wm_adsp *dsp) -{ - struct wm_adsp_compr_buf *buf; - int ret; - - buf = kzalloc(sizeof(*buf), GFP_KERNEL); - if (!buf) - return -ENOMEM; - - buf->dsp = dsp; - buf->read_index = -1; - buf->irq_count = 0xFFFFFFFF; - - ret = wm_adsp_buffer_locate(buf); - if (ret < 0) { - adsp_err(dsp, "Failed to acquire host buffer: %d\n", ret); - goto err_buffer; - } - - buf->regions = kcalloc(wm_adsp_fw[dsp->fw].caps->num_regions, - sizeof(*buf->regions), GFP_KERNEL); - if (!buf->regions) { - ret = -ENOMEM; - goto err_buffer; - } - - ret = wm_adsp_buffer_populate(buf); - if (ret < 0) { - adsp_err(dsp, "Failed to populate host buffer: %d\n", ret); - goto err_regions; - } - - dsp->buffer = buf; - - return 0; - -err_regions: - kfree(buf->regions); -err_buffer: - kfree(buf); - return ret; -} - -static int wm_adsp_buffer_free(struct wm_adsp *dsp) -{ - if (dsp->buffer) { - wm_adsp_compr_detach(dsp->buffer->compr); - - kfree(dsp->buffer->regions); - kfree(dsp->buffer); - - dsp->buffer = NULL; - } - - return 0; -} - -int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd) -{ - struct wm_adsp_compr *compr = stream->runtime->private_data; - struct wm_adsp *dsp = compr->dsp; - int ret = 0; - - adsp_dbg(dsp, "Trigger: %d\n", cmd); - - mutex_lock(&dsp->pwr_lock); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - if (wm_adsp_compr_attached(compr)) - break; - - ret = wm_adsp_compr_attach(compr); - if (ret < 0) { - adsp_err(dsp, "Failed to link buffer and stream: %d\n", - ret); - break; - } - - /* Trigger the IRQ at one fragment of data */ - ret = wm_adsp_buffer_write(compr->buf, - HOST_BUFFER_FIELD(high_water_mark), - wm_adsp_compr_frag_words(compr)); - if (ret < 0) { - adsp_err(dsp, "Failed to set high water mark: %d\n", - ret); - break; - } - break; - case SNDRV_PCM_TRIGGER_STOP: - break; - default: - ret = -EINVAL; - break; - } - - mutex_unlock(&dsp->pwr_lock); - - return ret; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_trigger); - -static inline int wm_adsp_buffer_size(struct wm_adsp_compr_buf *buf) -{ - int last_region = wm_adsp_fw[buf->dsp->fw].caps->num_regions - 1; - - return buf->regions[last_region].cumulative_size; -} - -static int wm_adsp_buffer_update_avail(struct wm_adsp_compr_buf *buf) -{ - u32 next_read_index, next_write_index; - int write_index, read_index, avail; - int ret; - - /* Only sync read index if we haven't already read a valid index */ - if (buf->read_index < 0) { - ret = wm_adsp_buffer_read(buf, - HOST_BUFFER_FIELD(next_read_index), - &next_read_index); - if (ret < 0) - return ret; - - read_index = sign_extend32(next_read_index, 23); - - if (read_index < 0) { - adsp_dbg(buf->dsp, "Avail check on unstarted stream\n"); - return 0; - } - - buf->read_index = read_index; - } - - ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(next_write_index), - &next_write_index); - if (ret < 0) - return ret; - - write_index = sign_extend32(next_write_index, 23); - - avail = write_index - buf->read_index; - if (avail < 0) - avail += wm_adsp_buffer_size(buf); - - adsp_dbg(buf->dsp, "readindex=0x%x, writeindex=0x%x, avail=%d\n", - buf->read_index, write_index, avail * WM_ADSP_DATA_WORD_SIZE); - - buf->avail = avail; - - return 0; -} - -static int wm_adsp_buffer_get_error(struct wm_adsp_compr_buf *buf) -{ - int ret; - - ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(error), &buf->error); - if (ret < 0) { - adsp_err(buf->dsp, "Failed to check buffer error: %d\n", ret); - return ret; - } - if (buf->error != 0) { - adsp_err(buf->dsp, "Buffer error occurred: %d\n", buf->error); - return -EIO; - } - - return 0; -} - -int wm_adsp_compr_handle_irq(struct wm_adsp *dsp) -{ - struct wm_adsp_compr_buf *buf; - struct wm_adsp_compr *compr; - int ret = 0; - - mutex_lock(&dsp->pwr_lock); - - buf = dsp->buffer; - compr = dsp->compr; - - if (!buf) { - ret = -ENODEV; - goto out; - } - - adsp_dbg(dsp, "Handling buffer IRQ\n"); - - ret = wm_adsp_buffer_get_error(buf); - if (ret < 0) - goto out_notify; /* Wake poll to report error */ - - ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(irq_count), - &buf->irq_count); - if (ret < 0) { - adsp_err(dsp, "Failed to get irq_count: %d\n", ret); - goto out; - } - - ret = wm_adsp_buffer_update_avail(buf); - if (ret < 0) { - adsp_err(dsp, "Error reading avail: %d\n", ret); - goto out; - } - - if (wm_adsp_fw[dsp->fw].voice_trigger && buf->irq_count == 2) - ret = WM_ADSP_COMPR_VOICE_TRIGGER; - -out_notify: - if (compr && compr->stream) - snd_compr_fragment_elapsed(compr->stream); - -out: - mutex_unlock(&dsp->pwr_lock); - - return ret; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_handle_irq); - -static int wm_adsp_buffer_reenable_irq(struct wm_adsp_compr_buf *buf) -{ - if (buf->irq_count & 0x01) - return 0; - - adsp_dbg(buf->dsp, "Enable IRQ(0x%x) for next fragment\n", - buf->irq_count); - - buf->irq_count |= 0x01; - - return wm_adsp_buffer_write(buf, HOST_BUFFER_FIELD(irq_ack), - buf->irq_count); -} - -int wm_adsp_compr_pointer(struct snd_compr_stream *stream, - struct snd_compr_tstamp *tstamp) -{ - struct wm_adsp_compr *compr = stream->runtime->private_data; - struct wm_adsp *dsp = compr->dsp; - struct wm_adsp_compr_buf *buf; - int ret = 0; - - adsp_dbg(dsp, "Pointer request\n"); - - mutex_lock(&dsp->pwr_lock); - - buf = compr->buf; - - if (!compr->buf || compr->buf->error) { - snd_compr_stop_error(stream, SNDRV_PCM_STATE_XRUN); - ret = -EIO; - goto out; - } - - if (buf->avail < wm_adsp_compr_frag_words(compr)) { - ret = wm_adsp_buffer_update_avail(buf); - if (ret < 0) { - adsp_err(dsp, "Error reading avail: %d\n", ret); - goto out; - } - - /* - * If we really have less than 1 fragment available tell the - * DSP to inform us once a whole fragment is available. - */ - if (buf->avail < wm_adsp_compr_frag_words(compr)) { - ret = wm_adsp_buffer_get_error(buf); - if (ret < 0) { - if (compr->buf->error) - snd_compr_stop_error(stream, - SNDRV_PCM_STATE_XRUN); - goto out; - } - - ret = wm_adsp_buffer_reenable_irq(buf); - if (ret < 0) { - adsp_err(dsp, - "Failed to re-enable buffer IRQ: %d\n", - ret); - goto out; - } - } - } - - tstamp->copied_total = compr->copied_total; - tstamp->copied_total += buf->avail * WM_ADSP_DATA_WORD_SIZE; - tstamp->sampling_rate = compr->sample_rate; - -out: - mutex_unlock(&dsp->pwr_lock); - - return ret; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_pointer); - -static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target) -{ - struct wm_adsp_compr_buf *buf = compr->buf; - u8 *pack_in = (u8 *)compr->raw_buf; - u8 *pack_out = (u8 *)compr->raw_buf; - unsigned int adsp_addr; - int mem_type, nwords, max_read; - int i, j, ret; - - /* Calculate read parameters */ - for (i = 0; i < wm_adsp_fw[buf->dsp->fw].caps->num_regions; ++i) - if (buf->read_index < buf->regions[i].cumulative_size) - break; - - if (i == wm_adsp_fw[buf->dsp->fw].caps->num_regions) - return -EINVAL; - - mem_type = buf->regions[i].mem_type; - adsp_addr = buf->regions[i].base_addr + - (buf->read_index - buf->regions[i].offset); - - max_read = wm_adsp_compr_frag_words(compr); - nwords = buf->regions[i].cumulative_size - buf->read_index; - - if (nwords > target) - nwords = target; - if (nwords > buf->avail) - nwords = buf->avail; - if (nwords > max_read) - nwords = max_read; - if (!nwords) - return 0; - - /* Read data from DSP */ - ret = wm_adsp_read_data_block(buf->dsp, mem_type, adsp_addr, - nwords, compr->raw_buf); - if (ret < 0) - return ret; - - /* Remove the padding bytes from the data read from the DSP */ - for (i = 0; i < nwords; i++) { - for (j = 0; j < WM_ADSP_DATA_WORD_SIZE; j++) - *pack_out++ = *pack_in++; - - pack_in += sizeof(*(compr->raw_buf)) - WM_ADSP_DATA_WORD_SIZE; - } - - /* update read index to account for words read */ - buf->read_index += nwords; - if (buf->read_index == wm_adsp_buffer_size(buf)) - buf->read_index = 0; - - ret = wm_adsp_buffer_write(buf, HOST_BUFFER_FIELD(next_read_index), - buf->read_index); - if (ret < 0) - return ret; - - /* update avail to account for words read */ - buf->avail -= nwords; - - return nwords; -} - -static int wm_adsp_compr_read(struct wm_adsp_compr *compr, - char __user *buf, size_t count) -{ - struct wm_adsp *dsp = compr->dsp; - int ntotal = 0; - int nwords, nbytes; - - adsp_dbg(dsp, "Requested read of %zu bytes\n", count); - - if (!compr->buf || compr->buf->error) { - snd_compr_stop_error(compr->stream, SNDRV_PCM_STATE_XRUN); - return -EIO; - } - - count /= WM_ADSP_DATA_WORD_SIZE; - - do { - nwords = wm_adsp_buffer_capture_block(compr, count); - if (nwords < 0) { - adsp_err(dsp, "Failed to capture block: %d\n", nwords); - return nwords; - } - - nbytes = nwords * WM_ADSP_DATA_WORD_SIZE; - - adsp_dbg(dsp, "Read %d bytes\n", nbytes); - - if (copy_to_user(buf + ntotal, compr->raw_buf, nbytes)) { - adsp_err(dsp, "Failed to copy data to user: %d, %d\n", - ntotal, nbytes); - return -EFAULT; - } - - count -= nwords; - ntotal += nbytes; - } while (nwords > 0 && count > 0); - - compr->copied_total += ntotal; - - return ntotal; -} - -int wm_adsp_compr_copy(struct snd_compr_stream *stream, char __user *buf, - size_t count) -{ - struct wm_adsp_compr *compr = stream->runtime->private_data; - struct wm_adsp *dsp = compr->dsp; - int ret; - - mutex_lock(&dsp->pwr_lock); - - if (stream->direction == SND_COMPRESS_CAPTURE) - ret = wm_adsp_compr_read(compr, buf, count); - else - ret = -ENOTSUPP; - - mutex_unlock(&dsp->pwr_lock); - - return ret; -} -EXPORT_SYMBOL_GPL(wm_adsp_compr_copy); - -int wm_adsp2_lock(struct wm_adsp *dsp, unsigned int lock_regions) -{ - struct regmap *regmap = dsp->regmap; - unsigned int code0, code1, lock_reg; - - if (!(lock_regions & WM_ADSP2_REGION_ALL)) - return 0; - - lock_regions &= WM_ADSP2_REGION_ALL; - lock_reg = dsp->base + ADSP2_LOCK_REGION_1_LOCK_REGION_0; - - while (lock_regions) { - code0 = code1 = 0; - if (lock_regions & BIT(0)) { - code0 = ADSP2_LOCK_CODE_0; - code1 = ADSP2_LOCK_CODE_1; - } - if (lock_regions & BIT(1)) { - code0 |= ADSP2_LOCK_CODE_0 << ADSP2_LOCK_REGION_SHIFT; - code1 |= ADSP2_LOCK_CODE_1 << ADSP2_LOCK_REGION_SHIFT; - } - regmap_write(regmap, lock_reg, code0); - regmap_write(regmap, lock_reg, code1); - lock_regions >>= 2; - lock_reg += 2; - } - - return 0; -} -EXPORT_SYMBOL_GPL(wm_adsp2_lock); - -irqreturn_t wm_adsp2_bus_error(struct wm_adsp *dsp) -{ - unsigned int val; - struct regmap *regmap = dsp->regmap; - int ret = 0; - - ret = regmap_read(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL, &val); - if (ret) { - adsp_err(dsp, - "Failed to read Region Lock Ctrl register: %d\n", ret); - return IRQ_HANDLED; - } - - if (val & ADSP2_WDT_TIMEOUT_STS_MASK) { - adsp_err(dsp, "watchdog timeout error\n"); - wm_adsp_stop_watchdog(dsp); - } - - if (val & (ADSP2_SLAVE_ERR_MASK | ADSP2_REGION_LOCK_ERR_MASK)) { - if (val & ADSP2_SLAVE_ERR_MASK) - adsp_err(dsp, "bus error: slave error\n"); - else - adsp_err(dsp, "bus error: region lock error\n"); - - ret = regmap_read(regmap, dsp->base + ADSP2_BUS_ERR_ADDR, &val); - if (ret) { - adsp_err(dsp, - "Failed to read Bus Err Addr register: %d\n", - ret); - return IRQ_HANDLED; - } - - adsp_err(dsp, "bus error address = 0x%x\n", - val & ADSP2_BUS_ERR_ADDR_MASK); - - ret = regmap_read(regmap, - dsp->base + ADSP2_PMEM_ERR_ADDR_XMEM_ERR_ADDR, - &val); - if (ret) { - adsp_err(dsp, - "Failed to read Pmem Xmem Err Addr register: %d\n", - ret); - return IRQ_HANDLED; - } - - adsp_err(dsp, "xmem error address = 0x%x\n", - val & ADSP2_XMEM_ERR_ADDR_MASK); - adsp_err(dsp, "pmem error address = 0x%x\n", - (val & ADSP2_PMEM_ERR_ADDR_MASK) >> - ADSP2_PMEM_ERR_ADDR_SHIFT); - } - - regmap_update_bits(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL, - ADSP2_CTRL_ERR_EINT, ADSP2_CTRL_ERR_EINT); - - return IRQ_HANDLED; -} -EXPORT_SYMBOL_GPL(wm_adsp2_bus_error); - -static void wm_halo_dump_fault_info(struct wm_adsp *dsp, const char *region, - unsigned int addr, unsigned int status) -{ - unsigned int write = status & HALO_MPU_VIO_ERR_WR_MASK; - unsigned int type = (status & HALO_MPU_VIO_STS_MASK) >> - HALO_MPU_VIO_STS_SHIFT; - unsigned int src = (status & HALO_MPU_VIO_ERR_SRC_MASK) >> - HALO_MPU_VIO_ERR_SRC_SHIFT; - - adsp_warn(dsp, "%s: FAULT_ADDR:0x%x FAULT_STATUS:0x%x %s\n", - region, addr, status, - write ? "write" : "read"); - - switch (src) { - case 0: - adsp_warn(dsp, "%s: SRC=HALO\n", region); - break; - default: - adsp_warn(dsp, "%s: SRC=Requestor%u\n", region, src); - break; - } - - adsp_warn(dsp, "%s: %s %s %s %s %s %s\n", - region, - type & HALO_MPU_VIO_SRAM ? "SRAM" : "", - type & HALO_MPU_VIO_REG ? "REG" : "", - type & HALO_MPU_VIO_AHB ? "AHB" : "", - type & HALO_MPU_VIO_EREG ? "EREG" : "", - type & HALO_MPU_VIO_EXTERNAL_MEM ? "ExtMem" : "", - type & HALO_MPU_VIO_NON_EXIST ? "NotExist" : ""); -} - -irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp) -{ - struct regmap *regmap = dsp->regmap; - unsigned int fault[6], ahb_sts, reg; - int ret; - - mutex_lock(&dsp->pwr_lock); - - /* Ensure we log the fault even if we fail to read the fault info */ - adsp_warn(dsp, "MPU FAULT\n"); - - ret = regmap_read(regmap, dsp->base_sysinfo + HALO_AHBM_WINDOW_DEBUG_1, - &ahb_sts); - if (ret) { - adsp_warn(dsp, "Failed to read AHB DEBUG_1 (%d)\n", ret); - goto exit_unlock; - } - - adsp_warn(dsp, "AHB WINDOW: ADDR: 0x%x STATUS: 0x%x\n", - (ahb_sts & HALO_AHBM_CORE_ERR_ADDR_MASK) >> - HALO_AHBM_CORE_ERR_ADDR_SHIFT, - ahb_sts); - adsp_warn(dsp, "AHB WINDOW: %s %s %s %s\n", - (ahb_sts & HALO_AHBM_ADDR_ERR_MASK) ? "ADDR" : "", - (ahb_sts & HALO_AHBM_LOCKED_ERR_MASK) ? "LOCKED" : "", - (ahb_sts & HALO_AHBM_SIZE_ERR_MASK) ? "SIZE" : "", - (ahb_sts & HALO_AHBM_MODE_ERR_MASK) ? "MODE" : ""); - - ret = regmap_read(regmap, dsp->base_sysinfo + HALO_AHBM_WINDOW_DEBUG_0, - &ahb_sts); - if (ret) { - adsp_warn(dsp, "Failed to read AHB DEBUG_0 (%d)\n", ret); - goto exit_unlock; - } - - adsp_warn(dsp, "AHB SYS_ADDR: 0x%x\n", ahb_sts); - - ret = regmap_bulk_read(regmap, dsp->base + HALO_MPU_XM_VIO_ADDR, - fault, ARRAY_SIZE(fault)); - if (ret) { - adsp_warn(dsp, "Failed to read MPU fault info (%d)\n", ret); - goto exit_unlock; - } - - wm_halo_dump_fault_info(dsp, "XM", fault[0], fault[1]); - wm_halo_dump_fault_info(dsp, "YM", fault[2], fault[3]); - wm_halo_dump_fault_info(dsp, "PM", fault[4], fault[5]); - - /* Clear fault status */ - for (reg = HALO_MPU_XM_VIO_STATUS; reg <= HALO_MPU_PM_VIO_STATUS; - reg += 8) { - ret = regmap_write(regmap, dsp->base + reg, 0); - if (ret) - adsp_warn(dsp, "Failed to clear MPU status @0x%x (%d)\n", - reg, ret); - } - -exit_unlock: - mutex_unlock(&dsp->pwr_lock); - - return IRQ_HANDLED; -} -EXPORT_SYMBOL_GPL(wm_halo_bus_error); - -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/cs35l41/wm_adsp.h b/techpack/audio/asoc/codecs/cs35l41/wm_adsp.h deleted file mode 100755 index 25bffe45dc42..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/wm_adsp.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * wm_adsp.h -- Wolfson ADSP support - * - * Copyright 2012 Wolfson Microelectronics plc - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: Mark Brown - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __WM_ADSP_H -#define __WM_ADSP_H - -#include -#include -#include - -#include "wmfw.h" - -/* Return values for wm_adsp_compr_handle_irq */ -#define WM_ADSP_COMPR_OK 0 -#define WM_ADSP_COMPR_VOICE_TRIGGER 1 - -#define WM_ADSP2_REGION_0 BIT(0) -#define WM_ADSP2_REGION_1 BIT(1) -#define WM_ADSP2_REGION_2 BIT(2) -#define WM_ADSP2_REGION_3 BIT(3) -#define WM_ADSP2_REGION_4 BIT(4) -#define WM_ADSP2_REGION_5 BIT(5) -#define WM_ADSP2_REGION_6 BIT(6) -#define WM_ADSP2_REGION_7 BIT(7) -#define WM_ADSP2_REGION_8 BIT(8) -#define WM_ADSP2_REGION_9 BIT(9) -#define WM_ADSP2_REGION_1_9 (WM_ADSP2_REGION_1 | \ - WM_ADSP2_REGION_2 | WM_ADSP2_REGION_3 | \ - WM_ADSP2_REGION_4 | WM_ADSP2_REGION_5 | \ - WM_ADSP2_REGION_6 | WM_ADSP2_REGION_7 | \ - WM_ADSP2_REGION_8 | WM_ADSP2_REGION_9) -#define WM_ADSP2_REGION_ALL (WM_ADSP2_REGION_0 | WM_ADSP2_REGION_1_9) - -struct wm_adsp_region { - int type; - unsigned int base; -}; - -struct wm_adsp_alg_region { - struct list_head list; - unsigned int alg; - int type; - unsigned int base; -}; - -struct wm_adsp_compr; -struct wm_adsp_compr_buf; - -struct wm_adsp { - const char *part; - int rev; - int num; - int type; - struct device *dev; - struct regmap *regmap; - struct snd_soc_codec *codec; - int cal_z; - int ambient; - int cal_status; - int cal_chksum; - int block_bypass; - int block_bypass_in_enh; - int base; - int base_sysinfo; - int sysclk_reg; - int sysclk_mask; - int sysclk_shift; - - struct list_head alg_regions; - - unsigned int fw_id; - unsigned int fw_id_version; - unsigned int fw_vendor_id; - - const struct wm_adsp_region *mem; - int num_mems; - - int fw; - int fw_ver; - - bool preloaded; - bool booted; - bool running; - - struct list_head ctl_list; - - struct work_struct boot_work; - - struct wm_adsp_compr *compr; - struct wm_adsp_compr_buf *buffer; - - struct mutex pwr_lock; - - unsigned int lock_regions; - bool unlock_all; - - unsigned int n_rx_rates; - unsigned int n_tx_rates; - - u8 *rx_rate_cache; - u8 *tx_rate_cache; - -#ifdef CONFIG_DEBUG_FS - struct dentry *debugfs_root; - char *wmfw_file_name; - char *bin_file_name; -#endif -}; - -#define WM_ADSP1(wname, num) \ - SND_SOC_DAPM_PGA_E(wname, SND_SOC_NOPM, num, 0, NULL, 0, \ - wm_adsp1_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD) - -#define WM_ADSP2_PRELOAD_SWITCH(wname, num) \ - SOC_SINGLE_EXT(wname " Preload Switch", SND_SOC_NOPM, num, 1, 0, \ - wm_adsp2_preloader_get, wm_adsp2_preloader_put) - -#define WM_ADSP2(wname, num, event_fn) \ - SND_SOC_DAPM_SPK(wname " Preload", NULL), \ -{ .id = snd_soc_dapm_supply, .name = wname " Preloader", \ - .reg = SND_SOC_NOPM, .shift = num, .event = event_fn, \ - .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \ - .subseq = 100, /* Ensure we run after SYSCLK supply widget */ }, \ -{ .id = snd_soc_dapm_out_drv, .name = wname, \ - .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp2_event, \ - .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD } - -#define WM_HALO(wname, num, event_fn) \ - SND_SOC_DAPM_SPK(wname " Preload", NULL), \ -{ .id = snd_soc_dapm_supply, .name = wname " Preloader", \ - .reg = SND_SOC_NOPM, .shift = num, .event = event_fn, \ - .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \ - .subseq = 100, /* Ensure we run after SYSCLK supply widget */ }, \ -{ .id = snd_soc_dapm_out_drv, .name = wname, \ - .reg = SND_SOC_NOPM, .shift = num, .event = wm_halo_event, \ - .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD } - -extern const struct snd_kcontrol_new wm_adsp_fw_controls[]; - -int wm_adsp1_init(struct wm_adsp *dsp); -int wm_adsp2_init(struct wm_adsp *dsp); -void wm_adsp2_remove(struct wm_adsp *dsp); -int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec); -int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec); -int wm_halo_init(struct wm_adsp *dsp); -int wm_adsp1_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event); - -int wm_halo_set_clocking(struct wm_adsp *dsp, unsigned int freq, - struct mutex *rate_lock); - -int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event, - unsigned int freq); - -int wm_adsp2_lock(struct wm_adsp *adsp, unsigned int regions); -irqreturn_t wm_adsp2_bus_error(struct wm_adsp *adsp); -irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp); - -int wm_adsp2_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event); - -int wm_halo_early_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event); -int wm_halo_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event); - -int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - -int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream); -int wm_adsp_compr_free(struct snd_compr_stream *stream); -int wm_adsp_compr_set_params(struct snd_compr_stream *stream, - struct snd_compr_params *params); -int wm_adsp_compr_get_caps(struct snd_compr_stream *stream, - struct snd_compr_caps *caps); -int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd); -int wm_adsp_compr_handle_irq(struct wm_adsp *dsp); -int wm_adsp_compr_pointer(struct snd_compr_stream *stream, - struct snd_compr_tstamp *tstamp); -int wm_adsp_compr_copy(struct snd_compr_stream *stream, - char __user *buf, size_t count); - -#endif diff --git a/techpack/audio/asoc/codecs/cs35l41/wmfw.h b/techpack/audio/asoc/codecs/cs35l41/wmfw.h deleted file mode 100755 index 8f712f5972d1..000000000000 --- a/techpack/audio/asoc/codecs/cs35l41/wmfw.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * wmfw.h - Wolfson firmware format information - * - * Copyright 2012 Wolfson Microelectronics plc - * Copyright (C) 2019 XiaoMi, Inc. - * - * Author: Mark Brown - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __WMFW_H -#define __WMFW_H - -#include - -#define WMFW_MAX_ALG_NAME 256 -#define WMFW_MAX_ALG_DESCR_NAME 256 - -#define WMFW_MAX_COEFF_NAME 256 -#define WMFW_MAX_COEFF_DESCR_NAME 256 - -#define WMFW_CTL_FLAG_SYS 0x8000 -#define WMFW_CTL_FLAG_VOLATILE 0x0004 -#define WMFW_CTL_FLAG_WRITEABLE 0x0002 -#define WMFW_CTL_FLAG_READABLE 0x0001 - -/* Non-ALSA coefficient types start at 0x1000 */ -#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */ -#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */ - -struct wmfw_header { - char magic[4]; - __le32 len; - __le16 rev; - u8 core; - u8 ver; -} __packed; - -struct wmfw_footer { - __le64 timestamp; - __le32 checksum; -} __packed; - -struct wmfw_adsp1_sizes { - __le32 dm; - __le32 pm; - __le32 zm; -} __packed; - -struct wmfw_adsp2_sizes { - __le32 xm; - __le32 ym; - __le32 pm; - __le32 zm; -} __packed; - -struct wmfw_region { - union { - __be32 type; - __le32 offset; - }; - __le32 len; - u8 data[]; -} __packed; - -struct wmfw_id_hdr { - __be32 core_id; - __be32 core_rev; - __be32 id; - __be32 ver; -} __packed; - -struct wmfw_adsp1_id_hdr { - struct wmfw_id_hdr fw; - __be32 zm; - __be32 dm; - __be32 n_algs; -} __packed; - -struct wmfw_adsp2_id_hdr { - struct wmfw_id_hdr fw; - __be32 zm; - __be32 xm; - __be32 ym; - __be32 n_algs; -} __packed; - -struct wmfw_halo_fwid_hdr { - __be32 core_id; - __be32 block_rev; - __be32 vendor_id; - __be32 id; - __be32 ver; -} __packed; - -struct wmfw_halo_id_hdr { - struct wmfw_halo_fwid_hdr fw; - __be32 xm_base; - __be32 xm_size; - __be32 ym_base; - __be32 ym_size; - __be32 n_algs; -} __packed; - -struct wmfw_alg_hdr { - __be32 id; - __be32 ver; -} __packed; - -struct wmfw_adsp1_alg_hdr { - struct wmfw_alg_hdr alg; - __be32 zm; - __be32 dm; -} __packed; - -struct wmfw_adsp2_alg_hdr { - struct wmfw_alg_hdr alg; - __be32 zm; - __be32 xm; - __be32 ym; -} __packed; - -struct wmfw_halo_alg_hdr { - struct wmfw_alg_hdr alg; - __be32 xm_base; - __be32 xm_size; - __be32 ym_base; - __be32 ym_size; -} __packed; - -struct wmfw_adsp_alg_data { - __le32 id; - u8 name[WMFW_MAX_ALG_NAME]; - u8 descr[WMFW_MAX_ALG_DESCR_NAME]; - __le32 ncoeff; - u8 data[]; -} __packed; - -struct wmfw_adsp_coeff_data { - struct { - __le16 offset; - __le16 type; - __le32 size; - } hdr; - u8 name[WMFW_MAX_COEFF_NAME]; - u8 descr[WMFW_MAX_COEFF_DESCR_NAME]; - __le16 ctl_type; - __le16 flags; - __le32 len; - u8 data[]; -} __packed; - -struct wmfw_coeff_hdr { - u8 magic[4]; - __le32 len; - union { - __be32 rev; - __le32 ver; - }; - union { - __be32 core; - __le32 core_ver; - }; - u8 data[]; -} __packed; - -struct wmfw_coeff_item { - __le16 offset; - __le16 type; - __le32 id; - __le32 ver; - __le32 sr; - __le32 len; - u8 data[]; -} __packed; - -#define WMFW_ADSP1 1 -#define WMFW_ADSP2 2 -#define WMFW_HALO 4 - -#define WMFW_ABSOLUTE 0xf0 -#define WMFW_ALGORITHM_DATA 0xf2 -#define WMFW_NAME_TEXT 0xfe -#define WMFW_INFO_TEXT 0xff - -#define WMFW_ADSP1_PM 2 -#define WMFW_ADSP1_DM 3 -#define WMFW_ADSP1_ZM 4 - -#define WMFW_ADSP2_PM 2 -#define WMFW_ADSP2_ZM 4 -#define WMFW_ADSP2_XM 5 -#define WMFW_ADSP2_YM 6 - -#define WMFW_HALO_PM_PACKED 0x10 -#define WMFW_HALO_XM_PACKED 0x11 -#define WMFW_HALO_YM_PACKED 0x12 - -#endif diff --git a/techpack/audio/asoc/codecs/csra66x0/Kbuild b/techpack/audio/asoc/codecs/csra66x0/Kbuild deleted file mode 100644 index 06ecab23b658..000000000000 --- a/techpack/audio/asoc/codecs/csra66x0/Kbuild +++ /dev/null @@ -1,108 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ CSRA66X0 ############ - -# for CSRA66X0 Codec -ifdef CONFIG_SND_SOC_CSRA66X0 - CSRA66X0_OBJS += csra66x0.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -#EXTRA_CFLAGS += $(INCS) -ccflags-y += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -#EXTRA_CFLAGS += -Wmaybe-uninitialized -ccflags-y += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -#EXTRA_CFLAGS += -Wheader-guard -ccflags-y += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_CSRA66X0) += csra66x0_dlkm.o -csra66x0_dlkm-y := $(CSRA66X0_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/csra66x0/csra66x0.c b/techpack/audio/asoc/codecs/csra66x0/csra66x0.c deleted file mode 100644 index 2189f9bfd873..000000000000 --- a/techpack/audio/asoc/codecs/csra66x0/csra66x0.c +++ /dev/null @@ -1,1040 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "csra66x0.h" - -/* CSRA66X0 register default values */ -static struct reg_default csra66x0_reg_defaults[] = { - {CSRA66X0_AUDIO_IF_RX_CONFIG1, 0x00}, - {CSRA66X0_AUDIO_IF_RX_CONFIG2, 0x0B}, - {CSRA66X0_AUDIO_IF_RX_CONFIG3, 0x0F}, - {CSRA66X0_AUDIO_IF_TX_EN, 0x00}, - {CSRA66X0_AUDIO_IF_TX_CONFIG1, 0x6B}, - {CSRA66X0_AUDIO_IF_TX_CONFIG2, 0x02}, - {CSRA66X0_I2C_DEVICE_ADDRESS, 0x0D}, - {CSRA66X0_CHIP_ID_FA, 0x39}, - {CSRA66X0_ROM_VER_FA, 0x08}, - {CSRA66X0_CHIP_REV_0_FA, 0x05}, - {CSRA66X0_CHIP_REV_1_FA, 0x03}, - {CSRA66X0_CH1_MIX_SEL, 0x01}, - {CSRA66X0_CH2_MIX_SEL, 0x10}, - {CSRA66X0_CH1_SAMPLE1_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE1_SCALE_1, 0x20}, - {CSRA66X0_CH1_SAMPLE3_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE3_SCALE_1, 0x20}, - {CSRA66X0_CH1_SAMPLE5_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE5_SCALE_1, 0x20}, - {CSRA66X0_CH1_SAMPLE7_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE7_SCALE_1, 0x20}, - {CSRA66X0_CH1_SAMPLE2_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE2_SCALE_1, 0x20}, - {CSRA66X0_CH1_SAMPLE4_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE4_SCALE_1, 0x20}, - {CSRA66X0_CH1_SAMPLE6_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE6_SCALE_1, 0x20}, - {CSRA66X0_CH1_SAMPLE8_SCALE_0, 0x00}, - {CSRA66X0_CH1_SAMPLE8_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE1_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE1_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE3_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE3_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE5_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE5_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE7_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE7_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE2_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE2_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE4_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE4_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE6_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE6_SCALE_1, 0x20}, - {CSRA66X0_CH2_SAMPLE8_SCALE_0, 0x00}, - {CSRA66X0_CH2_SAMPLE8_SCALE_1, 0x20}, - {CSRA66X0_VOLUME_CONFIG_FA, 0x26}, - {CSRA66X0_STARTUP_DELAY_FA, 0x00}, - {CSRA66X0_CH1_VOLUME_0_FA, 0x19}, - {CSRA66X0_CH1_VOLUME_1_FA, 0x01}, - {CSRA66X0_CH2_VOLUME_0_FA, 0x19}, - {CSRA66X0_CH2_VOLUME_1_FA, 0x01}, - {CSRA66X0_QUAD_ENC_COUNT_0_FA, 0x00}, - {CSRA66X0_QUAD_ENC_COUNT_1_FA, 0x00}, - {CSRA66X0_SOFT_CLIP_CONFIG, 0x00}, - {CSRA66X0_CH1_HARD_CLIP_THRESH, 0x00}, - {CSRA66X0_CH2_HARD_CLIP_THRESH, 0x00}, - {CSRA66X0_SOFT_CLIP_THRESH, 0x00}, - {CSRA66X0_DS_ENABLE_THRESH_0, 0x05}, - {CSRA66X0_DS_ENABLE_THRESH_1, 0x00}, - {CSRA66X0_DS_TARGET_COUNT_0, 0x00}, - {CSRA66X0_DS_TARGET_COUNT_1, 0xFF}, - {CSRA66X0_DS_TARGET_COUNT_2, 0xFF}, - {CSRA66X0_DS_DISABLE_THRESH_0, 0x0F}, - {CSRA66X0_DS_DISABLE_THRESH_1, 0x00}, - {CSRA66X0_DCA_CTRL, 0x07}, - {CSRA66X0_CH1_DCA_THRESH, 0x40}, - {CSRA66X0_CH2_DCA_THRESH, 0x40}, - {CSRA66X0_DCA_ATTACK_RATE, 0x00}, - {CSRA66X0_DCA_RELEASE_RATE, 0x00}, - {CSRA66X0_CH1_OUTPUT_INVERT_EN, 0x00}, - {CSRA66X0_CH2_OUTPUT_INVERT_EN, 0x00}, - {CSRA66X0_CH1_176P4K_DELAY, 0x00}, - {CSRA66X0_CH2_176P4K_DELAY, 0x00}, - {CSRA66X0_CH1_192K_DELAY, 0x00}, - {CSRA66X0_CH2_192K_DELAY, 0x00}, - {CSRA66X0_DEEMP_CONFIG_FA, 0x00}, - {CSRA66X0_CH1_TREBLE_GAIN_CTRL_FA, 0x00}, - {CSRA66X0_CH2_TREBLE_GAIN_CTRL_FA, 0x00}, - {CSRA66X0_CH1_TREBLE_FC_CTRL_FA, 0x00}, - {CSRA66X0_CH2_TREBLE_FC_CTRL_FA, 0x00}, - {CSRA66X0_CH1_BASS_GAIN_CTRL_FA, 0x00}, - {CSRA66X0_CH2_BASS_GAIN_CTRL_FA, 0x00}, - {CSRA66X0_CH1_BASS_FC_CTRL_FA, 0x00}, - {CSRA66X0_CH2_BASS_FC_CTRL_FA, 0x00}, - {CSRA66X0_FILTER_SEL_8K, 0x00}, - {CSRA66X0_FILTER_SEL_11P025K, 0x00}, - {CSRA66X0_FILTER_SEL_16K, 0x00}, - {CSRA66X0_FILTER_SEL_22P05K, 0x00}, - {CSRA66X0_FILTER_SEL_32K, 0x00}, - {CSRA66X0_FILTER_SEL_44P1K_48K, 0x00}, - {CSRA66X0_FILTER_SEL_88P2K_96K, 0x00}, - {CSRA66X0_FILTER_SEL_176P4K_192K, 0x00}, - /* RESERVED */ - {CSRA66X0_USER_DSP_CTRL, 0x00}, - {CSRA66X0_TEST_TONE_CTRL, 0x00}, - {CSRA66X0_TEST_TONE_FREQ_0, 0x00}, - {CSRA66X0_TEST_TONE_FREQ_1, 0x00}, - {CSRA66X0_TEST_TONE_FREQ_2, 0x00}, - {CSRA66X0_AUDIO_RATE_CTRL_FA, 0x08}, - {CSRA66X0_MODULATION_INDEX_CTRL, 0x3F}, - {CSRA66X0_MODULATION_INDEX_COUNT, 0x10}, - {CSRA66X0_MIN_MODULATION_PULSE_WIDTH, 0x7A}, - {CSRA66X0_DEAD_TIME_CTRL, 0x00}, - {CSRA66X0_DEAD_TIME_THRESHOLD_0, 0xE7}, - {CSRA66X0_DEAD_TIME_THRESHOLD_1, 0x26}, - {CSRA66X0_DEAD_TIME_THRESHOLD_2, 0x40}, - {CSRA66X0_CH1_LOW_SIDE_DLY, 0x00}, - {CSRA66X0_CH2_LOW_SIDE_DLY, 0x00}, - {CSRA66X0_SPECTRUM_CTRL, 0x00}, - /* RESERVED */ - {CSRA66X0_SPECTRUM_SPREAD_CTRL, 0x0C}, - /* RESERVED */ - {CSRA66X0_EXT_PA_PROTECT_POLARITY, 0x03}, - {CSRA66X0_TEMP0_BACKOFF_COMP_VALUE, 0x98}, - {CSRA66X0_TEMP0_SHUTDOWN_COMP_VALUE, 0xA3}, - {CSRA66X0_TEMP1_BACKOFF_COMP_VALUE, 0x98}, - {CSRA66X0_TEMP1_SHUTDOWN_COMP_VALUE, 0xA3}, - {CSRA66X0_TEMP_PROT_BACKOFF, 0x00}, - {CSRA66X0_TEMP_READ0_FA, 0x00}, - {CSRA66X0_TEMP_READ1_FA, 0x00}, - {CSRA66X0_CHIP_STATE_CTRL_FA, 0x02}, - /* RESERVED */ - {CSRA66X0_PWM_OUTPUT_CONFIG, 0x00}, - {CSRA66X0_MISC_CONTROL_STATUS_0, 0x08}, - {CSRA66X0_MISC_CONTROL_STATUS_1_FA, 0x40}, - {CSRA66X0_PIO0_SELECT, 0x00}, - {CSRA66X0_PIO1_SELECT, 0x00}, - {CSRA66X0_PIO2_SELECT, 0x00}, - {CSRA66X0_PIO3_SELECT, 0x00}, - {CSRA66X0_PIO4_SELECT, 0x00}, - {CSRA66X0_PIO5_SELECT, 0x00}, - {CSRA66X0_PIO6_SELECT, 0x00}, - {CSRA66X0_PIO7_SELECT, 0x00}, - {CSRA66X0_PIO8_SELECT, 0x00}, - {CSRA66X0_PIO_DIRN0, 0xFF}, - {CSRA66X0_PIO_DIRN1, 0x01}, - {CSRA66X0_PIO_PULL_EN0, 0xFF}, - {CSRA66X0_PIO_PULL_EN1, 0x01}, - {CSRA66X0_PIO_PULL_DIR0, 0x00}, - {CSRA66X0_PIO_PULL_DIR1, 0x00}, - {CSRA66X0_PIO_DRIVE_OUT0_FA, 0x00}, - {CSRA66X0_PIO_DRIVE_OUT1_FA, 0x00}, - {CSRA66X0_PIO_STATUS_IN0_FA, 0x00}, - {CSRA66X0_PIO_STATUS_IN1_FA, 0x00}, - /* RESERVED */ - {CSRA66X0_IRQ_OUTPUT_ENABLE, 0x00}, - {CSRA66X0_IRQ_OUTPUT_POLARITY, 0x01}, - {CSRA66X0_IRQ_OUTPUT_STATUS_FA, 0x00}, - {CSRA66X0_CLIP_DCA_STATUS_FA, 0x00}, - {CSRA66X0_CHIP_STATE_STATUS_FA, 0x02}, - {CSRA66X0_FAULT_STATUS_FA, 0x00}, - {CSRA66X0_OTP_STATUS_FA, 0x00}, - {CSRA66X0_AUDIO_IF_STATUS_FA, 0x00}, - /* RESERVED */ - {CSRA66X0_DSP_SATURATION_STATUS_FA, 0x00}, - {CSRA66X0_AUDIO_RATE_STATUS_FA, 0x00}, - /* RESERVED */ - {CSRA66X0_DISABLE_PWM_OUTPUT, 0x00}, - /* RESERVED */ - {CSRA66X0_OTP_VER_FA, 0x03}, - {CSRA66X0_RAM_VER_FA, 0x02}, - /* RESERVED */ - {CSRA66X0_AUDIO_SATURATION_FLAGS_FA, 0x00}, - {CSRA66X0_DCOFFSET_CHAN_1_01_FA, 0x00}, - {CSRA66X0_DCOFFSET_CHAN_1_02_FA, 0x00}, - {CSRA66X0_DCOFFSET_CHAN_1_03_FA, 0x00}, - {CSRA66X0_DCOFFSET_CHAN_2_01_FA, 0x00}, - {CSRA66X0_DCOFFSET_CHAN_2_02_FA, 0x00}, - {CSRA66X0_DCOFFSET_CHAN_2_03_FA, 0x00}, - {CSRA66X0_FORCED_PA_SWITCHING_CTRL, 0x90}, - {CSRA66X0_PA_FORCE_PULSE_WIDTH, 0x07}, - {CSRA66X0_PA_HIGH_MODULATION_CTRL_CH1, 0x00}, - /* RESERVED */ - {CSRA66X0_HIGH_MODULATION_THRESHOLD_LOW, 0xD4}, - {CSRA66X0_HIGH_MODULATION_THRESHOLD_HIGH, 0x78}, - /* RESERVED */ - {CSRA66X0_PA_FREEZE_CTRL, 0x00}, - {CSRA66X0_DCA_FREEZE_CTRL, 0x3C}, - /* RESERVED */ -}; - -static bool csra66x0_volatile_register(struct device *dev, unsigned int reg) -{ - switch (reg) { - case CSRA66X0_CHIP_ID_FA: - case CSRA66X0_ROM_VER_FA: - case CSRA66X0_CHIP_REV_0_FA: - case CSRA66X0_CHIP_REV_1_FA: - case CSRA66X0_TEMP_READ0_FA: - case CSRA66X0_TEMP_READ1_FA: - case CSRA66X0_MISC_CONTROL_STATUS_1_FA: - case CSRA66X0_IRQ_OUTPUT_STATUS_FA: - case CSRA66X0_CLIP_DCA_STATUS_FA: - case CSRA66X0_CHIP_STATE_STATUS_FA: - case CSRA66X0_FAULT_STATUS_FA: - case CSRA66X0_OTP_STATUS_FA: - case CSRA66X0_AUDIO_IF_STATUS_FA: - case CSRA66X0_DSP_SATURATION_STATUS_FA: - case CSRA66X0_AUDIO_RATE_STATUS_FA: - return true; - default: - return false; - } -} - -static bool csra66x0_writeable_registers(struct device *dev, unsigned int reg) -{ - if ((reg >= CSRA66X0_AUDIO_IF_RX_CONFIG1) - && (reg <= CSRA66X0_MAX_REGISTER_ADDR)) - return true; - - return false; -} - -static bool csra66x0_readable_registers(struct device *dev, unsigned int reg) -{ - if ((reg >= CSRA66X0_AUDIO_IF_RX_CONFIG1) - && (reg <= CSRA66X0_MAX_REGISTER_ADDR)) - return true; - - return false; -} - -/* codec private data */ -struct csra66x0_priv { - struct regmap *regmap; - struct snd_soc_codec *codec; - int spk_volume_ch1; - int spk_volume_ch2; - int irq; - int vreg_gpio; - u32 irq_active_low; - u32 in_cluster; - u32 is_master; -#if IS_ENABLED(CONFIG_DEBUG_FS) - struct dentry *debugfs_dir; - struct dentry *debugfs_file_wo; - struct dentry *debugfs_file_ro; -#endif /* CONFIG_DEBUG_FS */ -}; - -struct csra66x0_cluster_device { - struct csra66x0_priv *csra66x0_ptr; - const char *csra66x0_prefix; -}; - -struct csra66x0_cluster_device csra_clust_dev_tbl[] = { - {NULL, "CSRA_12"}, - {NULL, "CSRA_34"}, - {NULL, "CSRA_56"}, - {NULL, "CSRA_78"}, - {NULL, "CSRA_9A"}, - {NULL, "CSRA_BC"} -}; - -#if IS_ENABLED(CONFIG_DEBUG_FS) -static int debugfs_codec_open_op(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int debugfs_get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else { - return -EINVAL; - } - } - return 0; -} - -static ssize_t debugfs_codec_write_op(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - struct csra66x0_priv *csra66x0 = - (struct csra66x0_priv *) filp->private_data; - struct snd_soc_codec *codec = csra66x0->codec; - char lbuf[32]; - int rc; - u32 param[2]; - - if (!filp || !ppos || !ubuf) - return -EINVAL; - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - lbuf[cnt] = '\0'; - rc = debugfs_get_parameters(lbuf, param, 2); - if ((param[0] < CSRA66X0_AUDIO_IF_RX_CONFIG1) - || (param[0] > CSRA66X0_MAX_REGISTER_ADDR)) { - dev_err(codec->dev, "%s: register address 0x%04X out of range\n", - __func__, param[0]); - return -EINVAL; - } - if ((param[1] < 0) || (param[1] > 255)) { - dev_err(codec->dev, "%s: register data 0x%02X out of range\n", - __func__, param[1]); - return -EINVAL; - } - if (rc == 0) - { - rc = cnt; - dev_info(codec->dev, "%s: reg[0x%04X]=0x%02X\n", - __func__, param[0], param[1]); - snd_soc_write(codec, param[0], param[1]); - } else { - dev_err(codec->dev, "%s: write to register addr=0x%04X failed\n", - __func__, param[0]); - } - return rc; -} - -static ssize_t debugfs_csra66x0_reg_show(struct snd_soc_codec *codec, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[20]; - - if (!ubuf || !ppos || !codec || *ppos < 0) - return -EINVAL; - - for (i = ((int) *ppos + CSRA66X0_BASE); - i <= CSRA66X0_MAX_REGISTER_ADDR; i++) { - reg_val = snd_soc_read(codec, i); - len = snprintf(tmp_buf, 20, "0x%04X: 0x%02X\n", i, (reg_val & 0xFF)); - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - dev_err(codec->dev, "%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t debugfs_codec_read_op(struct file *filp, - char __user *ubuf, size_t cnt, loff_t *ppos) -{ - struct csra66x0_priv *csra66x0 = - (struct csra66x0_priv *) filp->private_data; - struct snd_soc_codec *codec = csra66x0->codec; - ssize_t ret_cnt; - - if (!filp || !ppos || !ubuf || *ppos < 0) - return -EINVAL; - ret_cnt = debugfs_csra66x0_reg_show(codec, ubuf, cnt, ppos); - return ret_cnt; -} - -static const struct file_operations debugfs_codec_ops = { - .open = debugfs_codec_open_op, - .write = debugfs_codec_write_op, - .read = debugfs_codec_read_op, -}; -#endif /* CONFIG_DEBUG_FS */ - -/* - * CSRA66X0 Controls - */ -static const DECLARE_TLV_DB_SCALE(csra66x0_volume_tlv, -9000, 25, 0); -static const DECLARE_TLV_DB_RANGE(csra66x0_bass_treble_tlv, - 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0), - 1, 15, TLV_DB_SCALE_ITEM(-1500, 100, 0), - 16, 30, TLV_DB_SCALE_ITEM(100, 100, 0) -); - -static int csra66x0_get_volume(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - unsigned int reg_l = mc->reg; - unsigned int reg_r = mc->rreg; - unsigned int val_l, val_r; - - val_l = (snd_soc_read(codec, reg_l) & 0xff) | - ((snd_soc_read(codec, - CSRA66X0_CH1_VOLUME_1_FA) & (0x01)) << 8); - val_r = (snd_soc_read(codec, reg_r) & 0xff) | - ((snd_soc_read(codec, - CSRA66X0_CH2_VOLUME_1_FA) & (0x01)) << 8); - ucontrol->value.integer.value[0] = val_l; - ucontrol->value.integer.value[1] = val_r; - return 0; -} - -static int csra66x0_set_volume(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct csra66x0_priv *csra66x0 = snd_soc_codec_get_drvdata(codec); - unsigned int reg_l = mc->reg; - unsigned int reg_r = mc->rreg; - unsigned int val_l[2]; - unsigned int val_r[2]; - - csra66x0->spk_volume_ch1 = (ucontrol->value.integer.value[0]); - csra66x0->spk_volume_ch2 = (ucontrol->value.integer.value[1]); - val_l[0] = csra66x0->spk_volume_ch1 & SPK_VOLUME_LSB_MSK; - val_l[1] = (csra66x0->spk_volume_ch1 & SPK_VOLUME_MSB_MSK) ? 1 : 0; - val_r[0] = csra66x0->spk_volume_ch2 & SPK_VOLUME_LSB_MSK; - val_r[1] = (csra66x0->spk_volume_ch2 & SPK_VOLUME_MSB_MSK) ? 1 : 0; - snd_soc_write(codec, reg_l, val_l[0]); - snd_soc_write(codec, reg_r, val_r[0]); - snd_soc_write(codec, CSRA66X0_CH1_VOLUME_1_FA, val_l[1]); - snd_soc_write(codec, CSRA66X0_CH2_VOLUME_1_FA, val_r[1]); - return 0; -} - -/* enumerated controls */ -static const char * const csra66x0_mute_output_text[] = {"PLAY", "MUTE"}; -static const char * const csra66x0_output_invert_text[] = { - "UNCHANGED", "INVERTED"}; -static const char * const csra66x0_deemp_config_text[] = { - "DISABLED", "ENABLED"}; - -SOC_ENUM_SINGLE_DECL(csra66x0_mute_output_enum, - CSRA66X0_MISC_CONTROL_STATUS_1_FA, 2, - csra66x0_mute_output_text); -SOC_ENUM_SINGLE_DECL(csra66x0_ch1_output_invert_enum, - CSRA66X0_CH1_OUTPUT_INVERT_EN, 0, - csra66x0_output_invert_text); -SOC_ENUM_SINGLE_DECL(csra66x0_ch2_output_invert_enum, - CSRA66X0_CH2_OUTPUT_INVERT_EN, 0, - csra66x0_output_invert_text); -SOC_ENUM_DOUBLE_DECL(csra66x0_deemp_config_enum, - CSRA66X0_DEEMP_CONFIG_FA, 0, 1, - csra66x0_deemp_config_text); - -static const struct snd_kcontrol_new csra66x0_snd_controls[] = { - /* volume */ - SOC_DOUBLE_R_EXT_TLV("PA VOLUME", CSRA66X0_CH1_VOLUME_0_FA, - CSRA66X0_CH2_VOLUME_0_FA, 0, 0x1C9, 0, - csra66x0_get_volume, csra66x0_set_volume, - csra66x0_volume_tlv), - - /* bass treble */ - SOC_DOUBLE_R_TLV("PA BASS GAIN", CSRA66X0_CH1_BASS_GAIN_CTRL_FA, - CSRA66X0_CH2_BASS_GAIN_CTRL_FA, 0, 0x1E, 0, - csra66x0_bass_treble_tlv), - SOC_DOUBLE_R_TLV("PA TREBLE GAIN", CSRA66X0_CH1_TREBLE_GAIN_CTRL_FA, - CSRA66X0_CH2_TREBLE_GAIN_CTRL_FA, 0, 0x1E, 0, - csra66x0_bass_treble_tlv), - SOC_DOUBLE_R("PA BASS_XOVER FREQ", CSRA66X0_CH1_BASS_FC_CTRL_FA, - CSRA66X0_CH2_BASS_FC_CTRL_FA, 0, 2, 0), - SOC_DOUBLE_R("PA TREBLE_XOVER FREQ", CSRA66X0_CH1_TREBLE_FC_CTRL_FA, - CSRA66X0_CH2_TREBLE_FC_CTRL_FA, 0, 2, 0), - - /* switch */ - SOC_ENUM("PA MUTE_OUTPUT SWITCH", csra66x0_mute_output_enum), - SOC_ENUM("PA DE-EMPHASIS SWITCH", csra66x0_deemp_config_enum), -}; - -static const struct snd_kcontrol_new csra_mix_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_soc_dapm_widget csra66x0_dapm_widgets[] = { - SND_SOC_DAPM_INPUT("IN"), - SND_SOC_DAPM_MIXER("MIXER", SND_SOC_NOPM, 0, 0, - csra_mix_switch, ARRAY_SIZE(csra_mix_switch)), - SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_PGA("PGA", CSRA66X0_CHIP_STATE_CTRL_FA, 0, 0, NULL, 0), - SND_SOC_DAPM_OUTPUT("SPKR"), - - SND_SOC_DAPM_SUPPLY("POWER", CSRA66X0_CHIP_STATE_CTRL_FA, - 1, 1, NULL, 0), -}; - -static const struct snd_soc_dapm_route csra66x0_dapm_routes[] = { - {"MIXER", "Switch", "IN"}, - {"DAC", NULL, "MIXER"}, - {"PGA", NULL, "DAC"}, - {"SPKR", NULL, "PGA"}, - {"SPKR", NULL, "POWER"}, -}; - -static int csra66x0_init(struct csra66x0_priv *csra66x0) -{ - struct snd_soc_codec *codec = csra66x0->codec; - - dev_dbg(codec->dev, "%s: initialize %s\n", - __func__, codec->component.name); - /* config */ - snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA, CONFIG_STATE); - /* settle time in HW is min. 500ms before proceeding */ - msleep(500); - - /* setup */ - snd_soc_write(codec, CSRA66X0_MISC_CONTROL_STATUS_0, 0x09); - snd_soc_write(codec, CSRA66X0_TEMP_PROT_BACKOFF, 0x0C); - snd_soc_write(codec, CSRA66X0_EXT_PA_PROTECT_POLARITY, 0x03); - snd_soc_write(codec, CSRA66X0_PWM_OUTPUT_CONFIG, 0xC8); - csra66x0->spk_volume_ch1 = SPK_VOLUME_M20DB; - csra66x0->spk_volume_ch2 = SPK_VOLUME_M20DB; - snd_soc_write(codec, CSRA66X0_CH1_VOLUME_0_FA, SPK_VOLUME_M20DB_LSB); - snd_soc_write(codec, CSRA66X0_CH2_VOLUME_0_FA, SPK_VOLUME_M20DB_LSB); - snd_soc_write(codec, CSRA66X0_CH1_VOLUME_1_FA, SPK_VOLUME_M20DB_MSB); - snd_soc_write(codec, CSRA66X0_CH2_VOLUME_1_FA, SPK_VOLUME_M20DB_MSB); - - snd_soc_write(codec, CSRA66X0_DEAD_TIME_CTRL, 0x0); - snd_soc_write(codec, CSRA66X0_DEAD_TIME_THRESHOLD_0, 0xE7); - snd_soc_write(codec, CSRA66X0_DEAD_TIME_THRESHOLD_1, 0x26); - snd_soc_write(codec, CSRA66X0_DEAD_TIME_THRESHOLD_2, 0x40); - - snd_soc_write(codec, CSRA66X0_MIN_MODULATION_PULSE_WIDTH, 0x7A); - snd_soc_write(codec, CSRA66X0_CH1_HARD_CLIP_THRESH, 0x00); - snd_soc_write(codec, CSRA66X0_CH2_HARD_CLIP_THRESH, 0x00); - - snd_soc_write(codec, CSRA66X0_CH1_DCA_THRESH, 0x40); - snd_soc_write(codec, CSRA66X0_CH2_DCA_THRESH, 0x40); - snd_soc_write(codec, CSRA66X0_DCA_ATTACK_RATE, 0x00); - snd_soc_write(codec, CSRA66X0_DCA_RELEASE_RATE, 0x00); - - if (csra66x0->irq) { - snd_soc_write(codec, CSRA66X0_PIO0_SELECT, 0x1); - if (csra66x0->irq_active_low) - snd_soc_write(codec, CSRA66X0_IRQ_OUTPUT_POLARITY, 0x0); - else - snd_soc_write(codec, CSRA66X0_IRQ_OUTPUT_POLARITY, 0x1); - - snd_soc_write(codec, CSRA66X0_IRQ_OUTPUT_ENABLE, 0x01); - } else { - snd_soc_write(codec, CSRA66X0_IRQ_OUTPUT_ENABLE, 0x00); - } - /* settle time in HW is min. 500ms before slave initializing */ - msleep(500); - return 0; -} - -static int csra66x0_reset(struct csra66x0_priv *csra66x0) -{ - struct snd_soc_codec *codec = csra66x0->codec; - u16 val; - - val = snd_soc_read(codec, CSRA66X0_FAULT_STATUS_FA); - if (val & FAULT_STATUS_INTERNAL) - dev_dbg(codec->dev, "%s: FAULT_STATUS_INTERNAL 0x%X\n", - __func__, val); - if (val & FAULT_STATUS_OTP_INTEGRITY) - dev_dbg(codec->dev, "%s: FAULT_STATUS_OTP_INTEGRITY 0x%X\n", - __func__, val); - if (val & FAULT_STATUS_PADS2) - dev_dbg(codec->dev, "%s: FAULT_STATUS_PADS2 0x%X\n", - __func__, val); - if (val & FAULT_STATUS_SMPS) - dev_dbg(codec->dev, "%s: FAULT_STATUS_SMPS 0x%X\n", - __func__, val); - if (val & FAULT_STATUS_TEMP) - dev_dbg(codec->dev, "%s: FAULT_STATUS_TEMP 0x%X\n", - __func__, val); - if (val & FAULT_STATUS_PROTECT) - dev_dbg(codec->dev, "%s: FAULT_STATUS_PROTECT 0x%X\n", - __func__, val); - - dev_dbg(codec->dev, "%s: reset %s\n", - __func__, codec->component.name); - /* clear fault state and re-init */ - snd_soc_write(codec, CSRA66X0_FAULT_STATUS_FA, 0x00); - snd_soc_write(codec, CSRA66X0_IRQ_OUTPUT_STATUS_FA, 0x00); - /* apply reset to CSRA66X0 */ - val = snd_soc_read(codec, CSRA66X0_MISC_CONTROL_STATUS_1_FA); - snd_soc_write(codec, CSRA66X0_MISC_CONTROL_STATUS_1_FA, val | 0x08); - /* wait 500ms after reset to recover CSRA66X0 */ - msleep(500); - return 0; -} - -static int csra66x0_msconfig(struct csra66x0_priv *csra66x0) -{ - struct snd_soc_codec *codec = csra66x0->codec; - - dev_dbg(codec->dev, "%s: configure %s\n", - __func__, codec->component.name); - /* config */ - snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA, - CONFIG_STATE); - /* settle time in HW is min. 500ms before proceeding */ - msleep(500); - snd_soc_write(codec, CSRA66X0_PIO7_SELECT, 0x04); - snd_soc_write(codec, CSRA66X0_PIO8_SELECT, 0x04); - if (csra66x0->is_master) { - /* Master specific config */ - snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0xFF); - snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR0, 0x80); - snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x01); - snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR1, 0x01); - } else { - /* Slave specific config */ - snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0x7F); - snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x00); - } - snd_soc_write(codec, CSRA66X0_DCA_CTRL, 0x05); - return 0; -} - -static int csra66x0_soc_probe(struct snd_soc_codec *codec) -{ - struct csra66x0_priv *csra66x0 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm; - char name[50]; - unsigned int i, max_num_cluster_devices; - - csra66x0->codec = codec; - if (csra66x0->in_cluster) { - dapm = snd_soc_codec_get_dapm(codec); - dev_dbg(codec->dev, "%s: assign prefix %s to codec device %s\n", - __func__, codec->component.name_prefix, - codec->component.name); - - /* add device to cluster table */ - max_num_cluster_devices = sizeof(csra_clust_dev_tbl)/ - sizeof(csra_clust_dev_tbl[0]); - for (i = 0; i < max_num_cluster_devices; i++) { - if (!strncmp(codec->component.name_prefix, - csra_clust_dev_tbl[i].csra66x0_prefix, - strlen( - csra_clust_dev_tbl[i].csra66x0_prefix))) { - csra_clust_dev_tbl[i].csra66x0_ptr = csra66x0; - break; - } - if (i == max_num_cluster_devices-1) - dev_warn(codec->dev, - "%s: Unknown prefix %s of cluster device %s\n", - __func__, codec->component.name_prefix, - codec->component.name); - } - - /* master slave config */ - csra66x0_msconfig(csra66x0); - if (dapm->component) { - strlcpy(name, dapm->component->name_prefix, - sizeof(name)); - strlcat(name, " IN", sizeof(name)); - snd_soc_dapm_ignore_suspend(dapm, name); - strlcpy(name, dapm->component->name_prefix, - sizeof(name)); - strlcat(name, " SPKR", sizeof(name)); - snd_soc_dapm_ignore_suspend(dapm, name); - } - } - - /* common initialization */ - csra66x0_init(csra66x0); - return 0; -} - -static int csra66x0_soc_remove(struct snd_soc_codec *codec) -{ - snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA, STDBY_STATE); - return 0; -} - -static int csra66x0_soc_suspend(struct snd_soc_codec *codec) -{ - u16 state_reg = snd_soc_read(codec, CSRA66X0_CHIP_STATE_CTRL_FA) & 0xFC; - - snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA, state_reg | - STDBY_STATE); - return 0; -} - -static int csra66x0_soc_resume(struct snd_soc_codec *codec) -{ - u16 state_reg = snd_soc_read(codec, CSRA66X0_CHIP_STATE_CTRL_FA) & 0xFC; - - snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA, state_reg | - RUN_STATE); - return 0; -} - -static struct regmap *csra66x0_get_regmap(struct device *dev) -{ - struct csra66x0_priv *csra66x0_ctrl = dev_get_drvdata(dev); - - if (!csra66x0_ctrl) - return NULL; - return csra66x0_ctrl->regmap; -} - -static struct snd_soc_codec_driver soc_codec_drv_csra66x0 = { - .probe = csra66x0_soc_probe, - .remove = csra66x0_soc_remove, - .suspend = csra66x0_soc_suspend, - .resume = csra66x0_soc_resume, - .get_regmap = csra66x0_get_regmap, - .component_driver = { - .controls = csra66x0_snd_controls, - .num_controls = ARRAY_SIZE(csra66x0_snd_controls), - .dapm_widgets = csra66x0_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(csra66x0_dapm_widgets), - .dapm_routes = csra66x0_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(csra66x0_dapm_routes), - }, -}; - -static struct regmap_config csra66x0_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = csra66x0_reg_defaults, - .num_reg_defaults = ARRAY_SIZE(csra66x0_reg_defaults), - .max_register = CSRA66X0_MAX_REGISTER_ADDR, - .volatile_reg = csra66x0_volatile_register, - .writeable_reg = csra66x0_writeable_registers, - .readable_reg = csra66x0_readable_registers, -}; - -static irqreturn_t csra66x0_irq(int irq, void *data) -{ - struct csra66x0_priv *csra66x0 = (struct csra66x0_priv *) data; - struct snd_soc_codec *codec = csra66x0->codec; - u16 val; - unsigned int i, max_num_cluster_devices; - - /* Treat interrupt before codec is initialized as spurious */ - if (codec == NULL) - return IRQ_NONE; - - dev_dbg(codec->dev, "%s: csra66x0_interrupt triggered by %s\n", - __func__, codec->component.name); - - /* fault indication */ - val = snd_soc_read(codec, CSRA66X0_IRQ_OUTPUT_STATUS_FA) & 0x1; - if (!val) - return IRQ_HANDLED; - - if (csra66x0->in_cluster) { - /* reset all slave codecs */ - max_num_cluster_devices = - sizeof(csra_clust_dev_tbl) / - sizeof(csra_clust_dev_tbl[0]); - for (i = 0; i < max_num_cluster_devices; i++) { - if (i >= codec->component.card->num_aux_devs) - break; - if (csra_clust_dev_tbl[i].csra66x0_ptr == NULL) - continue; - if (csra_clust_dev_tbl[i].csra66x0_ptr->is_master) - continue; - csra66x0_reset(csra_clust_dev_tbl[i].csra66x0_ptr); - } - /* reset all master codecs */ - for (i = 0; i < max_num_cluster_devices; i++) { - if (i >= codec->component.card->num_aux_devs) - break; - if (csra_clust_dev_tbl[i].csra66x0_ptr == NULL) - continue; - if (csra_clust_dev_tbl[i].csra66x0_ptr->is_master) - csra66x0_reset( - csra_clust_dev_tbl[i].csra66x0_ptr); - } - /* recover all codecs */ - for (i = 0; i < max_num_cluster_devices; i++) { - if (i >= codec->component.card->num_aux_devs) - break; - if (csra_clust_dev_tbl[i].csra66x0_ptr == NULL) - continue; - csra66x0_msconfig(csra_clust_dev_tbl[i].csra66x0_ptr); - csra66x0_init(csra_clust_dev_tbl[i].csra66x0_ptr); - } - } else { - csra66x0_reset(csra66x0); - csra66x0_init(csra66x0); - } - return IRQ_HANDLED; -}; - -static const struct of_device_id csra66x0_of_match[] = { - { .compatible = "qcom,csra66x0", }, - { } -}; -MODULE_DEVICE_TABLE(of, csra66x0_of_match); - -#if IS_ENABLED(CONFIG_I2C) -static int csra66x0_i2c_probe(struct i2c_client *client_i2c, - const struct i2c_device_id *id) -{ - struct csra66x0_priv *csra66x0; - int ret, irq_trigger; - char debugfs_dir_name[32]; - - csra66x0 = devm_kzalloc(&client_i2c->dev, sizeof(struct csra66x0_priv), - GFP_KERNEL); - if (csra66x0 == NULL) - return -ENOMEM; - - csra66x0->regmap = devm_regmap_init_i2c(client_i2c, - &csra66x0_regmap_config); - if (IS_ERR(csra66x0->regmap)) { - ret = PTR_ERR(csra66x0->regmap); - dev_err(&client_i2c->dev, - "%s %d: Failed to allocate register map for I2C device: %d\n", - __func__, __LINE__, ret); - return ret; - } - - i2c_set_clientdata(client_i2c, csra66x0); - - /* get data from device tree */ - if (client_i2c->dev.of_node) { - /* cluster of multiple devices */ - ret = of_property_read_u32( - client_i2c->dev.of_node, "qcom,csra-cluster", - &csra66x0->in_cluster); - if (ret) { - dev_info(&client_i2c->dev, - "%s: qcom,csra-cluster property not defined in DT\n", __func__); - csra66x0->in_cluster = 0; - } - /* master or slave device */ - ret = of_property_read_u32( - client_i2c->dev.of_node, "qcom,csra-cluster-master", - &csra66x0->is_master); - if (ret) { - dev_info(&client_i2c->dev, - "%s: qcom,csra-cluster-master property not defined in DT, slave assumed\n", - __func__); - csra66x0->is_master = 0; - } - - /* gpio setup for vreg */ - csra66x0->vreg_gpio = of_get_named_gpio(client_i2c->dev.of_node, - "qcom,csra-vreg-en-gpio", 0); - if (!gpio_is_valid(csra66x0->vreg_gpio)) { - dev_err(&client_i2c->dev, "%s: %s property is not found %d\n", - __func__, "qcom,csra-vreg-en-gpio", - csra66x0->vreg_gpio); - return -ENODEV; - } - dev_dbg(&client_i2c->dev, "%s: vreg_en gpio %d\n", __func__, - csra66x0->vreg_gpio); - ret = gpio_request(csra66x0->vreg_gpio, dev_name(&client_i2c->dev)); - if (ret) { - if (ret == -EBUSY) { - /* GPIO was already requested */ - dev_dbg(&client_i2c->dev, - "%s: gpio %d is already set\n", - __func__, csra66x0->vreg_gpio); - } else { - dev_err(&client_i2c->dev, "%s: Failed to request gpio %d, err: %d\n", - __func__, csra66x0->vreg_gpio, ret); - } - } else { - gpio_direction_output(csra66x0->vreg_gpio, 1); - gpio_set_value(csra66x0->vreg_gpio, 0); - } - - /* register interrupt handle */ - if (client_i2c->irq) { - csra66x0->irq = client_i2c->irq; - /* interrupt polarity */ - ret = of_property_read_u32( - client_i2c->dev.of_node, "irq-active-low", - &csra66x0->irq_active_low); - if (ret) { - dev_info(&client_i2c->dev, - "%s: irq-active-low property not defined in DT\n", __func__); - csra66x0->irq_active_low = 0; - } - if (csra66x0->irq_active_low) - irq_trigger = IRQF_TRIGGER_LOW; - else - irq_trigger = IRQF_TRIGGER_HIGH; - - ret = devm_request_threaded_irq(&client_i2c->dev, - csra66x0->irq, NULL, csra66x0_irq, - irq_trigger | IRQF_ONESHOT, - "csra66x0_irq", csra66x0); - if (ret) { - dev_err(&client_i2c->dev, - "%s: Failed to request IRQ %d: %d\n", - __func__, csra66x0->irq, ret); - csra66x0->irq = 0; - } - } - } - -#if IS_ENABLED(CONFIG_DEBUG_FS) - /* debugfs interface */ - snprintf(debugfs_dir_name, sizeof(debugfs_dir_name), "%s-%s", - client_i2c->name, dev_name(&client_i2c->dev)); - csra66x0->debugfs_dir = debugfs_create_dir(debugfs_dir_name, NULL); - if (!csra66x0->debugfs_dir) { - dev_dbg(&client_i2c->dev, - "%s: Failed to create /sys/kernel/debug/%s for debugfs\n", - __func__, debugfs_dir_name); - return -ENOMEM; - } - csra66x0->debugfs_file_wo = debugfs_create_file( - "write_reg_val", S_IFREG | S_IRUGO, csra66x0->debugfs_dir, - (void *) csra66x0, - &debugfs_codec_ops); - if (!csra66x0->debugfs_file_wo) { - dev_dbg(&client_i2c->dev, - "%s: Failed to create /sys/kernel/debug/%s/write_reg_val\n", - __func__, debugfs_dir_name); - return -ENOMEM; - } - csra66x0->debugfs_file_ro = debugfs_create_file( - "show_reg_dump", S_IFREG | S_IRUGO, csra66x0->debugfs_dir, - (void *) csra66x0, - &debugfs_codec_ops); - if (!csra66x0->debugfs_file_ro) { - dev_dbg(&client_i2c->dev, - "%s: Failed to create /sys/kernel/debug/%s/show_reg_dump\n", - __func__, debugfs_dir_name); - return -ENOMEM; - } -#endif /* CONFIG_DEBUG_FS */ - - /* register codec */ - ret = snd_soc_register_codec(&client_i2c->dev, - &soc_codec_drv_csra66x0, NULL, 0); - if (ret != 0) { - dev_err(&client_i2c->dev, "%s %d: Failed to register codec: %d\n", - __func__, __LINE__, ret); - if (gpio_is_valid(csra66x0->vreg_gpio)) { - gpio_set_value(csra66x0->vreg_gpio, 0); - gpio_free(csra66x0->vreg_gpio); - } - return ret; - } - return 0; -} - -static int csra66x0_i2c_remove(struct i2c_client *i2c_client) -{ - struct csra66x0_priv *csra66x0 = i2c_get_clientdata(i2c_client); - - if (csra66x0) { - if (gpio_is_valid(csra66x0->vreg_gpio)) { - gpio_set_value(csra66x0->vreg_gpio, 0); - gpio_free(csra66x0->vreg_gpio); - } -#if IS_ENABLED(CONFIG_DEBUG_FS) - debugfs_remove_recursive(csra66x0->debugfs_dir); -#endif - } - snd_soc_unregister_codec(&i2c_client->dev); - return 0; -} - -static const struct i2c_device_id csra66x0_i2c_id[] = { - { "csra66x0", 0}, - { } -}; -MODULE_DEVICE_TABLE(i2c, csra66x0_i2c_id); - -static struct i2c_driver csra66x0_i2c_driver = { - .probe = csra66x0_i2c_probe, - .remove = csra66x0_i2c_remove, - .id_table = csra66x0_i2c_id, - .driver = { - .name = "csra66x0", - .owner = THIS_MODULE, - .of_match_table = csra66x0_of_match - }, -}; -#endif - -static int __init csra66x0_codec_init(void) -{ - int ret = 0; -#if IS_ENABLED(CONFIG_I2C) - ret = i2c_add_driver(&csra66x0_i2c_driver); - if (ret != 0) - pr_err("%s: Failed to register CSRA66X0 I2C driver, ret = %d\n", - __func__, ret); -#endif - return ret; -} -module_init(csra66x0_codec_init); - -static void __exit csra66x0_codec_exit(void) -{ -#if IS_ENABLED(CONFIG_I2C) - i2c_del_driver(&csra66x0_i2c_driver); -#endif -} -module_exit(csra66x0_codec_exit); - -MODULE_DESCRIPTION("CSRA66X0 Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/csra66x0/csra66x0.h b/techpack/audio/asoc/codecs/csra66x0/csra66x0.h deleted file mode 100644 index 43d83d847a52..000000000000 --- a/techpack/audio/asoc/codecs/csra66x0/csra66x0.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _CSRA66X0_H -#define _CSRA66X0_H - -/* CSRA66X0 register addresses */ -#define CSRA66X0_BASE 0x7000 - -#define CSRA66X0_AUDIO_IF_RX_CONFIG1 (CSRA66X0_BASE+0x0000) -#define CSRA66X0_AUDIO_IF_RX_CONFIG2 (CSRA66X0_BASE+0x0001) -#define CSRA66X0_AUDIO_IF_RX_CONFIG3 (CSRA66X0_BASE+0x0002) -#define CSRA66X0_AUDIO_IF_TX_EN (CSRA66X0_BASE+0x0003) -#define CSRA66X0_AUDIO_IF_TX_CONFIG1 (CSRA66X0_BASE+0x0004) -#define CSRA66X0_AUDIO_IF_TX_CONFIG2 (CSRA66X0_BASE+0x0005) -#define CSRA66X0_I2C_DEVICE_ADDRESS (CSRA66X0_BASE+0x0006) -#define CSRA66X0_CHIP_ID_FA (CSRA66X0_BASE+0x0007) -#define CSRA66X0_ROM_VER_FA (CSRA66X0_BASE+0x0008) -#define CSRA66X0_CHIP_REV_0_FA (CSRA66X0_BASE+0x0009) -#define CSRA66X0_CHIP_REV_1_FA (CSRA66X0_BASE+0x000A) -#define CSRA66X0_CH1_MIX_SEL (CSRA66X0_BASE+0x000B) -#define CSRA66X0_CH2_MIX_SEL (CSRA66X0_BASE+0x000C) -#define CSRA66X0_CH1_SAMPLE1_SCALE_0 (CSRA66X0_BASE+0x000D) -#define CSRA66X0_CH1_SAMPLE1_SCALE_1 (CSRA66X0_BASE+0x000E) -#define CSRA66X0_CH1_SAMPLE3_SCALE_0 (CSRA66X0_BASE+0x000F) -#define CSRA66X0_CH1_SAMPLE3_SCALE_1 (CSRA66X0_BASE+0x0010) -#define CSRA66X0_CH1_SAMPLE5_SCALE_0 (CSRA66X0_BASE+0x0011) -#define CSRA66X0_CH1_SAMPLE5_SCALE_1 (CSRA66X0_BASE+0x0012) -#define CSRA66X0_CH1_SAMPLE7_SCALE_0 (CSRA66X0_BASE+0x0013) -#define CSRA66X0_CH1_SAMPLE7_SCALE_1 (CSRA66X0_BASE+0x0014) -#define CSRA66X0_CH1_SAMPLE2_SCALE_0 (CSRA66X0_BASE+0x0015) -#define CSRA66X0_CH1_SAMPLE2_SCALE_1 (CSRA66X0_BASE+0x0016) -#define CSRA66X0_CH1_SAMPLE4_SCALE_0 (CSRA66X0_BASE+0x0017) -#define CSRA66X0_CH1_SAMPLE4_SCALE_1 (CSRA66X0_BASE+0x0018) -#define CSRA66X0_CH1_SAMPLE6_SCALE_0 (CSRA66X0_BASE+0x0019) -#define CSRA66X0_CH1_SAMPLE6_SCALE_1 (CSRA66X0_BASE+0x001A) -#define CSRA66X0_CH1_SAMPLE8_SCALE_0 (CSRA66X0_BASE+0x001B) -#define CSRA66X0_CH1_SAMPLE8_SCALE_1 (CSRA66X0_BASE+0x001C) -#define CSRA66X0_CH2_SAMPLE1_SCALE_0 (CSRA66X0_BASE+0x001D) -#define CSRA66X0_CH2_SAMPLE1_SCALE_1 (CSRA66X0_BASE+0x001E) -#define CSRA66X0_CH2_SAMPLE3_SCALE_0 (CSRA66X0_BASE+0x001F) -#define CSRA66X0_CH2_SAMPLE3_SCALE_1 (CSRA66X0_BASE+0x0020) -#define CSRA66X0_CH2_SAMPLE5_SCALE_0 (CSRA66X0_BASE+0x0021) -#define CSRA66X0_CH2_SAMPLE5_SCALE_1 (CSRA66X0_BASE+0x0022) -#define CSRA66X0_CH2_SAMPLE7_SCALE_0 (CSRA66X0_BASE+0x0023) -#define CSRA66X0_CH2_SAMPLE7_SCALE_1 (CSRA66X0_BASE+0x0024) -#define CSRA66X0_CH2_SAMPLE2_SCALE_0 (CSRA66X0_BASE+0x0025) -#define CSRA66X0_CH2_SAMPLE2_SCALE_1 (CSRA66X0_BASE+0x0026) -#define CSRA66X0_CH2_SAMPLE4_SCALE_0 (CSRA66X0_BASE+0x0027) -#define CSRA66X0_CH2_SAMPLE4_SCALE_1 (CSRA66X0_BASE+0x0028) -#define CSRA66X0_CH2_SAMPLE6_SCALE_0 (CSRA66X0_BASE+0x0029) -#define CSRA66X0_CH2_SAMPLE6_SCALE_1 (CSRA66X0_BASE+0x002A) -#define CSRA66X0_CH2_SAMPLE8_SCALE_0 (CSRA66X0_BASE+0x002B) -#define CSRA66X0_CH2_SAMPLE8_SCALE_1 (CSRA66X0_BASE+0x002C) -#define CSRA66X0_VOLUME_CONFIG_FA (CSRA66X0_BASE+0x002D) -#define CSRA66X0_STARTUP_DELAY_FA (CSRA66X0_BASE+0x002E) -#define CSRA66X0_CH1_VOLUME_0_FA (CSRA66X0_BASE+0x002F) -#define CSRA66X0_CH1_VOLUME_1_FA (CSRA66X0_BASE+0x0030) -#define CSRA66X0_CH2_VOLUME_0_FA (CSRA66X0_BASE+0x0031) -#define CSRA66X0_CH2_VOLUME_1_FA (CSRA66X0_BASE+0x0032) -#define CSRA66X0_QUAD_ENC_COUNT_0_FA (CSRA66X0_BASE+0x0033) -#define CSRA66X0_QUAD_ENC_COUNT_1_FA (CSRA66X0_BASE+0x0034) -#define CSRA66X0_SOFT_CLIP_CONFIG (CSRA66X0_BASE+0x0035) -#define CSRA66X0_CH1_HARD_CLIP_THRESH (CSRA66X0_BASE+0x0036) -#define CSRA66X0_CH2_HARD_CLIP_THRESH (CSRA66X0_BASE+0x0037) -#define CSRA66X0_SOFT_CLIP_THRESH (CSRA66X0_BASE+0x0038) -#define CSRA66X0_DS_ENABLE_THRESH_0 (CSRA66X0_BASE+0x0039) -#define CSRA66X0_DS_ENABLE_THRESH_1 (CSRA66X0_BASE+0x003A) -#define CSRA66X0_DS_TARGET_COUNT_0 (CSRA66X0_BASE+0x003B) -#define CSRA66X0_DS_TARGET_COUNT_1 (CSRA66X0_BASE+0x003C) -#define CSRA66X0_DS_TARGET_COUNT_2 (CSRA66X0_BASE+0x003D) -#define CSRA66X0_DS_DISABLE_THRESH_0 (CSRA66X0_BASE+0x003E) -#define CSRA66X0_DS_DISABLE_THRESH_1 (CSRA66X0_BASE+0x003F) -#define CSRA66X0_DCA_CTRL (CSRA66X0_BASE+0x0040) -#define CSRA66X0_CH1_DCA_THRESH (CSRA66X0_BASE+0x0041) -#define CSRA66X0_CH2_DCA_THRESH (CSRA66X0_BASE+0x0042) -#define CSRA66X0_DCA_ATTACK_RATE (CSRA66X0_BASE+0x0043) -#define CSRA66X0_DCA_RELEASE_RATE (CSRA66X0_BASE+0x0044) -#define CSRA66X0_CH1_OUTPUT_INVERT_EN (CSRA66X0_BASE+0x0045) -#define CSRA66X0_CH2_OUTPUT_INVERT_EN (CSRA66X0_BASE+0x0046) -#define CSRA66X0_CH1_176P4K_DELAY (CSRA66X0_BASE+0x0047) -#define CSRA66X0_CH2_176P4K_DELAY (CSRA66X0_BASE+0x0048) -#define CSRA66X0_CH1_192K_DELAY (CSRA66X0_BASE+0x0049) -#define CSRA66X0_CH2_192K_DELAY (CSRA66X0_BASE+0x004A) -#define CSRA66X0_DEEMP_CONFIG_FA (CSRA66X0_BASE+0x004B) -#define CSRA66X0_CH1_TREBLE_GAIN_CTRL_FA (CSRA66X0_BASE+0x004C) -#define CSRA66X0_CH2_TREBLE_GAIN_CTRL_FA (CSRA66X0_BASE+0x004D) -#define CSRA66X0_CH1_TREBLE_FC_CTRL_FA (CSRA66X0_BASE+0x004E) -#define CSRA66X0_CH2_TREBLE_FC_CTRL_FA (CSRA66X0_BASE+0x004F) -#define CSRA66X0_CH1_BASS_GAIN_CTRL_FA (CSRA66X0_BASE+0x0050) -#define CSRA66X0_CH2_BASS_GAIN_CTRL_FA (CSRA66X0_BASE+0x0051) -#define CSRA66X0_CH1_BASS_FC_CTRL_FA (CSRA66X0_BASE+0x0052) -#define CSRA66X0_CH2_BASS_FC_CTRL_FA (CSRA66X0_BASE+0x0053) -#define CSRA66X0_FILTER_SEL_8K (CSRA66X0_BASE+0x0054) -#define CSRA66X0_FILTER_SEL_11P025K (CSRA66X0_BASE+0x0055) -#define CSRA66X0_FILTER_SEL_16K (CSRA66X0_BASE+0x0056) -#define CSRA66X0_FILTER_SEL_22P05K (CSRA66X0_BASE+0x0057) -#define CSRA66X0_FILTER_SEL_32K (CSRA66X0_BASE+0x0058) -#define CSRA66X0_FILTER_SEL_44P1K_48K (CSRA66X0_BASE+0x0059) -#define CSRA66X0_FILTER_SEL_88P2K_96K (CSRA66X0_BASE+0x005A) -#define CSRA66X0_FILTER_SEL_176P4K_192K (CSRA66X0_BASE+0x005B) -/* RESERVED (CSRA66X0_BASE+0x005C) */ -#define CSRA66X0_USER_DSP_CTRL (CSRA66X0_BASE+0x005D) -#define CSRA66X0_TEST_TONE_CTRL (CSRA66X0_BASE+0x005E) -#define CSRA66X0_TEST_TONE_FREQ_0 (CSRA66X0_BASE+0x005F) -#define CSRA66X0_TEST_TONE_FREQ_1 (CSRA66X0_BASE+0x0060) -#define CSRA66X0_TEST_TONE_FREQ_2 (CSRA66X0_BASE+0x0061) -#define CSRA66X0_AUDIO_RATE_CTRL_FA (CSRA66X0_BASE+0x0062) -#define CSRA66X0_MODULATION_INDEX_CTRL (CSRA66X0_BASE+0x0063) -#define CSRA66X0_MODULATION_INDEX_COUNT (CSRA66X0_BASE+0x0064) -#define CSRA66X0_MIN_MODULATION_PULSE_WIDTH (CSRA66X0_BASE+0x0065) -#define CSRA66X0_DEAD_TIME_CTRL (CSRA66X0_BASE+0x0066) -#define CSRA66X0_DEAD_TIME_THRESHOLD_0 (CSRA66X0_BASE+0x0067) -#define CSRA66X0_DEAD_TIME_THRESHOLD_1 (CSRA66X0_BASE+0x0068) -#define CSRA66X0_DEAD_TIME_THRESHOLD_2 (CSRA66X0_BASE+0x0069) -#define CSRA66X0_CH1_LOW_SIDE_DLY (CSRA66X0_BASE+0x006A) -#define CSRA66X0_CH2_LOW_SIDE_DLY (CSRA66X0_BASE+0x006B) -#define CSRA66X0_SPECTRUM_CTRL (CSRA66X0_BASE+0x006C) -/* RESERVED (CSRA66X0_BASE+0x006D) */ -#define CSRA66X0_SPECTRUM_SPREAD_CTRL (CSRA66X0_BASE+0x006E) -/* RESERVED (CSRA66X0_BASE+0x006F) */ -/* ... */ -/* RESERVED (CSRA66X0_BASE+0x007C) */ -#define CSRA66X0_EXT_PA_PROTECT_POLARITY (CSRA66X0_BASE+0x007D) -#define CSRA66X0_TEMP0_BACKOFF_COMP_VALUE (CSRA66X0_BASE+0x007E) -#define CSRA66X0_TEMP0_SHUTDOWN_COMP_VALUE (CSRA66X0_BASE+0x007F) -#define CSRA66X0_TEMP1_BACKOFF_COMP_VALUE (CSRA66X0_BASE+0x0080) -#define CSRA66X0_TEMP1_SHUTDOWN_COMP_VALUE (CSRA66X0_BASE+0x0081) -#define CSRA66X0_TEMP_PROT_BACKOFF (CSRA66X0_BASE+0x0082) -#define CSRA66X0_TEMP_READ0_FA (CSRA66X0_BASE+0x0083) -#define CSRA66X0_TEMP_READ1_FA (CSRA66X0_BASE+0x0084) -#define CSRA66X0_CHIP_STATE_CTRL_FA (CSRA66X0_BASE+0x0085) -/* RESERVED (CSRA66X0_BASE+0x0086) */ -#define CSRA66X0_PWM_OUTPUT_CONFIG (CSRA66X0_BASE+0x0087) -#define CSRA66X0_MISC_CONTROL_STATUS_0 (CSRA66X0_BASE+0x0088) -#define CSRA66X0_MISC_CONTROL_STATUS_1_FA (CSRA66X0_BASE+0x0089) -#define CSRA66X0_PIO0_SELECT (CSRA66X0_BASE+0x008A) -#define CSRA66X0_PIO1_SELECT (CSRA66X0_BASE+0x008B) -#define CSRA66X0_PIO2_SELECT (CSRA66X0_BASE+0x008C) -#define CSRA66X0_PIO3_SELECT (CSRA66X0_BASE+0x008D) -#define CSRA66X0_PIO4_SELECT (CSRA66X0_BASE+0x008E) -#define CSRA66X0_PIO5_SELECT (CSRA66X0_BASE+0x008F) -#define CSRA66X0_PIO6_SELECT (CSRA66X0_BASE+0x0090) -#define CSRA66X0_PIO7_SELECT (CSRA66X0_BASE+0x0091) -#define CSRA66X0_PIO8_SELECT (CSRA66X0_BASE+0x0092) -#define CSRA66X0_PIO_DIRN0 (CSRA66X0_BASE+0x0093) -#define CSRA66X0_PIO_DIRN1 (CSRA66X0_BASE+0x0094) -#define CSRA66X0_PIO_PULL_EN0 (CSRA66X0_BASE+0x0095) -#define CSRA66X0_PIO_PULL_EN1 (CSRA66X0_BASE+0x0096) -#define CSRA66X0_PIO_PULL_DIR0 (CSRA66X0_BASE+0x0097) -#define CSRA66X0_PIO_PULL_DIR1 (CSRA66X0_BASE+0x0098) -#define CSRA66X0_PIO_DRIVE_OUT0_FA (CSRA66X0_BASE+0x0099) -#define CSRA66X0_PIO_DRIVE_OUT1_FA (CSRA66X0_BASE+0x009A) -#define CSRA66X0_PIO_STATUS_IN0_FA (CSRA66X0_BASE+0x009B) -#define CSRA66X0_PIO_STATUS_IN1_FA (CSRA66X0_BASE+0x009C) -/* RESERVED (CSRA66X0_BASE+0x009D) */ -#define CSRA66X0_IRQ_OUTPUT_ENABLE (CSRA66X0_BASE+0x009E) -#define CSRA66X0_IRQ_OUTPUT_POLARITY (CSRA66X0_BASE+0x009F) -#define CSRA66X0_IRQ_OUTPUT_STATUS_FA (CSRA66X0_BASE+0x00A0) -#define CSRA66X0_CLIP_DCA_STATUS_FA (CSRA66X0_BASE+0x00A1) -#define CSRA66X0_CHIP_STATE_STATUS_FA (CSRA66X0_BASE+0x00A2) -#define CSRA66X0_FAULT_STATUS_FA (CSRA66X0_BASE+0x00A3) -#define CSRA66X0_OTP_STATUS_FA (CSRA66X0_BASE+0x00A4) -#define CSRA66X0_AUDIO_IF_STATUS_FA (CSRA66X0_BASE+0x00A5) -/* RESERVED (CSRA66X0_BASE+0x00A6) */ -#define CSRA66X0_DSP_SATURATION_STATUS_FA (CSRA66X0_BASE+0x00A7) -#define CSRA66X0_AUDIO_RATE_STATUS_FA (CSRA66X0_BASE+0x00A8) -/* RESERVED (CSRA66X0_BASE+0x00A9) */ -/* ... */ -/* RESERVED (CSRA66X0_BASE+0x00AB) */ -#define CSRA66X0_DISABLE_PWM_OUTPUT (CSRA66X0_BASE+0x00AC) -/* RESERVED (CSRA66X0_BASE+0x00AD) */ -/* ... */ -/* RESERVED (CSRA66X0_BASE+0x00B0) */ -#define CSRA66X0_OTP_VER_FA (CSRA66X0_BASE+0x00B1) -#define CSRA66X0_RAM_VER_FA (CSRA66X0_BASE+0x00B2) -/* RESERVED (CSRA66X0_BASE+0x00B3) */ -#define CSRA66X0_AUDIO_SATURATION_FLAGS_FA (CSRA66X0_BASE+0x00B4) -#define CSRA66X0_DCOFFSET_CHAN_1_01_FA (CSRA66X0_BASE+0x00B5) -#define CSRA66X0_DCOFFSET_CHAN_1_02_FA (CSRA66X0_BASE+0x00B6) -#define CSRA66X0_DCOFFSET_CHAN_1_03_FA (CSRA66X0_BASE+0x00B7) -#define CSRA66X0_DCOFFSET_CHAN_2_01_FA (CSRA66X0_BASE+0x00B8) -#define CSRA66X0_DCOFFSET_CHAN_2_02_FA (CSRA66X0_BASE+0x00B9) -#define CSRA66X0_DCOFFSET_CHAN_2_03_FA (CSRA66X0_BASE+0x00BA) -#define CSRA66X0_FORCED_PA_SWITCHING_CTRL (CSRA66X0_BASE+0x00BB) -#define CSRA66X0_PA_FORCE_PULSE_WIDTH (CSRA66X0_BASE+0x00BC) -#define CSRA66X0_PA_HIGH_MODULATION_CTRL_CH1 (CSRA66X0_BASE+0x00BD) -/* RESERVED (CSRA66X0_BASE+0x00BE) */ -/* RESERVED (CSRA66X0_BASE+0x00BF) */ -#define CSRA66X0_HIGH_MODULATION_THRESHOLD_LOW (CSRA66X0_BASE+0x00C0) -#define CSRA66X0_HIGH_MODULATION_THRESHOLD_HIGH (CSRA66X0_BASE+0x00C1) -/* RESERVED (CSRA66X0_BASE+0x00C2) */ -/* RESERVED (CSRA66X0_BASE+0x00C3) */ -#define CSRA66X0_PA_FREEZE_CTRL (CSRA66X0_BASE+0x00C4) -#define CSRA66X0_DCA_FREEZE_CTRL (CSRA66X0_BASE+0x00C5) -/* RESERVED (CSRA66X0_BASE+0x00C6) */ -/* ... */ -/* RESERVED (CSRA66X0_BASE+0x00FF) */ -#define CSRA66X0_MAX_REGISTER_ADDR CSRA66X0_DCA_FREEZE_CTRL - -#define EXPECTED_CSRA66X0_CHIP_ID 0x39 - -#define SPK_VOLUME_M20DB 0x119 -#define SPK_VOLUME_M20DB_LSB (SPK_VOLUME_M20DB & 0x0FF) -#define SPK_VOLUME_M20DB_MSB ((SPK_VOLUME_M20DB & 0x100)>>8) -#define SPK_VOLUME_LSB_MSK 0x00FF -#define SPK_VOLUME_MSB_MSK 0x0100 - -#define CONFIG_STATE 0x0 -#define RUN_STATE 0x1 -#define STDBY_STATE 0x2 - -#define FAULT_STATUS_INTERNAL 0x01 -#define FAULT_STATUS_OTP_INTEGRITY 0x02 -#define FAULT_STATUS_PADS2 0x04 -#define FAULT_STATUS_SMPS 0x08 -#define FAULT_STATUS_TEMP 0x10 -#define FAULT_STATUS_PROTECT 0x20 - -#endif /* _CSRA66X0_H */ diff --git a/techpack/audio/asoc/codecs/ep92/Android.mk b/techpack/audio/asoc/codecs/ep92/Android.mk deleted file mode 100644 index c2ac0599f7d8..000000000000 --- a/techpack/audio/asoc/codecs/ep92/Android.mk +++ /dev/null @@ -1,50 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,qcs405),true) -AUDIO_SELECT := CONFIG_SND_SOC_QCS405=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,qcs405),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=ep92_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_ep92.ko -LOCAL_MODULE_KBUILD_NAME := ep92_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/ep92/Kbuild b/techpack/audio/asoc/codecs/ep92/Kbuild deleted file mode 100644 index f5d18168947b..000000000000 --- a/techpack/audio/asoc/codecs/ep92/Kbuild +++ /dev/null @@ -1,109 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ EP92 ############ - -# for EP92 Codec -ifdef CONFIG_SND_SOC_EP92 - EP92_OBJS += ep92.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -#EXTRA_CFLAGS += $(INCS) -ccflags-y += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -#EXTRA_CFLAGS += -Wmaybe-uninitialized -ccflags-y += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -#EXTRA_CFLAGS += -Wheader-guard -ccflags-y += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_EP92) += ep92_dlkm.o -ep92_dlkm-y := $(EP92_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/ep92/ep92.c b/techpack/audio/asoc/codecs/ep92/ep92.c deleted file mode 100644 index 52f5e6d0b98a..000000000000 --- a/techpack/audio/asoc/codecs/ep92/ep92.c +++ /dev/null @@ -1,1618 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "ep92.h" - -#define EP92_POLL_INTERVAL_OFF_MSEC 200 -#define EP92_POLL_INTERVAL_ON_MSEC 20 -#define EP92_SYSFS_ENTRY_MAX_LEN 64 -#define EP92_HYST_CNT 5 - -#define EP92_RATES (SNDRV_PCM_RATE_32000 |\ - SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |\ - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000) - -#define EP92_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE) - -static const unsigned int ep92_samp_freq_table[8] = { - 32000, 44100, 48000, 88200, 96000, 176400, 192000, 768000 -}; - -static bool ep92_volatile_register(struct device *dev, unsigned int reg) -{ - switch (reg) { - case EP92_BI_GENERAL_INFO_0: - case EP92_BI_GENERAL_INFO_1: - case EP92_BI_GENERAL_INFO_2: - case EP92_BI_GENERAL_INFO_3: - case EP92_BI_GENERAL_INFO_4: - case EP92_BI_GENERAL_INFO_5: - case EP92_BI_GENERAL_INFO_6: - case EP92_GENERAL_CONTROL_0: - case EP92_GENERAL_CONTROL_1: - case EP92_GENERAL_CONTROL_2: - case EP92_GENERAL_CONTROL_3: - case EP92_GENERAL_CONTROL_4: - case EP92_AUDIO_INFO_SYSTEM_STATUS_0: - case EP92_AUDIO_INFO_SYSTEM_STATUS_1: - case EP92_AUDIO_INFO_AUDIO_STATUS: - case EP92_AUDIO_INFO_CHANNEL_STATUS_0: - case EP92_AUDIO_INFO_CHANNEL_STATUS_1: - case EP92_AUDIO_INFO_CHANNEL_STATUS_2: - case EP92_AUDIO_INFO_CHANNEL_STATUS_3: - case EP92_AUDIO_INFO_CHANNEL_STATUS_4: - case EP92_AUDIO_INFO_ADO_INFO_FRAME_0: - case EP92_AUDIO_INFO_ADO_INFO_FRAME_1: - case EP92_AUDIO_INFO_ADO_INFO_FRAME_2: - case EP92_AUDIO_INFO_ADO_INFO_FRAME_3: - case EP92_AUDIO_INFO_ADO_INFO_FRAME_4: - case EP92_AUDIO_INFO_ADO_INFO_FRAME_5: - return true; - default: - return false; - } -} - -static bool ep92_writeable_registers(struct device *dev, unsigned int reg) -{ - if (reg >= EP92_ISP_MODE_ENTER_ISP && reg <= EP92_GENERAL_CONTROL_4) - return true; - - return false; -} - -static bool ep92_readable_registers(struct device *dev, unsigned int reg) -{ - if (reg >= EP92_BI_VENDOR_ID_0 && reg <= EP92_MAX_REGISTER_ADDR) - return true; - - return false; -} - -/* codec private data */ -struct ep92_pdata { - struct regmap *regmap; - struct snd_soc_codec *codec; - struct timer_list timer; - struct work_struct read_status_worker; - int irq; - - int hyst_tx_plug; - int hyst_link_on0; - int hyst_link_on1; - int hyst_link_on2; - int filt_tx_plug; - int filt_link_on0; - int filt_link_on1; - int filt_link_on2; - struct { - u8 tx_info; - u8 video_latency; - } gi; /* General Info block */ - - struct { - u8 ctl; - u8 rx_sel; - u8 ctl2; - u8 cec_volume; - u8 link; - } gc; /* General Control block */ - - struct { - u8 system_status_0; - u8 system_status_1; - u8 audio_status; - u8 cs[5]; - u8 cc; - u8 ca; - } ai; /* Audio Info block */ - - u8 old_mode; -#if IS_ENABLED(CONFIG_DEBUG_FS) - struct dentry *debugfs_dir; - struct dentry *debugfs_file_wo; - struct dentry *debugfs_file_ro; -#endif /* CONFIG_DEBUG_FS */ -}; - -#if IS_ENABLED(CONFIG_DEBUG_FS) -static int debugfs_codec_open_op(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int debugfs_get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else { - return -EINVAL; - } - } - return 0; -} - -static ssize_t debugfs_codec_write_op(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - struct ep92_pdata *ep92 = (struct ep92_pdata *) filp->private_data; - struct snd_soc_codec *codec = ep92->codec; - char lbuf[32]; - int rc; - u32 param[2]; - - if (!filp || !ppos || !ubuf) - return -EINVAL; - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - lbuf[cnt] = '\0'; - rc = debugfs_get_parameters(lbuf, param, 2); - if ((param[0] < EP92_ISP_MODE_ENTER_ISP) - || (param[0] > EP92_GENERAL_CONTROL_4)) { - dev_err(codec->dev, "%s: reg address 0x%02X out of range\n", - __func__, param[0]); - return -EINVAL; - } - if ((param[1] < 0) || (param[1] > 255)) { - dev_err(codec->dev, "%s: reg data 0x%02X out of range\n", - __func__, param[1]); - return -EINVAL; - } - if (rc == 0) { - rc = cnt; - dev_info(codec->dev, "%s: reg[0x%02X]=0x%02X\n", - __func__, param[0], param[1]); - snd_soc_write(codec, param[0], param[1]); - } else { - dev_err(codec->dev, "%s: write to register addr=0x%02X failed\n", - __func__, param[0]); - } - return rc; -} - -static ssize_t debugfs_ep92_reg_show(struct snd_soc_codec *codec, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[20]; - - if (!ubuf || !ppos || !codec || *ppos < 0) - return -EINVAL; - - for (i = (int) *ppos / 11; i <= EP92_MAX_REGISTER_ADDR; i++) { - reg_val = snd_soc_read(codec, i); - len = snprintf(tmp_buf, 20, "0x%02X: 0x%02X\n", i, - (reg_val & 0xFF)); - if ((total + len) > count) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - dev_err(codec->dev, "%s: fail to copy reg dump\n", - __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t debugfs_codec_read_op(struct file *filp, - char __user *ubuf, size_t cnt, loff_t *ppos) -{ - struct ep92_pdata *ep92 = (struct ep92_pdata *) filp->private_data; - struct snd_soc_codec *codec = ep92->codec; - ssize_t ret_cnt; - - if (!filp || !ppos || !ubuf || *ppos < 0) - return -EINVAL; - ret_cnt = debugfs_ep92_reg_show(codec, ubuf, cnt, ppos); - return ret_cnt; -} - -static const struct file_operations debugfs_codec_ops = { - .open = debugfs_codec_open_op, - .write = debugfs_codec_write_op, - .read = debugfs_codec_read_op, -}; -#endif /* CONFIG_DEBUG_FS */ - -static int ep92_send_uevent(struct ep92_pdata *ep92, char *event) -{ - char *env[] = { event, NULL }; - - if (!event || !ep92) - return -EINVAL; - - return kobject_uevent_env(&ep92->codec->dev->kobj, KOBJ_CHANGE, env); -} - -static int ep92_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - return 0; -} - -static void ep92_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ -} - -static int ep92_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) -{ - return 0; -} - -static struct snd_soc_dai_ops ep92_dai_ops = { - .startup = ep92_startup, - .shutdown = ep92_shutdown, - .hw_params = ep92_hw_params, -}; - -static struct snd_soc_dai_driver ep92_dai[] = { - { - .name = "ep92-hdmi", - .id = 1, - .capture = { - .stream_name = "HDMI Capture", - .rate_max = 192000, - .rate_min = 32000, - .channels_min = 1, - .channels_max = 8, - .rates = EP92_RATES, - .formats = EP92_FORMATS, - }, - .ops = &ep92_dai_ops, /* callbacks */ - }, - { - .name = "ep92-arc", - .id = 2, - .capture = { - .stream_name = "ARC Capture", - .rate_max = 192000, - .rate_min = 32000, - .channels_min = 1, - .channels_max = 2, - .rates = EP92_RATES, - .formats = EP92_FORMATS, - }, - .ops = &ep92_dai_ops, /* callbacks */ - }, -}; - -static void ep92_read_general_control(struct snd_soc_codec *codec, - struct ep92_pdata *ep92) -{ - u8 old, change; - int val; - - old = ep92->gi.tx_info; - ep92->gi.tx_info = snd_soc_read(codec, EP92_BI_GENERAL_INFO_0); - if (ep92->gi.tx_info == 0xff) { - pr_debug("ep92 EP92_BI_GENERAL_INFO_0 read 0xff\n"); - ep92->gi.tx_info = old; - } - /* implement hysteresis to prevent events on glitches */ - if (ep92->gi.tx_info & EP92_GI_TX_HOT_PLUG_MASK) { - if (ep92->hyst_tx_plug < EP92_HYST_CNT) { - ep92->hyst_tx_plug++; - if ((ep92->hyst_tx_plug == EP92_HYST_CNT) && - (ep92->filt_tx_plug == 0)) { - ep92->filt_tx_plug = 1; - pr_debug("ep92 out_plug changed to 1\n"); - ep92_send_uevent(ep92, - "EP92EVT_OUT_PLUG=CONNECTED"); - } - } - } else { - if (ep92->hyst_tx_plug > 0) { - ep92->hyst_tx_plug--; - if ((ep92->hyst_tx_plug == 0) && - (ep92->filt_tx_plug == 1)) { - ep92->filt_tx_plug = 0; - pr_debug("ep92 out_plug changed to 0\n"); - ep92_send_uevent(ep92, - "EP92EVT_OUT_PLUG=DISCONNECTED"); - } - } - } - - old = ep92->gi.video_latency; - ep92->gi.video_latency = snd_soc_read(codec, EP92_BI_GENERAL_INFO_4); - if (ep92->gi.video_latency == 0xff) { - pr_debug("ep92 EP92_BI_GENERAL_INFO_4 read 0xff\n"); - ep92->gi.video_latency = old; - } - change = ep92->gi.video_latency ^ old; - if (change & EP92_GI_VIDEO_LATENCY_MASK) { - val = ep92->gi.video_latency; - if (val > 0) - val = (val - 1) * 2; - pr_debug("ep92 video latency changed to %d\n", val); - ep92_send_uevent(ep92, "EP92EVT_VIDEO_LATENCY=CHANGED"); - } - - old = ep92->gc.ctl; - ep92->gc.ctl = snd_soc_read(codec, EP92_GENERAL_CONTROL_0); - if (ep92->gc.ctl == 0xff) { - pr_debug("ep92 EP92_GENERAL_CONTROL_0 read 0xff\n"); - ep92->gc.ctl = old; - } - change = ep92->gc.ctl ^ old; - if (change & EP92_GC_POWER_MASK) { - val = (ep92->gc.ctl >> EP92_GC_POWER_SHIFT) & - EP92_2CHOICE_MASK; - pr_debug("ep92 power changed to %d\n", val); - if (val) - ep92_send_uevent(ep92, "EP92EVT_POWER=ON"); - else - ep92_send_uevent(ep92, "EP92EVT_POWER=OFF"); - } - if (change & EP92_GC_AUDIO_PATH_MASK) { - val = (ep92->gc.ctl >> EP92_GC_AUDIO_PATH_SHIFT) & - EP92_2CHOICE_MASK; - pr_debug("ep92 audio_path changed to %d\n", val); - if (val) - ep92_send_uevent(ep92, "EP92EVT_AUDIO_PATH=TV"); - else - ep92_send_uevent(ep92, "EP92EVT_AUDIO_PATH=SPEAKER"); - } - if (change & EP92_GC_CEC_MUTE_MASK) { - val = (ep92->gc.ctl >> EP92_GC_CEC_MUTE_SHIFT) & - EP92_2CHOICE_MASK; - pr_debug("ep92 cec_mute changed to %d\n", val); - if (val) - ep92_send_uevent(ep92, "EP92EVT_CEC_MUTE=NORMAL"); - else - ep92_send_uevent(ep92, "EP92EVT_CEC_MUTE=MUTED"); - } - if (change & EP92_GC_ARC_EN_MASK) { - val = ep92->gc.ctl & EP92_2CHOICE_MASK; - pr_debug("ep92 arc_en changed to %d\n", val); - if (val) - ep92_send_uevent(ep92, "EP92EVT_ARC_EN=ON"); - else - ep92_send_uevent(ep92, "EP92EVT_ARC_EN=OFF"); - } - - old = ep92->gc.rx_sel; - ep92->gc.rx_sel = snd_soc_read(codec, EP92_GENERAL_CONTROL_1); - if (ep92->gc.rx_sel == 0xff) { - pr_debug("ep92 EP92_GENERAL_CONTROL_1 read 0xff\n"); - ep92->gc.rx_sel = old; - } - change = ep92->gc.rx_sel ^ old; - if (change & EP92_GC_RX_SEL_MASK) { - val = ep92->gc.rx_sel & EP92_GC_RX_SEL_MASK; - pr_debug("ep92 rx_sel changed to %d\n", val); - ep92_send_uevent(ep92, "EP92EVT_SRC_SEL=CHANGED"); - } - - old = ep92->gc.cec_volume; - ep92->gc.cec_volume = snd_soc_read(codec, EP92_GENERAL_CONTROL_3); - if (ep92->gc.cec_volume == 0xff) { - pr_debug("ep92 EP92_GENERAL_CONTROL_3 read 0xff\n"); - ep92->gc.cec_volume = old; - } - change = ep92->gc.cec_volume ^ old; - if (change & EP92_GC_CEC_VOLUME_MASK) { - val = ep92->gc.cec_volume & EP92_GC_CEC_VOLUME_MASK; - pr_debug("ep92 cec_volume changed to %d\n", val); - ep92_send_uevent(ep92, "EP92EVT_CEC_VOLUME=CHANGED"); - } - - old = ep92->gc.link; - ep92->gc.link = snd_soc_read(codec, EP92_GENERAL_CONTROL_4); - if (ep92->gc.link == 0xff) { - pr_debug("ep92 EP92_GENERAL_CONTROL_4 read 0xff\n"); - ep92->gc.link = old; - } - - /* implement hysteresis to prevent events on glitches */ - if (ep92->gc.link & EP92_GC_LINK_ON0_MASK) { - if (ep92->hyst_link_on0 < EP92_HYST_CNT) { - ep92->hyst_link_on0++; - if ((ep92->hyst_link_on0 == EP92_HYST_CNT) && - (ep92->filt_link_on0 == 0)) { - ep92->filt_link_on0 = 1; - pr_debug("ep92 link_on0 changed to 1\n"); - ep92_send_uevent(ep92, - "EP92EVT_LINK_ON0=CONNECTED"); - } - } - } else { - if (ep92->hyst_link_on0 > 0) { - ep92->hyst_link_on0--; - if ((ep92->hyst_link_on0 == 0) && - (ep92->filt_link_on0 == 1)) { - ep92->filt_link_on0 = 0; - pr_debug("ep92 link_on0 changed to 0\n"); - ep92_send_uevent(ep92, - "EP92EVT_LINK_ON0=DISCONNECTED"); - } - } - } - - /* implement hysteresis to prevent events on glitches */ - if (ep92->gc.link & EP92_GC_LINK_ON1_MASK) { - if (ep92->hyst_link_on1 < EP92_HYST_CNT) { - ep92->hyst_link_on1++; - if ((ep92->hyst_link_on1 == EP92_HYST_CNT) && - (ep92->filt_link_on1 == 0)) { - ep92->filt_link_on1 = 1; - pr_debug("ep92 link_on1 changed to 1\n"); - ep92_send_uevent(ep92, - "EP92EVT_LINK_ON1=CONNECTED"); - } - } - } else { - if (ep92->hyst_link_on1 > 0) { - ep92->hyst_link_on1--; - if ((ep92->hyst_link_on1 == 0) && - (ep92->filt_link_on1 == 1)) { - ep92->filt_link_on1 = 0; - pr_debug("ep92 link_on1 changed to 0\n"); - ep92_send_uevent(ep92, - "EP92EVT_LINK_ON1=DISCONNECTED"); - } - } - } - - /* implement hysteresis to prevent events on glitches */ - if (ep92->gc.link & EP92_GC_LINK_ON2_MASK) { - if (ep92->hyst_link_on2 < EP92_HYST_CNT) { - ep92->hyst_link_on2++; - if ((ep92->hyst_link_on2 == EP92_HYST_CNT) && - (ep92->filt_link_on2 == 0)) { - ep92->filt_link_on2 = 1; - pr_debug("ep92 link_on2 changed to 1\n"); - ep92_send_uevent(ep92, - "EP92EVT_LINK_ON2=CONNECTED"); - } - } - } else { - if (ep92->hyst_link_on2 > 0) { - ep92->hyst_link_on2--; - if ((ep92->hyst_link_on2 == 0) && - (ep92->filt_link_on2 == 1)) { - ep92->filt_link_on2 = 0; - pr_debug("ep92 link_on2 changed to 0\n"); - ep92_send_uevent(ep92, - "EP92EVT_LINK_ON2=DISCONNECTED"); - } - } - } -} - -static void ep92_read_audio_info(struct snd_soc_codec *codec, - struct ep92_pdata *ep92) -{ - u8 old, change; - u8 new_mode; - bool send_uevent = false; - - old = ep92->ai.system_status_0; - ep92->ai.system_status_0 = snd_soc_read(codec, - EP92_AUDIO_INFO_SYSTEM_STATUS_0); - if (ep92->ai.system_status_0 == 0xff) { - pr_debug("ep92 EP92_AUDIO_INFO_SYSTEM_STATUS_0 read 0xff\n"); - ep92->ai.system_status_0 = old; - } - change = ep92->ai.system_status_0 ^ old; - if (change & EP92_AI_MCLK_ON_MASK) { - pr_debug("ep92 status changed to %d\n", - (ep92->ai.system_status_0 >> EP92_AI_MCLK_ON_SHIFT) & - EP92_2CHOICE_MASK); - send_uevent = true; - } - if (change & EP92_AI_AVMUTE_MASK) { - pr_debug("ep92 avmute changed to %d\n", - (ep92->ai.system_status_0 >> EP92_AI_AVMUTE_SHIFT) & - EP92_2CHOICE_MASK); - send_uevent = true; - } - if (change & EP92_AI_LAYOUT_MASK) { - pr_debug("ep92 layout changed to %d\n", - (ep92->ai.system_status_0) & EP92_2CHOICE_MASK); - send_uevent = true; - } - - old = ep92->ai.audio_status; - ep92->ai.audio_status = snd_soc_read(codec, - EP92_AUDIO_INFO_AUDIO_STATUS); - if (ep92->ai.audio_status == 0xff) { - pr_debug("ep92 EP92_AUDIO_INFO_AUDIO_STATUS read 0xff\n"); - ep92->ai.audio_status = old; - } - change = ep92->ai.audio_status ^ old; - if (change & EP92_AI_RATE_MASK) { - pr_debug("ep92 rate changed to %d\n", - ep92_samp_freq_table[(ep92->ai.audio_status) & - EP92_AI_RATE_MASK]); - send_uevent = true; - } - - new_mode = ep92->old_mode; - if (ep92->ai.audio_status & EP92_AI_STD_ADO_MASK) { - old = ep92->ai.cs[0]; - ep92->ai.cs[0] = snd_soc_read(codec, - EP92_AUDIO_INFO_CHANNEL_STATUS_0); - if (ep92->ai.cs[0] == 0xff) { - pr_debug("ep92 EP92_AUDIO_INFO_CHANNEL_STATUS_0 read 0xff\n"); - ep92->ai.cs[0] = old; - } - if (ep92->ai.cs[0] & EP92_AI_NPCM_MASK) - new_mode = 1; /* Compr */ - else - new_mode = 0; /* LPCM */ - } else if (ep92->ai.audio_status & EP92_AI_HBR_ADO_MASK) - new_mode = 1; /* Compr */ - - if (ep92->old_mode != new_mode) { - pr_debug("ep92 mode changed to %d\n", new_mode); - send_uevent = true; - } - ep92->old_mode = new_mode; - - old = ep92->ai.cc; - ep92->ai.cc = snd_soc_read(codec, EP92_AUDIO_INFO_ADO_INFO_FRAME_1); - if (ep92->ai.cc == 0xff) { - pr_debug("ep92 EP92_AUDIO_INFO_ADO_INFO_FRAME_1 read 0xff\n"); - ep92->ai.cc = old; - } - change = ep92->ai.cc ^ old; - if (change & EP92_AI_CH_COUNT_MASK) { - pr_debug("ep92 ch_count changed to %d (%d)\n", - ep92->ai.cc & EP92_AI_CH_COUNT_MASK, - (ep92->ai.cc & EP92_AI_CH_COUNT_MASK) == 0 ? 0 : - (ep92->ai.cc & EP92_AI_CH_COUNT_MASK) + 1); - send_uevent = true; - } - - old = ep92->ai.ca; - ep92->ai.ca = snd_soc_read(codec, EP92_AUDIO_INFO_ADO_INFO_FRAME_4); - if (ep92->ai.ca == 0xff) { - pr_debug("ep92 EP92_AUDIO_INFO_ADO_INFO_FRAME_4 read 0xff\n"); - ep92->ai.ca = old; - } - change = ep92->ai.ca ^ old; - if (change & EP92_AI_CH_ALLOC_MASK) { - pr_debug("ep92 ch_alloc changed to 0x%02x\n", - (ep92->ai.ca) & EP92_AI_CH_ALLOC_MASK); - send_uevent = true; - } - - if (send_uevent) - ep92_send_uevent(ep92, "EP92EVT_AUDIO=MEDIA_CONFIG_CHANGE"); -} - -static void ep92_init(struct snd_soc_codec *codec, struct ep92_pdata *ep92) -{ - /* update the format information in mixer controls */ - ep92_read_general_control(codec, ep92); - ep92_read_audio_info(codec, ep92); -} - -static int ep92_probe(struct snd_soc_codec *codec) -{ - struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec); - - ep92->codec = codec; - ep92_init(codec, ep92); - - return 0; -} - -static int ep92_remove(struct snd_soc_codec *codec) -{ - return 0; -} - -static struct regmap *ep92_get_regmap(struct device *dev) -{ - struct ep92_pdata *ep92_ctrl = dev_get_drvdata(dev); - - if (!ep92_ctrl) - return NULL; - - return ep92_ctrl->regmap; -} - -static struct snd_soc_codec_driver soc_codec_drv_ep92 = { - .probe = ep92_probe, - .remove = ep92_remove, - .get_regmap = ep92_get_regmap, -}; - -static struct regmap_config ep92_regmap_config = { - .reg_bits = 8, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = ep92_reg_defaults, - .num_reg_defaults = ARRAY_SIZE(ep92_reg_defaults), - .max_register = EP92_MAX_REGISTER_ADDR, - .volatile_reg = ep92_volatile_register, - .writeable_reg = ep92_writeable_registers, - .readable_reg = ep92_readable_registers, -}; - -void ep92_read_status(struct work_struct *work) -{ - struct ep92_pdata *ep92 = container_of(work, struct ep92_pdata, - read_status_worker); - struct snd_soc_codec *codec = ep92->codec; - u8 val; - - /* No polling before codec is initialized */ - if (codec == NULL) - return; - - /* check ADO_CHF that is set when audio format has changed */ - val = snd_soc_read(codec, EP92_BI_GENERAL_INFO_1); - if (val == 0xff) { - /* workaround for Nak'ed first read */ - val = snd_soc_read(codec, EP92_BI_GENERAL_INFO_1); - if (val == 0xff) - return; /* assume device not present */ - } - - if (val & EP92_GI_ADO_CHF_MASK) - pr_debug("ep92 audio mode change trigger.\n"); - - if (val & EP92_GI_CEC_ECF_MASK) - pr_debug("ep92 CEC change trigger.\n"); - - /* check for general control changes */ - ep92_read_general_control(codec, ep92); - - /* update the format information in mixer controls */ - ep92_read_audio_info(codec, ep92); -} - -static irqreturn_t ep92_irq(int irq, void *data) -{ - struct ep92_pdata *ep92 = data; - struct snd_soc_codec *codec = ep92->codec; - - /* Treat interrupt before codec is initialized as spurious */ - if (codec == NULL) - return IRQ_NONE; - - dev_dbg(codec->dev, "ep92_interrupt\n"); - - schedule_work(&ep92->read_status_worker); - - return IRQ_HANDLED; -}; - -void ep92_poll_status(unsigned long data) -{ - struct ep92_pdata *ep92 = (struct ep92_pdata *)data; - u32 poll_msec; - - if ((ep92->gc.ctl & EP92_GC_POWER_MASK) == 0) - poll_msec = EP92_POLL_INTERVAL_OFF_MSEC; - else - poll_msec = EP92_POLL_INTERVAL_ON_MSEC; - - mod_timer(&ep92->timer, jiffies + msecs_to_jiffies(poll_msec)); - - schedule_work(&ep92->read_status_worker); -} - -static const struct of_device_id ep92_of_match[] = { - { .compatible = "explore,ep92a6", }, - { } -}; -MODULE_DEVICE_TABLE(of, ep92_of_match); - -static ssize_t ep92_sysfs_rda_audio_state(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->ai.system_status_0 & EP92_AI_MCLK_ON_MASK) >> - EP92_AI_MCLK_ON_SHIFT; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_audio_format(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->old_mode; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_audio_rate(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92_samp_freq_table[(ep92->ai.audio_status) & - EP92_AI_RATE_MASK]; - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_audio_layout(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->ai.system_status_0 & EP92_AI_LAYOUT_MASK) >> - EP92_AI_LAYOUT_SHIFT; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_audio_ch_count(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->ai.cc & EP92_AI_CH_COUNT_MASK; - /* mapping is ch_count = reg_val + 1, with exception: 0 = unknown */ - if (val > 0) - val += 1; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_audio_ch_alloc(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->ai.ca & EP92_AI_CH_ALLOC_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_avmute(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - - val = (ep92->ai.system_status_0 >> EP92_AI_AVMUTE_SHIFT) & - EP92_2CHOICE_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_link_on0(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->filt_link_on0; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_link_on1(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->filt_link_on1; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_link_on2(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->filt_link_on2; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_out_plug(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->filt_tx_plug; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_video_latency(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->gi.video_latency & EP92_GI_VIDEO_LATENCY_MASK; - if (val > 0) - val = (val - 1) * 2; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_rda_arc_disable(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->gc.ctl2 >> EP92_GC_ARC_DIS_SHIFT) & - EP92_2CHOICE_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_wta_arc_disable(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int reg, val, rc; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - rc = kstrtoint(buf, 10, &val); - if (rc) { - pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc); - goto end; - } - if ((val < 0) || (val > 1)) { - pr_err("%s: value out of range.\n", __func__); - rc = -EINVAL; - goto end; - } - - reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_2); - reg &= ~EP92_GC_ARC_DIS_MASK; - reg |= ((val << EP92_GC_ARC_DIS_SHIFT) & EP92_GC_ARC_DIS_MASK); - snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_2, reg); - ep92->gc.ctl2 &= ~EP92_GC_ARC_DIS_MASK; - ep92->gc.ctl2 |= (val << EP92_GC_ARC_DIS_SHIFT) & EP92_GC_ARC_DIS_MASK; - - rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN); -end: - return rc; -} - -static ssize_t ep92_sysfs_rda_power(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->gc.ctl >> EP92_GC_POWER_SHIFT) & EP92_2CHOICE_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_wta_power(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int reg, val, rc; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - rc = kstrtoint(buf, 10, &val); - if (rc) { - pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc); - goto end; - } - if ((val < 0) || (val > 1)) { - pr_err("%s: value out of range.\n", __func__); - rc = -EINVAL; - goto end; - } - - reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0); - reg &= ~EP92_GC_POWER_MASK; - reg |= (val << EP92_GC_POWER_SHIFT) & EP92_GC_POWER_MASK; - snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg); - ep92->gc.ctl &= ~EP92_GC_POWER_MASK; - ep92->gc.ctl |= (val << EP92_GC_POWER_SHIFT) & EP92_GC_POWER_MASK; - - rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN); -end: - return rc; -} - -static ssize_t ep92_sysfs_rda_audio_path(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->gc.ctl >> EP92_GC_AUDIO_PATH_SHIFT) & EP92_2CHOICE_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_wta_audio_path(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int reg, val, rc; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - rc = kstrtoint(buf, 10, &val); - if (rc) { - pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc); - goto end; - } - if ((val < 0) || (val > 1)) { - pr_err("%s: value out of range.\n", __func__); - rc = -EINVAL; - goto end; - } - - reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0); - reg &= ~EP92_GC_AUDIO_PATH_MASK; - reg |= (val << EP92_GC_AUDIO_PATH_SHIFT) & EP92_GC_AUDIO_PATH_MASK; - snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg); - ep92->gc.ctl &= ~EP92_GC_AUDIO_PATH_MASK; - ep92->gc.ctl |= (val << EP92_GC_AUDIO_PATH_SHIFT) & - EP92_GC_AUDIO_PATH_MASK; - - rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN); -end: - return rc; -} - -static ssize_t ep92_sysfs_rda_src_sel(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = ep92->gc.rx_sel & EP92_GC_RX_SEL_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_wta_src_sel(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int reg, val, rc; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - rc = kstrtoint(buf, 10, &val); - if (rc) { - pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc); - goto end; - } - if ((val < 0) || (val > 7)) { - pr_err("%s: value out of range.\n", __func__); - rc = -EINVAL; - goto end; - } - - reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_1); - reg &= ~EP92_GC_RX_SEL_MASK; - reg |= (val << EP92_GC_RX_SEL_SHIFT) & EP92_GC_RX_SEL_MASK; - snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_1, reg); - ep92->gc.rx_sel &= ~EP92_GC_RX_SEL_MASK; - ep92->gc.rx_sel |= (val << EP92_GC_RX_SEL_SHIFT) & EP92_GC_RX_SEL_MASK; - - rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN); -end: - return rc; -} - -static ssize_t ep92_sysfs_rda_arc_enable(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->gc.ctl >> EP92_GC_ARC_EN_SHIFT) & EP92_2CHOICE_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_wta_arc_enable(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int reg, val, rc; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - rc = kstrtoint(buf, 10, &val); - if (rc) { - pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc); - goto end; - } - if ((val < 0) || (val > 1)) { - pr_err("%s: value out of range.\n", __func__); - rc = -EINVAL; - goto end; - } - - reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0); - reg &= ~EP92_GC_AUDIO_PATH_MASK; - reg |= (val << EP92_GC_AUDIO_PATH_SHIFT) & EP92_GC_AUDIO_PATH_MASK; - snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg); - ep92->gc.ctl &= ~EP92_GC_AUDIO_PATH_MASK; - ep92->gc.ctl |= (val << EP92_GC_AUDIO_PATH_SHIFT) & - EP92_GC_AUDIO_PATH_MASK; - - rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN); -end: - return rc; -} - -static ssize_t ep92_sysfs_rda_cec_mute(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->gc.ctl >> EP92_GC_CEC_MUTE_SHIFT) & EP92_2CHOICE_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_wta_cec_mute(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int reg, val, rc; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - rc = kstrtoint(buf, 10, &val); - if (rc) { - pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc); - goto end; - } - if ((val < 0) || (val > 1)) { - pr_err("%s: value out of range.\n", __func__); - rc = -EINVAL; - goto end; - } - - reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0); - reg &= ~EP92_GC_CEC_MUTE_MASK; - reg |= (val << EP92_GC_CEC_MUTE_SHIFT) & EP92_GC_CEC_MUTE_MASK; - snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg); - ep92->gc.ctl &= ~EP92_GC_CEC_MUTE_MASK; - ep92->gc.ctl |= (val << EP92_GC_CEC_MUTE_SHIFT) & - EP92_GC_CEC_MUTE_MASK; - - rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN); -end: - return rc; -} - -static ssize_t ep92_sysfs_rda_cec_volume(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - int val; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - val = (ep92->gc.cec_volume >> EP92_GC_CEC_VOLUME_SHIFT) & - EP92_GC_CEC_VOLUME_MASK; - - ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val); - pr_debug("%s: '%d'\n", __func__, val); - - return ret; -} - -static ssize_t ep92_sysfs_wta_cec_volume(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int reg, val, rc; - struct ep92_pdata *ep92 = dev_get_drvdata(dev); - - if (!ep92) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - rc = kstrtoint(buf, 10, &val); - if (rc) { - pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc); - goto end; - } - if ((val < 0) || (val > EP92_GC_CEC_VOLUME_MAX)) { - pr_err("%s: value out of range.\n", __func__); - rc = -EINVAL; - goto end; - } - - reg = val & EP92_GC_CEC_VOLUME_MASK; - snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_3, reg); - ep92->gc.cec_volume = val & EP92_GC_CEC_VOLUME_MASK; - - rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN); -end: - return rc; -} - -static DEVICE_ATTR(audio_state, 0444, ep92_sysfs_rda_audio_state, NULL); -static DEVICE_ATTR(audio_format, 0444, ep92_sysfs_rda_audio_format, NULL); -static DEVICE_ATTR(audio_rate, 0444, ep92_sysfs_rda_audio_rate, NULL); -static DEVICE_ATTR(audio_layout, 0444, ep92_sysfs_rda_audio_layout, NULL); -static DEVICE_ATTR(audio_ch_count, 0444, ep92_sysfs_rda_audio_ch_count, NULL); -static DEVICE_ATTR(audio_ch_alloc, 0444, ep92_sysfs_rda_audio_ch_alloc, NULL); -static DEVICE_ATTR(audio_avmute, 0444, ep92_sysfs_rda_avmute, NULL); -static DEVICE_ATTR(link_on0, 0444, ep92_sysfs_rda_link_on0, NULL); -static DEVICE_ATTR(link_on1, 0444, ep92_sysfs_rda_link_on1, NULL); -static DEVICE_ATTR(link_on2, 0444, ep92_sysfs_rda_link_on2, NULL); -static DEVICE_ATTR(out_plug, 0444, ep92_sysfs_rda_out_plug, NULL); -static DEVICE_ATTR(video_latency, 0444, ep92_sysfs_rda_video_latency, NULL); -static DEVICE_ATTR(arc_disable, 0644, ep92_sysfs_rda_arc_disable, - ep92_sysfs_wta_arc_disable); -static DEVICE_ATTR(power_on, 0644, ep92_sysfs_rda_power, ep92_sysfs_wta_power); -static DEVICE_ATTR(audio_path, 0644, ep92_sysfs_rda_audio_path, - ep92_sysfs_wta_audio_path); -static DEVICE_ATTR(src_sel, 0644, ep92_sysfs_rda_src_sel, - ep92_sysfs_wta_src_sel); -static DEVICE_ATTR(arc_enable, 0644, ep92_sysfs_rda_arc_enable, - ep92_sysfs_wta_arc_enable); -static DEVICE_ATTR(cec_mute, 0644, ep92_sysfs_rda_cec_mute, - ep92_sysfs_wta_cec_mute); -static DEVICE_ATTR(cec_volume, 0644, ep92_sysfs_rda_cec_volume, - ep92_sysfs_wta_cec_volume); - -static struct attribute *ep92_fs_attrs[] = { - &dev_attr_audio_state.attr, - &dev_attr_audio_format.attr, - &dev_attr_audio_rate.attr, - &dev_attr_audio_layout.attr, - &dev_attr_audio_ch_count.attr, - &dev_attr_audio_ch_alloc.attr, - &dev_attr_audio_avmute.attr, - &dev_attr_link_on0.attr, - &dev_attr_link_on1.attr, - &dev_attr_link_on2.attr, - &dev_attr_out_plug.attr, - &dev_attr_video_latency.attr, - &dev_attr_arc_disable.attr, - &dev_attr_power_on.attr, - &dev_attr_audio_path.attr, - &dev_attr_src_sel.attr, - &dev_attr_arc_enable.attr, - &dev_attr_cec_mute.attr, - &dev_attr_cec_volume.attr, - NULL, -}; - -static struct attribute_group ep92_fs_attrs_group = { - .attrs = ep92_fs_attrs, -}; - -static int ep92_sysfs_create(struct i2c_client *client, - struct ep92_pdata *ep92) -{ - int rc; - - rc = sysfs_create_group(&client->dev.kobj, &ep92_fs_attrs_group); - - return rc; -} - -static void ep92_sysfs_remove(struct i2c_client *client, - struct ep92_pdata *ep92) -{ - sysfs_remove_group(&client->dev.kobj, &ep92_fs_attrs_group); -} - -static int ep92_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct ep92_pdata *ep92; - int ret; -#if IS_ENABLED(CONFIG_DEBUG_FS) - char debugfs_dir_name[32]; -#endif - - ep92 = devm_kzalloc(&client->dev, sizeof(struct ep92_pdata), - GFP_KERNEL); - if (ep92 == NULL) - return -ENOMEM; - - ep92->regmap = devm_regmap_init_i2c(client, &ep92_regmap_config); - if (IS_ERR(ep92->regmap)) { - ret = PTR_ERR(ep92->regmap); - dev_err(&client->dev, - "%s: Failed to allocate regmap for I2C device: %d\n", - __func__, ret); - return ret; - } - - i2c_set_clientdata(client, ep92); - - /* register interrupt handler */ - INIT_WORK(&ep92->read_status_worker, ep92_read_status); - ep92->irq = client->irq; - if (ep92->irq) { - ret = devm_request_threaded_irq(&client->dev, ep92->irq, - NULL, ep92_irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - "ep92_irq", ep92); - if (ret) { - dev_err(&client->dev, - "%s: Failed to request IRQ %d: %d\n", - __func__, ep92->irq, ret); - ep92->irq = 0; - } - } - /* poll status if IRQ is not configured */ - if (ep92->irq == 0) { - setup_timer(&ep92->timer, ep92_poll_status, - (unsigned long)ep92); - mod_timer(&ep92->timer, jiffies + - msecs_to_jiffies(EP92_POLL_INTERVAL_OFF_MSEC)); - } - -#if IS_ENABLED(CONFIG_DEBUG_FS) - /* debugfs interface */ - snprintf(debugfs_dir_name, sizeof(debugfs_dir_name), "%s-%s", - client->name, dev_name(&client->dev)); - ep92->debugfs_dir = debugfs_create_dir(debugfs_dir_name, NULL); - if (!ep92->debugfs_dir) { - dev_dbg(&client->dev, - "%s: Failed to create /sys/kernel/debug/%s for debugfs\n", - __func__, debugfs_dir_name); - return -ENOMEM; - } - ep92->debugfs_file_wo = debugfs_create_file( - "write_reg_val", S_IFREG | 0444, ep92->debugfs_dir, - (void *) ep92, - &debugfs_codec_ops); - if (!ep92->debugfs_file_wo) { - dev_dbg(&client->dev, - "%s: Failed to create /sys/kernel/debug/%s/write_reg_val\n", - __func__, debugfs_dir_name); - return -ENOMEM; - } - ep92->debugfs_file_ro = debugfs_create_file( - "show_reg_dump", S_IFREG | 0444, ep92->debugfs_dir, - (void *) ep92, - &debugfs_codec_ops); - if (!ep92->debugfs_file_ro) { - dev_dbg(&client->dev, - "%s: Failed to create /sys/kernel/debug/%s/show_reg_dump\n", - __func__, debugfs_dir_name); - return -ENOMEM; - } -#endif /* CONFIG_DEBUG_FS */ - - /* register codec */ - ret = snd_soc_register_codec(&client->dev, &soc_codec_drv_ep92, - ep92_dai, ARRAY_SIZE(ep92_dai)); - if (ret) { - dev_err(&client->dev, - "%s %d: Failed to register CODEC: %d\n", - __func__, __LINE__, ret); - goto err_reg; - } - - ret = ep92_sysfs_create(client, ep92); - if (ret) { - pr_err("%s: sysfs creation failed ret=%d\n", __func__, ret); - goto err_sysfs; - } - - return 0; - -err_sysfs: - snd_soc_unregister_codec(&client->dev); -err_reg: - if (ep92->irq == 0) - del_timer(&ep92->timer); - - return ret; -} - -static int ep92_i2c_remove(struct i2c_client *client) -{ - struct ep92_pdata *ep92; - - ep92 = i2c_get_clientdata(client); - if (ep92) { - if (ep92->irq == 0) - del_timer(&ep92->timer); - -#if IS_ENABLED(CONFIG_DEBUG_FS) - debugfs_remove_recursive(ep92->debugfs_dir); -#endif - } - snd_soc_unregister_codec(&client->dev); - - ep92_sysfs_remove(client, ep92); - - return 0; -} - -static const struct i2c_device_id ep92_i2c_id[] = { - { "ep92-dev", 0}, - { } -}; -MODULE_DEVICE_TABLE(i2c, ep92_i2c_id); - -static struct i2c_driver ep92_i2c_driver = { - .probe = ep92_i2c_probe, - .remove = ep92_i2c_remove, - .id_table = ep92_i2c_id, - .driver = { - .name = "ep92", - .owner = THIS_MODULE, - .of_match_table = ep92_of_match - }, -}; - -static int __init ep92_codec_init(void) -{ - int ret = 0; - - ret = i2c_add_driver(&ep92_i2c_driver); - if (ret) - pr_err("Failed to register EP92 I2C driver: %d\n", ret); - - return ret; -} -module_init(ep92_codec_init); - -static void __exit ep92_codec_exit(void) -{ - i2c_del_driver(&ep92_i2c_driver); -} -module_exit(ep92_codec_exit); - -MODULE_DESCRIPTION("EP92 HDMI repeater/switch driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/ep92/ep92.h b/techpack/audio/asoc/codecs/ep92/ep92.h deleted file mode 100644 index ad067ea1dc93..000000000000 --- a/techpack/audio/asoc/codecs/ep92/ep92.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __EP92_H__ -#define __EP92_H__ - -/* EP92 register addresses */ -/* BI = Basic Info */ -#define EP92_BI_VENDOR_ID_0 0x00 -#define EP92_BI_VENDOR_ID_1 0x01 -#define EP92_BI_DEVICE_ID_0 0x02 -#define EP92_BI_DEVICE_ID_1 0x03 -#define EP92_BI_VERSION_NUM 0x04 -#define EP92_BI_VERSION_YEAR 0x05 -#define EP92_BI_VERSION_MONTH 0x06 -#define EP92_BI_VERSION_DATE 0x07 -#define EP92_BI_GENERAL_INFO_0 0x08 -#define EP92_BI_GENERAL_INFO_1 0x09 -#define EP92_BI_GENERAL_INFO_2 0x0A -#define EP92_BI_GENERAL_INFO_3 0x0B -#define EP92_BI_GENERAL_INFO_4 0x0C -#define EP92_BI_GENERAL_INFO_5 0x0D -#define EP92_BI_GENERAL_INFO_6 0x0E - -#define EP92_ISP_MODE_ENTER_ISP 0x0F - -#define EP92_GENERAL_CONTROL_0 0x10 -#define EP92_GENERAL_CONTROL_1 0x11 -#define EP92_GENERAL_CONTROL_2 0x12 -#define EP92_GENERAL_CONTROL_3 0x13 -#define EP92_GENERAL_CONTROL_4 0x14 - -#define EP92_CEC_EVENT_CODE 0x15 -#define EP92_CEC_EVENT_PARAM_1 0x16 -#define EP92_CEC_EVENT_PARAM_2 0x17 -#define EP92_CEC_EVENT_PARAM_3 0x18 -#define EP92_CEC_EVENT_PARAM_4 0x19 -/* RESERVED 0x1A */ -/* ... ... */ -/* RESERVED 0x1F */ -#define EP92_AUDIO_INFO_SYSTEM_STATUS_0 0x20 -#define EP92_AUDIO_INFO_SYSTEM_STATUS_1 0x21 -#define EP92_AUDIO_INFO_AUDIO_STATUS 0x22 -#define EP92_AUDIO_INFO_CHANNEL_STATUS_0 0x23 -#define EP92_AUDIO_INFO_CHANNEL_STATUS_1 0x24 -#define EP92_AUDIO_INFO_CHANNEL_STATUS_2 0x25 -#define EP92_AUDIO_INFO_CHANNEL_STATUS_3 0x26 -#define EP92_AUDIO_INFO_CHANNEL_STATUS_4 0x27 -#define EP92_AUDIO_INFO_ADO_INFO_FRAME_0 0x28 -#define EP92_AUDIO_INFO_ADO_INFO_FRAME_1 0x29 -#define EP92_AUDIO_INFO_ADO_INFO_FRAME_2 0x2A -#define EP92_AUDIO_INFO_ADO_INFO_FRAME_3 0x2B -#define EP92_AUDIO_INFO_ADO_INFO_FRAME_4 0x2C -#define EP92_AUDIO_INFO_ADO_INFO_FRAME_5 0x2D - -#define EP92_OTHER_PACKETS_HDMI_VS_0 0x2E -#define EP92_OTHER_PACKETS_HDMI_VS_1 0x2F -#define EP92_OTHER_PACKETS_ACP_PACKET 0x30 -#define EP92_OTHER_PACKETS_AVI_INFO_FRAME_0 0x31 -#define EP92_OTHER_PACKETS_AVI_INFO_FRAME_1 0x32 -#define EP92_OTHER_PACKETS_AVI_INFO_FRAME_2 0x33 -#define EP92_OTHER_PACKETS_AVI_INFO_FRAME_3 0x34 -#define EP92_OTHER_PACKETS_AVI_INFO_FRAME_4 0x35 -#define EP92_OTHER_PACKETS_GC_PACKET_0 0x36 -#define EP92_OTHER_PACKETS_GC_PACKET_1 0x37 -#define EP92_OTHER_PACKETS_GC_PACKET_2 0x38 - -#define EP92_MAX_REGISTER_ADDR EP92_OTHER_PACKETS_GC_PACKET_2 - - -/* EP92 register default values */ -static struct reg_default ep92_reg_defaults[] = { - {EP92_BI_VENDOR_ID_0, 0x17}, - {EP92_BI_VENDOR_ID_1, 0x7A}, - {EP92_BI_DEVICE_ID_0, 0x94}, - {EP92_BI_DEVICE_ID_1, 0xA3}, - {EP92_BI_VERSION_NUM, 0x10}, - {EP92_BI_VERSION_YEAR, 0x09}, - {EP92_BI_VERSION_MONTH, 0x07}, - {EP92_BI_VERSION_DATE, 0x06}, - {EP92_BI_GENERAL_INFO_0, 0x00}, - {EP92_BI_GENERAL_INFO_1, 0x00}, - {EP92_BI_GENERAL_INFO_2, 0x00}, - {EP92_BI_GENERAL_INFO_3, 0x00}, - {EP92_BI_GENERAL_INFO_4, 0x00}, - {EP92_BI_GENERAL_INFO_5, 0x00}, - {EP92_BI_GENERAL_INFO_6, 0x00}, - {EP92_ISP_MODE_ENTER_ISP, 0x00}, - {EP92_GENERAL_CONTROL_0, 0x20}, - {EP92_GENERAL_CONTROL_1, 0x00}, - {EP92_GENERAL_CONTROL_2, 0x00}, - {EP92_GENERAL_CONTROL_3, 0x10}, - {EP92_GENERAL_CONTROL_4, 0x00}, - {EP92_CEC_EVENT_CODE, 0x00}, - {EP92_CEC_EVENT_PARAM_1, 0x00}, - {EP92_CEC_EVENT_PARAM_2, 0x00}, - {EP92_CEC_EVENT_PARAM_3, 0x00}, - {EP92_CEC_EVENT_PARAM_4, 0x00}, - {EP92_AUDIO_INFO_SYSTEM_STATUS_0, 0x00}, - {EP92_AUDIO_INFO_SYSTEM_STATUS_1, 0x00}, - {EP92_AUDIO_INFO_AUDIO_STATUS, 0x00}, - {EP92_AUDIO_INFO_CHANNEL_STATUS_0, 0x00}, - {EP92_AUDIO_INFO_CHANNEL_STATUS_1, 0x00}, - {EP92_AUDIO_INFO_CHANNEL_STATUS_2, 0x00}, - {EP92_AUDIO_INFO_CHANNEL_STATUS_3, 0x00}, - {EP92_AUDIO_INFO_CHANNEL_STATUS_4, 0x00}, - {EP92_AUDIO_INFO_ADO_INFO_FRAME_0, 0x00}, - {EP92_AUDIO_INFO_ADO_INFO_FRAME_1, 0x00}, - {EP92_AUDIO_INFO_ADO_INFO_FRAME_2, 0x00}, - {EP92_AUDIO_INFO_ADO_INFO_FRAME_3, 0x00}, - {EP92_AUDIO_INFO_ADO_INFO_FRAME_4, 0x00}, - {EP92_AUDIO_INFO_ADO_INFO_FRAME_5, 0x00}, - {EP92_OTHER_PACKETS_HDMI_VS_0, 0x00}, - {EP92_OTHER_PACKETS_HDMI_VS_1, 0x00}, - {EP92_OTHER_PACKETS_ACP_PACKET, 0x00}, - {EP92_OTHER_PACKETS_AVI_INFO_FRAME_0, 0x00}, - {EP92_OTHER_PACKETS_AVI_INFO_FRAME_1, 0x00}, - {EP92_OTHER_PACKETS_AVI_INFO_FRAME_2, 0x00}, - {EP92_OTHER_PACKETS_AVI_INFO_FRAME_3, 0x00}, - {EP92_OTHER_PACKETS_AVI_INFO_FRAME_4, 0x00}, - {EP92_OTHER_PACKETS_GC_PACKET_0, 0x00}, - {EP92_OTHER_PACKETS_GC_PACKET_1, 0x00}, - {EP92_OTHER_PACKETS_GC_PACKET_2, 0x00}, -}; - - -/* shift/masks for register bits - * GI = General Info - * GC = General Control - * AI = Audio Info - */ -#define EP92_GI_ADO_CHF_MASK 0x01 -#define EP92_GI_CEC_ECF_MASK 0x02 -#define EP92_GI_TX_HOT_PLUG_SHIFT 7 -#define EP92_GI_TX_HOT_PLUG_MASK 0x80 -#define EP92_GI_VIDEO_LATENCY_SHIFT 0 -#define EP92_GI_VIDEO_LATENCY_MASK 0xff - -#define EP92_GC_POWER_SHIFT 7 -#define EP92_GC_POWER_MASK 0x80 -#define EP92_GC_AUDIO_PATH_SHIFT 5 -#define EP92_GC_AUDIO_PATH_MASK 0x20 -#define EP92_GC_CEC_MUTE_SHIFT 1 -#define EP92_GC_CEC_MUTE_MASK 0x02 -#define EP92_GC_ARC_EN_SHIFT 0 -#define EP92_GC_ARC_EN_MASK 0x01 -#define EP92_GC_ARC_DIS_SHIFT 6 -#define EP92_GC_ARC_DIS_MASK 0x40 -#define EP92_GC_RX_SEL_SHIFT 0 -#define EP92_GC_RX_SEL_MASK 0x07 -#define EP92_GC_CEC_VOLUME_SHIFT 0 -#define EP92_GC_CEC_VOLUME_MASK 0xff -#define EP92_GC_LINK_ON0_SHIFT 0 -#define EP92_GC_LINK_ON0_MASK 0x01 -#define EP92_GC_LINK_ON1_SHIFT 1 -#define EP92_GC_LINK_ON1_MASK 0x02 -#define EP92_GC_LINK_ON2_SHIFT 2 -#define EP92_GC_LINK_ON2_MASK 0x04 - -#define EP92_AI_MCLK_ON_SHIFT 6 -#define EP92_AI_MCLK_ON_MASK 0x40 -#define EP92_AI_AVMUTE_SHIFT 5 -#define EP92_AI_AVMUTE_MASK 0x20 -#define EP92_AI_LAYOUT_SHIFT 0 -#define EP92_AI_LAYOUT_MASK 0x01 -#define EP92_AI_HBR_ADO_SHIFT 5 -#define EP92_AI_HBR_ADO_MASK 0x20 -#define EP92_AI_STD_ADO_SHIFT 3 -#define EP92_AI_STD_ADO_MASK 0x08 -#define EP92_AI_RATE_MASK 0x07 -#define EP92_AI_NPCM_MASK 0x02 -#define EP92_AI_CH_COUNT_MASK 0x07 -#define EP92_AI_CH_ALLOC_MASK 0xff - -#define EP92_2CHOICE_MASK 1 -#define EP92_GC_CEC_VOLUME_MIN 0 -#define EP92_GC_CEC_VOLUME_MAX 100 -#define EP92_AI_RATE_MIN 0 -#define EP92_AI_RATE_MAX 768000 -#define EP92_AI_CH_COUNT_MIN 0 -#define EP92_AI_CH_COUNT_MAX 8 -#define EP92_AI_CH_ALLOC_MIN 0 -#define EP92_AI_CH_ALLOC_MAX 0xff - -#define EP92_STATUS_NO_SIGNAL 0 -#define EP92_STATUS_AUDIO_ACTIVE 1 - -/* kcontrol storage indices */ -enum { - EP92_KCTL_POWER = 0, - EP92_KCTL_AUDIO_PATH, - EP92_KCTL_CEC_MUTE, - EP92_KCTL_ARC_EN, - EP92_KCTL_RX_SEL, - EP92_KCTL_CEC_VOLUME, - EP92_KCTL_STATE, - EP92_KCTL_AVMUTE, - EP92_KCTL_LAYOUT, - EP92_KCTL_MODE, - EP92_KCTL_RATE, - EP92_KCTL_CH_COUNT, - EP92_KCTL_CH_ALLOC, - EP92_KCTL_MAX -}; - -#endif /* __EP92_H__ */ diff --git a/techpack/audio/asoc/codecs/msm-cdc-pinctrl.c b/techpack/audio/asoc/codecs/msm-cdc-pinctrl.c deleted file mode 100644 index 79e322f1a277..000000000000 --- a/techpack/audio/asoc/codecs/msm-cdc-pinctrl.c +++ /dev/null @@ -1,259 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-cdc-pinctrl.h" - -struct msm_cdc_pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *pinctrl_active; - struct pinctrl_state *pinctrl_sleep; - int gpio; - bool state; -}; - -static struct msm_cdc_pinctrl_info *msm_cdc_pinctrl_get_gpiodata( - struct device_node *np) -{ - struct platform_device *pdev; - struct msm_cdc_pinctrl_info *gpio_data; - - if (!np) { - pr_err("%s: device node is null\n", __func__); - return NULL; - } - - pdev = of_find_device_by_node(np); - if (!pdev) { - pr_err("%s: platform device not found!\n", __func__); - return NULL; - } - - gpio_data = dev_get_drvdata(&pdev->dev); - if (!gpio_data) - dev_err(&pdev->dev, "%s: cannot find cdc gpio info\n", - __func__); - - return gpio_data; -} - -/* - * msm_cdc_get_gpio_state: select pinctrl sleep state - * @np: pointer to struct device_node - * - * Returns error code for failure and GPIO value on success - */ -int msm_cdc_get_gpio_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - int value = -EINVAL; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return value; - - if (gpio_is_valid(gpio_data->gpio)) - value = gpio_get_value_cansleep(gpio_data->gpio); - - return value; -} -EXPORT_SYMBOL(msm_cdc_get_gpio_state); - -/* - * msm_cdc_pinctrl_select_sleep_state: select pinctrl sleep state - * @np: pointer to struct device_node - * - * Returns error code for failure - */ -int msm_cdc_pinctrl_select_sleep_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return -EINVAL; - - if (!gpio_data->pinctrl_sleep) { - pr_err("%s: pinctrl sleep state is null\n", __func__); - return -EINVAL; - } - gpio_data->state = false; - - return pinctrl_select_state(gpio_data->pinctrl, - gpio_data->pinctrl_sleep); -} -EXPORT_SYMBOL(msm_cdc_pinctrl_select_sleep_state); - -/* - * msm_cdc_pinctrl_select_active_state: select pinctrl active state - * @np: pointer to struct device_node - * - * Returns error code for failure - */ -int msm_cdc_pinctrl_select_active_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return -EINVAL; - - if (!gpio_data->pinctrl_active) { - pr_err("%s: pinctrl active state is null\n", __func__); - return -EINVAL; - } - gpio_data->state = true; - - return pinctrl_select_state(gpio_data->pinctrl, - gpio_data->pinctrl_active); -} -EXPORT_SYMBOL(msm_cdc_pinctrl_select_active_state); - -/* - * msm_cdc_pinctrl_get_state: get curren pinctrl state - * @np: pointer to struct device_node - * - * Returns 0 for sleep state, 1 for active state - */ -bool msm_cdc_pinctrl_get_state(struct device_node *np) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = msm_cdc_pinctrl_get_gpiodata(np); - if (!gpio_data) - return -EINVAL; - - return gpio_data->state; -} -EXPORT_SYMBOL(msm_cdc_pinctrl_get_state); - -static int msm_cdc_pinctrl_probe(struct platform_device *pdev) -{ - int ret = 0; - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = devm_kzalloc(&pdev->dev, - sizeof(struct msm_cdc_pinctrl_info), - GFP_KERNEL); - if (!gpio_data) - return -ENOMEM; - - gpio_data->pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(gpio_data->pinctrl)) { - dev_err(&pdev->dev, "%s: Cannot get cdc gpio pinctrl:%ld\n", - __func__, PTR_ERR(gpio_data->pinctrl)); - ret = PTR_ERR(gpio_data->pinctrl); - goto err_pctrl_get; - } - - gpio_data->pinctrl_active = pinctrl_lookup_state( - gpio_data->pinctrl, "aud_active"); - if (IS_ERR_OR_NULL(gpio_data->pinctrl_active)) { - dev_err(&pdev->dev, "%s: Cannot get aud_active pinctrl state:%ld\n", - __func__, PTR_ERR(gpio_data->pinctrl_active)); - ret = PTR_ERR(gpio_data->pinctrl_active); - goto err_lookup_state; - } - - gpio_data->pinctrl_sleep = pinctrl_lookup_state( - gpio_data->pinctrl, "aud_sleep"); - if (IS_ERR_OR_NULL(gpio_data->pinctrl_sleep)) { - dev_err(&pdev->dev, "%s: Cannot get aud_sleep pinctrl state:%ld\n", - __func__, PTR_ERR(gpio_data->pinctrl_sleep)); - ret = PTR_ERR(gpio_data->pinctrl_sleep); - goto err_lookup_state; - } - /* skip setting to sleep state for LPI_TLMM GPIOs */ - if (!of_property_read_bool(pdev->dev.of_node, "qcom,lpi-gpios")) { - /* Set pinctrl state to aud_sleep by default */ - ret = pinctrl_select_state(gpio_data->pinctrl, - gpio_data->pinctrl_sleep); - if (ret) - dev_err(&pdev->dev, "%s: set cdc gpio sleep state fail: %d\n", - __func__, ret); - } - - gpio_data->gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,cdc-rst-n-gpio", 0); - if (gpio_is_valid(gpio_data->gpio)) { - ret = gpio_request(gpio_data->gpio, "MSM_CDC_RESET"); - if (ret) { - dev_err(&pdev->dev, "%s: Failed to request gpio %d\n", - __func__, gpio_data->gpio); - goto err_lookup_state; - } - } - - dev_set_drvdata(&pdev->dev, gpio_data); - return 0; - -err_lookup_state: - devm_pinctrl_put(gpio_data->pinctrl); -err_pctrl_get: - devm_kfree(&pdev->dev, gpio_data); - return ret; -} - -static int msm_cdc_pinctrl_remove(struct platform_device *pdev) -{ - struct msm_cdc_pinctrl_info *gpio_data; - - gpio_data = dev_get_drvdata(&pdev->dev); - - /* to free the requested gpio before exiting */ - if (gpio_data) { - if (gpio_is_valid(gpio_data->gpio)) - gpio_free(gpio_data->gpio); - - if (gpio_data->pinctrl) - devm_pinctrl_put(gpio_data->pinctrl); - } - - devm_kfree(&pdev->dev, gpio_data); - - return 0; -} - -static const struct of_device_id msm_cdc_pinctrl_match[] = { - {.compatible = "qcom,msm-cdc-pinctrl"}, - {} -}; - -static struct platform_driver msm_cdc_pinctrl_driver = { - .driver = { - .name = "msm-cdc-pinctrl", - .owner = THIS_MODULE, - .of_match_table = msm_cdc_pinctrl_match, - }, - .probe = msm_cdc_pinctrl_probe, - .remove = msm_cdc_pinctrl_remove, -}; - -int msm_cdc_pinctrl_drv_init(void) -{ - return platform_driver_register(&msm_cdc_pinctrl_driver); -} - -void msm_cdc_pinctrl_drv_exit(void) -{ - platform_driver_unregister(&msm_cdc_pinctrl_driver); -} -MODULE_DESCRIPTION("MSM CODEC pin control platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/msm-cdc-pinctrl.h b/techpack/audio/asoc/codecs/msm-cdc-pinctrl.h deleted file mode 100644 index 4286fffa3bf4..000000000000 --- a/techpack/audio/asoc/codecs/msm-cdc-pinctrl.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MFD_CDC_PINCTRL_H_ -#define __MFD_CDC_PINCTRL_H_ - -#include -#include - -#if IS_ENABLED(CONFIG_MSM_CDC_PINCTRL) -extern int msm_cdc_pinctrl_select_sleep_state(struct device_node *np); -extern int msm_cdc_pinctrl_select_active_state(struct device_node *np); -extern bool msm_cdc_pinctrl_get_state(struct device_node *np); -extern int msm_cdc_get_gpio_state(struct device_node *np); -int msm_cdc_pinctrl_drv_init(void); -void msm_cdc_pinctrl_drv_exit(void); - -#else -int msm_cdc_pinctrl_select_sleep_state(struct device_node *np) -{ - return 0; -} -int msm_cdc_pinctrl_select_active_state(struct device_node *np) -{ - return 0; -} -int msm_cdc_get_gpio_state(struct device_node *np) -{ - return 0; -} -int msm_cdc_pinctrl_drv_init(void) -{ - return 0; -} -void msm_cdc_pinctrl_drv_exit(void) -{ -} -bool msm_cdc_pinctrl_get_state(struct device_node *np) -{ - return true; -} -#endif - -#endif diff --git a/techpack/audio/asoc/codecs/msm-cdc-supply.c b/techpack/audio/asoc/codecs/msm-cdc-supply.c deleted file mode 100644 index 1b3c5f9381cf..000000000000 --- a/techpack/audio/asoc/codecs/msm-cdc-supply.c +++ /dev/null @@ -1,548 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include "msm-cdc-supply.h" -#include - -#define CODEC_DT_MAX_PROP_SIZE 40 - -static int msm_cdc_dt_parse_vreg_info(struct device *dev, - struct cdc_regulator *cdc_vreg, - const char *name, bool is_ond) -{ - char prop_name[CODEC_DT_MAX_PROP_SIZE]; - struct device_node *regulator_node = NULL; - const __be32 *prop; - int len, rc; - u32 prop_val; - - /* Parse supply name */ - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "%s-supply", name); - - regulator_node = of_parse_phandle(dev->of_node, prop_name, 0); - if (!regulator_node) { - dev_err(dev, "%s: Looking up %s property in node %s failed", - __func__, prop_name, dev->of_node->full_name); - rc = -EINVAL; - goto done; - } - cdc_vreg->name = name; - cdc_vreg->ondemand = is_ond; - - /* Parse supply - voltage */ - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "qcom,%s-voltage", name); - prop = of_get_property(dev->of_node, prop_name, &len); - if (!prop || (len != (2 * sizeof(__be32)))) { - dev_err(dev, "%s: %s %s property\n", __func__, - prop ? "invalid format" : "no", prop_name); - rc = -EINVAL; - goto done; - } else { - cdc_vreg->min_uV = be32_to_cpup(&prop[0]); - cdc_vreg->max_uV = be32_to_cpup(&prop[1]); - } - - /* Parse supply - current */ - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "qcom,%s-current", name); - rc = of_property_read_u32(dev->of_node, prop_name, &prop_val); - if (rc) { - dev_err(dev, "%s: Looking up %s property in node %s failed", - __func__, prop_name, dev->of_node->full_name); - goto done; - } - cdc_vreg->optimum_uA = prop_val; - - dev_info(dev, "%s: %s: vol=[%d %d]uV, curr=[%d]uA, ond %d\n", - __func__, cdc_vreg->name, cdc_vreg->min_uV, cdc_vreg->max_uV, - cdc_vreg->optimum_uA, cdc_vreg->ondemand); - -done: - return rc; -} - -static int msm_cdc_parse_supplies(struct device *dev, - struct cdc_regulator *cdc_reg, - const char *sup_list, int sup_cnt, - bool is_ond) -{ - int idx, rc = 0; - const char *name = NULL; - - for (idx = 0; idx < sup_cnt; idx++) { - rc = of_property_read_string_index(dev->of_node, sup_list, idx, - &name); - if (rc) { - dev_err(dev, "%s: read string %s[%d] error (%d)\n", - __func__, sup_list, idx, rc); - goto done; - } - - dev_dbg(dev, "%s: Found cdc supply %s as part of %s\n", - __func__, name, sup_list); - - rc = msm_cdc_dt_parse_vreg_info(dev, &cdc_reg[idx], name, - is_ond); - if (rc) { - dev_err(dev, "%s: parse %s vreg info failed (%d)\n", - __func__, name, rc); - goto done; - } - } - -done: - return rc; -} - -static int msm_cdc_check_supply_param(struct device *dev, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - if (!dev) { - pr_err("%s: device is NULL\n", __func__); - return -ENODEV; - } - - if (!cdc_vreg || (num_supplies <= 0)) { - dev_err(dev, "%s: supply check failed: vreg: %pK, num_supplies: %d\n", - __func__, cdc_vreg, num_supplies); - return -EINVAL; - } - - return 0; -} - -/* - * msm_cdc_disable_ondemand_supply: - * Disable codec ondemand supply - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * @supply_name: Ondemand supply name to be enabled - * - * Return error code if supply disable is failed - */ -int msm_cdc_disable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, - char *supply_name) -{ - int rc, i; - - if ((!supply_name) || (!supplies)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand && - !strcmp(cdc_vreg[i].name, supply_name)) { - rc = regulator_disable(supplies[i].consumer); - if (rc) - dev_err(dev, "%s: failed to disable supply %s, err:%d\n", - __func__, supplies[i].supply, rc); - break; - } - } - if (i == num_supplies) { - dev_err(dev, "%s: not able to find supply %s\n", - __func__, supply_name); - rc = -EINVAL; - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_disable_ondemand_supply); - -/* - * msm_cdc_enable_ondemand_supply: - * Enable codec ondemand supply - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * @supply_name: Ondemand supply name to be enabled - * - * Return error code if supply enable is failed - */ -int msm_cdc_enable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, - char *supply_name) -{ - int rc, i; - - if ((!supply_name) || (!supplies)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand && - !strcmp(cdc_vreg[i].name, supply_name)) { - rc = regulator_enable(supplies[i].consumer); - if (rc) - dev_err(dev, "%s: failed to enable supply %s, rc: %d\n", - __func__, supplies[i].supply, rc); - break; - } - } - if (i == num_supplies) { - dev_err(dev, "%s: not able to find supply %s\n", - __func__, supply_name); - rc = -EINVAL; - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_enable_ondemand_supply); - -/* - * msm_cdc_disable_static_supplies: - * Disable codec static supplies - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply disable is failed - */ -int msm_cdc_disable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - int rc, i; - - if ((!dev) || (!supplies) || (!cdc_vreg)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand) - continue; - - rc = regulator_disable(supplies[i].consumer); - if (rc) - dev_err(dev, "%s: failed to disable supply %s, err:%d\n", - __func__, supplies[i].supply, rc); - else - dev_dbg(dev, "%s: disabled regulator %s\n", - __func__, supplies[i].supply); - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_disable_static_supplies); - -/* - * msm_cdc_release_supplies: - * Release codec power supplies - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply disable is failed - */ -int msm_cdc_release_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - int rc = 0; - int i; - - if ((!dev) || (!supplies) || (!cdc_vreg)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - msm_cdc_disable_static_supplies(dev, supplies, cdc_vreg, - num_supplies); - for (i = 0; i < num_supplies; i++) { - if (regulator_count_voltages(supplies[i].consumer) < 0) - continue; - - regulator_set_voltage(supplies[i].consumer, 0, - cdc_vreg[i].max_uV); - regulator_set_load(supplies[i].consumer, 0); - } - - return rc; -} -EXPORT_SYMBOL(msm_cdc_release_supplies); - -/* - * msm_cdc_enable_static_supplies: - * Enable codec static supplies - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply enable is failed - */ -int msm_cdc_enable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - int rc, i; - - if ((!dev) || (!supplies) || (!cdc_vreg)) { - pr_err("%s: either dev or supplies or cdc_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - for (i = 0; i < num_supplies; i++) { - if (cdc_vreg[i].ondemand) - continue; - - rc = regulator_enable(supplies[i].consumer); - if (rc) { - dev_err(dev, "%s: failed to enable supply %s, rc: %d\n", - __func__, supplies[i].supply, rc); - break; - } - } - - while (rc && i--) - if (!cdc_vreg[i].ondemand) - regulator_disable(supplies[i].consumer); - - return rc; -} -EXPORT_SYMBOL(msm_cdc_enable_static_supplies); - -/* - * msm_cdc_init_supplies: - * Initialize codec static supplies with regulator get - * - * @dev: pointer to codec device - * @supplies: pointer to regulator bulk data - * @cdc_vreg: pointer to platform regulator data - * @num_supplies: number of supplies - * - * Return error code if supply init is failed - */ -int msm_cdc_init_supplies(struct device *dev, - struct regulator_bulk_data **supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies) -{ - struct regulator_bulk_data *vsup; - int rc; - int i; - - if (!dev || !cdc_vreg) { - pr_err("%s: device pointer or dce_vreg is NULL\n", - __func__); - return -EINVAL; - } - /* input parameter validation */ - rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); - if (rc) - return rc; - - vsup = devm_kcalloc(dev, num_supplies, - sizeof(struct regulator_bulk_data), - GFP_KERNEL); - if (!vsup) - return -ENOMEM; - - for (i = 0; i < num_supplies; i++) { - if (!cdc_vreg[i].name) { - dev_err(dev, "%s: supply name not defined\n", - __func__); - rc = -EINVAL; - goto err_supply; - } - vsup[i].supply = cdc_vreg[i].name; - } - - rc = devm_regulator_bulk_get(dev, num_supplies, vsup); - if (rc) { - dev_err(dev, "%s: failed to get supplies (%d)\n", - __func__, rc); - goto err_supply; - } - - /* Set voltage and current on regulators */ - for (i = 0; i < num_supplies; i++) { - if (regulator_count_voltages(vsup[i].consumer) < 0) - continue; - - rc = regulator_set_voltage(vsup[i].consumer, - cdc_vreg[i].min_uV, - cdc_vreg[i].max_uV); - if (rc) { - dev_err(dev, "%s: set regulator voltage failed for %s, err:%d\n", - __func__, vsup[i].supply, rc); - goto err_supply; - } - rc = regulator_set_load(vsup[i].consumer, - cdc_vreg[i].optimum_uA); - if (rc < 0) { - dev_err(dev, "%s: set regulator optimum mode failed for %s, err:%d\n", - __func__, vsup[i].supply, rc); - goto err_supply; - } - } - - *supplies = vsup; - - return 0; - -err_supply: - return rc; -} -EXPORT_SYMBOL(msm_cdc_init_supplies); - -/* - * msm_cdc_get_power_supplies: - * Get codec power supplies from device tree. - * Allocate memory to hold regulator data for - * all power supplies. - * - * @dev: pointer to codec device - * @cdc_vreg: pointer to codec regulator - * @total_num_supplies: total number of supplies read from DT - * - * Return error code if supply disable is failed - */ -int msm_cdc_get_power_supplies(struct device *dev, - struct cdc_regulator **cdc_vreg, - int *total_num_supplies) -{ - const char *static_prop_name = "qcom,cdc-static-supplies"; - const char *ond_prop_name = "qcom,cdc-on-demand-supplies"; - const char *cp_prop_name = "qcom,cdc-cp-supplies"; - int static_sup_cnt = 0; - int ond_sup_cnt = 0; - int cp_sup_cnt = 0; - int num_supplies = 0; - struct cdc_regulator *cdc_reg; - int rc; - - if (!dev) { - pr_err("%s: device pointer is NULL\n", __func__); - return -EINVAL; - } - static_sup_cnt = of_property_count_strings(dev->of_node, - static_prop_name); - if (static_sup_cnt < 0) { - dev_err(dev, "%s: Failed to get static supplies(%d)\n", - __func__, static_sup_cnt); - rc = static_sup_cnt; - goto err_supply_cnt; - } - ond_sup_cnt = of_property_count_strings(dev->of_node, ond_prop_name); - if (ond_sup_cnt < 0) - ond_sup_cnt = 0; - - cp_sup_cnt = of_property_count_strings(dev->of_node, - cp_prop_name); - if (cp_sup_cnt < 0) - cp_sup_cnt = 0; - - num_supplies = static_sup_cnt + ond_sup_cnt + cp_sup_cnt; - if (num_supplies <= 0) { - dev_err(dev, "%s: supply count is 0 or negative\n", __func__); - rc = -EINVAL; - goto err_supply_cnt; - } - - cdc_reg = devm_kcalloc(dev, num_supplies, - sizeof(struct cdc_regulator), - GFP_KERNEL); - if (!cdc_reg) { - rc = -ENOMEM; - goto err_mem_alloc; - } - - rc = msm_cdc_parse_supplies(dev, cdc_reg, static_prop_name, - static_sup_cnt, false); - if (rc) { - dev_err(dev, "%s: failed to parse static supplies(%d)\n", - __func__, rc); - goto err_sup; - } - - rc = msm_cdc_parse_supplies(dev, &cdc_reg[static_sup_cnt], - ond_prop_name, ond_sup_cnt, - true); - if (rc) { - dev_err(dev, "%s: failed to parse demand supplies(%d)\n", - __func__, rc); - goto err_sup; - } - - rc = msm_cdc_parse_supplies(dev, - &cdc_reg[static_sup_cnt + ond_sup_cnt], - cp_prop_name, cp_sup_cnt, true); - if (rc) { - dev_err(dev, "%s: failed to parse cp supplies(%d)\n", - __func__, rc); - goto err_sup; - } - - *cdc_vreg = cdc_reg; - *total_num_supplies = num_supplies; - - return 0; - -err_sup: -err_supply_cnt: -err_mem_alloc: - return rc; -} -EXPORT_SYMBOL(msm_cdc_get_power_supplies); diff --git a/techpack/audio/asoc/codecs/msm-cdc-supply.h b/techpack/audio/asoc/codecs/msm-cdc-supply.h deleted file mode 100644 index b6516fa944be..000000000000 --- a/techpack/audio/asoc/codecs/msm-cdc-supply.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (c) 2016, 2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __CODEC_POWER_SUPPLY_H__ -#define __CODEC_POWER_SUPPLY_H__ - -#include -#include -#include - -struct cdc_regulator { - const char *name; - int min_uV; - int max_uV; - int optimum_uA; - bool ondemand; - struct regulator *regulator; -}; - -extern int msm_cdc_get_power_supplies(struct device *dev, - struct cdc_regulator **cdc_vreg, - int *total_num_supplies); -extern int msm_cdc_disable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, char *supply_name); -extern int msm_cdc_enable_ondemand_supply(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies, char *supply_name); -extern int msm_cdc_disable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -extern int msm_cdc_release_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -extern int msm_cdc_enable_static_supplies(struct device *dev, - struct regulator_bulk_data *supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -extern int msm_cdc_init_supplies(struct device *dev, - struct regulator_bulk_data **supplies, - struct cdc_regulator *cdc_vreg, - int num_supplies); -#endif diff --git a/techpack/audio/asoc/codecs/msm_hdmi_codec_rx.c b/techpack/audio/asoc/codecs/msm_hdmi_codec_rx.c deleted file mode 100644 index 862fe46b8fd2..000000000000 --- a/techpack/audio/asoc/codecs/msm_hdmi_codec_rx.c +++ /dev/null @@ -1,768 +0,0 @@ -/* Copyright (c) 2012-2018,2020 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MSM_EXT_DISP_PCM_RATES SNDRV_PCM_RATE_48000 -#define AUD_EXT_DISP_ACK_DISCONNECT (AUDIO_ACK_CONNECT ^ AUDIO_ACK_CONNECT) -#define AUD_EXT_DISP_ACK_CONNECT (AUDIO_ACK_CONNECT) -#define AUD_EXT_DISP_ACK_ENABLE (AUDIO_ACK_SET_ENABLE | AUDIO_ACK_ENABLE) - -#define SOC_EXT_DISP_AUDIO_TYPE(index) \ - static SOC_ENUM_SINGLE_DECL(ext_disp_audio_type##index, SND_SOC_NOPM, \ - index, ext_disp_audio_type_text) -#define SOC_EXT_DISP_AUDIO_ACK_STATE(index) \ - static SOC_ENUM_SINGLE_DECL(ext_disp_audio_ack_state##index, \ - SND_SOC_NOPM, index, ext_disp_audio_ack_text) - -#define SWITCH_DP_CODEC(codec_info, codec_data, dai_id) \ - codec_info.type = EXT_DISPLAY_TYPE_DP; \ - codec_info.ctrl_id = codec_data->ctl[dai_id]; \ - codec_info.stream_id = codec_data->stream[dai_id]; \ - -enum { - DP_STREAM0 = 0, - DP_STREAM1, - DP_STREAM_MAX, -}; - -enum { - DP_DAI1 = 0, - DP_DAI2, - HDMI_DAI, - DP_DAI_MAX, -}; - -static const char *const ext_disp_audio_type_text[] = {"None", "HDMI", "DP"}; -static const char *const ext_disp_audio_ack_text[] = {"Disconnect", "Connect", - "Ack_Enable"}; - -SOC_EXT_DISP_AUDIO_TYPE(0); -SOC_EXT_DISP_AUDIO_ACK_STATE(0); -SOC_EXT_DISP_AUDIO_TYPE(1); -SOC_EXT_DISP_AUDIO_ACK_STATE(1); - -struct msm_ext_disp_audio_codec_rx_data { - struct platform_device *ext_disp_core_pdev; - struct msm_ext_disp_audio_codec_ops ext_disp_ops; - int cable_status; - struct mutex dp_ops_lock; - int stream[DP_DAI_MAX]; - int ctl[DP_DAI_MAX]; -}; - -static int msm_ext_disp_edid_ctl_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - struct msm_ext_disp_audio_edid_blk edid_blk; - int rc = 0; - struct msm_ext_disp_codec_id codec_info; - int dai_id = kcontrol->private_value; - - codec_data = snd_soc_codec_get_drvdata(codec); - - if (!codec_data) { - dev_err(codec->dev, "%s: codec_data is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) { - dev_dbg(codec->dev, "%s: get_audio_edid_blk() is NULL\n", - __func__); - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = 0; - mutex_unlock(&codec_data->dp_ops_lock); - return 0; - } - rc = codec_data->ext_disp_ops.get_audio_edid_blk( - codec_data->ext_disp_core_pdev, &edid_blk); - mutex_unlock(&codec_data->dp_ops_lock); - if (rc >= 0) { - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = edid_blk.audio_data_blk_size + - edid_blk.spk_alloc_data_blk_size; - } - - dev_dbg(codec->dev, "%s: count: %d\n", __func__, uinfo->count); - - return rc; -} - -static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - struct msm_ext_disp_audio_edid_blk edid_blk; - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - int dai_id = kcontrol->private_value; - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, "%s: codec_data is NULL\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) { - dev_err(codec->dev, "%s: get_audio_edid_blk() is NULL\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return -EINVAL; - } - rc = codec_data->ext_disp_ops.get_audio_edid_blk( - codec_data->ext_disp_core_pdev, &edid_blk); - mutex_unlock(&codec_data->dp_ops_lock); - if (rc >= 0) { - if (sizeof(ucontrol->value.bytes.data) < - (edid_blk.audio_data_blk_size + - edid_blk.spk_alloc_data_blk_size)) { - dev_err(codec->dev, - "%s: Not enough memory to copy EDID data\n", - __func__); - return -ENOMEM; - } - - memcpy(ucontrol->value.bytes.data, - edid_blk.audio_data_blk, - edid_blk.audio_data_blk_size); - memcpy((ucontrol->value.bytes.data + - edid_blk.audio_data_blk_size), - edid_blk.spk_alloc_data_blk, - edid_blk.spk_alloc_data_blk_size); - - dev_dbg(codec->dev, "%s: data_blk_size:%d, spk_alloc_data_blk_size:%d\n", - __func__, edid_blk.audio_data_blk_size, - edid_blk.spk_alloc_data_blk_size); - } - - return rc; -} - -static int msm_ext_disp_audio_type_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - enum msm_ext_disp_cable_state cable_state; - enum msm_ext_disp_type disp_type; - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l; - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, "%s: codec_data is NULL\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if(!codec_data->ext_disp_ops.get_audio_edid_blk || - !codec_data->ext_disp_ops.get_intf_id || rc) { - dev_err(codec->dev, "%s: get_audio_edid_blk() or get_intf_id is NULL\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return -EINVAL; - } - cable_state = codec_data->ext_disp_ops.cable_status( - codec_data->ext_disp_core_pdev, 1); - if (cable_state < 0) { - dev_err(codec->dev, "%s: Error retrieving cable state from ext_disp, err:%d\n", - __func__, cable_state); - rc = cable_state; - goto cable_err; - } - - codec_data->cable_status = cable_state; - if (cable_state == EXT_DISPLAY_CABLE_DISCONNECT) { - dev_err(codec->dev, "%s: Display cable disconnected\n", - __func__); - ucontrol->value.integer.value[0] = 0; - rc = 0; - goto cable_err; - } - - disp_type = codec_data->ext_disp_ops.get_intf_id( - codec_data->ext_disp_core_pdev); - mutex_unlock(&codec_data->dp_ops_lock); - if (disp_type >= 0) { - switch (disp_type) { - case EXT_DISPLAY_TYPE_DP: - ucontrol->value.integer.value[0] = 2; - rc = 0; - break; - case EXT_DISPLAY_TYPE_HDMI: - ucontrol->value.integer.value[0] = 1; - rc = 0; - break; - default: - rc = -EINVAL; - dev_err(codec->dev, "%s: Invalid disp_type:%d\n", - __func__, disp_type); - goto done; - } - dev_dbg(codec->dev, "%s: Display type: %d\n", - __func__, disp_type); - } else { - dev_err(codec->dev, "%s: Error retrieving disp_type from ext_disp, err:%d\n", - __func__, disp_type); - rc = disp_type; - } - return rc; - -cable_err: - mutex_unlock(&codec_data->dp_ops_lock); -done: - return rc; -} - -static int msm_ext_disp_audio_ack_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - u32 ack_state = 0; - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l; - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, - "%s: codec_data is NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - dev_dbg(codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai_id], codec_data->stream[dai_id]); - - switch (ucontrol->value.enumerated.item[0]) { - case 0: - ack_state = AUD_EXT_DISP_ACK_DISCONNECT; - break; - case 1: - ack_state = AUD_EXT_DISP_ACK_CONNECT; - break; - case 2: - ack_state = AUD_EXT_DISP_ACK_ENABLE; - break; - default: - rc = -EINVAL; - dev_err(codec->dev, - "%s: invalid value %d for mixer ctl\n", - __func__, ucontrol->value.enumerated.item[0]); - goto done; - } - dev_dbg(codec->dev, "%s: control %d, ack set value 0x%x\n", - __func__, ucontrol->value.enumerated.item[0], ack_state); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai_id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if(!codec_data->ext_disp_ops.acknowledge || rc) { - dev_err(codec->dev, - "%s: ops acknowledge() is NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - rc = codec_data->ext_disp_ops.acknowledge( - codec_data->ext_disp_core_pdev, ack_state); - mutex_unlock(&codec_data->dp_ops_lock); - if (rc < 0) { - dev_err(codec->dev, "%s: error from acknowledge(), err:%d\n", - __func__, rc); - } - -done: - mutex_unlock(&codec_data->dp_ops_lock); - return rc; -} - -static int msm_ext_disp_audio_device_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_ext_disp_audio_codec_rx_data *codec_data; - int rc = 0; - int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l; - - codec_data = snd_soc_codec_get_drvdata(codec); - if (!codec_data) { - dev_err(codec->dev, - "%s: codec_data or ops acknowledge() is NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - mutex_lock(&codec_data->dp_ops_lock); - codec_data->ctl[dai_id] = ucontrol->value.enumerated.item[0]; - codec_data->stream[dai_id] = ucontrol->value.enumerated.item[1]; - mutex_unlock(&codec_data->dp_ops_lock); - -done: - return rc; -} - -static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_VOLATILE, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "HDMI EDID", - .info = msm_ext_disp_edid_ctl_info, - .get = msm_ext_disp_edid_get, - .private_value = HDMI_DAI, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_VOLATILE, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "Display Port EDID", - .info = msm_ext_disp_edid_ctl_info, - .get = msm_ext_disp_edid_get, - .private_value = DP_DAI1, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_VOLATILE, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "Display Port1 EDID", - .info = msm_ext_disp_edid_ctl_info, - .get = msm_ext_disp_edid_get, - .private_value = DP_DAI2, - }, - SOC_ENUM_EXT("External Display Type", - ext_disp_audio_type0, - msm_ext_disp_audio_type_get, NULL), - SOC_ENUM_EXT("External Display1 Type", - ext_disp_audio_type1, - msm_ext_disp_audio_type_get, NULL), - SOC_ENUM_EXT("External Display Audio Ack", - ext_disp_audio_ack_state0, - NULL, msm_ext_disp_audio_ack_set), - SOC_ENUM_EXT("External Display1 Audio Ack", - ext_disp_audio_ack_state1, - NULL, msm_ext_disp_audio_ack_set), - - SOC_SINGLE_EXT("External Display Audio Device", - SND_SOC_NOPM, DP_DAI1, DP_STREAM_MAX, 0, - NULL, msm_ext_disp_audio_device_set), - SOC_SINGLE_EXT("External Display1 Audio Device", - SND_SOC_NOPM, DP_DAI2, DP_STREAM_MAX, 0, - NULL, msm_ext_disp_audio_device_set), -}; - -static int msm_ext_disp_audio_codec_rx_dai_startup( - struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int ret = 0, rc = 0; - struct msm_ext_disp_codec_id codec_info; - struct msm_ext_disp_audio_codec_rx_data *codec_data = - dev_get_drvdata(dai->codec->dev); - - if (!codec_data) { - dev_err(dai->dev, "%s() codec_data is null\n", - __func__); - return -EINVAL; - } - - dev_dbg(dai->codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai->id], codec_data->stream[dai->id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai->id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if(!codec_data->ext_disp_ops.cable_status || rc) { - dev_err(dai->dev, "%s() cable_status is null\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return -EINVAL; - } - codec_data->cable_status = - codec_data->ext_disp_ops.cable_status( - codec_data->ext_disp_core_pdev, 1); - mutex_unlock(&codec_data->dp_ops_lock); - if (codec_data->cable_status < 0) { - dev_err(dai->dev, - "%s() ext disp core is not ready (ret val = %d)\n", - __func__, codec_data->cable_status); - ret = codec_data->cable_status; - } else if (!codec_data->cable_status) { - dev_err(dai->dev, - "%s() ext disp cable is not connected (ret val = %d)\n", - __func__, codec_data->cable_status); - ret = -ENODEV; - } - - return ret; -} - -static int msm_ext_disp_audio_codec_rx_dai_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - u32 channel_allocation = 0; - u32 level_shift = 0; /* 0dB */ - bool down_mix = 0; - u32 num_channels = params_channels(params); - struct msm_ext_disp_codec_id codec_info; - int rc = 0; - struct msm_ext_disp_audio_setup_params audio_setup_params = {0}; - - struct msm_ext_disp_audio_codec_rx_data *codec_data = - dev_get_drvdata(dai->codec->dev); - - if (!codec_data || !codec_data->ext_disp_ops.audio_info_setup) { - dev_err(dai->dev, "%s: codec_data or audio_info_setup is null\n", - __func__); - return -EINVAL; - } - - dev_dbg(dai->codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai->id], codec_data->stream[dai->id]); - - if (codec_data->cable_status < 0) { - dev_err_ratelimited(dai->dev, - "%s() ext disp core is not ready (ret val = %d)\n", - __func__, codec_data->cable_status); - return codec_data->cable_status; - } else if (!codec_data->cable_status) { - dev_err_ratelimited(dai->dev, - "%s() ext disp cable is not connected (ret val = %d)\n", - __func__, codec_data->cable_status); - return -ENODEV; - } - - /*refer to HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4*/ - switch (num_channels) { - case 2: - channel_allocation = 0; - break; - case 3: - channel_allocation = 0x02;/*default to FL/FR/FC*/ - audio_setup_params.sample_present = 0x3; - break; - case 4: - channel_allocation = 0x06;/*default to FL/FR/FC/RC*/ - audio_setup_params.sample_present = 0x7; - break; - case 5: - channel_allocation = 0x0A;/*default to FL/FR/FC/RR/RL*/ - audio_setup_params.sample_present = 0x7; - break; - case 6: - channel_allocation = 0x0B; - audio_setup_params.sample_present = 0x7; - break; - case 7: - channel_allocation = 0x12;/*default to FL/FR/FC/RL/RR/RRC/RLC*/ - audio_setup_params.sample_present = 0xf; - break; - case 8: - channel_allocation = 0x13; - audio_setup_params.sample_present = 0xf; - break; - default: - dev_err(dai->dev, "invalid Channels = %u\n", num_channels); - return -EINVAL; - } - - dev_dbg(dai->dev, - "%s() num_ch %u samplerate %u channel_allocation = %u\n", - __func__, num_channels, params_rate(params), - channel_allocation); - - audio_setup_params.sample_rate_hz = params_rate(params); - audio_setup_params.num_of_channels = num_channels; - audio_setup_params.channel_allocation = channel_allocation; - audio_setup_params.level_shift = level_shift; - audio_setup_params.down_mix = down_mix; - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai->id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if (rc) - goto end; - rc = codec_data->ext_disp_ops.audio_info_setup( - codec_data->ext_disp_core_pdev, &audio_setup_params); -end: - mutex_unlock(&codec_data->dp_ops_lock); - if (rc < 0) { - dev_err_ratelimited(dai->dev, - "%s() ext disp core is not ready, rc: %d\n", - __func__, rc); - } - - return rc; -} - -static void msm_ext_disp_audio_codec_rx_dai_shutdown( - struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_ext_disp_codec_id codec_info; - - struct msm_ext_disp_audio_codec_rx_data *codec_data = - dev_get_drvdata(dai->codec->dev); - - if (!codec_data) { - dev_err(dai->dev, "%s: codec data is null\n", - __func__); - return; - } - - dev_dbg(dai->codec->dev, "%s: DP ctl id %d Stream id %d\n", __func__, - codec_data->ctl[dai->id], codec_data->stream[dai->id]); - - mutex_lock(&codec_data->dp_ops_lock); - SWITCH_DP_CODEC(codec_info, codec_data, dai->id); - rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev, - &codec_info); - if (!codec_data->ext_disp_ops.teardown_done || - !codec_data->ext_disp_ops.cable_status || rc) { - dev_err(dai->dev, "%s: teardown_done or cable_status is null\n", - __func__); - mutex_unlock(&codec_data->dp_ops_lock); - return; - } - rc = codec_data->ext_disp_ops.cable_status( - codec_data->ext_disp_core_pdev, 0); - if (rc < 0) { - dev_err(dai->dev, - "%s: ext disp core had problems releasing audio flag\n", - __func__); - } - - codec_data->ext_disp_ops.teardown_done( - codec_data->ext_disp_core_pdev); - mutex_unlock(&codec_data->dp_ops_lock); -} - -static int msm_ext_disp_audio_codec_rx_probe(struct snd_soc_codec *codec) -{ - struct msm_ext_disp_audio_codec_rx_data *codec_data; - struct device_node *of_node_parent = NULL; - - codec_data = kzalloc(sizeof(struct msm_ext_disp_audio_codec_rx_data), - GFP_KERNEL); - - if (!codec_data) { - dev_err(codec->dev, "%s(): fail to allocate dai data\n", - __func__); - return -ENOMEM; - } - - of_node_parent = of_get_parent(codec->dev->of_node); - if (!of_node_parent) { - dev_err(codec->dev, "%s(): Parent device tree node not found\n", - __func__); - kfree(codec_data); - return -ENODEV; - } - - codec_data->ext_disp_core_pdev = of_find_device_by_node(of_node_parent); - if (!codec_data->ext_disp_core_pdev) { - dev_err(codec->dev, "%s(): can't get parent pdev\n", __func__); - kfree(codec_data); - return -ENODEV; - } - - if (msm_ext_disp_register_audio_codec(codec_data->ext_disp_core_pdev, - &codec_data->ext_disp_ops)) { - dev_err(codec->dev, "%s(): can't register with ext disp core", - __func__); - kfree(codec_data); - return -ENODEV; - } - - mutex_init(&codec_data->dp_ops_lock); - dev_set_drvdata(codec->dev, codec_data); - - dev_dbg(codec->dev, "%s(): registered %s with ext disp core\n", - __func__, codec->component.name); - - return 0; -} - -static int msm_ext_disp_audio_codec_rx_remove(struct snd_soc_codec *codec) -{ - struct msm_ext_disp_audio_codec_rx_data *codec_data; - - codec_data = dev_get_drvdata(codec->dev); - mutex_destroy(&codec_data->dp_ops_lock); - kfree(codec_data); - - return 0; -} - -static struct snd_soc_dai_ops msm_ext_disp_audio_codec_rx_dai_ops = { - .startup = msm_ext_disp_audio_codec_rx_dai_startup, - .hw_params = msm_ext_disp_audio_codec_rx_dai_hw_params, - .shutdown = msm_ext_disp_audio_codec_rx_dai_shutdown -}; - -static struct snd_soc_dai_driver msm_ext_disp_audio_codec_rx_dais[] = { - { - .name = "msm_hdmi_audio_codec_rx_dai", - .id = HDMI_DAI, - .playback = { - .stream_name = "HDMI Playback", - .channels_min = 1, - .channels_max = 8, - .rate_min = 48000, - .rate_max = 48000, - .rates = MSM_EXT_DISP_PCM_RATES, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .ops = &msm_ext_disp_audio_codec_rx_dai_ops, - }, - { - .name = "msm_dp_audio_codec_rx_dai", - .id = DP_DAI1, - .playback = { - .stream_name = "Display Port Playback", - .channels_min = 1, - .channels_max = 8, - .rate_min = 48000, - .rate_max = 192000, - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - }, - .ops = &msm_ext_disp_audio_codec_rx_dai_ops, - }, - { - .name = "msm_dp_audio_codec_rx1_dai", - .id = DP_DAI2, - .playback = { - .stream_name = "Display Port1 Playback", - .channels_min = 1, - .channels_max = 8, - .rate_min = 48000, - .rate_max = 192000, - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - }, - .ops = &msm_ext_disp_audio_codec_rx_dai_ops, - }, -}; - -static struct snd_soc_codec_driver msm_ext_disp_audio_codec_rx_soc_driver = { - .probe = msm_ext_disp_audio_codec_rx_probe, - .remove = msm_ext_disp_audio_codec_rx_remove, - .component_driver = { - .controls = msm_ext_disp_codec_rx_controls, - .num_controls = ARRAY_SIZE(msm_ext_disp_codec_rx_controls), - }, -}; - -static int msm_ext_disp_audio_codec_rx_plat_probe( - struct platform_device *pdev) -{ - dev_dbg(&pdev->dev, "%s(): dev name %s\n", __func__, - dev_name(&pdev->dev)); - - return snd_soc_register_codec(&pdev->dev, - &msm_ext_disp_audio_codec_rx_soc_driver, - msm_ext_disp_audio_codec_rx_dais, - ARRAY_SIZE(msm_ext_disp_audio_codec_rx_dais)); -} - -static int msm_ext_disp_audio_codec_rx_plat_remove( - struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} -static const struct of_device_id msm_ext_disp_audio_codec_rx_dt_match[] = { - { .compatible = "qcom,msm-ext-disp-audio-codec-rx", }, - {} -}; -MODULE_DEVICE_TABLE(of, msm_ext_disp_audio_codec_rx_dt_match); - -static struct platform_driver msm_ext_disp_audio_codec_rx_driver = { - .driver = { - .name = "msm-ext-disp-audio-codec-rx", - .owner = THIS_MODULE, - .of_match_table = msm_ext_disp_audio_codec_rx_dt_match, - }, - .probe = msm_ext_disp_audio_codec_rx_plat_probe, - .remove = msm_ext_disp_audio_codec_rx_plat_remove, -}; - -static int __init msm_ext_disp_audio_codec_rx_init(void) -{ - int rc = 0; - - rc = platform_driver_register(&msm_ext_disp_audio_codec_rx_driver); - if (rc) { - pr_err("%s: failed to register ext disp codec driver err:%d\n", - __func__, rc); - } - - return rc; -} -module_init(msm_ext_disp_audio_codec_rx_init); - -static void __exit msm_ext_disp_audio_codec_rx_exit(void) -{ - platform_driver_unregister(&msm_ext_disp_audio_codec_rx_driver); -} -module_exit(msm_ext_disp_audio_codec_rx_exit); - -MODULE_DESCRIPTION("MSM External Display Audio CODEC Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/msm_sdw/Android.mk b/techpack/audio/asoc/codecs/msm_sdw/Android.mk deleted file mode 100644 index e073cccbb8da..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/Android.mk +++ /dev/null @@ -1,53 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=msm_sdw_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_msm_sdw.ko -LOCAL_MODULE_KBUILD_NAME := msm_sdw_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/msm_sdw/Kbuild b/techpack/audio/asoc/codecs/msm_sdw/Kbuild deleted file mode 100644 index 99edad0fef2d..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/Kbuild +++ /dev/null @@ -1,123 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.9 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ MSM Soundwire ############ - -# for MSM Soundwire Codec -ifdef CONFIG_SND_SOC_MSM_SDW - MSM_SDW_OBJS += msm_sdw_cdc.o - MSM_SDW_OBJS += msm_sdw_regmap.o - MSM_SDW_OBJS += msm-sdw-tables.o - MSM_SDW_OBJS += msm_sdw_cdc_utils.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_MSM_SDW) += msm_sdw_dlkm.o -msm_sdw_dlkm-y := $(MSM_SDW_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/msm_sdw/msm-sdw-tables.c b/techpack/audio/asoc/codecs/msm_sdw/msm-sdw-tables.c deleted file mode 100644 index 1b51805bb92e..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/msm-sdw-tables.c +++ /dev/null @@ -1,319 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "msm_sdw.h" - -const u8 msm_sdw_page_map[MSM_SDW_MAX_REGISTER] = { - [MSM_SDW_TX9_SPKR_PROT_PATH_CTL] = 0xa, - [MSM_SDW_TX9_SPKR_PROT_PATH_CFG0] = 0xa, - [MSM_SDW_TX10_SPKR_PROT_PATH_CTL] = 0xa, - [MSM_SDW_TX10_SPKR_PROT_PATH_CFG0] = 0xa, - [MSM_SDW_TX11_SPKR_PROT_PATH_CTL] = 0xa, - [MSM_SDW_TX11_SPKR_PROT_PATH_CFG0] = 0xa, - [MSM_SDW_TX12_SPKR_PROT_PATH_CTL] = 0xa, - [MSM_SDW_TX12_SPKR_PROT_PATH_CFG0] = 0xa, - [MSM_SDW_COMPANDER7_CTL0] = 0xb, - [MSM_SDW_COMPANDER7_CTL1] = 0xb, - [MSM_SDW_COMPANDER7_CTL2] = 0xb, - [MSM_SDW_COMPANDER7_CTL3] = 0xb, - [MSM_SDW_COMPANDER7_CTL4] = 0xb, - [MSM_SDW_COMPANDER7_CTL5] = 0xb, - [MSM_SDW_COMPANDER7_CTL6] = 0xb, - [MSM_SDW_COMPANDER7_CTL7] = 0xb, - [MSM_SDW_COMPANDER8_CTL0] = 0xb, - [MSM_SDW_COMPANDER8_CTL1] = 0xb, - [MSM_SDW_COMPANDER8_CTL2] = 0xb, - [MSM_SDW_COMPANDER8_CTL3] = 0xb, - [MSM_SDW_COMPANDER8_CTL4] = 0xb, - [MSM_SDW_COMPANDER8_CTL5] = 0xb, - [MSM_SDW_COMPANDER8_CTL6] = 0xb, - [MSM_SDW_COMPANDER8_CTL7] = 0xb, - [MSM_SDW_RX7_RX_PATH_CTL] = 0xb, - [MSM_SDW_RX7_RX_PATH_CFG0] = 0xb, - [MSM_SDW_RX7_RX_PATH_CFG1] = 0xb, - [MSM_SDW_RX7_RX_PATH_CFG2] = 0xb, - [MSM_SDW_RX7_RX_VOL_CTL] = 0xb, - [MSM_SDW_RX7_RX_PATH_MIX_CTL] = 0xb, - [MSM_SDW_RX7_RX_PATH_MIX_CFG] = 0xb, - [MSM_SDW_RX7_RX_VOL_MIX_CTL] = 0xb, - [MSM_SDW_RX7_RX_PATH_SEC0] = 0xb, - [MSM_SDW_RX7_RX_PATH_SEC1] = 0xb, - [MSM_SDW_RX7_RX_PATH_SEC2] = 0xb, - [MSM_SDW_RX7_RX_PATH_SEC3] = 0xb, - [MSM_SDW_RX7_RX_PATH_SEC5] = 0xb, - [MSM_SDW_RX7_RX_PATH_SEC6] = 0xb, - [MSM_SDW_RX7_RX_PATH_SEC7] = 0xb, - [MSM_SDW_RX7_RX_PATH_MIX_SEC0] = 0xb, - [MSM_SDW_RX7_RX_PATH_MIX_SEC1] = 0xb, - [MSM_SDW_RX8_RX_PATH_CTL] = 0xb, - [MSM_SDW_RX8_RX_PATH_CFG0] = 0xb, - [MSM_SDW_RX8_RX_PATH_CFG1] = 0xb, - [MSM_SDW_RX8_RX_PATH_CFG2] = 0xb, - [MSM_SDW_RX8_RX_VOL_CTL] = 0xb, - [MSM_SDW_RX8_RX_PATH_MIX_CTL] = 0xb, - [MSM_SDW_RX8_RX_PATH_MIX_CFG] = 0xb, - [MSM_SDW_RX8_RX_VOL_MIX_CTL] = 0xb, - [MSM_SDW_RX8_RX_PATH_SEC0] = 0xb, - [MSM_SDW_RX8_RX_PATH_SEC1] = 0xb, - [MSM_SDW_RX8_RX_PATH_SEC2] = 0xb, - [MSM_SDW_RX8_RX_PATH_SEC3] = 0xb, - [MSM_SDW_RX8_RX_PATH_SEC5] = 0xb, - [MSM_SDW_RX8_RX_PATH_SEC6] = 0xb, - [MSM_SDW_RX8_RX_PATH_SEC7] = 0xb, - [MSM_SDW_RX8_RX_PATH_MIX_SEC0] = 0xb, - [MSM_SDW_RX8_RX_PATH_MIX_SEC1] = 0xb, - [MSM_SDW_BOOST0_BOOST_PATH_CTL] = 0xc, - [MSM_SDW_BOOST0_BOOST_CTL] = 0xc, - [MSM_SDW_BOOST0_BOOST_CFG1] = 0xc, - [MSM_SDW_BOOST0_BOOST_CFG2] = 0xc, - [MSM_SDW_BOOST1_BOOST_PATH_CTL] = 0xc, - [MSM_SDW_BOOST1_BOOST_CTL] = 0xc, - [MSM_SDW_BOOST1_BOOST_CFG1] = 0xc, - [MSM_SDW_BOOST1_BOOST_CFG2] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_DATA_0] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_DATA_1] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_DATA_2] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_DATA_3] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_0] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_1] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_2] = 0xc, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_3] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_0] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_1] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_2] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_3] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_DATA_0] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_DATA_1] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_DATA_2] = 0xc, - [MSM_SDW_AHB_BRIDGE_RD_DATA_3] = 0xc, - [MSM_SDW_AHB_BRIDGE_ACCESS_CFG] = 0xc, - [MSM_SDW_AHB_BRIDGE_ACCESS_STATUS] = 0xc, - [MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL] = 0xd, - [MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL] = 0xd, - [MSM_SDW_CLK_RST_CTRL_SWR_CONTROL] = 0xd, - [MSM_SDW_TOP_TOP_CFG0] = 0xd, - [MSM_SDW_TOP_TOP_CFG1] = 0xd, - [MSM_SDW_TOP_RX_I2S_CTL] = 0xd, - [MSM_SDW_TOP_TX_I2S_CTL] = 0xd, - [MSM_SDW_TOP_I2S_CLK] = 0xd, - [MSM_SDW_TOP_RX7_PATH_INPUT0_MUX] = 0xd, - [MSM_SDW_TOP_RX7_PATH_INPUT1_MUX] = 0xd, - [MSM_SDW_TOP_RX8_PATH_INPUT0_MUX] = 0xd, - [MSM_SDW_TOP_RX8_PATH_INPUT1_MUX] = 0xd, - [MSM_SDW_TOP_FREQ_MCLK] = 0xd, - [MSM_SDW_TOP_DEBUG_BUS_SEL] = 0xd, - [MSM_SDW_TOP_DEBUG_EN] = 0xd, - [MSM_SDW_TOP_I2S_RESET] = 0xd, - [MSM_SDW_TOP_BLOCKS_RESET] = 0xd, -}; - -const u8 msm_sdw_reg_readable[MSM_SDW_MAX_REGISTER] = { - [MSM_SDW_PAGE_REGISTER] = 1, - [MSM_SDW_TX9_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX9_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_TX10_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX10_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_TX11_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX11_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_TX12_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX12_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_COMPANDER7_CTL0] = 1, - [MSM_SDW_COMPANDER7_CTL1] = 1, - [MSM_SDW_COMPANDER7_CTL2] = 1, - [MSM_SDW_COMPANDER7_CTL3] = 1, - [MSM_SDW_COMPANDER7_CTL4] = 1, - [MSM_SDW_COMPANDER7_CTL5] = 1, - [MSM_SDW_COMPANDER7_CTL6] = 1, - [MSM_SDW_COMPANDER7_CTL7] = 1, - [MSM_SDW_COMPANDER8_CTL0] = 1, - [MSM_SDW_COMPANDER8_CTL1] = 1, - [MSM_SDW_COMPANDER8_CTL2] = 1, - [MSM_SDW_COMPANDER8_CTL3] = 1, - [MSM_SDW_COMPANDER8_CTL4] = 1, - [MSM_SDW_COMPANDER8_CTL5] = 1, - [MSM_SDW_COMPANDER8_CTL6] = 1, - [MSM_SDW_COMPANDER8_CTL7] = 1, - [MSM_SDW_RX7_RX_PATH_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_CFG0] = 1, - [MSM_SDW_RX7_RX_PATH_CFG1] = 1, - [MSM_SDW_RX7_RX_PATH_CFG2] = 1, - [MSM_SDW_RX7_RX_VOL_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_CFG] = 1, - [MSM_SDW_RX7_RX_VOL_MIX_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_SEC0] = 1, - [MSM_SDW_RX7_RX_PATH_SEC1] = 1, - [MSM_SDW_RX7_RX_PATH_SEC2] = 1, - [MSM_SDW_RX7_RX_PATH_SEC3] = 1, - [MSM_SDW_RX7_RX_PATH_SEC5] = 1, - [MSM_SDW_RX7_RX_PATH_SEC6] = 1, - [MSM_SDW_RX7_RX_PATH_SEC7] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_SEC0] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_SEC1] = 1, - [MSM_SDW_RX8_RX_PATH_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_CFG0] = 1, - [MSM_SDW_RX8_RX_PATH_CFG1] = 1, - [MSM_SDW_RX8_RX_PATH_CFG2] = 1, - [MSM_SDW_RX8_RX_VOL_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_CFG] = 1, - [MSM_SDW_RX8_RX_VOL_MIX_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_SEC0] = 1, - [MSM_SDW_RX8_RX_PATH_SEC1] = 1, - [MSM_SDW_RX8_RX_PATH_SEC2] = 1, - [MSM_SDW_RX8_RX_PATH_SEC3] = 1, - [MSM_SDW_RX8_RX_PATH_SEC5] = 1, - [MSM_SDW_RX8_RX_PATH_SEC6] = 1, - [MSM_SDW_RX8_RX_PATH_SEC7] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_SEC0] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_SEC1] = 1, - [MSM_SDW_BOOST0_BOOST_PATH_CTL] = 1, - [MSM_SDW_BOOST0_BOOST_CTL] = 1, - [MSM_SDW_BOOST0_BOOST_CFG1] = 1, - [MSM_SDW_BOOST0_BOOST_CFG2] = 1, - [MSM_SDW_BOOST1_BOOST_PATH_CTL] = 1, - [MSM_SDW_BOOST1_BOOST_CTL] = 1, - [MSM_SDW_BOOST1_BOOST_CFG1] = 1, - [MSM_SDW_BOOST1_BOOST_CFG2] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_0] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_1] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_2] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_3] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_0] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_1] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_2] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_3] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_0] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_1] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_2] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_3] = 1, - [MSM_SDW_AHB_BRIDGE_RD_DATA_0] = 1, - [MSM_SDW_AHB_BRIDGE_RD_DATA_1] = 1, - [MSM_SDW_AHB_BRIDGE_RD_DATA_2] = 1, - [MSM_SDW_AHB_BRIDGE_RD_DATA_3] = 1, - [MSM_SDW_AHB_BRIDGE_ACCESS_CFG] = 1, - [MSM_SDW_AHB_BRIDGE_ACCESS_STATUS] = 1, - [MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL] = 1, - [MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL] = 1, - [MSM_SDW_CLK_RST_CTRL_SWR_CONTROL] = 1, - [MSM_SDW_TOP_TOP_CFG0] = 1, - [MSM_SDW_TOP_TOP_CFG1] = 1, - [MSM_SDW_TOP_RX_I2S_CTL] = 1, - [MSM_SDW_TOP_TX_I2S_CTL] = 1, - [MSM_SDW_TOP_RX7_PATH_INPUT0_MUX] = 1, - [MSM_SDW_TOP_RX7_PATH_INPUT1_MUX] = 1, - [MSM_SDW_TOP_RX8_PATH_INPUT0_MUX] = 1, - [MSM_SDW_TOP_RX8_PATH_INPUT1_MUX] = 1, - [MSM_SDW_TOP_FREQ_MCLK] = 1, - [MSM_SDW_TOP_DEBUG_BUS_SEL] = 1, - [MSM_SDW_TOP_DEBUG_EN] = 1, - [MSM_SDW_TOP_I2S_RESET] = 1, - [MSM_SDW_TOP_BLOCKS_RESET] = 1, -}; - -const u8 msm_sdw_reg_writeable[MSM_SDW_MAX_REGISTER] = { - [MSM_SDW_PAGE_REGISTER] = 1, - [MSM_SDW_TX9_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX9_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_TX10_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX10_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_TX11_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX11_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_TX12_SPKR_PROT_PATH_CTL] = 1, - [MSM_SDW_TX12_SPKR_PROT_PATH_CFG0] = 1, - [MSM_SDW_COMPANDER7_CTL0] = 1, - [MSM_SDW_COMPANDER7_CTL1] = 1, - [MSM_SDW_COMPANDER7_CTL2] = 1, - [MSM_SDW_COMPANDER7_CTL3] = 1, - [MSM_SDW_COMPANDER7_CTL4] = 1, - [MSM_SDW_COMPANDER7_CTL5] = 1, - [MSM_SDW_COMPANDER7_CTL7] = 1, - [MSM_SDW_COMPANDER8_CTL0] = 1, - [MSM_SDW_COMPANDER8_CTL1] = 1, - [MSM_SDW_COMPANDER8_CTL2] = 1, - [MSM_SDW_COMPANDER8_CTL3] = 1, - [MSM_SDW_COMPANDER8_CTL4] = 1, - [MSM_SDW_COMPANDER8_CTL5] = 1, - [MSM_SDW_COMPANDER8_CTL7] = 1, - [MSM_SDW_RX7_RX_PATH_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_CFG0] = 1, - [MSM_SDW_RX7_RX_PATH_CFG1] = 1, - [MSM_SDW_RX7_RX_PATH_CFG2] = 1, - [MSM_SDW_RX7_RX_VOL_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_CFG] = 1, - [MSM_SDW_RX7_RX_VOL_MIX_CTL] = 1, - [MSM_SDW_RX7_RX_PATH_SEC0] = 1, - [MSM_SDW_RX7_RX_PATH_SEC1] = 1, - [MSM_SDW_RX7_RX_PATH_SEC2] = 1, - [MSM_SDW_RX7_RX_PATH_SEC3] = 1, - [MSM_SDW_RX7_RX_PATH_SEC5] = 1, - [MSM_SDW_RX7_RX_PATH_SEC6] = 1, - [MSM_SDW_RX7_RX_PATH_SEC7] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_SEC0] = 1, - [MSM_SDW_RX7_RX_PATH_MIX_SEC1] = 1, - [MSM_SDW_RX8_RX_PATH_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_CFG0] = 1, - [MSM_SDW_RX8_RX_PATH_CFG1] = 1, - [MSM_SDW_RX8_RX_PATH_CFG2] = 1, - [MSM_SDW_RX8_RX_VOL_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_CFG] = 1, - [MSM_SDW_RX8_RX_VOL_MIX_CTL] = 1, - [MSM_SDW_RX8_RX_PATH_SEC0] = 1, - [MSM_SDW_RX8_RX_PATH_SEC1] = 1, - [MSM_SDW_RX8_RX_PATH_SEC2] = 1, - [MSM_SDW_RX8_RX_PATH_SEC3] = 1, - [MSM_SDW_RX8_RX_PATH_SEC5] = 1, - [MSM_SDW_RX8_RX_PATH_SEC6] = 1, - [MSM_SDW_RX8_RX_PATH_SEC7] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_SEC0] = 1, - [MSM_SDW_RX8_RX_PATH_MIX_SEC1] = 1, - [MSM_SDW_BOOST0_BOOST_PATH_CTL] = 1, - [MSM_SDW_BOOST0_BOOST_CTL] = 1, - [MSM_SDW_BOOST0_BOOST_CFG1] = 1, - [MSM_SDW_BOOST0_BOOST_CFG2] = 1, - [MSM_SDW_BOOST1_BOOST_PATH_CTL] = 1, - [MSM_SDW_BOOST1_BOOST_CTL] = 1, - [MSM_SDW_BOOST1_BOOST_CFG1] = 1, - [MSM_SDW_BOOST1_BOOST_CFG2] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_0] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_1] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_2] = 1, - [MSM_SDW_AHB_BRIDGE_WR_DATA_3] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_0] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_1] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_2] = 1, - [MSM_SDW_AHB_BRIDGE_WR_ADDR_3] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_0] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_1] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_2] = 1, - [MSM_SDW_AHB_BRIDGE_RD_ADDR_3] = 1, - [MSM_SDW_AHB_BRIDGE_ACCESS_CFG] = 1, - [MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL] = 1, - [MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL] = 1, - [MSM_SDW_CLK_RST_CTRL_SWR_CONTROL] = 1, - [MSM_SDW_TOP_TOP_CFG0] = 1, - [MSM_SDW_TOP_TOP_CFG1] = 1, - [MSM_SDW_TOP_RX_I2S_CTL] = 1, - [MSM_SDW_TOP_TX_I2S_CTL] = 1, - [MSM_SDW_TOP_RX7_PATH_INPUT0_MUX] = 1, - [MSM_SDW_TOP_RX7_PATH_INPUT1_MUX] = 1, - [MSM_SDW_TOP_RX8_PATH_INPUT0_MUX] = 1, - [MSM_SDW_TOP_RX8_PATH_INPUT1_MUX] = 1, - [MSM_SDW_TOP_FREQ_MCLK] = 1, - [MSM_SDW_TOP_DEBUG_BUS_SEL] = 1, - [MSM_SDW_TOP_DEBUG_EN] = 1, - [MSM_SDW_TOP_I2S_RESET] = 1, - [MSM_SDW_TOP_BLOCKS_RESET] = 1, -}; diff --git a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw.h b/techpack/audio/asoc/codecs/msm_sdw/msm_sdw.h deleted file mode 100644 index 3c7a07dca673..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw.h +++ /dev/null @@ -1,203 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MSM_SDW_H -#define MSM_SDW_H - -#include -#include -#include "msm_sdw_registers.h" - -#define MSM_SDW_MAX_REGISTER 0x400 -#define MSM_SDW_CHILD_DEVICES_MAX 1 - -extern const struct regmap_config msm_sdw_regmap_config; -extern const u8 msm_sdw_page_map[MSM_SDW_MAX_REGISTER]; -extern const u8 msm_sdw_reg_readable[MSM_SDW_MAX_REGISTER]; -extern const u8 msm_sdw_reg_writeable[MSM_SDW_MAX_REGISTER]; - -enum { - MSM_SDW_RX4 = 0, - MSM_SDW_RX5, - MSM_SDW_RX_MAX, -}; - -enum { - MSM_SDW_TX0 = 0, - MSM_SDW_TX1, - MSM_SDW_TX_MAX, -}; - -enum { - COMP1, /* SPK_L */ - COMP2, /* SPK_R */ - COMP_MAX -}; - -/* - * Structure used to update codec - * register defaults after reset - */ -struct msm_sdw_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -/* - * Selects compander and smart boost settings - * for a given speaker mode - */ -enum { - SPKR_MODE_DEFAULT, - SPKR_MODE_1, /* COMP Gain = 12dB, Smartboost Max = 5.5V */ -}; - -/* Rx path gain offsets */ -enum { - RX_GAIN_OFFSET_M1P5_DB, - RX_GAIN_OFFSET_0_DB, -}; - -struct msm_sdw_reg_val { - unsigned short reg; /* register address */ - u8 *buf; /* buffer to be written to reg. addr */ - int bytes; /* number of bytes to be written */ -}; - -/* Hold instance to soundwire platform device */ -struct msm_sdw_ctrl_data { - struct platform_device *sdw_pdev; -}; - -struct wcd_sdw_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -struct msm_sdw_priv { - struct device *dev; - struct mutex io_lock; - - int (*read_dev)(struct msm_sdw_priv *msm_sdw, unsigned short reg, - int bytes, void *dest); - int (*write_dev)(struct msm_sdw_priv *msm_sdw, unsigned short reg, - int bytes, void *src); - int (*multi_reg_write)(struct msm_sdw_priv *msm_sdw, const void *data, - size_t count); - struct snd_soc_codec *codec; - struct device_node *sdw_gpio_p; /* used by pinctrl API */ - /* SoundWire data structure */ - struct msm_sdw_ctrl_data *sdw_ctrl_data; - int nr; - - /* compander */ - int comp_enabled[COMP_MAX]; - int ear_spkr_gain; - - /* to track the status */ - unsigned long status_mask; - - struct work_struct msm_sdw_add_child_devices_work; - struct wcd_sdw_ctrl_platform_data sdw_plat_data; - - unsigned int vi_feed_value; - - struct mutex sdw_read_lock; - struct mutex sdw_write_lock; - struct mutex sdw_clk_lock; - int sdw_clk_users; - int sdw_mclk_users; - - int sdw_irq; - int int_mclk1_rsc_ref; - bool int_mclk1_enabled; - bool sdw_npl_clk_enabled; - struct mutex cdc_int_mclk1_mutex; - struct mutex sdw_npl_clk_mutex; - struct delayed_work disable_int_mclk1_work; - struct afe_clk_set sdw_cdc_core_clk; - struct afe_clk_set sdw_npl_clk; - struct notifier_block service_nb; - int (*sdw_cdc_gpio_fn)(bool enable, struct snd_soc_codec *codec); - bool dev_up; - - int spkr_gain_offset; - int spkr_mode; - struct mutex codec_mutex; - int rx_4_count; - int rx_5_count; - u32 mclk_rate; - struct regmap *regmap; - - bool prev_pg_valid; - u8 prev_pg; - u32 sdw_base_addr; - char __iomem *sdw_base; - u32 version; - - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - struct platform_device *pdev_child_devices - [MSM_SDW_CHILD_DEVICES_MAX]; - int child_count; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_MSM_SDW) -extern int msm_sdw_set_spkr_mode(struct snd_soc_codec *codec, int mode); -extern int msm_sdw_set_spkr_gain_offset(struct snd_soc_codec *codec, - int offset); -extern void msm_sdw_gpio_cb( - int (*sdw_cdc_gpio_fn)(bool enable, struct snd_soc_codec *codec), - struct snd_soc_codec *codec); -extern struct regmap *msm_sdw_regmap_init(struct device *dev, - const struct regmap_config *config); -extern int msm_sdw_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -#else /* CONFIG_SND_SOC_MSM_SDW */ -static inline int msm_sdw_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - return 0; -} -static inline int msm_sdw_set_spkr_gain_offset(struct snd_soc_codec *codec, - int offset); -{ - return 0; -} -static inline void msm_sdw_gpio_cb( - int (*sdw_cdc_gpio_fn)(bool enable, struct snd_soc_codec *codec), - struct snd_soc_codec *codec); -{ - -} -static inline struct regmap *msm_sdw_regmap_init(struct device *dev, - const struct regmap_config *config); -{ - return NULL; -} -static inline int msm_sdw_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_MSM_SDW */ -#endif diff --git a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc.c b/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc.c deleted file mode 100644 index 69e340736ad9..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc.c +++ /dev/null @@ -1,2097 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_sdw.h" -#include "msm_sdw_registers.h" -#include "../msm-cdc-pinctrl.h" - -#define MSM_SDW_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000) -#define MSM_SDW_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE |\ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define MSM_SDW_STRING_LEN 80 - -#define INT_MCLK1_FREQ 9600000 -#define SDW_NPL_FREQ 153600000 - -#define MSM_SDW_VERSION_1_0 0x0001 -#define MSM_SDW_VERSION_ENTRY_SIZE 32 - -/* - * 200 Milliseconds sufficient for DSP bring up in the modem - * after Sub System Restart - */ -#define ADSP_STATE_READY_TIMEOUT_MS 200 - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); -static struct snd_soc_dai_driver msm_sdw_dai[]; -static bool skip_irq = true; - -static int msm_sdw_config_ear_spkr_gain(struct snd_soc_codec *codec, - int event, int gain_reg); -static int msm_sdw_config_compander(struct snd_soc_codec *, int, int); -static int msm_sdw_mclk_enable(struct msm_sdw_priv *msm_sdw, - int mclk_enable, bool dapm); -static int msm_int_enable_sdw_cdc_clk(struct msm_sdw_priv *msm_sdw, - int enable, bool dapm); - -enum { - VI_SENSE_1, - VI_SENSE_2, -}; - -enum { - AIF1_SDW_PB = 0, - AIF1_SDW_VIFEED, - NUM_CODEC_DAIS, -}; - -static const struct msm_sdw_reg_mask_val msm_sdw_spkr_default[] = { - {MSM_SDW_COMPANDER7_CTL3, 0x80, 0x80}, - {MSM_SDW_COMPANDER8_CTL3, 0x80, 0x80}, - {MSM_SDW_COMPANDER7_CTL7, 0x01, 0x01}, - {MSM_SDW_COMPANDER8_CTL7, 0x01, 0x01}, - {MSM_SDW_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {MSM_SDW_BOOST1_BOOST_CTL, 0x7C, 0x58}, -}; - -static const struct msm_sdw_reg_mask_val msm_sdw_spkr_mode1[] = { - {MSM_SDW_COMPANDER7_CTL3, 0x80, 0x00}, - {MSM_SDW_COMPANDER8_CTL3, 0x80, 0x00}, - {MSM_SDW_COMPANDER7_CTL7, 0x01, 0x00}, - {MSM_SDW_COMPANDER8_CTL7, 0x01, 0x00}, - {MSM_SDW_BOOST0_BOOST_CTL, 0x7C, 0x44}, - {MSM_SDW_BOOST1_BOOST_CTL, 0x7C, 0x44}, -}; - -/** - * msm_sdw_set_spkr_gain_offset - offset the speaker path - * gain with the given offset value. - * - * @codec: codec instance - * @offset: Indicates speaker path gain offset value. - * - * Returns 0 on success or -EINVAL on error. - */ -int msm_sdw_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - struct msm_sdw_priv *priv; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return -EINVAL; - } - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - priv->spkr_gain_offset = offset; - return 0; -} -EXPORT_SYMBOL(msm_sdw_set_spkr_gain_offset); - -/** - * msm_sdw_set_spkr_mode - Configures speaker compander and smartboost - * settings based on speaker mode. - * - * @codec: codec instance - * @mode: Indicates speaker configuration mode. - * - * Returns 0 on success or -EINVAL on error. - */ -int msm_sdw_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - struct msm_sdw_priv *priv; - int i; - const struct msm_sdw_reg_mask_val *regs; - int size; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return -EINVAL; - } - - priv = snd_soc_codec_get_drvdata(codec); - if (!priv) - return -EINVAL; - - switch (mode) { - case SPKR_MODE_1: - regs = msm_sdw_spkr_mode1; - size = ARRAY_SIZE(msm_sdw_spkr_mode1); - break; - default: - regs = msm_sdw_spkr_default; - size = ARRAY_SIZE(msm_sdw_spkr_default); - break; - } - - priv->spkr_mode = mode; - for (i = 0; i < size; i++) - snd_soc_update_bits(codec, regs[i].reg, - regs[i].mask, regs[i].val); - return 0; -} -EXPORT_SYMBOL(msm_sdw_set_spkr_mode); - -static int msm_enable_sdw_npl_clk(struct msm_sdw_priv *msm_sdw, int enable) -{ - int ret = 0; - - dev_dbg(msm_sdw->dev, "%s: enable %d\n", __func__, enable); - - mutex_lock(&msm_sdw->sdw_npl_clk_mutex); - if (enable) { - if (msm_sdw->sdw_npl_clk_enabled == false) { - msm_sdw->sdw_npl_clk.enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT4_MI2S_RX, - &msm_sdw->sdw_npl_clk); - if (ret < 0) { - dev_err(msm_sdw->dev, - "%s: failed to enable SDW NPL CLK\n", - __func__); - mutex_unlock(&msm_sdw->sdw_npl_clk_mutex); - return ret; - } - dev_dbg(msm_sdw->dev, "enabled sdw npl clk\n"); - msm_sdw->sdw_npl_clk_enabled = true; - } - } else { - if (msm_sdw->sdw_npl_clk_enabled == true) { - msm_sdw->sdw_npl_clk.enable = 0; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT4_MI2S_RX, - &msm_sdw->sdw_npl_clk); - if (ret < 0) - dev_err(msm_sdw->dev, - "%s: failed to disable SDW NPL CLK\n", - __func__); - msm_sdw->sdw_npl_clk_enabled = false; - } - } - mutex_unlock(&msm_sdw->sdw_npl_clk_mutex); - return ret; -} - -static int msm_int_enable_sdw_cdc_clk(struct msm_sdw_priv *msm_sdw, - int enable, bool dapm) -{ - int ret = 0; - - mutex_lock(&msm_sdw->cdc_int_mclk1_mutex); - dev_dbg(msm_sdw->dev, "%s: enable %d mclk1 ref counter %d\n", - __func__, enable, msm_sdw->int_mclk1_rsc_ref); - if (enable) { - if (msm_sdw->int_mclk1_rsc_ref == 0) { - cancel_delayed_work_sync( - &msm_sdw->disable_int_mclk1_work); - if (msm_sdw->int_mclk1_enabled == false) { - msm_sdw->sdw_cdc_core_clk.enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT4_MI2S_RX, - &msm_sdw->sdw_cdc_core_clk); - if (ret < 0) { - dev_err(msm_sdw->dev, - "%s: failed to enable SDW MCLK\n", - __func__); - goto rtn; - } - dev_dbg(msm_sdw->dev, - "enabled sdw codec core mclk\n"); - msm_sdw->int_mclk1_enabled = true; - } - } - msm_sdw->int_mclk1_rsc_ref++; - } else { - cancel_delayed_work_sync(&msm_sdw->disable_int_mclk1_work); - if (msm_sdw->int_mclk1_rsc_ref > 0) { - msm_sdw->int_mclk1_rsc_ref--; - dev_dbg(msm_sdw->dev, - "%s: decrementing mclk_res_ref %d\n", - __func__, msm_sdw->int_mclk1_rsc_ref); - } - if (msm_sdw->int_mclk1_enabled == true && - msm_sdw->int_mclk1_rsc_ref == 0) { - msm_sdw->sdw_cdc_core_clk.enable = 0; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT4_MI2S_RX, - &msm_sdw->sdw_cdc_core_clk); - if (ret < 0) - dev_err(msm_sdw->dev, - "%s: failed to disable SDW MCLK\n", - __func__); - msm_sdw->int_mclk1_enabled = false; - } - } -rtn: - mutex_unlock(&msm_sdw->cdc_int_mclk1_mutex); - return ret; -} -EXPORT_SYMBOL(msm_int_enable_sdw_cdc_clk); - -static void msm_disable_int_mclk1(struct work_struct *work) -{ - struct msm_sdw_priv *msm_sdw = NULL; - struct delayed_work *dwork; - int ret = 0; - - dwork = to_delayed_work(work); - msm_sdw = container_of(dwork, struct msm_sdw_priv, - disable_int_mclk1_work); - mutex_lock(&msm_sdw->cdc_int_mclk1_mutex); - dev_dbg(msm_sdw->dev, "%s: mclk1_enabled %d mclk1_rsc_ref %d\n", - __func__, msm_sdw->int_mclk1_enabled, - msm_sdw->int_mclk1_rsc_ref); - if (msm_sdw->int_mclk1_enabled == true - && msm_sdw->int_mclk1_rsc_ref == 0) { - dev_dbg(msm_sdw->dev, "Disable the mclk1\n"); - msm_sdw->sdw_cdc_core_clk.enable = 0; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT4_MI2S_RX, - &msm_sdw->sdw_cdc_core_clk); - if (ret < 0) - dev_err(msm_sdw->dev, - "%s failed to disable the MCLK1\n", - __func__); - msm_sdw->int_mclk1_enabled = false; - } - mutex_unlock(&msm_sdw->cdc_int_mclk1_mutex); -} - -static int msm_int_mclk1_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(msm_sdw->dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* enable the codec mclk config */ - msm_int_enable_sdw_cdc_clk(msm_sdw, 1, true); - msm_sdw_mclk_enable(msm_sdw, 1, true); - break; - case SND_SOC_DAPM_POST_PMD: - /* disable the codec mclk config */ - msm_sdw_mclk_enable(msm_sdw, 0, true); - msm_int_enable_sdw_cdc_clk(msm_sdw, 0, true); - break; - default: - dev_err(msm_sdw->dev, - "%s: invalid DAPM event %d\n", __func__, event); - ret = -EINVAL; - } - return ret; -} - -static int msm_sdw_ahb_write_device(struct msm_sdw_priv *msm_sdw, - u16 reg, u8 *value) -{ - u32 temp = (u32)(*value) & 0x000000FF; - - if (!msm_sdw->dev_up) { - dev_err_ratelimited(msm_sdw->dev, "%s: q6 not ready\n", - __func__); - return 0; - } - - iowrite32(temp, msm_sdw->sdw_base + reg); - return 0; -} - -static int msm_sdw_ahb_read_device(struct msm_sdw_priv *msm_sdw, - u16 reg, u8 *value) -{ - u32 temp; - - if (!msm_sdw->dev_up) { - dev_err_ratelimited(msm_sdw->dev, "%s: q6 not ready\n", - __func__); - return 0; - } - - temp = ioread32(msm_sdw->sdw_base + reg); - *value = (u8)temp; - return 0; -} - -static int __msm_sdw_reg_read(struct msm_sdw_priv *msm_sdw, unsigned short reg, - int bytes, void *dest) -{ - int ret = -EINVAL, i; - u8 temp = 0; - - dev_dbg(msm_sdw->dev, "%s reg = %x\n", __func__, reg); - mutex_lock(&msm_sdw->cdc_int_mclk1_mutex); - if (msm_sdw->int_mclk1_enabled == false) { - msm_sdw->sdw_cdc_core_clk.enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT4_MI2S_RX, - &msm_sdw->sdw_cdc_core_clk); - if (ret < 0) { - dev_err(msm_sdw->dev, - "%s:failed to enable the INT_MCLK1\n", - __func__); - goto unlock_exit; - } - dev_dbg(msm_sdw->dev, "%s:enabled sdw codec core clk\n", - __func__); - for (i = 0; i < bytes; i++) { - ret = msm_sdw_ahb_read_device( - msm_sdw, reg + (4 * i), &temp); - ((u8 *)dest)[i] = temp; - } - msm_sdw->int_mclk1_enabled = true; - schedule_delayed_work(&msm_sdw->disable_int_mclk1_work, 50); - goto unlock_exit; - } - for (i = 0; i < bytes; i++) { - ret = msm_sdw_ahb_read_device( - msm_sdw, reg + (4 * i), &temp); - ((u8 *)dest)[i] = temp; - } -unlock_exit: - mutex_unlock(&msm_sdw->cdc_int_mclk1_mutex); - if (ret < 0) { - dev_err_ratelimited(msm_sdw->dev, - "%s: codec read failed for reg 0x%x\n", - __func__, reg); - return ret; - } - dev_dbg(msm_sdw->dev, "Read 0x%02x from 0x%x\n", temp, reg); - - return 0; -} - -static int __msm_sdw_reg_write(struct msm_sdw_priv *msm_sdw, unsigned short reg, - int bytes, void *src) -{ - int ret = -EINVAL, i; - - mutex_lock(&msm_sdw->cdc_int_mclk1_mutex); - if (msm_sdw->int_mclk1_enabled == false) { - msm_sdw->sdw_cdc_core_clk.enable = 1; - ret = afe_set_lpass_clock_v2(AFE_PORT_ID_INT4_MI2S_RX, - &msm_sdw->sdw_cdc_core_clk); - if (ret < 0) { - dev_err(msm_sdw->dev, - "%s: failed to enable the INT_MCLK1\n", - __func__); - ret = 0; - goto unlock_exit; - } - dev_dbg(msm_sdw->dev, "%s: enabled INT_MCLK1\n", __func__); - for (i = 0; i < bytes; i++) - ret = msm_sdw_ahb_write_device(msm_sdw, reg + (4 * i), - &((u8 *)src)[i]); - msm_sdw->int_mclk1_enabled = true; - schedule_delayed_work(&msm_sdw->disable_int_mclk1_work, 50); - goto unlock_exit; - } - for (i = 0; i < bytes; i++) - ret = msm_sdw_ahb_write_device(msm_sdw, reg + (4 * i), - &((u8 *)src)[i]); -unlock_exit: - mutex_unlock(&msm_sdw->cdc_int_mclk1_mutex); - dev_dbg(msm_sdw->dev, "Write 0x%x val 0x%02x\n", - reg, (u32)(*(u32 *)src)); - - return ret; -} - -static int msm_sdw_codec_enable_vi_feedback(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = NULL; - struct msm_sdw_priv *msm_sdw_p = NULL; - int ret = 0; - - if (!w) { - pr_err("%s invalid params\n", __func__); - return -EINVAL; - } - codec = snd_soc_dapm_to_codec(w->dapm); - msm_sdw_p = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: num_dai %d stream name %s\n", - __func__, codec->component.num_dai, w->sname); - - dev_dbg(codec->dev, "%s(): w->name %s event %d w->shift %d\n", - __func__, w->name, event, w->shift); - if (w->shift != AIF1_SDW_VIFEED) { - dev_err(codec->dev, - "%s:Error in enabling the vi feedback path\n", - __func__); - ret = -EINVAL; - goto out_vi; - } - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (test_bit(VI_SENSE_1, &msm_sdw_p->status_mask)) { - dev_dbg(codec->dev, "%s: spkr1 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x0F, 0x04); - snd_soc_update_bits(codec, - MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x0F, 0x04); - snd_soc_update_bits(codec, - MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, - MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x00); - snd_soc_update_bits(codec, - MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - if (test_bit(VI_SENSE_2, &msm_sdw_p->status_mask)) { - dev_dbg(codec->dev, "%s: spkr2 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x0F, - 0x04); - snd_soc_update_bits(codec, - MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x0F, - 0x04); - snd_soc_update_bits(codec, - MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - snd_soc_update_bits(codec, - MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (test_bit(VI_SENSE_1, &msm_sdw_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr1 disabled\n", __func__); - snd_soc_update_bits(codec, - MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x00); - snd_soc_update_bits(codec, - MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - if (test_bit(VI_SENSE_2, &msm_sdw_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr2 disabled\n", __func__); - snd_soc_update_bits(codec, - MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - snd_soc_update_bits(codec, - MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - break; - } -out_vi: - return ret; -} - -static int msm_sdwm_handle_irq(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action) -{ - struct msm_sdw_priv *msm_sdw; - int ret = 0; - - if (!handle) { - pr_err("%s: null handle received\n", __func__); - return -EINVAL; - } - msm_sdw = (struct msm_sdw_priv *) handle; - - if (skip_irq) - return ret; - - if (action) { - ret = request_threaded_irq(msm_sdw->sdw_irq, NULL, - swrm_irq_handler, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - "swr_master_irq", swrm_handle); - if (ret) - dev_err(msm_sdw->dev, "%s: Failed to request irq %d\n", - __func__, ret); - } else - free_irq(msm_sdw->sdw_irq, swrm_handle); - - return ret; -} - -static void msm_sdw_codec_hd2_control(struct snd_soc_codec *codec, - u16 reg, int event) -{ - u16 hd2_scale_reg; - u16 hd2_enable_reg = 0; - - if (reg == MSM_SDW_RX7_RX_PATH_CTL) { - hd2_scale_reg = MSM_SDW_RX7_RX_PATH_SEC3; - hd2_enable_reg = MSM_SDW_RX7_RX_PATH_CFG0; - } - if (reg == MSM_SDW_RX8_RX_PATH_CTL) { - hd2_scale_reg = MSM_SDW_RX8_RX_PATH_SEC3; - hd2_enable_reg = MSM_SDW_RX8_RX_PATH_CFG0; - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x10); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x01); - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04); - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00); - } -} - -static int msm_sdw_enable_swr(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct msm_sdw_priv *msm_sdw; - int i, ch_cnt; - - msm_sdw = snd_soc_codec_get_drvdata(codec); - - if (!msm_sdw->nr) - return 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (!(strnstr(w->name, "RX4", sizeof("RX4 MIX"))) && - !msm_sdw->rx_4_count) - msm_sdw->rx_4_count++; - if (!(strnstr(w->name, "RX5", sizeof("RX5 MIX"))) && - !msm_sdw->rx_5_count) - msm_sdw->rx_5_count++; - ch_cnt = msm_sdw->rx_4_count + msm_sdw->rx_5_count; - - for (i = 0; i < msm_sdw->nr; i++) { - swrm_wcd_notify(msm_sdw->sdw_ctrl_data[i].sdw_pdev, - SWR_DEVICE_UP, NULL); - swrm_wcd_notify(msm_sdw->sdw_ctrl_data[i].sdw_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (!(strnstr(w->name, "RX4", sizeof("RX4 MIX"))) && - msm_sdw->rx_4_count) - msm_sdw->rx_4_count--; - if (!(strnstr(w->name, "RX5", sizeof("RX5 MIX"))) && - msm_sdw->rx_5_count) - msm_sdw->rx_5_count--; - ch_cnt = msm_sdw->rx_4_count + msm_sdw->rx_5_count; - - for (i = 0; i < msm_sdw->nr; i++) - swrm_wcd_notify(msm_sdw->sdw_ctrl_data[i].sdw_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - break; - } - dev_dbg(msm_sdw->dev, "%s: current swr ch cnt: %d\n", - __func__, msm_sdw->rx_4_count + msm_sdw->rx_5_count); - - return 0; -} - -static int msm_sdw_codec_enable_interpolator(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - u16 gain_reg; - u16 reg; - int val; - int offset_val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (!(strcmp(w->name, "RX INT4 INTERP"))) { - reg = MSM_SDW_RX7_RX_PATH_CTL; - gain_reg = MSM_SDW_RX7_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT5 INTERP"))) { - reg = MSM_SDW_RX8_RX_PATH_CTL; - gain_reg = MSM_SDW_RX8_RX_VOL_CTL; - } else { - dev_err(codec->dev, "%s: Interpolator reg not found\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, reg, 0x10, 0x10); - msm_sdw_codec_hd2_control(codec, reg, event); - snd_soc_update_bits(codec, reg, 1 << 0x5, 1 << 0x5); - break; - case SND_SOC_DAPM_POST_PMU: - msm_sdw_config_compander(codec, w->shift, event); - /* apply gain after int clk is enabled */ - if ((msm_sdw->spkr_gain_offset == RX_GAIN_OFFSET_M1P5_DB) && - (msm_sdw->comp_enabled[COMP1] || - msm_sdw->comp_enabled[COMP2]) && - (gain_reg == MSM_SDW_RX7_RX_VOL_CTL || - gain_reg == MSM_SDW_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, MSM_SDW_RX7_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - MSM_SDW_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, MSM_SDW_RX8_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - MSM_SDW_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - msm_sdw_config_ear_spkr_gain(codec, event, gain_reg); - snd_soc_update_bits(codec, reg, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, reg, 1 << 0x5, 0 << 0x5); - snd_soc_update_bits(codec, reg, 0x40, 0x40); - snd_soc_update_bits(codec, reg, 0x40, 0x00); - msm_sdw_codec_hd2_control(codec, reg, event); - msm_sdw_config_compander(codec, w->shift, event); - if ((msm_sdw->spkr_gain_offset == RX_GAIN_OFFSET_M1P5_DB) && - (msm_sdw->comp_enabled[COMP1] || - msm_sdw->comp_enabled[COMP2]) && - (gain_reg == MSM_SDW_RX7_RX_VOL_CTL || - gain_reg == MSM_SDW_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, MSM_SDW_RX7_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - MSM_SDW_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, MSM_SDW_RX8_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - MSM_SDW_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - msm_sdw_config_ear_spkr_gain(codec, event, gain_reg); - break; - }; - - return 0; -} - -static int msm_sdw_config_ear_spkr_gain(struct snd_soc_codec *codec, - int event, int gain_reg) -{ - int comp_gain_offset, val; - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - - switch (msm_sdw->spkr_mode) { - /* Compander gain in SPKR_MODE1 case is 12 dB */ - case SPKR_MODE_1: - comp_gain_offset = -12; - break; - /* Default case compander gain is 15 dB */ - default: - comp_gain_offset = -15; - break; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* Apply ear spkr gain only if compander is enabled */ - if (msm_sdw->comp_enabled[COMP1] && - (gain_reg == MSM_SDW_RX7_RX_VOL_CTL) && - (msm_sdw->ear_spkr_gain != 0)) { - /* For example, val is -8(-12+5-1) for 4dB of gain */ - val = comp_gain_offset + msm_sdw->ear_spkr_gain - 1; - snd_soc_write(codec, gain_reg, val); - - dev_dbg(codec->dev, "%s: RX4 Volume %d dB\n", - __func__, val); - } - break; - case SND_SOC_DAPM_POST_PMD: - /* - * Reset RX4 volume to 0 dB if compander is enabled and - * ear_spkr_gain is non-zero. - */ - if (msm_sdw->comp_enabled[COMP1] && - (gain_reg == MSM_SDW_RX7_RX_VOL_CTL) && - (msm_sdw->ear_spkr_gain != 0)) { - snd_soc_write(codec, gain_reg, 0x0); - - dev_dbg(codec->dev, "%s: Reset RX4 Volume to 0 dB\n", - __func__); - } - break; - } - - return 0; -} - -static int msm_sdw_codec_spk_boost_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 boost_path_ctl, boost_path_cfg1; - u16 reg; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (!strcmp(w->name, "RX INT4 CHAIN")) { - boost_path_ctl = MSM_SDW_BOOST0_BOOST_PATH_CTL; - boost_path_cfg1 = MSM_SDW_RX7_RX_PATH_CFG1; - reg = MSM_SDW_RX7_RX_PATH_CTL; - } else if (!strcmp(w->name, "RX INT5 CHAIN")) { - boost_path_ctl = MSM_SDW_BOOST1_BOOST_PATH_CTL; - boost_path_cfg1 = MSM_SDW_RX8_RX_PATH_CFG1; - reg = MSM_SDW_RX8_RX_PATH_CTL; - } else { - dev_err(codec->dev, "%s: boost reg not found\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x10); - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x01); - snd_soc_update_bits(codec, reg, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x00); - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x00); - break; - }; - - return 0; -} - -static int msm_sdw_config_compander(struct snd_soc_codec *codec, int comp, - int event) -{ - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - u16 comp_ctl0_reg, rx_path_cfg0_reg; - - if (comp < COMP1 || comp >= COMP_MAX) - return 0; - - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, msm_sdw->comp_enabled[comp]); - - if (!msm_sdw->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = MSM_SDW_COMPANDER7_CTL0 + (comp * 0x20); - rx_path_cfg0_reg = MSM_SDW_RX7_RX_PATH_CFG0 + (comp * 0x1E0); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -static int msm_sdw_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = msm_sdw->comp_enabled[comp]; - return 0; -} - -static int msm_sdw_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, msm_sdw->comp_enabled[comp], value); - msm_sdw->comp_enabled[comp] = value; - - return 0; -} - -static int msm_sdw_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = msm_sdw->ear_spkr_gain; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_sdw_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_sdw_priv *msm_sdw = snd_soc_codec_get_drvdata(codec); - - msm_sdw->ear_spkr_gain = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: gain = %d\n", __func__, - msm_sdw->ear_spkr_gain); - - return 0; -} - -static int msm_sdw_spkr_left_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, MSM_SDW_BOOST0_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_sdw_spkr_left_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, MSM_SDW_BOOST0_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int msm_sdw_spkr_right_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, MSM_SDW_BOOST1_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_sdw_spkr_right_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, MSM_SDW_BOOST1_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int msm_sdw_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct msm_sdw_priv *msm_sdw_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = msm_sdw_p->vi_feed_value; - - return 0; -} - -static int msm_sdw_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct msm_sdw_priv *msm_sdw_p = snd_soc_codec_get_drvdata(codec); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: enable: %d, port_id:%d, dai_id: %d\n", - __func__, enable, port_id, dai_id); - - msm_sdw_p->vi_feed_value = ucontrol->value.integer.value[0]; - - mutex_lock(&msm_sdw_p->codec_mutex); - if (enable) { - if (port_id == MSM_SDW_TX0 && !test_bit(VI_SENSE_1, - &msm_sdw_p->status_mask)) - set_bit(VI_SENSE_1, &msm_sdw_p->status_mask); - if (port_id == MSM_SDW_TX1 && !test_bit(VI_SENSE_2, - &msm_sdw_p->status_mask)) - set_bit(VI_SENSE_2, &msm_sdw_p->status_mask); - } else { - if (port_id == MSM_SDW_TX0 && test_bit(VI_SENSE_1, - &msm_sdw_p->status_mask)) - clear_bit(VI_SENSE_1, &msm_sdw_p->status_mask); - if (port_id == MSM_SDW_TX1 && test_bit(VI_SENSE_2, - &msm_sdw_p->status_mask)) - clear_bit(VI_SENSE_2, &msm_sdw_p->status_mask); - } - mutex_unlock(&msm_sdw_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); - - return 0; -} - -static int msm_sdw_mclk_enable(struct msm_sdw_priv *msm_sdw, - int mclk_enable, bool dapm) -{ - dev_dbg(msm_sdw->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n", - __func__, mclk_enable, dapm, msm_sdw->sdw_mclk_users); - if (mclk_enable) { - msm_sdw->sdw_mclk_users++; - if (msm_sdw->sdw_mclk_users == 1) { - regmap_update_bits(msm_sdw->regmap, - MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - regmap_update_bits(msm_sdw->regmap, - MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - /* 9.6MHz MCLK, set value 0x00 if other frequency */ - regmap_update_bits(msm_sdw->regmap, - MSM_SDW_TOP_FREQ_MCLK, 0x01, 0x01); - } - } else { - msm_sdw->sdw_mclk_users--; - if (msm_sdw->sdw_mclk_users == 0) { - regmap_update_bits(msm_sdw->regmap, - MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(msm_sdw->regmap, - MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); - } - } - return 0; -} -EXPORT_SYMBOL(msm_sdw_mclk_enable); - -static int msm_sdw_swrm_read(void *handle, int reg) -{ - struct msm_sdw_priv *msm_sdw; - unsigned short sdw_rd_addr_base; - unsigned short sdw_rd_data_base; - int val, ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - msm_sdw = (struct msm_sdw_priv *)handle; - - dev_dbg(msm_sdw->dev, "%s: Reading soundwire register, 0x%x\n", - __func__, reg); - sdw_rd_addr_base = MSM_SDW_AHB_BRIDGE_RD_ADDR_0; - sdw_rd_data_base = MSM_SDW_AHB_BRIDGE_RD_DATA_0; - /* - * Add sleep as SWR slave access read takes time. - * Allow for RD_DONE to complete for previous register if any. - */ - usleep_range(100, 105); - - /* read_lock */ - mutex_lock(&msm_sdw->sdw_read_lock); - ret = regmap_bulk_write(msm_sdw->regmap, sdw_rd_addr_base, - (u8 *)®, 4); - if (ret < 0) { - dev_err(msm_sdw->dev, "%s: RD Addr Failure\n", __func__); - goto err; - } - /* Add sleep for SWR register read value to get updated. */ - usleep_range(100, 105); - /* Check for RD value */ - ret = regmap_bulk_read(msm_sdw->regmap, sdw_rd_data_base, - (u8 *)&val, 4); - if (ret < 0) { - dev_err(msm_sdw->dev, "%s: RD Data Failure\n", __func__); - goto err; - } - ret = val; -err: - /* read_unlock */ - mutex_unlock(&msm_sdw->sdw_read_lock); - return ret; -} - -static int msm_sdw_bulk_write(struct msm_sdw_priv *msm_sdw, - struct msm_sdw_reg_val *bulk_reg, - size_t len) -{ - int i, ret = 0; - unsigned short sdw_wr_addr_base; - unsigned short sdw_wr_data_base; - - sdw_wr_addr_base = MSM_SDW_AHB_BRIDGE_WR_ADDR_0; - sdw_wr_data_base = MSM_SDW_AHB_BRIDGE_WR_DATA_0; - - for (i = 0; i < len; i += 2) { - /* - * Add sleep as SWR slave write takes time. - * Allow for any previous pending write to complete. - */ - usleep_range(100, 105); - /* First Write the Data to register */ - ret = regmap_bulk_write(msm_sdw->regmap, - sdw_wr_data_base, bulk_reg[i].buf, 4); - if (ret < 0) { - dev_err(msm_sdw->dev, "%s: WR Data Failure\n", - __func__); - break; - } - /* Next Write Address */ - ret = regmap_bulk_write(msm_sdw->regmap, - sdw_wr_addr_base, bulk_reg[i+1].buf, 4); - if (ret < 0) { - dev_err(msm_sdw->dev, - "%s: WR Addr Failure: 0x%x\n", - __func__, (u32)(bulk_reg[i+1].buf[0])); - break; - } - } - return ret; -} - -static int msm_sdw_swrm_bulk_write(void *handle, u32 *reg, u32 *val, size_t len) -{ - struct msm_sdw_priv *msm_sdw; - struct msm_sdw_reg_val *bulk_reg; - unsigned short sdw_wr_addr_base; - unsigned short sdw_wr_data_base; - int i, j, ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - - msm_sdw = (struct msm_sdw_priv *)handle; - if (len <= 0) { - dev_err(msm_sdw->dev, - "%s: Invalid size: %zu\n", __func__, len); - return -EINVAL; - } - - sdw_wr_addr_base = MSM_SDW_AHB_BRIDGE_WR_ADDR_0; - sdw_wr_data_base = MSM_SDW_AHB_BRIDGE_WR_DATA_0; - - bulk_reg = kzalloc((2 * len * sizeof(struct msm_sdw_reg_val)), - GFP_KERNEL); - if (!bulk_reg) - return -ENOMEM; - - for (i = 0, j = 0; i < (len * 2); i += 2, j++) { - bulk_reg[i].reg = sdw_wr_data_base; - bulk_reg[i].buf = (u8 *)(&val[j]); - bulk_reg[i].bytes = 4; - bulk_reg[i+1].reg = sdw_wr_addr_base; - bulk_reg[i+1].buf = (u8 *)(®[j]); - bulk_reg[i+1].bytes = 4; - } - mutex_lock(&msm_sdw->sdw_write_lock); - - ret = msm_sdw_bulk_write(msm_sdw, bulk_reg, (len * 2)); - if (ret) - dev_err(msm_sdw->dev, "%s: swrm bulk write failed, ret: %d\n", - __func__, ret); - - mutex_unlock(&msm_sdw->sdw_write_lock); - kfree(bulk_reg); - - return ret; -} - -static int msm_sdw_swrm_write(void *handle, int reg, int val) -{ - struct msm_sdw_priv *msm_sdw; - unsigned short sdw_wr_addr_base; - unsigned short sdw_wr_data_base; - struct msm_sdw_reg_val bulk_reg[2]; - int ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - msm_sdw = (struct msm_sdw_priv *)handle; - - sdw_wr_addr_base = MSM_SDW_AHB_BRIDGE_WR_ADDR_0; - sdw_wr_data_base = MSM_SDW_AHB_BRIDGE_WR_DATA_0; - - /* First Write the Data to register */ - bulk_reg[0].reg = sdw_wr_data_base; - bulk_reg[0].buf = (u8 *)(&val); - bulk_reg[0].bytes = 4; - bulk_reg[1].reg = sdw_wr_addr_base; - bulk_reg[1].buf = (u8 *)(®); - bulk_reg[1].bytes = 4; - - mutex_lock(&msm_sdw->sdw_write_lock); - - ret = msm_sdw_bulk_write(msm_sdw, bulk_reg, 2); - if (ret < 0) - dev_err(msm_sdw->dev, "%s: WR Data Failure\n", __func__); - - mutex_unlock(&msm_sdw->sdw_write_lock); - return ret; -} - -static int msm_sdw_swrm_clock(void *handle, bool enable) -{ - struct msm_sdw_priv *msm_sdw; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - msm_sdw = (struct msm_sdw_priv *)handle; - - mutex_lock(&msm_sdw->sdw_clk_lock); - - dev_dbg(msm_sdw->dev, "%s: swrm clock %s\n", - __func__, (enable ? "enable" : "disable")); - if (enable) { - msm_sdw->sdw_clk_users++; - if (msm_sdw->sdw_clk_users == 1) { - msm_int_enable_sdw_cdc_clk(msm_sdw, 1, true); - msm_sdw_mclk_enable(msm_sdw, 1, true); - regmap_update_bits(msm_sdw->regmap, - MSM_SDW_CLK_RST_CTRL_SWR_CONTROL, 0x01, 0x01); - msm_enable_sdw_npl_clk(msm_sdw, true); - msm_cdc_pinctrl_select_active_state( - msm_sdw->sdw_gpio_p); - } - } else { - msm_sdw->sdw_clk_users--; - if (msm_sdw->sdw_clk_users == 0) { - regmap_update_bits(msm_sdw->regmap, - MSM_SDW_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - msm_sdw_mclk_enable(msm_sdw, 0, true); - msm_int_enable_sdw_cdc_clk(msm_sdw, 0, true); - msm_enable_sdw_npl_clk(msm_sdw, false); - msm_cdc_pinctrl_select_sleep_state(msm_sdw->sdw_gpio_p); - } - } - dev_dbg(msm_sdw->dev, "%s: swrm clock users %d\n", - __func__, msm_sdw->sdw_clk_users); - mutex_unlock(&msm_sdw->sdw_clk_lock); - return 0; -} - -static int msm_sdw_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - dev_dbg(dai->codec->dev, "%s(): substream = %s stream = %d\n", - __func__, - substream->name, substream->stream); - return 0; -} - -static int msm_sdw_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - u8 clk_fs_rate, fs_rate; - - dev_dbg(dai->codec->dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d format %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params), params_format(params)); - - switch (params_rate(params)) { - case 8000: - clk_fs_rate = 0x00; - fs_rate = 0x00; - break; - case 16000: - clk_fs_rate = 0x01; - fs_rate = 0x01; - break; - case 32000: - clk_fs_rate = 0x02; - fs_rate = 0x03; - break; - case 48000: - clk_fs_rate = 0x03; - fs_rate = 0x04; - break; - case 96000: - clk_fs_rate = 0x04; - fs_rate = 0x05; - break; - case 192000: - clk_fs_rate = 0x05; - fs_rate = 0x06; - break; - default: - dev_err(dai->codec->dev, - "%s: Invalid sampling rate %d\n", __func__, - params_rate(params)); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - snd_soc_update_bits(dai->codec, - MSM_SDW_TOP_TX_I2S_CTL, 0x1C, - (clk_fs_rate << 2)); - } else { - snd_soc_update_bits(dai->codec, - MSM_SDW_TOP_RX_I2S_CTL, 0x1C, - (clk_fs_rate << 2)); - snd_soc_update_bits(dai->codec, - MSM_SDW_RX7_RX_PATH_CTL, 0x0F, - fs_rate); - snd_soc_update_bits(dai->codec, - MSM_SDW_RX8_RX_PATH_CTL, 0x0F, - fs_rate); - } - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - snd_soc_update_bits(dai->codec, - MSM_SDW_TOP_TX_I2S_CTL, 0x20, 0x20); - else - snd_soc_update_bits(dai->codec, - MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x20); - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - snd_soc_update_bits(dai->codec, - MSM_SDW_TOP_TX_I2S_CTL, 0x20, 0x00); - else - snd_soc_update_bits(dai->codec, - MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x00); - break; - default: - dev_err(dai->codec->dev, "%s: wrong format selected\n", - __func__); - return -EINVAL; - } - - return 0; -} - -static void msm_sdw_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - dev_dbg(dai->codec->dev, - "%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); -} - -static ssize_t msm_sdw_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct msm_sdw_priv *msm_sdw; - char buffer[MSM_SDW_VERSION_ENTRY_SIZE]; - int len = 0; - - msm_sdw = (struct msm_sdw_priv *) entry->private_data; - if (!msm_sdw) { - pr_err("%s: msm_sdw priv is null\n", __func__); - return -EINVAL; - } - - switch (msm_sdw->version) { - case MSM_SDW_VERSION_1_0: - len = snprintf(buffer, sizeof(buffer), "SDW-CDC_1_0\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops msm_sdw_codec_info_ops = { - .read = msm_sdw_codec_version_read, -}; - -/* - * msm_sdw_codec_info_create_codec_entry - creates msm_sdw module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates msm_sdw module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int msm_sdw_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct msm_sdw_priv *msm_sdw; - struct snd_soc_card *card; - char name[80]; - - if (!codec_root || !codec) - return -EINVAL; - - msm_sdw = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - - snprintf(name, sizeof(name), "%x.%s", (u32)msm_sdw->sdw_base_addr, - "msm-sdw-codec"); - msm_sdw->entry = snd_info_create_subdir(codec_root->module, - (const char *)name, - codec_root); - if (!msm_sdw->entry) { - dev_err(codec->dev, "%s: failed to create msm_sdw entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - msm_sdw->entry); - if (!version_entry) { - dev_err(codec->dev, "%s: failed to create msm_sdw version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = msm_sdw; - version_entry->size = MSM_SDW_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &msm_sdw_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - msm_sdw->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(msm_sdw_codec_info_create_codec_entry); - -static struct snd_soc_dai_ops msm_sdw_dai_ops = { - .startup = msm_sdw_startup, - .shutdown = msm_sdw_shutdown, - .hw_params = msm_sdw_hw_params, -}; - -static struct snd_soc_dai_driver msm_sdw_dai[] = { - { - .name = "msm_sdw_i2s_rx1", - .id = AIF1_SDW_PB, - .playback = { - .stream_name = "AIF1_SDW Playback", - .rates = MSM_SDW_RATES, - .formats = MSM_SDW_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &msm_sdw_dai_ops, - }, - { - .name = "msm_sdw_vifeedback", - .id = AIF1_SDW_VIFEED, - .capture = { - .stream_name = "VIfeed_SDW", - .rates = MSM_SDW_RATES, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 2, - .channels_max = 4, - }, - .ops = &msm_sdw_dai_ops, - }, -}; - -static const char * const rx_mix1_text[] = { - "ZERO", "RX4", "RX5" -}; - -static const char * const msm_sdw_ear_spkr_pa_gain_text[] = { - "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", - "G_4_DB", "G_5_DB", "G_6_DB" -}; - -static const char * const msm_sdw_speaker_boost_stage_text[] = { - "NO_MAX_STATE", "MAX_STATE_1", "MAX_STATE_2" -}; - -static SOC_ENUM_SINGLE_EXT_DECL(msm_sdw_ear_spkr_pa_gain_enum, - msm_sdw_ear_spkr_pa_gain_text); -static SOC_ENUM_SINGLE_EXT_DECL(msm_sdw_spkr_boost_stage_enum, - msm_sdw_speaker_boost_stage_text); - -/* RX4 MIX1 */ -static const struct soc_enum rx4_mix1_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM_SDW_TOP_RX7_PATH_INPUT0_MUX, - 0, 3, rx_mix1_text); - -static const struct soc_enum rx4_mix1_inp2_chain_enum = - SOC_ENUM_SINGLE(MSM_SDW_TOP_RX7_PATH_INPUT1_MUX, - 0, 3, rx_mix1_text); - -/* RX5 MIX1 */ -static const struct soc_enum rx5_mix1_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM_SDW_TOP_RX8_PATH_INPUT0_MUX, - 0, 3, rx_mix1_text); - -static const struct soc_enum rx5_mix1_inp2_chain_enum = - SOC_ENUM_SINGLE(MSM_SDW_TOP_RX8_PATH_INPUT1_MUX, - 0, 3, rx_mix1_text); - -static const struct snd_kcontrol_new rx4_mix1_inp1_mux = - SOC_DAPM_ENUM("RX4 MIX1 INP1 Mux", rx4_mix1_inp1_chain_enum); - -static const struct snd_kcontrol_new rx4_mix1_inp2_mux = - SOC_DAPM_ENUM("RX4 MIX1 INP2 Mux", rx4_mix1_inp2_chain_enum); - -static const struct snd_kcontrol_new rx5_mix1_inp1_mux = - SOC_DAPM_ENUM("RX5 MIX1 INP1 Mux", rx5_mix1_inp1_chain_enum); - -static const struct snd_kcontrol_new rx5_mix1_inp2_mux = - SOC_DAPM_ENUM("RX5 MIX1 INP2 Mux", rx5_mix1_inp2_chain_enum); - -static const struct snd_kcontrol_new aif1_vi_mixer[] = { - SOC_SINGLE_EXT("SPKR_VI_1", SND_SOC_NOPM, MSM_SDW_TX0, 1, 0, - msm_sdw_vi_feed_mixer_get, msm_sdw_vi_feed_mixer_put), - SOC_SINGLE_EXT("SPKR_VI_2", SND_SOC_NOPM, MSM_SDW_TX1, 1, 0, - msm_sdw_vi_feed_mixer_get, msm_sdw_vi_feed_mixer_put), -}; - -static const struct snd_soc_dapm_widget msm_sdw_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("I2S RX4", "AIF1_SDW Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_IN("I2S RX5", "AIF1_SDW Playback", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_OUT_E("AIF1_SDW VI", "VIfeed_SDW", 0, SND_SOC_NOPM, - AIF1_SDW_VIFEED, 0, msm_sdw_codec_enable_vi_feedback, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER("AIF1_VI_SDW Mixer", SND_SOC_NOPM, AIF1_SDW_VIFEED, - 0, aif1_vi_mixer, ARRAY_SIZE(aif1_vi_mixer)), - - SND_SOC_DAPM_MUX_E("RX4 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx4_mix1_inp1_mux, msm_sdw_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX4 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx4_mix1_inp2_mux, msm_sdw_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX5 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx5_mix1_inp1_mux, msm_sdw_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX5 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx5_mix1_inp2_mux, msm_sdw_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER("RX4 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX5 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER_E("RX INT4 INTERP", SND_SOC_NOPM, - COMP1, 0, NULL, 0, msm_sdw_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT5 INTERP", SND_SOC_NOPM, - COMP2, 0, NULL, 0, msm_sdw_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("RX INT4 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, msm_sdw_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT5 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, msm_sdw_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("VIINPUT_SDW"), - - SND_SOC_DAPM_OUTPUT("SPK1 OUT"), - SND_SOC_DAPM_OUTPUT("SPK2 OUT"), - - SND_SOC_DAPM_SUPPLY_S("SDW_CONN", -1, MSM_SDW_TOP_I2S_CLK, - 0, 0, NULL, 0), - - SND_SOC_DAPM_SUPPLY_S("INT_MCLK1", -2, SND_SOC_NOPM, 0, 0, - msm_int_mclk1_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY("SDW_RX_I2S_CLK", - MSM_SDW_TOP_RX_I2S_CTL, 0, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("SDW_TX_I2S_CLK", - MSM_SDW_TOP_TX_I2S_CTL, 0, 0, NULL, 0), -}; - -static const struct snd_kcontrol_new msm_sdw_snd_controls[] = { - SOC_ENUM_EXT("EAR SPKR PA Gain", msm_sdw_ear_spkr_pa_gain_enum, - msm_sdw_ear_spkr_pa_gain_get, - msm_sdw_ear_spkr_pa_gain_put), - SOC_ENUM_EXT("SPKR Left Boost Max State", - msm_sdw_spkr_boost_stage_enum, - msm_sdw_spkr_left_boost_stage_get, - msm_sdw_spkr_left_boost_stage_put), - SOC_ENUM_EXT("SPKR Right Boost Max State", - msm_sdw_spkr_boost_stage_enum, - msm_sdw_spkr_right_boost_stage_get, - msm_sdw_spkr_right_boost_stage_put), - SOC_SINGLE_SX_TLV("RX4 Digital Volume", MSM_SDW_RX7_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX5 Digital Volume", MSM_SDW_RX8_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_EXT("COMP1 Switch", SND_SOC_NOPM, COMP1, 1, 0, - msm_sdw_get_compander, msm_sdw_set_compander), - SOC_SINGLE_EXT("COMP2 Switch", SND_SOC_NOPM, COMP2, 1, 0, - msm_sdw_get_compander, msm_sdw_set_compander), -}; - -static const struct snd_soc_dapm_route audio_map[] = { - - {"AIF1_SDW VI", NULL, "SDW_TX_I2S_CLK"}, - {"SDW_TX_I2S_CLK", NULL, "INT_MCLK1"}, - {"SDW_TX_I2S_CLK", NULL, "SDW_CONN"}, - - /* VI Feedback */ - {"AIF1_VI_SDW Mixer", "SPKR_VI_1", "VIINPUT_SDW"}, - {"AIF1_VI_SDW Mixer", "SPKR_VI_2", "VIINPUT_SDW"}, - {"AIF1_SDW VI", NULL, "AIF1_VI_SDW Mixer"}, - - {"SDW_RX_I2S_CLK", NULL, "INT_MCLK1"}, - {"SDW_RX_I2S_CLK", NULL, "SDW_CONN"}, - {"I2S RX4", NULL, "SDW_RX_I2S_CLK"}, - {"I2S RX5", NULL, "SDW_RX_I2S_CLK"}, - - {"RX4 MIX1 INP1", "RX4", "I2S RX4"}, - {"RX4 MIX1 INP1", "RX5", "I2S RX5"}, - {"RX4 MIX1 INP2", "RX4", "I2S RX4"}, - {"RX4 MIX1 INP2", "RX5", "I2S RX5"}, - {"RX5 MIX1 INP1", "RX4", "I2S RX4"}, - {"RX5 MIX1 INP1", "RX5", "I2S RX5"}, - {"RX5 MIX1 INP2", "RX4", "I2S RX4"}, - {"RX5 MIX1 INP2", "RX5", "I2S RX5"}, - - {"RX4 MIX1", NULL, "RX4 MIX1 INP1"}, - {"RX4 MIX1", NULL, "RX4 MIX1 INP2"}, - {"RX5 MIX1", NULL, "RX5 MIX1 INP1"}, - {"RX5 MIX1", NULL, "RX5 MIX1 INP2"}, - - {"RX INT4 INTERP", NULL, "RX4 MIX1"}, - {"RX INT4 CHAIN", NULL, "RX INT4 INTERP"}, - {"SPK1 OUT", NULL, "RX INT4 CHAIN"}, - - {"RX INT5 INTERP", NULL, "RX5 MIX1"}, - {"RX INT5 CHAIN", NULL, "RX INT5 INTERP"}, - {"SPK2 OUT", NULL, "RX INT5 CHAIN"}, -}; - -static const struct msm_sdw_reg_mask_val msm_sdw_reg_init[] = { - {MSM_SDW_BOOST0_BOOST_CFG1, 0x3F, 0x12}, - {MSM_SDW_BOOST0_BOOST_CFG2, 0x1C, 0x08}, - {MSM_SDW_COMPANDER7_CTL7, 0x1E, 0x18}, - {MSM_SDW_BOOST1_BOOST_CFG1, 0x3F, 0x12}, - {MSM_SDW_BOOST1_BOOST_CFG2, 0x1C, 0x08}, - {MSM_SDW_COMPANDER8_CTL7, 0x1E, 0x18}, - {MSM_SDW_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {MSM_SDW_BOOST1_BOOST_CTL, 0x7C, 0x58}, - {MSM_SDW_RX7_RX_PATH_CFG1, 0x08, 0x08}, - {MSM_SDW_RX8_RX_PATH_CFG1, 0x08, 0x08}, - {MSM_SDW_TOP_TOP_CFG1, 0x02, 0x02}, - {MSM_SDW_TOP_TOP_CFG1, 0x01, 0x01}, - {MSM_SDW_TX9_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {MSM_SDW_TX10_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {MSM_SDW_TX11_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {MSM_SDW_TX12_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {MSM_SDW_COMPANDER7_CTL3, 0x80, 0x80}, - {MSM_SDW_COMPANDER8_CTL3, 0x80, 0x80}, - {MSM_SDW_COMPANDER7_CTL7, 0x01, 0x01}, - {MSM_SDW_COMPANDER8_CTL7, 0x01, 0x01}, - {MSM_SDW_RX7_RX_PATH_CFG0, 0x01, 0x01}, - {MSM_SDW_RX8_RX_PATH_CFG0, 0x01, 0x01}, - {MSM_SDW_RX7_RX_PATH_MIX_CFG, 0x01, 0x01}, - {MSM_SDW_RX8_RX_PATH_MIX_CFG, 0x01, 0x01}, -}; - -static void msm_sdw_init_reg(struct snd_soc_codec *codec) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(msm_sdw_reg_init); i++) - snd_soc_update_bits(codec, - msm_sdw_reg_init[i].reg, - msm_sdw_reg_init[i].mask, - msm_sdw_reg_init[i].val); -} - -static int msm_sdw_notifier_service_cb(struct notifier_block *nb, - unsigned long opcode, void *ptr) -{ - int i; - struct msm_sdw_priv *msm_sdw = container_of(nb, - struct msm_sdw_priv, - service_nb); - bool adsp_ready = false; - unsigned long timeout; - static bool initial_boot = true; - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - mutex_lock(&msm_sdw->codec_mutex); - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - if (initial_boot) { - initial_boot = false; - break; - } - msm_sdw->int_mclk1_enabled = false; - msm_sdw->dev_up = false; - for (i = 0; i < msm_sdw->nr; i++) - swrm_wcd_notify(msm_sdw->sdw_ctrl_data[i].sdw_pdev, - SWR_DEVICE_DOWN, NULL); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (initial_boot) - initial_boot = false; - if (!q6core_is_adsp_ready()) { - dev_dbg(msm_sdw->dev, "ADSP isn't ready\n"); - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - while (!time_after(jiffies, timeout)) { - if (!q6core_is_adsp_ready()) { - dev_dbg(msm_sdw->dev, - "ADSP isn't ready\n"); - } else { - dev_dbg(msm_sdw->dev, - "ADSP is ready\n"); - adsp_ready = true; - goto powerup; - } - } - } else { - adsp_ready = true; - dev_dbg(msm_sdw->dev, "%s: DSP is ready\n", __func__); - } -powerup: - if (adsp_ready) { - msm_sdw->dev_up = true; - msm_sdw_init_reg(msm_sdw->codec); - regcache_mark_dirty(msm_sdw->regmap); - regcache_sync(msm_sdw->regmap); - msm_sdw_set_spkr_mode(msm_sdw->codec, - msm_sdw->spkr_mode); - } - break; - default: - break; - } - mutex_unlock(&msm_sdw->codec_mutex); - return NOTIFY_OK; -} - -static int msm_sdw_codec_probe(struct snd_soc_codec *codec) -{ - struct msm_sdw_priv *msm_sdw; - int i, ret; - - msm_sdw = snd_soc_codec_get_drvdata(codec); - if (!msm_sdw) { - pr_err("%s:SDW priv data null\n", __func__); - return -EINVAL; - } - msm_sdw->codec = codec; - for (i = 0; i < COMP_MAX; i++) - msm_sdw->comp_enabled[i] = 0; - - msm_sdw->spkr_gain_offset = RX_GAIN_OFFSET_0_DB; - msm_sdw_init_reg(codec); - msm_sdw->version = MSM_SDW_VERSION_1_0; - - msm_sdw->service_nb.notifier_call = msm_sdw_notifier_service_cb; - ret = audio_notifier_register("msm_sdw", - AUDIO_NOTIFIER_ADSP_DOMAIN, - &msm_sdw->service_nb); - if (ret < 0) - dev_err(msm_sdw->dev, - "%s: Audio notifier register failed ret = %d\n", - __func__, ret); - return 0; -} - -static int msm_sdw_codec_remove(struct snd_soc_codec *codec) -{ - return 0; -} - -static struct regmap *msm_sdw_get_regmap(struct device *dev) -{ - struct msm_sdw_priv *msm_sdw = dev_get_drvdata(dev); - - return msm_sdw->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_msm_sdw = { - .probe = msm_sdw_codec_probe, - .remove = msm_sdw_codec_remove, - .get_regmap = msm_sdw_get_regmap, - .component_driver = { - .controls = msm_sdw_snd_controls, - .num_controls = ARRAY_SIZE(msm_sdw_snd_controls), - .dapm_widgets = msm_sdw_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(msm_sdw_dapm_widgets), - .dapm_routes = audio_map, - .num_dapm_routes = ARRAY_SIZE(audio_map), - }, -}; - -static void msm_sdw_add_child_devices(struct work_struct *work) -{ - struct msm_sdw_priv *msm_sdw; - struct platform_device *pdev; - struct device_node *node; - struct msm_sdw_ctrl_data *sdw_ctrl_data = NULL, *temp; - int ret, ctrl_num = 0; - struct wcd_sdw_ctrl_platform_data *platdata; - char plat_dev_name[MSM_SDW_STRING_LEN]; - - msm_sdw = container_of(work, struct msm_sdw_priv, - msm_sdw_add_child_devices_work); - if (!msm_sdw) { - pr_err("%s: Memory for msm_sdw does not exist\n", - __func__); - return; - } - if (!msm_sdw->dev->of_node) { - dev_err(msm_sdw->dev, - "%s: DT node for msm_sdw does not exist\n", __func__); - return; - } - - platdata = &msm_sdw->sdw_plat_data; - - for_each_available_child_of_node(msm_sdw->dev->of_node, node) { - if (!strcmp(node->name, "swr_master")) - strlcpy(plat_dev_name, "msm_sdw_swr_ctrl", - (MSM_SDW_STRING_LEN - 1)); - else if (strnstr(node->name, "msm_cdc_pinctrl", - strlen("msm_cdc_pinctrl")) != NULL) - strlcpy(plat_dev_name, node->name, - (MSM_SDW_STRING_LEN - 1)); - else - continue; - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(msm_sdw->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = msm_sdw->dev; - pdev->dev.of_node = node; - - if (!strcmp(node->name, "swr_master")) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (!strcmp(node->name, "swr_master")) { - temp = krealloc(sdw_ctrl_data, - (ctrl_num + 1) * sizeof( - struct msm_sdw_ctrl_data), - GFP_KERNEL); - if (!temp) { - dev_err(&pdev->dev, "out of memory\n"); - ret = -ENOMEM; - goto err; - } - sdw_ctrl_data = temp; - sdw_ctrl_data[ctrl_num].sdw_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - msm_sdw->nr = ctrl_num; - msm_sdw->sdw_ctrl_data = sdw_ctrl_data; - } - msm_sdw->pdev_child_devices[msm_sdw->child_count++] = pdev; - } - - return; -fail_pdev_add: - platform_device_put(pdev); -err: - return; -} - -static int msm_sdw_probe(struct platform_device *pdev) -{ - int ret = 0; - struct msm_sdw_priv *msm_sdw; - int adsp_state; - - adsp_state = apr_get_subsys_state(); - if (adsp_state != APR_SUBSYS_LOADED) { - dev_err(&pdev->dev, "Adsp is not loaded yet %d\n", - adsp_state); - return -EPROBE_DEFER; - } - - msm_sdw = devm_kzalloc(&pdev->dev, sizeof(struct msm_sdw_priv), - GFP_KERNEL); - if (!msm_sdw) - return -ENOMEM; - dev_set_drvdata(&pdev->dev, msm_sdw); - msm_sdw->dev_up = true; - - msm_sdw->dev = &pdev->dev; - INIT_WORK(&msm_sdw->msm_sdw_add_child_devices_work, - msm_sdw_add_child_devices); - msm_sdw->sdw_plat_data.handle = (void *) msm_sdw; - msm_sdw->sdw_plat_data.read = msm_sdw_swrm_read; - msm_sdw->sdw_plat_data.write = msm_sdw_swrm_write; - msm_sdw->sdw_plat_data.bulk_write = msm_sdw_swrm_bulk_write; - msm_sdw->sdw_plat_data.clk = msm_sdw_swrm_clock; - msm_sdw->sdw_plat_data.handle_irq = msm_sdwm_handle_irq; - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &msm_sdw->sdw_base_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - goto err_sdw_cdc; - } - - msm_sdw->sdw_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-sdw-gpios", 0); - msm_sdw->sdw_base = ioremap(msm_sdw->sdw_base_addr, - MSM_SDW_MAX_REGISTER); - msm_sdw->read_dev = __msm_sdw_reg_read; - msm_sdw->write_dev = __msm_sdw_reg_write; - - msm_sdw->regmap = msm_sdw_regmap_init(msm_sdw->dev, - &msm_sdw_regmap_config); - msm_sdw->sdw_irq = platform_get_irq_byname(pdev, "swr_master_irq"); - if (msm_sdw->sdw_irq < 0) { - dev_err(msm_sdw->dev, "%s() error getting irq handle: %d\n", - __func__, msm_sdw->sdw_irq); - ret = -ENODEV; - goto err_sdw_cdc; - } - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_msm_sdw, - msm_sdw_dai, ARRAY_SIZE(msm_sdw_dai)); - if (ret) { - dev_err(&pdev->dev, "%s: Codec registration failed, ret = %d\n", - __func__, ret); - goto err_sdw_cdc; - } - /* initialize the int_mclk1 */ - msm_sdw->sdw_cdc_core_clk.clk_set_minor_version = - AFE_API_VERSION_I2S_CONFIG; - msm_sdw->sdw_cdc_core_clk.clk_id = - Q6AFE_LPASS_CLK_ID_INT_MCLK_1; - msm_sdw->sdw_cdc_core_clk.clk_freq_in_hz = - INT_MCLK1_FREQ; - msm_sdw->sdw_cdc_core_clk.clk_attri = - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; - msm_sdw->sdw_cdc_core_clk.clk_root = - Q6AFE_LPASS_CLK_ROOT_DEFAULT; - msm_sdw->sdw_cdc_core_clk.enable = 0; - - /* initialize the sdw_npl_clk */ - msm_sdw->sdw_npl_clk.clk_set_minor_version = - AFE_API_VERSION_I2S_CONFIG; - msm_sdw->sdw_npl_clk.clk_id = - AFE_CLOCK_SET_CLOCK_ID_SWR_NPL_CLK; - msm_sdw->sdw_npl_clk.clk_freq_in_hz = SDW_NPL_FREQ; - msm_sdw->sdw_npl_clk.clk_attri = - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; - msm_sdw->sdw_npl_clk.clk_root = - Q6AFE_LPASS_CLK_ROOT_DEFAULT; - msm_sdw->sdw_npl_clk.enable = 0; - - INIT_DELAYED_WORK(&msm_sdw->disable_int_mclk1_work, - msm_disable_int_mclk1); - mutex_init(&msm_sdw->cdc_int_mclk1_mutex); - mutex_init(&msm_sdw->sdw_npl_clk_mutex); - mutex_init(&msm_sdw->io_lock); - mutex_init(&msm_sdw->sdw_read_lock); - mutex_init(&msm_sdw->sdw_write_lock); - mutex_init(&msm_sdw->sdw_clk_lock); - mutex_init(&msm_sdw->codec_mutex); - schedule_work(&msm_sdw->msm_sdw_add_child_devices_work); - - dev_dbg(&pdev->dev, "%s: msm_sdw driver probe done\n", __func__); - return ret; - -err_sdw_cdc: - devm_kfree(&pdev->dev, msm_sdw); - return ret; -} - -static int msm_sdw_remove(struct platform_device *pdev) -{ - struct msm_sdw_priv *msm_sdw; - int count; - - msm_sdw = dev_get_drvdata(&pdev->dev); - - for (count = 0; count < msm_sdw->child_count && - count < MSM_SDW_CHILD_DEVICES_MAX; count++) - platform_device_unregister(msm_sdw->pdev_child_devices[count]); - - mutex_destroy(&msm_sdw->io_lock); - mutex_destroy(&msm_sdw->sdw_read_lock); - mutex_destroy(&msm_sdw->sdw_write_lock); - mutex_destroy(&msm_sdw->sdw_clk_lock); - mutex_destroy(&msm_sdw->codec_mutex); - mutex_destroy(&msm_sdw->cdc_int_mclk1_mutex); - - devm_kfree(&pdev->dev, msm_sdw); - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_sdw_codec_dt_match[] = { - { .compatible = "qcom,msm-sdw-codec", }, - {} -}; - -static struct platform_driver msm_sdw_codec_driver = { - .probe = msm_sdw_probe, - .remove = msm_sdw_remove, - .driver = { - .name = "msm_sdw_codec", - .owner = THIS_MODULE, - .of_match_table = msm_sdw_codec_dt_match, - }, -}; -module_platform_driver(msm_sdw_codec_driver); - -MODULE_DESCRIPTION("MSM Soundwire Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc_utils.c b/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc_utils.c deleted file mode 100644 index 9a5c85bf0c6c..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_cdc_utils.c +++ /dev/null @@ -1,211 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "msm_sdw.h" - -#define REG_BYTES 2 -#define VAL_BYTES 1 -/* - * Page Register Address that APP Proc uses to - * access WCD9335 Codec registers is identified - * as 0x00 - */ -#define PAGE_REG_ADDR 0x00 - -/* - * msm_sdw_page_write: - * Retrieve page number from register and - * write that page number to the page address. - * Called under io_lock acquisition. - * - * @msm_sdw: pointer to msm_sdw - * @reg: Register address from which page number is retrieved - * - * Returns 0 for success and negative error code for failure. - */ -int msm_sdw_page_write(struct msm_sdw_priv *msm_sdw, unsigned short reg) -{ - int ret = 0; - u8 pg_num, prev_pg_num; - - pg_num = msm_sdw_page_map[reg]; - if (msm_sdw->prev_pg_valid) { - prev_pg_num = msm_sdw->prev_pg; - if (prev_pg_num != pg_num) { - ret = msm_sdw->write_dev(msm_sdw, PAGE_REG_ADDR, 1, - (void *) &pg_num); - if (ret < 0) { - dev_err(msm_sdw->dev, - "page write error, pg_num: 0x%x\n", - pg_num); - } else { - msm_sdw->prev_pg = pg_num; - dev_dbg(msm_sdw->dev, - "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - } else { - ret = msm_sdw->write_dev(msm_sdw, PAGE_REG_ADDR, 1, - (void *) &pg_num); - if (ret < 0) { - dev_err(msm_sdw->dev, - "page write error, pg_num: 0x%x\n", pg_num); - } else { - msm_sdw->prev_pg = pg_num; - msm_sdw->prev_pg_valid = true; - dev_dbg(msm_sdw->dev, "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - return ret; -} -EXPORT_SYMBOL(msm_sdw_page_write); - -static int regmap_bus_read(void *context, const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct msm_sdw_priv *msm_sdw = dev_get_drvdata(dev); - unsigned short c_reg; - int ret, i; - - if (!msm_sdw) { - dev_err(dev, "%s: msm_sdw is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - if (!msm_sdw->dev_up) { - dev_dbg_ratelimited(dev, "%s: No read allowed. dev_up = %d\n", - __func__, msm_sdw->dev_up); - return 0; - } - - mutex_lock(&msm_sdw->io_lock); - c_reg = *(u16 *)reg; - ret = msm_sdw_page_write(msm_sdw, c_reg); - if (ret) - goto err; - ret = msm_sdw->read_dev(msm_sdw, c_reg, val_size, val); - if (ret < 0) - dev_err(dev, "%s: Codec read failed (%d), reg: 0x%x, size:%zd\n", - __func__, ret, c_reg, val_size); - else { - for (i = 0; i < val_size; i++) - dev_dbg(dev, "%s: Read 0x%02x from 0x%x\n", - __func__, ((u8 *)val)[i], c_reg + i); - } -err: - mutex_unlock(&msm_sdw->io_lock); - - return ret; -} - -static int regmap_bus_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_size) -{ - struct device *dev = context; - struct msm_sdw_priv *msm_sdw = dev_get_drvdata(dev); - unsigned short c_reg; - int ret, i; - - if (!msm_sdw) { - dev_err(dev, "%s: msm_sdw is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - if (!msm_sdw->dev_up) { - dev_dbg_ratelimited(dev, "%s: No write allowed. dev_up = %d\n", - __func__, msm_sdw->dev_up); - return 0; - } - - mutex_lock(&msm_sdw->io_lock); - c_reg = *(u16 *)reg; - ret = msm_sdw_page_write(msm_sdw, c_reg); - if (ret) - goto err; - - for (i = 0; i < val_size; i++) - dev_dbg(dev, "Write %02x to 0x%x\n", ((u8 *)val)[i], - c_reg + i*4); - - ret = msm_sdw->write_dev(msm_sdw, c_reg, val_size, (void *) val); - if (ret < 0) - dev_err(dev, - "%s: Codec write failed (%d), reg:0x%x, size:%zd\n", - __func__, ret, c_reg, val_size); - -err: - mutex_unlock(&msm_sdw->io_lock); - return ret; -} - -static int regmap_bus_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct msm_sdw_priv *msm_sdw = dev_get_drvdata(dev); - - if (!msm_sdw) - return -EINVAL; - - WARN_ON(count < REG_BYTES); - - return regmap_bus_gather_write(context, data, REG_BYTES, - data + REG_BYTES, - count - REG_BYTES); - -} - -static struct regmap_bus regmap_bus_config = { - .write = regmap_bus_write, - .gather_write = regmap_bus_gather_write, - .read = regmap_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -/* - * msm_sdw_regmap_init: - * Initialize msm_sdw register map - * - * @dev: pointer to wcd device - * @config: pointer to register map config - * - * Returns pointer to regmap structure for success - * or NULL in case of failure. - */ -struct regmap *msm_sdw_regmap_init(struct device *dev, - const struct regmap_config *config) -{ - return devm_regmap_init(dev, ®map_bus_config, dev, config); -} -EXPORT_SYMBOL(msm_sdw_regmap_init); diff --git a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_registers.h b/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_registers.h deleted file mode 100644 index 1b7b0b01a6b2..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_registers.h +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MSM_SDW_REGISTERS_H -#define MSM_SDW_REGISTERS_H - -#define MSM_SDW_PAGE_REGISTER 0x0000 - -/* Page-A Registers */ -#define MSM_SDW_TX9_SPKR_PROT_PATH_CTL 0x0308 -#define MSM_SDW_TX9_SPKR_PROT_PATH_CFG0 0x030c -#define MSM_SDW_TX10_SPKR_PROT_PATH_CTL 0x0318 -#define MSM_SDW_TX10_SPKR_PROT_PATH_CFG0 0x031c -#define MSM_SDW_TX11_SPKR_PROT_PATH_CTL 0x0328 -#define MSM_SDW_TX11_SPKR_PROT_PATH_CFG0 0x032c -#define MSM_SDW_TX12_SPKR_PROT_PATH_CTL 0x0338 -#define MSM_SDW_TX12_SPKR_PROT_PATH_CFG0 0x033c - -/* Page-B Registers */ -#define MSM_SDW_COMPANDER7_CTL0 0x0024 -#define MSM_SDW_COMPANDER7_CTL1 0x0028 -#define MSM_SDW_COMPANDER7_CTL2 0x002c -#define MSM_SDW_COMPANDER7_CTL3 0x0030 -#define MSM_SDW_COMPANDER7_CTL4 0x0034 -#define MSM_SDW_COMPANDER7_CTL5 0x0038 -#define MSM_SDW_COMPANDER7_CTL6 0x003c -#define MSM_SDW_COMPANDER7_CTL7 0x0040 -#define MSM_SDW_COMPANDER8_CTL0 0x0044 -#define MSM_SDW_COMPANDER8_CTL1 0x0048 -#define MSM_SDW_COMPANDER8_CTL2 0x004c -#define MSM_SDW_COMPANDER8_CTL3 0x0050 -#define MSM_SDW_COMPANDER8_CTL4 0x0054 -#define MSM_SDW_COMPANDER8_CTL5 0x0058 -#define MSM_SDW_COMPANDER8_CTL6 0x005c -#define MSM_SDW_COMPANDER8_CTL7 0x0060 -#define MSM_SDW_RX7_RX_PATH_CTL 0x01a4 -#define MSM_SDW_RX7_RX_PATH_CFG0 0x01a8 -#define MSM_SDW_RX7_RX_PATH_CFG1 0x01ac -#define MSM_SDW_RX7_RX_PATH_CFG2 0x01b0 -#define MSM_SDW_RX7_RX_VOL_CTL 0x01b4 -#define MSM_SDW_RX7_RX_PATH_MIX_CTL 0x01b8 -#define MSM_SDW_RX7_RX_PATH_MIX_CFG 0x01bc -#define MSM_SDW_RX7_RX_VOL_MIX_CTL 0x01c0 -#define MSM_SDW_RX7_RX_PATH_SEC0 0x01c4 -#define MSM_SDW_RX7_RX_PATH_SEC1 0x01c8 -#define MSM_SDW_RX7_RX_PATH_SEC2 0x01cc -#define MSM_SDW_RX7_RX_PATH_SEC3 0x01d0 -#define MSM_SDW_RX7_RX_PATH_SEC5 0x01d8 -#define MSM_SDW_RX7_RX_PATH_SEC6 0x01dc -#define MSM_SDW_RX7_RX_PATH_SEC7 0x01e0 -#define MSM_SDW_RX7_RX_PATH_MIX_SEC0 0x01e4 -#define MSM_SDW_RX7_RX_PATH_MIX_SEC1 0x01e8 -#define MSM_SDW_RX8_RX_PATH_CTL 0x0384 -#define MSM_SDW_RX8_RX_PATH_CFG0 0x0388 -#define MSM_SDW_RX8_RX_PATH_CFG1 0x038c -#define MSM_SDW_RX8_RX_PATH_CFG2 0x0390 -#define MSM_SDW_RX8_RX_VOL_CTL 0x0394 -#define MSM_SDW_RX8_RX_PATH_MIX_CTL 0x0398 -#define MSM_SDW_RX8_RX_PATH_MIX_CFG 0x039c -#define MSM_SDW_RX8_RX_VOL_MIX_CTL 0x03a0 -#define MSM_SDW_RX8_RX_PATH_SEC0 0x03a4 -#define MSM_SDW_RX8_RX_PATH_SEC1 0x03a8 -#define MSM_SDW_RX8_RX_PATH_SEC2 0x03ac -#define MSM_SDW_RX8_RX_PATH_SEC3 0x03b0 -#define MSM_SDW_RX8_RX_PATH_SEC5 0x03b8 -#define MSM_SDW_RX8_RX_PATH_SEC6 0x03bc -#define MSM_SDW_RX8_RX_PATH_SEC7 0x03c0 -#define MSM_SDW_RX8_RX_PATH_MIX_SEC0 0x03c4 -#define MSM_SDW_RX8_RX_PATH_MIX_SEC1 0x03c8 - -/* Page-C Registers */ -#define MSM_SDW_BOOST0_BOOST_PATH_CTL 0x0064 -#define MSM_SDW_BOOST0_BOOST_CTL 0x0068 -#define MSM_SDW_BOOST0_BOOST_CFG1 0x006c -#define MSM_SDW_BOOST0_BOOST_CFG2 0x0070 -#define MSM_SDW_BOOST1_BOOST_PATH_CTL 0x0084 -#define MSM_SDW_BOOST1_BOOST_CTL 0x0088 -#define MSM_SDW_BOOST1_BOOST_CFG1 0x008c -#define MSM_SDW_BOOST1_BOOST_CFG2 0x0090 -#define MSM_SDW_AHB_BRIDGE_WR_DATA_0 0x00a4 -#define MSM_SDW_AHB_BRIDGE_WR_DATA_1 0x00a8 -#define MSM_SDW_AHB_BRIDGE_WR_DATA_2 0x00ac -#define MSM_SDW_AHB_BRIDGE_WR_DATA_3 0x00b0 -#define MSM_SDW_AHB_BRIDGE_WR_ADDR_0 0x00b4 -#define MSM_SDW_AHB_BRIDGE_WR_ADDR_1 0x00b8 -#define MSM_SDW_AHB_BRIDGE_WR_ADDR_2 0x00bc -#define MSM_SDW_AHB_BRIDGE_WR_ADDR_3 0x00c0 -#define MSM_SDW_AHB_BRIDGE_RD_ADDR_0 0x00c4 -#define MSM_SDW_AHB_BRIDGE_RD_ADDR_1 0x00c8 -#define MSM_SDW_AHB_BRIDGE_RD_ADDR_2 0x00cc -#define MSM_SDW_AHB_BRIDGE_RD_ADDR_3 0x00d0 -#define MSM_SDW_AHB_BRIDGE_RD_DATA_0 0x00d4 -#define MSM_SDW_AHB_BRIDGE_RD_DATA_1 0x00d8 -#define MSM_SDW_AHB_BRIDGE_RD_DATA_2 0x00dc -#define MSM_SDW_AHB_BRIDGE_RD_DATA_3 0x00e0 -#define MSM_SDW_AHB_BRIDGE_ACCESS_CFG 0x00e4 -#define MSM_SDW_AHB_BRIDGE_ACCESS_STATUS 0x00e8 - -/* Page-D Registers */ -#define MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL 0x0104 -#define MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL 0x0108 -#define MSM_SDW_CLK_RST_CTRL_SWR_CONTROL 0x010c -#define MSM_SDW_TOP_TOP_CFG0 0x0204 -#define MSM_SDW_TOP_TOP_CFG1 0x0208 -#define MSM_SDW_TOP_RX_I2S_CTL 0x020c -#define MSM_SDW_TOP_TX_I2S_CTL 0x0210 -#define MSM_SDW_TOP_I2S_CLK 0x0214 -#define MSM_SDW_TOP_RX7_PATH_INPUT0_MUX 0x0218 -#define MSM_SDW_TOP_RX7_PATH_INPUT1_MUX 0x021c -#define MSM_SDW_TOP_RX8_PATH_INPUT0_MUX 0x0220 -#define MSM_SDW_TOP_RX8_PATH_INPUT1_MUX 0x0224 -#define MSM_SDW_TOP_FREQ_MCLK 0x0228 -#define MSM_SDW_TOP_DEBUG_BUS_SEL 0x022c -#define MSM_SDW_TOP_DEBUG_EN 0x0230 -#define MSM_SDW_TOP_I2S_RESET 0x0234 -#define MSM_SDW_TOP_BLOCKS_RESET 0x0238 - -#endif diff --git a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_regmap.c b/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_regmap.c deleted file mode 100644 index 7613e65d2c19..000000000000 --- a/techpack/audio/asoc/codecs/msm_sdw/msm_sdw_regmap.c +++ /dev/null @@ -1,161 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "msm_sdw.h" - -static const struct reg_default msm_sdw_defaults[] = { - /* Page #10 registers */ - { MSM_SDW_PAGE_REGISTER, 0x00 }, - { MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x02 }, - { MSM_SDW_TX9_SPKR_PROT_PATH_CFG0, 0x00 }, - { MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x02 }, - { MSM_SDW_TX10_SPKR_PROT_PATH_CFG0, 0x00 }, - { MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x02 }, - { MSM_SDW_TX11_SPKR_PROT_PATH_CFG0, 0x00 }, - { MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x02 }, - { MSM_SDW_TX12_SPKR_PROT_PATH_CFG0, 0x00 }, - /* Page #11 registers */ - { MSM_SDW_COMPANDER7_CTL0, 0x60 }, - { MSM_SDW_COMPANDER7_CTL1, 0xdb }, - { MSM_SDW_COMPANDER7_CTL2, 0xff }, - { MSM_SDW_COMPANDER7_CTL3, 0x35 }, - { MSM_SDW_COMPANDER7_CTL4, 0xff }, - { MSM_SDW_COMPANDER7_CTL5, 0x00 }, - { MSM_SDW_COMPANDER7_CTL6, 0x01 }, - { MSM_SDW_COMPANDER8_CTL0, 0x60 }, - { MSM_SDW_COMPANDER8_CTL1, 0xdb }, - { MSM_SDW_COMPANDER8_CTL2, 0xff }, - { MSM_SDW_COMPANDER8_CTL3, 0x35 }, - { MSM_SDW_COMPANDER8_CTL4, 0xff }, - { MSM_SDW_COMPANDER8_CTL5, 0x00 }, - { MSM_SDW_COMPANDER8_CTL6, 0x01 }, - { MSM_SDW_RX7_RX_PATH_CTL, 0x04 }, - { MSM_SDW_RX7_RX_PATH_CFG0, 0x00 }, - { MSM_SDW_RX7_RX_PATH_CFG2, 0x8f }, - { MSM_SDW_RX7_RX_VOL_CTL, 0x00 }, - { MSM_SDW_RX7_RX_PATH_MIX_CTL, 0x04 }, - { MSM_SDW_RX7_RX_VOL_MIX_CTL, 0x00 }, - { MSM_SDW_RX7_RX_PATH_SEC2, 0x00 }, - { MSM_SDW_RX7_RX_PATH_SEC3, 0x00 }, - { MSM_SDW_RX7_RX_PATH_SEC5, 0x00 }, - { MSM_SDW_RX7_RX_PATH_SEC6, 0x00 }, - { MSM_SDW_RX7_RX_PATH_SEC7, 0x00 }, - { MSM_SDW_RX7_RX_PATH_MIX_SEC1, 0x00 }, - { MSM_SDW_RX8_RX_PATH_CTL, 0x04 }, - { MSM_SDW_RX8_RX_PATH_CFG0, 0x00 }, - { MSM_SDW_RX8_RX_PATH_CFG2, 0x8f }, - { MSM_SDW_RX8_RX_VOL_CTL, 0x00 }, - { MSM_SDW_RX8_RX_PATH_MIX_CTL, 0x04 }, - { MSM_SDW_RX8_RX_VOL_MIX_CTL, 0x00 }, - { MSM_SDW_RX8_RX_PATH_SEC2, 0x00 }, - { MSM_SDW_RX8_RX_PATH_SEC3, 0x00 }, - { MSM_SDW_RX8_RX_PATH_SEC5, 0x00 }, - { MSM_SDW_RX8_RX_PATH_SEC6, 0x00 }, - { MSM_SDW_RX8_RX_PATH_SEC7, 0x00 }, - { MSM_SDW_RX8_RX_PATH_MIX_SEC1, 0x00 }, - /* Page #12 registers */ - { MSM_SDW_BOOST0_BOOST_PATH_CTL, 0x00 }, - { MSM_SDW_BOOST0_BOOST_CTL, 0xb2 }, - { MSM_SDW_BOOST0_BOOST_CFG1, 0x00 }, - { MSM_SDW_BOOST0_BOOST_CFG2, 0x00 }, - { MSM_SDW_BOOST1_BOOST_PATH_CTL, 0x00 }, - { MSM_SDW_BOOST1_BOOST_CTL, 0xb2 }, - { MSM_SDW_BOOST1_BOOST_CFG1, 0x00 }, - { MSM_SDW_BOOST1_BOOST_CFG2, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_DATA_0, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_DATA_1, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_DATA_2, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_DATA_3, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_ADDR_0, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_ADDR_1, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_ADDR_2, 0x00 }, - { MSM_SDW_AHB_BRIDGE_WR_ADDR_3, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_ADDR_0, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_ADDR_1, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_ADDR_2, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_ADDR_3, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_DATA_0, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_DATA_1, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_DATA_2, 0x00 }, - { MSM_SDW_AHB_BRIDGE_RD_DATA_3, 0x00 }, - { MSM_SDW_AHB_BRIDGE_ACCESS_CFG, 0x0f }, - { MSM_SDW_AHB_BRIDGE_ACCESS_STATUS, 0x03 }, - /* Page #13 registers */ - { MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL, 0x00 }, - { MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00 }, - { MSM_SDW_CLK_RST_CTRL_SWR_CONTROL, 0x00 }, - { MSM_SDW_TOP_TOP_CFG0, 0x00 }, - { MSM_SDW_TOP_TOP_CFG1, 0x00 }, - { MSM_SDW_TOP_RX_I2S_CTL, 0x0C }, - { MSM_SDW_TOP_TX_I2S_CTL, 0x00 }, - { MSM_SDW_TOP_I2S_CLK, 0x00 }, - { MSM_SDW_TOP_RX7_PATH_INPUT0_MUX, 0x00 }, - { MSM_SDW_TOP_RX7_PATH_INPUT1_MUX, 0x00 }, - { MSM_SDW_TOP_RX8_PATH_INPUT0_MUX, 0x00 }, - { MSM_SDW_TOP_RX8_PATH_INPUT1_MUX, 0x00 }, - { MSM_SDW_TOP_FREQ_MCLK, 0x00 }, - { MSM_SDW_TOP_DEBUG_BUS_SEL, 0x00 }, - { MSM_SDW_TOP_DEBUG_EN, 0x00 }, - { MSM_SDW_TOP_I2S_RESET, 0x00 }, - { MSM_SDW_TOP_BLOCKS_RESET, 0x00 }, -}; - -static bool msm_sdw_is_readable_register(struct device *dev, unsigned int reg) -{ - return msm_sdw_reg_readable[reg]; -} - -static bool msm_sdw_is_writeable_register(struct device *dev, unsigned int reg) -{ - return msm_sdw_reg_writeable[reg]; -} - -static bool msm_sdw_is_volatile_register(struct device *dev, unsigned int reg) -{ - switch (reg) { - case MSM_SDW_AHB_BRIDGE_WR_DATA_0: - case MSM_SDW_AHB_BRIDGE_WR_DATA_1: - case MSM_SDW_AHB_BRIDGE_WR_DATA_2: - case MSM_SDW_AHB_BRIDGE_WR_DATA_3: - case MSM_SDW_AHB_BRIDGE_WR_ADDR_0: - case MSM_SDW_AHB_BRIDGE_WR_ADDR_1: - case MSM_SDW_AHB_BRIDGE_WR_ADDR_2: - case MSM_SDW_AHB_BRIDGE_WR_ADDR_3: - case MSM_SDW_AHB_BRIDGE_RD_DATA_0: - case MSM_SDW_AHB_BRIDGE_RD_DATA_1: - case MSM_SDW_AHB_BRIDGE_RD_DATA_2: - case MSM_SDW_AHB_BRIDGE_RD_DATA_3: - case MSM_SDW_AHB_BRIDGE_RD_ADDR_0: - case MSM_SDW_AHB_BRIDGE_RD_ADDR_1: - case MSM_SDW_AHB_BRIDGE_RD_ADDR_2: - case MSM_SDW_AHB_BRIDGE_RD_ADDR_3: - case MSM_SDW_CLK_RST_CTRL_MCLK_CONTROL: - case MSM_SDW_CLK_RST_CTRL_FS_CNT_CONTROL: - return true; - default: - return false; - } -} - -const struct regmap_config msm_sdw_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .reg_stride = 4, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = msm_sdw_defaults, - .num_reg_defaults = ARRAY_SIZE(msm_sdw_defaults), - .max_register = MSM_SDW_MAX_REGISTER, - .writeable_reg = msm_sdw_is_writeable_register, - .volatile_reg = msm_sdw_is_volatile_register, - .readable_reg = msm_sdw_is_readable_register, -}; diff --git a/techpack/audio/asoc/codecs/msm_stub.c b/techpack/audio/asoc/codecs/msm_stub.c deleted file mode 100644 index 68e55ae1da16..000000000000 --- a/techpack/audio/asoc/codecs/msm_stub.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (c) 2011-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include - -/* A dummy driver useful only to advertise hardware parameters */ -static struct snd_soc_dai_driver msm_stub_dais[] = { - { - .name = "msm-stub-rx", - .playback = { /* Support maximum range */ - .stream_name = "Playback", - .channels_min = 1, - .channels_max = 8, - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - }, - { - .name = "msm-stub-tx", - .capture = { /* Support maximum range */ - .stream_name = "Record", - .channels_min = 1, - .channels_max = 8, - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - }, - }, -}; - -static struct snd_soc_codec_driver soc_msm_stub = {}; - -static int msm_stub_dev_probe(struct platform_device *pdev) -{ - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - - return snd_soc_register_codec(&pdev->dev, - &soc_msm_stub, msm_stub_dais, ARRAY_SIZE(msm_stub_dais)); -} - -static int msm_stub_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} -static const struct of_device_id msm_stub_codec_dt_match[] = { - { .compatible = "qcom,msm-stub-codec", }, - {} -}; - -static struct platform_driver msm_stub_driver = { - .driver = { - .name = "msm-stub-codec", - .owner = THIS_MODULE, - .of_match_table = msm_stub_codec_dt_match, - }, - .probe = msm_stub_dev_probe, - .remove = msm_stub_dev_remove, -}; - -static int __init msm_stub_init(void) -{ - return platform_driver_register(&msm_stub_driver); -} -module_init(msm_stub_init); - -static void __exit msm_stub_exit(void) -{ - platform_driver_unregister(&msm_stub_driver); -} -module_exit(msm_stub_exit); - -MODULE_DESCRIPTION("Generic MSM CODEC driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/pdata.h b/techpack/audio/asoc/codecs/pdata.h deleted file mode 100644 index d38ae84914b7..000000000000 --- a/techpack/audio/asoc/codecs/pdata.h +++ /dev/null @@ -1,201 +0,0 @@ -/* Copyright (c) 2011-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MFD_WCD9XXX_PDATA_H__ - -#define __MFD_WCD9XXX_PDATA_H__ - -#include -#include "msm-cdc-supply.h" - -#define MICBIAS_EXT_BYP_CAP 0x00 -#define MICBIAS_NO_EXT_BYP_CAP 0x01 - -#define SITAR_LDOH_1P95_V 0x0 -#define SITAR_LDOH_2P35_V 0x1 -#define SITAR_LDOH_2P75_V 0x2 -#define SITAR_LDOH_2P85_V 0x3 - -#define SITAR_CFILT1_SEL 0x0 -#define SITAR_CFILT2_SEL 0x1 -#define SITAR_CFILT3_SEL 0x2 - -#define WCD9XXX_LDOH_1P95_V 0x0 -#define WCD9XXX_LDOH_2P35_V 0x1 -#define WCD9XXX_LDOH_2P75_V 0x2 -#define WCD9XXX_LDOH_2P85_V 0x3 -#define WCD9XXX_LDOH_3P0_V 0x3 - -#define TABLA_LDOH_1P95_V 0x0 -#define TABLA_LDOH_2P35_V 0x1 -#define TABLA_LDOH_2P75_V 0x2 -#define TABLA_LDOH_2P85_V 0x3 - -#define TABLA_CFILT1_SEL 0x0 -#define TABLA_CFILT2_SEL 0x1 -#define TABLA_CFILT3_SEL 0x2 - -#define MAX_AMIC_CHANNEL 7 - -#define TABLA_OCP_300_MA 0x0 -#define TABLA_OCP_350_MA 0x2 -#define TABLA_OCP_365_MA 0x3 -#define TABLA_OCP_150_MA 0x4 -#define TABLA_OCP_190_MA 0x6 -#define TABLA_OCP_220_MA 0x7 - -#define TABLA_DCYCLE_255 0x0 -#define TABLA_DCYCLE_511 0x1 -#define TABLA_DCYCLE_767 0x2 -#define TABLA_DCYCLE_1023 0x3 -#define TABLA_DCYCLE_1279 0x4 -#define TABLA_DCYCLE_1535 0x5 -#define TABLA_DCYCLE_1791 0x6 -#define TABLA_DCYCLE_2047 0x7 -#define TABLA_DCYCLE_2303 0x8 -#define TABLA_DCYCLE_2559 0x9 -#define TABLA_DCYCLE_2815 0xA -#define TABLA_DCYCLE_3071 0xB -#define TABLA_DCYCLE_3327 0xC -#define TABLA_DCYCLE_3583 0xD -#define TABLA_DCYCLE_3839 0xE -#define TABLA_DCYCLE_4095 0xF - -#define WCD9XXX_MCLK_CLK_12P288MHZ 12288000 -#define WCD9XXX_MCLK_CLK_9P6HZ 9600000 - -/* Only valid for 9.6 MHz mclk */ -#define WCD9XXX_DMIC_SAMPLE_RATE_600KHZ 600000 -#define WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ 2400000 -#define WCD9XXX_DMIC_SAMPLE_RATE_3P2MHZ 3200000 -#define WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ 4800000 - -/* Only valid for 12.288 MHz mclk */ -#define WCD9XXX_DMIC_SAMPLE_RATE_768KHZ 768000 -#define WCD9XXX_DMIC_SAMPLE_RATE_2P048MHZ 2048000 -#define WCD9XXX_DMIC_SAMPLE_RATE_3P072MHZ 3072000 -#define WCD9XXX_DMIC_SAMPLE_RATE_4P096MHZ 4096000 -#define WCD9XXX_DMIC_SAMPLE_RATE_6P144MHZ 6144000 - -#define WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED 0 - -#define WCD9XXX_DMIC_CLK_DRIVE_UNDEFINED 0 - -struct wcd9xxx_amic { - /*legacy mode, txfe_enable and txfe_buff take 7 input - * each bit represent the channel / TXFE number - * and numbered as below - * bit 0 = channel 1 / TXFE1_ENABLE / TXFE1_BUFF - * bit 1 = channel 2 / TXFE2_ENABLE / TXFE2_BUFF - * ... - * bit 7 = channel 7 / TXFE7_ENABLE / TXFE7_BUFF - */ - u8 legacy_mode:MAX_AMIC_CHANNEL; - u8 txfe_enable:MAX_AMIC_CHANNEL; - u8 txfe_buff:MAX_AMIC_CHANNEL; - u8 use_pdata:MAX_AMIC_CHANNEL; -}; - -/* Each micbias can be assigned to one of three cfilters - * Vbatt_min >= .15V + ldoh_v - * ldoh_v >= .15v + cfiltx_mv - * If ldoh_v = 1.95 160 mv < cfiltx_mv < 1800 mv - * If ldoh_v = 2.35 200 mv < cfiltx_mv < 2200 mv - * If ldoh_v = 2.75 240 mv < cfiltx_mv < 2600 mv - * If ldoh_v = 2.85 250 mv < cfiltx_mv < 2700 mv - */ - -struct wcd9xxx_micbias_setting { - u8 ldoh_v; - u32 cfilt1_mv; /* in mv */ - u32 cfilt2_mv; /* in mv */ - u32 cfilt3_mv; /* in mv */ - u32 micb1_mv; - u32 micb2_mv; - u32 micb3_mv; - u32 micb4_mv; - /* Different WCD9xxx series codecs may not - * have 4 mic biases. If a codec has fewer - * mic biases, some of these properties will - * not be used. - */ - u8 bias1_cfilt_sel; - u8 bias2_cfilt_sel; - u8 bias3_cfilt_sel; - u8 bias4_cfilt_sel; - u8 bias1_cap_mode; - u8 bias2_cap_mode; - u8 bias3_cap_mode; - u8 bias4_cap_mode; - bool bias2_is_headset_only; -}; - -struct wcd9xxx_ocp_setting { - unsigned int use_pdata:1; /* 0 - use sys default as recommended */ - unsigned int num_attempts:4; /* up to 15 attempts */ - unsigned int run_time:4; /* in duty cycle */ - unsigned int wait_time:4; /* in duty cycle */ - unsigned int hph_ocp_limit:3; /* Headphone OCP current limit */ -}; - -#define WCD9XXX_MAX_REGULATOR 9 -/* - * format : TABLA__CUR_MAX - * - * from Tabla objective spec - */ - -#define WCD9XXX_CDC_VDDA_CP_CUR_MAX 500000 -#define WCD9XXX_CDC_VDDA_RX_CUR_MAX 20000 -#define WCD9XXX_CDC_VDDA_TX_CUR_MAX 20000 -#define WCD9XXX_VDDIO_CDC_CUR_MAX 5000 - -#define WCD9XXX_VDDD_CDC_D_CUR_MAX 5000 -#define WCD9XXX_VDDD_CDC_A_CUR_MAX 5000 - -#define WCD9XXX_VDD_SPKDRV_NAME "cdc-vdd-spkdrv" -#define WCD9XXX_VDD_SPKDRV2_NAME "cdc-vdd-spkdrv-2" - -struct wcd9xxx_regulator { - const char *name; - int min_uV; - int max_uV; - int optimum_uA; - bool ondemand; - struct regulator *regulator; -}; - -struct wcd9xxx_pdata { - int irq; - int irq_base; - int num_irqs; - int reset_gpio; - bool has_buck_vsel_gpio; - bool has_micb_supply_en_gpio; - struct device_node *buck_vsel_ctl_np; - struct device_node *micb_en_ctl; - struct device_node *wcd_rst_np; - struct wcd9xxx_amic amic_settings; - struct slim_device slimbus_slave_device; - struct wcd9xxx_micbias_setting micbias; - struct wcd9xxx_ocp_setting ocp; - struct cdc_regulator *regulator; - int num_supplies; - u32 mclk_rate; - u32 dmic_sample_rate; - u32 mad_dmic_sample_rate; - u32 ecpp_dmic_sample_rate; - u32 dmic_clk_drv; - u16 use_pinctrl; -}; - -#endif diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/Android.mk b/techpack/audio/asoc/codecs/sdm660_cdc/Android.mk deleted file mode 100644 index 17c4c4f80b26..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/Android.mk +++ /dev/null @@ -1,53 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm660 sdm670 qcs605),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=analog_cdc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_analog_cdc.ko -LOCAL_MODULE_KBUILD_NAME := analog_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_digital_cdc.ko -LOCAL_MODULE_KBUILD_NAME := digital_cdc_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/Kbuild b/techpack/audio/asoc/codecs/sdm660_cdc/Kbuild deleted file mode 100644 index 6dacbb80f5b5..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/Kbuild +++ /dev/null @@ -1,129 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.9 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ SDM660_CDC ############ - -# for SDM660_CDC Codec -ifdef CONFIG_SND_SOC_ANALOG_CDC - ANALOG_CDC_OBJS += msm-analog-cdc.o - ANALOG_CDC_OBJS += sdm660-cdc-irq.o -endif - -ifdef CONFIG_SND_SOC_DIGITAL_CDC - DIGITAL_CDC_OBJS += msm-digital-cdc.o - DIGITAL_CDC_OBJS += msm-digital-cdc-regmap.o -endif -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_ANALOG_CDC) += analog_cdc_dlkm.o -analog_cdc_dlkm-y := $(ANALOG_CDC_OBJS) - -obj-$(CONFIG_SND_SOC_DIGITAL_CDC) += digital_cdc_dlkm.o -digital_cdc_dlkm-y := $(DIGITAL_CDC_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h b/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h deleted file mode 100644 index 55846a1a20ca..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef ANALOG_CDC_REGMAP_H -#define ANALOG_CDC_REGMAP_H - -#include -#include "sdm660-cdc-registers.h" - -/* - * Default register reset values that are common across different versions - * are defined here. If a register reset value is changed based on version - * then remove it from this structure and add it in version specific - * structures. - */ - -struct reg_default - msm89xx_pmic_cdc_defaults[MSM89XX_PMIC_CDC_CACHE_SIZE] = { - {MSM89XX_PMIC_DIGITAL_REVISION1, 0x00}, - {MSM89XX_PMIC_DIGITAL_REVISION2, 0x00}, - {MSM89XX_PMIC_DIGITAL_PERPH_TYPE, 0x23}, - {MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE, 0x01}, - {MSM89XX_PMIC_DIGITAL_INT_RT_STS, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_SET_TYPE, 0xFF}, - {MSM89XX_PMIC_DIGITAL_INT_POLARITY_HIGH, 0xFF}, - {MSM89XX_PMIC_DIGITAL_INT_POLARITY_LOW, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_LATCHED_CLR, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_EN_SET, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_EN_CLR, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_PENDING_STS, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_MID_SEL, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_PRIORITY, 0x00}, - {MSM89XX_PMIC_DIGITAL_GPIO_MODE, 0x00}, - {MSM89XX_PMIC_DIGITAL_PIN_CTL_OE, 0x01}, - {MSM89XX_PMIC_DIGITAL_PIN_CTL_DATA, 0x00}, - {MSM89XX_PMIC_DIGITAL_PIN_STATUS, 0x00}, - {MSM89XX_PMIC_DIGITAL_HDRIVE_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL, 0x02}, - {MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL, 0x02}, - {MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX1_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX2_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX3_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX_LB_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL1, 0x7C}, - {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL2, 0x7C}, - {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL3, 0x7C}, - {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA0, 0x00}, - {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA1, 0x00}, - {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA2, 0x00}, - {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA3, 0x00}, - {MSM89XX_PMIC_DIGITAL_DIG_DEBUG_CTL, 0x00}, - {MSM89XX_PMIC_DIGITAL_DIG_DEBUG_EN, 0x00}, - {MSM89XX_PMIC_DIGITAL_SPARE_0, 0x00}, - {MSM89XX_PMIC_DIGITAL_SPARE_1, 0x00}, - {MSM89XX_PMIC_DIGITAL_SPARE_2, 0x00}, - {MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0x00}, - {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL1, 0x00}, - {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL2, 0x02}, - {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x05}, - {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_TEST1, 0x00}, - {MSM89XX_PMIC_DIGITAL_INT_TEST_VAL, 0x00}, - {MSM89XX_PMIC_DIGITAL_TRIM_NUM, 0x00}, - {MSM89XX_PMIC_DIGITAL_TRIM_CTRL, 0x00}, - {MSM89XX_PMIC_ANALOG_REVISION1, 0x00}, - {MSM89XX_PMIC_ANALOG_REVISION2, 0x00}, - {MSM89XX_PMIC_ANALOG_REVISION3, 0x00}, - {MSM89XX_PMIC_ANALOG_REVISION4, 0x00}, - {MSM89XX_PMIC_ANALOG_PERPH_TYPE, 0x23}, - {MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE, 0x09}, - {MSM89XX_PMIC_ANALOG_INT_RT_STS, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_SET_TYPE, 0x3F}, - {MSM89XX_PMIC_ANALOG_INT_POLARITY_HIGH, 0x3F}, - {MSM89XX_PMIC_ANALOG_INT_POLARITY_LOW, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_LATCHED_CLR, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_EN_SET, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_EN_CLR, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_LATCHED_STS, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_PENDING_STS, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_MID_SEL, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_PRIORITY, 0x00}, - {MSM89XX_PMIC_ANALOG_MICB_1_EN, 0x00}, - {MSM89XX_PMIC_ANALOG_MICB_1_VAL, 0x20}, - {MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x00}, - {MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS, 0x49}, - {MSM89XX_PMIC_ANALOG_MICB_2_EN, 0x20}, - {MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2, 0x00}, - {MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x00}, - {MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x35}, - {MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x08}, - {MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x00}, - {MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0x98}, - {MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, 0x00}, - {MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL, 0x20}, - {MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, 0x40}, - {MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL, 0x61}, - {MSM89XX_PMIC_ANALOG_MBHC_BTN4_CTL, 0x80}, - {MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT, 0x00}, - {MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x00}, - {MSM89XX_PMIC_ANALOG_TX_1_EN, 0x03}, - {MSM89XX_PMIC_ANALOG_TX_2_EN, 0x03}, - {MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_1, 0xBF}, - {MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2, 0x8C}, - {MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL, 0x00}, - {MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x6B}, - {MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV, 0x51}, - {MSM89XX_PMIC_ANALOG_TX_3_EN, 0x02}, - {MSM89XX_PMIC_ANALOG_NCP_EN, 0x26}, - {MSM89XX_PMIC_ANALOG_NCP_CLK, 0x23}, - {MSM89XX_PMIC_ANALOG_NCP_DEGLITCH, 0x5B}, - {MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x08}, - {MSM89XX_PMIC_ANALOG_NCP_BIAS, 0x29}, - {MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0x24}, - {MSM89XX_PMIC_ANALOG_NCP_TEST, 0x00}, - {MSM89XX_PMIC_ANALOG_NCP_CLIM_ADDR, 0xD5}, - {MSM89XX_PMIC_ANALOG_RX_CLOCK_DIVIDER, 0xE8}, - {MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0xCF}, - {MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT, 0x6E}, - {MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x18}, - {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0x5A}, - {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_LDO_OCP, 0x69}, - {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP, 0x29}, - {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x80}, - {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_CTL, 0xDA}, - {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0x16}, - {MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x00}, - {MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x20}, - {MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x00}, - {MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x20}, - {MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x12}, - {MSM89XX_PMIC_ANALOG_RX_ATEST, 0x00}, - {MSM89XX_PMIC_ANALOG_RX_HPH_STATUS, 0x0C}, - {MSM89XX_PMIC_ANALOG_RX_EAR_STATUS, 0x00}, - {MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x00}, - {MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x00}, - {MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x83}, - {MSM89XX_PMIC_ANALOG_SPKR_DRV_CLIP_DET, 0x91}, - {MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x29}, - {MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x4D}, - {MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1}, - {MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x1E}, - {MSM89XX_PMIC_ANALOG_SPKR_DRV_MISC, 0xCB}, - {MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x00}, - {MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x02}, - {MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE, 0x14}, - {MSM89XX_PMIC_ANALOG_BYPASS_MODE, 0x00}, - {MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, 0x1F}, - {MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, 0x8C}, - {MSM89XX_PMIC_ANALOG_RDSON_MAX_DUTY_CYCLE, 0xC0}, - {MSM89XX_PMIC_ANALOG_BOOST_TEST1_1, 0x00}, - {MSM89XX_PMIC_ANALOG_BOOST_TEST_2, 0x00}, - {MSM89XX_PMIC_ANALOG_SPKR_SAR_STATUS, 0x00}, - {MSM89XX_PMIC_ANALOG_SPKR_DRV_STATUS, 0x00}, - {MSM89XX_PMIC_ANALOG_PBUS_ADD_CSR, 0x00}, - {MSM89XX_PMIC_ANALOG_PBUS_ADD_SEL, 0x00}, - {MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0x00}, - {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL1, 0x00}, - {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL2, 0x01}, - {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x05}, - {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_TEST1, 0x00}, - {MSM89XX_PMIC_ANALOG_INT_TEST_VAL, 0x00}, - {MSM89XX_PMIC_ANALOG_TRIM_NUM, 0x04}, - {MSM89XX_PMIC_ANALOG_TRIM_CTRL1, 0x00}, - {MSM89XX_PMIC_ANALOG_TRIM_CTRL2, 0x00}, - {MSM89XX_PMIC_ANALOG_TRIM_CTRL3, 0x00}, - {MSM89XX_PMIC_ANALOG_TRIM_CTRL4, 0x00}, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.c b/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.c deleted file mode 100644 index abfa4b7e3f44..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.c +++ /dev/null @@ -1,4667 +0,0 @@ -/* Copyright (c) 2015-2018, 2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-analog-cdc.h" -#include "msm-cdc-common.h" -#include "sdm660-cdc-irq.h" -#include "msm-analog-cdc-regmap.h" -#include "../../sdm660-common.h" -#include "../wcd-mbhc-v2-api.h" - -#define DRV_NAME "pmic_analog_codec" -#define SDM660_CDC_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\ - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\ - SNDRV_PCM_RATE_192000) -#define SDM660_CDC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE) -#define MSM_DIG_CDC_STRING_LEN 80 -#define MSM_ANLG_CDC_VERSION_ENTRY_SIZE 32 - -#define CODEC_DT_MAX_PROP_SIZE 40 -#define MAX_ON_DEMAND_SUPPLY_NAME_LENGTH 64 -#define BUS_DOWN 1 - -/* - * 200 Milliseconds sufficient for DSP bring up in the lpass - * after Sub System Restart - */ -#define ADSP_STATE_READY_TIMEOUT_MS 200 - -#define EAR_PMD 0 -#define EAR_PMU 1 -#define SPK_PMD 2 -#define SPK_PMU 3 - -#define MICBIAS_DEFAULT_VAL 1800000 -#define MICBIAS_MIN_VAL 1600000 -#define MICBIAS_STEP_SIZE 50000 - -#define DEFAULT_BOOST_VOLTAGE 5000 -#define MIN_BOOST_VOLTAGE 4000 -#define MAX_BOOST_VOLTAGE 5550 -#define BOOST_VOLTAGE_STEP 50 - -#define SDM660_CDC_MBHC_BTN_COARSE_ADJ 100 /* in mV */ -#define SDM660_CDC_MBHC_BTN_FINE_ADJ 12 /* in mV */ - -#define VOLTAGE_CONVERTER(value, min_value, step_size)\ - ((value - min_value)/step_size) - -enum { - BOOST_SWITCH = 0, - BOOST_ALWAYS, - BYPASS_ALWAYS, - BOOST_ON_FOREVER, -}; - -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); -static struct snd_soc_dai_driver msm_anlg_cdc_i2s_dai[]; -/* By default enable the internal speaker boost */ -static bool spkr_boost_en = true; - -static char on_demand_supply_name[][MAX_ON_DEMAND_SUPPLY_NAME_LENGTH] = { - "cdc-vdd-mic-bias", -}; - -static struct wcd_mbhc_register - wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { - WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x18, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC", - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x06, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN", - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC", - MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0xF0, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC", - MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0x0C, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF", - MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT", - MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x01, - 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_IN2P_CLAMP_STATE", - SND_SOC_NOPM, 0x0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT", - MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x02, - 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT", - MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x08, - 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT", - MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x04, - 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN", - MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT", - MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL", - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT", - MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0xFF, - 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL", - MSM89XX_PMIC_ANALOG_MICB_2_EN, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME", - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0xFC, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN", - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN", - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN", - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x30, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", - MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, - 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", - MSM89XX_PMIC_ANALOG_MICB_2_EN, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", 0, 0, 0, 0), -}; - -/* Multiply gain_adj and offset by 1000 and 100 to avoid float arithmetic */ -static const struct wcd_imped_i_ref imped_i_ref[] = { - {I_h4_UA, 8, 800, 9000, 10000}, - {I_pt5_UA, 10, 100, 990, 4600}, - {I_14_UA, 17, 14, 1050, 700}, - {I_l4_UA, 10, 4, 1165, 110}, - {I_1_UA, 0, 1, 1200, 65}, -}; - -static const struct wcd_mbhc_intr intr_ids = { - .mbhc_sw_intr = MSM89XX_IRQ_MBHC_HS_DET, - .mbhc_btn_press_intr = MSM89XX_IRQ_MBHC_PRESS, - .mbhc_btn_release_intr = MSM89XX_IRQ_MBHC_RELEASE, - .mbhc_hs_ins_intr = MSM89XX_IRQ_MBHC_INSREM_DET1, - .mbhc_hs_rem_intr = MSM89XX_IRQ_MBHC_INSREM_DET, - .hph_left_ocp = MSM89XX_IRQ_HPHL_OCP, - .hph_right_ocp = MSM89XX_IRQ_HPHR_OCP, -}; - -static int msm_anlg_cdc_dt_parse_vreg_info(struct device *dev, - struct sdm660_cdc_regulator *vreg, - const char *vreg_name, - bool ondemand); -static struct sdm660_cdc_pdata *msm_anlg_cdc_populate_dt_pdata( - struct device *dev); -static int msm_anlg_cdc_enable_ext_mb_source(struct wcd_mbhc *wcd_mbhc, - bool turn_on); -static void msm_anlg_cdc_trim_btn_reg(struct snd_soc_codec *codec); -static void msm_anlg_cdc_set_micb_v(struct snd_soc_codec *codec); -static void msm_anlg_cdc_set_boost_v(struct snd_soc_codec *codec); -static void msm_anlg_cdc_set_auto_zeroing(struct snd_soc_codec *codec, - bool enable); -static void msm_anlg_cdc_configure_cap(struct snd_soc_codec *codec, - bool micbias1, bool micbias2); -static bool msm_anlg_cdc_use_mb(struct snd_soc_codec *codec); - -static int get_codec_version(struct sdm660_cdc_priv *sdm660_cdc) -{ - if (sdm660_cdc->codec_version == DRAX_CDC) - return DRAX_CDC; - else if (sdm660_cdc->codec_version == DIANGU) - return DIANGU; - else if (sdm660_cdc->codec_version == CAJON_2_0) - return CAJON_2_0; - else if (sdm660_cdc->codec_version == CAJON) - return CAJON; - else if (sdm660_cdc->codec_version == CONGA) - return CONGA; - else if (sdm660_cdc->pmic_rev == TOMBAK_2_0) - return TOMBAK_2_0; - else if (sdm660_cdc->pmic_rev == TOMBAK_1_0) - return TOMBAK_1_0; - - pr_err("%s: unsupported codec version\n", __func__); - return UNSUPPORTED; -} - -static void wcd_mbhc_meas_imped(struct snd_soc_codec *codec, - s16 *impedance_l, s16 *impedance_r) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if ((sdm660_cdc->imped_det_pin == WCD_MBHC_DET_BOTH) || - (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHL)) { - /* Enable ZDET_L_MEAS_EN */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x08, 0x08); - /* Wait for 2ms for measurement to complete */ - usleep_range(2000, 2100); - /* Read Left impedance value from Result1 */ - *impedance_l = snd_soc_read(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT); - /* Enable ZDET_R_MEAS_EN */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x08, 0x00); - } - if ((sdm660_cdc->imped_det_pin == WCD_MBHC_DET_BOTH) || - (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR)) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x04, 0x04); - /* Wait for 2ms for measurement to complete */ - usleep_range(2000, 2100); - /* Read Right impedance value from Result1 */ - *impedance_r = snd_soc_read(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x04, 0x00); - } -} - -static void msm_anlg_cdc_set_ref_current(struct snd_soc_codec *codec, - enum wcd_curr_ref curr_ref) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: curr_ref: %d\n", __func__, curr_ref); - - if (get_codec_version(sdm660_cdc) < CAJON) - dev_dbg(codec->dev, "%s: Setting ref current not required\n", - __func__); - - sdm660_cdc->imped_i_ref = imped_i_ref[curr_ref]; - - switch (curr_ref) { - case I_h4_UA: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0x07, 0x01); - break; - case I_pt5_UA: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0x07, 0x04); - break; - case I_14_UA: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0x07, 0x03); - break; - case I_l4_UA: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0x07, 0x01); - break; - case I_1_UA: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0x07, 0x00); - break; - default: - pr_debug("%s: No ref current set\n", __func__); - break; - } -} - -static bool msm_anlg_cdc_adj_ref_current(struct snd_soc_codec *codec, - s16 *impedance_l, s16 *impedance_r) -{ - int i = 2; - s16 compare_imp = 0; - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR) - compare_imp = *impedance_r; - else - compare_imp = *impedance_l; - - if (get_codec_version(sdm660_cdc) < CAJON) { - dev_dbg(codec->dev, - "%s: Reference current adjustment not required\n", - __func__); - return false; - } - - while (compare_imp < imped_i_ref[i].min_val) { - msm_anlg_cdc_set_ref_current(codec, imped_i_ref[++i].curr_ref); - wcd_mbhc_meas_imped(codec, impedance_l, impedance_r); - compare_imp = (sdm660_cdc->imped_det_pin == - WCD_MBHC_DET_HPHR) ? *impedance_r : *impedance_l; - if (i >= I_1_UA) - break; - } - return true; -} - -void msm_anlg_cdc_spk_ext_pa_cb( - int (*codec_spk_ext_pa)(struct snd_soc_codec *codec, - int enable), struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc; - - if (!codec) { - pr_err("%s: NULL codec pointer!\n", __func__); - return; - } - - sdm660_cdc = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: Enter\n", __func__); - sdm660_cdc->codec_spk_ext_pa_cb = codec_spk_ext_pa; -} -EXPORT_SYMBOL(msm_anlg_cdc_spk_ext_pa_cb); - -static void msm_anlg_cdc_compute_impedance(struct snd_soc_codec *codec, s16 l, - s16 r, uint32_t *zl, uint32_t *zr, - bool high) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - uint32_t rl = 0, rr = 0; - struct wcd_imped_i_ref R = sdm660_cdc->imped_i_ref; - int codec_ver = get_codec_version(sdm660_cdc); - - switch (codec_ver) { - case TOMBAK_1_0: - case TOMBAK_2_0: - case CONGA: - if (high) { - dev_dbg(codec->dev, - "%s: This plug has high range impedance\n", - __func__); - rl = (uint32_t)(((100 * (l * 400 - 200))/96) - 230); - rr = (uint32_t)(((100 * (r * 400 - 200))/96) - 230); - } else { - dev_dbg(codec->dev, - "%s: This plug has low range impedance\n", - __func__); - rl = (uint32_t)(((1000 * (l * 2 - 1))/1165) - (13/10)); - rr = (uint32_t)(((1000 * (r * 2 - 1))/1165) - (13/10)); - } - break; - case CAJON: - case CAJON_2_0: - case DIANGU: - case DRAX_CDC: - if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHL) { - rr = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * r - 5)) - - (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN); - rl = (uint32_t)(((10000 * (R.multiplier * (10 * l - 5))) - - R.offset * R.gain_adj)/(R.gain_adj * 100)); - } else if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR) { - rr = (uint32_t)(((10000 * (R.multiplier * (10 * r - 5))) - - R.offset * R.gain_adj)/(R.gain_adj * 100)); - rl = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * l - 5))- - (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN); - } else if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_NONE) { - rr = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * r - 5)) - - (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN); - rl = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * l - 5))- - (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN); - } else { - rr = (uint32_t)(((10000 * (R.multiplier * (10 * r - 5))) - - R.offset * R.gain_adj)/(R.gain_adj * 100)); - rl = (uint32_t)(((10000 * (R.multiplier * (10 * l - 5))) - - R.offset * R.gain_adj)/(R.gain_adj * 100)); - } - break; - default: - dev_dbg(codec->dev, "%s: No codec mentioned\n", __func__); - break; - } - *zl = rl; - *zr = rr; -} - -static struct firmware_cal *msm_anlg_cdc_get_hwdep_fw_cal( - struct wcd_mbhc *wcd_mbhc, - enum wcd_cal_type type) -{ - struct sdm660_cdc_priv *sdm660_cdc; - struct firmware_cal *hwdep_cal; - struct snd_soc_codec *codec = wcd_mbhc->codec; - - if (!codec) { - pr_err("%s: NULL codec pointer\n", __func__); - return NULL; - } - sdm660_cdc = snd_soc_codec_get_drvdata(codec); - hwdep_cal = wcdcal_get_fw_cal(sdm660_cdc->fw_data, type); - if (!hwdep_cal) { - dev_err(codec->dev, "%s: cal not sent by %d\n", - __func__, type); - return NULL; - } - return hwdep_cal; -} - -static void wcd9xxx_spmi_irq_control(struct snd_soc_codec *codec, - int irq, bool enable) -{ - if (enable) - wcd9xxx_spmi_enable_irq(irq); - else - wcd9xxx_spmi_disable_irq(irq); -} - -static void msm_anlg_cdc_mbhc_clk_setup(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x08, 0x08); - else - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x08, 0x00); -} - -static int msm_anlg_cdc_mbhc_map_btn_code_to_num(struct snd_soc_codec *codec) -{ - int btn_code; - int btn; - - btn_code = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT); - - switch (btn_code) { - case 0: - btn = 0; - break; - case 1: - btn = 1; - break; - case 3: - btn = 2; - break; - case 7: - btn = 3; - break; - case 15: - btn = 4; - break; - default: - btn = -EINVAL; - break; - }; - - return btn; -} - -static bool msm_anlg_cdc_spmi_lock_sleep(struct wcd_mbhc *mbhc, bool lock) -{ - if (lock) - return wcd9xxx_spmi_lock_sleep(); - wcd9xxx_spmi_unlock_sleep(); - return 0; -} - -static bool msm_anlg_cdc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num) -{ - if (micb_num == MIC_BIAS_1) - return (snd_soc_read(mbhc->codec, - MSM89XX_PMIC_ANALOG_MICB_1_EN) & - 0x80); - if (micb_num == MIC_BIAS_2) - return (snd_soc_read(mbhc->codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN) & - 0x80); - return false; -} - -static void msm_anlg_cdc_enable_master_bias(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, - 0x30, 0x30); - else - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, - 0x30, 0x00); -} - -static void msm_anlg_cdc_mbhc_common_micb_ctrl(struct snd_soc_codec *codec, - int event, bool enable) -{ - u16 reg; - u8 mask; - u8 val; - - switch (event) { - case MBHC_COMMON_MICB_PRECHARGE: - reg = MSM89XX_PMIC_ANALOG_MICB_1_CTL; - mask = 0x60; - val = (enable ? 0x60 : 0x00); - break; - case MBHC_COMMON_MICB_SET_VAL: - reg = MSM89XX_PMIC_ANALOG_MICB_1_VAL; - mask = 0xFF; - val = (enable ? 0xC0 : 0x00); - break; - case MBHC_COMMON_MICB_TAIL_CURR: - reg = MSM89XX_PMIC_ANALOG_MICB_1_EN; - mask = 0x04; - val = (enable ? 0x04 : 0x00); - break; - default: - dev_err(codec->dev, - "%s: Invalid event received\n", __func__); - return; - }; - snd_soc_update_bits(codec, reg, mask, val); -} - -static void msm_anlg_cdc_mbhc_internal_micbias_ctrl(struct snd_soc_codec *codec, - int micbias_num, - bool enable) -{ - if (micbias_num == 1) { - if (enable) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS, - 0x10, 0x10); - else - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS, - 0x10, 0x00); - } -} - -static bool msm_anlg_cdc_mbhc_hph_pa_on_status(struct snd_soc_codec *codec) -{ - return (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN) & - 0x30) ? true : false; -} - -static void msm_anlg_cdc_mbhc_program_btn_thr(struct snd_soc_codec *codec, - s16 *btn_low, s16 *btn_high, - int num_btn, bool is_micbias) -{ - int i; - u32 course, fine, reg_val; - u16 reg_addr = MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL; - s16 *btn_voltage; - - btn_voltage = ((is_micbias) ? btn_high : btn_low); - - for (i = 0; i < num_btn; i++) { - course = (btn_voltage[i] / SDM660_CDC_MBHC_BTN_COARSE_ADJ); - fine = ((btn_voltage[i] % SDM660_CDC_MBHC_BTN_COARSE_ADJ) / - SDM660_CDC_MBHC_BTN_FINE_ADJ); - - reg_val = (course << 5) | (fine << 2); - snd_soc_update_bits(codec, reg_addr, 0xFC, reg_val); - dev_dbg(codec->dev, - "%s: course: %d fine: %d reg_addr: %x reg_val: %x\n", - __func__, course, fine, reg_addr, reg_val); - reg_addr++; - } -} - -static void msm_anlg_cdc_mbhc_calc_impedance(struct wcd_mbhc *mbhc, - uint32_t *zl, uint32_t *zr) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - s16 impedance_l, impedance_r; - s16 impedance_l_fixed; - s16 reg0, reg1, reg2, reg3, reg4; - bool high = false; - bool min_range_used = false; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - reg0 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER); - reg1 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL); - reg2 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2); - reg3 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MICB_2_EN); - reg4 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL); - - sdm660_cdc->imped_det_pin = WCD_MBHC_DET_BOTH; - mbhc->hph_type = WCD_MBHC_HPH_NONE; - - /* disable FSM and micbias and enable pullup*/ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x80, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0xA5, 0x25); - /* - * Enable legacy electrical detection current sources - * and disable fast ramp and enable manual switching - * of extra capacitance - */ - dev_dbg(codec->dev, "%s: Setup for impedance det\n", __func__); - - msm_anlg_cdc_set_ref_current(codec, I_h4_UA); - - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, - 0x06, 0x02); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, - 0x02, 0x02); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, - 0x02, 0x00); - - dev_dbg(codec->dev, "%s: Start performing impedance detection\n", - __func__); - - wcd_mbhc_meas_imped(codec, &impedance_l, &impedance_r); - - if (impedance_l > 2 || impedance_r > 2) { - high = true; - if (!mbhc->mbhc_cfg->mono_stero_detection) { - /* Set ZDET_CHG to 0 to discharge ramp */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x02, 0x00); - /* wait 40ms for the discharge ramp to complete */ - usleep_range(40000, 40100); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, - 0x03, 0x00); - sdm660_cdc->imped_det_pin = (impedance_l > 2 && - impedance_r > 2) ? - WCD_MBHC_DET_NONE : - ((impedance_l > 2) ? - WCD_MBHC_DET_HPHR : - WCD_MBHC_DET_HPHL); - if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_NONE) - goto exit; - } else { - if (get_codec_version(sdm660_cdc) >= CAJON) { - if (impedance_l == 63 && impedance_r == 63) { - dev_dbg(codec->dev, - "%s: HPHL and HPHR are floating\n", - __func__); - sdm660_cdc->imped_det_pin = - WCD_MBHC_DET_NONE; - mbhc->hph_type = WCD_MBHC_HPH_NONE; - } else if (impedance_l == 63 - && impedance_r < 63) { - dev_dbg(codec->dev, - "%s: Mono HS with HPHL floating\n", - __func__); - sdm660_cdc->imped_det_pin = - WCD_MBHC_DET_HPHR; - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } else if (impedance_r == 63 && - impedance_l < 63) { - dev_dbg(codec->dev, - "%s: Mono HS with HPHR floating\n", - __func__); - sdm660_cdc->imped_det_pin = - WCD_MBHC_DET_HPHL; - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } else if (impedance_l > 3 && impedance_r > 3 && - (impedance_l == impedance_r)) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, - 0x06, 0x06); - wcd_mbhc_meas_imped(codec, &impedance_l, - &impedance_r); - if (impedance_r == impedance_l) - dev_dbg(codec->dev, - "%s: Mono Headset\n", - __func__); - sdm660_cdc->imped_det_pin = - WCD_MBHC_DET_NONE; - mbhc->hph_type = - WCD_MBHC_HPH_MONO; - } else { - dev_dbg(codec->dev, - "%s: STEREO headset is found\n", - __func__); - sdm660_cdc->imped_det_pin = - WCD_MBHC_DET_BOTH; - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } - } - } - } - - msm_anlg_cdc_set_ref_current(codec, I_pt5_UA); - msm_anlg_cdc_set_ref_current(codec, I_14_UA); - - /* Enable RAMP_L , RAMP_R & ZDET_CHG*/ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, - 0x03, 0x03); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x02, 0x02); - /* wait for 50msec for the HW to apply ramp on HPHL and HPHR */ - usleep_range(50000, 50100); - /* Enable ZDET_DISCHG_CAP_CTL to add extra capacitance */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x01, 0x01); - /* wait for 5msec for the voltage to get stable */ - usleep_range(5000, 5100); - - wcd_mbhc_meas_imped(codec, &impedance_l, &impedance_r); - - min_range_used = msm_anlg_cdc_adj_ref_current(codec, - &impedance_l, &impedance_r); - if (!mbhc->mbhc_cfg->mono_stero_detection) { - /* Set ZDET_CHG to 0 to discharge ramp */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x02, 0x00); - /* wait for 40msec for the capacitor to discharge */ - usleep_range(40000, 40100); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, - 0x03, 0x00); - goto exit; - } - - /* we are setting ref current to the minimun range or the measured - * value larger than the minimum value, so min_range_used is true. - * If the headset is mono headset with either HPHL or HPHR floating - * then we have already done the mono stereo detection and do not - * need to continue further. - */ - - if (!min_range_used || - sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHL || - sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR) - goto exit; - - - /* Disable Set ZDET_CONN_RAMP_L and enable ZDET_CONN_FIXED_L */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, - 0x02, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL, - 0x02, 0x02); - /* Set ZDET_CHG to 0 */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x02, 0x00); - /* wait for 40msec for the capacitor to discharge */ - usleep_range(40000, 40100); - - /* Set ZDET_CONN_RAMP_R to 0 */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, - 0x01, 0x00); - /* Enable ZDET_L_MEAS_EN */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x08, 0x08); - /* wait for 2msec for the HW to compute left inpedance value */ - usleep_range(2000, 2100); - /* Read Left impedance value from Result1 */ - impedance_l_fixed = snd_soc_read(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT); - /* Disable ZDET_L_MEAS_EN */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x08, 0x00); - /* - * Assume impedance_l is L1, impedance_l_fixed is L2. - * If the following condition is met, we can take this - * headset as mono one with impedance of L2. - * Otherwise, take it as stereo with impedance of L1. - * Condition: - * abs[(L2-0.5L1)/(L2+0.5L1)] < abs [(L2-L1)/(L2+L1)] - */ - if ((abs(impedance_l_fixed - impedance_l/2) * - (impedance_l_fixed + impedance_l)) >= - (abs(impedance_l_fixed - impedance_l) * - (impedance_l_fixed + impedance_l/2))) { - dev_dbg(codec->dev, - "%s: STEREO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } else { - dev_dbg(codec->dev, - "%s: MONO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - impedance_l = impedance_l_fixed; - } - /* Enable ZDET_CHG */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x02, 0x02); - /* wait for 10msec for the capacitor to charge */ - usleep_range(10000, 10100); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL, - 0x02, 0x00); - /* Set ZDET_CHG to 0 to discharge HPHL */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, - 0x02, 0x00); - /* wait for 40msec for the capacitor to discharge */ - usleep_range(40000, 40100); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, - 0x02, 0x00); - -exit: - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, reg4); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MICB_2_EN, reg3); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, reg1); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, reg0); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, reg2); - msm_anlg_cdc_compute_impedance(codec, impedance_l, impedance_r, - zl, zr, high); - - dev_dbg(codec->dev, "%s: RL %d ohm, RR %d ohm\n", __func__, *zl, *zr); - dev_dbg(codec->dev, "%s: Impedance detection completed\n", __func__); -} - -static int msm_anlg_cdc_dig_register_notifier(void *handle, - struct notifier_block *nblock, - bool enable) -{ - struct sdm660_cdc_priv *handle_cdc = handle; - - if (enable) - return blocking_notifier_chain_register(&handle_cdc->notifier, - nblock); - - return blocking_notifier_chain_unregister(&handle_cdc->notifier, - nblock); -} - -static int msm_anlg_cdc_mbhc_register_notifier(struct wcd_mbhc *wcd_mbhc, - struct notifier_block *nblock, - bool enable) -{ - struct snd_soc_codec *codec = wcd_mbhc->codec; - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (enable) - return blocking_notifier_chain_register( - &sdm660_cdc->notifier_mbhc, - nblock); - - return blocking_notifier_chain_unregister(&sdm660_cdc->notifier_mbhc, - nblock); -} - -static int msm_anlg_cdc_request_irq(struct snd_soc_codec *codec, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - return wcd9xxx_spmi_request_irq(irq, handler, name, data); -} - -static int msm_anlg_cdc_free_irq(struct snd_soc_codec *codec, - int irq, void *data) -{ - return wcd9xxx_spmi_free_irq(irq, data); -} - -static const struct wcd_mbhc_cb mbhc_cb = { - .enable_mb_source = msm_anlg_cdc_enable_ext_mb_source, - .trim_btn_reg = msm_anlg_cdc_trim_btn_reg, - .compute_impedance = msm_anlg_cdc_mbhc_calc_impedance, - .set_micbias_value = msm_anlg_cdc_set_micb_v, - .set_auto_zeroing = msm_anlg_cdc_set_auto_zeroing, - .get_hwdep_fw_cal = msm_anlg_cdc_get_hwdep_fw_cal, - .set_cap_mode = msm_anlg_cdc_configure_cap, - .register_notifier = msm_anlg_cdc_mbhc_register_notifier, - .request_irq = msm_anlg_cdc_request_irq, - .irq_control = wcd9xxx_spmi_irq_control, - .free_irq = msm_anlg_cdc_free_irq, - .clk_setup = msm_anlg_cdc_mbhc_clk_setup, - .map_btn_code_to_num = msm_anlg_cdc_mbhc_map_btn_code_to_num, - .lock_sleep = msm_anlg_cdc_spmi_lock_sleep, - .micbias_enable_status = msm_anlg_cdc_micb_en_status, - .mbhc_bias = msm_anlg_cdc_enable_master_bias, - .mbhc_common_micb_ctrl = msm_anlg_cdc_mbhc_common_micb_ctrl, - .micb_internal = msm_anlg_cdc_mbhc_internal_micbias_ctrl, - .hph_pa_on_status = msm_anlg_cdc_mbhc_hph_pa_on_status, - .set_btn_thr = msm_anlg_cdc_mbhc_program_btn_thr, - .extn_use_mb = msm_anlg_cdc_use_mb, -}; - -static const uint32_t wcd_imped_val[] = {4, 8, 12, 13, 16, - 20, 24, 28, 32, - 36, 40, 44, 48}; - -static void msm_anlg_cdc_dig_notifier_call(struct snd_soc_codec *codec, - const enum dig_cdc_notify_event event) -{ - struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: notifier call event %d\n", __func__, event); - blocking_notifier_call_chain(&sdm660_cdc->notifier, - event, NULL); -} - -static void msm_anlg_cdc_notifier_call(struct snd_soc_codec *codec, - const enum wcd_notify_event event) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: notifier call event %d\n", __func__, event); - blocking_notifier_call_chain(&sdm660_cdc->notifier_mbhc, event, - &sdm660_cdc->mbhc); -} - -static void msm_anlg_cdc_boost_on(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F, 0x0F); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x30); - if (get_codec_version(sdm660_cdc) < CAJON_2_0) - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82); - else - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0xA2); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, - 0x69, 0x69); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, - 0x01, 0x01); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, - 0x88, 0x88); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, - 0x03, 0x03); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, - 0xE1, 0xE1); - if (get_codec_version(sdm660_cdc) < CAJON_2_0) { - snd_soc_update_bits(codec, MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x20, 0x20); - /* Wait for 1ms after clock ctl enable */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, - 0xDF, 0xDF); - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - } else { - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, - 0x80, 0x80); - /* Wait for 500us after BOOST_EN to happen */ - usleep_range(500, 510); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, - 0x40, 0x40); - /* Wait for 500us after BOOST pulse_skip */ - usleep_range(500, 510); - } -} - -static void msm_anlg_cdc_boost_off(struct snd_soc_codec *codec) -{ - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, - 0xDF, 0x5F); - snd_soc_update_bits(codec, MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x20, 0x00); -} - -static void msm_anlg_cdc_bypass_on(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (get_codec_version(sdm660_cdc) < CAJON_2_0) { - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_SEC_ACCESS, - 0xA5); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, - 0x07); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x02, 0x02); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x01, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x40, 0x40); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x80, 0x80); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, - 0xDF, 0xDF); - } else { - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x20, 0x20); - } -} - -static void msm_anlg_cdc_bypass_off(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (get_codec_version(sdm660_cdc) < CAJON_2_0) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, - 0x80, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x80, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x02, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x40, 0x00); - } else { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_BYPASS_MODE, - 0x20, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x20, 0x00); - } -} - -static void msm_anlg_cdc_boost_mode_sequence(struct snd_soc_codec *codec, - int flag) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (flag == EAR_PMU) { - switch (sdm660_cdc->boost_option) { - case BOOST_SWITCH: - if (sdm660_cdc->ear_pa_boost_set) { - msm_anlg_cdc_boost_off(codec); - msm_anlg_cdc_bypass_on(codec); - } - break; - case BOOST_ALWAYS: - msm_anlg_cdc_boost_on(codec); - break; - case BYPASS_ALWAYS: - msm_anlg_cdc_bypass_on(codec); - break; - case BOOST_ON_FOREVER: - msm_anlg_cdc_boost_on(codec); - break; - default: - dev_err(codec->dev, - "%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - break; - } - } else if (flag == EAR_PMD) { - switch (sdm660_cdc->boost_option) { - case BOOST_SWITCH: - if (sdm660_cdc->ear_pa_boost_set) - msm_anlg_cdc_bypass_off(codec); - break; - case BOOST_ALWAYS: - msm_anlg_cdc_boost_off(codec); - /* 80ms for EAR boost to settle down */ - msleep(80); - break; - case BYPASS_ALWAYS: - /* nothing to do as bypass on always */ - break; - case BOOST_ON_FOREVER: - /* nothing to do as boost on forever */ - break; - default: - dev_err(codec->dev, - "%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - break; - } - } else if (flag == SPK_PMU) { - switch (sdm660_cdc->boost_option) { - case BOOST_SWITCH: - if (sdm660_cdc->spk_boost_set) { - msm_anlg_cdc_bypass_off(codec); - msm_anlg_cdc_boost_on(codec); - } - break; - case BOOST_ALWAYS: - msm_anlg_cdc_boost_on(codec); - break; - case BYPASS_ALWAYS: - msm_anlg_cdc_bypass_on(codec); - break; - case BOOST_ON_FOREVER: - msm_anlg_cdc_boost_on(codec); - break; - default: - dev_err(codec->dev, - "%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - break; - } - } else if (flag == SPK_PMD) { - switch (sdm660_cdc->boost_option) { - case BOOST_SWITCH: - if (sdm660_cdc->spk_boost_set) { - msm_anlg_cdc_boost_off(codec); - /* - * Add 40 ms sleep for the spk - * boost to settle down - */ - msleep(40); - } - break; - case BOOST_ALWAYS: - msm_anlg_cdc_boost_off(codec); - /* - * Add 40 ms sleep for the spk - * boost to settle down - */ - msleep(40); - break; - case BYPASS_ALWAYS: - /* nothing to do as bypass on always */ - break; - case BOOST_ON_FOREVER: - /* nothing to do as boost on forever */ - break; - default: - dev_err(codec->dev, - "%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - break; - } - } -} - -static int msm_anlg_cdc_dt_parse_vreg_info(struct device *dev, - struct sdm660_cdc_regulator *vreg, const char *vreg_name, - bool ondemand) -{ - int len, ret = 0; - const __be32 *prop; - char prop_name[CODEC_DT_MAX_PROP_SIZE]; - struct device_node *regnode = NULL; - u32 prop_val; - - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "%s-supply", - vreg_name); - regnode = of_parse_phandle(dev->of_node, prop_name, 0); - - if (!regnode) { - dev_err(dev, "Looking up %s property in node %s failed\n", - prop_name, dev->of_node->full_name); - return -ENODEV; - } - - dev_dbg(dev, "Looking up %s property in node %s\n", - prop_name, dev->of_node->full_name); - - vreg->name = vreg_name; - vreg->ondemand = ondemand; - - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, - "qcom,%s-voltage", vreg_name); - prop = of_get_property(dev->of_node, prop_name, &len); - - if (!prop || (len != (2 * sizeof(__be32)))) { - dev_err(dev, "%s %s property\n", - prop ? "invalid format" : "no", prop_name); - return -EINVAL; - } - vreg->min_uv = be32_to_cpup(&prop[0]); - vreg->max_uv = be32_to_cpup(&prop[1]); - - snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, - "qcom,%s-current", vreg_name); - - ret = of_property_read_u32(dev->of_node, prop_name, &prop_val); - if (ret) { - dev_err(dev, "Looking up %s property in node %s failed", - prop_name, dev->of_node->full_name); - return -EFAULT; - } - vreg->optimum_ua = prop_val; - - dev_dbg(dev, "%s: vol=[%d %d]uV, curr=[%d]uA, ond %d\n\n", vreg->name, - vreg->min_uv, vreg->max_uv, vreg->optimum_ua, vreg->ondemand); - return 0; -} - -static void msm_anlg_cdc_dt_parse_boost_info(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc_priv = - snd_soc_codec_get_drvdata(codec); - const char *prop_name = "qcom,cdc-boost-voltage"; - int boost_voltage, ret; - - ret = of_property_read_u32(codec->dev->of_node, prop_name, - &boost_voltage); - if (ret) { - dev_dbg(codec->dev, "Looking up %s property in node %s failed\n", - prop_name, codec->dev->of_node->full_name); - boost_voltage = DEFAULT_BOOST_VOLTAGE; - } - if (boost_voltage < MIN_BOOST_VOLTAGE || - boost_voltage > MAX_BOOST_VOLTAGE) { - dev_err(codec->dev, - "Incorrect boost voltage. Reverting to default\n"); - boost_voltage = DEFAULT_BOOST_VOLTAGE; - } - - sdm660_cdc_priv->boost_voltage = - VOLTAGE_CONVERTER(boost_voltage, MIN_BOOST_VOLTAGE, - BOOST_VOLTAGE_STEP); - dev_dbg(codec->dev, "Boost voltage value is: %d\n", - boost_voltage); -} - -static void msm_anlg_cdc_dt_parse_micbias_info(struct device *dev, - struct wcd_micbias_setting *micbias) -{ - const char *prop_name = "qcom,cdc-micbias-cfilt-mv"; - int ret; - - ret = of_property_read_u32(dev->of_node, prop_name, - &micbias->cfilt1_mv); - if (ret) { - dev_dbg(dev, "Looking up %s property in node %s failed", - prop_name, dev->of_node->full_name); - micbias->cfilt1_mv = MICBIAS_DEFAULT_VAL; - } -} - -static struct sdm660_cdc_pdata *msm_anlg_cdc_populate_dt_pdata( - struct device *dev) -{ - struct sdm660_cdc_pdata *pdata; - int ret, static_cnt, ond_cnt, idx, i; - const char *name = NULL; - const char *static_prop_name = "qcom,cdc-static-supplies"; - const char *ond_prop_name = "qcom,cdc-on-demand-supplies"; - - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return NULL; - - static_cnt = of_property_count_strings(dev->of_node, static_prop_name); - if (static_cnt < 0) { - dev_err(dev, "%s: Failed to get static supplies %d\n", __func__, - static_cnt); - ret = -EINVAL; - goto err; - } - - /* On-demand supply list is an optional property */ - ond_cnt = of_property_count_strings(dev->of_node, ond_prop_name); - if (ond_cnt < 0) - ond_cnt = 0; - - WARN_ON(static_cnt <= 0 || ond_cnt < 0); - if ((static_cnt + ond_cnt) > ARRAY_SIZE(pdata->regulator)) { - dev_err(dev, "%s: Num of supplies %u > max supported %zd\n", - __func__, (static_cnt + ond_cnt), - ARRAY_SIZE(pdata->regulator)); - ret = -EINVAL; - goto err; - } - - for (idx = 0; idx < static_cnt; idx++) { - ret = of_property_read_string_index(dev->of_node, - static_prop_name, idx, - &name); - if (ret) { - dev_err(dev, "%s: of read string %s idx %d error %d\n", - __func__, static_prop_name, idx, ret); - goto err; - } - - dev_dbg(dev, "%s: Found static cdc supply %s\n", __func__, - name); - ret = msm_anlg_cdc_dt_parse_vreg_info(dev, - &pdata->regulator[idx], - name, false); - if (ret) { - dev_err(dev, "%s:err parsing vreg for %s idx %d\n", - __func__, name, idx); - goto err; - } - } - - for (i = 0; i < ond_cnt; i++, idx++) { - ret = of_property_read_string_index(dev->of_node, ond_prop_name, - i, &name); - if (ret) { - dev_err(dev, "%s: err parsing on_demand for %s idx %d\n", - __func__, ond_prop_name, i); - goto err; - } - - dev_dbg(dev, "%s: Found on-demand cdc supply %s\n", __func__, - name); - ret = msm_anlg_cdc_dt_parse_vreg_info(dev, - &pdata->regulator[idx], - name, true); - if (ret) { - dev_err(dev, "%s: err parsing vreg on_demand for %s idx %d\n", - __func__, name, idx); - goto err; - } - } - msm_anlg_cdc_dt_parse_micbias_info(dev, &pdata->micbias); - - return pdata; -err: - devm_kfree(dev, pdata); - dev_err(dev, "%s: Failed to populate DT data ret = %d\n", - __func__, ret); - return NULL; -} - -static int msm_anlg_cdc_codec_enable_on_demand_supply( - struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - struct on_demand_supply *supply; - - if (w->shift >= ON_DEMAND_SUPPLIES_MAX) { - dev_err(codec->dev, "%s: error index > MAX Demand supplies", - __func__); - ret = -EINVAL; - goto out; - } - dev_dbg(codec->dev, "%s: supply: %s event: %d ref: %d\n", - __func__, on_demand_supply_name[w->shift], event, - atomic_read(&sdm660_cdc->on_demand_list[w->shift].ref)); - - supply = &sdm660_cdc->on_demand_list[w->shift]; - WARN_ONCE(!supply->supply, "%s isn't defined\n", - on_demand_supply_name[w->shift]); - if (!supply->supply) { - dev_err(codec->dev, "%s: err supply not present ond for %d", - __func__, w->shift); - goto out; - } - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (atomic_inc_return(&supply->ref) == 1) { - ret = regulator_set_voltage(supply->supply, - supply->min_uv, - supply->max_uv); - if (ret) { - dev_err(codec->dev, - "Setting regulator voltage(en) for micbias with err = %d\n", - ret); - goto out; - } - ret = regulator_set_load(supply->supply, - supply->optimum_ua); - if (ret < 0) { - dev_err(codec->dev, - "Setting regulator optimum mode(en) failed for micbias with err = %d\n", - ret); - goto out; - } - ret = regulator_enable(supply->supply); - } - if (ret) - dev_err(codec->dev, "%s: Failed to enable %s\n", - __func__, - on_demand_supply_name[w->shift]); - break; - case SND_SOC_DAPM_POST_PMD: - if (atomic_read(&supply->ref) == 0) { - dev_dbg(codec->dev, "%s: %s supply has been disabled.\n", - __func__, on_demand_supply_name[w->shift]); - goto out; - } - if (atomic_dec_return(&supply->ref) == 0) { - ret = regulator_disable(supply->supply); - if (ret) - dev_err(codec->dev, "%s: Failed to disable %s\n", - __func__, - on_demand_supply_name[w->shift]); - ret = regulator_set_voltage(supply->supply, - 0, - supply->max_uv); - if (ret) { - dev_err(codec->dev, - "Setting regulator voltage(dis) failed for micbias with err = %d\n", - ret); - goto out; - } - ret = regulator_set_load(supply->supply, 0); - if (ret < 0) - dev_err(codec->dev, - "Setting regulator optimum mode(dis) failed for micbias with err = %d\n", - ret); - } - break; - default: - break; - } -out: - return ret; -} - -static int msm_anlg_cdc_codec_enable_clock_block(struct snd_soc_codec *codec, - int enable) -{ - struct msm_asoc_mach_data *pdata = NULL; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - if (enable) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x30, 0x30); - msm_anlg_cdc_dig_notifier_call(codec, DIG_CDC_EVENT_CLK_ON); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80, 0x80); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x0C, 0x0C); - } else { - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x0C, 0x00); - } - return 0; -} - -static int msm_anlg_cdc_codec_enable_charge_pump(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - msm_anlg_cdc_codec_enable_clock_block(codec, 1); - if (!(strcmp(w->name, "EAR CP"))) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x80); - msm_anlg_cdc_boost_mode_sequence(codec, EAR_PMU); - } else if (get_codec_version(sdm660_cdc) >= DIANGU) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0xC0, 0xC0); - } - break; - case SND_SOC_DAPM_POST_PMU: - /* Wait for 1ms post powerup of chargepump */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - break; - case SND_SOC_DAPM_POST_PMD: - /* Wait for 1ms post powerdown of chargepump */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - if (!(strcmp(w->name, "EAR CP"))) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x00); - if (sdm660_cdc->boost_option != BOOST_ALWAYS) { - dev_dbg(codec->dev, - "%s: boost_option:%d, tear down ear\n", - __func__, sdm660_cdc->boost_option); - msm_anlg_cdc_boost_mode_sequence(codec, - EAR_PMD); - } - /* - * Reset pa select bit from ear to hph after ear pa - * is disabled and HPH DAC disable to reduce ear - * turn off pop and avoid HPH pop in concurrency - */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x80, 0x00); - } else { - if (get_codec_version(sdm660_cdc) < DIANGU) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x40, 0x00); - if (sdm660_cdc->rx_bias_count == 0) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x00); - dev_dbg(codec->dev, "%s: rx_bias_count = %d\n", - __func__, sdm660_cdc->rx_bias_count); - } - break; - } - return 0; -} - -static int msm_anlg_cdc_ear_pa_boost_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = - (sdm660_cdc->ear_pa_boost_set ? 1 : 0); - dev_dbg(codec->dev, "%s: sdm660_cdc->ear_pa_boost_set = %d\n", - __func__, sdm660_cdc->ear_pa_boost_set); - return 0; -} - -static int msm_anlg_cdc_ear_pa_boost_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - sdm660_cdc->ear_pa_boost_set = - (ucontrol->value.integer.value[0] ? true : false); - return 0; -} - -static int msm_anlg_cdc_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (get_codec_version(sdm660_cdc) >= DIANGU) { - ear_pa_gain = snd_soc_read(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC); - ear_pa_gain = (ear_pa_gain >> 1) & 0x3; - - if (ear_pa_gain == 0x00) { - ucontrol->value.integer.value[0] = 3; - } else if (ear_pa_gain == 0x01) { - ucontrol->value.integer.value[0] = 2; - } else if (ear_pa_gain == 0x02) { - ucontrol->value.integer.value[0] = 1; - } else if (ear_pa_gain == 0x03) { - ucontrol->value.integer.value[0] = 0; - } else { - dev_err(codec->dev, - "%s: ERROR: Unsupported Ear Gain = 0x%x\n", - __func__, ear_pa_gain); - return -EINVAL; - } - } else { - ear_pa_gain = snd_soc_read(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL); - ear_pa_gain = (ear_pa_gain >> 5) & 0x1; - if (ear_pa_gain == 0x00) { - ucontrol->value.integer.value[0] = 0; - } else if (ear_pa_gain == 0x01) { - ucontrol->value.integer.value[0] = 3; - } else { - dev_err(codec->dev, - "%s: ERROR: Unsupported Ear Gain = 0x%x\n", - __func__, ear_pa_gain); - return -EINVAL; - } - } - dev_dbg(codec->dev, "%s: ear_pa_gain = 0x%x\n", __func__, ear_pa_gain); - return 0; -} - -static int msm_anlg_cdc_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - if (get_codec_version(sdm660_cdc) >= DIANGU) { - switch (ucontrol->value.integer.value[0]) { - case 0: - ear_pa_gain = 0x06; - break; - case 1: - ear_pa_gain = 0x04; - break; - case 2: - ear_pa_gain = 0x02; - break; - case 3: - ear_pa_gain = 0x00; - break; - default: - return -EINVAL; - } - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, - 0x06, ear_pa_gain); - } else { - switch (ucontrol->value.integer.value[0]) { - case 0: - ear_pa_gain = 0x00; - break; - case 3: - ear_pa_gain = 0x20; - break; - case 1: - case 2: - default: - return -EINVAL; - } - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x20, ear_pa_gain); - } - return 0; -} - -static int msm_anlg_cdc_hph_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (sdm660_cdc->hph_mode == NORMAL_MODE) { - ucontrol->value.integer.value[0] = 0; - } else if (sdm660_cdc->hph_mode == HD2_MODE) { - ucontrol->value.integer.value[0] = 1; - } else { - dev_err(codec->dev, "%s: ERROR: Default HPH Mode= %d\n", - __func__, sdm660_cdc->hph_mode); - } - - dev_dbg(codec->dev, "%s: sdm660_cdc->hph_mode = %d\n", __func__, - sdm660_cdc->hph_mode); - return 0; -} - -static int msm_anlg_cdc_hph_mode_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - switch (ucontrol->value.integer.value[0]) { - case 0: - sdm660_cdc->hph_mode = NORMAL_MODE; - break; - case 1: - if (get_codec_version(sdm660_cdc) >= DIANGU) - sdm660_cdc->hph_mode = HD2_MODE; - break; - default: - sdm660_cdc->hph_mode = NORMAL_MODE; - break; - } - dev_dbg(codec->dev, "%s: sdm660_cdc->hph_mode_set = %d\n", - __func__, sdm660_cdc->hph_mode); - return 0; -} - -static int msm_anlg_cdc_boost_option_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (sdm660_cdc->boost_option == BOOST_SWITCH) { - ucontrol->value.integer.value[0] = 0; - } else if (sdm660_cdc->boost_option == BOOST_ALWAYS) { - ucontrol->value.integer.value[0] = 1; - } else if (sdm660_cdc->boost_option == BYPASS_ALWAYS) { - ucontrol->value.integer.value[0] = 2; - } else if (sdm660_cdc->boost_option == BOOST_ON_FOREVER) { - ucontrol->value.integer.value[0] = 3; - } else { - dev_err(codec->dev, "%s: ERROR: Unsupported Boost option= %d\n", - __func__, sdm660_cdc->boost_option); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: sdm660_cdc->boost_option = %d\n", __func__, - sdm660_cdc->boost_option); - return 0; -} - -static int msm_anlg_cdc_boost_option_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - switch (ucontrol->value.integer.value[0]) { - case 0: - sdm660_cdc->boost_option = BOOST_SWITCH; - break; - case 1: - sdm660_cdc->boost_option = BOOST_ALWAYS; - break; - case 2: - sdm660_cdc->boost_option = BYPASS_ALWAYS; - msm_anlg_cdc_bypass_on(codec); - break; - case 3: - sdm660_cdc->boost_option = BOOST_ON_FOREVER; - msm_anlg_cdc_boost_on(codec); - break; - default: - pr_err("%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - return -EINVAL; - } - dev_dbg(codec->dev, "%s: sdm660_cdc->boost_option_set = %d\n", - __func__, sdm660_cdc->boost_option); - return 0; -} - -static int msm_anlg_cdc_spk_boost_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (sdm660_cdc->spk_boost_set == false) { - ucontrol->value.integer.value[0] = 0; - } else if (sdm660_cdc->spk_boost_set == true) { - ucontrol->value.integer.value[0] = 1; - } else { - dev_err(codec->dev, "%s: ERROR: Unsupported Speaker Boost = %d\n", - __func__, sdm660_cdc->spk_boost_set); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: sdm660_cdc->spk_boost_set = %d\n", __func__, - sdm660_cdc->spk_boost_set); - return 0; -} - -static int msm_anlg_cdc_spk_boost_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - switch (ucontrol->value.integer.value[0]) { - case 0: - sdm660_cdc->spk_boost_set = false; - break; - case 1: - sdm660_cdc->spk_boost_set = true; - break; - default: - return -EINVAL; - } - dev_dbg(codec->dev, "%s: sdm660_cdc->spk_boost_set = %d\n", - __func__, sdm660_cdc->spk_boost_set); - return 0; -} - -static int msm_anlg_cdc_ext_spk_boost_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (sdm660_cdc->ext_spk_boost_set == false) - ucontrol->value.integer.value[0] = 0; - else - ucontrol->value.integer.value[0] = 1; - - dev_dbg(codec->dev, "%s: sdm660_cdc->ext_spk_boost_set = %d\n", - __func__, sdm660_cdc->ext_spk_boost_set); - return 0; -} - -static int msm_anlg_cdc_ext_spk_boost_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - switch (ucontrol->value.integer.value[0]) { - case 0: - sdm660_cdc->ext_spk_boost_set = false; - break; - case 1: - sdm660_cdc->ext_spk_boost_set = true; - break; - default: - return -EINVAL; - } - dev_dbg(codec->dev, "%s: sdm660_cdc->spk_boost_set = %d\n", - __func__, sdm660_cdc->spk_boost_set); - return 0; -} - -static const char * const msm_anlg_cdc_ear_pa_boost_ctrl_text[] = { - "DISABLE", "ENABLE"}; -static const struct soc_enum msm_anlg_cdc_ear_pa_boost_ctl_enum[] = { - SOC_ENUM_SINGLE_EXT(2, msm_anlg_cdc_ear_pa_boost_ctrl_text), -}; - -static const char * const msm_anlg_cdc_ear_pa_gain_text[] = { - "POS_1P5_DB", "POS_3_DB", "POS_4P5_DB", "POS_6_DB"}; -static const struct soc_enum msm_anlg_cdc_ear_pa_gain_enum[] = { - SOC_ENUM_SINGLE_EXT(4, msm_anlg_cdc_ear_pa_gain_text), -}; - -static const char * const msm_anlg_cdc_boost_option_ctrl_text[] = { - "BOOST_SWITCH", "BOOST_ALWAYS", "BYPASS_ALWAYS", - "BOOST_ON_FOREVER"}; -static const struct soc_enum msm_anlg_cdc_boost_option_ctl_enum[] = { - SOC_ENUM_SINGLE_EXT(4, msm_anlg_cdc_boost_option_ctrl_text), -}; -static const char * const msm_anlg_cdc_spk_boost_ctrl_text[] = { - "DISABLE", "ENABLE"}; -static const struct soc_enum msm_anlg_cdc_spk_boost_ctl_enum[] = { - SOC_ENUM_SINGLE_EXT(2, msm_anlg_cdc_spk_boost_ctrl_text), -}; - -static const char * const msm_anlg_cdc_ext_spk_boost_ctrl_text[] = { - "DISABLE", "ENABLE"}; -static const struct soc_enum msm_anlg_cdc_ext_spk_boost_ctl_enum[] = { - SOC_ENUM_SINGLE_EXT(2, msm_anlg_cdc_ext_spk_boost_ctrl_text), -}; - -static const char * const msm_anlg_cdc_hph_mode_ctrl_text[] = { - "NORMAL", "HD2"}; -static const struct soc_enum msm_anlg_cdc_hph_mode_ctl_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(msm_anlg_cdc_hph_mode_ctrl_text), - msm_anlg_cdc_hph_mode_ctrl_text), -}; - -/*cut of frequency for high pass filter*/ -static const char * const cf_text[] = { - "MIN_3DB_4Hz", "MIN_3DB_75Hz", "MIN_3DB_150Hz" -}; - - -static const struct snd_kcontrol_new msm_anlg_cdc_snd_controls[] = { - - SOC_ENUM_EXT("RX HPH Mode", msm_anlg_cdc_hph_mode_ctl_enum[0], - msm_anlg_cdc_hph_mode_get, msm_anlg_cdc_hph_mode_set), - - SOC_ENUM_EXT("Boost Option", msm_anlg_cdc_boost_option_ctl_enum[0], - msm_anlg_cdc_boost_option_get, msm_anlg_cdc_boost_option_set), - - SOC_ENUM_EXT("EAR PA Boost", msm_anlg_cdc_ear_pa_boost_ctl_enum[0], - msm_anlg_cdc_ear_pa_boost_get, msm_anlg_cdc_ear_pa_boost_set), - - SOC_ENUM_EXT("EAR PA Gain", msm_anlg_cdc_ear_pa_gain_enum[0], - msm_anlg_cdc_pa_gain_get, msm_anlg_cdc_pa_gain_put), - - SOC_ENUM_EXT("Speaker Boost", msm_anlg_cdc_spk_boost_ctl_enum[0], - msm_anlg_cdc_spk_boost_get, msm_anlg_cdc_spk_boost_set), - - SOC_ENUM_EXT("Ext Spk Boost", msm_anlg_cdc_ext_spk_boost_ctl_enum[0], - msm_anlg_cdc_ext_spk_boost_get, msm_anlg_cdc_ext_spk_boost_set), - - SOC_SINGLE_TLV("ADC1 Volume", MSM89XX_PMIC_ANALOG_TX_1_EN, 3, - 8, 0, analog_gain), - SOC_SINGLE_TLV("ADC2 Volume", MSM89XX_PMIC_ANALOG_TX_2_EN, 3, - 8, 0, analog_gain), - SOC_SINGLE_TLV("ADC3 Volume", MSM89XX_PMIC_ANALOG_TX_3_EN, 3, - 8, 0, analog_gain), - - -}; - -static int tombak_hph_impedance_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret; - uint32_t zl, zr; - bool hphr; - struct soc_multi_mixer_control *mc; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *priv = snd_soc_codec_get_drvdata(codec); - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - - hphr = mc->shift; - ret = wcd_mbhc_get_impedance(&priv->mbhc, &zl, &zr); - if (ret) - dev_dbg(codec->dev, "%s: Failed to get mbhc imped", __func__); - dev_dbg(codec->dev, "%s: zl %u, zr %u\n", __func__, zl, zr); - ucontrol->value.integer.value[0] = hphr ? zr : zl; - - return 0; -} - -static const struct snd_kcontrol_new impedance_detect_controls[] = { - SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0, - tombak_hph_impedance_get, NULL), - SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0, - tombak_hph_impedance_get, NULL), -}; - -static int tombak_get_hph_type(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sdm660_cdc_priv *priv = snd_soc_codec_get_drvdata(codec); - struct wcd_mbhc *mbhc; - - if (!priv) { - dev_err(codec->dev, - "%s: sdm660_cdc-wcd private data is NULL\n", - __func__); - return -EINVAL; - } - - mbhc = &priv->mbhc; - if (!mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized\n", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; - dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); - - return 0; -} - -static const struct snd_kcontrol_new hph_type_detect_controls[] = { - SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, - tombak_get_hph_type, NULL), -}; - -static const char * const rdac2_mux_text[] = { - "ZERO", "RX2", "RX1" -}; - -static const struct snd_kcontrol_new adc1_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct soc_enum rdac2_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL, - 0, 3, rdac2_mux_text); - -static const char * const adc2_mux_text[] = { - "ZERO", "INP2", "INP3" -}; - -static const char * const ext_spk_text[] = { - "Off", "On" -}; - -static const char * const wsa_spk_text[] = { - "ZERO", "WSA" -}; - -static const struct soc_enum adc2_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, - ARRAY_SIZE(adc2_mux_text), adc2_mux_text); - -static const struct soc_enum ext_spk_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, - ARRAY_SIZE(ext_spk_text), ext_spk_text); - -static const struct soc_enum wsa_spk_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, - ARRAY_SIZE(wsa_spk_text), wsa_spk_text); - - - -static const struct snd_kcontrol_new ext_spk_mux = - SOC_DAPM_ENUM("Ext Spk Switch Mux", ext_spk_enum); - - - -static const struct snd_kcontrol_new tx_adc2_mux = - SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum); - - -static const struct snd_kcontrol_new rdac2_mux = - SOC_DAPM_ENUM("RDAC2 MUX Mux", rdac2_mux_enum); - -static const char * const ear_text[] = { - "ZERO", "Switch", -}; - -static const struct soc_enum ear_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(ear_text), ear_text); - -static const struct snd_kcontrol_new ear_pa_mux[] = { - SOC_DAPM_ENUM("EAR_S", ear_enum) -}; - -static const struct snd_kcontrol_new wsa_spk_mux[] = { - SOC_DAPM_ENUM("WSA Spk Switch", wsa_spk_enum) -}; - - - -static const char * const hph_text[] = { - "ZERO", "Switch", -}; - -static const struct soc_enum hph_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(hph_text), hph_text); - -static const struct snd_kcontrol_new hphl_mux[] = { - SOC_DAPM_ENUM("HPHL", hph_enum) -}; - -static const struct snd_kcontrol_new hphr_mux[] = { - SOC_DAPM_ENUM("HPHR", hph_enum) -}; - -static const struct snd_kcontrol_new spkr_mux[] = { - SOC_DAPM_ENUM("SPK", hph_enum) -}; - -static const char * const lo_text[] = { - "ZERO", "Switch", -}; - -static const struct soc_enum lo_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(hph_text), hph_text); - -static const struct snd_kcontrol_new lo_mux[] = { - SOC_DAPM_ENUM("LINE_OUT", lo_enum) -}; - -static void msm_anlg_cdc_codec_enable_adc_block(struct snd_soc_codec *codec, - int enable) -{ - struct sdm660_cdc_priv *wcd8x16 = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %d\n", __func__, enable); - - if (enable) { - wcd8x16->adc_count++; - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x10, 0x10); - } else { - wcd8x16->adc_count--; - if (!wcd8x16->adc_count) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x10, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, - 0x20, 0x0); - } - } -} - -static int msm_anlg_cdc_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 adc_reg; - u8 init_bit_shift; - - dev_dbg(codec->dev, "%s %d\n", __func__, event); - - adc_reg = MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2; - - if (w->reg == MSM89XX_PMIC_ANALOG_TX_1_EN) - init_bit_shift = 5; - else if ((w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) || - (w->reg == MSM89XX_PMIC_ANALOG_TX_3_EN)) - init_bit_shift = 4; - else { - dev_err(codec->dev, "%s: Error, invalid adc register\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - msm_anlg_cdc_codec_enable_adc_block(codec, 1); - if (w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x02, 0x02); - /* - * Add delay of 10 ms to give sufficient time for the voltage - * to shoot up and settle so that the txfe init does not - * happen when the input voltage is changing too much. - */ - usleep_range(10000, 10010); - snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, - 1 << init_bit_shift); - if (w->reg == MSM89XX_PMIC_ANALOG_TX_1_EN) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL, - 0x03, 0x00); - else if ((w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) || - (w->reg == MSM89XX_PMIC_ANALOG_TX_3_EN)) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL, - 0x03, 0x00); - /* Wait for 1ms to allow txfe settling time */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * Add delay of 12 ms before deasserting the init - * to reduce the tx pop - */ - usleep_range(12000, 12010); - snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00); - /* Wait for 1ms to allow txfe settling time post powerup */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - break; - case SND_SOC_DAPM_POST_PMD: - msm_anlg_cdc_codec_enable_adc_block(codec, 0); - if (w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x02, 0x00); - if (w->reg == MSM89XX_PMIC_ANALOG_TX_1_EN) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL, - 0x03, 0x02); - else if ((w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) || - (w->reg == MSM89XX_PMIC_ANALOG_TX_3_EN)) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL, - 0x03, 0x02); - - break; - } - return 0; -} - -static int msm_anlg_cdc_codec_enable_spk_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x01, 0x01); - switch (sdm660_cdc->boost_option) { - case BOOST_SWITCH: - if (!sdm660_cdc->spk_boost_set) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, - 0x10, 0x10); - break; - case BOOST_ALWAYS: - case BOOST_ON_FOREVER: - break; - case BYPASS_ALWAYS: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, - 0x10, 0x10); - break; - default: - dev_err(codec->dev, - "%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - break; - } - /* Wait for 1ms after SPK_DAC CTL setting */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0xE0, 0xE0); - if (get_codec_version(sdm660_cdc) != TOMBAK_1_0) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x01, 0x01); - break; - case SND_SOC_DAPM_POST_PMU: - /* Wait for 1ms after SPK_VBAT_LDO Enable */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - switch (sdm660_cdc->boost_option) { - case BOOST_SWITCH: - if (sdm660_cdc->spk_boost_set) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, - 0xEF, 0xEF); - else - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, - 0x10, 0x00); - break; - case BOOST_ALWAYS: - case BOOST_ON_FOREVER: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, - 0xEF, 0xEF); - break; - case BYPASS_ALWAYS: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x10, 0x00); - break; - default: - dev_err(codec->dev, - "%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - break; - } - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX3_MUTE_OFF); - snd_soc_update_bits(codec, w->reg, 0x80, 0x80); - break; - case SND_SOC_DAPM_PRE_PMD: - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX3_MUTE_ON); - /* - * Add 1 ms sleep for the mute to take effect - */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x10, 0x10); - if (get_codec_version(sdm660_cdc) < CAJON_2_0) - msm_anlg_cdc_boost_mode_sequence(codec, SPK_PMD); - snd_soc_update_bits(codec, w->reg, 0x80, 0x00); - switch (sdm660_cdc->boost_option) { - case BOOST_SWITCH: - if (sdm660_cdc->spk_boost_set) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, - 0xEF, 0x69); - break; - case BOOST_ALWAYS: - case BOOST_ON_FOREVER: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, - 0xEF, 0x69); - break; - case BYPASS_ALWAYS: - break; - default: - dev_err(codec->dev, - "%s: invalid boost option: %d\n", __func__, - sdm660_cdc->boost_option); - break; - } - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0xE0, 0x00); - /* Wait for 1ms to allow setting time for spkr path disable */ - usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x01, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x10, 0x00); - if (get_codec_version(sdm660_cdc) != TOMBAK_1_0) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x01, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x00); - if (get_codec_version(sdm660_cdc) >= CAJON_2_0) - msm_anlg_cdc_boost_mode_sequence(codec, SPK_PMD); - break; - } - return 0; -} - -static int msm_anlg_cdc_codec_enable_dig_clk(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - struct msm_asoc_mach_data *pdata = NULL; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - - dev_dbg(codec->dev, "%s event %d w->name %s\n", __func__, - event, w->name); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - msm_anlg_cdc_codec_enable_clock_block(codec, 1); - snd_soc_update_bits(codec, w->reg, 0x80, 0x80); - msm_anlg_cdc_boost_mode_sequence(codec, SPK_PMU); - break; - case SND_SOC_DAPM_POST_PMD: - if (sdm660_cdc->rx_bias_count == 0) - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x00); - } - return 0; -} - - - -static bool msm_anlg_cdc_use_mb(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (get_codec_version(sdm660_cdc) < CAJON) - return true; - else - return false; -} - -static void msm_anlg_cdc_set_auto_zeroing(struct snd_soc_codec *codec, - bool enable) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (get_codec_version(sdm660_cdc) < CONGA) { - if (enable) - /* - * Set autozeroing for special headset detection and - * buttons to work. - */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0x18, 0x10); - else - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_2_EN, - 0x18, 0x00); - - } else { - dev_dbg(codec->dev, - "%s: Auto Zeroing is not required from CONGA\n", - __func__); - } -} - -static void msm_anlg_cdc_trim_btn_reg(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - if (get_codec_version(sdm660_cdc) == TOMBAK_1_0) { - pr_debug("%s: This device needs to be trimmed\n", __func__); - /* - * Calculate the trim value for each device used - * till is comes in production by hardware team - */ - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SEC_ACCESS, - 0xA5, 0xA5); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_TRIM_CTRL2, - 0xFF, 0x30); - } else { - dev_dbg(codec->dev, "%s: This device is trimmed at ATE\n", - __func__); - } -} - -static int msm_anlg_cdc_enable_ext_mb_source(struct wcd_mbhc *wcd_mbhc, - bool turn_on) -{ - int ret = 0; - static int count; - struct snd_soc_codec *codec = wcd_mbhc->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - dev_dbg(codec->dev, "%s turn_on: %d count: %d\n", __func__, turn_on, - count); - if (turn_on) { - if (!count) { - ret = snd_soc_dapm_force_enable_pin(dapm, - "MICBIAS_REGULATOR"); - snd_soc_dapm_sync(dapm); - } - count++; - } else { - if (count > 0) - count--; - if (!count) { - ret = snd_soc_dapm_disable_pin(dapm, - "MICBIAS_REGULATOR"); - snd_soc_dapm_sync(dapm); - } - } - - if (ret) - dev_err(codec->dev, "%s: Failed to %s external micbias source\n", - __func__, turn_on ? "enable" : "disabled"); - else - dev_dbg(codec->dev, "%s: %s external micbias source\n", - __func__, turn_on ? "Enabled" : "Disabled"); - - return ret; -} - -static int msm_anlg_cdc_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - u16 micb_int_reg; - char *internal1_text = "Internal1"; - char *internal2_text = "Internal2"; - char *internal3_text = "Internal3"; - char *external2_text = "External2"; - char *external_text = "External"; - bool micbias2; - - dev_dbg(codec->dev, "%s %d\n", __func__, event); - switch (w->reg) { - case MSM89XX_PMIC_ANALOG_MICB_1_EN: - case MSM89XX_PMIC_ANALOG_MICB_2_EN: - micb_int_reg = MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS; - break; - default: - dev_err(codec->dev, - "%s: Error, invalid micbias register 0x%x\n", - __func__, w->reg); - return -EINVAL; - } - - micbias2 = (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MICB_2_EN) & 0x80); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (strnstr(w->name, internal1_text, strlen(w->name))) { - if (get_codec_version(sdm660_cdc) >= CAJON) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2, - 0x02, 0x02); - snd_soc_update_bits(codec, micb_int_reg, 0x80, 0x80); - } else if (strnstr(w->name, internal2_text, strlen(w->name))) { - snd_soc_update_bits(codec, micb_int_reg, 0x10, 0x10); - snd_soc_update_bits(codec, w->reg, 0x60, 0x00); - } else if (strnstr(w->name, internal3_text, strlen(w->name))) { - snd_soc_update_bits(codec, micb_int_reg, 0x2, 0x2); - /* - * update MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2 - * for external bias only, not for external2. - */ - } else if (!strnstr(w->name, external2_text, strlen(w->name)) && - strnstr(w->name, external_text, - strlen(w->name))) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2, - 0x02, 0x02); - } - if (!strnstr(w->name, external_text, strlen(w->name))) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_1_EN, 0x05, 0x04); - if (w->reg == MSM89XX_PMIC_ANALOG_MICB_1_EN) - msm_anlg_cdc_configure_cap(codec, true, micbias2); - - break; - case SND_SOC_DAPM_POST_PMU: - if (get_codec_version(sdm660_cdc) <= TOMBAK_2_0) - /* - * Wait for 20ms post micbias enable - * for version < tombak 2.0. - */ - usleep_range(20000, 20100); - if (strnstr(w->name, internal1_text, strlen(w->name))) { - snd_soc_update_bits(codec, micb_int_reg, 0x40, 0x40); - } else if (strnstr(w->name, internal2_text, strlen(w->name))) { - snd_soc_update_bits(codec, micb_int_reg, 0x08, 0x08); - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_POST_MICBIAS_2_ON); - } else if (strnstr(w->name, internal3_text, 30)) { - snd_soc_update_bits(codec, micb_int_reg, 0x01, 0x01); - } else if (strnstr(w->name, external2_text, strlen(w->name))) { - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_POST_MICBIAS_2_ON); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (strnstr(w->name, internal1_text, strlen(w->name))) { - snd_soc_update_bits(codec, micb_int_reg, 0xC0, 0x40); - } else if (strnstr(w->name, internal2_text, strlen(w->name))) { - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_POST_MICBIAS_2_OFF); - } else if (strnstr(w->name, internal3_text, 30)) { - snd_soc_update_bits(codec, micb_int_reg, 0x2, 0x0); - } else if (strnstr(w->name, external2_text, strlen(w->name))) { - /* - * send micbias turn off event to mbhc driver and then - * break, as no need to set MICB_1_EN register. - */ - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_POST_MICBIAS_2_OFF); - break; - } - if (w->reg == MSM89XX_PMIC_ANALOG_MICB_1_EN) - msm_anlg_cdc_configure_cap(codec, false, micbias2); - break; - } - return 0; -} - -static void set_compander_mode(void *handle, int val) -{ - struct sdm660_cdc_priv *handle_cdc = handle; - struct snd_soc_codec *codec = handle_cdc->codec; - - if (get_codec_version(handle_cdc) >= DIANGU) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, - 0x08, val); - }; -} - -static void update_clkdiv(void *handle, int val) -{ - struct sdm660_cdc_priv *handle_cdc = handle; - struct snd_soc_codec *codec = handle_cdc->codec; - - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV, - 0xFF, val); -} - -static int get_cdc_version(void *handle) -{ - struct sdm660_cdc_priv *sdm660_cdc = handle; - - return get_codec_version(sdm660_cdc); -} - -static int sdm660_wcd_codec_enable_vdd_spkr(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - int ret = 0; - - if (!sdm660_cdc->ext_spk_boost_set) { - dev_dbg(codec->dev, "%s: ext_boost not supported/disabled\n", - __func__); - return 0; - } - dev_dbg(codec->dev, "%s: %s %d\n", __func__, w->name, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (sdm660_cdc->spkdrv_reg) { - ret = regulator_enable(sdm660_cdc->spkdrv_reg); - if (ret) - dev_err(codec->dev, - "%s Failed to enable spkdrv reg %s\n", - __func__, MSM89XX_VDD_SPKDRV_NAME); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (sdm660_cdc->spkdrv_reg) { - ret = regulator_disable(sdm660_cdc->spkdrv_reg); - if (ret) - dev_err(codec->dev, - "%s: Failed to disable spkdrv_reg %s\n", - __func__, MSM89XX_VDD_SPKDRV_NAME); - } - break; - } - return 0; -} - - -/* The register address is the same as other codec so it can use resmgr */ -static int msm_anlg_cdc_codec_enable_rx_bias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - sdm660_cdc->rx_bias_count++; - if (sdm660_cdc->rx_bias_count == 1) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, - 0x80, 0x80); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, - 0x01, 0x01); - } - break; - case SND_SOC_DAPM_POST_PMD: - sdm660_cdc->rx_bias_count--; - if (sdm660_cdc->rx_bias_count == 0) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, - 0x01, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, - 0x80, 0x00); - } - break; - } - dev_dbg(codec->dev, "%s rx_bias_count = %d\n", - __func__, sdm660_cdc->rx_bias_count); - return 0; -} - -static uint32_t wcd_get_impedance_value(uint32_t imped) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(wcd_imped_val) - 1; i++) { - if (imped >= wcd_imped_val[i] && - imped < wcd_imped_val[i + 1]) - break; - } - - pr_debug("%s: selected impedance value = %d\n", - __func__, wcd_imped_val[i]); - return wcd_imped_val[i]; -} - -static void wcd_imped_config(struct snd_soc_codec *codec, - uint32_t imped, bool set_gain) -{ - uint32_t value; - int codec_version; - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - value = wcd_get_impedance_value(imped); - - if (value < wcd_imped_val[0]) { - dev_dbg(codec->dev, - "%s, detected impedance is less than 4 Ohm\n", - __func__); - return; - } - - codec_version = get_codec_version(sdm660_cdc); - - if (set_gain) { - switch (codec_version) { - case TOMBAK_1_0: - case TOMBAK_2_0: - case CONGA: - /* - * For 32Ohm load and higher loads, Set 0x19E - * bit 5 to 1 (POS_0_DB_DI). For loads lower - * than 32Ohm (such as 16Ohm load), Set 0x19E - * bit 5 to 0 (POS_M4P5_DB_DI) - */ - if (value >= 32) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x20, 0x20); - else - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x20, 0x00); - break; - case CAJON: - case CAJON_2_0: - case DIANGU: - case DRAX_CDC: - if (value >= 13) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x20, 0x20); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_NCP_VCTRL, - 0x07, 0x07); - } else { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x20, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_NCP_VCTRL, - 0x07, 0x04); - } - break; - } - } else { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x20, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_NCP_VCTRL, - 0x07, 0x04); - } - - dev_dbg(codec->dev, "%s: Exit\n", __func__); -} - -static int msm_anlg_cdc_hphl_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - uint32_t impedl, impedr; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - int ret; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - ret = wcd_mbhc_get_impedance(&sdm660_cdc->mbhc, - &impedl, &impedr); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (get_codec_version(sdm660_cdc) > CAJON) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, - 0x08, 0x08); - if (get_codec_version(sdm660_cdc) == CAJON || - get_codec_version(sdm660_cdc) == CAJON_2_0) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, - 0x80, 0x80); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, - 0x80, 0x80); - } - if (get_codec_version(sdm660_cdc) > CAJON) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, - 0x08, 0x00); - if (sdm660_cdc->hph_mode == HD2_MODE) - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_PRE_RX1_INT_ON); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x01, 0x01); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x02, 0x02); - if (!ret) - wcd_imped_config(codec, impedl, true); - else - dev_dbg(codec->dev, "Failed to get mbhc impedance %d\n", - ret); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x02, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - wcd_imped_config(codec, impedl, false); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x02, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x01, 0x00); - if (sdm660_cdc->hph_mode == HD2_MODE) - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_POST_RX1_INT_OFF); - break; - } - return 0; -} - -static int msm_anlg_cdc_lo_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x80, 0x80); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x40, 0x40); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x80, 0x80); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x08, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x40, 0x40); - break; - case SND_SOC_DAPM_POST_PMD: - /* Wait for 20ms before powerdown of lineout_dac */ - usleep_range(20000, 20100); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x80, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x40, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x08, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x80, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x40, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x20, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x00); - break; - } - return 0; -} - -static int msm_anlg_cdc_hphr_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (sdm660_cdc->hph_mode == HD2_MODE) - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_PRE_RX2_INT_ON); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x01, 0x01); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x02, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x01, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x02, 0x00); - if (sdm660_cdc->hph_mode == HD2_MODE) - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_POST_RX2_INT_OFF); - break; - } - return 0; -} - -static int msm_anlg_cdc_hph_pa_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: %s event = %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (w->shift == 5) - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_PRE_HPHL_PA_ON); - else if (w->shift == 4) - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_PRE_HPHR_PA_ON); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x20, 0x20); - break; - - case SND_SOC_DAPM_POST_PMU: - /* Wait for 7ms to allow setting time for HPH_PA Enable */ - usleep_range(7000, 7100); - if (w->shift == 5) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x04); - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX1_MUTE_OFF); - } else if (w->shift == 4) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x04); - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX2_MUTE_OFF); - } - break; - - case SND_SOC_DAPM_PRE_PMD: - if (w->shift == 5) { - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX1_MUTE_ON); - /* Wait for 20ms after HPHL RX digital mute */ - msleep(20); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x00); - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_PRE_HPHL_PA_OFF); - } else if (w->shift == 4) { - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX2_MUTE_ON); - /* Wait for 20ms after HPHR RX digital mute */ - msleep(20); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x00); - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_PRE_HPHR_PA_OFF); - } - if (get_codec_version(sdm660_cdc) >= CAJON) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP, - 0xF0, 0x30); - } - break; - case SND_SOC_DAPM_POST_PMD: - if (w->shift == 5) { - clear_bit(WCD_MBHC_HPHL_PA_OFF_ACK, - &sdm660_cdc->mbhc.hph_pa_dac_state); - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_POST_HPHL_PA_OFF); - } else if (w->shift == 4) { - clear_bit(WCD_MBHC_HPHR_PA_OFF_ACK, - &sdm660_cdc->mbhc.hph_pa_dac_state); - msm_anlg_cdc_notifier_call(codec, - WCD_EVENT_POST_HPHR_PA_OFF); - } - /* Wait for 15ms after HPH RX teardown */ - usleep_range(15000, 15100); - break; - } - return 0; -} - -static const struct snd_soc_dapm_route audio_map[] = { - /* RDAC Connections */ - {"HPHR DAC", NULL, "RDAC2 MUX"}, - {"RDAC2 MUX", "RX1", "PDM_IN_RX1"}, - {"RDAC2 MUX", "RX2", "PDM_IN_RX2"}, - - /* WSA */ - {"WSA_SPK OUT", NULL, "WSA Spk Switch"}, - {"WSA Spk Switch", "WSA", "EAR PA"}, - - /* Earpiece (RX MIX1) */ - {"EAR", NULL, "EAR_S"}, - {"EAR_S", "Switch", "EAR PA"}, - {"EAR PA", NULL, "RX_BIAS"}, - {"EAR PA", NULL, "HPHL DAC"}, - {"EAR PA", NULL, "HPHR DAC"}, - {"EAR PA", NULL, "EAR CP"}, - - /* Headset (RX MIX1 and RX MIX2) */ - {"HEADPHONE", NULL, "HPHL PA"}, - {"HEADPHONE", NULL, "HPHR PA"}, - - {"Ext Spk", NULL, "Ext Spk Switch"}, - {"Ext Spk Switch", "On", "HPHL PA"}, - {"Ext Spk Switch", "On", "HPHR PA"}, - - {"HPHL PA", NULL, "HPHL"}, - {"HPHR PA", NULL, "HPHR"}, - {"HPHL", "Switch", "HPHL DAC"}, - {"HPHR", "Switch", "HPHR DAC"}, - {"HPHL PA", NULL, "CP"}, - {"HPHL PA", NULL, "RX_BIAS"}, - {"HPHR PA", NULL, "CP"}, - {"HPHR PA", NULL, "RX_BIAS"}, - {"HPHL DAC", NULL, "PDM_IN_RX1"}, - - {"SPK_OUT", NULL, "SPK PA"}, - {"SPK PA", NULL, "SPK_RX_BIAS"}, - {"SPK PA", NULL, "SPK"}, - {"SPK", "Switch", "SPK DAC"}, - {"SPK DAC", NULL, "PDM_IN_RX3"}, - {"SPK DAC", NULL, "VDD_SPKDRV"}, - - /* lineout */ - {"LINEOUT", NULL, "LINEOUT PA"}, - {"LINEOUT PA", NULL, "SPK_RX_BIAS"}, - {"LINEOUT PA", NULL, "LINE_OUT"}, - {"LINE_OUT", "Switch", "LINEOUT DAC"}, - {"LINEOUT DAC", NULL, "PDM_IN_RX3"}, - - /* lineout to WSA */ - {"WSA_SPK OUT", NULL, "LINEOUT PA"}, - - {"PDM_IN_RX1", NULL, "RX1 CLK"}, - {"PDM_IN_RX2", NULL, "RX2 CLK"}, - {"PDM_IN_RX3", NULL, "RX3 CLK"}, - - {"ADC1_OUT", NULL, "ADC1"}, - {"ADC2_OUT", NULL, "ADC2"}, - {"ADC3_OUT", NULL, "ADC3"}, - - /* ADC Connections */ - {"ADC2", NULL, "ADC2 MUX"}, - {"ADC3", NULL, "ADC2 MUX"}, - {"ADC2 MUX", "INP2", "ADC2_INP2"}, - {"ADC2 MUX", "INP3", "ADC2_INP3"}, - - {"ADC1", NULL, "ADC1_INP1"}, - {"ADC1_INP1", "Switch", "AMIC1"}, - {"ADC2_INP2", NULL, "AMIC2"}, - {"ADC2_INP3", NULL, "AMIC3"}, - - {"MIC BIAS Internal1", NULL, "INT_LDO_H"}, - {"MIC BIAS Internal2", NULL, "INT_LDO_H"}, - {"MIC BIAS External", NULL, "INT_LDO_H"}, - {"MIC BIAS External2", NULL, "INT_LDO_H"}, - {"MIC BIAS Internal1", NULL, "MICBIAS_REGULATOR"}, - {"MIC BIAS Internal2", NULL, "MICBIAS_REGULATOR"}, - {"MIC BIAS External", NULL, "MICBIAS_REGULATOR"}, - {"MIC BIAS External2", NULL, "MICBIAS_REGULATOR"}, -}; - -static int msm_anlg_cdc_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(dai->codec); - - dev_dbg(dai->codec->dev, "%s(): substream = %s stream = %d\n", - __func__, - substream->name, substream->stream); - /* - * If status_mask is BUS_DOWN it means SSR is not complete. - * So return error. - */ - if (test_bit(BUS_DOWN, &sdm660_cdc->status_mask)) { - dev_err(dai->codec->dev, "Error, Device is not up post SSR\n"); - return -EINVAL; - } - return 0; -} - -static void msm_anlg_cdc_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - dev_dbg(dai->codec->dev, - "%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); -} - -int msm_anlg_cdc_mclk_enable(struct snd_soc_codec *codec, - int mclk_enable, bool dapm) -{ - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: mclk_enable = %u, dapm = %d\n", - __func__, mclk_enable, dapm); - if (mclk_enable) { - sdm660_cdc->int_mclk0_enabled = true; - msm_anlg_cdc_codec_enable_clock_block(codec, 1); - } else { - if (!sdm660_cdc->int_mclk0_enabled) { - dev_err(codec->dev, "Error, MCLK already diabled\n"); - return -EINVAL; - } - sdm660_cdc->int_mclk0_enabled = false; - msm_anlg_cdc_codec_enable_clock_block(codec, 0); - } - return 0; -} -EXPORT_SYMBOL(msm_anlg_cdc_mclk_enable); - -static int msm_anlg_cdc_set_dai_sysclk(struct snd_soc_dai *dai, - int clk_id, unsigned int freq, int dir) -{ - dev_dbg(dai->codec->dev, "%s\n", __func__); - return 0; -} - -static int msm_anlg_cdc_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - dev_dbg(dai->codec->dev, "%s\n", __func__); - return 0; -} - -static int msm_anlg_cdc_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) - -{ - dev_dbg(dai->codec->dev, "%s\n", __func__); - return 0; -} - -static int msm_anlg_cdc_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) - -{ - dev_dbg(dai->codec->dev, "%s\n", __func__); - return 0; -} - -static struct snd_soc_dai_ops msm_anlg_cdc_dai_ops = { - .startup = msm_anlg_cdc_startup, - .shutdown = msm_anlg_cdc_shutdown, - .set_sysclk = msm_anlg_cdc_set_dai_sysclk, - .set_fmt = msm_anlg_cdc_set_dai_fmt, - .set_channel_map = msm_anlg_cdc_set_channel_map, - .get_channel_map = msm_anlg_cdc_get_channel_map, -}; - -static struct snd_soc_dai_driver msm_anlg_cdc_i2s_dai[] = { - { - .name = "msm_anlg_cdc_i2s_rx1", - .id = AIF1_PB, - .playback = { - .stream_name = "PDM Playback", - .rates = SDM660_CDC_RATES, - .formats = SDM660_CDC_FORMATS, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 3, - }, - .ops = &msm_anlg_cdc_dai_ops, - }, - { - .name = "msm_anlg_cdc_i2s_tx1", - .id = AIF1_CAP, - .capture = { - .stream_name = "PDM Capture", - .rates = SDM660_CDC_RATES, - .formats = SDM660_CDC_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &msm_anlg_cdc_dai_ops, - }, - { - .name = "msm_anlg_cdc_i2s_tx2", - .id = AIF3_SVA, - .capture = { - .stream_name = "RecordSVA", - .rates = SDM660_CDC_RATES, - .formats = SDM660_CDC_FORMATS, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &msm_anlg_cdc_dai_ops, - }, - { - .name = "msm_anlg_vifeedback", - .id = AIF2_VIFEED, - .capture = { - .stream_name = "VIfeed", - .rates = SDM660_CDC_RATES, - .formats = SDM660_CDC_FORMATS, - .rate_max = 48000, - .rate_min = 48000, - .channels_min = 2, - .channels_max = 2, - }, - .ops = &msm_anlg_cdc_dai_ops, - }, -}; - - -static int msm_anlg_cdc_codec_enable_lo_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: %d %s\n", __func__, event, w->name); - switch (event) { - case SND_SOC_DAPM_POST_PMU: - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX3_MUTE_OFF); - break; - case SND_SOC_DAPM_POST_PMD: - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX3_MUTE_ON); - break; - } - - return 0; -} - -static int msm_anlg_cdc_codec_enable_spk_ext_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: %s event = %d\n", __func__, w->name, event); - switch (event) { - case SND_SOC_DAPM_POST_PMU: - dev_dbg(codec->dev, - "%s: enable external speaker PA\n", __func__); - if (sdm660_cdc->codec_spk_ext_pa_cb) - sdm660_cdc->codec_spk_ext_pa_cb(codec, 1); - break; - case SND_SOC_DAPM_PRE_PMD: - dev_dbg(codec->dev, - "%s: enable external speaker PA\n", __func__); - if (sdm660_cdc->codec_spk_ext_pa_cb) - sdm660_cdc->codec_spk_ext_pa_cb(codec, 0); - break; - } - return 0; -} - -static int msm_anlg_cdc_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - dev_dbg(codec->dev, - "%s: Sleeping 20ms after select EAR PA\n", - __func__); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x80, 0x80); - if (get_codec_version(sdm660_cdc) < CONGA) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0xFF, 0x2A); - if (get_codec_version(sdm660_cdc) >= DIANGU) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x08, 0x00); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x04); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x04); - } - break; - case SND_SOC_DAPM_POST_PMU: - dev_dbg(codec->dev, - "%s: Sleeping 20ms after enabling EAR PA\n", - __func__); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x40, 0x40); - /* Wait for 7ms after EAR PA enable */ - usleep_range(7000, 7100); - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX1_MUTE_OFF); - break; - case SND_SOC_DAPM_PRE_PMD: - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_RX1_MUTE_ON); - /* Wait for 20ms for RX digital mute to take effect */ - msleep(20); - if (sdm660_cdc->boost_option == BOOST_ALWAYS) { - dev_dbg(codec->dev, - "%s: boost_option:%d, tear down ear\n", - __func__, sdm660_cdc->boost_option); - msm_anlg_cdc_boost_mode_sequence(codec, EAR_PMD); - } - if (get_codec_version(sdm660_cdc) >= DIANGU) { - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x0); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x0); - } - break; - case SND_SOC_DAPM_POST_PMD: - dev_dbg(codec->dev, - "%s: Sleeping 7ms after disabling EAR PA\n", - __func__); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0x40, 0x00); - /* Wait for 7ms after EAR PA teardown */ - usleep_range(7000, 7100); - if (get_codec_version(sdm660_cdc) < CONGA) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0xFF, 0x16); - if (get_codec_version(sdm660_cdc) >= DIANGU) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x08, 0x08); - break; - } - return 0; -} - -static const struct snd_soc_dapm_widget msm_anlg_cdc_dapm_widgets[] = { - SND_SOC_DAPM_PGA_E("EAR PA", SND_SOC_NOPM, - 0, 0, NULL, 0, msm_anlg_cdc_codec_enable_ear_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHL PA", MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, - 5, 0, NULL, 0, - msm_anlg_cdc_hph_pa_event, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHR PA", MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, - 4, 0, NULL, 0, - msm_anlg_cdc_hph_pa_event, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("SPK PA", SND_SOC_NOPM, - 0, 0, NULL, 0, msm_anlg_cdc_codec_enable_spk_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, - 5, 0, NULL, 0, msm_anlg_cdc_codec_enable_lo_pa, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("EAR_S", SND_SOC_NOPM, 0, 0, ear_pa_mux), - SND_SOC_DAPM_MUX("SPK", SND_SOC_NOPM, 0, 0, spkr_mux), - SND_SOC_DAPM_MUX("HPHL", SND_SOC_NOPM, 0, 0, hphl_mux), - SND_SOC_DAPM_MUX("HPHR", SND_SOC_NOPM, 0, 0, hphr_mux), - SND_SOC_DAPM_MUX("RDAC2 MUX", SND_SOC_NOPM, 0, 0, &rdac2_mux), - SND_SOC_DAPM_MUX("WSA Spk Switch", SND_SOC_NOPM, 0, 0, wsa_spk_mux), - SND_SOC_DAPM_MUX("Ext Spk Switch", SND_SOC_NOPM, 0, 0, &ext_spk_mux), - SND_SOC_DAPM_MUX("LINE_OUT", SND_SOC_NOPM, 0, 0, lo_mux), - SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux), - - SND_SOC_DAPM_MIXER_E("HPHL DAC", - MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 3, 0, NULL, - 0, msm_anlg_cdc_hphl_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("HPHR DAC", - MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 3, 0, NULL, - 0, msm_anlg_cdc_hphr_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER("ADC2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("ADC3", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_DAC("SPK DAC", NULL, MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, - 7, 0), - SND_SOC_DAPM_DAC_E("LINEOUT DAC", NULL, - SND_SOC_NOPM, 0, 0, msm_anlg_cdc_lo_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SPK("Ext Spk", msm_anlg_cdc_codec_enable_spk_ext_pa), - - SND_SOC_DAPM_SWITCH("ADC1_INP1", SND_SOC_NOPM, 0, 0, - &adc1_switch), - SND_SOC_DAPM_SUPPLY("RX1 CLK", MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("RX2 CLK", MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 1, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("RX3 CLK", MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 2, 0, msm_anlg_cdc_codec_enable_dig_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY("CP", MSM89XX_PMIC_ANALOG_NCP_EN, 0, 0, - msm_anlg_cdc_codec_enable_charge_pump, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY("EAR CP", MSM89XX_PMIC_ANALOG_NCP_EN, 4, 0, - msm_anlg_cdc_codec_enable_charge_pump, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("RX_BIAS", 1, SND_SOC_NOPM, - 0, 0, msm_anlg_cdc_codec_enable_rx_bias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("SPK_RX_BIAS", 1, SND_SOC_NOPM, 0, 0, - msm_anlg_cdc_codec_enable_rx_bias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY("VDD_SPKDRV", SND_SOC_NOPM, 0, 0, - sdm660_wcd_codec_enable_vdd_spkr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY("INT_LDO_H", SND_SOC_NOPM, 1, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("MICBIAS_REGULATOR", SND_SOC_NOPM, - ON_DEMAND_MICBIAS, 0, - msm_anlg_cdc_codec_enable_on_demand_supply, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MICBIAS_E("MIC BIAS Internal1", - MSM89XX_PMIC_ANALOG_MICB_1_EN, 7, 0, - msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS Internal2", - MSM89XX_PMIC_ANALOG_MICB_2_EN, 7, 0, - msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS Internal3", - MSM89XX_PMIC_ANALOG_MICB_1_EN, 7, 0, - msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("ADC1", NULL, MSM89XX_PMIC_ANALOG_TX_1_EN, 7, 0, - msm_anlg_cdc_codec_enable_adc, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("ADC2_INP2", - NULL, MSM89XX_PMIC_ANALOG_TX_2_EN, 7, 0, - msm_anlg_cdc_codec_enable_adc, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("ADC2_INP3", - NULL, MSM89XX_PMIC_ANALOG_TX_3_EN, 7, 0, - msm_anlg_cdc_codec_enable_adc, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MICBIAS_E("MIC BIAS External", - MSM89XX_PMIC_ANALOG_MICB_1_EN, 7, 0, - msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS External2", - MSM89XX_PMIC_ANALOG_MICB_2_EN, 7, 0, - msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("AMIC1"), - SND_SOC_DAPM_INPUT("AMIC2"), - SND_SOC_DAPM_INPUT("AMIC3"), - SND_SOC_DAPM_AIF_IN("PDM_IN_RX1", "PDM Playback", - 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_IN("PDM_IN_RX2", "PDM Playback", - 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_IN("PDM_IN_RX3", "PDM Playback", - 0, SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_OUTPUT("EAR"), - SND_SOC_DAPM_OUTPUT("WSA_SPK OUT"), - SND_SOC_DAPM_OUTPUT("HEADPHONE"), - SND_SOC_DAPM_OUTPUT("SPK_OUT"), - SND_SOC_DAPM_OUTPUT("LINEOUT"), - SND_SOC_DAPM_AIF_OUT("ADC1_OUT", "PDM Capture", - 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("ADC2_OUT", "PDM Capture", - 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("ADC3_OUT", "PDM Capture", - 0, SND_SOC_NOPM, 0, 0), -}; - -static const struct sdm660_cdc_reg_mask_val msm_anlg_cdc_reg_defaults[] = { - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1), -}; - -static const struct sdm660_cdc_reg_mask_val - msm_anlg_cdc_reg_defaults_2_0[] = { - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x28), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, 0x5F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, 0x88), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80), -}; - -static const struct sdm660_cdc_reg_mask_val conga_wcd_reg_defaults[] = { - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4C), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x28), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE, 0x0A), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80), -}; - -static const struct sdm660_cdc_reg_mask_val cajon_wcd_reg_defaults[] = { - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4C), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0xA8), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0xA4), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x41), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0xFA), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80), -}; - -static const struct sdm660_cdc_reg_mask_val cajon2p0_wcd_reg_defaults[] = { - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4C), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0xA2), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0xA8), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0xA4), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x41), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_RX_EAR_STATUS, 0x10), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_BYPASS_MODE, 0x18), - MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0xFA), - MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80), -}; - -static void msm_anlg_cdc_update_reg_defaults(struct snd_soc_codec *codec) -{ - u32 i, version; - struct sdm660_cdc_priv *sdm660_cdc = - snd_soc_codec_get_drvdata(codec); - - version = get_codec_version(sdm660_cdc); - if (version == TOMBAK_1_0) { - for (i = 0; i < ARRAY_SIZE(msm_anlg_cdc_reg_defaults); i++) - snd_soc_write(codec, msm_anlg_cdc_reg_defaults[i].reg, - msm_anlg_cdc_reg_defaults[i].val); - } else if (version == TOMBAK_2_0) { - for (i = 0; i < ARRAY_SIZE(msm_anlg_cdc_reg_defaults_2_0); i++) - snd_soc_write(codec, - msm_anlg_cdc_reg_defaults_2_0[i].reg, - msm_anlg_cdc_reg_defaults_2_0[i].val); - } else if (version == CONGA) { - for (i = 0; i < ARRAY_SIZE(conga_wcd_reg_defaults); i++) - snd_soc_write(codec, - conga_wcd_reg_defaults[i].reg, - conga_wcd_reg_defaults[i].val); - } else if (version == CAJON) { - for (i = 0; i < ARRAY_SIZE(cajon_wcd_reg_defaults); i++) - snd_soc_write(codec, - cajon_wcd_reg_defaults[i].reg, - cajon_wcd_reg_defaults[i].val); - } else if (version == CAJON_2_0 || version == DIANGU - || version == DRAX_CDC) { - for (i = 0; i < ARRAY_SIZE(cajon2p0_wcd_reg_defaults); i++) - snd_soc_write(codec, - cajon2p0_wcd_reg_defaults[i].reg, - cajon2p0_wcd_reg_defaults[i].val); - } -} - -static const struct sdm660_cdc_reg_mask_val - msm_anlg_cdc_codec_reg_init_val[] = { - - /* Initialize current threshold to 350MA - * number of wait and run cycles to 4096 - */ - {MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0xFF, 0x12}, - {MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT, 0xFF, 0xFF}, -}; - -static void msm_anlg_cdc_codec_init_reg(struct snd_soc_codec *codec) -{ - u32 i; - - for (i = 0; i < ARRAY_SIZE(msm_anlg_cdc_codec_reg_init_val); i++) - snd_soc_update_bits(codec, - msm_anlg_cdc_codec_reg_init_val[i].reg, - msm_anlg_cdc_codec_reg_init_val[i].mask, - msm_anlg_cdc_codec_reg_init_val[i].val); -} - -static int msm_anlg_cdc_bringup(struct snd_soc_codec *codec) -{ - snd_soc_write(codec, - MSM89XX_PMIC_DIGITAL_SEC_ACCESS, - 0xA5); - snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x01); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_SEC_ACCESS, - 0xA5); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x01); - snd_soc_write(codec, - MSM89XX_PMIC_DIGITAL_SEC_ACCESS, - 0xA5); - snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x00); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_SEC_ACCESS, - 0xA5); - snd_soc_write(codec, MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x00); - - return 0; -} - -static struct regulator *msm_anlg_cdc_find_regulator( - const struct sdm660_cdc_priv *sdm660_cdc, - const char *name) -{ - int i; - - for (i = 0; i < sdm660_cdc->num_of_supplies; i++) { - if (sdm660_cdc->supplies[i].supply && - !strcmp(sdm660_cdc->supplies[i].supply, name)) - return sdm660_cdc->supplies[i].consumer; - } - - dev_dbg(sdm660_cdc->dev, "Error: regulator not found:%s\n" - , name); - return NULL; -} - -static void msm_anlg_cdc_update_micbias_regulator( - const struct sdm660_cdc_priv *sdm660_cdc, - const char *name, - struct on_demand_supply *micbias_supply) -{ - int i; - struct sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data; - - for (i = 0; i < sdm660_cdc->num_of_supplies; i++) { - if (sdm660_cdc->supplies[i].supply && - !strcmp(sdm660_cdc->supplies[i].supply, name)) { - micbias_supply->supply = - sdm660_cdc->supplies[i].consumer; - micbias_supply->min_uv = pdata->regulator[i].min_uv; - micbias_supply->max_uv = pdata->regulator[i].max_uv; - micbias_supply->optimum_ua = - pdata->regulator[i].optimum_ua; - return; - } - } - - dev_err(sdm660_cdc->dev, "Error: regulator not found:%s\n", name); -} - -static int msm_anlg_cdc_device_down(struct snd_soc_codec *codec) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct sdm660_cdc_priv *sdm660_cdc_priv = - snd_soc_codec_get_drvdata(codec); - unsigned int tx_1_en; - unsigned int tx_2_en; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - dev_dbg(codec->dev, "%s: device down!\n", __func__); - - tx_1_en = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_TX_1_EN); - tx_2_en = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_TX_2_EN); - tx_1_en = tx_1_en & 0x7f; - tx_2_en = tx_2_en & 0x7f; - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_TX_1_EN, tx_1_en); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_TX_2_EN, tx_2_en); - if (sdm660_cdc_priv->boost_option == BOOST_ON_FOREVER) { - if ((snd_soc_read(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL) - & 0x80) == 0) { - msm_anlg_cdc_dig_notifier_call(codec, - DIG_CDC_EVENT_CLK_ON); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x30); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80, 0x80); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, - 0x0C, 0x0C); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, - 0x84, 0x84); - snd_soc_update_bits(codec, - MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, - 0x1F, 0x1F); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, - 0x90, 0x90); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, - 0xFF, 0xFF); - /* Wait for 20us for boost settings to take effect */ - usleep_range(20, 21); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, - 0xFF, 0xFF); - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, - 0xE9, 0xE9); - } - } - msm_anlg_cdc_boost_off(codec); - sdm660_cdc_priv->hph_mode = NORMAL_MODE; - - /* 40ms to allow boost to discharge */ - msleep(40); - /* Disable PA to avoid pop during codec bring up */ - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, - 0x30, 0x00); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, - 0x80, 0x00); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x20); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x20); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x12); - snd_soc_write(codec, - MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x93); - - msm_anlg_cdc_dig_notifier_call(codec, DIG_CDC_EVENT_SSR_DOWN); - atomic_set(&pdata->int_mclk0_enabled, false); - set_bit(BUS_DOWN, &sdm660_cdc_priv->status_mask); - snd_soc_card_change_online_state(codec->component.card, 0); - - return 0; -} - -static int msm_anlg_cdc_device_up(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc_priv = - snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: device up!\n", __func__); - - msm_anlg_cdc_dig_notifier_call(codec, DIG_CDC_EVENT_SSR_UP); - clear_bit(BUS_DOWN, &sdm660_cdc_priv->status_mask); - snd_soc_card_change_online_state(codec->component.card, 1); - /* delay is required to make sure sound card state updated */ - usleep_range(5000, 5100); - - snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_INT_EN_SET, - MSM89XX_PMIC_DIGITAL_INT_EN_SET__POR); - snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_INT_EN_CLR, - MSM89XX_PMIC_DIGITAL_INT_EN_CLR__POR); - - msm_anlg_cdc_set_boost_v(codec); - msm_anlg_cdc_set_micb_v(codec); - if (sdm660_cdc_priv->boost_option == BOOST_ON_FOREVER) - msm_anlg_cdc_boost_on(codec); - else if (sdm660_cdc_priv->boost_option == BYPASS_ALWAYS) - msm_anlg_cdc_bypass_on(codec); - - return 0; -} - -static int sdm660_cdc_notifier_service_cb(struct notifier_block *nb, - unsigned long opcode, void *ptr) -{ - struct snd_soc_codec *codec; - struct sdm660_cdc_priv *sdm660_cdc_priv = - container_of(nb, struct sdm660_cdc_priv, - audio_ssr_nb); - bool adsp_ready = false; - bool timedout; - unsigned long timeout; - static bool initial_boot = true; - - codec = sdm660_cdc_priv->codec; - dev_dbg(codec->dev, "%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - if (initial_boot) { - initial_boot = false; - break; - } - dev_dbg(codec->dev, - "ADSP is about to power down. teardown/reset codec\n"); - msm_anlg_cdc_device_down(codec); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (initial_boot) - initial_boot = false; - dev_dbg(codec->dev, - "ADSP is about to power up. bring up codec\n"); - - if (!q6core_is_adsp_ready()) { - dev_dbg(codec->dev, - "ADSP isn't ready\n"); - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - while (!(timedout = time_after(jiffies, timeout))) { - if (!q6core_is_adsp_ready()) { - dev_dbg(codec->dev, - "ADSP isn't ready\n"); - } else { - dev_dbg(codec->dev, - "ADSP is ready\n"); - adsp_ready = true; - goto powerup; - } - } - } else { - adsp_ready = true; - dev_dbg(codec->dev, "%s: DSP is ready\n", __func__); - } -powerup: - if (adsp_ready) - msm_anlg_cdc_device_up(codec); - break; - default: - break; - } - return NOTIFY_OK; -} - -int msm_anlg_cdc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - struct sdm660_cdc_priv *sdm660_cdc_priv = - snd_soc_codec_get_drvdata(codec); - - return wcd_mbhc_start(&sdm660_cdc_priv->mbhc, mbhc_cfg); -} -EXPORT_SYMBOL(msm_anlg_cdc_hs_detect); - -void msm_anlg_cdc_hs_detect_exit(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc_priv = - snd_soc_codec_get_drvdata(codec); - - wcd_mbhc_stop(&sdm660_cdc_priv->mbhc); -} -EXPORT_SYMBOL(msm_anlg_cdc_hs_detect_exit); - -void msm_anlg_cdc_update_int_spk_boost(bool enable) -{ - pr_debug("%s: enable = %d\n", __func__, enable); - spkr_boost_en = enable; -} -EXPORT_SYMBOL(msm_anlg_cdc_update_int_spk_boost); - -static void msm_anlg_cdc_set_micb_v(struct snd_soc_codec *codec) -{ - - struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec); - struct sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data; - u8 reg_val; - - reg_val = VOLTAGE_CONVERTER(pdata->micbias.cfilt1_mv, MICBIAS_MIN_VAL, - MICBIAS_STEP_SIZE); - dev_dbg(codec->dev, "cfilt1_mv %d reg_val %x\n", - (u32)pdata->micbias.cfilt1_mv, reg_val); - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_VAL, - 0xF8, (reg_val << 3)); -} - -static void msm_anlg_cdc_set_boost_v(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc_priv = - snd_soc_codec_get_drvdata(codec); - - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE, - 0x1F, sdm660_cdc_priv->boost_voltage); -} - -static void msm_anlg_cdc_configure_cap(struct snd_soc_codec *codec, - bool micbias1, bool micbias2) -{ - - struct msm_asoc_mach_data *pdata = NULL; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - - pr_debug("\n %s: micbias1 %x micbias2 = %d\n", __func__, micbias1, - micbias2); - if (micbias1 && micbias2) { - if ((pdata->micbias1_cap_mode - == MICBIAS_EXT_BYP_CAP) || - (pdata->micbias2_cap_mode - == MICBIAS_EXT_BYP_CAP)) - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_1_EN, - 0x40, (MICBIAS_EXT_BYP_CAP << 6)); - else - snd_soc_update_bits(codec, - MSM89XX_PMIC_ANALOG_MICB_1_EN, - 0x40, (MICBIAS_NO_EXT_BYP_CAP << 6)); - } else if (micbias2) { - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_EN, - 0x40, (pdata->micbias2_cap_mode << 6)); - } else if (micbias1) { - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_EN, - 0x40, (pdata->micbias1_cap_mode << 6)); - } else { - snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_EN, - 0x40, 0x00); - } -} - -static ssize_t msm_anlg_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct sdm660_cdc_priv *sdm660_cdc_priv; - char buffer[MSM_ANLG_CDC_VERSION_ENTRY_SIZE]; - int len = 0; - - sdm660_cdc_priv = (struct sdm660_cdc_priv *) entry->private_data; - if (!sdm660_cdc_priv) { - pr_err("%s: sdm660_cdc_priv is null\n", __func__); - return -EINVAL; - } - - switch (get_codec_version(sdm660_cdc_priv)) { - case DRAX_CDC: - len = snprintf(buffer, sizeof(buffer), "DRAX-CDC_1_0\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops msm_anlg_codec_info_ops = { - .read = msm_anlg_codec_version_read, -}; - -/* - * msm_anlg_codec_info_create_codec_entry - creates pmic_analog module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates pmic_analog module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int msm_anlg_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct sdm660_cdc_priv *sdm660_cdc_priv; - struct snd_soc_card *card; - int ret; - - if (!codec_root || !codec) - return -EINVAL; - - sdm660_cdc_priv = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - sdm660_cdc_priv->entry = snd_info_create_subdir(codec_root->module, - "spmi0-03", - codec_root); - if (!sdm660_cdc_priv->entry) { - dev_dbg(codec->dev, "%s: failed to create pmic_analog entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - sdm660_cdc_priv->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create pmic_analog version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = sdm660_cdc_priv; - version_entry->size = MSM_ANLG_CDC_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &msm_anlg_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - sdm660_cdc_priv->version_entry = version_entry; - - sdm660_cdc_priv->audio_ssr_nb.notifier_call = - sdm660_cdc_notifier_service_cb; - ret = audio_notifier_register("pmic_analog_cdc", - AUDIO_NOTIFIER_ADSP_DOMAIN, - &sdm660_cdc_priv->audio_ssr_nb); - if (ret < 0) { - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - return ret; - } - return 0; -} -EXPORT_SYMBOL(msm_anlg_codec_info_create_codec_entry); - -static int msm_anlg_cdc_soc_probe(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret; - - sdm660_cdc = dev_get_drvdata(codec->dev); - sdm660_cdc->codec = codec; - - /* codec resmgr module init */ - sdm660_cdc->spkdrv_reg = - msm_anlg_cdc_find_regulator(sdm660_cdc, - MSM89XX_VDD_SPKDRV_NAME); - sdm660_cdc->pmic_rev = - snd_soc_read(codec, - MSM89XX_PMIC_DIGITAL_REVISION1); - sdm660_cdc->codec_version = - snd_soc_read(codec, - MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE); - sdm660_cdc->analog_major_rev = - snd_soc_read(codec, - MSM89XX_PMIC_ANALOG_REVISION4); - - if (sdm660_cdc->codec_version == CONGA) { - dev_dbg(codec->dev, "%s :Conga REV: %d\n", __func__, - sdm660_cdc->codec_version); - sdm660_cdc->ext_spk_boost_set = true; - } else { - dev_dbg(codec->dev, "%s :PMIC REV: %d\n", __func__, - sdm660_cdc->pmic_rev); - if (sdm660_cdc->pmic_rev == TOMBAK_1_0 && - sdm660_cdc->codec_version == CAJON_2_0) { - if (sdm660_cdc->analog_major_rev == 0x02) { - sdm660_cdc->codec_version = DRAX_CDC; - dev_dbg(codec->dev, - "%s : Drax codec detected\n", __func__); - } else { - sdm660_cdc->codec_version = DIANGU; - dev_dbg(codec->dev, "%s : Diangu detected\n", - __func__); - } - } else if (sdm660_cdc->pmic_rev == TOMBAK_1_0 && - (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_NCP_FBCTRL) - & 0x80)) { - sdm660_cdc->codec_version = CAJON; - dev_dbg(codec->dev, "%s : Cajon detected\n", __func__); - } else if (sdm660_cdc->pmic_rev == TOMBAK_2_0 && - (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_NCP_FBCTRL) - & 0x80)) { - sdm660_cdc->codec_version = CAJON_2_0; - dev_dbg(codec->dev, "%s : Cajon 2.0 detected\n", - __func__); - } - } - /* - * set to default boost option BOOST_SWITCH, user mixer path can change - * it to BOOST_ALWAYS or BOOST_BYPASS based on solution chosen. - */ - sdm660_cdc->boost_option = BOOST_SWITCH; - sdm660_cdc->hph_mode = NORMAL_MODE; - - msm_anlg_cdc_dt_parse_boost_info(codec); - msm_anlg_cdc_set_boost_v(codec); - - snd_soc_add_codec_controls(codec, impedance_detect_controls, - ARRAY_SIZE(impedance_detect_controls)); - snd_soc_add_codec_controls(codec, hph_type_detect_controls, - ARRAY_SIZE(hph_type_detect_controls)); - - msm_anlg_cdc_bringup(codec); - msm_anlg_cdc_codec_init_reg(codec); - msm_anlg_cdc_update_reg_defaults(codec); - - wcd9xxx_spmi_set_codec(codec); - - msm_anlg_cdc_update_micbias_regulator( - sdm660_cdc, - on_demand_supply_name[ON_DEMAND_MICBIAS], - &sdm660_cdc->on_demand_list[ON_DEMAND_MICBIAS]); - atomic_set(&sdm660_cdc->on_demand_list[ON_DEMAND_MICBIAS].ref, - 0); - - sdm660_cdc->fw_data = devm_kzalloc(codec->dev, - sizeof(*(sdm660_cdc->fw_data)), - GFP_KERNEL); - if (!sdm660_cdc->fw_data) - return -ENOMEM; - - set_bit(WCD9XXX_MBHC_CAL, sdm660_cdc->fw_data->cal_bit); - ret = wcd_cal_create_hwdep(sdm660_cdc->fw_data, - WCD9XXX_CODEC_HWDEP_NODE, codec); - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - return ret; - } - - wcd_mbhc_init(&sdm660_cdc->mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, true); - - sdm660_cdc->int_mclk0_enabled = false; - /*Update speaker boost configuration*/ - sdm660_cdc->spk_boost_set = spkr_boost_en; - pr_debug("%s: speaker boost configured = %d\n", - __func__, sdm660_cdc->spk_boost_set); - - /* Set initial MICBIAS voltage level */ - msm_anlg_cdc_set_micb_v(codec); - - /* Set initial cap mode */ - msm_anlg_cdc_configure_cap(codec, false, false); - - snd_soc_dapm_ignore_suspend(dapm, "PDM Playback"); - snd_soc_dapm_ignore_suspend(dapm, "PDM Capture"); - - snd_soc_dapm_sync(dapm); - - return 0; -} - -static int msm_anlg_cdc_soc_remove(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc_priv = - dev_get_drvdata(codec->dev); - - sdm660_cdc_priv->spkdrv_reg = NULL; - sdm660_cdc_priv->on_demand_list[ON_DEMAND_MICBIAS].supply = NULL; - atomic_set(&sdm660_cdc_priv->on_demand_list[ON_DEMAND_MICBIAS].ref, - 0); - wcd_mbhc_deinit(&sdm660_cdc_priv->mbhc); - - return 0; -} - -static int msm_anlg_cdc_enable_static_supplies_to_optimum( - struct sdm660_cdc_priv *sdm660_cdc, - struct sdm660_cdc_pdata *pdata) -{ - int i; - int ret = 0, rc = 0; - - for (i = 0; i < sdm660_cdc->num_of_supplies; i++) { - if (pdata->regulator[i].ondemand) - continue; - if (regulator_count_voltages( - sdm660_cdc->supplies[i].consumer) <= 0) - continue; - - rc = regulator_enable(sdm660_cdc->supplies[i].consumer); - if (rc) { - dev_err(sdm660_cdc->dev, "Failed to enable %s: %d\n", - sdm660_cdc->supplies[i].supply, rc); - break; - } - ret = regulator_set_voltage( - sdm660_cdc->supplies[i].consumer, - pdata->regulator[i].min_uv, - pdata->regulator[i].max_uv); - if (ret) { - dev_err(sdm660_cdc->dev, - "Setting volt failed for regulator %s err %d\n", - sdm660_cdc->supplies[i].supply, ret); - } - - ret = regulator_set_load(sdm660_cdc->supplies[i].consumer, - pdata->regulator[i].optimum_ua); - dev_dbg(sdm660_cdc->dev, "Regulator %s set optimum mode\n", - sdm660_cdc->supplies[i].supply); - } - - while (rc && i--) - if (!pdata->regulator[i].ondemand) - regulator_disable(sdm660_cdc->supplies[i].consumer); - return rc; -} - -static int msm_anlg_cdc_disable_static_supplies_to_optimum( - struct sdm660_cdc_priv *sdm660_cdc, - struct sdm660_cdc_pdata *pdata) -{ - int i; - int ret = 0; - - for (i = 0; i < sdm660_cdc->num_of_supplies; i++) { - if (pdata->regulator[i].ondemand) - continue; - if (regulator_count_voltages( - sdm660_cdc->supplies[i].consumer) <= 0) - continue; - regulator_set_voltage(sdm660_cdc->supplies[i].consumer, 0, - pdata->regulator[i].max_uv); - regulator_set_load(sdm660_cdc->supplies[i].consumer, 0); - ret = regulator_disable(sdm660_cdc->supplies[i].consumer); - if (ret) - dev_err(sdm660_cdc->dev, "Failed to disable %s: %d\n", - sdm660_cdc->supplies[i].supply, ret); - - dev_dbg(sdm660_cdc->dev, "Regulator %s disable\n", - sdm660_cdc->supplies[i].supply); - } - - return ret; -} - -static int msm_anlg_cdc_suspend(struct snd_soc_codec *codec) -{ - struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec); - struct sdm660_cdc_pdata *sdm660_cdc_pdata = - sdm660_cdc->dev->platform_data; - - msm_anlg_cdc_disable_static_supplies_to_optimum(sdm660_cdc, - sdm660_cdc_pdata); - return 0; -} - -static int msm_anlg_cdc_resume(struct snd_soc_codec *codec) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec); - struct sdm660_cdc_pdata *sdm660_cdc_pdata = - sdm660_cdc->dev->platform_data; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - msm_anlg_cdc_enable_static_supplies_to_optimum(sdm660_cdc, - sdm660_cdc_pdata); - return 0; -} - -static struct regmap *msm_anlg_get_regmap(struct device *dev) -{ - return dev_get_regmap(dev->parent, NULL); -} - -static struct snd_soc_codec_driver soc_codec_dev_sdm660_cdc = { - .probe = msm_anlg_cdc_soc_probe, - .remove = msm_anlg_cdc_soc_remove, - .suspend = msm_anlg_cdc_suspend, - .resume = msm_anlg_cdc_resume, - .reg_word_size = 1, - .get_regmap = msm_anlg_get_regmap, - .component_driver = { - .controls = msm_anlg_cdc_snd_controls, - .num_controls = ARRAY_SIZE(msm_anlg_cdc_snd_controls), - .dapm_widgets = msm_anlg_cdc_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(msm_anlg_cdc_dapm_widgets), - .dapm_routes = audio_map, - .num_dapm_routes = ARRAY_SIZE(audio_map), - }, -}; - -static int msm_anlg_cdc_init_supplies(struct sdm660_cdc_priv *sdm660_cdc, - struct sdm660_cdc_pdata *pdata) -{ - int ret; - int i; - - sdm660_cdc->supplies = devm_kzalloc(sdm660_cdc->dev, - sizeof(struct regulator_bulk_data) * - ARRAY_SIZE(pdata->regulator), - GFP_KERNEL); - if (!sdm660_cdc->supplies) { - ret = -ENOMEM; - goto err; - } - - sdm660_cdc->num_of_supplies = 0; - if (ARRAY_SIZE(pdata->regulator) > MAX_REGULATOR) { - dev_err(sdm660_cdc->dev, "%s: Array Size out of bound\n", - __func__); - ret = -EINVAL; - goto err; - } - - for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++) { - if (pdata->regulator[i].name) { - sdm660_cdc->supplies[i].supply = - pdata->regulator[i].name; - sdm660_cdc->num_of_supplies++; - } - } - - ret = devm_regulator_bulk_get(sdm660_cdc->dev, - sdm660_cdc->num_of_supplies, - sdm660_cdc->supplies); - if (ret != 0) { - dev_err(sdm660_cdc->dev, - "Failed to get supplies: err = %d\n", - ret); - goto err_supplies; - } - - for (i = 0; i < sdm660_cdc->num_of_supplies; i++) { - if (regulator_count_voltages( - sdm660_cdc->supplies[i].consumer) <= 0) - continue; - if (pdata->regulator[i].ondemand) { - ret = regulator_set_voltage( - sdm660_cdc->supplies[i].consumer, - 0, pdata->regulator[i].max_uv); - if (ret) { - dev_err(sdm660_cdc->dev, - "Setting regulator voltage failed for regulator %s err = %d\n", - sdm660_cdc->supplies[i].supply, ret); - goto err_supplies; - } - ret = regulator_set_load( - sdm660_cdc->supplies[i].consumer, 0); - if (ret < 0) { - dev_err(sdm660_cdc->dev, - "Setting regulator optimum mode failed for regulator %s err = %d\n", - sdm660_cdc->supplies[i].supply, ret); - goto err_supplies; - } else { - ret = 0; - continue; - } - } - ret = regulator_set_voltage(sdm660_cdc->supplies[i].consumer, - pdata->regulator[i].min_uv, - pdata->regulator[i].max_uv); - if (ret) { - dev_err(sdm660_cdc->dev, - "Setting regulator voltage failed for regulator %s err = %d\n", - sdm660_cdc->supplies[i].supply, ret); - goto err_supplies; - } - ret = regulator_set_load(sdm660_cdc->supplies[i].consumer, - pdata->regulator[i].optimum_ua); - if (ret < 0) { - dev_err(sdm660_cdc->dev, - "Setting regulator optimum mode failed for regulator %s err = %d\n", - sdm660_cdc->supplies[i].supply, ret); - goto err_supplies; - } else { - ret = 0; - } - } - - return ret; - -err_supplies: - devm_kfree(sdm660_cdc->dev, sdm660_cdc->supplies); -err: - return ret; -} - -static int msm_anlg_cdc_enable_static_supplies( - struct sdm660_cdc_priv *sdm660_cdc, - struct sdm660_cdc_pdata *pdata) -{ - int i; - int ret = 0; - - for (i = 0; i < sdm660_cdc->num_of_supplies; i++) { - if (pdata->regulator[i].ondemand) - continue; - ret = regulator_enable(sdm660_cdc->supplies[i].consumer); - if (ret) { - dev_err(sdm660_cdc->dev, "Failed to enable %s\n", - sdm660_cdc->supplies[i].supply); - break; - } - dev_dbg(sdm660_cdc->dev, "Enabled regulator %s\n", - sdm660_cdc->supplies[i].supply); - } - - while (ret && i--) - if (!pdata->regulator[i].ondemand) - regulator_disable(sdm660_cdc->supplies[i].consumer); - return ret; -} - -static void msm_anlg_cdc_disable_supplies(struct sdm660_cdc_priv *sdm660_cdc, - struct sdm660_cdc_pdata *pdata) -{ - int i; - - regulator_bulk_disable(sdm660_cdc->num_of_supplies, - sdm660_cdc->supplies); - for (i = 0; i < sdm660_cdc->num_of_supplies; i++) { - if (regulator_count_voltages( - sdm660_cdc->supplies[i].consumer) <= 0) - continue; - regulator_set_voltage(sdm660_cdc->supplies[i].consumer, 0, - pdata->regulator[i].max_uv); - regulator_set_load(sdm660_cdc->supplies[i].consumer, 0); - } -} - -static const struct of_device_id sdm660_codec_of_match[] = { - { .compatible = "qcom,pmic-analog-codec", }, - {}, -}; - -static void msm_anlg_add_child_devices(struct work_struct *work) -{ - struct sdm660_cdc_priv *pdata; - struct platform_device *pdev; - struct device_node *node; - struct msm_dig_ctrl_data *dig_ctrl_data = NULL, *temp; - int ret, ctrl_num = 0; - struct msm_dig_ctrl_platform_data *platdata; - char plat_dev_name[MSM_DIG_CDC_STRING_LEN]; - - pdata = container_of(work, struct sdm660_cdc_priv, - msm_anlg_add_child_devices_work); - if (!pdata) { - pr_err("%s: Memory for pdata does not exist\n", - __func__); - return; - } - if (!pdata->dev->of_node) { - dev_err(pdata->dev, - "%s: DT node for pdata does not exist\n", __func__); - return; - } - - platdata = &pdata->dig_plat_data; - - for_each_child_of_node(pdata->dev->of_node, node) { - if (!strcmp(node->name, "msm-dig-codec")) - strlcpy(plat_dev_name, "msm_digital_codec", - (MSM_DIG_CDC_STRING_LEN - 1)); - else - continue; - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(pdata->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = pdata->dev; - pdev->dev.of_node = node; - - if (!strcmp(node->name, "msm-dig-codec")) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (!strcmp(node->name, "msm-dig-codec")) { - temp = krealloc(dig_ctrl_data, - (ctrl_num + 1) * sizeof( - struct msm_dig_ctrl_data), - GFP_KERNEL); - if (!temp) { - dev_err(&pdev->dev, "out of memory\n"); - ret = -ENOMEM; - goto err; - } - dig_ctrl_data = temp; - dig_ctrl_data[ctrl_num].dig_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added digital codec device(s)\n", - __func__); - pdata->dig_ctrl_data = dig_ctrl_data; - } - pdata->pdev_child_devices[pdata->child_count++] = pdev; - } - - return; -fail_pdev_add: - platform_device_put(pdev); -err: - return; -} - -static int msm_anlg_cdc_probe(struct platform_device *pdev) -{ - int ret = 0; - struct sdm660_cdc_priv *sdm660_cdc = NULL; - struct sdm660_cdc_pdata *pdata; - int adsp_state; - - adsp_state = apr_get_subsys_state(); - if (adsp_state != APR_SUBSYS_LOADED) { - dev_err(&pdev->dev, "Adsp is not loaded yet %d\n", - adsp_state); - return -EPROBE_DEFER; - } - device_init_wakeup(&pdev->dev, true); - - if (pdev->dev.of_node) { - dev_dbg(&pdev->dev, "%s:Platform data from device tree\n", - __func__); - pdata = msm_anlg_cdc_populate_dt_pdata(&pdev->dev); - pdev->dev.platform_data = pdata; - } else { - dev_dbg(&pdev->dev, "%s:Platform data from board file\n", - __func__); - pdata = pdev->dev.platform_data; - } - if (pdata == NULL) { - dev_err(&pdev->dev, "%s:Platform data failed to populate\n", - __func__); - goto rtn; - } - sdm660_cdc = devm_kzalloc(&pdev->dev, sizeof(struct sdm660_cdc_priv), - GFP_KERNEL); - if (sdm660_cdc == NULL) { - ret = -ENOMEM; - goto rtn; - } - - sdm660_cdc->dev = &pdev->dev; - ret = msm_anlg_cdc_init_supplies(sdm660_cdc, pdata); - if (ret) { - dev_err(&pdev->dev, "%s: Fail to enable Codec supplies\n", - __func__); - goto rtn; - } - ret = msm_anlg_cdc_enable_static_supplies(sdm660_cdc, pdata); - if (ret) { - dev_err(&pdev->dev, - "%s: Fail to enable Codec pre-reset supplies\n", - __func__); - goto rtn; - } - /* Allow supplies to be ready */ - usleep_range(5, 6); - - wcd9xxx_spmi_set_dev(pdev, 0); - wcd9xxx_spmi_set_dev(pdev, 1); - if (wcd9xxx_spmi_irq_init()) { - dev_err(&pdev->dev, - "%s: irq initialization failed\n", __func__); - } else { - dev_dbg(&pdev->dev, - "%s: irq initialization passed\n", __func__); - } - dev_set_drvdata(&pdev->dev, sdm660_cdc); - - ret = snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_sdm660_cdc, - msm_anlg_cdc_i2s_dai, - ARRAY_SIZE(msm_anlg_cdc_i2s_dai)); - if (ret) { - dev_err(&pdev->dev, - "%s:snd_soc_register_codec failed with error %d\n", - __func__, ret); - goto err_supplies; - } - BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->notifier); - BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->notifier_mbhc); - - sdm660_cdc->dig_plat_data.handle = (void *) sdm660_cdc; - sdm660_cdc->dig_plat_data.set_compander_mode = set_compander_mode; - sdm660_cdc->dig_plat_data.update_clkdiv = update_clkdiv; - sdm660_cdc->dig_plat_data.get_cdc_version = get_cdc_version; - sdm660_cdc->dig_plat_data.register_notifier = - msm_anlg_cdc_dig_register_notifier; - INIT_WORK(&sdm660_cdc->msm_anlg_add_child_devices_work, - msm_anlg_add_child_devices); - schedule_work(&sdm660_cdc->msm_anlg_add_child_devices_work); - - return ret; -err_supplies: - msm_anlg_cdc_disable_supplies(sdm660_cdc, pdata); -rtn: - return ret; -} - -static int msm_anlg_cdc_remove(struct platform_device *pdev) -{ - struct sdm660_cdc_priv *sdm660_cdc = dev_get_drvdata(&pdev->dev); - struct sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data; - int count; - - for (count = 0; count < sdm660_cdc->child_count && - count < ANLG_CDC_CHILD_DEVICES_MAX; count++) - platform_device_unregister( - sdm660_cdc->pdev_child_devices[count]); - snd_soc_unregister_codec(&pdev->dev); - msm_anlg_cdc_disable_supplies(sdm660_cdc, pdata); - wcd9xxx_spmi_irq_exit(); - devm_kfree(&pdev->dev, sdm660_cdc); - return 0; -} - -static struct platform_driver msm_anlg_codec_driver = { - .driver = { - .owner = THIS_MODULE, - .name = DRV_NAME, - .of_match_table = of_match_ptr(sdm660_codec_of_match) - }, - .probe = msm_anlg_cdc_probe, - .remove = msm_anlg_cdc_remove, -}; -module_platform_driver(msm_anlg_codec_driver); - -MODULE_DESCRIPTION("MSM Audio Analog codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.h b/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.h deleted file mode 100644 index 71d555f38846..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/msm-analog-cdc.h +++ /dev/null @@ -1,273 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MSM_ANALOG_CDC_H -#define MSM_ANALOG_CDC_H - -#include -#include -#include -#include "../wcd-mbhc-v2.h" -#include "../wcdcal-hwdep.h" -#include "sdm660-cdc-registers.h" - -#define MICBIAS_EXT_BYP_CAP 0x00 -#define MICBIAS_NO_EXT_BYP_CAP 0x01 -#define ANLG_CDC_CHILD_DEVICES_MAX 1 - -#define MSM89XX_NUM_IRQ_REGS 2 -#define MAX_REGULATOR 7 -#define MSM89XX_REG_VAL(reg, val) {reg, 0, val} - -#define MSM89XX_VDD_SPKDRV_NAME "cdc-vdd-spkdrv" - -#define DEFAULT_MULTIPLIER 800 -#define DEFAULT_GAIN 9 -#define DEFAULT_OFFSET 100 - -extern const u8 msm89xx_pmic_cdc_reg_readable[MSM89XX_PMIC_CDC_CACHE_SIZE]; -extern const u8 msm89xx_cdc_core_reg_readable[MSM89XX_CDC_CORE_CACHE_SIZE]; -extern struct regmap_config msm89xx_cdc_core_regmap_config; -extern struct regmap_config msm89xx_pmic_cdc_regmap_config; - -enum wcd_curr_ref { - I_h4_UA = 0, - I_pt5_UA, - I_14_UA, - I_l4_UA, - I_1_UA, -}; - -enum wcd_mbhc_imp_det_pin { - WCD_MBHC_DET_NONE = 0, - WCD_MBHC_DET_HPHL, - WCD_MBHC_DET_HPHR, - WCD_MBHC_DET_BOTH, -}; - - -/* Each micbias can be assigned to one of three cfilters - * Vbatt_min >= .15V + ldoh_v - * ldoh_v >= .15v + cfiltx_mv - * If ldoh_v = 1.95 160 mv < cfiltx_mv < 1800 mv - * If ldoh_v = 2.35 200 mv < cfiltx_mv < 2200 mv - * If ldoh_v = 2.75 240 mv < cfiltx_mv < 2600 mv - * If ldoh_v = 2.85 250 mv < cfiltx_mv < 2700 mv - */ - -struct wcd_micbias_setting { - u8 ldoh_v; - u32 cfilt1_mv; /* in mv */ - u32 cfilt2_mv; /* in mv */ - u32 cfilt3_mv; /* in mv */ - /* Different WCD9xxx series codecs may not - * have 4 mic biases. If a codec has fewer - * mic biases, some of these properties will - * not be used. - */ - u8 bias1_cfilt_sel; - u8 bias2_cfilt_sel; - u8 bias3_cfilt_sel; - u8 bias4_cfilt_sel; - u8 bias1_cap_mode; - u8 bias2_cap_mode; - u8 bias3_cap_mode; - u8 bias4_cap_mode; - bool bias2_is_headset_only; -}; - -enum sdm660_cdc_pid_current { - MSM89XX_PID_MIC_2P5_UA, - MSM89XX_PID_MIC_5_UA, - MSM89XX_PID_MIC_10_UA, - MSM89XX_PID_MIC_20_UA, -}; - -struct sdm660_cdc_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -enum { - /* INTR_REG 0 - Digital Periph */ - MSM89XX_IRQ_SPKR_CNP = 0, - MSM89XX_IRQ_SPKR_CLIP, - MSM89XX_IRQ_SPKR_OCP, - MSM89XX_IRQ_MBHC_INSREM_DET1, - MSM89XX_IRQ_MBHC_RELEASE, - MSM89XX_IRQ_MBHC_PRESS, - MSM89XX_IRQ_MBHC_INSREM_DET, - MSM89XX_IRQ_MBHC_HS_DET, - /* INTR_REG 1 - Analog Periph */ - MSM89XX_IRQ_EAR_OCP, - MSM89XX_IRQ_HPHR_OCP, - MSM89XX_IRQ_HPHL_OCP, - MSM89XX_IRQ_EAR_CNP, - MSM89XX_IRQ_HPHR_CNP, - MSM89XX_IRQ_HPHL_CNP, - MSM89XX_NUM_IRQS, -}; - -enum { - ON_DEMAND_MICBIAS = 0, - ON_DEMAND_SPKDRV, - ON_DEMAND_SUPPLIES_MAX, -}; - -/* - * The delay list is per codec HW specification. - * Please add delay in the list in the future instead - * of magic number - */ -enum { - CODEC_DELAY_1_MS = 1000, - CODEC_DELAY_1_1_MS = 1100, -}; - -struct sdm660_cdc_regulator { - const char *name; - int min_uv; - int max_uv; - int optimum_ua; - bool ondemand; - struct regulator *regulator; -}; - -struct on_demand_supply { - struct regulator *supply; - atomic_t ref; - int min_uv; - int max_uv; - int optimum_ua; -}; - -struct wcd_imped_i_ref { - enum wcd_curr_ref curr_ref; - int min_val; - int multiplier; - int gain_adj; - int offset; -}; - -enum sdm660_cdc_micbias_num { - MSM89XX_MICBIAS1 = 0, -}; - -/* Hold instance to digital codec platform device */ -struct msm_dig_ctrl_data { - struct platform_device *dig_pdev; -}; - -struct msm_dig_ctrl_platform_data { - void *handle; - void (*set_compander_mode)(void *handle, int val); - void (*update_clkdiv)(void *handle, int val); - int (*get_cdc_version)(void *handle); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -struct sdm660_cdc_priv { - struct device *dev; - u32 num_of_supplies; - struct regulator_bulk_data *supplies; - struct snd_soc_codec *codec; - struct work_struct msm_anlg_add_child_devices_work; - struct msm_dig_ctrl_platform_data dig_plat_data; - /* digital codec data structure */ - struct msm_dig_ctrl_data *dig_ctrl_data; - struct blocking_notifier_head notifier; - u16 pmic_rev; - u16 codec_version; - u16 analog_major_rev; - u32 boost_voltage; - u32 adc_count; - u32 rx_bias_count; - bool int_mclk0_enabled; - u16 boost_option; - /* mode to select hd2 */ - u32 hph_mode; - /* compander used for each rx chain */ - bool spk_boost_set; - bool ear_pa_boost_set; - bool ext_spk_boost_set; - struct on_demand_supply on_demand_list[ON_DEMAND_SUPPLIES_MAX]; - struct regulator *spkdrv_reg; - struct blocking_notifier_head notifier_mbhc; - /* mbhc module */ - struct wcd_mbhc mbhc; - /* cal info for codec */ - struct fw_info *fw_data; - struct notifier_block audio_ssr_nb; - int (*codec_spk_ext_pa_cb)(struct snd_soc_codec *codec, int enable); - unsigned long status_mask; - struct wcd_imped_i_ref imped_i_ref; - enum wcd_mbhc_imp_det_pin imped_det_pin; - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - struct platform_device *pdev_child_devices - [ANLG_CDC_CHILD_DEVICES_MAX]; - int child_count; -}; - -struct sdm660_cdc_pdata { - struct wcd_micbias_setting micbias; - struct sdm660_cdc_regulator regulator[MAX_REGULATOR]; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_ANALOG_CDC) -extern int msm_anlg_cdc_mclk_enable(struct snd_soc_codec *codec, - int mclk_enable, bool dapm); -extern int msm_anlg_cdc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg); -extern void msm_anlg_cdc_hs_detect_exit(struct snd_soc_codec *codec); -extern void sdm660_cdc_update_int_spk_boost(bool enable); -extern void msm_anlg_cdc_spk_ext_pa_cb( - int (*codec_spk_ext_pa)(struct snd_soc_codec *codec, - int enable), struct snd_soc_codec *codec); -int msm_anlg_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -#else /* CONFIG_SND_SOC_ANALOG_CDC */ -static inline int msm_anlg_cdc_mclk_enable(struct snd_soc_codec *codec, - int mclk_enable, bool dapm) -{ - return 0; -} -static inline int msm_anlg_cdc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline void msm_anlg_cdc_hs_detect_exit(struct snd_soc_codec *codec) -{ - -} -static inline void sdm660_cdc_update_int_spk_boost(bool enable) -{ - -} -static inline void msm_anlg_cdc_spk_ext_pa_cb( - int (*codec_spk_ext_pa)(struct snd_soc_codec *codec, - int enable), struct snd_soc_codec *codec) -{ - -} -static inline int msm_anlg_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_ANALOG_CDC */ -#endif diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/msm-cdc-common.h b/techpack/audio/asoc/codecs/sdm660_cdc/msm-cdc-common.h deleted file mode 100644 index 1a490a492b45..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/msm-cdc-common.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "sdm660-cdc-registers.h" - -extern struct reg_default - msm89xx_cdc_core_defaults[MSM89XX_CDC_CORE_CACHE_SIZE]; -extern struct reg_default - msm89xx_pmic_cdc_defaults[MSM89XX_PMIC_CDC_CACHE_SIZE]; - -bool msm89xx_cdc_core_readable_reg(struct device *dev, unsigned int reg); -bool msm89xx_cdc_core_writeable_reg(struct device *dev, unsigned int reg); -bool msm89xx_cdc_core_volatile_reg(struct device *dev, unsigned int reg); - -enum { - AIF1_PB = 0, - AIF1_CAP, - AIF2_VIFEED, - AIF3_SVA, - NUM_CODEC_DAIS, -}; - -enum codec_versions { - TOMBAK_1_0, - TOMBAK_2_0, - CONGA, - CAJON, - CAJON_2_0, - DIANGU, - DRAX_CDC, - UNSUPPORTED, -}; - -/* Support different hph modes */ -enum { - NORMAL_MODE = 0, - HD2_MODE, -}; - -enum dig_cdc_notify_event { - DIG_CDC_EVENT_INVALID, - DIG_CDC_EVENT_CLK_ON, - DIG_CDC_EVENT_CLK_OFF, - DIG_CDC_EVENT_RX1_MUTE_ON, - DIG_CDC_EVENT_RX1_MUTE_OFF, - DIG_CDC_EVENT_RX2_MUTE_ON, - DIG_CDC_EVENT_RX2_MUTE_OFF, - DIG_CDC_EVENT_RX3_MUTE_ON, - DIG_CDC_EVENT_RX3_MUTE_OFF, - DIG_CDC_EVENT_PRE_RX1_INT_ON, - DIG_CDC_EVENT_PRE_RX2_INT_ON, - DIG_CDC_EVENT_POST_RX1_INT_OFF, - DIG_CDC_EVENT_POST_RX2_INT_OFF, - DIG_CDC_EVENT_SSR_DOWN, - DIG_CDC_EVENT_SSR_UP, - DIG_CDC_EVENT_LAST, -}; diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c b/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c deleted file mode 100644 index a62679174567..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c +++ /dev/null @@ -1,452 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "msm-cdc-common.h" -#include "sdm660-cdc-registers.h" - -/* - * Default register reset values that are common across different versions - * are defined here. If a register reset value is changed based on version - * then remove it from this structure and add it in version specific - * structures. - */ -struct reg_default - msm89xx_cdc_core_defaults[MSM89XX_CDC_CORE_CACHE_SIZE] = { - {MSM89XX_CDC_CORE_CLK_RX_RESET_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_DMIC_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_RX_I2S_CTL, 0x13}, - {MSM89XX_CDC_CORE_CLK_TX_I2S_CTL, 0x13}, - {MSM89XX_CDC_CORE_CLK_OTHR_RESET_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_OTHR_CTL, 0x04}, - {MSM89XX_CDC_CORE_CLK_RX_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_MCLK_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_PDM_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_SD_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_DMIC_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_RX_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CLK_TX2_I2S_CTL, 0x13}, - {MSM89XX_CDC_CORE_RX1_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX2_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX3_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX1_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX2_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX3_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX1_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX2_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX3_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX1_B4_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX2_B4_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX3_B4_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX1_B5_CTL, 0x68}, - {MSM89XX_CDC_CORE_RX2_B5_CTL, 0x68}, - {MSM89XX_CDC_CORE_RX3_B5_CTL, 0x68}, - {MSM89XX_CDC_CORE_RX1_B6_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX2_B6_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX3_B6_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX1_VOL_CTL_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX2_VOL_CTL_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX3_VOL_CTL_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX1_VOL_CTL_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX2_VOL_CTL_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_RX3_VOL_CTL_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_TOP_GAIN_UPDATE, 0x00}, - {MSM89XX_CDC_CORE_TOP_CTL, 0x01}, - {MSM89XX_CDC_CORE_COMP0_B1_CTL, 0x30}, - {MSM89XX_CDC_CORE_COMP0_B2_CTL, 0xB5}, - {MSM89XX_CDC_CORE_COMP0_B3_CTL, 0x28}, - {MSM89XX_CDC_CORE_COMP0_B4_CTL, 0x37}, - {MSM89XX_CDC_CORE_COMP0_B5_CTL, 0x7F}, - {MSM89XX_CDC_CORE_COMP0_B6_CTL, 0x00}, - {MSM89XX_CDC_CORE_COMP0_SHUT_DOWN_STATUS, 0x03}, - {MSM89XX_CDC_CORE_COMP0_FS_CFG, 0x03}, - {MSM89XX_CDC_CORE_COMP0_DELAY_BUF_CTL, 0x02}, - {MSM89XX_CDC_CORE_DEBUG_DESER1_CTL, 0x00}, - {MSM89XX_CDC_CORE_DEBUG_DESER2_CTL, 0x00}, - {MSM89XX_CDC_CORE_DEBUG_B1_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_DEBUG_B2_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_DEBUG_B3_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B4_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B4_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B5_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B5_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B6_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B6_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B7_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B7_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_GAIN_B8_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_B8_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_CTL, 0x40}, - {MSM89XX_CDC_CORE_IIR2_CTL, 0x40}, - {MSM89XX_CDC_CORE_IIR1_GAIN_TIMER_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_GAIN_TIMER_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_COEF_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_IIR2_COEF_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX1_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX1_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX1_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX2_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX2_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX2_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX3_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_RX3_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_TX_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_TX_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ1_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ1_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ1_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ1_B4_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ2_B1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ2_B2_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ2_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_EQ2_B4_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL, 0x00}, - {MSM89XX_CDC_CORE_CONN_TX_B3_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX5_VOL_CTL_TIMER, 0x00}, - {MSM89XX_CDC_CORE_TX5_VOL_CTL_GAIN, 0x00}, - {MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_TX5_MUX_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX5_CLK_FS_CTL, 0x03}, - {MSM89XX_CDC_CORE_TX5_DMIC_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX1_VOL_CTL_TIMER, 0x00}, - {MSM89XX_CDC_CORE_TX2_VOL_CTL_TIMER, 0x00}, - {MSM89XX_CDC_CORE_TX3_VOL_CTL_TIMER, 0x00}, - {MSM89XX_CDC_CORE_TX4_VOL_CTL_TIMER, 0x00}, - {MSM89XX_CDC_CORE_TX1_VOL_CTL_GAIN, 0x00}, - {MSM89XX_CDC_CORE_TX2_VOL_CTL_GAIN, 0x00}, - {MSM89XX_CDC_CORE_TX3_VOL_CTL_GAIN, 0x00}, - {MSM89XX_CDC_CORE_TX4_VOL_CTL_GAIN, 0x00}, - {MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_TX2_VOL_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_TX3_VOL_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_TX4_VOL_CTL_CFG, 0x00}, - {MSM89XX_CDC_CORE_TX1_MUX_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX2_MUX_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX3_MUX_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX4_MUX_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX1_CLK_FS_CTL, 0x03}, - {MSM89XX_CDC_CORE_TX2_CLK_FS_CTL, 0x03}, - {MSM89XX_CDC_CORE_TX3_CLK_FS_CTL, 0x03}, - {MSM89XX_CDC_CORE_TX4_CLK_FS_CTL, 0x03}, - {MSM89XX_CDC_CORE_TX1_DMIC_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX2_DMIC_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX3_DMIC_CTL, 0x00}, - {MSM89XX_CDC_CORE_TX4_DMIC_CTL, 0x00}, -}; - -static const u8 msm89xx_cdc_core_reg_readable[MSM89XX_CDC_CORE_CACHE_SIZE] = { - [MSM89XX_CDC_CORE_CLK_RX_RESET_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_DMIC_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_RX_I2S_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX_I2S_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_OTHR_RESET_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_OTHR_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_RX_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_MCLK_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_PDM_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_SD_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_DMIC_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_RX_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX2_I2S_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B3_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B3_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B3_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B4_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B4_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B4_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B5_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B5_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B5_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B6_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B6_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B6_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_VOL_CTL_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_VOL_CTL_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_VOL_CTL_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_VOL_CTL_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_VOL_CTL_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_VOL_CTL_B2_CTL] = 1, - [MSM89XX_CDC_CORE_TOP_GAIN_UPDATE] = 1, - [MSM89XX_CDC_CORE_TOP_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B1_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B2_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B3_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B4_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B5_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B6_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_SHUT_DOWN_STATUS] = 1, - [MSM89XX_CDC_CORE_COMP0_FS_CFG] = 1, - [MSM89XX_CDC_CORE_COMP0_DELAY_BUF_CTL] = 1, - [MSM89XX_CDC_CORE_DEBUG_DESER1_CTL] = 1, - [MSM89XX_CDC_CORE_DEBUG_DESER2_CTL] = 1, - [MSM89XX_CDC_CORE_DEBUG_B1_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_DEBUG_B2_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_DEBUG_B3_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B3_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B3_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B4_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B4_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B5_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B5_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B6_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B6_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B7_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B7_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B8_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B8_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_TIMER_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_TIMER_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_COEF_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_COEF_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX1_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX1_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX1_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX2_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX2_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX2_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX3_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX3_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B4_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B4_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_B3_CTL] = 1, - [MSM89XX_CDC_CORE_TX1_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX2_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX3_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX4_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX1_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX2_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX3_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX4_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX2_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX3_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX4_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX1_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX2_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX3_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX4_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX1_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX2_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX3_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX4_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX5_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX5_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX5_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX5_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX5_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX1_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX2_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX3_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX4_DMIC_CTL] = 1, -}; - -static const u8 msm89xx_cdc_core_reg_writeable[MSM89XX_CDC_CORE_CACHE_SIZE] = { - [MSM89XX_CDC_CORE_CLK_RX_RESET_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_DMIC_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_RX_I2S_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX_I2S_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_OTHR_RESET_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_OTHR_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_RX_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_MCLK_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_PDM_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_SD_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_DMIC_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_RX_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CLK_TX2_I2S_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B3_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B3_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B3_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B4_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B4_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B4_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B5_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B5_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B5_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_B6_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_B6_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_B6_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_VOL_CTL_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_VOL_CTL_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_VOL_CTL_B1_CTL] = 1, - [MSM89XX_CDC_CORE_RX1_VOL_CTL_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX2_VOL_CTL_B2_CTL] = 1, - [MSM89XX_CDC_CORE_RX3_VOL_CTL_B2_CTL] = 1, - [MSM89XX_CDC_CORE_TOP_GAIN_UPDATE] = 1, - [MSM89XX_CDC_CORE_TOP_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B1_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B2_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B3_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B4_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B5_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_B6_CTL] = 1, - [MSM89XX_CDC_CORE_COMP0_FS_CFG] = 1, - [MSM89XX_CDC_CORE_COMP0_DELAY_BUF_CTL] = 1, - [MSM89XX_CDC_CORE_DEBUG_DESER1_CTL] = 1, - [MSM89XX_CDC_CORE_DEBUG_DESER2_CTL] = 1, - [MSM89XX_CDC_CORE_DEBUG_B1_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_DEBUG_B2_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_DEBUG_B3_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B3_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B3_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B4_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B4_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B5_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B5_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B6_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B6_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B7_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B7_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_B8_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_B8_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_GAIN_TIMER_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_GAIN_TIMER_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_COEF_B1_CTL] = 1, - [MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL] = 1, - [MSM89XX_CDC_CORE_IIR2_COEF_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX1_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX1_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX1_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX2_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX2_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX2_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX3_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_RX3_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ1_B4_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B2_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B3_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_EQ2_B4_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL] = 1, - [MSM89XX_CDC_CORE_CONN_TX_B3_CTL] = 1, - [MSM89XX_CDC_CORE_TX1_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX2_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX3_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX4_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX1_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX2_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX3_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX4_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX2_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX3_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX4_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX1_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX2_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX3_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX4_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX1_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX2_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX3_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX4_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX5_VOL_CTL_TIMER] = 1, - [MSM89XX_CDC_CORE_TX5_VOL_CTL_GAIN] = 1, - [MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG] = 1, - [MSM89XX_CDC_CORE_TX5_MUX_CTL] = 1, - [MSM89XX_CDC_CORE_TX5_CLK_FS_CTL] = 1, - [MSM89XX_CDC_CORE_TX5_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX1_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX2_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX3_DMIC_CTL] = 1, - [MSM89XX_CDC_CORE_TX4_DMIC_CTL] = 1, -}; - -bool msm89xx_cdc_core_readable_reg(struct device *dev, unsigned int reg) -{ - return msm89xx_cdc_core_reg_readable[reg]; -} - -bool msm89xx_cdc_core_writeable_reg(struct device *dev, unsigned int reg) -{ - return msm89xx_cdc_core_reg_writeable[reg]; -} - -bool msm89xx_cdc_core_volatile_reg(struct device *dev, unsigned int reg) -{ - switch (reg) { - case MSM89XX_CDC_CORE_RX1_B1_CTL: - case MSM89XX_CDC_CORE_RX2_B1_CTL: - case MSM89XX_CDC_CORE_RX3_B1_CTL: - case MSM89XX_CDC_CORE_RX1_B6_CTL: - case MSM89XX_CDC_CORE_RX2_B6_CTL: - case MSM89XX_CDC_CORE_RX3_B6_CTL: - case MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG: - case MSM89XX_CDC_CORE_TX2_VOL_CTL_CFG: - case MSM89XX_CDC_CORE_TX3_VOL_CTL_CFG: - case MSM89XX_CDC_CORE_TX4_VOL_CTL_CFG: - case MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG: - case MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL: - case MSM89XX_CDC_CORE_IIR2_COEF_B1_CTL: - case MSM89XX_CDC_CORE_CLK_MCLK_CTL: - case MSM89XX_CDC_CORE_CLK_PDM_CTL: - return true; - default: - return false; - } -} diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.c b/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.c deleted file mode 100644 index 61b2ad4dbd8a..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.c +++ /dev/null @@ -1,2224 +0,0 @@ -/* 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "sdm660-cdc-registers.h" -#include "msm-digital-cdc.h" -#include "msm-cdc-common.h" -#include "../../sdm660-common.h" - -#define DRV_NAME "msm_digital_codec" -#define MCLK_RATE_9P6MHZ 9600000 -#define MCLK_RATE_12P288MHZ 12288000 -#define TX_MUX_CTL_CUT_OFF_FREQ_MASK 0x30 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define DEC_SVA 5 -#define MSM_DIG_CDC_VERSION_ENTRY_SIZE 32 - -static unsigned long rx_digital_gain_reg[] = { - MSM89XX_CDC_CORE_RX1_VOL_CTL_B2_CTL, - MSM89XX_CDC_CORE_RX2_VOL_CTL_B2_CTL, - MSM89XX_CDC_CORE_RX3_VOL_CTL_B2_CTL, -}; - -static unsigned long tx_digital_gain_reg[] = { - MSM89XX_CDC_CORE_TX1_VOL_CTL_GAIN, - MSM89XX_CDC_CORE_TX2_VOL_CTL_GAIN, - MSM89XX_CDC_CORE_TX3_VOL_CTL_GAIN, - MSM89XX_CDC_CORE_TX4_VOL_CTL_GAIN, - MSM89XX_CDC_CORE_TX5_VOL_CTL_GAIN, -}; - -#define SDM660_TX_UNMUTE_DELAY_MS 40 -static int tx_unmute_delay = SDM660_TX_UNMUTE_DELAY_MS; -module_param(tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path"); - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); - -struct snd_soc_codec *registered_digcodec; -struct hpf_work tx_hpf_work[NUM_DECIMATORS]; - -/* Codec supports 2 IIR filters */ -enum { - IIR1 = 0, - IIR2, - IIR_MAX, -}; - -static int msm_digcdc_clock_control(bool flag) -{ - int ret = -EINVAL; - struct msm_asoc_mach_data *pdata = NULL; - struct msm_dig_priv *msm_dig_cdc = - snd_soc_codec_get_drvdata(registered_digcodec); - - pdata = snd_soc_card_get_drvdata(registered_digcodec->component.card); - - if (flag) { - mutex_lock(&pdata->cdc_int_mclk0_mutex); - if (atomic_read(&pdata->int_mclk0_enabled) == false) { - if (pdata->native_clk_set) - pdata->digital_cdc_core_clk.clk_freq_in_hz = - NATIVE_MCLK_RATE; - else - pdata->digital_cdc_core_clk.clk_freq_in_hz = - DEFAULT_MCLK_RATE; - pdata->digital_cdc_core_clk.enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - if (ret < 0) { - pr_err("%s:failed to enable the MCLK\n", - __func__); - /* - * Avoid access to lpass register - * as clock enable failed during SSR. - */ - if (ret == -ENODEV) - msm_dig_cdc->regmap->cache_only = true; - return ret; - } - pr_debug("enabled digital codec core clk\n"); - atomic_set(&pdata->int_mclk0_enabled, true); - schedule_delayed_work(&pdata->disable_int_mclk0_work, - 50); - } - } else { - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - dev_dbg(registered_digcodec->dev, - "disable MCLK, workq to disable set already\n"); - } - return 0; -} - -static void enable_digital_callback(void *flag) -{ - msm_digcdc_clock_control(true); -} - -static void disable_digital_callback(void *flag) -{ - msm_digcdc_clock_control(false); - pr_debug("disable mclk happens in workq\n"); -} - -static int msm_dig_cdc_put_dec_enum(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int dec_mux, decimator; - char *dec_name = NULL; - char *widget_name = NULL; - char *temp; - u16 tx_mux_ctl_reg; - u8 adc_dmic_sel = 0x0; - int ret = 0; - char *dec_num; - - if (ucontrol->value.enumerated.item[0] > e->items) { - dev_err(codec->dev, "%s: Invalid enum value: %d\n", - __func__, ucontrol->value.enumerated.item[0]); - return -EINVAL; - } - dec_mux = ucontrol->value.enumerated.item[0]; - - widget_name = kstrndup(w->name, 15, GFP_KERNEL); - if (!widget_name) { - dev_err(codec->dev, "%s: failed to copy string\n", - __func__); - return -ENOMEM; - } - temp = widget_name; - - dec_name = strsep(&widget_name, " "); - widget_name = temp; - if (!dec_name) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, w->name); - ret = -EINVAL; - goto out; - } - - dec_num = strpbrk(dec_name, "12345"); - if (dec_num == NULL) { - dev_err(codec->dev, "%s: Invalid DEC selected\n", __func__); - ret = -EINVAL; - goto out; - } - - ret = kstrtouint(dec_num, 10, &decimator); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, dec_name); - ret = -EINVAL; - goto out; - } - - dev_dbg(w->dapm->dev, "%s(): widget = %s decimator = %u dec_mux = %u\n" - , __func__, w->name, decimator, dec_mux); - - switch (decimator) { - case 1: - case 2: - case 3: - case 4: - case 5: - if ((dec_mux == 4) || (dec_mux == 5) || - (dec_mux == 6) || (dec_mux == 7)) - adc_dmic_sel = 0x1; - else - adc_dmic_sel = 0x0; - break; - default: - dev_err(codec->dev, "%s: Invalid Decimator = %u\n", - __func__, decimator); - ret = -EINVAL; - goto out; - } - - tx_mux_ctl_reg = - MSM89XX_CDC_CORE_TX1_MUX_CTL + 32 * (decimator - 1); - - if (decimator == DEC_SVA) - tx_mux_ctl_reg = MSM89XX_CDC_CORE_TX5_MUX_CTL; - - snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x1, adc_dmic_sel); - - ret = snd_soc_dapm_put_enum_double(kcontrol, ucontrol); - -out: - kfree(widget_name); - return ret; -} - - -static int msm_dig_cdc_codec_config_compander(struct snd_soc_codec *codec, - int interp_n, int event) -{ - struct msm_dig_priv *dig_cdc = snd_soc_codec_get_drvdata(codec); - int comp_ch_bits_set = 0x03; - int comp_ch_value; - - dev_dbg(codec->dev, "%s: event %d shift %d, enabled %d\n", - __func__, event, interp_n, - dig_cdc->comp_enabled[interp_n]); - - /* compander is invalid */ - if (dig_cdc->comp_enabled[interp_n] != COMPANDER_1 && - dig_cdc->comp_enabled[interp_n]) { - dev_dbg(codec->dev, "%s: Invalid compander %d\n", __func__, - dig_cdc->comp_enabled[interp_n]); - return 0; - } - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* compander is not enabled */ - if (!dig_cdc->comp_enabled[interp_n]) { - dig_cdc->set_compander_mode(dig_cdc->handle, 0x00); - return 0; - }; - comp_ch_value = snd_soc_read(codec, - MSM89XX_CDC_CORE_COMP0_B1_CTL); - if (interp_n == 0) { - if (comp_ch_value & 0x02) { - dev_dbg(codec->dev, - "%s comp ch 1 already enabled\n", - __func__); - return 0; - } - } - if (interp_n == 1) { - if (comp_ch_value & 0x01) { - dev_dbg(codec->dev, - "%s comp ch 0 already enabled\n", - __func__); - return 0; - } - } - dig_cdc->set_compander_mode(dig_cdc->handle, 0x08); - /* Enable Compander Clock */ - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B2_CTL, 0x0F, 0x09); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_RX_B2_CTL, 0x01, 0x01); - if (dig_cdc->comp_enabled[MSM89XX_RX1]) { - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B1_CTL, - 0x02, 0x02); - } - if (dig_cdc->comp_enabled[MSM89XX_RX2]) { - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B1_CTL, - 0x01, 0x01); - } - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B3_CTL, 0xFF, 0x01); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B2_CTL, 0xF0, 0x50); - /* add sleep for compander to settle */ - usleep_range(1000, 1100); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B3_CTL, 0xFF, 0x28); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B2_CTL, 0xF0, 0xB0); - - /* Enable Compander GPIO */ - if (dig_cdc->codec_hph_comp_gpio) - dig_cdc->codec_hph_comp_gpio(1, codec); - } else if (SND_SOC_DAPM_EVENT_OFF(event)) { - /* Disable Compander GPIO */ - if (dig_cdc->codec_hph_comp_gpio) - dig_cdc->codec_hph_comp_gpio(0, codec); - - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B1_CTL, - 1 << interp_n, 0); - comp_ch_bits_set = snd_soc_read(codec, - MSM89XX_CDC_CORE_COMP0_B1_CTL); - if ((comp_ch_bits_set & 0x03) == 0x00) { - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_COMP0_B2_CTL, 0x0F, 0x05); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_RX_B2_CTL, 0x01, 0x00); - } - } - return 0; -} - -/** - * msm_dig_cdc_hph_comp_cb - registers callback to codec by machine driver. - * - * @codec_hph_comp_gpio: function pointer to set comp gpio at machine driver - * @codec: codec pointer - * - */ -void msm_dig_cdc_hph_comp_cb( - int (*codec_hph_comp_gpio)(bool enable, struct snd_soc_codec *codec), - struct snd_soc_codec *codec) -{ - struct msm_dig_priv *dig_cdc = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: Enter\n", __func__); - dig_cdc->codec_hph_comp_gpio = codec_hph_comp_gpio; -} -EXPORT_SYMBOL(msm_dig_cdc_hph_comp_cb); - -static int msm_dig_cdc_codec_enable_interpolator(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct msm_dig_priv *msm_dig_cdc = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (w->shift >= MSM89XX_RX_MAX || w->shift < 0) { - dev_err(codec->dev, "%s: wrong RX index: %d\n", - __func__, w->shift); - return -EINVAL; - } - switch (event) { - case SND_SOC_DAPM_POST_PMU: - msm_dig_cdc_codec_config_compander(codec, w->shift, event); - /* apply the digital gain after the interpolator is enabled*/ - if ((w->shift) < ARRAY_SIZE(rx_digital_gain_reg)) - snd_soc_write(codec, - rx_digital_gain_reg[w->shift], - snd_soc_read(codec, - rx_digital_gain_reg[w->shift]) - ); - break; - case SND_SOC_DAPM_POST_PMD: - msm_dig_cdc_codec_config_compander(codec, w->shift, event); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_RX_RESET_CTL, - 1 << w->shift, 1 << w->shift); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_RX_RESET_CTL, - 1 << w->shift, 0x0); - /* - * disable the mute enabled during the PMD of this device - */ - if ((w->shift == 0) && - (msm_dig_cdc->mute_mask & HPHL_PA_DISABLE)) { - pr_debug("disabling HPHL mute\n"); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B6_CTL, 0x01, 0x00); - msm_dig_cdc->mute_mask &= ~(HPHL_PA_DISABLE); - } else if ((w->shift == 1) && - (msm_dig_cdc->mute_mask & HPHR_PA_DISABLE)) { - pr_debug("disabling HPHR mute\n"); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B6_CTL, 0x01, 0x00); - msm_dig_cdc->mute_mask &= ~(HPHR_PA_DISABLE); - } else if ((w->shift == 2) && - (msm_dig_cdc->mute_mask & SPKR_PA_DISABLE)) { - pr_debug("disabling SPKR mute\n"); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX3_B6_CTL, 0x01, 0x00); - msm_dig_cdc->mute_mask &= ~(SPKR_PA_DISABLE); - } - } - return 0; -} - -static int msm_dig_cdc_get_iir_enable_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - (snd_soc_read(codec, - (MSM89XX_CDC_CORE_IIR1_CTL + 64 * iir_idx)) & - (1 << band_idx)) != 0; - - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_dig_cdc_put_iir_enable_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - - /* Mask first 5 bits, 6-8 are reserved */ - snd_soc_update_bits(codec, - (MSM89XX_CDC_CORE_IIR1_CTL + 64 * iir_idx), - (1 << band_idx), (value << band_idx)); - - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, - ((snd_soc_read(codec, - (MSM89XX_CDC_CORE_IIR1_CTL + 64 * iir_idx)) & - (1 << band_idx)) != 0)); - - return 0; -} - -static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - int coeff_idx) -{ - uint32_t value = 0; - - /* Address does not automatically update if reading */ - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL + 64 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t)) & 0x7F); - - value |= snd_soc_read(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL + 64 * iir_idx)); - - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL + 64 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 1) & 0x7F); - - value |= (snd_soc_read(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL + 64 * iir_idx)) << 8); - - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL + 64 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 2) & 0x7F); - - value |= (snd_soc_read(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL + 64 * iir_idx)) << 16); - - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL + 64 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 3) & 0x7F); - - /* Mask bits top 2 bits since they are reserved */ - value |= ((snd_soc_read(codec, (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL - + 64 * iir_idx)) & 0x3f) << 24); - - return value; - -} - -static void set_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - uint32_t value) -{ - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL + 64 * iir_idx), - (value & 0xFF)); - - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL + 64 * iir_idx), - (value >> 8) & 0xFF); - - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL + 64 * iir_idx), - (value >> 16) & 0xFF); - - /* Mask top 2 bits, 7-8 are reserved */ - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL + 64 * iir_idx), - (value >> 24) & 0x3F); - -} - -static int msm_dig_cdc_get_iir_band_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - get_iir_band_coeff(codec, iir_idx, band_idx, 0); - ucontrol->value.integer.value[1] = - get_iir_band_coeff(codec, iir_idx, band_idx, 1); - ucontrol->value.integer.value[2] = - get_iir_band_coeff(codec, iir_idx, band_idx, 2); - ucontrol->value.integer.value[3] = - get_iir_band_coeff(codec, iir_idx, band_idx, 3); - ucontrol->value.integer.value[4] = - get_iir_band_coeff(codec, iir_idx, band_idx, 4); - - dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[1], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[2], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[3], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[4]); - return 0; -} - -static int msm_dig_cdc_put_iir_band_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - /* Mask top bit it is reserved */ - /* Updates addr automatically for each B2 write */ - snd_soc_write(codec, - (MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL + 64 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[0]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[1]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[2]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[3]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[4]); - - dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 0), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 1), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 2), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 3), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 4)); - return 0; -} - -static void tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work; - struct hpf_work *hpf_work; - struct snd_soc_codec *codec; - struct msm_dig_priv *msm_dig_cdc; - u16 tx_mux_ctl_reg; - u8 hpf_cut_of_freq; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - codec = hpf_work->dig_cdc->codec; - msm_dig_cdc = hpf_work->dig_cdc; - hpf_cut_of_freq = hpf_work->tx_hpf_cut_of_freq; - - tx_mux_ctl_reg = MSM89XX_CDC_CORE_TX1_MUX_CTL + - (hpf_work->decimator - 1) * 32; - - if (hpf_work->decimator == DEC_SVA) - tx_mux_ctl_reg = MSM89XX_CDC_CORE_TX5_MUX_CTL; - - dev_dbg(codec->dev, "%s(): decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, (unsigned int)hpf_cut_of_freq); - msm_dig_cdc->update_clkdiv(msm_dig_cdc->handle, 0x51); - - snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x30, hpf_cut_of_freq << 4); -} - -static int msm_dig_cdc_codec_set_iir_gain(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int value = 0, reg; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (w->shift == 0) - reg = MSM89XX_CDC_CORE_IIR1_GAIN_B1_CTL; - else if (w->shift == 1) - reg = MSM89XX_CDC_CORE_IIR2_GAIN_B1_CTL; - else - goto ret; - value = snd_soc_read(codec, reg); - snd_soc_write(codec, reg, value); - break; - default: - pr_err("%s: event = %d not expected\n", __func__, event); - } -ret: - return 0; -} - -static int msm_dig_cdc_compander_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_dig_priv *dig_cdc = snd_soc_codec_get_drvdata(codec); - int comp_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int rx_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - dev_dbg(codec->dev, "%s: msm_dig_cdc->comp[%d]_enabled[%d] = %d\n", - __func__, comp_idx, rx_idx, - dig_cdc->comp_enabled[rx_idx]); - - ucontrol->value.integer.value[0] = dig_cdc->comp_enabled[rx_idx]; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dig_cdc_compander_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct msm_dig_priv *dig_cdc = snd_soc_codec_get_drvdata(codec); - int comp_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int rx_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - if (dig_cdc->version >= DIANGU) { - if (!value) - dig_cdc->comp_enabled[rx_idx] = 0; - else - dig_cdc->comp_enabled[rx_idx] = comp_idx; - } - - dev_dbg(codec->dev, "%s: msm_dig_cdc->comp[%d]_enabled[%d] = %d\n", - __func__, comp_idx, rx_idx, - dig_cdc->comp_enabled[rx_idx]); - - return 0; -} - -static const struct snd_kcontrol_new compander_kcontrols[] = { - SOC_SINGLE_EXT("COMP0 RX1", COMPANDER_1, MSM89XX_RX1, 1, 0, - msm_dig_cdc_compander_get, msm_dig_cdc_compander_set), - - SOC_SINGLE_EXT("COMP0 RX2", COMPANDER_1, MSM89XX_RX2, 1, 0, - msm_dig_cdc_compander_get, msm_dig_cdc_compander_set), - -}; - -static int msm_dig_cdc_set_interpolator_rate(struct snd_soc_dai *dai, - u8 rx_fs_rate_reg_val, - u32 sample_rate) -{ - snd_soc_update_bits(dai->codec, - MSM89XX_CDC_CORE_RX1_B5_CTL, 0xF0, rx_fs_rate_reg_val); - snd_soc_update_bits(dai->codec, - MSM89XX_CDC_CORE_RX2_B5_CTL, 0xF0, rx_fs_rate_reg_val); - return 0; -} - -static int msm_dig_cdc_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - u8 tx_fs_rate, rx_fs_rate, rx_clk_fs_rate; - int ret; - - dev_dbg(dai->codec->dev, - "%s: dai_name = %s DAI-ID %x rate %d num_ch %d format %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params), params_format(params)); - - switch (params_rate(params)) { - case 8000: - tx_fs_rate = 0x00; - rx_fs_rate = 0x00; - rx_clk_fs_rate = 0x00; - break; - case 16000: - tx_fs_rate = 0x20; - rx_fs_rate = 0x20; - rx_clk_fs_rate = 0x01; - break; - case 32000: - tx_fs_rate = 0x40; - rx_fs_rate = 0x40; - rx_clk_fs_rate = 0x02; - break; - case 44100: - case 48000: - tx_fs_rate = 0x60; - rx_fs_rate = 0x60; - rx_clk_fs_rate = 0x03; - break; - case 96000: - tx_fs_rate = 0x80; - rx_fs_rate = 0x80; - rx_clk_fs_rate = 0x04; - break; - case 192000: - tx_fs_rate = 0xA0; - rx_fs_rate = 0xA0; - rx_clk_fs_rate = 0x05; - break; - default: - dev_err(dai->codec->dev, - "%s: Invalid sampling rate %d\n", __func__, - params_rate(params)); - return -EINVAL; - } - - snd_soc_update_bits(dai->codec, - MSM89XX_CDC_CORE_CLK_RX_I2S_CTL, 0x0F, rx_clk_fs_rate); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_CAPTURE: - break; - case SNDRV_PCM_STREAM_PLAYBACK: - ret = msm_dig_cdc_set_interpolator_rate(dai, rx_fs_rate, - params_rate(params)); - if (ret < 0) { - dev_err(dai->codec->dev, - "%s: set decimator rate failed %d\n", __func__, - ret); - return ret; - } - break; - default: - dev_err(dai->codec->dev, - "%s: Invalid stream type %d\n", __func__, - substream->stream); - return -EINVAL; - } - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - snd_soc_update_bits(dai->codec, - MSM89XX_CDC_CORE_CLK_RX_I2S_CTL, 0x20, 0x20); - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - snd_soc_update_bits(dai->codec, - MSM89XX_CDC_CORE_CLK_RX_I2S_CTL, 0x20, 0x00); - break; - default: - dev_err(dai->codec->dev, "%s: wrong format selected\n", - __func__); - return -EINVAL; - } - return 0; -} - -static int msm_dig_cdc_codec_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct msm_dig_priv *dig_cdc = snd_soc_codec_get_drvdata(codec); - u8 dmic_clk_en; - u16 dmic_clk_reg; - s32 *dmic_clk_cnt; - unsigned int dmic; - int ret; - char *dmic_num = strpbrk(w->name, "1234"); - - if (dmic_num == NULL) { - dev_err(codec->dev, "%s: Invalid DMIC\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(dmic_num, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, - "%s: Invalid DMIC line on the codec\n", __func__); - return -EINVAL; - } - - switch (dmic) { - case 1: - case 2: - dmic_clk_en = 0x01; - dmic_clk_cnt = &(dig_cdc->dmic_1_2_clk_cnt); - dmic_clk_reg = MSM89XX_CDC_CORE_CLK_DMIC_B1_CTL; - dev_dbg(codec->dev, - "%s() event %d DMIC%d dmic_1_2_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - break; - case 3: - case 4: - dmic_clk_en = 0x01; - dmic_clk_cnt = &(dig_cdc->dmic_3_4_clk_cnt); - dmic_clk_reg = MSM89XX_CDC_CORE_CLK_DMIC_B2_CTL; - dev_dbg(codec->dev, - "%s() event %d DMIC%d dmic_3_4_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - (*dmic_clk_cnt)++; - if (*dmic_clk_cnt == 1) { - snd_soc_update_bits(codec, dmic_clk_reg, - 0x0E, 0x04); - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, dmic_clk_en); - } - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_TX1_DMIC_CTL + (dmic - 1) * 0x20, - 0x07, 0x02); - break; - case SND_SOC_DAPM_POST_PMD: - (*dmic_clk_cnt)--; - if (*dmic_clk_cnt == 0) - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, 0); - break; - } - return 0; -} - -static int msm_dig_cdc_codec_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct msm_asoc_mach_data *pdata = NULL; - unsigned int decimator; - struct msm_dig_priv *msm_dig_cdc = snd_soc_codec_get_drvdata(codec); - char *dec_name = NULL; - char *widget_name = NULL; - char *temp; - int ret = 0, i; - u16 dec_reset_reg, tx_vol_ctl_reg, tx_mux_ctl_reg; - u8 dec_hpf_cut_of_freq; - int offset; - char *dec_num; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - dev_dbg(codec->dev, "%s %d\n", __func__, event); - - widget_name = kstrndup(w->name, 15, GFP_KERNEL); - if (!widget_name) - return -ENOMEM; - temp = widget_name; - - dec_name = strsep(&widget_name, " "); - widget_name = temp; - if (!dec_name) { - dev_err(codec->dev, - "%s: Invalid decimator = %s\n", __func__, w->name); - ret = -EINVAL; - goto out; - } - - dec_num = strpbrk(dec_name, "12345"); - if (dec_num == NULL) { - dev_err(codec->dev, "%s: Invalid Decimator\n", __func__); - ret = -EINVAL; - goto out; - } - - ret = kstrtouint(dec_num, 10, &decimator); - if (ret < 0) { - dev_err(codec->dev, - "%s: Invalid decimator = %s\n", __func__, dec_name); - ret = -EINVAL; - goto out; - } - - dev_dbg(codec->dev, - "%s(): widget = %s dec_name = %s decimator = %u\n", __func__, - w->name, dec_name, decimator); - - if (w->reg == MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL) { - dec_reset_reg = MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL; - offset = 0; - } else { - dev_err(codec->dev, "%s: Error, incorrect dec\n", __func__); - ret = -EINVAL; - goto out; - } - - tx_vol_ctl_reg = MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG + - 32 * (decimator - 1); - tx_mux_ctl_reg = MSM89XX_CDC_CORE_TX1_MUX_CTL + - 32 * (decimator - 1); - if (decimator == DEC_SVA) { - tx_vol_ctl_reg = MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG; - tx_mux_ctl_reg = MSM89XX_CDC_CORE_TX5_MUX_CTL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Enableable TX digital mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x01); - for (i = 0; i < NUM_DECIMATORS; i++) { - if (decimator == i + 1) - msm_dig_cdc->dec_active[i] = true; - } - - dec_hpf_cut_of_freq = snd_soc_read(codec, tx_mux_ctl_reg); - - dec_hpf_cut_of_freq = (dec_hpf_cut_of_freq & 0x30) >> 4; - - tx_hpf_work[decimator - 1].tx_hpf_cut_of_freq = - dec_hpf_cut_of_freq; - - if (dec_hpf_cut_of_freq != CF_MIN_3DB_150HZ) { - - /* set cut of freq to CF_MIN_3DB_150HZ (0x1); */ - snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x30, - CF_MIN_3DB_150HZ << 4); - } - msm_dig_cdc->update_clkdiv(msm_dig_cdc->handle, 0x42); - break; - case SND_SOC_DAPM_POST_PMU: - /* enable HPF */ - snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x08, 0x00); - - schedule_delayed_work( - &msm_dig_cdc->tx_mute_dwork[decimator - 1].dwork, - msecs_to_jiffies(tx_unmute_delay)); - if (tx_hpf_work[decimator - 1].tx_hpf_cut_of_freq != - CF_MIN_3DB_150HZ) { - - schedule_delayed_work(&tx_hpf_work[decimator - 1].dwork, - msecs_to_jiffies(300)); - } - /* apply the digital gain after the decimator is enabled*/ - if ((w->shift) < ARRAY_SIZE(tx_digital_gain_reg)) - snd_soc_write(codec, - tx_digital_gain_reg[w->shift + offset], - snd_soc_read(codec, - tx_digital_gain_reg[w->shift + offset]) - ); - break; - case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x01); - msleep(20); - snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x08, 0x08); - cancel_delayed_work_sync(&tx_hpf_work[decimator - 1].dwork); - cancel_delayed_work_sync( - &msm_dig_cdc->tx_mute_dwork[decimator - 1].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift, - 1 << w->shift); - snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift, 0x0); - snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x08, 0x08); - snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x30, - (tx_hpf_work[decimator - 1].tx_hpf_cut_of_freq) << 4); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x00); - for (i = 0; i < NUM_DECIMATORS; i++) { - if (decimator == i + 1) - msm_dig_cdc->dec_active[i] = false; - } - break; - } -out: - kfree(widget_name); - return ret; -} - -static int msm_dig_cdc_event_notify(struct notifier_block *block, - unsigned long val, - void *data) -{ - enum dig_cdc_notify_event event = (enum dig_cdc_notify_event)val; - struct snd_soc_codec *codec = registered_digcodec; - struct msm_dig_priv *msm_dig_cdc = snd_soc_codec_get_drvdata(codec); - struct msm_asoc_mach_data *pdata = NULL; - int ret = -EINVAL; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - - switch (event) { - case DIG_CDC_EVENT_CLK_ON: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_PDM_CTL, 0x03, 0x03); - if (pdata->mclk_freq == MCLK_RATE_12P288MHZ || - pdata->native_clk_set) - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_TOP_CTL, 0x01, 0x00); - else if (pdata->mclk_freq == MCLK_RATE_9P6MHZ) - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_TOP_CTL, 0x01, 0x01); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_MCLK_CTL, 0x01, 0x01); - break; - case DIG_CDC_EVENT_CLK_OFF: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_PDM_CTL, 0x03, 0x00); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_CLK_MCLK_CTL, 0x01, 0x00); - break; - case DIG_CDC_EVENT_RX1_MUTE_ON: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B6_CTL, 0x01, 0x01); - msm_dig_cdc->mute_mask |= HPHL_PA_DISABLE; - break; - case DIG_CDC_EVENT_RX1_MUTE_OFF: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B6_CTL, 0x01, 0x00); - msm_dig_cdc->mute_mask &= (~HPHL_PA_DISABLE); - break; - case DIG_CDC_EVENT_RX2_MUTE_ON: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B6_CTL, 0x01, 0x01); - msm_dig_cdc->mute_mask |= HPHR_PA_DISABLE; - break; - case DIG_CDC_EVENT_RX2_MUTE_OFF: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B6_CTL, 0x01, 0x00); - msm_dig_cdc->mute_mask &= (~HPHR_PA_DISABLE); - break; - case DIG_CDC_EVENT_RX3_MUTE_ON: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX3_B6_CTL, 0x01, 0x01); - msm_dig_cdc->mute_mask |= SPKR_PA_DISABLE; - break; - case DIG_CDC_EVENT_RX3_MUTE_OFF: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX3_B6_CTL, 0x01, 0x00); - msm_dig_cdc->mute_mask &= (~SPKR_PA_DISABLE); - break; - case DIG_CDC_EVENT_PRE_RX1_INT_ON: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B3_CTL, 0x3C, 0x28); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B4_CTL, 0x18, 0x10); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B3_CTL, 0x80, 0x80); - break; - case DIG_CDC_EVENT_PRE_RX2_INT_ON: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B3_CTL, 0x3C, 0x28); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B4_CTL, 0x18, 0x10); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B3_CTL, 0x80, 0x80); - break; - case DIG_CDC_EVENT_POST_RX1_INT_OFF: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B3_CTL, 0x3C, 0x00); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B4_CTL, 0x18, 0xFF); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX1_B3_CTL, 0x80, 0x00); - break; - case DIG_CDC_EVENT_POST_RX2_INT_OFF: - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B3_CTL, 0x3C, 0x00); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B4_CTL, 0x18, 0xFF); - snd_soc_update_bits(codec, - MSM89XX_CDC_CORE_RX2_B3_CTL, 0x80, 0x00); - break; - case DIG_CDC_EVENT_SSR_DOWN: - regcache_cache_only(msm_dig_cdc->regmap, true); - break; - case DIG_CDC_EVENT_SSR_UP: - regcache_cache_only(msm_dig_cdc->regmap, false); - regcache_mark_dirty(msm_dig_cdc->regmap); - - mutex_lock(&pdata->cdc_int_mclk0_mutex); - pdata->digital_cdc_core_clk.enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - if (ret < 0) { - pr_err("%s:failed to enable the MCLK\n", - __func__); - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - break; - } - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - - regcache_sync(msm_dig_cdc->regmap); - - mutex_lock(&pdata->cdc_int_mclk0_mutex); - pdata->digital_cdc_core_clk.enable = 0; - afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - break; - case DIG_CDC_EVENT_INVALID: - default: - break; - } - return 0; -} - -static ssize_t msm_dig_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct msm_dig_priv *msm_dig; - char buffer[MSM_DIG_CDC_VERSION_ENTRY_SIZE]; - int len = 0; - - msm_dig = (struct msm_dig_priv *) entry->private_data; - if (!msm_dig) { - pr_err("%s: msm_dig priv is null\n", __func__); - return -EINVAL; - } - - switch (msm_dig->version) { - case DRAX_CDC: - len = snprintf(buffer, sizeof(buffer), "SDM660-CDC_1_0\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops msm_dig_codec_info_ops = { - .read = msm_dig_codec_version_read, -}; - -/* - * msm_dig_codec_info_create_codec_entry - creates msm_dig module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates msm_dig module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int msm_dig_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct msm_dig_priv *msm_dig; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - msm_dig = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - msm_dig->entry = snd_info_create_subdir(codec_root->module, - "msm_digital_codec", - codec_root); - if (!msm_dig->entry) { - dev_dbg(codec->dev, "%s: failed to create msm_digital entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - msm_dig->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create msm_digital version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = msm_dig; - version_entry->size = MSM_DIG_CDC_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &msm_dig_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - msm_dig->version_entry = version_entry; - if (msm_dig->get_cdc_version) - msm_dig->version = msm_dig->get_cdc_version(msm_dig->handle); - else - msm_dig->version = DRAX_CDC; - - return 0; -} -EXPORT_SYMBOL(msm_dig_codec_info_create_codec_entry); - -static void sdm660_tx_mute_update_callback(struct work_struct *work) -{ - struct tx_mute_work *tx_mute_dwork; - struct snd_soc_codec *codec = NULL; - struct msm_dig_priv *dig_cdc; - struct delayed_work *delayed_work; - u16 tx_vol_ctl_reg = 0; - u8 decimator = 0, i; - - delayed_work = to_delayed_work(work); - tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork); - dig_cdc = tx_mute_dwork->dig_cdc; - codec = dig_cdc->codec; - - for (i = 0; i < NUM_DECIMATORS; i++) { - if (dig_cdc->dec_active[i]) - decimator = i + 1; - if (decimator && decimator <= NUM_DECIMATORS) { - /* unmute decimators corresponding to Tx DAI's*/ - tx_vol_ctl_reg = - MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG + - 32 * (decimator - 1); - if (decimator == DEC_SVA) - tx_vol_ctl_reg = - MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG; - - snd_soc_update_bits(codec, tx_vol_ctl_reg, - 0x01, 0x00); - } - decimator = 0; - } -} - -static int msm_dig_cdc_soc_probe(struct snd_soc_codec *codec) -{ - struct msm_dig_priv *msm_dig_cdc = dev_get_drvdata(codec->dev); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int i, ret; - - msm_dig_cdc->codec = codec; - - snd_soc_add_codec_controls(codec, compander_kcontrols, - ARRAY_SIZE(compander_kcontrols)); - - for (i = 0; i < NUM_DECIMATORS; i++) { - tx_hpf_work[i].dig_cdc = msm_dig_cdc; - tx_hpf_work[i].decimator = i + 1; - INIT_DELAYED_WORK(&tx_hpf_work[i].dwork, - tx_hpf_corner_freq_callback); - msm_dig_cdc->tx_mute_dwork[i].dig_cdc = msm_dig_cdc; - msm_dig_cdc->tx_mute_dwork[i].decimator = i + 1; - INIT_DELAYED_WORK(&msm_dig_cdc->tx_mute_dwork[i].dwork, - sdm660_tx_mute_update_callback); - } - - for (i = 0; i < MSM89XX_RX_MAX; i++) - msm_dig_cdc->comp_enabled[i] = COMPANDER_NONE; - - /* Register event notifier */ - msm_dig_cdc->nblock.notifier_call = msm_dig_cdc_event_notify; - if (msm_dig_cdc->register_notifier) { - ret = msm_dig_cdc->register_notifier(msm_dig_cdc->handle, - &msm_dig_cdc->nblock, - true); - if (ret) { - pr_err("%s: Failed to register notifier %d\n", - __func__, ret); - return ret; - } - } - registered_digcodec = codec; - - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "ADC1_IN"); - snd_soc_dapm_ignore_suspend(dapm, "ADC2_IN"); - snd_soc_dapm_ignore_suspend(dapm, "ADC3_IN"); - snd_soc_dapm_ignore_suspend(dapm, "PDM_OUT_RX1"); - snd_soc_dapm_ignore_suspend(dapm, "PDM_OUT_RX2"); - snd_soc_dapm_ignore_suspend(dapm, "PDM_OUT_RX3"); - - snd_soc_dapm_sync(dapm); - - return 0; -} - -static int msm_dig_cdc_soc_remove(struct snd_soc_codec *codec) -{ - struct msm_dig_priv *msm_dig_cdc = dev_get_drvdata(codec->dev); - - if (msm_dig_cdc->register_notifier) - msm_dig_cdc->register_notifier(msm_dig_cdc->handle, - &msm_dig_cdc->nblock, - false); - iounmap(msm_dig_cdc->dig_base); - return 0; -} - -static const struct snd_soc_dapm_route audio_dig_map[] = { - {"RX_I2S_CLK", NULL, "CDC_CONN"}, - {"I2S RX1", NULL, "RX_I2S_CLK"}, - {"I2S RX2", NULL, "RX_I2S_CLK"}, - {"I2S RX3", NULL, "RX_I2S_CLK"}, - - {"I2S TX1", NULL, "TX_I2S_CLK"}, - {"I2S TX2", NULL, "TX_I2S_CLK"}, - {"I2S TX3", NULL, "TX_I2S_CLK"}, - {"I2S TX4", NULL, "TX_I2S_CLK"}, - {"I2S TX5", NULL, "TX_I2S_CLK"}, - {"I2S TX6", NULL, "TX_I2S_CLK"}, - - {"I2S TX1", NULL, "DEC1 MUX"}, - {"I2S TX2", NULL, "DEC2 MUX"}, - {"I2S TX3", NULL, "I2S TX2 INP1"}, - {"I2S TX4", NULL, "I2S TX2 INP2"}, - {"I2S TX5", NULL, "DEC3 MUX"}, - {"I2S TX6", NULL, "I2S TX3 INP2"}, - - {"I2S TX2 INP1", "RX_MIX1", "RX1 MIX2"}, - {"I2S TX2 INP1", "DEC3", "DEC3 MUX"}, - {"I2S TX2 INP2", "RX_MIX2", "RX2 MIX2"}, - {"I2S TX2 INP2", "RX_MIX3", "RX3 MIX1"}, - {"I2S TX2 INP2", "DEC4", "DEC4 MUX"}, - {"I2S TX3 INP2", "DEC4", "DEC4 MUX"}, - {"I2S TX3 INP2", "DEC5", "DEC5 MUX"}, - - {"PDM_OUT_RX1", NULL, "RX1 CHAIN"}, - {"PDM_OUT_RX2", NULL, "RX2 CHAIN"}, - {"PDM_OUT_RX3", NULL, "RX3 CHAIN"}, - - {"RX1 CHAIN", NULL, "RX1 MIX2"}, - {"RX2 CHAIN", NULL, "RX2 MIX2"}, - {"RX3 CHAIN", NULL, "RX3 MIX1"}, - - {"RX1 MIX1", NULL, "RX1 MIX1 INP1"}, - {"RX1 MIX1", NULL, "RX1 MIX1 INP2"}, - {"RX1 MIX1", NULL, "RX1 MIX1 INP3"}, - {"RX2 MIX1", NULL, "RX2 MIX1 INP1"}, - {"RX2 MIX1", NULL, "RX2 MIX1 INP2"}, - {"RX3 MIX1", NULL, "RX3 MIX1 INP1"}, - {"RX3 MIX1", NULL, "RX3 MIX1 INP2"}, - {"RX1 MIX2", NULL, "RX1 MIX1"}, - {"RX1 MIX2", NULL, "RX1 MIX2 INP1"}, - {"RX2 MIX2", NULL, "RX2 MIX1"}, - {"RX2 MIX2", NULL, "RX2 MIX2 INP1"}, - - {"RX1 MIX1 INP1", "RX1", "I2S RX1"}, - {"RX1 MIX1 INP1", "RX2", "I2S RX2"}, - {"RX1 MIX1 INP1", "RX3", "I2S RX3"}, - {"RX1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX1 MIX1 INP1", "IIR2", "IIR2"}, - {"RX1 MIX1 INP2", "RX1", "I2S RX1"}, - {"RX1 MIX1 INP2", "RX2", "I2S RX2"}, - {"RX1 MIX1 INP2", "RX3", "I2S RX3"}, - {"RX1 MIX1 INP2", "IIR1", "IIR1"}, - {"RX1 MIX1 INP2", "IIR2", "IIR2"}, - {"RX1 MIX1 INP3", "RX1", "I2S RX1"}, - {"RX1 MIX1 INP3", "RX2", "I2S RX2"}, - {"RX1 MIX1 INP3", "RX3", "I2S RX3"}, - - {"RX2 MIX1 INP1", "RX1", "I2S RX1"}, - {"RX2 MIX1 INP1", "RX2", "I2S RX2"}, - {"RX2 MIX1 INP1", "RX3", "I2S RX3"}, - {"RX2 MIX1 INP1", "IIR1", "IIR1"}, - {"RX2 MIX1 INP1", "IIR2", "IIR2"}, - {"RX2 MIX1 INP2", "RX1", "I2S RX1"}, - {"RX2 MIX1 INP2", "RX2", "I2S RX2"}, - {"RX2 MIX1 INP2", "RX3", "I2S RX3"}, - {"RX2 MIX1 INP2", "IIR1", "IIR1"}, - {"RX2 MIX1 INP2", "IIR2", "IIR2"}, - {"RX2 MIX1 INP3", "RX1", "I2S RX1"}, - {"RX2 MIX1 INP3", "RX2", "I2S RX2"}, - {"RX2 MIX1 INP3", "RX3", "I2S RX3"}, - - {"RX3 MIX1 INP1", "RX1", "I2S RX1"}, - {"RX3 MIX1 INP1", "RX2", "I2S RX2"}, - {"RX3 MIX1 INP1", "RX3", "I2S RX3"}, - {"RX3 MIX1 INP1", "IIR1", "IIR1"}, - {"RX3 MIX1 INP1", "IIR2", "IIR2"}, - {"RX3 MIX1 INP2", "RX1", "I2S RX1"}, - {"RX3 MIX1 INP2", "RX2", "I2S RX2"}, - {"RX3 MIX1 INP2", "RX3", "I2S RX3"}, - {"RX3 MIX1 INP2", "IIR1", "IIR1"}, - {"RX3 MIX1 INP2", "IIR2", "IIR2"}, - {"RX3 MIX1 INP3", "RX1", "I2S RX1"}, - {"RX3 MIX1 INP3", "RX2", "I2S RX2"}, - {"RX3 MIX1 INP3", "RX3", "I2S RX3"}, - - {"RX1 MIX2 INP1", "IIR1", "IIR1"}, - {"RX2 MIX2 INP1", "IIR1", "IIR1"}, - {"RX1 MIX2 INP1", "IIR2", "IIR2"}, - {"RX2 MIX2 INP1", "IIR2", "IIR2"}, - - /* Decimator Inputs */ - {"DEC1 MUX", "DMIC1", "DMIC1"}, - {"DEC1 MUX", "DMIC2", "DMIC2"}, - {"DEC1 MUX", "DMIC3", "DMIC3"}, - {"DEC1 MUX", "DMIC4", "DMIC4"}, - {"DEC1 MUX", "ADC1", "ADC1_IN"}, - {"DEC1 MUX", "ADC2", "ADC2_IN"}, - {"DEC1 MUX", "ADC3", "ADC3_IN"}, - {"DEC1 MUX", NULL, "CDC_CONN"}, - - {"DEC2 MUX", "DMIC1", "DMIC1"}, - {"DEC2 MUX", "DMIC2", "DMIC2"}, - {"DEC2 MUX", "DMIC3", "DMIC3"}, - {"DEC2 MUX", "DMIC4", "DMIC4"}, - {"DEC2 MUX", "ADC1", "ADC1_IN"}, - {"DEC2 MUX", "ADC2", "ADC2_IN"}, - {"DEC2 MUX", "ADC3", "ADC3_IN"}, - {"DEC2 MUX", NULL, "CDC_CONN"}, - - {"DEC3 MUX", "DMIC1", "DMIC1"}, - {"DEC3 MUX", "DMIC2", "DMIC2"}, - {"DEC3 MUX", "DMIC3", "DMIC3"}, - {"DEC3 MUX", "DMIC4", "DMIC4"}, - {"DEC3 MUX", "ADC1", "ADC1_IN"}, - {"DEC3 MUX", "ADC2", "ADC2_IN"}, - {"DEC3 MUX", "ADC3", "ADC3_IN"}, - {"DEC3 MUX", NULL, "CDC_CONN"}, - - {"DEC4 MUX", "DMIC1", "DMIC1"}, - {"DEC4 MUX", "DMIC2", "DMIC2"}, - {"DEC4 MUX", "DMIC3", "DMIC3"}, - {"DEC4 MUX", "DMIC4", "DMIC4"}, - {"DEC4 MUX", "ADC1", "ADC1_IN"}, - {"DEC4 MUX", "ADC2", "ADC2_IN"}, - {"DEC4 MUX", "ADC3", "ADC3_IN"}, - {"DEC4 MUX", NULL, "CDC_CONN"}, - - {"DEC5 MUX", "DMIC1", "DMIC1"}, - {"DEC5 MUX", "DMIC2", "DMIC2"}, - {"DEC5 MUX", "DMIC3", "DMIC3"}, - {"DEC5 MUX", "DMIC4", "DMIC4"}, - {"DEC5 MUX", "ADC1", "ADC1_IN"}, - {"DEC5 MUX", "ADC2", "ADC2_IN"}, - {"DEC5 MUX", "ADC3", "ADC3_IN"}, - {"DEC5 MUX", NULL, "CDC_CONN"}, - - {"IIR1", NULL, "IIR1 INP1 MUX"}, - {"IIR1 INP1 MUX", "DEC1", "DEC1 MUX"}, - {"IIR1 INP1 MUX", "DEC2", "DEC2 MUX"}, - {"IIR1 INP1 MUX", "DEC3", "DEC3 MUX"}, - {"IIR1 INP1 MUX", "DEC4", "DEC4 MUX"}, - {"IIR2", NULL, "IIR2 INP1 MUX"}, - {"IIR2 INP1 MUX", "DEC1", "DEC1 MUX"}, - {"IIR2 INP1 MUX", "DEC2", "DEC2 MUX"}, - {"IIR1 INP1 MUX", "DEC3", "DEC3 MUX"}, - {"IIR1 INP1 MUX", "DEC4", "DEC4 MUX"}, -}; - - -static const char * const i2s_tx2_inp1_text[] = { - "ZERO", "RX_MIX1", "DEC3" -}; - -static const char * const i2s_tx2_inp2_text[] = { - "ZERO", "RX_MIX2", "RX_MIX3", "DEC4" -}; - -static const char * const i2s_tx3_inp2_text[] = { - "DEC4", "DEC5" -}; - -static const char * const rx_mix1_text[] = { - "ZERO", "IIR1", "IIR2", "RX1", "RX2", "RX3" -}; - -static const char * const rx_mix2_text[] = { - "ZERO", "IIR1", "IIR2" -}; - -static const char * const dec_mux_text[] = { - "ZERO", "ADC1", "ADC2", "ADC3", "DMIC1", "DMIC2", "DMIC3", "DMIC4" -}; - -static const char * const iir_inp1_text[] = { - "ZERO", "DEC1", "DEC2", "RX1", "RX2", "RX3", "DEC3", "DEC4" -}; - -/* I2S TX MUXes */ -static const struct soc_enum i2s_tx2_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL, - 2, 3, i2s_tx2_inp1_text); - -static const struct soc_enum i2s_tx2_inp2_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL, - 0, 4, i2s_tx2_inp2_text); - -static const struct soc_enum i2s_tx3_inp2_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL, - 4, 2, i2s_tx3_inp2_text); - -/* RX1 MIX1 */ -static const struct soc_enum rx_mix1_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX1_B1_CTL, - 0, 6, rx_mix1_text); - -static const struct soc_enum rx_mix1_inp2_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX1_B1_CTL, - 3, 6, rx_mix1_text); - -static const struct soc_enum rx_mix1_inp3_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX1_B2_CTL, - 0, 6, rx_mix1_text); - -/* RX1 MIX2 */ -static const struct soc_enum rx_mix2_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX1_B3_CTL, - 0, 3, rx_mix2_text); - -/* RX2 MIX1 */ -static const struct soc_enum rx2_mix1_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX2_B1_CTL, - 0, 6, rx_mix1_text); - -static const struct soc_enum rx2_mix1_inp2_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX2_B1_CTL, - 3, 6, rx_mix1_text); - -static const struct soc_enum rx2_mix1_inp3_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX2_B1_CTL, - 0, 6, rx_mix1_text); - -/* RX2 MIX2 */ -static const struct soc_enum rx2_mix2_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX2_B3_CTL, - 0, 3, rx_mix2_text); - -/* RX3 MIX1 */ -static const struct soc_enum rx3_mix1_inp1_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX3_B1_CTL, - 0, 6, rx_mix1_text); - -static const struct soc_enum rx3_mix1_inp2_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX3_B1_CTL, - 3, 6, rx_mix1_text); - -static const struct soc_enum rx3_mix1_inp3_chain_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_RX3_B1_CTL, - 0, 6, rx_mix1_text); - -/* DEC */ -static const struct soc_enum dec1_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_B1_CTL, - 0, 8, dec_mux_text); - -static const struct soc_enum dec2_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_B1_CTL, - 3, 8, dec_mux_text); - -static const struct soc_enum dec3_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_B2_CTL, - 0, 8, dec_mux_text); - -static const struct soc_enum dec4_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_B2_CTL, - 3, 8, dec_mux_text); - -static const struct soc_enum decsva_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_TX_B3_CTL, - 0, 8, dec_mux_text); - -static const struct soc_enum iir1_inp1_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_EQ1_B1_CTL, - 0, 8, iir_inp1_text); - -static const struct soc_enum iir2_inp1_mux_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_CONN_EQ2_B1_CTL, - 0, 8, iir_inp1_text); - -/*cut of frequency for high pass filter*/ -static const char * const cf_text[] = { - "MIN_3DB_4Hz", "MIN_3DB_75Hz", "MIN_3DB_150Hz" -}; - -static const struct soc_enum cf_rxmix1_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_RX1_B4_CTL, 0, 3, cf_text); - -static const struct soc_enum cf_rxmix2_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_RX2_B4_CTL, 0, 3, cf_text); - -static const struct soc_enum cf_rxmix3_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_RX3_B4_CTL, 0, 3, cf_text); - -static const struct snd_kcontrol_new rx3_mix1_inp1_mux = - SOC_DAPM_ENUM("RX3 MIX1 INP1 Mux", rx3_mix1_inp1_chain_enum); - -#define MSM89XX_DEC_ENUM(xname, xenum) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ - .info = snd_soc_info_enum_double, \ - .get = snd_soc_dapm_get_enum_double, \ - .put = msm_dig_cdc_put_dec_enum, \ - .private_value = (unsigned long)&xenum } - -static const struct snd_kcontrol_new dec1_mux = - MSM89XX_DEC_ENUM("DEC1 MUX Mux", dec1_mux_enum); - -static const struct snd_kcontrol_new dec2_mux = - MSM89XX_DEC_ENUM("DEC2 MUX Mux", dec2_mux_enum); - -static const struct snd_kcontrol_new dec3_mux = - MSM89XX_DEC_ENUM("DEC3 MUX Mux", dec3_mux_enum); - -static const struct snd_kcontrol_new dec4_mux = - MSM89XX_DEC_ENUM("DEC4 MUX Mux", dec4_mux_enum); - -static const struct snd_kcontrol_new decsva_mux = - MSM89XX_DEC_ENUM("DEC5 MUX Mux", decsva_mux_enum); - -static const struct snd_kcontrol_new i2s_tx2_inp1_mux = - SOC_DAPM_ENUM("I2S TX2 INP1 Mux", i2s_tx2_inp1_chain_enum); - -static const struct snd_kcontrol_new i2s_tx2_inp2_mux = - SOC_DAPM_ENUM("I2S TX2 INP2 Mux", i2s_tx2_inp2_chain_enum); - -static const struct snd_kcontrol_new i2s_tx3_inp2_mux = - SOC_DAPM_ENUM("I2S TX3 INP2 Mux", i2s_tx3_inp2_chain_enum); - -static const struct snd_kcontrol_new iir1_inp1_mux = - SOC_DAPM_ENUM("IIR1 INP1 Mux", iir1_inp1_mux_enum); - -static const struct snd_kcontrol_new iir2_inp1_mux = - SOC_DAPM_ENUM("IIR2 INP1 Mux", iir2_inp1_mux_enum); - -static const struct snd_kcontrol_new rx_mix1_inp1_mux = - SOC_DAPM_ENUM("RX1 MIX1 INP1 Mux", rx_mix1_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_mix1_inp2_mux = - SOC_DAPM_ENUM("RX1 MIX1 INP2 Mux", rx_mix1_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_mix1_inp3_mux = - SOC_DAPM_ENUM("RX1 MIX1 INP3 Mux", rx_mix1_inp3_chain_enum); - -static const struct snd_kcontrol_new rx2_mix1_inp1_mux = - SOC_DAPM_ENUM("RX2 MIX1 INP1 Mux", rx2_mix1_inp1_chain_enum); - -static const struct snd_kcontrol_new rx2_mix1_inp2_mux = - SOC_DAPM_ENUM("RX2 MIX1 INP2 Mux", rx2_mix1_inp2_chain_enum); - -static const struct snd_kcontrol_new rx2_mix1_inp3_mux = - SOC_DAPM_ENUM("RX2 MIX1 INP3 Mux", rx2_mix1_inp3_chain_enum); - -static const struct snd_kcontrol_new rx3_mix1_inp2_mux = - SOC_DAPM_ENUM("RX3 MIX1 INP2 Mux", rx3_mix1_inp2_chain_enum); - -static const struct snd_kcontrol_new rx3_mix1_inp3_mux = - SOC_DAPM_ENUM("RX3 MIX1 INP3 Mux", rx3_mix1_inp3_chain_enum); - -static const struct snd_kcontrol_new rx1_mix2_inp1_mux = - SOC_DAPM_ENUM("RX1 MIX2 INP1 Mux", rx_mix2_inp1_chain_enum); - -static const struct snd_kcontrol_new rx2_mix2_inp1_mux = - SOC_DAPM_ENUM("RX2 MIX2 INP1 Mux", rx2_mix2_inp1_chain_enum); - -static const struct snd_soc_dapm_widget msm_dig_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("I2S RX1", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_IN("I2S RX2", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_IN("I2S RX3", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_AIF_OUT("I2S TX1", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("I2S TX2", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("I2S TX3", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("I2S TX4", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("I2S TX5", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("I2S TX6", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_MIXER_E("RX1 MIX2", MSM89XX_CDC_CORE_CLK_RX_B1_CTL, - MSM89XX_RX1, 0, NULL, 0, - msm_dig_cdc_codec_enable_interpolator, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX2 MIX2", MSM89XX_CDC_CORE_CLK_RX_B1_CTL, - MSM89XX_RX2, 0, NULL, 0, - msm_dig_cdc_codec_enable_interpolator, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX3 MIX1", MSM89XX_CDC_CORE_CLK_RX_B1_CTL, - MSM89XX_RX3, 0, NULL, 0, - msm_dig_cdc_codec_enable_interpolator, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("RX1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX2 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER("RX1 CHAIN", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX2 CHAIN", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX3 CHAIN", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX("RX1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_mix1_inp1_mux), - SND_SOC_DAPM_MUX("RX1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_mix1_inp2_mux), - SND_SOC_DAPM_MUX("RX1 MIX1 INP3", SND_SOC_NOPM, 0, 0, - &rx_mix1_inp3_mux), - - SND_SOC_DAPM_MUX("RX2 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx2_mix1_inp1_mux), - SND_SOC_DAPM_MUX("RX2 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx2_mix1_inp2_mux), - SND_SOC_DAPM_MUX("RX2 MIX1 INP3", SND_SOC_NOPM, 0, 0, - &rx2_mix1_inp3_mux), - - SND_SOC_DAPM_MUX("RX3 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx3_mix1_inp1_mux), - SND_SOC_DAPM_MUX("RX3 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx3_mix1_inp2_mux), - SND_SOC_DAPM_MUX("RX3 MIX1 INP3", SND_SOC_NOPM, 0, 0, - &rx3_mix1_inp3_mux), - - SND_SOC_DAPM_MUX("RX1 MIX2 INP1", SND_SOC_NOPM, 0, 0, - &rx1_mix2_inp1_mux), - SND_SOC_DAPM_MUX("RX2 MIX2 INP1", SND_SOC_NOPM, 0, 0, - &rx2_mix2_inp1_mux), - - SND_SOC_DAPM_SUPPLY_S("CDC_CONN", -2, MSM89XX_CDC_CORE_CLK_OTHR_CTL, - 2, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("DEC1 MUX", - MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL, 0, 0, - &dec1_mux, msm_dig_cdc_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("DEC2 MUX", - MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL, 1, 0, - &dec2_mux, msm_dig_cdc_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("DEC3 MUX", - MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL, 2, 0, - &dec3_mux, msm_dig_cdc_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("DEC4 MUX", - MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL, 3, 0, - &dec4_mux, msm_dig_cdc_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("DEC5 MUX", - MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL, 4, 0, - &decsva_mux, msm_dig_cdc_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - /* Sidetone */ - SND_SOC_DAPM_MUX("IIR1 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp1_mux), - SND_SOC_DAPM_PGA_E("IIR1", MSM89XX_CDC_CORE_CLK_SD_CTL, 0, 0, NULL, 0, - msm_dig_cdc_codec_set_iir_gain, SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX("IIR2 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir2_inp1_mux), - SND_SOC_DAPM_PGA_E("IIR2", MSM89XX_CDC_CORE_CLK_SD_CTL, 1, 0, NULL, 0, - msm_dig_cdc_codec_set_iir_gain, SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_SUPPLY("RX_I2S_CLK", - MSM89XX_CDC_CORE_CLK_RX_I2S_CTL, 4, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("TX_I2S_CLK", - MSM89XX_CDC_CORE_CLK_TX_I2S_CTL, 4, 0, NULL, 0), - - - SND_SOC_DAPM_MUX("I2S TX2 INP1", SND_SOC_NOPM, 0, 0, - &i2s_tx2_inp1_mux), - SND_SOC_DAPM_MUX("I2S TX2 INP2", SND_SOC_NOPM, 0, 0, - &i2s_tx2_inp2_mux), - SND_SOC_DAPM_MUX("I2S TX3 INP2", SND_SOC_NOPM, 0, 0, - &i2s_tx3_inp2_mux), - - /* Digital Mic Inputs */ - SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, - msm_dig_cdc_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0, - msm_dig_cdc_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0, - msm_dig_cdc_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0, - msm_dig_cdc_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_INPUT("ADC1_IN"), - SND_SOC_DAPM_INPUT("ADC2_IN"), - SND_SOC_DAPM_INPUT("ADC3_IN"), - SND_SOC_DAPM_OUTPUT("PDM_OUT_RX1"), - SND_SOC_DAPM_OUTPUT("PDM_OUT_RX2"), - SND_SOC_DAPM_OUTPUT("PDM_OUT_RX3"), -}; - -static const struct soc_enum cf_dec1_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_TX1_MUX_CTL, 4, 3, cf_text); - -static const struct soc_enum cf_dec2_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_TX2_MUX_CTL, 4, 3, cf_text); - -static const struct soc_enum cf_dec3_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_TX3_MUX_CTL, 4, 3, cf_text); - -static const struct soc_enum cf_dec4_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_TX4_MUX_CTL, 4, 3, cf_text); - -static const struct soc_enum cf_decsva_enum = - SOC_ENUM_SINGLE(MSM89XX_CDC_CORE_TX5_MUX_CTL, 4, 3, cf_text); - -static const struct snd_kcontrol_new msm_dig_snd_controls[] = { - SOC_SINGLE_SX_TLV("DEC1 Volume", - MSM89XX_CDC_CORE_TX1_VOL_CTL_GAIN, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC2 Volume", - MSM89XX_CDC_CORE_TX2_VOL_CTL_GAIN, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC3 Volume", - MSM89XX_CDC_CORE_TX3_VOL_CTL_GAIN, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC4 Volume", - MSM89XX_CDC_CORE_TX4_VOL_CTL_GAIN, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC5 Volume", - MSM89XX_CDC_CORE_TX5_VOL_CTL_GAIN, - 0, -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("IIR1 INP1 Volume", - MSM89XX_CDC_CORE_IIR1_GAIN_B1_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP2 Volume", - MSM89XX_CDC_CORE_IIR1_GAIN_B2_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP3 Volume", - MSM89XX_CDC_CORE_IIR1_GAIN_B3_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP4 Volume", - MSM89XX_CDC_CORE_IIR1_GAIN_B4_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR2 INP1 Volume", - MSM89XX_CDC_CORE_IIR2_GAIN_B1_CTL, - 0, -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("RX1 Digital Volume", - MSM89XX_CDC_CORE_RX1_VOL_CTL_B2_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX2 Digital Volume", - MSM89XX_CDC_CORE_RX2_VOL_CTL_B2_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX3 Digital Volume", - MSM89XX_CDC_CORE_RX3_VOL_CTL_B2_CTL, - 0, -84, 40, digital_gain), - - SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - - SOC_SINGLE_EXT("IIR2 Enable Band1", IIR2, BAND1, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR2 Enable Band2", IIR2, BAND2, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR2 Enable Band3", IIR2, BAND3, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR2 Enable Band4", IIR2, BAND4, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR2 Enable Band5", IIR2, BAND5, 1, 0, - msm_dig_cdc_get_iir_enable_audio_mixer, - msm_dig_cdc_put_iir_enable_audio_mixer), - - SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - - SOC_SINGLE_MULTI_EXT("IIR2 Band1", IIR2, BAND1, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR2 Band2", IIR2, BAND2, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR2 Band3", IIR2, BAND3, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR2 Band4", IIR2, BAND4, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR2 Band5", IIR2, BAND5, 255, 0, 5, - msm_dig_cdc_get_iir_band_audio_mixer, - msm_dig_cdc_put_iir_band_audio_mixer), - - SOC_SINGLE("RX1 HPF Switch", - MSM89XX_CDC_CORE_RX1_B5_CTL, 2, 1, 0), - SOC_SINGLE("RX2 HPF Switch", - MSM89XX_CDC_CORE_RX2_B5_CTL, 2, 1, 0), - SOC_SINGLE("RX3 HPF Switch", - MSM89XX_CDC_CORE_RX3_B5_CTL, 2, 1, 0), - - SOC_ENUM("RX1 HPF cut off", cf_rxmix1_enum), - SOC_ENUM("RX2 HPF cut off", cf_rxmix2_enum), - SOC_ENUM("RX3 HPF cut off", cf_rxmix3_enum), - - SOC_ENUM("TX1 HPF cut off", cf_dec1_enum), - SOC_ENUM("TX2 HPF cut off", cf_dec2_enum), - SOC_ENUM("TX3 HPF cut off", cf_dec3_enum), - SOC_ENUM("TX4 HPF cut off", cf_dec4_enum), - SOC_ENUM("TX5 HPF cut off", cf_decsva_enum), - SOC_SINGLE("TX1 HPF Switch", - MSM89XX_CDC_CORE_TX1_MUX_CTL, 3, 1, 0), - SOC_SINGLE("TX2 HPF Switch", - MSM89XX_CDC_CORE_TX2_MUX_CTL, 3, 1, 0), - SOC_SINGLE("TX3 HPF Switch", - MSM89XX_CDC_CORE_TX3_MUX_CTL, 3, 1, 0), - SOC_SINGLE("TX4 HPF Switch", - MSM89XX_CDC_CORE_TX4_MUX_CTL, 3, 1, 0), - SOC_SINGLE("TX5 HPF Switch", - MSM89XX_CDC_CORE_TX5_MUX_CTL, 3, 1, 0), -}; - -static struct snd_soc_dai_ops msm_dig_dai_ops = { - .hw_params = msm_dig_cdc_hw_params, -}; - - -static struct snd_soc_dai_driver msm_codec_dais[] = { - { - .name = "msm_dig_cdc_dai_rx1", - .id = AIF1_PB, - .playback = { /* Support maximum range */ - .stream_name = "AIF1 Playback", - .channels_min = 1, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_192000, - .rate_max = 192000, - .rate_min = 8000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - }, - .ops = &msm_dig_dai_ops, - }, - { - .name = "msm_dig_cdc_dai_tx1", - .id = AIF1_CAP, - .capture = { /* Support maximum range */ - .stream_name = "AIF1 Capture", - .channels_min = 1, - .channels_max = 4, - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .ops = &msm_dig_dai_ops, - }, - { - .name = "msm_dig_cdc_dai_tx2", - .id = AIF3_SVA, - .capture = { /* Support maximum range */ - .stream_name = "AIF2 Capture", - .channels_min = 1, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .ops = &msm_dig_dai_ops, - }, - { - .name = "msm_dig_cdc_dai_vifeed", - .id = AIF2_VIFEED, - .capture = { /* Support maximum range */ - .stream_name = "AIF2 Capture", - .channels_min = 1, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .ops = &msm_dig_dai_ops, - }, -}; - -static struct regmap *msm_digital_get_regmap(struct device *dev) -{ - struct msm_dig_priv *msm_dig_cdc = dev_get_drvdata(dev); - - return msm_dig_cdc->regmap; -} - -static int msm_dig_cdc_suspend(struct snd_soc_codec *codec) -{ - struct msm_dig_priv *msm_dig_cdc = dev_get_drvdata(codec->dev); - - msm_dig_cdc->dapm_bias_off = 1; - return 0; -} - -static int msm_dig_cdc_resume(struct snd_soc_codec *codec) -{ - struct msm_dig_priv *msm_dig_cdc = dev_get_drvdata(codec->dev); - - msm_dig_cdc->dapm_bias_off = 0; - return 0; -} - -static struct snd_soc_codec_driver soc_msm_dig_codec = { - .probe = msm_dig_cdc_soc_probe, - .remove = msm_dig_cdc_soc_remove, - .suspend = msm_dig_cdc_suspend, - .resume = msm_dig_cdc_resume, - .get_regmap = msm_digital_get_regmap, - .component_driver = { - .controls = msm_dig_snd_controls, - .num_controls = ARRAY_SIZE(msm_dig_snd_controls), - .dapm_widgets = msm_dig_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(msm_dig_dapm_widgets), - .dapm_routes = audio_dig_map, - .num_dapm_routes = ARRAY_SIZE(audio_dig_map), - }, -}; - -const struct regmap_config msm_digital_regmap_config = { - .reg_bits = 32, - .reg_stride = 4, - .val_bits = 8, - .lock = enable_digital_callback, - .unlock = disable_digital_callback, - .cache_type = REGCACHE_FLAT, - .reg_defaults = msm89xx_cdc_core_defaults, - .num_reg_defaults = MSM89XX_CDC_CORE_MAX_REGISTER, - .writeable_reg = msm89xx_cdc_core_writeable_reg, - .readable_reg = msm89xx_cdc_core_readable_reg, - .volatile_reg = msm89xx_cdc_core_volatile_reg, - .reg_format_endian = REGMAP_ENDIAN_NATIVE, - .val_format_endian = REGMAP_ENDIAN_NATIVE, - .max_register = MSM89XX_CDC_CORE_MAX_REGISTER, -}; - -static int msm_dig_cdc_probe(struct platform_device *pdev) -{ - int ret; - u32 dig_cdc_addr; - struct msm_dig_priv *msm_dig_cdc; - struct dig_ctrl_platform_data *pdata; - - msm_dig_cdc = devm_kzalloc(&pdev->dev, sizeof(struct msm_dig_priv), - GFP_KERNEL); - if (!msm_dig_cdc) - return -ENOMEM; - pdata = dev_get_platdata(&pdev->dev); - if (!pdata) { - dev_err(&pdev->dev, "%s: pdata from parent is NULL\n", - __func__); - ret = -EINVAL; - goto rtn; - } - - ret = of_property_read_u32(pdev->dev.of_node, "reg", - &dig_cdc_addr); - if (ret) { - dev_err(&pdev->dev, "%s: could not find %s entry in dt\n", - __func__, "reg"); - return ret; - } - - msm_dig_cdc->dig_base = ioremap(dig_cdc_addr, - MSM89XX_CDC_CORE_MAX_REGISTER); - if (msm_dig_cdc->dig_base == NULL) { - dev_err(&pdev->dev, "%s ioremap failed\n", __func__); - return -ENOMEM; - } - msm_dig_cdc->regmap = - devm_regmap_init_mmio_clk(&pdev->dev, NULL, - msm_dig_cdc->dig_base, &msm_digital_regmap_config); - - msm_dig_cdc->update_clkdiv = pdata->update_clkdiv; - msm_dig_cdc->set_compander_mode = pdata->set_compander_mode; - msm_dig_cdc->get_cdc_version = pdata->get_cdc_version; - msm_dig_cdc->handle = pdata->handle; - msm_dig_cdc->register_notifier = pdata->register_notifier; - - dev_set_drvdata(&pdev->dev, msm_dig_cdc); - snd_soc_register_codec(&pdev->dev, &soc_msm_dig_codec, - msm_codec_dais, ARRAY_SIZE(msm_codec_dais)); - dev_dbg(&pdev->dev, "%s: registered DIG CODEC 0x%x\n", - __func__, dig_cdc_addr); -rtn: - return ret; -} - -static int msm_dig_cdc_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - -#ifdef CONFIG_PM -static int msm_dig_suspend(struct device *dev) -{ - struct msm_asoc_mach_data *pdata; - struct msm_dig_priv *msm_dig_cdc = dev_get_drvdata(dev); - - if (!registered_digcodec || !msm_dig_cdc) { - pr_debug("%s:digcodec not initialized, return\n", __func__); - return 0; - } - pdata = snd_soc_card_get_drvdata(registered_digcodec->component.card); - if (!pdata) { - pr_debug("%s:card not initialized, return\n", __func__); - return 0; - } - if (msm_dig_cdc->dapm_bias_off) { - pr_debug("%s: mclk cnt = %d, mclk_enabled = %d\n", - __func__, atomic_read(&pdata->int_mclk0_rsc_ref), - atomic_read(&pdata->int_mclk0_enabled)); - - if (atomic_read(&pdata->int_mclk0_enabled) == true) { - cancel_delayed_work_sync( - &pdata->disable_int_mclk0_work); - mutex_lock(&pdata->cdc_int_mclk0_mutex); - pdata->digital_cdc_core_clk.enable = 0; - afe_set_lpass_clock_v2(AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - atomic_set(&pdata->int_mclk0_enabled, false); - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - } - } - - return 0; -} - -static int msm_dig_resume(struct device *dev) -{ - return 0; -} - -static const struct dev_pm_ops msm_dig_pm_ops = { - .suspend_late = msm_dig_suspend, - .resume_early = msm_dig_resume, -}; -#endif - -static const struct of_device_id msm_dig_cdc_of_match[] = { - {.compatible = "qcom,msm-digital-codec"}, - {}, -}; - -static struct platform_driver msm_digcodec_driver = { - .driver = { - .owner = THIS_MODULE, - .name = DRV_NAME, - .of_match_table = msm_dig_cdc_of_match, -#ifdef CONFIG_PM - .pm = &msm_dig_pm_ops, -#endif - }, - .probe = msm_dig_cdc_probe, - .remove = msm_dig_cdc_remove, -}; -module_platform_driver(msm_digcodec_driver); - -MODULE_DESCRIPTION("MSM Audio Digital codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.h b/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.h deleted file mode 100644 index 7abb2045b79c..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/msm-digital-cdc.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MSM_DIGITAL_CDC_H -#define MSM_DIGITAL_CDC_H - -#define HPHL_PA_DISABLE (0x01 << 1) -#define HPHR_PA_DISABLE (0x01 << 2) -#define SPKR_PA_DISABLE (0x01 << 3) - -#define NUM_DECIMATORS 5 -/* Codec supports 1 compander */ -enum { - COMPANDER_NONE = 0, - COMPANDER_1, /* HPHL/R */ - COMPANDER_MAX, -}; - -/* Number of output I2S port */ -enum { - MSM89XX_RX1 = 0, - MSM89XX_RX2, - MSM89XX_RX3, - MSM89XX_RX_MAX, -}; - -struct tx_mute_work { - struct msm_dig_priv *dig_cdc; - u32 decimator; - struct delayed_work dwork; -}; - -struct msm_dig_priv { - struct snd_soc_codec *codec; - u32 comp_enabled[MSM89XX_RX_MAX]; - int (*codec_hph_comp_gpio)(bool enable, struct snd_soc_codec *codec); - s32 dmic_1_2_clk_cnt; - s32 dmic_3_4_clk_cnt; - bool dec_active[NUM_DECIMATORS]; - int version; - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - char __iomem *dig_base; - struct regmap *regmap; - struct notifier_block nblock; - u32 mute_mask; - int dapm_bias_off; - void *handle; - void (*set_compander_mode)(void *handle, int val); - void (*update_clkdiv)(void *handle, int val); - int (*get_cdc_version)(void *handle); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); - struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS]; -}; - -struct dig_ctrl_platform_data { - void *handle; - void (*set_compander_mode)(void *handle, int val); - void (*update_clkdiv)(void *handle, int val); - int (*get_cdc_version)(void *handle); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -struct hpf_work { - struct msm_dig_priv *dig_cdc; - u32 decimator; - u8 tx_hpf_cut_of_freq; - struct delayed_work dwork; -}; - -/* Codec supports 5 bands */ -enum { - BAND1 = 0, - BAND2, - BAND3, - BAND4, - BAND5, - BAND_MAX, -}; - -#if IS_ENABLED(CONFIG_SND_SOC_DIGITAL_CDC) -extern void msm_dig_cdc_hph_comp_cb( - int (*codec_hph_comp_gpio)( - bool enable, struct snd_soc_codec *codec), - struct snd_soc_codec *codec); -int msm_dig_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -#else /* CONFIG_SND_SOC_DIGITAL_CDC */ -static inline void msm_dig_cdc_hph_comp_cb( - int (*codec_hph_comp_gpio)( - bool enable, struct snd_soc_codec *codec), - struct snd_soc_codec *codec) -{ - -} -static inline int msm_dig_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_DIGITAL_CDC */ -#endif diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.c b/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.c deleted file mode 100644 index 673b738b4eac..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.c +++ /dev/null @@ -1,418 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-analog-cdc.h" -#include "sdm660-cdc-irq.h" -#include "sdm660-cdc-registers.h" - -#define MAX_NUM_IRQS 14 -#define NUM_IRQ_REGS 2 -#define WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS 700 - -#define BYTE_BIT_MASK(nr) (1UL << ((nr) % BITS_PER_BYTE)) -#define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE) - -static irqreturn_t wcd9xxx_spmi_irq_handler(int linux_irq, void *data); - -char *irq_names[MAX_NUM_IRQS] = { - "spk_cnp_int", - "spk_clip_int", - "spk_ocp_int", - "ins_rem_det1", - "but_rel_det", - "but_press_det", - "ins_rem_det", - "mbhc_int", - "ear_ocp_int", - "hphr_ocp_int", - "hphl_ocp_det", - "ear_cnp_int", - "hphr_cnp_int", - "hphl_cnp_int" -}; - -int order[MAX_NUM_IRQS] = { - MSM89XX_IRQ_SPKR_CNP, - MSM89XX_IRQ_SPKR_CLIP, - MSM89XX_IRQ_SPKR_OCP, - MSM89XX_IRQ_MBHC_INSREM_DET1, - MSM89XX_IRQ_MBHC_RELEASE, - MSM89XX_IRQ_MBHC_PRESS, - MSM89XX_IRQ_MBHC_INSREM_DET, - MSM89XX_IRQ_MBHC_HS_DET, - MSM89XX_IRQ_EAR_OCP, - MSM89XX_IRQ_HPHR_OCP, - MSM89XX_IRQ_HPHL_OCP, - MSM89XX_IRQ_EAR_CNP, - MSM89XX_IRQ_HPHR_CNP, - MSM89XX_IRQ_HPHL_CNP, -}; - -enum wcd9xxx_spmi_pm_state { - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_AWAKE, - WCD9XXX_PM_ASLEEP, -}; - -struct wcd9xxx_spmi_map { - uint8_t handled[NUM_IRQ_REGS]; - uint8_t mask[NUM_IRQ_REGS]; - int linuxirq[MAX_NUM_IRQS]; - irq_handler_t handler[MAX_NUM_IRQS]; - struct platform_device *spmi[NUM_IRQ_REGS]; - struct snd_soc_codec *codec; - - enum wcd9xxx_spmi_pm_state pm_state; - struct mutex pm_lock; - /* pm_wq notifies change of pm_state */ - wait_queue_head_t pm_wq; - struct pm_qos_request pm_qos_req; - int wlock_holders; -}; - -struct wcd9xxx_spmi_map map; - -void wcd9xxx_spmi_enable_irq(int irq) -{ - pr_debug("%s: irqno =%d\n", __func__, irq); - - if (!(map.mask[BIT_BYTE(irq)] & (BYTE_BIT_MASK(irq)))) - return; - - map.mask[BIT_BYTE(irq)] &= - ~(BYTE_BIT_MASK(irq)); - - enable_irq(map.linuxirq[irq]); -} - -void wcd9xxx_spmi_disable_irq(int irq) -{ - pr_debug("%s: irqno =%d\n", __func__, irq); - - if (map.mask[BIT_BYTE(irq)] & (BYTE_BIT_MASK(irq))) - return; - - map.mask[BIT_BYTE(irq)] |= - (BYTE_BIT_MASK(irq)); - - disable_irq_nosync(map.linuxirq[irq]); -} - -int wcd9xxx_spmi_request_irq(int irq, irq_handler_t handler, - const char *name, void *priv) -{ - int rc; - unsigned long irq_flags; - - map.linuxirq[irq] = - platform_get_irq_byname(map.spmi[BIT_BYTE(irq)], - irq_names[irq]); - - if (strcmp(name, "mbhc sw intr")) - irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | - IRQF_ONESHOT; - else - irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | - IRQF_ONESHOT | IRQF_NO_SUSPEND; - pr_debug("%s: name:%s irq_flags = %lx\n", __func__, name, irq_flags); - - rc = devm_request_threaded_irq(&map.spmi[BIT_BYTE(irq)]->dev, - map.linuxirq[irq], NULL, - wcd9xxx_spmi_irq_handler, - irq_flags, - name, priv); - if (rc < 0) { - dev_err(&map.spmi[BIT_BYTE(irq)]->dev, - "Can't request %d IRQ\n", irq); - return rc; - } - - dev_dbg(&map.spmi[BIT_BYTE(irq)]->dev, - "irq %d linuxIRQ: %d\n", irq, map.linuxirq[irq]); - map.mask[BIT_BYTE(irq)] &= ~BYTE_BIT_MASK(irq); - map.handler[irq] = handler; - enable_irq_wake(map.linuxirq[irq]); - return 0; -} - -int wcd9xxx_spmi_free_irq(int irq, void *priv) -{ - devm_free_irq(&map.spmi[BIT_BYTE(irq)]->dev, map.linuxirq[irq], - priv); - map.mask[BIT_BYTE(irq)] |= BYTE_BIT_MASK(irq); - return 0; -} - -static int get_irq_bit(int linux_irq) -{ - int i = 0; - - for (; i < MAX_NUM_IRQS; i++) - if (map.linuxirq[i] == linux_irq) - return i; - - return i; -} - -static int get_order_irq(int i) -{ - return order[i]; -} - -static irqreturn_t wcd9xxx_spmi_irq_handler(int linux_irq, void *data) -{ - int irq, i, j; - unsigned long status[NUM_IRQ_REGS] = {0}; - - if (unlikely(wcd9xxx_spmi_lock_sleep() == false)) { - pr_err("Failed to hold suspend\n"); - return IRQ_NONE; - } - - irq = get_irq_bit(linux_irq); - if (irq == MAX_NUM_IRQS) - return IRQ_HANDLED; - - status[BIT_BYTE(irq)] |= BYTE_BIT_MASK(irq); - for (i = 0; i < NUM_IRQ_REGS; i++) { - status[i] |= snd_soc_read(map.codec, - BIT_BYTE(irq) * 0x100 + - MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS); - status[i] &= ~map.mask[i]; - } - for (i = 0; i < MAX_NUM_IRQS; i++) { - j = get_order_irq(i); - if ((status[BIT_BYTE(j)] & BYTE_BIT_MASK(j)) && - ((map.handled[BIT_BYTE(j)] & - BYTE_BIT_MASK(j)) == 0)) { - map.handler[j](irq, data); - map.handled[BIT_BYTE(j)] |= - BYTE_BIT_MASK(j); - } - } - map.handled[BIT_BYTE(irq)] &= ~BYTE_BIT_MASK(irq); - wcd9xxx_spmi_unlock_sleep(); - - return IRQ_HANDLED; -} - -enum wcd9xxx_spmi_pm_state wcd9xxx_spmi_pm_cmpxchg( - enum wcd9xxx_spmi_pm_state o, - enum wcd9xxx_spmi_pm_state n) -{ - enum wcd9xxx_spmi_pm_state old; - - mutex_lock(&map.pm_lock); - old = map.pm_state; - if (old == o) - map.pm_state = n; - pr_debug("%s: map.pm_state = %d\n", __func__, map.pm_state); - mutex_unlock(&map.pm_lock); - return old; -} -EXPORT_SYMBOL(wcd9xxx_spmi_pm_cmpxchg); - -int wcd9xxx_spmi_suspend(pm_message_t pmesg) -{ - int ret = 0; - - pr_debug("%s: enter\n", __func__); - /* - * pm_qos_update_request() can be called after this suspend chain call - * started. thus suspend can be called while lock is being held - */ - mutex_lock(&map.pm_lock); - if (map.pm_state == WCD9XXX_PM_SLEEPABLE) { - pr_debug("%s: suspending system, state %d, wlock %d\n", - __func__, map.pm_state, - map.wlock_holders); - map.pm_state = WCD9XXX_PM_ASLEEP; - } else if (map.pm_state == WCD9XXX_PM_AWAKE) { - /* - * unlock to wait for pm_state == WCD9XXX_PM_SLEEPABLE - * then set to WCD9XXX_PM_ASLEEP - */ - pr_debug("%s: waiting to suspend system, state %d, wlock %d\n", - __func__, map.pm_state, - map.wlock_holders); - mutex_unlock(&map.pm_lock); - if (!(wait_event_timeout(map.pm_wq, - wcd9xxx_spmi_pm_cmpxchg( - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_ASLEEP) == - WCD9XXX_PM_SLEEPABLE, - HZ))) { - pr_debug("%s: suspend failed state %d, wlock %d\n", - __func__, map.pm_state, - map.wlock_holders); - ret = -EBUSY; - } else { - pr_debug("%s: done, state %d, wlock %d\n", __func__, - map.pm_state, - map.wlock_holders); - } - mutex_lock(&map.pm_lock); - } else if (map.pm_state == WCD9XXX_PM_ASLEEP) { - pr_warn("%s: system is already suspended, state %d, wlock %dn", - __func__, map.pm_state, - map.wlock_holders); - } - mutex_unlock(&map.pm_lock); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_spmi_suspend); - -int wcd9xxx_spmi_resume(void) -{ - int ret = 0; - - pr_debug("%s: enter\n", __func__); - mutex_lock(&map.pm_lock); - if (map.pm_state == WCD9XXX_PM_ASLEEP) { - pr_debug("%s: resuming system, state %d, wlock %d\n", __func__, - map.pm_state, - map.wlock_holders); - map.pm_state = WCD9XXX_PM_SLEEPABLE; - } else { - pr_warn("%s: system is already awake, state %d wlock %d\n", - __func__, map.pm_state, - map.wlock_holders); - } - mutex_unlock(&map.pm_lock); - wake_up_all(&map.pm_wq); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_spmi_resume); - -bool wcd9xxx_spmi_lock_sleep(void) -{ - /* - * wcd9xxx_spmi_{lock/unlock}_sleep will be called by - * wcd9xxx_spmi_irq_thread - * and its subroutines only motly. - * but btn0_lpress_fn is not wcd9xxx_spmi_irq_thread's subroutine and - * It can race with wcd9xxx_spmi_irq_thread. - * So need to embrace wlock_holders with mutex. - */ - mutex_lock(&map.pm_lock); - if (map.wlock_holders++ == 0) { - pr_debug("%s: holding wake lock\n", __func__); - pm_qos_update_request(&map.pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - pm_stay_awake(&map.spmi[0]->dev); - } - mutex_unlock(&map.pm_lock); - pr_debug("%s: wake lock counter %d\n", __func__, - map.wlock_holders); - pr_debug("%s: map.pm_state = %d\n", __func__, map.pm_state); - - if (!wait_event_timeout(map.pm_wq, - ((wcd9xxx_spmi_pm_cmpxchg( - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_AWAKE)) == - WCD9XXX_PM_SLEEPABLE || - (wcd9xxx_spmi_pm_cmpxchg( - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_AWAKE) == - WCD9XXX_PM_AWAKE)), - msecs_to_jiffies( - WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS))) { - pr_warn("%s: system didn't resume within %dms, s %d, w %d\n", - __func__, - WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS, map.pm_state, - map.wlock_holders); - wcd9xxx_spmi_unlock_sleep(); - return false; - } - wake_up_all(&map.pm_wq); - pr_debug("%s: leaving pm_state = %d\n", __func__, map.pm_state); - return true; -} -EXPORT_SYMBOL(wcd9xxx_spmi_lock_sleep); - -void wcd9xxx_spmi_unlock_sleep(void) -{ - mutex_lock(&map.pm_lock); - if (--map.wlock_holders == 0) { - pr_debug("%s: releasing wake lock pm_state %d -> %d\n", - __func__, map.pm_state, WCD9XXX_PM_SLEEPABLE); - /* - * if wcd9xxx_spmi_lock_sleep failed, pm_state would be still - * WCD9XXX_PM_ASLEEP, don't overwrite - */ - if (likely(map.pm_state == WCD9XXX_PM_AWAKE)) - map.pm_state = WCD9XXX_PM_SLEEPABLE; - pm_qos_update_request(&map.pm_qos_req, - PM_QOS_DEFAULT_VALUE); - pm_relax(&map.spmi[0]->dev); - } - mutex_unlock(&map.pm_lock); - pr_debug("%s: wake lock counter %d\n", __func__, - map.wlock_holders); - pr_debug("%s: map.pm_state = %d\n", __func__, map.pm_state); - wake_up_all(&map.pm_wq); -} -EXPORT_SYMBOL(wcd9xxx_spmi_unlock_sleep); - -void wcd9xxx_spmi_set_codec(struct snd_soc_codec *codec) -{ - map.codec = codec; -} - -void wcd9xxx_spmi_set_dev(struct platform_device *spmi, int i) -{ - if (i < NUM_IRQ_REGS) - map.spmi[i] = spmi; -} - -int wcd9xxx_spmi_irq_init(void) -{ - int i = 0; - - for (; i < MAX_NUM_IRQS; i++) - map.mask[BIT_BYTE(i)] |= BYTE_BIT_MASK(i); - mutex_init(&map.pm_lock); - map.wlock_holders = 0; - map.pm_state = WCD9XXX_PM_SLEEPABLE; - init_waitqueue_head(&map.pm_wq); - pm_qos_add_request(&map.pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - return 0; -} - -void wcd9xxx_spmi_irq_exit(void) -{ - pm_qos_remove_request(&map.pm_qos_req); - mutex_destroy(&map.pm_lock); -} -MODULE_DESCRIPTION("MSM8x16 SPMI IRQ driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.h b/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.h deleted file mode 100644 index 0b9b56e12b8a..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-irq.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD9XXX_SPMI_IRQ_H__ -#define __WCD9XXX_SPMI_IRQ_H__ - -#include -#include -#include -#include -#include - -extern void wcd9xxx_spmi_enable_irq(int irq); -extern void wcd9xxx_spmi_disable_irq(int irq); -extern int wcd9xxx_spmi_request_irq(int irq, irq_handler_t handler, - const char *name, void *priv); -extern int wcd9xxx_spmi_free_irq(int irq, void *priv); -extern void wcd9xxx_spmi_set_codec(struct snd_soc_codec *codec); -extern void wcd9xxx_spmi_set_dev(struct platform_device *spmi, int i); -extern int wcd9xxx_spmi_irq_init(void); -extern void wcd9xxx_spmi_irq_exit(void); -extern int wcd9xxx_spmi_suspend(pm_message_t pmesg); -extern int wcd9xxx_spmi_resume(void); -bool wcd9xxx_spmi_lock_sleep(void); -void wcd9xxx_spmi_unlock_sleep(void); - -#endif diff --git a/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-registers.h b/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-registers.h deleted file mode 100644 index 1317ce169755..000000000000 --- a/techpack/audio/asoc/codecs/sdm660_cdc/sdm660-cdc-registers.h +++ /dev/null @@ -1,603 +0,0 @@ -/* 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef SDM660_WCD_REGISTERS_H -#define SDM660_WCD_REGISTERS_H - -#define CDC_DIG_BASE 0xF000 -#define CDC_ANA_BASE 0xF100 - -#define MSM89XX_PMIC_DIGITAL_REVISION1 (CDC_DIG_BASE+0x000) -#define MSM89XX_PMIC_DIGITAL_REVISION1__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_REVISION2 (CDC_DIG_BASE+0x001) -#define MSM89XX_PMIC_DIGITAL_REVISION2__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_PERPH_TYPE (CDC_DIG_BASE+0x004) -#define MSM89XX_PMIC_DIGITAL_PERPH_TYPE__POR (0x23) -#define MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE (CDC_DIG_BASE+0x005) -#define MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE__POR (0x01) -#define MSM89XX_PMIC_DIGITAL_INT_RT_STS (CDC_DIG_BASE+0x010) -#define MSM89XX_PMIC_DIGITAL_INT_RT_STS__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_SET_TYPE (CDC_DIG_BASE+0x011) -#define MSM89XX_PMIC_DIGITAL_INT_SET_TYPE__POR (0xFF) -#define MSM89XX_PMIC_DIGITAL_INT_POLARITY_HIGH (CDC_DIG_BASE+0x012) -#define MSM89XX_PMIC_DIGITAL_INT_POLARITY_HIGH__POR (0xFF) -#define MSM89XX_PMIC_DIGITAL_INT_POLARITY_LOW (CDC_DIG_BASE+0x013) -#define MSM89XX_PMIC_DIGITAL_INT_POLARITY_LOW__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_LATCHED_CLR (CDC_DIG_BASE+0x014) -#define MSM89XX_PMIC_DIGITAL_INT_LATCHED_CLR__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_EN_SET (CDC_DIG_BASE+0x015) -#define MSM89XX_PMIC_DIGITAL_INT_EN_SET__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_EN_CLR (CDC_DIG_BASE+0x016) -#define MSM89XX_PMIC_DIGITAL_INT_EN_CLR__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS (CDC_DIG_BASE+0x018) -#define MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_PENDING_STS (CDC_DIG_BASE+0x019) -#define MSM89XX_PMIC_DIGITAL_INT_PENDING_STS__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_MID_SEL (CDC_DIG_BASE+0x01A) -#define MSM89XX_PMIC_DIGITAL_INT_MID_SEL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_PRIORITY (CDC_DIG_BASE+0x01B) -#define MSM89XX_PMIC_DIGITAL_INT_PRIORITY__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_GPIO_MODE (CDC_DIG_BASE+0x040) -#define MSM89XX_PMIC_DIGITAL_GPIO_MODE__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_PIN_CTL_OE (CDC_DIG_BASE+0x041) -#define MSM89XX_PMIC_DIGITAL_PIN_CTL_OE__POR (0x01) -#define MSM89XX_PMIC_DIGITAL_PIN_CTL_DATA (CDC_DIG_BASE+0x042) -#define MSM89XX_PMIC_DIGITAL_PIN_CTL_DATA__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_PIN_STATUS (CDC_DIG_BASE+0x043) -#define MSM89XX_PMIC_DIGITAL_PIN_STATUS__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_HDRIVE_CTL (CDC_DIG_BASE+0x044) -#define MSM89XX_PMIC_DIGITAL_HDRIVE_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_RST_CTL (CDC_DIG_BASE+0x046) -#define MSM89XX_PMIC_DIGITAL_CDC_RST_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL (CDC_DIG_BASE+0x048) -#define MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL (CDC_DIG_BASE+0x049) -#define MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL (CDC_DIG_BASE+0x04A) -#define MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL (CDC_DIG_BASE+0x050) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL__POR (0x02) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL (CDC_DIG_BASE+0x051) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL__POR (0x02) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL (CDC_DIG_BASE+0x052) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX1_CTL (CDC_DIG_BASE+0x053) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX1_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX2_CTL (CDC_DIG_BASE+0x054) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX2_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX3_CTL (CDC_DIG_BASE+0x055) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX3_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX_LB_CTL (CDC_DIG_BASE+0x056) -#define MSM89XX_PMIC_DIGITAL_CDC_CONN_RX_LB_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_CDC_RX_CTL1 (CDC_DIG_BASE+0x058) -#define MSM89XX_PMIC_DIGITAL_CDC_RX_CTL1__POR (0x7C) -#define MSM89XX_PMIC_DIGITAL_CDC_RX_CTL2 (CDC_DIG_BASE+0x059) -#define MSM89XX_PMIC_DIGITAL_CDC_RX_CTL2__POR (0x7C) -#define MSM89XX_PMIC_DIGITAL_CDC_RX_CTL3 (CDC_DIG_BASE+0x05A) -#define MSM89XX_PMIC_DIGITAL_CDC_RX_CTL3__POR (0x7C) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA0 (CDC_DIG_BASE+0x05B) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA0__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA1 (CDC_DIG_BASE+0x05C) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA1__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA2 (CDC_DIG_BASE+0x05D) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA2__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA3 (CDC_DIG_BASE+0x05E) -#define MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA3__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_DIG_DEBUG_CTL (CDC_DIG_BASE+0x068) -#define MSM89XX_PMIC_DIGITAL_DIG_DEBUG_CTL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_DIG_DEBUG_EN (CDC_DIG_BASE+0x069) -#define MSM89XX_PMIC_DIGITAL_DIG_DEBUG_EN__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_SPARE_0 (CDC_DIG_BASE+0x070) -#define MSM89XX_PMIC_DIGITAL_SPARE_0__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_SPARE_1 (CDC_DIG_BASE+0x071) -#define MSM89XX_PMIC_DIGITAL_SPARE_1__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_SPARE_2 (CDC_DIG_BASE+0x072) -#define MSM89XX_PMIC_DIGITAL_SPARE_2__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_SEC_ACCESS (CDC_DIG_BASE+0x0D0) -#define MSM89XX_PMIC_DIGITAL_SEC_ACCESS__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL1 (CDC_DIG_BASE+0x0D8) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL1__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL2 (CDC_DIG_BASE+0x0D9) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL2__POR (0x01) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3 (CDC_DIG_BASE+0x0DA) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3__POR (0x05) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4 (CDC_DIG_BASE+0x0DB) -#define MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_TEST1 (CDC_DIG_BASE+0x0E0) -#define MSM89XX_PMIC_DIGITAL_INT_TEST1__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_INT_TEST_VAL (CDC_DIG_BASE+0x0E1) -#define MSM89XX_PMIC_DIGITAL_INT_TEST_VAL__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_TRIM_NUM (CDC_DIG_BASE+0x0F0) -#define MSM89XX_PMIC_DIGITAL_TRIM_NUM__POR (0x00) -#define MSM89XX_PMIC_DIGITAL_TRIM_CTRL (CDC_DIG_BASE+0x0F1) -#define MSM89XX_PMIC_DIGITAL_TRIM_CTRL__POR (0x00) - -#define MSM89XX_PMIC_ANALOG_REVISION1 (CDC_ANA_BASE+0x00) -#define MSM89XX_PMIC_ANALOG_REVISION1__POR (0x00) -#define MSM89XX_PMIC_ANALOG_REVISION2 (CDC_ANA_BASE+0x01) -#define MSM89XX_PMIC_ANALOG_REVISION2__POR (0x00) -#define MSM89XX_PMIC_ANALOG_REVISION3 (CDC_ANA_BASE+0x02) -#define MSM89XX_PMIC_ANALOG_REVISION3__POR (0x00) -#define MSM89XX_PMIC_ANALOG_REVISION4 (CDC_ANA_BASE+0x03) -#define MSM89XX_PMIC_ANALOG_REVISION4__POR (0x00) -#define MSM89XX_PMIC_ANALOG_PERPH_TYPE (CDC_ANA_BASE+0x04) -#define MSM89XX_PMIC_ANALOG_PERPH_TYPE__POR (0x23) -#define MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE (CDC_ANA_BASE+0x05) -#define MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE__POR (0x09) -#define MSM89XX_PMIC_ANALOG_INT_RT_STS (CDC_ANA_BASE+0x10) -#define MSM89XX_PMIC_ANALOG_INT_RT_STS__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_SET_TYPE (CDC_ANA_BASE+0x11) -#define MSM89XX_PMIC_ANALOG_INT_SET_TYPE__POR (0x3F) -#define MSM89XX_PMIC_ANALOG_INT_POLARITY_HIGH (CDC_ANA_BASE+0x12) -#define MSM89XX_PMIC_ANALOG_INT_POLARITY_HIGH__POR (0x3F) -#define MSM89XX_PMIC_ANALOG_INT_POLARITY_LOW (CDC_ANA_BASE+0x13) -#define MSM89XX_PMIC_ANALOG_INT_POLARITY_LOW__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_LATCHED_CLR (CDC_ANA_BASE+0x14) -#define MSM89XX_PMIC_ANALOG_INT_LATCHED_CLR__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_EN_SET (CDC_ANA_BASE+0x15) -#define MSM89XX_PMIC_ANALOG_INT_EN_SET__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_EN_CLR (CDC_ANA_BASE+0x16) -#define MSM89XX_PMIC_ANALOG_INT_EN_CLR__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_LATCHED_STS (CDC_ANA_BASE+0x18) -#define MSM89XX_PMIC_ANALOG_INT_LATCHED_STS__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_PENDING_STS (CDC_ANA_BASE+0x19) -#define MSM89XX_PMIC_ANALOG_INT_PENDING_STS__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_MID_SEL (CDC_ANA_BASE+0x1A) -#define MSM89XX_PMIC_ANALOG_INT_MID_SEL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_PRIORITY (CDC_ANA_BASE+0x1B) -#define MSM89XX_PMIC_ANALOG_INT_PRIORITY__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MICB_1_EN (CDC_ANA_BASE+0x40) -#define MSM89XX_PMIC_ANALOG_MICB_1_EN__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MICB_1_VAL (CDC_ANA_BASE+0x41) -#define MSM89XX_PMIC_ANALOG_MICB_1_VAL__POR (0x20) -#define MSM89XX_PMIC_ANALOG_MICB_1_CTL (CDC_ANA_BASE+0x42) -#define MSM89XX_PMIC_ANALOG_MICB_1_CTL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS (CDC_ANA_BASE+0x43) -#define MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS__POR (0x49) -#define MSM89XX_PMIC_ANALOG_MICB_2_EN (CDC_ANA_BASE+0x44) -#define MSM89XX_PMIC_ANALOG_MICB_2_EN__POR (0x20) -#define MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2 (CDC_ANA_BASE+0x45) -#define MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL (CDC_ANA_BASE+0x46) -#define MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1 (CDC_ANA_BASE+0x47) -#define MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1__POR (0x35) -#define MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2 (CDC_ANA_BASE+0x50) -#define MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2__POR (0x08) -#define MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL (CDC_ANA_BASE+0x51) -#define MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER (CDC_ANA_BASE+0x52) -#define MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER__POR (0x98) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL (CDC_ANA_BASE+0x53) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL (CDC_ANA_BASE+0x54) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL__POR (0x20) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL (CDC_ANA_BASE+0x55) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL__POR (0x40) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL (CDC_ANA_BASE+0x56) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL__POR (0x61) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN4_CTL (CDC_ANA_BASE+0x57) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN4_CTL__POR (0x80) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT (CDC_ANA_BASE+0x58) -#define MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT__POR (0x00) -#define MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT (CDC_ANA_BASE+0x59) -#define MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT__POR (0x00) -#define MSM89XX_PMIC_ANALOG_TX_1_EN (CDC_ANA_BASE+0x60) -#define MSM89XX_PMIC_ANALOG_TX_1_EN__POR (0x03) -#define MSM89XX_PMIC_ANALOG_TX_2_EN (CDC_ANA_BASE+0x61) -#define MSM89XX_PMIC_ANALOG_TX_2_EN__POR (0x03) -#define MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_1 (CDC_ANA_BASE+0x62) -#define MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_1__POR (0xBF) -#define MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2 (CDC_ANA_BASE+0x63) -#define MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2__POR (0x8C) -#define MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL (CDC_ANA_BASE+0x64) -#define MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS (CDC_ANA_BASE+0x65) -#define MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS__POR (0x6B) -#define MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV (CDC_ANA_BASE+0x66) -#define MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV__POR (0x51) -#define MSM89XX_PMIC_ANALOG_TX_3_EN (CDC_ANA_BASE+0x67) -#define MSM89XX_PMIC_ANALOG_TX_3_EN__POR (0x02) -#define MSM89XX_PMIC_ANALOG_NCP_EN (CDC_ANA_BASE+0x80) -#define MSM89XX_PMIC_ANALOG_NCP_EN__POR (0x26) -#define MSM89XX_PMIC_ANALOG_NCP_CLK (CDC_ANA_BASE+0x81) -#define MSM89XX_PMIC_ANALOG_NCP_CLK__POR (0x23) -#define MSM89XX_PMIC_ANALOG_NCP_DEGLITCH (CDC_ANA_BASE+0x82) -#define MSM89XX_PMIC_ANALOG_NCP_DEGLITCH__POR (0x5B) -#define MSM89XX_PMIC_ANALOG_NCP_FBCTRL (CDC_ANA_BASE+0x83) -#define MSM89XX_PMIC_ANALOG_NCP_FBCTRL__POR (0x08) -#define MSM89XX_PMIC_ANALOG_NCP_BIAS (CDC_ANA_BASE+0x84) -#define MSM89XX_PMIC_ANALOG_NCP_BIAS__POR (0x29) -#define MSM89XX_PMIC_ANALOG_NCP_VCTRL (CDC_ANA_BASE+0x85) -#define MSM89XX_PMIC_ANALOG_NCP_VCTRL__POR (0x24) -#define MSM89XX_PMIC_ANALOG_NCP_TEST (CDC_ANA_BASE+0x86) -#define MSM89XX_PMIC_ANALOG_NCP_TEST__POR (0x00) -#define MSM89XX_PMIC_ANALOG_NCP_CLIM_ADDR (CDC_ANA_BASE+0x87) -#define MSM89XX_PMIC_ANALOG_NCP_CLIM_ADDR__POR (0xD5) -#define MSM89XX_PMIC_ANALOG_RX_CLOCK_DIVIDER (CDC_ANA_BASE+0x90) -#define MSM89XX_PMIC_ANALOG_RX_CLOCK_DIVIDER__POR (0xE8) -#define MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL (CDC_ANA_BASE+0x91) -#define MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL__POR (0xCF) -#define MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT (CDC_ANA_BASE+0x92) -#define MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT__POR (0x6E) -#define MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC (CDC_ANA_BASE+0x93) -#define MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC__POR (0x18) -#define MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA (CDC_ANA_BASE+0x94) -#define MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA__POR (0x5A) -#define MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_LDO_OCP (CDC_ANA_BASE+0x95) -#define MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_LDO_OCP__POR (0x69) -#define MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP (CDC_ANA_BASE+0x96) -#define MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP__POR (0x29) -#define MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN (CDC_ANA_BASE+0x97) -#define MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN__POR (0x80) -#define MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_CTL (CDC_ANA_BASE+0x98) -#define MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_CTL__POR (0xDA) -#define MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME (CDC_ANA_BASE+0x99) -#define MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME__POR (0x16) -#define MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST (CDC_ANA_BASE+0x9A) -#define MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST__POR (0x00) -#define MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL (CDC_ANA_BASE+0x9B) -#define MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL__POR (0x20) -#define MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST (CDC_ANA_BASE+0x9C) -#define MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST__POR (0x00) -#define MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL (CDC_ANA_BASE+0x9D) -#define MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL__POR (0x20) -#define MSM89XX_PMIC_ANALOG_RX_EAR_CTL (CDC_ANA_BASE+0x9E) -#define MSM89XX_PMIC_ANALOG_RX_EAR_CTL___POR (0x12) -#define MSM89XX_PMIC_ANALOG_RX_ATEST (CDC_ANA_BASE+0x9F) -#define MSM89XX_PMIC_ANALOG_RX_ATEST__POR (0x00) -#define MSM89XX_PMIC_ANALOG_RX_HPH_STATUS (CDC_ANA_BASE+0xA0) -#define MSM89XX_PMIC_ANALOG_RX_HPH_STATUS__POR (0x0C) -#define MSM89XX_PMIC_ANALOG_RX_EAR_STATUS (CDC_ANA_BASE+0xA1) -#define MSM89XX_PMIC_ANALOG_RX_EAR_STATUS__POR (0x00) -#define MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL (CDC_ANA_BASE+0xAC) -#define MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL (CDC_ANA_BASE+0xAD) -#define MSM89XX_PMIC_ANALOG_RX_RX_LO_EN_CTL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL (CDC_ANA_BASE+0xB0) -#define MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL__POR (0x83) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_CLIP_DET (CDC_ANA_BASE+0xB1) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_CLIP_DET__POR (0x91) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL (CDC_ANA_BASE+0xB2) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL__POR (0x29) -#define MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET (CDC_ANA_BASE+0xB3) -#define MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET__POR (0x4D) -#define MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL (CDC_ANA_BASE+0xB4) -#define MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL__POR (0xE1) -#define MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL (CDC_ANA_BASE+0xB5) -#define MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL__POR (0x1E) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_MISC (CDC_ANA_BASE+0xB6) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_MISC__POR (0xCB) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG (CDC_ANA_BASE+0xB7) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG__POR (0x00) -#define MSM89XX_PMIC_ANALOG_CURRENT_LIMIT (CDC_ANA_BASE+0xC0) -#define MSM89XX_PMIC_ANALOG_CURRENT_LIMIT__POR (0x02) -#define MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE (CDC_ANA_BASE+0xC1) -#define MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE__POR (0x14) -#define MSM89XX_PMIC_ANALOG_BYPASS_MODE (CDC_ANA_BASE+0xC2) -#define MSM89XX_PMIC_ANALOG_BYPASS_MODE__POR (0x00) -#define MSM89XX_PMIC_ANALOG_BOOST_EN_CTL (CDC_ANA_BASE+0xC3) -#define MSM89XX_PMIC_ANALOG_BOOST_EN_CTL__POR (0x1F) -#define MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO (CDC_ANA_BASE+0xC4) -#define MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO__POR (0x8C) -#define MSM89XX_PMIC_ANALOG_RDSON_MAX_DUTY_CYCLE (CDC_ANA_BASE+0xC5) -#define MSM89XX_PMIC_ANALOG_RDSON_MAX_DUTY_CYCLE__POR (0xC0) -#define MSM89XX_PMIC_ANALOG_BOOST_TEST1_1 (CDC_ANA_BASE+0xC6) -#define MSM89XX_PMIC_ANALOG_BOOST_TEST1_1__POR (0x00) -#define MSM89XX_PMIC_ANALOG_BOOST_TEST_2 (CDC_ANA_BASE+0xC7) -#define MSM89XX_PMIC_ANALOG_BOOST_TEST_2__POR (0x00) -#define MSM89XX_PMIC_ANALOG_SPKR_SAR_STATUS (CDC_ANA_BASE+0xC8) -#define MSM89XX_PMIC_ANALOG_SPKR_SAR_STATUS__POR (0x00) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_STATUS (CDC_ANA_BASE+0xC9) -#define MSM89XX_PMIC_ANALOG_SPKR_DRV_STATUS__POR (0x00) -#define MSM89XX_PMIC_ANALOG_PBUS_ADD_CSR (CDC_ANA_BASE+0xCE) -#define MSM89XX_PMIC_ANALOG_PBUS_ADD_CSR__POR (0x00) -#define MSM89XX_PMIC_ANALOG_PBUS_ADD_SEL (CDC_ANA_BASE+0xCF) -#define MSM89XX_PMIC_ANALOG_PBUS_ADD_SEL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_SEC_ACCESS (CDC_ANA_BASE+0xD0) -#define MSM89XX_PMIC_ANALOG_SEC_ACCESS__POR (0x00) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL1 (CDC_ANA_BASE+0xD8) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL1__POR (0x00) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL2 (CDC_ANA_BASE+0xD9) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL2__POR (0x01) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3 (CDC_ANA_BASE+0xDA) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3__POR (0x05) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4 (CDC_ANA_BASE+0xDB) -#define MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_TEST1 (CDC_ANA_BASE+0xE0) -#define MSM89XX_PMIC_ANALOG_INT_TEST1__POR (0x00) -#define MSM89XX_PMIC_ANALOG_INT_TEST_VAL (CDC_ANA_BASE+0xE1) -#define MSM89XX_PMIC_ANALOG_INT_TEST_VAL__POR (0x00) -#define MSM89XX_PMIC_ANALOG_TRIM_NUM (CDC_ANA_BASE+0xF0) -#define MSM89XX_PMIC_ANALOG_TRIM_NUM__POR (0x04) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL1 (CDC_ANA_BASE+0xF1) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL1__POR (0x00) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL2 (CDC_ANA_BASE+0xF2) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL2__POR (0x00) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL3 (CDC_ANA_BASE+0xF3) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL3__POR (0x00) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL4 (CDC_ANA_BASE+0xF4) -#define MSM89XX_PMIC_ANALOG_TRIM_CTRL4__POR (0x00) - -#define MSM89XX_PMIC_CDC_NUM_REGISTERS \ - (MSM89XX_PMIC_ANALOG_TRIM_CTRL4+1) -#define MSM89XX_PMIC_CDC_MAX_REGISTER \ - (MSM89XX_PMIC_CDC_NUM_REGISTERS-1) -#define MSM89XX_PMIC_CDC_CACHE_SIZE \ - MSM89XX_PMIC_CDC_NUM_REGISTERS - - -#define MSM89XX_CDC_CORE_CLK_RX_RESET_CTL (0x00) -#define MSM89XX_CDC_CORE_CLK_RX_RESET_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL (0x04) -#define MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_DMIC_B1_CTL (0x08) -#define MSM89XX_CDC_CORE_CLK_DMIC_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_RX_I2S_CTL (0x0C) -#define MSM89XX_CDC_CORE_CLK_RX_I2S_CTL__POR (0x13) -#define MSM89XX_CDC_CORE_CLK_TX_I2S_CTL (0x10) -#define MSM89XX_CDC_CORE_CLK_TX_I2S_CTL__POR (0x13) -#define MSM89XX_CDC_CORE_CLK_OTHR_RESET_B1_CTL (0x14) -#define MSM89XX_CDC_CORE_CLK_OTHR_RESET_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL (0x18) -#define MSM89XX_CDC_CORE_CLK_TX_CLK_EN_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_OTHR_CTL (0x1C) -#define MSM89XX_CDC_CORE_CLK_OTHR_CTL__POR (0x04) -#define MSM89XX_CDC_CORE_CLK_RX_B1_CTL (0x20) -#define MSM89XX_CDC_CORE_CLK_RX_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_MCLK_CTL (0x24) -#define MSM89XX_CDC_CORE_CLK_MCLK_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_PDM_CTL (0x28) -#define MSM89XX_CDC_CORE_CLK_PDM_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_SD_CTL (0x2C) -#define MSM89XX_CDC_CORE_CLK_SD_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_DMIC_B2_CTL (0x30) -#define MSM89XX_CDC_CORE_CLK_DMIC_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_RX_B2_CTL (0x34) -#define MSM89XX_CDC_CORE_CLK_RX_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CLK_TX2_I2S_CTL (0x38) -#define MSM89XX_CDC_CORE_CLK_TX2_I2S_CTL__POR (0x13) -#define MSM89XX_CDC_CORE_RX1_B1_CTL (0x40) -#define MSM89XX_CDC_CORE_RX1_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX2_B1_CTL (0x60) -#define MSM89XX_CDC_CORE_RX2_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX3_B1_CTL (0x80) -#define MSM89XX_CDC_CORE_RX3_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX1_B2_CTL (0x44) -#define MSM89XX_CDC_CORE_RX1_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX2_B2_CTL (0x64) -#define MSM89XX_CDC_CORE_RX2_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX3_B2_CTL (0x84) -#define MSM89XX_CDC_CORE_RX3_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX1_B3_CTL (0x48) -#define MSM89XX_CDC_CORE_RX1_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX2_B3_CTL (0x68) -#define MSM89XX_CDC_CORE_RX2_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX3_B3_CTL (0x88) -#define MSM89XX_CDC_CORE_RX3_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX1_B4_CTL (0x4C) -#define MSM89XX_CDC_CORE_RX1_B4_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX2_B4_CTL (0x6C) -#define MSM89XX_CDC_CORE_RX2_B4_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX3_B4_CTL (0x8C) -#define MSM89XX_CDC_CORE_RX3_B4_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX1_B5_CTL (0x50) -#define MSM89XX_CDC_CORE_RX1_B5_CTL__POR (0x68) -#define MSM89XX_CDC_CORE_RX2_B5_CTL (0x70) -#define MSM89XX_CDC_CORE_RX2_B5_CTL__POR (0x68) -#define MSM89XX_CDC_CORE_RX3_B5_CTL (0x90) -#define MSM89XX_CDC_CORE_RX3_B5_CTL__POR (0x68) -#define MSM89XX_CDC_CORE_RX1_B6_CTL (0x54) -#define MSM89XX_CDC_CORE_RX1_B6_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX2_B6_CTL (0x74) -#define MSM89XX_CDC_CORE_RX2_B6_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX3_B6_CTL (0x94) -#define MSM89XX_CDC_CORE_RX3_B6_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX1_VOL_CTL_B1_CTL (0x58) -#define MSM89XX_CDC_CORE_RX1_VOL_CTL_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX2_VOL_CTL_B1_CTL (0x78) -#define MSM89XX_CDC_CORE_RX2_VOL_CTL_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX3_VOL_CTL_B1_CTL (0x98) -#define MSM89XX_CDC_CORE_RX3_VOL_CTL_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX1_VOL_CTL_B2_CTL (0x5C) -#define MSM89XX_CDC_CORE_RX1_VOL_CTL_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX2_VOL_CTL_B2_CTL (0x7C) -#define MSM89XX_CDC_CORE_RX2_VOL_CTL_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_RX3_VOL_CTL_B2_CTL (0x9C) -#define MSM89XX_CDC_CORE_RX3_VOL_CTL_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TOP_GAIN_UPDATE (0xA0) -#define MSM89XX_CDC_CORE_TOP_GAIN_UPDATE__POR (0x00) -#define MSM89XX_CDC_CORE_TOP_CTL (0xA4) -#define MSM89XX_CDC_CORE_TOP_CTL__POR (0x01) -#define MSM89XX_CDC_CORE_COMP0_B1_CTL (0xB0) -#define MSM89XX_CDC_CORE_COMP0_B1_CTL__POR (0x30) -#define MSM89XX_CDC_CORE_COMP0_B2_CTL (0xB4) -#define MSM89XX_CDC_CORE_COMP0_B2_CTL__POR (0xB5) -#define MSM89XX_CDC_CORE_COMP0_B3_CTL (0xB8) -#define MSM89XX_CDC_CORE_COMP0_B3_CTL__POR (0x28) -#define MSM89XX_CDC_CORE_COMP0_B4_CTL (0xBC) -#define MSM89XX_CDC_CORE_COMP0_B4_CTL__POR (0x37) -#define MSM89XX_CDC_CORE_COMP0_B5_CTL (0xC0) -#define MSM89XX_CDC_CORE_COMP0_B5_CTL__POR (0x7F) -#define MSM89XX_CDC_CORE_COMP0_B6_CTL (0xC4) -#define MSM89XX_CDC_CORE_COMP0_B6_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_COMP0_SHUT_DOWN_STATUS (0xC8) -#define MSM89XX_CDC_CORE_COMP0_SHUT_DOWN_STATUS__POR (0x03) -#define MSM89XX_CDC_CORE_COMP0_FS_CFG (0xCC) -#define MSM89XX_CDC_CORE_COMP0_FS_CFG__POR (0x03) -#define MSM89XX_CDC_CORE_COMP0_DELAY_BUF_CTL (0xD0) -#define MSM89XX_CDC_CORE_COMP0_DELAY_BUF_CTL__POR (0x02) -#define MSM89XX_CDC_CORE_DEBUG_DESER1_CTL (0xE0) -#define MSM89XX_CDC_CORE_DEBUG_DESER1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_DEBUG_DESER2_CTL (0xE4) -#define MSM89XX_CDC_CORE_DEBUG_DESER2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_DEBUG_B1_CTL_CFG (0xE8) -#define MSM89XX_CDC_CORE_DEBUG_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_DEBUG_B2_CTL_CFG (0xEC) -#define MSM89XX_CDC_CORE_DEBUG_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_DEBUG_B3_CTL_CFG (0xF0) -#define MSM89XX_CDC_CORE_DEBUG_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B1_CTL (0x100) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B1_CTL (0x140) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B2_CTL (0x104) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B2_CTL (0x144) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B3_CTL (0x108) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B3_CTL (0x148) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B4_CTL (0x10C) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B4_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B4_CTL (0x14C) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B4_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B5_CTL (0x110) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B5_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B5_CTL (0x150) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B5_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B6_CTL (0x114) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B6_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B6_CTL (0x154) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B6_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B7_CTL (0x118) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B7_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B7_CTL (0x158) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B7_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B8_CTL (0x11C) -#define MSM89XX_CDC_CORE_IIR1_GAIN_B8_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B8_CTL (0x15C) -#define MSM89XX_CDC_CORE_IIR2_GAIN_B8_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_CTL (0x120) -#define MSM89XX_CDC_CORE_IIR1_CTL__POR (0x40) -#define MSM89XX_CDC_CORE_IIR2_CTL (0x160) -#define MSM89XX_CDC_CORE_IIR2_CTL__POR (0x40) -#define MSM89XX_CDC_CORE_IIR1_GAIN_TIMER_CTL (0x124) -#define MSM89XX_CDC_CORE_IIR1_GAIN_TIMER_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_GAIN_TIMER_CTL (0x164) -#define MSM89XX_CDC_CORE_IIR2_GAIN_TIMER_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL (0x128) -#define MSM89XX_CDC_CORE_IIR1_COEF_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_COEF_B1_CTL (0x168) -#define MSM89XX_CDC_CORE_IIR2_COEF_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL (0x12C) -#define MSM89XX_CDC_CORE_IIR1_COEF_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_IIR2_COEF_B2_CTL (0x16C) -#define MSM89XX_CDC_CORE_IIR2_COEF_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX1_B1_CTL (0x180) -#define MSM89XX_CDC_CORE_CONN_RX1_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX1_B2_CTL (0x184) -#define MSM89XX_CDC_CORE_CONN_RX1_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX1_B3_CTL (0x188) -#define MSM89XX_CDC_CORE_CONN_RX1_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX2_B1_CTL (0x18C) -#define MSM89XX_CDC_CORE_CONN_RX2_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX2_B2_CTL (0x190) -#define MSM89XX_CDC_CORE_CONN_RX2_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX2_B3_CTL (0x194) -#define MSM89XX_CDC_CORE_CONN_RX2_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX3_B1_CTL (0x198) -#define MSM89XX_CDC_CORE_CONN_RX3_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_RX3_B2_CTL (0x19C) -#define MSM89XX_CDC_CORE_CONN_RX3_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_TX_B1_CTL (0x1A0) -#define MSM89XX_CDC_CORE_CONN_TX_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_TX_B2_CTL (0x1A4) -#define MSM89XX_CDC_CORE_CONN_TX_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ1_B1_CTL (0x1A8) -#define MSM89XX_CDC_CORE_CONN_EQ1_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ1_B2_CTL (0x1AC) -#define MSM89XX_CDC_CORE_CONN_EQ1_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ1_B3_CTL (0x1B0) -#define MSM89XX_CDC_CORE_CONN_EQ1_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ1_B4_CTL (0x1B4) -#define MSM89XX_CDC_CORE_CONN_EQ1_B4_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ2_B1_CTL (0x1B8) -#define MSM89XX_CDC_CORE_CONN_EQ2_B1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ2_B2_CTL (0x1BC) -#define MSM89XX_CDC_CORE_CONN_EQ2_B2_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ2_B3_CTL (0x1C0) -#define MSM89XX_CDC_CORE_CONN_EQ2_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_EQ2_B4_CTL (0x1C4) -#define MSM89XX_CDC_CORE_CONN_EQ2_B4_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL (0x1C8) -#define MSM89XX_CDC_CORE_CONN_TX_I2S_SD1_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_CONN_TX_B3_CTL (0x1CC) -#define MSM89XX_CDC_CORE_CONN_TX_B3_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX5_VOL_CTL_TIMER (0x1E0) -#define MSM89XX_CDC_CORE_TX5_VOL_CTL_TIMER__POR (0x00) -#define MSM89XX_CDC_CORE_TX5_VOL_CTL_GAIN (0x1E4) -#define MSM89XX_CDC_CORE_TX5_VOL_CTL_GAIN__POR (0x00) -#define MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG (0x1E8) -#define MSM89XX_CDC_CORE_TX5_VOL_CTL_CFG__POR (0x00) -#define MSM89XX_CDC_CORE_TX5_MUX_CTL (0x1EC) -#define MSM89XX_CDC_CORE_TX5_MUX_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX5_CLK_FS_CTL (0x1F0) -#define MSM89XX_CDC_CORE_TX5_CLK_FS_CTL__POR (0x03) -#define MSM89XX_CDC_CORE_TX5_DMIC_CTL (0x1F4) -#define MSM89XX_CDC_CORE_TX5_DMIC_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX1_VOL_CTL_TIMER (0x280) -#define MSM89XX_CDC_CORE_TX1_VOL_CTL_TIMER__POR (0x00) -#define MSM89XX_CDC_CORE_TX2_VOL_CTL_TIMER (0x2A0) -#define MSM89XX_CDC_CORE_TX2_VOL_CTL_TIMER__POR (0x00) -#define MSM89XX_CDC_CORE_TX3_VOL_CTL_TIMER (0x2C0) -#define MSM89XX_CDC_CORE_TX3_VOL_CTL_TIMER__POR (0x00) -#define MSM89XX_CDC_CORE_TX4_VOL_CTL_TIMER (0x2E0) -#define MSM89XX_CDC_CORE_TX4_VOL_CTL_TIMER__POR (0x00) -#define MSM89XX_CDC_CORE_TX1_VOL_CTL_GAIN (0x284) -#define MSM89XX_CDC_CORE_TX1_VOL_CTL_GAIN__POR (0x00) -#define MSM89XX_CDC_CORE_TX2_VOL_CTL_GAIN (0x2A4) -#define MSM89XX_CDC_CORE_TX2_VOL_CTL_GAIN__POR (0x00) -#define MSM89XX_CDC_CORE_TX3_VOL_CTL_GAIN (0x2C4) -#define MSM89XX_CDC_CORE_TX3_VOL_CTL_GAIN__POR (0x00) -#define MSM89XX_CDC_CORE_TX4_VOL_CTL_GAIN (0x2E4) -#define MSM89XX_CDC_CORE_TX4_VOL_CTL_GAIN__POR (0x00) -#define MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG (0x288) -#define MSM89XX_CDC_CORE_TX1_VOL_CTL_CFG__POR (0x00) -#define MSM89XX_CDC_CORE_TX2_VOL_CTL_CFG (0x2A8) -#define MSM89XX_CDC_CORE_TX2_VOL_CTL_CFG__POR (0x00) -#define MSM89XX_CDC_CORE_TX3_VOL_CTL_CFG (0x2C8) -#define MSM89XX_CDC_CORE_TX3_VOL_CTL_CFG__POR (0x00) -#define MSM89XX_CDC_CORE_TX4_VOL_CTL_CFG (0x2E8) -#define MSM89XX_CDC_CORE_TX4_VOL_CTL_CFG__POR (0x00) -#define MSM89XX_CDC_CORE_TX1_MUX_CTL (0x28C) -#define MSM89XX_CDC_CORE_TX1_MUX_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX2_MUX_CTL (0x2AC) -#define MSM89XX_CDC_CORE_TX2_MUX_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX3_MUX_CTL (0x2CC) -#define MSM89XX_CDC_CORE_TX3_MUX_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX4_MUX_CTL (0x2EC) -#define MSM89XX_CDC_CORE_TX4_MUX_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX1_CLK_FS_CTL (0x290) -#define MSM89XX_CDC_CORE_TX1_CLK_FS_CTL__POR (0x03) -#define MSM89XX_CDC_CORE_TX2_CLK_FS_CTL (0x2B0) -#define MSM89XX_CDC_CORE_TX2_CLK_FS_CTL__POR (0x03) -#define MSM89XX_CDC_CORE_TX3_CLK_FS_CTL (0x2D0) -#define MSM89XX_CDC_CORE_TX3_CLK_FS_CTL__POR (0x03) -#define MSM89XX_CDC_CORE_TX4_CLK_FS_CTL (0x2F0) -#define MSM89XX_CDC_CORE_TX4_CLK_FS_CTL__POR (0x03) -#define MSM89XX_CDC_CORE_TX1_DMIC_CTL (0x294) -#define MSM89XX_CDC_CORE_TX1_DMIC_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX2_DMIC_CTL (0x2B4) -#define MSM89XX_CDC_CORE_TX2_DMIC_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX3_DMIC_CTL (0x2D4) -#define MSM89XX_CDC_CORE_TX3_DMIC_CTL__POR (0x00) -#define MSM89XX_CDC_CORE_TX4_DMIC_CTL (0x2F4) -#define MSM89XX_CDC_CORE_TX4_DMIC_CTL__POR (0x00) - -#define MSM89XX_CDC_CORE_NUM_REGISTERS \ - (MSM89XX_CDC_CORE_TX4_DMIC_CTL+1) -#define MSM89XX_CDC_CORE_MAX_REGISTER \ - (MSM89XX_CDC_CORE_NUM_REGISTERS-1) -#define MSM89XX_CDC_CORE_CACHE_SIZE \ - MSM89XX_CDC_CORE_NUM_REGISTERS -#endif diff --git a/techpack/audio/asoc/codecs/spk-id.c b/techpack/audio/asoc/codecs/spk-id.c deleted file mode 100755 index 7c2ce1647510..000000000000 --- a/techpack/audio/asoc/codecs/spk-id.c +++ /dev/null @@ -1,215 +0,0 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "spk-id.h" - - -struct spk_id_info { - struct pinctrl *pinctrl; - struct pinctrl_state *pull_down; - struct pinctrl_state *pull_up; - struct pinctrl_state *no_pull; - int gpio; - int state; -}; - - -static struct spk_id_info *spk_id_get_info(struct device_node *np) -{ - struct platform_device *pdev; - struct spk_id_info *info; - - if (!np) { - pr_err("%s: device node is null\n", __func__); - return NULL; - } - - pdev = of_find_device_by_node(np); - if (!pdev) { - pr_err("%s: platform device not found!\n", __func__); - return NULL; - } - - info = dev_get_drvdata(&pdev->dev); - if (!info) - dev_err(&pdev->dev, "%s: cannot find spk id info\n", __func__); - - return info; -} - -int spk_id_get_pin_3state(struct device_node *np) -{ - struct spk_id_info *info; - int pu = 0; - int pd = 0; - - info = spk_id_get_info(np); - if (!info) - return -EINVAL; - - if (IS_ERR_OR_NULL(info->pinctrl)) { - pr_err("%s: pin ctrl is invalid:%ld\n", __func__, PTR_ERR(info->pinctrl)); - return -EINVAL; - } - - if (!gpio_is_valid(info->gpio)) { - pr_err("%s: gpio is invalid:%d\n", __func__, info->gpio); - return -EINVAL; - } - - pinctrl_select_state(info->pinctrl, info->pull_down); - msleep(3); - pd = gpio_get_value(info->gpio); - - pinctrl_select_state(info->pinctrl, info->pull_up); - msleep(3); - pu = gpio_get_value(info->gpio); - - - if ((pd == pu) && (pd == 0)) { - pr_info("%s: id pin%d = %d\n", __func__, info->gpio, pd); - pinctrl_select_state(info->pinctrl, info->pull_down); - info->state = PIN_PULL_DOWN; - } else if ((pd == pu) && (pd == 1)) { - pr_info("%s: id pin%d = %d\n", __func__, info->gpio, pd); - pinctrl_select_state(info->pinctrl, info->pull_up); - info->state = PIN_PULL_UP; - } else { - pr_info("%s: id pin%d = 2\n", __func__, info->gpio); - pinctrl_select_state(info->pinctrl, info->no_pull); - info->state = PIN_FLOAT; - } - - return info->state; -} -EXPORT_SYMBOL(spk_id_get_pin_3state); - -static int spk_id_probe(struct platform_device *pdev) -{ - int ret = 0; - struct spk_id_info *info; - - info = devm_kzalloc(&pdev->dev, - sizeof(struct spk_id_info), - GFP_KERNEL); - if (!info) - return -ENOMEM; - - dev_dbg(&pdev->dev, "%s: device %s\n", __func__, pdev->name); - info->pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(info->pinctrl)) { - dev_err(&pdev->dev, "%s: Cannot get speaker id gpio pinctrl:%ld\n", - __func__, PTR_ERR(info->pinctrl)); - ret = PTR_ERR(info->pinctrl); - goto err_pctrl_get; - } - - info->pull_down = pinctrl_lookup_state( - info->pinctrl, "pull_down"); - if (IS_ERR_OR_NULL(info->pull_down)) { - dev_err(&pdev->dev, "%s: Cannot get pull_down pinctrl state:%ld\n", - __func__, PTR_ERR(info->pull_down)); - ret = PTR_ERR(info->pull_down); - goto err_lookup_state; - } - - info->pull_up = pinctrl_lookup_state( - info->pinctrl, "pull_up"); - if (IS_ERR_OR_NULL(info->pull_up)) { - dev_err(&pdev->dev, "%s: Cannot get pull_up pinctrl state:%ld\n", - __func__, PTR_ERR(info->pull_up)); - ret = PTR_ERR(info->pull_up); - goto err_lookup_state; - } - - info->no_pull = pinctrl_lookup_state( - info->pinctrl, "no_pull"); - if (IS_ERR_OR_NULL(info->no_pull)) { - dev_err(&pdev->dev, "%s: Cannot get no_pull pinctrl state:%ld\n", - __func__, PTR_ERR(info->no_pull)); - ret = PTR_ERR(info->no_pull); - goto err_lookup_state; - } - - info->gpio = of_get_named_gpio(pdev->dev.of_node, - "audio,speaker-id-gpio", 0); - if (gpio_is_valid(info->gpio)) { - ret = gpio_request(info->gpio, "speaker-id"); - if (ret) { - dev_err(&pdev->dev, "%s: Failed to request gpio %d\n", - __func__, info->gpio); - goto err_lookup_state; - } - } - - dev_set_drvdata(&pdev->dev, info); - return 0; - -err_lookup_state: - devm_pinctrl_put(info->pinctrl); -err_pctrl_get: - devm_kfree(&pdev->dev, info); - return ret; -} - -static int spk_id_remove(struct platform_device *pdev) -{ - struct spk_id_info *info; - - info = dev_get_drvdata(&pdev->dev); - - if (info) { - if (info->pinctrl) - devm_pinctrl_put(info->pinctrl); - if (gpio_is_valid(info->gpio)) - gpio_free(info->gpio); - } - - devm_kfree(&pdev->dev, info); - return 0; -} - -static const struct of_device_id spk_id_match[] = { - {.compatible = "audio,speaker-id"}, - {} -}; - -static struct platform_driver spk_id_driver = { - .driver = { - .name = "spk-id", - .owner = THIS_MODULE, - .of_match_table = spk_id_match, - }, - .probe = spk_id_probe, - .remove = spk_id_remove, -}; -//module_platform_driver(spk_id_driver); - -static int __init spk_id_init(void) -{ - return platform_driver_register(&spk_id_driver); -} -module_init(spk_id_init); - - -MODULE_DESCRIPTION("Speaker ID platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/spk-id.h b/techpack/audio/asoc/codecs/spk-id.h deleted file mode 100755 index 2416f89bd23f..000000000000 --- a/techpack/audio/asoc/codecs/spk-id.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __SPK_ID_H_ -#define __SPK_ID_H_ - -#include -#include - -#define PIN_PULL_DOWN 0 -#define PIN_PULL_UP 1 -#define PIN_FLOAT 2 - -#define VENDOR_ID_NONE 0 -#define VENDOR_ID_AAC 1 -#define VENDOR_ID_SSI 2 -#define VENDOR_ID_GOER 3 - -#define VENDOR_ID_UNKNOWN 4 - -extern int spk_id_get_pin_3state(struct device_node *np); - -#endif diff --git a/techpack/audio/asoc/codecs/tas2557/Android.mk b/techpack/audio/asoc/codecs/tas2557/Android.mk deleted file mode 100755 index 279ede3ee009..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/Android.mk +++ /dev/null @@ -1,55 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - #AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=tas2557_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_tas2557.ko -LOCAL_MODULE_KBUILD_NAME := tas2557_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/tas2557/Kbuild b/techpack/audio/asoc/codecs/tas2557/Kbuild deleted file mode 100755 index a65c9fb25b19..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/Kbuild +++ /dev/null @@ -1,117 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ CS35L41 ############ - -# for CS35L41 Codec -ifdef CONFIG_SND_SOC_TAS2557 - TAS2557_OBJS += tas2557-core.o - TAS2557_OBJS += tas2557-misc.o - TAS2557_OBJS += tas2557-codec.o - TAS2557_OBJS += tas2557-regmap.o - TAS2557_OBJS += tiload.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_TAS2557) += tas2557_dlkm.o -tas2557_dlkm-y := $(TAS2557_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557-codec.c b/techpack/audio/asoc/codecs/tas2557/tas2557-codec.c deleted file mode 100755 index c2f214117ba5..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557-codec.c +++ /dev/null @@ -1,668 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557-codec.c -** -** Description: -** ALSA SoC driver for Texas Instruments TAS2557 High Performance 4W Smart Amplifier -** -** ============================================================================= -*/ - -#ifdef CONFIG_TAS2557_CODEC - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tas2557-core.h" -#include "tas2557-codec.h" - -#define KCONTROL_CODEC - -static unsigned int tas2557_codec_read(struct snd_soc_codec *pCodec, - unsigned int nRegister) -{ - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - int ret = 0; - unsigned int Value = 0; - - mutex_lock(&pTAS2557->codec_lock); - - ret = pTAS2557->read(pTAS2557, nRegister, &Value); - if (ret < 0) - dev_err(pTAS2557->dev, "%s, %d, ERROR happen=%d\n", __func__, - __LINE__, ret); - else - ret = Value; - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static int tas2557_codec_write(struct snd_soc_codec *pCodec, unsigned int nRegister, - unsigned int nValue) -{ - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - int ret = 0; - - mutex_lock(&pTAS2557->codec_lock); - - ret = pTAS2557->write(pTAS2557, nRegister, nValue); - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static int tas2557_codec_suspend(struct snd_soc_codec *pCodec) -{ - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - int ret = 0; - - mutex_lock(&pTAS2557->codec_lock); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - pTAS2557->runtime_suspend(pTAS2557); - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static int tas2557_codec_resume(struct snd_soc_codec *pCodec) -{ - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - int ret = 0; - - mutex_lock(&pTAS2557->codec_lock); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - pTAS2557->runtime_resume(pTAS2557); - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static const struct snd_soc_dapm_widget tas2557_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("ASI1", "ASI1 Playback", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_IN("ASI2", "ASI2 Playback", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_IN("ASIM", "ASIM Playback", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_OUT_DRV("ClassD", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_SUPPLY("PLL", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("NDivider", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_OUTPUT("OUT") -}; - -static const struct snd_soc_dapm_route tas2557_audio_map[] = { - {"DAC", NULL, "ASI1"}, - {"DAC", NULL, "ASI2"}, - {"DAC", NULL, "ASIM"}, - {"ClassD", NULL, "DAC"}, - {"OUT", NULL, "ClassD"}, - {"DAC", NULL, "PLL"}, - {"DAC", NULL, "NDivider"}, -}; - -static int tas2557_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct snd_soc_codec *codec = dai->codec; - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - return 0; -} - -static void tas2557_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct snd_soc_codec *codec = dai->codec; - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); -} - -static int tas2557_mute(struct snd_soc_dai *dai, int mute) -{ - struct snd_soc_codec *codec = dai->codec; - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&pTAS2557->codec_lock); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - tas2557_enable(pTAS2557, !mute); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_set_dai_sysclk(struct snd_soc_dai *pDAI, - int nClkID, unsigned int nFreqency, int nDir) -{ - struct snd_soc_codec *pCodec = pDAI->codec; - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - - dev_dbg(pTAS2557->dev, "tas2557_set_dai_sysclk: freq = %u\n", nFreqency); - - return 0; -} - -static int tas2557_hw_params(struct snd_pcm_substream *pSubstream, - struct snd_pcm_hw_params *pParams, struct snd_soc_dai *pDAI) -{ - struct snd_soc_codec *pCodec = pDAI->codec; - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - - mutex_lock(&pTAS2557->codec_lock); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); -/* do bit rate setting during platform data */ -/* tas2557_set_bit_rate(pTAS2557, channel_both, snd_pcm_format_width(params_format(pParams))); */ - tas2557_set_sampling_rate(pTAS2557, params_rate(pParams)); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_set_dai_fmt(struct snd_soc_dai *pDAI, unsigned int nFormat) -{ - struct snd_soc_codec *codec = pDAI->codec; - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - return 0; -} - -static int tas2557_prepare(struct snd_pcm_substream *pSubstream, - struct snd_soc_dai *pDAI) -{ - struct snd_soc_codec *codec = pDAI->codec; - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - return 0; -} - -static int tas2557_set_bias_level(struct snd_soc_codec *pCodec, - enum snd_soc_bias_level eLevel) -{ - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - - dev_dbg(pTAS2557->dev, "%s: %d\n", __func__, eLevel); - return 0; -} - -static int tas2557_codec_probe(struct snd_soc_codec *pCodec) -{ - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(pCodec); - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - return 0; -} - -static int tas2557_codec_remove(struct snd_soc_codec *pCodec) -{ - return 0; -} -static int tas2557_mute_ctrl_get(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&pTAS2557->codec_lock); - - pValue->value.integer.value[0] = pTAS2557->mbMute; - dev_dbg(pTAS2557->dev, "tas2557_mute_ctrl_get = %d\n", - pTAS2557->mbMute); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_mute_ctrl_put(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - int mbMute = pValue->value.integer.value[0]; - - mutex_lock(&pTAS2557->codec_lock); - - dev_dbg(pTAS2557->dev, "tas2557_mute_ctrl_put = %d\n", mbMute); - - tas2557_permanent_mute(pTAS2557, mbMute); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_power_ctrl_get(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&pTAS2557->codec_lock); - - pValue->value.integer.value[0] = pTAS2557->mbPowerUp; - dev_dbg(pTAS2557->dev, "tas2557_power_ctrl_get = %d\n", - pTAS2557->mbPowerUp); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_power_ctrl_put(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - int nPowerOn = pValue->value.integer.value[0]; - - mutex_lock(&pTAS2557->codec_lock); - - dev_dbg(pTAS2557->dev, "tas2557_power_ctrl_put = %d\n", nPowerOn); - tas2557_enable(pTAS2557, (nPowerOn != 0)); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int vendor_id_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = VENDOR_ID_NONE; - - if (pTAS2557->spk_id_gpio_p) - ucontrol->value.integer.value[0] = spk_id_get(pTAS2557->spk_id_gpio_p); - - return 0; -} - -static int pa_version_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = 0; - - if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) - ucontrol->value.integer.value[0] = 1; - else if(pTAS2557->mnPGID == TAS2557_PG_VERSION_2P0) - ucontrol->value.integer.value[0] = 2; - else if(pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) - ucontrol->value.integer.value[0] = 3; - return 0; -} - -static int tas2557_fs_get(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - int nFS = 48000; - - mutex_lock(&pTAS2557->codec_lock); - - if (pTAS2557->mpFirmware->mnConfigurations) - nFS = pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration].mnSamplingRate; - pValue->value.integer.value[0] = nFS; - dev_dbg(pTAS2557->dev, "tas2557_fs_get = %d\n", nFS); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_fs_put(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int nFS = pValue->value.integer.value[0]; - - mutex_lock(&pTAS2557->codec_lock); - - dev_info(pTAS2557->dev, "tas2557_fs_put = %d\n", nFS); - ret = tas2557_set_sampling_rate(pTAS2557, nFS); - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static int tas2557_Cali_get(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - bool ret = 0; - int prm_r0 = 0; - - mutex_lock(&pTAS2557->codec_lock); - - ret = tas2557_get_Cali_prm_r0(pTAS2557, &prm_r0); - if (ret) - pValue->value.integer.value[0] = prm_r0; - - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_program_get(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&pTAS2557->codec_lock); - - pValue->value.integer.value[0] = pTAS2557->mnCurrentProgram; - dev_dbg(pTAS2557->dev, "tas2557_program_get = %d\n", - pTAS2557->mnCurrentProgram); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_program_put(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - unsigned int nProgram = pValue->value.integer.value[0]; - int ret = 0, nConfiguration = -1; - - mutex_lock(&pTAS2557->codec_lock); - - if (nProgram == pTAS2557->mnCurrentProgram) - nConfiguration = pTAS2557->mnCurrentConfiguration; - ret = tas2557_set_program(pTAS2557, nProgram, nConfiguration); - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static int tas2557_configuration_get(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&pTAS2557->codec_lock); - - pValue->value.integer.value[0] = pTAS2557->mnCurrentConfiguration; - dev_dbg(pTAS2557->dev, "tas2557_configuration_get = %d\n", - pTAS2557->mnCurrentConfiguration); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_configuration_put(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - unsigned int nConfiguration = pValue->value.integer.value[0]; - int ret = 0; - - mutex_lock(&pTAS2557->codec_lock); - - dev_info(pTAS2557->dev, "%s = %d\n", __func__, nConfiguration); - ret = tas2557_set_config(pTAS2557, nConfiguration); - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static int tas2557_calibration_get(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - - mutex_lock(&pTAS2557->codec_lock); - - pValue->value.integer.value[0] = pTAS2557->mnCurrentCalibration; - dev_info(pTAS2557->dev, - "tas2557_calibration_get = %d\n", - pTAS2557->mnCurrentCalibration); - - mutex_unlock(&pTAS2557->codec_lock); - return 0; -} - -static int tas2557_calibration_put(struct snd_kcontrol *pKcontrol, - struct snd_ctl_elem_value *pValue) -{ -#ifdef KCONTROL_CODEC - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(pKcontrol); -#else - struct snd_soc_codec *codec = snd_kcontrol_chip(pKcontrol); -#endif - struct tas2557_priv *pTAS2557 = snd_soc_codec_get_drvdata(codec); - unsigned int nCalibration = pValue->value.integer.value[0]; - int ret = 0; - - mutex_lock(&pTAS2557->codec_lock); - - ret = tas2557_set_calibration(pTAS2557, nCalibration); - - mutex_unlock(&pTAS2557->codec_lock); - return ret; -} - -static const char *const vendor_id_text[] = {"None", "AAC", "SSI", "GOER", "Unknown"}; -static const struct soc_enum vendor_id[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(vendor_id_text), vendor_id_text), -}; - -static const char *const pa_version_text[] = {"Unknown", "tas2557_v1.0", "tas2557_v2.0", "tas2557_v2.1"}; -static const struct soc_enum pa_version[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(pa_version_text), pa_version_text), -}; - -static const struct snd_kcontrol_new tas2557_snd_controls[] = { - SOC_SINGLE_EXT("PowerCtrl", SND_SOC_NOPM, 0, 0x0001, 0, - tas2557_power_ctrl_get, tas2557_power_ctrl_put), - SOC_SINGLE_EXT("Program", SND_SOC_NOPM, 0, 0x00FF, 0, tas2557_program_get, - tas2557_program_put), - SOC_SINGLE_EXT("Configuration", SND_SOC_NOPM, 0, 0x00FF, 0, - tas2557_configuration_get, tas2557_configuration_put), - SOC_SINGLE_EXT("FS", SND_SOC_NOPM, 8000, 48000, 0, - tas2557_fs_get, tas2557_fs_put), - SOC_SINGLE_EXT("Get Cali_Re", SND_SOC_NOPM, 0, 0x7f000000, 0, - tas2557_Cali_get, NULL), - SOC_SINGLE_EXT("Calibration", SND_SOC_NOPM, 0, 0x00FF, 0, - tas2557_calibration_get, tas2557_calibration_put), - SOC_ENUM_EXT("SPK ID", vendor_id, vendor_id_get, NULL), - SOC_ENUM_EXT("SmartPA Version", pa_version, pa_version_get, NULL), - SOC_SINGLE_EXT("SmartPA Mute", SND_SOC_NOPM, 0, 0x0001, 0, - tas2557_mute_ctrl_get, tas2557_mute_ctrl_put), - -}; - -static struct snd_soc_codec_driver soc_codec_driver_tas2557 = { - .probe = tas2557_codec_probe, - .remove = tas2557_codec_remove, - .read = tas2557_codec_read, - .write = tas2557_codec_write, - .suspend = tas2557_codec_suspend, - .resume = tas2557_codec_resume, - .set_bias_level = tas2557_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = tas2557_snd_controls, - .num_controls = ARRAY_SIZE(tas2557_snd_controls), - .dapm_widgets = tas2557_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tas2557_dapm_widgets), - .dapm_routes = tas2557_audio_map, - .num_dapm_routes = ARRAY_SIZE(tas2557_audio_map), - }, -}; - -static struct snd_soc_dai_ops tas2557_dai_ops = { - .startup = tas2557_startup, - .shutdown = tas2557_shutdown, - .digital_mute = tas2557_mute, - .hw_params = tas2557_hw_params, - .prepare = tas2557_prepare, - .set_sysclk = tas2557_set_dai_sysclk, - .set_fmt = tas2557_set_dai_fmt, -}; - -#define TAS2557_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ - SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) -static struct snd_soc_dai_driver tas2557_dai_driver[] = { - { - .name = "tas2557 ASI1", - .id = 0, - .playback = { - .stream_name = "ASI1 Playback", - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = TAS2557_FORMATS, - }, - .ops = &tas2557_dai_ops, - .symmetric_rates = 1, - }, - { - .name = "tas2557 ASI2", - .id = 1, - .playback = { - .stream_name = "ASI2 Playback", - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = TAS2557_FORMATS, - }, - .ops = &tas2557_dai_ops, - .symmetric_rates = 1, - }, - { - .name = "tas2557 ASIM", - .id = 2, - .playback = { - .stream_name = "ASIM Playback", - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = TAS2557_FORMATS, - }, - .ops = &tas2557_dai_ops, - .symmetric_rates = 1, - }, -}; - -int tas2557_register_codec(struct tas2557_priv *pTAS2557) -{ - int nResult = 0; - - dev_info(pTAS2557->dev, "%s, enter\n", __func__); - nResult = snd_soc_register_codec(pTAS2557->dev, - &soc_codec_driver_tas2557, - tas2557_dai_driver, ARRAY_SIZE(tas2557_dai_driver)); - return nResult; -} - -int tas2557_deregister_codec(struct tas2557_priv *pTAS2557) -{ - snd_soc_unregister_codec(pTAS2557->dev); - return 0; -} - -MODULE_AUTHOR("Texas Instruments Inc."); -MODULE_DESCRIPTION("TAS2557 ALSA SOC Smart Amplifier driver"); -MODULE_LICENSE("GPL v2"); -#endif diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557-codec.h b/techpack/audio/asoc/codecs/tas2557/tas2557-codec.h deleted file mode 100755 index 20babdde5025..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557-codec.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557-codec.h -** -** Description: -** header file for tas2557-codec.c -** -** ============================================================================= -*/ - -#ifndef _TAS2557_CODEC_H -#define _TAS2557_CODEC_H - -#include "tas2557.h" - -int tas2557_register_codec(struct tas2557_priv *pTAS2557); -int tas2557_deregister_codec(struct tas2557_priv *pTAS2557); - -#endif /* _TAS2557_CODEC_H */ diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557-core.c b/techpack/audio/asoc/codecs/tas2557/tas2557-core.c deleted file mode 100755 index 00cedf4a679e..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557-core.c +++ /dev/null @@ -1,2137 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557-core.c -** -** Description: -** TAS2557 common functions for Android Linux -** -** ============================================================================= -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tas2557.h" -#include "tas2557-core.h" - -#define PPC_DRIVER_CRCCHK 0x00000200 -#define PPC_DRIVER_CONFDEV 0x00000300 -#define PPC_DRIVER_MTPLLSRC 0x00000400 -#define PPC_DRIVER_CFGDEV_NONCRC 0x00000101 - -#define TAS2557_CAL_NAME "/mnt/vendor/persist/audio/tas2557_cal.bin" -#define RESTART_MAX 3 - - -static int tas2557_load_calibration(struct tas2557_priv *pTAS2557, - char *pFileName); -static int tas2557_load_data(struct tas2557_priv *pTAS2557, struct TData *pData, - unsigned int nType); -static void tas2557_clear_firmware(struct TFirmware *pFirmware); -static int tas2557_load_block(struct tas2557_priv *pTAS2557, struct TBlock *pBlock); -static int tas2557_load_configuration(struct tas2557_priv *pTAS2557, - unsigned int nConfiguration, bool bLoadSame); - -#define TAS2557_UDELAY 0xFFFFFFFE -#define TAS2557_MDELAY 0xFFFFFFFD - -#define TAS2557_BLOCK_PLL 0x00 -#define TAS2557_BLOCK_PGM_ALL 0x0d -#define TAS2557_BLOCK_PGM_DEV_A 0x01 -#define TAS2557_BLOCK_PGM_DEV_B 0x08 -#define TAS2557_BLOCK_CFG_COEFF_DEV_A 0x03 -#define TAS2557_BLOCK_CFG_COEFF_DEV_B 0x0a -#define TAS2557_BLOCK_CFG_PRE_DEV_A 0x04 -#define TAS2557_BLOCK_CFG_PRE_DEV_B 0x0b -#define TAS2557_BLOCK_CFG_POST 0x05 -#define TAS2557_BLOCK_CFG_POST_POWER 0x06 - -static unsigned int p_tas2557_default_data[] = { - TAS2557_SAR_ADC2_REG, 0x05, /* enable SAR ADC */ - TAS2557_CLK_ERR_CTRL2, 0x21, /*clk1:clock hysteresis, 0.34ms; clock halt, 22ms*/ - TAS2557_CLK_ERR_CTRL3, 0x21, /*clk2: rampDown 15dB/us, clock hysteresis, 10.66us; clock halt, 22ms */ - TAS2557_SAFE_GUARD_REG, TAS2557_SAFE_GUARD_PATTERN, /* safe guard */ - 0xFFFFFFFF, 0xFFFFFFFF -}; - -static unsigned int p_tas2557_irq_config[] = { - TAS2557_CLK_HALT_REG, 0x71, /* enable clk halt detect2 interrupt */ - TAS2557_INT_GEN1_REG, 0x11, /* enable spk OC and OV */ - TAS2557_INT_GEN2_REG, 0x11, /* enable clk err1 and die OT */ - TAS2557_INT_GEN3_REG, 0x11, /* enable clk err2 and brownout */ - TAS2557_INT_GEN4_REG, 0x01, /* disable SAR, enable clk halt */ - TAS2557_GPIO4_PIN_REG, 0x07, /* set GPIO4 as int1, default */ - TAS2557_INT_MODE_REG, 0x80, /* active high until INT_STICKY_1 and INT_STICKY_2 are read to be cleared. */ - 0xFFFFFFFF, 0xFFFFFFFF -}; - -static unsigned int p_tas2557_startup_data[] = { - TAS2557_GPI_PIN_REG, 0x15, /* enable DIN, MCLK, CCI */ - TAS2557_GPIO1_PIN_REG, 0x01, /* enable BCLK */ - TAS2557_GPIO2_PIN_REG, 0x01, /* enable WCLK */ - TAS2557_POWER_CTRL2_REG, 0xA0, /* Class-D, Boost power up */ - TAS2557_POWER_CTRL2_REG, 0xA3, /* Class-D, Boost, IV sense power up */ - TAS2557_POWER_CTRL1_REG, 0xF8, /* PLL, DSP, clock dividers power up */ - TAS2557_UDELAY, 2000, /* delay */ - TAS2557_CLK_ERR_CTRL, 0x2b, /* enable clock error detection */ - 0xFFFFFFFF, 0xFFFFFFFF -}; - -static unsigned int p_tas2557_unmute_data[] = { - TAS2557_MUTE_REG, 0x00, /* unmute */ - TAS2557_SOFT_MUTE_REG, 0x00, /* soft unmute */ - 0xFFFFFFFF, 0xFFFFFFFF -}; - -static unsigned int p_tas2557_shutdown_data[] = { - TAS2557_CLK_ERR_CTRL, 0x00, /* disable clock error detection */ - TAS2557_SOFT_MUTE_REG, 0x01, /* soft mute */ - TAS2557_UDELAY, 10000, /* delay 10ms */ - TAS2557_MUTE_REG, 0x03, /* mute */ - TAS2557_POWER_CTRL1_REG, 0x60, /* DSP power down */ - TAS2557_UDELAY, 2000, /* delay 2ms */ - TAS2557_POWER_CTRL2_REG, 0x00, /* Class-D, Boost power down */ - TAS2557_POWER_CTRL1_REG, 0x00, /* all power down */ - TAS2557_GPIO1_PIN_REG, 0x00, /* disable BCLK */ - TAS2557_GPIO2_PIN_REG, 0x00, /* disable WCLK */ - TAS2557_GPI_PIN_REG, 0x00, /* disable DIN, MCLK, CCI */ - 0xFFFFFFFF, 0xFFFFFFFF -}; - -static int tas2557_dev_load_data(struct tas2557_priv *pTAS2557, - unsigned int *pData) -{ - int ret = 0; - unsigned int n = 0; - unsigned int nRegister; - unsigned int nData; - - do { - nRegister = pData[n * 2]; - nData = pData[n * 2 + 1]; - if (nRegister == TAS2557_UDELAY) - udelay(nData); - else if (nRegister != 0xFFFFFFFF) { - ret = pTAS2557->write(pTAS2557, nRegister, nData); - if (ret < 0) - break; - } - n++; - } while (nRegister != 0xFFFFFFFF); - return ret; -} - -int tas2557_configIRQ(struct tas2557_priv *pTAS2557) -{ - return tas2557_dev_load_data(pTAS2557, p_tas2557_irq_config); -} - -int tas2557_set_bit_rate(struct tas2557_priv *pTAS2557, unsigned int nBitRate) -{ - int ret = 0, n = -1; - - dev_dbg(pTAS2557->dev, "tas2557_set_bit_rate: nBitRate = %d\n", nBitRate); - - switch (nBitRate) { - case 16: - n = 0; - break; - case 20: - n = 1; - break; - case 24: - n = 2; - break; - case 32: - n = 3; - break; - } - - if (n >= 0) - ret = pTAS2557->update_bits(pTAS2557, TAS2557_ASI1_DAC_FORMAT_REG, 0x18, n<<3); - return ret; -} - -int tas2557_get_bit_rate(struct tas2557_priv *pTAS2557, unsigned char *pBitRate) -{ - int ret = 0; - unsigned int nValue = 0; - unsigned char bitRate; - - ret = pTAS2557->read(pTAS2557, TAS2557_ASI1_DAC_FORMAT_REG, &nValue); - if (ret >= 0) { - bitRate = (nValue&0x18)>>3; - if (bitRate == 0) - bitRate = 16; - else if (bitRate == 1) - bitRate = 20; - else if (bitRate == 2) - bitRate = 24; - else if (bitRate == 3) - bitRate = 32; - *pBitRate = bitRate; - } - - return ret; -} - -int tas2557_get_DAC_gain(struct tas2557_priv *pTAS2557, unsigned char *pnGain) -{ - int ret = 0; - unsigned int nValue = 0; - - ret = pTAS2557->read(pTAS2557, TAS2557_SPK_CTRL_REG, &nValue); - if (ret >= 0) - *pnGain = ((nValue&TAS2557_DAC_GAIN_MASK)>>TAS2557_DAC_GAIN_SHIFT); - - return ret; -} - -int tas2557_set_DAC_gain(struct tas2557_priv *pTAS2557, unsigned int nGain) -{ - int ret = 0; - - ret = pTAS2557->update_bits(pTAS2557, TAS2557_SPK_CTRL_REG, TAS2557_DAC_GAIN_MASK, - (nGain<mpFirmware->mnConfigurations) { - dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - goto end; - } - - if (!pTAS2557->mbPowerUp) { - dev_err(pTAS2557->dev, "%s, device not powered on\n", __func__); - goto end; - } - - nResult = pTAS2557->bulk_read(pTAS2557, TAS2557_DIE_TEMP_REG, nBuf, 4); - if (nResult >= 0) { - temp = ((int)nBuf[0] << 24) | ((int)nBuf[1] << 16) | ((int)nBuf[2] << 8) | nBuf[3]; - *pTemperature = temp; - } - -end: - - return nResult; -} - -int tas2557_load_platdata(struct tas2557_priv *pTAS2557) -{ - int nResult = 0; - - if (gpio_is_valid(pTAS2557->mnGpioINT)) { - nResult = tas2557_configIRQ(pTAS2557); - if (nResult < 0) - goto end; - } - - nResult = tas2557_set_bit_rate(pTAS2557, pTAS2557->mnI2SBits); - -end: - - return nResult; -} - -int tas2557_load_default(struct tas2557_priv *pTAS2557) -{ - int nResult = 0; - - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_default_data); - if (nResult < 0) - goto end; - - nResult = tas2557_load_platdata(pTAS2557); - if (nResult < 0) - goto end; - - /* enable DOUT tri-state for extra BCLKs */ - nResult = pTAS2557->update_bits(pTAS2557, TAS2557_ASI1_DAC_FORMAT_REG, 0x01, 0x01); -end: - - return nResult; -} - -static void failsafe(struct tas2557_priv *pTAS2557) -{ - dev_err(pTAS2557->dev, "%s\n", __func__); - pTAS2557->mnErrCode |= ERROR_FAILSAFE; - if (hrtimer_active(&pTAS2557->mtimer)) - hrtimer_cancel(&pTAS2557->mtimer); - if(pTAS2557->mnRestart < RESTART_MAX) - { - pTAS2557->mnRestart ++; - msleep(100); - dev_err(pTAS2557->dev, "I2C COMM error, restart SmartAmp.\n"); - schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(100)); - return; - } - pTAS2557->enableIRQ(pTAS2557, false); - tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - pTAS2557->mbPowerUp = false; - pTAS2557->hw_reset(pTAS2557); - pTAS2557->write(pTAS2557, TAS2557_SW_RESET_REG, 0x01); - udelay(1000); - pTAS2557->write(pTAS2557, TAS2557_SPK_CTRL_REG, 0x04); - if (pTAS2557->mpFirmware != NULL) - tas2557_clear_firmware(pTAS2557->mpFirmware); -} - -int tas2557_checkPLL(struct tas2557_priv *pTAS2557) -{ - int nResult = 0; -/* -* TO DO -*/ - - return nResult; -} - -/* -* tas2557_load_coefficient -*/ -static int tas2557_load_coefficient(struct tas2557_priv *pTAS2557, - int nPrevConfig, int nNewConfig, bool bPowerOn) -{ - int nResult = 0; - struct TPLL *pPLL; - struct TProgram *pProgram; - struct TConfiguration *pPrevConfiguration; - struct TConfiguration *pNewConfiguration; - bool bRestorePower = false; - - if (!pTAS2557->mpFirmware->mnConfigurations) { - dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - goto end; - } - - if (nNewConfig >= pTAS2557->mpFirmware->mnConfigurations) { - dev_err(pTAS2557->dev, "%s, invalid configuration New=%d, total=%d\n", - __func__, nNewConfig, pTAS2557->mpFirmware->mnConfigurations); - goto end; - } - - if (nPrevConfig < 0) - pPrevConfiguration = NULL; - else if (nPrevConfig == nNewConfig) { - dev_dbg(pTAS2557->dev, "%s, config [%d] already loaded\n", - __func__, nNewConfig); - goto end; - } else - pPrevConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[nPrevConfig]); - - pNewConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[nNewConfig]); - pTAS2557->mnCurrentConfiguration = nNewConfig; - if (pPrevConfiguration) { - if (pPrevConfiguration->mnPLL == pNewConfiguration->mnPLL) { - dev_dbg(pTAS2557->dev, "%s, PLL same\n", __func__); - goto prog_coefficient; - } - } - - pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); - if (bPowerOn) { - dev_dbg(pTAS2557->dev, "%s, power down to load new PLL\n", __func__); - if (hrtimer_active(&pTAS2557->mtimer)) - hrtimer_cancel(&pTAS2557->mtimer); - - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) - pTAS2557->enableIRQ(pTAS2557, false); - - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - if (nResult < 0) - goto end; - bRestorePower = true; - } - - /* load PLL */ - pPLL = &(pTAS2557->mpFirmware->mpPLLs[pNewConfiguration->mnPLL]); - dev_dbg(pTAS2557->dev, "load PLL: %s block for Configuration %s\n", - pPLL->mpName, pNewConfiguration->mpName); - nResult = tas2557_load_block(pTAS2557, &(pPLL->mBlock)); - if (nResult < 0) - goto end; - pTAS2557->mnCurrentSampleRate = pNewConfiguration->mnSamplingRate; - - dev_dbg(pTAS2557->dev, "load configuration %s conefficient pre block\n", - pNewConfiguration->mpName); - nResult = tas2557_load_data(pTAS2557, &(pNewConfiguration->mData), TAS2557_BLOCK_CFG_PRE_DEV_A); - if (nResult < 0) - goto end; - -prog_coefficient: - dev_dbg(pTAS2557->dev, "load new configuration: %s, coeff block data\n", - pNewConfiguration->mpName); - nResult = tas2557_load_data(pTAS2557, &(pNewConfiguration->mData), - TAS2557_BLOCK_CFG_COEFF_DEV_A); - if (nResult < 0) - goto end; - - if (pTAS2557->mpCalFirmware->mnCalibrations) { - nResult = tas2557_set_calibration(pTAS2557, pTAS2557->mnCurrentCalibration); - if (nResult < 0) - goto end; - } - - if (bRestorePower) { - pTAS2557->clearIRQ(pTAS2557); - dev_dbg(pTAS2557->dev, "device powered up, load startup\n"); - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_startup_data); - if (nResult < 0) - goto end; - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - nResult = tas2557_checkPLL(pTAS2557); - if (nResult < 0) { - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - pTAS2557->mbPowerUp = false; - goto end; - } - } - dev_dbg(pTAS2557->dev, - "device powered up, load unmute\n"); - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_unmute_data); - if (nResult < 0) - goto end; - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - pTAS2557->enableIRQ(pTAS2557, true); - if (!hrtimer_active(&pTAS2557->mtimer)) { - pTAS2557->mnDieTvReadCounter = 0; - hrtimer_start(&pTAS2557->mtimer, - ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); - } - } - } -end: - - pTAS2557->mnNewConfiguration = pTAS2557->mnCurrentConfiguration; - return nResult; -} - -int tas2557_permanent_mute(struct tas2557_priv *pTAS2557, bool bmute) -{ - int nResult = 0; - - nResult = tas2557_enable(pTAS2557, !bmute); - if(nResult) { - dev_dbg(pTAS2557->dev, "set mute = %d faild\n",bmute ); - goto end; - } - - pTAS2557->mbMute = bmute; - - if(bmute) { //make sure codec is permanent mute - p_tas2557_unmute_data[1] = 0x03; - p_tas2557_unmute_data[3] = 0x01; - }else { - p_tas2557_unmute_data[1] = 0x00; - p_tas2557_unmute_data[3] = 0x00; - } - -end: - return nResult; -} -int tas2557_enable(struct tas2557_priv *pTAS2557, bool bEnable) -{ - int nResult = 0; - unsigned int nValue; - const char *pFWName; - struct TProgram *pProgram; - - dev_dbg(pTAS2557->dev, "Enable: %d\n", bEnable); - - if ((pTAS2557->mpFirmware->mnPrograms == 0) - || (pTAS2557->mpFirmware->mnConfigurations == 0)) { - dev_err(pTAS2557->dev, "%s, firmware not loaded, try to load again\n", __func__); - /*Load firmware*/ - if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) { - dev_info(pTAS2557->dev, "PG2.1 Silicon found\n"); - pFWName = TAS2557_AAC_FW_NAME; - } else if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) { - dev_info(pTAS2557->dev, "PG1.0 Silicon found\n"); - pFWName = TAS2557_PG1P0_FW_NAME; - } else { - nResult = -ENOTSUPP; - dev_info(pTAS2557->dev, "unsupport Silicon 0x%x\n", pTAS2557->mnPGID); - goto end; - } - if (pTAS2557->mnSpkType == VENDOR_ID_GOER) - pFWName = TAS2557_GOER_FW_NAME; - else if (pTAS2557->mnSpkType == VENDOR_ID_AAC) - pFWName = TAS2557_AAC_FW_NAME; - else - pFWName = TAS2557_DEFAULT_FW_NAME; - - nResult = request_firmware_nowait(THIS_MODULE, 1, pFWName, - pTAS2557->dev, GFP_KERNEL, pTAS2557, tas2557_fw_ready); - if(nResult < 0) - goto end; - dev_err(pTAS2557->dev, "%s, firmware is loaded\n", __func__); - } - - /* check safe guard*/ - nResult = pTAS2557->read(pTAS2557, TAS2557_SAFE_GUARD_REG, &nValue); - if (nResult < 0) - goto end; - if ((nValue&0xff) != TAS2557_SAFE_GUARD_PATTERN) { - dev_err(pTAS2557->dev, "ERROR safe guard failure!\n"); - nResult = -EPIPE; - pTAS2557->mnErrCode = ERROR_SAFE_GUARD; - pTAS2557->mbPowerUp = true; - goto end; - } - - pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); - if (bEnable) { - if (!pTAS2557->mbPowerUp) { - if (!pTAS2557->mbCalibrationLoaded) { - if (tas2557_set_calibration(pTAS2557, 0xFF) < 0) - dev_err(pTAS2557->dev, "calibration data load fail!\n"); - else - pTAS2557->mbCalibrationLoaded = true; - } - if (pTAS2557->mbLoadConfigurationPrePowerUp) { - dev_dbg(pTAS2557->dev, "load coefficient before power\n"); - pTAS2557->mbLoadConfigurationPrePowerUp = false; - nResult = tas2557_load_coefficient(pTAS2557, - pTAS2557->mnCurrentConfiguration, pTAS2557->mnNewConfiguration, false); - if (nResult < 0) - goto end; - } - - pTAS2557->clearIRQ(pTAS2557); - /* power on device */ - dev_dbg(pTAS2557->dev, "Enable: load startup sequence\n"); - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_startup_data); - if (nResult < 0) - goto end; - - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - nResult = tas2557_checkPLL(pTAS2557); - if (nResult < 0) { - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - goto end; - } - } - dev_dbg(pTAS2557->dev, "Enable: load unmute sequence\n"); - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_unmute_data); - if (nResult < 0) - goto end; - - pTAS2557->mbPowerUp = true; - - nResult = tas2557_get_die_temperature(pTAS2557, &nValue); - if ((nValue == 0x80000000) || (nResult < 0)) { - dev_err(pTAS2557->dev, "%s, thermal sensor is wrong, mute output, mbPower: %d\n", __func__, pTAS2557->mbPowerUp); - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - pTAS2557->mbPowerUp = false; - goto end; - } - - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - /* turn on IRQ */ - pTAS2557->enableIRQ(pTAS2557, true); - if (!hrtimer_active(&pTAS2557->mtimer)) { - pTAS2557->mnDieTvReadCounter = 0; - hrtimer_start(&pTAS2557->mtimer, - ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); - } - } - pTAS2557->mnRestart = 0; - } - } else { - if (pTAS2557->mbPowerUp) { - if (hrtimer_active(&pTAS2557->mtimer)) - hrtimer_cancel(&pTAS2557->mtimer); - - dev_dbg(pTAS2557->dev, "Enable: load shutdown sequence\n"); - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - /* turn off IRQ */ - pTAS2557->enableIRQ(pTAS2557, false); - } - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - if (nResult < 0) - goto end; - - pTAS2557->mbPowerUp = false; - pTAS2557->mnRestart = 0; - } - } - - nResult = 0; - -end: - if (nResult < 0) { - if (pTAS2557->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK | ERROR_SAFE_GUARD)) - failsafe(pTAS2557); - } - - return nResult; -} - -int tas2557_set_sampling_rate(struct tas2557_priv *pTAS2557, unsigned int nSamplingRate) -{ - int nResult = 0; - struct TConfiguration *pConfiguration; - unsigned int nConfiguration; - - dev_dbg(pTAS2557->dev, "tas2557_setup_clocks: nSamplingRate = %d [Hz]\n", - nSamplingRate); - - if ((!pTAS2557->mpFirmware->mpPrograms) || - (!pTAS2557->mpFirmware->mpConfigurations)) { - dev_err(pTAS2557->dev, "Firmware not loaded\n"); - nResult = -EINVAL; - goto end; - } - - pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); - if (pConfiguration->mnSamplingRate == nSamplingRate) { - dev_info(pTAS2557->dev, "Sampling rate for current configuration matches: %d\n", - nSamplingRate); - nResult = 0; - goto end; - } - - for (nConfiguration = 0; - nConfiguration < pTAS2557->mpFirmware->mnConfigurations; - nConfiguration++) { - pConfiguration = - &(pTAS2557->mpFirmware->mpConfigurations[nConfiguration]); - if ((pConfiguration->mnSamplingRate == nSamplingRate) - && (pConfiguration->mnProgram == pTAS2557->mnCurrentProgram)) { - dev_info(pTAS2557->dev, - "Found configuration: %s, with compatible sampling rate %d\n", - pConfiguration->mpName, nSamplingRate); - nResult = tas2557_load_configuration(pTAS2557, nConfiguration, false); - goto end; - } - } - - dev_err(pTAS2557->dev, "Cannot find a configuration that supports sampling rate: %d\n", - nSamplingRate); - -end: - - return nResult; -} - -static void fw_print_header(struct tas2557_priv *pTAS2557, struct TFirmware *pFirmware) -{ - dev_info(pTAS2557->dev, "FW Size = %d", pFirmware->mnFWSize); - dev_info(pTAS2557->dev, "Checksum = 0x%04X", pFirmware->mnChecksum); - dev_info(pTAS2557->dev, "PPC Version = 0x%04X", pFirmware->mnPPCVersion); - dev_info(pTAS2557->dev, "FW Version = 0x%04X", pFirmware->mnFWVersion); - dev_info(pTAS2557->dev, "Driver Version= 0x%04X", pFirmware->mnDriverVersion); - dev_info(pTAS2557->dev, "Timestamp = %d", pFirmware->mnTimeStamp); - dev_info(pTAS2557->dev, "DDC Name = %s", pFirmware->mpDDCName); - dev_info(pTAS2557->dev, "Description = %s", pFirmware->mpDescription); -} - -inline unsigned int fw_convert_number(unsigned char *pData) -{ - return pData[3] + (pData[2] << 8) + (pData[1] << 16) + (pData[0] << 24); -} - -static int fw_parse_header(struct tas2557_priv *pTAS2557, - struct TFirmware *pFirmware, unsigned char *pData, unsigned int nSize) -{ - unsigned char *pDataStart = pData; - unsigned int n; - unsigned char pMagicNumber[] = { 0x35, 0x35, 0x35, 0x32 }; - - if (nSize < 104) { - dev_err(pTAS2557->dev, "Firmware: Header too short"); - return -EINVAL; - } - - if (memcmp(pData, pMagicNumber, 4)) { - dev_err(pTAS2557->dev, "Firmware: Magic number doesn't match"); - return -EINVAL; - } - pData += 4; - - pFirmware->mnFWSize = fw_convert_number(pData); - pData += 4; - - pFirmware->mnChecksum = fw_convert_number(pData); - pData += 4; - - pFirmware->mnPPCVersion = fw_convert_number(pData); - pData += 4; - - pFirmware->mnFWVersion = fw_convert_number(pData); - pData += 4; - - pFirmware->mnDriverVersion = fw_convert_number(pData); - pData += 4; - - pFirmware->mnTimeStamp = fw_convert_number(pData); - pData += 4; - - memcpy(pFirmware->mpDDCName, pData, 64); - pData += 64; - - n = strlen(pData); - pFirmware->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); - pData += n + 1; - if ((pData - pDataStart) >= nSize) { - dev_err(pTAS2557->dev, "Firmware: Header too short after DDC description"); - return -EINVAL; - } - - pFirmware->mnDeviceFamily = fw_convert_number(pData); - pData += 4; - if (pFirmware->mnDeviceFamily != 0) { - dev_err(pTAS2557->dev, - "deviceFamily %d, not TAS device", pFirmware->mnDeviceFamily); - return -EINVAL; - } - - pFirmware->mnDevice = fw_convert_number(pData); - pData += 4; - - if (pFirmware->mnDevice != 2) { - dev_err(pTAS2557->dev, - "device %d, not TAS2557 Dual Mono", pFirmware->mnDevice); - return -EINVAL; - } - - fw_print_header(pTAS2557, pFirmware); - return pData - pDataStart; -} - -static int fw_parse_block_data(struct tas2557_priv *pTAS2557, struct TFirmware *pFirmware, - struct TBlock *pBlock, unsigned char *pData) -{ - unsigned char *pDataStart = pData; - unsigned int n; - - pBlock->mnType = fw_convert_number(pData); - pData += 4; - - if (pFirmware->mnDriverVersion >= PPC_DRIVER_CRCCHK) { - pBlock->mbPChkSumPresent = pData[0]; - pData++; - - pBlock->mnPChkSum = pData[0]; - pData++; - - pBlock->mbYChkSumPresent = pData[0]; - pData++; - - pBlock->mnYChkSum = pData[0]; - pData++; - } else { - pBlock->mbPChkSumPresent = 0; - pBlock->mbYChkSumPresent = 0; - } - - pBlock->mnCommands = fw_convert_number(pData); - pData += 4; - - n = pBlock->mnCommands * 4; - pBlock->mpData = kmemdup(pData, n, GFP_KERNEL); - pData += n; - return pData - pDataStart; -} - -static int fw_parse_data(struct tas2557_priv *pTAS2557, struct TFirmware *pFirmware, - struct TData *pImageData, unsigned char *pData) -{ - unsigned char *pDataStart = pData; - unsigned int nBlock; - unsigned int n; - - memcpy(pImageData->mpName, pData, 64); - pData += 64; - - n = strlen(pData); - pImageData->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); - pData += n + 1; - - pImageData->mnBlocks = (pData[0] << 8) + pData[1]; - pData += 2; - - pImageData->mpBlocks = - kmalloc(sizeof(struct TBlock) * pImageData->mnBlocks, GFP_KERNEL); - - for (nBlock = 0; nBlock < pImageData->mnBlocks; nBlock++) { - n = fw_parse_block_data(pTAS2557, pFirmware, - &(pImageData->mpBlocks[nBlock]), pData); - pData += n; - } - return pData - pDataStart; -} - -static int fw_parse_pll_data(struct tas2557_priv *pTAS2557, - struct TFirmware *pFirmware, unsigned char *pData) -{ - unsigned char *pDataStart = pData; - unsigned int n; - unsigned int nPLL; - struct TPLL *pPLL; - - pFirmware->mnPLLs = (pData[0] << 8) + pData[1]; - pData += 2; - - if (pFirmware->mnPLLs == 0) - goto end; - - pFirmware->mpPLLs = kmalloc_array(pFirmware->mnPLLs, sizeof(struct TPLL), GFP_KERNEL); - for (nPLL = 0; nPLL < pFirmware->mnPLLs; nPLL++) { - pPLL = &(pFirmware->mpPLLs[nPLL]); - - memcpy(pPLL->mpName, pData, 64); - pData += 64; - - n = strlen(pData); - pPLL->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); - pData += n + 1; - - n = fw_parse_block_data(pTAS2557, pFirmware, &(pPLL->mBlock), pData); - pData += n; - } - -end: - return pData - pDataStart; -} - -static int fw_parse_program_data(struct tas2557_priv *pTAS2557, - struct TFirmware *pFirmware, unsigned char *pData) -{ - unsigned char *pDataStart = pData; - unsigned int n; - unsigned int nProgram; - struct TProgram *pProgram; - - pFirmware->mnPrograms = (pData[0] << 8) + pData[1]; - pData += 2; - - if (pFirmware->mnPrograms == 0) - goto end; - - pFirmware->mpPrograms = - kmalloc(sizeof(struct TProgram) * pFirmware->mnPrograms, GFP_KERNEL); - for (nProgram = 0; nProgram < pFirmware->mnPrograms; nProgram++) { - pProgram = &(pFirmware->mpPrograms[nProgram]); - memcpy(pProgram->mpName, pData, 64); - pData += 64; - - n = strlen(pData); - pProgram->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); - pData += n + 1; - - pProgram->mnAppMode = pData[0]; - pData++; - - pProgram->mnBoost = (pData[0] << 8) + pData[1]; - pData += 2; - - n = fw_parse_data(pTAS2557, pFirmware, &(pProgram->mData), pData); - pData += n; - } - -end: - - return pData - pDataStart; -} - -static int fw_parse_configuration_data(struct tas2557_priv *pTAS2557, - struct TFirmware *pFirmware, unsigned char *pData) -{ - unsigned char *pDataStart = pData; - unsigned int n; - unsigned int nConfiguration; - struct TConfiguration *pConfiguration; - - pFirmware->mnConfigurations = (pData[0] << 8) + pData[1]; - pData += 2; - - if (pFirmware->mnConfigurations == 0) - goto end; - - pFirmware->mpConfigurations = - kmalloc(sizeof(struct TConfiguration) * pFirmware->mnConfigurations, - GFP_KERNEL); - for (nConfiguration = 0; nConfiguration < pFirmware->mnConfigurations; - nConfiguration++) { - pConfiguration = &(pFirmware->mpConfigurations[nConfiguration]); - memcpy(pConfiguration->mpName, pData, 64); - pData += 64; - - n = strlen(pData); - pConfiguration->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); - pData += n + 1; - - if ((pFirmware->mnDriverVersion >= PPC_DRIVER_CONFDEV) - || ((pFirmware->mnDriverVersion >= PPC_DRIVER_CFGDEV_NONCRC) - && (pFirmware->mnDriverVersion < PPC_DRIVER_CRCCHK))) { - pConfiguration->mnDevices = (pData[0] << 8) + pData[1]; - pData += 2; - } else - pConfiguration->mnDevices = 1; - - pConfiguration->mnProgram = pData[0]; - pData++; - - pConfiguration->mnPLL = pData[0]; - pData++; - - pConfiguration->mnSamplingRate = fw_convert_number(pData); - pData += 4; - - if (pFirmware->mnDriverVersion >= PPC_DRIVER_MTPLLSRC) { - pConfiguration->mnPLLSrc = pData[0]; - pData++; - - pConfiguration->mnPLLSrcRate = fw_convert_number(pData); - pData += 4; - } - - n = fw_parse_data(pTAS2557, pFirmware, &(pConfiguration->mData), pData); - pData += n; - } - -end: - - return pData - pDataStart; -} - -int fw_parse_calibration_data(struct tas2557_priv *pTAS2557, - struct TFirmware *pFirmware, unsigned char *pData) -{ - unsigned char *pDataStart = pData; - unsigned int n; - unsigned int nCalibration; - struct TCalibration *pCalibration; - - pFirmware->mnCalibrations = (pData[0] << 8) + pData[1]; - pData += 2; - - if (pFirmware->mnCalibrations == 0) - goto end; - - pFirmware->mpCalibrations = - kmalloc(sizeof(struct TCalibration) * pFirmware->mnCalibrations, GFP_KERNEL); - for (nCalibration = 0; - nCalibration < pFirmware->mnCalibrations; - nCalibration++) { - pCalibration = &(pFirmware->mpCalibrations[nCalibration]); - memcpy(pCalibration->mpName, pData, 64); - pData += 64; - - n = strlen(pData); - pCalibration->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL); - pData += n + 1; - - pCalibration->mnProgram = pData[0]; - pData++; - - pCalibration->mnConfiguration = pData[0]; - pData++; - - n = fw_parse_data(pTAS2557, pFirmware, &(pCalibration->mData), pData); - pData += n; - } - -end: - - return pData - pDataStart; -} - -static int fw_parse(struct tas2557_priv *pTAS2557, - struct TFirmware *pFirmware, unsigned char *pData, unsigned int nSize) -{ - int nPosition = 0; - - nPosition = fw_parse_header(pTAS2557, pFirmware, pData, nSize); - if (nPosition < 0) { - dev_err(pTAS2557->dev, "Firmware: Wrong Header"); - return -EINVAL; - } - - if (nPosition >= nSize) { - dev_err(pTAS2557->dev, "Firmware: Too short"); - return -EINVAL; - } - - pData += nPosition; - nSize -= nPosition; - nPosition = 0; - - nPosition = fw_parse_pll_data(pTAS2557, pFirmware, pData); - - pData += nPosition; - nSize -= nPosition; - nPosition = 0; - - nPosition = fw_parse_program_data(pTAS2557, pFirmware, pData); - - pData += nPosition; - nSize -= nPosition; - nPosition = 0; - - nPosition = fw_parse_configuration_data(pTAS2557, pFirmware, pData); - - pData += nPosition; - nSize -= nPosition; - nPosition = 0; - - if (nSize > 64) - nPosition = fw_parse_calibration_data(pTAS2557, pFirmware, pData); - return 0; -} - - -static const unsigned char crc8_lookup_table[CRC8_TABLE_SIZE] = { -0x00, 0x4D, 0x9A, 0xD7, 0x79, 0x34, 0xE3, 0xAE, 0xF2, 0xBF, 0x68, 0x25, 0x8B, 0xC6, 0x11, 0x5C, -0xA9, 0xE4, 0x33, 0x7E, 0xD0, 0x9D, 0x4A, 0x07, 0x5B, 0x16, 0xC1, 0x8C, 0x22, 0x6F, 0xB8, 0xF5, -0x1F, 0x52, 0x85, 0xC8, 0x66, 0x2B, 0xFC, 0xB1, 0xED, 0xA0, 0x77, 0x3A, 0x94, 0xD9, 0x0E, 0x43, -0xB6, 0xFB, 0x2C, 0x61, 0xCF, 0x82, 0x55, 0x18, 0x44, 0x09, 0xDE, 0x93, 0x3D, 0x70, 0xA7, 0xEA, -0x3E, 0x73, 0xA4, 0xE9, 0x47, 0x0A, 0xDD, 0x90, 0xCC, 0x81, 0x56, 0x1B, 0xB5, 0xF8, 0x2F, 0x62, -0x97, 0xDA, 0x0D, 0x40, 0xEE, 0xA3, 0x74, 0x39, 0x65, 0x28, 0xFF, 0xB2, 0x1C, 0x51, 0x86, 0xCB, -0x21, 0x6C, 0xBB, 0xF6, 0x58, 0x15, 0xC2, 0x8F, 0xD3, 0x9E, 0x49, 0x04, 0xAA, 0xE7, 0x30, 0x7D, -0x88, 0xC5, 0x12, 0x5F, 0xF1, 0xBC, 0x6B, 0x26, 0x7A, 0x37, 0xE0, 0xAD, 0x03, 0x4E, 0x99, 0xD4, -0x7C, 0x31, 0xE6, 0xAB, 0x05, 0x48, 0x9F, 0xD2, 0x8E, 0xC3, 0x14, 0x59, 0xF7, 0xBA, 0x6D, 0x20, -0xD5, 0x98, 0x4F, 0x02, 0xAC, 0xE1, 0x36, 0x7B, 0x27, 0x6A, 0xBD, 0xF0, 0x5E, 0x13, 0xC4, 0x89, -0x63, 0x2E, 0xF9, 0xB4, 0x1A, 0x57, 0x80, 0xCD, 0x91, 0xDC, 0x0B, 0x46, 0xE8, 0xA5, 0x72, 0x3F, -0xCA, 0x87, 0x50, 0x1D, 0xB3, 0xFE, 0x29, 0x64, 0x38, 0x75, 0xA2, 0xEF, 0x41, 0x0C, 0xDB, 0x96, -0x42, 0x0F, 0xD8, 0x95, 0x3B, 0x76, 0xA1, 0xEC, 0xB0, 0xFD, 0x2A, 0x67, 0xC9, 0x84, 0x53, 0x1E, -0xEB, 0xA6, 0x71, 0x3C, 0x92, 0xDF, 0x08, 0x45, 0x19, 0x54, 0x83, 0xCE, 0x60, 0x2D, 0xFA, 0xB7, -0x5D, 0x10, 0xC7, 0x8A, 0x24, 0x69, 0xBE, 0xF3, 0xAF, 0xE2, 0x35, 0x78, 0xD6, 0x9B, 0x4C, 0x01, -0xF4, 0xB9, 0x6E, 0x23, 0x8D, 0xC0, 0x17, 0x5A, 0x06, 0x4B, 0x9C, 0xD1, 0x7F, 0x32, 0xE5, 0xA8 -}; - -static int isInPageYRAM(struct tas2557_priv *pTAS2557, struct TYCRC *pCRCData, - unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char len) -{ - int nResult = 0; - - if (nBook == TAS2557_YRAM_BOOK1) { - if (nPage == TAS2557_YRAM1_PAGE) { - if (nReg >= TAS2557_YRAM1_START_REG) { - pCRCData->mnOffset = nReg; - pCRCData->mnLen = len; - nResult = 1; - } else if ((nReg + len) > TAS2557_YRAM1_START_REG) { - pCRCData->mnOffset = TAS2557_YRAM1_START_REG; - pCRCData->mnLen = len - (TAS2557_YRAM1_START_REG - nReg); - nResult = 1; - } else - nResult = 0; - } else if (nPage == TAS2557_YRAM3_PAGE) { - if (nReg > TAS2557_YRAM3_END_REG) { - nResult = 0; - } else if (nReg >= TAS2557_YRAM3_START_REG) { - if ((nReg + len) > TAS2557_YRAM3_END_REG) { - pCRCData->mnOffset = nReg; - pCRCData->mnLen = TAS2557_YRAM3_END_REG - nReg + 1; - nResult = 1; - } else { - pCRCData->mnOffset = nReg; - pCRCData->mnLen = len; - nResult = 1; - } - } else { - if ((nReg + (len - 1)) < TAS2557_YRAM3_START_REG) - nResult = 0; - else { - pCRCData->mnOffset = TAS2557_YRAM3_START_REG; - pCRCData->mnLen = len - (TAS2557_YRAM3_START_REG - nReg); - nResult = 1; - } - } - } - } else if (nBook == TAS2557_YRAM_BOOK2) { - if (nPage == TAS2557_YRAM5_PAGE) { - if (nReg > TAS2557_YRAM5_END_REG) { - nResult = 0; - } else if (nReg >= TAS2557_YRAM5_START_REG) { - if ((nReg + len) > TAS2557_YRAM5_END_REG) { - pCRCData->mnOffset = nReg; - pCRCData->mnLen = TAS2557_YRAM5_END_REG - nReg + 1; - nResult = 1; - } else { - pCRCData->mnOffset = nReg; - pCRCData->mnLen = len; - nResult = 1; - } - } else { - if ((nReg + (len - 1)) < TAS2557_YRAM5_START_REG) - nResult = 0; - else { - pCRCData->mnOffset = TAS2557_YRAM5_START_REG; - pCRCData->mnLen = len - (TAS2557_YRAM5_START_REG - nReg); - nResult = 1; - } - } - } - } else - nResult = 0; - - return nResult; -} - -static int isInBlockYRAM(struct tas2557_priv *pTAS2557, struct TYCRC *pCRCData, - unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char len) -{ - int nResult; - - if (nBook == TAS2557_YRAM_BOOK1) { - if (nPage < TAS2557_YRAM2_START_PAGE) - nResult = 0; - else if (nPage <= TAS2557_YRAM2_END_PAGE) { - if (nReg > TAS2557_YRAM2_END_REG) - nResult = 0; - else if (nReg >= TAS2557_YRAM2_START_REG) { - pCRCData->mnOffset = nReg; - pCRCData->mnLen = len; - nResult = 1; - } else { - if ((nReg + (len - 1)) < TAS2557_YRAM2_START_REG) - nResult = 0; - else { - pCRCData->mnOffset = TAS2557_YRAM2_START_REG; - pCRCData->mnLen = nReg + len - TAS2557_YRAM2_START_REG; - nResult = 1; - } - } - } else - nResult = 0; - } else if (nBook == TAS2557_YRAM_BOOK2) { - if (nPage < TAS2557_YRAM4_START_PAGE) - nResult = 0; - else if (nPage <= TAS2557_YRAM4_END_PAGE) { - if (nReg > TAS2557_YRAM2_END_REG) - nResult = 0; - else if (nReg >= TAS2557_YRAM2_START_REG) { - pCRCData->mnOffset = nReg; - pCRCData->mnLen = len; - nResult = 1; - } else { - if ((nReg + (len - 1)) < TAS2557_YRAM2_START_REG) - nResult = 0; - else { - pCRCData->mnOffset = TAS2557_YRAM2_START_REG; - pCRCData->mnLen = nReg + len - TAS2557_YRAM2_START_REG; - nResult = 1; - } - } - } else - nResult = 0; - } else - nResult = 0; - - return nResult; -} - - -static int isYRAM(struct tas2557_priv *pTAS2557, struct TYCRC *pCRCData, - unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char len) -{ - int nResult; - - nResult = isInPageYRAM(pTAS2557, pCRCData, nBook, nPage, nReg, len); - - if (nResult == 0) - nResult = isInBlockYRAM(pTAS2557, pCRCData, nBook, nPage, nReg, len); - - return nResult; -} - -/* - * crc8 - calculate a crc8 over the given input data. - * - * table: crc table used for calculation. - * pdata: pointer to data buffer. - * nbytes: number of bytes in data buffer. - * crc: previous returned crc8 value. - */ -static u8 ti_crc8(const u8 table[CRC8_TABLE_SIZE], u8 *pdata, size_t nbytes, u8 crc) -{ - /* loop over the buffer data */ - while (nbytes-- > 0) - crc = table[(crc ^ *pdata++) & 0xff]; - - return crc; -} - -static int doSingleRegCheckSum(struct tas2557_priv *pTAS2557, - unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned char nValue) -{ - int nResult = 0; - struct TYCRC sCRCData; - unsigned int nData1 = 0; - - if ((nBook == TAS2557_BOOK_ID(TAS2557_SA_COEFF_SWAP_REG)) - && (nPage == TAS2557_PAGE_ID(TAS2557_SA_COEFF_SWAP_REG)) - && (nReg >= TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG)) - && (nReg <= (TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG) + 4))) { - /* DSP swap command, pass */ - nResult = 0; - goto end; - } - - nResult = isYRAM(pTAS2557, &sCRCData, nBook, nPage, nReg, 1); - if (nResult == 1) { - nResult = pTAS2557->read(pTAS2557, TAS2557_REG(nBook, nPage, nReg), &nData1); - if (nResult < 0) - goto end; - - if (nData1 != nValue) { - dev_err(pTAS2557->dev, "error2 (line %d),B[0x%x]P[0x%x]R[0x%x] W[0x%x], R[0x%x]\n", - __LINE__, nBook, nPage, nReg, nValue, nData1); - nResult = -EAGAIN; - goto end; - } - - nResult = ti_crc8(crc8_lookup_table, &nValue, 1, 0); - } - -end: - - return nResult; -} - -static int doMultiRegCheckSum(struct tas2557_priv *pTAS2557, - unsigned char nBook, unsigned char nPage, unsigned char nReg, unsigned int len) -{ - int nResult = 0, i; - unsigned char nCRCChkSum = 0; - unsigned char nBuf1[128]; - struct TYCRC TCRCData; - - if ((nReg + len-1) > 127) { - nResult = -EINVAL; - dev_err(pTAS2557->dev, "firmware error\n"); - goto end; - } - - if ((nBook == TAS2557_BOOK_ID(TAS2557_SA_COEFF_SWAP_REG)) - && (nPage == TAS2557_PAGE_ID(TAS2557_SA_COEFF_SWAP_REG)) - && (nReg == TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG)) - && (len == 4)) { - /* DSP swap command, pass */ - nResult = 0; - goto end; - } - - nResult = isYRAM(pTAS2557, &TCRCData, nBook, nPage, nReg, len); - if (nResult == 1) { - if (len == 1) { - dev_err(pTAS2557->dev, "firmware error\n"); - nResult = -EINVAL; - goto end; - } else { - nResult = pTAS2557->bulk_read(pTAS2557, TAS2557_REG(nBook, nPage, TCRCData.mnOffset), nBuf1, TCRCData.mnLen); - if (nResult < 0) - goto end; - - for (i = 0; i < TCRCData.mnLen; i++) { - if ((nBook == TAS2557_BOOK_ID(TAS2557_SA_COEFF_SWAP_REG)) - && (nPage == TAS2557_PAGE_ID(TAS2557_SA_COEFF_SWAP_REG)) - && ((i + TCRCData.mnOffset) - >= TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG)) - && ((i + TCRCData.mnOffset) - <= (TAS2557_PAGE_REG(TAS2557_SA_COEFF_SWAP_REG) + 4))) { - /* DSP swap command, bypass */ - continue; - } else - nCRCChkSum += ti_crc8(crc8_lookup_table, &nBuf1[i], 1, 0); - } - - nResult = nCRCChkSum; - } - } - -end: - - return nResult; -} - -static int tas2557_load_block(struct tas2557_priv *pTAS2557, struct TBlock *pBlock) -{ - int nResult = 0; - unsigned int nCommand = 0; - unsigned char nBook; - unsigned char nPage; - unsigned char nOffset; - unsigned char nData; - unsigned int nLength; - unsigned int nSleep; - unsigned char nCRCChkSum = 0; - unsigned int nValue1; - int nRetry = 6; - unsigned char *pData = pBlock->mpData; - - dev_dbg(pTAS2557->dev, "TAS2557 load block: Type = %d, commands = %d\n", - pBlock->mnType, pBlock->mnCommands); -start: - if (pBlock->mbPChkSumPresent) { - nResult = pTAS2557->write(pTAS2557, TAS2557_CRC_RESET_REG, 1); - if (nResult < 0) - goto end; - } - - if (pBlock->mbYChkSumPresent) - nCRCChkSum = 0; - - nCommand = 0; - - while (nCommand < pBlock->mnCommands) { - pData = pBlock->mpData + nCommand * 4; - - nBook = pData[0]; - nPage = pData[1]; - nOffset = pData[2]; - nData = pData[3]; - - nCommand++; - - if (nOffset <= 0x7F) { - nResult = pTAS2557->write(pTAS2557, TAS2557_REG(nBook, nPage, nOffset), nData); - if (nResult < 0) - goto end; - if (pBlock->mbYChkSumPresent) { - nResult = doSingleRegCheckSum(pTAS2557, nBook, nPage, nOffset, nData); - if (nResult < 0) - goto check; - nCRCChkSum += (unsigned char)nResult; - } - } else if (nOffset == 0x81) { - nSleep = (nBook << 8) + nPage; - msleep(nSleep); - } else if (nOffset == 0x85) { - pData += 4; - nLength = (nBook << 8) + nPage; - nBook = pData[0]; - nPage = pData[1]; - nOffset = pData[2]; - if (nLength > 1) { - nResult = pTAS2557->bulk_write(pTAS2557, TAS2557_REG(nBook, nPage, nOffset), pData + 3, nLength); - if (nResult < 0) - goto end; - if (pBlock->mbYChkSumPresent) { - nResult = doMultiRegCheckSum(pTAS2557, nBook, nPage, nOffset, nLength); - if (nResult < 0) - goto check; - nCRCChkSum += (unsigned char)nResult; - } - } else { - nResult = pTAS2557->write(pTAS2557, TAS2557_REG(nBook, nPage, nOffset), pData[3]); - if (nResult < 0) - goto end; - if (pBlock->mbYChkSumPresent) { - nResult = doSingleRegCheckSum(pTAS2557, nBook, nPage, nOffset, pData[3]); - if (nResult < 0) - goto check; - nCRCChkSum += (unsigned char)nResult; - } - } - - nCommand++; - - if (nLength >= 2) - nCommand += ((nLength - 2) / 4) + 1; - } - } - if (pBlock->mbPChkSumPresent) { - nResult = pTAS2557->read(pTAS2557, TAS2557_CRC_CHECKSUM_REG, &nValue1); - if (nResult < 0) - goto end; - if ((nValue1&0xff) != pBlock->mnPChkSum) { - dev_err(pTAS2557->dev, "Block PChkSum Error: FW = 0x%x, Reg = 0x%x\n", - pBlock->mnPChkSum, (nValue1&0xff)); - nResult = -EAGAIN; - pTAS2557->mnErrCode |= ERROR_PRAM_CRCCHK; - goto check; - } - - nResult = 0; - pTAS2557->mnErrCode &= ~ERROR_PRAM_CRCCHK; - dev_dbg(pTAS2557->dev, "Block[0x%x] PChkSum match\n", pBlock->mnType); - } - - if (pBlock->mbYChkSumPresent) { - if (nCRCChkSum != pBlock->mnYChkSum) { - dev_err(pTAS2557->dev, "Block YChkSum Error: FW = 0x%x, YCRC = 0x%x\n", - pBlock->mnYChkSum, nCRCChkSum); - nResult = -EAGAIN; - pTAS2557->mnErrCode |= ERROR_YRAM_CRCCHK; - goto check; - } - pTAS2557->mnErrCode &= ~ERROR_YRAM_CRCCHK; - nResult = 0; - dev_dbg(pTAS2557->dev, "Block[0x%x] YChkSum match\n", pBlock->mnType); - } - -check: - if (nResult == -EAGAIN) { - nRetry--; - if (nRetry > 0) - goto start; - } - -end: - if (nResult < 0) { - dev_err(pTAS2557->dev, "Block (%d) load error\n", - pBlock->mnType); - } - return nResult; -} - -static int tas2557_load_data(struct tas2557_priv *pTAS2557, struct TData *pData, unsigned int nType) -{ - int nResult = 0; - unsigned int nBlock; - struct TBlock *pBlock; - - dev_dbg(pTAS2557->dev, - "TAS2557 load data: %s, Blocks = %d, Block Type = %d\n", pData->mpName, pData->mnBlocks, nType); - - for (nBlock = 0; nBlock < pData->mnBlocks; nBlock++) { - pBlock = &(pData->mpBlocks[nBlock]); - if (pBlock->mnType == nType) { - nResult = tas2557_load_block(pTAS2557, pBlock); - if (nResult < 0) - break; - } - } - - return nResult; -} - -static int tas2557_load_configuration(struct tas2557_priv *pTAS2557, - unsigned int nConfiguration, bool bLoadSame) -{ - int nResult = 0; - struct TConfiguration *pCurrentConfiguration = NULL; - struct TConfiguration *pNewConfiguration = NULL; - - dev_dbg(pTAS2557->dev, "%s: %d\n", __func__, nConfiguration); - - if ((!pTAS2557->mpFirmware->mpPrograms) || - (!pTAS2557->mpFirmware->mpConfigurations)) { - dev_err(pTAS2557->dev, "Firmware not loaded\n"); - nResult = 0; - goto end; - } - - if (nConfiguration >= pTAS2557->mpFirmware->mnConfigurations) { - dev_err(pTAS2557->dev, "Configuration %d doesn't exist\n", - nConfiguration); - nResult = 0; - goto end; - } - - if ((!pTAS2557->mbLoadConfigurationPrePowerUp) - && (nConfiguration == pTAS2557->mnCurrentConfiguration) - && (!bLoadSame)) { - dev_info(pTAS2557->dev, "Configuration %d is already loaded\n", - nConfiguration); - nResult = 0; - goto end; - } - - pCurrentConfiguration = - &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); - pNewConfiguration = - &(pTAS2557->mpFirmware->mpConfigurations[nConfiguration]); - if (pNewConfiguration->mnProgram != pCurrentConfiguration->mnProgram) { - dev_err(pTAS2557->dev, "Configuration %d, %s doesn't share the same program as current %d\n", - nConfiguration, pNewConfiguration->mpName, pCurrentConfiguration->mnProgram); - nResult = 0; - goto end; - } - - if (pNewConfiguration->mnPLL >= pTAS2557->mpFirmware->mnPLLs) { - dev_err(pTAS2557->dev, "Configuration %d, %s doesn't have a valid PLL index %d\n", - nConfiguration, pNewConfiguration->mpName, pNewConfiguration->mnPLL); - nResult = 0; - goto end; - } - - if (pTAS2557->mbPowerUp) { - pTAS2557->mbLoadConfigurationPrePowerUp = false; - nResult = tas2557_load_coefficient(pTAS2557, pTAS2557->mnCurrentConfiguration, nConfiguration, true); - } else { - dev_dbg(pTAS2557->dev, - "TAS2557 was powered down, will load coefficient when power up\n"); - pTAS2557->mbLoadConfigurationPrePowerUp = true; - pTAS2557->mnNewConfiguration = nConfiguration; - } - -end: - - if (nResult < 0) { - if (pTAS2557->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK)) - failsafe(pTAS2557); - } - - return nResult; -} - -int tas2557_set_config(struct tas2557_priv *pTAS2557, int config) -{ - struct TConfiguration *pConfiguration; - struct TProgram *pProgram; - unsigned int nProgram = pTAS2557->mnCurrentProgram; - unsigned int nConfiguration = config; - int nResult = 0; - - if ((!pTAS2557->mpFirmware->mpPrograms) || - (!pTAS2557->mpFirmware->mpConfigurations)) { - dev_err(pTAS2557->dev, "Firmware not loaded\n"); - nResult = -EINVAL; - goto end; - } - - if (nConfiguration >= pTAS2557->mpFirmware->mnConfigurations) { - dev_err(pTAS2557->dev, "Configuration %d doesn't exist\n", - nConfiguration); - nResult = -EINVAL; - goto end; - } - - pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[nConfiguration]); - pProgram = &(pTAS2557->mpFirmware->mpPrograms[nProgram]); - - if (nProgram != pConfiguration->mnProgram) { - dev_err(pTAS2557->dev, - "Configuration %d, %s with Program %d isn't compatible with existing Program %d, %s\n", - nConfiguration, pConfiguration->mpName, pConfiguration->mnProgram, - nProgram, pProgram->mpName); - nResult = -EINVAL; - goto end; - } - - nResult = tas2557_load_configuration(pTAS2557, nConfiguration, false); - -end: - - return nResult; -} - -void tas2557_clear_firmware(struct TFirmware *pFirmware) -{ - unsigned int n, nn; - - if (!pFirmware) - return; - - kfree(pFirmware->mpDescription); - - if (pFirmware->mpPLLs != NULL) { - for (n = 0; n < pFirmware->mnPLLs; n++) { - kfree(pFirmware->mpPLLs[n].mpDescription); - kfree(pFirmware->mpPLLs[n].mBlock.mpData); - } - kfree(pFirmware->mpPLLs); - } - - if (pFirmware->mpPrograms != NULL) { - for (n = 0; n < pFirmware->mnPrograms; n++) { - kfree(pFirmware->mpPrograms[n].mpDescription); - kfree(pFirmware->mpPrograms[n].mData.mpDescription); - for (nn = 0; nn < pFirmware->mpPrograms[n].mData.mnBlocks; nn++) - kfree(pFirmware->mpPrograms[n].mData.mpBlocks[nn].mpData); - kfree(pFirmware->mpPrograms[n].mData.mpBlocks); - } - kfree(pFirmware->mpPrograms); - } - - if (pFirmware->mpConfigurations != NULL) { - for (n = 0; n < pFirmware->mnConfigurations; n++) { - kfree(pFirmware->mpConfigurations[n].mpDescription); - kfree(pFirmware->mpConfigurations[n].mData.mpDescription); - for (nn = 0; nn < pFirmware->mpConfigurations[n].mData.mnBlocks; nn++) - kfree(pFirmware->mpConfigurations[n].mData.mpBlocks[nn].mpData); - kfree(pFirmware->mpConfigurations[n].mData.mpBlocks); - } - kfree(pFirmware->mpConfigurations); - } - - if (pFirmware->mpCalibrations != NULL) { - for (n = 0; n < pFirmware->mnCalibrations; n++) { - kfree(pFirmware->mpCalibrations[n].mpDescription); - kfree(pFirmware->mpCalibrations[n].mData.mpDescription); - for (nn = 0; nn < pFirmware->mpCalibrations[n].mData.mnBlocks; nn++) - kfree(pFirmware->mpCalibrations[n].mData.mpBlocks[nn].mpData); - kfree(pFirmware->mpCalibrations[n].mData.mpBlocks); - } - kfree(pFirmware->mpCalibrations); - } - - memset(pFirmware, 0x00, sizeof(struct TFirmware)); -} - -static int tas2557_load_calibration(struct tas2557_priv *pTAS2557, char *pFileName) -{ - int nResult = 0; - struct file *nFile=NULL; - mm_segment_t fs; - unsigned char pBuffer[1000]; - int nSize = 0; - loff_t pos = 0; - - dev_dbg(pTAS2557->dev, "%s:\n", __func__); - fs = get_fs(); - set_fs(KERNEL_DS); - nFile = filp_open(pFileName, O_RDONLY, 0); - - dev_info(pTAS2557->dev, "TAS2557 calibration file = %s\n", pFileName); - if (IS_ERR(nFile)) { - if (PTR_ERR(nFile) == -ENOENT) - dev_err(pTAS2557->dev, "TAS2557 calibration file %s is not exit\n", pFileName); - else - dev_err(pTAS2557->dev, "TAS2557 cannot open calibration file: %s errno:%d\n", pFileName, (int)PTR_ERR(nFile)); - } else { - pos = nFile->f_pos; - nSize = vfs_read(nFile, pBuffer, 1000, &pos); - filp_close(nFile,NULL); - } - - set_fs(fs); - if (!nSize) - goto end; - - tas2557_clear_firmware(pTAS2557->mpCalFirmware); - dev_info(pTAS2557->dev, "TAS2557 calibration file size = %d\n", nSize); - nResult = fw_parse(pTAS2557, pTAS2557->mpCalFirmware, pBuffer, nSize); - - if (nResult) - dev_err(pTAS2557->dev, "TAS2557 calibration file is corrupt\n"); - else - dev_info(pTAS2557->dev, "TAS2557 calibration: %d calibrations\n", pTAS2557->mpCalFirmware->mnCalibrations); - -end: - return nResult; -} - -static bool tas2557_get_coefficient_in_block(struct tas2557_priv *pTAS2557, - struct TBlock *pBlock, int nReg, int *pnValue) -{ - int nCoefficient = 0; - bool bFound = false; - unsigned char *pCommands; - int nBook, nPage, nOffset, len; - int i, n; - - pCommands = pBlock->mpData; - for (i = 0 ; i < pBlock->mnCommands;) { - nBook = pCommands[4 * i + 0]; - nPage = pCommands[4 * i + 1]; - nOffset = pCommands[4 * i + 2]; - if ((nOffset < 0x7f) || (nOffset == 0x81)) - i++; - else if (nOffset == 0x85) { - len = ((int)nBook << 8) | nPage; - nBook = pCommands[4 * i + 4]; - nPage = pCommands[4 * i + 5]; - nOffset = pCommands[4 * i + 6]; - n = 4 * i + 7; - i += 2; - i += ((len - 1) / 4); - if ((len - 1) % 4) - i++; - if ((nBook != TAS2557_BOOK_ID(nReg)) - || (nPage != TAS2557_PAGE_ID(nReg))) - continue; - if (nOffset > TAS2557_PAGE_REG(nReg)) - continue; - if ((len + nOffset) >= (TAS2557_PAGE_REG(nReg) + 4)) { - n += (TAS2557_PAGE_REG(nReg) - nOffset); - nCoefficient = ((int)pCommands[n] << 24) - | ((int)pCommands[n + 1] << 16) - | ((int)pCommands[n + 2] << 8) - | (int)pCommands[n + 3]; - bFound = true; - break; - } - } else { - dev_err(pTAS2557->dev, "%s, format error %d\n", __func__, nOffset); - break; - } - } - - if (bFound) { - *pnValue = nCoefficient; - dev_dbg(pTAS2557->dev, "%s, B[0x%x]P[0x%x]R[0x%x]=0x%x\n", __func__, - TAS2557_BOOK_ID(nReg), TAS2557_PAGE_ID(nReg), TAS2557_PAGE_REG(nReg), - nCoefficient); - } - - return bFound; -} - -static bool tas2557_get_coefficient_in_data(struct tas2557_priv *pTAS2557, - struct TData *pData, int blockType, int nReg, int *pnValue) -{ - bool bFound = false; - struct TBlock *pBlock; - int i; - - for (i = 0; i < pData->mnBlocks; i++) { - pBlock = &(pData->mpBlocks[i]); - if (pBlock->mnType == blockType) { - bFound = tas2557_get_coefficient_in_block(pTAS2557, - pBlock, nReg, pnValue); - if (bFound) - break; - } - } - - return bFound; -} - -static bool tas2557_find_Tmax_in_configuration(struct tas2557_priv *pTAS2557, - struct TConfiguration *pConfiguration, int *pnTMax) -{ - struct TData *pData; - bool bFound = false; - int nBlockType, nReg, nCoefficient; - - if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) - nReg = TAS2557_PG2P1_CALI_T_REG; - else - nReg = TAS2557_PG1P0_CALI_T_REG; - - nBlockType = TAS2557_BLOCK_CFG_COEFF_DEV_A; - - pData = &(pConfiguration->mData); - bFound = tas2557_get_coefficient_in_data(pTAS2557, pData, nBlockType, nReg, &nCoefficient); - if (bFound) - *pnTMax = nCoefficient; - - return bFound; -} - -void tas2557_fw_ready(const struct firmware *pFW, void *pContext) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *) pContext; - int nResult; - unsigned int nProgram = 0; - unsigned int nSampleRate = 0; - -#ifdef CONFIG_TAS2557_CODEC - mutex_lock(&pTAS2557->codec_lock); -#endif - -#ifdef CONFIG_TAS2557_MISC - mutex_lock(&pTAS2557->file_lock); -#endif - - dev_info(pTAS2557->dev, "%s:\n", __func__); - - if (unlikely(!pFW) || unlikely(!pFW->data)) { - dev_err(pTAS2557->dev, "firmware is not loaded.\n"); - goto end; - } - - if (pTAS2557->mpFirmware->mpConfigurations) { - nProgram = pTAS2557->mnCurrentProgram; - nSampleRate = pTAS2557->mnCurrentSampleRate; - dev_dbg(pTAS2557->dev, "clear current firmware\n"); - tas2557_clear_firmware(pTAS2557->mpFirmware); - } - - nResult = fw_parse(pTAS2557, pTAS2557->mpFirmware, (unsigned char *)(pFW->data), pFW->size); - release_firmware(pFW); - if (nResult < 0) { - dev_err(pTAS2557->dev, "firmware is corrupt\n"); - goto end; - } - - if (!pTAS2557->mpFirmware->mnPrograms) { - dev_err(pTAS2557->dev, "firmware contains no programs\n"); - nResult = -EINVAL; - goto end; - } - - if (!pTAS2557->mpFirmware->mnConfigurations) { - dev_err(pTAS2557->dev, "firmware contains no configurations\n"); - nResult = -EINVAL; - goto end; - } - - if (nProgram >= pTAS2557->mpFirmware->mnPrograms) { - dev_info(pTAS2557->dev, - "no previous program, set to default\n"); - nProgram = 0; - } - - pTAS2557->mnCurrentSampleRate = nSampleRate; - nResult = tas2557_set_program(pTAS2557, nProgram, -1); - -end: - -#ifdef CONFIG_TAS2557_CODEC - mutex_unlock(&pTAS2557->codec_lock); -#endif - -#ifdef CONFIG_TAS2557_MISC - mutex_unlock(&pTAS2557->file_lock); -#endif -} - -int tas2557_set_program(struct tas2557_priv *pTAS2557, - unsigned int nProgram, int nConfig) -{ - struct TProgram *pProgram; - unsigned int nConfiguration = 0; - unsigned int nSampleRate = 0; - unsigned char nGain; - bool bFound = false; - int nResult = 0; - - if ((!pTAS2557->mpFirmware->mpPrograms) || - (!pTAS2557->mpFirmware->mpConfigurations)) { - dev_err(pTAS2557->dev, "Firmware not loaded\n"); - nResult = 0; - goto end; - } - - if (nProgram >= pTAS2557->mpFirmware->mnPrograms) { - dev_err(pTAS2557->dev, "TAS2557: Program %d doesn't exist\n", - nProgram); - nResult = 0; - goto end; - } - - if (nConfig < 0) { - nConfiguration = 0; - nSampleRate = pTAS2557->mnCurrentSampleRate; - while (!bFound && (nConfiguration < pTAS2557->mpFirmware->mnConfigurations)) { - if (pTAS2557->mpFirmware->mpConfigurations[nConfiguration].mnProgram == nProgram) { - if (nSampleRate == 0) { - bFound = true; - dev_info(pTAS2557->dev, "find default configuration %d\n", nConfiguration); - } else if (nSampleRate == pTAS2557->mpFirmware->mpConfigurations[nConfiguration].mnSamplingRate) { - bFound = true; - dev_info(pTAS2557->dev, "find matching configuration %d\n", nConfiguration); - } else { - nConfiguration++; - } - } else { - nConfiguration++; - } - } - if (!bFound) { - dev_err(pTAS2557->dev, - "Program %d, no valid configuration found for sample rate %d, ignore\n", - nProgram, nSampleRate); - nResult = 0; - goto end; - } - } else { - if (pTAS2557->mpFirmware->mpConfigurations[nConfig].mnProgram != nProgram) { - dev_err(pTAS2557->dev, "%s, configuration program doesn't match\n", __func__); - nResult = 0; - goto end; - } - nConfiguration = nConfig; - } - - pProgram = &(pTAS2557->mpFirmware->mpPrograms[nProgram]); - if (pTAS2557->mbPowerUp) { - dev_info(pTAS2557->dev, - "device powered up, power down to load program %d (%s)\n", - nProgram, pProgram->mpName); - if (hrtimer_active(&pTAS2557->mtimer)) - hrtimer_cancel(&pTAS2557->mtimer); - - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) - pTAS2557->enableIRQ(pTAS2557, false); - - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - if (nResult < 0) - goto end; - } - - pTAS2557->hw_reset(pTAS2557); - nResult = pTAS2557->write(pTAS2557, TAS2557_SW_RESET_REG, 0x01); - if (nResult < 0) - goto end; - msleep(1); - nResult = tas2557_load_default(pTAS2557); - if (nResult < 0) - goto end; - - dev_info(pTAS2557->dev, "load program %d (%s)\n", nProgram, pProgram->mpName); - nResult = tas2557_load_data(pTAS2557, &(pProgram->mData), TAS2557_BLOCK_PGM_DEV_A); - if (nResult < 0) - goto end; - pTAS2557->mnCurrentProgram = nProgram; - - nResult = tas2557_get_DAC_gain(pTAS2557, &nGain); - if (nResult < 0) - goto end; - pTAS2557->mnDevGain = nGain; - pTAS2557->mnDevCurrentGain = nGain; - - nResult = tas2557_load_coefficient(pTAS2557, -1, nConfiguration, false); - if (nResult < 0) - goto end; - - if (pTAS2557->mbPowerUp) { - pTAS2557->clearIRQ(pTAS2557); - dev_dbg(pTAS2557->dev, "device powered up, load startup\n"); - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_startup_data); - if (nResult < 0) - goto end; - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - nResult = tas2557_checkPLL(pTAS2557); - if (nResult < 0) { - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_shutdown_data); - pTAS2557->mbPowerUp = false; - goto end; - } - } - dev_dbg(pTAS2557->dev, "device powered up, load unmute\n"); - nResult = tas2557_dev_load_data(pTAS2557, p_tas2557_unmute_data); - if (nResult < 0) - goto end; - - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - pTAS2557->enableIRQ(pTAS2557, true); - if (!hrtimer_active(&pTAS2557->mtimer)) { - pTAS2557->mnDieTvReadCounter = 0; - hrtimer_start(&pTAS2557->mtimer, - ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); - } - } - } - -end: - - if (nResult < 0) { - if (pTAS2557->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK)) - failsafe(pTAS2557); - } - return nResult; -} - -int tas2557_set_calibration(struct tas2557_priv *pTAS2557, int nCalibration) -{ - struct TCalibration *pCalibration = NULL; - struct TConfiguration *pConfiguration; - struct TProgram *pProgram; - int nTmax = 0; - bool bFound = false; - int nResult = 0; - - if ((!pTAS2557->mpFirmware->mpPrograms) - || (!pTAS2557->mpFirmware->mpConfigurations)) { - dev_err(pTAS2557->dev, "Firmware not loaded\n\r"); - nResult = 0; - goto end; - } - - if (nCalibration == 0x00FF) { - nResult = tas2557_load_calibration(pTAS2557, TAS2557_CAL_NAME); - if (nResult < 0) { - dev_info(pTAS2557->dev, "load new calibration file %s fail %d\n", - TAS2557_CAL_NAME, nResult); - goto end; - } - nCalibration = 0; - } - - if (nCalibration >= pTAS2557->mpCalFirmware->mnCalibrations) { - dev_err(pTAS2557->dev, - "Calibration %d doesn't exist\n", nCalibration); - nResult = 0; - goto end; - } - - pTAS2557->mnCurrentCalibration = nCalibration; - if (pTAS2557->mbLoadConfigurationPrePowerUp) - goto end; - - pCalibration = &(pTAS2557->mpCalFirmware->mpCalibrations[nCalibration]); - pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); - pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); - if (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE) { - if (pTAS2557->mbBypassTMax) { - bFound = tas2557_find_Tmax_in_configuration(pTAS2557, pConfiguration, &nTmax); - if (bFound && (nTmax == TAS2557_COEFFICIENT_TMAX)) { - dev_dbg(pTAS2557->dev, "%s, config[%s] bypass load calibration\n", - __func__, pConfiguration->mpName); - goto end; - } - } - - dev_dbg(pTAS2557->dev, "%s, load calibration\n", __func__); - nResult = tas2557_load_data(pTAS2557, &(pCalibration->mData), TAS2557_BLOCK_CFG_COEFF_DEV_A); - if (nResult < 0) - goto end; - } - -end: - if (nResult < 0) { - tas2557_clear_firmware(pTAS2557->mpCalFirmware); - nResult = tas2557_set_program(pTAS2557, pTAS2557->mnCurrentProgram, pTAS2557->mnCurrentConfiguration); - } - - return nResult; -} - -bool tas2557_get_Cali_prm_r0(struct tas2557_priv *pTAS2557, int *prm_r0) -{ - struct TCalibration *pCalibration; - struct TData *pData; - int nReg; - int nCali_Re; - bool bFound = false; - int nBlockType; - - if (!pTAS2557->mpCalFirmware->mnCalibrations) { - dev_err(pTAS2557->dev, "%s, no calibration data\n", __func__); - goto end; - } - - if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) - nReg = TAS2557_PG2P1_CALI_R0_REG; - else - nReg = TAS2557_PG1P0_CALI_R0_REG; - - nBlockType = TAS2557_BLOCK_CFG_COEFF_DEV_A; - - pCalibration = &(pTAS2557->mpCalFirmware->mpCalibrations[pTAS2557->mnCurrentCalibration]); - pData = &(pCalibration->mData); - - bFound = tas2557_get_coefficient_in_data(pTAS2557, pData, nBlockType, nReg, &nCali_Re); - -end: - - if (bFound) - *prm_r0 = nCali_Re; - - return bFound; -} - -int spk_id_get(struct device_node *np) -{ - int id; - int state; - - state = spk_id_get_pin_3state(np); - if (state < 0) { - pr_err("%s: Can not get id pin state, %d\n", __func__, state); - return VENDOR_ID_NONE; - } - - switch (state) { - case PIN_PULL_DOWN: - id = VENDOR_ID_AAC; - break; - case PIN_PULL_UP: - id = VENDOR_ID_UNKNOWN; - break; - case PIN_FLOAT: - id = VENDOR_ID_GOER; - break; - default: - id = VENDOR_ID_UNKNOWN; - break; - } - return id; -} - -int tas2557_parse_dt(struct device *dev, struct tas2557_priv *pTAS2557) -{ - struct device_node *np = dev->of_node; - int rc = 0, ret = 0; - unsigned int value; - - pTAS2557->spk_id_gpio_p = of_parse_phandle(np, - "ti,spk-id-pin", 0); - if (!pTAS2557->spk_id_gpio_p) { - dev_dbg(pTAS2557->dev, "property %s not detected in node %s", - "ti,spk-id-pin", np->full_name); - pTAS2557->mnSpkType = VENDOR_ID_NONE; - } else { - pTAS2557->mnSpkType = spk_id_get(pTAS2557->spk_id_gpio_p); - } - dev_dbg(pTAS2557->dev, "spk is is %d", pTAS2557->mnSpkType); - - pTAS2557->mnResetGPIO = of_get_named_gpio(np, "ti,cdc-reset-gpio", 0); - if (!gpio_is_valid(pTAS2557->mnResetGPIO)) { - dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", - "ti,cdc-reset-gpio", np->full_name, - pTAS2557->mnResetGPIO); - ret = -EINVAL; - goto end; - } else - dev_dbg(pTAS2557->dev, "ti,cdc-reset-gpio=%d\n", pTAS2557->mnResetGPIO); - - pTAS2557->mnGpioINT = of_get_named_gpio(np, "ti,irq-gpio", 0); - if (!gpio_is_valid(pTAS2557->mnGpioINT)) - dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", - "ti,irq-gpio", np->full_name, - pTAS2557->mnGpioINT); - - - rc = of_property_read_u32(np, "ti,i2s-bits", &value); - if (rc) - dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", - "ti,i2s-bits", np->full_name, rc); - else - pTAS2557->mnI2SBits = value; - - rc = of_property_read_u32(np, "ti,bypass-tmax", &value); - if (rc) - dev_err(pTAS2557->dev, "Looking up %s property in node %s failed %d\n", - "ti,bypass-tmax", np->full_name, rc); - else - pTAS2557->mbBypassTMax = (value > 0); - -end: - - return ret; -} - -MODULE_AUTHOR("Texas Instruments Inc."); -MODULE_DESCRIPTION("TAS2557 common functions for Android Linux"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557-core.h b/techpack/audio/asoc/codecs/tas2557/tas2557-core.h deleted file mode 100755 index aa0987381658..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557-core.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557-core.h -** -** Description: -** header file for tas2557-core.c -** -** ============================================================================= -*/ - -#ifndef _TAS2557_CORE_H -#define _TAS2557_CORE_H - -#include "tas2557.h" - -#define TAS2557_YRAM_BOOK1 140 - -#define TAS2557_YRAM1_PAGE 42 -#define TAS2557_YRAM1_START_REG 88 -#define TAS2557_YRAM1_END_REG 127 - -#define TAS2557_YRAM2_START_PAGE 43 -#define TAS2557_YRAM2_END_PAGE 49 -#define TAS2557_YRAM2_START_REG 8 -#define TAS2557_YRAM2_END_REG 127 - -#define TAS2557_YRAM3_PAGE 50 -#define TAS2557_YRAM3_START_REG 8 -#define TAS2557_YRAM3_END_REG 27 - -/* should not include B0_P53_R44-R47 */ -#define TAS2557_YRAM_BOOK2 0 -#define TAS2557_YRAM4_START_PAGE 50 -#define TAS2557_YRAM4_END_PAGE 60 -#define TAS2557_YRAM4_START_REG 8 -#define TAS2557_YRAM4_END_REG 127 - -#define TAS2557_YRAM5_PAGE 61 -#define TAS2557_YRAM5_START_REG 8 -#define TAS2557_YRAM5_END_REG 27 - -#define TAS2557_COEFFICIENT_TMAX 0x7fffffff -#define TAS2557_SAFE_GUARD_PATTERN 0x5a -#define LOW_TEMPERATURE_CHECK_PERIOD 5000 /* 5 second */ - -struct TYCRC { - unsigned char mnOffset; - unsigned char mnLen; -}; - -int tas2557_enable(struct tas2557_priv *pTAS2557, bool bEnable); -int tas2557_permanent_mute(struct tas2557_priv *pTAS2557, bool bmute); -int tas2557_SA_DevChnSetup(struct tas2557_priv *pTAS2557, unsigned int mode); -int tas2557_get_die_temperature(struct tas2557_priv *pTAS2557, int *pTemperature); -int tas2557_set_sampling_rate(struct tas2557_priv *pTAS2557, unsigned int nSamplingRate); -int tas2557_set_bit_rate(struct tas2557_priv *pTAS2557, unsigned int nBitRate); -int tas2557_get_bit_rate(struct tas2557_priv *pTAS2557, unsigned char *pBitRate); -int tas2557_set_config(struct tas2557_priv *pTAS2557, int config); -void tas2557_fw_ready(const struct firmware *pFW, void *pContext); -bool tas2557_get_Cali_prm_r0(struct tas2557_priv *pTAS2557, int *prm_r0); -int tas2557_set_program(struct tas2557_priv *pTAS2557, unsigned int nProgram, int nConfig); -int tas2557_set_calibration(struct tas2557_priv *pTAS2557, int nCalibration); -int tas2557_load_default(struct tas2557_priv *pTAS2557); -int tas2557_parse_dt(struct device *dev, struct tas2557_priv *pTAS2557); -int tas2557_get_DAC_gain(struct tas2557_priv *pTAS2557, unsigned char *pnGain); -int tas2557_set_DAC_gain(struct tas2557_priv *pTAS2557, unsigned int nGain); -int tas2557_configIRQ(struct tas2557_priv *pTAS2557); -int spk_id_get(struct device_node *np); - -#endif /* _TAS2557_CORE_H */ diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557-misc.c b/techpack/audio/asoc/codecs/tas2557/tas2557-misc.c deleted file mode 100755 index cdae4e70cedb..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557-misc.c +++ /dev/null @@ -1,603 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557-misc.c -** -** Description: -** misc driver for Texas Instruments TAS2557 High Performance 4W Smart Amplifier -** -** ============================================================================= -*/ - -#ifdef CONFIG_TAS2557_MISC - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tas2557.h" -#include "tas2557-core.h" -#include "tas2557-misc.h" - -static int g_logEnable = 1; -static struct tas2557_priv *g_tas2557; - -static int tas2557_file_open(struct inode *inode, struct file *file) -{ - struct tas2557_priv *pTAS2557 = g_tas2557; - - if (!try_module_get(THIS_MODULE)) - return -ENODEV; - - file->private_data = (void *)pTAS2557; - if (g_logEnable) - dev_info(pTAS2557->dev, "%s\n", __func__); - return 0; -} - -static int tas2557_file_release(struct inode *inode, struct file *file) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)file->private_data; - - if (g_logEnable) - dev_info(pTAS2557->dev, "%s\n", __func__); - file->private_data = (void *)NULL; - module_put(THIS_MODULE); - - return 0; -} - -static ssize_t tas2557_file_read(struct file *file, char *buf, size_t count, loff_t *ppos) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)file->private_data; - int ret = 0; - unsigned int nValue = 0; - unsigned char value = 0; - unsigned char *p_kBuf = NULL; - - mutex_lock(&pTAS2557->file_lock); - - switch (pTAS2557->mnDBGCmd) { - case TIAUDIO_CMD_REG_READ: { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_READ: current_reg = 0x%x, count=%d\n", - pTAS2557->mnCurrentReg, (int)count); - if (count == 1) { - ret = pTAS2557->read(pTAS2557, pTAS2557->mnCurrentReg, &nValue); - if (ret < 0) - break; - - value = (u8)nValue; - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_READ: nValue=0x%x, value=0x%x\n", nValue, value); - ret = copy_to_user(buf, &value, 1); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - } else if (count > 1) { - p_kBuf = kzalloc(count, GFP_KERNEL); - if (p_kBuf != NULL) { - ret = pTAS2557->bulk_read(pTAS2557, pTAS2557->mnCurrentReg, p_kBuf, count); - if (ret < 0) - break; - ret = copy_to_user(buf, p_kBuf, count); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - kfree(p_kBuf); - } else - dev_err(pTAS2557->dev, "read no mem\n"); - } - } - break; - - case TIAUDIO_CMD_PROGRAM: { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_PROGRAM: count = %d\n", (int)count); - - if (count == PROGRAM_BUF_SIZE) { - p_kBuf = kzalloc(count, GFP_KERNEL); - if (p_kBuf != NULL) { - struct TProgram *pProgram = - &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); - p_kBuf[0] = pTAS2557->mpFirmware->mnPrograms; - p_kBuf[1] = pTAS2557->mnCurrentProgram; - p_kBuf[2] = pProgram->mnAppMode; - p_kBuf[3] = (pProgram->mnBoost&0xff00)>>8; - p_kBuf[4] = (pProgram->mnBoost&0x00ff); - memcpy(&p_kBuf[5], pProgram->mpName, FW_NAME_SIZE); - strlcpy(&p_kBuf[5+FW_NAME_SIZE], pProgram->mpDescription, strlen(pProgram->mpDescription) + 1); - ret = copy_to_user(buf, p_kBuf, count); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - kfree(p_kBuf); - } else - dev_err(pTAS2557->dev, "read no mem\n"); - } else - dev_err(pTAS2557->dev, "read buffer not sufficient\n"); - } else - dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - } - break; - - case TIAUDIO_CMD_CONFIGURATION: { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_CONFIGURATION: count = %d\n", (int)count); - if (count == CONFIGURATION_BUF_SIZE) { - p_kBuf = kzalloc(count, GFP_KERNEL); - if (p_kBuf != NULL) { - struct TConfiguration *pConfiguration = &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); - - p_kBuf[0] = pTAS2557->mpFirmware->mnConfigurations; - p_kBuf[1] = pTAS2557->mnCurrentConfiguration; - memcpy(&p_kBuf[2], pConfiguration->mpName, FW_NAME_SIZE); - p_kBuf[2+FW_NAME_SIZE] = pConfiguration->mnProgram; - p_kBuf[3+FW_NAME_SIZE] = pConfiguration->mnPLL; - p_kBuf[4+FW_NAME_SIZE] = (pConfiguration->mnSamplingRate&0x000000ff); - p_kBuf[5+FW_NAME_SIZE] = ((pConfiguration->mnSamplingRate&0x0000ff00)>>8); - p_kBuf[6+FW_NAME_SIZE] = ((pConfiguration->mnSamplingRate&0x00ff0000)>>16); - p_kBuf[7+FW_NAME_SIZE] = ((pConfiguration->mnSamplingRate&0xff000000)>>24); - strlcpy(&p_kBuf[8+FW_NAME_SIZE], pConfiguration->mpDescription, strlen(pConfiguration->mpDescription)+1); - ret = copy_to_user(buf, p_kBuf, count); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - kfree(p_kBuf); - } else - dev_err(pTAS2557->dev, "read no mem\n"); - } else - dev_err(pTAS2557->dev, "read buffer not sufficient\n"); - } else - dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - } - break; - - case TIAUDIO_CMD_FW_TIMESTAMP: { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_FW_TIMESTAMP: count = %d\n", (int)count); - - if (count == 4) { - p_kBuf = kzalloc(count, GFP_KERNEL); - if (p_kBuf != NULL) { - p_kBuf[0] = (pTAS2557->mpFirmware->mnTimeStamp&0x000000ff); - p_kBuf[1] = ((pTAS2557->mpFirmware->mnTimeStamp&0x0000ff00)>>8); - p_kBuf[2] = ((pTAS2557->mpFirmware->mnTimeStamp&0x00ff0000)>>16); - p_kBuf[3] = ((pTAS2557->mpFirmware->mnTimeStamp&0xff000000)>>24); - ret = copy_to_user(buf, p_kBuf, count); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - kfree(p_kBuf); - } else - dev_err(pTAS2557->dev, "read no mem\n"); - } - } - break; - - case TIAUDIO_CMD_CALIBRATION: { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_CALIBRATION: count = %d\n", (int)count); - - if (count == 1) { - unsigned char curCal = pTAS2557->mnCurrentCalibration; - - ret = copy_to_user(buf, &curCal, 1); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - } - } - break; - - case TIAUDIO_CMD_SAMPLERATE: { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_SAMPLERATE: count = %d\n", (int)count); - if (count == 4) { - p_kBuf = kzalloc(count, GFP_KERNEL); - if (p_kBuf != NULL) { - struct TConfiguration *pConfiguration = - &(pTAS2557->mpFirmware->mpConfigurations[pTAS2557->mnCurrentConfiguration]); - - p_kBuf[0] = (pConfiguration->mnSamplingRate&0x000000ff); - p_kBuf[1] = ((pConfiguration->mnSamplingRate&0x0000ff00)>>8); - p_kBuf[2] = ((pConfiguration->mnSamplingRate&0x00ff0000)>>16); - p_kBuf[3] = ((pConfiguration->mnSamplingRate&0xff000000)>>24); - - ret = copy_to_user(buf, p_kBuf, count); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - - kfree(p_kBuf); - } else - dev_err(pTAS2557->dev, "read no mem\n"); - } - } - break; - - case TIAUDIO_CMD_BITRATE: { - if (g_logEnable) - dev_info(pTAS2557->dev, - "TIAUDIO_CMD_BITRATE: count = %d\n", (int)count); - - if (count == 1) { - unsigned char bitRate = 0; - ret = tas2557_get_bit_rate(pTAS2557, &bitRate); - if (ret >= 0) { - ret = copy_to_user(buf, &bitRate, 1); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - } - } - } - break; - - case TIAUDIO_CMD_DACVOLUME: { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_DACVOLUME: count = %d\n", (int)count); - - if (count == 1) { - unsigned char volume = 0; - - ret = tas2557_get_DAC_gain(pTAS2557, &volume); - if (ret >= 0) { - ret = copy_to_user(buf, &volume, 1); - if (ret != 0) { - /* Failed to copy all the data, exit */ - dev_err(pTAS2557->dev, "copy to user fail %d\n", ret); - } - } - } - } - break; - } - pTAS2557->mnDBGCmd = 0; - - mutex_unlock(&pTAS2557->file_lock); - return count; -} - -static ssize_t tas2557_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)file->private_data; - int ret = 0; - unsigned char *p_kBuf = NULL; - unsigned int reg = 0; - unsigned int len = 0; - - mutex_lock(&pTAS2557->file_lock); - - p_kBuf = kzalloc(count, GFP_KERNEL); - if (p_kBuf == NULL) { - dev_err(pTAS2557->dev, "write no mem\n"); - goto err; - } - - ret = copy_from_user(p_kBuf, buf, count); - if (ret != 0) { - dev_err(pTAS2557->dev, "copy_from_user failed.\n"); - goto err; - } - - pTAS2557->mnDBGCmd = p_kBuf[0]; - switch (pTAS2557->mnDBGCmd) { - case TIAUDIO_CMD_REG_WITE: - if (count > 5) { - reg = ((unsigned int)p_kBuf[1] << 24) - + ((unsigned int)p_kBuf[2] << 16) - + ((unsigned int)p_kBuf[3] << 8) - + (unsigned int)p_kBuf[4]; - len = count - 5; - if (len == 1) { - ret = pTAS2557->write(pTAS2557, reg, p_kBuf[5]); - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_WITE, Reg=0x%x, Val=0x%x\n", reg, p_kBuf[5]); - } else - ret = pTAS2557->bulk_write(pTAS2557, reg, &p_kBuf[5], len); - } else - dev_err(pTAS2557->dev, "%s, write len fail, count=%d.\n", __func__, (int)count); - pTAS2557->mnDBGCmd = 0; - break; - - case TIAUDIO_CMD_REG_READ: - if (count == 5) { - pTAS2557->mnCurrentReg = ((unsigned int)p_kBuf[1] << 24) - + ((unsigned int)p_kBuf[2] << 16) - + ((unsigned int)p_kBuf[3] << 8) - + (unsigned int)p_kBuf[4]; - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_REG_READ whole=0x%x\n", pTAS2557->mnCurrentReg); - } else - dev_err(pTAS2557->dev, "read len fail.\n"); - break; - - case TIAUDIO_CMD_DEBUG_ON: - if (count == 2) - g_logEnable = p_kBuf[1]; - - pTAS2557->mnDBGCmd = 0; - break; - - case TIAUDIO_CMD_PROGRAM: - { - if (count == 2) { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) { - int config = -1; - - if (p_kBuf[1] == pTAS2557->mnCurrentProgram) - config = pTAS2557->mnCurrentConfiguration; - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_PROGRAM, set to %d, cfg=%d\n", p_kBuf[1], config); - tas2557_set_program(pTAS2557, p_kBuf[1], config); - pTAS2557->mnDBGCmd = 0; - } else - dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - } - } - break; - - case TIAUDIO_CMD_CONFIGURATION: - { - if (count == 2) { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_CONFIGURATION, set to %d\n", p_kBuf[1]); - tas2557_set_config(pTAS2557, p_kBuf[1]); - pTAS2557->mnDBGCmd = 0; - } else - dev_err(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - } - } - break; - - case TIAUDIO_CMD_FW_TIMESTAMP: - /*let go*/ - break; - - case TIAUDIO_CMD_CALIBRATION: - { - if (count == 2) { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_CALIBRATION, set to %d\n", p_kBuf[1]); - tas2557_set_calibration(pTAS2557, p_kBuf[1]); - pTAS2557->mnDBGCmd = 0; - } - } - } - break; - - case TIAUDIO_CMD_SAMPLERATE: - if (count == 5) { - unsigned int nSampleRate = ((unsigned int)p_kBuf[1] << 24) + - ((unsigned int)p_kBuf[2] << 16) + - ((unsigned int)p_kBuf[3] << 8) + - (unsigned int)p_kBuf[4]; - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_SAMPLERATE, set to %d\n", nSampleRate); - - tas2557_set_sampling_rate(pTAS2557, nSampleRate); - } - break; - - case TIAUDIO_CMD_BITRATE: - if (count == 2) { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_BITRATE, set to %d\n", p_kBuf[1]); - - tas2557_set_bit_rate(pTAS2557, p_kBuf[1]); - } - break; - - case TIAUDIO_CMD_DACVOLUME: - if (count == 2) { - unsigned char volume; - - volume = (p_kBuf[1] & 0x0f); - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_DACVOLUME, set to %d\n", volume); - - tas2557_set_DAC_gain(pTAS2557, volume); - } - break; - - case TIAUDIO_CMD_SPEAKER: - if (count == 2) { - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_SPEAKER, set to %d\n", p_kBuf[1]); - tas2557_enable(pTAS2557, (p_kBuf[1] > 0)); - } - break; - - case TIAUDIO_CMD_FW_RELOAD: - if (count == 1) { - const char *pFWName; - if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) - pFWName = TAS2557_AAC_FW_NAME; - else if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) - pFWName = TAS2557_PG1P0_FW_NAME; - else - break; - - if (pTAS2557->mnSpkType == VENDOR_ID_GOER) - pFWName = TAS2557_GOER_FW_NAME; - else if (pTAS2557->mnSpkType == VENDOR_ID_AAC) - pFWName = TAS2557_AAC_FW_NAME; - else if (pTAS2557->mnSpkType == VENDOR_ID_SSI) - pFWName = TAS2557_SSI_FW_NAME; - else - pFWName = TAS2557_DEFAULT_FW_NAME; - - ret = request_firmware_nowait(THIS_MODULE, 1, pFWName, - pTAS2557->dev, GFP_KERNEL, pTAS2557, tas2557_fw_ready); - - if (g_logEnable) - dev_info(pTAS2557->dev, "TIAUDIO_CMD_FW_RELOAD: ret = %d\n", ret); - } - break; - - default: - pTAS2557->mnDBGCmd = 0; - break; - } - -err: - if (p_kBuf != NULL) - kfree(p_kBuf); - - mutex_unlock(&pTAS2557->file_lock); - - return count; -} - -static long tas2557_file_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct tas2557_priv *pTAS2557 = file->private_data; - int ret = 0; - - mutex_lock(&pTAS2557->file_lock); - - switch (cmd) { - case SMARTPA_SPK_DAC_VOLUME: - { - } - break; - - case SMARTPA_SPK_POWER_ON: - { - tas2557_enable(pTAS2557, true); - } - break; - - case SMARTPA_SPK_POWER_OFF: - { - tas2557_enable(pTAS2557, false); - } - break; - - case SMARTPA_SPK_SWITCH_PROGRAM: - { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) - tas2557_set_program(pTAS2557, arg, -1); - } - break; - - case SMARTPA_SPK_SWITCH_CONFIGURATION: - { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) - tas2557_set_config(pTAS2557, arg); - } - break; - - case SMARTPA_SPK_SWITCH_CALIBRATION: - { - if ((pTAS2557->mpFirmware->mnConfigurations > 0) - && (pTAS2557->mpFirmware->mnPrograms > 0)) - tas2557_set_calibration(pTAS2557, arg); - } - break; - - case SMARTPA_SPK_SET_SAMPLERATE: - { - tas2557_set_sampling_rate(pTAS2557, arg); - } - break; - - case SMARTPA_SPK_SET_BITRATE: - { - tas2557_set_bit_rate(pTAS2557, arg); - } - break; - } - - mutex_unlock(&pTAS2557->file_lock); - return ret; -} - -static const struct file_operations fops = { - .owner = THIS_MODULE, - .read = tas2557_file_read, - .write = tas2557_file_write, - .unlocked_ioctl = tas2557_file_unlocked_ioctl, - .open = tas2557_file_open, - .release = tas2557_file_release, -}; - -#define MODULE_NAME "tas2557" -static struct miscdevice tas2557_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = MODULE_NAME, - .fops = &fops, -}; - -int tas2557_register_misc(struct tas2557_priv *pTAS2557) -{ - int ret = 0; - - g_tas2557 = pTAS2557; - - ret = misc_register(&tas2557_misc); - if (ret) - dev_err(pTAS2557->dev, "TAS2557 misc fail: %d\n", ret); - - dev_info(pTAS2557->dev, "%s, leave\n", __func__); - - return ret; -} - -int tas2557_deregister_misc(struct tas2557_priv *pTAS2557) -{ - misc_deregister(&tas2557_misc); - return 0; -} - -MODULE_AUTHOR("Texas Instruments Inc."); -MODULE_DESCRIPTION("TAS2557 Misc Smart Amplifier driver"); -MODULE_LICENSE("GPL v2"); -#endif diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557-misc.h b/techpack/audio/asoc/codecs/tas2557/tas2557-misc.h deleted file mode 100755 index fbcde772006d..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557-misc.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557-misc.h -** -** Description: -** header file for tas2557-misc.c -** -** ============================================================================= -*/ - -#ifndef _TAS2557_MISC_H -#define _TAS2557_MISC_H - -#define FW_NAME_SIZE 64 -#define FW_DESCRIPTION_SIZE 256 -#define PROGRAM_BUF_SIZE (5 + FW_NAME_SIZE + FW_DESCRIPTION_SIZE) -#define CONFIGURATION_BUF_SIZE (8 + FW_NAME_SIZE + FW_DESCRIPTION_SIZE) - -#define TIAUDIO_CMD_REG_WITE 1 -#define TIAUDIO_CMD_REG_READ 2 -#define TIAUDIO_CMD_DEBUG_ON 3 -#define TIAUDIO_CMD_PROGRAM 4 -#define TIAUDIO_CMD_CONFIGURATION 5 -#define TIAUDIO_CMD_FW_TIMESTAMP 6 -#define TIAUDIO_CMD_CALIBRATION 7 -#define TIAUDIO_CMD_SAMPLERATE 8 -#define TIAUDIO_CMD_BITRATE 9 -#define TIAUDIO_CMD_DACVOLUME 10 -#define TIAUDIO_CMD_SPEAKER 11 -#define TIAUDIO_CMD_FW_RELOAD 12 - -#define TAS2557_MAGIC_NUMBER 0x3235/* '2557' */ - -#define SMARTPA_SPK_DAC_VOLUME _IOWR(TAS2557_MAGIC_NUMBER, 1, unsigned long) -#define SMARTPA_SPK_POWER_ON _IOWR(TAS2557_MAGIC_NUMBER, 2, unsigned long) -#define SMARTPA_SPK_POWER_OFF _IOWR(TAS2557_MAGIC_NUMBER, 3, unsigned long) -#define SMARTPA_SPK_SWITCH_PROGRAM _IOWR(TAS2557_MAGIC_NUMBER, 4, unsigned long) -#define SMARTPA_SPK_SWITCH_CONFIGURATION _IOWR(TAS2557_MAGIC_NUMBER, 5, unsigned long) -#define SMARTPA_SPK_SWITCH_CALIBRATION _IOWR(TAS2557_MAGIC_NUMBER, 6, unsigned long) -#define SMARTPA_SPK_SET_SAMPLERATE _IOWR(TAS2557_MAGIC_NUMBER, 7, unsigned long) -#define SMARTPA_SPK_SET_BITRATE _IOWR(TAS2557_MAGIC_NUMBER, 8, unsigned long) - -int tas2557_register_misc(struct tas2557_priv *pTAS2557); -int tas2557_deregister_misc(struct tas2557_priv *pTAS2557); - -#endif /* _TAS2557_MISC_H */ diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557-regmap.c b/techpack/audio/asoc/codecs/tas2557/tas2557-regmap.c deleted file mode 100755 index 35b2877cd7b4..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557-regmap.c +++ /dev/null @@ -1,936 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557-regmap.c -** -** Description: -** I2C driver with regmap for Texas Instruments TAS2557 High Performance 4W Smart Amplifier -** -** ============================================================================= -*/ - -#ifdef CONFIG_TAS2557_REGMAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "tas2557.h" -#include "tas2557-core.h" -#include -#include -#ifdef CONFIG_TAS2557_CODEC -#include "tas2557-codec.h" -#endif - -#ifdef CONFIG_TAS2557_MISC -#include "tas2557-misc.h" -#endif - -#define ENABLE_TILOAD -#ifdef ENABLE_TILOAD -#include "tiload.h" -#endif -#include "../spk-id.h" - -#define LOW_TEMPERATURE_GAIN 6 -#define LOW_TEMPERATURE_COUNTER 12 - -static int tas2557_change_book_page( - struct tas2557_priv *pTAS2557, - unsigned char nBook, - unsigned char nPage) -{ - int nResult = 0; - - if ((pTAS2557->mnCurrentBook == nBook) - && pTAS2557->mnCurrentPage == nPage) - goto end; - - if (pTAS2557->mnCurrentBook != nBook) { - nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_PAGE, 0); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - goto end; - } - pTAS2557->mnCurrentPage = 0; - nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_REG, nBook); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - goto end; - } - pTAS2557->mnCurrentBook = nBook; - if (nPage != 0) { - nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_PAGE, nPage); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - goto end; - } - pTAS2557->mnCurrentPage = nPage; - } - } else if (pTAS2557->mnCurrentPage != nPage) { - nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_BOOKCTL_PAGE, nPage); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - goto end; - } - pTAS2557->mnCurrentPage = nPage; - } - -end: - if (nResult < 0) - pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; - else - pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; - - return nResult; -} - -static int tas2557_dev_read( - struct tas2557_priv *pTAS2557, - unsigned int nRegister, - unsigned int *pValue) -{ - int nResult = 0; - unsigned int Value = 0; - - mutex_lock(&pTAS2557->dev_lock); - - if (pTAS2557->mbTILoadActive) { - if (!(nRegister & 0x80000000)) - goto end; /* let only reads from TILoad pass. */ - nRegister &= ~0x80000000; - - dev_dbg(pTAS2557->dev, "TiLoad R REG B[%d]P[%d]R[%d]\n", - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister), - TAS2557_PAGE_REG(nRegister)); - } - - nResult = tas2557_change_book_page(pTAS2557, - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister)); - if (nResult >= 0) { - nResult = regmap_read(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), &Value); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; - goto end; - } else - pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; - *pValue = Value; - } - -end: - - mutex_unlock(&pTAS2557->dev_lock); - return nResult; -} - -static int tas2557_dev_write( - struct tas2557_priv *pTAS2557, - unsigned int nRegister, - unsigned int nValue) -{ - int nResult = 0; - - mutex_lock(&pTAS2557->dev_lock); - if ((nRegister == 0xAFFEAFFE) && (nValue == 0xBABEBABE)) { - pTAS2557->mbTILoadActive = true; - goto end; - } - - if ((nRegister == 0xBABEBABE) && (nValue == 0xAFFEAFFE)) { - pTAS2557->mbTILoadActive = false; - goto end; - } - - if (pTAS2557->mbTILoadActive) { - if (!(nRegister & 0x80000000)) - goto end;/* let only writes from TILoad pass. */ - nRegister &= ~0x80000000; - - dev_dbg(pTAS2557->dev, "TiLoad W REG B[%d]P[%d]R[%d] =0x%x\n", - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister), - TAS2557_PAGE_REG(nRegister), - nValue); - } - - nResult = tas2557_change_book_page(pTAS2557, - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister)); - if (nResult >= 0) { - nResult = regmap_write(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), nValue); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; - } else - pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; - } - -end: - - mutex_unlock(&pTAS2557->dev_lock); - - return nResult; -} - -static int tas2557_dev_bulk_read( - struct tas2557_priv *pTAS2557, - unsigned int nRegister, - u8 *pData, - unsigned int nLength) -{ - int nResult = 0; - int i; - - mutex_lock(&pTAS2557->dev_lock); - if (pTAS2557->mbTILoadActive) { - if (!(nRegister & 0x80000000)) - goto end; /* let only writes from TILoad pass. */ - - nRegister &= ~0x80000000; - dev_dbg(pTAS2557->dev, "TiLoad BR REG B[%d]P[%d]R[%d], count=%d\n", - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister), - TAS2557_PAGE_REG(nRegister), - nLength); - } - - nResult = tas2557_change_book_page(pTAS2557, - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister)); - if (nResult >= 0) { - #define STRIDE 4 - /* Read chunk bytes defined by STRIDE */ - for (i = 0; i < (nLength / STRIDE); i++) { - nResult = regmap_bulk_read(pTAS2557->mpRegmap, - TAS2557_PAGE_REG((nRegister + i*STRIDE)), - &pData[i*STRIDE], STRIDE); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; - } else { - pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; - } - } - - /* Read remaining bytes */ - if ((nLength % STRIDE) != 0) { - nResult = regmap_bulk_read(pTAS2557->mpRegmap, - TAS2557_PAGE_REG(nRegister + i*STRIDE), - &pData[i*STRIDE], (nLength % STRIDE)); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; - } else { - pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; - } - } - } - -end: - mutex_unlock(&pTAS2557->dev_lock); - return nResult; -} - -static int tas2557_dev_bulk_write( - struct tas2557_priv *pTAS2557, - unsigned int nRegister, - u8 *pData, - unsigned int nLength) -{ - int nResult = 0; - - mutex_lock(&pTAS2557->dev_lock); - if (pTAS2557->mbTILoadActive) { - if (!(nRegister & 0x80000000)) - goto end; /* let only writes from TILoad pass. */ - - nRegister &= ~0x80000000; - - dev_dbg(pTAS2557->dev, "TiLoad BW REG B[%d]P[%d]R[%d], count=%d\n", - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister), - TAS2557_PAGE_REG(nRegister), - nLength); - } - - nResult = tas2557_change_book_page( pTAS2557, - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister)); - if (nResult >= 0) { - nResult = regmap_bulk_write(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), pData, nLength); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; - } else - pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; - } - -end: - - mutex_unlock(&pTAS2557->dev_lock); - return nResult; -} - -static int tas2557_dev_update_bits( - struct tas2557_priv *pTAS2557, - unsigned int nRegister, - unsigned int nMask, - unsigned int nValue) -{ - int nResult = 0; - - mutex_lock(&pTAS2557->dev_lock); - - if (pTAS2557->mbTILoadActive) { - if (!(nRegister & 0x80000000)) - goto end; /* let only writes from TILoad pass. */ - - nRegister &= ~0x80000000; - dev_dbg(pTAS2557->dev, "TiLoad SB REG B[%d]P[%d]R[%d], mask=0x%x, value=0x%x\n", - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister), - TAS2557_PAGE_REG(nRegister), - nMask, nValue); - } - - nResult = tas2557_change_book_page( pTAS2557, - TAS2557_BOOK_ID(nRegister), - TAS2557_PAGE_ID(nRegister)); - if (nResult >= 0) { - nResult = regmap_update_bits(pTAS2557->mpRegmap, TAS2557_PAGE_REG(nRegister), nMask, nValue); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s, %d, I2C error %d\n", - __func__, __LINE__, nResult); - pTAS2557->mnErrCode |= ERROR_DEVA_I2C_COMM; - } else - pTAS2557->mnErrCode &= ~ERROR_DEVA_I2C_COMM; - } - -end: - mutex_unlock(&pTAS2557->dev_lock); - return nResult; -} - -void tas2557_clearIRQ(struct tas2557_priv *pTAS2557) -{ - unsigned int nValue; - int nResult = 0; - - nResult = pTAS2557->read(pTAS2557, TAS2557_FLAGS_1, &nValue); - if (nResult >= 0) - pTAS2557->read(pTAS2557, TAS2557_FLAGS_2, &nValue); - -} - - -void tas2557_enableIRQ(struct tas2557_priv *pTAS2557, bool enable) -{ - if (enable) { - if (!pTAS2557->mbIRQEnable) { - if (gpio_is_valid(pTAS2557->mnGpioINT)) { - enable_irq(pTAS2557->mnIRQ); - /* check after 10 ms */ - schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(10)); - pTAS2557->mbIRQEnable = true; - } - } - } else { - if (gpio_is_valid(pTAS2557->mnGpioINT)) - disable_irq_nosync(pTAS2557->mnIRQ); - pTAS2557->mbIRQEnable = false; - } -} - -static void tas2557_hw_reset(struct tas2557_priv *pTAS2557) -{ - if (gpio_is_valid(pTAS2557->mnResetGPIO)) { - gpio_direction_output(pTAS2557->mnResetGPIO, 0); - msleep(5); - gpio_direction_output(pTAS2557->mnResetGPIO, 1); - msleep(2); - } - - pTAS2557->mnCurrentBook = -1; - pTAS2557->mnCurrentPage = -1; - if (pTAS2557->mnErrCode) - dev_info(pTAS2557->dev, "before reset, ErrCode=0x%x\n", pTAS2557->mnErrCode); - pTAS2557->mnErrCode = 0; -} - -static void irq_work_routine(struct work_struct *work) -{ - int nResult = 0; - unsigned int nDevInt1Status = 0, nDevInt2Status = 0; - unsigned int nDevPowerUpFlag = 0; - int nCounter = 2; - struct tas2557_priv *pTAS2557 = - container_of(work, struct tas2557_priv, irq_work.work); - -#ifdef CONFIG_TAS2557_CODEC - mutex_lock(&pTAS2557->codec_lock); -#endif - -#ifdef CONFIG_TAS2557_MISC - mutex_lock(&pTAS2557->file_lock); -#endif - - if(pTAS2557->mnErrCode & ERROR_FAILSAFE) - goto program; - - if (pTAS2557->mbRuntimeSuspend) { - dev_info(pTAS2557->dev, "%s, Runtime Suspended\n", __func__); - goto end; - } - - if (!pTAS2557->mbPowerUp) { - dev_info(pTAS2557->dev, "%s, device not powered\n", __func__); - goto end; - } - - if ((!pTAS2557->mpFirmware->mnConfigurations) - || (!pTAS2557->mpFirmware->mnPrograms)) { - dev_info(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - goto end; - } - - nResult = tas2557_dev_read(pTAS2557, TAS2557_FLAGS_1, &nDevInt1Status); - if (nResult >= 0) - nResult = tas2557_dev_read(pTAS2557, TAS2557_FLAGS_2, &nDevInt2Status); - - if (nResult < 0) - goto program; - - if (((nDevInt1Status & 0xfc) != 0) || ((nDevInt2Status & 0x0c) != 0)) { - /* in case of INT_OC, INT_UV, INT_OT, INT_BO, INT_CL, INT_CLK1, INT_CLK2 */ - dev_err(pTAS2557->dev, "critical error: 0x%x, 0x%x\n", nDevInt1Status, nDevInt2Status); - if (nDevInt1Status & 0x80) { - pTAS2557->mnErrCode |= ERROR_OVER_CURRENT; - dev_err(pTAS2557->dev, "DEVA SPK over current!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_OVER_CURRENT; - - if (nDevInt1Status & 0x40) { - pTAS2557->mnErrCode |= ERROR_UNDER_VOLTAGE; - dev_err(pTAS2557->dev, "DEVA SPK under voltage!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_UNDER_VOLTAGE; - - if (nDevInt1Status & 0x20) { - pTAS2557->mnErrCode |= ERROR_CLK_HALT; - dev_err(pTAS2557->dev, "DEVA clk halted!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_CLK_HALT; - - if (nDevInt1Status & 0x10) { - pTAS2557->mnErrCode |= ERROR_DIE_OVERTEMP; - dev_err(pTAS2557->dev, "DEVA die over temperature!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_DIE_OVERTEMP; - - if (nDevInt1Status & 0x08) { - pTAS2557->mnErrCode |= ERROR_BROWNOUT; - dev_err(pTAS2557->dev, "DEVA brownout!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_BROWNOUT; - - if (nDevInt1Status & 0x04) { - pTAS2557->mnErrCode |= ERROR_CLK_LOST; - dev_err(pTAS2557->dev, "DEVA clock lost!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_CLK_LOST; - - if (nDevInt2Status & 0x08) { - pTAS2557->mnErrCode |= ERROR_CLK_DET1; - dev_err(pTAS2557->dev, "DEVA clk detection 1!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_CLK_DET1; - - if (nDevInt2Status & 0x04) { - pTAS2557->mnErrCode |= ERROR_CLK_DET2; - dev_err(pTAS2557->dev, "DEVA clk detection 2!\n"); - } else - pTAS2557->mnErrCode &= ~ERROR_CLK_DET2; - - goto program; - } else { - dev_dbg(pTAS2557->dev, "IRQ Status: 0x%x, 0x%x\n", nDevInt1Status, nDevInt2Status); - nCounter = 2; - while (nCounter > 0) { - nResult = tas2557_dev_read(pTAS2557, TAS2557_POWER_UP_FLAG_REG, &nDevPowerUpFlag); - if (nResult < 0) - goto program; - if ((nDevPowerUpFlag & 0xc0) == 0xc0) - break; - nCounter--; - if (nCounter > 0) { - /* in case check pow status just after power on TAS2557 */ - dev_dbg(pTAS2557->dev, "PowSts: 0x%x, check again after 10ms\n", - nDevPowerUpFlag); - msleep(10); - } - } - if ((nDevPowerUpFlag & 0xc0) != 0xc0) { - dev_err(pTAS2557->dev, "%s, Critical ERROR B[%d]_P[%d]_R[%d]= 0x%x\n", - __func__, - TAS2557_BOOK_ID(TAS2557_POWER_UP_FLAG_REG), - TAS2557_PAGE_ID(TAS2557_POWER_UP_FLAG_REG), - TAS2557_PAGE_REG(TAS2557_POWER_UP_FLAG_REG), - nDevPowerUpFlag); - pTAS2557->mnErrCode |= ERROR_CLASSD_PWR; - goto program; - } - pTAS2557->mnErrCode &= ~ERROR_CLASSD_PWR; - - dev_dbg(pTAS2557->dev, "%s: INT1=0x%x, INT2=0x%x; PowerUpFlag=0x%x\n", - __func__, nDevInt1Status, nDevInt2Status, nDevPowerUpFlag); - goto end; - } - -program: - /* hardware reset and reload */ - tas2557_set_program(pTAS2557, pTAS2557->mnCurrentProgram, pTAS2557->mnCurrentConfiguration); - -end: - -#ifdef CONFIG_TAS2557_MISC - mutex_unlock(&pTAS2557->file_lock); -#endif - -#ifdef CONFIG_TAS2557_CODEC - mutex_unlock(&pTAS2557->codec_lock); -#endif -} - -static irqreturn_t tas2557_irq_handler(int irq, void *dev_id) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)dev_id; - - tas2557_enableIRQ(pTAS2557, false); - /* get IRQ status after 100 ms */ - schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(100)); - return IRQ_HANDLED; -} - -static enum hrtimer_restart temperature_timer_func(struct hrtimer *timer) -{ - struct tas2557_priv *pTAS2557 = container_of(timer, struct tas2557_priv, mtimer); - - if (pTAS2557->mbPowerUp) { - schedule_work(&pTAS2557->mtimerwork); - schedule_delayed_work(&pTAS2557->irq_work, msecs_to_jiffies(1)); - } - return HRTIMER_NORESTART; -} - -static void timer_work_routine(struct work_struct *work) -{ - struct tas2557_priv *pTAS2557 = container_of(work, struct tas2557_priv, mtimerwork); - int nResult, nTemp, nActTemp; - struct TProgram *pProgram; - static int nAvg; - -#ifdef CONFIG_TAS2557_CODEC - mutex_lock(&pTAS2557->codec_lock); -#endif - -#ifdef CONFIG_TAS2557_MISC - mutex_lock(&pTAS2557->file_lock); -#endif - - if (pTAS2557->mbRuntimeSuspend) { - dev_info(pTAS2557->dev, "%s, Runtime Suspended\n", __func__); - goto end; - } - - if (!pTAS2557->mpFirmware->mnConfigurations) { - dev_info(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - goto end; - } - - pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); - if (!pTAS2557->mbPowerUp - || (pProgram->mnAppMode != TAS2557_APP_TUNINGMODE)) { - dev_info(pTAS2557->dev, "%s, pass, Pow=%d, program=%s\n", - __func__, pTAS2557->mbPowerUp, pProgram->mpName); - goto end; - } - - nResult = tas2557_get_die_temperature(pTAS2557, &nTemp); - if (nResult >= 0) { - nActTemp = (int)(nTemp >> 23); - dev_dbg(pTAS2557->dev, "Die=0x%x, degree=%d\n", nTemp, nActTemp); - if (!pTAS2557->mnDieTvReadCounter) - nAvg = 0; - pTAS2557->mnDieTvReadCounter++; - nAvg += nActTemp; - if (!(pTAS2557->mnDieTvReadCounter % LOW_TEMPERATURE_COUNTER)) { - nAvg /= LOW_TEMPERATURE_COUNTER; - dev_dbg(pTAS2557->dev, "check : avg=%d\n", nAvg); - if (nAvg < -6) { - /* if Die temperature is below -6 degree C */ - if (pTAS2557->mnDevCurrentGain != LOW_TEMPERATURE_GAIN) { - nResult = tas2557_set_DAC_gain(pTAS2557, LOW_TEMPERATURE_GAIN); - if (nResult < 0) - goto end; - pTAS2557->mnDevCurrentGain = LOW_TEMPERATURE_GAIN; - dev_dbg(pTAS2557->dev, "LOW Temp: set gain to %d\n", LOW_TEMPERATURE_GAIN); - } - } else if (nAvg > 5) { - /* if Die temperature is above 5 degree C */ - if (pTAS2557->mnDevCurrentGain != pTAS2557->mnDevGain) { - nResult = tas2557_set_DAC_gain(pTAS2557, pTAS2557->mnDevGain); - if (nResult < 0) - goto end; - pTAS2557->mnDevCurrentGain = pTAS2557->mnDevGain; - dev_dbg(pTAS2557->dev, "LOW Temp: set gain to original\n"); - } - } - nAvg = 0; - } - - if (pTAS2557->mbPowerUp) - hrtimer_start(&pTAS2557->mtimer, - ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); - } - -end: - -#ifdef CONFIG_TAS2557_MISC - mutex_unlock(&pTAS2557->file_lock); -#endif - -#ifdef CONFIG_TAS2557_CODEC - mutex_unlock(&pTAS2557->codec_lock); -#endif -} - -static int tas2557_runtime_suspend(struct tas2557_priv *pTAS2557) -{ - dev_dbg(pTAS2557->dev, "%s\n", __func__); - - pTAS2557->mbRuntimeSuspend = true; - - if (hrtimer_active(&pTAS2557->mtimer)) { - dev_dbg(pTAS2557->dev, "cancel die temp timer\n"); - hrtimer_cancel(&pTAS2557->mtimer); - } - if (work_pending(&pTAS2557->mtimerwork)) { - dev_dbg(pTAS2557->dev, "cancel timer work\n"); - cancel_work_sync(&pTAS2557->mtimerwork); - } - if (delayed_work_pending(&pTAS2557->irq_work)) { - dev_dbg(pTAS2557->dev, "cancel IRQ work\n"); - cancel_delayed_work_sync(&pTAS2557->irq_work); - } - - return 0; -} - -static int tas2557_runtime_resume(struct tas2557_priv *pTAS2557) -{ - struct TProgram *pProgram; - - dev_dbg(pTAS2557->dev, "%s\n", __func__); - if (!pTAS2557->mpFirmware->mpPrograms) { - dev_dbg(pTAS2557->dev, "%s, firmware not loaded\n", __func__); - goto end; - } - - if (pTAS2557->mnCurrentProgram >= pTAS2557->mpFirmware->mnPrograms) { - dev_err(pTAS2557->dev, "%s, firmware corrupted\n", __func__); - goto end; - } - - pProgram = &(pTAS2557->mpFirmware->mpPrograms[pTAS2557->mnCurrentProgram]); - if (pTAS2557->mbPowerUp && (pProgram->mnAppMode == TAS2557_APP_TUNINGMODE)) { - if (!hrtimer_active(&pTAS2557->mtimer)) { - dev_dbg(pTAS2557->dev, "%s, start Die Temp check timer\n", __func__); - pTAS2557->mnDieTvReadCounter = 0; - hrtimer_start(&pTAS2557->mtimer, - ns_to_ktime((u64)LOW_TEMPERATURE_CHECK_PERIOD * NSEC_PER_MSEC), HRTIMER_MODE_REL); - } - } - - pTAS2557->mbRuntimeSuspend = false; -end: - - return 0; -} - -static bool tas2557_volatile(struct device *pDev, unsigned int nRegister) -{ - return true; -} - -static bool tas2557_writeable(struct device *pDev, unsigned int nRegister) -{ - return true; -} - -static const struct regmap_config tas2557_i2c_regmap = { - .reg_bits = 8, - .val_bits = 8, - .writeable_reg = tas2557_writeable, - .volatile_reg = tas2557_volatile, - .cache_type = REGCACHE_NONE, - .max_register = 128, -}; - -/* tas2557_i2c_probe : -* platform dependent -* should implement hardware reset functionality -*/ -static int tas2557_i2c_probe(struct i2c_client *pClient, - const struct i2c_device_id *pID) -{ - struct tas2557_priv *pTAS2557; - int nResult = 0; - unsigned int nValue = 0; - const char *pFWName; - - dev_info(&pClient->dev, "%s enter\n", __func__); - - pTAS2557 = devm_kzalloc(&pClient->dev, sizeof(struct tas2557_priv), GFP_KERNEL); - if (!pTAS2557) { - nResult = -ENOMEM; - goto err; - } - - pTAS2557->dev = &pClient->dev; - i2c_set_clientdata(pClient, pTAS2557); - dev_set_drvdata(&pClient->dev, pTAS2557); - - pTAS2557->mpRegmap = devm_regmap_init_i2c(pClient, &tas2557_i2c_regmap); - if (IS_ERR(pTAS2557->mpRegmap)) { - nResult = PTR_ERR(pTAS2557->mpRegmap); - dev_err(&pClient->dev, "Failed to allocate register map: %d\n", - nResult); - goto err; - } - - if (pClient->dev.of_node) - tas2557_parse_dt(&pClient->dev, pTAS2557); - - if (gpio_is_valid(pTAS2557->mnResetGPIO)) { - nResult = gpio_request(pTAS2557->mnResetGPIO, "TAS2557-RESET"); - if (nResult < 0) { - dev_err(pTAS2557->dev, "%s: GPIO %d request error\n", - __func__, pTAS2557->mnResetGPIO); - goto err; - } - tas2557_hw_reset(pTAS2557); - } - - pTAS2557->read = tas2557_dev_read; - pTAS2557->write = tas2557_dev_write; - pTAS2557->bulk_read = tas2557_dev_bulk_read; - pTAS2557->bulk_write = tas2557_dev_bulk_write; - pTAS2557->update_bits = tas2557_dev_update_bits; - pTAS2557->enableIRQ = tas2557_enableIRQ; - pTAS2557->clearIRQ = tas2557_clearIRQ; - pTAS2557->set_config = tas2557_set_config; - pTAS2557->set_calibration = tas2557_set_calibration; - pTAS2557->hw_reset = tas2557_hw_reset; - pTAS2557->runtime_suspend = tas2557_runtime_suspend; - pTAS2557->runtime_resume = tas2557_runtime_resume; - pTAS2557->mnRestart = 0; - - mutex_init(&pTAS2557->dev_lock); - - /* Reset the chip */ - nResult = tas2557_dev_write(pTAS2557, TAS2557_SW_RESET_REG, 0x01); - if (nResult < 0) { - dev_err(&pClient->dev, "I2c fail, %d\n", nResult); - goto err; - } - - msleep(1); - { - - int i; - for(i =0; i<0x10; i++){ - tas2557_dev_read(pTAS2557, i, &nValue); - dev_err(pTAS2557->dev, "address:%x value: %x\n",i, nValue); - } - } - - /* Ti's original codes logic (which firmware binary selected) */ - tas2557_dev_read(pTAS2557, TAS2557_REV_PGID_REG, &nValue); - pTAS2557->mnPGID = nValue; - if (pTAS2557->mnPGID == TAS2557_PG_VERSION_2P1) { - dev_info(pTAS2557->dev, "PG2.1 Silicon found\n"); - pFWName = TAS2557_AAC_FW_NAME; - } else if (pTAS2557->mnPGID == TAS2557_PG_VERSION_1P0) { - dev_info(pTAS2557->dev, "PG1.0 Silicon found\n"); - pFWName = TAS2557_PG1P0_FW_NAME; - } else { - nResult = -ENOTSUPP; - dev_info(pTAS2557->dev, "unsupport Silicon 0x%x\n", pTAS2557->mnPGID); - goto err; - } - - /* Use our codecs logic to select Firmware binary */ - if (pTAS2557->mnSpkType == VENDOR_ID_GOER) - pFWName = TAS2557_GOER_FW_NAME; - else if (pTAS2557->mnSpkType == VENDOR_ID_AAC) - pFWName = TAS2557_AAC_FW_NAME; - else if (pTAS2557->mnSpkType == VENDOR_ID_SSI) - pFWName = TAS2557_SSI_FW_NAME; - else - pFWName = TAS2557_DEFAULT_FW_NAME; - - if (gpio_is_valid(pTAS2557->mnGpioINT)) { - nResult = gpio_request(pTAS2557->mnGpioINT, "TAS2557-IRQ"); - if (nResult < 0) { - dev_err(pTAS2557->dev, - "%s: GPIO %d request INT error\n", - __func__, pTAS2557->mnGpioINT); - goto err; - } - - gpio_direction_input(pTAS2557->mnGpioINT); - pTAS2557->mnIRQ = gpio_to_irq(pTAS2557->mnGpioINT); - dev_dbg(pTAS2557->dev, "irq = %d\n", pTAS2557->mnIRQ); - INIT_DELAYED_WORK(&pTAS2557->irq_work, irq_work_routine); - nResult = request_threaded_irq(pTAS2557->mnIRQ, tas2557_irq_handler, - NULL, IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - pClient->name, pTAS2557); - if (nResult < 0) { - dev_err(pTAS2557->dev, - "request_irq failed, %d\n", nResult); - goto err; - } - disable_irq_nosync(pTAS2557->mnIRQ); - } - - pTAS2557->mpFirmware = devm_kzalloc(&pClient->dev, sizeof(struct TFirmware), GFP_KERNEL); - if (!pTAS2557->mpFirmware) { - nResult = -ENOMEM; - goto err; - } - - pTAS2557->mpCalFirmware = devm_kzalloc(&pClient->dev, sizeof(struct TFirmware), GFP_KERNEL); - if (!pTAS2557->mpCalFirmware) { - nResult = -ENOMEM; - goto err; - } - -#ifdef CONFIG_TAS2557_CODEC - mutex_init(&pTAS2557->codec_lock); - tas2557_register_codec(pTAS2557); -#endif - -#ifdef CONFIG_TAS2557_MISC - mutex_init(&pTAS2557->file_lock); - tas2557_register_misc(pTAS2557); -#endif - -#ifdef ENABLE_TILOAD - tiload_driver_init(pTAS2557); -#endif - dev_dbg(pTAS2557->dev, " firmware name %s\n", pFWName); - hrtimer_init(&pTAS2557->mtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - pTAS2557->mtimer.function = temperature_timer_func; - INIT_WORK(&pTAS2557->mtimerwork, timer_work_routine); - - nResult = request_firmware_nowait(THIS_MODULE, 1, pFWName, - pTAS2557->dev, GFP_KERNEL, pTAS2557, tas2557_fw_ready); - -err: - - return nResult; -} - -static int tas2557_i2c_remove(struct i2c_client *pClient) -{ - struct tas2557_priv *pTAS2557 = i2c_get_clientdata(pClient); - - dev_info(pTAS2557->dev, "%s\n", __func__); - -#ifdef CONFIG_TAS2557_CODEC - tas2557_deregister_codec(pTAS2557); - mutex_destroy(&pTAS2557->codec_lock); -#endif - -#ifdef CONFIG_TAS2557_MISC - tas2557_deregister_misc(pTAS2557); - mutex_destroy(&pTAS2557->file_lock); -#endif - - mutex_destroy(&pTAS2557->dev_lock); - return 0; -} - -static const struct i2c_device_id tas2557_i2c_id[] = { - {"tas2557", 0}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, tas2557_i2c_id); - -#if defined(CONFIG_OF) -static const struct of_device_id tas2557_of_match[] = { - {.compatible = "ti,tas2557"}, - {}, -}; - -MODULE_DEVICE_TABLE(of, tas2557_of_match); -#endif - -static struct i2c_driver tas2557_i2c_driver = { - .driver = { - .name = "tas2557", - .owner = THIS_MODULE, -#if defined(CONFIG_OF) - .of_match_table = of_match_ptr(tas2557_of_match), -#endif - }, - .probe = tas2557_i2c_probe, - .remove = tas2557_i2c_remove, - .id_table = tas2557_i2c_id, -}; - -module_i2c_driver(tas2557_i2c_driver); - -MODULE_AUTHOR("Texas Instruments Inc."); -MODULE_DESCRIPTION("TAS2557 I2C Smart Amplifier driver"); -MODULE_LICENSE("GPL v2"); - -#endif diff --git a/techpack/audio/asoc/codecs/tas2557/tas2557.h b/techpack/audio/asoc/codecs/tas2557/tas2557.h deleted file mode 100755 index fb5bf866f8b0..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tas2557.h +++ /dev/null @@ -1,496 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tas2557.h -** -** Description: -** definitions and data structures for TAS2557 Android Linux driver -** -** ============================================================================= -*/ - -#ifndef _TAS2557_H -#define _TAS2557_H - -#include -#include -#include - -/* Page Control Register */ -#define TAS2557_PAGECTL_REG 0 - -/* Book Control Register (available in page0 of each book) */ -#define TAS2557_BOOKCTL_PAGE 0 -#define TAS2557_BOOKCTL_REG 127 - -/* 0000 0000 0BBB BBBB BPPP PPPP PRRR RRRR */ - -#define TAS2557_REG(book, page, reg) ((((unsigned int)book * 256 * 128) + \ - ((unsigned int)page * 128)) + reg) - -#define TAS2557_BOOK_ID(reg) ((unsigned char)(reg / (256 * 128))) -#define TAS2557_PAGE_ID(reg) ((unsigned char)((reg % (256 * 128)) / 128)) -#define TAS2557_BOOK_REG(reg) ((unsigned char)(reg % (256 * 128))) -#define TAS2557_PAGE_REG(reg) ((unsigned char)((reg % (256 * 128)) % 128)) - -/* Book0, Page0 registers */ -#define TAS2557_SW_RESET_REG TAS2557_REG(0, 0, 1) - -#define TAS2557_REV_PGID_REG TAS2557_REG(0, 0, 3) -#define TAS2557_PG_VERSION_1P0 0x80 -#define TAS2557_PG_VERSION_2P0 0x90 -#define TAS2557_PG_VERSION_2P1 0xa0 - -#define TAS2557_POWER_CTRL1_REG TAS2557_REG(0, 0, 4) -#define TAS2557_POWER_CTRL2_REG TAS2557_REG(0, 0, 5) - -#define TAS2557_SPK_CTRL_REG TAS2557_REG(0, 0, 6) -/* B0P0R6 - TAS2557_SPK_CTRL_REG */ -#define TAS2557_DAC_GAIN_MASK (0xf << 3) -#define TAS2557_DAC_GAIN_SHIFT 0x03 - -#define TAS2557_MUTE_REG TAS2557_REG(0, 0, 7) -#define TAS2557_SNS_CTRL_REG TAS2557_REG(0, 0, 8) -#define TAS2557_ADC_INPUT_SEL_REG TAS2557_REG(0, 0, 9) -#define TAS2557_DBOOST_CTL_REG TAS2557_REG(0, 0, 10) -#define TAS2557_NONAME11_REG TAS2557_REG(0, 0, 11) -#define TAS2557_NONAME12_REG TAS2557_REG(0, 0, 12) -#define TAS2557_NONAME13_REG TAS2557_REG(0, 0, 13) -#define TAS2557_NONAME14_REG TAS2557_REG(0, 0, 14) -#define TAS2557_NONAME15_REG TAS2557_REG(0, 0, 15) -#define TAS2557_NONAME16_REG TAS2557_REG(0, 0, 16) -#define TAS2557_NONAME17_REG TAS2557_REG(0, 0, 17) -#define TAS2557_NONAME18_REG TAS2557_REG(0, 0, 18) -#define TAS2557_SAR_SAMPLING_TIME_REG TAS2557_REG(0, 0, 19) -#define TAS2557_SAR_ADC1_REG TAS2557_REG(0, 0, 20) -#define TAS2557_SAR_ADC2_REG TAS2557_REG(0, 0, 21) /* B0_P0_R0x15*/ -#define TAS2557_CRC_CHECKSUM_REG TAS2557_REG(0, 0, 32) -#define TAS2557_CRC_RESET_REG TAS2557_REG(0, 0, 33) -#define TAS2557_DSP_MODE_SELECT_REG TAS2557_REG(0, 0, 34) -#define TAS2557_SAFE_GUARD_REG TAS2557_REG(0, 0, 37) -#define TAS2557_ASI_CTL1_REG TAS2557_REG(0, 0, 42) -#define TAS2557_CLK_ERR_CTRL TAS2557_REG(0, 0, 44) /* B0_P0_R0x2c*/ -#define TAS2557_CLK_ERR_CTRL2 TAS2557_REG(0, 0, 45) /* B0_P0_R0x2d*/ -#define TAS2557_CLK_ERR_CTRL3 TAS2557_REG(0, 0, 46) /* B0_P0_R0x2e*/ -#define TAS2557_DBOOST_CFG_REG TAS2557_REG(0, 0, 52) -#define TAS2557_POWER_UP_FLAG_REG TAS2557_REG(0, 0, 100) -#define TAS2557_FLAGS_1 TAS2557_REG(0, 0, 104) /* B0_P0_R0x68*/ -#define TAS2557_FLAGS_2 TAS2557_REG(0, 0, 108) /* B0_P0_R0x6c*/ - -/* Book0, Page1 registers */ -#define TAS2557_ASI1_DAC_FORMAT_REG TAS2557_REG(0, 1, 1) -#define TAS2557_ASI1_ADC_FORMAT_REG TAS2557_REG(0, 1, 2) -#define TAS2557_ASI1_OFFSET1_REG TAS2557_REG(0, 1, 3) -#define TAS2557_ASI1_ADC_PATH_REG TAS2557_REG(0, 1, 7) -#define TAS2557_ASI1_DAC_BCLK_REG TAS2557_REG(0, 1, 8) -#define TAS2557_ASI1_DAC_WCLK_REG TAS2557_REG(0, 1, 9) -#define TAS2557_ASI1_ADC_BCLK_REG TAS2557_REG(0, 1, 10) -#define TAS2557_ASI1_ADC_WCLK_REG TAS2557_REG(0, 1, 11) -#define TAS2557_ASI1_DIN_DOUT_MUX_REG TAS2557_REG(0, 1, 12) -#define TAS2557_ASI1_BDIV_CLK_SEL_REG TAS2557_REG(0, 1, 13) -#define TAS2557_ASI1_BDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 14) -#define TAS2557_ASI1_WDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 15) -#define TAS2557_ASI1_DAC_CLKOUT_REG TAS2557_REG(0, 1, 16) -#define TAS2557_ASI1_ADC_CLKOUT_REG TAS2557_REG(0, 1, 17) -#define TAS2557_ASI2_DAC_FORMAT_REG TAS2557_REG(0, 1, 21) -#define TAS2557_ASI2_ADC_FORMAT_REG TAS2557_REG(0, 1, 22) -#define TAS2557_ASI2_OFFSET1_REG TAS2557_REG(0, 1, 23) -#define TAS2557_ASI2_ADC_PATH_REG TAS2557_REG(0, 1, 27) -#define TAS2557_ASI2_DAC_BCLK_REG TAS2557_REG(0, 1, 28) -#define TAS2557_ASI2_DAC_WCLK_REG TAS2557_REG(0, 1, 29) -#define TAS2557_ASI2_ADC_BCLK_REG TAS2557_REG(0, 1, 30) -#define TAS2557_ASI2_ADC_WCLK_REG TAS2557_REG(0, 1, 31) -#define TAS2557_ASI2_DIN_DOUT_MUX_REG TAS2557_REG(0, 1, 32) -#define TAS2557_ASI2_BDIV_CLK_SEL_REG TAS2557_REG(0, 1, 33) -#define TAS2557_ASI2_BDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 34) -#define TAS2557_ASI2_WDIV_CLK_RATIO_REG TAS2557_REG(0, 1, 35) -#define TAS2557_ASI2_DAC_CLKOUT_REG TAS2557_REG(0, 1, 36) -#define TAS2557_ASI2_ADC_CLKOUT_REG TAS2557_REG(0, 1, 37) -#define TAS2557_GPIO1_PIN_REG TAS2557_REG(0, 1, 61) /*B0_P1_R0x3d */ -#define TAS2557_GPIO2_PIN_REG TAS2557_REG(0, 1, 62) /*B0_P1_R0x3e */ -#define TAS2557_GPIO3_PIN_REG TAS2557_REG(0, 1, 63) /*B0_P1_R0x3f */ -#define TAS2557_GPIO4_PIN_REG TAS2557_REG(0, 1, 64) /*B0_P1_R0x40 */ -#define TAS2557_GPIO5_PIN_REG TAS2557_REG(0, 1, 65) -#define TAS2557_GPIO6_PIN_REG TAS2557_REG(0, 1, 66) -#define TAS2557_GPIO7_PIN_REG TAS2557_REG(0, 1, 67) -#define TAS2557_GPIO8_PIN_REG TAS2557_REG(0, 1, 68) -#define TAS2557_GPIO9_PIN_REG TAS2557_REG(0, 1, 69) -#define TAS2557_GPIO10_PIN_REG TAS2557_REG(0, 1, 70) -#define TAS2557_GPI_PIN_REG TAS2557_REG(0, 1, 77) /*B0_P1_R0x4d */ -#define TAS2557_GPIO_HIZ_CTRL1_REG TAS2557_REG(0, 1, 79) -#define TAS2557_GPIO_HIZ_CTRL2_REG TAS2557_REG(0, 1, 80) /*B0_P1_R0x50 */ -#define TAS2557_GPIO_HIZ_CTRL3_REG TAS2557_REG(0, 1, 81) -#define TAS2557_GPIO_HIZ_CTRL4_REG TAS2557_REG(0, 1, 82) -#define TAS2557_GPIO_HIZ_CTRL5_REG TAS2557_REG(0, 1, 83) -#define TAS2557_BIT_BANG_CTRL_REG TAS2557_REG(0, 1, 87) -#define TAS2557_BIT_BANG_OUT1_REG TAS2557_REG(0, 1, 88) -#define TAS2557_BIT_BANG_OUT2_REG TAS2557_REG(0, 1, 89) -#define TAS2557_BIT_BANG_IN1_REG TAS2557_REG(0, 1, 90) -#define TAS2557_BIT_BANG_IN2_REG TAS2557_REG(0, 1, 91) -#define TAS2557_BIT_BANG_IN3_REG TAS2557_REG(0, 1, 92) -#define TAS2557_PDM_IN_CLK_REG TAS2557_REG(0, 1, 94) -#define TAS2557_PDM_IN_PIN_REG TAS2557_REG(0, 1, 95) -#define TAS2557_ASIM_IFACE1_REG TAS2557_REG(0, 1, 98) -#define TAS2557_ASIM_FORMAT_REG TAS2557_REG(0, 1, 99) -#define TAS2557_ASIM_IFACE3_REG TAS2557_REG(0, 1, 100) -#define TAS2557_ASIM_IFACE4_REG TAS2557_REG(0, 1, 101) -#define TAS2557_ASIM_IFACE5_REG TAS2557_REG(0, 1, 102) -#define TAS2557_ASIM_IFACE6_REG TAS2557_REG(0, 1, 103) -#define TAS2557_ASIM_IFACE7_REG TAS2557_REG(0, 1, 104) -#define TAS2557_ASIM_IFACE8_REG TAS2557_REG(0, 1, 105) -#define TAS2557_CLK_HALT_REG TAS2557_REG(0, 1, 106) /* B0_P1_R0x6a */ -#define TAS2557_INT_GEN1_REG TAS2557_REG(0, 1, 108) /* B0_P1_R0x6c */ -#define TAS2557_INT_GEN2_REG TAS2557_REG(0, 1, 109) /* B0_P1_R0x6d */ -#define TAS2557_INT_GEN3_REG TAS2557_REG(0, 1, 110) /* B0_P1_R0x6e */ -#define TAS2557_INT_GEN4_REG TAS2557_REG(0, 1, 111) /* B0_P1_R0x6f */ -#define TAS2557_INT_MODE_REG TAS2557_REG(0, 1, 114) /* B0_P1_R0x72 */ -#define TAS2557_MAIN_CLKIN_REG TAS2557_REG(0, 1, 115) -#define TAS2557_PLL_CLKIN_REG TAS2557_REG(0, 1, 116) -#define TAS2557_CLKOUT_MUX_REG TAS2557_REG(0, 1, 117) -#define TAS2557_CLKOUT_CDIV_REG TAS2557_REG(0, 1, 118) -#define TAS2557_HACK_GP01_REG TAS2557_REG(0, 1, 122) - -#define TAS2557_HACK01_REG TAS2557_REG(0, 2, 10) - -#define TAS2557_ISENSE_THRESHOLD TAS2557_REG(0, 50, 104) -#define TAS2557_BOOSTON_EFFICIENCY TAS2557_REG(0, 51, 16) -#define TAS2557_BOOSTOFF_EFFICIENCY TAS2557_REG(0, 51, 20) -#define TAS2557_BOOST_HEADROOM TAS2557_REG(0, 51, 24) -#define TAS2557_THERMAL_FOLDBACK_REG TAS2557_REG(0, 51, 100) - -#define TAS2557_SA_PG2P1_CHL_CTRL_REG TAS2557_REG(0, 53, 20) /* B0_P0x35_R0x14 */ -#define TAS2557_SA_COEFF_SWAP_REG TAS2557_REG(0, 53, 44) /* B0_P0x35_R0x2c */ - -#define TAS2557_SA_PG1P0_CHL_CTRL_REG TAS2557_REG(0, 58, 120) /* B0_P0x3a_R0x78 */ - -#define TAS2557_TEST_MODE_REG TAS2557_REG(0, 253, 13) /* B0_P0xfd_R0x0d */ -#define TAS2557_BROADCAST_REG TAS2557_REG(0, 253, 54) /* B0_P0xfd_R0x36 */ -#define TAS2557_CRYPTIC_REG TAS2557_REG(0, 253, 71) -#define TAS2557_PG2P1_CALI_R0_REG TAS2557_REG(0x8c, 0x2f, 0x40) -#define TAS2557_PG1P0_CALI_R0_REG TAS2557_REG(0x8c, 0x2f, 0x28) -#define TAS2557_PG2P1_CALI_T_REG TAS2557_REG(0x8c, 0x30, 0x20) -#define TAS2557_PG1P0_CALI_T_REG TAS2557_REG(0x8c, 0x30, 0x08) - -#define TAS2557_DAC_INTERPOL_REG TAS2557_REG(100, 0, 1) -#define TAS2557_SOFT_MUTE_REG TAS2557_REG(100, 0, 7) -#define TAS2557_PLL_P_VAL_REG TAS2557_REG(100, 0, 27) -#define TAS2557_PLL_J_VAL_REG TAS2557_REG(100, 0, 28) -#define TAS2557_PLL_D_VAL_MSB_REG TAS2557_REG(100, 0, 29) -#define TAS2557_PLL_D_VAL_LSB_REG TAS2557_REG(100, 0, 30) -#define TAS2557_CLK_MISC_REG TAS2557_REG(100, 0, 31) -#define TAS2557_PLL_N_VAL_REG TAS2557_REG(100, 0, 32) -#define TAS2557_DAC_MADC_VAL_REG TAS2557_REG(100, 0, 33) -#define TAS2557_ISENSE_DIV_REG TAS2557_REG(100, 0, 42) -#define TAS2557_RAMP_CLK_DIV_MSB_REG TAS2557_REG(100, 0, 43) -#define TAS2557_RAMP_CLK_DIV_LSB_REG TAS2557_REG(100, 0, 44) - -#define TAS2557_DIE_TEMP_REG TAS2557_REG(130, 2, 124) /* B0x82_P0x02_R0x7C */ - -/* Bits */ -/* B0P0R4 - TAS2557_POWER_CTRL1_REG */ -#define TAS2557_SW_SHUTDOWN (0x1 << 0) -#define TAS2557_MADC_POWER_UP (0x1 << 3) -#define TAS2557_MDAC_POWER_UP (0x1 << 4) -#define TAS2557_NDIV_POWER_UP (0x1 << 5) -#define TAS2557_PLL_POWER_UP (0x1 << 6) -#define TAS2557_DSP_POWER_UP (0x1 << 7) - -/* B0P0R5 - TAS2557_POWER_CTRL2_REG */ -#define TAS2557_VSENSE_ENABLE (0x1 << 0) -#define TAS2557_ISENSE_ENABLE (0x1 << 1) -#define TAS2557_BOOST_ENABLE (0x1 << 5) -#define TAS2557_CLASSD_ENABLE (0x1 << 7) - -/* B0P0R7 - TAS2557_MUTE_REG */ -#define TAS2557_CLASSD_MUTE (0x1 << 0) -#define TAS2557_ISENSE_MUTE (0x1 << 1) - -/* B0P253R13 - TAS2557_TEST_MODE_REG */ -#define TAS2557_TEST_MODE_ENABLE (13) -#define TAS2557_TEST_MODE_MASK (0xf << 0) - -/* B0P253R71 - TAS2557_CRYPTIC_REG */ -#define TAS2557_OSC_TRIM_CAP(x) ((x & 0x3f) << 0) -#define TAS2557_DISABLE_ENCRYPTION (0x1 << 6) -#define TAS2557_SL_COMP (0x1 << 7) - -/* B0P1R115/6 - TAS2557_MAIN/PLL_CLKIN_REG */ -#define TAS2557_XXX_CLKIN_GPIO1 (0) -#define TAS2557_XXX_CLKIN_GPIO2 (1) -#define TAS2557_XXX_CLKIN_GPIO3 (2) -#define TAS2557_XXX_CLKIN_GPIO4 (3) -#define TAS2557_XXX_CLKIN_GPIO5 (4) -#define TAS2557_XXX_CLKIN_GPIO6 (5) -#define TAS2557_XXX_CLKIN_GPIO7 (6) -#define TAS2557_XXX_CLKIN_GPIO8 (7) -#define TAS2557_XXX_CLKIN_GPIO9 (8) -#define TAS2557_XXX_CLKIN_GPIO10 (9) -#define TAS2557_XXX_CLKIN_GPI1 (12) -#define TAS2557_XXX_CLKIN_GPI2 (13) -#define TAS2557_XXX_CLKIN_GPI3 (14) -#define TAS2557_NDIV_CLKIN_PLL (15) -#define TAS2557_PLL_CLKIN_INT_OSC (15) - -#define TAS2557_MCLK_CLKIN_SRC_GPIO1 (0) -#define TAS2557_MCLK_CLKIN_SRC_GPIO2 (1) -#define TAS2557_MCLK_CLKIN_SRC_GPIO3 (2) -#define TAS2557_MCLK_CLKIN_SRC_GPIO4 (3) -#define TAS2557_MCLK_CLKIN_SRC_GPIO5 (4) -#define TAS2557_MCLK_CLKIN_SRC_GPIO6 (5) -#define TAS2557_MCLK_CLKIN_SRC_GPIO7 (6) -#define TAS2557_MCLK_CLKIN_SRC_GPIO8 (7) -#define TAS2557_MCLK_CLKIN_SRC_GPIO9 (8) -#define TAS2557_MCLK_CLKIN_SRC_GPIO10 (9) -#define TAS2557_MCLK_CLKIN_SRC_GPI1 (12) -#define TAS2557_MCLK_CLKIN_SRC_GPI2 (13) -#define TAS2557_MCLK_CLKIN_SRC_GPI3 (14) - -#define TAS2557_FORMAT_I2S (0x0 << 5) -#define TAS2557_FORMAT_DSP (0x1 << 5) -#define TAS2557_FORMAT_RIGHT_J (0x2 << 5) -#define TAS2557_FORMAT_LEFT_J (0x3 << 5) -#define TAS2557_FORMAT_MONO_PCM (0x4 << 5) -#define TAS2557_FORMAT_MASK (0x7 << 5) - -#define TAS2557_WORDLENGTH_16BIT (0x0 << 3) -#define TAS2557_WORDLENGTH_20BIT (0x1 << 3) -#define TAS2557_WORDLENGTH_24BIT (0x2 << 3) -#define TAS2557_WORDLENGTH_32BIT (0x3 << 3) -#define TAS2557_WORDLENGTH_MASK TAS2557_WORDLENGTH_32BIT - -/* B100P0R7 - TAS2557_SOFT_MUTE_REG */ -#define TAS2557_PDM_SOFT_MUTE (0x1 << 0) -#define TAS2557_VSENSE_SOFT_MUTE (0x1 << 1) -#define TAS2557_ISENSE_SOFT_MUTE (0x1 << 2) -#define TAS2557_CLASSD_SOFT_MUTE (0x1 << 3) - -/* B100P0R27 - TAS2557_PLL_P_VAL_REG */ -#define TAS2557_PLL_P_VAL_MASK (0x3f << 0) - -/* B100P0R28 - TAS2557_PLL_J_VAL_REG */ -#define TAS2557_PLL_J_VAL_MASK ((unsigned int) (0x7f << 0)) -#define TAS2557_PLL_J_VAL_MASKX 0x00 - -/* B100P0R29-30 - TAS2557_PLL_D_VAL_MSB/LSB_REG */ -#define TAS2557_PLL_D_MSB_VAL(x) ((x >> 8) & 0x3f) -#define TAS2557_PLL_D_LSB_VAL(x) (x & 0xff) - -/* B100P0R31 - TAS2557_CLK_MISC_REG */ -#define TAS2557_DSP_CLK_FROM_PLL (0x1 << 5) - -#define TAS2557_AAC_FW_NAME "tas2557_uCDSP_aac.bin" -#define TAS2557_GOER_FW_NAME "tas2557_uCDSP_goer.bin" -#define TAS2557_SSI_FW_NAME "tas2557_uCDSP_ssi.bin" -#define TAS2557_DEFAULT_FW_NAME "tas2557_uCDSP.bin" - -#define TAS2557_PG1P0_FW_NAME "tas2557_pg1p0_uCDSP.bin" - -#define TAS2557_APP_ROM1MODE 0 -#define TAS2557_APP_ROM2MODE 1 -#define TAS2557_APP_TUNINGMODE 2 -#define TAS2557_APP_ROM1_96KHZ 3 -#define TAS2557_APP_ROM2_96KHZ 4 -#define TAS2557_APP_RAMMODE 5 - -#define TAS2557_BOOST_OFF 0 -#define TAS2557_BOOST_DEVA 1 -#define TAS2557_BOOST_DEVB 2 -#define TAS2557_BOOST_BOTH 3 - -#define ERROR_NONE 0x00000000 -#define ERROR_PLL_ABSENT 0x00000001 -#define ERROR_DEVA_I2C_COMM 0x00000002 -#define ERROR_PRAM_CRCCHK 0x00000008 -#define ERROR_YRAM_CRCCHK 0x00000010 -#define ERROR_CLK_DET2 0x00000020 -#define ERROR_CLK_DET1 0x00000040 -#define ERROR_CLK_LOST 0x00000080 -#define ERROR_BROWNOUT 0x00000100 -#define ERROR_DIE_OVERTEMP 0x00000200 -#define ERROR_CLK_HALT 0x00000400 -#define ERROR_UNDER_VOLTAGE 0x00000800 -#define ERROR_OVER_CURRENT 0x00001000 -#define ERROR_CLASSD_PWR 0x00002000 -#define ERROR_SAFE_GUARD 0x00004000 -#define ERROR_FAILSAFE 0x40000000 - -struct TBlock { - unsigned int mnType; - unsigned char mbPChkSumPresent; - unsigned char mnPChkSum; - unsigned char mbYChkSumPresent; - unsigned char mnYChkSum; - unsigned int mnCommands; - unsigned char *mpData; -}; - -struct TData { - char mpName[64]; - char *mpDescription; - unsigned int mnBlocks; - struct TBlock *mpBlocks; -}; - -struct TProgram { - char mpName[64]; - char *mpDescription; - unsigned char mnAppMode; - unsigned short mnBoost; - struct TData mData; -}; - -struct TPLL { - char mpName[64]; - char *mpDescription; - struct TBlock mBlock; -}; - -struct TConfiguration { - char mpName[64]; - char *mpDescription; - unsigned int mnDevices; - unsigned int mnProgram; - unsigned int mnPLL; - unsigned int mnSamplingRate; - unsigned char mnPLLSrc; - unsigned int mnPLLSrcRate; - struct TData mData; -}; - -struct TCalibration { - char mpName[64]; - char *mpDescription; - unsigned int mnProgram; - unsigned int mnConfiguration; - struct TData mData; -}; - -struct TFirmware { - unsigned int mnFWSize; - unsigned int mnChecksum; - unsigned int mnPPCVersion; - unsigned int mnFWVersion; - unsigned int mnDriverVersion; - unsigned int mnTimeStamp; - char mpDDCName[64]; - char *mpDescription; - unsigned int mnDeviceFamily; - unsigned int mnDevice; - unsigned int mnPLLs; - struct TPLL *mpPLLs; - unsigned int mnPrograms; - struct TProgram *mpPrograms; - unsigned int mnConfigurations; - struct TConfiguration *mpConfigurations; - unsigned int mnCalibrations; - struct TCalibration *mpCalibrations; -}; - -struct tas2557_register { - int book; - int page; - int reg; -}; - -struct tas2557_priv { - struct device *dev; - struct regmap *mpRegmap; - int mnPGID; - int mnResetGPIO; - struct mutex dev_lock; - struct TFirmware *mpFirmware; - struct TFirmware *mpCalFirmware; - unsigned int mnCurrentProgram; - unsigned int mnCurrentSampleRate; - unsigned int mnNewConfiguration; - unsigned int mnCurrentConfiguration; - unsigned int mnCurrentCalibration; - unsigned char mnCurrentBook; - unsigned char mnCurrentPage; - bool mbTILoadActive; - bool mbPowerUp; - bool mbMute; - bool mbLoadConfigurationPrePowerUp; - bool mbLoadCalibrationPostPowerUp; - bool mbCalibrationLoaded; - int (*read)(struct tas2557_priv *pTAS2557, - unsigned int reg, - unsigned int *pValue); - int (*write)(struct tas2557_priv *pTAS2557, - unsigned int reg, - unsigned int Value); - int (*bulk_read)(struct tas2557_priv *pTAS2557, - unsigned int reg, - unsigned char *pData, - unsigned int len); - int (*bulk_write)(struct tas2557_priv *pTAS2557, - unsigned int reg, - unsigned char *pData, - unsigned int len); - int (*update_bits)(struct tas2557_priv *pTAS2557, - unsigned int reg, - unsigned int mask, - unsigned int value); - int (*set_config)(struct tas2557_priv *pTAS2557, - int config); - int (*set_calibration)(struct tas2557_priv *pTAS2557, - int calibration); - void (*clearIRQ)(struct tas2557_priv *pTAS2557); - void (*enableIRQ)(struct tas2557_priv *pTAS2557, bool enable); - void (*hw_reset)(struct tas2557_priv *pTAS2557); - /* device is working, but system is suspended */ - int (*runtime_suspend)(struct tas2557_priv *pTAS2557); - int (*runtime_resume)(struct tas2557_priv *pTAS2557); - - int mnGpioINT; - struct delayed_work irq_work; - unsigned int mnIRQ; - bool mbIRQEnable; - unsigned char mnI2SBits; - - - /* for low temperature check */ - unsigned int mnDevGain; - unsigned int mnDevCurrentGain; - unsigned int mnDieTvReadCounter; - struct hrtimer mtimer; - struct work_struct mtimerwork; - - /* device is working, but system is suspended */ - bool mbRuntimeSuspend; - - unsigned int mnErrCode; - unsigned int mnRestart; - - /* for configurations with maximum TLimit 0x7fffffff, - * bypass calibration update, usually used in factory test - */ - bool mbBypassTMax; - -#ifdef CONFIG_TAS2557_CODEC - struct mutex codec_lock; -#endif - -#ifdef CONFIG_TAS2557_MISC - int mnDBGCmd; - int mnCurrentReg; - struct mutex file_lock; -#endif - int mnSpkType; - struct device_node *spk_id_gpio_p; - - -}; - -#endif /* _TAS2557_H */ diff --git a/techpack/audio/asoc/codecs/tas2557/tiload.c b/techpack/audio/asoc/codecs/tas2557/tiload.c deleted file mode 100755 index 1f4943960490..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tiload.c +++ /dev/null @@ -1,428 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tiload.c -** -** Description: -** utility for TAS2557 Android in-system tuning -** -** ============================================================================= -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tiload.h" - -/* enable debug prints in the driver */ - -static struct cdev *tiload_cdev; -static int tiload_major; /* Dynamic allocation of Mjr No. */ -static int tiload_opened; /* Dynamic allocation of Mjr No. */ -static struct tas2557_priv *g_TAS2557; -struct class *tiload_class; -static unsigned int magic_num; - -static char gPage; -static char gBook; -/******************************** Debug section *****************************/ - - -/*---------------------------------------------------------------------------- - * Function : tiload_open - * - * Purpose : open method for tiload programming interface - *---------------------------------------------------------------------------- - */ -static int tiload_open(struct inode *in, struct file *filp) -{ - struct tas2557_priv *pTAS2557 = g_TAS2557; - - dev_info(pTAS2557->dev, "%s\n", __func__); - - if (tiload_opened) { - dev_info(pTAS2557->dev, "%s device is already opened\n", "tiload"); - return -EINVAL; - } - filp->private_data = (void *)pTAS2557; - tiload_opened++; - return 0; -} - -/*---------------------------------------------------------------------------- - * Function : tiload_release - * - * Purpose : close method for tiload programming interface - *---------------------------------------------------------------------------- - */ -static int tiload_release(struct inode *in, struct file *filp) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; - - dev_info(pTAS2557->dev, "%s\n", __func__); - filp->private_data = NULL; - tiload_opened--; - return 0; -} - -#define MAX_LENGTH 128 -/*---------------------------------------------------------------------------- - * Function : tiload_read - * - * Purpose : read from codec - *---------------------------------------------------------------------------- - */ -static ssize_t tiload_read(struct file *filp, char __user *buf, - size_t count, loff_t *offset) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; - char *rd_data; - unsigned int nCompositeRegister = 0, Value = 0; - char reg_addr; - size_t size; - int ret = 0; -#ifdef DEBUG - /* int i; */ -#endif - - dev_info(pTAS2557->dev, "%s\n", __func__); - if (count > MAX_LENGTH) { - dev_err(pTAS2557->dev, "Max %d bytes can be read\n", MAX_LENGTH); - return -EINVAL; - } - - /* copy register address from user space */ - size = copy_from_user(®_addr, buf, 1); - if (size != 0) { - dev_err(pTAS2557->dev, "read: copy_from_user failure\n"); - return -EINVAL; - } - - size = count; - - rd_data = kmalloc(MAX_LENGTH + 1, GFP_KERNEL | GFP_DMA); - - if(rd_data == NULL) { - dev_err(pTAS2557->dev, "kmalloc fail \n"); - return -EINVAL; - } - - nCompositeRegister = BPR_REG(gBook, gPage, reg_addr); - if (count == 1) { - ret = - pTAS2557->read(pTAS2557, 0x80000000 | nCompositeRegister, &Value); - if (ret >= 0) - rd_data[0] = (char) Value; - } else if (count > 1) { - ret = - pTAS2557->bulk_read(pTAS2557, 0x80000000 | nCompositeRegister, - rd_data, size); - } - if (ret < 0) - dev_err(pTAS2557->dev, "%s, %d, ret=%d, count=%zu error happen!\n", - __func__, __LINE__, ret, count); - -#ifdef DEBUG - dev_info(pTAS2557->dev, "read size = %d, reg_addr= %x , count = %d\n", - (int) size, reg_addr, (int) count); -/* for (i = 0; i < (int) size; i++) { -* dev_dbg(pTAS2557->dev, "rd_data[%d]=%x\n", i, rd_data[i]); -* } -*/ -#endif - if (size != count) - dev_err(pTAS2557->dev, "read %d registers from the codec\n", (int) size); - - if (copy_to_user(buf, rd_data, size) != 0) { - dev_err(pTAS2557->dev, "copy_to_user failed\n"); - kfree(rd_data); - return -EINVAL; - } - - kfree(rd_data); - return size; -} - -/* - *---------------------------------------------------------------------------- - * Function : tiload_write - * - * Purpose : write to codec - *---------------------------------------------------------------------------- - */ -static ssize_t tiload_write(struct file *filp, const char __user *buf, - size_t count, loff_t *offset) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; - char *wr_data; - char *pData; - size_t size; - unsigned int nCompositeRegister = 0; - unsigned int nRegister; - int ret = 0; -#ifdef DEBUG - /* int i; */ -#endif - dev_info(pTAS2557->dev, "%s\n", __func__); - - if (count > MAX_LENGTH) { - dev_err(pTAS2557->dev, "Max %d bytes can be read\n", MAX_LENGTH); - return -EINVAL; - } - - wr_data = kmalloc(MAX_LENGTH + 1, GFP_KERNEL | GFP_DMA); - if(wr_data == NULL) { - dev_err(pTAS2557->dev, "kmalloc fail \n"); - return -EINVAL; - } - pData = wr_data; - - /* copy buffer from user space */ - size = copy_from_user(wr_data, buf, count); - if (size != 0) { - dev_err(pTAS2557->dev, "copy_from_user failure %d\n", (int) size); - kfree(wr_data); - return -EINVAL; - } -#ifdef DEBUG - dev_info(pTAS2557->dev, "write size = %zu\n", count); -/* for (i = 0; i < (int) count; i++) { -* dev_info(pTAS2557->dev, "wr_data[%d]=%x\n", i, wr_data[i]); -* } -*/ -#endif - nRegister = wr_data[0]; - size = count; - if ((nRegister == 127) && (gPage == 0)) { - gBook = wr_data[1]; - kfree(wr_data); - return size; - } - - if (nRegister == 0) { - gPage = wr_data[1]; - pData++; - count--; - } - - nCompositeRegister = BPR_REG(gBook, gPage, nRegister); - if (count == 2) { - ret = - pTAS2557->write(pTAS2557, 0x80000000 | nCompositeRegister, - pData[1]); - } else if (count > 2) { - ret = - pTAS2557->bulk_write(pTAS2557, 0x80000000 | nCompositeRegister, - &pData[1], count - 1); - } - - if (ret < 0) - dev_err(pTAS2557->dev, "%s, %d, ret=%d, count=%zu, ERROR Happen\n", __func__, - __LINE__, ret, count); - kfree(wr_data); - return size; -} - -static void tiload_route_IO(struct tas2557_priv *pTAS2557, unsigned int bLock) -{ - if (bLock) - pTAS2557->write(pTAS2557, 0xAFFEAFFE, 0xBABEBABE); - else - pTAS2557->write(pTAS2557, 0xBABEBABE, 0xAFFEAFFE); -} - -static long tiload_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; - long num = 0; - void __user *argp = (void __user *) arg; - int val; - struct BPR bpr; - - dev_info(pTAS2557->dev, "%s, cmd=0x%x\n", __func__, cmd); -/* if (_IOC_TYPE(cmd) != TILOAD_IOC_MAGIC) - * return -ENOTTY; - */ - - switch (cmd) { - case TILOAD_IOMAGICNUM_GET: - num = copy_to_user(argp, &magic_num, sizeof(int)); - break; - case TILOAD_IOMAGICNUM_SET: - num = copy_from_user(&magic_num, argp, sizeof(int)); - dev_info(pTAS2557->dev, "TILOAD_IOMAGICNUM_SET\n"); - tiload_route_IO(pTAS2557, magic_num); - break; - case TILOAD_BPR_READ: - break; - case TILOAD_BPR_WRITE: - num = copy_from_user(&bpr, argp, sizeof(struct BPR)); - dev_info(pTAS2557->dev, "TILOAD_BPR_WRITE: 0x%02X, 0x%02X, 0x%02X\n\r", bpr.nBook, - bpr.nPage, bpr.nRegister); - break; - case TILOAD_IOCTL_SET_CHL: - break; - case TILOAD_IOCTL_SET_CONFIG: - num = copy_from_user(&val, argp, sizeof(val)); - pTAS2557->set_config(pTAS2557, val); - break; - case TILOAD_IOCTL_SET_CALIBRATION: - num = copy_from_user(&val, argp, sizeof(val)); - pTAS2557->set_calibration(pTAS2557, val); - break; - default: - break; - } - return num; -} - -#ifdef CONFIG_COMPAT -static long tiload_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct tas2557_priv *pTAS2557 = (struct tas2557_priv *)filp->private_data; - long nResult = 0; - - switch (cmd) { - case TILOAD_COMPAT_IOMAGICNUM_GET: - dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOMAGICNUM_GET=0x%x\n", - __func__, cmd); - nResult = tiload_ioctl(filp, TILOAD_IOMAGICNUM_GET, - (unsigned long) compat_ptr(arg)); - break; - - case TILOAD_COMPAT_IOMAGICNUM_SET: - dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOMAGICNUM_SET=0x%x\n", - __func__, cmd); - nResult = tiload_ioctl(filp, TILOAD_IOMAGICNUM_SET, - (unsigned long) compat_ptr(arg)); - break; - - case TILOAD_COMPAT_BPR_READ: - dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_BPR_READ=0x%x\n", - __func__, cmd); - nResult = tiload_ioctl(filp, TILOAD_BPR_READ, - (unsigned long) compat_ptr(arg)); - break; - - case TILOAD_COMPAT_BPR_WRITE: - dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_BPR_WRITE=0x%x\n", - __func__, cmd); - nResult = tiload_ioctl(filp, TILOAD_BPR_WRITE, - (unsigned long) compat_ptr(arg)); - break; - - case TILOAD_COMPAT_IOCTL_SET_CHL: - dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOCTL_SET_CHL=0x%x\n", - __func__, cmd); - nResult = tiload_ioctl(filp, TILOAD_IOCTL_SET_CHL, - (unsigned long) compat_ptr(arg)); - break; - - case TILOAD_COMPAT_IOCTL_SET_CONFIG: - dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOCTL_SET_CONFIG=0x%x\n", - __func__, cmd); - nResult = tiload_ioctl(filp, TILOAD_IOCTL_SET_CONFIG, - (unsigned long) compat_ptr(arg)); - break; - - case TILOAD_COMPAT_IOCTL_SET_CALIBRATION: - dev_info(pTAS2557->dev, "%s, TILOAD_COMPAT_IOCTL_SET_CALIBRATION=0x%x\n", - __func__, cmd); - nResult = tiload_ioctl(filp, TILOAD_IOCTL_SET_CALIBRATION, - (unsigned long) compat_ptr(arg)); - break; - - default: - dev_err(pTAS2557->dev, "%s, unsupport compat ioctl=0x%x\n", - __func__, cmd); - break; - } - - return nResult; -} -#endif - -/*********** File operations structure for tiload *************/ -static const struct file_operations tiload_fops = { - .owner = THIS_MODULE, - .open = tiload_open, - .release = tiload_release, - .read = tiload_read, - .write = tiload_write, - .unlocked_ioctl = tiload_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = tiload_compat_ioctl, -#endif -}; - -/*---------------------------------------------------------------------------- - * Function : tiload_driver_init - * - * Purpose : Register a char driver for dynamic tiload programming - *---------------------------------------------------------------------------- - */ -int tiload_driver_init(struct tas2557_priv *pTAS2557) -{ - int result; - dev_t dev = MKDEV(tiload_major, 0); - - g_TAS2557 = pTAS2557; - - dev_info(pTAS2557->dev, "%s\n", __func__); - - result = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME); - if (result < 0) { - dev_err(pTAS2557->dev, "cannot allocate major number %d\n", tiload_major); - return result; - } - tiload_class = class_create(THIS_MODULE, DEVICE_NAME); - tiload_major = MAJOR(dev); - dev_info(pTAS2557->dev, "allocated Major Number: %d\n", tiload_major); - - tiload_cdev = cdev_alloc(); - cdev_init(tiload_cdev, &tiload_fops); - tiload_cdev->owner = THIS_MODULE; - tiload_cdev->ops = &tiload_fops; - - if (device_create(tiload_class, NULL, dev, NULL, "tiload_node") == NULL) - dev_err(pTAS2557->dev, "Device creation failed\n"); - - if (cdev_add(tiload_cdev, dev, 1) < 0) { - dev_err(pTAS2557->dev, "tiload_driver: cdev_add failed\n"); - unregister_chrdev_region(dev, 1); - tiload_cdev = NULL; - return 1; - } - dev_info(pTAS2557->dev, "Registered TiLoad driver, Major number: %d\n", tiload_major); - /* class_device_create(tiload_class, NULL, dev, NULL, DEVICE_NAME, 0); */ - return 0; -} - -MODULE_AUTHOR("Texas Instruments Inc."); -MODULE_DESCRIPTION("Utility for TAS2557 Android in-system tuning"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/tas2557/tiload.h b/techpack/audio/asoc/codecs/tas2557/tiload.h deleted file mode 100755 index d97fc8fb29f5..000000000000 --- a/techpack/audio/asoc/codecs/tas2557/tiload.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -** ============================================================================= -** Copyright (c) 2016 Texas Instruments Inc. -** Copyright (C) 2019 XiaoMi, Inc. -** -** This program is free software; you can redistribute it and/or modify it under -** the terms of the GNU General Public License as published by the Free Software -** Foundation; version 2. -** -** This program is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -** -** File: -** tiload.h -** -** Description: -** header file for tiload.c -** -** ============================================================================= -*/ - -#ifndef _TILOAD_H -#define _TILOAD_H - -#ifdef CONFIG_COMPAT -#include -#endif - -#include "tas2557.h" - -#define BPR_REG(book, page, reg) (((book * 256 * 128) + \ - (page * 128)) + reg) - -/* typedefs required for the included header files */ -struct BPR { - unsigned char nBook; - unsigned char nPage; - unsigned char nRegister; -}; - -/* defines */ -#define DEVICE_NAME "tiload_node" - -#define TILOAD_IOC_MAGIC 0xE0 -#define TILOAD_IOMAGICNUM_GET _IOR(TILOAD_IOC_MAGIC, 1, int) -#define TILOAD_IOMAGICNUM_SET _IOW(TILOAD_IOC_MAGIC, 2, int) -#define TILOAD_BPR_READ _IOR(TILOAD_IOC_MAGIC, 3, struct BPR) -#define TILOAD_BPR_WRITE _IOW(TILOAD_IOC_MAGIC, 4, struct BPR) -#define TILOAD_IOCTL_SET_CHL _IOW(TILOAD_IOC_MAGIC, 5, int) -#define TILOAD_IOCTL_SET_CONFIG _IOW(TILOAD_IOC_MAGIC, 6, int) -#define TILOAD_IOCTL_SET_CALIBRATION _IOW(TILOAD_IOC_MAGIC, 7, int) - -#ifdef CONFIG_COMPAT -#define TILOAD_COMPAT_IOMAGICNUM_GET _IOR(TILOAD_IOC_MAGIC, 1, compat_int_t) -#define TILOAD_COMPAT_IOMAGICNUM_SET _IOW(TILOAD_IOC_MAGIC, 2, compat_int_t) -#define TILOAD_COMPAT_BPR_READ _IOR(TILOAD_IOC_MAGIC, 3, struct BPR) -#define TILOAD_COMPAT_BPR_WRITE _IOW(TILOAD_IOC_MAGIC, 4, struct BPR) -#define TILOAD_COMPAT_IOCTL_SET_CHL _IOW(TILOAD_IOC_MAGIC, 5, compat_int_t) -#define TILOAD_COMPAT_IOCTL_SET_CONFIG _IOW(TILOAD_IOC_MAGIC, 6, compat_int_t) -#define TILOAD_COMPAT_IOCTL_SET_CALIBRATION _IOW(TILOAD_IOC_MAGIC, 7, compat_int_t) -#endif - -int tiload_driver_init(struct tas2557_priv *pTAS2557); - -#endif diff --git a/techpack/audio/asoc/codecs/tfa98xx/.gitignore b/techpack/audio/asoc/codecs/tfa98xx/.gitignore deleted file mode 100644 index be731895371b..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/.gitignore +++ /dev/null @@ -1,99 +0,0 @@ -# -# NOTE! Don't add files that are generated in specific -# subdirectories here. Add them in the ".gitignore" file -# in that subdirectory instead. -# -# NOTE! Please use 'git ls-files -i --exclude-standard' -# command after changing this file, to see if there are -# any tracked files which get ignored after the change. -# -# Normal rules -# -.* -*.o -*.o.* -*.a -*.s -*.ko -*.so -*.so.dbg -*.mod.c -*.i -*.lst -*.symtypes -*.order -modules.builtin -*.elf -*.bin -*.gz -*.bz2 -*.lzma -*.xz -*.lz4 -*.lzo -*.patch -*.gcno -*.dll - -# -# Top-level generic files -# -/tags -/TAGS -/linux -/vmlinux -/vmlinuz -/System.map -/Module.markers -Module.symvers - -# -# Debian directory (make deb-pkg) -# -/debian/ - -# -# git files that we don't want to ignore even it they are dot-files -# -!.gitignore -!.mailmap - -# -# Generated include files -# -include/config -include/generated -arch/*/include/generated - -# stgit generated dirs -patches-* - -# quilt's files -patches -series - -# cscope files -cscope.* -ncscope.* - -# gnu global files -GPATH -GRTAGS -GSYMS -GTAGS - -*.orig -*~ -\#*# - -# -# Leavings from module signing -# -extra_certificates -signing_key.priv -signing_key.x509 -x509.genkey - -# Kconfig presets -all.config - diff --git a/techpack/audio/asoc/codecs/tfa98xx/Android.mk b/techpack/audio/asoc/codecs/tfa98xx/Android.mk deleted file mode 100755 index f7bdf5f3a10f..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/Android.mk +++ /dev/null @@ -1,55 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform,$(MSMSTEPPE)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - #AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/audio-kernel - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=tfa98xx_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_tfa98xx.ko -LOCAL_MODULE_KBUILD_NAME := tfa98xx_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/tfa98xx/Kbuild b/techpack/audio/asoc/codecs/tfa98xx/Kbuild deleted file mode 100755 index 189ccceec48e..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/Kbuild +++ /dev/null @@ -1,115 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) -TFA_INC := -I$(AUDIO_ROOT)/asoc/codecs/tfa98xx/inc - -# for TFA9874 Amplifer -ifdef CONFIG_SND_SOC_TFA9874 - TFA98XX_OBJS += src/tfa98xx.o - TFA98XX_OBJS += src/tfa_container.o - TFA98XX_OBJS += src/tfa_dsp.o - TFA98XX_OBJS += src/tfa_init.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) \ - $(TFA_INC) - -EXTRA_CFLAGS += -I$(src)/inc - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ \ - -DTFA_NON_DSP_SOLUTION - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_TFA9874) += tfa98xx_dlkm.o -tfa98xx_dlkm-y := $(TFA98XX_OBJS) -# inject some build related information diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/config.h b/techpack/audio/asoc/codecs/tfa98xx/inc/config.h deleted file mode 100644 index 018886f814ca..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - - -/* - Linux kernel specific definitions used by code shared with - Linux/Windows user space. -*/ - -#ifndef __CONFIG_LINUX_KERNEL_INC__ -#define __CONFIG_LINUX_KERNEL_INC__ - -#include -#include -#include -#include -#include - -#define _ASSERT(e) -#define PRINT_ASSERT(e)if ((e)) printk(KERN_ERR "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) - -#if defined(CONFIG_TRACING) && defined(DEBUG) - #define tfa98xx_trace_printk(...) trace_printk(__VA_ARGS__) -#else - #define tfa98xx_trace_printk(...) -#endif - -#endif /* __CONFIG_LINUX_KERNEL_INC__ */ - diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/dbgprint.h b/techpack/audio/asoc/codecs/tfa98xx/inc/dbgprint.h deleted file mode 100644 index ddd17b8f158b..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/dbgprint.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -#ifndef _DBGPRINT_H -# define _DBGPRINT_H - -/* Debugging macro's. */ -# ifndef ASSERT -//#define ASSERT -# endif - //TODO wwwim -# ifndef _ASSERT - #define _ASSERT(e) -# endif - -# ifndef PREFIX -# define PREFIX "tfa98xx: " -# define DRIVER_NAME "tfa98xx" -# endif - -#ifdef __KERNEL__ - -# ifdef DEBUG -# define _DEBUG(level, fmt, va...) do {\ - if (unlikely(debug >= (level))) \ - printk(KERN_INFO PREFIX "%s:%d: "fmt, __func__, __LINE__, ##va); \ - } while (0) - -# else -# define _DEBUG(level, fmt, va...) do {} while (0) -# endif - -# define MSG(fmt, va...) printk(KERN_INFO PREFIX "%s:%d: "fmt, __func__, __LINE__, ##va) -# define _ERRORMSG(fmt, va...) printk(KERN_ERR PREFIX "ERROR %s:%d: "fmt, __func__, __LINE__, ##va) - - -# define DEBUG0(x...) MSG(x) -# define DEBUG1(x...) _DEBUG(1, x) -# define DEBUG2(x...) _DEBUG(2, x) -# define DEBUG3(x...) _DEBUG(3, x) -# define ERRORMSG(x...) _ERRORMSG(x) -# define PRINT(x...) printk(x) -# define PRINT_ERROR(x...) printk(KERN_INFO PREFIX " **ERROR** " x) -# define PRINT_ASSERT(e)if ((e)) printk(KERN_ERR "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) - -# define PRINT_ENTRY DEBUG2("+[%s]\n", __func__) -# define PRINT_EXIT DEBUG2("-[%s]\n", __func__) - -# ifdef ASSERT -# define assert(cond, action) do { if (unlikely(!(cond))) { DEBUG0("Assert: %s\n", #cond); action; } } while (0) -# else -# define assert(cond, action) do { } while (0) -# endif - -#else /* __KERNEL__ */ -#if defined(WIN32) || defined(_X64) -#include -/* user mode */ -# ifdef DEBUG -# define _DEBUGMSG(level, fmt, ...) printf(PREFIX "%s:%d: "fmt, __func__, __LINE__, __VA_ARGS__); -# else -# define _DEBUGMSG(level, fmt, ...) do {} while (0) -# endif - -# define _ERRORMSG(fmt, ...) printf(PREFIX "%s:%s:%d: "fmt, __FILE__, __func__, __LINE__, __VA_ARGS__) - -# define DEBUG0(...) MSG(__VA_ARGS__) -# define DEBUG1(...) _DEBUGMSG(1, __VA_ARGS__) -# define DEBUG2(...) _DEBUGMSG(2, __VA_ARGS__) -# define DEBUG3(...) _DEBUGMSG(3, __VA_ARGS__) -# define ERRORMSG(fmt, ...) _ERRORMSG(fmt, __VA_ARGS__) -# define PRINT(...) printf(__VA_ARGS__) -/* -# define PRINT(...) { FILE *stream; \ - if((stream = freopen("tfa_tfa.txt", "ab+", stdout)) == NULL) exit(-1); \ - printf(__VA_ARGS__); \ - freopen( "CON", "ab+", stdout ); \ - } -*/ -# define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__) -# define PRINT_FILE(file, ...) fprintf(file, __VA_ARGS__) -# define PRINT_ASSERT(e)if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) -//# define PRINT_ASSERT(e) if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) %s\n",__FUNCTION__,__FILE__,__LINE__, Tfa98xx_GetErrorString(e)) - -#elif defined(__CODE_RED) -#include "app_global.h" -# ifdef DEBUG -# define _DEBUG(level, fmt, va...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, va)) -//printf(PREFIX "%s:%d: "fmt,__func__,__LINE__,##va); -# else -# define _DEBUG(level, fmt, va...) do {} while (0) -# endif - -# define MSG(fmt, ...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, __VA_ARGS__)) -//printf(PREFIX "%s:%s:%d: "fmt,__FILE__,__func__,__LINE__,##va) -//TB_TRACE_INF(TbTracePfx2(APP_PFX,TB_FUNC,"path=%s, chan=%u, muted=%s, vol=%d\n", -// path->isRecording ? "recording" : "playback", -// i, -// channelVol.currentMuteValue ? "YES" : "NO", -// channelVol.currentVolumeValue -// )); -//# define _ERRORMSG(fmt,va...) TB_TRACE_INF(TbTracePfx2("tfa",TB_FUNC,va)) -# define ERRORMSG(...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, __VA_ARGS__)) -//fprintf(stderr, PREFIX "ERROR %s:%s:%d: "fmt,__FILE__,__func__,__LINE__, ##va) - -# define DEBUG0(x...) MSG(x) -# define DEBUG1(x...) _DEBUG(1, x) -# define DEBUG2(x...) _DEBUG(2, x) -# define DEBUG3(x...) _DEBUG(3, x) -//# define ERRORMSG(x...) _ERRORMSG(x) -# define PRINT(x...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, x)) -//printf(x) -# define PRINT_ERROR(x...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, x)) -//fprintf(stderr,__VA_ARGS__) -# define PRINT_FILE(file, x...) TB_TRACE_INF(TbTracePfx2("tfa", TB_FUNC, x)) -//fprintf(file,__VA_ARGS__) -# define PRINT_ASSERT(e) -//TB_TRACE_INF(TbTracePfx2("tfa",TB_FUNC,Tfa98xx_GetErrorString(e))) -//if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) %s\n",__FUNCTION__,__FILE__,__LINE__, Tfa98xx_GetErrorString(e)) -#else -#include -/* user mode */ -# ifdef DEBUG -# define _DEBUG(level, fmt, va...) printf(PREFIX "%s:%d: "fmt, __func__, __LINE__, ##va); -# else -# define _DEBUG(level, fmt, va...) do {} while (0) -# endif - -# define MSG(fmt, va...) printf(PREFIX "%s:%s:%d: "fmt, __FILE__, __func__, __LINE__, ##va) -# define _ERRORMSG(fmt, va...) fprintf(stderr, PREFIX "ERROR %s:%s:%d: "fmt, __FILE__, __func__, __LINE__, ##va) - -# define DEBUG0(x...) MSG(x) -# define DEBUG1(x...) _DEBUG(1, x) -# define DEBUG2(x...) _DEBUG(2, x) -# define DEBUG3(x...) _DEBUG(3, x) -# define ERRORMSG(x...) _ERRORMSG(x) -# define PRINT(x...) printf(x) -# define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__) -# define PRINT_FILE(file, ...) fprintf(file, __VA_ARGS__) -# define PRINT_ASSERT(e)if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) error code:%d\n", __func__, __FILE__, __LINE__, e) -//# define PRINT_ASSERT(e) if ((e)) fprintf(stderr, "PrintAssert:%s (%s:%d) %s\n",__FUNCTION__,__FILE__,__LINE__, Tfa98xx_GetErrorString(e)) - - -#endif /* WIN32 */ - -#endif /* user */ - -#endif /* _DBGPRINT_H --------------- */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/spk-id.h b/techpack/audio/asoc/codecs/tfa98xx/inc/spk-id.h deleted file mode 100755 index 2416f89bd23f..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/spk-id.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __SPK_ID_H_ -#define __SPK_ID_H_ - -#include -#include - -#define PIN_PULL_DOWN 0 -#define PIN_PULL_UP 1 -#define PIN_FLOAT 2 - -#define VENDOR_ID_NONE 0 -#define VENDOR_ID_AAC 1 -#define VENDOR_ID_SSI 2 -#define VENDOR_ID_GOER 3 - -#define VENDOR_ID_UNKNOWN 4 - -extern int spk_id_get_pin_3state(struct device_node *np); - -#endif diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa.h deleted file mode 100644 index 10e8cb94c86d..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -#ifndef TFA_H_ -#define TFA_H_ - -/* set the limit for the container file length */ -#define TFA_MAX_CNT_LENGTH (256*1024) - -extern struct tfa_device **devs; - -/** - * tfa error return codes - */ -enum tfa_error { - tfa_error_ok, /**< no error */ - tfa_error_device, /**< no response from device */ - tfa_error_bad_param,/**< parameter no accepted */ - tfa_error_noclock, /**< required clock not present */ - tfa_error_timeout, /**< a timeout occurred */ - tfa_error_dsp, /**< a DSP error was returned */ - tfa_error_container,/**< no or wrong container file */ - tfa_error_max /**< impossible value, max enum */ -}; - -enum Tfa98xx_Error tfa_write_filters(struct tfa_device *tfa, int prof_idx); - -struct tfa_device **tfa_devs_create(int count); -void tfa_devs_destroy(int count); - -struct tfa_device **tfa_get_device_struct(void); - -/*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ -#ifdef __KERNEL__ -int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep, u8 pcm_format); -#else -int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep); -#endif -void tfa_lp_mode_interrupt(struct tfa_device *tfa); -void tfa_adapt_noisemode(struct tfa_device *tfa); - -#endif /* TFA_H_ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa1_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa1_tfafieldnames.h deleted file mode 100644 index c0b6d64abe82..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa1_tfafieldnames.h +++ /dev/null @@ -1,911 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: Tfa1_TfaFieldnames.h - * This file was generated automatically on 03/20/2015 at 01:55:46 PM. - * Source file: TFA9897N1B_I2C_list_URT_Source_v34.xls - */ -#define TFA9897_I2CVERSION 34 -typedef enum Tfa1BfEnumList { - TFA1_BF_VDDS = 0x0000, /*!< Power-on-reset flag */ - TFA1_BF_PLLS = 0x0010, /*!< PLL lock */ - TFA1_BF_OTDS = 0x0020, /*!< Over Temperature Protection alarm */ - TFA1_BF_OVDS = 0x0030, /*!< Over Voltage Protection alarm */ - TFA1_BF_UVDS = 0x0040, /*!< Under Voltage Protection alarm */ - TFA1_BF_OCDS = 0x0050, /*!< Over Current Protection alarm */ - TFA1_BF_CLKS = 0x0060, /*!< Clocks stable flag */ - TFA1_BF_CLIPS = 0x0070, /*!< Amplifier clipping */ - TFA1_BF_MTPB = 0x0080, /*!< MTP busy */ - TFA1_BF_NOCLK = 0x0090, /*!< Flag lost clock from clock generation unit */ - TFA1_BF_SPKS = 0x00a0, /*!< Speaker error flag */ - TFA1_BF_ACS = 0x00b0, /*!< Cold Start flag */ - TFA1_BF_SWS = 0x00c0, /*!< Flag Engage */ - TFA1_BF_WDS = 0x00d0, /*!< Flag watchdog reset */ - TFA1_BF_AMPS = 0x00e0, /*!< Amplifier is enabled by manager */ - TFA1_BF_AREFS = 0x00f0, /*!< References are enabled by manager */ - TFA1_BF_BATS = 0x0109, /*!< Battery voltage readout; 0 .. 5.5 [V] */ - TFA1_BF_TEMPS = 0x0208, /*!< Temperature readout from the temperature sensor */ - TFA1_BF_REV = 0x030b, /*!< Device type number is B97 */ - TFA1_BF_RCV = 0x0420, /*!< Enable Receiver Mode */ - TFA1_BF_CHS12 = 0x0431, /*!< Channel Selection TDM input for Coolflux */ - TFA1_BF_INPLVL = 0x0450, /*!< Input level selection control */ - TFA1_BF_CHSA = 0x0461, /*!< Input selection for amplifier */ - TFA1_BF_I2SDOE = 0x04b0, /*!< Enable data output */ - TFA1_BF_AUDFS = 0x04c3, /*!< Audio sample rate setting */ - TFA1_BF_BSSCR = 0x0501, /*!< Protection Attack Time */ - TFA1_BF_BSST = 0x0523, /*!< ProtectionThreshold */ - TFA1_BF_BSSRL = 0x0561, /*!< Protection Maximum Reduction */ - TFA1_BF_BSSRR = 0x0582, /*!< Battery Protection Release Time */ - TFA1_BF_BSSHY = 0x05b1, /*!< Battery Protection Hysteresis */ - TFA1_BF_BSSR = 0x05e0, /*!< battery voltage for I2C read out only */ - TFA1_BF_BSSBY = 0x05f0, /*!< bypass clipper battery protection */ - TFA1_BF_DPSA = 0x0600, /*!< Enable dynamic powerstage activation */ - TFA1_BF_CFSM = 0x0650, /*!< Soft mute in CoolFlux */ - TFA1_BF_BSSS = 0x0670, /*!< BatSenseSteepness */ - TFA1_BF_VOL = 0x0687, /*!< volume control (in CoolFlux) */ - TFA1_BF_DCVO = 0x0702, /*!< Boost Voltage */ - TFA1_BF_DCMCC = 0x0733, /*!< Max boost coil current - step of 175 mA */ - TFA1_BF_DCIE = 0x07a0, /*!< Adaptive boost mode */ - TFA1_BF_DCSR = 0x07b0, /*!< Soft RampUp/Down mode for DCDC controller */ - TFA1_BF_DCPAVG = 0x07c0, /*!< ctrl_peak2avg for analog part of DCDC */ - TFA1_BF_TROS = 0x0800, /*!< Select external temperature also the ext_temp will be put on the temp read out */ - TFA1_BF_EXTTS = 0x0818, /*!< external temperature setting to be given by host */ - TFA1_BF_PWDN = 0x0900, /*!< Device Mode */ - TFA1_BF_I2CR = 0x0910, /*!< I2C Reset */ - TFA1_BF_CFE = 0x0920, /*!< Enable CoolFlux */ - TFA1_BF_AMPE = 0x0930, /*!< Enable Amplifier */ - TFA1_BF_DCA = 0x0940, /*!< EnableBoost */ - TFA1_BF_SBSL = 0x0950, /*!< Coolflux configured */ - TFA1_BF_AMPC = 0x0960, /*!< Selection on how Amplifier is enabled */ - TFA1_BF_DCDIS = 0x0970, /*!< DCDC not connected */ - TFA1_BF_PSDR = 0x0980, /*!< IDDQ test amplifier */ - TFA1_BF_DCCV = 0x0991, /*!< Coil Value */ - TFA1_BF_CCFD = 0x09b0, /*!< Selection CoolFlux Clock */ - TFA1_BF_INTPAD = 0x09c1, /*!< INT pad configuration control */ - TFA1_BF_IPLL = 0x09e0, /*!< PLL input reference clock selection */ - TFA1_BF_MTPK = 0x0b07, /*!< 5Ah, 90d To access KEY1_Protected registers (Default for engineering) */ - TFA1_BF_CVFDLY = 0x0c25, /*!< Fractional delay adjustment between current and voltage sense */ - TFA1_BF_TDMPRF = 0x1011, /*!< TDM_usecase */ - TFA1_BF_TDMEN = 0x1030, /*!< TDM interface control */ - TFA1_BF_TDMCKINV = 0x1040, /*!< TDM clock inversion */ - TFA1_BF_TDMFSLN = 0x1053, /*!< TDM FS length */ - TFA1_BF_TDMFSPOL = 0x1090, /*!< TDM FS polarity */ - TFA1_BF_TDMSAMSZ = 0x10a4, /*!< TDM Sample Size for all tdm sinks/sources */ - TFA1_BF_TDMSLOTS = 0x1103, /*!< Number of slots */ - TFA1_BF_TDMSLLN = 0x1144, /*!< Slot length */ - TFA1_BF_TDMBRMG = 0x1194, /*!< Bits remaining */ - TFA1_BF_TDMDDEL = 0x11e0, /*!< Data delay */ - TFA1_BF_TDMDADJ = 0x11f0, /*!< Data adjustment */ - TFA1_BF_TDMTXFRM = 0x1201, /*!< TXDATA format */ - TFA1_BF_TDMUUS0 = 0x1221, /*!< TXDATA format unused slot sd0 */ - TFA1_BF_TDMUUS1 = 0x1241, /*!< TXDATA format unused slot sd1 */ - TFA1_BF_TDMSI0EN = 0x1270, /*!< TDM sink0 enable */ - TFA1_BF_TDMSI1EN = 0x1280, /*!< TDM sink1 enable */ - TFA1_BF_TDMSI2EN = 0x1290, /*!< TDM sink2 enable */ - TFA1_BF_TDMSO0EN = 0x12a0, /*!< TDM source0 enable */ - TFA1_BF_TDMSO1EN = 0x12b0, /*!< TDM source1 enable */ - TFA1_BF_TDMSO2EN = 0x12c0, /*!< TDM source2 enable */ - TFA1_BF_TDMSI0IO = 0x12d0, /*!< tdm_sink0_io */ - TFA1_BF_TDMSI1IO = 0x12e0, /*!< tdm_sink1_io */ - TFA1_BF_TDMSI2IO = 0x12f0, /*!< tdm_sink2_io */ - TFA1_BF_TDMSO0IO = 0x1300, /*!< tdm_source0_io */ - TFA1_BF_TDMSO1IO = 0x1310, /*!< tdm_source1_io */ - TFA1_BF_TDMSO2IO = 0x1320, /*!< tdm_source2_io */ - TFA1_BF_TDMSI0SL = 0x1333, /*!< sink0_slot [GAIN IN] */ - TFA1_BF_TDMSI1SL = 0x1373, /*!< sink1_slot [CH1 IN] */ - TFA1_BF_TDMSI2SL = 0x13b3, /*!< sink2_slot [CH2 IN] */ - TFA1_BF_TDMSO0SL = 0x1403, /*!< source0_slot [GAIN OUT] */ - TFA1_BF_TDMSO1SL = 0x1443, /*!< source1_slot [Voltage Sense] */ - TFA1_BF_TDMSO2SL = 0x1483, /*!< source2_slot [Current Sense] */ - TFA1_BF_NBCK = 0x14c3, /*!< NBCK */ - TFA1_BF_INTOVDDS = 0x2000, /*!< flag_por_int_out */ - TFA1_BF_INTOPLLS = 0x2010, /*!< flag_pll_lock_int_out */ - TFA1_BF_INTOOTDS = 0x2020, /*!< flag_otpok_int_out */ - TFA1_BF_INTOOVDS = 0x2030, /*!< flag_ovpok_int_out */ - TFA1_BF_INTOUVDS = 0x2040, /*!< flag_uvpok_int_out */ - TFA1_BF_INTOOCDS = 0x2050, /*!< flag_ocp_alarm_int_out */ - TFA1_BF_INTOCLKS = 0x2060, /*!< flag_clocks_stable_int_out */ - TFA1_BF_INTOCLIPS = 0x2070, /*!< flag_clip_int_out */ - TFA1_BF_INTOMTPB = 0x2080, /*!< mtp_busy_int_out */ - TFA1_BF_INTONOCLK = 0x2090, /*!< flag_lost_clk_int_out */ - TFA1_BF_INTOSPKS = 0x20a0, /*!< flag_cf_speakererror_int_out */ - TFA1_BF_INTOACS = 0x20b0, /*!< flag_cold_started_int_out */ - TFA1_BF_INTOSWS = 0x20c0, /*!< flag_engage_int_out */ - TFA1_BF_INTOWDS = 0x20d0, /*!< flag_watchdog_reset_int_out */ - TFA1_BF_INTOAMPS = 0x20e0, /*!< flag_enbl_amp_int_out */ - TFA1_BF_INTOAREFS = 0x20f0, /*!< flag_enbl_ref_int_out */ - TFA1_BF_INTOACK = 0x2201, /*!< Interrupt status register output - Corresponding flag */ - TFA1_BF_INTIVDDS = 0x2300, /*!< flag_por_int_in */ - TFA1_BF_INTIPLLS = 0x2310, /*!< flag_pll_lock_int_in */ - TFA1_BF_INTIOTDS = 0x2320, /*!< flag_otpok_int_in */ - TFA1_BF_INTIOVDS = 0x2330, /*!< flag_ovpok_int_in */ - TFA1_BF_INTIUVDS = 0x2340, /*!< flag_uvpok_int_in */ - TFA1_BF_INTIOCDS = 0x2350, /*!< flag_ocp_alarm_int_in */ - TFA1_BF_INTICLKS = 0x2360, /*!< flag_clocks_stable_int_in */ - TFA1_BF_INTICLIPS = 0x2370, /*!< flag_clip_int_in */ - TFA1_BF_INTIMTPB = 0x2380, /*!< mtp_busy_int_in */ - TFA1_BF_INTINOCLK = 0x2390, /*!< flag_lost_clk_int_in */ - TFA1_BF_INTISPKS = 0x23a0, /*!< flag_cf_speakererror_int_in */ - TFA1_BF_INTIACS = 0x23b0, /*!< flag_cold_started_int_in */ - TFA1_BF_INTISWS = 0x23c0, /*!< flag_engage_int_in */ - TFA1_BF_INTIWDS = 0x23d0, /*!< flag_watchdog_reset_int_in */ - TFA1_BF_INTIAMPS = 0x23e0, /*!< flag_enbl_amp_int_in */ - TFA1_BF_INTIAREFS = 0x23f0, /*!< flag_enbl_ref_int_in */ - TFA1_BF_INTIACK = 0x2501, /*!< Interrupt register input */ - TFA1_BF_INTENVDDS = 0x2600, /*!< flag_por_int_enable */ - TFA1_BF_INTENPLLS = 0x2610, /*!< flag_pll_lock_int_enable */ - TFA1_BF_INTENOTDS = 0x2620, /*!< flag_otpok_int_enable */ - TFA1_BF_INTENOVDS = 0x2630, /*!< flag_ovpok_int_enable */ - TFA1_BF_INTENUVDS = 0x2640, /*!< flag_uvpok_int_enable */ - TFA1_BF_INTENOCDS = 0x2650, /*!< flag_ocp_alarm_int_enable */ - TFA1_BF_INTENCLKS = 0x2660, /*!< flag_clocks_stable_int_enable */ - TFA1_BF_INTENCLIPS = 0x2670, /*!< flag_clip_int_enable */ - TFA1_BF_INTENMTPB = 0x2680, /*!< mtp_busy_int_enable */ - TFA1_BF_INTENNOCLK = 0x2690, /*!< flag_lost_clk_int_enable */ - TFA1_BF_INTENSPKS = 0x26a0, /*!< flag_cf_speakererror_int_enable */ - TFA1_BF_INTENACS = 0x26b0, /*!< flag_cold_started_int_enable */ - TFA1_BF_INTENSWS = 0x26c0, /*!< flag_engage_int_enable */ - TFA1_BF_INTENWDS = 0x26d0, /*!< flag_watchdog_reset_int_enable */ - TFA1_BF_INTENAMPS = 0x26e0, /*!< flag_enbl_amp_int_enable */ - TFA1_BF_INTENAREFS = 0x26f0, /*!< flag_enbl_ref_int_enable */ - TFA1_BF_INTENACK = 0x2801, /*!< Interrupt enable register */ - TFA1_BF_INTPOLVDDS = 0x2900, /*!< flag_por_int_pol */ - TFA1_BF_INTPOLPLLS = 0x2910, /*!< flag_pll_lock_int_pol */ - TFA1_BF_INTPOLOTDS = 0x2920, /*!< flag_otpok_int_pol */ - TFA1_BF_INTPOLOVDS = 0x2930, /*!< flag_ovpok_int_pol */ - TFA1_BF_INTPOLUVDS = 0x2940, /*!< flag_uvpok_int_pol */ - TFA1_BF_INTPOLOCDS = 0x2950, /*!< flag_ocp_alarm_int_pol */ - TFA1_BF_INTPOLCLKS = 0x2960, /*!< flag_clocks_stable_int_pol */ - TFA1_BF_INTPOLCLIPS = 0x2970, /*!< flag_clip_int_pol */ - TFA1_BF_INTPOLMTPB = 0x2980, /*!< mtp_busy_int_pol */ - TFA1_BF_INTPOLNOCLK = 0x2990, /*!< flag_lost_clk_int_pol */ - TFA1_BF_INTPOLSPKS = 0x29a0, /*!< flag_cf_speakererror_int_pol */ - TFA1_BF_INTPOLACS = 0x29b0, /*!< flag_cold_started_int_pol */ - TFA1_BF_INTPOLSWS = 0x29c0, /*!< flag_engage_int_pol */ - TFA1_BF_INTPOLWDS = 0x29d0, /*!< flag_watchdog_reset_int_pol */ - TFA1_BF_INTPOLAMPS = 0x29e0, /*!< flag_enbl_amp_int_pol */ - TFA1_BF_INTPOLAREFS = 0x29f0, /*!< flag_enbl_ref_int_pol */ - TFA1_BF_INTPOLACK = 0x2b01, /*!< Interrupt status flags polarity register */ - TFA1_BF_CLIP = 0x4900, /*!< Bypass clip control */ - TFA1_BF_CIMTP = 0x62b0, /*!< start copying all the data from i2cregs_mtp to mtp [Key 2 protected] */ - TFA1_BF_RST = 0x7000, /*!< Reset CoolFlux DSP */ - TFA1_BF_DMEM = 0x7011, /*!< Target memory for access */ - TFA1_BF_AIF = 0x7030, /*!< Autoincrement-flag for memory-address */ - TFA1_BF_CFINT = 0x7040, /*!< Interrupt CoolFlux DSP */ - TFA1_BF_REQ = 0x7087, /*!< request for access (8 channels) */ - TFA1_BF_REQCMD = 0x7080, /*!< Firmware event request rpc command */ - TFA1_BF_REQRST = 0x7090, /*!< Firmware event request reset restart */ - TFA1_BF_REQMIPS = 0x70a0, /*!< Firmware event request short on mips */ - TFA1_BF_REQMUTED = 0x70b0, /*!< Firmware event request mute sequence ready */ - TFA1_BF_REQVOL = 0x70c0, /*!< Firmware event request volume ready */ - TFA1_BF_REQDMG = 0x70d0, /*!< Firmware event request speaker damage detected */ - TFA1_BF_REQCAL = 0x70e0, /*!< Firmware event request calibration completed */ - TFA1_BF_REQRSV = 0x70f0, /*!< Firmware event request reserved */ - TFA1_BF_MADD = 0x710f, /*!< memory-address to be accessed */ - TFA1_BF_MEMA = 0x720f, /*!< activate memory access (24- or 32-bits data is written/read to/from memory */ - TFA1_BF_ERR = 0x7307, /*!< Coolflux error flags */ - TFA1_BF_ACK = 0x7387, /*!< acknowledge of requests (8 channels) */ - TFA1_BF_MTPOTC = 0x8000, /*!< Calibration schedule (key2 protected) */ - TFA1_BF_MTPEX = 0x8010, /*!< (key2 protected) */ -} Tfa1BfEnumList_t; -#define TFA1_NAMETABLE static tfaBfName_t Tfa1DatasheetNames[] = {\ - { 0x0, "VDDS"}, /* Power-on-reset flag , */\ - { 0x10, "PLLS"}, /* PLL lock , */\ - { 0x20, "OTDS"}, /* Over Temperature Protection alarm , */\ - { 0x30, "OVDS"}, /* Over Voltage Protection alarm , */\ - { 0x40, "UVDS"}, /* Under Voltage Protection alarm , */\ - { 0x50, "OCDS"}, /* Over Current Protection alarm , */\ - { 0x60, "CLKS"}, /* Clocks stable flag , */\ - { 0x70, "CLIPS"}, /* Amplifier clipping , */\ - { 0x80, "MTPB"}, /* MTP busy , */\ - { 0x90, "NOCLK"}, /* Flag lost clock from clock generation unit , */\ - { 0xa0, "SPKS"}, /* Speaker error flag , */\ - { 0xb0, "ACS"}, /* Cold Start flag , */\ - { 0xc0, "SWS"}, /* Flag Engage , */\ - { 0xd0, "WDS"}, /* Flag watchdog reset , */\ - { 0xe0, "AMPS"}, /* Amplifier is enabled by manager , */\ - { 0xf0, "AREFS"}, /* References are enabled by manager , */\ - { 0x109, "BATS"}, /* Battery voltage readout; 0 .. 5.5 [V] , */\ - { 0x208, "TEMPS"}, /* Temperature readout from the temperature sensor , */\ - { 0x30b, "REV"}, /* Device type number is B97 , */\ - { 0x420, "RCV"}, /* Enable Receiver Mode , */\ - { 0x431, "CHS12"}, /* Channel Selection TDM input for Coolflux , */\ - { 0x450, "INPLVL"}, /* Input level selection control , */\ - { 0x461, "CHSA"}, /* Input selection for amplifier , */\ - { 0x4b0, "I2SDOE"}, /* Enable data output , */\ - { 0x4c3, "AUDFS"}, /* Audio sample rate setting , */\ - { 0x501, "SSCR"}, /* Protection Attack Time , */\ - { 0x523, "SST"}, /* ProtectionThreshold , */\ - { 0x561, "SSRL"}, /* Protection Maximum Reduction , */\ - { 0x582, "SSRR"}, /* Battery Protection Release Time , */\ - { 0x5b1, "SSHY"}, /* Battery Protection Hysteresis , */\ - { 0x5e0, "SSR"}, /* battery voltage for I2C read out only , */\ - { 0x5f0, "SSBY"}, /* bypass clipper battery protection , */\ - { 0x600, "DPSA"}, /* Enable dynamic powerstage activation , */\ - { 0x650, "CFSM"}, /* Soft mute in CoolFlux , */\ - { 0x670, "SSS"}, /* BatSenseSteepness , */\ - { 0x687, "VOL"}, /* volume control (in CoolFlux) , */\ - { 0x702, "DCVO"}, /* Boost Voltage , */\ - { 0x733, "DCMCC"}, /* Max boost coil current - step of 175 mA , */\ - { 0x7a0, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7b0, "DCSR"}, /* Soft RampUp/Down mode for DCDC controller , */\ - { 0x7c0, "DCPAVG"}, /* ctrl_peak2avg for analog part of DCDC , */\ - { 0x800, "TROS"}, /* Select external temperature also the ext_temp will be put on the temp read out , */\ - { 0x818, "EXTTS"}, /* external temperature setting to be given by host , */\ - { 0x900, "PWDN"}, /* Device Mode , */\ - { 0x910, "I2CR"}, /* I2C Reset , */\ - { 0x920, "CFE"}, /* Enable CoolFlux , */\ - { 0x930, "AMPE"}, /* Enable Amplifier , */\ - { 0x940, "DCA"}, /* EnableBoost , */\ - { 0x950, "SBSL"}, /* Coolflux configured , */\ - { 0x960, "AMPC"}, /* Selection on how Amplifier is enabled , */\ - { 0x970, "DCDIS"}, /* DCDC not connected , */\ - { 0x980, "PSDR"}, /* IDDQ test amplifier , */\ - { 0x991, "DCCV"}, /* Coil Value , */\ - { 0x9b0, "CCFD"}, /* Selection CoolFlux Clock , */\ - { 0x9c1, "INTPAD"}, /* INT pad configuration control , */\ - { 0x9e0, "IPLL"}, /* PLL input reference clock selection , */\ - { 0xb07, "MTPK"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0xc25, "CVFDLY"}, /* Fractional delay adjustment between current and voltage sense, */\ - { 0x1011, "TDMPRF"}, /* TDM_usecase , */\ - { 0x1030, "TDMEN"}, /* TDM interface control , */\ - { 0x1040, "TDMCKINV"}, /* TDM clock inversion , */\ - { 0x1053, "TDMFSLN"}, /* TDM FS length , */\ - { 0x1090, "TDMFSPOL"}, /* TDM FS polarity , */\ - { 0x10a4, "TDMSAMSZ"}, /* TDM Sample Size for all tdm sinks/sources , */\ - { 0x1103, "TDMSLOTS"}, /* Number of slots , */\ - { 0x1144, "TDMSLLN"}, /* Slot length , */\ - { 0x1194, "TDMBRMG"}, /* Bits remaining , */\ - { 0x11e0, "TDMDDEL"}, /* Data delay , */\ - { 0x11f0, "TDMDADJ"}, /* Data adjustment , */\ - { 0x1201, "TDMTXFRM"}, /* TXDATA format , */\ - { 0x1221, "TDMUUS0"}, /* TXDATA format unused slot sd0 , */\ - { 0x1241, "TDMUUS1"}, /* TXDATA format unused slot sd1 , */\ - { 0x1270, "TDMSI0EN"}, /* TDM sink0 enable , */\ - { 0x1280, "TDMSI1EN"}, /* TDM sink1 enable , */\ - { 0x1290, "TDMSI2EN"}, /* TDM sink2 enable , */\ - { 0x12a0, "TDMSO0EN"}, /* TDM source0 enable , */\ - { 0x12b0, "TDMSO1EN"}, /* TDM source1 enable , */\ - { 0x12c0, "TDMSO2EN"}, /* TDM source2 enable , */\ - { 0x12d0, "TDMSI0IO"}, /* tdm_sink0_io , */\ - { 0x12e0, "TDMSI1IO"}, /* tdm_sink1_io , */\ - { 0x12f0, "TDMSI2IO"}, /* tdm_sink2_io , */\ - { 0x1300, "TDMSO0IO"}, /* tdm_source0_io , */\ - { 0x1310, "TDMSO1IO"}, /* tdm_source1_io , */\ - { 0x1320, "TDMSO2IO"}, /* tdm_source2_io , */\ - { 0x1333, "TDMSI0SL"}, /* sink0_slot [GAIN IN] , */\ - { 0x1373, "TDMSI1SL"}, /* sink1_slot [CH1 IN] , */\ - { 0x13b3, "TDMSI2SL"}, /* sink2_slot [CH2 IN] , */\ - { 0x1403, "TDMSO0SL"}, /* source0_slot [GAIN OUT] , */\ - { 0x1443, "TDMSO1SL"}, /* source1_slot [Voltage Sense] , */\ - { 0x1483, "TDMSO2SL"}, /* source2_slot [Current Sense] , */\ - { 0x14c3, "NBCK"}, /* NBCK , */\ - { 0x2000, "INTOVDDS"}, /* flag_por_int_out , */\ - { 0x2010, "INTOPLLS"}, /* flag_pll_lock_int_out , */\ - { 0x2020, "INTOOTDS"}, /* flag_otpok_int_out , */\ - { 0x2030, "INTOOVDS"}, /* flag_ovpok_int_out , */\ - { 0x2040, "INTOUVDS"}, /* flag_uvpok_int_out , */\ - { 0x2050, "INTOOCDS"}, /* flag_ocp_alarm_int_out , */\ - { 0x2060, "INTOCLKS"}, /* flag_clocks_stable_int_out , */\ - { 0x2070, "INTOCLIPS"}, /* flag_clip_int_out , */\ - { 0x2080, "INTOMTPB"}, /* mtp_busy_int_out , */\ - { 0x2090, "INTONOCLK"}, /* flag_lost_clk_int_out , */\ - { 0x20a0, "INTOSPKS"}, /* flag_cf_speakererror_int_out , */\ - { 0x20b0, "INTOACS"}, /* flag_cold_started_int_out , */\ - { 0x20c0, "INTOSWS"}, /* flag_engage_int_out , */\ - { 0x20d0, "INTOWDS"}, /* flag_watchdog_reset_int_out , */\ - { 0x20e0, "INTOAMPS"}, /* flag_enbl_amp_int_out , */\ - { 0x20f0, "INTOAREFS"}, /* flag_enbl_ref_int_out , */\ - { 0x2201, "INTOACK"}, /* Interrupt status register output - Corresponding flag, */\ - { 0x2300, "INTIVDDS"}, /* flag_por_int_in , */\ - { 0x2310, "INTIPLLS"}, /* flag_pll_lock_int_in , */\ - { 0x2320, "INTIOTDS"}, /* flag_otpok_int_in , */\ - { 0x2330, "INTIOVDS"}, /* flag_ovpok_int_in , */\ - { 0x2340, "INTIUVDS"}, /* flag_uvpok_int_in , */\ - { 0x2350, "INTIOCDS"}, /* flag_ocp_alarm_int_in , */\ - { 0x2360, "INTICLKS"}, /* flag_clocks_stable_int_in , */\ - { 0x2370, "INTICLIPS"}, /* flag_clip_int_in , */\ - { 0x2380, "INTIMTPB"}, /* mtp_busy_int_in , */\ - { 0x2390, "INTINOCLK"}, /* flag_lost_clk_int_in , */\ - { 0x23a0, "INTISPKS"}, /* flag_cf_speakererror_int_in , */\ - { 0x23b0, "INTIACS"}, /* flag_cold_started_int_in , */\ - { 0x23c0, "INTISWS"}, /* flag_engage_int_in , */\ - { 0x23d0, "INTIWDS"}, /* flag_watchdog_reset_int_in , */\ - { 0x23e0, "INTIAMPS"}, /* flag_enbl_amp_int_in , */\ - { 0x23f0, "INTIAREFS"}, /* flag_enbl_ref_int_in , */\ - { 0x2501, "INTIACK"}, /* Interrupt register input , */\ - { 0x2600, "INTENVDDS"}, /* flag_por_int_enable , */\ - { 0x2610, "INTENPLLS"}, /* flag_pll_lock_int_enable , */\ - { 0x2620, "INTENOTDS"}, /* flag_otpok_int_enable , */\ - { 0x2630, "INTENOVDS"}, /* flag_ovpok_int_enable , */\ - { 0x2640, "INTENUVDS"}, /* flag_uvpok_int_enable , */\ - { 0x2650, "INTENOCDS"}, /* flag_ocp_alarm_int_enable , */\ - { 0x2660, "INTENCLKS"}, /* flag_clocks_stable_int_enable , */\ - { 0x2670, "INTENCLIPS"}, /* flag_clip_int_enable , */\ - { 0x2680, "INTENMTPB"}, /* mtp_busy_int_enable , */\ - { 0x2690, "INTENNOCLK"}, /* flag_lost_clk_int_enable , */\ - { 0x26a0, "INTENSPKS"}, /* flag_cf_speakererror_int_enable , */\ - { 0x26b0, "INTENACS"}, /* flag_cold_started_int_enable , */\ - { 0x26c0, "INTENSWS"}, /* flag_engage_int_enable , */\ - { 0x26d0, "INTENWDS"}, /* flag_watchdog_reset_int_enable , */\ - { 0x26e0, "INTENAMPS"}, /* flag_enbl_amp_int_enable , */\ - { 0x26f0, "INTENAREFS"}, /* flag_enbl_ref_int_enable , */\ - { 0x2801, "INTENACK"}, /* Interrupt enable register , */\ - { 0x2900, "INTPOLVDDS"}, /* flag_por_int_pol , */\ - { 0x2910, "INTPOLPLLS"}, /* flag_pll_lock_int_pol , */\ - { 0x2920, "INTPOLOTDS"}, /* flag_otpok_int_pol , */\ - { 0x2930, "INTPOLOVDS"}, /* flag_ovpok_int_pol , */\ - { 0x2940, "INTPOLUVDS"}, /* flag_uvpok_int_pol , */\ - { 0x2950, "INTPOLOCDS"}, /* flag_ocp_alarm_int_pol , */\ - { 0x2960, "INTPOLCLKS"}, /* flag_clocks_stable_int_pol , */\ - { 0x2970, "INTPOLCLIPS"}, /* flag_clip_int_pol , */\ - { 0x2980, "INTPOLMTPB"}, /* mtp_busy_int_pol , */\ - { 0x2990, "INTPOLNOCLK"}, /* flag_lost_clk_int_pol , */\ - { 0x29a0, "INTPOLSPKS"}, /* flag_cf_speakererror_int_pol , */\ - { 0x29b0, "INTPOLACS"}, /* flag_cold_started_int_pol , */\ - { 0x29c0, "INTPOLSWS"}, /* flag_engage_int_pol , */\ - { 0x29d0, "INTPOLWDS"}, /* flag_watchdog_reset_int_pol , */\ - { 0x29e0, "INTPOLAMPS"}, /* flag_enbl_amp_int_pol , */\ - { 0x29f0, "INTPOLAREFS"}, /* flag_enbl_ref_int_pol , */\ - { 0x2b01, "INTPOLACK"}, /* Interrupt status flags polarity register , */\ - { 0x4900, "CLIP"}, /* Bypass clip control , */\ - { 0x62b0, "CIMTP"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ - { 0x7000, "RST"}, /* Reset CoolFlux DSP , */\ - { 0x7011, "DMEM"}, /* Target memory for access , */\ - { 0x7030, "AIF"}, /* Autoincrement-flag for memory-address , */\ - { 0x7040, "CFINT"}, /* Interrupt CoolFlux DSP , */\ - { 0x7087, "REQ"}, /* request for access (8 channels) , */\ - { 0x7080, "REQCMD"}, /* Firmware event request rpc command , */\ - { 0x7090, "REQRST"}, /* Firmware event request reset restart , */\ - { 0x70a0, "REQMIPS"}, /* Firmware event request short on mips , */\ - { 0x70b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ - { 0x70c0, "REQVOL"}, /* Firmware event request volume ready , */\ - { 0x70d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ - { 0x70e0, "REQCAL"}, /* Firmware event request calibration completed , */\ - { 0x70f0, "REQRSV"}, /* Firmware event request reserved , */\ - { 0x710f, "MADD"}, /* memory-address to be accessed , */\ - { 0x720f, "MEMA"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ - { 0x7307, "ERR"}, /* Coolflux error flags , */\ - { 0x7387, "ACK"}, /* acknowledge of requests (8 channels) , */\ - { 0x7380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ - { 0x7390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ - { 0x73a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ - { 0x73b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x73c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ - { 0x73d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x73e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ - { 0x73f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ - { 0x8000, "MTPOTC"}, /* Calibration schedule (key2 protected) , */\ - { 0x8010, "MTPEX"}, /* (key2 protected) , */\ - { 0x8045, "SWPROFIL" },\ - { 0x80a5, "SWVSTEP" },\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA1_BITNAMETABLE static tfaBfName_t Tfa1BitNames[] = {\ - { 0x0, "flag_por"}, /* Power-on-reset flag , */\ - { 0x10, "flag_pll_lock"}, /* PLL lock , */\ - { 0x20, "flag_otpok"}, /* Over Temperature Protection alarm , */\ - { 0x30, "flag_ovpok"}, /* Over Voltage Protection alarm , */\ - { 0x40, "flag_uvpok"}, /* Under Voltage Protection alarm , */\ - { 0x50, "flag_ocp_alarm"}, /* Over Current Protection alarm , */\ - { 0x60, "flag_clocks_stable"}, /* Clocks stable flag , */\ - { 0x70, "flag_clip"}, /* Amplifier clipping , */\ - { 0x80, "mtp_busy"}, /* MTP busy , */\ - { 0x90, "flag_lost_clk"}, /* Flag lost clock from clock generation unit , */\ - { 0xa0, "flag_cf_speakererror"}, /* Speaker error flag , */\ - { 0xb0, "flag_cold_started"}, /* Cold Start flag , */\ - { 0xc0, "flag_engage"}, /* Flag Engage , */\ - { 0xd0, "flag_watchdog_reset"}, /* Flag watchdog reset , */\ - { 0xe0, "flag_enbl_amp"}, /* Amplifier is enabled by manager , */\ - { 0xf0, "flag_enbl_ref"}, /* References are enabled by manager , */\ - { 0x109, "bat_adc"}, /* Battery voltage readout; 0 .. 5.5 [V] , */\ - { 0x208, "temp_adc"}, /* Temperature readout from the temperature sensor , */\ - { 0x30b, "rev_reg"}, /* Device type number is B97 , */\ - { 0x420, "ctrl_rcv"}, /* Enable Receiver Mode , */\ - { 0x431, "chan_sel"}, /* Channel Selection TDM input for Coolflux , */\ - { 0x450, "input_level"}, /* Input level selection control , */\ - { 0x461, "vamp_sel"}, /* Input selection for amplifier , */\ - { 0x4c3, "audio_fs"}, /* Audio sample rate setting , */\ - { 0x501, "vbat_prot_attacktime"}, /* Protection Attack Time , */\ - { 0x523, "vbat_prot_thlevel"}, /* ProtectionThreshold , */\ - { 0x561, "vbat_prot_max_reduct"}, /* Protection Maximum Reduction , */\ - { 0x582, "vbat_prot_release_t"}, /* Battery Protection Release Time , */\ - { 0x5b1, "vbat_prot_hysterese"}, /* Battery Protection Hysteresis , */\ - { 0x5d0, "reset_min_vbat"}, /* reset clipper , */\ - { 0x5e0, "sel_vbat"}, /* battery voltage for I2C read out only , */\ - { 0x5f0, "bypass_clipper"}, /* bypass clipper battery protection , */\ - { 0x600, "dpsa"}, /* Enable dynamic powerstage activation , */\ - { 0x650, "cf_mute"}, /* Soft mute in CoolFlux , */\ - { 0x670, "batsense_steepness"}, /* BatSenseSteepness , */\ - { 0x687, "vol"}, /* volume control (in CoolFlux) , */\ - { 0x702, "boost_volt"}, /* Boost Voltage , */\ - { 0x733, "boost_cur"}, /* Max boost coil current - step of 175 mA , */\ - { 0x7a0, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7b0, "boost_speed"}, /* Soft RampUp/Down mode for DCDC controller , */\ - { 0x7c0, "boost_peak2avg"}, /* ctrl_peak2avg for analog part of DCDC , */\ - { 0x800, "ext_temp_sel"}, /* Select external temperature also the ext_temp will be put on the temp read out , */\ - { 0x818, "ext_temp"}, /* external temperature setting to be given by host , */\ - { 0x8b2, "dcdc_synchronisation"}, /* DCDC synchronisation off + 7 positions , */\ - { 0x900, "powerdown"}, /* Device Mode , */\ - { 0x910, "reset"}, /* I2C Reset , */\ - { 0x920, "enbl_coolflux"}, /* Enable CoolFlux , */\ - { 0x930, "enbl_amplifier"}, /* Enable Amplifier , */\ - { 0x940, "enbl_boost"}, /* EnableBoost , */\ - { 0x950, "coolflux_configured"}, /* Coolflux configured , */\ - { 0x960, "sel_enbl_amplifier"}, /* Selection on how Amplifier is enabled , */\ - { 0x970, "dcdcoff_mode"}, /* DCDC not connected , */\ - { 0x980, "iddqtest"}, /* IDDQ test amplifier , */\ - { 0x991, "coil_value"}, /* Coil Value , */\ - { 0x9b0, "sel_cf_clock"}, /* Selection CoolFlux Clock , */\ - { 0x9c1, "int_pad_io"}, /* INT pad configuration control , */\ - { 0x9e0, "sel_fs_bck"}, /* PLL input reference clock selection , */\ - { 0x9f0, "sel_scl_cf_clock"}, /* Coolflux sub-system clock , */\ - { 0xb07, "mtpkey2"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0xc00, "enbl_volt_sense"}, /* Voltage sense enabling control bit , */\ - { 0xc10, "vsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ - { 0xc25, "vi_frac_delay"}, /* Fractional delay adjustment between current and voltage sense, */\ - { 0xc80, "sel_voltsense_out"}, /* TDM output data selection control , */\ - { 0xc90, "vsense_bypass_avg"}, /* Voltage Sense Average Block Bypass , */\ - { 0xd05, "cf_frac_delay"}, /* Fractional delay adjustment between current and voltage sense by firmware, */\ - { 0xe00, "bypass_dcdc_curr_prot"}, /* Control to switch off dcdc current reduction with bat protection, */\ - { 0xe80, "disable_clock_sh_prot"}, /* disable clock_sh protection , */\ - { 0xe96, "reserve_reg_1_15_9"}, /* , */\ - { 0x1011, "tdm_usecase"}, /* TDM_usecase , */\ - { 0x1030, "tdm_enable"}, /* TDM interface control , */\ - { 0x1040, "tdm_clk_inversion"}, /* TDM clock inversion , */\ - { 0x1053, "tdm_fs_ws_length"}, /* TDM FS length , */\ - { 0x1090, "tdm_fs_ws_polarity"}, /* TDM FS polarity , */\ - { 0x10a4, "tdm_sample_size"}, /* TDM Sample Size for all tdm sinks/sources , */\ - { 0x1103, "tdm_nb_of_slots"}, /* Number of slots , */\ - { 0x1144, "tdm_slot_length"}, /* Slot length , */\ - { 0x1194, "tdm_bits_remaining"}, /* Bits remaining , */\ - { 0x11e0, "tdm_data_delay"}, /* Data delay , */\ - { 0x11f0, "tdm_data_adjustment"}, /* Data adjustment , */\ - { 0x1201, "tdm_txdata_format"}, /* TXDATA format , */\ - { 0x1221, "tdm_txdata_format_unused_slot_sd0"}, /* TXDATA format unused slot sd0 , */\ - { 0x1241, "tdm_txdata_format_unused_slot_sd1"}, /* TXDATA format unused slot sd1 , */\ - { 0x1270, "tdm_sink0_enable"}, /* TDM sink0 enable , */\ - { 0x1280, "tdm_sink1_enable"}, /* TDM sink1 enable , */\ - { 0x1290, "tdm_sink2_enable"}, /* TDM sink2 enable , */\ - { 0x12a0, "tdm_source0_enable"}, /* TDM source0 enable , */\ - { 0x12b0, "tdm_source1_enable"}, /* TDM source1 enable , */\ - { 0x12c0, "tdm_source2_enable"}, /* TDM source2 enable , */\ - { 0x12d0, "tdm_sink0_io"}, /* tdm_sink0_io , */\ - { 0x12e0, "tdm_sink1_io"}, /* tdm_sink1_io , */\ - { 0x12f0, "tdm_sink2_io"}, /* tdm_sink2_io , */\ - { 0x1300, "tdm_source0_io"}, /* tdm_source0_io , */\ - { 0x1310, "tdm_source1_io"}, /* tdm_source1_io , */\ - { 0x1320, "tdm_source2_io"}, /* tdm_source2_io , */\ - { 0x1333, "tdm_sink0_slot"}, /* sink0_slot [GAIN IN] , */\ - { 0x1373, "tdm_sink1_slot"}, /* sink1_slot [CH1 IN] , */\ - { 0x13b3, "tdm_sink2_slot"}, /* sink2_slot [CH2 IN] , */\ - { 0x1403, "tdm_source0_slot"}, /* source0_slot [GAIN OUT] , */\ - { 0x1443, "tdm_source1_slot"}, /* source1_slot [Voltage Sense] , */\ - { 0x1483, "tdm_source2_slot"}, /* source2_slot [Current Sense] , */\ - { 0x14c3, "tdm_nbck"}, /* NBCK , */\ - { 0x1500, "flag_tdm_lut_error"}, /* TDM LUT error flag , */\ - { 0x1512, "flag_tdm_status"}, /* TDM interface status bits , */\ - { 0x1540, "flag_tdm_error"}, /* TDM interface error indicator , */\ - { 0x2000, "flag_por_int_out"}, /* flag_por_int_out , */\ - { 0x2010, "flag_pll_lock_int_out"}, /* flag_pll_lock_int_out , */\ - { 0x2020, "flag_otpok_int_out"}, /* flag_otpok_int_out , */\ - { 0x2030, "flag_ovpok_int_out"}, /* flag_ovpok_int_out , */\ - { 0x2040, "flag_uvpok_int_out"}, /* flag_uvpok_int_out , */\ - { 0x2050, "flag_ocp_alarm_int_out"}, /* flag_ocp_alarm_int_out , */\ - { 0x2060, "flag_clocks_stable_int_out"}, /* flag_clocks_stable_int_out , */\ - { 0x2070, "flag_clip_int_out"}, /* flag_clip_int_out , */\ - { 0x2080, "mtp_busy_int_out"}, /* mtp_busy_int_out , */\ - { 0x2090, "flag_lost_clk_int_out"}, /* flag_lost_clk_int_out , */\ - { 0x20a0, "flag_cf_speakererror_int_out"}, /* flag_cf_speakererror_int_out , */\ - { 0x20b0, "flag_cold_started_int_out"}, /* flag_cold_started_int_out , */\ - { 0x20c0, "flag_engage_int_out"}, /* flag_engage_int_out , */\ - { 0x20d0, "flag_watchdog_reset_int_out"}, /* flag_watchdog_reset_int_out , */\ - { 0x20e0, "flag_enbl_amp_int_out"}, /* flag_enbl_amp_int_out , */\ - { 0x20f0, "flag_enbl_ref_int_out"}, /* flag_enbl_ref_int_out , */\ - { 0x2100, "flag_voutcomp_int_out"}, /* flag_voutcomp_int_out , */\ - { 0x2110, "flag_voutcomp93_int_out"}, /* flag_voutcomp93_int_out , */\ - { 0x2120, "flag_voutcomp86_int_out"}, /* flag_voutcomp86_int_out , */\ - { 0x2130, "flag_hiz_int_out"}, /* flag_hiz_int_out , */\ - { 0x2140, "flag_ocpokbst_int_out"}, /* flag_ocpokbst_int_out , */\ - { 0x2150, "flag_peakcur_int_out"}, /* flag_peakcur_int_out , */\ - { 0x2160, "flag_ocpokap_int_out"}, /* flag_ocpokap_int_out , */\ - { 0x2170, "flag_ocpokan_int_out"}, /* flag_ocpokan_int_out , */\ - { 0x2180, "flag_ocpokbp_int_out"}, /* flag_ocpokbp_int_out , */\ - { 0x2190, "flag_ocpokbn_int_out"}, /* flag_ocpokbn_int_out , */\ - { 0x21a0, "flag_adc10_ready_int_out"}, /* flag_adc10_ready_int_out , */\ - { 0x21b0, "flag_clipa_high_int_out"}, /* flag_clipa_high_int_out , */\ - { 0x21c0, "flag_clipa_low_int_out"}, /* flag_clipa_low_int_out , */\ - { 0x21d0, "flag_clipb_high_int_out"}, /* flag_clipb_high_int_out , */\ - { 0x21e0, "flag_clipb_low_int_out"}, /* flag_clipb_low_int_out , */\ - { 0x21f0, "flag_tdm_error_int_out"}, /* flag_tdm_error_int_out , */\ - { 0x2201, "interrupt_out3"}, /* Interrupt status register output - Corresponding flag, */\ - { 0x2300, "flag_por_int_in"}, /* flag_por_int_in , */\ - { 0x2310, "flag_pll_lock_int_in"}, /* flag_pll_lock_int_in , */\ - { 0x2320, "flag_otpok_int_in"}, /* flag_otpok_int_in , */\ - { 0x2330, "flag_ovpok_int_in"}, /* flag_ovpok_int_in , */\ - { 0x2340, "flag_uvpok_int_in"}, /* flag_uvpok_int_in , */\ - { 0x2350, "flag_ocp_alarm_int_in"}, /* flag_ocp_alarm_int_in , */\ - { 0x2360, "flag_clocks_stable_int_in"}, /* flag_clocks_stable_int_in , */\ - { 0x2370, "flag_clip_int_in"}, /* flag_clip_int_in , */\ - { 0x2380, "mtp_busy_int_in"}, /* mtp_busy_int_in , */\ - { 0x2390, "flag_lost_clk_int_in"}, /* flag_lost_clk_int_in , */\ - { 0x23a0, "flag_cf_speakererror_int_in"}, /* flag_cf_speakererror_int_in , */\ - { 0x23b0, "flag_cold_started_int_in"}, /* flag_cold_started_int_in , */\ - { 0x23c0, "flag_engage_int_in"}, /* flag_engage_int_in , */\ - { 0x23d0, "flag_watchdog_reset_int_in"}, /* flag_watchdog_reset_int_in , */\ - { 0x23e0, "flag_enbl_amp_int_in"}, /* flag_enbl_amp_int_in , */\ - { 0x23f0, "flag_enbl_ref_int_in"}, /* flag_enbl_ref_int_in , */\ - { 0x2400, "flag_voutcomp_int_in"}, /* flag_voutcomp_int_in , */\ - { 0x2410, "flag_voutcomp93_int_in"}, /* flag_voutcomp93_int_in , */\ - { 0x2420, "flag_voutcomp86_int_in"}, /* flag_voutcomp86_int_in , */\ - { 0x2430, "flag_hiz_int_in"}, /* flag_hiz_int_in , */\ - { 0x2440, "flag_ocpokbst_int_in"}, /* flag_ocpokbst_int_in , */\ - { 0x2450, "flag_peakcur_int_in"}, /* flag_peakcur_int_in , */\ - { 0x2460, "flag_ocpokap_int_in"}, /* flag_ocpokap_int_in , */\ - { 0x2470, "flag_ocpokan_int_in"}, /* flag_ocpokan_int_in , */\ - { 0x2480, "flag_ocpokbp_int_in"}, /* flag_ocpokbp_int_in , */\ - { 0x2490, "flag_ocpokbn_int_in"}, /* flag_ocpokbn_int_in , */\ - { 0x24a0, "flag_adc10_ready_int_in"}, /* flag_adc10_ready_int_in , */\ - { 0x24b0, "flag_clipa_high_int_in"}, /* flag_clipa_high_int_in , */\ - { 0x24c0, "flag_clipa_low_int_in"}, /* flag_clipa_low_int_in , */\ - { 0x24d0, "flag_clipb_high_int_in"}, /* flag_clipb_high_int_in , */\ - { 0x24e0, "flag_clipb_low_int_in"}, /* flag_clipb_low_int_in , */\ - { 0x24f0, "flag_tdm_error_int_in"}, /* flag_tdm_error_int_in , */\ - { 0x2501, "interrupt_in3"}, /* Interrupt register input , */\ - { 0x2600, "flag_por_int_enable"}, /* flag_por_int_enable , */\ - { 0x2610, "flag_pll_lock_int_enable"}, /* flag_pll_lock_int_enable , */\ - { 0x2620, "flag_otpok_int_enable"}, /* flag_otpok_int_enable , */\ - { 0x2630, "flag_ovpok_int_enable"}, /* flag_ovpok_int_enable , */\ - { 0x2640, "flag_uvpok_int_enable"}, /* flag_uvpok_int_enable , */\ - { 0x2650, "flag_ocp_alarm_int_enable"}, /* flag_ocp_alarm_int_enable , */\ - { 0x2660, "flag_clocks_stable_int_enable"}, /* flag_clocks_stable_int_enable , */\ - { 0x2670, "flag_clip_int_enable"}, /* flag_clip_int_enable , */\ - { 0x2680, "mtp_busy_int_enable"}, /* mtp_busy_int_enable , */\ - { 0x2690, "flag_lost_clk_int_enable"}, /* flag_lost_clk_int_enable , */\ - { 0x26a0, "flag_cf_speakererror_int_enable"}, /* flag_cf_speakererror_int_enable , */\ - { 0x26b0, "flag_cold_started_int_enable"}, /* flag_cold_started_int_enable , */\ - { 0x26c0, "flag_engage_int_enable"}, /* flag_engage_int_enable , */\ - { 0x26d0, "flag_watchdog_reset_int_enable"}, /* flag_watchdog_reset_int_enable , */\ - { 0x26e0, "flag_enbl_amp_int_enable"}, /* flag_enbl_amp_int_enable , */\ - { 0x26f0, "flag_enbl_ref_int_enable"}, /* flag_enbl_ref_int_enable , */\ - { 0x2700, "flag_voutcomp_int_enable"}, /* flag_voutcomp_int_enable , */\ - { 0x2710, "flag_voutcomp93_int_enable"}, /* flag_voutcomp93_int_enable , */\ - { 0x2720, "flag_voutcomp86_int_enable"}, /* flag_voutcomp86_int_enable , */\ - { 0x2730, "flag_hiz_int_enable"}, /* flag_hiz_int_enable , */\ - { 0x2740, "flag_ocpokbst_int_enable"}, /* flag_ocpokbst_int_enable , */\ - { 0x2750, "flag_peakcur_int_enable"}, /* flag_peakcur_int_enable , */\ - { 0x2760, "flag_ocpokap_int_enable"}, /* flag_ocpokap_int_enable , */\ - { 0x2770, "flag_ocpokan_int_enable"}, /* flag_ocpokan_int_enable , */\ - { 0x2780, "flag_ocpokbp_int_enable"}, /* flag_ocpokbp_int_enable , */\ - { 0x2790, "flag_ocpokbn_int_enable"}, /* flag_ocpokbn_int_enable , */\ - { 0x27a0, "flag_adc10_ready_int_enable"}, /* flag_adc10_ready_int_enable , */\ - { 0x27b0, "flag_clipa_high_int_enable"}, /* flag_clipa_high_int_enable , */\ - { 0x27c0, "flag_clipa_low_int_enable"}, /* flag_clipa_low_int_enable , */\ - { 0x27d0, "flag_clipb_high_int_enable"}, /* flag_clipb_high_int_enable , */\ - { 0x27e0, "flag_clipb_low_int_enable"}, /* flag_clipb_low_int_enable , */\ - { 0x27f0, "flag_tdm_error_int_enable"}, /* flag_tdm_error_int_enable , */\ - { 0x2801, "interrupt_enable3"}, /* Interrupt enable register , */\ - { 0x2900, "flag_por_int_pol"}, /* flag_por_int_pol , */\ - { 0x2910, "flag_pll_lock_int_pol"}, /* flag_pll_lock_int_pol , */\ - { 0x2920, "flag_otpok_int_pol"}, /* flag_otpok_int_pol , */\ - { 0x2930, "flag_ovpok_int_pol"}, /* flag_ovpok_int_pol , */\ - { 0x2940, "flag_uvpok_int_pol"}, /* flag_uvpok_int_pol , */\ - { 0x2950, "flag_ocp_alarm_int_pol"}, /* flag_ocp_alarm_int_pol , */\ - { 0x2960, "flag_clocks_stable_int_pol"}, /* flag_clocks_stable_int_pol , */\ - { 0x2970, "flag_clip_int_pol"}, /* flag_clip_int_pol , */\ - { 0x2980, "mtp_busy_int_pol"}, /* mtp_busy_int_pol , */\ - { 0x2990, "flag_lost_clk_int_pol"}, /* flag_lost_clk_int_pol , */\ - { 0x29a0, "flag_cf_speakererror_int_pol"}, /* flag_cf_speakererror_int_pol , */\ - { 0x29b0, "flag_cold_started_int_pol"}, /* flag_cold_started_int_pol , */\ - { 0x29c0, "flag_engage_int_pol"}, /* flag_engage_int_pol , */\ - { 0x29d0, "flag_watchdog_reset_int_pol"}, /* flag_watchdog_reset_int_pol , */\ - { 0x29e0, "flag_enbl_amp_int_pol"}, /* flag_enbl_amp_int_pol , */\ - { 0x29f0, "flag_enbl_ref_int_pol"}, /* flag_enbl_ref_int_pol , */\ - { 0x2a00, "flag_voutcomp_int_pol"}, /* flag_voutcomp_int_pol , */\ - { 0x2a10, "flag_voutcomp93_int_pol"}, /* flag_voutcomp93_int_pol , */\ - { 0x2a20, "flag_voutcomp86_int_pol"}, /* flag_voutcomp86_int_pol , */\ - { 0x2a30, "flag_hiz_int_pol"}, /* flag_hiz_int_pol , */\ - { 0x2a40, "flag_ocpokbst_int_pol"}, /* flag_ocpokbst_int_pol , */\ - { 0x2a50, "flag_peakcur_int_pol"}, /* flag_peakcur_int_pol , */\ - { 0x2a60, "flag_ocpokap_int_pol"}, /* flag_ocpokap_int_pol , */\ - { 0x2a70, "flag_ocpokan_int_pol"}, /* flag_ocpokan_int_pol , */\ - { 0x2a80, "flag_ocpokbp_int_pol"}, /* flag_ocpokbp_int_pol , */\ - { 0x2a90, "flag_ocpokbn_int_pol"}, /* flag_ocpokbn_int_pol , */\ - { 0x2aa0, "flag_adc10_ready_int_pol"}, /* flag_adc10_ready_int_pol , */\ - { 0x2ab0, "flag_clipa_high_int_pol"}, /* flag_clipa_high_int_pol , */\ - { 0x2ac0, "flag_clipa_low_int_pol"}, /* flag_clipa_low_int_pol , */\ - { 0x2ad0, "flag_clipb_high_int_pol"}, /* flag_clipb_high_int_pol , */\ - { 0x2ae0, "flag_clipb_low_int_pol"}, /* flag_clipb_low_int_pol , */\ - { 0x2af0, "flag_tdm_error_int_pol"}, /* flag_tdm_error_int_pol , */\ - { 0x2b01, "status_polarity3"}, /* Interrupt status flags polarity register , */\ - { 0x3000, "flag_voutcomp"}, /* flag_voutcomp, indication Vset is larger than Vbat, */\ - { 0x3010, "flag_voutcomp93"}, /* flag_voutcomp93, indication Vset is larger than 1.07* Vbat, */\ - { 0x3020, "flag_voutcomp86"}, /* flag_voutcomp86, indication Vset is larger than 1.14* Vbat, */\ - { 0x3030, "flag_hiz"}, /* flag_hiz, indication Vbst is larger than Vbat , */\ - { 0x3040, "flag_ocpokbst"}, /* flag_ocpokbst, indication no over current in boost converter pmos switch, */\ - { 0x3050, "flag_peakcur"}, /* flag_peakcur, indication current is max in dcdc converter, */\ - { 0x3060, "flag_ocpokap"}, /* flag_ocpokap, indication no over current in amplifier "a" pmos output stage, */\ - { 0x3070, "flag_ocpokan"}, /* flag_ocpokan, indication no over current in amplifier "a" nmos output stage, */\ - { 0x3080, "flag_ocpokbp"}, /* flag_ocpokbp, indication no over current in amplifier "b" pmos output stage, */\ - { 0x3090, "flag_ocpokbn"}, /* flag_ocpokbn, indication no over current in amplifier"b" nmos output stage, */\ - { 0x30a0, "flag_adc10_ready"}, /* flag_adc10_ready, indication adc10 is ready , */\ - { 0x30b0, "flag_clipa_high"}, /* flag_clipa_high, indication pmos amplifier "a" is clipping, */\ - { 0x30c0, "flag_clipa_low"}, /* flag_clipa_low, indication nmos amplifier "a" is clipping, */\ - { 0x30d0, "flag_clipb_high"}, /* flag_clipb_high, indication pmos amplifier "b" is clipping, */\ - { 0x30e0, "flag_clipb_low"}, /* flag_clipb_low, indication nmos amplifier "b" is clipping, */\ - { 0x310f, "mtp_man_data_out"}, /* single word read from MTP (manual copy) , */\ - { 0x3200, "key01_locked"}, /* key01_locked, indication key 1 is locked , */\ - { 0x3210, "key02_locked"}, /* key02_locked, indication key 2 is locked , */\ - { 0x3225, "mtp_ecc_tcout"}, /* mtp_ecc_tcout , */\ - { 0x3280, "mtpctrl_valid_test_rd"}, /* mtp test readout for read , */\ - { 0x3290, "mtpctrl_valid_test_wr"}, /* mtp test readout for write , */\ - { 0x32a0, "flag_in_alarm_state"}, /* Alarm state , */\ - { 0x32b0, "mtp_ecc_err2"}, /* two or more bit errors detected in MTP, can not reconstruct value, */\ - { 0x32c0, "mtp_ecc_err1"}, /* one bit error detected in MTP, reconstructed value, */\ - { 0x32d0, "mtp_mtp_hvf"}, /* high voltage ready flag for MTP , */\ - { 0x32f0, "mtp_zero_check_fail"}, /* zero check failed (tbd) for MTP , */\ - { 0x3309, "data_adc10_tempbat"}, /* data_adc10_tempbat[9;0], adc 10 data output for testing, */\ - { 0x400f, "hid_code"}, /* 5A6Bh, 23147d to access registers (Default for engineering), */\ - { 0x4100, "bypass_hp"}, /* Bypass_High Pass Filter , */\ - { 0x4110, "hard_mute"}, /* Hard Mute , */\ - { 0x4120, "soft_mute"}, /* Soft Mute , */\ - { 0x4134, "pwm_delay"}, /* PWM DelayBits to set the delay , */\ - { 0x4180, "pwm_shape"}, /* PWM Shape , */\ - { 0x4190, "pwm_bitlength"}, /* PWM Bitlength in noise shaper , */\ - { 0x4203, "drive"}, /* Drive bits to select amount of power stage amplifier, */\ - { 0x4240, "reclock_pwm"}, /* , */\ - { 0x4250, "reclock_voltsense"}, /* , */\ - { 0x4281, "dpsalevel"}, /* DPSA Threshold level , */\ - { 0x42a1, "dpsa_release"}, /* DPSA Release time , */\ - { 0x42c0, "coincidence"}, /* Prevent simultaneously switching of output stage , */\ - { 0x42d0, "kickback"}, /* Prevent double pulses of output stage , */\ - { 0x4306, "drivebst"}, /* Drive bits to select the powertransistor sections boost converter, */\ - { 0x43a0, "ocptestbst"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0);For new ocp (ctrl_reversebst is 1);, */\ - { 0x43d0, "test_abistfft_enbl"}, /* FFT coolflux , */\ - { 0x43f0, "test_bcontrol"}, /* test _bcontrol , */\ - { 0x4400, "reversebst"}, /* OverCurrent Protection selection of power stage boost converter, */\ - { 0x4410, "sensetest"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0x4420, "enbl_engagebst"}, /* Enable power stage dcdc controller , */\ - { 0x4470, "enbl_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x4480, "enbl_voutcomp"}, /* Enable vout comparators , */\ - { 0x4490, "enbl_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x44a0, "enbl_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x44b0, "enbl_hizcom"}, /* Enable hiz comparator , */\ - { 0x44c0, "enbl_peakcur"}, /* Enable peak current , */\ - { 0x44d0, "bypass_ovpglitch"}, /* Bypass OVP Glitch Filter , */\ - { 0x44e0, "enbl_windac"}, /* Enable window dac , */\ - { 0x44f0, "enbl_powerbst"}, /* Enable line of the powerstage , */\ - { 0x4507, "ocp_thr"}, /* ocp_thr threshold level for OCP , */\ - { 0x4580, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0x4590, "bypass_ovp"}, /* Bypass OVP , */\ - { 0x45a0, "bypass_uvp"}, /* Bypass UVP , */\ - { 0x45b0, "bypass_otp"}, /* Bypass OTP , */\ - { 0x45c0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0x45d0, "bypass_ocpcounter"}, /* BypassOCPCounter , */\ - { 0x45e0, "bypass_lost_clk"}, /* Bypasslost_clk detector , */\ - { 0x45f0, "vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0x4600, "bypass_gc"}, /* bypass_gc, bypasses the CS gain correction , */\ - { 0x4610, "cs_gain_control"}, /* gain control by means of MTP or i2c; 0 is MTP , */\ - { 0x4627, "cs_gain"}, /* + / - 128 steps in steps of 1/4 percent 2's compliment, */\ - { 0x46a0, "bypass_lp"}, /* bypass Low-Pass filter in temperature sensor , */\ - { 0x46b0, "bypass_pwmcounter"}, /* bypass_pwmcounter , */\ - { 0x46c0, "cs_negfixed"}, /* does not switch to neg , */\ - { 0x46d2, "cs_neghyst"}, /* switches to neg depending on level , */\ - { 0x4700, "switch_fb"}, /* switch_fb , */\ - { 0x4713, "se_hyst"}, /* se_hyst , */\ - { 0x4754, "se_level"}, /* se_level , */\ - { 0x47a5, "ktemp"}, /* temperature compensation trimming , */\ - { 0x4800, "cs_negin"}, /* negin , */\ - { 0x4810, "cs_sein"}, /* cs_sein , */\ - { 0x4820, "cs_coincidence"}, /* Coincidence current sense , */\ - { 0x4830, "iddqtestbst"}, /* for iddq testing in powerstage of boost convertor , */\ - { 0x4840, "coincidencebst"}, /* Switch protection on to prevent simultaneously switching power stages bst and amp, */\ - { 0x4876, "delay_se_neg"}, /* delay of se and neg , */\ - { 0x48e1, "cs_ttrack"}, /* sample & hold track time , */\ - { 0x4900, "bypass_clip"}, /* Bypass clip control , */\ - { 0x4920, "cf_cgate_off"}, /* to disable clock gating in the coolflux , */\ - { 0x4940, "clipfast"}, /* clock switch for battery protection clipper, it switches back to old frequency, */\ - { 0x4950, "cs_8ohm"}, /* 8 ohm mode for current sense (gain mode) , */\ - { 0x4974, "delay_clock_sh"}, /* delay_sh, tunes S7H delay , */\ - { 0x49c0, "inv_clksh"}, /* Invert the sample/hold clock for current sense ADC, */\ - { 0x49d0, "inv_neg"}, /* Invert neg signal , */\ - { 0x49e0, "inv_se"}, /* Invert se signal , */\ - { 0x49f0, "setse"}, /* switches between Single Ende and differential mode; 1 is single ended, */\ - { 0x4a12, "adc10_sel"}, /* select the input to convert the 10b ADC , */\ - { 0x4a60, "adc10_reset"}, /* Global asynchronous reset (active HIGH) 10 bit ADC, */\ - { 0x4a81, "adc10_test"}, /* Test mode selection signal 10 bit ADC , */\ - { 0x4aa0, "bypass_lp_vbat"}, /* lp filter in batt sensor , */\ - { 0x4ae0, "dc_offset"}, /* switch offset control on/off, is decimator offset control, */\ - { 0x4af0, "tsense_hibias"}, /* bit to set the biasing in temp sensor to high , */\ - { 0x4b00, "adc13_iset"}, /* Micadc Setting of current consumption. Debug use only, */\ - { 0x4b14, "adc13_gain"}, /* Micadc gain setting (2-compl) , */\ - { 0x4b61, "adc13_slowdel"}, /* Micadc Delay setting for internal clock. Debug use only, */\ - { 0x4b83, "adc13_offset"}, /* Micadc ADC offset setting , */\ - { 0x4bc0, "adc13_bsoinv"}, /* Micadc bit stream output invert mode for test , */\ - { 0x4bd0, "adc13_resonator_enable"}, /* Micadc Give extra SNR with less stability. Debug use only, */\ - { 0x4be0, "testmicadc"}, /* Mux at input of MICADC for test purpose , */\ - { 0x4c0f, "abist_offset"}, /* offset control for ABIST testing , */\ - { 0x4d05, "windac"}, /* for testing direct control windac , */\ - { 0x4dc3, "pwm_dcc_cnt"}, /* control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0x4e04, "slopecur"}, /* for testing direct control slopecur , */\ - { 0x4e50, "ctrl_dem"}, /* dyn element matching control, rest of codes are optional, */\ - { 0x4ed0, "enbl_pwm_dcc"}, /* to enable direct control of pwm duty cycle , */\ - { 0x5007, "gain"}, /* Gain setting of the gain multiplier , */\ - { 0x5081, "sourceb"}, /* Set OUTB to , */\ - { 0x50a1, "sourcea"}, /* Set OUTA to , */\ - { 0x50c1, "sourcebst"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0x50e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0x5104, "pulselengthbst"}, /* pulse length setting test input for boost converter, */\ - { 0x5150, "bypasslatchbst"}, /* bypass_latch in boost converter , */\ - { 0x5160, "invertbst"}, /* invert pwmbst test signal , */\ - { 0x5174, "pulselength"}, /* pulse length setting test input for amplifier , */\ - { 0x51c0, "bypasslatch"}, /* bypass_latch in PWM source selection module , */\ - { 0x51d0, "invertb"}, /* invert pwmb test signal , */\ - { 0x51e0, "inverta"}, /* invert pwma test signal , */\ - { 0x51f0, "bypass_ctrlloop"}, /* bypass_ctrlloop bypasses the control loop of the amplifier, */\ - { 0x5210, "test_rdsona"}, /* tbd for rdson testing , */\ - { 0x5220, "test_rdsonb"}, /* tbd for rdson testing , */\ - { 0x5230, "test_rdsonbst"}, /* tbd for rdson testing , */\ - { 0x5240, "test_cvia"}, /* tbd for rdson testing , */\ - { 0x5250, "test_cvib"}, /* tbd for rdson testing , */\ - { 0x5260, "test_cvibst"}, /* tbd for rdson testing , */\ - { 0x5306, "digimuxa_sel"}, /* DigimuxA input selection control (see Digimux list for details), */\ - { 0x5376, "digimuxb_sel"}, /* DigimuxB input selection control (see Digimux list for details), */\ - { 0x5400, "hs_mode"}, /* hs_mode, high speed mode I2C bus , */\ - { 0x5412, "test_parametric_io"}, /* test_parametric_io for testing pads , */\ - { 0x5440, "enbl_ringo"}, /* enbl_ringo, for test purpose to check with ringo , */\ - { 0x5456, "digimuxc_sel"}, /* DigimuxC input selection control (see Digimux list for details), */\ - { 0x54c0, "dio_ehs"}, /* Slew control for DIO in output mode , */\ - { 0x54d0, "gainio_ehs"}, /* Slew control for GAINIO in output mode , */\ - { 0x550d, "enbl_amp"}, /* enbl_amp for testing to enable all analoge blocks in amplifier, */\ - { 0x5600, "use_direct_ctrls"}, /* use_direct_ctrls, to overrule several functions direct for testing, */\ - { 0x5610, "rst_datapath"}, /* rst_datapath, datapath reset , */\ - { 0x5620, "rst_cgu"}, /* rst_cgu, cgu reset , */\ - { 0x5637, "enbl_ref"}, /* for testing to enable all analoge blocks in references, */\ - { 0x56b0, "enbl_engage"}, /* Enable output stage amplifier , */\ - { 0x56c0, "use_direct_clk_ctrl"}, /* use_direct_clk_ctrl, to overrule several functions direct for testing, */\ - { 0x56d0, "use_direct_pll_ctrl"}, /* use_direct_pll_ctrl, to overrule several functions direct for testing, */\ - { 0x56e0, "use_direct_ctrls_2"}, /* use_direct_sourseamp_ctrls, to overrule several functions direct for testing, */\ - { 0x5707, "anamux"}, /* Anamux control , */\ - { 0x57c0, "ocptest"}, /* ctrl_ocptest, deactivates the over current protection in the power stages of the amplifier. The ocp flag signals stay active., */\ - { 0x57e0, "otptest"}, /* otptest, test mode otp amplifier , */\ - { 0x57f0, "reverse"}, /* 1: Normal mode, slope is controlled , */\ - { 0x5813, "pll_selr"}, /* pll_selr , */\ - { 0x5854, "pll_selp"}, /* pll_selp , */\ - { 0x58a5, "pll_seli"}, /* pll_seli , */\ - { 0x5950, "pll_mdec_msb"}, /* most significant bits of pll_mdec[16] , */\ - { 0x5960, "pll_ndec_msb"}, /* most significant bits of pll_ndec[9] , */\ - { 0x5970, "pll_frm"}, /* pll_frm , */\ - { 0x5980, "pll_directi"}, /* pll_directi , */\ - { 0x5990, "pll_directo"}, /* pll_directo , */\ - { 0x59a0, "enbl_pll"}, /* enbl_pll , */\ - { 0x59f0, "pll_bypass"}, /* pll_bypass , */\ - { 0x5a0f, "tsig_freq"}, /* tsig_freq, internal sinus test generator, frequency control, */\ - { 0x5b02, "tsig_freq_msb"}, /* select internal sinus test generator, frequency control msb bits, */\ - { 0x5b30, "inject_tsig"}, /* inject_tsig, control bit to switch to internal sinus test generator, */\ - { 0x5b44, "adc10_prog_sample"}, /* control ADC10 , */\ - { 0x5c0f, "pll_mdec"}, /* bits 15..0 of pll_mdec[16;0] , */\ - { 0x5d06, "pll_pdec"}, /* pll_pdec , */\ - { 0x5d78, "pll_ndec"}, /* bits 8..0 of pll_ndec[9;0] , */\ - { 0x6007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0x6185, "mtp_ecc_tcin"}, /* Mtp_ecc_tcin , */\ - { 0x6203, "mtp_man_address_in"}, /* address from I2C regs for writing one word single mtp, */\ - { 0x6260, "mtp_ecc_eeb"}, /* enable code bit generation (active low!) , */\ - { 0x6270, "mtp_ecc_ecb"}, /* enable correction signal (active low!) , */\ - { 0x6280, "man_copy_mtp_to_iic"}, /* start copying single word from mtp to i2cregs_mtp , */\ - { 0x6290, "man_copy_iic_to_mtp"}, /* start copying single word from i2cregs_mtp to mtp [Key 1 protected], */\ - { 0x62a0, "auto_copy_mtp_to_iic"}, /* start copying all the data from mtp to i2cregs_mtp, */\ - { 0x62b0, "auto_copy_iic_to_mtp"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ - { 0x62d2, "mtp_speed_mode"}, /* Speed mode , */\ - { 0x6340, "mtp_direct_enable"}, /* mtp_direct_enable (key1 protected) , */\ - { 0x6350, "mtp_direct_wr"}, /* mtp_direct_wr (key1 protected) , */\ - { 0x6360, "mtp_direct_rd"}, /* mtp_direct_rd (key1 protected) , */\ - { 0x6370, "mtp_direct_rst"}, /* mtp_direct_rst (key1 protected) , */\ - { 0x6380, "mtp_direct_ers"}, /* mtp_direct_ers (key1 protected) , */\ - { 0x6390, "mtp_direct_prg"}, /* mtp_direct_prg (key1 protected) , */\ - { 0x63a0, "mtp_direct_epp"}, /* mtp_direct_epp (key1 protected) , */\ - { 0x63b4, "mtp_direct_test"}, /* mtp_direct_test (key1 protected) , */\ - { 0x640f, "mtp_man_data_in"}, /* single word to be written to MTP (manual copy) , */\ - { 0x7000, "cf_rst_dsp"}, /* Reset CoolFlux DSP , */\ - { 0x7011, "cf_dmem"}, /* Target memory for access , */\ - { 0x7030, "cf_aif"}, /* Autoincrement-flag for memory-address , */\ - { 0x7040, "cf_int"}, /* Interrupt CoolFlux DSP , */\ - { 0x7087, "cf_req"}, /* request for access (8 channels) , */\ - { 0x710f, "cf_madd"}, /* memory-address to be accessed , */\ - { 0x720f, "cf_mema"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ - { 0x7307, "cf_err"}, /* Coolflux error flags , */\ - { 0x7387, "cf_ack"}, /* acknowledge of requests (8 channels) , */\ - { 0x8000, "calibration_onetime"}, /* Calibration schedule (key2 protected) , */\ - { 0x8010, "calibr_ron_done"}, /* (key2 protected) , */\ - { 0x8105, "calibr_vout_offset"}, /* calibr_vout_offset (DCDCoffset) 2's compliment (key1 protected), */\ - { 0x8163, "calibr_delta_gain"}, /* delta gain for vamp (alpha) 2's compliment (key1 protected), */\ - { 0x81a5, "calibr_offs_amp"}, /* offset for vamp (Ampoffset) 2's compliment (key1 protected), */\ - { 0x8207, "calibr_gain_cs"}, /* gain current sense (Imeasalpha) 2's compliment (key1 protected), */\ - { 0x8284, "calibr_temp_offset"}, /* temperature offset 2's compliment (key1 protected), */\ - { 0x82d2, "calibr_temp_gain"}, /* temperature gain 2's compliment (key1 protected) , */\ - { 0x830f, "calibr_ron"}, /* Ron resistance of coil (key1 protected) , */\ - { 0x8505, "type_bits_HW"}, /* Key1_Protected_MTP5 , */\ - { 0x8601, "type_bits_1_0_SW"}, /* MTP-control SW , */\ - { 0x8681, "type_bits_8_9_SW"}, /* MTP-control SW , */\ - { 0x870f, "type_bits2_SW"}, /* MTP-control SW2 , */\ - { 0x8806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0x8870, "htol_iic_addr_en"}, /* HTOL_I2C_Address_Enable , */\ - { 0x8881, "ctrl_ovp_response"}, /* OVP response control , */\ - { 0x88a0, "disable_ovp_alarm_state"}, /* OVP alarm state control , */\ - { 0x88b0, "enbl_stretch_ovp"}, /* OVP alram strech control , */\ - { 0x88c0, "cf_debug_mode"}, /* Coolflux debug mode , */\ - { 0x8a0f, "production_data1"}, /* (key1 protected) , */\ - { 0x8b0f, "production_data2"}, /* (key1 protected) , */\ - { 0x8c0f, "production_data3"}, /* (key1 protected) , */\ - { 0x8d0f, "production_data4"}, /* (key1 protected) , */\ - { 0x8e0f, "production_data5"}, /* (key1 protected) , */\ - { 0x8f0f, "production_data6"}, /* (key1 protected) , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa1_irq { - tfa1_irq_vdds = 0, - tfa1_irq_plls = 1, - tfa1_irq_ds = 2, - tfa1_irq_vds = 3, - tfa1_irq_uvds = 4, - tfa1_irq_cds = 5, - tfa1_irq_clks = 6, - tfa1_irq_clips = 7, - tfa1_irq_mtpb = 8, - tfa1_irq_clk = 9, - tfa1_irq_spks = 10, - tfa1_irq_acs = 11, - tfa1_irq_sws = 12, - tfa1_irq_wds = 13, - tfa1_irq_amps = 14, - tfa1_irq_arefs = 15, - tfa1_irq_ack = 32, - tfa1_irq_max = 33, - tfa1_irq_all = -1 /* all irqs */}; - -#define TFA1_IRQ_NAMETABLE static tfaIrqName_t Tfa1IrqNames[] = {\ - { 0, "VDDS"},\ - { 1, "PLLS"},\ - { 2, "DS"},\ - { 3, "VDS"},\ - { 4, "UVDS"},\ - { 5, "CDS"},\ - { 6, "CLKS"},\ - { 7, "CLIPS"},\ - { 8, "MTPB"},\ - { 9, "CLK"},\ - { 10, "SPKS"},\ - { 11, "ACS"},\ - { 12, "SWS"},\ - { 13, "WDS"},\ - { 14, "AMPS"},\ - { 15, "AREFS"},\ - { 16, "16"},\ - { 17, "17"},\ - { 18, "18"},\ - { 19, "19"},\ - { 20, "20"},\ - { 21, "21"},\ - { 22, "22"},\ - { 23, "23"},\ - { 24, "24"},\ - { 25, "25"},\ - { 26, "26"},\ - { 27, "27"},\ - { 28, "28"},\ - { 29, "29"},\ - { 30, "30"},\ - { 31, "31"},\ - { 32, "ACK"},\ - { 33, "33"},\ -}; diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa2_tfafieldnames_N1C.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa2_tfafieldnames_N1C.h deleted file mode 100644 index 8272eddd28d6..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa2_tfafieldnames_N1C.h +++ /dev/null @@ -1,1533 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: Tfa98xx_TfaFieldnames.h - * This file was generated automatically on 09/01/15 at 09:40:28. - * Source file: TFA9888_N1C_I2C_regmap_V1.xlsx - */ -#define TFA9888_I2CVERSION 18 -typedef enum Tfa2BfEnumList { - TFA2_BF_PWDN = 0x0000, /*!< Powerdown selection */ - TFA2_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ - TFA2_BF_CFE = 0x0020, /*!< Enable CoolFlux */ - TFA2_BF_AMPE = 0x0030, /*!< Activate Amplifier */ - TFA2_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ - TFA2_BF_SBSL = 0x0050, /*!< Coolflux configured */ - TFA2_BF_AMPC = 0x0060, /*!< CoolFlux controls amplifier */ - TFA2_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA2_BF_FSSSEL = 0x0091, /*!< Audio sample reference */ - TFA2_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ - TFA2_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ - TFA2_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ - TFA2_BF_MANSCONF = 0x0120, /*!< I2C configured */ - TFA2_BF_MANCOLD = 0x0130, /*!< Execute cold start */ - TFA2_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ - TFA2_BF_MANROBOD = 0x0150, /*!< Reaction on BOD */ - TFA2_BF_BODE = 0x0160, /*!< BOD Enable */ - TFA2_BF_BODHYS = 0x0170, /*!< BOD Hysteresis */ - TFA2_BF_BODFILT = 0x0181, /*!< BOD filter */ - TFA2_BF_BODTHLVL = 0x01a1, /*!< BOD threshold */ - TFA2_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ - TFA2_BF_RCVNS = 0x01e0, /*!< Noise shaper selection */ - TFA2_BF_MANWDE = 0x01f0, /*!< Watchdog manager reaction */ - TFA2_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ - TFA2_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA2_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ - TFA2_BF_BYPHVBF = 0x02b0, /*!< Bypass HVBAT filter */ - TFA2_BF_LDOBYP = 0x02c0, /*!< Receiver LDO bypass */ - TFA2_BF_REV = 0x030f, /*!< Revision info */ - TFA2_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ - TFA2_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ - TFA2_BF_SSLEFTE = 0x0500, /*!< Enable left channel */ - TFA2_BF_SSRIGHTE = 0x0510, /*!< Enable right channel */ - TFA2_BF_VSLEFTE = 0x0520, /*!< Voltage sense left */ - TFA2_BF_VSRIGHTE = 0x0530, /*!< Voltage sense right */ - TFA2_BF_CSLEFTE = 0x0540, /*!< Current sense left */ - TFA2_BF_CSRIGHTE = 0x0550, /*!< Current sense right */ - TFA2_BF_SSPDME = 0x0560, /*!< Sub-system PDM */ - TFA2_BF_STGAIN = 0x0d18, /*!< Side tone gain */ - TFA2_BF_PDMSMUTE = 0x0da0, /*!< Side tone soft mute */ - TFA2_BF_SWVSTEP = 0x0e06, /*!< Register for the host SW to record the current active vstep */ - TFA2_BF_VDDS = 0x1000, /*!< POR */ - TFA2_BF_PLLS = 0x1010, /*!< PLL lock */ - TFA2_BF_OTDS = 0x1020, /*!< OTP alarm */ - TFA2_BF_OVDS = 0x1030, /*!< OVP alarm */ - TFA2_BF_UVDS = 0x1040, /*!< UVP alarm */ - TFA2_BF_CLKS = 0x1050, /*!< Clocks stable */ - TFA2_BF_MTPB = 0x1060, /*!< MTP busy */ - TFA2_BF_NOCLK = 0x1070, /*!< Lost clock */ - TFA2_BF_SPKS = 0x1080, /*!< Speaker error */ - TFA2_BF_ACS = 0x1090, /*!< Cold Start */ - TFA2_BF_SWS = 0x10a0, /*!< Amplifier engage */ - TFA2_BF_WDS = 0x10b0, /*!< Watchdog */ - TFA2_BF_AMPS = 0x10c0, /*!< Amplifier enable */ - TFA2_BF_AREFS = 0x10d0, /*!< References enable */ - TFA2_BF_ADCCR = 0x10e0, /*!< Control ADC */ - TFA2_BF_BODNOK = 0x10f0, /*!< BOD */ - TFA2_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA2_BF_DCDCA = 0x1110, /*!< DCDC active */ - TFA2_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos */ - TFA2_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ - TFA2_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ - TFA2_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ - TFA2_BF_STMUTEB = 0x1170, /*!< side tone (un)mute busy */ - TFA2_BF_STMUTE = 0x1180, /*!< side tone mute state */ - TFA2_BF_TDMLUTER = 0x1190, /*!< TDM LUT error */ - TFA2_BF_TDMSTAT = 0x11a2, /*!< TDM status bits */ - TFA2_BF_TDMERR = 0x11d0, /*!< TDM error */ - TFA2_BF_HAPTIC = 0x11e0, /*!< Status haptic driver */ - TFA2_BF_OCPOAPL = 0x1200, /*!< OCPOK pmos A left */ - TFA2_BF_OCPOANL = 0x1210, /*!< OCPOK nmos A left */ - TFA2_BF_OCPOBPL = 0x1220, /*!< OCPOK pmos B left */ - TFA2_BF_OCPOBNL = 0x1230, /*!< OCPOK nmos B left */ - TFA2_BF_CLIPAHL = 0x1240, /*!< Clipping A left to Vddp */ - TFA2_BF_CLIPALL = 0x1250, /*!< Clipping A left to gnd */ - TFA2_BF_CLIPBHL = 0x1260, /*!< Clipping B left to Vddp */ - TFA2_BF_CLIPBLL = 0x1270, /*!< Clipping B left to gnd */ - TFA2_BF_OCPOAPRC = 0x1280, /*!< OCPOK pmos A RCV */ - TFA2_BF_OCPOANRC = 0x1290, /*!< OCPOK nmos A RCV */ - TFA2_BF_OCPOBPRC = 0x12a0, /*!< OCPOK pmos B RCV */ - TFA2_BF_OCPOBNRC = 0x12b0, /*!< OCPOK nmos B RCV */ - TFA2_BF_RCVLDOR = 0x12c0, /*!< RCV LDO regulates */ - TFA2_BF_RCVLDOBR = 0x12d0, /*!< Receiver LDO ready */ - TFA2_BF_OCDSL = 0x12e0, /*!< OCP left amplifier */ - TFA2_BF_CLIPSL = 0x12f0, /*!< Amplifier left clipping */ - TFA2_BF_OCPOAPR = 0x1300, /*!< OCPOK pmos A right */ - TFA2_BF_OCPOANR = 0x1310, /*!< OCPOK nmos A right */ - TFA2_BF_OCPOBPR = 0x1320, /*!< OCPOK pmos B right */ - TFA2_BF_OCPOBNR = 0x1330, /*!< OCPOK nmos B right */ - TFA2_BF_CLIPAHR = 0x1340, /*!< Clipping A right to Vddp */ - TFA2_BF_CLIPALR = 0x1350, /*!< Clipping A right to gnd */ - TFA2_BF_CLIPBHR = 0x1360, /*!< Clipping B left to Vddp */ - TFA2_BF_CLIPBLR = 0x1370, /*!< Clipping B right to gnd */ - TFA2_BF_OCDSR = 0x1380, /*!< OCP right amplifier */ - TFA2_BF_CLIPSR = 0x1390, /*!< Amplifier right clipping */ - TFA2_BF_OCPOKMC = 0x13a0, /*!< OCPOK MICVDD */ - TFA2_BF_MANALARM = 0x13b0, /*!< Alarm state */ - TFA2_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ - TFA2_BF_MANWAIT2 = 0x13d0, /*!< Wait CF config */ - TFA2_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ - TFA2_BF_MANOPER = 0x13f0, /*!< Operating state */ - TFA2_BF_SPKSL = 0x1400, /*!< Left speaker status */ - TFA2_BF_SPKSR = 0x1410, /*!< Right speaker status */ - TFA2_BF_CLKOOR = 0x1420, /*!< External clock status */ - TFA2_BF_MANSTATE = 0x1433, /*!< Device manager status */ - TFA2_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA2_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA2_BF_TDMUC = 0x2003, /*!< Usecase setting */ - TFA2_BF_TDME = 0x2040, /*!< Enable interface */ - TFA2_BF_TDMMODE = 0x2050, /*!< Slave/master */ - TFA2_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ - TFA2_BF_TDMFSLN = 0x2073, /*!< FS length (master mode only) */ - TFA2_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ - TFA2_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ - TFA2_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ - TFA2_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ - TFA2_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ - TFA2_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ - TFA2_BF_TDMADJ = 0x21f0, /*!< data adjustment */ - TFA2_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ - TFA2_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ - TFA2_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ - TFA2_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots GAINIO */ - TFA2_BF_TDMTXUS1 = 0x22b1, /*!< Format unused slots DIO1 */ - TFA2_BF_TDMTXUS2 = 0x22d1, /*!< Format unused slots DIO2 */ - TFA2_BF_TDMLE = 0x2310, /*!< Control audio left */ - TFA2_BF_TDMRE = 0x2320, /*!< Control audio right */ - TFA2_BF_TDMVSRE = 0x2340, /*!< Control voltage sense right */ - TFA2_BF_TDMCSRE = 0x2350, /*!< Control current sense right */ - TFA2_BF_TDMVSLE = 0x2360, /*!< Voltage sense left control */ - TFA2_BF_TDMCSLE = 0x2370, /*!< Current sense left control */ - TFA2_BF_TDMCFRE = 0x2380, /*!< DSP out right control */ - TFA2_BF_TDMCFLE = 0x2390, /*!< DSP out left control */ - TFA2_BF_TDMCF3E = 0x23a0, /*!< AEC ref left control */ - TFA2_BF_TDMCF4E = 0x23b0, /*!< AEC ref right control */ - TFA2_BF_TDMPD1E = 0x23c0, /*!< PDM 1 control */ - TFA2_BF_TDMPD2E = 0x23d0, /*!< PDM 2 control */ - TFA2_BF_TDMLIO = 0x2421, /*!< IO audio left */ - TFA2_BF_TDMRIO = 0x2441, /*!< IO audio right */ - TFA2_BF_TDMVSRIO = 0x2481, /*!< IO voltage sense right */ - TFA2_BF_TDMCSRIO = 0x24a1, /*!< IO current sense right */ - TFA2_BF_TDMVSLIO = 0x24c1, /*!< IO voltage sense left */ - TFA2_BF_TDMCSLIO = 0x24e1, /*!< IO current sense left */ - TFA2_BF_TDMCFRIO = 0x2501, /*!< IO dspout right */ - TFA2_BF_TDMCFLIO = 0x2521, /*!< IO dspout left */ - TFA2_BF_TDMCF3IO = 0x2541, /*!< IO AEC ref left control */ - TFA2_BF_TDMCF4IO = 0x2561, /*!< IO AEC ref right control */ - TFA2_BF_TDMPD1IO = 0x2581, /*!< IO pdm1 */ - TFA2_BF_TDMPD2IO = 0x25a1, /*!< IO pdm2 */ - TFA2_BF_TDMLS = 0x2643, /*!< Position audio left */ - TFA2_BF_TDMRS = 0x2683, /*!< Position audio right */ - TFA2_BF_TDMVSRS = 0x2703, /*!< Position voltage sense right */ - TFA2_BF_TDMCSRS = 0x2743, /*!< Position current sense right */ - TFA2_BF_TDMVSLS = 0x2783, /*!< Position voltage sense left */ - TFA2_BF_TDMCSLS = 0x27c3, /*!< Position current sense left */ - TFA2_BF_TDMCFRS = 0x2803, /*!< Position dspout right */ - TFA2_BF_TDMCFLS = 0x2843, /*!< Position dspout left */ - TFA2_BF_TDMCF3S = 0x2883, /*!< Position AEC ref left control */ - TFA2_BF_TDMCF4S = 0x28c3, /*!< Position AEC ref right control */ - TFA2_BF_TDMPD1S = 0x2903, /*!< Position pdm1 */ - TFA2_BF_TDMPD2S = 0x2943, /*!< Position pdm2 */ - TFA2_BF_PDMSM = 0x3100, /*!< PDM control */ - TFA2_BF_PDMSTSEL = 0x3111, /*!< Side tone input */ - TFA2_BF_PDMLSEL = 0x3130, /*!< PDM data selection for left channel during PDM direct mode */ - TFA2_BF_PDMRSEL = 0x3140, /*!< PDM data selection for right channel during PDM direct mode */ - TFA2_BF_MICVDDE = 0x3150, /*!< Enable MICVDD */ - TFA2_BF_PDMCLRAT = 0x3201, /*!< PDM BCK/Fs ratio */ - TFA2_BF_PDMGAIN = 0x3223, /*!< PDM gain */ - TFA2_BF_PDMOSEL = 0x3263, /*!< PDM output selection - RE/FE data combination */ - TFA2_BF_SELCFHAPD = 0x32a0, /*!< Select the source for haptic data output (not for customer) */ - TFA2_BF_HAPTIME = 0x3307, /*!< Duration (ms) */ - TFA2_BF_HAPLEVEL = 0x3387, /*!< DC value (FFS) */ - TFA2_BF_GPIODIN = 0x3403, /*!< Receiving value */ - TFA2_BF_GPIOCTRL = 0x3500, /*!< GPIO master control over GPIO1/2 ports (not for customer) */ - TFA2_BF_GPIOCONF = 0x3513, /*!< Configuration */ - TFA2_BF_GPIODOUT = 0x3553, /*!< Transmitting value */ - TFA2_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA2_BF_ISTPLLS = 0x4010, /*!< Status PLL lock */ - TFA2_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA2_BF_ISTOVDS = 0x4030, /*!< Status OVP alarm */ - TFA2_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA2_BF_ISTCLKS = 0x4050, /*!< Status clocks stable */ - TFA2_BF_ISTMTPB = 0x4060, /*!< Status MTP busy */ - TFA2_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA2_BF_ISTSPKS = 0x4080, /*!< Status speaker error */ - TFA2_BF_ISTACS = 0x4090, /*!< Status cold start */ - TFA2_BF_ISTSWS = 0x40a0, /*!< Status amplifier engage */ - TFA2_BF_ISTWDS = 0x40b0, /*!< Status watchdog */ - TFA2_BF_ISTAMPS = 0x40c0, /*!< Status amplifier enable */ - TFA2_BF_ISTAREFS = 0x40d0, /*!< Status Ref enable */ - TFA2_BF_ISTADCCR = 0x40e0, /*!< Status Control ADC */ - TFA2_BF_ISTBODNOK = 0x40f0, /*!< Status BOD */ - TFA2_BF_ISTBSTCU = 0x4100, /*!< Status DCDC current limiting */ - TFA2_BF_ISTBSTHI = 0x4110, /*!< Status DCDC active */ - TFA2_BF_ISTBSTOC = 0x4120, /*!< Status DCDC OCP */ - TFA2_BF_ISTBSTPKCUR = 0x4130, /*!< Status bst peakcur */ - TFA2_BF_ISTBSTVC = 0x4140, /*!< Status DCDC level 1x */ - TFA2_BF_ISTBST86 = 0x4150, /*!< Status DCDC level 1.14x */ - TFA2_BF_ISTBST93 = 0x4160, /*!< Status DCDC level 1.07x */ - TFA2_BF_ISTRCVLD = 0x4170, /*!< Status rcvldop ready */ - TFA2_BF_ISTOCPL = 0x4180, /*!< Status ocp alarm left */ - TFA2_BF_ISTOCPR = 0x4190, /*!< Status ocp alarm right */ - TFA2_BF_ISTMWSRC = 0x41a0, /*!< Status Waits HW I2C settings */ - TFA2_BF_ISTMWCFC = 0x41b0, /*!< Status waits CF config */ - TFA2_BF_ISTMWSMU = 0x41c0, /*!< Status Audio mute sequence */ - TFA2_BF_ISTCFMER = 0x41d0, /*!< Status cfma error */ - TFA2_BF_ISTCFMAC = 0x41e0, /*!< Status cfma ack */ - TFA2_BF_ISTCLKOOR = 0x41f0, /*!< Status flag_clk_out_of_range */ - TFA2_BF_ISTTDMER = 0x4200, /*!< Status tdm error */ - TFA2_BF_ISTCLPL = 0x4210, /*!< Status clip left */ - TFA2_BF_ISTCLPR = 0x4220, /*!< Status clip right */ - TFA2_BF_ISTOCPM = 0x4230, /*!< Status mic ocpok */ - TFA2_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA2_BF_ICLPLLS = 0x4410, /*!< Clear PLL lock */ - TFA2_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA2_BF_ICLOVDS = 0x4430, /*!< Clear OVP alarm */ - TFA2_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA2_BF_ICLCLKS = 0x4450, /*!< Clear clocks stable */ - TFA2_BF_ICLMTPB = 0x4460, /*!< Clear mtp busy */ - TFA2_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA2_BF_ICLSPKS = 0x4480, /*!< Clear speaker error */ - TFA2_BF_ICLACS = 0x4490, /*!< Clear cold started */ - TFA2_BF_ICLSWS = 0x44a0, /*!< Clear amplifier engage */ - TFA2_BF_ICLWDS = 0x44b0, /*!< Clear watchdog */ - TFA2_BF_ICLAMPS = 0x44c0, /*!< Clear enbl amp */ - TFA2_BF_ICLAREFS = 0x44d0, /*!< Clear ref enable */ - TFA2_BF_ICLADCCR = 0x44e0, /*!< Clear control ADC */ - TFA2_BF_ICLBODNOK = 0x44f0, /*!< Clear BOD */ - TFA2_BF_ICLBSTCU = 0x4500, /*!< Clear DCDC current limiting */ - TFA2_BF_ICLBSTHI = 0x4510, /*!< Clear DCDC active */ - TFA2_BF_ICLBSTOC = 0x4520, /*!< Clear DCDC OCP */ - TFA2_BF_ICLBSTPC = 0x4530, /*!< Clear bst peakcur */ - TFA2_BF_ICLBSTVC = 0x4540, /*!< Clear DCDC level 1x */ - TFA2_BF_ICLBST86 = 0x4550, /*!< Clear DCDC level 1.14x */ - TFA2_BF_ICLBST93 = 0x4560, /*!< Clear DCDC level 1.07x */ - TFA2_BF_ICLRCVLD = 0x4570, /*!< Clear rcvldop ready */ - TFA2_BF_ICLOCPL = 0x4580, /*!< Clear ocp alarm left */ - TFA2_BF_ICLOCPR = 0x4590, /*!< Clear ocp alarm right */ - TFA2_BF_ICLMWSRC = 0x45a0, /*!< Clear wait HW I2C settings */ - TFA2_BF_ICLMWCFC = 0x45b0, /*!< Clear wait cf config */ - TFA2_BF_ICLMWSMU = 0x45c0, /*!< Clear audio mute sequence */ - TFA2_BF_ICLCFMER = 0x45d0, /*!< Clear cfma err */ - TFA2_BF_ICLCFMAC = 0x45e0, /*!< Clear cfma ack */ - TFA2_BF_ICLCLKOOR = 0x45f0, /*!< Clear flag_clk_out_of_range */ - TFA2_BF_ICLTDMER = 0x4600, /*!< Clear tdm error */ - TFA2_BF_ICLCLPL = 0x4610, /*!< Clear clip left */ - TFA2_BF_ICLCLPR = 0x4620, /*!< Clear clip right */ - TFA2_BF_ICLOCPM = 0x4630, /*!< Clear mic ocpok */ - TFA2_BF_IEVDDS = 0x4800, /*!< Enable por */ - TFA2_BF_IEPLLS = 0x4810, /*!< Enable pll lock */ - TFA2_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA2_BF_IEOVDS = 0x4830, /*!< Enable OVP alarm */ - TFA2_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA2_BF_IECLKS = 0x4850, /*!< Enable clocks stable */ - TFA2_BF_IEMTPB = 0x4860, /*!< Enable mtp busy */ - TFA2_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA2_BF_IESPKS = 0x4880, /*!< Enable speaker error */ - TFA2_BF_IEACS = 0x4890, /*!< Enable cold started */ - TFA2_BF_IESWS = 0x48a0, /*!< Enable amplifier engage */ - TFA2_BF_IEWDS = 0x48b0, /*!< Enable watchdog */ - TFA2_BF_IEAMPS = 0x48c0, /*!< Enable enbl amp */ - TFA2_BF_IEAREFS = 0x48d0, /*!< Enable ref enable */ - TFA2_BF_IEADCCR = 0x48e0, /*!< Enable Control ADC */ - TFA2_BF_IEBODNOK = 0x48f0, /*!< Enable BOD */ - TFA2_BF_IEBSTCU = 0x4900, /*!< Enable DCDC current limiting */ - TFA2_BF_IEBSTHI = 0x4910, /*!< Enable DCDC active */ - TFA2_BF_IEBSTOC = 0x4920, /*!< Enable DCDC OCP */ - TFA2_BF_IEBSTPC = 0x4930, /*!< Enable bst peakcur */ - TFA2_BF_IEBSTVC = 0x4940, /*!< Enable DCDC level 1x */ - TFA2_BF_IEBST86 = 0x4950, /*!< Enable DCDC level 1.14x */ - TFA2_BF_IEBST93 = 0x4960, /*!< Enable DCDC level 1.07x */ - TFA2_BF_IERCVLD = 0x4970, /*!< Enable rcvldop ready */ - TFA2_BF_IEOCPL = 0x4980, /*!< Enable ocp alarm left */ - TFA2_BF_IEOCPR = 0x4990, /*!< Enable ocp alarm right */ - TFA2_BF_IEMWSRC = 0x49a0, /*!< Enable waits HW I2C settings */ - TFA2_BF_IEMWCFC = 0x49b0, /*!< Enable man wait cf config */ - TFA2_BF_IEMWSMU = 0x49c0, /*!< Enable man Audio mute sequence */ - TFA2_BF_IECFMER = 0x49d0, /*!< Enable cfma err */ - TFA2_BF_IECFMAC = 0x49e0, /*!< Enable cfma ack */ - TFA2_BF_IECLKOOR = 0x49f0, /*!< Enable flag_clk_out_of_range */ - TFA2_BF_IETDMER = 0x4a00, /*!< Enable tdm error */ - TFA2_BF_IECLPL = 0x4a10, /*!< Enable clip left */ - TFA2_BF_IECLPR = 0x4a20, /*!< Enable clip right */ - TFA2_BF_IEOCPM1 = 0x4a30, /*!< Enable mic ocpok */ - TFA2_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ - TFA2_BF_IPOPLLS = 0x4c10, /*!< Polarity pll lock */ - TFA2_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA2_BF_IPOOVDS = 0x4c30, /*!< Polarity OVP alarm */ - TFA2_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA2_BF_IPOCLKS = 0x4c50, /*!< Polarity clocks stable */ - TFA2_BF_IPOMTPB = 0x4c60, /*!< Polarity mtp busy */ - TFA2_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA2_BF_IPOSPKS = 0x4c80, /*!< Polarity speaker error */ - TFA2_BF_IPOACS = 0x4c90, /*!< Polarity cold started */ - TFA2_BF_IPOSWS = 0x4ca0, /*!< Polarity amplifier engage */ - TFA2_BF_IPOWDS = 0x4cb0, /*!< Polarity watchdog */ - TFA2_BF_IPOAMPS = 0x4cc0, /*!< Polarity enbl amp */ - TFA2_BF_IPOAREFS = 0x4cd0, /*!< Polarity ref enable */ - TFA2_BF_IPOADCCR = 0x4ce0, /*!< Polarity Control ADC */ - TFA2_BF_IPOBODNOK = 0x4cf0, /*!< Polarity BOD */ - TFA2_BF_IPOBSTCU = 0x4d00, /*!< Polarity DCDC current limiting */ - TFA2_BF_IPOBSTHI = 0x4d10, /*!< Polarity DCDC active */ - TFA2_BF_IPOBSTOC = 0x4d20, /*!< Polarity DCDC OCP */ - TFA2_BF_IPOBSTPC = 0x4d30, /*!< Polarity bst peakcur */ - TFA2_BF_IPOBSTVC = 0x4d40, /*!< Polarity DCDC level 1x */ - TFA2_BF_IPOBST86 = 0x4d50, /*!< Polarity DCDC level 1.14x */ - TFA2_BF_IPOBST93 = 0x4d60, /*!< Polarity DCDC level 1.07x */ - TFA2_BF_IPORCVLD = 0x4d70, /*!< Polarity rcvldop ready */ - TFA2_BF_IPOOCPL = 0x4d80, /*!< Polarity ocp alarm left */ - TFA2_BF_IPOOCPR = 0x4d90, /*!< Polarity ocp alarm right */ - TFA2_BF_IPOMWSRC = 0x4da0, /*!< Polarity waits HW I2C settings */ - TFA2_BF_IPOMWCFC = 0x4db0, /*!< Polarity man wait cf config */ - TFA2_BF_IPOMWSMU = 0x4dc0, /*!< Polarity man audio mute sequence */ - TFA2_BF_IPOCFMER = 0x4dd0, /*!< Polarity cfma err */ - TFA2_BF_IPOCFMAC = 0x4de0, /*!< Polarity cfma ack */ - TFA2_BF_IPCLKOOR = 0x4df0, /*!< Polarity flag_clk_out_of_range */ - TFA2_BF_IPOTDMER = 0x4e00, /*!< Polarity tdm error */ - TFA2_BF_IPOCLPL = 0x4e10, /*!< Polarity clip left */ - TFA2_BF_IPOCLPR = 0x4e20, /*!< Polarity clip right */ - TFA2_BF_IPOOCPM = 0x4e30, /*!< Polarity mic ocpok */ - TFA2_BF_BSSCR = 0x5001, /*!< Battery protection attack Time */ - TFA2_BF_BSST = 0x5023, /*!< Battery protection threshold voltage level */ - TFA2_BF_BSSRL = 0x5061, /*!< Battery protection maximum reduction */ - TFA2_BF_BSSRR = 0x5082, /*!< Battery protection release time */ - TFA2_BF_BSSHY = 0x50b1, /*!< Battery protection hysteresis */ - TFA2_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA2_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ - TFA2_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ - TFA2_BF_INTSMUTE = 0x5110, /*!< Soft mute HW */ - TFA2_BF_CFSML = 0x5120, /*!< Soft mute FW left */ - TFA2_BF_CFSMR = 0x5130, /*!< Soft mute FW right */ - TFA2_BF_HPFBYPL = 0x5140, /*!< Bypass HPF left */ - TFA2_BF_HPFBYPR = 0x5150, /*!< Bypass HPF right */ - TFA2_BF_DPSAL = 0x5160, /*!< Enable DPSA left */ - TFA2_BF_DPSAR = 0x5170, /*!< Enable DPSA right */ - TFA2_BF_VOL = 0x5187, /*!< FW volume control for primary audio channel */ - TFA2_BF_HNDSFRCV = 0x5200, /*!< Selection receiver */ - TFA2_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ - TFA2_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ - TFA2_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ - TFA2_BF_SLOPESET = 0x52e1, /*!< Set slope */ - TFA2_BF_VOLSEC = 0x5a07, /*!< FW volume control for secondary audio channel */ - TFA2_BF_SWPROFIL = 0x5a87, /*!< Software profile data */ - TFA2_BF_DCVO = 0x7002, /*!< Boost voltage */ - TFA2_BF_DCMCC = 0x7033, /*!< Max coil current */ - TFA2_BF_DCCV = 0x7071, /*!< Coil Value */ - TFA2_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ - TFA2_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ - TFA2_BF_DCSYNCP = 0x70b2, /*!< DCDC synchronization off + 7 positions */ - TFA2_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ - TFA2_BF_RST = 0x9000, /*!< Reset */ - TFA2_BF_DMEM = 0x9011, /*!< Target memory */ - TFA2_BF_AIF = 0x9030, /*!< Auto increment */ - TFA2_BF_CFINT = 0x9040, /*!< Interrupt - auto clear */ - TFA2_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ - TFA2_BF_REQ = 0x9087, /*!< request for access (8 channels) */ - TFA2_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ - TFA2_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ - TFA2_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ - TFA2_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ - TFA2_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ - TFA2_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ - TFA2_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ - TFA2_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ - TFA2_BF_MADD = 0x910f, /*!< Memory address */ - TFA2_BF_MEMA = 0x920f, /*!< Activate memory access */ - TFA2_BF_ERR = 0x9307, /*!< Error flags */ - TFA2_BF_ACK = 0x9387, /*!< Acknowledge of requests */ - TFA2_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ - TFA2_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ - TFA2_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ - TFA2_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ - TFA2_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ - TFA2_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ - TFA2_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ - TFA2_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ - TFA2_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ - TFA2_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA2_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA2_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ - TFA2_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA2_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA2_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA2_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA2_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA2_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA2_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA2_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA2_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA2_BF_R25CL = 0xf40f, /*!< Ron resistance of left channel speaker coil */ - TFA2_BF_R25CR = 0xf50f, /*!< Ron resistance of right channel speaker coil */ -} Tfa2BfEnumList_t; -#define TFA2_NAMETABLE static tfaBfName_t Tfa2DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown selection , */\ - { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ - { 0x20, "CFE"}, /* Enable CoolFlux , */\ - { 0x30, "AMPE"}, /* Activate Amplifier , */\ - { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ - { 0x50, "SBSL"}, /* Coolflux configured , */\ - { 0x60, "AMPC"}, /* CoolFlux controls amplifier , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0x91, "FSSSEL"}, /* Audio sample reference , */\ - { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xc0, "TSTOCP"}, /* OCP testing control , */\ - { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ - { 0x120, "MANSCONF"}, /* I2C configured , */\ - { 0x130, "MANCOLD"}, /* Execute cold start , */\ - { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ - { 0x150, "MANROBOD"}, /* Reaction on BOD , */\ - { 0x160, "BODE"}, /* BOD Enable , */\ - { 0x170, "BODHYS"}, /* BOD Hysteresis , */\ - { 0x181, "BODFILT"}, /* BOD filter , */\ - { 0x1a1, "BODTHLVL"}, /* BOD threshold , */\ - { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1e0, "RCVNS"}, /* Noise shaper selection , */\ - { 0x1f0, "MANWDE"}, /* Watchdog manager reaction , */\ - { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ - { 0x2b0, "BYPHVBF"}, /* Bypass HVBAT filter , */\ - { 0x2c0, "LDOBYP"}, /* Receiver LDO bypass , */\ - { 0x30f, "REV"}, /* Revision info , */\ - { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ - { 0x500, "SSLEFTE"}, /* Enable left channel , */\ - { 0x510, "SSRIGHTE"}, /* Enable right channel , */\ - { 0x520, "VSLEFTE"}, /* Voltage sense left , */\ - { 0x530, "VSRIGHTE"}, /* Voltage sense right , */\ - { 0x540, "CSLEFTE"}, /* Current sense left , */\ - { 0x550, "CSRIGHTE"}, /* Current sense right , */\ - { 0x560, "SSPDME"}, /* Sub-system PDM , */\ - { 0xd18, "STGAIN"}, /* Side tone gain , */\ - { 0xda0, "PDMSMUTE"}, /* Side tone soft mute , */\ - { 0xe06, "SWVSTEP"}, /* Register for the host SW to record the current active vstep, */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "PLLS"}, /* PLL lock , */\ - { 0x1020, "OTDS"}, /* OTP alarm , */\ - { 0x1030, "OVDS"}, /* OVP alarm , */\ - { 0x1040, "UVDS"}, /* UVP alarm , */\ - { 0x1050, "CLKS"}, /* Clocks stable , */\ - { 0x1060, "MTPB"}, /* MTP busy , */\ - { 0x1070, "NOCLK"}, /* Lost clock , */\ - { 0x1080, "SPKS"}, /* Speaker error , */\ - { 0x1090, "ACS"}, /* Cold Start , */\ - { 0x10a0, "SWS"}, /* Amplifier engage , */\ - { 0x10b0, "WDS"}, /* Watchdog , */\ - { 0x10c0, "AMPS"}, /* Amplifier enable , */\ - { 0x10d0, "AREFS"}, /* References enable , */\ - { 0x10e0, "ADCCR"}, /* Control ADC , */\ - { 0x10f0, "BODNOK"}, /* BOD , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active , */\ - { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos , */\ - { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1170, "STMUTEB"}, /* side tone (un)mute busy , */\ - { 0x1180, "STMUTE"}, /* side tone mute state , */\ - { 0x1190, "TDMLUTER"}, /* TDM LUT error , */\ - { 0x11a2, "TDMSTAT"}, /* TDM status bits , */\ - { 0x11d0, "TDMERR"}, /* TDM error , */\ - { 0x11e0, "HAPTIC"}, /* Status haptic driver , */\ - { 0x1200, "OCPOAPL"}, /* OCPOK pmos A left , */\ - { 0x1210, "OCPOANL"}, /* OCPOK nmos A left , */\ - { 0x1220, "OCPOBPL"}, /* OCPOK pmos B left , */\ - { 0x1230, "OCPOBNL"}, /* OCPOK nmos B left , */\ - { 0x1240, "CLIPAHL"}, /* Clipping A left to Vddp , */\ - { 0x1250, "CLIPALL"}, /* Clipping A left to gnd , */\ - { 0x1260, "CLIPBHL"}, /* Clipping B left to Vddp , */\ - { 0x1270, "CLIPBLL"}, /* Clipping B left to gnd , */\ - { 0x1280, "OCPOAPRC"}, /* OCPOK pmos A RCV , */\ - { 0x1290, "OCPOANRC"}, /* OCPOK nmos A RCV , */\ - { 0x12a0, "OCPOBPRC"}, /* OCPOK pmos B RCV , */\ - { 0x12b0, "OCPOBNRC"}, /* OCPOK nmos B RCV , */\ - { 0x12c0, "RCVLDOR"}, /* RCV LDO regulates , */\ - { 0x12d0, "RCVLDOBR"}, /* Receiver LDO ready , */\ - { 0x12e0, "OCDSL"}, /* OCP left amplifier , */\ - { 0x12f0, "CLIPSL"}, /* Amplifier left clipping , */\ - { 0x1300, "OCPOAPR"}, /* OCPOK pmos A right , */\ - { 0x1310, "OCPOANR"}, /* OCPOK nmos A right , */\ - { 0x1320, "OCPOBPR"}, /* OCPOK pmos B right , */\ - { 0x1330, "OCPOBNR"}, /* OCPOK nmos B right , */\ - { 0x1340, "CLIPAHR"}, /* Clipping A right to Vddp , */\ - { 0x1350, "CLIPALR"}, /* Clipping A right to gnd , */\ - { 0x1360, "CLIPBHR"}, /* Clipping B left to Vddp , */\ - { 0x1370, "CLIPBLR"}, /* Clipping B right to gnd , */\ - { 0x1380, "OCDSR"}, /* OCP right amplifier , */\ - { 0x1390, "CLIPSR"}, /* Amplifier right clipping , */\ - { 0x13a0, "OCPOKMC"}, /* OCPOK MICVDD , */\ - { 0x13b0, "MANALARM"}, /* Alarm state , */\ - { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ - { 0x13d0, "MANWAIT2"}, /* Wait CF config , */\ - { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x13f0, "MANOPER"}, /* Operating state , */\ - { 0x1400, "SPKSL"}, /* Left speaker status , */\ - { 0x1410, "SPKSR"}, /* Right speaker status , */\ - { 0x1420, "CLKOOR"}, /* External clock status , */\ - { 0x1433, "MANSTATE"}, /* Device manager status , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x2003, "TDMUC"}, /* Usecase setting , */\ - { 0x2040, "TDME"}, /* Enable interface , */\ - { 0x2050, "TDMMODE"}, /* Slave/master , */\ - { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2073, "TDMFSLN"}, /* FS length (master mode only) , */\ - { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ - { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ - { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ - { 0x21f0, "TDMADJ"}, /* data adjustment , */\ - { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x2291, "TDMTXUS0"}, /* Format unused slots GAINIO , */\ - { 0x22b1, "TDMTXUS1"}, /* Format unused slots DIO1 , */\ - { 0x22d1, "TDMTXUS2"}, /* Format unused slots DIO2 , */\ - { 0x2310, "TDMLE"}, /* Control audio left , */\ - { 0x2320, "TDMRE"}, /* Control audio right , */\ - { 0x2340, "TDMVSRE"}, /* Control voltage sense right , */\ - { 0x2350, "TDMCSRE"}, /* Control current sense right , */\ - { 0x2360, "TDMVSLE"}, /* Voltage sense left control , */\ - { 0x2370, "TDMCSLE"}, /* Current sense left control , */\ - { 0x2380, "TDMCFRE"}, /* DSP out right control , */\ - { 0x2390, "TDMCFLE"}, /* DSP out left control , */\ - { 0x23a0, "TDMCF3E"}, /* AEC ref left control , */\ - { 0x23b0, "TDMCF4E"}, /* AEC ref right control , */\ - { 0x23c0, "TDMPD1E"}, /* PDM 1 control , */\ - { 0x23d0, "TDMPD2E"}, /* PDM 2 control , */\ - { 0x2421, "TDMLIO"}, /* IO audio left , */\ - { 0x2441, "TDMRIO"}, /* IO audio right , */\ - { 0x2481, "TDMVSRIO"}, /* IO voltage sense right , */\ - { 0x24a1, "TDMCSRIO"}, /* IO current sense right , */\ - { 0x24c1, "TDMVSLIO"}, /* IO voltage sense left , */\ - { 0x24e1, "TDMCSLIO"}, /* IO current sense left , */\ - { 0x2501, "TDMCFRIO"}, /* IO dspout right , */\ - { 0x2521, "TDMCFLIO"}, /* IO dspout left , */\ - { 0x2541, "TDMCF3IO"}, /* IO AEC ref left control , */\ - { 0x2561, "TDMCF4IO"}, /* IO AEC ref right control , */\ - { 0x2581, "TDMPD1IO"}, /* IO pdm1 , */\ - { 0x25a1, "TDMPD2IO"}, /* IO pdm2 , */\ - { 0x2643, "TDMLS"}, /* Position audio left , */\ - { 0x2683, "TDMRS"}, /* Position audio right , */\ - { 0x2703, "TDMVSRS"}, /* Position voltage sense right , */\ - { 0x2743, "TDMCSRS"}, /* Position current sense right , */\ - { 0x2783, "TDMVSLS"}, /* Position voltage sense left , */\ - { 0x27c3, "TDMCSLS"}, /* Position current sense left , */\ - { 0x2803, "TDMCFRS"}, /* Position dspout right , */\ - { 0x2843, "TDMCFLS"}, /* Position dspout left , */\ - { 0x2883, "TDMCF3S"}, /* Position AEC ref left control , */\ - { 0x28c3, "TDMCF4S"}, /* Position AEC ref right control , */\ - { 0x2903, "TDMPD1S"}, /* Position pdm1 , */\ - { 0x2943, "TDMPD2S"}, /* Position pdm2 , */\ - { 0x3100, "PDMSM"}, /* PDM control , */\ - { 0x3111, "PDMSTSEL"}, /* Side tone input , */\ - { 0x3130, "PDMLSEL"}, /* PDM data selection for left channel during PDM direct mode, */\ - { 0x3140, "PDMRSEL"}, /* PDM data selection for right channel during PDM direct mode, */\ - { 0x3150, "MICVDDE"}, /* Enable MICVDD , */\ - { 0x3201, "PDMCLRAT"}, /* PDM BCK/Fs ratio , */\ - { 0x3223, "PDMGAIN"}, /* PDM gain , */\ - { 0x3263, "PDMOSEL"}, /* PDM output selection - RE/FE data combination , */\ - { 0x32a0, "SELCFHAPD"}, /* Select the source for haptic data output (not for customer), */\ - { 0x3307, "HAPTIME"}, /* Duration (ms) , */\ - { 0x3387, "HAPLEVEL"}, /* DC value (FFS) , */\ - { 0x3403, "GPIODIN"}, /* Receiving value , */\ - { 0x3500, "GPIOCTRL"}, /* GPIO master control over GPIO1/2 ports (not for customer), */\ - { 0x3513, "GPIOCONF"}, /* Configuration , */\ - { 0x3553, "GPIODOUT"}, /* Transmitting value , */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTPLLS"}, /* Status PLL lock , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOVDS"}, /* Status OVP alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTCLKS"}, /* Status clocks stable , */\ - { 0x4060, "ISTMTPB"}, /* Status MTP busy , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4080, "ISTSPKS"}, /* Status speaker error , */\ - { 0x4090, "ISTACS"}, /* Status cold start , */\ - { 0x40a0, "ISTSWS"}, /* Status amplifier engage , */\ - { 0x40b0, "ISTWDS"}, /* Status watchdog , */\ - { 0x40c0, "ISTAMPS"}, /* Status amplifier enable , */\ - { 0x40d0, "ISTAREFS"}, /* Status Ref enable , */\ - { 0x40e0, "ISTADCCR"}, /* Status Control ADC , */\ - { 0x40f0, "ISTBODNOK"}, /* Status BOD , */\ - { 0x4100, "ISTBSTCU"}, /* Status DCDC current limiting , */\ - { 0x4110, "ISTBSTHI"}, /* Status DCDC active , */\ - { 0x4120, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4130, "ISTBSTPKCUR"}, /* Status bst peakcur , */\ - { 0x4140, "ISTBSTVC"}, /* Status DCDC level 1x , */\ - { 0x4150, "ISTBST86"}, /* Status DCDC level 1.14x , */\ - { 0x4160, "ISTBST93"}, /* Status DCDC level 1.07x , */\ - { 0x4170, "ISTRCVLD"}, /* Status rcvldop ready , */\ - { 0x4180, "ISTOCPL"}, /* Status ocp alarm left , */\ - { 0x4190, "ISTOCPR"}, /* Status ocp alarm right , */\ - { 0x41a0, "ISTMWSRC"}, /* Status Waits HW I2C settings , */\ - { 0x41b0, "ISTMWCFC"}, /* Status waits CF config , */\ - { 0x41c0, "ISTMWSMU"}, /* Status Audio mute sequence , */\ - { 0x41d0, "ISTCFMER"}, /* Status cfma error , */\ - { 0x41e0, "ISTCFMAC"}, /* Status cfma ack , */\ - { 0x41f0, "ISTCLKOOR"}, /* Status flag_clk_out_of_range , */\ - { 0x4200, "ISTTDMER"}, /* Status tdm error , */\ - { 0x4210, "ISTCLPL"}, /* Status clip left , */\ - { 0x4220, "ISTCLPR"}, /* Status clip right , */\ - { 0x4230, "ISTOCPM"}, /* Status mic ocpok , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLPLLS"}, /* Clear PLL lock , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOVDS"}, /* Clear OVP alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLCLKS"}, /* Clear clocks stable , */\ - { 0x4460, "ICLMTPB"}, /* Clear mtp busy , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4480, "ICLSPKS"}, /* Clear speaker error , */\ - { 0x4490, "ICLACS"}, /* Clear cold started , */\ - { 0x44a0, "ICLSWS"}, /* Clear amplifier engage , */\ - { 0x44b0, "ICLWDS"}, /* Clear watchdog , */\ - { 0x44c0, "ICLAMPS"}, /* Clear enbl amp , */\ - { 0x44d0, "ICLAREFS"}, /* Clear ref enable , */\ - { 0x44e0, "ICLADCCR"}, /* Clear control ADC , */\ - { 0x44f0, "ICLBODNOK"}, /* Clear BOD , */\ - { 0x4500, "ICLBSTCU"}, /* Clear DCDC current limiting , */\ - { 0x4510, "ICLBSTHI"}, /* Clear DCDC active , */\ - { 0x4520, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4530, "ICLBSTPC"}, /* Clear bst peakcur , */\ - { 0x4540, "ICLBSTVC"}, /* Clear DCDC level 1x , */\ - { 0x4550, "ICLBST86"}, /* Clear DCDC level 1.14x , */\ - { 0x4560, "ICLBST93"}, /* Clear DCDC level 1.07x , */\ - { 0x4570, "ICLRCVLD"}, /* Clear rcvldop ready , */\ - { 0x4580, "ICLOCPL"}, /* Clear ocp alarm left , */\ - { 0x4590, "ICLOCPR"}, /* Clear ocp alarm right , */\ - { 0x45a0, "ICLMWSRC"}, /* Clear wait HW I2C settings , */\ - { 0x45b0, "ICLMWCFC"}, /* Clear wait cf config , */\ - { 0x45c0, "ICLMWSMU"}, /* Clear audio mute sequence , */\ - { 0x45d0, "ICLCFMER"}, /* Clear cfma err , */\ - { 0x45e0, "ICLCFMAC"}, /* Clear cfma ack , */\ - { 0x45f0, "ICLCLKOOR"}, /* Clear flag_clk_out_of_range , */\ - { 0x4600, "ICLTDMER"}, /* Clear tdm error , */\ - { 0x4610, "ICLCLPL"}, /* Clear clip left , */\ - { 0x4620, "ICLCLPR"}, /* Clear clip right , */\ - { 0x4630, "ICLOCPM"}, /* Clear mic ocpok , */\ - { 0x4800, "IEVDDS"}, /* Enable por , */\ - { 0x4810, "IEPLLS"}, /* Enable pll lock , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOVDS"}, /* Enable OVP alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IECLKS"}, /* Enable clocks stable , */\ - { 0x4860, "IEMTPB"}, /* Enable mtp busy , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4880, "IESPKS"}, /* Enable speaker error , */\ - { 0x4890, "IEACS"}, /* Enable cold started , */\ - { 0x48a0, "IESWS"}, /* Enable amplifier engage , */\ - { 0x48b0, "IEWDS"}, /* Enable watchdog , */\ - { 0x48c0, "IEAMPS"}, /* Enable enbl amp , */\ - { 0x48d0, "IEAREFS"}, /* Enable ref enable , */\ - { 0x48e0, "IEADCCR"}, /* Enable Control ADC , */\ - { 0x48f0, "IEBODNOK"}, /* Enable BOD , */\ - { 0x4900, "IEBSTCU"}, /* Enable DCDC current limiting , */\ - { 0x4910, "IEBSTHI"}, /* Enable DCDC active , */\ - { 0x4920, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4930, "IEBSTPC"}, /* Enable bst peakcur , */\ - { 0x4940, "IEBSTVC"}, /* Enable DCDC level 1x , */\ - { 0x4950, "IEBST86"}, /* Enable DCDC level 1.14x , */\ - { 0x4960, "IEBST93"}, /* Enable DCDC level 1.07x , */\ - { 0x4970, "IERCVLD"}, /* Enable rcvldop ready , */\ - { 0x4980, "IEOCPL"}, /* Enable ocp alarm left , */\ - { 0x4990, "IEOCPR"}, /* Enable ocp alarm right , */\ - { 0x49a0, "IEMWSRC"}, /* Enable waits HW I2C settings , */\ - { 0x49b0, "IEMWCFC"}, /* Enable man wait cf config , */\ - { 0x49c0, "IEMWSMU"}, /* Enable man Audio mute sequence , */\ - { 0x49d0, "IECFMER"}, /* Enable cfma err , */\ - { 0x49e0, "IECFMAC"}, /* Enable cfma ack , */\ - { 0x49f0, "IECLKOOR"}, /* Enable flag_clk_out_of_range , */\ - { 0x4a00, "IETDMER"}, /* Enable tdm error , */\ - { 0x4a10, "IECLPL"}, /* Enable clip left , */\ - { 0x4a20, "IECLPR"}, /* Enable clip right , */\ - { 0x4a30, "IEOCPM1"}, /* Enable mic ocpok , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ - { 0x4c10, "IPOPLLS"}, /* Polarity pll lock , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOVDS"}, /* Polarity OVP alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOCLKS"}, /* Polarity clocks stable , */\ - { 0x4c60, "IPOMTPB"}, /* Polarity mtp busy , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x4c80, "IPOSPKS"}, /* Polarity speaker error , */\ - { 0x4c90, "IPOACS"}, /* Polarity cold started , */\ - { 0x4ca0, "IPOSWS"}, /* Polarity amplifier engage , */\ - { 0x4cb0, "IPOWDS"}, /* Polarity watchdog , */\ - { 0x4cc0, "IPOAMPS"}, /* Polarity enbl amp , */\ - { 0x4cd0, "IPOAREFS"}, /* Polarity ref enable , */\ - { 0x4ce0, "IPOADCCR"}, /* Polarity Control ADC , */\ - { 0x4cf0, "IPOBODNOK"}, /* Polarity BOD , */\ - { 0x4d00, "IPOBSTCU"}, /* Polarity DCDC current limiting , */\ - { 0x4d10, "IPOBSTHI"}, /* Polarity DCDC active , */\ - { 0x4d20, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4d30, "IPOBSTPC"}, /* Polarity bst peakcur , */\ - { 0x4d40, "IPOBSTVC"}, /* Polarity DCDC level 1x , */\ - { 0x4d50, "IPOBST86"}, /* Polarity DCDC level 1.14x , */\ - { 0x4d60, "IPOBST93"}, /* Polarity DCDC level 1.07x , */\ - { 0x4d70, "IPORCVLD"}, /* Polarity rcvldop ready , */\ - { 0x4d80, "IPOOCPL"}, /* Polarity ocp alarm left , */\ - { 0x4d90, "IPOOCPR"}, /* Polarity ocp alarm right , */\ - { 0x4da0, "IPOMWSRC"}, /* Polarity waits HW I2C settings , */\ - { 0x4db0, "IPOMWCFC"}, /* Polarity man wait cf config , */\ - { 0x4dc0, "IPOMWSMU"}, /* Polarity man audio mute sequence , */\ - { 0x4dd0, "IPOCFMER"}, /* Polarity cfma err , */\ - { 0x4de0, "IPOCFMAC"}, /* Polarity cfma ack , */\ - { 0x4df0, "IPCLKOOR"}, /* Polarity flag_clk_out_of_range , */\ - { 0x4e00, "IPOTDMER"}, /* Polarity tdm error , */\ - { 0x4e10, "IPOCLPL"}, /* Polarity clip left , */\ - { 0x4e20, "IPOCLPR"}, /* Polarity clip right , */\ - { 0x4e30, "IPOOCPM"}, /* Polarity mic ocpok , */\ - { 0x5001, "BSSCR"}, /* Battery protection attack Time , */\ - { 0x5023, "BSST"}, /* Battery protection threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery protection maximum reduction , */\ - { 0x5082, "BSSRR"}, /* Battery protection release time , */\ - { 0x50b1, "BSSHY"}, /* Battery protection hysteresis , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ - { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ - { 0x5110, "INTSMUTE"}, /* Soft mute HW , */\ - { 0x5120, "CFSML"}, /* Soft mute FW left , */\ - { 0x5130, "CFSMR"}, /* Soft mute FW right , */\ - { 0x5140, "HPFBYPL"}, /* Bypass HPF left , */\ - { 0x5150, "HPFBYPR"}, /* Bypass HPF right , */\ - { 0x5160, "DPSAL"}, /* Enable DPSA left , */\ - { 0x5170, "DPSAR"}, /* Enable DPSA right , */\ - { 0x5187, "VOL"}, /* FW volume control for primary audio channel , */\ - { 0x5200, "HNDSFRCV"}, /* Selection receiver , */\ - { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ - { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ - { 0x52e1, "SLOPESET"}, /* Set slope , */\ - { 0x5a07, "VOLSEC"}, /* FW volume control for secondary audio channel , */\ - { 0x5a87, "SWPROFIL"}, /* Software profile data , */\ - { 0x7002, "DCVO"}, /* Boost voltage , */\ - { 0x7033, "DCMCC"}, /* Max coil current , */\ - { 0x7071, "DCCV"}, /* Coil Value , */\ - { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ - { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ - { 0x70b2, "DCSYNCP"}, /* DCDC synchronization off + 7 positions , */\ - { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ - { 0x9000, "RST"}, /* Reset , */\ - { 0x9011, "DMEM"}, /* Target memory , */\ - { 0x9030, "AIF"}, /* Auto increment , */\ - { 0x9040, "CFINT"}, /* Interrupt - auto clear , */\ - { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ - { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ - { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ - { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ - { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ - { 0x910f, "MADD"}, /* Memory address , */\ - { 0x920f, "MEMA"}, /* Activate memory access , */\ - { 0x9307, "ERR"}, /* Error flags , */\ - { 0x9387, "ACK"}, /* Acknowledge of requests , */\ - { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ - { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf40f, "R25CL"}, /* Ron resistance of left channel speaker coil , */\ - { 0xf50f, "R25CR"}, /* Ron resistance of right channel speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA2_BITNAMETABLE static tfaBfName_t Tfa2BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown selection , */\ - { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ - { 0x20, "enbl_coolflux"}, /* Enable CoolFlux , */\ - { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ - { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ - { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ - { 0x60, "sel_enbl_amplifier"}, /* CoolFlux controls amplifier , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0x91, "fs_pulse_sel"}, /* Audio sample reference , */\ - { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xc0, "test_ocp"}, /* OCP testing control , */\ - { 0x101, "vamp_sel"}, /* Amplifier input selection , */\ - { 0x120, "src_set_configured"}, /* I2C configured , */\ - { 0x130, "execute_cold_start"}, /* Execute cold start , */\ - { 0x140, "enbl_osc1m_auto_off"}, /* Internal osc off at PWDN , */\ - { 0x150, "man_enbl_brown_out"}, /* Reaction on BOD , */\ - { 0x160, "enbl_bod"}, /* BOD Enable , */\ - { 0x170, "enbl_bod_hyst"}, /* BOD Hysteresis , */\ - { 0x181, "bod_delay"}, /* BOD filter , */\ - { 0x1a1, "bod_lvlsel"}, /* BOD threshold , */\ - { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x1e0, "pwm_sel_rcv_ns"}, /* Noise shaper selection , */\ - { 0x1f0, "man_enbl_watchdog"}, /* Watchdog manager reaction , */\ - { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ - { 0x2b0, "bypass_hvbat_filter"}, /* Bypass HVBAT filter , */\ - { 0x2c0, "ctrl_rcvldop_bypass"}, /* Receiver LDO bypass , */\ - { 0x30f, "device_rev"}, /* Revision info , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ - { 0x500, "enbl_spkr_ss_left"}, /* Enable left channel , */\ - { 0x510, "enbl_spkr_ss_right"}, /* Enable right channel , */\ - { 0x520, "enbl_volsense_left"}, /* Voltage sense left , */\ - { 0x530, "enbl_volsense_right"}, /* Voltage sense right , */\ - { 0x540, "enbl_cursense_left"}, /* Current sense left , */\ - { 0x550, "enbl_cursense_right"}, /* Current sense right , */\ - { 0x560, "enbl_pdm_ss"}, /* Sub-system PDM , */\ - { 0xd00, "side_tone_gain_sel"}, /* PDM side tone gain selector , */\ - { 0xd18, "side_tone_gain"}, /* Side tone gain , */\ - { 0xda0, "mute_side_tone"}, /* Side tone soft mute , */\ - { 0xe06, "ctrl_digtoana"}, /* Register for the host SW to record the current active vstep, */\ - { 0xe70, "enbl_cmfb_left"}, /* Current sense common mode feedback control for left channel, */\ - { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_pll_lock"}, /* PLL lock , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm , */\ - { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ - { 0x1050, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1060, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1070, "flag_lost_clk"}, /* Lost clock , */\ - { 0x1080, "flag_cf_speakererror"}, /* Speaker error , */\ - { 0x1090, "flag_cold_started"}, /* Cold Start , */\ - { 0x10a0, "flag_engage"}, /* Amplifier engage , */\ - { 0x10b0, "flag_watchdog_reset"}, /* Watchdog , */\ - { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ - { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x10f0, "flag_bod_vddd_nok"}, /* BOD , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active , */\ - { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos , */\ - { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1170, "flag_soft_mute_busy"}, /* side tone (un)mute busy , */\ - { 0x1180, "flag_soft_mute_state"}, /* side tone mute state , */\ - { 0x1190, "flag_tdm_lut_error"}, /* TDM LUT error , */\ - { 0x11a2, "flag_tdm_status"}, /* TDM status bits , */\ - { 0x11d0, "flag_tdm_error"}, /* TDM error , */\ - { 0x11e0, "flag_haptic_busy"}, /* Status haptic driver , */\ - { 0x1200, "flag_ocpokap_left"}, /* OCPOK pmos A left , */\ - { 0x1210, "flag_ocpokan_left"}, /* OCPOK nmos A left , */\ - { 0x1220, "flag_ocpokbp_left"}, /* OCPOK pmos B left , */\ - { 0x1230, "flag_ocpokbn_left"}, /* OCPOK nmos B left , */\ - { 0x1240, "flag_clipa_high_left"}, /* Clipping A left to Vddp , */\ - { 0x1250, "flag_clipa_low_left"}, /* Clipping A left to gnd , */\ - { 0x1260, "flag_clipb_high_left"}, /* Clipping B left to Vddp , */\ - { 0x1270, "flag_clipb_low_left"}, /* Clipping B left to gnd , */\ - { 0x1280, "flag_ocpokap_rcv"}, /* OCPOK pmos A RCV , */\ - { 0x1290, "flag_ocpokan_rcv"}, /* OCPOK nmos A RCV , */\ - { 0x12a0, "flag_ocpokbp_rcv"}, /* OCPOK pmos B RCV , */\ - { 0x12b0, "flag_ocpokbn_rcv"}, /* OCPOK nmos B RCV , */\ - { 0x12c0, "flag_rcvldop_ready"}, /* RCV LDO regulates , */\ - { 0x12d0, "flag_rcvldop_bypassready"}, /* Receiver LDO ready , */\ - { 0x12e0, "flag_ocp_alarm_left"}, /* OCP left amplifier , */\ - { 0x12f0, "flag_clip_left"}, /* Amplifier left clipping , */\ - { 0x1300, "flag_ocpokap_right"}, /* OCPOK pmos A right , */\ - { 0x1310, "flag_ocpokan_right"}, /* OCPOK nmos A right , */\ - { 0x1320, "flag_ocpokbp_right"}, /* OCPOK pmos B right , */\ - { 0x1330, "flag_ocpokbn_right"}, /* OCPOK nmos B right , */\ - { 0x1340, "flag_clipa_high_right"}, /* Clipping A right to Vddp , */\ - { 0x1350, "flag_clipa_low_right"}, /* Clipping A right to gnd , */\ - { 0x1360, "flag_clipb_high_right"}, /* Clipping B left to Vddp , */\ - { 0x1370, "flag_clipb_low_right"}, /* Clipping B right to gnd , */\ - { 0x1380, "flag_ocp_alarm_right"}, /* OCP right amplifier , */\ - { 0x1390, "flag_clip_right"}, /* Amplifier right clipping , */\ - { 0x13a0, "flag_mic_ocpok"}, /* OCPOK MICVDD , */\ - { 0x13b0, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ - { 0x13d0, "flag_man_wait_cf_config"}, /* Wait CF config , */\ - { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ - { 0x1400, "flag_cf_speakererror_left"}, /* Left speaker status , */\ - { 0x1410, "flag_cf_speakererror_right"}, /* Right speaker status , */\ - { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x1433, "man_state"}, /* Device manager status , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x2003, "tdm_usecase"}, /* Usecase setting , */\ - { 0x2040, "tdm_enable"}, /* Enable interface , */\ - { 0x2050, "tdm_mode"}, /* Slave/master , */\ - { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2073, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ - { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ - { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ - { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ - { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots GAINIO , */\ - { 0x22b1, "tdm_txdata_format_unused_slot_sd1"}, /* Format unused slots DIO1 , */\ - { 0x22d1, "tdm_txdata_format_unused_slot_sd2"}, /* Format unused slots DIO2 , */\ - { 0x2300, "tdm_sink0_enable"}, /* Control gainin (not used in DSP) , */\ - { 0x2310, "tdm_sink1_enable"}, /* Control audio left , */\ - { 0x2320, "tdm_sink2_enable"}, /* Control audio right , */\ - { 0x2330, "tdm_source0_enable"}, /* Control gainout (not used in DSP) , */\ - { 0x2340, "tdm_source1_enable"}, /* Control voltage sense right , */\ - { 0x2350, "tdm_source2_enable"}, /* Control current sense right , */\ - { 0x2360, "tdm_source3_enable"}, /* Voltage sense left control , */\ - { 0x2370, "tdm_source4_enable"}, /* Current sense left control , */\ - { 0x2380, "tdm_source5_enable"}, /* DSP out right control , */\ - { 0x2390, "tdm_source6_enable"}, /* DSP out left control , */\ - { 0x23a0, "tdm_source7_enable"}, /* AEC ref left control , */\ - { 0x23b0, "tdm_source8_enable"}, /* AEC ref right control , */\ - { 0x23c0, "tdm_source9_enable"}, /* PDM 1 control , */\ - { 0x23d0, "tdm_source10_enable"}, /* PDM 2 control , */\ - { 0x2401, "tdm_sink0_io"}, /* IO gainin (not used in DSP) , */\ - { 0x2421, "tdm_sink1_io"}, /* IO audio left , */\ - { 0x2441, "tdm_sink2_io"}, /* IO audio right , */\ - { 0x2461, "tdm_source0_io"}, /* IO gainout (not used in DSP) , */\ - { 0x2481, "tdm_source1_io"}, /* IO voltage sense right , */\ - { 0x24a1, "tdm_source2_io"}, /* IO current sense right , */\ - { 0x24c1, "tdm_source3_io"}, /* IO voltage sense left , */\ - { 0x24e1, "tdm_source4_io"}, /* IO current sense left , */\ - { 0x2501, "tdm_source5_io"}, /* IO dspout right , */\ - { 0x2521, "tdm_source6_io"}, /* IO dspout left , */\ - { 0x2541, "tdm_source7_io"}, /* IO AEC ref left control , */\ - { 0x2561, "tdm_source8_io"}, /* IO AEC ref right control , */\ - { 0x2581, "tdm_source9_io"}, /* IO pdm1 , */\ - { 0x25a1, "tdm_source10_io"}, /* IO pdm2 , */\ - { 0x2603, "tdm_sink0_slot"}, /* Position gainin (not used in DSP) , */\ - { 0x2643, "tdm_sink1_slot"}, /* Position audio left , */\ - { 0x2683, "tdm_sink2_slot"}, /* Position audio right , */\ - { 0x26c3, "tdm_source0_slot"}, /* Position gainout (not used in DSP) , */\ - { 0x2703, "tdm_source1_slot"}, /* Position voltage sense right , */\ - { 0x2743, "tdm_source2_slot"}, /* Position current sense right , */\ - { 0x2783, "tdm_source3_slot"}, /* Position voltage sense left , */\ - { 0x27c3, "tdm_source4_slot"}, /* Position current sense left , */\ - { 0x2803, "tdm_source5_slot"}, /* Position dspout right , */\ - { 0x2843, "tdm_source6_slot"}, /* Position dspout left , */\ - { 0x2883, "tdm_source7_slot"}, /* Position AEC ref left control , */\ - { 0x28c3, "tdm_source8_slot"}, /* Position AEC ref right control , */\ - { 0x2903, "tdm_source9_slot"}, /* Position pdm1 , */\ - { 0x2943, "tdm_source10_slot"}, /* Position pdm2 , */\ - { 0x3100, "pdm_mode"}, /* PDM control , */\ - { 0x3111, "pdm_side_tone_sel"}, /* Side tone input , */\ - { 0x3130, "pdm_left_sel"}, /* PDM data selection for left channel during PDM direct mode, */\ - { 0x3140, "pdm_right_sel"}, /* PDM data selection for right channel during PDM direct mode, */\ - { 0x3150, "enbl_micvdd"}, /* Enable MICVDD , */\ - { 0x3160, "bypass_micvdd_ocp"}, /* Bypass control for the MICVDD OCP flag processing , */\ - { 0x3201, "pdm_nbck"}, /* PDM BCK/Fs ratio , */\ - { 0x3223, "pdm_gain"}, /* PDM gain , */\ - { 0x3263, "sel_pdm_out_data"}, /* PDM output selection - RE/FE data combination , */\ - { 0x32a0, "sel_cf_haptic_data"}, /* Select the source for haptic data output (not for customer), */\ - { 0x3307, "haptic_duration"}, /* Duration (ms) , */\ - { 0x3387, "haptic_data"}, /* DC value (FFS) , */\ - { 0x3403, "gpio_datain"}, /* Receiving value , */\ - { 0x3500, "gpio_ctrl"}, /* GPIO master control over GPIO1/2 ports (not for customer), */\ - { 0x3513, "gpio_dir"}, /* Configuration , */\ - { 0x3553, "gpio_dataout"}, /* Transmitting value , */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_pll_lock"}, /* Status PLL lock , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ovpok"}, /* Status OVP alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_clocks_stable"}, /* Status clocks stable , */\ - { 0x4060, "int_out_flag_mtp_busy"}, /* Status MTP busy , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4080, "int_out_flag_cf_speakererror"}, /* Status speaker error , */\ - { 0x4090, "int_out_flag_cold_started"}, /* Status cold start , */\ - { 0x40a0, "int_out_flag_engage"}, /* Status amplifier engage , */\ - { 0x40b0, "int_out_flag_watchdog_reset"}, /* Status watchdog , */\ - { 0x40c0, "int_out_flag_enbl_amp"}, /* Status amplifier enable , */\ - { 0x40d0, "int_out_flag_enbl_ref"}, /* Status Ref enable , */\ - { 0x40e0, "int_out_flag_adc10_ready"}, /* Status Control ADC , */\ - { 0x40f0, "int_out_flag_bod_vddd_nok"}, /* Status BOD , */\ - { 0x4100, "int_out_flag_bst_bstcur"}, /* Status DCDC current limiting , */\ - { 0x4110, "int_out_flag_bst_hiz"}, /* Status DCDC active , */\ - { 0x4120, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4130, "int_out_flag_bst_peakcur"}, /* Status bst peakcur , */\ - { 0x4140, "int_out_flag_bst_voutcomp"}, /* Status DCDC level 1x , */\ - { 0x4150, "int_out_flag_bst_voutcomp86"}, /* Status DCDC level 1.14x , */\ - { 0x4160, "int_out_flag_bst_voutcomp93"}, /* Status DCDC level 1.07x , */\ - { 0x4170, "int_out_flag_rcvldop_ready"}, /* Status rcvldop ready , */\ - { 0x4180, "int_out_flag_ocp_alarm_left"}, /* Status ocp alarm left , */\ - { 0x4190, "int_out_flag_ocp_alarm_right"}, /* Status ocp alarm right , */\ - { 0x41a0, "int_out_flag_man_wait_src_settings"}, /* Status Waits HW I2C settings , */\ - { 0x41b0, "int_out_flag_man_wait_cf_config"}, /* Status waits CF config , */\ - { 0x41c0, "int_out_flag_man_start_mute_audio"}, /* Status Audio mute sequence , */\ - { 0x41d0, "int_out_flag_cfma_err"}, /* Status cfma error , */\ - { 0x41e0, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ - { 0x41f0, "int_out_flag_clk_out_of_range"}, /* Status flag_clk_out_of_range , */\ - { 0x4200, "int_out_flag_tdm_error"}, /* Status tdm error , */\ - { 0x4210, "int_out_flag_clip_left"}, /* Status clip left , */\ - { 0x4220, "int_out_flag_clip_right"}, /* Status clip right , */\ - { 0x4230, "int_out_flag_mic_ocpok"}, /* Status mic ocpok , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_pll_lock"}, /* Clear PLL lock , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ovpok"}, /* Clear OVP alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_clocks_stable"}, /* Clear clocks stable , */\ - { 0x4460, "int_in_flag_mtp_busy"}, /* Clear mtp busy , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4480, "int_in_flag_cf_speakererror"}, /* Clear speaker error , */\ - { 0x4490, "int_in_flag_cold_started"}, /* Clear cold started , */\ - { 0x44a0, "int_in_flag_engage"}, /* Clear amplifier engage , */\ - { 0x44b0, "int_in_flag_watchdog_reset"}, /* Clear watchdog , */\ - { 0x44c0, "int_in_flag_enbl_amp"}, /* Clear enbl amp , */\ - { 0x44d0, "int_in_flag_enbl_ref"}, /* Clear ref enable , */\ - { 0x44e0, "int_in_flag_adc10_ready"}, /* Clear control ADC , */\ - { 0x44f0, "int_in_flag_bod_vddd_nok"}, /* Clear BOD , */\ - { 0x4500, "int_in_flag_bst_bstcur"}, /* Clear DCDC current limiting , */\ - { 0x4510, "int_in_flag_bst_hiz"}, /* Clear DCDC active , */\ - { 0x4520, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4530, "int_in_flag_bst_peakcur"}, /* Clear bst peakcur , */\ - { 0x4540, "int_in_flag_bst_voutcomp"}, /* Clear DCDC level 1x , */\ - { 0x4550, "int_in_flag_bst_voutcomp86"}, /* Clear DCDC level 1.14x , */\ - { 0x4560, "int_in_flag_bst_voutcomp93"}, /* Clear DCDC level 1.07x , */\ - { 0x4570, "int_in_flag_rcvldop_ready"}, /* Clear rcvldop ready , */\ - { 0x4580, "int_in_flag_ocp_alarm_left"}, /* Clear ocp alarm left , */\ - { 0x4590, "int_in_flag_ocp_alarm_right"}, /* Clear ocp alarm right , */\ - { 0x45a0, "int_in_flag_man_wait_src_settings"}, /* Clear wait HW I2C settings , */\ - { 0x45b0, "int_in_flag_man_wait_cf_config"}, /* Clear wait cf config , */\ - { 0x45c0, "int_in_flag_man_start_mute_audio"}, /* Clear audio mute sequence , */\ - { 0x45d0, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ - { 0x45e0, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ - { 0x45f0, "int_in_flag_clk_out_of_range"}, /* Clear flag_clk_out_of_range , */\ - { 0x4600, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ - { 0x4610, "int_in_flag_clip_left"}, /* Clear clip left , */\ - { 0x4620, "int_in_flag_clip_right"}, /* Clear clip right , */\ - { 0x4630, "int_in_flag_mic_ocpok"}, /* Clear mic ocpok , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ - { 0x4810, "int_enable_flag_pll_lock"}, /* Enable pll lock , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ovpok"}, /* Enable OVP alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_clocks_stable"}, /* Enable clocks stable , */\ - { 0x4860, "int_enable_flag_mtp_busy"}, /* Enable mtp busy , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4880, "int_enable_flag_cf_speakererror"}, /* Enable speaker error , */\ - { 0x4890, "int_enable_flag_cold_started"}, /* Enable cold started , */\ - { 0x48a0, "int_enable_flag_engage"}, /* Enable amplifier engage , */\ - { 0x48b0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog , */\ - { 0x48c0, "int_enable_flag_enbl_amp"}, /* Enable enbl amp , */\ - { 0x48d0, "int_enable_flag_enbl_ref"}, /* Enable ref enable , */\ - { 0x48e0, "int_enable_flag_adc10_ready"}, /* Enable Control ADC , */\ - { 0x48f0, "int_enable_flag_bod_vddd_nok"}, /* Enable BOD , */\ - { 0x4900, "int_enable_flag_bst_bstcur"}, /* Enable DCDC current limiting , */\ - { 0x4910, "int_enable_flag_bst_hiz"}, /* Enable DCDC active , */\ - { 0x4920, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4930, "int_enable_flag_bst_peakcur"}, /* Enable bst peakcur , */\ - { 0x4940, "int_enable_flag_bst_voutcomp"}, /* Enable DCDC level 1x , */\ - { 0x4950, "int_enable_flag_bst_voutcomp86"}, /* Enable DCDC level 1.14x , */\ - { 0x4960, "int_enable_flag_bst_voutcomp93"}, /* Enable DCDC level 1.07x , */\ - { 0x4970, "int_enable_flag_rcvldop_ready"}, /* Enable rcvldop ready , */\ - { 0x4980, "int_enable_flag_ocp_alarm_left"}, /* Enable ocp alarm left , */\ - { 0x4990, "int_enable_flag_ocp_alarm_right"}, /* Enable ocp alarm right , */\ - { 0x49a0, "int_enable_flag_man_wait_src_settings"}, /* Enable waits HW I2C settings , */\ - { 0x49b0, "int_enable_flag_man_wait_cf_config"}, /* Enable man wait cf config , */\ - { 0x49c0, "int_enable_flag_man_start_mute_audio"}, /* Enable man Audio mute sequence , */\ - { 0x49d0, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ - { 0x49e0, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ - { 0x49f0, "int_enable_flag_clk_out_of_range"}, /* Enable flag_clk_out_of_range , */\ - { 0x4a00, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ - { 0x4a10, "int_enable_flag_clip_left"}, /* Enable clip left , */\ - { 0x4a20, "int_enable_flag_clip_right"}, /* Enable clip right , */\ - { 0x4a30, "int_enable_flag_mic_ocpok"}, /* Enable mic ocpok , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ - { 0x4c10, "int_polarity_flag_pll_lock"}, /* Polarity pll lock , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ovpok"}, /* Polarity OVP alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_clocks_stable"}, /* Polarity clocks stable , */\ - { 0x4c60, "int_polarity_flag_mtp_busy"}, /* Polarity mtp busy , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x4c80, "int_polarity_flag_cf_speakererror"}, /* Polarity speaker error , */\ - { 0x4c90, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ - { 0x4ca0, "int_polarity_flag_engage"}, /* Polarity amplifier engage , */\ - { 0x4cb0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog , */\ - { 0x4cc0, "int_polarity_flag_enbl_amp"}, /* Polarity enbl amp , */\ - { 0x4cd0, "int_polarity_flag_enbl_ref"}, /* Polarity ref enable , */\ - { 0x4ce0, "int_polarity_flag_adc10_ready"}, /* Polarity Control ADC , */\ - { 0x4cf0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity BOD , */\ - { 0x4d00, "int_polarity_flag_bst_bstcur"}, /* Polarity DCDC current limiting , */\ - { 0x4d10, "int_polarity_flag_bst_hiz"}, /* Polarity DCDC active , */\ - { 0x4d20, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4d30, "int_polarity_flag_bst_peakcur"}, /* Polarity bst peakcur , */\ - { 0x4d40, "int_polarity_flag_bst_voutcomp"}, /* Polarity DCDC level 1x , */\ - { 0x4d50, "int_polarity_flag_bst_voutcomp86"}, /* Polarity DCDC level 1.14x , */\ - { 0x4d60, "int_polarity_flag_bst_voutcomp93"}, /* Polarity DCDC level 1.07x , */\ - { 0x4d70, "int_polarity_flag_rcvldop_ready"}, /* Polarity rcvldop ready , */\ - { 0x4d80, "int_polarity_flag_ocp_alarm_left"}, /* Polarity ocp alarm left , */\ - { 0x4d90, "int_polarity_flag_ocp_alarm_right"}, /* Polarity ocp alarm right , */\ - { 0x4da0, "int_polarity_flag_man_wait_src_settings"}, /* Polarity waits HW I2C settings , */\ - { 0x4db0, "int_polarity_flag_man_wait_cf_config"}, /* Polarity man wait cf config , */\ - { 0x4dc0, "int_polarity_flag_man_start_mute_audio"}, /* Polarity man audio mute sequence , */\ - { 0x4dd0, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ - { 0x4de0, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ - { 0x4df0, "int_polarity_flag_clk_out_of_range"}, /* Polarity flag_clk_out_of_range , */\ - { 0x4e00, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ - { 0x4e10, "int_polarity_flag_clip_left"}, /* Polarity clip left , */\ - { 0x4e20, "int_polarity_flag_clip_right"}, /* Polarity clip right , */\ - { 0x4e30, "int_polarity_flag_mic_ocpok"}, /* Polarity mic ocpok , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery protection attack Time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery protection threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery protection maximum reduction , */\ - { 0x5082, "vbat_prot_release_time"}, /* Battery protection release time , */\ - { 0x50b1, "vbat_prot_hysterese"}, /* Battery protection hysteresis , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ - { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ - { 0x5110, "soft_mute"}, /* Soft mute HW , */\ - { 0x5120, "cf_mute_left"}, /* Soft mute FW left , */\ - { 0x5130, "cf_mute_right"}, /* Soft mute FW right , */\ - { 0x5140, "bypass_hp_left"}, /* Bypass HPF left , */\ - { 0x5150, "bypass_hp_right"}, /* Bypass HPF right , */\ - { 0x5160, "enbl_dpsa_left"}, /* Enable DPSA left , */\ - { 0x5170, "enbl_dpsa_right"}, /* Enable DPSA right , */\ - { 0x5187, "cf_volume"}, /* FW volume control for primary audio channel , */\ - { 0x5200, "ctrl_rcv"}, /* Selection receiver , */\ - { 0x5210, "ctrl_rcv_fb_100k"}, /* Selection of feedback resistor for receiver mode (not for customer), */\ - { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ - { 0x5257, "gain"}, /* Amplifier gain , */\ - { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x52e1, "ctrl_slope"}, /* Set slope , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ - { 0x5340, "clipfast"}, /* Clock selection for HW clipper for battery protection, */\ - { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ - { 0x5360, "enbl_low_latency"}, /* CF low latency outputs for add module , */\ - { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ - { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5420, "fb_hz"}, /* Feedback resistor set to high ohmic , */\ - { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ - { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5581, "dpsa_drive"}, /* Control of the number of power stage sections, total of 4 sections. Each section is 1/4 of the total power stages., */\ - { 0x560a, "enbl_amp_left"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually - Left channel, */\ - { 0x56b0, "enbl_engage_left"}, /* Enables/engage power stage and control loop - left channel, */\ - { 0x570a, "enbl_amp_right"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually - Right channel, */\ - { 0x57b0, "enbl_engage_right"}, /* Enables/engage power stage and control loop - right channel, */\ - { 0x5800, "hard_mute_left"}, /* Hard mute - PWM module left , */\ - { 0x5810, "hard_mute_right"}, /* Hard mute - PWM module right , */\ - { 0x5820, "pwm_shape"}, /* PWM shape , */\ - { 0x5830, "pwm_bitlength"}, /* PWM bit length in noise shaper , */\ - { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ - { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ - { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ - { 0x58b0, "enbl_pwm_phase_shift_left"}, /* Control for pwm phase shift, inverted function - left channel, */\ - { 0x58c0, "enbl_pwm_phase_shift_right"}, /* Control for pwm phase shift - right channel , */\ - { 0x5900, "ctrl_rcvldop_pulldown"}, /* Pulldown of LDO (2.7V) , */\ - { 0x5910, "ctrl_rcvldop_test_comp"}, /* Enable testing of LDO comparator , */\ - { 0x5920, "ctrl_rcvldop_test_loadedldo"}, /* Load connected to rcvldo , */\ - { 0x5930, "enbl_rcvldop"}, /* Enables the LDO (2.7) , */\ - { 0x5a07, "cf_volume_sec"}, /* FW volume control for secondary audio channel , */\ - { 0x5a87, "sw_profile"}, /* Software profile data , */\ - { 0x7002, "boost_volt"}, /* Boost voltage , */\ - { 0x7033, "boost_cur"}, /* Max coil current , */\ - { 0x7071, "bst_coil_value"}, /* Coil Value , */\ - { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x70b2, "dcdc_synchronisation"}, /* DCDC synchronization off + 7 positions , */\ - { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ - { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ - { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7332, "bst_freq"}, /* DCDC bost frequency control , */\ - { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ - { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ - { 0x8040, "cs_dc_offset"}, /* Current sense decimator offset control , */\ - { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8110, "invertpwm_left"}, /* Current sense common mode feedback pwm invert control for left channel, */\ - { 0x8122, "cmfb_gain_left"}, /* Current sense common mode feedback control gain for left channel, */\ - { 0x8154, "cmfb_offset_left"}, /* Current sense common mode feedback control offset for left channel, */\ - { 0x8200, "enbl_cmfb_right"}, /* Current sense common mode feedback control for right channel, */\ - { 0x8210, "invertpwm_right"}, /* Current sense common mode feedback pwm invert control for right channel, */\ - { 0x8222, "cmfb_gain_right"}, /* Current sense common mode feedback control gain for right channel, */\ - { 0x8254, "cmfb_offset_right"}, /* Current sense common mode feedback control offset for right channel, */\ - { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ - { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ - { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ - { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ - { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ - { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8600, "enbl_cs_adc_left"}, /* Enable current sense ADC , */\ - { 0x8610, "enbl_cs_inn1_left"}, /* Enable connection of current sense negative1 , */\ - { 0x8630, "enbl_cs_inp1_left"}, /* Enable connection of current sense positive1 , */\ - { 0x8650, "enbl_cs_ldo_left"}, /* Enable current sense LDO , */\ - { 0x8660, "enbl_cs_nofloating_n_left"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8670, "enbl_cs_nofloating_p_left"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8680, "enbl_cs_vbatldo_left"}, /* Enable of current sense LDO , */\ - { 0x8700, "enbl_cs_adc_right"}, /* Enable current sense ADC , */\ - { 0x8710, "enbl_cs_inn1_right"}, /* Enable connection of current sense negative1 , */\ - { 0x8730, "enbl_cs_inp1_right"}, /* Enable connection of current sense positive1 , */\ - { 0x8750, "enbl_cs_ldo_right"}, /* Enable current sense LDO , */\ - { 0x8760, "enbl_cs_nofloating_n_right"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8770, "enbl_cs_nofloating_p_right"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8780, "enbl_cs_vbatldo_right"}, /* Enable of current sense LDO , */\ - { 0x8800, "volsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ - { 0x8810, "volsense_dc_offset"}, /* Voltage sense decimator offset control , */\ - { 0x9000, "cf_rst_dsp"}, /* Reset , */\ - { 0x9011, "cf_dmem"}, /* Target memory , */\ - { 0x9030, "cf_aif"}, /* Auto increment , */\ - { 0x9040, "cf_int"}, /* Interrupt - auto clear , */\ - { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ - { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ - { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ - { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ - { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ - { 0x910f, "cf_madd"}, /* Memory address , */\ - { 0x920f, "cf_mema"}, /* Activate memory access , */\ - { 0x9307, "cf_err"}, /* Error flags , */\ - { 0x9387, "cf_ack"}, /* Acknowledge of requests , */\ - { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ - { 0x980f, "ivt_addr0_msb"}, /* Coolflux interrupt vector table address0 MSB , */\ - { 0x990f, "ivt_addr0_lsb"}, /* Coolflux interrupt vector table address0 LSB , */\ - { 0x9a0f, "ivt_addr1_msb"}, /* Coolflux interrupt vector table address1 MSB , */\ - { 0x9b0f, "ivt_addr1_lsb"}, /* Coolflux interrupt vector table address1 LSB , */\ - { 0x9c0f, "ivt_addr2_msb"}, /* Coolflux interrupt vector table address2 MSB , */\ - { 0x9d0f, "ivt_addr2_lsb"}, /* Coolflux interrupt vector table address2 LSB , */\ - { 0x9e0f, "ivt_addr3_msb"}, /* Coolflux interrupt vector table address3 MSB , */\ - { 0x9f0f, "ivt_addr3_lsb"}, /* Coolflux interrupt vector table address3 LSB , */\ - { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ - { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ - { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0xc3d0, "test_abistfft_enbl"}, /* FFT Coolflux , */\ - { 0xc3e0, "test_pwr_switch"}, /* Test mode for digital power switches core sw/mem sw/micvdd sw, */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc660, "bypass_diosw_ovp"}, /* Bypass ovp for memory switch diosw , */\ - { 0xc670, "enbl_powerswitch"}, /* Vddd core power switch control - overrules the manager control, */\ - { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to GPIO1 (see Digimux list for details), */\ - { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to GPIO2 (see Digimux list for details), */\ - { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to GPIO3 (see Digimux list for details), */\ - { 0xc887, "digimuxd_sel"}, /* DigimuxD input selection control routed to GPIO4 (see Digimux list for details), */\ - { 0xc901, "dio1_ehs"}, /* Speed/load setting for DIO1 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc921, "dio2_ehs"}, /* Speed/load setting for DIO2 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc941, "gainio_ehs"}, /* Speed/load setting for GAINIO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc961, "pdmo_ehs"}, /* Speed/load setting for PDMO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9a1, "tdo_ehs"}, /* Speed/load setting for TDO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xca40, "enbl_anamux5"}, /* Enable anamux5 , */\ - { 0xca50, "enbl_anamux6"}, /* Enable anamux6 , */\ - { 0xca60, "enbl_anamux7"}, /* Enable anamux7 , */\ - { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xcb54, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ - { 0xcba4, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ - { 0xcc04, "anamux5"}, /* Anamux selection control - anamux on TEST5 , */\ - { 0xcc54, "anamux6"}, /* Anamux selection control - anamux on TEST6 , */\ - { 0xcca4, "anamux7"}, /* Anamux selection control - anamux on TEST7 , */\ - { 0xcd05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ - { 0xcd64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ - { 0xcdb3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ - { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ - { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ - { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ - { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ - { 0xcec0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ - { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ - { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ - { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ - { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ - { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ - { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ - { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd243, "tsig_gain_left"}, /* Test signal gain for left channel , */\ - { 0xd283, "tsig_gain_right"}, /* Test signal gain for right channel , */\ - { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd506, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd570, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf163, "calibr_gain_left"}, /* HW gain module - left channel (2's complement) , */\ - { 0xf1a5, "calibr_offset_left"}, /* Offset for amplifier, HW gain module - left channel (2's complement), */\ - { 0xf203, "calibr_gain_right"}, /* HW gain module - right channel (2's complement) , */\ - { 0xf245, "calibr_offset_right"}, /* Offset for amplifier, HW gain module - right channel (2's complement), */\ - { 0xf2a3, "calibr_rcvldop_trim"}, /* Trimming of LDO (2.7V) , */\ - { 0xf307, "calibr_gain_cs_left"}, /* Current sense gain - left channel (signed two's complement format), */\ - { 0xf387, "calibr_gain_cs_right"}, /* Current sense gain - right channel (signed two's complement format), */\ - { 0xf40f, "calibr_R25C_L"}, /* Ron resistance of left channel speaker coil , */\ - { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of right channel speaker coil , */\ - { 0xf606, "ctrl_offset_a_left"}, /* Offset of left amplifier level shifter A , */\ - { 0xf686, "ctrl_offset_b_left"}, /* Offset of left amplifier level shifter B , */\ - { 0xf706, "ctrl_offset_a_right"}, /* Offset of right amplifier level shifter A , */\ - { 0xf786, "ctrl_offset_b_right"}, /* Offset of right amplifier level shifter B , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ - { 0xf910, "mtp_lock_enbl_coolflux"}, /* Disable function enbl_coolflux , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Disable programming of max dcdc boost voltage , */\ - { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf987, "type_bits_fw"}, /* MTP-control FW - See Firmware I2C API document for details, */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ - { 0xff05, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa2_irq { - tfa2_irq_stvdds = 0, - tfa2_irq_stplls = 1, - tfa2_irq_stotds = 2, - tfa2_irq_stovds = 3, - tfa2_irq_stuvds = 4, - tfa2_irq_stclks = 5, - tfa2_irq_stmtpb = 6, - tfa2_irq_stnoclk = 7, - tfa2_irq_stspks = 8, - tfa2_irq_stacs = 9, - tfa2_irq_stsws = 10, - tfa2_irq_stwds = 11, - tfa2_irq_stamps = 12, - tfa2_irq_starefs = 13, - tfa2_irq_stadccr = 14, - tfa2_irq_stbodnok = 15, - tfa2_irq_stbstcu = 16, - tfa2_irq_stbsthi = 17, - tfa2_irq_stbstoc = 18, - tfa2_irq_stbstpkcur = 19, - tfa2_irq_stbstvc = 20, - tfa2_irq_stbst86 = 21, - tfa2_irq_stbst93 = 22, - tfa2_irq_strcvld = 23, - tfa2_irq_stocpl = 24, - tfa2_irq_stocpr = 25, - tfa2_irq_stmwsrc = 26, - tfa2_irq_stmwcfc = 27, - tfa2_irq_stmwsmu = 28, - tfa2_irq_stcfmer = 29, - tfa2_irq_stcfmac = 30, - tfa2_irq_stclkoor = 31, - tfa2_irq_sttdmer = 32, - tfa2_irq_stclpl = 33, - tfa2_irq_stclpr = 34, - tfa2_irq_stocpm = 35, - tfa2_irq_max = 36, - tfa2_irq_all = -1 /* all irqs */}; - -#define TFA2_IRQ_NAMETABLE static tfaIrqName_t Tfa2IrqNames[] = {\ - { 0, "STVDDS"},\ - { 1, "STPLLS"},\ - { 2, "STOTDS"},\ - { 3, "STOVDS"},\ - { 4, "STUVDS"},\ - { 5, "STCLKS"},\ - { 6, "STMTPB"},\ - { 7, "STNOCLK"},\ - { 8, "STSPKS"},\ - { 9, "STACS"},\ - { 10, "STSWS"},\ - { 11, "STWDS"},\ - { 12, "STAMPS"},\ - { 13, "STAREFS"},\ - { 14, "STADCCR"},\ - { 15, "STBODNOK"},\ - { 16, "STBSTCU"},\ - { 17, "STBSTHI"},\ - { 18, "STBSTOC"},\ - { 19, "STBSTPKCUR"},\ - { 20, "STBSTVC"},\ - { 21, "STBST86"},\ - { 22, "STBST93"},\ - { 23, "STRCVLD"},\ - { 24, "STOCPL"},\ - { 25, "STOCPR"},\ - { 26, "STMWSRC"},\ - { 27, "STMWCFC"},\ - { 28, "STMWSMU"},\ - { 29, "STCFMER"},\ - { 30, "STCFMAC"},\ - { 31, "STCLKOOR"},\ - { 32, "STTDMER"},\ - { 33, "STCLPL"},\ - { 34, "STCLPR"},\ - { 35, "STOCPM"},\ - { 36, "36"},\ -}; diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_device_genregs_POR.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_device_genregs_POR.h deleted file mode 100644 index 2d41845e5be2..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_device_genregs_POR.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -/** Filename: Tfa98xx_device_genregs.h - * This file was generated automatically on 08/11/16 at 07:44:41. - * Source file: TFA9872N1B2_DefaultI2CSettings - V1.xlsx - */ - -#ifndef _TFA9872_DEVICE_GENREGS_H -#define _TFA9872_DEVICE_GENREGS_H - - -#define TFA9872_SYS_CONTROL0 0x00 -#define TFA9872_SYS_CONTROL1 0x01 -#define TFA9872_SYS_CONTROL2 0x02 -#define TFA9872_DEVICE_REVISION 0x03 -#define TFA9872_CLOCK_CONTROL 0x04 -#define TFA9872_CLOCK_GATING_CONTROL 0x05 -#define TFA9872_SIDE_TONE_CONFIG 0x0d -#define TFA9872_STATUS_FLAGS0 0x10 -#define TFA9872_STATUS_FLAGS1 0x11 -#define TFA9872_STATUS_FLAGS3 0x13 -#define TFA9872_STATUS_FLAGS4 0x14 -#define TFA9872_BATTERY_VOLTAGE 0x15 -#define TFA9872_TEMPERATURE 0x16 -#define TFA9872_VDDP_VOLTAGE 0x17 -#define TFA9872_TDM_CONFIG0 0x20 -#define TFA9872_TDM_CONFIG1 0x21 -#define TFA9872_TDM_CONFIG2 0x22 -#define TFA9872_TDM_CONFIG3 0x23 -#define TFA9872_TDM_CONFIG6 0x26 -#define TFA9872_TDM_CONFIG7 0x27 -#define TFA9872_PDM_CONFIG0 0x31 -#define TFA9872_INTERRUPT_OUT_REG1 0x40 -#define TFA9872_INTERRUPT_OUT_REG2 0x41 -#define TFA9872_INTERRUPT_OUT_REG3 0x42 -#define TFA9872_INTERRUPT_IN_REG1 0x44 -#define TFA9872_INTERRUPT_IN_REG2 0x45 -#define TFA9872_INTERRUPT_IN_REG3 0x46 -#define TFA9872_INTERRUPT_ENABLE_REG1 0x48 -#define TFA9872_INTERRUPT_ENABLE_REG2 0x49 -#define TFA9872_INTERRUPT_ENABLE_REG3 0x4a -#define TFA9872_STATUS_POLARITY_REG1 0x4c -#define TFA9872_STATUS_POLARITY_REG2 0x4d -#define TFA9872_STATUS_POLARITY_REG3 0x4e -#define TFA9872_BAT_PROT_CONFIG 0x50 -#define TFA9872_AUDIO_CONTROL 0x51 -#define TFA9872_AMPLIFIER_CONFIG 0x52 -#define TFA9872_PGA_CONTROL0 0x60 -#define TFA9872_GAIN_ATT 0x61 -#define TFA9872_TDM_SOURCE_CTRL 0x68 -#define TFA9872_SAM_CTRL 0x69 -#define TFA9872_STATUS_FLAGS5 0x6e -#define TFA9872_CURSENSE_COMP 0x6f -#define TFA9872_DCDC_CONTROL0 0x70 -#define TFA9872_DCDC_CONTROL4 0x74 -#define TFA9872_DCDC_CONTROL5 0x75 -#define TFA9872_MTPKEY2_REG 0xa1 -#define TFA9872_MTP_STATUS 0xa2 -#define TFA9872_KEY_PROTECTED_MTP_CONTROL 0xa3 -#define TFA9872_MTP_DATA_OUT_MSB 0xa5 -#define TFA9872_MTP_DATA_OUT_LSB 0xa6 -#define TFA9872_TEMP_SENSOR_CONFIG 0xb1 -#define TFA9872_SOFTWARE_PROFILE 0xee -#define TFA9872_SOFTWARE_VSTEP 0xef -#define TFA9872_KEY2_PROTECTED_MTP0 0xf0 -#define TFA9872_KEY2_PROTECTED_MTP5 0xf5 -#define TFA9872_SYS_CONTROL0_POR 0x0001 -#define TFA9872_SYS_CONTROL1_POR 0x0000 -#define TFA9872_SYS_CONTROL2_POR 0x2828 -#define TFA9872_DEVICE_REVISION_POR 0x3b72 -#define TFA9872_CLOCK_CONTROL_POR 0x0000 -#define TFA9872_CLOCK_GATING_CONTROL_POR 0x1f6a -#define TFA9872_SIDE_TONE_CONFIG_POR 0x0ebe -#define TFA9872_STATUS_FLAGS0_POR 0x001d -#define TFA9872_STATUS_FLAGS1_POR 0x0004 -#define TFA9872_STATUS_FLAGS3_POR 0x000f -#define TFA9872_STATUS_FLAGS4_POR 0x0000 -#define TFA9872_BATTERY_VOLTAGE_POR 0x03ff -#define TFA9872_TEMPERATURE_POR 0x0100 -#define TFA9872_VDDP_VOLTAGE_POR 0x0000 -#define TFA9872_TDM_CONFIG0_POR 0x2890 -#define TFA9872_TDM_CONFIG1_POR 0xc1f1 -#define TFA9872_TDM_CONFIG2_POR 0x045c -#define TFA9872_TDM_CONFIG3_POR 0x0003 -#define TFA9872_TDM_CONFIG6_POR 0x0010 -#define TFA9872_TDM_CONFIG7_POR 0x0001 -#define TFA9872_PDM_CONFIG0_POR 0x0000 -#define TFA9872_INTERRUPT_OUT_REG1_POR 0x0081 -#define TFA9872_INTERRUPT_OUT_REG2_POR 0x0000 -#define TFA9872_INTERRUPT_OUT_REG3_POR 0x0000 -#define TFA9872_INTERRUPT_IN_REG1_POR 0x0000 -#define TFA9872_INTERRUPT_IN_REG2_POR 0x0000 -#define TFA9872_INTERRUPT_IN_REG3_POR 0x0000 -#define TFA9872_INTERRUPT_ENABLE_REG1_POR 0x0001 -#define TFA9872_INTERRUPT_ENABLE_REG2_POR 0x0000 -#define TFA9872_INTERRUPT_ENABLE_REG3_POR 0x0000 -#define TFA9872_STATUS_POLARITY_REG1_POR 0x74e3 -#define TFA9872_STATUS_POLARITY_REG2_POR 0x967b -#define TFA9872_STATUS_POLARITY_REG3_POR 0x0085 -#define TFA9872_BAT_PROT_CONFIG_POR 0x8091 -#define TFA9872_AUDIO_CONTROL_POR 0x0080 -#define TFA9872_AMPLIFIER_CONFIG_POR 0x7a08 -#define TFA9872_PGA_CONTROL0_POR 0x0000 -#define TFA9872_GAIN_ATT_POR 0x0000 -#define TFA9872_TDM_SOURCE_CTRL_POR 0x0400 -#define TFA9872_SAM_CTRL_POR 0x0000 -#define TFA9872_STATUS_FLAGS5_POR 0x0007 -#define TFA9872_CURSENSE_COMP_POR 0x02e4 -#define TFA9872_DCDC_CONTROL0_POR 0x06e6 -#define TFA9872_DCDC_CONTROL4_POR 0xd913 -#define TFA9872_DCDC_CONTROL5_POR 0x118a -#define TFA9872_MTPKEY2_REG_POR 0x0000 -#define TFA9872_MTP_STATUS_POR 0x0003 -#define TFA9872_KEY_PROTECTED_MTP_CONTROL_POR 0x0000 -#define TFA9872_MTP_DATA_OUT_MSB_POR 0x0000 -#define TFA9872_MTP_DATA_OUT_LSB_POR 0x0000 -#define TFA9872_TEMP_SENSOR_CONFIG_POR 0x0000 -#define TFA9872_SOFTWARE_PROFILE_POR 0x0000 -#define TFA9872_SOFTWARE_VSTEP_POR 0x0000 -#define TFA9872_KEY2_PROTECTED_MTP0_POR 0x0000 -#define TFA9872_KEY2_PROTECTED_MTP5_POR 0x0000 - -#endif /* _TFA9872_DEVICE_GENREGS_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_tfafieldnames.h deleted file mode 100644 index 619cffdd9115..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9872_tfafieldnames.h +++ /dev/null @@ -1,1228 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9872_tfaFieldnames.h - * This file was generated automatically on 09/28/18 at 11:21:43. - * Source file: TFA9872N1B2_DefaultI2CSettings -v25.xlsx - */ - -#ifndef _TFA9872_TFAFIELDNAMES_H -#define _TFA9872_TFAFIELDNAMES_H - -#define TFA9872_I2CVERSION_N1A 26 -#define TFA9872_I2CVERSION_N1B 29 -#define TFA9872_I2CVERSION_N1B2 25 - -typedef enum Tfa9872BfEnumList { - TFA9872_BF_PWDN = 0x0000, /*!< Powerdown selection */ - TFA9872_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ - TFA9872_BF_AMPE = 0x0030, /*!< Activate Amplifier */ - TFA9872_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ - TFA9872_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9872_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ - TFA9872_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ - TFA9872_BF_MANSCONF = 0x0120, /*!< I2C configured */ - TFA9872_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ - TFA9872_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ - TFA9872_BF_RCVNS = 0x01e0, /*!< Noise shaper selection */ - TFA9872_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ - TFA9872_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9872_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ - TFA9872_BF_BYPHVBF = 0x02b0, /*!< Bypass HVBAT filter */ - TFA9872_BF_REV = 0x030f, /*!< Revision info */ - TFA9872_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ - TFA9872_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ - TFA9872_BF_SSE = 0x0510, /*!< Enable speaker path */ - TFA9872_BF_VSE = 0x0530, /*!< Voltage sense */ - TFA9872_BF_CSE = 0x0550, /*!< Current sense */ - TFA9872_BF_SSPDME = 0x0560, /*!< Sub-system PDM */ - TFA9872_BF_PGAE = 0x0580, /*!< Enable PGA chop clock */ - TFA9872_BF_SSTDME = 0x0590, /*!< Sub-system TDM */ - TFA9872_BF_SSPBSTE = 0x05a0, /*!< Sub-system boost */ - TFA9872_BF_SSADCE = 0x05b0, /*!< Sub-system ADC */ - TFA9872_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ - TFA9872_BF_STGAIN = 0x0d18, /*!< Side tone gain */ - TFA9872_BF_STSMUTE = 0x0da0, /*!< Side tone soft mute */ - TFA9872_BF_ST1C = 0x0db0, /*!< side tone one s complement */ - TFA9872_BF_VDDS = 0x1000, /*!< POR */ - TFA9872_BF_PLLS = 0x1010, /*!< PLL lock */ - TFA9872_BF_OTDS = 0x1020, /*!< OTP alarm */ - TFA9872_BF_OVDS = 0x1030, /*!< OVP alarm */ - TFA9872_BF_UVDS = 0x1040, /*!< UVP alarm */ - TFA9872_BF_CLKS = 0x1050, /*!< Clocks stable */ - TFA9872_BF_MTPB = 0x1060, /*!< MTP busy */ - TFA9872_BF_NOCLK = 0x1070, /*!< Lost clock */ - TFA9872_BF_SWS = 0x10a0, /*!< Amplifier engage */ - TFA9872_BF_AMPS = 0x10c0, /*!< Amplifier enable */ - TFA9872_BF_AREFS = 0x10d0, /*!< References enable */ - TFA9872_BF_ADCCR = 0x10e0, /*!< Control ADC */ - TFA9872_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9872_BF_DCDCA = 0x1110, /*!< DCDC active */ - TFA9872_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos */ - TFA9872_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ - TFA9872_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ - TFA9872_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ - TFA9872_BF_STMUTEB = 0x1170, /*!< side tone (un)mute busy */ - TFA9872_BF_STMUTE = 0x1180, /*!< side tone mute state */ - TFA9872_BF_TDMLUTER = 0x1190, /*!< TDM LUT error */ - TFA9872_BF_TDMSTAT = 0x11a2, /*!< TDM status bits */ - TFA9872_BF_TDMERR = 0x11d0, /*!< TDM error */ - TFA9872_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ - TFA9872_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ - TFA9872_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ - TFA9872_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ - TFA9872_BF_CLIPAH = 0x1340, /*!< Clipping A to Vddp */ - TFA9872_BF_CLIPAL = 0x1350, /*!< Clipping A to gnd */ - TFA9872_BF_CLIPBH = 0x1360, /*!< Clipping B to Vddp */ - TFA9872_BF_CLIPBL = 0x1370, /*!< Clipping B to gnd */ - TFA9872_BF_OCDS = 0x1380, /*!< OCP amplifier */ - TFA9872_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ - TFA9872_BF_OCPOKMC = 0x13a0, /*!< OCPOK MICVDD */ - TFA9872_BF_MANALARM = 0x13b0, /*!< Alarm state */ - TFA9872_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ - TFA9872_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ - TFA9872_BF_MANOPER = 0x13f0, /*!< Operating state */ - TFA9872_BF_CLKOOR = 0x1420, /*!< External clock status */ - TFA9872_BF_MANSTATE = 0x1433, /*!< Device manager status */ - TFA9872_BF_DCMODE = 0x1471, /*!< DCDC mode status bits */ - TFA9872_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9872_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9872_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/9.5 V) */ - TFA9872_BF_TDME = 0x2040, /*!< Enable interface */ - TFA9872_BF_TDMMODE = 0x2050, /*!< Slave/master */ - TFA9872_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ - TFA9872_BF_TDMFSLN = 0x2073, /*!< FS length (master mode only) */ - TFA9872_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ - TFA9872_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ - TFA9872_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ - TFA9872_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ - TFA9872_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ - TFA9872_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ - TFA9872_BF_TDMADJ = 0x21f0, /*!< data adjustment */ - TFA9872_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ - TFA9872_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ - TFA9872_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ - TFA9872_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ - TFA9872_BF_TDMSPKE = 0x2300, /*!< Control audio tdm channel in 0 (spkr + dcdc) */ - TFA9872_BF_TDMDCE = 0x2310, /*!< Control audio tdm channel in 1 (dcdc) */ - TFA9872_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ - TFA9872_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ - TFA9872_BF_TDMSPKS = 0x2603, /*!< tdm slot for sink 0 (speaker + dcdc) */ - TFA9872_BF_TDMDCS = 0x2643, /*!< tdm slot for sink 1 (dcdc) */ - TFA9872_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ - TFA9872_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ - TFA9872_BF_PDMSTSEL = 0x3111, /*!< Side tone input */ - TFA9872_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9872_BF_ISTPLLS = 0x4010, /*!< Status PLL lock */ - TFA9872_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9872_BF_ISTOVDS = 0x4030, /*!< Status OVP alarm */ - TFA9872_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9872_BF_ISTCLKS = 0x4050, /*!< Status clocks stable */ - TFA9872_BF_ISTMTPB = 0x4060, /*!< Status MTP busy */ - TFA9872_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9872_BF_ISTSWS = 0x40a0, /*!< Status amplifier engage */ - TFA9872_BF_ISTAMPS = 0x40c0, /*!< Status amplifier enable */ - TFA9872_BF_ISTAREFS = 0x40d0, /*!< Status Ref enable */ - TFA9872_BF_ISTADCCR = 0x40e0, /*!< Status Control ADC */ - TFA9872_BF_ISTBSTCU = 0x4100, /*!< Status DCDC current limiting */ - TFA9872_BF_ISTBSTHI = 0x4110, /*!< Status DCDC active */ - TFA9872_BF_ISTBSTOC = 0x4120, /*!< Status DCDC OCP */ - TFA9872_BF_ISTBSTPKCUR = 0x4130, /*!< Status bst peakcur */ - TFA9872_BF_ISTBSTVC = 0x4140, /*!< Status DCDC level 1x */ - TFA9872_BF_ISTBST86 = 0x4150, /*!< Status DCDC level 1.14x */ - TFA9872_BF_ISTBST93 = 0x4160, /*!< Status DCDC level 1.07x */ - TFA9872_BF_ISTOCPR = 0x4190, /*!< Status ocp alarm */ - TFA9872_BF_ISTMWSRC = 0x41a0, /*!< Status Waits HW I2C settings */ - TFA9872_BF_ISTMWSMU = 0x41c0, /*!< Status Audio mute sequence */ - TFA9872_BF_ISTCLKOOR = 0x41f0, /*!< Status flag_clk_out_of_range */ - TFA9872_BF_ISTTDMER = 0x4200, /*!< Status tdm error */ - TFA9872_BF_ISTCLPR = 0x4220, /*!< Status clip */ - TFA9872_BF_ISTLP0 = 0x4240, /*!< Status low power mode0 */ - TFA9872_BF_ISTLP1 = 0x4250, /*!< Status low power mode1 */ - TFA9872_BF_ISTLA = 0x4260, /*!< Status low noise detection */ - TFA9872_BF_ISTVDDPH = 0x4270, /*!< Status VDDP greater than VBAT */ - TFA9872_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9872_BF_ICLPLLS = 0x4410, /*!< Clear PLL lock */ - TFA9872_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9872_BF_ICLOVDS = 0x4430, /*!< Clear OVP alarm */ - TFA9872_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9872_BF_ICLCLKS = 0x4450, /*!< Clear clocks stable */ - TFA9872_BF_ICLMTPB = 0x4460, /*!< Clear mtp busy */ - TFA9872_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9872_BF_ICLSWS = 0x44a0, /*!< Clear amplifier engage */ - TFA9872_BF_ICLAMPS = 0x44c0, /*!< Clear enbl amp */ - TFA9872_BF_ICLAREFS = 0x44d0, /*!< Clear ref enable */ - TFA9872_BF_ICLADCCR = 0x44e0, /*!< Clear control ADC */ - TFA9872_BF_ICLBSTCU = 0x4500, /*!< Clear DCDC current limiting */ - TFA9872_BF_ICLBSTHI = 0x4510, /*!< Clear DCDC active */ - TFA9872_BF_ICLBSTOC = 0x4520, /*!< Clear DCDC OCP */ - TFA9872_BF_ICLBSTPC = 0x4530, /*!< Clear bst peakcur */ - TFA9872_BF_ICLBSTVC = 0x4540, /*!< Clear DCDC level 1x */ - TFA9872_BF_ICLBST86 = 0x4550, /*!< Clear DCDC level 1.14x */ - TFA9872_BF_ICLBST93 = 0x4560, /*!< Clear DCDC level 1.07x */ - TFA9872_BF_ICLOCPR = 0x4590, /*!< Clear ocp alarm */ - TFA9872_BF_ICLMWSRC = 0x45a0, /*!< Clear wait HW I2C settings */ - TFA9872_BF_ICLMWSMU = 0x45c0, /*!< Clear audio mute sequence */ - TFA9872_BF_ICLCLKOOR = 0x45f0, /*!< Clear flag_clk_out_of_range */ - TFA9872_BF_ICLTDMER = 0x4600, /*!< Clear tdm error */ - TFA9872_BF_ICLCLPR = 0x4620, /*!< Clear clip */ - TFA9872_BF_ICLLP0 = 0x4640, /*!< Clear low power mode0 */ - TFA9872_BF_ICLLP1 = 0x4650, /*!< Clear low power mode1 */ - TFA9872_BF_ICLLA = 0x4660, /*!< Clear low noise detection */ - TFA9872_BF_ICLVDDPH = 0x4670, /*!< Clear VDDP greater then VBAT */ - TFA9872_BF_IEVDDS = 0x4800, /*!< Enable por */ - TFA9872_BF_IEPLLS = 0x4810, /*!< Enable pll lock */ - TFA9872_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9872_BF_IEOVDS = 0x4830, /*!< Enable OVP alarm */ - TFA9872_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9872_BF_IECLKS = 0x4850, /*!< Enable clocks stable */ - TFA9872_BF_IEMTPB = 0x4860, /*!< Enable mtp busy */ - TFA9872_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9872_BF_IESWS = 0x48a0, /*!< Enable amplifier engage */ - TFA9872_BF_IEAMPS = 0x48c0, /*!< Enable enbl amp */ - TFA9872_BF_IEAREFS = 0x48d0, /*!< Enable ref enable */ - TFA9872_BF_IEADCCR = 0x48e0, /*!< Enable Control ADC */ - TFA9872_BF_IEBSTCU = 0x4900, /*!< Enable DCDC current limiting */ - TFA9872_BF_IEBSTHI = 0x4910, /*!< Enable DCDC active */ - TFA9872_BF_IEBSTOC = 0x4920, /*!< Enable DCDC OCP */ - TFA9872_BF_IEBSTPC = 0x4930, /*!< Enable bst peakcur */ - TFA9872_BF_IEBSTVC = 0x4940, /*!< Enable DCDC level 1x */ - TFA9872_BF_IEBST86 = 0x4950, /*!< Enable DCDC level 1.14x */ - TFA9872_BF_IEBST93 = 0x4960, /*!< Enable DCDC level 1.07x */ - TFA9872_BF_IEOCPR = 0x4990, /*!< Enable ocp alarm */ - TFA9872_BF_IEMWSRC = 0x49a0, /*!< Enable waits HW I2C settings */ - TFA9872_BF_IEMWSMU = 0x49c0, /*!< Enable man Audio mute sequence */ - TFA9872_BF_IECLKOOR = 0x49f0, /*!< Enable flag_clk_out_of_range */ - TFA9872_BF_IETDMER = 0x4a00, /*!< Enable tdm error */ - TFA9872_BF_IECLPR = 0x4a20, /*!< Enable clip */ - TFA9872_BF_IELP0 = 0x4a40, /*!< Enable low power mode0 */ - TFA9872_BF_IELP1 = 0x4a50, /*!< Enable low power mode1 */ - TFA9872_BF_IELA = 0x4a60, /*!< Enable low noise detection */ - TFA9872_BF_IEVDDPH = 0x4a70, /*!< Enable VDDP greater tehn VBAT */ - TFA9872_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ - TFA9872_BF_IPOPLLS = 0x4c10, /*!< Polarity pll lock */ - TFA9872_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9872_BF_IPOOVDS = 0x4c30, /*!< Polarity OVP alarm */ - TFA9872_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9872_BF_IPOCLKS = 0x4c50, /*!< Polarity clocks stable */ - TFA9872_BF_IPOMTPB = 0x4c60, /*!< Polarity mtp busy */ - TFA9872_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9872_BF_IPOSWS = 0x4ca0, /*!< Polarity amplifier engage */ - TFA9872_BF_IPOAMPS = 0x4cc0, /*!< Polarity enbl amp */ - TFA9872_BF_IPOAREFS = 0x4cd0, /*!< Polarity ref enable */ - TFA9872_BF_IPOADCCR = 0x4ce0, /*!< Polarity Control ADC */ - TFA9872_BF_IPOBSTCU = 0x4d00, /*!< Polarity DCDC current limiting */ - TFA9872_BF_IPOBSTHI = 0x4d10, /*!< Polarity DCDC active */ - TFA9872_BF_IPOBSTOC = 0x4d20, /*!< Polarity DCDC OCP */ - TFA9872_BF_IPOBSTPC = 0x4d30, /*!< Polarity bst peakcur */ - TFA9872_BF_IPOBSTVC = 0x4d40, /*!< Polarity DCDC level 1x */ - TFA9872_BF_IPOBST86 = 0x4d50, /*!< Polarity DCDC level 1.14x */ - TFA9872_BF_IPOBST93 = 0x4d60, /*!< Polarity DCDC level 1.07x */ - TFA9872_BF_IPOOCPR = 0x4d90, /*!< Polarity ocp alarm */ - TFA9872_BF_IPOMWSRC = 0x4da0, /*!< Polarity waits HW I2C settings */ - TFA9872_BF_IPOMWSMU = 0x4dc0, /*!< Polarity man audio mute sequence */ - TFA9872_BF_IPCLKOOR = 0x4df0, /*!< Polarity flag_clk_out_of_range */ - TFA9872_BF_IPOTDMER = 0x4e00, /*!< Polarity tdm error */ - TFA9872_BF_IPOCLPR = 0x4e20, /*!< Polarity clip right */ - TFA9872_BF_IPOLP0 = 0x4e40, /*!< Polarity low power mode0 */ - TFA9872_BF_IPOLP1 = 0x4e50, /*!< Polarity low power mode1 */ - TFA9872_BF_IPOLA = 0x4e60, /*!< Polarity low noise mode */ - TFA9872_BF_IPOVDDPH = 0x4e70, /*!< Polarity VDDP greater than VBAT */ - TFA9872_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time */ - TFA9872_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ - TFA9872_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ - TFA9872_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9872_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ - TFA9872_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ - TFA9872_BF_INTSMUTE = 0x5110, /*!< Soft mute HW */ - TFA9872_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ - TFA9872_BF_DPSA = 0x5170, /*!< Enable DPSA */ - TFA9872_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ - TFA9872_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ - TFA9872_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ - TFA9872_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ - TFA9872_BF_PGAGAIN = 0x6081, /*!< PGA gain selection */ - TFA9872_BF_PGALPE = 0x60b0, /*!< Lowpass enable */ - TFA9872_BF_LPM0BYP = 0x6110, /*!< bypass low power idle mode */ - TFA9872_BF_TDMDCG = 0x6123, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ - TFA9872_BF_TDMSPKG = 0x6163, /*!< Total gain depending on INPLEV setting (channel 0) */ - TFA9872_BF_STIDLEEN = 0x61b0, /*!< enable idle feature for channel 1 */ - TFA9872_BF_LNMODE = 0x62e1, /*!< ctrl select mode */ - TFA9872_BF_LPM1MODE = 0x64e1, /*!< low power mode control */ - TFA9872_BF_LPM1DIS = 0x65c0, /*!< low power mode1 detector control */ - TFA9872_BF_TDMSRCMAP = 0x6801, /*!< tdm source mapping */ - TFA9872_BF_TDMSRCAS = 0x6821, /*!< Sensed value A */ - TFA9872_BF_TDMSRCBS = 0x6841, /*!< Sensed value B */ - TFA9872_BF_ANCSEL = 0x6881, /*!< anc input */ - TFA9872_BF_ANC1C = 0x68a0, /*!< ANC one s complement */ - TFA9872_BF_SAMMODE = 0x6901, /*!< sam enable */ - TFA9872_BF_SAMSEL = 0x6920, /*!< sam source */ - TFA9872_BF_PDMOSELH = 0x6931, /*!< pdm out value when pdm_clk is higth */ - TFA9872_BF_PDMOSELL = 0x6951, /*!< pdm out value when pdm_clk is low */ - TFA9872_BF_SAMOSEL = 0x6970, /*!< ram output on mode sam and audio */ - TFA9872_BF_LP0 = 0x6e00, /*!< low power mode 0 detection */ - TFA9872_BF_LP1 = 0x6e10, /*!< low power mode 1 detection */ - TFA9872_BF_LA = 0x6e20, /*!< low amplitude detection */ - TFA9872_BF_VDDPH = 0x6e30, /*!< vddp greater than vbat */ - TFA9872_BF_DELCURCOMP = 0x6f02, /*!< delay to allign compensation signal with current sense signal */ - TFA9872_BF_SIGCURCOMP = 0x6f40, /*!< polarity of compensation for current sense */ - TFA9872_BF_ENCURCOMP = 0x6f50, /*!< enable current sense compensation */ - TFA9872_BF_SELCLPPWM = 0x6f60, /*!< Select pwm clip flag */ - TFA9872_BF_LVLCLPPWM = 0x6f72, /*!< set the amount of pwm pulse that may be skipped before clip-flag is triggered */ - TFA9872_BF_DCVOS = 0x7002, /*!< Second boost voltage level */ - TFA9872_BF_DCMCC = 0x7033, /*!< Max coil current */ - TFA9872_BF_DCCV = 0x7071, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ - TFA9872_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ - TFA9872_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ - TFA9872_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ - TFA9872_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ - TFA9872_BF_DCVOF = 0x7402, /*!< 1st boost voltage level */ - TFA9872_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ - TFA9872_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9872_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ - TFA9872_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9872_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9872_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ - TFA9872_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9872_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9872_BF_CMTPI = 0xa350, /*!< Start copying all the data from mtp to I2C mtp registers */ - TFA9872_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ - TFA9872_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9872_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9872_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9872_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9872_BF_SWPROFIL = 0xee0f, /*!< Software profile data */ - TFA9872_BF_SWVSTEP = 0xef0f, /*!< Software vstep information */ - TFA9872_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9872_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9872_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9872_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9872_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9872_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9872_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ -} Tfa9872BfEnumList_t; -#define TFA9872_NAMETABLE static tfaBfName_t Tfa9872DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown selection , */\ - { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ - { 0x30, "AMPE"}, /* Activate Amplifier , */\ - { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xc0, "TSTOCP"}, /* OCP testing control , */\ - { 0x120, "MANSCONF"}, /* I2C configured , */\ - { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ - { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1e0, "RCVNS"}, /* Noise shaper selection , */\ - { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ - { 0x2b0, "BYPHVBF"}, /* Bypass HVBAT filter , */\ - { 0x30f, "REV"}, /* Revision info , */\ - { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ - { 0x510, "SSE"}, /* Enable speaker path , */\ - { 0x530, "VSE"}, /* Voltage sense , */\ - { 0x550, "CSE"}, /* Current sense , */\ - { 0x560, "SSPDME"}, /* Sub-system PDM , */\ - { 0x580, "PGAE"}, /* Enable PGA chop clock , */\ - { 0x590, "SSTDME"}, /* Sub-system TDM , */\ - { 0x5a0, "SSPBSTE"}, /* Sub-system boost , */\ - { 0x5b0, "SSADCE"}, /* Sub-system ADC , */\ - { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ - { 0xd18, "STGAIN"}, /* Side tone gain , */\ - { 0xda0, "STSMUTE"}, /* Side tone soft mute , */\ - { 0xdb0, "ST1C"}, /* side tone one s complement , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "PLLS"}, /* PLL lock , */\ - { 0x1020, "OTDS"}, /* OTP alarm , */\ - { 0x1030, "OVDS"}, /* OVP alarm , */\ - { 0x1040, "UVDS"}, /* UVP alarm , */\ - { 0x1050, "CLKS"}, /* Clocks stable , */\ - { 0x1060, "MTPB"}, /* MTP busy , */\ - { 0x1070, "NOCLK"}, /* Lost clock , */\ - { 0x10a0, "SWS"}, /* Amplifier engage , */\ - { 0x10c0, "AMPS"}, /* Amplifier enable , */\ - { 0x10d0, "AREFS"}, /* References enable , */\ - { 0x10e0, "ADCCR"}, /* Control ADC , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active , */\ - { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos , */\ - { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1170, "STMUTEB"}, /* side tone (un)mute busy , */\ - { 0x1180, "STMUTE"}, /* side tone mute state , */\ - { 0x1190, "TDMLUTER"}, /* TDM LUT error , */\ - { 0x11a2, "TDMSTAT"}, /* TDM status bits , */\ - { 0x11d0, "TDMERR"}, /* TDM error , */\ - { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ - { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ - { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ - { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ - { 0x1340, "CLIPAH"}, /* Clipping A to Vddp , */\ - { 0x1350, "CLIPAL"}, /* Clipping A to gnd , */\ - { 0x1360, "CLIPBH"}, /* Clipping B to Vddp , */\ - { 0x1370, "CLIPBL"}, /* Clipping B to gnd , */\ - { 0x1380, "OCDS"}, /* OCP amplifier , */\ - { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ - { 0x13a0, "OCPOKMC"}, /* OCPOK MICVDD , */\ - { 0x13b0, "MANALARM"}, /* Alarm state , */\ - { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ - { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x13f0, "MANOPER"}, /* Operating state , */\ - { 0x1420, "CLKOOR"}, /* External clock status , */\ - { 0x1433, "MANSTATE"}, /* Device manager status , */\ - { 0x1471, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/9.5 V) , */\ - { 0x2040, "TDME"}, /* Enable interface , */\ - { 0x2050, "TDMMODE"}, /* Slave/master , */\ - { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2073, "TDMFSLN"}, /* FS length (master mode only) , */\ - { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ - { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ - { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ - { 0x21f0, "TDMADJ"}, /* data adjustment , */\ - { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ - { 0x2300, "TDMSPKE"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ - { 0x2310, "TDMDCE"}, /* Control audio tdm channel in 1 (dcdc) , */\ - { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "TDMSPKS"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ - { 0x2643, "TDMDCS"}, /* tdm slot for sink 1 (dcdc) , */\ - { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x3111, "PDMSTSEL"}, /* Side tone input , */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTPLLS"}, /* Status PLL lock , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOVDS"}, /* Status OVP alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTCLKS"}, /* Status clocks stable , */\ - { 0x4060, "ISTMTPB"}, /* Status MTP busy , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x40a0, "ISTSWS"}, /* Status amplifier engage , */\ - { 0x40c0, "ISTAMPS"}, /* Status amplifier enable , */\ - { 0x40d0, "ISTAREFS"}, /* Status Ref enable , */\ - { 0x40e0, "ISTADCCR"}, /* Status Control ADC , */\ - { 0x4100, "ISTBSTCU"}, /* Status DCDC current limiting , */\ - { 0x4110, "ISTBSTHI"}, /* Status DCDC active , */\ - { 0x4120, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4130, "ISTBSTPKCUR"}, /* Status bst peakcur , */\ - { 0x4140, "ISTBSTVC"}, /* Status DCDC level 1x , */\ - { 0x4150, "ISTBST86"}, /* Status DCDC level 1.14x , */\ - { 0x4160, "ISTBST93"}, /* Status DCDC level 1.07x , */\ - { 0x4190, "ISTOCPR"}, /* Status ocp alarm , */\ - { 0x41a0, "ISTMWSRC"}, /* Status Waits HW I2C settings , */\ - { 0x41c0, "ISTMWSMU"}, /* Status Audio mute sequence , */\ - { 0x41f0, "ISTCLKOOR"}, /* Status flag_clk_out_of_range , */\ - { 0x4200, "ISTTDMER"}, /* Status tdm error , */\ - { 0x4220, "ISTCLPR"}, /* Status clip , */\ - { 0x4240, "ISTLP0"}, /* Status low power mode0 , */\ - { 0x4250, "ISTLP1"}, /* Status low power mode1 , */\ - { 0x4260, "ISTLA"}, /* Status low noise detection , */\ - { 0x4270, "ISTVDDPH"}, /* Status VDDP greater than VBAT , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLPLLS"}, /* Clear PLL lock , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOVDS"}, /* Clear OVP alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLCLKS"}, /* Clear clocks stable , */\ - { 0x4460, "ICLMTPB"}, /* Clear mtp busy , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x44a0, "ICLSWS"}, /* Clear amplifier engage , */\ - { 0x44c0, "ICLAMPS"}, /* Clear enbl amp , */\ - { 0x44d0, "ICLAREFS"}, /* Clear ref enable , */\ - { 0x44e0, "ICLADCCR"}, /* Clear control ADC , */\ - { 0x4500, "ICLBSTCU"}, /* Clear DCDC current limiting , */\ - { 0x4510, "ICLBSTHI"}, /* Clear DCDC active , */\ - { 0x4520, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4530, "ICLBSTPC"}, /* Clear bst peakcur , */\ - { 0x4540, "ICLBSTVC"}, /* Clear DCDC level 1x , */\ - { 0x4550, "ICLBST86"}, /* Clear DCDC level 1.14x , */\ - { 0x4560, "ICLBST93"}, /* Clear DCDC level 1.07x , */\ - { 0x4590, "ICLOCPR"}, /* Clear ocp alarm , */\ - { 0x45a0, "ICLMWSRC"}, /* Clear wait HW I2C settings , */\ - { 0x45c0, "ICLMWSMU"}, /* Clear audio mute sequence , */\ - { 0x45f0, "ICLCLKOOR"}, /* Clear flag_clk_out_of_range , */\ - { 0x4600, "ICLTDMER"}, /* Clear tdm error , */\ - { 0x4620, "ICLCLPR"}, /* Clear clip , */\ - { 0x4640, "ICLLP0"}, /* Clear low power mode0 , */\ - { 0x4650, "ICLLP1"}, /* Clear low power mode1 , */\ - { 0x4660, "ICLLA"}, /* Clear low noise detection , */\ - { 0x4670, "ICLVDDPH"}, /* Clear VDDP greater then VBAT , */\ - { 0x4800, "IEVDDS"}, /* Enable por , */\ - { 0x4810, "IEPLLS"}, /* Enable pll lock , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOVDS"}, /* Enable OVP alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IECLKS"}, /* Enable clocks stable , */\ - { 0x4860, "IEMTPB"}, /* Enable mtp busy , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x48a0, "IESWS"}, /* Enable amplifier engage , */\ - { 0x48c0, "IEAMPS"}, /* Enable enbl amp , */\ - { 0x48d0, "IEAREFS"}, /* Enable ref enable , */\ - { 0x48e0, "IEADCCR"}, /* Enable Control ADC , */\ - { 0x4900, "IEBSTCU"}, /* Enable DCDC current limiting , */\ - { 0x4910, "IEBSTHI"}, /* Enable DCDC active , */\ - { 0x4920, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4930, "IEBSTPC"}, /* Enable bst peakcur , */\ - { 0x4940, "IEBSTVC"}, /* Enable DCDC level 1x , */\ - { 0x4950, "IEBST86"}, /* Enable DCDC level 1.14x , */\ - { 0x4960, "IEBST93"}, /* Enable DCDC level 1.07x , */\ - { 0x4990, "IEOCPR"}, /* Enable ocp alarm , */\ - { 0x49a0, "IEMWSRC"}, /* Enable waits HW I2C settings , */\ - { 0x49c0, "IEMWSMU"}, /* Enable man Audio mute sequence , */\ - { 0x49f0, "IECLKOOR"}, /* Enable flag_clk_out_of_range , */\ - { 0x4a00, "IETDMER"}, /* Enable tdm error , */\ - { 0x4a20, "IECLPR"}, /* Enable clip , */\ - { 0x4a40, "IELP0"}, /* Enable low power mode0 , */\ - { 0x4a50, "IELP1"}, /* Enable low power mode1 , */\ - { 0x4a60, "IELA"}, /* Enable low noise detection , */\ - { 0x4a70, "IEVDDPH"}, /* Enable VDDP greater tehn VBAT , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ - { 0x4c10, "IPOPLLS"}, /* Polarity pll lock , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOVDS"}, /* Polarity OVP alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOCLKS"}, /* Polarity clocks stable , */\ - { 0x4c60, "IPOMTPB"}, /* Polarity mtp busy , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x4ca0, "IPOSWS"}, /* Polarity amplifier engage , */\ - { 0x4cc0, "IPOAMPS"}, /* Polarity enbl amp , */\ - { 0x4cd0, "IPOAREFS"}, /* Polarity ref enable , */\ - { 0x4ce0, "IPOADCCR"}, /* Polarity Control ADC , */\ - { 0x4d00, "IPOBSTCU"}, /* Polarity DCDC current limiting , */\ - { 0x4d10, "IPOBSTHI"}, /* Polarity DCDC active , */\ - { 0x4d20, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4d30, "IPOBSTPC"}, /* Polarity bst peakcur , */\ - { 0x4d40, "IPOBSTVC"}, /* Polarity DCDC level 1x , */\ - { 0x4d50, "IPOBST86"}, /* Polarity DCDC level 1.14x , */\ - { 0x4d60, "IPOBST93"}, /* Polarity DCDC level 1.07x , */\ - { 0x4d90, "IPOOCPR"}, /* Polarity ocp alarm , */\ - { 0x4da0, "IPOMWSRC"}, /* Polarity waits HW I2C settings , */\ - { 0x4dc0, "IPOMWSMU"}, /* Polarity man audio mute sequence , */\ - { 0x4df0, "IPCLKOOR"}, /* Polarity flag_clk_out_of_range , */\ - { 0x4e00, "IPOTDMER"}, /* Polarity tdm error , */\ - { 0x4e20, "IPOCLPR"}, /* Polarity clip right , */\ - { 0x4e40, "IPOLP0"}, /* Polarity low power mode0 , */\ - { 0x4e50, "IPOLP1"}, /* Polarity low power mode1 , */\ - { 0x4e60, "IPOLA"}, /* Polarity low noise mode , */\ - { 0x4e70, "IPOVDDPH"}, /* Polarity VDDP greater than VBAT , */\ - { 0x5001, "BSSCR"}, /* Battery Safeguard attack time , */\ - { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ - { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ - { 0x5110, "INTSMUTE"}, /* Soft mute HW , */\ - { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ - { 0x5170, "DPSA"}, /* Enable DPSA , */\ - { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ - { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ - { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ - { 0x6081, "PGAGAIN"}, /* PGA gain selection , */\ - { 0x60b0, "PGALPE"}, /* Lowpass enable , */\ - { 0x6110, "LPM0BYP"}, /* bypass low power idle mode , */\ - { 0x6123, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x6163, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x61b0, "STIDLEEN"}, /* enable idle feature for channel 1 , */\ - { 0x62e1, "LNMODE"}, /* ctrl select mode , */\ - { 0x64e1, "LPM1MODE"}, /* low power mode control , */\ - { 0x65c0, "LPM1DIS"}, /* low power mode1 detector control , */\ - { 0x6801, "TDMSRCMAP"}, /* tdm source mapping , */\ - { 0x6821, "TDMSRCAS"}, /* Sensed value A , */\ - { 0x6841, "TDMSRCBS"}, /* Sensed value B , */\ - { 0x6881, "ANCSEL"}, /* anc input , */\ - { 0x68a0, "ANC1C"}, /* ANC one s complement , */\ - { 0x6901, "SAMMODE"}, /* sam enable , */\ - { 0x6920, "SAMSEL"}, /* sam source , */\ - { 0x6931, "PDMOSELH"}, /* pdm out value when pdm_clk is higth , */\ - { 0x6951, "PDMOSELL"}, /* pdm out value when pdm_clk is low , */\ - { 0x6970, "SAMOSEL"}, /* ram output on mode sam and audio , */\ - { 0x6e00, "LP0"}, /* low power mode 0 detection , */\ - { 0x6e10, "LP1"}, /* low power mode 1 detection , */\ - { 0x6e20, "LA"}, /* low amplitude detection , */\ - { 0x6e30, "VDDPH"}, /* vddp greater than vbat , */\ - { 0x6f02, "DELCURCOMP"}, /* delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "SIGCURCOMP"}, /* polarity of compensation for current sense , */\ - { 0x6f50, "ENCURCOMP"}, /* enable current sense compensation , */\ - { 0x6f60, "SELCLPPWM"}, /* Select pwm clip flag , */\ - { 0x6f72, "LVLCLPPWM"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7002, "DCVOS"}, /* Second boost voltage level , */\ - { 0x7033, "DCMCC"}, /* Max coil current , */\ - { 0x7071, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ - { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ - { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ - { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7402, "DCVOF"}, /* 1st boost voltage level , */\ - { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa350, "CMTPI"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xee0f, "SWPROFIL"}, /* Software profile data , */\ - { 0xef0f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9872_BITNAMETABLE static tfaBfName_t Tfa9872BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown selection , */\ - { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ - { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ - { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xc0, "test_ocp"}, /* OCP testing control , */\ - { 0x120, "src_set_configured"}, /* I2C configured , */\ - { 0x140, "enbl_osc1m_auto_off"}, /* Internal osc off at PWDN , */\ - { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ - { 0x2b0, "bypass_hvbat_filter"}, /* Bypass HVBAT filter , */\ - { 0x2d0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ - { 0x30f, "device_rev"}, /* Revision info , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ - { 0x510, "enbl_spkr_ss"}, /* Enable speaker path , */\ - { 0x530, "enbl_volsense"}, /* Voltage sense , */\ - { 0x550, "enbl_cursense"}, /* Current sense , */\ - { 0x560, "enbl_pdm_ss"}, /* Sub-system PDM , */\ - { 0x580, "enbl_pga_chop"}, /* Enable PGA chop clock , */\ - { 0x590, "enbl_tdm_ss"}, /* Sub-system TDM , */\ - { 0x5a0, "enbl_bst_ss"}, /* Sub-system boost , */\ - { 0x5b0, "enbl_adc_ss"}, /* Sub-system ADC , */\ - { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ - { 0xd18, "side_tone_gain"}, /* Side tone gain , */\ - { 0xda0, "mute_side_tone"}, /* Side tone soft mute , */\ - { 0xdb0, "side_tone_1scomplement"}, /* side tone one s complement , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_pll_lock"}, /* PLL lock , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm , */\ - { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ - { 0x1050, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1060, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1070, "flag_lost_clk"}, /* Lost clock , */\ - { 0x10a0, "flag_engage"}, /* Amplifier engage , */\ - { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ - { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active , */\ - { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos , */\ - { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1170, "flag_soft_mute_busy"}, /* side tone (un)mute busy , */\ - { 0x1180, "flag_soft_mute_state"}, /* side tone mute state , */\ - { 0x1190, "flag_tdm_lut_error"}, /* TDM LUT error , */\ - { 0x11a2, "flag_tdm_status"}, /* TDM status bits , */\ - { 0x11d0, "flag_tdm_error"}, /* TDM error , */\ - { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1340, "flag_clipa_high"}, /* Clipping A to Vddp , */\ - { 0x1350, "flag_clipa_low"}, /* Clipping A to gnd , */\ - { 0x1360, "flag_clipb_high"}, /* Clipping B to Vddp , */\ - { 0x1370, "flag_clipb_low"}, /* Clipping B to gnd , */\ - { 0x1380, "flag_ocp_alarm"}, /* OCP amplifier , */\ - { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ - { 0x13b0, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ - { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ - { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x1433, "man_state"}, /* Device manager status , */\ - { 0x1471, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/9.5 V) , */\ - { 0x2040, "tdm_enable"}, /* Enable interface , */\ - { 0x2050, "tdm_mode"}, /* Slave/master , */\ - { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2073, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ - { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ - { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ - { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ - { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ - { 0x2300, "tdm_sink0_enable"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ - { 0x2310, "tdm_sink1_enable"}, /* Control audio tdm channel in 1 (dcdc) , */\ - { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "tdm_sink0_slot"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ - { 0x2643, "tdm_sink1_slot"}, /* tdm slot for sink 1 (dcdc) , */\ - { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x3111, "pdm_side_tone_sel"}, /* Side tone input , */\ - { 0x3201, "pdm_nbck"}, /* PDM BCK/Fs ratio , */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_pll_lock"}, /* Status PLL lock , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ovpok"}, /* Status OVP alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_clocks_stable"}, /* Status clocks stable , */\ - { 0x4060, "int_out_flag_mtp_busy"}, /* Status MTP busy , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x40a0, "int_out_flag_engage"}, /* Status amplifier engage , */\ - { 0x40c0, "int_out_flag_enbl_amp"}, /* Status amplifier enable , */\ - { 0x40d0, "int_out_flag_enbl_ref"}, /* Status Ref enable , */\ - { 0x40e0, "int_out_flag_adc10_ready"}, /* Status Control ADC , */\ - { 0x4100, "int_out_flag_bst_bstcur"}, /* Status DCDC current limiting , */\ - { 0x4110, "int_out_flag_bst_hiz"}, /* Status DCDC active , */\ - { 0x4120, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4130, "int_out_flag_bst_peakcur"}, /* Status bst peakcur , */\ - { 0x4140, "int_out_flag_bst_voutcomp"}, /* Status DCDC level 1x , */\ - { 0x4150, "int_out_flag_bst_voutcomp86"}, /* Status DCDC level 1.14x , */\ - { 0x4160, "int_out_flag_bst_voutcomp93"}, /* Status DCDC level 1.07x , */\ - { 0x4190, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ - { 0x41a0, "int_out_flag_man_wait_src_settings"}, /* Status Waits HW I2C settings , */\ - { 0x41c0, "int_out_flag_man_start_mute_audio"}, /* Status Audio mute sequence , */\ - { 0x41f0, "int_out_flag_clk_out_of_range"}, /* Status flag_clk_out_of_range , */\ - { 0x4200, "int_out_flag_tdm_error"}, /* Status tdm error , */\ - { 0x4220, "int_out_flag_clip"}, /* Status clip , */\ - { 0x4240, "int_out_flag_lp_detect_mode0"}, /* Status low power mode0 , */\ - { 0x4250, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 , */\ - { 0x4260, "int_out_flag_low_amplitude"}, /* Status low noise detection , */\ - { 0x4270, "int_out_flag_vddp_gt_vbat"}, /* Status VDDP greater than VBAT , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_pll_lock"}, /* Clear PLL lock , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ovpok"}, /* Clear OVP alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_clocks_stable"}, /* Clear clocks stable , */\ - { 0x4460, "int_in_flag_mtp_busy"}, /* Clear mtp busy , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x44a0, "int_in_flag_engage"}, /* Clear amplifier engage , */\ - { 0x44c0, "int_in_flag_enbl_amp"}, /* Clear enbl amp , */\ - { 0x44d0, "int_in_flag_enbl_ref"}, /* Clear ref enable , */\ - { 0x44e0, "int_in_flag_adc10_ready"}, /* Clear control ADC , */\ - { 0x4500, "int_in_flag_bst_bstcur"}, /* Clear DCDC current limiting , */\ - { 0x4510, "int_in_flag_bst_hiz"}, /* Clear DCDC active , */\ - { 0x4520, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4530, "int_in_flag_bst_peakcur"}, /* Clear bst peakcur , */\ - { 0x4540, "int_in_flag_bst_voutcomp"}, /* Clear DCDC level 1x , */\ - { 0x4550, "int_in_flag_bst_voutcomp86"}, /* Clear DCDC level 1.14x , */\ - { 0x4560, "int_in_flag_bst_voutcomp93"}, /* Clear DCDC level 1.07x , */\ - { 0x4590, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ - { 0x45a0, "int_in_flag_man_wait_src_settings"}, /* Clear wait HW I2C settings , */\ - { 0x45c0, "int_in_flag_man_start_mute_audio"}, /* Clear audio mute sequence , */\ - { 0x45f0, "int_in_flag_clk_out_of_range"}, /* Clear flag_clk_out_of_range , */\ - { 0x4600, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ - { 0x4620, "int_in_flag_clip"}, /* Clear clip , */\ - { 0x4640, "int_in_flag_lp_detect_mode0"}, /* Clear low power mode0 , */\ - { 0x4650, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 , */\ - { 0x4660, "int_in_flag_low_amplitude"}, /* Clear low noise detection , */\ - { 0x4670, "int_in_flag_vddp_gt_vbat"}, /* Clear VDDP greater then VBAT , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ - { 0x4810, "int_enable_flag_pll_lock"}, /* Enable pll lock , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ovpok"}, /* Enable OVP alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_clocks_stable"}, /* Enable clocks stable , */\ - { 0x4860, "int_enable_flag_mtp_busy"}, /* Enable mtp busy , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x48a0, "int_enable_flag_engage"}, /* Enable amplifier engage , */\ - { 0x48c0, "int_enable_flag_enbl_amp"}, /* Enable enbl amp , */\ - { 0x48d0, "int_enable_flag_enbl_ref"}, /* Enable ref enable , */\ - { 0x48e0, "int_enable_flag_adc10_ready"}, /* Enable Control ADC , */\ - { 0x4900, "int_enable_flag_bst_bstcur"}, /* Enable DCDC current limiting , */\ - { 0x4910, "int_enable_flag_bst_hiz"}, /* Enable DCDC active , */\ - { 0x4920, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4930, "int_enable_flag_bst_peakcur"}, /* Enable bst peakcur , */\ - { 0x4940, "int_enable_flag_bst_voutcomp"}, /* Enable DCDC level 1x , */\ - { 0x4950, "int_enable_flag_bst_voutcomp86"}, /* Enable DCDC level 1.14x , */\ - { 0x4960, "int_enable_flag_bst_voutcomp93"}, /* Enable DCDC level 1.07x , */\ - { 0x4990, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ - { 0x49a0, "int_enable_flag_man_wait_src_settings"}, /* Enable waits HW I2C settings , */\ - { 0x49c0, "int_enable_flag_man_start_mute_audio"}, /* Enable man Audio mute sequence , */\ - { 0x49f0, "int_enable_flag_clk_out_of_range"}, /* Enable flag_clk_out_of_range , */\ - { 0x4a00, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ - { 0x4a20, "int_enable_flag_clip"}, /* Enable clip , */\ - { 0x4a40, "int_enable_flag_lp_detect_mode0"}, /* Enable low power mode0 , */\ - { 0x4a50, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 , */\ - { 0x4a60, "int_enable_flag_low_amplitude"}, /* Enable low noise detection , */\ - { 0x4a70, "int_enable_flag_vddp_gt_vbat"}, /* Enable VDDP greater tehn VBAT , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ - { 0x4c10, "int_polarity_flag_pll_lock"}, /* Polarity pll lock , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ovpok"}, /* Polarity OVP alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_clocks_stable"}, /* Polarity clocks stable , */\ - { 0x4c60, "int_polarity_flag_mtp_busy"}, /* Polarity mtp busy , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x4ca0, "int_polarity_flag_engage"}, /* Polarity amplifier engage , */\ - { 0x4cc0, "int_polarity_flag_enbl_amp"}, /* Polarity enbl amp , */\ - { 0x4cd0, "int_polarity_flag_enbl_ref"}, /* Polarity ref enable , */\ - { 0x4ce0, "int_polarity_flag_adc10_ready"}, /* Polarity Control ADC , */\ - { 0x4d00, "int_polarity_flag_bst_bstcur"}, /* Polarity DCDC current limiting , */\ - { 0x4d10, "int_polarity_flag_bst_hiz"}, /* Polarity DCDC active , */\ - { 0x4d20, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4d30, "int_polarity_flag_bst_peakcur"}, /* Polarity bst peakcur , */\ - { 0x4d40, "int_polarity_flag_bst_voutcomp"}, /* Polarity DCDC level 1x , */\ - { 0x4d50, "int_polarity_flag_bst_voutcomp86"}, /* Polarity DCDC level 1.14x , */\ - { 0x4d60, "int_polarity_flag_bst_voutcomp93"}, /* Polarity DCDC level 1.07x , */\ - { 0x4d90, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ - { 0x4da0, "int_polarity_flag_man_wait_src_settings"}, /* Polarity waits HW I2C settings , */\ - { 0x4dc0, "int_polarity_flag_man_start_mute_audio"}, /* Polarity man audio mute sequence , */\ - { 0x4df0, "int_polarity_flag_clk_out_of_range"}, /* Polarity flag_clk_out_of_range , */\ - { 0x4e00, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ - { 0x4e20, "int_polarity_flag_clip"}, /* Polarity clip right , */\ - { 0x4e40, "int_polarity_flag_lp_detect_mode0"}, /* Polarity low power mode0 , */\ - { 0x4e50, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 , */\ - { 0x4e60, "int_polarity_flag_low_amplitude"}, /* Polarity low noise mode , */\ - { 0x4e70, "int_polarity_flag_vddp_gt_vbat"}, /* Polarity VDDP greater than VBAT , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ - { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ - { 0x5110, "soft_mute"}, /* Soft mute HW , */\ - { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ - { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ - { 0x5257, "gain"}, /* Amplifier gain , */\ - { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ - { 0x5340, "clipfast"}, /* Clock selection for HW clipper for Battery Safeguard, */\ - { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ - { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ - { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5420, "fb_hz"}, /* Feedback resistor set to high ohmic , */\ - { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ - { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5582, "dpsa_drive"}, /* Drive setting (bin. coded) , */\ - { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ - { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ - { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ - { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5820, "pwm_shape"}, /* PWM shape , */\ - { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ - { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ - { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ - { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ - { 0x6081, "pga_gain_set"}, /* PGA gain selection , */\ - { 0x60b0, "pga_lowpass_enable"}, /* Lowpass enable , */\ - { 0x60c0, "pga_pwr_enable"}, /* Power enable, directcontrol mode only , */\ - { 0x60d0, "pga_switch_enable"}, /* Switch enable, directcontrol mode only , */\ - { 0x60e0, "pga_switch_aux_enable"}, /* Switch enable aux, directcontrol mode only , */\ - { 0x6100, "force_idle"}, /* force low power in idle mode , */\ - { 0x6110, "bypass_idle"}, /* bypass low power idle mode , */\ - { 0x6123, "ctrl_attl"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x6163, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x61a0, "idle_cnt"}, /* idle counter , */\ - { 0x61b0, "enbl_idle_ch1"}, /* enable idle feature for channel 1 , */\ - { 0x6265, "zero_lvl"}, /* low noise gain switch zero trigger level , */\ - { 0x62c1, "ctrl_fb_classd"}, /* class D gain ctrl_fb_50k ctrl_fb_100k , */\ - { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ - { 0x6305, "threshold_lvl"}, /* low noise gain switch trigger level , */\ - { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 zero crossing detection level , */\ - { 0x64e1, "lpm1_mode"}, /* low power mode control , */\ - { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 amplitude trigger level , */\ - { 0x6565, "lpm1_hold_time"}, /* low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ - { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ - { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ - { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ - { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ - { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtred vs unfiltered compare , */\ - { 0x6801, "tdm_source_mapping"}, /* tdm source mapping , */\ - { 0x6821, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ - { 0x6841, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ - { 0x6881, "pdm_anc_sel"}, /* anc input , */\ - { 0x68a0, "anc_1scomplement"}, /* ANC one s complement , */\ - { 0x6901, "sam_mode"}, /* sam enable , */\ - { 0x6920, "sam_src"}, /* sam source , */\ - { 0x6931, "pdmdat_h_sel"}, /* pdm out value when pdm_clk is higth , */\ - { 0x6951, "pdmdat_l_sel"}, /* pdm out value when pdm_clk is low , */\ - { 0x6970, "sam_spkr_sel"}, /* ram output on mode sam and audio , */\ - { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ - { 0x6b00, "disable_auto_engage"}, /* disable auto engange , */\ - { 0x6b10, "sel_tdm_data_valid"}, /* select tdm valid for speaker subsystem , */\ - { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x6c69, "spare_out"}, /* spare_out , */\ - { 0x6d0f, "spare_in"}, /* spare_in , */\ - { 0x6e00, "flag_lp_detect_mode0"}, /* low power mode 0 detection , */\ - { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ - { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ - { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ - { 0x6f02, "cursense_comp_delay"}, /* delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "cursense_comp_sign"}, /* polarity of compensation for current sense , */\ - { 0x6f50, "enbl_cursense_comp"}, /* enable current sense compensation , */\ - { 0x6f60, "sel_clip_pwms"}, /* Select pwm clip flag , */\ - { 0x6f72, "pwms_clip_lvl"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7002, "scnd_boost_voltage"}, /* Second boost voltage level , */\ - { 0x7033, "boost_cur"}, /* Max coil current , */\ - { 0x7071, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ - { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ - { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7402, "frst_boost_voltage"}, /* 1st boost voltage level , */\ - { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x74f0, "ignore_flag_voutcomp86"}, /* Ignore flag_voutcomp86 , */\ - { 0x7502, "track_decay"}, /* DCDC Boost decay speed after a peak value, effective only when boost_track is set to 1, */\ - { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x7620, "pga_test_ldo_bypass"}, /* bypass internal PGA LDO , */\ - { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ - { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ - { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8200, "enbl_cmfb"}, /* Current sense common mode feedback control , */\ - { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8222, "cmfb_gain"}, /* Current sense common mode feedback control gain , */\ - { 0x8254, "cmfb_offset"}, /* Current sense common mode feedback control offset , */\ - { 0x82a0, "cs_sam_set"}, /* Enable SAM input for current sense , */\ - { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ - { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ - { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ - { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ - { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ - { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ - { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ - { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ - { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ - { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ - { 0x8760, "enbl_cs_nofloating_n"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8770, "enbl_cs_nofloating_p"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ - { 0x8800, "volsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ - { 0x8810, "vol_cur_sense_dc_offset"}, /* voltage and current sense decimator offset control, */\ - { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ - { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ - { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc5b0, "pga_test_enable"}, /* Enable PGA test mode , */\ - { 0xc5c0, "pga_test_offset_enable"}, /* Enable PGA test offset , */\ - { 0xc5d0, "pga_test_shortinput_enable"}, /* Enable PGA test shortinput , */\ - { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ - { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ - { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to PDMDAT (see Digimux list for details), */\ - { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xcb54, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ - { 0xcba4, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ - { 0xcd05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ - { 0xcd64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ - { 0xcdb3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ - { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ - { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ - { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ - { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ - { 0xcec0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ - { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ - { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ - { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ - { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ - { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ - { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ - { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd283, "tsig_gain"}, /* Test signal gain , */\ - { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xd621, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ - { 0xd641, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ - { 0xd661, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ - { 0xd701, "pdmdat_ehs"}, /* Speed/load setting for PDMDAT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd740, "bck_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd750, "datai_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd760, "pdmclk_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd800, "source_in_testmode"}, /* tdm source in test mode (return only current and voltage sense), */\ - { 0xd810, "gainatt_feedback"}, /* gainatt feedback to tdm , */\ - { 0xd822, "test_parametric_io"}, /* test io parametric , */\ - { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ - { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ - { 0xd880, "bst_dcmbst"}, /* dcm boost , */\ - { 0xd890, "pdm_loopback"}, /* pdm loop back to tdm , */\ - { 0xd8a1, "force_pga_clock"}, /* force pga clock , */\ - { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ - { 0xee0f, "sw_profile"}, /* Software profile data , */\ - { 0xef0f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf163, "spare_mpt1_9_6"}, /* HW gain module - left channel (2's complement) , */\ - { 0xf1a5, "spare_mpt1_15_10"}, /* Offset for amplifier, HW gain module - left channel (2's complement), */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf2a3, "spare_mpt2_13_10"}, /* Trimming of LDO (2.7V) , */\ - { 0xf307, "spare_mpt3_7_0"}, /* SPARE , */\ - { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf40f, "spare_mtp4_15_0"}, /* SPARE , */\ - { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ - { 0xf606, "spare_mpt6_6_0"}, /* SPARE , */\ - { 0xf686, "spare_mpt6_14_8"}, /* Offset of left amplifier level shifter B , */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ - { 0xf910, "disable_sam_mode"}, /* Disable same mode , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Disable programming of max dcdc boost voltage , */\ - { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf980, "mtp_enbl_amp_in_state_alarm"}, /* Enbl_amp in alarm state , */\ - { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* pwm delay clock auto gating , */\ - { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* ocpclock auto gating , */\ - { 0xf9b0, "mtp_gate_cgu_clock_for_test"}, /* cgu test clock control , */\ - { 0xf9c3, "spare_mtp9_15_12"}, /* MTP-control FW - See Firmware I2C API document for details, */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ - { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa9872_irq { - tfa9872_irq_stvdds = 0, - tfa9872_irq_stplls = 1, - tfa9872_irq_stotds = 2, - tfa9872_irq_stovds = 3, - tfa9872_irq_stuvds = 4, - tfa9872_irq_stclks = 5, - tfa9872_irq_stmtpb = 6, - tfa9872_irq_stnoclk = 7, - tfa9872_irq_stsws = 10, - tfa9872_irq_stamps = 12, - tfa9872_irq_starefs = 13, - tfa9872_irq_stadccr = 14, - tfa9872_irq_stbstcu = 16, - tfa9872_irq_stbsthi = 17, - tfa9872_irq_stbstoc = 18, - tfa9872_irq_stbstpkcur = 19, - tfa9872_irq_stbstvc = 20, - tfa9872_irq_stbst86 = 21, - tfa9872_irq_stbst93 = 22, - tfa9872_irq_stocpr = 25, - tfa9872_irq_stmwsrc = 26, - tfa9872_irq_stmwsmu = 28, - tfa9872_irq_stclkoor = 31, - tfa9872_irq_sttdmer = 32, - tfa9872_irq_stclpr = 34, - tfa9872_irq_stlp0 = 36, - tfa9872_irq_stlp1 = 37, - tfa9872_irq_stla = 38, - tfa9872_irq_stvddph = 39, - tfa9872_irq_max = 40, - tfa9872_irq_all = -1 /* all irqs */}; - -#define TFA9872_IRQ_NAMETABLE static tfaIrqName_t Tfa9872IrqNames[] = {\ - { 0, "STVDDS"},\ - { 1, "STPLLS"},\ - { 2, "STOTDS"},\ - { 3, "STOVDS"},\ - { 4, "STUVDS"},\ - { 5, "STCLKS"},\ - { 6, "STMTPB"},\ - { 7, "STNOCLK"},\ - { 8, "8"},\ - { 9, "9"},\ - { 10, "STSWS"},\ - { 11, "11"},\ - { 12, "STAMPS"},\ - { 13, "STAREFS"},\ - { 14, "STADCCR"},\ - { 15, "15"},\ - { 16, "STBSTCU"},\ - { 17, "STBSTHI"},\ - { 18, "STBSTOC"},\ - { 19, "STBSTPKCUR"},\ - { 20, "STBSTVC"},\ - { 21, "STBST86"},\ - { 22, "STBST93"},\ - { 23, "23"},\ - { 24, "24"},\ - { 25, "STOCPR"},\ - { 26, "STMWSRC"},\ - { 27, "27"},\ - { 28, "STMWSMU"},\ - { 29, "29"},\ - { 30, "30"},\ - { 31, "STCLKOOR"},\ - { 32, "STTDMER"},\ - { 33, "33"},\ - { 34, "STCLPR"},\ - { 35, "35"},\ - { 36, "STLP0"},\ - { 37, "STLP1"},\ - { 38, "STLA"},\ - { 39, "STVDDPH"},\ - { 40, "40"},\ -}; -#endif /* _TFA9872_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames.h deleted file mode 100644 index 0bd8b999dbb3..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames.h +++ /dev/null @@ -1,934 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9873_tfaFieldnames.h - * This file was generated automatically on 10/21/19 at 17:03:34. - * Source file: TFA9873_PRB4_N1A0_I2C_RegisterMap.xlsx - */ - -#ifndef _TFA9873_TFAFIELDNAMES_H -#define _TFA9873_TFAFIELDNAMES_H - - -#define TFA9873_I2CVERSION 28 - -typedef enum Tfa9873BfEnumList { - TFA9873_BF_PWDN = 0x0000, /*!< Powerdown selection */ - TFA9873_BF_I2CR = 0x0010, /*!< I2C reset - auto clear */ - TFA9873_BF_AMPE = 0x0030, /*!< Activate amplifier */ - TFA9873_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ - TFA9873_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9873_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ - TFA9873_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ - TFA9873_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ - TFA9873_BF_ENPLLSYNC = 0x00e0, /*!< Manager control for enabling synchronisation with PLL FS */ - TFA9873_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ - TFA9873_BF_MANSCONF = 0x0120, /*!< I2C configured */ - TFA9873_BF_MUTETO = 0x0160, /*!< Time out SB mute sequence */ - TFA9873_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ - TFA9873_BF_DISFCRBST = 0x01f0, /*!< Disable boost control with FRCBST */ - TFA9873_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ - TFA9873_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9873_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ - TFA9873_BF_REV = 0x030f, /*!< Device revision information */ - TFA9873_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ - TFA9873_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ - TFA9873_BF_MANAOOSC = 0x0460, /*!< Internal osc off in power down mode */ - TFA9873_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ - TFA9873_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ - TFA9873_BF_AUTOFROSEL = 0x04a0, /*!< Override automatic OSC selection mechanism */ - TFA9873_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ - TFA9873_BF_FRCCLKSPKR = 0x0510, /*!< Force active the speaker sub-system clock when in idle power */ - TFA9873_BF_BSTCLKLP = 0x0520, /*!< Boost clock control in low power mode1 */ - TFA9873_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ - TFA9873_BF_CLKCHKLO = 0x0707, /*!< Clock check low threshold */ - TFA9873_BF_CLKCHKHI = 0x0787, /*!< Clock check higher threshold */ - TFA9873_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ - TFA9873_BF_VDDS = 0x1000, /*!< POR */ - TFA9873_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register, clear on read) */ - TFA9873_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register, clear on read) */ - TFA9873_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register, clear on read) */ - TFA9873_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register, clear on read) */ - TFA9873_BF_MANALARM = 0x1050, /*!< Alarm state */ - TFA9873_BF_CLKS = 0x1060, /*!< Clocks stable */ - TFA9873_BF_MTPB = 0x1070, /*!< MTP busy */ - TFA9873_BF_NOCLK = 0x1080, /*!< Lost clock (sticky register, clear on read) */ - TFA9873_BF_TDMERR = 0x10a0, /*!< TDM error */ - TFA9873_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9873_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ - TFA9873_BF_DCDCPC = 0x1120, /*!< Indicates current is max in DC-to-DC converter */ - TFA9873_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ - TFA9873_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ - TFA9873_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ - TFA9873_BF_PLLS = 0x1160, /*!< PLL lock */ - TFA9873_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ - TFA9873_BF_CLKOOR = 0x11c0, /*!< External clock status */ - TFA9873_BF_SWS = 0x11d0, /*!< Amplifier engage */ - TFA9873_BF_AMPS = 0x11e0, /*!< Amplifier enable */ - TFA9873_BF_AREFS = 0x11f0, /*!< References enable */ - TFA9873_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ - TFA9873_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ - TFA9873_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ - TFA9873_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ - TFA9873_BF_OVDS = 0x1380, /*!< OVP alarm */ - TFA9873_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ - TFA9873_BF_ADCCR = 0x13a0, /*!< Control ADC */ - TFA9873_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ - TFA9873_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ - TFA9873_BF_MANOPER = 0x13f0, /*!< Operating state */ - TFA9873_BF_TDMSTAT = 0x1402, /*!< TDM status bits */ - TFA9873_BF_MANSTATE = 0x1433, /*!< Device manager status */ - TFA9873_BF_AMPSTE = 0x1473, /*!< Amplifier control status */ - TFA9873_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ - TFA9873_BF_WAITSYNC = 0x14d0, /*!< CGU and PLL synchronisation status flag from CGU */ - TFA9873_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9873_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9873_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ - TFA9873_BF_TDME = 0x2000, /*!< Enable interface */ - TFA9873_BF_TDMSLOTS = 0x2013, /*!< N-slots in Frame */ - TFA9873_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ - TFA9873_BF_TDMFSLN = 0x2073, /*!< FS length */ - TFA9873_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ - TFA9873_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ - TFA9873_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ - TFA9873_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ - TFA9873_BF_TDMDEL = 0x21e0, /*!< Data delay to FS */ - TFA9873_BF_TDMADJ = 0x21f0, /*!< Data adjustment */ - TFA9873_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ - TFA9873_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ - TFA9873_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ - TFA9873_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ - TFA9873_BF_TDMSPKE = 0x2300, /*!< Control audio TDM channel in 0 */ - TFA9873_BF_TDMDCE = 0x2310, /*!< Control audio TDM channel in 1 */ - TFA9873_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ - TFA9873_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ - TFA9873_BF_TDMSPKS = 0x2603, /*!< TDM slot for sink 0 */ - TFA9873_BF_TDMDCS = 0x2643, /*!< TDM slot for sink 1 */ - TFA9873_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ - TFA9873_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ - TFA9873_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9873_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ - TFA9873_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9873_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ - TFA9873_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9873_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ - TFA9873_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ - TFA9873_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9873_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9873_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ - TFA9873_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9873_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ - TFA9873_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9873_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ - TFA9873_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ - TFA9873_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9873_BF_IEVDDS = 0x4800, /*!< Enable POR */ - TFA9873_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ - TFA9873_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9873_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ - TFA9873_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9873_BF_IEMANALARM = 0x4850, /*!< Enable manager alarm state */ - TFA9873_BF_IETDMER = 0x4860, /*!< Enable TDM error */ - TFA9873_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9873_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ - TFA9873_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ - TFA9873_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9873_BF_IPOOCPR = 0x4c30, /*!< Polarity OCP alarm */ - TFA9873_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9873_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ - TFA9873_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ - TFA9873_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9873_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ - TFA9873_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ - TFA9873_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ - TFA9873_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9873_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ - TFA9873_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ - TFA9873_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ - TFA9873_BF_DPSA = 0x5170, /*!< Enable DPSA */ - TFA9873_BF_BYHWCLIP = 0x5240, /*!< Bypass hardware clipper */ - TFA9873_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ - TFA9873_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ - TFA9873_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ - TFA9873_BF_BYPDLYLINE = 0x52f0, /*!< Bypass the interpolator delay line */ - TFA9873_BF_TDMSPKG = 0x5f63, /*!< Total gain depending on INPLEV setting (channel 0) */ - TFA9873_BF_IPM = 0x60e1, /*!< Idle power mode control */ - TFA9873_BF_LNMODE = 0x62e1, /*!< Ctrl select mode */ - TFA9873_BF_LPM1MODE = 0x64e1, /*!< Low power mode control */ - TFA9873_BF_TDMSRCMAP = 0x6802, /*!< TDM source mapping */ - TFA9873_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ - TFA9873_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ - TFA9873_BF_TDMSRCACLIP = 0x6871, /*!< Clip information (analog /digital) for source0 */ - TFA9873_BF_TDMSRCBCLIP = 0x6891, /*!< Clip information (analog /digital) for source1 */ - TFA9873_BF_LP0 = 0x6e00, /*!< Idle power mode */ - TFA9873_BF_LP1 = 0x6e10, /*!< Low power mode 1 detection */ - TFA9873_BF_LA = 0x6e20, /*!< Low amplitude detection */ - TFA9873_BF_VDDPH = 0x6e30, /*!< Vddp greater than Vbat */ - TFA9873_BF_DELCURCOMP = 0x6f02, /*!< Delay to allign compensation signal with current sense signal */ - TFA9873_BF_SIGCURCOMP = 0x6f40, /*!< Polarity of compensation for current sense */ - TFA9873_BF_ENCURCOMP = 0x6f50, /*!< Enable current sense compensation */ - TFA9873_BF_LVLCLPPWM = 0x6f72, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ - TFA9873_BF_DCMCC = 0x7003, /*!< Max coil current */ - TFA9873_BF_DCCV = 0x7041, /*!< Slope compensation current, represents LxF (inductance x frequency) */ - TFA9873_BF_DCIE = 0x7060, /*!< Adaptive boost mode */ - TFA9873_BF_DCSR = 0x7070, /*!< Soft ramp up/down */ - TFA9873_BF_DCOVL = 0x7085, /*!< Threshold level to activate active overshoot control */ - TFA9873_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ - TFA9873_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ - TFA9873_BF_DCDYFSW = 0x7420, /*!< Disables the dynamic frequency switching due to flag_voutcomp86/93 */ - TFA9873_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ - TFA9873_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9873_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ - TFA9873_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ - TFA9873_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9873_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9873_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ - TFA9873_BF_ENBSTFLT = 0x7620, /*!< Enable the boost filter */ - TFA9873_BF_DCVOF = 0x7635, /*!< First boost voltage level */ - TFA9873_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ - TFA9873_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ - TFA9873_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9873_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9873_BF_MTPADDR = 0xa302, /*!< MTP address from I2C register for read/writing mtp in manual single word mode */ - TFA9873_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9873_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9873_BF_MTPWRMSB = 0xa70f, /*!< MSB word of write data for MTP manual write */ - TFA9873_BF_MTPWRLSB = 0xa80f, /*!< LSB word of write data for MTP manual write */ - TFA9873_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9873_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9873_BF_PLLINSI = 0xcd05, /*!< PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1 */ - TFA9873_BF_PLLINSP = 0xcd64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9873_BF_PLLINSR = 0xcdb3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9873_BF_PLLBDSEL = 0xcdf0, /*!< PLL bandwidth selection control, USE WITH CAUTION */ - TFA9873_BF_PLLNDEC = 0xce09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873_BF_PLLMDECM = 0xcea0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873_BF_PLLBP = 0xceb0, /*!< PLL bypass control during functional mode */ - TFA9873_BF_PLLDI = 0xcec0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873_BF_PLLDO = 0xced0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873_BF_PLLCLKSTB = 0xcee0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873_BF_PLLFRM = 0xcef0, /*!< PLL free running mode control in functional mode */ - TFA9873_BF_PLLMDECL = 0xcf0f, /*!< Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1 */ - TFA9873_BF_PLLPDEC = 0xd006, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873_BF_PLLDCTRL = 0xd070, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ - TFA9873_BF_PLLLIMOFF = 0xd090, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ - TFA9873_BF_PLLSTRTM = 0xd0a2, /*!< PLL startup time selection control */ - TFA9873_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ - TFA9873_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ - TFA9873_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9873_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9873_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9873_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9873_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9873_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9873_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ -} Tfa9873BfEnumList_t; -#define TFA9873_NAMETABLE static tfaBfName_t Tfa9873DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown selection , */\ - { 0x10, "I2CR"}, /* I2C reset - auto clear , */\ - { 0x30, "AMPE"}, /* Activate amplifier , */\ - { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0x90, "FSSSEL"}, /* Audio sample reference , */\ - { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xc0, "TSTOCP"}, /* OCP testing control , */\ - { 0xe0, "ENPLLSYNC"}, /* Manager control for enabling synchronisation with PLL FS, */\ - { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ - { 0x120, "MANSCONF"}, /* I2C configured , */\ - { 0x160, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ - { 0x1f0, "DISFCRBST"}, /* Disable boost control with FRCBST , */\ - { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ - { 0x30f, "REV"}, /* Device revision information , */\ - { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ - { 0x460, "MANAOOSC"}, /* Internal osc off in power down mode , */\ - { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "AUTOFROSEL"}, /* Override automatic OSC selection mechanism , */\ - { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "FRCCLKSPKR"}, /* Force active the speaker sub-system clock when in idle power, */\ - { 0x520, "BSTCLKLP"}, /* Boost clock control in low power mode1 , */\ - { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ - { 0x707, "CLKCHKLO"}, /* Clock check low threshold , */\ - { 0x787, "CLKCHKHI"}, /* Clock check higher threshold , */\ - { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1020, "OTDS"}, /* OTP alarm (sticky register, clear on read) , */\ - { 0x1030, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1040, "UVDS"}, /* UVP alarm (sticky register, clear on read) , */\ - { 0x1050, "MANALARM"}, /* Alarm state , */\ - { 0x1060, "CLKS"}, /* Clocks stable , */\ - { 0x1070, "MTPB"}, /* MTP busy , */\ - { 0x1080, "NOCLK"}, /* Lost clock (sticky register, clear on read) , */\ - { 0x10a0, "TDMERR"}, /* TDM error , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "DCDCPC"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1160, "PLLS"}, /* PLL lock , */\ - { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ - { 0x11c0, "CLKOOR"}, /* External clock status , */\ - { 0x11d0, "SWS"}, /* Amplifier engage , */\ - { 0x11e0, "AMPS"}, /* Amplifier enable , */\ - { 0x11f0, "AREFS"}, /* References enable , */\ - { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ - { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ - { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ - { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ - { 0x1380, "OVDS"}, /* OVP alarm , */\ - { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ - { 0x13a0, "ADCCR"}, /* Control ADC , */\ - { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ - { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x13f0, "MANOPER"}, /* Operating state , */\ - { 0x1402, "TDMSTAT"}, /* TDM status bits , */\ - { 0x1433, "MANSTATE"}, /* Device manager status , */\ - { 0x1473, "AMPSTE"}, /* Amplifier control status , */\ - { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x14d0, "WAITSYNC"}, /* CGU and PLL synchronisation status flag from CGU , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2000, "TDME"}, /* Enable interface , */\ - { 0x2013, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2073, "TDMFSLN"}, /* FS length , */\ - { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ - { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ - { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x21e0, "TDMDEL"}, /* Data delay to FS , */\ - { 0x21f0, "TDMADJ"}, /* Data adjustment , */\ - { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ - { 0x2300, "TDMSPKE"}, /* Control audio TDM channel in 0 , */\ - { 0x2310, "TDMDCE"}, /* Control audio TDM channel in 1 , */\ - { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "TDMSPKS"}, /* TDM slot for sink 0 , */\ - { 0x2643, "TDMDCS"}, /* TDM slot for sink 1 , */\ - { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ - { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ - { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4800, "IEVDDS"}, /* Enable POR , */\ - { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IEMANALARM"}, /* Enable manager alarm state , */\ - { 0x4860, "IETDMER"}, /* Enable TDM error , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ - { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOCPR"}, /* Polarity OCP alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ - { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ - { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ - { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ - { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ - { 0x5170, "DPSA"}, /* Enable DPSA , */\ - { 0x5240, "BYHWCLIP"}, /* Bypass hardware clipper , */\ - { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ - { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ - { 0x52f0, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ - { 0x5f63, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x60e1, "IPM"}, /* Idle power mode control , */\ - { 0x62e1, "LNMODE"}, /* Ctrl select mode , */\ - { 0x64e1, "LPM1MODE"}, /* Low power mode control , */\ - { 0x6802, "TDMSRCMAP"}, /* TDM source mapping , */\ - { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ - { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ - { 0x6871, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ - { 0x6891, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ - { 0x6e00, "LP0"}, /* Idle power mode , */\ - { 0x6e10, "LP1"}, /* Low power mode 1 detection , */\ - { 0x6e20, "LA"}, /* Low amplitude detection , */\ - { 0x6e30, "VDDPH"}, /* Vddp greater than Vbat , */\ - { 0x6f02, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ - { 0x6f50, "ENCURCOMP"}, /* Enable current sense compensation , */\ - { 0x6f72, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7003, "DCMCC"}, /* Max coil current , */\ - { 0x7041, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ - { 0x7060, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7070, "DCSR"}, /* Soft ramp up/down , */\ - { 0x7085, "DCOVL"}, /* Threshold level to activate active overshoot control, */\ - { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ - { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7420, "DCDYFSW"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ - { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7620, "ENBSTFLT"}, /* Enable the boost filter , */\ - { 0x7635, "DCVOF"}, /* First boost voltage level , */\ - { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ - { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "MTPADDR"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "MTPWRMSB"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "MTPWRLSB"}, /* LSB word of write data for MTP manual write , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xcd05, "PLLINSI"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ - { 0xcd64, "PLLINSP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdb3, "PLLINSR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdf0, "PLLBDSEL"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ - { 0xce09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcea0, "PLLMDECM"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xceb0, "PLLBP"}, /* PLL bypass control during functional mode , */\ - { 0xcec0, "PLLDI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xced0, "PLLDO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcee0, "PLLCLKSTB"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcef0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ - { 0xcf0f, "PLLMDECL"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ - { 0xd006, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd070, "PLLDCTRL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xd090, "PLLLIMOFF"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xd0a2, "PLLSTRTM"}, /* PLL startup time selection control , */\ - { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ - { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9873_BITNAMETABLE static tfaBfName_t Tfa9873BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown selection , */\ - { 0x10, "reset"}, /* I2C reset - auto clear , */\ - { 0x30, "enbl_amplifier"}, /* Activate amplifier , */\ - { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ - { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xc0, "test_ocp"}, /* OCP testing control , */\ - { 0xd0, "sel_man_wait_time"}, /* Manager wait time selection control , */\ - { 0xe0, "enbl_pll_synchronisation"}, /* Manager control for enabling synchronisation with PLL FS, */\ - { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ - { 0x120, "src_set_configured"}, /* I2C configured , */\ - { 0x160, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ - { 0x1f0, "disable_frcbst"}, /* Disable boost control with FRCBST , */\ - { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ - { 0x30f, "device_rev"}, /* Device revision information , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ - { 0x460, "enbl_osc_auto_off"}, /* Internal osc off in power down mode , */\ - { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "override_auto_sel_osc"}, /* Override automatic OSC selection mechanism , */\ - { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "force_spkr_clk"}, /* Force active the speaker sub-system clock when in idle power, */\ - { 0x520, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ - { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ - { 0x707, "clkchk_th_lo"}, /* Clock check low threshold , */\ - { 0x787, "clkchk_th_hi"}, /* Clock check higher threshold , */\ - { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register, clear on read) , */\ - { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register, clear on read) , */\ - { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1080, "flag_lost_clk"}, /* Lost clock (sticky register, clear on read) , */\ - { 0x10a0, "flag_tdm_error"}, /* TDM error , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ - { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ - { 0x11c0, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ - { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ - { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ - { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ - { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ - { 0x1402, "flag_tdm_status"}, /* TDM status bits , */\ - { 0x1433, "man_state"}, /* Device manager status , */\ - { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ - { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x14d0, "flag_waiting_for_sync"}, /* CGU and PLL synchronisation status flag from CGU , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2000, "tdm_enable"}, /* Enable interface , */\ - { 0x2013, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ - { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ - { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x21e0, "tdm_data_delay"}, /* Data delay to FS , */\ - { 0x21f0, "tdm_data_adjustment"}, /* Data adjustment , */\ - { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ - { 0x2300, "tdm_sink0_enable"}, /* Control audio TDM channel in 0 , */\ - { 0x2310, "tdm_sink1_enable"}, /* Control audio TDM channel in 1 , */\ - { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ - { 0x2643, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ - { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ - { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ - { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ - { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable manager alarm state , */\ - { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ - { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity OCP alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ - { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ - { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ - { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ - { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0x5240, "bypasshwclip"}, /* Bypass hardware clipper , */\ - { 0x5257, "gain"}, /* Amplifier gain , */\ - { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ - { 0x52f0, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA release time , */\ - { 0x5350, "bypass_lp"}, /* Bypass the low pass filter inside temperature sensor, */\ - { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x5463, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit DAC , */\ - { 0x5500, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5513, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5552, "dpsa_drive"}, /* Drive setting (binary coded) , */\ - { 0x5581, "ctrlloop_vstress_select"}, /* GO2 capacitor stress selector for control loop , */\ - { 0x5600, "ref_iref_enbl"}, /* Enable of reference current for OCP , */\ - { 0x5631, "ref_irefdist_set_ctrl"}, /* Scaling of reference current for OCP , */\ - { 0x5652, "ref_irefdist_test_enbl"}, /* Enable of test-function of distribution of reference current, used for OCP. When enabled, the current will to to anamux iso powerstages. Using e.g. 011 it will add the current of powerstage P and N., */\ - { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ - { 0x57b0, "enbl_engage"}, /* Enables/engage the control stage , */\ - { 0x57c0, "enbl_engage_pst"}, /* Enables/engage the power stage , */\ - { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clock PWM is 1/(K*2048*fs), */\ - { 0x5890, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ - { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ - { 0x5900, "sel_pwm_freq"}, /* Control for selection for PWM switching frequency , */\ - { 0x5910, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ - { 0x5f63, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x6005, "idle_power_cal_offset"}, /* Idle power mode detector ctrl cal_offset from gain module , */\ - { 0x6065, "idle_power_zero_lvl"}, /* IIdle power mode zero crossing detection level , */\ - { 0x60e1, "idle_power_mode"}, /* Idle power mode control , */\ - { 0x6105, "idle_power_threshold_lvl"}, /* Idle power mode amplitude trigger level , */\ - { 0x6165, "idle_power_hold_time"}, /* Idle power mode detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x61c0, "disable_idle_power_mode"}, /* Idle power mode detector control , */\ - { 0x6265, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ - { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ - { 0x62e1, "lownoisegain_mode"}, /* Ctrl select mode , */\ - { 0x6305, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ - { 0x6365, "hold_time"}, /* Low noise gain switch ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x6405, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x6465, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ - { 0x64e1, "lpm1_mode"}, /* Low power mode control , */\ - { 0x6505, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ - { 0x6565, "lpm1_hold_time"}, /* Low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x65c0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ - { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC Number of zero current flags to count before going to PFM mode, */\ - { 0x6631, "pfm2pwm_cnt_max"}, /* Number of pulses in PFM mode before going to PWM mode, */\ - { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x66d2, "pfmfreq_limit"}, /* Lowest PFM frequency limit , */\ - { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ - { 0x6713, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ - { 0x6750, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ - { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ - { 0x6802, "tdm_source_mapping"}, /* TDM source mapping , */\ - { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ - { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ - { 0x6871, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ - { 0x6891, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ - { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ - { 0x6b00, "disable_auto_engage"}, /* Disable auto engange , */\ - { 0x6b10, "disable_engage"}, /* Disable engange , */\ - { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x6c69, "spare_out"}, /* spare_out , */\ - { 0x6d0f, "spare_in"}, /* spare_in , */\ - { 0x6e00, "flag_idle_power_mode"}, /* Idle power mode , */\ - { 0x6e10, "flag_lp_detect_mode1"}, /* Low power mode 1 detection , */\ - { 0x6e20, "flag_low_amplitude"}, /* Low amplitude detection , */\ - { 0x6e30, "flag_vddp_gt_vbat"}, /* Vddp greater than Vbat , */\ - { 0x6f02, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ - { 0x6f50, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ - { 0x6f72, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7003, "boost_cur"}, /* Max coil current , */\ - { 0x7041, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ - { 0x7060, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7070, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x7085, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ - { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current DAC , */\ - { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7290, "enbl_bst_windac"}, /* Enable window DAC , */\ - { 0x72a5, "bst_windac"}, /* For testing direct control windac , */\ - { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7350, "disable_artf654484_fix"}, /* Disables the fix for artf654484 (loss of efficiency when Vbst is close to Vbat), */\ - { 0x7420, "disable_dynamic_freq"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ - { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ - { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7620, "enbl_bst_filter"}, /* Enable the boost filter , */\ - { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ - { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ - { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ - { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ - { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ - { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ - { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ - { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ - { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ - { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ - { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ - { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ - { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ - { 0x8887, "vs_gain"}, /* Voltage sense gain , */\ - { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ - { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ - { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ - { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ - { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ - { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ - { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ - { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ - { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ - { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ - { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ - { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ - { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ - { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ - { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_protected registers (default for engineering), */\ - { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xb200, "bypass_ovpglitchfilter"}, /* Bypass glitch filter on over voltage protection signal from analog, */\ - { 0xb210, "enbl_ovp_alarm_state"}, /* Allow manager to go into alarm state when OVP (only when ctrl_vpalarm is 0), */\ - { 0xb220, "amp_in_tristate_when_ovp"}, /* Brings amplifier in tristate when OVP (only when ctrl_enbl_ovp_alarm_state is 0) , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ - { 0xc0f0, "enbl_fro"}, /* Enables FRO8M in I2C direct control mode only , */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc376, "pulselength"}, /* Pulse length setting test input for amplifier (PWM clock 2048/4096 Fs), */\ - { 0xc3e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert PWMbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old OCP (ctrl_reversebst is 0), For new OCP (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ - { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ - { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ - { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 (see Digimux list for details), */\ - { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on VSN/TEST3 , */\ - { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on VSP/TEST4 , */\ - { 0xcd05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ - { 0xcd64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdb3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ - { 0xce09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcea0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xceb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ - { 0xcec0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xced0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcee0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcef0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ - { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ - { 0xd006, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd070, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xd090, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xd0a2, "sel_pll_startup_time"}, /* PLL startup time selection control , */\ - { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xd202, "tsig_freq_msb"}, /* Internal sinus test generator, frequency control msb bits, */\ - { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd283, "tsig_gain"}, /* Test signal gain , */\ - { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd800, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ - { 0xd810, "gainatt_tdm_feedback"}, /* GainAtt feedback to TDM , */\ - { 0xd822, "test_parametric_io"}, /* Test io parametric , */\ - { 0xd861, "test_spare_out1"}, /* Test spare out 1 , */\ - { 0xd880, "bst_dcmbst"}, /* DCM boost , */\ - { 0xd890, "railclamp_disable"}, /* ESD rail clamp control, controls amp and boost rail clamp for ESD, */\ - { 0xd8c3, "test_spare_out2"}, /* Test spare out 1 , */\ - { 0xd900, "enbl_frocal"}, /* Enable FRO calibration , */\ - { 0xd910, "start_fro_calibration"}, /* Start FRO8 Calibration , */\ - { 0xd920, "enbl_irefcal"}, /* Enable IREF calibration , */\ - { 0xd930, "start_iref_calibration"}, /* Start IREF Calibration , */\ - { 0xda00, "fro_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ - { 0xda15, "fro_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ - { 0xda80, "iref_calibration_done"}, /* IREF Calibration done - Read Only , */\ - { 0xda94, "iref_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ - { 0xdae0, "iref_calibration_error"}, /* IREF Calibration done - Read Only , */\ - { 0xe00f, "sw_profile"}, /* Software profile data , */\ - { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf307, "calibr_gain_vs1"}, /* Voltage sense gain when external voltage sensing input is selected, */\ - { 0xf387, "calibr_gain_vs2"}, /* Voltage sense gain when internal voltage sensing input is selected, */\ - { 0xf407, "vs_trim1"}, /* VS Trimming when external voltage sensing input is selected, */\ - { 0xf487, "vs_trim2"}, /* VS Trimming when internal voltage sensing input is selected, */\ - { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ - { 0xf607, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ - { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ - { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ - { 0xff05, "fro_trim"}, /* 8 MHz oscillator trim code , */\ - { 0xff61, "fro_shortnwell"}, /* Short 4 or 6 n-well resistors , */\ - { 0xff81, "fro_boost"}, /* Self bias current selection , */\ - { 0xffa4, "calibr_iref_trim"}, /* Trimming control of reference current for OCP , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa9873_irq { - tfa9873_irq_stvdds = 0, - tfa9873_irq_stbstoc = 1, - tfa9873_irq_stotds = 2, - tfa9873_irq_stocpr = 3, - tfa9873_irq_stuvds = 4, - tfa9873_irq_stmanalarm = 5, - tfa9873_irq_sttdmer = 6, - tfa9873_irq_stnoclk = 7, - tfa9873_irq_max = 8, - tfa9873_irq_all = -1 /* all irqs */}; - -#define TFA9873_IRQ_NAMETABLE static tfaIrqName_t Tfa9873IrqNames[] = {\ - { 0, "STVDDS"},\ - { 1, "STBSTOC"},\ - { 2, "STOTDS"},\ - { 3, "STOCPR"},\ - { 4, "STUVDS"},\ - { 5, "STMANALARM"},\ - { 6, "STTDMER"},\ - { 7, "STNOCLK"},\ - { 8, "8"},\ -}; -#endif /* _TFA9873_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames_B0.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames_B0.h deleted file mode 100644 index 05b57857f6c0..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9873_tfafieldnames_B0.h +++ /dev/null @@ -1,933 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - - -#ifndef _TFA9873_TFAFIELDNAMES_B0_H -#define _TFA9873_TFAFIELDNAMES_B0_H - - -#define TFA9873B0_I2CVERSION 13 - -typedef enum Tfa9873B0BfEnumList { - TFA9873B0_BF_PWDN = 0x0000, /*!< Powerdown selection */ - TFA9873B0_BF_I2CR = 0x0010, /*!< I2C reset - auto clear */ - TFA9873B0_BF_AMPE = 0x0030, /*!< Activate amplifier */ - TFA9873B0_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ - TFA9873B0_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9873B0_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ - TFA9873B0_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ - TFA9873B0_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ - TFA9873B0_BF_ENPLLSYNC = 0x00e0, /*!< Manager control for enabling synchronisation with PLL FS */ - TFA9873B0_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ - TFA9873B0_BF_MANSCONF = 0x0120, /*!< I2C configured */ - TFA9873B0_BF_MUTETO = 0x0160, /*!< Time out SB mute sequence */ - TFA9873B0_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ - TFA9873B0_BF_DISFCRBST = 0x01f0, /*!< Disable boost control with FRCBST */ - TFA9873B0_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ - TFA9873B0_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9873B0_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ - TFA9873B0_BF_REV = 0x030f, /*!< Device revision information */ - TFA9873B0_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ - TFA9873B0_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ - TFA9873B0_BF_MANAOOSC = 0x0460, /*!< Internal osc off in power down mode */ - TFA9873B0_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ - TFA9873B0_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ - TFA9873B0_BF_AUTOFROSEL = 0x04a0, /*!< Override automatic OSC selection mechanism */ - TFA9873B0_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ - TFA9873B0_BF_FRCCLKSPKR = 0x0510, /*!< Force active the speaker sub-system clock when in idle power */ - TFA9873B0_BF_BSTCLKLP = 0x0520, /*!< Boost clock control in low power mode1 */ - TFA9873B0_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ - TFA9873B0_BF_CLKCHKLO = 0x0707, /*!< Clock check low threshold */ - TFA9873B0_BF_CLKCHKHI = 0x0787, /*!< Clock check higher threshold */ - TFA9873B0_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ - TFA9873B0_BF_VDDS = 0x1000, /*!< POR */ - TFA9873B0_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register, clear on read) */ - TFA9873B0_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register, clear on read) */ - TFA9873B0_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register, clear on read) */ - TFA9873B0_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register, clear on read) */ - TFA9873B0_BF_MANALARM = 0x1050, /*!< Alarm state */ - TFA9873B0_BF_CLKS = 0x1060, /*!< Clocks stable */ - TFA9873B0_BF_MTPB = 0x1070, /*!< MTP busy */ - TFA9873B0_BF_NOCLK = 0x1080, /*!< Lost clock (sticky register, clear on read) */ - TFA9873B0_BF_TDMERR = 0x10a0, /*!< TDM error */ - TFA9873B0_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9873B0_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ - TFA9873B0_BF_DCDCPC = 0x1120, /*!< Indicates current is max in DC-to-DC converter */ - TFA9873B0_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ - TFA9873B0_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ - TFA9873B0_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ - TFA9873B0_BF_PLLS = 0x1160, /*!< PLL lock */ - TFA9873B0_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ - TFA9873B0_BF_CLKOOR = 0x11c0, /*!< External clock status */ - TFA9873B0_BF_SWS = 0x11d0, /*!< Amplifier engage */ - TFA9873B0_BF_AMPS = 0x11e0, /*!< Amplifier enable */ - TFA9873B0_BF_AREFS = 0x11f0, /*!< References enable */ - TFA9873B0_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ - TFA9873B0_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ - TFA9873B0_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ - TFA9873B0_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ - TFA9873B0_BF_OVDS = 0x1380, /*!< OVP alarm */ - TFA9873B0_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ - TFA9873B0_BF_ADCCR = 0x13a0, /*!< Control ADC */ - TFA9873B0_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ - TFA9873B0_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ - TFA9873B0_BF_MANOPER = 0x13f0, /*!< Operating state */ - TFA9873B0_BF_TDMSTAT = 0x1402, /*!< TDM status bits */ - TFA9873B0_BF_MANSTATE = 0x1433, /*!< Device manager status */ - TFA9873B0_BF_AMPSTE = 0x1473, /*!< Amplifier control status */ - TFA9873B0_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ - TFA9873B0_BF_WAITSYNC = 0x14d0, /*!< CGU and PLL synchronisation status flag from CGU */ - TFA9873B0_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9873B0_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9873B0_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ - TFA9873B0_BF_TDME = 0x2000, /*!< Enable interface */ - TFA9873B0_BF_TDMSLOTS = 0x2013, /*!< N-slots in Frame */ - TFA9873B0_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ - TFA9873B0_BF_TDMFSLN = 0x2073, /*!< FS length */ - TFA9873B0_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ - TFA9873B0_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ - TFA9873B0_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ - TFA9873B0_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ - TFA9873B0_BF_TDMDEL = 0x21e0, /*!< Data delay to FS */ - TFA9873B0_BF_TDMADJ = 0x21f0, /*!< Data adjustment */ - TFA9873B0_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ - TFA9873B0_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ - TFA9873B0_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ - TFA9873B0_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ - TFA9873B0_BF_TDMSPKE = 0x2300, /*!< Control audio TDM channel in 0 */ - TFA9873B0_BF_TDMDCE = 0x2310, /*!< Control audio TDM channel in 1 */ - TFA9873B0_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ - TFA9873B0_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ - TFA9873B0_BF_TDMSPKS = 0x2603, /*!< TDM slot for sink 0 */ - TFA9873B0_BF_TDMDCS = 0x2643, /*!< TDM slot for sink 1 */ - TFA9873B0_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ - TFA9873B0_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ - TFA9873B0_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9873B0_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ - TFA9873B0_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9873B0_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ - TFA9873B0_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9873B0_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ - TFA9873B0_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ - TFA9873B0_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9873B0_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9873B0_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ - TFA9873B0_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9873B0_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ - TFA9873B0_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9873B0_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ - TFA9873B0_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ - TFA9873B0_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9873B0_BF_IEVDDS = 0x4800, /*!< Enable POR */ - TFA9873B0_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ - TFA9873B0_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9873B0_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ - TFA9873B0_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9873B0_BF_IEMANALARM = 0x4850, /*!< Enable manager alarm state */ - TFA9873B0_BF_IETDMER = 0x4860, /*!< Enable TDM error */ - TFA9873B0_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9873B0_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ - TFA9873B0_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ - TFA9873B0_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9873B0_BF_IPOOCPR = 0x4c30, /*!< Polarity OCP alarm */ - TFA9873B0_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9873B0_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ - TFA9873B0_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ - TFA9873B0_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9873B0_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ - TFA9873B0_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ - TFA9873B0_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ - TFA9873B0_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9873B0_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ - TFA9873B0_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ - TFA9873B0_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ - TFA9873B0_BF_DPSA = 0x5170, /*!< Enable DPSA */ - TFA9873B0_BF_BYHWCLIP = 0x5240, /*!< Bypass hardware clipper */ - TFA9873B0_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ - TFA9873B0_BF_BYPDLYLINE = 0x52f0, /*!< Bypass the interpolator delay line */ - TFA9873B0_BF_SLOPEE = 0x55a0, /*!< Enables slope control */ - TFA9873B0_BF_SLOPESET = 0x55b0, /*!< Slope speed setting */ - TFA9873B0_BF_PWMFREQ = 0x5900, /*!< Control for selection for PWM switching frequency */ - TFA9873B0_BF_TDMSPKG = 0x5f63, /*!< Total gain depending on INPLEV setting (channel 0) */ - TFA9873B0_BF_IPM = 0x60e1, /*!< Idle power mode control */ - TFA9873B0_BF_LNMODE = 0x62e1, /*!< Ctrl select mode */ - TFA9873B0_BF_LPM1MODE = 0x64e1, /*!< Low power mode control */ - TFA9873B0_BF_TDMSRCMAP = 0x6802, /*!< TDM source mapping */ - TFA9873B0_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ - TFA9873B0_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ - TFA9873B0_BF_TDMSRCACLIP = 0x6871, /*!< Clip information (analog /digital) for source0 */ - TFA9873B0_BF_TDMSRCBCLIP = 0x6891, /*!< Clip information (analog /digital) for source1 */ - TFA9873B0_BF_LP0 = 0x6e00, /*!< Idle power mode */ - TFA9873B0_BF_LP1 = 0x6e10, /*!< Low power mode 1 detection */ - TFA9873B0_BF_LA = 0x6e20, /*!< Low amplitude detection */ - TFA9873B0_BF_VDDPH = 0x6e30, /*!< Vddp greater than Vbat */ - TFA9873B0_BF_DELCURCOMP = 0x6f02, /*!< Delay to allign compensation signal with current sense signal */ - TFA9873B0_BF_SIGCURCOMP = 0x6f40, /*!< Polarity of compensation for current sense */ - TFA9873B0_BF_ENCURCOMP = 0x6f50, /*!< Enable current sense compensation */ - TFA9873B0_BF_LVLCLPPWM = 0x6f72, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ - TFA9873B0_BF_DCMCC = 0x7003, /*!< Max coil current */ - TFA9873B0_BF_DCCV = 0x7041, /*!< Slope compensation current, represents LxF (inductance x frequency) */ - TFA9873B0_BF_DCIE = 0x7060, /*!< Adaptive boost mode */ - TFA9873B0_BF_DCSR = 0x7070, /*!< Soft ramp up/down */ - TFA9873B0_BF_DCOVL = 0x7085, /*!< Threshold level to activate active overshoot control */ - TFA9873B0_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ - TFA9873B0_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ - TFA9873B0_BF_DCDYFSW = 0x7420, /*!< Disables the dynamic frequency switching due to flag_voutcomp86/93 */ - TFA9873B0_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ - TFA9873B0_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9873B0_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ - TFA9873B0_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ - TFA9873B0_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9873B0_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9873B0_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ - TFA9873B0_BF_ENBSTFLT = 0x7620, /*!< Enable the boost filter */ - TFA9873B0_BF_DCVOF = 0x7635, /*!< First boost voltage level */ - TFA9873B0_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ - TFA9873B0_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ - TFA9873B0_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9873B0_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9873B0_BF_MTPADDR = 0xa302, /*!< MTP address from I2C register for read/writing mtp in manual single word mode */ - TFA9873B0_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9873B0_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9873B0_BF_MTPWRMSB = 0xa70f, /*!< MSB word of write data for MTP manual write */ - TFA9873B0_BF_MTPWRLSB = 0xa80f, /*!< LSB word of write data for MTP manual write */ - TFA9873B0_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9873B0_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9873B0_BF_PLLINSI = 0xcd05, /*!< PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1 */ - TFA9873B0_BF_PLLINSP = 0xcd64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9873B0_BF_PLLINSR = 0xcdb3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9873B0_BF_PLLBDSEL = 0xcdf0, /*!< PLL bandwidth selection control, USE WITH CAUTION */ - TFA9873B0_BF_PLLNDEC = 0xce09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873B0_BF_PLLMDECM = 0xcea0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873B0_BF_PLLBP = 0xceb0, /*!< PLL bypass control during functional mode */ - TFA9873B0_BF_PLLDI = 0xcec0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873B0_BF_PLLDO = 0xced0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873B0_BF_PLLCLKSTB = 0xcee0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873B0_BF_PLLFRM = 0xcef0, /*!< PLL free running mode control in functional mode */ - TFA9873B0_BF_PLLMDECL = 0xcf0f, /*!< Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1 */ - TFA9873B0_BF_PLLPDEC = 0xd006, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9873B0_BF_PLLDCTRL = 0xd070, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ - TFA9873B0_BF_PLLLIMOFF = 0xd090, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ - TFA9873B0_BF_PLLSTRTM = 0xd0a2, /*!< PLL startup time selection control */ - TFA9873B0_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ - TFA9873B0_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ - TFA9873B0_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9873B0_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9873B0_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9873B0_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9873B0_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9873B0_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9873B0_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ -} Tfa9873B0BfEnumList_t; -#define TFA9873B0_NAMETABLE static tfaBfName_t Tfa9873B0DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown selection , */\ - { 0x10, "I2CR"}, /* I2C reset - auto clear , */\ - { 0x30, "AMPE"}, /* Activate amplifier , */\ - { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0x90, "FSSSEL"}, /* Audio sample reference , */\ - { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xc0, "TSTOCP"}, /* OCP testing control , */\ - { 0xe0, "ENPLLSYNC"}, /* Manager control for enabling synchronisation with PLL FS, */\ - { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ - { 0x120, "MANSCONF"}, /* I2C configured , */\ - { 0x160, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ - { 0x1f0, "DISFCRBST"}, /* Disable boost control with FRCBST , */\ - { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ - { 0x30f, "REV"}, /* Device revision information , */\ - { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ - { 0x460, "MANAOOSC"}, /* Internal osc off in power down mode , */\ - { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "AUTOFROSEL"}, /* Override automatic OSC selection mechanism , */\ - { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "FRCCLKSPKR"}, /* Force active the speaker sub-system clock when in idle power, */\ - { 0x520, "BSTCLKLP"}, /* Boost clock control in low power mode1 , */\ - { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ - { 0x707, "CLKCHKLO"}, /* Clock check low threshold , */\ - { 0x787, "CLKCHKHI"}, /* Clock check higher threshold , */\ - { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1020, "OTDS"}, /* OTP alarm (sticky register, clear on read) , */\ - { 0x1030, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1040, "UVDS"}, /* UVP alarm (sticky register, clear on read) , */\ - { 0x1050, "MANALARM"}, /* Alarm state , */\ - { 0x1060, "CLKS"}, /* Clocks stable , */\ - { 0x1070, "MTPB"}, /* MTP busy , */\ - { 0x1080, "NOCLK"}, /* Lost clock (sticky register, clear on read) , */\ - { 0x10a0, "TDMERR"}, /* TDM error , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "DCDCPC"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1160, "PLLS"}, /* PLL lock , */\ - { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ - { 0x11c0, "CLKOOR"}, /* External clock status , */\ - { 0x11d0, "SWS"}, /* Amplifier engage , */\ - { 0x11e0, "AMPS"}, /* Amplifier enable , */\ - { 0x11f0, "AREFS"}, /* References enable , */\ - { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ - { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ - { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ - { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ - { 0x1380, "OVDS"}, /* OVP alarm , */\ - { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ - { 0x13a0, "ADCCR"}, /* Control ADC , */\ - { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ - { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x13f0, "MANOPER"}, /* Operating state , */\ - { 0x1402, "TDMSTAT"}, /* TDM status bits , */\ - { 0x1433, "MANSTATE"}, /* Device manager status , */\ - { 0x1473, "AMPSTE"}, /* Amplifier control status , */\ - { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x14d0, "WAITSYNC"}, /* CGU and PLL synchronisation status flag from CGU , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2000, "TDME"}, /* Enable interface , */\ - { 0x2013, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2073, "TDMFSLN"}, /* FS length , */\ - { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ - { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ - { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x21e0, "TDMDEL"}, /* Data delay to FS , */\ - { 0x21f0, "TDMADJ"}, /* Data adjustment , */\ - { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ - { 0x2300, "TDMSPKE"}, /* Control audio TDM channel in 0 , */\ - { 0x2310, "TDMDCE"}, /* Control audio TDM channel in 1 , */\ - { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "TDMSPKS"}, /* TDM slot for sink 0 , */\ - { 0x2643, "TDMDCS"}, /* TDM slot for sink 1 , */\ - { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ - { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ - { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4800, "IEVDDS"}, /* Enable POR , */\ - { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IEMANALARM"}, /* Enable manager alarm state , */\ - { 0x4860, "IETDMER"}, /* Enable TDM error , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ - { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOCPR"}, /* Polarity OCP alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ - { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ - { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ - { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ - { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ - { 0x5170, "DPSA"}, /* Enable DPSA , */\ - { 0x5240, "BYHWCLIP"}, /* Bypass hardware clipper , */\ - { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x52f0, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ - { 0x55a0, "SLOPEE"}, /* Enables slope control , */\ - { 0x55b0, "SLOPESET"}, /* Slope speed setting , */\ - { 0x5900, "PWMFREQ"}, /* Control for selection for PWM switching frequency , */\ - { 0x5f63, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x60e1, "IPM"}, /* Idle power mode control , */\ - { 0x62e1, "LNMODE"}, /* Ctrl select mode , */\ - { 0x64e1, "LPM1MODE"}, /* Low power mode control , */\ - { 0x6802, "TDMSRCMAP"}, /* TDM source mapping , */\ - { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ - { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ - { 0x6871, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ - { 0x6891, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ - { 0x6e00, "LP0"}, /* Idle power mode , */\ - { 0x6e10, "LP1"}, /* Low power mode 1 detection , */\ - { 0x6e20, "LA"}, /* Low amplitude detection , */\ - { 0x6e30, "VDDPH"}, /* Vddp greater than Vbat , */\ - { 0x6f02, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ - { 0x6f50, "ENCURCOMP"}, /* Enable current sense compensation , */\ - { 0x6f72, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7003, "DCMCC"}, /* Max coil current , */\ - { 0x7041, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ - { 0x7060, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7070, "DCSR"}, /* Soft ramp up/down , */\ - { 0x7085, "DCOVL"}, /* Threshold level to activate active overshoot control, */\ - { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ - { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7420, "DCDYFSW"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ - { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7620, "ENBSTFLT"}, /* Enable the boost filter , */\ - { 0x7635, "DCVOF"}, /* First boost voltage level , */\ - { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ - { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "MTPADDR"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "MTPWRMSB"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "MTPWRLSB"}, /* LSB word of write data for MTP manual write , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xcd05, "PLLINSI"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ - { 0xcd64, "PLLINSP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdb3, "PLLINSR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdf0, "PLLBDSEL"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ - { 0xce09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcea0, "PLLMDECM"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xceb0, "PLLBP"}, /* PLL bypass control during functional mode , */\ - { 0xcec0, "PLLDI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xced0, "PLLDO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcee0, "PLLCLKSTB"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcef0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ - { 0xcf0f, "PLLMDECL"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ - { 0xd006, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd070, "PLLDCTRL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xd090, "PLLLIMOFF"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xd0a2, "PLLSTRTM"}, /* PLL startup time selection control , */\ - { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ - { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9873B0_BITNAMETABLE static tfaBfName_t Tfa9873B0BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown selection , */\ - { 0x10, "reset"}, /* I2C reset - auto clear , */\ - { 0x30, "enbl_amplifier"}, /* Activate amplifier , */\ - { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ - { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xc0, "test_ocp"}, /* OCP testing control , */\ - { 0xd0, "sel_man_wait_time"}, /* Manager wait time selection control , */\ - { 0xe0, "enbl_pll_synchronisation"}, /* Manager control for enabling synchronisation with PLL FS, */\ - { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ - { 0x120, "src_set_configured"}, /* I2C configured , */\ - { 0x160, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ - { 0x1f0, "disable_frcbst"}, /* Disable boost control with FRCBST , */\ - { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ - { 0x30f, "device_rev"}, /* Device revision information , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ - { 0x460, "enbl_osc_auto_off"}, /* Internal osc off in power down mode , */\ - { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "override_auto_sel_osc"}, /* Override automatic OSC selection mechanism , */\ - { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "force_spkr_clk"}, /* Force active the speaker sub-system clock when in idle power, */\ - { 0x520, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ - { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ - { 0x707, "clkchk_th_lo"}, /* Clock check low threshold , */\ - { 0x787, "clkchk_th_hi"}, /* Clock check higher threshold , */\ - { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register, clear on read) , */\ - { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register, clear on read) , */\ - { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1080, "flag_lost_clk"}, /* Lost clock (sticky register, clear on read) , */\ - { 0x10a0, "flag_tdm_error"}, /* TDM error , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ - { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ - { 0x11c0, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ - { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ - { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ - { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ - { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ - { 0x1402, "flag_tdm_status"}, /* TDM status bits , */\ - { 0x1433, "man_state"}, /* Device manager status , */\ - { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ - { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x14d0, "flag_waiting_for_sync"}, /* CGU and PLL synchronisation status flag from CGU , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2000, "tdm_enable"}, /* Enable interface , */\ - { 0x2013, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ - { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ - { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x21e0, "tdm_data_delay"}, /* Data delay to FS , */\ - { 0x21f0, "tdm_data_adjustment"}, /* Data adjustment , */\ - { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ - { 0x2300, "tdm_sink0_enable"}, /* Control audio TDM channel in 0 , */\ - { 0x2310, "tdm_sink1_enable"}, /* Control audio TDM channel in 1 , */\ - { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ - { 0x2643, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ - { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ - { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ - { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ - { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable manager alarm state , */\ - { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ - { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity OCP alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ - { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ - { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ - { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ - { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0x5240, "bypasshwclip"}, /* Bypass hardware clipper , */\ - { 0x5257, "gain"}, /* Amplifier gain , */\ - { 0x52f0, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA release time , */\ - { 0x5350, "bypass_lp"}, /* Bypass the low pass filter inside temperature sensor, */\ - { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x5463, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit DAC , */\ - { 0x54a1, "ref_amp_irefdist_set_ctrl"}, /* Scaling of reference current for amplifier OCP , */\ - { 0x5500, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5513, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5552, "dpsa_drive"}, /* Drive setting (binary coded) , */\ - { 0x5581, "ctrlloop_vstress_select"}, /* GO2 capacitor stress selector for control loop , */\ - { 0x55a0, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x55b0, "ctrl_slope"}, /* Slope speed setting , */\ - { 0x5600, "ref_iref_enbl"}, /* Enable of reference current for OCP , */\ - { 0x5652, "ref_irefdist_test_enbl"}, /* Enable of test-function of distribution of reference current, used for OCP. When enabled, the current will to to anamux iso powerstages. Using e.g. 011 it will add the current of powerstage P and N., */\ - { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ - { 0x57b0, "enbl_engage"}, /* Enables/engage the control stage , */\ - { 0x57c0, "enbl_engage_pst"}, /* Enables/engage the power stage , */\ - { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clock PWM is 1/(K*2048*fs), */\ - { 0x5890, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ - { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ - { 0x5900, "sel_pwm_freq"}, /* Control for selection for PWM switching frequency , */\ - { 0x5910, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ - { 0x5f63, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x6005, "idle_power_cal_offset"}, /* Idle power mode detector ctrl cal_offset from gain module , */\ - { 0x6065, "idle_power_zero_lvl"}, /* IIdle power mode zero crossing detection level , */\ - { 0x60e1, "idle_power_mode"}, /* Idle power mode control , */\ - { 0x6105, "idle_power_threshold_lvl"}, /* Idle power mode amplitude trigger level , */\ - { 0x6165, "idle_power_hold_time"}, /* Idle power mode detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x61c0, "disable_idle_power_mode"}, /* Idle power mode detector control , */\ - { 0x6265, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ - { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ - { 0x62e1, "lownoisegain_mode"}, /* Ctrl select mode , */\ - { 0x6305, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ - { 0x6365, "hold_time"}, /* Low noise gain switch ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x6405, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x6465, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ - { 0x64e1, "lpm1_mode"}, /* Low power mode control , */\ - { 0x6505, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ - { 0x6565, "lpm1_hold_time"}, /* Low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x65c0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ - { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC Number of zero current flags to count before going to PFM mode, */\ - { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x66d2, "pfmfreq_limit"}, /* Lowest PFM frequency limit , */\ - { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ - { 0x6713, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ - { 0x6750, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ - { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ - { 0x6802, "tdm_source_mapping"}, /* TDM source mapping , */\ - { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ - { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ - { 0x6871, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ - { 0x6891, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ - { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ - { 0x6b00, "disable_auto_engage"}, /* Disable auto engange , */\ - { 0x6b10, "disable_engage"}, /* Disable engange , */\ - { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x6c69, "spare_out"}, /* spare_out , */\ - { 0x6d0f, "spare_in"}, /* spare_in , */\ - { 0x6e00, "flag_idle_power_mode"}, /* Idle power mode , */\ - { 0x6e10, "flag_lp_detect_mode1"}, /* Low power mode 1 detection , */\ - { 0x6e20, "flag_low_amplitude"}, /* Low amplitude detection , */\ - { 0x6e30, "flag_vddp_gt_vbat"}, /* Vddp greater than Vbat , */\ - { 0x6f02, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ - { 0x6f50, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ - { 0x6f72, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7003, "boost_cur"}, /* Max coil current , */\ - { 0x7041, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) , */\ - { 0x7060, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7070, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x7085, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ - { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current DAC , */\ - { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7290, "enbl_bst_windac"}, /* Enable window DAC , */\ - { 0x72a5, "bst_windac"}, /* For testing direct control windac , */\ - { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7350, "disable_artf654484_fix"}, /* Disables the fix for artf654484 (loss of efficiency when Vbst is close to Vbat), */\ - { 0x7360, "disable_artf676996_fix"}, /* Disables the fix for artf676996 (OCP booster triggered when Vtrgt is just above Vbat), */\ - { 0x7371, "ref_bst_irefdist_set_ctrl"}, /* Scaling of reference current for booster OCP , */\ - { 0x7420, "disable_dynamic_freq"}, /* Disables the dynamic frequency switching due to flag_voutcomp86/93, */\ - { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ - { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7620, "enbl_bst_filter"}, /* Enable the boost filter , */\ - { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ - { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ - { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ - { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ - { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ - { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ - { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ - { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ - { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ - { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ - { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ - { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ - { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ - { 0x8887, "vs_gain"}, /* Voltage sense gain , */\ - { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ - { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ - { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ - { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ - { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ - { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ - { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ - { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ - { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ - { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ - { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ - { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ - { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ - { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ - { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_protected registers (default for engineering), */\ - { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xb200, "bypass_ovpglitchfilter"}, /* Bypass glitch filter on over voltage protection signal from analog, */\ - { 0xb210, "enbl_ovp_alarm_state"}, /* Allow manager to go into alarm state when OVP (only when ctrl_vpalarm is 0), */\ - { 0xb220, "amp_in_tristate_when_ovp"}, /* Brings amplifier in tristate when OVP (only when ctrl_enbl_ovp_alarm_state is 0) , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ - { 0xc0f0, "enbl_fro"}, /* Enables FRO8M in I2C direct control mode only , */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc376, "pulselength"}, /* Pulse length setting test input for amplifier (PWM clock 2048/4096 Fs), */\ - { 0xc3e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert PWMbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old OCP (ctrl_reversebst is 0), For new OCP (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ - { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ - { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ - { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 (see Digimux list for details), */\ - { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on VSN/TEST3 , */\ - { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on VSP/TEST4 , */\ - { 0xcd05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode, only with pll_bandsel set to 1, */\ - { 0xcd64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdb3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ - { 0xce09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcea0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xceb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ - { 0xcec0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xced0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcee0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcef0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ - { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15 to 0 of PLL MDEC in direct control mode, use_direct_pll_ctrl set to 1, */\ - { 0xd006, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd070, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xd090, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xd0a2, "sel_pll_startup_time"}, /* PLL startup time selection control , */\ - { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xd202, "tsig_freq_msb"}, /* Internal sinus test generator, frequency control msb bits, */\ - { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd283, "tsig_gain"}, /* Test signal gain , */\ - { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd800, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ - { 0xd810, "gainatt_tdm_feedback"}, /* GainAtt feedback to TDM , */\ - { 0xd822, "test_parametric_io"}, /* Test io parametric , */\ - { 0xd861, "test_spare_out1"}, /* Test spare out 1 , */\ - { 0xd880, "bst_dcmbst"}, /* DCM boost , */\ - { 0xd8c3, "test_spare_out2"}, /* Test spare out 1 , */\ - { 0xd900, "enbl_frocal"}, /* Enable FRO calibration , */\ - { 0xd910, "start_fro_calibration"}, /* Start FRO8 Calibration , */\ - { 0xd920, "enbl_irefcal"}, /* Enable IREF calibration , */\ - { 0xd930, "start_iref_calibration"}, /* Start IREF Calibration , */\ - { 0xda00, "fro_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ - { 0xda15, "fro_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ - { 0xda80, "iref_calibration_done"}, /* IREF Calibration done - Read Only , */\ - { 0xda94, "iref_auto_trim_val"}, /* Calibration value from auto calibration, to be written into MTP - Read Only, */\ - { 0xdae0, "iref_calibration_error"}, /* IREF Calibration done - Read Only , */\ - { 0xe00f, "sw_profile"}, /* Software profile data , */\ - { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf307, "calibr_gain_vs1"}, /* Voltage sense gain when external voltage sensing input is selected, */\ - { 0xf387, "calibr_gain_vs2"}, /* Voltage sense gain when internal voltage sensing input is selected, */\ - { 0xf407, "vs_trim1"}, /* VS Trimming when external voltage sensing input is selected, */\ - { 0xf487, "vs_trim2"}, /* VS Trimming when internal voltage sensing input is selected, */\ - { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ - { 0xf607, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ - { 0xf910, "mtp_pll_lut_sel"}, /* PLL lookup table selection control , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ - { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ - { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ - { 0xff05, "fro_trim"}, /* 8 MHz oscillator trim code , */\ - { 0xff61, "fro_shortnwell"}, /* Short 4 or 6 n-well resistors , */\ - { 0xff81, "fro_boost"}, /* Self bias current selection , */\ - { 0xffa4, "calibr_iref_trim"}, /* Trimming control of reference current for OCP , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; -#if 0 -enum tfa9873_irq { - tfa9873_irq_stvdds = 0, - tfa9873_irq_stbstoc = 1, - tfa9873_irq_stotds = 2, - tfa9873_irq_stocpr = 3, - tfa9873_irq_stuvds = 4, - tfa9873_irq_stmanalarm = 5, - tfa9873_irq_sttdmer = 6, - tfa9873_irq_stnoclk = 7, - tfa9873_irq_max = 8, - tfa9873_irq_all = -1 /* all irqs */}; -#endif// -#define TFA9873_IRQ_NAMETABLE static tfaIrqName_t Tfa9873IrqNames[] = {\ - { 0, "STVDDS"},\ - { 1, "STBSTOC"},\ - { 2, "STOTDS"},\ - { 3, "STOCPR"},\ - { 4, "STUVDS"},\ - { 5, "STMANALARM"},\ - { 6, "STTDMER"},\ - { 7, "STNOCLK"},\ - { 8, "8"},\ -}; -#endif /* _TFA9873_TFAFIELDNAMES_B0_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9874_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9874_tfafieldnames.h deleted file mode 100644 index d32dd40f73cd..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9874_tfafieldnames.h +++ /dev/null @@ -1,843 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9874_tfaFieldnames_last.h - * This file was generated automatically on 09/28/18 at 11:20:52. - * Source file: TFA9874N1C0_DefaultI2CSettings.xlsx - */ - -#ifndef _TFA9874_TFAFIELDNAMES_H -#define _TFA9874_TFAFIELDNAMES_H - - -#define TFA9874_I2CVERSION 1.16 - -typedef enum Tfa9874BfEnumList { - TFA9874_BF_PWDN = 0x0000, /*!< Powerdown selection */ - TFA9874_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ - TFA9874_BF_AMPE = 0x0030, /*!< Activate Amplifier */ - TFA9874_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ - TFA9874_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9874_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ - TFA9874_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ - TFA9874_BF_MANSCONF = 0x0120, /*!< I2C configured */ - TFA9874_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ - TFA9874_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ - TFA9874_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ - TFA9874_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ - TFA9874_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9874_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ - TFA9874_BF_REV = 0x030f, /*!< Revision info */ - TFA9874_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ - TFA9874_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ - TFA9874_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ - TFA9874_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ - TFA9874_BF_VDDS = 0x1000, /*!< POR */ - TFA9874_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register , clear on read) */ - TFA9874_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register , clear on read) */ - TFA9874_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register , clear on read) */ - TFA9874_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register , clear on read) */ - TFA9874_BF_MANALARM = 0x1050, /*!< Alarm state */ - TFA9874_BF_TDMERR = 0x1060, /*!< TDM error */ - TFA9874_BF_NOCLK = 0x1070, /*!< Lost clock (sticky register , clear on read) */ - TFA9874_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9874_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register , clear on read) */ - TFA9874_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ - TFA9874_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ - TFA9874_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ - TFA9874_BF_PLLS = 0x1160, /*!< PLL lock */ - TFA9874_BF_CLKS = 0x1170, /*!< Clocks stable */ - TFA9874_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ - TFA9874_BF_TDMSTAT = 0x1192, /*!< TDM status bits */ - TFA9874_BF_MTPB = 0x11c0, /*!< MTP busy */ - TFA9874_BF_SWS = 0x11d0, /*!< Amplifier engage */ - TFA9874_BF_AMPS = 0x11e0, /*!< Amplifier enable */ - TFA9874_BF_AREFS = 0x11f0, /*!< References enable */ - TFA9874_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ - TFA9874_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ - TFA9874_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ - TFA9874_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ - TFA9874_BF_OVDS = 0x1380, /*!< OVP alarm */ - TFA9874_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ - TFA9874_BF_ADCCR = 0x13a0, /*!< Control ADC */ - TFA9874_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ - TFA9874_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ - TFA9874_BF_MANOPER = 0x13f0, /*!< Operating state */ - TFA9874_BF_CLKOOR = 0x1420, /*!< External clock status */ - TFA9874_BF_MANSTATE = 0x1433, /*!< Device manager status */ - TFA9874_BF_DCMODE = 0x1471, /*!< DCDC mode status bits */ - TFA9874_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9874_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9874_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ - TFA9874_BF_TDME = 0x2040, /*!< Enable interface */ - TFA9874_BF_TDMMODE = 0x2050, /*!< Slave/master */ - TFA9874_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ - TFA9874_BF_TDMFSLN = 0x2073, /*!< FS length (master mode only) */ - TFA9874_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ - TFA9874_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ - TFA9874_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ - TFA9874_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ - TFA9874_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ - TFA9874_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ - TFA9874_BF_TDMADJ = 0x21f0, /*!< data adjustment */ - TFA9874_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ - TFA9874_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ - TFA9874_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ - TFA9874_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ - TFA9874_BF_TDMSPKE = 0x2300, /*!< Control audio tdm channel in 0 (spkr + dcdc) */ - TFA9874_BF_TDMDCE = 0x2310, /*!< Control audio tdm channel in 1 (dcdc) */ - TFA9874_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ - TFA9874_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ - TFA9874_BF_TDMSPKS = 0x2603, /*!< tdm slot for sink 0 (speaker + dcdc) */ - TFA9874_BF_TDMDCS = 0x2643, /*!< tdm slot for sink 1 (dcdc) */ - TFA9874_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ - TFA9874_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ - TFA9874_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9874_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ - TFA9874_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9874_BF_ISTOCPR = 0x4030, /*!< Status ocp alarm */ - TFA9874_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9874_BF_ISTMANALARM = 0x4050, /*!< Status nanager Alarm state */ - TFA9874_BF_ISTTDMER = 0x4060, /*!< Status tdm error */ - TFA9874_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9874_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9874_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ - TFA9874_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9874_BF_ICLOCPR = 0x4430, /*!< Clear ocp alarm */ - TFA9874_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9874_BF_ICLMANALARM = 0x4450, /*!< clear nanager Alarm state */ - TFA9874_BF_ICLTDMER = 0x4460, /*!< Clear tdm error */ - TFA9874_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9874_BF_IEVDDS = 0x4800, /*!< Enable por */ - TFA9874_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ - TFA9874_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9874_BF_IEOCPR = 0x4830, /*!< Enable ocp alarm */ - TFA9874_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9874_BF_IEMANALARM = 0x4850, /*!< Enable nanager Alarm state */ - TFA9874_BF_IETDMER = 0x4860, /*!< Enable tdm error */ - TFA9874_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9874_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ - TFA9874_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ - TFA9874_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9874_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ - TFA9874_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9874_BF_IPOMANALARM = 0x4c50, /*!< Polarity nanager Alarm state */ - TFA9874_BF_IPOTDMER = 0x4c60, /*!< Polarity tdm error */ - TFA9874_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9874_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time */ - TFA9874_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ - TFA9874_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ - TFA9874_BF_VBATFLTL = 0x5080, /*!< vbat filter limit */ - TFA9874_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9874_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ - TFA9874_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ - TFA9874_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ - TFA9874_BF_DPSA = 0x5170, /*!< Enable DPSA */ - TFA9874_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ - TFA9874_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ - TFA9874_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ - TFA9874_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ - TFA9874_BF_TDMDCG = 0x6123, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ - TFA9874_BF_TDMSPKG = 0x6163, /*!< Total gain depending on INPLEV setting (channel 0) */ - TFA9874_BF_LNMODE = 0x62e1, /*!< ctrl select mode */ - TFA9874_BF_LPM1MODE = 0x64e1, /*!< low power mode control */ - TFA9874_BF_TDMSRCMAP = 0x6802, /*!< tdm source mapping */ - TFA9874_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ - TFA9874_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ - TFA9874_BF_TDMSRCACLIP = 0x6871, /*!< clip information (analog /digital) for source0 */ - TFA9874_BF_TDMSRCBCLIP = 0x6891, /*!< clip information (analog /digital) for source1 */ - TFA9874_BF_LP1 = 0x6e10, /*!< low power mode 1 detection */ - TFA9874_BF_LA = 0x6e20, /*!< low amplitude detection */ - TFA9874_BF_VDDPH = 0x6e30, /*!< vddp greater than vbat */ - TFA9874_BF_DELCURCOMP = 0x6f02, /*!< delay to allign compensation signal with current sense signal */ - TFA9874_BF_SIGCURCOMP = 0x6f40, /*!< polarity of compensation for current sense */ - TFA9874_BF_ENCURCOMP = 0x6f50, /*!< enable current sense compensation */ - TFA9874_BF_LVLCLPPWM = 0x6f72, /*!< set the amount of pwm pulse that may be skipped before clip-flag is triggered */ - TFA9874_BF_DCMCC = 0x7033, /*!< Max coil current */ - TFA9874_BF_DCCV = 0x7071, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ - TFA9874_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ - TFA9874_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ - TFA9874_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ - TFA9874_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ - TFA9874_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ - TFA9874_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9874_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ - TFA9874_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ - TFA9874_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9874_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9874_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ - TFA9874_BF_DCVOF = 0x7635, /*!< First boost voltage level */ - TFA9874_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ - TFA9874_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ - TFA9874_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9874_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9874_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ - TFA9874_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9874_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9874_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9874_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9874_BF_SWPROFIL = 0xee0f, /*!< Software profile data */ - TFA9874_BF_SWVSTEP = 0xef0f, /*!< Software vstep information */ - TFA9874_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9874_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9874_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9874_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9874_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9874_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9874_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ -} Tfa9874BfEnumList_t; -#define TFA9874_NAMETABLE static tfaBfName_t Tfa9874DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown selection , */\ - { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ - { 0x30, "AMPE"}, /* Activate Amplifier , */\ - { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xc0, "TSTOCP"}, /* OCP testing control , */\ - { 0x120, "MANSCONF"}, /* I2C configured , */\ - { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ - { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ - { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ - { 0x30f, "REV"}, /* Revision info , */\ - { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ - { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ - { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ - { 0x1020, "OTDS"}, /* OTP alarm (sticky register , clear on read) , */\ - { 0x1030, "OCDS"}, /* OCP amplifier (sticky register , clear on read), */\ - { 0x1040, "UVDS"}, /* UVP alarm (sticky register , clear on read) , */\ - { 0x1050, "MANALARM"}, /* Alarm state , */\ - { 0x1060, "TDMERR"}, /* TDM error , */\ - { 0x1070, "NOCLK"}, /* Lost clock (sticky register , clear on read) , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active (sticky register , clear on read) , */\ - { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1160, "PLLS"}, /* PLL lock , */\ - { 0x1170, "CLKS"}, /* Clocks stable , */\ - { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ - { 0x1192, "TDMSTAT"}, /* TDM status bits , */\ - { 0x11c0, "MTPB"}, /* MTP busy , */\ - { 0x11d0, "SWS"}, /* Amplifier engage , */\ - { 0x11e0, "AMPS"}, /* Amplifier enable , */\ - { 0x11f0, "AREFS"}, /* References enable , */\ - { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ - { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ - { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ - { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ - { 0x1380, "OVDS"}, /* OVP alarm , */\ - { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ - { 0x13a0, "ADCCR"}, /* Control ADC , */\ - { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ - { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x13f0, "MANOPER"}, /* Operating state , */\ - { 0x1420, "CLKOOR"}, /* External clock status , */\ - { 0x1433, "MANSTATE"}, /* Device manager status , */\ - { 0x1471, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2040, "TDME"}, /* Enable interface , */\ - { 0x2050, "TDMMODE"}, /* Slave/master , */\ - { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2073, "TDMFSLN"}, /* FS length (master mode only) , */\ - { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ - { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ - { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ - { 0x21f0, "TDMADJ"}, /* data adjustment , */\ - { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ - { 0x2300, "TDMSPKE"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ - { 0x2310, "TDMDCE"}, /* Control audio tdm channel in 1 (dcdc) , */\ - { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "TDMSPKS"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ - { 0x2643, "TDMDCS"}, /* tdm slot for sink 1 (dcdc) , */\ - { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOCPR"}, /* Status ocp alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTMANALARM"}, /* Status nanager Alarm state , */\ - { 0x4060, "ISTTDMER"}, /* Status tdm error , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOCPR"}, /* Clear ocp alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLMANALARM"}, /* clear nanager Alarm state , */\ - { 0x4460, "ICLTDMER"}, /* Clear tdm error , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4800, "IEVDDS"}, /* Enable por , */\ - { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOCPR"}, /* Enable ocp alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IEMANALARM"}, /* Enable nanager Alarm state , */\ - { 0x4860, "IETDMER"}, /* Enable tdm error , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ - { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOMANALARM"}, /* Polarity nanager Alarm state , */\ - { 0x4c60, "IPOTDMER"}, /* Polarity tdm error , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x5001, "BSSCR"}, /* Battery Safeguard attack time , */\ - { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ - { 0x5080, "VBATFLTL"}, /* vbat filter limit , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ - { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ - { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ - { 0x5170, "DPSA"}, /* Enable DPSA , */\ - { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ - { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ - { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ - { 0x6123, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x6163, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x62e1, "LNMODE"}, /* ctrl select mode , */\ - { 0x64e1, "LPM1MODE"}, /* low power mode control , */\ - { 0x6802, "TDMSRCMAP"}, /* tdm source mapping , */\ - { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ - { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ - { 0x6871, "TDMSRCACLIP"}, /* clip information (analog /digital) for source0 , */\ - { 0x6891, "TDMSRCBCLIP"}, /* clip information (analog /digital) for source1 , */\ - { 0x6e10, "LP1"}, /* low power mode 1 detection , */\ - { 0x6e20, "LA"}, /* low amplitude detection , */\ - { 0x6e30, "VDDPH"}, /* vddp greater than vbat , */\ - { 0x6f02, "DELCURCOMP"}, /* delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "SIGCURCOMP"}, /* polarity of compensation for current sense , */\ - { 0x6f50, "ENCURCOMP"}, /* enable current sense compensation , */\ - { 0x6f72, "LVLCLPPWM"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7033, "DCMCC"}, /* Max coil current , */\ - { 0x7071, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ - { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ - { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ - { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7635, "DCVOF"}, /* First boost voltage level , */\ - { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ - { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xee0f, "SWPROFIL"}, /* Software profile data , */\ - { 0xef0f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9874_BITNAMETABLE static tfaBfName_t Tfa9874BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown selection , */\ - { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ - { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ - { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xc0, "test_ocp"}, /* OCP testing control , */\ - { 0x120, "src_set_configured"}, /* I2C configured , */\ - { 0x140, "enbl_osc1m_auto_off"}, /* Internal osc off at PWDN , */\ - { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ - { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ - { 0x2d0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ - { 0x30f, "device_rev"}, /* Revision info , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ - { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ - { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register , clear on read) , */\ - { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register , clear on read), */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register , clear on read) , */\ - { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x1060, "flag_tdm_error"}, /* TDM error , */\ - { 0x1070, "flag_lost_clk"}, /* Lost clock (sticky register , clear on read) , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register , clear on read) , */\ - { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ - { 0x1170, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ - { 0x1192, "flag_tdm_status"}, /* TDM status bits , */\ - { 0x11c0, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ - { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ - { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ - { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ - { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ - { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x1433, "man_state"}, /* Device manager status , */\ - { 0x1471, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2040, "tdm_enable"}, /* Enable interface , */\ - { 0x2050, "tdm_mode"}, /* Slave/master , */\ - { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2073, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ - { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ - { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ - { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ - { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ - { 0x2300, "tdm_sink0_enable"}, /* Control audio tdm channel in 0 (spkr + dcdc) , */\ - { 0x2310, "tdm_sink1_enable"}, /* Control audio tdm channel in 1 (dcdc) , */\ - { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "tdm_sink0_slot"}, /* tdm slot for sink 0 (speaker + dcdc) , */\ - { 0x2643, "tdm_sink1_slot"}, /* tdm slot for sink 1 (dcdc) , */\ - { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_man_alarm_state"}, /* Status nanager Alarm state , */\ - { 0x4060, "int_out_flag_tdm_error"}, /* Status tdm error , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_man_alarm_state"}, /* clear nanager Alarm state , */\ - { 0x4460, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ - { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable nanager Alarm state , */\ - { 0x4860, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ - { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity nanager Alarm state , */\ - { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ - { 0x5080, "vbat_flt_limit"}, /* vbat filter limit , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ - { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ - { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ - { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ - { 0x5257, "gain"}, /* Amplifier gain , */\ - { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ - { 0x5340, "clipfast"}, /* Clock selection for HW clipper for Battery Safeguard, */\ - { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ - { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ - { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ - { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5582, "dpsa_drive"}, /* Drive setting (bin. coded) , */\ - { 0x5690, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ - { 0x56a1, "enbl_odd_up_even_down"}, /* Control for PWM reference sawtooth generartion , */\ - { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ - { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ - { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ - { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5820, "pwm_shape"}, /* PWM shape , */\ - { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ - { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ - { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ - { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ - { 0x6123, "ctrl_attl"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x6163, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x6265, "zero_lvl"}, /* low noise gain switch zero trigger level , */\ - { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ - { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ - { 0x6305, "threshold_lvl"}, /* low noise gain switch trigger level , */\ - { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 zero crossing detection level , */\ - { 0x64e1, "lpm1_mode"}, /* low power mode control , */\ - { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 amplitude trigger level , */\ - { 0x6565, "lpm1_hold_time"}, /* low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ - { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ - { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ - { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ - { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ - { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtred vs unfiltered compare , */\ - { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ - { 0x6802, "tdm_source_mapping"}, /* tdm source mapping , */\ - { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ - { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ - { 0x6871, "tdm_source0_clip_sel"}, /* clip information (analog /digital) for source0 , */\ - { 0x6891, "tdm_source1_clip_sel"}, /* clip information (analog /digital) for source1 , */\ - { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ - { 0x6b00, "disable_auto_engage"}, /* disable auto engange , */\ - { 0x6b10, "disable_engage"}, /* disable engange , */\ - { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x6c69, "spare_out"}, /* spare_out , */\ - { 0x6d0f, "spare_in"}, /* spare_in , */\ - { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ - { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ - { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ - { 0x6f02, "cursense_comp_delay"}, /* delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "cursense_comp_sign"}, /* polarity of compensation for current sense , */\ - { 0x6f50, "enbl_cursense_comp"}, /* enable current sense compensation , */\ - { 0x6f72, "pwms_clip_lvl"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7033, "boost_cur"}, /* Max coil current , */\ - { 0x7071, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ - { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ - { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7360, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ - { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ - { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ - { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ - { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ - { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ - { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ - { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ - { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ - { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ - { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ - { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ - { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ - { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ - { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ - { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ - { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ - { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ - { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ - { 0x8801, "volsense_pwm_sel"}, /* Voltage sense source selection control , */\ - { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ - { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ - { 0x8870, "vs_igen_supply"}, /* Switch internal supply of current generator , */\ - { 0x8887, "vs_gain"}, /* voltage sense gain , */\ - { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ - { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ - { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ - { 0x8d10, "vs_classd_tran_skip"}, /* Skip voltage sense connection during a classD amplifier transition, */\ - { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ - { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ - { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ - { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ - { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ - { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ - { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ - { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ - { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ - { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ - { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ - { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0c0, "use_direct_vs_ctrls"}, /* voltage sense Direct control to overrule several functions for testing, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ - { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ - { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ - { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ - { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ - { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to PDMDAT (see Digimux list for details), */\ - { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ - { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ - { 0xcd05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ - { 0xcd64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ - { 0xcdb3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ - { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ - { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ - { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ - { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ - { 0xcec0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ - { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ - { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ - { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ - { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ - { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ - { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ - { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd283, "tsig_gain"}, /* Test signal gain , */\ - { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xd621, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ - { 0xd641, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ - { 0xd661, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ - { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd800, "source_in_testmode"}, /* tdm source in test mode (return only current and voltage sense), */\ - { 0xd810, "gainatt_feedback"}, /* gainatt feedback to tdm , */\ - { 0xd822, "test_parametric_io"}, /* test io parametric , */\ - { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ - { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ - { 0xd880, "bst_dcmbst"}, /* dcm boost , */\ - { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ - { 0xee0f, "sw_profile"}, /* Software profile data , */\ - { 0xef0f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf169, "spare_mpt1_15_6"}, /* SPARE , */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf2a5, "spare_mtp2_15_10"}, /* SPARE , */\ - { 0xf307, "calibr_gain_vs"}, /* Voltage sense gain , */\ - { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf407, "spare_mtp4_15_0"}, /* SPARE , */\ - { 0xf487, "vs_trim"}, /* VS Trimming , */\ - { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ - { 0xf60f, "spare_mpt6_6_0"}, /* SPARE , */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf770, "spare_mtp7_07"}, /* SPARE , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf7f0, "spare_mtp7_15"}, /* SPARE , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ - { 0xf910, "spare_mtp9_1"}, /* SPARE , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ - { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf980, "spare_mtp9_8"}, /* SPARE , */\ - { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* pwm delay clock auto gating , */\ - { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* ocpclock auto gating , */\ - { 0xf9b0, "mtp_gate_cgu_clock_for_test"}, /* cgu test clock control , */\ - { 0xf9c0, "mtp_tdm_pad_sel"}, /* tdm pad selection , */\ - { 0xf9d2, "spare_mtp9_15_12"}, /* MTP-control FW - See Firmware I2C API document for details, */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ - { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ - { 0xff87, "spare_mtp7_15_08"}, /* SPARE , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa9874_irq { - tfa9874_irq_stvdds = 0, - tfa9874_irq_stbstoc = 1, - tfa9874_irq_stotds = 2, - tfa9874_irq_stocpr = 3, - tfa9874_irq_stuvds = 4, - tfa9874_irq_stmanalarm = 5, - tfa9874_irq_sttdmer = 6, - tfa9874_irq_stnoclk = 7, - tfa9874_irq_max = 8, - tfa9874_irq_all = -1 /* all irqs */}; - -#define TFA9874_IRQ_NAMETABLE static tfaIrqName_t Tfa9874IrqNames[] = {\ - { 0, "STVDDS"},\ - { 1, "STBSTOC"},\ - { 2, "STOTDS"},\ - { 3, "STOCPR"},\ - { 4, "STUVDS"},\ - { 5, "STMANALARM"},\ - { 6, "STTDMER"},\ - { 7, "STNOCLK"},\ - { 8, "8"},\ -}; -#endif /* _TFA9874_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9878_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9878_tfafieldnames.h deleted file mode 100644 index c604703f0a6c..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9878_tfafieldnames.h +++ /dev/null @@ -1,980 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9878_tfaFieldnames.h - * This file was generated automatically on 06/28/19 at 10:22:32. - * Source file: TFA9878_PRB3_N1A1_DefaultI2CSettings.xlsx - */ - -#ifndef _TFA9878_TFAFIELDNAMES_H -#define _TFA9878_TFAFIELDNAMES_H - - -#define TFA9878_I2CVERSION 12 - -typedef enum Tfa9878BfEnumList { - TFA9878_BF_PWDN = 0x0000, /*!< Powerdown selection */ - TFA9878_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ - TFA9878_BF_AMPE = 0x0030, /*!< Activate Amplifier */ - TFA9878_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ - TFA9878_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9878_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ - TFA9878_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ - TFA9878_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ - TFA9878_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ - TFA9878_BF_MANSCONF = 0x0120, /*!< I2C configured */ - TFA9878_BF_DCINSEL = 0x0131, /*!< VAMP_OUT2 input selection */ - TFA9878_BF_MUTETO = 0x0160, /*!< Time out SB mute sequence */ - TFA9878_BF_MANROBOD = 0x0170, /*!< Reaction on BOD */ - TFA9878_BF_BODE = 0x0180, /*!< Enable BOD (only in direct control mode) */ - TFA9878_BF_BODHYS = 0x0190, /*!< Enable Hysteresis of BOD */ - TFA9878_BF_BODFILT = 0x01a1, /*!< BOD filter */ - TFA9878_BF_BODTHLVL = 0x01c1, /*!< BOD threshold */ - TFA9878_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ - TFA9878_BF_DISFCRBST = 0x01f0, /*!< disable boost control with FRCBST */ - TFA9878_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ - TFA9878_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9878_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ - TFA9878_BF_AMPINPSEL = 0x02b1, /*!< amp input selection */ - TFA9878_BF_PDMRATE = 0x02d0, /*!< Pdm rate */ - TFA9878_BF_REV = 0x030f, /*!< Revision info */ - TFA9878_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ - TFA9878_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ - TFA9878_BF_SWCLKSEL = 0x0432, /*!< Sound Wire clock frequnecy */ - TFA9878_BF_MANAOOSC = 0x0460, /*!< Internal osc off at PWDN */ - TFA9878_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ - TFA9878_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ - TFA9878_BF_AUTOFROSEL = 0x04a0, /*!< override automatic OSC selection mechanism */ - TFA9878_BF_SWFRSYNC = 0x04b0, /*!< Selection SW signal reference for Stream Synchronization */ - TFA9878_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ - TFA9878_BF_FRCCLKSPKR = 0x0510, /*!< force active the speaker sub-system clock when in idle power */ - TFA9878_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ - TFA9878_BF_CLKCHKLO = 0x0707, /*!< Clock check Low Threshold */ - TFA9878_BF_CLKCHKHI = 0x0787, /*!< Clock check Higher Threshold */ - TFA9878_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ - TFA9878_BF_VDDS = 0x1000, /*!< POR */ - TFA9878_BF_DCOCPOK = 0x1010, /*!< DCDC OCP nmos (sticky register , clear on read) */ - TFA9878_BF_OTDS = 0x1020, /*!< OTP alarm (sticky register , clear on read) */ - TFA9878_BF_OCDS = 0x1030, /*!< OCP amplifier (sticky register , clear on read) */ - TFA9878_BF_UVDS = 0x1040, /*!< UVP alarm (sticky register , clear on read) */ - TFA9878_BF_MANALARM = 0x1050, /*!< Alarm state */ - TFA9878_BF_CLKS = 0x1060, /*!< Clocks stable */ - TFA9878_BF_MTPB = 0x1070, /*!< MTP busy */ - TFA9878_BF_NOCLK = 0x1080, /*!< Lost clock (sticky register , clear on read) */ - TFA9878_BF_BODNOK = 0x1090, /*!< BOD Flag - VDD NOT OK */ - TFA9878_BF_TDMERR = 0x10a0, /*!< TDM error */ - TFA9878_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9878_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register , clear on read) */ - TFA9878_BF_DCDCPC = 0x1120, /*!< Indicates current is max in DC-to-DC converter */ - TFA9878_BF_DCHVBAT = 0x1130, /*!< DCDC level 1x */ - TFA9878_BF_DCH114 = 0x1140, /*!< DCDC level 1.14x */ - TFA9878_BF_DCH107 = 0x1150, /*!< DCDC level 1.07x */ - TFA9878_BF_PLLS = 0x1160, /*!< PLL lock */ - TFA9878_BF_TDMLUTER = 0x1180, /*!< TDM LUT error */ - TFA9878_BF_CLKOOR = 0x11c0, /*!< External clock status */ - TFA9878_BF_SWS = 0x11d0, /*!< Amplifier engage */ - TFA9878_BF_AMPS = 0x11e0, /*!< Amplifier enable */ - TFA9878_BF_AREFS = 0x11f0, /*!< References enable */ - TFA9878_BF_OCPOAP = 0x1300, /*!< OCPOK pmos B */ - TFA9878_BF_OCPOAN = 0x1310, /*!< OCPOK pmos A */ - TFA9878_BF_OCPOBP = 0x1320, /*!< OCPOK nmos B */ - TFA9878_BF_OCPOBN = 0x1330, /*!< OCPOK nmos A */ - TFA9878_BF_OVDS = 0x1380, /*!< OVP alarm */ - TFA9878_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ - TFA9878_BF_ADCCR = 0x13a0, /*!< Control ADC */ - TFA9878_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ - TFA9878_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ - TFA9878_BF_MANOPER = 0x13f0, /*!< Operating state */ - TFA9878_BF_TDMSTAT = 0x1402, /*!< TDM status bits */ - TFA9878_BF_MANSTATE = 0x1433, /*!< Device manager status */ - TFA9878_BF_AMPSTE = 0x1473, /*!< Amplifier control status */ - TFA9878_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ - TFA9878_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9878_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9878_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ - TFA9878_BF_TDME = 0x2000, /*!< Enable interface */ - TFA9878_BF_TDMSLOTS = 0x2013, /*!< N-slots in Frame */ - TFA9878_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ - TFA9878_BF_TDMFSLN = 0x2073, /*!< FS length */ - TFA9878_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ - TFA9878_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ - TFA9878_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ - TFA9878_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ - TFA9878_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ - TFA9878_BF_TDMADJ = 0x21f0, /*!< data adjustment */ - TFA9878_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ - TFA9878_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ - TFA9878_BF_TDMTXDFO = 0x2271, /*!< Format unused bits */ - TFA9878_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots DATAO */ - TFA9878_BF_TDMSPKE = 0x2300, /*!< Control audio tdm channel in 0 */ - TFA9878_BF_TDMDCE = 0x2310, /*!< Control audio tdm channel in 1 */ - TFA9878_BF_TDMCSE = 0x2330, /*!< current sense vbat temperature and vddp feedback */ - TFA9878_BF_TDMVSE = 0x2340, /*!< Voltage sense vbat temperature and vddp feedback */ - TFA9878_BF_TDMSPKS = 0x2603, /*!< tdm slot for sink 0 */ - TFA9878_BF_TDMDCS = 0x2643, /*!< tdm slot for sink 1 */ - TFA9878_BF_TDMCSS = 0x26c3, /*!< Slot Position of current sense vbat temperature and vddp feedback */ - TFA9878_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense vbat temperature and vddp feedback */ - TFA9878_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9878_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ - TFA9878_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9878_BF_ISTOCPR = 0x4030, /*!< Status ocp alarm */ - TFA9878_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9878_BF_ISTMANALARM = 0x4050, /*!< Status nanager Alarm state */ - TFA9878_BF_ISTTDMER = 0x4060, /*!< Status tdm error */ - TFA9878_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9878_BF_ISTBODNOK = 0x4080, /*!< Status BOD event */ - TFA9878_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9878_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ - TFA9878_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9878_BF_ICLOCPR = 0x4430, /*!< Clear ocp alarm */ - TFA9878_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9878_BF_ICLMANALARM = 0x4450, /*!< Clear manager Alarm state */ - TFA9878_BF_ICLTDMER = 0x4460, /*!< Clear tdm error */ - TFA9878_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9878_BF_ICLBODNOK = 0x4480, /*!< Clear BOD event */ - TFA9878_BF_IEVDDS = 0x4800, /*!< Enable por */ - TFA9878_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ - TFA9878_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9878_BF_IEOCPR = 0x4830, /*!< Enable ocp alarm */ - TFA9878_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9878_BF_IEMANALARM = 0x4850, /*!< Enable nanager Alarm state */ - TFA9878_BF_IETDMER = 0x4860, /*!< Enable tdm error */ - TFA9878_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9878_BF_IEBODNOK = 0x4880, /*!< Enable BOD trigger */ - TFA9878_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ - TFA9878_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ - TFA9878_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9878_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ - TFA9878_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9878_BF_IPOMANALARM = 0x4c50, /*!< Polarity nanager Alarm state */ - TFA9878_BF_IPOTDMER = 0x4c60, /*!< Polarity tdm error */ - TFA9878_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9878_BF_IPOBODNOK = 0x4c80, /*!< Polarity BOD trigger */ - TFA9878_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time (with K = 1 at sample rate fs of 32kHz, 44,1 kHz or 48kHz ; with K = 2 at sample rate fs 16 kHz . With K =0.5 at sample rate of 96 kHz) */ - TFA9878_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ - TFA9878_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ - TFA9878_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9878_BF_BSSBY = 0x50f0, /*!< Bypass battery safeguard */ - TFA9878_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ - TFA9878_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ - TFA9878_BF_DPSA = 0x5170, /*!< Enable DPSA */ - TFA9878_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ - TFA9878_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ - TFA9878_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ - TFA9878_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ - TFA9878_BF_BYPDLYLINE = 0x52f0, /*!< Bypass the interpolator delay line */ - TFA9878_BF_TDMDCG = 0x5f23, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ - TFA9878_BF_TDMSPKG = 0x5f63, /*!< Total gain depending on INPLEV setting (channel 0) */ - TFA9878_BF_IPM = 0x60e1, /*!< Idle power mode control */ - TFA9878_BF_LNMODE = 0x62e1, /*!< ctrl select mode */ - TFA9878_BF_LPM1MODE = 0x64e1, /*!< low power mode control */ - TFA9878_BF_TDMSRCMAP = 0x6802, /*!< tdm source mapping */ - TFA9878_BF_TDMSRCAS = 0x6831, /*!< Sensed value A */ - TFA9878_BF_TDMSRCBS = 0x6851, /*!< Sensed value B */ - TFA9878_BF_TDMSRCACLIP = 0x6871, /*!< clip information (analog /digital) for source0 */ - TFA9878_BF_TDMSRCBCLIP = 0x6891, /*!< clip information (analog /digital) for source1 */ - TFA9878_BF_LP0 = 0x6e00, /*!< Idle power mode */ - TFA9878_BF_LP1 = 0x6e10, /*!< low power mode 1 detection */ - TFA9878_BF_LA = 0x6e20, /*!< low amplitude detection */ - TFA9878_BF_VDDPH = 0x6e30, /*!< vddp greater than vbat */ - TFA9878_BF_DELCURCOMP = 0x6f02, /*!< delay to allign compensation signal with current sense signal */ - TFA9878_BF_SIGCURCOMP = 0x6f40, /*!< polarity of compensation for current sense */ - TFA9878_BF_ENCURCOMP = 0x6f50, /*!< enable current sense compensation */ - TFA9878_BF_LVLCLPPWM = 0x6f72, /*!< set the amount of pwm pulse that may be skipped before clip-flag is triggered */ - TFA9878_BF_DCMCC = 0x7003, /*!< Max coil current */ - TFA9878_BF_DCCV = 0x7041, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ - TFA9878_BF_DCIE = 0x7060, /*!< Adaptive boost mode */ - TFA9878_BF_DCSR = 0x7070, /*!< Soft ramp up/down */ - TFA9878_BF_DCOVL = 0x7085, /*!< Threshold level to activate active overshoot control */ - TFA9878_BF_DCDIS = 0x70e0, /*!< DCDC on/off */ - TFA9878_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ - TFA9878_BF_DCTRACK = 0x7430, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ - TFA9878_BF_DCTRIP = 0x7444, /*!< 1st Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9878_BF_DCHOLD = 0x7494, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ - TFA9878_BF_DCINT = 0x74e0, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ - TFA9878_BF_DCTRIP2 = 0x7534, /*!< 2nd Adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9878_BF_DCTRIPT = 0x7584, /*!< Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9878_BF_DCTRIPHYSTE = 0x75f0, /*!< Enable hysteresis on booster trip levels */ - TFA9878_BF_DCVOF = 0x7635, /*!< First boost voltage level */ - TFA9878_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ - TFA9878_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ - TFA9878_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9878_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9878_BF_MTPADDR = 0xa302, /*!< MTP address from I2C register for read/writing mtp in manual single word mode */ - TFA9878_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9878_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9878_BF_MTPWRMSB = 0xa70f, /*!< MSB word of write data for MTP manual write */ - TFA9878_BF_MTPWRLSB = 0xa80f, /*!< LSB word of write data for MTP manual write */ - TFA9878_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9878_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9878_BF_PLLINSI = 0xcd05, /*!< PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9878_BF_PLLINSP = 0xcd64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9878_BF_PLLINSR = 0xcdb3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9878_BF_PLLBDSEL = 0xcdf0, /*!< PLL bandwidth selection control, USE WITH CAUTION */ - TFA9878_BF_PLLNDEC = 0xce09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9878_BF_PLLMDECM = 0xcea0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9878_BF_PLLBP = 0xceb0, /*!< PLL bypass control during functional mode */ - TFA9878_BF_PLLDI = 0xcec0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9878_BF_PLLDO = 0xced0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9878_BF_PLLCLKSTB = 0xcee0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9878_BF_PLLFRM = 0xcef0, /*!< PLL free running mode control in functional mode */ - TFA9878_BF_PLLMDECL = 0xcf0f, /*!< Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9878_BF_PLLPDEC = 0xd006, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9878_BF_PLLDCTRL = 0xd070, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ - TFA9878_BF_PLLLIMOFF = 0xd090, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ - TFA9878_BF_PLLSTRTM = 0xd0a2, /*!< PLL startup time selection control */ - TFA9878_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ - TFA9878_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ - TFA9878_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9878_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9878_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9878_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9878_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9878_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9878_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ -} Tfa9878BfEnumList_t; -#define TFA9878_NAMETABLE static tfaBfName_t Tfa9878DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown selection , */\ - { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ - { 0x30, "AMPE"}, /* Activate Amplifier , */\ - { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0x90, "FSSSEL"}, /* Audio sample reference , */\ - { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xc0, "TSTOCP"}, /* OCP testing control , */\ - { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ - { 0x120, "MANSCONF"}, /* I2C configured , */\ - { 0x131, "DCINSEL"}, /* VAMP_OUT2 input selection , */\ - { 0x160, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x170, "MANROBOD"}, /* Reaction on BOD , */\ - { 0x180, "BODE"}, /* Enable BOD (only in direct control mode) , */\ - { 0x190, "BODHYS"}, /* Enable Hysteresis of BOD , */\ - { 0x1a1, "BODFILT"}, /* BOD filter , */\ - { 0x1c1, "BODTHLVL"}, /* BOD threshold , */\ - { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ - { 0x1f0, "DISFCRBST"}, /* disable boost control with FRCBST , */\ - { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ - { 0x2b1, "AMPINPSEL"}, /* amp input selection , */\ - { 0x2d0, "PDMRATE"}, /* Pdm rate , */\ - { 0x30f, "REV"}, /* Revision info , */\ - { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ - { 0x432, "SWCLKSEL"}, /* Sound Wire clock frequnecy , */\ - { 0x460, "MANAOOSC"}, /* Internal osc off at PWDN , */\ - { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "AUTOFROSEL"}, /* override automatic OSC selection mechanism , */\ - { 0x4b0, "SWFRSYNC"}, /* Selection SW signal reference for Stream Synchronization , */\ - { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "FRCCLKSPKR"}, /* force active the speaker sub-system clock when in idle power, */\ - { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ - { 0x707, "CLKCHKLO"}, /* Clock check Low Threshold , */\ - { 0x787, "CLKCHKHI"}, /* Clock check Higher Threshold , */\ - { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "DCOCPOK"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ - { 0x1020, "OTDS"}, /* OTP alarm (sticky register , clear on read) , */\ - { 0x1030, "OCDS"}, /* OCP amplifier (sticky register , clear on read), */\ - { 0x1040, "UVDS"}, /* UVP alarm (sticky register , clear on read) , */\ - { 0x1050, "MANALARM"}, /* Alarm state , */\ - { 0x1060, "CLKS"}, /* Clocks stable , */\ - { 0x1070, "MTPB"}, /* MTP busy , */\ - { 0x1080, "NOCLK"}, /* Lost clock (sticky register , clear on read) , */\ - { 0x1090, "BODNOK"}, /* BOD Flag - VDD NOT OK , */\ - { 0x10a0, "TDMERR"}, /* TDM error , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active (sticky register , clear on read) , */\ - { 0x1120, "DCDCPC"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1130, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1140, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1150, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1160, "PLLS"}, /* PLL lock , */\ - { 0x1180, "TDMLUTER"}, /* TDM LUT error , */\ - { 0x11c0, "CLKOOR"}, /* External clock status , */\ - { 0x11d0, "SWS"}, /* Amplifier engage , */\ - { 0x11e0, "AMPS"}, /* Amplifier enable , */\ - { 0x11f0, "AREFS"}, /* References enable , */\ - { 0x1300, "OCPOAP"}, /* OCPOK pmos B , */\ - { 0x1310, "OCPOAN"}, /* OCPOK pmos A , */\ - { 0x1320, "OCPOBP"}, /* OCPOK nmos B , */\ - { 0x1330, "OCPOBN"}, /* OCPOK nmos A , */\ - { 0x1380, "OVDS"}, /* OVP alarm , */\ - { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ - { 0x13a0, "ADCCR"}, /* Control ADC , */\ - { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ - { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x13f0, "MANOPER"}, /* Operating state , */\ - { 0x1402, "TDMSTAT"}, /* TDM status bits , */\ - { 0x1433, "MANSTATE"}, /* Device manager status , */\ - { 0x1473, "AMPSTE"}, /* Amplifier control status , */\ - { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2000, "TDME"}, /* Enable interface , */\ - { 0x2013, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2073, "TDMFSLN"}, /* FS length , */\ - { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ - { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ - { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ - { 0x21f0, "TDMADJ"}, /* data adjustment , */\ - { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2271, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x2291, "TDMTXUS0"}, /* Format unused slots DATAO , */\ - { 0x2300, "TDMSPKE"}, /* Control audio tdm channel in 0 , */\ - { 0x2310, "TDMDCE"}, /* Control audio tdm channel in 1 , */\ - { 0x2330, "TDMCSE"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "TDMVSE"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "TDMSPKS"}, /* tdm slot for sink 0 , */\ - { 0x2643, "TDMDCS"}, /* tdm slot for sink 1 , */\ - { 0x26c3, "TDMCSS"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOCPR"}, /* Status ocp alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTMANALARM"}, /* Status nanager Alarm state , */\ - { 0x4060, "ISTTDMER"}, /* Status tdm error , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4080, "ISTBODNOK"}, /* Status BOD event , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOCPR"}, /* Clear ocp alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLMANALARM"}, /* Clear manager Alarm state , */\ - { 0x4460, "ICLTDMER"}, /* Clear tdm error , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4480, "ICLBODNOK"}, /* Clear BOD event , */\ - { 0x4800, "IEVDDS"}, /* Enable por , */\ - { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOCPR"}, /* Enable ocp alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IEMANALARM"}, /* Enable nanager Alarm state , */\ - { 0x4860, "IETDMER"}, /* Enable tdm error , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4880, "IEBODNOK"}, /* Enable BOD trigger , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ - { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOMANALARM"}, /* Polarity nanager Alarm state , */\ - { 0x4c60, "IPOTDMER"}, /* Polarity tdm error , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x4c80, "IPOBODNOK"}, /* Polarity BOD trigger , */\ - { 0x5001, "BSSCR"}, /* Battery Safeguard attack time (with K = 1 at sample rate fs of 32kHz, 44,1 kHz or 48kHz ; with K = 2 at sample rate fs 16 kHz . With K =0.5 at sample rate of 96 kHz), */\ - { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass battery safeguard , */\ - { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ - { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ - { 0x5170, "DPSA"}, /* Enable DPSA , */\ - { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ - { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ - { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ - { 0x52f0, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ - { 0x5f23, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x5f63, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x60e1, "IPM"}, /* Idle power mode control , */\ - { 0x62e1, "LNMODE"}, /* ctrl select mode , */\ - { 0x64e1, "LPM1MODE"}, /* low power mode control , */\ - { 0x6802, "TDMSRCMAP"}, /* tdm source mapping , */\ - { 0x6831, "TDMSRCAS"}, /* Sensed value A , */\ - { 0x6851, "TDMSRCBS"}, /* Sensed value B , */\ - { 0x6871, "TDMSRCACLIP"}, /* clip information (analog /digital) for source0 , */\ - { 0x6891, "TDMSRCBCLIP"}, /* clip information (analog /digital) for source1 , */\ - { 0x6e00, "LP0"}, /* Idle power mode , */\ - { 0x6e10, "LP1"}, /* low power mode 1 detection , */\ - { 0x6e20, "LA"}, /* low amplitude detection , */\ - { 0x6e30, "VDDPH"}, /* vddp greater than vbat , */\ - { 0x6f02, "DELCURCOMP"}, /* delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "SIGCURCOMP"}, /* polarity of compensation for current sense , */\ - { 0x6f50, "ENCURCOMP"}, /* enable current sense compensation , */\ - { 0x6f72, "LVLCLPPWM"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7003, "DCMCC"}, /* Max coil current , */\ - { 0x7041, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7060, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7070, "DCSR"}, /* Soft ramp up/down , */\ - { 0x7085, "DCOVL"}, /* Threshold level to activate active overshoot control, */\ - { 0x70e0, "DCDIS"}, /* DCDC on/off , */\ - { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7430, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "DCTRIP"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "DCINT"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7534, "DCTRIP2"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "DCTRIPT"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7635, "DCVOF"}, /* First boost voltage level , */\ - { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ - { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "MTPADDR"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "MTPWRMSB"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "MTPWRLSB"}, /* LSB word of write data for MTP manual write , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xcd05, "PLLINSI"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcd64, "PLLINSP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdb3, "PLLINSR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdf0, "PLLBDSEL"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ - { 0xce09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcea0, "PLLMDECM"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xceb0, "PLLBP"}, /* PLL bypass control during functional mode , */\ - { 0xcec0, "PLLDI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xced0, "PLLDO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcee0, "PLLCLKSTB"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcef0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ - { 0xcf0f, "PLLMDECL"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd006, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd070, "PLLDCTRL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xd090, "PLLLIMOFF"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xd0a2, "PLLSTRTM"}, /* PLL startup time selection control , */\ - { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ - { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9878_BITNAMETABLE static tfaBfName_t Tfa9878BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown selection , */\ - { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ - { 0x30, "enbl_amplifier"}, /* Activate Amplifier , */\ - { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ - { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xc0, "test_ocp"}, /* OCP testing control , */\ - { 0xd0, "sel_man_wait_time"}, /* Manager wait time selection control , */\ - { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ - { 0x120, "src_set_configured"}, /* I2C configured , */\ - { 0x131, "vamp_sel2"}, /* VAMP_OUT2 input selection , */\ - { 0x160, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x170, "man_enbl_brown"}, /* Reaction on BOD , */\ - { 0x180, "bod_enbl"}, /* Enable BOD (only in direct control mode) , */\ - { 0x190, "bod_hyst_enbl"}, /* Enable Hysteresis of BOD , */\ - { 0x1a1, "bod_delay_set"}, /* BOD filter , */\ - { 0x1c1, "bod_lvl_set"}, /* BOD threshold , */\ - { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ - { 0x1f0, "disable_frcbst"}, /* disable boost control with FRCBST , */\ - { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ - { 0x2b1, "amp_input_sel"}, /* amp input selection , */\ - { 0x2d0, "pdm_rate"}, /* Pdm rate , */\ - { 0x30f, "device_rev"}, /* Revision info , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ - { 0x432, "sw_clk_sel"}, /* Sound Wire clock frequnecy , */\ - { 0x460, "enbl_osc_auto_off"}, /* Internal osc off at PWDN , */\ - { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "override_auto_sel_osc"}, /* override automatic OSC selection mechanism , */\ - { 0x4b0, "sw_sync_sel"}, /* Selection SW signal reference for Stream Synchronization , */\ - { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "force_spkr_clk"}, /* force active the speaker sub-system clock when in idle power, */\ - { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ - { 0x707, "clkchk_th_lo"}, /* Clock check Low Threshold , */\ - { 0x787, "clkchk_th_hi"}, /* Clock check Higher Threshold , */\ - { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register , clear on read) , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm (sticky register , clear on read) , */\ - { 0x1030, "flag_ocp_alarm"}, /* OCP amplifier (sticky register , clear on read), */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm (sticky register , clear on read) , */\ - { 0x1050, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1080, "flag_lost_clk"}, /* Lost clock (sticky register , clear on read) , */\ - { 0x1090, "flag_bod_vddd_nok"}, /* BOD Flag - VDD NOT OK , */\ - { 0x10a0, "flag_tdm_error"}, /* TDM error , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register , clear on read) , */\ - { 0x1120, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1130, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1140, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1150, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1160, "flag_pll_lock"}, /* PLL lock , */\ - { 0x1180, "flag_tdm_lut_error"}, /* TDM LUT error , */\ - { 0x11c0, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x11d0, "flag_engage"}, /* Amplifier engage , */\ - { 0x11e0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x11f0, "flag_enbl_ref"}, /* References enable , */\ - { 0x1300, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1310, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1320, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1330, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1380, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ - { 0x13a0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ - { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x13f0, "flag_man_operating_state"}, /* Operating state , */\ - { 0x1402, "flag_tdm_status"}, /* TDM status bits , */\ - { 0x1433, "man_state"}, /* Device manager status , */\ - { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ - { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x2000, "tdm_enable"}, /* Enable interface , */\ - { 0x2013, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ - { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ - { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ - { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ - { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2271, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots DATAO , */\ - { 0x2300, "tdm_sink0_enable"}, /* Control audio tdm channel in 0 , */\ - { 0x2310, "tdm_sink1_enable"}, /* Control audio tdm channel in 1 , */\ - { 0x2330, "tdm_source0_enable"}, /* current sense vbat temperature and vddp feedback , */\ - { 0x2340, "tdm_source1_enable"}, /* Voltage sense vbat temperature and vddp feedback , */\ - { 0x2603, "tdm_sink0_slot"}, /* tdm slot for sink 0 , */\ - { 0x2643, "tdm_sink1_slot"}, /* tdm slot for sink 1 , */\ - { 0x26c3, "tdm_source0_slot"}, /* Slot Position of current sense vbat temperature and vddp feedback, */\ - { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense vbat temperature and vddp feedback, */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_man_alarm_state"}, /* Status nanager Alarm state , */\ - { 0x4060, "int_out_flag_tdm_error"}, /* Status tdm error , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4080, "int_out_flag_bod_vddd_nok"}, /* Status BOD event , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager Alarm state , */\ - { 0x4460, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4480, "int_in_flag_bod_vddd_nok"}, /* Clear BOD event , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ - { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable nanager Alarm state , */\ - { 0x4860, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4880, "int_enable_flag_bod_vddd_nok"}, /* Enable BOD trigger , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ - { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity nanager Alarm state , */\ - { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x4c80, "int_polarity_flag_bod_vddd_nok"}, /* Polarity BOD trigger , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time (with K = 1 at sample rate fs of 32kHz, 44,1 kHz or 48kHz ; with K = 2 at sample rate fs 16 kHz . With K =0.5 at sample rate of 96 kHz), */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass battery safeguard , */\ - { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ - { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ - { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ - { 0x5257, "gain"}, /* Amplifier gain , */\ - { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ - { 0x52f0, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ - { 0x5350, "bypass_lp"}, /* Bypass the low pass filter inside temperature sensor, */\ - { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ - { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x5463, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ - { 0x5500, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5513, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5552, "dpsa_drive"}, /* Drive setting (bin. coded) , */\ - { 0x5600, "ref_iref_enbl"}, /* Enable of reference current for OCP , */\ - { 0x5631, "ref_irefdist_set_ctrl"}, /* Scaling of reference current for OCP , */\ - { 0x5652, "ref_irefdist_test_enbl"}, /* Enable of test-function of distribution of reference current, used for OCP. When enabled, the current will to to anamux iso powerstages. Using e.g. 011 it will add the current of powerstage P and N., */\ - { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ - { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ - { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ - { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ - { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ - { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ - { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ - { 0x5900, "pwm_clk_sel"}, /* Control for selection for PWM delay line source , */\ - { 0x5910, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ - { 0x5f23, "ctrl_attl"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x5f63, "ctrl_attr"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x6005, "idle_power_cal_offset"}, /* Idle power mode detector ctrl cal_offset from gain module , */\ - { 0x6065, "idle_power_zero_lvl"}, /* IIdle power mode zero crossing detection level , */\ - { 0x60e1, "idle_power_mode"}, /* Idle power mode control , */\ - { 0x6105, "idle_power_threshold_lvl"}, /* Idle power mode amplitude trigger level , */\ - { 0x6165, "idle_power_hold_time"}, /* Idle power mode detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x61c0, "disable_idle_power_mode"}, /* Idle power mode detector control , */\ - { 0x6265, "zero_lvl"}, /* low noise gain switch zero trigger level , */\ - { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ - { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ - { 0x6305, "threshold_lvl"}, /* low noise gain switch trigger level , */\ - { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 zero crossing detection level , */\ - { 0x64e1, "lpm1_mode"}, /* low power mode control , */\ - { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 amplitude trigger level , */\ - { 0x6565, "lpm1_hold_time"}, /* low power mode1 detector ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ - { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ - { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ - { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage , */\ - { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ - { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtred vs unfiltered compare , */\ - { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ - { 0x6802, "tdm_source_mapping"}, /* tdm source mapping , */\ - { 0x6831, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ - { 0x6851, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ - { 0x6871, "tdm_source0_clip_sel"}, /* clip information (analog /digital) for source0 , */\ - { 0x6891, "tdm_source1_clip_sel"}, /* clip information (analog /digital) for source1 , */\ - { 0x6a02, "rst_min_vbat_delay"}, /* rst_min_vbat delay (nb fs) , */\ - { 0x6b00, "disable_auto_engage"}, /* disable auto engange , */\ - { 0x6b10, "disable_engage"}, /* disable engange , */\ - { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x6c69, "spare_out"}, /* spare_out , */\ - { 0x6d0f, "spare_in"}, /* spare_in , */\ - { 0x6e00, "flag_idle_power_mode"}, /* Idle power mode , */\ - { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ - { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ - { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ - { 0x6f02, "cursense_comp_delay"}, /* delay to allign compensation signal with current sense signal, */\ - { 0x6f40, "cursense_comp_sign"}, /* polarity of compensation for current sense , */\ - { 0x6f50, "enbl_cursense_comp"}, /* enable current sense compensation , */\ - { 0x6f72, "pwms_clip_lvl"}, /* set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7003, "boost_cur"}, /* Max coil current , */\ - { 0x7041, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7060, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7070, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x7085, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ - { 0x70e0, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7174, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7290, "enbl_bst_windac"}, /* Enable window dac , */\ - { 0x72a5, "bst_windac"}, /* for testing direct control windac , */\ - { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7360, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ - { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7444, "boost_trip_lvl_1st"}, /* 1st Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x74f0, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ - { 0x7534, "boost_trip_lvl_2nd"}, /* 2nd Adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7584, "boost_trip_lvl_track"}, /* Track Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x75f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ - { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ - { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8305, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP)*signal, */\ - { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ - { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8440, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC , */\ - { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ - { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ - { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ - { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ - { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ - { 0x8790, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ - { 0x8850, "vs_gain_control"}, /* Voltage sense gain control , */\ - { 0x8860, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ - { 0x8887, "vs_gain"}, /* voltage sense gain , */\ - { 0x8c00, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ - { 0x8c40, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ - { 0x8c90, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ - { 0x8d30, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ - { 0x8d40, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ - { 0x8d50, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ - { 0x8d60, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8d74, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ - { 0x8f00, "enbl_vs_adc"}, /* Enable voltage sense ADC (Direct Control only only others done by manager), */\ - { 0x8f10, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ - { 0x8f20, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ - { 0x8f30, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ - { 0x8f40, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ - { 0x8f50, "enbl_vs_ldo"}, /* Enable voltage sense LDO (Direct Control only only others done by manager), */\ - { 0x8f80, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO (Direct Control only others done by manager), */\ - { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa400, "faim_set_clkws"}, /* Sets the faim controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the faim are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the faim are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0c0, "use_direct_vs_ctrls"}, /* voltage sense Direct control to overrule several functions for testing, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ - { 0xc0f0, "enbl_fro"}, /* Enables FRO8M in I2C direct control mode only , */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs ), */\ - { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc580, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ - { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO (see Digimux list for details), */\ - { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT (see Digimux list for details), */\ - { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 (see Digimux list for details), */\ - { 0xc981, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9c0, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xc9d1, "sw_hs_mode"}, /* Speed/load setting for SW IO cell, clk or data mode range (see SWMF IO cell datasheet), */\ - { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xcac0, "open_frcbst_ensw_switch"}, /* Save test2 configuration before enable anamux2 (open test2 switch and save test2 setting) , */\ - { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on FRCBST/TEST2 , */\ - { 0xcb53, "anamux3"}, /* Anamux selection control - anamux on VSN/TEST3 , */\ - { 0xcba3, "anamux4"}, /* Anamux selection control - anamux on VSP/TEST4 , */\ - { 0xcd05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcd64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdb3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcdf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ - { 0xce09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcea0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xceb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ - { 0xcec0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xced0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcee0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcef0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ - { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd006, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xd070, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xd090, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xd0a2, "sel_pll_startup_time"}, /* PLL startup time selection control , */\ - { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ - { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd283, "tsig_gain"}, /* Test signal gain , */\ - { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd580, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xd721, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xd740, "bck_ehs"}, /* High-speed and standard/fast mode selection for BCK IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd750, "datai_ehs"}, /* High-speed and standard/fast mode selection for DATAI IO cell (see IIC3V3 IO cell datasheet), */\ - { 0xd800, "source_in_testmode"}, /* tdm source in test mode (return only current and voltage sense), */\ - { 0xd810, "gainatt_tdm_feedback"}, /* gainatt feedback to tdm , */\ - { 0xd822, "test_parametric_io"}, /* test io parametric , */\ - { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ - { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ - { 0xd880, "bst_dcmbst"}, /* dcm boost , */\ - { 0xd890, "gainatt_sw_feedback"}, /* gainatt feedback to sw , */\ - { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ - { 0xd900, "enbl_frocal"}, /* Enable FRO calibration , */\ - { 0xd910, "start_fro_calibration"}, /* Start FRO8 Calibration , */\ - { 0xd920, "enbl_irefcal"}, /* Enable IREF calibration , */\ - { 0xd930, "start_iref_calibration"}, /* Start IREF Calibration , */\ - { 0xda00, "fro_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ - { 0xda15, "fro_auto_trim_val"}, /* Calibration value from Auto Calibration block, to be written into MTP - Read Only, */\ - { 0xda80, "iref_calibration_done"}, /* IREF Calibration done - Read Only , */\ - { 0xda94, "iref_auto_trim_val"}, /* Calibration value from Auto Calibration block, to be written into MTP - Read Only, */\ - { 0xdae0, "iref_calibration_error"}, /* IREF Calibration done - Read Only , */\ - { 0xe00f, "sw_profile"}, /* Software profile data , */\ - { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf169, "spare_mtp1_15_6"}, /* SPARE , */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf2a4, "optimal_pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ - { 0xf2f0, "enbl_optimal_pwm_delay"}, /* optimized pwm delay function enabled , */\ - { 0xf307, "calibr_gain_vs1"}, /* Voltage sense gain when external voltage sensing input is selected, */\ - { 0xf387, "calibr_gain_vs2"}, /* Voltage sense gain when internal voltage sensing input is selected, */\ - { 0xf407, "vs_trim1"}, /* VS Trimming when external voltage sensing input is selected, */\ - { 0xf487, "vs_trim2"}, /* VS Trimming when internal voltage sensing input is selected, */\ - { 0xf50f, "calibr_R25C_R"}, /* Ron resistance of speaker coil , */\ - { 0xf607, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf687, "spare_mpt6_15_06"}, /* SPARE , */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf770, "spare_mtp7_07"}, /* SPARE , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf7f0, "spare_mtp7_15"}, /* SPARE , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable function dcdcoff_mode , */\ - { 0xf910, "spare_mtp9_1"}, /* SPARE , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Force Boost in follower mode , */\ - { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf980, "spare_mtp9_8"}, /* SPARE , */\ - { 0xf990, "mtp_enbl_pwm_delay_clock_gating"}, /* pwm delay clock auto gating , */\ - { 0xf9a0, "mtp_enbl_ocp_clock_gating"}, /* ocpclock auto gating , */\ - { 0xf9b0, "mtp_gate_cgu_clock_for_test"}, /* cgu test clock control , */\ - { 0xf9c0, "mtp_tdm_pad_sel"}, /* tdm pad selection , */\ - { 0xf9d2, "spare_mtp9_15_12"}, /* MTP-control FW - See Firmware I2C API document for details, */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ - { 0xff05, "fro_trim"}, /* 8 MHz oscillator trim code , */\ - { 0xff61, "fro_shortnwell"}, /* Short 4 or 6 n-well resistors , */\ - { 0xff81, "fro_boost"}, /* Self bias current selection , */\ - { 0xffa4, "calibr_iref_trim"}, /* Trimming control of reference current for OCP , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa9878_irq { - tfa9878_irq_stvdds = 0, - tfa9878_irq_stbstoc = 1, - tfa9878_irq_stotds = 2, - tfa9878_irq_stocpr = 3, - tfa9878_irq_stuvds = 4, - tfa9878_irq_stmanalarm = 5, - tfa9878_irq_sttdmer = 6, - tfa9878_irq_stnoclk = 7, - tfa9878_irq_stbodnok = 8, - tfa9878_irq_max = 9, - tfa9878_irq_all = -1 /* all irqs */}; - -#define TFA9878_IRQ_NAMETABLE static tfaIrqName_t Tfa9878IrqNames[] = {\ - { 0, "STVDDS"},\ - { 1, "STBSTOC"},\ - { 2, "STOTDS"},\ - { 3, "STOCPR"},\ - { 4, "STUVDS"},\ - { 5, "STMANALARM"},\ - { 6, "STTDMER"},\ - { 7, "STNOCLK"},\ - { 8, "STBODNOK"},\ - { 9, "9"},\ -}; -#endif /* _TFA9878_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9887_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9887_tfafieldnames.h deleted file mode 100644 index ad3d8c0209d9..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9887_tfafieldnames.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: Tfa9887_TfaFieldnames.h - * This file was generated automatically on 04/14/15 at 10:23:40. - * Source file: TFA9897N1B_I2C_list_URT_source_v34_87Only.xls - */ -#define TFA9887_I2CVERSION 34 -#define TFA9895_I2CVERSION 34 -#define TFA9887_NAMETABLE static tfaBfName_t Tfa9887DatasheetNames[] = {\ - { 0x402, "I2SF"}, /* I2SFormat data 1 input: , */\ - { 0x431, "CHS12"}, /* ChannelSelection data1 input (In CoolFlux) , */\ - { 0x450, "CHS3"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ - { 0x461, "CHSA"}, /* Input selection for amplifier , */\ - { 0x4b0, "I2SDOE"}, /* Enable data output , */\ - { 0x4c3, "I2SSR"}, /* sample rate setting , */\ - { 0x500, "BSSBY"}, /* , */\ - { 0x511, "BSSCR"}, /* 00 = 0.56 dB/Sample , */\ - { 0x532, "BSST"}, /* 000 = 2.92V , */\ - { 0x5f0, "I2SDOC"}, /* selection data out , */\ - { 0xa02, "DOLS"}, /* Output selection dataout left channel , */\ - { 0xa32, "DORS"}, /* Output selection dataout right channel , */\ - { 0xa62, "SPKL"}, /* Selection speaker induction , */\ - { 0xa91, "SPKR"}, /* Selection speaker impedance , */\ - { 0xab3, "DCFG"}, /* DCDC speaker current compensation gain , */\ - { 0x4134, "PWMDEL"}, /* PWM DelayBits to set the delay , */\ - { 0x4180, "PWMSH"}, /* PWM Shape , */\ - { 0x4190, "PWMRE"}, /* PWM Bitlength in noise shaper , */\ - { 0x48e1, "TCC"}, /* sample & hold track time: , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9887_BITNAMETABLE static tfaBfName_t Tfa9887BitNames[] = {\ - { 0x402, "i2s_seti"}, /* I2SFormat data 1 input: , */\ - { 0x431, "chan_sel1"}, /* ChannelSelection data1 input (In CoolFlux) , */\ - { 0x450, "lr_sw_i2si2"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ - { 0x461, "input_sel"}, /* Input selection for amplifier , */\ - { 0x4b0, "enbl_datao"}, /* Enable data output , */\ - { 0x4c3, "i2s_fs"}, /* sample rate setting , */\ - { 0x500, "bypass_clipper"}, /* , */\ - { 0x511, "vbat_prot_attacktime[1:0]"}, /* 00 = 0.56 dB/Sample , */\ - { 0x532, "vbat_prot_thlevel[2:0]"}, /* 000 = 2.92V , */\ - { 0x5d0, "reset_min_vbat"}, /* to reset the clipper via I2C in case the CF is bypassed, */\ - { 0x5f0, "datao_sel"}, /* selection data out , */\ - { 0xa02, "sel_i2so_l"}, /* Output selection dataout left channel , */\ - { 0xa32, "sel_i2so_r"}, /* Output selection dataout right channel , */\ - { 0xa62, "ctrl_spkr_coil"}, /* Selection speaker induction , */\ - { 0xa91, "ctrl_spr_res"}, /* Selection speaker impedance , */\ - { 0xab3, "ctrl_dcdc_spkr_i_comp_gain"}, /* DCDC speaker current compensation gain , */\ - { 0xaf0, "ctrl_dcdc_spkr_i_comp_sign"}, /* DCDC speaker current compensation sign , */\ - { 0x4100, "bypass_hp"}, /* bypass_hp, to bypass the hp filter byhind the CoolFlux, */\ - { 0x4110, "hard_mute"}, /* hard mute setting in HW , */\ - { 0x4120, "soft_mute"}, /* Soft mute setting in HW , */\ - { 0x4134, "PWM_Delay[4:0]"}, /* PWM DelayBits to set the delay , */\ - { 0x4180, "PWM_Shape"}, /* PWM Shape , */\ - { 0x4190, "PWM_BitLength"}, /* PWM Bitlength in noise shaper , */\ - { 0x4800, "ctrl_negin"}, /* , */\ - { 0x4810, "ctrl_cs_sein"}, /* , */\ - { 0x4820, "ctrl_coincidencecs"}, /* HIGH => Prevent dcdc switching during clk_cs_clksh, */\ - { 0x4876, "delay_se_neg[6:0]"}, /* delayshiftse2 , */\ - { 0x48e1, "ctrl_cs_ttrack[1:0]"}, /* sample & hold track time: , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9890_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9890_tfafieldnames.h deleted file mode 100644 index be41fabd0720..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9890_tfafieldnames.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: Tfa9890_TfaFieldnames.h - * This file was generated automatically on 04/07/15 at 14:46:37. - * Source file: TFA9897N1B_I2C_list_URT_source_v34_90Only.xls - */ -#define TFA9890_I2CVERSION 34 -#define TFA9890_NAMETABLE static tfaBfName_t Tfa9890DatasheetNames[] = {\ - { 0x402, "I2SF"}, /* I2SFormat data 1 input: , */\ - { 0x431, "CHS12"}, /* ChannelSelection data1 input (In CoolFlux) , */\ - { 0x450, "CHS3"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ - { 0x461, "CHSA"}, /* Input selection for amplifier , */\ - { 0x481, "I2SDOC"}, /* selection data out , */\ - { 0x4a0, "DISP"}, /* idp protection , */\ - { 0x4b0, "I2SDOE"}, /* Enable data output , */\ - { 0x4c3, "I2SSR"}, /* sample rate setting , */\ - { 0x732, "DCMCC"}, /* Max boost coil current - step of 500 mA , */\ - { 0x9c0, "CCFD"}, /* Selection CoolFlux Clock , */\ - { 0x9d0, "ISEL"}, /* selection input 1 or 2 , */\ - { 0xa02, "DOLS"}, /* Output selection dataout left channel , */\ - { 0xa32, "DORS"}, /* Output selection dataout right channel , */\ - { 0xa62, "SPKL"}, /* Selection speaker induction , */\ - { 0xa91, "SPKR"}, /* Selection speaker impedance , */\ - { 0xab3, "DCFG"}, /* DCDC speaker current compensation gain , */\ - { 0xf00, "VDDD"}, /* mask flag_por for interupt generation , */\ - { 0xf10, "OTDD"}, /* mask flag_otpok for interupt generation , */\ - { 0xf20, "OVDD"}, /* mask flag_ovpok for interupt generation , */\ - { 0xf30, "UVDD"}, /* mask flag_uvpok for interupt generation , */\ - { 0xf40, "OCDD"}, /* mask flag_ocp_alarm for interupt generation , */\ - { 0xf50, "CLKD"}, /* mask flag_clocks_stable for interupt generation , */\ - { 0xf60, "DCCD"}, /* mask flag_pwrokbst for interupt generation , */\ - { 0xf70, "SPKD"}, /* mask flag_cf_speakererror for interupt generation , */\ - { 0xf80, "WDD"}, /* mask flag_watchdog_reset for interupt generation , */\ - { 0xf90, "LCLK"}, /* mask flag_lost_clk for interupt generation , */\ - { 0xfe0, "INT"}, /* enabling interrupt , */\ - { 0xff0, "INTP"}, /* Setting polarity interupt , */\ - { 0x8f0f, "VERSION"}, /* (key1 protected) , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9890_BITNAMETABLE static tfaBfName_t Tfa9890BitNames[] = {\ - { 0x402, "i2s_seti"}, /* I2SFormat data 1 input: , */\ - { 0x431, "chan_sel1"}, /* ChannelSelection data1 input (In CoolFlux) , */\ - { 0x450, "lr_sw_i2si2"}, /* ChannelSelection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ - { 0x461, "input_sel"}, /* Input selection for amplifier , */\ - { 0x481, "datao_sel"}, /* selection data out , */\ - { 0x4a0, "disable_idp"}, /* idp protection , */\ - { 0x4b0, "enbl_datao"}, /* Enable data output , */\ - { 0x4c3, "i2s_fs"}, /* sample rate setting , */\ - { 0x732, "ctrl_bstcur"}, /* Max boost coil current - step of 500 mA , */\ - { 0x9c0, "sel_cf_clk"}, /* Selection CoolFlux Clock , */\ - { 0x9d0, "intf_sel"}, /* selection input 1 or 2 , */\ - { 0xa02, "sel_i2so_l"}, /* Output selection dataout left channel , */\ - { 0xa32, "sel_i2so_r"}, /* Output selection dataout right channel , */\ - { 0xa62, "ctrl_spkr_coil"}, /* Selection speaker induction , */\ - { 0xa91, "ctrl_spr_res"}, /* Selection speaker impedance , */\ - { 0xab3, "ctrl_dcdc_spkr_i_comp_gain"}, /* DCDC speaker current compensation gain , */\ - { 0xaf0, "ctrl_dcdc_spkr_i_comp_sign"}, /* DCDC speaker current compensation sign , */\ - { 0xf00, "flag_por_mask"}, /* mask flag_por for interupt generation , */\ - { 0xf10, "flag_otpok_mask"}, /* mask flag_otpok for interupt generation , */\ - { 0xf20, "flag_ovpok_mask"}, /* mask flag_ovpok for interupt generation , */\ - { 0xf30, "flag_uvpok_mask"}, /* mask flag_uvpok for interupt generation , */\ - { 0xf40, "flag_ocp_alarm_mask"}, /* mask flag_ocp_alarm for interupt generation , */\ - { 0xf50, "flag_clocks_stable_mask"}, /* mask flag_clocks_stable for interupt generation , */\ - { 0xf60, "flag_pwrokbst_mask"}, /* mask flag_pwrokbst for interupt generation , */\ - { 0xf70, "flag_cf_speakererror_mask"}, /* mask flag_cf_speakererror for interupt generation , */\ - { 0xf80, "flag_watchdog_reset_mask"}, /* mask flag_watchdog_reset for interupt generation , */\ - { 0xf90, "flag_lost_clk_mask"}, /* mask flag_lost_clk for interupt generation , */\ - { 0xfe0, "enable_interrupt"}, /* enabling interrupt , */\ - { 0xff0, "invert_int_polarity"}, /* Setting polarity interupt , */\ - { 0x4700, "switch_fb"}, /* switch_fb , */\ - { 0x4713, "se_hyst"}, /* se_hyst , */\ - { 0x4754, "se_level"}, /* se_level , */\ - { 0x47a5, "ktemp"}, /* temperature compensation trimming , */\ - { 0x8f0f, "production_data6"}, /* (key1 protected) , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_genregs.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_genregs.h deleted file mode 100644 index e4b0529fb559..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_genregs.h +++ /dev/null @@ -1,1136 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: Tfa98xx_genregs.h - * This file was generated automatically on 07/01/15 at 10:25:08. - * Source file: TFA9891_I2C_list_V11.xls - */ - -#ifndef TFA9891_GENREGS_H -#define TFA9891_GENREGS_H - - -#define TFA98XX_STATUSREG 0x00 -#define TFA98XX_BATTERYVOLTAGE 0x01 -#define TFA9891_TEMPERATURE 0x02 -#define TFA98XX_REVISIONNUMBER 0x03 -#define TFA98XX_I2SREG 0x04 -#define TFA98XX_BAT_PROT 0x05 -#define TFA98XX_AUDIO_CTR 0x06 -#define TFA98XX_DCDCBOOST 0x07 -#define TFA98XX_SPKR_CALIBRATION 0x08 -#define TFA98XX_SYS_CTRL 0x09 -#define TFA98XX_I2S_SEL_REG 0x0a -#define TFA98XX_HIDDEN_MTP_KEY2 0x0b -#define TFA98XX_INTERRUPT_REG 0x0f -#define TFA98XX_PDM_CTRL 0x10 -#define TFA98XX_PDM_OUT_CTRL 0x11 -#define TFA98XX_PDM_DS4_R 0x12 -#define TFA98XX_PDM_DS4_L 0x13 -#define TFA98XX_CTRL_SAAM_PGA 0x22 -#define TFA98XX_MISC_CTRL 0x25 -#define TFA98XX_CURRENTSENSE1 0x46 -#define TFA98XX_CURRENTSENSE4 0x49 -#define TFA98XX_HIDDEN_MTP_CTRL_REG3 0x62 -#define TFA9891_CF_CONTROLS 0x70 -#define TFA9891_CF_MAD 0x71 -#define TFA9891_CF_MEM 0x72 -#define TFA9891_CF_STATUS 0x73 -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP 0x80 - -/* - * (0x00)-StatusReg - */ - -/* - * POR - */ -#define TFA98XX_STATUSREG_VDDS (0x1<<0) -#define TFA98XX_STATUSREG_VDDS_POS 0 -#define TFA98XX_STATUSREG_VDDS_LEN 1 -#define TFA98XX_STATUSREG_VDDS_MAX 1 -#define TFA98XX_STATUSREG_VDDS_MSK 0x1 - -/* - * PLL_LOCK - */ -#define TFA98XX_STATUSREG_PLLS (0x1<<1) -#define TFA98XX_STATUSREG_PLLS_POS 1 -#define TFA98XX_STATUSREG_PLLS_LEN 1 -#define TFA98XX_STATUSREG_PLLS_MAX 1 -#define TFA98XX_STATUSREG_PLLS_MSK 0x2 - -/* - * flag_otpok - */ -#define TFA98XX_STATUSREG_OTDS (0x1<<2) -#define TFA98XX_STATUSREG_OTDS_POS 2 -#define TFA98XX_STATUSREG_OTDS_LEN 1 -#define TFA98XX_STATUSREG_OTDS_MAX 1 -#define TFA98XX_STATUSREG_OTDS_MSK 0x4 - -/* - * flag_ovpok - */ -#define TFA98XX_STATUSREG_OVDS (0x1<<3) -#define TFA98XX_STATUSREG_OVDS_POS 3 -#define TFA98XX_STATUSREG_OVDS_LEN 1 -#define TFA98XX_STATUSREG_OVDS_MAX 1 -#define TFA98XX_STATUSREG_OVDS_MSK 0x8 - -/* - * flag_uvpok - */ -#define TFA98XX_STATUSREG_UVDS (0x1<<4) -#define TFA98XX_STATUSREG_UVDS_POS 4 -#define TFA98XX_STATUSREG_UVDS_LEN 1 -#define TFA98XX_STATUSREG_UVDS_MAX 1 -#define TFA98XX_STATUSREG_UVDS_MSK 0x10 - -/* - * flag_OCP_alarm - */ -#define TFA98XX_STATUSREG_OCDS (0x1<<5) -#define TFA98XX_STATUSREG_OCDS_POS 5 -#define TFA98XX_STATUSREG_OCDS_LEN 1 -#define TFA98XX_STATUSREG_OCDS_MAX 1 -#define TFA98XX_STATUSREG_OCDS_MSK 0x20 - -/* - * flag_clocks_stable - */ -#define TFA98XX_STATUSREG_CLKS (0x1<<6) -#define TFA98XX_STATUSREG_CLKS_POS 6 -#define TFA98XX_STATUSREG_CLKS_LEN 1 -#define TFA98XX_STATUSREG_CLKS_MAX 1 -#define TFA98XX_STATUSREG_CLKS_MSK 0x40 - -/* - * CLIP - */ -#define TFA98XX_STATUSREG_CLIPS (0x1<<7) -#define TFA98XX_STATUSREG_CLIPS_POS 7 -#define TFA98XX_STATUSREG_CLIPS_LEN 1 -#define TFA98XX_STATUSREG_CLIPS_MAX 1 -#define TFA98XX_STATUSREG_CLIPS_MSK 0x80 - -/* - * mtp_busy - */ -#define TFA98XX_STATUSREG_MTPB (0x1<<8) -#define TFA98XX_STATUSREG_MTPB_POS 8 -#define TFA98XX_STATUSREG_MTPB_LEN 1 -#define TFA98XX_STATUSREG_MTPB_MAX 1 -#define TFA98XX_STATUSREG_MTPB_MSK 0x100 - -/* - * flag_pwrokbst - */ -#define TFA98XX_STATUSREG_DCCS (0x1<<9) -#define TFA98XX_STATUSREG_DCCS_POS 9 -#define TFA98XX_STATUSREG_DCCS_LEN 1 -#define TFA98XX_STATUSREG_DCCS_MAX 1 -#define TFA98XX_STATUSREG_DCCS_MSK 0x200 - -/* - * flag_cf_speakererror - */ -#define TFA98XX_STATUSREG_SPKS (0x1<<10) -#define TFA98XX_STATUSREG_SPKS_POS 10 -#define TFA98XX_STATUSREG_SPKS_LEN 1 -#define TFA98XX_STATUSREG_SPKS_MAX 1 -#define TFA98XX_STATUSREG_SPKS_MSK 0x400 - -/* - * flag_cold_started - */ -#define TFA98XX_STATUSREG_ACS (0x1<<11) -#define TFA98XX_STATUSREG_ACS_POS 11 -#define TFA98XX_STATUSREG_ACS_LEN 1 -#define TFA98XX_STATUSREG_ACS_MAX 1 -#define TFA98XX_STATUSREG_ACS_MSK 0x800 - -/* - * flag_engage - */ -#define TFA98XX_STATUSREG_SWS (0x1<<12) -#define TFA98XX_STATUSREG_SWS_POS 12 -#define TFA98XX_STATUSREG_SWS_LEN 1 -#define TFA98XX_STATUSREG_SWS_MAX 1 -#define TFA98XX_STATUSREG_SWS_MSK 0x1000 - -/* - * flag_watchdog_reset - */ -#define TFA98XX_STATUSREG_WDS (0x1<<13) -#define TFA98XX_STATUSREG_WDS_POS 13 -#define TFA98XX_STATUSREG_WDS_LEN 1 -#define TFA98XX_STATUSREG_WDS_MAX 1 -#define TFA98XX_STATUSREG_WDS_MSK 0x2000 - -/* - * flag_enbl_amp - */ -#define TFA98XX_STATUSREG_AMPS (0x1<<14) -#define TFA98XX_STATUSREG_AMPS_POS 14 -#define TFA98XX_STATUSREG_AMPS_LEN 1 -#define TFA98XX_STATUSREG_AMPS_MAX 1 -#define TFA98XX_STATUSREG_AMPS_MSK 0x4000 - -/* - * flag_enbl_ref - */ -#define TFA98XX_STATUSREG_AREFS (0x1<<15) -#define TFA98XX_STATUSREG_AREFS_POS 15 -#define TFA98XX_STATUSREG_AREFS_LEN 1 -#define TFA98XX_STATUSREG_AREFS_MAX 1 -#define TFA98XX_STATUSREG_AREFS_MSK 0x8000 - -/* - * (0x01)-BatteryVoltage - */ - -/* - * bat_adc - */ -#define TFA98XX_BATTERYVOLTAGE_BATS (0x3ff<<0) -#define TFA98XX_BATTERYVOLTAGE_BATS_POS 0 -#define TFA98XX_BATTERYVOLTAGE_BATS_LEN 10 -#define TFA98XX_BATTERYVOLTAGE_BATS_MAX 1023 -#define TFA98XX_BATTERYVOLTAGE_BATS_MSK 0x3ff - - -/* - * (0x02)-Temperature - */ - -/* - * temp_adc - */ -#define TFA9891_TEMPERATURE_TEMPS (0x1ff<<0) -#define TFA9891_TEMPERATURE_TEMPS_POS 0 -#define TFA9891_TEMPERATURE_TEMPS_LEN 9 -#define TFA9891_TEMPERATURE_TEMPS_MAX 511 -#define TFA9891_TEMPERATURE_TEMPS_MSK 0x1ff - - -/* - * (0x03)-RevisionNumber - */ - -/* - * rev_reg - */ -#define TFA98XX_REVISIONNUMBER_REV (0xff<<0) -#define TFA98XX_REVISIONNUMBER_REV_POS 0 -#define TFA98XX_REVISIONNUMBER_REV_LEN 8 -#define TFA98XX_REVISIONNUMBER_REV_MAX 255 -#define TFA98XX_REVISIONNUMBER_REV_MSK 0xff - - -/* - * (0x04)-I2SReg - */ - -/* - * i2s_seti - */ -#define TFA98XX_I2SREG_I2SF (0x7<<0) -#define TFA98XX_I2SREG_I2SF_POS 0 -#define TFA98XX_I2SREG_I2SF_LEN 3 -#define TFA98XX_I2SREG_I2SF_MAX 7 -#define TFA98XX_I2SREG_I2SF_MSK 0x7 - -/* - * chan_sel1 - */ -#define TFA98XX_I2SREG_CHS12 (0x3<<3) -#define TFA98XX_I2SREG_CHS12_POS 3 -#define TFA98XX_I2SREG_CHS12_LEN 2 -#define TFA98XX_I2SREG_CHS12_MAX 3 -#define TFA98XX_I2SREG_CHS12_MSK 0x18 - -/* - * lr_sw_i2si2 - */ -#define TFA98XX_I2SREG_CHS3 (0x1<<5) -#define TFA98XX_I2SREG_CHS3_POS 5 -#define TFA98XX_I2SREG_CHS3_LEN 1 -#define TFA98XX_I2SREG_CHS3_MAX 1 -#define TFA98XX_I2SREG_CHS3_MSK 0x20 - -/* - * input_sel - */ -#define TFA98XX_I2SREG_CHSA (0x3<<6) -#define TFA98XX_I2SREG_CHSA_POS 6 -#define TFA98XX_I2SREG_CHSA_LEN 2 -#define TFA98XX_I2SREG_CHSA_MAX 3 -#define TFA98XX_I2SREG_CHSA_MSK 0xc0 - -/* - * datao_sel - */ -#define TFA98XX_I2SREG_I2SDOC (0x3<<8) -#define TFA98XX_I2SREG_I2SDOC_POS 8 -#define TFA98XX_I2SREG_I2SDOC_LEN 2 -#define TFA98XX_I2SREG_I2SDOC_MAX 3 -#define TFA98XX_I2SREG_I2SDOC_MSK 0x300 - -/* - * disable_idp - */ -#define TFA98XX_I2SREG_DISP (0x1<<10) -#define TFA98XX_I2SREG_DISP_POS 10 -#define TFA98XX_I2SREG_DISP_LEN 1 -#define TFA98XX_I2SREG_DISP_MAX 1 -#define TFA98XX_I2SREG_DISP_MSK 0x400 - -/* - * enbl_datao - */ -#define TFA98XX_I2SREG_I2SDOE (0x1<<11) -#define TFA98XX_I2SREG_I2SDOE_POS 11 -#define TFA98XX_I2SREG_I2SDOE_LEN 1 -#define TFA98XX_I2SREG_I2SDOE_MAX 1 -#define TFA98XX_I2SREG_I2SDOE_MSK 0x800 - -/* - * i2s_fs - */ -#define TFA98XX_I2SREG_I2SSR (0xf<<12) -#define TFA98XX_I2SREG_I2SSR_POS 12 -#define TFA98XX_I2SREG_I2SSR_LEN 4 -#define TFA98XX_I2SREG_I2SSR_MAX 15 -#define TFA98XX_I2SREG_I2SSR_MSK 0xf000 - - -/* - * (0x05)-bat_prot - */ - -/* - * vbat_prot_attacktime - */ -#define TFA98XX_BAT_PROT_BSSCR (0x3<<0) -#define TFA98XX_BAT_PROT_BSSCR_POS 0 -#define TFA98XX_BAT_PROT_BSSCR_LEN 2 -#define TFA98XX_BAT_PROT_BSSCR_MAX 3 -#define TFA98XX_BAT_PROT_BSSCR_MSK 0x3 - -/* - * vbat_prot_thlevel - */ -#define TFA98XX_BAT_PROT_BSST (0xf<<2) -#define TFA98XX_BAT_PROT_BSST_POS 2 -#define TFA98XX_BAT_PROT_BSST_LEN 4 -#define TFA98XX_BAT_PROT_BSST_MAX 15 -#define TFA98XX_BAT_PROT_BSST_MSK 0x3c - -/* - * vbat_prot_max_reduct - */ -#define TFA98XX_BAT_PROT_BSSRL (0x3<<6) -#define TFA98XX_BAT_PROT_BSSRL_POS 6 -#define TFA98XX_BAT_PROT_BSSRL_LEN 2 -#define TFA98XX_BAT_PROT_BSSRL_MAX 3 -#define TFA98XX_BAT_PROT_BSSRL_MSK 0xc0 - -/* - * vbat_prot_release_t - */ -#define TFA98XX_BAT_PROT_BSSRR (0x7<<8) -#define TFA98XX_BAT_PROT_BSSRR_POS 8 -#define TFA98XX_BAT_PROT_BSSRR_LEN 3 -#define TFA98XX_BAT_PROT_BSSRR_MAX 7 -#define TFA98XX_BAT_PROT_BSSRR_MSK 0x700 - -/* - * vbat_prot_hysterese - */ -#define TFA98XX_BAT_PROT_BSSHY (0x3<<11) -#define TFA98XX_BAT_PROT_BSSHY_POS 11 -#define TFA98XX_BAT_PROT_BSSHY_LEN 2 -#define TFA98XX_BAT_PROT_BSSHY_MAX 3 -#define TFA98XX_BAT_PROT_BSSHY_MSK 0x1800 - -/* - * sel_vbat - */ -#define TFA98XX_BAT_PROT_BSSR (0x1<<14) -#define TFA98XX_BAT_PROT_BSSR_POS 14 -#define TFA98XX_BAT_PROT_BSSR_LEN 1 -#define TFA98XX_BAT_PROT_BSSR_MAX 1 -#define TFA98XX_BAT_PROT_BSSR_MSK 0x4000 - -/* - * bypass_clipper - */ -#define TFA98XX_BAT_PROT_BSSBY (0x1<<15) -#define TFA98XX_BAT_PROT_BSSBY_POS 15 -#define TFA98XX_BAT_PROT_BSSBY_LEN 1 -#define TFA98XX_BAT_PROT_BSSBY_MAX 1 -#define TFA98XX_BAT_PROT_BSSBY_MSK 0x8000 - - -/* - * (0x06)-audio_ctr - */ - -/* - * dpsa - */ -#define TFA98XX_AUDIO_CTR_DPSA (0x1<<0) -#define TFA98XX_AUDIO_CTR_DPSA_POS 0 -#define TFA98XX_AUDIO_CTR_DPSA_LEN 1 -#define TFA98XX_AUDIO_CTR_DPSA_MAX 1 -#define TFA98XX_AUDIO_CTR_DPSA_MSK 0x1 - -/* - * ctrl_slope - */ -#define TFA98XX_AUDIO_CTR_AMPSL (0xf<<1) -#define TFA98XX_AUDIO_CTR_AMPSL_POS 1 -#define TFA98XX_AUDIO_CTR_AMPSL_LEN 4 -#define TFA98XX_AUDIO_CTR_AMPSL_MAX 15 -#define TFA98XX_AUDIO_CTR_AMPSL_MSK 0x1e - -/* - * cf_mute - */ -#define TFA98XX_AUDIO_CTR_CFSM (0x1<<5) -#define TFA98XX_AUDIO_CTR_CFSM_POS 5 -#define TFA98XX_AUDIO_CTR_CFSM_LEN 1 -#define TFA98XX_AUDIO_CTR_CFSM_MAX 1 -#define TFA98XX_AUDIO_CTR_CFSM_MSK 0x20 - -/* - * ctrl_batsensesteepness - */ -#define TFA98XX_AUDIO_CTR_BSSS (0x1<<7) -#define TFA98XX_AUDIO_CTR_BSSS_POS 7 -#define TFA98XX_AUDIO_CTR_BSSS_LEN 1 -#define TFA98XX_AUDIO_CTR_BSSS_MAX 1 -#define TFA98XX_AUDIO_CTR_BSSS_MSK 0x80 - -/* - * vol - */ -#define TFA98XX_AUDIO_CTR_VOL (0xff<<8) -#define TFA98XX_AUDIO_CTR_VOL_POS 8 -#define TFA98XX_AUDIO_CTR_VOL_LEN 8 -#define TFA98XX_AUDIO_CTR_VOL_MAX 255 -#define TFA98XX_AUDIO_CTR_VOL_MSK 0xff00 - - -/* - * (0x07)-DCDCboost - */ - -/* - * ctrl_bstvolt - */ -#define TFA98XX_DCDCBOOST_DCVO (0x7<<0) -#define TFA98XX_DCDCBOOST_DCVO_POS 0 -#define TFA98XX_DCDCBOOST_DCVO_LEN 3 -#define TFA98XX_DCDCBOOST_DCVO_MAX 7 -#define TFA98XX_DCDCBOOST_DCVO_MSK 0x7 - -/* - * ctrl_bstcur - */ -#define TFA98XX_DCDCBOOST_DCMCC (0x7<<3) -#define TFA98XX_DCDCBOOST_DCMCC_POS 3 -#define TFA98XX_DCDCBOOST_DCMCC_LEN 3 -#define TFA98XX_DCDCBOOST_DCMCC_MAX 7 -#define TFA98XX_DCDCBOOST_DCMCC_MSK 0x38 - -/* - * boost_intel - */ -#define TFA98XX_DCDCBOOST_DCIE (0x1<<10) -#define TFA98XX_DCDCBOOST_DCIE_POS 10 -#define TFA98XX_DCDCBOOST_DCIE_LEN 1 -#define TFA98XX_DCDCBOOST_DCIE_MAX 1 -#define TFA98XX_DCDCBOOST_DCIE_MSK 0x400 - -/* - * boost_speed - */ -#define TFA98XX_DCDCBOOST_DCSR (0x1<<11) -#define TFA98XX_DCDCBOOST_DCSR_POS 11 -#define TFA98XX_DCDCBOOST_DCSR_LEN 1 -#define TFA98XX_DCDCBOOST_DCSR_MAX 1 -#define TFA98XX_DCDCBOOST_DCSR_MSK 0x800 - - -/* - * (0x08)-spkr_calibration - */ - -/* - * ext_temp_sel - */ -#define TFA98XX_SPKR_CALIBRATION_TROS (0x1<<0) -#define TFA98XX_SPKR_CALIBRATION_TROS_POS 0 -#define TFA98XX_SPKR_CALIBRATION_TROS_LEN 1 -#define TFA98XX_SPKR_CALIBRATION_TROS_MAX 1 -#define TFA98XX_SPKR_CALIBRATION_TROS_MSK 0x1 - -/* - * ext_temp - */ -#define TFA98XX_SPKR_CALIBRATION_EXTTS (0x1ff<<1) -#define TFA98XX_SPKR_CALIBRATION_EXTTS_POS 1 -#define TFA98XX_SPKR_CALIBRATION_EXTTS_LEN 9 -#define TFA98XX_SPKR_CALIBRATION_EXTTS_MAX 511 -#define TFA98XX_SPKR_CALIBRATION_EXTTS_MSK 0x3fe - - -/* - * (0x09)-sys_ctrl - */ - -/* - * PowerDown - */ -#define TFA98XX_SYS_CTRL_PWDN (0x1<<0) -#define TFA98XX_SYS_CTRL_PWDN_POS 0 -#define TFA98XX_SYS_CTRL_PWDN_LEN 1 -#define TFA98XX_SYS_CTRL_PWDN_MAX 1 -#define TFA98XX_SYS_CTRL_PWDN_MSK 0x1 - -/* - * reset - */ -#define TFA98XX_SYS_CTRL_I2CR (0x1<<1) -#define TFA98XX_SYS_CTRL_I2CR_POS 1 -#define TFA98XX_SYS_CTRL_I2CR_LEN 1 -#define TFA98XX_SYS_CTRL_I2CR_MAX 1 -#define TFA98XX_SYS_CTRL_I2CR_MSK 0x2 - -/* - * enbl_coolflux - */ -#define TFA98XX_SYS_CTRL_CFE (0x1<<2) -#define TFA98XX_SYS_CTRL_CFE_POS 2 -#define TFA98XX_SYS_CTRL_CFE_LEN 1 -#define TFA98XX_SYS_CTRL_CFE_MAX 1 -#define TFA98XX_SYS_CTRL_CFE_MSK 0x4 - -/* - * enbl_amplifier - */ -#define TFA98XX_SYS_CTRL_AMPE (0x1<<3) -#define TFA98XX_SYS_CTRL_AMPE_POS 3 -#define TFA98XX_SYS_CTRL_AMPE_LEN 1 -#define TFA98XX_SYS_CTRL_AMPE_MAX 1 -#define TFA98XX_SYS_CTRL_AMPE_MSK 0x8 - -/* - * enbl_boost - */ -#define TFA98XX_SYS_CTRL_DCA (0x1<<4) -#define TFA98XX_SYS_CTRL_DCA_POS 4 -#define TFA98XX_SYS_CTRL_DCA_LEN 1 -#define TFA98XX_SYS_CTRL_DCA_MAX 1 -#define TFA98XX_SYS_CTRL_DCA_MSK 0x10 - -/* - * cf_configured - */ -#define TFA98XX_SYS_CTRL_SBSL (0x1<<5) -#define TFA98XX_SYS_CTRL_SBSL_POS 5 -#define TFA98XX_SYS_CTRL_SBSL_LEN 1 -#define TFA98XX_SYS_CTRL_SBSL_MAX 1 -#define TFA98XX_SYS_CTRL_SBSL_MSK 0x20 - -/* - * sel_enbl_amplifier - */ -#define TFA98XX_SYS_CTRL_AMPC (0x1<<6) -#define TFA98XX_SYS_CTRL_AMPC_POS 6 -#define TFA98XX_SYS_CTRL_AMPC_LEN 1 -#define TFA98XX_SYS_CTRL_AMPC_MAX 1 -#define TFA98XX_SYS_CTRL_AMPC_MSK 0x40 - -/* - * dcdcoff_mode - */ -#define TFA98XX_SYS_CTRL_DCDIS (0x1<<7) -#define TFA98XX_SYS_CTRL_DCDIS_POS 7 -#define TFA98XX_SYS_CTRL_DCDIS_LEN 1 -#define TFA98XX_SYS_CTRL_DCDIS_MAX 1 -#define TFA98XX_SYS_CTRL_DCDIS_MSK 0x80 - -/* - * cttr_iddqtest - */ -#define TFA98XX_SYS_CTRL_PSDR (0x1<<8) -#define TFA98XX_SYS_CTRL_PSDR_POS 8 -#define TFA98XX_SYS_CTRL_PSDR_LEN 1 -#define TFA98XX_SYS_CTRL_PSDR_MAX 1 -#define TFA98XX_SYS_CTRL_PSDR_MSK 0x100 - -/* - * ctrl_coil_value - */ -#define TFA98XX_SYS_CTRL_DCCV (0x3<<9) -#define TFA98XX_SYS_CTRL_DCCV_POS 9 -#define TFA98XX_SYS_CTRL_DCCV_LEN 2 -#define TFA98XX_SYS_CTRL_DCCV_MAX 3 -#define TFA98XX_SYS_CTRL_DCCV_MSK 0x600 - -/* - * ctrl_sel_cf_clock - */ -#define TFA98XX_SYS_CTRL_CCFD (0x3<<11) -#define TFA98XX_SYS_CTRL_CCFD_POS 11 -#define TFA98XX_SYS_CTRL_CCFD_LEN 2 -#define TFA98XX_SYS_CTRL_CCFD_MAX 3 -#define TFA98XX_SYS_CTRL_CCFD_MSK 0x1800 - -/* - * intf_sel - */ -#define TFA98XX_SYS_CTRL_ISEL (0x1<<13) -#define TFA98XX_SYS_CTRL_ISEL_POS 13 -#define TFA98XX_SYS_CTRL_ISEL_LEN 1 -#define TFA98XX_SYS_CTRL_ISEL_MAX 1 -#define TFA98XX_SYS_CTRL_ISEL_MSK 0x2000 - -/* - * sel_ws_bck - */ -#define TFA98XX_SYS_CTRL_IPLL (0x1<<14) -#define TFA98XX_SYS_CTRL_IPLL_POS 14 -#define TFA98XX_SYS_CTRL_IPLL_LEN 1 -#define TFA98XX_SYS_CTRL_IPLL_MAX 1 -#define TFA98XX_SYS_CTRL_IPLL_MSK 0x4000 - - -/* - * (0x0a)-I2S_sel_reg - */ - -/* - * sel_i2so_l - */ -#define TFA98XX_I2S_SEL_REG_DOLS (0x7<<0) -#define TFA98XX_I2S_SEL_REG_DOLS_POS 0 -#define TFA98XX_I2S_SEL_REG_DOLS_LEN 3 -#define TFA98XX_I2S_SEL_REG_DOLS_MAX 7 -#define TFA98XX_I2S_SEL_REG_DOLS_MSK 0x7 - -/* - * sel_i2so_r - */ -#define TFA98XX_I2S_SEL_REG_DORS (0x7<<3) -#define TFA98XX_I2S_SEL_REG_DORS_POS 3 -#define TFA98XX_I2S_SEL_REG_DORS_LEN 3 -#define TFA98XX_I2S_SEL_REG_DORS_MAX 7 -#define TFA98XX_I2S_SEL_REG_DORS_MSK 0x38 - -/* - * ctrl_spkr_coil - */ -#define TFA98XX_I2S_SEL_REG_SPKL (0x7<<6) -#define TFA98XX_I2S_SEL_REG_SPKL_POS 6 -#define TFA98XX_I2S_SEL_REG_SPKL_LEN 3 -#define TFA98XX_I2S_SEL_REG_SPKL_MAX 7 -#define TFA98XX_I2S_SEL_REG_SPKL_MSK 0x1c0 - -/* - * ctrl_spr_res - */ -#define TFA98XX_I2S_SEL_REG_SPKR (0x3<<9) -#define TFA98XX_I2S_SEL_REG_SPKR_POS 9 -#define TFA98XX_I2S_SEL_REG_SPKR_LEN 2 -#define TFA98XX_I2S_SEL_REG_SPKR_MAX 3 -#define TFA98XX_I2S_SEL_REG_SPKR_MSK 0x600 - -/* - * ctrl_dcdc_spkr_i_comp_gain - */ -#define TFA98XX_I2S_SEL_REG_DCFG (0xf<<11) -#define TFA98XX_I2S_SEL_REG_DCFG_POS 11 -#define TFA98XX_I2S_SEL_REG_DCFG_LEN 4 -#define TFA98XX_I2S_SEL_REG_DCFG_MAX 15 -#define TFA98XX_I2S_SEL_REG_DCFG_MSK 0x7800 - - -/* - * (0x0b)-Hidden_mtp_key2 - */ - -/* - * MTP_key2 - */ -#define TFA98XX_HIDDEN_MTP_KEY2_MTPK (0xff<<0) -#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_POS 0 -#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_LEN 8 -#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_MAX 255 -#define TFA98XX_HIDDEN_MTP_KEY2_MTPK_MSK 0xff - - -/* - * (0x0f)-interrupt_reg - */ - -/* - * flag_por_mask - */ -#define TFA98XX_INTERRUPT_REG_VDDD (0x1<<0) -#define TFA98XX_INTERRUPT_REG_VDDD_POS 0 -#define TFA98XX_INTERRUPT_REG_VDDD_LEN 1 -#define TFA98XX_INTERRUPT_REG_VDDD_MAX 1 -#define TFA98XX_INTERRUPT_REG_VDDD_MSK 0x1 - -/* - * flag_otpok_mask - */ -#define TFA98XX_INTERRUPT_REG_OTDD (0x1<<1) -#define TFA98XX_INTERRUPT_REG_OTDD_POS 1 -#define TFA98XX_INTERRUPT_REG_OTDD_LEN 1 -#define TFA98XX_INTERRUPT_REG_OTDD_MAX 1 -#define TFA98XX_INTERRUPT_REG_OTDD_MSK 0x2 - -/* - * flag_ovpok_mask - */ -#define TFA98XX_INTERRUPT_REG_OVDD (0x1<<2) -#define TFA98XX_INTERRUPT_REG_OVDD_POS 2 -#define TFA98XX_INTERRUPT_REG_OVDD_LEN 1 -#define TFA98XX_INTERRUPT_REG_OVDD_MAX 1 -#define TFA98XX_INTERRUPT_REG_OVDD_MSK 0x4 - -/* - * flag_uvpok_mask - */ -#define TFA98XX_INTERRUPT_REG_UVDD (0x1<<3) -#define TFA98XX_INTERRUPT_REG_UVDD_POS 3 -#define TFA98XX_INTERRUPT_REG_UVDD_LEN 1 -#define TFA98XX_INTERRUPT_REG_UVDD_MAX 1 -#define TFA98XX_INTERRUPT_REG_UVDD_MSK 0x8 - -/* - * flag_ocp_alarm_mask - */ -#define TFA98XX_INTERRUPT_REG_OCDD (0x1<<4) -#define TFA98XX_INTERRUPT_REG_OCDD_POS 4 -#define TFA98XX_INTERRUPT_REG_OCDD_LEN 1 -#define TFA98XX_INTERRUPT_REG_OCDD_MAX 1 -#define TFA98XX_INTERRUPT_REG_OCDD_MSK 0x10 - -/* - * flag_clocks_stable_mask - */ -#define TFA98XX_INTERRUPT_REG_CLKD (0x1<<5) -#define TFA98XX_INTERRUPT_REG_CLKD_POS 5 -#define TFA98XX_INTERRUPT_REG_CLKD_LEN 1 -#define TFA98XX_INTERRUPT_REG_CLKD_MAX 1 -#define TFA98XX_INTERRUPT_REG_CLKD_MSK 0x20 - -/* - * flag_pwrokbst_mask - */ -#define TFA98XX_INTERRUPT_REG_DCCD (0x1<<6) -#define TFA98XX_INTERRUPT_REG_DCCD_POS 6 -#define TFA98XX_INTERRUPT_REG_DCCD_LEN 1 -#define TFA98XX_INTERRUPT_REG_DCCD_MAX 1 -#define TFA98XX_INTERRUPT_REG_DCCD_MSK 0x40 - -/* - * flag_cf_speakererror_mask - */ -#define TFA98XX_INTERRUPT_REG_SPKD (0x1<<7) -#define TFA98XX_INTERRUPT_REG_SPKD_POS 7 -#define TFA98XX_INTERRUPT_REG_SPKD_LEN 1 -#define TFA98XX_INTERRUPT_REG_SPKD_MAX 1 -#define TFA98XX_INTERRUPT_REG_SPKD_MSK 0x80 - -/* - * flag_watchdog_reset_mask - */ -#define TFA98XX_INTERRUPT_REG_WDD (0x1<<8) -#define TFA98XX_INTERRUPT_REG_WDD_POS 8 -#define TFA98XX_INTERRUPT_REG_WDD_LEN 1 -#define TFA98XX_INTERRUPT_REG_WDD_MAX 1 -#define TFA98XX_INTERRUPT_REG_WDD_MSK 0x100 - -/* - * enable_interrupt - */ -#define TFA98XX_INTERRUPT_REG_INT (0x1<<14) -#define TFA98XX_INTERRUPT_REG_INT_POS 14 -#define TFA98XX_INTERRUPT_REG_INT_LEN 1 -#define TFA98XX_INTERRUPT_REG_INT_MAX 1 -#define TFA98XX_INTERRUPT_REG_INT_MSK 0x4000 - -/* - * invert_int_polarity - */ -#define TFA98XX_INTERRUPT_REG_INTP (0x1<<15) -#define TFA98XX_INTERRUPT_REG_INTP_POS 15 -#define TFA98XX_INTERRUPT_REG_INTP_LEN 1 -#define TFA98XX_INTERRUPT_REG_INTP_MAX 1 -#define TFA98XX_INTERRUPT_REG_INTP_MSK 0x8000 - - -/* - * (0x10)-pdm_ctrl - */ - -/* - * pdm_i2s_input - */ -#define TFA98XX_PDM_CTRL_PDMSEL (0x1<<0) -#define TFA98XX_PDM_CTRL_PDMSEL_POS 0 -#define TFA98XX_PDM_CTRL_PDMSEL_LEN 1 -#define TFA98XX_PDM_CTRL_PDMSEL_MAX 1 -#define TFA98XX_PDM_CTRL_PDMSEL_MSK 0x1 - -/* - * I2S_master_ena - */ -#define TFA98XX_PDM_CTRL_I2SMOUTEN (0x1<<1) -#define TFA98XX_PDM_CTRL_I2SMOUTEN_POS 1 -#define TFA98XX_PDM_CTRL_I2SMOUTEN_LEN 1 -#define TFA98XX_PDM_CTRL_I2SMOUTEN_MAX 1 -#define TFA98XX_PDM_CTRL_I2SMOUTEN_MSK 0x2 - -/* - * pdm_out_sel_r - */ -#define TFA98XX_PDM_CTRL_PDMORSEL (0x3<<2) -#define TFA98XX_PDM_CTRL_PDMORSEL_POS 2 -#define TFA98XX_PDM_CTRL_PDMORSEL_LEN 2 -#define TFA98XX_PDM_CTRL_PDMORSEL_MAX 3 -#define TFA98XX_PDM_CTRL_PDMORSEL_MSK 0xc - -/* - * pdm_out_sel_l - */ -#define TFA98XX_PDM_CTRL_PDMOLSEL (0x3<<4) -#define TFA98XX_PDM_CTRL_PDMOLSEL_POS 4 -#define TFA98XX_PDM_CTRL_PDMOLSEL_LEN 2 -#define TFA98XX_PDM_CTRL_PDMOLSEL_MAX 3 -#define TFA98XX_PDM_CTRL_PDMOLSEL_MSK 0x30 - -/* - * micdat_out_sel - */ -#define TFA98XX_PDM_CTRL_PADSEL (0x3<<6) -#define TFA98XX_PDM_CTRL_PADSEL_POS 6 -#define TFA98XX_PDM_CTRL_PADSEL_LEN 2 -#define TFA98XX_PDM_CTRL_PADSEL_MAX 3 -#define TFA98XX_PDM_CTRL_PADSEL_MSK 0xc0 - - -/* - * (0x11)-pdm_out_ctrl - */ - -/* - * secure_dly - */ -#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN (0x1<<0) -#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_POS 0 -#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_LEN 1 -#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_MAX 1 -#define TFA98XX_PDM_OUT_CTRL_PDMOSDEN_MSK 0x1 - -/* - * d_out_valid_rf_mux - */ -#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF (0x1<<1) -#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_POS 1 -#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_LEN 1 -#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_MAX 1 -#define TFA98XX_PDM_OUT_CTRL_PDMOSDCF_MSK 0x2 - -/* - * Speak_As_Mic_en - */ -#define TFA98XX_PDM_OUT_CTRL_SAAMEN (0x1<<4) -#define TFA98XX_PDM_OUT_CTRL_SAAMEN_POS 4 -#define TFA98XX_PDM_OUT_CTRL_SAAMEN_LEN 1 -#define TFA98XX_PDM_OUT_CTRL_SAAMEN_MAX 1 -#define TFA98XX_PDM_OUT_CTRL_SAAMEN_MSK 0x10 - -/* - * speak_as_mic_lp_mode - */ -#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN (0x1<<5) -#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_POS 5 -#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_LEN 1 -#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_MAX 1 -#define TFA98XX_PDM_OUT_CTRL_SAAMLPEN_MSK 0x20 - -/* - * pdm_out_rate - */ -#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN (0x1<<6) -#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_POS 6 -#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_LEN 1 -#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_MAX 1 -#define TFA98XX_PDM_OUT_CTRL_PDMOINTEN_MSK 0x40 - - -/* - * (0x12)-pdm_ds4_r - */ - -/* - * ds4_g1_r - */ -#define TFA98XX_PDM_DS4_R_PDMORG1 (0xf<<0) -#define TFA98XX_PDM_DS4_R_PDMORG1_POS 0 -#define TFA98XX_PDM_DS4_R_PDMORG1_LEN 4 -#define TFA98XX_PDM_DS4_R_PDMORG1_MAX 15 -#define TFA98XX_PDM_DS4_R_PDMORG1_MSK 0xf - -/* - * ds4_g2_r - */ -#define TFA98XX_PDM_DS4_R_PDMORG2 (0xf<<4) -#define TFA98XX_PDM_DS4_R_PDMORG2_POS 4 -#define TFA98XX_PDM_DS4_R_PDMORG2_LEN 4 -#define TFA98XX_PDM_DS4_R_PDMORG2_MAX 15 -#define TFA98XX_PDM_DS4_R_PDMORG2_MSK 0xf0 - - -/* - * (0x13)-pdm_ds4_l - */ - -/* - * ds4_g1_l - */ -#define TFA98XX_PDM_DS4_L_PDMOLG1 (0xf<<0) -#define TFA98XX_PDM_DS4_L_PDMOLG1_POS 0 -#define TFA98XX_PDM_DS4_L_PDMOLG1_LEN 4 -#define TFA98XX_PDM_DS4_L_PDMOLG1_MAX 15 -#define TFA98XX_PDM_DS4_L_PDMOLG1_MSK 0xf - -/* - * ds4_g2_l - */ -#define TFA98XX_PDM_DS4_L_PDMOLG2 (0xf<<4) -#define TFA98XX_PDM_DS4_L_PDMOLG2_POS 4 -#define TFA98XX_PDM_DS4_L_PDMOLG2_LEN 4 -#define TFA98XX_PDM_DS4_L_PDMOLG2_MAX 15 -#define TFA98XX_PDM_DS4_L_PDMOLG2_MSK 0xf0 - - -/* - * (0x22)-ctrl_saam_pga - */ - -/* - * Ctrl_saam_pga_gain - */ -#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN (0x7<<0) -#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_POS 0 -#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_LEN 3 -#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_MAX 7 -#define TFA98XX_CTRL_SAAM_PGA_SAAMGAIN_MSK 0x7 - -/* - * ctrl_saam_pga_src - */ -#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL (0x1<<5) -#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_POS 5 -#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_LEN 1 -#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_MAX 1 -#define TFA98XX_CTRL_SAAM_PGA_SAAMPGACTRL_MSK 0x20 - - -/* - * (0x25)-misc_ctrl - */ - -/* - * pll_fcco - */ -#define TFA98XX_MISC_CTRL_PLLCCOSEL (0x1<<0) -#define TFA98XX_MISC_CTRL_PLLCCOSEL_POS 0 -#define TFA98XX_MISC_CTRL_PLLCCOSEL_LEN 1 -#define TFA98XX_MISC_CTRL_PLLCCOSEL_MAX 1 -#define TFA98XX_MISC_CTRL_PLLCCOSEL_MSK 0x1 - - -/* - * (0x46)-CurrentSense1 - */ - -/* - * bypass_gc - */ -#define TFA98XX_CURRENTSENSE1_CSBYPGC (0x1<<0) -#define TFA98XX_CURRENTSENSE1_CSBYPGC_POS 0 -#define TFA98XX_CURRENTSENSE1_CSBYPGC_LEN 1 -#define TFA98XX_CURRENTSENSE1_CSBYPGC_MAX 1 -#define TFA98XX_CURRENTSENSE1_CSBYPGC_MSK 0x1 - - -/* - * (0x49)-CurrentSense4 - */ - -/* - * ctrl_bypassclip - */ -#define TFA98XX_CURRENTSENSE4_CLIP (0x1<<0) -#define TFA98XX_CURRENTSENSE4_CLIP_POS 0 -#define TFA98XX_CURRENTSENSE4_CLIP_LEN 1 -#define TFA98XX_CURRENTSENSE4_CLIP_MAX 1 -#define TFA98XX_CURRENTSENSE4_CLIP_MSK 0x1 - -/* - * ctrl_bypassclip2 - */ -#define TFA98XX_CURRENTSENSE4_CLIP2 (0x1<<1) -#define TFA98XX_CURRENTSENSE4_CLIP2_POS 1 -#define TFA98XX_CURRENTSENSE4_CLIP2_LEN 1 -#define TFA98XX_CURRENTSENSE4_CLIP2_MAX 1 -#define TFA98XX_CURRENTSENSE4_CLIP2_MSK 0x2 - - -/* - * (0x62)-Hidden_mtp_ctrl_reg3 - */ - - -/* - * (0x70)-cf_controls - */ - -/* - * cf_rst_dsp - */ -#define TFA98XX_CF_CONTROLS_RST (0x1<<0) -#define TFA98XX_CF_CONTROLS_RST_POS 0 -#define TFA98XX_CF_CONTROLS_RST_LEN 1 -#define TFA98XX_CF_CONTROLS_RST_MAX 1 -#define TFA98XX_CF_CONTROLS_RST_MSK 0x1 - -/* - * cf_dmem - */ -#define TFA98XX_CF_CONTROLS_DMEM (0x3<<1) -#define TFA98XX_CF_CONTROLS_DMEM_POS 1 -#define TFA98XX_CF_CONTROLS_DMEM_LEN 2 -#define TFA98XX_CF_CONTROLS_DMEM_MAX 3 -#define TFA98XX_CF_CONTROLS_DMEM_MSK 0x6 - -/* - * cf_aif - */ -#define TFA98XX_CF_CONTROLS_AIF (0x1<<3) -#define TFA98XX_CF_CONTROLS_AIF_POS 3 -#define TFA98XX_CF_CONTROLS_AIF_LEN 1 -#define TFA98XX_CF_CONTROLS_AIF_MAX 1 -#define TFA98XX_CF_CONTROLS_AIF_MSK 0x8 - -/* - * cf_int - */ -#define TFA98XX_CF_CONTROLS_CFINT (0x1<<4) -#define TFA98XX_CF_CONTROLS_CFINT_POS 4 -#define TFA98XX_CF_CONTROLS_CFINT_LEN 1 -#define TFA98XX_CF_CONTROLS_CFINT_MAX 1 -#define TFA98XX_CF_CONTROLS_CFINT_MSK 0x10 - -/* - * cf_req - */ -#define TFA98XX_CF_CONTROLS_REQ (0xff<<8) -#define TFA98XX_CF_CONTROLS_REQ_POS 8 -#define TFA98XX_CF_CONTROLS_REQ_LEN 8 -#define TFA98XX_CF_CONTROLS_REQ_MAX 255 -#define TFA98XX_CF_CONTROLS_REQ_MSK 0xff00 - - -/* - * (0x71)-cf_mad - */ - -/* - * cf_madd - */ -#define TFA9891_CF_MAD_MADD (0xffff<<0) -#define TFA9891_CF_MAD_MADD_POS 0 -#define TFA9891_CF_MAD_MADD_LEN 16 -#define TFA9891_CF_MAD_MADD_MAX 65535 -#define TFA9891_CF_MAD_MADD_MSK 0xffff - - -/* - * (0x72)-cf_mem - */ - -/* - * cf_mema - */ -#define TFA9891_CF_MEM_MEMA (0xffff<<0) -#define TFA9891_CF_MEM_MEMA_POS 0 -#define TFA9891_CF_MEM_MEMA_LEN 16 -#define TFA9891_CF_MEM_MEMA_MAX 65535 -#define TFA9891_CF_MEM_MEMA_MSK 0xffff - - -/* - * (0x73)-cf_status - */ - -/* - * cf_err - */ -#define TFA9891_CF_STATUS_ERR (0xff<<0) -#define TFA9891_CF_STATUS_ERR_POS 0 -#define TFA9891_CF_STATUS_ERR_LEN 8 -#define TFA9891_CF_STATUS_ERR_MAX 255 -#define TFA9891_CF_STATUS_ERR_MSK 0xff - -/* - * cf_ack - */ -#define TFA9891_CF_STATUS_ACK (0xff<<8) -#define TFA9891_CF_STATUS_ACK_POS 8 -#define TFA9891_CF_STATUS_ACK_LEN 8 -#define TFA9891_CF_STATUS_ACK_MAX 255 -#define TFA9891_CF_STATUS_ACK_MSK 0xff00 - - -/* - * (0x80)-Key2Protected_spkr_cal_mtp - */ - -/* - * calibration_onetime - */ -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC (0x1<<0) -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_POS 0 -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_LEN 1 -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_MAX 1 -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPOTC_MSK 0x1 - -/* - * calibr_ron_done - */ -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX (0x1<<1) -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_POS 1 -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_LEN 1 -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_MAX 1 -#define TFA98XX_KEY2PROTECTED_SPKR_CAL_MTP_MTPEX_MSK 0x2 - -#endif /* TFA9891_GENREGS_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_tfafieldnames.h deleted file mode 100644 index 01aa437007ca..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9891_tfafieldnames.h +++ /dev/null @@ -1,526 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/* - * tfa9891_tfafieldnames.h - * - * Created on: Jul 16, 2015 - * Author: wim - */ - -#ifndef TFA_INC_TFA9891_TFAFIELDNAMES_H_ -#define TFA_INC_TFA9891_TFAFIELDNAMES_H_ - -/** Filename: Tfa9891_TfaFieldnames.h - * This file was generated automatically on 07/16/15 at 15:00:02. - * Source file: TFA9891_I2C_list_V13.xls - */ - -#define TFA9891_I2CVERSION 13 - - -#define TFA9891_NAMETABLE static tfaBfName_t Tfa9891DatasheetNames[] = {\ - { 0x0, "VDDS"}, /* POR , */\ - { 0x10, "PLLS"}, /* PLL , */\ - { 0x20, "OTDS"}, /* OTP , */\ - { 0x30, "OVDS"}, /* OVP , */\ - { 0x40, "UVDS"}, /* UVP , */\ - { 0x50, "OCDS"}, /* OCP , */\ - { 0x60, "CLKS"}, /* Clocks , */\ - { 0x70, "CLIPS"}, /* CLIP , */\ - { 0x80, "MTPB"}, /* MTP , */\ - { 0x90, "DCCS"}, /* BOOST , */\ - { 0xa0, "SPKS"}, /* Speaker , */\ - { 0xb0, "ACS"}, /* cold start flag , */\ - { 0xc0, "SWS"}, /* flag engage , */\ - { 0xd0, "WDS"}, /* flag watchdog reset , */\ - { 0xe0, "AMPS"}, /* amplifier is enabled by manager , */\ - { 0xf0, "AREFS"}, /* references are enabled by manager , */\ - { 0x109, "BATS"}, /* Battery voltage readout; 0[V]..5.5[V] , */\ - { 0x208, "TEMPS"}, /* Temperature readout , */\ - { 0x307, "REV"}, /* Device Revision , */\ - { 0x402, "I2SF"}, /* I2SFormat data 1 input , */\ - { 0x431, "CHS12"}, /* ChannelSelection data1 input (In CoolFlux) , */\ - { 0x450, "CHS3"}, /* Channel Selection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ - { 0x461, "CHSA"}, /* Input selection for amplifier , */\ - { 0x481, "I2SDOC"}, /* Selection for I2S data out , */\ - { 0x4a0, "DISP"}, /* idp protection , */\ - { 0x4b0, "I2SDOE"}, /* Enable data output , */\ - { 0x4c3, "I2SSR"}, /* sample rate setting , */\ - { 0x501, "BSSCR"}, /* ProtectionAttackTime , */\ - { 0x523, "BSST"}, /* ProtectionThreshold , */\ - { 0x561, "BSSRL"}, /* ProtectionMaximumReduction , */\ - { 0x582, "BSSRR"}, /* Protection Release Timer , */\ - { 0x5b1, "BSSHY"}, /* ProtectionHysterese , */\ - { 0x5e0, "BSSR"}, /* battery voltage for I2C read out only , */\ - { 0x5f0, "BSSBY"}, /* bypass clipper battery protection , */\ - { 0x600, "DPSA"}, /* Enable dynamic powerstage activation , */\ - { 0x613, "AMPSL"}, /* control slope , */\ - { 0x650, "CFSM"}, /* Soft mute in CoolFlux , */\ - { 0x670, "BSSS"}, /* batsensesteepness , */\ - { 0x687, "VOL"}, /* volume control (in CoolFlux) , */\ - { 0x702, "DCVO"}, /* Boost voltage , */\ - { 0x732, "DCMCC"}, /* Max boost coil current , */\ - { 0x7a0, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7b0, "DCSR"}, /* Soft RampUp/Down mode for DCDC controller , */\ - { 0x800, "TROS"}, /* select external temperature also the ext_temp will be put on the temp read out , */\ - { 0x818, "EXTTS"}, /* external temperature setting to be given by host , */\ - { 0x900, "PWDN"}, /* ON/OFF , */\ - { 0x910, "I2CR"}, /* I2CReset , */\ - { 0x920, "CFE"}, /* EnableCoolFlux , */\ - { 0x930, "AMPE"}, /* EnableAmplifier , */\ - { 0x940, "DCA"}, /* EnableBoost , */\ - { 0x950, "SBSL"}, /* Coolflux configured , */\ - { 0x960, "AMPC"}, /* Selection on how AmplifierEnabling , */\ - { 0x970, "DCDIS"}, /* DCDC not connected , */\ - { 0x980, "PSDR"}, /* Iddq test amplifier , */\ - { 0x991, "DCCV"}, /* Coil Value , */\ - { 0x9b1, "CCFD"}, /* Selection CoolFluxClock , */\ - { 0x9d0, "ISEL"}, /* Interface Selection , */\ - { 0x9e0, "IPLL"}, /* selection input PLL for lock , */\ - { 0xa02, "DOLS"}, /* Output selection dataout left channel , */\ - { 0xa32, "DORS"}, /* Output selection dataout right channel , */\ - { 0xa62, "SPKL"}, /* Selection speaker induction , */\ - { 0xa91, "SPKR"}, /* Selection speaker impedance , */\ - { 0xab3, "DCFG"}, /* DCDC speaker current compensation gain , */\ - { 0xb07, "MTPK"}, /* MTP KEY2 register , */\ - { 0xf00, "VDDD"}, /* mask flag_por for interupt generation , */\ - { 0xf10, "OTDD"}, /* mask flag_otpok for interupt generation , */\ - { 0xf20, "OVDD"}, /* mask flag_ovpok for interupt generation , */\ - { 0xf30, "UVDD"}, /* mask flag_uvpok for interupt generation , */\ - { 0xf40, "OCDD"}, /* mask flag_ocp_alarm for interupt generation , */\ - { 0xf50, "CLKD"}, /* mask flag_clocks_stable for interupt generation , */\ - { 0xf60, "DCCD"}, /* mask flag_pwrokbst for interupt generation , */\ - { 0xf70, "SPKD"}, /* mask flag_cf_speakererror for interupt generation , */\ - { 0xf80, "WDD"}, /* mask flag_watchdog_reset for interupt generation , */\ - { 0xfe0, "INT"}, /* enabling interrupt , */\ - { 0xff0, "INTP"}, /* Setting polarity interupt , */\ - { 0x1000, "PDMSEL"}, /* Audio input interface mode , */\ - { 0x1010, "I2SMOUTEN"}, /* I2S Master enable (CLK and WS pads) , */\ - { 0x1021, "PDMORSEL"}, /* PDM Output right channel source selection , */\ - { 0x1041, "PDMOLSEL"}, /* PDM Output Left/Mono channel source selection , */\ - { 0x1061, "PADSEL"}, /* Output interface mode and ball selection , */\ - { 0x1100, "PDMOSDEN"}, /* Secure delay Cell , */\ - { 0x1110, "PDMOSDCF"}, /* Rising Falling Resync control Mux , */\ - { 0x1140, "SAAMEN"}, /* Speaker As a Mic feature ON/OFF , */\ - { 0x1150, "SAAMLPEN"}, /* speaker_as_mic low power mode (only in PDM_out mode), */\ - { 0x1160, "PDMOINTEN"}, /* PDM output interpolation ratio , */\ - { 0x1203, "PDMORG1"}, /* PDM Interpolator Right Channel DS4 G1 Gain Value , */\ - { 0x1243, "PDMORG2"}, /* PDM Interpolator Right Channel DS4 G2 Gain Value , */\ - { 0x1303, "PDMOLG1"}, /* PDM Interpolator Left Channel DS4 G1 Gain Value , */\ - { 0x1343, "PDMOLG2"}, /* PDM Interpolator Left Channel DS4 G2 Gain Value , */\ - { 0x2202, "SAAMGAIN"}, /* pga gain , */\ - { 0x2250, "SAAMPGACTRL"}, /* 0 = active input common mode voltage source at the attenuator/PGA level, */\ - { 0x2500, "PLLCCOSEL"}, /* pll cco frequency , */\ - { 0x4600, "CSBYPGC"}, /* bypass_gc, bypasses the CS gain correction , */\ - { 0x4900, "CLIP"}, /* Bypass clip control (function depending on digimux clip_x), */\ - { 0x4910, "CLIP2"}, /* Bypass clip control (function depending on digimux clip_x), */\ - { 0x62b0, "CIMTP"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ - { 0x7000, "RST"}, /* Reset CoolFlux DSP , */\ - { 0x7011, "DMEM"}, /* Target memory for access , */\ - { 0x7030, "AIF"}, /* Autoincrement-flag for memory-address , */\ - { 0x7040, "CFINT"}, /* Interrupt CoolFlux DSP , */\ - { 0x7087, "REQ"}, /* request for access (8 channels) , */\ - { 0x710f, "MADD"}, /* memory-address to be accessed , */\ - { 0x720f, "MEMA"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ - { 0x7307, "ERR"}, /* cf error Flags , */\ - { 0x7387, "ACK"}, /* acknowledge of requests (8 channels")" , */\ - { 0x8000, "MTPOTC"}, /* Calibration schedule (key2 protected) , */\ - { 0x8010, "MTPEX"}, /* (key2 protected) calibration of Ron has been executed, */\ - { 0x8045, "SWPROFIL" },\ - { 0x80a5, "SWVSTEP" },\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9891_BITNAMETABLE static tfaBfName_t Tfa9891BitNames[] = {\ - { 0x0, "POR"}, /* POR , */\ - { 0x10, "PLL_LOCK"}, /* PLL , */\ - { 0x20, "flag_otpok"}, /* OTP , */\ - { 0x30, "flag_ovpok"}, /* OVP , */\ - { 0x40, "flag_uvpok"}, /* UVP , */\ - { 0x50, "flag_OCP_alarm"}, /* OCP , */\ - { 0x60, "flag_clocks_stable"}, /* Clocks , */\ - { 0x70, "CLIP"}, /* CLIP , */\ - { 0x80, "mtp_busy"}, /* MTP , */\ - { 0x90, "flag_pwrokbst"}, /* BOOST , */\ - { 0xa0, "flag_cf_speakererror"}, /* Speaker , */\ - { 0xb0, "flag_cold_started"}, /* cold start flag , */\ - { 0xc0, "flag_engage"}, /* flag engage , */\ - { 0xd0, "flag_watchdog_reset"}, /* flag watchdog reset , */\ - { 0xe0, "flag_enbl_amp"}, /* amplifier is enabled by manager , */\ - { 0xf0, "flag_enbl_ref"}, /* references are enabled by manager , */\ - { 0x109, "bat_adc"}, /* Battery voltage readout; 0[V]..5.5[V] , */\ - { 0x208, "temp_adc"}, /* Temperature readout , */\ - { 0x307, "rev_reg"}, /* Device Revision , */\ - { 0x402, "i2s_seti"}, /* I2SFormat data 1 input , */\ - { 0x431, "chan_sel1"}, /* ChannelSelection data1 input (In CoolFlux) , */\ - { 0x450, "lr_sw_i2si2"}, /* Channel Selection data 2 input (coolflux input, the DCDC converter gets the other signal), */\ - { 0x461, "input_sel"}, /* Input selection for amplifier , */\ - { 0x481, "datao_sel"}, /* Selection for I2S data out , */\ - { 0x4a0, "disable_idp"}, /* idp protection , */\ - { 0x4b0, "enbl_datao"}, /* Enable data output , */\ - { 0x4c3, "i2s_fs"}, /* sample rate setting , */\ - { 0x501, "vbat_prot_attacktime"}, /* ProtectionAttackTime , */\ - { 0x523, "vbat_prot_thlevel"}, /* ProtectionThreshold , */\ - { 0x561, "vbat_prot_max_reduct"}, /* ProtectionMaximumReduction , */\ - { 0x582, "vbat_prot_release_t"}, /* Protection Release Timer , */\ - { 0x5b1, "vbat_prot_hysterese"}, /* ProtectionHysterese , */\ - { 0x5d0, "reset_min_vbat"}, /* reset clipper , */\ - { 0x5e0, "sel_vbat"}, /* battery voltage for I2C read out only , */\ - { 0x5f0, "bypass_clipper"}, /* bypass clipper battery protection , */\ - { 0x600, "dpsa"}, /* Enable dynamic powerstage activation , */\ - { 0x613, "ctrl_slope"}, /* control slope , */\ - { 0x650, "cf_mute"}, /* Soft mute in CoolFlux , */\ - { 0x660, "sel_other_vamp"}, /* Input selection for the second channel of the DCDC inteligent mode detector, */\ - { 0x670, "ctrl_batsensesteepness"}, /* batsensesteepness , */\ - { 0x687, "vol"}, /* volume control (in CoolFlux) , */\ - { 0x702, "ctrl_bstvolt"}, /* Boost voltage , */\ - { 0x732, "ctrl_bstcur"}, /* Max boost coil current , */\ - { 0x761, "ctrl_slopebst_1_0"}, /* Setting for the slope of the boost converter power stage, */\ - { 0x781, "ctrl_slopebst_3_2"}, /* Setting for the part of the power transistor voltage to be used in peak current mode control, */\ - { 0x7a0, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7b0, "boost_speed"}, /* Soft RampUp/Down mode for DCDC controller , */\ - { 0x7c1, "ctrl_delay_comp_dcdc"}, /* delay compensation in current patg compared to delay in the audio path (relative) , */\ - { 0x7e0, "boost_input"}, /* Selection intelligent boost detector input , */\ - { 0x7f0, "ctrl_supplysense"}, /* ADC10 input selection , */\ - { 0x800, "ext_temp_sel"}, /* select external temperature also the ext_temp will be put on the temp read out , */\ - { 0x818, "ext_temp"}, /* external temperature setting to be given by host , */\ - { 0x8a0, "ctrl_spk_coilpvp_bst"}, /* Peak voltage protection boost converter , */\ - { 0x8b2, "ctrl_dcdc_synchronisation"}, /* DCDC synchronisation off + 7 positions , */\ - { 0x8e0, "ctrl_cs_samplevalid"}, /* sample valid moment for CS in single sample moment mode, */\ - { 0x900, "PowerDown"}, /* ON/OFF , */\ - { 0x910, "reset"}, /* I2CReset , */\ - { 0x920, "enbl_coolflux"}, /* EnableCoolFlux , */\ - { 0x930, "enbl_amplifier"}, /* EnableAmplifier , */\ - { 0x940, "enbl_boost"}, /* EnableBoost , */\ - { 0x950, "cf_configured"}, /* Coolflux configured , */\ - { 0x960, "sel_enbl_amplifier"}, /* Selection on how AmplifierEnabling , */\ - { 0x970, "dcdcoff_mode"}, /* DCDC not connected , */\ - { 0x980, "cttr_iddqtest"}, /* Iddq test amplifier , */\ - { 0x991, "ctrl_coil_value"}, /* Coil Value , */\ - { 0x9b1, "ctrl_sel_cf_clock"}, /* Selection CoolFluxClock , */\ - { 0x9d0, "intf_sel"}, /* Interface Selection , */\ - { 0x9e0, "sel_ws_bck"}, /* selection input PLL for lock , */\ - { 0xa02, "sel_i2so_l"}, /* Output selection dataout left channel , */\ - { 0xa32, "sel_i2so_r"}, /* Output selection dataout right channel , */\ - { 0xa62, "ctrl_spkr_coil"}, /* Selection speaker induction , */\ - { 0xa91, "ctrl_spr_res"}, /* Selection speaker impedance , */\ - { 0xab3, "ctrl_dcdc_spkr_i_comp_gain"}, /* DCDC speaker current compensation gain , */\ - { 0xaf0, "ctrl_dcdc_spkr_i_comp_sign"}, /* DCDC speaker current compensation sign , */\ - { 0xb07, "MTP_key2"}, /* MTP KEY2 register , */\ - { 0xc0c, "clk_sync_delay"}, /* Delay count for clock synchronisation , */\ - { 0xcf0, "enbl_clk_sync"}, /* Enable CGU clock synchronisation , */\ - { 0xd0c, "adc_sync_delay"}, /* Delay count for ADC synchronisation , */\ - { 0xdf0, "enable_adc_sync"}, /* Enable ADC synchronisation , */\ - { 0xe00, "bypass_dcdc_curr_prot"}, /* to switch off dcdc reduction with bat prot , */\ - { 0xe24, "ctrl_digtoana6_2"}, /* for extra connections digital to analog , */\ - { 0xe70, "switch_on_icomp"}, /* icomp dem switch , */\ - { 0xe87, "reserve_reg_1_7_0"}, /* reserved , */\ - { 0xf00, "flag_por_mask"}, /* mask flag_por for interupt generation , */\ - { 0xf10, "flag_otpok_mask"}, /* mask flag_otpok for interupt generation , */\ - { 0xf20, "flag_ovpok_mask"}, /* mask flag_ovpok for interupt generation , */\ - { 0xf30, "flag_uvpok_mask"}, /* mask flag_uvpok for interupt generation , */\ - { 0xf40, "flag_ocp_alarm_mask"}, /* mask flag_ocp_alarm for interupt generation , */\ - { 0xf50, "flag_clocks_stable_mask"}, /* mask flag_clocks_stable for interupt generation , */\ - { 0xf60, "flag_pwrokbst_mask"}, /* mask flag_pwrokbst for interupt generation , */\ - { 0xf70, "flag_cf_speakererror_mask"}, /* mask flag_cf_speakererror for interupt generation , */\ - { 0xf80, "flag_watchdog_reset_mask"}, /* mask flag_watchdog_reset for interupt generation , */\ - { 0xf90, "flag_lost_clk_mask"}, /* mask flag_lost_clk for interupt generation , */\ - { 0xfe0, "enable_interrupt"}, /* enabling interrupt , */\ - { 0xff0, "invert_int_polarity"}, /* Setting polarity interupt , */\ - { 0x1000, "pdm_i2s_input"}, /* Audio input interface mode , */\ - { 0x1010, "I2S_master_ena"}, /* I2S Master enable (CLK and WS pads) , */\ - { 0x1021, "pdm_out_sel_r"}, /* PDM Output right channel source selection , */\ - { 0x1041, "pdm_out_sel_l"}, /* PDM Output Left/Mono channel source selection , */\ - { 0x1061, "micdat_out_sel"}, /* Output interface mode and ball selection , */\ - { 0x1100, "secure_dly"}, /* Secure delay Cell , */\ - { 0x1110, "d_out_valid_rf_mux"}, /* Rising Falling Resync control Mux , */\ - { 0x1140, "Speak_As_Mic_en"}, /* Speaker As a Mic feature ON/OFF , */\ - { 0x1150, "speak_as_mic_lp_mode"}, /* speaker_as_mic low power mode (only in PDM_out mode), */\ - { 0x1160, "pdm_out_rate"}, /* PDM output interpolation ratio , */\ - { 0x1203, "ds4_g1_r"}, /* PDM Interpolator Right Channel DS4 G1 Gain Value , */\ - { 0x1243, "ds4_g2_r"}, /* PDM Interpolator Right Channel DS4 G2 Gain Value , */\ - { 0x1303, "ds4_g1_l"}, /* PDM Interpolator Left Channel DS4 G1 Gain Value , */\ - { 0x1343, "ds4_g2_l"}, /* PDM Interpolator Left Channel DS4 G2 Gain Value , */\ - { 0x1400, "clk_secure_dly"}, /* Secure delay Cell on clock path , */\ - { 0x1410, "data_secure_dly"}, /* Secure delay Cell enable on PDM data path , */\ - { 0x2202, "Ctrl_saam_pga_gain"}, /* pga gain , */\ - { 0x2250, "ctrl_saam_pga_src"}, /* 0 = active input common mode voltage source at the attenuator/PGA level, */\ - { 0x2300, "flag_saam_spare"}, /* spare flag , */\ - { 0x2400, "ctrl_saam_pga_tm"}, /* enables PGA test mode , */\ - { 0x2500, "pll_fcco"}, /* pll cco frequency , */\ - { 0x3000, "flag_hi_small"}, /* positive small window dcdc converter , */\ - { 0x3010, "flag_hi_large"}, /* positive large window dcdc converter , */\ - { 0x3020, "flag_lo_small"}, /* negative small window dcdc converter , */\ - { 0x3030, "flag_lo_large"}, /* negative large window dcdc converter , */\ - { 0x3040, "flag_voutcomp"}, /* flag_voutcomp, indication Vset is larger than Vbat, */\ - { 0x3050, "flag_voutcomp93"}, /* flag_voutcomp93, indication Vset is larger than 1.07* Vbat , */\ - { 0x3060, "flag_voutcomp86"}, /* flag_voutcomp86, indication Vset is larger than 1.14* Vbat , */\ - { 0x3070, "flag_hiz"}, /* flag_hiz, indication Vbst is larger than Vbat , */\ - { 0x3080, "flag_hi_peak"}, /* flag_hi_peak, indication hi_peak , */\ - { 0x3090, "flag_ocpokbst"}, /* flag_ocpokbst, indication no over current in boost converter pmos switch, */\ - { 0x30a0, "flag_peakcur"}, /* flag_peakcur, indication current is max in dcdc converter, */\ - { 0x30b0, "flag_ocpokap"}, /* flag_ocpokap, indication no over current in amplifier "a" pmos output stage, */\ - { 0x30c0, "flag_ocpokan"}, /* flag_ocpokan, indication no over current in amplifier "a" nmos output stage, */\ - { 0x30d0, "flag_ocpokbp"}, /* flag_ocpokbp, indication no over current in amplifier "b" pmos output stage, */\ - { 0x30e0, "flag_ocpokbn"}, /* flag_ocpokbn, indication no over current in amplifier"b" nmos output stage, */\ - { 0x30f0, "lost_clk"}, /* lost_clk, lost clock indication CGU , */\ - { 0x310f, "mtp_man_data_out"}, /* single word read from MTP (manual copy) , */\ - { 0x3200, "key01_locked"}, /* key01_locked, indication key 1 is locked , */\ - { 0x3210, "key02_locked"}, /* key02_locked, indication key 2 is locked , */\ - { 0x3225, "mtp_ecc_tcout"}, /* mtp_ecc_tcout , */\ - { 0x3280, "mtpctrl_valid_test_rd"}, /* mtp test readout for read , */\ - { 0x3290, "mtpctrl_valid_test_wr"}, /* mtp test readout for write , */\ - { 0x32a0, "flag_in_alarm_state"}, /* alarm state , */\ - { 0x32b0, "mtp_ecc_err2"}, /* two or more bit errors detected in MTP, can not reconstruct value, */\ - { 0x32c0, "mtp_ecc_err1"}, /* one bit error detected in MTP, reconstructed value, */\ - { 0x32d0, "mtp_mtp_hvf"}, /* high voltage ready flag for MTP , */\ - { 0x32f0, "mtp_zero_check_fail"}, /* zero check failed (tbd) for MTP , */\ - { 0x3300, "flag_adc10_ready"}, /* flag_adc10_ready, indication adc10 is ready , */\ - { 0x3310, "flag_clipa_high"}, /* flag_clipa_high, indication pmos amplifier "a" is clipping, */\ - { 0x3320, "flag_clipa_low"}, /* flag_clipa_low, indication nmos amplifier "a" is clipping, */\ - { 0x3330, "flag_clipb_high"}, /* flag_clipb_high, indication pmos amplifier "b" is clipping, */\ - { 0x3340, "flag_clipb_low"}, /* flag_clipb_low, indication nmos amplifier "b" is clipping, */\ - { 0x3359, "data_adc10_tempbat"}, /* adc 10 data output for testing , */\ - { 0x33f0, "flag_vddd_comp_nok"}, /* power switch flag 2 for testing , */\ - { 0x400f, "hid_code"}, /* hidden code , */\ - { 0x4100, "bypass_hp"}, /* Bypass_High Pass Filter , */\ - { 0x4110, "hard_mute"}, /* Hard Mute , */\ - { 0x4120, "soft_mute"}, /* Soft Mute , */\ - { 0x4134, "PWM_Delay"}, /* PWM DelayBits to set the delay , */\ - { 0x4180, "PWM_Shape"}, /* PWM Shape , */\ - { 0x4190, "PWM_BitLength"}, /* PWM Bitlength in noise shaper , */\ - { 0x4207, "ctrl_drive"}, /* drive bits to select amount of power stages amplifier, */\ - { 0x4281, "dpsalevel"}, /* DPSA Threshold level , */\ - { 0x42a1, "dpsa_release"}, /* DPSA Release time , */\ - { 0x42c0, "ctrl_coincidence"}, /* Prevent simultaneously switching of output stage , */\ - { 0x42d0, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x42e0, "ctrl_test_sdeltaoffset"}, /* ctrl_test_sdeltaoffset , */\ - { 0x42f0, "ctrl_test_sdeltaclk"}, /* ctrl_test_sdeltaclk , */\ - { 0x4309, "ctrl_drivebst"}, /* Drive bits to select the powertransistor sections boost converter, */\ - { 0x43a0, "ctrl_ocptestbst"}, /* Boost OCP. , */\ - { 0x43c0, "enbl_hi_peak"}, /* enable for high peak comparator , */\ - { 0x43d0, "test_abistfft_enbl"}, /* FFT coolflux , */\ - { 0x43e0, "ctrl_sensetest_amp"}, /* sensetest amplifier , */\ - { 0x43f0, "test_bcontrol"}, /* test _bcontrol , */\ - { 0x4400, "ctrl_reversebst"}, /* OverCurrent Protection selection of power stage boost converter, */\ - { 0x4410, "ctrl_sensetest"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0x4420, "enbl_engagebst"}, /* Enable power stage dcdc controller , */\ - { 0x4430, "enbl_hi_small"}, /* Enable bit of hi (small) comparator , */\ - { 0x4440, "enbl_hi_large"}, /* Enable bit of hi (large) comparator , */\ - { 0x4450, "enbl_lo_small"}, /* Enable bit of lo (small) comparator , */\ - { 0x4460, "enbl_lo_large"}, /* Enable bit of lo (large) comparator , */\ - { 0x4470, "enbl_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x4480, "enbl_voutcomp"}, /* Enable vout comparators , */\ - { 0x4490, "enbl_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x44a0, "enbl_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x44b0, "enbl_hizcom"}, /* Enable hiz comparator , */\ - { 0x44c0, "enbl_pcdac"}, /* Enable peak current dac , */\ - { 0x44d0, "enbl_pccomp"}, /* Enable peak current comparator , */\ - { 0x44e0, "enbl_windac"}, /* Enable window dac , */\ - { 0x44f0, "enbl_powerbst"}, /* Enable line of the powerstage , */\ - { 0x4507, "ocp_thr"}, /* ocp_thr threshold level for OCP , */\ - { 0x4580, "bypass_glitchfilter"}, /* Bypass glitchfilter , */\ - { 0x4590, "bypass_ovp"}, /* Bypass OVP , */\ - { 0x45a0, "bypass_uvp"}, /* Bypass UVP , */\ - { 0x45b0, "bypass_otp"}, /* Bypass OTP , */\ - { 0x45c0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0x45d0, "bypass_ocpcounter"}, /* BypassOCPCounter , */\ - { 0x45e0, "bypass_lost_clk"}, /* Bypasslost_clk detector , */\ - { 0x45f0, "vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0x4600, "bypass_gc"}, /* bypass_gc, bypasses the CS gain correction , */\ - { 0x4610, "cs_gain_control"}, /* gain control by means of MTP or i2c , */\ - { 0x4627, "cs_gain"}, /* + / - 128 steps in steps of 1/4 % 2's compliment , */\ - { 0x46a0, "bypass_lp"}, /* bypass Low-Pass filter in temperature sensor , */\ - { 0x46b0, "bypass_pwmcounter"}, /* bypass_pwmcounter , */\ - { 0x46c0, "ctrl_cs_negfixed"}, /* does not switch to neg , */\ - { 0x46d2, "ctrl_cs_neghyst"}, /* switches to neg depending on level , */\ - { 0x4700, "switch_fb"}, /* switch_fb , */\ - { 0x4713, "se_hyst"}, /* se_hyst , */\ - { 0x4754, "se_level"}, /* se_level , */\ - { 0x47a5, "ktemp"}, /* temperature compensation trimming , */\ - { 0x4800, "ctrl_negin"}, /* negin , */\ - { 0x4810, "ctrl_cs_sein"}, /* cs_sein , */\ - { 0x4820, "ctrl_coincidencecs"}, /* Coincidence current sense , */\ - { 0x4830, "ctrl_iddqtestbst"}, /* for iddq testing in powerstage of boost convertor , */\ - { 0x4840, "ctrl_coincidencebst"}, /* Switch protection on to prevent simultaniously switching power stages bst and amp, */\ - { 0x4851, "clock_sh_sel"}, /* Clock SH selection , */\ - { 0x4876, "delay_se_neg"}, /* delay of se and neg , */\ - { 0x48e1, "ctrl_cs_ttrack"}, /* sample & hold track time , */\ - { 0x4900, "ctrl_bypassclip"}, /* Bypass clip control (function depending on digimux clip_x), */\ - { 0x4910, "ctrl_bypassclip2"}, /* Bypass clip control (function depending on digimux clip_x), */\ - { 0x4920, "ctrl_clkgateCFoff"}, /* to disable clock gating in the coolflux , */\ - { 0x4930, "ctrl_testabst"}, /* testabst , */\ - { 0x4940, "ctrl_clipfast"}, /* clock switch for battery protection clipper, it switches back to old frequency, */\ - { 0x4950, "ctrl_cs_8ohm"}, /* 8 ohm mode for current sense (gain mode) , */\ - { 0x4960, "reserved"}, /* reserved , */\ - { 0x4974, "delay_clock_sh"}, /* delay_sh, tunes S7H delay , */\ - { 0x49c0, "inv_clksh"}, /* Invert the sample/hold clock for current sense ADC, */\ - { 0x49d0, "inv_neg"}, /* Invert neg signal , */\ - { 0x49e0, "inv_se"}, /* Invert se signal , */\ - { 0x49f0, "setse"}, /* switches between Single Ende and differentail mode, */\ - { 0x4a12, "ctrl_adc10_sel"}, /* select the input to convert the 10b ADC , */\ - { 0x4a60, "ctrl_adc10_reset"}, /* Global asynchronous reset (active HIGH) 10 bit ADC, */\ - { 0x4a81, "ctrl_adc10_test"}, /* Test mode selection signal 10 bit ADC , */\ - { 0x4aa0, "ctrl_bypass_lp_vbat"}, /* lp filter in batt sensor , */\ - { 0x4ae0, "ctrl_dc_offset"}, /* switch offset control on/off, is decimator offset control, */\ - { 0x4af0, "ctrl_tsense_hibias"}, /* bit to set the biasing in temp sensor to high , */\ - { 0x4b00, "ctrl_adc13_iset"}, /* Micadc Setting of current consumption. Debug use only, */\ - { 0x4b14, "ctrl_adc13_gain"}, /* Micadc gain setting (2-compl) , */\ - { 0x4b61, "ctrl_adc13_slowdel"}, /* Micadc Delay setting for internal clock. Debug use only, */\ - { 0x4b83, "ctrl_adc13_offset"}, /* Micadc ADC offset setting , */\ - { 0x4bc0, "ctrl_adc13_bsoinv"}, /* Micadc bit stream output invert mode for test , */\ - { 0x4bd0, "ctrl_adc13_resonator_enable"}, /* Micadc Give extra SNR with less stability. Debug use only, */\ - { 0x4be0, "ctrl_testmicadc"}, /* Mux at input of MICADC for test purpose , */\ - { 0x4c0f, "ctrl_offset"}, /* offset control for ABIST testing , */\ - { 0x4d05, "ctrl_windac"}, /* for testing direct control windac , */\ - { 0x4d65, "ctrl_peakcur"}, /* Control peakcur , */\ - { 0x4dc3, "pwm_dcc_cnt"}, /* control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0x4e04, "ctrl_slopecur"}, /* for testing direct control slopecur , */\ - { 0x4e53, "ctrl_dem"}, /* dyn element matching control, rest of codes are optional, */\ - { 0x4e93, "ctrl_demmismatch"}, /* dyn element matching add offset , */\ - { 0x4ed0, "enbl_pwm_dcc"}, /* to enable direct control of pwm duty cycle , */\ - { 0x5007, "gain"}, /* gain setting of the gain multiplier gain need to increase with factor 1.41 (3dB), */\ - { 0x5081, "ctrl_sourceb"}, /* Set OUTB to , */\ - { 0x50a1, "ctrl_sourcea"}, /* Set OUTA to , */\ - { 0x50c1, "ctrl_sourcebst"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0x50e1, "ctrl_test_mono"}, /* ABIST mode to add both amplifier halfs as stereo or one amplifier half as mono, */\ - { 0x5104, "pulselengthbst"}, /* pulselength setting test input for boost converter , */\ - { 0x5150, "ctrl_bypasslatchbst"}, /* bypass_latch in boost converter , */\ - { 0x5160, "invertbst"}, /* invert pwmbst test signal , */\ - { 0x5174, "pulselength"}, /* pulselength setting test input for amplifier , */\ - { 0x51c0, "ctrl_bypasslatch"}, /* bypass_latch in boost convert , */\ - { 0x51d0, "invertb"}, /* invert pwmb test signal , */\ - { 0x51e0, "inverta"}, /* invert pwma test signal , */\ - { 0x51f0, "ctrl_bypass_ctrlloop"}, /* bypass_ctrlloop bypasses the control loop of the amplifier, */\ - { 0x5200, "ctrl_test_discrete"}, /* tbd for rdson testing , */\ - { 0x5210, "ctrl_test_rdsona"}, /* tbd for rdson testing , */\ - { 0x5220, "ctrl_test_rdsonb"}, /* tbd for rdson testing , */\ - { 0x5230, "ctrl_test_rdsonbst"}, /* tbd for rdson testing , */\ - { 0x5240, "ctrl_test_cvia"}, /* tbd for rdson testing , */\ - { 0x5250, "ctrl_test_cvib"}, /* tbd for rdson testing , */\ - { 0x5260, "ctrl_test_cvibst"}, /* tbd for rdson testing , */\ - { 0x5290, "test_bypass_pwmdiscretea"}, /* for testing ( ABIST) , */\ - { 0x52a0, "test_bypass_pwmdiscreteb"}, /* for testing ( ABIST) , */\ - { 0x52b0, "ctrl_clipc_forcehigh"}, /* test signal for clipcontrol , */\ - { 0x52c0, "ctrl_clipc_forcelow"}, /* test signal for clipcontrol , */\ - { 0x52d0, "ctrl_test_sdelta"}, /* for testing ( ABIST) , */\ - { 0x52e0, "ctrl_test_swhvp"}, /* for testing ( ABIST) , */\ - { 0x52f0, "test_gain_reduction"}, /* test gain reduction , */\ - { 0x5303, "ctrl_digimux_out_test1"}, /* Digimux TEST1 out , */\ - { 0x5343, "ctrl_digimux_out_test2"}, /* Digimux TEST2 out. output flag_clipa_low depending on cntr_bypassclip setting, */\ - { 0x5383, "ctrl_digimux_out_data1"}, /* Digimux DATA1 out (output flag_clipb_high depending on cntr_bypassclip setting), */\ - { 0x53c3, "ctrl_digimux_out_data3"}, /* Digimux DATA3 out (output flag_clipx_x depending on cntr_bypassclip setting), */\ - { 0x5400, "hs_mode"}, /* hs_mode, high speed mode I2C bus , */\ - { 0x5412, "test_parametric_io"}, /* test_parametric_io for testing pads , */\ - { 0x5440, "enbl_ringo"}, /* enbl_ringo, for test purpose to check with ringo , */\ - { 0x5480, "ctrl_cliplevel"}, /* Clip level , */\ - { 0x5491, "ctrl_anamux_sel"}, /* anamux selection , */\ - { 0x54b0, "test_vdddsw_dio"}, /* to overrule the power switches for memory , */\ - { 0x54c0, "ctrl_bypass_diosw_ovp"}, /* To disable the overvoltage protection of vddd_dio_sw, */\ - { 0x54d0, "test_vddd_sw"}, /* test vdd sw , */\ - { 0x54e0, "test_vddd_sw_comp"}, /* test vdd sw comp , */\ - { 0x550e, "enbl_amp"}, /* enbl_amp for testing to enable all analoge blocks in amplifier, */\ - { 0x55f0, "fr_fsp"}, /* extr free running clock mode for testing , */\ - { 0x5600, "use_direct_ctrls"}, /* use_direct_ctrls, to overrule several functions direct for testing, */\ - { 0x5610, "rst_datapath"}, /* rst_datapath, datapath reset , */\ - { 0x5620, "rst_cgu"}, /* rst_cgu, cgu reset , */\ - { 0x5637, "enbl_ref"}, /* for testing to enable all analoge blocks in references, */\ - { 0x56b0, "enbl_engage"}, /* Enable output stage amplifier , */\ - { 0x56c0, "use_direct_clk_ctrl"}, /* use_direct_clk_ctrl, to overrule several functions direct for testing, */\ - { 0x56d0, "use_direct_pll_ctrl"}, /* use_direct_pll_ctrl, to overrule several functions direct for test, */\ - { 0x56e0, "use_direct_ctrls_2"}, /* use_direct_sourseamp_ctrls, to overrule several functions direct for testing, */\ - { 0x5707, "ctrl_anamux_out_test1"}, /* Anamux control , */\ - { 0x5782, "ctrl_zero"}, /* Bandwith control feedbackloop , */\ - { 0x57b0, "enbl_ldo_stress"}, /* LDO stress function frinch capacitors , */\ - { 0x57c0, "ctrl_ocptest"}, /* ctrl_ocptest, deactivates the over current protection in the power stages of the amplifier. The ocp flag signals stay active., */\ - { 0x57e0, "ctrl_otptest"}, /* otptest, test mode otp amplifier , */\ - { 0x57f0, "ctrl_reverse"}, /* CTRL revers , */\ - { 0x5802, "pll_mdec_msb"}, /* most significant bits pll_mdec , */\ - { 0x5833, "pll_selr"}, /* pll_selr , */\ - { 0x5874, "pll_selp"}, /* pll_selp , */\ - { 0x58c3, "pll_seli"}, /* pll_seli , */\ - { 0x5900, "pll_psel"}, /* pll_psel , */\ - { 0x5910, "use_direct_pll_psel"}, /* use_direct_pll_psel , */\ - { 0x5923, "nbck"}, /* NBCK , */\ - { 0x5960, "auto_nbck"}, /* AUTO_NBCK , */\ - { 0x5970, "pll_frm"}, /* pll_frm , */\ - { 0x5980, "pll_directi"}, /* pll_directi , */\ - { 0x5990, "pll_directo"}, /* pll_directo , */\ - { 0x59a0, "enbl_PLL"}, /* enbl_PLL , */\ - { 0x59b0, "sel_clkout"}, /* SEL_CLKOUT , */\ - { 0x59e0, "fr_lost_clk"}, /* fr_lost_clk , */\ - { 0x59f0, "pll_bypass"}, /* pll_bypass , */\ - { 0x5a0f, "tsig_freq"}, /* tsig_freq, internal sinus test generator, frequency control, */\ - { 0x5b02, "tsig_freq_msb"}, /* select internal sinus test generator, frequency control msb bits, */\ - { 0x5b30, "inject_tsig"}, /* inject_tsig, control bit to switch to internal sinus test generator, */\ - { 0x5b44, "ctrl_adc10_prog_sample"}, /* control ADC10 , */\ - { 0x5c01, "pll_ndec_msb"}, /* most significant bits of pll_ndec , */\ - { 0x5c2d, "pll_mdec"}, /* bits 13..0 of pll_mdec , */\ - { 0x5d06, "pll_pdec"}, /* pll_pdec , */\ - { 0x5d87, "pll_ndec"}, /* bits 7..0 of pll_ndec , */\ - { 0x5e00, "pdm_ch_sel_reg"}, /* PDM channel selection , */\ - { 0x5e10, "pdm_iis_rst_reg"}, /* PDM Interface reset , */\ - { 0x5e20, "clk_src_sel_reg"}, /* WS Source Selection , */\ - { 0x5e70, "pdm_resync_bypass"}, /* PDM resynchronization bypass , */\ - { 0x6007, "MTP_key1"}, /* MTP Key1 , */\ - { 0x6185, "mtp_ecc_tcin"}, /* Mtp_ecc_tcin , */\ - { 0x6203, "mtp_man_address_in"}, /* address from i2cregs for writing one word single mtp, */\ - { 0x6260, "mtp_ecc_eeb"}, /* enable code bit generation (active low!) , */\ - { 0x6270, "mtp_ecc_ecb"}, /* enable correction signal (active low!) , */\ - { 0x6280, "man_copy_mtp_to_iic"}, /* start copying single word from mtp to i2cregs_mtp , */\ - { 0x6290, "man_copy_iic_to_mtp"}, /* start copying single word from i2cregs_mtp to mtp [Key 1 protected], */\ - { 0x62a0, "auto_copy_mtp_to_iic"}, /* start copying all the data from mtp to i2cregs_mtp, */\ - { 0x62b0, "auto_copy_iic_to_mtp"}, /* start copying all the data from i2cregs_mtp to mtp [Key 2 protected], */\ - { 0x62d2, "mtp_speed_mode"}, /* Speed mode , */\ - { 0x6340, "mtp_dircet_enable"}, /* mtp_direct_enable (key1 protected) , */\ - { 0x6350, "mtp_direct_wr"}, /* mtp_direct_wr (key1 protected) direct value for mtp pin wr. To be enabled via iic2mtp_mtp_direct_enable, */\ - { 0x6360, "mtp_direct_rd"}, /* mtp_direct_rd (key1 protected) direct value for mtp pin rd. To be enabled via iic2mtp_mtp_direct_enable, */\ - { 0x6370, "mtp_direct_rst"}, /* mtp_direct_rst (key1 protected) direct value for mtp pin rst. To be enabled via iic2mtp_mtp_direct_enable, */\ - { 0x6380, "mtp_direct_ers"}, /* mtp_direct_ers (key1 protected) direct value for mtp pin ers. To be enabled via iic2mtp_mtp_direct_enable, */\ - { 0x6390, "mtp_direct_prg"}, /* mtp_direct_prg (key1 protected) direct value for mtp pin prg. To be enabled via iic2mtp_mtp_direct_enable, */\ - { 0x63a0, "mtp_direct_epp"}, /* mtp_direct_epp (key1 protected) direct value for mtp pin epp. To be enabled via iic2mtp_mtp_direct_enable, */\ - { 0x63b4, "mtp_direct_test"}, /* mtp_direct_test (key1 protected) , */\ - { 0x640f, "mtp_man_data_in"}, /* single wordt be written to MTP (manual copy) , */\ - { 0x7000, "cf_rst_dsp"}, /* Reset CoolFlux DSP , */\ - { 0x7011, "cf_dmem"}, /* Target memory for access , */\ - { 0x7030, "cf_aif"}, /* Autoincrement-flag for memory-address , */\ - { 0x7040, "cf_int"}, /* Interrupt CoolFlux DSP , */\ - { 0x7087, "cf_req"}, /* request for access (8 channels) , */\ - { 0x710f, "cf_madd"}, /* memory-address to be accessed , */\ - { 0x720f, "cf_mema"}, /* activate memory access (24- or 32-bits data is written/read to/from memory, */\ - { 0x7307, "cf_err"}, /* cf error Flags , */\ - { 0x7387, "cf_ack"}, /* acknowledge of requests (8 channels")" , */\ - { 0x8000, "calibration_onetime"}, /* Calibration schedule (key2 protected) , */\ - { 0x8010, "calibr_ron_done"}, /* (key2 protected) calibration of Ron has been executed, */\ - { 0x8105, "calibr_vout_offset"}, /* calibr_vout_offset (DCDCoffset) 2's compliment (key1 protected), */\ - { 0x8163, "calibr_delta_gain"}, /* delta gain for vamp (alpha) 2's compliment (key1 protected), */\ - { 0x81a5, "calibr_offs_amp"}, /* offset for vamp (Ampoffset) 2's compliment (key1 protected), */\ - { 0x8207, "calibr_gain_cs"}, /* gain current sense (Imeasalpha) 2's compliment (key1 protected), */\ - { 0x8284, "calibr_temp_offset"}, /* temperature offset 2's compliment (key1 protected), */\ - { 0x82d2, "calibr_temp_gain"}, /* temperature gain 2's compliment (key1 protected) , */\ - { 0x830f, "calibr_ron"}, /* Ron resistance of coil (key1 protected) , */\ - { 0x8406, "ctrl_offset_a"}, /* Offset of amplifier level shifter , */\ - { 0x8486, "ctrl_offset_b"}, /* Offset of amplifier level shifter , */\ - { 0x850f, "type_bits_HW"}, /* HW Bits , */\ - { 0x860f, "type_bits1_SW"}, /* MTP-control SW1 , */\ - { 0x870f, "type_bits2_SW"}, /* MTP-control SW2 , */\ - { 0x8a0f, "production_data1"}, /* (key1 protected) , */\ - { 0x8b0f, "production_data2"}, /* (key1 protected) , */\ - { 0x8c0f, "production_data3"}, /* (key1 protected) , */\ - { 0x8d0f, "production_data4"}, /* (key1 protected) , */\ - { 0x8e0f, "production_data5"}, /* (key1 protected) , */\ - { 0x8f0f, "production_data6"}, /* (key1 protected) , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - - -#endif /* TFA_INC_TFA9891_TFAFIELDNAMES_H_ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames.h deleted file mode 100644 index 69a60edeb261..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames.h +++ /dev/null @@ -1,1079 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9894_tfaFieldnames_N1Last.h - * This file was generated automatically on 09/28/18 at 11:24:56. - * Source file: TFA9894_N1A1_I2C_RegisterMap.xlsx - */ - -#ifndef _TFA9894_TFAFIELDNAMES_H -#define _TFA9894_TFAFIELDNAMES_H - - -#define TFA9894_I2CVERSION 17.0 - -typedef enum Tfa9894BfEnumList { - TFA9894_BF_PWDN = 0x0000, /*!< Powerdown control */ - TFA9894_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ - TFA9894_BF_CFE = 0x0020, /*!< Enable CoolFlux DSP */ - TFA9894_BF_AMPE = 0x0030, /*!< Enable Amplifier */ - TFA9894_BF_DCA = 0x0040, /*!< Enable DCDC Boost converter */ - TFA9894_BF_SBSL = 0x0050, /*!< Coolflux configured */ - TFA9894_BF_AMPC = 0x0060, /*!< CoolFlux control over amplifier */ - TFA9894_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9894_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ - TFA9894_BF_BYPOCP = 0x00a0, /*!< Bypass OCP */ - TFA9894_BF_TSTOCP = 0x00b0, /*!< OCP testing control */ - TFA9894_BF_BSSS = 0x00c0, /*!< Vbat protection steepness */ - TFA9894_BF_HPFBYP = 0x00d0, /*!< Bypass High Pass Filter */ - TFA9894_BF_DPSA = 0x00e0, /*!< Enable DPSA */ - TFA9894_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ - TFA9894_BF_MANSCONF = 0x0120, /*!< Device I2C settings configured */ - TFA9894_BF_MANCOLD = 0x0130, /*!< Execute cold start */ - TFA9894_BF_MANROBOD = 0x0140, /*!< Reaction on BOD */ - TFA9894_BF_BODE = 0x0150, /*!< Enable BOD (only in direct control mode) */ - TFA9894_BF_BODHYS = 0x0160, /*!< Enable Hysteresis of BOD */ - TFA9894_BF_BODFILT = 0x0171, /*!< BOD filter */ - TFA9894_BF_BODTHLVL = 0x0191, /*!< BOD threshold */ - TFA9894_BF_MUTETO = 0x01b0, /*!< Time out SB mute sequence */ - TFA9894_BF_MANWDE = 0x01c0, /*!< Watchdog enable */ - TFA9894_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ - TFA9894_BF_FAIMVBGOVRRL = 0x01f0, /*!< Overrule the enabling of VBG for faim erase/write access */ - TFA9894_BF_AUDFS = 0x0203, /*!< Audio sample rate Fs */ - TFA9894_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9894_BF_FRACTDEL = 0x0255, /*!< Current sense fractional delay */ - TFA9894_BF_TDMPRES = 0x02b1, /*!< Control for HW manager */ - TFA9894_BF_AMPOCRT = 0x02d2, /*!< Amplifier on-off criteria for shutdown */ - TFA9894_BF_REV = 0x030f, /*!< Revision info */ - TFA9894_BF_REFCKEXT = 0x0401, /*!< PLL external reference clock */ - TFA9894_BF_REFCKSEL = 0x0420, /*!< PLL internal reference clock */ - TFA9894_BF_MCLKSEL = 0x0432, /*!< Master Clock Selection */ - TFA9894_BF_MANAOOSC = 0x0460, /*!< Internal OSC1M off at PWDN */ - TFA9894_BF_ACKCLDDIS = 0x0470, /*!< Automatic PLL reference clock selection for cold start */ - TFA9894_BF_SPKSSEN = 0x0510, /*!< Enable speaker sub-system */ - TFA9894_BF_MTPSSEN = 0x0520, /*!< Enable FAIM sub-system */ - TFA9894_BF_WDTCLKEN = 0x0530, /*!< Enable Coolflux watchdog clock */ - TFA9894_BF_VDDS = 0x1000, /*!< POR */ - TFA9894_BF_PLLS = 0x1010, /*!< PLL Lock */ - TFA9894_BF_OTDS = 0x1020, /*!< OTP alarm */ - TFA9894_BF_OVDS = 0x1030, /*!< OVP alarm */ - TFA9894_BF_UVDS = 0x1040, /*!< UVP alarm */ - TFA9894_BF_OCDS = 0x1050, /*!< OCP amplifier (sticky register, clear on read) */ - TFA9894_BF_CLKS = 0x1060, /*!< Clocks stable */ - TFA9894_BF_MTPB = 0x1070, /*!< MTP busy */ - TFA9894_BF_NOCLK = 0x1080, /*!< Lost clock */ - TFA9894_BF_ACS = 0x1090, /*!< Cold Start */ - TFA9894_BF_WDS = 0x10a0, /*!< Watchdog */ - TFA9894_BF_SWS = 0x10b0, /*!< Amplifier engage */ - TFA9894_BF_AMPS = 0x10c0, /*!< Amplifier enable */ - TFA9894_BF_AREFS = 0x10d0, /*!< References enable */ - TFA9894_BF_ADCCR = 0x10e0, /*!< Control ADC */ - TFA9894_BF_BODNOK = 0x10f0, /*!< BOD Flag - VDD NOT OK */ - TFA9894_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9894_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ - TFA9894_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos (sticky register, clear on read) */ - TFA9894_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ - TFA9894_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ - TFA9894_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ - TFA9894_BF_SPKS = 0x1170, /*!< Speaker status */ - TFA9894_BF_CLKOOR = 0x1180, /*!< External clock status */ - TFA9894_BF_MANALARM = 0x1190, /*!< Alarm state */ - TFA9894_BF_TDMERR = 0x11a0, /*!< TDM error */ - TFA9894_BF_TDMLUTER = 0x11b0, /*!< TDM lookup table error */ - TFA9894_BF_OCPOAP = 0x1200, /*!< OCPOK pmos A */ - TFA9894_BF_OCPOAN = 0x1210, /*!< OCPOK nmos A */ - TFA9894_BF_OCPOBP = 0x1220, /*!< OCPOK pmos B */ - TFA9894_BF_OCPOBN = 0x1230, /*!< OCPOK nmos B */ - TFA9894_BF_CLIPS = 0x1240, /*!< Amplifier clipping */ - TFA9894_BF_MANMUTE = 0x1250, /*!< Audio mute sequence */ - TFA9894_BF_MANOPER = 0x1260, /*!< Device in Operating state */ - TFA9894_BF_LP1 = 0x1270, /*!< Low power MODE1 detection */ - TFA9894_BF_LA = 0x1280, /*!< Low amplitude detection */ - TFA9894_BF_VDDPH = 0x1290, /*!< VDDP greater than VBAT flag */ - TFA9894_BF_TDMSTAT = 0x1402, /*!< TDM Status bits */ - TFA9894_BF_MANSTATE = 0x1433, /*!< Device Manager status */ - TFA9894_BF_DCMODE = 0x14b1, /*!< DCDC mode status bits */ - TFA9894_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9894_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9894_BF_VDDPS = 0x1709, /*!< IC VDDP voltage (1023*VDDP/13V) */ - TFA9894_BF_TDME = 0x2000, /*!< Enable interface */ - TFA9894_BF_TDMSPKE = 0x2010, /*!< Control audio tdm channel in sink0 */ - TFA9894_BF_TDMDCE = 0x2020, /*!< Control audio tdm channel in sink1 */ - TFA9894_BF_TDMCSE = 0x2030, /*!< Source 0 enable */ - TFA9894_BF_TDMVSE = 0x2040, /*!< Source 1 enable */ - TFA9894_BF_TDMCFE = 0x2050, /*!< Source 2 enable */ - TFA9894_BF_TDMCF2E = 0x2060, /*!< Source 3 enable */ - TFA9894_BF_TDMCLINV = 0x2070, /*!< Reception data to BCK clock */ - TFA9894_BF_TDMFSPOL = 0x2080, /*!< FS polarity */ - TFA9894_BF_TDMDEL = 0x2090, /*!< Data delay to FS */ - TFA9894_BF_TDMADJ = 0x20a0, /*!< Data adjustment */ - TFA9894_BF_TDMOOMP = 0x20b1, /*!< Received audio compression */ - TFA9894_BF_TDMNBCK = 0x2103, /*!< TDM NBCK - Bit clock to FS ratio */ - TFA9894_BF_TDMFSLN = 0x2143, /*!< FS length (master mode only) */ - TFA9894_BF_TDMSLOTS = 0x2183, /*!< N-slots in Frame */ - TFA9894_BF_TDMTXDFO = 0x21c1, /*!< Format unused bits */ - TFA9894_BF_TDMTXUS0 = 0x21e1, /*!< Format unused slots DATAO */ - TFA9894_BF_TDMSLLN = 0x2204, /*!< N-bits in slot */ - TFA9894_BF_TDMBRMG = 0x2254, /*!< N-bits remaining */ - TFA9894_BF_TDMSSIZE = 0x22a4, /*!< Sample size per slot */ - TFA9894_BF_TDMSPKS = 0x2303, /*!< TDM slot for sink 0 */ - TFA9894_BF_TDMDCS = 0x2343, /*!< TDM slot for sink 1 */ - TFA9894_BF_TDMCFSEL = 0x2381, /*!< TDM Source 2 data selection */ - TFA9894_BF_TDMCF2SEL = 0x23a1, /*!< TDM Source 3 data selection */ - TFA9894_BF_TDMCSS = 0x2403, /*!< Slot Position of source 0 data */ - TFA9894_BF_TDMVSS = 0x2443, /*!< Slot Position of source 1 data */ - TFA9894_BF_TDMCFS = 0x2483, /*!< Slot Position of source 2 data */ - TFA9894_BF_TDMCF2S = 0x24c3, /*!< Slot Position of source 3 data */ - TFA9894_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9894_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ - TFA9894_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9894_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ - TFA9894_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9894_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ - TFA9894_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ - TFA9894_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9894_BF_ISTCFMER = 0x4080, /*!< Status cfma error */ - TFA9894_BF_ISTCFMAC = 0x4090, /*!< Status cfma ack */ - TFA9894_BF_ISTSPKS = 0x40a0, /*!< Status coolflux speaker error */ - TFA9894_BF_ISTACS = 0x40b0, /*!< Status cold started */ - TFA9894_BF_ISTWDS = 0x40c0, /*!< Status watchdog reset */ - TFA9894_BF_ISTBODNOK = 0x40d0, /*!< Status brown out detect */ - TFA9894_BF_ISTLP1 = 0x40e0, /*!< Status low power mode1 detect */ - TFA9894_BF_ISTCLKOOR = 0x40f0, /*!< Status clock out of range */ - TFA9894_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9894_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ - TFA9894_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9894_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ - TFA9894_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9894_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ - TFA9894_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ - TFA9894_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9894_BF_ICLCFMER = 0x4480, /*!< Clear cfma err */ - TFA9894_BF_ICLCFMAC = 0x4490, /*!< Clear cfma ack */ - TFA9894_BF_ICLSPKS = 0x44a0, /*!< Clear coolflux speaker error */ - TFA9894_BF_ICLACS = 0x44b0, /*!< Clear cold started */ - TFA9894_BF_ICLWDS = 0x44c0, /*!< Clear watchdog reset */ - TFA9894_BF_ICLBODNOK = 0x44d0, /*!< Clear brown out detect */ - TFA9894_BF_ICLLP1 = 0x44e0, /*!< Clear low power mode1 detect */ - TFA9894_BF_ICLCLKOOR = 0x44f0, /*!< Clear clock out of range */ - TFA9894_BF_IEVDDS = 0x4800, /*!< Enable POR */ - TFA9894_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ - TFA9894_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9894_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ - TFA9894_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9894_BF_IEMANALARM = 0x4850, /*!< Enable Manager Alarm state */ - TFA9894_BF_IETDMER = 0x4860, /*!< Enable TDM error */ - TFA9894_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9894_BF_IECFMER = 0x4880, /*!< Enable cfma err */ - TFA9894_BF_IECFMAC = 0x4890, /*!< Enable cfma ack */ - TFA9894_BF_IESPKS = 0x48a0, /*!< Enable coolflux speaker error */ - TFA9894_BF_IEACS = 0x48b0, /*!< Enable cold started */ - TFA9894_BF_IEWDS = 0x48c0, /*!< Enable watchdog reset */ - TFA9894_BF_IEBODNOK = 0x48d0, /*!< Enable brown out detect */ - TFA9894_BF_IELP1 = 0x48e0, /*!< Enable low power mode1 detect */ - TFA9894_BF_IECLKOOR = 0x48f0, /*!< Enable clock out of range */ - TFA9894_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ - TFA9894_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ - TFA9894_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9894_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ - TFA9894_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9894_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ - TFA9894_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ - TFA9894_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9894_BF_IPOCFMER = 0x4c80, /*!< Polarity cfma err */ - TFA9894_BF_IPOCFMAC = 0x4c90, /*!< Polarity cfma ack */ - TFA9894_BF_IPOSPKS = 0x4ca0, /*!< Polarity coolflux speaker error */ - TFA9894_BF_IPOACS = 0x4cb0, /*!< Polarity cold started */ - TFA9894_BF_IPOWDS = 0x4cc0, /*!< Polarity watchdog reset */ - TFA9894_BF_IPOBODNOK = 0x4cd0, /*!< Polarity brown out detect */ - TFA9894_BF_IPOLP1 = 0x4ce0, /*!< Polarity low power mode1 detect */ - TFA9894_BF_IPOCLKOOR = 0x4cf0, /*!< Polarity clock out of range */ - TFA9894_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ - TFA9894_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ - TFA9894_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ - TFA9894_BF_BSSRR = 0x5082, /*!< Battery safeguard release time */ - TFA9894_BF_BSSHY = 0x50b1, /*!< Battery Safeguard hysteresis */ - TFA9894_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9894_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ - TFA9894_BF_CFSM = 0x5130, /*!< Coolflux firmware soft mute control */ - TFA9894_BF_VOL = 0x5187, /*!< CF firmware volume control */ - TFA9894_BF_CLIPCTRL = 0x5202, /*!< Clip control setting */ - TFA9894_BF_SLOPEE = 0x5230, /*!< Enables slope control */ - TFA9894_BF_SLOPESET = 0x5240, /*!< Slope speed setting (binary coded) */ - TFA9894_BF_AMPGAIN = 0x5287, /*!< Amplifier gain */ - TFA9894_BF_TDMDCG = 0x5703, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ - TFA9894_BF_TDMSPKG = 0x5743, /*!< Total gain depending on INPLEV setting (channel 0) */ - TFA9894_BF_DCINSEL = 0x5781, /*!< VAMP_OUT2 input selection */ - TFA9894_BF_LNMODE = 0x5881, /*!< Low noise gain mode control */ - TFA9894_BF_LPM1MODE = 0x5ac1, /*!< Low power mode control */ - TFA9894_BF_TDMSRCMAP = 0x5d02, /*!< TDM source mapping */ - TFA9894_BF_TDMSRCAS = 0x5d31, /*!< Sensed value A */ - TFA9894_BF_TDMSRCBS = 0x5d51, /*!< Sensed value B */ - TFA9894_BF_TDMSRCACLIP = 0x5d71, /*!< Clip information (analog /digital) for source0 */ - TFA9894_BF_TDMSRCBCLIP = 0x5d91, /*!< Clip information (analog /digital) for source1 */ - TFA9894_BF_DELCURCOMP = 0x6102, /*!< Delay to allign compensation signal with current sense signal */ - TFA9894_BF_SIGCURCOMP = 0x6130, /*!< Polarity of compensation for current sense */ - TFA9894_BF_ENCURCOMP = 0x6140, /*!< Enable current sense compensation */ - TFA9894_BF_LVLCLPPWM = 0x6152, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ - TFA9894_BF_DCVOF = 0x7005, /*!< First Boost Voltage Level */ - TFA9894_BF_DCVOS = 0x7065, /*!< Second Boost Voltage Level */ - TFA9894_BF_DCMCC = 0x70c3, /*!< Max Coil Current */ - TFA9894_BF_DCCV = 0x7101, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ - TFA9894_BF_DCIE = 0x7120, /*!< Adaptive boost mode */ - TFA9894_BF_DCSR = 0x7130, /*!< Soft ramp up/down */ - TFA9894_BF_DCDIS = 0x7140, /*!< DCDC on/off */ - TFA9894_BF_DCPWM = 0x7150, /*!< DCDC PWM only mode */ - TFA9894_BF_DCTRACK = 0x7160, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ - TFA9894_BF_DCENVSEL = 0x7170, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ - TFA9894_BF_DCTRIP = 0x7204, /*!< 1st adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9894_BF_DCTRIP2 = 0x7254, /*!< 2nd adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9894_BF_DCTRIPT = 0x72a4, /*!< Track adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9894_BF_DCTRIPHYSTE = 0x72f0, /*!< Enable hysteresis on booster trip levels */ - TFA9894_BF_DCHOLD = 0x7304, /*!< Hold time for DCDC booster, effective only when boost_intelligent is set to 1 */ - TFA9894_BF_RST = 0x9000, /*!< Reset for Coolflux DSP */ - TFA9894_BF_DMEM = 0x9011, /*!< Target memory for CFMA using I2C interface */ - TFA9894_BF_AIF = 0x9030, /*!< Auto increment */ - TFA9894_BF_CFINT = 0x9040, /*!< Coolflux Interrupt - auto clear */ - TFA9894_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ - TFA9894_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ - TFA9894_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ - TFA9894_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ - TFA9894_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ - TFA9894_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ - TFA9894_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ - TFA9894_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ - TFA9894_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ - TFA9894_BF_MADD = 0x910f, /*!< CF memory address */ - TFA9894_BF_MEMA = 0x920f, /*!< Activate memory access */ - TFA9894_BF_ERR = 0x9307, /*!< CF error flags */ - TFA9894_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ - TFA9894_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ - TFA9894_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ - TFA9894_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ - TFA9894_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ - TFA9894_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ - TFA9894_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ - TFA9894_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ - TFA9894_BF_MTPK = 0xa107, /*!< KEY2 to access KEY2 protected registers, customer key */ - TFA9894_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9894_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9894_BF_CMTPI = 0xa350, /*!< Start copying all the data from mtp to I2C mtp registers - auto clear */ - TFA9894_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp - auto clear */ - TFA9894_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9894_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9894_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9894_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9894_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ - TFA9894_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ - TFA9894_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9894_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9894_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9894_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9894_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9894_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9894_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ -} Tfa9894BfEnumList_t; -#define TFA9894_NAMETABLE static tfaBfName_t Tfa9894DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown control , */\ - { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ - { 0x20, "CFE"}, /* Enable CoolFlux DSP , */\ - { 0x30, "AMPE"}, /* Enable Amplifier , */\ - { 0x40, "DCA"}, /* Enable DCDC Boost converter , */\ - { 0x50, "SBSL"}, /* Coolflux configured , */\ - { 0x60, "AMPC"}, /* CoolFlux control over amplifier , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0x90, "FSSSEL"}, /* Audio sample reference , */\ - { 0xa0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xb0, "TSTOCP"}, /* OCP testing control , */\ - { 0xc0, "BSSS"}, /* Vbat protection steepness , */\ - { 0xd0, "HPFBYP"}, /* Bypass High Pass Filter , */\ - { 0xe0, "DPSA"}, /* Enable DPSA , */\ - { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ - { 0x120, "MANSCONF"}, /* Device I2C settings configured , */\ - { 0x130, "MANCOLD"}, /* Execute cold start , */\ - { 0x140, "MANROBOD"}, /* Reaction on BOD , */\ - { 0x150, "BODE"}, /* Enable BOD (only in direct control mode) , */\ - { 0x160, "BODHYS"}, /* Enable Hysteresis of BOD , */\ - { 0x171, "BODFILT"}, /* BOD filter , */\ - { 0x191, "BODTHLVL"}, /* BOD threshold , */\ - { 0x1b0, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1c0, "MANWDE"}, /* Watchdog enable , */\ - { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ - { 0x1f0, "FAIMVBGOVRRL"}, /* Overrule the enabling of VBG for faim erase/write access, */\ - { 0x203, "AUDFS"}, /* Audio sample rate Fs , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* Current sense fractional delay , */\ - { 0x2b1, "TDMPRES"}, /* Control for HW manager , */\ - { 0x2d2, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x30f, "REV"}, /* Revision info , */\ - { 0x401, "REFCKEXT"}, /* PLL external reference clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal reference clock , */\ - { 0x432, "MCLKSEL"}, /* Master Clock Selection , */\ - { 0x460, "MANAOOSC"}, /* Internal OSC1M off at PWDN , */\ - { 0x470, "ACKCLDDIS"}, /* Automatic PLL reference clock selection for cold start, */\ - { 0x510, "SPKSSEN"}, /* Enable speaker sub-system , */\ - { 0x520, "MTPSSEN"}, /* Enable FAIM sub-system , */\ - { 0x530, "WDTCLKEN"}, /* Enable Coolflux watchdog clock , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "PLLS"}, /* PLL Lock , */\ - { 0x1020, "OTDS"}, /* OTP alarm , */\ - { 0x1030, "OVDS"}, /* OVP alarm , */\ - { 0x1040, "UVDS"}, /* UVP alarm , */\ - { 0x1050, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1060, "CLKS"}, /* Clocks stable , */\ - { 0x1070, "MTPB"}, /* MTP busy , */\ - { 0x1080, "NOCLK"}, /* Lost clock , */\ - { 0x1090, "ACS"}, /* Cold Start , */\ - { 0x10a0, "WDS"}, /* Watchdog , */\ - { 0x10b0, "SWS"}, /* Amplifier engage , */\ - { 0x10c0, "AMPS"}, /* Amplifier enable , */\ - { 0x10d0, "AREFS"}, /* References enable , */\ - { 0x10e0, "ADCCR"}, /* Control ADC , */\ - { 0x10f0, "BODNOK"}, /* BOD Flag - VDD NOT OK , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1170, "SPKS"}, /* Speaker status , */\ - { 0x1180, "CLKOOR"}, /* External clock status , */\ - { 0x1190, "MANALARM"}, /* Alarm state , */\ - { 0x11a0, "TDMERR"}, /* TDM error , */\ - { 0x11b0, "TDMLUTER"}, /* TDM lookup table error , */\ - { 0x1200, "OCPOAP"}, /* OCPOK pmos A , */\ - { 0x1210, "OCPOAN"}, /* OCPOK nmos A , */\ - { 0x1220, "OCPOBP"}, /* OCPOK pmos B , */\ - { 0x1230, "OCPOBN"}, /* OCPOK nmos B , */\ - { 0x1240, "CLIPS"}, /* Amplifier clipping , */\ - { 0x1250, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x1260, "MANOPER"}, /* Device in Operating state , */\ - { 0x1270, "LP1"}, /* Low power MODE1 detection , */\ - { 0x1280, "LA"}, /* Low amplitude detection , */\ - { 0x1290, "VDDPH"}, /* VDDP greater than VBAT flag , */\ - { 0x1402, "TDMSTAT"}, /* TDM Status bits , */\ - { 0x1433, "MANSTATE"}, /* Device Manager status , */\ - { 0x14b1, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ - { 0x2000, "TDME"}, /* Enable interface , */\ - { 0x2010, "TDMSPKE"}, /* Control audio tdm channel in sink0 , */\ - { 0x2020, "TDMDCE"}, /* Control audio tdm channel in sink1 , */\ - { 0x2030, "TDMCSE"}, /* Source 0 enable , */\ - { 0x2040, "TDMVSE"}, /* Source 1 enable , */\ - { 0x2050, "TDMCFE"}, /* Source 2 enable , */\ - { 0x2060, "TDMCF2E"}, /* Source 3 enable , */\ - { 0x2070, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2080, "TDMFSPOL"}, /* FS polarity , */\ - { 0x2090, "TDMDEL"}, /* Data delay to FS , */\ - { 0x20a0, "TDMADJ"}, /* Data adjustment , */\ - { 0x20b1, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2103, "TDMNBCK"}, /* TDM NBCK - Bit clock to FS ratio , */\ - { 0x2143, "TDMFSLN"}, /* FS length (master mode only) , */\ - { 0x2183, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x21c1, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x21e1, "TDMTXUS0"}, /* Format unused slots DATAO , */\ - { 0x2204, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2254, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x22a4, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2303, "TDMSPKS"}, /* TDM slot for sink 0 , */\ - { 0x2343, "TDMDCS"}, /* TDM slot for sink 1 , */\ - { 0x2381, "TDMCFSEL"}, /* TDM Source 2 data selection , */\ - { 0x23a1, "TDMCF2SEL"}, /* TDM Source 3 data selection , */\ - { 0x2403, "TDMCSS"}, /* Slot Position of source 0 data , */\ - { 0x2443, "TDMVSS"}, /* Slot Position of source 1 data , */\ - { 0x2483, "TDMCFS"}, /* Slot Position of source 2 data , */\ - { 0x24c3, "TDMCF2S"}, /* Slot Position of source 3 data , */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ - { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4080, "ISTCFMER"}, /* Status cfma error , */\ - { 0x4090, "ISTCFMAC"}, /* Status cfma ack , */\ - { 0x40a0, "ISTSPKS"}, /* Status coolflux speaker error , */\ - { 0x40b0, "ISTACS"}, /* Status cold started , */\ - { 0x40c0, "ISTWDS"}, /* Status watchdog reset , */\ - { 0x40d0, "ISTBODNOK"}, /* Status brown out detect , */\ - { 0x40e0, "ISTLP1"}, /* Status low power mode1 detect , */\ - { 0x40f0, "ISTCLKOOR"}, /* Status clock out of range , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ - { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4480, "ICLCFMER"}, /* Clear cfma err , */\ - { 0x4490, "ICLCFMAC"}, /* Clear cfma ack , */\ - { 0x44a0, "ICLSPKS"}, /* Clear coolflux speaker error , */\ - { 0x44b0, "ICLACS"}, /* Clear cold started , */\ - { 0x44c0, "ICLWDS"}, /* Clear watchdog reset , */\ - { 0x44d0, "ICLBODNOK"}, /* Clear brown out detect , */\ - { 0x44e0, "ICLLP1"}, /* Clear low power mode1 detect , */\ - { 0x44f0, "ICLCLKOOR"}, /* Clear clock out of range , */\ - { 0x4800, "IEVDDS"}, /* Enable POR , */\ - { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IEMANALARM"}, /* Enable Manager Alarm state , */\ - { 0x4860, "IETDMER"}, /* Enable TDM error , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4880, "IECFMER"}, /* Enable cfma err , */\ - { 0x4890, "IECFMAC"}, /* Enable cfma ack , */\ - { 0x48a0, "IESPKS"}, /* Enable coolflux speaker error , */\ - { 0x48b0, "IEACS"}, /* Enable cold started , */\ - { 0x48c0, "IEWDS"}, /* Enable watchdog reset , */\ - { 0x48d0, "IEBODNOK"}, /* Enable brown out detect , */\ - { 0x48e0, "IELP1"}, /* Enable low power mode1 detect , */\ - { 0x48f0, "IECLKOOR"}, /* Enable clock out of range , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ - { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ - { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x4c80, "IPOCFMER"}, /* Polarity cfma err , */\ - { 0x4c90, "IPOCFMAC"}, /* Polarity cfma ack , */\ - { 0x4ca0, "IPOSPKS"}, /* Polarity coolflux speaker error , */\ - { 0x4cb0, "IPOACS"}, /* Polarity cold started , */\ - { 0x4cc0, "IPOWDS"}, /* Polarity watchdog reset , */\ - { 0x4cd0, "IPOBODNOK"}, /* Polarity brown out detect , */\ - { 0x4ce0, "IPOLP1"}, /* Polarity low power mode1 detect , */\ - { 0x4cf0, "IPOCLKOOR"}, /* Polarity clock out of range , */\ - { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ - { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ - { 0x5082, "BSSRR"}, /* Battery safeguard release time , */\ - { 0x50b1, "BSSHY"}, /* Battery Safeguard hysteresis , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ - { 0x5130, "CFSM"}, /* Coolflux firmware soft mute control , */\ - { 0x5187, "VOL"}, /* CF firmware volume control , */\ - { 0x5202, "CLIPCTRL"}, /* Clip control setting , */\ - { 0x5230, "SLOPEE"}, /* Enables slope control , */\ - { 0x5240, "SLOPESET"}, /* Slope speed setting (binary coded) , */\ - { 0x5287, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x5703, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x5743, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x5781, "DCINSEL"}, /* VAMP_OUT2 input selection , */\ - { 0x5881, "LNMODE"}, /* Low noise gain mode control , */\ - { 0x5ac1, "LPM1MODE"}, /* Low power mode control , */\ - { 0x5d02, "TDMSRCMAP"}, /* TDM source mapping , */\ - { 0x5d31, "TDMSRCAS"}, /* Sensed value A , */\ - { 0x5d51, "TDMSRCBS"}, /* Sensed value B , */\ - { 0x5d71, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ - { 0x5d91, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ - { 0x6102, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6130, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ - { 0x6140, "ENCURCOMP"}, /* Enable current sense compensation , */\ - { 0x6152, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7005, "DCVOF"}, /* First Boost Voltage Level , */\ - { 0x7065, "DCVOS"}, /* Second Boost Voltage Level , */\ - { 0x70c3, "DCMCC"}, /* Max Coil Current , */\ - { 0x7101, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7120, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7130, "DCSR"}, /* Soft ramp up/down , */\ - { 0x7140, "DCDIS"}, /* DCDC on/off , */\ - { 0x7150, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7160, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7170, "DCENVSEL"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7204, "DCTRIP"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7254, "DCTRIP2"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x72a4, "DCTRIPT"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x72f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7304, "DCHOLD"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x9000, "RST"}, /* Reset for Coolflux DSP , */\ - { 0x9011, "DMEM"}, /* Target memory for CFMA using I2C interface , */\ - { 0x9030, "AIF"}, /* Auto increment , */\ - { 0x9040, "CFINT"}, /* Coolflux Interrupt - auto clear , */\ - { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ - { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ - { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ - { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ - { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ - { 0x910f, "MADD"}, /* CF memory address , */\ - { 0x920f, "MEMA"}, /* Activate memory access , */\ - { 0x9307, "ERR"}, /* CF error flags , */\ - { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ - { 0xa107, "MTPK"}, /* KEY2 to access KEY2 protected registers, customer key, */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa350, "CMTPI"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ - { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ - { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9894_BITNAMETABLE static tfaBfName_t Tfa9894BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown control , */\ - { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ - { 0x20, "enbl_coolflux"}, /* Enable CoolFlux DSP , */\ - { 0x30, "enbl_amplifier"}, /* Enable Amplifier , */\ - { 0x40, "enbl_boost"}, /* Enable DCDC Boost converter , */\ - { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ - { 0x60, "sel_enbl_amplifier"}, /* CoolFlux control over amplifier , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ - { 0xa0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xb0, "test_ocp"}, /* OCP testing control , */\ - { 0xc0, "batsense_steepness"}, /* Vbat protection steepness , */\ - { 0xd0, "bypass_hp"}, /* Bypass High Pass Filter , */\ - { 0xe0, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0xf0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ - { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ - { 0x120, "src_set_configured"}, /* Device I2C settings configured , */\ - { 0x130, "execute_cold_start"}, /* Execute cold start , */\ - { 0x140, "man_enbl_brown_out"}, /* Reaction on BOD , */\ - { 0x150, "bod_enbl"}, /* Enable BOD (only in direct control mode) , */\ - { 0x160, "bod_hyst_enbl"}, /* Enable Hysteresis of BOD , */\ - { 0x171, "bod_delay_set"}, /* BOD filter , */\ - { 0x191, "bod_lvl_set"}, /* BOD threshold , */\ - { 0x1b0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x1c0, "man_enbl_watchdog"}, /* Watchdog enable , */\ - { 0x1d0, "disable_engage"}, /* Disable Engage , */\ - { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ - { 0x1f0, "faim_enable_vbg"}, /* Overrule the enabling of VBG for faim erase/write access, */\ - { 0x203, "audio_fs"}, /* Audio sample rate Fs , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* Current sense fractional delay , */\ - { 0x2b1, "use_tdm_presence"}, /* Control for HW manager , */\ - { 0x2d2, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x30f, "device_rev"}, /* Revision info , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external reference clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal reference clock , */\ - { 0x432, "mclk_sel"}, /* Master Clock Selection , */\ - { 0x460, "enbl_osc1m_auto_off"}, /* Internal OSC1M off at PWDN , */\ - { 0x470, "disable_auto_sel_refclk"}, /* Automatic PLL reference clock selection for cold start, */\ - { 0x510, "enbl_spkr_ss"}, /* Enable speaker sub-system , */\ - { 0x520, "enbl_faim_ss"}, /* Enable FAIM sub-system , */\ - { 0x530, "enbl_wdt_clk"}, /* Enable Coolflux watchdog clock , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* Hidden code to enable access to hidden register. (0x5A6B/23147 default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_pll_lock"}, /* PLL Lock , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm , */\ - { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ - { 0x1050, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1080, "flag_lost_clk"}, /* Lost clock , */\ - { 0x1090, "flag_cold_started"}, /* Cold Start , */\ - { 0x10a0, "flag_watchdog_reset"}, /* Watchdog , */\ - { 0x10b0, "flag_engage"}, /* Amplifier engage , */\ - { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ - { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x10f0, "flag_bod_vddd_nok"}, /* BOD Flag - VDD NOT OK , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1170, "flag_cf_speakererror"}, /* Speaker status , */\ - { 0x1180, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x1190, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x11a0, "flag_tdm_error"}, /* TDM error , */\ - { 0x11b0, "flag_tdm_lut_error"}, /* TDM lookup table error , */\ - { 0x1200, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1210, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1220, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1230, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1240, "flag_clip"}, /* Amplifier clipping , */\ - { 0x1250, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x1260, "flag_man_operating_state"}, /* Device in Operating state , */\ - { 0x1270, "flag_lp_detect_mode1"}, /* Low power MODE1 detection , */\ - { 0x1280, "flag_low_amplitude"}, /* Low amplitude detection , */\ - { 0x1290, "flag_vddp_gt_vbat"}, /* VDDP greater than VBAT flag , */\ - { 0x1402, "tdm_status"}, /* TDM Status bits , */\ - { 0x1433, "man_state"}, /* Device Manager status , */\ - { 0x1473, "amp_ctrl_state"}, /* Amplifier control status , */\ - { 0x14b1, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ - { 0x2000, "tdm_enable"}, /* Enable interface , */\ - { 0x2010, "tdm_sink0_enable"}, /* Control audio tdm channel in sink0 , */\ - { 0x2020, "tdm_sink1_enable"}, /* Control audio tdm channel in sink1 , */\ - { 0x2030, "tdm_source0_enable"}, /* Source 0 enable , */\ - { 0x2040, "tdm_source1_enable"}, /* Source 1 enable , */\ - { 0x2050, "tdm_source2_enable"}, /* Source 2 enable , */\ - { 0x2060, "tdm_source3_enable"}, /* Source 3 enable , */\ - { 0x2070, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2080, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x2090, "tdm_data_delay"}, /* Data delay to FS , */\ - { 0x20a0, "tdm_data_adjustment"}, /* Data adjustment , */\ - { 0x20b1, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2103, "tdm_nbck"}, /* TDM NBCK - Bit clock to FS ratio , */\ - { 0x2143, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ - { 0x2183, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x21c1, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x21e1, "tdm_txdata_format_unused_slot"}, /* Format unused slots DATAO , */\ - { 0x2204, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2254, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x22a4, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2303, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ - { 0x2343, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ - { 0x2381, "tdm_source2_sel"}, /* TDM Source 2 data selection , */\ - { 0x23a1, "tdm_source3_sel"}, /* TDM Source 3 data selection , */\ - { 0x2403, "tdm_source0_slot"}, /* Slot Position of source 0 data , */\ - { 0x2443, "tdm_source1_slot"}, /* Slot Position of source 1 data , */\ - { 0x2483, "tdm_source2_slot"}, /* Slot Position of source 2 data , */\ - { 0x24c3, "tdm_source3_slot"}, /* Slot Position of source 3 data , */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ - { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4080, "int_out_flag_cfma_err"}, /* Status cfma error , */\ - { 0x4090, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ - { 0x40a0, "int_out_flag_cf_speakererror"}, /* Status coolflux speaker error , */\ - { 0x40b0, "int_out_flag_cold_started"}, /* Status cold started , */\ - { 0x40c0, "int_out_flag_watchdog_reset"}, /* Status watchdog reset , */\ - { 0x40d0, "int_out_flag_bod_vddd_nok"}, /* Status brown out detect , */\ - { 0x40e0, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 detect , */\ - { 0x40f0, "int_out_flag_clk_out_of_range"}, /* Status clock out of range , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ - { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4480, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ - { 0x4490, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ - { 0x44a0, "int_in_flag_cf_speakererror"}, /* Clear coolflux speaker error , */\ - { 0x44b0, "int_in_flag_cold_started"}, /* Clear cold started , */\ - { 0x44c0, "int_in_flag_watchdog_reset"}, /* Clear watchdog reset , */\ - { 0x44d0, "int_in_flag_bod_vddd_nok"}, /* Clear brown out detect , */\ - { 0x44e0, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 detect , */\ - { 0x44f0, "int_in_flag_clk_out_of_range"}, /* Clear clock out of range , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ - { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable Manager Alarm state , */\ - { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4880, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ - { 0x4890, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ - { 0x48a0, "int_enable_flag_cf_speakererror"}, /* Enable coolflux speaker error , */\ - { 0x48b0, "int_enable_flag_cold_started"}, /* Enable cold started , */\ - { 0x48c0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog reset , */\ - { 0x48d0, "int_enable_flag_bod_vddd_nok"}, /* Enable brown out detect , */\ - { 0x48e0, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 detect , */\ - { 0x48f0, "int_enable_flag_clk_out_of_range"}, /* Enable clock out of range , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ - { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ - { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x4c80, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ - { 0x4c90, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ - { 0x4ca0, "int_polarity_flag_cf_speakererror"}, /* Polarity coolflux speaker error , */\ - { 0x4cb0, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ - { 0x4cc0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog reset , */\ - { 0x4cd0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity brown out detect , */\ - { 0x4ce0, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 detect , */\ - { 0x4cf0, "int_polarity_flag_clk_out_of_range"}, /* Polarity clock out of range , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ - { 0x5082, "vbat_prot_release_time"}, /* Battery safeguard release time , */\ - { 0x50b1, "vbat_prot_hysterese"}, /* Battery Safeguard hysteresis , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ - { 0x5130, "cf_mute"}, /* Coolflux firmware soft mute control , */\ - { 0x5187, "cf_volume"}, /* CF firmware volume control , */\ - { 0x5202, "ctrl_cc"}, /* Clip control setting , */\ - { 0x5230, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x5240, "ctrl_slope"}, /* Slope speed setting (binary coded) , */\ - { 0x5287, "gain"}, /* Amplifier gain , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ - { 0x5340, "clipfast"}, /* Clock selection for HW clipper for battery safeguard, */\ - { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ - { 0x5360, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ - { 0x5370, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5380, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5390, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x53a3, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ - { 0x5400, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5413, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5452, "dpsa_drive"}, /* Drive setting (binary coded) , */\ - { 0x550a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ - { 0x55b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ - { 0x55c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ - { 0x5600, "pwm_shape"}, /* PWM shape , */\ - { 0x5614, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ - { 0x5660, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ - { 0x5670, "reclock_voltsense"}, /* Reclock the voltage sense PWM signal , */\ - { 0x5680, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ - { 0x5690, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ - { 0x56a1, "enbl_odd_up_even_down"}, /* Control for PWM reference sawtooth generartion , */\ - { 0x5703, "ctrl_att_dcdc"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x5743, "ctrl_att_spkr"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x5781, "vamp_sel2"}, /* VAMP_OUT2 input selection , */\ - { 0x5805, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ - { 0x5861, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ - { 0x5881, "lownoisegain_mode"}, /* Low noise gain mode control , */\ - { 0x5905, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ - { 0x5965, "hold_time"}, /* Low noise mode hold time before entering into low noise mode, */\ - { 0x5a05, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x5a65, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ - { 0x5ac1, "lpm1_mode"}, /* Low power mode control , */\ - { 0x5b05, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ - { 0x5b65, "lpm1_hold_time"}, /* Low power mode hold time before entering into low power mode, */\ - { 0x5bc0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ - { 0x5c00, "enbl_minion"}, /* Enables minion (small) power stage , */\ - { 0x5c13, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ - { 0x5c50, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ - { 0x5c61, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ - { 0x5d02, "tdm_source_mapping"}, /* TDM source mapping , */\ - { 0x5d31, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ - { 0x5d51, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ - { 0x5d71, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ - { 0x5d91, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ - { 0x5e02, "rst_min_vbat_delay"}, /* Delay for reseting the min_vbat value inside HW Clipper (number of Fs pulses), */\ - { 0x5e30, "rst_min_vbat_sel"}, /* Control for selecting reset signal for min_bat , */\ - { 0x5f00, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5f12, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x5f42, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x5f78, "spare_out"}, /* Spare out register , */\ - { 0x600f, "spare_in"}, /* Spare IN , */\ - { 0x6102, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6130, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ - { 0x6140, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ - { 0x6152, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7005, "frst_boost_voltage"}, /* First Boost Voltage Level , */\ - { 0x7065, "scnd_boost_voltage"}, /* Second Boost Voltage Level , */\ - { 0x70c3, "boost_cur"}, /* Max Coil Current , */\ - { 0x7101, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7120, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7130, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x7140, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x7150, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7160, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7170, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7180, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ - { 0x7204, "boost_trip_lvl_1st"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7254, "boost_trip_lvl_2nd"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x72a4, "boost_trip_lvl_track"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x72f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7304, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x7350, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ - { 0x7361, "dcdc_ctrl_maxzercnt"}, /* Number of zero current flags to count before going to pfm mode, */\ - { 0x7386, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x73f0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x7404, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7451, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7474, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x74c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x74e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x74f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7500, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7510, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7520, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7530, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7540, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x7550, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7560, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7570, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7580, "enbl_bst_windac"}, /* Enable window dac , */\ - { 0x7595, "bst_windac"}, /* For testing direct control windac , */\ - { 0x7600, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7611, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7631, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7650, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7660, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ - { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ - { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ - { 0x8040, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8050, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8060, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8105, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP) * signal, */\ - { 0x8164, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ - { 0x81b0, "enbl_cs_adc"}, /* Enable current sense ADC , */\ - { 0x81c0, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ - { 0x81d0, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ - { 0x81e0, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x81f0, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ - { 0x8200, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ - { 0x8210, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ - { 0x8220, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8231, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ - { 0x8250, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8263, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ - { 0x82a0, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x82b4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ - { 0x8300, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ - { 0x8310, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8320, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8330, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8340, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8350, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if enbl_cs_ldo is high, */\ - { 0x8364, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8800, "ctrl_vs_igen_supply"}, /* Control for selecting supply for VS current generator, */\ - { 0x8810, "ctrl_vs_force_div2"}, /* Select input resistive divider gain , */\ - { 0x8820, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ - { 0x8901, "volsense_pwm_sel"}, /* Voltage sense source selection control , */\ - { 0x8920, "vs_gain_control"}, /* Voltage sense gain control , */\ - { 0x8930, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ - { 0x8940, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ - { 0x8950, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ - { 0x8960, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ - { 0x8970, "vs_classd_tran_skip"}, /* Skip voltage sense connection during a classD amplifier transition, */\ - { 0x8987, "vs_gain"}, /* Voltage sense gain , */\ - { 0x8a00, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ - { 0x8a10, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ - { 0x8a20, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ - { 0x8a30, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if enbl_cs_ldo is high, */\ - { 0x8a44, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ - { 0x8a90, "enbl_vs_adc"}, /* Enable voltage sense ADC , */\ - { 0x8aa0, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ - { 0x8ab0, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ - { 0x8ac0, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ - { 0x8ad0, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ - { 0x8ae0, "enbl_vs_ldo"}, /* Enable voltage sense LDO , */\ - { 0x8af0, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO , */\ - { 0x9000, "cf_rst_dsp"}, /* Reset for Coolflux DSP , */\ - { 0x9011, "cf_dmem"}, /* Target memory for CFMA using I2C interface , */\ - { 0x9030, "cf_aif"}, /* Auto increment , */\ - { 0x9040, "cf_int"}, /* Coolflux Interrupt - auto clear , */\ - { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ - { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ - { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ - { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ - { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ - { 0x910f, "cf_madd"}, /* CF memory address , */\ - { 0x920f, "cf_mema"}, /* Activate memory access , */\ - { 0x9307, "cf_err"}, /* CF error flags , */\ - { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ - { 0xa007, "mtpkey1"}, /* KEY1 To access KEY1 protected registers 0x5A/90d (default for engineering), */\ - { 0xa107, "mtpkey2"}, /* KEY2 to access KEY2 protected registers, customer key, */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from MTP to I2C mtp register - auto clear, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp - auto clear, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ - { 0xa400, "faim_set_clkws"}, /* Sets the FaIM controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the FaIM are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the FaIM are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb000, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb010, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb020, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb030, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb040, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb050, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb060, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb070, "disable_main_ctrl_change_prot"}, /* Disable main control change protection , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ - { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ - { 0xc3d0, "test_abistfft_enbl"}, /* Enable ABIST with FFT on Coolflux DSP , */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc530, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc540, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc550, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc560, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ - { 0xc570, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc583, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc5c0, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc607, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO , */\ - { 0xc687, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT , */\ - { 0xc707, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 , */\ - { 0xc800, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xc810, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xc820, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xc830, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xc844, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xc894, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xc903, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ - { 0xc943, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ - { 0xca05, "pll_seli"}, /* PLL SELI - I2C direct PLL control mode only , */\ - { 0xca64, "pll_selp"}, /* PLL SELP - I2C direct PLL control mode only , */\ - { 0xcab3, "pll_selr"}, /* PLL SELR - I2C direct PLL control mode only , */\ - { 0xcaf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ - { 0xcb09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ - { 0xcba0, "pll_mdec_msb"}, /* MSB of PLL_mdec - I2C direct PLL control mode only, */\ - { 0xcbb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ - { 0xcbc0, "enbl_osc"}, /* Enables OSC1M in I2C direct control mode only , */\ - { 0xcbd0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ - { 0xcbe0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ - { 0xcbf0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ - { 0xcc0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ - { 0xcd06, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ - { 0xce0f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xcf02, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ - { 0xcf33, "tsig_gain"}, /* Test signal gain , */\ - { 0xd000, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd011, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd032, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd064, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd0b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd0c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd109, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd201, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ - { 0xd221, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ - { 0xd241, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ - { 0xd301, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ - { 0xd321, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ - { 0xd340, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xd407, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd480, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xd491, "sel_wdt_clk"}, /* Watch dog clock divider settings , */\ - { 0xd4b0, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd500, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ - { 0xd510, "gainatt_feedback"}, /* Gainatt feedback to tdm , */\ - { 0xd522, "test_parametric_io"}, /* Test IO parametric , */\ - { 0xd550, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ - { 0xd561, "test_spare_out1"}, /* Test spare out 1 , */\ - { 0xd580, "bst_dcmbst"}, /* DCM boost , */\ - { 0xd593, "test_spare_out2"}, /* Test spare out 2 , */\ - { 0xe00f, "sw_profile"}, /* Software profile data , */\ - { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf163, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf307, "calibr_gain_vs"}, /* Voltage sense gain , */\ - { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf40f, "mtpdata4"}, /* MTP4 data , */\ - { 0xf50f, "calibr_R25C"}, /* Ron resistance of speaker coil , */\ - { 0xf60f, "mtpdata6"}, /* MTP6 data , */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable functionality of dcdcoff_mode bit , */\ - { 0xf910, "mtp_lock_enbl_coolflux"}, /* Disable functionality of enbl_coolflux bit , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ - { 0xf940, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ - { 0xf950, "mtp_gate_cgu_clock_for_test"}, /* CGU test clock control , */\ - { 0xf987, "type_bits_fw"}, /* MTP control for firmware features - See Firmware I2C API document for details, */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE , */\ - { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa9894_irq { - tfa9894_irq_max = -1, - tfa9894_irq_all = -1 /* all irqs */}; - -#define TFA9894_IRQ_NAMETABLE static tfaIrqName_t Tfa9894IrqNames[] = {\ -}; -#endif /* _TFA9894_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames_N2.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames_N2.h deleted file mode 100644 index 35ac496abeeb..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9894_tfafieldnames_N2.h +++ /dev/null @@ -1,1130 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9894_tfaFieldnames_N2.h - * This file was generated automatically on 09/28/18 at 12:19:41. - * Source file: TFA9894_N2A1_I2C_RegisterMap.xlsx - */ - -#ifndef _TFA9894_TFAFIELDNAMES_N2_H -#define _TFA9894_TFAFIELDNAMES_N2_H - - -#define TFA9894N2_I2CVERSION 25.0 - -typedef enum Tfa9894N2BfEnumList { - TFA9894N2_BF_PWDN = 0x0000, /*!< Powerdown control */ - TFA9894N2_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ - TFA9894N2_BF_CFE = 0x0020, /*!< Enable CoolFlux DSP */ - TFA9894N2_BF_AMPE = 0x0030, /*!< Enable Amplifier */ - TFA9894N2_BF_DCA = 0x0040, /*!< Enable DCDC Boost converter */ - TFA9894N2_BF_SBSL = 0x0050, /*!< Coolflux configured */ - TFA9894N2_BF_AMPC = 0x0060, /*!< CoolFlux control over amplifier */ - TFA9894N2_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9894N2_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ - TFA9894N2_BF_BYPOCP = 0x00a0, /*!< Bypass OCP */ - TFA9894N2_BF_TSTOCP = 0x00b0, /*!< OCP testing control */ - TFA9894N2_BF_BSSS = 0x00c0, /*!< Vbat protection steepness */ - TFA9894N2_BF_HPFBYP = 0x00d0, /*!< Bypass High Pass Filter */ - TFA9894N2_BF_DPSA = 0x00e0, /*!< Enable DPSA */ - TFA9894N2_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ - TFA9894N2_BF_MANSCONF = 0x0120, /*!< Device I2C settings configured */ - TFA9894N2_BF_MANCOLD = 0x0130, /*!< Execute cold start */ - TFA9894N2_BF_MANROBOD = 0x0140, /*!< Reaction on BOD */ - TFA9894N2_BF_BODE = 0x0150, /*!< Enable BOD (only in direct control mode) */ - TFA9894N2_BF_BODHYS = 0x0160, /*!< Enable Hysteresis of BOD */ - TFA9894N2_BF_BODFILT = 0x0171, /*!< BOD filter */ - TFA9894N2_BF_BODTHLVL = 0x0191, /*!< BOD threshold */ - TFA9894N2_BF_MUTETO = 0x01b0, /*!< Time out SB mute sequence */ - TFA9894N2_BF_MANWDE = 0x01c0, /*!< Watchdog enable */ - TFA9894N2_BF_OPENMTP = 0x01e0, /*!< Control for FAIM protection */ - TFA9894N2_BF_FAIMVBGOVRRL = 0x01f0, /*!< Overrule the enabling of VBG for faim erase/write access */ - TFA9894N2_BF_AUDFS = 0x0203, /*!< Audio sample rate Fs */ - TFA9894N2_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9894N2_BF_FRACTDEL = 0x0255, /*!< Current sense fractional delay */ - TFA9894N2_BF_TDMPRES = 0x02b1, /*!< Control for HW manager */ - TFA9894N2_BF_AMPOCRT = 0x02d2, /*!< Amplifier on-off criteria for shutdown */ - TFA9894N2_BF_REV = 0x030f, /*!< Revision info */ - TFA9894N2_BF_REFCKEXT = 0x0401, /*!< PLL external reference clock */ - TFA9894N2_BF_REFCKSEL = 0x0420, /*!< PLL internal reference clock */ - TFA9894N2_BF_MCLKSEL = 0x0432, /*!< Master Clock Selection */ - TFA9894N2_BF_MANAOOSC = 0x0460, /*!< Internal OSC1M off at PWDN */ - TFA9894N2_BF_ACKCLDDIS = 0x0470, /*!< Automatic PLL reference clock selection for cold start */ - TFA9894N2_BF_FSSYNCEN = 0x0480, /*!< Enable FS synchronisation for clock divider */ - TFA9894N2_BF_CLKREFSYNCEN = 0x0490, /*!< Enable PLL reference clock synchronisation for clock divider */ - TFA9894N2_BF_PLLSTUP = 0x04a0, /*!< PLL startup time configuration */ - TFA9894N2_BF_CGUSYNCDCG = 0x0500, /*!< Clock gating control for CGU synchronisation module */ - TFA9894N2_BF_SPKSSEN = 0x0510, /*!< Enable speaker sub-system */ - TFA9894N2_BF_MTPSSEN = 0x0520, /*!< Enable FAIM sub-system */ - TFA9894N2_BF_WDTCLKEN = 0x0530, /*!< Enable Coolflux watchdog clock */ - TFA9894N2_BF_VDDS = 0x1000, /*!< POR */ - TFA9894N2_BF_PLLS = 0x1010, /*!< PLL Lock */ - TFA9894N2_BF_OTDS = 0x1020, /*!< OTP alarm */ - TFA9894N2_BF_OVDS = 0x1030, /*!< OVP alarm */ - TFA9894N2_BF_UVDS = 0x1040, /*!< UVP alarm */ - TFA9894N2_BF_OCDS = 0x1050, /*!< OCP amplifier (sticky register, clear on read) */ - TFA9894N2_BF_CLKS = 0x1060, /*!< Clocks stable */ - TFA9894N2_BF_MTPB = 0x1070, /*!< MTP busy */ - TFA9894N2_BF_NOCLK = 0x1080, /*!< Lost clock */ - TFA9894N2_BF_ACS = 0x1090, /*!< Cold Start */ - TFA9894N2_BF_WDS = 0x10a0, /*!< Watchdog */ - TFA9894N2_BF_SWS = 0x10b0, /*!< Amplifier engage */ - TFA9894N2_BF_AMPS = 0x10c0, /*!< Amplifier enable */ - TFA9894N2_BF_AREFS = 0x10d0, /*!< References enable */ - TFA9894N2_BF_ADCCR = 0x10e0, /*!< Control ADC */ - TFA9894N2_BF_BODNOK = 0x10f0, /*!< BOD Flag - VDD NOT OK */ - TFA9894N2_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9894N2_BF_DCDCA = 0x1110, /*!< DCDC active (sticky register, clear on read) */ - TFA9894N2_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos (sticky register, clear on read) */ - TFA9894N2_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ - TFA9894N2_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ - TFA9894N2_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ - TFA9894N2_BF_SPKS = 0x1170, /*!< Speaker status */ - TFA9894N2_BF_CLKOOR = 0x1180, /*!< External clock status */ - TFA9894N2_BF_MANALARM = 0x1190, /*!< Alarm state */ - TFA9894N2_BF_TDMERR = 0x11a0, /*!< TDM error */ - TFA9894N2_BF_TDMLUTER = 0x11b0, /*!< TDM lookup table error */ - TFA9894N2_BF_NOAUDCLK = 0x11c0, /*!< Lost Audio clock */ - TFA9894N2_BF_OCPOAP = 0x1200, /*!< OCPOK pmos A */ - TFA9894N2_BF_OCPOAN = 0x1210, /*!< OCPOK nmos A */ - TFA9894N2_BF_OCPOBP = 0x1220, /*!< OCPOK pmos B */ - TFA9894N2_BF_OCPOBN = 0x1230, /*!< OCPOK nmos B */ - TFA9894N2_BF_CLIPS = 0x1240, /*!< Amplifier clipping */ - TFA9894N2_BF_MANMUTE = 0x1250, /*!< Audio mute sequence */ - TFA9894N2_BF_MANOPER = 0x1260, /*!< Device in Operating state */ - TFA9894N2_BF_LP1 = 0x1270, /*!< Low power MODE1 detection */ - TFA9894N2_BF_LA = 0x1280, /*!< Low amplitude detection */ - TFA9894N2_BF_VDDPH = 0x1290, /*!< VDDP greater than VBAT flag */ - TFA9894N2_BF_TDMSTAT = 0x1302, /*!< TDM Status bits */ - TFA9894N2_BF_MANSTATE = 0x1333, /*!< Device Manager status */ - TFA9894N2_BF_DCMODE = 0x13b1, /*!< DCDC mode status bits */ - TFA9894N2_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9894N2_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9894N2_BF_VDDPS = 0x1709, /*!< IC VDDP voltage (1023*VDDP/13V) */ - TFA9894N2_BF_TDME = 0x2000, /*!< Enable interface */ - TFA9894N2_BF_TDMSPKE = 0x2010, /*!< Control audio tdm channel in sink0 */ - TFA9894N2_BF_TDMDCE = 0x2020, /*!< Control audio tdm channel in sink1 */ - TFA9894N2_BF_TDMCSE = 0x2030, /*!< Source 0 enable */ - TFA9894N2_BF_TDMVSE = 0x2040, /*!< Source 1 enable */ - TFA9894N2_BF_TDMCFE = 0x2050, /*!< Source 2 enable */ - TFA9894N2_BF_TDMCF2E = 0x2060, /*!< Source 3 enable */ - TFA9894N2_BF_TDMCLINV = 0x2070, /*!< Reception data to BCK clock */ - TFA9894N2_BF_TDMFSPOL = 0x2080, /*!< FS polarity */ - TFA9894N2_BF_TDMDEL = 0x2090, /*!< Data delay to FS */ - TFA9894N2_BF_TDMADJ = 0x20a0, /*!< Data adjustment */ - TFA9894N2_BF_TDMOOMP = 0x20b1, /*!< Received audio compression */ - TFA9894N2_BF_TDMNBCK = 0x2103, /*!< TDM NBCK - Bit clock to FS ratio */ - TFA9894N2_BF_TDMFSLN = 0x2143, /*!< FS length (master mode only) */ - TFA9894N2_BF_TDMSLOTS = 0x2183, /*!< N-slots in Frame */ - TFA9894N2_BF_TDMTXDFO = 0x21c1, /*!< Format unused bits */ - TFA9894N2_BF_TDMTXUS0 = 0x21e1, /*!< Format unused slots DATAO */ - TFA9894N2_BF_TDMSLLN = 0x2204, /*!< N-bits in slot */ - TFA9894N2_BF_TDMBRMG = 0x2254, /*!< N-bits remaining */ - TFA9894N2_BF_TDMSSIZE = 0x22a4, /*!< Sample size per slot */ - TFA9894N2_BF_TDMSPKS = 0x2303, /*!< TDM slot for sink 0 */ - TFA9894N2_BF_TDMDCS = 0x2343, /*!< TDM slot for sink 1 */ - TFA9894N2_BF_TDMCFSEL = 0x2381, /*!< TDM Source 2 data selection */ - TFA9894N2_BF_TDMCF2SEL = 0x23a1, /*!< TDM Source 3 data selection */ - TFA9894N2_BF_TDMCSS = 0x2403, /*!< Slot position of source 0 data */ - TFA9894N2_BF_TDMVSS = 0x2443, /*!< Slot position of source 1 data */ - TFA9894N2_BF_TDMCFS = 0x2483, /*!< Slot position of source 2 data */ - TFA9894N2_BF_TDMCF2S = 0x24c3, /*!< Slot position of source 3 data */ - TFA9894N2_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9894N2_BF_ISTBSTOC = 0x4010, /*!< Status DCDC OCP */ - TFA9894N2_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9894N2_BF_ISTOCPR = 0x4030, /*!< Status OCP alarm */ - TFA9894N2_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9894N2_BF_ISTMANALARM = 0x4050, /*!< Status manager alarm state */ - TFA9894N2_BF_ISTTDMER = 0x4060, /*!< Status TDM error */ - TFA9894N2_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9894N2_BF_ISTCFMER = 0x4080, /*!< Status cfma error */ - TFA9894N2_BF_ISTCFMAC = 0x4090, /*!< Status cfma ack */ - TFA9894N2_BF_ISTSPKS = 0x40a0, /*!< Status coolflux speaker error */ - TFA9894N2_BF_ISTACS = 0x40b0, /*!< Status cold started */ - TFA9894N2_BF_ISTWDS = 0x40c0, /*!< Status watchdog reset */ - TFA9894N2_BF_ISTBODNOK = 0x40d0, /*!< Status brown out detect */ - TFA9894N2_BF_ISTLP1 = 0x40e0, /*!< Status low power mode1 detect */ - TFA9894N2_BF_ISTCLKOOR = 0x40f0, /*!< Status clock out of range */ - TFA9894N2_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9894N2_BF_ICLBSTOC = 0x4410, /*!< Clear DCDC OCP */ - TFA9894N2_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9894N2_BF_ICLOCPR = 0x4430, /*!< Clear OCP alarm */ - TFA9894N2_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9894N2_BF_ICLMANALARM = 0x4450, /*!< Clear manager alarm state */ - TFA9894N2_BF_ICLTDMER = 0x4460, /*!< Clear TDM error */ - TFA9894N2_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9894N2_BF_ICLCFMER = 0x4480, /*!< Clear cfma err */ - TFA9894N2_BF_ICLCFMAC = 0x4490, /*!< Clear cfma ack */ - TFA9894N2_BF_ICLSPKS = 0x44a0, /*!< Clear coolflux speaker error */ - TFA9894N2_BF_ICLACS = 0x44b0, /*!< Clear cold started */ - TFA9894N2_BF_ICLWDS = 0x44c0, /*!< Clear watchdog reset */ - TFA9894N2_BF_ICLBODNOK = 0x44d0, /*!< Clear brown out detect */ - TFA9894N2_BF_ICLLP1 = 0x44e0, /*!< Clear low power mode1 detect */ - TFA9894N2_BF_ICLCLKOOR = 0x44f0, /*!< Clear clock out of range */ - TFA9894N2_BF_IEVDDS = 0x4800, /*!< Enable POR */ - TFA9894N2_BF_IEBSTOC = 0x4810, /*!< Enable DCDC OCP */ - TFA9894N2_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9894N2_BF_IEOCPR = 0x4830, /*!< Enable OCP alarm */ - TFA9894N2_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9894N2_BF_IEMANALARM = 0x4850, /*!< Enable Manager Alarm state */ - TFA9894N2_BF_IETDMER = 0x4860, /*!< Enable TDM error */ - TFA9894N2_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9894N2_BF_IECFMER = 0x4880, /*!< Enable cfma err */ - TFA9894N2_BF_IECFMAC = 0x4890, /*!< Enable cfma ack */ - TFA9894N2_BF_IESPKS = 0x48a0, /*!< Enable coolflux speaker error */ - TFA9894N2_BF_IEACS = 0x48b0, /*!< Enable cold started */ - TFA9894N2_BF_IEWDS = 0x48c0, /*!< Enable watchdog reset */ - TFA9894N2_BF_IEBODNOK = 0x48d0, /*!< Enable brown out detect */ - TFA9894N2_BF_IELP1 = 0x48e0, /*!< Enable low power mode1 detect */ - TFA9894N2_BF_IECLKOOR = 0x48f0, /*!< Enable clock out of range */ - TFA9894N2_BF_IPOVDDS = 0x4c00, /*!< Polarity POR */ - TFA9894N2_BF_IPOBSTOC = 0x4c10, /*!< Polarity DCDC OCP */ - TFA9894N2_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9894N2_BF_IPOOCPR = 0x4c30, /*!< Polarity ocp alarm */ - TFA9894N2_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9894N2_BF_IPOMANALARM = 0x4c50, /*!< Polarity manager alarm state */ - TFA9894N2_BF_IPOTDMER = 0x4c60, /*!< Polarity TDM error */ - TFA9894N2_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9894N2_BF_IPOCFMER = 0x4c80, /*!< Polarity cfma err */ - TFA9894N2_BF_IPOCFMAC = 0x4c90, /*!< Polarity cfma ack */ - TFA9894N2_BF_IPOSPKS = 0x4ca0, /*!< Polarity coolflux speaker error */ - TFA9894N2_BF_IPOACS = 0x4cb0, /*!< Polarity cold started */ - TFA9894N2_BF_IPOWDS = 0x4cc0, /*!< Polarity watchdog reset */ - TFA9894N2_BF_IPOBODNOK = 0x4cd0, /*!< Polarity brown out detect */ - TFA9894N2_BF_IPOLP1 = 0x4ce0, /*!< Polarity low power mode1 detect */ - TFA9894N2_BF_IPOCLKOOR = 0x4cf0, /*!< Polarity clock out of range */ - TFA9894N2_BF_BSSCR = 0x5001, /*!< Battery safeguard attack time */ - TFA9894N2_BF_BSST = 0x5023, /*!< Battery safeguard threshold voltage level */ - TFA9894N2_BF_BSSRL = 0x5061, /*!< Battery safeguard maximum reduction */ - TFA9894N2_BF_BSSRR = 0x5082, /*!< Battery safeguard release time */ - TFA9894N2_BF_BSSHY = 0x50b1, /*!< Battery Safeguard hysteresis */ - TFA9894N2_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9894N2_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ - TFA9894N2_BF_CFSM = 0x5130, /*!< Coolflux firmware soft mute control */ - TFA9894N2_BF_VOL = 0x5187, /*!< CF firmware volume control */ - TFA9894N2_BF_CLIPCTRL = 0x5202, /*!< Clip control setting */ - TFA9894N2_BF_SLOPEE = 0x5230, /*!< Enables slope control */ - TFA9894N2_BF_SLOPESET = 0x5240, /*!< Slope speed setting (binary coded) */ - TFA9894N2_BF_BYPDLYLINE = 0x5250, /*!< Bypass the interpolator delay line */ - TFA9894N2_BF_AMPGAIN = 0x5287, /*!< Amplifier gain */ - TFA9894N2_BF_TDMDCG = 0x5703, /*!< Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE) */ - TFA9894N2_BF_TDMSPKG = 0x5743, /*!< Total gain depending on INPLEV setting (channel 0) */ - TFA9894N2_BF_DCINSEL = 0x5781, /*!< VAMP_OUT2 input selection */ - TFA9894N2_BF_LNMODE = 0x5881, /*!< Low noise gain mode control */ - TFA9894N2_BF_LPM1MODE = 0x5ac1, /*!< Low power mode control */ - TFA9894N2_BF_TDMSRCMAP = 0x5d02, /*!< TDM source mapping */ - TFA9894N2_BF_TDMSRCAS = 0x5d31, /*!< Sensed value A */ - TFA9894N2_BF_TDMSRCBS = 0x5d51, /*!< Sensed value B */ - TFA9894N2_BF_TDMSRCACLIP = 0x5d71, /*!< Clip information (analog /digital) for source0 */ - TFA9894N2_BF_TDMSRCBCLIP = 0x5d91, /*!< Clip information (analog /digital) for source1 */ - TFA9894N2_BF_DELCURCOMP = 0x6102, /*!< Delay to allign compensation signal with current sense signal */ - TFA9894N2_BF_SIGCURCOMP = 0x6130, /*!< Polarity of compensation for current sense */ - TFA9894N2_BF_ENCURCOMP = 0x6140, /*!< Enable current sense compensation */ - TFA9894N2_BF_LVLCLPPWM = 0x6152, /*!< Set the amount of pwm pulse that may be skipped before clip-flag is triggered */ - TFA9894N2_BF_DCVOF = 0x7005, /*!< First Boost Voltage Level */ - TFA9894N2_BF_DCVOS = 0x7065, /*!< Second Boost Voltage Level */ - TFA9894N2_BF_DCMCC = 0x70c3, /*!< Max Coil Current */ - TFA9894N2_BF_DCCV = 0x7101, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ - TFA9894N2_BF_DCIE = 0x7120, /*!< Adaptive boost mode */ - TFA9894N2_BF_DCSR = 0x7130, /*!< Soft ramp up/down */ - TFA9894N2_BF_DCDIS = 0x7140, /*!< DCDC on/off */ - TFA9894N2_BF_DCPWM = 0x7150, /*!< DCDC PWM only mode */ - TFA9894N2_BF_DCTRACK = 0x7160, /*!< Boost algorithm selection, effective only when boost_intelligent is set to 1 */ - TFA9894N2_BF_DCENVSEL = 0x7170, /*!< Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1 */ - TFA9894N2_BF_OVSCTLVL = 0x7195, /*!< Threshold level to activate active overshoot control */ - TFA9894N2_BF_DCTRIP = 0x7204, /*!< 1st adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9894N2_BF_DCTRIP2 = 0x7254, /*!< 2nd adaptive boost trip levels, effective only when DCIE is set to 1 */ - TFA9894N2_BF_DCTRIPT = 0x72a4, /*!< Track adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9894N2_BF_DCTRIPHYSTE = 0x72f0, /*!< Enable hysteresis on booster trip levels */ - TFA9894N2_BF_DCHOLD = 0x7304, /*!< Hold time / Hysteresis for DCDC booster, effective only when boost_intelligent is set to 1 */ - TFA9894N2_BF_RST = 0x9000, /*!< Reset for Coolflux DSP */ - TFA9894N2_BF_DMEM = 0x9011, /*!< Target memory for CFMA using I2C interface */ - TFA9894N2_BF_AIF = 0x9030, /*!< Auto increment */ - TFA9894N2_BF_CFINT = 0x9040, /*!< Coolflux Interrupt - auto clear */ - TFA9894N2_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ - TFA9894N2_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ - TFA9894N2_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ - TFA9894N2_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ - TFA9894N2_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ - TFA9894N2_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ - TFA9894N2_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ - TFA9894N2_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ - TFA9894N2_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ - TFA9894N2_BF_MADD = 0x910f, /*!< CF memory address */ - TFA9894N2_BF_MEMA = 0x920f, /*!< Activate memory access */ - TFA9894N2_BF_ERR = 0x9307, /*!< CF error flags */ - TFA9894N2_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ - TFA9894N2_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ - TFA9894N2_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ - TFA9894N2_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ - TFA9894N2_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ - TFA9894N2_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ - TFA9894N2_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ - TFA9894N2_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ - TFA9894N2_BF_MTPK = 0xa107, /*!< KEY2 to access KEY2 protected registers, customer key */ - TFA9894N2_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9894N2_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9894N2_BF_CMTPI = 0xa350, /*!< Start copying all the data from mtp to I2C mtp registers - auto clear */ - TFA9894N2_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp - auto clear */ - TFA9894N2_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9894N2_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9894N2_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9894N2_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9894N2_BF_PLLINSELI = 0xca05, /*!< PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9894N2_BF_PLLINSELP = 0xca64, /*!< PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9894N2_BF_PLLINSELR = 0xcab3, /*!< PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1 */ - TFA9894N2_BF_PLLNDEC = 0xcb09, /*!< PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9894N2_BF_PLLMDECMSB = 0xcba0, /*!< MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9894N2_BF_PLLBYPASS = 0xcbb0, /*!< PLL bypass control during functional mode */ - TFA9894N2_BF_PLLDIRECTI = 0xcbc0, /*!< PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9894N2_BF_PLLDIRECTO = 0xcbd0, /*!< PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9894N2_BF_PLLFRMSTBL = 0xcbe0, /*!< PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9894N2_BF_PLLFRM = 0xcbf0, /*!< PLL free running mode control in functional mode */ - TFA9894N2_BF_PLLMDECLSB = 0xcc0f, /*!< Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9894N2_BF_PLLPDEC = 0xcd06, /*!< PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1 */ - TFA9894N2_BF_DIRECTPLL = 0xcd70, /*!< Enabled PLL direct control mode, overrules the PLL LUT with I2C register values */ - TFA9894N2_BF_DIRECTCLK = 0xcd80, /*!< Enabled CGU clock divider direct control mode */ - TFA9894N2_BF_PLLLIM = 0xcd90, /*!< PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1 */ - TFA9894N2_BF_SWPROFIL = 0xe00f, /*!< Software profile data */ - TFA9894N2_BF_SWVSTEP = 0xe10f, /*!< Software vstep information */ - TFA9894N2_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9894N2_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9894N2_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9894N2_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9894N2_BF_USERDEF = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9894N2_BF_CUSTINFO = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9894N2_BF_R25C = 0xf50f, /*!< Ron resistance of speaker coil */ -} Tfa9894N2BfEnumList_t; -#define TFA9894N2_NAMETABLE static tfaBfName_t Tfa9894N2DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown control , */\ - { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ - { 0x20, "CFE"}, /* Enable CoolFlux DSP , */\ - { 0x30, "AMPE"}, /* Enable Amplifier , */\ - { 0x40, "DCA"}, /* Enable DCDC Boost converter , */\ - { 0x50, "SBSL"}, /* Coolflux configured , */\ - { 0x60, "AMPC"}, /* CoolFlux control over amplifier , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0x90, "FSSSEL"}, /* Audio sample reference , */\ - { 0xa0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xb0, "TSTOCP"}, /* OCP testing control , */\ - { 0xc0, "BSSS"}, /* Vbat protection steepness , */\ - { 0xd0, "HPFBYP"}, /* Bypass High Pass Filter , */\ - { 0xe0, "DPSA"}, /* Enable DPSA , */\ - { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ - { 0x120, "MANSCONF"}, /* Device I2C settings configured , */\ - { 0x130, "MANCOLD"}, /* Execute cold start , */\ - { 0x140, "MANROBOD"}, /* Reaction on BOD , */\ - { 0x150, "BODE"}, /* Enable BOD (only in direct control mode) , */\ - { 0x160, "BODHYS"}, /* Enable Hysteresis of BOD , */\ - { 0x171, "BODFILT"}, /* BOD filter , */\ - { 0x191, "BODTHLVL"}, /* BOD threshold , */\ - { 0x1b0, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1c0, "MANWDE"}, /* Watchdog enable , */\ - { 0x1e0, "OPENMTP"}, /* Control for FAIM protection , */\ - { 0x1f0, "FAIMVBGOVRRL"}, /* Overrule the enabling of VBG for faim erase/write access, */\ - { 0x203, "AUDFS"}, /* Audio sample rate Fs , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* Current sense fractional delay , */\ - { 0x2b1, "TDMPRES"}, /* Control for HW manager , */\ - { 0x2d2, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x30f, "REV"}, /* Revision info , */\ - { 0x401, "REFCKEXT"}, /* PLL external reference clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal reference clock , */\ - { 0x432, "MCLKSEL"}, /* Master Clock Selection , */\ - { 0x460, "MANAOOSC"}, /* Internal OSC1M off at PWDN , */\ - { 0x470, "ACKCLDDIS"}, /* Automatic PLL reference clock selection for cold start, */\ - { 0x480, "FSSYNCEN"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "CLKREFSYNCEN"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "PLLSTUP"}, /* PLL startup time configuration , */\ - { 0x500, "CGUSYNCDCG"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "SPKSSEN"}, /* Enable speaker sub-system , */\ - { 0x520, "MTPSSEN"}, /* Enable FAIM sub-system , */\ - { 0x530, "WDTCLKEN"}, /* Enable Coolflux watchdog clock , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "PLLS"}, /* PLL Lock , */\ - { 0x1020, "OTDS"}, /* OTP alarm , */\ - { 0x1030, "OVDS"}, /* OVP alarm , */\ - { 0x1040, "UVDS"}, /* UVP alarm , */\ - { 0x1050, "OCDS"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1060, "CLKS"}, /* Clocks stable , */\ - { 0x1070, "MTPB"}, /* MTP busy , */\ - { 0x1080, "NOCLK"}, /* Lost clock , */\ - { 0x1090, "ACS"}, /* Cold Start , */\ - { 0x10a0, "WDS"}, /* Watchdog , */\ - { 0x10b0, "SWS"}, /* Amplifier engage , */\ - { 0x10c0, "AMPS"}, /* Amplifier enable , */\ - { 0x10d0, "AREFS"}, /* References enable , */\ - { 0x10e0, "ADCCR"}, /* Control ADC , */\ - { 0x10f0, "BODNOK"}, /* BOD Flag - VDD NOT OK , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1170, "SPKS"}, /* Speaker status , */\ - { 0x1180, "CLKOOR"}, /* External clock status , */\ - { 0x1190, "MANALARM"}, /* Alarm state , */\ - { 0x11a0, "TDMERR"}, /* TDM error , */\ - { 0x11b0, "TDMLUTER"}, /* TDM lookup table error , */\ - { 0x11c0, "NOAUDCLK"}, /* Lost Audio clock , */\ - { 0x1200, "OCPOAP"}, /* OCPOK pmos A , */\ - { 0x1210, "OCPOAN"}, /* OCPOK nmos A , */\ - { 0x1220, "OCPOBP"}, /* OCPOK pmos B , */\ - { 0x1230, "OCPOBN"}, /* OCPOK nmos B , */\ - { 0x1240, "CLIPS"}, /* Amplifier clipping , */\ - { 0x1250, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x1260, "MANOPER"}, /* Device in Operating state , */\ - { 0x1270, "LP1"}, /* Low power MODE1 detection , */\ - { 0x1280, "LA"}, /* Low amplitude detection , */\ - { 0x1290, "VDDPH"}, /* VDDP greater than VBAT flag , */\ - { 0x1302, "TDMSTAT"}, /* TDM Status bits , */\ - { 0x1333, "MANSTATE"}, /* Device Manager status , */\ - { 0x13b1, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ - { 0x2000, "TDME"}, /* Enable interface , */\ - { 0x2010, "TDMSPKE"}, /* Control audio tdm channel in sink0 , */\ - { 0x2020, "TDMDCE"}, /* Control audio tdm channel in sink1 , */\ - { 0x2030, "TDMCSE"}, /* Source 0 enable , */\ - { 0x2040, "TDMVSE"}, /* Source 1 enable , */\ - { 0x2050, "TDMCFE"}, /* Source 2 enable , */\ - { 0x2060, "TDMCF2E"}, /* Source 3 enable , */\ - { 0x2070, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2080, "TDMFSPOL"}, /* FS polarity , */\ - { 0x2090, "TDMDEL"}, /* Data delay to FS , */\ - { 0x20a0, "TDMADJ"}, /* Data adjustment , */\ - { 0x20b1, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2103, "TDMNBCK"}, /* TDM NBCK - Bit clock to FS ratio , */\ - { 0x2143, "TDMFSLN"}, /* FS length (master mode only) , */\ - { 0x2183, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x21c1, "TDMTXDFO"}, /* Format unused bits , */\ - { 0x21e1, "TDMTXUS0"}, /* Format unused slots DATAO , */\ - { 0x2204, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2254, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x22a4, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2303, "TDMSPKS"}, /* TDM slot for sink 0 , */\ - { 0x2343, "TDMDCS"}, /* TDM slot for sink 1 , */\ - { 0x2381, "TDMCFSEL"}, /* TDM Source 2 data selection , */\ - { 0x23a1, "TDMCF2SEL"}, /* TDM Source 3 data selection , */\ - { 0x2403, "TDMCSS"}, /* Slot position of source 0 data , */\ - { 0x2443, "TDMVSS"}, /* Slot position of source 1 data , */\ - { 0x2483, "TDMCFS"}, /* Slot position of source 2 data , */\ - { 0x24c3, "TDMCF2S"}, /* Slot position of source 3 data , */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOCPR"}, /* Status OCP alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTMANALARM"}, /* Status manager alarm state , */\ - { 0x4060, "ISTTDMER"}, /* Status TDM error , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4080, "ISTCFMER"}, /* Status cfma error , */\ - { 0x4090, "ISTCFMAC"}, /* Status cfma ack , */\ - { 0x40a0, "ISTSPKS"}, /* Status coolflux speaker error , */\ - { 0x40b0, "ISTACS"}, /* Status cold started , */\ - { 0x40c0, "ISTWDS"}, /* Status watchdog reset , */\ - { 0x40d0, "ISTBODNOK"}, /* Status brown out detect , */\ - { 0x40e0, "ISTLP1"}, /* Status low power mode1 detect , */\ - { 0x40f0, "ISTCLKOOR"}, /* Status clock out of range , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOCPR"}, /* Clear OCP alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLMANALARM"}, /* Clear manager alarm state , */\ - { 0x4460, "ICLTDMER"}, /* Clear TDM error , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4480, "ICLCFMER"}, /* Clear cfma err , */\ - { 0x4490, "ICLCFMAC"}, /* Clear cfma ack , */\ - { 0x44a0, "ICLSPKS"}, /* Clear coolflux speaker error , */\ - { 0x44b0, "ICLACS"}, /* Clear cold started , */\ - { 0x44c0, "ICLWDS"}, /* Clear watchdog reset , */\ - { 0x44d0, "ICLBODNOK"}, /* Clear brown out detect , */\ - { 0x44e0, "ICLLP1"}, /* Clear low power mode1 detect , */\ - { 0x44f0, "ICLCLKOOR"}, /* Clear clock out of range , */\ - { 0x4800, "IEVDDS"}, /* Enable POR , */\ - { 0x4810, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOCPR"}, /* Enable OCP alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IEMANALARM"}, /* Enable Manager Alarm state , */\ - { 0x4860, "IETDMER"}, /* Enable TDM error , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4880, "IECFMER"}, /* Enable cfma err , */\ - { 0x4890, "IECFMAC"}, /* Enable cfma ack , */\ - { 0x48a0, "IESPKS"}, /* Enable coolflux speaker error , */\ - { 0x48b0, "IEACS"}, /* Enable cold started , */\ - { 0x48c0, "IEWDS"}, /* Enable watchdog reset , */\ - { 0x48d0, "IEBODNOK"}, /* Enable brown out detect , */\ - { 0x48e0, "IELP1"}, /* Enable low power mode1 detect , */\ - { 0x48f0, "IECLKOOR"}, /* Enable clock out of range , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity POR , */\ - { 0x4c10, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOCPR"}, /* Polarity ocp alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOMANALARM"}, /* Polarity manager alarm state , */\ - { 0x4c60, "IPOTDMER"}, /* Polarity TDM error , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x4c80, "IPOCFMER"}, /* Polarity cfma err , */\ - { 0x4c90, "IPOCFMAC"}, /* Polarity cfma ack , */\ - { 0x4ca0, "IPOSPKS"}, /* Polarity coolflux speaker error , */\ - { 0x4cb0, "IPOACS"}, /* Polarity cold started , */\ - { 0x4cc0, "IPOWDS"}, /* Polarity watchdog reset , */\ - { 0x4cd0, "IPOBODNOK"}, /* Polarity brown out detect , */\ - { 0x4ce0, "IPOLP1"}, /* Polarity low power mode1 detect , */\ - { 0x4cf0, "IPOCLKOOR"}, /* Polarity clock out of range , */\ - { 0x5001, "BSSCR"}, /* Battery safeguard attack time , */\ - { 0x5023, "BSST"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery safeguard maximum reduction , */\ - { 0x5082, "BSSRR"}, /* Battery safeguard release time , */\ - { 0x50b1, "BSSHY"}, /* Battery Safeguard hysteresis , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ - { 0x5130, "CFSM"}, /* Coolflux firmware soft mute control , */\ - { 0x5187, "VOL"}, /* CF firmware volume control , */\ - { 0x5202, "CLIPCTRL"}, /* Clip control setting , */\ - { 0x5230, "SLOPEE"}, /* Enables slope control , */\ - { 0x5240, "SLOPESET"}, /* Slope speed setting (binary coded) , */\ - { 0x5250, "BYPDLYLINE"}, /* Bypass the interpolator delay line , */\ - { 0x5287, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x5703, "TDMDCG"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x5743, "TDMSPKG"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x5781, "DCINSEL"}, /* VAMP_OUT2 input selection , */\ - { 0x5881, "LNMODE"}, /* Low noise gain mode control , */\ - { 0x5ac1, "LPM1MODE"}, /* Low power mode control , */\ - { 0x5d02, "TDMSRCMAP"}, /* TDM source mapping , */\ - { 0x5d31, "TDMSRCAS"}, /* Sensed value A , */\ - { 0x5d51, "TDMSRCBS"}, /* Sensed value B , */\ - { 0x5d71, "TDMSRCACLIP"}, /* Clip information (analog /digital) for source0 , */\ - { 0x5d91, "TDMSRCBCLIP"}, /* Clip information (analog /digital) for source1 , */\ - { 0x6102, "DELCURCOMP"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6130, "SIGCURCOMP"}, /* Polarity of compensation for current sense , */\ - { 0x6140, "ENCURCOMP"}, /* Enable current sense compensation , */\ - { 0x6152, "LVLCLPPWM"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7005, "DCVOF"}, /* First Boost Voltage Level , */\ - { 0x7065, "DCVOS"}, /* Second Boost Voltage Level , */\ - { 0x70c3, "DCMCC"}, /* Max Coil Current , */\ - { 0x7101, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7120, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7130, "DCSR"}, /* Soft ramp up/down , */\ - { 0x7140, "DCDIS"}, /* DCDC on/off , */\ - { 0x7150, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7160, "DCTRACK"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7170, "DCENVSEL"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7195, "OVSCTLVL"}, /* Threshold level to activate active overshoot control, */\ - { 0x7204, "DCTRIP"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7254, "DCTRIP2"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x72a4, "DCTRIPT"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x72f0, "DCTRIPHYSTE"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7304, "DCHOLD"}, /* Hold time / Hysteresis for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x9000, "RST"}, /* Reset for Coolflux DSP , */\ - { 0x9011, "DMEM"}, /* Target memory for CFMA using I2C interface , */\ - { 0x9030, "AIF"}, /* Auto increment , */\ - { 0x9040, "CFINT"}, /* Coolflux Interrupt - auto clear , */\ - { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ - { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ - { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ - { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ - { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ - { 0x910f, "MADD"}, /* CF memory address , */\ - { 0x920f, "MEMA"}, /* Activate memory access , */\ - { 0x9307, "ERR"}, /* CF error flags , */\ - { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ - { 0xa107, "MTPK"}, /* KEY2 to access KEY2 protected registers, customer key, */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa350, "CMTPI"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ - { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xca05, "PLLINSELI"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xca64, "PLLINSELP"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcab3, "PLLINSELR"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcb09, "PLLNDEC"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcba0, "PLLMDECMSB"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbb0, "PLLBYPASS"}, /* PLL bypass control during functional mode , */\ - { 0xcbc0, "PLLDIRECTI"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbd0, "PLLDIRECTO"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbe0, "PLLFRMSTBL"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbf0, "PLLFRM"}, /* PLL free running mode control in functional mode , */\ - { 0xcc0f, "PLLMDECLSB"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcd06, "PLLPDEC"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcd70, "DIRECTPLL"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xcd80, "DIRECTCLK"}, /* Enabled CGU clock divider direct control mode , */\ - { 0xcd90, "PLLLIM"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xe00f, "SWPROFIL"}, /* Software profile data , */\ - { 0xe10f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "USERDEF"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "CUSTINFO"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf50f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9894N2_BITNAMETABLE static tfaBfName_t Tfa9894N2BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown control , */\ - { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ - { 0x20, "enbl_coolflux"}, /* Enable CoolFlux DSP , */\ - { 0x30, "enbl_amplifier"}, /* Enable Amplifier , */\ - { 0x40, "enbl_boost"}, /* Enable DCDC Boost converter , */\ - { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ - { 0x60, "sel_enbl_amplifier"}, /* CoolFlux control over amplifier , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ - { 0xa0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xb0, "test_ocp"}, /* OCP testing control , */\ - { 0xc0, "batsense_steepness"}, /* Vbat protection steepness , */\ - { 0xd0, "bypass_hp"}, /* Bypass High Pass Filter , */\ - { 0xe0, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0xf0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ - { 0x101, "vamp_sel1"}, /* Amplifier input selection , */\ - { 0x120, "src_set_configured"}, /* Device I2C settings configured , */\ - { 0x130, "execute_cold_start"}, /* Execute cold start , */\ - { 0x140, "man_enbl_brown_out"}, /* Reaction on BOD , */\ - { 0x150, "bod_enbl"}, /* Enable BOD (only in direct control mode) , */\ - { 0x160, "bod_hyst_enbl"}, /* Enable Hysteresis of BOD , */\ - { 0x171, "bod_delay_set"}, /* BOD filter , */\ - { 0x191, "bod_lvl_set"}, /* BOD threshold , */\ - { 0x1b0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x1c0, "man_enbl_watchdog"}, /* Watchdog enable , */\ - { 0x1d0, "disable_engage"}, /* Disable Engage , */\ - { 0x1e0, "unprotect_faim"}, /* Control for FAIM protection , */\ - { 0x1f0, "faim_enable_vbg"}, /* Overrule the enabling of VBG for faim erase/write access, */\ - { 0x203, "audio_fs"}, /* Audio sample rate Fs , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* Current sense fractional delay , */\ - { 0x2b1, "use_tdm_presence"}, /* Control for HW manager , */\ - { 0x2d2, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x30f, "device_rev"}, /* Revision info , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external reference clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal reference clock , */\ - { 0x432, "mclk_sel"}, /* Master Clock Selection , */\ - { 0x460, "enbl_osc1m_auto_off"}, /* Internal OSC1M off at PWDN , */\ - { 0x470, "disable_auto_sel_refclk"}, /* Automatic PLL reference clock selection for cold start, */\ - { 0x480, "enbl_fs_sync"}, /* Enable FS synchronisation for clock divider , */\ - { 0x490, "enbl_clkref_sync"}, /* Enable PLL reference clock synchronisation for clock divider, */\ - { 0x4a0, "pll_slow_startup"}, /* PLL startup time configuration , */\ - { 0x500, "disable_cgu_sync_cgate"}, /* Clock gating control for CGU synchronisation module, */\ - { 0x510, "enbl_spkr_ss"}, /* Enable speaker sub-system , */\ - { 0x520, "enbl_faim_ss"}, /* Enable FAIM sub-system , */\ - { 0x530, "enbl_wdt_clk"}, /* Enable Coolflux watchdog clock , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* Hidden code to enable access to hidden register. (0x5A6B/23147 default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_pll_lock"}, /* PLL Lock , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm , */\ - { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ - { 0x1050, "flag_ocp_alarm"}, /* OCP amplifier (sticky register, clear on read) , */\ - { 0x1060, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1070, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1080, "flag_lost_clk"}, /* Lost clock , */\ - { 0x1090, "flag_cold_started"}, /* Cold Start , */\ - { 0x10a0, "flag_watchdog_reset"}, /* Watchdog , */\ - { 0x10b0, "flag_engage"}, /* Amplifier engage , */\ - { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ - { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x10f0, "flag_bod_vddd_nok"}, /* BOD Flag - VDD NOT OK , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active (sticky register, clear on read) , */\ - { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos (sticky register, clear on read) , */\ - { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1170, "flag_cf_speakererror"}, /* Speaker status , */\ - { 0x1180, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x1190, "flag_man_alarm_state"}, /* Alarm state , */\ - { 0x11a0, "flag_tdm_error"}, /* TDM error , */\ - { 0x11b0, "flag_tdm_lut_error"}, /* TDM lookup table error , */\ - { 0x11c0, "flag_lost_audio_clk"}, /* Lost Audio clock , */\ - { 0x1200, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1210, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1220, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1230, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1240, "flag_clip"}, /* Amplifier clipping , */\ - { 0x1250, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x1260, "flag_man_operating_state"}, /* Device in Operating state , */\ - { 0x1270, "flag_lp_detect_mode1"}, /* Low power MODE1 detection , */\ - { 0x1280, "flag_low_amplitude"}, /* Low amplitude detection , */\ - { 0x1290, "flag_vddp_gt_vbat"}, /* VDDP greater than VBAT flag , */\ - { 0x1302, "tdm_status"}, /* TDM Status bits , */\ - { 0x1333, "man_state"}, /* Device Manager status , */\ - { 0x1373, "amp_ctrl_state"}, /* Amplifier control status , */\ - { 0x13b1, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage (1023*VDDP/13V) , */\ - { 0x2000, "tdm_enable"}, /* Enable interface , */\ - { 0x2010, "tdm_sink0_enable"}, /* Control audio tdm channel in sink0 , */\ - { 0x2020, "tdm_sink1_enable"}, /* Control audio tdm channel in sink1 , */\ - { 0x2030, "tdm_source0_enable"}, /* Source 0 enable , */\ - { 0x2040, "tdm_source1_enable"}, /* Source 1 enable , */\ - { 0x2050, "tdm_source2_enable"}, /* Source 2 enable , */\ - { 0x2060, "tdm_source3_enable"}, /* Source 3 enable , */\ - { 0x2070, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2080, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x2090, "tdm_data_delay"}, /* Data delay to FS , */\ - { 0x20a0, "tdm_data_adjustment"}, /* Data adjustment , */\ - { 0x20b1, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2103, "tdm_nbck"}, /* TDM NBCK - Bit clock to FS ratio , */\ - { 0x2143, "tdm_fs_ws_length"}, /* FS length (master mode only) , */\ - { 0x2183, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x21c1, "tdm_txdata_format"}, /* Format unused bits , */\ - { 0x21e1, "tdm_txdata_format_unused_slot"}, /* Format unused slots DATAO , */\ - { 0x2204, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2254, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x22a4, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2303, "tdm_sink0_slot"}, /* TDM slot for sink 0 , */\ - { 0x2343, "tdm_sink1_slot"}, /* TDM slot for sink 1 , */\ - { 0x2381, "tdm_source2_sel"}, /* TDM Source 2 data selection , */\ - { 0x23a1, "tdm_source3_sel"}, /* TDM Source 3 data selection , */\ - { 0x2403, "tdm_source0_slot"}, /* Slot position of source 0 data , */\ - { 0x2443, "tdm_source1_slot"}, /* Slot position of source 1 data , */\ - { 0x2483, "tdm_source2_slot"}, /* Slot position of source 2 data , */\ - { 0x24c3, "tdm_source3_slot"}, /* Slot position of source 3 data , */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ocp_alarm"}, /* Status OCP alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_man_alarm_state"}, /* Status manager alarm state , */\ - { 0x4060, "int_out_flag_tdm_error"}, /* Status TDM error , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4080, "int_out_flag_cfma_err"}, /* Status cfma error , */\ - { 0x4090, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ - { 0x40a0, "int_out_flag_cf_speakererror"}, /* Status coolflux speaker error , */\ - { 0x40b0, "int_out_flag_cold_started"}, /* Status cold started , */\ - { 0x40c0, "int_out_flag_watchdog_reset"}, /* Status watchdog reset , */\ - { 0x40d0, "int_out_flag_bod_vddd_nok"}, /* Status brown out detect , */\ - { 0x40e0, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 detect , */\ - { 0x40f0, "int_out_flag_clk_out_of_range"}, /* Status clock out of range , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ocp_alarm"}, /* Clear OCP alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_man_alarm_state"}, /* Clear manager alarm state , */\ - { 0x4460, "int_in_flag_tdm_error"}, /* Clear TDM error , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4480, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ - { 0x4490, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ - { 0x44a0, "int_in_flag_cf_speakererror"}, /* Clear coolflux speaker error , */\ - { 0x44b0, "int_in_flag_cold_started"}, /* Clear cold started , */\ - { 0x44c0, "int_in_flag_watchdog_reset"}, /* Clear watchdog reset , */\ - { 0x44d0, "int_in_flag_bod_vddd_nok"}, /* Clear brown out detect , */\ - { 0x44e0, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 detect , */\ - { 0x44f0, "int_in_flag_clk_out_of_range"}, /* Clear clock out of range , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable POR , */\ - { 0x4810, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ocp_alarm"}, /* Enable OCP alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_man_alarm_state"}, /* Enable Manager Alarm state , */\ - { 0x4860, "int_enable_flag_tdm_error"}, /* Enable TDM error , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4880, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ - { 0x4890, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ - { 0x48a0, "int_enable_flag_cf_speakererror"}, /* Enable coolflux speaker error , */\ - { 0x48b0, "int_enable_flag_cold_started"}, /* Enable cold started , */\ - { 0x48c0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog reset , */\ - { 0x48d0, "int_enable_flag_bod_vddd_nok"}, /* Enable brown out detect , */\ - { 0x48e0, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 detect , */\ - { 0x48f0, "int_enable_flag_clk_out_of_range"}, /* Enable clock out of range , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity POR , */\ - { 0x4c10, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_man_alarm_state"}, /* Polarity manager alarm state , */\ - { 0x4c60, "int_polarity_flag_tdm_error"}, /* Polarity TDM error , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x4c80, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ - { 0x4c90, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ - { 0x4ca0, "int_polarity_flag_cf_speakererror"}, /* Polarity coolflux speaker error , */\ - { 0x4cb0, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ - { 0x4cc0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog reset , */\ - { 0x4cd0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity brown out detect , */\ - { 0x4ce0, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 detect , */\ - { 0x4cf0, "int_polarity_flag_clk_out_of_range"}, /* Polarity clock out of range , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery safeguard attack time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery safeguard maximum reduction , */\ - { 0x5082, "vbat_prot_release_time"}, /* Battery safeguard release time , */\ - { 0x50b1, "vbat_prot_hysterese"}, /* Battery Safeguard hysteresis , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ - { 0x5130, "cf_mute"}, /* Coolflux firmware soft mute control , */\ - { 0x5187, "cf_volume"}, /* CF firmware volume control , */\ - { 0x5202, "ctrl_cc"}, /* Clip control setting , */\ - { 0x5230, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x5240, "ctrl_slope"}, /* Slope speed setting (binary coded) , */\ - { 0x5250, "bypass_dly_line"}, /* Bypass the interpolator delay line , */\ - { 0x5287, "gain"}, /* Amplifier gain , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ - { 0x5340, "clipfast"}, /* Clock selection for HW clipper for battery safeguard, */\ - { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ - { 0x5360, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ - { 0x5370, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5380, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5390, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x53a3, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ - { 0x5400, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5413, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5452, "dpsa_drive"}, /* Drive setting (binary coded) , */\ - { 0x550a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually, */\ - { 0x55b0, "enbl_engage"}, /* Enables/engage power stage and control loop , */\ - { 0x55c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ - { 0x5600, "pwm_shape"}, /* PWM shape , */\ - { 0x5614, "pwm_delay"}, /* PWM delay bits to set the delay, clockd is 1/(k*2048*fs), */\ - { 0x5660, "reclock_pwm"}, /* Reclock the PWM signal inside analog , */\ - { 0x5670, "reclock_voltsense"}, /* Reclock the voltage sense PWM signal , */\ - { 0x5680, "enbl_pwm_phase_shift"}, /* Control for PWM phase shift , */\ - { 0x5690, "sel_pwm_delay_src"}, /* Control for selection for PWM delay line source , */\ - { 0x56a1, "enbl_odd_up_even_down"}, /* Control for PWM reference sawtooth generartion , */\ - { 0x5703, "ctrl_att_dcdc"}, /* Second channel gain in case of stereo using a single coil. (Total gain depending on INPLEV). (In case of mono OR stereo using 2 separate DCDC channel 1 should be disabled using TDMDCE), */\ - { 0x5743, "ctrl_att_spkr"}, /* Total gain depending on INPLEV setting (channel 0), */\ - { 0x5781, "vamp_sel2"}, /* VAMP_OUT2 input selection , */\ - { 0x5805, "zero_lvl"}, /* Low noise gain switch zero trigger level , */\ - { 0x5861, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ - { 0x5881, "lownoisegain_mode"}, /* Low noise gain mode control , */\ - { 0x5905, "threshold_lvl"}, /* Low noise gain switch trigger level , */\ - { 0x5965, "hold_time"}, /* Low noise mode hold time before entering into low noise mode, */\ - { 0x5a05, "lpm1_cal_offset"}, /* Low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x5a65, "lpm1_zero_lvl"}, /* Low power mode1 zero crossing detection level , */\ - { 0x5ac1, "lpm1_mode"}, /* Low power mode control , */\ - { 0x5b05, "lpm1_threshold_lvl"}, /* Low power mode1 amplitude trigger level , */\ - { 0x5b65, "lpm1_hold_time"}, /* Low power mode hold time before entering into low power mode, */\ - { 0x5bc0, "disable_low_power_mode"}, /* Low power mode1 detector control , */\ - { 0x5c00, "enbl_minion"}, /* Enables minion (small) power stage , */\ - { 0x5c13, "vth_vddpvbat"}, /* Select vddp-vbat threshold signal , */\ - { 0x5c50, "lpen_vddpvbat"}, /* Select vddp-vbat filtred vs unfiltered compare , */\ - { 0x5c61, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ - { 0x5d02, "tdm_source_mapping"}, /* TDM source mapping , */\ - { 0x5d31, "tdm_sourcea_frame_sel"}, /* Sensed value A , */\ - { 0x5d51, "tdm_sourceb_frame_sel"}, /* Sensed value B , */\ - { 0x5d71, "tdm_source0_clip_sel"}, /* Clip information (analog /digital) for source0 , */\ - { 0x5d91, "tdm_source1_clip_sel"}, /* Clip information (analog /digital) for source1 , */\ - { 0x5e02, "rst_min_vbat_delay"}, /* Delay for reseting the min_vbat value inside HW Clipper (number of Fs pulses), */\ - { 0x5e30, "rst_min_vbat_sel"}, /* Control for selecting reset signal for min_bat , */\ - { 0x5f00, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5f12, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x5f42, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x5f78, "spare_out"}, /* Spare out register , */\ - { 0x600f, "spare_in"}, /* Spare IN , */\ - { 0x6102, "cursense_comp_delay"}, /* Delay to allign compensation signal with current sense signal, */\ - { 0x6130, "cursense_comp_sign"}, /* Polarity of compensation for current sense , */\ - { 0x6140, "enbl_cursense_comp"}, /* Enable current sense compensation , */\ - { 0x6152, "pwms_clip_lvl"}, /* Set the amount of pwm pulse that may be skipped before clip-flag is triggered, */\ - { 0x7005, "frst_boost_voltage"}, /* First Boost Voltage Level , */\ - { 0x7065, "scnd_boost_voltage"}, /* Second Boost Voltage Level , */\ - { 0x70c3, "boost_cur"}, /* Max Coil Current , */\ - { 0x7101, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7120, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7130, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x7140, "dcdcoff_mode"}, /* DCDC on/off , */\ - { 0x7150, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7160, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7170, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x7180, "ignore_flag_voutcomp86"}, /* Determines the maximum PWM frequency be the most efficient in relation to the Booster inductor value, */\ - { 0x7195, "overshoot_correction_lvl"}, /* Threshold level to activate active overshoot control, */\ - { 0x7204, "boost_trip_lvl_1st"}, /* 1st adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x7254, "boost_trip_lvl_2nd"}, /* 2nd adaptive boost trip levels, effective only when DCIE is set to 1, */\ - { 0x72a4, "boost_trip_lvl_track"}, /* Track adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x72f0, "enbl_trip_hyst"}, /* Enable hysteresis on booster trip levels , */\ - { 0x7304, "boost_hold_time"}, /* Hold time / Hysteresis for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x7350, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ - { 0x7361, "dcdc_ctrl_maxzercnt"}, /* Number of zero current flags to count before going to pfm mode, */\ - { 0x7386, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x73f0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x7404, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7451, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7474, "bst_slopecur"}, /* For testing direct control slope current , */\ - { 0x74c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x74e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x74f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7500, "enbl_bst_engage"}, /* Enable power stage dcdc controller , */\ - { 0x7510, "enbl_bst_hizcom"}, /* Enable hiz comparator , */\ - { 0x7520, "enbl_bst_peakcur"}, /* Enable peak current , */\ - { 0x7530, "enbl_bst_power"}, /* Enable line of the powerstage , */\ - { 0x7540, "enbl_bst_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x7550, "enbl_bst_voutcomp"}, /* Enable vout comparators , */\ - { 0x7560, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x7570, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x7580, "enbl_bst_windac"}, /* Enable window dac , */\ - { 0x7595, "bst_windac"}, /* For testing direct control windac , */\ - { 0x7600, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7611, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7631, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7650, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7660, "bst_use_new_zercur_detect"}, /* Enable new zero current detection for boost control, */\ - { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ - { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ - { 0x8040, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8050, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8060, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8105, "cs_ktemp"}, /* Current sense temperature compensation trimming (1 - VALUE*TEMP) * signal, */\ - { 0x8164, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ - { 0x81b0, "enbl_cs_adc"}, /* Enable current sense ADC , */\ - { 0x81c0, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 , */\ - { 0x81d0, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 , */\ - { 0x81e0, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x81f0, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 , */\ - { 0x8200, "enbl_cs_ldo"}, /* Enable current sense LDO , */\ - { 0x8210, "enbl_cs_vbatldo"}, /* Enable of current sense LDO , */\ - { 0x8220, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8231, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ - { 0x8250, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x8263, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ - { 0x82a0, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x82b4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ - { 0x8300, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ - { 0x8310, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8320, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8330, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8340, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8350, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if enbl_cs_ldo is high, */\ - { 0x8364, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8800, "ctrl_vs_igen_supply"}, /* Control for selecting supply for VS current generator, */\ - { 0x8810, "ctrl_vs_force_div2"}, /* Select input resistive divider gain , */\ - { 0x8820, "enbl_dc_filter"}, /* Control for enabling the DC blocking filter for voltage and current sense, */\ - { 0x8901, "volsense_pwm_sel"}, /* Voltage sense source selection control , */\ - { 0x8920, "vs_gain_control"}, /* Voltage sense gain control , */\ - { 0x8930, "vs_bypass_gc"}, /* Bypasses the VS gain correction , */\ - { 0x8940, "vs_adc_bsoinv"}, /* Bitstream inversion for voltage sense ADC , */\ - { 0x8950, "vs_adc_nortz"}, /* Return to zero for voltage sense ADC , */\ - { 0x8960, "vs_adc_slowdel"}, /* Select delay for voltage sense ADC (internal decision circuitry), */\ - { 0x8970, "vs_classd_tran_skip"}, /* Skip voltage sense connection during a classD amplifier transition, */\ - { 0x8987, "vs_gain"}, /* Voltage sense gain , */\ - { 0x8a00, "vs_inn_short"}, /* Short voltage sense negative to common mode , */\ - { 0x8a10, "vs_inp_short"}, /* Short voltage sense positive to common mode , */\ - { 0x8a20, "vs_ldo_bypass"}, /* Bypass voltage sense LDO , */\ - { 0x8a30, "vs_ldo_pulldown"}, /* Pull down voltage sense LDO, only valid if enbl_cs_ldo is high, */\ - { 0x8a44, "vs_ldo_voset"}, /* Voltage sense LDO voltage level setting (two's complement), */\ - { 0x8a90, "enbl_vs_adc"}, /* Enable voltage sense ADC , */\ - { 0x8aa0, "enbl_vs_inn1"}, /* Enable connection of voltage sense negative1 , */\ - { 0x8ab0, "enbl_vs_inn2"}, /* Enable connection of voltage sense negative2 , */\ - { 0x8ac0, "enbl_vs_inp1"}, /* Enable connection of voltage sense positive1 , */\ - { 0x8ad0, "enbl_vs_inp2"}, /* Enable connection of voltage sense positive2 , */\ - { 0x8ae0, "enbl_vs_ldo"}, /* Enable voltage sense LDO , */\ - { 0x8af0, "enbl_vs_vbatldo"}, /* Enable of voltage sense LDO , */\ - { 0x9000, "cf_rst_dsp"}, /* Reset for Coolflux DSP , */\ - { 0x9011, "cf_dmem"}, /* Target memory for CFMA using I2C interface , */\ - { 0x9030, "cf_aif"}, /* Auto increment , */\ - { 0x9040, "cf_int"}, /* Coolflux Interrupt - auto clear , */\ - { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ - { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ - { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ - { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ - { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ - { 0x910f, "cf_madd"}, /* CF memory address , */\ - { 0x920f, "cf_mema"}, /* Activate memory access , */\ - { 0x9307, "cf_err"}, /* CF error flags , */\ - { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ - { 0xa007, "mtpkey1"}, /* KEY1 To access KEY1 protected registers 0x5A/90d (default for engineering), */\ - { 0xa107, "mtpkey2"}, /* KEY2 to access KEY2 protected registers, customer key, */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from MTP to I2C mtp register - auto clear, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp - auto clear, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers - auto clear, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp - auto clear, */\ - { 0xa400, "faim_set_clkws"}, /* Sets the FaIM controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the FaIM are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the FaIM are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb000, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb010, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb020, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb030, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb040, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb050, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb060, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb070, "disable_main_ctrl_change_prot"}, /* Disable main control change protection , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually, */\ - { 0xc0c0, "use_direct_vs_ctrls"}, /* Voltage sense direct control to overrule several functions for testing, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "enbl_pll"}, /* Enables PLL in I2C direct control mode only , */\ - { 0xc0f0, "enbl_osc"}, /* Enables OSC in I2C direct control mode only , */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ - { 0xc3d0, "test_abistfft_enbl"}, /* Enable ABIST with FFT on Coolflux DSP , */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost Converter Over Current Protection , */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc530, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc540, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc550, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc560, "test_enbl_vs"}, /* Enable for digimux mode of voltage sense , */\ - { 0xc570, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc583, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc5c0, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc607, "digimuxa_sel"}, /* DigimuxA input selection control routed to DATAO , */\ - { 0xc687, "digimuxb_sel"}, /* DigimuxB input selection control routed to INT , */\ - { 0xc707, "digimuxc_sel"}, /* DigimuxC input selection control routed to ADS1 , */\ - { 0xc800, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xc810, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xc820, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xc830, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xc844, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xc894, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xc903, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ - { 0xc943, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ - { 0xca05, "pll_inseli"}, /* PLL INSELI - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xca64, "pll_inselp"}, /* PLL INSELP - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcab3, "pll_inselr"}, /* PLL INSELR - PLL direct bandwidth control mode only with pll_bandsel set to 1, */\ - { 0xcaf0, "pll_bandsel"}, /* PLL bandwidth selection control, USE WITH CAUTION , */\ - { 0xcb09, "pll_ndec"}, /* PLL NDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcba0, "pll_mdec_msb"}, /* MSB of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbb0, "pll_bypass"}, /* PLL bypass control during functional mode , */\ - { 0xcbc0, "pll_directi"}, /* PLL directi control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbd0, "pll_directo"}, /* PLL directo control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbe0, "pll_frm_clockstable"}, /* PLL FRM clock stable control in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcbf0, "pll_frm"}, /* PLL free running mode control in functional mode , */\ - { 0xcc0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcd06, "pll_pdec"}, /* PLL PDEC in direct control mode only, use_direct_pll_ctrl set to 1, */\ - { 0xcd70, "use_direct_pll_ctrl"}, /* Enabled PLL direct control mode, overrules the PLL LUT with I2C register values, */\ - { 0xcd80, "use_direct_clk_ctrl"}, /* Enabled CGU clock divider direct control mode , */\ - { 0xcd90, "pll_limup_off"}, /* PLL up limiter control in PLL direct bandwidth control mode, pll_bandsel set to 1, */\ - { 0xce0f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xcf02, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ - { 0xcf33, "tsig_gain"}, /* Test signal gain , */\ - { 0xd000, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd011, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd032, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd064, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd0b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd0c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd109, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd201, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ - { 0xd301, "int_ehs"}, /* Speed/load setting for INT IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ - { 0xd321, "datao_ehs"}, /* Speed/load setting for DATAO IO cell, clk or data mode range (see SLIMMF IO datasheet), */\ - { 0xd340, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xd407, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd480, "enbl_clk_out_of_range"}, /* Clock out of range , */\ - { 0xd491, "sel_wdt_clk"}, /* Watch dog clock divider settings , */\ - { 0xd4b0, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd500, "source_in_testmode"}, /* TDM source in test mode (return only current and voltage sense), */\ - { 0xd510, "gainatt_feedback"}, /* Gainatt feedback to tdm , */\ - { 0xd522, "test_parametric_io"}, /* Test IO parametric , */\ - { 0xd550, "ctrl_bst_clk_lp1"}, /* Boost clock control in low power mode1 , */\ - { 0xd561, "test_spare_out1"}, /* Test spare out 1 , */\ - { 0xd580, "bst_dcmbst"}, /* DCM boost , */\ - { 0xd593, "test_spare_out2"}, /* Test spare out 2 , */\ - { 0xe00f, "sw_profile"}, /* Software profile data , */\ - { 0xe10f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf163, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf307, "calibr_gain_vs"}, /* Voltage sense gain , */\ - { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf40f, "mtpdata4"}, /* MTP4 data , */\ - { 0xf50f, "calibr_R25C"}, /* Ron resistance of speaker coil , */\ - { 0xf60f, "mtpdata6"}, /* MTP6 data , */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf900, "mtp_lock_dcdcoff_mode"}, /* Disable functionality of dcdcoff_mode bit , */\ - { 0xf910, "mtp_lock_enbl_coolflux"}, /* Disable functionality of enbl_coolflux bit , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_enbl_pwm_delay_clock_gating"}, /* PWM delay clock auto gating , */\ - { 0xf940, "mtp_enbl_ocp_clock_gating"}, /* OCP clock auto gating , */\ - { 0xf987, "type_bits_fw"}, /* MTP control for firmware features - See Firmware I2C API document for details, */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE , */\ - { 0xff07, "calibr_osc_delta_ndiv"}, /* Calibration data for OSC1M, signed number representation, */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; -#if 0 -enum tfa9894_irq { - tfa9894_irq_max = -1, - tfa9894_irq_all = -1 /* all irqs */}; -#endif// -#define TFA9894_IRQ_NAMETABLE static tfaIrqName_t Tfa9894IrqNames[] = {\ -}; -#endif /* _TFA9894_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9896_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9896_tfafieldnames.h deleted file mode 100644 index 7a70eded87d6..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9896_tfafieldnames.h +++ /dev/null @@ -1,930 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9896_tfafieldnames.h - * This file was generated automatically on 08/15/16 at 09:43:38. - * Source file: TFA9896_N1B1_I2C_regmap_V16.xlsx - */ - -#ifndef _TFA9896_TFAFIELDNAMES_H -#define _TFA9896_TFAFIELDNAMES_H - - -#define TFA9896_I2CVERSION 16 - -typedef enum TFA9896BfEnumList { - TFA9896_BF_VDDS = 0x0000, /*!< Power-on-reset flag (auto clear by reading) */ - TFA9896_BF_PLLS = 0x0010, /*!< PLL lock to programmed frequency */ - TFA9896_BF_OTDS = 0x0020, /*!< Over Temperature Protection alarm */ - TFA9896_BF_OVDS = 0x0030, /*!< Over Voltage Protection alarm */ - TFA9896_BF_UVDS = 0x0040, /*!< Under Voltage Protection alarm */ - TFA9896_BF_OCDS = 0x0050, /*!< Over Current Protection alarm */ - TFA9896_BF_CLKS = 0x0060, /*!< Clocks stable flag */ - TFA9896_BF_CLIPS = 0x0070, /*!< Amplifier clipping */ - TFA9896_BF_MTPB = 0x0080, /*!< MTP busy copying data to/from I2C registers */ - TFA9896_BF_NOCLK = 0x0090, /*!< lost clock detection (reference input clock) */ - TFA9896_BF_SPKS = 0x00a0, /*!< Speaker error */ - TFA9896_BF_ACS = 0x00b0, /*!< Cold Start required */ - TFA9896_BF_SWS = 0x00c0, /*!< Amplifier engage (Amp Switching) */ - TFA9896_BF_WDS = 0x00d0, /*!< watchdog reset (activates reset) */ - TFA9896_BF_AMPS = 0x00e0, /*!< Amplifier is enabled by manager */ - TFA9896_BF_AREFS = 0x00f0, /*!< References are enabled by manager */ - TFA9896_BF_BATS = 0x0109, /*!< Battery voltage from ADC readout */ - TFA9896_BF_TEMPS = 0x0208, /*!< Temperature readout from the temperature sensor ( C) */ - TFA9896_BF_REV = 0x030f, /*!< Device revision information */ - TFA9896_BF_RCV = 0x0420, /*!< Enable receiver mode */ - TFA9896_BF_CHS12 = 0x0431, /*!< Channel Selection TDM input for Coolflux */ - TFA9896_BF_INPLVL = 0x0450, /*!< Input level selection attenuator ( */ - TFA9896_BF_CHSA = 0x0461, /*!< Input selection for amplifier */ - TFA9896_BF_AUDFS = 0x04c3, /*!< Audio sample rate setting */ - TFA9896_BF_BSSCR = 0x0501, /*!< Batteery protection attack time */ - TFA9896_BF_BSST = 0x0523, /*!< Battery protection threshold level */ - TFA9896_BF_BSSRL = 0x0561, /*!< Battery protection maximum reduction */ - TFA9896_BF_BSSRR = 0x0582, /*!< Battery protection release time */ - TFA9896_BF_BSSHY = 0x05b1, /*!< Battery Protection Hysteresis */ - TFA9896_BF_BSSR = 0x05e0, /*!< Battery voltage value for read out (only) */ - TFA9896_BF_BSSBY = 0x05f0, /*!< Bypass clipper battery protection */ - TFA9896_BF_DPSA = 0x0600, /*!< Enable dynamic powerstage activation (DPSA) */ - TFA9896_BF_ATTEN = 0x0613, /*!< Gain attenuation setting */ - TFA9896_BF_CFSM = 0x0650, /*!< Soft mute in CoolFlux */ - TFA9896_BF_BSSS = 0x0670, /*!< Battery sense steepness */ - TFA9896_BF_VOL = 0x0687, /*!< Coolflux volume control */ - TFA9896_BF_DCVO2 = 0x0702, /*!< Second Boost Voltage */ - TFA9896_BF_DCMCC = 0x0733, /*!< Max boost coil current - step of 175 mA */ - TFA9896_BF_DCVO1 = 0x0772, /*!< First Boost Voltage */ - TFA9896_BF_DCIE = 0x07a0, /*!< Adaptive boost mode */ - TFA9896_BF_DCSR = 0x07b0, /*!< Soft Rampup/down mode for DCDC controller */ - TFA9896_BF_DCPAVG = 0x07c0, /*!< ctrl_peak2avg for analog part of DCDC */ - TFA9896_BF_DCPWM = 0x07d0, /*!< DCDC PWM only mode */ - TFA9896_BF_TROS = 0x0800, /*!< Selection ambient temperature for speaker calibration */ - TFA9896_BF_EXTTS = 0x0818, /*!< External temperature for speaker calibration (C) */ - TFA9896_BF_PWDN = 0x0900, /*!< powerdown selection */ - TFA9896_BF_I2CR = 0x0910, /*!< All I2C registers reset to default */ - TFA9896_BF_CFE = 0x0920, /*!< Enable CoolFlux */ - TFA9896_BF_AMPE = 0x0930, /*!< Enable Amplifier */ - TFA9896_BF_DCA = 0x0940, /*!< Enable DCDC Boost converter */ - TFA9896_BF_SBSL = 0x0950, /*!< Coolflux configured */ - TFA9896_BF_AMPC = 0x0960, /*!< Selection if Coolflux enables amplifier */ - TFA9896_BF_DCDIS = 0x0970, /*!< DCDC boost converter not connected */ - TFA9896_BF_PSDR = 0x0980, /*!< IDDQ amplifier test selection */ - TFA9896_BF_INTPAD = 0x09c1, /*!< INT pad (interrupt bump output) configuration */ - TFA9896_BF_IPLL = 0x09e0, /*!< PLL input reference clock selection */ - TFA9896_BF_DCTRIP = 0x0a04, /*!< Adaptive boost trip levels (effective only when boost_intel is set to 1) */ - TFA9896_BF_DCHOLD = 0x0a54, /*!< Hold time for DCDC booster (effective only when boost_intel is set to 1) */ - TFA9896_BF_MTPK = 0x0b07, /*!< KEY2 to access key2 protected registers (default for engineering) */ - TFA9896_BF_CVFDLY = 0x0c25, /*!< Fractional delay adjustment between current and voltage sense */ - TFA9896_BF_OPENMTP = 0x0ec0, /*!< Enable programming of the MTP memory */ - TFA9896_BF_TDMPRF = 0x1011, /*!< TDM usecase selection control */ - TFA9896_BF_TDMEN = 0x1030, /*!< TDM interface enable */ - TFA9896_BF_TDMCKINV = 0x1040, /*!< TDM clock inversion, receive on */ - TFA9896_BF_TDMFSLN = 0x1053, /*!< TDM FS length */ - TFA9896_BF_TDMFSPOL = 0x1090, /*!< TDM FS polarity (start frame) */ - TFA9896_BF_TDMSAMSZ = 0x10a4, /*!< TDM sample size for all TDM sinks and sources */ - TFA9896_BF_TDMSLOTS = 0x1103, /*!< TDM number of slots */ - TFA9896_BF_TDMSLLN = 0x1144, /*!< TDM slot length */ - TFA9896_BF_TDMBRMG = 0x1194, /*!< TDM bits remaining after the last slot */ - TFA9896_BF_TDMDDEL = 0x11e0, /*!< TDM data delay */ - TFA9896_BF_TDMDADJ = 0x11f0, /*!< TDM data adjustment */ - TFA9896_BF_TDMTXFRM = 0x1201, /*!< TDM TXDATA format */ - TFA9896_BF_TDMUUS0 = 0x1221, /*!< TDM TXDATA format unused slot SD0 */ - TFA9896_BF_TDMUUS1 = 0x1241, /*!< TDM TXDATA format unused slot SD1 */ - TFA9896_BF_TDMSI0EN = 0x1270, /*!< TDM sink0 enable */ - TFA9896_BF_TDMSI1EN = 0x1280, /*!< TDM sink1 enable */ - TFA9896_BF_TDMSI2EN = 0x1290, /*!< TDM sink2 enable */ - TFA9896_BF_TDMSO0EN = 0x12a0, /*!< TDM source0 enable */ - TFA9896_BF_TDMSO1EN = 0x12b0, /*!< TDM source1 enable */ - TFA9896_BF_TDMSO2EN = 0x12c0, /*!< TDM source2 enable */ - TFA9896_BF_TDMSI0IO = 0x12d0, /*!< TDM sink0 IO selection */ - TFA9896_BF_TDMSI1IO = 0x12e0, /*!< TDM sink1 IO selection */ - TFA9896_BF_TDMSI2IO = 0x12f0, /*!< TDM sink2 IO selection */ - TFA9896_BF_TDMSO0IO = 0x1300, /*!< TDM source0 IO selection */ - TFA9896_BF_TDMSO1IO = 0x1310, /*!< TDM source1 IO selection */ - TFA9896_BF_TDMSO2IO = 0x1320, /*!< TDM source2 IO selection */ - TFA9896_BF_TDMSI0SL = 0x1333, /*!< TDM sink0 slot position [GAIN IN] */ - TFA9896_BF_TDMSI1SL = 0x1373, /*!< TDM sink1 slot position [CH1 IN] */ - TFA9896_BF_TDMSI2SL = 0x13b3, /*!< TDM sink2 slot position [CH2 IN] */ - TFA9896_BF_TDMSO0SL = 0x1403, /*!< TDM source0 slot position [GAIN OUT] */ - TFA9896_BF_TDMSO1SL = 0x1443, /*!< TDM source1 slot position [Voltage Sense] */ - TFA9896_BF_TDMSO2SL = 0x1483, /*!< TDM source2 slot position [Current Sense] */ - TFA9896_BF_NBCK = 0x14c3, /*!< TDM NBCK bit clock ratio */ - TFA9896_BF_INTOVDDS = 0x2000, /*!< flag_por_int_out */ - TFA9896_BF_INTOPLLS = 0x2010, /*!< flag_pll_lock_int_out */ - TFA9896_BF_INTOOTDS = 0x2020, /*!< flag_otpok_int_out */ - TFA9896_BF_INTOOVDS = 0x2030, /*!< flag_ovpok_int_out */ - TFA9896_BF_INTOUVDS = 0x2040, /*!< flag_uvpok_int_out */ - TFA9896_BF_INTOOCDS = 0x2050, /*!< flag_ocp_alarm_int_out */ - TFA9896_BF_INTOCLKS = 0x2060, /*!< flag_clocks_stable_int_out */ - TFA9896_BF_INTOCLIPS = 0x2070, /*!< flag_clip_int_out */ - TFA9896_BF_INTOMTPB = 0x2080, /*!< mtp_busy_int_out */ - TFA9896_BF_INTONOCLK = 0x2090, /*!< flag_lost_clk_int_out */ - TFA9896_BF_INTOSPKS = 0x20a0, /*!< flag_cf_speakererror_int_out */ - TFA9896_BF_INTOACS = 0x20b0, /*!< flag_cold_started_int_out */ - TFA9896_BF_INTOSWS = 0x20c0, /*!< flag_engage_int_out */ - TFA9896_BF_INTOWDS = 0x20d0, /*!< flag_watchdog_reset_int_out */ - TFA9896_BF_INTOAMPS = 0x20e0, /*!< flag_enbl_amp_int_out */ - TFA9896_BF_INTOAREFS = 0x20f0, /*!< flag_enbl_ref_int_out */ - TFA9896_BF_INTOERR = 0x2200, /*!< flag_cfma_err_int_out */ - TFA9896_BF_INTOACK = 0x2210, /*!< flag_cfma_ack_int_out */ - TFA9896_BF_INTIVDDS = 0x2300, /*!< flag_por_int_in */ - TFA9896_BF_INTIPLLS = 0x2310, /*!< flag_pll_lock_int_in */ - TFA9896_BF_INTIOTDS = 0x2320, /*!< flag_otpok_int_in */ - TFA9896_BF_INTIOVDS = 0x2330, /*!< flag_ovpok_int_in */ - TFA9896_BF_INTIUVDS = 0x2340, /*!< flag_uvpok_int_in */ - TFA9896_BF_INTIOCDS = 0x2350, /*!< flag_ocp_alarm_int_in */ - TFA9896_BF_INTICLKS = 0x2360, /*!< flag_clocks_stable_int_in */ - TFA9896_BF_INTICLIPS = 0x2370, /*!< flag_clip_int_in */ - TFA9896_BF_INTIMTPB = 0x2380, /*!< mtp_busy_int_in */ - TFA9896_BF_INTINOCLK = 0x2390, /*!< flag_lost_clk_int_in */ - TFA9896_BF_INTISPKS = 0x23a0, /*!< flag_cf_speakererror_int_in */ - TFA9896_BF_INTIACS = 0x23b0, /*!< flag_cold_started_int_in */ - TFA9896_BF_INTISWS = 0x23c0, /*!< flag_engage_int_in */ - TFA9896_BF_INTIWDS = 0x23d0, /*!< flag_watchdog_reset_int_in */ - TFA9896_BF_INTIAMPS = 0x23e0, /*!< flag_enbl_amp_int_in */ - TFA9896_BF_INTIAREFS = 0x23f0, /*!< flag_enbl_ref_int_in */ - TFA9896_BF_INTIERR = 0x2500, /*!< flag_cfma_err_int_in */ - TFA9896_BF_INTIACK = 0x2510, /*!< flag_cfma_ack_int_in */ - TFA9896_BF_INTENVDDS = 0x2600, /*!< flag_por_int_enable */ - TFA9896_BF_INTENPLLS = 0x2610, /*!< flag_pll_lock_int_enable */ - TFA9896_BF_INTENOTDS = 0x2620, /*!< flag_otpok_int_enable */ - TFA9896_BF_INTENOVDS = 0x2630, /*!< flag_ovpok_int_enable */ - TFA9896_BF_INTENUVDS = 0x2640, /*!< flag_uvpok_int_enable */ - TFA9896_BF_INTENOCDS = 0x2650, /*!< flag_ocp_alarm_int_enable */ - TFA9896_BF_INTENCLKS = 0x2660, /*!< flag_clocks_stable_int_enable */ - TFA9896_BF_INTENCLIPS = 0x2670, /*!< flag_clip_int_enable */ - TFA9896_BF_INTENMTPB = 0x2680, /*!< mtp_busy_int_enable */ - TFA9896_BF_INTENNOCLK = 0x2690, /*!< flag_lost_clk_int_enable */ - TFA9896_BF_INTENSPKS = 0x26a0, /*!< flag_cf_speakererror_int_enable */ - TFA9896_BF_INTENACS = 0x26b0, /*!< flag_cold_started_int_enable */ - TFA9896_BF_INTENSWS = 0x26c0, /*!< flag_engage_int_enable */ - TFA9896_BF_INTENWDS = 0x26d0, /*!< flag_watchdog_reset_int_enable */ - TFA9896_BF_INTENAMPS = 0x26e0, /*!< flag_enbl_amp_int_enable */ - TFA9896_BF_INTENAREFS = 0x26f0, /*!< flag_enbl_ref_int_enable */ - TFA9896_BF_INTENERR = 0x2800, /*!< flag_cfma_err_int_enable */ - TFA9896_BF_INTENACK = 0x2810, /*!< flag_cfma_ack_int_enable */ - TFA9896_BF_INTPOLVDDS = 0x2900, /*!< flag_por_int_pol */ - TFA9896_BF_INTPOLPLLS = 0x2910, /*!< flag_pll_lock_int_pol */ - TFA9896_BF_INTPOLOTDS = 0x2920, /*!< flag_otpok_int_pol */ - TFA9896_BF_INTPOLOVDS = 0x2930, /*!< flag_ovpok_int_pol */ - TFA9896_BF_INTPOLUVDS = 0x2940, /*!< flag_uvpok_int_pol */ - TFA9896_BF_INTPOLOCDS = 0x2950, /*!< flag_ocp_alarm_int_pol */ - TFA9896_BF_INTPOLCLKS = 0x2960, /*!< flag_clocks_stable_int_pol */ - TFA9896_BF_INTPOLCLIPS = 0x2970, /*!< flag_clip_int_pol */ - TFA9896_BF_INTPOLMTPB = 0x2980, /*!< mtp_busy_int_pol */ - TFA9896_BF_INTPOLNOCLK = 0x2990, /*!< flag_lost_clk_int_pol */ - TFA9896_BF_INTPOLSPKS = 0x29a0, /*!< flag_cf_speakererror_int_pol */ - TFA9896_BF_INTPOLACS = 0x29b0, /*!< flag_cold_started_int_pol */ - TFA9896_BF_INTPOLSWS = 0x29c0, /*!< flag_engage_int_pol */ - TFA9896_BF_INTPOLWDS = 0x29d0, /*!< flag_watchdog_reset_int_pol */ - TFA9896_BF_INTPOLAMPS = 0x29e0, /*!< flag_enbl_amp_int_pol */ - TFA9896_BF_INTPOLAREFS = 0x29f0, /*!< flag_enbl_ref_int_pol */ - TFA9896_BF_INTPOLERR = 0x2b00, /*!< flag_cfma_err_int_pol */ - TFA9896_BF_INTPOLACK = 0x2b10, /*!< flag_cfma_ack_int_pol */ - TFA9896_BF_CLIP = 0x4900, /*!< Bypass clip control */ - TFA9896_BF_CIMTP = 0x62b0, /*!< Start copying data from I2C mtp registers to mtp */ - TFA9896_BF_RST = 0x7000, /*!< Reset CoolFlux DSP */ - TFA9896_BF_DMEM = 0x7011, /*!< Target memory for access */ - TFA9896_BF_AIF = 0x7030, /*!< Auto increment flag for memory-address */ - TFA9896_BF_CFINT = 0x7040, /*!< CF Interrupt - auto clear */ - TFA9896_BF_REQ = 0x7087, /*!< CF request for accessing the 8 channels */ - TFA9896_BF_MADD = 0x710f, /*!< Memory address */ - TFA9896_BF_MEMA = 0x720f, /*!< Activate memory access */ - TFA9896_BF_ERR = 0x7307, /*!< CF error flags */ - TFA9896_BF_ACK = 0x7387, /*!< CF acknowledgement of the requests channels */ - TFA9896_BF_MTPOTC = 0x8000, /*!< Calibration schedule selection */ - TFA9896_BF_MTPEX = 0x8010, /*!< Calibration of RON status bit */ -} TFA9896BfEnumList_t; -#define TFA9896_NAMETABLE static tfaBfName_t Tfa9896DatasheetNames[] = {\ - { 0x0, "VDDS"}, /* Power-on-reset flag (auto clear by reading) , */\ - { 0x10, "PLLS"}, /* PLL lock to programmed frequency , */\ - { 0x20, "OTDS"}, /* Over Temperature Protection alarm , */\ - { 0x30, "OVDS"}, /* Over Voltage Protection alarm , */\ - { 0x40, "UVDS"}, /* Under Voltage Protection alarm , */\ - { 0x50, "OCDS"}, /* Over Current Protection alarm , */\ - { 0x60, "CLKS"}, /* Clocks stable flag , */\ - { 0x70, "CLIPS"}, /* Amplifier clipping , */\ - { 0x80, "MTPB"}, /* MTP busy copying data to/from I2C registers , */\ - { 0x90, "NOCLK"}, /* lost clock detection (reference input clock) , */\ - { 0xa0, "SPKS"}, /* Speaker error , */\ - { 0xb0, "ACS"}, /* Cold Start required , */\ - { 0xc0, "SWS"}, /* Amplifier engage (Amp Switching) , */\ - { 0xd0, "WDS"}, /* watchdog reset (activates reset) , */\ - { 0xe0, "AMPS"}, /* Amplifier is enabled by manager , */\ - { 0xf0, "AREFS"}, /* References are enabled by manager , */\ - { 0x109, "BATS"}, /* Battery voltage from ADC readout , */\ - { 0x208, "TEMPS"}, /* Temperature readout from the temperature sensor ( C), */\ - { 0x30f, "REV"}, /* Device revision information , */\ - { 0x420, "RCV"}, /* Enable receiver mode , */\ - { 0x431, "CHS12"}, /* Channel Selection TDM input for Coolflux , */\ - { 0x450, "INPLVL"}, /* Input level selection attenuator ( , */\ - { 0x461, "CHSA"}, /* Input selection for amplifier , */\ - { 0x4c3, "AUDFS"}, /* Audio sample rate setting , */\ - { 0x501, "BSSCR"}, /* Batteery protection attack time , */\ - { 0x523, "BSST"}, /* Battery protection threshold level , */\ - { 0x561, "BSSRL"}, /* Battery protection maximum reduction , */\ - { 0x582, "BSSRR"}, /* Battery protection release time , */\ - { 0x5b1, "BSSHY"}, /* Battery Protection Hysteresis , */\ - { 0x5e0, "BSSR"}, /* Battery voltage value for read out (only) , */\ - { 0x5f0, "BSSBY"}, /* Bypass clipper battery protection , */\ - { 0x600, "DPSA"}, /* Enable dynamic powerstage activation (DPSA) , */\ - { 0x613, "ATTEN"}, /* Gain attenuation setting , */\ - { 0x650, "CFSM"}, /* Soft mute in CoolFlux , */\ - { 0x670, "BSSS"}, /* Battery sense steepness , */\ - { 0x687, "VOL"}, /* Coolflux volume control , */\ - { 0x702, "DCVO2"}, /* Second Boost Voltage , */\ - { 0x733, "DCMCC"}, /* Max boost coil current - step of 175 mA , */\ - { 0x772, "DCVO1"}, /* First Boost Voltage , */\ - { 0x7a0, "DCIE"}, /* Adaptive boost mode , */\ - { 0x7b0, "DCSR"}, /* Soft Rampup/down mode for DCDC controller , */\ - { 0x7c0, "DCPAVG"}, /* ctrl_peak2avg for analog part of DCDC , */\ - { 0x7d0, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x800, "TROS"}, /* Selection ambient temperature for speaker calibration , */\ - { 0x818, "EXTTS"}, /* External temperature for speaker calibration (C) , */\ - { 0x900, "PWDN"}, /* powerdown selection , */\ - { 0x910, "I2CR"}, /* All I2C registers reset to default , */\ - { 0x920, "CFE"}, /* Enable CoolFlux , */\ - { 0x930, "AMPE"}, /* Enable Amplifier , */\ - { 0x940, "DCA"}, /* Enable DCDC Boost converter , */\ - { 0x950, "SBSL"}, /* Coolflux configured , */\ - { 0x960, "AMPC"}, /* Selection if Coolflux enables amplifier , */\ - { 0x970, "DCDIS"}, /* DCDC boost converter not connected , */\ - { 0x980, "PSDR"}, /* IDDQ amplifier test selection , */\ - { 0x9c1, "INTPAD"}, /* INT pad (interrupt bump output) configuration , */\ - { 0x9e0, "IPLL"}, /* PLL input reference clock selection , */\ - { 0xa04, "DCTRIP"}, /* Adaptive boost trip levels (effective only when boost_intel is set to 1), */\ - { 0xa54, "DCHOLD"}, /* Hold time for DCDC booster (effective only when boost_intel is set to 1), */\ - { 0xb07, "MTPK"}, /* KEY2 to access key2 protected registers (default for engineering), */\ - { 0xc25, "CVFDLY"}, /* Fractional delay adjustment between current and voltage sense, */\ - { 0xec0, "OPENMTP"}, /* Enable programming of the MTP memory , */\ - { 0x1011, "TDMPRF"}, /* TDM usecase selection control , */\ - { 0x1030, "TDMEN"}, /* TDM interface enable , */\ - { 0x1040, "TDMCKINV"}, /* TDM clock inversion, receive on , */\ - { 0x1053, "TDMFSLN"}, /* TDM FS length , */\ - { 0x1090, "TDMFSPOL"}, /* TDM FS polarity (start frame) , */\ - { 0x10a4, "TDMSAMSZ"}, /* TDM sample size for all TDM sinks and sources , */\ - { 0x1103, "TDMSLOTS"}, /* TDM number of slots , */\ - { 0x1144, "TDMSLLN"}, /* TDM slot length , */\ - { 0x1194, "TDMBRMG"}, /* TDM bits remaining after the last slot , */\ - { 0x11e0, "TDMDDEL"}, /* TDM data delay , */\ - { 0x11f0, "TDMDADJ"}, /* TDM data adjustment , */\ - { 0x1201, "TDMTXFRM"}, /* TDM TXDATA format , */\ - { 0x1221, "TDMUUS0"}, /* TDM TXDATA format unused slot SD0 , */\ - { 0x1241, "TDMUUS1"}, /* TDM TXDATA format unused slot SD1 , */\ - { 0x1270, "TDMSI0EN"}, /* TDM sink0 enable , */\ - { 0x1280, "TDMSI1EN"}, /* TDM sink1 enable , */\ - { 0x1290, "TDMSI2EN"}, /* TDM sink2 enable , */\ - { 0x12a0, "TDMSO0EN"}, /* TDM source0 enable , */\ - { 0x12b0, "TDMSO1EN"}, /* TDM source1 enable , */\ - { 0x12c0, "TDMSO2EN"}, /* TDM source2 enable , */\ - { 0x12d0, "TDMSI0IO"}, /* TDM sink0 IO selection , */\ - { 0x12e0, "TDMSI1IO"}, /* TDM sink1 IO selection , */\ - { 0x12f0, "TDMSI2IO"}, /* TDM sink2 IO selection , */\ - { 0x1300, "TDMSO0IO"}, /* TDM source0 IO selection , */\ - { 0x1310, "TDMSO1IO"}, /* TDM source1 IO selection , */\ - { 0x1320, "TDMSO2IO"}, /* TDM source2 IO selection , */\ - { 0x1333, "TDMSI0SL"}, /* TDM sink0 slot position [GAIN IN] , */\ - { 0x1373, "TDMSI1SL"}, /* TDM sink1 slot position [CH1 IN] , */\ - { 0x13b3, "TDMSI2SL"}, /* TDM sink2 slot position [CH2 IN] , */\ - { 0x1403, "TDMSO0SL"}, /* TDM source0 slot position [GAIN OUT] , */\ - { 0x1443, "TDMSO1SL"}, /* TDM source1 slot position [Voltage Sense] , */\ - { 0x1483, "TDMSO2SL"}, /* TDM source2 slot position [Current Sense] , */\ - { 0x14c3, "NBCK"}, /* TDM NBCK bit clock ratio , */\ - { 0x2000, "INTOVDDS"}, /* flag_por_int_out , */\ - { 0x2010, "INTOPLLS"}, /* flag_pll_lock_int_out , */\ - { 0x2020, "INTOOTDS"}, /* flag_otpok_int_out , */\ - { 0x2030, "INTOOVDS"}, /* flag_ovpok_int_out , */\ - { 0x2040, "INTOUVDS"}, /* flag_uvpok_int_out , */\ - { 0x2050, "INTOOCDS"}, /* flag_ocp_alarm_int_out , */\ - { 0x2060, "INTOCLKS"}, /* flag_clocks_stable_int_out , */\ - { 0x2070, "INTOCLIPS"}, /* flag_clip_int_out , */\ - { 0x2080, "INTOMTPB"}, /* mtp_busy_int_out , */\ - { 0x2090, "INTONOCLK"}, /* flag_lost_clk_int_out , */\ - { 0x20a0, "INTOSPKS"}, /* flag_cf_speakererror_int_out , */\ - { 0x20b0, "INTOACS"}, /* flag_cold_started_int_out , */\ - { 0x20c0, "INTOSWS"}, /* flag_engage_int_out , */\ - { 0x20d0, "INTOWDS"}, /* flag_watchdog_reset_int_out , */\ - { 0x20e0, "INTOAMPS"}, /* flag_enbl_amp_int_out , */\ - { 0x20f0, "INTOAREFS"}, /* flag_enbl_ref_int_out , */\ - { 0x2200, "INTOERR"}, /* flag_cfma_err_int_out , */\ - { 0x2210, "INTOACK"}, /* flag_cfma_ack_int_out , */\ - { 0x2300, "INTIVDDS"}, /* flag_por_int_in , */\ - { 0x2310, "INTIPLLS"}, /* flag_pll_lock_int_in , */\ - { 0x2320, "INTIOTDS"}, /* flag_otpok_int_in , */\ - { 0x2330, "INTIOVDS"}, /* flag_ovpok_int_in , */\ - { 0x2340, "INTIUVDS"}, /* flag_uvpok_int_in , */\ - { 0x2350, "INTIOCDS"}, /* flag_ocp_alarm_int_in , */\ - { 0x2360, "INTICLKS"}, /* flag_clocks_stable_int_in , */\ - { 0x2370, "INTICLIPS"}, /* flag_clip_int_in , */\ - { 0x2380, "INTIMTPB"}, /* mtp_busy_int_in , */\ - { 0x2390, "INTINOCLK"}, /* flag_lost_clk_int_in , */\ - { 0x23a0, "INTISPKS"}, /* flag_cf_speakererror_int_in , */\ - { 0x23b0, "INTIACS"}, /* flag_cold_started_int_in , */\ - { 0x23c0, "INTISWS"}, /* flag_engage_int_in , */\ - { 0x23d0, "INTIWDS"}, /* flag_watchdog_reset_int_in , */\ - { 0x23e0, "INTIAMPS"}, /* flag_enbl_amp_int_in , */\ - { 0x23f0, "INTIAREFS"}, /* flag_enbl_ref_int_in , */\ - { 0x2500, "INTIERR"}, /* flag_cfma_err_int_in , */\ - { 0x2510, "INTIACK"}, /* flag_cfma_ack_int_in , */\ - { 0x2600, "INTENVDDS"}, /* flag_por_int_enable , */\ - { 0x2610, "INTENPLLS"}, /* flag_pll_lock_int_enable , */\ - { 0x2620, "INTENOTDS"}, /* flag_otpok_int_enable , */\ - { 0x2630, "INTENOVDS"}, /* flag_ovpok_int_enable , */\ - { 0x2640, "INTENUVDS"}, /* flag_uvpok_int_enable , */\ - { 0x2650, "INTENOCDS"}, /* flag_ocp_alarm_int_enable , */\ - { 0x2660, "INTENCLKS"}, /* flag_clocks_stable_int_enable , */\ - { 0x2670, "INTENCLIPS"}, /* flag_clip_int_enable , */\ - { 0x2680, "INTENMTPB"}, /* mtp_busy_int_enable , */\ - { 0x2690, "INTENNOCLK"}, /* flag_lost_clk_int_enable , */\ - { 0x26a0, "INTENSPKS"}, /* flag_cf_speakererror_int_enable , */\ - { 0x26b0, "INTENACS"}, /* flag_cold_started_int_enable , */\ - { 0x26c0, "INTENSWS"}, /* flag_engage_int_enable , */\ - { 0x26d0, "INTENWDS"}, /* flag_watchdog_reset_int_enable , */\ - { 0x26e0, "INTENAMPS"}, /* flag_enbl_amp_int_enable , */\ - { 0x26f0, "INTENAREFS"}, /* flag_enbl_ref_int_enable , */\ - { 0x2800, "INTENERR"}, /* flag_cfma_err_int_enable , */\ - { 0x2810, "INTENACK"}, /* flag_cfma_ack_int_enable , */\ - { 0x2900, "INTPOLVDDS"}, /* flag_por_int_pol , */\ - { 0x2910, "INTPOLPLLS"}, /* flag_pll_lock_int_pol , */\ - { 0x2920, "INTPOLOTDS"}, /* flag_otpok_int_pol , */\ - { 0x2930, "INTPOLOVDS"}, /* flag_ovpok_int_pol , */\ - { 0x2940, "INTPOLUVDS"}, /* flag_uvpok_int_pol , */\ - { 0x2950, "INTPOLOCDS"}, /* flag_ocp_alarm_int_pol , */\ - { 0x2960, "INTPOLCLKS"}, /* flag_clocks_stable_int_pol , */\ - { 0x2970, "INTPOLCLIPS"}, /* flag_clip_int_pol , */\ - { 0x2980, "INTPOLMTPB"}, /* mtp_busy_int_pol , */\ - { 0x2990, "INTPOLNOCLK"}, /* flag_lost_clk_int_pol , */\ - { 0x29a0, "INTPOLSPKS"}, /* flag_cf_speakererror_int_pol , */\ - { 0x29b0, "INTPOLACS"}, /* flag_cold_started_int_pol , */\ - { 0x29c0, "INTPOLSWS"}, /* flag_engage_int_pol , */\ - { 0x29d0, "INTPOLWDS"}, /* flag_watchdog_reset_int_pol , */\ - { 0x29e0, "INTPOLAMPS"}, /* flag_enbl_amp_int_pol , */\ - { 0x29f0, "INTPOLAREFS"}, /* flag_enbl_ref_int_pol , */\ - { 0x2b00, "INTPOLERR"}, /* flag_cfma_err_int_pol , */\ - { 0x2b10, "INTPOLACK"}, /* flag_cfma_ack_int_pol , */\ - { 0x4900, "CLIP"}, /* Bypass clip control , */\ - { 0x62b0, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0x7000, "RST"}, /* Reset CoolFlux DSP , */\ - { 0x7011, "DMEM"}, /* Target memory for access , */\ - { 0x7030, "AIF"}, /* Auto increment flag for memory-address , */\ - { 0x7040, "CFINT"}, /* CF Interrupt - auto clear , */\ - { 0x7087, "REQ"}, /* CF request for accessing the 8 channels , */\ - { 0x710f, "MADD"}, /* Memory address , */\ - { 0x720f, "MEMA"}, /* Activate memory access , */\ - { 0x7307, "ERR"}, /* CF error flags , */\ - { 0x7387, "ACK"}, /* CF acknowledgement of the requests channels , */\ - { 0x8000, "MTPOTC"}, /* Calibration schedule selection , */\ - { 0x8010, "MTPEX"}, /* Calibration of RON status bit , */\ - { 0x8045, "SWPROFIL" },\ - { 0x80a5, "SWVSTEP" },\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9896_BITNAMETABLE static tfaBfName_t Tfa9896BitNames[] = {\ - { 0x0, "flag_por"}, /* Power-on-reset flag (auto clear by reading) , */\ - { 0x10, "flag_pll_lock"}, /* PLL lock to programmed frequency , */\ - { 0x20, "flag_otpok"}, /* Over Temperature Protection alarm , */\ - { 0x30, "flag_ovpok"}, /* Over Voltage Protection alarm , */\ - { 0x40, "flag_uvpok"}, /* Under Voltage Protection alarm , */\ - { 0x50, "flag_ocp_alarm"}, /* Over Current Protection alarm , */\ - { 0x60, "flag_clocks_stable"}, /* Clocks stable flag , */\ - { 0x70, "flag_clip"}, /* Amplifier clipping , */\ - { 0x80, "mtp_busy"}, /* MTP busy copying data to/from I2C registers , */\ - { 0x90, "flag_lost_clk"}, /* lost clock detection (reference input clock) , */\ - { 0xa0, "flag_cf_speakererror"}, /* Speaker error , */\ - { 0xb0, "flag_cold_started"}, /* Cold Start required , */\ - { 0xc0, "flag_engage"}, /* Amplifier engage (Amp Switching) , */\ - { 0xd0, "flag_watchdog_reset"}, /* watchdog reset (activates reset) , */\ - { 0xe0, "flag_enbl_amp"}, /* Amplifier is enabled by manager , */\ - { 0xf0, "flag_enbl_ref"}, /* References are enabled by manager , */\ - { 0x109, "bat_adc"}, /* Battery voltage from ADC readout , */\ - { 0x208, "temp_adc"}, /* Temperature readout from the temperature sensor ( C), */\ - { 0x30f, "device_rev"}, /* Device revision information , */\ - { 0x420, "ctrl_rcv"}, /* Enable receiver mode , */\ - { 0x431, "chan_sel"}, /* Channel Selection TDM input for Coolflux , */\ - { 0x450, "input_level"}, /* Input level selection attenuator ( , */\ - { 0x461, "vamp_sel"}, /* Input selection for amplifier , */\ - { 0x4c3, "audio_fs"}, /* Audio sample rate setting , */\ - { 0x501, "vbat_prot_attacktime"}, /* Batteery protection attack time , */\ - { 0x523, "vbat_prot_thlevel"}, /* Battery protection threshold level , */\ - { 0x561, "vbat_prot_max_reduct"}, /* Battery protection maximum reduction , */\ - { 0x582, "vbat_prot_release_t"}, /* Battery protection release time , */\ - { 0x5b1, "vbat_prot_hysterese"}, /* Battery Protection Hysteresis , */\ - { 0x5d0, "reset_min_vbat"}, /* Battery supply safeguard clipper reset ( if CF_DSP is bypassed), */\ - { 0x5e0, "sel_vbat"}, /* Battery voltage value for read out (only) , */\ - { 0x5f0, "bypass_clipper"}, /* Bypass clipper battery protection , */\ - { 0x600, "dpsa"}, /* Enable dynamic powerstage activation (DPSA) , */\ - { 0x613, "ctrl_att"}, /* Gain attenuation setting , */\ - { 0x650, "cf_mute"}, /* Soft mute in CoolFlux , */\ - { 0x670, "batsense_steepness"}, /* Battery sense steepness , */\ - { 0x687, "vol"}, /* Coolflux volume control , */\ - { 0x702, "scnd_boost_voltage"}, /* Second Boost Voltage , */\ - { 0x733, "boost_cur"}, /* Max boost coil current - step of 175 mA , */\ - { 0x772, "frst_boost_voltage"}, /* First Boost Voltage , */\ - { 0x7a0, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x7b0, "boost_speed"}, /* Soft Rampup/down mode for DCDC controller , */\ - { 0x7c0, "boost_peak2avg"}, /* ctrl_peak2avg for analog part of DCDC , */\ - { 0x7d0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7e0, "ignore_flag_voutcomp86"}, /* Ignore flag_voutcomp86 (flag from analog) , */\ - { 0x800, "ext_temp_sel"}, /* Selection ambient temperature for speaker calibration , */\ - { 0x818, "ext_temp"}, /* External temperature for speaker calibration (C) , */\ - { 0x900, "powerdown"}, /* powerdown selection , */\ - { 0x910, "reset"}, /* All I2C registers reset to default , */\ - { 0x920, "enbl_coolflux"}, /* Enable CoolFlux , */\ - { 0x930, "enbl_amplifier"}, /* Enable Amplifier , */\ - { 0x940, "enbl_boost"}, /* Enable DCDC Boost converter , */\ - { 0x950, "coolflux_configured"}, /* Coolflux configured , */\ - { 0x960, "sel_enbl_amplifier"}, /* Selection if Coolflux enables amplifier , */\ - { 0x970, "dcdcoff_mode"}, /* DCDC boost converter not connected , */\ - { 0x980, "iddqtest"}, /* IDDQ amplifier test selection , */\ - { 0x9c1, "int_pad_io"}, /* INT pad (interrupt bump output) configuration , */\ - { 0x9e0, "sel_fs_bck"}, /* PLL input reference clock selection , */\ - { 0x9f0, "sel_scl_cf_clock"}, /* Coolflux sub-system clock selection , */\ - { 0xa04, "boost_trip_lvl"}, /* Adaptive boost trip levels (effective only when boost_intel is set to 1), */\ - { 0xa54, "boost_hold_time"}, /* Hold time for DCDC booster (effective only when boost_intel is set to 1), */\ - { 0xaa1, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0xb07, "mtpkey2"}, /* KEY2 to access key2 protected registers (default for engineering), */\ - { 0xc00, "enbl_volt_sense"}, /* Voltage sense enabling control bit , */\ - { 0xc10, "vsense_pwm_sel"}, /* Voltage sense source selection , */\ - { 0xc25, "vi_frac_delay"}, /* Fractional delay adjustment between current and voltage sense, */\ - { 0xc80, "sel_voltsense_out"}, /* TDM output data selection for AEC , */\ - { 0xc90, "vsense_bypass_avg"}, /* Voltage sense average block bypass , */\ - { 0xd05, "cf_frac_delay"}, /* Fractional delay adjustment between current and voltage sense by firmware, */\ - { 0xe00, "bypass_dcdc_curr_prot"}, /* Control to switch off dcdc current reduction with bat protection, */\ - { 0xe10, "bypass_ocp"}, /* Bypass OCP (digital IP block) , */\ - { 0xe20, "ocptest"}, /* ocptest (analog IP block) enable , */\ - { 0xe80, "disable_clock_sh_prot"}, /* Disable clock_sh protection , */\ - { 0xe92, "reserve_reg_15_09"}, /* Spare control bits for future usage , */\ - { 0xec0, "unprotect_mtp"}, /* Enable programming of the MTP memory , */\ - { 0xed2, "reserve_reg_15_13"}, /* Spare control bits for future usage , */\ - { 0xf00, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode forcing each 50us a pwm pulse , */\ - { 0xf11, "dcdc_ctrl_maxzercnt"}, /* DCDC number of zero current flags required to go to pfm mode, */\ - { 0xf36, "dcdc_vbat_delta_detect"}, /* DCDC threshold required on a delta Vbat (in PFM mode) switching to PWM mode, */\ - { 0xfa0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x1011, "tdm_usecase"}, /* TDM usecase selection control , */\ - { 0x1030, "tdm_enable"}, /* TDM interface enable , */\ - { 0x1040, "tdm_clk_inversion"}, /* TDM clock inversion, receive on , */\ - { 0x1053, "tdm_fs_ws_length"}, /* TDM FS length , */\ - { 0x1090, "tdm_fs_ws_polarity"}, /* TDM FS polarity (start frame) , */\ - { 0x10a4, "tdm_sample_size"}, /* TDM sample size for all TDM sinks and sources , */\ - { 0x1103, "tdm_nb_of_slots"}, /* TDM number of slots , */\ - { 0x1144, "tdm_slot_length"}, /* TDM slot length , */\ - { 0x1194, "tdm_bits_remaining"}, /* TDM bits remaining after the last slot , */\ - { 0x11e0, "tdm_data_delay"}, /* TDM data delay , */\ - { 0x11f0, "tdm_data_adjustment"}, /* TDM data adjustment , */\ - { 0x1201, "tdm_txdata_format"}, /* TDM TXDATA format , */\ - { 0x1221, "tdm_txdata_format_unused_slot_sd0"}, /* TDM TXDATA format unused slot SD0 , */\ - { 0x1241, "tdm_txdata_format_unused_slot_sd1"}, /* TDM TXDATA format unused slot SD1 , */\ - { 0x1270, "tdm_sink0_enable"}, /* TDM sink0 enable , */\ - { 0x1280, "tdm_sink1_enable"}, /* TDM sink1 enable , */\ - { 0x1290, "tdm_sink2_enable"}, /* TDM sink2 enable , */\ - { 0x12a0, "tdm_source0_enable"}, /* TDM source0 enable , */\ - { 0x12b0, "tdm_source1_enable"}, /* TDM source1 enable , */\ - { 0x12c0, "tdm_source2_enable"}, /* TDM source2 enable , */\ - { 0x12d0, "tdm_sink0_io"}, /* TDM sink0 IO selection , */\ - { 0x12e0, "tdm_sink1_io"}, /* TDM sink1 IO selection , */\ - { 0x12f0, "tdm_sink2_io"}, /* TDM sink2 IO selection , */\ - { 0x1300, "tdm_source0_io"}, /* TDM source0 IO selection , */\ - { 0x1310, "tdm_source1_io"}, /* TDM source1 IO selection , */\ - { 0x1320, "tdm_source2_io"}, /* TDM source2 IO selection , */\ - { 0x1333, "tdm_sink0_slot"}, /* TDM sink0 slot position [GAIN IN] , */\ - { 0x1373, "tdm_sink1_slot"}, /* TDM sink1 slot position [CH1 IN] , */\ - { 0x13b3, "tdm_sink2_slot"}, /* TDM sink2 slot position [CH2 IN] , */\ - { 0x1403, "tdm_source0_slot"}, /* TDM source0 slot position [GAIN OUT] , */\ - { 0x1443, "tdm_source1_slot"}, /* TDM source1 slot position [Voltage Sense] , */\ - { 0x1483, "tdm_source2_slot"}, /* TDM source2 slot position [Current Sense] , */\ - { 0x14c3, "tdm_nbck"}, /* TDM NBCK bit clock ratio , */\ - { 0x1500, "flag_tdm_lut_error"}, /* TDM LUT error flag , */\ - { 0x1512, "flag_tdm_status"}, /* TDM interface status bits , */\ - { 0x1540, "flag_tdm_error"}, /* TDM interface error indicator , */\ - { 0x1551, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x2000, "flag_por_int_out"}, /* flag_por_int_out , */\ - { 0x2010, "flag_pll_lock_int_out"}, /* flag_pll_lock_int_out , */\ - { 0x2020, "flag_otpok_int_out"}, /* flag_otpok_int_out , */\ - { 0x2030, "flag_ovpok_int_out"}, /* flag_ovpok_int_out , */\ - { 0x2040, "flag_uvpok_int_out"}, /* flag_uvpok_int_out , */\ - { 0x2050, "flag_ocp_alarm_int_out"}, /* flag_ocp_alarm_int_out , */\ - { 0x2060, "flag_clocks_stable_int_out"}, /* flag_clocks_stable_int_out , */\ - { 0x2070, "flag_clip_int_out"}, /* flag_clip_int_out , */\ - { 0x2080, "mtp_busy_int_out"}, /* mtp_busy_int_out , */\ - { 0x2090, "flag_lost_clk_int_out"}, /* flag_lost_clk_int_out , */\ - { 0x20a0, "flag_cf_speakererror_int_out"}, /* flag_cf_speakererror_int_out , */\ - { 0x20b0, "flag_cold_started_int_out"}, /* flag_cold_started_int_out , */\ - { 0x20c0, "flag_engage_int_out"}, /* flag_engage_int_out , */\ - { 0x20d0, "flag_watchdog_reset_int_out"}, /* flag_watchdog_reset_int_out , */\ - { 0x20e0, "flag_enbl_amp_int_out"}, /* flag_enbl_amp_int_out , */\ - { 0x20f0, "flag_enbl_ref_int_out"}, /* flag_enbl_ref_int_out , */\ - { 0x2100, "flag_voutcomp_int_out"}, /* flag_voutcomp_int_out , */\ - { 0x2110, "flag_voutcomp93_int_out"}, /* flag_voutcomp93_int_out , */\ - { 0x2120, "flag_voutcomp86_int_out"}, /* flag_voutcomp86_int_out , */\ - { 0x2130, "flag_hiz_int_out"}, /* flag_hiz_int_out , */\ - { 0x2140, "flag_ocpokbst_int_out"}, /* flag_ocpokbst_int_out , */\ - { 0x2150, "flag_peakcur_int_out"}, /* flag_peakcur_int_out , */\ - { 0x2160, "flag_ocpokap_int_out"}, /* flag_ocpokap_int_out , */\ - { 0x2170, "flag_ocpokan_int_out"}, /* flag_ocpokan_int_out , */\ - { 0x2180, "flag_ocpokbp_int_out"}, /* flag_ocpokbp_int_out , */\ - { 0x2190, "flag_ocpokbn_int_out"}, /* flag_ocpokbn_int_out , */\ - { 0x21a0, "flag_adc10_ready_int_out"}, /* flag_adc10_ready_int_out , */\ - { 0x21b0, "flag_clipa_high_int_out"}, /* flag_clipa_high_int_out , */\ - { 0x21c0, "flag_clipa_low_int_out"}, /* flag_clipa_low_int_out , */\ - { 0x21d0, "flag_clipb_high_int_out"}, /* flag_clipb_high_int_out , */\ - { 0x21e0, "flag_clipb_low_int_out"}, /* flag_clipb_low_int_out , */\ - { 0x21f0, "flag_tdm_error_int_out"}, /* flag_tdm_error_int_out , */\ - { 0x2200, "flag_cfma_err_int_out"}, /* flag_cfma_err_int_out , */\ - { 0x2210, "flag_cfma_ack_int_out"}, /* flag_cfma_ack_int_out , */\ - { 0x2300, "flag_por_int_in"}, /* flag_por_int_in , */\ - { 0x2310, "flag_pll_lock_int_in"}, /* flag_pll_lock_int_in , */\ - { 0x2320, "flag_otpok_int_in"}, /* flag_otpok_int_in , */\ - { 0x2330, "flag_ovpok_int_in"}, /* flag_ovpok_int_in , */\ - { 0x2340, "flag_uvpok_int_in"}, /* flag_uvpok_int_in , */\ - { 0x2350, "flag_ocp_alarm_int_in"}, /* flag_ocp_alarm_int_in , */\ - { 0x2360, "flag_clocks_stable_int_in"}, /* flag_clocks_stable_int_in , */\ - { 0x2370, "flag_clip_int_in"}, /* flag_clip_int_in , */\ - { 0x2380, "mtp_busy_int_in"}, /* mtp_busy_int_in , */\ - { 0x2390, "flag_lost_clk_int_in"}, /* flag_lost_clk_int_in , */\ - { 0x23a0, "flag_cf_speakererror_int_in"}, /* flag_cf_speakererror_int_in , */\ - { 0x23b0, "flag_cold_started_int_in"}, /* flag_cold_started_int_in , */\ - { 0x23c0, "flag_engage_int_in"}, /* flag_engage_int_in , */\ - { 0x23d0, "flag_watchdog_reset_int_in"}, /* flag_watchdog_reset_int_in , */\ - { 0x23e0, "flag_enbl_amp_int_in"}, /* flag_enbl_amp_int_in , */\ - { 0x23f0, "flag_enbl_ref_int_in"}, /* flag_enbl_ref_int_in , */\ - { 0x2400, "flag_voutcomp_int_in"}, /* flag_voutcomp_int_in , */\ - { 0x2410, "flag_voutcomp93_int_in"}, /* flag_voutcomp93_int_in , */\ - { 0x2420, "flag_voutcomp86_int_in"}, /* flag_voutcomp86_int_in , */\ - { 0x2430, "flag_hiz_int_in"}, /* flag_hiz_int_in , */\ - { 0x2440, "flag_ocpokbst_int_in"}, /* flag_ocpokbst_int_in , */\ - { 0x2450, "flag_peakcur_int_in"}, /* flag_peakcur_int_in , */\ - { 0x2460, "flag_ocpokap_int_in"}, /* flag_ocpokap_int_in , */\ - { 0x2470, "flag_ocpokan_int_in"}, /* flag_ocpokan_int_in , */\ - { 0x2480, "flag_ocpokbp_int_in"}, /* flag_ocpokbp_int_in , */\ - { 0x2490, "flag_ocpokbn_int_in"}, /* flag_ocpokbn_int_in , */\ - { 0x24a0, "flag_adc10_ready_int_in"}, /* flag_adc10_ready_int_in , */\ - { 0x24b0, "flag_clipa_high_int_in"}, /* flag_clipa_high_int_in , */\ - { 0x24c0, "flag_clipa_low_int_in"}, /* flag_clipa_low_int_in , */\ - { 0x24d0, "flag_clipb_high_int_in"}, /* flag_clipb_high_int_in , */\ - { 0x24e0, "flag_clipb_low_int_in"}, /* flag_clipb_low_int_in , */\ - { 0x24f0, "flag_tdm_error_int_in"}, /* flag_tdm_error_int_in , */\ - { 0x2500, "flag_cfma_err_int_in"}, /* flag_cfma_err_int_in , */\ - { 0x2510, "flag_cfma_ack_int_in"}, /* flag_cfma_ack_int_in , */\ - { 0x2600, "flag_por_int_enable"}, /* flag_por_int_enable , */\ - { 0x2610, "flag_pll_lock_int_enable"}, /* flag_pll_lock_int_enable , */\ - { 0x2620, "flag_otpok_int_enable"}, /* flag_otpok_int_enable , */\ - { 0x2630, "flag_ovpok_int_enable"}, /* flag_ovpok_int_enable , */\ - { 0x2640, "flag_uvpok_int_enable"}, /* flag_uvpok_int_enable , */\ - { 0x2650, "flag_ocp_alarm_int_enable"}, /* flag_ocp_alarm_int_enable , */\ - { 0x2660, "flag_clocks_stable_int_enable"}, /* flag_clocks_stable_int_enable , */\ - { 0x2670, "flag_clip_int_enable"}, /* flag_clip_int_enable , */\ - { 0x2680, "mtp_busy_int_enable"}, /* mtp_busy_int_enable , */\ - { 0x2690, "flag_lost_clk_int_enable"}, /* flag_lost_clk_int_enable , */\ - { 0x26a0, "flag_cf_speakererror_int_enable"}, /* flag_cf_speakererror_int_enable , */\ - { 0x26b0, "flag_cold_started_int_enable"}, /* flag_cold_started_int_enable , */\ - { 0x26c0, "flag_engage_int_enable"}, /* flag_engage_int_enable , */\ - { 0x26d0, "flag_watchdog_reset_int_enable"}, /* flag_watchdog_reset_int_enable , */\ - { 0x26e0, "flag_enbl_amp_int_enable"}, /* flag_enbl_amp_int_enable , */\ - { 0x26f0, "flag_enbl_ref_int_enable"}, /* flag_enbl_ref_int_enable , */\ - { 0x2700, "flag_voutcomp_int_enable"}, /* flag_voutcomp_int_enable , */\ - { 0x2710, "flag_voutcomp93_int_enable"}, /* flag_voutcomp93_int_enable , */\ - { 0x2720, "flag_voutcomp86_int_enable"}, /* flag_voutcomp86_int_enable , */\ - { 0x2730, "flag_hiz_int_enable"}, /* flag_hiz_int_enable , */\ - { 0x2740, "flag_ocpokbst_int_enable"}, /* flag_ocpokbst_int_enable , */\ - { 0x2750, "flag_peakcur_int_enable"}, /* flag_peakcur_int_enable , */\ - { 0x2760, "flag_ocpokap_int_enable"}, /* flag_ocpokap_int_enable , */\ - { 0x2770, "flag_ocpokan_int_enable"}, /* flag_ocpokan_int_enable , */\ - { 0x2780, "flag_ocpokbp_int_enable"}, /* flag_ocpokbp_int_enable , */\ - { 0x2790, "flag_ocpokbn_int_enable"}, /* flag_ocpokbn_int_enable , */\ - { 0x27a0, "flag_adc10_ready_int_enable"}, /* flag_adc10_ready_int_enable , */\ - { 0x27b0, "flag_clipa_high_int_enable"}, /* flag_clipa_high_int_enable , */\ - { 0x27c0, "flag_clipa_low_int_enable"}, /* flag_clipa_low_int_enable , */\ - { 0x27d0, "flag_clipb_high_int_enable"}, /* flag_clipb_high_int_enable , */\ - { 0x27e0, "flag_clipb_low_int_enable"}, /* flag_clipb_low_int_enable , */\ - { 0x27f0, "flag_tdm_error_int_enable"}, /* flag_tdm_error_int_enable , */\ - { 0x2800, "flag_cfma_err_int_enable"}, /* flag_cfma_err_int_enable , */\ - { 0x2810, "flag_cfma_ack_int_enable"}, /* flag_cfma_ack_int_enable , */\ - { 0x2900, "flag_por_int_pol"}, /* flag_por_int_pol , */\ - { 0x2910, "flag_pll_lock_int_pol"}, /* flag_pll_lock_int_pol , */\ - { 0x2920, "flag_otpok_int_pol"}, /* flag_otpok_int_pol , */\ - { 0x2930, "flag_ovpok_int_pol"}, /* flag_ovpok_int_pol , */\ - { 0x2940, "flag_uvpok_int_pol"}, /* flag_uvpok_int_pol , */\ - { 0x2950, "flag_ocp_alarm_int_pol"}, /* flag_ocp_alarm_int_pol , */\ - { 0x2960, "flag_clocks_stable_int_pol"}, /* flag_clocks_stable_int_pol , */\ - { 0x2970, "flag_clip_int_pol"}, /* flag_clip_int_pol , */\ - { 0x2980, "mtp_busy_int_pol"}, /* mtp_busy_int_pol , */\ - { 0x2990, "flag_lost_clk_int_pol"}, /* flag_lost_clk_int_pol , */\ - { 0x29a0, "flag_cf_speakererror_int_pol"}, /* flag_cf_speakererror_int_pol , */\ - { 0x29b0, "flag_cold_started_int_pol"}, /* flag_cold_started_int_pol , */\ - { 0x29c0, "flag_engage_int_pol"}, /* flag_engage_int_pol , */\ - { 0x29d0, "flag_watchdog_reset_int_pol"}, /* flag_watchdog_reset_int_pol , */\ - { 0x29e0, "flag_enbl_amp_int_pol"}, /* flag_enbl_amp_int_pol , */\ - { 0x29f0, "flag_enbl_ref_int_pol"}, /* flag_enbl_ref_int_pol , */\ - { 0x2a00, "flag_voutcomp_int_pol"}, /* flag_voutcomp_int_pol , */\ - { 0x2a10, "flag_voutcomp93_int_pol"}, /* flag_voutcomp93_int_pol , */\ - { 0x2a20, "flag_voutcomp86_int_pol"}, /* flag_voutcomp86_int_pol , */\ - { 0x2a30, "flag_hiz_int_pol"}, /* flag_hiz_int_pol , */\ - { 0x2a40, "flag_ocpokbst_int_pol"}, /* flag_ocpokbst_int_pol , */\ - { 0x2a50, "flag_peakcur_int_pol"}, /* flag_peakcur_int_pol , */\ - { 0x2a60, "flag_ocpokap_int_pol"}, /* flag_ocpokap_int_pol , */\ - { 0x2a70, "flag_ocpokan_int_pol"}, /* flag_ocpokan_int_pol , */\ - { 0x2a80, "flag_ocpokbp_int_pol"}, /* flag_ocpokbp_int_pol , */\ - { 0x2a90, "flag_ocpokbn_int_pol"}, /* flag_ocpokbn_int_pol , */\ - { 0x2aa0, "flag_adc10_ready_int_pol"}, /* flag_adc10_ready_int_pol , */\ - { 0x2ab0, "flag_clipa_high_int_pol"}, /* flag_clipa_high_int_pol , */\ - { 0x2ac0, "flag_clipa_low_int_pol"}, /* flag_clipa_low_int_pol , */\ - { 0x2ad0, "flag_clipb_high_int_pol"}, /* flag_clipb_high_int_pol , */\ - { 0x2ae0, "flag_clipb_low_int_pol"}, /* flag_clipb_low_int_pol , */\ - { 0x2af0, "flag_tdm_error_int_pol"}, /* flag_tdm_error_int_pol , */\ - { 0x2b00, "flag_cfma_err_int_pol"}, /* flag_cfma_err_int_pol , */\ - { 0x2b10, "flag_cfma_ack_int_pol"}, /* flag_cfma_ack_int_pol , */\ - { 0x3000, "flag_voutcomp"}, /* Status flag_voutcomp, indication Vset is larger than Vbat, */\ - { 0x3010, "flag_voutcomp93"}, /* Status flag_voutcomp93, indication Vset is larger than 1.07 x Vbat, */\ - { 0x3020, "flag_voutcomp86"}, /* Status flag voutcomp86, indication Vset is larger than 1.14 x Vbat, */\ - { 0x3030, "flag_hiz"}, /* Status flag_hiz, indication Vbst is larger than Vbat, */\ - { 0x3040, "flag_ocpokbst"}, /* Status flag_ocpokbst, indication no over current in boost converter PMOS switch, */\ - { 0x3050, "flag_peakcur"}, /* Status flag_peakcur, indication current is max in dcdc converter, */\ - { 0x3060, "flag_ocpokap"}, /* Status flag_ocpokap, indication no over current in amplifier A PMOS output stage, */\ - { 0x3070, "flag_ocpokan"}, /* Status flag_ocpokan, indication no over current in amplifier A NMOS output stage, */\ - { 0x3080, "flag_ocpokbp"}, /* Status flag_ocpokbp, indication no over current in amplifier B PMOS output stage, */\ - { 0x3090, "flag_ocpokbn"}, /* Status flag_ocpokbn, indication no over current in amplifier B NMOS output stage, */\ - { 0x30a0, "flag_adc10_ready"}, /* Status flag_adc10_ready, indication adc10 is ready, */\ - { 0x30b0, "flag_clipa_high"}, /* Status flag_clipa_high, indication pmos amplifier A is clipping, */\ - { 0x30c0, "flag_clipa_low"}, /* Status flag_clipa_low, indication nmos amplifier A is clipping, */\ - { 0x30d0, "flag_clipb_high"}, /* Status flag_clipb_high, indication pmos amplifier B is clipping, */\ - { 0x30e0, "flag_clipb_low"}, /* Status flag_clipb_low, indication nmos amplifier B is clipping, */\ - { 0x310f, "mtp_man_data_out"}, /* MTP manual read out data , */\ - { 0x3200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0x3210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0x3225, "mtp_ecc_tcout"}, /* MTP error correction test data out , */\ - { 0x3280, "mtpctrl_valid_test_rd"}, /* MTP test readout for read , */\ - { 0x3290, "mtpctrl_valid_test_wr"}, /* MTP test readout for write , */\ - { 0x32a0, "flag_in_alarm_state"}, /* Flag alarm state , */\ - { 0x32b0, "mtp_ecc_err2"}, /* Two or more bit errors detected in MTP, can not reconstruct value, */\ - { 0x32c0, "mtp_ecc_err1"}, /* One bit error detected in MTP, reconstructed value, */\ - { 0x32d0, "mtp_mtp_hvf"}, /* High voltage ready flag for MTP , */\ - { 0x32f0, "mtp_zero_check_fail"}, /* Zero check failed for MTP , */\ - { 0x3309, "data_adc10_tempbat"}, /* ADC10 data output for testing battery voltage and temperature, */\ - { 0x400f, "hid_code"}, /* 5A6Bh, 23147d to access hidden registers (default for engineering), */\ - { 0x4100, "bypass_hp"}, /* Bypass High Pass Filter , */\ - { 0x4110, "hard_mute"}, /* Hard Mute , */\ - { 0x4120, "soft_mute"}, /* Soft Mute , */\ - { 0x4134, "pwm_delay"}, /* PWM delay setting , */\ - { 0x4180, "pwm_shape"}, /* PWM Shape , */\ - { 0x4190, "pwm_bitlength"}, /* PWM Bitlength in noise shaper , */\ - { 0x4203, "drive"}, /* Drive bits to select number of amplifier power stages, */\ - { 0x4240, "reclock_pwm"}, /* Control for enabling reclocking of PWM signal , */\ - { 0x4250, "reclock_voltsense"}, /* Control for enabling reclocking of voltage sense signal, */\ - { 0x4281, "dpsalevel"}, /* DPSA threshold level , */\ - { 0x42a1, "dpsa_release"}, /* DPSA release time , */\ - { 0x42c0, "coincidence"}, /* Prevent simultaneously switching of output stage , */\ - { 0x42d0, "kickback"}, /* Prevent double pulses of output stage , */\ - { 0x4306, "drivebst"}, /* Drive bits to select the power transistor sections boost converter, */\ - { 0x4370, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x4381, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x43a0, "ocptestbst"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0); For new ocp (ctrl_reversebst is 1), */\ - { 0x43d0, "test_abistfft_enbl"}, /* FFT Coolflux , */\ - { 0x43e0, "bst_dcmbst"}, /* DCM mode control for DCDC during I2C direct control mode, */\ - { 0x43f0, "test_bcontrol"}, /* test_bcontrol , */\ - { 0x4400, "reversebst"}, /* OverCurrent Protection selection of power stage boost converter, */\ - { 0x4410, "sensetest"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0x4420, "enbl_engagebst"}, /* Enable power stage of dcdc controller , */\ - { 0x4470, "enbl_slopecur"}, /* Enable bit of max-current dac , */\ - { 0x4480, "enbl_voutcomp"}, /* Enable vout comparators , */\ - { 0x4490, "enbl_voutcomp93"}, /* Enable vout-93 comparators , */\ - { 0x44a0, "enbl_voutcomp86"}, /* Enable vout-86 comparators , */\ - { 0x44b0, "enbl_hizcom"}, /* Enable hiz comparator , */\ - { 0x44c0, "enbl_peakcur"}, /* Enable peak current , */\ - { 0x44d0, "bypass_ovpglitch"}, /* Bypass OVP Glitch Filter , */\ - { 0x44e0, "enbl_windac"}, /* Enable window dac , */\ - { 0x44f0, "enbl_powerbst"}, /* Enable line of the powerstage , */\ - { 0x4507, "ocp_thr"}, /* OCP threshold level , */\ - { 0x4580, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0x4590, "bypass_ovp"}, /* Bypass OVP , */\ - { 0x45a0, "bypass_uvp"}, /* Bypass UVP , */\ - { 0x45b0, "bypass_otp"}, /* Bypass OTP , */\ - { 0x45d0, "bypass_ocpcounter"}, /* Bypass OCP counter , */\ - { 0x45e0, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0x45f0, "vpalarm"}, /* vpalarm (UVP/OUP handling) , */\ - { 0x4600, "bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x4610, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x4627, "cs_gain"}, /* Current sense gain , */\ - { 0x46a0, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ - { 0x46b0, "bypass_pwmcounter"}, /* Bypass PWM Counter , */\ - { 0x46c0, "cs_negfixed"}, /* Current sense does not switch to neg , */\ - { 0x46d2, "cs_neghyst"}, /* Current sense switches to neg depending on hyseteris level, */\ - { 0x4700, "switch_fb"}, /* Current sense control switch_fb , */\ - { 0x4713, "se_hyst"}, /* Current sense control se_hyst , */\ - { 0x4754, "se_level"}, /* Current sense control se_level , */\ - { 0x47a5, "ktemp"}, /* Current sense control temperature compensation trimming, */\ - { 0x4800, "cs_negin"}, /* Current sense control negin , */\ - { 0x4810, "cs_sein"}, /* Current sense control cs_sein , */\ - { 0x4820, "cs_coincidence"}, /* Coincidence current sense , */\ - { 0x4830, "iddqtestbst"}, /* IDDQ testing in powerstage of DCDC boost converter, */\ - { 0x4840, "coincidencebst"}, /* Switch protection on to prevent simultaneously switching power stages bst and amp, */\ - { 0x4876, "delay_se_neg"}, /* delay of se and neg , */\ - { 0x48e1, "cs_ttrack"}, /* Sample and hold track time , */\ - { 0x4900, "bypass_clip"}, /* Bypass clip control , */\ - { 0x4920, "cf_cgate_off"}, /* Disable clock gating in the coolflux , */\ - { 0x4940, "clipfast"}, /* Clock selection for HW clipper for battery safeguard, */\ - { 0x4950, "cs_8ohm"}, /* 8 ohm mode for current sense (gain mode) , */\ - { 0x4974, "delay_clock_sh"}, /* delay_sh, tunes S7H delay , */\ - { 0x49c0, "inv_clksh"}, /* Invert the sample/hold clock for current sense ADC, */\ - { 0x49d0, "inv_neg"}, /* Invert neg signal , */\ - { 0x49e0, "inv_se"}, /* Invert se signal , */\ - { 0x49f0, "setse"}, /* Switches between Single Ended and differential mode; 1 is single ended, */\ - { 0x4a12, "adc10_sel"}, /* Select the input to convert the 10b ADC , */\ - { 0x4a60, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0x4a81, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0x4aa0, "bypass_lp_vbat"}, /* LP filter in batt sensor , */\ - { 0x4ae0, "dc_offset"}, /* Current sense decimator offset control , */\ - { 0x4af0, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high , */\ - { 0x4b00, "adc13_iset"}, /* MICADC setting of current consumption (debug use only), */\ - { 0x4b14, "adc13_gain"}, /* MICADC gain setting (two's complement format) , */\ - { 0x4b61, "adc13_slowdel"}, /* MICADC delay setting for internal clock (debug use only), */\ - { 0x4b83, "adc13_offset"}, /* MICADC offset setting , */\ - { 0x4bc0, "adc13_bsoinv"}, /* MICADC bit stream output invert mode for test , */\ - { 0x4bd0, "adc13_resonator_enable"}, /* MICADC give extra SNR with less stability (debug use only), */\ - { 0x4be0, "testmicadc"}, /* Mux at input of MICADC for test purpose , */\ - { 0x4c0f, "abist_offset"}, /* Offset control for ABIST testing , */\ - { 0x4d05, "windac"}, /* For testing direct control windac , */\ - { 0x4dc3, "pwm_dcc_cnt"}, /* control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0x4e04, "slopecur"}, /* For testing direct control slopecur , */\ - { 0x4e50, "ctrl_dem"}, /* Dynamic element matching control, rest of codes are optional, */\ - { 0x4ed0, "enbl_pwm_dcc"}, /* Enable direct control of pwm duty cycle , */\ - { 0x4f00, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x4f10, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x4f20, "bst_ctrl_azbst"}, /* Control of auto-zeroing of zero current comparator, */\ - { 0x5007, "gain"}, /* Gain setting of the gain multiplier , */\ - { 0x5081, "sourceb"}, /* PWM OUTB selection control , */\ - { 0x50a1, "sourcea"}, /* PWM OUTA selection control , */\ - { 0x50c1, "sourcebst"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0x50e0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0x5104, "pulselengthbst"}, /* Pulse length setting test input for boost converter, */\ - { 0x5150, "bypasslatchbst"}, /* Bypass latch in boost converter , */\ - { 0x5160, "invertbst"}, /* Invert pwmbst test signal , */\ - { 0x5174, "pulselength"}, /* Pulse length setting test input for amplifier , */\ - { 0x51c0, "bypasslatch"}, /* Bypass latch in PWM source selection module , */\ - { 0x51d0, "invertb"}, /* invert pwmb test signal , */\ - { 0x51e0, "inverta"}, /* invert pwma test signal , */\ - { 0x51f0, "bypass_ctrlloop"}, /* bypass_ctrlloop bypasses the control loop of the amplifier, */\ - { 0x5210, "test_rdsona"}, /* tbd for rdson testing , */\ - { 0x5220, "test_rdsonb"}, /* tbd for rdson testing , */\ - { 0x5230, "test_rdsonbst"}, /* tbd for rdson testing , */\ - { 0x5240, "test_cvia"}, /* tbd for rdson testing , */\ - { 0x5250, "test_cvib"}, /* tbd for rdson testing , */\ - { 0x5260, "test_cvibst"}, /* tbd for rdson testing , */\ - { 0x5306, "digimuxa_sel"}, /* DigimuxA input selection control (see Digimux list for details), */\ - { 0x5376, "digimuxb_sel"}, /* DigimuxB input selection control (see Digimux list for details), */\ - { 0x5400, "hs_mode"}, /* I2C high speed mode selection control , */\ - { 0x5412, "test_parametric_io"}, /* Control for parametric tests of IO cells , */\ - { 0x5440, "enbl_ringo"}, /* Enable ring oscillator control, for test purpose to check with ringo, */\ - { 0x5456, "digimuxc_sel"}, /* DigimuxC input selection control (see Digimux list for details), */\ - { 0x54c0, "dio_ehs"}, /* Slew control for DIO in output mode , */\ - { 0x54d0, "gainio_ehs"}, /* Slew control for GAINIO in output mode , */\ - { 0x550d, "enbl_amp"}, /* enbl_amp for testing to enable all analoge blocks in amplifier, */\ - { 0x5600, "use_direct_ctrls"}, /* Use direct controls to overrule several functions for testing - I2C direct control mode, */\ - { 0x5610, "rst_datapath"}, /* Reset datapath during direct control mode , */\ - { 0x5620, "rst_cgu"}, /* Reset CGU during durect control mode , */\ - { 0x5637, "enbl_ref"}, /* For testing to enable all analoge blocks in references, */\ - { 0x56b0, "enbl_engage"}, /* Enable output stage amplifier , */\ - { 0x56c0, "use_direct_clk_ctrl"}, /* use_direct_clk_ctrl, to overrule several functions direct for testing, */\ - { 0x56d0, "use_direct_pll_ctrl"}, /* use_direct_pll_ctrl, to overrule several functions direct for testing, */\ - { 0x5707, "anamux"}, /* Anamux control , */\ - { 0x57e0, "otptest"}, /* otptest, test mode otp amplifier , */\ - { 0x57f0, "reverse"}, /* 1b = Normal mode, slope is controlled , */\ - { 0x5813, "pll_selr"}, /* PLL pll_selr , */\ - { 0x5854, "pll_selp"}, /* PLL pll_selp , */\ - { 0x58a5, "pll_seli"}, /* PLL pll_seli , */\ - { 0x5950, "pll_mdec_msb"}, /* Most significant bits of pll_mdec[16] , */\ - { 0x5960, "pll_ndec_msb"}, /* Most significant bits of pll_ndec[9] , */\ - { 0x5970, "pll_frm"}, /* PLL pll_frm , */\ - { 0x5980, "pll_directi"}, /* PLL pll_directi , */\ - { 0x5990, "pll_directo"}, /* PLL pll_directo , */\ - { 0x59a0, "enbl_pll"}, /* PLL enbl_pll , */\ - { 0x59f0, "pll_bypass"}, /* PLL bypass , */\ - { 0x5a0f, "tsig_freq"}, /* Internal sinus test generator frequency control LSB bits, */\ - { 0x5b02, "tsig_freq_msb"}, /* Select internal sine wave generator, frequency control MSB bits, */\ - { 0x5b30, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0x5b44, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0x5c0f, "pll_mdec"}, /* PLL MDEC - I2C direct PLL control mode only , */\ - { 0x5d06, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ - { 0x5d78, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ - { 0x6007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0x6185, "mtp_ecc_tcin"}, /* MTP ECC TCIN data , */\ - { 0x6203, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0x6260, "mtp_ecc_eeb"}, /* Enable code bit generation (active low!) , */\ - { 0x6270, "mtp_ecc_ecb"}, /* Enable correction signal (active low!) , */\ - { 0x6280, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0x6290, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0x62a0, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0x62b0, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0x62d2, "mtp_speed_mode"}, /* MTP speed mode , */\ - { 0x6340, "mtp_direct_enable"}, /* mtp_direct_enable , */\ - { 0x6350, "mtp_direct_wr"}, /* mtp_direct_wr , */\ - { 0x6360, "mtp_direct_rd"}, /* mtp_direct_rd , */\ - { 0x6370, "mtp_direct_rst"}, /* mtp_direct_rst , */\ - { 0x6380, "mtp_direct_ers"}, /* mtp_direct_ers , */\ - { 0x6390, "mtp_direct_prg"}, /* mtp_direct_prg , */\ - { 0x63a0, "mtp_direct_epp"}, /* mtp_direct_epp , */\ - { 0x63b4, "mtp_direct_test"}, /* mtp_direct_test , */\ - { 0x640f, "mtp_man_data_in"}, /* Write data for MTP manual write , */\ - { 0x7000, "cf_rst_dsp"}, /* Reset CoolFlux DSP , */\ - { 0x7011, "cf_dmem"}, /* Target memory for access , */\ - { 0x7030, "cf_aif"}, /* Auto increment flag for memory-address , */\ - { 0x7040, "cf_int"}, /* CF Interrupt - auto clear , */\ - { 0x7087, "cf_req"}, /* CF request for accessing the 8 channels , */\ - { 0x710f, "cf_madd"}, /* Memory address , */\ - { 0x720f, "cf_mema"}, /* Activate memory access , */\ - { 0x7307, "cf_err"}, /* CF error flags , */\ - { 0x7387, "cf_ack"}, /* CF acknowledgement of the requests channels , */\ - { 0x8000, "calibration_onetime"}, /* Calibration schedule selection , */\ - { 0x8010, "calibr_ron_done"}, /* Calibration of RON status bit , */\ - { 0x8105, "calibr_vout_offset"}, /* calibr_vout_offset (DCDCoffset) 2's compliment (key1 protected), */\ - { 0x8163, "calibr_delta_gain"}, /* delta gain for vamp (alpha) 2's compliment (key1 protected), */\ - { 0x81a5, "calibr_offs_amp"}, /* offset for vamp (Ampoffset) 2's compliment (key1 protected), */\ - { 0x8207, "calibr_gain_cs"}, /* gain current sense (Imeasalpha) 2's compliment (key1 protected), */\ - { 0x8284, "calibr_temp_offset"}, /* temperature offset 2's compliment (key1 protected), */\ - { 0x82d2, "calibr_temp_gain"}, /* temperature gain 2's compliment (key1 protected) , */\ - { 0x830f, "calibr_ron"}, /* calibration value of the RON resistance of the coil, */\ - { 0x8505, "type_bits_hw"}, /* bit0 = disable function dcdcoff_mode ($09[7]) , */\ - { 0x8601, "type_bits_1_0_sw"}, /* MTP control SW , */\ - { 0x8681, "type_bits_9_8_sw"}, /* MTP control SW , */\ - { 0x870f, "type_bits2_sw"}, /* MTP-control SW2 , */\ - { 0x8806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0x8870, "htol_iic_addr_en"}, /* HTOL I2C_Address_Enable , */\ - { 0x8881, "ctrl_ovp_response"}, /* OVP response control , */\ - { 0x88a0, "disable_ovp_alarm_state"}, /* OVP alarm state control , */\ - { 0x88b0, "enbl_stretch_ovp"}, /* OVP alram strech control , */\ - { 0x88c0, "cf_debug_mode"}, /* Coolflux debug mode , */\ - { 0x8a0f, "production_data1"}, /* production_data1 , */\ - { 0x8b0f, "production_data2"}, /* production_data2 , */\ - { 0x8c0f, "production_data3"}, /* production_data3 , */\ - { 0x8d0f, "production_data4"}, /* production_data4 , */\ - { 0x8e0f, "production_data5"}, /* production_data5 , */\ - { 0x8f0f, "production_data6"}, /* production_data6 , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum TFA9896_irq { - TFA9896_irq_vdds = 0, - TFA9896_irq_plls = 1, - TFA9896_irq_ds = 2, - TFA9896_irq_vds = 3, - TFA9896_irq_uvds = 4, - TFA9896_irq_cds = 5, - TFA9896_irq_clks = 6, - TFA9896_irq_clips = 7, - TFA9896_irq_mtpb = 8, - TFA9896_irq_clk = 9, - TFA9896_irq_spks = 10, - TFA9896_irq_acs = 11, - TFA9896_irq_sws = 12, - TFA9896_irq_wds = 13, - TFA9896_irq_amps = 14, - TFA9896_irq_arefs = 15, - TFA9896_irq_err = 32, - TFA9896_irq_ack = 33, - TFA9896_irq_max = 34, - TFA9896_irq_all = -1 /* all irqs */}; - -#define TFA9896_IRQ_NAMETABLE static tfaIrqName_t TFA9896IrqNames[] = {\ - { 0, "VDDS"},\ - { 1, "PLLS"},\ - { 2, "DS"},\ - { 3, "VDS"},\ - { 4, "UVDS"},\ - { 5, "CDS"},\ - { 6, "CLKS"},\ - { 7, "CLIPS"},\ - { 8, "MTPB"},\ - { 9, "CLK"},\ - { 10, "SPKS"},\ - { 11, "ACS"},\ - { 12, "SWS"},\ - { 13, "WDS"},\ - { 14, "AMPS"},\ - { 15, "AREFS"},\ - { 16, "16"},\ - { 17, "17"},\ - { 18, "18"},\ - { 19, "19"},\ - { 20, "20"},\ - { 21, "21"},\ - { 22, "22"},\ - { 23, "23"},\ - { 24, "24"},\ - { 25, "25"},\ - { 26, "26"},\ - { 27, "27"},\ - { 28, "28"},\ - { 29, "29"},\ - { 30, "30"},\ - { 31, "31"},\ - { 32, "ERR"},\ - { 33, "ACK"},\ - { 34, "34"},\ -}; -#endif /* _TFA9896_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx.h deleted file mode 100644 index eb748d44fcef..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#ifndef __TFA98XX_INC__ -#define __TFA98XX_INC__ - -#include -#include -#include -#include - -#include "tfa_device.h" -#include "tfa_container.h" -#include "config.h" - -/* max. length of a alsa mixer control name */ -#define MAX_CONTROL_NAME 48 - -#define TFA98XX_MAX_REGISTER 0xff - -#define TFA98XX_FLAG_SKIP_INTERRUPTS (1 << 0) -#define TFA98XX_FLAG_SAAM_AVAILABLE (1 << 1) -#define TFA98XX_FLAG_STEREO_DEVICE (1 << 2) -#define TFA98XX_FLAG_MULTI_MIC_INPUTS (1 << 3) -#define TFA98XX_FLAG_TAPDET_AVAILABLE (1 << 4) -#define TFA98XX_FLAG_CALIBRATION_CTL (1 << 5) -#define TFA98XX_FLAG_REMOVE_PLOP_NOISE (1 << 6) -#define TFA98XX_FLAG_LP_MODES (1 << 7) -#define TFA98XX_FLAG_TDM_DEVICE (1 << 8) -#define TFA98XX_FLAG_ADAPT_NOISE_MODE (1 << 9) - -#define TFA98XX_NUM_RATES 9 - -/* DSP init status */ -enum tfa98xx_dsp_init_state { - TFA98XX_DSP_INIT_STOPPED, /* DSP not running */ - TFA98XX_DSP_INIT_RECOVER, /* DSP error detected at runtime */ - TFA98XX_DSP_INIT_FAIL, /* DSP init failed */ - TFA98XX_DSP_INIT_PENDING, /* DSP start requested */ - TFA98XX_DSP_INIT_DONE, /* DSP running */ - TFA98XX_DSP_INIT_INVALIDATED, /* DSP was running, requires re-init */ -}; - -enum tfa98xx_dsp_fw_state { - TFA98XX_DSP_FW_NONE = 0, - TFA98XX_DSP_FW_PENDING, - TFA98XX_DSP_FW_FAIL, - TFA98XX_DSP_FW_OK, -}; - -enum tfa98xx_misc_device_id { - MISC_DEVICE_TFA98XX_REG, - MISC_DEVICE_TFA98XX_RW, - MISC_DEVICE_TFA98XX_RPC, - MISC_DEVICE_TFA98XX_PROFILE, - MISC_DEVICE_TFA98XX_IOCTL, - MISC_DEVICE_MAX -}; - -struct tfa98xx_miscdevice_info { - char devicename[255]; - struct file_operations operations; -}; - -enum TFA_DEVICE_TYPE { - TFA_DEVICE_TYPE_9894, - TFA_DEVICE_TYPE_9874_PRIMARY, - TFA_DEVICE_TYPE_9874_SECONDARY, - TFA_DEVICE_TYPE_MAX -}; - -enum TFA_DEVICE_MUTE { - TFA98XX_DEVICE_MUTE_OFF = 0, - TFA98XX_DEVICE_MUTE_ON, -}; - -enum { - IOCTL_CMD_GET_MEMTRACK_DATA = 0, - IOCTL_CMD_GET_CNT_VERSION, -}; - -enum { - MEMTRACK_ITEM_SPEAKER_F0 = 0, - MEMTRACK_ITEM_SPEAKER_TEMPERATURE, - MEMTRACK_ITEM_SPEAKER_IMPEDANCE, - MEMTRACK_ITEM_MAX -}; - -struct livedata_cfg { - int address; - int track; - int scaler; -}; - -struct tfa98xx_firmware { - void *base; - struct tfa98xx_device *dev; - char name[9]; //TODO get length from tfa parameter defs -}; - -struct tfa98xx_baseprofile { - char basename[MAX_CONTROL_NAME]; /* profile basename */ - int len; /* profile length */ - int item_id; /* profile id */ - int sr_rate_sup[TFA98XX_NUM_RATES]; /* sample rates supported by this profile */ - struct list_head list; /* list of all profiles */ -}; -enum tfa_reset_polarity { - LOW = 0, - HIGH = 1 -}; -struct tfa98xx { - struct regmap *regmap; - struct i2c_client *i2c; - struct regulator *vdd; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec; -#else - struct snd_soc_codec *codec; -#endif - struct workqueue_struct *tfa98xx_wq; - struct delayed_work init_work; - struct delayed_work monitor_work; - struct delayed_work interrupt_work; - struct delayed_work tapdet_work; - struct delayed_work nmodeupdate_work; - struct mutex dsp_lock; - int dsp_init; - int dsp_fw_state; - int sysclk; - int rst_gpio; - u16 rev; - int audio_mode; - struct tfa98xx_firmware fw; - char *fw_name; - int rate; - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ - u8 pcm_format; - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ - wait_queue_head_t wq; - struct device *dev; - unsigned int init_count; - int pstream; - int cstream; - struct input_dev *input; - bool tapdet_enabled; /* service enabled */ - bool tapdet_open; /* device file opened */ - unsigned int tapdet_profiles; /* tapdet profile bitfield */ - bool tapdet_poll; /* tapdet running on polling mode */ - - unsigned int rate_constraint_list[TFA98XX_NUM_RATES]; - struct snd_pcm_hw_constraint_list rate_constraint; - - int reset_gpio; - int power_gpio; - int irq_gpio; - enum tfa_reset_polarity reset_polarity; - struct list_head list; - struct tfa_device *tfa; - int vstep; - int profile; - int prof_vsteps[TFACONT_MAXPROFS]; /* store vstep per profile (single device) */ - -#ifdef CONFIG_DEBUG_FS - struct dentry *dbg_dir; -#endif - u8 reg; - unsigned int flags; - bool set_mtp_cal; - uint16_t cal_data; - enum TFA_DEVICE_MUTE tfa_mute_mode; - - struct device_node *spk_id_gpio_p; - - struct miscdevice tfa98xx_reg; - struct miscdevice tfa98xx_rw; - struct miscdevice tfa98xx_rpc; - struct miscdevice tfa98xx_profile; - struct miscdevice tfa98xx_control; -}; - - -#endif /* __TFA98XX_INC__ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_genregs_N1C.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_genregs_N1C.h deleted file mode 100644 index 190991ddea18..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_genregs_N1C.h +++ /dev/null @@ -1,3866 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: Tfa98xx_genregs.h - * This file was generated automatically on 09/01/15 at 09:40:23. - * Source file: TFA9888_N1C_I2C_regmap_V1.xlsx - */ - -#ifndef TFA2_GENREGS_H -#define TFA2_GENREGS_H - - -#define TFA98XX_SYS_CONTROL0 0x00 -#define TFA98XX_SYS_CONTROL1 0x01 -#define TFA98XX_SYS_CONTROL2 0x02 -#define TFA98XX_DEVICE_REVISION 0x03 -#define TFA98XX_CLOCK_CONTROL 0x04 -#define TFA98XX_CLOCK_GATING_CONTROL 0x05 -#define TFA98XX_SIDE_TONE_CONFIG 0x0d -#define TFA98XX_CTRL_DIGTOANA_REG 0x0e -#define TFA98XX_STATUS_FLAGS0 0x10 -#define TFA98XX_STATUS_FLAGS1 0x11 -#define TFA98XX_STATUS_FLAGS2 0x12 -#define TFA98XX_STATUS_FLAGS3 0x13 -#define TFA98XX_STATUS_FLAGS4 0x14 -#define TFA98XX_BATTERY_VOLTAGE 0x15 -#define TFA98XX_TEMPERATURE 0x16 -#define TFA98XX_TDM_CONFIG0 0x20 -#define TFA98XX_TDM_CONFIG1 0x21 -#define TFA98XX_TDM_CONFIG2 0x22 -#define TFA98XX_TDM_CONFIG3 0x23 -#define TFA98XX_TDM_CONFIG4 0x24 -#define TFA98XX_TDM_CONFIG5 0x25 -#define TFA98XX_TDM_CONFIG6 0x26 -#define TFA98XX_TDM_CONFIG7 0x27 -#define TFA98XX_TDM_CONFIG8 0x28 -#define TFA98XX_TDM_CONFIG9 0x29 -#define TFA98XX_PDM_CONFIG0 0x31 -#define TFA98XX_PDM_CONFIG1 0x32 -#define TFA98XX_HAPTIC_DRIVER_CONFIG 0x33 -#define TFA98XX_GPIO_DATAIN_REG 0x34 -#define TFA98XX_GPIO_CONFIG 0x35 -#define TFA98XX_INTERRUPT_OUT_REG1 0x40 -#define TFA98XX_INTERRUPT_OUT_REG2 0x41 -#define TFA98XX_INTERRUPT_OUT_REG3 0x42 -#define TFA98XX_INTERRUPT_IN_REG1 0x44 -#define TFA98XX_INTERRUPT_IN_REG2 0x45 -#define TFA98XX_INTERRUPT_IN_REG3 0x46 -#define TFA98XX_INTERRUPT_ENABLE_REG1 0x48 -#define TFA98XX_INTERRUPT_ENABLE_REG2 0x49 -#define TFA98XX_INTERRUPT_ENABLE_REG3 0x4a -#define TFA98XX_STATUS_POLARITY_REG1 0x4c -#define TFA98XX_STATUS_POLARITY_REG2 0x4d -#define TFA98XX_STATUS_POLARITY_REG3 0x4e -#define TFA98XX_BAT_PROT_CONFIG 0x50 -#define TFA98XX_AUDIO_CONTROL 0x51 -#define TFA98XX_AMPLIFIER_CONFIG 0x52 -#define TFA98XX_AUDIO_CONTROL2 0x5a -#define TFA98XX_DCDC_CONTROL0 0x70 -#define TFA98XX_CF_CONTROLS 0x90 -#define TFA98XX_CF_MAD 0x91 -#define TFA98XX_CF_MEM 0x92 -#define TFA98XX_CF_STATUS 0x93 -#define TFA98XX_MTPKEY2_REG 0xa1 -#define TFA98XX_MTP_STATUS 0xa2 -#define TFA98XX_KEY_PROTECTED_MTP_CONTROL 0xa3 -#define TFA98XX_MTP_DATA_OUT_MSB 0xa5 -#define TFA98XX_MTP_DATA_OUT_LSB 0xa6 -#define TFA98XX_TEMP_SENSOR_CONFIG 0xb1 -#define TFA98XX_KEY2_PROTECTED_MTP0 0xf0 -#define TFA98XX_KEY1_PROTECTED_MTP4 0xf4 -#define TFA98XX_KEY1_PROTECTED_MTP5 0xf5 - -/* - * (0x00)-sys_control0 - */ - -/* - * powerdown - */ -#define TFA98XX_SYS_CONTROL0_PWDN (0x1<<0) -#define TFA98XX_SYS_CONTROL0_PWDN_POS 0 -#define TFA98XX_SYS_CONTROL0_PWDN_LEN 1 -#define TFA98XX_SYS_CONTROL0_PWDN_MAX 1 -#define TFA98XX_SYS_CONTROL0_PWDN_MSK 0x1 - -/* - * reset - */ -#define TFA98XX_SYS_CONTROL0_I2CR (0x1<<1) -#define TFA98XX_SYS_CONTROL0_I2CR_POS 1 -#define TFA98XX_SYS_CONTROL0_I2CR_LEN 1 -#define TFA98XX_SYS_CONTROL0_I2CR_MAX 1 -#define TFA98XX_SYS_CONTROL0_I2CR_MSK 0x2 - -/* - * enbl_coolflux - */ -#define TFA98XX_SYS_CONTROL0_CFE (0x1<<2) -#define TFA98XX_SYS_CONTROL0_CFE_POS 2 -#define TFA98XX_SYS_CONTROL0_CFE_LEN 1 -#define TFA98XX_SYS_CONTROL0_CFE_MAX 1 -#define TFA98XX_SYS_CONTROL0_CFE_MSK 0x4 - -/* - * enbl_amplifier - */ -#define TFA98XX_SYS_CONTROL0_AMPE (0x1<<3) -#define TFA98XX_SYS_CONTROL0_AMPE_POS 3 -#define TFA98XX_SYS_CONTROL0_AMPE_LEN 1 -#define TFA98XX_SYS_CONTROL0_AMPE_MAX 1 -#define TFA98XX_SYS_CONTROL0_AMPE_MSK 0x8 - -/* - * enbl_boost - */ -#define TFA98XX_SYS_CONTROL0_DCA (0x1<<4) -#define TFA98XX_SYS_CONTROL0_DCA_POS 4 -#define TFA98XX_SYS_CONTROL0_DCA_LEN 1 -#define TFA98XX_SYS_CONTROL0_DCA_MAX 1 -#define TFA98XX_SYS_CONTROL0_DCA_MSK 0x10 - -/* - * coolflux_configured - */ -#define TFA98XX_SYS_CONTROL0_SBSL (0x1<<5) -#define TFA98XX_SYS_CONTROL0_SBSL_POS 5 -#define TFA98XX_SYS_CONTROL0_SBSL_LEN 1 -#define TFA98XX_SYS_CONTROL0_SBSL_MAX 1 -#define TFA98XX_SYS_CONTROL0_SBSL_MSK 0x20 - -/* - * sel_enbl_amplifier - */ -#define TFA98XX_SYS_CONTROL0_AMPC (0x1<<6) -#define TFA98XX_SYS_CONTROL0_AMPC_POS 6 -#define TFA98XX_SYS_CONTROL0_AMPC_LEN 1 -#define TFA98XX_SYS_CONTROL0_AMPC_MAX 1 -#define TFA98XX_SYS_CONTROL0_AMPC_MSK 0x40 - -/* - * int_pad_io - */ -#define TFA98XX_SYS_CONTROL0_INTP (0x3<<7) -#define TFA98XX_SYS_CONTROL0_INTP_POS 7 -#define TFA98XX_SYS_CONTROL0_INTP_LEN 2 -#define TFA98XX_SYS_CONTROL0_INTP_MAX 3 -#define TFA98XX_SYS_CONTROL0_INTP_MSK 0x180 - -/* - * fs_pulse_sel - */ -#define TFA98XX_SYS_CONTROL0_FSSSEL (0x3<<9) -#define TFA98XX_SYS_CONTROL0_FSSSEL_POS 9 -#define TFA98XX_SYS_CONTROL0_FSSSEL_LEN 2 -#define TFA98XX_SYS_CONTROL0_FSSSEL_MAX 3 -#define TFA98XX_SYS_CONTROL0_FSSSEL_MSK 0x600 - -/* - * bypass_ocp - */ -#define TFA98XX_SYS_CONTROL0_BYPOCP (0x1<<11) -#define TFA98XX_SYS_CONTROL0_BYPOCP_POS 11 -#define TFA98XX_SYS_CONTROL0_BYPOCP_LEN 1 -#define TFA98XX_SYS_CONTROL0_BYPOCP_MAX 1 -#define TFA98XX_SYS_CONTROL0_BYPOCP_MSK 0x800 - -/* - * test_ocp - */ -#define TFA98XX_SYS_CONTROL0_TSTOCP (0x1<<12) -#define TFA98XX_SYS_CONTROL0_TSTOCP_POS 12 -#define TFA98XX_SYS_CONTROL0_TSTOCP_LEN 1 -#define TFA98XX_SYS_CONTROL0_TSTOCP_MAX 1 -#define TFA98XX_SYS_CONTROL0_TSTOCP_MSK 0x1000 - - -/* - * (0x01)-sys_control1 - */ - -/* - * vamp_sel - */ -#define TFA98XX_SYS_CONTROL1_AMPINSEL (0x3<<0) -#define TFA98XX_SYS_CONTROL1_AMPINSEL_POS 0 -#define TFA98XX_SYS_CONTROL1_AMPINSEL_LEN 2 -#define TFA98XX_SYS_CONTROL1_AMPINSEL_MAX 3 -#define TFA98XX_SYS_CONTROL1_AMPINSEL_MSK 0x3 - -/* - * src_set_configured - */ -#define TFA98XX_SYS_CONTROL1_MANSCONF (0x1<<2) -#define TFA98XX_SYS_CONTROL1_MANSCONF_POS 2 -#define TFA98XX_SYS_CONTROL1_MANSCONF_LEN 1 -#define TFA98XX_SYS_CONTROL1_MANSCONF_MAX 1 -#define TFA98XX_SYS_CONTROL1_MANSCONF_MSK 0x4 - -/* - * execute_cold_start - */ -#define TFA98XX_SYS_CONTROL1_MANCOLD (0x1<<3) -#define TFA98XX_SYS_CONTROL1_MANCOLD_POS 3 -#define TFA98XX_SYS_CONTROL1_MANCOLD_LEN 1 -#define TFA98XX_SYS_CONTROL1_MANCOLD_MAX 1 -#define TFA98XX_SYS_CONTROL1_MANCOLD_MSK 0x8 - -/* - * enbl_osc1m_auto_off - */ -#define TFA98XX_SYS_CONTROL1_MANAOOSC (0x1<<4) -#define TFA98XX_SYS_CONTROL1_MANAOOSC_POS 4 -#define TFA98XX_SYS_CONTROL1_MANAOOSC_LEN 1 -#define TFA98XX_SYS_CONTROL1_MANAOOSC_MAX 1 -#define TFA98XX_SYS_CONTROL1_MANAOOSC_MSK 0x10 - -/* - * man_enbl_brown_out - */ -#define TFA98XX_SYS_CONTROL1_MANROBOD (0x1<<5) -#define TFA98XX_SYS_CONTROL1_MANROBOD_POS 5 -#define TFA98XX_SYS_CONTROL1_MANROBOD_LEN 1 -#define TFA98XX_SYS_CONTROL1_MANROBOD_MAX 1 -#define TFA98XX_SYS_CONTROL1_MANROBOD_MSK 0x20 - -/* - * enbl_bod - */ -#define TFA98XX_SYS_CONTROL1_BODE (0x1<<6) -#define TFA98XX_SYS_CONTROL1_BODE_POS 6 -#define TFA98XX_SYS_CONTROL1_BODE_LEN 1 -#define TFA98XX_SYS_CONTROL1_BODE_MAX 1 -#define TFA98XX_SYS_CONTROL1_BODE_MSK 0x40 - -/* - * enbl_bod_hyst - */ -#define TFA98XX_SYS_CONTROL1_BODHYS (0x1<<7) -#define TFA98XX_SYS_CONTROL1_BODHYS_POS 7 -#define TFA98XX_SYS_CONTROL1_BODHYS_LEN 1 -#define TFA98XX_SYS_CONTROL1_BODHYS_MAX 1 -#define TFA98XX_SYS_CONTROL1_BODHYS_MSK 0x80 - -/* - * bod_delay - */ -#define TFA98XX_SYS_CONTROL1_BODFILT (0x3<<8) -#define TFA98XX_SYS_CONTROL1_BODFILT_POS 8 -#define TFA98XX_SYS_CONTROL1_BODFILT_LEN 2 -#define TFA98XX_SYS_CONTROL1_BODFILT_MAX 3 -#define TFA98XX_SYS_CONTROL1_BODFILT_MSK 0x300 - -/* - * bod_lvlsel - */ -#define TFA98XX_SYS_CONTROL1_BODTHLVL (0x3<<10) -#define TFA98XX_SYS_CONTROL1_BODTHLVL_POS 10 -#define TFA98XX_SYS_CONTROL1_BODTHLVL_LEN 2 -#define TFA98XX_SYS_CONTROL1_BODTHLVL_MAX 3 -#define TFA98XX_SYS_CONTROL1_BODTHLVL_MSK 0xc00 - -/* - * disable_mute_time_out - */ -#define TFA98XX_SYS_CONTROL1_MUTETO (0x1<<13) -#define TFA98XX_SYS_CONTROL1_MUTETO_POS 13 -#define TFA98XX_SYS_CONTROL1_MUTETO_LEN 1 -#define TFA98XX_SYS_CONTROL1_MUTETO_MAX 1 -#define TFA98XX_SYS_CONTROL1_MUTETO_MSK 0x2000 - -/* - * pwm_sel_rcv_ns - */ -#define TFA98XX_SYS_CONTROL1_RCVNS (0x1<<14) -#define TFA98XX_SYS_CONTROL1_RCVNS_POS 14 -#define TFA98XX_SYS_CONTROL1_RCVNS_LEN 1 -#define TFA98XX_SYS_CONTROL1_RCVNS_MAX 1 -#define TFA98XX_SYS_CONTROL1_RCVNS_MSK 0x4000 - -/* - * man_enbl_watchdog - */ -#define TFA98XX_SYS_CONTROL1_MANWDE (0x1<<15) -#define TFA98XX_SYS_CONTROL1_MANWDE_POS 15 -#define TFA98XX_SYS_CONTROL1_MANWDE_LEN 1 -#define TFA98XX_SYS_CONTROL1_MANWDE_MAX 1 -#define TFA98XX_SYS_CONTROL1_MANWDE_MSK 0x8000 - - -/* - * (0x02)-sys_control2 - */ - -/* - * audio_fs - */ -#define TFA98XX_SYS_CONTROL2_AUDFS (0xf<<0) -#define TFA98XX_SYS_CONTROL2_AUDFS_POS 0 -#define TFA98XX_SYS_CONTROL2_AUDFS_LEN 4 -#define TFA98XX_SYS_CONTROL2_AUDFS_MAX 15 -#define TFA98XX_SYS_CONTROL2_AUDFS_MSK 0xf - -/* - * input_level - */ -#define TFA98XX_SYS_CONTROL2_INPLEV (0x1<<4) -#define TFA98XX_SYS_CONTROL2_INPLEV_POS 4 -#define TFA98XX_SYS_CONTROL2_INPLEV_LEN 1 -#define TFA98XX_SYS_CONTROL2_INPLEV_MAX 1 -#define TFA98XX_SYS_CONTROL2_INPLEV_MSK 0x10 - -/* - * cs_frac_delay - */ -#define TFA98XX_SYS_CONTROL2_FRACTDEL (0x3f<<5) -#define TFA98XX_SYS_CONTROL2_FRACTDEL_POS 5 -#define TFA98XX_SYS_CONTROL2_FRACTDEL_LEN 6 -#define TFA98XX_SYS_CONTROL2_FRACTDEL_MAX 63 -#define TFA98XX_SYS_CONTROL2_FRACTDEL_MSK 0x7e0 - -/* - * bypass_hvbat_filter - */ -#define TFA98XX_SYS_CONTROL2_BYPHVBF (0x1<<11) -#define TFA98XX_SYS_CONTROL2_BYPHVBF_POS 11 -#define TFA98XX_SYS_CONTROL2_BYPHVBF_LEN 1 -#define TFA98XX_SYS_CONTROL2_BYPHVBF_MAX 1 -#define TFA98XX_SYS_CONTROL2_BYPHVBF_MSK 0x800 - -/* - * ctrl_rcvldop_bypass - */ -#define TFA98XX_SYS_CONTROL2_LDOBYP (0x1<<12) -#define TFA98XX_SYS_CONTROL2_LDOBYP_POS 12 -#define TFA98XX_SYS_CONTROL2_LDOBYP_LEN 1 -#define TFA98XX_SYS_CONTROL2_LDOBYP_MAX 1 -#define TFA98XX_SYS_CONTROL2_LDOBYP_MSK 0x1000 - - -/* - * (0x03)-device_revision - */ - -/* - * device_rev - */ -#define TFA98XX_DEVICE_REVISION_REV (0xffff<<0) -#define TFA98XX_DEVICE_REVISION_REV_POS 0 -#define TFA98XX_DEVICE_REVISION_REV_LEN 16 -#define TFA98XX_DEVICE_REVISION_REV_MAX 65535 -#define TFA98XX_DEVICE_REVISION_REV_MSK 0xffff - - -/* - * (0x04)-clock_control - */ - -/* - * pll_clkin_sel - */ -#define TFA98XX_CLOCK_CONTROL_REFCKEXT (0x3<<0) -#define TFA98XX_CLOCK_CONTROL_REFCKEXT_POS 0 -#define TFA98XX_CLOCK_CONTROL_REFCKEXT_LEN 2 -#define TFA98XX_CLOCK_CONTROL_REFCKEXT_MAX 3 -#define TFA98XX_CLOCK_CONTROL_REFCKEXT_MSK 0x3 - -/* - * pll_clkin_sel_osc - */ -#define TFA98XX_CLOCK_CONTROL_REFCKSEL (0x1<<2) -#define TFA98XX_CLOCK_CONTROL_REFCKSEL_POS 2 -#define TFA98XX_CLOCK_CONTROL_REFCKSEL_LEN 1 -#define TFA98XX_CLOCK_CONTROL_REFCKSEL_MAX 1 -#define TFA98XX_CLOCK_CONTROL_REFCKSEL_MSK 0x4 - - -/* - * (0x05)-clock_gating_control - */ - -/* - * enbl_spkr_ss_left - */ -#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE (0x1<<0) -#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_POS 0 -#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_LEN 1 -#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_MAX 1 -#define TFA98XX_CLOCK_GATING_CONTROL_SSLEFTE_MSK 0x1 - -/* - * enbl_spkr_ss_right - */ -#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE (0x1<<1) -#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_POS 1 -#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_LEN 1 -#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_MAX 1 -#define TFA98XX_CLOCK_GATING_CONTROL_SSRIGHTE_MSK 0x2 - -/* - * enbl_volsense_left - */ -#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE (0x1<<2) -#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_POS 2 -#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_LEN 1 -#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_MAX 1 -#define TFA98XX_CLOCK_GATING_CONTROL_VSLEFTE_MSK 0x4 - -/* - * enbl_volsense_right - */ -#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE (0x1<<3) -#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_POS 3 -#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_LEN 1 -#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_MAX 1 -#define TFA98XX_CLOCK_GATING_CONTROL_VSRIGHTE_MSK 0x8 - -/* - * enbl_cursense_left - */ -#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE (0x1<<4) -#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_POS 4 -#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_LEN 1 -#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_MAX 1 -#define TFA98XX_CLOCK_GATING_CONTROL_CSLEFTE_MSK 0x10 - -/* - * enbl_cursense_right - */ -#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE (0x1<<5) -#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_POS 5 -#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_LEN 1 -#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_MAX 1 -#define TFA98XX_CLOCK_GATING_CONTROL_CSRIGHTE_MSK 0x20 - -/* - * enbl_pdm_ss - */ -#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME (0x1<<6) -#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_POS 6 -#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_LEN 1 -#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_MAX 1 -#define TFA98XX_CLOCK_GATING_CONTROL_SSPDME_MSK 0x40 - - -/* - * (0x0d)-side_tone_config - */ - -/* - * side_tone_gain - */ -#define TFA98XX_SIDE_TONE_CONFIG_STGAIN (0x1ff<<1) -#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_POS 1 -#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_LEN 9 -#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_MAX 511 -#define TFA98XX_SIDE_TONE_CONFIG_STGAIN_MSK 0x3fe - -/* - * mute_side_tone - */ -#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE (0x1<<10) -#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_POS 10 -#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_LEN 1 -#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_MAX 1 -#define TFA98XX_SIDE_TONE_CONFIG_PDMSMUTE_MSK 0x400 - - -/* - * (0x0e)-ctrl_digtoana_reg - */ - -/* - * ctrl_digtoana - */ -#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP (0x7f<<0) -#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_POS 0 -#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_LEN 7 -#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_MAX 127 -#define TFA98XX_CTRL_DIGTOANA_REG_SWVSTEP_MSK 0x7f - - -/* - * (0x10)-status_flags0 - */ - -/* - * flag_por - */ -#define TFA98XX_STATUS_FLAGS0_VDDS (0x1<<0) -#define TFA98XX_STATUS_FLAGS0_VDDS_POS 0 -#define TFA98XX_STATUS_FLAGS0_VDDS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_VDDS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_VDDS_MSK 0x1 - -/* - * flag_pll_lock - */ -#define TFA98XX_STATUS_FLAGS0_PLLS (0x1<<1) -#define TFA98XX_STATUS_FLAGS0_PLLS_POS 1 -#define TFA98XX_STATUS_FLAGS0_PLLS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_PLLS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_PLLS_MSK 0x2 - -/* - * flag_otpok - */ -#define TFA98XX_STATUS_FLAGS0_OTDS (0x1<<2) -#define TFA98XX_STATUS_FLAGS0_OTDS_POS 2 -#define TFA98XX_STATUS_FLAGS0_OTDS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_OTDS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_OTDS_MSK 0x4 - -/* - * flag_ovpok - */ -#define TFA98XX_STATUS_FLAGS0_OVDS (0x1<<3) -#define TFA98XX_STATUS_FLAGS0_OVDS_POS 3 -#define TFA98XX_STATUS_FLAGS0_OVDS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_OVDS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_OVDS_MSK 0x8 - -/* - * flag_uvpok - */ -#define TFA98XX_STATUS_FLAGS0_UVDS (0x1<<4) -#define TFA98XX_STATUS_FLAGS0_UVDS_POS 4 -#define TFA98XX_STATUS_FLAGS0_UVDS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_UVDS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_UVDS_MSK 0x10 - -/* - * flag_clocks_stable - */ -#define TFA98XX_STATUS_FLAGS0_CLKS (0x1<<6) -#define TFA98XX_STATUS_FLAGS0_CLKS_POS 5 -#define TFA98XX_STATUS_FLAGS0_CLKS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_CLKS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_CLKS_MSK 0x20 - -/* - * flag_mtp_busy - */ -#define TFA98XX_STATUS_FLAGS0_MTPB (0x1<<7) -#define TFA98XX_STATUS_FLAGS0_MTPB_POS 7 -#define TFA98XX_STATUS_FLAGS0_MTPB_LEN 1 -#define TFA98XX_STATUS_FLAGS0_MTPB_MAX 1 -#define TFA98XX_STATUS_FLAGS0_MTPB_MSK 0x40 - -/* - * flag_lost_clk - */ -#define TFA98XX_STATUS_FLAGS0_NOCLK (0x1<<8) -#define TFA98XX_STATUS_FLAGS0_NOCLK_POS 8 -#define TFA98XX_STATUS_FLAGS0_NOCLK_LEN 1 -#define TFA98XX_STATUS_FLAGS0_NOCLK_MAX 1 -#define TFA98XX_STATUS_FLAGS0_NOCLK_MSK 0x80 - -#if 0 -/* - * flag_cf_speakererror - */ -#define TFA98XX_STATUS_FLAGS0_SPKS (0x1<<8) -#define TFA98XX_STATUS_FLAGS0_SPKS_POS 8 -#define TFA98XX_STATUS_FLAGS0_SPKS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_SPKS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_SPKS_MSK 0x100 -#endif - -/* - * flag_cold_started - */ -#define TFA98XX_STATUS_FLAGS0_ACS (0x1<<9) -#define TFA98XX_STATUS_FLAGS0_ACS_POS 9 -#define TFA98XX_STATUS_FLAGS0_ACS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_ACS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_ACS_MSK 0x200 - -/* - * flag_engage - */ -#define TFA98XX_STATUS_FLAGS0_SWS (0x1<<11) -#define TFA98XX_STATUS_FLAGS0_SWS_POS 11 -#define TFA98XX_STATUS_FLAGS0_SWS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_SWS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_SWS_MSK 0x400 - -/* - * flag_watchdog_reset - */ -#define TFA98XX_STATUS_FLAGS0_WDS (0x1<<10) -#define TFA98XX_STATUS_FLAGS0_WDS_POS 10 -#define TFA98XX_STATUS_FLAGS0_WDS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_WDS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_WDS_MSK 0x800 - -/* - * flag_enbl_amp - */ -#define TFA98XX_STATUS_FLAGS0_AMPS (0x1<<12) -#define TFA98XX_STATUS_FLAGS0_AMPS_POS 12 -#define TFA98XX_STATUS_FLAGS0_AMPS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_AMPS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_AMPS_MSK 0x1000 - -/* - * flag_enbl_ref - */ -#define TFA98XX_STATUS_FLAGS0_AREFS (0x1<<13) -#define TFA98XX_STATUS_FLAGS0_AREFS_POS 13 -#define TFA98XX_STATUS_FLAGS0_AREFS_LEN 1 -#define TFA98XX_STATUS_FLAGS0_AREFS_MAX 1 -#define TFA98XX_STATUS_FLAGS0_AREFS_MSK 0x2000 - -/* - * flag_adc10_ready - */ -#define TFA98XX_STATUS_FLAGS0_ADCCR (0x1<<14) -#define TFA98XX_STATUS_FLAGS0_ADCCR_POS 14 -#define TFA98XX_STATUS_FLAGS0_ADCCR_LEN 1 -#define TFA98XX_STATUS_FLAGS0_ADCCR_MAX 1 -#define TFA98XX_STATUS_FLAGS0_ADCCR_MSK 0x4000 - -/* - * flag_bod_vddd_nok - */ -#define TFA98XX_STATUS_FLAGS0_BODNOK (0x1<<15) -#define TFA98XX_STATUS_FLAGS0_BODNOK_POS 15 -#define TFA98XX_STATUS_FLAGS0_BODNOK_LEN 1 -#define TFA98XX_STATUS_FLAGS0_BODNOK_MAX 1 -#define TFA98XX_STATUS_FLAGS0_BODNOK_MSK 0x8000 - - -/* - * (0x11)-status_flags1 - */ - -/* - * flag_bst_bstcur - */ -#define TFA98XX_STATUS_FLAGS1_DCIL (0x1<<0) -#define TFA98XX_STATUS_FLAGS1_DCIL_POS 0 -#define TFA98XX_STATUS_FLAGS1_DCIL_LEN 1 -#define TFA98XX_STATUS_FLAGS1_DCIL_MAX 1 -#define TFA98XX_STATUS_FLAGS1_DCIL_MSK 0x1 - -/* - * flag_bst_hiz - */ -#define TFA98XX_STATUS_FLAGS1_DCDCA (0x1<<1) -#define TFA98XX_STATUS_FLAGS1_DCDCA_POS 1 -#define TFA98XX_STATUS_FLAGS1_DCDCA_LEN 1 -#define TFA98XX_STATUS_FLAGS1_DCDCA_MAX 1 -#define TFA98XX_STATUS_FLAGS1_DCDCA_MSK 0x2 - -/* - * flag_bst_ocpok - */ -#define TFA98XX_STATUS_FLAGS1_DCOCPOK (0x1<<2) -#define TFA98XX_STATUS_FLAGS1_DCOCPOK_POS 2 -#define TFA98XX_STATUS_FLAGS1_DCOCPOK_LEN 1 -#define TFA98XX_STATUS_FLAGS1_DCOCPOK_MAX 1 -#define TFA98XX_STATUS_FLAGS1_DCOCPOK_MSK 0x4 - -/* - * flag_bst_voutcomp - */ -#define TFA98XX_STATUS_FLAGS1_DCHVBAT (0x1<<4) -#define TFA98XX_STATUS_FLAGS1_DCHVBAT_POS 4 -#define TFA98XX_STATUS_FLAGS1_DCHVBAT_LEN 1 -#define TFA98XX_STATUS_FLAGS1_DCHVBAT_MAX 1 -#define TFA98XX_STATUS_FLAGS1_DCHVBAT_MSK 0x10 - -/* - * flag_bst_voutcomp86 - */ -#define TFA98XX_STATUS_FLAGS1_DCH114 (0x1<<5) -#define TFA98XX_STATUS_FLAGS1_DCH114_POS 5 -#define TFA98XX_STATUS_FLAGS1_DCH114_LEN 1 -#define TFA98XX_STATUS_FLAGS1_DCH114_MAX 1 -#define TFA98XX_STATUS_FLAGS1_DCH114_MSK 0x20 - -/* - * flag_bst_voutcomp93 - */ -#define TFA98XX_STATUS_FLAGS1_DCH107 (0x1<<6) -#define TFA98XX_STATUS_FLAGS1_DCH107_POS 6 -#define TFA98XX_STATUS_FLAGS1_DCH107_LEN 1 -#define TFA98XX_STATUS_FLAGS1_DCH107_MAX 1 -#define TFA98XX_STATUS_FLAGS1_DCH107_MSK 0x40 - -/* - * flag_soft_mute_busy - */ -#define TFA98XX_STATUS_FLAGS1_STMUTEB (0x1<<7) -#define TFA98XX_STATUS_FLAGS1_STMUTEB_POS 7 -#define TFA98XX_STATUS_FLAGS1_STMUTEB_LEN 1 -#define TFA98XX_STATUS_FLAGS1_STMUTEB_MAX 1 -#define TFA98XX_STATUS_FLAGS1_STMUTEB_MSK 0x80 - -/* - * flag_soft_mute_state - */ -#define TFA98XX_STATUS_FLAGS1_STMUTE (0x1<<8) -#define TFA98XX_STATUS_FLAGS1_STMUTE_POS 8 -#define TFA98XX_STATUS_FLAGS1_STMUTE_LEN 1 -#define TFA98XX_STATUS_FLAGS1_STMUTE_MAX 1 -#define TFA98XX_STATUS_FLAGS1_STMUTE_MSK 0x100 - -/* - * flag_tdm_lut_error - */ -#define TFA98XX_STATUS_FLAGS1_TDMLUTER (0x1<<9) -#define TFA98XX_STATUS_FLAGS1_TDMLUTER_POS 9 -#define TFA98XX_STATUS_FLAGS1_TDMLUTER_LEN 1 -#define TFA98XX_STATUS_FLAGS1_TDMLUTER_MAX 1 -#define TFA98XX_STATUS_FLAGS1_TDMLUTER_MSK 0x200 - -/* - * flag_tdm_status - */ -#define TFA98XX_STATUS_FLAGS1_TDMSTAT (0x7<<10) -#define TFA98XX_STATUS_FLAGS1_TDMSTAT_POS 10 -#define TFA98XX_STATUS_FLAGS1_TDMSTAT_LEN 3 -#define TFA98XX_STATUS_FLAGS1_TDMSTAT_MAX 7 -#define TFA98XX_STATUS_FLAGS1_TDMSTAT_MSK 0x1c00 - -/* - * flag_tdm_error - */ -#define TFA98XX_STATUS_FLAGS1_TDMERR (0x1<<13) -#define TFA98XX_STATUS_FLAGS1_TDMERR_POS 13 -#define TFA98XX_STATUS_FLAGS1_TDMERR_LEN 1 -#define TFA98XX_STATUS_FLAGS1_TDMERR_MAX 1 -#define TFA98XX_STATUS_FLAGS1_TDMERR_MSK 0x2000 - -/* - * flag_haptic_busy - */ -#define TFA98XX_STATUS_FLAGS1_HAPTIC (0x1<<14) -#define TFA98XX_STATUS_FLAGS1_HAPTIC_POS 14 -#define TFA98XX_STATUS_FLAGS1_HAPTIC_LEN 1 -#define TFA98XX_STATUS_FLAGS1_HAPTIC_MAX 1 -#define TFA98XX_STATUS_FLAGS1_HAPTIC_MSK 0x4000 - - -/* - * (0x12)-status_flags2 - */ - -/* - * flag_ocpokap_left - */ -#define TFA98XX_STATUS_FLAGS2_OCPOAPL (0x1<<0) -#define TFA98XX_STATUS_FLAGS2_OCPOAPL_POS 0 -#define TFA98XX_STATUS_FLAGS2_OCPOAPL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOAPL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOAPL_MSK 0x1 - -/* - * flag_ocpokan_left - */ -#define TFA98XX_STATUS_FLAGS2_OCPOANL (0x1<<1) -#define TFA98XX_STATUS_FLAGS2_OCPOANL_POS 1 -#define TFA98XX_STATUS_FLAGS2_OCPOANL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOANL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOANL_MSK 0x2 - -/* - * flag_ocpokbp_left - */ -#define TFA98XX_STATUS_FLAGS2_OCPOBPL (0x1<<2) -#define TFA98XX_STATUS_FLAGS2_OCPOBPL_POS 2 -#define TFA98XX_STATUS_FLAGS2_OCPOBPL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBPL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBPL_MSK 0x4 - -/* - * flag_ocpokbn_left - */ -#define TFA98XX_STATUS_FLAGS2_OCPOBNL (0x1<<3) -#define TFA98XX_STATUS_FLAGS2_OCPOBNL_POS 3 -#define TFA98XX_STATUS_FLAGS2_OCPOBNL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBNL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBNL_MSK 0x8 - -/* - * flag_clipa_high_left - */ -#define TFA98XX_STATUS_FLAGS2_CLIPAHL (0x1<<4) -#define TFA98XX_STATUS_FLAGS2_CLIPAHL_POS 4 -#define TFA98XX_STATUS_FLAGS2_CLIPAHL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_CLIPAHL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_CLIPAHL_MSK 0x10 - -/* - * flag_clipa_low_left - */ -#define TFA98XX_STATUS_FLAGS2_CLIPALL (0x1<<5) -#define TFA98XX_STATUS_FLAGS2_CLIPALL_POS 5 -#define TFA98XX_STATUS_FLAGS2_CLIPALL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_CLIPALL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_CLIPALL_MSK 0x20 - -/* - * flag_clipb_high_left - */ -#define TFA98XX_STATUS_FLAGS2_CLIPBHL (0x1<<6) -#define TFA98XX_STATUS_FLAGS2_CLIPBHL_POS 6 -#define TFA98XX_STATUS_FLAGS2_CLIPBHL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_CLIPBHL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_CLIPBHL_MSK 0x40 - -/* - * flag_clipb_low_left - */ -#define TFA98XX_STATUS_FLAGS2_CLIPBLL (0x1<<7) -#define TFA98XX_STATUS_FLAGS2_CLIPBLL_POS 7 -#define TFA98XX_STATUS_FLAGS2_CLIPBLL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_CLIPBLL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_CLIPBLL_MSK 0x80 - -/* - * flag_ocpokap_rcv - */ -#define TFA98XX_STATUS_FLAGS2_OCPOAPRC (0x1<<8) -#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_POS 8 -#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOAPRC_MSK 0x100 - -/* - * flag_ocpokan_rcv - */ -#define TFA98XX_STATUS_FLAGS2_OCPOANRC (0x1<<9) -#define TFA98XX_STATUS_FLAGS2_OCPOANRC_POS 9 -#define TFA98XX_STATUS_FLAGS2_OCPOANRC_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOANRC_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOANRC_MSK 0x200 - -/* - * flag_ocpokbp_rcv - */ -#define TFA98XX_STATUS_FLAGS2_OCPOBPRC (0x1<<10) -#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_POS 10 -#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBPRC_MSK 0x400 - -/* - * flag_ocpokbn_rcv - */ -#define TFA98XX_STATUS_FLAGS2_OCPOBNRC (0x1<<11) -#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_POS 11 -#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCPOBNRC_MSK 0x800 - -/* - * flag_rcvldop_ready - */ -#define TFA98XX_STATUS_FLAGS2_RCVLDOR (0x1<<12) -#define TFA98XX_STATUS_FLAGS2_RCVLDOR_POS 12 -#define TFA98XX_STATUS_FLAGS2_RCVLDOR_LEN 1 -#define TFA98XX_STATUS_FLAGS2_RCVLDOR_MAX 1 -#define TFA98XX_STATUS_FLAGS2_RCVLDOR_MSK 0x1000 - -/* - * flag_rcvldop_bypassready - */ -#define TFA98XX_STATUS_FLAGS2_RCVLDOBR (0x1<<13) -#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_POS 13 -#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_LEN 1 -#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_MAX 1 -#define TFA98XX_STATUS_FLAGS2_RCVLDOBR_MSK 0x2000 - -/* - * flag_ocp_alarm_left - */ -#define TFA98XX_STATUS_FLAGS2_OCDSL (0x1<<14) -#define TFA98XX_STATUS_FLAGS2_OCDSL_POS 14 -#define TFA98XX_STATUS_FLAGS2_OCDSL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_OCDSL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_OCDSL_MSK 0x4000 - -/* - * flag_clip_left - */ -#define TFA98XX_STATUS_FLAGS2_CLIPSL (0x1<<15) -#define TFA98XX_STATUS_FLAGS2_CLIPSL_POS 15 -#define TFA98XX_STATUS_FLAGS2_CLIPSL_LEN 1 -#define TFA98XX_STATUS_FLAGS2_CLIPSL_MAX 1 -#define TFA98XX_STATUS_FLAGS2_CLIPSL_MSK 0x8000 - - -/* - * (0x13)-status_flags3 - */ - -/* - * flag_ocpokap_right - */ -#define TFA98XX_STATUS_FLAGS3_OCPOAPR (0x1<<0) -#define TFA98XX_STATUS_FLAGS3_OCPOAPR_POS 0 -#define TFA98XX_STATUS_FLAGS3_OCPOAPR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_OCPOAPR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_OCPOAPR_MSK 0x1 - -/* - * flag_ocpokan_right - */ -#define TFA98XX_STATUS_FLAGS3_OCPOANR (0x1<<1) -#define TFA98XX_STATUS_FLAGS3_OCPOANR_POS 1 -#define TFA98XX_STATUS_FLAGS3_OCPOANR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_OCPOANR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_OCPOANR_MSK 0x2 - -/* - * flag_ocpokbp_right - */ -#define TFA98XX_STATUS_FLAGS3_OCPOBPR (0x1<<2) -#define TFA98XX_STATUS_FLAGS3_OCPOBPR_POS 2 -#define TFA98XX_STATUS_FLAGS3_OCPOBPR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_OCPOBPR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_OCPOBPR_MSK 0x4 - -/* - * flag_ocpokbn_right - */ -#define TFA98XX_STATUS_FLAGS3_OCPOBNR (0x1<<3) -#define TFA98XX_STATUS_FLAGS3_OCPOBNR_POS 3 -#define TFA98XX_STATUS_FLAGS3_OCPOBNR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_OCPOBNR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_OCPOBNR_MSK 0x8 - -/* - * flag_clipa_high_right - */ -#define TFA98XX_STATUS_FLAGS3_CLIPAHR (0x1<<4) -#define TFA98XX_STATUS_FLAGS3_CLIPAHR_POS 4 -#define TFA98XX_STATUS_FLAGS3_CLIPAHR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_CLIPAHR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_CLIPAHR_MSK 0x10 - -/* - * flag_clipa_low_right - */ -#define TFA98XX_STATUS_FLAGS3_CLIPALR (0x1<<5) -#define TFA98XX_STATUS_FLAGS3_CLIPALR_POS 5 -#define TFA98XX_STATUS_FLAGS3_CLIPALR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_CLIPALR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_CLIPALR_MSK 0x20 - -/* - * flag_clipb_high_right - */ -#define TFA98XX_STATUS_FLAGS3_CLIPBHR (0x1<<6) -#define TFA98XX_STATUS_FLAGS3_CLIPBHR_POS 6 -#define TFA98XX_STATUS_FLAGS3_CLIPBHR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_CLIPBHR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_CLIPBHR_MSK 0x40 - -/* - * flag_clipb_low_right - */ -#define TFA98XX_STATUS_FLAGS3_CLIPBLR (0x1<<7) -#define TFA98XX_STATUS_FLAGS3_CLIPBLR_POS 7 -#define TFA98XX_STATUS_FLAGS3_CLIPBLR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_CLIPBLR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_CLIPBLR_MSK 0x80 - -/* - * flag_ocp_alarm_right - */ -#define TFA98XX_STATUS_FLAGS3_OCDSR (0x1<<8) -#define TFA98XX_STATUS_FLAGS3_OCDSR_POS 8 -#define TFA98XX_STATUS_FLAGS3_OCDSR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_OCDSR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_OCDSR_MSK 0x100 - -/* - * flag_clip_right - */ -#define TFA98XX_STATUS_FLAGS3_CLIPSR (0x1<<9) -#define TFA98XX_STATUS_FLAGS3_CLIPSR_POS 9 -#define TFA98XX_STATUS_FLAGS3_CLIPSR_LEN 1 -#define TFA98XX_STATUS_FLAGS3_CLIPSR_MAX 1 -#define TFA98XX_STATUS_FLAGS3_CLIPSR_MSK 0x200 - -/* - * flag_mic_ocpok - */ -#define TFA98XX_STATUS_FLAGS3_OCPOKMC (0x1<<10) -#define TFA98XX_STATUS_FLAGS3_OCPOKMC_POS 10 -#define TFA98XX_STATUS_FLAGS3_OCPOKMC_LEN 1 -#define TFA98XX_STATUS_FLAGS3_OCPOKMC_MAX 1 -#define TFA98XX_STATUS_FLAGS3_OCPOKMC_MSK 0x400 - -/* - * flag_man_alarm_state - */ -#define TFA98XX_STATUS_FLAGS3_MANALARM (0x1<<11) -#define TFA98XX_STATUS_FLAGS3_MANALARM_POS 11 -#define TFA98XX_STATUS_FLAGS3_MANALARM_LEN 1 -#define TFA98XX_STATUS_FLAGS3_MANALARM_MAX 1 -#define TFA98XX_STATUS_FLAGS3_MANALARM_MSK 0x800 - -/* - * flag_man_wait_src_settings - */ -#define TFA98XX_STATUS_FLAGS3_MANWAIT1 (0x1<<12) -#define TFA98XX_STATUS_FLAGS3_MANWAIT1_POS 12 -#define TFA98XX_STATUS_FLAGS3_MANWAIT1_LEN 1 -#define TFA98XX_STATUS_FLAGS3_MANWAIT1_MAX 1 -#define TFA98XX_STATUS_FLAGS3_MANWAIT1_MSK 0x1000 - -/* - * flag_man_wait_cf_config - */ -#define TFA98XX_STATUS_FLAGS3_MANWAIT2 (0x1<<13) -#define TFA98XX_STATUS_FLAGS3_MANWAIT2_POS 13 -#define TFA98XX_STATUS_FLAGS3_MANWAIT2_LEN 1 -#define TFA98XX_STATUS_FLAGS3_MANWAIT2_MAX 1 -#define TFA98XX_STATUS_FLAGS3_MANWAIT2_MSK 0x2000 - -/* - * flag_man_start_mute_audio - */ -#define TFA98XX_STATUS_FLAGS3_MANMUTE (0x1<<14) -#define TFA98XX_STATUS_FLAGS3_MANMUTE_POS 14 -#define TFA98XX_STATUS_FLAGS3_MANMUTE_LEN 1 -#define TFA98XX_STATUS_FLAGS3_MANMUTE_MAX 1 -#define TFA98XX_STATUS_FLAGS3_MANMUTE_MSK 0x4000 - -/* - * flag_man_operating_state - */ -#define TFA98XX_STATUS_FLAGS3_MANOPER (0x1<<15) -#define TFA98XX_STATUS_FLAGS3_MANOPER_POS 15 -#define TFA98XX_STATUS_FLAGS3_MANOPER_LEN 1 -#define TFA98XX_STATUS_FLAGS3_MANOPER_MAX 1 -#define TFA98XX_STATUS_FLAGS3_MANOPER_MSK 0x8000 - - -/* - * (0x14)-status_flags4 - */ - -/* - * flag_cf_speakererror_left - */ -#define TFA98XX_STATUS_FLAGS4_SPKSL (0x1<<0) -#define TFA98XX_STATUS_FLAGS4_SPKSL_POS 0 -#define TFA98XX_STATUS_FLAGS4_SPKSL_LEN 1 -#define TFA98XX_STATUS_FLAGS4_SPKSL_MAX 1 -#define TFA98XX_STATUS_FLAGS4_SPKSL_MSK 0x1 - -/* - * flag_cf_speakererror_right - */ -#define TFA98XX_STATUS_FLAGS4_SPKSR (0x1<<1) -#define TFA98XX_STATUS_FLAGS4_SPKSR_POS 1 -#define TFA98XX_STATUS_FLAGS4_SPKSR_LEN 1 -#define TFA98XX_STATUS_FLAGS4_SPKSR_MAX 1 -#define TFA98XX_STATUS_FLAGS4_SPKSR_MSK 0x2 - -/* - * flag_clk_out_of_range - */ -#define TFA98XX_STATUS_FLAGS4_CLKOOR (0x1<<2) -#define TFA98XX_STATUS_FLAGS4_CLKOOR_POS 2 -#define TFA98XX_STATUS_FLAGS4_CLKOOR_LEN 1 -#define TFA98XX_STATUS_FLAGS4_CLKOOR_MAX 1 -#define TFA98XX_STATUS_FLAGS4_CLKOOR_MSK 0x4 - -/* - * man_state - */ -#define TFA98XX_STATUS_FLAGS4_MANSTATE (0xf<<3) -#define TFA98XX_STATUS_FLAGS4_MANSTATE_POS 3 -#define TFA98XX_STATUS_FLAGS4_MANSTATE_LEN 4 -#define TFA98XX_STATUS_FLAGS4_MANSTATE_MAX 15 -#define TFA98XX_STATUS_FLAGS4_MANSTATE_MSK 0x78 - - -/* - * (0x15)-battery_voltage - */ - -/* - * bat_adc - */ -#define TFA98XX_BATTERY_VOLTAGE_BATS (0x3ff<<0) -#define TFA98XX_BATTERY_VOLTAGE_BATS_POS 0 -#define TFA98XX_BATTERY_VOLTAGE_BATS_LEN 10 -#define TFA98XX_BATTERY_VOLTAGE_BATS_MAX 1023 -#define TFA98XX_BATTERY_VOLTAGE_BATS_MSK 0x3ff - - -/* - * (0x16)-temperature - */ - -/* - * temp_adc - */ -#define TFA98XX_TEMPERATURE_TEMPS (0x1ff<<0) -#define TFA98XX_TEMPERATURE_TEMPS_POS 0 -#define TFA98XX_TEMPERATURE_TEMPS_LEN 9 -#define TFA98XX_TEMPERATURE_TEMPS_MAX 511 -#define TFA98XX_TEMPERATURE_TEMPS_MSK 0x1ff - - -/* - * (0x20)-tdm_config0 - */ - -/* - * tdm_usecase - */ -#define TFA98XX_TDM_CONFIG0_TDMUC (0xf<<0) -#define TFA98XX_TDM_CONFIG0_TDMUC_POS 0 -#define TFA98XX_TDM_CONFIG0_TDMUC_LEN 4 -#define TFA98XX_TDM_CONFIG0_TDMUC_MAX 15 -#define TFA98XX_TDM_CONFIG0_TDMUC_MSK 0xf - -/* - * tdm_enable - */ -#define TFA98XX_TDM_CONFIG0_TDME (0x1<<4) -#define TFA98XX_TDM_CONFIG0_TDME_POS 4 -#define TFA98XX_TDM_CONFIG0_TDME_LEN 1 -#define TFA98XX_TDM_CONFIG0_TDME_MAX 1 -#define TFA98XX_TDM_CONFIG0_TDME_MSK 0x10 - -/* - * tdm_mode - */ -#define TFA98XX_TDM_CONFIG0_TDMMODE (0x1<<5) -#define TFA98XX_TDM_CONFIG0_TDMMODE_POS 5 -#define TFA98XX_TDM_CONFIG0_TDMMODE_LEN 1 -#define TFA98XX_TDM_CONFIG0_TDMMODE_MAX 1 -#define TFA98XX_TDM_CONFIG0_TDMMODE_MSK 0x20 - -/* - * tdm_clk_inversion - */ -#define TFA98XX_TDM_CONFIG0_TDMCLINV (0x1<<6) -#define TFA98XX_TDM_CONFIG0_TDMCLINV_POS 6 -#define TFA98XX_TDM_CONFIG0_TDMCLINV_LEN 1 -#define TFA98XX_TDM_CONFIG0_TDMCLINV_MAX 1 -#define TFA98XX_TDM_CONFIG0_TDMCLINV_MSK 0x40 - -/* - * tdm_fs_ws_length - */ -#define TFA98XX_TDM_CONFIG0_TDMFSLN (0xf<<7) -#define TFA98XX_TDM_CONFIG0_TDMFSLN_POS 7 -#define TFA98XX_TDM_CONFIG0_TDMFSLN_LEN 4 -#define TFA98XX_TDM_CONFIG0_TDMFSLN_MAX 15 -#define TFA98XX_TDM_CONFIG0_TDMFSLN_MSK 0x780 - -/* - * tdm_fs_ws_polarity - */ -#define TFA98XX_TDM_CONFIG0_TDMFSPOL (0x1<<11) -#define TFA98XX_TDM_CONFIG0_TDMFSPOL_POS 11 -#define TFA98XX_TDM_CONFIG0_TDMFSPOL_LEN 1 -#define TFA98XX_TDM_CONFIG0_TDMFSPOL_MAX 1 -#define TFA98XX_TDM_CONFIG0_TDMFSPOL_MSK 0x800 - -/* - * tdm_nbck - */ -#define TFA98XX_TDM_CONFIG0_TDMNBCK (0xf<<12) -#define TFA98XX_TDM_CONFIG0_TDMNBCK_POS 12 -#define TFA98XX_TDM_CONFIG0_TDMNBCK_LEN 4 -#define TFA98XX_TDM_CONFIG0_TDMNBCK_MAX 15 -#define TFA98XX_TDM_CONFIG0_TDMNBCK_MSK 0xf000 - - -/* - * (0x21)-tdm_config1 - */ - -/* - * tdm_nb_of_slots - */ -#define TFA98XX_TDM_CONFIG1_TDMSLOTS (0xf<<0) -#define TFA98XX_TDM_CONFIG1_TDMSLOTS_POS 0 -#define TFA98XX_TDM_CONFIG1_TDMSLOTS_LEN 4 -#define TFA98XX_TDM_CONFIG1_TDMSLOTS_MAX 15 -#define TFA98XX_TDM_CONFIG1_TDMSLOTS_MSK 0xf - -/* - * tdm_slot_length - */ -#define TFA98XX_TDM_CONFIG1_TDMSLLN (0x1f<<4) -#define TFA98XX_TDM_CONFIG1_TDMSLLN_POS 4 -#define TFA98XX_TDM_CONFIG1_TDMSLLN_LEN 5 -#define TFA98XX_TDM_CONFIG1_TDMSLLN_MAX 31 -#define TFA98XX_TDM_CONFIG1_TDMSLLN_MSK 0x1f0 - -/* - * tdm_bits_remaining - */ -#define TFA98XX_TDM_CONFIG1_TDMBRMG (0x1f<<9) -#define TFA98XX_TDM_CONFIG1_TDMBRMG_POS 9 -#define TFA98XX_TDM_CONFIG1_TDMBRMG_LEN 5 -#define TFA98XX_TDM_CONFIG1_TDMBRMG_MAX 31 -#define TFA98XX_TDM_CONFIG1_TDMBRMG_MSK 0x3e00 - -/* - * tdm_data_delay - */ -#define TFA98XX_TDM_CONFIG1_TDMDEL (0x1<<14) -#define TFA98XX_TDM_CONFIG1_TDMDEL_POS 14 -#define TFA98XX_TDM_CONFIG1_TDMDEL_LEN 1 -#define TFA98XX_TDM_CONFIG1_TDMDEL_MAX 1 -#define TFA98XX_TDM_CONFIG1_TDMDEL_MSK 0x4000 - -/* - * tdm_data_adjustment - */ -#define TFA98XX_TDM_CONFIG1_TDMADJ (0x1<<15) -#define TFA98XX_TDM_CONFIG1_TDMADJ_POS 15 -#define TFA98XX_TDM_CONFIG1_TDMADJ_LEN 1 -#define TFA98XX_TDM_CONFIG1_TDMADJ_MAX 1 -#define TFA98XX_TDM_CONFIG1_TDMADJ_MSK 0x8000 - - -/* - * (0x22)-tdm_config2 - */ - -/* - * tdm_audio_sample_compression - */ -#define TFA98XX_TDM_CONFIG2_TDMOOMP (0x3<<0) -#define TFA98XX_TDM_CONFIG2_TDMOOMP_POS 0 -#define TFA98XX_TDM_CONFIG2_TDMOOMP_LEN 2 -#define TFA98XX_TDM_CONFIG2_TDMOOMP_MAX 3 -#define TFA98XX_TDM_CONFIG2_TDMOOMP_MSK 0x3 - -/* - * tdm_sample_size - */ -#define TFA98XX_TDM_CONFIG2_TDMSSIZE (0x1f<<2) -#define TFA98XX_TDM_CONFIG2_TDMSSIZE_POS 2 -#define TFA98XX_TDM_CONFIG2_TDMSSIZE_LEN 5 -#define TFA98XX_TDM_CONFIG2_TDMSSIZE_MAX 31 -#define TFA98XX_TDM_CONFIG2_TDMSSIZE_MSK 0x7c - -/* - * tdm_txdata_format - */ -#define TFA98XX_TDM_CONFIG2_TDMTXDFO (0x3<<7) -#define TFA98XX_TDM_CONFIG2_TDMTXDFO_POS 7 -#define TFA98XX_TDM_CONFIG2_TDMTXDFO_LEN 2 -#define TFA98XX_TDM_CONFIG2_TDMTXDFO_MAX 3 -#define TFA98XX_TDM_CONFIG2_TDMTXDFO_MSK 0x180 - -/* - * tdm_txdata_format_unused_slot_sd0 - */ -#define TFA98XX_TDM_CONFIG2_TDMTXUS0 (0x3<<9) -#define TFA98XX_TDM_CONFIG2_TDMTXUS0_POS 9 -#define TFA98XX_TDM_CONFIG2_TDMTXUS0_LEN 2 -#define TFA98XX_TDM_CONFIG2_TDMTXUS0_MAX 3 -#define TFA98XX_TDM_CONFIG2_TDMTXUS0_MSK 0x600 - -/* - * tdm_txdata_format_unused_slot_sd1 - */ -#define TFA98XX_TDM_CONFIG2_TDMTXUS1 (0x3<<11) -#define TFA98XX_TDM_CONFIG2_TDMTXUS1_POS 11 -#define TFA98XX_TDM_CONFIG2_TDMTXUS1_LEN 2 -#define TFA98XX_TDM_CONFIG2_TDMTXUS1_MAX 3 -#define TFA98XX_TDM_CONFIG2_TDMTXUS1_MSK 0x1800 - -/* - * tdm_txdata_format_unused_slot_sd2 - */ -#define TFA98XX_TDM_CONFIG2_TDMTXUS2 (0x3<<13) -#define TFA98XX_TDM_CONFIG2_TDMTXUS2_POS 13 -#define TFA98XX_TDM_CONFIG2_TDMTXUS2_LEN 2 -#define TFA98XX_TDM_CONFIG2_TDMTXUS2_MAX 3 -#define TFA98XX_TDM_CONFIG2_TDMTXUS2_MSK 0x6000 - - -/* - * (0x23)-tdm_config3 - */ - -/* - * tdm_sink1_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMLE (0x1<<1) -#define TFA98XX_TDM_CONFIG3_TDMLE_POS 1 -#define TFA98XX_TDM_CONFIG3_TDMLE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMLE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMLE_MSK 0x2 - -/* - * tdm_sink2_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMRE (0x1<<2) -#define TFA98XX_TDM_CONFIG3_TDMRE_POS 2 -#define TFA98XX_TDM_CONFIG3_TDMRE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMRE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMRE_MSK 0x4 - -/* - * tdm_source1_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMVSRE (0x1<<4) -#define TFA98XX_TDM_CONFIG3_TDMVSRE_POS 4 -#define TFA98XX_TDM_CONFIG3_TDMVSRE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMVSRE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMVSRE_MSK 0x10 - -/* - * tdm_source2_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMCSRE (0x1<<5) -#define TFA98XX_TDM_CONFIG3_TDMCSRE_POS 5 -#define TFA98XX_TDM_CONFIG3_TDMCSRE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMCSRE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMCSRE_MSK 0x20 - -/* - * tdm_source3_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMVSLE (0x1<<6) -#define TFA98XX_TDM_CONFIG3_TDMVSLE_POS 6 -#define TFA98XX_TDM_CONFIG3_TDMVSLE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMVSLE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMVSLE_MSK 0x40 - -/* - * tdm_source4_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMCSLE (0x1<<7) -#define TFA98XX_TDM_CONFIG3_TDMCSLE_POS 7 -#define TFA98XX_TDM_CONFIG3_TDMCSLE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMCSLE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMCSLE_MSK 0x80 - -/* - * tdm_source5_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMCFRE (0x1<<8) -#define TFA98XX_TDM_CONFIG3_TDMCFRE_POS 8 -#define TFA98XX_TDM_CONFIG3_TDMCFRE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMCFRE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMCFRE_MSK 0x100 - -/* - * tdm_source6_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMCFLE (0x1<<9) -#define TFA98XX_TDM_CONFIG3_TDMCFLE_POS 9 -#define TFA98XX_TDM_CONFIG3_TDMCFLE_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMCFLE_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMCFLE_MSK 0x200 - -/* - * tdm_source7_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMCF3E (0x1<<10) -#define TFA98XX_TDM_CONFIG3_TDMCF3E_POS 10 -#define TFA98XX_TDM_CONFIG3_TDMCF3E_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMCF3E_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMCF3E_MSK 0x400 - -/* - * tdm_source8_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMCF4E (0x1<<11) -#define TFA98XX_TDM_CONFIG3_TDMCF4E_POS 11 -#define TFA98XX_TDM_CONFIG3_TDMCF4E_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMCF4E_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMCF4E_MSK 0x800 - -/* - * tdm_source9_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMPD1E (0x1<<12) -#define TFA98XX_TDM_CONFIG3_TDMPD1E_POS 12 -#define TFA98XX_TDM_CONFIG3_TDMPD1E_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMPD1E_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMPD1E_MSK 0x1000 - -/* - * tdm_source10_enable - */ -#define TFA98XX_TDM_CONFIG3_TDMPD2E (0x1<<13) -#define TFA98XX_TDM_CONFIG3_TDMPD2E_POS 13 -#define TFA98XX_TDM_CONFIG3_TDMPD2E_LEN 1 -#define TFA98XX_TDM_CONFIG3_TDMPD2E_MAX 1 -#define TFA98XX_TDM_CONFIG3_TDMPD2E_MSK 0x2000 - - -/* - * (0x24)-tdm_config4 - */ - -/* - * tdm_sink1_io - */ -#define TFA98XX_TDM_CONFIG4_TDMLIO (0x3<<2) -#define TFA98XX_TDM_CONFIG4_TDMLIO_POS 2 -#define TFA98XX_TDM_CONFIG4_TDMLIO_LEN 2 -#define TFA98XX_TDM_CONFIG4_TDMLIO_MAX 3 -#define TFA98XX_TDM_CONFIG4_TDMLIO_MSK 0xc - -/* - * tdm_sink2_io - */ -#define TFA98XX_TDM_CONFIG4_TDMRIO (0x3<<4) -#define TFA98XX_TDM_CONFIG4_TDMRIO_POS 4 -#define TFA98XX_TDM_CONFIG4_TDMRIO_LEN 2 -#define TFA98XX_TDM_CONFIG4_TDMRIO_MAX 3 -#define TFA98XX_TDM_CONFIG4_TDMRIO_MSK 0x30 - -/* - * tdm_source1_io - */ -#define TFA98XX_TDM_CONFIG4_TDMVSRIO (0x3<<8) -#define TFA98XX_TDM_CONFIG4_TDMVSRIO_POS 8 -#define TFA98XX_TDM_CONFIG4_TDMVSRIO_LEN 2 -#define TFA98XX_TDM_CONFIG4_TDMVSRIO_MAX 3 -#define TFA98XX_TDM_CONFIG4_TDMVSRIO_MSK 0x300 - -/* - * tdm_source2_io - */ -#define TFA98XX_TDM_CONFIG4_TDMCSRIO (0x3<<10) -#define TFA98XX_TDM_CONFIG4_TDMCSRIO_POS 10 -#define TFA98XX_TDM_CONFIG4_TDMCSRIO_LEN 2 -#define TFA98XX_TDM_CONFIG4_TDMCSRIO_MAX 3 -#define TFA98XX_TDM_CONFIG4_TDMCSRIO_MSK 0xc00 - -/* - * tdm_source3_io - */ -#define TFA98XX_TDM_CONFIG4_TDMVSLIO (0x3<<12) -#define TFA98XX_TDM_CONFIG4_TDMVSLIO_POS 12 -#define TFA98XX_TDM_CONFIG4_TDMVSLIO_LEN 2 -#define TFA98XX_TDM_CONFIG4_TDMVSLIO_MAX 3 -#define TFA98XX_TDM_CONFIG4_TDMVSLIO_MSK 0x3000 - -/* - * tdm_source4_io - */ -#define TFA98XX_TDM_CONFIG4_TDMCSLIO (0x3<<14) -#define TFA98XX_TDM_CONFIG4_TDMCSLIO_POS 14 -#define TFA98XX_TDM_CONFIG4_TDMCSLIO_LEN 2 -#define TFA98XX_TDM_CONFIG4_TDMCSLIO_MAX 3 -#define TFA98XX_TDM_CONFIG4_TDMCSLIO_MSK 0xc000 - - -/* - * (0x25)-tdm_config5 - */ - -/* - * tdm_source5_io - */ -#define TFA98XX_TDM_CONFIG5_TDMCFRIO (0x3<<0) -#define TFA98XX_TDM_CONFIG5_TDMCFRIO_POS 0 -#define TFA98XX_TDM_CONFIG5_TDMCFRIO_LEN 2 -#define TFA98XX_TDM_CONFIG5_TDMCFRIO_MAX 3 -#define TFA98XX_TDM_CONFIG5_TDMCFRIO_MSK 0x3 - -/* - * tdm_source6_io - */ -#define TFA98XX_TDM_CONFIG5_TDMCFLIO (0x3<<2) -#define TFA98XX_TDM_CONFIG5_TDMCFLIO_POS 2 -#define TFA98XX_TDM_CONFIG5_TDMCFLIO_LEN 2 -#define TFA98XX_TDM_CONFIG5_TDMCFLIO_MAX 3 -#define TFA98XX_TDM_CONFIG5_TDMCFLIO_MSK 0xc - -/* - * tdm_source7_io - */ -#define TFA98XX_TDM_CONFIG5_TDMCF3IO (0x3<<4) -#define TFA98XX_TDM_CONFIG5_TDMCF3IO_POS 4 -#define TFA98XX_TDM_CONFIG5_TDMCF3IO_LEN 2 -#define TFA98XX_TDM_CONFIG5_TDMCF3IO_MAX 3 -#define TFA98XX_TDM_CONFIG5_TDMCF3IO_MSK 0x30 - -/* - * tdm_source8_io - */ -#define TFA98XX_TDM_CONFIG5_TDMCF4IO (0x3<<6) -#define TFA98XX_TDM_CONFIG5_TDMCF4IO_POS 6 -#define TFA98XX_TDM_CONFIG5_TDMCF4IO_LEN 2 -#define TFA98XX_TDM_CONFIG5_TDMCF4IO_MAX 3 -#define TFA98XX_TDM_CONFIG5_TDMCF4IO_MSK 0xc0 - -/* - * tdm_source9_io - */ -#define TFA98XX_TDM_CONFIG5_TDMPD1IO (0x3<<8) -#define TFA98XX_TDM_CONFIG5_TDMPD1IO_POS 8 -#define TFA98XX_TDM_CONFIG5_TDMPD1IO_LEN 2 -#define TFA98XX_TDM_CONFIG5_TDMPD1IO_MAX 3 -#define TFA98XX_TDM_CONFIG5_TDMPD1IO_MSK 0x300 - -/* - * tdm_source10_io - */ -#define TFA98XX_TDM_CONFIG5_TDMPD2IO (0x3<<10) -#define TFA98XX_TDM_CONFIG5_TDMPD2IO_POS 10 -#define TFA98XX_TDM_CONFIG5_TDMPD2IO_LEN 2 -#define TFA98XX_TDM_CONFIG5_TDMPD2IO_MAX 3 -#define TFA98XX_TDM_CONFIG5_TDMPD2IO_MSK 0xc00 - - -/* - * (0x26)-tdm_config6 - */ - -/* - * tdm_sink1_slot - */ -#define TFA98XX_TDM_CONFIG6_TDMLS (0xf<<4) -#define TFA98XX_TDM_CONFIG6_TDMLS_POS 4 -#define TFA98XX_TDM_CONFIG6_TDMLS_LEN 4 -#define TFA98XX_TDM_CONFIG6_TDMLS_MAX 15 -#define TFA98XX_TDM_CONFIG6_TDMLS_MSK 0xf0 - -/* - * tdm_sink2_slot - */ -#define TFA98XX_TDM_CONFIG6_TDMRS (0xf<<8) -#define TFA98XX_TDM_CONFIG6_TDMRS_POS 8 -#define TFA98XX_TDM_CONFIG6_TDMRS_LEN 4 -#define TFA98XX_TDM_CONFIG6_TDMRS_MAX 15 -#define TFA98XX_TDM_CONFIG6_TDMRS_MSK 0xf00 - - -/* - * (0x27)-tdm_config7 - */ - -/* - * tdm_source1_slot - */ -#define TFA98XX_TDM_CONFIG7_TDMVSRS (0xf<<0) -#define TFA98XX_TDM_CONFIG7_TDMVSRS_POS 0 -#define TFA98XX_TDM_CONFIG7_TDMVSRS_LEN 4 -#define TFA98XX_TDM_CONFIG7_TDMVSRS_MAX 15 -#define TFA98XX_TDM_CONFIG7_TDMVSRS_MSK 0xf - -/* - * tdm_source2_slot - */ -#define TFA98XX_TDM_CONFIG7_TDMCSRS (0xf<<4) -#define TFA98XX_TDM_CONFIG7_TDMCSRS_POS 4 -#define TFA98XX_TDM_CONFIG7_TDMCSRS_LEN 4 -#define TFA98XX_TDM_CONFIG7_TDMCSRS_MAX 15 -#define TFA98XX_TDM_CONFIG7_TDMCSRS_MSK 0xf0 - -/* - * tdm_source3_slot - */ -#define TFA98XX_TDM_CONFIG7_TDMVSLS (0xf<<8) -#define TFA98XX_TDM_CONFIG7_TDMVSLS_POS 8 -#define TFA98XX_TDM_CONFIG7_TDMVSLS_LEN 4 -#define TFA98XX_TDM_CONFIG7_TDMVSLS_MAX 15 -#define TFA98XX_TDM_CONFIG7_TDMVSLS_MSK 0xf00 - -/* - * tdm_source4_slot - */ -#define TFA98XX_TDM_CONFIG7_TDMCSLS (0xf<<12) -#define TFA98XX_TDM_CONFIG7_TDMCSLS_POS 12 -#define TFA98XX_TDM_CONFIG7_TDMCSLS_LEN 4 -#define TFA98XX_TDM_CONFIG7_TDMCSLS_MAX 15 -#define TFA98XX_TDM_CONFIG7_TDMCSLS_MSK 0xf000 - - -/* - * (0x28)-tdm_config8 - */ - -/* - * tdm_source5_slot - */ -#define TFA98XX_TDM_CONFIG8_TDMCFRS (0xf<<0) -#define TFA98XX_TDM_CONFIG8_TDMCFRS_POS 0 -#define TFA98XX_TDM_CONFIG8_TDMCFRS_LEN 4 -#define TFA98XX_TDM_CONFIG8_TDMCFRS_MAX 15 -#define TFA98XX_TDM_CONFIG8_TDMCFRS_MSK 0xf - -/* - * tdm_source6_slot - */ -#define TFA98XX_TDM_CONFIG8_TDMCFLS (0xf<<4) -#define TFA98XX_TDM_CONFIG8_TDMCFLS_POS 4 -#define TFA98XX_TDM_CONFIG8_TDMCFLS_LEN 4 -#define TFA98XX_TDM_CONFIG8_TDMCFLS_MAX 15 -#define TFA98XX_TDM_CONFIG8_TDMCFLS_MSK 0xf0 - -/* - * tdm_source7_slot - */ -#define TFA98XX_TDM_CONFIG8_TDMCF3S (0xf<<8) -#define TFA98XX_TDM_CONFIG8_TDMCF3S_POS 8 -#define TFA98XX_TDM_CONFIG8_TDMCF3S_LEN 4 -#define TFA98XX_TDM_CONFIG8_TDMCF3S_MAX 15 -#define TFA98XX_TDM_CONFIG8_TDMCF3S_MSK 0xf00 - -/* - * tdm_source8_slot - */ -#define TFA98XX_TDM_CONFIG8_TDMCF4S (0xf<<12) -#define TFA98XX_TDM_CONFIG8_TDMCF4S_POS 12 -#define TFA98XX_TDM_CONFIG8_TDMCF4S_LEN 4 -#define TFA98XX_TDM_CONFIG8_TDMCF4S_MAX 15 -#define TFA98XX_TDM_CONFIG8_TDMCF4S_MSK 0xf000 - - -/* - * (0x29)-tdm_config9 - */ - -/* - * tdm_source9_slot - */ -#define TFA98XX_TDM_CONFIG9_TDMPD1S (0xf<<0) -#define TFA98XX_TDM_CONFIG9_TDMPD1S_POS 0 -#define TFA98XX_TDM_CONFIG9_TDMPD1S_LEN 4 -#define TFA98XX_TDM_CONFIG9_TDMPD1S_MAX 15 -#define TFA98XX_TDM_CONFIG9_TDMPD1S_MSK 0xf - -/* - * tdm_source10_slot - */ -#define TFA98XX_TDM_CONFIG9_TDMPD2S (0xf<<4) -#define TFA98XX_TDM_CONFIG9_TDMPD2S_POS 4 -#define TFA98XX_TDM_CONFIG9_TDMPD2S_LEN 4 -#define TFA98XX_TDM_CONFIG9_TDMPD2S_MAX 15 -#define TFA98XX_TDM_CONFIG9_TDMPD2S_MSK 0xf0 - - -/* - * (0x31)-pdm_config0 - */ - -/* - * pdm_mode - */ -#define TFA98XX_PDM_CONFIG0_PDMSM (0x1<<0) -#define TFA98XX_PDM_CONFIG0_PDMSM_POS 0 -#define TFA98XX_PDM_CONFIG0_PDMSM_LEN 1 -#define TFA98XX_PDM_CONFIG0_PDMSM_MAX 1 -#define TFA98XX_PDM_CONFIG0_PDMSM_MSK 0x1 - -/* - * pdm_side_tone_sel - */ -#define TFA98XX_PDM_CONFIG0_PDMSTSEL (0x3<<1) -#define TFA98XX_PDM_CONFIG0_PDMSTSEL_POS 1 -#define TFA98XX_PDM_CONFIG0_PDMSTSEL_LEN 2 -#define TFA98XX_PDM_CONFIG0_PDMSTSEL_MAX 3 -#define TFA98XX_PDM_CONFIG0_PDMSTSEL_MSK 0x6 - -/* - * pdm_left_sel - */ -#define TFA98XX_PDM_CONFIG0_PDMLSEL (0x1<<3) -#define TFA98XX_PDM_CONFIG0_PDMLSEL_POS 3 -#define TFA98XX_PDM_CONFIG0_PDMLSEL_LEN 1 -#define TFA98XX_PDM_CONFIG0_PDMLSEL_MAX 1 -#define TFA98XX_PDM_CONFIG0_PDMLSEL_MSK 0x8 - -/* - * pdm_right_sel - */ -#define TFA98XX_PDM_CONFIG0_PDMRSEL (0x1<<4) -#define TFA98XX_PDM_CONFIG0_PDMRSEL_POS 4 -#define TFA98XX_PDM_CONFIG0_PDMRSEL_LEN 1 -#define TFA98XX_PDM_CONFIG0_PDMRSEL_MAX 1 -#define TFA98XX_PDM_CONFIG0_PDMRSEL_MSK 0x10 - -/* - * enbl_micvdd - */ -#define TFA98XX_PDM_CONFIG0_MICVDDE (0x1<<5) -#define TFA98XX_PDM_CONFIG0_MICVDDE_POS 5 -#define TFA98XX_PDM_CONFIG0_MICVDDE_LEN 1 -#define TFA98XX_PDM_CONFIG0_MICVDDE_MAX 1 -#define TFA98XX_PDM_CONFIG0_MICVDDE_MSK 0x20 - - -/* - * (0x32)-pdm_config1 - */ - -/* - * pdm_nbck - */ -#define TFA98XX_PDM_CONFIG1_PDMCLRAT (0x3<<0) -#define TFA98XX_PDM_CONFIG1_PDMCLRAT_POS 0 -#define TFA98XX_PDM_CONFIG1_PDMCLRAT_LEN 2 -#define TFA98XX_PDM_CONFIG1_PDMCLRAT_MAX 3 -#define TFA98XX_PDM_CONFIG1_PDMCLRAT_MSK 0x3 - -/* - * pdm_gain - */ -#define TFA98XX_PDM_CONFIG1_PDMGAIN (0xf<<2) -#define TFA98XX_PDM_CONFIG1_PDMGAIN_POS 2 -#define TFA98XX_PDM_CONFIG1_PDMGAIN_LEN 4 -#define TFA98XX_PDM_CONFIG1_PDMGAIN_MAX 15 -#define TFA98XX_PDM_CONFIG1_PDMGAIN_MSK 0x3c - -/* - * sel_pdm_out_data - */ -#define TFA98XX_PDM_CONFIG1_PDMOSEL (0xf<<6) -#define TFA98XX_PDM_CONFIG1_PDMOSEL_POS 6 -#define TFA98XX_PDM_CONFIG1_PDMOSEL_LEN 4 -#define TFA98XX_PDM_CONFIG1_PDMOSEL_MAX 15 -#define TFA98XX_PDM_CONFIG1_PDMOSEL_MSK 0x3c0 - -/* - * sel_cf_haptic_data - */ -#define TFA98XX_PDM_CONFIG1_SELCFHAPD (0x1<<10) -#define TFA98XX_PDM_CONFIG1_SELCFHAPD_POS 10 -#define TFA98XX_PDM_CONFIG1_SELCFHAPD_LEN 1 -#define TFA98XX_PDM_CONFIG1_SELCFHAPD_MAX 1 -#define TFA98XX_PDM_CONFIG1_SELCFHAPD_MSK 0x400 - - -/* - * (0x33)-haptic_driver_config - */ - -/* - * haptic_duration - */ -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME (0xff<<0) -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_POS 0 -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_LEN 8 -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_MAX 255 -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPTIME_MSK 0xff - -/* - * haptic_data - */ -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL (0xff<<8) -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_POS 8 -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_LEN 8 -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_MAX 255 -#define TFA98XX_HAPTIC_DRIVER_CONFIG_HAPLEVEL_MSK 0xff00 - - -/* - * (0x34)-gpio_datain_reg - */ - -/* - * gpio_datain - */ -#define TFA98XX_GPIO_DATAIN_REG_GPIODIN (0xf<<0) -#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_POS 0 -#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_LEN 4 -#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_MAX 15 -#define TFA98XX_GPIO_DATAIN_REG_GPIODIN_MSK 0xf - - -/* - * (0x35)-gpio_config - */ - -/* - * gpio_ctrl - */ -#define TFA98XX_GPIO_CONFIG_GPIOCTRL (0x1<<0) -#define TFA98XX_GPIO_CONFIG_GPIOCTRL_POS 0 -#define TFA98XX_GPIO_CONFIG_GPIOCTRL_LEN 1 -#define TFA98XX_GPIO_CONFIG_GPIOCTRL_MAX 1 -#define TFA98XX_GPIO_CONFIG_GPIOCTRL_MSK 0x1 - -/* - * gpio_dir - */ -#define TFA98XX_GPIO_CONFIG_GPIOCONF (0xf<<1) -#define TFA98XX_GPIO_CONFIG_GPIOCONF_POS 1 -#define TFA98XX_GPIO_CONFIG_GPIOCONF_LEN 4 -#define TFA98XX_GPIO_CONFIG_GPIOCONF_MAX 15 -#define TFA98XX_GPIO_CONFIG_GPIOCONF_MSK 0x1e - -/* - * gpio_dataout - */ -#define TFA98XX_GPIO_CONFIG_GPIODOUT (0xf<<5) -#define TFA98XX_GPIO_CONFIG_GPIODOUT_POS 5 -#define TFA98XX_GPIO_CONFIG_GPIODOUT_LEN 4 -#define TFA98XX_GPIO_CONFIG_GPIODOUT_MAX 15 -#define TFA98XX_GPIO_CONFIG_GPIODOUT_MSK 0x1e0 - - -/* - * (0x40)-interrupt_out_reg1 - */ - -/* - * int_out_flag_por - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS (0x1<<0) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_POS 0 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTVDDS_MSK 0x1 - -/* - * int_out_flag_pll_lock - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS (0x1<<1) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_POS 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTPLLS_MSK 0x2 - -/* - * int_out_flag_otpok - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS (0x1<<2) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_POS 2 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOTDS_MSK 0x4 - -/* - * int_out_flag_ovpok - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS (0x1<<3) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_POS 3 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTOVDS_MSK 0x8 - -/* - * int_out_flag_uvpok - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS (0x1<<4) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_POS 4 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTUVDS_MSK 0x10 - -/* - * int_out_flag_clocks_stable - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS (0x1<<5) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_POS 5 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTCLKS_MSK 0x20 - -/* - * int_out_flag_mtp_busy - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB (0x1<<6) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_POS 6 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTMTPB_MSK 0x40 - -/* - * int_out_flag_lost_clk - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK (0x1<<7) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_POS 7 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTNOCLK_MSK 0x80 - -/* - * int_out_flag_cf_speakererror - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS (0x1<<8) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_POS 8 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSPKS_MSK 0x100 - -/* - * int_out_flag_cold_started - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS (0x1<<9) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_POS 9 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTACS_MSK 0x200 - -/* - * int_out_flag_engage - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS (0x1<<10) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_POS 10 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTSWS_MSK 0x400 - -/* - * int_out_flag_watchdog_reset - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS (0x1<<11) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_POS 11 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTWDS_MSK 0x800 - -/* - * int_out_flag_enbl_amp - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS (0x1<<12) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_POS 12 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAMPS_MSK 0x1000 - -/* - * int_out_flag_enbl_ref - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS (0x1<<13) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_POS 13 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTAREFS_MSK 0x2000 - -/* - * int_out_flag_adc10_ready - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR (0x1<<14) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_POS 14 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTADCCR_MSK 0x4000 - -/* - * int_out_flag_bod_vddd_nok - */ -#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK (0x1<<15) -#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_POS 15 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG1_ISTBODNOK_MSK 0x8000 - - -/* - * (0x41)-interrupt_out_reg2 - */ - -/* - * int_out_flag_bst_bstcur - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU (0x1<<0) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_POS 0 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTCU_MSK 0x1 - -/* - * int_out_flag_bst_hiz - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI (0x1<<1) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_POS 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTHI_MSK 0x2 - -/* - * int_out_flag_bst_ocpok - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC (0x1<<2) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_POS 2 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTOC_MSK 0x4 - -/* - * int_out_flag_bst_peakcur - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR (0x1<<3) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_POS 3 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTPKCUR_MSK 0x8 - -/* - * int_out_flag_bst_voutcomp - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC (0x1<<4) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_POS 4 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBSTVC_MSK 0x10 - -/* - * int_out_flag_bst_voutcomp86 - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86 (0x1<<5) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_POS 5 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST86_MSK 0x20 - -/* - * int_out_flag_bst_voutcomp93 - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93 (0x1<<6) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_POS 6 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTBST93_MSK 0x40 - -/* - * int_out_flag_rcvldop_ready - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD (0x1<<7) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_POS 7 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTRCVLD_MSK 0x80 - -/* - * int_out_flag_ocp_alarm_left - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL (0x1<<8) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_POS 8 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPL_MSK 0x100 - -/* - * int_out_flag_ocp_alarm_right - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR (0x1<<9) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_POS 9 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTOCPR_MSK 0x200 - -/* - * int_out_flag_man_wait_src_settings - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC (0x1<<10) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_POS 10 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSRC_MSK 0x400 - -/* - * int_out_flag_man_wait_cf_config - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC (0x1<<11) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_POS 11 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWCFC_MSK 0x800 - -/* - * int_out_flag_man_start_mute_audio - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU (0x1<<12) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_POS 12 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTMWSMU_MSK 0x1000 - -/* - * int_out_flag_cfma_err - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER (0x1<<13) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_POS 13 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMER_MSK 0x2000 - -/* - * int_out_flag_cfma_ack - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC (0x1<<14) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_POS 14 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCFMAC_MSK 0x4000 - -/* - * int_out_flag_clk_out_of_range - */ -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR (0x1<<15) -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_POS 15 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG2_ISTCLKOOR_MSK 0x8000 - - -/* - * (0x42)-interrupt_out_reg3 - */ - -/* - * int_out_flag_tdm_error - */ -#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER (0x1<<0) -#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_POS 0 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTTDMER_MSK 0x1 - -/* - * int_out_flag_clip_left - */ -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL (0x1<<1) -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_POS 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPL_MSK 0x2 - -/* - * int_out_flag_clip_right - */ -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR (0x1<<2) -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_POS 2 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTCLPR_MSK 0x4 - -/* - * int_out_flag_mic_ocpok - */ -#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM (0x1<<3) -#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_POS 3 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_LEN 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_MAX 1 -#define TFA98XX_INTERRUPT_OUT_REG3_ISTOCPM_MSK 0x8 - - -/* - * (0x44)-interrupt_in_reg1 - */ - -/* - * int_in_flag_por - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS (0x1<<0) -#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_POS 0 -#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLVDDS_MSK 0x1 - -/* - * int_in_flag_pll_lock - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS (0x1<<1) -#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_POS 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLPLLS_MSK 0x2 - -/* - * int_in_flag_otpok - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS (0x1<<2) -#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_POS 2 -#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLOTDS_MSK 0x4 - -/* - * int_in_flag_ovpok - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS (0x1<<3) -#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_POS 3 -#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLOVDS_MSK 0x8 - -/* - * int_in_flag_uvpok - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS (0x1<<4) -#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_POS 4 -#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLUVDS_MSK 0x10 - -/* - * int_in_flag_clocks_stable - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS (0x1<<5) -#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_POS 5 -#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLCLKS_MSK 0x20 - -/* - * int_in_flag_mtp_busy - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB (0x1<<6) -#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_POS 6 -#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLMTPB_MSK 0x40 - -/* - * int_in_flag_lost_clk - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK (0x1<<7) -#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_POS 7 -#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLNOCLK_MSK 0x80 - -/* - * int_in_flag_cf_speakererror - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS (0x1<<8) -#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_POS 8 -#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLSPKS_MSK 0x100 - -/* - * int_in_flag_cold_started - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLACS (0x1<<9) -#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_POS 9 -#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLACS_MSK 0x200 - -/* - * int_in_flag_engage - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS (0x1<<10) -#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_POS 10 -#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLSWS_MSK 0x400 - -/* - * int_in_flag_watchdog_reset - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS (0x1<<11) -#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_POS 11 -#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLWDS_MSK 0x800 - -/* - * int_in_flag_enbl_amp - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS (0x1<<12) -#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_POS 12 -#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLAMPS_MSK 0x1000 - -/* - * int_in_flag_enbl_ref - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS (0x1<<13) -#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_POS 13 -#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLAREFS_MSK 0x2000 - -/* - * int_in_flag_adc10_ready - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR (0x1<<14) -#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_POS 14 -#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLADCCR_MSK 0x4000 - -/* - * int_in_flag_bod_vddd_nok - */ -#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK (0x1<<15) -#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_POS 15 -#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG1_ICLBODNOK_MSK 0x8000 - - -/* - * (0x45)-interrupt_in_reg2 - */ - -/* - * int_in_flag_bst_bstcur - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU (0x1<<0) -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_POS 0 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTCU_MSK 0x1 - -/* - * int_in_flag_bst_hiz - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI (0x1<<1) -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_POS 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTHI_MSK 0x2 - -/* - * int_in_flag_bst_ocpok - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC (0x1<<2) -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_POS 2 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTOC_MSK 0x4 - -/* - * int_in_flag_bst_peakcur - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC (0x1<<3) -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_POS 3 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTPC_MSK 0x8 - -/* - * int_in_flag_bst_voutcomp - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC (0x1<<4) -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_POS 4 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBSTVC_MSK 0x10 - -/* - * int_in_flag_bst_voutcomp86 - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86 (0x1<<5) -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_POS 5 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST86_MSK 0x20 - -/* - * int_in_flag_bst_voutcomp93 - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93 (0x1<<6) -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_POS 6 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLBST93_MSK 0x40 - -/* - * int_in_flag_rcvldop_ready - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD (0x1<<7) -#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_POS 7 -#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLRCVLD_MSK 0x80 - -/* - * int_in_flag_ocp_alarm_left - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL (0x1<<8) -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_POS 8 -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPL_MSK 0x100 - -/* - * int_in_flag_ocp_alarm_right - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR (0x1<<9) -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_POS 9 -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLOCPR_MSK 0x200 - -/* - * int_in_flag_man_wait_src_settings - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC (0x1<<10) -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_POS 10 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSRC_MSK 0x400 - -/* - * int_in_flag_man_wait_cf_config - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC (0x1<<11) -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_POS 11 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWCFC_MSK 0x800 - -/* - * int_in_flag_man_start_mute_audio - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU (0x1<<12) -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_POS 12 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLMWSMU_MSK 0x1000 - -/* - * int_in_flag_cfma_err - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER (0x1<<13) -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_POS 13 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMER_MSK 0x2000 - -/* - * int_in_flag_cfma_ack - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC (0x1<<14) -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_POS 14 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCFMAC_MSK 0x4000 - -/* - * int_in_flag_clk_out_of_range - */ -#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR (0x1<<15) -#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_POS 15 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG2_ICLCLKOOR_MSK 0x8000 - - -/* - * (0x46)-interrupt_in_reg3 - */ - -/* - * int_in_flag_tdm_error - */ -#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER (0x1<<0) -#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_POS 0 -#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLTDMER_MSK 0x1 - -/* - * int_in_flag_clip_left - */ -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL (0x1<<1) -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_POS 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPL_MSK 0x2 - -/* - * int_in_flag_clip_right - */ -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR (0x1<<2) -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_POS 2 -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLCLPR_MSK 0x4 - -/* - * int_in_flag_mic_ocpok - */ -#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM (0x1<<3) -#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_POS 3 -#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_LEN 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_MAX 1 -#define TFA98XX_INTERRUPT_IN_REG3_ICLOCPM_MSK 0x8 - - -/* - * (0x48)-interrupt_enable_reg1 - */ - -/* - * int_enable_flag_por - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS (0x1<<0) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_POS 0 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEVDDS_MSK 0x1 - -/* - * int_enable_flag_pll_lock - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS (0x1<<1) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_POS 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEPLLS_MSK 0x2 - -/* - * int_enable_flag_otpok - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS (0x1<<2) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_POS 2 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOTDS_MSK 0x4 - -/* - * int_enable_flag_ovpok - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS (0x1<<3) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_POS 3 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEOVDS_MSK 0x8 - -/* - * int_enable_flag_uvpok - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS (0x1<<4) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_POS 4 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEUVDS_MSK 0x10 - -/* - * int_enable_flag_clocks_stable - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS (0x1<<5) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_POS 5 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IECLKS_MSK 0x20 - -/* - * int_enable_flag_mtp_busy - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB (0x1<<6) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_POS 6 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEMTPB_MSK 0x40 - -/* - * int_enable_flag_lost_clk - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK (0x1<<7) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_POS 7 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IENOCLK_MSK 0x80 - -/* - * int_enable_flag_cf_speakererror - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS (0x1<<8) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_POS 8 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESPKS_MSK 0x100 - -/* - * int_enable_flag_cold_started - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS (0x1<<9) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_POS 9 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEACS_MSK 0x200 - -/* - * int_enable_flag_engage - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS (0x1<<10) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_POS 10 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IESWS_MSK 0x400 - -/* - * int_enable_flag_watchdog_reset - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS (0x1<<11) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_POS 11 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEWDS_MSK 0x800 - -/* - * int_enable_flag_enbl_amp - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS (0x1<<12) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_POS 12 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAMPS_MSK 0x1000 - -/* - * int_enable_flag_enbl_ref - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS (0x1<<13) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_POS 13 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEAREFS_MSK 0x2000 - -/* - * int_enable_flag_adc10_ready - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR (0x1<<14) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_POS 14 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEADCCR_MSK 0x4000 - -/* - * int_enable_flag_bod_vddd_nok - */ -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK (0x1<<15) -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_POS 15 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG1_IEBODNOK_MSK 0x8000 - - -/* - * (0x49)-interrupt_enable_reg2 - */ - -/* - * int_enable_flag_bst_bstcur - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU (0x1<<0) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_POS 0 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTCU_MSK 0x1 - -/* - * int_enable_flag_bst_hiz - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI (0x1<<1) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_POS 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTHI_MSK 0x2 - -/* - * int_enable_flag_bst_ocpok - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC (0x1<<2) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_POS 2 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTOC_MSK 0x4 - -/* - * int_enable_flag_bst_peakcur - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC (0x1<<3) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_POS 3 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTPC_MSK 0x8 - -/* - * int_enable_flag_bst_voutcomp - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC (0x1<<4) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_POS 4 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBSTVC_MSK 0x10 - -/* - * int_enable_flag_bst_voutcomp86 - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86 (0x1<<5) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_POS 5 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST86_MSK 0x20 - -/* - * int_enable_flag_bst_voutcomp93 - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93 (0x1<<6) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_POS 6 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEBST93_MSK 0x40 - -/* - * int_enable_flag_rcvldop_ready - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD (0x1<<7) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_POS 7 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IERCVLD_MSK 0x80 - -/* - * int_enable_flag_ocp_alarm_left - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL (0x1<<8) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_POS 8 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPL_MSK 0x100 - -/* - * int_enable_flag_ocp_alarm_right - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR (0x1<<9) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_POS 9 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEOCPR_MSK 0x200 - -/* - * int_enable_flag_man_wait_src_settings - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC (0x1<<10) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_POS 10 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSRC_MSK 0x400 - -/* - * int_enable_flag_man_wait_cf_config - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC (0x1<<11) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_POS 11 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWCFC_MSK 0x800 - -/* - * int_enable_flag_man_start_mute_audio - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU (0x1<<12) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_POS 12 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IEMWSMU_MSK 0x1000 - -/* - * int_enable_flag_cfma_err - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER (0x1<<13) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_POS 13 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMER_MSK 0x2000 - -/* - * int_enable_flag_cfma_ack - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC (0x1<<14) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_POS 14 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECFMAC_MSK 0x4000 - -/* - * int_enable_flag_clk_out_of_range - */ -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR (0x1<<15) -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_POS 15 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG2_IECLKOOR_MSK 0x8000 - - -/* - * (0x4a)-interrupt_enable_reg3 - */ - -/* - * int_enable_flag_tdm_error - */ -#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER (0x1<<0) -#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_POS 0 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IETDMER_MSK 0x1 - -/* - * int_enable_flag_clip_left - */ -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL (0x1<<1) -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_POS 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPL_MSK 0x2 - -/* - * int_enable_flag_clip_right - */ -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR (0x1<<2) -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_POS 2 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IECLPR_MSK 0x4 - -/* - * int_enable_flag_mic_ocpok - */ -#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1 (0x1<<3) -#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_POS 3 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_LEN 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_MAX 1 -#define TFA98XX_INTERRUPT_ENABLE_REG3_IEOCPM1_MSK 0x8 - - -/* - * (0x4c)-status_polarity_reg1 - */ - -/* - * int_polarity_flag_por - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS (0x1<<0) -#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_POS 0 -#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOVDDS_MSK 0x1 - -/* - * int_polarity_flag_pll_lock - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS (0x1<<1) -#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_POS 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOPLLS_MSK 0x2 - -/* - * int_polarity_flag_otpok - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS (0x1<<2) -#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_POS 2 -#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOOTDS_MSK 0x4 - -/* - * int_polarity_flag_ovpok - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS (0x1<<3) -#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_POS 3 -#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOOVDS_MSK 0x8 - -/* - * int_polarity_flag_uvpok - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS (0x1<<4) -#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_POS 4 -#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOUVDS_MSK 0x10 - -/* - * int_polarity_flag_clocks_stable - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS (0x1<<5) -#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_POS 5 -#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOCLKS_MSK 0x20 - -/* - * int_polarity_flag_mtp_busy - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB (0x1<<6) -#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_POS 6 -#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOMTPB_MSK 0x40 - -/* - * int_polarity_flag_lost_clk - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK (0x1<<7) -#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_POS 7 -#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPONOCLK_MSK 0x80 - -/* - * int_polarity_flag_cf_speakererror - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS (0x1<<8) -#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_POS 8 -#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOSPKS_MSK 0x100 - -/* - * int_polarity_flag_cold_started - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOACS (0x1<<9) -#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_POS 9 -#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOACS_MSK 0x200 - -/* - * int_polarity_flag_engage - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS (0x1<<10) -#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_POS 10 -#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOSWS_MSK 0x400 - -/* - * int_polarity_flag_watchdog_reset - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS (0x1<<11) -#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_POS 11 -#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOWDS_MSK 0x800 - -/* - * int_polarity_flag_enbl_amp - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS (0x1<<12) -#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_POS 12 -#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOAMPS_MSK 0x1000 - -/* - * int_polarity_flag_enbl_ref - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS (0x1<<13) -#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_POS 13 -#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOAREFS_MSK 0x2000 - -/* - * int_polarity_flag_adc10_ready - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR (0x1<<14) -#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_POS 14 -#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOADCCR_MSK 0x4000 - -/* - * int_polarity_flag_bod_vddd_nok - */ -#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK (0x1<<15) -#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_POS 15 -#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG1_IPOBODNOK_MSK 0x8000 - - -/* - * (0x4d)-status_polarity_reg2 - */ - -/* - * int_polarity_flag_bst_bstcur - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU (0x1<<0) -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_POS 0 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTCU_MSK 0x1 - -/* - * int_polarity_flag_bst_hiz - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI (0x1<<1) -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_POS 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTHI_MSK 0x2 - -/* - * int_polarity_flag_bst_ocpok - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC (0x1<<2) -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_POS 2 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTOC_MSK 0x4 - -/* - * int_polarity_flag_bst_peakcur - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC (0x1<<3) -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_POS 3 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTPC_MSK 0x8 - -/* - * int_polarity_flag_bst_voutcomp - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC (0x1<<4) -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_POS 4 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBSTVC_MSK 0x10 - -/* - * int_polarity_flag_bst_voutcomp86 - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86 (0x1<<5) -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_POS 5 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST86_MSK 0x20 - -/* - * int_polarity_flag_bst_voutcomp93 - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93 (0x1<<6) -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_POS 6 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOBST93_MSK 0x40 - -/* - * int_polarity_flag_rcvldop_ready - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD (0x1<<7) -#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_POS 7 -#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPORCVLD_MSK 0x80 - -/* - * int_polarity_flag_ocp_alarm_left - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL (0x1<<8) -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_POS 8 -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPL_MSK 0x100 - -/* - * int_polarity_flag_ocp_alarm_right - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR (0x1<<9) -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_POS 9 -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOOCPR_MSK 0x200 - -/* - * int_polarity_flag_man_wait_src_settings - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC (0x1<<10) -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_POS 10 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSRC_MSK 0x400 - -/* - * int_polarity_flag_man_wait_cf_config - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC (0x1<<11) -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_POS 11 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWCFC_MSK 0x800 - -/* - * int_polarity_flag_man_start_mute_audio - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU (0x1<<12) -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_POS 12 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOMWSMU_MSK 0x1000 - -/* - * int_polarity_flag_cfma_err - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER (0x1<<13) -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_POS 13 -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMER_MSK 0x2000 - -/* - * int_polarity_flag_cfma_ack - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC (0x1<<14) -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_POS 14 -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPOCFMAC_MSK 0x4000 - -/* - * int_polarity_flag_clk_out_of_range - */ -#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR (0x1<<15) -#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_POS 15 -#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG2_IPCLKOOR_MSK 0x8000 - - -/* - * (0x4e)-status_polarity_reg3 - */ - -/* - * int_polarity_flag_tdm_error - */ -#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER (0x1<<0) -#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_POS 0 -#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOTDMER_MSK 0x1 - -/* - * int_polarity_flag_clip_left - */ -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL (0x1<<1) -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_POS 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPL_MSK 0x2 - -/* - * int_polarity_flag_clip_right - */ -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR (0x1<<2) -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_POS 2 -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOCLPR_MSK 0x4 - -/* - * int_polarity_flag_mic_ocpok - */ -#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM (0x1<<3) -#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_POS 3 -#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_LEN 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_MAX 1 -#define TFA98XX_STATUS_POLARITY_REG3_IPOOCPM_MSK 0x8 - - -/* - * (0x50)-bat_prot_config - */ - -/* - * vbat_prot_attack_time - */ -#define TFA98XX_BAT_PROT_CONFIG_BSSCR (0x3<<0) -#define TFA98XX_BAT_PROT_CONFIG_BSSCR_POS 0 -#define TFA98XX_BAT_PROT_CONFIG_BSSCR_LEN 2 -#define TFA98XX_BAT_PROT_CONFIG_BSSCR_MAX 3 -#define TFA98XX_BAT_PROT_CONFIG_BSSCR_MSK 0x3 - -/* - * vbat_prot_thlevel - */ -#define TFA98XX_BAT_PROT_CONFIG_BSST (0xf<<2) -#define TFA98XX_BAT_PROT_CONFIG_BSST_POS 2 -#define TFA98XX_BAT_PROT_CONFIG_BSST_LEN 4 -#define TFA98XX_BAT_PROT_CONFIG_BSST_MAX 15 -#define TFA98XX_BAT_PROT_CONFIG_BSST_MSK 0x3c - -/* - * vbat_prot_max_reduct - */ -#define TFA98XX_BAT_PROT_CONFIG_BSSRL (0x3<<6) -#define TFA98XX_BAT_PROT_CONFIG_BSSRL_POS 6 -#define TFA98XX_BAT_PROT_CONFIG_BSSRL_LEN 2 -#define TFA98XX_BAT_PROT_CONFIG_BSSRL_MAX 3 -#define TFA98XX_BAT_PROT_CONFIG_BSSRL_MSK 0xc0 - -/* - * vbat_prot_release_time - */ -#define TFA98XX_BAT_PROT_CONFIG_BSSRR (0x7<<8) -#define TFA98XX_BAT_PROT_CONFIG_BSSRR_POS 8 -#define TFA98XX_BAT_PROT_CONFIG_BSSRR_LEN 3 -#define TFA98XX_BAT_PROT_CONFIG_BSSRR_MAX 7 -#define TFA98XX_BAT_PROT_CONFIG_BSSRR_MSK 0x700 - -/* - * vbat_prot_hysterese - */ -#define TFA98XX_BAT_PROT_CONFIG_BSSHY (0x3<<11) -#define TFA98XX_BAT_PROT_CONFIG_BSSHY_POS 11 -#define TFA98XX_BAT_PROT_CONFIG_BSSHY_LEN 2 -#define TFA98XX_BAT_PROT_CONFIG_BSSHY_MAX 3 -#define TFA98XX_BAT_PROT_CONFIG_BSSHY_MSK 0x1800 - -/* - * sel_vbat - */ -#define TFA98XX_BAT_PROT_CONFIG_BSSR (0x1<<14) -#define TFA98XX_BAT_PROT_CONFIG_BSSR_POS 14 -#define TFA98XX_BAT_PROT_CONFIG_BSSR_LEN 1 -#define TFA98XX_BAT_PROT_CONFIG_BSSR_MAX 1 -#define TFA98XX_BAT_PROT_CONFIG_BSSR_MSK 0x4000 - -/* - * bypass_clipper - */ -#define TFA98XX_BAT_PROT_CONFIG_BSSBY (0x1<<15) -#define TFA98XX_BAT_PROT_CONFIG_BSSBY_POS 15 -#define TFA98XX_BAT_PROT_CONFIG_BSSBY_LEN 1 -#define TFA98XX_BAT_PROT_CONFIG_BSSBY_MAX 1 -#define TFA98XX_BAT_PROT_CONFIG_BSSBY_MSK 0x8000 - - -/* - * (0x51)-audio_control - */ - -/* - * batsense_steepness - */ -#define TFA98XX_AUDIO_CONTROL_BSSS (0x1<<0) -#define TFA98XX_AUDIO_CONTROL_BSSS_POS 0 -#define TFA98XX_AUDIO_CONTROL_BSSS_LEN 1 -#define TFA98XX_AUDIO_CONTROL_BSSS_MAX 1 -#define TFA98XX_AUDIO_CONTROL_BSSS_MSK 0x1 - -/* - * soft_mute - */ -#define TFA98XX_AUDIO_CONTROL_INTSMUTE (0x1<<1) -#define TFA98XX_AUDIO_CONTROL_INTSMUTE_POS 1 -#define TFA98XX_AUDIO_CONTROL_INTSMUTE_LEN 1 -#define TFA98XX_AUDIO_CONTROL_INTSMUTE_MAX 1 -#define TFA98XX_AUDIO_CONTROL_INTSMUTE_MSK 0x2 - -/* - * cf_mute_left - */ -#define TFA98XX_AUDIO_CONTROL_CFSML (0x1<<2) -#define TFA98XX_AUDIO_CONTROL_CFSML_POS 2 -#define TFA98XX_AUDIO_CONTROL_CFSML_LEN 1 -#define TFA98XX_AUDIO_CONTROL_CFSML_MAX 1 -#define TFA98XX_AUDIO_CONTROL_CFSML_MSK 0x4 - -/* - * cf_mute_right - */ -#define TFA98XX_AUDIO_CONTROL_CFSMR (0x1<<3) -#define TFA98XX_AUDIO_CONTROL_CFSMR_POS 3 -#define TFA98XX_AUDIO_CONTROL_CFSMR_LEN 1 -#define TFA98XX_AUDIO_CONTROL_CFSMR_MAX 1 -#define TFA98XX_AUDIO_CONTROL_CFSMR_MSK 0x8 - -/* - * bypass_hp_left - */ -#define TFA98XX_AUDIO_CONTROL_HPFBYPL (0x1<<4) -#define TFA98XX_AUDIO_CONTROL_HPFBYPL_POS 4 -#define TFA98XX_AUDIO_CONTROL_HPFBYPL_LEN 1 -#define TFA98XX_AUDIO_CONTROL_HPFBYPL_MAX 1 -#define TFA98XX_AUDIO_CONTROL_HPFBYPL_MSK 0x10 - -/* - * bypass_hp_right - */ -#define TFA98XX_AUDIO_CONTROL_HPFBYPR (0x1<<5) -#define TFA98XX_AUDIO_CONTROL_HPFBYPR_POS 5 -#define TFA98XX_AUDIO_CONTROL_HPFBYPR_LEN 1 -#define TFA98XX_AUDIO_CONTROL_HPFBYPR_MAX 1 -#define TFA98XX_AUDIO_CONTROL_HPFBYPR_MSK 0x20 - -/* - * enbl_dpsa_left - */ -#define TFA98XX_AUDIO_CONTROL_DPSAL (0x1<<6) -#define TFA98XX_AUDIO_CONTROL_DPSAL_POS 6 -#define TFA98XX_AUDIO_CONTROL_DPSAL_LEN 1 -#define TFA98XX_AUDIO_CONTROL_DPSAL_MAX 1 -#define TFA98XX_AUDIO_CONTROL_DPSAL_MSK 0x40 - -/* - * enbl_dpsa_right - */ -#define TFA98XX_AUDIO_CONTROL_DPSAR (0x1<<7) -#define TFA98XX_AUDIO_CONTROL_DPSAR_POS 7 -#define TFA98XX_AUDIO_CONTROL_DPSAR_LEN 1 -#define TFA98XX_AUDIO_CONTROL_DPSAR_MAX 1 -#define TFA98XX_AUDIO_CONTROL_DPSAR_MSK 0x80 - -/* - * cf_volume - */ -#define TFA98XX_AUDIO_CONTROL_VOL (0xff<<8) -#define TFA98XX_AUDIO_CONTROL_VOL_POS 8 -#define TFA98XX_AUDIO_CONTROL_VOL_LEN 8 -#define TFA98XX_AUDIO_CONTROL_VOL_MAX 255 -#define TFA98XX_AUDIO_CONTROL_VOL_MSK 0xff00 - - -/* - * (0x52)-amplifier_config - */ - -/* - * ctrl_rcv - */ -#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV (0x1<<0) -#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_POS 0 -#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_LEN 1 -#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_MAX 1 -#define TFA98XX_AMPLIFIER_CONFIG_HNDSFRCV_MSK 0x1 - -/* - * ctrl_cc - */ -#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL (0x7<<2) -#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_POS 2 -#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_LEN 3 -#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_MAX 7 -#define TFA98XX_AMPLIFIER_CONFIG_CLIPCTRL_MSK 0x1c - -/* - * gain - */ -#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN (0xff<<5) -#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_POS 5 -#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_LEN 8 -#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_MAX 255 -#define TFA98XX_AMPLIFIER_CONFIG_AMPGAIN_MSK 0x1fe0 - -/* - * ctrl_slopectrl - */ -#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE (0x1<<13) -#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_POS 13 -#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_LEN 1 -#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_MAX 1 -#define TFA98XX_AMPLIFIER_CONFIG_SLOPEE_MSK 0x2000 - -/* - * ctrl_slope - */ -#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET (0x3<<14) -#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_POS 14 -#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_LEN 2 -#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_MAX 3 -#define TFA98XX_AMPLIFIER_CONFIG_SLOPESET_MSK 0xc000 - - -/* - * (0x5a)-audio_control2 - */ - -/* - * cf_volume_sec - */ -#define TFA98XX_AUDIO_CONTROL2_VOLSEC (0xff<<0) -#define TFA98XX_AUDIO_CONTROL2_VOLSEC_POS 0 -#define TFA98XX_AUDIO_CONTROL2_VOLSEC_LEN 8 -#define TFA98XX_AUDIO_CONTROL2_VOLSEC_MAX 255 -#define TFA98XX_AUDIO_CONTROL2_VOLSEC_MSK 0xff - -/* - * sw_profile - */ -#define TFA98XX_AUDIO_CONTROL2_SWPROFIL (0xff<<8) -#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_POS 8 -#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_LEN 8 -#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_MAX 255 -#define TFA98XX_AUDIO_CONTROL2_SWPROFIL_MSK 0xff00 - - -/* - * (0x70)-dcdc_control0 - */ - -/* - * boost_volt - */ -#define TFA98XX_DCDC_CONTROL0_DCVO (0x7<<0) -#define TFA98XX_DCDC_CONTROL0_DCVO_POS 0 -#define TFA98XX_DCDC_CONTROL0_DCVO_LEN 3 -#define TFA98XX_DCDC_CONTROL0_DCVO_MAX 7 -#define TFA98XX_DCDC_CONTROL0_DCVO_MSK 0x7 - -/* - * boost_cur - */ -#define TFA98XX_DCDC_CONTROL0_DCMCC (0xf<<3) -#define TFA98XX_DCDC_CONTROL0_DCMCC_POS 3 -#define TFA98XX_DCDC_CONTROL0_DCMCC_LEN 4 -#define TFA98XX_DCDC_CONTROL0_DCMCC_MAX 15 -#define TFA98XX_DCDC_CONTROL0_DCMCC_MSK 0x78 - -/* - * bst_coil_value - */ -#define TFA98XX_DCDC_CONTROL0_DCCV (0x3<<7) -#define TFA98XX_DCDC_CONTROL0_DCCV_POS 7 -#define TFA98XX_DCDC_CONTROL0_DCCV_LEN 2 -#define TFA98XX_DCDC_CONTROL0_DCCV_MAX 3 -#define TFA98XX_DCDC_CONTROL0_DCCV_MSK 0x180 - -/* - * boost_intel - */ -#define TFA98XX_DCDC_CONTROL0_DCIE (0x1<<9) -#define TFA98XX_DCDC_CONTROL0_DCIE_POS 9 -#define TFA98XX_DCDC_CONTROL0_DCIE_LEN 1 -#define TFA98XX_DCDC_CONTROL0_DCIE_MAX 1 -#define TFA98XX_DCDC_CONTROL0_DCIE_MSK 0x200 - -/* - * boost_speed - */ -#define TFA98XX_DCDC_CONTROL0_DCSR (0x1<<10) -#define TFA98XX_DCDC_CONTROL0_DCSR_POS 10 -#define TFA98XX_DCDC_CONTROL0_DCSR_LEN 1 -#define TFA98XX_DCDC_CONTROL0_DCSR_MAX 1 -#define TFA98XX_DCDC_CONTROL0_DCSR_MSK 0x400 - -/* - * dcdc_synchronisation - */ -#define TFA98XX_DCDC_CONTROL0_DCSYNCP (0x7<<11) -#define TFA98XX_DCDC_CONTROL0_DCSYNCP_POS 11 -#define TFA98XX_DCDC_CONTROL0_DCSYNCP_LEN 3 -#define TFA98XX_DCDC_CONTROL0_DCSYNCP_MAX 7 -#define TFA98XX_DCDC_CONTROL0_DCSYNCP_MSK 0x3800 - -/* - * dcdcoff_mode - */ -#define TFA98XX_DCDC_CONTROL0_DCDIS (0x1<<14) -#define TFA98XX_DCDC_CONTROL0_DCDIS_POS 14 -#define TFA98XX_DCDC_CONTROL0_DCDIS_LEN 1 -#define TFA98XX_DCDC_CONTROL0_DCDIS_MAX 1 -#define TFA98XX_DCDC_CONTROL0_DCDIS_MSK 0x4000 - - -/* - * (0x90)-cf_controls - */ - -/* - * cf_rst_dsp - */ -#define TFA98XX_CF_CONTROLS_RST (0x1<<0) -#define TFA98XX_CF_CONTROLS_RST_POS 0 -#define TFA98XX_CF_CONTROLS_RST_LEN 1 -#define TFA98XX_CF_CONTROLS_RST_MAX 1 -#define TFA98XX_CF_CONTROLS_RST_MSK 0x1 - -/* - * cf_dmem - */ -#define TFA98XX_CF_CONTROLS_DMEM (0x3<<1) -#define TFA98XX_CF_CONTROLS_DMEM_POS 1 -#define TFA98XX_CF_CONTROLS_DMEM_LEN 2 -#define TFA98XX_CF_CONTROLS_DMEM_MAX 3 -#define TFA98XX_CF_CONTROLS_DMEM_MSK 0x6 - -/* - * cf_aif - */ -#define TFA98XX_CF_CONTROLS_AIF (0x1<<3) -#define TFA98XX_CF_CONTROLS_AIF_POS 3 -#define TFA98XX_CF_CONTROLS_AIF_LEN 1 -#define TFA98XX_CF_CONTROLS_AIF_MAX 1 -#define TFA98XX_CF_CONTROLS_AIF_MSK 0x8 - -/* - * cf_int - */ -#define TFA98XX_CF_CONTROLS_CFINT (0x1<<4) -#define TFA98XX_CF_CONTROLS_CFINT_POS 4 -#define TFA98XX_CF_CONTROLS_CFINT_LEN 1 -#define TFA98XX_CF_CONTROLS_CFINT_MAX 1 -#define TFA98XX_CF_CONTROLS_CFINT_MSK 0x10 - -/* - * cf_cgate_off - */ -#define TFA98XX_CF_CONTROLS_CFCGATE (0x1<<5) -#define TFA98XX_CF_CONTROLS_CFCGATE_POS 5 -#define TFA98XX_CF_CONTROLS_CFCGATE_LEN 1 -#define TFA98XX_CF_CONTROLS_CFCGATE_MAX 1 -#define TFA98XX_CF_CONTROLS_CFCGATE_MSK 0x20 - -/* - * cf_req_cmd - */ -#define TFA98XX_CF_CONTROLS_REQCMD (0x1<<8) -#define TFA98XX_CF_CONTROLS_REQCMD_POS 8 -#define TFA98XX_CF_CONTROLS_REQCMD_LEN 1 -#define TFA98XX_CF_CONTROLS_REQCMD_MAX 1 -#define TFA98XX_CF_CONTROLS_REQCMD_MSK 0x100 - -/* - * cf_req_reset - */ -#define TFA98XX_CF_CONTROLS_REQRST (0x1<<9) -#define TFA98XX_CF_CONTROLS_REQRST_POS 9 -#define TFA98XX_CF_CONTROLS_REQRST_LEN 1 -#define TFA98XX_CF_CONTROLS_REQRST_MAX 1 -#define TFA98XX_CF_CONTROLS_REQRST_MSK 0x200 - -/* - * cf_req_mips - */ -#define TFA98XX_CF_CONTROLS_REQMIPS (0x1<<10) -#define TFA98XX_CF_CONTROLS_REQMIPS_POS 10 -#define TFA98XX_CF_CONTROLS_REQMIPS_LEN 1 -#define TFA98XX_CF_CONTROLS_REQMIPS_MAX 1 -#define TFA98XX_CF_CONTROLS_REQMIPS_MSK 0x400 - -/* - * cf_req_mute_ready - */ -#define TFA98XX_CF_CONTROLS_REQMUTED (0x1<<11) -#define TFA98XX_CF_CONTROLS_REQMUTED_POS 11 -#define TFA98XX_CF_CONTROLS_REQMUTED_LEN 1 -#define TFA98XX_CF_CONTROLS_REQMUTED_MAX 1 -#define TFA98XX_CF_CONTROLS_REQMUTED_MSK 0x800 - -/* - * cf_req_volume_ready - */ -#define TFA98XX_CF_CONTROLS_REQVOL (0x1<<12) -#define TFA98XX_CF_CONTROLS_REQVOL_POS 12 -#define TFA98XX_CF_CONTROLS_REQVOL_LEN 1 -#define TFA98XX_CF_CONTROLS_REQVOL_MAX 1 -#define TFA98XX_CF_CONTROLS_REQVOL_MSK 0x1000 - -/* - * cf_req_damage - */ -#define TFA98XX_CF_CONTROLS_REQDMG (0x1<<13) -#define TFA98XX_CF_CONTROLS_REQDMG_POS 13 -#define TFA98XX_CF_CONTROLS_REQDMG_LEN 1 -#define TFA98XX_CF_CONTROLS_REQDMG_MAX 1 -#define TFA98XX_CF_CONTROLS_REQDMG_MSK 0x2000 - -/* - * cf_req_calibrate_ready - */ -#define TFA98XX_CF_CONTROLS_REQCAL (0x1<<14) -#define TFA98XX_CF_CONTROLS_REQCAL_POS 14 -#define TFA98XX_CF_CONTROLS_REQCAL_LEN 1 -#define TFA98XX_CF_CONTROLS_REQCAL_MAX 1 -#define TFA98XX_CF_CONTROLS_REQCAL_MSK 0x4000 - -/* - * cf_req_reserved - */ -#define TFA98XX_CF_CONTROLS_REQRSV (0x1<<15) -#define TFA98XX_CF_CONTROLS_REQRSV_POS 15 -#define TFA98XX_CF_CONTROLS_REQRSV_LEN 1 -#define TFA98XX_CF_CONTROLS_REQRSV_MAX 1 -#define TFA98XX_CF_CONTROLS_REQRSV_MSK 0x8000 - - -/* - * (0x91)-cf_mad - */ - -/* - * cf_madd - */ -#define TFA98XX_CF_MAD_MADD (0xffff<<0) -#define TFA98XX_CF_MAD_MADD_POS 0 -#define TFA98XX_CF_MAD_MADD_LEN 16 -#define TFA98XX_CF_MAD_MADD_MAX 65535 -#define TFA98XX_CF_MAD_MADD_MSK 0xffff - - -/* - * (0x92)-cf_mem - */ - -/* - * cf_mema - */ -#define TFA98XX_CF_MEM_MEMA (0xffff<<0) -#define TFA98XX_CF_MEM_MEMA_POS 0 -#define TFA98XX_CF_MEM_MEMA_LEN 16 -#define TFA98XX_CF_MEM_MEMA_MAX 65535 -#define TFA98XX_CF_MEM_MEMA_MSK 0xffff - - -/* - * (0x93)-cf_status - */ - -/* - * cf_err - */ -#define TFA98XX_CF_STATUS_ERR (0xff<<0) -#define TFA98XX_CF_STATUS_ERR_POS 0 -#define TFA98XX_CF_STATUS_ERR_LEN 8 -#define TFA98XX_CF_STATUS_ERR_MAX 255 -#define TFA98XX_CF_STATUS_ERR_MSK 0xff - -/* - * cf_ack_cmd - */ -#define TFA98XX_CF_STATUS_ACKCMD (0x1<<8) -#define TFA98XX_CF_STATUS_ACKCMD_POS 8 -#define TFA98XX_CF_STATUS_ACKCMD_LEN 1 -#define TFA98XX_CF_STATUS_ACKCMD_MAX 1 -#define TFA98XX_CF_STATUS_ACKCMD_MSK 0x100 - -/* - * cf_ack_reset - */ -#define TFA98XX_CF_STATUS_ACKRST (0x1<<9) -#define TFA98XX_CF_STATUS_ACKRST_POS 9 -#define TFA98XX_CF_STATUS_ACKRST_LEN 1 -#define TFA98XX_CF_STATUS_ACKRST_MAX 1 -#define TFA98XX_CF_STATUS_ACKRST_MSK 0x200 - -/* - * cf_ack_mips - */ -#define TFA98XX_CF_STATUS_ACKMIPS (0x1<<10) -#define TFA98XX_CF_STATUS_ACKMIPS_POS 10 -#define TFA98XX_CF_STATUS_ACKMIPS_LEN 1 -#define TFA98XX_CF_STATUS_ACKMIPS_MAX 1 -#define TFA98XX_CF_STATUS_ACKMIPS_MSK 0x400 - -/* - * cf_ack_mute_ready - */ -#define TFA98XX_CF_STATUS_ACKMUTED (0x1<<11) -#define TFA98XX_CF_STATUS_ACKMUTED_POS 11 -#define TFA98XX_CF_STATUS_ACKMUTED_LEN 1 -#define TFA98XX_CF_STATUS_ACKMUTED_MAX 1 -#define TFA98XX_CF_STATUS_ACKMUTED_MSK 0x800 - -/* - * cf_ack_volume_ready - */ -#define TFA98XX_CF_STATUS_ACKVOL (0x1<<12) -#define TFA98XX_CF_STATUS_ACKVOL_POS 12 -#define TFA98XX_CF_STATUS_ACKVOL_LEN 1 -#define TFA98XX_CF_STATUS_ACKVOL_MAX 1 -#define TFA98XX_CF_STATUS_ACKVOL_MSK 0x1000 - -/* - * cf_ack_damage - */ -#define TFA98XX_CF_STATUS_ACKDMG (0x1<<13) -#define TFA98XX_CF_STATUS_ACKDMG_POS 13 -#define TFA98XX_CF_STATUS_ACKDMG_LEN 1 -#define TFA98XX_CF_STATUS_ACKDMG_MAX 1 -#define TFA98XX_CF_STATUS_ACKDMG_MSK 0x2000 - -/* - * cf_ack_calibrate_ready - */ -#define TFA98XX_CF_STATUS_ACKCAL (0x1<<14) -#define TFA98XX_CF_STATUS_ACKCAL_POS 14 -#define TFA98XX_CF_STATUS_ACKCAL_LEN 1 -#define TFA98XX_CF_STATUS_ACKCAL_MAX 1 -#define TFA98XX_CF_STATUS_ACKCAL_MSK 0x4000 - -/* - * cf_ack_reserved - */ -#define TFA98XX_CF_STATUS_ACKRSV (0x1<<15) -#define TFA98XX_CF_STATUS_ACKRSV_POS 15 -#define TFA98XX_CF_STATUS_ACKRSV_LEN 1 -#define TFA98XX_CF_STATUS_ACKRSV_MAX 1 -#define TFA98XX_CF_STATUS_ACKRSV_MSK 0x8000 - - -/* - * (0xa1)-mtpkey2_reg - */ - -/* - * mtpkey2 - */ -#define TFA98XX_MTPKEY2_REG_MTPK (0xff<<0) -#define TFA98XX_MTPKEY2_REG_MTPK_POS 0 -#define TFA98XX_MTPKEY2_REG_MTPK_LEN 8 -#define TFA98XX_MTPKEY2_REG_MTPK_MAX 255 -#define TFA98XX_MTPKEY2_REG_MTPK_MSK 0xff - - -/* - * (0xa2)-mtp_status - */ - -/* - * key01_locked - */ -#define TFA98XX_MTP_STATUS_KEY1LOCKED (0x1<<0) -#define TFA98XX_MTP_STATUS_KEY1LOCKED_POS 0 -#define TFA98XX_MTP_STATUS_KEY1LOCKED_LEN 1 -#define TFA98XX_MTP_STATUS_KEY1LOCKED_MAX 1 -#define TFA98XX_MTP_STATUS_KEY1LOCKED_MSK 0x1 - -/* - * key02_locked - */ -#define TFA98XX_MTP_STATUS_KEY2LOCKED (0x1<<1) -#define TFA98XX_MTP_STATUS_KEY2LOCKED_POS 1 -#define TFA98XX_MTP_STATUS_KEY2LOCKED_LEN 1 -#define TFA98XX_MTP_STATUS_KEY2LOCKED_MAX 1 -#define TFA98XX_MTP_STATUS_KEY2LOCKED_MSK 0x2 - - -/* - * (0xa3)-KEY_protected_mtp_control - */ - -/* - * auto_copy_iic_to_mtp - */ -#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP (0x1<<6) -#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_POS 6 -#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_LEN 1 -#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_MAX 1 -#define TFA98XX_KEY_PROTECTED_MTP_CONTROL_CIMTP_MSK 0x40 - - -/* - * (0xa5)-mtp_data_out_msb - */ - -/* - * mtp_man_data_out_msb - */ -#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB (0xffff<<0) -#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_POS 0 -#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_LEN 16 -#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_MAX 65535 -#define TFA98XX_MTP_DATA_OUT_MSB_MTPRDMSB_MSK 0xffff - - -/* - * (0xa6)-mtp_data_out_lsb - */ - -/* - * mtp_man_data_out_lsb - */ -#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB (0xffff<<0) -#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_POS 0 -#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_LEN 16 -#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_MAX 65535 -#define TFA98XX_MTP_DATA_OUT_LSB_MTPRDLSB_MSK 0xffff - - -/* - * (0xb1)-temp_sensor_config - */ - -/* - * ext_temp - */ -#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS (0x1ff<<0) -#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_POS 0 -#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_LEN 9 -#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_MAX 511 -#define TFA98XX_TEMP_SENSOR_CONFIG_EXTTS_MSK 0x1ff - -/* - * ext_temp_sel - */ -#define TFA98XX_TEMP_SENSOR_CONFIG_TROS (0x1<<9) -#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_POS 9 -#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_LEN 1 -#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_MAX 1 -#define TFA98XX_TEMP_SENSOR_CONFIG_TROS_MSK 0x200 - - -/* - * (0xf0)-KEY2_protected_MTP0 - */ - -/* - * calibration_onetime - */ -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC (0x1<<0) -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_POS 0 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_LEN 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MAX 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MSK 0x1 - -/* - * calibr_ron_done - */ -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX (0x1<<1) -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_POS 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_LEN 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MAX 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK 0x2 - -/* - * calibr_dcdc_api_calibrate - */ -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI (0x1<<2) -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_POS 2 -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_LEN 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_MAX 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCAPI_MSK 0x4 - -/* - * calibr_dcdc_delta_sign - */ -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB (0x1<<3) -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_POS 3 -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_LEN 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_MAX 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_DCMCCSB_MSK 0x8 - -/* - * calibr_dcdc_delta - */ -#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF (0x7<<4) -#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_POS 4 -#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_LEN 3 -#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_MAX 7 -#define TFA98XX_KEY2_PROTECTED_MTP0_USERDEF_MSK 0x70 - - -/* - * (0xf4)-KEY1_protected_MTP4 - */ - - -/* - * (0xf5)-KEY1_protected_MTP5 - */ - -#endif /* TFA98XX_GENREGS_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_parameters.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_parameters.h deleted file mode 100644 index 26a97ec52335..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_parameters.h +++ /dev/null @@ -1,736 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/* - * tfa98xx_parameters.h - * - * Created on: Jul 22, 2013 - * Author: NLV02095 - */ - -#ifndef TFA98XXPARAMETERS_H_ -#define TFA98XXPARAMETERS_H_ - -//#include "config.h" -// workaround for Visual Studio: -// fatal error C1083: Cannot open include file: 'config.h': No such file or directory -#ifdef __KERNEL__ -#include -#else -#include -#endif - -#include "tfa_service.h" - -#if (defined(WIN32) || defined(_X64)) -/* These warnings are disabled because it is only given by Windows and there is no easy fix */ -#pragma warning(disable:4200) -#pragma warning(disable:4214) -#endif - -/* - * profiles & volumesteps - * - */ -#define TFA_MAX_PROFILES (64) -#define TFA_MAX_VSTEPS (64) -#define TFA_MAX_VSTEP_MSG_MARKER (100) /* This marker is used to indicate if all msgs need to be written to the device */ -#define TFA_MAX_MSGS (10) - -// the pack pragma is required to make that the size in memory -// matches the actual variable lenghts -// This is to assure that the binary files can be transported between -// different platforms. -#pragma pack(push, 1) - -/* - * typedef for 24 bit value using 3 bytes - */ -typedef struct uint24 { - uint8_t b[3]; -} uint24_t; -/* - * the generic header - * all char types are in ASCII - */ -typedef struct TfaHeader { - uint16_t id; - char version[2]; // "V_" : V=version, vv=subversion - char subversion[2]; // "vv" : vv=subversion - uint16_t size; // data size in bytes following CRC - uint32_t CRC; // 32-bits CRC for following data - char customer[8]; // “name of customer†- char application[8]; // “application name†- char type[8]; // “application type name†-} TfaHeader_t; - -typedef enum TfaSamplerate { - fs_8k, // 8kHz - fs_11k025, // 11.025kHz - fs_12k, // 12kHz - fs_16k, // 16kHz - fs_22k05, // 22.05kHz - fs_24k, // 24kHz - fs_32k, // 32kHz - fs_44k1, // 44.1kHz - fs_48k, // 48kHz - fs_96k, // 96kHz - fs_count // Should always be last item. -} TfaSamplerate_t; - -// Keep in sync with TfaSamplerate_t ! -static const int TfaSamplerateHz[fs_count] = { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 96000 }; - - -/* - * coolflux direct memory access - */ -typedef struct TfaDspMem { - uint8_t type; /* 0--3: p, x, y, iomem */ - uint16_t address; /* target address */ - uint8_t size; /* data size in words */ - int words[]; /* payload in signed 32bit integer (two's complement) */ -} TfaDspMem_t; - -/* - * the biquad coefficients for the API together with index in filter - * the biquad_index is the actual index in the equalizer +1 - */ -#define BIQUAD_COEFF_SIZE 6 - -/* -* Output fixed point coeffs structure -*/ -typedef struct { - int a2; - int a1; - int b2; - int b1; - int b0; -} TfaBiquad_t; - -typedef struct TfaBiquadOld { - uint8_t bytes[BIQUAD_COEFF_SIZE*sizeof(uint24_t)]; -} TfaBiquadOld_t; - -typedef struct TfaBiquadFloat { - float headroom; - float b0; - float b1; - float b2; - float a1; - float a2; -} TfaBiquadFloat_t; - -/* -* EQ filter definitions -* Note: This is not in line with smartstudio (JV: 12/12/2016) -*/ -typedef enum TfaFilterType { - fCustom, //User defined biquad coefficients - fFlat, //Vary only gain - fLowpass, //2nd order Butterworth low pass - fHighpass, //2nd order Butterworth high pass - fLowshelf, - fHighshelf, - fNotch, - fPeak, - fBandpass, - f1stLP, - f1stHP, - fElliptic -} TfaFilterType_t; - -/* - * filter parameters for biquad (re-)calculation - */ -typedef struct TfaFilter { - TfaBiquadOld_t biquad; - uint8_t enabled; - uint8_t type; // (== enum FilterTypes, assure 8bits length) - float frequency; - float Q; - float gain; -} TfaFilter_t ; //8 * float + int32 + byte == 37 - -/* - * biquad params for calculation -*/ - -#define TFA_BQ_EQ_INDEX 0 -#define TFA_BQ_ANTI_ALIAS_INDEX 10 -#define TFA_BQ_INTEGRATOR_INDEX 13 - -/* -* Loudspeaker Compensation filter definitions -*/ -typedef struct TfaLsCompensationFilter { - TfaBiquad_t biquad; - uint8_t lsCompOn; // Loudspeaker compensation on/off; when 'off', the DSP code doesn't apply the bwExt => bwExtOn GUI flag should be gray to avoid confusion - uint8_t bwExtOn; // Bandwidth extension on/off - float fRes; // [Hz] speaker resonance frequency - float Qt; // Speaker resonance Q-factor - float fBwExt; // [Hz] Band width extension frequency - float samplingFreq;// [Hz] Sampling frequency -} TfaLsCompensationFilter_t; - -/* -* Anti Aliasing Elliptic filter definitions -*/ -typedef struct TfaAntiAliasFilter { - TfaBiquad_t biquad; /**< Output results fixed point coeffs */ - uint8_t enabled; - float cutOffFreq; // cut off frequency - float samplingFreq; // sampling frequency - float rippleDb; // range: [0.1 3.0] - float rolloff; // range: [-1.0 1.0] -} TfaAntiAliasFilter_t; - -/** -* Integrator filter input definitions -*/ -typedef struct TfaIntegratorFilter { - TfaBiquad_t biquad; /**< Output results fixed point coeffs */ - uint8_t type; /**< Butterworth filter type: high or low pass */ - float cutOffFreq; /**< cut off frequency in Hertz; range: [100.0 4000.0] */ - float samplingFreq; /**< sampling frequency in Hertz */ - float leakage; /**< leakage factor; range [0.0 1.0] */ -} TfaIntegratorFilter_t; - - -typedef struct TfaEqFilter { - TfaBiquad_t biquad; - uint8_t enabled; - uint8_t type; // (== enum FilterTypes, assure 8bits length) - float cutOffFreq; // cut off frequency, // range: [100.0 4000.0] - float samplingFreq; // sampling frequency - float Q; // range: [0.5 5.0] - float gainDb; // range: [-10.0 10.0] -} TfaEqFilter_t ; //8 * float + int32 + byte == 37 - -typedef struct TfaContAntiAlias { - int8_t index; /**< index determines destination type; anti-alias, integrator,eq */ - uint8_t type; - float cutOffFreq; // cut off frequency - float samplingFreq; - float rippleDb; // integrator leakage - float rolloff; - uint8_t bytes[5*3]; // payload 5*24buts coeffs -} TfaContAntiAlias_t; - -typedef struct TfaContIntegrator { - int8_t index; /**< index determines destination type; anti-alias, integrator,eq */ - uint8_t type; - float cutOffFreq; // cut off frequency - float samplingFreq; - float leakage; // integrator leakage - float reserved; - uint8_t bytes[5*3]; // payload 5*24buts coeffs -} TfaContIntegrator_t; - -typedef struct TfaContEq { - int8_t index; - uint8_t type; // (== enum FilterTypes, assure 8bits length) - float cutOffFreq; // cut off frequency, // range: [100.0 4000.0] - float samplingFreq; // sampling frequency - float Q; // range: [0.5 5.0] - float gainDb; // range: [-10.0 10.0] - uint8_t bytes[5*3]; // payload 5*24buts coeffs -} TfaContEq_t ; //8 * float + int32 + byte == 37 - -typedef union TfaContBiquad { - TfaContEq_t eq; - TfaContAntiAlias_t aa; - TfaContIntegrator_t in; -} TfaContBiquad_t; - -#define TFA_BQ_EQ_INDEX 0 -#define TFA_BQ_ANTI_ALIAS_INDEX 10 -#define TFA_BQ_INTEGRATOR_INDEX 13 -#define TFA98XX_MAX_EQ 10 - -typedef struct TfaEqualizer { - TfaFilter_t filter[TFA98XX_MAX_EQ]; -} TfaEqualizer_t; - -/* - * files - */ -#define HDR(c1, c2) (c2<<8|c1) // little endian -typedef enum TfaHeaderType { - paramsHdr = HDR('P', 'M'), /* containter file */ - volstepHdr = HDR('V', 'P'), - patchHdr = HDR('P', 'A'), - speakerHdr = HDR('S', 'P'), - presetHdr = HDR('P', 'R'), - configHdr = HDR('C', 'O'), - equalizerHdr = HDR('E', 'Q'), - drcHdr = HDR('D', 'R'), - msgHdr = HDR('M', 'G'), /* generic message */ - infoHdr = HDR('I', 'N') -} TfaHeaderType_t; - -/* - * equalizer file - */ -#define TFA_EQ_VERSION '1' -#define TFA_EQ_SUBVERSION "00" -typedef struct TfaEqualizerFile { - TfaHeader_t hdr; - uint8_t samplerate; // ==enum samplerates, assure 8 bits - TfaFilter_t filter[TFA98XX_MAX_EQ];// note: API index counts from 1..10 -} TfaEqualizerFile_t; - -/* - * patch file - */ -#define TFA_PA_VERSION '1' -#define TFA_PA_SUBVERSION "00" -typedef struct TfaPatchFile { - TfaHeader_t hdr; - uint8_t data[]; -} TfaPatch_t; - -/* - * generic message file - * - the payload of this file includes the opcode and is send straight to the DSP - */ -#define TFA_MG_VERSION '3' -#define TFA_MG_SUBVERSION "00" -typedef struct TfaMsgFile { - TfaHeader_t hdr; - uint8_t data[]; -} TfaMsgFile_t; - -/* - * NOTE the tfa98xx API defines the enum Tfa98xx_config_type that defines - * the subtypes as decribes below. - * tfa98xx_dsp_config_parameter_type() can be used to get the - * supported type for the active device.. - */ -/* - * config file V1 sub 1 - */ -#define TFA_CO_VERSION '1' -#define TFA_CO3_VERSION '3' -#define TFA_CO_SUBVERSION1 "01" -typedef struct TfaConfigS1File { - TfaHeader_t hdr; - uint8_t data[55*3]; -} TfaConfigS1_t; - -/* - * config file V1 sub 2 - */ -#define TFA_CO_SUBVERSION2 "02" -typedef struct TfaConfigS2File { - TfaHeader_t hdr; - uint8_t data[67*3]; -} TfaConfigS2_t; - -/* - * config file V1 sub 3 - */ -#define TFA_CO_SUBVERSION3 "03" -typedef struct TfaConfigS3File { - TfaHeader_t hdr; - uint8_t data[67*3]; -} TfaConfigS3_t; - -/* - * config file V1.0 - */ -#define TFA_CO_SUBVERSION "00" -typedef struct TfaConfigFile { - TfaHeader_t hdr; - uint8_t data[]; -} TfaConfig_t; - -/* - * preset file - */ -#define TFA_PR_VERSION '1' -#define TFA_PR_SUBVERSION "00" -typedef struct TfaPresetFile { - TfaHeader_t hdr; - uint8_t data[]; -} TfaPreset_t; - -/* - * drc file - */ -#define TFA_DR_VERSION '1' -#define TFA_DR_SUBVERSION "00" -typedef struct TfaDrcFile { - TfaHeader_t hdr; - uint8_t data[]; -} TfaDrc_t; - -/* - * drc file - * for tfa 2 there is also a xml-version - */ -#define TFA_DR3_VERSION '3' -#define TFA_DR3_SUBVERSION "00" -typedef struct TfaDrcFile2 { - TfaHeader_t hdr; - uint8_t version[3]; - uint8_t data[]; -} TfaDrc2_t; - -/* - * volume step structures - */ -// VP01 -#define TFA_VP1_VERSION '1' -#define TFA_VP1_SUBVERSION "01" -typedef struct TfaVolumeStep1 { - float attenuation; // IEEE single float - uint8_t preset[TFA98XX_PRESET_LENGTH]; -} TfaVolumeStep1_t; - -// VP02 -#define TFA_VP2_VERSION '2' -#define TFA_VP2_SUBVERSION "01" -typedef struct TfaVolumeStep2 { - float attenuation; // IEEE single float - uint8_t preset[TFA98XX_PRESET_LENGTH]; - TfaFilter_t filter[TFA98XX_MAX_EQ];// note: API index counts from 1..10 -} TfaVolumeStep2_t; - -/* - * volumestep file - */ -#define TFA_VP_VERSION '1' -#define TFA_VP_SUBVERSION "00" -typedef struct TfaVolumeStepFile { - TfaHeader_t hdr; - uint8_t vsteps; // can also be calulated from size+type - uint8_t samplerate; // ==enum samplerates, assure 8 bits - uint8_t payload; //start of variable length contents:N times volsteps -} TfaVolumeStepFile_t; -/* - * volumestep2 file - */ -typedef struct TfaVolumeStep2File { - TfaHeader_t hdr; - uint8_t vsteps; // can also be calulated from size+type - uint8_t samplerate; // ==enum samplerates, assure 8 bits - TfaVolumeStep2_t vstep[]; //start of variable length contents:N times volsteps -} TfaVolumeStep2File_t; - -/* - * volumestepMax2 file - */ -typedef struct TfaVolumeStepMax2File { - TfaHeader_t hdr; - uint8_t version[3]; - uint8_t NrOfVsteps; - uint8_t vstepsBin[]; -} TfaVolumeStepMax2File_t; - -/* - * volumestepMax2 file - * This volumestep should ONLY be used for the use of bin2hdr! - * This can only be used to find the messagetype of the vstep (without header) - */ -typedef struct TfaVolumeStepMax2_1File { - uint8_t version[3]; - uint8_t NrOfVsteps; - uint8_t vstepsBin[]; -} TfaVolumeStepMax2_1File_t; - -struct TfaVolumeStepRegisterInfo { - uint8_t NrOfRegisters; - uint16_t registerInfo[]; -}; - -struct TfaVolumeStepMessageInfo { - uint8_t NrOfMessages; - uint8_t MessageType; - uint24_t MessageLength; - uint8_t CmdId[3]; - uint8_t ParameterData[]; -}; -/**************************old v2 *************************************************/ - -/* - * subv 00 volumestep file - */ -typedef struct TfaOldHeader { - uint16_t id; - char version[2]; // "V_" : V=version, vv=subversion - char subversion[2]; // "vv" : vv=subversion - uint16_t size; // data size in bytes following CRC - uint32_t CRC; // 32-bits CRC for following data -} TfaOldHeader_t; - -typedef struct TfaOldFilter { - double bq[5]; - int32_t type; - double frequency; - double Q; - double gain; - uint8_t enabled; -} TfaOldFilter_t; - -typedef struct TfaOldVolumeStep2 { - float attenuation; // IEEE single float - uint8_t preset[TFA98XX_PRESET_LENGTH]; - TfaOldFilter_t eq[10]; -} TfaOldVolumeStep2_t; - -typedef struct TfaOldVolumeStepFile { - TfaOldHeader_t hdr; - TfaOldVolumeStep2_t step[]; -} TfaOldVolumeStep2File_t; -/**************************end old v2 *************************************************/ - -/* - * speaker file header - */ -struct TfaSpkHeader { - struct TfaHeader hdr; - char name[8]; // speaker nick name (e.g. “dumboâ€) - char vendor[16]; - char type[8]; - // dimensions (mm) - uint8_t height; - uint8_t width; - uint8_t depth; - uint16_t ohm; -}; - -/* - * speaker file - */ -#define TFA_SP_VERSION '1' -#define TFA_SP_SUBVERSION "00" -typedef struct TfaSpeakerFile { - TfaHeader_t hdr; - char name[8]; // speaker nick name (e.g. “dumboâ€) - char vendor[16]; - char type[8]; - // dimensions (mm) - uint8_t height; - uint8_t width; - uint8_t depth; - uint8_t ohm_primary; - uint8_t ohm_secondary; - uint8_t data[]; //payload TFA98XX_SPEAKERPARAMETER_LENGTH -} TfaSpeakerFile_t; - -#define TFA_VP3_VERSION '3' -#define TFA_VP3_SUBVERSION "00" - -struct TfaFWVer { - uint8_t Major; - uint8_t minor; - uint8_t minor_update:6; - uint8_t Update:2; -}; - -struct TfaFWMsg { - struct TfaFWVer fwVersion; - struct TfaMsg payload; -}; - -typedef struct TfaLiveData { - char name[25]; - char addrs[25]; - int tracker; - int scalefactor; -} TfaLiveData_t; - -#define TFA_SP3_VERSION '3' -#define TFA_SP3_SUBVERSION "00" -struct TfaSpeakerFileMax2 { - TfaHeader_t hdr; - char name[8]; // speaker nick name (e.g. “dumboâ€) - char vendor[16]; - char type[8]; - // dimensions (mm) - uint8_t height; - uint8_t width; - uint8_t depth; - uint8_t ohm_primary; - uint8_t ohm_secondary; - struct TfaFWMsg FWmsg; //payload including FW ver and Cmd ID -}; - -/* - * parameter container file - */ -/* - * descriptors - * Note 1: append new DescriptorType at the end - * Note 2: add new descriptors to dsc_name[] in tfaContUtil.c - */ -typedef enum TfaDescriptorType { - dscDevice, // device list - dscProfile, // profile list - dscRegister, // register patch - dscString, // ascii, zero terminated string - dscFile, // filename + file contents - dscPatch, // patch file - dscMarker, // marker to indicate end of a list - dscMode, - dscSetInputSelect, - dscSetOutputSelect, - dscSetProgramConfig, - dscSetLagW, - dscSetGains, - dscSetvBatFactors, - dscSetSensesCal, - dscSetSensesDelay, - dscBitfield, - dscDefault, // used to reset bitfields to there default values - dscLiveData, - dscLiveDataString, - dscGroup, - dscCmd, - dscSetMBDrc, - dscFilter, - dscNoInit, - dscFeatures, - dscCfMem, // coolflux memory x,y,io - dscSetFwkUseCase, - dscSetVddpConfig, - dsc_last // trailer -} TfaDescriptorType_t; - -#define TFA_BITFIELDDSCMSK 0x7fffffff -typedef struct TfaDescPtr { - uint32_t offset:24; - uint32_t type:8; // (== enum TfaDescriptorType, assure 8bits length) -} TfaDescPtr_t; - -/* - * generic file descriptor - */ -typedef struct TfaFileDsc { - TfaDescPtr_t name; - uint32_t size; // file data length in bytes - uint8_t data[]; //payload -} TfaFileDsc_t; - - -/* - * device descriptor list - */ -typedef struct TfaDeviceList { - uint8_t length; // nr of items in the list - uint8_t bus; // bus - uint8_t dev; // device - uint8_t func; // subfunction or subdevice - uint32_t devid; // device hw fw id - TfaDescPtr_t name; // device name - TfaDescPtr_t list[]; // items list -} TfaDeviceList_t; - -/* - * profile descriptor list - */ -typedef struct TfaProfileList { - uint32_t length:8; // nr of items in the list + name - uint32_t group:8; // profile group number - uint32_t ID:16; // profile ID - TfaDescPtr_t name; // profile name - TfaDescPtr_t list[]; // items list (lenght-1 items) -} TfaProfileList_t; -#define TFA_PROFID 0x1234 - -/* - * livedata descriptor list - */ -typedef struct TfaLiveDataList { - uint32_t length:8; // nr of items in the list - uint32_t ID:24; // profile ID - TfaDescPtr_t name; // livedata name - TfaDescPtr_t list[]; // items list -} TfaLiveDataList_t; -#define TFA_LIVEDATAID 0x5678 - -/* - * Bitfield descriptor - */ -typedef struct TfaBitfield { - uint16_t value; - uint16_t field; // ==datasheet defined, 16 bits -} TfaBitfield_t; - -/* - * Bitfield enumuration bits descriptor - */ -typedef struct TfaBfEnum { - unsigned int len:4; // this is the actual length-1 - unsigned int pos:4; - unsigned int address:8; -} TfaBfEnum_t; - -/* - * Register patch descriptor - */ -typedef struct TfaRegpatch { - uint8_t address; // register address - uint16_t value; // value to write - uint16_t mask; // mask of bits to write -} TfaRegpatch_t; - -/* - * Mode descriptor - */ -typedef struct TfaUseCase { - int value; // mode value, maps to enum Tfa98xx_Mode -} TfaMode_t; - -/* - * NoInit descriptor - */ -typedef struct TfaNoInit { - uint8_t value; // noInit value -} TfaNoInit_t; - -/* - * Features descriptor - */ -typedef struct TfaFeatures { - uint16_t value[3]; // features value -} TfaFeatures_t; - - -/* - * the container file - * - the size field is 32bits long (generic=16) - * - all char types are in ASCII - */ -#define TFA_PM_VERSION '1' -#define TFA_PM3_VERSION '3' -#define TFA_PM_SUBVERSION '1' -typedef struct TfaContainer { - char id[2]; // "XX" : XX=type - char version[2]; // "V_" : V=version, vv=subversion - char subversion[2]; // "vv" : vv=subversion - uint32_t size; // data size in bytes following CRC - uint32_t CRC; // 32-bits CRC for following data - uint16_t rev; // "extra chars for rev nr" - char customer[8]; // “name of customer†- char application[8]; // “application name†- char type[8]; // “application type name†- uint16_t ndev; // "nr of device lists" - uint16_t nprof; // "nr of profile lists" - uint16_t nliveData; // "nr of livedata lists" - TfaDescPtr_t index[]; // start of item index table -} TfaContainer_t; - -#pragma pack(pop) - -#endif /* TFA98XXPARAMETERS_H_ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_tfafieldnames.h deleted file mode 100644 index 0bac6717ecc0..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa98xx_tfafieldnames.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -typedef struct TfaBfName { - unsigned short bfEnum; - char *bfName; -} tfaBfName_t; - -typedef struct TfaIrqName { - unsigned short irqEnum; - char *irqName; -} tfaIrqName_t; - -#include "tfa1_tfafieldnames.h" -#include "tfa2_tfafieldnames_N1C.h" -/* diffs for specific devices */ -#include "tfa9887_tfafieldnames.h" -#include "tfa9890_tfafieldnames.h" -#include "tfa9891_tfafieldnames.h" -#include "tfa9872_tfafieldnames.h" -#include "tfa9912_tfafieldnames.h" -#include "tfa9896_tfafieldnames.h" -#include "tfa9873_tfafieldnames.h" -#include "tfa9873_tfafieldnames_B0.h" -#include "tfa9874_tfafieldnames.h" -#include "tfa9878_tfafieldnames.h" -#include "tfa9894_tfafieldnames.h" -#include "tfa9894_tfafieldnames_N2.h" - -/* missing 'common' defs break the build but unused in TFA1 context */ -#define TFA1_BF_AMPINSEL -1 -#define TFA1_BF_MANSCONF -1 -#define TFA1_BF_MANCOLD -1 -#define TFA1_BF_INTSMUTE -1 -#define TFA1_BF_CFSMR -1 -#define TFA1_BF_CFSML -1 -#define TFA1_BF_DCMCCAPI -1 -#define TFA1_BF_DCMCCSB -1 -#define TFA1_BF_USERDEF -1 -#define TFA1_BF_MANSTATE -1 -#define TFA1_BF_MANOPER -1 -#define TFA1_BF_REFCKSEL -1 -#define TFA1_BF_VOLSEC -1 -#define TFA1_BF_FRACTDEL -1 -#define TFA1_BF_ACKDMG -1 -#define TFA1_BF_SSRIGHTE -1 -#define TFA1_BF_SSLEFTE -1 -#define TFA1_BF_R25CL -1 -#define TFA1_BF_R25CR -1 -#define TFA1_BF_SWPROFIL 0x8045 /*!< profile save */ -#define TFA1_BF_SWVSTEP 0x80a5 /*!< vstep save */ - -#define TFA1_BF_TDMNBCK -1 -#define TFA1_BF_TDMSSIZE -1 - -/* missing 'common' defs break the build */ -#define TFA2_BF_CFSM -1 - - -/* MTP access uses registers - * defs are derived from corresponding bitfield names as used in the BF macros - */ -#define MTPKEY2 MTPK /* unlock key2 MTPK */ -#define MTP0 MTPOTC /* MTP data */ -#define MTP_CONTROL CIMTP /* copy i2c to mtp */ - -/* interrupt enable register uses HW name in TFA2 */ -#define TFA2_BF_INTENVDDS TFA2_BF_IEVDDS - - -/* TFA9891 specific bit field names */ -#define TFA1_BF_SAAMGAIN 0x2202 -#define TFA2_BF_SAAMGAIN -1 - -/* TFA9872 specific bit field names */ -#define TFA2_BF_IELP0 TFA9872_BF_IELP0 -#define TFA2_BF_ISTLP0 TFA9872_BF_ISTLP0 -#define TFA2_BF_IPOLP0 TFA9872_BF_IPOLP0 -#define TFA2_BF_IELP1 TFA9872_BF_IELP1 -#define TFA2_BF_ISTLP1 TFA9872_BF_ISTLP1 -#define TFA2_BF_IPOLP1 TFA9872_BF_IPOLP1 -#define TFA2_BF_LP0 TFA9872_BF_LP0 -#define TFA2_BF_LP1 TFA9872_BF_LP1 -#define TFA2_BF_R25C TFA9872_BF_R25C -#define TFA2_BF_SAMMODE TFA9872_BF_SAMMODE - -/* interrupt bit field names of TFA2 and TFA1 do not match */ -#define TFA1_BF_IEACS TFA1_BF_INTENACS -#define TFA1_BF_IPOACS TFA1_BF_INTPOLACS -#define TFA1_BF_ISTACS TFA1_BF_INTOACS -#define TFA1_BF_ISTVDDS TFA1_BF_INTOVDDS -#define TFA1_BF_ICLVDDS TFA1_BF_INTIVDDS -#define TFA1_BF_IPOVDDS TFA1_BF_INTPOLVDDS -#define TFA1_BF_IENOCLK TFA1_BF_INTENNOCLK -#define TFA1_BF_ISTNOCLK TFA1_BF_INTONOCLK -#define TFA1_BF_IPONOCLK TFA1_BF_INTPOLNOCLK - -/* interrupt bit fields not available on TFA1 */ -#define TFA1_BF_IECLKOOR -1 -#define TFA1_BF_ISTCLKOOR -1 -#define TFA1_BF_IEMWSRC -1 -#define TFA1_BF_ISTMWSRC -1 -#define TFA1_BF_IPOMWSRC -1 -#define TFA1_BF_IEMWSMU -1 -#define TFA1_BF_ISTMWSMU -1 -#define TFA1_BF_IPOMWSMU -1 -#define TFA1_BF_IEMWCFC -1 -#define TFA1_BF_ISTMWCFC -1 -#define TFA1_BF_IPOMWCFC -1 -#define TFA1_BF_CLKOOR -1 -#define TFA1_BF_MANWAIT1 -1 -#define TFA1_BF_MANWAIT2 -1 -#define TFA1_BF_MANMUTE -1 -#define TFA1_BF_IPCLKOOR -1 -#define TFA1_BF_ICLCLKOOR -1 -#define TFA1_BF_IPOSWS -1 -#define TFA1_BF_IESWS -1 -#define TFA1_BF_ISTSWS -1 -#define TFA1_BF_IESPKS -1 -#define TFA1_BF_ISTSPKS -1 -#define TFA1_BF_IPOSPKS -1 -#define TFA1_BF_IECLKS -1 -#define TFA1_BF_ISTCLKS -1 -#define TFA1_BF_IPOCLKS -1 -#define TFA1_BF_IEAMPS -1 -#define TFA1_BF_ISTAMPS -1 -#define TFA1_BF_IPOAMPS -1 -#define TFA1_BF_IELP0 -1 -#define TFA1_BF_ISTLP0 -1 -#define TFA1_BF_IPOLP0 -1 -#define TFA1_BF_IELP1 -1 -#define TFA1_BF_ISTLP1 -1 -#define TFA1_BF_IPOLP1 -1 -#define TFA1_BF_LP0 -1 -#define TFA1_BF_LP1 -1 -#define TFA1_BF_R25C -1 -#define TFA1_BF_SAMMODE -1 - -/* TDM STATUS fields not available on TFA1 */ -#define TFA1_BF_TDMLUTER -1 -#define TFA1_BF_TDMERR -1 diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_device_genregs.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_device_genregs.h deleted file mode 100644 index 6bf315c06eaa..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_device_genregs.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9912_device_genregs.h - * This file was generated automatically on 04/19/17 at 12:26:46. - * Source file: TFA9912_N1A_I2C_regmap_V1.39.xlsx - */ - -#ifndef _TFA9912_DEVICE_GENREGS_H -#define _TFA9912_DEVICE_GENREGS_H - - -#define TFA99XX_SYS_CONTROL0 0x00 -#define TFA99XX_SYS_CONTROL1 0x01 -#define TFA99XX_SYS_CONTROL2 0x02 -#define TFA99XX_DEVICE_REVISION 0x03 -#define TFA99XX_CLOCK_CONTROL 0x04 -#define TFA99XX_CLOCK_GATING_CONTROL 0x05 -#define TFA99XX_HW_PATH_CFG 0x06 -#define TFA99XX_CLKCHK_TH 0x07 -#define TFA99XX_AMP_CTRL 0x08 -#define TFA99XX_SIDE_TONE_CONFIG 0x0d -#define TFA99XX_CTRL_DIGTOANA_REG 0x0e -#define TFA99XX_STATUS_FLAGS0 0x10 -#define TFA99XX_STATUS_FLAGS1 0x11 -#define TFA99XX_STATUS_FLAGS3 0x13 -#define TFA99XX_STATUS_FLAGS4 0x14 -#define TFA99XX_BATTERY_VOLTAGE 0x15 -#define TFA99XX_TEMPERATURE 0x16 -#define TFA99XX_VDDP_VOLTAGE 0x17 -#define TFA99XX_TDM_CONFIG0 0x20 -#define TFA99XX_TDM_CONFIG1 0x21 -#define TFA99XX_TDM_CONFIG2 0x22 -#define TFA99XX_TDM_CONFIG3 0x23 -#define TFA99XX_TDM_CONFIG4 0x24 -#define TFA99XX_TDM_CONFIG5 0x25 -#define TFA99XX_TDM_CONFIG6 0x26 -#define TFA99XX_TDM_CONFIG7 0x27 -#define TFA99XX_TDM_CONFIG8 0x28 -#define TFA99XX_TDM_CONFIG9 0x29 -#define TFA99XX_PDM_CONFIG0 0x31 -#define TFA99XX_PDM_CONFIG1 0x32 -#define TFA99XX_INTERRUPT_OUT_REG1 0x40 -#define TFA99XX_INTERRUPT_OUT_REG2 0x41 -#define TFA99XX_INTERRUPT_OUT_REG3 0x42 -#define TFA99XX_INTERRUPT_IN_REG1 0x44 -#define TFA99XX_INTERRUPT_IN_REG2 0x45 -#define TFA99XX_INTERRUPT_IN_REG3 0x46 -#define TFA99XX_INTERRUPT_ENABLE_REG1 0x48 -#define TFA99XX_INTERRUPT_ENABLE_REG2 0x49 -#define TFA99XX_INTERRUPT_ENABLE_REG3 0x4a -#define TFA99XX_STATUS_POLARITY_REG1 0x4c -#define TFA99XX_STATUS_POLARITY_REG2 0x4d -#define TFA99XX_STATUS_POLARITY_REG3 0x4e -#define TFA99XX_BAT_PROT_CONFIG 0x50 -#define TFA99XX_AUDIO_CONTROL 0x51 -#define TFA99XX_AMPLIFIER_CONFIG 0x52 -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL0 0x53 -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL1 0x54 -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL2 0x55 -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL4 0x57 -#define TFA99XX_KEY1_PROTECTED_PWM_CONFIG 0x58 -#define TFA99XX_CF_TAP_STATUS_0 0x5c -#define TFA99XX_CF_TAP_STATUS_1 0x5d -#define TFA99XX_TAP_CONTROL 0x5f -#define TFA99XX_PGA_CONTROL0 0x60 -#define TFA99XX_GAIN_ATT 0x61 -#define TFA99XX_LOW_NOISE_GAIN1 0x62 -#define TFA99XX_LOW_NOISE_GAIN2 0x63 -#define TFA99XX_MODE1_DETECTOR1 0x64 -#define TFA99XX_MODE1_DETECTOR2 0x65 -#define TFA99XX_BST_PFM_CTRL 0x66 -#define TFA99XX_LOW_POWER_CTRL 0x67 -#define TFA99XX_TDM_SOURCE_CTRL 0x68 -#define TFA99XX_SAM_CTRL 0x69 -#define TFA99XX_RST_MIN_VBAT_CTRL 0x6a -#define TFA99XX_SYS_CONTROL3 0x6b -#define TFA99XX_STATUS_FLAGS5 0x6e -#define TFA99XX_DCDC_CONTROL0 0x70 -#define TFA99XX_KEY1_PROTECTED_DCDC_CONTROL3 0x73 -#define TFA99XX_DCDC_CONTROL4 0x74 -#define TFA99XX_DCDC_CONTROL5 0x75 -#define TFA99XX_DCDC_CONTROL6 0x76 -#define TFA99XX_KEY2_PROTECTED_DCDC_CONTROL7 0x77 -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG0 0x80 -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG2 0x82 -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG3 0x83 -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG4 0x84 -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG5 0x85 -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG7 0x87 -#define TFA99XX_KEY2_PROTECTED_VOLSENSE_CONFIG 0x88 -#define TFA99XX_CURSENSE_CONFIG 0x89 -#define TFA99XX_CF_CONTROLS 0x90 -#define TFA99XX_CF_MAD 0x91 -#define TFA99XX_CF_MEM 0x92 -#define TFA99XX_CF_STATUS 0x93 -#define TFA99XX_MTPKEY1_REG 0xa0 -#define TFA99XX_MTPKEY2_REG 0xa1 -#define TFA99XX_MTP_STATUS 0xa2 -#define TFA99XX_KEY_PROTECTED_MTP_CONTROL 0xa3 -#define TFA99XX_KEY1_PROTECTED_FAIM_CONTROL 0xa4 -#define TFA99XX_MTP_DATA_OUT_MSB 0xa5 -#define TFA99XX_MTP_DATA_OUT_LSB 0xa6 -#define TFA99XX_KEY1_PROTECTED_PROTECTION_CONFIG 0xb0 -#define TFA99XX_TEMP_SENSOR_CONFIG 0xb1 -#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL0 0xc0 -#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL1 0xc1 -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG0 0xc3 -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG1 0xc4 -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG2 0xc5 -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG3 0xc6 -#define TFA99XX_KEY1_PROTECTED_DIGIMUX_CONTROL1 0xc8 -#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL0 0xca -#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL1 0xcb -#define TFA99XX_KEY1_PROTECTED_PLL_TEST0 0xcd -#define TFA99XX_KEY1_PROTECTED_PLL_TEST3 0xd0 -#define TFA99XX_KEY1_PROTECTED_TSIG_CONTROL1 0xd2 -#define TFA99XX_KEY1_PROTECTED_ADC10_CONTROL 0xd3 -#define TFA99XX_KEY1_PROTECTED_ADC10_DATA 0xd4 -#define TFA99XX_KEY2_PROTECTED_CTRL_DIGTOANA 0xd5 -#define TFA99XX_KEY1_PROTECTED_CLKDIV_CONTROL 0xd6 -#define TFA99XX_KEY1_PROTECTED_IO_CONFIG2 0xd7 -#define TFA99XX_KEY1_PROTECTED_TEST_CTRL1 0xd8 -#define TFA99XX_KEY1_PROTECTED_MODE_OVERRULE 0xd9 -#define TFA99XX_KEY1_PROTECTED_FRO8_CALIB_CTRL 0xed -#define TFA99XX_SOFTWARE_PROFILE 0xee -#define TFA99XX_SOFTWARE_VSTEP 0xef -#define TFA99XX_KEY2_PROTECTED_MTP0 0xf0 -#define TFA99XX_KEY1_PROTECTED_MTP2 0xf2 -#define TFA99XX_KEY2_PROTECTED_MTP4 0xf4 -#define TFA99XX_KEY1_PROTECTED_MTP6 0xf6 -#define TFA99XX_KEY1_PROTECTED_MTP7 0xf7 -#define TFA99XX_KEY1_PROTECTED_MTP9 0xf9 -#define TFA99XX_KEY1_PROTECTED_MTPF 0xff -#define TFA99XX_SYS_CONTROL0_POR -#define TFA99XX_SYS_CONTROL1_POR -#define TFA99XX_SYS_CONTROL2_POR -#define TFA99XX_DEVICE_REVISION_POR -#define TFA99XX_CLOCK_CONTROL_POR -#define TFA99XX_CLOCK_GATING_CONTROL_POR -#define TFA99XX_HW_PATH_CFG_POR -#define TFA99XX_CLKCHK_TH_POR -#define TFA99XX_AMP_CTRL_POR -#define TFA99XX_SIDE_TONE_CONFIG_POR -#define TFA99XX_CTRL_DIGTOANA_REG_POR -#define TFA99XX_STATUS_FLAGS0_POR -#define TFA99XX_STATUS_FLAGS1_POR -#define TFA99XX_STATUS_FLAGS3_POR -#define TFA99XX_STATUS_FLAGS4_POR -#define TFA99XX_BATTERY_VOLTAGE_POR -#define TFA99XX_TEMPERATURE_POR -#define TFA99XX_VDDP_VOLTAGE_POR -#define TFA99XX_TDM_CONFIG0_POR -#define TFA99XX_TDM_CONFIG1_POR -#define TFA99XX_TDM_CONFIG2_POR -#define TFA99XX_TDM_CONFIG3_POR -#define TFA99XX_TDM_CONFIG4_POR -#define TFA99XX_TDM_CONFIG5_POR -#define TFA99XX_TDM_CONFIG6_POR -#define TFA99XX_TDM_CONFIG7_POR -#define TFA99XX_TDM_CONFIG8_POR -#define TFA99XX_TDM_CONFIG9_POR -#define TFA99XX_PDM_CONFIG0_POR -#define TFA99XX_PDM_CONFIG1_POR -#define TFA99XX_INTERRUPT_OUT_REG1_POR -#define TFA99XX_INTERRUPT_OUT_REG2_POR -#define TFA99XX_INTERRUPT_OUT_REG3_POR -#define TFA99XX_INTERRUPT_IN_REG1_POR -#define TFA99XX_INTERRUPT_IN_REG2_POR -#define TFA99XX_INTERRUPT_IN_REG3_POR -#define TFA99XX_INTERRUPT_ENABLE_REG1_POR -#define TFA99XX_INTERRUPT_ENABLE_REG2_POR -#define TFA99XX_INTERRUPT_ENABLE_REG3_POR -#define TFA99XX_STATUS_POLARITY_REG1_POR -#define TFA99XX_STATUS_POLARITY_REG2_POR -#define TFA99XX_STATUS_POLARITY_REG3_POR -#define TFA99XX_BAT_PROT_CONFIG_POR -#define TFA99XX_AUDIO_CONTROL_POR -#define TFA99XX_AMPLIFIER_CONFIG_POR -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL0_POR -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL1_POR -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL2_POR -#define TFA99XX_KEY1_PROTECTED_AMPLIFIER_CONTROL4_POR -#define TFA99XX_KEY1_PROTECTED_PWM_CONFIG_POR -#define TFA99XX_CF_TAP_STATUS_0_POR -#define TFA99XX_CF_TAP_STATUS_1_POR -#define TFA99XX_TAP_CONTROL_POR -#define TFA99XX_PGA_CONTROL0_POR -#define TFA99XX_GAIN_ATT_POR -#define TFA99XX_LOW_NOISE_GAIN1_POR -#define TFA99XX_LOW_NOISE_GAIN2_POR -#define TFA99XX_MODE1_DETECTOR1_POR -#define TFA99XX_MODE1_DETECTOR2_POR -#define TFA99XX_BST_PFM_CTRL_POR -#define TFA99XX_LOW_POWER_CTRL_POR -#define TFA99XX_TDM_SOURCE_CTRL_POR -#define TFA99XX_SAM_CTRL_POR -#define TFA99XX_RST_MIN_VBAT_CTRL_POR -#define TFA99XX_SYS_CONTROL3_POR -#define TFA99XX_STATUS_FLAGS5_POR -#define TFA99XX_DCDC_CONTROL0_POR -#define TFA99XX_KEY1_PROTECTED_DCDC_CONTROL3_POR -#define TFA99XX_DCDC_CONTROL4_POR -#define TFA99XX_DCDC_CONTROL5_POR -#define TFA99XX_DCDC_CONTROL6_POR -#define TFA99XX_KEY2_PROTECTED_DCDC_CONTROL7_POR -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG0_POR -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG2_POR -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG3_POR -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG4_POR -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG5_POR -#define TFA99XX_KEY2_PROTECTED_CURSENSE_CONFIG7_POR -#define TFA99XX_KEY2_PROTECTED_VOLSENSE_CONFIG_POR -#define TFA99XX_CURSENSE_CONFIG_POR -#define TFA99XX_CF_CONTROLS_POR -#define TFA99XX_CF_MAD_POR -#define TFA99XX_CF_MEM_POR -#define TFA99XX_CF_STATUS_POR -#define TFA99XX_MTPKEY1_REG_POR -#define TFA99XX_MTPKEY2_REG_POR -#define TFA99XX_MTP_STATUS_POR -#define TFA99XX_KEY_PROTECTED_MTP_CONTROL_POR -#define TFA99XX_KEY1_PROTECTED_FAIM_CONTROL_POR -#define TFA99XX_MTP_DATA_OUT_MSB_POR -#define TFA99XX_MTP_DATA_OUT_LSB_POR -#define TFA99XX_KEY1_PROTECTED_PROTECTION_CONFIG_POR -#define TFA99XX_TEMP_SENSOR_CONFIG_POR -#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL0_POR -#define TFA99XX_KEY1_PROTECTED_DIRECT_CONTROL1_POR -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG0_POR -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG1_POR -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG2_POR -#define TFA99XX_KEY1_PROTECTED_TEST_CONFIG3_POR -#define TFA99XX_KEY1_PROTECTED_DIGIMUX_CONTROL1_POR -#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL0_POR -#define TFA99XX_KEY1_PROTECTED_ANAMUX_CONTROL1_POR -#define TFA99XX_KEY1_PROTECTED_PLL_TEST0_POR -#define TFA99XX_KEY1_PROTECTED_PLL_TEST3_POR -#define TFA99XX_KEY1_PROTECTED_TSIG_CONTROL1_POR -#define TFA99XX_KEY1_PROTECTED_ADC10_CONTROL_POR -#define TFA99XX_KEY1_PROTECTED_ADC10_DATA_POR -#define TFA99XX_KEY2_PROTECTED_CTRL_DIGTOANA_POR -#define TFA99XX_KEY1_PROTECTED_CLKDIV_CONTROL_POR -#define TFA99XX_KEY1_PROTECTED_IO_CONFIG2_POR -#define TFA99XX_KEY1_PROTECTED_TEST_CTRL1_POR -#define TFA99XX_KEY1_PROTECTED_MODE_OVERRULE_POR -#define TFA99XX_KEY1_PROTECTED_FRO8_CALIB_CTRL_POR -#define TFA99XX_SOFTWARE_PROFILE_POR -#define TFA99XX_SOFTWARE_VSTEP_POR -#define TFA99XX_KEY2_PROTECTED_MTP0_POR -#define TFA99XX_KEY1_PROTECTED_MTP2_POR -#define TFA99XX_KEY2_PROTECTED_MTP4_POR -#define TFA99XX_KEY1_PROTECTED_MTP6_POR -#define TFA99XX_KEY1_PROTECTED_MTP7_POR -#define TFA99XX_KEY1_PROTECTED_MTP9_POR -#define TFA99XX_KEY1_PROTECTED_MTPF_POR - -#endif /* _TFA9912_DEVICE_GENREGS_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_tfafieldnames.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_tfafieldnames.h deleted file mode 100644 index fc65b684a9e6..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa9912_tfafieldnames.h +++ /dev/null @@ -1,1776 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/** Filename: tfa9912_tfaFieldnames.h - * This file was generated automatically on 09/28/18 at 12:00:21. - * Source file: TFA9912_N1A_I2C_regmap_V1.43.xlsx - */ - -#ifndef _TFA9912_TFAFIELDNAMES_H -#define _TFA9912_TFAFIELDNAMES_H - - -#define TFA9912_I2CVERSION 1.43 - -typedef enum Tfa9912BfEnumList { - TFA9912_BF_PWDN = 0x0000, /*!< Powerdown selection */ - TFA9912_BF_I2CR = 0x0010, /*!< I2C Reset - Auto clear */ - TFA9912_BF_CFE = 0x0020, /*!< Enable CoolFlux */ - TFA9912_BF_AMPE = 0x0030, /*!< Enables the Amplifier */ - TFA9912_BF_DCA = 0x0040, /*!< Activate DC-to-DC converter */ - TFA9912_BF_SBSL = 0x0050, /*!< Coolflux configured */ - TFA9912_BF_AMPC = 0x0060, /*!< CoolFlux controls amplifier */ - TFA9912_BF_INTP = 0x0071, /*!< Interrupt config */ - TFA9912_BF_FSSSEL = 0x0090, /*!< Audio sample reference */ - TFA9912_BF_BYPOCP = 0x00b0, /*!< Bypass OCP */ - TFA9912_BF_TSTOCP = 0x00c0, /*!< OCP testing control */ - TFA9912_BF_AMPINSEL = 0x0101, /*!< Amplifier input selection */ - TFA9912_BF_MANSCONF = 0x0120, /*!< I2C configured */ - TFA9912_BF_MANCOLD = 0x0130, /*!< Execute cold start */ - TFA9912_BF_MANAOOSC = 0x0140, /*!< Internal osc off at PWDN */ - TFA9912_BF_MANROBOD = 0x0150, /*!< Reaction on BOD */ - TFA9912_BF_BODE = 0x0160, /*!< BOD Enable */ - TFA9912_BF_BODHYS = 0x0170, /*!< BOD Hysteresis */ - TFA9912_BF_BODFILT = 0x0181, /*!< BOD filter */ - TFA9912_BF_BODTHLVL = 0x01a1, /*!< BOD threshold */ - TFA9912_BF_MUTETO = 0x01d0, /*!< Time out SB mute sequence */ - TFA9912_BF_RCVNS = 0x01e0, /*!< Noise shaper selection */ - TFA9912_BF_MANWDE = 0x01f0, /*!< Watchdog enable */ - TFA9912_BF_AUDFS = 0x0203, /*!< Sample rate (fs) */ - TFA9912_BF_INPLEV = 0x0240, /*!< TDM output attenuation */ - TFA9912_BF_FRACTDEL = 0x0255, /*!< V/I Fractional delay */ - TFA9912_BF_BYPHVBF = 0x02b0, /*!< Bypass HVBAT filter */ - TFA9912_BF_TDMC = 0x02c0, /*!< TDM Compatibility with TFA9872 */ - TFA9912_BF_ENBLADC10 = 0x02e0, /*!< ADC10 Enable - I2C direct mode */ - TFA9912_BF_REV = 0x030f, /*!< Revision info */ - TFA9912_BF_REFCKEXT = 0x0401, /*!< PLL external ref clock */ - TFA9912_BF_REFCKSEL = 0x0420, /*!< PLL internal ref clock */ - TFA9912_BF_ENCFCKSEL = 0x0430, /*!< Coolflux DSP clock scaling, low power mode */ - TFA9912_BF_CFCKSEL = 0x0441, /*!< Coolflux DSP clock scaler selection for low power mode */ - TFA9912_BF_TDMINFSEL = 0x0460, /*!< TDM clock selection */ - TFA9912_BF_DISBLAUTOCLKSEL = 0x0470, /*!< Disable Automatic dsp clock source selection */ - TFA9912_BF_SELCLKSRC = 0x0480, /*!< I2C selection of DSP clock when auto select is disabled */ - TFA9912_BF_SELTIMSRC = 0x0490, /*!< I2C selection of Watchdog and Timer clock */ - TFA9912_BF_SSLEFTE = 0x0500, /*!< */ - TFA9912_BF_SPKSSEN = 0x0510, /*!< Enable speaker path */ - TFA9912_BF_VSLEFTE = 0x0520, /*!< */ - TFA9912_BF_VSRIGHTE = 0x0530, /*!< Voltage sense */ - TFA9912_BF_CSLEFTE = 0x0540, /*!< */ - TFA9912_BF_CSRIGHTE = 0x0550, /*!< Current sense */ - TFA9912_BF_SSPDME = 0x0560, /*!< Sub-system PDM */ - TFA9912_BF_PGALE = 0x0570, /*!< Enable PGA chop clock for left channel */ - TFA9912_BF_PGARE = 0x0580, /*!< Enable PGA chop clock */ - TFA9912_BF_SSTDME = 0x0590, /*!< Sub-system TDM */ - TFA9912_BF_SSPBSTE = 0x05a0, /*!< Sub-system boost */ - TFA9912_BF_SSADCE = 0x05b0, /*!< Sub-system ADC */ - TFA9912_BF_SSFAIME = 0x05c0, /*!< Sub-system FAIM */ - TFA9912_BF_SSCFTIME = 0x05d0, /*!< CF Sub-system timer */ - TFA9912_BF_SSCFWDTE = 0x05e0, /*!< CF Sub-system WDT */ - TFA9912_BF_FAIMVBGOVRRL = 0x05f0, /*!< Over rule of vbg for FaIM access */ - TFA9912_BF_SAMSPKSEL = 0x0600, /*!< Input selection for TAP/SAM */ - TFA9912_BF_PDM2IISEN = 0x0610, /*!< PDM2IIS Bridge enable */ - TFA9912_BF_TAPRSTBYPASS = 0x0620, /*!< Tap decimator reset bypass - Bypass the decimator reset from tapdec */ - TFA9912_BF_CARDECISEL0 = 0x0631, /*!< Cardec input 0 sel */ - TFA9912_BF_CARDECISEL1 = 0x0651, /*!< Cardec input sel */ - TFA9912_BF_TAPDECSEL = 0x0670, /*!< Select TAP/Cardec for TAP */ - TFA9912_BF_COMPCOUNT = 0x0680, /*!< Comparator o/p filter selection */ - TFA9912_BF_STARTUPMODE = 0x0691, /*!< Startup Mode Selection */ - TFA9912_BF_AUTOTAP = 0x06b0, /*!< Enable auto tap switching */ - TFA9912_BF_COMPINITIME = 0x06c1, /*!< Comparator initialization time to be used in Tap Machine */ - TFA9912_BF_ANAPINITIME = 0x06e1, /*!< Analog initialization time to be used in Tap Machine */ - TFA9912_BF_CCHKTH = 0x0707, /*!< Clock check Higher Threshold */ - TFA9912_BF_CCHKTL = 0x0787, /*!< Clock check Higher Threshold */ - TFA9912_BF_AMPOCRT = 0x0802, /*!< Amplifier on-off criteria for shutdown */ - TFA9912_BF_AMPTCRR = 0x0832, /*!< Amplifier on-off criteria for tap mode entry */ - TFA9912_BF_STGS = 0x0d00, /*!< PDM side tone gain selector */ - TFA9912_BF_STGAIN = 0x0d18, /*!< Side tone gain */ - TFA9912_BF_STSMUTE = 0x0da0, /*!< Side tone soft mute */ - TFA9912_BF_ST1C = 0x0db0, /*!< side tone one s complement */ - TFA9912_BF_CMFBEL = 0x0e80, /*!< CMFB enable left */ - TFA9912_BF_VDDS = 0x1000, /*!< POR */ - TFA9912_BF_PLLS = 0x1010, /*!< PLL lock */ - TFA9912_BF_OTDS = 0x1020, /*!< OTP alarm */ - TFA9912_BF_OVDS = 0x1030, /*!< OVP alarm */ - TFA9912_BF_UVDS = 0x1040, /*!< UVP alarm */ - TFA9912_BF_CLKS = 0x1050, /*!< Clocks stable */ - TFA9912_BF_MTPB = 0x1060, /*!< MTP busy */ - TFA9912_BF_NOCLK = 0x1070, /*!< Lost clock */ - TFA9912_BF_ACS = 0x1090, /*!< Cold Start */ - TFA9912_BF_SWS = 0x10a0, /*!< Amplifier engage */ - TFA9912_BF_WDS = 0x10b0, /*!< Watchdog */ - TFA9912_BF_AMPS = 0x10c0, /*!< Amplifier enable */ - TFA9912_BF_AREFS = 0x10d0, /*!< References enable */ - TFA9912_BF_ADCCR = 0x10e0, /*!< Control ADC */ - TFA9912_BF_BODNOK = 0x10f0, /*!< BOD */ - TFA9912_BF_DCIL = 0x1100, /*!< DCDC current limiting */ - TFA9912_BF_DCDCA = 0x1110, /*!< DCDC active */ - TFA9912_BF_DCOCPOK = 0x1120, /*!< DCDC OCP nmos */ - TFA9912_BF_DCPEAKCUR = 0x1130, /*!< Indicates current is max in DC-to-DC converter */ - TFA9912_BF_DCHVBAT = 0x1140, /*!< DCDC level 1x */ - TFA9912_BF_DCH114 = 0x1150, /*!< DCDC level 1.14x */ - TFA9912_BF_DCH107 = 0x1160, /*!< DCDC level 1.07x */ - TFA9912_BF_STMUTEB = 0x1170, /*!< side tone (un)mute busy */ - TFA9912_BF_STMUTE = 0x1180, /*!< side tone mute state */ - TFA9912_BF_TDMLUTER = 0x1190, /*!< TDM LUT error */ - TFA9912_BF_TDMSTAT = 0x11a2, /*!< TDM status bits */ - TFA9912_BF_TDMERR = 0x11d0, /*!< TDM error */ - TFA9912_BF_HAPTIC = 0x11e0, /*!< Status haptic driver */ - TFA9912_BF_OCPOAP = 0x1300, /*!< OCPOK pmos A */ - TFA9912_BF_OCPOAN = 0x1310, /*!< OCPOK nmos A */ - TFA9912_BF_OCPOBP = 0x1320, /*!< OCPOK pmos B */ - TFA9912_BF_OCPOBN = 0x1330, /*!< OCPOK nmos B */ - TFA9912_BF_CLIPAH = 0x1340, /*!< Clipping A to Vddp */ - TFA9912_BF_CLIPAL = 0x1350, /*!< Clipping A to gnd */ - TFA9912_BF_CLIPBH = 0x1360, /*!< Clipping B to Vddp */ - TFA9912_BF_CLIPBL = 0x1370, /*!< Clipping B to gnd */ - TFA9912_BF_OCDS = 0x1380, /*!< OCP amplifier */ - TFA9912_BF_CLIPS = 0x1390, /*!< Amplifier clipping */ - TFA9912_BF_TCMPTRG = 0x13a0, /*!< Status Tap comparator triggered */ - TFA9912_BF_TAPDET = 0x13b0, /*!< Status Tap detected */ - TFA9912_BF_MANWAIT1 = 0x13c0, /*!< Wait HW I2C settings */ - TFA9912_BF_MANWAIT2 = 0x13d0, /*!< Wait CF config */ - TFA9912_BF_MANMUTE = 0x13e0, /*!< Audio mute sequence */ - TFA9912_BF_MANOPER = 0x13f0, /*!< Operating state */ - TFA9912_BF_SPKSL = 0x1400, /*!< Left speaker status */ - TFA9912_BF_SPKS = 0x1410, /*!< Speaker status */ - TFA9912_BF_CLKOOR = 0x1420, /*!< External clock status */ - TFA9912_BF_MANSTATE = 0x1433, /*!< Device manager status */ - TFA9912_BF_DCMODE = 0x1471, /*!< DCDC mode status bits */ - TFA9912_BF_DSPCLKSRC = 0x1490, /*!< DSP clock source selected by manager */ - TFA9912_BF_STARTUPMODSTAT = 0x14a1, /*!< Startup Mode Selected by Manager(Read Only) */ - TFA9912_BF_TSPMSTATE = 0x14c3, /*!< Tap Machine State */ - TFA9912_BF_BATS = 0x1509, /*!< Battery voltage (V) */ - TFA9912_BF_TEMPS = 0x1608, /*!< IC Temperature (C) */ - TFA9912_BF_VDDPS = 0x1709, /*!< IC VDDP voltage ( 1023*VDDP/13 V) */ - TFA9912_BF_DCILCF = 0x17a0, /*!< DCDC current limiting for DSP */ - TFA9912_BF_TDMUC = 0x2000, /*!< Mode setting */ - TFA9912_BF_DIO4SEL = 0x2011, /*!< DIO4 Input selection */ - TFA9912_BF_TDME = 0x2040, /*!< Enable TDM interface */ - TFA9912_BF_TDMMODE = 0x2050, /*!< Slave/master */ - TFA9912_BF_TDMCLINV = 0x2060, /*!< Reception data to BCK clock */ - TFA9912_BF_TDMFSLN = 0x2073, /*!< FS length */ - TFA9912_BF_TDMFSPOL = 0x20b0, /*!< FS polarity */ - TFA9912_BF_TDMNBCK = 0x20c3, /*!< N-BCK's in FS */ - TFA9912_BF_TDMSLOTS = 0x2103, /*!< N-slots in Frame */ - TFA9912_BF_TDMSLLN = 0x2144, /*!< N-bits in slot */ - TFA9912_BF_TDMBRMG = 0x2194, /*!< N-bits remaining */ - TFA9912_BF_TDMDEL = 0x21e0, /*!< data delay to FS */ - TFA9912_BF_TDMADJ = 0x21f0, /*!< data adjustment */ - TFA9912_BF_TDMOOMP = 0x2201, /*!< Received audio compression */ - TFA9912_BF_TDMSSIZE = 0x2224, /*!< Sample size per slot */ - TFA9912_BF_TDMTXDFO = 0x2271, /*!< Format unused bits in a slot */ - TFA9912_BF_TDMTXUS0 = 0x2291, /*!< Format unused slots GAINIO */ - TFA9912_BF_TDMTXUS1 = 0x22b1, /*!< Format unused slots DIO1 */ - TFA9912_BF_TDMTXUS2 = 0x22d1, /*!< Format unused slots DIO2 */ - TFA9912_BF_TDMGIE = 0x2300, /*!< Control gain (channel in 0) */ - TFA9912_BF_TDMDCE = 0x2310, /*!< Control audio left (channel in 1 ) */ - TFA9912_BF_TDMSPKE = 0x2320, /*!< Control audio right (channel in 2 ) */ - TFA9912_BF_TDMCSE = 0x2330, /*!< Current sense */ - TFA9912_BF_TDMVSE = 0x2340, /*!< Voltage sense */ - TFA9912_BF_TDMGOE = 0x2350, /*!< DSP Gainout */ - TFA9912_BF_TDMCF2E = 0x2360, /*!< DSP 2 */ - TFA9912_BF_TDMCF3E = 0x2370, /*!< DSP 3 */ - TFA9912_BF_TDMCFE = 0x2380, /*!< DSP */ - TFA9912_BF_TDMES6 = 0x2390, /*!< Loopback of Audio left (channel 1) */ - TFA9912_BF_TDMES7 = 0x23a0, /*!< Loopback of Audio right (channel 2) */ - TFA9912_BF_TDMCF4E = 0x23b0, /*!< AEC ref right control */ - TFA9912_BF_TDMPD1E = 0x23c0, /*!< PDM 1 control */ - TFA9912_BF_TDMPD2E = 0x23d0, /*!< PDM 2 control */ - TFA9912_BF_TDMGIN = 0x2401, /*!< IO gainin */ - TFA9912_BF_TDMLIO = 0x2421, /*!< IO audio left */ - TFA9912_BF_TDMRIO = 0x2441, /*!< IO audio right */ - TFA9912_BF_TDMCSIO = 0x2461, /*!< IO Current Sense */ - TFA9912_BF_TDMVSIO = 0x2481, /*!< IO voltage sense */ - TFA9912_BF_TDMGOIO = 0x24a1, /*!< IO gain out */ - TFA9912_BF_TDMCFIO2 = 0x24c1, /*!< IO DSP 2 */ - TFA9912_BF_TDMCFIO3 = 0x24e1, /*!< IO DSP 3 */ - TFA9912_BF_TDMCFIO = 0x2501, /*!< IO DSP */ - TFA9912_BF_TDMLPB6 = 0x2521, /*!< IO Source 6 */ - TFA9912_BF_TDMLPB7 = 0x2541, /*!< IO Source 7 */ - TFA9912_BF_TDMGS = 0x2603, /*!< Control gainin */ - TFA9912_BF_TDMDCS = 0x2643, /*!< tdm slot for audio left (channel 1) */ - TFA9912_BF_TDMSPKS = 0x2683, /*!< tdm slot for audio right (channel 2) */ - TFA9912_BF_TDMCSS = 0x26c3, /*!< Slot Position of Current Sense Out */ - TFA9912_BF_TDMVSS = 0x2703, /*!< Slot Position of Voltage sense */ - TFA9912_BF_TDMCGOS = 0x2743, /*!< Slot Position of GAIN out */ - TFA9912_BF_TDMCF2S = 0x2783, /*!< Slot Position DSPout2 */ - TFA9912_BF_TDMCF3S = 0x27c3, /*!< Slot Position DSPout3 */ - TFA9912_BF_TDMCFS = 0x2803, /*!< Slot Position of DSPout */ - TFA9912_BF_TDMEDAT6S = 0x2843, /*!< Slot Position of loopback channel left */ - TFA9912_BF_TDMEDAT7S = 0x2883, /*!< Slot Position of loopback channel right */ - TFA9912_BF_TDMTXUS3 = 0x2901, /*!< Format unused slots D3 */ - TFA9912_BF_PDMSM = 0x3100, /*!< PDM control */ - TFA9912_BF_PDMSTSEL = 0x3110, /*!< PDM Decimator input selection */ - TFA9912_BF_PDMSTENBL = 0x3120, /*!< Side tone input enable */ - TFA9912_BF_PDMLSEL = 0x3130, /*!< PDM data selection for left channel during PDM direct mode */ - TFA9912_BF_PDMRSEL = 0x3140, /*!< PDM data selection for right channel during PDM direct mode */ - TFA9912_BF_MICVDDE = 0x3150, /*!< Enable MICVDD */ - TFA9912_BF_PDMCLRAT = 0x3201, /*!< PDM BCK/Fs ratio */ - TFA9912_BF_PDMGAIN = 0x3223, /*!< PDM gain */ - TFA9912_BF_PDMOSEL = 0x3263, /*!< PDM output selection - RE/FE data combination */ - TFA9912_BF_SELCFHAPD = 0x32a0, /*!< Select the source for haptic data output (not for customer) */ - TFA9912_BF_ISTVDDS = 0x4000, /*!< Status POR */ - TFA9912_BF_ISTPLLS = 0x4010, /*!< Status PLL lock */ - TFA9912_BF_ISTOTDS = 0x4020, /*!< Status OTP alarm */ - TFA9912_BF_ISTOVDS = 0x4030, /*!< Status OVP alarm */ - TFA9912_BF_ISTUVDS = 0x4040, /*!< Status UVP alarm */ - TFA9912_BF_ISTCLKS = 0x4050, /*!< Status clocks stable */ - TFA9912_BF_ISTMTPB = 0x4060, /*!< Status MTP busy */ - TFA9912_BF_ISTNOCLK = 0x4070, /*!< Status lost clock */ - TFA9912_BF_ISTSPKS = 0x4080, /*!< Status speaker error */ - TFA9912_BF_ISTACS = 0x4090, /*!< Status cold start */ - TFA9912_BF_ISTSWS = 0x40a0, /*!< Status amplifier engage */ - TFA9912_BF_ISTWDS = 0x40b0, /*!< Status watchdog */ - TFA9912_BF_ISTAMPS = 0x40c0, /*!< Status amplifier enable */ - TFA9912_BF_ISTAREFS = 0x40d0, /*!< Status Ref enable */ - TFA9912_BF_ISTADCCR = 0x40e0, /*!< Status Control ADC */ - TFA9912_BF_ISTBODNOK = 0x40f0, /*!< Status BOD */ - TFA9912_BF_ISTBSTCU = 0x4100, /*!< Status DCDC current limiting */ - TFA9912_BF_ISTBSTHI = 0x4110, /*!< Status DCDC active */ - TFA9912_BF_ISTBSTOC = 0x4120, /*!< Status DCDC OCP */ - TFA9912_BF_ISTBSTPKCUR = 0x4130, /*!< Status bst peakcur */ - TFA9912_BF_ISTBSTVC = 0x4140, /*!< Status DCDC level 1x */ - TFA9912_BF_ISTBST86 = 0x4150, /*!< Status DCDC level 1.14x */ - TFA9912_BF_ISTBST93 = 0x4160, /*!< Status DCDC level 1.07x */ - TFA9912_BF_ISTRCVLD = 0x4170, /*!< Status rcvldop ready */ - TFA9912_BF_ISTOCPL = 0x4180, /*!< Status ocp alarm left */ - TFA9912_BF_ISTOCPR = 0x4190, /*!< Status ocp alarm */ - TFA9912_BF_ISTMWSRC = 0x41a0, /*!< Status Waits HW I2C settings */ - TFA9912_BF_ISTMWCFC = 0x41b0, /*!< Status waits CF config */ - TFA9912_BF_ISTMWSMU = 0x41c0, /*!< Status Audio mute sequence */ - TFA9912_BF_ISTCFMER = 0x41d0, /*!< Status cfma error */ - TFA9912_BF_ISTCFMAC = 0x41e0, /*!< Status cfma ack */ - TFA9912_BF_ISTCLKOOR = 0x41f0, /*!< Status flag_clk_out_of_range */ - TFA9912_BF_ISTTDMER = 0x4200, /*!< Status tdm error */ - TFA9912_BF_ISTCLPL = 0x4210, /*!< Status clip left */ - TFA9912_BF_ISTCLPR = 0x4220, /*!< Status clip */ - TFA9912_BF_ISTOCPM = 0x4230, /*!< Status mic ocpok */ - TFA9912_BF_ISTLP1 = 0x4250, /*!< Status low power mode1 */ - TFA9912_BF_ISTLA = 0x4260, /*!< Status low amplitude detection */ - TFA9912_BF_ISTVDDP = 0x4270, /*!< Status VDDP greater than VBAT */ - TFA9912_BF_ISTTAPDET = 0x4280, /*!< Status Tap detected */ - TFA9912_BF_ISTAUDMOD = 0x4290, /*!< Status Audio Mode activated */ - TFA9912_BF_ISTSAMMOD = 0x42a0, /*!< Status SAM Mode activated */ - TFA9912_BF_ISTTAPMOD = 0x42b0, /*!< Status Tap Mode Activated */ - TFA9912_BF_ISTTAPTRG = 0x42c0, /*!< Status Tap comparator triggered */ - TFA9912_BF_ICLVDDS = 0x4400, /*!< Clear POR */ - TFA9912_BF_ICLPLLS = 0x4410, /*!< Clear PLL lock */ - TFA9912_BF_ICLOTDS = 0x4420, /*!< Clear OTP alarm */ - TFA9912_BF_ICLOVDS = 0x4430, /*!< Clear OVP alarm */ - TFA9912_BF_ICLUVDS = 0x4440, /*!< Clear UVP alarm */ - TFA9912_BF_ICLCLKS = 0x4450, /*!< Clear clocks stable */ - TFA9912_BF_ICLMTPB = 0x4460, /*!< Clear mtp busy */ - TFA9912_BF_ICLNOCLK = 0x4470, /*!< Clear lost clk */ - TFA9912_BF_ICLSPKS = 0x4480, /*!< Clear speaker error */ - TFA9912_BF_ICLACS = 0x4490, /*!< Clear cold started */ - TFA9912_BF_ICLSWS = 0x44a0, /*!< Clear amplifier engage */ - TFA9912_BF_ICLWDS = 0x44b0, /*!< Clear watchdog */ - TFA9912_BF_ICLAMPS = 0x44c0, /*!< Clear enbl amp */ - TFA9912_BF_ICLAREFS = 0x44d0, /*!< Clear ref enable */ - TFA9912_BF_ICLADCCR = 0x44e0, /*!< Clear control ADC */ - TFA9912_BF_ICLBODNOK = 0x44f0, /*!< Clear BOD */ - TFA9912_BF_ICLBSTCU = 0x4500, /*!< Clear DCDC current limiting */ - TFA9912_BF_ICLBSTHI = 0x4510, /*!< Clear DCDC active */ - TFA9912_BF_ICLBSTOC = 0x4520, /*!< Clear DCDC OCP */ - TFA9912_BF_ICLBSTPC = 0x4530, /*!< Clear bst peakcur */ - TFA9912_BF_ICLBSTVC = 0x4540, /*!< Clear DCDC level 1x */ - TFA9912_BF_ICLBST86 = 0x4550, /*!< Clear DCDC level 1.14x */ - TFA9912_BF_ICLBST93 = 0x4560, /*!< Clear DCDC level 1.07x */ - TFA9912_BF_ICLRCVLD = 0x4570, /*!< Clear rcvldop ready */ - TFA9912_BF_ICLOCPL = 0x4580, /*!< Clear ocp alarm left */ - TFA9912_BF_ICLOCPR = 0x4590, /*!< Clear ocp alarm */ - TFA9912_BF_ICLMWSRC = 0x45a0, /*!< Clear wait HW I2C settings */ - TFA9912_BF_ICLMWCFC = 0x45b0, /*!< Clear wait cf config */ - TFA9912_BF_ICLMWSMU = 0x45c0, /*!< Clear audio mute sequence */ - TFA9912_BF_ICLCFMER = 0x45d0, /*!< Clear cfma err */ - TFA9912_BF_ICLCFMAC = 0x45e0, /*!< Clear cfma ack */ - TFA9912_BF_ICLCLKOOR = 0x45f0, /*!< Clear flag_clk_out_of_range */ - TFA9912_BF_ICLTDMER = 0x4600, /*!< Clear tdm error */ - TFA9912_BF_ICLCLPL = 0x4610, /*!< Clear clip left */ - TFA9912_BF_ICLCLP = 0x4620, /*!< Clear clip */ - TFA9912_BF_ICLOCPM = 0x4630, /*!< Clear mic ocpok */ - TFA9912_BF_ICLLP1 = 0x4650, /*!< Clear low power mode1 */ - TFA9912_BF_ICLLA = 0x4660, /*!< Clear low amplitude detection */ - TFA9912_BF_ICLVDDP = 0x4670, /*!< Clear VDDP greater then VBAT */ - TFA9912_BF_ICLTAPDET = 0x4680, /*!< Clear Tap detected */ - TFA9912_BF_ICLAUDMOD = 0x4690, /*!< Clear Audio Mode activated */ - TFA9912_BF_ICLSAMMOD = 0x46a0, /*!< Clear SAM Mode activated */ - TFA9912_BF_ICLTAPMOD = 0x46b0, /*!< Clear Tap Mode Activated */ - TFA9912_BF_ICLTAPTRG = 0x46c0, /*!< Clear Comparator Interrupt */ - TFA9912_BF_IEVDDS = 0x4800, /*!< Enable por */ - TFA9912_BF_IEPLLS = 0x4810, /*!< Enable pll lock */ - TFA9912_BF_IEOTDS = 0x4820, /*!< Enable OTP alarm */ - TFA9912_BF_IEOVDS = 0x4830, /*!< Enable OVP alarm */ - TFA9912_BF_IEUVDS = 0x4840, /*!< Enable UVP alarm */ - TFA9912_BF_IECLKS = 0x4850, /*!< Enable clocks stable */ - TFA9912_BF_IEMTPB = 0x4860, /*!< Enable mtp busy */ - TFA9912_BF_IENOCLK = 0x4870, /*!< Enable lost clk */ - TFA9912_BF_IESPKS = 0x4880, /*!< Enable speaker error */ - TFA9912_BF_IEACS = 0x4890, /*!< Enable cold started */ - TFA9912_BF_IESWS = 0x48a0, /*!< Enable amplifier engage */ - TFA9912_BF_IEWDS = 0x48b0, /*!< Enable watchdog */ - TFA9912_BF_IEAMPS = 0x48c0, /*!< Enable enbl amp */ - TFA9912_BF_IEAREFS = 0x48d0, /*!< Enable ref enable */ - TFA9912_BF_IEADCCR = 0x48e0, /*!< Enable Control ADC */ - TFA9912_BF_IEBODNOK = 0x48f0, /*!< Enable BOD */ - TFA9912_BF_IEBSTCU = 0x4900, /*!< Enable DCDC current limiting */ - TFA9912_BF_IEBSTHI = 0x4910, /*!< Enable DCDC active */ - TFA9912_BF_IEBSTOC = 0x4920, /*!< Enable DCDC OCP */ - TFA9912_BF_IEBSTPC = 0x4930, /*!< Enable bst peakcur */ - TFA9912_BF_IEBSTVC = 0x4940, /*!< Enable DCDC level 1x */ - TFA9912_BF_IEBST86 = 0x4950, /*!< Enable DCDC level 1.14x */ - TFA9912_BF_IEBST93 = 0x4960, /*!< Enable DCDC level 1.07x */ - TFA9912_BF_IERCVLD = 0x4970, /*!< Enable rcvldop ready */ - TFA9912_BF_IEOCPL = 0x4980, /*!< Enable ocp alarm left */ - TFA9912_BF_IEOCPR = 0x4990, /*!< Enable ocp alarm */ - TFA9912_BF_IEMWSRC = 0x49a0, /*!< Enable waits HW I2C settings */ - TFA9912_BF_IEMWCFC = 0x49b0, /*!< Enable man wait cf config */ - TFA9912_BF_IEMWSMU = 0x49c0, /*!< Enable man Audio mute sequence */ - TFA9912_BF_IECFMER = 0x49d0, /*!< Enable cfma err */ - TFA9912_BF_IECFMAC = 0x49e0, /*!< Enable cfma ack */ - TFA9912_BF_IECLKOOR = 0x49f0, /*!< Enable flag_clk_out_of_range */ - TFA9912_BF_IETDMER = 0x4a00, /*!< Enable tdm error */ - TFA9912_BF_IECLPL = 0x4a10, /*!< Enable clip left */ - TFA9912_BF_IECLPR = 0x4a20, /*!< Enable clip */ - TFA9912_BF_IEOCPM1 = 0x4a30, /*!< Enable mic ocpok */ - TFA9912_BF_IELP1 = 0x4a50, /*!< Enable low power mode1 */ - TFA9912_BF_IELA = 0x4a60, /*!< Enable low amplitude detection */ - TFA9912_BF_IEVDDP = 0x4a70, /*!< Enable VDDP greater than VBAT */ - TFA9912_BF_IETAPDET = 0x4a80, /*!< Enable Tap detected */ - TFA9912_BF_IEAUDMOD = 0x4a90, /*!< Enable Audio Mode activated */ - TFA9912_BF_IESAMMOD = 0x4aa0, /*!< Enable SAM Mode activated */ - TFA9912_BF_IETAPMOD = 0x4ab0, /*!< Enable Tap Mode Activated */ - TFA9912_BF_IETAPTRG = 0x4ac0, /*!< Enable comparator interrupt */ - TFA9912_BF_IPOVDDS = 0x4c00, /*!< Polarity por */ - TFA9912_BF_IPOPLLS = 0x4c10, /*!< Polarity pll lock */ - TFA9912_BF_IPOOTDS = 0x4c20, /*!< Polarity OTP alarm */ - TFA9912_BF_IPOOVDS = 0x4c30, /*!< Polarity OVP alarm */ - TFA9912_BF_IPOUVDS = 0x4c40, /*!< Polarity UVP alarm */ - TFA9912_BF_IPOCLKS = 0x4c50, /*!< Polarity clocks stable */ - TFA9912_BF_IPOMTPB = 0x4c60, /*!< Polarity mtp busy */ - TFA9912_BF_IPONOCLK = 0x4c70, /*!< Polarity lost clk */ - TFA9912_BF_IPOSPKS = 0x4c80, /*!< Polarity speaker error */ - TFA9912_BF_IPOACS = 0x4c90, /*!< Polarity cold started */ - TFA9912_BF_IPOSWS = 0x4ca0, /*!< Polarity amplifier engage */ - TFA9912_BF_IPOWDS = 0x4cb0, /*!< Polarity watchdog */ - TFA9912_BF_IPOAMPS = 0x4cc0, /*!< Polarity enbl amp */ - TFA9912_BF_IPOAREFS = 0x4cd0, /*!< Polarity ref enable */ - TFA9912_BF_IPOADCCR = 0x4ce0, /*!< Polarity Control ADC */ - TFA9912_BF_IPOBODNOK = 0x4cf0, /*!< Polarity BOD */ - TFA9912_BF_IPOBSTCU = 0x4d00, /*!< Polarity DCDC current limiting */ - TFA9912_BF_IPOBSTHI = 0x4d10, /*!< Polarity DCDC active */ - TFA9912_BF_IPOBSTOC = 0x4d20, /*!< Polarity DCDC OCP */ - TFA9912_BF_IPOBSTPC = 0x4d30, /*!< Polarity bst peakcur */ - TFA9912_BF_IPOBSTVC = 0x4d40, /*!< Polarity DCDC level 1x */ - TFA9912_BF_IPOBST86 = 0x4d50, /*!< Polarity DCDC level 1.14x */ - TFA9912_BF_IPOBST93 = 0x4d60, /*!< Polarity DCDC level 1.07x */ - TFA9912_BF_IPORCVLD = 0x4d70, /*!< Polarity rcvldop ready */ - TFA9912_BF_IPOOCPL = 0x4d80, /*!< Polarity ocp alarm left */ - TFA9912_BF_IPOOCPR = 0x4d90, /*!< Polarity ocp alarm */ - TFA9912_BF_IPOMWSRC = 0x4da0, /*!< Polarity waits HW I2C settings */ - TFA9912_BF_IPOMWCFC = 0x4db0, /*!< Polarity man wait cf config */ - TFA9912_BF_IPOMWSMU = 0x4dc0, /*!< Polarity man audio mute sequence */ - TFA9912_BF_IPOCFMER = 0x4dd0, /*!< Polarity cfma err */ - TFA9912_BF_IPOCFMAC = 0x4de0, /*!< Polarity cfma ack */ - TFA9912_BF_IPOCLKOOR = 0x4df0, /*!< Polarity flag_clk_out_of_range */ - TFA9912_BF_IPOTDMER = 0x4e00, /*!< Polarity tdm error */ - TFA9912_BF_IPOCLPL = 0x4e10, /*!< Polarity clip left */ - TFA9912_BF_IPOCLPR = 0x4e20, /*!< Polarity clip */ - TFA9912_BF_IPOOCPM = 0x4e30, /*!< Polarity mic ocpok */ - TFA9912_BF_IPOLP1 = 0x4e50, /*!< Polarity low power mode1 */ - TFA9912_BF_IPOLA = 0x4e60, /*!< Polarity low amplitude detection */ - TFA9912_BF_IPOVDDP = 0x4e70, /*!< Polarity VDDP greater than VBAT */ - TFA9912_BF_IPOLTAPDET = 0x4e80, /*!< PolarityTap detected */ - TFA9912_BF_IPOLAUDMOD = 0x4e90, /*!< PolarityAudio Mode activated */ - TFA9912_BF_IPOLSAMMOD = 0x4ea0, /*!< PolaritySAM Mode activated */ - TFA9912_BF_IPOLTAPMOD = 0x4eb0, /*!< Polarity Tap Mode Activated */ - TFA9912_BF_IPOLTAPTRG = 0x4ec0, /*!< PolarityTap Comparator Trigger */ - TFA9912_BF_BSSCR = 0x5001, /*!< Battery Safeguard attack time */ - TFA9912_BF_BSST = 0x5023, /*!< Battery Safeguard threshold voltage level */ - TFA9912_BF_BSSRL = 0x5061, /*!< Battery Safeguard maximum reduction */ - TFA9912_BF_BSSRR = 0x5082, /*!< Battery Safeguard release time */ - TFA9912_BF_BSSHY = 0x50b1, /*!< Battery Safeguard hysteresis */ - TFA9912_BF_BSSAC = 0x50d0, /*!< Reset clipper - Auto clear */ - TFA9912_BF_BSSR = 0x50e0, /*!< Battery voltage read out */ - TFA9912_BF_BSSBY = 0x50f0, /*!< Bypass HW clipper */ - TFA9912_BF_BSSS = 0x5100, /*!< Vbat prot steepness */ - TFA9912_BF_INTSMUTE = 0x5110, /*!< Soft mute HW */ - TFA9912_BF_CFSML = 0x5120, /*!< Soft mute FW left */ - TFA9912_BF_CFSM = 0x5130, /*!< Soft mute FW */ - TFA9912_BF_HPFBYPL = 0x5140, /*!< Bypass HPF left */ - TFA9912_BF_HPFBYP = 0x5150, /*!< Bypass HPF */ - TFA9912_BF_DPSAL = 0x5160, /*!< Enable DPSA left */ - TFA9912_BF_DPSA = 0x5170, /*!< Enable DPSA */ - TFA9912_BF_VOL = 0x5187, /*!< FW volume control for primary audio channel */ - TFA9912_BF_HNDSFRCV = 0x5200, /*!< Selection receiver */ - TFA9912_BF_CLIPCTRL = 0x5222, /*!< Clip control setting */ - TFA9912_BF_AMPGAIN = 0x5257, /*!< Amplifier gain */ - TFA9912_BF_SLOPEE = 0x52d0, /*!< Enables slope control */ - TFA9912_BF_SLOPESET = 0x52e0, /*!< Slope speed setting (bin. coded) */ - TFA9912_BF_CFTAPPAT = 0x5c07, /*!< Coolflux tap pattern */ - TFA9912_BF_TAPDBGINFO = 0x5c83, /*!< Reserved */ - TFA9912_BF_TATPSTAT1 = 0x5d0f, /*!< Tap Status 1 from CF FW */ - TFA9912_BF_TCOMPTHR = 0x5f03, /*!< Comparator threshold (in uV) */ - TFA9912_BF_PGAGAIN = 0x6081, /*!< PGA gain selection */ - TFA9912_BF_TDMSPKG = 0x6123, /*!< System gain (INPLEV 0) */ - TFA9912_BF_LPM1LVL = 0x6505, /*!< low power mode1 detector ctrl threshold for low_audio_lvl */ - TFA9912_BF_LPM1HLD = 0x6565, /*!< Low power mode1 detector, ctrl hold time before low audio is reckoned to be low audio */ - TFA9912_BF_LPM1DIS = 0x65c0, /*!< low power mode1 detector control */ - TFA9912_BF_DCDIS = 0x6630, /*!< DCDC */ - TFA9912_BF_TDMSRCMAP = 0x6801, /*!< tdm source mapping */ - TFA9912_BF_TDMSRCAS = 0x6821, /*!< frame a selection */ - TFA9912_BF_TDMSRCBS = 0x6841, /*!< frame b selection */ - TFA9912_BF_ANC1C = 0x68a0, /*!< ANC one s complement */ - TFA9912_BF_SAMMODE = 0x6901, /*!< Sam mode */ - TFA9912_BF_DCMCC = 0x7033, /*!< Max coil current */ - TFA9912_BF_DCCV = 0x7071, /*!< Slope compensation current, represents LxF (inductance x frequency) value */ - TFA9912_BF_DCIE = 0x7090, /*!< Adaptive boost mode */ - TFA9912_BF_DCSR = 0x70a0, /*!< Soft ramp up/down */ - TFA9912_BF_DCINSEL = 0x70c1, /*!< DCDC IIR input Selection */ - TFA9912_BF_DCPWM = 0x70f0, /*!< DCDC PWM only mode */ - TFA9912_BF_DCTRIP = 0x7504, /*!< Adaptive boost trip levels 1, effective only when boost_intelligent is set to 1 */ - TFA9912_BF_DCTRIP2 = 0x7554, /*!< Adaptive boost trip level 2, effective only when boost_intelligent is set to 1 */ - TFA9912_BF_DCTRIPT = 0x75a4, /*!< Adaptive boost trip levels, effective only when boost_intelligent is set to 1 */ - TFA9912_BF_DCVOF = 0x7635, /*!< First boost voltage level */ - TFA9912_BF_DCVOS = 0x7695, /*!< Second boost voltage level */ - TFA9912_BF_RST = 0x9000, /*!< Reset */ - TFA9912_BF_DMEM = 0x9011, /*!< Target memory */ - TFA9912_BF_AIF = 0x9030, /*!< Auto increment */ - TFA9912_BF_CFINT = 0x9040, /*!< Interrupt - auto clear */ - TFA9912_BF_CFCGATE = 0x9050, /*!< Coolflux clock gating disabling control */ - TFA9912_BF_REQCMD = 0x9080, /*!< Firmware event request rpc command */ - TFA9912_BF_REQRST = 0x9090, /*!< Firmware event request reset restart */ - TFA9912_BF_REQMIPS = 0x90a0, /*!< Firmware event request short on mips */ - TFA9912_BF_REQMUTED = 0x90b0, /*!< Firmware event request mute sequence ready */ - TFA9912_BF_REQVOL = 0x90c0, /*!< Firmware event request volume ready */ - TFA9912_BF_REQDMG = 0x90d0, /*!< Firmware event request speaker damage detected */ - TFA9912_BF_REQCAL = 0x90e0, /*!< Firmware event request calibration completed */ - TFA9912_BF_REQRSV = 0x90f0, /*!< Firmware event request reserved */ - TFA9912_BF_MADD = 0x910f, /*!< Memory address */ - TFA9912_BF_MEMA = 0x920f, /*!< Activate memory access */ - TFA9912_BF_ERR = 0x9307, /*!< Error flags */ - TFA9912_BF_ACKCMD = 0x9380, /*!< Firmware event acknowledge rpc command */ - TFA9912_BF_ACKRST = 0x9390, /*!< Firmware event acknowledge reset restart */ - TFA9912_BF_ACKMIPS = 0x93a0, /*!< Firmware event acknowledge short on mips */ - TFA9912_BF_ACKMUTED = 0x93b0, /*!< Firmware event acknowledge mute sequence ready */ - TFA9912_BF_ACKVOL = 0x93c0, /*!< Firmware event acknowledge volume ready */ - TFA9912_BF_ACKDMG = 0x93d0, /*!< Firmware event acknowledge speaker damage detected */ - TFA9912_BF_ACKCAL = 0x93e0, /*!< Firmware event acknowledge calibration completed */ - TFA9912_BF_ACKRSV = 0x93f0, /*!< Firmware event acknowledge reserved */ - TFA9912_BF_MTPK = 0xa107, /*!< MTP KEY2 register */ - TFA9912_BF_KEY1LOCKED = 0xa200, /*!< Indicates KEY1 is locked */ - TFA9912_BF_KEY2LOCKED = 0xa210, /*!< Indicates KEY2 is locked */ - TFA9912_BF_CIMTP = 0xa360, /*!< Start copying data from I2C mtp registers to mtp */ - TFA9912_BF_MTPRDMSB = 0xa50f, /*!< MSB word of MTP manual read data */ - TFA9912_BF_MTPRDLSB = 0xa60f, /*!< LSB word of MTP manual read data */ - TFA9912_BF_EXTTS = 0xb108, /*!< External temperature (C) */ - TFA9912_BF_TROS = 0xb190, /*!< Select temp Speaker calibration */ - TFA9912_BF_SWPROFIL = 0xee0f, /*!< Software profile data */ - TFA9912_BF_SWVSTEP = 0xef0f, /*!< Software vstep information */ - TFA9912_BF_MTPOTC = 0xf000, /*!< Calibration schedule */ - TFA9912_BF_MTPEX = 0xf010, /*!< Calibration Ron executed */ - TFA9912_BF_DCMCCAPI = 0xf020, /*!< Calibration current limit DCDC */ - TFA9912_BF_DCMCCSB = 0xf030, /*!< Sign bit for delta calibration current limit DCDC */ - TFA9912_BF_DCMCCCL = 0xf042, /*!< Calibration delta current limit DCDC */ - TFA9912_BF_USERDEF = 0xf078, /*!< Reserved space for allowing customer to store speaker information */ - TFA9912_BF_R25C = 0xf40f, /*!< Ron resistance of speaker coil */ -} Tfa9912BfEnumList_t; -#define TFA9912_NAMETABLE static tfaBfName_t Tfa9912DatasheetNames[] = {\ - { 0x0, "PWDN"}, /* Powerdown selection , */\ - { 0x10, "I2CR"}, /* I2C Reset - Auto clear , */\ - { 0x20, "CFE"}, /* Enable CoolFlux , */\ - { 0x30, "AMPE"}, /* Enables the Amplifier , */\ - { 0x40, "DCA"}, /* Activate DC-to-DC converter , */\ - { 0x50, "SBSL"}, /* Coolflux configured , */\ - { 0x60, "AMPC"}, /* CoolFlux controls amplifier , */\ - { 0x71, "INTP"}, /* Interrupt config , */\ - { 0x90, "FSSSEL"}, /* Audio sample reference , */\ - { 0xb0, "BYPOCP"}, /* Bypass OCP , */\ - { 0xc0, "TSTOCP"}, /* OCP testing control , */\ - { 0x101, "AMPINSEL"}, /* Amplifier input selection , */\ - { 0x120, "MANSCONF"}, /* I2C configured , */\ - { 0x130, "MANCOLD"}, /* Execute cold start , */\ - { 0x140, "MANAOOSC"}, /* Internal osc off at PWDN , */\ - { 0x150, "MANROBOD"}, /* Reaction on BOD , */\ - { 0x160, "BODE"}, /* BOD Enable , */\ - { 0x170, "BODHYS"}, /* BOD Hysteresis , */\ - { 0x181, "BODFILT"}, /* BOD filter , */\ - { 0x1a1, "BODTHLVL"}, /* BOD threshold , */\ - { 0x1d0, "MUTETO"}, /* Time out SB mute sequence , */\ - { 0x1e0, "RCVNS"}, /* Noise shaper selection , */\ - { 0x1f0, "MANWDE"}, /* Watchdog enable , */\ - { 0x203, "AUDFS"}, /* Sample rate (fs) , */\ - { 0x240, "INPLEV"}, /* TDM output attenuation , */\ - { 0x255, "FRACTDEL"}, /* V/I Fractional delay , */\ - { 0x2b0, "BYPHVBF"}, /* Bypass HVBAT filter , */\ - { 0x2c0, "TDMC"}, /* TDM Compatibility with TFA9872 , */\ - { 0x2e0, "ENBLADC10"}, /* ADC10 Enable - I2C direct mode , */\ - { 0x30f, "REV"}, /* Revision info , */\ - { 0x401, "REFCKEXT"}, /* PLL external ref clock , */\ - { 0x420, "REFCKSEL"}, /* PLL internal ref clock , */\ - { 0x430, "ENCFCKSEL"}, /* Coolflux DSP clock scaling, low power mode , */\ - { 0x441, "CFCKSEL"}, /* Coolflux DSP clock scaler selection for low power mode, */\ - { 0x460, "TDMINFSEL"}, /* TDM clock selection , */\ - { 0x470, "DISBLAUTOCLKSEL"}, /* Disable Automatic dsp clock source selection , */\ - { 0x480, "SELCLKSRC"}, /* I2C selection of DSP clock when auto select is disabled, */\ - { 0x490, "SELTIMSRC"}, /* I2C selection of Watchdog and Timer clock , */\ - { 0x500, "SSLEFTE"}, /* , */\ - { 0x510, "SPKSSEN"}, /* Enable speaker path , */\ - { 0x520, "VSLEFTE"}, /* , */\ - { 0x530, "VSRIGHTE"}, /* Voltage sense , */\ - { 0x540, "CSLEFTE"}, /* , */\ - { 0x550, "CSRIGHTE"}, /* Current sense , */\ - { 0x560, "SSPDME"}, /* Sub-system PDM , */\ - { 0x570, "PGALE"}, /* Enable PGA chop clock for left channel , */\ - { 0x580, "PGARE"}, /* Enable PGA chop clock , */\ - { 0x590, "SSTDME"}, /* Sub-system TDM , */\ - { 0x5a0, "SSPBSTE"}, /* Sub-system boost , */\ - { 0x5b0, "SSADCE"}, /* Sub-system ADC , */\ - { 0x5c0, "SSFAIME"}, /* Sub-system FAIM , */\ - { 0x5d0, "SSCFTIME"}, /* CF Sub-system timer , */\ - { 0x5e0, "SSCFWDTE"}, /* CF Sub-system WDT , */\ - { 0x5f0, "FAIMVBGOVRRL"}, /* Over rule of vbg for FaIM access , */\ - { 0x600, "SAMSPKSEL"}, /* Input selection for TAP/SAM , */\ - { 0x610, "PDM2IISEN"}, /* PDM2IIS Bridge enable , */\ - { 0x620, "TAPRSTBYPASS"}, /* Tap decimator reset bypass - Bypass the decimator reset from tapdec, */\ - { 0x631, "CARDECISEL0"}, /* Cardec input 0 sel , */\ - { 0x651, "CARDECISEL1"}, /* Cardec input sel , */\ - { 0x670, "TAPDECSEL"}, /* Select TAP/Cardec for TAP , */\ - { 0x680, "COMPCOUNT"}, /* Comparator o/p filter selection , */\ - { 0x691, "STARTUPMODE"}, /* Startup Mode Selection , */\ - { 0x6b0, "AUTOTAP"}, /* Enable auto tap switching , */\ - { 0x6c1, "COMPINITIME"}, /* Comparator initialization time to be used in Tap Machine, */\ - { 0x6e1, "ANAPINITIME"}, /* Analog initialization time to be used in Tap Machine, */\ - { 0x707, "CCHKTH"}, /* Clock check Higher Threshold , */\ - { 0x787, "CCHKTL"}, /* Clock check Higher Threshold , */\ - { 0x802, "AMPOCRT"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x832, "AMPTCRR"}, /* Amplifier on-off criteria for tap mode entry , */\ - { 0xd00, "STGS"}, /* PDM side tone gain selector , */\ - { 0xd18, "STGAIN"}, /* Side tone gain , */\ - { 0xda0, "STSMUTE"}, /* Side tone soft mute , */\ - { 0xdb0, "ST1C"}, /* side tone one s complement , */\ - { 0xe80, "CMFBEL"}, /* CMFB enable left , */\ - { 0x1000, "VDDS"}, /* POR , */\ - { 0x1010, "PLLS"}, /* PLL lock , */\ - { 0x1020, "OTDS"}, /* OTP alarm , */\ - { 0x1030, "OVDS"}, /* OVP alarm , */\ - { 0x1040, "UVDS"}, /* UVP alarm , */\ - { 0x1050, "CLKS"}, /* Clocks stable , */\ - { 0x1060, "MTPB"}, /* MTP busy , */\ - { 0x1070, "NOCLK"}, /* Lost clock , */\ - { 0x1090, "ACS"}, /* Cold Start , */\ - { 0x10a0, "SWS"}, /* Amplifier engage , */\ - { 0x10b0, "WDS"}, /* Watchdog , */\ - { 0x10c0, "AMPS"}, /* Amplifier enable , */\ - { 0x10d0, "AREFS"}, /* References enable , */\ - { 0x10e0, "ADCCR"}, /* Control ADC , */\ - { 0x10f0, "BODNOK"}, /* BOD , */\ - { 0x1100, "DCIL"}, /* DCDC current limiting , */\ - { 0x1110, "DCDCA"}, /* DCDC active , */\ - { 0x1120, "DCOCPOK"}, /* DCDC OCP nmos , */\ - { 0x1130, "DCPEAKCUR"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1140, "DCHVBAT"}, /* DCDC level 1x , */\ - { 0x1150, "DCH114"}, /* DCDC level 1.14x , */\ - { 0x1160, "DCH107"}, /* DCDC level 1.07x , */\ - { 0x1170, "STMUTEB"}, /* side tone (un)mute busy , */\ - { 0x1180, "STMUTE"}, /* side tone mute state , */\ - { 0x1190, "TDMLUTER"}, /* TDM LUT error , */\ - { 0x11a2, "TDMSTAT"}, /* TDM status bits , */\ - { 0x11d0, "TDMERR"}, /* TDM error , */\ - { 0x11e0, "HAPTIC"}, /* Status haptic driver , */\ - { 0x1300, "OCPOAP"}, /* OCPOK pmos A , */\ - { 0x1310, "OCPOAN"}, /* OCPOK nmos A , */\ - { 0x1320, "OCPOBP"}, /* OCPOK pmos B , */\ - { 0x1330, "OCPOBN"}, /* OCPOK nmos B , */\ - { 0x1340, "CLIPAH"}, /* Clipping A to Vddp , */\ - { 0x1350, "CLIPAL"}, /* Clipping A to gnd , */\ - { 0x1360, "CLIPBH"}, /* Clipping B to Vddp , */\ - { 0x1370, "CLIPBL"}, /* Clipping B to gnd , */\ - { 0x1380, "OCDS"}, /* OCP amplifier , */\ - { 0x1390, "CLIPS"}, /* Amplifier clipping , */\ - { 0x13a0, "TCMPTRG"}, /* Status Tap comparator triggered , */\ - { 0x13b0, "TAPDET"}, /* Status Tap detected , */\ - { 0x13c0, "MANWAIT1"}, /* Wait HW I2C settings , */\ - { 0x13d0, "MANWAIT2"}, /* Wait CF config , */\ - { 0x13e0, "MANMUTE"}, /* Audio mute sequence , */\ - { 0x13f0, "MANOPER"}, /* Operating state , */\ - { 0x1400, "SPKSL"}, /* Left speaker status , */\ - { 0x1410, "SPKS"}, /* Speaker status , */\ - { 0x1420, "CLKOOR"}, /* External clock status , */\ - { 0x1433, "MANSTATE"}, /* Device manager status , */\ - { 0x1471, "DCMODE"}, /* DCDC mode status bits , */\ - { 0x1490, "DSPCLKSRC"}, /* DSP clock source selected by manager , */\ - { 0x14a1, "STARTUPMODSTAT"}, /* Startup Mode Selected by Manager(Read Only) , */\ - { 0x14c3, "TSPMSTATE"}, /* Tap Machine State , */\ - { 0x1509, "BATS"}, /* Battery voltage (V) , */\ - { 0x1608, "TEMPS"}, /* IC Temperature (C) , */\ - { 0x1709, "VDDPS"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x17a0, "DCILCF"}, /* DCDC current limiting for DSP , */\ - { 0x2000, "TDMUC"}, /* Mode setting , */\ - { 0x2011, "DIO4SEL"}, /* DIO4 Input selection , */\ - { 0x2040, "TDME"}, /* Enable TDM interface , */\ - { 0x2050, "TDMMODE"}, /* Slave/master , */\ - { 0x2060, "TDMCLINV"}, /* Reception data to BCK clock , */\ - { 0x2073, "TDMFSLN"}, /* FS length , */\ - { 0x20b0, "TDMFSPOL"}, /* FS polarity , */\ - { 0x20c3, "TDMNBCK"}, /* N-BCK's in FS , */\ - { 0x2103, "TDMSLOTS"}, /* N-slots in Frame , */\ - { 0x2144, "TDMSLLN"}, /* N-bits in slot , */\ - { 0x2194, "TDMBRMG"}, /* N-bits remaining , */\ - { 0x21e0, "TDMDEL"}, /* data delay to FS , */\ - { 0x21f0, "TDMADJ"}, /* data adjustment , */\ - { 0x2201, "TDMOOMP"}, /* Received audio compression , */\ - { 0x2224, "TDMSSIZE"}, /* Sample size per slot , */\ - { 0x2271, "TDMTXDFO"}, /* Format unused bits in a slot , */\ - { 0x2291, "TDMTXUS0"}, /* Format unused slots GAINIO , */\ - { 0x22b1, "TDMTXUS1"}, /* Format unused slots DIO1 , */\ - { 0x22d1, "TDMTXUS2"}, /* Format unused slots DIO2 , */\ - { 0x2300, "TDMGIE"}, /* Control gain (channel in 0) , */\ - { 0x2310, "TDMDCE"}, /* Control audio left (channel in 1 ) , */\ - { 0x2320, "TDMSPKE"}, /* Control audio right (channel in 2 ) , */\ - { 0x2330, "TDMCSE"}, /* Current sense , */\ - { 0x2340, "TDMVSE"}, /* Voltage sense , */\ - { 0x2350, "TDMGOE"}, /* DSP Gainout , */\ - { 0x2360, "TDMCF2E"}, /* DSP 2 , */\ - { 0x2370, "TDMCF3E"}, /* DSP 3 , */\ - { 0x2380, "TDMCFE"}, /* DSP , */\ - { 0x2390, "TDMES6"}, /* Loopback of Audio left (channel 1) , */\ - { 0x23a0, "TDMES7"}, /* Loopback of Audio right (channel 2) , */\ - { 0x23b0, "TDMCF4E"}, /* AEC ref right control , */\ - { 0x23c0, "TDMPD1E"}, /* PDM 1 control , */\ - { 0x23d0, "TDMPD2E"}, /* PDM 2 control , */\ - { 0x2401, "TDMGIN"}, /* IO gainin , */\ - { 0x2421, "TDMLIO"}, /* IO audio left , */\ - { 0x2441, "TDMRIO"}, /* IO audio right , */\ - { 0x2461, "TDMCSIO"}, /* IO Current Sense , */\ - { 0x2481, "TDMVSIO"}, /* IO voltage sense , */\ - { 0x24a1, "TDMGOIO"}, /* IO gain out , */\ - { 0x24c1, "TDMCFIO2"}, /* IO DSP 2 , */\ - { 0x24e1, "TDMCFIO3"}, /* IO DSP 3 , */\ - { 0x2501, "TDMCFIO"}, /* IO DSP , */\ - { 0x2521, "TDMLPB6"}, /* IO Source 6 , */\ - { 0x2541, "TDMLPB7"}, /* IO Source 7 , */\ - { 0x2603, "TDMGS"}, /* Control gainin , */\ - { 0x2643, "TDMDCS"}, /* tdm slot for audio left (channel 1) , */\ - { 0x2683, "TDMSPKS"}, /* tdm slot for audio right (channel 2) , */\ - { 0x26c3, "TDMCSS"}, /* Slot Position of Current Sense Out , */\ - { 0x2703, "TDMVSS"}, /* Slot Position of Voltage sense , */\ - { 0x2743, "TDMCGOS"}, /* Slot Position of GAIN out , */\ - { 0x2783, "TDMCF2S"}, /* Slot Position DSPout2 , */\ - { 0x27c3, "TDMCF3S"}, /* Slot Position DSPout3 , */\ - { 0x2803, "TDMCFS"}, /* Slot Position of DSPout , */\ - { 0x2843, "TDMEDAT6S"}, /* Slot Position of loopback channel left , */\ - { 0x2883, "TDMEDAT7S"}, /* Slot Position of loopback channel right , */\ - { 0x2901, "TDMTXUS3"}, /* Format unused slots D3 , */\ - { 0x3100, "PDMSM"}, /* PDM control , */\ - { 0x3110, "PDMSTSEL"}, /* PDM Decimator input selection , */\ - { 0x3120, "PDMSTENBL"}, /* Side tone input enable , */\ - { 0x3130, "PDMLSEL"}, /* PDM data selection for left channel during PDM direct mode, */\ - { 0x3140, "PDMRSEL"}, /* PDM data selection for right channel during PDM direct mode, */\ - { 0x3150, "MICVDDE"}, /* Enable MICVDD , */\ - { 0x3201, "PDMCLRAT"}, /* PDM BCK/Fs ratio , */\ - { 0x3223, "PDMGAIN"}, /* PDM gain , */\ - { 0x3263, "PDMOSEL"}, /* PDM output selection - RE/FE data combination , */\ - { 0x32a0, "SELCFHAPD"}, /* Select the source for haptic data output (not for customer), */\ - { 0x4000, "ISTVDDS"}, /* Status POR , */\ - { 0x4010, "ISTPLLS"}, /* Status PLL lock , */\ - { 0x4020, "ISTOTDS"}, /* Status OTP alarm , */\ - { 0x4030, "ISTOVDS"}, /* Status OVP alarm , */\ - { 0x4040, "ISTUVDS"}, /* Status UVP alarm , */\ - { 0x4050, "ISTCLKS"}, /* Status clocks stable , */\ - { 0x4060, "ISTMTPB"}, /* Status MTP busy , */\ - { 0x4070, "ISTNOCLK"}, /* Status lost clock , */\ - { 0x4080, "ISTSPKS"}, /* Status speaker error , */\ - { 0x4090, "ISTACS"}, /* Status cold start , */\ - { 0x40a0, "ISTSWS"}, /* Status amplifier engage , */\ - { 0x40b0, "ISTWDS"}, /* Status watchdog , */\ - { 0x40c0, "ISTAMPS"}, /* Status amplifier enable , */\ - { 0x40d0, "ISTAREFS"}, /* Status Ref enable , */\ - { 0x40e0, "ISTADCCR"}, /* Status Control ADC , */\ - { 0x40f0, "ISTBODNOK"}, /* Status BOD , */\ - { 0x4100, "ISTBSTCU"}, /* Status DCDC current limiting , */\ - { 0x4110, "ISTBSTHI"}, /* Status DCDC active , */\ - { 0x4120, "ISTBSTOC"}, /* Status DCDC OCP , */\ - { 0x4130, "ISTBSTPKCUR"}, /* Status bst peakcur , */\ - { 0x4140, "ISTBSTVC"}, /* Status DCDC level 1x , */\ - { 0x4150, "ISTBST86"}, /* Status DCDC level 1.14x , */\ - { 0x4160, "ISTBST93"}, /* Status DCDC level 1.07x , */\ - { 0x4170, "ISTRCVLD"}, /* Status rcvldop ready , */\ - { 0x4180, "ISTOCPL"}, /* Status ocp alarm left , */\ - { 0x4190, "ISTOCPR"}, /* Status ocp alarm , */\ - { 0x41a0, "ISTMWSRC"}, /* Status Waits HW I2C settings , */\ - { 0x41b0, "ISTMWCFC"}, /* Status waits CF config , */\ - { 0x41c0, "ISTMWSMU"}, /* Status Audio mute sequence , */\ - { 0x41d0, "ISTCFMER"}, /* Status cfma error , */\ - { 0x41e0, "ISTCFMAC"}, /* Status cfma ack , */\ - { 0x41f0, "ISTCLKOOR"}, /* Status flag_clk_out_of_range , */\ - { 0x4200, "ISTTDMER"}, /* Status tdm error , */\ - { 0x4210, "ISTCLPL"}, /* Status clip left , */\ - { 0x4220, "ISTCLPR"}, /* Status clip , */\ - { 0x4230, "ISTOCPM"}, /* Status mic ocpok , */\ - { 0x4250, "ISTLP1"}, /* Status low power mode1 , */\ - { 0x4260, "ISTLA"}, /* Status low amplitude detection , */\ - { 0x4270, "ISTVDDP"}, /* Status VDDP greater than VBAT , */\ - { 0x4280, "ISTTAPDET"}, /* Status Tap detected , */\ - { 0x4290, "ISTAUDMOD"}, /* Status Audio Mode activated , */\ - { 0x42a0, "ISTSAMMOD"}, /* Status SAM Mode activated , */\ - { 0x42b0, "ISTTAPMOD"}, /* Status Tap Mode Activated , */\ - { 0x42c0, "ISTTAPTRG"}, /* Status Tap comparator triggered , */\ - { 0x4400, "ICLVDDS"}, /* Clear POR , */\ - { 0x4410, "ICLPLLS"}, /* Clear PLL lock , */\ - { 0x4420, "ICLOTDS"}, /* Clear OTP alarm , */\ - { 0x4430, "ICLOVDS"}, /* Clear OVP alarm , */\ - { 0x4440, "ICLUVDS"}, /* Clear UVP alarm , */\ - { 0x4450, "ICLCLKS"}, /* Clear clocks stable , */\ - { 0x4460, "ICLMTPB"}, /* Clear mtp busy , */\ - { 0x4470, "ICLNOCLK"}, /* Clear lost clk , */\ - { 0x4480, "ICLSPKS"}, /* Clear speaker error , */\ - { 0x4490, "ICLACS"}, /* Clear cold started , */\ - { 0x44a0, "ICLSWS"}, /* Clear amplifier engage , */\ - { 0x44b0, "ICLWDS"}, /* Clear watchdog , */\ - { 0x44c0, "ICLAMPS"}, /* Clear enbl amp , */\ - { 0x44d0, "ICLAREFS"}, /* Clear ref enable , */\ - { 0x44e0, "ICLADCCR"}, /* Clear control ADC , */\ - { 0x44f0, "ICLBODNOK"}, /* Clear BOD , */\ - { 0x4500, "ICLBSTCU"}, /* Clear DCDC current limiting , */\ - { 0x4510, "ICLBSTHI"}, /* Clear DCDC active , */\ - { 0x4520, "ICLBSTOC"}, /* Clear DCDC OCP , */\ - { 0x4530, "ICLBSTPC"}, /* Clear bst peakcur , */\ - { 0x4540, "ICLBSTVC"}, /* Clear DCDC level 1x , */\ - { 0x4550, "ICLBST86"}, /* Clear DCDC level 1.14x , */\ - { 0x4560, "ICLBST93"}, /* Clear DCDC level 1.07x , */\ - { 0x4570, "ICLRCVLD"}, /* Clear rcvldop ready , */\ - { 0x4580, "ICLOCPL"}, /* Clear ocp alarm left , */\ - { 0x4590, "ICLOCPR"}, /* Clear ocp alarm , */\ - { 0x45a0, "ICLMWSRC"}, /* Clear wait HW I2C settings , */\ - { 0x45b0, "ICLMWCFC"}, /* Clear wait cf config , */\ - { 0x45c0, "ICLMWSMU"}, /* Clear audio mute sequence , */\ - { 0x45d0, "ICLCFMER"}, /* Clear cfma err , */\ - { 0x45e0, "ICLCFMAC"}, /* Clear cfma ack , */\ - { 0x45f0, "ICLCLKOOR"}, /* Clear flag_clk_out_of_range , */\ - { 0x4600, "ICLTDMER"}, /* Clear tdm error , */\ - { 0x4610, "ICLCLPL"}, /* Clear clip left , */\ - { 0x4620, "ICLCLP"}, /* Clear clip , */\ - { 0x4630, "ICLOCPM"}, /* Clear mic ocpok , */\ - { 0x4650, "ICLLP1"}, /* Clear low power mode1 , */\ - { 0x4660, "ICLLA"}, /* Clear low amplitude detection , */\ - { 0x4670, "ICLVDDP"}, /* Clear VDDP greater then VBAT , */\ - { 0x4680, "ICLTAPDET"}, /* Clear Tap detected , */\ - { 0x4690, "ICLAUDMOD"}, /* Clear Audio Mode activated , */\ - { 0x46a0, "ICLSAMMOD"}, /* Clear SAM Mode activated , */\ - { 0x46b0, "ICLTAPMOD"}, /* Clear Tap Mode Activated , */\ - { 0x46c0, "ICLTAPTRG"}, /* Clear Comparator Interrupt , */\ - { 0x4800, "IEVDDS"}, /* Enable por , */\ - { 0x4810, "IEPLLS"}, /* Enable pll lock , */\ - { 0x4820, "IEOTDS"}, /* Enable OTP alarm , */\ - { 0x4830, "IEOVDS"}, /* Enable OVP alarm , */\ - { 0x4840, "IEUVDS"}, /* Enable UVP alarm , */\ - { 0x4850, "IECLKS"}, /* Enable clocks stable , */\ - { 0x4860, "IEMTPB"}, /* Enable mtp busy , */\ - { 0x4870, "IENOCLK"}, /* Enable lost clk , */\ - { 0x4880, "IESPKS"}, /* Enable speaker error , */\ - { 0x4890, "IEACS"}, /* Enable cold started , */\ - { 0x48a0, "IESWS"}, /* Enable amplifier engage , */\ - { 0x48b0, "IEWDS"}, /* Enable watchdog , */\ - { 0x48c0, "IEAMPS"}, /* Enable enbl amp , */\ - { 0x48d0, "IEAREFS"}, /* Enable ref enable , */\ - { 0x48e0, "IEADCCR"}, /* Enable Control ADC , */\ - { 0x48f0, "IEBODNOK"}, /* Enable BOD , */\ - { 0x4900, "IEBSTCU"}, /* Enable DCDC current limiting , */\ - { 0x4910, "IEBSTHI"}, /* Enable DCDC active , */\ - { 0x4920, "IEBSTOC"}, /* Enable DCDC OCP , */\ - { 0x4930, "IEBSTPC"}, /* Enable bst peakcur , */\ - { 0x4940, "IEBSTVC"}, /* Enable DCDC level 1x , */\ - { 0x4950, "IEBST86"}, /* Enable DCDC level 1.14x , */\ - { 0x4960, "IEBST93"}, /* Enable DCDC level 1.07x , */\ - { 0x4970, "IERCVLD"}, /* Enable rcvldop ready , */\ - { 0x4980, "IEOCPL"}, /* Enable ocp alarm left , */\ - { 0x4990, "IEOCPR"}, /* Enable ocp alarm , */\ - { 0x49a0, "IEMWSRC"}, /* Enable waits HW I2C settings , */\ - { 0x49b0, "IEMWCFC"}, /* Enable man wait cf config , */\ - { 0x49c0, "IEMWSMU"}, /* Enable man Audio mute sequence , */\ - { 0x49d0, "IECFMER"}, /* Enable cfma err , */\ - { 0x49e0, "IECFMAC"}, /* Enable cfma ack , */\ - { 0x49f0, "IECLKOOR"}, /* Enable flag_clk_out_of_range , */\ - { 0x4a00, "IETDMER"}, /* Enable tdm error , */\ - { 0x4a10, "IECLPL"}, /* Enable clip left , */\ - { 0x4a20, "IECLPR"}, /* Enable clip , */\ - { 0x4a30, "IEOCPM1"}, /* Enable mic ocpok , */\ - { 0x4a50, "IELP1"}, /* Enable low power mode1 , */\ - { 0x4a60, "IELA"}, /* Enable low amplitude detection , */\ - { 0x4a70, "IEVDDP"}, /* Enable VDDP greater than VBAT , */\ - { 0x4a80, "IETAPDET"}, /* Enable Tap detected , */\ - { 0x4a90, "IEAUDMOD"}, /* Enable Audio Mode activated , */\ - { 0x4aa0, "IESAMMOD"}, /* Enable SAM Mode activated , */\ - { 0x4ab0, "IETAPMOD"}, /* Enable Tap Mode Activated , */\ - { 0x4ac0, "IETAPTRG"}, /* Enable comparator interrupt , */\ - { 0x4c00, "IPOVDDS"}, /* Polarity por , */\ - { 0x4c10, "IPOPLLS"}, /* Polarity pll lock , */\ - { 0x4c20, "IPOOTDS"}, /* Polarity OTP alarm , */\ - { 0x4c30, "IPOOVDS"}, /* Polarity OVP alarm , */\ - { 0x4c40, "IPOUVDS"}, /* Polarity UVP alarm , */\ - { 0x4c50, "IPOCLKS"}, /* Polarity clocks stable , */\ - { 0x4c60, "IPOMTPB"}, /* Polarity mtp busy , */\ - { 0x4c70, "IPONOCLK"}, /* Polarity lost clk , */\ - { 0x4c80, "IPOSPKS"}, /* Polarity speaker error , */\ - { 0x4c90, "IPOACS"}, /* Polarity cold started , */\ - { 0x4ca0, "IPOSWS"}, /* Polarity amplifier engage , */\ - { 0x4cb0, "IPOWDS"}, /* Polarity watchdog , */\ - { 0x4cc0, "IPOAMPS"}, /* Polarity enbl amp , */\ - { 0x4cd0, "IPOAREFS"}, /* Polarity ref enable , */\ - { 0x4ce0, "IPOADCCR"}, /* Polarity Control ADC , */\ - { 0x4cf0, "IPOBODNOK"}, /* Polarity BOD , */\ - { 0x4d00, "IPOBSTCU"}, /* Polarity DCDC current limiting , */\ - { 0x4d10, "IPOBSTHI"}, /* Polarity DCDC active , */\ - { 0x4d20, "IPOBSTOC"}, /* Polarity DCDC OCP , */\ - { 0x4d30, "IPOBSTPC"}, /* Polarity bst peakcur , */\ - { 0x4d40, "IPOBSTVC"}, /* Polarity DCDC level 1x , */\ - { 0x4d50, "IPOBST86"}, /* Polarity DCDC level 1.14x , */\ - { 0x4d60, "IPOBST93"}, /* Polarity DCDC level 1.07x , */\ - { 0x4d70, "IPORCVLD"}, /* Polarity rcvldop ready , */\ - { 0x4d80, "IPOOCPL"}, /* Polarity ocp alarm left , */\ - { 0x4d90, "IPOOCPR"}, /* Polarity ocp alarm , */\ - { 0x4da0, "IPOMWSRC"}, /* Polarity waits HW I2C settings , */\ - { 0x4db0, "IPOMWCFC"}, /* Polarity man wait cf config , */\ - { 0x4dc0, "IPOMWSMU"}, /* Polarity man audio mute sequence , */\ - { 0x4dd0, "IPOCFMER"}, /* Polarity cfma err , */\ - { 0x4de0, "IPOCFMAC"}, /* Polarity cfma ack , */\ - { 0x4df0, "IPOCLKOOR"}, /* Polarity flag_clk_out_of_range , */\ - { 0x4e00, "IPOTDMER"}, /* Polarity tdm error , */\ - { 0x4e10, "IPOCLPL"}, /* Polarity clip left , */\ - { 0x4e20, "IPOCLPR"}, /* Polarity clip , */\ - { 0x4e30, "IPOOCPM"}, /* Polarity mic ocpok , */\ - { 0x4e50, "IPOLP1"}, /* Polarity low power mode1 , */\ - { 0x4e60, "IPOLA"}, /* Polarity low amplitude detection , */\ - { 0x4e70, "IPOVDDP"}, /* Polarity VDDP greater than VBAT , */\ - { 0x4e80, "IPOLTAPDET"}, /* PolarityTap detected , */\ - { 0x4e90, "IPOLAUDMOD"}, /* PolarityAudio Mode activated , */\ - { 0x4ea0, "IPOLSAMMOD"}, /* PolaritySAM Mode activated , */\ - { 0x4eb0, "IPOLTAPMOD"}, /* Polarity Tap Mode Activated , */\ - { 0x4ec0, "IPOLTAPTRG"}, /* PolarityTap Comparator Trigger , */\ - { 0x5001, "BSSCR"}, /* Battery Safeguard attack time , */\ - { 0x5023, "BSST"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "BSSRL"}, /* Battery Safeguard maximum reduction , */\ - { 0x5082, "BSSRR"}, /* Battery Safeguard release time , */\ - { 0x50b1, "BSSHY"}, /* Battery Safeguard hysteresis , */\ - { 0x50d0, "BSSAC"}, /* Reset clipper - Auto clear , */\ - { 0x50e0, "BSSR"}, /* Battery voltage read out , */\ - { 0x50f0, "BSSBY"}, /* Bypass HW clipper , */\ - { 0x5100, "BSSS"}, /* Vbat prot steepness , */\ - { 0x5110, "INTSMUTE"}, /* Soft mute HW , */\ - { 0x5120, "CFSML"}, /* Soft mute FW left , */\ - { 0x5130, "CFSM"}, /* Soft mute FW , */\ - { 0x5140, "HPFBYPL"}, /* Bypass HPF left , */\ - { 0x5150, "HPFBYP"}, /* Bypass HPF , */\ - { 0x5160, "DPSAL"}, /* Enable DPSA left , */\ - { 0x5170, "DPSA"}, /* Enable DPSA , */\ - { 0x5187, "VOL"}, /* FW volume control for primary audio channel , */\ - { 0x5200, "HNDSFRCV"}, /* Selection receiver , */\ - { 0x5222, "CLIPCTRL"}, /* Clip control setting , */\ - { 0x5257, "AMPGAIN"}, /* Amplifier gain , */\ - { 0x52d0, "SLOPEE"}, /* Enables slope control , */\ - { 0x52e0, "SLOPESET"}, /* Slope speed setting (bin. coded) , */\ - { 0x5c07, "CFTAPPAT"}, /* Coolflux tap pattern , */\ - { 0x5c83, "TAPDBGINFO"}, /* Reserved , */\ - { 0x5d0f, "TATPSTAT1"}, /* Tap Status 1 from CF FW , */\ - { 0x5f03, "TCOMPTHR"}, /* Comparator threshold (in uV) , */\ - { 0x6081, "PGAGAIN"}, /* PGA gain selection , */\ - { 0x6123, "TDMSPKG"}, /* System gain (INPLEV 0) , */\ - { 0x6505, "LPM1LVL"}, /* low power mode1 detector ctrl threshold for low_audio_lvl , */\ - { 0x6565, "LPM1HLD"}, /* Low power mode1 detector, ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x65c0, "LPM1DIS"}, /* low power mode1 detector control , */\ - { 0x6630, "DCDIS"}, /* DCDC , */\ - { 0x6801, "TDMSRCMAP"}, /* tdm source mapping , */\ - { 0x6821, "TDMSRCAS"}, /* frame a selection , */\ - { 0x6841, "TDMSRCBS"}, /* frame b selection , */\ - { 0x68a0, "ANC1C"}, /* ANC one s complement , */\ - { 0x6901, "SAMMODE"}, /* Sam mode , */\ - { 0x7033, "DCMCC"}, /* Max coil current , */\ - { 0x7071, "DCCV"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7090, "DCIE"}, /* Adaptive boost mode , */\ - { 0x70a0, "DCSR"}, /* Soft ramp up/down , */\ - { 0x70c1, "DCINSEL"}, /* DCDC IIR input Selection , */\ - { 0x70f0, "DCPWM"}, /* DCDC PWM only mode , */\ - { 0x7504, "DCTRIP"}, /* Adaptive boost trip levels 1, effective only when boost_intelligent is set to 1, */\ - { 0x7554, "DCTRIP2"}, /* Adaptive boost trip level 2, effective only when boost_intelligent is set to 1, */\ - { 0x75a4, "DCTRIPT"}, /* Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x7635, "DCVOF"}, /* First boost voltage level , */\ - { 0x7695, "DCVOS"}, /* Second boost voltage level , */\ - { 0x9000, "RST"}, /* Reset , */\ - { 0x9011, "DMEM"}, /* Target memory , */\ - { 0x9030, "AIF"}, /* Auto increment , */\ - { 0x9040, "CFINT"}, /* Interrupt - auto clear , */\ - { 0x9050, "CFCGATE"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "REQCMD"}, /* Firmware event request rpc command , */\ - { 0x9090, "REQRST"}, /* Firmware event request reset restart , */\ - { 0x90a0, "REQMIPS"}, /* Firmware event request short on mips , */\ - { 0x90b0, "REQMUTED"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "REQVOL"}, /* Firmware event request volume ready , */\ - { 0x90d0, "REQDMG"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "REQCAL"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "REQRSV"}, /* Firmware event request reserved , */\ - { 0x910f, "MADD"}, /* Memory address , */\ - { 0x920f, "MEMA"}, /* Activate memory access , */\ - { 0x9307, "ERR"}, /* Error flags , */\ - { 0x9380, "ACKCMD"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "ACKRST"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "ACKMIPS"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "ACKMUTED"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "ACKVOL"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "ACKDMG"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "ACKCAL"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "ACKRSV"}, /* Firmware event acknowledge reserved , */\ - { 0xa107, "MTPK"}, /* MTP KEY2 register , */\ - { 0xa200, "KEY1LOCKED"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "KEY2LOCKED"}, /* Indicates KEY2 is locked , */\ - { 0xa360, "CIMTP"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa50f, "MTPRDMSB"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "MTPRDLSB"}, /* LSB word of MTP manual read data , */\ - { 0xb108, "EXTTS"}, /* External temperature (C) , */\ - { 0xb190, "TROS"}, /* Select temp Speaker calibration , */\ - { 0xee0f, "SWPROFIL"}, /* Software profile data , */\ - { 0xef0f, "SWVSTEP"}, /* Software vstep information , */\ - { 0xf000, "MTPOTC"}, /* Calibration schedule , */\ - { 0xf010, "MTPEX"}, /* Calibration Ron executed , */\ - { 0xf020, "DCMCCAPI"}, /* Calibration current limit DCDC , */\ - { 0xf030, "DCMCCSB"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "DCMCCCL"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "USERDEF"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf40f, "R25C"}, /* Ron resistance of speaker coil , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -#define TFA9912_BITNAMETABLE static tfaBfName_t Tfa9912BitNames[] = {\ - { 0x0, "powerdown"}, /* Powerdown selection , */\ - { 0x10, "reset"}, /* I2C Reset - Auto clear , */\ - { 0x20, "enbl_coolflux"}, /* Enable CoolFlux , */\ - { 0x30, "enbl_amplifier"}, /* Enables the Amplifier , */\ - { 0x40, "enbl_boost"}, /* Activate DC-to-DC converter , */\ - { 0x50, "coolflux_configured"}, /* Coolflux configured , */\ - { 0x60, "sel_enbl_amplifier"}, /* CoolFlux controls amplifier , */\ - { 0x71, "int_pad_io"}, /* Interrupt config , */\ - { 0x90, "fs_pulse_sel"}, /* Audio sample reference , */\ - { 0xb0, "bypass_ocp"}, /* Bypass OCP , */\ - { 0xc0, "test_ocp"}, /* OCP testing control , */\ - { 0x101, "vamp_sel"}, /* Amplifier input selection , */\ - { 0x120, "src_set_configured"}, /* I2C configured , */\ - { 0x130, "execute_cold_start"}, /* Execute cold start , */\ - { 0x140, "enbl_fro8m_auto_off"}, /* Internal osc off at PWDN , */\ - { 0x150, "man_enbl_brown_out"}, /* Reaction on BOD , */\ - { 0x160, "enbl_bod"}, /* BOD Enable , */\ - { 0x170, "enbl_bod_hyst"}, /* BOD Hysteresis , */\ - { 0x181, "bod_delay"}, /* BOD filter , */\ - { 0x1a1, "bod_lvlsel"}, /* BOD threshold , */\ - { 0x1d0, "disable_mute_time_out"}, /* Time out SB mute sequence , */\ - { 0x1e0, "pwm_sel_rcv_ns"}, /* Noise shaper selection , */\ - { 0x1f0, "man_enbl_watchdog"}, /* Watchdog enable , */\ - { 0x203, "audio_fs"}, /* Sample rate (fs) , */\ - { 0x240, "input_level"}, /* TDM output attenuation , */\ - { 0x255, "cs_frac_delay"}, /* V/I Fractional delay , */\ - { 0x2b0, "bypass_hvbat_filter"}, /* Bypass HVBAT filter , */\ - { 0x2c0, "tdm_tfa9872_compatible"}, /* TDM Compatibility with TFA9872 , */\ - { 0x2d0, "sel_hysteresis"}, /* Select hysteresis for clock range detector , */\ - { 0x2e0, "enbl_adc10"}, /* ADC10 Enable - I2C direct mode , */\ - { 0x30f, "device_rev"}, /* Revision info , */\ - { 0x401, "pll_clkin_sel"}, /* PLL external ref clock , */\ - { 0x420, "pll_clkin_sel_osc"}, /* PLL internal ref clock , */\ - { 0x430, "cf_clock_scaling"}, /* Coolflux DSP clock scaling, low power mode , */\ - { 0x441, "sel_cf_clock"}, /* Coolflux DSP clock scaler selection for low power mode, */\ - { 0x460, "tdm_intf_sel"}, /* TDM clock selection , */\ - { 0x470, "disable_auto_sel_refclk"}, /* Disable Automatic dsp clock source selection , */\ - { 0x480, "sel_clk_src"}, /* I2C selection of DSP clock when auto select is disabled, */\ - { 0x490, "wdt_tim_clk_src"}, /* I2C selection of Watchdog and Timer clock , */\ - { 0x510, "enbl_spkr_ss"}, /* Enable speaker path , */\ - { 0x530, "enbl_volsense"}, /* Voltage sense , */\ - { 0x550, "enbl_cursense"}, /* Current sense , */\ - { 0x560, "enbl_pdm_ss"}, /* Sub-system PDM , */\ - { 0x580, "enbl_pga_chop"}, /* Enable PGA chop clock , */\ - { 0x590, "enbl_tdm_ss"}, /* Sub-system TDM , */\ - { 0x5a0, "enbl_bst_ss"}, /* Sub-system boost , */\ - { 0x5b0, "enbl_adc10_ss"}, /* Sub-system ADC , */\ - { 0x5c0, "enbl_faim_ss"}, /* Sub-system FAIM , */\ - { 0x5d0, "enbl_tim_clk"}, /* CF Sub-system timer , */\ - { 0x5e0, "enbl_wdt_clk"}, /* CF Sub-system WDT , */\ - { 0x5f0, "faim_enable_vbg"}, /* Over rule of vbg for FaIM access , */\ - { 0x600, "aux_spkr_sel"}, /* Input selection for TAP/SAM , */\ - { 0x620, "bypass_tapdec_reset"}, /* Tap decimator reset bypass - Bypass the decimator reset from tapdec, */\ - { 0x631, "car_dec_in_sel0"}, /* Cardec input 0 sel , */\ - { 0x651, "car_dec_in_sel1"}, /* Cardec input sel , */\ - { 0x670, "tapdec_sel"}, /* Select TAP/Cardec for TAP , */\ - { 0x680, "comp_count"}, /* Comparator o/p filter selection , */\ - { 0x691, "startup_mode"}, /* Startup Mode Selection , */\ - { 0x6b0, "enable_auto_tap_switching"}, /* Enable auto tap switching , */\ - { 0x6c1, "comp_init_time"}, /* Comparator initialization time to be used in Tap Machine, */\ - { 0x6e1, "ana_init_time"}, /* Analog initialization time to be used in Tap Machine, */\ - { 0x707, "clkchk_th_hi"}, /* Clock check Higher Threshold , */\ - { 0x787, "clkchk_th_lo"}, /* Clock check Higher Threshold , */\ - { 0x802, "ctrl_on2off_criterion"}, /* Amplifier on-off criteria for shutdown , */\ - { 0x832, "ctrl_on2tap_criterion"}, /* Amplifier on-off criteria for tap mode entry , */\ - { 0xd00, "side_tone_gain_sel"}, /* PDM side tone gain selector , */\ - { 0xd18, "side_tone_gain"}, /* Side tone gain , */\ - { 0xda0, "mute_side_tone"}, /* Side tone soft mute , */\ - { 0xdb0, "side_tone_1scomplement"}, /* side tone one s complement , */\ - { 0xe07, "ctrl_digtoana"}, /* Spare control from digital to analog , */\ - { 0xf0f, "hidden_code"}, /* 5A6Bh, 23147d to access registers (default for engineering), */\ - { 0x1000, "flag_por"}, /* POR , */\ - { 0x1010, "flag_pll_lock"}, /* PLL lock , */\ - { 0x1020, "flag_otpok"}, /* OTP alarm , */\ - { 0x1030, "flag_ovpok"}, /* OVP alarm , */\ - { 0x1040, "flag_uvpok"}, /* UVP alarm , */\ - { 0x1050, "flag_clocks_stable"}, /* Clocks stable , */\ - { 0x1060, "flag_mtp_busy"}, /* MTP busy , */\ - { 0x1070, "flag_lost_clk"}, /* Lost clock , */\ - { 0x1090, "flag_cold_started"}, /* Cold Start , */\ - { 0x10a0, "flag_engage"}, /* Amplifier engage , */\ - { 0x10b0, "flag_watchdog_reset"}, /* Watchdog , */\ - { 0x10c0, "flag_enbl_amp"}, /* Amplifier enable , */\ - { 0x10d0, "flag_enbl_ref"}, /* References enable , */\ - { 0x10e0, "flag_adc10_ready"}, /* Control ADC , */\ - { 0x10f0, "flag_bod_vddd_nok"}, /* BOD , */\ - { 0x1100, "flag_bst_bstcur"}, /* DCDC current limiting , */\ - { 0x1110, "flag_bst_hiz"}, /* DCDC active , */\ - { 0x1120, "flag_bst_ocpok"}, /* DCDC OCP nmos , */\ - { 0x1130, "flag_bst_peakcur"}, /* Indicates current is max in DC-to-DC converter , */\ - { 0x1140, "flag_bst_voutcomp"}, /* DCDC level 1x , */\ - { 0x1150, "flag_bst_voutcomp86"}, /* DCDC level 1.14x , */\ - { 0x1160, "flag_bst_voutcomp93"}, /* DCDC level 1.07x , */\ - { 0x1170, "flag_soft_mute_busy"}, /* side tone (un)mute busy , */\ - { 0x1180, "flag_soft_mute_state"}, /* side tone mute state , */\ - { 0x1190, "flag_tdm_lut_error"}, /* TDM LUT error , */\ - { 0x11a2, "flag_tdm_status"}, /* TDM status bits , */\ - { 0x11d0, "flag_tdm_error"}, /* TDM error , */\ - { 0x1300, "flag_ocpokap"}, /* OCPOK pmos A , */\ - { 0x1310, "flag_ocpokan"}, /* OCPOK nmos A , */\ - { 0x1320, "flag_ocpokbp"}, /* OCPOK pmos B , */\ - { 0x1330, "flag_ocpokbn"}, /* OCPOK nmos B , */\ - { 0x1340, "flag_clipa_high"}, /* Clipping A to Vddp , */\ - { 0x1350, "flag_clipa_low"}, /* Clipping A to gnd , */\ - { 0x1360, "flag_clipb_high"}, /* Clipping B to Vddp , */\ - { 0x1370, "flag_clipb_low"}, /* Clipping B to gnd , */\ - { 0x1380, "flag_ocp_alarm"}, /* OCP amplifier , */\ - { 0x1390, "flag_clip"}, /* Amplifier clipping , */\ - { 0x13a0, "flag_tap_comp_trig"}, /* Status Tap comparator triggered , */\ - { 0x13b0, "flag_cf_tapdetected"}, /* Status Tap detected , */\ - { 0x13c0, "flag_man_wait_src_settings"}, /* Wait HW I2C settings , */\ - { 0x13d0, "flag_man_wait_cf_config"}, /* Wait CF config , */\ - { 0x13e0, "flag_man_start_mute_audio"}, /* Audio mute sequence , */\ - { 0x1410, "flag_cf_speakererror"}, /* Speaker status , */\ - { 0x1420, "flag_clk_out_of_range"}, /* External clock status , */\ - { 0x1433, "man_state"}, /* Device manager status , */\ - { 0x1471, "status_bst_mode"}, /* DCDC mode status bits , */\ - { 0x1490, "man_dsp_clk_src"}, /* DSP clock source selected by manager , */\ - { 0x14a1, "man_startup_mode"}, /* Startup Mode Selected by Manager(Read Only) , */\ - { 0x14c3, "tap_machine_state"}, /* Tap Machine State , */\ - { 0x1509, "bat_adc"}, /* Battery voltage (V) , */\ - { 0x1608, "temp_adc"}, /* IC Temperature (C) , */\ - { 0x1709, "vddp_adc"}, /* IC VDDP voltage ( 1023*VDDP/13 V) , */\ - { 0x17a0, "flag_bst_bstcur_cf"}, /* DCDC current limiting for DSP , */\ - { 0x2000, "tdm_usecase"}, /* Mode setting , */\ - { 0x2011, "dio4_input_sel"}, /* DIO4 Input selection , */\ - { 0x2040, "tdm_enable"}, /* Enable TDM interface , */\ - { 0x2060, "tdm_clk_inversion"}, /* Reception data to BCK clock , */\ - { 0x2073, "tdm_fs_ws_length"}, /* FS length , */\ - { 0x20b0, "tdm_fs_ws_polarity"}, /* FS polarity , */\ - { 0x20c3, "tdm_nbck"}, /* N-BCK's in FS , */\ - { 0x2103, "tdm_nb_of_slots"}, /* N-slots in Frame , */\ - { 0x2144, "tdm_slot_length"}, /* N-bits in slot , */\ - { 0x2194, "tdm_bits_remaining"}, /* N-bits remaining , */\ - { 0x21e0, "tdm_data_delay"}, /* data delay to FS , */\ - { 0x21f0, "tdm_data_adjustment"}, /* data adjustment , */\ - { 0x2201, "tdm_audio_sample_compression"}, /* Received audio compression , */\ - { 0x2224, "tdm_sample_size"}, /* Sample size per slot , */\ - { 0x2271, "tdm_txdata_format"}, /* Format unused bits in a slot , */\ - { 0x2291, "tdm_txdata_format_unused_slot_sd0"}, /* Format unused slots GAINIO , */\ - { 0x22b1, "tdm_txdata_format_unused_slot_sd1"}, /* Format unused slots DIO1 , */\ - { 0x22d1, "tdm_txdata_format_unused_slot_sd2"}, /* Format unused slots DIO2 , */\ - { 0x2300, "tdm_sink0_enable"}, /* Control gain (channel in 0) , */\ - { 0x2310, "tdm_sink1_enable"}, /* Control audio left (channel in 1 ) , */\ - { 0x2320, "tdm_sink2_enable"}, /* Control audio right (channel in 2 ) , */\ - { 0x2330, "tdm_source0_enable"}, /* Current sense , */\ - { 0x2340, "tdm_source1_enable"}, /* Voltage sense , */\ - { 0x2350, "tdm_source2_enable"}, /* DSP Gainout , */\ - { 0x2360, "tdm_source3_enable"}, /* DSP 2 , */\ - { 0x2370, "tdm_source4_enable"}, /* DSP 3 , */\ - { 0x2380, "tdm_source5_enable"}, /* DSP , */\ - { 0x2390, "tdm_source6_enable"}, /* Loopback of Audio left (channel 1) , */\ - { 0x23a0, "tdm_source7_enable"}, /* Loopback of Audio right (channel 2) , */\ - { 0x2401, "tdm_sink0_io"}, /* IO gainin , */\ - { 0x2421, "tdm_sink1_io"}, /* IO audio left , */\ - { 0x2441, "tdm_sink2_io"}, /* IO audio right , */\ - { 0x2461, "tdm_source0_io"}, /* IO Current Sense , */\ - { 0x2481, "tdm_source1_io"}, /* IO voltage sense , */\ - { 0x24a1, "tdm_source2_io"}, /* IO gain out , */\ - { 0x24c1, "tdm_source3_io"}, /* IO DSP 2 , */\ - { 0x24e1, "tdm_source4_io"}, /* IO DSP 3 , */\ - { 0x2501, "tdm_source5_io"}, /* IO DSP , */\ - { 0x2521, "tdm_source6_io"}, /* IO Source 6 , */\ - { 0x2541, "tdm_source7_io"}, /* IO Source 7 , */\ - { 0x2603, "tdm_sink0_slot"}, /* Control gainin , */\ - { 0x2643, "tdm_sink1_slot"}, /* tdm slot for audio left (channel 1) , */\ - { 0x2683, "tdm_sink2_slot"}, /* tdm slot for audio right (channel 2) , */\ - { 0x26c3, "tdm_source0_slot"}, /* Slot Position of Current Sense Out , */\ - { 0x2703, "tdm_source1_slot"}, /* Slot Position of Voltage sense , */\ - { 0x2743, "tdm_source2_slot"}, /* Slot Position of GAIN out , */\ - { 0x2783, "tdm_source3_slot"}, /* Slot Position DSPout2 , */\ - { 0x27c3, "tdm_source4_slot"}, /* Slot Position DSPout3 , */\ - { 0x2803, "tdm_source5_slot"}, /* Slot Position of DSPout , */\ - { 0x2843, "tdm_source6_slot"}, /* Slot Position of loopback channel left , */\ - { 0x2883, "tdm_source7_slot"}, /* Slot Position of loopback channel right , */\ - { 0x2901, "tdm_txdata_format_unused_slot_sd3"}, /* Format unused slots D3 , */\ - { 0x3100, "pdm_mode"}, /* PDM control , */\ - { 0x3110, "pdm_input_sel"}, /* PDM Decimator input selection , */\ - { 0x3120, "enbl_pdm_side_tone"}, /* Side tone input enable , */\ - { 0x3201, "pdm_nbck"}, /* PDM BCK/Fs ratio , */\ - { 0x4000, "int_out_flag_por"}, /* Status POR , */\ - { 0x4010, "int_out_flag_pll_lock"}, /* Status PLL lock , */\ - { 0x4020, "int_out_flag_otpok"}, /* Status OTP alarm , */\ - { 0x4030, "int_out_flag_ovpok"}, /* Status OVP alarm , */\ - { 0x4040, "int_out_flag_uvpok"}, /* Status UVP alarm , */\ - { 0x4050, "int_out_flag_clocks_stable"}, /* Status clocks stable , */\ - { 0x4060, "int_out_flag_mtp_busy"}, /* Status MTP busy , */\ - { 0x4070, "int_out_flag_lost_clk"}, /* Status lost clock , */\ - { 0x4080, "int_out_flag_cf_speakererror"}, /* Status speaker error , */\ - { 0x4090, "int_out_flag_cold_started"}, /* Status cold start , */\ - { 0x40a0, "int_out_flag_engage"}, /* Status amplifier engage , */\ - { 0x40b0, "int_out_flag_watchdog_reset"}, /* Status watchdog , */\ - { 0x40c0, "int_out_flag_enbl_amp"}, /* Status amplifier enable , */\ - { 0x40d0, "int_out_flag_enbl_ref"}, /* Status Ref enable , */\ - { 0x40e0, "int_out_flag_adc10_ready"}, /* Status Control ADC , */\ - { 0x40f0, "int_out_flag_bod_vddd_nok"}, /* Status BOD , */\ - { 0x4100, "int_out_flag_bst_bstcur"}, /* Status DCDC current limiting , */\ - { 0x4110, "int_out_flag_bst_hiz"}, /* Status DCDC active , */\ - { 0x4120, "int_out_flag_bst_ocpok"}, /* Status DCDC OCP , */\ - { 0x4130, "int_out_flag_bst_peakcur"}, /* Status bst peakcur , */\ - { 0x4140, "int_out_flag_bst_voutcomp"}, /* Status DCDC level 1x , */\ - { 0x4150, "int_out_flag_bst_voutcomp86"}, /* Status DCDC level 1.14x , */\ - { 0x4160, "int_out_flag_bst_voutcomp93"}, /* Status DCDC level 1.07x , */\ - { 0x4190, "int_out_flag_ocp_alarm"}, /* Status ocp alarm , */\ - { 0x41a0, "int_out_flag_man_wait_src_settings"}, /* Status Waits HW I2C settings , */\ - { 0x41b0, "int_out_flag_man_wait_cf_config"}, /* Status waits CF config , */\ - { 0x41c0, "int_out_flag_man_start_mute_audio"}, /* Status Audio mute sequence , */\ - { 0x41d0, "int_out_flag_cfma_err"}, /* Status cfma error , */\ - { 0x41e0, "int_out_flag_cfma_ack"}, /* Status cfma ack , */\ - { 0x41f0, "int_out_flag_clk_out_of_range"}, /* Status flag_clk_out_of_range , */\ - { 0x4200, "int_out_flag_tdm_error"}, /* Status tdm error , */\ - { 0x4220, "int_out_flag_clip"}, /* Status clip , */\ - { 0x4250, "int_out_flag_lp_detect_mode1"}, /* Status low power mode1 , */\ - { 0x4260, "int_out_flag_low_amplitude"}, /* Status low amplitude detection , */\ - { 0x4270, "int_out_flag_vddp_gt_vbat"}, /* Status VDDP greater than VBAT , */\ - { 0x4280, "int_out_newtap"}, /* Status Tap detected , */\ - { 0x4290, "int_out_audiomodeactive"}, /* Status Audio Mode activated , */\ - { 0x42a0, "int_out_sammodeactive"}, /* Status SAM Mode activated , */\ - { 0x42b0, "int_out_tapmodeactive"}, /* Status Tap Mode Activated , */\ - { 0x42c0, "int_out_flag_tap_comp_trig"}, /* Status Tap comparator triggered , */\ - { 0x4400, "int_in_flag_por"}, /* Clear POR , */\ - { 0x4410, "int_in_flag_pll_lock"}, /* Clear PLL lock , */\ - { 0x4420, "int_in_flag_otpok"}, /* Clear OTP alarm , */\ - { 0x4430, "int_in_flag_ovpok"}, /* Clear OVP alarm , */\ - { 0x4440, "int_in_flag_uvpok"}, /* Clear UVP alarm , */\ - { 0x4450, "int_in_flag_clocks_stable"}, /* Clear clocks stable , */\ - { 0x4460, "int_in_flag_mtp_busy"}, /* Clear mtp busy , */\ - { 0x4470, "int_in_flag_lost_clk"}, /* Clear lost clk , */\ - { 0x4480, "int_in_flag_cf_speakererror"}, /* Clear speaker error , */\ - { 0x4490, "int_in_flag_cold_started"}, /* Clear cold started , */\ - { 0x44a0, "int_in_flag_engage"}, /* Clear amplifier engage , */\ - { 0x44b0, "int_in_flag_watchdog_reset"}, /* Clear watchdog , */\ - { 0x44c0, "int_in_flag_enbl_amp"}, /* Clear enbl amp , */\ - { 0x44d0, "int_in_flag_enbl_ref"}, /* Clear ref enable , */\ - { 0x44e0, "int_in_flag_adc10_ready"}, /* Clear control ADC , */\ - { 0x44f0, "int_in_flag_bod_vddd_nok"}, /* Clear BOD , */\ - { 0x4500, "int_in_flag_bst_bstcur"}, /* Clear DCDC current limiting , */\ - { 0x4510, "int_in_flag_bst_hiz"}, /* Clear DCDC active , */\ - { 0x4520, "int_in_flag_bst_ocpok"}, /* Clear DCDC OCP , */\ - { 0x4530, "int_in_flag_bst_peakcur"}, /* Clear bst peakcur , */\ - { 0x4540, "int_in_flag_bst_voutcomp"}, /* Clear DCDC level 1x , */\ - { 0x4550, "int_in_flag_bst_voutcomp86"}, /* Clear DCDC level 1.14x , */\ - { 0x4560, "int_in_flag_bst_voutcomp93"}, /* Clear DCDC level 1.07x , */\ - { 0x4590, "int_in_flag_ocp_alarm"}, /* Clear ocp alarm , */\ - { 0x45a0, "int_in_flag_man_wait_src_settings"}, /* Clear wait HW I2C settings , */\ - { 0x45b0, "int_in_flag_man_wait_cf_config"}, /* Clear wait cf config , */\ - { 0x45c0, "int_in_flag_man_start_mute_audio"}, /* Clear audio mute sequence , */\ - { 0x45d0, "int_in_flag_cfma_err"}, /* Clear cfma err , */\ - { 0x45e0, "int_in_flag_cfma_ack"}, /* Clear cfma ack , */\ - { 0x45f0, "int_in_flag_clk_out_of_range"}, /* Clear flag_clk_out_of_range , */\ - { 0x4600, "int_in_flag_tdm_error"}, /* Clear tdm error , */\ - { 0x4620, "int_in_flag_clip"}, /* Clear clip , */\ - { 0x4650, "int_in_flag_lp_detect_mode1"}, /* Clear low power mode1 , */\ - { 0x4660, "int_in_flag_low_amplitude"}, /* Clear low amplitude detection , */\ - { 0x4670, "int_in_flag_vddp_gt_vbat"}, /* Clear VDDP greater then VBAT , */\ - { 0x4680, "int_in_newtap"}, /* Clear Tap detected , */\ - { 0x4690, "int_in_audiomodeactive"}, /* Clear Audio Mode activated , */\ - { 0x46a0, "int_in_sammodeactive"}, /* Clear SAM Mode activated , */\ - { 0x46b0, "int_in_tapmodeactive"}, /* Clear Tap Mode Activated , */\ - { 0x46c0, "int_in_flag_tap_comp_trig"}, /* Clear Comparator Interrupt , */\ - { 0x4800, "int_enable_flag_por"}, /* Enable por , */\ - { 0x4810, "int_enable_flag_pll_lock"}, /* Enable pll lock , */\ - { 0x4820, "int_enable_flag_otpok"}, /* Enable OTP alarm , */\ - { 0x4830, "int_enable_flag_ovpok"}, /* Enable OVP alarm , */\ - { 0x4840, "int_enable_flag_uvpok"}, /* Enable UVP alarm , */\ - { 0x4850, "int_enable_flag_clocks_stable"}, /* Enable clocks stable , */\ - { 0x4860, "int_enable_flag_mtp_busy"}, /* Enable mtp busy , */\ - { 0x4870, "int_enable_flag_lost_clk"}, /* Enable lost clk , */\ - { 0x4880, "int_enable_flag_cf_speakererror"}, /* Enable speaker error , */\ - { 0x4890, "int_enable_flag_cold_started"}, /* Enable cold started , */\ - { 0x48a0, "int_enable_flag_engage"}, /* Enable amplifier engage , */\ - { 0x48b0, "int_enable_flag_watchdog_reset"}, /* Enable watchdog , */\ - { 0x48c0, "int_enable_flag_enbl_amp"}, /* Enable enbl amp , */\ - { 0x48d0, "int_enable_flag_enbl_ref"}, /* Enable ref enable , */\ - { 0x48e0, "int_enable_flag_adc10_ready"}, /* Enable Control ADC , */\ - { 0x48f0, "int_enable_flag_bod_vddd_nok"}, /* Enable BOD , */\ - { 0x4900, "int_enable_flag_bst_bstcur"}, /* Enable DCDC current limiting , */\ - { 0x4910, "int_enable_flag_bst_hiz"}, /* Enable DCDC active , */\ - { 0x4920, "int_enable_flag_bst_ocpok"}, /* Enable DCDC OCP , */\ - { 0x4930, "int_enable_flag_bst_peakcur"}, /* Enable bst peakcur , */\ - { 0x4940, "int_enable_flag_bst_voutcomp"}, /* Enable DCDC level 1x , */\ - { 0x4950, "int_enable_flag_bst_voutcomp86"}, /* Enable DCDC level 1.14x , */\ - { 0x4960, "int_enable_flag_bst_voutcomp93"}, /* Enable DCDC level 1.07x , */\ - { 0x4990, "int_enable_flag_ocp_alarm"}, /* Enable ocp alarm , */\ - { 0x49a0, "int_enable_flag_man_wait_src_settings"}, /* Enable waits HW I2C settings , */\ - { 0x49b0, "int_enable_flag_man_wait_cf_config"}, /* Enable man wait cf config , */\ - { 0x49c0, "int_enable_flag_man_start_mute_audio"}, /* Enable man Audio mute sequence , */\ - { 0x49d0, "int_enable_flag_cfma_err"}, /* Enable cfma err , */\ - { 0x49e0, "int_enable_flag_cfma_ack"}, /* Enable cfma ack , */\ - { 0x49f0, "int_enable_flag_clk_out_of_range"}, /* Enable flag_clk_out_of_range , */\ - { 0x4a00, "int_enable_flag_tdm_error"}, /* Enable tdm error , */\ - { 0x4a20, "int_enable_flag_clip"}, /* Enable clip , */\ - { 0x4a50, "int_enable_flag_lp_detect_mode1"}, /* Enable low power mode1 , */\ - { 0x4a60, "int_enable_flag_low_amplitude"}, /* Enable low amplitude detection , */\ - { 0x4a70, "int_enable_flag_vddp_gt_vbat"}, /* Enable VDDP greater than VBAT , */\ - { 0x4a80, "int_enable_newtap"}, /* Enable Tap detected , */\ - { 0x4a90, "int_enable_audiomodeactive"}, /* Enable Audio Mode activated , */\ - { 0x4aa0, "int_enable_sammodeactive"}, /* Enable SAM Mode activated , */\ - { 0x4ab0, "int_enable_tapmodeactive"}, /* Enable Tap Mode Activated , */\ - { 0x4ac0, "int_enable_flag_tap_comp_trig"}, /* Enable comparator interrupt , */\ - { 0x4c00, "int_polarity_flag_por"}, /* Polarity por , */\ - { 0x4c10, "int_polarity_flag_pll_lock"}, /* Polarity pll lock , */\ - { 0x4c20, "int_polarity_flag_otpok"}, /* Polarity OTP alarm , */\ - { 0x4c30, "int_polarity_flag_ovpok"}, /* Polarity OVP alarm , */\ - { 0x4c40, "int_polarity_flag_uvpok"}, /* Polarity UVP alarm , */\ - { 0x4c50, "int_polarity_flag_clocks_stable"}, /* Polarity clocks stable , */\ - { 0x4c60, "int_polarity_flag_mtp_busy"}, /* Polarity mtp busy , */\ - { 0x4c70, "int_polarity_flag_lost_clk"}, /* Polarity lost clk , */\ - { 0x4c80, "int_polarity_flag_cf_speakererror"}, /* Polarity speaker error , */\ - { 0x4c90, "int_polarity_flag_cold_started"}, /* Polarity cold started , */\ - { 0x4ca0, "int_polarity_flag_engage"}, /* Polarity amplifier engage , */\ - { 0x4cb0, "int_polarity_flag_watchdog_reset"}, /* Polarity watchdog , */\ - { 0x4cc0, "int_polarity_flag_enbl_amp"}, /* Polarity enbl amp , */\ - { 0x4cd0, "int_polarity_flag_enbl_ref"}, /* Polarity ref enable , */\ - { 0x4ce0, "int_polarity_flag_adc10_ready"}, /* Polarity Control ADC , */\ - { 0x4cf0, "int_polarity_flag_bod_vddd_nok"}, /* Polarity BOD , */\ - { 0x4d00, "int_polarity_flag_bst_bstcur"}, /* Polarity DCDC current limiting , */\ - { 0x4d10, "int_polarity_flag_bst_hiz"}, /* Polarity DCDC active , */\ - { 0x4d20, "int_polarity_flag_bst_ocpok"}, /* Polarity DCDC OCP , */\ - { 0x4d30, "int_polarity_flag_bst_peakcur"}, /* Polarity bst peakcur , */\ - { 0x4d40, "int_polarity_flag_bst_voutcomp"}, /* Polarity DCDC level 1x , */\ - { 0x4d50, "int_polarity_flag_bst_voutcomp86"}, /* Polarity DCDC level 1.14x , */\ - { 0x4d60, "int_polarity_flag_bst_voutcomp93"}, /* Polarity DCDC level 1.07x , */\ - { 0x4d90, "int_polarity_flag_ocp_alarm"}, /* Polarity ocp alarm , */\ - { 0x4da0, "int_polarity_flag_man_wait_src_settings"}, /* Polarity waits HW I2C settings , */\ - { 0x4db0, "int_polarity_flag_man_wait_cf_config"}, /* Polarity man wait cf config , */\ - { 0x4dc0, "int_polarity_flag_man_start_mute_audio"}, /* Polarity man audio mute sequence , */\ - { 0x4dd0, "int_polarity_flag_cfma_err"}, /* Polarity cfma err , */\ - { 0x4de0, "int_polarity_flag_cfma_ack"}, /* Polarity cfma ack , */\ - { 0x4df0, "int_polarity_flag_clk_out_of_range"}, /* Polarity flag_clk_out_of_range , */\ - { 0x4e00, "int_polarity_flag_tdm_error"}, /* Polarity tdm error , */\ - { 0x4e20, "int_polarity_flag_clip"}, /* Polarity clip , */\ - { 0x4e50, "int_polarity_flag_lp_detect_mode1"}, /* Polarity low power mode1 , */\ - { 0x4e60, "int_polarity_flag_low_amplitude"}, /* Polarity low amplitude detection , */\ - { 0x4e70, "int_polarity_flag_vddp_gt_vbat"}, /* Polarity VDDP greater than VBAT , */\ - { 0x4e80, "int_polarity_newtap"}, /* PolarityTap detected , */\ - { 0x4e90, "int_polarity_audiomodeactive"}, /* PolarityAudio Mode activated , */\ - { 0x4ea0, "int_polarity_sammodeactive"}, /* PolaritySAM Mode activated , */\ - { 0x4eb0, "int_polarity_tapmodeactive"}, /* Polarity Tap Mode Activated , */\ - { 0x4ec0, "int_polarity_flag_tap_comp_trig"}, /* PolarityTap Comparator Trigger , */\ - { 0x5001, "vbat_prot_attack_time"}, /* Battery Safeguard attack time , */\ - { 0x5023, "vbat_prot_thlevel"}, /* Battery Safeguard threshold voltage level , */\ - { 0x5061, "vbat_prot_max_reduct"}, /* Battery Safeguard maximum reduction , */\ - { 0x5082, "vbat_prot_release_time"}, /* Battery Safeguard release time , */\ - { 0x50b1, "vbat_prot_hysterese"}, /* Battery Safeguard hysteresis , */\ - { 0x50d0, "rst_min_vbat"}, /* Reset clipper - Auto clear , */\ - { 0x50e0, "sel_vbat"}, /* Battery voltage read out , */\ - { 0x50f0, "bypass_clipper"}, /* Bypass HW clipper , */\ - { 0x5100, "batsense_steepness"}, /* Vbat prot steepness , */\ - { 0x5110, "soft_mute"}, /* Soft mute HW , */\ - { 0x5130, "cf_mute"}, /* Soft mute FW , */\ - { 0x5150, "bypass_hp"}, /* Bypass HPF , */\ - { 0x5170, "enbl_dpsa"}, /* Enable DPSA , */\ - { 0x5187, "cf_volume"}, /* FW volume control for primary audio channel , */\ - { 0x5222, "ctrl_cc"}, /* Clip control setting , */\ - { 0x5257, "gain"}, /* Amplifier gain , */\ - { 0x52d0, "ctrl_slopectrl"}, /* Enables slope control , */\ - { 0x52e0, "ctrl_slope"}, /* Slope speed setting (bin. coded) , */\ - { 0x5301, "dpsa_level"}, /* DPSA threshold levels , */\ - { 0x5321, "dpsa_release"}, /* DPSA Release time , */\ - { 0x5340, "clipfast"}, /* Clock selection for HW clipper for Battery Safeguard, */\ - { 0x5350, "bypass_lp"}, /* Bypass the low power filter inside temperature sensor, */\ - { 0x5360, "enbl_low_latency"}, /* CF low latency outputs for add module , */\ - { 0x5400, "first_order_mode"}, /* Overrule to 1st order mode of control stage when clipping, */\ - { 0x5410, "bypass_ctrlloop"}, /* Switch amplifier into open loop configuration , */\ - { 0x5430, "icomp_engage"}, /* Engage of icomp , */\ - { 0x5440, "ctrl_kickback"}, /* Prevent double pulses of output stage , */\ - { 0x5450, "icomp_engage_overrule"}, /* To overrule the functional icomp_engage signal during validation, */\ - { 0x5503, "ctrl_dem"}, /* Enable DEM icomp and DEM one bit dac , */\ - { 0x5543, "ctrl_dem_mismatch"}, /* Enable DEM icomp mismatch for testing , */\ - { 0x5582, "dpsa_drive"}, /* Drive setting (bin. coded) - I2C direct mode , */\ - { 0x570a, "enbl_amp"}, /* Switch on the class-D power sections, each part of the analog sections can be switched on/off individually , */\ - { 0x57b0, "enbl_engage"}, /* Enables/engage power stage and control loop - I2C direct mode, */\ - { 0x57c0, "enbl_engage_pst"}, /* Enables/engage power stage and control loop , */\ - { 0x5810, "hard_mute"}, /* Hard mute - PWM , */\ - { 0x5820, "pwm_shape"}, /* PWM shape , */\ - { 0x5844, "pwm_delay"}, /* PWM delay bits to set the delay, clock is 1/(k*2048*fs), */\ - { 0x5890, "reclock_pwm"}, /* Reclock the pwm signal inside analog , */\ - { 0x58a0, "reclock_voltsense"}, /* Reclock the voltage sense pwm signal , */\ - { 0x58c0, "enbl_pwm_phase_shift"}, /* Control for pwm phase shift , */\ - { 0x5c07, "flag_cf_tap_pattern"}, /* Coolflux tap pattern , */\ - { 0x5c83, "tap_debug_info"}, /* Reserved , */\ - { 0x5d0f, "tap_status_1"}, /* Tap Status 1 from CF FW , */\ - { 0x5f03, "tap_comp_threshold"}, /* Comparator threshold (in uV) , */\ - { 0x6081, "pga_gain_set"}, /* PGA gain selection , */\ - { 0x60b0, "pga_lowpass_enable"}, /* Lowpass enable , */\ - { 0x60c0, "pga_pwr_enable"}, /* PGA power enable , */\ - { 0x60d0, "pga_switch_enable"}, /* PGA switch enable , */\ - { 0x60e0, "pga_switch_aux_enable"}, /* Switch enable aux , */\ - { 0x6123, "ctrl_att"}, /* System gain (INPLEV 0) , */\ - { 0x6265, "zero_lvl"}, /* ctrl threshold for zero X-ing , */\ - { 0x62c1, "ctrl_fb_resistor"}, /* Select amplifier feedback resistor connection , */\ - { 0x62e1, "lownoisegain_mode"}, /* ctrl select mode , */\ - { 0x6305, "threshold_lvl"}, /* ctrl threshold for low_audio_lvl , */\ - { 0x6365, "hold_time"}, /* ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x6405, "lpm1_cal_offset"}, /* low power mode1 detector ctrl cal_offset from gain module , */\ - { 0x6465, "lpm1_zero_lvl"}, /* low power mode1 detector ctrl threshold for zero X-ing , */\ - { 0x64e1, "lpm1_mode"}, /* low power mode1 detector ctrl select mode , */\ - { 0x6505, "lpm1_threshold_lvl"}, /* low power mode1 detector ctrl threshold for low_audio_lvl , */\ - { 0x6565, "lpm1_hold_time"}, /* Low power mode1 detector, ctrl hold time before low audio is reckoned to be low audio, */\ - { 0x65c0, "disable_low_power_mode"}, /* low power mode1 detector control , */\ - { 0x6600, "dcdc_pfm20khz_limit"}, /* DCDC in PFM mode pwm mode is activated each 50us to force a pwm pulse, */\ - { 0x6611, "dcdc_ctrl_maxzercnt"}, /* DCDC. Number of zero current flags to count before going to pfm mode, */\ - { 0x6630, "dcdcoff_mode"}, /* DCDC , */\ - { 0x6656, "dcdc_vbat_delta_detect"}, /* Threshold before booster is reacting on a delta Vbat (in PFM mode) by temporarily switching to PWM mode, */\ - { 0x66c0, "dcdc_ignore_vbat"}, /* Ignore an increase on Vbat , */\ - { 0x6700, "enbl_minion"}, /* Enables minion (small) power stage - direct ctrl , */\ - { 0x6713, "vth_vddpvbat"}, /* select vddp-vbat thres signal , */\ - { 0x6750, "lpen_vddpvbat"}, /* select vddp-vbat filtered vs unfiltered compare , */\ - { 0x6761, "ctrl_rfb"}, /* Feedback resistor selection - I2C direct mode , */\ - { 0x6801, "tdm_source_mapping"}, /* tdm source mapping , */\ - { 0x6821, "tdm_sourcea_frame_sel"}, /* frame a selection , */\ - { 0x6841, "tdm_sourceb_frame_sel"}, /* frame b selection , */\ - { 0x6901, "sam_mode"}, /* Sam mode , */\ - { 0x6931, "pdmdat_h_sel"}, /* pdm out value when pdm_clk is higth , */\ - { 0x6951, "pdmdat_l_sel"}, /* pdm out value when pdm_clk is low , */\ - { 0x6970, "cs_sam_set"}, /* Enable SAM input for current sense - I2C Direct Mode, */\ - { 0x6980, "cs_adc_nortz"}, /* Return to zero for current sense ADC , */\ - { 0x6990, "sam_spkr_sel"}, /* SAM o/p sel during SAM and audio , */\ - { 0x6b00, "disable_engage"}, /* Disable auto engage , */\ - { 0x6c02, "ns_hp2ln_criterion"}, /* 0..7 zeroes at ns as threshold to swap from high_power to low_noise, */\ - { 0x6c32, "ns_ln2hp_criterion"}, /* 0..7 zeroes at ns as threshold to swap from low_noise to high_power, */\ - { 0x6c60, "sel_clip_pwms"}, /* To select clip-flags , */\ - { 0x6c72, "pwms_clip_lvl"}, /* To set the amount of pwm pulse that may be skipped before clip-flag is triggered. , */\ - { 0x6ca5, "spare_out"}, /* spare_out , */\ - { 0x6d0f, "spare_in"}, /* spare_in , */\ - { 0x6e10, "flag_lp_detect_mode1"}, /* low power mode 1 detection , */\ - { 0x6e20, "flag_low_amplitude"}, /* low amplitude detection , */\ - { 0x6e30, "flag_vddp_gt_vbat"}, /* vddp greater than vbat , */\ - { 0x7033, "boost_cur"}, /* Max coil current , */\ - { 0x7071, "bst_slpcmplvl"}, /* Slope compensation current, represents LxF (inductance x frequency) value , */\ - { 0x7090, "boost_intel"}, /* Adaptive boost mode , */\ - { 0x70a0, "boost_speed"}, /* Soft ramp up/down , */\ - { 0x70c1, "dcdc_sel"}, /* DCDC IIR input Selection , */\ - { 0x70f0, "dcdc_pwmonly"}, /* DCDC PWM only mode , */\ - { 0x7104, "bst_drive"}, /* Binary coded drive setting for boost converter power stage, */\ - { 0x7151, "bst_scalecur"}, /* For testing direct control scale current , */\ - { 0x7174, "bst_slopecur"}, /* For testing direct control slope current - I2C direct mode, */\ - { 0x71c1, "bst_slope"}, /* Boost slope speed , */\ - { 0x71e0, "bst_bypass_bstcur"}, /* Bypass control for boost current settings , */\ - { 0x71f0, "bst_bypass_bstfoldback"}, /* Bypass control for boost foldback , */\ - { 0x7200, "enbl_bst_engage"}, /* Enable power stage dcdc controller - I2C direct mode, */\ - { 0x7210, "enbl_bst_hizcom"}, /* Enable hiz comparator - I2C direct mode , */\ - { 0x7220, "enbl_bst_peak2avg"}, /* Enable boost peak2avg functionality , */\ - { 0x7230, "enbl_bst_peakcur"}, /* Enable peak current - I2C direct mode , */\ - { 0x7240, "enbl_bst_power"}, /* Enable line of the powerstage - I2C direct mode , */\ - { 0x7250, "enbl_bst_slopecur"}, /* Enable bit of max-current dac - I2C direct mode , */\ - { 0x7260, "enbl_bst_voutcomp"}, /* Enable vout comparators - I2C direct mode , */\ - { 0x7270, "enbl_bst_voutcomp86"}, /* Enable vout-86 comparators - I2C direct mode , */\ - { 0x7280, "enbl_bst_voutcomp93"}, /* Enable vout-93 comparators - I2C direct mode , */\ - { 0x7290, "enbl_bst_windac"}, /* Enable window dac - I2C direct mode , */\ - { 0x72a5, "bst_windac"}, /* for testing direct control windac - I2C direct mode, */\ - { 0x7300, "boost_alg"}, /* Control for boost adaptive loop gain , */\ - { 0x7311, "boost_loopgain"}, /* DCDC boost loopgain setting , */\ - { 0x7331, "bst_freq"}, /* DCDC boost frequency control , */\ - { 0x7430, "boost_track"}, /* Boost algorithm selection, effective only when boost_intelligent is set to 1, */\ - { 0x7494, "boost_hold_time"}, /* Hold time for DCDC booster, effective only when boost_intelligent is set to 1, */\ - { 0x74e0, "sel_dcdc_envelope_8fs"}, /* Selection of data for adaptive boost algorithm, effective only when boost_intelligent is set to 1, */\ - { 0x74f0, "ignore_flag_voutcomp86"}, /* Ignore flag_voutcomp86 , */\ - { 0x7504, "boost_trip_lvl_1st"}, /* Adaptive boost trip levels 1, effective only when boost_intelligent is set to 1, */\ - { 0x7554, "boost_trip_lvl_2nd"}, /* Adaptive boost trip level 2, effective only when boost_intelligent is set to 1, */\ - { 0x75a4, "boost_trip_lvl_track"}, /* Adaptive boost trip levels, effective only when boost_intelligent is set to 1, */\ - { 0x7602, "track_decay"}, /* DCDC Boost decay speed after a peak value, effective only when boost_track is set to 1, */\ - { 0x7635, "frst_boost_voltage"}, /* First boost voltage level , */\ - { 0x7695, "scnd_boost_voltage"}, /* Second boost voltage level , */\ - { 0x7720, "pga_test_ldo_bypass"}, /* bypass internal PGA LDO , */\ - { 0x8001, "sel_clk_cs"}, /* Current sense clock duty cycle control , */\ - { 0x8021, "micadc_speed"}, /* Current sense clock for MiCADC selection - 32/44.1/48 KHz Fs band only, */\ - { 0x8050, "cs_gain_control"}, /* Current sense gain control , */\ - { 0x8060, "cs_bypass_gc"}, /* Bypasses the CS gain correction , */\ - { 0x8087, "cs_gain"}, /* Current sense gain , */\ - { 0x8200, "enbl_cmfb"}, /* Current sense common mode feedback control , */\ - { 0x8210, "invertpwm"}, /* Current sense common mode feedback pwm invert control, */\ - { 0x8222, "cmfb_gain"}, /* Current sense common mode feedback control gain , */\ - { 0x8256, "cmfb_offset"}, /* Current sense common mode feedback control offset , */\ - { 0x8305, "cs_ktemp"}, /* First order temperature compensation coefficient , */\ - { 0x8364, "cs_ktemp2"}, /* Second order temperature compensation coefficient , */\ - { 0x8400, "cs_adc_bsoinv"}, /* Bitstream inversion for current sense ADC , */\ - { 0x8421, "cs_adc_hifreq"}, /* Frequency mode current sense ADC , */\ - { 0x8453, "cs_adc_offset"}, /* Micadc ADC offset setting , */\ - { 0x8490, "cs_adc_slowdel"}, /* Select delay for current sense ADC (internal decision circuitry), */\ - { 0x84a4, "cs_adc_gain"}, /* Gain setting for current sense ADC (two's complement), */\ - { 0x8500, "cs_resonator_enable"}, /* Enable for resonator to improve SRN , */\ - { 0x8510, "cs_classd_tran_skip"}, /* Skip current sense connection during a classD amplifier transition, */\ - { 0x8530, "cs_inn_short"}, /* Short current sense negative to common mode , */\ - { 0x8540, "cs_inp_short"}, /* Short current sense positive to common mode , */\ - { 0x8550, "cs_ldo_bypass"}, /* Bypass current sense LDO , */\ - { 0x8560, "cs_ldo_pulldown"}, /* Pull down current sense LDO, only valid if left_enbl_cs_ldo is high, */\ - { 0x8574, "cs_ldo_voset"}, /* Current sense LDO voltage level setting (two's complement), */\ - { 0x8700, "enbl_cs_adc"}, /* Enable current sense ADC - I2C direct mode , */\ - { 0x8710, "enbl_cs_inn1"}, /* Enable connection of current sense negative1 - I2C direct mode, */\ - { 0x8720, "enbl_cs_inn2"}, /* Enable connection of current sense negative2 - I2C direct mode, */\ - { 0x8730, "enbl_cs_inp1"}, /* Enable connection of current sense positive1 , */\ - { 0x8740, "enbl_cs_inp2"}, /* Enable connection of current sense positive2 - I2C direct mode, */\ - { 0x8750, "enbl_cs_ldo"}, /* Enable current sense LDO - I2C direct mode , */\ - { 0x8760, "enbl_cs_nofloating_n"}, /* Connect current sense negative to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8770, "enbl_cs_nofloating_p"}, /* Connect current sense positive to gnda at transitions of booster or classd amplifiers. Otherwise floating (0), */\ - { 0x8780, "enbl_cs_vbatldo"}, /* Enable of current sense LDO -- I2C direct mode , */\ - { 0x8800, "volsense_pwm_sel"}, /* Voltage sense PWM source selection control , */\ - { 0x8810, "vol_cur_sense_dc_offset"}, /* voltage and current sense decimator offset control, */\ - { 0x8902, "cursense_comp_delay"}, /* To align compensation signal with current sense signal, */\ - { 0x8930, "cursense_comp_sign"}, /* To change polarity of compensation for current sense compensation, */\ - { 0x8940, "enbl_cursense_comp"}, /* To enable current sense compensation , */\ - { 0x9000, "cf_rst_dsp"}, /* Reset , */\ - { 0x9011, "cf_dmem"}, /* Target memory , */\ - { 0x9030, "cf_aif"}, /* Auto increment , */\ - { 0x9040, "cf_int"}, /* Interrupt - auto clear , */\ - { 0x9050, "cf_cgate_off"}, /* Coolflux clock gating disabling control , */\ - { 0x9080, "cf_req_cmd"}, /* Firmware event request rpc command , */\ - { 0x9090, "cf_req_reset"}, /* Firmware event request reset restart , */\ - { 0x90a0, "cf_req_mips"}, /* Firmware event request short on mips , */\ - { 0x90b0, "cf_req_mute_ready"}, /* Firmware event request mute sequence ready , */\ - { 0x90c0, "cf_req_volume_ready"}, /* Firmware event request volume ready , */\ - { 0x90d0, "cf_req_damage"}, /* Firmware event request speaker damage detected , */\ - { 0x90e0, "cf_req_calibrate_ready"}, /* Firmware event request calibration completed , */\ - { 0x90f0, "cf_req_reserved"}, /* Firmware event request reserved , */\ - { 0x910f, "cf_madd"}, /* Memory address , */\ - { 0x920f, "cf_mema"}, /* Activate memory access , */\ - { 0x9307, "cf_err"}, /* Error flags , */\ - { 0x9380, "cf_ack_cmd"}, /* Firmware event acknowledge rpc command , */\ - { 0x9390, "cf_ack_reset"}, /* Firmware event acknowledge reset restart , */\ - { 0x93a0, "cf_ack_mips"}, /* Firmware event acknowledge short on mips , */\ - { 0x93b0, "cf_ack_mute_ready"}, /* Firmware event acknowledge mute sequence ready , */\ - { 0x93c0, "cf_ack_volume_ready"}, /* Firmware event acknowledge volume ready , */\ - { 0x93d0, "cf_ack_damage"}, /* Firmware event acknowledge speaker damage detected, */\ - { 0x93e0, "cf_ack_calibrate_ready"}, /* Firmware event acknowledge calibration completed , */\ - { 0x93f0, "cf_ack_reserved"}, /* Firmware event acknowledge reserved , */\ - { 0xa007, "mtpkey1"}, /* 5Ah, 90d To access KEY1_Protected registers (Default for engineering), */\ - { 0xa107, "mtpkey2"}, /* MTP KEY2 register , */\ - { 0xa200, "key01_locked"}, /* Indicates KEY1 is locked , */\ - { 0xa210, "key02_locked"}, /* Indicates KEY2 is locked , */\ - { 0xa302, "mtp_man_address_in"}, /* MTP address from I2C register for read/writing mtp in manual single word mode, */\ - { 0xa330, "man_copy_mtp_to_iic"}, /* Start copying single word from mtp to I2C mtp register, */\ - { 0xa340, "man_copy_iic_to_mtp"}, /* Start copying single word from I2C mtp register to mtp, */\ - { 0xa350, "auto_copy_mtp_to_iic"}, /* Start copying all the data from mtp to I2C mtp registers, */\ - { 0xa360, "auto_copy_iic_to_mtp"}, /* Start copying data from I2C mtp registers to mtp , */\ - { 0xa400, "faim_set_clkws"}, /* Sets the FaIM controller clock wait state register, */\ - { 0xa410, "faim_sel_evenrows"}, /* All even rows of the FaIM are selected, active high, */\ - { 0xa420, "faim_sel_oddrows"}, /* All odd rows of the FaIM are selected, all rows in combination with sel_evenrows, */\ - { 0xa430, "faim_program_only"}, /* Skip the erase access at wr_faim command (write-program-marginread), */\ - { 0xa440, "faim_erase_only"}, /* Skip the program access at wr_faim command (write-erase-marginread), */\ - { 0xa50f, "mtp_man_data_out_msb"}, /* MSB word of MTP manual read data , */\ - { 0xa60f, "mtp_man_data_out_lsb"}, /* LSB word of MTP manual read data , */\ - { 0xa70f, "mtp_man_data_in_msb"}, /* MSB word of write data for MTP manual write , */\ - { 0xa80f, "mtp_man_data_in_lsb"}, /* LSB word of write data for MTP manual write , */\ - { 0xb010, "bypass_ocpcounter"}, /* Bypass OCP Counter , */\ - { 0xb020, "bypass_glitchfilter"}, /* Bypass glitch filter , */\ - { 0xb030, "bypass_ovp"}, /* Bypass OVP , */\ - { 0xb040, "bypass_uvp"}, /* Bypass UVP , */\ - { 0xb050, "bypass_otp"}, /* Bypass OTP , */\ - { 0xb060, "bypass_lost_clk"}, /* Bypass lost clock detector , */\ - { 0xb070, "ctrl_vpalarm"}, /* vpalarm (uvp ovp handling) , */\ - { 0xb087, "ocp_threshold"}, /* OCP threshold level , */\ - { 0xb108, "ext_temp"}, /* External temperature (C) , */\ - { 0xb190, "ext_temp_sel"}, /* Select temp Speaker calibration , */\ - { 0xc000, "use_direct_ctrls"}, /* Direct control to overrule several functions for testing, */\ - { 0xc010, "rst_datapath"}, /* Direct control for datapath reset , */\ - { 0xc020, "rst_cgu"}, /* Direct control for cgu reset , */\ - { 0xc038, "enbl_ref"}, /* Switch on the analog references, each part of the references can be switched on/off individually - - I2C direct mode, */\ - { 0xc0d0, "enbl_ringo"}, /* Enable the ring oscillator for test purpose , */\ - { 0xc0e0, "use_direct_clk_ctrl"}, /* Direct clock control to overrule several functions for testing, */\ - { 0xc0f0, "use_direct_pll_ctrl"}, /* Direct PLL control to overrule several functions for testing, */\ - { 0xc100, "enbl_tsense"}, /* Temperature sensor enable control - I2C direct mode, */\ - { 0xc110, "tsense_hibias"}, /* Bit to set the biasing in temp sensor to high - I2C direct mode, */\ - { 0xc120, "enbl_flag_vbg"}, /* Enable flagging of bandgap out of control , */\ - { 0xc130, "tap_comp_enable"}, /* Tap Comparator enable control - I2C direct mode , */\ - { 0xc140, "tap_comp_switch_enable"}, /* Tap Comparator Switch enable control - I2C direct mode, */\ - { 0xc150, "tap_comp_switch_aux_enable"}, /* Tap Comparator Switch enable control - I2C direct mode, */\ - { 0xc161, "tap_comp_test_enable"}, /* Comparator threshold - fine value , */\ - { 0xc180, "curdist_enable"}, /* Enable control - I2C direct mode , */\ - { 0xc190, "vbg2i_enbl"}, /* Enable control - I2C direct mode , */\ - { 0xc1a0, "bg_filt_bypass_enbl"}, /* Enable control , */\ - { 0xc20f, "abist_offset"}, /* Offset control for ABIST testing (two's complement), */\ - { 0xc300, "bypasslatch"}, /* Bypass latch , */\ - { 0xc311, "sourcea"}, /* Set OUTA to , */\ - { 0xc331, "sourceb"}, /* Set OUTB to , */\ - { 0xc350, "inverta"}, /* Invert pwma test signal , */\ - { 0xc360, "invertb"}, /* Invert pwmb test signal , */\ - { 0xc374, "pulselength"}, /* Pulse length setting test input for amplifier (clock d - k*2048*fs), */\ - { 0xc3c0, "tdm_enable_loopback"}, /* TDM loopback test , */\ - { 0xc3d0, "test_abistfft_enbl"}, /* FFT Coolflux , */\ - { 0xc3e0, "test_pwr_switch"}, /* Test mode for digital power switches core sw/mem sw/micvdd sw, */\ - { 0xc400, "bst_bypasslatch"}, /* Bypass latch in boost converter , */\ - { 0xc411, "bst_source"}, /* Sets the source of the pwmbst output to boost converter input for testing, */\ - { 0xc430, "bst_invertb"}, /* Invert pwmbst test signal , */\ - { 0xc444, "bst_pulselength"}, /* Pulse length setting test input for boost converter , */\ - { 0xc490, "test_bst_ctrlsthv"}, /* Test mode for boost control stage , */\ - { 0xc4a0, "test_bst_iddq"}, /* IDDQ testing in power stage of boost converter , */\ - { 0xc4b0, "test_bst_rdson"}, /* RDSON testing - boost power stage , */\ - { 0xc4c0, "test_bst_cvi"}, /* CVI testing - boost power stage , */\ - { 0xc4d0, "test_bst_ocp"}, /* Boost OCP. For old ocp (ctrl_reversebst is 0), For new ocp (ctrl_reversebst is 1), */\ - { 0xc4e0, "test_bst_sense"}, /* Test option for the sense NMOS in booster for current mode control., */\ - { 0xc500, "test_cvi"}, /* Analog BIST, switch choose which transistor will be used as current source (also cross coupled sources possible), */\ - { 0xc510, "test_discrete"}, /* Test function noise measurement , */\ - { 0xc520, "test_iddq"}, /* Set the power stages in iddq mode for gate stress., */\ - { 0xc540, "test_rdson"}, /* Analog BIST, switch to enable Rdson measurement , */\ - { 0xc550, "test_sdelta"}, /* Analog BIST, noise test , */\ - { 0xc560, "bypass_fro8"}, /* Bypass fro8 with pdm_clk , */\ - { 0xc570, "test_enbl_cs"}, /* Enable for digimux mode of current sense , */\ - { 0xc5b0, "pga_test_enable"}, /* Enable PGA test mode , */\ - { 0xc5c0, "pga_test_offset_enable"}, /* Enable PGA test offset , */\ - { 0xc5d0, "pga_test_shortinput_enable"}, /* Enable PGA test short input , */\ - { 0xc600, "enbl_pwm_dcc"}, /* Enables direct control of pwm duty cycle for DCDC power stage, */\ - { 0xc613, "pwm_dcc_cnt"}, /* Control pwm duty cycle when enbl_pwm_dcc is 1 , */\ - { 0xc650, "enbl_ldo_stress"}, /* Enable stress of internal supply voltages powerstages, */\ - { 0xc660, "enbl_powerswitch"}, /* Vddd core power switch control - overrules the manager control, */\ - { 0xc707, "digimuxa_sel"}, /* DigimuxA input selection control routed to DIO4 (see Digimux list for details), */\ - { 0xc787, "digimuxb_sel"}, /* DigimuxB input selection control routed to DIO3 (see Digimux list for details), */\ - { 0xc807, "digimuxc_sel"}, /* DigimuxC input selection control routed to TDO (see Digimux list for details), */\ - { 0xc901, "dio1_ehs"}, /* Speed/load setting for DIO1 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc921, "dio2_ehs"}, /* Speed/load setting for DIO2 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc941, "dio3_ehs"}, /* Speed/load setting for DIO3 cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc961, "dio4_ehs"}, /* Speed/load setting for DIO4 IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc981, "spdmo_ehs"}, /* Speed/load setting for PDMO IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9a1, "tdo_ehs"}, /* Speed/load setting for TDM IO cell, clk or data mode range (see SLIMMF IO cell datasheet), */\ - { 0xc9c0, "int_ehs"}, /* Slew Rate INT IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ - { 0xc9d0, "pdmclk_ehs"}, /* Slew RateBCK2/PDMCLK IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ - { 0xc9e0, "fs2_ehs"}, /* Slew Rate DS2 IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ - { 0xc9f0, "hs_mode"}, /* I2C high speed mode control , */\ - { 0xca00, "enbl_anamux1"}, /* Enable anamux1 , */\ - { 0xca10, "enbl_anamux2"}, /* Enable anamux2 , */\ - { 0xca20, "enbl_anamux3"}, /* Enable anamux3 , */\ - { 0xca30, "enbl_anamux4"}, /* Enable anamux4 , */\ - { 0xca74, "anamux1"}, /* Anamux selection control - anamux on TEST1 , */\ - { 0xcb04, "anamux2"}, /* Anamux selection control - anamux on TEST2 , */\ - { 0xcb54, "anamux3"}, /* Anamux selection control - anamux on TEST3 , */\ - { 0xcba4, "anamux4"}, /* Anamux selection control - anamux on TEST4 , */\ - { 0xcc05, "pll_seli_lbw"}, /* PLL SELI - Low B/W PLL control mode or I2C direct PLL control mode only, */\ - { 0xcc64, "pll_selp_lbw"}, /* PLL SELP - Low B/W PLL control mode or I2C direct PLL control mode only, */\ - { 0xccb3, "pll_selr_lbw"}, /* PLL SELR - Low B/W PLL control mode or I2C direct PLL control mode only, */\ - { 0xccf0, "sel_user_pll_bw"}, /* PLL Low Bandwidth Mode control , */\ - { 0xcdf0, "pll_frm"}, /* PLL free running mode control; 1 in TCB direct control mode, else this control bit, */\ - { 0xce09, "pll_ndec"}, /* PLL NDEC - I2C direct PLL control mode only , */\ - { 0xcea0, "pll_mdec_msb"}, /* MSB of pll_mdec - I2C direct PLL control mode only, */\ - { 0xceb0, "enbl_pll"}, /* Enables PLL in I2C direct PLL control mode only , */\ - { 0xcec0, "enbl_fro8"}, /* Enables FRO8M in I2C direct control mode only , */\ - { 0xced0, "pll_bypass"}, /* PLL bypass control in I2C direct PLL control mode only, */\ - { 0xcee0, "pll_directi"}, /* PLL directi control in I2C direct PLL control mode only, */\ - { 0xcef0, "pll_directo"}, /* PLL directo control in I2C direct PLL control mode only, */\ - { 0xcf0f, "pll_mdec_lsb"}, /* Bits 15..0 of PLL MDEC are I2C direct PLL control mode only, */\ - { 0xd006, "pll_pdec"}, /* PLL PDEC - I2C direct PLL control mode only , */\ - { 0xd10f, "tsig_freq_lsb"}, /* Internal sinus test generator frequency control , */\ - { 0xd202, "tsig_freq_msb"}, /* Select internal sinus test generator, frequency control msb bits, */\ - { 0xd230, "inject_tsig"}, /* Control bit to switch to internal sinus test generator, */\ - { 0xd283, "tsig_gain"}, /* Test signal gain , */\ - { 0xd300, "adc10_reset"}, /* Reset for ADC10 - I2C direct control mode , */\ - { 0xd311, "adc10_test"}, /* Test mode selection signal for ADC10 - I2C direct control mode, */\ - { 0xd332, "adc10_sel"}, /* Select the input to convert for ADC10 - I2C direct control mode, */\ - { 0xd364, "adc10_prog_sample"}, /* ADC10 program sample setting - I2C direct control mode, */\ - { 0xd3b0, "adc10_enbl"}, /* Enable ADC10 - I2C direct control mode , */\ - { 0xd3c0, "bypass_lp_vbat"}, /* Bypass control for Low pass filter in batt sensor , */\ - { 0xd409, "data_adc10_tempbat"}, /* ADC 10 data output data for testing , */\ - { 0xd507, "ctrl_digtoana_hidden"}, /* Spare digital to analog control bits - Hidden , */\ - { 0xd580, "enbl_clk_range_chk"}, /* Clock out of range , */\ - { 0xd601, "clkdiv_dsp_sel"}, /* DSP clock divider selection in direct clock control mode, */\ - { 0xd621, "clkdiv_audio_sel"}, /* Audio clock divider selection in direct clock control mode, */\ - { 0xd641, "clkdiv_muxa_sel"}, /* DCDC MUXA clock divider selection in direct clock control mode, */\ - { 0xd661, "clkdiv_muxb_sel"}, /* DCDC MUXB clock divider selection in direct clock control mode, */\ - { 0xd681, "dsp_tap_clk"}, /* Dsp clock frequency selection in TAP mode; , */\ - { 0xd6a1, "sel_wdt_clk"}, /* Watch dog clock post divider value , */\ - { 0xd6c1, "sel_tim_clk"}, /* Timer clock post divider value , */\ - { 0xd700, "ads1_ehs"}, /* Slew Rate ADS1 IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ - { 0xd710, "ads2_ehs"}, /* Slew Rate ADS2 IO cell, clk or data mode range (see IIC3V3 IO cell datasheet), */\ - { 0xd822, "test_parametric_io"}, /* test io parametric , */\ - { 0xd850, "ctrl_bst_clk_lp1"}, /* boost clock control in low power mode1 , */\ - { 0xd861, "test_spare_out1"}, /* test spare out 1 , */\ - { 0xd880, "bst_dcmbst"}, /* dcm boost - I2C direct mode , */\ - { 0xd8a1, "force_pga_clock"}, /* force pga clock , */\ - { 0xd8c3, "test_spare_out2"}, /* test spare out 1 , */\ - { 0xd900, "overrules_usercase"}, /* Overrule Mode control use , */\ - { 0xd910, "ovr_switch_ref"}, /* Overrule Value , */\ - { 0xd920, "ovr_enbl_pll"}, /* Overrule Value , */\ - { 0xd930, "ovr_switch_amp"}, /* Overrule Value , */\ - { 0xd940, "ovr_enbl_clk_cs"}, /* Overrule Value , */\ - { 0xd951, "ovr_sel_clk_cs"}, /* CS clock selection overrule , */\ - { 0xd970, "ovr_switch_cs"}, /* Overrule Value , */\ - { 0xd980, "ovr_enbl_csvs_ss"}, /* Overrule Value , */\ - { 0xd990, "ovr_enbl_comp"}, /* Overrule Value , */\ - { 0xed00, "enbl_fro8cal"}, /* Enable FRO calibration , */\ - { 0xed10, "start_fro8_calibration"}, /* Start FRO8 Calibration , */\ - { 0xed20, "fro8_calibration_done"}, /* FRO8 Calibration done - Read Only , */\ - { 0xed45, "fro8_auto_trim_val"}, /* Calibration value from Auto Calibration block, to be written into MTP - Read Only, */\ - { 0xee0f, "sw_profile"}, /* Software profile data , */\ - { 0xef0f, "sw_vstep"}, /* Software vstep information , */\ - { 0xf000, "calibration_onetime"}, /* Calibration schedule , */\ - { 0xf010, "calibr_ron_done"}, /* Calibration Ron executed , */\ - { 0xf020, "calibr_dcdc_api_calibrate"}, /* Calibration current limit DCDC , */\ - { 0xf030, "calibr_dcdc_delta_sign"}, /* Sign bit for delta calibration current limit DCDC , */\ - { 0xf042, "calibr_dcdc_delta"}, /* Calibration delta current limit DCDC , */\ - { 0xf078, "calibr_speaker_info"}, /* Reserved space for allowing customer to store speaker information, */\ - { 0xf105, "calibr_vout_offset"}, /* DCDC offset calibration 2's complement (key1 protected), */\ - { 0xf163, "spare_mtp1_9_6"}, /* HW gain module - left channel (2's complement) , */\ - { 0xf1a5, "spare_mtp1_15_10"}, /* Offset for amplifier, HW gain module - left channel (2's complement), */\ - { 0xf203, "calibr_gain"}, /* HW gain module (2's complement) , */\ - { 0xf245, "calibr_offset"}, /* Offset for amplifier, HW gain module (2's complement), */\ - { 0xf2a3, "spare_mtp2_13_10"}, /* Trimming of LDO (2.7V) , */\ - { 0xf307, "spare_mtp3_7_0"}, /* SPARE , */\ - { 0xf387, "calibr_gain_cs"}, /* Current sense gain (signed two's complement format), */\ - { 0xf40f, "calibr_R25C"}, /* Ron resistance of speaker coil , */\ - { 0xf50f, "spare_mtp5_15_0"}, /* SPARE , */\ - { 0xf600, "mtp_lock_enbl_coolflux"}, /* Disable function dcdcoff_mode , */\ - { 0xf610, "mtp_pwm_delay_enbl_clk_auto_gating"}, /* Auto clock gating on pwm_delay , */\ - { 0xf620, "mtp_ocp_enbl_clk_auto_gating"}, /* Auto clock gating on module ocp , */\ - { 0xf630, "mtp_disable_clk_a_gating"}, /* Disable clock_a gating , */\ - { 0xf642, "spare_mtp6_6_3"}, /* SPARE , */\ - { 0xf686, "spare_mtp6_14_8"}, /* Offset of left amplifier level shifter B , */\ - { 0xf706, "ctrl_offset_a"}, /* Offset of level shifter A , */\ - { 0xf786, "ctrl_offset_b"}, /* Offset of amplifier level shifter B , */\ - { 0xf806, "htol_iic_addr"}, /* 7-bit I2C address to be used during HTOL testing , */\ - { 0xf870, "htol_iic_addr_en"}, /* HTOL I2C address enable control , */\ - { 0xf884, "calibr_temp_offset"}, /* Temperature offset 2's compliment (key1 protected), */\ - { 0xf8d2, "calibr_temp_gain"}, /* Temperature gain 2's compliment (key1 protected) , */\ - { 0xf910, "disable_sam_mode"}, /* Disable sam mode , */\ - { 0xf920, "mtp_lock_bypass_clipper"}, /* Disable function bypass_clipper , */\ - { 0xf930, "mtp_lock_max_dcdc_voltage"}, /* Disable programming of max dcdc boost voltage , */\ - { 0xf943, "calibr_vbg_trim"}, /* Bandgap trimming control , */\ - { 0xf987, "type_bits_fw"}, /* MTP-control FW - See Firmware I2C API document for details, */\ - { 0xfa0f, "mtpdataA"}, /* MTPdataA (key1 protected) , */\ - { 0xfb0f, "mtpdataB"}, /* MTPdataB (key1 protected) , */\ - { 0xfc0f, "mtpdataC"}, /* MTPdataC (key1 protected) , */\ - { 0xfd0f, "mtpdataD"}, /* MTPdataD (key1 protected) , */\ - { 0xfe0f, "mtpdataE"}, /* MTPdataE (key1 protected) , */\ - { 0xff05, "fro8_trim"}, /* 8 MHz oscillator trim code , */\ - { 0xff61, "fro8_short_nwell_r"}, /* Short 4 or 6 n-well resistors , */\ - { 0xff81, "fro8_boost_i"}, /* Self bias current selection , */\ - { 0xffff, "Unknown bitfield enum" } /* not found */\ -}; - -enum tfa9912_irq { - tfa9912_irq_stvdds = 0, - tfa9912_irq_stplls = 1, - tfa9912_irq_stotds = 2, - tfa9912_irq_stovds = 3, - tfa9912_irq_stuvds = 4, - tfa9912_irq_stclks = 5, - tfa9912_irq_stmtpb = 6, - tfa9912_irq_stnoclk = 7, - tfa9912_irq_stspks = 8, - tfa9912_irq_stacs = 9, - tfa9912_irq_stsws = 10, - tfa9912_irq_stwds = 11, - tfa9912_irq_stamps = 12, - tfa9912_irq_starefs = 13, - tfa9912_irq_stadccr = 14, - tfa9912_irq_stbodnok = 15, - tfa9912_irq_stbstcu = 16, - tfa9912_irq_stbsthi = 17, - tfa9912_irq_stbstoc = 18, - tfa9912_irq_stbstpkcur = 19, - tfa9912_irq_stbstvc = 20, - tfa9912_irq_stbst86 = 21, - tfa9912_irq_stbst93 = 22, - tfa9912_irq_strcvld = 23, - tfa9912_irq_stocpl = 24, - tfa9912_irq_stocpr = 25, - tfa9912_irq_stmwsrc = 26, - tfa9912_irq_stmwcfc = 27, - tfa9912_irq_stmwsmu = 28, - tfa9912_irq_stcfmer = 29, - tfa9912_irq_stcfmac = 30, - tfa9912_irq_stclkoor = 31, - tfa9912_irq_sttdmer = 32, - tfa9912_irq_stclpl = 33, - tfa9912_irq_stclpr = 34, - tfa9912_irq_stocpm = 35, - tfa9912_irq_stlp1 = 37, - tfa9912_irq_stla = 38, - tfa9912_irq_stvddp = 39, - tfa9912_irq_sttapdet = 40, - tfa9912_irq_staudmod = 41, - tfa9912_irq_stsammod = 42, - tfa9912_irq_sttapmod = 43, - tfa9912_irq_sttaptrg = 44, - tfa9912_irq_max = 45, - tfa9912_irq_all = -1 /* all irqs */}; - -#define TFA9912_IRQ_NAMETABLE static tfaIrqName_t Tfa9912IrqNames[] = {\ - { 0, "STVDDS"},\ - { 1, "STPLLS"},\ - { 2, "STOTDS"},\ - { 3, "STOVDS"},\ - { 4, "STUVDS"},\ - { 5, "STCLKS"},\ - { 6, "STMTPB"},\ - { 7, "STNOCLK"},\ - { 8, "STSPKS"},\ - { 9, "STACS"},\ - { 10, "STSWS"},\ - { 11, "STWDS"},\ - { 12, "STAMPS"},\ - { 13, "STAREFS"},\ - { 14, "STADCCR"},\ - { 15, "STBODNOK"},\ - { 16, "STBSTCU"},\ - { 17, "STBSTHI"},\ - { 18, "STBSTOC"},\ - { 19, "STBSTPKCUR"},\ - { 20, "STBSTVC"},\ - { 21, "STBST86"},\ - { 22, "STBST93"},\ - { 23, "STRCVLD"},\ - { 24, "STOCPL"},\ - { 25, "STOCPR"},\ - { 26, "STMWSRC"},\ - { 27, "STMWCFC"},\ - { 28, "STMWSMU"},\ - { 29, "STCFMER"},\ - { 30, "STCFMAC"},\ - { 31, "STCLKOOR"},\ - { 32, "STTDMER"},\ - { 33, "STCLPL"},\ - { 34, "STCLPR"},\ - { 35, "STOCPM"},\ - { 36, "36"},\ - { 37, "STLP1"},\ - { 38, "STLA"},\ - { 39, "STVDDP"},\ - { 40, "STTAPDET"},\ - { 41, "STAUDMOD"},\ - { 42, "STSAMMOD"},\ - { 43, "STTAPMOD"},\ - { 44, "STTAPTRG"},\ - { 45, "45"},\ -}; -#endif /* _TFA9912_TFAFIELDNAMES_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_container.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_container.h deleted file mode 100644 index 578cebb3535c..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_container.h +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/* - * tfaContainer.h - * - * Created on: Sep 11, 2013 - * Author: wim - */ - -#ifndef TFACONTAINER_H_ -#define TFACONTAINER_H_ - -/* static limits */ -#define TFACONT_MAXDEVS (4) /* maximum nr of devices */ -#define TFACONT_MAXPROFS (16) /* maximum nr of profiles */ - -#include "tfa98xx_parameters.h" - -/** -* Pass the container buffer, initialize and allocate internal memory. -* -* @param cnt pointer to the start of the buffer holding the container file -* @param length of the data in bytes -* @return -* - tfa_error_ok if normal -* - tfa_error_container invalid container data -* - tfa_error_bad_param invalid parameter -* -*/ -enum tfa_error tfa_load_cnt(void *cnt, int length); - -/** - * Return the descriptor string - * @param cnt pointer to the container struct - * @param dsc pointer to Tfa descriptor - * @return descriptor string - */ -char *tfaContGetString(TfaContainer_t *cnt, TfaDescPtr_t *dsc); - -/** - * Gets the string for the given command type number - * @param type number representing a command - * @return string of a command - */ -char *tfaContGetCommandString(uint32_t type); - -/** - * get the device type from the patch in this devicelist - * - find the patch file for this devidx - * - return the devid from the patch or 0 if not found - * @param cnt pointer to container file - * @param dev_idx device index - * @return descriptor string - */ -int tfa_cnt_get_devid(TfaContainer_t *cnt, int dev_idx); - -/** - * Get the slave for the device if it exists. - * @param tfa the device struct pointer - * @param slave_addr the index of the device - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContGetSlave(struct tfa_device *tfa, uint8_t *slave_addr); - -void tfaContSetSlave(uint8_t slave_addr); - -/** - * Get the index for a skave address. - * @param tfa the device struct pointer - * @return the device index - */ -int tfa_cont_get_idx(struct tfa_device *tfa); - -/** - * Write reg and bitfield items in the devicelist to the target. - * @param tfa the device struct pointer - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContWriteRegsDev(struct tfa_device *tfa); - -/** - * Write reg and bitfield items in the profilelist to the target. - * @param tfa the device struct pointer - * @param prof_idx the profile index - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContWriteRegsProf(struct tfa_device *tfa, int prof_idx); - -/** - * Write a patchfile in the devicelist to the target. - * @param tfa the device struct pointer - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContWritePatch(struct tfa_device *tfa); - -/** - * Write all param files in the devicelist to the target. - * @param tfa the device struct pointer - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContWriteFiles(struct tfa_device *tfa); - -/** - * Get sample rate from passed profile index - * @param tfa the device struct pointer - * @param prof_idx the index of the profile - * @return sample rate value - */ -unsigned int tfa98xx_get_profile_sr(struct tfa_device *tfa, unsigned int prof_idx); - -/** - * Get the device name string - * @param cnt the pointer to the container struct - * @param dev_idx the index of the device - * @return device name string or error string if not found - */ -char *tfaContDeviceName(TfaContainer_t *cnt, int dev_idx); - -/** - * Get the application name from the container file application field - * @param tfa the device struct pointer - * @param name the input stringbuffer with size: sizeof(application field)+1 - * @return actual string length - */ -int tfa_cnt_get_app_name(struct tfa_device *tfa, char *name); - -/** - * Get profile index of the calibration profile - * @param tfa the device struct pointer - * @return profile index, -2 if no calibration profile is found or -1 on error - */ -int tfaContGetCalProfile(struct tfa_device *tfa); - -/** - * Is the profile a tap profile ? - * @param tfa the device struct pointer - * @param prof_idx the index of the profile - * @return 1 if the profile is a tap profile or 0 if not - */ -int tfaContIsTapProfile(struct tfa_device *tfa, int prof_idx); - -/** - * Get the name of the profile at certain index for a device in the container file - * @param cnt the pointer to the container struct - * @param dev_idx the index of the device - * @param prof_idx the index of the profile - * @return profile name string or error string if not found - */ -char *tfaContProfileName(TfaContainer_t *cnt, int dev_idx, int prof_idx); - -/** - * Process all items in the profilelist - * NOTE an error return during processing will leave the device muted - * @param tfa the device struct pointer - * @param prof_idx index of the profile - * @param vstep_idx index of the vstep - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContWriteProfile(struct tfa_device *tfa, int prof_idx, int vstep_idx); - -/** - * Specify the speaker configurations (cmd id) (Left, right, both, none) - * @param dev_idx index of the device - * @param configuration name string of the configuration - */ -void tfa98xx_set_spkr_select(int dev_idx, char *configuration); - -enum Tfa98xx_Error tfa_cont_write_filterbank(struct tfa_device *tfa, TfaFilter_t *filter); - -/** - * Write all param files in the profilelist to the target - * this is used during startup when maybe ACS is set - * @param tfa the device struct pointer - * @param prof_idx the index of the profile - * @param vstep_idx the index of the vstep - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContWriteFilesProf(struct tfa_device *tfa, int prof_idx, int vstep_idx); -enum Tfa98xx_Error tfaContWriteFilesVstep(struct tfa_device *tfa, int prof_idx, int vstep_idx); -enum Tfa98xx_Error tfaContWriteDrcFile(struct tfa_device *tfa, int size, uint8_t data[]); - -/** - * Get the device list dsc from the tfaContainer - * @param cont pointer to the tfaContainer - * @param dev_idx the index of the device - * @return device list pointer - */ -TfaDeviceList_t *tfaContGetDevList(TfaContainer_t *cont, int dev_idx); - -/** - * Get the Nth profile for the Nth device - * @param cont pointer to the tfaContainer - * @param dev_idx the index of the device - * @param prof_idx the index of the profile - * @return profile list pointer - */ -TfaProfileList_t *tfaContGetDevProfList(TfaContainer_t *cont, int dev_idx, int prof_idx); - -/** - * Get the number of profiles for device from contaienr - * @param cont pointer to the tfaContainer - * @param dev_idx the index of the device - * @return device list pointer - */ -int tfa_cnt_get_dev_nprof(struct tfa_device *tfa); - - -/** - * Get the Nth livedata for the Nth device - * @param cont pointer to the tfaContainer - * @param dev_idx the index of the device - * @param livedata_idx the index of the livedata - * @return livedata list pointer - */ -TfaLiveDataList_t *tfaContGetDevLiveDataList(TfaContainer_t *cont, int dev_idx, int livedata_idx); - -/** - * Check CRC for container - * @param cont pointer to the tfaContainer - * @return error value 0 on error - */ -int tfaContCrcCheckContainer(TfaContainer_t *cont); - -/** - * Get the device list pointer - * @param cnt pointer to the container struct - * @param dev_idx the index of the device - * @return pointer to device list - */ -TfaDeviceList_t *tfaContDevice(TfaContainer_t *cnt, int dev_idx); - -/** - * Return the pointer to the first profile in a list from the tfaContainer - * @param cont pointer to the tfaContainer - * @return pointer to first profile in profile list - */ -TfaProfileList_t *tfaContGet1stProfList(TfaContainer_t *cont); - -/** - * Return the pointer to the next profile in a list - * @param prof is the pointer to the profile list - * @return profile list pointer - */ -TfaProfileList_t *tfaContNextProfile(TfaProfileList_t *prof); - -/** - * Return the pointer to the first livedata in a list from the tfaContainer - * @param cont pointer to the tfaContainer - * @return pointer to first livedata in profile list - */ -TfaLiveDataList_t *tfaContGet1stLiveDataList(TfaContainer_t *cont); - -/** - * Return the pointer to the next livedata in a list - * @param livedata_idx is the pointer to the livedata list - * @return livedata list pointer - */ -TfaLiveDataList_t *tfaContNextLiveData(TfaLiveDataList_t *livedata_idx); - -/** - * Write a bit field - * @param tfa the device struct pointer - * @param bf bitfield to write - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaRunWriteBitfield(struct tfa_device *tfa, TfaBitfield_t bf); - -/** - * Write a parameter file to the device - * @param tfa the device struct pointer - * @param file filedescriptor pointer - * @param vstep_idx index to vstep - * @param vstep_msg_idx index to vstep message - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaContWriteFile(struct tfa_device *tfa, TfaFileDsc_t *file, int vstep_idx, int vstep_msg_idx); - -/** - * Get the max volume step associated with Nth profile for the Nth device - * @param tfa the device struct pointer - * @param prof_idx profile index - * @return the number of vsteps - */ -int tfacont_get_max_vstep(struct tfa_device *tfa, int prof_idx); - -/** - * Get the file contents associated with the device or profile - * Search within the device tree, if not found, search within the profile - * tree. There can only be one type of file within profile or device. - * @param tfa the device struct pointer - * @param prof_idx I2C profile index in the device - * @param type file type - * @return 0 NULL if file type is not found - * @return 1 file contents - */ -TfaFileDsc_t *tfacont_getfiledata(struct tfa_device *tfa, int prof_idx, enum TfaHeaderType type); - -/** - * Dump the contents of the file header - * @param hdr pointer to file header data - */ -void tfaContShowHeader(TfaHeader_t *hdr); - -/** - * Read a bit field - * @param tfa the device struct pointer - * @param bf bitfield to read out - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfaRunReadBitfield(struct tfa_device *tfa, TfaBitfield_t *bf); - -/** - * Get hw feature bits from container file - * @param tfa the device struct pointer - * @param hw_feature_register pointer to where hw features are stored - */ -void get_hw_features_from_cnt(struct tfa_device *tfa, int *hw_feature_register); - -/** - * Get sw feature bits from container file - * @param tfa the device struct pointer - * @param sw_feature_register pointer to where sw features are stored - */ -void get_sw_features_from_cnt(struct tfa_device *tfa, int sw_feature_register[2]); - -/** - * Factory trimming for the Boost converter - * check if there is a correction needed - * @param tfa the device struct pointer - */ -enum Tfa98xx_Error tfa98xx_factory_trimmer(struct tfa_device *tfa); - -/** - * Search for filters settings and if found then write them to the device - * @param tfa the device struct pointer - * @param prof_idx profile to look in - * @return Tfa98xx_Error - */ -enum Tfa98xx_Error tfa_set_filters(struct tfa_device *tfa, int prof_idx); - -/** - * Get the firmware version from the patch in the container file - * @param tfa the device struct pointer - * @return firmware version - */ -int tfa_cnt_get_patch_version(struct tfa_device *tfa); - -int tfa_tib_dsp_msgmulti(struct tfa_device *tfa, int length, const char *buffer); - -#endif /* TFACONTAINER_H_ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_device.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_device.h deleted file mode 100644 index a5f03dd8a2be..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_device.h +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -/**\file - * - * The tfa_device interface controls a single I2C device instance by - * referencing to the device specific context provided by means of the - * tfa_device structure pointer. - * Multiple instances of tfa_device structures will be created and maintained - * by the caller. - * - * The API is functionally grouped as: - * - tfa_dev basic codec interface to probe, start/stop and control the device state - * - access to internal MTP storage - * - abstraction for interrupt bits and handling - * - container reading support - */ -#ifndef __TFA_DEVICE_H__ -#define __TFA_DEVICE_H__ - -#include "config.h" - -struct tfa_device; - -/* - * hw/sw feature bit settings in MTP - */ -enum featureSupport { - supportNotSet, /**< default means not set yet */ - supportNo, /**< no support */ - supportYes /**< supported */ -}; -/* - * supported Digital Audio Interfaces bitmap - */ -enum Tfa98xx_DAI { - Tfa98xx_DAI_I2S = 0x01, /**< I2S only */ - Tfa98xx_DAI_TDM = 0x02, /**< TDM, I2S */ - Tfa98xx_DAI_PDM = 0x04, /**< PDM */ - }; - -/* - * device ops function structure - */ -struct tfa_device_ops { - enum Tfa98xx_Error (*dsp_msg)(struct tfa_device *tfa, int length, const char *buf); - enum Tfa98xx_Error (*dsp_msg_read)(struct tfa_device *tfa, int length, unsigned char *bytes); - enum Tfa98xx_Error (*reg_read)(struct tfa_device *tfa, unsigned char subaddress, unsigned short *value); - enum Tfa98xx_Error (*reg_write)(struct tfa_device *tfa, unsigned char subaddress, unsigned short value); - enum Tfa98xx_Error (*mem_read)(struct tfa_device *tfa, unsigned int start_offset, int num_words, int *pValues); - enum Tfa98xx_Error (*mem_write)(struct tfa_device *tfa, unsigned short address, int value, int memtype); - - enum Tfa98xx_Error (*tfa_init)(struct tfa_device *tfa); /**< init typically for loading optimal settings */ - enum Tfa98xx_Error (*dsp_reset)(struct tfa_device *tfa, int state); /**< reset the coolflux dsp */ - enum Tfa98xx_Error (*dsp_system_stable)(struct tfa_device *tfa, int *ready); /**< ready when clocks are stable to allow DSP subsystem access */ - enum Tfa98xx_Error (*dsp_write_tables)(struct tfa_device *tfa, int sample_rate); /**< write the device/type specific delaytables */ - enum Tfa98xx_Error (*auto_copy_mtp_to_iic)(struct tfa_device *tfa); /**< Set auto_copy_mtp_to_iic */ - enum Tfa98xx_Error (*factory_trimmer)(struct tfa_device *tfa); /**< Factory trimming for the Boost converter */ - int (*set_swprof)(struct tfa_device *tfa, unsigned short new_value); /**< Set the sw profile in the struct and the hw register */ - int (*get_swprof)(struct tfa_device *tfa); /**< Get the sw profile from the hw register */ - int (*set_swvstep)(struct tfa_device *tfa, unsigned short new_value); /**< Set the sw vstep in the struct and the hw register */ - int (*get_swvstep)(struct tfa_device *tfa); /**< Get the sw vstep from the hw register */ - int (*get_mtpb)(struct tfa_device *tfa); /**< get status of MTB busy bit*/ - enum Tfa98xx_Error (*set_mute)(struct tfa_device *tfa, int mute); /**< set mute */ - enum Tfa98xx_Error (*faim_protect)(struct tfa_device *tfa, int state); /**< Protect FAIM from being corrupted */ - enum Tfa98xx_Error (*set_osc_powerdown)(struct tfa_device *tfa, int state); /**< Allow to change internal osc. gating settings */ - enum Tfa98xx_Error (*update_lpm)(struct tfa_device *tfa, int state); /**< Allow to change lowpowermode settings */ -}; - -/** - * Device states and modifier flags to allow a device/type independent fine - * grained control of the internal state.\n - * Values below 0x10 are referred to as base states which can be or-ed with - * state modifiers, from 0x10 and higher. - * - */ -enum tfa_state { - TFA_STATE_UNKNOWN, /**< unknown or invalid */ - TFA_STATE_POWERDOWN, /**< PLL in powerdown, Algo is up/warm */ - TFA_STATE_INIT_HW, /**< load I2C/PLL hardware setting (~wait2srcsettings) */ - TFA_STATE_INIT_CF, /**< coolflux HW access possible (~initcf) */ - TFA_STATE_INIT_FW, /**< DSP framework active (~patch loaded) */ - TFA_STATE_OPERATING, /**< Amp and Algo running */ - TFA_STATE_FAULT, /**< An alarm or error occurred */ - TFA_STATE_RESET, /**< I2C reset and ACS set */ - /* --sticky state modifiers-- */ - TFA_STATE_MUTE = 0x10, /**< Algo & Amp mute */ - TFA_STATE_UNMUTE = 0x20, /**< Algo & Amp unmute */ - TFA_STATE_CLOCK_ALWAYS = 0x40, /**< PLL connect to internal oscillator */ - TFA_STATE_CLOCK_AUDIO = 0x80, /**< PLL connect to audio clock (BCK/FS) */ - TFA_STATE_LOW_POWER = 0x100, /**< lowest possible power state */ -}; - -/** - * This is the main tfa device context structure, it will carry all information - * that is needed to handle a single I2C device instance. - * All functions dealing with the device will need access to the fields herein. - */ -struct tfa_device { - int dev_idx; /**< device container index */ - int in_use; - int buffer_size; /**< lowest level max buffer size */ - int has_msg; /**< support direct dsp messaging */ - unsigned char slave_address; /**< I2C slave address (not shifted) */ - unsigned short rev; /**< full revid of this device */ - unsigned char tfa_family; /**< tfa1/tfa2 */ - enum featureSupport supportDrc; - enum featureSupport supportFramework; - enum featureSupport support_saam; - int sw_feature_bits[2]; /**< cached copy of sw feature bits */ - int hw_feature_bits; /**< cached copy of hw feature bits */ - int profile; /**< active profile */ - int vstep; /**< active vstep */ - unsigned char spkr_count; - unsigned char spkr_select; - unsigned char support_tcoef;/**< legacy tfa9887, will be removed */ - enum Tfa98xx_DAI daimap; /**< supported audio interface types */ - int mohm[3]; /**< speaker calibration values in milli ohms -1 is error */ - struct tfa_device_ops dev_ops; - uint16_t interrupt_enable[3]; - uint16_t interrupt_status[3]; - int ext_dsp; /**< respond to external DSP: -1:none, 0:no_dsp, 1:cold, 2:warm */ - int bus; /* TODO fix ext_dsp and bus handling */ - int tfadsp_event; /**< enum tfadsp_event_en is for external registry */ - int verbose; /**< verbosity level for debug print output */ - enum tfa_state state; /**< last known state or-ed with optional state_modifier */ - struct TfaContainer *cnt;/**< the loaded container file */ - struct TfaVolumeStepRegisterInfo *p_regInfo; /**< remember vstep for partial updates */ - int partial_enable; /**< enable partial updates */ - void *data; /**< typically pointing to Linux driver structure owning this device */ - int convert_dsp32; /**< convert 24 bit DSP messages to 32 bit */ - int sync_iv_delay; /**< synchronize I/V delay at cold start */ - int is_probus_device; /**< probus device: device without internal DSP */ - int advance_keys_handling; - int needs_reset; /**< add the reset trigger for SetAlgoParams and SetMBDrc commands */ - struct kmem_cache *cachep; /**< Memory allocator handle */ - char fw_itf_ver[4]; /* Firmware ITF version */ -}; - -/** - * The tfa_dev_probe is called before accessing any device accessing functions. - * Access to the tfa device register 3 is attempted and will record the - * returned id for further use. If no device responds the function will abort. - * The recorded id will by used by the query functions to fill the remaining - * relevant data fields of the device structure. - * Data such as MTP features that requires device access will only be read when - * explicitly called and the result will be then cached in the struct. - * - * A structure pointer passed to this device needs to refer to existing memory - * space allocated by the caller. - * - * @param slave = I2C slave address of the target device (not shifted) - * @param tfa struct = points to memory that holds the context for this device - * instance - * - * @return - * - 0 if the I2C device responded to a read of register address 3\n - * when the device responds but with an unknown id a warning will be printed - * - -1 if no response from the I2C device - * - */ -int tfa_dev_probe(int slave, struct tfa_device *tfa); - -/** - * Start this instance at the profile and vstep as provided. - * The profile and vstep will be loaded first in case the current value differs - * from the requested values. - * Note that this call will not change the mute state of the tfa, which means - * that of this instance was called in muted state the caller will have to - * unmute in order to get audio. - * - * @param tfa struct = pointer to context of this device instance - * @param profile the selected profile to run - * @param vstep the selected vstep to use - * @return tfa_error enum - */ -/*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ -#ifdef __KERNEL__ -enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep, u8 pcm_format); -#else -enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep); -#endif -/*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ - -/** - * Stop audio for this instance as gracefully as possible. - * Audio will be muted and the PLL will be shutdown together with any other - * device/type specific settings needed to prevent audio artifacts or - * workarounds. - * - * Note that this call will change state of the tfa to mute and powered down. - * - * @param tfa struct = pointer to context of this device instance - * @return tfa_error enum - */ -enum tfa_error tfa_dev_stop(struct tfa_device *tfa); - -/** - * This interface allows a device/type independent fine grained control of the - * internal state of the instance. - * Whenever a base state is requested an attempt is made to actively bring the device - * into this state. However this may depend on external conditions beyond control of - * this software layer. Therefore in case the state cannot be set an erro will - * be returned and the current state remains unchanged. - * The base states, lower values below 0x10, are all mutually exclusive, they higher ones - * can also function as a sticky modifier which means for example that operating - * state could be in either muted or unmuted state. Or in case of init_cf it can be - * internal clock (always) or external audio clock. - * This function is intended to be used for device mute/unmute synchronization - * when called from higher layers. Mostly internal calls will use this to control - * the startup and profile transitions in a device/type independent way. - * - * @param tfa struct = pointer to context of this device instance - * @param state struct = desired device state after function return - * @return tfa_error enum - */ -enum tfa_error tfa_dev_set_state(struct tfa_device *tfa, enum tfa_state state, int is_calibration); - -/** - * Retrieve the current state of this instance in an active way. - * The state field in tfa structure will reflect the result unless an error is - * returned. - * Note that the hardware state may change on external events an as such this - * field should be treated as volatile. - * - * @param tfa struct = pointer to context of this device instance - * @return tfa_error enum - * - */ -enum tfa_state tfa_dev_get_state(struct tfa_device *tfa); - -/*****************************************************************************/ -/*****************************************************************************/ -/** - * MTP support functions - */ -enum tfa_mtp { - TFA_MTP_OTC, /**< */ - TFA_MTP_EX, /**< */ - TFA_MTP_RE25, /**< */ - TFA_MTP_RE25_PRIM, /**< */ - TFA_MTP_RE25_SEC, /**< */ - TFA_MTP_LOCK, /**< */ -}; - -/** - * - */ -int tfa_dev_mtp_get(struct tfa_device *tfa, enum tfa_mtp item); - -/** - * - */ -enum tfa_error tfa_dev_mtp_set(struct tfa_device *tfa, enum tfa_mtp item, int value); - - -//irq -/* tfa2 interrupt support - * !!! enum tfa9912_irq !!!*/ -/* - * interrupt bit function to clear - */ -int tfa_irq_clear(struct tfa_device *tfa, int bit); -/* - * return state of irq or -1 if illegal bit - */ -int tfa_irq_get(struct tfa_device *tfa, int bit); -/* - * interrupt bit function that operates on the shadow regs in the handle - */ -int tfa_irq_ena(struct tfa_device *tfa, int bit, int state); -/* - * interrupt bit function that sets the polarity - */ -int tfa_irq_set_pol(struct tfa_device *tfa, int bit, int state); - -/* - * mask interrupts by disabling them - */ -int tfa_irq_mask(struct tfa_device *tfa); -/* - * unmask interrupts by enabling them again - */ -int tfa_irq_unmask(struct tfa_device *tfa); -//cnt read -//debug? - -#endif /* __TFA_DEVICE_H__ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_dsp_fw.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_dsp_fw.h deleted file mode 100644 index b191b6902859..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_dsp_fw.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#ifndef TFA98XX_INTERNALS_H -#define TFA98XX_INTERNALS_H - -#include "config.h" - -#include "tfa_service.h" //TODO cleanup for enum Tfa98xx_Status_ID -/* - * tfadsp_fw_api.c - */ -/** - * Return a text version of the firmware status ID code - * @param status the given status ID code - * @return the firmware status ID string - */ -const char *tfadsp_fw_status_string(enum Tfa98xx_Status_ID status); -int tfadsp_fw_start(struct tfa_device *tfa, int prof_idx, int vstep_idx); -int tfadsp_fw_get_api_version(struct tfa_device *tfa, uint8_t *buffer); -#define FW_MAXTAG 150 -int tfadsp_fw_get_tag(struct tfa_device *tfa, uint8_t *buffer); -int tfadsp_fw_get_status_change(struct tfa_device *tfa, uint8_t *buffer); -int tfadsp_fw_set_re25(struct tfa_device *tfa, int prim, int sec); -int tfadsp_fw_get_re25(struct tfa_device *tfa, uint8_t *buffer); - -/* - * the order matches the ACK bits order in TFA98XX_CF_STATUS - */ -enum tfa_fw_event { /* not all available on each device */ - tfa_fw_i2c_cmd_ack, - tfa_fw_reset_start, - tfa_fw_short_on_mips, - tfa_fw_soft_mute_ready, - tfa_fw_volume_ready, - tfa_fw_error_damage, - tfa_fw_calibrate_done, - tfa_fw_max -}; - -/* the following type mappings are compiler specific */ -#define subaddress_t unsigned char - -/* module Ids */ -#define MODULE_FRAMEWORK 0 -#define MODULE_SPEAKERBOOST 1 -#define MODULE_BIQUADFILTERBANK 2 -#define MODULE_TAPTRIGGER 5 -#define MODULE_SETRE 9 - -/* RPC commands */ -/* SET */ -#define FW_PAR_ID_SET_MEMORY 0x03 -#define FW_PAR_ID_SET_SENSES_DELAY 0x04 -#define FW_PAR_ID_SETSENSESCAL 0x05 -#define FW_PAR_ID_SET_INPUT_SELECTOR 0x06 -#define FW_PAR_ID_SET_OUTPUT_SELECTOR 0x08 -#define FW_PAR_ID_SET_PROGRAM_CONFIG 0x09 -#define FW_PAR_ID_SET_GAINS 0x0A -#define FW_PAR_ID_SET_MEMTRACK 0x0B -#define FW_PAR_ID_SET_FWKUSECASE 0x11 -#define TFA1_FW_PAR_ID_SET_CURRENT_DELAY 0x03 -#define TFA1_FW_PAR_ID_SET_CURFRAC_DELAY 0x06 -/* GET */ -#define FW_PAR_ID_GET_MEMORY 0x83 -#define FW_PAR_ID_GLOBAL_GET_INFO 0x84 -#define FW_PAR_ID_GET_FEATURE_INFO 0x85 -#define FW_PAR_ID_GET_MEMTRACK 0x8B -#define FW_PAR_ID_GET_TAG 0xFF -#define FW_PAR_ID_GET_API_VERSION 0xFE -#define FW_PAR_ID_GET_STATUS_CHANGE 0x8D - -/* Load a full model into SpeakerBoost. */ -/* SET */ -#define SB_PARAM_SET_ALGO_PARAMS 0x00 -#define SB_PARAM_SET_LAGW 0x01 -#define SB_PARAM_SET_ALGO_PARAMS_WITHOUT_RESET 0x02 -#define SB_PARAM_SET_RE25C 0x05 -#define SB_PARAM_SET_LSMODEL 0x06 -#define SB_PARAM_SET_MBDRC 0x07 -#define SB_PARAM_SET_MBDRC_WITHOUT_RESET 0x08 -#define SB_PARAM_SET_EXCURSION_FILTERS 0x0A -#define SB_PARAM_SET_DRC 0x0F -/* GET */ -#define SB_PARAM_GET_ALGO_PARAMS 0x80 -#define SB_PARAM_GET_LAGW 0x81 -#define SB_PARAM_GET_RE25C 0x85 -#define SB_PARAM_GET_LSMODEL 0x86 -#define SB_PARAM_GET_MBDRC 0x87 -#define SB_PARAM_GET_MBDRC_DYNAMICS 0x89 -#define SB_PARAM_GET_EXCURSION_FILTERS 0x8A -#define SB_PARAM_GET_TAG 0xFF - -#define SB_PARAM_SET_EQ 0x0A /* 2 Equaliser Filters. */ -#define SB_PARAM_SET_PRESET 0x0D /* Load a preset */ -#define SB_PARAM_SET_CONFIG 0x0E /* Load a config */ -#define SB_PARAM_SET_AGCINS 0x10 -#define SB_PARAM_SET_CURRENT_DELAY 0x03 -#define SB_PARAM_GET_STATE 0xC0 -#define SB_PARAM_GET_XMODEL 0xC1 /* Gets current Excursion Model. */ -#define SB_PARAM_GET_XMODEL_COEFFS 0x8C /* Get coefficients for XModel */ -#define SB_PARAM_GET_EXCURSION_FILTERS 0x8A /* Get excursion filters */ -#define SB_PARAM_SET_EXCURSION_FILTERS 0x0A /* Set excursion filters */ - -/* SET: TAPTRIGGER */ -#define TAP_PARAM_SET_ALGO_PARAMS 0x01 -#define TAP_PARAM_SET_DECIMATION_PARAMS 0x02 - -/* GET: TAPTRIGGER*/ -#define TAP_PARAM_GET_ALGO_PARAMS 0x81 -#define TAP_PARAM_GET_TAP_RESULTS 0x84 - -/* sets the speaker calibration impedance (@25 degrees celsius) */ -#define SB_PARAM_SET_RE0 0x89 - -#define BFB_PAR_ID_SET_COEFS 0x00 -#define BFB_PAR_ID_GET_COEFS 0x80 -#define BFB_PAR_ID_GET_CONFIG 0x81 - -/* for compatibility */ -#define FW_PARAM_GET_STATE FW_PAR_ID_GLOBAL_GET_INFO -#define FW_PARAM_GET_FEATURE_BITS FW_PAR_ID_GET_FEATURE_BITS - -/* RPC Status results */ -#define STATUS_OK 0 -#define STATUS_INVALID_MODULE_ID 2 -#define STATUS_INVALID_PARAM_ID 3 -#define STATUS_INVALID_INFO_ID 4 - -/* the maximum message length in the communication with the DSP */ -#define TFA2_MAX_PARAM_SIZE (507*3) /* TFA2 */ -#define TFA1_MAX_PARAM_SIZE (145*3) /* TFA1 */ - -#define ROUND_DOWN(a, n) (((a)/(n))*(n)) - -/* feature bits */ -#define FEATURE1_TCOEF 0x100 /* bit8 set means tCoefA expected */ -#define FEATURE1_DRC 0x200 /* bit9 NOT set means DRC expected */ - -/* DSP firmware xmem defines */ -#define TFA1_FW_XMEM_CALIBRATION_DONE 231 -#define TFA2_FW_XMEM_CALIBRATION_DONE 516 -#define TFA1_FW_XMEM_COUNT_BOOT 0xa1 -#define TFA2_FW_XMEM_COUNT_BOOT 512 -#define TFA2_FW_XMEM_CMD_COUNT 520 - -/* note that the following defs rely on the handle variable */ -#define TFA_FW_XMEM_CALIBRATION_DONE TFA_FAM_FW(tfa, XMEM_CALIBRATION_DONE) -#define TFA_FW_XMEM_COUNT_BOOT TFA_FAM_FW(tfa, XMEM_COUNT_BOOT) -#define TFA_FW_XMEM_CMD_COUNT TFA_FAM_FW(tfa, XMEM_CMD_COUNT) - -#define TFA2_FW_ReZ_SCALE 65536 -#define TFA1_FW_ReZ_SCALE 16384 - -#endif /* TFA98XX_INTERNALS_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_ext.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_ext.h deleted file mode 100644 index d5f425b54a07..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_ext.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -/* - * tfa_ext.h - * - * Created on: Jun 8, 2016 - * Author: wim - */ - -#ifndef TFA_SRC_TFA_EXT_H_ -#define TFA_SRC_TFA_EXT_H_ - -#include "tfa_device.h" - -/* - * events - */ -/** Maximum value for enumerator */ -#define LVM_MAXENUM (0xffff) -/** -This enum type specifies the different events that may trigger a callback. -*/ -enum tfadsp_event_en { - TFADSP_CMD_ACK = 1, /**< Command handling is completed */ - TFADSP_SOFT_MUTE_READY = 8, /**< Muting completed */ - TFADSP_VOLUME_READY = 16, /**< Volume change completed */ - TFADSP_DAMAGED_SPEAKER = 32, /**< Damaged speaker was detected */ - TFADSP_CALIBRATE_DONE = 64, /**< Calibration is completed */ - TFADSP_SPARSESIG_DETECTED = 128, /**< Sparse signal detected */ - TFADSP_CMD_READY = 256, /**< Ready to receive commands */ - TFADSP_EXT_PWRUP = 0x8000,/**< DSP API has started, powered up */ - TFADSP_EXT_PWRDOWN = 0x8001,/**< DSP API stopped, power down */ - TFADSP_EVENT_DUMMY = LVM_MAXENUM -}; - -typedef int (*tfa_event_handler_t)(struct tfa_device *tfa, enum tfadsp_event_en tfadsp_event); -typedef int (*dsp_send_message_t)(struct tfa_device *tfa, int length, const char *buf); -typedef int (*dsp_read_message_t)(struct tfa_device *tfa, int length, char *buf); -typedef int (*dsp_write_reg_t)(struct tfa_device *tfa, unsigned char subaddress, unsigned short value); - -int tfa_ext_register(dsp_write_reg_t tfa_write_reg, dsp_send_message_t tfa_send_message, dsp_read_message_t tfa_read_message, tfa_event_handler_t *tfa_event_handler); - -#endif /* TFA_SRC_TFA_EXT_H_ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_internal.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_internal.h deleted file mode 100755 index 8bf1eac7ec89..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_internal.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2014-2017 NXP Semiconductors - * Copyright (C) 2019 XiaoMi, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - internal functions for TFA layer (not shared with SRV and HAL layer!) -*/ - -#ifndef __TFA_INTERNAL_H__ -#define __TFA_INTERNAL_H__ - -#include "tfa_dsp_fw.h" -#include "tfa_ext.h" - -#if __GNUC__ >= 4 - #define TFA_INTERNAL __attribute__ ((visibility("hidden"))) -#else - #define TFA_INTERNAL -#endif - -#define TFA98XX_GENERIC_SLAVE_ADDRESS 0x1C - -TFA_INTERNAL enum Tfa98xx_Error tfa98xx_check_rpc_status(struct tfa_device *tfa, int *pRpcStatus); -TFA_INTERNAL enum Tfa98xx_Error tfa98xx_wait_result(struct tfa_device *tfa, int waitRetryCount); - -#endif /* __TFA_INTERNAL_H__ */ - diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_platform_interface_definition.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_platform_interface_definition.h deleted file mode 100755 index 5da87c95c231..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_platform_interface_definition.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2015-2018 NXP Semiconductors - * Copyright (C) 2019 XiaoMi, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _TFA_PLATFORM_INTERFACE_DEFINITION_H_ -#define _TFA_PLATFORM_INTERFACE_DEFINITION_H_ - -#define AFE_MODULE_ID_TFADSP_RX (0x1000B911) -#define AFE_MODULE_ID_TFADSP_TX (0x1000B912) -#define AFE_PARAM_ID_TFADSP_TX_SET_ENABLE (0x1000B920) -#define AFE_PARAM_ID_TFADSP_RX_CFG (0x1000B921) -#define AFE_PARAM_ID_TFADSP_RX_GET_RESULT (0x1000B922) -#define AFE_PARAM_ID_TFADSP_RX_SET_BYPASS (0x1000B923) - - - -#define TFA_USING_QUATERNARY_MI2S - - -#if defined(TFA_USING_SECONDARY_MI2S) - /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, - AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ - #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_SECONDARY_MI2S_RX) - #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_SECONDARY_MI2S_TX) - - #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "SEC_MI2S_RX" - #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "SEC_MI2S_TX" - #define PLATFORM_RX_VI_FB_MUX_NAME "SECONDARY_MI2S_RX_VI_FB_MUX" - #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_SECONDARY_MI2S_TX - #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_SECONDARY_MI2S_RX - - #define TFA_TX_HOSTLESS_CODEC_NAME "Secondary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_STREAM_NAME "Secondary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_CPU_DAI_NAME "SEC_MI2S_TX_HOSTLESS" - -#elif defined(TFA_USING_TERTIARY_MI2S) - /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, - AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ - #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_TERTIARY_MI2S_RX) - #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_TERTIARY_MI2S_TX) - - #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "TERT_MI2S_RX" - #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "TERT_MI2S_TX" - #define PLATFORM_RX_VI_FB_MUX_NAME "TERTIARY_MI2S_RX_VI_FB_MUX" - #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_TERTIARY_MI2S_TX - #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_TERTIARY_MI2S_RX - - #define TFA_TX_HOSTLESS_CODEC_NAME "Tertiary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_STREAM_NAME "Tertiary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_CPU_DAI_NAME "TERT_MI2S_TX_HOSTLESS" - -#elif defined(TFA_USING_QUATERNARY_MI2S) - /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, - AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ - #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_QUATERNARY_MI2S_RX) - #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_QUATERNARY_MI2S_TX) - - #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "QUAT_MI2S_RX" - #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "QUAT_MI2S_TX" - #define PLATFORM_RX_VI_FB_MUX_NAME "QUATERNARY_MI2S_RX_VI_FB_MUX" - #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_QUATERNARY_MI2S_TX - #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_QUATERNARY_MI2S_RX - - #define TFA_TX_HOSTLESS_CODEC_NAME "Quaternary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_STREAM_NAME "Quaternary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_CPU_DAI_NAME "QUAT_MI2S_TX_HOSTLESS" - -#elif defined(TFA_USING_QUINARY_MI2S) - /*Attention: port_id = AFE_PORT_ID_SECONDARY_MI2S_RX/TX, AFE_PORT_ID_TERTIARY_MI2S_RX/TX, - AFE_PORT_ID_QUATERNARY_MI2S_RX/TX or AFE_PORT_ID_QUINARY_MI2S_RX/TX*/ - #define AFE_PORT_ID_TFADSP_RX (AFE_PORT_ID_QUINARY_MI2S_RX) - #define AFE_PORT_ID_TFADSP_TX (AFE_PORT_ID_QUINARY_MI2S_TX) - - #define PLATFORM_RX_VI_FB_RX_MUX_TEXT "QUIN_MI2S_RX" - #define PLATFORM_RX_VI_FB_TX_MUX_TEXT "QUIN_MI2S_TX" - #define PLATFORM_RX_VI_FB_MUX_NAME "QUINARY_MI2S_RX_VI_FB_MUX" - #define PLATFORM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_QUINARY_MI2S_TX - #define PLATFORM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_QUINARY_MI2S_RX - - #define TFA_TX_HOSTLESS_CODEC_NAME "Quinary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_STREAM_NAME "Quinary MI2S_TX Hostless" - #define TFA_TX_HOSTLESS_CPU_DAI_NAME "QUIN_MI2S_TX_HOSTLESS" - -#else - #error you should define which mi2s will be used for TFA device. -#endif -#endif /* _TFA_PLATFORM_INTERFACE_DEFINITION_H_ */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_service.h b/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_service.h deleted file mode 100644 index c0af0a781965..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/tfa_service.h +++ /dev/null @@ -1,1018 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - - -#ifndef TFA_SERVICE_H -#define TFA_SERVICE_H - -//#include "config.h" -// workaround for Visual Studio: -// fatal error C1083: Cannot open include file: 'config.h': No such file or directory -#ifdef __KERNEL__ -#include -#else -#include -#endif -#ifdef __cplusplus -extern "C" { -#include "TFA_I2C.h" -#endif - -/* Linux kernel module defines TFA98XX_GIT_VERSIONS in the linux_driver/Makefile */ -#if !defined(TFA98XX_GIT_VERSIONS) -#include "versions.h" -#endif -#ifdef TFA98XX_GIT_VERSIONS - #define TFA98XX_API_REV_STR "v6.7.3"/*TFA98XX_GIT_VERSIONS*/ -#else - #define TFA98XX_API_REV_STR "v6.7.3" -#endif - -#include "tfa_device.h" - -/* - * data previously defined in Tfa9888_dsp.h - */ -#define MEMTRACK_MAX_WORDS 150 -#define LSMODEL_MAX_WORDS 150 -#define TFA98XX_MAXTAG (150) -#define FW_VAR_API_VERSION (521) - -/* Indexes and scaling factors of GetLSmodel */ -#define tfa9888_fs_IDX 128 -#define tfa9888_leakageFactor_IDX 130 -#define tfa9888_ReCorrection_IDX 131 -#define tfa9888_Bl_IDX 132 -#define ReZ_IDX 147 - -#define tfa9872_leakageFactor_IDX 128 -#define tfa9872_ReCorrection_IDX 129 -#define tfa9872_Bl_IDX 130 - -#define fs_SCALE (double)1 -#define leakageFactor_SCALE (double)8388608 -#define ReCorrection_SCALE (double)8388608 -#define Bl_SCALE (double)2097152 -#define tCoef_SCALE (double)8388608 - -/* ---------------------------- Max1 ---------------------------- */ -/* Headroom applied to the main input signal */ -#define SPKRBST_HEADROOM 7 -/* Exponent used for AGC Gain related variables */ -#define SPKRBST_AGCGAIN_EXP SPKRBST_HEADROOM -#define SPKRBST_TEMPERATURE_EXP 9 -/* Exponent used for Gain Corection related variables */ -#define SPKRBST_LIMGAIN_EXP 4 -#define SPKRBST_TIMECTE_EXP 1 -#define DSP_MAX_GAIN_EXP 7 -/* -------------------------------------------------------------- */ - -/* speaker related parameters */ -#define TFA2_SPEAKERPARAMETER_LENGTH (3*151) /* MAX2=450 */ -#define TFA1_SPEAKERPARAMETER_LENGTH (3*141) /* MAX1=423 */ - -/* vstep related parameters */ -#define TFA2_ALGOPARAMETER_LENGTH (3*304) /* N1B = (304) 305 is including the cmd-id */ -#define TFA72_ALGOPARAMETER_LENGTH_MONO (3*183) -#define TFA72_ALGOPARAMETER_LENGTH_STEREO (3*356) -#define TFA2_MBDRCPARAMETER_LENGTH (3*152) /* 154 is including the cmd-id */ -#define TFA72_MBDRCPARAMETER_LENGTH (3*98) -#define TFA1_PRESET_LENGTH 87 -#define TFA1_DRC_LENGTH 381 /* 127 words */ -#define TFA2_FILTERCOEFSPARAMETER_LENGTH (3*168) /* 170 is including the cmd-id */ -#define TFA72_FILTERCOEFSPARAMETER_LENGTH (3*156) - -/* Maximum number of retries for DSP result - * Keep this value low! - * If certain calls require longer wait conditions, the - * application should poll, not the API - * The total wait time depends on device settings. Those - * are application specific. - */ -#define TFA98XX_WAITRESULT_NTRIES 40 -#define TFA98XX_WAITRESULT_NTRIES_LONG 2000 - -/* following lengths are in bytes */ -#define TFA98XX_PRESET_LENGTH 87 -#define TFA98XX_CONFIG_LENGTH 201 -#define TFA98XX_DRC_LENGTH 381 /* 127 words */ - -typedef unsigned char Tfa98xx_Config_t[TFA98XX_CONFIG_LENGTH]; -typedef unsigned char Tfa98xx_Preset_t[TFA98XX_PRESET_LENGTH]; -typedef unsigned char Tfa98xx_DrcParameters_t[TFA98XX_DRC_LENGTH]; - -/* Type containing all the possible errors that can occur - * - */ -enum Tfa98xx_Error { - Tfa98xx_Error_Ok = 0, - Tfa98xx_Error_Device, /* 1. Currently only used to keep in sync with tfa_error */ - Tfa98xx_Error_Bad_Parameter, /* 2. */ - Tfa98xx_Error_Fail, /* 3. generic failure, avoid mislead message */ - Tfa98xx_Error_NoClock, /* 4. no clock detected */ - Tfa98xx_Error_StateTimedOut, /* 5. */ - Tfa98xx_Error_DSP_not_running, /* 6. communication with the DSP failed */ - Tfa98xx_Error_AmpOn, /* 7. amp is still running */ - Tfa98xx_Error_NotOpen, /* 8. the given handle is not open */ - Tfa98xx_Error_InUse, /* 9. too many handles */ - Tfa98xx_Error_Buffer_too_small, /* 10. if a buffer is too small */ - /* the expected response did not occur within the expected time */ - Tfa98xx_Error_RpcBase = 100, - Tfa98xx_Error_RpcBusy = 101, - Tfa98xx_Error_RpcModId = 102, - Tfa98xx_Error_RpcParamId = 103, - Tfa98xx_Error_RpcInvalidCC = 104, - Tfa98xx_Error_RpcInvalidSeq = 105, - Tfa98xx_Error_RpcInvalidParam = 106, - Tfa98xx_Error_RpcBufferOverflow = 107, - Tfa98xx_Error_RpcCalibBusy = 108, - Tfa98xx_Error_RpcCalibFailed = 109, - Tfa98xx_Error_Not_Implemented, - Tfa98xx_Error_Not_Supported, - Tfa98xx_Error_I2C_Fatal, /* Fatal I2C error occurred */ - /* Nonfatal I2C error, and retry count reached */ - Tfa98xx_Error_I2C_NonFatal, - Tfa98xx_Error_Other = 1000 -}; - -/* - * Type containing all the possible msg returns DSP can give - * //TODO move to tfa_dsp_fw.h - */ -enum Tfa98xx_Status_ID { - Tfa98xx_DSP_Not_Running = -1, /* No response from DSP */ - Tfa98xx_I2C_Req_Done = 0, /* Request executed correctly and result, if any, is available for download */ - Tfa98xx_I2C_Req_Busy = 1, /* Request is being processed, just wait for result */ - Tfa98xx_I2C_Req_Invalid_M_ID = 2, /* Provided M-ID does not fit in valid rang [0..2] */ - Tfa98xx_I2C_Req_Invalid_P_ID = 3, /* Provided P-ID isn�t valid in the given M-ID context */ - Tfa98xx_I2C_Req_Invalid_CC = 4, /* Invalid channel configuration bits (SC|DS|DP|DC) combination */ - Tfa98xx_I2C_Req_Invalid_Seq = 5, /* Invalid sequence of commands, in case the DSP expects some commands in a specific order */ - Tfa98xx_I2C_Req_Invalid_Param = 6, /* Generic error */ - Tfa98xx_I2C_Req_Buffer_Overflow = 7, /* I2C buffer has overflowed: host has sent too many parameters, memory integrity is not guaranteed */ - Tfa98xx_I2C_Req_Calib_Busy = 8, /* Calibration not finished */ - Tfa98xx_I2C_Req_Calib_Failed = 9 /* Calibration failed */ -}; - -/* - * speaker as microphone - */ -enum Tfa98xx_saam { - Tfa98xx_saam_none, /*< SAAM feature not available */ - Tfa98xx_saam /*< SAAM feature available */ -}; - -/* - * config file subtypes - */ -enum Tfa98xx_config_type { - Tfa98xx_config_generic, - Tfa98xx_config_sub1, - Tfa98xx_config_sub2, - Tfa98xx_config_sub3, -}; - -enum Tfa98xx_AmpInputSel { - Tfa98xx_AmpInputSel_I2SLeft, - Tfa98xx_AmpInputSel_I2SRight, - Tfa98xx_AmpInputSel_DSP -}; - -enum Tfa98xx_OutputSel { - Tfa98xx_I2SOutputSel_CurrentSense, - Tfa98xx_I2SOutputSel_DSP_Gain, - Tfa98xx_I2SOutputSel_DSP_AEC, - Tfa98xx_I2SOutputSel_Amp, - Tfa98xx_I2SOutputSel_DataI3R, - Tfa98xx_I2SOutputSel_DataI3L, - Tfa98xx_I2SOutputSel_DcdcFFwdCur, -}; - -enum Tfa98xx_StereoGainSel { - Tfa98xx_StereoGainSel_Left, - Tfa98xx_StereoGainSel_Right -}; - -#define TFA98XX_MAXPATCH_LENGTH (3*1024) - -/* the number of biquads supported */ -#define TFA98XX_BIQUAD_NUM 10 - -enum Tfa98xx_Channel { - Tfa98xx_Channel_L, - Tfa98xx_Channel_R, - Tfa98xx_Channel_L_R, - Tfa98xx_Channel_Stereo -}; - -enum Tfa98xx_Mode { - Tfa98xx_Mode_Normal = 0, - Tfa98xx_Mode_RCV -}; - -enum Tfa98xx_Mute { - Tfa98xx_Mute_Off, - Tfa98xx_Mute_Digital, - Tfa98xx_Mute_Amplifier -}; - -enum Tfa98xx_SpeakerBoostStatusFlags { - Tfa98xx_SpeakerBoost_Activity = 0, /* Input signal activity. */ - Tfa98xx_SpeakerBoost_S_Ctrl, /* S Control triggers the limiter */ - Tfa98xx_SpeakerBoost_Muted, /* 1 when signal is muted */ - Tfa98xx_SpeakerBoost_X_Ctrl, /* X Control triggers the limiter */ - Tfa98xx_SpeakerBoost_T_Ctrl, /* T Control triggers the limiter */ - Tfa98xx_SpeakerBoost_NewModel, /* New model is available */ - Tfa98xx_SpeakerBoost_VolumeRdy, /* 0:stable vol, 1:still smoothing */ - Tfa98xx_SpeakerBoost_Damaged, /* Speaker Damage detected */ - Tfa98xx_SpeakerBoost_SignalClipping /* input clipping detected */ -}; - -struct Tfa98xx_DrcStateInfo { - float GRhighDrc1[2]; - float GRhighDrc2[2]; - float GRmidDrc1[2]; - float GRmidDrc2[2]; - float GRlowDrc1[2]; - float GRlowDrc2[2]; - float GRpostDrc1[2]; - float GRpostDrc2[2]; - float GRblDrc[2]; -}; -struct Tfa98xx_StateInfo { - /* SpeakerBoost State */ - float agcGain; /* Current AGC Gain value */ - float limGain; /* Current Limiter Gain value */ - float sMax; /* Current Clip/Lim threshold */ - int T; /* Current Speaker Temperature value */ - int statusFlag; /* Masked bit word */ - float X1; /* estimated excursion caused by Spkrboost gain ctrl */ - float X2; /* estimated excursion caused by manual gain setting */ - float Re; /* Loudspeaker blocked resistance */ - /* Framework state */ - /* increments each time a MIPS problem is detected on the DSP */ - int shortOnMips; - struct Tfa98xx_DrcStateInfo drcState; /* DRC state, when enabled */ -}; - -typedef struct TfaMsg { - uint8_t msg_size; - unsigned char cmdId[3]; - int data[9]; -} TfaMsg_t; - -typedef struct tfa_vstep_msg { - int fw_version; - uint8_t no_of_vsteps; - uint16_t reg_no; - uint8_t *msg_reg; - uint8_t msg_no; - uint32_t algo_param_length; - uint8_t *msg_algo_param; - uint32_t filter_coef_length; - uint8_t *msg_filter_coef; - uint32_t mbdrc_length; - uint8_t *msg_mbdrc; -} tfa_vstep_msg_t; - -typedef struct TfaGroup { - uint8_t msg_size; - uint8_t profileId[64]; -} TfaGroup_t; - - -struct Tfa98xx_Memtrack_data { - int length; - float mValues[MEMTRACK_MAX_WORDS]; - int mAdresses[MEMTRACK_MAX_WORDS]; - int trackers[MEMTRACK_MAX_WORDS]; - int scalingFactor[MEMTRACK_MAX_WORDS]; -}; - -/* possible memory values for DMEM in CF_CONTROLs */ -enum Tfa98xx_DMEM { - Tfa98xx_DMEM_ERR = -1, - Tfa98xx_DMEM_PMEM = 0, - Tfa98xx_DMEM_XMEM = 1, - Tfa98xx_DMEM_YMEM = 2, - Tfa98xx_DMEM_IOMEM = 3, -}; - -/** - * lookup the device type and return the family type - */ -int tfa98xx_dev2family(int dev_type); - -/** - * register definition structure - */ -struct regdef { - unsigned char offset; /**< subaddress offset */ - unsigned short pwronDefault; /**< register contents after poweron */ - unsigned short pwronTestmask; /**< mask of bits not test */ - char *name; /**< short register name */ -}; - -enum Tfa98xx_DMEM tfa98xx_filter_mem(struct tfa_device *tfa, int filter_index, unsigned short *address, int channel); - -/** - * Load the default HW settings in the device - * @param tfa the device struct pointer - */ -enum Tfa98xx_Error tfa98xx_init(struct tfa_device *tfa); - -/** - * If needed, this function can be used to get a text version of the status ID code - * @param status the given status ID code - * @return the I2C status ID string - */ -const char *tfa98xx_get_i2c_status_id_string(int status); - -/* control the powerdown bit - * @param tfa the device struct pointer - * @param powerdown must be 1 or 0 - */ -enum Tfa98xx_Error tfa98xx_powerdown(struct tfa_device *tfa, int powerdown); - -/* indicates on which channel of DATAI2 the gain from the IC is set - * @param tfa the device struct pointer - * @param gain_sel, see Tfa98xx_StereoGainSel_t - */ -enum Tfa98xx_Error tfa98xx_select_stereo_gain_channel(struct tfa_device *tfa, - enum Tfa98xx_StereoGainSel gain_sel); - -/** - * set the mtp with user controllable values - * @param tfa the device struct pointer - * @param value to be written - * @param mask to be applied toi the bits affected - */ -enum Tfa98xx_Error tfa98xx_set_mtp(struct tfa_device *tfa, uint16_t value, uint16_t mask); -enum Tfa98xx_Error tfa98xx_get_mtp(struct tfa_device *tfa, uint16_t *value); - -/** - * lock or unlock KEY2 - * lock = 1 will lock - * lock = 0 will unlock - * note that on return all the hidden key will be off - */ -void tfa98xx_key2(struct tfa_device *tfa, int lock); - -int tfa_calibrate(struct tfa_device *tfa); -void tfa98xx_set_exttemp(struct tfa_device *tfa, short ext_temp); -short tfa98xx_get_exttemp(struct tfa_device *tfa); - -/* control the volume of the DSP - * @param vol volume in bit field. It must be between 0 and 255 - */ -enum Tfa98xx_Error tfa98xx_set_volume_level(struct tfa_device *tfa, - unsigned short vol); - -/* set the input channel to use - * @param channel see Tfa98xx_Channel_t enumeration - */ -enum Tfa98xx_Error tfa98xx_select_channel(struct tfa_device *tfa, - enum Tfa98xx_Channel channel); - -/* set the mode for normal or receiver mode - * @param mode see Tfa98xx_Mode enumeration - */ -enum Tfa98xx_Error tfa98xx_select_mode(struct tfa_device *tfa, enum Tfa98xx_Mode mode); - -/* mute/unmute the audio - * @param mute see Tfa98xx_Mute_t enumeration - */ -enum Tfa98xx_Error tfa98xx_set_mute(struct tfa_device *tfa, - enum Tfa98xx_Mute mute); - -/* - * tfa_supported_speakers - required for SmartStudio initialization - * returns the number of the supported speaker count - */ -enum Tfa98xx_Error tfa_supported_speakers(struct tfa_device *tfa, int *spkr_count); - -/** -* Return the tfa revision -*/ -void tfa98xx_rev(int *major, int *minor, int *revision); - -/* - * Return the feature bits from MTP and cnt file for comparison - */ -enum Tfa98xx_Error -tfa98xx_compare_features(struct tfa_device *tfa, int features_from_MTP[3], int features_from_cnt[3]); - -/* - * return feature bits - */ -enum Tfa98xx_Error -tfa98xx_dsp_get_sw_feature_bits(struct tfa_device *tfa, int features[2]); -enum Tfa98xx_Error -tfa98xx_dsp_get_hw_feature_bits(struct tfa_device *tfa, int *features); - -/* - * tfa98xx_supported_saam - * returns the speaker as microphone feature - * @param saam enum pointer - * @return error code - */ -enum Tfa98xx_Error tfa98xx_supported_saam(struct tfa_device *tfa, enum Tfa98xx_saam *saam); - -/* load the tables to the DSP - * called after patch load is done - * @return error code - */ -enum Tfa98xx_Error tfa98xx_dsp_write_tables(struct tfa_device *tfa, int sample_rate); - - -/* set or clear DSP reset signal - * @param new state - * @return error code - */ -enum Tfa98xx_Error tfa98xx_dsp_reset(struct tfa_device *tfa, int state); - -/* check the state of the DSP subsystem - * return ready = 1 when clocks are stable to allow safe DSP subsystem access - * @param tfa the device struct pointer - * @param ready pointer to state flag, non-zero if clocks are not stable - * @return error code - */ -enum Tfa98xx_Error tfa98xx_dsp_system_stable(struct tfa_device *tfa, int *ready); - -enum Tfa98xx_Error tfa98xx_auto_copy_mtp_to_iic(struct tfa_device *tfa); - -/** - * check the state of the DSP coolflux - * @param tfa the device struct pointer - * @return the value of CFE - */ -int tfa_cf_enabled(struct tfa_device *tfa); - -/* The following functions can only be called when the DSP is running - * - I2S clock must be active, - * - IC must be in operating mode - */ - -/** - * patch the ROM code of the DSP - * @param tfa the device struct pointer - * @param patchLength the number of bytes of patchBytes - * @param patchBytes pointer to the bytes to patch - */ -enum Tfa98xx_Error tfa_dsp_patch(struct tfa_device *tfa, - int patchLength, - const unsigned char *patchBytes); - -/** - * load explicitly the speaker parameters in case of free speaker, - * or when using a saved speaker model - */ -enum Tfa98xx_Error tfa98xx_dsp_write_speaker_parameters( - struct tfa_device *tfa, - int length, - const unsigned char *pSpeakerBytes); - -/** - * read the speaker parameters as used by the SpeakerBoost processing - */ -enum Tfa98xx_Error tfa98xx_dsp_read_speaker_parameters( - struct tfa_device *tfa, - int length, - unsigned char *pSpeakerBytes); - -/** - * read the current status of the DSP, typically used for development, - * not essential to be used in a product - */ -enum Tfa98xx_Error tfa98xx_dsp_get_state_info( - struct tfa_device *tfa, - unsigned char bytes[], - unsigned int *statesize); - -/** - * Check whether the DSP supports DRC - * pbSupportDrc=1 when DSP supports DRC, - * pbSupportDrc=0 when DSP doesn't support it - */ -enum Tfa98xx_Error tfa98xx_dsp_support_drc(struct tfa_device *tfa, - int *pbSupportDrc); - -enum Tfa98xx_Error -tfa98xx_dsp_support_framework(struct tfa_device *tfa, int *pbSupportFramework); - -/** - * read the speaker excursion model as used by SpeakerBoost processing - */ -enum Tfa98xx_Error tfa98xx_dsp_read_excursion_model( - struct tfa_device *tfa, - int length, - unsigned char *pSpeakerBytes); - -/** - * load all the parameters for a preset from a file - */ -enum Tfa98xx_Error tfa98xx_dsp_write_preset(struct tfa_device *tfa, - int length, const unsigned char - *pPresetBytes); - -/** - * wrapper for dsp_msg that adds opcode and only writes - */ -enum Tfa98xx_Error tfa_dsp_cmd_id_write(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int num_bytes, - const unsigned char data[]); - -/** - * wrapper for dsp_msg that writes opcode and reads back the data - */ -enum Tfa98xx_Error tfa_dsp_cmd_id_write_read(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int num_bytes, - unsigned char data[]); - -/** - * wrapper for dsp_msg that adds opcode and 3 bytes required for coefs - */ -enum Tfa98xx_Error tfa_dsp_cmd_id_coefs(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int num_bytes, - unsigned char data[]); - -/** - * wrapper for dsp_msg that adds opcode and 3 bytes required for MBDrcDynamics - */ -enum Tfa98xx_Error tfa_dsp_cmd_id_MBDrc_dynamics(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int index_subband, - int num_bytes, unsigned char data[]); - -/** - * Disable a certain biquad. - * @param tfa the device struct pointer - * @param biquad_index: 1-10 of the biquad that needs to be adressed -*/ -enum Tfa98xx_Error Tfa98xx_DspBiquad_Disable(struct tfa_device *tfa, - int biquad_index); - -/** - * fill the calibration value as milli ohms in the struct - * assume that the device has been calibrated - */ -enum Tfa98xx_Error -tfa_dsp_get_calibration_impedance(struct tfa_device *tfa); - -/* - * return the mohm value - */ -int tfa_get_calibration_info(struct tfa_device *tfa, int channel); - -/* - * return sign extended tap pattern - */ -int tfa_get_tap_pattern(struct tfa_device *tfa); - -/** - * Reads a number of words from dsp memory - * @param tfa the device struct pointer - * @param subaddress write address to set in address register - * @param pValue pointer to read data -*/ -enum Tfa98xx_Error tfa98xx_read_register16(struct tfa_device *tfa, - unsigned char subaddress, - unsigned short *pValue); - -/** - * Reads a number of words from dsp memory - * @param tfa the device struct pointer - * @param subaddress write address to set in address register - * @param value value to write int the memory -*/ -enum Tfa98xx_Error tfa98xx_write_register16(struct tfa_device *tfa, - unsigned char subaddress, - unsigned short value); - -/** - * Intialise the dsp - * @param tfa the device struct pointer - * @return tfa error enum -*/ -enum Tfa98xx_Error -tfa98xx_init_dsp(struct tfa_device *tfa); - -/** - * Get the status of the external DSP - * @param tfa the device struct pointer - * @return status -*/ -int tfa98xx_get_dsp_status(struct tfa_device *tfa); - -/** - * Write a command message (RPC) to the dsp - * @param tfa the device struct pointer - * @param num_bytes command buffer size in bytes - * @param command_buffer - * @return tfa error enum -*/ -enum Tfa98xx_Error -tfa98xx_write_dsp(struct tfa_device *tfa, int num_bytes, const char *command_buffer); - -/** - * Read the result from the last message from the dsp - * @param tfa the device struct pointer - * @param num_bytes result buffer size in bytes - * @param result_buffer - * @return tfa error enum -*/ -enum Tfa98xx_Error -tfa98xx_read_dsp(struct tfa_device *tfa, int num_bytes, unsigned char *result_buffer); - -/** - * Write a command message (RPC) to the dsp and return the result - * @param tfa the device struct pointer - * @param command_length command buffer size in bytes - * @param command_buffer command buffer - * @param result_length result buffer size in bytes - * @param result_buffer result buffer - * @return tfa error enum -*/ -enum Tfa98xx_Error -tfa98xx_writeread_dsp(struct tfa_device *tfa, int command_length, void *command_buffer, - int result_length, void *result_buffer); - -/** - * Reads a number of words from dsp memory - * @param tfa the device struct pointer - * @param start_offset offset from where to start reading - * @param num_words number of words to read - * @param pValues pointer to read data -*/ -enum Tfa98xx_Error tfa98xx_dsp_read_mem(struct tfa_device *tfa, - unsigned int start_offset, - int num_words, int *pValues); -/** - * Write a value to dsp memory - * @param tfa the device struct pointer - * @param address write address to set in address register - * @param value value to write int the memory - * @param memtype type of memory to write to -*/ -enum Tfa98xx_Error tfa98xx_dsp_write_mem_word(struct tfa_device *tfa, - unsigned short address, int value, int memtype); - -/** - * Read data from dsp memory - * @param tfa the device struct pointer - * @param subaddress write address to set in address register - * @param num_bytes number of bytes to read from dsp - * @param data the unsigned char buffer to read data into -*/ -enum Tfa98xx_Error tfa98xx_read_data(struct tfa_device *tfa, - unsigned char subaddress, - int num_bytes, unsigned char data[]); - -/** - * Write all the bytes specified by num_bytes and data to dsp memory - * @param tfa the device struct pointer - * @param subaddress the subaddress to write to - * @param num_bytes number of bytes to write - * @param data actual data to write -*/ -enum Tfa98xx_Error tfa98xx_write_data(struct tfa_device *tfa, - unsigned char subaddress, - int num_bytes, - const unsigned char data[]); - -enum Tfa98xx_Error tfa98xx_write_raw(struct tfa_device *tfa, - int num_bytes, - const unsigned char data[]); - -/* support for converting error codes into text */ -const char *tfa98xx_get_error_string(enum Tfa98xx_Error error); - -/** - * convert signed 24 bit integers to 32bit aligned bytes - * input: data contains "num_bytes/3" int24 elements - * output: bytes contains "num_bytes" byte elements - * @param num_data length of the input data array - * @param data input data as integer array - * @param bytes output data as unsigned char array -*/ -void tfa98xx_convert_data2bytes(int num_data, const int data[], - unsigned char bytes[]); - -/** - * convert memory bytes to signed 24 bit integers - * input: bytes contains "num_bytes" byte elements - * output: data contains "num_bytes/3" int24 elements - * @param num_bytes length of the input data array - * @param bytes input data as unsigned char array - * @param data output data as integer array -*/ -void tfa98xx_convert_bytes2data(int num_bytes, const unsigned char bytes[], - int data[]); - -/** - * Read a part of the dsp memory - * @param tfa the device struct pointer - * @param memoryType indicator to the memory type - * @param offset from where to start reading - * @param length the number of bytes to read - * @param bytes output data as unsigned char array -*/ -enum Tfa98xx_Error tfa98xx_dsp_get_memory(struct tfa_device *tfa, int memoryType, - int offset, int length, unsigned char bytes[]); - -/** - * Write a value to the dsp memory - * @param tfa the device struct pointer - * @param memoryType indicator to the memory type - * @param offset from where to start writing - * @param length the number of bytes to write - * @param value the value to write to the dsp -*/ -enum Tfa98xx_Error tfa98xx_dsp_set_memory(struct tfa_device *tfa, int memoryType, - int offset, int length, int value); - -enum Tfa98xx_Error tfa98xx_dsp_write_config(struct tfa_device *tfa, int length, const unsigned char *p_config_bytes); -enum Tfa98xx_Error tfa98xx_dsp_write_drc(struct tfa_device *tfa, int length, const unsigned char *p_drc_bytes); - -/** - * write/read raw msg functions : - * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. - * The functions will return immediately and do not not wait for DSP reponse. - * @param tfa the device struct pointer - * @param length length of the character buffer to write - * @param buf character buffer to write -*/ -enum Tfa98xx_Error tfa_dsp_msg(struct tfa_device *tfa, int length, const char *buf); - - -/** - * The wrapper functions to call the dsp msg, register and memory function for tfa or probus - */ -enum Tfa98xx_Error dsp_msg(struct tfa_device *tfa, int length, const char *buf); -enum Tfa98xx_Error dsp_msg_read(struct tfa_device *tfa, int length, unsigned char *bytes); -enum Tfa98xx_Error reg_write(struct tfa_device *tfa, unsigned char subaddress, unsigned short value); -enum Tfa98xx_Error reg_read(struct tfa_device *tfa, unsigned char subaddress, unsigned short *value); -enum Tfa98xx_Error mem_write(struct tfa_device *tfa, unsigned short address, int value, int memtype); -enum Tfa98xx_Error mem_read(struct tfa_device *tfa, unsigned int start_offset, int num_words, int *pValues); - -enum Tfa98xx_Error dsp_partial_coefficients(struct tfa_device *tfa, uint8_t *prev, uint8_t *next); -int is_94_N2_device(struct tfa_device *tfa); -/** - * write/read raw msg functions: - * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. - * The functions will return immediately and do not not wait for DSP reponse. - * An ID is added to modify the command-ID - * @param tfa the device struct pointer - * @param length length of the character buffer to write - * @param buf character buffer to write - * @param cmdid command identifier -*/ -enum Tfa98xx_Error tfa_dsp_msg_id(struct tfa_device *tfa, int length, const char *buf, uint8_t cmdid[3]); - -/** - * write raw dsp msg functions - * @param tfa the device struct pointer - * @param length length of the character buffer to write - * @param buffer character buffer to write -*/ -enum Tfa98xx_Error tfa_dsp_msg_write(struct tfa_device *tfa, int length, const char *buffer); - -/** - * write raw dsp msg functions - * @param tfa the device struct pointer - * @param length length of the character buffer to write - * @param buffer character buffer to write - * @param cmdid command identifier -*/ -enum Tfa98xx_Error tfa_dsp_msg_write_id(struct tfa_device *tfa, int length, const char *buffer, uint8_t cmdid[3]); - -/** - * status function used by tfa_dsp_msg() to retrieve command/msg status: - * return a <0 status of the DSP did not ACK. - * @param tfa the device struct pointer - * @param pRpcStatus status for remote processor communication -*/ -enum Tfa98xx_Error tfa_dsp_msg_status(struct tfa_device *tfa, int *pRpcStatus); - -/** - * Read a message from dsp - * @param tfa the device struct pointer - * @param length number of bytes of the message - * @param bytes pointer to unsigned char buffer -*/ -enum Tfa98xx_Error tfa_dsp_msg_read(struct tfa_device *tfa, int length, unsigned char *bytes); - -int tfa_set_bf(struct tfa_device *tfa, const uint16_t bf, const uint16_t value); -int tfa_set_bf_volatile(struct tfa_device *tfa, const uint16_t bf, const uint16_t value); - -/** - * Get the value of a given bitfield - * @param tfa the device struct pointer - * @param bf the value indicating which bitfield - */ -int tfa_get_bf(struct tfa_device *tfa, const uint16_t bf); - -/** - * Set the value of a given bitfield - * @param bf the value indicating which bitfield - * @param bf_value the value of the bitfield - * @param p_reg_value a pointer to the register where to write the bitfield value - */ -int tfa_set_bf_value(const uint16_t bf, const uint16_t bf_value, uint16_t *p_reg_value); - -uint16_t tfa_get_bf_value(const uint16_t bf, const uint16_t reg_value); -int tfa_write_reg(struct tfa_device *tfa, const uint16_t bf, const uint16_t reg_value); -int tfa_read_reg(struct tfa_device *tfa, const uint16_t bf); - -/* bitfield */ -/** - * get the datasheet or bitfield name corresponding to the bitfield number - * @param num is the number for which to get the bitfield name - * @param rev is the device type - */ -char *tfaContBfName(uint16_t num, unsigned short rev); - -/** - * get the datasheet name corresponding to the bitfield number - * @param num is the number for which to get the bitfield name - * @param rev is the device type - */ -char *tfaContDsName(uint16_t num, unsigned short rev); - -/** - * get the bitfield name corresponding to the bitfield number - * @param num is the number for which to get the bitfield name - * @param rev is the device type - */ -char *tfaContBitName(uint16_t num, unsigned short rev); - -/** - * get the bitfield number corresponding to the bitfield name - * @param name is the bitfield name for which to get the bitfield number - * @param rev is the device type - */ -uint16_t tfaContBfEnum(const char *name, unsigned short rev); - -/** -* get the bitfield number corresponding to the bitfield name, checks for all devices -* @param name is the bitfield name for which to get the bitfield number - */ -uint16_t tfaContBfEnumAny(const char *name); - -#define TFA_FAM(tfa, fieldname) ((tfa->tfa_family == 1) ? TFA1_BF_##fieldname : TFA2_BF_##fieldname) -#define TFA_FAM_FW(tfa, fwname) ((tfa->tfa_family == 1) ? TFA1_FW_##fwname : TFA2_FW_##fwname) - -/* set/get bit fields to HW register*/ -#define TFA_SET_BF(tfa, fieldname, value) tfa_set_bf(tfa, TFA_FAM(tfa, fieldname), value) -#define TFA_SET_BF_VOLATILE(tfa, fieldname, value) tfa_set_bf_volatile(tfa, TFA_FAM(tfa, fieldname), value) -#define TFA_GET_BF(tfa, fieldname) tfa_get_bf(tfa, TFA_FAM(tfa, fieldname)) - -/* set/get bit field in variable */ -#define TFA_SET_BF_VALUE(tfa, fieldname, bf_value, p_reg_value) tfa_set_bf_value(TFA_FAM(tfa, fieldname), bf_value, p_reg_value) -#define TFA_GET_BF_VALUE(tfa, fieldname, reg_value) tfa_get_bf_value(TFA_FAM(tfa, fieldname), reg_value) - -/* write/read registers using a bit field name to determine the register address */ -#define TFA_WRITE_REG(tfa, fieldname, value) tfa_write_reg(tfa, TFA_FAM(tfa, fieldname), value) -#define TFA_READ_REG(tfa, fieldname) tfa_read_reg(tfa, TFA_FAM(tfa, fieldname)) - -/* FOR CALIBRATION RETRIES */ -#define TFA98XX_API_WAITRESULT_NTRIES 3000 // defined in API - -/** - * run the startup/init sequence and set ACS bit - * @param tfa the device struct pointer - * @param state the cold start state that is requested - */ -enum Tfa98xx_Error tfaRunColdboot(struct tfa_device *tfa, int state); -enum Tfa98xx_Error tfaRunMute(struct tfa_device *tfa); -enum Tfa98xx_Error tfaRunUnmute(struct tfa_device *tfa); - -/** - * wait for calibrateDone - * @param tfa the device struct pointer - * @param calibrateDone pointer to status of calibration - */ -enum Tfa98xx_Error tfaRunWaitCalibration(struct tfa_device *tfa, int *calibrateDone); - -/** - * run the startup/init sequence and set ACS bit - * @param tfa the device struct pointer - * @param profile the profile that should be loaded - */ -enum Tfa98xx_Error tfaRunColdStartup(struct tfa_device *tfa, int profile); - -/** - * this will load the patch witch will implicitly start the DSP - * if no patch is available the DPS is started immediately - * @param tfa the device struct pointer - */ -enum Tfa98xx_Error tfaRunStartDSP(struct tfa_device *tfa); - -/** - * start the clocks and wait until the AMP is switching - * on return the DSP sub system will be ready for loading - * @param tfa the device struct pointer - * @param profile the profile that should be loaded on startup - */ -enum Tfa98xx_Error tfaRunStartup(struct tfa_device *tfa, int profile); - -/** - * start the maximus speakerboost algorithm - * this implies a full system startup when the system was not already started - * @param tfa the device struct pointer - * @param force indicates wether a full system startup should be allowed - * @param profile the profile that should be loaded - */ -enum Tfa98xx_Error tfaRunSpeakerBoost(struct tfa_device *tfa, int force, int profile); - -/** - * Startup the device and write all files from device and profile section - * @param tfa the device struct pointer - * @param force indicates wether a full system startup should be allowed - * @param profile the profile that should be loaded on speaker startup - */ -enum Tfa98xx_Error tfaRunSpeakerStartup(struct tfa_device *tfa, int force, int profile); - -/** - * Run calibration - * @param tfa the device struct pointer - */ -enum Tfa98xx_Error tfaRunSpeakerCalibration(struct tfa_device *tfa); - -/** - * startup all devices. all step until patch loading is handled - * @param tfa the device struct pointer - */ -int tfaRunStartupAll(struct tfa_device *tfa); - -/** - * powerup the coolflux subsystem and wait for it - * @param tfa the device struct pointer - */ -enum Tfa98xx_Error tfa_cf_powerup(struct tfa_device *tfa); - -/* - * print the current device manager state - * @param tfa the device struct pointer - */ -enum Tfa98xx_Error show_current_state(struct tfa_device *tfa); - -/** - * Init registers and coldboot dsp - * @param tfa the device struct pointer - */ -int tfa_reset(struct tfa_device *tfa); - -/** - * Get profile from a register - * @param tfa the device struct pointer - */ -int tfa_dev_get_swprof(struct tfa_device *tfa); - -/** - * Save profile in a register - */ -int tfa_dev_set_swprof(struct tfa_device *tfa, unsigned short new_value); - -int tfa_dev_get_swvstep(struct tfa_device *tfa); - -int tfa_dev_set_swvstep(struct tfa_device *tfa, unsigned short new_value); - -int tfa_needs_reset(struct tfa_device *tfa); - -int tfa_is_cold(struct tfa_device *tfa); - -void tfa_set_query_info(struct tfa_device *tfa); - -int tfa_get_pga_gain(struct tfa_device *tfa); -int tfa_set_pga_gain(struct tfa_device *tfa, uint16_t value); -int tfa_get_noclk(struct tfa_device *tfa); - -/** - * Status of used for monitoring - * @param tfa the device struct pointer - * @return tfa error enum - */ - -enum Tfa98xx_Error tfa_status(struct tfa_device *tfa); - -/* - * function overload for flag_mtp_busy - */ -int tfa_dev_get_mtpb(struct tfa_device *tfa); - -enum Tfa98xx_Error tfaGetFwApiVersion(struct tfa_device *tfa, unsigned char *pFirmwareVersion); -#ifdef __cplusplus -} -#endif -#endif /* TFA_SERVICE_H */ diff --git a/techpack/audio/asoc/codecs/tfa98xx/inc/versions.h b/techpack/audio/asoc/codecs/tfa98xx/inc/versions.h deleted file mode 100755 index 437fe7c3c012..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/inc/versions.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _VERSIONS_H -#define TFA98XX_GIT_VERSIONS "v6.5.2_xxxxxxxxxx" -#define _VERSIONS_H -#endif - diff --git a/techpack/audio/asoc/codecs/tfa98xx/src/tfa98xx.c b/techpack/audio/asoc/codecs/tfa98xx/src/tfa98xx.c deleted file mode 100644 index 4530012b2793..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/src/tfa98xx.c +++ /dev/null @@ -1,4419 +0,0 @@ -/* - * tfa98xx.c tfa98xx codec module - * - * - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -#define pr_fmt(fmt) "%s(): " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "config.h" -#include "tfa98xx.h" -#include "tfa.h" -#include "tfa_dsp_fw.h" - - /* required for enum tfa9912_irq */ -#include "tfa98xx_tfafieldnames.h" - -#include "spk-id.h" - -#define TFA98XX_VERSION TFA98XX_API_REV_STR - -#define I2C_RETRIES 50 -#define I2C_RETRY_DELAY 5 /* ms */ - -/* Change volume selection behavior: - * Uncomment following line to generate a profile change when updating - * a volume control (also changes to the profile of the modified volume - * control) - */ - /*#define TFA98XX_ALSA_CTRL_PROF_CHG_ON_VOL 1 - */ - - /* Supported rates and data formats */ -#define TFA98XX_RATES SNDRV_PCM_RATE_8000_48000 -#define TFA98XX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) - -#define TF98XX_MAX_DSP_START_TRY_COUNT 10 - -#define TFA98XX_AAC_FW_NAME "tfa98xx_aac.cnt" -#define TFA98XX_GOER_FW_NAME "tfa98xx_goer.cnt" - -/* data accessible by all instances */ -static struct kmem_cache *tfa98xx_cache; /* Memory pool used for DSP messages */ -/* Mutex protected data */ -static DEFINE_MUTEX(tfa98xx_mutex); -static LIST_HEAD(tfa98xx_device_list); -static int tfa98xx_device_count; -static int tfa98xx_sync_count; -static LIST_HEAD(profile_list); /* list of user selectable profiles */ -static int tfa98xx_mixer_profiles; /* number of user selectable profiles */ -static int tfa98xx_mixer_profile; /* current mixer profile */ -static struct snd_kcontrol_new *tfa98xx_controls; -static TfaContainer_t *tfa98xx_container; - -static int tfa98xx_kmsg_regs; -static int tfa98xx_ftrace_regs; - -static char *fw_name = "tfa98xx.cnt"; -module_param(fw_name, charp, 0644); -MODULE_PARM_DESC(fw_name, "TFA98xx DSP firmware (container file) name."); - -static int trace_level; -module_param(trace_level, int, 0444); -MODULE_PARM_DESC(trace_level, "TFA98xx debug trace level (0=off, bits:1=verbose,2=regdmesg,3=regftrace,4=timing)."); - -static char *dflt_prof_name = ""; -module_param(dflt_prof_name, charp, 0444); - -static int no_start; -module_param(no_start, int, 0444); -MODULE_PARM_DESC(no_start, "do not start the work queue; for debugging via user\n"); - -static int no_reset; -module_param(no_reset, int, 0444); -MODULE_PARM_DESC(no_reset, "do not use the reset line; for debugging via user\n"); - -static int pcm_no_constraint; -module_param(pcm_no_constraint, int, 0444); -MODULE_PARM_DESC(pcm_no_constraint, "do not use constraints for PCM parameters\n"); - -static void tfa98xx_tapdet_check_update(struct tfa98xx *tfa98xx); -static int tfa98xx_get_fssel(unsigned int rate); -static void tfa98xx_interrupt_enable(struct tfa98xx *tfa98xx, bool enable); - -static int get_profile_from_list(char *buf, int id); -static int get_profile_id_for_sr(int id, unsigned int rate); - -struct tfa98xx_rate { - unsigned int rate; - unsigned int fssel; -}; - -static const struct tfa98xx_rate rate_to_fssel[] = { - { 8000, 0 }, - { 11025, 1 }, - { 12000, 2 }, - { 16000, 3 }, - { 22050, 4 }, - { 24000, 5 }, - { 32000, 6 }, - { 44100, 7 }, - { 48000, 8 }, -}; - -int nxp_spk_id_get(struct device_node *np) -{ - int id = VENDOR_ID_UNKNOWN; - int state = 3; - - /*state = spk_id_get_pin_3state(np); - if (state < 0) { - pr_err("%s: Can not get id pin state, %d\n", __func__, state); - return VENDOR_ID_NONE; - }*/ - - switch (state) { - case PIN_PULL_DOWN: - id = VENDOR_ID_GOER; - break; - case PIN_PULL_UP: - id = VENDOR_ID_UNKNOWN; - break; - case PIN_FLOAT: - id = VENDOR_ID_AAC; - break; - default: - id = VENDOR_ID_NONE; - break; - } - return id; -} - -static int nxp_vendor_id_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = VENDOR_ID_NONE; - - if (tfa98xx->spk_id_gpio_p) - ucontrol->value.integer.value[0] = nxp_spk_id_get(tfa98xx->spk_id_gpio_p); - return 0; -} - -static const char *const nxp_vendor_id_text[] = {"None", "AAC", "SSI", "GOER", "Unknown"}; - -static const struct soc_enum nxp_vendor_id[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(nxp_vendor_id_text), nxp_vendor_id_text), -}; - -const struct snd_kcontrol_new nxp_spk_id_controls[] = { - SOC_ENUM_EXT("SPK ID", nxp_vendor_id, nxp_vendor_id_get, NULL), -}; - -static inline char *tfa_cont_profile_name(struct tfa98xx *tfa98xx, int prof_idx) -{ - if (tfa98xx->tfa->cnt == NULL) - return NULL; - return tfaContProfileName(tfa98xx->tfa->cnt, tfa98xx->tfa->dev_idx, prof_idx); -} - -static enum tfa_error tfa98xx_write_re25(struct tfa_device *tfa, int value) -{ - enum tfa_error err; - - /* clear MTPEX */ - err = tfa_dev_mtp_set(tfa, TFA_MTP_EX, 0); - if (err == tfa_error_ok) { - /* set RE25 in shadow regiser */ - err = tfa_dev_mtp_set(tfa, TFA_MTP_RE25_PRIM, value); - } - if (err == tfa_error_ok) { - /* set MTPEX to copy RE25 into MTP */ - err = tfa_dev_mtp_set(tfa, TFA_MTP_EX, 2); - } - - return err; -} - -/* Wrapper for tfa start */ -static enum tfa_error tfa98xx_tfa_start(struct tfa98xx *tfa98xx, int next_profile, int vstep) -{ - enum tfa_error err; - ktime_t start_time, stop_time; - u64 delta_time; - - start_time = ktime_get_boottime(); - - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ -#ifdef __KERNEL__ - err = tfa_dev_start(tfa98xx->tfa, next_profile, vstep, tfa98xx->pcm_format); -#else - err = tfa_dev_start(tfa98xx->tfa, next_profile, vstep); -#endif - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ - pr_debug("%s after performed tfa_dev_start return (%d)\n", __func__, err); - - if (trace_level & 8) { - stop_time = ktime_get_boottime(); - delta_time = ktime_to_ns(ktime_sub(stop_time, start_time)); - do_div(delta_time, 1000); - dev_dbg(&tfa98xx->i2c->dev, "tfa_dev_start(%d,%d) time = %lld us\n", - next_profile, vstep, delta_time); - } - - if ((err == tfa_error_ok) && (tfa98xx->set_mtp_cal)) { - enum tfa_error err_cal; - - err_cal = tfa98xx_write_re25(tfa98xx->tfa, tfa98xx->cal_data); - if (err_cal != tfa_error_ok) { - pr_err("Error, setting calibration value in mtp, err=%d\n", err_cal); - } else { - tfa98xx->set_mtp_cal = false; - pr_debug("Calibration value (%d) set in mtp\n", - tfa98xx->cal_data); - } - } - - /* Check and update tap-detection state (in case of profile change) */ - tfa98xx_tapdet_check_update(tfa98xx); - - /* Remove sticky bit by reading it once */ - tfa_get_noclk(tfa98xx->tfa); - - /* A cold start erases the configuration, including interrupts setting. - * Restore it if required - */ - tfa98xx_interrupt_enable(tfa98xx, true); - - return err; -} - -static int tfa98xx_input_open(struct input_dev *dev) -{ - struct tfa98xx *tfa98xx = input_get_drvdata(dev); - - dev_dbg(tfa98xx->codec->dev, "opening device file\n"); - - /* note: open function is called only once by the framework. - * No need to count number of open file instances. - */ - if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) { - dev_dbg(&tfa98xx->i2c->dev, - "DSP not loaded, cannot start tap-detection\n"); - return -EIO; - } - - /* enable tap-detection service */ - tfa98xx->tapdet_open = true; - tfa98xx_tapdet_check_update(tfa98xx); - - return 0; -} - -static void tfa98xx_input_close(struct input_dev *dev) -{ - struct tfa98xx *tfa98xx = input_get_drvdata(dev); - - dev_dbg(tfa98xx->codec->dev, "closing device file\n"); - - /* Note: close function is called if the device is unregistered */ - - /* disable tap-detection service */ - tfa98xx->tapdet_open = false; - tfa98xx_tapdet_check_update(tfa98xx); -} - -static int tfa98xx_register_inputdev(struct tfa98xx *tfa98xx) -{ - int err; - struct input_dev *input; - - input = input_allocate_device(); - - if (!input) { - dev_err(tfa98xx->codec->dev, "Unable to allocate input device\n"); - return -ENOMEM; - } - - input->evbit[0] = BIT_MASK(EV_KEY); - input->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_0); - input->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1); - input->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2); - input->keybit[BIT_WORD(BTN_3)] |= BIT_MASK(BTN_3); - input->keybit[BIT_WORD(BTN_4)] |= BIT_MASK(BTN_4); - input->keybit[BIT_WORD(BTN_5)] |= BIT_MASK(BTN_5); - input->keybit[BIT_WORD(BTN_6)] |= BIT_MASK(BTN_6); - input->keybit[BIT_WORD(BTN_7)] |= BIT_MASK(BTN_7); - input->keybit[BIT_WORD(BTN_8)] |= BIT_MASK(BTN_8); - input->keybit[BIT_WORD(BTN_9)] |= BIT_MASK(BTN_9); - - input->open = tfa98xx_input_open; - input->close = tfa98xx_input_close; - - input->name = "tfa98xx-tapdetect"; - - input->id.bustype = BUS_I2C; - input_set_drvdata(input, tfa98xx); - - err = input_register_device(input); - if (err) { - dev_err(tfa98xx->codec->dev, "Unable to register input device\n"); - goto err_free_dev; - } - - dev_dbg(tfa98xx->codec->dev, "Input device for tap-detection registered: %s\n", - input->name); - tfa98xx->input = input; - return 0; - -err_free_dev: - input_free_device(input); - return err; -} - -/* - * Check if an input device for tap-detection can and shall be registered. - * Register it if appropriate. - * If already registered, check if still relevant and remove it if necessary. - * unregister: true to request inputdev unregistration. - */ -static void __tfa98xx_inputdev_check_register(struct tfa98xx *tfa98xx, bool unregister) -{ - bool tap_profile = false; - unsigned int i; - - for (i = 0; i < tfa_cnt_get_dev_nprof(tfa98xx->tfa); i++) { - if (strstr(tfa_cont_profile_name(tfa98xx, i), ".tap")) { - tap_profile = true; - tfa98xx->tapdet_profiles |= 1 << i; - dev_info(tfa98xx->codec->dev, - "found a tap-detection profile (%d - %s)\n", - i, tfa_cont_profile_name(tfa98xx, i)); - } - } - - /* Check for device support: - * - at device level - * - at container (profile) level - */ - if (!(tfa98xx->flags & TFA98XX_FLAG_TAPDET_AVAILABLE) || - !tap_profile || - unregister) { - /* No input device supported or required */ - if (tfa98xx->input) { - input_unregister_device(tfa98xx->input); - tfa98xx->input = NULL; - } - return; - } - - /* input device required */ - if (tfa98xx->input) - dev_info(tfa98xx->codec->dev, "Input device already registered, skipping\n"); - else - tfa98xx_register_inputdev(tfa98xx); -} - -static void tfa98xx_inputdev_check_register(struct tfa98xx *tfa98xx) -{ - __tfa98xx_inputdev_check_register(tfa98xx, false); -} - -static void tfa98xx_inputdev_unregister(struct tfa98xx *tfa98xx) -{ - __tfa98xx_inputdev_check_register(tfa98xx, true); -} - -#ifdef CONFIG_DEBUG_FS -/* OTC reporting - * Returns the MTP0 OTC bit value - */ -static int tfa98xx_dbgfs_otc_get(void *data, u64 *val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - int value; - - mutex_lock(&tfa98xx->dsp_lock); - value = tfa_dev_mtp_get(tfa98xx->tfa, TFA_MTP_OTC); - mutex_unlock(&tfa98xx->dsp_lock); - - if (value < 0) { - pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, value); - return -EIO; - } - - *val = value; - pr_debug("[0x%x] OTC : %d\n", tfa98xx->i2c->addr, value); - - return 0; -} - -static int tfa98xx_dbgfs_otc_set(void *data, u64 val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - enum tfa_error err; - - if (val != 0 && val != 1) { - pr_err("[0x%x] Unexpected value %llu\n", tfa98xx->i2c->addr, val); - return -EINVAL; - } - - mutex_lock(&tfa98xx->dsp_lock); - err = tfa_dev_mtp_set(tfa98xx->tfa, TFA_MTP_OTC, val); - mutex_unlock(&tfa98xx->dsp_lock); - - if (err != tfa_error_ok) { - pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, err); - return -EIO; - } - - pr_debug("[0x%x] OTC < %llu\n", tfa98xx->i2c->addr, val); - - return 0; -} - -static int tfa98xx_dbgfs_mtpex_get(void *data, u64 *val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - int value; - - mutex_lock(&tfa98xx->dsp_lock); - value = tfa_dev_mtp_get(tfa98xx->tfa, TFA_MTP_EX); - mutex_unlock(&tfa98xx->dsp_lock); - - if (value < 0) { - pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, value); - return -EIO; - } - - - *val = value; - pr_debug("[0x%x] MTPEX : %d\n", tfa98xx->i2c->addr, value); - - return 0; -} - -static int tfa98xx_dbgfs_mtpex_set(void *data, u64 val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - enum tfa_error err; - - if (val != 0) { - pr_err("[0x%x] Can only clear MTPEX (0 value expected)\n", tfa98xx->i2c->addr); - return -EINVAL; - } - - mutex_lock(&tfa98xx->dsp_lock); - err = tfa_dev_mtp_set(tfa98xx->tfa, TFA_MTP_EX, val); - mutex_unlock(&tfa98xx->dsp_lock); - - if (err != tfa_error_ok) { - pr_err("[0x%x] Unable to check DSP access: %d\n", tfa98xx->i2c->addr, err); - return -EIO; - } - - pr_debug("[0x%x] MTPEX < 0\n", tfa98xx->i2c->addr); - - return 0; -} - -static int tfa98xx_dbgfs_temp_get(void *data, u64 *val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - - mutex_lock(&tfa98xx->dsp_lock); - *val = tfa98xx_get_exttemp(tfa98xx->tfa); - mutex_unlock(&tfa98xx->dsp_lock); - - pr_debug("[0x%x] TEMP : %llu\n", tfa98xx->i2c->addr, *val); - - return 0; -} - -static int tfa98xx_dbgfs_temp_set(void *data, u64 val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - - mutex_lock(&tfa98xx->dsp_lock); - tfa98xx_set_exttemp(tfa98xx->tfa, (short)val); - mutex_unlock(&tfa98xx->dsp_lock); - - pr_debug("[0x%x] TEMP < %llu\n", tfa98xx->i2c->addr, val); - - return 0; -} - -static ssize_t tfa98xx_dbgfs_start_set(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct i2c_client *i2c = file->private_data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - enum tfa_error ret; - char buf[32]; - static const char ref[] = "please calibrate now"; - int buf_size, cal_profile = 0; - - /* check string length, and account for eol */ - if (count > sizeof(ref) + 1 || count < (sizeof(ref) - 1)) - return -EINVAL; - - buf_size = min(count, (size_t)(sizeof(buf) - 1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - /* Compare string, excluding the trailing \0 and the potentials eol */ - if (strncmp(buf, ref, sizeof(ref) - 1)) - return -EINVAL; - - mutex_lock(&tfa98xx->dsp_lock); - ret = tfa_calibrate(tfa98xx->tfa); - if (ret == tfa_error_ok) { - cal_profile = tfaContGetCalProfile(tfa98xx->tfa); - if (cal_profile < 0) { - pr_warn("[0x%x] Calibration profile not found\n", - tfa98xx->i2c->addr); - } - - ret = tfa98xx_tfa_start(tfa98xx, cal_profile, tfa98xx->vstep); - } - if (ret == tfa_error_ok) - tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); - mutex_unlock(&tfa98xx->dsp_lock); - - if (ret) { - pr_info("[0x%x] Calibration start failed (%d)\n", tfa98xx->i2c->addr, ret); - return -EIO; - } else { - pr_debug("[0x%x] Calibration started\n", tfa98xx->i2c->addr); - } - - return count; -} - -static ssize_t tfa98xx_dbgfs_r_read(struct file *file, - char __user *user_buf, size_t count, - loff_t *ppos) -{ - struct i2c_client *i2c = file->private_data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - char *str; - uint16_t status; - int ret; - - mutex_lock(&tfa98xx->dsp_lock); - - /* Need to ensure DSP is access-able, use mtp read access for this - * purpose - */ - ret = tfa98xx_get_mtp(tfa98xx->tfa, &status); - if (ret) { - ret = -EIO; - pr_err("[0x%x] MTP read failed\n", tfa98xx->i2c->addr); - goto r_c_err; - } - - ret = tfaRunSpeakerCalibration(tfa98xx->tfa); - if (ret) { - ret = -EIO; - pr_err("[0x%x] calibration failed\n", tfa98xx->i2c->addr); - goto r_c_err; - } - - str = kmalloc(PAGE_SIZE, GFP_KERNEL); - if (!str) { - ret = -ENOMEM; - pr_err("[0x%x] memory allocation failed\n", tfa98xx->i2c->addr); - goto r_c_err; - } - - if (tfa98xx->tfa->spkr_count > 1) { - ret = snprintf(str, PAGE_SIZE, - "Prim:%d mOhms, Sec:%d mOhms\n", - tfa98xx->tfa->mohm[0], - tfa98xx->tfa->mohm[1]); - } else { - ret = snprintf(str, PAGE_SIZE, - "Prim:%d mOhms\n", - tfa98xx->tfa->mohm[0]); - } - - pr_debug("[0x%x] calib_done: %s", tfa98xx->i2c->addr, str); - - if (ret < 0) - goto r_err; - - ret = simple_read_from_buffer(user_buf, count, ppos, str, ret); - -r_err: - kfree(str); -r_c_err: - mutex_unlock(&tfa98xx->dsp_lock); - return ret; -} - -static ssize_t tfa98xx_dbgfs_version_read(struct file *file, - char __user *user_buf, size_t count, - loff_t *ppos) -{ - char str[] = TFA98XX_VERSION "\n"; - int ret; - - ret = simple_read_from_buffer(user_buf, count, ppos, str, sizeof(str)); - - return ret; -} - -static ssize_t tfa98xx_dbgfs_dsp_state_get(struct file *file, - char __user *user_buf, size_t count, - loff_t *ppos) -{ - struct i2c_client *i2c = file->private_data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - int ret = 0; - char *str; - - switch (tfa98xx->dsp_init) { - case TFA98XX_DSP_INIT_STOPPED: - str = "Stopped\n"; - break; - case TFA98XX_DSP_INIT_RECOVER: - str = "Recover requested\n"; - break; - case TFA98XX_DSP_INIT_FAIL: - str = "Failed init\n"; - break; - case TFA98XX_DSP_INIT_PENDING: - str = "Pending init\n"; - break; - case TFA98XX_DSP_INIT_DONE: - str = "Init complete\n"; - break; - default: - str = "Invalid\n"; - } - - pr_debug("[0x%x] dsp_state : %s\n", tfa98xx->i2c->addr, str); - - ret = simple_read_from_buffer(user_buf, count, ppos, str, strlen(str)); - return ret; -} - -static ssize_t tfa98xx_dbgfs_dsp_state_set(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct i2c_client *i2c = file->private_data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - enum tfa_error ret; - char buf[32]; - static const char start_cmd[] = "start"; - static const char stop_cmd[] = "stop"; - static const char mon_start_cmd[] = "monitor start"; - static const char mon_stop_cmd[] = "monitor stop"; - int buf_size; - - buf_size = min(count, (size_t)(sizeof(buf) - 1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - /* Compare strings, excluding the trailing \0 */ - if (!strncmp(buf, start_cmd, sizeof(start_cmd) - 1)) { - pr_info("[0x%x] Manual triggering of dsp start...\n", tfa98xx->i2c->addr); - mutex_lock(&tfa98xx->dsp_lock); - ret = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); - mutex_unlock(&tfa98xx->dsp_lock); - pr_debug("[0x%x] tfa_dev_start complete: %d\n", tfa98xx->i2c->addr, ret); - } else if (!strncmp(buf, stop_cmd, sizeof(stop_cmd) - 1)) { - pr_info("[0x%x] Manual triggering of dsp stop...\n", tfa98xx->i2c->addr); - mutex_lock(&tfa98xx->dsp_lock); - ret = tfa_dev_stop(tfa98xx->tfa); - mutex_unlock(&tfa98xx->dsp_lock); - pr_debug("[0x%x] tfa_dev_stop complete: %d\n", tfa98xx->i2c->addr, ret); - } else if (!strncmp(buf, mon_start_cmd, sizeof(mon_start_cmd) - 1)) { - pr_info("[0x%x] Manual start of monitor thread...\n", tfa98xx->i2c->addr); - queue_delayed_work(tfa98xx->tfa98xx_wq, - &tfa98xx->monitor_work, HZ); - } else if (!strncmp(buf, mon_stop_cmd, sizeof(mon_stop_cmd) - 1)) { - pr_info("[0x%x] Manual stop of monitor thread...\n", tfa98xx->i2c->addr); - cancel_delayed_work_sync(&tfa98xx->monitor_work); - } else { - return -EINVAL; - } - - return count; -} - -static ssize_t tfa98xx_dbgfs_fw_state_get(struct file *file, - char __user *user_buf, size_t count, - loff_t *ppos) -{ - struct i2c_client *i2c = file->private_data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - char *str; - - switch (tfa98xx->dsp_fw_state) { - case TFA98XX_DSP_FW_NONE: - str = "None\n"; - break; - case TFA98XX_DSP_FW_PENDING: - str = "Pending\n"; - break; - case TFA98XX_DSP_FW_FAIL: - str = "Fail\n"; - break; - case TFA98XX_DSP_FW_OK: - str = "Ok\n"; - break; - default: - str = "Invalid\n"; - } - - pr_debug("[0x%x] fw_state : %s", tfa98xx->i2c->addr, str); - - return simple_read_from_buffer(user_buf, count, ppos, str, strlen(str)); -} - -#ifdef TFA_NON_DSP_SOLUTION -extern int send_tfa_cal_apr(void *buf, int cmd_size, bool bRead); -#else -int send_tfa_cal_apr(void *buf, int cmd_size, bool bRead) -{ - return 0; -} -#endif - -static ssize_t tfa98xx_dbgfs_rpc_read(struct file *file, - char __user *user_buf, size_t count, - loff_t *ppos) -{ - struct i2c_client *i2c = file->private_data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - int ret = 0; - uint8_t *buffer; - enum Tfa98xx_Error error; - - if (tfa98xx->tfa == NULL) { - pr_debug("[0x%x] dsp is not available\n", tfa98xx->i2c->addr); - return -ENODEV; - } - - if (count == 0) - return 0; - - buffer = kmalloc(count, GFP_KERNEL); - if (buffer == NULL) { - pr_debug("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); - return -ENOMEM; - } - - mutex_lock(&tfa98xx->dsp_lock); - - if (tfa98xx->tfa->is_probus_device) { - error = send_tfa_cal_apr(buffer, count, true); - } else { - error = dsp_msg_read(tfa98xx->tfa, count, buffer); - } - mutex_unlock(&tfa98xx->dsp_lock); - if (error != Tfa98xx_Error_Ok) { - pr_debug("[0x%x] dsp_msg_read error: %d\n", tfa98xx->i2c->addr, error); - kfree(buffer); - return -EFAULT; - } - - ret = copy_to_user(user_buf, buffer, count); - kfree(buffer); - if (ret) - return -EFAULT; - - *ppos += count; - return count; -} - -static ssize_t tfa98xx_dbgfs_rpc_send(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct i2c_client *i2c = file->private_data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - TfaFileDsc_t *msg_file; - enum Tfa98xx_Error error; - int err = 0; - - if (tfa98xx->tfa == NULL) { - pr_debug("[0x%x] dsp is not available\n", tfa98xx->i2c->addr); - return -ENODEV; - } - - if (count == 0) - return 0; - - /* msg_file.name is not used */ - msg_file = kmalloc(count + sizeof(TfaFileDsc_t), GFP_KERNEL); - if (msg_file == NULL) { - pr_debug("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); - return -ENOMEM; - } - - msg_file->size = count; - if (copy_from_user(msg_file->data, user_buf, count)) - return -EFAULT; - - if (tfa98xx->tfa->is_probus_device) { - mutex_lock(&tfa98xx->dsp_lock); - error = send_tfa_cal_apr(msg_file->data, msg_file->size, false); - if (error != Tfa98xx_Error_Ok) { - pr_debug("[0x%x] dsp_msg error: %d\n", tfa98xx->i2c->addr, error); - err = -EIO; - } - mutex_unlock(&tfa98xx->dsp_lock); - - mdelay(2); - } else { - mutex_lock(&tfa98xx->dsp_lock); - - if ((msg_file->data[0] == 'M') && (msg_file->data[1] == 'G')) { - error = tfaContWriteFile(tfa98xx->tfa, msg_file, 0, 0); /* int vstep_idx, int vstep_msg_idx both 0 */ - if (error != Tfa98xx_Error_Ok) { - pr_debug("[0x%x] tfaContWriteFile error: %d\n", tfa98xx->i2c->addr, error); - err = -EIO; - } - } else { - error = dsp_msg(tfa98xx->tfa, msg_file->size, msg_file->data); - if (error != Tfa98xx_Error_Ok) { - pr_debug("[0x%x] dsp_msg error: %d\n", tfa98xx->i2c->addr, error); - err = -EIO; - } - } - mutex_unlock(&tfa98xx->dsp_lock); - } - - kfree(msg_file); - - if (err) - return err; - return count; -} -/* -- RPC */ - -static int tfa98xx_dbgfs_pga_gain_get(void *data, u64 *val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - unsigned int value; - - value = tfa_get_pga_gain(tfa98xx->tfa); - if (value < 0) - return -EINVAL; - - *val = value; - return 0; -} - -static int tfa98xx_dbgfs_pga_gain_set(void *data, u64 val) -{ - struct i2c_client *i2c = (struct i2c_client *)data; - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - uint16_t value; - int err; - - value = val & 0xffff; - if (value > 7) - return -EINVAL; - - err = tfa_set_pga_gain(tfa98xx->tfa, value); - if (err < 0) - return -EINVAL; - - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_calib_otc_fops, tfa98xx_dbgfs_otc_get, - tfa98xx_dbgfs_otc_set, "%llu\n"); -DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_calib_mtpex_fops, tfa98xx_dbgfs_mtpex_get, - tfa98xx_dbgfs_mtpex_set, "%llu\n"); -DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_calib_temp_fops, tfa98xx_dbgfs_temp_get, - tfa98xx_dbgfs_temp_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(tfa98xx_dbgfs_pga_gain_fops, tfa98xx_dbgfs_pga_gain_get, - tfa98xx_dbgfs_pga_gain_set, "%llu\n"); - -static const struct file_operations tfa98xx_dbgfs_calib_start_fops = { - .owner = THIS_MODULE, - .open = simple_open, - .write = tfa98xx_dbgfs_start_set, - .llseek = default_llseek, -}; - -static const struct file_operations tfa98xx_dbgfs_r_fops = { - .owner = THIS_MODULE, - .open = simple_open, - .read = tfa98xx_dbgfs_r_read, - .llseek = default_llseek, -}; - -static const struct file_operations tfa98xx_dbgfs_version_fops = { - .owner = THIS_MODULE, - .open = simple_open, - .read = tfa98xx_dbgfs_version_read, - .llseek = default_llseek, -}; - -static const struct file_operations tfa98xx_dbgfs_dsp_state_fops = { - .owner = THIS_MODULE, - .open = simple_open, - .read = tfa98xx_dbgfs_dsp_state_get, - .write = tfa98xx_dbgfs_dsp_state_set, - .llseek = default_llseek, -}; - -static const struct file_operations tfa98xx_dbgfs_fw_state_fops = { - .owner = THIS_MODULE, - .open = simple_open, - .read = tfa98xx_dbgfs_fw_state_get, - .llseek = default_llseek, -}; - -static const struct file_operations tfa98xx_dbgfs_rpc_fops = { - .owner = THIS_MODULE, - .open = simple_open, - .read = tfa98xx_dbgfs_rpc_read, - .write = tfa98xx_dbgfs_rpc_send, - .llseek = default_llseek, -}; - -static void tfa98xx_debug_init(struct tfa98xx *tfa98xx, struct i2c_client *i2c) -{ - char name[50]; - - scnprintf(name, MAX_CONTROL_NAME, "%s-%x", i2c->name, i2c->addr); - tfa98xx->dbg_dir = debugfs_create_dir(name, NULL); - debugfs_create_file("OTC", 0666, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_calib_otc_fops); - debugfs_create_file("MTPEX", 0666, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_calib_mtpex_fops); - debugfs_create_file("TEMP", 0666, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_calib_temp_fops); - debugfs_create_file("calibrate", 0666, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_calib_start_fops); - debugfs_create_file("R", 0444, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_r_fops); - debugfs_create_file("version", 0444, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_version_fops); - debugfs_create_file("dsp-state", 0666, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_dsp_state_fops); - debugfs_create_file("fw-state", 0666, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_fw_state_fops); - debugfs_create_file("rpc", 0666, tfa98xx->dbg_dir, - i2c, &tfa98xx_dbgfs_rpc_fops); - - if (tfa98xx->flags & TFA98XX_FLAG_SAAM_AVAILABLE) { - dev_dbg(tfa98xx->dev, "Adding pga_gain debug interface\n"); - debugfs_create_file("pga_gain", 0444, tfa98xx->dbg_dir, - tfa98xx->i2c, - &tfa98xx_dbgfs_pga_gain_fops); - } -} - -static void tfa98xx_debug_remove(struct tfa98xx *tfa98xx) -{ - debugfs_remove_recursive(tfa98xx->dbg_dir); -} -#endif - - -/* copies the profile basename (i.e. part until .) into buf */ -static void get_profile_basename(char *buf, char *profile) -{ - int cp_len = 0, idx = 0; - char *pch; - - pch = strchr(profile, '.'); - idx = pch - profile; - cp_len = (pch != NULL) ? idx : (int)strlen(profile); - memcpy(buf, profile, cp_len); - buf[cp_len] = 0; -} - -/* return the profile name accociated with id from the profile list */ -static int get_profile_from_list(char *buf, int id) -{ - struct tfa98xx_baseprofile *bprof; - - list_for_each_entry(bprof, &profile_list, list) { - if (bprof->item_id == id) { - strcpy(buf, bprof->basename); - return 0; - } - } - - return -1; -} - -/* search for the profile in the profile list */ -static int is_profile_in_list(char *profile, int len) -{ - struct tfa98xx_baseprofile *bprof; - - list_for_each_entry(bprof, &profile_list, list) { - - if ((len == bprof->len) && (strncmp(bprof->basename, profile, len) == 0)) - return 1; - } - - return 0; -} - -/* - * for the profile with id, look if the requested samplerate is - * supported, if found return the (container)profile for this - * samplerate, on error or if not found return -1 - */ -static int get_profile_id_for_sr(int id, unsigned int rate) -{ - int idx = 0; - struct tfa98xx_baseprofile *bprof; - - list_for_each_entry(bprof, &profile_list, list) { - if (id == bprof->item_id) { - idx = tfa98xx_get_fssel(rate); - if (idx < 0) { - /* samplerate not supported */ - return -1; - } - - return bprof->sr_rate_sup[idx]; - } - } - - /* profile not found */ - return -1; -} - -static int get_profile_id_by_name(char *profile, int len) -{ - struct tfa98xx_baseprofile *bprof; - int prof_index = -1; - - list_for_each_entry(bprof, &profile_list, list) { - if (strncmp(profile, bprof->basename, len) == 0) { - prof_index = bprof->item_id; - break; - } - } - - return prof_index; -} - -/* check if this profile is a calibration profile */ -static int is_calibration_profile(char *profile) -{ - if (strstr(profile, ".cal") != NULL) - return 1; - return 0; -} - -/* - * adds the (container)profile index of the samplerate found in - * the (container)profile to a fixed samplerate table in the (mixer)profile - */ -static int add_sr_to_profile(struct tfa98xx *tfa98xx, char *basename, int len, int profile) -{ - struct tfa98xx_baseprofile *bprof; - int idx = 0; - unsigned int sr = 0; - - list_for_each_entry(bprof, &profile_list, list) { - if ((len == bprof->len) && (strncmp(bprof->basename, basename, len) == 0)) { - /* add supported samplerate for this profile */ - sr = tfa98xx_get_profile_sr(tfa98xx->tfa, profile); - if (!sr) { - pr_err("unable to identify supported sample rate for %s\n", bprof->basename); - return -1; - } - - /* get the index for this samplerate */ - idx = tfa98xx_get_fssel(sr); - if (idx < 0 || idx >= TFA98XX_NUM_RATES) { - pr_err("invalid index for samplerate %d\n", idx); - return -1; - } - - /* enter the (container)profile for this samplerate at the corresponding index */ - bprof->sr_rate_sup[idx] = profile; - - pr_debug("added profile:samplerate = [%d:%d] for mixer profile: %s\n", profile, sr, bprof->basename); - } - } - - return 0; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0) -static struct snd_soc_codec *snd_soc_kcontrol_codec(struct snd_kcontrol *kcontrol) -{ - return snd_kcontrol_chip(kcontrol); -} -#endif - -static int tfa98xx_get_vstep(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - int mixer_profile = kcontrol->private_value; - int ret = 0; - int profile; - - profile = get_profile_id_for_sr(mixer_profile, tfa98xx->rate); - if (profile < 0) { - pr_err("tfa98xx: tfa98xx_get_vstep: invalid profile %d (mixer_profile=%d, rate=%d)\n", profile, mixer_profile, tfa98xx->rate); - return -EINVAL; - } - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - int vstep = tfa98xx->prof_vsteps[profile]; - - ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = - tfacont_get_max_vstep(tfa98xx->tfa, profile) - - vstep - 1; - } - mutex_unlock(&tfa98xx_mutex); - - return ret; -} - -static int tfa98xx_set_vstep(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - int mixer_profile = kcontrol->private_value; - int profile; - int err = 0; - int change = 0; - - pr_debug("%s no_start=%d\n", __func__, no_start); - if (no_start != 0) - return 0; - - profile = get_profile_id_for_sr(mixer_profile, tfa98xx->rate); - if (profile < 0) { - pr_err("tfa98xx: tfa98xx_set_vstep: invalid profile %d (mixer_profile=%d, rate=%d)\n", profile, mixer_profile, tfa98xx->rate); - return -EINVAL; - } - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - int vstep, vsteps; - int ready = 0; - int new_vstep; - int value = ucontrol->value.integer.value[tfa98xx->tfa->dev_idx]; - - vstep = tfa98xx->prof_vsteps[profile]; - vsteps = tfacont_get_max_vstep(tfa98xx->tfa, profile); - - if (vstep == vsteps - value - 1) - continue; - - new_vstep = vsteps - value - 1; - - if (new_vstep < 0) - new_vstep = 0; - - tfa98xx->prof_vsteps[profile] = new_vstep; - -#ifndef TFA98XX_ALSA_CTRL_PROF_CHG_ON_VOL - if (profile == tfa98xx->profile) { -#endif - /* this is the active profile, program the new vstep */ - tfa98xx->vstep = new_vstep; - mutex_lock(&tfa98xx->dsp_lock); - tfa98xx_dsp_system_stable(tfa98xx->tfa, &ready); - - if (ready) { - err = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); - if (err) { - pr_err("Write vstep error: %d\n", err); - } else { - pr_debug("Succesfully changed vstep index!\n"); - change = 1; - } - } - - mutex_unlock(&tfa98xx->dsp_lock); -#ifndef TFA98XX_ALSA_CTRL_PROF_CHG_ON_VOL - } -#endif - pr_debug("%d: vstep:%d, (control value: %d) - profile %d\n", - tfa98xx->tfa->dev_idx, new_vstep, value, profile); - } - - if (change) { - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - mutex_lock(&tfa98xx->dsp_lock); - tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); - mutex_unlock(&tfa98xx->dsp_lock); - } - } - - mutex_unlock(&tfa98xx_mutex); - - return change; -} - -static int tfa98xx_info_vstep(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - - int mixer_profile = tfa98xx_mixer_profile; - int profile = get_profile_id_for_sr(mixer_profile, tfa98xx->rate); - - if (profile < 0) { - pr_err("tfa98xx: tfa98xx_info_vstep: invalid profile %d (mixer_profile=%d, rate=%d)\n", profile, mixer_profile, tfa98xx->rate); - return -EINVAL; - } - - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - mutex_lock(&tfa98xx_mutex); - uinfo->count = tfa98xx_device_count; - mutex_unlock(&tfa98xx_mutex); - uinfo->value.integer.min = 0; - uinfo->value.integer.max = max(0, tfacont_get_max_vstep(tfa98xx->tfa, profile) - 1); - pr_debug("vsteps count: %d [prof=%d]\n", tfacont_get_max_vstep(tfa98xx->tfa, profile), - profile); - return 0; -} - -static int tfa98xx_get_profile(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&tfa98xx_mutex); - ucontrol->value.integer.value[0] = tfa98xx_mixer_profile; - mutex_unlock(&tfa98xx_mutex); - - return 0; -} - -static int tfa98xx_set_profile(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - int change = 0; - int new_profile; - int prof_idx; - int profile_count = tfa98xx_mixer_profiles; - int profile = tfa98xx_mixer_profile; - - if (no_start != 0) - return 0; - - new_profile = ucontrol->value.integer.value[0]; - if (new_profile == profile) - return 0; - - if ((new_profile < 0) || (new_profile >= profile_count)) { - pr_err("not existing profile (%d)\n", new_profile); - return -EINVAL; - } - - /* get the container profile for the requested sample rate */ - prof_idx = get_profile_id_for_sr(new_profile, tfa98xx->rate); - if (prof_idx < 0) { - pr_err("tfa98xx: sample rate [%d] not supported for this mixer profile [%d].\n", tfa98xx->rate, new_profile); - return 0; - } - pr_debug("selected container profile [%d]\n", prof_idx); - - /* update mixer profile */ - tfa98xx_mixer_profile = new_profile; - - /* modified by jiangtao.zeng begin. */ - /* we are updating profile index only if the device is not in operating mode, and will be start in tfa98xx_mute() later. - if the device in operating mode, we will apply new profile now. */ - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - int err; - int ready = 0; - - /* update 'real' profile (container profile) */ - tfa98xx->profile = prof_idx; - tfa98xx->vstep = tfa98xx->prof_vsteps[prof_idx]; - if (!tfa98xx->tfa->is_probus_device) { - /* Don't call tfa_dev_start() if there is no clock. */ - mutex_lock(&tfa98xx->dsp_lock); - tfa98xx_dsp_system_stable(tfa98xx->tfa, &ready); - if (ready && (tfa_dev_get_state(tfa98xx->tfa) == TFA_STATE_OPERATING)) { - /* Also re-enables the interrupts */ - err = tfa98xx_tfa_start(tfa98xx, prof_idx, tfa98xx->vstep); - if (err) { - pr_info("Write profile error: %d\n", err); - } else { - pr_debug("Changed to profile %d (vstep = %d)\n", - prof_idx, tfa98xx->vstep); - change = 1; - } - } - mutex_unlock(&tfa98xx->dsp_lock); - /* Flag DSP as invalidated as the profile change may invalidate the - * current DSP configuration. That way, further stream start can - * trigger a tfa_dev_start. - */ - tfa98xx->dsp_init = TFA98XX_DSP_INIT_INVALIDATED; - } - } - - if (change) { - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - mutex_lock(&tfa98xx->dsp_lock); - tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); - mutex_unlock(&tfa98xx->dsp_lock); - } - } - - mutex_unlock(&tfa98xx_mutex); - - /* modified by jiangtao.zeng end. */ - - return change; -} - -static int tfa98xx_info_profile(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - char profile_name[MAX_CONTROL_NAME] = { 0 }; - int count = tfa98xx_mixer_profiles, err = -1; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - uinfo->value.enumerated.items = count; - - if (uinfo->value.enumerated.item >= count) - uinfo->value.enumerated.item = count - 1; - - err = get_profile_from_list(profile_name, uinfo->value.enumerated.item); - if (err != 0) - return -EINVAL; - - strcpy(uinfo->value.enumerated.name, profile_name); - - return 0; -} - -static int tfa98xx_info_stop_ctl(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - mutex_lock(&tfa98xx_mutex); - uinfo->count = tfa98xx_device_count; - mutex_unlock(&tfa98xx_mutex); - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 1; - - return 0; -} - -static int tfa98xx_get_stop_ctl(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tfa98xx *tfa98xx; - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = 0; - } - mutex_unlock(&tfa98xx_mutex); - - return 0; -} - -static int tfa98xx_set_stop_ctl(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tfa98xx *tfa98xx; - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - int ready = 0; - int i = tfa98xx->tfa->dev_idx; - - pr_debug("%d: %ld\n", i, ucontrol->value.integer.value[i]); - - tfa98xx_dsp_system_stable(tfa98xx->tfa, &ready); - - if ((ucontrol->value.integer.value[i] != 0) && ready) { - cancel_delayed_work_sync(&tfa98xx->monitor_work); - - cancel_delayed_work_sync(&tfa98xx->init_work); - if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) - continue; - - mutex_lock(&tfa98xx->dsp_lock); - tfa_dev_stop(tfa98xx->tfa); - tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; - mutex_unlock(&tfa98xx->dsp_lock); - } - - ucontrol->value.integer.value[i] = 0; - } - mutex_unlock(&tfa98xx_mutex); - - return 1; -} - -static int tfa98xx_info_PAmute(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - mutex_lock(&tfa98xx_mutex); - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = tfa98xx_device_count; - uinfo->value.integer.min = TFA98XX_DEVICE_MUTE_OFF; - uinfo->value.integer.max = TFA98XX_DEVICE_MUTE_ON; - mutex_unlock(&tfa98xx_mutex); - - return 0; -} - -static int tfa98xx_get_PAmute(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tfa98xx *tfa98xx = NULL; - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = tfa98xx->tfa_mute_mode; - } - mutex_unlock(&tfa98xx_mutex); - - return 0; -} - -static int tfa98xx_set_PAmute(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tfa98xx *tfa98xx = NULL; - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - if (ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] != TFA98XX_DEVICE_MUTE_OFF) { - tfa98xx->tfa_mute_mode = TFA98XX_DEVICE_MUTE_ON; - } else { - tfa98xx->tfa_mute_mode = TFA98XX_DEVICE_MUTE_OFF; - } - } - mutex_unlock(&tfa98xx_mutex); - - return 1; -} - -static int tfa98xx_info_cal_ctl(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - mutex_lock(&tfa98xx_mutex); - uinfo->count = tfa98xx_device_count; - mutex_unlock(&tfa98xx_mutex); - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xffff; /* 16 bit value */ - - return 0; -} - -static int tfa98xx_set_cal_ctl(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tfa98xx *tfa98xx; - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - enum tfa_error err; - int i = tfa98xx->tfa->dev_idx; - - tfa98xx->cal_data = (uint16_t)ucontrol->value.integer.value[i]; - - mutex_lock(&tfa98xx->dsp_lock); - err = tfa98xx_write_re25(tfa98xx->tfa, tfa98xx->cal_data); - tfa98xx->set_mtp_cal = (err != tfa_error_ok); - if (tfa98xx->set_mtp_cal == false) { - pr_debug("Calibration value (%d) set in mtp\n", - tfa98xx->cal_data); - } - mutex_unlock(&tfa98xx->dsp_lock); - } - mutex_unlock(&tfa98xx_mutex); - - return 1; -} - -static int tfa98xx_get_cal_ctl(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tfa98xx *tfa98xx; - - mutex_lock(&tfa98xx_mutex); - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - mutex_lock(&tfa98xx->dsp_lock); - ucontrol->value.integer.value[tfa98xx->tfa->dev_idx] = tfa_dev_mtp_get(tfa98xx->tfa, TFA_MTP_RE25_PRIM); - mutex_unlock(&tfa98xx->dsp_lock); - } - mutex_unlock(&tfa98xx_mutex); - - return 0; -} - -#ifdef TFA_NON_DSP_SOLUTION -static atomic_t g_bypass; -static atomic_t g_Tx_enable; -extern int send_tfa_cal_set_bypass(void *buf, int cmd_size); -extern int send_tfa_cal_set_tx_enable(void *buf, int cmd_size); - -/*************bypass control***************/ -static int tfa987x_algo_get_status(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t ret = 0; - - ucontrol->value.integer.value[0] = atomic_read(&g_bypass); - return ret; -} - -static int tfa987x_algo_set_status(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t ret = 0; - u8 buff[56] = {0}, *ptr = buff; - ((int32_t *)buff)[0] = ucontrol->value.integer.value[0]; - pr_err("%s:status data %d\n", __func__, ((int32_t *)buff)[0]); - atomic_set(&g_bypass, ((int32_t *)buff)[0]); - ret = send_tfa_cal_set_bypass(ptr, 4); - return ret; -} - -static int tfa987x_algo_set_tx_enable(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t ret = 0; - u8 buff[56] = {0}, *ptr = buff; - ((int32_t *)buff)[0] = ucontrol->value.integer.value[0]; - pr_err("%s:set_tx_enable %d\n", __func__, ((int32_t *)buff)[0]); - atomic_set(&g_Tx_enable, ((int32_t *)buff)[0]); - ret = send_tfa_cal_set_tx_enable(ptr, 4); - return ret; -} - -static int tfa987x_algo_get_tx_status(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t ret = 0; - - ucontrol->value.integer.value[0] = atomic_read(&g_Tx_enable); - return ret; -} - -static const char *tfa987x_algo_text[] = { - "DISABLE", "ENABLE" -}; - -static const char *tfa987x_tx_text[] = { - "DISABLE", "ENABLE" -}; - -static const struct soc_enum tfa987x_algo_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tfa987x_algo_text), tfa987x_algo_text) -}; - -static const struct soc_enum tfa987x_tx_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tfa987x_tx_text), tfa987x_tx_text) -}; - -const struct snd_kcontrol_new tfa987x_algo_controls[] = { - SOC_ENUM_EXT("TFA987X_ALGO_STATUS", tfa987x_algo_enum[0], tfa987x_algo_get_status, tfa987x_algo_set_status), - SOC_ENUM_EXT("TFA987X_TX_ENABLE", tfa987x_tx_enum[0], tfa987x_algo_get_tx_status, tfa987x_algo_set_tx_enable) -}; -#endif - -static int tfa98xx_create_controls(struct tfa98xx *tfa98xx) -{ - int prof, nprof, mix_index = 0; - int nr_controls = 0, id = 0; - char *name; - struct tfa98xx_baseprofile *bprofile; - int ret = 0; - - /* Create the following controls: - * - enum control to select the active profile - * - one volume control for each profile hosting a vstep - * - Stop control on TFA1 devices - */ - - nr_controls = 2; /* Profile and stop control */ - - if (tfa98xx->flags & TFA98XX_FLAG_CALIBRATION_CTL) - nr_controls += 1; /* calibration */ - - /* allocate the tfa98xx_controls base on the nr of profiles */ - nprof = tfa_cnt_get_dev_nprof(tfa98xx->tfa); - for (prof = 0; prof < nprof; prof++) { - if (tfacont_get_max_vstep(tfa98xx->tfa, prof)) - nr_controls++; /* Playback Volume control */ - } - if (tfa98xx->tfa->tfa_family == 2) { - nr_controls++; /* Playback Volume control */ - } - - tfa98xx_controls = devm_kzalloc(tfa98xx->codec->dev, - nr_controls * sizeof(tfa98xx_controls[0]), GFP_KERNEL); - if (!tfa98xx_controls) - return -ENOMEM; - - /* Create a mixer item for selecting the active profile */ - name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); - if (!name) - return -ENOMEM; - scnprintf(name, MAX_CONTROL_NAME, "%s Profile", tfa98xx->fw.name); - tfa98xx_controls[mix_index].name = name; - tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; - tfa98xx_controls[mix_index].info = tfa98xx_info_profile; - tfa98xx_controls[mix_index].get = tfa98xx_get_profile; - tfa98xx_controls[mix_index].put = tfa98xx_set_profile; - // tfa98xx_controls[mix_index].private_value = profs; /* save number of profiles */ - mix_index++; - /* add new mixer control item 'SmartPA Mute' for MAX2 device. */ - if (tfa98xx->tfa->tfa_family == 2) { - tfa98xx_controls[mix_index].name = "SmartPA Mute"; - tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; - tfa98xx_controls[mix_index].info = tfa98xx_info_PAmute; - tfa98xx_controls[mix_index].get = tfa98xx_get_PAmute; - tfa98xx_controls[mix_index].put = tfa98xx_set_PAmute; - mix_index++; - } - - /* create mixer items for each profile that has volume */ - for (prof = 0; prof < nprof; prof++) { - /* create an new empty profile */ - bprofile = devm_kzalloc(tfa98xx->codec->dev, sizeof(*bprofile), GFP_KERNEL); - if (!bprofile) - return -ENOMEM; - - bprofile->len = 0; - bprofile->item_id = -1; - INIT_LIST_HEAD(&bprofile->list); - - /* copy profile name into basename until the . */ - get_profile_basename(bprofile->basename, tfa_cont_profile_name(tfa98xx, prof)); - bprofile->len = strlen(bprofile->basename); - - /* - * search the profile list for a profile with basename, if it is not found then - * add it to the list and add a new mixer control (if it has vsteps) - * also, if it is a calibration profile, do not add it to the list - */ - if ((is_profile_in_list(bprofile->basename, bprofile->len) == 0) && - is_calibration_profile(tfa_cont_profile_name(tfa98xx, prof)) == 0) { - /* the profile is not present, add it to the list */ - list_add(&bprofile->list, &profile_list); - bprofile->item_id = id++; - - pr_debug("profile added [%d]: %s\n", bprofile->item_id, bprofile->basename); - - if (tfacont_get_max_vstep(tfa98xx->tfa, prof)) { - name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); - if (!name) - return -ENOMEM; - - scnprintf(name, MAX_CONTROL_NAME, "%s %s Playback Volume", - tfa98xx->fw.name, bprofile->basename); - - tfa98xx_controls[mix_index].name = name; - tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; - tfa98xx_controls[mix_index].info = tfa98xx_info_vstep; - tfa98xx_controls[mix_index].get = tfa98xx_get_vstep; - tfa98xx_controls[mix_index].put = tfa98xx_set_vstep; - tfa98xx_controls[mix_index].private_value = bprofile->item_id; /* save profile index */ - mix_index++; - } - } - - /* look for the basename profile in the list of mixer profiles and add the - container profile index to the supported samplerates of this mixer profile */ - add_sr_to_profile(tfa98xx, bprofile->basename, bprofile->len, prof); - } - - /* set the number of user selectable profiles in the mixer */ - tfa98xx_mixer_profiles = id; - - /* Create a mixer item for stop control on TFA1 */ - name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); - if (!name) - return -ENOMEM; - - scnprintf(name, MAX_CONTROL_NAME, "%s Stop", tfa98xx->fw.name); - tfa98xx_controls[mix_index].name = name; - tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; - tfa98xx_controls[mix_index].info = tfa98xx_info_stop_ctl; - tfa98xx_controls[mix_index].get = tfa98xx_get_stop_ctl; - tfa98xx_controls[mix_index].put = tfa98xx_set_stop_ctl; - mix_index++; - - if (tfa98xx->flags & TFA98XX_FLAG_CALIBRATION_CTL) { - name = devm_kzalloc(tfa98xx->codec->dev, MAX_CONTROL_NAME, GFP_KERNEL); - if (!name) - return -ENOMEM; - - scnprintf(name, MAX_CONTROL_NAME, "%s Calibration", tfa98xx->fw.name); - tfa98xx_controls[mix_index].name = name; - tfa98xx_controls[mix_index].iface = SNDRV_CTL_ELEM_IFACE_MIXER; - tfa98xx_controls[mix_index].info = tfa98xx_info_cal_ctl; - tfa98xx_controls[mix_index].get = tfa98xx_get_cal_ctl; - tfa98xx_controls[mix_index].put = tfa98xx_set_cal_ctl; - mix_index++; - } - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - return snd_soc_add_component_controls(tfa98xx->codec, - tfa98xx_controls, mix_index); -#else - return snd_soc_add_codec_controls(tfa98xx->codec, - tfa98xx_controls, mix_index); -#endif - -#ifdef TFA_NON_DSP_SOLUTION - ret = snd_soc_add_codec_controls(tfa98xx->codec, tfa987x_algo_controls, ARRAY_SIZE(tfa987x_algo_controls)); - pr_info("create tfa987x_algo_controls ret=%d", ret); -#endif - if (!ret) { - ret = snd_soc_add_codec_controls(tfa98xx->codec, - nxp_spk_id_controls, ARRAY_SIZE(nxp_spk_id_controls)); - } - - return ret; -} - -static void *tfa98xx_devm_kstrdup(struct device *dev, char *buf) -{ - char *str = devm_kzalloc(dev, strlen(buf) + 1, GFP_KERNEL); - - if (!str) - return str; - memcpy(str, buf, strlen(buf)); - return str; -} - -static int tfa98xx_append_i2c_address(struct device *dev, - struct i2c_client *i2c, - struct snd_soc_dapm_widget *widgets, - int num_widgets, - struct snd_soc_dai_driver *dai_drv, - int num_dai) -{ - char buf[50]; - int i; - int i2cbus = i2c->adapter->nr; - int addr = i2c->addr; - - if (dai_drv && num_dai > 0) - for (i = 0; i < num_dai; i++) { - memset(buf, 0x00, sizeof(buf)); - snprintf(buf, 50, "%s-%x-%x", dai_drv[i].name, i2cbus, - addr); - dai_drv[i].name = tfa98xx_devm_kstrdup(dev, buf); - pr_info("tfa98xx_append_i2c_address() dai_drv[%d].name = [%s]\n", i, dai_drv[i].name); - - memset(buf, 0x00, sizeof(buf)); - snprintf(buf, 50, "%s-%x-%x", - dai_drv[i].playback.stream_name, - i2cbus, addr); - dai_drv[i].playback.stream_name = tfa98xx_devm_kstrdup(dev, buf); - pr_info("tfa98xx_append_i2c_address() dai_drv[%d].playback.stream_name = [%s]\n", i, dai_drv[i].playback.stream_name); - - memset(buf, 0x00, sizeof(buf)); - snprintf(buf, 50, "%s-%x-%x", - dai_drv[i].capture.stream_name, - i2cbus, addr); - dai_drv[i].capture.stream_name = tfa98xx_devm_kstrdup(dev, buf); - pr_info("tfa98xx_append_i2c_address() dai_drv[%d].capture.stream_name = [%s]\n", i, dai_drv[i].capture.stream_name); - } - - /* the idea behind this is convert: - * SND_SOC_DAPM_AIF_IN("AIF IN", "AIF Playback", 0, SND_SOC_NOPM, 0, 0), - * into: - * SND_SOC_DAPM_AIF_IN("AIF IN", "AIF Playback-2-36", 0, SND_SOC_NOPM, 0, 0), - */ - if (widgets && num_widgets > 0) - for (i = 0; i < num_widgets; i++) { - if (!widgets[i].sname) - continue; - if ((widgets[i].id == snd_soc_dapm_aif_in) - || (widgets[i].id == snd_soc_dapm_aif_out)) { - snprintf(buf, 50, "%s-%x-%x", widgets[i].sname, - i2cbus, addr); - widgets[i].sname = tfa98xx_devm_kstrdup(dev, buf); - } - } - - return 0; -} - -static struct snd_soc_dapm_widget tfa98xx_dapm_widgets_common[] = { - /* Stream widgets */ - SND_SOC_DAPM_AIF_IN("AIF IN", "AIF Playback", 0, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_AIF_OUT("AIF OUT", "AIF Capture", 0, SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_OUTPUT("OUTL"), - SND_SOC_DAPM_INPUT("AEC Loopback"), -}; - -static struct snd_soc_dapm_widget tfa98xx_dapm_widgets_stereo[] = { - SND_SOC_DAPM_OUTPUT("OUTR"), -}; - -static struct snd_soc_dapm_widget tfa98xx_dapm_widgets_saam[] = { - SND_SOC_DAPM_INPUT("SAAM MIC"), -}; - -static struct snd_soc_dapm_widget tfa9888_dapm_inputs[] = { - SND_SOC_DAPM_INPUT("DMIC1"), - SND_SOC_DAPM_INPUT("DMIC2"), - SND_SOC_DAPM_INPUT("DMIC3"), - SND_SOC_DAPM_INPUT("DMIC4"), -}; - -static const struct snd_soc_dapm_route tfa98xx_dapm_routes_common[] = { - { "OUTL", NULL, "AIF IN" }, - { "AIF OUT", NULL, "AEC Loopback" }, -}; - -static const struct snd_soc_dapm_route tfa98xx_dapm_routes_saam[] = { - { "AIF OUT", NULL, "SAAM MIC" }, -}; - -static const struct snd_soc_dapm_route tfa98xx_dapm_routes_stereo[] = { - { "OUTR", NULL, "AIF IN" }, -}; - -static const struct snd_soc_dapm_route tfa9888_input_dapm_routes[] = { - { "AIF OUT", NULL, "DMIC1" }, - { "AIF OUT", NULL, "DMIC2" }, - { "AIF OUT", NULL, "DMIC3" }, - { "AIF OUT", NULL, "DMIC4" }, -}; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) -static struct snd_soc_dapm_context *snd_soc_codec_get_dapm(struct snd_soc_codec *codec) -{ - return &codec->dapm; -} -#endif - -static void tfa98xx_add_widgets(struct tfa98xx *tfa98xx) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(tfa98xx->codec); -#else - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(tfa98xx->codec); -#endif - struct snd_soc_dapm_widget *widgets; - unsigned int num_dapm_widgets = ARRAY_SIZE(tfa98xx_dapm_widgets_common); - - widgets = devm_kzalloc(&tfa98xx->i2c->dev, - sizeof(struct snd_soc_dapm_widget) * - ARRAY_SIZE(tfa98xx_dapm_widgets_common), - GFP_KERNEL); - if (!widgets) - return; - memcpy(widgets, tfa98xx_dapm_widgets_common, - sizeof(struct snd_soc_dapm_widget) * - ARRAY_SIZE(tfa98xx_dapm_widgets_common)); - - tfa98xx_append_i2c_address(&tfa98xx->i2c->dev, - tfa98xx->i2c, - widgets, - num_dapm_widgets, - NULL, - 0); - - snd_soc_dapm_new_controls(dapm, widgets, - ARRAY_SIZE(tfa98xx_dapm_widgets_common)); - snd_soc_dapm_add_routes(dapm, tfa98xx_dapm_routes_common, - ARRAY_SIZE(tfa98xx_dapm_routes_common)); - - if (tfa98xx->flags & TFA98XX_FLAG_STEREO_DEVICE) { - snd_soc_dapm_new_controls(dapm, tfa98xx_dapm_widgets_stereo, - ARRAY_SIZE(tfa98xx_dapm_widgets_stereo)); - snd_soc_dapm_add_routes(dapm, tfa98xx_dapm_routes_stereo, - ARRAY_SIZE(tfa98xx_dapm_routes_stereo)); - } - - if (tfa98xx->flags & TFA98XX_FLAG_MULTI_MIC_INPUTS) { - snd_soc_dapm_new_controls(dapm, tfa9888_dapm_inputs, - ARRAY_SIZE(tfa9888_dapm_inputs)); - snd_soc_dapm_add_routes(dapm, tfa9888_input_dapm_routes, - ARRAY_SIZE(tfa9888_input_dapm_routes)); - } - - if (tfa98xx->flags & TFA98XX_FLAG_SAAM_AVAILABLE) { - snd_soc_dapm_new_controls(dapm, tfa98xx_dapm_widgets_saam, - ARRAY_SIZE(tfa98xx_dapm_widgets_saam)); - snd_soc_dapm_add_routes(dapm, tfa98xx_dapm_routes_saam, - ARRAY_SIZE(tfa98xx_dapm_routes_saam)); - } -} - -/* I2C wrapper functions */ -enum Tfa98xx_Error tfa98xx_write_register16(struct tfa_device *tfa, - unsigned char subaddress, - unsigned short value) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - struct tfa98xx *tfa98xx; - int ret; - int retries = I2C_RETRIES; - - if (tfa == NULL) { - pr_err("No device available\n"); - return Tfa98xx_Error_Fail; - } - - tfa98xx = (struct tfa98xx *)tfa->data; - if (!tfa98xx || !tfa98xx->regmap) { - pr_err("No tfa98xx regmap available\n"); - return Tfa98xx_Error_Bad_Parameter; - } -retry: - ret = regmap_write(tfa98xx->regmap, subaddress, value); - if (ret < 0) { - pr_warn("i2c error, retries left: %d\n", retries); - if (retries) { - retries--; - msleep(I2C_RETRY_DELAY); - goto retry; - } - return Tfa98xx_Error_Fail; - } - if (tfa98xx_kmsg_regs) - dev_dbg(&tfa98xx->i2c->dev, " WR reg=0x%02x, val=0x%04x %s\n", - subaddress, value, - ret < 0 ? "Error!!" : ""); - - if (tfa98xx_ftrace_regs) - tfa98xx_trace_printk("\tWR reg=0x%02x, val=0x%04x %s\n", - subaddress, value, - ret < 0 ? "Error!!" : ""); - return error; -} - -enum Tfa98xx_Error tfa98xx_read_register16(struct tfa_device *tfa, - unsigned char subaddress, - unsigned short *val) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - struct tfa98xx *tfa98xx; - unsigned int value; - int retries = I2C_RETRIES; - int ret; - - if (tfa == NULL) { - pr_err("No device available\n"); - return Tfa98xx_Error_Fail; - } - - tfa98xx = (struct tfa98xx *)tfa->data; - if (!tfa98xx || !tfa98xx->regmap) { - pr_err("No tfa98xx regmap available\n"); - return Tfa98xx_Error_Bad_Parameter; - } -retry: - ret = regmap_read(tfa98xx->regmap, subaddress, &value); - if (ret < 0) { - pr_warn("i2c error at subaddress 0x%x, retries left: %d\n", subaddress, retries); - if (retries) { - retries--; - msleep(I2C_RETRY_DELAY); - goto retry; - } - return Tfa98xx_Error_Fail; - } - *val = value & 0xffff; - - if (tfa98xx_kmsg_regs) - dev_dbg(&tfa98xx->i2c->dev, "RD reg=0x%02x, val=0x%04x %s\n", - subaddress, *val, - ret < 0 ? "Error!!" : ""); - if (tfa98xx_ftrace_regs) - tfa98xx_trace_printk("\tRD reg=0x%02x, val=0x%04x %s\n", - subaddress, *val, - ret < 0 ? "Error!!" : ""); - - return error; -} - - -/* - * init external dsp - */ -enum Tfa98xx_Error - tfa98xx_init_dsp(struct tfa_device *tfa) -{ - return Tfa98xx_Error_Not_Supported; -} - -int tfa98xx_get_dsp_status(struct tfa_device *tfa) -{ - return 0; -} - -/* - * write external dsp message - */ -enum Tfa98xx_Error - tfa98xx_write_dsp(struct tfa_device *tfa, int num_bytes, const char *command_buffer) -{ - return Tfa98xx_Error_Not_Supported; -} - -/* - * read external dsp message - */ -enum Tfa98xx_Error - tfa98xx_read_dsp(struct tfa_device *tfa, int num_bytes, unsigned char *result_buffer) -{ - return Tfa98xx_Error_Not_Supported; -} -/* - * write/read external dsp message - */ -enum Tfa98xx_Error - tfa98xx_writeread_dsp(struct tfa_device *tfa, int command_length, void *command_buffer, - int result_length, void *result_buffer) -{ - return Tfa98xx_Error_Not_Supported; -} - -enum Tfa98xx_Error tfa98xx_read_data(struct tfa_device *tfa, - unsigned char reg, - int len, unsigned char value[]) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - struct tfa98xx *tfa98xx; - struct i2c_client *tfa98xx_client; - int err; - int tries = 0; - unsigned char *reg_buf = NULL; - struct i2c_msg msgs[] = { - { - .flags = 0, - .len = 1, - .buf = NULL, - }, { - .flags = I2C_M_RD, - .len = len, - .buf = value, - }, - }; - reg_buf = (unsigned char *)kmalloc(sizeof(reg), GFP_DMA); //GRP_KERNEL also works, - if (!reg_buf) { - return -ENOMEM; - } - - *reg_buf = reg; - msgs[0].buf = reg_buf; - - if (tfa == NULL) { - pr_err("No device available\n"); - return Tfa98xx_Error_Fail; - } - - tfa98xx = (struct tfa98xx *)tfa->data; - if (tfa98xx->i2c) { - tfa98xx_client = tfa98xx->i2c; - msgs[0].addr = tfa98xx_client->addr; - msgs[1].addr = tfa98xx_client->addr; - - do { - err = i2c_transfer(tfa98xx_client->adapter, msgs, - ARRAY_SIZE(msgs)); - if (err != ARRAY_SIZE(msgs)) - msleep_interruptible(I2C_RETRY_DELAY); - } while ((err != ARRAY_SIZE(msgs)) && (++tries < I2C_RETRIES)); - - if (err != ARRAY_SIZE(msgs)) { - dev_err(&tfa98xx_client->dev, "read transfer error %d\n", - err); - error = Tfa98xx_Error_Fail; - } - - if (tfa98xx_kmsg_regs) - dev_dbg(&tfa98xx_client->dev, "RD-DAT reg=0x%02x, len=%d\n", - reg, len); - if (tfa98xx_ftrace_regs) - tfa98xx_trace_printk("\t\tRD-DAT reg=0x%02x, len=%d\n", - reg, len); - } else { - pr_err("No device available\n"); - error = Tfa98xx_Error_Fail; - } - kfree(reg_buf); - return error; -} - -enum Tfa98xx_Error tfa98xx_write_raw(struct tfa_device *tfa, - int len, - const unsigned char data[]) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - struct tfa98xx *tfa98xx; - int ret; - int retries = I2C_RETRIES; - - - if (tfa == NULL) { - pr_err("No device available\n"); - return Tfa98xx_Error_Fail; - } - - tfa98xx = (struct tfa98xx *)tfa->data; - -retry: - ret = i2c_master_send(tfa98xx->i2c, data, len); - if (ret < 0) { - pr_warn("i2c error, retries left: %d\n", retries); - if (retries) { - retries--; - msleep(I2C_RETRY_DELAY); - goto retry; - } - } - - if (ret == len) { - if (tfa98xx_kmsg_regs) - dev_dbg(&tfa98xx->i2c->dev, " WR-RAW len=%d\n", len); - if (tfa98xx_ftrace_regs) - tfa98xx_trace_printk("\t\tWR-RAW len=%d\n", len); - return Tfa98xx_Error_Ok; - } - pr_err(" WR-RAW (len=%d) Error I2C send size mismatch %d\n", len, ret); - error = Tfa98xx_Error_Fail; - - return error; -} - -/* Interrupts management */ - -static void tfa98xx_interrupt_enable_tfa2(struct tfa98xx *tfa98xx, bool enable) -{ - /* Only for 0x72 we need to enable NOCLK interrupts */ - if (tfa98xx->flags & TFA98XX_FLAG_REMOVE_PLOP_NOISE) - tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_stnoclk, enable); - - if (tfa98xx->flags & TFA98XX_FLAG_LP_MODES) { - tfa_irq_ena(tfa98xx->tfa, 36, enable); /* FIXME: IELP0 does not excist for 9912 */ - tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_stclpr, enable); - } -} - -/* Check if tap-detection can and shall be enabled. - * Configure SPK interrupt accordingly or setup polling mode - * Tap-detection shall be active if: - * - the service is enabled (tapdet_open), AND - * - the current profile is a tap-detection profile - * On TFA1 familiy of devices, activating tap-detection means enabling the SPK - * interrupt if available. - * We also update the tapdet_enabled and tapdet_poll variables. - */ -static void tfa98xx_tapdet_check_update(struct tfa98xx *tfa98xx) -{ - unsigned int enable = false; - - /* Support tap-detection on TFA1 family of devices */ - if ((tfa98xx->flags & TFA98XX_FLAG_TAPDET_AVAILABLE) == 0) - return; - - if (tfa98xx->tapdet_open && - (tfa98xx->tapdet_profiles & (1 << tfa98xx->profile))) - enable = true; - - if (!gpio_is_valid(tfa98xx->irq_gpio)) { - /* interrupt not available, setup polling mode */ - tfa98xx->tapdet_poll = true; - if (enable) - queue_delayed_work(tfa98xx->tfa98xx_wq, - &tfa98xx->tapdet_work, HZ / 10); - else - cancel_delayed_work_sync(&tfa98xx->tapdet_work); - dev_dbg(tfa98xx->codec->dev, - "Polling for tap-detection: %s (%d; 0x%x, %d)\n", - enable ? "enabled" : "disabled", - tfa98xx->tapdet_open, tfa98xx->tapdet_profiles, - tfa98xx->profile); - - } else { - dev_dbg(tfa98xx->codec->dev, - "Interrupt for tap-detection: %s (%d; 0x%x, %d)\n", - enable ? "enabled" : "disabled", - tfa98xx->tapdet_open, tfa98xx->tapdet_profiles, - tfa98xx->profile); - /* enabled interrupt */ - tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_sttapdet, enable); - } - - /* check disabled => enabled transition to clear pending events */ - if (!tfa98xx->tapdet_enabled && enable) { - /* clear pending event if any */ - tfa_irq_clear(tfa98xx->tfa, tfa9912_irq_sttapdet); - } - - if (!tfa98xx->tapdet_poll) - tfa_irq_ena(tfa98xx->tfa, tfa9912_irq_sttapdet, 1); /* enable again */ -} - -/* global enable / disable interrupts */ -static void tfa98xx_interrupt_enable(struct tfa98xx *tfa98xx, bool enable) -{ - if (tfa98xx->flags & TFA98XX_FLAG_SKIP_INTERRUPTS) - return; - - if (tfa98xx->tfa->tfa_family == 2) - tfa98xx_interrupt_enable_tfa2(tfa98xx, enable); -} - -/* Firmware management */ -static void tfa98xx_container_loaded(const struct firmware *cont, void *context) -{ - TfaContainer_t *container; - struct tfa98xx *tfa98xx = context; - enum tfa_error tfa_err; - int container_size; - int ret; - - tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_FAIL; - - if (!cont) { - pr_err("Failed to read %s\n", fw_name); - return; - } - - pr_debug("loaded %s - size: %zu\n", fw_name, cont->size); - - if (tfa98xx_container == NULL) { - container = kzalloc(cont->size, GFP_KERNEL); - if (container == NULL) { - pr_err("Error allocating memory\n"); - return; - } - - container_size = cont->size; - memcpy(container, cont->data, container_size); - - pr_debug("%.2s%.2s\n", container->version, container->subversion); - pr_debug("%.8s\n", container->customer); - pr_debug("%.8s\n", container->application); - pr_debug("%.8s\n", container->type); - pr_debug("%d ndev\n", container->ndev); - pr_debug("%d nprof\n", container->nprof); - - tfa_err = tfa_load_cnt(container, container_size); - if (tfa_err != tfa_error_ok) { - kfree(container); - dev_err(tfa98xx->dev, "Cannot load container file, aborting\n"); - return; - } - - tfa98xx_container = container; - } else { - pr_debug("container file already loaded...\n"); - container = tfa98xx_container; - } - - tfa98xx->tfa->cnt = container; - - /* - i2c transaction limited to 64k - (Documentation/i2c/writing-clients) - */ - tfa98xx->tfa->buffer_size = 65536; - - if (tfa_dev_probe(tfa98xx->i2c->addr, tfa98xx->tfa) != 0) { - dev_err(tfa98xx->dev, "Failed to probe TFA98xx @ 0x%.2x\n", tfa98xx->i2c->addr); - return; - } - - /* once the device without internal DSP, we should be using DSP HAL to send msg to host DSP. */ - if (tfa98xx->tfa->is_probus_device == 1) { - tfa98xx->tfa->has_msg = 1; - } else { - tfa98xx->tfa->has_msg = 0; - } - - tfa98xx->tfa->dev_idx = tfa_cont_get_idx(tfa98xx->tfa); - if (tfa98xx->tfa->dev_idx < 0) { - dev_err(tfa98xx->dev, "Failed to find TFA98xx @ 0x%.2x in container file\n", tfa98xx->i2c->addr); - return; - } - - /* Enable debug traces */ - tfa98xx->tfa->verbose = trace_level & 1; - - /* prefix is the application name from the cnt */ - tfa_cnt_get_app_name(tfa98xx->tfa, tfa98xx->fw.name); - - /* set default profile/vstep */ - tfa98xx->profile = 0; - tfa98xx->vstep = 0; - - /* Override default profile if requested */ - if (strcmp(dflt_prof_name, "")) { - unsigned int i; - int nprof = tfa_cnt_get_dev_nprof(tfa98xx->tfa); - - for (i = 0; i < nprof; i++) { - if (strcmp(tfa_cont_profile_name(tfa98xx, i), - dflt_prof_name) == 0) { - tfa98xx->profile = i; - dev_info(tfa98xx->dev, - "changing default profile to %s (%d)\n", - dflt_prof_name, tfa98xx->profile); - break; - } - } - if (i >= nprof) - dev_info(tfa98xx->dev, - "Default profile override failed (%s profile not found)\n", - dflt_prof_name); - } - - tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_OK; - pr_debug("Firmware init complete\n"); - - if (no_start != 0) - return; - - /* Only controls for master device */ - if (tfa98xx->tfa->dev_idx == 0) - tfa98xx_create_controls(tfa98xx); - - tfa98xx_inputdev_check_register(tfa98xx); - - if (tfa_is_cold(tfa98xx->tfa) == 0) { - pr_debug("Warning: device 0x%.2x is still warm\n", tfa98xx->i2c->addr); - tfa_reset(tfa98xx->tfa); - } - - /* Preload settings using internal clock on TFA2 */ - if ((tfa98xx->tfa->tfa_family == 2) && (tfa98xx->tfa->is_probus_device == 0)) { - mutex_lock(&tfa98xx->dsp_lock); - pr_info("will be using internal clock to preload MAX2 TFA settings.\n"); - ret = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); - if (ret == Tfa98xx_Error_Not_Supported) - tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_FAIL; - - /* we should be power-down device when parameter is loaded. */ - tfa_dev_stop(tfa98xx->tfa); - ret = tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; - - mutex_unlock(&tfa98xx->dsp_lock); - } - tfa98xx_interrupt_enable(tfa98xx, true); -} - -static int tfa98xx_load_container(struct tfa98xx *tfa98xx) -{ - const struct firmware *firmware; - int rc = 0; - - tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_PENDING; - mutex_lock(&tfa98xx_mutex); - rc = request_firmware(&firmware, fw_name, tfa98xx->dev); - if (rc < 0) { - mutex_unlock(&tfa98xx_mutex); - return rc; - } - tfa98xx_container_loaded(firmware, tfa98xx); - release_firmware(firmware); - mutex_unlock(&tfa98xx_mutex); - - return rc; -} - - -static void tfa98xx_tapdet(struct tfa98xx *tfa98xx) -{ - unsigned int tap_pattern; - int btn; - - /* check tap pattern (BTN_0 is "error" wrong tap indication */ - tap_pattern = tfa_get_tap_pattern(tfa98xx->tfa); - switch (tap_pattern) { - case 0xffffffff: - pr_info("More than 4 taps detected! (flagTapPattern = -1)\n"); - btn = BTN_0; - break; - case 0xfffffffe: - case 0xfe: - pr_info("Illegal tap detected!\n"); - btn = BTN_0; - break; - case 0: - pr_info("Unrecognized pattern! (flagTapPattern = 0)\n"); - btn = BTN_0; - break; - default: - pr_info("Detected pattern: %d\n", tap_pattern); - btn = BTN_0 + tap_pattern; - break; - } - - input_report_key(tfa98xx->input, btn, 1); - input_report_key(tfa98xx->input, btn, 0); - input_sync(tfa98xx->input); - - /* acknowledge event done by clearing interrupt */ - -} - -static void tfa98xx_tapdet_work(struct work_struct *work) -{ - struct tfa98xx *tfa98xx; - - //TODO check is this is still needed for tap polling - tfa98xx = container_of(work, struct tfa98xx, tapdet_work.work); - - if (tfa_irq_get(tfa98xx->tfa, tfa9912_irq_sttapdet)) - tfa98xx_tapdet(tfa98xx); - - queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->tapdet_work, HZ / 10); -} -static void tfa98xx_nmode_update_work(struct work_struct *work) -{ - struct tfa98xx *tfa98xx; - - //MCH_TO_TEST, checking if noise mode update is required or not - tfa98xx = container_of(work, struct tfa98xx, nmodeupdate_work.work); - mutex_lock(&tfa98xx->dsp_lock); - tfa_adapt_noisemode(tfa98xx->tfa); - mutex_unlock(&tfa98xx->dsp_lock); - queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->nmodeupdate_work, 5 * HZ); -} -static void tfa98xx_monitor(struct work_struct *work) -{ -#if 0 - struct tfa98xx *tfa98xx; - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - tfa98xx = container_of(work, struct tfa98xx, monitor_work.work); - - /* Check for tap-detection - bypass monitor if it is active */ - if (!tfa98xx->input) { - mutex_lock(&tfa98xx->dsp_lock); - error = tfa_status(tfa98xx->tfa); - mutex_unlock(&tfa98xx->dsp_lock); - if (error == Tfa98xx_Error_DSP_not_running) { - if (tfa98xx->dsp_init == TFA98XX_DSP_INIT_DONE) { - tfa98xx->dsp_init = TFA98XX_DSP_INIT_RECOVER; - queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->init_work, 0); - } - } - } - - /* reschedule */ - queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->monitor_work, 5 * HZ); -#endif -} - -static void tfa98xx_dsp_init(struct tfa98xx *tfa98xx) -{ - int ret; - bool failed = false; - bool reschedule = false; - bool sync = false; - - if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) { - pr_debug("%s Skipping tfa_dev_start (no FW: %d)\n", __func__, tfa98xx->dsp_fw_state); - return; - } - - if (tfa98xx->dsp_init == TFA98XX_DSP_INIT_DONE) { - pr_debug("%s Stream already started, skipping DSP power-on\n", __func__); - return; - } - - mutex_lock(&tfa98xx->dsp_lock); - - tfa98xx->dsp_init = TFA98XX_DSP_INIT_PENDING; - - pr_debug("[NXP] %s init_count=%d\n", __func__, tfa98xx->init_count); - if (tfa98xx->init_count < TF98XX_MAX_DSP_START_TRY_COUNT) { - /* directly try to start DSP */ - ret = tfa98xx_tfa_start(tfa98xx, tfa98xx->profile, tfa98xx->vstep); - if (ret == Tfa98xx_Error_Not_Supported) { - tfa98xx->dsp_fw_state = TFA98XX_DSP_FW_FAIL; - dev_err(&tfa98xx->i2c->dev, "Failed starting device\n"); - failed = true; - } else if (ret != Tfa98xx_Error_Ok) { - /* It may fail as we may not have a valid clock at that - * time, so re-schedule and re-try later. - */ - dev_err(&tfa98xx->i2c->dev, - "tfa_dev_start failed! (err %d) - %d\n", - ret, tfa98xx->init_count); - reschedule = true; - } else { - sync = true; - - /* Subsystem ready, tfa init complete */ - tfa98xx->dsp_init = TFA98XX_DSP_INIT_DONE; - dev_dbg(&tfa98xx->i2c->dev, - "tfa_dev_start success (%d)\n", - tfa98xx->init_count); - /* cancel other pending init works */ - cancel_delayed_work(&tfa98xx->init_work); - tfa98xx->init_count = 0; - } - } else { - /* exceeded max number ot start tentatives, cancel start */ - dev_err(&tfa98xx->i2c->dev, - "Failed starting device (%d)\n", - tfa98xx->init_count); - failed = true; - } - if (reschedule) { - /* reschedule this init work for later */ - queue_delayed_work(tfa98xx->tfa98xx_wq, - &tfa98xx->init_work, - msecs_to_jiffies(5)); - tfa98xx->init_count++; - } - if (failed) { - tfa98xx->dsp_init = TFA98XX_DSP_INIT_FAIL; - /* cancel other pending init works */ - cancel_delayed_work(&tfa98xx->init_work); - tfa98xx->init_count = 0; - } - mutex_unlock(&tfa98xx->dsp_lock); - - if (sync) { - /* check if all devices have started */ - bool do_sync; - - mutex_lock(&tfa98xx_mutex); - - if (tfa98xx_sync_count < tfa98xx_device_count) - tfa98xx_sync_count++; - - do_sync = (tfa98xx_sync_count >= tfa98xx_device_count); - mutex_unlock(&tfa98xx_mutex); - - /* when all devices have started then unmute */ - if (do_sync) { - tfa98xx_sync_count = 0; - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - mutex_lock(&tfa98xx->dsp_lock); - tfa_dev_set_state(tfa98xx->tfa, TFA_STATE_UNMUTE, 0); - - /* - * start monitor thread to check IC status bit - * periodically, and re-init IC to recover if - * needed. - */ - if (tfa98xx->tfa->tfa_family == 1) - queue_delayed_work(tfa98xx->tfa98xx_wq, - &tfa98xx->monitor_work, - 1 * HZ); - mutex_unlock(&tfa98xx->dsp_lock); - } - - } - } - - - return; -} - - -static void tfa98xx_dsp_init_work(struct work_struct *work) -{ - struct tfa98xx *tfa98xx = container_of(work, struct tfa98xx, init_work.work); - - tfa98xx_dsp_init(tfa98xx); -} - -static void tfa98xx_interrupt(struct work_struct *work) -{ - struct tfa98xx *tfa98xx = container_of(work, struct tfa98xx, interrupt_work.work); - - if (tfa98xx->flags & TFA98XX_FLAG_TAPDET_AVAILABLE) { - /* check for tap interrupt */ - if (tfa_irq_get(tfa98xx->tfa, tfa9912_irq_sttapdet)) { - tfa98xx_tapdet(tfa98xx); - - /* clear interrupt */ - tfa_irq_clear(tfa98xx->tfa, tfa9912_irq_sttapdet); - } - } /* TFA98XX_FLAG_TAPDET_AVAILABLE */ - - if (tfa98xx->flags & TFA98XX_FLAG_REMOVE_PLOP_NOISE) { - int start_triggered; - - mutex_lock(&tfa98xx->dsp_lock); - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ - start_triggered = tfa_plop_noise_interrupt(tfa98xx->tfa, tfa98xx->profile, tfa98xx->vstep, tfa98xx->pcm_format); - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ - /* Only enable when the return value is 1, otherwise the interrupt is triggered twice */ - if (start_triggered) - tfa98xx_interrupt_enable(tfa98xx, true); - mutex_unlock(&tfa98xx->dsp_lock); - } /* TFA98XX_FLAG_REMOVE_PLOP_NOISE */ - - if (tfa98xx->flags & TFA98XX_FLAG_LP_MODES) { - tfa_lp_mode_interrupt(tfa98xx->tfa); - } /* TFA98XX_FLAG_LP_MODES */ - - /* unmask interrupts masked in IRQ handler */ - tfa_irq_unmask(tfa98xx->tfa); -} - -static int tfa98xx_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec = dai->component; - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else - struct snd_soc_codec *codec = dai->codec; - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - unsigned int sr; - int len, prof, nprof, idx = 0; - char *basename; - - /* - * Support CODEC to CODEC links, - * these are called with a NULL runtime pointer. - */ - if (!substream->runtime) - return 0; - - if (pcm_no_constraint != 0) - return 0; - - if (no_start != 0) - return 0; - - if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) { - dev_info(codec->dev, "Container file not loaded\n"); - return -EINVAL; - } - - basename = kzalloc(MAX_CONTROL_NAME, GFP_KERNEL); - if (!basename) - return -ENOMEM; - - /* copy profile name into basename until the . */ - get_profile_basename(basename, tfa_cont_profile_name(tfa98xx, tfa98xx->profile)); - len = strlen(basename); - - /* loop over all profiles and get the supported samples rate(s) from - * the profiles with the same basename - */ - nprof = tfa_cnt_get_dev_nprof(tfa98xx->tfa); - tfa98xx->rate_constraint.list = &tfa98xx->rate_constraint_list[0]; - tfa98xx->rate_constraint.count = 0; - for (prof = 0; prof < nprof; prof++) { - if (strncmp(basename, tfa_cont_profile_name(tfa98xx, prof), len) == 0) { - /* Check which sample rate is supported with current profile, - * and enforce this. - */ - sr = tfa98xx_get_profile_sr(tfa98xx->tfa, prof); - if (!sr) - dev_info(codec->dev, "Unable to identify supported sample rate\n"); - - if (tfa98xx->rate_constraint.count >= TFA98XX_NUM_RATES) { - dev_err(codec->dev, "too many sample rates\n"); - } else { - tfa98xx->rate_constraint_list[idx++] = sr; - tfa98xx->rate_constraint.count += 1; - } - } - } - - kfree(basename); - -/* as QUALCOMM FAE suggested, we don't need to calling 'snd_pcm_hw_constraint_list' on QUALCOMM platform. */ - return 0; -} - -static int tfa98xx_set_dai_sysclk(struct snd_soc_dai *codec_dai, - int clk_id, unsigned int freq, int dir) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec_dai->component); -#else - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec_dai->codec); -#endif - tfa98xx->sysclk = freq; - return 0; -} - -static int tfa98xx_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, - unsigned int rx_mask, int slots, int slot_width) -{ - pr_debug("\n"); - return 0; -} - -static int tfa98xx_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(dai->component); - struct snd_soc_component *codec = dai->component; -#else - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(dai->codec); - struct snd_soc_codec *codec = dai->codec; -#endif - pr_debug("fmt=0x%x\n", fmt); - - /* Supported mode: regular I2S, slave, or PDM */ - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { - case SND_SOC_DAIFMT_I2S: - if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { - dev_err(codec->dev, "Invalid Codec master mode\n"); - return -EINVAL; - } - break; - case SND_SOC_DAIFMT_PDM: - break; - default: - dev_err(codec->dev, "Unsupported DAI format %d\n", - fmt & SND_SOC_DAIFMT_FORMAT_MASK); - return -EINVAL; - } - - tfa98xx->audio_mode = fmt & SND_SOC_DAIFMT_FORMAT_MASK; - - return 0; -} - -static int tfa98xx_get_fssel(unsigned int rate) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(rate_to_fssel); i++) { - if (rate_to_fssel[i].rate == rate) { - return rate_to_fssel[i].fssel; - } - } - return -EINVAL; -} - -static int tfa98xx_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec = dai->component; - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else - struct snd_soc_codec *codec = dai->codec; - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - unsigned int rate; - int prof_idx; - - /* Supported */ - rate = params_rate(params); - pr_debug("Requested rate: %d, sample size: %d, physical size: %d\n", - rate, snd_pcm_format_width(params_format(params)), - snd_pcm_format_physical_width(params_format(params))); - - if (no_start != 0) - return 0; - /* check if samplerate is supported for this mixer profile */ - prof_idx = get_profile_id_for_sr(tfa98xx_mixer_profile, rate); - if (prof_idx < 0) { - pr_err("tfa98xx: invalid sample rate %d.\n", rate); - return -EINVAL; - } - pr_debug("mixer profile:container profile = [%d:%d]\n", tfa98xx_mixer_profile, prof_idx); - - - /* update 'real' profile (container profile) */ - tfa98xx->profile = prof_idx; - - /* update to new rate */ - tfa98xx->rate = rate; - - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ - tfa98xx->pcm_format = snd_pcm_format_width(params_format(params)); - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ - - return 0; -} - -#ifdef TFA_NON_DSP_SOLUTION -extern int send_tfa_cal_in_band(void *buf, int cmd_size); -static uint8_t bytes[3*3+1] = {0}; - -enum Tfa98xx_Error tfa98xx_adsp_send_calib_values(void) -{ - struct tfa98xx *tfa98xx; - int ret = 0; - int value = 0, nr, dsp_cal_value = 0; - - /* if the calibration value was sent to host DSP, we clear flag only (stereo case). */ - if ((tfa98xx_device_count > 1) && (tfa98xx_device_count == bytes[0])) { - pr_info("The calibration value was sent to host DSP.\n"); - bytes[0] = 0; - return Tfa98xx_Error_Ok; - } - - nr = 4; - /* read calibrated impendance from all devices. */ - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - struct tfa_device *tfa = tfa98xx->tfa; - - if (TFA_GET_BF(tfa, MTPEX) == 1) { - value = tfa_dev_mtp_get(tfa, TFA_MTP_RE25); - dsp_cal_value = (value * 65536) / 1000; - pr_info("Device 0x%x cal value is 0x%d\n", tfa98xx->i2c->addr, dsp_cal_value); - - bytes[nr++] = (uint8_t)((dsp_cal_value >> 16) & 0xff); - bytes[nr++] = (uint8_t)((dsp_cal_value >> 8) & 0xff); - bytes[nr++] = (uint8_t)(dsp_cal_value & 0xff); - bytes[0] += 1; - } - } - - /*for mono case, we will copy primary channel data to secondary channel. */ - if (tfa98xx_device_count == 1) { - memcpy(&bytes[7], &bytes[4], sizeof(char)*3); - } - pr_info("tfa98xx_device_count=%d bytes[0]=%d\n", tfa98xx_device_count, bytes[0]); - - /* we will send it to host DSP algorithm once calibraion value loaded from all device. */ - if (tfa98xx_device_count == bytes[0]) { - bytes[1] = 0x00; - bytes[2] = 0x81; - bytes[3] = 0x05; - - pr_debug("calibration value send to host DSP.\n"); - ret = send_tfa_cal_in_band(&bytes[1], sizeof(bytes) - 1); - msleep(10); - - /* for mono case, we should clear flag here. */ - if (tfa98xx_device_count == 1) - bytes[0] = 0; - - } else { - pr_err("load calibration data from device failed.\n"); - ret = Tfa98xx_Error_Bad_Parameter; - } - - return ret; -} - -static int tfa98xx_send_mute_cmd(void) -{ - uint8_t cmd[9] = {0x04, 0x81, 0x04, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff}; - - pr_info("send mute command to host DSP.\n"); - return send_tfa_cal_in_band(&cmd[0], sizeof(cmd)); -} -#endif - -static int tfa98xx_mute(struct snd_soc_dai *dai, int mute, int stream) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - struct snd_soc_component *codec = dai->component; - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else - struct snd_soc_codec *codec = dai->codec; - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - dev_dbg(&tfa98xx->i2c->dev, "%s: state: %d\n", __func__, mute); - - if (no_start) { - pr_debug("no_start parameter set no tfa_dev_start or tfa_dev_stop, returning\n"); - return 0; - } - if (tfa98xx->tfa_mute_mode == TFA98XX_DEVICE_MUTE_ON) { - pr_debug("%s: if Mute mode is enalbed, we don't need to power-on device.\n", __func__); - return 0; - } - - if (mute) { - /* stop DSP only when both playback and capture streams - * are deactivated - */ - if (stream == SNDRV_PCM_STREAM_PLAYBACK) - tfa98xx->pstream = 0; - else - tfa98xx->cstream = 0; - if (tfa98xx->pstream != 0 || tfa98xx->cstream != 0) - return 0; - - mutex_lock(&tfa98xx_mutex); - tfa98xx_sync_count = 0; - mutex_unlock(&tfa98xx_mutex); - - cancel_delayed_work_sync(&tfa98xx->monitor_work); - - cancel_delayed_work_sync(&tfa98xx->init_work); - if (tfa98xx->dsp_fw_state != TFA98XX_DSP_FW_OK) - return 0; - mutex_lock(&tfa98xx->dsp_lock); -#ifdef TFA_NON_DSP_SOLUTION - tfa98xx_send_mute_cmd(); - msleep(60); -#endif - tfa_dev_stop(tfa98xx->tfa); - tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; - mutex_unlock(&tfa98xx->dsp_lock); - if (tfa98xx->flags & TFA98XX_FLAG_ADAPT_NOISE_MODE) - cancel_delayed_work_sync(&tfa98xx->nmodeupdate_work); - } else { - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - tfa98xx->pstream = 1; -#ifdef TFA_NON_DSP_SOLUTION - if (tfa98xx->tfa->is_probus_device) { - tfa98xx_adsp_send_calib_values(); - } -#endif - } else { - tfa98xx->cstream = 1; - } - -#if 0 - /* Start DSP with async mode.*/ - if (tfa98xx->dsp_init != TFA98XX_DSP_INIT_PENDING) - queue_delayed_work(tfa98xx->tfa98xx_wq, - &tfa98xx->init_work, 0); -#else - /* Start DSP with sync mode.*/ - pr_debug("[NXP] %s dsp_init=%d\n", __func__, tfa98xx->dsp_init); - if (tfa98xx->dsp_init != TFA98XX_DSP_INIT_PENDING) - tfa98xx_dsp_init(tfa98xx); -#endif - if (tfa98xx->flags & TFA98XX_FLAG_ADAPT_NOISE_MODE) - queue_delayed_work(tfa98xx->tfa98xx_wq, - &tfa98xx->nmodeupdate_work, - 0); - } - - return 0; -} - -static const struct snd_soc_dai_ops tfa98xx_dai_ops = { - .startup = tfa98xx_startup, - .set_fmt = tfa98xx_set_fmt, - .set_sysclk = tfa98xx_set_dai_sysclk, - .set_tdm_slot = tfa98xx_set_tdm_slot, - .hw_params = tfa98xx_hw_params, - .mute_stream = tfa98xx_mute, -}; - -static struct snd_soc_dai_driver tfa98xx_dai[] = { - { - .name = "tfa98xx-aif", - .id = 1, - .playback = { - .stream_name = "AIF Playback", - .channels_min = 1, - .channels_max = 4, - .rates = TFA98XX_RATES, - .formats = TFA98XX_FORMATS, - }, - .capture = { - .stream_name = "AIF Capture", - .channels_min = 1, - .channels_max = 4, - .rates = TFA98XX_RATES, - .formats = TFA98XX_FORMATS, - }, - .ops = &tfa98xx_dai_ops, -/* .symmetric_rates = 1, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) - .symmetric_channels = 1, - .symmetric_samplebits = 1, -#endif*/ - }, -}; - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) -static int tfa98xx_probe(struct snd_soc_component *codec) -{ - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else -static int tfa98xx_probe(struct snd_soc_codec *codec) -{ - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - int ret; - - pr_debug("\n"); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - snd_soc_component_init_regmap(codec, tfa98xx->regmap); -#endif - /* setup work queue, will be used to initial DSP on first boot up */ - tfa98xx->tfa98xx_wq = create_singlethread_workqueue("tfa98xx"); - if (!tfa98xx->tfa98xx_wq) - return -ENOMEM; - - INIT_DELAYED_WORK(&tfa98xx->init_work, tfa98xx_dsp_init_work); - INIT_DELAYED_WORK(&tfa98xx->monitor_work, tfa98xx_monitor); - INIT_DELAYED_WORK(&tfa98xx->interrupt_work, tfa98xx_interrupt); - INIT_DELAYED_WORK(&tfa98xx->tapdet_work, tfa98xx_tapdet_work); - INIT_DELAYED_WORK(&tfa98xx->nmodeupdate_work, tfa98xx_nmode_update_work); - - tfa98xx->codec = codec; - - ret = tfa98xx_load_container(tfa98xx); - pr_debug("Container loading requested: %d\n", ret); - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0) - codec->control_data = tfa98xx->regmap; - ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_REGMAP); - if (ret != 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - return ret; - } -#endif - tfa98xx_add_widgets(tfa98xx); - - dev_info(codec->dev, "tfa98xx codec registered (%s)", - tfa98xx->fw.name); - - return ret; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) -static void tfa98xx_remove(struct snd_soc_component *codec) -{ - struct tfa98xx *tfa98xx = snd_soc_component_get_drvdata(codec); -#else -static int tfa98xx_remove(struct snd_soc_codec *codec) -{ - struct tfa98xx *tfa98xx = snd_soc_codec_get_drvdata(codec); -#endif - pr_debug("\n"); - - tfa98xx_interrupt_enable(tfa98xx, false); - - tfa98xx_inputdev_unregister(tfa98xx); - - cancel_delayed_work_sync(&tfa98xx->interrupt_work); - cancel_delayed_work_sync(&tfa98xx->monitor_work); - cancel_delayed_work_sync(&tfa98xx->init_work); - cancel_delayed_work_sync(&tfa98xx->tapdet_work); - cancel_delayed_work_sync(&tfa98xx->nmodeupdate_work); - - if (tfa98xx->tfa98xx_wq) - destroy_workqueue(tfa98xx->tfa98xx_wq); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - return; -#else - return 0; -#endif -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) && (KERNEL_VERSION(4, 18, 0) > LINUX_VERSION_CODE) -static struct regmap *tfa98xx_get_regmap(struct device *dev) -{ - struct tfa98xx *tfa98xx = dev_get_drvdata(dev); - - return tfa98xx->regmap; -} -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) -static struct snd_soc_component_driver soc_codec_dev_tfa98xx = { -#else -static struct snd_soc_codec_driver soc_codec_dev_tfa98xx = { -#endif - .probe = tfa98xx_probe, - .remove = tfa98xx_remove, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) && (KERNEL_VERSION(4, 18, 0) > LINUX_VERSION_CODE) - .get_regmap = tfa98xx_get_regmap, -#endif -}; - - -static bool tfa98xx_writeable_register(struct device *dev, unsigned int reg) -{ - /* enable read access for all registers */ - return 1; -} - -static bool tfa98xx_readable_register(struct device *dev, unsigned int reg) -{ - /* enable read access for all registers */ - return 1; -} - -static bool tfa98xx_volatile_register(struct device *dev, unsigned int reg) -{ - /* enable read access for all registers */ - return 1; -} - -static const struct regmap_config tfa98xx_regmap = { - .reg_bits = 8, - .val_bits = 16, - - .max_register = TFA98XX_MAX_REGISTER, - .writeable_reg = tfa98xx_writeable_register, - .readable_reg = tfa98xx_readable_register, - .volatile_reg = tfa98xx_volatile_register, - .cache_type = REGCACHE_NONE, -}; - -static void tfa98xx_irq_tfa2(struct tfa98xx *tfa98xx) -{ - /* - * mask interrupts - * will be unmasked after handling interrupts in workqueue - */ - tfa_irq_mask(tfa98xx->tfa); - queue_delayed_work(tfa98xx->tfa98xx_wq, &tfa98xx->interrupt_work, 0); -} - - -static irqreturn_t tfa98xx_irq(int irq, void *data) -{ - struct tfa98xx *tfa98xx = data; - - if (tfa98xx->tfa->tfa_family == 2) - tfa98xx_irq_tfa2(tfa98xx); - - return IRQ_HANDLED; -} - -static int tfa98xx_ext_reset(struct tfa98xx *tfa98xx) -{ - if (tfa98xx && gpio_is_valid(tfa98xx->reset_gpio)) { - int reset = tfa98xx->reset_polarity; - - gpio_set_value_cansleep(tfa98xx->reset_gpio, reset); - mdelay(10); - gpio_set_value_cansleep(tfa98xx->reset_gpio, !reset); - mdelay(10); - } - return 0; -} - -static int tfa98xx_parse_dt(struct device *dev, struct tfa98xx *tfa98xx, - struct device_node *np) { - u32 value; - int ret; - - tfa98xx->reset_gpio = of_get_named_gpio(np, "reset-gpio", 0); - if (tfa98xx->reset_gpio < 0) - dev_dbg(dev, "No reset GPIO provided, will not HW reset device\n"); - - tfa98xx->irq_gpio = of_get_named_gpio(np, "irq-gpio", 0); - if (tfa98xx->irq_gpio < 0) - dev_dbg(dev, "No IRQ GPIO provided.\n"); - ret = of_property_read_u32(np, "reset-polarity", &value); - if (ret < 0) - { - tfa98xx->reset_polarity = HIGH; - } else { - tfa98xx->reset_polarity = (value == 0) ? LOW : HIGH; - } - dev_dbg(dev, "reset-polarity:%d\n", tfa98xx->reset_polarity); - return 0; -} - -static ssize_t tfa98xx_reg_write(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t off, size_t count) -{ - struct device *dev = container_of(kobj, struct device, kobj); - struct tfa98xx *tfa98xx = dev_get_drvdata(dev); - - if (count != 1) { - pr_debug("invalid register address"); - return -EINVAL; - } - - tfa98xx->reg = buf[0]; - - return 1; -} - -static ssize_t tfa98xx_rw_write(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t off, size_t count) -{ - struct device *dev = container_of(kobj, struct device, kobj); - struct tfa98xx *tfa98xx = dev_get_drvdata(dev); - u8 *data; - int ret; - int retries = I2C_RETRIES; - - data = kmalloc(count + 1, GFP_KERNEL); - if (data == NULL) { - pr_debug("can not allocate memory\n"); - return -ENOMEM; - } - - data[0] = tfa98xx->reg; - memcpy(&data[1], buf, count); - -retry: - ret = i2c_master_send(tfa98xx->i2c, data, count + 1); - if (ret < 0) { - pr_warn("i2c error, retries left: %d\n", retries); - if (retries) { - retries--; - msleep(I2C_RETRY_DELAY); - goto retry; - } - } - - kfree(data); - - /* the number of data bytes written without the register address */ - return ((ret > 1) ? count : -EIO); -} - -static ssize_t tfa98xx_rw_read(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t off, size_t count) -{ - struct device *dev = container_of(kobj, struct device, kobj); - struct tfa98xx *tfa98xx = dev_get_drvdata(dev); - struct i2c_msg msgs[] = { - { - .addr = tfa98xx->i2c->addr, - .flags = 0, - .len = 1, - .buf = &tfa98xx->reg, - }, - { - .addr = tfa98xx->i2c->addr, - .flags = I2C_M_RD, - .len = count, - .buf = buf, - }, - }; - int ret; - int retries = I2C_RETRIES; -retry: - ret = i2c_transfer(tfa98xx->i2c->adapter, msgs, ARRAY_SIZE(msgs)); - if (ret < 0) { - pr_warn("i2c error, retries left: %d\n", retries); - if (retries) { - retries--; - msleep(I2C_RETRY_DELAY); - goto retry; - } - return ret; - } - /* ret contains the number of i2c transaction */ - /* return the number of bytes read */ - return ((ret > 1) ? count : -EIO); -} - -static struct bin_attribute dev_attr_rw = { - .attr = { - .name = "rw", - .mode = 0600, - }, - .size = 0, - .read = tfa98xx_rw_read, - .write = tfa98xx_rw_write, -}; - -static struct bin_attribute dev_attr_reg = { - .attr = { - .name = "reg", - .mode = 0200, - }, - .size = 0, - .read = NULL, - .write = tfa98xx_reg_write, -}; - -static int tfa98xx_misc_device_profile_open(struct inode *inode, struct file *file) -{ - struct tfa98xx *tfa98xx = container_of(file->private_data, - struct tfa98xx, tfa98xx_profile); - //pr_info("entry tfa98xx=%p\n", tfa98xx); - if (tfa98xx) { - file->private_data = tfa98xx; - return 0; - } else { - file->private_data = NULL; - return -EINVAL; - } -} - -static ssize_t tfa98xx_misc_device_profile_write(struct file *file, const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct tfa98xx *tfa98xx = file->private_data; - char name[100] = { 0 }; - int ret = 0; - int profileID = 0; - - //pr_info("entry count=%d\n", (int)count); - - if (tfa98xx == NULL) { - pr_err("%s tfa98xx is NULL.\n", __func__); - return -EINVAL; - } - /*if (count != 1) { - pr_err("%s invalid register address\n", __func__); - return -EINVAL; - }*/ - memset(name, 0x00, sizeof(name)); - ret = copy_from_user(name, user_buf, count); - //pr_info("profile name=%s\n", name); - - /* search profile name and return ID. */ - profileID = get_profile_id_by_name(name, strlen(name)); - if (profileID < 0) { - pr_err("didn't find profile from list.\n"); - return 0; - } else { - int prof_idx = get_profile_id_for_sr(profileID, tfa98xx->rate); - - if (prof_idx < 0) { - pr_err("sample rate [%d] not supported for this profile(%d).\n", tfa98xx->rate, profileID); - return 0; - } else { - tfa98xx_mixer_profile = profileID; - tfa98xx->profile = prof_idx; - tfa98xx->vstep = tfa98xx->prof_vsteps[prof_idx]; - //pr_info("update profile index (%d:%d) succeeded\n", profileID, prof_idx); - } - } - - return count; -} - -static int tfa98xx_misc_device_reg_open(struct inode *inode, struct file *file) -{ - struct tfa98xx *tfa98xx = container_of(file->private_data, - struct tfa98xx, tfa98xx_reg); - if (tfa98xx) { - file->private_data = tfa98xx; - return 0; - } else { - file->private_data = NULL; - return -EINVAL; - } -} - -static ssize_t tfa98xx_misc_device_reg_write(struct file *file, const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct tfa98xx *tfa98xx = file->private_data; - u8 address = 0; - int ret = 0; - - //pr_info("entry count=%d\n", (int)count); - - if (tfa98xx == NULL) { - pr_err("tfa98xx is NULL.\n"); - return -EINVAL; - } - - if (count != 1) { - pr_err("invalid register address\n"); - return -EINVAL; - } - - ret = copy_from_user(&address, user_buf, count); - if (ret) { - pr_err("copy data from user space failed.\n"); - } - - tfa98xx->reg = address; - //pr_info("tfa98xx->reg=0x%x\n", tfa98xx->reg); - - return count; -} - -static int tfa98xx_misc_device_rw_open(struct inode *inode, struct file *file) -{ - struct tfa98xx *tfa98xx = container_of(file->private_data, - struct tfa98xx, tfa98xx_rw); - if (tfa98xx) { - file->private_data = tfa98xx; - return 0; - } else { - file->private_data = NULL; - return -EINVAL; - } -} - -static ssize_t tfa98xx_misc_device_rw_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct tfa98xx *tfa98xx = file->private_data; - struct i2c_msg msgs[] = { - { - .addr = tfa98xx->i2c->addr, - .flags = 0, - .len = 1, - .buf = &tfa98xx->reg, - }, - { - .addr = tfa98xx->i2c->addr, - .flags = I2C_M_RD, - .len = count, - .buf = NULL, - }, - }; - - u8 *data; - int ret; - int retries = I2C_RETRIES; - - //pr_info("entry count=%d\n", (int)count); - - data = kmalloc(count+1, GFP_KERNEL); - if (data == NULL) { - pr_debug("can not allocate memory\n"); - return -ENOMEM; - } - - msgs[1].buf = data; - -retry: - ret = i2c_transfer(tfa98xx->i2c->adapter, msgs, ARRAY_SIZE(msgs)); - //pr_info("i2c_transfer ret=%d\n", ret); - - if (ret < 0) { - pr_warn("i2c error, retries left: %d\n", retries); - if (retries) { - retries--; - msleep(I2C_RETRY_DELAY); - goto retry; - } - - kfree(data); - return ret; - } else if (ret > 1) { - int ret_cpy = copy_to_user(user_buf, data, count); - - if (ret_cpy) { - pr_err("copy to user space failed.\n"); - } - } - - /* ret contains the number of i2c transaction */ - /* return the number of bytes read */ - kfree(data); - return ((ret > 1) ? count : -EIO); -} - -static ssize_t tfa98xx_misc_device_rw_write(struct file *file, const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct tfa98xx *tfa98xx = file->private_data; - u8 *data; - int ret; - int retries = I2C_RETRIES; - //pr_info("entry count=%d\n", (int)count); - - data = kmalloc(count+1, GFP_KERNEL); - if (data == NULL) { - pr_debug("can not allocate memory\n"); - return -ENOMEM; - } - - //pr_info("tfa98xx->reg=0x%x\n", tfa98xx->reg); - - data[0] = tfa98xx->reg; - if (copy_from_user(&data[1], user_buf, count)) { - pr_err("copy to user space failed.\n"); - } - - -retry: - ret = i2c_master_send(tfa98xx->i2c, data, count+1); - if (ret < 0) { - pr_warn("i2c error, retries left: %d\n", retries); - if (retries) { - retries--; - msleep(I2C_RETRY_DELAY); - goto retry; - } - } - - kfree(data); - - /* the number of data bytes written without the register address */ - return ((ret > 1) ? count : -EIO); -} - -static int tfa98xx_misc_device_rpc_open(struct inode *inode, struct file *file) -{ - struct tfa98xx *tfa98xx = container_of(file->private_data, - struct tfa98xx, tfa98xx_rpc); - if (tfa98xx) { - file->private_data = tfa98xx; - return 0; - } else { - file->private_data = NULL; - return -EINVAL; - } -} - -static ssize_t tfa98xx_misc_device_rpc_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct tfa98xx *tfa98xx = file->private_data; - uint8_t *buffer = NULL; - int ret = 0; - - buffer = kmalloc(count, GFP_KERNEL); - if (buffer == NULL) { - pr_err("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); - return -ENOMEM; - } - - mutex_lock(&tfa98xx->dsp_lock); - - ret = send_tfa_cal_apr(buffer, count, true); - - mutex_unlock(&tfa98xx->dsp_lock); - if (ret) { - pr_err("[0x%x] dsp_msg_read error: %d\n", tfa98xx->i2c->addr, ret); - kfree(buffer); - return -EFAULT; - } - - ret = copy_to_user(user_buf, buffer, count); - kfree(buffer); - if (ret) - return -EFAULT; - - *ppos += count; - return count; -} - -static ssize_t tfa98xx_misc_device_rpc_write(struct file *file, const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct tfa98xx *tfa98xx = file->private_data; - uint8_t *buffer; - int err = 0; - - if (count == 0) - return 0; - - /* msg_file.name is not used */ - buffer = kmalloc(count, GFP_KERNEL); - if (buffer == NULL) { - pr_err("[0x%x] can not allocate memory\n", tfa98xx->i2c->addr); - return -ENOMEM; - } - if (copy_from_user(buffer, user_buf, count)) - return -EFAULT; - - mutex_lock(&tfa98xx->dsp_lock); - - err = send_tfa_cal_apr(buffer, count, false); - if (err) { - pr_err("[0x%x] dsp_msg error: %d\n", tfa98xx->i2c->addr, err); - } - - mdelay(2); - - mutex_unlock(&tfa98xx->dsp_lock); - - kfree(buffer); - - if (err) - return err; - return count; -} - -enum Tfa98xx_Error tfa98xx_read_data_from_hostdsp(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int num_bytes, - unsigned char data[]) -{ - int error; - unsigned char buffer[3]; - int nr = 0; - - if (num_bytes <= 0) { - pr_debug("Error: The number of READ bytes is smaller or equal to 0!\n"); - return Tfa98xx_Error_Fail; - } - - if ((tfa->cnt->ndev == 1) && - (param_id == SB_PARAM_GET_RE25C || - param_id == SB_PARAM_GET_LSMODEL || - param_id == SB_PARAM_GET_ALGO_PARAMS)) { - - /* Modifying the ID for GetRe25C */ - buffer[nr++] = 4; - } else { - buffer[nr++] = tfa->spkr_select; - } - buffer[nr++] = module_id + 128; - buffer[nr++] = param_id; - - error = send_tfa_cal_apr(buffer, sizeof(buffer), false); - if (error) - return Tfa98xx_Error_Bad_Parameter; - mdelay(5); - - /* read the data from the dsp */ - error = send_tfa_cal_apr(data, sizeof(num_bytes), true); - if (error) - return Tfa98xx_Error_Bad_Parameter; - return Tfa98xx_Error_Ok; -} - -static uint8_t send_to_dsp_count; -static int tfa98xx_read_memtrack_data(struct tfa98xx *tfa98xx, int *pLivedata) -{ - enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; - /* the buffer is for stereo usecase. */ - char buffer[(2 + (MEMTRACK_ITEM_MAX * 2)) * 3] = {0}; - int item_bytes = MEMTRACK_ITEM_MAX * 3; /* mono case by default.*/ - - enum TFA_DEVICE_TYPE pri_devcie = TFA_DEVICE_TYPE_MAX; - enum TFA_DEVICE_TYPE sec_devcie = TFA_DEVICE_TYPE_MAX; - /* TFA device memory map. */ - struct livedata_cfg livedata_table[TFA_DEVICE_TYPE_MAX][MEMTRACK_ITEM_MAX] = { - /* for TFA9894 device */ - { - {0x6fc, 0x02, 0x0001}, /* fRes_P */ - {0x705, 0x02, 0x4000}, /* T_P */ - {0x70b, 0x02, 0x10000}, /* ReT_P */ - }, - - /* for TFA9874 primary channel */ - { - {0x310, 0x02, 0x0001}, /* fRes_P */ - {0x319, 0x02, 0x4000}, /* T_P */ - {0x31f, 0x02, 0x10000}, /* ReT_P */ - }, - - /* for TFA9874 secondary channel */ - { - {0x64c, 0x02, 0x0001}, /* fRes_S */ - {0x655, 0x02, 0x4000}, /* T_S */ - {0x65b, 0x02, 0x10000}, /* ReT_S */ - }, - }; - - pr_debug("entry tfa_family=%d rev=0x%x\n", tfa98xx->tfa->tfa_family, tfa98xx->tfa->rev); - mutex_lock(&tfa98xx->dsp_lock); - switch (tfa98xx->tfa->rev & 0xff) { - case 0x74: - pri_devcie = TFA_DEVICE_TYPE_9874_PRIMARY; - sec_devcie = TFA_DEVICE_TYPE_9874_SECONDARY; - break; - case 0x94: - pri_devcie = TFA_DEVICE_TYPE_9894; - break; - default: - pr_err("Un-support device type 0x%x\n", tfa98xx->tfa->rev); - ret = Tfa98xx_Error_Device; - goto err; - } - - /* check DSP status. we can read memtrack data once DSP is running. */ - if ((TFA_GET_BF(tfa98xx->tfa, MANSTATE) != 9) || (TFA_GET_BF(tfa98xx->tfa, CFE) == 0)) { - pr_err("The DSP is not running.\n"); - ret = Tfa98xx_Error_DSP_not_running; - goto err; - } - - if (tfa98xx->tfa->tfa_family == 2) { - int i = 0, j = 0; - - /* step 1: set livedata items. */ - memset(&buffer[0], 0x00, sizeof(buffer)); - - /* For every item take the tracker and add this infront of the adress */ - if (tfa98xx->tfa->is_probus_device) { /* for none-dsp device. */ - /* because our algorithm can support mono/stereo use case. - if device count is more than 1, we will build stereo struct and send to dsp next time. */ - if ((tfa98xx_device_count > 1) && (send_to_dsp_count == 0)) { - send_to_dsp_count++; - ret = Tfa98xx_Error_Ok; - goto err; - } - } - - /* build primary channel struct. */ - for (i = 0; i < MEMTRACK_ITEM_MAX*3; i += 3) { - buffer[i+6] = (uint8_t)(livedata_table[pri_devcie][j].track & 0xff); - buffer[i+7] = (uint8_t)((livedata_table[pri_devcie][j].address >> 8) & 0xff); - buffer[i+8] = (uint8_t)(livedata_table[pri_devcie][j].address & 0xff); - j++; - } - - /* build secondary channel struct. */ - if (tfa98xx_device_count > 1) { - j = 0; - for (i = MEMTRACK_ITEM_MAX*3; i < MEMTRACK_ITEM_MAX*6; i += 3) { - buffer[i+6] = (uint8_t)(livedata_table[sec_devcie][j].track & 0xff); - buffer[i+7] = (uint8_t)((livedata_table[sec_devcie][j].address >> 8) & 0xff); - buffer[i+8] = (uint8_t)(livedata_table[sec_devcie][j].address & 0xff); - j++; - } - - item_bytes *= 2; /* re-calculate item length for stereo usecase. */ - } - - /* copy the msg_id to buffer */ - buffer[0] = 0; - buffer[1] = MODULE_FRAMEWORK + 128; - buffer[2] = FW_PAR_ID_SET_MEMTRACK; - - /* Then copy the length (number of memtrack items) */ - buffer[3] = (uint8_t) ((item_bytes >> 16) & 0xffff); - buffer[4] = (uint8_t) ((item_bytes >> 8) & 0xff); - buffer[5] = (uint8_t) (item_bytes & 0xff); - - pr_info("send command to dsp to build memtrack structure.\n"); - /* send command to host dsp. */ - if (tfa98xx->tfa->is_probus_device) { - send_tfa_cal_apr(buffer, item_bytes + 6, false); - send_to_dsp_count = 0; - mdelay(5); - } else { - ret = dsp_msg(tfa98xx->tfa, item_bytes + 6, buffer); - } - - if (Tfa98xx_Error_Ok == ret) { - /* step 2: read livedata from dsp. */ - memset(&buffer[0], 0x00, sizeof(buffer)); - - /*Length = nr of items * 3 bytes (24bit dsp) + 3 bytes for Elapsed time (first 3 bytes)*/ - if (tfa98xx->tfa->is_probus_device) { - ret = tfa98xx_read_data_from_hostdsp(tfa98xx->tfa, MODULE_FRAMEWORK, FW_PAR_ID_GET_MEMTRACK, item_bytes+3, buffer); - } else { - ret = tfa_dsp_cmd_id_write_read(tfa98xx->tfa, MODULE_FRAMEWORK, FW_PAR_ID_GET_MEMTRACK, item_bytes+3, buffer); - } - - pr_debug("read memtrack data. ret=%d\n", ret); - - if (Tfa98xx_Error_Ok == ret) { - /* Skip the first 3 bytes (this is the Elapsed time, not memtrack data) */ - tfa98xx_convert_bytes2data(item_bytes, &buffer[3], pLivedata); - } else { - pr_err("get memtrack data failed from device.\n"); - ret = Tfa98xx_Error_Other; - } - } else { - pr_err("set memtrack item failed.\n"); - ret = Tfa98xx_Error_Other; - } - } else { - pr_err("The funciton doesn't support other device family(%d).\n", tfa98xx->tfa->tfa_family); - ret = Tfa98xx_Error_Other; - } - -err: - mutex_unlock(&tfa98xx->dsp_lock); - return ret; -} - -static int tfa98xx_misc_device_control_open(struct inode *inode, struct file *file) -{ - struct tfa98xx *tfa98xx = container_of(file->private_data, - struct tfa98xx, tfa98xx_control); - if (tfa98xx) { - file->private_data = tfa98xx; - return 0; - } else { - file->private_data = NULL; - return -EINVAL; - } -} - -static long tfa98xx_misc_device_control_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg) -{ - struct tfa98xx *tfa98xx = NULL; - int result = 0; - - //pr_info("entry cmd=%d arg=%p\n", cmd, (void*)arg); - if (!arg) { - pr_err("arg is NULL!\n"); - return -EINVAL; - } - - switch (cmd) { - case IOCTL_CMD_GET_MEMTRACK_DATA: { - int livedata[MEMTRACK_ITEM_MAX * 2]; - int livedata_length_bytes = 0; - void *pUserData = (void *)arg; - - list_for_each_entry(tfa98xx, &tfa98xx_device_list, list) { - /* clear buffer and read livedata from dsp.*/ - memset((char *)(&livedata[0]), 0x00, sizeof(livedata)); - /* read original memtrack data from device. */ - if (Tfa98xx_Error_Ok == tfa98xx_read_memtrack_data(tfa98xx, &livedata[0])) { - pr_debug("Device 0x%x read memtrack data sucessed.\n", tfa98xx->i2c->addr); - } else { - pr_err("Device 0x%x read memtrack data failed.\n", tfa98xx->i2c->addr); - } - - /* copy data to user spcace. if copied is successed, - will be returned actual size to user space. */ - livedata_length_bytes = sizeof(int) * MEMTRACK_ITEM_MAX; - if ((tfa98xx->tfa->is_probus_device) && (tfa98xx_device_count > 1)) { - /* for stereo usecase, if the condition is true, we have already got livedata from host DSP. - otherwise, we don't need do anything. */ - if (send_to_dsp_count == 0) { - livedata_length_bytes *= 2; - } else { - livedata_length_bytes = 0; - } - } - - if (livedata_length_bytes != 0) { - result = copy_to_user((void __user *)pUserData, &livedata[0], livedata_length_bytes); - if (result) { - pr_err("copy to user space failed(%d).\n", result); - result = -EINVAL; - break; - } else { - result += livedata_length_bytes; - } - pUserData += livedata_length_bytes; - } - } - break; - } - case IOCTL_CMD_GET_CNT_VERSION: { - void *pUserData = (void *)arg; - - if (tfa98xx_container != NULL) { - result = copy_to_user((void __user *)pUserData, tfa98xx_container->type, strlen(tfa98xx_container->type)); - if (result) { - pr_err("copy to user space failed(%d).\n", result); - } else { - result = strlen(tfa98xx_container->type); - } - } else { - pr_err("get cnt version failed.\n"); - result = -EINVAL; - } - break; - } - default: - result = -EINVAL; - pr_err("un-supported command. (%d)\n", cmd); - break; - } - - //pr_info("exit result=%d\n", result); - return result; -} - -#ifdef CONFIG_COMPAT -static long tfa98xx_misc_device_control_compat_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg) -{ - //pr_info("%s entry cmd=%d arg=%p\n", __func__, cmd, (void*)arg); - - if (!arg) { - pr_err("%s No data send to driver!\n", __func__); - return -EINVAL; - } - - return tfa98xx_misc_device_control_ioctl(file, cmd, arg); -} -#endif - - -static const struct tfa98xx_miscdevice_info miscdevice_info[MISC_DEVICE_MAX] = { - { - .devicename = "tfa_reg", - .operations.owner = THIS_MODULE, - .operations.open = tfa98xx_misc_device_reg_open, - .operations.write = tfa98xx_misc_device_reg_write, - }, - { - .devicename = "tfa_rw", - .operations.owner = THIS_MODULE, - .operations.open = tfa98xx_misc_device_rw_open, - .operations.read = tfa98xx_misc_device_rw_read, - .operations.write = tfa98xx_misc_device_rw_write, - }, - { - .devicename = "tfa_rpc", - .operations.owner = THIS_MODULE, - .operations.open = tfa98xx_misc_device_rpc_open, - .operations.read = tfa98xx_misc_device_rpc_read, - .operations.write = tfa98xx_misc_device_rpc_write, - }, - { - .devicename = "tfa_profile", - .operations.owner = THIS_MODULE, - .operations.open = tfa98xx_misc_device_profile_open, - .operations.write = tfa98xx_misc_device_profile_write, - }, - { - .devicename = "tfa_control", - .operations.owner = THIS_MODULE, - .operations.open = tfa98xx_misc_device_control_open, - .operations.unlocked_ioctl = tfa98xx_misc_device_control_ioctl, -#ifdef CONFIG_COMPAT - .operations.compat_ioctl = tfa98xx_misc_device_control_compat_ioctl, -#endif - }, -}; - -int tfa98xx_init_misc_device(struct tfa98xx *tfa98xx) -{ - int ret = 0; - - pr_debug("entry\n"); - if (tfa98xx == NULL) { - pr_err("tfa98xx is NULL.\n"); - return -EINVAL; - } - - //pr_info("I2C bus=0x%x address=0x%x\n", tfa98xx->i2c->adapter->nr, tfa98xx->i2c->addr); - /* create device node "tfa_reg_X" for write sub address. */ - tfa98xx->tfa98xx_reg.minor = MISC_DYNAMIC_MINOR; - tfa98xx->tfa98xx_reg.name = miscdevice_info[MISC_DEVICE_TFA98XX_REG].devicename; - tfa98xx->tfa98xx_reg.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_REG].operations; - ret = misc_register(&tfa98xx->tfa98xx_reg); - if (ret) { - pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_reg.name); - } - - /* create device node "tfa_rw_X" for read/write i2c device. */ - tfa98xx->tfa98xx_rw.minor = MISC_DYNAMIC_MINOR; - tfa98xx->tfa98xx_rw.name = miscdevice_info[MISC_DEVICE_TFA98XX_RW].devicename; - tfa98xx->tfa98xx_rw.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_RW].operations; - ret = misc_register(&tfa98xx->tfa98xx_rw); - if (ret) { - pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_rw.name); - } - - /* create device node "tfa_rpc_X" for switching profile. */ - tfa98xx->tfa98xx_rpc.minor = MISC_DYNAMIC_MINOR; - tfa98xx->tfa98xx_rpc.name = miscdevice_info[MISC_DEVICE_TFA98XX_RPC].devicename; - tfa98xx->tfa98xx_rpc.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_RPC].operations; - ret = misc_register(&tfa98xx->tfa98xx_rpc); - if (ret) { - pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_rpc.name); - } - - /* create device node "tfa_profile_X" for switching profile. */ - tfa98xx->tfa98xx_profile.minor = MISC_DYNAMIC_MINOR; - tfa98xx->tfa98xx_profile.name = miscdevice_info[MISC_DEVICE_TFA98XX_PROFILE].devicename; - tfa98xx->tfa98xx_profile.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_PROFILE].operations; - ret = misc_register(&tfa98xx->tfa98xx_profile); - if (ret) { - pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_profile.name); - } - - /* create device node "tfa_control_X" for IO control. */ - tfa98xx->tfa98xx_control.minor = MISC_DYNAMIC_MINOR; - tfa98xx->tfa98xx_control.name = miscdevice_info[MISC_DEVICE_TFA98XX_IOCTL].devicename; - tfa98xx->tfa98xx_control.fops = &miscdevice_info[MISC_DEVICE_TFA98XX_IOCTL].operations; - ret = misc_register(&tfa98xx->tfa98xx_control); - if (ret) { - pr_err("tfa98xx_init_misc_device: register misc device [%s] failed\n", tfa98xx->tfa98xx_control.name); - } - - if (ret == 0) - pr_info("register misc device successed.\n"); - return ret; -} - -void tfa98xx_remove_misc_device(struct tfa98xx *tfa98xx) -{ - pr_info("entry\n"); - if (tfa98xx == NULL) { - pr_err("tfa98xx is NULL.\n"); - return; - } - - misc_deregister(&tfa98xx->tfa98xx_reg); - misc_deregister(&tfa98xx->tfa98xx_rw); - misc_deregister(&tfa98xx->tfa98xx_rpc); - misc_deregister(&tfa98xx->tfa98xx_profile); - misc_deregister(&tfa98xx->tfa98xx_control); - return; -} - -static int tfa98xx_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) -{ - struct snd_soc_dai_driver *dai; - struct tfa98xx *tfa98xx; - struct device_node *np = i2c->dev.of_node; - int irq_flags; - unsigned int reg; - int ret; - int spk_name; - - pr_debug("addr=0x%x\n", i2c->addr); - - if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) { - dev_err(&i2c->dev, "check_functionality failed\n"); - return -EIO; - } - - tfa98xx = devm_kzalloc(&i2c->dev, sizeof(struct tfa98xx), GFP_KERNEL); - if (tfa98xx == NULL) - return -ENOMEM; - - tfa98xx->dev = &i2c->dev; - tfa98xx->i2c = i2c; - tfa98xx->dsp_init = TFA98XX_DSP_INIT_STOPPED; - tfa98xx->rate = 48000; /* init to the default sample rate (48kHz) */ - tfa98xx->tfa = NULL; - tfa98xx->tfa_mute_mode = TFA98XX_DEVICE_MUTE_OFF; /* the mute mode is disabled by default. */ - tfa98xx->regmap = devm_regmap_init_i2c(i2c, &tfa98xx_regmap); - if (IS_ERR(tfa98xx->regmap)) { - ret = PTR_ERR(tfa98xx->regmap); - dev_err(&i2c->dev, "Failed to allocate register map: %d\n", - ret); - return ret; - } - - i2c_set_clientdata(i2c, tfa98xx); - mutex_init(&tfa98xx->dsp_lock); - init_waitqueue_head(&tfa98xx->wq); - - if (np) { - ret = tfa98xx_parse_dt(&i2c->dev, tfa98xx, np); - if (ret) { - dev_err(&i2c->dev, "Failed to parse DT node\n"); - return ret; - } - if (no_start) - tfa98xx->irq_gpio = -1; - if (no_reset) - tfa98xx->reset_gpio = -1; - } else { - tfa98xx->reset_gpio = -1; - tfa98xx->irq_gpio = -1; - } - - if (gpio_is_valid(tfa98xx->reset_gpio)) { - ret = devm_gpio_request_one(&i2c->dev, tfa98xx->reset_gpio, - GPIOF_OUT_INIT_LOW, "TFA98XX_RST"); - if (ret) - return ret; - } - - if (gpio_is_valid(tfa98xx->irq_gpio)) { - ret = devm_gpio_request_one(&i2c->dev, tfa98xx->irq_gpio, - GPIOF_DIR_IN, "TFA98XX_INT"); - if (ret) - return ret; - } - - tfa98xx->spk_id_gpio_p = of_parse_phandle(np, - "nxp,spk-id-pin", 0); - - if (!tfa98xx->spk_id_gpio_p) { - dev_err(&i2c->dev, "property %s not detected in node %s", - "nxp,spk-id-pin", np->full_name); - } else { - spk_name = nxp_spk_id_get(tfa98xx->spk_id_gpio_p); - if (spk_name == VENDOR_ID_AAC) { - fw_name = TFA98XX_AAC_FW_NAME; - } - - if (spk_name == VENDOR_ID_GOER) { - fw_name = TFA98XX_GOER_FW_NAME; - } - - dev_err(&i2c->dev, "spk is %d, fw_name =%s\n", spk_name, fw_name); - } - - /* Power up! */ - tfa98xx_ext_reset(tfa98xx); - - if ((no_start == 0) && (no_reset == 0)) { - ret = regmap_read(tfa98xx->regmap, 0x03, ®); - if (ret < 0) { - dev_err(&i2c->dev, "Failed to read Revision register: %d\n", - ret); - return -EIO; - } - switch (reg & 0xff) { - case 0x72: /* tfa9872 */ - pr_info("TFA9872 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; - tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; - tfa98xx->flags |= TFA98XX_FLAG_REMOVE_PLOP_NOISE; - /* tfa98xx->flags |= TFA98XX_FLAG_LP_MODES; */ - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - break; - case 0x73: /* tfa9873 */ - pr_info("TFA9873 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; - tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - tfa98xx->flags |= TFA98XX_FLAG_ADAPT_NOISE_MODE; /***MCH_TO_TEST***/ - break; - case 0x74: /* tfa9874 */ - pr_info("TFA9874 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; - tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - break; - case 0x78: /* tfa9878 */ - pr_info("TFA9878 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; - tfa98xx->flags |= TFA98XX_FLAG_CALIBRATION_CTL; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - break; - case 0x88: /* tfa9888 */ - pr_info("TFA9888 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_STEREO_DEVICE; - tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - break; - case 0x13: /* tfa9912 */ - pr_info("TFA9912 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - /* tfa98xx->flags |= TFA98XX_FLAG_TAPDET_AVAILABLE; */ - break; - case 0x94: /* tfa9894 */ - pr_info("TFA9894 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_MULTI_MIC_INPUTS; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; - break; - case 0x80: /* tfa9890 */ - case 0x81: /* tfa9890 */ - pr_info("TFA9890 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; - break; - case 0x92: /* tfa9891 */ - pr_info("TFA9891 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_SAAM_AVAILABLE; - tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; - break; - case 0x12: /* tfa9895 */ - pr_info("TFA9895 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; - break; - case 0x97: - pr_info("TFA9897 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - break; - case 0x96: - pr_info("TFA9896 detected\n"); - tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; - tfa98xx->flags |= TFA98XX_FLAG_TDM_DEVICE; - break; - default: - pr_info("Unsupported device revision (0x%x)\n", reg & 0xff); - return -EINVAL; - } - } - - tfa98xx->tfa = devm_kzalloc(&i2c->dev, sizeof(struct tfa_device), GFP_KERNEL); - if (tfa98xx->tfa == NULL) - return -ENOMEM; - - tfa98xx->tfa->data = (void *)tfa98xx; - tfa98xx->tfa->cachep = tfa98xx_cache; - - /* Modify the stream names, by appending the i2c device address. - * This is used with multicodec, in order to discriminate the devices. - * Stream names appear in the dai definition and in the stream . - * We create copies of original structures because each device will - * have its own instance of this structure, with its own address. - */ - dai = devm_kzalloc(&i2c->dev, sizeof(tfa98xx_dai), GFP_KERNEL); - if (!dai) - return -ENOMEM; - memcpy(dai, tfa98xx_dai, sizeof(tfa98xx_dai)); - - tfa98xx_append_i2c_address(&i2c->dev, - i2c, - NULL, - 0, - dai, - ARRAY_SIZE(tfa98xx_dai)); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - ret = devm_snd_soc_register_component(&i2c->dev, - &soc_codec_dev_tfa98xx, dai, - ARRAY_SIZE(tfa98xx_dai)); -#else - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_tfa98xx, dai, - ARRAY_SIZE(tfa98xx_dai)); -#endif - if (ret < 0) { - dev_err(&i2c->dev, "Failed to register TFA98xx: %d\n", ret); - return ret; - } - - if (gpio_is_valid(tfa98xx->irq_gpio) && - !(tfa98xx->flags & TFA98XX_FLAG_SKIP_INTERRUPTS)) { - /* register irq handler */ - irq_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT; - ret = devm_request_threaded_irq(&i2c->dev, - gpio_to_irq(tfa98xx->irq_gpio), - NULL, tfa98xx_irq, irq_flags, - "tfa98xx", tfa98xx); - if (ret != 0) { - dev_err(&i2c->dev, "Failed to request IRQ %d: %d\n", - gpio_to_irq(tfa98xx->irq_gpio), ret); - return ret; - } - } else { - dev_info(&i2c->dev, "Skipping IRQ registration\n"); - /* disable feature support if gpio was invalid */ - tfa98xx->flags |= TFA98XX_FLAG_SKIP_INTERRUPTS; - } - -#ifdef CONFIG_DEBUG_FS - if (no_start == 0) - tfa98xx_debug_init(tfa98xx, i2c); -#endif - /* Register the sysfs files for climax backdoor access */ - ret = device_create_bin_file(&i2c->dev, &dev_attr_rw); - if (ret) - dev_info(&i2c->dev, "error creating sysfs files\n"); - ret = device_create_bin_file(&i2c->dev, &dev_attr_reg); - if (ret) - dev_info(&i2c->dev, "error creating sysfs files\n"); - if (tfa98xx_device_count == 0) - tfa98xx_init_misc_device(tfa98xx); - pr_info("%s Probe completed successfully!\n", __func__); - - INIT_LIST_HEAD(&tfa98xx->list); - - mutex_lock(&tfa98xx_mutex); - tfa98xx_device_count++; - list_add(&tfa98xx->list, &tfa98xx_device_list); - mutex_unlock(&tfa98xx_mutex); - - return 0; -} - -static int tfa98xx_i2c_remove(struct i2c_client *i2c) -{ - struct tfa98xx *tfa98xx = i2c_get_clientdata(i2c); - - pr_debug("addr=0x%x\n", i2c->addr); - - tfa98xx_interrupt_enable(tfa98xx, false); - - cancel_delayed_work_sync(&tfa98xx->interrupt_work); - cancel_delayed_work_sync(&tfa98xx->monitor_work); - cancel_delayed_work_sync(&tfa98xx->init_work); - cancel_delayed_work_sync(&tfa98xx->tapdet_work); - cancel_delayed_work_sync(&tfa98xx->nmodeupdate_work); - - device_remove_bin_file(&i2c->dev, &dev_attr_reg); - device_remove_bin_file(&i2c->dev, &dev_attr_rw); -#ifdef CONFIG_DEBUG_FS - tfa98xx_debug_remove(tfa98xx); -#endif - tfa98xx_remove_misc_device(tfa98xx); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) - snd_soc_unregister_component(&i2c->dev); -#else - snd_soc_unregister_codec(&i2c->dev); -#endif - if (gpio_is_valid(tfa98xx->irq_gpio)) - devm_gpio_free(&i2c->dev, tfa98xx->irq_gpio); - if (gpio_is_valid(tfa98xx->reset_gpio)) - devm_gpio_free(&i2c->dev, tfa98xx->reset_gpio); - - mutex_lock(&tfa98xx_mutex); - list_del(&tfa98xx->list); - tfa98xx_device_count--; - if (tfa98xx_device_count == 0) { - kfree(tfa98xx_container); - tfa98xx_container = NULL; - } - mutex_unlock(&tfa98xx_mutex); - - return 0; -} - -static const struct i2c_device_id tfa98xx_i2c_id[] = { - { "tfa98xx", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, tfa98xx_i2c_id); - -#ifdef CONFIG_OF -static struct of_device_id tfa98xx_dt_match[] = { - {.compatible = "tfa,tfa98xx" }, - {.compatible = "tfa,tfa9872" }, - {.compatible = "tfa,tfa9873" }, - {.compatible = "tfa,tfa9874" }, - {.compatible = "tfa,tfa9878" }, - {.compatible = "tfa,tfa9888" }, - {.compatible = "tfa,tfa9890" }, - {.compatible = "tfa,tfa9891" }, - {.compatible = "tfa,tfa9894" }, - {.compatible = "tfa,tfa9895" }, - {.compatible = "tfa,tfa9896" }, - {.compatible = "tfa,tfa9897" }, - {.compatible = "tfa,tfa9912" }, - { }, -}; -#endif - -static struct i2c_driver tfa98xx_i2c_driver = { - .driver = { - .name = "tfa98xx", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(tfa98xx_dt_match), - .probe_type = PROBE_PREFER_ASYNCHRONOUS, - }, - .probe = tfa98xx_i2c_probe, - .remove = tfa98xx_i2c_remove, - .id_table = tfa98xx_i2c_id, -}; - -static int __init tfa98xx_i2c_init(void) -{ - int ret = 0; - - pr_info("TFA98XX driver version %s\n", TFA98XX_VERSION); - - /* Enable debug traces */ - tfa98xx_kmsg_regs = trace_level & 2; - tfa98xx_ftrace_regs = trace_level & 4; - - /* Initialize kmem_cache */ - tfa98xx_cache = kmem_cache_create("tfa98xx_cache", /* Cache name /proc/slabinfo */ - PAGE_SIZE, /* Structure size, we should fit in single page */ - 0, /* Structure alignment */ - (SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT | - SLAB_MEM_SPREAD), /* Cache property */ - NULL); /* Object constructor */ - if (!tfa98xx_cache) { - pr_err("tfa98xx can't create memory pool\n"); - ret = -ENOMEM; - } - - ret = i2c_add_driver(&tfa98xx_i2c_driver); - - return ret; -} -module_init(tfa98xx_i2c_init); - -static void __exit tfa98xx_i2c_exit(void) -{ - i2c_del_driver(&tfa98xx_i2c_driver); - kmem_cache_destroy(tfa98xx_cache); -} -module_exit(tfa98xx_i2c_exit); - -MODULE_DESCRIPTION("ASoC TFA98XX driver"); -MODULE_LICENSE("GPL"); diff --git a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_container.c b/techpack/audio/asoc/codecs/tfa98xx/src/tfa_container.c deleted file mode 100644 index 66ee1323f762..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_container.c +++ /dev/null @@ -1,2374 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -#include "dbgprint.h" -#include "tfa_container.h" -#include "tfa.h" -#include "tfa98xx_tfafieldnames.h" -#include "tfa_internal.h" - - /* defines */ -#define MODULE_BIQUADFILTERBANK 2 -#define BIQUAD_COEFF_SIZE 6 - -/* module globals */ -static uint8_t gslave_address; /* This is used to SET the slave with the --slave option */ - -static int float_to_int(uint32_t x) -{ - unsigned int e = (0x7F + 31) - ((*(unsigned *)&x & 0x7F800000) >> 23); - unsigned int m = 0x80000000 | (*(unsigned *)&x << 8); - - return -(int)((m >> e) & -(e < 32)); -} - -/* - * check the container file -*/ -enum tfa_error tfa_load_cnt(void *cnt, int length) -{ - TfaContainer_t *cntbuf = (TfaContainer_t *)cnt; - - if (length > TFA_MAX_CNT_LENGTH) { - pr_err("incorrect length\n"); - return tfa_error_container; - } - - if (HDR(cntbuf->id[0], cntbuf->id[1]) == 0) { - pr_err("header is 0\n"); - return tfa_error_container; - } - - if ((HDR(cntbuf->id[0], cntbuf->id[1])) != paramsHdr) { - pr_err("wrong header type: 0x%02x 0x%02x\n", cntbuf->id[0], cntbuf->id[1]); - return tfa_error_container; - } - - if (cntbuf->size == 0) { - pr_err("data size is 0\n"); - return tfa_error_container; - } - - /* check CRC */ - if (tfaContCrcCheckContainer(cntbuf)) { - pr_err("CRC error\n"); - return tfa_error_container; - } - - /* check sub version level */ - if ((cntbuf->subversion[1] != TFA_PM_SUBVERSION) && - (cntbuf->subversion[0] != '0')) { - pr_err("container sub-version not supported: %c%c\n", - cntbuf->subversion[0], cntbuf->subversion[1]); - return tfa_error_container; - } - - return tfa_error_ok; -} - -/* - * Dump the contents of the file header - */ -void tfaContShowHeader(TfaHeader_t *hdr) -{ - char _id[2]; - - pr_debug("File header\n"); - - _id[1] = hdr->id >> 8; - _id[0] = hdr->id & 0xff; - pr_debug("\tid:%.2s version:%.2s subversion:%.2s\n", _id, - hdr->version, hdr->subversion); - pr_debug("\tsize:%d CRC:0x%08x\n", hdr->size, hdr->CRC); - pr_debug("\tcustomer:%.8s application:%.8s type:%.8s\n", hdr->customer, - hdr->application, hdr->type); -} - -/* - * return device list dsc from index - */ -TfaDeviceList_t *tfaContGetDevList(TfaContainer_t *cont, int dev_idx) -{ - uint8_t *base = (uint8_t *)cont; - - if (cont == NULL) - return NULL; - - if ((dev_idx < 0) || (dev_idx >= cont->ndev)) - return NULL; - - if (cont->index[dev_idx].type != dscDevice) - return NULL; - - base += cont->index[dev_idx].offset; - return (TfaDeviceList_t *)base; -} - -/* - * get the Nth profile for the Nth device - */ -TfaProfileList_t *tfaContGetDevProfList(TfaContainer_t *cont, int devIdx, int profIdx) -{ - TfaDeviceList_t *dev; - int idx, hit; - uint8_t *base = (uint8_t *)cont; - - dev = tfaContGetDevList(cont, devIdx); - if (dev) { - for (idx = 0, hit = 0; idx < dev->length; idx++) { - if (dev->list[idx].type == dscProfile) { - if (profIdx == hit++) - return (TfaProfileList_t *)(dev->list[idx].offset + base); - } - } - } - - return NULL; -} - -/* - * get the number of profiles for the Nth device - */ -int tfa_cnt_get_dev_nprof(struct tfa_device *tfa) -{ - TfaDeviceList_t *dev; - int idx, nprof = 0; - - if (tfa->cnt == NULL) - return 0; - - if ((tfa->dev_idx < 0) || (tfa->dev_idx >= tfa->cnt->ndev)) - return 0; - - dev = tfaContGetDevList(tfa->cnt, tfa->dev_idx); - if (dev) { - for (idx = 0; idx < dev->length; idx++) { - if (dev->list[idx].type == dscProfile) { - nprof++; - } - } - } - - return nprof; -} - -/* - * get the Nth lifedata for the Nth device - */ -TfaLiveDataList_t *tfaContGetDevLiveDataList(TfaContainer_t *cont, int devIdx, - int lifeDataIdx) -{ - TfaDeviceList_t *dev; - int idx, hit; - uint8_t *base = (uint8_t *)cont; - - dev = tfaContGetDevList(cont, devIdx); - if (dev) { - for (idx = 0, hit = 0; idx < dev->length; idx++) { - if (dev->list[idx].type == dscLiveData) { - if (lifeDataIdx == hit++) - return (TfaLiveDataList_t *) - (dev->list[idx].offset + base); - } - } - } - - return NULL; -} - -/* - * Get the max volume step associated with Nth profile for the Nth device - */ -int tfacont_get_max_vstep(struct tfa_device *tfa, int prof_idx) -{ - TfaVolumeStep2File_t *vp; - struct TfaVolumeStepMax2File *vp3; - int vstep_count = 0; - - vp = (TfaVolumeStep2File_t *)tfacont_getfiledata(tfa, prof_idx, volstepHdr); - if (vp == NULL) - return 0; - /* check the header type to load different NrOfVStep appropriately */ - if (tfa->tfa_family == 2) { - /* this is actually tfa2, so re-read the buffer*/ - vp3 = (struct TfaVolumeStepMax2File *) - tfacont_getfiledata(tfa, prof_idx, volstepHdr); - if (vp3) { - vstep_count = vp3->NrOfVsteps; - } - } else { - /* this is max1*/ - if (vp) { - vstep_count = vp->vsteps; - } - } - return vstep_count; -} - -/** - * Get the file contents associated with the device or profile - * Search within the device tree, if not found, search within the profile - * tree. There can only be one type of file within profile or device. - */ -TfaFileDsc_t *tfacont_getfiledata(struct tfa_device *tfa, int prof_idx, enum TfaHeaderType type) -{ - TfaDeviceList_t *dev; - TfaProfileList_t *prof; - TfaFileDsc_t *file; - TfaHeader_t *hdr; - unsigned int i; - - if (tfa->cnt == NULL) { - pr_err("invalid pointer to container file\n"); - return NULL; - } - - dev = tfaContGetDevList(tfa->cnt, tfa->dev_idx); - if (dev == NULL) { - pr_err("invalid pointer to container file device list\n"); - return NULL; - } - - /* process the device list until a file type is encountered */ - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == dscFile) { - file = (TfaFileDsc_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); - if (file != NULL) { - hdr = (TfaHeader_t *)file->data; - /* check for file type */ - if (hdr->id == type) { - return (TfaFileDsc_t *)&file->data; - } - } - } - } - - /* File not found in device tree. - * So, look in the profile list until the file type is encountered - */ - prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - if (prof == NULL) { - pr_err("invalid pointer to container file profile list\n"); - return NULL; - } - - for (i = 0; i < prof->length; i++) { - if (prof->list[i].type == dscFile) { - file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - if (file != NULL) { - hdr = (TfaHeader_t *)file->data; - if (hdr != NULL) { - /* check for file type */ - if (hdr->id == type) { - return (TfaFileDsc_t *)&file->data; - } - } - } - } - } - - if (tfa->verbose) - pr_debug("%s: no file found of type %d\n", __func__, type); - - return NULL; -} - -/* - * write a parameter file to the device - */ -static enum Tfa98xx_Error tfaContWriteVstep(struct tfa_device *tfa, TfaVolumeStep2File_t *vp, int vstep) -{ - enum Tfa98xx_Error err; - unsigned short vol; - - if (vstep < vp->vsteps) { - /* vol = (unsigned short)(voldB / (-0.5f)); */ - vol = (unsigned short)(-2 * float_to_int(*((uint32_t *)&vp->vstep[vstep].attenuation))); - if (vol > 255) /* restricted to 8 bits */ - vol = 255; - - err = tfa98xx_set_volume_level(tfa, vol); - if (err != Tfa98xx_Error_Ok) - return err; - - err = tfa98xx_dsp_write_preset(tfa, sizeof(vp->vstep[0].preset), vp->vstep[vstep].preset); - if (err != Tfa98xx_Error_Ok) - return err; - err = tfa_cont_write_filterbank(tfa, vp->vstep[vstep].filter); - - } else { - pr_err("Incorrect volume given. The value vstep[%d] >= %d\n", vstep, vp->vsteps); - err = Tfa98xx_Error_Bad_Parameter; - } - - if (tfa->verbose) pr_debug("vstep[%d][%d]\n", tfa->dev_idx, vstep); - - return err; -} - -static struct TfaVolumeStepMessageInfo * -tfaContGetmsgInfoFromReg(struct TfaVolumeStepRegisterInfo *regInfo) -{ - char *p = (char *)regInfo; - - p += sizeof(regInfo->NrOfRegisters) + (regInfo->NrOfRegisters * sizeof(uint32_t)); - return (struct TfaVolumeStepMessageInfo *) p; -} - -static int -tfaContGetmsgLen(struct TfaVolumeStepMessageInfo *msgInfo) -{ - return (msgInfo->MessageLength.b[0] << 16) + (msgInfo->MessageLength.b[1] << 8) + msgInfo->MessageLength.b[2]; -} - -static struct TfaVolumeStepMessageInfo * -tfaContGetNextmsgInfo(struct TfaVolumeStepMessageInfo *msgInfo) -{ - char *p = (char *)msgInfo; - int msgLen = tfaContGetmsgLen(msgInfo); - int type = msgInfo->MessageType; - - p += sizeof(msgInfo->MessageType) + sizeof(msgInfo->MessageLength); - if (type == 3) - p += msgLen; - else - p += msgLen * 3; - - return (struct TfaVolumeStepMessageInfo *) p; -} - -static struct TfaVolumeStepRegisterInfo* -tfaContGetNextRegFromEndInfo(struct TfaVolumeStepMessageInfo *msgInfo) -{ - char *p = (char *)msgInfo; - - p += sizeof(msgInfo->NrOfMessages); - return (struct TfaVolumeStepRegisterInfo *) p; - -} - -static struct TfaVolumeStepRegisterInfo* -tfaContGetRegForVstep(TfaVolumeStepMax2File_t *vp, int idx) -{ - int i, j, nrMessage; - - struct TfaVolumeStepRegisterInfo *regInfo - = (struct TfaVolumeStepRegisterInfo *) vp->vstepsBin; - struct TfaVolumeStepMessageInfo *msgInfo = NULL; - - for (i = 0; i < idx; i++) { - msgInfo = tfaContGetmsgInfoFromReg(regInfo); - nrMessage = msgInfo->NrOfMessages; - - for (j = 0; j < nrMessage; j++) { - msgInfo = tfaContGetNextmsgInfo(msgInfo); - } - regInfo = tfaContGetNextRegFromEndInfo(msgInfo); - } - - return regInfo; -} - -#pragma pack(push, 1) -struct tfa_partial_msg_block { - uint8_t offset; - uint16_t change; - uint8_t update[16][3]; -}; -#pragma pack(pop) - -static enum Tfa98xx_Error tfaContWriteVstepMax2_One(struct tfa_device *tfa, struct TfaVolumeStepMessageInfo *new_msg, - struct TfaVolumeStepMessageInfo *old_msg, int enable_partial_update) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int len = (tfaContGetmsgLen(new_msg) - 1) * 3; - char *buf = (char *)new_msg->ParameterData; - uint8_t *partial = NULL; - uint8_t cmdid[3]; - int use_partial_coeff = 0; - - if (enable_partial_update) { - if (new_msg->MessageType != old_msg->MessageType) { - pr_debug("Message type differ - Disable Partial Update\n"); - enable_partial_update = 0; - } else if (tfaContGetmsgLen(new_msg) != tfaContGetmsgLen(old_msg)) { - pr_debug("Message Length differ - Disable Partial Update\n"); - enable_partial_update = 0; - } - } - - if ((enable_partial_update) && (new_msg->MessageType == 1)) { - /* No patial updates for message type 1 (Coefficients) */ - enable_partial_update = 0; - if ((tfa->rev & 0xff) == 0x88) { - use_partial_coeff = 1; - } else if ((tfa->rev & 0xff) == 0x13) { - use_partial_coeff = 1; - } - } - - /* Change Message Len to the actual buffer len */ - memcpy(cmdid, new_msg->CmdId, sizeof(cmdid)); - - /* The algoparams and mbdrc msg id will be changed to the reset type when SBSL=0 - * if SBSL=1 the msg will remain unchanged. It's up to the tuning engineer to choose the 'without_reset' - * types inside the vstep. In other words: the reset msg is applied during SBSL==0 else it remains unchanged. - */ - if (tfa_needs_reset(tfa) == 1) { - if (new_msg->MessageType == 0) { - cmdid[2] = SB_PARAM_SET_ALGO_PARAMS; - if (tfa->verbose) - pr_debug("P-ID for SetAlgoParams modified!\n"); - } else if (new_msg->MessageType == 2) { - cmdid[2] = SB_PARAM_SET_MBDRC; - if (tfa->verbose) - pr_debug("P-ID for SetMBDrc modified!\n"); - } - } - - /* - * +sizeof(struct tfa_partial_msg_block) will allow to fit one - * additonnal partial block If the partial update goes over the len of - * a regular message ,we can safely write our block and check afterward - * that we are over the size of a usual update - */ - if (enable_partial_update) { - partial = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - if (!partial) - pr_debug("Partial update memory error - Disabling\n"); - } - - if (partial) { - uint8_t offset = 0, i = 0; - uint16_t *change; - uint8_t *n = new_msg->ParameterData; - uint8_t *o = old_msg->ParameterData; - uint8_t *p = partial; - uint8_t *trim = partial; - - /* set dspFiltersReset */ - *p++ = 0x02; - *p++ = 0x00; - *p++ = 0x00; - - while ((o < (old_msg->ParameterData + len)) && - (p < (partial + len - 3))) { - if ((offset == 0xff) || - (memcmp(n, o, 3 * sizeof(uint8_t)))) { - *p++ = offset; - change = (uint16_t *)p; - *change = 0; - p += 2; - - for (i = 0; - (i < 16) && (o < (old_msg->ParameterData + len)); - i++, n += 3, o += 3) { - if (memcmp(n, o, 3 * sizeof(uint8_t))) { - *change |= BIT(i); - memcpy(p, n, 3); - p += 3; - trim = p; - } - } - - offset = 0; - *change = cpu_to_be16(*change); - } else { - n += 3; - o += 3; - offset++; - } - } - - if (trim == partial) { - pr_debug("No Change in message - discarding %d bytes\n", len); - len = 0; - - } else if (trim < (partial + len - 3)) { - pr_debug("Using partial update: %d -> %d bytes\n", len, (int)(trim - partial + 3)); - - /* Add the termination marker */ - memset(trim, 0x00, 3); - trim += 3; - - /* Signal This will be a partial update */ - cmdid[2] |= BIT(6); - buf = (char *)partial; - len = (int)(trim - partial); - } else { - pr_debug("Partial too big - use regular update\n"); - } - } - - if (use_partial_coeff) { - err = dsp_partial_coefficients(tfa, old_msg->ParameterData, new_msg->ParameterData); - } else if (len) { - uint8_t *buffer; - - if (tfa->verbose) - pr_debug("Command-ID used: 0x%02x%02x%02x\n", cmdid[0], cmdid[1], cmdid[2]); - - buffer = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - if (buffer == NULL) { - err = Tfa98xx_Error_Fail; - } else { - memcpy(&buffer[0], cmdid, 3); - memcpy(&buffer[3], buf, len); - err = dsp_msg(tfa, 3 + len, (char *)buffer); - kmem_cache_free(tfa->cachep, buffer); - } - } - - if (partial) - kmem_cache_free(tfa->cachep, partial); - - return err; -} - -static enum Tfa98xx_Error tfaContWriteVstepMax2(struct tfa_device *tfa, TfaVolumeStepMax2File_t *vp, int vstep_idx, int vstep_msg_idx) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - struct TfaVolumeStepRegisterInfo *regInfo = NULL; - struct TfaVolumeStepMessageInfo *msgInfo = NULL, *p_msgInfo = NULL; - TfaBitfield_t bitF; - int i, nrMessages, enp = tfa->partial_enable; - - if (vstep_idx >= vp->NrOfVsteps) { - pr_debug("Volumestep %d is not available\n", vstep_idx); - return Tfa98xx_Error_Bad_Parameter; - } - - if (tfa->p_regInfo == NULL) { - if (tfa->verbose) - pr_debug("Inital vstep write\n"); - enp = 0; - } - - regInfo = tfaContGetRegForVstep(vp, vstep_idx); - - msgInfo = tfaContGetmsgInfoFromReg(regInfo); - nrMessages = msgInfo->NrOfMessages; - - if (enp) { - p_msgInfo = tfaContGetmsgInfoFromReg(tfa->p_regInfo); - if (nrMessages != p_msgInfo->NrOfMessages) { - pr_debug("Message different - Disable partial update\n"); - enp = 0; - } - } - - for (i = 0; i < nrMessages; i++) { - /* Messagetype(3) is Smartstudio Info! Dont send this! */ - if (msgInfo->MessageType == 3) { - /* MessageLength is in bytes */ - msgInfo = tfaContGetNextmsgInfo(msgInfo); - if (enp) - p_msgInfo = tfaContGetNextmsgInfo(p_msgInfo); - continue; - } - - /* If no vstepMsgIndex is passed on, all message needs to be send */ - if ((vstep_msg_idx >= TFA_MAX_VSTEP_MSG_MARKER) || (vstep_msg_idx == i)) { - err = tfaContWriteVstepMax2_One(tfa, msgInfo, p_msgInfo, enp); - if (err != Tfa98xx_Error_Ok) { - /* - * Force a full update for the next write - * As the current status of the DSP is unknown - */ - tfa->p_regInfo = NULL; - return err; - } - } - - msgInfo = tfaContGetNextmsgInfo(msgInfo); - if (enp) - p_msgInfo = tfaContGetNextmsgInfo(p_msgInfo); - } - - tfa->p_regInfo = regInfo; - - for (i = 0; i < regInfo->NrOfRegisters * 2; i++) { - /* Byte swap the datasheetname */ - bitF.field = (uint16_t)(regInfo->registerInfo[i] >> 8) | (regInfo->registerInfo[i] << 8); - i++; - bitF.value = (uint16_t)regInfo->registerInfo[i] >> 8; - err = tfaRunWriteBitfield(tfa, bitF); - if (err != Tfa98xx_Error_Ok) - return err; - } - - /* Save the current vstep */ - tfa_dev_set_swvstep(tfa, (unsigned short)vstep_idx); - - return err; -} - -/* - * Write DRC message to the dsp - * If needed modify the cmd-id - */ - -enum Tfa98xx_Error tfaContWriteDrcFile(struct tfa_device *tfa, int size, uint8_t data[]) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - uint8_t *msg = NULL; - - msg = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - if (msg == NULL) - return Tfa98xx_Error_Fail; - memcpy(msg, data, size); - - if (TFA_GET_BF(tfa, SBSL) == 0) { - /* Only do this when not set already */ - if (msg[2] != SB_PARAM_SET_MBDRC) { - msg[2] = SB_PARAM_SET_MBDRC; - - if (tfa->verbose) { - pr_debug("P-ID for SetMBDrc modified!: "); - pr_debug("Command-ID used: 0x%02x%02x%02x\n", - msg[0], msg[1], msg[2]); - } - } - } - - /* Send cmdId + payload to dsp */ - err = dsp_msg(tfa, size, (const char *)msg); - - kmem_cache_free(tfa->cachep, msg); - - return err; -} - - -/* - * write a parameter file to the device - * The VstepIndex and VstepMsgIndex are only used to write a specific msg from the vstep file. - */ -enum Tfa98xx_Error tfaContWriteFile(struct tfa_device *tfa, TfaFileDsc_t *file, int vstep_idx, int vstep_msg_idx) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaHeader_t *hdr = (TfaHeader_t *)file->data; - TfaHeaderType_t type; - int size, i; - char subVerString[8] = { 0 }; - int subversion = 0; - - if (tfa->verbose) { - tfaContShowHeader(hdr); - } - - type = (TfaHeaderType_t)hdr->id; - if ((type == msgHdr) || ((type == volstepHdr) && (tfa->tfa_family == 2))) - { - subVerString[0] = hdr->subversion[0]; - subVerString[1] = hdr->subversion[1]; - subVerString[2] = '\0'; - - sscanf(subVerString, "%d", &subversion); - - if ((subversion > 0) && - (((hdr->customer[0]) == 'A') && ((hdr->customer[1]) == 'P') && - ((hdr->customer[2]) == 'I') && ((hdr->customer[3]) == 'V'))) - { - if (tfa->is_probus_device) - { - /* Temporary workaround (example: For climax --calibrate scenario for probus devices) */ - err = tfaGetFwApiVersion(tfa, (unsigned char *)&tfa->fw_itf_ver[0]); - if (err) { - pr_debug("[%s] cannot get FWAPI error = %d\n", __func__, err); - return err; - } - for (i = 0; i < 3; i++) - { - if (tfa->fw_itf_ver[i] != hdr->customer[i + 4]) //+4 to skip "?PIV" string part in the .msg file. - { - ERRORMSG("Error: tfaContWriteFile: Expected FW API version = %d.%d.%d, Msg File version: %d.%d.%d\n", - tfa->fw_itf_ver[0], - tfa->fw_itf_ver[1], - tfa->fw_itf_ver[2], - hdr->customer[4], - hdr->customer[5], - hdr->customer[6]); - return Tfa98xx_Error_Bad_Parameter; - } - } - } else if ((tfa->fw_itf_ver[2] != hdr->customer[4]) || (tfa->fw_itf_ver[1] != hdr->customer[5]) || ((tfa->fw_itf_ver[0] >> 6) & 0x03) != hdr->customer[6]) - { - - ERRORMSG("Error: tfaContWriteFile: Expected FW API version = %d.%d.%d, Msg File version: %d.%d.%d\n", - (tfa->fw_itf_ver[2]) & 0xff, - (tfa->fw_itf_ver[1]) & 0xff, - (tfa->fw_itf_ver[0] >> 6) & 0x03, - hdr->customer[4], - hdr->customer[5], - hdr->customer[6]); - return Tfa98xx_Error_Bad_Parameter; - } - } - } - - switch (type) { - case msgHdr: /* generic DSP message */ - size = hdr->size - sizeof(TfaMsgFile_t); - err = dsp_msg(tfa, size, (const char *)((TfaMsgFile_t *)hdr)->data); - break; - case volstepHdr: - if (tfa->tfa_family == 2) { - err = tfaContWriteVstepMax2(tfa, (TfaVolumeStepMax2File_t *)hdr, vstep_idx, vstep_msg_idx); - } else { - err = tfaContWriteVstep(tfa, (TfaVolumeStep2File_t *)hdr, vstep_idx); - } - break; - case speakerHdr: - if (tfa->tfa_family == 2) { - /* Remove header and xml_id */ - size = hdr->size - sizeof(struct TfaSpkHeader) - sizeof(struct TfaFWVer); - - err = dsp_msg(tfa, size, - (const char *)(((TfaSpeakerFile_t *)hdr)->data + (sizeof(struct TfaFWVer)))); - } else { - size = hdr->size - sizeof(TfaSpeakerFile_t); - err = tfa98xx_dsp_write_speaker_parameters(tfa, size, - (const unsigned char *)((TfaSpeakerFile_t *)hdr)->data); - } - break; - case presetHdr: - size = hdr->size - sizeof(TfaPreset_t); - err = tfa98xx_dsp_write_preset(tfa, size, (const unsigned char *)((TfaPreset_t *)hdr)->data); - break; - case equalizerHdr: - err = tfa_cont_write_filterbank(tfa, ((TfaEqualizerFile_t *)hdr)->filter); - break; - case patchHdr: - size = hdr->size - sizeof(TfaPatch_t); // size is total length - err = tfa_dsp_patch(tfa, size, (const unsigned char *)((TfaPatch_t *)hdr)->data); - break; - case configHdr: - size = hdr->size - sizeof(TfaConfig_t); - err = tfa98xx_dsp_write_config(tfa, size, (const unsigned char *)((TfaConfig_t *)hdr)->data); - break; - case drcHdr: - if (hdr->version[0] == TFA_DR3_VERSION) { - /* Size is total size - hdrsize(36) - xmlversion(3) */ - size = hdr->size - sizeof(TfaDrc2_t); - err = tfaContWriteDrcFile(tfa, size, ((TfaDrc2_t *)hdr)->data); - } else { - /* - * The DRC file is split as: - * 36 bytes for generic header (customer, application, and type) - * 127x3 (381) bytes first block contains the device and sample rate - * independent settings - * 127x3 (381) bytes block the device and sample rate specific values. - * The second block can always be recalculated from the first block, - * if vlsCal and the sample rate are known. - */ - //size = hdr->size - sizeof(TfaDrc_t); - size = 381; /* fixed size for first block */ - - //+381 is done to only send the second part of the drc block - err = tfa98xx_dsp_write_drc(tfa, size, ((const unsigned char *)((TfaDrc_t *)hdr)->data + 381)); - } - break; - case infoHdr: - /* Ignore */ - break; - default: - pr_err("Header is of unknown type: 0x%x\n", type); - return Tfa98xx_Error_Bad_Parameter; - } - - return err; -} - -/** - * get the 1st of this dsc type this devicelist - */ -static TfaDescPtr_t *tfa_cnt_get_dsc(TfaContainer_t *cnt, TfaDescriptorType_t type, int dev_idx) -{ - TfaDeviceList_t *dev = tfaContDevice(cnt, dev_idx); - TfaDescPtr_t *_this; - int i; - - if (!dev) { - return NULL; - } - /* process the list until a the type is encountered */ - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == (uint32_t)type) { - _this = (TfaDescPtr_t *)(dev->list[i].offset + (uint8_t *)cnt); - return _this; - } - - } - - return NULL; -} - -/** - * get the device type from the patch in this devicelist - * - find the patch file for this devidx - * - return the devid from the patch or 0 if not found - */ -int tfa_cnt_get_devid(TfaContainer_t *cnt, int dev_idx) -{ - TfaPatch_t *patchfile; - TfaDescPtr_t *patchdsc; - uint8_t *patchheader; - unsigned short devid, checkaddress; - int checkvalue; - - patchdsc = tfa_cnt_get_dsc(cnt, dscPatch, dev_idx); - if (!patchdsc) /* no patch for this device, assume non-i2c */ - return 0; - patchdsc += 2; /* first the filename dsc and filesize, so skip them */ - patchfile = (TfaPatch_t *)patchdsc; - - patchheader = patchfile->data; - - checkaddress = (patchheader[1] << 8) + patchheader[2]; - checkvalue = - (patchheader[3] << 16) + (patchheader[4] << 8) + patchheader[5]; - - devid = patchheader[0]; - - if (checkaddress == 0xFFFF && checkvalue != 0xFFFFFF && checkvalue != 0) { - devid = patchheader[5] << 8 | patchheader[0]; /* full revid */ - } - - return devid; -} - -/** - * get the firmware version from the patch in this devicelist - */ -int tfa_cnt_get_patch_version(struct tfa_device *tfa) -{ - TfaPatch_t *patchfile; - TfaDescPtr_t *patchdsc; - uint8_t *data; - int size, version; - - if (tfa->cnt == NULL) - return -1; - - patchdsc = tfa_cnt_get_dsc(tfa->cnt, dscPatch, tfa->dev_idx); - patchdsc += 2; /* first the filename dsc and filesize, so skip them */ - patchfile = (TfaPatch_t *)patchdsc; - - size = patchfile->hdr.size - sizeof(TfaPatch_t); - data = patchfile->data; - - version = (data[size - 3] << 16) + (data[size - 2] << 8) + data[size - 1]; - - return version; -} - - -/* - * get the slave for the device if it exists - */ -enum Tfa98xx_Error tfaContGetSlave(struct tfa_device *tfa, uint8_t *slave_addr) -{ - TfaDeviceList_t *dev = NULL; - - /* Make sure the cnt file is loaded */ - if (tfa->cnt != NULL) { - dev = tfaContDevice(tfa->cnt, tfa->dev_idx); - } - - if (dev == NULL) { - /* Check if slave argument is used! */ - if (gslave_address == 0) { - return Tfa98xx_Error_Bad_Parameter; - } else { - *slave_addr = gslave_address; - return Tfa98xx_Error_Ok; - } - } - - *slave_addr = dev->dev; - return Tfa98xx_Error_Ok; -} - -/* If no container file is given, we can always have used the slave argument */ -void tfaContSetSlave(uint8_t slave_addr) -{ - gslave_address = slave_addr; -} - -/* - * lookup slave and return device index - */ -int tfa_cont_get_idx(struct tfa_device *tfa) -{ - TfaDeviceList_t *dev = NULL; - int i; - - for (i = 0; i < tfa->cnt->ndev; i++) { - dev = tfaContDevice(tfa->cnt, i); - if (dev->dev == tfa->slave_address) - break; - - } - if (i == tfa->cnt->ndev) - return -1; - - return i; -} - -/* - * write a bit field - */ -enum Tfa98xx_Error tfaRunWriteBitfield(struct tfa_device *tfa, TfaBitfield_t bf) -{ - enum Tfa98xx_Error error; - uint16_t value; - union { - uint16_t field; - TfaBfEnum_t Enum; - } bfUni; - - value = bf.value; - bfUni.field = bf.field; -#ifdef TFA_DEBUG - if (tfa->verbose) - pr_debug("bitfield: %s=0x%x (0x%x[%d..%d]=0x%x)\n", tfaContBfName(bfUni.field, tfa->rev), value, - bfUni.Enum.address, bfUni.Enum.pos, bfUni.Enum.pos + bfUni.Enum.len, value); -#endif - error = tfa_set_bf(tfa, bfUni.field, value); - - return error; -} - -/* - * read a bit field - */ -enum Tfa98xx_Error tfaRunReadBitfield(struct tfa_device *tfa, TfaBitfield_t *bf) -{ - enum Tfa98xx_Error error; - union { - uint16_t field; - TfaBfEnum_t Enum; - } bfUni; - uint16_t regvalue, msk; - - bfUni.field = bf->field; - - error = reg_read(tfa, (unsigned char)(bfUni.Enum.address), ®value); - if (error) return error; - - msk = ((1 << (bfUni.Enum.len + 1)) - 1) << bfUni.Enum.pos; - - regvalue &= msk; - bf->value = regvalue >> bfUni.Enum.pos; - - return error; -} - -/* - dsp mem direct write - */ -static enum Tfa98xx_Error tfaRunWriteDspMem(struct tfa_device *tfa, TfaDspMem_t *cfmem) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int i; - - for (i = 0; i < cfmem->size; i++) { - if (tfa->verbose) - pr_debug("dsp mem (%d): 0x%02x=0x%04x\n", cfmem->type, cfmem->address, cfmem->words[i]); - - error = mem_write(tfa, cfmem->address++, cfmem->words[i], cfmem->type); - if (error) return error; - } - - return error; -} - -/* - * write filter payload to DSP - * note that the data is in an aligned union for all filter variants - * the aa data is used but it's the same for all of them - */ -static enum Tfa98xx_Error tfaRunWriteFilter(struct tfa_device *tfa, TfaContBiquad_t *bq) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - enum Tfa98xx_DMEM dmem; - uint16_t address; - uint8_t data[3 * 3 + sizeof(bq->aa.bytes)]; - int i, channel = 0, runs = 1; - int8_t saved_index = bq->aa.index; /* This is used to set back the index */ - - /* Channel=1 is primary, Channel=2 is secondary*/ - if (bq->aa.index > 100) { - bq->aa.index -= 100; - channel = 2; - } else if (bq->aa.index > 50) { - bq->aa.index -= 50; - channel = 1; - } else if ((tfa->rev & 0xff) == 0x88) { - runs = 2; - } - - if (tfa->verbose) { - if (channel == 2) - pr_debug("filter[%d,S]", bq->aa.index); - else if (channel == 1) - pr_debug("filter[%d,P]", bq->aa.index); - else - pr_debug("filter[%d]", bq->aa.index); - } - - for (i = 0; i < runs; i++) { - if (runs == 2) - channel++; - - /* get the target address for the filter on this device */ - dmem = tfa98xx_filter_mem(tfa, bq->aa.index, &address, channel); - if (dmem == Tfa98xx_DMEM_ERR) { - if (tfa->verbose) { - pr_debug("Warning: XFilter settings are applied via msg file (ini filter[x] format is skipped).\n"); - } - /* Dont exit with an error here, We could continue without problems */ - return Tfa98xx_Error_Ok; - } - - /* send a DSP memory message that targets the devices specific memory for the filter - * msg params: which_mem, start_offset, num_words - */ - memset(data, 0, 3 * 3); - data[2] = dmem; /* output[0] = which_mem */ - data[4] = address >> 8; /* output[1] = start_offset */ - data[5] = address & 0xff; - data[8] = sizeof(bq->aa.bytes) / 3; /*output[2] = num_words */ - memcpy(&data[9], bq->aa.bytes, sizeof(bq->aa.bytes)); /* payload */ - - if (tfa->tfa_family == 2) { - error = tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, FW_PAR_ID_SET_MEMORY, sizeof(data), data); - } else { - error = tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, 4 /* param */, sizeof(data), data); - } - } - -#ifdef TFA_DEBUG - if (tfa->verbose) { - if (bq->aa.index == 13) { - pr_debug("=%d,%.0f,%.2f\n", - bq->in.type, bq->in.cutOffFreq, bq->in.leakage); - } else if (bq->aa.index >= 10 && bq->aa.index <= 12) { - pr_debug("=%d,%.0f,%.1f,%.1f\n", bq->aa.type, - bq->aa.cutOffFreq, bq->aa.rippleDb, bq->aa.rolloff); - } else { - pr_debug("= unsupported filter index\n"); - } - } -#endif - - /* Because we can load the same filters multiple times - * For example: When we switch profile we re-write in operating mode. - * We then need to remember the index (primary, secondary or both) - */ - bq->aa.index = saved_index; - - return error; -} - -/* - * write the register based on the input address, value and mask - * only the part that is masked will be updated - */ -static enum Tfa98xx_Error tfaRunWriteRegister(struct tfa_device *tfa, TfaRegpatch_t *reg) -{ - enum Tfa98xx_Error error; - uint16_t value, newvalue; - - if (tfa->verbose) - pr_debug("register: 0x%02x=0x%04x (msk=0x%04x)\n", reg->address, reg->value, reg->mask); - - error = reg_read(tfa, reg->address, &value); - if (error) return error; - - value &= ~reg->mask; - newvalue = reg->value & reg->mask; - - value |= newvalue; - error = reg_write(tfa, reg->address, value); - - return error; - -} - -// write reg and bitfield items in the devicelist to the target -enum Tfa98xx_Error tfaContWriteRegsDev(struct tfa_device *tfa) -{ - TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); - TfaBitfield_t *bitF; - int i; - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - if (!dev) { - return Tfa98xx_Error_Bad_Parameter; - } - - /* process the list until a patch, file of profile is encountered */ - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == dscPatch || - dev->list[i].type == dscFile || - dev->list[i].type == dscProfile) break; - - if (dev->list[i].type == dscBitfield) { - bitF = (TfaBitfield_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); - err = tfaRunWriteBitfield(tfa, *bitF); - } - if (dev->list[i].type == dscRegister) { - err = tfaRunWriteRegister(tfa, (TfaRegpatch_t *)(dev->list[i].offset + (char *)tfa->cnt)); - } - - if (err) break; - } - - return err; -} - -// write reg and bitfield items in the profilelist the target -enum Tfa98xx_Error tfaContWriteRegsProf(struct tfa_device *tfa, int prof_idx) -{ - TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - TfaBitfield_t *bitf; - unsigned int i; - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - if (!prof) { - return Tfa98xx_Error_Bad_Parameter; - } - - if (tfa->verbose) - pr_debug("----- profile: %s (%d) -----\n", tfaContGetString(tfa->cnt, &prof->name), prof_idx); - - /* process the list until the end of the profile or the default section */ - for (i = 0; i < prof->length; i++) { - /* We only want to write the values before the default section when we switch profile */ - if (prof->list[i].type == dscDefault) - break; - - if (prof->list[i].type == dscBitfield) { - bitf = (TfaBitfield_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - err = tfaRunWriteBitfield(tfa, *bitf); - } - if (prof->list[i].type == dscRegister) { - err = tfaRunWriteRegister(tfa, (TfaRegpatch_t *)(prof->list[i].offset + (char *)tfa->cnt)); - } - if (err) break; - } - return err; -} - -// write patchfile in the devicelist to the target -enum Tfa98xx_Error tfaContWritePatch(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); - TfaFileDsc_t *file; - TfaPatch_t *patchfile; - int size, i; - - if (!dev) { - return Tfa98xx_Error_Bad_Parameter; - } - /* process the list until a patch is encountered */ - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == dscPatch) { - file = (TfaFileDsc_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); - patchfile = (TfaPatch_t *)&file->data; - if (tfa->verbose) tfaContShowHeader(&patchfile->hdr); - size = patchfile->hdr.size - sizeof(TfaPatch_t); // size is total length - err = tfa_dsp_patch(tfa, size, (const unsigned char *)patchfile->data); - if (err) return err; - } - } - - return Tfa98xx_Error_Ok; -} - -/** - * Create a buffer which can be used to send to the dsp. - */ -static void create_dsp_buffer_msg(struct tfa_device *tfa, TfaMsg_t *msg, char *buffer, int *size) -{ - int i, nr = 0; - - (void)tfa; - - /* Copy cmdId. Remember that the cmdId is reversed */ - buffer[nr++] = msg->cmdId[2]; - buffer[nr++] = msg->cmdId[1]; - buffer[nr++] = msg->cmdId[0]; - - /* Copy the data to the buffer */ - for (i = 0; i < msg->msg_size; i++) { - buffer[nr++] = (uint8_t)((msg->data[i] >> 16) & 0xffff); - buffer[nr++] = (uint8_t)((msg->data[i] >> 8) & 0xff); - buffer[nr++] = (uint8_t)(msg->data[i] & 0xff); - } - - *size = nr; -} - -// write all param files in the devicelist to the target -enum Tfa98xx_Error tfaContWriteFiles(struct tfa_device *tfa) -{ - TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); - TfaFileDsc_t *file; - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - char buffer[(MEMTRACK_MAX_WORDS * 3) + 3] = { 0 }; //every word requires 3 and 3 is the msg - int i, size = 0; - - if (!dev) { - return Tfa98xx_Error_Bad_Parameter; - } - /* process the list and write all files */ - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == dscFile) { - file = (TfaFileDsc_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); - if (tfaContWriteFile(tfa, file, 0, TFA_MAX_VSTEP_MSG_MARKER)) { - return Tfa98xx_Error_Bad_Parameter; - } - } - - if (dev->list[i].type == dscSetInputSelect || - dev->list[i].type == dscSetOutputSelect || - dev->list[i].type == dscSetProgramConfig || - dev->list[i].type == dscSetLagW || - dev->list[i].type == dscSetGains || - dev->list[i].type == dscSetvBatFactors || - dev->list[i].type == dscSetSensesCal || - dev->list[i].type == dscSetSensesDelay || - dev->list[i].type == dscSetMBDrc || - dev->list[i].type == dscSetFwkUseCase || - dev->list[i].type == dscSetVddpConfig) { - create_dsp_buffer_msg(tfa, (TfaMsg_t *) - (dev->list[i].offset + (char *)tfa->cnt), buffer, &size); - if (tfa->verbose) { - pr_debug("command: %s=0x%02x%02x%02x\n", - tfaContGetCommandString(dev->list[i].type), - (unsigned char)buffer[0], (unsigned char)buffer[1], (unsigned char)buffer[2]); - } - - err = dsp_msg(tfa, size, buffer); - } - - if (dev->list[i].type == dscCmd) { - size = *(uint16_t *)(dev->list[i].offset + (char *)tfa->cnt); - - err = dsp_msg(tfa, size, dev->list[i].offset + 2 + (char *)tfa->cnt); - if (tfa->verbose) { - const char *cmd_id = dev->list[i].offset + 2 + (char *)tfa->cnt; - - pr_debug("Writing cmd=0x%02x%02x%02x\n", (uint8_t)cmd_id[0], (uint8_t)cmd_id[1], (uint8_t)cmd_id[2]); - } - } - if (err != Tfa98xx_Error_Ok) - break; - - if (dev->list[i].type == dscCfMem) { - err = tfaRunWriteDspMem(tfa, (TfaDspMem_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt)); - } - - if (err != Tfa98xx_Error_Ok) - break; - } - - return err; -} - -/* - * write all param files in the profilelist to the target - * this is used during startup when maybe ACS is set - */ -enum Tfa98xx_Error tfaContWriteFilesProf(struct tfa_device *tfa, int prof_idx, int vstep_idx) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - char buffer[(MEMTRACK_MAX_WORDS * 3) + 3] = { 0 }; //every word requires 3 and 3 is the msg - unsigned int i; - TfaFileDsc_t *file; - TfaPatch_t *patchfile; - int size; - - if (!prof) { - return Tfa98xx_Error_Bad_Parameter; - } - - /* process the list and write all files */ - for (i = 0; i < prof->length; i++) { - switch (prof->list[i].type) { - case dscFile: - file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - err = tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER); - break; - case dscPatch: - file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - patchfile = (TfaPatch_t *)&file->data; - if (tfa->verbose) tfaContShowHeader(&patchfile->hdr); - size = patchfile->hdr.size - sizeof(TfaPatch_t); // size is total length - err = tfa_dsp_patch(tfa, size, (const unsigned char *)patchfile->data); - break; - case dscCfMem: - err = tfaRunWriteDspMem(tfa, (TfaDspMem_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt)); - break; - case dscSetInputSelect: - case dscSetOutputSelect: - case dscSetProgramConfig: - case dscSetLagW: - case dscSetGains: - case dscSetvBatFactors: - case dscSetSensesCal: - case dscSetSensesDelay: - case dscSetMBDrc: - case dscSetFwkUseCase: - case dscSetVddpConfig: - create_dsp_buffer_msg(tfa, (TfaMsg_t *) - (prof->list[i].offset + (uint8_t *)tfa->cnt), buffer, &size); - if (tfa->verbose) { - pr_debug("command: %s=0x%02x%02x%02x\n", - tfaContGetCommandString(prof->list[i].type), - (unsigned char)buffer[0], (unsigned char)buffer[1], (unsigned char)buffer[2]); - } - - err = dsp_msg(tfa, size, buffer); - break; - case dscCmd: - size = *(uint16_t *)(prof->list[i].offset + (char *)tfa->cnt); - - err = dsp_msg(tfa, size, prof->list[i].offset + 2 + (char *)tfa->cnt); - if (tfa->verbose) { - const char *cmd_id = prof->list[i].offset + 2 + (char *)tfa->cnt; - - pr_debug("Writing cmd=0x%02x%02x%02x\n", (uint8_t)cmd_id[0], (uint8_t)cmd_id[1], (uint8_t)cmd_id[2]); - } - break; - default: - /* ignore any other type */ - break; - } - } - - return err; -} - -static enum Tfa98xx_Error tfaContWriteItem(struct tfa_device *tfa, TfaDescPtr_t *dsc) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaRegpatch_t *reg; - TfaMode_t *cas; - TfaBitfield_t *bitf; - - // When no DSP should only write to HW registers. - if (tfa->ext_dsp == 0 && !(dsc->type == dscBitfield || dsc->type == dscRegister)) { - return Tfa98xx_Error_Ok; - } - - switch (dsc->type) { - case dscDefault: - case dscDevice: // ignore - case dscProfile: // profile list - break; - case dscRegister: // register patch - reg = (TfaRegpatch_t *)(dsc->offset + (uint8_t *)tfa->cnt); - return tfaRunWriteRegister(tfa, reg); - //pr_debug("$0x%2x=0x%02x,0x%02x\n", reg->address, reg->mask, reg->value); - break; - case dscString: // ascii: zero terminated string - pr_debug(";string: %s\n", tfaContGetString(tfa->cnt, dsc)); - break; - case dscFile: // filename + file contents - case dscPatch: - break; - case dscMode: - cas = (TfaMode_t *)(dsc->offset + (uint8_t *)tfa->cnt); - if (cas->value == Tfa98xx_Mode_RCV) - tfa98xx_select_mode(tfa, Tfa98xx_Mode_RCV); - else - tfa98xx_select_mode(tfa, Tfa98xx_Mode_Normal); - break; - case dscCfMem: - err = tfaRunWriteDspMem(tfa, (TfaDspMem_t *)(dsc->offset + (uint8_t *)tfa->cnt)); - break; - case dscBitfield: - bitf = (TfaBitfield_t *)(dsc->offset + (uint8_t *)tfa->cnt); - return tfaRunWriteBitfield(tfa, *bitf); - break; - case dscFilter: - return tfaRunWriteFilter(tfa, (TfaContBiquad_t *)(dsc->offset + (uint8_t *)tfa->cnt)); - break; - } - - return err; -} - -static unsigned int tfa98xx_sr_from_field(unsigned int field) -{ - switch (field) { - case 0: - return 8000; - case 1: - return 11025; - case 2: - return 12000; - case 3: - return 16000; - case 4: - return 22050; - case 5: - return 24000; - case 6: - return 32000; - case 7: - return 44100; - case 8: - return 48000; - default: - return 0; - } -} - -enum Tfa98xx_Error tfa_write_filters(struct tfa_device *tfa, int prof_idx) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - unsigned int i; - int status; - - if (!prof) { - return Tfa98xx_Error_Bad_Parameter; - } - - if (tfa->verbose) { - pr_debug("----- profile: %s (%d) -----\n", tfaContGetString(tfa->cnt, &prof->name), prof_idx); - pr_debug("Waiting for CLKS...\n"); - } - - for (i = 10; i > 0; i--) { - err = tfa98xx_dsp_system_stable(tfa, &status); - if (status) - break; - else - msleep_interruptible(10); - } - - if (i == 0) { - if (tfa->verbose) - pr_err("Unable to write filters, CLKS=0\n"); - - return Tfa98xx_Error_StateTimedOut; - } - - /* process the list until the end of the profile or the default section */ - for (i = 0; i < prof->length; i++) { - if (prof->list[i].type == dscFilter) { - if (tfaContWriteItem(tfa, &prof->list[i]) != Tfa98xx_Error_Ok) - return Tfa98xx_Error_Bad_Parameter; - } - } - - return err; -} - -unsigned int tfa98xx_get_profile_sr(struct tfa_device *tfa, unsigned int prof_idx) -{ - TfaBitfield_t *bitf; - unsigned int i; - TfaDeviceList_t *dev; - TfaProfileList_t *prof; - int fs_profile = -1; - - dev = tfaContDevice(tfa->cnt, tfa->dev_idx); - if (!dev) - return 0; - - prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - if (!prof) - return 0; - - /* Check profile fields first */ - for (i = 0; i < prof->length; i++) { - if (prof->list[i].type == dscDefault) - break; - - /* check for profile settingd (AUDFS) */ - if (prof->list[i].type == dscBitfield) { - bitf = (TfaBitfield_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - if (bitf->field == TFA_FAM(tfa, AUDFS)) { - fs_profile = bitf->value; - break; - } - } - } - - if (tfa->verbose) - pr_debug("%s - profile fs: 0x%x = %dHz (%d - %d)\n", - __func__, fs_profile, - tfa98xx_sr_from_field(fs_profile), - tfa->dev_idx, prof_idx); - - if (fs_profile != -1) - return tfa98xx_sr_from_field(fs_profile); - - /* Check for container default setting */ - /* process the list until a patch, file of profile is encountered */ - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == dscPatch || - dev->list[i].type == dscFile || - dev->list[i].type == dscProfile) - break; - - if (dev->list[i].type == dscBitfield) { - bitf = (TfaBitfield_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); - if (bitf->field == TFA_FAM(tfa, AUDFS)) { - fs_profile = bitf->value; - break; - } - } - /* Ignore register case */ - } - - if (tfa->verbose) - pr_debug("%s - default fs: 0x%x = %dHz (%d - %d)\n", - __func__, fs_profile, - tfa98xx_sr_from_field(fs_profile), - tfa->dev_idx, prof_idx); - - if (fs_profile != -1) - return tfa98xx_sr_from_field(fs_profile); - - return 48000; /* default of HW */ -} - -static enum Tfa98xx_Error get_sample_rate_info(struct tfa_device *tfa, TfaProfileList_t *prof, TfaProfileList_t *previous_prof, int fs_previous_profile) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaBitfield_t *bitf; - unsigned int i; - int fs_default_profile = 8; /* default is 48kHz */ - int fs_next_profile = 8; /* default is 48kHz */ - - - /* ---------- default settings previous profile ---------- */ - for (i = 0; i < previous_prof->length; i++) { - /* Search for the default section */ - if (i == 0) { - while (previous_prof->list[i].type != dscDefault && i < previous_prof->length) { - i++; - } - i++; - } - - /* Only if we found the default section search for AUDFS */ - if (i < previous_prof->length) { - if (previous_prof->list[i].type == dscBitfield) { - bitf = (TfaBitfield_t *)(previous_prof->list[i].offset + (uint8_t *)tfa->cnt); - if (bitf->field == TFA_FAM(tfa, AUDFS)) { - fs_default_profile = bitf->value; - break; - } - } - } - } - - /* ---------- settings next profile ---------- */ - for (i = 0; i < prof->length; i++) { - /* We only want to write the values before the default section */ - if (prof->list[i].type == dscDefault) - break; - /* search for AUDFS */ - if (prof->list[i].type == dscBitfield) { - bitf = (TfaBitfield_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - if (bitf->field == TFA_FAM(tfa, AUDFS)) { - fs_next_profile = bitf->value; - break; - } - } - } - - /* Enable if needed for debugging! - if (tfa->verbose) { - pr_debug("sample rate from the previous profile: %d\n", fs_previous_profile); - pr_debug("sample rate in the default section: %d\n", fs_default_profile); - pr_debug("sample rate for the next profile: %d\n", fs_next_profile); - } - */ - - if (fs_next_profile != fs_default_profile) { - if (tfa->verbose) - pr_debug("Writing delay tables for AUDFS=%d\n", fs_next_profile); - - /* If the AUDFS from the next profile is not the same as - * the AUDFS from the default we need to write new delay tables - */ - err = tfa98xx_dsp_write_tables(tfa, fs_next_profile); - } else if (fs_default_profile != fs_previous_profile) { - if (tfa->verbose) - pr_debug("Writing delay tables for AUDFS=%d\n", fs_default_profile); - - /* But if we do not have a new AUDFS in the next profile and - * the AUDFS from the default profile is not the same as the AUDFS - * from the previous profile we also need to write new delay tables - */ - err = tfa98xx_dsp_write_tables(tfa, fs_default_profile); - } - - return err; -} - -/* - * process all items in the profilelist - * NOTE an error return during processing will leave the device muted - * - */ -enum Tfa98xx_Error tfaContWriteProfile(struct tfa_device *tfa, int prof_idx, int vstep_idx) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - TfaProfileList_t *previous_prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, tfa_dev_get_swprof(tfa)); - char buffer[(MEMTRACK_MAX_WORDS * 4) + 4] = { 0 }; //every word requires 3 or 4 bytes, and 3 or 4 is the msg - unsigned int i, k = 0, j = 0, tries = 0; - TfaFileDsc_t *file; - int size = 0, ready, fs_previous_profile = 8; /* default fs is 48kHz*/ - - if (!prof || !previous_prof) { - pr_err("Error trying to get the (previous) swprofile\n"); - return Tfa98xx_Error_Bad_Parameter; - } - - if (tfa->verbose) { - tfa98xx_trace_printk("device:%s profile:%s vstep:%d\n", tfaContDeviceName(tfa->cnt, tfa->dev_idx), - tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx), vstep_idx); - } - - /* We only make a power cycle when the profiles are not in the same group */ - if (prof->group == previous_prof->group && prof->group != 0) { - if (tfa->verbose) { - pr_debug("The new profile (%s) is in the same group as the current profile (%s)\n", - tfaContGetString(tfa->cnt, &prof->name), tfaContGetString(tfa->cnt, &previous_prof->name)); - } - } else { - /* mute */ - err = tfaRunMute(tfa); - if (err) return err; - - /* Get current sample rate before we start switching */ - fs_previous_profile = TFA_GET_BF(tfa, AUDFS); - - /* clear SBSL to make sure we stay in initCF state */ - if (tfa->tfa_family == 2) { - TFA_SET_BF_VOLATILE(tfa, SBSL, 0); - } - - /* When we switch profile we first power down the subsystem - * This should only be done when we are in operating mode - */ - if (((tfa->tfa_family == 2) && (TFA_GET_BF(tfa, MANSTATE) >= 6)) || (tfa->tfa_family != 2)) { - err = tfa98xx_powerdown(tfa, 1); - if (err) return err; - - /* Wait until we are in PLL powerdown */ - do { - err = tfa98xx_dsp_system_stable(tfa, &ready); - if (!ready) - break; - else - msleep_interruptible(10); /* wait 10ms to avoid busload */ - tries++; - } while (tries <= 100); - - if (tries > 100) { - pr_debug("Wait for PLL powerdown timed out!\n"); - return Tfa98xx_Error_StateTimedOut; - } - } else { - pr_debug("No need to go to powerdown now\n"); - } - } - - /* set all bitfield settings */ - /* First set all default settings */ - if (tfa->verbose) { - pr_debug("---------- default settings profile: %s (%d) ----------\n", - tfaContGetString(tfa->cnt, &previous_prof->name), tfa_dev_get_swprof(tfa)); - } - - err = show_current_state(tfa); - - /* Loop profile length */ - for (i = 0; i < previous_prof->length; i++) { - /* Search for the default section */ - if (i == 0) { - while (previous_prof->list[i].type != dscDefault && i < previous_prof->length) { - i++; - } - i++; - } - - /* Only if we found the default section try writing the items */ - if (i < previous_prof->length) { - if (tfaContWriteItem(tfa, &previous_prof->list[i]) != Tfa98xx_Error_Ok) - return Tfa98xx_Error_Bad_Parameter; - } - } - - if (tfa->verbose) - pr_debug("---------- new settings profile: %s (%d) ----------\n", - tfaContGetString(tfa->cnt, &prof->name), prof_idx); - - /* set new settings */ - for (i = 0; i < prof->length; i++) { - /* Remember where we currently are with writing items*/ - j = i; - - /* We only want to write the values before the default section when we switch profile */ - /* process and write all non-file items */ - switch (prof->list[i].type) { - case dscFile: - case dscPatch: - case dscSetInputSelect: - case dscSetOutputSelect: - case dscSetProgramConfig: - case dscSetLagW: - case dscSetGains: - case dscSetvBatFactors: - case dscSetSensesCal: - case dscSetSensesDelay: - case dscSetMBDrc: - case dscSetFwkUseCase: - case dscSetVddpConfig: - case dscCmd: - case dscFilter: - case dscDefault: - /* When one of these files are found, we exit */ - i = prof->length; - break; - default: - err = tfaContWriteItem(tfa, &prof->list[i]); - if (err != Tfa98xx_Error_Ok) - return Tfa98xx_Error_Bad_Parameter; - break; - } - } - - if (prof->group != previous_prof->group || prof->group == 0) { - if (tfa->tfa_family == 2) - TFA_SET_BF_VOLATILE(tfa, MANSCONF, 1); - - /* Leave powerdown state */ - err = tfa_cf_powerup(tfa); - if (err) return err; - - err = show_current_state(tfa); - - if (tfa->tfa_family == 2) { - /* Reset SBSL to 0 (workaround of enbl_powerswitch=0) */ - TFA_SET_BF_VOLATILE(tfa, SBSL, 0); - /* Sending commands to DSP we need to make sure RST is 0 (otherwise we get no response)*/ - TFA_SET_BF(tfa, RST, 0); - } - } - - /* Check if there are sample rate changes */ - err = get_sample_rate_info(tfa, prof, previous_prof, fs_previous_profile); - if (err) return err; - - - /* Write files from previous profile (default section) - * Should only be used for the patch&trap patch (file) - */ - if (tfa->ext_dsp != 0) { - if (tfa->tfa_family == 2) { - for (i = 0; i < previous_prof->length; i++) { - /* Search for the default section */ - if (i == 0) { - while (previous_prof->list[i].type != dscDefault && i < previous_prof->length) { - i++; - } - i++; - } - - /* Only if we found the default section try writing the file */ - if (i < previous_prof->length) { - if (previous_prof->list[i].type == dscFile || previous_prof->list[i].type == dscPatch) { - /* Only write this once */ - if (tfa->verbose && k == 0) { - pr_debug("---------- files default profile: %s (%d) ----------\n", - tfaContGetString(tfa->cnt, &previous_prof->name), prof_idx); - k++; - } - file = (TfaFileDsc_t *)(previous_prof->list[i].offset + (uint8_t *)tfa->cnt); - err = tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER); - } - } - } - } - - if (tfa->verbose) { - pr_debug("---------- files new profile: %s (%d) ----------\n", - tfaContGetString(tfa->cnt, &prof->name), prof_idx); - } - } - - /* write everything until end or the default section starts - * Start where we currenly left */ - for (i = j; i < prof->length; i++) { - /* We only want to write the values before the default section when we switch profile */ - - if (prof->list[i].type == dscDefault) { - break; - } - - switch (prof->list[i].type) { - case dscFile: - case dscPatch: - /* For tiberius stereo 1 device does not have a dsp! */ - if (tfa->ext_dsp != 0) { - file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - err = tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER); - } - break; - case dscSetInputSelect: - case dscSetOutputSelect: - case dscSetProgramConfig: - case dscSetLagW: - case dscSetGains: - case dscSetvBatFactors: - case dscSetSensesCal: - case dscSetSensesDelay: - case dscSetMBDrc: - case dscSetFwkUseCase: - case dscSetVddpConfig: - /* For tiberius stereo 1 device does not have a dsp! */ - if (tfa->ext_dsp != 0) { - create_dsp_buffer_msg(tfa, (TfaMsg_t *) - (prof->list[i].offset + (char *)tfa->cnt), buffer, &size); - err = dsp_msg(tfa, size, buffer); - - if (tfa->verbose) { - pr_debug("command: %s=0x%02x%02x%02x\n", - tfaContGetCommandString(prof->list[i].type), - (unsigned char)buffer[0], (unsigned char)buffer[1], (unsigned char)buffer[2]); - } - } - break; - case dscCmd: - /* For tiberius stereo 1 device does not have a dsp! */ - if (tfa->ext_dsp != 0) { - size = *(uint16_t *)(prof->list[i].offset + (char *)tfa->cnt); - err = dsp_msg(tfa, size, prof->list[i].offset + 2 + (char *)tfa->cnt); - if (tfa->verbose) { - const char *cmd_id = prof->list[i].offset + 2 + (char *)tfa->cnt; - - pr_debug("Writing cmd=0x%02x%02x%02x\n", (uint8_t)cmd_id[0], (uint8_t)cmd_id[1], (uint8_t)cmd_id[2]); - } - } - break; - default: - /* This allows us to write bitfield, registers or xmem after files */ - if (tfaContWriteItem(tfa, &prof->list[i]) != Tfa98xx_Error_Ok) { - return Tfa98xx_Error_Bad_Parameter; - } - break; - } - - if (err != Tfa98xx_Error_Ok) { - return err; - } - } - - if ((prof->group != previous_prof->group || prof->group == 0) && (tfa->tfa_family == 2)) { - if (TFA_GET_BF(tfa, REFCKSEL) == 0) { - /* set SBSL to go to operation mode */ - TFA_SET_BF_VOLATILE(tfa, SBSL, 1); - } - } - - return err; -} - -/* - * process only vstep in the profilelist - * - */ -enum Tfa98xx_Error tfaContWriteFilesVstep(struct tfa_device *tfa, int prof_idx, int vstep_idx) -{ - TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - unsigned int i; - TfaFileDsc_t *file; - TfaHeader_t *hdr; - TfaHeaderType_t type; - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - if (!prof) - return Tfa98xx_Error_Bad_Parameter; - - if (tfa->verbose) - tfa98xx_trace_printk("device:%s profile:%s vstep:%d\n", tfaContDeviceName(tfa->cnt, tfa->dev_idx), - tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx), vstep_idx); - - /* write vstep file only! */ - for (i = 0; i < prof->length; i++) { - if (prof->list[i].type == dscFile) { - file = (TfaFileDsc_t *)(prof->list[i].offset + (uint8_t *)tfa->cnt); - hdr = (TfaHeader_t *)file->data; - type = (TfaHeaderType_t)hdr->id; - - switch (type) { - case volstepHdr: - if (tfaContWriteFile(tfa, file, vstep_idx, TFA_MAX_VSTEP_MSG_MARKER)) - return Tfa98xx_Error_Bad_Parameter; - break; - default: - break; - } - } - } - - return err; -} - -char *tfaContGetString(TfaContainer_t *cnt, TfaDescPtr_t *dsc) -{ - if (dsc->type != dscString) - return "Undefined string"; - - return dsc->offset + (char *)cnt; -} - -char *tfaContGetCommandString(uint32_t type) -{ - if (type == dscSetInputSelect) - return "SetInputSelector"; - else if (type == dscSetOutputSelect) - return "SetOutputSelector"; - else if (type == dscSetProgramConfig) - return "SetProgramConfig"; - else if (type == dscSetLagW) - return "SetLagW"; - else if (type == dscSetGains) - return "SetGains"; - else if (type == dscSetvBatFactors) - return "SetvBatFactors"; - else if (type == dscSetSensesCal) - return "SetSensesCal"; - else if (type == dscSetSensesDelay) - return "SetSensesDelay"; - else if (type == dscSetMBDrc) - return "SetMBDrc"; - else if (type == dscSetFwkUseCase) - return "SetFwkUseCase"; - else if (type == dscSetVddpConfig) - return "SetVddpConfig"; - else if (type == dscFilter) - return "filter"; - else - return "Undefined string"; -} - -/* - * Get the name of the device at a certain index in the container file - * return device name - */ -char *tfaContDeviceName(TfaContainer_t *cnt, int dev_idx) -{ - TfaDeviceList_t *dev; - - dev = tfaContDevice(cnt, dev_idx); - if (dev == NULL) - return "!ERROR!"; - - return tfaContGetString(cnt, &dev->name); -} - -/* - * Get the application name from the container file application field - * note that the input stringbuffer should be sizeof(application field)+1 - * - */ -int tfa_cnt_get_app_name(struct tfa_device *tfa, char *name) -{ - unsigned int i; - int len = 0; - - for (i = 0; i < sizeof(tfa->cnt->application); i++) { - if (isalnum(tfa->cnt->application[i])) /* copy char if valid */ - name[len++] = tfa->cnt->application[i]; - if (tfa->cnt->application[i] == '\0') - break; - } - name[len++] = '\0'; - - return len; -} - -/* - * Get profile index of the calibration profile. - * Returns: (profile index) if found, (-2) if no - * calibration profile is found or (-1) on error - */ -int tfaContGetCalProfile(struct tfa_device *tfa) -{ - int prof, cal_idx = -2; - - if ((tfa->dev_idx < 0) || (tfa->dev_idx >= tfa->cnt->ndev)) - return -1; - - /* search for the calibration profile in the list of profiles */ - for (prof = 0; prof < tfa->cnt->nprof; prof++) { - if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, prof), ".cal") != NULL) { - cal_idx = prof; - pr_debug("Using calibration profile: '%s'\n", tfaContProfileName(tfa->cnt, tfa->dev_idx, prof)); - break; - } - } - - return cal_idx; -} - -/** - * Is the profile a tap profile - */ -int tfaContIsTapProfile(struct tfa_device *tfa, int prof_idx) -{ - if ((tfa->dev_idx < 0) || (tfa->dev_idx >= tfa->cnt->ndev)) - return -1; - - /* Check if next profile is tap profile */ - if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx), ".tap") != NULL) { - pr_debug("Using Tap profile: '%s'\n", tfaContProfileName(tfa->cnt, tfa->dev_idx, prof_idx)); - return 1; - } - - return 0; -} - -/* - * Get the name of the profile at certain index for a device in the container file - * return profile name - */ -char *tfaContProfileName(TfaContainer_t *cnt, int dev_idx, int prof_idx) -{ - TfaProfileList_t *prof = NULL; - - /* the Nth profiles for this device */ - prof = tfaContGetDevProfList(cnt, dev_idx, prof_idx); - - /* If the index is out of bound */ - if (prof == NULL) - return "NONE"; - - return tfaContGetString(cnt, &prof->name); -} - -/* - * return 1st profile list - */ -TfaProfileList_t *tfaContGet1stProfList(TfaContainer_t *cont) -{ - TfaProfileList_t *prof; - uint8_t *b = (uint8_t *)cont; - - int maxdev = 0; - TfaDeviceList_t *dev; - - // get nr of devlists - maxdev = cont->ndev; - // get last devlist - dev = tfaContGetDevList(cont, maxdev - 1); - if (dev == NULL) - return NULL; - // the 1st profile starts after the last device list - b = (uint8_t *)dev + sizeof(TfaDeviceList_t) + dev->length * (sizeof(TfaDescPtr_t)); - prof = (TfaProfileList_t *)b; - return prof; -} - -/* - * return 1st livedata list - */ -TfaLiveDataList_t *tfaContGet1stLiveDataList(TfaContainer_t *cont) -{ - TfaLiveDataList_t *ldata; - TfaProfileList_t *prof; - TfaDeviceList_t *dev; - uint8_t *b = (uint8_t *)cont; - int maxdev, maxprof; - - // get nr of devlists+1 - maxdev = cont->ndev; - // get nr of proflists - maxprof = cont->nprof; - - // get last devlist - dev = tfaContGetDevList(cont, maxdev - 1); - // the 1st livedata starts after the last device list - b = (uint8_t *)dev + sizeof(TfaDeviceList_t) + - dev->length * (sizeof(TfaDescPtr_t)); - - while (maxprof != 0) { - // get last proflist - prof = (TfaProfileList_t *)b; - b += sizeof(TfaProfileList_t) + - ((prof->length - 1) * (sizeof(TfaDescPtr_t))); - maxprof--; - } - - /* Else the marker falls off */ - b += 4; //bytes - - ldata = (TfaLiveDataList_t *)b; - return ldata; -} - -/* - * return the device list pointer - */ -TfaDeviceList_t *tfaContDevice(TfaContainer_t *cnt, int dev_idx) -{ - return tfaContGetDevList(cnt, dev_idx); -} - -/* - * return the next profile: - * - assume that all profiles are adjacent - * - calculate the total length of the input - * - the input profile + its length is the next profile - */ -TfaProfileList_t *tfaContNextProfile(TfaProfileList_t *prof) -{ - uint8_t *this, *next; /* byte pointers for byte pointer arithmetic */ - TfaProfileList_t *nextprof; - int listlength; /* total length of list in bytes */ - - if (prof == NULL) - return NULL; - - if (prof->ID != TFA_PROFID) - return NULL; /* invalid input */ - - this = (uint8_t *)prof; - /* nr of items in the list, length includes name dsc so - 1*/ - listlength = (prof->length - 1) * sizeof(TfaDescPtr_t); - /* the sizeof(TfaProfileList_t) includes the list[0] length */ - next = this + listlength + sizeof(TfaProfileList_t);// - sizeof(TfaDescPtr_t); - nextprof = (TfaProfileList_t *)next; - - if (nextprof->ID != TFA_PROFID) - return NULL; - - return nextprof; -} - -/* - * return the next livedata - */ -TfaLiveDataList_t *tfaContNextLiveData(TfaLiveDataList_t *livedata) -{ - TfaLiveDataList_t *nextlivedata = (TfaLiveDataList_t *)((char *)livedata + (livedata->length * 4) + - sizeof(TfaLiveDataList_t) - 4); - - if (nextlivedata->ID == TFA_LIVEDATAID) - return nextlivedata; - - return NULL; -} - -/* - * check CRC for container - * CRC is calculated over the bytes following the CRC field - * - * return non zero value on error - */ -int tfaContCrcCheckContainer(TfaContainer_t *cont) -{ - uint8_t *base; - size_t size; - uint32_t crc; - - base = (uint8_t *)&cont->CRC + 4; // ptr to bytes following the CRC field - size = (size_t)(cont->size - (base - (uint8_t *)cont)); // nr of bytes following the CRC field - crc = ~crc32_le(~0u, base, size); - - return crc != cont->CRC; -} - -static void get_all_features_from_cnt(struct tfa_device *tfa, int *hw_feature_register, int sw_feature_register[2]) -{ - TfaFeatures_t *features; - int i; - - TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); - - /* Init values in case no keyword is defined in cnt file: */ - *hw_feature_register = -1; - sw_feature_register[0] = -1; - sw_feature_register[1] = -1; - - if (dev == NULL) - return; - - // process the device list - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == dscFeatures) { - features = (TfaFeatures_t *)(dev->list[i].offset + (uint8_t *)tfa->cnt); - *hw_feature_register = features->value[0]; - sw_feature_register[0] = features->value[1]; - sw_feature_register[1] = features->value[2]; - break; - } - } -} - -/* wrapper function */ -void get_hw_features_from_cnt(struct tfa_device *tfa, int *hw_feature_register) -{ - int sw_feature_register[2]; - - get_all_features_from_cnt(tfa, hw_feature_register, sw_feature_register); -} - -/* wrapper function */ -void get_sw_features_from_cnt(struct tfa_device *tfa, int sw_feature_register[2]) -{ - int hw_feature_register; - - get_all_features_from_cnt(tfa, &hw_feature_register, sw_feature_register); -} - -enum Tfa98xx_Error tfa98xx_factory_trimmer(struct tfa_device *tfa) -{ - return (tfa->dev_ops.factory_trimmer)(tfa); -} - -enum Tfa98xx_Error tfa_set_filters(struct tfa_device *tfa, int prof_idx) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaProfileList_t *prof = tfaContGetDevProfList(tfa->cnt, tfa->dev_idx, prof_idx); - unsigned int i; - - if (!prof) - return Tfa98xx_Error_Bad_Parameter; - - /* If we are in powerdown there is no need to set filters */ - if (TFA_GET_BF(tfa, PWDN) == 1) - return Tfa98xx_Error_Ok; - - /* loop the profile to find filter settings */ - for (i = 0; i < prof->length; i++) { - /* We only want to write the values before the default section */ - if (prof->list[i].type == dscDefault) - break; - - /* write all filter settings */ - if (prof->list[i].type == dscFilter) { - if (tfaContWriteItem(tfa, &prof->list[i]) != Tfa98xx_Error_Ok) - return err; - } - } - - return err; -} - -int tfa_tib_dsp_msgmulti(struct tfa_device *tfa, int length, const char *buffer) -{ - uint8_t *buf = (uint8_t *)buffer; - static uint8_t *blob = NULL, *blobptr; /* TODO: not multi-thread safe */ - static int total; /* TODO: not multi-thread safe */ - int post_len = 0; - - /* checks for 24b_BE or 32_LE */ - int len_word_in_bytes = (tfa->convert_dsp32) ? 4 : 3; - /* TODO: get rid of these magic constants max size should depend on the tfa device type */ - int tfadsp_max_msg_size = (tfa->convert_dsp32) ? 5336 : 4000; - - /* No data found*/ - if (length == -1 && blob == NULL) { - return -1; - } - - if (length == -1) { - int i; - /* set last length field to zero */ - for (i = total; i < (total + len_word_in_bytes); i++) { - blob[i] = 0; - } - total += len_word_in_bytes; - memcpy(buf, blob, total); - - kfree(blob); - blob = NULL; /* Set to NULL pointer, otherwise no new malloc is done! */ - return total; - } - - if (blob == NULL) { - if (tfa->verbose) - pr_debug("%s, Creating the multi-message\n\n", __func__); - - blob = kmalloc(tfadsp_max_msg_size, GFP_KERNEL); - /* add command ID for multi-msg = 0x008015 */ - if (tfa->convert_dsp32) { - blob[0] = 0x15; - blob[1] = 0x80; - blob[2] = 0x0; - blob[3] = 0x0; - } else { - blob[0] = 0x0; - blob[1] = 0x80; - blob[2] = 0x15; - } - blobptr = blob; - blobptr += len_word_in_bytes; - total = len_word_in_bytes; - } - - if (tfa->verbose) { - pr_debug("%s, id:0x%02x%02x%02x, length:%d\n", __func__, buf[0], buf[1], buf[2], length); - } - - /* check total message size after concatination */ - post_len = total + length + (2 * len_word_in_bytes); - if (post_len > tfadsp_max_msg_size) { - //pr_debug("New multi-message too large! (%d >= %d (max.)), current length: %d\n", post_len, tfadsp_max_msg_size, total); - return Tfa98xx_Error_Buffer_too_small; - } - - /* add length field (length in words) to the multi message */ - if (tfa->convert_dsp32) { - *blobptr++ = (uint8_t)((length / len_word_in_bytes) & 0xff); /* lsb */ - *blobptr++ = (uint8_t)(((length / len_word_in_bytes) & 0xff00) >> 8); /* msb */ - *blobptr++ = 0x0; - *blobptr++ = 0x0; - } else { - *blobptr++ = 0x0; - *blobptr++ = (uint8_t)(((length / len_word_in_bytes) & 0xff00) >> 8); /* msb */ - *blobptr++ = (uint8_t)((length / len_word_in_bytes) & 0xff); /* lsb */ - } - memcpy(blobptr, buf, length); - blobptr += length; - total += (length + len_word_in_bytes); - - /* SetRe25 message is always the last message of the multi-msg */ - if (tfa->convert_dsp32) { - if (buf[1] == 0x81 && buf[0] == SB_PARAM_SET_RE25C) { - return 1; /* 1 means last message is done! */ - } - } else { - if (buf[1] == 0x81 && buf[2] == SB_PARAM_SET_RE25C) { - return 1; /* 1 means last message is done! */ - } - } - - return 0; -} diff --git a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_dsp.c b/techpack/audio/asoc/codecs/tfa98xx/src/tfa_dsp.c deleted file mode 100644 index b8881cb69cdb..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_dsp.c +++ /dev/null @@ -1,4265 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - - -#include "dbgprint.h" -#include "tfa_container.h" -#include "tfa.h" -#include "tfa98xx_tfafieldnames.h" -#include "tfa_internal.h" - -#ifdef __KERNEL__ - #ifdef pr_fmt - #undef pr_fmt - #endif - #define pr_fmt(fmt) "%s(): " fmt, __func__ -#endif - -/* handle macro for bitfield */ -#define TFA_MK_BF(reg, pos, len) ((reg<<8)|(pos<<4)|(len-1)) - -/* abstract family for register */ -#define FAM_TFA98XX_CF_CONTROLS (TFA_FAM(tfa, RST) >> 8) -#define FAM_TFA98XX_CF_MEM (TFA_FAM(tfa, MEMA) >> 8) -#define FAM_TFA98XX_MTP0 (TFA_FAM(tfa, MTPOTC) >> 8) -#define FAM_TFA98xx_INT_EN (TFA_FAM(tfa, INTENVDDS) >> 8) - -#define CF_STATUS_I2C_CMD_ACK 0x01 - -/* Defines below are used for irq function (this removed the genregs include) */ -#define TFA98XX_INTERRUPT_ENABLE_REG1 0x48 -#define TFA98XX_INTERRUPT_IN_REG1 0x44 -#define TFA98XX_INTERRUPT_OUT_REG1 0x40 -#define TFA98XX_STATUS_POLARITY_REG1 0x4c -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK 0x2 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MSK 0x1 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_POS 1 -#define TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_POS 0 -#define MIN_BATT_LEVEL 640 -#define MAX_BATT_LEVEL 670 -void tfanone_ops(struct tfa_device_ops *ops); -void tfa9872_ops(struct tfa_device_ops *ops); -void tfa9873_ops(struct tfa_device_ops *ops); -void tfa9874_ops(struct tfa_device_ops *ops); -void tfa9878_ops(struct tfa_device_ops *ops); -void tfa9912_ops(struct tfa_device_ops *ops); -void tfa9888_ops(struct tfa_device_ops *ops); -void tfa9891_ops(struct tfa_device_ops *ops); -void tfa9897_ops(struct tfa_device_ops *ops); -void tfa9896_ops(struct tfa_device_ops *ops); -void tfa9890_ops(struct tfa_device_ops *ops); -void tfa9895_ops(struct tfa_device_ops *ops); -void tfa9894_ops(struct tfa_device_ops *ops); - -#ifndef MIN -#define MIN(A, B) (A < B?A:B) -#endif - -/* retry values */ -#define CFSTABLE_TRIES 10 -#define AMPOFFWAIT_TRIES 50 -#define MTPBWAIT_TRIES 50 -#define MTPEX_WAIT_NTRIES 50 - -/* calibration done executed */ -#define TFA_MTPEX_POS TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_POS /**/ - -int tfa_get_calibration_info(struct tfa_device *tfa, int channel) -{ - return tfa->mohm[channel]; -} - -/* return sign extended tap pattern */ -int tfa_get_tap_pattern(struct tfa_device *tfa) -{ - int value = tfa_get_bf(tfa, TFA9912_BF_CFTAPPAT); - int bitshift; - uint8_t field_len = 1 + (TFA9912_BF_CFTAPPAT & 0x0f); /* length of bitfield */ - - bitshift = 8 * sizeof(int) - field_len; - /* signextend */ - value = (value << bitshift) >> bitshift; - - return value; -} -/* - * interrupt bit function to clear - */ -int tfa_irq_clear(struct tfa_device *tfa, enum tfa9912_irq bit) -{ - unsigned char reg; - - /* make bitfield enum */ - if (bit == tfa9912_irq_all) { - /* operate on all bits */ - for (reg = TFA98XX_INTERRUPT_IN_REG1; reg < TFA98XX_INTERRUPT_IN_REG1 + 3; reg++) - reg_write(tfa, reg, 0xffff); /* all bits */ - } else if (bit < tfa9912_irq_max) { - reg = (unsigned char)(TFA98XX_INTERRUPT_IN_REG1 + (bit >> 4)); - reg_write(tfa, reg, 1 << (bit & 0x0f)); /* only this bit */ - } else - return -1; - - return 0; -} -/* - * return state of irq or -1 if illegal bit - */ -int tfa_irq_get(struct tfa_device *tfa, enum tfa9912_irq bit) -{ - uint16_t value; - int reg, mask; - - if (bit < tfa9912_irq_max) { - /* only this bit */ - reg = TFA98XX_INTERRUPT_OUT_REG1 + (bit >> 4); - mask = 1 << (bit & 0x0f); - reg_read(tfa, (unsigned char)reg, &value); - } else - return -1; - - return (value & mask) != 0; -} -/* - * interrupt bit function that operates on the shadow regs in the handle - */ - -int tfa_irq_ena(struct tfa_device *tfa, enum tfa9912_irq bit, int state) -{ - uint16_t value, new_value; - int reg = 0, mask; - /* */ - if (bit == tfa9912_irq_all) { - /* operate on all bits */ - for (reg = TFA98XX_INTERRUPT_ENABLE_REG1; reg <= TFA98XX_INTERRUPT_ENABLE_REG1 + tfa9912_irq_max / 16; reg++) { - reg_write(tfa, (unsigned char)reg, state ? 0xffff : 0); /* all bits */ - tfa->interrupt_enable[reg - TFA98XX_INTERRUPT_ENABLE_REG1] = state ? 0xffff : 0; /* all bits */ - } - } else if (bit < tfa9912_irq_max) { - /* only this bit */ - reg = TFA98XX_INTERRUPT_ENABLE_REG1 + (bit >> 4); - mask = 1 << (bit & 0x0f); - reg_read(tfa, (unsigned char)reg, &value); - if (state) //set - new_value = (uint16_t)(value | mask); - else // clear - new_value = value & ~mask; - if (new_value != value) { - reg_write(tfa, (unsigned char)reg, new_value); /* only this bit */ - tfa->interrupt_enable[reg - TFA98XX_INTERRUPT_ENABLE_REG1] = new_value; - } - } else - return -1; - - return 0; -} - -/* - * mask interrupts by disabling them - */ -int tfa_irq_mask(struct tfa_device *tfa) -{ - int reg; - - /* operate on all bits */ - for (reg = TFA98XX_INTERRUPT_ENABLE_REG1; reg <= TFA98XX_INTERRUPT_ENABLE_REG1 + tfa9912_irq_max / 16; reg++) - reg_write(tfa, (unsigned char)reg, 0); - - return 0; -} - -/* - * unmask interrupts by enabling them again - */ -int tfa_irq_unmask(struct tfa_device *tfa) -{ - int reg; - - /* operate on all bits */ - for (reg = TFA98XX_INTERRUPT_ENABLE_REG1; reg <= TFA98XX_INTERRUPT_ENABLE_REG1 + tfa9912_irq_max / 16; reg++) - reg_write(tfa, (unsigned char)reg, tfa->interrupt_enable[reg - TFA98XX_INTERRUPT_ENABLE_REG1]); - - return 0; -} - -/* - * interrupt bit function that sets the polarity - */ - -int tfa_irq_set_pol(struct tfa_device *tfa, enum tfa9912_irq bit, int state) -{ - uint16_t value, new_value; - int reg = 0, mask; - - if (bit == tfa9912_irq_all) { - /* operate on all bits */ - for (reg = TFA98XX_STATUS_POLARITY_REG1; reg <= TFA98XX_STATUS_POLARITY_REG1 + tfa9912_irq_max / 16; reg++) { - reg_write(tfa, (unsigned char)reg, state ? 0xffff : 0); /* all bits */ - } - } else if (bit < tfa9912_irq_max) { - /* only this bit */ - reg = TFA98XX_STATUS_POLARITY_REG1 + (bit >> 4); - mask = 1 << (bit & 0x0f); - reg_read(tfa, (unsigned char)reg, &value); - if (state) /* Active High */ - new_value = (uint16_t)(value | mask); - else /* Active Low */ - new_value = value & ~mask; - if (new_value != value) { - reg_write(tfa, (unsigned char)reg, new_value); /* only this bit */ - } - } else - return -1; - - return 0; -} - -/* - * set device info and register device ops - */ -void tfa_set_query_info(struct tfa_device *tfa) -{ - /* invalidate device struct cached values */ - tfa->hw_feature_bits = -1; - tfa->sw_feature_bits[0] = -1; - tfa->sw_feature_bits[1] = -1; - tfa->profile = -1; - tfa->vstep = -1; - /* defaults */ - tfa->is_probus_device = 0; - tfa->advance_keys_handling = 0; /*artf65038*/ - tfa->tfa_family = 1; - tfa->daimap = Tfa98xx_DAI_I2S; /* all others */ - tfa->spkr_count = 1; - tfa->spkr_select = 0; - tfa->support_tcoef = supportYes; - tfa->supportDrc = supportNotSet; - tfa->support_saam = supportNotSet; - tfa->ext_dsp = -1; /* respond to external DSP: -1:none, 0:no_dsp, 1:cold, 2:warm */ - tfa->bus = 0; - tfa->partial_enable = 0; - tfa->convert_dsp32 = 0; - tfa->sync_iv_delay = 0; - - /* TODO use the getfeatures() for retrieving the features [artf103523] - tfa->supportDrc = supportNotSet;*/ - - switch (tfa->rev & 0xff) { - case 0: /* tfanone : non-i2c external DSP device */ - /* e.g. qc adsp */ - tfa->supportDrc = supportYes; - tfa->tfa_family = 0; - tfa->spkr_count = 0; - tfa->daimap = 0; - tfanone_ops(&tfa->dev_ops); /* register device operations via tfa hal*/ - tfa->bus = 1; - break; - case 0x72: - /* tfa9872 */ - tfa->supportDrc = supportYes; - tfa->tfa_family = 2; - tfa->spkr_count = 1; - tfa->is_probus_device = 1; - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9872_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x73: - /* tfa9873 */ - tfa->supportDrc = supportYes; - tfa->tfa_family = 2; - tfa->spkr_count = 1; - tfa->is_probus_device = 1; - tfa->advance_keys_handling = 1; /*artf65038*/ - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9873_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x74: - /* tfa9874 */ - tfa->supportDrc = supportYes; - tfa->tfa_family = 2; - tfa->spkr_count = 1; - tfa->is_probus_device = 1; - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9874_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x78: - /* tfa9878 */ - tfa->supportDrc = supportYes; - tfa->tfa_family = 2; - tfa->spkr_count = 1; - tfa->is_probus_device = 1; - tfa->advance_keys_handling = 1; /*artf65038*/ - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9878_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x88: - /* tfa9888 */ - tfa->tfa_family = 2; - tfa->spkr_count = 2; - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9888_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x97: - /* tfa9897 */ - tfa->supportDrc = supportNo; - tfa->spkr_count = 1; - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9897_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x96: - /* tfa9896 */ - tfa->supportDrc = supportNo; - tfa->spkr_count = 1; - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9896_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x92: - /* tfa9891 */ - tfa->spkr_count = 1; - tfa->daimap = (Tfa98xx_DAI_PDM | Tfa98xx_DAI_I2S); - tfa9891_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x91: - /* tfa9890B */ - tfa->spkr_count = 1; - tfa->daimap = (Tfa98xx_DAI_PDM | Tfa98xx_DAI_I2S); - break; - case 0x80: - case 0x81: - /* tfa9890 */ - tfa->spkr_count = 1; - tfa->daimap = Tfa98xx_DAI_I2S; - tfa->supportDrc = supportNo; - tfa->supportFramework = supportNo; - tfa9890_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x12: - /* tfa9895 */ - tfa->spkr_count = 1; - tfa->daimap = Tfa98xx_DAI_I2S; - tfa9895_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x13: - /* tfa9912 */ - tfa->tfa_family = 2; - tfa->spkr_count = 1; - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9912_ops(&tfa->dev_ops); /* register device operations */ - break; - case 0x94: - /* tfa9894 */ - tfa->tfa_family = 2; - tfa->spkr_count = 1; - tfa->daimap = Tfa98xx_DAI_TDM; - tfa9894_ops(&tfa->dev_ops); /* register device operations */ - break; - - default: - pr_err("unknown device type : 0x%02x\n", tfa->rev); - _ASSERT(0); - break; - } -} - -/* - * lookup the device type and return the family type - */ -int tfa98xx_dev2family(int dev_type) -{ - /* only look at the die ID part (lsb byte) */ - switch (dev_type & 0xff) { - case 0x12: - case 0x80: - case 0x81: - case 0x91: - case 0x92: - case 0x97: - case 0x96: - return 1; - case 0x88: - case 0x72: - case 0x73: - case 0x13: - case 0x74: - case 0x78: - case 0x94: - return 2; - case 0x50: - return 3; - default: - return 0; - } -} - -/* - * return the target address for the filter on this device - - filter_index: - [0..9] reserved for EQ (not deployed, calc. is available) - [10..12] anti-alias filter - [13] integrator filter - - */ -enum Tfa98xx_DMEM tfa98xx_filter_mem(struct tfa_device *tfa, int filter_index, unsigned short *address, int channel) -{ - enum Tfa98xx_DMEM dmem = -1; - int idx; - unsigned short bq_table[7][4] = { - /* index: 10, 11, 12, 13 */ - {346, 351, 356, 288}, //87 BRA_MAX_MRA4-2_7.00 - {346, 351, 356, 288}, //90 BRA_MAX_MRA6_9.02 - {467, 472, 477, 409}, //95 BRA_MAX_MRA7_10.02 - {406, 411, 416, 348}, //97 BRA_MAX_MRA9_12.01 - {467, 472, 477, 409}, //91 BRA_MAX_MRAA_13.02 - {8832, 8837, 8842, 8847}, //88 part1 - {8853, 8858, 8863, 8868} //88 part2 - /* Since the 88 is stereo we have 2 parts. - * Every index has 5 values except index 13 this one has 6 values - */ - }; - - if ((filter_index >= 10) && (filter_index <= 13)) { - dmem = Tfa98xx_DMEM_YMEM; /* for all devices */ - idx = filter_index - 10; - - switch (tfa->rev & 0xff) { // only compare lower byte - case 0x12: - *address = bq_table[2][idx]; - break; - case 0x97: - *address = bq_table[3][idx]; - break; - case 0x96: - *address = bq_table[3][idx]; - break; - case 0x80: - case 0x81: // for the RAM version - case 0x91: - *address = bq_table[1][idx]; - break; - case 0x92: - *address = bq_table[4][idx]; - break; - case 0x88: - /* Channel 1 = primary, 2 = secondary */ - if (channel == 1) - *address = bq_table[5][idx]; - else - *address = bq_table[6][idx]; - break; - case 0x72: - case 0x73: - case 0x74: - case 0x78: - case 0x13: - default: - /* unsupported case, possibly intermediate version */ - return -1; - _ASSERT(0); - } - } - return dmem; -} - -/************************ query functions ********************************************************/ -/** -* return revision -* Used by the LTT -*/ -void tfa98xx_rev(int *major, int *minor, int *revision) -{ - char version_str[] = TFA98XX_API_REV_STR; - - sscanf(version_str, "v%d.%d.%d", major, minor, revision); -} - -/** - * tfa_supported_speakers - * returns the number of the supported speaker count - */ -enum Tfa98xx_Error tfa_supported_speakers(struct tfa_device *tfa, int *spkr_count) -{ - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - else - *spkr_count = tfa->spkr_count; - - return Tfa98xx_Error_Ok; -} - -/* - * tfa98xx_supported_saam - * returns the supportedspeaker as microphone feature - */ -enum Tfa98xx_Error tfa98xx_supported_saam(struct tfa_device *tfa, enum Tfa98xx_saam *saam) -{ - int features; - enum Tfa98xx_Error error; - - if (tfa->support_saam == supportNotSet) { - error = tfa98xx_dsp_get_hw_feature_bits(tfa, &features); - if (error != Tfa98xx_Error_Ok) - return error; - tfa->support_saam = - (features & 0x8000) ? supportYes : supportNo; /* SAAM is bit15 */ - } - *saam = tfa->support_saam == supportYes ? Tfa98xx_saam : Tfa98xx_saam_none; - - return Tfa98xx_Error_Ok; -} - -/* - * tfa98xx_compare_features - * Obtains features_from_MTP and features_from_cnt - */ -enum Tfa98xx_Error tfa98xx_compare_features(struct tfa_device *tfa, int features_from_MTP[3], int features_from_cnt[3]) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - uint32_t value; - uint16_t mtpbf; - unsigned char bytes[3 * 2]; - int status; - - tfa98xx_dsp_system_stable(tfa, &status); - if (!status) - return Tfa98xx_Error_NoClock; // Only test when we have a clock. - - /* Set proper MTP location per device: */ - if (tfa->tfa_family == 1) { - mtpbf = 0x850f; /* MTP5 for tfa1,16 bits */ - } else { - mtpbf = 0xf907; /* MTP9 for tfa2, 8 bits */ - } - - /* Read HW features from MTP: */ - value = tfa_read_reg(tfa, mtpbf) & 0xffff; - features_from_MTP[0] = tfa->hw_feature_bits = value; - - /* Read SW features: */ - error = tfa_dsp_cmd_id_write_read(tfa, MODULE_FRAMEWORK, FW_PAR_ID_GET_FEATURE_INFO, sizeof(bytes), bytes); - if (error != Tfa98xx_Error_Ok) - return error; /* old ROM code may respond with Tfa98xx_Error_RpcParamId */ - - tfa98xx_convert_bytes2data(sizeof(bytes), bytes, &features_from_MTP[1]); - - /* check if feature bits from MTP match feature bits from cnt file: */ - get_hw_features_from_cnt(tfa, &features_from_cnt[0]); - get_sw_features_from_cnt(tfa, &features_from_cnt[1]); - - return error; -} - -/********************************* device specific ops ************************************************/ -/* the wrapper for DspReset, in case of full */ -enum Tfa98xx_Error tfa98xx_dsp_reset(struct tfa_device *tfa, int state) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - error = (tfa->dev_ops.dsp_reset)(tfa, state); - - return error; -} - -/* the ops wrapper for tfa98xx_dsp_SystemStable */ -enum Tfa98xx_Error tfa98xx_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - enum Tfa98xx_Error error = (tfa->dev_ops.dsp_system_stable)(tfa, ready); - - pr_debug("%s error=%d ready=%d\n", __func__, error, *ready); - return error; -} - -/* the ops wrapper for tfa98xx_dsp_system_stable */ -enum Tfa98xx_Error tfa98xx_auto_copy_mtp_to_iic(struct tfa_device *tfa) -{ - return (tfa->dev_ops.auto_copy_mtp_to_iic)(tfa); -} - -/* the ops wrapper for tfa98xx_faim_protect */ -enum Tfa98xx_Error tfa98xx_faim_protect(struct tfa_device *tfa, int state) -{ - return (tfa->dev_ops.faim_protect)(tfa, state); -} - -/* - * bring the device into a state similar to reset - */ -enum Tfa98xx_Error tfa98xx_init(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - uint16_t value = 0; - - /* reset all i2C registers to default - * Write the register directly to avoid the read in the bitfield function. - * The I2CR bit may overwrite the full register because it is reset anyway. - * This will save a reg read transaction. - */ - TFA_SET_BF_VALUE(tfa, I2CR, 1, &value); - TFA_WRITE_REG(tfa, I2CR, value); - - /* Put DSP in reset */ - tfa98xx_dsp_reset(tfa, 1); /* in pair of tfaRunStartDSP() */ - - /* some other registers must be set for optimal amplifier behaviour - * This is implemented in a file specific for the type number - */ - if (tfa->dev_ops.tfa_init) - error = (tfa->dev_ops.tfa_init)(tfa); - - return error; -} - -enum Tfa98xx_Error tfa98xx_dsp_write_tables(struct tfa_device *tfa, int sample_rate) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - error = (tfa->dev_ops.dsp_write_tables)(tfa, sample_rate); - - return error; -} - -/** Set internal oscillator into power down mode. -* -* @param[in] tfa device description structure -* @param[in] state new state 0 - oscillator is on, 1 oscillator is off. -* -* @return Tfa98xx_Error_Ok when successfull, error otherwise. -*/ -enum Tfa98xx_Error tfa98xx_set_osc_powerdown(struct tfa_device *tfa, int state) -{ - if (tfa->dev_ops.set_osc_powerdown) { - return tfa->dev_ops.set_osc_powerdown(tfa, state); - } - - return Tfa98xx_Error_Not_Implemented; -} - -/** update low power mode of the device. -* -* @param[in] tfa device description structure -* @param[in] state new state 0 - LPMODE is on, 1 LPMODE is off. -* -* @return Tfa98xx_Error_Ok when successfull, error otherwise. -*/ -enum Tfa98xx_Error tfa98xx_update_lpm(struct tfa_device *tfa, int state) -{ - if (tfa->dev_ops.update_lpm) { - return tfa->dev_ops.update_lpm(tfa, state); - } - - return Tfa98xx_Error_Not_Implemented; -} -/** Check presence of powerswitch=1 in configuration and optimal setting. -* -* @param[in] tfa device description structure -* -* @return -1 when error, 0 or 1 depends on switch settings. -*/ -int tfa98xx_powerswitch_is_enabled(struct tfa_device *tfa) -{ - uint16_t value; - enum Tfa98xx_Error ret; - - if (((tfa->rev & 0xff) == 0x13) || ((tfa->rev & 0xff) == 0x88)) { - ret = reg_read(tfa, 0xc6, &value); - if (ret != Tfa98xx_Error_Ok) { - return -1; - } - /* PLMA5539: Check actual value of powerswitch. TODO: regmap v1.40 should make this bit public. */ - - return (int)(value & (1u << 6)); - } - - return 1; -} - -/********************* new tfa2 *********************************************************************/ -/* newly added messaging for tfa2 tfa1? */ -enum Tfa98xx_Error tfa98xx_dsp_get_memory(struct tfa_device *tfa, int memoryType, - int offset, int length, unsigned char bytes[]) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - char msg[4 * 3]; - int nr = 0; - - msg[nr++] = 8; - msg[nr++] = MODULE_FRAMEWORK + 128; - msg[nr++] = FW_PAR_ID_GET_MEMORY; - - msg[nr++] = 0; - msg[nr++] = 0; - msg[nr++] = (char)memoryType; - - msg[nr++] = 0; - msg[nr++] = (offset >> 8) & 0xff; - msg[nr++] = offset & 0xff; - - msg[nr++] = 0; - msg[nr++] = (length >> 8) & 0xff; - msg[nr++] = length & 0xff; - - /* send msg */ - error = dsp_msg(tfa, nr, (char *)msg); - - if (error != Tfa98xx_Error_Ok) - return error; - - /* read the data from the device (length * 3) */ - error = dsp_msg_read(tfa, length * 3, bytes); - - return error; -} - -enum Tfa98xx_Error tfa98xx_dsp_set_memory(struct tfa_device *tfa, int memoryType, - int offset, int length, int value) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int nr = 0; - char msg[5 * 3]; - - msg[nr++] = 8; - msg[nr++] = MODULE_FRAMEWORK + 128; - msg[nr++] = FW_PAR_ID_SET_MEMORY; - - msg[nr++] = 0; - msg[nr++] = 0; - msg[nr++] = (char)memoryType; - - msg[nr++] = 0; - msg[nr++] = (offset >> 8) & 0xff; - msg[nr++] = offset & 0xff; - - msg[nr++] = 0; - msg[nr++] = (length >> 8) & 0xff; - msg[nr++] = length & 0xff; - - msg[nr++] = (value >> 16) & 0xff; - msg[nr++] = (value >> 8) & 0xff; - msg[nr++] = value & 0xff; - - /* send msg */ - error = dsp_msg(tfa, nr, (char *)msg); - - return error; -} -/****************************** calibration support **************************/ -/* - * get/set the mtp with user controllable values - * - * check if the relevant clocks are available - */ -enum Tfa98xx_Error tfa98xx_get_mtp(struct tfa_device *tfa, uint16_t *value) -{ - int status; - int result; - - /* not possible if PLL in powerdown */ - if (TFA_GET_BF(tfa, PWDN)) { - pr_debug("PLL in powerdown\n"); - return Tfa98xx_Error_NoClock; - } - tfa98xx_dsp_system_stable(tfa, &status); - if (status == 0) { - pr_debug("PLL not running\n"); - return Tfa98xx_Error_NoClock; - } - - result = TFA_READ_REG(tfa, MTP0); - if (result < 0) { - return -result; - } - *value = (uint16_t)result; - - return Tfa98xx_Error_Ok; -} - -/* - * lock or unlock KEY2 - * lock = 1 will lock - * lock = 0 will unlock - * - * note that on return all the hidden key will be off - */ -void tfa98xx_key2(struct tfa_device *tfa, int lock) -{ - /* unhide lock registers */ - reg_write(tfa, (tfa->tfa_family == 1) ? 0x40 : 0x0F, 0x5A6B); - /* lock/unlock key2 MTPK */ - TFA_WRITE_REG(tfa, MTPKEY2, lock ? 0 : 0x5A); - /* unhide lock registers */ - if (!tfa->advance_keys_handling) /*artf65038*/ - reg_write(tfa, (tfa->tfa_family == 1) ? 0x40 : 0x0F, 0); -} -void tfa2_manual_mtp_cpy(struct tfa_device *tfa, uint16_t reg_row_to_keep, uint16_t reg_row_to_set, uint8_t row)///MCH_TO_TEST -{ - uint16_t value; - int loop = 0; - enum Tfa98xx_Error error; - /* Assure FAIM is enabled (enable it when neccesery) */ - if (tfa->is_probus_device) - { - error = tfa98xx_faim_protect(tfa, 1); - if (tfa->verbose) { - pr_debug("FAIM enabled (err:%d).\n", error); - } - } - reg_read(tfa, (unsigned char)reg_row_to_keep, &value); - if (!row) - { - reg_write(tfa, 0xA7, value); - reg_write(tfa, 0xA8, reg_row_to_set); - } else - { - reg_write(tfa, 0xA7, reg_row_to_set); - reg_write(tfa, 0xA8, value); - } - reg_write(tfa, 0xA3, 0x10 | row); - if (tfa->is_probus_device) - { - /* Assure FAIM is enabled (enable it when neccesery) */ - for (loop = 0; loop < 100 /*x10ms*/; loop++) { - msleep_interruptible(10); /* wait 10ms to avoid busload */ - if (tfa_dev_get_mtpb(tfa) == 0) - break; - } - error = tfa98xx_faim_protect(tfa, 0); - if (tfa->verbose) { - pr_debug("FAIM disabled (err:%d).\n", error); - } - } -} - -enum Tfa98xx_Error tfa98xx_set_mtp(struct tfa_device *tfa, uint16_t value, uint16_t mask) -{ - unsigned short mtp_old, mtp_new; - int loop, status; - enum Tfa98xx_Error error; - - error = tfa98xx_get_mtp(tfa, &mtp_old); - - if (error != Tfa98xx_Error_Ok) - return error; - - mtp_new = (value & mask) | (mtp_old & ~mask); - - if (mtp_old == mtp_new) /* no change */ { - if (tfa->verbose) - pr_info("No change in MTP. Value not written!\n"); - return Tfa98xx_Error_Ok; - } - error = tfa98xx_update_lpm(tfa, 1); - if (error) { - return error; - } - /* Assure FAIM is enabled (enable it when neccesery) */ - error = tfa98xx_faim_protect(tfa, 1); - if (error) { - return error; - } - if (tfa->verbose) { - pr_debug("MTP clock enabled.\n"); - } - - /* assure that the clock is up, else we can't write MTP */ - error = tfa98xx_dsp_system_stable(tfa, &status); - if (error) { - return error; - } - if (status == 0) { - return Tfa98xx_Error_NoClock; - } - - tfa98xx_key2(tfa, 0); /* unlock */ - TFA_WRITE_REG(tfa, MTP0, mtp_new); /* write to i2c shadow reg */ - /* CIMTP=1 start copying all the data from i2c regs_mtp to mtp*/ - if (tfa->tfa_family == 2) - tfa2_manual_mtp_cpy(tfa, 0xF1, mtp_new, 0); - else - TFA_SET_BF(tfa, CIMTP, 1); - /* wait until MTP write is done */ - error = Tfa98xx_Error_StateTimedOut; - for (loop = 0; loop < 100 /*x10ms*/; loop++) { - msleep_interruptible(10); /* wait 10ms to avoid busload */ - if (tfa_dev_get_mtpb(tfa) == 0) { - error = Tfa98xx_Error_Ok; - break; - } - } - tfa98xx_key2(tfa, 1); /* lock */ - /* MTP setting failed due to timeout ?*/ - if (error) { - tfa98xx_faim_protect(tfa, 0); - return error; - } - - /* Disable the FAIM, if this is neccessary */ - error = tfa98xx_faim_protect(tfa, 0); - if (error) { - return error; - } - if (tfa->verbose) { - pr_debug("MTP clock disabled.\n"); - } - error = tfa98xx_update_lpm(tfa, 0); - if (error) { - return error; - } - return error; -} -/* - * clear mtpex - * set ACS - * start tfa - */ -int tfa_calibrate(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error; - - /* clear mtpex */ - error = tfa98xx_set_mtp(tfa, 0, TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK); - if (error) - return error; - - /* set RST=1 to put the DSP in Reset */ - TFA_SET_BF(tfa, RST, 1); - - /* set ACS/coldboot state */ - error = tfaRunColdboot(tfa, 1); - - /* start tfa by playing */ - return error; -} - -static short twos(short x) -{ - return (x < 0) ? x + 512 : x; -} - -void tfa98xx_set_exttemp(struct tfa_device *tfa, short ext_temp) -{ - if ((-256 <= ext_temp) && (ext_temp <= 255)) { - /* make twos complement */ - pr_debug("Using ext temp %d C\n", twos(ext_temp)); - TFA_SET_BF(tfa, TROS, 1); - TFA_SET_BF(tfa, EXTTS, twos(ext_temp)); - } else { - pr_debug("Clearing ext temp settings\n"); - TFA_SET_BF(tfa, TROS, 0); - } -} -short tfa98xx_get_exttemp(struct tfa_device *tfa) -{ - short ext_temp = (short)TFA_GET_BF(tfa, EXTTS); - - return (twos(ext_temp)); -} - -/************************** tfa simple bitfield interfacing ***************************************/ -/* convenience functions */ -enum Tfa98xx_Error tfa98xx_set_volume_level(struct tfa_device *tfa, unsigned short vol) -{ - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - if (vol > 255) /* restricted to 8 bits */ - vol = 255; - - /* 0x00 -> 0.0 dB - * 0x01 -> -0.5 dB - * ... - * 0xFE -> -127dB - * 0xFF -> muted - */ - - /* volume value is in the top 8 bits of the register */ - return -TFA_SET_BF(tfa, VOL, (uint16_t)vol); -} - -static enum Tfa98xx_Error -tfa98xx_set_mute_tfa2(struct tfa_device *tfa, enum Tfa98xx_Mute mute) -{ - enum Tfa98xx_Error error; - - if (tfa->dev_ops.set_mute == NULL) - return Tfa98xx_Error_Not_Supported; - - switch (mute) { - case Tfa98xx_Mute_Off: - error = tfa->dev_ops.set_mute(tfa, 0); - TFA_SET_BF(tfa, AMPE, 1); - break; - case Tfa98xx_Mute_Amplifier: - case Tfa98xx_Mute_Digital: - error = tfa->dev_ops.set_mute(tfa, 1); - TFA_SET_BF(tfa, AMPE, 0); - break; - default: - return Tfa98xx_Error_Bad_Parameter; - } - - return error; -} - -static enum Tfa98xx_Error -tfa98xx_set_mute_tfa1(struct tfa_device *tfa, enum Tfa98xx_Mute mute) -{ - enum Tfa98xx_Error error; - unsigned short audioctrl_value; - unsigned short sysctrl_value; - int value; - - value = TFA_READ_REG(tfa, CFSM); /* audio control register */ - if (value < 0) - return -value; - audioctrl_value = (unsigned short)value; - value = TFA_READ_REG(tfa, AMPE); /* system control register */ - if (value < 0) - return -value; - sysctrl_value = (unsigned short)value; - - switch (mute) { - case Tfa98xx_Mute_Off: - /* previous state can be digital or amplifier mute, - * clear the cf_mute and set the enbl_amplifier bits - * - * To reduce PLOP at power on it is needed to switch the - * amplifier on with the DCDC in follower mode - * (enbl_boost = 0 ?). - * This workaround is also needed when toggling the - * powerdown bit! - */ - TFA_SET_BF_VALUE(tfa, CFSM, 0, &audioctrl_value); - TFA_SET_BF_VALUE(tfa, AMPE, 1, &sysctrl_value); - TFA_SET_BF_VALUE(tfa, DCA, 1, &sysctrl_value); - break; - case Tfa98xx_Mute_Digital: - /* expect the amplifier to run */ - /* set the cf_mute bit */ - TFA_SET_BF_VALUE(tfa, CFSM, 1, &audioctrl_value); - /* set the enbl_amplifier bit */ - TFA_SET_BF_VALUE(tfa, AMPE, 1, &sysctrl_value); - /* clear active mode */ - TFA_SET_BF_VALUE(tfa, DCA, 0, &sysctrl_value); - break; - case Tfa98xx_Mute_Amplifier: - /* clear the cf_mute bit */ - TFA_SET_BF_VALUE(tfa, CFSM, 0, &audioctrl_value); - /* clear the enbl_amplifier bit and active mode */ - TFA_SET_BF_VALUE(tfa, AMPE, 0, &sysctrl_value); - TFA_SET_BF_VALUE(tfa, DCA, 0, &sysctrl_value); - break; - default: - return Tfa98xx_Error_Bad_Parameter; - } - - error = -TFA_WRITE_REG(tfa, CFSM, audioctrl_value); - if (error) - return error; - error = -TFA_WRITE_REG(tfa, AMPE, sysctrl_value); - return error; -} - -enum Tfa98xx_Error - tfa98xx_set_mute(struct tfa_device *tfa, enum Tfa98xx_Mute mute) -{ - if (tfa->in_use == 0) { - pr_err("device is not opened\n"); - return Tfa98xx_Error_NotOpen; - } - - if (tfa->tfa_family == 1) - return tfa98xx_set_mute_tfa1(tfa, mute); - else - return tfa98xx_set_mute_tfa2(tfa, mute); -} - -/****************** patching **********************************************************/ -static enum Tfa98xx_Error -tfa98xx_process_patch_file(struct tfa_device *tfa, int length, - const unsigned char *bytes) -{ - unsigned short size; - int index = 0; - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - while (index < length) { - size = bytes[index] + bytes[index + 1] * 256; - index += 2; - if ((index + size) > length) { - /* outside the buffer, error in the input data */ - return Tfa98xx_Error_Bad_Parameter; - } - - if (size > tfa->buffer_size) { - /* too big, must fit buffer */ - return Tfa98xx_Error_Bad_Parameter; - } - - error = tfa98xx_write_raw(tfa, size, &bytes[index]); - if (error != Tfa98xx_Error_Ok) - break; - index += size; - } - return error; -} - - - -/* the patch contains a header with the following - * IC revision register: 1 byte, 0xFF means don't care - * XMEM address to check: 2 bytes, big endian, 0xFFFF means don't care - * XMEM value to expect: 3 bytes, big endian - */ -static enum Tfa98xx_Error -tfa98xx_check_ic_rom_version(struct tfa_device *tfa, const unsigned char patchheader[]) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short checkrev, revid; - unsigned char lsb_revid; - unsigned short checkaddress; - int checkvalue; - int value = 0; - int status; - - checkrev = patchheader[0]; - lsb_revid = tfa->rev & 0xff; /* only compare lower byte */ - - if ((checkrev != 0xFF) && (checkrev != lsb_revid)) - return Tfa98xx_Error_Not_Supported; - - checkaddress = (patchheader[1] << 8) + patchheader[2]; - checkvalue = - (patchheader[3] << 16) + (patchheader[4] << 8) + patchheader[5]; - if (checkaddress != 0xFFFF) { - /* before reading XMEM, check if we can access the DSP */ - error = tfa98xx_dsp_system_stable(tfa, &status); - if (error == Tfa98xx_Error_Ok) { - if (!status) { - /* DSP subsys not running */ - error = Tfa98xx_Error_DSP_not_running; - } - } - /* read register to check the correct ROM version */ - if (error == Tfa98xx_Error_Ok) { - error = mem_read(tfa, checkaddress, 1, &value); - } - if (error == Tfa98xx_Error_Ok) { - if (value != checkvalue) { - pr_err("patch file romid type check failed [0x%04x]: expected 0x%02x, actual 0x%02x\n", - checkaddress, value, checkvalue); - error = Tfa98xx_Error_Not_Supported; - } - } - } else { /* == 0xffff */ - /* check if the revid subtype is in there */ - if (checkvalue != 0xFFFFFF && checkvalue != 0) { - revid = patchheader[5] << 8 | patchheader[0]; /* full revid */ - if (revid != tfa->rev) { - pr_err("patch file device type check failed: expected 0x%02x, actual 0x%02x\n", - tfa->rev, revid); - return Tfa98xx_Error_Not_Supported; - } - } - } - - return error; -} - - -#define PATCH_HEADER_LENGTH 6 -enum Tfa98xx_Error - tfa_dsp_patch(struct tfa_device *tfa, int patchLength, - const unsigned char *patchBytes) -{ - enum Tfa98xx_Error error; - int status; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - if (patchLength < PATCH_HEADER_LENGTH) - return Tfa98xx_Error_Bad_Parameter; - - error = tfa98xx_check_ic_rom_version(tfa, patchBytes); - if (Tfa98xx_Error_Ok != error) { - return error; - } - - /* for non-dsp solution, we don't need to check ACS. */ - if (tfa->is_probus_device == 0) { - tfa98xx_dsp_system_stable(tfa, &status); - if (!status) - return Tfa98xx_Error_NoClock; // Only test when we have a clock. - /******MCH_TO_TEST**************/ - if (error == Tfa98xx_Error_Ok) { - error = tfaRunColdboot(tfa, 1); - if (error) - return Tfa98xx_Error_DSP_not_running; - } - /**************************/ - error = - tfa98xx_process_patch_file(tfa, patchLength - PATCH_HEADER_LENGTH, - patchBytes + PATCH_HEADER_LENGTH); - - } - return error; -} - -/****************** end patching **********************************************************/ - -TFA_INTERNAL enum Tfa98xx_Error -tfa98xx_wait_result(struct tfa_device *tfa, int wait_retry_count) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int cf_status; /* the contents of the CF_STATUS register */ - int tries = 0; - - do { - cf_status = TFA_GET_BF(tfa, ACK); - if (cf_status < 0) - error = -cf_status; - tries++; - } - // i2c_cmd_ack - /* don't wait forever, DSP is pretty quick to respond (< 1ms) */ - while ((error == Tfa98xx_Error_Ok) && ((cf_status & CF_STATUS_I2C_CMD_ACK) == 0) - && (tries < wait_retry_count)); - if (tries >= wait_retry_count) { - /* something wrong with communication with DSP */ - error = Tfa98xx_Error_DSP_not_running; - } - return error; -} - -/* - * * support functions for data conversion - */ - /** - convert memory bytes to signed 24 bit integers - input: bytes contains "num_bytes" byte elements - output: data contains "num_bytes/3" int24 elements - */ -void tfa98xx_convert_bytes2data(int num_bytes, const unsigned char bytes[], - int data[]) -{ - int i; /* index for data */ - int k; /* index for bytes */ - int d; - int num_data = num_bytes / 3; - - _ASSERT((num_bytes % 3) == 0); - for (i = 0, k = 0; i < num_data; ++i, k += 3) { - d = (bytes[k] << 16) | (bytes[k + 1] << 8) | (bytes[k + 2]); - _ASSERT(d >= 0); - _ASSERT(d < (1 << 24)); /* max 24 bits in use */ - if (bytes[k] & 0x80) /* sign bit was set */ - d = -((1 << 24) - d); - - data[i] = d; - } -} - - -/** - convert signed 32 bit integers to 24 bit aligned bytes - input: data contains "num_data" int elements - output: bytes contains "3 * num_data" byte elements -*/ -void tfa98xx_convert_data2bytes(int num_data, const int data[], - unsigned char bytes[]) -{ - int i; /* index for data */ - int k; /* index for bytes */ - int d; - /* note: cannot just take the lowest 3 bytes from the 32 bit - * integer, because also need to take care of clipping any - * value > 2&23 */ - for (i = 0, k = 0; i < num_data; ++i, k += 3) { - if (data[i] >= 0) - d = MIN(data[i], (1 << 23) - 1); - else { - /* 2's complement */ - d = (1 << 24) - MIN(-data[i], 1 << 23); - } - _ASSERT(d >= 0); - _ASSERT(d < (1 << 24)); /* max 24 bits in use */ - bytes[k] = (d >> 16) & 0xFF; /* MSB */ - bytes[k + 1] = (d >> 8) & 0xFF; - bytes[k + 2] = (d) & 0xFF; /* LSB */ - } -} - -/* - * DSP RPC message support functions - * depending on framework to be up and running - * need base i2c of memaccess (tfa1=0x70/tfa2=0x90) - */ - - - /* write dsp messages in function tfa_dsp_msg() */ - /* note the 'old' write_parameter() was more efficient because all i2c was in one burst transaction */ - - //TODO properly handle bitfields: state should be restored! (now it will change eg dmesg field to xmem) -enum Tfa98xx_Error tfa_dsp_msg_write(struct tfa_device *tfa, int length, const char *buffer) -{ - int offset = 0; - int chunk_size = ROUND_DOWN(tfa->buffer_size, 3); /* XMEM word size */ - int remaining_bytes = length; - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - uint16_t cfctl; - int value; - - value = TFA_READ_REG(tfa, DMEM); - if (value < 0) { - error = -value; - return error; - } - cfctl = (uint16_t)value; - /* assume no I2C errors from here */ - - TFA_SET_BF_VALUE(tfa, DMEM, (uint16_t)Tfa98xx_DMEM_XMEM, &cfctl); /* set cf ctl to DMEM */ - TFA_SET_BF_VALUE(tfa, AIF, 0, &cfctl); /* set to autoincrement */ - TFA_WRITE_REG(tfa, DMEM, cfctl); - - /* xmem[1] is start of message - * direct write to register to save cycles avoiding read-modify-write - */ - TFA_WRITE_REG(tfa, MADD, 1); - - /* due to autoincrement in cf_ctrl, next write will happen at - * the next address */ - while ((error == Tfa98xx_Error_Ok) && (remaining_bytes > 0)) { - if (remaining_bytes < chunk_size) - chunk_size = remaining_bytes; - /* else chunk_size remains at initialize value above */ - error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, - chunk_size, (const unsigned char *)buffer + offset); - remaining_bytes -= chunk_size; - offset += chunk_size; - } - - /* notify the DSP */ - if (error == Tfa98xx_Error_Ok) { - /* cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */ - /* set the cf_req1 and cf_int bit */ - TFA_SET_BF_VALUE(tfa, REQCMD, 0x01, &cfctl); /* bit 0 */ - TFA_SET_BF_VALUE(tfa, CFINT, 1, &cfctl); - error = -TFA_WRITE_REG(tfa, CFINT, cfctl); - } - - return error; -} - -enum Tfa98xx_Error tfa_dsp_msg_write_id(struct tfa_device *tfa, int length, const char *buffer, uint8_t cmdid[3]) -{ - int offset = 0; - int chunk_size = ROUND_DOWN(tfa->buffer_size, 3); /* XMEM word size */ - int remaining_bytes = length; - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - uint16_t cfctl; - int value; - - value = TFA_READ_REG(tfa, DMEM); - if (value < 0) { - error = -value; - return error; - } - cfctl = (uint16_t)value; - /* assume no I2C errors from here */ - - TFA_SET_BF_VALUE(tfa, DMEM, (uint16_t)Tfa98xx_DMEM_XMEM, &cfctl); /* set cf ctl to DMEM */ - TFA_SET_BF_VALUE(tfa, AIF, 0, &cfctl); /* set to autoincrement */ - TFA_WRITE_REG(tfa, DMEM, cfctl); - - /* xmem[1] is start of message - * direct write to register to save cycles avoiding read-modify-write - */ - TFA_WRITE_REG(tfa, MADD, 1); - - /* write cmd-id */ - error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, 3, (const unsigned char *)cmdid); - - /* due to autoincrement in cf_ctrl, next write will happen at - * the next address */ - while ((error == Tfa98xx_Error_Ok) && (remaining_bytes > 0)) { - if (remaining_bytes < chunk_size) - chunk_size = remaining_bytes; - /* else chunk_size remains at initialize value above */ - error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, - chunk_size, (const unsigned char *)buffer + offset); - remaining_bytes -= chunk_size; - offset += chunk_size; - } - - /* notify the DSP */ - if (error == Tfa98xx_Error_Ok) { - /* cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */ - /* set the cf_req1 and cf_int bit */ - TFA_SET_BF_VALUE(tfa, REQCMD, 0x01, &cfctl); /* bit 0 */ - TFA_SET_BF_VALUE(tfa, CFINT, 1, &cfctl); - error = -TFA_WRITE_REG(tfa, CFINT, cfctl); - } - - return error; -} - -/* -* status function used by tfa_dsp_msg() to retrieve command/msg status: -* return a <0 status of the DSP did not ACK. -*/ -enum Tfa98xx_Error tfa_dsp_msg_status(struct tfa_device *tfa, int *pRpcStatus) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - error = tfa98xx_wait_result(tfa, 2); /* 2 is only one try */ - if (error == Tfa98xx_Error_DSP_not_running) { - *pRpcStatus = -1; - return Tfa98xx_Error_Ok; - } else if (error != Tfa98xx_Error_Ok) - return error; - - error = tfa98xx_check_rpc_status(tfa, pRpcStatus); - - return error; -} - -const char *tfa98xx_get_i2c_status_id_string(int status) -{ - const char *p_id_str; - - switch (status) - { - case Tfa98xx_DSP_Not_Running: - p_id_str = "No response from DSP"; - break; - case Tfa98xx_I2C_Req_Done: - p_id_str = "Ok"; - break; - case Tfa98xx_I2C_Req_Busy: - p_id_str = "Request is being processed"; - break; - case Tfa98xx_I2C_Req_Invalid_M_ID: - p_id_str = "Provided M-ID does not fit in valid rang [0..2]"; - break; - case Tfa98xx_I2C_Req_Invalid_P_ID: - p_id_str = "Provided P-ID is not valid in the given M-ID context"; - break; - case Tfa98xx_I2C_Req_Invalid_CC: - p_id_str = "Invalid channel configuration bits (SC|DS|DP|DC) combination"; - break; - case Tfa98xx_I2C_Req_Invalid_Seq: - p_id_str = "Invalid sequence of commands, in case the DSP expects some commands in a specific order"; - break; - case Tfa98xx_I2C_Req_Invalid_Param: - p_id_str = "Generic error, invalid parameter"; - break; - case Tfa98xx_I2C_Req_Buffer_Overflow: - p_id_str = "I2C buffer has overflowed: host has sent too many parameters, memory integrity is not guaranteed"; - break; - case Tfa98xx_I2C_Req_Calib_Busy: - p_id_str = "Calibration not completed"; - break; - case Tfa98xx_I2C_Req_Calib_Failed: - p_id_str = "Calibration failed"; - break; - - default: - p_id_str = "Unspecified error"; - } - - return p_id_str; -} - -enum Tfa98xx_Error tfa_dsp_msg_read(struct tfa_device *tfa, int length, unsigned char *bytes) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int burst_size; /* number of words per burst size */ - int bytes_per_word = 3; - int num_bytes; - int offset = 0; - unsigned short start_offset = 2; /* msg starts @xmem[2] ,[1]=cmd */ - - if (length > TFA2_MAX_PARAM_SIZE) - return Tfa98xx_Error_Bad_Parameter; - - TFA_SET_BF(tfa, DMEM, (uint16_t)Tfa98xx_DMEM_XMEM); - error = -TFA_WRITE_REG(tfa, MADD, start_offset); - if (error != Tfa98xx_Error_Ok) - return error; - - num_bytes = length; /* input param */ - while (num_bytes > 0) { - burst_size = ROUND_DOWN(tfa->buffer_size, bytes_per_word); - if (num_bytes < burst_size) - burst_size = num_bytes; - error = tfa98xx_read_data(tfa, FAM_TFA98XX_CF_MEM, burst_size, bytes + offset); - if (error != Tfa98xx_Error_Ok) - return error; - - num_bytes -= burst_size; - offset += burst_size; - } - - return error; -} - -enum Tfa98xx_Error dsp_msg(struct tfa_device *tfa, int length24, const char *buf24) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int lastmessage = 0; - uint8_t *blob; - int i; - int *intbuf = NULL; - char *buf = (char *)buf24; - int length = length24; - - if (tfa->convert_dsp32) { - int idx = 0; - - length = 4 * length24 / 3; - intbuf = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - buf = (char *)intbuf; - - /* convert 24 bit DSP messages to a 32 bit integer */ - for (i = 0; i < length24; i += 3) { - int tmp = (buf24[i] << 16) + (buf24[i + 1] << 8) + buf24[i + 2]; - /* Sign extend to 32-bit from 24-bit */ - intbuf[idx++] = ((int32_t)tmp << 8) >> 8; - } - } - - /* Only create multi-msg when the dsp is cold */ - if (tfa->ext_dsp == 1) { - /* Creating the multi-msg */ - error = tfa_tib_dsp_msgmulti(tfa, length, buf); - if (error == Tfa98xx_Error_Fail) - return Tfa98xx_Error_Fail; - - /* if the buffer is full we need to send the existing message and add the current message */ - if (error == Tfa98xx_Error_Buffer_too_small) { - int len; - - /* (a) send the existing (full) message */ - blob = kmalloc(64 * 1024, GFP_KERNEL); // max length is 64k - len = tfa_tib_dsp_msgmulti(tfa, -1, (const char *)blob); - if (tfa->verbose) { - pr_debug("Multi-message buffer full. Sending multi-message, length=%d\n", len); - } - if (tfa->has_msg == 0) /* via i2c */ { - /* Send tot the target selected */ - error = (tfa->dev_ops.dsp_msg)(tfa, len, (const char *)blob); - } else { /* via msg hal */ - error = tfa98xx_write_dsp(tfa, len, (const char *)blob); - } - kfree(blob); - - /* (b) add the current DSP message to a new multi-message */ - error = tfa_tib_dsp_msgmulti(tfa, length, buf); - if (error == Tfa98xx_Error_Fail) { - return Tfa98xx_Error_Fail; - } - } - - lastmessage = error; - - /* When the lastmessage is done we can send the multi-msg to the target */ - if (lastmessage == 1) { - - /* Get the full multi-msg data */ - blob = kmalloc(64 * 1024, GFP_KERNEL); //max length is 64k - length = tfa_tib_dsp_msgmulti(tfa, -1, (const char *)blob); - - if (tfa->verbose) - pr_debug("Last message for the multi-message received. Multi-message length=%d\n", length); - - if (tfa->has_msg == 0) /* via i2c */ { - /* Send tot the target selected */ - error = (tfa->dev_ops.dsp_msg)(tfa, length, (const char *)blob); - } else { /* via msg hal */ - error = tfa98xx_write_dsp(tfa, length, (const char *)blob); - } - - kfree(blob); /* Free the kmalloc blob */ - lastmessage = 0; /* reset to be able to re-start */ - } - } else { - if (tfa->has_msg == 0) /* via i2c */ { - error = (tfa->dev_ops.dsp_msg)(tfa, length, buf); - } else { /* via msg hal */ - error = tfa98xx_write_dsp(tfa, length, (const char *)buf); - } - } - - if (error != Tfa98xx_Error_Ok) - error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ - - /* DSP verbose has argument 0x04 */ - if ((tfa->verbose & 0x04) != 0) { - pr_debug("DSP w [%d]: ", length); - for (i = 0; i < length; i++) - pr_debug("0x%02x ", (uint8_t)buf[i]); - pr_debug("\n"); - } - - if (tfa->convert_dsp32) { - kmem_cache_free(tfa->cachep, intbuf); - } - - return error; -} - -enum Tfa98xx_Error dsp_msg_read(struct tfa_device *tfa, int length24, unsigned char *bytes24) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int i; - int length = length24; - unsigned char *bytes = bytes24; - - if (tfa->convert_dsp32) { - length = 4 * length24 / 3; - bytes = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - } - - if (tfa->has_msg == 0) /* via i2c */ { - error = (tfa->dev_ops.dsp_msg_read)(tfa, length, bytes); - } else { /* via msg hal */ - error = tfa98xx_read_dsp(tfa, length, bytes); - } - - if (error != Tfa98xx_Error_Ok) - error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ - - /* DSP verbose has argument 0x04 */ - if ((tfa->verbose & 0x04) != 0) { - pr_debug("DSP R [%d]: ", length); - for (i = 0; i < length; i++) - pr_debug("0x%02x ", (uint8_t)bytes[i]); - pr_debug("\n"); - } - - if (tfa->convert_dsp32) { - int idx = 0; - - /* convert 32 bit LE to 24 bit BE */ - for (i = 0; i < length; i += 4) { - bytes24[idx++] = bytes[i + 2]; - bytes24[idx++] = bytes[i + 1]; - bytes24[idx++] = bytes[i + 0]; - } - - kmem_cache_free(tfa->cachep, bytes); - } - - return error; -} - -enum Tfa98xx_Error reg_read(struct tfa_device *tfa, unsigned char subaddress, unsigned short *value) -{ - enum Tfa98xx_Error error; - - error = (tfa->dev_ops.reg_read)(tfa, subaddress, value); - if (error != Tfa98xx_Error_Ok) - error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ - - return error; -} - -enum Tfa98xx_Error reg_write(struct tfa_device *tfa, unsigned char subaddress, unsigned short value) -{ - enum Tfa98xx_Error error; - - error = (tfa->dev_ops.reg_write)(tfa, subaddress, value); - if (error != Tfa98xx_Error_Ok) - error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ - - return error; -} - -enum Tfa98xx_Error mem_read(struct tfa_device *tfa, unsigned int start_offset, int num_words, int *pValues) -{ - enum Tfa98xx_Error error; - - error = (tfa->dev_ops.mem_read)(tfa, start_offset, num_words, pValues); - if (error != Tfa98xx_Error_Ok) - error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ - - return error; -} - -enum Tfa98xx_Error mem_write(struct tfa_device *tfa, unsigned short address, int value, int memtype) -{ - enum Tfa98xx_Error error; - - error = (tfa->dev_ops.mem_write)(tfa, address, value, memtype); - if (error != Tfa98xx_Error_Ok) - error = (enum Tfa98xx_Error) (error + Tfa98xx_Error_RpcBase); /* Get actual error code from softDSP */ - - return error; -} - - -/* - * write/read raw msg functions : - * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. - * The functions will return immediately and do not not wait for DSP reponse. - */ -#define MAX_WORDS (300) -enum Tfa98xx_Error tfa_dsp_msg(struct tfa_device *tfa, int length, const char *buf) -{ - enum Tfa98xx_Error error; - int tries, rpc_status = Tfa98xx_I2C_Req_Done; - - /* write the message and notify the DSP */ - error = tfa_dsp_msg_write(tfa, length, buf); - if (error != Tfa98xx_Error_Ok) - return error; - - /* get the result from the DSP (polling) */ - for (tries = TFA98XX_WAITRESULT_NTRIES; tries > 0; tries--) { - error = tfa_dsp_msg_status(tfa, &rpc_status); - if (error == Tfa98xx_Error_Ok && rpc_status == Tfa98xx_I2C_Req_Done) - break; - /* If the rpc status is a specific error we want to know it. - * If it is busy or not running it should retry - */ - if (rpc_status != Tfa98xx_I2C_Req_Busy && rpc_status != Tfa98xx_DSP_Not_Running) - break; - } - - if (rpc_status != Tfa98xx_I2C_Req_Done) { - /* DSP RPC call returned an error */ - error = (enum Tfa98xx_Error) (rpc_status + Tfa98xx_Error_RpcBase); - pr_debug("DSP msg status: %d (%s)\n", rpc_status, tfa98xx_get_i2c_status_id_string(rpc_status)); - } - return error; -} - -/** - * write/read raw msg functions: - * the buffer is provided in little endian format, each word occupying 3 bytes, length is in bytes. - * The functions will return immediately and do not not wait for DSP reponse. - * An ID is added to modify the command-ID - */ -enum Tfa98xx_Error tfa_dsp_msg_id(struct tfa_device *tfa, int length, const char *buf, uint8_t cmdid[3]) -{ - enum Tfa98xx_Error error; - int tries, rpc_status = Tfa98xx_I2C_Req_Done; - - /* write the message and notify the DSP */ - error = tfa_dsp_msg_write_id(tfa, length, buf, cmdid); - if (error != Tfa98xx_Error_Ok) - return error; - - /* get the result from the DSP (polling) */ - for (tries = TFA98XX_WAITRESULT_NTRIES; tries > 0; tries--) { - error = tfa_dsp_msg_status(tfa, &rpc_status); - if (error == Tfa98xx_Error_Ok && rpc_status == Tfa98xx_I2C_Req_Done) - break; - } - - if (rpc_status != Tfa98xx_I2C_Req_Done) { - /* DSP RPC call returned an error */ - error = (enum Tfa98xx_Error) (rpc_status + Tfa98xx_Error_RpcBase); - pr_debug("DSP msg status: %d (%s)\n", rpc_status, tfa98xx_get_i2c_status_id_string(rpc_status)); - } - return error; -} - -/* read the return code for the RPC call */ -TFA_INTERNAL enum Tfa98xx_Error -tfa98xx_check_rpc_status(struct tfa_device *tfa, int *pRpcStatus) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - /* the value to sent to the * CF_CONTROLS register: cf_req=00000000, - * cf_int=0, cf_aif=0, cf_dmem=XMEM=01, cf_rst_dsp=0 */ - unsigned short cf_ctrl = 0x0002; - /* memory address to be accessed (0: Status, 1: ID, 2: parameters) */ - unsigned short cf_mad = 0x0000; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - if (pRpcStatus == NULL) - return Tfa98xx_Error_Bad_Parameter; - - /* 1) write DMEM=XMEM to the DSP XMEM */ - { - /* minimize the number of I2C transactions by making use of the autoincrement in I2C */ - unsigned char buffer[4]; - /* first the data for CF_CONTROLS */ - buffer[0] = (unsigned char)((cf_ctrl >> 8) & 0xFF); - buffer[1] = (unsigned char)(cf_ctrl & 0xFF); - /* write the contents of CF_MAD which is the subaddress following CF_CONTROLS */ - buffer[2] = (unsigned char)((cf_mad >> 8) & 0xFF); - buffer[3] = (unsigned char)(cf_mad & 0xFF); - error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_CONTROLS, sizeof(buffer), buffer); - } - if (error == Tfa98xx_Error_Ok) { - /* read 1 word (24 bit) from XMEM */ - error = tfa98xx_dsp_read_mem(tfa, 0, 1, pRpcStatus); - } - - return error; -} - -/***************************** xmem only **********************************/ -enum Tfa98xx_Error - tfa98xx_dsp_read_mem(struct tfa_device *tfa, - unsigned int start_offset, int num_words, int *pValues) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned char *bytes; - int burst_size; /* number of words per burst size */ - const int bytes_per_word = 3; - int dmem; - int num_bytes; - int *p; - - bytes = (unsigned char *)kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - if (bytes == NULL) - return Tfa98xx_Error_Fail; - - /* If no offset is given, assume XMEM! */ - if (((start_offset >> 16) & 0xf) > 0) - dmem = (start_offset >> 16) & 0xf; - else - dmem = Tfa98xx_DMEM_XMEM; - - /* Remove offset from adress */ - start_offset = start_offset & 0xffff; - num_bytes = num_words * bytes_per_word; - p = pValues; - - TFA_SET_BF(tfa, DMEM, (uint16_t)dmem); - error = -TFA_WRITE_REG(tfa, MADD, (unsigned short)start_offset); - if (error != Tfa98xx_Error_Ok) - goto tfa98xx_dsp_read_mem_exit; - - for (; num_bytes > 0;) { - burst_size = ROUND_DOWN(tfa->buffer_size, bytes_per_word); - if (num_bytes < burst_size) - burst_size = num_bytes; - - _ASSERT(burst_size <= sizeof(bytes)); - error = tfa98xx_read_data(tfa, FAM_TFA98XX_CF_MEM, burst_size, bytes); - if (error != Tfa98xx_Error_Ok) - goto tfa98xx_dsp_read_mem_exit; - - tfa98xx_convert_bytes2data(burst_size, bytes, p); - - num_bytes -= burst_size; - p += burst_size / bytes_per_word; - } - -tfa98xx_dsp_read_mem_exit: - kmem_cache_free(tfa->cachep, bytes); - - return error; -} - - -enum Tfa98xx_Error - tfa98xx_dsp_write_mem_word(struct tfa_device *tfa, unsigned short address, int value, int memtype) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned char bytes[3]; - - TFA_SET_BF(tfa, DMEM, (uint16_t)memtype); - - error = -TFA_WRITE_REG(tfa, MADD, address); - if (error != Tfa98xx_Error_Ok) - return error; - - tfa98xx_convert_data2bytes(1, &value, bytes); - error = tfa98xx_write_data(tfa, FAM_TFA98XX_CF_MEM, 3, bytes); - - return error; -} - -enum Tfa98xx_Error tfa_cont_write_filterbank(struct tfa_device *tfa, TfaFilter_t *filter) -{ - unsigned char biquad_index; - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - for (biquad_index = 0; biquad_index < 10; biquad_index++) { - if (filter[biquad_index].enabled) { - error = tfa_dsp_cmd_id_write(tfa, MODULE_BIQUADFILTERBANK, - biquad_index + 1, //start @1 - sizeof(filter[biquad_index].biquad.bytes), - filter[biquad_index].biquad.bytes); - } else { - error = Tfa98xx_DspBiquad_Disable(tfa, biquad_index + 1); - } - if (error) return error; - - } - - return error; -} - -enum Tfa98xx_Error - Tfa98xx_DspBiquad_Disable(struct tfa_device *tfa, int biquad_index) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int coeff_buffer[BIQUAD_COEFF_SIZE]; - unsigned char bytes[3 + BIQUAD_COEFF_SIZE * 3]; - int nr = 0; - - if (biquad_index > TFA98XX_BIQUAD_NUM) - return Tfa98xx_Error_Bad_Parameter; - if (biquad_index < 1) - return Tfa98xx_Error_Bad_Parameter; - - /* make opcode */ - bytes[nr++] = 0; - bytes[nr++] = MODULE_BIQUADFILTERBANK + 128; - bytes[nr++] = (unsigned char)biquad_index; - - - /* set in correct order and format for the DSP */ - coeff_buffer[0] = (int)-8388608; /* -1.0f */ - coeff_buffer[1] = 0; - coeff_buffer[2] = 0; - coeff_buffer[3] = 0; - coeff_buffer[4] = 0; - coeff_buffer[5] = 0; - - /* convert to packed 24 */ - tfa98xx_convert_data2bytes(BIQUAD_COEFF_SIZE, coeff_buffer, &bytes[nr]); - nr += BIQUAD_COEFF_SIZE * 3; - - error = dsp_msg(tfa, nr, (char *)bytes); - - return error; -} - -/* wrapper for dsp_msg that adds opcode */ -enum Tfa98xx_Error tfa_dsp_cmd_id_write(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int num_bytes, - const unsigned char data[]) -{ - enum Tfa98xx_Error error; - unsigned char *buffer; - int nr = 0; - - buffer = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - if (buffer == NULL) - return Tfa98xx_Error_Fail; - - buffer[nr++] = tfa->spkr_select; - buffer[nr++] = module_id + 128; - buffer[nr++] = param_id; - - memcpy(&buffer[nr], data, num_bytes); - nr += num_bytes; - - error = dsp_msg(tfa, nr, (char *)buffer); - - kmem_cache_free(tfa->cachep, buffer); - - return error; -} - -/* wrapper for dsp_msg that adds opcode */ -/* this is as the former tfa98xx_dsp_get_param() */ -enum Tfa98xx_Error tfa_dsp_cmd_id_write_read(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int num_bytes, - unsigned char data[]) -{ - enum Tfa98xx_Error error; - unsigned char buffer[3]; - int nr = 0; - - if (num_bytes <= 0) { - pr_debug("Error: The number of READ bytes is smaller or equal to 0!\n"); - return Tfa98xx_Error_Fail; - } - - if ((tfa->is_probus_device) && (tfa->cnt->ndev == 1) && - (param_id == SB_PARAM_GET_RE25C || - param_id == SB_PARAM_GET_LSMODEL || - param_id == SB_PARAM_GET_ALGO_PARAMS)) { - /* Modifying the ID for GetRe25C */ - buffer[nr++] = 4; - } else { - buffer[nr++] = tfa->spkr_select; - } - buffer[nr++] = module_id + 128; - buffer[nr++] = param_id; - - error = dsp_msg(tfa, nr, (char *)buffer); - if (error != Tfa98xx_Error_Ok) - return error; - - /* read the data from the dsp */ - error = dsp_msg_read(tfa, num_bytes, data); - return error; -} - -/* wrapper for dsp_msg that adds opcode and 3 bytes required for coefs */ -enum Tfa98xx_Error tfa_dsp_cmd_id_coefs(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int num_bytes, - unsigned char data[]) -{ - enum Tfa98xx_Error error; - unsigned char buffer[2 * 3]; - int nr = 0; - - buffer[nr++] = tfa->spkr_select; - buffer[nr++] = module_id + 128; - buffer[nr++] = param_id; - - buffer[nr++] = 0; - buffer[nr++] = 0; - buffer[nr++] = 0; - - error = dsp_msg(tfa, nr, (char *)buffer); - if (error != Tfa98xx_Error_Ok) - return error; - - /* read the data from the dsp */ - error = dsp_msg_read(tfa, num_bytes, data); - - return error; -} - -/* wrapper for dsp_msg that adds opcode and 3 bytes required for MBDrcDynamics */ -enum Tfa98xx_Error tfa_dsp_cmd_id_MBDrc_dynamics(struct tfa_device *tfa, - unsigned char module_id, - unsigned char param_id, int index_subband, - int num_bytes, unsigned char data[]) -{ - enum Tfa98xx_Error error; - unsigned char buffer[2 * 3]; - int nr = 0; - - buffer[nr++] = tfa->spkr_select; - buffer[nr++] = module_id + 128; - buffer[nr++] = param_id; - - buffer[nr++] = 0; - buffer[nr++] = 0; - buffer[nr++] = (unsigned char)index_subband; - - error = dsp_msg(tfa, nr, (char *)buffer); - if (error != Tfa98xx_Error_Ok) - return error; - - /* read the data from the dsp */ - error = dsp_msg_read(tfa, num_bytes, data); - - return error; -} - -enum Tfa98xx_Error - tfa98xx_dsp_write_preset(struct tfa_device *tfa, int length, - const unsigned char *p_preset_bytes) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - if (p_preset_bytes != NULL) { - /* by design: keep the data opaque and no - * interpreting/calculation */ - error = tfa_dsp_cmd_id_write(tfa, MODULE_SPEAKERBOOST, - SB_PARAM_SET_PRESET, length, - p_preset_bytes); - } else { - error = Tfa98xx_Error_Bad_Parameter; - } - return error; -} - -/* - * get features from MTP - */ -enum Tfa98xx_Error - tfa98xx_dsp_get_hw_feature_bits(struct tfa_device *tfa, int *features) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - uint32_t value; - uint16_t mtpbf; - - /* return the cache data if it's valid */ - if (tfa->hw_feature_bits != -1) { - *features = tfa->hw_feature_bits; - } else { - /* for tfa1 check if we have clock */ - if (tfa->tfa_family == 1) { - int status; - - tfa98xx_dsp_system_stable(tfa, &status); - if (!status) { - get_hw_features_from_cnt(tfa, features); - /* skip reading MTP: */ - return (*features == -1) ? Tfa98xx_Error_Fail : Tfa98xx_Error_Ok; - } - mtpbf = 0x850f; /* MTP5 for tfa1,16 bits */ - } else - mtpbf = 0xf907; /* MTP9 for tfa2, 8 bits */ - value = tfa_read_reg(tfa, mtpbf) & 0xffff; - *features = tfa->hw_feature_bits = value; - } - - return error; -} - -enum Tfa98xx_Error - tfa98xx_dsp_get_sw_feature_bits(struct tfa_device *tfa, int features[2]) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - const int byte_size = 2 * 3; - unsigned char bytes[2 * 3]; - - /* return the cache data if it's valid */ - if (tfa->sw_feature_bits[0] != -1) { - features[0] = tfa->sw_feature_bits[0]; - features[1] = tfa->sw_feature_bits[1]; - } else { - /* for tfa1 check if we have clock */ - if (tfa->tfa_family == 1) { - int status; - - tfa98xx_dsp_system_stable(tfa, &status); - if (!status) { - get_sw_features_from_cnt(tfa, features); - /* skip reading MTP: */ - return (features[0] == -1) ? Tfa98xx_Error_Fail : Tfa98xx_Error_Ok; - } - } - error = tfa_dsp_cmd_id_write_read(tfa, MODULE_FRAMEWORK, - FW_PAR_ID_GET_FEATURE_INFO, byte_size, bytes); - - if (error != Tfa98xx_Error_Ok) { - /* old ROM code may respond with Tfa98xx_Error_RpcParamId */ - return error; - } - - tfa98xx_convert_bytes2data(byte_size, bytes, features); - } - return error; -} - -enum Tfa98xx_Error tfa98xx_dsp_get_state_info(struct tfa_device *tfa, unsigned char bytes[], unsigned int *statesize) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int bSupportFramework = 0; - unsigned int stateSize = 9; - - err = tfa98xx_dsp_support_framework(tfa, &bSupportFramework); - if (err == Tfa98xx_Error_Ok) { - if (bSupportFramework) { - err = tfa_dsp_cmd_id_write_read(tfa, MODULE_FRAMEWORK, - FW_PARAM_GET_STATE, 3 * stateSize, bytes); - } else { - /* old ROM code, ask SpeakerBoost and only do first portion */ - stateSize = 8; - err = tfa_dsp_cmd_id_write_read(tfa, MODULE_SPEAKERBOOST, - SB_PARAM_GET_STATE, 3 * stateSize, bytes); - } - } - - *statesize = stateSize; - - return err; -} - -enum Tfa98xx_Error tfa98xx_dsp_support_drc(struct tfa_device *tfa, int *pbSupportDrc) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - *pbSupportDrc = 0; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - if (tfa->supportDrc != supportNotSet) { - *pbSupportDrc = (tfa->supportDrc == supportYes); - } else { - int featureBits[2]; - - error = tfa98xx_dsp_get_sw_feature_bits(tfa, featureBits); - if (error == Tfa98xx_Error_Ok) { - /* easy case: new API available */ - /* bit=0 means DRC enabled */ - *pbSupportDrc = (featureBits[0] & FEATURE1_DRC) == 0; - } else if (error == Tfa98xx_Error_RpcParamId) { - /* older ROM code, doesn't support it */ - *pbSupportDrc = 0; - error = Tfa98xx_Error_Ok; - } - /* else some other error, return transparently */ - /* pbSupportDrc only changed when error == Tfa98xx_Error_Ok */ - - if (error == Tfa98xx_Error_Ok) { - tfa->supportDrc = *pbSupportDrc ? supportYes : supportNo; - } - } - return error; -} - -enum Tfa98xx_Error - tfa98xx_dsp_support_framework(struct tfa_device *tfa, int *pbSupportFramework) -{ - int featureBits[2] = { 0, 0 }; - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - _ASSERT(pbSupportFramework != 0); - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - if (tfa->supportFramework != supportNotSet) { - if (tfa->supportFramework == supportNo) - *pbSupportFramework = 0; - else - *pbSupportFramework = 1; - } else { - error = tfa98xx_dsp_get_sw_feature_bits(tfa, featureBits); - if (error == Tfa98xx_Error_Ok) { - *pbSupportFramework = 1; - tfa->supportFramework = supportYes; - } else { - *pbSupportFramework = 0; - tfa->supportFramework = supportNo; - error = Tfa98xx_Error_Ok; - } - } - - /* *pbSupportFramework only changed when error == Tfa98xx_Error_Ok */ - return error; -} - -enum Tfa98xx_Error - tfa98xx_dsp_write_speaker_parameters(struct tfa_device *tfa, - int length, const unsigned char *p_speaker_bytes) -{ - enum Tfa98xx_Error error; - int bSupportDrc; - - if (p_speaker_bytes != NULL) { - /* by design: keep the data opaque and no - * interpreting/calculation */ - /* Use long WaitResult retry count */ - error = tfa_dsp_cmd_id_write( - tfa, - MODULE_SPEAKERBOOST, - SB_PARAM_SET_LSMODEL, length, - p_speaker_bytes); - } else { - error = Tfa98xx_Error_Bad_Parameter; - } - - if (error != Tfa98xx_Error_Ok) - return error; - - error = tfa98xx_dsp_support_drc(tfa, &bSupportDrc); - if (error != Tfa98xx_Error_Ok) - return error; - - if (bSupportDrc) { - /* Need to set AgcGainInsert back to PRE, - * as the SetConfig forces it to POST */ - uint8_t bytes[3] = { 0, 0, 0 }; - - error = tfa_dsp_cmd_id_write(tfa, - MODULE_SPEAKERBOOST, - SB_PARAM_SET_AGCINS, - 3, - bytes); - } - - return error; -} - -enum Tfa98xx_Error - tfa98xx_dsp_write_config(struct tfa_device *tfa, int length, - const unsigned char *p_config_bytes) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int bSupportDrc; - - error = tfa_dsp_cmd_id_write(tfa, - MODULE_SPEAKERBOOST, - SB_PARAM_SET_CONFIG, length, - p_config_bytes); - if (error != Tfa98xx_Error_Ok) - return error; - - error = tfa98xx_dsp_support_drc(tfa, &bSupportDrc); - if (error != Tfa98xx_Error_Ok) - return error; - - if (bSupportDrc) { - /* Need to set AgcGainInsert back to PRE, - * as the SetConfig forces it to POST */ - uint8_t bytes[3] = { 0, 0, 0 }; - - error = tfa_dsp_cmd_id_write(tfa, - MODULE_SPEAKERBOOST, - SB_PARAM_SET_AGCINS, - 3, - bytes); - } - - return error; -} - -/* load all the parameters for the DRC settings from a file */ -enum Tfa98xx_Error tfa98xx_dsp_write_drc(struct tfa_device *tfa, - int length, const unsigned char *p_drc_bytes) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - if (p_drc_bytes != NULL) { - error = tfa_dsp_cmd_id_write(tfa, - MODULE_SPEAKERBOOST, - SB_PARAM_SET_DRC, length, - p_drc_bytes); - - } else { - error = Tfa98xx_Error_Bad_Parameter; - } - return error; -} - -enum Tfa98xx_Error tfa98xx_powerdown(struct tfa_device *tfa, int powerdown) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - error = TFA_SET_BF(tfa, PWDN, (uint16_t)powerdown); - - if (powerdown) { - /* Workaround for ticket PLMA5337 */ - if (tfa->tfa_family == 2) { - TFA_SET_BF_VOLATILE(tfa, AMPE, 0); - } - } - - return error; -} - -enum Tfa98xx_Error - tfa98xx_select_mode(struct tfa_device *tfa, enum Tfa98xx_Mode mode) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - if (error == Tfa98xx_Error_Ok) { - switch (mode) { - - default: - error = Tfa98xx_Error_Bad_Parameter; - } - } - - return error; -} - -int tfa_set_bf(struct tfa_device *tfa, const uint16_t bf, const uint16_t value) -{ - enum Tfa98xx_Error err; - uint16_t regvalue, msk, oldvalue; - - /* - * bitfield enum: - * - 0..3 : len - * - 4..7 : pos - * - 8..15 : address - */ - uint8_t len = bf & 0x0f; - uint8_t pos = (bf >> 4) & 0x0f; - uint8_t address = (bf >> 8) & 0xff; - - err = reg_read(tfa, address, ®value); - if (err) { - pr_err("Error getting bf :%d\n", -err); - return -err; - } - - oldvalue = regvalue; - msk = ((1 << (len + 1)) - 1) << pos; - regvalue &= ~msk; - regvalue |= value << pos; - - /* Only write when the current register value is not the same as the new value */ - if (oldvalue != regvalue) { - err = reg_write(tfa, address, regvalue); - if (err) { - pr_err("Error setting bf :%d\n", -err); - return -err; - } - } - - return 0; -} - -int tfa_set_bf_volatile(struct tfa_device *tfa, const uint16_t bf, const uint16_t value) -{ - enum Tfa98xx_Error err; - uint16_t regvalue, msk; - - /* - * bitfield enum: - * - 0..3 : len - * - 4..7 : pos - * - 8..15 : address - */ - uint8_t len = bf & 0x0f; - uint8_t pos = (bf >> 4) & 0x0f; - uint8_t address = (bf >> 8) & 0xff; - - err = reg_read(tfa, address, ®value); - if (err) { - pr_err("Error getting bf :%d\n", -err); - return -err; - } - - msk = ((1 << (len + 1)) - 1) << pos; - regvalue &= ~msk; - regvalue |= value << pos; - - err = reg_write(tfa, address, regvalue); - if (err) { - pr_err("Error setting bf :%d\n", -err); - return -err; - } - - return 0; -} - -int tfa_get_bf(struct tfa_device *tfa, const uint16_t bf) -{ - enum Tfa98xx_Error err; - uint16_t regvalue, msk; - uint16_t value; - - /* - * bitfield enum: - * - 0..3 : len - * - 4..7 : pos - * - 8..15 : address - */ - uint8_t len = bf & 0x0f; - uint8_t pos = (bf >> 4) & 0x0f; - uint8_t address = (bf >> 8) & 0xff; - - err = reg_read(tfa, address, ®value); - if (err) { - pr_err("Error getting bf :%d\n", -err); - return -err; - } - - msk = ((1 << (len + 1)) - 1) << pos; - regvalue &= msk; - value = regvalue >> pos; - - return value; -} - -int tfa_set_bf_value(const uint16_t bf, const uint16_t bf_value, uint16_t *p_reg_value) -{ - uint16_t regvalue, msk; - - /* - * bitfield enum: - * - 0..3 : len - * - 4..7 : pos - * - 8..15 : address - */ - uint8_t len = bf & 0x0f; - uint8_t pos = (bf >> 4) & 0x0f; - - regvalue = *p_reg_value; - - msk = ((1 << (len + 1)) - 1) << pos; - regvalue &= ~msk; - regvalue |= bf_value << pos; - - *p_reg_value = regvalue; - - return 0; -} - -uint16_t tfa_get_bf_value(const uint16_t bf, const uint16_t reg_value) -{ - uint16_t msk, value; - - /* - * bitfield enum: - * - 0..3 : len - * - 4..7 : pos - * - 8..15 : address - */ - uint8_t len = bf & 0x0f; - uint8_t pos = (bf >> 4) & 0x0f; - - msk = ((1 << (len + 1)) - 1) << pos; - value = (reg_value & msk) >> pos; - - return value; -} - - -int tfa_write_reg(struct tfa_device *tfa, const uint16_t bf, const uint16_t reg_value) -{ - enum Tfa98xx_Error err; - - /* bitfield enum - 8..15 : address */ - uint8_t address = (bf >> 8) & 0xff; - - err = reg_write(tfa, address, reg_value); - if (err) - return -err; - - return 0; -} - -int tfa_read_reg(struct tfa_device *tfa, const uint16_t bf) -{ - enum Tfa98xx_Error err; - uint16_t regvalue; - - /* bitfield enum - 8..15 : address */ - uint8_t address = (bf >> 8) & 0xff; - - err = reg_read(tfa, address, ®value); - if (err) - return -err; - - return regvalue; -} - -/* - * powerup the coolflux subsystem and wait for it - */ -enum Tfa98xx_Error tfa_cf_powerup(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int tries, status; - - /* power on the sub system */ - TFA_SET_BF_VOLATILE(tfa, PWDN, 0); - - // wait until everything is stable, in case clock has been off - if (tfa->verbose) - pr_info("Waiting for DSP system stable...\n"); - for (tries = CFSTABLE_TRIES; tries > 0; tries--) { - err = tfa98xx_dsp_system_stable(tfa, &status); - _ASSERT(err == Tfa98xx_Error_Ok); - if (status) - break; - else - msleep_interruptible(10); /* wait 10ms to avoid busload */ - } - if (tries == 0) {// timedout - pr_err("DSP subsystem start timed out\n"); - return Tfa98xx_Error_StateTimedOut; - } - - return err; -} - -/* - * Enable/Disable the I2S output for TFA1 devices - * without TDM interface - */ -static enum Tfa98xx_Error tfa98xx_aec_output(struct tfa_device *tfa, int enable) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - if ((tfa->daimap & Tfa98xx_DAI_TDM) == Tfa98xx_DAI_TDM) - return err; - - if (tfa->tfa_family == 1) - err = -tfa_set_bf(tfa, TFA1_BF_I2SDOE, (enable != 0)); - else { - pr_err("I2SDOE on unsupported family\n"); - err = Tfa98xx_Error_Not_Supported; - } - - return err; -} - -/* - * Print the current state of the hardware manager - * Device manager status information, man_state from TFA9888_N1B_I2C_regmap_V12 - */ -int is_94_N2_device(struct tfa_device *tfa) -{ - return ((((tfa->rev) & 0xff) == 0x94) && (((tfa->rev >> 8) & 0xff) > 0x1a)); -} -enum Tfa98xx_Error show_current_state(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int manstate = -1; - - if (tfa->tfa_family == 2 && tfa->verbose) { - if (is_94_N2_device(tfa)) - manstate = tfa_get_bf(tfa, TFA9894N2_BF_MANSTATE); - else - manstate = TFA_GET_BF(tfa, MANSTATE); - if (manstate < 0) - return -manstate; - - pr_debug("Current HW manager state: "); - - switch (manstate) { - case 0: pr_debug("power_down_state\n"); - break; - case 1: pr_debug("wait_for_source_settings_state\n"); - break; - case 2: pr_debug("connnect_pll_input_state\n"); - break; - case 3: pr_debug("disconnect_pll_input_state\n"); - break; - case 4: pr_debug("enable_pll_state\n"); - break; - case 5: pr_debug("enable_cgu_state\n"); - break; - case 6: pr_debug("init_cf_state\n"); - break; - case 7: pr_debug("enable_amplifier_state\n"); - break; - case 8: pr_debug("alarm_state\n"); - break; - case 9: pr_debug("operating_state\n"); - break; - case 10: pr_debug("mute_audio_state\n"); - break; - case 11: pr_debug("disable_cgu_pll_state\n"); - break; - default: - pr_debug("Unable to find current state\n"); - break; - } - } - - return err; -} - -enum Tfa98xx_Error tfaGetFwApiVersion(struct tfa_device *tfa, unsigned char *pFirmwareVersion) -{ - enum Tfa98xx_Error err = 0; - char cmd_buf[4]; - int cmd_len, res_len; - - if (tfa == NULL) - return Tfa98xx_Error_Bad_Parameter; - if (!tfa->is_probus_device) - { - err = mem_read(tfa, FW_VAR_API_VERSION, 1, (int *)pFirmwareVersion); - if (err) { - pr_debug("%s Error: Unable to get API Version from DSP\n", __func__); - return err; - } - } else - { - cmd_len = 0x03; - - /* GetAPI: Command is 0x00 0x80 0xFE */ - cmd_buf[0] = 0x00; - cmd_buf[1] = 0x80; - cmd_buf[2] = 0xFE; - - /* Write the command.*/ - - err = tfa98xx_write_dsp(tfa, cmd_len, (const char *)cmd_buf); - - /* Read the API Value.*/ - if (err == 0) - { - res_len = 3; - err = tfa98xx_read_dsp(tfa, res_len, (unsigned char *)pFirmwareVersion); - - } - } - return err; - -} - - -/* - * start the speakerboost algorithm - * this implies a full system startup when the system was not already started - * - */ -enum Tfa98xx_Error tfaRunSpeakerBoost(struct tfa_device *tfa, int force, int profile) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int value; - - if (force) { - err = tfaRunColdStartup(tfa, profile); - if (err) return err; - } - - /* Returns 1 when device is "cold" and 0 when device is warm */ - value = tfa_is_cold(tfa); - - pr_debug("Startup of device [%s] is a %sstart\n", tfaContDeviceName(tfa->cnt, tfa->dev_idx), value ? "cold" : "warm"); - /* cold start and not tap profile */ - if (value) { - /* Run startup and write all files */ - err = tfaRunSpeakerStartup(tfa, force, profile); - if (err) { - pr_err("tfaRunSpeakerStartup error %d\n", err); - return err; - } - /* Save the current profile and set the vstep to 0 */ - /* This needs to be overwriten even in CF bypass */ - tfa_dev_set_swprof(tfa, (unsigned short)profile); - tfa_dev_set_swvstep(tfa, 0); - - /* Synchonize I/V delay on 96/97 at cold start */ - if ((tfa->tfa_family == 1) && (tfa->daimap == Tfa98xx_DAI_TDM)) - tfa->sync_iv_delay = 1; - } - - return err; -} - -enum Tfa98xx_Error tfaRunSpeakerStartup(struct tfa_device *tfa, int force, int profile) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - pr_debug("%s force=%d profile=%d\n", __func__, force, profile); - if (!force) { // in case of force CF already runnning - err = tfaRunStartup(tfa, profile); - PRINT_ASSERT(err); - if (err) - return err; - - /* Startup with CF in bypass then return here */ - if (tfa_cf_enabled(tfa) == 0) - return err; - - /* respond to external DSP: -1:none, 0:no_dsp, 1:cold, 2:warm */ - if (tfa->ext_dsp == -1) { - err = tfaRunStartDSP(tfa); - if (err) - return err; - } - } - - /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1 */ - tfa98xx_auto_copy_mtp_to_iic(tfa); - - err = tfaGetFwApiVersion(tfa, (unsigned char *)&tfa->fw_itf_ver[0]); - if (err) { - pr_debug("[%s] cannot get FWAPI error = %d\n", __func__, err); - return err; - } - /* write all the files from the device list */ - err = tfaContWriteFiles(tfa); - if (err) { - pr_debug("[%s] tfaContWriteFiles error = %d\n", __func__, err); - return err; - } - - /* write all the files from the profile list (use volumstep 0) */ - err = tfaContWriteFilesProf(tfa, profile, 0); - if (err) { - pr_debug("[%s] tfaContWriteFilesProf error = %d\n", __func__, err); - return err; - } - - return err; -} - -/* - * Run calibration - */ -enum Tfa98xx_Error tfaRunSpeakerCalibration(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int calibrateDone; - - /* return if there is no audio running */ - if ((tfa->tfa_family == 2) && TFA_GET_BF(tfa, NOCLK)) - return Tfa98xx_Error_NoClock; - - /* When MTPOTC is set (cal=once) unlock key2 */ - if (TFA_GET_BF(tfa, MTPOTC) == 1) { - tfa98xx_key2(tfa, 0); - } - - /* await calibration, this should return ok */ - err = tfaRunWaitCalibration(tfa, &calibrateDone); - if (err == Tfa98xx_Error_Ok) { - err = tfa_dsp_get_calibration_impedance(tfa); - PRINT_ASSERT(err); - } - - /* When MTPOTC is set (cal=once) re-lock key2 */ - if (TFA_GET_BF(tfa, MTPOTC) == 1) { - tfa98xx_key2(tfa, 1); - } - - return err; -} - -enum Tfa98xx_Error tfaRunColdboot(struct tfa_device *tfa, int state) -{ -#define CF_CONTROL 0x8100 - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int tries = 10; - - /* repeat set ACS bit until set as requested */ - while (state != TFA_GET_BF(tfa, ACS)) { - /* set colstarted in CF_CONTROL to force ACS */ - err = mem_write(tfa, CF_CONTROL, state, Tfa98xx_DMEM_IOMEM); - PRINT_ASSERT(err); - - if (tries-- == 0) { - pr_debug("coldboot (ACS) did not %s\n", state ? "set" : "clear"); - return Tfa98xx_Error_Other; - } - } - - return err; -} - - - -/* - * load the patch if any - * else tell no loaded - */ -static enum Tfa98xx_Error tfa_run_load_patch(struct tfa_device *tfa) -{ - return tfaContWritePatch(tfa); -} - -/* - * this will load the patch witch will implicitly start the DSP - * if no patch is available the DPS is started immediately - */ -enum Tfa98xx_Error tfaRunStartDSP(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - err = tfa_run_load_patch(tfa); - if (err) { /* patch load is fatal so return immediately*/ - return err; - } - - /* Clear count_boot, should be reset to 0 before the DSP reset is released */ - err = mem_write(tfa, 512, 0, Tfa98xx_DMEM_XMEM); - PRINT_ASSERT(err); - - /* Reset DSP once for sure after initializing */ - if (err == Tfa98xx_Error_Ok) { - err = tfa98xx_dsp_reset(tfa, 0); - PRINT_ASSERT(err); - } - - /* Sample rate is needed to set the correct tables */ - err = tfa98xx_dsp_write_tables(tfa, TFA_GET_BF(tfa, AUDFS)); - PRINT_ASSERT(err); - - return err; -} - -/* - * start the clocks and wait until the AMP is switching - * on return the DSP sub system will be ready for loading - */ -enum Tfa98xx_Error tfaRunStartup(struct tfa_device *tfa, int profile) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - TfaDeviceList_t *dev = tfaContDevice(tfa->cnt, tfa->dev_idx); - int i, noinit = 0, audfs = 0, fractdel = 0; - - if (dev == NULL) - return Tfa98xx_Error_Fail; - - if (dev->bus) /* no i2c device, do nothing */ - return Tfa98xx_Error_Ok; - - /* process the device list to see if the user implemented the noinit */ - for (i = 0; i < dev->length; i++) { - if (dev->list[i].type == dscNoInit) { - noinit = 1; - break; - } - } - - if (!noinit) { - /* Read AUDFS & FRACTDEL prior to (re)init. */ - audfs = TFA_GET_BF(tfa, AUDFS); - fractdel = TFA_GET_BF(tfa, FRACTDEL); - /* load the optimal TFA98XX in HW settings */ - err = tfa98xx_init(tfa); - PRINT_ASSERT(err); - - /* Restore audfs & fractdel after coldboot, so we can calibrate with correct fs setting. - * in case something else was given in cnt file, profile below will apply this. */ - TFA_SET_BF(tfa, AUDFS, audfs); - TFA_SET_BF(tfa, FRACTDEL, fractdel); - } else { - pr_debug("\nWarning: No init keyword found in the cnt file. Init is skipped!\n"); - } - - /* I2S settings to define the audio input properties - * these must be set before the subsys is up */ - // this will run the list until a non-register item is encountered - err = tfaContWriteRegsDev(tfa); // write device register settings - PRINT_ASSERT(err); - // also write register the settings from the default profile - // NOTE we may still have ACS=1 so we can switch sample rate here - err = tfaContWriteRegsProf(tfa, profile); - PRINT_ASSERT(err); - - /* Factory trimming for the Boost converter */ - tfa98xx_factory_trimmer(tfa); - - /* Go to the initCF state */ - tfa_dev_set_state(tfa, TFA_STATE_INIT_CF, strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, profile), ".cal") != NULL); - - err = show_current_state(tfa); - - return err; -} - -/* - * run the startup/init sequence and set ACS bit - */ -enum Tfa98xx_Error tfaRunColdStartup(struct tfa_device *tfa, int profile) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - err = tfaRunStartup(tfa, profile); - PRINT_ASSERT(err); - if (err) - return err; - - if (!tfa->is_probus_device) { - /* force cold boot */ - err = tfaRunColdboot(tfa, 1); // set ACS - PRINT_ASSERT(err); - if (err) - return err; - } - - /* start */ - err = tfaRunStartDSP(tfa); - PRINT_ASSERT(err); - - return err; -} - -/* - * - */ -enum Tfa98xx_Error tfaRunMute(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int status; - int tries = 0; - - /* signal the TFA98XX to mute */ - if (tfa->tfa_family == 1) { - err = tfa98xx_set_mute(tfa, Tfa98xx_Mute_Amplifier); - - if (err == Tfa98xx_Error_Ok) { - /* now wait for the amplifier to turn off */ - do { - status = TFA_GET_BF(tfa, SWS); - if (status != 0) - msleep_interruptible(10); /* wait 10ms to avoid busload */ - else - break; - tries++; - } while (tries < AMPOFFWAIT_TRIES); - - - if (tfa->verbose) - pr_debug("-------------------- muted --------------------\n"); - - /*The amplifier is always switching*/ - if (tries == AMPOFFWAIT_TRIES) - return Tfa98xx_Error_Other; - } - } - - return err; -} -/* - * - */ -enum Tfa98xx_Error tfaRunUnmute(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - /* signal the TFA98XX to mute */ - err = tfa98xx_set_mute(tfa, Tfa98xx_Mute_Off); - - if (tfa->verbose) - pr_debug("-------------------unmuted ------------------\n"); - - return err; -} - -static void individual_calibration_results(struct tfa_device *tfa) -{ - int value_P, value_S; - - /* Read the calibration result in xmem (529=primary channel) (530=secondary channel) */ - mem_read(tfa, 529, 1, &value_P); - mem_read(tfa, 530, 1, &value_S); - - if (value_P != 1 && value_S != 1) - pr_debug("Calibration failed on both channels!\n"); - else if (value_P != 1) { - pr_debug("Calibration failed on Primary (Left) channel!\n"); - TFA_SET_BF_VOLATILE(tfa, SSLEFTE, 0); /* Disable the sound for the left speaker */ - } else if (value_S != 1) { - pr_debug("Calibration failed on Secondary (Right) channel!\n"); - TFA_SET_BF_VOLATILE(tfa, SSRIGHTE, 0); /* Disable the sound for the right speaker */ - } - - TFA_SET_BF_VOLATILE(tfa, AMPINSEL, 0); /* Set amplifier input to TDM */ - TFA_SET_BF_VOLATILE(tfa, SBSL, 1); -} - -/* - * wait for calibrateDone - */ -enum Tfa98xx_Error tfaRunWaitCalibration(struct tfa_device *tfa, int *calibrateDone) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int tries = 0, mtp_busy = 1, tries_mtp_busy = 0; - - *calibrateDone = 0; - - /* in case of calibrate once wait for MTPEX */ - if (TFA_GET_BF(tfa, MTPOTC)) { - // Check if MTP_busy is clear! - while (tries_mtp_busy < MTPBWAIT_TRIES) - { - mtp_busy = tfa_dev_get_mtpb(tfa); - if (mtp_busy == 1) - msleep_interruptible(10); /* wait 10ms to avoid busload */ - else - break; - tries_mtp_busy++; - } - - if (tries_mtp_busy < MTPBWAIT_TRIES) { - /* Because of the msleep TFA98XX_API_WAITRESULT_NTRIES is way to long! - * Setting this to 25 will take it atleast 25*50ms = 1.25 sec - */ - while ((*calibrateDone == 0) && (tries < MTPEX_WAIT_NTRIES)) { - *calibrateDone = TFA_GET_BF(tfa, MTPEX); - if (*calibrateDone == 1) - break; - msleep_interruptible(50); /* wait 50ms to avoid busload */ - tries++; - } - - if (tries >= MTPEX_WAIT_NTRIES) { - tries = TFA98XX_API_WAITRESULT_NTRIES; - } - } else { - pr_err("MTP bussy after %d tries\n", MTPBWAIT_TRIES); - } - } - - /* poll xmem for calibrate always - * calibrateDone = 0 means "calibrating", - * calibrateDone = -1 (or 0xFFFFFF) means "fails" - * calibrateDone = 1 means calibration done - */ - while ((*calibrateDone != 1) && (tries < TFA98XX_API_WAITRESULT_NTRIES)) { - err = mem_read(tfa, TFA_FW_XMEM_CALIBRATION_DONE, 1, calibrateDone); - if (*calibrateDone == -1) - break; - tries++; - } - - if (*calibrateDone != 1) { - pr_err("Calibration failed!\n"); - err = Tfa98xx_Error_Bad_Parameter; - } else if (tries == TFA98XX_API_WAITRESULT_NTRIES) { - pr_debug("Calibration has timedout!\n"); - err = Tfa98xx_Error_StateTimedOut; - } else if (tries_mtp_busy == 1000) { - pr_err("Calibrate Failed: MTP_busy stays high!\n"); - err = Tfa98xx_Error_StateTimedOut; - } - - /* Give reason why calibration failed! */ - if (err != Tfa98xx_Error_Ok) { - if ((tfa->tfa_family == 2) && (TFA_GET_BF(tfa, REFCKSEL) == 1)) { - pr_err("Unable to calibrate the device with the internal clock!\n"); - } - } - - /* Check which speaker calibration failed. Only for 88C */ - if ((err != Tfa98xx_Error_Ok) && ((tfa->rev & 0x0FFF) == 0xc88)) { - individual_calibration_results(tfa); - } - - return err; -} - -/* - * tfa_dev_start will only do the basics: Going from powerdown to operating or a profile switch. - * for calibrating or akoustic shock handling use the tfa98xxCalibration function. - */ -/*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ -#ifdef __KERNEL__ -enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep, u8 pcm_format) -#else -enum tfa_error tfa_dev_start(struct tfa_device *tfa, int next_profile, int vstep) -#endif -/*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int active_profile = -1; - - pr_debug("entry...\n"); - /* Get currentprofile */ - active_profile = tfa_dev_get_swprof(tfa); - if (active_profile == 0xff) - active_profile = -1; - - /* TfaRun_SpeakerBoost implies un-mute */ - pr_debug("Active_profile:%s, next_profile:%s\n", - tfaContProfileName(tfa->cnt, tfa->dev_idx, active_profile), - tfaContProfileName(tfa->cnt, tfa->dev_idx, next_profile)); - - err = show_current_state(tfa); - - if (tfa->tfa_family == 1) { /* TODO move this to ini file */ - /* Enable I2S output on TFA1 devices without TDM */ - err = tfa98xx_aec_output(tfa, 1); - if (err != Tfa98xx_Error_Ok) - goto error_exit; - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. begin*/ -#ifdef __KERNEL__ - if ((tfa->tfa_family == 2) && (tfa->daimap & Tfa98xx_DAI_TDM)) { - //TFA_SET_BF(tfa, TDMSRCMAP, 2); /*the TDMSRCMAP should be set in cnt file.*/ - /* we should remove below settings from cnt file, otherwise will be overwrite by cnt file later.*/ - if (pcm_format == 16) { - TFA_SET_BF(tfa, TDMNBCK, 0); - TFA_SET_BF(tfa, TDMSLLN, 15); - TFA_SET_BF(tfa, TDMSSIZE, 15); - } else if ((pcm_format == 24) || (pcm_format == 32)) { - TFA_SET_BF(tfa, TDMNBCK, 2); - TFA_SET_BF(tfa, TDMSLLN, 31); - TFA_SET_BF(tfa, TDMSSIZE, 31); - } else { - err = Tfa98xx_Error_Bad_Parameter; - goto error_exit; - } - } -#endif - /*[nxp34663] CR: support 16bit/24bit/32bit audio data. end*/ - - } - - if (tfa->bus != 0) { /* non i2c */ -#ifndef __KERNEL__ - tfadsp_fw_start(tfa, next_profile, vstep); -#endif /* __KERNEL__ */ - } else { - /* Check if we need coldstart or ACS is set */ - err = show_current_state(tfa); - err = tfaRunSpeakerBoost(tfa, 0, next_profile); - if (err != Tfa98xx_Error_Ok) - goto error_exit; - - /* Make sure internal oscillator is running for DSP devices (non-dsp and max1 this is no-op) */ - tfa98xx_set_osc_powerdown(tfa, 0); - -#if 0 - tfa_dev_set_state(tfa, TFA_STATE_OPERATING | TFA_STATE_MUTE, 0); -#else - tfa_dev_set_state(tfa, TFA_STATE_OPERATING, 0); -#endif - pr_debug("[NXP] %s after implemented tfa_dev_set_state()\n", __func__); - } - active_profile = tfa_dev_get_swprof(tfa); - - /* Profile switching */ - if ((next_profile != active_profile && active_profile >= 0)) { - err = tfaContWriteProfile(tfa, next_profile, vstep); - if (err != Tfa98xx_Error_Ok) { - pr_err("tfaContWriteProfile failed %d\n", err); - goto error_exit; - } - } - - /* If the profile contains the .standby suffix go to powerdown - * else we should be in operating state - */ - if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, next_profile), ".standby") != NULL) { - tfa_dev_set_swprof(tfa, (unsigned short)next_profile); - tfa_dev_set_swvstep(tfa, (unsigned short)tfa->vstep); - goto error_exit; - } - - err = show_current_state(tfa); - -#ifndef __KERNEL__ - /* get current vstep*/ - tfa->vstep = tfa_dev_get_swvstep(tfa); -#endif - if ((TFA_GET_BF(tfa, CFE) != 0) && (vstep != tfa->vstep) && (vstep != -1)) { - err = tfaContWriteFilesVstep(tfa, next_profile, vstep); - if (err != Tfa98xx_Error_Ok) { - pr_err("tfaContWriteFilesVstep failed %d\n", err); - goto error_exit; - } - pr_debug("after implemented tfaContWriteFilesVstep()\n"); - } - - /* Always search and apply filters after a startup */ - err = tfa_set_filters(tfa, next_profile); - if (err != Tfa98xx_Error_Ok) { - pr_err("tfaContWriteFilesVstep failed %d\n", err); - goto error_exit; - } - - tfa_dev_set_swprof(tfa, (unsigned short)next_profile); - tfa_dev_set_swvstep(tfa, (unsigned short)vstep); - - /* PLMA5539: Gives information about current setting of powerswitch */ - if (tfa->verbose) { - if (!tfa98xx_powerswitch_is_enabled(tfa)) - pr_info("Device start without powerswitch enabled!\n"); - } - -error_exit: - pr_debug("[NXP] %s end...\n", __func__); - show_current_state(tfa); - if (err != Tfa98xx_Error_Ok) { - pr_err("TFA98xx Error code is %d\n", err); - return tfa_error_max; - } - return tfa_error_ok; -} - -enum tfa_error tfa_dev_stop(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int manstate = 0, retry = 0; - - /* mute */ - tfaRunMute(tfa); - - /* Make sure internal oscillator is not running for DSP devices (non-dsp and max1 this is no-op) */ - tfa98xx_set_osc_powerdown(tfa, 1); - - /* powerdown CF */ - err = tfa98xx_powerdown(tfa, 1); - if (err != Tfa98xx_Error_Ok) - goto error_exit; - - /* disable I2S output on TFA1 devices without TDM */ - err = tfa98xx_aec_output(tfa, 0); - - /* added by nxp34663 beging. */ - /* we should ensure the state machine in powerdown mode here. */ - manstate = TFA_GET_BF(tfa, MANSTATE); - while ((manstate >= 4) && (retry < 100)) { - pr_debug("%s waitting state machine goto powerdown. MANSTATE=%d\n", __func__, manstate); - msleep_interruptible(10); - manstate = TFA_GET_BF(tfa, MANSTATE); - retry++; - } - /* added by nxp34663 end. */ -error_exit: - if (err != Tfa98xx_Error_Ok) { - pr_err("TFA98xx Error code is %d\n", err); - return tfa_error_max; - } - - return tfa_error_ok; -} - -/* - * int registers and coldboot dsp - */ -int tfa_reset(struct tfa_device *tfa) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - int state = -1; - int retry_cnt = 0; - - /* Check device state. Print warning if reset is done from other state than powerdown (when verbose) */ - state = tfa_dev_get_state(tfa); - if (tfa->verbose) { - if (((tfa->tfa_family == 1) && state != TFA_STATE_RESET) || - ((tfa->tfa_family == 2) && state != TFA_STATE_POWERDOWN)) { - pr_info("WARNING: Device reset should be performed in POWERDOWN state\n"); - } - } - - /* Split TFA1 behavior from TFA2*/ - if (tfa->tfa_family == 1) { - err = TFA_SET_BF(tfa, I2CR, 1); - if (err) - return err; - err = tfa98xx_powerdown(tfa, 0); - if (err) - return err; - err = tfa_cf_powerup(tfa); - if (err) - return err; - err = tfaRunColdboot(tfa, 1); - if (err) - return err; - err = TFA_SET_BF(tfa, I2CR, 1); - } else { - /* Probus devices needs extra protection to ensure proper reset - behavior, this step is valid only in state other than powerdown */ - if (tfa->is_probus_device && state != TFA_STATE_POWERDOWN) { - err = TFA_SET_BF_VOLATILE(tfa, AMPE, 0); - if (err) - return err; - err = tfa98xx_powerdown(tfa, 1); - if (err) - return err; - } - - err = TFA_SET_BF_VOLATILE(tfa, I2CR, 1); - if (err) - return err; - - /* Restore MANSCONF to POR state */ - err = TFA_SET_BF_VOLATILE(tfa, MANSCONF, 0); - if (err) - return err; - - /* reset all i2C registers to default */ - err = -TFA_SET_BF(tfa, I2CR, 1); - PRINT_ASSERT(err); - - /* Probus devices HW are already reseted here, - Last step is to send init message to softDSP */ - if (tfa->is_probus_device) { - if (tfa->ext_dsp > 0) { - err = tfa98xx_init_dsp(tfa); - /* ext_dsp status from warm to cold after reset */ - if (tfa->ext_dsp == 2) { - tfa->ext_dsp = 1; - } - } - } else { - /* Restore MANCOLD to POR state */ - TFA_SET_BF_VOLATILE(tfa, MANCOLD, 1); - - /* Coolflux has to be powered on to ensure proper ACS - bit state */ - - /* Powerup CF to access CF io */ - err = tfa98xx_powerdown(tfa, 0); - if (err) - return err; - - /* For clock */ - err = tfa_cf_powerup(tfa); - if (err) - return err; - - /* Force cold boot */ - err = tfaRunColdboot(tfa, 1); /* Set ACS */ - if (err) - return err; - - /* Set PWDN = 1, this will transfer device into powerdown state */ - err = TFA_SET_BF_VOLATILE(tfa, PWDN, 1); - if (err) - return err; - - /* 88 needs SBSL on top of PWDN bit to start transition, - for 92 and 94 this doesn't matter */ - err = TFA_SET_BF_VOLATILE(tfa, SBSL, 1); - if (err) - return err; - - /* Powerdown state should be reached within 1ms */ - for (retry_cnt = 0; retry_cnt < TFA98XX_WAITRESULT_NTRIES; retry_cnt++) { - if (is_94_N2_device(tfa)) - state = tfa_get_bf(tfa, TFA9894N2_BF_MANSTATE); - else - state = TFA_GET_BF(tfa, MANSTATE); - if (state < 0) { - return err; - } - - /* Check for MANSTATE=Powerdown (0) */ - if (state == 0) - break; - msleep_interruptible(2); - } - - /* Reset all I2C registers to default values, - now device state is consistent, same as after powerup */ - err = TFA_SET_BF(tfa, I2CR, 1); - } - } - - return err; -} - -/* - * Write all the bytes specified by num_bytes and data - */ -enum Tfa98xx_Error - tfa98xx_write_data(struct tfa_device *tfa, - unsigned char subaddress, int num_bytes, - const unsigned char data[]) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - /* subaddress followed by data */ - const int bytes2write = num_bytes + 1; - unsigned char *write_data; - - if (num_bytes > TFA2_MAX_PARAM_SIZE) - return Tfa98xx_Error_Bad_Parameter; - - write_data = (unsigned char *)kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - if (write_data == NULL) - return Tfa98xx_Error_Fail; - - write_data[0] = subaddress; - memcpy(&write_data[1], data, num_bytes); - - error = tfa98xx_write_raw(tfa, bytes2write, write_data); - - kmem_cache_free(tfa->cachep, write_data); - return error; -} - -/* - * fill the calibration value as milli ohms in the struct - * - * assume that the device has been calibrated - */ -enum Tfa98xx_Error tfa_dsp_get_calibration_impedance(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned char bytes[3 * 2] = { 0 }; - int nr_bytes, i, data[2], calibrateDone, spkr_count = 0, cal_idx = 0; - unsigned int scaled_data; - int tries = 0; - - error = tfa_supported_speakers(tfa, &spkr_count); - - if (tfa_dev_mtp_get(tfa, TFA_MTP_OTC) && tfa_dev_mtp_get(tfa, TFA_MTP_EX)) { - pr_debug("Getting calibration values from MTP\n"); - - if ((tfa->rev & 0xFF) == 0x88) { - for (i = 0; i < spkr_count; i++) { - if (i == 0) - tfa->mohm[i] = tfa_dev_mtp_get(tfa, TFA_MTP_RE25_PRIM); - else - tfa->mohm[i] = tfa_dev_mtp_get(tfa, TFA_MTP_RE25_SEC); - } - } else { - tfa->mohm[0] = tfa_dev_mtp_get(tfa, TFA_MTP_RE25); - } - - } else if ((tfa_dev_mtp_get(tfa, TFA_MTP_OTC) == 0) && (tfa_dev_mtp_get(tfa, TFA_MTP_EX) == 0)) { - pr_debug("Getting calibration values from Speakerboost\n"); - - /* Make sure the calibrateDone bit is set before getting the values from speakerboost! - * This does not work for 72 (because the dsp cannot set this bit) - */ - if (!tfa->is_probus_device) { - /* poll xmem for calibrate always - * calibrateDone = 0 means "calibrating", - * calibrateDone = -1 (or 0xFFFFFF) means "fails" - * calibrateDone = 1 means calibration done - */ - calibrateDone = 0; - while ((calibrateDone != 1) && (tries < TFA98XX_API_WAITRESULT_NTRIES)) { - error = mem_read(tfa, TFA_FW_XMEM_CALIBRATION_DONE, 1, &calibrateDone); - if ((calibrateDone == 1) || (Tfa98xx_Error_Ok != error)) - break; - tries++; - } - - if (calibrateDone == 1) - pr_debug("Calibration successed!!!\n"); - else if ((calibrateDone != 1) || (Tfa98xx_Error_Ok != error)) { - pr_err("Calibration failed! calibrateDone=%d error=%d\n", calibrateDone, error); - error = Tfa98xx_Error_Bad_Parameter; - } else if (tries == TFA98XX_API_WAITRESULT_NTRIES) { - pr_debug("Calibration has timedout!\n"); - error = Tfa98xx_Error_StateTimedOut; - } - } else { - /* dsp inside of TFA device. */ - calibrateDone = 1; - } - /* SoftDSP interface differs from hw-dsp interfaces */ - if (tfa->is_probus_device && tfa->cnt->ndev > 1) { - spkr_count = tfa->cnt->ndev; - } - - if (calibrateDone == 1) { - nr_bytes = spkr_count * 3; - error = tfa_dsp_cmd_id_write_read(tfa, MODULE_SPEAKERBOOST, SB_PARAM_GET_RE25C, nr_bytes, bytes); - if (error == Tfa98xx_Error_Ok) { - tfa98xx_convert_bytes2data(nr_bytes, bytes, data); - - for (i = 0; i < spkr_count; i++) { - - /* for probus devices, calibration values coming from soft-dsp speakerboost, - are ordered in a different way. Re-align to standard representation. */ - cal_idx = i; - if ((tfa->is_probus_device && tfa->dev_idx >= 1)) { - cal_idx = 0; - } - - /* signed data has a limit of 30 Ohm */ - scaled_data = data[i]; - - if (tfa->tfa_family == 2) - tfa->mohm[cal_idx] = (scaled_data * 1000) / TFA2_FW_ReZ_SCALE; - else - tfa->mohm[cal_idx] = (scaled_data * 1000) / TFA1_FW_ReZ_SCALE; - } - } - } - } else { - for (i = 0; i < spkr_count; i++) { - tfa->mohm[i] = 0; - } - pr_err("Please run calibration command first.\n"); - error = Tfa98xx_Error_Bad_Parameter; - } - - return error; -} - -/* start count from 1, 0 is invalid */ -int tfa_dev_get_swprof(struct tfa_device *tfa) -{ - return (tfa->dev_ops.get_swprof)(tfa); -} - -int tfa_dev_set_swprof(struct tfa_device *tfa, unsigned short new_value) -{ - return (tfa->dev_ops.set_swprof)(tfa, new_value + 1); -} - -/* same value for all channels - * start count from 1, 0 is invalid */ -int tfa_dev_get_swvstep(struct tfa_device *tfa) -{ - return (tfa->dev_ops.get_swvstep)(tfa); -} - -int tfa_dev_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - return (tfa->dev_ops.set_swvstep)(tfa, new_value + 1); -} - -/* - function overload for MTPB - */ -int tfa_dev_get_mtpb(struct tfa_device *tfa) -{ - return (tfa->dev_ops.get_mtpb)(tfa); -} - -int tfa_is_cold(struct tfa_device *tfa) -{ - int value; - - /* - * check for cold boot status - */ - if (tfa->is_probus_device) { - if (tfa->ext_dsp > 0) { - if (tfa->ext_dsp == 2) - value = 0; // warm - else /* no dsp or cold */ - value = 1; // cold - } else { - value = (TFA_GET_BF(tfa, MANSCONF) == 0); - } - } else { - value = TFA_GET_BF(tfa, ACS); - } - - return value; -} - -int tfa_needs_reset(struct tfa_device *tfa) -{ - int value; - - /* checks if the DSP commands SetAlgoParams and SetMBDrc - * need a DSP reset (now: at coldstart or during calibration) - */ - if (tfa_is_cold(tfa) == 1 || tfa->needs_reset == 1) - value = 1; - else - value = 0; - - return value; -} - -int tfa_cf_enabled(struct tfa_device *tfa) -{ - int value; - - /* For 72 there is no CF */ - if (tfa->is_probus_device) { - value = (tfa->ext_dsp != 0); - } else { - value = TFA_GET_BF(tfa, CFE); - } - - return value; -} - -#define NR_COEFFS 6 -#define NR_BIQUADS 28 -#define BQ_SIZE (3 * NR_COEFFS) -#define DSP_MSG_OVERHEAD 27 - -#pragma pack(push, 1) -struct dsp_msg_all_coeff { - uint8_t select_eq[3]; - uint8_t biquad[NR_BIQUADS][NR_COEFFS][3]; -}; -#pragma pack(pop) - -/* number of biquads for each equalizer */ -static const int eq_biquads[] = { - 10, 10, 2, 2, 2, 2 -}; - -#define NR_EQ (int)(sizeof(eq_biquads) / sizeof(int)) - -enum Tfa98xx_Error dsp_partial_coefficients(struct tfa_device *tfa, uint8_t *prev, uint8_t *next) -{ - uint8_t bq, eq; - int eq_offset; - int new_cost, old_cost; - uint32_t eq_biquad_mask[NR_EQ]; - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - struct dsp_msg_all_coeff *data1 = (struct dsp_msg_all_coeff *)prev; - struct dsp_msg_all_coeff *data2 = (struct dsp_msg_all_coeff *)next; - - old_cost = DSP_MSG_OVERHEAD + 3 + sizeof(struct dsp_msg_all_coeff); - new_cost = 0; - - eq_offset = 0; - for (eq = 0; eq < NR_EQ; eq++) { - uint8_t *eq1 = &data1->biquad[eq_offset][0][0]; - uint8_t *eq2 = &data2->biquad[eq_offset][0][0]; - - eq_biquad_mask[eq] = 0; - - if (memcmp(eq1, eq2, BQ_SIZE*eq_biquads[eq]) != 0) { - int nr_bq = 0; - int bq_sz, eq_sz; - - for (bq = 0; bq < eq_biquads[eq]; bq++) { - uint8_t *bq1 = &eq1[bq*BQ_SIZE]; - uint8_t *bq2 = &eq2[bq*BQ_SIZE]; - - if (memcmp(bq1, bq2, BQ_SIZE) != 0) { - eq_biquad_mask[eq] |= (1 << bq); - nr_bq++; - } - } - - bq_sz = (2 * 3 + BQ_SIZE) * nr_bq; - eq_sz = 2 * 3 + BQ_SIZE * eq_biquads[eq]; - - /* dsp message i2c transaction overhead */ - bq_sz += DSP_MSG_OVERHEAD * nr_bq; - eq_sz += DSP_MSG_OVERHEAD; - - if (bq_sz >= eq_sz) { - eq_biquad_mask[eq] = 0xffffffff; - - new_cost += eq_sz; - - } else { - new_cost += bq_sz; - } - } - pr_debug("eq_biquad_mask[%d] = 0x%.8x\n", eq, eq_biquad_mask[eq]); - - eq_offset += eq_biquads[eq]; - } - - pr_debug("cost for writing all coefficients = %d\n", old_cost); - pr_debug("cost for writing changed coefficients = %d\n", new_cost); - - if (new_cost >= old_cost) { - const int buffer_sz = 3 + sizeof(struct dsp_msg_all_coeff); - uint8_t *buffer; - - buffer = kmalloc(buffer_sz, GFP_KERNEL); - if (buffer == NULL) - return Tfa98xx_Error_Fail; - - /* cmd id */ - buffer[0] = 0x00; - buffer[1] = 0x82; - buffer[2] = 0x00; - - /* parameters */ - memcpy(&buffer[3], data2, sizeof(struct dsp_msg_all_coeff)); - - err = dsp_msg(tfa, buffer_sz, (const char *)buffer); - - kfree(buffer); - if (err) - return err; - - } else { - eq_offset = 0; - for (eq = 0; eq < NR_EQ; eq++) { - uint8_t *eq2 = &data2->biquad[eq_offset][0][0]; - - if (eq_biquad_mask[eq] == 0xffffffff) { - const int msg_sz = 6 + BQ_SIZE * eq_biquads[eq]; - uint8_t *msg; - - msg = kmalloc(msg_sz, GFP_KERNEL); - if (msg == NULL) - return Tfa98xx_Error_Fail; - - /* cmd id */ - msg[0] = 0x00; - msg[1] = 0x82; - msg[2] = 0x00; - - /* select eq and bq */ - msg[3] = 0x00; - msg[4] = eq + 1; - msg[5] = 0x00; /* all biquads */ - - /* biquad parameters */ - memcpy(&msg[6], eq2, BQ_SIZE * eq_biquads[eq]); - - err = dsp_msg(tfa, msg_sz, (const char *)msg); - - kfree(msg); - if (err) - return err; - - } else if (eq_biquad_mask[eq] != 0) { - for (bq = 0; bq < eq_biquads[eq]; bq++) { - - if (eq_biquad_mask[eq] & (1 << bq)) { - uint8_t *bq2 = &eq2[bq*BQ_SIZE]; - const int msg_sz = 6 + BQ_SIZE; - uint8_t *msg; - - msg = kmem_cache_alloc(tfa->cachep, GFP_KERNEL); - if (msg == NULL) - return Tfa98xx_Error_Fail; - - /* cmd id */ - msg[0] = 0x00; - msg[1] = 0x82; - msg[2] = 0x00; - - /* select eq and bq*/ - msg[3] = 0x00; - msg[4] = eq + 1; - msg[5] = bq + 1; - - /* biquad parameters */ - memcpy(&msg[6], bq2, BQ_SIZE); - - err = dsp_msg(tfa, msg_sz, (const char *)msg); - - kmem_cache_free(tfa->cachep, msg); - if (err) - return err; - } - } - } - eq_offset += eq_biquads[eq]; - } - } - - return err; -} - -/* fill context info */ -int tfa_dev_probe(int slave, struct tfa_device *tfa) -{ - uint16_t rev; - - tfa->slave_address = (unsigned char)slave; - - /* read revid via low level hal, register 3 */ - if (tfa98xx_read_register16(tfa, 3, &rev) != Tfa98xx_Error_Ok) { - PRINT("\nError: Unable to read revid from slave:0x%02x\n", slave); - return -1; - } - - tfa->rev = rev; - tfa->dev_idx = -1; - tfa->state = TFA_STATE_UNKNOWN; - tfa->p_regInfo = NULL; - - tfa_set_query_info(tfa); - - tfa->in_use = 1; - - return 0; -} - -enum tfa_error tfa_dev_set_state(struct tfa_device *tfa, enum tfa_state state, int is_calibration) -{ - enum tfa_error err = tfa_error_ok; - int loop = 50, ready = 0; - int count; - - /* Base states */ - /* Do not change the order of setting bits as this is important! */ - switch (state & 0x0f) { - case TFA_STATE_POWERDOWN: /* PLL in powerdown, Algo up */ - break; - case TFA_STATE_INIT_HW: /* load I2C/PLL hardware setting (~wait2srcsettings) */ - break; - case TFA_STATE_INIT_CF: /* coolflux HW access possible (~initcf) */ - /* Start with SBSL=0 to stay in initCF state */ - if (!tfa->is_probus_device) - TFA_SET_BF(tfa, SBSL, 0); - - /* We want to leave Wait4SrcSettings state for max2 */ - if (tfa->tfa_family == 2) - TFA_SET_BF(tfa, MANSCONF, 1); - - /* And finally set PWDN to 0 to leave powerdown state */ - TFA_SET_BF(tfa, PWDN, 0); - - /* Make sure the DSP is running! */ - do { - - if (tfa98xx_dsp_system_stable(tfa, &ready) != Tfa98xx_Error_Ok) - return tfa_error_max; - - if (ready) - break; - } while (loop--); - if (((!tfa->is_probus_device) && (is_calibration)) || ((tfa->rev & 0xff) == 0x13)) - { - /* Enable FAIM when clock is stable, to avoid MTP corruption */ - err = (enum tfa_error)tfa98xx_faim_protect(tfa, 1); - if (tfa->verbose) { - pr_debug("FAIM enabled (err:%d).\n", err); - } - } - break; - case TFA_STATE_INIT_FW: /* DSP framework active (~patch loaded) */ - break; - case TFA_STATE_OPERATING: /* Amp and Algo running */ - /* Depending on our previous state we need to set 3 bits */ - TFA_SET_BF(tfa, PWDN, 0); /* Coming from state 0 */ - TFA_SET_BF(tfa, MANSCONF, 1); /* Coming from state 1 */ - pr_debug("tfa->is_probus_device=%d is_calibration=%d\n", tfa->is_probus_device, is_calibration); - /* we should set AMPE as 1 for NON-DSP device, otherwise will be setting SBSL as 1 */ - if (tfa->is_probus_device) { - TFA_SET_BF(tfa, AMPE, 1); /* Coming from state 6 */ - } else { - TFA_SET_BF(tfa, SBSL, 1); /* Coming from state 6 */ - } - - /* - * Disable MTP clock to protect memory. - * However in case of calibration wait for DSP! (This should be case only during calibration). - */ - if ((TFA_GET_BF(tfa, MTPOTC) == 1) && (tfa->tfa_family == 2) && is_calibration) { - count = MTPEX_WAIT_NTRIES * 4; /* Calibration takes a lot of time */ - while ((TFA_GET_BF(tfa, MTPEX) != 1) && count) { - msleep_interruptible(10); - count--; - } - } - if (((!tfa->is_probus_device) && (is_calibration)) || ((tfa->rev & 0xff) == 0x13)) - { - err = (enum tfa_error)tfa98xx_faim_protect(tfa, 0); - if (tfa->verbose) { - pr_debug("FAIM disabled (err:%d).\n", err); - } - } - /* Synchonize I/V delay on 96/97 at cold start */ - if (tfa->sync_iv_delay) { - if (tfa->verbose) - pr_debug("syncing I/V delay for %x\n", - (tfa->rev & 0xff)); - - /* wait for ACS to be cleared */ - count = 10; - while ((TFA_GET_BF(tfa, ACS) == 1) && - (count-- > 0)) { - msleep_interruptible(1); - } - - tfa98xx_dsp_reset(tfa, 1); - tfa98xx_dsp_reset(tfa, 0); - tfa->sync_iv_delay = 0; - } - break; - case TFA_STATE_FAULT: /* An alarm or error occurred */ - break; - case TFA_STATE_RESET: /* I2C reset and ACS set */ - tfa98xx_init(tfa); - break; - default: - if (state & 0x0f) - return tfa_error_bad_param; - } - - /* state modifiers */ - - if (state & TFA_STATE_MUTE) - tfa98xx_set_mute(tfa, Tfa98xx_Mute_Amplifier); - - if (state & TFA_STATE_UNMUTE) - tfa98xx_set_mute(tfa, Tfa98xx_Mute_Off); - - tfa->state = state; - - return tfa_error_ok; -} - -enum tfa_state tfa_dev_get_state(struct tfa_device *tfa) -{ - int cold = 0; - int manstate; - - /* different per family type */ - if (tfa->tfa_family == 1) { - cold = TFA_GET_BF(tfa, ACS); - if (cold && TFA_GET_BF(tfa, PWDN)) - tfa->state = TFA_STATE_RESET; - else if (!cold && TFA_GET_BF(tfa, SWS)) - tfa->state = TFA_STATE_OPERATING; - } else /* family 2 */ { - if (is_94_N2_device(tfa)) - manstate = tfa_get_bf(tfa, TFA9894N2_BF_MANSTATE); - else - manstate = TFA_GET_BF(tfa, MANSTATE); - switch (manstate) { - case 0: - tfa->state = TFA_STATE_POWERDOWN; - break; - case 8: /* if dsp reset if off assume framework is running */ - tfa->state = TFA_GET_BF(tfa, RST) ? TFA_STATE_INIT_CF : TFA_STATE_INIT_FW; - break; - case 9: - tfa->state = TFA_STATE_OPERATING; - break; - default: - break; - } - } - - return tfa->state; -} - -int tfa_dev_mtp_get(struct tfa_device *tfa, enum tfa_mtp item) -{ - int value = 0; - - switch (item) { - case TFA_MTP_OTC: - value = TFA_GET_BF(tfa, MTPOTC); - break; - case TFA_MTP_EX: - value = TFA_GET_BF(tfa, MTPEX); - break; - case TFA_MTP_RE25: - case TFA_MTP_RE25_PRIM: - if (tfa->tfa_family == 2) { - if ((tfa->rev & 0xFF) == 0x88) - value = TFA_GET_BF(tfa, R25CL); - else if ((tfa->rev & 0xFF) == 0x13) - value = tfa_get_bf(tfa, TFA9912_BF_R25C); - else - value = TFA_GET_BF(tfa, R25C); - } else { - reg_read(tfa, 0x83, (unsigned short *)&value); - } - break; - case TFA_MTP_RE25_SEC: - if ((tfa->rev & 0xFF) == 0x88) { - value = TFA_GET_BF(tfa, R25CR); - } else { - pr_debug("Error: Current device has no secondary Re25 channel\n"); - } - break; - case TFA_MTP_LOCK: - break; - } - - return value; -} - -enum tfa_error tfa_dev_mtp_set(struct tfa_device *tfa, enum tfa_mtp item, int value) -{ - enum Tfa98xx_Error err = Tfa98xx_Error_Ok; - - switch (item) { - case TFA_MTP_OTC: - err = tfa98xx_set_mtp(tfa, (uint16_t)value, TFA98XX_KEY2_PROTECTED_MTP0_MTPOTC_MSK); - break; - case TFA_MTP_EX: - err = tfa98xx_set_mtp(tfa, (uint16_t)value, TFA98XX_KEY2_PROTECTED_MTP0_MTPEX_MSK); - break; - case TFA_MTP_RE25: - case TFA_MTP_RE25_PRIM: - if (tfa->tfa_family == 2) { - tfa98xx_key2(tfa, 0); /* unlock */ - if ((tfa->rev & 0xFF) == 0x88) - TFA_SET_BF(tfa, R25CL, (uint16_t)value); - else - { - if (tfa->is_probus_device == 1 && TFA_GET_BF(tfa, MTPOTC) == 1) - tfa2_manual_mtp_cpy(tfa, 0xF4, value, 2); - TFA_SET_BF(tfa, R25C, (uint16_t)value); - } - tfa98xx_key2(tfa, 1); /* lock */ - } - break; - case TFA_MTP_RE25_SEC: - if ((tfa->rev & 0xFF) == 0x88) { - TFA_SET_BF(tfa, R25CR, (uint16_t)value); - } else { - pr_debug("Error: Current device has no secondary Re25 channel\n"); - err = Tfa98xx_Error_Bad_Parameter; - } - break; - case TFA_MTP_LOCK: - break; - } - - if (err != Tfa98xx_Error_Ok) { - pr_err("TFA98xx Error code is %d\n", err); - return tfa_error_max; - } - return tfa_error_ok; -} - -int tfa_get_pga_gain(struct tfa_device *tfa) -{ - return TFA_GET_BF(tfa, SAAMGAIN); -} - -int tfa_set_pga_gain(struct tfa_device *tfa, uint16_t value) -{ - - return TFA_SET_BF(tfa, SAAMGAIN, value); -} - -int tfa_get_noclk(struct tfa_device *tfa) -{ - return TFA_GET_BF(tfa, NOCLK); -} - - -enum Tfa98xx_Error tfa_status(struct tfa_device *tfa) -{ - int value; - uint16_t val; - - /* - * check IC status bits: cold start - * and DSP watch dog bit to re init - */ - value = TFA_READ_REG(tfa, VDDS); /* STATUSREG */ - if (value < 0) - return -value; - val = (uint16_t)value; - - /* pr_debug("SYS_STATUS0: 0x%04x\n", val); */ - if (TFA_GET_BF_VALUE(tfa, ACS, val) || - TFA_GET_BF_VALUE(tfa, WDS, val)) { - - if (TFA_GET_BF_VALUE(tfa, ACS, val)) - pr_err("ERROR: ACS\n"); - if (TFA_GET_BF_VALUE(tfa, WDS, val)) - pr_err("ERROR: WDS\n"); - - return Tfa98xx_Error_DSP_not_running; - } - - if (TFA_GET_BF_VALUE(tfa, SPKS, val)) - pr_err("ERROR: SPKS\n"); - if (!TFA_GET_BF_VALUE(tfa, SWS, val)) - pr_err("ERROR: SWS\n"); - - /* Check secondary errors */ - if (!TFA_GET_BF_VALUE(tfa, CLKS, val) || - !TFA_GET_BF_VALUE(tfa, UVDS, val) || - !TFA_GET_BF_VALUE(tfa, OVDS, val) || - !TFA_GET_BF_VALUE(tfa, OTDS, val) || - !TFA_GET_BF_VALUE(tfa, PLLS, val) || - (!(tfa->daimap & Tfa98xx_DAI_TDM) && - !TFA_GET_BF_VALUE(tfa, VDDS, val))) - pr_err("Misc errors detected: STATUS_FLAG0 = 0x%x\n", val); - - if ((tfa->daimap & Tfa98xx_DAI_TDM) && (tfa->tfa_family == 2)) { - value = TFA_READ_REG(tfa, TDMERR); /* STATUS_FLAGS1 */ - if (value < 0) - return -value; - val = (uint16_t)value; - if (TFA_GET_BF_VALUE(tfa, TDMERR, val) || - TFA_GET_BF_VALUE(tfa, TDMLUTER, val)) - pr_err("TDM related errors: STATUS_FLAG1 = 0x%x\n", val); - } - - return Tfa98xx_Error_Ok; -} -#define NR_OF_BATS 10 -void tfa_adapt_noisemode(struct tfa_device *tfa) -{ - int i, avbatt; - long total_bats = 0; - - if ((tfa_get_bf(tfa, 0x5900) == 0) || (tfa_get_bf(tfa, TFA9873_BF_LP1) == 1)) - { - if (tfa->verbose) - pr_debug("Adapting low noise mode is not needed, condition not fulfilled!\n"); - return; - } - if (tfa->verbose) - pr_debug("Adapting low noise mode\n"); - - for (i = 0; i < NR_OF_BATS; i++) { - int bat = TFA_GET_BF(tfa, BATS); - - if (tfa->verbose) - pr_debug("bats[%d]=%d\n", i, bat); - total_bats += bat; - msleep_interruptible(5); - } - - avbatt = (int)(total_bats / NR_OF_BATS); - - if (avbatt <= MIN_BATT_LEVEL && !tfa_get_bf(tfa, TFA9873_BF_LNMODE))//640 corresponds to 3.4 volt, MCH_TO_TEST - { - tfa_set_bf(tfa, TFA9873_BF_LNMODE, 1); - pr_debug("\navbatt= %d--Applying high noise gain\n", avbatt); - } else if (avbatt > MAX_BATT_LEVEL && tfa_get_bf(tfa, TFA9873_BF_LNMODE)) - { - tfa_set_bf(tfa, TFA9873_BF_LNMODE, 0); - pr_debug("\navbatt= %d--Applying automatic noise gain\n", avbatt); - } - - -} - -#ifdef __KERNEL__ -int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep, u8 pcm_format) -#else -int tfa_plop_noise_interrupt(struct tfa_device *tfa, int profile, int vstep) -#endif -{ - enum tfa_error err; - int no_clk = 0; - - /* Remove sticky bit by reading it once */ - TFA_GET_BF(tfa, NOCLK); - - /* No clock detected */ - if (tfa_irq_get(tfa, tfa9912_irq_stnoclk)) { - no_clk = TFA_GET_BF(tfa, NOCLK); - - /* Detect for clock is lost! (clock is not stable) */ - if (no_clk == 1) { - /* Clock is lost. Set I2CR to remove POP noise */ - pr_info("No clock detected. Resetting the I2CR to avoid pop on 72!\n"); -#ifdef __KERNEL__ - err = tfa_dev_start(tfa, profile, vstep, pcm_format); -#else - err = tfa_dev_start(tfa, profile, vstep); -#endif - if (err != tfa_error_ok) { - pr_err("Error loading i2c registers (tfa_dev_start), err=%d\n", err); - } else { - pr_info("Setting i2c registers after I2CR succesfull\n"); - tfa_dev_set_state(tfa, TFA_STATE_UNMUTE, 0); - } - - /* Remove sticky bit by reading it once */ - tfa_get_noclk(tfa); - - /* This is only for SAAM on the 72. - Since the NOCLK interrupt is only enabled for 72 this is the place - However: Not tested yet! But also does not harm normal flow! - */ - if (strstr(tfaContProfileName(tfa->cnt, tfa->dev_idx, profile), ".saam")) { - pr_info("Powering down from a SAAM profile, workaround PLMA4766 used!\n"); - TFA_SET_BF(tfa, PWDN, 1); - TFA_SET_BF(tfa, AMPE, 0); - TFA_SET_BF(tfa, SAMMODE, 0); - } - } - - /* If clk is stable set polarity to check for LOW (no clock)*/ - tfa_irq_set_pol(tfa, tfa9912_irq_stnoclk, (no_clk == 0)); - - /* clear interrupt */ - tfa_irq_clear(tfa, tfa9912_irq_stnoclk); - } - - /* return no_clk to know we called tfa_dev_start */ - return no_clk; -} - -void tfa_lp_mode_interrupt(struct tfa_device *tfa) -{ - const int irq_stclp0 = 36; /* FIXME: this 72 interrupt does not excist for 9912 */ - int lp0, lp1; - - if (tfa_irq_get(tfa, irq_stclp0)) { - lp0 = TFA_GET_BF(tfa, LP0); - if (lp0 > 0) { - pr_info("lowpower mode 0 detected\n"); - } else { - pr_info("lowpower mode 0 not detected\n"); - } - - tfa_irq_set_pol(tfa, irq_stclp0, (lp0 == 0)); - - /* clear interrupt */ - tfa_irq_clear(tfa, irq_stclp0); - } - - if (tfa_irq_get(tfa, tfa9912_irq_stclpr)) { - lp1 = TFA_GET_BF(tfa, LP1); - if (lp1 > 0) { - pr_info("lowpower mode 1 detected\n"); - } else { - pr_info("lowpower mode 1 not detected\n"); - } - - tfa_irq_set_pol(tfa, tfa9912_irq_stclpr, (lp1 == 0)); - - /* clear interrupt */ - tfa_irq_clear(tfa, tfa9912_irq_stclpr); - } -} diff --git a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_init.c b/techpack/audio/asoc/codecs/tfa98xx/src/tfa_init.c deleted file mode 100644 index e186b7d183c4..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_init.c +++ /dev/null @@ -1,1933 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include "dbgprint.h" -#include "tfa_service.h" -#include "tfa_internal.h" -#include "tfa_container.h" -#include "tfa98xx_tfafieldnames.h" - - /* The CurrentSense4 registers are not in the datasheet */ -#define TFA98XX_CURRENTSENSE4_CTRL_CLKGATECFOFF (1<<2) -#define TFA98XX_CURRENTSENSE4 0x49 - -/***********************************************************************************/ -/* GLOBAL (Defaults) */ -/***********************************************************************************/ -static enum Tfa98xx_Error no_overload_function_available(struct tfa_device *tfa, int not_used) -{ - (void)tfa; - (void)not_used; - - return Tfa98xx_Error_Ok; -} - -static enum Tfa98xx_Error no_overload_function_available2(struct tfa_device *tfa) -{ - (void)tfa; - - return Tfa98xx_Error_Ok; -} - -/* tfa98xx_dsp_system_stable -* return: *ready = 1 when clocks are stable to allow DSP subsystem access -*/ -static enum Tfa98xx_Error tfa_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short status; - int value; - - /* check the contents of the STATUS register */ - value = TFA_READ_REG(tfa, AREFS); - if (value < 0) { - error = -value; - *ready = 0; - _ASSERT(error); /* an error here can be fatal */ - return error; - } - status = (unsigned short)value; - - /* check AREFS and CLKS: not ready if either is clear */ - *ready = !((TFA_GET_BF_VALUE(tfa, AREFS, status) == 0) - || (TFA_GET_BF_VALUE(tfa, CLKS, status) == 0)); - - return error; -} - -/* tfa98xx_toggle_mtp_clock - * Allows to stop clock for MTP/FAim needed for PLMA5505 */ -static enum Tfa98xx_Error tfa_faim_protect(struct tfa_device *tfa, int state) -{ - (void)tfa; - (void)state; - - return Tfa98xx_Error_Ok; -} - -/** Set internal oscillator into power down mode. - * - * This function is a worker for tfa98xx_set_osc_powerdown(). - * - * @param[in] tfa device description structure - * @param[in] state new state 0 - oscillator is on, 1 oscillator is off. - * - * @return Tfa98xx_Error_Ok when successfull, error otherwise. - */ -static enum Tfa98xx_Error tfa_set_osc_powerdown(struct tfa_device *tfa, int state) -{ - /* This function has no effect in general case, only for tfa9912 */ - (void)tfa; - (void)state; - - return Tfa98xx_Error_Ok; -} -static enum Tfa98xx_Error tfa_update_lpm(struct tfa_device *tfa, int state) -{ - /* This function has no effect in general case, only for tfa9912 */ - (void)tfa; - (void)state; - - return Tfa98xx_Error_Ok; -} -static enum Tfa98xx_Error tfa_dsp_reset(struct tfa_device *tfa, int state) -{ - /* generic function */ - TFA_SET_BF_VOLATILE(tfa, RST, (uint16_t)state); - - return Tfa98xx_Error_Ok; -} - -int tfa_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int mtpk, active_value = tfa->profile; - - /* Also set the new value in the struct */ - tfa->profile = new_value - 1; - - /* for TFA1 devices */ - /* it's in MTP shadow, so unlock if not done already */ - mtpk = TFA_GET_BF(tfa, MTPK); /* get current key */ - TFA_SET_BF_VOLATILE(tfa, MTPK, 0x5a); - TFA_SET_BF_VOLATILE(tfa, SWPROFIL, new_value); /* set current profile */ - TFA_SET_BF_VOLATILE(tfa, MTPK, (uint16_t)mtpk); /* restore key */ - - return active_value; -} - -static int tfa_get_swprofile(struct tfa_device *tfa) -{ - return /*TFA_GET_BF(tfa, SWPROFIL) - 1*/tfa->profile; -} - -static int tfa_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - int mtpk, active_value = tfa->vstep; - - /* Also set the new value in the struct */ - tfa->vstep = new_value - 1; - - /* for TFA1 devices */ - /* it's in MTP shadow, so unlock if not done already */ - mtpk = TFA_GET_BF(tfa, MTPK); /* get current key */ - TFA_SET_BF_VOLATILE(tfa, MTPK, 0x5a); - TFA_SET_BF_VOLATILE(tfa, SWVSTEP, new_value); /* set current vstep */ - TFA_SET_BF_VOLATILE(tfa, MTPK, (uint16_t)mtpk); /* restore key */ - - return active_value; -} - -static int tfa_get_swvstep(struct tfa_device *tfa) -{ - int value = 0; - /* Set the new value in the hw register */ - value = TFA_GET_BF(tfa, SWVSTEP); - - /* Also set the new value in the struct */ - tfa->vstep = value - 1; - - return value - 1; /* invalid if 0 */ -} - -static int tfa_get_mtpb(struct tfa_device *tfa) -{ - - int value = 0; - - /* Set the new value in the hw register */ - value = TFA_GET_BF(tfa, MTPB); - - return value; -} - -static enum Tfa98xx_Error -tfa_set_mute_nodsp(struct tfa_device *tfa, int mute) -{ - (void)tfa; - (void)mute; - - return Tfa98xx_Error_Ok; -} - -void set_ops_defaults(struct tfa_device_ops *ops) -{ - /* defaults */ - ops->reg_read = tfa98xx_read_register16; - ops->reg_write = tfa98xx_write_register16; - ops->mem_read = tfa98xx_dsp_read_mem; - ops->mem_write = tfa98xx_dsp_write_mem_word; - ops->dsp_msg = tfa_dsp_msg; - ops->dsp_msg_read = tfa_dsp_msg_read; - ops->dsp_write_tables = no_overload_function_available; - ops->dsp_reset = tfa_dsp_reset; - ops->dsp_system_stable = tfa_dsp_system_stable; - ops->auto_copy_mtp_to_iic = no_overload_function_available2; - ops->factory_trimmer = no_overload_function_available2; - ops->set_swprof = tfa_set_swprofile; - ops->get_swprof = tfa_get_swprofile; - ops->set_swvstep = tfa_set_swvstep; - ops->get_swvstep = tfa_get_swvstep; - ops->get_mtpb = tfa_get_mtpb; - ops->set_mute = tfa_set_mute_nodsp; - ops->faim_protect = tfa_faim_protect; - ops->set_osc_powerdown = tfa_set_osc_powerdown; - ops->update_lpm = tfa_update_lpm; -} - -/***********************************************************************************/ -/* no TFA - * external DSP SB instance */ - /***********************************************************************************/ -static short tfanone_swvstep, swprof; //TODO emulate in hal plugin -static enum Tfa98xx_Error tfanone_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - (void)tfa; /* suppress warning */ - *ready = 1; /* assume always ready */ - - return Tfa98xx_Error_Ok; -} - -static int tfanone_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int active_value = tfa_dev_get_swprof(tfa); - - /* Set the new value in the struct */ - tfa->profile = new_value - 1; - - /* Set the new value in the hw register */ - swprof = new_value; - - return active_value; -} - -static int tfanone_get_swprofile(struct tfa_device *tfa) -{ - (void)tfa; /* suppress warning */ - return swprof; -} - -static int tfanone_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - /* Set the new value in the struct */ - tfa->vstep = new_value - 1; - - /* Set the new value in the hw register */ - tfanone_swvstep = new_value; - - return new_value; -} - -static int tfanone_get_swvstep(struct tfa_device *tfa) -{ - (void)tfa; /* suppress warning */ - return tfanone_swvstep; -} - -void tfanone_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->dsp_system_stable = tfanone_dsp_system_stable; - ops->set_swprof = tfanone_set_swprofile; - ops->get_swprof = tfanone_get_swprofile; - ops->set_swvstep = tfanone_set_swvstep; - ops->get_swvstep = tfanone_get_swvstep; - -} - -/***********************************************************************************/ -/* TFA9912 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9912_faim_protect(struct tfa_device *tfa, int status) -{ - enum Tfa98xx_Error ret = Tfa98xx_Error_Fail; - - if (tfa) { - if (status == 0 || status == 1) { - ret = -(tfa_set_bf(tfa, TFA9912_BF_SSFAIME, (uint16_t)status)); - } - } - - return ret; -} - -static enum Tfa98xx_Error tfa9912_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short value, xor; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* Unlock keys to write settings */ - error = reg_write(tfa, 0x0F, 0x5A6B); - error = reg_read(tfa, 0xFB, &value); - xor = value ^ 0x005A; - error = reg_write(tfa, 0xA0, xor); - - /* The optimal settings */ - if (tfa->rev == 0x1a13) { - - /* ----- generated code start ----- */ - /* ----- version 1.43 ----- */ - reg_write(tfa, 0x00, 0x0255); //POR=0x0245 - reg_write(tfa, 0x01, 0x838a); //POR=0x83ca - reg_write(tfa, 0x02, 0x2dc8); //POR=0x2828 - reg_write(tfa, 0x05, 0x762a); //POR=0x766a - reg_write(tfa, 0x22, 0x543c); //POR=0x545c - reg_write(tfa, 0x26, 0x0100); //POR=0x0010 - reg_write(tfa, 0x51, 0x0000); //POR=0x0080 - reg_write(tfa, 0x52, 0x551c); //POR=0x1afc - reg_write(tfa, 0x53, 0x003e); //POR=0x001e - reg_write(tfa, 0x61, 0x000c); //POR=0x0018 - reg_write(tfa, 0x63, 0x0a96); //POR=0x0a9a - reg_write(tfa, 0x65, 0x0a82); //POR=0x0a8b - reg_write(tfa, 0x66, 0x0701); //POR=0x0700 - reg_write(tfa, 0x6c, 0x00d5); //POR=0x02d5 - reg_write(tfa, 0x70, 0x26f8); //POR=0x06e0 - reg_write(tfa, 0x71, 0x3074); //POR=0x2074 - reg_write(tfa, 0x75, 0x4484); //POR=0x4585 - reg_write(tfa, 0x76, 0x72ea); //POR=0x54a2 - reg_write(tfa, 0x83, 0x0716); //POR=0x0617 - reg_write(tfa, 0x89, 0x0013); //POR=0x0014 - reg_write(tfa, 0xb0, 0x4c08); //POR=0x4c00 - reg_write(tfa, 0xc6, 0x004e); //POR=0x000e /* PLMA5539: Please make sure bit 6 is always on! */ - /* ----- generated code end ----- */ - - /* PLMA5505: MTP key open makes vulanable for MTP corruption */ - tfa9912_faim_protect(tfa, 0); - } else { - pr_info("Warning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); - } - - return error; -} - -static enum Tfa98xx_Error tfa9912_factory_trimmer(struct tfa_device *tfa) -{ - unsigned short currentValue, delta; - int result; - - /* Factory trimming for the Boost converter */ - /* check if there is a correction needed */ - result = TFA_GET_BF(tfa, DCMCCAPI); - if (result) { - /* Get currentvalue of DCMCC and the Delta value */ - currentValue = (unsigned short)TFA_GET_BF(tfa, DCMCC); - delta = (unsigned short)TFA_GET_BF(tfa, USERDEF); - - /* check the sign bit (+/-) */ - result = TFA_GET_BF(tfa, DCMCCSB); - if (result == 0) { - /* Do not exceed the maximum value of 15 */ - if (currentValue + delta < 15) { - TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue + delta); - if (tfa->verbose) - pr_debug("Max coil current is set to: %d\n", currentValue + delta); - } else { - TFA_SET_BF_VOLATILE(tfa, DCMCC, 15); - if (tfa->verbose) - pr_debug("Max coil current is set to: 15\n"); - } - } else if (result == 1) { - /* Do not exceed the minimum value of 0 */ - if (currentValue - delta > 0) { - TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue - delta); - if (tfa->verbose) - pr_debug("Max coil current is set to: %d\n", currentValue - delta); - } else { - TFA_SET_BF_VOLATILE(tfa, DCMCC, 0); - if (tfa->verbose) - pr_debug("Max coil current is set to: 0\n"); - } - } - } - - return Tfa98xx_Error_Ok; -} - -static enum Tfa98xx_Error tfa9912_auto_copy_mtp_to_iic(struct tfa_device *tfa) -{ - /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1. Workaround for 72, 88 and 9912/9892(see PLMA5290) */ - return reg_write(tfa, 0xA3, 0x20); -} - -static int tfa9912_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int active_value = tfa_dev_get_swprof(tfa); - - /* Set the new value in the struct */ - tfa->profile = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9912_BF_SWPROFIL, new_value); - - return active_value; -} - -static int tfa9912_get_swprofile(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9912_BF_SWPROFIL) - 1; -} - -static int tfa9912_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - /* Set the new value in the struct */ - tfa->vstep = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9912_BF_SWVSTEP, new_value); - - return new_value; -} - -static int tfa9912_get_swvstep(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9912_BF_SWVSTEP) - 1; -} - -static enum Tfa98xx_Error -tfa9912_set_mute(struct tfa_device *tfa, int mute) -{ - tfa_set_bf(tfa, TFA9912_BF_CFSM, (const uint16_t)mute); - - return Tfa98xx_Error_Ok; -} - -/* Maksimum value for combination of boost_voltage and vout calibration offset (see PLMA5322, PLMA5528). */ -#define TFA9912_VBOOST_MAX 57 -#define TFA9912_CALIBR_BOOST_MAX 63 -#define TFA9912_DCDCCNT6_REG (TFA9912_BF_DCVOF >> 8) -#define TFA9912_CALIBR_REG 0xf1 - -static uint16_t tfa9912_vboost_fixup(struct tfa_device *tfa, uint16_t dcdc_cnt6) -{ - unsigned short cal_offset; - unsigned short boost_v_1st, boost_v_2nd; - uint16_t new_dcdc_cnt6; - - /* Get current calibr_vout_offset, this register is not supported by bitfields */ - reg_read(tfa, TFA9912_CALIBR_REG, &cal_offset); - cal_offset = (cal_offset & 0x001f); - new_dcdc_cnt6 = dcdc_cnt6; - - /* Get current boost_volatage values */ - boost_v_1st = tfa_get_bf_value(TFA9912_BF_DCVOF, new_dcdc_cnt6); - boost_v_2nd = tfa_get_bf_value(TFA9912_BF_DCVOS, new_dcdc_cnt6); - - /* Check boost voltages */ - if (boost_v_1st > TFA9912_VBOOST_MAX) - boost_v_1st = TFA9912_VBOOST_MAX; - - if (boost_v_2nd > TFA9912_VBOOST_MAX) - boost_v_2nd = TFA9912_VBOOST_MAX; - - /* Recalculate values, max for the sum is TFA9912_CALIBR_BOOST_MAX */ - if (boost_v_1st + cal_offset > TFA9912_CALIBR_BOOST_MAX) - boost_v_1st = TFA9912_CALIBR_BOOST_MAX - cal_offset; - - if (boost_v_2nd + cal_offset > TFA9912_CALIBR_BOOST_MAX) - boost_v_2nd = TFA9912_CALIBR_BOOST_MAX - cal_offset; - - tfa_set_bf_value(TFA9912_BF_DCVOF, boost_v_1st, &new_dcdc_cnt6); - tfa_set_bf_value(TFA9912_BF_DCVOS, boost_v_2nd, &new_dcdc_cnt6); - - /* Change register value only when it's neccesary */ - if (new_dcdc_cnt6 != dcdc_cnt6) { - if (tfa->verbose) - pr_debug("tfa9912: V boost fixup applied. Old 0x%04x, new 0x%04x\n", - dcdc_cnt6, new_dcdc_cnt6); - dcdc_cnt6 = new_dcdc_cnt6; - } - - return dcdc_cnt6; -} - -/* PLMA5322, PLMA5528 - Limit values of DCVOS and DCVOF to range specified in datasheet. */ -enum Tfa98xx_Error tfa9912_reg_write(struct tfa_device *tfa, unsigned char subaddress, unsigned short value) -{ - if (subaddress == TFA9912_DCDCCNT6_REG) { - /* Correct V boost (first and secondary) to ensure 12V is not exceeded. */ - value = tfa9912_vboost_fixup(tfa, value); - } - - return tfa98xx_write_register16(tfa, subaddress, value); -} - -/** Set internal oscillator into power down mode for TFA9912. -* -* This function is a worker for tfa98xx_set_osc_powerdown(). -* -* @param[in] tfa device description structure -* @param[in] state new state 0 - oscillator is on, 1 oscillator is off. -* -* @return Tfa98xx_Error_Ok when successfull, error otherwise. -*/ -static enum Tfa98xx_Error tfa9912_set_osc_powerdown(struct tfa_device *tfa, int state) -{ - if (state == 1 || state == 0) { - return -tfa_set_bf(tfa, TFA9912_BF_MANAOOSC, (uint16_t)state); - } - - return Tfa98xx_Error_Bad_Parameter; -} -/** update low power mode of the device. -* -* @param[in] tfa device description structure -* @param[in] state State of the low power mode1 detector control -* 0 - low power mode1 detector control enabled, -* 1 - low power mode1 detector control disabled(low power mode is also disabled). -* -* @return Tfa98xx_Error_Ok when successfull, error otherwise. -*/ -static enum Tfa98xx_Error tfa9912_update_lpm(struct tfa_device *tfa, int state) -{ - if (state == 1 || state == 0) { - return -tfa_set_bf(tfa, TFA9912_BF_LPM1DIS, (uint16_t)state); - } - return Tfa98xx_Error_Bad_Parameter; -} - -void tfa9912_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9912_specific; - /* PLMA5322, PLMA5528 - Limits values of DCVOS and DCVOF. */ - ops->reg_write = tfa9912_reg_write; - ops->factory_trimmer = tfa9912_factory_trimmer; - ops->auto_copy_mtp_to_iic = tfa9912_auto_copy_mtp_to_iic; - ops->set_swprof = tfa9912_set_swprofile; - ops->get_swprof = tfa9912_get_swprofile; - ops->set_swvstep = tfa9912_set_swvstep; - ops->get_swvstep = tfa9912_get_swvstep; - ops->set_mute = tfa9912_set_mute; - ops->faim_protect = tfa9912_faim_protect; - ops->set_osc_powerdown = tfa9912_set_osc_powerdown; - ops->update_lpm = tfa9912_update_lpm; -} - -/***********************************************************************************/ -/* TFA9872 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9872_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - uint16_t MANAOOSC = 0x0140; /* version 17 */ - unsigned short value, xor; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* Unlock key 1 and 2 */ - error = reg_write(tfa, 0x0F, 0x5A6B); - error = reg_read(tfa, 0xFB, &value); - xor = value ^ 0x005A; - error = reg_write(tfa, 0xA0, xor); - tfa98xx_key2(tfa, 0); - - switch (tfa->rev) { - case 0x1a72: - case 0x2a72: - /* ----- generated code start ----- */ - /* ----- version 26 ----- */ - reg_write(tfa, 0x00, 0x1801); //POR=0x0001 - reg_write(tfa, 0x02, 0x2dc8); //POR=0x2028 - reg_write(tfa, 0x20, 0x0890); //POR=0x2890 - reg_write(tfa, 0x22, 0x043c); //POR=0x045c - reg_write(tfa, 0x51, 0x0000); //POR=0x0080 - reg_write(tfa, 0x52, 0x1a1c); //POR=0x7ae8 - reg_write(tfa, 0x58, 0x161c); //POR=0x101c - reg_write(tfa, 0x61, 0x0198); //POR=0x0000 - reg_write(tfa, 0x65, 0x0a8b); //POR=0x0a9a - reg_write(tfa, 0x70, 0x07f5); //POR=0x06e6 - reg_write(tfa, 0x74, 0xcc84); //POR=0xd823 - reg_write(tfa, 0x82, 0x01ed); //POR=0x000d - reg_write(tfa, 0x83, 0x0014); //POR=0x0013 - reg_write(tfa, 0x84, 0x0021); //POR=0x0020 - reg_write(tfa, 0x85, 0x0001); //POR=0x0003 - /* ----- generated code end ----- */ - break; - case 0x1b72: - case 0x2b72: - case 0x3b72: - /* ----- generated code start ----- */ - /* ----- version 25.00 ----- */ - reg_write(tfa, 0x02, 0x2dc8); //POR=0x2828 - reg_write(tfa, 0x20, 0x0890); //POR=0x2890 - reg_write(tfa, 0x22, 0x043c); //POR=0x045c - reg_write(tfa, 0x23, 0x0001); //POR=0x0003 - reg_write(tfa, 0x51, 0x0000); //POR=0x0080 - reg_write(tfa, 0x52, 0x5a1c); //POR=0x7a08 - reg_write(tfa, 0x61, 0x0198); //POR=0x0000 - reg_write(tfa, 0x63, 0x0a9a); //POR=0x0a93 - reg_write(tfa, 0x65, 0x0a82); //POR=0x0a8d - reg_write(tfa, 0x6f, 0x01e3); //POR=0x02e4 - reg_write(tfa, 0x70, 0x06fd); //POR=0x06e6 - reg_write(tfa, 0x71, 0x307e); //POR=0x207e - reg_write(tfa, 0x74, 0xcc84); //POR=0xd913 - reg_write(tfa, 0x75, 0x1132); //POR=0x118a - reg_write(tfa, 0x82, 0x01ed); //POR=0x000d - reg_write(tfa, 0x83, 0x001a); //POR=0x0013 - /* ----- generated code end ----- */ - break; - default: - pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); - break; - } - - /* Turn off the osc1m to save power: PLMA4928 */ - error = tfa_set_bf(tfa, MANAOOSC, 1); - - /* Bypass OVP by setting bit 3 from register 0xB0 (bypass_ovp=1): PLMA5258 */ - error = reg_read(tfa, 0xB0, &value); - value |= 1 << 3; - error = reg_write(tfa, 0xB0, value); - - return error; -} - -static enum Tfa98xx_Error tfa9872_auto_copy_mtp_to_iic(struct tfa_device *tfa) -{ - /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1. Workaround for 72 and 88 (see PLMA5290) */ - return reg_write(tfa, 0xA3, 0x20); -} - -static int tfa9872_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int active_value = tfa_dev_get_swprof(tfa); - - /* Set the new value in the struct */ - tfa->profile = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9872_BF_SWPROFIL, new_value); - - return active_value; -} - -static int tfa9872_get_swprofile(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9872_BF_SWPROFIL) - 1; -} - -static int tfa9872_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - - /* Set the new value in the struct */ - tfa->vstep = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9872_BF_SWVSTEP, new_value); - - return new_value; -} - -static int tfa9872_get_swvstep(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9872_BF_SWVSTEP) - 1; -} - -void tfa9872_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9872_specific; - ops->auto_copy_mtp_to_iic = tfa9872_auto_copy_mtp_to_iic; - ops->set_swprof = tfa9872_set_swprofile; - ops->get_swprof = tfa9872_get_swprofile; - ops->set_swvstep = tfa9872_set_swvstep; - ops->get_swvstep = tfa9872_get_swvstep; - ops->set_mute = tfa_set_mute_nodsp; -} - -/***********************************************************************************/ -/* TFA9873 */ -/***********************************************************************************/ - -static int tfa9873_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int active_value = tfa_dev_get_swprof(tfa); - - /* Set the new value in the struct */ - tfa->profile = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9873_BF_SWPROFIL, new_value); - - return active_value; -} - -static int tfa9873_get_swprofile(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9873_BF_SWPROFIL) - 1; -} - -static int tfa9873_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - - /* Set the new value in the struct */ - tfa->vstep = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9873_BF_SWVSTEP, new_value); - - return new_value; -} - -static int tfa9873_get_swvstep(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9873_BF_SWVSTEP) - 1; -} - -/* tfa98xx_dsp_system_stable -* return: *ready = 1 when clocks are stable to allow DSP subsystem access -*/ -static enum Tfa98xx_Error tfa9873_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - /* check CLKS: ready if set */ - *ready = tfa_get_bf(tfa, TFA9873_BF_CLKS) == 1; - - return error; -} - -static int tfa9873_get_mtpb(struct tfa_device *tfa) -{ - - int value; - - value = tfa_get_bf(tfa, TFA9873_BF_MTPB); - return value; -} -static enum Tfa98xx_Error tfa9873_faim_protect(struct tfa_device *tfa, int status) -{ - enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; - /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ - ret = tfa_set_bf_volatile(tfa, TFA9873_BF_OPENMTP, (uint16_t)(status)); - return ret; -} -static enum Tfa98xx_Error tfa9873_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short value, xor; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* Unlock key 1 and 2 */ - error = reg_write(tfa, 0x0F, 0x5A6B); - error = reg_read(tfa, 0xFB, &value); - xor = value ^ 0x005A; - error = reg_write(tfa, 0xA0, xor); - tfa98xx_key2(tfa, 0); - - switch (tfa->rev) { - case 0x0a73: - /* Initial revision ID */ - /* ----- generated code start ----- */ - /* ----- version 28 ----- */ - reg_write(tfa, 0x02, 0x0628); //POR=0x0008 - reg_write(tfa, 0x4c, 0x00e9); //POR=0x00ff - reg_write(tfa, 0x52, 0x17d0); //POR=0x57d0 - reg_write(tfa, 0x56, 0x0011); //POR=0x0019 - reg_write(tfa, 0x58, 0x0200); //POR=0x0210 - reg_write(tfa, 0x59, 0x0001); //POR=0x0000 - reg_write(tfa, 0x5f, 0x0180); //POR=0x0100 - reg_write(tfa, 0x61, 0x0183); //POR=0x0a82 - reg_write(tfa, 0x63, 0x055a); //POR=0x0a9a - reg_write(tfa, 0x65, 0x0542); //POR=0x0a82 - reg_write(tfa, 0x6f, 0x00a3); //POR=0x0085 - reg_write(tfa, 0x70, 0xa3fb); //POR=0x23fb - reg_write(tfa, 0x71, 0x007e); //POR=0x107e - reg_write(tfa, 0x83, 0x009a); //POR=0x0799 - reg_write(tfa, 0x84, 0x0211); //POR=0x0011 - reg_write(tfa, 0x85, 0x0382); //POR=0x0380 - reg_write(tfa, 0x8c, 0x0210); //POR=0x0010 - reg_write(tfa, 0xd5, 0x0000); //POR=0x0100 - /* ----- generated code end ----- */ - break; - case 0x0b73: - /* ----- generated code start ----- */ - /* ----- version 13 ----- */ - reg_write(tfa, 0x02, 0x0628); //POR=0x0008 - reg_write(tfa, 0x61, 0x0183); //POR=0x0182 - reg_write(tfa, 0x63, 0x005a); //POR=0x055a - reg_write(tfa, 0x6f, 0x0083); //POR=0x00a5 - reg_write(tfa, 0x70, 0xa3fb); //POR=0x23fb - reg_write(tfa, 0x73, 0x0187); //POR=0x0107 - reg_write(tfa, 0x83, 0x009a); //POR=0x0799 - reg_write(tfa, 0x85, 0x0380); //POR=0x0382 - reg_write(tfa, 0xd5, 0x004d); //POR=0x014d - /* ----- generated code end ----- */ - break; - case 0x1a73: - break; - default: - pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); - break; - } - error = tfa_set_bf_volatile(tfa, TFA9873_BF_FSSYNCEN, 0); - pr_info("info : disabled FS synchronisation!\n"); - return error; -} -void tfa9873_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9873_specific; - ops->set_swprof = tfa9873_set_swprofile; - ops->get_swprof = tfa9873_get_swprofile; - ops->set_swvstep = tfa9873_set_swvstep; - ops->get_swvstep = tfa9873_get_swvstep; - ops->dsp_system_stable = tfa9873_dsp_system_stable; - ops->faim_protect = tfa9873_faim_protect; - ops->get_mtpb = tfa9873_get_mtpb; - ops->set_mute = tfa_set_mute_nodsp; -} - -/***********************************************************************************/ -/* TFA9874 */ -/***********************************************************************************/ - -static enum Tfa98xx_Error tfa9874_faim_protect(struct tfa_device *tfa, int status) -{ - enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; - /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ - ret = tfa_set_bf_volatile(tfa, TFA9874_BF_OPENMTP, (uint16_t)(status)); - return ret; -} - - -static enum Tfa98xx_Error tfa9874_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short value, xor; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* Unlock key 1 and 2 */ - error = reg_write(tfa, 0x0F, 0x5A6B); - error = reg_read(tfa, 0xFB, &value); - xor = value ^ 0x005A; - error = reg_write(tfa, 0xA0, xor); - tfa98xx_key2(tfa, 0); - - switch (tfa->rev) { - case 0x0a74: /* Initial revision ID */ - /* ----- generated code start ----- */ - /* V25 */ - reg_write(tfa, 0x02, 0x22a8); //POR=0x25c8 - reg_write(tfa, 0x51, 0x0020); //POR=0x0000 - reg_write(tfa, 0x52, 0x57dc); //POR=0x56dc - reg_write(tfa, 0x58, 0x16a4); //POR=0x1614 - reg_write(tfa, 0x61, 0x0110); //POR=0x0198 - reg_write(tfa, 0x66, 0x0701); //POR=0x0700 - reg_write(tfa, 0x6f, 0x00a3); //POR=0x01a3 - reg_write(tfa, 0x70, 0x07f8); //POR=0x06f8 - reg_write(tfa, 0x73, 0x0007); //POR=0x0005 - reg_write(tfa, 0x74, 0x5068); //POR=0xcc80 - reg_write(tfa, 0x75, 0x0d28); //POR=0x1138 - reg_write(tfa, 0x83, 0x0594); //POR=0x061a - reg_write(tfa, 0x84, 0x0001); //POR=0x0021 - reg_write(tfa, 0x85, 0x0001); //POR=0x0003 - reg_write(tfa, 0x88, 0x0000); //POR=0x0002 - reg_write(tfa, 0xc4, 0x2001); //POR=0x0001 - /* ----- generated code end ----- */ - break; - case 0x0b74: - /* ----- generated code start ----- */ - /* V1.6 */ - reg_write(tfa, 0x02, 0x22a8); //POR=0x25c8 - reg_write(tfa, 0x51, 0x0020); //POR=0x0000 - reg_write(tfa, 0x52, 0x57dc); //POR=0x56dc - reg_write(tfa, 0x58, 0x16a4); //POR=0x1614 - reg_write(tfa, 0x61, 0x0110); //POR=0x0198 - reg_write(tfa, 0x66, 0x0701); //POR=0x0700 - reg_write(tfa, 0x6f, 0x00a3); //POR=0x01a3 - reg_write(tfa, 0x70, 0x07f8); //POR=0x06f8 - reg_write(tfa, 0x73, 0x0047); //POR=0x0045 - reg_write(tfa, 0x74, 0x5068); //POR=0xcc80 - reg_write(tfa, 0x75, 0x0d28); //POR=0x1138 - reg_write(tfa, 0x83, 0x0595); //POR=0x061a - reg_write(tfa, 0x84, 0x0001); //POR=0x0021 - reg_write(tfa, 0x85, 0x0001); //POR=0x0003 - reg_write(tfa, 0x88, 0x0000); //POR=0x0002 - reg_write(tfa, 0xc4, 0x2001); //POR=0x0001 - /* ----- generated code end ----- */ - break; - case 0x0c74: - /* ----- generated code start ----- */ - /* V1.16 */ - reg_write(tfa, 0x02, 0x22c8); //POR=0x25c8 - reg_write(tfa, 0x52, 0x57dc); //POR=0x56dc - reg_write(tfa, 0x53, 0x003e); //POR=0x001e - reg_write(tfa, 0x56, 0x0400); //POR=0x0600 - reg_write(tfa, 0x61, 0x0110); //POR=0x0198 - reg_write(tfa, 0x6f, 0x00a5); //POR=0x01a3 - reg_write(tfa, 0x70, 0x07f8); //POR=0x06f8 - reg_write(tfa, 0x73, 0x0047); //POR=0x0045 - reg_write(tfa, 0x74, 0x5098); //POR=0xcc80 - reg_write(tfa, 0x75, 0x8d28); //POR=0x1138 - reg_write(tfa, 0x80, 0x0000); //POR=0x0003 - reg_write(tfa, 0x83, 0x0799); //POR=0x061a - reg_write(tfa, 0x84, 0x0081); //POR=0x0021 - /* ----- generated code end ----- */ - break; - default: - pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); - break; - } - - return error; -} - -static int tfa9874_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int active_value = tfa_dev_get_swprof(tfa); - - /* Set the new value in the struct */ - tfa->profile = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9874_BF_SWPROFIL, new_value); - - return active_value; -} - -static int tfa9874_get_swprofile(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9874_BF_SWPROFIL) - 1; -} - -static int tfa9874_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - - /* Set the new value in the struct */ - tfa->vstep = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9874_BF_SWVSTEP, new_value); - - return new_value; -} - -static int tfa9874_get_swvstep(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9874_BF_SWVSTEP) - 1; -} - -/* tfa98xx_dsp_system_stable -* return: *ready = 1 when clocks are stable to allow DSP subsystem access -*/ -static enum Tfa98xx_Error tfa9874_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - /* check CLKS: ready if set */ - *ready = tfa_get_bf(tfa, TFA9874_BF_CLKS) == 1; - - return error; -} - -static int tfa9874_get_mtpb(struct tfa_device *tfa) -{ - - int value; - - value = tfa_get_bf(tfa, TFA9874_BF_MTPB); - return value; -} - -void tfa9874_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9874_specific; - ops->set_swprof = tfa9874_set_swprofile; - ops->get_swprof = tfa9874_get_swprofile; - ops->set_swvstep = tfa9874_set_swvstep; - ops->get_swvstep = tfa9874_get_swvstep; - ops->dsp_system_stable = tfa9874_dsp_system_stable; - ops->faim_protect = tfa9874_faim_protect; - ops->get_mtpb = tfa9874_get_mtpb; - ops->set_mute = tfa_set_mute_nodsp; -} -/***********************************************************************************/ -/* TFA9878 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9878_faim_protect(struct tfa_device *tfa, int status) -{ - enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; - /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ - ret = tfa_set_bf_volatile(tfa, TFA9878_BF_OPENMTP, (uint16_t)(status)); - return ret; -} - - -static enum Tfa98xx_Error tfa9878_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short value, xor; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* Unlock key 1 and 2 */ - error = reg_write(tfa, 0x0F, 0x5A6B); - error = reg_read(tfa, 0xFB, &value); - xor = value ^ 0x005A; - error = reg_write(tfa, 0xA0, xor); - tfa98xx_key2(tfa, 0); - - switch (tfa->rev) { - case 0x0a78: /* Initial revision ID */ -/* ----- generated code start ----- */ -/* ----- version 28 ----- */ - reg_write(tfa, 0x01, 0x2e18); //POR=0x2e88 - reg_write(tfa, 0x02, 0x0628); //POR=0x0008 - reg_write(tfa, 0x04, 0x0240); //POR=0x0340 - reg_write(tfa, 0x52, 0x587c); //POR=0x57dc - reg_write(tfa, 0x61, 0x0183); //POR=0x0a82 - reg_write(tfa, 0x63, 0x055a); //POR=0x0a9a - reg_write(tfa, 0x65, 0x0542); //POR=0x0a82 - reg_write(tfa, 0x71, 0x303e); //POR=0x307e - reg_write(tfa, 0x83, 0x009a); //POR=0x0799 - /* ----- generated code end ----- */ - - - break; - case 0x1a78: /* Initial revision ID */ - /* ----- generated code start ----- */ - /* ----- version 12 ----- */ - reg_write(tfa, 0x01, 0x2e18); //POR=0x2e88 - reg_write(tfa, 0x02, 0x0628); //POR=0x0008 - reg_write(tfa, 0x04, 0x0241); //POR=0x0340 - reg_write(tfa, 0x52, 0x587c); //POR=0x57dc - reg_write(tfa, 0x61, 0x0183); //POR=0x0a82 - reg_write(tfa, 0x63, 0x055a); //POR=0x0a9a - reg_write(tfa, 0x65, 0x0542); //POR=0x0a82 - reg_write(tfa, 0x70, 0xb7ff); //POR=0x37ff - reg_write(tfa, 0x71, 0x303e); //POR=0x307e - reg_write(tfa, 0x83, 0x009a); //POR=0x0799 - reg_write(tfa, 0x84, 0x0211); //POR=0x0011 - reg_write(tfa, 0x8c, 0x0210); //POR=0x0010 - reg_write(tfa, 0xce, 0x2202); //POR=0xa202 - reg_write(tfa, 0xd5, 0x0000); //POR=0x0100 - /* ----- generated code end ----- */ - - break; - default: - pr_info("\nWarning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); - break; - } - - return error; -} - -static int tfa9878_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int active_value = tfa_dev_get_swprof(tfa); - - /* Set the new value in the struct */ - tfa->profile = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9878_BF_SWPROFIL, new_value); - - return active_value; -} - -static int tfa9878_get_swprofile(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9878_BF_SWPROFIL) - 1; -} - -static int tfa9878_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - - /* Set the new value in the struct */ - tfa->vstep = new_value - 1; - - /* Set the new value in the hw register */ - tfa_set_bf_volatile(tfa, TFA9878_BF_SWVSTEP, new_value); - - return new_value; -} - -static int tfa9878_get_swvstep(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9878_BF_SWVSTEP) - 1; -} - -/* tfa98xx_dsp_system_stable -* return: *ready = 1 when clocks are stable to allow DSP subsystem access -*/ -static enum Tfa98xx_Error tfa9878_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - /* check CLKS: ready if set */ - *ready = tfa_get_bf(tfa, TFA9878_BF_CLKS) == 1; - - return error; -} - -static int tfa9878_get_mtpb(struct tfa_device *tfa) -{ - - int value; - - value = tfa_get_bf(tfa, TFA9878_BF_MTPB); - return value; -} - -void tfa9878_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9878_specific; - ops->set_swprof = tfa9878_set_swprofile; - ops->get_swprof = tfa9878_get_swprofile; - ops->set_swvstep = tfa9878_set_swvstep; - ops->get_swvstep = tfa9878_get_swvstep; - ops->dsp_system_stable = tfa9878_dsp_system_stable; - ops->faim_protect = tfa9878_faim_protect; - ops->get_mtpb = tfa9878_get_mtpb; - ops->set_mute = tfa_set_mute_nodsp; -} -/***********************************************************************************/ -/* TFA9888 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9888_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short value, xor; - int patch_version; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* Unlock keys to write settings */ - error = reg_write(tfa, 0x0F, 0x5A6B); - error = reg_read(tfa, 0xFB, &value); - xor = value ^ 0x005A; - error = reg_write(tfa, 0xA0, xor); - - /* Only N1C2 is supported */ - /* ----- generated code start ----- */ - /* --------- Version v1 ---------- */ - if (tfa->rev == 0x2c88) { - reg_write(tfa, 0x00, 0x164d); //POR=0x064d - reg_write(tfa, 0x01, 0x828b); //POR=0x92cb - reg_write(tfa, 0x02, 0x1dc8); //POR=0x1828 - reg_write(tfa, 0x0e, 0x0080); //POR=0x0000 - reg_write(tfa, 0x20, 0x089e); //POR=0x0890 - reg_write(tfa, 0x22, 0x543c); //POR=0x545c - reg_write(tfa, 0x23, 0x0006); //POR=0x0000 - reg_write(tfa, 0x24, 0x0014); //POR=0x0000 - reg_write(tfa, 0x25, 0x000a); //POR=0x0000 - reg_write(tfa, 0x26, 0x0100); //POR=0x0000 - reg_write(tfa, 0x28, 0x1000); //POR=0x0000 - reg_write(tfa, 0x51, 0x0000); //POR=0x00c0 - reg_write(tfa, 0x52, 0xfafe); //POR=0xbaf6 - reg_write(tfa, 0x70, 0x3ee4); //POR=0x3ee6 - reg_write(tfa, 0x71, 0x1074); //POR=0x3074 - reg_write(tfa, 0x83, 0x0014); //POR=0x0013 - /* ----- generated code end ----- */ - } else { - pr_info("Warning: Optimal settings not found for device with revid = 0x%x\n", tfa->rev); - } - - patch_version = tfa_cnt_get_patch_version(tfa); - if (patch_version >= 0x060401) - tfa->partial_enable = 1; - - return error; -} - -static enum Tfa98xx_Error tfa9888_tfa_dsp_write_tables(struct tfa_device *tfa, int sample_rate) -{ - unsigned char buffer[15] = { 0 }; - int size = 15 * sizeof(char); - - /* Write the fractional delay in the hardware register 'cs_frac_delay' */ - switch (sample_rate) { - case 0: /* 8kHz */ - TFA_SET_BF(tfa, FRACTDEL, 40); - break; - case 1: /* 11.025KHz */ - TFA_SET_BF(tfa, FRACTDEL, 38); - break; - case 2: /* 12kHz */ - TFA_SET_BF(tfa, FRACTDEL, 37); - break; - case 3: /* 16kHz */ - TFA_SET_BF(tfa, FRACTDEL, 59); - break; - case 4: /* 22.05KHz */ - TFA_SET_BF(tfa, FRACTDEL, 56); - break; - case 5: /* 24kHz */ - TFA_SET_BF(tfa, FRACTDEL, 56); - break; - case 6: /* 32kHz */ - TFA_SET_BF(tfa, FRACTDEL, 52); - break; - case 7: /* 44.1kHz */ - TFA_SET_BF(tfa, FRACTDEL, 48); - break; - case 8: - default:/* 48kHz */ - TFA_SET_BF(tfa, FRACTDEL, 46); - break; - } - - /* First copy the msg_id to the buffer */ - buffer[0] = (uint8_t)0; - buffer[1] = (uint8_t)MODULE_FRAMEWORK + 128; - buffer[2] = (uint8_t)FW_PAR_ID_SET_SENSES_DELAY; - - /* Required for all FS exept 8kHz (8kHz is all zero) */ - if (sample_rate != 0) { - buffer[5] = 1; /* Vdelay_P */ - buffer[8] = 0; /* Idelay_P */ - buffer[11] = 1; /* Vdelay_S */ - buffer[14] = 0; /* Idelay_S */ - } - - /* send SetSensesDelay msg */ - return dsp_msg(tfa, size, (char *)buffer); -} - -static enum Tfa98xx_Error tfa9888_auto_copy_mtp_to_iic(struct tfa_device *tfa) -{ - /* Set auto_copy_mtp_to_iic (bit 5 of A3) to 1. Workaround for 72 and 88 (see PLMA5290) */ - return reg_write(tfa, 0xA3, 0x20); -} - -static enum Tfa98xx_Error tfa9888_factory_trimmer(struct tfa_device *tfa) -{ - unsigned short currentValue, delta; - int result; - - /* Factory trimming for the Boost converter */ - /* check if there is a correction needed */ - result = TFA_GET_BF(tfa, DCMCCAPI); - if (result) { - /* Get currentvalue of DCMCC and the Delta value */ - currentValue = (unsigned short)TFA_GET_BF(tfa, DCMCC); - delta = (unsigned short)TFA_GET_BF(tfa, USERDEF); - - /* check the sign bit (+/-) */ - result = TFA_GET_BF(tfa, DCMCCSB); - if (result == 0) { - /* Do not exceed the maximum value of 15 */ - if (currentValue + delta < 15) { - TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue + delta); - if (tfa->verbose) - pr_debug("Max coil current is set to: %d\n", currentValue + delta); - } else { - TFA_SET_BF_VOLATILE(tfa, DCMCC, 15); - if (tfa->verbose) - pr_debug("Max coil current is set to: 15\n"); - } - } else if (result == 1) { - /* Do not exceed the minimum value of 0 */ - if (currentValue - delta > 0) { - TFA_SET_BF_VOLATILE(tfa, DCMCC, currentValue - delta); - if (tfa->verbose) - pr_debug("Max coil current is set to: %d\n", currentValue - delta); - } else { - TFA_SET_BF_VOLATILE(tfa, DCMCC, 0); - if (tfa->verbose) - pr_debug("Max coil current is set to: 0\n"); - } - } - } - - return Tfa98xx_Error_Ok; -} - -static enum Tfa98xx_Error -tfa9888_set_mute(struct tfa_device *tfa, int mute) -{ - TFA_SET_BF(tfa, CFSMR, (const uint16_t)mute); - TFA_SET_BF(tfa, CFSML, (const uint16_t)mute); - - return Tfa98xx_Error_Ok; -} - -void tfa9888_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9888_specific; - ops->dsp_write_tables = tfa9888_tfa_dsp_write_tables; - ops->auto_copy_mtp_to_iic = tfa9888_auto_copy_mtp_to_iic; - ops->factory_trimmer = tfa9888_factory_trimmer; - ops->set_mute = tfa9888_set_mute; -} - -/***********************************************************************************/ -/* TFA9896 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9896_faim_protect(struct tfa_device *tfa, int status) -{ - enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; - - if ((tfa->rev == 0x2b96) || (tfa->rev == 0x3b96)) { - ret = tfa_set_bf_volatile(tfa, TFA9896_BF_OPENMTP, (uint16_t)status); - } - - return ret; -} - -/***********************************************************************************/ -/* TFA9896 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9896_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short check_value; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* all i2C registers must already set to default POR value */ - - /* $48:[3] - 1 ==> 0; iddqtestbst - default value changed. - * When Iddqtestbst is set to "0", the slewrate is reduced. - * This will lower the overshoot on IN-B to avoid NMOS damage of booster. - */ - if (tfa->rev == 0x1b96) { - /* ----- generated code start v17 ----- */ - reg_write(tfa, 0x06, 0x000b); //POR=0x0001 - reg_write(tfa, 0x07, 0x3e7f); //POR=0x1e7f - reg_write(tfa, 0x0a, 0x0d8a); //POR=0x0592 - reg_write(tfa, 0x48, 0x0300); //POR=0x0308 - reg_write(tfa, 0x88, 0x0100); //POR=0x0000 - /* ----- generated code end ----- */ - } else if (tfa->rev == 0x2b96) { - /* ----- generated code start ----- v1*/ - reg_write(tfa, 0x06, 0x000b); //POR=0x0001 - reg_write(tfa, 0x07, 0x3e7f); //POR=0x1e7f - reg_write(tfa, 0x0a, 0x0d8a); //POR=0x0592 - reg_write(tfa, 0x48, 0x0300); //POR=0x0308 - reg_write(tfa, 0x88, 0x0100); //POR=0x0000 - /* ----- generated code end ----- */ - } else if (tfa->rev == 0x3b96) { - /* ----- generated code start ----- v1*/ - reg_write(tfa, 0x06, 0x000b); //POR=0x0001 - reg_write(tfa, 0x07, 0x3e7f); //POR=0x1e7f - reg_write(tfa, 0x0a, 0x0d8a); //POR=0x0592 - reg_write(tfa, 0x48, 0x0300); //POR=0x0308 - reg_write(tfa, 0x88, 0x0100); //POR=0x0000 - /* ----- generated code end ----- */ - } - /* $49:[0] - 1 ==> 0; CLIP - default value changed. 0 means CLIPPER on */ - error = reg_read(tfa, 0x49, &check_value); - check_value &= ~0x1; - error = reg_write(tfa, 0x49, check_value); - return error; -} - -/* -* the int24 values for the vsfw delay table -*/ -static unsigned char tfa9896_vsfwdelay_table[] = { - 0, 0, 2, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ - 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ - 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ - 0, 0, 2, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ - 0, 0, 2, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ - 0, 0, 2, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ - 0, 0, 2, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ - 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ - 0, 0, 3 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ -}; - -/* -* TODO make this tfa98xx -* Note that the former products write this table via the patch -* so moving this to the tfa98xx API requires also updating all patches -*/ -static enum Tfa98xx_Error tfa9896_dsp_write_vsfwdelay_table(struct tfa_device *tfa) -{ - return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURRENT_DELAY, sizeof(tfa9896_vsfwdelay_table), tfa9896_vsfwdelay_table); -} - -/* -* The int24 values for the fracdelay table -* For now applicable only for 8 and 48 kHz -*/ -static unsigned char tfa9896_cvfracdelay_table[] = { - 0, 0, 51, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ - 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ - 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ - 0, 0, 38, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ - 0, 0, 34, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ - 0, 0, 33, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ - 0, 0, 11, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ - 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ - 0, 0, 62 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ -}; - -static enum Tfa98xx_Error tfa9896_dsp_write_cvfracdelay_table(struct tfa_device *tfa) -{ - return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURFRAC_DELAY, sizeof(tfa9896_cvfracdelay_table), tfa9896_cvfracdelay_table); -} - -static enum Tfa98xx_Error tfa9896_tfa_dsp_write_tables(struct tfa_device *tfa, int sample_rate) -{ - enum Tfa98xx_Error error; - - /* Not used for max1! */ - (void)sample_rate; - - error = tfa9896_dsp_write_vsfwdelay_table(tfa); - if (error == Tfa98xx_Error_Ok) { - error = tfa9896_dsp_write_cvfracdelay_table(tfa); - } - - return error; -} - -void tfa9896_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9896_specific; - ops->dsp_write_tables = tfa9896_tfa_dsp_write_tables; - ops->faim_protect = tfa9896_faim_protect; -} - -/***********************************************************************************/ -/* TFA9897 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9897_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short check_value; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* all i2C registers must already set to default POR value */ - - /* $48:[3] - 1 ==> 0; iddqtestbst - default value changed. - * When Iddqtestbst is set to "0", the slewrate is reduced. - * This will lower the overshoot on IN-B to avoid NMOS damage of booster */ - error = reg_write(tfa, 0x48, 0x0300); /* POR value = 0x308 */ - - /* $49:[0] - 1 ==> 0; CLIP - default value changed. 0 means CLIPPER on */ - error = reg_read(tfa, 0x49, &check_value); - check_value &= ~0x1; - error = reg_write(tfa, 0x49, check_value); - - return error; -} - -/* -* the int24 values for the vsfw delay table -*/ -static unsigned char tfa9897_vsfwdelay_table[] = { - 0, 0, 2, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ - 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ - 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ - 0, 0, 2, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ - 0, 0, 2, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ - 0, 0, 2, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ - 0, 0, 2, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ - 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ - 0, 0, 3 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ -}; - -/* -* TODO make this tfa98xx -* Note that the former products write this table via the patch -* so moving this to the tfa98xx API requires also updating all patches -*/ -static enum Tfa98xx_Error tfa9897_dsp_write_vsfwdelay_table(struct tfa_device *tfa) -{ - return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURRENT_DELAY, sizeof(tfa9897_vsfwdelay_table), tfa9897_vsfwdelay_table); -} - -/* -* The int24 values for the fracdelay table -* For now applicable only for 8 and 48 kHz -*/ -static unsigned char tfa9897_cvfracdelay_table[] = { - 0, 0, 51, /* Index 0 - Current/Volt Fractional Delay for 8KHz */ - 0, 0, 0, /* Index 1 - Current/Volt Fractional Delay for 11KHz */ - 0, 0, 0, /* Index 2 - Current/Volt Fractional Delay for 12KHz */ - 0, 0, 38, /* Index 3 - Current/Volt Fractional Delay for 16KHz */ - 0, 0, 34, /* Index 4 - Current/Volt Fractional Delay for 22KHz */ - 0, 0, 33, /* Index 5 - Current/Volt Fractional Delay for 24KHz */ - 0, 0, 11, /* Index 6 - Current/Volt Fractional Delay for 32KHz */ - 0, 0, 2, /* Index 7 - Current/Volt Fractional Delay for 44KHz */ - 0, 0, 62 /* Index 8 - Current/Volt Fractional Delay for 48KHz */ -}; - -static enum Tfa98xx_Error tfa9897_dsp_write_cvfracdelay_table(struct tfa_device *tfa) -{ - return tfa_dsp_cmd_id_write(tfa, MODULE_FRAMEWORK, TFA1_FW_PAR_ID_SET_CURFRAC_DELAY, sizeof(tfa9897_cvfracdelay_table), tfa9897_cvfracdelay_table); -} - -static enum Tfa98xx_Error tfa9897_tfa_dsp_write_tables(struct tfa_device *tfa, int sample_rate) -{ - enum Tfa98xx_Error error; - - /* Not used for max1! */ - (void)sample_rate; - - error = tfa9897_dsp_write_vsfwdelay_table(tfa); - if (error == Tfa98xx_Error_Ok) { - error = tfa9897_dsp_write_cvfracdelay_table(tfa); - } - - return error; -} - -void tfa9897_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9897_specific; - ops->dsp_write_tables = tfa9897_tfa_dsp_write_tables; -} - -/***********************************************************************************/ -/* TFA9895 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9895_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - int result; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* all i2C registers are already set to default */ - - result = TFA_SET_BF(tfa, AMPE, 1); - if (result < 0) - return -result; - - /* some other registers must be set for optimal amplifier behaviour */ - reg_write(tfa, 0x05, 0x13AB); - reg_write(tfa, 0x06, 0x001F); - /* peak voltage protection is always on, but may be written */ - reg_write(tfa, 0x08, 0x3C4E); - /*TFA98XX_SYSCTRL_DCA=0*/ - reg_write(tfa, 0x09, 0x024D); - reg_write(tfa, 0x41, 0x0308); - error = reg_write(tfa, 0x49, 0x0E82); - - return error; -} - -void tfa9895_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9895_specific; -} - -/***********************************************************************************/ -/* TFA9891 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9891_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* ----- generated code start ----- */ - /* ----- version 18.0 ----- */ - reg_write(tfa, 0x09, 0x025d); //POR=0x024d - reg_write(tfa, 0x10, 0x0018); //POR=0x0024 - reg_write(tfa, 0x22, 0x0003); //POR=0x0023 - reg_write(tfa, 0x25, 0x0001); //POR=0x0000 - reg_write(tfa, 0x46, 0x0000); //POR=0x4000 - reg_write(tfa, 0x55, 0x3ffb); //POR=0x7fff - /* ----- generated code end ----- */ - - return error; -} - -void tfa9891_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9891_specific; -} - -/***********************************************************************************/ -/* TFA9890 */ -/***********************************************************************************/ -static enum Tfa98xx_Error tfa9890_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short regRead = 0; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - - /* all i2C registers are already set to default for N1C2 */ - - /* some PLL registers must be set optimal for amplifier behaviour */ - error = reg_write(tfa, 0x40, 0x5a6b); - if (error) - return error; - reg_read(tfa, 0x59, ®Read); - regRead |= 0x3; - reg_write(tfa, 0x59, regRead); - error = reg_write(tfa, 0x40, 0x0000); - error = reg_write(tfa, 0x47, 0x7BE1); - - return error; -} - -/* -* Disable clock gating -*/ -static enum Tfa98xx_Error tfa9890_clockgating(struct tfa_device *tfa, int on) -{ - enum Tfa98xx_Error error; - unsigned short value; - - /* for TFA9890 temporarily disable clock gating when dsp reset is used */ - error = reg_read(tfa, TFA98XX_CURRENTSENSE4, &value); - if (error) return error; - - if (Tfa98xx_Error_Ok == error) { - if (on) /* clock gating on - clear the bit */ - value &= ~TFA98XX_CURRENTSENSE4_CTRL_CLKGATECFOFF; - else /* clock gating off - set the bit */ - value |= TFA98XX_CURRENTSENSE4_CTRL_CLKGATECFOFF; - - error = reg_write(tfa, TFA98XX_CURRENTSENSE4, value); - } - - return error; -} - -/* -* Tfa9890_DspReset will deal with clock gating control in order -* to reset the DSP for warm state restart -*/ -static enum Tfa98xx_Error tfa9890_dsp_reset(struct tfa_device *tfa, int state) -{ - enum Tfa98xx_Error error; - - /* for TFA9890 temporarily disable clock gating - when dsp reset is used */ - tfa9890_clockgating(tfa, 0); - - TFA_SET_BF(tfa, RST, (uint16_t)state); - - /* clock gating restore */ - error = tfa9890_clockgating(tfa, 1); - - return error; -} - -/* - * Tfa9890_DspSystemStable will compensate for the wrong behavior of CLKS - * to determine if the DSP subsystem is ready for patch and config loading. - * - * A MTP calibration register is checked for non-zero. - * - * Note: This only works after i2c reset as this will clear the MTP contents. - * When we are configured then the DSP communication will synchronize access. - * - */ -static enum Tfa98xx_Error tfa9890_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short status, mtp0; - int result, tries; - - /* check the contents of the STATUS register */ - result = TFA_READ_REG(tfa, AREFS); - if (result < 0) { - error = -result; - goto errorExit; - } - status = (unsigned short)result; - - /* if AMPS is set then we were already configured and running - * no need to check further - */ - *ready = (TFA_GET_BF_VALUE(tfa, AMPS, status) == 1); - if (*ready) /* if ready go back */ - return error; /* will be Tfa98xx_Error_Ok */ - - /* check AREFS and CLKS: not ready if either is clear */ - *ready = !((TFA_GET_BF_VALUE(tfa, AREFS, status) == 0) - || (TFA_GET_BF_VALUE(tfa, CLKS, status) == 0)); - if (!*ready) /* if not ready go back */ - return error; /* will be Tfa98xx_Error_Ok */ - - /* check MTPB - * mtpbusy will be active when the subsys copies MTP to I2C - * 2 times retry avoids catching this short mtpbusy active period - */ - for (tries = 2; tries > 0; tries--) { - result = TFA_GET_BF(tfa, MTPB);/*TODO_MTPB*/ - if (result < 0) { - error = -result; - goto errorExit; - } - status = (unsigned short)result; - - /* check the contents of the STATUS register */ - *ready = (result == 0); - if (*ready) /* if ready go on */ - break; - } - if (tries == 0) /* ready will be 0 if retries exausted */ - return Tfa98xx_Error_Ok; - - /* check the contents of MTP register for non-zero, - * this indicates that the subsys is ready */ - - error = reg_read(tfa, 0x84, &mtp0); - if (error) - goto errorExit; - - *ready = (mtp0 != 0); /* The MTP register written? */ - - return error; - -errorExit: - *ready = 0; - return error; -} - -void tfa9890_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9890_specific; - ops->dsp_reset = tfa9890_dsp_reset; - ops->dsp_system_stable = tfa9890_dsp_system_stable; -} - -/***********************************************************************************/ -/* TFA9894 */ -/***********************************************************************************/ -static int tfa9894_set_swprofile(struct tfa_device *tfa, unsigned short new_value) -{ - int active_value = tfa_dev_get_swprof(tfa); - - /* Set the new value in the struct */ - tfa->profile = new_value - 1; - tfa_set_bf_volatile(tfa, TFA9894_BF_SWPROFIL, new_value); - return active_value; -} - -static int tfa9894_get_swprofile(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9894_BF_SWPROFIL) - 1; -} - -static int tfa9894_set_swvstep(struct tfa_device *tfa, unsigned short new_value) -{ - /* Set the new value in the struct */ - tfa->vstep = new_value - 1; - tfa_set_bf_volatile(tfa, TFA9894_BF_SWVSTEP, new_value); - return new_value; -} - -static int tfa9894_get_swvstep(struct tfa_device *tfa) -{ - return tfa_get_bf(tfa, TFA9894_BF_SWVSTEP) - 1; -} - -static int tfa9894_get_mtpb(struct tfa_device *tfa) -{ - int value = 0; - - value = tfa_get_bf(tfa, TFA9894_BF_MTPB); - return value; -} - -/** Set internal oscillator into power down mode for TFA9894. -* -* This function is a worker for tfa98xx_set_osc_powerdown(). -* -* @param[in] tfa device description structure -* @param[in] state new state 0 - oscillator is on, 1 oscillator is off. -* -* @return Tfa98xx_Error_Ok when successfull, error otherwise. -*/ -static enum Tfa98xx_Error tfa9894_set_osc_powerdown(struct tfa_device *tfa, int state) -{ - if (state == 1 || state == 0) { - return -tfa_set_bf(tfa, TFA9894_BF_MANAOOSC, (uint16_t)state); - } - - return Tfa98xx_Error_Bad_Parameter; -} - -static enum Tfa98xx_Error tfa9894_faim_protect(struct tfa_device *tfa, int status) -{ - enum Tfa98xx_Error ret = Tfa98xx_Error_Ok; - /* 0b = FAIM protection enabled 1b = FAIM protection disabled*/ - ret = tfa_set_bf_volatile(tfa, TFA9894_BF_OPENMTP, (uint16_t)(status)); - return ret; -} - -static enum Tfa98xx_Error tfa9894_specific(struct tfa_device *tfa) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - unsigned short value, xor; - - if (tfa->in_use == 0) - return Tfa98xx_Error_NotOpen; - if (tfa->verbose) - if (is_94_N2_device(tfa)) - pr_debug("check_correct\n"); - /* Unlock keys to write settings */ - error = reg_write(tfa, 0x0F, 0x5A6B); - error = reg_read(tfa, 0xFB, &value); - xor = value ^ 0x005A; - error = reg_write(tfa, 0xA0, xor); - pr_debug("Device REFID:%x\n", tfa->rev); - /* The optimal settings */ - if (tfa->rev == 0x0a94) { - /* V36 */ - /* ----- generated code start ----- */ - reg_write(tfa, 0x00, 0xa245); //POR=0x8245 - reg_write(tfa, 0x02, 0x51e8); //POR=0x55c8 - reg_write(tfa, 0x52, 0xbe17); //POR=0xb617 - reg_write(tfa, 0x57, 0x0344); //POR=0x0366 - reg_write(tfa, 0x61, 0x0033); //POR=0x0073 - reg_write(tfa, 0x71, 0x00cf); //POR=0x018d - reg_write(tfa, 0x72, 0x34a9); //POR=0x44e8 - reg_write(tfa, 0x73, 0x3808); //POR=0x3806 - reg_write(tfa, 0x76, 0x0067); //POR=0x0065 - reg_write(tfa, 0x80, 0x0000); //POR=0x0003 - reg_write(tfa, 0x81, 0x5715); //POR=0x561a - reg_write(tfa, 0x82, 0x0104); //POR=0x0044 - /* ----- generated code end ----- */ - } else if (tfa->rev == 0x1a94) { - /* V17 */ - /* ----- generated code start ----- */ - reg_write(tfa, 0x00, 0xa245); //POR=0x8245 - reg_write(tfa, 0x01, 0x15da); //POR=0x11ca - reg_write(tfa, 0x02, 0x5288); //POR=0x55c8 - reg_write(tfa, 0x52, 0xbe17); //POR=0xb617 - reg_write(tfa, 0x53, 0x0dbe); //POR=0x0d9e - reg_write(tfa, 0x56, 0x05c3); //POR=0x07c3 - reg_write(tfa, 0x57, 0x0344); //POR=0x0366 - reg_write(tfa, 0x61, 0x0032); //POR=0x0073 - reg_write(tfa, 0x71, 0x00cf); //POR=0x018d - reg_write(tfa, 0x72, 0x34a9); //POR=0x44e8 - reg_write(tfa, 0x73, 0x38c8); //POR=0x3806 - reg_write(tfa, 0x76, 0x0067); //POR=0x0065 - reg_write(tfa, 0x80, 0x0000); //POR=0x0003 - reg_write(tfa, 0x81, 0x5799); //POR=0x561a - reg_write(tfa, 0x82, 0x0104); //POR=0x0044 - /* ----- generated code end ----- */ - - } else if (tfa->rev == 0x2a94 || tfa->rev == 0x3a94) { - /* ----- generated code start ----- */ - /* ----- version 25.00 ----- */ - reg_write(tfa, 0x01, 0x15da); //POR=0x11ca - reg_write(tfa, 0x02, 0x51e8); //POR=0x55c8 - reg_write(tfa, 0x04, 0x0200); //POR=0x0000 - reg_write(tfa, 0x52, 0xbe17); //POR=0xb617 - reg_write(tfa, 0x53, 0x0dbe); //POR=0x0d9e - reg_write(tfa, 0x57, 0x0344); //POR=0x0366 - reg_write(tfa, 0x61, 0x0032); //POR=0x0073 - reg_write(tfa, 0x71, 0x6ecf); //POR=0x6f8d - reg_write(tfa, 0x72, 0xb4a9); //POR=0x44e8 - reg_write(tfa, 0x73, 0x38c8); //POR=0x3806 - reg_write(tfa, 0x76, 0x0067); //POR=0x0065 - reg_write(tfa, 0x80, 0x0000); //POR=0x0003 - reg_write(tfa, 0x81, 0x5799); //POR=0x561a - reg_write(tfa, 0x82, 0x0104); //POR=0x0044 - /* ----- generated code end ----- */ - } - return error; -} - -static enum Tfa98xx_Error -tfa9894_set_mute(struct tfa_device *tfa, int mute) -{ - tfa_set_bf(tfa, TFA9894_BF_CFSM, (const uint16_t)mute); - return Tfa98xx_Error_Ok; -} - -static enum Tfa98xx_Error tfa9894_dsp_system_stable(struct tfa_device *tfa, int *ready) -{ - enum Tfa98xx_Error error = Tfa98xx_Error_Ok; - - /* check CLKS: ready if set */ - *ready = tfa_get_bf(tfa, TFA9894_BF_CLKS) == 1; - - return error; -} - -void tfa9894_ops(struct tfa_device_ops *ops) -{ - /* Set defaults for ops */ - set_ops_defaults(ops); - - ops->tfa_init = tfa9894_specific; - ops->dsp_system_stable = tfa9894_dsp_system_stable; - ops->set_mute = tfa9894_set_mute; - ops->faim_protect = tfa9894_faim_protect; - ops->get_mtpb = tfa9894_get_mtpb; - ops->set_swprof = tfa9894_set_swprofile; - ops->get_swprof = tfa9894_get_swprofile; - ops->set_swvstep = tfa9894_set_swvstep; - ops->get_swvstep = tfa9894_get_swvstep; - //ops->auto_copy_mtp_to_iic = tfa9894_auto_copy_mtp_to_iic; - ops->set_osc_powerdown = tfa9894_set_osc_powerdown; -} diff --git a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_internal.h b/techpack/audio/asoc/codecs/tfa98xx/src/tfa_internal.h deleted file mode 100644 index 45c6f3f5bcda..000000000000 --- a/techpack/audio/asoc/codecs/tfa98xx/src/tfa_internal.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. - * Copyright 2020 GOODIX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -/* - internal functions for TFA layer (not shared with SRV and HAL layer!) -*/ - -#ifndef __TFA_INTERNAL_H__ -#define __TFA_INTERNAL_H__ - -#include "tfa_dsp_fw.h" -#include "tfa_ext.h" - -#if __GNUC__ >= 4 - #define TFA_INTERNAL __attribute__ ((visibility("hidden"))) -#else - #define TFA_INTERNAL -#endif - -#define TFA98XX_GENERIC_SLAVE_ADDRESS 0x1C - -TFA_INTERNAL enum Tfa98xx_Error tfa98xx_check_rpc_status(struct tfa_device *tfa, int *pRpcStatus); -TFA_INTERNAL enum Tfa98xx_Error tfa98xx_wait_result(struct tfa_device *tfa, int waitRetryCount); - -#endif /* __TFA_INTERNAL_H__ */ - diff --git a/techpack/audio/asoc/codecs/wcd-clsh.c b/techpack/audio/asoc/codecs/wcd-clsh.c deleted file mode 100644 index 6f54593aff93..000000000000 --- a/techpack/audio/asoc/codecs/wcd-clsh.c +++ /dev/null @@ -1,580 +0,0 @@ -/* - * Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include "wcd-clsh.h" - -#define WCD_USLEEP_RANGE 50 - -static void (*clsh_state_fp[NUM_CLSH_STATES])(struct snd_soc_codec *, - struct wcd_clsh_cdc_info *, - u8 req_state, bool en, int mode); - -static const char *mode_to_str(int mode) -{ - switch (mode) { - case CLS_H_NORMAL: - return WCD_CLSH_STRINGIFY(CLS_H_NORMAL); - case CLS_H_HIFI: - return WCD_CLSH_STRINGIFY(CLS_H_HIFI); - case CLS_H_LOHIFI: - return WCD_CLSH_STRINGIFY(CLS_H_LOHIFI); - case CLS_H_LP: - return WCD_CLSH_STRINGIFY(CLS_H_LP); - case CLS_H_ULP: - return WCD_CLSH_STRINGIFY(CLS_H_ULP); - case CLS_AB: - return WCD_CLSH_STRINGIFY(CLS_AB); - case CLS_AB_HIFI: - return WCD_CLSH_STRINGIFY(CLS_AB_HIFI); - default: - return WCD_CLSH_STRINGIFY(CLS_H_INVALID); - }; -} - -static const char *state_to_str(u8 state, char *buf, size_t buflen) -{ - int i; - int cnt = 0; - /* - * This array of strings should match with enum wcd_clsh_state_bit. - */ - static const char *const states[] = { - "STATE_EAR", - "STATE_HPH_L", - "STATE_HPH_R", - "STATE_AUX", - }; - - if (state == WCD_CLSH_STATE_IDLE) { - snprintf(buf, buflen, "[STATE_IDLE]"); - goto done; - } - - buf[0] = '\0'; - for (i = 0; i < ARRAY_SIZE(states); i++) { - if (!(state & (1 << i))) - continue; - cnt = snprintf(buf, buflen - cnt - 1, "%s%s%s", buf, - buf[0] == '\0' ? "[" : "|", - states[i]); - } - if (cnt > 0) - strlcat(buf + cnt, "]", buflen); - -done: - if (buf[0] == '\0') - snprintf(buf, buflen, "[STATE_UNKNOWN]"); - return buf; -} - -static inline int wcd_clsh_get_int_mode(struct wcd_clsh_cdc_info *clsh_d, - int clsh_state) -{ - int mode; - - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_AUX)) - mode = CLS_NONE; - else - mode = clsh_d->interpolator_modes[ffs(clsh_state)]; - - return mode; -} - -static inline void wcd_clsh_set_int_mode(struct wcd_clsh_cdc_info *clsh_d, - int clsh_state, int mode) -{ - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_AUX)) - return; - - clsh_d->interpolator_modes[ffs(clsh_state)] = mode; -} - -static inline void wcd_clsh_set_buck_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x08, 0x08); /* set to HIFI */ - else - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x08, 0x00); /* set to default */ -} - -static inline void wcd_clsh_set_flyback_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI) { - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x80); - } else { - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x04, 0x00); /* set to Default */ - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x70); - } -} - -static inline void wcd_clsh_force_iq_ctl(struct snd_soc_codec *codec, - int mode, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, 0xA0); - /* 100usec delay is needed as per HW requirement */ - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_3, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_2, - 0xFF, 0x1C); - if (mode == CLS_H_LOHIFI) { - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x20); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0xC0); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x02); - } - } else { - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x00); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0x80); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x06); - } -} - -static void wcd_clsh_buck_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - int mode, - bool enable) -{ - /* enable/disable buck */ - if ((enable && (++clsh_d->buck_users == 1)) || - (!enable && (--clsh_d->buck_users == 0))) { - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - (1 << 7), (enable << 7)); - /* - * 500us sleep is required after buck enable/disable - * as per HW requirement - */ - usleep_range(500, 510); - if (mode == CLS_H_LOHIFI || mode == CLS_H_ULP || - mode == CLS_H_HIFI || mode == CLS_H_LP) - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_3, - 0x02, 0x00); - - snd_soc_update_bits(codec, WCD9XXX_CLASSH_MODE_2, 0xFF, 0x3A); - /* 500usec delay is needed as per HW requirement */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); - } - dev_dbg(codec->dev, "%s: buck_users %d, enable %d, mode: %s\n", - __func__, clsh_d->buck_users, enable, mode_to_str(mode)); -} - -static void wcd_clsh_flyback_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - int mode, - bool enable) -{ - /* enable/disable flyback */ - if ((enable && (++clsh_d->flyback_users == 1)) || - (!enable && (--clsh_d->flyback_users == 0))) { - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_1, - 0xE0, 0xE0); - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - (1 << 6), (enable << 6)); - /* - * 100us sleep is required after flyback enable/disable - * as per HW requirement - */ - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, 0xE0); - /* 500usec delay is needed as per HW requirement */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); - } - dev_dbg(codec->dev, "%s: flyback_users %d, enable %d, mode: %s\n", - __func__, clsh_d->flyback_users, enable, mode_to_str(mode)); -} - -static void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec, - int mode) -{ - u8 val = 0; - - switch (mode) { - case CLS_H_NORMAL: - val = 0x00; - break; - case CLS_AB: - case CLS_H_ULP: - val = 0x0C; - break; - case CLS_AB_HIFI: - case CLS_H_HIFI: - val = 0x08; - break; - case CLS_H_LP: - case CLS_H_LOHIFI: - val = 0x04; - break; - default: - dev_err(codec->dev, "%s:Invalid mode %d\n", __func__, mode); - return; - }; - - snd_soc_update_bits(codec, WCD9XXX_ANA_HPH, 0x0C, val); -} - -static void wcd_clsh_set_flyback_current(struct snd_soc_codec *codec, int mode) -{ - - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0x0F, 0x0A); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0xF0, 0xA0); - /* Sleep needed to avoid click and pop as per HW requirement */ - usleep_range(100, 110); -} - -static void wcd_clsh_set_buck_regulator_mode(struct snd_soc_codec *codec, - int mode) -{ - snd_soc_update_bits(codec, WCD9XXX_ANA_RX_SUPPLIES, - 0x02, 0x00); -} - -static void wcd_clsh_state_ear_aux(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_aux(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_st(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); -} - -static void wcd_clsh_state_hph_r(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_dbg(codec->dev, "%s: Normal mode not applicable for hph_r\n", - __func__); - return; - } - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode, true); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - /* buck and flyback set to default mode and disable */ - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_hph_l(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_dbg(codec->dev, "%s: Normal mode not applicable for hph_l\n", - __func__); - return; - } - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode, true); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - /* set buck and flyback to Default Mode */ - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_aux(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - } else { - wcd_clsh_buck_ctrl(codec, clsh_d, mode, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode, true); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - /* set buck and flyback to Default Mode */ - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_err(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - char msg[128]; - - dev_err(codec->dev, - "%s Wrong request for class H state machine requested to %s %s\n", - __func__, is_enable ? "enable" : "disable", - state_to_str(req_state, msg, sizeof(msg))); -} - -/* - * Function: wcd_clsh_is_state_valid - * Params: state - * Description: - * Provides information on valid states of Class H configuration - */ -static bool wcd_clsh_is_state_valid(u8 state) -{ - switch (state) { - case WCD_CLSH_STATE_IDLE: - case WCD_CLSH_STATE_EAR: - case WCD_CLSH_STATE_HPHL: - case WCD_CLSH_STATE_HPHR: - case WCD_CLSH_STATE_HPH_ST: - case WCD_CLSH_STATE_AUX: - case WCD_CLSH_STATE_HPHL_AUX: - case WCD_CLSH_STATE_HPHR_AUX: - case WCD_CLSH_STATE_HPH_ST_AUX: - case WCD_CLSH_STATE_EAR_AUX: - case WCD_CLSH_STATE_HPHL_EAR: - case WCD_CLSH_STATE_HPHR_EAR: - case WCD_CLSH_STATE_HPH_ST_EAR: - return true; - default: - return false; - }; -} - -/* - * Function: wcd_cls_h_fsm - * Params: codec, cdc_clsh_d, req_state, req_type, clsh_event - * Description: - * This function handles PRE DAC and POST DAC conditions of different devices - * and updates class H configuration of different combination of devices - * based on validity of their states. cdc_clsh_d will contain current - * class h state information - */ -void wcd_cls_h_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode) -{ - u8 old_state, new_state; - char msg0[128], msg1[128]; - - switch (clsh_event) { - case WCD_CLSH_EVENT_PRE_DAC: - old_state = cdc_clsh_d->state; - new_state = old_state | req_state; - - if (!wcd_clsh_is_state_valid(new_state)) { - dev_err(codec->dev, - "%s: Class-H not a valid new state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, int_mode); - (*clsh_state_fp[new_state]) (codec, cdc_clsh_d, req_state, - CLSH_REQ_ENABLE, int_mode); - dev_dbg(codec->dev, - "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, sizeof(msg1))); - break; - case WCD_CLSH_EVENT_POST_PA: - old_state = cdc_clsh_d->state; - new_state = old_state & (~req_state); - if (new_state < NUM_CLSH_STATES) { - if (!wcd_clsh_is_state_valid(old_state)) { - dev_err(codec->dev, - "%s:Invalid old state:%s\n", - __func__, - state_to_str(old_state, msg0, - sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, - sizeof(msg0))); - return; - } - (*clsh_state_fp[old_state]) (codec, cdc_clsh_d, - req_state, CLSH_REQ_DISABLE, - int_mode); - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, CLS_NONE); - dev_dbg(codec->dev, "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, - sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, - sizeof(msg1))); - } - break; - }; -} -EXPORT_SYMBOL(wcd_cls_h_fsm); - -/* - * wcd_cls_h_init: Called to init clsh info - * - * @clsh: pointer for clsh state information. - */ -void wcd_cls_h_init(struct wcd_clsh_cdc_info *clsh) -{ - int i; - - clsh->state = WCD_CLSH_STATE_IDLE; - - for (i = 0; i < NUM_CLSH_STATES; i++) - clsh_state_fp[i] = wcd_clsh_state_err; - - clsh_state_fp[WCD_CLSH_STATE_EAR] = wcd_clsh_state_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHL] = wcd_clsh_state_hph_l; - clsh_state_fp[WCD_CLSH_STATE_HPHR] = wcd_clsh_state_hph_r; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST] = wcd_clsh_state_hph_st; - clsh_state_fp[WCD_CLSH_STATE_AUX] = wcd_clsh_state_aux; - clsh_state_fp[WCD_CLSH_STATE_HPHL_AUX] = wcd_clsh_state_hph_aux; - clsh_state_fp[WCD_CLSH_STATE_HPHR_AUX] = wcd_clsh_state_hph_aux; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_AUX] = - wcd_clsh_state_hph_aux; - clsh_state_fp[WCD_CLSH_STATE_EAR_AUX] = wcd_clsh_state_ear_aux; - clsh_state_fp[WCD_CLSH_STATE_HPHL_EAR] = wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHR_EAR] = wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_EAR] = wcd_clsh_state_hph_ear; - /* Set interpolaotr modes to NONE */ - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_EAR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHL, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_AUX, CLS_NONE); - clsh->flyback_users = 0; - clsh->buck_users = 0; -} -EXPORT_SYMBOL(wcd_cls_h_init); - -MODULE_DESCRIPTION("WCD Class-H Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd-clsh.h b/techpack/audio/asoc/codecs/wcd-clsh.h deleted file mode 100644 index df305bcf7aa1..000000000000 --- a/techpack/audio/asoc/codecs/wcd-clsh.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD_CLSH -#define _WCD_CLSH - -#include - -#define WCD_CLSH_STRINGIFY(s) __stringify(s) -#define CLSH_REQ_ENABLE true -#define CLSH_REQ_DISABLE false - -#define WCD_CLSH_EVENT_PRE_DAC 0x01 -#define WCD_CLSH_EVENT_POST_PA 0x02 -/* - * Basic states for Class H state machine. - * represented as a bit mask within a u8 data type - * bit 0: EAR mode - * bit 1: HPH Left mode - * bit 2: HPH Right mode - * bit 3: AUX mode - */ -#define WCD_CLSH_STATE_IDLE 0x00 -#define WCD_CLSH_STATE_EAR (0x01 << 0) -#define WCD_CLSH_STATE_HPHL (0x01 << 1) -#define WCD_CLSH_STATE_HPHR (0x01 << 2) -#define WCD_CLSH_STATE_AUX (0x01 << 3) - -/* - * Though number of CLSH states is 4, max state should be 5 - * because state array index starts from 1. - */ -#define WCD_CLSH_STATE_MAX 5 -#define NUM_CLSH_STATES (0x01 << WCD_CLSH_STATE_MAX) - -/* Derived State: Bits 1 and 2 should be set for Headphone stereo */ -#define WCD_CLSH_STATE_HPH_ST (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_HPHR) - -#define WCD_CLSH_STATE_HPHL_AUX (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_HPHR_AUX (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_HPH_ST_AUX (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_EAR_AUX (WCD_CLSH_STATE_EAR | \ - WCD_CLSH_STATE_AUX) -#define WCD_CLSH_STATE_HPHL_EAR (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPHR_EAR (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPH_ST_EAR (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_EAR) - -enum { - CLS_H_NORMAL = 0, /* Class-H Default */ - CLS_H_HIFI, /* Class-H HiFi */ - CLS_H_LP, /* Class-H Low Power */ - CLS_AB, /* Class-AB Low HIFI*/ - CLS_H_LOHIFI, /* LoHIFI */ - CLS_H_ULP, /* Ultra Low power */ - CLS_AB_HIFI, /* Class-AB */ - CLS_NONE, /* None of the above modes */ -}; - -/* Class H data that the codec driver will maintain */ -struct wcd_clsh_cdc_info { - u8 state; - int flyback_users; - int buck_users; - int interpolator_modes[WCD_CLSH_STATE_MAX]; -}; - -#ifdef CONFIG_SND_SOC_WCD9XXX_V2 -extern void wcd_cls_h_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode); - -extern void wcd_cls_h_init(struct wcd_clsh_cdc_info *clsh); -#else -extern void wcd_cls_h_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_info *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode) -{ -} - -extern void wcd_cls_h_init(struct wcd_clsh_cdc_info *clsh) -{ -} -#endif /* CONFIG_SND_SOC_WCD9XXX_V2 */ - -#endif diff --git a/techpack/audio/asoc/codecs/wcd-dsp-mgr.c b/techpack/audio/asoc/codecs/wcd-dsp-mgr.c deleted file mode 100644 index 647a07ef7242..000000000000 --- a/techpack/audio/asoc/codecs/wcd-dsp-mgr.c +++ /dev/null @@ -1,1395 +0,0 @@ -/* - * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-dsp-utils.h" - -/* Forward declarations */ -static char *wdsp_get_cmpnt_type_string(enum wdsp_cmpnt_type); - -/* Component related macros */ -#define WDSP_GET_COMPONENT(wdsp, x) ((x >= WDSP_CMPNT_TYPE_MAX || x < 0) ? \ - NULL : (&(wdsp->cmpnts[x]))) -#define WDSP_GET_CMPNT_TYPE_STR(x) wdsp_get_cmpnt_type_string(x) - -/* - * These #defines indicate the bit number in status field - * for each of the status. If bit is set, it indicates - * the status as done, else if bit is not set, it indicates - * the status is either failed or not done. - */ -#define WDSP_STATUS_INITIALIZED BIT(0) -#define WDSP_STATUS_CODE_DLOADED BIT(1) -#define WDSP_STATUS_DATA_DLOADED BIT(2) -#define WDSP_STATUS_BOOTED BIT(3) - -/* Helper macros for printing wdsp messages */ -#define WDSP_ERR(wdsp, fmt, ...) \ - dev_err(wdsp->mdev, "%s: " fmt "\n", __func__, ##__VA_ARGS__) -#define WDSP_DBG(wdsp, fmt, ...) \ - dev_dbg(wdsp->mdev, "%s: " fmt "\n", __func__, ##__VA_ARGS__) - -/* Helper macros for locking */ -#define WDSP_MGR_MUTEX_LOCK(wdsp, lock) \ -{ \ - WDSP_DBG(wdsp, "mutex_lock(%s)", \ - __stringify_1(lock)); \ - mutex_lock(&lock); \ -} - -#define WDSP_MGR_MUTEX_UNLOCK(wdsp, lock) \ -{ \ - WDSP_DBG(wdsp, "mutex_unlock(%s)", \ - __stringify_1(lock)); \ - mutex_unlock(&lock); \ -} - -/* Helper macros for using status mask */ -#define WDSP_SET_STATUS(wdsp, state) \ -{ \ - wdsp->status |= state; \ - WDSP_DBG(wdsp, "set 0x%lx, new_state = 0x%x", \ - state, wdsp->status); \ -} - -#define WDSP_CLEAR_STATUS(wdsp, state) \ -{ \ - wdsp->status &= (~state); \ - WDSP_DBG(wdsp, "clear 0x%lx, new_state = 0x%x", \ - state, wdsp->status); \ -} - -#define WDSP_STATUS_IS_SET(wdsp, state) (wdsp->status & state) - -/* SSR relate status macros */ -#define WDSP_SSR_STATUS_WDSP_READY BIT(0) -#define WDSP_SSR_STATUS_CDC_READY BIT(1) -#define WDSP_SSR_STATUS_READY \ - (WDSP_SSR_STATUS_WDSP_READY | WDSP_SSR_STATUS_CDC_READY) -#define WDSP_SSR_READY_WAIT_TIMEOUT (10 * HZ) -#define WDSP_FW_LOAD_RETRY_COUNT 5 - -enum wdsp_ssr_type { - - /* Init value, indicates there is no SSR in progress */ - WDSP_SSR_TYPE_NO_SSR = 0, - - /* - * Indicates WDSP crashed. The manager driver internally - * decides when to perform WDSP restart based on the - * users of wdsp. Hence there is no explicit WDSP_UP. - */ - WDSP_SSR_TYPE_WDSP_DOWN, - - /* Indicates codec hardware is down */ - WDSP_SSR_TYPE_CDC_DOWN, - - /* Indicates codec hardware is up, trigger to restart WDSP */ - WDSP_SSR_TYPE_CDC_UP, -}; - -struct wdsp_cmpnt { - - /* OF node of the phandle */ - struct device_node *np; - - /* - * Child component's dev_name, should be set in DT for the child's - * phandle if child's dev->of_node does not match the phandle->of_node - */ - const char *cdev_name; - - /* Child component's device node */ - struct device *cdev; - - /* Private data that component may want back on callbacks */ - void *priv_data; - - /* Child ops */ - struct wdsp_cmpnt_ops *ops; -}; - -struct wdsp_ramdump_data { - - /* Ramdump device */ - void *rd_dev; - - /* DMA address of the dump */ - dma_addr_t rd_addr; - - /* Virtual address of the dump */ - void *rd_v_addr; - - /* Data provided through error interrupt */ - struct wdsp_err_signal_arg err_data; -}; - -struct wdsp_mgr_priv { - - /* Manager driver's struct device pointer */ - struct device *mdev; - - /* Match struct for component framework */ - struct component_match *match; - - /* Manager's ops/function callbacks */ - struct wdsp_mgr_ops *ops; - - /* Array to store information for all expected components */ - struct wdsp_cmpnt cmpnts[WDSP_CMPNT_TYPE_MAX]; - - /* The filename of image to be downloaded */ - const char *img_fname; - - /* Keeps track of current state of manager driver */ - u32 status; - - /* Work to load the firmware image after component binding */ - struct work_struct load_fw_work; - - /* List of segments in image to be downloaded */ - struct list_head *seg_list; - - /* Base address of the image in memory */ - u32 base_addr; - - /* Instances using dsp */ - int dsp_users; - - /* Lock for serializing ops called by components */ - struct mutex api_mutex; - - struct wdsp_ramdump_data dump_data; - - /* SSR related */ - enum wdsp_ssr_type ssr_type; - struct mutex ssr_mutex; - struct work_struct ssr_work; - u16 ready_status; - struct completion ready_compl; - - /* Debugfs related */ - struct dentry *entry; - bool panic_on_error; -}; - -static char *wdsp_get_ssr_type_string(enum wdsp_ssr_type type) -{ - switch (type) { - case WDSP_SSR_TYPE_NO_SSR: - return "NO_SSR"; - case WDSP_SSR_TYPE_WDSP_DOWN: - return "WDSP_DOWN"; - case WDSP_SSR_TYPE_CDC_DOWN: - return "CDC_DOWN"; - case WDSP_SSR_TYPE_CDC_UP: - return "CDC_UP"; - default: - pr_err("%s: Invalid ssr_type %d\n", - __func__, type); - return "Invalid"; - } -} - -static char *wdsp_get_cmpnt_type_string(enum wdsp_cmpnt_type type) -{ - switch (type) { - case WDSP_CMPNT_CONTROL: - return "control"; - case WDSP_CMPNT_IPC: - return "ipc"; - case WDSP_CMPNT_TRANSPORT: - return "transport"; - default: - pr_err("%s: Invalid component type %d\n", - __func__, type); - return "Invalid"; - } -} - -static void __wdsp_clr_ready_locked(struct wdsp_mgr_priv *wdsp, - u16 value) -{ - wdsp->ready_status &= ~(value); - WDSP_DBG(wdsp, "ready_status = 0x%x", wdsp->ready_status); -} - -static void __wdsp_set_ready_locked(struct wdsp_mgr_priv *wdsp, - u16 value, bool mark_complete) -{ - wdsp->ready_status |= value; - WDSP_DBG(wdsp, "ready_status = 0x%x", wdsp->ready_status); - - if (mark_complete && - wdsp->ready_status == WDSP_SSR_STATUS_READY) { - WDSP_DBG(wdsp, "marking ready completion"); - complete(&wdsp->ready_compl); - } -} - -static void wdsp_broadcast_event_upseq(struct wdsp_mgr_priv *wdsp, - enum wdsp_event_type event, - void *data) -{ - struct wdsp_cmpnt *cmpnt; - int i; - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if (cmpnt && cmpnt->ops && cmpnt->ops->event_handler) - cmpnt->ops->event_handler(cmpnt->cdev, cmpnt->priv_data, - event, data); - } -} - -static void wdsp_broadcast_event_downseq(struct wdsp_mgr_priv *wdsp, - enum wdsp_event_type event, - void *data) -{ - struct wdsp_cmpnt *cmpnt; - int i; - - for (i = WDSP_CMPNT_TYPE_MAX - 1; i >= 0; i--) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if (cmpnt && cmpnt->ops && cmpnt->ops->event_handler) - cmpnt->ops->event_handler(cmpnt->cdev, cmpnt->priv_data, - event, data); - } -} - -static int wdsp_unicast_event(struct wdsp_mgr_priv *wdsp, - enum wdsp_cmpnt_type type, - enum wdsp_event_type event, - void *data) -{ - struct wdsp_cmpnt *cmpnt; - int ret; - - cmpnt = WDSP_GET_COMPONENT(wdsp, type); - if (cmpnt && cmpnt->ops && cmpnt->ops->event_handler) { - ret = cmpnt->ops->event_handler(cmpnt->cdev, cmpnt->priv_data, - event, data); - } else { - WDSP_ERR(wdsp, "not valid event_handler for %s", - WDSP_GET_CMPNT_TYPE_STR(type)); - ret = -EINVAL; - } - - return ret; -} - -static void wdsp_deinit_components(struct wdsp_mgr_priv *wdsp) -{ - struct wdsp_cmpnt *cmpnt; - int i; - - for (i = WDSP_CMPNT_TYPE_MAX - 1; i >= 0; i--) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if (cmpnt && cmpnt->ops && cmpnt->ops->deinit) - cmpnt->ops->deinit(cmpnt->cdev, cmpnt->priv_data); - } -} - -static int wdsp_init_components(struct wdsp_mgr_priv *wdsp) -{ - struct wdsp_cmpnt *cmpnt; - int fail_idx = WDSP_CMPNT_TYPE_MAX; - int i, ret = 0; - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - - /* Init is allowed to be NULL */ - if (!cmpnt->ops || !cmpnt->ops->init) - continue; - ret = cmpnt->ops->init(cmpnt->cdev, cmpnt->priv_data); - if (ret) { - WDSP_ERR(wdsp, "Init failed (%d) for component %s", - ret, WDSP_GET_CMPNT_TYPE_STR(i)); - fail_idx = i; - break; - } - } - - if (fail_idx < WDSP_CMPNT_TYPE_MAX) { - /* Undo init for already initialized components */ - for (i = fail_idx - 1; i >= 0; i--) { - struct wdsp_cmpnt *cmpnt = WDSP_GET_COMPONENT(wdsp, i); - - if (cmpnt->ops && cmpnt->ops->deinit) - cmpnt->ops->deinit(cmpnt->cdev, - cmpnt->priv_data); - } - } else { - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_INIT, NULL); - } - - return ret; -} - -static int wdsp_load_each_segment(struct wdsp_mgr_priv *wdsp, - struct wdsp_img_segment *seg) -{ - struct wdsp_img_section img_section; - int ret; - - WDSP_DBG(wdsp, - "base_addr 0x%x, split_fname %s, load_addr 0x%x, size 0x%zx", - wdsp->base_addr, seg->split_fname, seg->load_addr, seg->size); - - if (seg->load_addr < wdsp->base_addr) { - WDSP_ERR(wdsp, "Invalid addr 0x%x, base_addr = 0x%x", - seg->load_addr, wdsp->base_addr); - return -EINVAL; - } - - img_section.addr = seg->load_addr - wdsp->base_addr; - img_section.size = seg->size; - img_section.data = seg->data; - - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_TRANSPORT, - WDSP_EVENT_DLOAD_SECTION, - &img_section); - if (ret < 0) - WDSP_ERR(wdsp, - "Failed, err = %d for base_addr = 0x%x split_fname = %s, load_addr = 0x%x, size = 0x%zx", - ret, wdsp->base_addr, seg->split_fname, - seg->load_addr, seg->size); - return ret; -} - -static int wdsp_download_segments(struct wdsp_mgr_priv *wdsp, - unsigned int type) -{ - struct wdsp_cmpnt *ctl; - struct wdsp_img_segment *seg = NULL; - enum wdsp_event_type pre, post; - long status; - int ret, retry_cnt = 0; - - ctl = WDSP_GET_COMPONENT(wdsp, WDSP_CMPNT_CONTROL); - - if (type == WDSP_ELF_FLAG_RE) { - pre = WDSP_EVENT_PRE_DLOAD_CODE; - post = WDSP_EVENT_POST_DLOAD_CODE; - status = WDSP_STATUS_CODE_DLOADED; - } else if (type == WDSP_ELF_FLAG_WRITE) { - pre = WDSP_EVENT_PRE_DLOAD_DATA; - post = WDSP_EVENT_POST_DLOAD_DATA; - status = WDSP_STATUS_DATA_DLOADED; - } else { - WDSP_ERR(wdsp, "Invalid type %u", type); - return -EINVAL; - } - - ret = wdsp_get_segment_list(ctl->cdev, wdsp->img_fname, - type, wdsp->seg_list, &wdsp->base_addr); - pr_info("%s: downloading wdsp firmware: %s.\n", __func__, wdsp->img_fname); - if (ret < 0 || - list_empty(wdsp->seg_list)) { - WDSP_ERR(wdsp, "Error %d to get image segments for type %d", - ret, type); - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_DLOAD_FAILED, - NULL); - goto done; - } - - /* Notify all components that image is about to be downloaded */ - wdsp_broadcast_event_upseq(wdsp, pre, NULL); - - /* - * Go through the list of segments and download one by one. - * For each segment that fails to dlownload retry for - * WDSP_FW_LOAD_RETRY_COUNT times - */ - list_for_each_entry(seg, wdsp->seg_list, list) { - retry_cnt = WDSP_FW_LOAD_RETRY_COUNT; - do { - ret = wdsp_load_each_segment(wdsp, seg); - } while (ret < 0 && --retry_cnt > 0); - - if (ret < 0) { - WDSP_ERR(wdsp, - "Failed to download, error %d\n", - ret); - goto dload_error; - } - } - - /* Flush the list before setting status and notifying components */ - wdsp_flush_segment_list(wdsp->seg_list); - - WDSP_SET_STATUS(wdsp, status); - - /* Notify all components that image is downloaded */ - wdsp_broadcast_event_downseq(wdsp, post, NULL); -done: - return ret; - -dload_error: - wdsp_flush_segment_list(wdsp->seg_list); - - /* - * code sections are downloaded at driver load and during SSR. - * Even if code section download fails, do not treat this - * as error to allow retry of code section download upon - * enable_dsp request. Since status flag is not set upon - * code section download failure, enable_dsp can check this - * and retry. - */ - if (type == WDSP_ELF_FLAG_RE) { - /* Notify all components that image is downloaded */ - wdsp_broadcast_event_downseq(wdsp, post, NULL); - ret = 0; - } else { - wdsp_broadcast_event_downseq(wdsp, - WDSP_EVENT_DLOAD_FAILED, NULL); - } - - return ret; -} - -static int wdsp_init_and_dload_code_sections(struct wdsp_mgr_priv *wdsp) -{ - int ret; - bool is_initialized; - - is_initialized = WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_INITIALIZED); - - if (!is_initialized) { - /* Components are not initialized yet, initialize them */ - ret = wdsp_init_components(wdsp); - if (ret < 0) { - WDSP_ERR(wdsp, "INIT failed, err = %d", ret); - goto done; - } - WDSP_SET_STATUS(wdsp, WDSP_STATUS_INITIALIZED); - } - - /* Download the read-execute sections of image */ - ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_RE); - if (ret < 0) { - WDSP_ERR(wdsp, "Error %d to download code sections", ret); - goto done; - } -done: - return ret; -} - -static void wdsp_load_fw_image(struct work_struct *work) -{ - struct wdsp_mgr_priv *wdsp; - int ret; - - wdsp = container_of(work, struct wdsp_mgr_priv, load_fw_work); - if (!wdsp) { - pr_err("%s: Invalid private_data\n", __func__); - return; - } - - ret = wdsp_init_and_dload_code_sections(wdsp); - if (ret < 0) - WDSP_ERR(wdsp, "dload code sections failed, err = %d", ret); -} - -static int wdsp_enable_dsp(struct wdsp_mgr_priv *wdsp) -{ - int ret, retry_cnt = WDSP_FW_LOAD_RETRY_COUNT; - - /* - * Acquire SSR mutex lock to make sure enablement of DSP - * does not race with SSR handling. - */ - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - - /* Make sure wdsp is in good state */ - if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_CODE_DLOADED)) { - WDSP_ERR(wdsp, "WDSP in invalid state 0x%x", wdsp->status); - /* - * Since DSP state indicates that code sections are - * not downloaded. Try to download them again now. - */ - ret = wdsp_init_and_dload_code_sections(wdsp); - if (ret < 0) { - WDSP_ERR(wdsp, "Retry code dload failed %d", - ret); - goto done; - } - } -retry: - /* Download the read-write sections of image */ - ret = wdsp_download_segments(wdsp, WDSP_ELF_FLAG_WRITE); - if (ret < 0) { - WDSP_ERR(wdsp, "Data section download failed, err = %d", ret); - goto done; - } - - wdsp_broadcast_event_upseq(wdsp, WDSP_EVENT_PRE_BOOTUP, NULL); - - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_CONTROL, - WDSP_EVENT_DO_BOOT, NULL); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to boot dsp, err = %d", ret); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_DATA_DLOADED); - if (retry_cnt-- >= 0) { - ret = wdsp_init_and_dload_code_sections(wdsp); - if (ret < 0) { - WDSP_ERR(wdsp, "Retry code dload failed %d", - ret); - goto done; - } - goto retry; - } - goto done; - } - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_BOOTUP, NULL); - WDSP_SET_STATUS(wdsp, WDSP_STATUS_BOOTED); -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - return ret; -} - -static int wdsp_disable_dsp(struct wdsp_mgr_priv *wdsp) -{ - int ret; - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - - /* - * If Disable happened while SSR is in progress, then set the SSR - * ready status indicating WDSP is now ready. Ignore the disable - * event here and let the SSR handler go through shutdown. - */ - if (wdsp->ssr_type != WDSP_SSR_TYPE_NO_SSR) { - __wdsp_set_ready_locked(wdsp, WDSP_SSR_STATUS_WDSP_READY, true); - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - return 0; - } - - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - - /* Make sure wdsp is in good state */ - if (!WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_BOOTED)) { - WDSP_ERR(wdsp, "wdsp in invalid state 0x%x", wdsp->status); - ret = -EINVAL; - goto done; - } - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_PRE_SHUTDOWN, NULL); - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_CONTROL, - WDSP_EVENT_DO_SHUTDOWN, NULL); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to shutdown dsp, err = %d", ret); - goto done; - } - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_SHUTDOWN, NULL); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_BOOTED); - - /* Data sections are to be downloaded per boot */ - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_DATA_DLOADED); -done: - return ret; -} - -static int wdsp_register_cmpnt_ops(struct device *wdsp_dev, - struct device *cdev, - void *priv_data, - struct wdsp_cmpnt_ops *ops) -{ - struct wdsp_mgr_priv *wdsp; - struct wdsp_cmpnt *cmpnt; - int i, ret; - - if (!wdsp_dev || !cdev || !ops) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, i); - if ((cdev->of_node && cdev->of_node == cmpnt->np) || - (cmpnt->cdev_name && - !strcmp(dev_name(cdev), cmpnt->cdev_name))) { - break; - } - } - - if (i == WDSP_CMPNT_TYPE_MAX) { - WDSP_ERR(wdsp, "Failed to register component dev %s", - dev_name(cdev)); - ret = -EINVAL; - goto done; - } - - cmpnt->cdev = cdev; - cmpnt->ops = ops; - cmpnt->priv_data = priv_data; -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); - return 0; -} - -static struct device *wdsp_get_dev_for_cmpnt(struct device *wdsp_dev, - enum wdsp_cmpnt_type type) -{ - struct wdsp_mgr_priv *wdsp; - struct wdsp_cmpnt *cmpnt; - - if (!wdsp_dev || type >= WDSP_CMPNT_TYPE_MAX) - return NULL; - - wdsp = dev_get_drvdata(wdsp_dev); - cmpnt = WDSP_GET_COMPONENT(wdsp, type); - - return cmpnt->cdev; -} - -static int wdsp_get_devops_for_cmpnt(struct device *wdsp_dev, - enum wdsp_cmpnt_type type, - void *data) -{ - struct wdsp_mgr_priv *wdsp; - int ret = 0; - - if (!wdsp_dev || type >= WDSP_CMPNT_TYPE_MAX) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - ret = wdsp_unicast_event(wdsp, type, - WDSP_EVENT_GET_DEVOPS, data); - if (ret) - WDSP_ERR(wdsp, "get_dev_ops failed for cmpnt type %d", - type); - return ret; -} - -static void wdsp_collect_ramdumps(struct wdsp_mgr_priv *wdsp) -{ - struct wdsp_img_section img_section; - struct wdsp_err_signal_arg *data = &wdsp->dump_data.err_data; - struct ramdump_segment rd_seg; - int ret = 0; - - if (wdsp->ssr_type != WDSP_SSR_TYPE_WDSP_DOWN || - !data->mem_dumps_enabled) { - WDSP_DBG(wdsp, "cannot dump memory, ssr_type %s, dumps %s", - wdsp_get_ssr_type_string(wdsp->ssr_type), - !(data->mem_dumps_enabled) ? "disabled" : "enabled"); - goto done; - } - - if (data->dump_size == 0 || - data->remote_start_addr < wdsp->base_addr) { - WDSP_ERR(wdsp, "Invalid start addr 0x%x or dump_size 0x%zx", - data->remote_start_addr, data->dump_size); - goto done; - } - - if (!wdsp->dump_data.rd_dev) { - WDSP_ERR(wdsp, "Ramdump device is not setup"); - goto done; - } - - WDSP_DBG(wdsp, "base_addr 0x%x, dump_start_addr 0x%x, dump_size 0x%zx", - wdsp->base_addr, data->remote_start_addr, data->dump_size); - - /* Allocate memory for dumps */ - wdsp->dump_data.rd_v_addr = dma_alloc_coherent(wdsp->mdev, - data->dump_size, - &wdsp->dump_data.rd_addr, - GFP_KERNEL); - if (!wdsp->dump_data.rd_v_addr) - goto done; - - img_section.addr = data->remote_start_addr - wdsp->base_addr; - img_section.size = data->dump_size; - img_section.data = wdsp->dump_data.rd_v_addr; - - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_TRANSPORT, - WDSP_EVENT_READ_SECTION, - &img_section); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to read dumps, size 0x%zx at addr 0x%x", - img_section.size, img_section.addr); - goto err_read_dumps; - } - - /* - * If panic_on_error flag is explicitly set through the debugfs, - * then cause a BUG here to aid debugging. - */ - BUG_ON(wdsp->panic_on_error); - - rd_seg.address = (unsigned long) wdsp->dump_data.rd_v_addr; - rd_seg.size = img_section.size; - rd_seg.v_address = wdsp->dump_data.rd_v_addr; - - ret = do_ramdump(wdsp->dump_data.rd_dev, &rd_seg, 1); - if (ret < 0) - WDSP_ERR(wdsp, "do_ramdump failed with error %d", ret); - -err_read_dumps: - dma_free_coherent(wdsp->mdev, data->dump_size, - wdsp->dump_data.rd_v_addr, wdsp->dump_data.rd_addr); -done: - return; -} - -static void wdsp_ssr_work_fn(struct work_struct *work) -{ - struct wdsp_mgr_priv *wdsp; - int ret; - - wdsp = container_of(work, struct wdsp_mgr_priv, ssr_work); - if (!wdsp) { - pr_err("%s: Invalid private_data\n", __func__); - return; - } - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - - /* Issue ramdumps and shutdown only if DSP is currently booted */ - if (WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_BOOTED)) { - wdsp_collect_ramdumps(wdsp); - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_CONTROL, - WDSP_EVENT_DO_SHUTDOWN, NULL); - if (ret < 0) - WDSP_ERR(wdsp, "Failed WDSP shutdown, err = %d", ret); - - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_POST_SHUTDOWN, - NULL); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_BOOTED); - } - - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - ret = wait_for_completion_timeout(&wdsp->ready_compl, - WDSP_SSR_READY_WAIT_TIMEOUT); - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - if (ret == 0) { - WDSP_ERR(wdsp, "wait_for_ready timed out, status = 0x%x", - wdsp->ready_status); - goto done; - } - - /* Data sections are to downloaded per WDSP boot */ - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_DATA_DLOADED); - - /* - * Even though code section could possible be retained on DSP - * crash, go ahead and still re-download just to avoid any - * memory corruption from previous crash. - */ - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_CODE_DLOADED); - - /* If codec restarted, then all components must be re-initialized */ - if (wdsp->ssr_type == WDSP_SSR_TYPE_CDC_UP) { - wdsp_deinit_components(wdsp); - WDSP_CLEAR_STATUS(wdsp, WDSP_STATUS_INITIALIZED); - } - - ret = wdsp_init_and_dload_code_sections(wdsp); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to dload code sections err = %d", - ret); - goto done; - } - - /* SSR handling is finished, mark SSR type as NO_SSR */ - wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR; -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); -} - -static int wdsp_ssr_handler(struct wdsp_mgr_priv *wdsp, void *arg, - enum wdsp_ssr_type ssr_type) -{ - enum wdsp_ssr_type current_ssr_type; - struct wdsp_err_signal_arg *err_data; - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - - current_ssr_type = wdsp->ssr_type; - WDSP_DBG(wdsp, "Current ssr_type %s, handling ssr_type %s", - wdsp_get_ssr_type_string(current_ssr_type), - wdsp_get_ssr_type_string(ssr_type)); - wdsp->ssr_type = ssr_type; - - if (arg) { - err_data = (struct wdsp_err_signal_arg *) arg; - memcpy(&wdsp->dump_data.err_data, err_data, - sizeof(*err_data)); - } else { - memset(&wdsp->dump_data.err_data, 0, - sizeof(wdsp->dump_data.err_data)); - } - - switch (ssr_type) { - - case WDSP_SSR_TYPE_WDSP_DOWN: - __wdsp_clr_ready_locked(wdsp, WDSP_SSR_STATUS_WDSP_READY); - wdsp_broadcast_event_downseq(wdsp, WDSP_EVENT_PRE_SHUTDOWN, - NULL); - reinit_completion(&wdsp->ready_compl); - schedule_work(&wdsp->ssr_work); - break; - - case WDSP_SSR_TYPE_CDC_DOWN: - __wdsp_clr_ready_locked(wdsp, WDSP_SSR_STATUS_CDC_READY); - /* - * If DSP is booted when CDC_DOWN is received, it needs - * to be shutdown. - */ - if (WDSP_STATUS_IS_SET(wdsp, WDSP_STATUS_BOOTED)) { - __wdsp_clr_ready_locked(wdsp, - WDSP_SSR_STATUS_WDSP_READY); - wdsp_broadcast_event_downseq(wdsp, - WDSP_EVENT_PRE_SHUTDOWN, - NULL); - } - reinit_completion(&wdsp->ready_compl); - schedule_work(&wdsp->ssr_work); - break; - - case WDSP_SSR_TYPE_CDC_UP: - __wdsp_set_ready_locked(wdsp, WDSP_SSR_STATUS_CDC_READY, true); - break; - - default: - WDSP_ERR(wdsp, "undefined ssr_type %d\n", ssr_type); - /* Revert back the ssr_type for undefined events */ - wdsp->ssr_type = current_ssr_type; - break; - } - - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - - return 0; -} - -#ifdef CONFIG_DEBUG_FS -static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg) -{ - struct wdsp_err_signal_arg *err_data; - int ret = 0; - - /* If there is no SSR, set the SSR type to collect ramdumps */ - if (wdsp->ssr_type == WDSP_SSR_TYPE_NO_SSR) { - wdsp->ssr_type = WDSP_SSR_TYPE_WDSP_DOWN; - } else { - WDSP_DBG(wdsp, "SSR handling is running, skip debug ramdump"); - ret = 0; - goto done; - } - - if (arg) { - err_data = (struct wdsp_err_signal_arg *) arg; - memcpy(&wdsp->dump_data.err_data, err_data, - sizeof(*err_data)); - } else { - WDSP_DBG(wdsp, "Invalid input, arg is NULL"); - ret = -EINVAL; - goto done; - } - wdsp_collect_ramdumps(wdsp); - wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR; -done: - return ret; -} -static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg) -{ - int ret = 0; - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex); - ret = __wdsp_dbg_dump_locked(wdsp, arg); - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex); - - return ret; -} -#else -static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg) -{ - return 0; -} - -static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg) -{ - return 0; -} -#endif - -static int wdsp_signal_handler(struct device *wdsp_dev, - enum wdsp_signal signal, void *arg) -{ - struct wdsp_mgr_priv *wdsp; - int ret; - - if (!wdsp_dev) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - -#ifdef CONFIG_DEBUG_FS - if (signal != WDSP_DEBUG_DUMP_INTERNAL) - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); -#else - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); -#endif - - WDSP_DBG(wdsp, "Raised signal %d", signal); - - switch (signal) { - case WDSP_IPC1_INTR: - ret = wdsp_unicast_event(wdsp, WDSP_CMPNT_IPC, - WDSP_EVENT_IPC1_INTR, NULL); - break; - case WDSP_ERR_INTR: - ret = wdsp_ssr_handler(wdsp, arg, WDSP_SSR_TYPE_WDSP_DOWN); - break; - case WDSP_CDC_DOWN_SIGNAL: - ret = wdsp_ssr_handler(wdsp, arg, WDSP_SSR_TYPE_CDC_DOWN); - break; - case WDSP_CDC_UP_SIGNAL: - ret = wdsp_ssr_handler(wdsp, arg, WDSP_SSR_TYPE_CDC_UP); - break; - case WDSP_DEBUG_DUMP: - ret = wdsp_debug_dump_handler(wdsp, arg); - break; - case WDSP_DEBUG_DUMP_INTERNAL: - ret = __wdsp_dbg_dump_locked(wdsp, arg); - break; - default: - ret = -EINVAL; - break; - } - - if (ret < 0) - WDSP_ERR(wdsp, "handling signal %d failed with error %d", - signal, ret); - -#ifdef CONFIG_DEBUG_FS - if (signal != WDSP_DEBUG_DUMP_INTERNAL) - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); -#else - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); -#endif - - return ret; -} - -static int wdsp_vote_for_dsp(struct device *wdsp_dev, - bool vote) -{ - struct wdsp_mgr_priv *wdsp; - int ret = 0; - - if (!wdsp_dev) - return -EINVAL; - - wdsp = dev_get_drvdata(wdsp_dev); - - WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex); - WDSP_DBG(wdsp, "request %s, current users = %d", - vote ? "enable" : "disable", wdsp->dsp_users); - - if (vote) { - wdsp->dsp_users++; - if (wdsp->dsp_users == 1) - ret = wdsp_enable_dsp(wdsp); - } else { - if (wdsp->dsp_users == 0) - goto done; - - wdsp->dsp_users--; - if (wdsp->dsp_users == 0) - ret = wdsp_disable_dsp(wdsp); - } - - if (ret < 0) - WDSP_DBG(wdsp, "wdsp %s failed, err = %d", - vote ? "enable" : "disable", ret); - -done: - WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex); - return ret; -} - -static int wdsp_suspend(struct device *wdsp_dev) -{ - struct wdsp_mgr_priv *wdsp; - int rc = 0, i; - - if (!wdsp_dev) { - pr_err("%s: Invalid handle to device\n", __func__); - return -EINVAL; - } - - wdsp = dev_get_drvdata(wdsp_dev); - - for (i = WDSP_CMPNT_TYPE_MAX - 1; i >= 0; i--) { - rc = wdsp_unicast_event(wdsp, i, WDSP_EVENT_SUSPEND, NULL); - if (rc < 0) { - WDSP_ERR(wdsp, "component %s failed to suspend\n", - WDSP_GET_CMPNT_TYPE_STR(i)); - break; - } - } - - return rc; -} - -static int wdsp_resume(struct device *wdsp_dev) -{ - struct wdsp_mgr_priv *wdsp; - int rc = 0, i; - - if (!wdsp_dev) { - pr_err("%s: Invalid handle to device\n", __func__); - return -EINVAL; - } - - wdsp = dev_get_drvdata(wdsp_dev); - - for (i = 0; i < WDSP_CMPNT_TYPE_MAX; i++) { - rc = wdsp_unicast_event(wdsp, i, WDSP_EVENT_RESUME, NULL); - if (rc < 0) { - WDSP_ERR(wdsp, "component %s failed to resume\n", - WDSP_GET_CMPNT_TYPE_STR(i)); - break; - } - } - - return rc; -} - -static struct wdsp_mgr_ops wdsp_ops = { - .register_cmpnt_ops = wdsp_register_cmpnt_ops, - .get_dev_for_cmpnt = wdsp_get_dev_for_cmpnt, - .get_devops_for_cmpnt = wdsp_get_devops_for_cmpnt, - .signal_handler = wdsp_signal_handler, - .vote_for_dsp = wdsp_vote_for_dsp, - .suspend = wdsp_suspend, - .resume = wdsp_resume, -}; - -static int wdsp_mgr_compare_of(struct device *dev, void *data) -{ - struct wdsp_cmpnt *cmpnt = data; - - /* - * First try to match based on of_node, if of_node is not - * present, try to match on the dev_name - */ - return ((dev->of_node && dev->of_node == cmpnt->np) || - (cmpnt->cdev_name && - !strcmp(dev_name(dev), cmpnt->cdev_name))); -} - -static void wdsp_mgr_debugfs_init(struct wdsp_mgr_priv *wdsp) -{ - wdsp->entry = debugfs_create_dir("wdsp_mgr", NULL); - if (IS_ERR_OR_NULL(wdsp->entry)) - return; - - debugfs_create_bool("panic_on_error", 0644, - wdsp->entry, &wdsp->panic_on_error); - - debugfs_create_u32("wdsp_status", S_IRUGO, - wdsp->entry, &wdsp->status); -} - -static void wdsp_mgr_debugfs_remove(struct wdsp_mgr_priv *wdsp) -{ - debugfs_remove_recursive(wdsp->entry); - wdsp->entry = NULL; -} - -static int wdsp_mgr_bind(struct device *dev) -{ - struct wdsp_mgr_priv *wdsp = dev_get_drvdata(dev); - struct wdsp_cmpnt *cmpnt; - int ret, idx; - - wdsp->ops = &wdsp_ops; - - /* Setup ramdump device */ - wdsp->dump_data.rd_dev = create_ramdump_device("wdsp", dev); - if (!wdsp->dump_data.rd_dev) - dev_info(dev, "%s: create_ramdump_device failed\n", __func__); - - ret = component_bind_all(dev, wdsp->ops); - if (ret < 0) { - WDSP_ERR(wdsp, "component_bind_all failed %d\n", ret); - return ret; - } - - /* Make sure all components registered ops */ - for (idx = 0; idx < WDSP_CMPNT_TYPE_MAX; idx++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, idx); - if (!cmpnt->cdev || !cmpnt->ops) { - WDSP_ERR(wdsp, "%s did not register ops\n", - WDSP_GET_CMPNT_TYPE_STR(idx)); - ret = -EINVAL; - component_unbind_all(dev, wdsp->ops); - break; - } - } - - wdsp_mgr_debugfs_init(wdsp); - - /* Schedule the work to download image if binding was successful. */ - if (!ret) - schedule_work(&wdsp->load_fw_work); - - return ret; -} - -static void wdsp_mgr_unbind(struct device *dev) -{ - struct wdsp_mgr_priv *wdsp = dev_get_drvdata(dev); - struct wdsp_cmpnt *cmpnt; - int idx; - - cancel_work_sync(&wdsp->load_fw_work); - - component_unbind_all(dev, wdsp->ops); - - wdsp_mgr_debugfs_remove(wdsp); - - if (wdsp->dump_data.rd_dev) { - destroy_ramdump_device(wdsp->dump_data.rd_dev); - wdsp->dump_data.rd_dev = NULL; - } - - /* Clear all status bits */ - wdsp->status = 0x00; - - /* clean up the components */ - for (idx = 0; idx < WDSP_CMPNT_TYPE_MAX; idx++) { - cmpnt = WDSP_GET_COMPONENT(wdsp, idx); - cmpnt->cdev = NULL; - cmpnt->ops = NULL; - cmpnt->priv_data = NULL; - } -} - -static const struct component_master_ops wdsp_master_ops = { - .bind = wdsp_mgr_bind, - .unbind = wdsp_mgr_unbind, -}; - -static void *wdsp_mgr_parse_phandle(struct wdsp_mgr_priv *wdsp, - int index) -{ - struct device *mdev = wdsp->mdev; - struct device_node *np; - struct wdsp_cmpnt *cmpnt = NULL; - struct of_phandle_args pargs; - u32 value; - int ret; - - ret = of_parse_phandle_with_fixed_args(mdev->of_node, - "qcom,wdsp-components", 1, - index, &pargs); - if (ret) { - WDSP_ERR(wdsp, "parse_phandle at index %d failed %d", - index, ret); - return NULL; - } - - np = pargs.np; - value = pargs.args[0]; - - if (value >= WDSP_CMPNT_TYPE_MAX) { - WDSP_ERR(wdsp, "invalid phandle_arg to of_node %s", np->name); - goto done; - } - - cmpnt = WDSP_GET_COMPONENT(wdsp, value); - if (cmpnt->np || cmpnt->cdev_name) { - WDSP_ERR(wdsp, "cmpnt %d already added", value); - cmpnt = NULL; - goto done; - } - - cmpnt->np = np; - of_property_read_string(np, "qcom,wdsp-cmpnt-dev-name", - &cmpnt->cdev_name); -done: - of_node_put(np); - return cmpnt; -} - -static int wdsp_mgr_parse_dt_entries(struct wdsp_mgr_priv *wdsp) -{ - struct device *dev = wdsp->mdev; - void *match_data; - int ph_idx, ret; - - ret = of_property_read_string(dev->of_node, "qcom,img-filename", - &wdsp->img_fname); - if (ret < 0) { - WDSP_ERR(wdsp, "Reading property %s failed, error = %d", - "qcom,img-filename", ret); - return ret; - } - -#ifdef GOOGLE_HOTWORD - wdsp->img_fname = "cpe_intl"; - pr_info("%s: using global wdsp fw: %s.\n", __func__, wdsp->img_fname); -#else - pr_info("%s: using non-global wdsp fw: %s.\n", __func__, wdsp->img_fname); -#endif - - ret = of_count_phandle_with_args(dev->of_node, - "qcom,wdsp-components", - NULL); - if (ret == -ENOENT) { - WDSP_ERR(wdsp, "Property %s not defined in DT", - "qcom,wdsp-components"); - goto done; - } else if (ret != WDSP_CMPNT_TYPE_MAX * 2) { - WDSP_ERR(wdsp, "Invalid phandle + arg count %d, expected %d", - ret, WDSP_CMPNT_TYPE_MAX * 2); - ret = -EINVAL; - goto done; - } - - ret = 0; - - for (ph_idx = 0; ph_idx < WDSP_CMPNT_TYPE_MAX; ph_idx++) { - - match_data = wdsp_mgr_parse_phandle(wdsp, ph_idx); - if (!match_data) { - WDSP_ERR(wdsp, "component not found at idx %d", ph_idx); - ret = -EINVAL; - goto done; - } - - component_match_add(dev, &wdsp->match, - wdsp_mgr_compare_of, match_data); - } - -done: - return ret; -} - -static int wdsp_mgr_probe(struct platform_device *pdev) -{ - struct wdsp_mgr_priv *wdsp; - struct device *mdev = &pdev->dev; - int ret; - - wdsp = devm_kzalloc(mdev, sizeof(*wdsp), GFP_KERNEL); - if (!wdsp) - return -ENOMEM; - wdsp->mdev = mdev; - wdsp->seg_list = devm_kzalloc(mdev, sizeof(struct list_head), - GFP_KERNEL); - if (!wdsp->seg_list) { - devm_kfree(mdev, wdsp); - return -ENOMEM; - } - - ret = wdsp_mgr_parse_dt_entries(wdsp); - if (ret) - goto err_dt_parse; - - INIT_WORK(&wdsp->load_fw_work, wdsp_load_fw_image); - INIT_LIST_HEAD(wdsp->seg_list); - mutex_init(&wdsp->api_mutex); - mutex_init(&wdsp->ssr_mutex); - wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR; - wdsp->ready_status = WDSP_SSR_STATUS_READY; - INIT_WORK(&wdsp->ssr_work, wdsp_ssr_work_fn); - init_completion(&wdsp->ready_compl); - arch_setup_dma_ops(wdsp->mdev, 0, 0, NULL, 0); - dev_set_drvdata(mdev, wdsp); - - ret = component_master_add_with_match(mdev, &wdsp_master_ops, - wdsp->match); - if (ret < 0) { - WDSP_ERR(wdsp, "Failed to add master, err = %d", ret); - goto err_master_add; - } - - return 0; - -err_master_add: - mutex_destroy(&wdsp->api_mutex); - mutex_destroy(&wdsp->ssr_mutex); -err_dt_parse: - devm_kfree(mdev, wdsp->seg_list); - devm_kfree(mdev, wdsp); - dev_set_drvdata(mdev, NULL); - - return ret; -} - -static int wdsp_mgr_remove(struct platform_device *pdev) -{ - struct device *mdev = &pdev->dev; - struct wdsp_mgr_priv *wdsp = dev_get_drvdata(mdev); - - component_master_del(mdev, &wdsp_master_ops); - - mutex_destroy(&wdsp->api_mutex); - mutex_destroy(&wdsp->ssr_mutex); - devm_kfree(mdev, wdsp->seg_list); - devm_kfree(mdev, wdsp); - dev_set_drvdata(mdev, NULL); - - return 0; -}; - -static const struct of_device_id wdsp_mgr_dt_match[] = { - {.compatible = "qcom,wcd-dsp-mgr" }, - { } -}; - -static struct platform_driver wdsp_mgr_driver = { - .driver = { - .name = "wcd-dsp-mgr", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(wdsp_mgr_dt_match), - }, - .probe = wdsp_mgr_probe, - .remove = wdsp_mgr_remove, -}; - -int wcd_dsp_mgr_init(void) -{ - return platform_driver_register(&wdsp_mgr_driver); -} - -void wcd_dsp_mgr_exit(void) -{ - platform_driver_unregister(&wdsp_mgr_driver); -} - -MODULE_DESCRIPTION("WCD DSP manager driver"); -MODULE_DEVICE_TABLE(of, wdsp_mgr_dt_match); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd-dsp-utils.c b/techpack/audio/asoc/codecs/wcd-dsp-utils.c deleted file mode 100644 index 1c95d48a1a81..000000000000 --- a/techpack/audio/asoc/codecs/wcd-dsp-utils.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include "wcd-dsp-utils.h" - -static bool wdsp_is_valid_elf_hdr(const struct elf32_hdr *ehdr, - size_t fw_size) -{ - if (fw_size < sizeof(*ehdr)) { - pr_err("%s: Firmware too small\n", __func__); - goto elf_check_fail; - } - - if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) { - pr_err("%s: Not an ELF file\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) { - pr_err("%s: Not an executable image\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_phnum == 0) { - pr_err("%s: no segments to load\n", __func__); - goto elf_check_fail; - } - - if (sizeof(struct elf32_phdr) * ehdr->e_phnum + - sizeof(struct elf32_hdr) > fw_size) { - pr_err("%s: Too small MDT file\n", __func__); - goto elf_check_fail; - } - - return true; - -elf_check_fail: - return false; -} - -static int wdsp_add_segment_to_list(struct device *dev, - const char *img_fname, - const struct elf32_phdr *phdr, - int phdr_idx, - struct list_head *seg_list) -{ - struct wdsp_img_segment *seg; - int ret = 0; - - /* Do not load segments with zero size */ - if (phdr->p_filesz == 0 || phdr->p_memsz == 0) - goto done; - - seg = kzalloc(sizeof(*seg), GFP_KERNEL); - if (!seg) { - ret = -ENOMEM; - goto done; - } - - snprintf(seg->split_fname, sizeof(seg->split_fname), - "%s.b%02d", img_fname, phdr_idx); - ret = request_firmware(&seg->split_fw, seg->split_fname, dev); - if (ret < 0) { - dev_err(dev, "%s: firmware %s not found\n", - __func__, seg->split_fname); - goto bad_seg; - } - - if (phdr->p_filesz != seg->split_fw->size) { - dev_err(dev, - "%s: %s size mismatch, phdr_size: 0x%x fw_size: 0x%zx", - __func__, seg->split_fname, phdr->p_filesz, - seg->split_fw->size); - ret = -EINVAL; - goto bad_elf; - } - - seg->load_addr = phdr->p_paddr; - seg->size = phdr->p_filesz; - seg->data = (u8 *) seg->split_fw->data; - - list_add_tail(&seg->list, seg_list); -done: - return ret; -bad_elf: - release_firmware(seg->split_fw); -bad_seg: - kfree(seg); - return ret; -} - -/* - * wdsp_flush_segment_list: Flush the list of segments - * @seg_list: List of segments to be flushed - * This API will traverse through the list of segments provided in - * seg_list, release the firmware for each segment and delete the - * segment from the list. - */ -void wdsp_flush_segment_list(struct list_head *seg_list) -{ - struct wdsp_img_segment *seg, *next; - - list_for_each_entry_safe(seg, next, seg_list, list) { - release_firmware(seg->split_fw); - list_del(&seg->list); - kfree(seg); - } -} -EXPORT_SYMBOL(wdsp_flush_segment_list); - -/* - * wdsp_get_segment_list: Get the list of requested segments - * @dev: struct device pointer of caller - * @img_fname: Image name for the mdt and split firmware files - * @segment_type: Requested segment type, should be either - * WDSP_ELF_FLAG_RE or WDSP_ELF_FLAG_WRITE - * @seg_list: An initialized head for list of segmented to be returned - * @entry_point: Pointer to return the entry point of the image - * This API will parse the mdt file for img_fname and create - * an struct wdsp_img_segment for each segment that matches segment_type - * and add this structure to list pointed by seg_list - */ -int wdsp_get_segment_list(struct device *dev, - const char *img_fname, - unsigned int segment_type, - struct list_head *seg_list, - u32 *entry_point) -{ - const struct firmware *fw; - const struct elf32_hdr *ehdr; - const struct elf32_phdr *phdr; - const u8 *elf_ptr; - char mdt_name[WDSP_IMG_NAME_LEN_MAX]; - int ret, phdr_idx; - bool segment_match; - - if (!dev) { - ret = -EINVAL; - pr_err("%s: Invalid device handle\n", __func__); - goto done; - } - - if (!img_fname || !seg_list || !entry_point) { - ret = -EINVAL; - dev_err(dev, "%s: Invalid input params\n", - __func__); - goto done; - } - - if (segment_type != WDSP_ELF_FLAG_RE && - segment_type != WDSP_ELF_FLAG_WRITE) { - dev_err(dev, "%s: Invalid request for segment_type %d\n", - __func__, segment_type); - ret = -EINVAL; - goto done; - } - - snprintf(mdt_name, sizeof(mdt_name), "%s.mdt", img_fname); - ret = request_firmware(&fw, mdt_name, dev); - if (ret < 0) { - dev_err(dev, "%s: firmware %s not found\n", - __func__, mdt_name); - goto done; - } - - ehdr = (struct elf32_hdr *) fw->data; - *entry_point = ehdr->e_entry; - if (!wdsp_is_valid_elf_hdr(ehdr, fw->size)) { - dev_err(dev, "%s: fw mdt %s is invalid\n", - __func__, mdt_name); - ret = -EINVAL; - goto bad_elf; - } - - elf_ptr = fw->data + sizeof(*ehdr); - for (phdr_idx = 0; phdr_idx < ehdr->e_phnum; phdr_idx++) { - phdr = (struct elf32_phdr *) elf_ptr; - segment_match = false; - - switch (segment_type) { - case WDSP_ELF_FLAG_RE: - /* - * Flag can be READ or EXECUTE or both but - * WRITE flag should not be set. - */ - if ((phdr->p_flags & segment_type) && - !(phdr->p_flags & WDSP_ELF_FLAG_WRITE)) - segment_match = true; - break; - case WDSP_ELF_FLAG_WRITE: - /* - * If WRITE flag is set, other flags do not - * matter. - */ - if (phdr->p_flags & segment_type) - segment_match = true; - break; - } - - if (segment_match) { - ret = wdsp_add_segment_to_list(dev, img_fname, phdr, - phdr_idx, seg_list); - if (ret < 0) { - wdsp_flush_segment_list(seg_list); - goto bad_elf; - } - } - elf_ptr = elf_ptr + sizeof(*phdr); - } - -bad_elf: - release_firmware(fw); -done: - return ret; -} -EXPORT_SYMBOL(wdsp_get_segment_list); diff --git a/techpack/audio/asoc/codecs/wcd-dsp-utils.h b/techpack/audio/asoc/codecs/wcd-dsp-utils.h deleted file mode 100644 index a530a1c3b67d..000000000000 --- a/techpack/audio/asoc/codecs/wcd-dsp-utils.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD_DSP_UTILS_H__ -#define __WCD_DSP_UTILS_H__ - -#define WDSP_IMG_NAME_LEN_MAX 64 - -#define WDSP_ELF_FLAG_EXECUTE (1 << 0) -#define WDSP_ELF_FLAG_WRITE (1 << 1) -#define WDSP_ELF_FLAG_READ (1 << 2) - -#define WDSP_ELF_FLAG_RE (WDSP_ELF_FLAG_READ | WDSP_ELF_FLAG_EXECUTE) - -struct wdsp_img_segment { - - /* Firmware for the slit image */ - const struct firmware *split_fw; - - /* Name of the split firmware file */ - char split_fname[WDSP_IMG_NAME_LEN_MAX]; - - /* Address where the segment is to be loaded */ - u32 load_addr; - - /* Buffer to hold the data to be loaded */ - u8 *data; - - /* Size of the data to be loaded */ - size_t size; - - /* List node pointing to next segment */ - struct list_head list; -}; - -int wdsp_get_segment_list(struct device *dev, const char *img_fname, - unsigned int segment_type, struct list_head *seg_list, - u32 *entry_point); -void wdsp_flush_segment_list(struct list_head *seg_list); - -#endif /* __WCD_DSP_UTILS_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd-irq.c b/techpack/audio/asoc/codecs/wcd-irq.c deleted file mode 100644 index 48495f553999..000000000000 --- a/techpack/audio/asoc/codecs/wcd-irq.c +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int wcd_map_irq(struct wcd_irq_info *irq_info, int irq) -{ - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return -EINVAL; - } - return regmap_irq_get_virq(irq_info->irq_chip, irq); -} - -/** - * wcd_request_irq: Request a thread handler for the given IRQ - * @irq_info: pointer to IRQ info structure - * @irq: irq number - * @name: name for the IRQ thread - * @handler: irq handler - * @data: data pointer - * - * Returns 0 on success or error on failure - */ -int wcd_request_irq(struct wcd_irq_info *irq_info, int irq, const char *name, - irq_handler_t handler, void *data) -{ - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return -EINVAL; - } - irq = wcd_map_irq(irq_info, irq); - if (irq < 0) - return irq; - - return request_threaded_irq(irq, NULL, handler, - IRQF_ONESHOT | IRQF_TRIGGER_RISING, - name, data); -} -EXPORT_SYMBOL(wcd_request_irq); - -/** - * wcd_free_irq: Free the IRQ resources allocated during request_irq - * @irq_info: pointer to IRQ info structure - * @irq: irq number - * @data: data pointer - */ -void wcd_free_irq(struct wcd_irq_info *irq_info, int irq, void *data) -{ - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return; - } - - irq = wcd_map_irq(irq_info, irq); - if (irq < 0) - return; - - free_irq(irq, data); -} -EXPORT_SYMBOL(wcd_free_irq); - -/** - * wcd_enable_irq: Enable the given IRQ - * @irq_info: pointer to IRQ info structure - * @irq: irq number - */ -void wcd_enable_irq(struct wcd_irq_info *irq_info, int irq) -{ - if (!irq_info) - pr_err("%s: Null IRQ handle\n", __func__); - else - enable_irq(wcd_map_irq(irq_info, irq)); -} -EXPORT_SYMBOL(wcd_enable_irq); - -/** - * wcd_disable_irq: Disable the given IRQ - * @irq_info: pointer to IRQ info structure - * @irq: irq number - */ -void wcd_disable_irq(struct wcd_irq_info *irq_info, int irq) -{ - if (!irq_info) - pr_err("%s: Null IRQ handle\n", __func__); - else - disable_irq_nosync(wcd_map_irq(irq_info, irq)); -} -EXPORT_SYMBOL(wcd_disable_irq); - -static void wcd_irq_chip_disable(struct irq_data *data) -{ -} - -static void wcd_irq_chip_enable(struct irq_data *data) -{ -} - -static struct irq_chip wcd_irq_chip = { - .name = NULL, - .irq_disable = wcd_irq_chip_disable, - .irq_enable = wcd_irq_chip_enable, -}; - -static struct lock_class_key wcd_irq_lock_class; - -static int wcd_irq_chip_map(struct irq_domain *irqd, unsigned int virq, - irq_hw_number_t hw) -{ - irq_set_chip_and_handler(virq, &wcd_irq_chip, handle_simple_irq); - irq_set_lockdep_class(virq, &wcd_irq_lock_class); - irq_set_nested_thread(virq, 1); - irq_set_noprobe(virq); - - return 0; -} - -static const struct irq_domain_ops wcd_domain_ops = { - .map = wcd_irq_chip_map, -}; - -/** - * wcd_irq_init: Initializes IRQ module - * @irq_info: pointer to IRQ info structure - * - * Returns 0 on success or error on failure - */ -int wcd_irq_init(struct wcd_irq_info *irq_info, struct irq_domain **virq) -{ - int ret = 0; - - if (!irq_info) { - pr_err("%s: Null IRQ handle\n", __func__); - return -EINVAL; - } - - wcd_irq_chip.name = irq_info->codec_name; - - *virq = irq_domain_add_linear(NULL, 1, &wcd_domain_ops, NULL); - if (!(*virq)) { - pr_err("%s: Failed to add IRQ domain\n", __func__); - return -EINVAL; - } - - ret = devm_regmap_add_irq_chip(irq_info->dev, irq_info->regmap, - irq_create_mapping(*virq, 0), - IRQF_ONESHOT, 0, irq_info->wcd_regmap_irq_chip, - &irq_info->irq_chip); - if (ret) - pr_err("%s: Failed to add IRQs: %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(wcd_irq_init); - -/** - * wcd_irq_exit: Uninitialize regmap IRQ and free IRQ resources - * @irq_info: pointer to IRQ info structure - * - * Returns 0 on success or error on failure - */ -int wcd_irq_exit(struct wcd_irq_info *irq_info, struct irq_domain *virq) -{ - if (!irq_info) { - pr_err("%s: Null pointer handle\n", __func__); - return -EINVAL; - } - - regmap_del_irq_chip(irq_find_mapping(virq, 0), irq_info->irq_chip); - - return 0; -} -EXPORT_SYMBOL(wcd_irq_exit); diff --git a/techpack/audio/asoc/codecs/wcd-mbhc-adc.c b/techpack/audio/asoc/codecs/wcd-mbhc-adc.c deleted file mode 100644 index cb4a79b9eab9..000000000000 --- a/techpack/audio/asoc/codecs/wcd-mbhc-adc.c +++ /dev/null @@ -1,1131 +0,0 @@ -/* Copyright (c) 2017-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-mbhc-adc.h" -#include "wcd-mbhc-v2.h" -#include "pdata.h" - -#define WCD_MBHC_ADC_HS_THRESHOLD_MV 1700 -#define WCD_MBHC_ADC_HPH_THRESHOLD_MV 75 -#define WCD_MBHC_ADC_MICBIAS_MV 1800 -#define WCD_MBHC_FAKE_INS_RETRY 4 - -static int wcd_mbhc_get_micbias(struct wcd_mbhc *mbhc) -{ - int micbias = 0; - u8 vout_ctl = 0; - - /* Read MBHC Micbias (Mic Bias2) voltage */ - WCD_MBHC_REG_READ(WCD_MBHC_MICB2_VOUT, vout_ctl); - - /* Formula for getting micbias from vout - * micbias = 1.0V + VOUT_CTL * 50mV - */ - micbias = 1000 + (vout_ctl * 50); - pr_debug("%s: vout_ctl: %d, micbias: %d\n", - __func__, vout_ctl, micbias); - - return micbias; -} - -static int wcd_get_voltage_from_adc(u8 val, int micbias) -{ - /* Formula for calculating voltage from ADC - * Voltage = ADC_RESULT*12.5mV*V_MICBIAS/1.8 - */ - return ((val * 125 * micbias)/(WCD_MBHC_ADC_MICBIAS_MV * 10)); -} - -static int wcd_measure_adc_continuous(struct wcd_mbhc *mbhc) -{ - u8 adc_result = 0; - int output_mv = 0; - int retry = 3; - u8 adc_en = 0; - - pr_debug("%s: enter\n", __func__); - - /* Pre-requisites for ADC continuous measurement */ - /* Read legacy electircal detection and disable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0x00); - /* Set ADC to continuous measurement */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 1); - /* Read ADC Enable bit to restore after adc measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_EN, adc_en); - /* Disable ADC_ENABLE bit */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - /* Disable MBHC FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the MUX selection to IN2P */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, MUX_CTL_IN2P); - /* Enable MBHC FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - /* Enable ADC_ENABLE bit */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 1); - - while (retry--) { - /* wait for 3 msec before reading ADC result */ - usleep_range(3000, 3100); - - /* Read ADC result */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_RESULT, adc_result); - } - - /* Restore ADC Enable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, adc_en); - /* Get voltage from ADC result */ - output_mv = wcd_get_voltage_from_adc(adc_result, - wcd_mbhc_get_micbias(mbhc)); - pr_debug("%s: adc_result: 0x%x, output_mv: %d\n", - __func__, adc_result, output_mv); - - return output_mv; -} - -static int wcd_measure_adc_once(struct wcd_mbhc *mbhc, int mux_ctl) -{ - u8 adc_timeout = 0; - u8 adc_complete = 0; - u8 adc_result = 0; - int retry = 6; - int ret = 0; - int output_mv = 0; - u8 adc_en = 0; - - pr_debug("%s: enter\n", __func__); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - /* Read ADC Enable bit to restore after adc measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_EN, adc_en); - /* Trigger ADC one time measurement */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the appropriate MUX selection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, mux_ctl); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 1); - - while (retry--) { - /* wait for 600usec to get adc results */ - usleep_range(600, 610); - - /* check for ADC Timeout */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_TIMEOUT, adc_timeout); - if (adc_timeout) - continue; - - /* Read ADC complete bit */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_COMPLETE, adc_complete); - if (!adc_complete) - continue; - - /* Read ADC result */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_RESULT, adc_result); - - pr_debug("%s: ADC result: 0x%x\n", __func__, adc_result); - /* Get voltage from ADC result */ - output_mv = wcd_get_voltage_from_adc(adc_result, - wcd_mbhc_get_micbias(mbhc)); - break; - } - - /* Restore ADC Enable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, adc_en); - - if (retry <= 0) { - pr_err("%s: adc complete: %d, adc timeout: %d\n", - __func__, adc_complete, adc_timeout); - ret = -EINVAL; - } else { - pr_debug("%s: adc complete: %d, adc timeout: %d output_mV: %d\n", - __func__, adc_complete, adc_timeout, output_mv); - ret = output_mv; - } - - pr_debug("%s: leave\n", __func__); - - return ret; -} - -static bool wcd_mbhc_adc_detect_anc_plug_type(struct wcd_mbhc *mbhc) -{ - bool anc_mic_found = false; - u16 fsm_en = 0; - u8 det = 0; - unsigned long retry = 0; - int valid_plug_cnt = 0, invalid_plug_cnt = 0; - int ret = 0; - u8 elect_ctl = 0; - u8 adc_mode = 0; - u8 vref = 0; - int vref_mv[] = {1650, 1500, 1600, 1700}; - - if (mbhc->mbhc_cfg->anc_micbias < MIC_BIAS_1 || - mbhc->mbhc_cfg->anc_micbias > MIC_BIAS_4) - return false; - - if (!mbhc->mbhc_cb->mbhc_micbias_control) - return false; - - /* Disable Detection done for ADC operation */ - WCD_MBHC_REG_READ(WCD_MBHC_DETECTION_DONE, det); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - - /* Mask ADC COMPLETE interrupt */ - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_ENABLE); - - /* Read legacy electircal detection and disable */ - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0x00); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 1); - WCD_MBHC_REG_READ(WCD_MBHC_ADC_MODE, adc_mode); - - /* - * wait for button debounce time 20ms. If 4-pole plug is inserted - * into 5-pole jack, then there will be a button press interrupt - * during anc plug detection. In that case though Hs_comp_res is 0, - * it should not be declared as ANC plug type - */ - usleep_range(20000, 20100); - - /* - * After enabling FSM, to handle slow insertion scenarios, - * check IN3 voltage is below the Vref - */ - WCD_MBHC_REG_READ(WCD_MBHC_HS_VREF, vref); - - do { - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto done; - } - pr_debug("%s: Retry attempt %lu\n", __func__, retry + 1); - ret = wcd_measure_adc_once(mbhc, MUX_CTL_IN3P); - /* TODO - check the logic */ - if (ret && (ret < vref_mv[vref])) - valid_plug_cnt++; - else - invalid_plug_cnt++; - retry++; - } while (retry < ANC_DETECT_RETRY_CNT); - - pr_debug("%s: valid: %d, invalid: %d\n", __func__, valid_plug_cnt, - invalid_plug_cnt); - - /* decision logic */ - if (valid_plug_cnt > invalid_plug_cnt) - anc_mic_found = true; -done: - /* Restore ADC mode */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, adc_mode); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the MUX selection to AUTO */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, MUX_CTL_AUTO); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, fsm_en); - /* Restore detection done */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, det); - - /* Restore electrical detection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_DISABLE); - pr_debug("%s: anc mic %sfound\n", __func__, - anc_mic_found ? "" : "not "); - - return anc_mic_found; -} - -/* To determine if cross connection occurred */ -static int wcd_check_cross_conn(struct wcd_mbhc *mbhc) -{ - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_NONE; - int hphl_adc_res = 0, hphr_adc_res = 0; - u8 fsm_en = 0; - int ret = 0; - u8 adc_mode = 0; - u8 elect_ctl = 0; - u8 adc_en = 0; - - pr_debug("%s: enter\n", __func__); - /* Check for button press and plug detection */ - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - return -EINVAL; - } - - /* If PA is enabled, dont check for cross-connection */ - if (mbhc->mbhc_cb->hph_pa_on_status) - if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) - return -EINVAL; - - /* Read legacy electircal detection and disable */ - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0x00); - - /* Read and set ADC to single measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_MODE, adc_mode); - /* Read ADC Enable bit to restore after adc measurement */ - WCD_MBHC_REG_READ(WCD_MBHC_ADC_EN, adc_en); - /* Read FSM status */ - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - - /* Get adc result for HPH L */ - hphl_adc_res = wcd_measure_adc_once(mbhc, MUX_CTL_HPH_L); - if (hphl_adc_res < 0) { - pr_err("%s: hphl_adc_res adc measurement failed\n", __func__); - ret = hphl_adc_res; - goto done; - } - - /* Get adc result for HPH R in mV */ - hphr_adc_res = wcd_measure_adc_once(mbhc, MUX_CTL_HPH_R); - if (hphr_adc_res < 0) { - pr_err("%s: hphr_adc_res adc measurement failed\n", __func__); - ret = hphr_adc_res; - goto done; - } - - if (hphl_adc_res > 100 || hphr_adc_res > 100) { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Cross connection identified\n", __func__); - } else { - pr_debug("%s: No Cross connection found\n", __func__); - } - -done: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - /* Set the MUX selection to Auto */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, MUX_CTL_AUTO); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - - /* Restore ADC Enable */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, adc_en); - - /* Restore ADC mode */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, adc_mode); - - /* Restore FSM state */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, fsm_en); - - /* Restore electrical detection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, elect_ctl); - - pr_debug("%s: leave, plug type: %d\n", __func__, plug_type); - - return (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP) ? true : false; -} - -static int wcd_mbhc_adc_get_hs_thres(struct wcd_mbhc *mbhc) -{ - int hs_threshold, micbias_mv; - - micbias_mv = wcd_mbhc_get_micbias(mbhc); - if (mbhc->hs_thr) { - if (mbhc->micb_mv == micbias_mv) - hs_threshold = mbhc->hs_thr; - else - hs_threshold = (mbhc->hs_thr * - micbias_mv) / mbhc->micb_mv; - } else { - hs_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV * - micbias_mv) / WCD_MBHC_ADC_MICBIAS_MV); - } - return hs_threshold; -} - -static int wcd_mbhc_adc_get_hph_thres(struct wcd_mbhc *mbhc) -{ - int hph_threshold, micbias_mv; - - micbias_mv = wcd_mbhc_get_micbias(mbhc); - if (mbhc->hph_thr) { - if (mbhc->micb_mv == micbias_mv) - hph_threshold = mbhc->hph_thr; - else - hph_threshold = (mbhc->hph_thr * - micbias_mv) / mbhc->micb_mv; - } else { - hph_threshold = ((WCD_MBHC_ADC_HPH_THRESHOLD_MV * - micbias_mv) / WCD_MBHC_ADC_MICBIAS_MV); - } - return hph_threshold; -} - -static bool wcd_mbhc_adc_check_for_spl_headset(struct wcd_mbhc *mbhc, - int *spl_hs_cnt) -{ - bool spl_hs = false; - int output_mv = 0; - int adc_threshold = 0, adc_hph_threshold = 0; - - pr_debug("%s: enter\n", __func__); - if (!mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - goto exit; - - /* Bump up MB2 to 2.7V */ - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, true); - usleep_range(10000, 10100); - - /* - * Use ADC single mode to minimize the chance of missing out - * btn press/relesae for HEADSET type during correct work. - */ - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - adc_threshold = wcd_mbhc_adc_get_hs_thres(mbhc); - adc_hph_threshold = wcd_mbhc_adc_get_hph_thres(mbhc); - - if (output_mv > adc_threshold || output_mv < adc_hph_threshold) { - spl_hs = false; - } else { - spl_hs = true; - if (spl_hs_cnt) - *spl_hs_cnt += 1; - } - - /* MB2 back to 1.8v if the type is not special headset */ - if (spl_hs_cnt && (*spl_hs_cnt != WCD_MBHC_SPL_HS_CNT)) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, false); - /* Add 10ms delay for micbias to settle */ - usleep_range(10000, 10100); - } - - if (spl_hs) - pr_debug("%s: Detected special HS (%d)\n", __func__, spl_hs); - -exit: - pr_debug("%s: leave\n", __func__); - return spl_hs; -} - -static bool wcd_is_special_headset(struct wcd_mbhc *mbhc) -{ - int delay = 0; - bool ret = false; - bool is_spl_hs = false; - int output_mv = 0; - int adc_threshold = 0; - - /* - * Increase micbias to 2.7V to detect headsets with - * threshold on microphone - */ - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - pr_debug("%s: callback fn micb_ctrl_thr_mic not defined\n", - __func__); - return false; - } else if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - ret = mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - MIC_BIAS_2, true); - if (ret) { - pr_err("%s: mbhc_micb_ctrl_thr_mic failed, ret: %d\n", - __func__, ret); - return false; - } - } - adc_threshold = wcd_mbhc_adc_get_hs_thres(mbhc); - - while (!is_spl_hs) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - break; - } - delay += 50; - /* Wait for 50ms for FSM to update result */ - msleep(50); - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - if (output_mv <= adc_threshold) { - pr_debug("%s: Special headset detected in %d msecs\n", - __func__, delay); - is_spl_hs = true; - } - - if (delay == SPECIAL_HS_DETECT_TIME_MS) { - pr_debug("%s: Spl headset not found in 2 sec\n", - __func__); - break; - } - } - if (is_spl_hs) { - pr_debug("%s: Headset with threshold found\n", __func__); - mbhc->micbias_enable = true; - ret = true; - } - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, MIC_BIAS_2, - false); - pr_debug("%s: leave, micb_enable: %d\n", __func__, - mbhc->micbias_enable); - - return ret; -} - -static void wcd_mbhc_adc_update_fsm_source(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - switch (plug_type) { - case MBHC_PLUG_TYPE_HEADPHONE: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - break; - case MBHC_PLUG_TYPE_HEADSET: - case MBHC_PLUG_TYPE_ANC_HEADPHONE: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - MIC_BIAS_2, MICB_PULLUP_ENABLE); - break; - default: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - break; - - }; -} - -/* should be called under interrupt context that hold suspend */ -static void wcd_schedule_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: scheduling correct_swch_plug\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - mbhc->hs_detect_work_stop = false; - mbhc->mbhc_cb->lock_sleep(mbhc, true); - schedule_work(work); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_cancel_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: Canceling correct_plug_swch\n", __func__); - mbhc->hs_detect_work_stop = true; - WCD_MBHC_RSC_UNLOCK(mbhc); - if (cancel_work_sync(work)) { - pr_debug("%s: correct_plug_swch is canceled\n", - __func__); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } - WCD_MBHC_RSC_LOCK(mbhc); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_mbhc_adc_detect_plug_type(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, false); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - - if (mbhc->mbhc_cb->mbhc_micbias_control) { - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_ENABLE); - } else { - pr_err("%s: Mic Bias is not enabled\n", __func__); - return; - } - - /* Re-initialize button press completion object */ - reinit_completion(&mbhc->btn_press_compl); - wcd_schedule_hs_detect_plug(mbhc, &mbhc->correct_plug_swch); - pr_debug("%s: leave\n", __func__); -} - -static void wcd_micbias_disable(struct wcd_mbhc *mbhc) -{ - if (mbhc->micbias_enable) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) - mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); - mbhc->micbias_enable = false; - } -} - -static int wcd_mbhc_get_plug_from_adc(struct wcd_mbhc *mbhc, int adc_result) - -{ - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID; - u32 hph_thr = 0, hs_thr = 0; - - hs_thr = wcd_mbhc_adc_get_hs_thres(mbhc); - hph_thr = wcd_mbhc_adc_get_hph_thres(mbhc); - - if (adc_result < hph_thr) - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - else if (adc_result > hs_thr) - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - else - plug_type = MBHC_PLUG_TYPE_HEADSET; - pr_debug("%s: plug type is %d found\n", __func__, plug_type); - - return plug_type; -} - -static void wcd_correct_swch_plug(struct work_struct *work) -{ - struct wcd_mbhc *mbhc; - struct snd_soc_codec *codec; - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID; - unsigned long timeout; - bool wrk_complete = false; - int pt_gnd_mic_swap_cnt = 0; - int no_gnd_mic_swap_cnt = 0; - bool is_pa_on = false, spl_hs = false, spl_hs_reported = false; - int ret = 0; - int spl_hs_count = 0; - int output_mv = 0; - int cross_conn; - int try = 0; - int hs_threshold, micbias_mv; - - pr_debug("%s: enter\n", __func__); - - mbhc = container_of(work, struct wcd_mbhc, correct_plug_swch); - codec = mbhc->codec; - - micbias_mv = wcd_mbhc_get_micbias(mbhc); - hs_threshold = wcd_mbhc_adc_get_hs_thres(mbhc); - - WCD_MBHC_RSC_LOCK(mbhc); - /* Mask ADC COMPLETE interrupt */ - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_RSC_UNLOCK(mbhc); - - /* Check for cross connection */ - do { - cross_conn = wcd_check_cross_conn(mbhc); - try++; - } while (try < mbhc->swap_thr); - - if (cross_conn > 0) { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: cross connection found, Plug type %d\n", - __func__, plug_type); - goto correct_plug_type; - } - /* Find plug type */ - output_mv = wcd_measure_adc_continuous(mbhc); - plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv); - - /* - * Report plug type if it is either headset or headphone - * else start the 3 sec loop - */ - if ((plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE) && - (!wcd_swch_level_remove(mbhc))) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - - /* - * Set DETECTION_DONE bit for HEADSET and ANC_HEADPHONE, - * so that btn press/release interrupt can be generated. - */ - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET || - mbhc->current_plug == MBHC_PLUG_TYPE_ANC_HEADPHONE) { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 1); - } - -correct_plug_type: - /* - * Callback to disable BCS slow insertion detection - */ - if (plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE) - if (mbhc->mbhc_cb->bcs_enable) - mbhc->mbhc_cb->bcs_enable(mbhc, false); - - timeout = jiffies + msecs_to_jiffies(HS_DETECT_PLUG_TIME_MS); - while (!time_after(jiffies, timeout)) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_micbias_disable(mbhc); - goto exit; - } - - /* allow sometime and re-check stop requested again */ - msleep(20); - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_micbias_disable(mbhc); - goto exit; - } - - msleep(180); - /* - * Use ADC single mode to minimize the chance of missing out - * btn press/release for HEADSET type during correct work. - */ - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - - /* - * instead of hogging system by contineous polling, wait for - * sometime and re-check stop request again. - */ - plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv); - - if ((output_mv > hs_threshold) && - (spl_hs_count < WCD_MBHC_SPL_HS_CNT)) { - spl_hs = wcd_mbhc_adc_check_for_spl_headset(mbhc, - &spl_hs_count); - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - - if (spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - hs_threshold = (hs_threshold * - wcd_mbhc_get_micbias(mbhc)) / micbias_mv; - spl_hs = true; - mbhc->micbias_enable = true; - } - } - - if (mbhc->mbhc_cb->hph_pa_on_status) - is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec); - - if ((output_mv <= hs_threshold) && - (!is_pa_on)) { - /* Check for cross connection*/ - ret = wcd_check_cross_conn(mbhc); - if (ret < 0) - continue; - else if (ret > 0) { - pt_gnd_mic_swap_cnt++; - no_gnd_mic_swap_cnt = 0; - if (pt_gnd_mic_swap_cnt < - mbhc->swap_thr) { - continue; - } else if (pt_gnd_mic_swap_cnt > - mbhc->swap_thr) { - /* - * This is due to GND/MIC switch didn't - * work, Report unsupported plug. - */ - pr_debug("%s: switch did not work\n", - __func__); - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - goto report; - } else { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - } - } else { - no_gnd_mic_swap_cnt++; - pt_gnd_mic_swap_cnt = 0; - plug_type = wcd_mbhc_get_plug_from_adc( - mbhc, output_mv); - if ((no_gnd_mic_swap_cnt < - mbhc->swap_thr) && - (spl_hs_count != WCD_MBHC_SPL_HS_CNT)) { - continue; - } else { - no_gnd_mic_swap_cnt = 0; - } - } - if ((pt_gnd_mic_swap_cnt == mbhc->swap_thr) && - (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { - /* - * if switch is toggled, check again, - * otherwise report unsupported plug - */ - if (mbhc->mbhc_cfg->swap_gnd_mic && - mbhc->mbhc_cfg->swap_gnd_mic(codec, - true)) { - pr_debug("%s: US_EU gpio present,flip switch\n" - , __func__); - continue; - } - } - } - - if (output_mv > hs_threshold) { - pr_debug("%s: cable is extension cable\n", __func__); - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - wrk_complete = true; - } else { - pr_debug("%s: cable might be headset: %d\n", __func__, - plug_type); - if (plug_type != MBHC_PLUG_TYPE_GND_MIC_SWAP) { - plug_type = wcd_mbhc_get_plug_from_adc( - mbhc, output_mv); - if (!spl_hs_reported && - spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - spl_hs_reported = true; - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, - plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - continue; - } else if (spl_hs_reported) - continue; - /* - * Report headset only if not already reported - * and if there is not button press without - * release - */ - if ((mbhc->current_plug != - MBHC_PLUG_TYPE_HEADSET) && - (mbhc->current_plug != - MBHC_PLUG_TYPE_ANC_HEADPHONE) && - !wcd_swch_level_remove(mbhc)) { - pr_debug("%s: cable is %s headset\n", - __func__, - ((spl_hs_count == - WCD_MBHC_SPL_HS_CNT) ? - "special ":"")); - goto report; - } - } - wrk_complete = false; - } - } - if ((plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE)) - if (mbhc->mbhc_cb->bcs_enable) - mbhc->mbhc_cb->bcs_enable(mbhc, true); - - if (!wrk_complete) { - /* - * If plug_tye is headset, we might have already reported either - * in detect_plug-type or in above while loop, no need to report - * again - */ - if ((plug_type == MBHC_PLUG_TYPE_HEADSET) || - (plug_type == MBHC_PLUG_TYPE_ANC_HEADPHONE)) { - pr_debug("%s: plug_type:0x%x already reported\n", - __func__, mbhc->current_plug); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - goto enable_supply; - } - } - if (plug_type == MBHC_PLUG_TYPE_HIGH_HPH) { - if (wcd_is_special_headset(mbhc)) { - pr_debug("%s: Special headset found %d\n", - __func__, plug_type); - plug_type = MBHC_PLUG_TYPE_HEADSET; - } else { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_ISRC_EN, 1); - } - } - -report: - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto exit; - } - - pr_debug("%s: Valid plug found, plug type %d wrk_cmpt %d btn_intr %d\n", - __func__, plug_type, wrk_complete, - mbhc->btn_press_intr); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); -enable_supply: - /* - * Set DETECTION_DONE bit for HEADSET and ANC_HEADPHONE, - * so that btn press/release interrupt can be generated. - * For other plug type, clear the bit. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_ANC_HEADPHONE) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 1); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - - if (mbhc->mbhc_cb->mbhc_micbias_control) - wcd_mbhc_adc_update_fsm_source(mbhc, plug_type); -exit: - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_DISABLE); - - /* - * If plug type is corrected from special headset to headphone, - * clear the micbias enable flag, set micbias back to 1.8V and - * disable micbias. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE && - mbhc->micbias_enable) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(codec); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - - if (mbhc->mbhc_cfg->detect_extn_cable && - ((plug_type == MBHC_PLUG_TYPE_HEADPHONE) || - (plug_type == MBHC_PLUG_TYPE_HEADSET)) && - !mbhc->hs_detect_work_stop) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, true); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - - /* - * Enable ADC COMPLETE interrupt for HEADPHONE. - * Btn release may happen after the correct work, ADC COMPLETE - * interrupt needs to be captured to correct plug type. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - true); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, true); - - mbhc->mbhc_cb->lock_sleep(mbhc, false); - pr_debug("%s: leave\n", __func__); -} - -static irqreturn_t wcd_mbhc_adc_hs_rem_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - unsigned long timeout; - int adc_threshold, output_mv, retry = 0; - bool hphpa_on = false; - u8 moisture_status = 0; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - - timeout = jiffies + - msecs_to_jiffies(WCD_FAKE_REMOVAL_MIN_PERIOD_MS); - adc_threshold = wcd_mbhc_adc_get_hs_thres(mbhc); - - do { - retry++; - /* - * read output_mv every 10ms to look for - * any change in IN2_P - */ - usleep_range(10000, 10100); - output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P); - - pr_debug("%s: Check for fake removal: output_mv %d\n", - __func__, output_mv); - if ((output_mv <= adc_threshold) && - retry > FAKE_REM_RETRY_ATTEMPTS) { - pr_debug("%s: headset is NOT actually removed\n", - __func__); - goto exit; - } - } while (!time_after(jiffies, timeout)); - - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto exit; - } - - if (mbhc->mbhc_cfg->moisture_en) { - if (mbhc->mbhc_cb->hph_pa_on_status) - if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) { - hphpa_on = true; - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_HPHL_PA_EN, 0); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_HPH_PA_EN, 0); - } - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1); - /* wait for 50ms to get moisture status */ - usleep_range(50000, 50100); - - WCD_MBHC_REG_READ(WCD_MBHC_MOISTURE_STATUS, moisture_status); - } - - if (mbhc->mbhc_cfg->moisture_en && !moisture_status) { - pr_debug("%s: moisture present in jack\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); - else if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE); - else if (mbhc->current_plug == MBHC_PLUG_TYPE_GND_MIC_SWAP) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_UNSUPPORTED); - else if (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_LINEOUT); - } else { - /* - * ADC COMPLETE and ELEC_REM interrupts are both enabled for - * HEADPHONE, need to reject the ADC COMPLETE interrupt which - * follows ELEC_REM one when HEADPHONE is removed. - */ - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) - mbhc->extn_cable_hph_rem = true; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0); - wcd_mbhc_elec_hs_report_unplug(mbhc); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - - if (hphpa_on) { - hphpa_on = false; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 1); - } - } -exit: - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_adc_hs_ins_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - u8 clamp_state = 0; - u8 clamp_retry = WCD_MBHC_FAKE_INS_RETRY; - - pr_debug("%s: enter\n", __func__); - - /* - * ADC COMPLETE and ELEC_REM interrupts are both enabled for HEADPHONE, - * need to reject the ADC COMPLETE interrupt which follows ELEC_REM one - * when HEADPHONE is removed. - */ - if (mbhc->extn_cable_hph_rem == true) { - mbhc->extn_cable_hph_rem = false; - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; - } - - do { - WCD_MBHC_REG_READ(WCD_MBHC_IN2P_CLAMP_STATE, clamp_state); - if (clamp_state) { - pr_debug("%s: fake insertion irq, leave\n", __func__); - return IRQ_HANDLED; - } - /* - * check clamp for 120ms but at 30ms chunks to leave - * room for other interrupts to be processed - */ - usleep_range(30000, 30100); - } while (--clamp_retry); - - WCD_MBHC_RSC_LOCK(mbhc); - /* - * If current plug is headphone then there is no chance to - * get ADC complete interrupt, so connected cable should be - * headset not headphone. - */ - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 1); - wcd_mbhc_find_plug_and_report(mbhc, MBHC_PLUG_TYPE_HEADSET); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; - } - - if (!mbhc->mbhc_cfg->detect_extn_cable) { - pr_debug("%s: Returning as Extension cable feature not enabled\n", - __func__); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; - } - - pr_debug("%s: Disable electrical headset insertion interrupt\n", - __func__); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_ISRC_EN, 0); - mbhc->is_extn_cable = true; - mbhc->btn_press_intr = false; - wcd_mbhc_adc_detect_plug_type(mbhc); - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static struct wcd_mbhc_fn mbhc_fn = { - .wcd_mbhc_hs_ins_irq = wcd_mbhc_adc_hs_ins_irq, - .wcd_mbhc_hs_rem_irq = wcd_mbhc_adc_hs_rem_irq, - .wcd_mbhc_detect_plug_type = wcd_mbhc_adc_detect_plug_type, - .wcd_mbhc_detect_anc_plug_type = wcd_mbhc_adc_detect_anc_plug_type, - .wcd_cancel_hs_detect_plug = wcd_cancel_hs_detect_plug, -}; - -/* Function: wcd_mbhc_adc_init - * @mbhc: MBHC function pointer - * Description: Initialize MBHC ADC related function pointers to MBHC structure - */ -void wcd_mbhc_adc_init(struct wcd_mbhc *mbhc) -{ - if (!mbhc) { - pr_err("%s: mbhc is NULL\n", __func__); - return; - } - mbhc->mbhc_fn = &mbhc_fn; - INIT_WORK(&mbhc->correct_plug_swch, wcd_correct_swch_plug); -} -EXPORT_SYMBOL(wcd_mbhc_adc_init); diff --git a/techpack/audio/asoc/codecs/wcd-mbhc-adc.h b/techpack/audio/asoc/codecs/wcd-mbhc-adc.h deleted file mode 100644 index 31161089e793..000000000000 --- a/techpack/audio/asoc/codecs/wcd-mbhc-adc.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (c) 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD_MBHC_ADC_H__ -#define __WCD_MBHC_ADC_H__ - -#include "wcd-mbhc-v2.h" - -enum wcd_mbhc_adc_mux_ctl { - MUX_CTL_AUTO = 0, - MUX_CTL_IN2P, - MUX_CTL_IN3P, - MUX_CTL_IN4P, - MUX_CTL_HPH_L, - MUX_CTL_HPH_R, - MUX_CTL_NONE, -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_MBHC_ADC) -void wcd_mbhc_adc_init(struct wcd_mbhc *mbhc); -#else -static inline void wcd_mbhc_adc_init(struct wcd_mbhc *mbhc) -{ - -} -#endif -#endif /* __WCD_MBHC_ADC_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd-mbhc-legacy.c b/techpack/audio/asoc/codecs/wcd-mbhc-legacy.c deleted file mode 100644 index 9ebdeca01fff..000000000000 --- a/techpack/audio/asoc/codecs/wcd-mbhc-legacy.c +++ /dev/null @@ -1,1037 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-mbhc-legacy.h" -#include "wcd-mbhc-v2.h" - -static int det_extn_cable_en; -module_param(det_extn_cable_en, int, 0664); -MODULE_PARM_DESC(det_extn_cable_en, "enable/disable extn cable detect"); - -static bool wcd_mbhc_detect_anc_plug_type(struct wcd_mbhc *mbhc) -{ - bool anc_mic_found = false; - u16 val, hs_comp_res, btn_status = 0; - unsigned long retry = 0; - int valid_plug_cnt = 0, invalid_plug_cnt = 0; - int btn_status_cnt = 0; - bool is_check_btn_press = false; - - - if (mbhc->mbhc_cfg->anc_micbias < MIC_BIAS_1 || - mbhc->mbhc_cfg->anc_micbias > MIC_BIAS_4) - return false; - - if (!mbhc->mbhc_cb->mbhc_micbias_control) - return false; - - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, val); - - if (val) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_ENABLE); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, 0x2); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - /* - * wait for button debounce time 20ms. If 4-pole plug is inserted - * into 5-pole jack, then there will be a button press interrupt - * during anc plug detection. In that case though Hs_comp_res is 0, - * it should not be declared as ANC plug type - */ - usleep_range(20000, 20100); - - /* - * After enabling FSM, to handle slow insertion scenarios, - * check hs_comp_result for few times to see if the IN3 voltage - * is below the Vref - */ - do { - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto exit; - } - pr_debug("%s: Retry attempt %lu\n", __func__, retry + 1); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - - if (!hs_comp_res) { - valid_plug_cnt++; - is_check_btn_press = true; - } else - invalid_plug_cnt++; - /* Wait 1ms before taking another reading */ - usleep_range(1000, 1100); - - WCD_MBHC_REG_READ(WCD_MBHC_FSM_STATUS, btn_status); - if (btn_status) - btn_status_cnt++; - - retry++; - } while (retry < ANC_DETECT_RETRY_CNT); - - pr_debug("%s: valid: %d, invalid: %d, btn_status_cnt: %d\n", - __func__, valid_plug_cnt, invalid_plug_cnt, btn_status_cnt); - - /* decision logic */ - if ((valid_plug_cnt > invalid_plug_cnt) && is_check_btn_press && - (btn_status_cnt == 0)) - anc_mic_found = true; -exit: - if (!val) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ANC_DET_EN, 0); - - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - mbhc->mbhc_cfg->anc_micbias, - MICB_DISABLE); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, 0x0); - pr_debug("%s: anc mic %sfound\n", __func__, - anc_mic_found ? "" : "not "); - return anc_mic_found; -} - -/* To determine if cross connection occurred */ -static int wcd_check_cross_conn(struct wcd_mbhc *mbhc) -{ - u16 swap_res = 0; - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_NONE; - s16 reg1 = 0; - bool hphl_sch_res = 0, hphr_sch_res = 0; - - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - return -EINVAL; - } - - /* If PA is enabled, dont check for cross-connection */ - if (mbhc->mbhc_cb->hph_pa_on_status) - if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) - return false; - - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, reg1); - /* - * Check if there is any cross connection, - * Micbias and schmitt trigger (HPHL-HPHR) - * needs to be enabled. For some codecs like wcd9335, - * pull-up will already be enabled when this function - * is called for cross-connection identification. No - * need to enable micbias in that case. - */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 2); - - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_RESULT, swap_res); - pr_debug("%s: swap_res%x\n", __func__, swap_res); - - /* - * Read reg hphl and hphr schmitt result with cross connection - * bit. These bits will both be "0" in case of cross connection - * otherwise, they stay at 1 - */ - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch_res); - WCD_MBHC_REG_READ(WCD_MBHC_HPHR_SCHMT_RESULT, hphr_sch_res); - if (!(hphl_sch_res || hphr_sch_res)) { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Cross connection identified\n", __func__); - } else { - pr_debug("%s: No Cross connection found\n", __func__); - } - - /* Disable schmitt trigger and restore micbias */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, reg1); - pr_debug("%s: leave, plug type: %d\n", __func__, plug_type); - - return (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP) ? true : false; -} - -static bool wcd_is_special_headset(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - int delay = 0, rc; - bool ret = false; - u16 hs_comp_res; - bool is_spl_hs = false; - - /* - * Increase micbias to 2.7V to detect headsets with - * threshold on microphone - */ - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - pr_debug("%s: callback fn micb_ctrl_thr_mic not defined\n", - __func__); - return false; - } else if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) { - rc = mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(codec, - MIC_BIAS_2, true); - if (rc) { - pr_err("%s: Micbias control for thr mic failed, rc: %d\n", - __func__, rc); - return false; - } - } - - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - - pr_debug("%s: special headset, start register writes\n", __func__); - - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - while (!is_spl_hs) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - break; - } - delay = delay + 50; - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) { - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - true); - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_SET_VAL, - true); - } - /* Wait for 50msec for MICBIAS to settle down */ - msleep(50); - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, true); - /* Wait for 50msec for FSM to update result values */ - msleep(50); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - if (!(hs_comp_res)) { - pr_debug("%s: Special headset detected in %d msecs\n", - __func__, (delay * 2)); - is_spl_hs = true; - } - if (delay == SPECIAL_HS_DETECT_TIME_MS) { - pr_debug("%s: Spl headset didn't get detect in 4 sec\n", - __func__); - break; - } - } - if (is_spl_hs) { - pr_debug("%s: Headset with threshold found\n", __func__); - mbhc->micbias_enable = true; - ret = true; - } - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - false); - if (mbhc->mbhc_cb->set_micbias_value && !mbhc->micbias_enable) - mbhc->mbhc_cb->set_micbias_value(codec); - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, false); - - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(codec, MIC_BIAS_2, - false); - - pr_debug("%s: leave, micb_enable: %d\n", __func__, - mbhc->micbias_enable); - return ret; -} - -static void wcd_mbhc_update_fsm_source(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - bool micbias2; - - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); - switch (plug_type) { - case MBHC_PLUG_TYPE_HEADPHONE: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - break; - case MBHC_PLUG_TYPE_HEADSET: - case MBHC_PLUG_TYPE_ANC_HEADPHONE: - if (!mbhc->is_hs_recording && !micbias2) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - break; - default: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - break; - - }; -} - -static void wcd_enable_mbhc_supply(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - - struct snd_soc_codec *codec = mbhc->codec; - - /* - * Do not disable micbias if recording is going on or - * headset is inserted on the other side of the extn - * cable. If headset has been detected current source - * needs to be kept enabled for button detection to work. - * If the accessory type is invalid or unsupported, we - * dont need to enable either of them. - */ - if (det_extn_cable_en && mbhc->is_extn_cable && - mbhc->mbhc_cb && mbhc->mbhc_cb->extn_use_mb && - mbhc->mbhc_cb->extn_use_mb(codec)) { - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE || - plug_type == MBHC_PLUG_TYPE_HEADSET) - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - } else { - if (plug_type == MBHC_PLUG_TYPE_HEADSET) { - if (mbhc->is_hs_recording || mbhc->micbias_enable) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - } else if ((test_bit(WCD_MBHC_EVENT_PA_HPHL, - &mbhc->event_state)) || - (test_bit(WCD_MBHC_EVENT_PA_HPHR, - &mbhc->event_state))) { - wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_PULLUP); - } else { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - } - } else if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - } else { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_NONE); - } - } -} - -static bool wcd_mbhc_check_for_spl_headset(struct wcd_mbhc *mbhc, - int *spl_hs_cnt) -{ - u16 hs_comp_res_1_8v = 0, hs_comp_res_2_7v = 0; - bool spl_hs = false; - - if (!mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - goto done; - - if (!spl_hs_cnt) { - pr_err("%s: spl_hs_cnt is NULL\n", __func__); - goto done; - } - /* Read back hs_comp_res @ 1.8v Micbias */ - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res_1_8v); - if (!hs_comp_res_1_8v) { - spl_hs = false; - goto done; - } - - /* Bump up MB2 to 2.7v */ - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, true); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - usleep_range(10000, 10100); - - /* Read back HS_COMP_RESULT */ - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res_2_7v); - if (!hs_comp_res_2_7v && hs_comp_res_1_8v) - spl_hs = true; - - if (spl_hs) - *spl_hs_cnt += 1; - - /* MB2 back to 1.8v */ - if (*spl_hs_cnt != WCD_MBHC_SPL_HS_CNT) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(mbhc->codec, - mbhc->mbhc_cfg->mbhc_micbias, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - usleep_range(10000, 10100); - } - - if (spl_hs) - pr_debug("%s: Detected special HS (%d)\n", __func__, spl_hs); - -done: - return spl_hs; -} - -/* should be called under interrupt context that hold suspend */ -static void wcd_schedule_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: scheduling correct_swch_plug\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - mbhc->hs_detect_work_stop = false; - mbhc->mbhc_cb->lock_sleep(mbhc, true); - schedule_work(work); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_cancel_hs_detect_plug(struct wcd_mbhc *mbhc, - struct work_struct *work) -{ - pr_debug("%s: Canceling correct_plug_swch\n", __func__); - mbhc->hs_detect_work_stop = true; - WCD_MBHC_RSC_UNLOCK(mbhc); - if (cancel_work_sync(work)) { - pr_debug("%s: correct_plug_swch is canceled\n", - __func__); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } - WCD_MBHC_RSC_LOCK(mbhc); -} - -/* called under codec_resource_lock acquisition */ -static void wcd_mbhc_detect_plug_type(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - bool micbias1 = false; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, false); - - if (mbhc->mbhc_cb->micbias_enable_status) - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, true); - - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_ENABLE); - else - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - - /* Re-initialize button press completion object */ - reinit_completion(&mbhc->btn_press_compl); - wcd_schedule_hs_detect_plug(mbhc, &mbhc->correct_plug_swch); - pr_debug("%s: leave\n", __func__); -} - -static void wcd_correct_swch_plug(struct work_struct *work) -{ - struct wcd_mbhc *mbhc; - struct snd_soc_codec *codec; - enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID; - unsigned long timeout; - u16 hs_comp_res = 0, hphl_sch = 0, mic_sch = 0, btn_result = 0; - bool wrk_complete = false; - int pt_gnd_mic_swap_cnt = 0; - int no_gnd_mic_swap_cnt = 0; - bool is_pa_on = false, spl_hs = false, spl_hs_reported = false; - bool micbias2 = false; - bool micbias1 = false; - int ret = 0; - int rc, spl_hs_count = 0; - int cross_conn; - int try = 0; - - pr_debug("%s: enter\n", __func__); - - mbhc = container_of(work, struct wcd_mbhc, correct_plug_swch); - codec = mbhc->codec; - - /* - * Enable micbias/pullup for detection in correct work. - * This work will get scheduled from detect_plug_type which - * will already request for pullup/micbias. If the pullup/micbias - * is handled with ref-counts by individual codec drivers, there is - * no need to enabale micbias/pullup here - */ - - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - - /* Enable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - /* - * Check for any button press interrupts before starting 3-sec - * loop. - */ - rc = wait_for_completion_timeout(&mbhc->btn_press_compl, - msecs_to_jiffies(WCD_MBHC_BTN_PRESS_COMPL_TIMEOUT_MS)); - - WCD_MBHC_REG_READ(WCD_MBHC_BTN_RESULT, btn_result); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - - if (!rc) { - pr_debug("%s No btn press interrupt\n", __func__); - if (!btn_result && !hs_comp_res) - plug_type = MBHC_PLUG_TYPE_HEADSET; - else if (!btn_result && hs_comp_res) - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - else - plug_type = MBHC_PLUG_TYPE_INVALID; - } else { - if (!btn_result && !hs_comp_res) - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - else - plug_type = MBHC_PLUG_TYPE_INVALID; - } - - do { - cross_conn = wcd_check_cross_conn(mbhc); - try++; - } while (try < mbhc->swap_thr); - - /* - * Check for cross connection 4 times. - * Consider the result of the fourth iteration. - */ - if (cross_conn > 0) { - pr_debug("%s: cross con found, start polling\n", - __func__); - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Plug found, plug type is %d\n", - __func__, plug_type); - goto correct_plug_type; - } - - if ((plug_type == MBHC_PLUG_TYPE_HEADSET || - plug_type == MBHC_PLUG_TYPE_HEADPHONE) && - (!wcd_swch_level_remove(mbhc))) { - WCD_MBHC_RSC_LOCK(mbhc); - if (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, - 0); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - -correct_plug_type: - - timeout = jiffies + msecs_to_jiffies(HS_DETECT_PLUG_TIME_MS); - while (!time_after(jiffies, timeout)) { - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_NONE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - mbhc->micbias_enable) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) - mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); - mbhc->micbias_enable = false; - } - goto exit; - } - if (mbhc->btn_press_intr) { - wcd_cancel_btn_work(mbhc); - mbhc->btn_press_intr = false; - } - /* Toggle FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - - /* allow sometime and re-check stop requested again */ - msleep(20); - if (mbhc->hs_detect_work_stop) { - pr_debug("%s: stop requested: %d\n", __func__, - mbhc->hs_detect_work_stop); - wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_NONE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic && - mbhc->micbias_enable) { - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) - mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); - mbhc->micbias_enable = false; - } - goto exit; - } - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_res); - - pr_debug("%s: hs_comp_res: %x\n", __func__, hs_comp_res); - if (mbhc->mbhc_cb->hph_pa_on_status) - is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(codec); - - /* - * instead of hogging system by contineous polling, wait for - * sometime and re-check stop request again. - */ - msleep(180); - if (hs_comp_res && (spl_hs_count < WCD_MBHC_SPL_HS_CNT)) { - spl_hs = wcd_mbhc_check_for_spl_headset(mbhc, - &spl_hs_count); - - if (spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - hs_comp_res = 0; - spl_hs = true; - mbhc->micbias_enable = true; - } - } - - if ((!hs_comp_res) && (!is_pa_on)) { - /* Check for cross connection*/ - ret = wcd_check_cross_conn(mbhc); - if (ret < 0) { - continue; - } else if (ret > 0) { - pt_gnd_mic_swap_cnt++; - no_gnd_mic_swap_cnt = 0; - if (pt_gnd_mic_swap_cnt < - mbhc->swap_thr) { - continue; - } else if (pt_gnd_mic_swap_cnt > - mbhc->swap_thr) { - /* - * This is due to GND/MIC switch didn't - * work, Report unsupported plug. - */ - pr_debug("%s: switch didn't work\n", - __func__); - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - goto report; - } else { - plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - } - } else { - no_gnd_mic_swap_cnt++; - pt_gnd_mic_swap_cnt = 0; - plug_type = MBHC_PLUG_TYPE_HEADSET; - if ((no_gnd_mic_swap_cnt < - GND_MIC_SWAP_THRESHOLD) && - (spl_hs_count != WCD_MBHC_SPL_HS_CNT)) { - continue; - } else { - no_gnd_mic_swap_cnt = 0; - } - } - if ((pt_gnd_mic_swap_cnt == mbhc->swap_thr) && - (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { - /* - * if switch is toggled, check again, - * otherwise report unsupported plug - */ - if (mbhc->mbhc_cfg->swap_gnd_mic && - mbhc->mbhc_cfg->swap_gnd_mic(codec, - true)) { - pr_debug("%s: US_EU gpio present,flip switch\n" - , __func__); - continue; - } - } - } - - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); - WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); - if (hs_comp_res && !(hphl_sch || mic_sch)) { - pr_debug("%s: cable is extension cable\n", __func__); - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; - wrk_complete = true; - } else { - pr_debug("%s: cable might be headset: %d\n", __func__, - plug_type); - if (!(plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { - plug_type = MBHC_PLUG_TYPE_HEADSET; - if (!spl_hs_reported && - spl_hs_count == WCD_MBHC_SPL_HS_CNT) { - spl_hs_reported = true; - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, - plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); - continue; - } else if (spl_hs_reported) - continue; - /* - * Report headset only if not already reported - * and if there is not button press without - * release - */ - if (((mbhc->current_plug != - MBHC_PLUG_TYPE_HEADSET) && - (mbhc->current_plug != - MBHC_PLUG_TYPE_ANC_HEADPHONE)) && - !wcd_swch_level_remove(mbhc) && - !mbhc->btn_press_intr) { - pr_debug("%s: cable is %sheadset\n", - __func__, - ((spl_hs_count == - WCD_MBHC_SPL_HS_CNT) ? - "special ":"")); - goto report; - } - } - wrk_complete = false; - } - } - if (!wrk_complete && mbhc->btn_press_intr) { - pr_debug("%s: Can be slow insertion of headphone\n", __func__); - wcd_cancel_btn_work(mbhc); - /* Report as headphone only if previously - * not reported as lineout - */ - if (!mbhc->force_linein) - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - } - /* - * If plug_tye is headset, we might have already reported either in - * detect_plug-type or in above while loop, no need to report again - */ - if (!wrk_complete && ((plug_type == MBHC_PLUG_TYPE_HEADSET) || - (plug_type == MBHC_PLUG_TYPE_ANC_HEADPHONE))) { - pr_debug("%s: plug_type:0x%x already reported\n", - __func__, mbhc->current_plug); - goto enable_supply; - } - - if (plug_type == MBHC_PLUG_TYPE_HIGH_HPH && - (!det_extn_cable_en)) { - if (wcd_is_special_headset(mbhc)) { - pr_debug("%s: Special headset found %d\n", - __func__, plug_type); - plug_type = MBHC_PLUG_TYPE_HEADSET; - goto report; - } - } - -report: - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low\n", __func__); - goto exit; - } - if (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP && mbhc->btn_press_intr) { - pr_debug("%s: insertion of headphone with swap\n", __func__); - wcd_cancel_btn_work(mbhc); - plug_type = MBHC_PLUG_TYPE_HEADPHONE; - } - pr_debug("%s: Valid plug found, plug type %d wrk_cmpt %d btn_intr %d\n", - __func__, plug_type, wrk_complete, - mbhc->btn_press_intr); - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_find_plug_and_report(mbhc, plug_type); - WCD_MBHC_RSC_UNLOCK(mbhc); -enable_supply: - if (mbhc->mbhc_cb->mbhc_micbias_control) - wcd_mbhc_update_fsm_source(mbhc, plug_type); - else - wcd_enable_mbhc_supply(mbhc, plug_type); -exit: - if (mbhc->mbhc_cb->mbhc_micbias_control && - !mbhc->micbias_enable) - mbhc->mbhc_cb->mbhc_micbias_control(codec, MIC_BIAS_2, - MICB_DISABLE); - - /* - * If plug type is corrected from special headset to headphone, - * clear the micbias enable flag, set micbias back to 1.8V and - * disable micbias. - */ - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE && - mbhc->micbias_enable) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(codec); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - - if (mbhc->mbhc_cb->micbias_enable_status) { - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); - } - - if (mbhc->mbhc_cfg->detect_extn_cable && - ((plug_type == MBHC_PLUG_TYPE_HEADPHONE) || - (plug_type == MBHC_PLUG_TYPE_HEADSET)) && - !mbhc->hs_detect_work_stop) { - WCD_MBHC_RSC_LOCK(mbhc); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, true); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, micbias2); - - if (mbhc->mbhc_cb->hph_pull_down_ctrl) - mbhc->mbhc_cb->hph_pull_down_ctrl(codec, true); - - mbhc->mbhc_cb->lock_sleep(mbhc, false); - pr_debug("%s: leave\n", __func__); -} - -static irqreturn_t wcd_mbhc_hs_rem_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - u8 hs_comp_result = 0, hphl_sch = 0, mic_sch = 0; - static u16 hphl_trigerred; - static u16 mic_trigerred; - unsigned long timeout; - bool removed = true; - int retry = 0; - bool hphpa_on = false; - u8 moisture_status = 0; - - pr_debug("%s: enter\n", __func__); - - WCD_MBHC_RSC_LOCK(mbhc); - - timeout = jiffies + - msecs_to_jiffies(WCD_FAKE_REMOVAL_MIN_PERIOD_MS); - do { - retry++; - /* - * read the result register every 10ms to look for - * any change in HS_COMP_RESULT bit - */ - usleep_range(10000, 10100); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_result); - pr_debug("%s: Check result reg for fake removal: hs_comp_res %x\n", - __func__, hs_comp_result); - if ((!hs_comp_result) && - retry > FAKE_REM_RETRY_ATTEMPTS) { - removed = false; - break; - } - } while (!time_after(jiffies, timeout)); - - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto exit; - } - pr_debug("%s: headset %s actually removed\n", __func__, - removed ? "" : "not "); - - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); - WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); - WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_result); - - if (removed) { - if (mbhc->mbhc_cfg->moisture_en) { - if (mbhc->mbhc_cb->hph_pa_on_status) - if ( - mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) { - hphpa_on = true; - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_HPHL_PA_EN, 0); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_HPH_PA_EN, 0); - } - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1); - /* wait for 50ms to get moisture status */ - usleep_range(50000, 50100); - - WCD_MBHC_REG_READ( - WCD_MBHC_MOISTURE_STATUS, moisture_status); - } - - if (mbhc->mbhc_cfg->moisture_en && !moisture_status) { - pr_debug("%s: moisture present in jack\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_MECH_DETECTION_TYPE, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_HEADSET); - else if (mbhc->current_plug == - MBHC_PLUG_TYPE_HEADPHONE) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_HEADPHONE); - else if (mbhc->current_plug == - MBHC_PLUG_TYPE_GND_MIC_SWAP) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_UNSUPPORTED); - else if (mbhc->current_plug == - MBHC_PLUG_TYPE_HIGH_HPH) - wcd_mbhc_report_plug( - mbhc, 0, SND_JACK_LINEOUT); - } else { - if (!(hphl_sch && mic_sch && hs_comp_result)) { - /* - * extension cable is still plugged in - * report it as LINEOUT device - */ - goto report_unplug; - } else { - if (!mic_sch) { - mic_trigerred++; - pr_debug( - "%s: Removal MIC trigerred %d\n", - __func__, mic_trigerred); - } - if (!hphl_sch) { - hphl_trigerred++; - pr_debug( - "%s: Removal HPHL trigerred %d\n", - __func__, hphl_trigerred); - } - if (mic_trigerred && hphl_trigerred) { - /* - * extension cable is still plugged in - * report it as LINEOUT device - */ - goto report_unplug; - } - } - } - } -exit: - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; - -report_unplug: - wcd_mbhc_elec_hs_report_unplug(mbhc); - if (hphpa_on) { - hphpa_on = false; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 1); - } - hphl_trigerred = 0; - mic_trigerred = 0; - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_hs_ins_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - bool detection_type = 0, hphl_sch = 0, mic_sch = 0; - u16 elect_result = 0; - static u16 hphl_trigerred; - static u16 mic_trigerred; - - pr_debug("%s: enter\n", __func__); - if (!mbhc->mbhc_cfg->detect_extn_cable) { - pr_debug("%s: Returning as Extension cable feature not enabled\n", - __func__); - return IRQ_HANDLED; - } - WCD_MBHC_RSC_LOCK(mbhc); - - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_DETECTION_TYPE, detection_type); - WCD_MBHC_REG_READ(WCD_MBHC_ELECT_RESULT, elect_result); - - pr_debug("%s: detection_type %d, elect_result %x\n", __func__, - detection_type, elect_result); - if (detection_type) { - /* check if both Left and MIC Schmitt triggers are triggered */ - WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); - WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); - if (hphl_sch && mic_sch) { - /* Go for plug type determination */ - pr_debug("%s: Go for plug type determination\n", - __func__); - goto determine_plug; - - } else { - if (mic_sch) { - mic_trigerred++; - pr_debug("%s: Insertion MIC trigerred %d\n", - __func__, mic_trigerred); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_ELECT_SCHMT_ISRC, - 0); - msleep(20); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_ELECT_SCHMT_ISRC, - 1); - } - if (hphl_sch) { - hphl_trigerred++; - pr_debug("%s: Insertion HPHL trigerred %d\n", - __func__, hphl_trigerred); - } - if (mic_trigerred && hphl_trigerred) { - /* Go for plug type determination */ - pr_debug("%s: Go for plug type determination\n", - __func__); - goto determine_plug; - } - } - } - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; - -determine_plug: - /* - * Disable HPHL trigger and MIC Schmitt triggers. - * Setup for insertion detection. - */ - pr_debug("%s: Disable insertion interrupt\n", __func__); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - false); - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); - hphl_trigerred = 0; - mic_trigerred = 0; - mbhc->is_extn_cable = true; - mbhc->btn_press_intr = false; - wcd_mbhc_detect_plug_type(mbhc); - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return IRQ_HANDLED; -} - -static struct wcd_mbhc_fn mbhc_fn = { - .wcd_mbhc_hs_ins_irq = wcd_mbhc_hs_ins_irq, - .wcd_mbhc_hs_rem_irq = wcd_mbhc_hs_rem_irq, - .wcd_mbhc_detect_plug_type = wcd_mbhc_detect_plug_type, - .wcd_mbhc_detect_anc_plug_type = wcd_mbhc_detect_anc_plug_type, - .wcd_cancel_hs_detect_plug = wcd_cancel_hs_detect_plug, -}; - -/* Function: wcd_mbhc_legacy_init - * @mbhc: MBHC function pointer - * Description: Initialize MBHC legacy based function pointers to MBHC structure - */ -void wcd_mbhc_legacy_init(struct wcd_mbhc *mbhc) -{ - if (!mbhc) { - pr_err("%s: mbhc is NULL\n", __func__); - return; - } - mbhc->mbhc_fn = &mbhc_fn; - INIT_WORK(&mbhc->correct_plug_swch, wcd_correct_swch_plug); -} -EXPORT_SYMBOL(wcd_mbhc_legacy_init); diff --git a/techpack/audio/asoc/codecs/wcd-mbhc-legacy.h b/techpack/audio/asoc/codecs/wcd-mbhc-legacy.h deleted file mode 100644 index af3a7dc6d06b..000000000000 --- a/techpack/audio/asoc/codecs/wcd-mbhc-legacy.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2014-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD_MBHC_LEGACY_H__ -#define __WCD_MBHC_LEGACY_H__ - -#include "wcdcal-hwdep.h" -#include "wcd-mbhc-v2.h" - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_MBHC_LEGACY) -void wcd_mbhc_legacy_init(struct wcd_mbhc *mbhc); -#else -static inline void wcd_mbhc_legacy_init(struct wcd_mbhc *mbhc) -{ -} -#endif - -#endif /* __WCD_MBHC_LEGACY_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd-mbhc-v2-api.h b/techpack/audio/asoc/codecs/wcd-mbhc-v2-api.h deleted file mode 100644 index 7b6e94507ad0..000000000000 --- a/techpack/audio/asoc/codecs/wcd-mbhc-v2-api.h +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (c) 2014-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD_MBHC_V2_API_H__ -#define __WCD_MBHC_V2_API_H__ - -#include "wcd-mbhc-v2.h" - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_MBHC) -int wcd_mbhc_start(struct wcd_mbhc *mbhc, - struct wcd_mbhc_config *mbhc_cfg); -void wcd_mbhc_stop(struct wcd_mbhc *mbhc); -int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_codec *codec, - const struct wcd_mbhc_cb *mbhc_cb, - const struct wcd_mbhc_intr *mbhc_cdc_intr_ids, - struct wcd_mbhc_register *wcd_mbhc_regs, - bool impedance_det_en); -int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr); -void wcd_mbhc_deinit(struct wcd_mbhc *mbhc); - -#else -static inline void wcd_mbhc_stop(struct wcd_mbhc *mbhc) -{ -} -int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_codec *codec, - const struct wcd_mbhc_cb *mbhc_cb, - const struct wcd_mbhc_intr *mbhc_cdc_intr_ids, - struct wcd_mbhc_register *wcd_mbhc_regs, - bool impedance_det_en) -{ - return 0; -} -static inline int wcd_mbhc_start(struct wcd_mbhc *mbhc, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, - uint32_t *zl, - uint32_t *zr) -{ - *zl = 0; - *zr = 0; - return -EINVAL; -} -static inline void wcd_mbhc_deinit(struct wcd_mbhc *mbhc) -{ -} -#endif - -#endif /* __WCD_MBHC_V2_API_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd-mbhc-v2.c b/techpack/audio/asoc/codecs/wcd-mbhc-v2.c deleted file mode 100644 index 0216cc47ad8c..000000000000 --- a/techpack/audio/asoc/codecs/wcd-mbhc-v2.c +++ /dev/null @@ -1,2308 +0,0 @@ -/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-cdc-pinctrl.h" -#include "wcdcal-hwdep.h" -#include "wcd-mbhc-legacy.h" -#include "wcd-mbhc-adc.h" -#include "wcd-mbhc-v2-api.h" - -#define CONFIG_AUDIO_UART_DEBUG - -void wcd_mbhc_jack_report(struct wcd_mbhc *mbhc, - struct snd_soc_jack *jack, int status, int mask) -{ - snd_soc_jack_report(jack, status, mask); -} -EXPORT_SYMBOL(wcd_mbhc_jack_report); - -static void __hphocp_off_report(struct wcd_mbhc *mbhc, u32 jack_status, - int irq) -{ - struct snd_soc_codec *codec = mbhc->codec; - - dev_dbg(codec->dev, "%s: clear ocp status %x\n", - __func__, jack_status); - - if (mbhc->hph_status & jack_status) { - mbhc->hph_status &= ~jack_status; - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, WCD_MBHC_JACK_MASK); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 1); - /* - * reset retry counter as PA is turned off signifying - * start of new OCP detection session - */ - if (mbhc->intr_ids->hph_left_ocp) - mbhc->hphlocp_cnt = 0; - else - mbhc->hphrocp_cnt = 0; - mbhc->mbhc_cb->irq_control(codec, irq, true); - } -} - -static void hphrocp_off_report(struct wcd_mbhc *mbhc, u32 jack_status) -{ - __hphocp_off_report(mbhc, SND_JACK_OC_HPHR, - mbhc->intr_ids->hph_right_ocp); -} - -static void hphlocp_off_report(struct wcd_mbhc *mbhc, u32 jack_status) -{ - __hphocp_off_report(mbhc, SND_JACK_OC_HPHL, - mbhc->intr_ids->hph_left_ocp); -} - -static void wcd_program_hs_vref(struct wcd_mbhc *mbhc) -{ - struct wcd_mbhc_plug_type_cfg *plug_type_cfg; - struct snd_soc_codec *codec = mbhc->codec; - u32 reg_val; - - plug_type_cfg = WCD_MBHC_CAL_PLUG_TYPE_PTR(mbhc->mbhc_cfg->calibration); - reg_val = ((plug_type_cfg->v_hs_max - HS_VREF_MIN_VAL) / 100); - - dev_dbg(codec->dev, "%s: reg_val = %x\n", __func__, reg_val); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_VREF, reg_val); -} - -static void wcd_program_btn_threshold(const struct wcd_mbhc *mbhc, bool micbias) -{ - struct wcd_mbhc_btn_detect_cfg *btn_det; - struct snd_soc_codec *codec = mbhc->codec; - struct snd_soc_card *card = codec->component.card; - s16 *btn_low, *btn_high; - - if (mbhc->mbhc_cfg->calibration == NULL) { - dev_err(card->dev, "%s: calibration data is NULL\n", __func__); - return; - } - - btn_det = WCD_MBHC_CAL_BTN_DET_PTR(mbhc->mbhc_cfg->calibration); - btn_low = btn_det->_v_btn_low; - btn_high = ((void *)&btn_det->_v_btn_low) + - (sizeof(btn_det->_v_btn_low[0]) * btn_det->num_btn); - - mbhc->mbhc_cb->set_btn_thr(codec, btn_low, btn_high, btn_det->num_btn, - micbias); -} - -void wcd_enable_curr_micbias(const struct wcd_mbhc *mbhc, - const enum wcd_mbhc_cs_mb_en_flag cs_mb_en) -{ - - /* - * Some codecs handle micbias/pullup enablement in codec - * drivers itself and micbias is not needed for regular - * plug type detection. So if micbias_control callback function - * is defined, just return. - */ - if (mbhc->mbhc_cb->mbhc_micbias_control) - return; - - pr_debug("%s: enter, cs_mb_en: %d\n", __func__, cs_mb_en); - - switch (cs_mb_en) { - case WCD_MBHC_EN_CS: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - /* Program Button threshold registers as per CS */ - wcd_program_btn_threshold(mbhc, false); - break; - case WCD_MBHC_EN_MB: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - - /* Disable PULL_UP_EN & enable MICBIAS */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 2); - /* Program Button threshold registers as per MICBIAS */ - wcd_program_btn_threshold(mbhc, true); - break; - case WCD_MBHC_EN_PULLUP: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 3); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 1); - /* Program Button threshold registers as per MICBIAS */ - wcd_program_btn_threshold(mbhc, true); - break; - case WCD_MBHC_EN_NONE: - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - break; - default: - pr_debug("%s: Invalid parameter", __func__); - break; - } - - pr_debug("%s: exit\n", __func__); -} -EXPORT_SYMBOL(wcd_enable_curr_micbias); - -static const char *wcd_mbhc_get_event_string(int event) -{ - switch (event) { - case WCD_EVENT_PRE_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_MICBIAS_2_OFF); - case WCD_EVENT_POST_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_MICBIAS_2_OFF); - case WCD_EVENT_PRE_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_MICBIAS_2_ON); - case WCD_EVENT_POST_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_MICBIAS_2_ON); - case WCD_EVENT_PRE_HPHL_PA_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHL_PA_ON); - case WCD_EVENT_POST_HPHL_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_HPHL_PA_OFF); - case WCD_EVENT_PRE_HPHR_PA_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHR_PA_ON); - case WCD_EVENT_POST_HPHR_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_HPHR_PA_OFF); - case WCD_EVENT_PRE_HPHR_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHR_PA_OFF); - case WCD_EVENT_PRE_HPHL_PA_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_HPHL_PA_OFF); - case WCD_EVENT_POST_DAPM_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_DAPM_MICBIAS_2_ON); - case WCD_EVENT_PRE_DAPM_MICBIAS_2_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_DAPM_MICBIAS_2_ON); - case WCD_EVENT_POST_DAPM_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_DAPM_MICBIAS_2_OFF); - case WCD_EVENT_PRE_DAPM_MICBIAS_2_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_DAPM_MICBIAS_2_OFF); - case WCD_EVENT_OCP_OFF: - return WCD_MBHC_STRINGIFY(WCD_EVENT_OCP_OFF); - case WCD_EVENT_OCP_ON: - return WCD_MBHC_STRINGIFY(WCD_EVENT_OCP_ON); - case WCD_EVENT_INVALID: - default: - return WCD_MBHC_STRINGIFY(WCD_EVENT_INVALID); - } -} - -static int wcd_event_notify(struct notifier_block *self, unsigned long val, - void *data) -{ - struct wcd_mbhc *mbhc = (struct wcd_mbhc *)data; - enum wcd_notify_event event = (enum wcd_notify_event)val; - struct snd_soc_codec *codec = mbhc->codec; - bool micbias2 = false; - bool micbias1 = false; - - pr_debug("%s: event %s (%d)\n", __func__, - wcd_mbhc_get_event_string(event), event); - if (mbhc->mbhc_cb->micbias_enable_status) { - micbias2 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_2); - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - } - switch (event) { - /* MICBIAS usage change */ - case WCD_EVENT_POST_DAPM_MICBIAS_2_ON: - mbhc->is_hs_recording = true; - pr_debug("%s: is_capture: %d\n", __func__, - mbhc->is_hs_recording); - break; - case WCD_EVENT_POST_MICBIAS_2_ON: - if (!mbhc->micbias_enable) - goto out_micb_en; - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) { - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - true); - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_SET_VAL, - true); - /* - * Special headset needs MICBIAS as 2.7V so wait for - * 50 msec for the MICBIAS to reach 2.7 volts. - */ - msleep(50); - } - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, true); - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_PRECHARGE, - false); -out_micb_en: - /* Disable current source if micbias enabled */ - if (!mbhc->mbhc_cb->mbhc_micbias_control) { - mbhc->is_hs_recording = true; - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - } - /* configure cap settings properly when micbias is enabled */ - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, true); - break; - case WCD_EVENT_PRE_MICBIAS_2_OFF: - break; - /* MICBIAS usage change */ - case WCD_EVENT_POST_DAPM_MICBIAS_2_OFF: - mbhc->is_hs_recording = false; - pr_debug("%s: is_capture: %d\n", __func__, - mbhc->is_hs_recording); - break; - case WCD_EVENT_POST_MICBIAS_2_OFF: - if (!mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->is_hs_recording = false; - if (mbhc->micbias_enable) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - break; - } - - if (mbhc->mbhc_cb->set_auto_zeroing) - mbhc->mbhc_cb->set_auto_zeroing(codec, false); - if (mbhc->mbhc_cb->set_micbias_value && !mbhc->micbias_enable) - mbhc->mbhc_cb->set_micbias_value(codec); - /* Enable PULL UP if PA's are enabled */ - if ((test_bit(WCD_MBHC_EVENT_PA_HPHL, &mbhc->event_state)) || - (test_bit(WCD_MBHC_EVENT_PA_HPHR, - &mbhc->event_state))) - /* enable pullup and cs, disable mb */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); - else - /* enable current source and disable mb, pullup*/ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - - /* configure cap settings properly when micbias is disabled */ - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); - break; - case WCD_EVENT_PRE_HPHL_PA_OFF: - mutex_lock(&mbhc->hphl_pa_lock); - break; - case WCD_EVENT_POST_HPHL_PA_OFF: - clear_bit(WCD_MBHC_HPHL_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - if (mbhc->hph_status & SND_JACK_OC_HPHL) - hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); - clear_bit(WCD_MBHC_EVENT_PA_HPHL, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - mutex_unlock(&mbhc->hphl_pa_lock); - clear_bit(WCD_MBHC_ANC0_OFF_ACK, &mbhc->hph_anc_state); - break; - case WCD_EVENT_PRE_HPHR_PA_OFF: - mutex_lock(&mbhc->hphr_pa_lock); - break; - case WCD_EVENT_POST_HPHR_PA_OFF: - clear_bit(WCD_MBHC_HPHR_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - if (mbhc->hph_status & SND_JACK_OC_HPHR) - hphrocp_off_report(mbhc, SND_JACK_OC_HPHR); - clear_bit(WCD_MBHC_EVENT_PA_HPHR, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); - mutex_unlock(&mbhc->hphr_pa_lock); - clear_bit(WCD_MBHC_ANC1_OFF_ACK, &mbhc->hph_anc_state); - break; - case WCD_EVENT_PRE_HPHL_PA_ON: - set_bit(WCD_MBHC_EVENT_PA_HPHL, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, enable pullup & cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); - break; - case WCD_EVENT_PRE_HPHR_PA_ON: - set_bit(WCD_MBHC_EVENT_PA_HPHR, &mbhc->event_state); - /* check if micbias is enabled */ - if (micbias2) - /* Disable cs, pullup & enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - else - /* Disable micbias, enable pullup & cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); - break; - case WCD_EVENT_OCP_OFF: - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - false); - break; - case WCD_EVENT_OCP_ON: - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - true); - break; - default: - break; - } - return 0; -} - -int wcd_cancel_btn_work(struct wcd_mbhc *mbhc) -{ - int r; - - r = cancel_delayed_work_sync(&mbhc->mbhc_btn_dwork); - /* - * if scheduled mbhc.mbhc_btn_dwork is canceled from here, - * we have to unlock from here instead btn_work - */ - if (r) - mbhc->mbhc_cb->lock_sleep(mbhc, false); - return r; -} -EXPORT_SYMBOL(wcd_cancel_btn_work); - -bool wcd_swch_level_remove(struct wcd_mbhc *mbhc) -{ - u16 result2 = 0; - - WCD_MBHC_REG_READ(WCD_MBHC_SWCH_LEVEL_REMOVE, result2); - return (result2) ? true : false; -} -EXPORT_SYMBOL(wcd_swch_level_remove); - -static void wcd_mbhc_clr_and_turnon_hph_padac(struct wcd_mbhc *mbhc) -{ - bool pa_turned_on = false; - u8 wg_time = 0; - - WCD_MBHC_REG_READ(WCD_MBHC_HPH_CNP_WG_TIME, wg_time); - wg_time += 1; - - mutex_lock(&mbhc->hphr_pa_lock); - if (test_and_clear_bit(WCD_MBHC_HPHR_PA_OFF_ACK, - &mbhc->hph_pa_dac_state)) { - pr_debug("%s: HPHR clear flag and enable PA\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_PA_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_OCP_DET_EN, 1); - pa_turned_on = true; - } - mutex_unlock(&mbhc->hphr_pa_lock); - mutex_lock(&mbhc->hphl_pa_lock); - if (test_and_clear_bit(WCD_MBHC_HPHL_PA_OFF_ACK, - &mbhc->hph_pa_dac_state)) { - pr_debug("%s: HPHL clear flag and enable PA\n", __func__); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_OCP_DET_EN, 1); - pa_turned_on = true; - } - mutex_unlock(&mbhc->hphl_pa_lock); - - if (pa_turned_on) { - pr_debug("%s: PA was turned on by MBHC and not by DAPM\n", - __func__); - usleep_range(wg_time * 1000, wg_time * 1000 + 50); - } - - if (test_and_clear_bit(WCD_MBHC_ANC0_OFF_ACK, - &mbhc->hph_anc_state)) { - usleep_range(20000, 20100); - pr_debug("%s: HPHL ANC clear flag and enable ANC_EN\n", - __func__); - if (mbhc->mbhc_cb->update_anc_state) - mbhc->mbhc_cb->update_anc_state(mbhc->codec, true, 0); - } - - if (test_and_clear_bit(WCD_MBHC_ANC1_OFF_ACK, - &mbhc->hph_anc_state)) { - usleep_range(20000, 20100); - pr_debug("%s: HPHR ANC clear flag and enable ANC_EN\n", - __func__); - if (mbhc->mbhc_cb->update_anc_state) - mbhc->mbhc_cb->update_anc_state(mbhc->codec, true, 1); - } - -} - -static bool wcd_mbhc_is_hph_pa_on(struct wcd_mbhc *mbhc) -{ - bool hph_pa_on = false; - - WCD_MBHC_REG_READ(WCD_MBHC_HPH_PA_EN, hph_pa_on); - - return (hph_pa_on) ? true : false; -} - -static void wcd_mbhc_set_and_turnoff_hph_padac(struct wcd_mbhc *mbhc) -{ - u8 wg_time = 0; - - WCD_MBHC_REG_READ(WCD_MBHC_HPH_CNP_WG_TIME, wg_time); - wg_time += 1; - - /* If headphone PA is on, check if userspace receives - * removal event to sync-up PA's state - */ - if (wcd_mbhc_is_hph_pa_on(mbhc)) { - pr_debug("%s PA is on, setting PA_OFF_ACK\n", __func__); - set_bit(WCD_MBHC_HPHL_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - set_bit(WCD_MBHC_HPHR_PA_OFF_ACK, &mbhc->hph_pa_dac_state); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_OCP_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_OCP_DET_EN, 0); - } else { - pr_debug("%s PA is off\n", __func__); - } - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 0); - usleep_range(wg_time * 1000, wg_time * 1000 + 50); - - - if (mbhc->mbhc_cb->is_anc_on && mbhc->mbhc_cb->is_anc_on(mbhc)) { - usleep_range(20000, 20100); - pr_debug("%s ANC is on, setting ANC_OFF_ACK\n", __func__); - set_bit(WCD_MBHC_ANC0_OFF_ACK, &mbhc->hph_anc_state); - set_bit(WCD_MBHC_ANC1_OFF_ACK, &mbhc->hph_anc_state); - if (mbhc->mbhc_cb->update_anc_state) { - mbhc->mbhc_cb->update_anc_state(mbhc->codec, false, 0); - mbhc->mbhc_cb->update_anc_state(mbhc->codec, false, 1); - } else { - pr_debug("%s ANC is off\n", __func__); - } - } -} - -int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - *zl = mbhc->zl; - *zr = mbhc->zr; - - if (*zl && *zr) - return 0; - else - return -EINVAL; -} -EXPORT_SYMBOL(wcd_mbhc_get_impedance); - -void wcd_mbhc_hs_elec_irq(struct wcd_mbhc *mbhc, int irq_type, - bool enable) -{ - int irq; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (irq_type == WCD_MBHC_ELEC_HS_INS) - irq = mbhc->intr_ids->mbhc_hs_ins_intr; - else if (irq_type == WCD_MBHC_ELEC_HS_REM) - irq = mbhc->intr_ids->mbhc_hs_rem_intr; - else { - pr_debug("%s: irq_type: %d, enable: %d\n", - __func__, irq_type, enable); - return; - } - - pr_debug("%s: irq: %d, enable: %d, intr_status:%lu\n", - __func__, irq, enable, mbhc->intr_status); - if ((test_bit(irq_type, &mbhc->intr_status)) != enable) { - mbhc->mbhc_cb->irq_control(mbhc->codec, irq, enable); - if (enable) - set_bit(irq_type, &mbhc->intr_status); - else - clear_bit(irq_type, &mbhc->intr_status); - } -} -EXPORT_SYMBOL(wcd_mbhc_hs_elec_irq); - -void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, - enum snd_jack_types jack_type) -{ - struct snd_soc_codec *codec = mbhc->codec; - bool is_pa_on = false; - u8 fsm_en = 0; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - pr_debug("%s: enter insertion %d hph_status %x\n", - __func__, insertion, mbhc->hph_status); - if (!insertion) { - /* Report removal */ - mbhc->hph_status &= ~jack_type; - /* - * cancel possibly scheduled btn work and - * report release if we reported button press - */ - if (wcd_cancel_btn_work(mbhc)) { - pr_debug("%s: button press is canceled\n", __func__); - } else if (mbhc->buttons_pressed) { - pr_debug("%s: release of button press%d\n", - __func__, jack_type); - wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, 0, - mbhc->buttons_pressed); - mbhc->buttons_pressed &= - ~WCD_MBHC_JACK_BUTTON_MASK; - } - - if (mbhc->micbias_enable) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(codec); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - - mbhc->hph_type = WCD_MBHC_HPH_NONE; - mbhc->zl = mbhc->zr = 0; - pr_debug("%s: Reporting removal %d(%x)\n", __func__, - jack_type, mbhc->hph_status); - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, WCD_MBHC_JACK_MASK); - wcd_mbhc_set_and_turnoff_hph_padac(mbhc); - hphrocp_off_report(mbhc, SND_JACK_OC_HPHR); - hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); - mbhc->current_plug = MBHC_PLUG_TYPE_NONE; - mbhc->force_linein = false; - } else { - /* - * Report removal of current jack type. - * Headphone to headset shouldn't report headphone - * removal. - */ - if (mbhc->mbhc_cfg->detect_extn_cable && - (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH || - jack_type == SND_JACK_LINEOUT) && - (mbhc->hph_status && mbhc->hph_status != jack_type)) { - - if (mbhc->micbias_enable && - mbhc->hph_status == SND_JACK_HEADSET) { - if (mbhc->mbhc_cb->mbhc_micbias_control) - mbhc->mbhc_cb->mbhc_micbias_control( - codec, MIC_BIAS_2, - MICB_DISABLE); - if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) - mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - codec, - MIC_BIAS_2, false); - if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value( - codec); - WCD_MBHC_REG_UPDATE_BITS( - WCD_MBHC_MICB_CTRL, 0); - } - mbhc->micbias_enable = false; - } - mbhc->hph_type = WCD_MBHC_HPH_NONE; - mbhc->zl = mbhc->zr = 0; - pr_debug("%s: Reporting removal (%x)\n", - __func__, mbhc->hph_status); - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - 0, WCD_MBHC_JACK_MASK); - - if (mbhc->hph_status == SND_JACK_LINEOUT) { - - pr_debug("%s: Enable micbias\n", __func__); - /* Disable current source and enable micbias */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); - pr_debug("%s: set up elec removal detection\n", - __func__); - usleep_range(200, 210); - wcd_mbhc_hs_elec_irq(mbhc, - WCD_MBHC_ELEC_HS_REM, - true); - } - mbhc->hph_status &= ~(SND_JACK_HEADSET | - SND_JACK_LINEOUT | - SND_JACK_ANC_HEADPHONE | - SND_JACK_UNSUPPORTED); - } - - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET && - jack_type == SND_JACK_HEADPHONE) - mbhc->hph_status &= ~SND_JACK_HEADSET; - - /* Report insertion */ - if (jack_type == SND_JACK_HEADPHONE) - mbhc->current_plug = MBHC_PLUG_TYPE_HEADPHONE; - else if (jack_type == SND_JACK_UNSUPPORTED) - mbhc->current_plug = MBHC_PLUG_TYPE_GND_MIC_SWAP; - else if (jack_type == SND_JACK_HEADSET) { - mbhc->current_plug = MBHC_PLUG_TYPE_HEADSET; - mbhc->jiffies_atreport = jiffies; - } else if (jack_type == SND_JACK_LINEOUT) { - mbhc->current_plug = MBHC_PLUG_TYPE_HIGH_HPH; - } else if (jack_type == SND_JACK_ANC_HEADPHONE) - mbhc->current_plug = MBHC_PLUG_TYPE_ANC_HEADPHONE; - - if (mbhc->mbhc_cb->hph_pa_on_status) - is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(codec); - - if (mbhc->impedance_detect && - mbhc->mbhc_cb->compute_impedance && - (mbhc->mbhc_cfg->linein_th != 0) && - (!is_pa_on)) { - /* Set MUX_CTL to AUTO for Z-det */ - WCD_MBHC_REG_READ(WCD_MBHC_FSM_EN, fsm_en); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MUX_CTL, - MUX_CTL_AUTO); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 1); - mbhc->mbhc_cb->compute_impedance(mbhc, - &mbhc->zl, &mbhc->zr); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, - fsm_en); - if ((mbhc->zl > mbhc->mbhc_cfg->linein_th && - mbhc->zl < MAX_IMPED) && - (mbhc->zr > mbhc->mbhc_cfg->linein_th && - mbhc->zr < MAX_IMPED) && - (jack_type == SND_JACK_HEADPHONE)) { - jack_type = SND_JACK_LINEOUT; - mbhc->force_linein = true; - mbhc->current_plug = MBHC_PLUG_TYPE_HIGH_HPH; - if (mbhc->hph_status) { - mbhc->hph_status &= ~(SND_JACK_HEADSET | - SND_JACK_LINEOUT | - SND_JACK_UNSUPPORTED); - wcd_mbhc_jack_report(mbhc, - &mbhc->headset_jack, - mbhc->hph_status, - WCD_MBHC_JACK_MASK); - } - pr_debug("%s: Marking jack type as SND_JACK_LINEOUT\n", - __func__); - } - } - - /* Do not calculate impedance again for lineout - * as during playback pa is on and impedance values - * will not be correct resulting in lineout detected - * as headphone. - */ - if ((is_pa_on) && mbhc->force_linein == true) { - jack_type = SND_JACK_LINEOUT; - mbhc->current_plug = MBHC_PLUG_TYPE_HIGH_HPH; - if (mbhc->hph_status) { - mbhc->hph_status &= ~(SND_JACK_HEADSET | - SND_JACK_LINEOUT | - SND_JACK_UNSUPPORTED); - wcd_mbhc_jack_report(mbhc, - &mbhc->headset_jack, - mbhc->hph_status, - WCD_MBHC_JACK_MASK); - } - } - - mbhc->hph_status |= jack_type; - - pr_debug("%s: Reporting insertion %d(%x)\n", __func__, - jack_type, mbhc->hph_status); - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - (mbhc->hph_status | SND_JACK_MECHANICAL), - WCD_MBHC_JACK_MASK); - wcd_mbhc_clr_and_turnon_hph_padac(mbhc); - } - pr_debug("%s: leave hph_status %x\n", __func__, mbhc->hph_status); -} -EXPORT_SYMBOL(wcd_mbhc_report_plug); - -void wcd_mbhc_elec_hs_report_unplug(struct wcd_mbhc *mbhc) -{ - /* cancel pending button press */ - if (wcd_cancel_btn_work(mbhc)) - pr_debug("%s: button press is canceled\n", __func__); - /* cancel correct work function */ - if (mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) - mbhc->mbhc_fn->wcd_cancel_hs_detect_plug(mbhc, - &mbhc->correct_plug_swch); - else - pr_info("%s: hs_detect_plug work not cancelled\n", __func__); - - pr_debug("%s: Report extension cable\n", __func__); - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - /* - * If PA is enabled HPHL schmitt trigger can - * be unreliable, make sure to disable it - */ - if (test_bit(WCD_MBHC_EVENT_PA_HPHL, - &mbhc->event_state)) - wcd_mbhc_set_and_turnoff_hph_padac(mbhc); - /* - * Disable HPHL trigger and MIC Schmitt triggers. - * Setup for insertion detection. - */ - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, - false); - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_NONE); - /* Disable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 3); - - /* Set the detection type appropriately */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 1); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - true); -} -EXPORT_SYMBOL(wcd_mbhc_elec_hs_report_unplug); - -void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type) -{ - bool anc_mic_found = false; - enum snd_jack_types jack_type; - - if (mbhc->deinit_in_progress) { - pr_info("%s: mbhc deinit in progess: ignore report\n", __func__); - return; - } - - pr_debug("%s: enter current_plug(%d) new_plug(%d)\n", - __func__, mbhc->current_plug, plug_type); - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (mbhc->current_plug == plug_type) { - pr_debug("%s: cable already reported, exit\n", __func__); - goto exit; - } - - if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - /* - * Nothing was reported previously - * report a headphone or unsupported - */ - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); - - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_HEADPHONE); - } else if (plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP) { - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE); - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_UNSUPPORTED); - } else if (plug_type == MBHC_PLUG_TYPE_HEADSET) { - if (mbhc->mbhc_cfg->enable_anc_mic_detect && - mbhc->mbhc_fn->wcd_mbhc_detect_anc_plug_type) - anc_mic_found = - mbhc->mbhc_fn->wcd_mbhc_detect_anc_plug_type(mbhc); - jack_type = SND_JACK_HEADSET; - if (anc_mic_found) - jack_type = SND_JACK_ANC_HEADPHONE; - - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) - wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE); - - /* - * If Headphone was reported previously, this will - * only report the mic line - */ - wcd_mbhc_report_plug(mbhc, 1, jack_type); - } else if (plug_type == MBHC_PLUG_TYPE_HIGH_HPH) { - if (mbhc->mbhc_cfg->detect_extn_cable) { - /* High impedance device found. Report as LINEOUT */ - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - pr_debug("%s: setup mic trigger for further detection\n", - __func__); - - /* Disable HW FSM and current source */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - MIC_BIAS_2, MICB_PULLUP_DISABLE); - /* Setup for insertion detection */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, - 1); - /* - * Enable HPHL trigger and MIC Schmitt triggers - * and request for elec insertion interrupts - */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, - 3); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, - true); - } else { - wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - } - } else { - WARN(1, "Unexpected current plug_type %d, plug_type %d\n", - mbhc->current_plug, plug_type); - } -exit: - pr_debug("%s: leave\n", __func__); -} -EXPORT_SYMBOL(wcd_mbhc_find_plug_and_report); - -static bool wcd_mbhc_moisture_detect(struct wcd_mbhc *mbhc, bool detection_type) -{ - bool ret = false; - - if (!mbhc->mbhc_cfg->moisture_en || - !mbhc->mbhc_cfg->moisture_duty_cycle_en) - return ret; - - if (!mbhc->mbhc_cb->mbhc_get_moisture_status || - !mbhc->mbhc_cb->mbhc_moisture_polling_ctrl || - !mbhc->mbhc_cb->mbhc_moisture_detect_en) - return ret; - - if (mbhc->mbhc_cb->mbhc_get_moisture_status(mbhc)) { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_GND_DET_EN, 0); - mbhc->mbhc_cb->mbhc_moisture_polling_ctrl(mbhc, true); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, - detection_type); - ret = true; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_GND_DET_EN, 1); - } else { - mbhc->mbhc_cb->mbhc_moisture_polling_ctrl(mbhc, false); - mbhc->mbhc_cb->mbhc_moisture_detect_en(mbhc, false); - } - - return ret; -} - -static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) -{ - bool detection_type = 0; - bool micbias1 = false; - struct snd_soc_codec *codec = mbhc->codec; - enum snd_jack_types jack_type; - struct usbc_ana_audio_config *config = - &mbhc->mbhc_cfg->usbc_analog_cfg; - - dev_dbg(codec->dev, "%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - mbhc->in_swch_irq_handler = true; - - /* cancel pending button press */ - if (wcd_cancel_btn_work(mbhc)) - pr_debug("%s: button press is canceled\n", __func__); - - WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type); - - /* Set the detection type appropriately */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, - !detection_type); - - pr_debug("%s: mbhc->current_plug: %d detection_type: %d\n", __func__, - mbhc->current_plug, detection_type); - if (mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) - mbhc->mbhc_fn->wcd_cancel_hs_detect_plug(mbhc, - &mbhc->correct_plug_swch); - else - pr_info("%s: hs_detect_plug work not cancelled\n", __func__); - - if (mbhc->mbhc_cb->micbias_enable_status) - micbias1 = mbhc->mbhc_cb->micbias_enable_status(mbhc, - MIC_BIAS_1); - - if ((mbhc->current_plug == MBHC_PLUG_TYPE_NONE) && - detection_type) { - - /* If moisture is present, then enable polling, disable - * moisture detection and wait for interrupt - */ - if (wcd_mbhc_moisture_detect(mbhc, detection_type)) - goto done; - - /* Make sure MASTER_BIAS_CTL is enabled */ - mbhc->mbhc_cb->mbhc_bias(codec, true); - - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_TAIL_CURR, true); - - if (!mbhc->mbhc_cfg->hs_ext_micbias && - mbhc->mbhc_cb->micb_internal) - /* - * Enable Tx2 RBias if the headset - * is using internal micbias - */ - mbhc->mbhc_cb->micb_internal(codec, 1, true); - - /* Remove micbias pulldown */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_PULLDOWN_CTRL, 0); - /* Apply trim if needed on the device */ - if (mbhc->mbhc_cb->trim_btn_reg) - mbhc->mbhc_cb->trim_btn_reg(codec); - /* Enable external voltage source to micbias if present */ - if (mbhc->mbhc_cb->enable_mb_source) - mbhc->mbhc_cb->enable_mb_source(mbhc, true); - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - if (mbhc->mbhc_fn) - mbhc->mbhc_fn->wcd_mbhc_detect_plug_type(mbhc); - } else if ((mbhc->current_plug != MBHC_PLUG_TYPE_NONE) - && !detection_type) { - /* Disable external voltage source to micbias if present */ - if (mbhc->mbhc_cb->enable_mb_source) - mbhc->mbhc_cb->enable_mb_source(mbhc, false); - /* Disable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->mbhc_cb->mbhc_micbias_control(mbhc->codec, - MIC_BIAS_2, MICB_PULLUP_DISABLE); - if (mbhc->mbhc_cb->mbhc_common_micb_ctrl) - mbhc->mbhc_cb->mbhc_common_micb_ctrl(codec, - MBHC_COMMON_MICB_TAIL_CURR, false); - - if (mbhc->mbhc_cb->set_cap_mode) - mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); - - mbhc->btn_press_intr = false; - mbhc->is_btn_press = false; - switch (mbhc->current_plug) { - case MBHC_PLUG_TYPE_HEADPHONE: - jack_type = SND_JACK_HEADPHONE; - break; - case MBHC_PLUG_TYPE_GND_MIC_SWAP: - jack_type = SND_JACK_UNSUPPORTED; - break; - case MBHC_PLUG_TYPE_HEADSET: - /* make sure to turn off Rbias */ - if (mbhc->mbhc_cb->micb_internal) - mbhc->mbhc_cb->micb_internal(codec, 1, false); - /* Pulldown micbias */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_PULLDOWN_CTRL, 1); - jack_type = SND_JACK_HEADSET; - break; - case MBHC_PLUG_TYPE_HIGH_HPH: - if (mbhc->mbhc_detection_logic == WCD_DETECTION_ADC) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_ISRC_EN, 0); - mbhc->is_extn_cable = false; - jack_type = SND_JACK_LINEOUT; - break; - case MBHC_PLUG_TYPE_ANC_HEADPHONE: - jack_type = SND_JACK_ANC_HEADPHONE; - break; - default: - pr_info("%s: Invalid current plug: %d\n", - __func__, mbhc->current_plug); - jack_type = SND_JACK_UNSUPPORTED; - break; - } - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); - wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 1); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); - mbhc->extn_cable_hph_rem = false; - - if (config->usbc_en1_gpio_p) { - msm_cdc_pinctrl_select_sleep_state(config->usbc_en1_gpio_p); - pr_info("wcd_mbhc_swch_irq_handler: switch L/R to usb \n"); - } - - wcd_mbhc_report_plug(mbhc, 0, jack_type); - - if (mbhc->mbhc_cfg->enable_usbc_analog) { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - if (mbhc->mbhc_cb->clk_setup) - mbhc->mbhc_cb->clk_setup(mbhc->codec, false); - } - - if (mbhc->mbhc_cfg->moisture_en && - mbhc->mbhc_cfg->moisture_duty_cycle_en) { - if (mbhc->mbhc_cb->mbhc_moisture_polling_ctrl) - mbhc->mbhc_cb->mbhc_moisture_polling_ctrl(mbhc, - false); - if (mbhc->mbhc_cb->mbhc_moisture_detect_en) - mbhc->mbhc_cb->mbhc_moisture_detect_en(mbhc, - false); - } - - } else if (!detection_type) { - /* Disable external voltage source to micbias if present */ - if (mbhc->mbhc_cb->enable_mb_source) - mbhc->mbhc_cb->enable_mb_source(mbhc, false); - /* Disable HW FSM */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); - mbhc->extn_cable_hph_rem = false; - } - -done: - mbhc->in_swch_irq_handler = false; - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); -} - -static irqreturn_t wcd_mbhc_mech_plug_detect_irq(int irq, void *data) -{ - int r = IRQ_HANDLED; - struct wcd_mbhc *mbhc = data; - - pr_debug("%s: enter\n", __func__); - if (mbhc == NULL) { - pr_err("%s: NULL irq data\n", __func__); - return IRQ_NONE; - } - if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) { - pr_warn("%s: failed to hold suspend\n", __func__); - r = IRQ_NONE; - } else { - /* Call handler */ - wcd_mbhc_swch_irq_handler(mbhc); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } - pr_debug("%s: leave %d\n", __func__, r); - return r; -} - -int wcd_mbhc_get_button_mask(struct wcd_mbhc *mbhc) -{ - int mask = 0; - int btn; - - btn = mbhc->mbhc_cb->map_btn_code_to_num(mbhc->codec); - - switch (btn) { - case 0: - mask = SND_JACK_BTN_0; - pr_debug("%s() button is 0x%x[hook]", __func__, mask); - break; - case 1: - mask = SND_JACK_BTN_1; - pr_debug("%s() button is 0x%x[volume up]", __func__, mask); - break; - case 2: - mask = SND_JACK_BTN_2; - pr_debug("%s() button is 0x%x[volume down]", __func__, mask); - break; - case 3: - mask = SND_JACK_BTN_3; - pr_debug("%s() button is 0x%x", __func__, mask); - break; - case 4: - mask = SND_JACK_BTN_4; - pr_debug("%s() button is 0x%x", __func__, mask); - break; - case 5: - mask = SND_JACK_BTN_5; - pr_debug("%s() button is 0x%x", __func__, mask); - break; - default: - break; - } - - return mask; -} -EXPORT_SYMBOL(wcd_mbhc_get_button_mask); - -static void wcd_btn_lpress_fn(struct work_struct *work) -{ - struct delayed_work *dwork; - struct wcd_mbhc *mbhc; - s16 btn_result = 0; - - pr_debug("%s: Enter\n", __func__); - - dwork = to_delayed_work(work); - mbhc = container_of(dwork, struct wcd_mbhc, mbhc_btn_dwork); - - WCD_MBHC_REG_READ(WCD_MBHC_BTN_RESULT, btn_result); - if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) { - pr_debug("%s: Reporting long button press event, btn_result: %d\n", - __func__, btn_result); - wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, - mbhc->buttons_pressed, mbhc->buttons_pressed); - } - pr_debug("%s: leave\n", __func__); - mbhc->mbhc_cb->lock_sleep(mbhc, false); -} - -static bool wcd_mbhc_fw_validate(const void *data, size_t size) -{ - u32 cfg_offset; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - struct firmware_cal fw; - - fw.data = (void *)data; - fw.size = size; - - if (fw.size < WCD_MBHC_CAL_MIN_SIZE) - return false; - - /* - * Previous check guarantees that there is enough fw data up - * to num_btn - */ - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(fw.data); - cfg_offset = (u32) ((void *) btn_cfg - (void *) fw.data); - if (fw.size < (cfg_offset + WCD_MBHC_CAL_BTN_SZ(btn_cfg))) - return false; - - return true; -} - -static irqreturn_t wcd_mbhc_btn_press_handler(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - int mask; - unsigned long msec_val; - - pr_debug("%s: enter\n", __func__); - complete(&mbhc->btn_press_compl); - WCD_MBHC_RSC_LOCK(mbhc); - wcd_cancel_btn_work(mbhc); - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto done; - } - - mbhc->is_btn_press = true; - msec_val = jiffies_to_msecs(jiffies - mbhc->jiffies_atreport); - pr_debug("%s: msec_val = %ld\n", __func__, msec_val); - if (msec_val < MBHC_BUTTON_PRESS_THRESHOLD_MIN) { - pr_debug("%s: Too short, ignore button press\n", __func__); - goto done; - } - - /* If switch interrupt already kicked in, ignore button press */ - if (mbhc->in_swch_irq_handler) { - pr_debug("%s: Swtich level changed, ignore button press\n", - __func__); - goto done; - } - mask = wcd_mbhc_get_button_mask(mbhc); - if (mask == SND_JACK_BTN_0) - mbhc->btn_press_intr = true; - - if (mbhc->current_plug != MBHC_PLUG_TYPE_HEADSET) { - pr_debug("%s: Plug isn't headset, ignore button press\n", - __func__); - goto done; - } - mbhc->buttons_pressed |= mask; - mbhc->mbhc_cb->lock_sleep(mbhc, true); - if (schedule_delayed_work(&mbhc->mbhc_btn_dwork, - msecs_to_jiffies(400)) == 0) { - WARN(1, "Button pressed twice without release event\n"); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - } -done: - pr_debug("%s: leave\n", __func__); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - int ret; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - if (wcd_swch_level_remove(mbhc)) { - pr_debug("%s: Switch level is low ", __func__); - goto exit; - } - - if (mbhc->is_btn_press) { - mbhc->is_btn_press = false; - } else { - pr_debug("%s: This release is for fake btn press\n", __func__); - goto exit; - } - - /* - * If current plug is headphone then there is no chance to - * get btn release interrupt, so connected cable should be - * headset not headphone. - * For ADC MBHC, ADC_COMPLETE interrupt will be generated - * in this case. So skip the check here. - */ - if (mbhc->mbhc_detection_logic == WCD_DETECTION_LEGACY && - mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_mbhc_find_plug_and_report(mbhc, MBHC_PLUG_TYPE_HEADSET); - goto exit; - - } - if (mbhc->buttons_pressed & WCD_MBHC_JACK_BUTTON_MASK) { - ret = wcd_cancel_btn_work(mbhc); - if (ret == 0) { - pr_debug("%s: Reporting long button release event\n", - __func__); - wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, - 0, mbhc->buttons_pressed); - } else { - if (mbhc->in_swch_irq_handler) { - pr_debug("%s: Switch irq kicked in, ignore\n", - __func__); - } else { - pr_debug("%s: Reporting btn press\n", - __func__); - wcd_mbhc_jack_report(mbhc, - &mbhc->button_jack, - mbhc->buttons_pressed, - mbhc->buttons_pressed); - pr_debug("%s: Reporting btn release\n", - __func__); - wcd_mbhc_jack_report(mbhc, - &mbhc->button_jack, - 0, mbhc->buttons_pressed); - } - } - mbhc->buttons_pressed &= ~WCD_MBHC_JACK_BUTTON_MASK; - } -exit: - pr_debug("%s: leave\n", __func__); - WCD_MBHC_RSC_UNLOCK(mbhc); - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_hphl_ocp_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - int val; - - pr_debug("%s: received HPHL OCP irq\n", __func__); - if (mbhc) { - if (mbhc->mbhc_cb->hph_register_recovery) { - if (mbhc->mbhc_cb->hph_register_recovery(mbhc)) { - WCD_MBHC_REG_READ(WCD_MBHC_HPHR_OCP_STATUS, - val); - if ((val != -EINVAL) && val) - mbhc->is_hph_ocp_pending = true; - goto done; - } - } - - if (mbhc->hphlocp_cnt < OCP_ATTEMPT) { - mbhc->hphlocp_cnt++; - pr_debug("%s: retry, hphlocp_cnt: %d\n", __func__, - mbhc->hphlocp_cnt); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 1); - } else { - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - false); - mbhc->hph_status |= SND_JACK_OC_HPHL; - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, - WCD_MBHC_JACK_MASK); - } - } else { - pr_err("%s: Bad wcd9xxx_spmi private data\n", __func__); - } -done: - return IRQ_HANDLED; -} - -static irqreturn_t wcd_mbhc_hphr_ocp_irq(int irq, void *data) -{ - struct wcd_mbhc *mbhc = data; - - pr_debug("%s: received HPHR OCP irq\n", __func__); - - if (!mbhc) { - pr_err("%s: Bad mbhc private data\n", __func__); - goto done; - } - - if (mbhc->is_hph_ocp_pending) { - mbhc->is_hph_ocp_pending = false; - goto done; - } - - if (mbhc->mbhc_cb->hph_register_recovery) { - if (mbhc->mbhc_cb->hph_register_recovery(mbhc)) - /* register corruption, hence reset registers */ - goto done; - } - if (mbhc->hphrocp_cnt < OCP_ATTEMPT) { - mbhc->hphrocp_cnt++; - pr_debug("%s: retry, hphrocp_cnt: %d\n", __func__, - mbhc->hphrocp_cnt); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 0); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_OCP_FSM_EN, 1); - } else { - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_right_ocp, - false); - mbhc->hph_status |= SND_JACK_OC_HPHR; - wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, - mbhc->hph_status, WCD_MBHC_JACK_MASK); - } -done: - return IRQ_HANDLED; -} - -static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) -{ - int ret = 0; - struct snd_soc_codec *codec = mbhc->codec; - - pr_debug("%s: enter\n", __func__); - WCD_MBHC_RSC_LOCK(mbhc); - - /* enable HS detection */ - if (mbhc->mbhc_cb->hph_pull_up_control_v2) - mbhc->mbhc_cb->hph_pull_up_control_v2(codec, - HS_PULLUP_I_DEFAULT); - else if (mbhc->mbhc_cb->hph_pull_up_control) - mbhc->mbhc_cb->hph_pull_up_control(codec, I_DEFAULT); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_L_DET_PULL_UP_CTRL, 3); - - if (mbhc->mbhc_cfg->moisture_en && mbhc->mbhc_cb->mbhc_moisture_config - && !mbhc->mbhc_cfg->moisture_duty_cycle_en) - mbhc->mbhc_cb->mbhc_moisture_config(mbhc); - - /* - * For USB analog we need to override the switch configuration. - * Also, disable hph_l pull-up current source as HS_DET_L is driven - * by an external source - */ - if (mbhc->mbhc_cfg->enable_usbc_analog) { - mbhc->hphl_swh = 0; - mbhc->gnd_swh = 0; - - if (mbhc->mbhc_cb->hph_pull_up_control_v2) - mbhc->mbhc_cb->hph_pull_up_control_v2(codec, - HS_PULLUP_I_OFF); - else if (mbhc->mbhc_cb->hph_pull_up_control) - mbhc->mbhc_cb->hph_pull_up_control(codec, I_OFF); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_L_DET_PULL_UP_CTRL, - 0); - } - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PLUG_TYPE, mbhc->hphl_swh); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_GND_PLUG_TYPE, mbhc->gnd_swh); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_SW_HPH_LP_100K_TO_GND, 1); - if (mbhc->mbhc_cfg->gnd_det_en && mbhc->mbhc_cb->mbhc_gnd_det_ctrl) - mbhc->mbhc_cb->mbhc_gnd_det_ctrl(codec, true); - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL, 1); - - /* - * Disable L_DET for USB-C analog audio to avoid spurious interrupts - * when a non-audio accessory is inserted. L_DET_EN sets to 1 when FSA - * I2C driver notifies that ANALOG_AUDIO_ADAPTER is inserted - */ - if (mbhc->mbhc_cfg->enable_usbc_analog) - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0); - else - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - - if (mbhc->mbhc_cfg->enable_usbc_analog) { - /* Insertion debounce set to 48ms */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_INSREM_DBNC, 4); - } else { - /* Insertion debounce set to 256ms */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_INSREM_DBNC, 9); - } - - /* Button Debounce set to 16ms */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_DBNC, 2); - - /* enable bias */ - mbhc->mbhc_cb->mbhc_bias(codec, true); - /* enable MBHC clock */ - if (mbhc->mbhc_cb->clk_setup) { - if (mbhc->mbhc_cfg->enable_usbc_analog) - mbhc->mbhc_cb->clk_setup(codec, false); - else - mbhc->mbhc_cb->clk_setup(codec, true); - } - - /* program HS_VREF value */ - wcd_program_hs_vref(mbhc); - - wcd_program_btn_threshold(mbhc, false); - - - reinit_completion(&mbhc->btn_press_compl); - - WCD_MBHC_RSC_UNLOCK(mbhc); - pr_debug("%s: leave\n", __func__); - return ret; -} - -static void wcd_mbhc_fw_read(struct work_struct *work) -{ - struct delayed_work *dwork; - struct wcd_mbhc *mbhc; - struct snd_soc_codec *codec; - const struct firmware *fw; - struct firmware_cal *fw_data = NULL; - int ret = -1, retry = 0; - bool use_default_cal = false; - - dwork = to_delayed_work(work); - mbhc = container_of(dwork, struct wcd_mbhc, mbhc_firmware_dwork); - codec = mbhc->codec; - - while (retry < FW_READ_ATTEMPTS) { - retry++; - pr_debug("%s:Attempt %d to request MBHC firmware\n", - __func__, retry); - if (mbhc->mbhc_cb->get_hwdep_fw_cal) - fw_data = mbhc->mbhc_cb->get_hwdep_fw_cal(mbhc, - WCD9XXX_MBHC_CAL); - if (!fw_data) - ret = request_firmware(&fw, "wcd9320/wcd9320_mbhc.bin", - codec->dev); - /* - * if request_firmware and hwdep cal both fail then - * sleep for 4sec for the userspace to send data to kernel - * retry for few times before bailing out - */ - if ((ret != 0) && !fw_data) { - usleep_range(FW_READ_TIMEOUT, FW_READ_TIMEOUT + - WCD_MBHC_USLEEP_RANGE_MARGIN_US); - } else { - pr_debug("%s: MBHC Firmware read successful\n", - __func__); - break; - } - } - if (!fw_data) - pr_debug("%s: using request_firmware\n", __func__); - else - pr_debug("%s: using hwdep cal\n", __func__); - - if (ret != 0 && !fw_data) { - pr_err("%s: Cannot load MBHC firmware use default cal\n", - __func__); - use_default_cal = true; - } - if (!use_default_cal) { - const void *data; - size_t size; - - if (fw_data) { - data = fw_data->data; - size = fw_data->size; - } else { - data = fw->data; - size = fw->size; - } - if (wcd_mbhc_fw_validate(data, size) == false) { - pr_err("%s: Invalid MBHC cal data size use default cal\n", - __func__); - if (!fw_data) - release_firmware(fw); - } else { - if (fw_data) { - mbhc->mbhc_cfg->calibration = - (void *)fw_data->data; - mbhc->mbhc_cal = fw_data; - } else { - mbhc->mbhc_cfg->calibration = - (void *)fw->data; - mbhc->mbhc_fw = fw; - } - } - - } - - (void) wcd_mbhc_initialise(mbhc); -} - -static int wcd_mbhc_set_keycode(struct wcd_mbhc *mbhc) -{ - enum snd_jack_types type; - int i, ret, result = 0; - int *btn_key_code; - - btn_key_code = mbhc->mbhc_cfg->key_code; - - for (i = 0 ; i < WCD_MBHC_KEYCODE_NUM ; i++) { - if (btn_key_code[i] != 0) { - switch (i) { - case 0: - type = SND_JACK_BTN_0; - break; - case 1: - type = SND_JACK_BTN_1; - break; - case 2: - type = SND_JACK_BTN_2; - break; - case 3: - type = SND_JACK_BTN_3; - break; - case 4: - type = SND_JACK_BTN_4; - break; - case 5: - type = SND_JACK_BTN_5; - break; - default: - WARN_ONCE(1, "Wrong button number:%d\n", i); - result = -1; - return result; - } - ret = snd_jack_set_key(mbhc->button_jack.jack, - type, - btn_key_code[i]); - if (ret) { - pr_err("%s: Failed to set code for %d\n", - __func__, btn_key_code[i]); - result = -1; - return result; - } - input_set_capability( - mbhc->button_jack.jack->input_dev, - EV_KEY, btn_key_code[i]); - pr_debug("%s: set btn%d key code:%d\n", __func__, - i, btn_key_code[i]); - } - } - if (btn_key_code[0]) - mbhc->is_btn_already_regd = true; - return result; -} - -static int wcd_mbhc_usb_c_analog_setup_gpios(struct wcd_mbhc *mbhc, - bool active) -{ - int rc = 0; - struct usbc_ana_audio_config *config = - &mbhc->mbhc_cfg->usbc_analog_cfg; - - dev_dbg(mbhc->codec->dev, "%s: setting GPIOs active = %d\n", - __func__, active); - - if (active) { - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MIC_CLAMP_CTL, 2); - mbhc->mbhc_cfg->enable_dual_adc_gpio(mbhc->mbhc_cfg->dual_adc_gpio_node, 0); -#ifdef CONFIG_AUDIO_UART_DEBUG - msm_cdc_pinctrl_select_active_state(config->uart_audio_switch_gpio_p); - dev_dbg(mbhc->codec->dev, "disable uart\n"); -#endif - if (config->usbc_en1_gpio_p) - rc = msm_cdc_pinctrl_select_active_state( - config->usbc_en1_gpio_p); - if (rc == 0 && config->usbc_force_gpio_p) - rc = msm_cdc_pinctrl_select_active_state( - config->usbc_force_gpio_p); - mbhc->usbc_mode = POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER; - - //enable MBHC detect - if (mbhc->mbhc_cb->clk_setup) - mbhc->mbhc_cb->clk_setup(mbhc->codec, true); - /* insertion detected, enable L_DET_EN */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - } else { - /* no delay is required when disabling GPIOs */ - if (config->usbc_en1_gpio_p) - msm_cdc_pinctrl_select_sleep_state( - config->usbc_en1_gpio_p); - if (config->usbc_force_gpio_p) - msm_cdc_pinctrl_select_sleep_state( - config->usbc_force_gpio_p); -#ifdef CONFIG_AUDIO_UART_DEBUG - msm_cdc_pinctrl_select_sleep_state(config->uart_audio_switch_gpio_p); - dev_dbg(mbhc->codec->dev, "enable uart\n"); -#endif - mbhc->mbhc_cfg->enable_dual_adc_gpio(mbhc->mbhc_cfg->dual_adc_gpio_node, 1); - - mbhc->usbc_mode = POWER_SUPPLY_TYPEC_NONE; - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MIC_CLAMP_CTL, 0); - if (mbhc->mbhc_cfg->swap_gnd_mic) - mbhc->mbhc_cfg->swap_gnd_mic(mbhc->codec, false); - } - - return rc; -} - -/* workqueue */ -static void wcd_mbhc_usbc_analog_work_fn(struct work_struct *work) -{ - struct wcd_mbhc *mbhc = - container_of(work, struct wcd_mbhc, usbc_analog_work); - - wcd_mbhc_usb_c_analog_setup_gpios(mbhc, - mbhc->usbc_mode != POWER_SUPPLY_TYPEC_NONE); -} - -/* this callback function is used to process PMI notification */ -static int wcd_mbhc_usb_c_event_changed(struct notifier_block *nb, - unsigned long evt, void *ptr) -{ - int ret; - union power_supply_propval mode; - struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, psy_nb); - struct snd_soc_codec *codec = mbhc->codec; - - if (ptr != mbhc->usb_psy || evt != PSY_EVENT_PROP_CHANGED) - return 0; - - ret = power_supply_get_property(mbhc->usb_psy, - POWER_SUPPLY_PROP_TYPEC_MODE, &mode); - if (ret) { - dev_err(codec->dev, "%s: Unable to read USB TYPEC_MODE: %d\n", - __func__, ret); - return ret; - } - - dev_dbg(codec->dev, "%s: USB change event received\n", - __func__); - dev_dbg(codec->dev, "%s: supply mode %d, expected %d\n", __func__, - mode.intval, POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER); - - switch (mode.intval) { - case POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER: - case POWER_SUPPLY_TYPEC_NONE: - dev_dbg(codec->dev, "%s: usbc_mode: %d; mode.intval: %d\n", - __func__, mbhc->usbc_mode, mode.intval); - - if (mbhc->usbc_mode == mode.intval) - break; /* filter notifications received before */ - mbhc->usbc_mode = mode.intval; - - dev_dbg(codec->dev, "%s: queueing usbc_analog_work\n", - __func__); - schedule_work(&mbhc->usbc_analog_work); - break; - default: - break; - } - return ret; -} - -/* PMI registration code */ -static int wcd_mbhc_usb_c_analog_init(struct wcd_mbhc *mbhc) -{ - int ret = 0; - struct snd_soc_codec *codec = mbhc->codec; - - dev_dbg(mbhc->codec->dev, "%s: usb-c analog setup start\n", __func__); - INIT_WORK(&mbhc->usbc_analog_work, wcd_mbhc_usbc_analog_work_fn); - - mbhc->usb_psy = power_supply_get_by_name("usb"); - if (IS_ERR_OR_NULL(mbhc->usb_psy)) { - dev_err(codec->dev, "%s: could not get USB psy info\n", - __func__); - ret = -EPROBE_DEFER; - if (IS_ERR(mbhc->usb_psy)) - ret = PTR_ERR(mbhc->usb_psy); - mbhc->usb_psy = NULL; - goto err; - } - - ret = wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); - if (ret) { - dev_err(codec->dev, "%s: error while setting USBC ana gpios\n", - __func__); - goto err; - } - -err: - return ret; -} - -static int wcd_mbhc_usb_c_analog_deinit(struct wcd_mbhc *mbhc) -{ - wcd_mbhc_usb_c_analog_setup_gpios(mbhc, false); - - /* deregister from PMI */ - power_supply_unreg_notifier(&mbhc->psy_nb); - - return 0; -} - -static int wcd_mbhc_init_gpio(struct wcd_mbhc *mbhc, - struct wcd_mbhc_config *mbhc_cfg, - const char *gpio_dt_str, - int *gpio, struct device_node **gpio_dn) -{ - int rc = 0; - struct snd_soc_codec *codec = mbhc->codec; - struct snd_soc_card *card = codec->component.card; - - dev_dbg(mbhc->codec->dev, "%s: gpio %s\n", __func__, gpio_dt_str); - - *gpio_dn = of_parse_phandle(card->dev->of_node, gpio_dt_str, 0); - - if (!(*gpio_dn)) { - *gpio = of_get_named_gpio(card->dev->of_node, gpio_dt_str, 0); - if (!gpio_is_valid(*gpio)) { - dev_err(card->dev, "%s, property %s not in node %s", - __func__, gpio_dt_str, - card->dev->of_node->full_name); - rc = -EINVAL; - } - } - - return rc; -} - -static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, - unsigned long mode, void *ptr) -{ - struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, fsa_nb); - - if (!mbhc) - return -EINVAL; - - dev_dbg(mbhc->codec->dev, "%s: mode = %lu\n", __func__, mode); - - if (mode == POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER) { - if (mbhc->mbhc_cb->clk_setup) - mbhc->mbhc_cb->clk_setup(mbhc->codec, true); - /* insertion detected, enable L_DET_EN */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - } - return 0; -} - -int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) -{ - int rc = 0; - struct usbc_ana_audio_config *config; - struct snd_soc_codec *codec; - struct snd_soc_card *card; - const char *usb_c_dt = "qcom,msm-mbhc-usbc-audio-supported"; - const char *fsa4476_dt = "qcom,fsa4476-gpio-support"; - - if (!mbhc || !mbhc_cfg) - return -EINVAL; - - config = &mbhc_cfg->usbc_analog_cfg; - codec = mbhc->codec; - card = codec->component.card; - - /* update the mbhc config */ - mbhc->mbhc_cfg = mbhc_cfg; - - dev_dbg(mbhc->codec->dev, "%s: enter\n", __func__); - - /* check if USB C analog is defined on device tree */ - mbhc_cfg->enable_usbc_analog = 0; - if (of_find_property(card->dev->of_node, usb_c_dt, NULL)) { - rc = of_property_read_u32(card->dev->of_node, usb_c_dt, - &mbhc_cfg->enable_usbc_analog); - } - if (mbhc_cfg->enable_usbc_analog == 0 || rc != 0) { - dev_dbg(card->dev, - "%s: %s in dt node is missing or false\n", - __func__, usb_c_dt); - dev_dbg(card->dev, - "%s: skipping USB c analog configuration\n", __func__); - } - - /* Parse fsa switch handle */ - if (mbhc_cfg->enable_usbc_analog) { - dev_dbg(mbhc->codec->dev, "%s: usbc analog enabled\n", - __func__); - mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD; - - mbhc_cfg->use_fsa4476_gpio = 0; - if (of_find_property(card->dev->of_node, fsa4476_dt, NULL)) { - rc = of_property_read_u32(card->dev->of_node, fsa4476_dt, - &mbhc_cfg->use_fsa4476_gpio); - if (rc != 0) { - dev_dbg(card->dev, - "%s: %s in dt node is missing or false\n", - __func__, fsa4476_dt); - } - } - - if (mbhc_cfg->use_fsa4476_gpio != 0) { - rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, - "qcom,usbc-analog-en1-gpio", - &config->usbc_en1_gpio, - &config->usbc_en1_gpio_p); - if (rc) - goto err; - - dev_dbg(mbhc->codec->dev, "%s: calling usb_c_analog_init\n", - __func__); - -#ifdef CONFIG_AUDIO_UART_DEBUG - if (of_find_property(card->dev->of_node, - "qcom,uart-audio-sw-gpio", - NULL)) { - rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg, - "qcom,uart-audio-sw-gpio", - &config->uart_audio_switch_gpio, - &config->uart_audio_switch_gpio_p); - if (rc) - goto err; - } -#endif - - rc = wcd_mbhc_usb_c_analog_init(mbhc); - if (rc) { - rc = EPROBE_DEFER; - goto err; - } - dev_dbg(card->dev, "%s: Using fsa4476 analog gpio switch\n", __func__); - } else { - mbhc->fsa_np = of_parse_phandle(card->dev->of_node, - "fsa4480-i2c-handle", 0); - if (!mbhc->fsa_np) { - dev_err(card->dev, "%s: fsa4480 i2c node not found\n", - __func__); - rc = -EINVAL; - goto err; - } else { - dev_dbg(card->dev, - "%s: Using USB fsa4480 i2c switch\n", __func__); - } - } - } - - /* Set btn key code */ - if ((!mbhc->is_btn_already_regd) && wcd_mbhc_set_keycode(mbhc)) - pr_err("Set btn key code error!!!\n"); - - if (!mbhc->mbhc_cfg->read_fw_bin || - (mbhc->mbhc_cfg->read_fw_bin && mbhc->mbhc_fw) || - (mbhc->mbhc_cfg->read_fw_bin && mbhc->mbhc_cal)) { - rc = wcd_mbhc_initialise(mbhc); - if (rc) { - dev_err(card->dev, "%s: wcd mbhc initialize failed\n", - __func__); - goto err; - } - } else { - if (!mbhc->mbhc_fw || !mbhc->mbhc_cal) - schedule_delayed_work(&mbhc->mbhc_firmware_dwork, - usecs_to_jiffies(FW_READ_TIMEOUT)); - else - pr_err("%s: Skipping to read mbhc fw, 0x%pK %pK\n", - __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); - } - - if (mbhc_cfg->enable_usbc_analog) { - if (mbhc_cfg->use_fsa4476_gpio == 0) { - mbhc->fsa_nb.notifier_call = wcd_mbhc_usbc_ana_event_handler; - mbhc->fsa_nb.priority = 0; - rc = fsa4480_reg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); - } else { - mbhc->psy_nb.notifier_call = wcd_mbhc_usb_c_event_changed; - mbhc->psy_nb.priority = 0; - rc = power_supply_reg_notifier(&mbhc->psy_nb); - if (rc) { - dev_err(codec->dev, "%s: power supply registration failed\n", - __func__); - goto err; - } - - /* - * as part of the init sequence check if there is a connected - * USB C analog adapter - */ - dev_dbg(mbhc->codec->dev, "%s: verify if USB adapter is already inserted\n", - __func__); - rc = wcd_mbhc_usb_c_event_changed(&mbhc->psy_nb, - PSY_EVENT_PROP_CHANGED, - mbhc->usb_psy); - } - } - - return rc; -err: - if (config->usbc_en1_gpio > 0) { - dev_dbg(card->dev, "%s free usb en1 gpio %d\n", - __func__, config->usbc_en1_gpio); - gpio_free(config->usbc_en1_gpio); - config->usbc_en1_gpio = 0; - } - if (config->usbc_en1_gpio_p) - of_node_put(config->usbc_en1_gpio_p); - if (config->usbc_force_gpio_p) - of_node_put(config->usbc_force_gpio_p); - dev_dbg(mbhc->codec->dev, "%s: leave %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(wcd_mbhc_start); - -void wcd_mbhc_stop(struct wcd_mbhc *mbhc) -{ - struct usbc_ana_audio_config *config = &mbhc->mbhc_cfg->usbc_analog_cfg; - - pr_debug("%s: enter\n", __func__); - - if (mbhc->current_plug != MBHC_PLUG_TYPE_NONE) { - if (mbhc->mbhc_cb && mbhc->mbhc_cb->skip_imped_detect) - mbhc->mbhc_cb->skip_imped_detect(mbhc->codec); - } - mbhc->current_plug = MBHC_PLUG_TYPE_NONE; - mbhc->hph_status = 0; - if (mbhc->mbhc_cb && mbhc->mbhc_cb->irq_control) { - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_left_ocp, - false); - mbhc->mbhc_cb->irq_control(mbhc->codec, - mbhc->intr_ids->hph_right_ocp, - false); - } - if (mbhc->mbhc_fw || mbhc->mbhc_cal) { - cancel_delayed_work_sync(&mbhc->mbhc_firmware_dwork); - if (!mbhc->mbhc_cal) - release_firmware(mbhc->mbhc_fw); - mbhc->mbhc_fw = NULL; - mbhc->mbhc_cal = NULL; - } - - if (mbhc->mbhc_cfg->enable_usbc_analog) { - if (mbhc->mbhc_cfg->use_fsa4476_gpio == 0) { - fsa4480_unreg_notifier(&mbhc->fsa_nb, mbhc->fsa_np); - } - - wcd_mbhc_usb_c_analog_deinit(mbhc); - - /* free GPIOs */ - if (config->usbc_en1_gpio > 0) - gpio_free(config->usbc_en1_gpio); - - if (config->usbc_en1_gpio_p) - of_node_put(config->usbc_en1_gpio_p); - } - - pr_debug("%s: leave\n", __func__); -} -EXPORT_SYMBOL(wcd_mbhc_stop); - -/* - * wcd_mbhc_init : initialize MBHC internal structures. - * - * NOTE: mbhc->mbhc_cfg is not YET configure so shouldn't be used - */ -int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_codec *codec, - const struct wcd_mbhc_cb *mbhc_cb, - const struct wcd_mbhc_intr *mbhc_cdc_intr_ids, - struct wcd_mbhc_register *wcd_mbhc_regs, - bool impedance_det_en) -{ - int ret = 0; - int hph_swh = 0; - int gnd_swh = 0; - u32 hph_moist_config[3]; - struct snd_soc_card *card = codec->component.card; - const char *hph_switch = "qcom,msm-mbhc-hphl-swh"; - const char *gnd_switch = "qcom,msm-mbhc-gnd-swh"; - const char *hs_thre = "qcom,msm-mbhc-hs-mic-max-threshold-mv"; - const char *hph_thre = "qcom,msm-mbhc-hs-mic-min-threshold-mv"; - - pr_debug("%s: enter\n", __func__); - - ret = of_property_read_u32(card->dev->of_node, hph_switch, &hph_swh); - if (ret) { - dev_err(card->dev, - "%s: missing %s in dt node\n", __func__, hph_switch); - goto err; - } - - ret = of_property_read_u32(card->dev->of_node, gnd_switch, &gnd_swh); - if (ret) { - dev_err(card->dev, - "%s: missing %s in dt node\n", __func__, gnd_switch); - goto err; - } - - ret = of_property_read_u32(card->dev->of_node, hs_thre, - &(mbhc->hs_thr)); - if (ret) - dev_dbg(card->dev, - "%s: missing %s in dt node\n", __func__, hs_thre); - - ret = of_property_read_u32(card->dev->of_node, hph_thre, - &(mbhc->hph_thr)); - if (ret) - dev_dbg(card->dev, - "%s: missing %s in dt node\n", __func__, hph_thre); - - ret = of_property_read_u32_array(card->dev->of_node, - "qcom,msm-mbhc-moist-cfg", - hph_moist_config, 3); - if (ret) { - dev_dbg(card->dev, "%s: no qcom,msm-mbhc-moist-cfg in DT\n", - __func__); - mbhc->moist_vref = V_45_MV; - mbhc->moist_iref = I_3P0_UA; - mbhc->moist_rref = R_24_KOHM; - } else { - mbhc->moist_vref = hph_moist_config[0]; - mbhc->moist_iref = hph_moist_config[1]; - mbhc->moist_rref = hph_moist_config[2]; - } - - mbhc->in_swch_irq_handler = false; - mbhc->current_plug = MBHC_PLUG_TYPE_NONE; - mbhc->is_btn_press = false; - mbhc->codec = codec; - mbhc->intr_ids = mbhc_cdc_intr_ids; - mbhc->impedance_detect = impedance_det_en; - mbhc->hphl_swh = hph_swh; - mbhc->gnd_swh = gnd_swh; - mbhc->micbias_enable = false; - mbhc->mbhc_cb = mbhc_cb; - mbhc->btn_press_intr = false; - mbhc->is_hs_recording = false; - mbhc->is_extn_cable = false; - mbhc->extn_cable_hph_rem = false; - mbhc->hph_type = WCD_MBHC_HPH_NONE; - mbhc->wcd_mbhc_regs = wcd_mbhc_regs; - mbhc->swap_thr = GND_MIC_SWAP_THRESHOLD; - - if (mbhc->intr_ids == NULL) { - pr_err("%s: Interrupt mapping not provided\n", __func__); - return -EINVAL; - } - if (!mbhc->wcd_mbhc_regs) { - dev_err(codec->dev, "%s: mbhc registers are not defined\n", - __func__); - return -EINVAL; - } - - /* Check if IRQ and other required callbacks are defined or not */ - if (!mbhc_cb || !mbhc_cb->request_irq || !mbhc_cb->irq_control || - !mbhc_cb->free_irq || !mbhc_cb->map_btn_code_to_num || - !mbhc_cb->lock_sleep || !mbhc_cb->mbhc_bias || - !mbhc_cb->set_btn_thr) { - dev_err(codec->dev, "%s: required mbhc callbacks are not defined\n", - __func__); - return -EINVAL; - } - - /* No need to create new sound card jacks if is is already created */ - if (mbhc->headset_jack.jack == NULL) { - ret = snd_soc_card_jack_new(codec->component.card, - "Headset Jack", WCD_MBHC_JACK_MASK, - &mbhc->headset_jack, NULL, 0); - if (ret) { - pr_err("%s: Failed to create new jack\n", __func__); - return ret; - } - - ret = snd_soc_card_jack_new(codec->component.card, - "Button Jack", - WCD_MBHC_JACK_BUTTON_MASK, - &mbhc->button_jack, NULL, 0); - if (ret) { - pr_err("Failed to create new jack\n"); - return ret; - } - - ret = snd_jack_set_key(mbhc->button_jack.jack, - SND_JACK_BTN_0, - KEY_MEDIA); - if (ret) { - pr_err("%s: Failed to set code for btn-0\n", - __func__); - return ret; - } - - INIT_DELAYED_WORK(&mbhc->mbhc_firmware_dwork, - wcd_mbhc_fw_read); - INIT_DELAYED_WORK(&mbhc->mbhc_btn_dwork, wcd_btn_lpress_fn); - } - mutex_init(&mbhc->hphl_pa_lock); - mutex_init(&mbhc->hphr_pa_lock); - init_completion(&mbhc->btn_press_compl); - - /* Register event notifier */ - mbhc->nblock.notifier_call = wcd_event_notify; - if (mbhc->mbhc_cb->register_notifier) { - ret = mbhc->mbhc_cb->register_notifier(mbhc, &mbhc->nblock, - true); - if (ret) { - pr_err("%s: Failed to register notifier %d\n", - __func__, ret); - return ret; - } - } - - init_waitqueue_head(&mbhc->wait_btn_press); - mutex_init(&mbhc->codec_resource_lock); - - switch (mbhc->mbhc_detection_logic) { - case WCD_DETECTION_LEGACY: - wcd_mbhc_legacy_init(mbhc); - break; - case WCD_DETECTION_ADC: - wcd_mbhc_adc_init(mbhc); - break; - default: - pr_err("%s: Unknown detection logic type %d\n", - __func__, mbhc->mbhc_detection_logic); - break; - } - - if (!mbhc->mbhc_fn || - !mbhc->mbhc_fn->wcd_mbhc_hs_ins_irq || - !mbhc->mbhc_fn->wcd_mbhc_hs_rem_irq || - !mbhc->mbhc_fn->wcd_mbhc_detect_plug_type || - !mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) { - pr_err("%s: mbhc function pointer is NULL\n", __func__); - goto err_mbhc_sw_irq; - } - ret = mbhc->mbhc_cb->request_irq(codec, mbhc->intr_ids->mbhc_sw_intr, - wcd_mbhc_mech_plug_detect_irq, - "mbhc sw intr", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d, ret = %d\n", __func__, - mbhc->intr_ids->mbhc_sw_intr, ret); - goto err_mbhc_sw_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_btn_press_intr, - wcd_mbhc_btn_press_handler, - "Button Press detect", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_btn_press_intr); - goto err_btn_press_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_btn_release_intr, - wcd_mbhc_release_handler, - "Button Release detect", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_btn_release_intr); - goto err_btn_release_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_hs_ins_intr, - mbhc->mbhc_fn->wcd_mbhc_hs_ins_irq, - "Elect Insert", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_hs_ins_intr); - goto err_mbhc_hs_ins_irq; - } - mbhc->mbhc_cb->irq_control(codec, mbhc->intr_ids->mbhc_hs_ins_intr, - false); - clear_bit(WCD_MBHC_ELEC_HS_INS, &mbhc->intr_status); - - ret = mbhc->mbhc_cb->request_irq(codec, - mbhc->intr_ids->mbhc_hs_rem_intr, - mbhc->mbhc_fn->wcd_mbhc_hs_rem_irq, - "Elect Remove", mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->mbhc_hs_rem_intr); - goto err_mbhc_hs_rem_irq; - } - mbhc->mbhc_cb->irq_control(codec, mbhc->intr_ids->mbhc_hs_rem_intr, - false); - clear_bit(WCD_MBHC_ELEC_HS_REM, &mbhc->intr_status); - - ret = mbhc->mbhc_cb->request_irq(codec, mbhc->intr_ids->hph_left_ocp, - wcd_mbhc_hphl_ocp_irq, "HPH_L OCP detect", - mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->hph_left_ocp); - goto err_hphl_ocp_irq; - } - - ret = mbhc->mbhc_cb->request_irq(codec, mbhc->intr_ids->hph_right_ocp, - wcd_mbhc_hphr_ocp_irq, "HPH_R OCP detect", - mbhc); - if (ret) { - pr_err("%s: Failed to request irq %d\n", __func__, - mbhc->intr_ids->hph_right_ocp); - goto err_hphr_ocp_irq; - } - - mbhc->deinit_in_progress = false; - pr_debug("%s: leave ret %d\n", __func__, ret); - return ret; - -err_hphr_ocp_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->hph_left_ocp, mbhc); -err_hphl_ocp_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_rem_intr, mbhc); -err_mbhc_hs_rem_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_ins_intr, mbhc); -err_mbhc_hs_ins_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_release_intr, - mbhc); -err_btn_release_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_press_intr, - mbhc); -err_btn_press_irq: - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_sw_intr, mbhc); -err_mbhc_sw_irq: - if (mbhc->mbhc_cb->register_notifier) - mbhc->mbhc_cb->register_notifier(mbhc, &mbhc->nblock, false); - mutex_destroy(&mbhc->codec_resource_lock); -err: - pr_debug("%s: leave ret %d\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(wcd_mbhc_init); - -void wcd_mbhc_deinit(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_sw_intr, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_press_intr, - mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_btn_release_intr, - mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_ins_intr, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->mbhc_hs_rem_intr, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->hph_left_ocp, mbhc); - mbhc->mbhc_cb->free_irq(codec, mbhc->intr_ids->hph_right_ocp, mbhc); - if (mbhc->mbhc_cb && mbhc->mbhc_cb->register_notifier) - mbhc->mbhc_cb->register_notifier(mbhc, &mbhc->nblock, false); - if (mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) { - WCD_MBHC_RSC_LOCK(mbhc); - mbhc->mbhc_fn->wcd_cancel_hs_detect_plug(mbhc, - &mbhc->correct_plug_swch); - WCD_MBHC_RSC_UNLOCK(mbhc); - } - mutex_destroy(&mbhc->codec_resource_lock); - mutex_destroy(&mbhc->hphl_pa_lock); - mutex_destroy(&mbhc->hphr_pa_lock); -} -EXPORT_SYMBOL(wcd_mbhc_deinit); - -static int __init mbhc_init(void) -{ - return 0; -} - -static void __exit mbhc_exit(void) -{ -} - -module_init(mbhc_init); -module_exit(mbhc_exit); - -MODULE_DESCRIPTION("wcd MBHC v2 module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd-mbhc-v2.h b/techpack/audio/asoc/codecs/wcd-mbhc-v2.h deleted file mode 100644 index f6dc1fec2265..000000000000 --- a/techpack/audio/asoc/codecs/wcd-mbhc-v2.h +++ /dev/null @@ -1,646 +0,0 @@ -/* Copyright (c) 2014-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD_MBHC_V2_H__ -#define __WCD_MBHC_V2_H__ - -#include -#include -#include -#include "wcdcal-hwdep.h" -#include - -#define TOMBAK_MBHC_NC 0 -#define TOMBAK_MBHC_NO 1 -#define WCD_MBHC_DEF_BUTTONS 8 -#define WCD_MBHC_KEYCODE_NUM 8 -#define WCD_MBHC_USLEEP_RANGE_MARGIN_US 100 -#define WCD_MBHC_THR_HS_MICB_MV 2700 -/* z value defined in Ohms */ -#define WCD_MONO_HS_MIN_THR 2 -#define WCD_MBHC_STRINGIFY(s) __stringify(s) - -#define WCD_MBHC_REGISTER(rid, rreg, rmask, rshift, rinvert) \ -{ .id = rid, .reg = rreg, .mask = rmask, .offset = rshift, .invert = rinvert } - -#define WCD_MBHC_RSC_LOCK(mbhc) \ -{ \ - pr_debug("%s: Acquiring BCL\n", __func__); \ - mutex_lock(&mbhc->codec_resource_lock); \ - pr_debug("%s: Acquiring BCL done\n", __func__); \ -} - -#define WCD_MBHC_RSC_UNLOCK(mbhc) \ -{ \ - pr_debug("%s: Release BCL\n", __func__); \ - mutex_unlock(&mbhc->codec_resource_lock); \ -} - -#define WCD_MBHC_RSC_ASSERT_LOCKED(mbhc) \ -{ \ - WARN_ONCE(!mutex_is_locked(&mbhc->codec_resource_lock), \ - "%s: BCL should have acquired\n", __func__); \ -} - -/* - * Macros to update and read mbhc register bits. Check for - * "0" before updating or reading the register, because it - * is possible that one codec wants to write to that bit and - * other codec does not. - */ -#define WCD_MBHC_REG_UPDATE_BITS(function, val) \ -do { \ - if (mbhc->wcd_mbhc_regs[function].reg) { \ - snd_soc_update_bits(mbhc->codec, \ - mbhc->wcd_mbhc_regs[function].reg, \ - mbhc->wcd_mbhc_regs[function].mask, \ - val << (mbhc->wcd_mbhc_regs[function].offset)); \ - } \ -} while (0) - -#define WCD_MBHC_REG_READ(function, val) \ -do { \ - if (mbhc->wcd_mbhc_regs[function].reg) { \ - val = (((snd_soc_read(mbhc->codec, \ - mbhc->wcd_mbhc_regs[function].reg)) & \ - (mbhc->wcd_mbhc_regs[function].mask)) >> \ - (mbhc->wcd_mbhc_regs[function].offset)); \ - } else { \ - val = -EINVAL; \ - } \ -} while (0) - -#define WCD_MBHC_CAL_SIZE(buttons, rload) ( \ - sizeof(struct wcd_mbhc_general_cfg) + \ - sizeof(struct wcd_mbhc_plug_detect_cfg) + \ - ((sizeof(s16) + sizeof(s16)) * buttons) + \ - sizeof(struct wcd_mbhc_plug_type_cfg) + \ - sizeof(struct wcd_mbhc_btn_detect_cfg) + \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + \ - ((sizeof(u16) + sizeof(u16)) * rload) \ - ) - -#define WCD_MBHC_CAL_GENERAL_PTR(cali) ( \ - (struct wcd_mbhc_general_cfg *) cali) -#define WCD_MBHC_CAL_PLUG_DET_PTR(cali) ( \ - (struct wcd_mbhc_plug_detect_cfg *) \ - &(WCD_MBHC_CAL_GENERAL_PTR(cali)[1])) -#define WCD_MBHC_CAL_PLUG_TYPE_PTR(cali) ( \ - (struct wcd_mbhc_plug_type_cfg *) \ - &(WCD_MBHC_CAL_PLUG_DET_PTR(cali)[1])) -#define WCD_MBHC_CAL_BTN_DET_PTR(cali) ( \ - (struct wcd_mbhc_btn_detect_cfg *) \ - &(WCD_MBHC_CAL_PLUG_TYPE_PTR(cali)[1])) -#define WCD_MBHC_CAL_IMPED_DET_PTR(cali) ( \ - (struct wcd_mbhc_imped_detect_cfg *) \ - (((void *)&WCD_MBHC_CAL_BTN_DET_PTR(cali)[1]) + \ - (WCD_MBHC_CAL_BTN_DET_PTR(cali)->num_btn * \ - (sizeof(WCD_MBHC_CAL_BTN_DET_PTR(cali)->_v_btn_low[0]) + \ - sizeof(WCD_MBHC_CAL_BTN_DET_PTR(cali)->_v_btn_high[0])))) \ - ) - -#define WCD_MBHC_CAL_MIN_SIZE ( \ - sizeof(struct wcd_mbhc_general_cfg) + \ - sizeof(struct wcd_mbhc_plug_detect_cfg) + \ - sizeof(struct wcd_mbhc_plug_type_cfg) + \ - sizeof(struct wcd_mbhc_btn_detect_cfg) + \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + \ - (sizeof(u16)*2) \ - ) - -#define WCD_MBHC_CAL_BTN_SZ(cfg_ptr) ( \ - sizeof(struct wcd_mbhc_btn_detect_cfg) + \ - (cfg_ptr->num_btn * (sizeof(cfg_ptr->_v_btn_low[0]) + \ - sizeof(cfg_ptr->_v_btn_high[0])))) - -#define WCD_MBHC_CAL_IMPED_MIN_SZ ( \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + sizeof(u16) * 2) - -#define WCD_MBHC_CAL_IMPED_SZ(cfg_ptr) ( \ - sizeof(struct wcd_mbhc_imped_detect_cfg) + \ - (cfg_ptr->_n_rload * \ - (sizeof(cfg_ptr->_rload[0]) + sizeof(cfg_ptr->_alpha[0])))) - -#define WCD_MBHC_JACK_MASK (SND_JACK_HEADSET | SND_JACK_OC_HPHL | \ - SND_JACK_OC_HPHR | SND_JACK_LINEOUT | \ - SND_JACK_MECHANICAL | SND_JACK_MICROPHONE2 | \ - SND_JACK_UNSUPPORTED) - -#define WCD_MBHC_JACK_BUTTON_MASK (SND_JACK_BTN_0 | SND_JACK_BTN_1 | \ - SND_JACK_BTN_2 | SND_JACK_BTN_3 | \ - SND_JACK_BTN_4 | SND_JACK_BTN_5) -#define OCP_ATTEMPT 20 -#define HS_DETECT_PLUG_TIME_MS (3 * 1000) -#define SPECIAL_HS_DETECT_TIME_MS (2 * 1000) -#define MBHC_BUTTON_PRESS_THRESHOLD_MIN 250 -#define GND_MIC_SWAP_THRESHOLD 4 -#define GND_MIC_USBC_SWAP_THRESHOLD 2 -#define WCD_FAKE_REMOVAL_MIN_PERIOD_MS 100 -#define HS_VREF_MIN_VAL 1400 -#define FW_READ_ATTEMPTS 15 -#define FW_READ_TIMEOUT 4000000 -#define FAKE_REM_RETRY_ATTEMPTS 3 -#define MAX_IMPED 60000 - -#define WCD_MBHC_BTN_PRESS_COMPL_TIMEOUT_MS 50 -#define ANC_DETECT_RETRY_CNT 7 -#define WCD_MBHC_SPL_HS_CNT 1 - -enum wcd_mbhc_detect_logic { - WCD_DETECTION_LEGACY, - WCD_DETECTION_ADC, -}; - -enum wcd_mbhc_cs_mb_en_flag { - WCD_MBHC_EN_CS = 0, - WCD_MBHC_EN_MB, - WCD_MBHC_EN_PULLUP, - WCD_MBHC_EN_NONE, -}; - -enum { - WCD_MBHC_ELEC_HS_INS, - WCD_MBHC_ELEC_HS_REM, -}; - -struct wcd_mbhc; -enum wcd_mbhc_register_function { - WCD_MBHC_L_DET_EN, - WCD_MBHC_GND_DET_EN, - WCD_MBHC_MECH_DETECTION_TYPE, - WCD_MBHC_MIC_CLAMP_CTL, - WCD_MBHC_ELECT_DETECTION_TYPE, - WCD_MBHC_HS_L_DET_PULL_UP_CTRL, - WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL, - WCD_MBHC_HPHL_PLUG_TYPE, - WCD_MBHC_GND_PLUG_TYPE, - WCD_MBHC_SW_HPH_LP_100K_TO_GND, - WCD_MBHC_ELECT_SCHMT_ISRC, - WCD_MBHC_FSM_EN, - WCD_MBHC_INSREM_DBNC, - WCD_MBHC_BTN_DBNC, - WCD_MBHC_HS_VREF, - WCD_MBHC_HS_COMP_RESULT, - WCD_MBHC_IN2P_CLAMP_STATE, - WCD_MBHC_MIC_SCHMT_RESULT, - WCD_MBHC_HPHL_SCHMT_RESULT, - WCD_MBHC_HPHR_SCHMT_RESULT, - WCD_MBHC_OCP_FSM_EN, - WCD_MBHC_BTN_RESULT, - WCD_MBHC_BTN_ISRC_CTL, - WCD_MBHC_ELECT_RESULT, - WCD_MBHC_MICB_CTRL, /* Pull-up and micb control */ - WCD_MBHC_HPH_CNP_WG_TIME, - WCD_MBHC_HPHR_PA_EN, - WCD_MBHC_HPHL_PA_EN, - WCD_MBHC_HPH_PA_EN, - WCD_MBHC_SWCH_LEVEL_REMOVE, - WCD_MBHC_PULLDOWN_CTRL, - WCD_MBHC_ANC_DET_EN, - WCD_MBHC_FSM_STATUS, - WCD_MBHC_MUX_CTL, - WCD_MBHC_MOISTURE_STATUS, - WCD_MBHC_HPHR_GND, - WCD_MBHC_HPHL_GND, - WCD_MBHC_HPHL_OCP_DET_EN, - WCD_MBHC_HPHR_OCP_DET_EN, - WCD_MBHC_HPHL_OCP_STATUS, - WCD_MBHC_HPHR_OCP_STATUS, - WCD_MBHC_ADC_EN, - WCD_MBHC_ADC_COMPLETE, - WCD_MBHC_ADC_TIMEOUT, - WCD_MBHC_ADC_RESULT, - WCD_MBHC_MICB2_VOUT, - WCD_MBHC_ADC_MODE, - WCD_MBHC_DETECTION_DONE, - WCD_MBHC_ELECT_ISRC_EN, - WCD_MBHC_REG_FUNC_MAX, -}; - -enum wcd_mbhc_plug_type { - MBHC_PLUG_TYPE_INVALID = -1, - MBHC_PLUG_TYPE_NONE, - MBHC_PLUG_TYPE_HEADSET, - MBHC_PLUG_TYPE_HEADPHONE, - MBHC_PLUG_TYPE_HIGH_HPH, - MBHC_PLUG_TYPE_GND_MIC_SWAP, - MBHC_PLUG_TYPE_ANC_HEADPHONE, -}; - -enum pa_dac_ack_flags { - WCD_MBHC_HPHL_PA_OFF_ACK = 0, - WCD_MBHC_HPHR_PA_OFF_ACK, -}; - -enum anc_ack_flags { - WCD_MBHC_ANC0_OFF_ACK = 0, - WCD_MBHC_ANC1_OFF_ACK, -}; - -enum wcd_mbhc_btn_det_mem { - WCD_MBHC_BTN_DET_V_BTN_LOW, - WCD_MBHC_BTN_DET_V_BTN_HIGH -}; - -enum { - MIC_BIAS_1 = 1, - MIC_BIAS_2, - MIC_BIAS_3, - MIC_BIAS_4 -}; - -enum { - MICB_PULLUP_ENABLE, - MICB_PULLUP_DISABLE, - MICB_ENABLE, - MICB_DISABLE, -}; - -enum { - MBHC_COMMON_MICB_PRECHARGE, - MBHC_COMMON_MICB_SET_VAL, - MBHC_COMMON_MICB_TAIL_CURR, -}; - -enum wcd_notify_event { - WCD_EVENT_INVALID, - /* events for micbias ON and OFF */ - WCD_EVENT_PRE_MICBIAS_2_OFF, - WCD_EVENT_POST_MICBIAS_2_OFF, - WCD_EVENT_PRE_MICBIAS_2_ON, - WCD_EVENT_POST_MICBIAS_2_ON, - WCD_EVENT_PRE_DAPM_MICBIAS_2_OFF, - WCD_EVENT_POST_DAPM_MICBIAS_2_OFF, - WCD_EVENT_PRE_DAPM_MICBIAS_2_ON, - WCD_EVENT_POST_DAPM_MICBIAS_2_ON, - /* events for PA ON and OFF */ - WCD_EVENT_PRE_HPHL_PA_ON, - WCD_EVENT_POST_HPHL_PA_OFF, - WCD_EVENT_PRE_HPHR_PA_ON, - WCD_EVENT_POST_HPHR_PA_OFF, - WCD_EVENT_PRE_HPHL_PA_OFF, - WCD_EVENT_PRE_HPHR_PA_OFF, - WCD_EVENT_OCP_OFF, - WCD_EVENT_OCP_ON, - WCD_EVENT_LAST, -}; - -enum wcd_mbhc_event_state { - WCD_MBHC_EVENT_PA_HPHL, - WCD_MBHC_EVENT_PA_HPHR, -}; - -struct wcd_mbhc_general_cfg { - u8 t_ldoh; - u8 t_bg_fast_settle; - u8 t_shutdown_plug_rem; - u8 mbhc_nsa; - u8 mbhc_navg; - u8 v_micbias_l; - u8 v_micbias; - u8 mbhc_reserved; - u16 settle_wait; - u16 t_micbias_rampup; - u16 t_micbias_rampdown; - u16 t_supply_bringup; -} __packed; - -struct wcd_mbhc_plug_detect_cfg { - u32 mic_current; - u32 hph_current; - u16 t_mic_pid; - u16 t_ins_complete; - u16 t_ins_retry; - u16 v_removal_delta; - u8 micbias_slow_ramp; - u8 reserved0; - u8 reserved1; - u8 reserved2; -} __packed; - -struct wcd_mbhc_plug_type_cfg { - u8 av_detect; - u8 mono_detect; - u8 num_ins_tries; - u8 reserved0; - s16 v_no_mic; - s16 v_av_min; - s16 v_av_max; - s16 v_hs_min; - s16 v_hs_max; - u16 reserved1; -} __packed; - -struct wcd_mbhc_btn_detect_cfg { - s8 c[8]; - u8 nc; - u8 n_meas; - u8 mbhc_nsc; - u8 n_btn_meas; - u8 n_btn_con; - u8 num_btn; - u8 reserved0; - u8 reserved1; - u16 t_poll; - u16 t_bounce_wait; - u16 t_rel_timeout; - s16 v_btn_press_delta_sta; - s16 v_btn_press_delta_cic; - u16 t_btn0_timeout; - s16 _v_btn_low[0]; /* v_btn_low[num_btn] */ - s16 _v_btn_high[0]; /* v_btn_high[num_btn] */ - u8 _n_ready[2]; - u8 _n_cic[2]; - u8 _gain[2]; -} __packed; - -struct wcd_mbhc_imped_detect_cfg { - u8 _hs_imped_detect; - u8 _n_rload; - u8 _hph_keep_on; - u8 _repeat_rload_calc; - u16 _t_dac_ramp_time; - u16 _rhph_high; - u16 _rhph_low; - u16 _rload[0]; /* rload[n_rload] */ - u16 _alpha[0]; /* alpha[n_rload] */ - u16 _beta[3]; -} __packed; - -enum wcd_mbhc_hph_type { - WCD_MBHC_HPH_NONE = 0, - WCD_MBHC_HPH_MONO, - WCD_MBHC_HPH_STEREO, -}; - -/* - * These enum definitions are directly mapped to the register - * definitions - */ -enum mbhc_moisture_vref { - V_OFF, - V_45_MV, - V_100_MV, - V_225_MV, -}; - -enum mbhc_hs_pullup_iref { - I_DEFAULT = -1, - I_OFF = 0, - I_1P0_UA, - I_2P0_UA, - I_3P0_UA, -}; - -enum mbhc_hs_pullup_iref_v2 { - HS_PULLUP_I_DEFAULT = -1, - HS_PULLUP_I_3P0_UA = 0, - HS_PULLUP_I_2P25_UA, - HS_PULLUP_I_1P5_UA, - HS_PULLUP_I_0P75_UA, - HS_PULLUP_I_1P125_UA = 0x05, - HS_PULLUP_I_0P375_UA = 0x07, - HS_PULLUP_I_2P0_UA, - HS_PULLUP_I_1P0_UA = 0x0A, - HS_PULLUP_I_0P5_UA, - HS_PULLUP_I_0P25_UA = 0x0F, - HS_PULLUP_I_0P125_UA = 0x17, - HS_PULLUP_I_OFF, -}; - -enum mbhc_moisture_rref { - R_OFF, - R_24_KOHM, - R_84_KOHM, - R_184_KOHM, -}; - -struct usbc_ana_audio_config { - int usbc_en1_gpio; - int usbc_en2_gpio; - int usbc_force_gpio; - int euro_us_hw_switch_gpio; - int uart_audio_switch_gpio; - int subpcb_id_gpio; - struct device_node *usbc_en1_gpio_p; /* used by pinctrl API */ - struct device_node *usbc_en2_gpio_p; /* used by pinctrl API */ - struct device_node *usbc_force_gpio_p; /* used by pinctrl API */ - struct device_node *euro_us_hw_switch_gpio_p; /* used by pinctrl API */ - struct device_node *uart_audio_switch_gpio_p; /* used by pinctrl API */ - struct device_node *subpcb_id_gpio_p; /* used by pinctrl API */ -}; - -struct wcd_mbhc_config { - bool read_fw_bin; - void *calibration; - bool detect_extn_cable; - bool mono_stero_detection; - bool (*swap_gnd_mic)(struct snd_soc_codec *codec, bool active); - bool hs_ext_micbias; - bool gnd_det_en; - int key_code[WCD_MBHC_KEYCODE_NUM]; - uint32_t linein_th; - bool moisture_en; - int mbhc_micbias; - int anc_micbias; - bool enable_anc_mic_detect; - u32 enable_usbc_analog; - struct usbc_ana_audio_config usbc_analog_cfg; - u32 use_fsa4476_gpio; - bool moisture_duty_cycle_en; - void (*enable_dual_adc_gpio)(struct device_node *node, bool en); - struct device_node *dual_adc_gpio_node; -}; - -struct wcd_mbhc_intr { - int mbhc_sw_intr; - int mbhc_btn_press_intr; - int mbhc_btn_release_intr; - int mbhc_hs_ins_intr; - int mbhc_hs_rem_intr; - int hph_left_ocp; - int hph_right_ocp; -}; - -struct wcd_mbhc_register { - const char *id; - u16 reg; - u8 mask; - u8 offset; - u8 invert; -}; - -struct wcd_mbhc_cb { - void (*bcs_enable) - (struct wcd_mbhc *mbhc, bool bcs_enable); - int (*enable_mb_source)(struct wcd_mbhc *, bool); - void (*trim_btn_reg)(struct snd_soc_codec *); - void (*compute_impedance)(struct wcd_mbhc *, uint32_t *, uint32_t *); - void (*set_micbias_value)(struct snd_soc_codec *); - void (*set_auto_zeroing)(struct snd_soc_codec *, bool); - struct firmware_cal * (*get_hwdep_fw_cal)(struct wcd_mbhc *, - enum wcd_cal_type); - void (*set_cap_mode)(struct snd_soc_codec *, bool, bool); - int (*register_notifier)(struct wcd_mbhc *, - struct notifier_block *nblock, - bool enable); - int (*request_irq)(struct snd_soc_codec *, - int, irq_handler_t, const char *, void *); - void (*irq_control)(struct snd_soc_codec *, - int irq, bool enable); - int (*free_irq)(struct snd_soc_codec *, - int irq, void *); - void (*clk_setup)(struct snd_soc_codec *, bool); - int (*map_btn_code_to_num)(struct snd_soc_codec *); - bool (*lock_sleep)(struct wcd_mbhc *, bool); - bool (*micbias_enable_status)(struct wcd_mbhc *, int); - void (*mbhc_bias)(struct snd_soc_codec *, bool); - void (*mbhc_common_micb_ctrl)(struct snd_soc_codec *, - int event, bool); - void (*micb_internal)(struct snd_soc_codec *, - int micb_num, bool); - bool (*hph_pa_on_status)(struct snd_soc_codec *); - void (*set_btn_thr)(struct snd_soc_codec *, s16 *, s16 *, - int num_btn, bool); - void (*hph_pull_up_control)(struct snd_soc_codec *, - enum mbhc_hs_pullup_iref); - int (*mbhc_micbias_control)(struct snd_soc_codec *, int, int req); - void (*mbhc_micb_ramp_control)(struct snd_soc_codec *, bool); - void (*skip_imped_detect)(struct snd_soc_codec *); - bool (*extn_use_mb)(struct snd_soc_codec *); - int (*mbhc_micb_ctrl_thr_mic)(struct snd_soc_codec *, int, bool); - void (*mbhc_gnd_det_ctrl)(struct snd_soc_codec *, bool); - void (*hph_pull_down_ctrl)(struct snd_soc_codec *, bool); - void (*mbhc_moisture_config)(struct wcd_mbhc *); - bool (*hph_register_recovery)(struct wcd_mbhc *); - void (*update_anc_state)(struct snd_soc_codec *codec, - bool enable, int anc_num); - bool (*is_anc_on)(struct wcd_mbhc *mbhc); - void (*hph_pull_up_control_v2)(struct snd_soc_codec *, int); - bool (*mbhc_get_moisture_status)(struct wcd_mbhc *); - void (*mbhc_moisture_polling_ctrl)(struct wcd_mbhc *, bool); - void (*mbhc_moisture_detect_en)(struct wcd_mbhc *, bool); -}; - -struct wcd_mbhc_fn { - irqreturn_t (*wcd_mbhc_hs_ins_irq)(int irq, void *data); - irqreturn_t (*wcd_mbhc_hs_rem_irq)(int irq, void *data); - void (*wcd_mbhc_detect_plug_type)(struct wcd_mbhc *mbhc); - bool (*wcd_mbhc_detect_anc_plug_type)(struct wcd_mbhc *mbhc); - void (*wcd_cancel_hs_detect_plug)(struct wcd_mbhc *mbhc, - struct work_struct *work); -}; - -struct wcd_mbhc { - /* Delayed work to report long button press */ - struct delayed_work mbhc_btn_dwork; - int buttons_pressed; - struct wcd_mbhc_config *mbhc_cfg; - const struct wcd_mbhc_cb *mbhc_cb; - - u32 hph_status; /* track headhpone status */ - u8 hphlocp_cnt; /* headphone left ocp retry */ - u8 hphrocp_cnt; /* headphone right ocp retry */ - - wait_queue_head_t wait_btn_press; - bool is_btn_press; - u8 current_plug; - bool in_swch_irq_handler; - bool hphl_swh; /*track HPHL switch NC / NO */ - bool gnd_swh; /*track GND switch NC / NO */ - u32 hs_thr; - u32 hph_thr; - u32 micb_mv; - u32 swap_thr; - u32 moist_vref; - u32 moist_iref; - u32 moist_rref; - u8 micbias1_cap_mode; /* track ext cap setting */ - u8 micbias2_cap_mode; /* track ext cap setting */ - bool hs_detect_work_stop; - bool micbias_enable; - bool btn_press_intr; - bool is_hs_recording; - bool is_extn_cable; - bool skip_imped_detection; - bool is_btn_already_regd; - bool extn_cable_hph_rem; - - struct snd_soc_codec *codec; - /* Work to perform MBHC Firmware Read */ - struct delayed_work mbhc_firmware_dwork; - const struct firmware *mbhc_fw; - struct firmware_cal *mbhc_cal; - - /* track PA/DAC state to sync with userspace */ - unsigned long hph_pa_dac_state; - unsigned long hph_anc_state; - unsigned long event_state; - unsigned long jiffies_atreport; - - /* impedance of hphl and hphr */ - uint32_t zl, zr; - bool impedance_detect; - - /* Holds type of Headset - Mono/Stereo */ - enum wcd_mbhc_hph_type hph_type; - - struct snd_soc_jack headset_jack; - struct snd_soc_jack button_jack; - struct mutex codec_resource_lock; - - /* Holds codec specific interrupt mapping */ - const struct wcd_mbhc_intr *intr_ids; - - /* Work to correct accessory type */ - struct work_struct correct_plug_swch; - struct notifier_block nblock; - - struct wcd_mbhc_register *wcd_mbhc_regs; - - struct completion btn_press_compl; - struct mutex hphl_pa_lock; - struct mutex hphr_pa_lock; - bool deinit_in_progress; - - /* Holds mbhc detection method - ADC/Legacy */ - unsigned int mbhc_detection_logic; - - unsigned long intr_status; - bool is_hph_ocp_pending; - - bool usbc_force_pr_mode; - int usbc_mode; - struct notifier_block psy_nb; - struct power_supply *usb_psy; - struct work_struct usbc_analog_work; - - struct wcd_mbhc_fn *mbhc_fn; - bool force_linein; - struct device_node *fsa_np; - struct notifier_block fsa_nb; -}; - -void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, - enum wcd_mbhc_plug_type plug_type); -void wcd_mbhc_hs_elec_irq(struct wcd_mbhc *mbhc, int irq_type, bool enable); -void wcd_mbhc_elec_hs_report_unplug(struct wcd_mbhc *mbhc); -bool wcd_swch_level_remove(struct wcd_mbhc *mbhc); -void wcd_enable_curr_micbias(const struct wcd_mbhc *mbhc, - const enum wcd_mbhc_cs_mb_en_flag cs_mb_en); -void wcd_mbhc_jack_report(struct wcd_mbhc *mbhc, - struct snd_soc_jack *jack, int status, int mask); -int wcd_cancel_btn_work(struct wcd_mbhc *mbhc); -int wcd_mbhc_get_button_mask(struct wcd_mbhc *mbhc); -void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, - enum snd_jack_types jack_type); - -#endif /* __WCD_MBHC_V2_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd-spi-registers.h b/techpack/audio/asoc/codecs/wcd-spi-registers.h deleted file mode 100644 index 4e579696cc49..000000000000 --- a/techpack/audio/asoc/codecs/wcd-spi-registers.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD_SPI_REGISTERS_H__ -#define __WCD_SPI_REGISTERS_H__ - -#include - -#define WCD_SPI_SLAVE_SANITY (0x00) -#define WCD_SPI_SLAVE_DEVICE_ID (0x04) -#define WCD_SPI_SLAVE_STATUS (0x08) -#define WCD_SPI_SLAVE_CONFIG (0x0c) -#define WCD_SPI_SLAVE_SW_RESET (0x10) -#define WCD_SPI_SLAVE_IRQ_STATUS (0x14) -#define WCD_SPI_SLAVE_IRQ_EN (0x18) -#define WCD_SPI_SLAVE_IRQ_CLR (0x1c) -#define WCD_SPI_SLAVE_IRQ_FORCE (0x20) -#define WCD_SPI_SLAVE_TX (0x24) -#define WCD_SPI_SLAVE_TEST_BUS_DATA (0x2c) -#define WCD_SPI_SLAVE_TEST_BUS_CTRL (0x30) -#define WCD_SPI_SLAVE_SW_RST_IRQ (0x34) -#define WCD_SPI_SLAVE_CHAR_CFG (0x38) -#define WCD_SPI_SLAVE_CHAR_DATA_MOSI (0x3c) -#define WCD_SPI_SLAVE_CHAR_DATA_CS_N (0x40) -#define WCD_SPI_SLAVE_CHAR_DATA_MISO (0x44) -#define WCD_SPI_SLAVE_TRNS_BYTE_CNT (0x4c) -#define WCD_SPI_SLAVE_TRNS_LEN (0x50) -#define WCD_SPI_SLAVE_FIFO_LEVEL (0x54) -#define WCD_SPI_SLAVE_GENERICS (0x58) -#define WCD_SPI_SLAVE_EXT_BASE_ADDR (0x5c) -#define WCD_SPI_MAX_REGISTER (0x5F) - -#endif /* End __WCD_SPI_REGISTERS_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd-spi.c b/techpack/audio/asoc/codecs/wcd-spi.c deleted file mode 100644 index ef955dd866be..000000000000 --- a/techpack/audio/asoc/codecs/wcd-spi.c +++ /dev/null @@ -1,1592 +0,0 @@ -/* - * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd-spi-registers.h" - -/* Byte manipulations */ -#define SHIFT_1_BYTES (8) -#define SHIFT_2_BYTES (16) -#define SHIFT_3_BYTES (24) - -/* Command opcodes */ -#define WCD_SPI_CMD_NOP (0x00) -#define WCD_SPI_CMD_WREN (0x06) -#define WCD_SPI_CMD_CLKREQ (0xDA) -#define WCD_SPI_CMD_RDSR (0x05) -#define WCD_SPI_CMD_IRR (0x81) -#define WCD_SPI_CMD_IRW (0x82) -#define WCD_SPI_CMD_MIOR (0x83) -#define WCD_SPI_CMD_FREAD (0x0B) -#define WCD_SPI_CMD_MIOW (0x02) -#define WCD_SPI_WRITE_FRAME_OPCODE \ - (WCD_SPI_CMD_MIOW << SHIFT_3_BYTES) -#define WCD_SPI_READ_FRAME_OPCODE \ - (WCD_SPI_CMD_MIOR << SHIFT_3_BYTES) -#define WCD_SPI_FREAD_FRAME_OPCODE \ - (WCD_SPI_CMD_FREAD << SHIFT_3_BYTES) - -/* Command lengths */ -#define WCD_SPI_OPCODE_LEN (0x01) -#define WCD_SPI_CMD_NOP_LEN (0x01) -#define WCD_SPI_CMD_WREN_LEN (0x01) -#define WCD_SPI_CMD_CLKREQ_LEN (0x04) -#define WCD_SPI_CMD_IRR_LEN (0x04) -#define WCD_SPI_CMD_IRW_LEN (0x06) -#define WCD_SPI_WRITE_SINGLE_LEN (0x08) -#define WCD_SPI_READ_SINGLE_LEN (0x13) -#define WCD_SPI_CMD_FREAD_LEN (0x13) - -/* Command delays */ -#define WCD_SPI_CLKREQ_DELAY_USECS (500) -#define WCD_SPI_CLK_OFF_TIMER_MS (500) -#define WCD_SPI_RESUME_TIMEOUT_MS 100 - -/* Command masks */ -#define WCD_CMD_ADDR_MASK \ - (0xFF | \ - (0xFF << SHIFT_1_BYTES) | \ - (0xFF << SHIFT_2_BYTES)) - -/* Clock ctrl request related */ -#define WCD_SPI_CLK_ENABLE true -#define WCD_SPI_CLK_DISABLE false -#define WCD_SPI_CLK_FLAG_DELAYED (1 << 0) -#define WCD_SPI_CLK_FLAG_IMMEDIATE (1 << 1) - -/* Internal addresses */ -#define WCD_SPI_ADDR_IPC_CTL_HOST (0x012014) - -/* Word sizes and min/max lengths */ -#define WCD_SPI_WORD_BYTE_CNT (4) -#define WCD_SPI_RW_MULTI_MIN_LEN (16) - -/* Max size is 32 bytes less than 64Kbytes */ -#define WCD_SPI_RW_MULTI_MAX_LEN ((64 * 1024) - 32) - -/* - * Max size for the pre-allocated buffers is the max - * possible read/write length + 32 bytes for the SPI - * read/write command header itself. - */ -#define WCD_SPI_RW_MAX_BUF_SIZE (WCD_SPI_RW_MULTI_MAX_LEN + 32) - -/* Alignment requirements */ -#define WCD_SPI_RW_MIN_ALIGN WCD_SPI_WORD_BYTE_CNT -#define WCD_SPI_RW_MULTI_ALIGN (16) - -/* Status mask bits */ -#define WCD_SPI_CLK_STATE_ENABLED BIT(0) -#define WCD_SPI_IS_SUSPENDED BIT(1) - -/* Locking related */ -#define WCD_SPI_MUTEX_LOCK(spi, lock) \ -{ \ - dev_vdbg(&spi->dev, "%s: mutex_lock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_lock(&lock); \ -} - -#define WCD_SPI_MUTEX_UNLOCK(spi, lock) \ -{ \ - dev_vdbg(&spi->dev, "%s: mutex_unlock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_unlock(&lock); \ -} - -struct wcd_spi_debug_data { - struct dentry *dir; - u32 addr; - u32 size; -}; - -struct wcd_spi_priv { - struct spi_device *spi; - u32 mem_base_addr; - - struct regmap *regmap; - - /* Message for single transfer */ - struct spi_message msg1; - struct spi_transfer xfer1; - - /* Message for two transfers */ - struct spi_message msg2; - struct spi_transfer xfer2[2]; - - /* Register access related */ - u32 reg_bytes; - u32 val_bytes; - - /* Clock requests related */ - struct mutex clk_mutex; - int clk_users; - unsigned long status_mask; - struct delayed_work clk_dwork; - - /* Transaction related */ - struct mutex xfer_mutex; - - struct device *m_dev; - struct wdsp_mgr_ops *m_ops; - - /* Debugfs related information */ - struct wcd_spi_debug_data debug_data; - - /* Completion object to indicate system resume completion */ - struct completion resume_comp; - - /* Buffers to hold memory used for transfers */ - void *tx_buf; - void *rx_buf; -}; - -enum xfer_request { - WCD_SPI_XFER_WRITE, - WCD_SPI_XFER_READ, -}; - - -static char *wcd_spi_xfer_req_str(enum xfer_request req) -{ - if (req == WCD_SPI_XFER_WRITE) - return "xfer_write"; - else if (req == WCD_SPI_XFER_READ) - return "xfer_read"; - else - return "xfer_invalid"; -} - -static void wcd_spi_reinit_xfer(struct spi_transfer *xfer) -{ - xfer->tx_buf = NULL; - xfer->rx_buf = NULL; - xfer->delay_usecs = 0; - xfer->len = 0; -} - -static bool wcd_spi_is_suspended(struct wcd_spi_priv *wcd_spi) -{ - return test_bit(WCD_SPI_IS_SUSPENDED, &wcd_spi->status_mask); -} - -static bool wcd_spi_can_suspend(struct wcd_spi_priv *wcd_spi) -{ - struct spi_device *spi = wcd_spi->spi; - - if (wcd_spi->clk_users > 0 || - test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) { - dev_err(&spi->dev, "%s: cannot suspend, clk_users = %d\n", - __func__, wcd_spi->clk_users); - return false; - } - - return true; -} - -static int wcd_spi_wait_for_resume(struct wcd_spi_priv *wcd_spi) -{ - struct spi_device *spi = wcd_spi->spi; - int rc = 0; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - /* If the system is already in resumed state, return right away */ - if (!wcd_spi_is_suspended(wcd_spi)) - goto done; - - /* If suspended then wait for resume to happen */ - reinit_completion(&wcd_spi->resume_comp); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - rc = wait_for_completion_timeout(&wcd_spi->resume_comp, - msecs_to_jiffies(WCD_SPI_RESUME_TIMEOUT_MS)); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (rc == 0) { - dev_err(&spi->dev, "%s: failed to resume in %u msec\n", - __func__, WCD_SPI_RESUME_TIMEOUT_MS); - rc = -EIO; - goto done; - } - - dev_dbg(&spi->dev, "%s: resume successful\n", __func__); - rc = 0; -done: - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - return rc; -} - -static int wcd_spi_read_single(struct spi_device *spi, - u32 remote_addr, u32 *val) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *tx_xfer = &wcd_spi->xfer2[0]; - struct spi_transfer *rx_xfer = &wcd_spi->xfer2[1]; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - u32 frame = 0; - int ret; - - dev_dbg(&spi->dev, "%s: remote_addr = 0x%x\n", - __func__, remote_addr); - - if (!tx_buf) { - dev_err(&spi->dev, "%s: tx_buf not allocated\n", - __func__); - return -ENOMEM; - } - - frame |= WCD_SPI_READ_FRAME_OPCODE; - frame |= remote_addr & WCD_CMD_ADDR_MASK; - - wcd_spi_reinit_xfer(tx_xfer); - frame = cpu_to_be32(frame); - memcpy(tx_buf, &frame, sizeof(frame)); - tx_xfer->tx_buf = tx_buf; - tx_xfer->len = WCD_SPI_READ_SINGLE_LEN; - - wcd_spi_reinit_xfer(rx_xfer); - rx_xfer->rx_buf = rx_buf; - rx_xfer->len = sizeof(*val); - - ret = spi_sync(spi, &wcd_spi->msg2); - if (ret) - dev_err(&spi->dev, "%s: spi_sync failed, err %d\n", - __func__, ret); - else - memcpy((u8*) val, rx_buf, sizeof(*val)); - - return ret; -} - -static int wcd_spi_read_multi(struct spi_device *spi, - u32 remote_addr, u8 *data, - size_t len) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - u32 frame = 0; - int ret; - - dev_dbg(&spi->dev, "%s: addr 0x%x, len = %zd\n", - __func__, remote_addr, len); - - frame |= WCD_SPI_FREAD_FRAME_OPCODE; - frame |= remote_addr & WCD_CMD_ADDR_MASK; - - if (!tx_buf || !rx_buf) { - dev_err(&spi->dev, "%s: %s not allocated\n", __func__, - (!tx_buf) ? "tx_buf" : "rx_buf"); - return -ENOMEM; - } - - wcd_spi_reinit_xfer(xfer); - frame = cpu_to_be32(frame); - memcpy(tx_buf, &frame, sizeof(frame)); - xfer->tx_buf = tx_buf; - xfer->rx_buf = rx_buf; - xfer->len = WCD_SPI_CMD_FREAD_LEN + len; - - ret = spi_sync(spi, &wcd_spi->msg1); - if (ret) { - dev_err(&spi->dev, "%s: failed, err = %d\n", - __func__, ret); - goto done; - } - - memcpy(data, rx_buf + WCD_SPI_CMD_FREAD_LEN, len); -done: - return ret; -} - -static int wcd_spi_write_single(struct spi_device *spi, - u32 remote_addr, u32 val) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u8 *tx_buf = wcd_spi->tx_buf; - u32 frame = 0; - - dev_dbg(&spi->dev, "%s: remote_addr = 0x%x, val = 0x%x\n", - __func__, remote_addr, val); - - memset(tx_buf, 0, WCD_SPI_WRITE_SINGLE_LEN); - frame |= WCD_SPI_WRITE_FRAME_OPCODE; - frame |= (remote_addr & WCD_CMD_ADDR_MASK); - - frame = cpu_to_be32(frame); - memcpy(tx_buf, &frame, sizeof(frame)); - memcpy(tx_buf + sizeof(frame), &val, sizeof(val)); - - wcd_spi_reinit_xfer(xfer); - xfer->tx_buf = tx_buf; - xfer->len = WCD_SPI_WRITE_SINGLE_LEN; - - return spi_sync(spi, &wcd_spi->msg1); -} - -static int wcd_spi_write_multi(struct spi_device *spi, - u32 remote_addr, u8 *data, - size_t len) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u32 frame = 0; - u8 *tx_buf = wcd_spi->tx_buf; - int xfer_len, ret; - - dev_dbg(&spi->dev, "%s: addr = 0x%x len = %zd\n", - __func__, remote_addr, len); - - frame |= WCD_SPI_WRITE_FRAME_OPCODE; - frame |= (remote_addr & WCD_CMD_ADDR_MASK); - - frame = cpu_to_be32(frame); - xfer_len = len + sizeof(frame); - - if (!tx_buf) { - dev_err(&spi->dev, "%s: tx_buf not allocated\n", - __func__); - return -ENOMEM; - } - - memcpy(tx_buf, &frame, sizeof(frame)); - memcpy(tx_buf + sizeof(frame), data, len); - - wcd_spi_reinit_xfer(xfer); - xfer->tx_buf = tx_buf; - xfer->len = xfer_len; - - ret = spi_sync(spi, &wcd_spi->msg1); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed, addr = 0x%x, len = %zd\n", - __func__, remote_addr, len); - return ret; -} - -static int wcd_spi_transfer_split(struct spi_device *spi, - struct wcd_spi_msg *data_msg, - enum xfer_request xfer_req) -{ - u32 addr = data_msg->remote_addr; - u8 *data = data_msg->data; - int remain_size = data_msg->len; - int to_xfer, loop_cnt, ret = 0; - - /* Perform single writes until multi word alignment is met */ - loop_cnt = 1; - while (remain_size && - !IS_ALIGNED(addr, WCD_SPI_RW_MULTI_ALIGN)) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_single(spi, addr, - (*(u32 *)data)); - else - ret = wcd_spi_read_single(spi, addr, - (u32 *)data); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail iter(%d) start-word addr (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - loop_cnt, addr); - goto done; - } - - addr += WCD_SPI_WORD_BYTE_CNT; - data += WCD_SPI_WORD_BYTE_CNT; - remain_size -= WCD_SPI_WORD_BYTE_CNT; - loop_cnt++; - } - - /* Perform multi writes for max allowed multi writes */ - loop_cnt = 1; - while (remain_size >= WCD_SPI_RW_MULTI_MAX_LEN) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_multi(spi, addr, data, - WCD_SPI_RW_MULTI_MAX_LEN); - else - ret = wcd_spi_read_multi(spi, addr, data, - WCD_SPI_RW_MULTI_MAX_LEN); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail iter(%d) max-write addr (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - loop_cnt, addr); - goto done; - } - - addr += WCD_SPI_RW_MULTI_MAX_LEN; - data += WCD_SPI_RW_MULTI_MAX_LEN; - remain_size -= WCD_SPI_RW_MULTI_MAX_LEN; - loop_cnt++; - } - - /* - * Perform write for max possible data that is multiple - * of the minimum size for multi-write commands. - */ - to_xfer = remain_size - (remain_size % WCD_SPI_RW_MULTI_MIN_LEN); - if (remain_size >= WCD_SPI_RW_MULTI_MIN_LEN && - to_xfer > 0) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_multi(spi, addr, data, to_xfer); - else - ret = wcd_spi_read_multi(spi, addr, data, to_xfer); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail write addr (0x%x), size (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - addr, to_xfer); - goto done; - } - - addr += to_xfer; - data += to_xfer; - remain_size -= to_xfer; - } - - /* Perform single writes for the last remaining data */ - loop_cnt = 1; - while (remain_size > 0) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_single(spi, addr, (*((u32 *)data))); - else - ret = wcd_spi_read_single(spi, addr, (u32 *) data); - if (ret < 0) { - dev_err(&spi->dev, - "%s: %s fail iter(%d) end-write addr (0x%x)\n", - __func__, wcd_spi_xfer_req_str(xfer_req), - loop_cnt, addr); - goto done; - } - - addr += WCD_SPI_WORD_BYTE_CNT; - data += WCD_SPI_WORD_BYTE_CNT; - remain_size -= WCD_SPI_WORD_BYTE_CNT; - loop_cnt++; - } - -done: - return ret; -} - -static int wcd_spi_cmd_nop(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - u8 *tx_buf = wcd_spi->tx_buf; - - tx_buf[0] = WCD_SPI_CMD_NOP; - - return spi_write(spi, tx_buf, WCD_SPI_CMD_NOP_LEN); -} - -static int wcd_spi_cmd_clkreq(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *xfer = &wcd_spi->xfer1; - u8 *tx_buf = wcd_spi->tx_buf; - u8 cmd[WCD_SPI_CMD_CLKREQ_LEN] = { - WCD_SPI_CMD_CLKREQ, - 0xBA, 0x80, 0x00}; - - memcpy(tx_buf, cmd, WCD_SPI_CMD_CLKREQ_LEN); - wcd_spi_reinit_xfer(xfer); - xfer->tx_buf = tx_buf; - xfer->len = WCD_SPI_CMD_CLKREQ_LEN; - xfer->delay_usecs = WCD_SPI_CLKREQ_DELAY_USECS; - - return spi_sync(spi, &wcd_spi->msg1); -} - -static int wcd_spi_cmd_wr_en(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - u8 *tx_buf = wcd_spi->tx_buf; - - tx_buf[0] = WCD_SPI_CMD_WREN; - - return spi_write(spi, tx_buf, WCD_SPI_CMD_WREN_LEN); -} - -static int wcd_spi_cmd_rdsr(struct spi_device *spi, - u32 *rdsr_status) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *tx_xfer = &wcd_spi->xfer2[0]; - struct spi_transfer *rx_xfer = &wcd_spi->xfer2[1]; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - int ret; - - tx_buf[0] = WCD_SPI_CMD_RDSR; - wcd_spi_reinit_xfer(tx_xfer); - tx_xfer->tx_buf = tx_buf; - tx_xfer->len = WCD_SPI_OPCODE_LEN; - - memset(rx_buf, 0, sizeof(*rdsr_status)); - wcd_spi_reinit_xfer(rx_xfer); - rx_xfer->rx_buf = rx_buf; - rx_xfer->len = sizeof(*rdsr_status); - - ret = spi_sync(spi, &wcd_spi->msg2); - if (ret < 0) { - dev_err(&spi->dev, "%s: RDSR failed, err = %d\n", - __func__, ret); - goto done; - } - - *rdsr_status = be32_to_cpu(*((u32*)rx_buf)); - - dev_dbg(&spi->dev, "%s: RDSR success, value = 0x%x\n", - __func__, *rdsr_status); -done: - return ret; -} - -static int wcd_spi_clk_enable(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - u32 rd_status = 0; - - ret = wcd_spi_cmd_nop(spi); - if (ret < 0) { - dev_err(&spi->dev, "%s: NOP1 failed, err = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_spi_cmd_clkreq(spi); - if (ret < 0) { - dev_err(&spi->dev, "%s: CLK_REQ failed, err = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_spi_cmd_nop(spi); - if (ret < 0) { - dev_err(&spi->dev, "%s: NOP2 failed, err = %d\n", - __func__, ret); - goto done; - } - wcd_spi_cmd_rdsr(spi, &rd_status); - /* - * Read status zero means reads are not - * happenning on the bus, possibly because - * clock request failed. - */ - if (rd_status) { - set_bit(WCD_SPI_CLK_STATE_ENABLED, - &wcd_spi->status_mask); - } else { - dev_err(&spi->dev, "%s: RDSR status is zero\n", - __func__); - ret = -EIO; - } -done: - return ret; -} - -static int wcd_spi_clk_disable(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - - ret = wcd_spi_write_single(spi, WCD_SPI_ADDR_IPC_CTL_HOST, 0x01); - if (ret < 0) - dev_err(&spi->dev, "%s: Failed, err = %d\n", - __func__, ret); - /* - * clear this bit even if clock disable failed - * as the source clocks might get turned off. - */ - clear_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask); - - return ret; -} - -static int wcd_spi_clk_ctrl(struct spi_device *spi, - bool request, u32 flags) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret = 0; - const char *delay_str; - - delay_str = (flags == WCD_SPI_CLK_FLAG_DELAYED) ? - "delayed" : "immediate"; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - - /* Reject any unbalanced disable request */ - if (wcd_spi->clk_users < 0 || - (!request && wcd_spi->clk_users == 0)) { - dev_err(&spi->dev, "%s: Unbalanced clk_users %d for %s\n", - __func__, wcd_spi->clk_users, - request ? "enable" : "disable"); - ret = -EINVAL; - - /* Reset the clk_users to 0 */ - wcd_spi->clk_users = 0; - - goto done; - } - - if (request == WCD_SPI_CLK_ENABLE) { - /* - * If the SPI bus is suspended, then return error - * as the transaction cannot be completed. - */ - if (wcd_spi_is_suspended(wcd_spi)) { - dev_err(&spi->dev, - "%s: SPI suspended, cannot enable clk\n", - __func__); - ret = -EIO; - goto done; - } - - /* Cancel the disable clk work */ - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - cancel_delayed_work_sync(&wcd_spi->clk_dwork); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - - wcd_spi->clk_users++; - - /* - * If clk state is already set, - * then clk wasnt really disabled - */ - if (test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) - goto done; - else if (wcd_spi->clk_users == 1) - ret = wcd_spi_clk_enable(spi); - - } else { - wcd_spi->clk_users--; - - /* Clock is still voted for */ - if (wcd_spi->clk_users > 0) - goto done; - - /* - * If we are here, clk_users must be 0 and needs - * to be disabled. Call the disable based on the - * flags. - */ - if (flags == WCD_SPI_CLK_FLAG_DELAYED) { - schedule_delayed_work(&wcd_spi->clk_dwork, - msecs_to_jiffies(WCD_SPI_CLK_OFF_TIMER_MS)); - } else { - ret = wcd_spi_clk_disable(spi); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed to disable clk err = %d\n", - __func__, ret); - } - } - -done: - dev_dbg(&spi->dev, "%s: updated clk_users = %d, request_%s %s\n", - __func__, wcd_spi->clk_users, request ? "enable" : "disable", - request ? "" : delay_str); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - - return ret; -} - -static int wcd_spi_init(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_ENABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) - goto done; - - ret = wcd_spi_cmd_wr_en(spi); - if (ret < 0) - goto err_wr_en; - - /* - * In case spi_init is called after component deinit, - * it is possible hardware register state is also reset. - * Sync the regcache here so hardware state is updated - * to reflect the cache. - */ - regcache_sync(wcd_spi->regmap); - - regmap_write(wcd_spi->regmap, WCD_SPI_SLAVE_CONFIG, - 0x0F3D0800); - - /* Write the MTU to max allowed size */ - regmap_update_bits(wcd_spi->regmap, - WCD_SPI_SLAVE_TRNS_LEN, - 0xFFFF0000, 0xFFFF0000); -err_wr_en: - wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_DISABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); -done: - return ret; -} - -static void wcd_spi_clk_work(struct work_struct *work) -{ - struct delayed_work *dwork; - struct wcd_spi_priv *wcd_spi; - struct spi_device *spi; - int ret; - - dwork = to_delayed_work(work); - wcd_spi = container_of(dwork, struct wcd_spi_priv, clk_dwork); - spi = wcd_spi->spi; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - ret = wcd_spi_clk_disable(spi); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed to disable clk, err = %d\n", - __func__, ret); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); -} - -static int __wcd_spi_data_xfer(struct spi_device *spi, - struct wcd_spi_msg *msg, - enum xfer_request xfer_req) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret; - - /* Check for minimum alignment requirements */ - if (!IS_ALIGNED(msg->remote_addr, WCD_SPI_RW_MIN_ALIGN)) { - dev_err(&spi->dev, - "%s addr 0x%x is not aligned to 0x%x\n", - __func__, msg->remote_addr, WCD_SPI_RW_MIN_ALIGN); - return -EINVAL; - } else if (msg->len % WCD_SPI_WORD_BYTE_CNT) { - dev_err(&spi->dev, - "%s len 0x%zx is not multiple of %d\n", - __func__, msg->len, WCD_SPI_WORD_BYTE_CNT); - return -EINVAL; - } - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (wcd_spi_is_suspended(wcd_spi)) { - dev_dbg(&spi->dev, - "%s: SPI suspended, cannot perform transfer\n", - __func__); - ret = -EIO; - goto done; - } - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->xfer_mutex); - if (msg->len == WCD_SPI_WORD_BYTE_CNT) { - if (xfer_req == WCD_SPI_XFER_WRITE) - ret = wcd_spi_write_single(spi, msg->remote_addr, - (*((u32 *)msg->data))); - else - ret = wcd_spi_read_single(spi, msg->remote_addr, - (u32 *) msg->data); - } else { - ret = wcd_spi_transfer_split(spi, msg, xfer_req); - } - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->xfer_mutex); -done: - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - return ret; -} - -static int wcd_spi_data_xfer(struct spi_device *spi, - struct wcd_spi_msg *msg, - enum xfer_request req) -{ - int ret, ret1; - - if (msg->len <= 0) { - dev_err(&spi->dev, "%s: Invalid size %zd\n", - __func__, msg->len); - return -EINVAL; - } - - /* Request for clock */ - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_ENABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) { - dev_err(&spi->dev, "%s: clk enable failed %d\n", - __func__, ret); - goto done; - } - - /* Perform the transaction */ - ret = __wcd_spi_data_xfer(spi, msg, req); - if (ret < 0) - dev_err(&spi->dev, - "%s: Failed %s, addr = 0x%x, size = 0x%zx, err = %d\n", - __func__, wcd_spi_xfer_req_str(req), - msg->remote_addr, msg->len, ret); - - /* Release the clock even if xfer failed */ - ret1 = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_DISABLE, - WCD_SPI_CLK_FLAG_DELAYED); - if (ret1 < 0) - dev_err(&spi->dev, "%s: clk disable failed %d\n", - __func__, ret1); -done: - return ret; -} - -/* - * wcd_spi_data_write: Write data to WCD SPI - * @spi: spi_device struct - * @msg: msg that needs to be written to WCD - * - * This API writes length of data to address specified. These details - * about the write are encapsulated in @msg. Write size should be multiple - * of 4 bytes and write address should be 4-byte aligned. - */ -static int wcd_spi_data_write(struct spi_device *spi, - struct wcd_spi_msg *msg) -{ - if (!spi || !msg) { - pr_err("%s: Invalid %s\n", __func__, - (!spi) ? "spi device" : "msg"); - return -EINVAL; - } - - dev_dbg_ratelimited(&spi->dev, "%s: addr = 0x%x, len = %zu\n", - __func__, msg->remote_addr, msg->len); - return wcd_spi_data_xfer(spi, msg, WCD_SPI_XFER_WRITE); -} - -/* - * wcd_spi_data_read: Read data from WCD SPI - * @spi: spi_device struct - * @msg: msg that needs to be read from WCD - * - * This API reads length of data from address specified. These details - * about the read are encapsulated in @msg. Read size should be multiple - * of 4 bytes and read address should be 4-byte aligned. - */ -static int wcd_spi_data_read(struct spi_device *spi, - struct wcd_spi_msg *msg) -{ - if (!spi || !msg) { - pr_err("%s: Invalid %s\n", __func__, - (!spi) ? "spi device" : "msg"); - return -EINVAL; - } - - dev_dbg_ratelimited(&spi->dev, "%s: addr = 0x%x,len = %zu\n", - __func__, msg->remote_addr, msg->len); - return wcd_spi_data_xfer(spi, msg, WCD_SPI_XFER_READ); -} - -static int wdsp_spi_dload_section(struct spi_device *spi, - void *data) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wdsp_img_section *sec = data; - struct wcd_spi_msg msg; - int ret; - - dev_dbg(&spi->dev, "%s: addr = 0x%x, size = 0x%zx\n", - __func__, sec->addr, sec->size); - - msg.remote_addr = sec->addr + wcd_spi->mem_base_addr; - msg.data = sec->data; - msg.len = sec->size; - - ret = __wcd_spi_data_xfer(spi, &msg, WCD_SPI_XFER_WRITE); - if (ret < 0) - dev_err(&spi->dev, "%s: fail addr (0x%x) size (0x%zx)\n", - __func__, msg.remote_addr, msg.len); - return ret; -} - -static int wdsp_spi_read_section(struct spi_device *spi, void *data) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wdsp_img_section *sec = data; - struct wcd_spi_msg msg; - int ret; - - msg.remote_addr = sec->addr + wcd_spi->mem_base_addr; - msg.data = sec->data; - msg.len = sec->size; - - dev_dbg(&spi->dev, "%s: addr = 0x%x, size = 0x%zx\n", - __func__, msg.remote_addr, msg.len); - - ret = wcd_spi_data_xfer(spi, &msg, WCD_SPI_XFER_READ); - if (ret < 0) - dev_err(&spi->dev, "%s: fail addr (0x%x) size (0x%zx)\n", - __func__, msg.remote_addr, msg.len); - return ret; -} - -static int wdsp_spi_event_handler(struct device *dev, void *priv_data, - enum wdsp_event_type event, - void *data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_ops *spi_ops; - int ret = 0; - - dev_dbg(&spi->dev, "%s: event type %d\n", - __func__, event); - - switch (event) { - case WDSP_EVENT_POST_SHUTDOWN: - cancel_delayed_work_sync(&wcd_spi->clk_dwork); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) - wcd_spi_clk_disable(spi); - wcd_spi->clk_users = 0; - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - break; - - case WDSP_EVENT_PRE_DLOAD_CODE: - case WDSP_EVENT_PRE_DLOAD_DATA: - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_ENABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) - dev_err(&spi->dev, "%s: clk_req failed %d\n", - __func__, ret); - break; - - case WDSP_EVENT_POST_DLOAD_CODE: - case WDSP_EVENT_POST_DLOAD_DATA: - case WDSP_EVENT_DLOAD_FAILED: - - ret = wcd_spi_clk_ctrl(spi, WCD_SPI_CLK_DISABLE, - WCD_SPI_CLK_FLAG_IMMEDIATE); - if (ret < 0) - dev_err(&spi->dev, "%s: clk unvote failed %d\n", - __func__, ret); - break; - - case WDSP_EVENT_DLOAD_SECTION: - ret = wdsp_spi_dload_section(spi, data); - break; - - case WDSP_EVENT_READ_SECTION: - ret = wdsp_spi_read_section(spi, data); - break; - - case WDSP_EVENT_SUSPEND: - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (!wcd_spi_can_suspend(wcd_spi)) - ret = -EBUSY; - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - break; - - case WDSP_EVENT_RESUME: - ret = wcd_spi_wait_for_resume(wcd_spi); - break; - - case WDSP_EVENT_GET_DEVOPS: - if (!data) { - dev_err(&spi->dev, "%s: invalid data\n", - __func__); - ret = -EINVAL; - break; - } - - spi_ops = (struct wcd_spi_ops *) data; - spi_ops->spi_dev = spi; - spi_ops->read_dev = wcd_spi_data_read; - spi_ops->write_dev = wcd_spi_data_write; - break; - - default: - dev_dbg(&spi->dev, "%s: Unhandled event %d\n", - __func__, event); - break; - } - - return ret; -} - -static int wcd_spi_bus_gwrite(void *context, const void *reg, - size_t reg_len, const void *val, - size_t val_len) -{ - struct device *dev = context; - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - u8 *tx_buf = wcd_spi->tx_buf; - - if (!reg || !val || reg_len != wcd_spi->reg_bytes || - val_len != wcd_spi->val_bytes) { - dev_err(&spi->dev, - "%s: Invalid input, reg_len = %zd, val_len = %zd", - __func__, reg_len, val_len); - return -EINVAL; - } - - if (wcd_spi_is_suspended(wcd_spi)) { - dev_err(&spi->dev, - "%s: SPI suspended, cannot enable clk\n", - __func__); - return -EIO; - } - memset(tx_buf, 0, WCD_SPI_CMD_IRW_LEN); - tx_buf[0] = WCD_SPI_CMD_IRW; - tx_buf[1] = *((u8 *)reg); - memcpy(tx_buf + WCD_SPI_OPCODE_LEN + reg_len, - val, val_len); - - return spi_write(spi, tx_buf, WCD_SPI_CMD_IRW_LEN); -} - -static int wcd_spi_bus_write(void *context, const void *data, - size_t count) -{ - struct device *dev = context; - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - if (count < (wcd_spi->reg_bytes + wcd_spi->val_bytes)) { - dev_err(&spi->dev, "%s: Invalid size %zd\n", - __func__, count); - WARN_ON(1); - return -EINVAL; - } - - return wcd_spi_bus_gwrite(context, data, wcd_spi->reg_bytes, - data + wcd_spi->reg_bytes, - count - wcd_spi->reg_bytes); -} - -static int wcd_spi_bus_read(void *context, const void *reg, - size_t reg_len, void *val, - size_t val_len) -{ - struct device *dev = context; - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct spi_transfer *tx_xfer = &wcd_spi->xfer2[0]; - struct spi_transfer *rx_xfer = &wcd_spi->xfer2[1]; - u8 *tx_buf = wcd_spi->tx_buf; - u8 *rx_buf = wcd_spi->rx_buf; - int ret = 0; - - if (!reg || !val || reg_len != wcd_spi->reg_bytes || - val_len != wcd_spi->val_bytes) { - dev_err(&spi->dev, - "%s: Invalid input, reg_len = %zd, val_len = %zd", - __func__, reg_len, val_len); - return -EINVAL; - } - if (wcd_spi_is_suspended(wcd_spi)) { - dev_err(&spi->dev, - "%s: SPI suspended, cannot enable clk\n", - __func__); - return -EIO; - } - - memset(tx_buf, 0, WCD_SPI_CMD_IRR_LEN); - tx_buf[0] = WCD_SPI_CMD_IRR; - tx_buf[1] = *((u8 *)reg); - - wcd_spi_reinit_xfer(tx_xfer); - tx_xfer->tx_buf = tx_buf; - tx_xfer->rx_buf = NULL; - tx_xfer->len = WCD_SPI_CMD_IRR_LEN; - - wcd_spi_reinit_xfer(rx_xfer); - rx_xfer->tx_buf = NULL; - rx_xfer->rx_buf = rx_buf; - rx_xfer->len = val_len; - - ret = spi_sync(spi, &wcd_spi->msg2); - if (ret) { - dev_err(&spi->dev, "%s: spi_sync failed, err %d\n", - __func__, ret); - goto done; - } - - memcpy(val, rx_buf, val_len); - -done: - return ret; -} - -static struct regmap_bus wcd_spi_regmap_bus = { - .write = wcd_spi_bus_write, - .gather_write = wcd_spi_bus_gwrite, - .read = wcd_spi_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_BIG, -}; - -static int wcd_spi_state_show(struct seq_file *f, void *ptr) -{ - struct spi_device *spi = f->private; - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - const char *clk_state, *clk_mutex, *xfer_mutex; - - if (test_bit(WCD_SPI_CLK_STATE_ENABLED, &wcd_spi->status_mask)) - clk_state = "enabled"; - else - clk_state = "disabled"; - - clk_mutex = mutex_is_locked(&wcd_spi->clk_mutex) ? - "locked" : "unlocked"; - - xfer_mutex = mutex_is_locked(&wcd_spi->xfer_mutex) ? - "locked" : "unlocked"; - - seq_printf(f, "clk_state = %s\nclk_users = %d\n" - "clk_mutex = %s\nxfer_mutex = %s\n", - clk_state, wcd_spi->clk_users, clk_mutex, - xfer_mutex); - return 0; -} - -static int wcd_spi_state_open(struct inode *inode, struct file *file) -{ - return single_open(file, wcd_spi_state_show, inode->i_private); -} - -static const struct file_operations state_fops = { - .open = wcd_spi_state_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static ssize_t wcd_spi_debugfs_mem_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - struct spi_device *spi = file->private_data; - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_debug_data *dbg_data = &wcd_spi->debug_data; - struct wcd_spi_msg msg; - ssize_t buf_size, read_count = 0; - char *buf; - int ret; - - if (*ppos < 0 || !count) - return -EINVAL; - - if (dbg_data->size == 0 || dbg_data->addr == 0) { - dev_err(&spi->dev, - "%s: Invalid request, size = %u, addr = 0x%x\n", - __func__, dbg_data->size, dbg_data->addr); - return 0; - } - - buf_size = count < dbg_data->size ? count : dbg_data->size; - buf = kzalloc(buf_size, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - msg.data = buf; - msg.remote_addr = dbg_data->addr; - msg.len = buf_size; - msg.flags = 0; - - ret = wcd_spi_data_read(spi, &msg); - if (ret < 0) { - dev_err(&spi->dev, - "%s: Failed to read %zu bytes from addr 0x%x\n", - __func__, buf_size, msg.remote_addr); - goto done; - } - - read_count = simple_read_from_buffer(ubuf, count, ppos, buf, buf_size); - -done: - kfree(buf); - if (ret < 0) - return ret; - else - return read_count; -} - -static const struct file_operations mem_read_fops = { - .open = simple_open, - .read = wcd_spi_debugfs_mem_read, -}; - -static int wcd_spi_debugfs_init(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_debug_data *dbg_data = &wcd_spi->debug_data; - int rc = 0; - - dbg_data->dir = debugfs_create_dir("wcd_spi", NULL); - if (IS_ERR_OR_NULL(dbg_data->dir)) { - dbg_data->dir = NULL; - rc = -ENODEV; - goto done; - } - - debugfs_create_file("state", 0444, dbg_data->dir, spi, &state_fops); - debugfs_create_u32("addr", 0644, dbg_data->dir, - &dbg_data->addr); - debugfs_create_u32("size", 0644, dbg_data->dir, - &dbg_data->size); - - debugfs_create_file("mem_read", 0444, dbg_data->dir, - spi, &mem_read_fops); -done: - return rc; -} - - -static const struct reg_default wcd_spi_defaults[] = { - {WCD_SPI_SLAVE_SANITY, 0xDEADBEEF}, - {WCD_SPI_SLAVE_DEVICE_ID, 0x00500000}, - {WCD_SPI_SLAVE_STATUS, 0x80100000}, - {WCD_SPI_SLAVE_CONFIG, 0x0F200808}, - {WCD_SPI_SLAVE_SW_RESET, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_STATUS, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_EN, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_CLR, 0x00000000}, - {WCD_SPI_SLAVE_IRQ_FORCE, 0x00000000}, - {WCD_SPI_SLAVE_TX, 0x00000000}, - {WCD_SPI_SLAVE_TEST_BUS_DATA, 0x00000000}, - {WCD_SPI_SLAVE_TEST_BUS_CTRL, 0x00000000}, - {WCD_SPI_SLAVE_SW_RST_IRQ, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_CFG, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_DATA_MOSI, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_DATA_CS_N, 0x00000000}, - {WCD_SPI_SLAVE_CHAR_DATA_MISO, 0x00000000}, - {WCD_SPI_SLAVE_TRNS_BYTE_CNT, 0x00000000}, - {WCD_SPI_SLAVE_TRNS_LEN, 0x00000000}, - {WCD_SPI_SLAVE_FIFO_LEVEL, 0x00000000}, - {WCD_SPI_SLAVE_GENERICS, 0x80000000}, - {WCD_SPI_SLAVE_EXT_BASE_ADDR, 0x00000000}, -}; - -static bool wcd_spi_is_volatile_reg(struct device *dev, - unsigned int reg) -{ - switch (reg) { - case WCD_SPI_SLAVE_SANITY: - case WCD_SPI_SLAVE_STATUS: - case WCD_SPI_SLAVE_IRQ_STATUS: - case WCD_SPI_SLAVE_TX: - case WCD_SPI_SLAVE_SW_RST_IRQ: - case WCD_SPI_SLAVE_TRNS_BYTE_CNT: - case WCD_SPI_SLAVE_FIFO_LEVEL: - case WCD_SPI_SLAVE_GENERICS: - return true; - } - - return false; -} - -static bool wcd_spi_is_readable_reg(struct device *dev, - unsigned int reg) -{ - switch (reg) { - case WCD_SPI_SLAVE_SW_RESET: - case WCD_SPI_SLAVE_IRQ_CLR: - case WCD_SPI_SLAVE_IRQ_FORCE: - return false; - } - - return true; -} - -static struct regmap_config wcd_spi_regmap_cfg = { - .reg_bits = 8, - .val_bits = 32, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd_spi_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd_spi_defaults), - .max_register = WCD_SPI_MAX_REGISTER, - .volatile_reg = wcd_spi_is_volatile_reg, - .readable_reg = wcd_spi_is_readable_reg, -}; - -static int wdsp_spi_init(struct device *dev, void *priv_data) -{ - struct spi_device *spi = to_spi_device(dev); - int ret; - - ret = wcd_spi_init(spi); - if (ret < 0) - dev_err(&spi->dev, "%s: Init failed, err = %d\n", - __func__, ret); - return ret; -} - -static int wdsp_spi_deinit(struct device *dev, void *priv_data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - /* - * Deinit means the hardware is reset. Mark the cache - * as dirty here, so init will sync the cache - */ - regcache_mark_dirty(wcd_spi->regmap); - - return 0; -} - -static struct wdsp_cmpnt_ops wdsp_spi_ops = { - .init = wdsp_spi_init, - .deinit = wdsp_spi_deinit, - .event_handler = wdsp_spi_event_handler, -}; - -static int wcd_spi_component_bind(struct device *dev, - struct device *master, - void *data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int ret = 0; - - wcd_spi->m_dev = master; - wcd_spi->m_ops = data; - - if (wcd_spi->m_ops && - wcd_spi->m_ops->register_cmpnt_ops) - ret = wcd_spi->m_ops->register_cmpnt_ops(master, dev, - wcd_spi, - &wdsp_spi_ops); - if (ret) { - dev_err(dev, "%s: register_cmpnt_ops failed, err = %d\n", - __func__, ret); - goto done; - } - - wcd_spi->reg_bytes = DIV_ROUND_UP(wcd_spi_regmap_cfg.reg_bits, 8); - wcd_spi->val_bytes = DIV_ROUND_UP(wcd_spi_regmap_cfg.val_bits, 8); - - wcd_spi->regmap = devm_regmap_init(&spi->dev, &wcd_spi_regmap_bus, - &spi->dev, &wcd_spi_regmap_cfg); - if (IS_ERR(wcd_spi->regmap)) { - ret = PTR_ERR(wcd_spi->regmap); - dev_err(&spi->dev, "%s: Failed to allocate regmap, err = %d\n", - __func__, ret); - goto done; - } - - if (wcd_spi_debugfs_init(spi)) - dev_err(&spi->dev, "%s: Failed debugfs init\n", __func__); - - spi_message_init(&wcd_spi->msg1); - spi_message_add_tail(&wcd_spi->xfer1, &wcd_spi->msg1); - - spi_message_init(&wcd_spi->msg2); - spi_message_add_tail(&wcd_spi->xfer2[0], &wcd_spi->msg2); - spi_message_add_tail(&wcd_spi->xfer2[1], &wcd_spi->msg2); - - /* Pre-allocate the buffers */ - wcd_spi->tx_buf = kzalloc(WCD_SPI_RW_MAX_BUF_SIZE, - GFP_KERNEL | GFP_DMA); - if (!wcd_spi->tx_buf) { - ret = -ENOMEM; - goto done; - } - - wcd_spi->rx_buf = kzalloc(WCD_SPI_RW_MAX_BUF_SIZE, - GFP_KERNEL | GFP_DMA); - if (!wcd_spi->rx_buf) { - kfree(wcd_spi->tx_buf); - wcd_spi->tx_buf = NULL; - ret = -ENOMEM; - goto done; - } -done: - return ret; -} - -static void wcd_spi_component_unbind(struct device *dev, - struct device *master, - void *data) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - struct wcd_spi_debug_data *dbg_data = &wcd_spi->debug_data; - - debugfs_remove_recursive(dbg_data->dir); - dbg_data->dir = NULL; - - wcd_spi->m_dev = NULL; - wcd_spi->m_ops = NULL; - - spi_transfer_del(&wcd_spi->xfer1); - spi_transfer_del(&wcd_spi->xfer2[0]); - spi_transfer_del(&wcd_spi->xfer2[1]); - - kfree(wcd_spi->tx_buf); - kfree(wcd_spi->rx_buf); - wcd_spi->tx_buf = NULL; - wcd_spi->rx_buf = NULL; -} - -static const struct component_ops wcd_spi_component_ops = { - .bind = wcd_spi_component_bind, - .unbind = wcd_spi_component_unbind, -}; - -static int wcd_spi_probe(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi; - int ret = 0; - - wcd_spi = devm_kzalloc(&spi->dev, sizeof(*wcd_spi), - GFP_KERNEL); - if (!wcd_spi) - return -ENOMEM; - - ret = of_property_read_u32(spi->dev.of_node, - "qcom,mem-base-addr", - &wcd_spi->mem_base_addr); - if (ret < 0) { - dev_err(&spi->dev, "%s: Missing %s DT entry", - __func__, "qcom,mem-base-addr"); - goto err_ret; - } - - dev_dbg(&spi->dev, - "%s: mem_base_addr 0x%x\n", __func__, wcd_spi->mem_base_addr); - - mutex_init(&wcd_spi->clk_mutex); - mutex_init(&wcd_spi->xfer_mutex); - INIT_DELAYED_WORK(&wcd_spi->clk_dwork, wcd_spi_clk_work); - init_completion(&wcd_spi->resume_comp); - - wcd_spi->spi = spi; - spi_set_drvdata(spi, wcd_spi); - - ret = component_add(&spi->dev, &wcd_spi_component_ops); - if (ret) { - dev_err(&spi->dev, "%s: component_add failed err = %d\n", - __func__, ret); - goto err_component_add; - } - - return ret; - -err_component_add: - mutex_destroy(&wcd_spi->clk_mutex); - mutex_destroy(&wcd_spi->xfer_mutex); -err_ret: - devm_kfree(&spi->dev, wcd_spi); - spi_set_drvdata(spi, NULL); - return ret; -} - -static int wcd_spi_remove(struct spi_device *spi) -{ - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - component_del(&spi->dev, &wcd_spi_component_ops); - - mutex_destroy(&wcd_spi->clk_mutex); - mutex_destroy(&wcd_spi->xfer_mutex); - - devm_kfree(&spi->dev, wcd_spi); - spi_set_drvdata(spi, NULL); - - return 0; -} - -#ifdef CONFIG_PM -static int wcd_spi_suspend(struct device *dev) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - int rc = 0; - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - if (!wcd_spi_can_suspend(wcd_spi)) { - rc = -EBUSY; - goto done; - } - - /* - * If we are here, it is okay to let the suspend go - * through for this driver. But, still need to notify - * the master to make sure all other components can suspend - * as well. - */ - if (wcd_spi->m_dev && wcd_spi->m_ops && - wcd_spi->m_ops->suspend) { - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - rc = wcd_spi->m_ops->suspend(wcd_spi->m_dev); - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - } - - if (rc == 0) - set_bit(WCD_SPI_IS_SUSPENDED, &wcd_spi->status_mask); - else - dev_dbg(&spi->dev, "%s: cannot suspend, err = %d\n", - __func__, rc); -done: - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - return rc; -} - -static int wcd_spi_resume(struct device *dev) -{ - struct spi_device *spi = to_spi_device(dev); - struct wcd_spi_priv *wcd_spi = spi_get_drvdata(spi); - - WCD_SPI_MUTEX_LOCK(spi, wcd_spi->clk_mutex); - clear_bit(WCD_SPI_IS_SUSPENDED, &wcd_spi->status_mask); - complete(&wcd_spi->resume_comp); - WCD_SPI_MUTEX_UNLOCK(spi, wcd_spi->clk_mutex); - - return 0; -} - -static const struct dev_pm_ops wcd_spi_pm_ops = { - .suspend = wcd_spi_suspend, - .resume = wcd_spi_resume, -}; -#endif - -static const struct of_device_id wcd_spi_of_match[] = { - { .compatible = "qcom,wcd-spi-v2", }, - { } -}; -MODULE_DEVICE_TABLE(of, wcd_spi_of_match); - -static struct spi_driver wcd_spi_driver = { - .driver = { - .name = "wcd-spi-v2", - .of_match_table = wcd_spi_of_match, -#ifdef CONFIG_PM - .pm = &wcd_spi_pm_ops, -#endif - }, - .probe = wcd_spi_probe, - .remove = wcd_spi_remove, -}; - -module_spi_driver(wcd_spi_driver); - -MODULE_DESCRIPTION("WCD SPI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9335-regmap.c b/techpack/audio/asoc/codecs/wcd9335-regmap.c deleted file mode 100644 index a21257c85e07..000000000000 --- a/techpack/audio/asoc/codecs/wcd9335-regmap.c +++ /dev/null @@ -1,1611 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "core.h" -#include "wcd9xxx-regmap.h" -#include "wcd9335_registers.h" - -static const struct reg_sequence wcd9335_1_x_defaults[] = { - { WCD9335_CODEC_RPM_CLK_GATE, 0x03, 0x00 }, - { WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN, 0x1f, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, 0x00, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_CTL, 0x00, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX0_INP_CFG, 0x00, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX1_INP_CFG, 0x00, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX2_INP_CFG, 0x00, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX3_INP_CFG, 0x00, 0x00 }, - { WCD9335_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 0x14, 0x00 }, - { WCD9335_CPE_SS_SS_ERROR_INT_MASK, 0x3f, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_IIR_CTL_VAL, 0x00, 0x00 }, - { WCD9335_BIAS_VBG_FINE_ADJ, 0x55, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_2, 0x6c, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_3, 0x2d, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_8, 0x6c, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_10, 0x6c, 0x00 }, - { WCD9335_SIDO_SIDO_DRIVER_2, 0x77, 0x00 }, - { WCD9335_SIDO_SIDO_DRIVER_3, 0x77, 0x00 }, - { WCD9335_SIDO_SIDO_TEST_2, 0x00, 0x00 }, - { WCD9335_MBHC_ZDET_ANA_CTL, 0x00, 0x00 }, - { WCD9335_MBHC_FSM_DEBUG, 0xc0, 0x00 }, - { WCD9335_TX_1_2_ATEST_REFCTL, 0x08, 0x00 }, - { WCD9335_TX_3_4_ATEST_REFCTL, 0x08, 0x00 }, - { WCD9335_TX_5_6_ATEST_REFCTL, 0x08, 0x00 }, - { WCD9335_FLYBACK_VNEG_CTRL_1, 0x67, 0x00 }, - { WCD9335_FLYBACK_VNEG_CTRL_4, 0x5f, 0x00 }, - { WCD9335_FLYBACK_VNEG_CTRL_9, 0x50, 0x00 }, - { WCD9335_FLYBACK_VNEG_DAC_CTRL_1, 0x65, 0x00 }, - { WCD9335_FLYBACK_VNEG_DAC_CTRL_4, 0x40, 0x00 }, - { WCD9335_RX_BIAS_HPH_PA, 0xaa, 0x00 }, - { WCD9335_RX_BIAS_HPH_LOWPOWER, 0x62, 0x00 }, - { WCD9335_HPH_PA_CTL2, 0x40, 0x00 }, - { WCD9335_HPH_L_EN, 0x00, 0x00 }, - { WCD9335_HPH_R_EN, 0x00, 0x00 }, - { WCD9335_HPH_R_ATEST, 0x50, 0x00 }, - { WCD9335_HPH_RDAC_LDO_CTL, 0x00, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_CFG0, 0x00, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_CFG1, 0x00, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC2, 0x00, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC3, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER1_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER2_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER3_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER4_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER5_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER6_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER7_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_COMPANDER8_CTL7, 0x0c, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_CFG1, 0x04, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 0x0e, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC0, 0x00, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC1, 0x00, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_MIX_SEC0, 0x00, 0x00 }, - { WCD9335_SPLINE_SRC0_CLK_RST_CTL_0, 0x00, 0x00 }, - { WCD9335_SPLINE_SRC1_CLK_RST_CTL_0, 0x00, 0x00 }, - { WCD9335_SPLINE_SRC2_CLK_RST_CTL_0, 0x00, 0x00 }, - { WCD9335_SPLINE_SRC3_CLK_RST_CTL_0, 0x00, 0x00 }, - { WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00, 0x00 }, - { WCD9335_TEST_DEBUG_NPL_DLY_TEST_1, 0x00, 0x00 }, - { WCD9335_TEST_DEBUG_NPL_DLY_TEST_2, 0x00, 0x00 }, -}; - -static const struct reg_sequence wcd9335_2_0_defaults[] = { - { WCD9335_CODEC_RPM_CLK_GATE, 0x07, 0x00 }, - { WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN, 0x3f, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, 0x01, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_CTL, 0x10, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX0_INP_CFG, 0x08, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX1_INP_CFG, 0x08, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX2_INP_CFG, 0x08, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX3_INP_CFG, 0x08, 0x00 }, - { WCD9335_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 0x13, 0x00 }, - { WCD9335_CPE_SS_SS_ERROR_INT_MASK, 0xff, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_IIR_CTL_VAL, 0x40, 0x00 }, - { WCD9335_BIAS_VBG_FINE_ADJ, 0xc5, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_2, 0x92, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_3, 0x35, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_8, 0x6e, 0x00 }, - { WCD9335_SIDO_SIDO_CCL_10, 0x6e, 0x00 }, - { WCD9335_SIDO_SIDO_DRIVER_2, 0x55, 0x00 }, - { WCD9335_SIDO_SIDO_DRIVER_3, 0x55, 0x00 }, - { WCD9335_SIDO_SIDO_TEST_2, 0x0f, 0x00 }, - { WCD9335_MBHC_ZDET_ANA_CTL, 0x0f, 0x00 }, - { WCD9335_TX_1_2_ATEST_REFCTL, 0x0a, 0x00 }, - { WCD9335_TX_3_4_ATEST_REFCTL, 0x0a, 0x00 }, - { WCD9335_TX_5_6_ATEST_REFCTL, 0x0a, 0x00 }, - { WCD9335_FLYBACK_VNEG_CTRL_1, 0xeb, 0x00 }, - { WCD9335_FLYBACK_VNEG_CTRL_4, 0x7f, 0x00 }, - { WCD9335_FLYBACK_VNEG_CTRL_9, 0x64, 0x00 }, - { WCD9335_FLYBACK_VNEG_DAC_CTRL_1, 0xed, 0x00 }, - { WCD9335_RX_BIAS_HPH_PA, 0x9a, 0x00 }, - { WCD9335_RX_BIAS_HPH_LOWPOWER, 0x82, 0x00 }, - { WCD9335_HPH_PA_CTL2, 0x50, 0x00 }, - { WCD9335_HPH_L_EN, 0x80, 0x00 }, - { WCD9335_HPH_R_EN, 0x80, 0x00 }, - { WCD9335_HPH_R_ATEST, 0x54, 0x00 }, - { WCD9335_HPH_RDAC_LDO_CTL, 0x33, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_CFG0, 0x10, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_CFG1, 0x02, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC2, 0x01, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC3, 0x3c, 0x00 }, - { WCD9335_CDC_COMPANDER1_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_COMPANDER2_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_COMPANDER3_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_COMPANDER4_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_COMPANDER5_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_COMPANDER6_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_COMPANDER7_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_COMPANDER8_CTL7, 0x08, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_CFG1, 0x44, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 0x1e, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC0, 0xfc, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC1, 0x08, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_MIX_SEC0, 0x08, 0x00 }, - { WCD9335_SPLINE_SRC0_CLK_RST_CTL_0, 0x20, 0x00 }, - { WCD9335_SPLINE_SRC1_CLK_RST_CTL_0, 0x20, 0x00 }, - { WCD9335_SPLINE_SRC2_CLK_RST_CTL_0, 0x20, 0x00 }, - { WCD9335_SPLINE_SRC3_CLK_RST_CTL_0, 0x20, 0x00 }, - { WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, 0x0c, 0x00 }, - { WCD9335_TEST_DEBUG_NPL_DLY_TEST_1, 0x10, 0x00 }, - { WCD9335_TEST_DEBUG_NPL_DLY_TEST_2, 0x60, 0x00 }, - { WCD9335_DATA_HUB_NATIVE_FIFO_SYNC, 0x00, 0x00 }, - { WCD9335_DATA_HUB_NATIVE_FIFO_STATUS, 0x00, 0x00 }, - { WCD9335_CPE_SS_TX_PP_BUF_INT_PERIOD, 0x60, 0x00 }, - { WCD9335_CPE_SS_TX_PP_CFG, 0x3C, 0x00 }, - { WCD9335_CPE_SS_SVA_CFG, 0x00, 0x00 }, - { WCD9335_MBHC_FSM_STATUS, 0x00, 0x00 }, - { WCD9335_FLYBACK_CTRL_1, 0x45, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC7, 0x25, 0x00 }, - { WCD9335_SPLINE_SRC0_STATUS, 0x00, 0x00 }, - { WCD9335_SPLINE_SRC1_STATUS, 0x00, 0x00 }, - { WCD9335_SPLINE_SRC2_STATUS, 0x00, 0x00 }, - { WCD9335_SPLINE_SRC3_STATUS, 0x00, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT, 0x00, 0x00 }, -}; - -static const struct reg_default wcd9335_defaults[] = { - /* Page #0 registers */ - { WCD9335_PAGE0_PAGE_REGISTER, 0x00 }, - { WCD9335_CODEC_RPM_CLK_BYPASS, 0x00 }, - { WCD9335_CODEC_RPM_CLK_MCLK_CFG, 0x00 }, - { WCD9335_CODEC_RPM_RST_CTL, 0x00 }, - { WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x07 }, - { WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_1, 0x00 }, - { WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_2, 0x00 }, - { WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_3, 0x00 }, - { WCD9335_CODEC_RPM_PWR_CPE_IRAM_SHUTDOWN, 0x01 }, - { WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_1, 0xff }, - { WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_2, 0xff }, - { WCD9335_CODEC_RPM_INT_MASK, 0x3f }, - { WCD9335_CODEC_RPM_INT_STATUS, 0x00 }, - { WCD9335_CODEC_RPM_INT_CLEAR, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE1, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE2, 0x07 }, - { WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE3, 0x01 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_TEST0, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_TEST1, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT1, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT2, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT3, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT4, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT5, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT6, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT7, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT8, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT9, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT10, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT11, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT12, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT13, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT14, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT15, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO, 0x0d }, - { WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_1, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_2, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_3, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL, 0xCC }, - { WCD9335_CHIP_TIER_CTRL_I2C_ACTIVE, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC1_MON_CTL, 0x06 }, - { WCD9335_CHIP_TIER_CTRL_PROC1_MON_STATUS, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_MSB, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_LSB, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC2_MON_CTL, 0x06 }, - { WCD9335_CHIP_TIER_CTRL_PROC2_MON_STATUS, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_MSB, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_LSB, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC3_MON_CTL, 0x06 }, - { WCD9335_CHIP_TIER_CTRL_PROC3_MON_STATUS, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_MSB, 0x00 }, - { WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_LSB, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL, 0x0c }, - { WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL, 0x0c }, - { WCD9335_DATA_HUB_DATA_HUB_I2S_CLK, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX4_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX5_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX6_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_RX7_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX0_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX1_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX2_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX3_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX4_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX5_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX6_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX7_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX8_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX9_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX10_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX11_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX13_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX14_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_SB_TX15_INP_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_L_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_R_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_L_CFG, 0x00 }, - { WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_R_CFG, 0x00 }, - { WCD9335_INTR_CFG, 0x00 }, - { WCD9335_INTR_CLR_COMMIT, 0x00 }, - { WCD9335_INTR_PIN1_MASK0, 0xff }, - { WCD9335_INTR_PIN1_MASK1, 0xff }, - { WCD9335_INTR_PIN1_MASK2, 0xff }, - { WCD9335_INTR_PIN1_MASK3, 0xff }, - { WCD9335_INTR_PIN1_STATUS0, 0x00 }, - { WCD9335_INTR_PIN1_STATUS1, 0x00 }, - { WCD9335_INTR_PIN1_STATUS2, 0x00 }, - { WCD9335_INTR_PIN1_STATUS3, 0x00 }, - { WCD9335_INTR_PIN1_CLEAR0, 0x00 }, - { WCD9335_INTR_PIN1_CLEAR1, 0x00 }, - { WCD9335_INTR_PIN1_CLEAR2, 0x00 }, - { WCD9335_INTR_PIN1_CLEAR3, 0x00 }, - { WCD9335_INTR_PIN2_MASK0, 0xff }, - { WCD9335_INTR_PIN2_MASK1, 0xff }, - { WCD9335_INTR_PIN2_MASK2, 0xff }, - { WCD9335_INTR_PIN2_MASK3, 0xff }, - { WCD9335_INTR_PIN2_STATUS0, 0x00 }, - { WCD9335_INTR_PIN2_STATUS1, 0x00 }, - { WCD9335_INTR_PIN2_STATUS2, 0x00 }, - { WCD9335_INTR_PIN2_STATUS3, 0x00 }, - { WCD9335_INTR_PIN2_CLEAR0, 0x00 }, - { WCD9335_INTR_PIN2_CLEAR1, 0x00 }, - { WCD9335_INTR_PIN2_CLEAR2, 0x00 }, - { WCD9335_INTR_PIN2_CLEAR3, 0x00 }, - { WCD9335_INTR_LEVEL0, 0x03 }, - { WCD9335_INTR_LEVEL1, 0xe0 }, - { WCD9335_INTR_LEVEL2, 0x10 }, - { WCD9335_INTR_LEVEL3, 0x80 }, - { WCD9335_INTR_BYPASS0, 0x00 }, - { WCD9335_INTR_BYPASS1, 0x00 }, - { WCD9335_INTR_BYPASS2, 0x00 }, - { WCD9335_INTR_BYPASS3, 0x00 }, - { WCD9335_INTR_SET0, 0x00 }, - { WCD9335_INTR_SET1, 0x00 }, - { WCD9335_INTR_SET2, 0x00 }, - { WCD9335_INTR_SET3, 0x00 }, - /* Page #1 registers */ - { WCD9335_PAGE1_PAGE_REGISTER, 0x00 }, - { WCD9335_CPE_FLL_USER_CTL_0, 0x71 }, - { WCD9335_CPE_FLL_USER_CTL_1, 0x34 }, - { WCD9335_CPE_FLL_USER_CTL_2, 0x0b }, - { WCD9335_CPE_FLL_USER_CTL_3, 0x02 }, - { WCD9335_CPE_FLL_USER_CTL_4, 0x04 }, - { WCD9335_CPE_FLL_USER_CTL_5, 0x02 }, - { WCD9335_CPE_FLL_USER_CTL_6, 0x64 }, - { WCD9335_CPE_FLL_USER_CTL_7, 0x00 }, - { WCD9335_CPE_FLL_USER_CTL_8, 0x94 }, - { WCD9335_CPE_FLL_USER_CTL_9, 0x70 }, - { WCD9335_CPE_FLL_L_VAL_CTL_0, 0x40 }, - { WCD9335_CPE_FLL_L_VAL_CTL_1, 0x00 }, - { WCD9335_CPE_FLL_DSM_FRAC_CTL_0, 0x00 }, - { WCD9335_CPE_FLL_DSM_FRAC_CTL_1, 0xff }, - { WCD9335_CPE_FLL_CONFIG_CTL_0, 0x6b }, - { WCD9335_CPE_FLL_CONFIG_CTL_1, 0x05 }, - { WCD9335_CPE_FLL_CONFIG_CTL_2, 0x08 }, - { WCD9335_CPE_FLL_CONFIG_CTL_3, 0x00 }, - { WCD9335_CPE_FLL_CONFIG_CTL_4, 0x10 }, - { WCD9335_CPE_FLL_TEST_CTL_0, 0x00 }, - { WCD9335_CPE_FLL_TEST_CTL_1, 0x00 }, - { WCD9335_CPE_FLL_TEST_CTL_2, 0x00 }, - { WCD9335_CPE_FLL_TEST_CTL_3, 0x00 }, - { WCD9335_CPE_FLL_TEST_CTL_4, 0x00 }, - { WCD9335_CPE_FLL_TEST_CTL_5, 0x00 }, - { WCD9335_CPE_FLL_TEST_CTL_6, 0x00 }, - { WCD9335_CPE_FLL_TEST_CTL_7, 0x33 }, - { WCD9335_CPE_FLL_FREQ_CTL_0, 0x00 }, - { WCD9335_CPE_FLL_FREQ_CTL_1, 0x00 }, - { WCD9335_CPE_FLL_FREQ_CTL_2, 0x00 }, - { WCD9335_CPE_FLL_FREQ_CTL_3, 0x00 }, - { WCD9335_CPE_FLL_SSC_CTL_0, 0x00 }, - { WCD9335_CPE_FLL_SSC_CTL_1, 0x00 }, - { WCD9335_CPE_FLL_SSC_CTL_2, 0x00 }, - { WCD9335_CPE_FLL_SSC_CTL_3, 0x00 }, - { WCD9335_CPE_FLL_FLL_MODE, 0x20 }, - { WCD9335_CPE_FLL_STATUS_0, 0x00 }, - { WCD9335_CPE_FLL_STATUS_1, 0x00 }, - { WCD9335_CPE_FLL_STATUS_2, 0x00 }, - { WCD9335_CPE_FLL_STATUS_3, 0x00 }, - { WCD9335_I2S_FLL_USER_CTL_0, 0x41 }, - { WCD9335_I2S_FLL_USER_CTL_1, 0x94 }, - { WCD9335_I2S_FLL_USER_CTL_2, 0x08 }, - { WCD9335_I2S_FLL_USER_CTL_3, 0x02 }, - { WCD9335_I2S_FLL_USER_CTL_4, 0x04 }, - { WCD9335_I2S_FLL_USER_CTL_5, 0x02 }, - { WCD9335_I2S_FLL_USER_CTL_6, 0x40 }, - { WCD9335_I2S_FLL_USER_CTL_7, 0x00 }, - { WCD9335_I2S_FLL_USER_CTL_8, 0x5f }, - { WCD9335_I2S_FLL_USER_CTL_9, 0x02 }, - { WCD9335_I2S_FLL_L_VAL_CTL_0, 0x40 }, - { WCD9335_I2S_FLL_L_VAL_CTL_1, 0x00 }, - { WCD9335_I2S_FLL_DSM_FRAC_CTL_0, 0x00 }, - { WCD9335_I2S_FLL_DSM_FRAC_CTL_1, 0xff }, - { WCD9335_I2S_FLL_CONFIG_CTL_0, 0x6b }, - { WCD9335_I2S_FLL_CONFIG_CTL_1, 0x05 }, - { WCD9335_I2S_FLL_CONFIG_CTL_2, 0x08 }, - { WCD9335_I2S_FLL_CONFIG_CTL_3, 0x00 }, - { WCD9335_I2S_FLL_CONFIG_CTL_4, 0x30 }, - { WCD9335_I2S_FLL_TEST_CTL_0, 0x80 }, - { WCD9335_I2S_FLL_TEST_CTL_1, 0x00 }, - { WCD9335_I2S_FLL_TEST_CTL_2, 0x00 }, - { WCD9335_I2S_FLL_TEST_CTL_3, 0x00 }, - { WCD9335_I2S_FLL_TEST_CTL_4, 0x00 }, - { WCD9335_I2S_FLL_TEST_CTL_5, 0x00 }, - { WCD9335_I2S_FLL_TEST_CTL_6, 0x00 }, - { WCD9335_I2S_FLL_TEST_CTL_7, 0xff }, - { WCD9335_I2S_FLL_FREQ_CTL_0, 0x00 }, - { WCD9335_I2S_FLL_FREQ_CTL_1, 0x00 }, - { WCD9335_I2S_FLL_FREQ_CTL_2, 0x00 }, - { WCD9335_I2S_FLL_FREQ_CTL_3, 0x00 }, - { WCD9335_I2S_FLL_SSC_CTL_0, 0x00 }, - { WCD9335_I2S_FLL_SSC_CTL_1, 0x00 }, - { WCD9335_I2S_FLL_SSC_CTL_2, 0x00 }, - { WCD9335_I2S_FLL_SSC_CTL_3, 0x00 }, - { WCD9335_I2S_FLL_FLL_MODE, 0x00 }, - { WCD9335_I2S_FLL_STATUS_0, 0x00 }, - { WCD9335_I2S_FLL_STATUS_1, 0x00 }, - { WCD9335_I2S_FLL_STATUS_2, 0x00 }, - { WCD9335_I2S_FLL_STATUS_3, 0x00 }, - { WCD9335_SB_FLL_USER_CTL_0, 0x41 }, - { WCD9335_SB_FLL_USER_CTL_1, 0x94 }, - { WCD9335_SB_FLL_USER_CTL_2, 0x08 }, - { WCD9335_SB_FLL_USER_CTL_3, 0x02 }, - { WCD9335_SB_FLL_USER_CTL_4, 0x04 }, - { WCD9335_SB_FLL_USER_CTL_5, 0x02 }, - { WCD9335_SB_FLL_USER_CTL_6, 0x40 }, - { WCD9335_SB_FLL_USER_CTL_7, 0x00 }, - { WCD9335_SB_FLL_USER_CTL_8, 0x5e }, - { WCD9335_SB_FLL_USER_CTL_9, 0x01 }, - { WCD9335_SB_FLL_L_VAL_CTL_0, 0x40 }, - { WCD9335_SB_FLL_L_VAL_CTL_1, 0x00 }, - { WCD9335_SB_FLL_DSM_FRAC_CTL_0, 0x00 }, - { WCD9335_SB_FLL_DSM_FRAC_CTL_1, 0xff }, - { WCD9335_SB_FLL_CONFIG_CTL_0, 0x6b }, - { WCD9335_SB_FLL_CONFIG_CTL_1, 0x05 }, - { WCD9335_SB_FLL_CONFIG_CTL_2, 0x08 }, - { WCD9335_SB_FLL_CONFIG_CTL_3, 0x00 }, - { WCD9335_SB_FLL_CONFIG_CTL_4, 0x10 }, - { WCD9335_SB_FLL_TEST_CTL_0, 0x00 }, - { WCD9335_SB_FLL_TEST_CTL_1, 0x00 }, - { WCD9335_SB_FLL_TEST_CTL_2, 0x00 }, - { WCD9335_SB_FLL_TEST_CTL_3, 0x00 }, - { WCD9335_SB_FLL_TEST_CTL_4, 0x00 }, - { WCD9335_SB_FLL_TEST_CTL_5, 0x00 }, - { WCD9335_SB_FLL_TEST_CTL_6, 0x00 }, - { WCD9335_SB_FLL_TEST_CTL_7, 0xff }, - { WCD9335_SB_FLL_FREQ_CTL_0, 0x00 }, - { WCD9335_SB_FLL_FREQ_CTL_1, 0x00 }, - { WCD9335_SB_FLL_FREQ_CTL_2, 0x00 }, - { WCD9335_SB_FLL_FREQ_CTL_3, 0x00 }, - { WCD9335_SB_FLL_SSC_CTL_0, 0x00 }, - { WCD9335_SB_FLL_SSC_CTL_1, 0x00 }, - { WCD9335_SB_FLL_SSC_CTL_2, 0x00 }, - { WCD9335_SB_FLL_SSC_CTL_3, 0x00 }, - { WCD9335_SB_FLL_FLL_MODE, 0x00 }, - { WCD9335_SB_FLL_STATUS_0, 0x00 }, - { WCD9335_SB_FLL_STATUS_1, 0x00 }, - { WCD9335_SB_FLL_STATUS_2, 0x00 }, - { WCD9335_SB_FLL_STATUS_3, 0x00 }, - /* Page #2 registers */ - { WCD9335_PAGE2_PAGE_REGISTER, 0x00 }, - { WCD9335_CPE_SS_MEM_PTR_0, 0x00 }, - { WCD9335_CPE_SS_MEM_PTR_1, 0x00 }, - { WCD9335_CPE_SS_MEM_PTR_2, 0x00 }, - { WCD9335_CPE_SS_MEM_CTRL, 0x08 }, - { WCD9335_CPE_SS_MEM_BANK_0, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_1, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_2, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_3, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_4, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_5, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_6, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_7, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_8, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_9, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_10, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_11, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_12, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_13, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_14, 0x00 }, - { WCD9335_CPE_SS_MEM_BANK_15, 0x00 }, - { WCD9335_CPE_SS_INBOX1_TRG, 0x00 }, - { WCD9335_CPE_SS_INBOX2_TRG, 0x00 }, - { WCD9335_CPE_SS_INBOX1_0, 0x00 }, - { WCD9335_CPE_SS_INBOX1_1, 0x00 }, - { WCD9335_CPE_SS_INBOX1_2, 0x00 }, - { WCD9335_CPE_SS_INBOX1_3, 0x00 }, - { WCD9335_CPE_SS_INBOX1_4, 0x00 }, - { WCD9335_CPE_SS_INBOX1_5, 0x00 }, - { WCD9335_CPE_SS_INBOX1_6, 0x00 }, - { WCD9335_CPE_SS_INBOX1_7, 0x00 }, - { WCD9335_CPE_SS_INBOX1_8, 0x00 }, - { WCD9335_CPE_SS_INBOX1_9, 0x00 }, - { WCD9335_CPE_SS_INBOX1_10, 0x00 }, - { WCD9335_CPE_SS_INBOX1_11, 0x00 }, - { WCD9335_CPE_SS_INBOX1_12, 0x00 }, - { WCD9335_CPE_SS_INBOX1_13, 0x00 }, - { WCD9335_CPE_SS_INBOX1_14, 0x00 }, - { WCD9335_CPE_SS_INBOX1_15, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_0, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_1, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_2, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_3, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_4, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_5, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_6, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_7, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_8, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_9, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_10, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_11, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_12, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_13, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_14, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_15, 0x00 }, - { WCD9335_CPE_SS_INBOX2_0, 0x00 }, - { WCD9335_CPE_SS_INBOX2_1, 0x00 }, - { WCD9335_CPE_SS_INBOX2_2, 0x00 }, - { WCD9335_CPE_SS_INBOX2_3, 0x00 }, - { WCD9335_CPE_SS_INBOX2_4, 0x00 }, - { WCD9335_CPE_SS_INBOX2_5, 0x00 }, - { WCD9335_CPE_SS_INBOX2_6, 0x00 }, - { WCD9335_CPE_SS_INBOX2_7, 0x00 }, - { WCD9335_CPE_SS_INBOX2_8, 0x00 }, - { WCD9335_CPE_SS_INBOX2_9, 0x00 }, - { WCD9335_CPE_SS_INBOX2_10, 0x00 }, - { WCD9335_CPE_SS_INBOX2_11, 0x00 }, - { WCD9335_CPE_SS_INBOX2_12, 0x00 }, - { WCD9335_CPE_SS_INBOX2_13, 0x00 }, - { WCD9335_CPE_SS_INBOX2_14, 0x00 }, - { WCD9335_CPE_SS_INBOX2_15, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_0, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_1, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_2, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_3, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_4, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_5, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_6, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_7, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_8, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_9, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_10, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_11, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_12, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_13, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_14, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_15, 0x00 }, - { WCD9335_CPE_SS_OUTBOX1_ACK, 0x00 }, - { WCD9335_CPE_SS_OUTBOX2_ACK, 0x00 }, - { WCD9335_CPE_SS_EC_BUF_INT_PERIOD, 0x3c }, - { WCD9335_CPE_SS_US_BUF_INT_PERIOD, 0x60 }, - { WCD9335_CPE_SS_CFG, 0x41 }, - { WCD9335_CPE_SS_US_EC_MUX_CFG, 0x00 }, - { WCD9335_CPE_SS_MAD_CTL, 0x00 }, - { WCD9335_CPE_SS_CPAR_CTL, 0x00 }, - { WCD9335_CPE_SS_DMIC0_CTL, 0x00 }, - { WCD9335_CPE_SS_DMIC1_CTL, 0x00 }, - { WCD9335_CPE_SS_DMIC2_CTL, 0x00 }, - { WCD9335_CPE_SS_DMIC_CFG, 0x80 }, - { WCD9335_CPE_SS_CPAR_CFG, 0x00 }, - { WCD9335_CPE_SS_WDOG_CFG, 0x01 }, - { WCD9335_CPE_SS_BACKUP_INT, 0x00 }, - { WCD9335_CPE_SS_STATUS, 0x00 }, - { WCD9335_CPE_SS_CPE_OCD_CFG, 0x00 }, - { WCD9335_CPE_SS_SS_ERROR_INT_STATUS, 0x00 }, - { WCD9335_CPE_SS_SS_ERROR_INT_CLEAR, 0x00 }, - { WCD9335_SOC_MAD_MAIN_CTL_1, 0x00 }, - { WCD9335_SOC_MAD_MAIN_CTL_2, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_1, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_2, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_3, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_4, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_5, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_6, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_7, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_CTL_8, 0x00 }, - { WCD9335_SOC_MAD_AUDIO_IIR_CTL_PTR, 0x00 }, - { WCD9335_SOC_MAD_ULTR_CTL_1, 0x00 }, - { WCD9335_SOC_MAD_ULTR_CTL_2, 0x00 }, - { WCD9335_SOC_MAD_ULTR_CTL_3, 0x00 }, - { WCD9335_SOC_MAD_ULTR_CTL_4, 0x00 }, - { WCD9335_SOC_MAD_ULTR_CTL_5, 0x00 }, - { WCD9335_SOC_MAD_ULTR_CTL_6, 0x00 }, - { WCD9335_SOC_MAD_ULTR_CTL_7, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_1, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_2, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_3, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_4, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_5, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_6, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_7, 0x00 }, - { WCD9335_SOC_MAD_BEACON_CTL_8, 0x00 }, - { WCD9335_SOC_MAD_BEACON_IIR_CTL_PTR, 0x00 }, - { WCD9335_SOC_MAD_BEACON_IIR_CTL_VAL, 0x00 }, - { WCD9335_SOC_MAD_INP_SEL, 0x00 }, - /* Page #6 registers */ - { WCD9335_PAGE6_PAGE_REGISTER, 0x00 }, - { WCD9335_ANA_BIAS, 0x00 }, - { WCD9335_ANA_CLK_TOP, 0x00 }, - { WCD9335_ANA_RCO, 0x30 }, - { WCD9335_ANA_BUCK_VOUT_A, 0xb4 }, - { WCD9335_ANA_BUCK_VOUT_D, 0xb4 }, - { WCD9335_ANA_BUCK_CTL, 0x00 }, - { WCD9335_ANA_BUCK_STATUS, 0xe0 }, - { WCD9335_ANA_RX_SUPPLIES, 0x00 }, - { WCD9335_ANA_HPH, 0x00 }, - { WCD9335_ANA_EAR, 0x00 }, - { WCD9335_ANA_LO_1_2, 0x00 }, - { WCD9335_ANA_LO_3_4, 0x00 }, - { WCD9335_ANA_MAD_SETUP, 0x81 }, - { WCD9335_ANA_AMIC1, 0x20 }, - { WCD9335_ANA_AMIC2, 0x00 }, - { WCD9335_ANA_AMIC3, 0x20 }, - { WCD9335_ANA_AMIC4, 0x00 }, - { WCD9335_ANA_AMIC5, 0x20 }, - { WCD9335_ANA_AMIC6, 0x00 }, - { WCD9335_ANA_MBHC_MECH, 0x39 }, - { WCD9335_ANA_MBHC_ELECT, 0x08 }, - { WCD9335_ANA_MBHC_ZDET, 0x00 }, - { WCD9335_ANA_MBHC_RESULT_1, 0x00 }, - { WCD9335_ANA_MBHC_RESULT_2, 0x00 }, - { WCD9335_ANA_MBHC_RESULT_3, 0x00 }, - { WCD9335_ANA_MBHC_BTN0, 0x00 }, - { WCD9335_ANA_MBHC_BTN1, 0x10 }, - { WCD9335_ANA_MBHC_BTN2, 0x20 }, - { WCD9335_ANA_MBHC_BTN3, 0x30 }, - { WCD9335_ANA_MBHC_BTN4, 0x40 }, - { WCD9335_ANA_MBHC_BTN5, 0x50 }, - { WCD9335_ANA_MBHC_BTN6, 0x60 }, - { WCD9335_ANA_MBHC_BTN7, 0x70 }, - { WCD9335_ANA_MICB1, 0x10 }, - { WCD9335_ANA_MICB2, 0x10 }, - { WCD9335_ANA_MICB2_RAMP, 0x00 }, - { WCD9335_ANA_MICB3, 0x10 }, - { WCD9335_ANA_MICB4, 0x10 }, - { WCD9335_ANA_VBADC, 0x00 }, - { WCD9335_BIAS_CTL, 0x28 }, - { WCD9335_CLOCK_TEST_CTL, 0x00 }, - { WCD9335_RCO_CTRL_1, 0x44 }, - { WCD9335_RCO_CTRL_2, 0x44 }, - { WCD9335_RCO_CAL, 0x00 }, - { WCD9335_RCO_CAL_1, 0x00 }, - { WCD9335_RCO_CAL_2, 0x00 }, - { WCD9335_RCO_TEST_CTRL, 0x00 }, - { WCD9335_RCO_CAL_OUT_1, 0x00 }, - { WCD9335_RCO_CAL_OUT_2, 0x00 }, - { WCD9335_RCO_CAL_OUT_3, 0x00 }, - { WCD9335_RCO_CAL_OUT_4, 0x00 }, - { WCD9335_RCO_CAL_OUT_5, 0x00 }, - { WCD9335_SIDO_SIDO_MODE_1, 0x84 }, - { WCD9335_SIDO_SIDO_MODE_2, 0xfe }, - { WCD9335_SIDO_SIDO_MODE_3, 0xf6 }, - { WCD9335_SIDO_SIDO_MODE_4, 0x56 }, - { WCD9335_SIDO_SIDO_VCL_1, 0x00 }, - { WCD9335_SIDO_SIDO_VCL_2, 0x6c }, - { WCD9335_SIDO_SIDO_VCL_3, 0x44 }, - { WCD9335_SIDO_SIDO_CCL_1, 0x57 }, - { WCD9335_SIDO_SIDO_CCL_4, 0x61 }, - { WCD9335_SIDO_SIDO_CCL_5, 0x6d }, - { WCD9335_SIDO_SIDO_CCL_6, 0x60 }, - { WCD9335_SIDO_SIDO_CCL_7, 0x6f }, - { WCD9335_SIDO_SIDO_CCL_9, 0x6e }, - { WCD9335_SIDO_SIDO_FILTER_1, 0x92 }, - { WCD9335_SIDO_SIDO_FILTER_2, 0x54 }, - { WCD9335_SIDO_SIDO_DRIVER_1, 0x77 }, - { WCD9335_SIDO_SIDO_CAL_CODE_EXT_1, 0x9c }, - { WCD9335_SIDO_SIDO_CAL_CODE_EXT_2, 0x82 }, - { WCD9335_SIDO_SIDO_CAL_CODE_OUT_1, 0x00 }, - { WCD9335_SIDO_SIDO_CAL_CODE_OUT_2, 0x00 }, - { WCD9335_SIDO_SIDO_TEST_1, 0x00 }, - { WCD9335_MBHC_CTL_1, 0x32 }, - { WCD9335_MBHC_CTL_2, 0x01 }, - { WCD9335_MBHC_PLUG_DETECT_CTL, 0x69 }, - { WCD9335_MBHC_ZDET_RAMP_CTL, 0x00 }, - { WCD9335_MBHC_TEST_CTL, 0x00 }, - { WCD9335_VBADC_SUBBLOCK_EN, 0xfe }, - { WCD9335_VBADC_IBIAS_FE, 0x54 }, - { WCD9335_VBADC_BIAS_ADC, 0x51 }, - { WCD9335_VBADC_FE_CTRL, 0x1c }, - { WCD9335_VBADC_ADC_REF, 0x20 }, - { WCD9335_VBADC_ADC_IO, 0x80 }, - { WCD9335_VBADC_ADC_SAR, 0xff }, - { WCD9335_VBADC_DEBUG, 0x00 }, - { WCD9335_VBADC_ADC_DOUTMSB, 0x00 }, - { WCD9335_VBADC_ADC_DOUTLSB, 0x00 }, - { WCD9335_LDOH_MODE, 0x2b }, - { WCD9335_LDOH_BIAS, 0x68 }, - { WCD9335_LDOH_STB_LOADS, 0x00 }, - { WCD9335_LDOH_SLOWRAMP, 0x50 }, - { WCD9335_MICB1_TEST_CTL_1, 0x1a }, - { WCD9335_MICB1_TEST_CTL_2, 0x18 }, - { WCD9335_MICB1_TEST_CTL_3, 0xa4 }, - { WCD9335_MICB2_TEST_CTL_1, 0x1a }, - { WCD9335_MICB2_TEST_CTL_2, 0x18 }, - { WCD9335_MICB2_TEST_CTL_3, 0x24 }, - { WCD9335_MICB3_TEST_CTL_1, 0x1a }, - { WCD9335_MICB3_TEST_CTL_2, 0x18 }, - { WCD9335_MICB3_TEST_CTL_3, 0xa4 }, - { WCD9335_MICB4_TEST_CTL_1, 0x1a }, - { WCD9335_MICB4_TEST_CTL_2, 0x18 }, - { WCD9335_MICB4_TEST_CTL_3, 0xa4 }, - { WCD9335_TX_COM_ADC_VCM, 0x39 }, - { WCD9335_TX_COM_BIAS_ATEST, 0xc0 }, - { WCD9335_TX_COM_ADC_INT1_IB, 0x6f }, - { WCD9335_TX_COM_ADC_INT2_IB, 0x4f }, - { WCD9335_TX_COM_TXFE_DIV_CTL, 0x2e }, - { WCD9335_TX_COM_TXFE_DIV_START, 0x00 }, - { WCD9335_TX_COM_TXFE_DIV_STOP_9P6M, 0xc7 }, - { WCD9335_TX_COM_TXFE_DIV_STOP_12P288M, 0xff }, - { WCD9335_TX_1_2_TEST_EN, 0xcc }, - { WCD9335_TX_1_2_ADC_IB, 0x09 }, - { WCD9335_TX_1_2_TEST_CTL, 0x38 }, - { WCD9335_TX_1_2_TEST_BLK_EN, 0xff }, - { WCD9335_TX_1_2_TXFE_CLKDIV, 0x00 }, - { WCD9335_TX_1_2_SAR1_ERR, 0x00 }, - { WCD9335_TX_1_2_SAR2_ERR, 0x00 }, - { WCD9335_TX_3_4_TEST_EN, 0xcc }, - { WCD9335_TX_3_4_ADC_IB, 0x09 }, - { WCD9335_TX_3_4_TEST_CTL, 0x38 }, - { WCD9335_TX_3_4_TEST_BLK_EN, 0xff }, - { WCD9335_TX_3_4_TXFE_CLKDIV, 0x00 }, - { WCD9335_TX_3_4_SAR1_ERR, 0x00 }, - { WCD9335_TX_3_4_SAR2_ERR, 0x00 }, - { WCD9335_TX_5_6_TEST_EN, 0xcc }, - { WCD9335_TX_5_6_ADC_IB, 0x09 }, - { WCD9335_TX_5_6_TEST_CTL, 0x38 }, - { WCD9335_TX_5_6_TEST_BLK_EN, 0xff }, - { WCD9335_TX_5_6_TXFE_CLKDIV, 0x00 }, - { WCD9335_TX_5_6_SAR1_ERR, 0x00 }, - { WCD9335_TX_5_6_SAR2_ERR, 0x00 }, - { WCD9335_CLASSH_MODE_1, 0x40 }, - { WCD9335_CLASSH_MODE_2, 0x3a }, - { WCD9335_CLASSH_MODE_3, 0x00 }, - { WCD9335_CLASSH_CTRL_VCL_1, 0x70 }, - { WCD9335_CLASSH_CTRL_VCL_2, 0xa2 }, - { WCD9335_CLASSH_CTRL_CCL_1, 0x51 }, - { WCD9335_CLASSH_CTRL_CCL_2, 0x80 }, - { WCD9335_CLASSH_CTRL_CCL_3, 0x80 }, - { WCD9335_CLASSH_CTRL_CCL_4, 0x51 }, - { WCD9335_CLASSH_CTRL_CCL_5, 0x00 }, - { WCD9335_CLASSH_BUCK_TMUX_A_D, 0x00 }, - { WCD9335_CLASSH_BUCK_SW_DRV_CNTL, 0x77 }, - { WCD9335_CLASSH_SPARE, 0x00 }, - { WCD9335_FLYBACK_EN, 0x4e }, - { WCD9335_FLYBACK_VNEG_CTRL_2, 0x45 }, - { WCD9335_FLYBACK_VNEG_CTRL_3, 0x74 }, - { WCD9335_FLYBACK_VNEG_CTRL_5, 0x83 }, - { WCD9335_FLYBACK_VNEG_CTRL_6, 0x98 }, - { WCD9335_FLYBACK_VNEG_CTRL_7, 0xa9 }, - { WCD9335_FLYBACK_VNEG_CTRL_8, 0x68 }, - { WCD9335_FLYBACK_VNEG_DAC_CTRL_2, 0x50 }, - { WCD9335_FLYBACK_VNEG_DAC_CTRL_3, 0xa6 }, - { WCD9335_FLYBACK_TEST_CTL, 0x00 }, - { WCD9335_RX_AUX_SW_CTL, 0x00 }, - { WCD9335_RX_PA_AUX_IN_CONN, 0x00 }, - { WCD9335_RX_TIMER_DIV, 0x74 }, - { WCD9335_RX_OCP_CTL, 0x1f }, - { WCD9335_RX_OCP_COUNT, 0x77 }, - { WCD9335_RX_BIAS_EAR_DAC, 0xa0 }, - { WCD9335_RX_BIAS_EAR_AMP, 0xaa }, - { WCD9335_RX_BIAS_HPH_LDO, 0xa9 }, - { WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8a }, - { WCD9335_RX_BIAS_HPH_RDAC_LDO, 0x88 }, - { WCD9335_RX_BIAS_HPH_CNP1, 0x86 }, - { WCD9335_RX_BIAS_DIFFLO_PA, 0x80 }, - { WCD9335_RX_BIAS_DIFFLO_REF, 0x88 }, - { WCD9335_RX_BIAS_DIFFLO_LDO, 0x88 }, - { WCD9335_RX_BIAS_SELO_DAC_PA, 0xa8 }, - { WCD9335_RX_BIAS_BUCK_RST, 0x08 }, - { WCD9335_RX_BIAS_BUCK_VREF_ERRAMP, 0x44 }, - { WCD9335_RX_BIAS_FLYB_ERRAMP, 0x40 }, - { WCD9335_RX_BIAS_FLYB_BUFF, 0xaa }, - { WCD9335_RX_BIAS_FLYB_MID_RST, 0x44 }, - { WCD9335_HPH_L_STATUS, 0x04 }, - { WCD9335_HPH_R_STATUS, 0x04 }, - { WCD9335_HPH_CNP_EN, 0x80 }, - { WCD9335_HPH_CNP_WG_CTL, 0xda }, - { WCD9335_HPH_CNP_WG_TIME, 0x15 }, - { WCD9335_HPH_OCP_CTL, 0x28 }, - { WCD9335_HPH_AUTO_CHOP, 0x12 }, - { WCD9335_HPH_CHOP_CTL, 0x83 }, - { WCD9335_HPH_PA_CTL1, 0x46 }, - { WCD9335_HPH_L_TEST, 0x00 }, - { WCD9335_HPH_L_ATEST, 0x50 }, - { WCD9335_HPH_R_TEST, 0x00 }, - { WCD9335_HPH_RDAC_CLK_CTL1, 0x99 }, - { WCD9335_HPH_RDAC_CLK_CTL2, 0x9b }, - { WCD9335_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00 }, - { WCD9335_HPH_REFBUFF_UHQA_CTL, 0xa8 }, - { WCD9335_HPH_REFBUFF_LP_CTL, 0x00 }, - { WCD9335_HPH_L_DAC_CTL, 0x00 }, - { WCD9335_HPH_R_DAC_CTL, 0x00 }, - { WCD9335_EAR_EN_REG, 0x60 }, - { WCD9335_EAR_CMBUFF, 0x0d }, - { WCD9335_EAR_ICTL, 0x40 }, - { WCD9335_EAR_EN_DBG_CTL, 0x00 }, - { WCD9335_EAR_CNP, 0xe0 }, - { WCD9335_EAR_DAC_CTL_ATEST, 0x00 }, - { WCD9335_EAR_STATUS_REG, 0x04 }, - { WCD9335_EAR_OUT_SHORT, 0x00 }, - { WCD9335_DIFF_LO_MISC, 0x03 }, - { WCD9335_DIFF_LO_LO2_COMPANDER, 0x00 }, - { WCD9335_DIFF_LO_LO1_COMPANDER, 0x00 }, - { WCD9335_DIFF_LO_COMMON, 0x40 }, - { WCD9335_DIFF_LO_BYPASS_EN, 0x00 }, - { WCD9335_DIFF_LO_CNP, 0x20 }, - { WCD9335_DIFF_LO_CORE_OUT_PROG, 0x00 }, - { WCD9335_DIFF_LO_LDO_OUT_PROG, 0x00 }, - { WCD9335_DIFF_LO_COM_SWCAP_REFBUF_FREQ, 0x9b }, - { WCD9335_DIFF_LO_COM_PA_FREQ, 0xb0 }, - { WCD9335_DIFF_LO_RESERVED_REG, 0x60 }, - { WCD9335_DIFF_LO_LO1_STATUS_1, 0x00 }, - { WCD9335_DIFF_LO_LO1_STATUS_2, 0x00 }, - { WCD9335_SE_LO_COM1, 0x80 }, - { WCD9335_SE_LO_COM2, 0x04 }, - { WCD9335_SE_LO_LO3_GAIN, 0x20 }, - { WCD9335_SE_LO_LO3_CTRL, 0x04 }, - { WCD9335_SE_LO_LO4_GAIN, 0x20 }, - { WCD9335_SE_LO_LO4_CTRL, 0x04 }, - { WCD9335_SE_LO_LO3_STATUS, 0x00 }, - { WCD9335_SE_LO_LO4_STATUS, 0x00 }, - /* Page #10 registers */ - { WCD9335_PAGE10_PAGE_REGISTER, 0x00 }, - { WCD9335_CDC_ANC0_CLK_RESET_CTL, 0x00 }, - { WCD9335_CDC_ANC0_MODE_1_CTL, 0x00 }, - { WCD9335_CDC_ANC0_MODE_2_CTL, 0x00 }, - { WCD9335_CDC_ANC0_FF_SHIFT, 0x00 }, - { WCD9335_CDC_ANC0_FB_SHIFT, 0x00 }, - { WCD9335_CDC_ANC0_LPF_FF_A_CTL, 0x00 }, - { WCD9335_CDC_ANC0_LPF_FF_B_CTL, 0x00 }, - { WCD9335_CDC_ANC0_LPF_FB_CTL, 0x00 }, - { WCD9335_CDC_ANC0_SMLPF_CTL, 0x00 }, - { WCD9335_CDC_ANC0_DCFLT_SHIFT_CTL, 0x00 }, - { WCD9335_CDC_ANC0_IIR_ADAPT_CTL, 0x00 }, - { WCD9335_CDC_ANC0_IIR_COEFF_1_CTL, 0x00 }, - { WCD9335_CDC_ANC0_IIR_COEFF_2_CTL, 0x00 }, - { WCD9335_CDC_ANC0_FF_A_GAIN_CTL, 0x00 }, - { WCD9335_CDC_ANC0_FF_B_GAIN_CTL, 0x00 }, - { WCD9335_CDC_ANC0_FB_GAIN_CTL, 0x00 }, - { WCD9335_CDC_ANC1_CLK_RESET_CTL, 0x00 }, - { WCD9335_CDC_ANC1_MODE_1_CTL, 0x00 }, - { WCD9335_CDC_ANC1_MODE_2_CTL, 0x00 }, - { WCD9335_CDC_ANC1_FF_SHIFT, 0x00 }, - { WCD9335_CDC_ANC1_FB_SHIFT, 0x00 }, - { WCD9335_CDC_ANC1_LPF_FF_A_CTL, 0x00 }, - { WCD9335_CDC_ANC1_LPF_FF_B_CTL, 0x00 }, - { WCD9335_CDC_ANC1_LPF_FB_CTL, 0x00 }, - { WCD9335_CDC_ANC1_SMLPF_CTL, 0x00 }, - { WCD9335_CDC_ANC1_DCFLT_SHIFT_CTL, 0x00 }, - { WCD9335_CDC_ANC1_IIR_ADAPT_CTL, 0x00 }, - { WCD9335_CDC_ANC1_IIR_COEFF_1_CTL, 0x00 }, - { WCD9335_CDC_ANC1_IIR_COEFF_2_CTL, 0x00 }, - { WCD9335_CDC_ANC1_FF_A_GAIN_CTL, 0x00 }, - { WCD9335_CDC_ANC1_FF_B_GAIN_CTL, 0x00 }, - { WCD9335_CDC_ANC1_FB_GAIN_CTL, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX0_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX0_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX0_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX1_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX1_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX1_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX2_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX2_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX2_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX3_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX3_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX3_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX4_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX4_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX4_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX5_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX5_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX5_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX6_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX6_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX6_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX7_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX7_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX7_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_CTL, 0x04 }, - { WCD9335_CDC_TX8_TX_VOL_CTL, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_192_CTL, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_192_CFG, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC0, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC1, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC4, 0x20 }, - { WCD9335_CDC_TX8_TX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_TX8_TX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD9335_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x00 }, - { WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD9335_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x00 }, - { WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD9335_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x00 }, - { WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD9335_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x00 }, - /* Page #11 registers */ - { WCD9335_PAGE11_PAGE_REGISTER, 0x00 }, - { WCD9335_CDC_COMPANDER1_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER1_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER1_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER1_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER1_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER1_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER1_CTL6, 0x01 }, - { WCD9335_CDC_COMPANDER2_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER2_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER2_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER2_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER2_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER2_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER2_CTL6, 0x01 }, - { WCD9335_CDC_COMPANDER3_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER3_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER3_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER3_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER3_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER3_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER3_CTL6, 0x01 }, - { WCD9335_CDC_COMPANDER4_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER4_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER4_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER4_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER4_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER4_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER4_CTL6, 0x01 }, - { WCD9335_CDC_COMPANDER5_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER5_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER5_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER5_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER5_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER5_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER5_CTL6, 0x01 }, - { WCD9335_CDC_COMPANDER6_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER6_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER6_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER6_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER6_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER6_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER6_CTL6, 0x01 }, - { WCD9335_CDC_COMPANDER7_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER7_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER7_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER7_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER7_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER7_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER7_CTL6, 0x01 }, - { WCD9335_CDC_COMPANDER8_CTL0, 0x60 }, - { WCD9335_CDC_COMPANDER8_CTL1, 0xdb }, - { WCD9335_CDC_COMPANDER8_CTL2, 0xff }, - { WCD9335_CDC_COMPANDER8_CTL3, 0x35 }, - { WCD9335_CDC_COMPANDER8_CTL4, 0xff }, - { WCD9335_CDC_COMPANDER8_CTL5, 0x00 }, - { WCD9335_CDC_COMPANDER8_CTL6, 0x01 }, - { WCD9335_CDC_RX0_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX0_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX0_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX0_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX0_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX1_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX1_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX1_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC4, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX1_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX2_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX2_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX2_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC4, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX2_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX3_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX3_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX3_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX3_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX4_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX4_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX4_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX4_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX5_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX5_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX5_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX5_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX6_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX6_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX6_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX6_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX7_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX7_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX7_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX7_RX_PATH_MIX_SEC1, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_CTL, 0x04 }, - { WCD9335_CDC_RX8_RX_PATH_CFG0, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_CFG2, 0x8f }, - { WCD9335_CDC_RX8_RX_VOL_CTL, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_MIX_CTL, 0x04 }, - { WCD9335_CDC_RX8_RX_VOL_MIX_CTL, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC2, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC3, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC5, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC6, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_SEC7, 0x00 }, - { WCD9335_CDC_RX8_RX_PATH_MIX_SEC1, 0x00 }, - /* Page #12 registers */ - { WCD9335_PAGE12_PAGE_REGISTER, 0x00 }, - { WCD9335_CDC_CLSH_CRC, 0x00 }, - { WCD9335_CDC_CLSH_DLY_CTRL, 0x03 }, - { WCD9335_CDC_CLSH_DECAY_CTRL, 0x02 }, - { WCD9335_CDC_CLSH_HPH_V_PA, 0x1c }, - { WCD9335_CDC_CLSH_EAR_V_PA, 0x39 }, - { WCD9335_CDC_CLSH_HPH_V_HD, 0x0c }, - { WCD9335_CDC_CLSH_EAR_V_HD, 0x0c }, - { WCD9335_CDC_CLSH_K1_MSB, 0x01 }, - { WCD9335_CDC_CLSH_K1_LSB, 0x00 }, - { WCD9335_CDC_CLSH_K2_MSB, 0x00 }, - { WCD9335_CDC_CLSH_K2_LSB, 0x80 }, - { WCD9335_CDC_CLSH_IDLE_CTRL, 0x00 }, - { WCD9335_CDC_CLSH_IDLE_HPH, 0x00 }, - { WCD9335_CDC_CLSH_IDLE_EAR, 0x00 }, - { WCD9335_CDC_CLSH_TEST0, 0x07 }, - { WCD9335_CDC_CLSH_TEST1, 0x00 }, - { WCD9335_CDC_CLSH_OVR_VREF, 0x00 }, - { WCD9335_CDC_BOOST0_BOOST_PATH_CTL, 0x00 }, - { WCD9335_CDC_BOOST0_BOOST_CTL, 0xb2 }, - { WCD9335_CDC_BOOST0_BOOST_CFG1, 0x00 }, - { WCD9335_CDC_BOOST0_BOOST_CFG2, 0x00 }, - { WCD9335_CDC_BOOST1_BOOST_PATH_CTL, 0x00 }, - { WCD9335_CDC_BOOST1_BOOST_CTL, 0xb2 }, - { WCD9335_CDC_BOOST1_BOOST_CFG1, 0x00 }, - { WCD9335_CDC_BOOST1_BOOST_CFG2, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_DATA_0, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_DATA_1, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_DATA_2, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_DATA_3, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_ADDR_1, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_ADDR_2, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_WR_ADDR_3, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_ADDR_0, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_ADDR_1, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_ADDR_2, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_ADDR_3, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_DATA_0, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_DATA_1, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_DATA_2, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_RD_DATA_3, 0x00 }, - { WCD9335_SWR_AHB_BRIDGE_ACCESS_CFG, 0x0f }, - { WCD9335_SWR_AHB_BRIDGE_ACCESS_STATUS, 0x03 }, - { WCD9335_CDC_VBAT_VBAT_PATH_CTL, 0x00 }, - { WCD9335_CDC_VBAT_VBAT_CFG, 0x0a }, - { WCD9335_CDC_VBAT_VBAT_ADC_CAL1, 0x00 }, - { WCD9335_CDC_VBAT_VBAT_ADC_CAL2, 0x00 }, - { WCD9335_CDC_VBAT_VBAT_ADC_CAL3, 0x04 }, - { WCD9335_CDC_VBAT_VBAT_PK_EST1, 0xe0 }, - { WCD9335_CDC_VBAT_VBAT_PK_EST2, 0x01 }, - { WCD9335_CDC_VBAT_VBAT_PK_EST3, 0x40 }, - { WCD9335_CDC_VBAT_VBAT_RF_PROC1, 0x2a }, - { WCD9335_CDC_VBAT_VBAT_RF_PROC2, 0x86 }, - { WCD9335_CDC_VBAT_VBAT_TAC1, 0x70 }, - { WCD9335_CDC_VBAT_VBAT_TAC2, 0x18 }, - { WCD9335_CDC_VBAT_VBAT_TAC3, 0x18 }, - { WCD9335_CDC_VBAT_VBAT_TAC4, 0x03 }, - { WCD9335_CDC_VBAT_VBAT_GAIN_UPD1, 0x01 }, - { WCD9335_CDC_VBAT_VBAT_GAIN_UPD2, 0x00 }, - { WCD9335_CDC_VBAT_VBAT_GAIN_UPD3, 0x64 }, - { WCD9335_CDC_VBAT_VBAT_GAIN_UPD4, 0x01 }, - { WCD9335_CDC_VBAT_VBAT_DEBUG1, 0x00 }, - { WCD9335_CDC_VBAT_VBAT_GAIN_UPD_MON, 0x00 }, - { WCD9335_CDC_VBAT_VBAT_GAIN_MON_VAL, 0x00 }, - { WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04 }, - { WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00 }, - { WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL, 0x04 }, - { WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1, 0x00 }, - /* Page #13 registers */ - { WCD9335_PAGE13_PAGE_REGISTER, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG2, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG3, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG4, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_ANC_CFG0, 0x00 }, - { WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 0x00 }, - { WCD9335_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3, 0x00 }, - { WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 0x00 }, - { WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 0x00 }, - { WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2, 0x00 }, - { WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3, 0x00 }, - { WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL, 0x00 }, - { WCD9335_CDC_CLK_RST_CTRL_SWR_CONTROL, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_CTL, 0x08 }, - { WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD0, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD1, 0x4b }, - { WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_STATUS, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_TEST_CTRL, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD, 0x00 }, - { WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_PATH_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_CTL, 0x40 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_PATH_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_CTL, 0x40 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL, 0x00 }, - { WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL, 0x00 }, - { WCD9335_CDC_TOP_TOP_CFG0, 0x00 }, - { WCD9335_CDC_TOP_TOP_CFG1, 0x00 }, - { WCD9335_CDC_TOP_TOP_CFG2, 0x00 }, - { WCD9335_CDC_TOP_TOP_CFG3, 0x18 }, - { WCD9335_CDC_TOP_TOP_CFG4, 0x00 }, - { WCD9335_CDC_TOP_TOP_CFG5, 0x00 }, - { WCD9335_CDC_TOP_TOP_CFG6, 0x00 }, - { WCD9335_CDC_TOP_TOP_CFG7, 0x00 }, - { WCD9335_CDC_TOP_HPHL_COMP_WR_LSB, 0x00 }, - { WCD9335_CDC_TOP_HPHL_COMP_WR_MSB, 0x00 }, - { WCD9335_CDC_TOP_HPHL_COMP_LUT, 0x00 }, - { WCD9335_CDC_TOP_HPHL_COMP_RD_LSB, 0x00 }, - { WCD9335_CDC_TOP_HPHL_COMP_RD_MSB, 0x00 }, - { WCD9335_CDC_TOP_HPHR_COMP_WR_LSB, 0x00 }, - { WCD9335_CDC_TOP_HPHR_COMP_WR_MSB, 0x00 }, - { WCD9335_CDC_TOP_HPHR_COMP_LUT, 0x00 }, - { WCD9335_CDC_TOP_HPHR_COMP_RD_LSB, 0x00 }, - { WCD9335_CDC_TOP_HPHR_COMP_RD_MSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFL_COMP_WR_LSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFL_COMP_WR_MSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFL_COMP_LUT, 0x00 }, - { WCD9335_CDC_TOP_DIFFL_COMP_RD_LSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFL_COMP_RD_MSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFR_COMP_WR_LSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFR_COMP_WR_MSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFR_COMP_LUT, 0x00 }, - { WCD9335_CDC_TOP_DIFFR_COMP_RD_LSB, 0x00 }, - { WCD9335_CDC_TOP_DIFFR_COMP_RD_MSB, 0x00 }, - /* Page #0x80 registers */ - { WCD9335_PAGE80_PAGE_REGISTER, 0x00 }, - { WCD9335_TLMM_BIST_MODE_PINCFG, 0x00 }, - { WCD9335_TLMM_RF_PA_ON_PINCFG, 0x00 }, - { WCD9335_TLMM_INTR1_PINCFG, 0x00 }, - { WCD9335_TLMM_INTR2_PINCFG, 0x00 }, - { WCD9335_TLMM_SWR_DATA_PINCFG, 0x00 }, - { WCD9335_TLMM_SWR_CLK_PINCFG, 0x00 }, - { WCD9335_TLMM_SLIMBUS_DATA2_PINCFG, 0x00 }, - { WCD9335_TLMM_I2C_CLK_PINCFG, 0x00 }, - { WCD9335_TLMM_I2C_DATA_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_RX_SD0_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_RX_SD1_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_RX_SCK_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_RX_WS_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_TX_SD0_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_TX_SD1_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_TX_SCK_PINCFG, 0x00 }, - { WCD9335_TLMM_I2S_TX_WS_PINCFG, 0x00 }, - { WCD9335_TLMM_DMIC1_CLK_PINCFG, 0x00 }, - { WCD9335_TLMM_DMIC1_DATA_PINCFG, 0x00 }, - { WCD9335_TLMM_DMIC2_CLK_PINCFG, 0x00 }, - { WCD9335_TLMM_DMIC2_DATA_PINCFG, 0x00 }, - { WCD9335_TLMM_DMIC3_CLK_PINCFG, 0x00 }, - { WCD9335_TLMM_DMIC3_DATA_PINCFG, 0x00 }, - { WCD9335_TLMM_JTDI_PINCFG, 0x00 }, - { WCD9335_TLMM_JTDO_PINCFG, 0x00 }, - { WCD9335_TLMM_JTMS_PINCFG, 0x00 }, - { WCD9335_TLMM_JTCK_PINCFG, 0x00 }, - { WCD9335_TLMM_JTRST_PINCFG, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_OE_0, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_OE_1, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_OE_2, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_OE_3, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_DATA_0, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_DATA_1, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_DATA_2, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_CTL_DATA_3, 0x00 }, - { WCD9335_TEST_DEBUG_PAD_DRVCTL, 0x00 }, - { WCD9335_TEST_DEBUG_PIN_STATUS, 0x00 }, - { WCD9335_TEST_DEBUG_MEM_CTRL, 0x00 }, - { WCD9335_TEST_DEBUG_DEBUG_BUS_SEL, 0x00 }, - { WCD9335_TEST_DEBUG_DEBUG_JTAG, 0x00 }, - { WCD9335_TEST_DEBUG_DEBUG_EN_1, 0x00 }, - { WCD9335_TEST_DEBUG_DEBUG_EN_2, 0x00 }, - { WCD9335_TEST_DEBUG_DEBUG_EN_3, 0x00 }, -}; - -/* - * wcd9335_regmap_register_patch: Update register defaults based on version - * @regmap: handle to wcd9xxx regmap - * @version: wcd9335 version - * - * Returns error code in case of failure or 0 for success - */ -int wcd9335_regmap_register_patch(struct regmap *regmap, int version) -{ - int rc; - - if (!regmap) { - pr_err("%s: regmap struct is NULL\n", __func__); - return -EINVAL; - } - - switch (version) { - case TASHA_VERSION_1_0: - case TASHA_VERSION_1_1: - regcache_cache_only(regmap, true); - rc = regmap_multi_reg_write(regmap, wcd9335_1_x_defaults, - ARRAY_SIZE(wcd9335_1_x_defaults)); - regcache_cache_only(regmap, false); - break; - case TASHA_VERSION_2_0: - regcache_cache_only(regmap, true); - rc = regmap_multi_reg_write(regmap, wcd9335_2_0_defaults, - ARRAY_SIZE(wcd9335_2_0_defaults)); - regcache_cache_only(regmap, false); - break; - default: - pr_err("%s: unknown version: %d\n", __func__, version); - rc = -EINVAL; - break; - } - - return rc; -} -EXPORT_SYMBOL(wcd9335_regmap_register_patch); - -static bool wcd9335_is_readable_register(struct device *dev, unsigned int reg) -{ - u8 pg_num, reg_offset; - const u8 *reg_tbl = NULL; - - /* - * Get the page number from MSB of codec register. If its 0x80, assign - * the corresponding page index PAGE_0x80. - */ - pg_num = reg >> 0x8; - if (pg_num == 0x80) - pg_num = PAGE_0X80; - else if (pg_num >= 0xE) - return false; - - reg_tbl = wcd9335_reg[pg_num]; - reg_offset = reg & 0xFF; - - if (reg_tbl) - return reg_tbl[reg_offset]; - else - return false; -} - -static bool wcd9335_is_volatile_register(struct device *dev, unsigned int reg) -{ - /* - * registers from 0x000 to 0x0FF are volatile because - * this space contains registers related to interrupt - * status, mask etc - */ - if (reg < 0x100) - return true; - - /* IIR Coeff registers are not cacheable */ - if ((reg >= WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL) && - (reg <= WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL)) - return true; - - if ((reg >= WCD9335_CDC_ANC0_IIR_COEFF_1_CTL) && - (reg <= WCD9335_CDC_ANC0_FB_GAIN_CTL)) - return true; - - if ((reg >= WCD9335_CDC_ANC1_IIR_COEFF_1_CTL) && - (reg <= WCD9335_CDC_ANC1_FB_GAIN_CTL)) - return true; - /* - * CPE inbox and outbox registers are volatile - * since they can be updated in the codec hardware - * to indicate CPE status - */ - if (reg >= WCD9335_CPE_SS_MEM_PTR_0 && - reg <= WCD9335_CPE_SS_OUTBOX2_ACK) - return true; - - if (reg >= WCD9335_RCO_CAL_OUT_1 && - reg <= WCD9335_RCO_CAL_OUT_5) - return true; - - switch (reg) { - case WCD9335_CPE_SS_INBOX1_TRG: - case WCD9335_CPE_SS_INBOX2_TRG: - case WCD9335_SWR_AHB_BRIDGE_WR_DATA_0: - case WCD9335_SWR_AHB_BRIDGE_WR_DATA_1: - case WCD9335_SWR_AHB_BRIDGE_WR_DATA_2: - case WCD9335_SWR_AHB_BRIDGE_WR_DATA_3: - case WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0: - case WCD9335_SWR_AHB_BRIDGE_WR_ADDR_1: - case WCD9335_SWR_AHB_BRIDGE_WR_ADDR_2: - case WCD9335_SWR_AHB_BRIDGE_WR_ADDR_3: - case WCD9335_SWR_AHB_BRIDGE_RD_DATA_0: - case WCD9335_SWR_AHB_BRIDGE_RD_DATA_1: - case WCD9335_SWR_AHB_BRIDGE_RD_DATA_2: - case WCD9335_SWR_AHB_BRIDGE_RD_DATA_3: - case WCD9335_SWR_AHB_BRIDGE_RD_ADDR_0: - case WCD9335_SWR_AHB_BRIDGE_RD_ADDR_1: - case WCD9335_SWR_AHB_BRIDGE_RD_ADDR_2: - case WCD9335_SWR_AHB_BRIDGE_RD_ADDR_3: - case WCD9335_ANA_BIAS: - case WCD9335_ANA_CLK_TOP: - case WCD9335_ANA_RCO: - case WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL: - case WCD9335_ANA_MBHC_RESULT_3: - case WCD9335_ANA_MBHC_RESULT_2: - case WCD9335_ANA_MBHC_RESULT_1: - case WCD9335_ANA_MBHC_MECH: - case WCD9335_ANA_MBHC_ELECT: - case WCD9335_ANA_MBHC_ZDET: - case WCD9335_ANA_MICB2: - case WCD9335_CPE_SS_SS_ERROR_INT_STATUS: - case WCD9335_CPE_SS_SS_ERROR_INT_MASK: - case WCD9335_CPE_SS_SS_ERROR_INT_CLEAR: - case WCD9335_CPE_SS_STATUS: - case WCD9335_CPE_SS_BACKUP_INT: - case WCD9335_CPE_SS_CFG: - case WCD9335_SOC_MAD_MAIN_CTL_1: - case WCD9335_SOC_MAD_AUDIO_CTL_3: - case WCD9335_SOC_MAD_AUDIO_CTL_4: - case WCD9335_FLYBACK_EN: - case WCD9335_ANA_RX_SUPPLIES: - case WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL: - case WCD9335_SIDO_SIDO_CCL_2: - case WCD9335_SIDO_SIDO_CCL_4: - case WCD9335_DATA_HUB_NATIVE_FIFO_STATUS: - case WCD9335_MBHC_FSM_STATUS: - case WCD9335_SPLINE_SRC0_STATUS: - case WCD9335_SPLINE_SRC1_STATUS: - case WCD9335_SPLINE_SRC2_STATUS: - case WCD9335_SPLINE_SRC3_STATUS: - case WCD9335_SIDO_SIDO_TEST_2: - case WCD9335_SIDO_SIDO_CCL_8: - case WCD9335_BIAS_VBG_FINE_ADJ: - case WCD9335_VBADC_ADC_DOUTMSB: - case WCD9335_VBADC_ADC_DOUTLSB: - case WCD9335_CDC_VBAT_VBAT_GAIN_MON_VAL: - case WCD9335_ANA_BUCK_CTL: - return true; - default: - return false; - } -} - -struct regmap_config wcd9335_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd9335_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd9335_defaults), - .max_register = WCD9335_MAX_REGISTER, - .volatile_reg = wcd9335_is_volatile_register, - .readable_reg = wcd9335_is_readable_register, - .can_multi_write = true, -}; diff --git a/techpack/audio/asoc/codecs/wcd9335-tables.c b/techpack/audio/asoc/codecs/wcd9335-tables.c deleted file mode 100644 index 7df2778f3498..000000000000 --- a/techpack/audio/asoc/codecs/wcd9335-tables.c +++ /dev/null @@ -1,1325 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "wcd9335_registers.h" - -#define WCD9335_REG(reg) ((reg) & 0xFF) - -const u8 wcd9335_page0_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE0_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_CLK_BYPASS)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_CLK_GATE)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_CLK_MCLK_CFG)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_RST_CTL)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_1)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_2)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_3)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CPE_IRAM_SHUTDOWN)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_1)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_2)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_INT_MASK)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_INT_STATUS)] = 1, - [WCD9335_REG(WCD9335_CODEC_RPM_INT_CLEAR)] = 0, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE1)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE2)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE3)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_CTL)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_TEST0)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_TEST1)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT1)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT2)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT3)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT4)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT5)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT6)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT7)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT8)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT9)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT10)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT11)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT12)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT13)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT14)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT15)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_1)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_2)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_3)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_I2C_ACTIVE)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC1_MON_CTL)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC1_MON_STATUS)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_MSB)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_LSB)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC2_MON_CTL)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC2_MON_STATUS)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_MSB)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_LSB)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC3_MON_CTL)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC3_MON_STATUS)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_MSB)] = 1, - [WCD9335_REG(WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_LSB)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_I2S_CLK)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX0_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX1_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX2_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX3_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX4_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX5_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX6_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_RX7_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX0_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX1_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX2_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX3_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX4_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX5_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX6_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX7_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX8_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX9_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX10_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX11_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX13_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX14_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_SB_TX15_INP_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_L_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_R_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_L_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_R_CFG)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_NATIVE_FIFO_SYNC)] = 1, - [WCD9335_REG(WCD9335_DATA_HUB_NATIVE_FIFO_STATUS)] = 1, - [WCD9335_REG(WCD9335_INTR_CFG)] = 1, - [WCD9335_REG(WCD9335_INTR_CLR_COMMIT)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN1_MASK0)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_MASK1)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_MASK2)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_MASK3)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_STATUS0)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_STATUS1)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_STATUS2)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_STATUS3)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN1_CLEAR0)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN1_CLEAR1)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN1_CLEAR2)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN1_CLEAR3)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN2_MASK0)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_MASK1)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_MASK2)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_MASK3)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_STATUS0)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_STATUS1)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_STATUS2)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_STATUS3)] = 1, - [WCD9335_REG(WCD9335_INTR_PIN2_CLEAR0)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN2_CLEAR1)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN2_CLEAR2)] = 0, - [WCD9335_REG(WCD9335_INTR_PIN2_CLEAR3)] = 0, - [WCD9335_REG(WCD9335_INTR_LEVEL0)] = 1, - [WCD9335_REG(WCD9335_INTR_LEVEL1)] = 1, - [WCD9335_REG(WCD9335_INTR_LEVEL2)] = 1, - [WCD9335_REG(WCD9335_INTR_LEVEL3)] = 1, - [WCD9335_REG(WCD9335_INTR_BYPASS0)] = 1, - [WCD9335_REG(WCD9335_INTR_BYPASS1)] = 1, - [WCD9335_REG(WCD9335_INTR_BYPASS2)] = 1, - [WCD9335_REG(WCD9335_INTR_BYPASS3)] = 1, - [WCD9335_REG(WCD9335_INTR_SET0)] = 1, - [WCD9335_REG(WCD9335_INTR_SET1)] = 1, - [WCD9335_REG(WCD9335_INTR_SET2)] = 1, - [WCD9335_REG(WCD9335_INTR_SET3)] = 1, -}; - -const u8 wcd9335_page1_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE1_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_2)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_3)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_4)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_5)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_6)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_7)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_8)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_USER_CTL_9)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_L_VAL_CTL_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_L_VAL_CTL_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_DSM_FRAC_CTL_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_DSM_FRAC_CTL_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_CONFIG_CTL_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_CONFIG_CTL_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_CONFIG_CTL_2)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_CONFIG_CTL_3)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_CONFIG_CTL_4)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_2)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_3)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_4)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_5)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_6)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_TEST_CTL_7)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_FREQ_CTL_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_FREQ_CTL_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_FREQ_CTL_2)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_FREQ_CTL_3)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_SSC_CTL_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_SSC_CTL_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_SSC_CTL_2)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_SSC_CTL_3)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_FLL_MODE)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_STATUS_0)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_STATUS_1)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_STATUS_2)] = 1, - [WCD9335_REG(WCD9335_CPE_FLL_STATUS_3)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_2)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_3)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_4)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_5)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_6)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_7)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_8)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_USER_CTL_9)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_L_VAL_CTL_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_L_VAL_CTL_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_DSM_FRAC_CTL_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_DSM_FRAC_CTL_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_CONFIG_CTL_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_CONFIG_CTL_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_CONFIG_CTL_2)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_CONFIG_CTL_3)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_CONFIG_CTL_4)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_2)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_3)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_4)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_5)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_6)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_TEST_CTL_7)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_FREQ_CTL_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_FREQ_CTL_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_FREQ_CTL_2)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_FREQ_CTL_3)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_SSC_CTL_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_SSC_CTL_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_SSC_CTL_2)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_SSC_CTL_3)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_FLL_MODE)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_STATUS_0)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_STATUS_1)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_STATUS_2)] = 1, - [WCD9335_REG(WCD9335_I2S_FLL_STATUS_3)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_4)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_5)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_6)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_7)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_8)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_USER_CTL_9)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_L_VAL_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_L_VAL_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_DSM_FRAC_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_DSM_FRAC_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_CONFIG_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_CONFIG_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_CONFIG_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_CONFIG_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_CONFIG_CTL_4)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_4)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_5)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_6)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_TEST_CTL_7)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_FREQ_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_FREQ_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_FREQ_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_FREQ_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_SSC_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_SSC_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_SSC_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_SSC_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_FLL_MODE)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_STATUS_0)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_STATUS_1)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_STATUS_2)] = 1, - [WCD9335_REG(WCD9335_SB_FLL_STATUS_3)] = 1, -}; - -const u8 wcd9335_page2_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE2_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_PTR_0)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_PTR_1)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_PTR_2)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_CTRL)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_0)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_1)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_2)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_3)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_4)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_5)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_6)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_7)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_8)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_9)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_10)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_11)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_12)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_13)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_14)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MEM_BANK_15)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_TRG)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_TRG)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_0)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_1)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_2)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_3)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_4)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_5)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_6)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_7)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_8)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_9)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_10)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_11)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_12)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_13)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_14)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX1_15)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_0)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_1)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_2)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_3)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_4)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_5)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_6)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_7)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_8)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_9)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_10)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_11)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_12)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_13)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_14)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_15)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_0)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_1)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_2)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_3)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_4)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_5)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_6)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_7)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_8)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_9)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_10)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_11)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_12)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_13)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_14)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_INBOX2_15)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_0)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_1)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_2)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_3)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_4)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_5)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_6)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_7)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_8)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_9)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_10)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_11)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_12)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_13)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_14)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_15)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX1_ACK)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_OUTBOX2_ACK)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_EC_BUF_INT_PERIOD)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_US_BUF_INT_PERIOD)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_US_EC_MUX_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_MAD_CTL)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_CPAR_CTL)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_TX_PP_BUF_INT_PERIOD)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_TX_PP_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_DMIC0_CTL)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_DMIC1_CTL)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_DMIC2_CTL)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_DMIC_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_SVA_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_CPAR_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_WDOG_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_BACKUP_INT)] = 0, - [WCD9335_REG(WCD9335_CPE_SS_STATUS)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_CPE_OCD_CFG)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_SS_ERROR_INT_MASK)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_SS_ERROR_INT_STATUS)] = 1, - [WCD9335_REG(WCD9335_CPE_SS_SS_ERROR_INT_CLEAR)] = 0, - [WCD9335_REG(WCD9335_SOC_MAD_MAIN_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_MAIN_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_4)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_5)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_6)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_7)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_CTL_8)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_IIR_CTL_PTR)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_AUDIO_IIR_CTL_VAL)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_ULTR_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_ULTR_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_ULTR_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_ULTR_CTL_4)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_ULTR_CTL_5)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_ULTR_CTL_6)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_ULTR_CTL_7)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_1)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_2)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_3)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_4)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_5)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_6)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_7)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_CTL_8)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_IIR_CTL_PTR)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_BEACON_IIR_CTL_VAL)] = 1, - [WCD9335_REG(WCD9335_SOC_MAD_INP_SEL)] = 1, -}; - -const u8 wcd9335_page6_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE6_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_ANA_BIAS)] = 1, - [WCD9335_REG(WCD9335_ANA_CLK_TOP)] = 1, - [WCD9335_REG(WCD9335_ANA_RCO)] = 1, - [WCD9335_REG(WCD9335_ANA_BUCK_VOUT_A)] = 1, - [WCD9335_REG(WCD9335_ANA_BUCK_VOUT_D)] = 1, - [WCD9335_REG(WCD9335_ANA_BUCK_CTL)] = 1, - [WCD9335_REG(WCD9335_ANA_BUCK_STATUS)] = 1, - [WCD9335_REG(WCD9335_ANA_RX_SUPPLIES)] = 1, - [WCD9335_REG(WCD9335_ANA_HPH)] = 1, - [WCD9335_REG(WCD9335_ANA_EAR)] = 1, - [WCD9335_REG(WCD9335_ANA_LO_1_2)] = 1, - [WCD9335_REG(WCD9335_ANA_LO_3_4)] = 1, - [WCD9335_REG(WCD9335_ANA_MAD_SETUP)] = 1, - [WCD9335_REG(WCD9335_ANA_AMIC1)] = 1, - [WCD9335_REG(WCD9335_ANA_AMIC2)] = 1, - [WCD9335_REG(WCD9335_ANA_AMIC3)] = 1, - [WCD9335_REG(WCD9335_ANA_AMIC4)] = 1, - [WCD9335_REG(WCD9335_ANA_AMIC5)] = 1, - [WCD9335_REG(WCD9335_ANA_AMIC6)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_MECH)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_ELECT)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_ZDET)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_RESULT_1)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_RESULT_2)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_RESULT_3)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN0)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN1)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN2)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN3)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN4)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN5)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN6)] = 1, - [WCD9335_REG(WCD9335_ANA_MBHC_BTN7)] = 1, - [WCD9335_REG(WCD9335_ANA_MICB1)] = 1, - [WCD9335_REG(WCD9335_ANA_MICB2)] = 1, - [WCD9335_REG(WCD9335_ANA_MICB2_RAMP)] = 1, - [WCD9335_REG(WCD9335_ANA_MICB3)] = 1, - [WCD9335_REG(WCD9335_ANA_MICB4)] = 1, - [WCD9335_REG(WCD9335_ANA_VBADC)] = 1, - [WCD9335_REG(WCD9335_BIAS_CTL)] = 1, - [WCD9335_REG(WCD9335_BIAS_VBG_FINE_ADJ)] = 1, - [WCD9335_REG(WCD9335_CLOCK_TEST_CTL)] = 1, - [WCD9335_REG(WCD9335_RCO_CTRL_1)] = 1, - [WCD9335_REG(WCD9335_RCO_CTRL_2)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL_1)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL_2)] = 1, - [WCD9335_REG(WCD9335_RCO_TEST_CTRL)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL_OUT_1)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL_OUT_2)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL_OUT_3)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL_OUT_4)] = 1, - [WCD9335_REG(WCD9335_RCO_CAL_OUT_5)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_MODE_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_MODE_2)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_MODE_3)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_MODE_4)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_VCL_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_VCL_2)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_VCL_3)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_2)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_3)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_4)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_5)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_6)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_7)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_8)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_9)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CCL_10)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_FILTER_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_FILTER_2)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_DRIVER_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_DRIVER_2)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_DRIVER_3)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CAL_CODE_EXT_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CAL_CODE_EXT_2)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CAL_CODE_OUT_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_CAL_CODE_OUT_2)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_TEST_1)] = 1, - [WCD9335_REG(WCD9335_SIDO_SIDO_TEST_2)] = 1, - [WCD9335_REG(WCD9335_MBHC_CTL_1)] = 1, - [WCD9335_REG(WCD9335_MBHC_CTL_2)] = 1, - [WCD9335_REG(WCD9335_MBHC_PLUG_DETECT_CTL)] = 1, - [WCD9335_REG(WCD9335_MBHC_ZDET_ANA_CTL)] = 1, - [WCD9335_REG(WCD9335_MBHC_ZDET_RAMP_CTL)] = 1, - [WCD9335_REG(WCD9335_MBHC_FSM_DEBUG)] = 1, - [WCD9335_REG(WCD9335_MBHC_TEST_CTL)] = 1, - [WCD9335_REG(WCD9335_VBADC_SUBBLOCK_EN)] = 1, - [WCD9335_REG(WCD9335_VBADC_IBIAS_FE)] = 1, - [WCD9335_REG(WCD9335_VBADC_BIAS_ADC)] = 1, - [WCD9335_REG(WCD9335_VBADC_FE_CTRL)] = 1, - [WCD9335_REG(WCD9335_VBADC_ADC_REF)] = 1, - [WCD9335_REG(WCD9335_VBADC_ADC_IO)] = 1, - [WCD9335_REG(WCD9335_VBADC_ADC_SAR)] = 1, - [WCD9335_REG(WCD9335_VBADC_DEBUG)] = 1, - [WCD9335_REG(WCD9335_VBADC_ADC_DOUTMSB)] = 1, - [WCD9335_REG(WCD9335_VBADC_ADC_DOUTLSB)] = 1, - [WCD9335_REG(WCD9335_LDOH_MODE)] = 1, - [WCD9335_REG(WCD9335_LDOH_BIAS)] = 1, - [WCD9335_REG(WCD9335_LDOH_STB_LOADS)] = 1, - [WCD9335_REG(WCD9335_LDOH_SLOWRAMP)] = 1, - [WCD9335_REG(WCD9335_MICB1_TEST_CTL_1)] = 1, - [WCD9335_REG(WCD9335_MICB1_TEST_CTL_2)] = 1, - [WCD9335_REG(WCD9335_MICB1_TEST_CTL_3)] = 1, - [WCD9335_REG(WCD9335_MICB2_TEST_CTL_1)] = 1, - [WCD9335_REG(WCD9335_MICB2_TEST_CTL_2)] = 1, - [WCD9335_REG(WCD9335_MICB2_TEST_CTL_3)] = 1, - [WCD9335_REG(WCD9335_MICB3_TEST_CTL_1)] = 1, - [WCD9335_REG(WCD9335_MICB3_TEST_CTL_2)] = 1, - [WCD9335_REG(WCD9335_MICB3_TEST_CTL_3)] = 1, - [WCD9335_REG(WCD9335_MICB4_TEST_CTL_1)] = 1, - [WCD9335_REG(WCD9335_MICB4_TEST_CTL_2)] = 1, - [WCD9335_REG(WCD9335_MICB4_TEST_CTL_3)] = 1, - [WCD9335_REG(WCD9335_TX_COM_ADC_VCM)] = 1, - [WCD9335_REG(WCD9335_TX_COM_BIAS_ATEST)] = 1, - [WCD9335_REG(WCD9335_TX_COM_ADC_INT1_IB)] = 1, - [WCD9335_REG(WCD9335_TX_COM_ADC_INT2_IB)] = 1, - [WCD9335_REG(WCD9335_TX_COM_TXFE_DIV_CTL)] = 1, - [WCD9335_REG(WCD9335_TX_COM_TXFE_DIV_START)] = 1, - [WCD9335_REG(WCD9335_TX_COM_TXFE_DIV_STOP_9P6M)] = 1, - [WCD9335_REG(WCD9335_TX_COM_TXFE_DIV_STOP_12P288M)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_TEST_EN)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_ADC_IB)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_ATEST_REFCTL)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_TEST_CTL)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_TEST_BLK_EN)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_TXFE_CLKDIV)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_SAR1_ERR)] = 1, - [WCD9335_REG(WCD9335_TX_1_2_SAR2_ERR)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_TEST_EN)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_ADC_IB)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_ATEST_REFCTL)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_TEST_CTL)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_TEST_BLK_EN)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_TXFE_CLKDIV)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_SAR1_ERR)] = 1, - [WCD9335_REG(WCD9335_TX_3_4_SAR2_ERR)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_TEST_EN)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_ADC_IB)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_ATEST_REFCTL)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_TEST_CTL)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_TEST_BLK_EN)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_TXFE_CLKDIV)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_SAR1_ERR)] = 1, - [WCD9335_REG(WCD9335_TX_5_6_SAR2_ERR)] = 1, - [WCD9335_REG(WCD9335_CLASSH_MODE_1)] = 1, - [WCD9335_REG(WCD9335_CLASSH_MODE_2)] = 1, - [WCD9335_REG(WCD9335_CLASSH_MODE_3)] = 1, - [WCD9335_REG(WCD9335_CLASSH_CTRL_VCL_1)] = 1, - [WCD9335_REG(WCD9335_CLASSH_CTRL_VCL_2)] = 1, - [WCD9335_REG(WCD9335_CLASSH_CTRL_CCL_1)] = 1, - [WCD9335_REG(WCD9335_CLASSH_CTRL_CCL_2)] = 1, - [WCD9335_REG(WCD9335_CLASSH_CTRL_CCL_3)] = 1, - [WCD9335_REG(WCD9335_CLASSH_CTRL_CCL_4)] = 1, - [WCD9335_REG(WCD9335_CLASSH_CTRL_CCL_5)] = 1, - [WCD9335_REG(WCD9335_CLASSH_BUCK_TMUX_A_D)] = 1, - [WCD9335_REG(WCD9335_CLASSH_BUCK_SW_DRV_CNTL)] = 1, - [WCD9335_REG(WCD9335_CLASSH_SPARE)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_EN)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_1)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_2)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_3)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_4)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_5)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_6)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_7)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_8)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_CTRL_9)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_DAC_CTRL_1)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_DAC_CTRL_2)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_DAC_CTRL_3)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_VNEG_DAC_CTRL_4)] = 1, - [WCD9335_REG(WCD9335_FLYBACK_TEST_CTL)] = 1, - [WCD9335_REG(WCD9335_RX_AUX_SW_CTL)] = 1, - [WCD9335_REG(WCD9335_RX_PA_AUX_IN_CONN)] = 1, - [WCD9335_REG(WCD9335_RX_TIMER_DIV)] = 1, - [WCD9335_REG(WCD9335_RX_OCP_CTL)] = 1, - [WCD9335_REG(WCD9335_RX_OCP_COUNT)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_EAR_DAC)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_EAR_AMP)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_HPH_LDO)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_HPH_PA)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_HPH_RDAC_LDO)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_HPH_CNP1)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_HPH_LOWPOWER)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_DIFFLO_PA)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_DIFFLO_REF)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_DIFFLO_LDO)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_SELO_DAC_PA)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_BUCK_RST)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_BUCK_VREF_ERRAMP)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_FLYB_ERRAMP)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_FLYB_BUFF)] = 1, - [WCD9335_REG(WCD9335_RX_BIAS_FLYB_MID_RST)] = 1, - [WCD9335_REG(WCD9335_HPH_L_STATUS)] = 1, - [WCD9335_REG(WCD9335_HPH_R_STATUS)] = 1, - [WCD9335_REG(WCD9335_HPH_CNP_EN)] = 1, - [WCD9335_REG(WCD9335_HPH_CNP_WG_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_CNP_WG_TIME)] = 1, - [WCD9335_REG(WCD9335_HPH_OCP_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_AUTO_CHOP)] = 1, - [WCD9335_REG(WCD9335_HPH_CHOP_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_PA_CTL1)] = 1, - [WCD9335_REG(WCD9335_HPH_PA_CTL2)] = 1, - [WCD9335_REG(WCD9335_HPH_L_EN)] = 1, - [WCD9335_REG(WCD9335_HPH_L_TEST)] = 1, - [WCD9335_REG(WCD9335_HPH_L_ATEST)] = 1, - [WCD9335_REG(WCD9335_HPH_R_EN)] = 1, - [WCD9335_REG(WCD9335_HPH_R_TEST)] = 1, - [WCD9335_REG(WCD9335_HPH_R_ATEST)] = 1, - [WCD9335_REG(WCD9335_HPH_RDAC_CLK_CTL1)] = 1, - [WCD9335_REG(WCD9335_HPH_RDAC_CLK_CTL2)] = 1, - [WCD9335_REG(WCD9335_HPH_RDAC_LDO_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_RDAC_CHOP_CLK_LP_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_REFBUFF_UHQA_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_REFBUFF_LP_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_L_DAC_CTL)] = 1, - [WCD9335_REG(WCD9335_HPH_R_DAC_CTL)] = 1, - [WCD9335_REG(WCD9335_EAR_EN_REG)] = 1, - [WCD9335_REG(WCD9335_EAR_CMBUFF)] = 1, - [WCD9335_REG(WCD9335_EAR_ICTL)] = 1, - [WCD9335_REG(WCD9335_EAR_EN_DBG_CTL)] = 1, - [WCD9335_REG(WCD9335_EAR_CNP)] = 1, - [WCD9335_REG(WCD9335_EAR_DAC_CTL_ATEST)] = 1, - [WCD9335_REG(WCD9335_EAR_STATUS_REG)] = 1, - [WCD9335_REG(WCD9335_EAR_OUT_SHORT)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_MISC)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_LO2_COMPANDER)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_LO1_COMPANDER)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_COMMON)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_BYPASS_EN)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_CNP)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_CORE_OUT_PROG)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_LDO_OUT_PROG)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_COM_SWCAP_REFBUF_FREQ)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_COM_PA_FREQ)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_RESERVED_REG)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_LO1_STATUS_1)] = 1, - [WCD9335_REG(WCD9335_DIFF_LO_LO1_STATUS_2)] = 1, - [WCD9335_REG(WCD9335_SE_LO_COM1)] = 1, - [WCD9335_REG(WCD9335_SE_LO_COM2)] = 1, - [WCD9335_REG(WCD9335_SE_LO_LO3_GAIN)] = 1, - [WCD9335_REG(WCD9335_SE_LO_LO3_CTRL)] = 1, - [WCD9335_REG(WCD9335_SE_LO_LO4_GAIN)] = 1, - [WCD9335_REG(WCD9335_SE_LO_LO4_CTRL)] = 1, - [WCD9335_REG(WCD9335_SE_LO_LO3_STATUS)] = 1, - [WCD9335_REG(WCD9335_SE_LO_LO4_STATUS)] = 1, -}; - -const u8 wcd9335_page10_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE10_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_CLK_RESET_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_MODE_1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_MODE_2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_FF_SHIFT)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_FB_SHIFT)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_LPF_FF_A_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_LPF_FF_B_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_LPF_FB_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_SMLPF_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_DCFLT_SHIFT_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_IIR_ADAPT_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_IIR_COEFF_1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_IIR_COEFF_2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_FF_A_GAIN_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_FF_B_GAIN_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC0_FB_GAIN_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_CLK_RESET_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_MODE_1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_MODE_2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_FF_SHIFT)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_FB_SHIFT)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_LPF_FF_A_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_LPF_FF_B_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_LPF_FB_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_SMLPF_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_DCFLT_SHIFT_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_IIR_ADAPT_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_IIR_COEFF_1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_IIR_COEFF_2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_FF_A_GAIN_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_FF_B_GAIN_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_ANC1_FB_GAIN_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX0_TX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX1_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX2_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX3_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX4_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX5_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX6_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX7_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_192_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_192_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_TX8_TX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX9_SPKR_PROT_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX10_SPKR_PROT_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX11_SPKR_PROT_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TX12_SPKR_PROT_PATH_CFG0)] = 1, -}; - -const u8 wcd9335_page11_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE11_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER1_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER2_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER3_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER4_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER5_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER6_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER7_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL0)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL1)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL2)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL3)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL4)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL5)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL6)] = 1, - [WCD9335_REG(WCD9335_CDC_COMPANDER8_CTL7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX0_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX1_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC4)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX2_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX3_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX4_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX5_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX6_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX7_RX_PATH_MIX_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_VOL_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_MIX_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_VOL_MIX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_SEC1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_SEC2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_SEC3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_SEC5)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_SEC6)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_SEC7)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_MIX_SEC0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX8_RX_PATH_MIX_SEC1)] = 1, -}; - -const u8 wcd9335_page12_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE12_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_CRC)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_DLY_CTRL)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_DECAY_CTRL)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_HPH_V_PA)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_EAR_V_PA)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_HPH_V_HD)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_EAR_V_HD)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_K1_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_K1_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_K2_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_K2_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_IDLE_CTRL)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_IDLE_HPH)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_IDLE_EAR)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_TEST0)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_TEST1)] = 1, - [WCD9335_REG(WCD9335_CDC_CLSH_OVR_VREF)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST0_BOOST_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST0_BOOST_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST0_BOOST_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST0_BOOST_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST1_BOOST_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST1_BOOST_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST1_BOOST_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_BOOST1_BOOST_CFG2)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_DATA_0)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_DATA_1)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_DATA_2)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_DATA_3)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_ADDR_1)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_ADDR_2)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_WR_ADDR_3)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_ADDR_0)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_ADDR_1)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_ADDR_2)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_ADDR_3)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_DATA_0)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_DATA_1)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_DATA_2)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_RD_DATA_3)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_ACCESS_CFG)] = 1, - [WCD9335_REG(WCD9335_SWR_AHB_BRIDGE_ACCESS_STATUS)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_CFG)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_ADC_CAL1)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_ADC_CAL2)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_ADC_CAL3)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_PK_EST1)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_PK_EST2)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_PK_EST3)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_RF_PROC1)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_RF_PROC2)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_TAC1)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_TAC2)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_TAC3)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_TAC4)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_GAIN_UPD1)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_GAIN_UPD2)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_GAIN_UPD3)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_GAIN_UPD4)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_DEBUG1)] = 1, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_GAIN_UPD_MON)] = 0, - [WCD9335_REG(WCD9335_CDC_VBAT_VBAT_GAIN_MON_VAL)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC0_CLK_RST_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC0_STATUS)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC1_CLK_RST_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC1_STATUS)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC2_CLK_RST_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC2_STATUS)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC3_CLK_RST_CTL_0)] = 1, - [WCD9335_REG(WCD9335_SPLINE_SRC3_STATUS)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1)] = 1, -}; - -const u8 wcd9335_page13_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE13_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG3)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG4)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_ANC_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX10_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX11_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX12_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TX_INP_MUX_ADC_MUX13_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3)] = 1, - [WCD9335_REG(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3)] = 1, - [WCD9335_REG(WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL)] = 1, - [WCD9335_REG(WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL)] = 1, - [WCD9335_REG(WCD9335_CDC_CLK_RST_CTRL_SWR_CONTROL)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD0)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD1)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_STATUS)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_TEST_CTRL)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD)] = 1, - [WCD9335_REG(WCD9335_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_PATH_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG0)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG1)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG2)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG3)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG4)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG5)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG6)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_TOP_CFG7)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHL_COMP_WR_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHL_COMP_WR_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHL_COMP_LUT)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHL_COMP_RD_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHL_COMP_RD_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHR_COMP_WR_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHR_COMP_WR_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHR_COMP_LUT)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHR_COMP_RD_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_HPHR_COMP_RD_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFL_COMP_WR_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFL_COMP_WR_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFL_COMP_LUT)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFL_COMP_RD_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFL_COMP_RD_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFR_COMP_WR_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFR_COMP_WR_MSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFR_COMP_LUT)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFR_COMP_RD_LSB)] = 1, - [WCD9335_REG(WCD9335_CDC_TOP_DIFFR_COMP_RD_MSB)] = 1, -}; - -const u8 wcd9335_page_0x80_reg_readable[WCD9335_PAGE_SIZE] = { - [WCD9335_REG(WCD9335_PAGE80_PAGE_REGISTER)] = 1, - [WCD9335_REG(WCD9335_TLMM_BIST_MODE_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_RF_PA_ON_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_INTR1_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_INTR2_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_SWR_DATA_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_SWR_CLK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_SLIMBUS_DATA2_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2C_CLK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2C_DATA_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_RX_SD0_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_RX_SD1_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_RX_SCK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_RX_WS_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_TX_SD0_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_TX_SD1_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_TX_SCK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_I2S_TX_WS_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_DMIC1_CLK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_DMIC1_DATA_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_DMIC2_CLK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_DMIC2_DATA_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_DMIC3_CLK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_DMIC3_DATA_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_JTDI_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_JTDO_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_JTMS_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_JTCK_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TLMM_JTRST_PINCFG)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_OE_0)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_OE_1)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_OE_2)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_OE_3)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_DATA_0)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_DATA_1)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_DATA_2)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_CTL_DATA_3)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PAD_DRVCTL)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_PIN_STATUS)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_NPL_DLY_TEST_1)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_NPL_DLY_TEST_2)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_MEM_CTRL)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_DEBUG_BUS_SEL)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_DEBUG_JTAG)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_DEBUG_EN_1)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_DEBUG_EN_2)] = 1, - [WCD9335_REG(WCD9335_TEST_DEBUG_DEBUG_EN_3)] = 1, -}; - -const u8 *wcd9335_reg[WCD9335_NUM_PAGES] = { - [PAGE_0] = wcd9335_page0_reg_readable, - [PAGE_1] = wcd9335_page1_reg_readable, - [PAGE_2] = wcd9335_page2_reg_readable, - [PAGE_6] = wcd9335_page6_reg_readable, - [PAGE_10] = wcd9335_page10_reg_readable, - [PAGE_11] = wcd9335_page11_reg_readable, - [PAGE_12] = wcd9335_page12_reg_readable, - [PAGE_13] = wcd9335_page13_reg_readable, - [PAGE_0X80] = wcd9335_page_0x80_reg_readable, -}; diff --git a/techpack/audio/asoc/codecs/wcd9335.c b/techpack/audio/asoc/codecs/wcd9335.c deleted file mode 100644 index 4706a0e08343..000000000000 --- a/techpack/audio/asoc/codecs/wcd9335.c +++ /dev/null @@ -1,14393 +0,0 @@ -/* - * Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "core.h" -#include "pdata.h" -#include "wcd9335.h" -#include "wcd-mbhc-v2.h" -#include "wcd9xxx-common-v2.h" -#include "wcd9xxx-resmgr-v2.h" -#include "wcd9xxx-irq.h" -#include "wcd9335_registers.h" -#include "wcd9335_irq.h" -#include "wcd_cpe_core.h" -#include "wcdcal-hwdep.h" -#include "wcd-mbhc-v2-api.h" - -#define TASHA_RX_PORT_START_NUMBER 16 - -#define WCD9335_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) -/* Fractional Rates */ -#define WCD9335_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100) - -#define WCD9335_MIX_RATES_MASK (SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) - -#define TASHA_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S24_3LE) - -#define TASHA_FORMATS_S16_S24_S32_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S24_3LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -#define TASHA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE) - -/* - * Timeout in milli seconds and it is the wait time for - * slim channel removal interrupt to receive. - */ -#define TASHA_SLIM_CLOSE_TIMEOUT 1000 -#define TASHA_SLIM_IRQ_OVERFLOW (1 << 0) -#define TASHA_SLIM_IRQ_UNDERFLOW (1 << 1) -#define TASHA_SLIM_IRQ_PORT_CLOSED (1 << 2) -#define TASHA_MCLK_CLK_12P288MHZ 12288000 -#define TASHA_MCLK_CLK_9P6MHZ 9600000 - -#define TASHA_SLIM_PGD_PORT_INT_TX_EN0 (TASHA_SLIM_PGD_PORT_INT_EN0 + 2) - -#define TASHA_NUM_INTERPOLATORS 9 -#define TASHA_NUM_DECIMATORS 9 - -#define WCD9335_CHILD_DEVICES_MAX 6 - -#define BYTE_BIT_MASK(nr) (1 << ((nr) % BITS_PER_BYTE)) -#define TASHA_MAD_AUDIO_FIRMWARE_PATH "wcd9335/wcd9335_mad_audio.bin" -#define TASHA_CPE_SS_ERR_STATUS_MEM_ACCESS (1 << 0) -#define TASHA_CPE_SS_ERR_STATUS_WDOG_BITE (1 << 1) - -#define TASHA_CPE_FATAL_IRQS \ - (TASHA_CPE_SS_ERR_STATUS_WDOG_BITE | \ - TASHA_CPE_SS_ERR_STATUS_MEM_ACCESS) - -#define SLIM_BW_CLK_GEAR_9 6200000 -#define SLIM_BW_UNVOTE 0 - -#define CPE_FLL_CLK_75MHZ 75000000 -#define CPE_FLL_CLK_150MHZ 150000000 -#define WCD9335_REG_BITS 8 - -#define WCD9335_MAX_VALID_ADC_MUX 13 -#define WCD9335_INVALID_ADC_MUX 9 - -#define TASHA_DIG_CORE_REG_MIN WCD9335_CDC_ANC0_CLK_RESET_CTL -#define TASHA_DIG_CORE_REG_MAX 0xDFF - -/* Convert from vout ctl to micbias voltage in mV */ -#define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) - -#define TASHA_ZDET_NUM_MEASUREMENTS 900 -#define TASHA_MBHC_GET_C1(c) ((c & 0xC000) >> 14) -#define TASHA_MBHC_GET_X1(x) (x & 0x3FFF) -/* z value compared in milliOhm */ -#define TASHA_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) -#define TASHA_MBHC_ZDET_CONST (86 * 16384) -#define TASHA_MBHC_MOISTURE_VREF V_45_MV -#define TASHA_MBHC_MOISTURE_IREF I_3P0_UA - -#define TASHA_VERSION_ENTRY_SIZE 17 - -#define WCD9335_AMIC_PWR_LEVEL_LP 0 -#define WCD9335_AMIC_PWR_LEVEL_DEFAULT 1 -#define WCD9335_AMIC_PWR_LEVEL_HP 2 -#define WCD9335_AMIC_PWR_LVL_MASK 0x60 -#define WCD9335_AMIC_PWR_LVL_SHIFT 0x5 - -#define WCD9335_DEC_PWR_LVL_MASK 0x06 -#define WCD9335_DEC_PWR_LVL_LP 0x02 -#define WCD9335_DEC_PWR_LVL_HP 0x04 -#define WCD9335_DEC_PWR_LVL_DF 0x00 -#define WCD9335_STRING_LEN 100 - -#define CALCULATE_VOUT_D(req_mv) (((req_mv - 650) * 10) / 25) - -static int cpe_debug_mode; - -#define TASHA_MAX_MICBIAS 4 -#define DAPM_MICBIAS1_STANDALONE "MIC BIAS1 Standalone" -#define DAPM_MICBIAS2_STANDALONE "MIC BIAS2 Standalone" -#define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone" -#define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone" - -#define DAPM_LDO_H_STANDALONE "LDO_H" -module_param(cpe_debug_mode, int, 0664); -MODULE_PARM_DESC(cpe_debug_mode, "boot cpe in debug mode"); - -#define TASHA_DIG_CORE_COLLAPSE_TIMER_MS (5 * 1000) - -#define MAX_ON_DEMAND_SUPPLY_NAME_LENGTH 64 - -static char on_demand_supply_name[][MAX_ON_DEMAND_SUPPLY_NAME_LENGTH] = { - "cdc-vdd-mic-bias", -}; - -enum { - POWER_COLLAPSE, - POWER_RESUME, -}; - -enum tasha_sido_voltage { - SIDO_VOLTAGE_SVS_MV = 950, - SIDO_VOLTAGE_NOMINAL_MV = 1100, -}; - -static enum codec_variant codec_ver; - -static int dig_core_collapse_enable = 1; -module_param(dig_core_collapse_enable, int, 0664); -MODULE_PARM_DESC(dig_core_collapse_enable, "enable/disable power gating"); - -/* dig_core_collapse timer in seconds */ -static int dig_core_collapse_timer = (TASHA_DIG_CORE_COLLAPSE_TIMER_MS/1000); -module_param(dig_core_collapse_timer, int, 0664); -MODULE_PARM_DESC(dig_core_collapse_timer, "timer for power gating"); - -/* SVS Scaling enable/disable */ -static int svs_scaling_enabled = 1; -module_param(svs_scaling_enabled, int, 0664); -MODULE_PARM_DESC(svs_scaling_enabled, "enable/disable svs scaling"); - -/* SVS buck setting */ -static int sido_buck_svs_voltage = SIDO_VOLTAGE_SVS_MV; -module_param(sido_buck_svs_voltage, int, 0664); -MODULE_PARM_DESC(sido_buck_svs_voltage, - "setting for SVS voltage for SIDO BUCK"); - -#define TASHA_TX_UNMUTE_DELAY_MS 40 - -static int tx_unmute_delay = TASHA_TX_UNMUTE_DELAY_MS; -module_param(tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path"); - -static struct afe_param_slimbus_slave_port_cfg tasha_slimbus_slave_port_cfg = { - .minor_version = 1, - .slimbus_dev_id = AFE_SLIMBUS_DEVICE_1, - .slave_dev_pgd_la = 0, - .slave_dev_intfdev_la = 0, - .bit_width = 16, - .data_format = 0, - .num_channels = 1 -}; - -struct tasha_mbhc_zdet_param { - u16 ldo_ctl; - u16 noff; - u16 nshift; - u16 btn5; - u16 btn6; - u16 btn7; -}; - -static struct afe_param_cdc_reg_page_cfg tasha_cdc_reg_page_cfg = { - .minor_version = AFE_API_VERSION_CDC_REG_PAGE_CFG, - .enable = 1, - .proc_id = AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_1, -}; - -static struct afe_param_cdc_reg_cfg audio_reg_cfg[] = { - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_SOC_MAD_MAIN_CTL_1), - HW_MAD_AUDIO_ENABLE, 0x1, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_SOC_MAD_AUDIO_CTL_3), - HW_MAD_AUDIO_SLEEP_TIME, 0xF, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_SOC_MAD_AUDIO_CTL_4), - HW_MAD_TX_AUDIO_SWITCH_OFF, 0x1, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_CFG), - MAD_AUDIO_INT_DEST_SELECT_REG, 0x2, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_MASK3), - MAD_AUDIO_INT_MASK_REG, 0x1, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_STATUS3), - MAD_AUDIO_INT_STATUS_REG, 0x1, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_CLEAR3), - MAD_AUDIO_INT_CLEAR_REG, 0x1, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_CFG), - VBAT_INT_DEST_SELECT_REG, 0x2, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_MASK3), - VBAT_INT_MASK_REG, 0x08, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_STATUS3), - VBAT_INT_STATUS_REG, 0x08, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_CLEAR3), - VBAT_INT_CLEAR_REG, 0x08, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_CFG), - VBAT_RELEASE_INT_DEST_SELECT_REG, 0x2, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_MASK3), - VBAT_RELEASE_INT_MASK_REG, 0x10, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_STATUS3), - VBAT_RELEASE_INT_STATUS_REG, 0x10, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_INTR_PIN2_CLEAR3), - VBAT_RELEASE_INT_CLEAR_REG, 0x10, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + TASHA_SB_PGD_PORT_TX_BASE), - SB_PGD_PORT_TX_WATERMARK_N, 0x1E, WCD9335_REG_BITS, 0x1 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + TASHA_SB_PGD_PORT_TX_BASE), - SB_PGD_PORT_TX_ENABLE_N, 0x1, WCD9335_REG_BITS, 0x1 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + TASHA_SB_PGD_PORT_RX_BASE), - SB_PGD_PORT_RX_WATERMARK_N, 0x1E, WCD9335_REG_BITS, 0x1 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + TASHA_SB_PGD_PORT_RX_BASE), - SB_PGD_PORT_RX_ENABLE_N, 0x1, WCD9335_REG_BITS, 0x1 - }, - { 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_CDC_ANC0_IIR_ADAPT_CTL), - AANC_FF_GAIN_ADAPTIVE, 0x4, WCD9335_REG_BITS, 0 - }, - { 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_CDC_ANC0_IIR_ADAPT_CTL), - AANC_FFGAIN_ADAPTIVE_EN, 0x8, WCD9335_REG_BITS, 0 - }, - { - 1, - (TASHA_REGISTER_START_OFFSET + WCD9335_CDC_ANC0_FF_A_GAIN_CTL), - AANC_GAIN_CONTROL, 0xFF, WCD9335_REG_BITS, 0 - }, -}; - -static struct afe_param_cdc_reg_cfg_data tasha_audio_reg_cfg = { - .num_registers = ARRAY_SIZE(audio_reg_cfg), - .reg_data = audio_reg_cfg, -}; - -static struct afe_param_id_cdc_aanc_version tasha_cdc_aanc_version = { - .cdc_aanc_minor_version = AFE_API_VERSION_CDC_AANC_VERSION, - .aanc_hw_version = AANC_HW_BLOCK_VERSION_2, -}; - -enum { - VI_SENSE_1, - VI_SENSE_2, - AIF4_SWITCH_VALUE, - AUDIO_NOMINAL, - CPE_NOMINAL, - HPH_PA_DELAY, - ANC_MIC_AMIC1, - ANC_MIC_AMIC2, - ANC_MIC_AMIC3, - ANC_MIC_AMIC4, - ANC_MIC_AMIC5, - ANC_MIC_AMIC6, - CLASSH_CONFIG, -}; - -enum { - AIF1_PB = 0, - AIF1_CAP, - AIF2_PB, - AIF2_CAP, - AIF3_PB, - AIF3_CAP, - AIF4_PB, - AIF_MIX1_PB, - AIF4_MAD_TX, - AIF4_VIFEED, - AIF5_CPE_TX, - NUM_CODEC_DAIS, -}; - -enum { - INTn_1_MIX_INP_SEL_ZERO = 0, - INTn_1_MIX_INP_SEL_DEC0, - INTn_1_MIX_INP_SEL_DEC1, - INTn_1_MIX_INP_SEL_IIR0, - INTn_1_MIX_INP_SEL_IIR1, - INTn_1_MIX_INP_SEL_RX0, - INTn_1_MIX_INP_SEL_RX1, - INTn_1_MIX_INP_SEL_RX2, - INTn_1_MIX_INP_SEL_RX3, - INTn_1_MIX_INP_SEL_RX4, - INTn_1_MIX_INP_SEL_RX5, - INTn_1_MIX_INP_SEL_RX6, - INTn_1_MIX_INP_SEL_RX7, - -}; - -#define IS_VALID_NATIVE_FIFO_PORT(inp) \ - ((inp >= INTn_1_MIX_INP_SEL_RX0) && \ - (inp <= INTn_1_MIX_INP_SEL_RX3)) - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_RX2, - INTn_2_INP_SEL_RX3, - INTn_2_INP_SEL_RX4, - INTn_2_INP_SEL_RX5, - INTn_2_INP_SEL_RX6, - INTn_2_INP_SEL_RX7, - INTn_2_INP_SEL_PROXIMITY, -}; - -enum { - INTERP_EAR = 0, - INTERP_HPHL, - INTERP_HPHR, - INTERP_LO1, - INTERP_LO2, - INTERP_LO3, - INTERP_LO4, - INTERP_SPKR1, - INTERP_SPKR2, -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -static struct interp_sample_rate int_prim_sample_rate_val[] = { - {8000, 0x0}, /* 8K */ - {16000, 0x1}, /* 16K */ - {24000, -EINVAL},/* 24K */ - {32000, 0x3}, /* 32K */ - {48000, 0x4}, /* 48K */ - {96000, 0x5}, /* 96K */ - {192000, 0x6}, /* 192K */ - {384000, 0x7}, /* 384K */ - {44100, 0x8}, /* 44.1K */ -}; - -static struct interp_sample_rate int_mix_sample_rate_val[] = { - {48000, 0x4}, /* 48K */ - {96000, 0x5}, /* 96K */ - {192000, 0x6}, /* 192K */ -}; - -static const struct wcd9xxx_ch tasha_rx_chs[TASHA_RX_MAX] = { - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER, 0), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 1, 1), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 2, 2), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 3, 3), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 4, 4), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 5, 5), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 6, 6), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 7, 7), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 8, 8), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 9, 9), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 10, 10), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 11, 11), - WCD9XXX_CH(TASHA_RX_PORT_START_NUMBER + 12, 12), -}; - -static const struct wcd9xxx_ch tasha_tx_chs[TASHA_TX_MAX] = { - WCD9XXX_CH(0, 0), - WCD9XXX_CH(1, 1), - WCD9XXX_CH(2, 2), - WCD9XXX_CH(3, 3), - WCD9XXX_CH(4, 4), - WCD9XXX_CH(5, 5), - WCD9XXX_CH(6, 6), - WCD9XXX_CH(7, 7), - WCD9XXX_CH(8, 8), - WCD9XXX_CH(9, 9), - WCD9XXX_CH(10, 10), - WCD9XXX_CH(11, 11), - WCD9XXX_CH(12, 12), - WCD9XXX_CH(13, 13), - WCD9XXX_CH(14, 14), - WCD9XXX_CH(15, 15), -}; - -static const u32 vport_slim_check_table[NUM_CODEC_DAIS] = { - /* Needs to define in the same order of DAI enum definitions */ - 0, - BIT(AIF2_CAP) | BIT(AIF3_CAP) | BIT(AIF4_MAD_TX) | BIT(AIF5_CPE_TX), - 0, - BIT(AIF1_CAP) | BIT(AIF3_CAP) | BIT(AIF4_MAD_TX) | BIT(AIF5_CPE_TX), - 0, - BIT(AIF1_CAP) | BIT(AIF2_CAP) | BIT(AIF4_MAD_TX) | BIT(AIF5_CPE_TX), - 0, - 0, - BIT(AIF1_CAP) | BIT(AIF2_CAP) | BIT(AIF3_CAP) | BIT(AIF5_CPE_TX), - 0, - BIT(AIF1_CAP) | BIT(AIF2_CAP) | BIT(AIF3_CAP) | BIT(AIF4_MAD_TX), -}; - -static const u32 vport_i2s_check_table[NUM_CODEC_DAIS] = { - 0, /* AIF1_PB */ - BIT(AIF2_CAP), /* AIF1_CAP */ - 0, /* AIF2_PB */ - BIT(AIF1_CAP), /* AIF2_CAP */ -}; - -/* Codec supports 2 IIR filters */ -enum { - IIR0 = 0, - IIR1, - IIR_MAX, -}; - -/* Each IIR has 5 Filter Stages */ -enum { - BAND1 = 0, - BAND2, - BAND3, - BAND4, - BAND5, - BAND_MAX, -}; - -enum { - COMPANDER_1, /* HPH_L */ - COMPANDER_2, /* HPH_R */ - COMPANDER_3, /* LO1_DIFF */ - COMPANDER_4, /* LO2_DIFF */ - COMPANDER_5, /* LO3_SE */ - COMPANDER_6, /* LO4_SE */ - COMPANDER_7, /* SWR SPK CH1 */ - COMPANDER_8, /* SWR SPK CH2 */ - COMPANDER_MAX, -}; - -enum { - SRC_IN_HPHL, - SRC_IN_LO1, - SRC_IN_HPHR, - SRC_IN_LO2, - SRC_IN_SPKRL, - SRC_IN_LO3, - SRC_IN_SPKRR, - SRC_IN_LO4, -}; - -enum { - SPLINE_SRC0, - SPLINE_SRC1, - SPLINE_SRC2, - SPLINE_SRC3, - SPLINE_SRC_MAX, -}; - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); -static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1); -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); - -static struct snd_soc_dai_driver tasha_dai[]; -static int wcd9335_get_micb_vout_ctl_val(u32 micb_mv); - -static int tasha_config_compander(struct snd_soc_codec *, int, int); -static void tasha_codec_set_tx_hold(struct snd_soc_codec *, u16, bool); -static int tasha_codec_internal_rco_ctrl(struct snd_soc_codec *codec, - bool enable); - -/* Hold instance to soundwire platform device */ -struct tasha_swr_ctrl_data { - struct platform_device *swr_pdev; - struct ida swr_ida; -}; - -struct wcd_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action); -}; - -static struct wcd_mbhc_register - wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { - WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN", - WCD9335_ANA_MBHC_MECH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN", - WCD9335_ANA_MBHC_MECH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE", - WCD9335_ANA_MBHC_MECH, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL", - WCD9335_MBHC_PLUG_DETECT_CTL, 0x30, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE", - WCD9335_ANA_MBHC_ELECT, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL", - WCD9335_MBHC_PLUG_DETECT_CTL, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL", - WCD9335_ANA_MBHC_MECH, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE", - WCD9335_ANA_MBHC_MECH, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE", - WCD9335_ANA_MBHC_MECH, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND", - WCD9335_ANA_MBHC_MECH, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC", - WCD9335_ANA_MBHC_ELECT, 0x06, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN", - WCD9335_ANA_MBHC_ELECT, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC", - WCD9335_MBHC_PLUG_DETECT_CTL, 0x0F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC", - WCD9335_MBHC_CTL_1, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF", - WCD9335_MBHC_CTL_2, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT", - WCD9335_ANA_MBHC_RESULT_3, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_IN2P_CLAMP_STATE", - WCD9335_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT", - WCD9335_ANA_MBHC_RESULT_3, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT", - WCD9335_ANA_MBHC_RESULT_3, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT", - WCD9335_ANA_MBHC_RESULT_3, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN", - WCD9335_HPH_OCP_CTL, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT", - WCD9335_ANA_MBHC_RESULT_3, 0x07, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL", - WCD9335_ANA_MBHC_ELECT, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT", - WCD9335_ANA_MBHC_RESULT_3, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL", - WCD9335_ANA_MICB2, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME", - WCD9335_HPH_CNP_WG_TIME, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN", - WCD9335_ANA_HPH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN", - WCD9335_ANA_HPH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN", - WCD9335_ANA_HPH, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", - WCD9335_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", - 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", - WCD9335_ANA_MBHC_ZDET, 0x01, 0, 0), - /* - * MBHC FSM status register is only available in Tasha 2.0. - * So, init with 0 later once the version is known, then values - * will be updated. - */ - WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", - 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", - WCD9335_MBHC_CTL_2, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS", - WCD9335_MBHC_FSM_STATUS, 0X20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND", - WCD9335_HPH_PA_CTL2, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND", - WCD9335_HPH_PA_CTL2, 0x10, 4, 0), -}; - -static const struct wcd_mbhc_intr intr_ids = { - .mbhc_sw_intr = WCD9335_IRQ_MBHC_SW_DET, - .mbhc_btn_press_intr = WCD9335_IRQ_MBHC_BUTTON_PRESS_DET, - .mbhc_btn_release_intr = WCD9335_IRQ_MBHC_BUTTON_RELEASE_DET, - .mbhc_hs_ins_intr = WCD9335_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - .mbhc_hs_rem_intr = WCD9335_IRQ_MBHC_ELECT_INS_REM_DET, - .hph_left_ocp = WCD9335_IRQ_HPH_PA_OCPL_FAULT, - .hph_right_ocp = WCD9335_IRQ_HPH_PA_OCPR_FAULT, -}; - -struct wcd_vbat { - bool is_enabled; - bool adc_config; - /* Variables to cache Vbat ADC output values */ - u16 dcp1; - u16 dcp2; -}; - -struct hpf_work { - struct tasha_priv *tasha; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -#define WCD9335_SPK_ANC_EN_DELAY_MS 350 -static int spk_anc_en_delay = WCD9335_SPK_ANC_EN_DELAY_MS; -module_param(spk_anc_en_delay, int, 0664); -MODULE_PARM_DESC(spk_anc_en_delay, "delay to enable anc in speaker path"); - -struct spk_anc_work { - struct tasha_priv *tasha; - struct delayed_work dwork; -}; - -struct tx_mute_work { - struct tasha_priv *tasha; - u8 decimator; - struct delayed_work dwork; -}; - -struct tasha_priv { - struct device *dev; - struct wcd9xxx *wcd9xxx; - - struct snd_soc_codec *codec; - u32 adc_count; - u32 rx_bias_count; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - s32 ldo_h_users; - s32 micb_ref[TASHA_MAX_MICBIAS]; - s32 pullup_ref[TASHA_MAX_MICBIAS]; - - u32 anc_slot; - bool anc_func; - bool is_wsa_attach; - - /* Vbat module */ - struct wcd_vbat vbat; - - /* cal info for codec */ - struct fw_info *fw_data; - - /*track tasha interface type*/ - u8 intf_type; - - /* num of slim ports required */ - struct wcd9xxx_codec_dai_data dai[NUM_CODEC_DAIS]; - - /* SoundWire data structure */ - struct tasha_swr_ctrl_data *swr_ctrl_data; - int nr; - - /*compander*/ - int comp_enabled[COMPANDER_MAX]; - - /* Maintain the status of AUX PGA */ - int aux_pga_cnt; - u8 aux_l_gain; - u8 aux_r_gain; - - bool spkr_pa_widget_on; - struct regulator *spkdrv_reg; - struct regulator *spkdrv2_reg; - - bool mbhc_started; - /* class h specific data */ - struct wcd_clsh_cdc_data clsh_d; - - struct afe_param_cdc_slimbus_slave_cfg slimbus_slave_cfg; - - /* - * list used to save/restore registers at start and - * end of impedance measurement - */ - struct list_head reg_save_restore; - - /* handle to cpe core */ - struct wcd_cpe_core *cpe_core; - u32 current_cpe_clk_freq; - enum tasha_sido_voltage sido_voltage; - int sido_ccl_cnt; - - u32 ana_rx_supplies; - /* Multiplication factor used for impedance detection */ - int zdet_gain_mul_fact; - - /* to track the status */ - unsigned long status_mask; - - struct work_struct tasha_add_child_devices_work; - struct wcd_swr_ctrl_platform_data swr_plat_data; - - /* Port values for Rx and Tx codec_dai */ - unsigned int rx_port_value[TASHA_RX_MAX]; - unsigned int tx_port_value; - - unsigned int vi_feed_value; - /* Tasha Interpolator Mode Select for EAR, HPH_L and HPH_R */ - u32 hph_mode; - - u16 prim_int_users[TASHA_NUM_INTERPOLATORS]; - int spl_src_users[SPLINE_SRC_MAX]; - - struct wcd9xxx_resmgr_v2 *resmgr; - struct delayed_work power_gate_work; - struct mutex power_lock; - struct mutex sido_lock; - - /* mbhc module */ - struct wcd_mbhc mbhc; - struct blocking_notifier_head notifier; - struct mutex micb_lock; - - struct clk *wcd_ext_clk; - struct clk *wcd_native_clk; - struct mutex swr_read_lock; - struct mutex swr_write_lock; - struct mutex swr_clk_lock; - int swr_clk_users; - int native_clk_users; - int (*zdet_gpio_cb)(struct snd_soc_codec *codec, bool high); - - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - int power_active_ref; - - struct on_demand_supply on_demand_list[ON_DEMAND_SUPPLIES_MAX]; - - int (*machine_codec_event_cb)(struct snd_soc_codec *codec, - enum wcd9335_codec_event); - int spkr_gain_offset; - int spkr_mode; - int ear_spkr_gain; - struct hpf_work tx_hpf_work[TASHA_NUM_DECIMATORS]; - struct tx_mute_work tx_mute_dwork[TASHA_NUM_DECIMATORS]; - struct spk_anc_work spk_anc_dwork; - struct mutex codec_mutex; - int hph_l_gain; - int hph_r_gain; - int rx_7_count; - int rx_8_count; - bool clk_mode; - bool clk_internal; - /* Lock to prevent multiple functions voting at same time */ - struct mutex sb_clk_gear_lock; - /* Count for functions voting or un-voting */ - u32 ref_count; - /* Lock to protect mclk enablement */ - struct mutex mclk_lock; - - struct platform_device *pdev_child_devices - [WCD9335_CHILD_DEVICES_MAX]; - int child_count; -}; - -static int tasha_codec_vote_max_bw(struct snd_soc_codec *codec, - bool vote); - -static const struct tasha_reg_mask_val tasha_spkr_default[] = { - {WCD9335_CDC_COMPANDER7_CTL3, 0x80, 0x80}, - {WCD9335_CDC_COMPANDER8_CTL3, 0x80, 0x80}, - {WCD9335_CDC_COMPANDER7_CTL7, 0x01, 0x01}, - {WCD9335_CDC_COMPANDER8_CTL7, 0x01, 0x01}, - {WCD9335_CDC_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {WCD9335_CDC_BOOST1_BOOST_CTL, 0x7C, 0x58}, -}; - -static const struct tasha_reg_mask_val tasha_spkr_mode1[] = { - {WCD9335_CDC_COMPANDER7_CTL3, 0x80, 0x00}, - {WCD9335_CDC_COMPANDER8_CTL3, 0x80, 0x00}, - {WCD9335_CDC_COMPANDER7_CTL7, 0x01, 0x00}, - {WCD9335_CDC_COMPANDER8_CTL7, 0x01, 0x00}, - {WCD9335_CDC_BOOST0_BOOST_CTL, 0x7C, 0x44}, - {WCD9335_CDC_BOOST1_BOOST_CTL, 0x7C, 0x44}, -}; - -/** - * tasha_set_spkr_gain_offset - offset the speaker path - * gain with the given offset value. - * - * @codec: codec instance - * @offset: Indicates speaker path gain offset value. - * - * Returns 0 on success or -EINVAL on error. - */ -int tasha_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - - if (!priv) - return -EINVAL; - - priv->spkr_gain_offset = offset; - return 0; -} -EXPORT_SYMBOL(tasha_set_spkr_gain_offset); - -/** - * tasha_set_spkr_mode - Configures speaker compander and smartboost - * settings based on speaker mode. - * - * @codec: codec instance - * @mode: Indicates speaker configuration mode. - * - * Returns 0 on success or -EINVAL on error. - */ -int tasha_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - int i; - const struct tasha_reg_mask_val *regs; - int size; - - if (!priv) - return -EINVAL; - - switch (mode) { - case SPKR_MODE_1: - regs = tasha_spkr_mode1; - size = ARRAY_SIZE(tasha_spkr_mode1); - break; - default: - regs = tasha_spkr_default; - size = ARRAY_SIZE(tasha_spkr_default); - break; - } - - priv->spkr_mode = mode; - for (i = 0; i < size; i++) - snd_soc_update_bits(codec, regs[i].reg, - regs[i].mask, regs[i].val); - return 0; -} -EXPORT_SYMBOL(tasha_set_spkr_mode); - -static void tasha_enable_sido_buck(struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - snd_soc_update_bits(codec, WCD9335_ANA_RCO, 0x80, 0x80); - snd_soc_update_bits(codec, WCD9335_ANA_BUCK_CTL, 0x02, 0x02); - /* 100us sleep needed after IREF settings */ - usleep_range(100, 110); - snd_soc_update_bits(codec, WCD9335_ANA_BUCK_CTL, 0x04, 0x04); - /* 100us sleep needed after VREF settings */ - usleep_range(100, 110); - tasha->resmgr->sido_input_src = SIDO_SOURCE_RCO_BG; -} - -static void tasha_cdc_sido_ccl_enable(struct tasha_priv *tasha, bool ccl_flag) -{ - struct snd_soc_codec *codec = tasha->codec; - - if (!codec) - return; - - if (!TASHA_IS_2_0(tasha->wcd9xxx)) { - dev_dbg(codec->dev, "%s: tasha version < 2p0, return\n", - __func__); - return; - } - dev_dbg(codec->dev, "%s: sido_ccl_cnt=%d, ccl_flag:%d\n", - __func__, tasha->sido_ccl_cnt, ccl_flag); - if (ccl_flag) { - if (++tasha->sido_ccl_cnt == 1) - snd_soc_update_bits(codec, - WCD9335_SIDO_SIDO_CCL_10, 0xFF, 0x6E); - } else { - if (tasha->sido_ccl_cnt == 0) { - dev_dbg(codec->dev, "%s: sido_ccl already disabled\n", - __func__); - return; - } - if (--tasha->sido_ccl_cnt == 0) - snd_soc_update_bits(codec, - WCD9335_SIDO_SIDO_CCL_10, 0xFF, 0x02); - } -} - -static bool tasha_cdc_is_svs_enabled(struct tasha_priv *tasha) -{ - if (TASHA_IS_2_0(tasha->wcd9xxx) && - svs_scaling_enabled) - return true; - - return false; -} - -static int tasha_cdc_req_mclk_enable(struct tasha_priv *tasha, - bool enable) -{ - int ret = 0; - - mutex_lock(&tasha->mclk_lock); - if (enable) { - tasha_cdc_sido_ccl_enable(tasha, true); - ret = clk_prepare_enable(tasha->wcd_ext_clk); - if (ret) { - dev_err(tasha->dev, "%s: ext clk enable failed\n", - __func__); - goto unlock_mutex; - } - /* get BG */ - wcd_resmgr_enable_master_bias(tasha->resmgr); - /* get MCLK */ - wcd_resmgr_enable_clk_block(tasha->resmgr, WCD_CLK_MCLK); - } else { - /* put MCLK */ - wcd_resmgr_disable_clk_block(tasha->resmgr, WCD_CLK_MCLK); - /* put BG */ - wcd_resmgr_disable_master_bias(tasha->resmgr); - clk_disable_unprepare(tasha->wcd_ext_clk); - tasha_cdc_sido_ccl_enable(tasha, false); - } -unlock_mutex: - mutex_unlock(&tasha->mclk_lock); - return ret; -} - -static int tasha_cdc_check_sido_value(enum tasha_sido_voltage req_mv) -{ - if ((req_mv != SIDO_VOLTAGE_SVS_MV) && - (req_mv != SIDO_VOLTAGE_NOMINAL_MV)) - return -EINVAL; - - return 0; -} - -static void tasha_codec_apply_sido_voltage( - struct tasha_priv *tasha, - enum tasha_sido_voltage req_mv) -{ - u32 vout_d_val; - struct snd_soc_codec *codec = tasha->codec; - int ret; - - if (!codec) - return; - - if (!tasha_cdc_is_svs_enabled(tasha)) - return; - - if ((sido_buck_svs_voltage != SIDO_VOLTAGE_SVS_MV) && - (sido_buck_svs_voltage != SIDO_VOLTAGE_NOMINAL_MV)) - sido_buck_svs_voltage = SIDO_VOLTAGE_SVS_MV; - - ret = tasha_cdc_check_sido_value(req_mv); - if (ret < 0) { - dev_dbg(codec->dev, "%s: requested mv=%d not in range\n", - __func__, req_mv); - return; - } - if (req_mv == tasha->sido_voltage) { - dev_dbg(codec->dev, "%s: Already at requested mv=%d\n", - __func__, req_mv); - return; - } - if (req_mv == sido_buck_svs_voltage) { - if (test_bit(AUDIO_NOMINAL, &tasha->status_mask) || - test_bit(CPE_NOMINAL, &tasha->status_mask)) { - dev_dbg(codec->dev, - "%s: nominal client running, status_mask=%lu\n", - __func__, tasha->status_mask); - return; - } - } - /* compute the vout_d step value */ - vout_d_val = CALCULATE_VOUT_D(req_mv); - snd_soc_write(codec, WCD9335_ANA_BUCK_VOUT_D, vout_d_val & 0xFF); - snd_soc_update_bits(codec, WCD9335_ANA_BUCK_CTL, 0x80, 0x80); - - /* 1 msec sleep required after SIDO Vout_D voltage change */ - usleep_range(1000, 1100); - tasha->sido_voltage = req_mv; - dev_dbg(codec->dev, - "%s: updated SIDO buck Vout_D to %d, vout_d step = %u\n", - __func__, tasha->sido_voltage, vout_d_val); - - snd_soc_update_bits(codec, WCD9335_ANA_BUCK_CTL, - 0x80, 0x00); -} - -static int tasha_codec_update_sido_voltage( - struct tasha_priv *tasha, - enum tasha_sido_voltage req_mv) -{ - int ret = 0; - - if (!tasha_cdc_is_svs_enabled(tasha)) - return ret; - - mutex_lock(&tasha->sido_lock); - /* enable mclk before setting SIDO voltage */ - ret = tasha_cdc_req_mclk_enable(tasha, true); - if (ret) { - dev_err(tasha->dev, "%s: ext clk enable failed\n", - __func__); - goto err; - } - tasha_codec_apply_sido_voltage(tasha, req_mv); - tasha_cdc_req_mclk_enable(tasha, false); - -err: - mutex_unlock(&tasha->sido_lock); - return ret; -} - -int tasha_enable_efuse_sensing(struct snd_soc_codec *codec) -{ - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - - tasha_cdc_mclk_enable(codec, true, false); - - if (!TASHA_IS_2_0(priv->wcd9xxx)) - snd_soc_update_bits(codec, WCD9335_CHIP_TIER_CTRL_EFUSE_CTL, - 0x1E, 0x02); - snd_soc_update_bits(codec, WCD9335_CHIP_TIER_CTRL_EFUSE_CTL, - 0x01, 0x01); - /* - * 5ms sleep required after enabling efuse control - * before checking the status. - */ - usleep_range(5000, 5500); - if (!(snd_soc_read(codec, WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS) & 0x01)) - WARN(1, "%s: Efuse sense is not complete\n", __func__); - - if (TASHA_IS_2_0(priv->wcd9xxx)) { - if (!(snd_soc_read(codec, - WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0) & 0x40)) - snd_soc_update_bits(codec, WCD9335_HPH_R_ATEST, - 0x04, 0x00); - tasha_enable_sido_buck(codec); - } - - tasha_cdc_mclk_enable(codec, false, false); - - return 0; -} -EXPORT_SYMBOL(tasha_enable_efuse_sensing); - -void *tasha_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type) -{ - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - - switch (config_type) { - case AFE_SLIMBUS_SLAVE_CONFIG: - return &priv->slimbus_slave_cfg; - case AFE_CDC_REGISTERS_CONFIG: - return &tasha_audio_reg_cfg; - case AFE_SLIMBUS_SLAVE_PORT_CONFIG: - return &tasha_slimbus_slave_port_cfg; - case AFE_AANC_VERSION: - return &tasha_cdc_aanc_version; - case AFE_CLIP_BANK_SEL: - return NULL; - case AFE_CDC_CLIP_REGISTERS_CONFIG: - return NULL; - case AFE_CDC_REGISTER_PAGE_CONFIG: - return &tasha_cdc_reg_page_cfg; - default: - dev_err(codec->dev, "%s: Unknown config_type 0x%x\n", - __func__, config_type); - return NULL; - } -} -EXPORT_SYMBOL(tasha_get_afe_config); - -/* - * tasha_event_register: Registers a machine driver callback - * function with codec private data for post ADSP sub-system - * restart (SSR). This callback function will be called from - * codec driver once codec comes out of reset after ADSP SSR. - * - * @machine_event_cb: callback function from machine driver - * @codec: Codec instance - * - * Return: none - */ -void tasha_event_register( - int (*machine_event_cb)(struct snd_soc_codec *codec, - enum wcd9335_codec_event), - struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (tasha) - tasha->machine_codec_event_cb = machine_event_cb; - else - dev_dbg(codec->dev, "%s: Invalid tasha_priv data\n", __func__); -} -EXPORT_SYMBOL(tasha_event_register); - -static int tasha_mbhc_request_irq(struct snd_soc_codec *codec, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - return wcd9xxx_request_irq(core_res, irq, handler, name, data); -} - -static void tasha_mbhc_irq_control(struct snd_soc_codec *codec, - int irq, bool enable) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - if (enable) - wcd9xxx_enable_irq(core_res, irq); - else - wcd9xxx_disable_irq(core_res, irq); -} - -static int tasha_mbhc_free_irq(struct snd_soc_codec *codec, - int irq, void *data) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - wcd9xxx_free_irq(core_res, irq, data); - return 0; -} - -static void tasha_mbhc_clk_setup(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD9335_MBHC_CTL_1, - 0x80, 0x80); - else - snd_soc_update_bits(codec, WCD9335_MBHC_CTL_1, - 0x80, 0x00); -} - -static int tasha_mbhc_btn_to_num(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, WCD9335_ANA_MBHC_RESULT_3) & 0x7; -} - -static void tasha_mbhc_mbhc_bias_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_ELECT, - 0x01, 0x01); - else - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_ELECT, - 0x01, 0x00); -} - -static void tasha_mbhc_program_btn_thr(struct snd_soc_codec *codec, - s16 *btn_low, s16 *btn_high, - int num_btn, bool is_micbias) -{ - int i; - int vth; - - if (num_btn > WCD_MBHC_DEF_BUTTONS) { - dev_err(codec->dev, "%s: invalid number of buttons: %d\n", - __func__, num_btn); - return; - } - /* - * Tasha just needs one set of thresholds for button detection - * due to micbias voltage ramp to pullup upon button press. So - * btn_low and is_micbias are ignored and always program button - * thresholds using btn_high. - */ - for (i = 0; i < num_btn; i++) { - vth = ((btn_high[i] * 2) / 25) & 0x3F; - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_BTN0 + i, - 0xFC, vth << 2); - dev_dbg(codec->dev, "%s: btn_high[%d]: %d, vth: %d\n", - __func__, i, btn_high[i], vth); - } -} - -static bool tasha_mbhc_lock_sleep(struct wcd_mbhc *mbhc, bool lock) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - if (lock) - return wcd9xxx_lock_sleep(core_res); - else { - wcd9xxx_unlock_sleep(core_res); - return 0; - } -} - -static int tasha_mbhc_register_notifier(struct wcd_mbhc *mbhc, - struct notifier_block *nblock, - bool enable) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (enable) - return blocking_notifier_chain_register(&tasha->notifier, - nblock); - else - return blocking_notifier_chain_unregister(&tasha->notifier, - nblock); -} - -static bool tasha_mbhc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num) -{ - u8 val; - - if (micb_num == MIC_BIAS_2) { - val = (snd_soc_read(mbhc->codec, WCD9335_ANA_MICB2) >> 6); - if (val == 0x01) - return true; - } - return false; -} - -static bool tasha_mbhc_hph_pa_on_status(struct snd_soc_codec *codec) -{ - return (snd_soc_read(codec, WCD9335_ANA_HPH) & 0xC0) ? true : false; -} - -static void tasha_mbhc_hph_l_pull_up_control(struct snd_soc_codec *codec, - enum mbhc_hs_pullup_iref pull_up_cur) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (!tasha) - return; - - /* Default pull up current to 2uA */ - if (pull_up_cur < I_OFF || pull_up_cur > I_3P0_UA || - pull_up_cur == I_DEFAULT) - pull_up_cur = I_2P0_UA; - - dev_dbg(codec->dev, "%s: HS pull up current:%d\n", - __func__, pull_up_cur); - - if (TASHA_IS_2_0(tasha->wcd9xxx)) - snd_soc_update_bits(codec, WCD9335_MBHC_PLUG_DETECT_CTL, - 0xC0, pull_up_cur << 6); - else - snd_soc_update_bits(codec, WCD9335_MBHC_PLUG_DETECT_CTL, - 0xC0, 0x40); -} - -static int tasha_enable_ext_mb_source(struct wcd_mbhc *mbhc, - bool turn_on) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int ret = 0; - struct on_demand_supply *supply; - - if (!tasha) - return -EINVAL; - - supply = &tasha->on_demand_list[ON_DEMAND_MICBIAS]; - if (!supply->supply) { - dev_dbg(codec->dev, "%s: warning supply not present ond for %s\n", - __func__, "onDemand Micbias"); - return ret; - } - - dev_dbg(codec->dev, "%s turn_on: %d count: %d\n", __func__, turn_on, - supply->ondemand_supply_count); - - if (turn_on) { - if (!(supply->ondemand_supply_count)) { - ret = snd_soc_dapm_force_enable_pin( - snd_soc_codec_get_dapm(codec), - "MICBIAS_REGULATOR"); - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - } - supply->ondemand_supply_count++; - } else { - if (supply->ondemand_supply_count > 0) - supply->ondemand_supply_count--; - if (!(supply->ondemand_supply_count)) { - ret = snd_soc_dapm_disable_pin( - snd_soc_codec_get_dapm(codec), - "MICBIAS_REGULATOR"); - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - } - } - - if (ret) - dev_err(codec->dev, "%s: Failed to %s external micbias source\n", - __func__, turn_on ? "enable" : "disabled"); - else - dev_dbg(codec->dev, "%s: %s external micbias source\n", - __func__, turn_on ? "Enabled" : "Disabled"); - - return ret; -} - -static int tasha_micbias_control(struct snd_soc_codec *codec, - int micb_num, - int req, bool is_dapm) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int micb_index = micb_num - 1; - u16 micb_reg; - int pre_off_event = 0, post_off_event = 0; - int post_on_event = 0, post_dapm_off = 0; - int post_dapm_on = 0; - - if ((micb_index < 0) || (micb_index > TASHA_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD9335_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD9335_ANA_MICB2; - pre_off_event = WCD_EVENT_PRE_MICBIAS_2_OFF; - post_off_event = WCD_EVENT_POST_MICBIAS_2_OFF; - post_on_event = WCD_EVENT_POST_MICBIAS_2_ON; - post_dapm_on = WCD_EVENT_POST_DAPM_MICBIAS_2_ON; - post_dapm_off = WCD_EVENT_POST_DAPM_MICBIAS_2_OFF; - break; - case MIC_BIAS_3: - micb_reg = WCD9335_ANA_MICB3; - break; - case MIC_BIAS_4: - micb_reg = WCD9335_ANA_MICB4; - break; - default: - dev_err(codec->dev, "%s: Invalid micbias number: %d\n", - __func__, micb_num); - return -EINVAL; - } - mutex_lock(&tasha->micb_lock); - - switch (req) { - case MICB_PULLUP_ENABLE: - tasha->pullup_ref[micb_index]++; - if ((tasha->pullup_ref[micb_index] == 1) && - (tasha->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - break; - case MICB_PULLUP_DISABLE: - if (tasha->pullup_ref[micb_index] > 0) - tasha->pullup_ref[micb_index]--; - if ((tasha->pullup_ref[micb_index] == 0) && - (tasha->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - break; - case MICB_ENABLE: - tasha->micb_ref[micb_index]++; - if (tasha->micb_ref[micb_index] == 1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - if (post_on_event) - blocking_notifier_call_chain(&tasha->notifier, - post_on_event, &tasha->mbhc); - } - if (is_dapm && post_dapm_on) - blocking_notifier_call_chain(&tasha->notifier, - post_dapm_on, &tasha->mbhc); - break; - case MICB_DISABLE: - if (tasha->micb_ref[micb_index] > 0) - tasha->micb_ref[micb_index]--; - if ((tasha->micb_ref[micb_index] == 0) && - (tasha->pullup_ref[micb_index] > 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - else if ((tasha->micb_ref[micb_index] == 0) && - (tasha->pullup_ref[micb_index] == 0)) { - if (pre_off_event) - blocking_notifier_call_chain(&tasha->notifier, - pre_off_event, &tasha->mbhc); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - if (post_off_event) - blocking_notifier_call_chain(&tasha->notifier, - post_off_event, &tasha->mbhc); - } - if (is_dapm && post_dapm_off) - blocking_notifier_call_chain(&tasha->notifier, - post_dapm_off, &tasha->mbhc); - break; - }; - - dev_dbg(codec->dev, "%s: micb_num:%d, micb_ref: %d, pullup_ref: %d\n", - __func__, micb_num, tasha->micb_ref[micb_index], - tasha->pullup_ref[micb_index]); - - mutex_unlock(&tasha->micb_lock); - - return 0; -} - -static int tasha_mbhc_request_micbias(struct snd_soc_codec *codec, - int micb_num, int req) -{ - int ret; - - /* - * If micbias is requested, make sure that there - * is vote to enable mclk - */ - if (req == MICB_ENABLE) - tasha_cdc_mclk_enable(codec, true, false); - - ret = tasha_micbias_control(codec, micb_num, req, false); - - /* - * Release vote for mclk while requesting for - * micbias disable - */ - if (req == MICB_DISABLE) - tasha_cdc_mclk_enable(codec, false, false); - - return ret; -} - -static void tasha_mbhc_micb_ramp_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD9335_ANA_MICB2_RAMP, - 0x1C, 0x0C); - snd_soc_update_bits(codec, WCD9335_ANA_MICB2_RAMP, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, WCD9335_ANA_MICB2_RAMP, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD9335_ANA_MICB2_RAMP, - 0x1C, 0x00); - } -} - -static struct firmware_cal *tasha_get_hwdep_fw_cal(struct wcd_mbhc *mbhc, - enum wcd_cal_type type) -{ - struct tasha_priv *tasha; - struct firmware_cal *hwdep_cal; - struct snd_soc_codec *codec = mbhc->codec; - - if (!codec) { - pr_err("%s: NULL codec pointer\n", __func__); - return NULL; - } - tasha = snd_soc_codec_get_drvdata(codec); - hwdep_cal = wcdcal_get_fw_cal(tasha->fw_data, type); - if (!hwdep_cal) - dev_err(codec->dev, "%s: cal not sent by %d\n", - __func__, type); - - return hwdep_cal; -} - -static int tasha_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, - int micb_num) -{ - int cur_vout_ctl, req_vout_ctl; - int micb_reg, micb_val, micb_en; - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD9335_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD9335_ANA_MICB2; - break; - case MIC_BIAS_3: - micb_reg = WCD9335_ANA_MICB3; - break; - case MIC_BIAS_4: - micb_reg = WCD9335_ANA_MICB4; - break; - default: - return -EINVAL; - } - - /* - * If requested micbias voltage is same as current micbias - * voltage, then just return. Otherwise, adjust voltage as - * per requested value. If micbias is already enabled, then - * to avoid slow micbias ramp-up or down enable pull-up - * momentarily, change the micbias value and then re-enable - * micbias. - */ - micb_val = snd_soc_read(codec, micb_reg); - micb_en = (micb_val & 0xC0) >> 6; - cur_vout_ctl = micb_val & 0x3F; - - req_vout_ctl = wcd9335_get_micb_vout_ctl_val(req_volt); - if (req_vout_ctl < 0) - return -EINVAL; - if (cur_vout_ctl == req_vout_ctl) - return 0; - - dev_dbg(codec->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", - __func__, micb_num, WCD_VOUT_CTL_TO_MICB(cur_vout_ctl), - req_volt, micb_en); - - if (micb_en == 0x1) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - - snd_soc_update_bits(codec, micb_reg, 0x3F, req_vout_ctl); - - if (micb_en == 0x1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - /* - * Add 2ms delay as per HW requirement after enabling - * micbias - */ - usleep_range(2000, 2100); - } - - return 0; -} - -static int tasha_mbhc_micb_ctrl_threshold_mic(struct snd_soc_codec *codec, - int micb_num, bool req_en) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - int rc, micb_mv; - - if (micb_num != MIC_BIAS_2) - return -EINVAL; - - /* - * If device tree micbias level is already above the minimum - * voltage needed to detect threshold microphone, then do - * not change the micbias, just return. - */ - if (pdata->micbias.micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) - return 0; - - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : pdata->micbias.micb2_mv; - - mutex_lock(&tasha->micb_lock); - rc = tasha_mbhc_micb_adjust_voltage(codec, micb_mv, MIC_BIAS_2); - mutex_unlock(&tasha->micb_lock); - - return rc; -} - -static inline void tasha_mbhc_get_result_params(struct wcd9xxx *wcd9xxx, - s16 *d1_a, u16 noff, - int32_t *zdet) -{ - int i; - int val, val1; - s16 c1; - s32 x1, d1; - int32_t denom; - int minCode_param[] = { - 3277, 1639, 820, 410, 205, 103, 52, 26 - }; - - regmap_update_bits(wcd9xxx->regmap, WCD9335_ANA_MBHC_ZDET, 0x20, 0x20); - for (i = 0; i < TASHA_ZDET_NUM_MEASUREMENTS; i++) { - regmap_read(wcd9xxx->regmap, WCD9335_ANA_MBHC_RESULT_2, &val); - if (val & 0x80) - break; - } - val = val << 0x8; - regmap_read(wcd9xxx->regmap, WCD9335_ANA_MBHC_RESULT_1, &val1); - val |= val1; - regmap_update_bits(wcd9xxx->regmap, WCD9335_ANA_MBHC_ZDET, 0x20, 0x00); - x1 = TASHA_MBHC_GET_X1(val); - c1 = TASHA_MBHC_GET_C1(val); - /* If ramp is not complete, give additional 5ms */ - if ((c1 < 2) && x1) - usleep_range(5000, 5050); - - if (!c1 || !x1) { - dev_dbg(wcd9xxx->dev, - "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", - __func__, c1, x1); - goto ramp_down; - } - d1 = d1_a[c1]; - denom = (x1 * d1) - (1 << (14 - noff)); - if (denom > 0) - *zdet = (TASHA_MBHC_ZDET_CONST * 1000) / denom; - else if (x1 < minCode_param[noff]) - *zdet = TASHA_ZDET_FLOATING_IMPEDANCE; - - dev_dbg(wcd9xxx->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", - __func__, d1, c1, x1, *zdet); -ramp_down: - i = 0; - while (x1) { - regmap_bulk_read(wcd9xxx->regmap, - WCD9335_ANA_MBHC_RESULT_1, (u8 *)&val, 2); - x1 = TASHA_MBHC_GET_X1(val); - i++; - if (i == TASHA_ZDET_NUM_MEASUREMENTS) - break; - } -} - -/* - * tasha_mbhc_zdet_gpio_ctrl: Register callback function for - * controlling the switch on hifi amps. Default switch state - * will put a 51ohm load in parallel to the hph load. So, - * impedance detection function will pull the gpio high - * to make the switch open. - * - * @zdet_gpio_cb: callback function from machine driver - * @codec: Codec instance - * - * Return: none - */ -void tasha_mbhc_zdet_gpio_ctrl( - int (*zdet_gpio_cb)(struct snd_soc_codec *codec, bool high), - struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - tasha->zdet_gpio_cb = zdet_gpio_cb; -} -EXPORT_SYMBOL(tasha_mbhc_zdet_gpio_ctrl); - -static void tasha_mbhc_zdet_ramp(struct snd_soc_codec *codec, - struct tasha_mbhc_zdet_param *zdet_param, - int32_t *zl, int32_t *zr, s16 *d1_a) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int32_t zdet = 0; - - snd_soc_update_bits(codec, WCD9335_MBHC_ZDET_ANA_CTL, 0x70, - zdet_param->ldo_ctl << 4); - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_BTN5, 0xFC, - zdet_param->btn5); - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_BTN6, 0xFC, - zdet_param->btn6); - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_BTN7, 0xFC, - zdet_param->btn7); - snd_soc_update_bits(codec, WCD9335_MBHC_ZDET_ANA_CTL, 0x0F, - zdet_param->noff); - snd_soc_update_bits(codec, WCD9335_MBHC_ZDET_RAMP_CTL, 0x0F, - zdet_param->nshift); - - if (!zl) - goto z_right; - /* Start impedance measurement for HPH_L */ - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_ZDET, 0x80, 0x80); - dev_dbg(wcd9xxx->dev, "%s: ramp for HPH_L, noff = %d\n", - __func__, zdet_param->noff); - tasha_mbhc_get_result_params(wcd9xxx, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_ZDET, 0x80, 0x00); - - *zl = zdet; - -z_right: - if (!zr) - return; - /* Start impedance measurement for HPH_R */ - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_ZDET, 0x40, 0x40); - dev_dbg(wcd9xxx->dev, "%s: ramp for HPH_R, noff = %d\n", - __func__, zdet_param->noff); - tasha_mbhc_get_result_params(wcd9xxx, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_ZDET, 0x40, 0x00); - - *zr = zdet; -} - -static inline void tasha_wcd_mbhc_qfuse_cal(struct snd_soc_codec *codec, - int32_t *z_val, int flag_l_r) -{ - s16 q1; - int q1_cal; - - if (*z_val < (TASHA_ZDET_VAL_400/1000)) - q1 = snd_soc_read(codec, - WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 + (2 * flag_l_r)); - else - q1 = snd_soc_read(codec, - WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 + (2 * flag_l_r)); - if (q1 & 0x80) - q1_cal = (10000 - ((q1 & 0x7F) * 25)); - else - q1_cal = (10000 + (q1 * 25)); - if (q1_cal > 0) - *z_val = ((*z_val) * 10000) / q1_cal; -} - -static void tasha_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - s16 reg0, reg1, reg2, reg3, reg4; - int32_t z1L, z1R, z1Ls; - int zMono, z_diff1, z_diff2; - bool is_fsm_disable = false; - bool is_change = false; - struct tasha_mbhc_zdet_param zdet_param[] = { - {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */ - {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */ - {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */ - {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */ - }; - struct tasha_mbhc_zdet_param *zdet_param_ptr = NULL; - s16 d1_a[][4] = { - {0, 30, 90, 30}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - }; - s16 *d1 = NULL; - - if (!TASHA_IS_2_0(wcd9xxx)) { - dev_dbg(codec->dev, "%s: Z-det is not supported for this codec version\n", - __func__); - *zl = 0; - *zr = 0; - return; - } - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - if (tasha->zdet_gpio_cb) - is_change = tasha->zdet_gpio_cb(codec, true); - - reg0 = snd_soc_read(codec, WCD9335_ANA_MBHC_BTN5); - reg1 = snd_soc_read(codec, WCD9335_ANA_MBHC_BTN6); - reg2 = snd_soc_read(codec, WCD9335_ANA_MBHC_BTN7); - reg3 = snd_soc_read(codec, WCD9335_MBHC_CTL_1); - reg4 = snd_soc_read(codec, WCD9335_MBHC_ZDET_ANA_CTL); - - if (snd_soc_read(codec, WCD9335_ANA_MBHC_ELECT) & 0x80) { - is_fsm_disable = true; - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_ELECT, 0x80, 0x00); - } - - /* For NO-jack, disable L_DET_EN before Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_MECH, 0x80, 0x00); - - /* Enable AZ */ - snd_soc_update_bits(codec, WCD9335_MBHC_CTL_1, 0x0C, 0x04); - /* Turn off 100k pull down on HPHL */ - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_MECH, 0x01, 0x00); - - /* First get impedance on Left */ - d1 = d1_a[1]; - zdet_param_ptr = &zdet_param[1]; - tasha_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - - if (!TASHA_MBHC_IS_SECOND_RAMP_REQUIRED(z1L)) - goto left_ch_impedance; - - /* second ramp for left ch */ - if (z1L < TASHA_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1L > TASHA_ZDET_VAL_400) && (z1L <= TASHA_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1L > TASHA_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - tasha_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - -left_ch_impedance: - if ((z1L == TASHA_ZDET_FLOATING_IMPEDANCE) || - (z1L > TASHA_ZDET_VAL_100K)) { - *zl = TASHA_ZDET_FLOATING_IMPEDANCE; - zdet_param_ptr = &zdet_param[1]; - d1 = d1_a[1]; - } else { - *zl = z1L/1000; - tasha_wcd_mbhc_qfuse_cal(codec, zl, 0); - } - dev_dbg(codec->dev, "%s: impedance on HPH_L = %d(ohms)\n", - __func__, *zl); - - /* start of right impedance ramp and calculation */ - tasha_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - if (TASHA_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) { - if (((z1R > TASHA_ZDET_VAL_1200) && - (zdet_param_ptr->noff == 0x6)) || - ((*zl) != TASHA_ZDET_FLOATING_IMPEDANCE)) - goto right_ch_impedance; - /* second ramp for right ch */ - if (z1R < TASHA_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1R > TASHA_ZDET_VAL_400) && - (z1R <= TASHA_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1R > TASHA_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - tasha_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - } -right_ch_impedance: - if ((z1R == TASHA_ZDET_FLOATING_IMPEDANCE) || - (z1R > TASHA_ZDET_VAL_100K)) { - *zr = TASHA_ZDET_FLOATING_IMPEDANCE; - } else { - *zr = z1R/1000; - tasha_wcd_mbhc_qfuse_cal(codec, zr, 1); - } - dev_dbg(codec->dev, "%s: impedance on HPH_R = %d(ohms)\n", - __func__, *zr); - - /* mono/stereo detection */ - if ((*zl == TASHA_ZDET_FLOATING_IMPEDANCE) && - (*zr == TASHA_ZDET_FLOATING_IMPEDANCE)) { - dev_dbg(codec->dev, - "%s: plug type is invalid or extension cable\n", - __func__); - goto zdet_complete; - } - if ((*zl == TASHA_ZDET_FLOATING_IMPEDANCE) || - (*zr == TASHA_ZDET_FLOATING_IMPEDANCE) || - ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) || - ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) { - dev_dbg(codec->dev, - "%s: Mono plug type with one ch floating or shorted to GND\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - goto zdet_complete; - } - snd_soc_update_bits(codec, WCD9335_HPH_R_ATEST, 0x02, 0x02); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x40, 0x01); - if (*zl < (TASHA_ZDET_VAL_32/1000)) - tasha_mbhc_zdet_ramp(codec, &zdet_param[0], &z1Ls, NULL, d1); - else - tasha_mbhc_zdet_ramp(codec, &zdet_param[1], &z1Ls, NULL, d1); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x40, 0x00); - snd_soc_update_bits(codec, WCD9335_HPH_R_ATEST, 0x02, 0x00); - z1Ls /= 1000; - tasha_wcd_mbhc_qfuse_cal(codec, &z1Ls, 0); - /* parallel of left Z and 9 ohm pull down resistor */ - zMono = ((*zl) * 9) / ((*zl) + 9); - z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); - z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); - if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) { - dev_dbg(codec->dev, "%s: stereo plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } else { - dev_dbg(codec->dev, "%s: MONO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } - -zdet_complete: - snd_soc_write(codec, WCD9335_ANA_MBHC_BTN5, reg0); - snd_soc_write(codec, WCD9335_ANA_MBHC_BTN6, reg1); - snd_soc_write(codec, WCD9335_ANA_MBHC_BTN7, reg2); - /* Turn on 100k pull down on HPHL */ - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_MECH, 0x01, 0x01); - - /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_MECH, 0x80, 0x80); - - snd_soc_write(codec, WCD9335_MBHC_ZDET_ANA_CTL, reg4); - snd_soc_write(codec, WCD9335_MBHC_CTL_1, reg3); - if (is_fsm_disable) - regmap_update_bits(wcd9xxx->regmap, - WCD9335_ANA_MBHC_ELECT, 0x80, 0x80); - if (tasha->zdet_gpio_cb && is_change) - tasha->zdet_gpio_cb(codec, false); -} - -static void tasha_mbhc_gnd_det_ctrl(struct snd_soc_codec *codec, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_MECH, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_MECH, - 0x40, 0x40); - } else { - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_MECH, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD9335_ANA_MBHC_MECH, - 0x02, 0x00); - } -} - -static void tasha_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (enable) { - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, - 0x40, 0x40); - if (TASHA_IS_2_0(tasha->wcd9xxx)) - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, - 0x10, 0x10); - } else { - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, - 0x40, 0x00); - if (TASHA_IS_2_0(tasha->wcd9xxx)) - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, - 0x10, 0x00); - } -} - -static void tasha_mbhc_moisture_config(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if (mbhc->moist_vref == V_OFF) - return; - - /* Donot enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - return; - } - - snd_soc_update_bits(codec, WCD9335_MBHC_CTL_2, - 0x0C, mbhc->moist_vref << 2); - tasha_mbhc_hph_l_pull_up_control(codec, mbhc->moist_iref); -} - -static void tasha_update_anc_state(struct snd_soc_codec *codec, bool enable, - int anc_num) -{ - if (enable) - snd_soc_update_bits(codec, WCD9335_CDC_RX1_RX_PATH_CFG0 + - (20 * anc_num), 0x10, 0x10); - else - snd_soc_update_bits(codec, WCD9335_CDC_RX1_RX_PATH_CFG0 + - (20 * anc_num), 0x10, 0x00); -} - -static bool tasha_is_anc_on(struct wcd_mbhc *mbhc) -{ - bool anc_on = false; - u16 ancl, ancr; - - ancl = - (snd_soc_read(mbhc->codec, WCD9335_CDC_RX1_RX_PATH_CFG0)) & 0x10; - ancr = - (snd_soc_read(mbhc->codec, WCD9335_CDC_RX2_RX_PATH_CFG0)) & 0x10; - - anc_on = !!(ancl | ancr); - - return anc_on; -} - -static const struct wcd_mbhc_cb mbhc_cb = { - .request_irq = tasha_mbhc_request_irq, - .irq_control = tasha_mbhc_irq_control, - .free_irq = tasha_mbhc_free_irq, - .clk_setup = tasha_mbhc_clk_setup, - .map_btn_code_to_num = tasha_mbhc_btn_to_num, - .enable_mb_source = tasha_enable_ext_mb_source, - .mbhc_bias = tasha_mbhc_mbhc_bias_control, - .set_btn_thr = tasha_mbhc_program_btn_thr, - .lock_sleep = tasha_mbhc_lock_sleep, - .register_notifier = tasha_mbhc_register_notifier, - .micbias_enable_status = tasha_mbhc_micb_en_status, - .hph_pa_on_status = tasha_mbhc_hph_pa_on_status, - .hph_pull_up_control = tasha_mbhc_hph_l_pull_up_control, - .mbhc_micbias_control = tasha_mbhc_request_micbias, - .mbhc_micb_ramp_control = tasha_mbhc_micb_ramp_control, - .get_hwdep_fw_cal = tasha_get_hwdep_fw_cal, - .mbhc_micb_ctrl_thr_mic = tasha_mbhc_micb_ctrl_threshold_mic, - .compute_impedance = tasha_wcd_mbhc_calc_impedance, - .mbhc_gnd_det_ctrl = tasha_mbhc_gnd_det_ctrl, - .hph_pull_down_ctrl = tasha_mbhc_hph_pull_down_ctrl, - .mbhc_moisture_config = tasha_mbhc_moisture_config, - .update_anc_state = tasha_update_anc_state, - .is_anc_on = tasha_is_anc_on, -}; - -static int tasha_get_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tasha->anc_slot; - return 0; -} - -static int tasha_put_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - tasha->anc_slot = ucontrol->value.integer.value[0]; - return 0; -} - -static int tasha_get_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = (tasha->anc_func == true ? 1 : 0); - return 0; -} - -static int tasha_put_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - mutex_lock(&tasha->codec_mutex); - tasha->anc_func = (!ucontrol->value.integer.value[0] ? false : true); - - dev_dbg(codec->dev, "%s: anc_func %x", __func__, tasha->anc_func); - - if (tasha->anc_func == true) { - snd_soc_dapm_enable_pin(dapm, "ANC LINEOUT2 PA"); - snd_soc_dapm_enable_pin(dapm, "ANC LINEOUT2"); - snd_soc_dapm_enable_pin(dapm, "ANC LINEOUT1 PA"); - snd_soc_dapm_enable_pin(dapm, "ANC LINEOUT1"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_enable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_enable_pin(dapm, "ANC EAR"); - snd_soc_dapm_enable_pin(dapm, "ANC SPK1 PA"); - snd_soc_dapm_disable_pin(dapm, "LINEOUT2"); - snd_soc_dapm_disable_pin(dapm, "LINEOUT2 PA"); - snd_soc_dapm_disable_pin(dapm, "LINEOUT1"); - snd_soc_dapm_disable_pin(dapm, "LINEOUT1 PA"); - snd_soc_dapm_disable_pin(dapm, "HPHR"); - snd_soc_dapm_disable_pin(dapm, "HPHL"); - snd_soc_dapm_disable_pin(dapm, "HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "EAR PA"); - snd_soc_dapm_disable_pin(dapm, "EAR"); - } else { - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT2 PA"); - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT2"); - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT1 PA"); - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT1"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR"); - snd_soc_dapm_disable_pin(dapm, "ANC SPK1 PA"); - snd_soc_dapm_enable_pin(dapm, "LINEOUT2"); - snd_soc_dapm_enable_pin(dapm, "LINEOUT2 PA"); - snd_soc_dapm_enable_pin(dapm, "LINEOUT1"); - snd_soc_dapm_enable_pin(dapm, "LINEOUT1 PA"); - snd_soc_dapm_enable_pin(dapm, "HPHR"); - snd_soc_dapm_enable_pin(dapm, "HPHL"); - snd_soc_dapm_enable_pin(dapm, "HPHR PA"); - snd_soc_dapm_enable_pin(dapm, "HPHL PA"); - snd_soc_dapm_enable_pin(dapm, "EAR PA"); - snd_soc_dapm_enable_pin(dapm, "EAR"); - } - mutex_unlock(&tasha->codec_mutex); - snd_soc_dapm_sync(dapm); - return 0; -} - -static int tasha_get_clkmode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = tasha->clk_mode; - dev_dbg(codec->dev, "%s: clk_mode: %d\n", __func__, tasha->clk_mode); - - return 0; -} - -static int tasha_put_clkmode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - tasha->clk_mode = ucontrol->value.enumerated.item[0]; - dev_dbg(codec->dev, "%s: clk_mode: %d\n", __func__, tasha->clk_mode); - - return 0; -} - -static int tasha_get_iir_enable_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - /* IIR filter band registers are at integer multiples of 16 */ - u16 iir_reg = WCD9335_CDC_SIDETONE_IIR0_IIR_CTL + 16 * iir_idx; - - ucontrol->value.integer.value[0] = (snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0; - - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0]); - return 0; -} - -static int tasha_hph_impedance_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t zl, zr; - bool hphr; - struct soc_multi_mixer_control *mc; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - wcd_mbhc_get_impedance(&priv->mbhc, &zl, &zr); - dev_dbg(codec->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); - ucontrol->value.integer.value[0] = hphr ? zr : zl; - - return 0; -} - -static const struct snd_kcontrol_new impedance_detect_controls[] = { - SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0, - tasha_hph_impedance_get, NULL), - SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0, - tasha_hph_impedance_get, NULL), -}; - -static int tasha_get_hph_type(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - struct wcd_mbhc *mbhc; - - if (!priv) { - dev_dbg(codec->dev, "%s: wcd9335 private data is NULL\n", - __func__); - return 0; - } - - mbhc = &priv->mbhc; - if (!mbhc) { - dev_dbg(codec->dev, "%s: mbhc not initialized\n", __func__); - return 0; - } - - ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; - dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); - - return 0; -} - -static const struct snd_kcontrol_new hph_type_detect_controls[] = { - SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, - tasha_get_hph_type, NULL), -}; - -static int tasha_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tasha_p->vi_feed_value; - - return 0; -} - -static int tasha_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = tasha_p->wcd9xxx; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: enable: %d, port_id:%d, dai_id: %d\n", - __func__, enable, port_id, dai_id); - - tasha_p->vi_feed_value = ucontrol->value.integer.value[0]; - - mutex_lock(&tasha_p->codec_mutex); - if (enable) { - if (port_id == TASHA_TX14 && !test_bit(VI_SENSE_1, - &tasha_p->status_mask)) { - list_add_tail(&core->tx_chs[TASHA_TX14].list, - &tasha_p->dai[dai_id].wcd9xxx_ch_list); - set_bit(VI_SENSE_1, &tasha_p->status_mask); - } - if (port_id == TASHA_TX15 && !test_bit(VI_SENSE_2, - &tasha_p->status_mask)) { - list_add_tail(&core->tx_chs[TASHA_TX15].list, - &tasha_p->dai[dai_id].wcd9xxx_ch_list); - set_bit(VI_SENSE_2, &tasha_p->status_mask); - } - } else { - if (port_id == TASHA_TX14 && test_bit(VI_SENSE_1, - &tasha_p->status_mask)) { - list_del_init(&core->tx_chs[TASHA_TX14].list); - clear_bit(VI_SENSE_1, &tasha_p->status_mask); - } - if (port_id == TASHA_TX15 && test_bit(VI_SENSE_2, - &tasha_p->status_mask)) { - list_del_init(&core->tx_chs[TASHA_TX15].list); - clear_bit(VI_SENSE_2, &tasha_p->status_mask); - } - } - mutex_unlock(&tasha_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); - - return 0; -} - -/* virtual port entries */ -static int slim_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tasha_p->tx_port_value; - return 0; -} - -static int slim_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - u32 vtable; - - - dev_dbg(codec->dev, "%s: wname %s cname %s value %u shift %d item %ld\n", - __func__, - widget->name, ucontrol->id.name, tasha_p->tx_port_value, - widget->shift, ucontrol->value.integer.value[0]); - - mutex_lock(&tasha_p->codec_mutex); - - if (tasha_p->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - if (dai_id >= ARRAY_SIZE(vport_slim_check_table)) { - dev_err(codec->dev, "%s: dai_id: %d, out of bounds\n", - __func__, dai_id); - mutex_unlock(&tasha_p->codec_mutex); - return -EINVAL; - } - vtable = vport_slim_check_table[dai_id]; - } else { - if (dai_id >= ARRAY_SIZE(vport_i2s_check_table)) { - dev_err(codec->dev, "%s: dai_id: %d, out of bounds\n", - __func__, dai_id); - return -EINVAL; - } - vtable = vport_i2s_check_table[dai_id]; - } - switch (dai_id) { - case AIF1_CAP: - case AIF2_CAP: - case AIF3_CAP: - /* only add to the list if value not set */ - if (enable && !(tasha_p->tx_port_value & 1 << port_id)) { - - if (wcd9xxx_tx_vport_validation(vtable, port_id, - tasha_p->dai, NUM_CODEC_DAIS)) { - dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n", - __func__, port_id); - mutex_unlock(&tasha_p->codec_mutex); - return 0; - } - tasha_p->tx_port_value |= 1 << port_id; - list_add_tail(&core->tx_chs[port_id].list, - &tasha_p->dai[dai_id].wcd9xxx_ch_list - ); - } else if (!enable && (tasha_p->tx_port_value & - 1 << port_id)) { - tasha_p->tx_port_value &= ~(1 << port_id); - list_del_init(&core->tx_chs[port_id].list); - } else { - if (enable) - dev_dbg(codec->dev, "%s: TX%u port is used by\n" - "this virtual port\n", - __func__, port_id); - else - dev_dbg(codec->dev, "%s: TX%u port is not used by\n" - "this virtual port\n", - __func__, port_id); - /* avoid update power function */ - mutex_unlock(&tasha_p->codec_mutex); - return 0; - } - break; - case AIF4_MAD_TX: - case AIF5_CPE_TX: - break; - default: - pr_err("Unknown AIF %d\n", dai_id); - mutex_unlock(&tasha_p->codec_mutex); - return -EINVAL; - } - pr_debug("%s: name %s sname %s updated value %u shift %d\n", __func__, - widget->name, widget->sname, tasha_p->tx_port_value, - widget->shift); - - mutex_unlock(&tasha_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} - -static int slim_rx_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = - tasha_p->rx_port_value[widget->shift]; - return 0; -} - -static const char *const slim_rx_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB", "AIF_MIX1_PB" -}; - -static int slim_rx_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - unsigned int rx_port_value; - u32 port_id = widget->shift; - - tasha_p->rx_port_value[port_id] = ucontrol->value.enumerated.item[0]; - rx_port_value = tasha_p->rx_port_value[port_id]; - - pr_debug("%s: wname %s cname %s value %u shift %d item %ld\n", __func__, - widget->name, ucontrol->id.name, rx_port_value, - widget->shift, ucontrol->value.integer.value[0]); - - mutex_lock(&tasha_p->codec_mutex); - - if (tasha_p->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - if (rx_port_value > 2) { - dev_err(codec->dev, "%s: invalid AIF for I2C mode\n", - __func__); - goto err; - } - } - /* value need to match the Virtual port and AIF number */ - switch (rx_port_value) { - case 0: - list_del_init(&core->rx_chs[port_id].list); - break; - case 1: - if (wcd9xxx_rx_vport_validation(port_id + - TASHA_RX_PORT_START_NUMBER, - &tasha_p->dai[AIF1_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tasha_p->dai[AIF1_PB].wcd9xxx_ch_list); - break; - case 2: - if (wcd9xxx_rx_vport_validation(port_id + - TASHA_RX_PORT_START_NUMBER, - &tasha_p->dai[AIF2_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tasha_p->dai[AIF2_PB].wcd9xxx_ch_list); - break; - case 3: - if (wcd9xxx_rx_vport_validation(port_id + - TASHA_RX_PORT_START_NUMBER, - &tasha_p->dai[AIF3_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tasha_p->dai[AIF3_PB].wcd9xxx_ch_list); - break; - case 4: - if (wcd9xxx_rx_vport_validation(port_id + - TASHA_RX_PORT_START_NUMBER, - &tasha_p->dai[AIF4_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tasha_p->dai[AIF4_PB].wcd9xxx_ch_list); - break; - case 5: - if (wcd9xxx_rx_vport_validation(port_id + - TASHA_RX_PORT_START_NUMBER, - &tasha_p->dai[AIF_MIX1_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tasha_p->dai[AIF_MIX1_PB].wcd9xxx_ch_list); - break; - default: - pr_err("Unknown AIF %d\n", rx_port_value); - goto err; - } -rtn: - mutex_unlock(&tasha_p->codec_mutex); - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - - return 0; -err: - mutex_unlock(&tasha_p->codec_mutex); - return -EINVAL; -} - -static const struct soc_enum slim_rx_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim_rx_mux_text), slim_rx_mux_text); - -static const struct snd_kcontrol_new slim_rx_mux[TASHA_RX_MAX] = { - SOC_DAPM_ENUM_EXT("SLIM RX0 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), - SOC_DAPM_ENUM_EXT("SLIM RX1 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), - SOC_DAPM_ENUM_EXT("SLIM RX2 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), - SOC_DAPM_ENUM_EXT("SLIM RX3 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), - SOC_DAPM_ENUM_EXT("SLIM RX4 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), - SOC_DAPM_ENUM_EXT("SLIM RX5 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), - SOC_DAPM_ENUM_EXT("SLIM RX6 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), - SOC_DAPM_ENUM_EXT("SLIM RX7 Mux", slim_rx_mux_enum, - slim_rx_mux_get, slim_rx_mux_put), -}; - -static const struct snd_kcontrol_new aif4_vi_mixer[] = { - SOC_SINGLE_EXT("SPKR_VI_1", SND_SOC_NOPM, TASHA_TX14, 1, 0, - tasha_vi_feed_mixer_get, tasha_vi_feed_mixer_put), - SOC_SINGLE_EXT("SPKR_VI_2", SND_SOC_NOPM, TASHA_TX15, 1, 0, - tasha_vi_feed_mixer_get, tasha_vi_feed_mixer_put), -}; - -static const struct snd_kcontrol_new aif1_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, TASHA_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, TASHA_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, TASHA_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, TASHA_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, TASHA_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, TASHA_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, TASHA_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, TASHA_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, TASHA_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, TASHA_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, TASHA_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, TASHA_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, TASHA_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif2_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, TASHA_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, TASHA_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, TASHA_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, TASHA_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, TASHA_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, TASHA_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, TASHA_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, TASHA_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, TASHA_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, TASHA_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, TASHA_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, TASHA_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, TASHA_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif3_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, TASHA_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, TASHA_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, TASHA_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, TASHA_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, TASHA_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, TASHA_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, TASHA_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, TASHA_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, TASHA_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, TASHA_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, TASHA_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, TASHA_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, TASHA_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif4_mad_mixer[] = { - SOC_SINGLE_EXT("SLIM TX12", SND_SOC_NOPM, TASHA_TX12, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, TASHA_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, 0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - -}; - -static const struct snd_kcontrol_new rx_int1_spline_mix_switch[] = { - SOC_DAPM_SINGLE("HPHL Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int2_spline_mix_switch[] = { - SOC_DAPM_SINGLE("HPHR Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int3_spline_mix_switch[] = { - SOC_DAPM_SINGLE("LO1 Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int4_spline_mix_switch[] = { - SOC_DAPM_SINGLE("LO2 Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int5_spline_mix_switch[] = { - SOC_DAPM_SINGLE("LO3 Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int6_spline_mix_switch[] = { - SOC_DAPM_SINGLE("LO4 Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int7_spline_mix_switch[] = { - SOC_DAPM_SINGLE("SPKRL Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int8_spline_mix_switch[] = { - SOC_DAPM_SINGLE("SPKRR Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int5_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("LO3 VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int6_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("LO4 VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int7_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("SPKRL VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new rx_int8_vbat_mix_switch[] = { - SOC_DAPM_SINGLE("SPKRR VBAT Enable", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new cpe_in_mix_switch[] = { - SOC_DAPM_SINGLE("MAD_BYPASS", SND_SOC_NOPM, 0, 1, 0) -}; - - - -static int tasha_put_iir_enable_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - bool iir_band_en_status; - int value = ucontrol->value.integer.value[0]; - u16 iir_reg = WCD9335_CDC_SIDETONE_IIR0_IIR_CTL + 16 * iir_idx; - - /* Mask first 5 bits, 6-8 are reserved */ - snd_soc_update_bits(codec, iir_reg, (1 << band_idx), - (value << band_idx)); - - iir_band_en_status = ((snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0); - pr_debug("%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, iir_band_en_status); - return 0; -} - -static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - int coeff_idx) -{ - uint32_t value = 0; - - /* Address does not automatically update if reading */ - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t)) & 0x7F); - - value |= snd_soc_read(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx)); - - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 1) & 0x7F); - - value |= (snd_soc_read(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) << 8); - - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 2) & 0x7F); - - value |= (snd_soc_read(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) << 16); - - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 3) & 0x7F); - - /* Mask bits top 2 bits since they are reserved */ - value |= ((snd_soc_read(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) & 0x3F) << 24); - - return value; -} - -static int tasha_get_iir_band_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - get_iir_band_coeff(codec, iir_idx, band_idx, 0); - ucontrol->value.integer.value[1] = - get_iir_band_coeff(codec, iir_idx, band_idx, 1); - ucontrol->value.integer.value[2] = - get_iir_band_coeff(codec, iir_idx, band_idx, 2); - ucontrol->value.integer.value[3] = - get_iir_band_coeff(codec, iir_idx, band_idx, 3); - ucontrol->value.integer.value[4] = - get_iir_band_coeff(codec, iir_idx, band_idx, 4); - - pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[1], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[2], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[3], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[4]); - return 0; -} - -static void set_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - uint32_t value) -{ - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value & 0xFF)); - - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 8) & 0xFF); - - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 16) & 0xFF); - - /* Mask top 2 bits, 7-8 are reserved */ - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 24) & 0x3F); -} - -static void tasha_codec_enable_int_port(struct wcd9xxx_codec_dai_data *dai, - struct snd_soc_codec *codec) -{ - struct wcd9xxx_ch *ch; - int port_num = 0; - unsigned short reg = 0; - u8 val = 0; - struct tasha_priv *tasha_p; - - if (!dai || !codec) { - pr_err("%s: Invalid params\n", __func__); - return; - } - - tasha_p = snd_soc_codec_get_drvdata(codec); - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - if (ch->port >= TASHA_RX_PORT_START_NUMBER) { - port_num = ch->port - TASHA_RX_PORT_START_NUMBER; - reg = TASHA_SLIM_PGD_PORT_INT_EN0 + (port_num / 8); - val = wcd9xxx_interface_reg_read(tasha_p->wcd9xxx, - reg); - if (!(val & BYTE_BIT_MASK(port_num))) { - val |= BYTE_BIT_MASK(port_num); - wcd9xxx_interface_reg_write( - tasha_p->wcd9xxx, reg, val); - val = wcd9xxx_interface_reg_read( - tasha_p->wcd9xxx, reg); - } - } else { - port_num = ch->port; - reg = TASHA_SLIM_PGD_PORT_INT_TX_EN0 + (port_num / 8); - val = wcd9xxx_interface_reg_read(tasha_p->wcd9xxx, - reg); - if (!(val & BYTE_BIT_MASK(port_num))) { - val |= BYTE_BIT_MASK(port_num); - wcd9xxx_interface_reg_write(tasha_p->wcd9xxx, - reg, val); - val = wcd9xxx_interface_reg_read( - tasha_p->wcd9xxx, reg); - } - } - } -} - -static int tasha_codec_enable_slim_chmask(struct wcd9xxx_codec_dai_data *dai, - bool up) -{ - int ret = 0; - struct wcd9xxx_ch *ch; - - if (up) { - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - ret = wcd9xxx_get_slave_port(ch->ch_num); - if (ret < 0) { - pr_err("%s: Invalid slave port ID: %d\n", - __func__, ret); - ret = -EINVAL; - } else { - set_bit(ret, &dai->ch_mask); - } - } - } else { - ret = wait_event_timeout(dai->dai_wait, (dai->ch_mask == 0), - msecs_to_jiffies( - TASHA_SLIM_CLOSE_TIMEOUT)); - if (!ret) { - pr_err("%s: Slim close tx/rx wait timeout, ch_mask:0x%lx\n", - __func__, dai->ch_mask); - ret = -ETIMEDOUT; - } else { - ret = 0; - } - } - return ret; -} - -static int tasha_codec_enable_slimrx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct wcd9xxx *core; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - int ret = 0; - struct wcd9xxx_codec_dai_data *dai; - - core = dev_get_drvdata(codec->dev->parent); - - dev_dbg(codec->dev, "%s: event called! codec name %s num_dai %d\n" - "stream name %s event %d\n", - __func__, codec->component.name, - codec->component.num_dai, w->sname, event); - - /* Execute the callback only if interface type is slimbus */ - if (tasha_p->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS) - return 0; - - dai = &tasha_p->dai[w->shift]; - dev_dbg(codec->dev, "%s: w->name %s w->shift %d event %d\n", - __func__, w->name, w->shift, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - dai->bus_down_in_recovery = false; - tasha_codec_enable_int_port(dai, codec); - (void) tasha_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_PRE_PMD: - tasha_codec_vote_max_bw(codec, true); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_disconnect_port(core, &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect RX port, ret = %d\n", - __func__, ret); - - if (!dai->bus_down_in_recovery) - ret = tasha_codec_enable_slim_chmask(dai, false); - else - dev_dbg(codec->dev, - "%s: bus in recovery skip enable slim_chmask", - __func__); - ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list, - dai->grph); - break; - } - return ret; -} - -static int tasha_codec_enable_slimvi_feedback(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct wcd9xxx *core = NULL; - struct snd_soc_codec *codec = NULL; - struct tasha_priv *tasha_p = NULL; - int ret = 0; - struct wcd9xxx_codec_dai_data *dai = NULL; - - if (!w) { - pr_err("%s invalid params\n", __func__); - return -EINVAL; - } - codec = snd_soc_dapm_to_codec(w->dapm); - tasha_p = snd_soc_codec_get_drvdata(codec); - core = tasha_p->wcd9xxx; - - dev_dbg(codec->dev, "%s: num_dai %d stream name %s\n", - __func__, codec->component.num_dai, w->sname); - - /* Execute the callback only if interface type is slimbus */ - if (tasha_p->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - dev_err(codec->dev, "%s Interface is not correct", __func__); - return 0; - } - - dev_dbg(codec->dev, "%s(): w->name %s event %d w->shift %d\n", - __func__, w->name, event, w->shift); - if (w->shift != AIF4_VIFEED) { - pr_err("%s Error in enabling the tx path\n", __func__); - ret = -EINVAL; - goto out_vi; - } - dai = &tasha_p->dai[w->shift]; - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (test_bit(VI_SENSE_1, &tasha_p->status_mask)) { - dev_dbg(codec->dev, "%s: spkr1 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL, 0x0F, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, - WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - if (test_bit(VI_SENSE_2, &tasha_p->status_mask)) { - pr_debug("%s: spkr2 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - dai->bus_down_in_recovery = false; - tasha_codec_enable_int_port(dai, codec); - (void) tasha_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->grph); - if (ret) - dev_err(codec->dev, "%s error in close_slim_sch_tx %d\n", - __func__, ret); - if (!dai->bus_down_in_recovery) - ret = tasha_codec_enable_slim_chmask(dai, false); - if (ret < 0) { - ret = wcd9xxx_disconnect_port(core, - &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect TX port, ret = %d\n", - __func__, ret); - } - if (test_bit(VI_SENSE_1, &tasha_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr1 disabled\n", __func__); - snd_soc_update_bits(codec, - WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - if (test_bit(VI_SENSE_2, &tasha_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr2 disabled\n", __func__); - snd_soc_update_bits(codec, - WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - break; - } -out_vi: - return ret; -} - -/* - * __tasha_codec_enable_slimtx: Enable the slimbus slave port - * for TX path - * @codec: Handle to the codec for which the slave port is to be - * enabled. - * @dai_data: The dai specific data for dai which is enabled. - */ -static int __tasha_codec_enable_slimtx(struct snd_soc_codec *codec, - int event, struct wcd9xxx_codec_dai_data *dai) -{ - struct wcd9xxx *core; - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - /* Execute the callback only if interface type is slimbus */ - if (tasha_p->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS) - return 0; - - dev_dbg(codec->dev, - "%s: event = %d\n", __func__, event); - core = dev_get_drvdata(codec->dev->parent); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - dai->bus_down_in_recovery = false; - tasha_codec_enable_int_port(dai, codec); - (void) tasha_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->grph); - if (!dai->bus_down_in_recovery) - ret = tasha_codec_enable_slim_chmask(dai, false); - if (ret < 0) { - ret = wcd9xxx_disconnect_port(core, - &dai->wcd9xxx_ch_list, - dai->grph); - pr_debug("%s: Disconnect TX port, ret = %d\n", - __func__, ret); - } - - break; - } - - return ret; -} - -static int tasha_codec_enable_slimtx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_codec_dai_data *dai; - - dev_dbg(codec->dev, - "%s: w->name %s, w->shift = %d, num_dai %d stream name %s\n", - __func__, w->name, w->shift, - codec->component.num_dai, w->sname); - - dai = &tasha_p->dai[w->shift]; - return __tasha_codec_enable_slimtx(codec, event, dai); -} - -static void tasha_codec_cpe_pp_set_cfg(struct snd_soc_codec *codec, int event) -{ - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_codec_dai_data *dai; - u8 bit_width, rate, buf_period; - - dai = &tasha_p->dai[AIF4_MAD_TX]; - switch (event) { - case SND_SOC_DAPM_POST_PMU: - switch (dai->bit_width) { - case 32: - bit_width = 0xF; - break; - case 24: - bit_width = 0xE; - break; - case 20: - bit_width = 0xD; - break; - case 16: - default: - bit_width = 0x0; - break; - } - snd_soc_update_bits(codec, WCD9335_CPE_SS_TX_PP_CFG, 0x0F, - bit_width); - - switch (dai->rate) { - case 384000: - rate = 0x30; - break; - case 192000: - rate = 0x20; - break; - case 48000: - rate = 0x10; - break; - case 16000: - default: - rate = 0x00; - break; - } - snd_soc_update_bits(codec, WCD9335_CPE_SS_TX_PP_CFG, 0x70, - rate); - - buf_period = (dai->rate * (dai->bit_width/8)) / (16*1000); - snd_soc_update_bits(codec, WCD9335_CPE_SS_TX_PP_BUF_INT_PERIOD, - 0xFF, buf_period); - dev_dbg(codec->dev, "%s: PP buffer period= 0x%x\n", - __func__, buf_period); - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_write(codec, WCD9335_CPE_SS_TX_PP_CFG, 0x3C); - snd_soc_write(codec, WCD9335_CPE_SS_TX_PP_BUF_INT_PERIOD, 0x60); - break; - - default: - break; - } -} - -/* - * tasha_codec_get_mad_port_id: Callback function that will be invoked - * to get the port ID for MAD. - * @codec: Handle to the codec - * @port_id: cpe port_id needs to enable - */ -static int tasha_codec_get_mad_port_id(struct snd_soc_codec *codec, - u16 *port_id) -{ - struct tasha_priv *tasha_p; - struct wcd9xxx_codec_dai_data *dai; - struct wcd9xxx_ch *ch; - - if (!port_id || !codec) - return -EINVAL; - - tasha_p = snd_soc_codec_get_drvdata(codec); - if (!tasha_p) - return -EINVAL; - - dai = &tasha_p->dai[AIF4_MAD_TX]; - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - if (ch->port == TASHA_TX12) - *port_id = WCD_CPE_AFE_OUT_PORT_2; - else if (ch->port == TASHA_TX13) - *port_id = WCD_CPE_AFE_OUT_PORT_4; - else { - dev_err(codec->dev, "%s: invalid mad_port = %d\n", - __func__, ch->port); - return -EINVAL; - } - } - dev_dbg(codec->dev, "%s: port_id = %d\n", __func__, *port_id); - - return 0; -} - -/* - * tasha_codec_enable_slimtx_mad: Callback function that will be invoked - * to setup the slave port for MAD. - * @codec: Handle to the codec - * @event: Indicates whether to enable or disable the slave port - */ -static int tasha_codec_enable_slimtx_mad(struct snd_soc_codec *codec, - u8 event) -{ - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_codec_dai_data *dai; - struct wcd9xxx_ch *ch; - int dapm_event = SND_SOC_DAPM_POST_PMU; - u16 port = 0; - int ret = 0; - - dai = &tasha_p->dai[AIF4_MAD_TX]; - - if (event == 0) - dapm_event = SND_SOC_DAPM_POST_PMD; - - dev_dbg(codec->dev, - "%s: mad_channel, event = 0x%x\n", - __func__, event); - - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - dev_dbg(codec->dev, "%s: mad_port = %d, event = 0x%x\n", - __func__, ch->port, event); - if (ch->port == TASHA_TX13) { - tasha_codec_cpe_pp_set_cfg(codec, dapm_event); - port = TASHA_TX13; - break; - } - } - - ret = __tasha_codec_enable_slimtx(codec, dapm_event, dai); - - if (port == TASHA_TX13) { - switch (dapm_event) { - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN, - 0x20, 0x00); - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_SB_TX13_INP_CFG, - 0x03, 0x02); - snd_soc_update_bits(codec, WCD9335_CPE_SS_CFG, - 0x80, 0x80); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN, - 0x20, 0x20); - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_SB_TX13_INP_CFG, - 0x03, 0x00); - snd_soc_update_bits(codec, WCD9335_CPE_SS_CFG, - 0x80, 0x00); - break; - } - } - - return ret; -} - -static int tasha_put_iir_band_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - /* - * Mask top bit it is reserved - * Updates addr automatically for each B2 write - */ - snd_soc_write(codec, - (WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[0]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[1]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[2]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[3]); - set_iir_band_coeff(codec, iir_idx, band_idx, - ucontrol->value.integer.value[4]); - - pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 0), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 1), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 2), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 3), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 4)); - return 0; -} - -static int tasha_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tasha->comp_enabled[comp]; - return 0; -} - -static int tasha_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - - pr_debug("%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, tasha->comp_enabled[comp], value); - tasha->comp_enabled[comp] = value; - - /* Any specific register configuration for compander */ - switch (comp) { - case COMPANDER_1: - /* Set Gain Source Select based on compander enable/disable */ - snd_soc_update_bits(codec, WCD9335_HPH_L_EN, 0x20, - (value ? 0x00:0x20)); - break; - case COMPANDER_2: - snd_soc_update_bits(codec, WCD9335_HPH_R_EN, 0x20, - (value ? 0x00:0x20)); - break; - case COMPANDER_3: - break; - case COMPANDER_4: - break; - case COMPANDER_5: - snd_soc_update_bits(codec, WCD9335_SE_LO_LO3_GAIN, 0x20, - (value ? 0x00:0x20)); - break; - case COMPANDER_6: - snd_soc_update_bits(codec, WCD9335_SE_LO_LO4_GAIN, 0x20, - (value ? 0x00:0x20)); - break; - case COMPANDER_7: - break; - case COMPANDER_8: - break; - default: - /* - * if compander is not enabled for any interpolator, - * it does not cause any audio failure, so do not - * return error in this case, but just print a log - */ - dev_warn(codec->dev, "%s: unknown compander: %d\n", - __func__, comp); - }; - return 0; -} - -static void tasha_codec_init_flyback(struct snd_soc_codec *codec) -{ - snd_soc_update_bits(codec, WCD9335_HPH_L_EN, 0xC0, 0x00); - snd_soc_update_bits(codec, WCD9335_HPH_R_EN, 0xC0, 0x00); - snd_soc_update_bits(codec, WCD9335_RX_BIAS_FLYB_BUFF, 0x0F, 0x00); - snd_soc_update_bits(codec, WCD9335_RX_BIAS_FLYB_BUFF, 0xF0, 0x00); -} - -static int tasha_codec_enable_rx_bias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tasha->rx_bias_count++; - if (tasha->rx_bias_count == 1) { - if (TASHA_IS_2_0(tasha->wcd9xxx)) - tasha_codec_init_flyback(codec); - snd_soc_update_bits(codec, WCD9335_ANA_RX_SUPPLIES, - 0x01, 0x01); - } - break; - case SND_SOC_DAPM_POST_PMD: - tasha->rx_bias_count--; - if (!tasha->rx_bias_count) - snd_soc_update_bits(codec, WCD9335_ANA_RX_SUPPLIES, - 0x01, 0x00); - break; - }; - dev_dbg(codec->dev, "%s: Current RX BIAS user count: %d\n", __func__, - tasha->rx_bias_count); - - return 0; -} - -static void tasha_realign_anc_coeff(struct snd_soc_codec *codec, - u16 reg1, u16 reg2) -{ - u8 val1, val2, tmpval1, tmpval2; - - snd_soc_write(codec, reg1, 0x00); - tmpval1 = snd_soc_read(codec, reg2); - tmpval2 = snd_soc_read(codec, reg2); - snd_soc_write(codec, reg1, 0x00); - snd_soc_write(codec, reg2, 0xFF); - snd_soc_write(codec, reg1, 0x01); - snd_soc_write(codec, reg2, 0xFF); - - snd_soc_write(codec, reg1, 0x00); - val1 = snd_soc_read(codec, reg2); - val2 = snd_soc_read(codec, reg2); - - if (val1 == 0x0F && val2 == 0xFF) { - dev_dbg(codec->dev, "%s: ANC0 co-eff index re-aligned\n", - __func__); - snd_soc_read(codec, reg2); - snd_soc_write(codec, reg1, 0x00); - snd_soc_write(codec, reg2, tmpval2); - snd_soc_write(codec, reg1, 0x01); - snd_soc_write(codec, reg2, tmpval1); - } else if (val1 == 0xFF && val2 == 0x0F) { - dev_dbg(codec->dev, "%s: ANC1 co-eff index already aligned\n", - __func__); - snd_soc_write(codec, reg1, 0x00); - snd_soc_write(codec, reg2, tmpval1); - snd_soc_write(codec, reg1, 0x01); - snd_soc_write(codec, reg2, tmpval2); - } else { - dev_err(codec->dev, "%s: ANC0 co-eff index not aligned\n", - __func__); - } -} - -static int tasha_codec_enable_anc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - const char *filename; - const struct firmware *fw; - int i; - int ret = 0; - int num_anc_slots; - struct wcd9xxx_anc_header *anc_head; - struct firmware_cal *hwdep_cal = NULL; - u32 anc_writes_size = 0; - u32 anc_cal_size = 0; - int anc_size_remaining; - u32 *anc_ptr; - u16 reg; - u8 mask, val; - size_t cal_size; - const void *data; - - if (!tasha->anc_func) - return 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - hwdep_cal = wcdcal_get_fw_cal(tasha->fw_data, WCD9XXX_ANC_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration\n", - __func__); - } else { - filename = "wcd9335/wcd9335_anc.bin"; - ret = request_firmware(&fw, filename, codec->dev); - if (ret != 0) { - dev_err(codec->dev, - "Failed to acquire ANC data: %d\n", ret); - return -ENODEV; - } - if (!fw) { - dev_err(codec->dev, "failed to get anc fw"); - return -ENODEV; - } - data = fw->data; - cal_size = fw->size; - dev_dbg(codec->dev, - "%s: using request_firmware calibration\n", __func__); - } - if (cal_size < sizeof(struct wcd9xxx_anc_header)) { - dev_err(codec->dev, "Not enough data\n"); - ret = -ENOMEM; - goto err; - } - /* First number is the number of register writes */ - anc_head = (struct wcd9xxx_anc_header *)(data); - anc_ptr = (u32 *)(data + - sizeof(struct wcd9xxx_anc_header)); - anc_size_remaining = cal_size - - sizeof(struct wcd9xxx_anc_header); - num_anc_slots = anc_head->num_anc_slots; - - if (tasha->anc_slot >= num_anc_slots) { - dev_err(codec->dev, "Invalid ANC slot selected\n"); - ret = -EINVAL; - goto err; - } - for (i = 0; i < num_anc_slots; i++) { - if (anc_size_remaining < TASHA_PACKED_REG_SIZE) { - dev_err(codec->dev, - "Invalid register format\n"); - ret = -EINVAL; - goto err; - } - anc_writes_size = (u32)(*anc_ptr); - anc_size_remaining -= sizeof(u32); - anc_ptr += 1; - - if (anc_writes_size * TASHA_PACKED_REG_SIZE - > anc_size_remaining) { - dev_err(codec->dev, - "Invalid register format\n"); - ret = -EINVAL; - goto err; - } - - if (tasha->anc_slot == i) - break; - - anc_size_remaining -= (anc_writes_size * - TASHA_PACKED_REG_SIZE); - anc_ptr += anc_writes_size; - } - if (i == num_anc_slots) { - dev_err(codec->dev, "Selected ANC slot not present\n"); - ret = -EINVAL; - goto err; - } - - i = 0; - anc_cal_size = anc_writes_size; - - if (!strcmp(w->name, "RX INT0 DAC") || - !strcmp(w->name, "ANC SPK1 PA")) - tasha_realign_anc_coeff(codec, - WCD9335_CDC_ANC0_IIR_COEFF_1_CTL, - WCD9335_CDC_ANC0_IIR_COEFF_2_CTL); - - if (!strcmp(w->name, "RX INT1 DAC") || - !strcmp(w->name, "RX INT3 DAC")) { - tasha_realign_anc_coeff(codec, - WCD9335_CDC_ANC0_IIR_COEFF_1_CTL, - WCD9335_CDC_ANC0_IIR_COEFF_2_CTL); - anc_writes_size = anc_cal_size / 2; - snd_soc_update_bits(codec, - WCD9335_CDC_ANC0_CLK_RESET_CTL, 0x39, 0x39); - } else if (!strcmp(w->name, "RX INT2 DAC") || - !strcmp(w->name, "RX INT4 DAC")) { - tasha_realign_anc_coeff(codec, - WCD9335_CDC_ANC1_IIR_COEFF_1_CTL, - WCD9335_CDC_ANC1_IIR_COEFF_2_CTL); - i = anc_cal_size / 2; - snd_soc_update_bits(codec, - WCD9335_CDC_ANC1_CLK_RESET_CTL, 0x39, 0x39); - } - - for (; i < anc_writes_size; i++) { - TASHA_CODEC_UNPACK_ENTRY(anc_ptr[i], reg, mask, val); - snd_soc_write(codec, reg, (val & mask)); - } - if (!strcmp(w->name, "RX INT1 DAC") || - !strcmp(w->name, "RX INT3 DAC")) { - snd_soc_update_bits(codec, - WCD9335_CDC_ANC0_CLK_RESET_CTL, 0x08, 0x08); - } else if (!strcmp(w->name, "RX INT2 DAC") || - !strcmp(w->name, "RX INT4 DAC")) { - snd_soc_update_bits(codec, - WCD9335_CDC_ANC1_CLK_RESET_CTL, 0x08, 0x08); - } - - if (!hwdep_cal) - release_firmware(fw); - break; - case SND_SOC_DAPM_POST_PMU: - /* Remove ANC Rx from reset */ - snd_soc_update_bits(codec, WCD9335_CDC_ANC0_CLK_RESET_CTL, - 0x08, 0x00); - snd_soc_update_bits(codec, WCD9335_CDC_ANC1_CLK_RESET_CTL, - 0x08, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - if (!strcmp(w->name, "ANC HPHL PA") || - !strcmp(w->name, "ANC EAR PA") || - !strcmp(w->name, "ANC SPK1 PA") || - !strcmp(w->name, "ANC LINEOUT1 PA")) { - snd_soc_update_bits(codec, - WCD9335_CDC_ANC0_MODE_1_CTL, 0x30, 0x00); - msleep(50); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC0_MODE_1_CTL, 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC0_CLK_RESET_CTL, 0x38, 0x38); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC0_CLK_RESET_CTL, 0x07, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC0_CLK_RESET_CTL, 0x38, 0x00); - } else if (!strcmp(w->name, "ANC HPHR PA") || - !strcmp(w->name, "ANC LINEOUT2 PA")) { - snd_soc_update_bits(codec, - WCD9335_CDC_ANC1_MODE_1_CTL, 0x30, 0x00); - msleep(50); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC1_MODE_1_CTL, 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC1_CLK_RESET_CTL, 0x38, 0x38); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC1_CLK_RESET_CTL, 0x07, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_ANC1_CLK_RESET_CTL, 0x38, 0x00); - } - break; - } - - return 0; -err: - if (!hwdep_cal) - release_firmware(fw); - return ret; -} - -static void tasha_codec_clear_anc_tx_hold(struct tasha_priv *tasha) -{ - if (test_and_clear_bit(ANC_MIC_AMIC1, &tasha->status_mask)) - tasha_codec_set_tx_hold(tasha->codec, WCD9335_ANA_AMIC1, false); - if (test_and_clear_bit(ANC_MIC_AMIC2, &tasha->status_mask)) - tasha_codec_set_tx_hold(tasha->codec, WCD9335_ANA_AMIC2, false); - if (test_and_clear_bit(ANC_MIC_AMIC3, &tasha->status_mask)) - tasha_codec_set_tx_hold(tasha->codec, WCD9335_ANA_AMIC3, false); - if (test_and_clear_bit(ANC_MIC_AMIC4, &tasha->status_mask)) - tasha_codec_set_tx_hold(tasha->codec, WCD9335_ANA_AMIC4, false); - if (test_and_clear_bit(ANC_MIC_AMIC5, &tasha->status_mask)) - tasha_codec_set_tx_hold(tasha->codec, WCD9335_ANA_AMIC5, false); - if (test_and_clear_bit(ANC_MIC_AMIC6, &tasha->status_mask)) - tasha_codec_set_tx_hold(tasha->codec, WCD9335_ANA_AMIC6, false); -} - -static void tasha_codec_hph_post_pa_config(struct tasha_priv *tasha, - int mode, int event) -{ - u8 scale_val = 0; - - if (!TASHA_IS_2_0(tasha->wcd9xxx)) - return; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - switch (mode) { - case CLS_H_HIFI: - scale_val = 0x3; - break; - case CLS_H_LOHIFI: - scale_val = 0x1; - break; - } - if (tasha->anc_func) { - /* Clear Tx FE HOLD if both PAs are enabled */ - if ((snd_soc_read(tasha->codec, WCD9335_ANA_HPH) & - 0xC0) == 0xC0) { - tasha_codec_clear_anc_tx_hold(tasha); - } - } - break; - case SND_SOC_DAPM_PRE_PMD: - scale_val = 0x6; - break; - } - - if (scale_val) - snd_soc_update_bits(tasha->codec, WCD9335_HPH_PA_CTL1, 0x0E, - scale_val << 1); - if (SND_SOC_DAPM_EVENT_ON(event)) { - if (tasha->comp_enabled[COMPANDER_1] || - tasha->comp_enabled[COMPANDER_2]) { - snd_soc_update_bits(tasha->codec, WCD9335_HPH_L_EN, - 0x20, 0x00); - snd_soc_update_bits(tasha->codec, WCD9335_HPH_R_EN, - 0x20, 0x00); - snd_soc_update_bits(tasha->codec, WCD9335_HPH_AUTO_CHOP, - 0x20, 0x20); - } - snd_soc_update_bits(tasha->codec, WCD9335_HPH_L_EN, 0x1F, - tasha->hph_l_gain); - snd_soc_update_bits(tasha->codec, WCD9335_HPH_R_EN, 0x1F, - tasha->hph_r_gain); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(tasha->codec, WCD9335_HPH_AUTO_CHOP, 0x20, - 0x00); - } -} - -static void tasha_codec_override(struct snd_soc_codec *codec, - int mode, - int event) -{ - if (mode == CLS_AB) { - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (!(snd_soc_read(codec, - WCD9335_CDC_RX2_RX_PATH_CTL) & 0x10) && - (!(snd_soc_read(codec, - WCD9335_CDC_RX1_RX_PATH_CTL) & 0x10))) - snd_soc_update_bits(codec, - WCD9XXX_A_ANA_RX_SUPPLIES, 0x02, 0x02); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD9XXX_A_ANA_RX_SUPPLIES, 0x02, 0x00); - break; - } - } -} - -static int tasha_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int hph_mode = tasha->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if ((!(strcmp(w->name, "ANC HPHR PA"))) && - (test_bit(HPH_PA_DELAY, &tasha->status_mask))) { - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0xC0, 0xC0); - } - set_bit(HPH_PA_DELAY, &tasha->status_mask); - if (!(strcmp(w->name, "HPHR PA"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x40, 0x40); - break; - case SND_SOC_DAPM_POST_PMU: - if (!(strcmp(w->name, "ANC HPHR PA"))) { - if ((snd_soc_read(codec, WCD9335_ANA_HPH) & 0xC0) - != 0xC0) - /* - * If PA_EN is not set (potentially in ANC case) - * then do nothing for POST_PMU and let left - * channel handle everything. - */ - break; - } - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement - */ - if (test_bit(HPH_PA_DELAY, &tasha->status_mask)) { - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &tasha->status_mask); - } - tasha_codec_hph_post_pa_config(tasha, hph_mode, event); - snd_soc_update_bits(codec, WCD9335_CDC_RX2_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD9335_CDC_RX2_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD9335_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x00); - - if (!(strcmp(w->name, "ANC HPHR PA"))) { - /* Do everything needed for left channel */ - snd_soc_update_bits(codec, WCD9335_CDC_RX1_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, - WCD9335_CDC_RX1_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD9335_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x00); - /* Remove ANC Rx from reset */ - ret = tasha_codec_enable_anc(w, kcontrol, event); - } - tasha_codec_override(codec, hph_mode, event); - break; - - case SND_SOC_DAPM_PRE_PMD: - blocking_notifier_call_chain(&tasha->notifier, - WCD_EVENT_PRE_HPHR_PA_OFF, - &tasha->mbhc); - tasha_codec_hph_post_pa_config(tasha, hph_mode, event); - if (!(strcmp(w->name, "ANC HPHR PA")) || - !(strcmp(w->name, "HPHR PA"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x40, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* 5ms sleep is required after PA is disabled as per - * HW requirement - */ - usleep_range(5000, 5500); - tasha_codec_override(codec, hph_mode, event); - blocking_notifier_call_chain(&tasha->notifier, - WCD_EVENT_POST_HPHR_PA_OFF, - &tasha->mbhc); - - if (!(strcmp(w->name, "ANC HPHR PA"))) { - ret = tasha_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, - WCD9335_CDC_RX2_RX_PATH_CFG0, 0x10, 0x00); - } - break; - }; - - return ret; -} - -static int tasha_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int hph_mode = tasha->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if ((!(strcmp(w->name, "ANC HPHL PA"))) && - (test_bit(HPH_PA_DELAY, &tasha->status_mask))) { - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0xC0, 0xC0); - } - if (!(strcmp(w->name, "HPHL PA"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x80, 0x80); - set_bit(HPH_PA_DELAY, &tasha->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - if (!(strcmp(w->name, "ANC HPHL PA"))) { - if ((snd_soc_read(codec, WCD9335_ANA_HPH) & 0xC0) - != 0xC0) - /* - * If PA_EN is not set (potentially in ANC case) - * then do nothing for POST_PMU and let right - * channel handle everything. - */ - break; - } - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement - */ - if (test_bit(HPH_PA_DELAY, &tasha->status_mask)) { - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &tasha->status_mask); - } - - tasha_codec_hph_post_pa_config(tasha, hph_mode, event); - snd_soc_update_bits(codec, WCD9335_CDC_RX1_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD9335_CDC_RX1_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD9335_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x00); - - if (!(strcmp(w->name, "ANC HPHL PA"))) { - /* Do everything needed for right channel */ - snd_soc_update_bits(codec, WCD9335_CDC_RX2_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, - WCD9335_CDC_RX2_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD9335_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x00); - - /* Remove ANC Rx from reset */ - ret = tasha_codec_enable_anc(w, kcontrol, event); - } - tasha_codec_override(codec, hph_mode, event); - break; - case SND_SOC_DAPM_PRE_PMD: - blocking_notifier_call_chain(&tasha->notifier, - WCD_EVENT_PRE_HPHL_PA_OFF, - &tasha->mbhc); - tasha_codec_hph_post_pa_config(tasha, hph_mode, event); - if (!(strcmp(w->name, "ANC HPHL PA")) || - !(strcmp(w->name, "HPHL PA"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x80, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* 5ms sleep is required after PA is disabled as per - * HW requirement - */ - usleep_range(5000, 5500); - tasha_codec_override(codec, hph_mode, event); - blocking_notifier_call_chain(&tasha->notifier, - WCD_EVENT_POST_HPHL_PA_OFF, - &tasha->mbhc); - - if (!(strcmp(w->name, "ANC HPHL PA"))) { - ret = tasha_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, - WCD9335_CDC_RX1_RX_PATH_CFG0, 0x10, 0x00); - } - break; - }; - - return ret; -} - -static int tasha_codec_enable_lineout_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 lineout_vol_reg = 0, lineout_mix_vol_reg = 0; - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (w->reg == WCD9335_ANA_LO_1_2) { - if (w->shift == 7) { - lineout_vol_reg = WCD9335_CDC_RX3_RX_PATH_CTL; - lineout_mix_vol_reg = WCD9335_CDC_RX3_RX_PATH_MIX_CTL; - } else if (w->shift == 6) { - lineout_vol_reg = WCD9335_CDC_RX4_RX_PATH_CTL; - lineout_mix_vol_reg = WCD9335_CDC_RX4_RX_PATH_MIX_CTL; - } - } else if (w->reg == WCD9335_ANA_LO_3_4) { - if (w->shift == 7) { - lineout_vol_reg = WCD9335_CDC_RX5_RX_PATH_CTL; - lineout_mix_vol_reg = WCD9335_CDC_RX5_RX_PATH_MIX_CTL; - } else if (w->shift == 6) { - lineout_vol_reg = WCD9335_CDC_RX6_RX_PATH_CTL; - lineout_mix_vol_reg = WCD9335_CDC_RX6_RX_PATH_MIX_CTL; - } - } else { - dev_err(codec->dev, "%s: Error enabling lineout PA\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* 5ms sleep is required after PA is enabled as per - * HW requirement - */ - usleep_range(5000, 5500); - snd_soc_update_bits(codec, lineout_vol_reg, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, lineout_mix_vol_reg)) & 0x10) - snd_soc_update_bits(codec, - lineout_mix_vol_reg, - 0x10, 0x00); - if (!(strcmp(w->name, "ANC LINEOUT1 PA")) || - !(strcmp(w->name, "ANC LINEOUT2 PA"))) - ret = tasha_codec_enable_anc(w, kcontrol, event); - tasha_codec_override(codec, CLS_AB, event); - break; - case SND_SOC_DAPM_POST_PMD: - /* 5ms sleep is required after PA is disabled as per - * HW requirement - */ - usleep_range(5000, 5500); - tasha_codec_override(codec, CLS_AB, event); - if (!(strcmp(w->name, "ANC LINEOUT1 PA")) || - !(strcmp(w->name, "ANC LINEOUT2 PA"))) { - ret = tasha_codec_enable_anc(w, kcontrol, event); - if (!(strcmp(w->name, "ANC LINEOUT1 PA"))) - snd_soc_update_bits(codec, - WCD9335_CDC_RX3_RX_PATH_CFG0, 0x10, 0x10); - else - snd_soc_update_bits(codec, - WCD9335_CDC_RX4_RX_PATH_CFG0, 0x10, 0x10); - } - break; - }; - - return ret; -} - -static void tasha_spk_anc_update_callback(struct work_struct *work) -{ - struct spk_anc_work *spk_anc_dwork; - struct tasha_priv *tasha; - struct delayed_work *delayed_work; - struct snd_soc_codec *codec; - - delayed_work = to_delayed_work(work); - spk_anc_dwork = container_of(delayed_work, struct spk_anc_work, dwork); - tasha = spk_anc_dwork->tasha; - codec = tasha->codec; - - snd_soc_update_bits(codec, WCD9335_CDC_RX7_RX_PATH_CFG0, 0x10, 0x10); -} - -static int tasha_codec_enable_spk_anc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d %d\n", __func__, w->name, event, - tasha->anc_func); - - if (!tasha->anc_func) - return 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = tasha_codec_enable_anc(w, kcontrol, event); - schedule_delayed_work(&tasha->spk_anc_dwork.dwork, - msecs_to_jiffies(spk_anc_en_delay)); - break; - case SND_SOC_DAPM_POST_PMD: - cancel_delayed_work_sync(&tasha->spk_anc_dwork.dwork); - snd_soc_update_bits(codec, WCD9335_CDC_RX7_RX_PATH_CFG0, - 0x10, 0x00); - ret = tasha_codec_enable_anc(w, kcontrol, event); - break; - } - return ret; -} - -static int tasha_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* 5ms sleep is required after PA is enabled as per - * HW requirement - */ - usleep_range(5000, 5500); - snd_soc_update_bits(codec, WCD9335_CDC_RX0_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD9335_CDC_RX0_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD9335_CDC_RX0_RX_PATH_MIX_CTL, - 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* 5ms sleep is required after PA is disabled as per - * HW requirement - */ - usleep_range(5000, 5500); - - if (!(strcmp(w->name, "ANC EAR PA"))) { - ret = tasha_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, - WCD9335_CDC_RX0_RX_PATH_CFG0, 0x10, 0x00); - } - break; - }; - - return ret; -} - -static void tasha_codec_hph_mode_gain_opt(struct snd_soc_codec *codec, - u8 gain) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u8 hph_l_en, hph_r_en; - u8 l_val, r_val; - u8 hph_pa_status; - bool is_hphl_pa, is_hphr_pa; - - hph_pa_status = snd_soc_read(codec, WCD9335_ANA_HPH); - is_hphl_pa = hph_pa_status >> 7; - is_hphr_pa = (hph_pa_status & 0x40) >> 6; - - hph_l_en = snd_soc_read(codec, WCD9335_HPH_L_EN); - hph_r_en = snd_soc_read(codec, WCD9335_HPH_R_EN); - - l_val = (hph_l_en & 0xC0) | 0x20 | gain; - r_val = (hph_r_en & 0xC0) | 0x20 | gain; - - /* - * Set HPH_L & HPH_R gain source selection to REGISTER - * for better click and pop only if corresponding PAs are - * not enabled. Also cache the values of the HPHL/R - * PA gains to be applied after PAs are enabled - */ - if ((l_val != hph_l_en) && !is_hphl_pa) { - snd_soc_write(codec, WCD9335_HPH_L_EN, l_val); - tasha->hph_l_gain = hph_l_en & 0x1F; - } - - if ((r_val != hph_r_en) && !is_hphr_pa) { - snd_soc_write(codec, WCD9335_HPH_R_EN, r_val); - tasha->hph_r_gain = hph_r_en & 0x1F; - } -} - -static void tasha_codec_hph_lohifi_config(struct snd_soc_codec *codec, - int event) -{ - if (SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, WCD9335_RX_BIAS_HPH_PA, 0x0F, 0x06); - snd_soc_update_bits(codec, WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2, - 0xF0, 0x40); - snd_soc_update_bits(codec, WCD9335_HPH_CNP_WG_CTL, 0x07, 0x03); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x08, 0x08); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL1, 0x0E, 0x0C); - tasha_codec_hph_mode_gain_opt(codec, 0x11); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x08, 0x00); - snd_soc_update_bits(codec, WCD9335_HPH_CNP_WG_CTL, 0x07, 0x02); - snd_soc_write(codec, WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A); - snd_soc_update_bits(codec, WCD9335_RX_BIAS_HPH_PA, 0x0F, 0x0A); - } -} - -static void tasha_codec_hph_lp_config(struct snd_soc_codec *codec, - int event) -{ - if (SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL1, 0x0E, 0x0C); - tasha_codec_hph_mode_gain_opt(codec, 0x10); - snd_soc_update_bits(codec, WCD9335_HPH_CNP_WG_CTL, 0x07, 0x03); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x08, 0x08); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x04, 0x04); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x20, 0x20); - snd_soc_update_bits(codec, WCD9335_HPH_RDAC_LDO_CTL, 0x07, - 0x01); - snd_soc_update_bits(codec, WCD9335_HPH_RDAC_LDO_CTL, 0x70, - 0x10); - snd_soc_update_bits(codec, WCD9335_RX_BIAS_HPH_RDAC_LDO, - 0x0F, 0x01); - snd_soc_update_bits(codec, WCD9335_RX_BIAS_HPH_RDAC_LDO, - 0xF0, 0x10); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_write(codec, WCD9335_RX_BIAS_HPH_RDAC_LDO, 0x88); - snd_soc_write(codec, WCD9335_HPH_RDAC_LDO_CTL, 0x33); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x20, 0x00); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x04, 0x00); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x08, 0x00); - snd_soc_update_bits(codec, WCD9335_HPH_CNP_WG_CTL, 0x07, 0x02); - snd_soc_update_bits(codec, WCD9335_HPH_R_EN, 0xC0, 0x80); - snd_soc_update_bits(codec, WCD9335_HPH_L_EN, 0xC0, 0x80); - } -} - -static void tasha_codec_hph_hifi_config(struct snd_soc_codec *codec, - int event) -{ - if (SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, WCD9335_HPH_CNP_WG_CTL, 0x07, 0x03); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x08, 0x08); - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL1, 0x0E, 0x0C); - tasha_codec_hph_mode_gain_opt(codec, 0x11); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, WCD9335_HPH_PA_CTL2, 0x08, 0x00); - snd_soc_update_bits(codec, WCD9335_HPH_CNP_WG_CTL, 0x07, 0x02); - } -} - -static void tasha_codec_hph_mode_config(struct snd_soc_codec *codec, - int event, int mode) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (!TASHA_IS_2_0(tasha->wcd9xxx)) - return; - - switch (mode) { - case CLS_H_LP: - tasha_codec_hph_lp_config(codec, event); - break; - case CLS_H_LOHIFI: - tasha_codec_hph_lohifi_config(codec, event); - break; - case CLS_H_HIFI: - tasha_codec_hph_hifi_config(codec, event); - break; - } -} - -static int tasha_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int hph_mode = tasha->hph_mode; - u8 dem_inp; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d hph_mode: %d\n", __func__, - w->name, event, hph_mode); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (tasha->anc_func) { - ret = tasha_codec_enable_anc(w, kcontrol, event); - /* 40 msec delay is needed to avoid click and pop */ - msleep(40); - } - - /* Read DEM INP Select */ - dem_inp = snd_soc_read(codec, WCD9335_CDC_RX2_RX_PATH_SEC0) & - 0x03; - if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) || - (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) { - dev_err(codec->dev, "%s: DEM Input not set correctly, hph_mode: %d\n", - __func__, hph_mode); - return -EINVAL; - } - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHR, - ((hph_mode == CLS_H_LOHIFI) ? - CLS_H_HIFI : hph_mode)); - - if (!(strcmp(w->name, "RX INT2 DAC"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x10, 0x10); - - tasha_codec_hph_mode_config(codec, event, hph_mode); - - if (tasha->anc_func) - snd_soc_update_bits(codec, - WCD9335_CDC_RX2_RX_PATH_CFG0, 0x10, 0x10); - - break; - case SND_SOC_DAPM_POST_PMU: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - if ((hph_mode == CLS_H_LP) && - (TASHA_IS_1_1(wcd9xxx))) { - snd_soc_update_bits(codec, WCD9335_HPH_L_DAC_CTL, - 0x03, 0x03); - } - break; - case SND_SOC_DAPM_PRE_PMD: - if ((hph_mode == CLS_H_LP) && - (TASHA_IS_1_1(wcd9xxx))) { - snd_soc_update_bits(codec, WCD9335_HPH_L_DAC_CTL, - 0x03, 0x00); - } - if (!(strcmp(w->name, "RX INT2 DAC"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - - if (!(wcd_clsh_get_clsh_state(&tasha->clsh_d) & - WCD_CLSH_STATE_HPHL)) - tasha_codec_hph_mode_config(codec, event, hph_mode); - - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHR, - ((hph_mode == CLS_H_LOHIFI) ? - CLS_H_HIFI : hph_mode)); - break; - }; - - return ret; -} - -static int tasha_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int hph_mode = tasha->hph_mode; - u8 dem_inp; - int ret = 0; - uint32_t impedl = 0, impedr = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d hph_mode: %d\n", __func__, - w->name, event, hph_mode); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (tasha->anc_func) { - ret = tasha_codec_enable_anc(w, kcontrol, event); - /* 40 msec delay is needed to avoid click and pop */ - msleep(40); - } - - /* Read DEM INP Select */ - dem_inp = snd_soc_read(codec, WCD9335_CDC_RX1_RX_PATH_SEC0) & - 0x03; - if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) || - (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) { - dev_err(codec->dev, "%s: DEM Input not set correctly, hph_mode: %d\n", - __func__, hph_mode); - return -EINVAL; - } - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHL, - ((hph_mode == CLS_H_LOHIFI) ? - CLS_H_HIFI : hph_mode)); - - if (!(strcmp(w->name, "RX INT1 DAC"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x20, 0x20); - - tasha_codec_hph_mode_config(codec, event, hph_mode); - - if (tasha->anc_func) - snd_soc_update_bits(codec, - WCD9335_CDC_RX1_RX_PATH_CFG0, 0x10, 0x10); - - ret = wcd_mbhc_get_impedance(&tasha->mbhc, - &impedl, &impedr); - if (!ret) { - wcd_clsh_imped_config(codec, impedl, false); - set_bit(CLASSH_CONFIG, &tasha->status_mask); - } else { - dev_dbg(codec->dev, "%s: Failed to get mbhc impedance %d\n", - __func__, ret); - ret = 0; - } - - - break; - case SND_SOC_DAPM_POST_PMU: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - if ((hph_mode == CLS_H_LP) && - (TASHA_IS_1_1(wcd9xxx))) { - snd_soc_update_bits(codec, WCD9335_HPH_L_DAC_CTL, - 0x03, 0x03); - } - break; - case SND_SOC_DAPM_PRE_PMD: - if (!(strcmp(w->name, "RX INT1 DAC"))) - snd_soc_update_bits(codec, WCD9335_ANA_HPH, 0x20, 0x00); - if ((hph_mode == CLS_H_LP) && - (TASHA_IS_1_1(wcd9xxx))) { - snd_soc_update_bits(codec, WCD9335_HPH_L_DAC_CTL, - 0x03, 0x00); - } - break; - case SND_SOC_DAPM_POST_PMD: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - - if (!(wcd_clsh_get_clsh_state(&tasha->clsh_d) & - WCD_CLSH_STATE_HPHR)) - tasha_codec_hph_mode_config(codec, event, hph_mode); - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHL, - ((hph_mode == CLS_H_LOHIFI) ? - CLS_H_HIFI : hph_mode)); - - if (test_bit(CLASSH_CONFIG, &tasha->status_mask)) { - wcd_clsh_imped_config(codec, impedl, true); - clear_bit(CLASSH_CONFIG, &tasha->status_mask); - } else - dev_dbg(codec->dev, "%s: Failed to get mbhc impedance %d\n", - __func__, ret); - - - break; - }; - - return ret; -} - -static int tasha_codec_lineout_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (tasha->anc_func && - (!strcmp(w->name, "RX INT3 DAC") || - !strcmp(w->name, "RX INT4 DAC"))) - ret = tasha_codec_enable_anc(w, kcontrol, event); - - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_LO, - CLS_AB); - - if (tasha->anc_func) { - if (!strcmp(w->name, "RX INT3 DAC")) - snd_soc_update_bits(codec, - WCD9335_CDC_RX3_RX_PATH_CFG0, 0x10, 0x10); - else if (!strcmp(w->name, "RX INT4 DAC")) - snd_soc_update_bits(codec, - WCD9335_CDC_RX4_RX_PATH_CFG0, 0x10, 0x10); - } - break; - case SND_SOC_DAPM_POST_PMD: - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_LO, - CLS_AB); - break; - } - - return 0; -} - -static const struct snd_soc_dapm_widget tasha_dapm_i2s_widgets[] = { - SND_SOC_DAPM_SUPPLY("RX_I2S_CTL", WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL, - 0, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("TX_I2S_CTL", WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL, - 0, 0, NULL, 0), -}; - -static int tasha_codec_ear_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (tasha->anc_func) - ret = tasha_codec_enable_anc(w, kcontrol, event); - - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_EAR, - CLS_H_NORMAL); - if (tasha->anc_func) - snd_soc_update_bits(codec, - WCD9335_CDC_RX0_RX_PATH_CFG0, 0x10, 0x10); - - break; - case SND_SOC_DAPM_POST_PMU: - break; - case SND_SOC_DAPM_PRE_PMD: - break; - case SND_SOC_DAPM_POST_PMD: - wcd_clsh_fsm(codec, &tasha->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_EAR, - CLS_H_NORMAL); - break; - }; - - return ret; -} - -static int tasha_codec_spk_boost_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 boost_path_ctl, boost_path_cfg1; - u16 reg, reg_mix; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (!strcmp(w->name, "RX INT7 CHAIN")) { - boost_path_ctl = WCD9335_CDC_BOOST0_BOOST_PATH_CTL; - boost_path_cfg1 = WCD9335_CDC_RX7_RX_PATH_CFG1; - reg = WCD9335_CDC_RX7_RX_PATH_CTL; - reg_mix = WCD9335_CDC_RX7_RX_PATH_MIX_CTL; - } else if (!strcmp(w->name, "RX INT8 CHAIN")) { - boost_path_ctl = WCD9335_CDC_BOOST1_BOOST_PATH_CTL; - boost_path_cfg1 = WCD9335_CDC_RX8_RX_PATH_CFG1; - reg = WCD9335_CDC_RX8_RX_PATH_CTL; - reg_mix = WCD9335_CDC_RX8_RX_PATH_MIX_CTL; - } else { - dev_err(codec->dev, "%s: unknown widget: %s\n", - __func__, w->name); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x10); - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x01); - snd_soc_update_bits(codec, reg, 0x10, 0x00); - if ((snd_soc_read(codec, reg_mix)) & 0x10) - snd_soc_update_bits(codec, reg_mix, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x00); - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x00); - break; - }; - - return 0; -} - -static u16 tasha_interp_get_primary_reg(u16 reg, u16 *ind) -{ - u16 prim_int_reg = 0; - - switch (reg) { - case WCD9335_CDC_RX0_RX_PATH_CTL: - case WCD9335_CDC_RX0_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX0_RX_PATH_CTL; - *ind = 0; - break; - case WCD9335_CDC_RX1_RX_PATH_CTL: - case WCD9335_CDC_RX1_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX1_RX_PATH_CTL; - *ind = 1; - break; - case WCD9335_CDC_RX2_RX_PATH_CTL: - case WCD9335_CDC_RX2_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX2_RX_PATH_CTL; - *ind = 2; - break; - case WCD9335_CDC_RX3_RX_PATH_CTL: - case WCD9335_CDC_RX3_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX3_RX_PATH_CTL; - *ind = 3; - break; - case WCD9335_CDC_RX4_RX_PATH_CTL: - case WCD9335_CDC_RX4_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX4_RX_PATH_CTL; - *ind = 4; - break; - case WCD9335_CDC_RX5_RX_PATH_CTL: - case WCD9335_CDC_RX5_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX5_RX_PATH_CTL; - *ind = 5; - break; - case WCD9335_CDC_RX6_RX_PATH_CTL: - case WCD9335_CDC_RX6_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX6_RX_PATH_CTL; - *ind = 6; - break; - case WCD9335_CDC_RX7_RX_PATH_CTL: - case WCD9335_CDC_RX7_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX7_RX_PATH_CTL; - *ind = 7; - break; - case WCD9335_CDC_RX8_RX_PATH_CTL: - case WCD9335_CDC_RX8_RX_PATH_MIX_CTL: - prim_int_reg = WCD9335_CDC_RX8_RX_PATH_CTL; - *ind = 8; - break; - }; - - return prim_int_reg; -} - -static void tasha_codec_hd2_control(struct snd_soc_codec *codec, - u16 prim_int_reg, int event) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u16 hd2_scale_reg; - u16 hd2_enable_reg = 0; - - if (!TASHA_IS_2_0(tasha->wcd9xxx)) - return; - - if (prim_int_reg == WCD9335_CDC_RX1_RX_PATH_CTL) { - hd2_scale_reg = WCD9335_CDC_RX1_RX_PATH_SEC3; - hd2_enable_reg = WCD9335_CDC_RX1_RX_PATH_CFG0; - } - if (prim_int_reg == WCD9335_CDC_RX2_RX_PATH_CTL) { - hd2_scale_reg = WCD9335_CDC_RX2_RX_PATH_SEC3; - hd2_enable_reg = WCD9335_CDC_RX2_RX_PATH_CFG0; - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x10); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x01); - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04); - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x03, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00); - } -} - -static int tasha_codec_enable_prim_interpolator( - struct snd_soc_codec *codec, - u16 reg, int event) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u16 prim_int_reg; - u16 ind = 0; - - prim_int_reg = tasha_interp_get_primary_reg(reg, &ind); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tasha->prim_int_users[ind]++; - if (tasha->prim_int_users[ind] == 1) { - snd_soc_update_bits(codec, prim_int_reg, - 0x10, 0x10); - tasha_codec_hd2_control(codec, prim_int_reg, event); - snd_soc_update_bits(codec, prim_int_reg, - 1 << 0x5, 1 << 0x5); - } - if ((reg != prim_int_reg) && - ((snd_soc_read(codec, prim_int_reg)) & 0x10)) - snd_soc_update_bits(codec, reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - tasha->prim_int_users[ind]--; - if (tasha->prim_int_users[ind] == 0) { - snd_soc_update_bits(codec, prim_int_reg, - 1 << 0x5, 0 << 0x5); - snd_soc_update_bits(codec, prim_int_reg, - 0x40, 0x40); - snd_soc_update_bits(codec, prim_int_reg, - 0x40, 0x00); - tasha_codec_hd2_control(codec, prim_int_reg, event); - } - break; - }; - - dev_dbg(codec->dev, "%s: primary interpolator: INT%d, users: %d\n", - __func__, ind, tasha->prim_int_users[ind]); - return 0; -} - -static int tasha_codec_enable_spline_src(struct snd_soc_codec *codec, - int src_num, - int event) -{ - u16 src_paired_reg = 0; - struct tasha_priv *tasha; - u16 rx_path_cfg_reg = WCD9335_CDC_RX1_RX_PATH_CFG0; - u16 rx_path_ctl_reg = WCD9335_CDC_RX1_RX_PATH_CTL; - int *src_users, count, spl_src = SPLINE_SRC0; - u16 src_clk_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; - - tasha = snd_soc_codec_get_drvdata(codec); - - switch (src_num) { - case SRC_IN_HPHL: - rx_path_cfg_reg = WCD9335_CDC_RX1_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX1_RX_PATH_CTL; - spl_src = SPLINE_SRC0; - break; - case SRC_IN_LO1: - rx_path_cfg_reg = WCD9335_CDC_RX3_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX3_RX_PATH_CTL; - spl_src = SPLINE_SRC0; - break; - case SRC_IN_HPHR: - rx_path_cfg_reg = WCD9335_CDC_RX2_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX2_RX_PATH_CTL; - spl_src = SPLINE_SRC1; - break; - case SRC_IN_LO2: - rx_path_cfg_reg = WCD9335_CDC_RX4_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC1_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC0_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX4_RX_PATH_CTL; - spl_src = SPLINE_SRC1; - break; - case SRC_IN_SPKRL: - rx_path_cfg_reg = WCD9335_CDC_RX7_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX7_RX_PATH_CTL; - spl_src = SPLINE_SRC2; - break; - case SRC_IN_LO3: - rx_path_cfg_reg = WCD9335_CDC_RX5_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX5_RX_PATH_CTL; - spl_src = SPLINE_SRC2; - break; - case SRC_IN_SPKRR: - rx_path_cfg_reg = WCD9335_CDC_RX8_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX8_RX_PATH_CTL; - spl_src = SPLINE_SRC3; - break; - case SRC_IN_LO4: - rx_path_cfg_reg = WCD9335_CDC_RX6_RX_PATH_CFG0; - src_clk_reg = WCD9335_SPLINE_SRC3_CLK_RST_CTL_0; - src_paired_reg = WCD9335_SPLINE_SRC2_CLK_RST_CTL_0; - rx_path_ctl_reg = WCD9335_CDC_RX6_RX_PATH_CTL; - spl_src = SPLINE_SRC3; - break; - }; - - src_users = &tasha->spl_src_users[spl_src]; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - count = *src_users; - count++; - if (count == 1) { - if ((snd_soc_read(codec, src_clk_reg) & 0x02) || - (snd_soc_read(codec, src_paired_reg) & 0x02)) { - snd_soc_update_bits(codec, src_clk_reg, 0x02, - 0x00); - snd_soc_update_bits(codec, src_paired_reg, - 0x02, 0x00); - } - snd_soc_update_bits(codec, src_clk_reg, 0x01, 0x01); - snd_soc_update_bits(codec, rx_path_cfg_reg, 0x80, - 0x80); - } - *src_users = count; - break; - case SND_SOC_DAPM_POST_PMD: - count = *src_users; - count--; - if (count == 0) { - snd_soc_update_bits(codec, rx_path_cfg_reg, 0x80, - 0x00); - snd_soc_update_bits(codec, src_clk_reg, 0x03, 0x02); - /* default sample rate */ - snd_soc_update_bits(codec, rx_path_ctl_reg, 0x0f, - 0x04); - } - *src_users = count; - break; - }; - - dev_dbg(codec->dev, "%s: Spline SRC%d, users: %d\n", - __func__, spl_src, *src_users); - return 0; -} - -static int tasha_codec_enable_spline_resampler(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - u8 src_in; - - src_in = snd_soc_read(codec, WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0); - if (!(src_in & 0xFF)) { - dev_err(codec->dev, "%s: Spline SRC%u input not selected\n", - __func__, w->shift); - return -EINVAL; - } - - switch (w->shift) { - case SPLINE_SRC0: - ret = tasha_codec_enable_spline_src(codec, - ((src_in & 0x03) == 1) ? SRC_IN_HPHL : SRC_IN_LO1, - event); - break; - case SPLINE_SRC1: - ret = tasha_codec_enable_spline_src(codec, - ((src_in & 0x0C) == 4) ? SRC_IN_HPHR : SRC_IN_LO2, - event); - break; - case SPLINE_SRC2: - ret = tasha_codec_enable_spline_src(codec, - ((src_in & 0x30) == 0x10) ? SRC_IN_LO3 : SRC_IN_SPKRL, - event); - break; - case SPLINE_SRC3: - ret = tasha_codec_enable_spline_src(codec, - ((src_in & 0xC0) == 0x40) ? SRC_IN_LO4 : SRC_IN_SPKRR, - event); - break; - default: - dev_err(codec->dev, "%s: Invalid spline src:%u\n", __func__, - w->shift); - ret = -EINVAL; - }; - - return ret; -} - -static int tasha_codec_enable_swr(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha; - int i, ch_cnt; - - tasha = snd_soc_codec_get_drvdata(codec); - - if (!tasha->nr) - return 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if ((strnstr(w->name, "INT7_", sizeof("RX INT7_"))) && - !tasha->rx_7_count) - tasha->rx_7_count++; - if ((strnstr(w->name, "INT8_", sizeof("RX INT8_"))) && - !tasha->rx_8_count) - tasha->rx_8_count++; - ch_cnt = tasha->rx_7_count + tasha->rx_8_count; - - for (i = 0; i < tasha->nr; i++) { - swrm_wcd_notify(tasha->swr_ctrl_data[i].swr_pdev, - SWR_DEVICE_UP, NULL); - swrm_wcd_notify(tasha->swr_ctrl_data[i].swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - } - break; - case SND_SOC_DAPM_POST_PMD: - if ((strnstr(w->name, "INT7_", sizeof("RX INT7_"))) && - tasha->rx_7_count) - tasha->rx_7_count--; - if ((strnstr(w->name, "INT8_", sizeof("RX INT8_"))) && - tasha->rx_8_count) - tasha->rx_8_count--; - ch_cnt = tasha->rx_7_count + tasha->rx_8_count; - - for (i = 0; i < tasha->nr; i++) - swrm_wcd_notify(tasha->swr_ctrl_data[i].swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - - break; - } - dev_dbg(tasha->dev, "%s: current swr ch cnt: %d\n", - __func__, tasha->rx_7_count + tasha->rx_8_count); - - return 0; -} - -static int tasha_codec_config_ear_spkr_gain(struct snd_soc_codec *codec, - int event, int gain_reg) -{ - int comp_gain_offset, val; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - switch (tasha->spkr_mode) { - /* Compander gain in SPKR_MODE1 case is 12 dB */ - case SPKR_MODE_1: - comp_gain_offset = -12; - break; - /* Default case compander gain is 15 dB */ - default: - comp_gain_offset = -15; - break; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* Apply ear spkr gain only if compander is enabled */ - if (tasha->comp_enabled[COMPANDER_7] && - (gain_reg == WCD9335_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9335_CDC_RX7_RX_VOL_MIX_CTL) && - (tasha->ear_spkr_gain != 0)) { - /* For example, val is -8(-12+5-1) for 4dB of gain */ - val = comp_gain_offset + tasha->ear_spkr_gain - 1; - snd_soc_write(codec, gain_reg, val); - - dev_dbg(codec->dev, "%s: RX7 Volume %d dB\n", - __func__, val); - } - break; - case SND_SOC_DAPM_POST_PMD: - /* - * Reset RX7 volume to 0 dB if compander is enabled and - * ear_spkr_gain is non-zero. - */ - if (tasha->comp_enabled[COMPANDER_7] && - (gain_reg == WCD9335_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9335_CDC_RX7_RX_VOL_MIX_CTL) && - (tasha->ear_spkr_gain != 0)) { - snd_soc_write(codec, gain_reg, 0x0); - - dev_dbg(codec->dev, "%s: Reset RX7 Volume to 0 dB\n", - __func__); - } - break; - } - - return 0; -} - -static int tasha_codec_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u16 gain_reg; - int offset_val = 0; - int val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - switch (w->reg) { - case WCD9335_CDC_RX0_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX0_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX1_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX1_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX2_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX2_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX3_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX3_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX4_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX4_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX5_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX5_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX6_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX6_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX7_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX7_RX_VOL_MIX_CTL; - break; - case WCD9335_CDC_RX8_RX_PATH_MIX_CTL: - gain_reg = WCD9335_CDC_RX8_RX_VOL_MIX_CTL; - break; - default: - dev_err(codec->dev, "%s: No gain register avail for %s\n", - __func__, w->name); - return 0; - }; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if ((tasha->spkr_gain_offset == RX_GAIN_OFFSET_M1P5_DB) && - (tasha->comp_enabled[COMPANDER_7] || - tasha->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9335_CDC_RX7_RX_VOL_MIX_CTL || - gain_reg == WCD9335_CDC_RX8_RX_VOL_MIX_CTL)) { - snd_soc_update_bits(codec, WCD9335_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9335_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD9335_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9335_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - tasha_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - if ((tasha->spkr_gain_offset == RX_GAIN_OFFSET_M1P5_DB) && - (tasha->comp_enabled[COMPANDER_7] || - tasha->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9335_CDC_RX7_RX_VOL_MIX_CTL || - gain_reg == WCD9335_CDC_RX8_RX_VOL_MIX_CTL)) { - snd_soc_update_bits(codec, WCD9335_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD9335_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - tasha_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - }; - - return 0; -} - -static int __tasha_cdc_native_clk_enable(struct tasha_priv *tasha, - bool enable) -{ - int ret = 0; - struct snd_soc_codec *codec = tasha->codec; - - if (!tasha->wcd_native_clk) { - dev_err(tasha->dev, "%s: wcd native clock is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(tasha->dev, "%s: native_clk_enable = %u\n", __func__, enable); - - if (enable) { - ret = clk_prepare_enable(tasha->wcd_native_clk); - if (ret) { - dev_err(tasha->dev, "%s: native clk enable failed\n", - __func__); - goto err; - } - if (++tasha->native_clk_users == 1) { - snd_soc_update_bits(codec, WCD9335_CLOCK_TEST_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, WCD9335_CLOCK_TEST_CTL, - 0x80, 0x80); - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_CLK_GATE, - 0x04, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x02); - } - } else { - if (tasha->native_clk_users && - (--tasha->native_clk_users == 0)) { - snd_soc_update_bits(codec, - WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_CLK_GATE, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD9335_CLOCK_TEST_CTL, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD9335_CLOCK_TEST_CTL, - 0x10, 0x00); - } - clk_disable_unprepare(tasha->wcd_native_clk); - } - - dev_dbg(codec->dev, "%s: native_clk_users: %d\n", __func__, - tasha->native_clk_users); -err: - return ret; -} - -static int tasha_codec_get_native_fifo_sync_mask(struct snd_soc_codec *codec, - int interp_n) -{ - int mask = 0; - u16 reg; - u8 val1, val2, inp0 = 0; - u8 inp1 = 0, inp2 = 0; - - reg = WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0 + (2 * interp_n) - 2; - - val1 = snd_soc_read(codec, reg); - val2 = snd_soc_read(codec, reg + 1); - - inp0 = val1 & 0x0F; - inp1 = (val1 >> 4) & 0x0F; - inp2 = (val2 >> 4) & 0x0F; - - if (IS_VALID_NATIVE_FIFO_PORT(inp0)) - mask |= (1 << (inp0 - 5)); - if (IS_VALID_NATIVE_FIFO_PORT(inp1)) - mask |= (1 << (inp1 - 5)); - if (IS_VALID_NATIVE_FIFO_PORT(inp2)) - mask |= (1 << (inp2 - 5)); - - dev_dbg(codec->dev, "%s: native fifo mask: 0x%x\n", __func__, mask); - if (!mask) - dev_err(codec->dev, "native fifo err,int:%d,inp0:%d,inp1:%d,inp2:%d\n", - interp_n, inp0, inp1, inp2); - return mask; -} - -static int tasha_enable_native_supply(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - int mask; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u16 interp_reg; - - dev_dbg(codec->dev, "%s: event: %d, shift:%d\n", __func__, event, - w->shift); - - if (w->shift < INTERP_HPHL || w->shift > INTERP_LO2) - return -EINVAL; - - interp_reg = WCD9335_CDC_RX1_RX_PATH_CTL + 20 * (w->shift - 1); - - mask = tasha_codec_get_native_fifo_sync_mask(codec, w->shift); - if (!mask) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Adjust interpolator rate to 44P1_NATIVE */ - snd_soc_update_bits(codec, interp_reg, 0x0F, 0x09); - __tasha_cdc_native_clk_enable(tasha, true); - snd_soc_update_bits(codec, WCD9335_DATA_HUB_NATIVE_FIFO_SYNC, - mask, mask); - break; - case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, WCD9335_DATA_HUB_NATIVE_FIFO_SYNC, - mask, 0x0); - __tasha_cdc_native_clk_enable(tasha, false); - /* Adjust interpolator rate to default */ - snd_soc_update_bits(codec, interp_reg, 0x0F, 0x04); - break; - } - - return 0; -} - -static int tasha_codec_enable_interpolator(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u16 gain_reg; - u16 reg; - int val; - int offset_val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (!(strcmp(w->name, "RX INT0 INTERP"))) { - reg = WCD9335_CDC_RX0_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX0_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT1 INTERP"))) { - reg = WCD9335_CDC_RX1_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX1_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT2 INTERP"))) { - reg = WCD9335_CDC_RX2_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX2_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT3 INTERP"))) { - reg = WCD9335_CDC_RX3_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX3_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT4 INTERP"))) { - reg = WCD9335_CDC_RX4_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX4_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT5 INTERP"))) { - reg = WCD9335_CDC_RX5_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX5_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT6 INTERP"))) { - reg = WCD9335_CDC_RX6_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX6_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT7 INTERP"))) { - reg = WCD9335_CDC_RX7_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX7_RX_VOL_CTL; - } else if (!(strcmp(w->name, "RX INT8 INTERP"))) { - reg = WCD9335_CDC_RX8_RX_PATH_CTL; - gain_reg = WCD9335_CDC_RX8_RX_VOL_CTL; - } else { - dev_err(codec->dev, "%s: Interpolator reg not found\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tasha_codec_vote_max_bw(codec, true); - /* Reset if needed */ - tasha_codec_enable_prim_interpolator(codec, reg, event); - break; - case SND_SOC_DAPM_POST_PMU: - tasha_config_compander(codec, w->shift, event); - /* apply gain after int clk is enabled */ - if ((tasha->spkr_gain_offset == RX_GAIN_OFFSET_M1P5_DB) && - (tasha->comp_enabled[COMPANDER_7] || - tasha->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9335_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9335_CDC_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, WCD9335_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9335_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD9335_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9335_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - tasha_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - tasha_config_compander(codec, w->shift, event); - tasha_codec_enable_prim_interpolator(codec, reg, event); - if ((tasha->spkr_gain_offset == RX_GAIN_OFFSET_M1P5_DB) && - (tasha->comp_enabled[COMPANDER_7] || - tasha->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9335_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9335_CDC_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, WCD9335_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD9335_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9335_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - tasha_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - }; - - return 0; -} - -static int tasha_codec_set_iir_gain(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: /* fall through */ - case SND_SOC_DAPM_PRE_PMD: - if (strnstr(w->name, "IIR0", sizeof("IIR0"))) { - snd_soc_write(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)); - } else { - snd_soc_write(codec, - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL)); - } - break; - } - return 0; -} - -static int tasha_codec_enable_on_demand_supply( - struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct on_demand_supply *supply; - - if (w->shift >= ON_DEMAND_SUPPLIES_MAX) { - dev_err(codec->dev, "%s: error index > MAX Demand supplies", - __func__); - ret = -EINVAL; - goto out; - } - - dev_dbg(codec->dev, "%s: supply: %s event: %d\n", - __func__, on_demand_supply_name[w->shift], event); - - supply = &tasha->on_demand_list[w->shift]; - WARN_ONCE(!supply->supply, "%s isn't defined\n", - on_demand_supply_name[w->shift]); - if (!supply->supply) { - dev_err(codec->dev, "%s: err supply not present ond for %d", - __func__, w->shift); - goto out; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = regulator_enable(supply->supply); - if (ret) - dev_err(codec->dev, "%s: Failed to enable %s\n", - __func__, - on_demand_supply_name[w->shift]); - break; - case SND_SOC_DAPM_POST_PMD: - ret = regulator_disable(supply->supply); - if (ret) - dev_err(codec->dev, "%s: Failed to disable %s\n", - __func__, - on_demand_supply_name[w->shift]); - break; - default: - break; - }; - -out: - return ret; -} - -static int tasha_codec_find_amic_input(struct snd_soc_codec *codec, - int adc_mux_n) -{ - u16 mask, shift, adc_mux_in_reg; - u16 amic_mux_sel_reg; - bool is_amic; - - if (adc_mux_n < 0 || adc_mux_n > WCD9335_MAX_VALID_ADC_MUX || - adc_mux_n == WCD9335_INVALID_ADC_MUX) - return 0; - - /* Check whether adc mux input is AMIC or DMIC */ - if (adc_mux_n < 4) { - adc_mux_in_reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - 2 * adc_mux_n; - amic_mux_sel_reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - 2 * adc_mux_n; - mask = 0x03; - shift = 0; - } else { - adc_mux_in_reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_n - 4; - amic_mux_sel_reg = adc_mux_in_reg; - mask = 0xC0; - shift = 6; - } - is_amic = (((snd_soc_read(codec, adc_mux_in_reg) & mask) >> shift) - == 1); - if (!is_amic) - return 0; - - return snd_soc_read(codec, amic_mux_sel_reg) & 0x07; -} - -static void tasha_codec_set_tx_hold(struct snd_soc_codec *codec, - u16 amic_reg, bool set) -{ - u8 mask = 0x20; - u8 val; - - if (amic_reg == WCD9335_ANA_AMIC1 || - amic_reg == WCD9335_ANA_AMIC3 || - amic_reg == WCD9335_ANA_AMIC5) - mask = 0x40; - - val = set ? mask : 0x00; - - switch (amic_reg) { - case WCD9335_ANA_AMIC1: - case WCD9335_ANA_AMIC2: - snd_soc_update_bits(codec, WCD9335_ANA_AMIC2, mask, val); - break; - case WCD9335_ANA_AMIC3: - case WCD9335_ANA_AMIC4: - snd_soc_update_bits(codec, WCD9335_ANA_AMIC4, mask, val); - break; - case WCD9335_ANA_AMIC5: - case WCD9335_ANA_AMIC6: - snd_soc_update_bits(codec, WCD9335_ANA_AMIC6, mask, val); - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic_reg); - break; - } -} - -static int tasha_codec_tx_adc_cfg(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - int adc_mux_n = w->shift; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int amic_n; - - dev_dbg(codec->dev, "%s: event: %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - amic_n = tasha_codec_find_amic_input(codec, adc_mux_n); - if (amic_n) { - /* - * Prevent ANC Rx pop by leaving Tx FE in HOLD - * state until PA is up. Track AMIC being used - * so we can release the HOLD later. - */ - set_bit(ANC_MIC_AMIC1 + amic_n - 1, - &tasha->status_mask); - } - break; - default: - break; - } - - return 0; -} - -static u16 tasha_codec_get_amic_pwlvl_reg(struct snd_soc_codec *codec, int amic) -{ - u16 pwr_level_reg = 0; - - switch (amic) { - case 1: - case 2: - pwr_level_reg = WCD9335_ANA_AMIC1; - break; - - case 3: - case 4: - pwr_level_reg = WCD9335_ANA_AMIC3; - break; - - case 5: - case 6: - pwr_level_reg = WCD9335_ANA_AMIC5; - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic); - break; - } - - return pwr_level_reg; -} - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -static void tasha_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work; - struct hpf_work *hpf_work; - struct tasha_priv *tasha; - struct snd_soc_codec *codec; - u16 dec_cfg_reg, amic_reg; - u8 hpf_cut_off_freq; - int amic_n; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - tasha = hpf_work->tasha; - codec = tasha->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = WCD9335_CDC_TX0_TX_PATH_CFG0 + 16 * hpf_work->decimator; - - dev_dbg(codec->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - amic_n = tasha_codec_find_amic_input(codec, hpf_work->decimator); - if (amic_n) { - amic_reg = WCD9335_ANA_AMIC1 + amic_n - 1; - tasha_codec_set_tx_hold(codec, amic_reg, false); - } - tasha_codec_vote_max_bw(codec, true); - snd_soc_update_bits(codec, dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - tasha_codec_vote_max_bw(codec, false); -} - -static void tasha_tx_mute_update_callback(struct work_struct *work) -{ - struct tx_mute_work *tx_mute_dwork; - struct tasha_priv *tasha; - struct delayed_work *delayed_work; - struct snd_soc_codec *codec; - u16 tx_vol_ctl_reg, hpf_gate_reg; - - delayed_work = to_delayed_work(work); - tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork); - tasha = tx_mute_dwork->tasha; - codec = tasha->codec; - - tx_vol_ctl_reg = WCD9335_CDC_TX0_TX_PATH_CTL + - 16 * tx_mute_dwork->decimator; - hpf_gate_reg = WCD9335_CDC_TX0_TX_PATH_SEC2 + - 16 * tx_mute_dwork->decimator; - snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x01); - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); -} - -static int tasha_codec_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - unsigned int decimator; - char *dec_adc_mux_name = NULL; - char *widget_name = NULL; - char *wname; - int ret = 0, amic_n; - u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg; - u16 tx_gain_ctl_reg; - char *dec; - u8 hpf_cut_off_freq; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %d\n", __func__, event); - - widget_name = kstrndup(w->name, 15, GFP_KERNEL); - if (!widget_name) - return -ENOMEM; - - wname = widget_name; - dec_adc_mux_name = strsep(&widget_name, " "); - if (!dec_adc_mux_name) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, w->name); - ret = -EINVAL; - goto out; - } - dec_adc_mux_name = widget_name; - - dec = strpbrk(dec_adc_mux_name, "012345678"); - if (!dec) { - dev_err(codec->dev, "%s: decimator index not found\n", - __func__); - ret = -EINVAL; - goto out; - } - - ret = kstrtouint(dec, 10, &decimator); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, wname); - ret = -EINVAL; - goto out; - } - - dev_dbg(codec->dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = WCD9335_CDC_TX0_TX_PATH_CTL + 16 * decimator; - hpf_gate_reg = WCD9335_CDC_TX0_TX_PATH_SEC2 + 16 * decimator; - dec_cfg_reg = WCD9335_CDC_TX0_TX_PATH_CFG0 + 16 * decimator; - tx_gain_ctl_reg = WCD9335_CDC_TX0_TX_VOL_CTL + 16 * decimator; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - amic_n = tasha_codec_find_amic_input(codec, decimator); - if (amic_n) - pwr_level_reg = tasha_codec_get_amic_pwlvl_reg(codec, - amic_n); - - if (pwr_level_reg) { - switch ((snd_soc_read(codec, pwr_level_reg) & - WCD9335_AMIC_PWR_LVL_MASK) >> - WCD9335_AMIC_PWR_LVL_SHIFT) { - case WCD9335_AMIC_PWR_LEVEL_LP: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD9335_DEC_PWR_LVL_MASK, - WCD9335_DEC_PWR_LVL_LP); - break; - - case WCD9335_AMIC_PWR_LEVEL_HP: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD9335_DEC_PWR_LVL_MASK, - WCD9335_DEC_PWR_LVL_HP); - break; - case WCD9335_AMIC_PWR_LEVEL_DEFAULT: - default: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD9335_DEC_PWR_LVL_MASK, - WCD9335_DEC_PWR_LVL_DF); - break; - } - } - hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - tasha->tx_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x00); - - if (decimator == 0) { - snd_soc_write(codec, WCD9335_MBHC_ZDET_RAMP_CTL, 0x83); - snd_soc_write(codec, WCD9335_MBHC_ZDET_RAMP_CTL, 0xA3); - snd_soc_write(codec, WCD9335_MBHC_ZDET_RAMP_CTL, 0x83); - snd_soc_write(codec, WCD9335_MBHC_ZDET_RAMP_CTL, 0x03); - } - /* schedule work queue to Remove Mute */ - schedule_delayed_work(&tasha->tx_mute_dwork[decimator].dwork, - msecs_to_jiffies(tx_unmute_delay)); - if (tasha->tx_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) - schedule_delayed_work( - &tasha->tx_hpf_work[decimator].dwork, - msecs_to_jiffies(300)); - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, tx_gain_ctl_reg)); - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - tasha->tx_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &tasha->tx_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - tasha_codec_vote_max_bw(codec, true); - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - tasha_codec_vote_max_bw(codec, false); - } - } - cancel_delayed_work_sync( - &tasha->tx_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - break; - }; -out: - kfree(wname); - return ret; -} - -static u32 tasha_get_dmic_sample_rate(struct snd_soc_codec *codec, - unsigned int dmic, struct wcd9xxx_pdata *pdata) -{ - u8 tx_stream_fs; - u8 adc_mux_index = 0, adc_mux_sel = 0; - bool dec_found = false; - u16 adc_mux_ctl_reg, tx_fs_reg; - u32 dmic_fs; - - while (dec_found == 0 && adc_mux_index < WCD9335_MAX_VALID_ADC_MUX) { - if (adc_mux_index < 4) { - adc_mux_ctl_reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - (adc_mux_index * 2); - adc_mux_sel = ((snd_soc_read(codec, adc_mux_ctl_reg) & - 0x78) >> 3) - 1; - } else if (adc_mux_index < 9) { - adc_mux_ctl_reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - ((adc_mux_index - 4) * 1); - adc_mux_sel = ((snd_soc_read(codec, adc_mux_ctl_reg) & - 0x38) >> 3) - 1; - } else if (adc_mux_index == 9) { - ++adc_mux_index; - continue; - } - if (adc_mux_sel == dmic) - dec_found = true; - else - ++adc_mux_index; - } - - if (dec_found == true && adc_mux_index <= 8) { - tx_fs_reg = WCD9335_CDC_TX0_TX_PATH_CTL + (16 * adc_mux_index); - tx_stream_fs = snd_soc_read(codec, tx_fs_reg) & 0x0F; - dmic_fs = tx_stream_fs <= 4 ? WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ : - WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ; - - /* - * Check for ECPP path selection and DEC1 not connected to - * any other audio path to apply ECPP DMIC sample rate - */ - if ((adc_mux_index == 1) && - ((snd_soc_read(codec, WCD9335_CPE_SS_US_EC_MUX_CFG) - & 0x0F) == 0x0A) && - ((snd_soc_read(codec, WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0) - & 0x0C) == 0x00)) { - dmic_fs = pdata->ecpp_dmic_sample_rate; - } - } else { - dmic_fs = pdata->dmic_sample_rate; - } - - return dmic_fs; -} - -static u8 tasha_get_dmic_clk_val(struct snd_soc_codec *codec, - u32 mclk_rate, u32 dmic_clk_rate) -{ - u32 div_factor; - u8 dmic_ctl_val; - - dev_dbg(codec->dev, - "%s: mclk_rate = %d, dmic_sample_rate = %d\n", - __func__, mclk_rate, dmic_clk_rate); - - /* Default value to return in case of error */ - if (mclk_rate == TASHA_MCLK_CLK_9P6MHZ) - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2; - else - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3; - - if (dmic_clk_rate == 0) { - dev_err(codec->dev, - "%s: dmic_sample_rate cannot be 0\n", - __func__); - goto done; - } - - div_factor = mclk_rate / dmic_clk_rate; - switch (div_factor) { - case 2: - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2; - break; - case 3: - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3; - break; - case 4: - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_4; - break; - case 6: - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_6; - break; - case 8: - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_8; - break; - case 16: - dmic_ctl_val = WCD9335_DMIC_CLK_DIV_16; - break; - default: - dev_err(codec->dev, - "%s: Invalid div_factor %u, clk_rate(%u), dmic_rate(%u)\n", - __func__, div_factor, mclk_rate, dmic_clk_rate); - break; - } - -done: - return dmic_ctl_val; -} - -static int tasha_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event:%d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tasha_codec_set_tx_hold(codec, w->reg, true); - break; - default: - break; - } - - return 0; -} - -static int tasha_codec_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - u8 dmic_clk_en = 0x01; - u16 dmic_clk_reg; - s32 *dmic_clk_cnt; - u8 dmic_rate_val, dmic_rate_shift = 1; - unsigned int dmic; - u32 dmic_sample_rate; - int ret; - char *wname; - - wname = strpbrk(w->name, "012345"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(tasha->dmic_0_1_clk_cnt); - dmic_clk_reg = WCD9335_CPE_SS_DMIC0_CTL; - break; - case 2: - case 3: - dmic_clk_cnt = &(tasha->dmic_2_3_clk_cnt); - dmic_clk_reg = WCD9335_CPE_SS_DMIC1_CTL; - break; - case 4: - case 5: - dmic_clk_cnt = &(tasha->dmic_4_5_clk_cnt); - dmic_clk_reg = WCD9335_CPE_SS_DMIC2_CTL; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - }; - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - dmic_sample_rate = tasha_get_dmic_sample_rate(codec, dmic, - pdata); - dmic_rate_val = - tasha_get_dmic_clk_val(codec, - pdata->mclk_rate, - dmic_sample_rate); - - (*dmic_clk_cnt)++; - if (*dmic_clk_cnt == 1) { - snd_soc_update_bits(codec, dmic_clk_reg, - 0x07 << dmic_rate_shift, - dmic_rate_val << dmic_rate_shift); - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, dmic_clk_en); - } - - break; - case SND_SOC_DAPM_POST_PMD: - dmic_rate_val = - tasha_get_dmic_clk_val(codec, - pdata->mclk_rate, - pdata->mad_dmic_sample_rate); - (*dmic_clk_cnt)--; - if (*dmic_clk_cnt == 0) { - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, 0); - snd_soc_update_bits(codec, dmic_clk_reg, - 0x07 << dmic_rate_shift, - dmic_rate_val << dmic_rate_shift); - } - break; - }; - - return 0; -} - -static int __tasha_codec_enable_micbias(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2"))) - micb_num = MIC_BIAS_2; - else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3"))) - micb_num = MIC_BIAS_3; - else if (strnstr(w->name, "MIC BIAS4", sizeof("MIC BIAS4"))) - micb_num = MIC_BIAS_4; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* - * MIC BIAS can also be requested by MBHC, - * so use ref count to handle micbias pullup - * and enable requests - */ - tasha_micbias_control(codec, micb_num, MICB_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - /* wait for cnp time */ - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - tasha_micbias_control(codec, micb_num, MICB_DISABLE, true); - break; - }; - - return 0; -} - -static int tasha_codec_ldo_h_control(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - tasha->ldo_h_users++; - - if (tasha->ldo_h_users == 1) - snd_soc_update_bits(codec, WCD9335_LDOH_MODE, - 0x80, 0x80); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - tasha->ldo_h_users--; - - if (tasha->ldo_h_users < 0) - tasha->ldo_h_users = 0; - - if (tasha->ldo_h_users == 0) - snd_soc_update_bits(codec, WCD9335_LDOH_MODE, - 0x80, 0x00); - } - - return 0; -} - -static int tasha_codec_force_enable_ldo_h(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd_resmgr_enable_master_bias(tasha->resmgr); - tasha_codec_ldo_h_control(w, event); - break; - case SND_SOC_DAPM_POST_PMD: - tasha_codec_ldo_h_control(w, event); - wcd_resmgr_disable_master_bias(tasha->resmgr); - break; - } - - return 0; -} - -static int tasha_codec_force_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd_resmgr_enable_master_bias(tasha->resmgr); - tasha_cdc_mclk_enable(codec, true, true); - ret = __tasha_codec_enable_micbias(w, SND_SOC_DAPM_PRE_PMU); - /* Wait for 1ms for better cnp */ - usleep_range(1000, 1100); - tasha_cdc_mclk_enable(codec, false, true); - break; - case SND_SOC_DAPM_POST_PMD: - ret = __tasha_codec_enable_micbias(w, SND_SOC_DAPM_POST_PMD); - wcd_resmgr_disable_master_bias(tasha->resmgr); - break; - } - - return ret; -} - -static int tasha_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return __tasha_codec_enable_micbias(w, event); -} - -static int tasha_codec_enable_standalone_ldo_h(struct snd_soc_codec *codec, - bool enable) -{ - int rc; - - if (enable) - rc = snd_soc_dapm_force_enable_pin( - snd_soc_codec_get_dapm(codec), - DAPM_LDO_H_STANDALONE); - else - rc = snd_soc_dapm_disable_pin( - snd_soc_codec_get_dapm(codec), - DAPM_LDO_H_STANDALONE); - - if (!rc) - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - else - dev_err(codec->dev, "%s: ldo_h force %s pin failed\n", - __func__, (enable ? "enable" : "disable")); - - return rc; -} - -/* - * tasha_codec_enable_standalone_micbias - enable micbias standalone - * @codec: pointer to codec instance - * @micb_num: number of micbias to be enabled - * @enable: true to enable micbias or false to disable - * - * This function is used to enable micbias (1, 2, 3 or 4) during - * standalone independent of whether TX use-case is running or not - * - * Return: error code in case of failure or 0 for success - */ -int tasha_codec_enable_standalone_micbias(struct snd_soc_codec *codec, - int micb_num, - bool enable) -{ - const char * const micb_names[] = { - DAPM_MICBIAS1_STANDALONE, DAPM_MICBIAS2_STANDALONE, - DAPM_MICBIAS3_STANDALONE, DAPM_MICBIAS4_STANDALONE - }; - int micb_index = micb_num - 1; - int rc; - - if (!codec) { - pr_err("%s: Codec memory is NULL\n", __func__); - return -EINVAL; - } - - if ((micb_index < 0) || (micb_index > TASHA_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - - if (enable) - rc = snd_soc_dapm_force_enable_pin( - snd_soc_codec_get_dapm(codec), - micb_names[micb_index]); - else - rc = snd_soc_dapm_disable_pin(snd_soc_codec_get_dapm(codec), - micb_names[micb_index]); - - if (!rc) - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - else - dev_err(codec->dev, "%s: micbias%d force %s pin failed\n", - __func__, micb_num, (enable ? "enable" : "disable")); - - return rc; -} -EXPORT_SYMBOL(tasha_codec_enable_standalone_micbias); - -static const char *const tasha_anc_func_text[] = {"OFF", "ON"}; -static const struct soc_enum tasha_anc_func_enum = - SOC_ENUM_SINGLE_EXT(2, tasha_anc_func_text); - -static const char *const tasha_clkmode_text[] = {"EXTERNAL", "INTERNAL"}; -static SOC_ENUM_SINGLE_EXT_DECL(tasha_clkmode_enum, tasha_clkmode_text); - -/* Cutoff frequency for high pass filter */ -static const char * const cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ" -}; - -static const char * const rx_cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ", - "CF_NEG_3DB_0P48HZ" -}; - -static const struct soc_enum cf_dec0_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX0_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX1_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec2_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX2_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec3_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX3_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec4_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX4_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec5_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX5_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec6_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX6_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec7_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX7_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_dec8_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX8_TX_PATH_CFG0, 5, 3, cf_text); - -static const struct soc_enum cf_int0_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int0_2_enum, WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int1_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int1_2_enum, WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int2_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int2_2_enum, WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int3_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX3_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int3_2_enum, WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int4_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX4_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int4_2_enum, WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int5_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX5_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int5_2_enum, WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int6_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX6_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int6_2_enum, WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int7_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX7_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int7_2_enum, WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct soc_enum cf_int8_1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX8_RX_PATH_CFG2, 0, 4, rx_cf_text); - -static SOC_ENUM_SINGLE_DECL(cf_int8_2_enum, WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct snd_soc_dapm_route audio_i2s_map[] = { - {"SLIM RX0 MUX", NULL, "RX_I2S_CTL"}, - {"SLIM RX1 MUX", NULL, "RX_I2S_CTL"}, - {"SLIM RX2 MUX", NULL, "RX_I2S_CTL"}, - {"SLIM RX3 MUX", NULL, "RX_I2S_CTL"}, - - {"SLIM TX6 MUX", NULL, "TX_I2S_CTL"}, - {"SLIM TX7 MUX", NULL, "TX_I2S_CTL"}, - {"SLIM TX8 MUX", NULL, "TX_I2S_CTL"}, - {"SLIM TX11 MUX", NULL, "TX_I2S_CTL"}, -}; - -static const struct snd_soc_dapm_route audio_map[] = { - - /* MAD */ - {"MAD_SEL MUX", "SPE", "MAD_CPE_INPUT"}, - {"MAD_SEL MUX", "MSM", "MADINPUT"}, - {"MADONOFF", "Switch", "MAD_SEL MUX"}, - {"MAD_BROADCAST", "Switch", "MAD_SEL MUX"}, - {"TX13 INP MUX", "CPE_TX_PP", "MADONOFF"}, - - /* CPE HW MAD bypass */ - {"CPE IN Mixer", "MAD_BYPASS", "SLIM TX1 MUX"}, - - {"AIF4_MAD Mixer", "SLIM TX1", "CPE IN Mixer"}, - {"AIF4_MAD Mixer", "SLIM TX12", "MADONOFF"}, - {"AIF4_MAD Mixer", "SLIM TX13", "TX13 INP MUX"}, - {"AIF4 MAD", NULL, "AIF4_MAD Mixer"}, - {"AIF4 MAD", NULL, "AIF4"}, - - {"EC BUF MUX INP", "DEC1", "ADC MUX1"}, - {"AIF5 CPE", NULL, "EC BUF MUX INP"}, - - /* SLIMBUS Connections */ - {"AIF1 CAP", NULL, "AIF1_CAP Mixer"}, - {"AIF2 CAP", NULL, "AIF2_CAP Mixer"}, - {"AIF3 CAP", NULL, "AIF3_CAP Mixer"}, - - /* VI Feedback */ - {"AIF4_VI Mixer", "SPKR_VI_1", "VIINPUT"}, - {"AIF4_VI Mixer", "SPKR_VI_2", "VIINPUT"}, - {"AIF4 VI", NULL, "AIF4_VI Mixer"}, - - /* SLIM_MIXER("AIF1_CAP Mixer"),*/ - {"AIF1_CAP Mixer", "SLIM TX0", "SLIM TX0 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX1", "SLIM TX1 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX2", "SLIM TX2 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX3", "SLIM TX3 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX4", "SLIM TX4 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX5", "SLIM TX5 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX6", "SLIM TX6 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX7", "SLIM TX7 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX8", "SLIM TX8 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX9", "SLIM TX9 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX10", "SLIM TX10 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX11", "SLIM TX11 MUX"}, - {"AIF1_CAP Mixer", "SLIM TX13", "TX13 INP MUX"}, - /* SLIM_MIXER("AIF2_CAP Mixer"),*/ - {"AIF2_CAP Mixer", "SLIM TX0", "SLIM TX0 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX1", "SLIM TX1 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX2", "SLIM TX2 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX3", "SLIM TX3 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX4", "SLIM TX4 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX5", "SLIM TX5 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX6", "SLIM TX6 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX7", "SLIM TX7 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX8", "SLIM TX8 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX9", "SLIM TX9 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX10", "SLIM TX10 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX11", "SLIM TX11 MUX"}, - {"AIF2_CAP Mixer", "SLIM TX13", "TX13 INP MUX"}, - /* SLIM_MIXER("AIF3_CAP Mixer"),*/ - {"AIF3_CAP Mixer", "SLIM TX0", "SLIM TX0 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX1", "SLIM TX1 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX2", "SLIM TX2 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX3", "SLIM TX3 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX4", "SLIM TX4 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX5", "SLIM TX5 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX6", "SLIM TX6 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX7", "SLIM TX7 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX8", "SLIM TX8 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX9", "SLIM TX9 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX10", "SLIM TX10 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX11", "SLIM TX11 MUX"}, - {"AIF3_CAP Mixer", "SLIM TX13", "TX13 INP MUX"}, - - {"SLIM TX0 MUX", "DEC0", "ADC MUX0"}, - {"SLIM TX0 MUX", "RX_MIX_TX0", "RX MIX TX0 MUX"}, - {"SLIM TX0 MUX", "DEC0_192", "ADC US MUX0"}, - - {"SLIM TX1 MUX", "DEC1", "ADC MUX1"}, - {"SLIM TX1 MUX", "RX_MIX_TX1", "RX MIX TX1 MUX"}, - {"SLIM TX1 MUX", "DEC1_192", "ADC US MUX1"}, - - {"SLIM TX2 MUX", "DEC2", "ADC MUX2"}, - {"SLIM TX2 MUX", "RX_MIX_TX2", "RX MIX TX2 MUX"}, - {"SLIM TX2 MUX", "DEC2_192", "ADC US MUX2"}, - - {"SLIM TX3 MUX", "DEC3", "ADC MUX3"}, - {"SLIM TX3 MUX", "RX_MIX_TX3", "RX MIX TX3 MUX"}, - {"SLIM TX3 MUX", "DEC3_192", "ADC US MUX3"}, - - {"SLIM TX4 MUX", "DEC4", "ADC MUX4"}, - {"SLIM TX4 MUX", "RX_MIX_TX4", "RX MIX TX4 MUX"}, - {"SLIM TX4 MUX", "DEC4_192", "ADC US MUX4"}, - - {"SLIM TX5 MUX", "DEC5", "ADC MUX5"}, - {"SLIM TX5 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - {"SLIM TX5 MUX", "DEC5_192", "ADC US MUX5"}, - - {"SLIM TX6 MUX", "DEC6", "ADC MUX6"}, - {"SLIM TX6 MUX", "RX_MIX_TX6", "RX MIX TX6 MUX"}, - {"SLIM TX6 MUX", "DEC6_192", "ADC US MUX6"}, - - {"SLIM TX7 MUX", "DEC7", "ADC MUX7"}, - {"SLIM TX7 MUX", "RX_MIX_TX7", "RX MIX TX7 MUX"}, - {"SLIM TX7 MUX", "DEC7_192", "ADC US MUX7"}, - - {"SLIM TX8 MUX", "DEC8", "ADC MUX8"}, - {"SLIM TX8 MUX", "RX_MIX_TX8", "RX MIX TX8 MUX"}, - {"SLIM TX8 MUX", "DEC8_192", "ADC US MUX8"}, - - {"SLIM TX9 MUX", "DEC7", "ADC MUX7"}, - {"SLIM TX9 MUX", "DEC7_192", "ADC US MUX7"}, - {"SLIM TX10 MUX", "DEC6", "ADC MUX6"}, - {"SLIM TX10 MUX", "DEC6_192", "ADC US MUX6"}, - - {"SLIM TX11 MUX", "DEC_0_5", "SLIM TX11 INP1 MUX"}, - {"SLIM TX11 MUX", "DEC_9_12", "SLIM TX11 INP1 MUX"}, - {"SLIM TX11 INP1 MUX", "DEC0", "ADC MUX0"}, - {"SLIM TX11 INP1 MUX", "DEC1", "ADC MUX1"}, - {"SLIM TX11 INP1 MUX", "DEC2", "ADC MUX2"}, - {"SLIM TX11 INP1 MUX", "DEC3", "ADC MUX3"}, - {"SLIM TX11 INP1 MUX", "DEC4", "ADC MUX4"}, - {"SLIM TX11 INP1 MUX", "DEC5", "ADC MUX5"}, - {"SLIM TX11 INP1 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - - {"TX13 INP MUX", "MAD_BRDCST", "MAD_BROADCAST"}, - {"TX13 INP MUX", "CDC_DEC_5", "SLIM TX13 MUX"}, - {"SLIM TX13 MUX", "DEC5", "ADC MUX5"}, - - {"RX MIX TX0 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX0 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX0 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX0 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX1 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX1 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX1 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX1 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX2 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX2 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX2 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX2 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX3 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX3 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX3 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX3 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX4 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX4 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX4 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX4 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX5 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX5 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX5 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX5 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX6 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX6 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX6 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX6 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX7 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX7 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX7 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX7 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"RX MIX TX8 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX5", "RX INT5 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX6", "RX INT6 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX_VBAT5", "RX INT5 VBAT"}, - {"RX MIX TX8 MUX", "RX_MIX_VBAT6", "RX INT6 VBAT"}, - {"RX MIX TX8 MUX", "RX_MIX_VBAT7", "RX INT7 VBAT"}, - {"RX MIX TX8 MUX", "RX_MIX_VBAT8", "RX INT8 VBAT"}, - - {"ADC US MUX0", "US_Switch", "ADC MUX0"}, - {"ADC US MUX1", "US_Switch", "ADC MUX1"}, - {"ADC US MUX2", "US_Switch", "ADC MUX2"}, - {"ADC US MUX3", "US_Switch", "ADC MUX3"}, - {"ADC US MUX4", "US_Switch", "ADC MUX4"}, - {"ADC US MUX5", "US_Switch", "ADC MUX5"}, - {"ADC US MUX6", "US_Switch", "ADC MUX6"}, - {"ADC US MUX7", "US_Switch", "ADC MUX7"}, - {"ADC US MUX8", "US_Switch", "ADC MUX8"}, - {"ADC MUX0", "DMIC", "DMIC MUX0"}, - {"ADC MUX0", "AMIC", "AMIC MUX0"}, - {"ADC MUX1", "DMIC", "DMIC MUX1"}, - {"ADC MUX1", "AMIC", "AMIC MUX1"}, - {"ADC MUX2", "DMIC", "DMIC MUX2"}, - {"ADC MUX2", "AMIC", "AMIC MUX2"}, - {"ADC MUX3", "DMIC", "DMIC MUX3"}, - {"ADC MUX3", "AMIC", "AMIC MUX3"}, - {"ADC MUX4", "DMIC", "DMIC MUX4"}, - {"ADC MUX4", "AMIC", "AMIC MUX4"}, - {"ADC MUX5", "DMIC", "DMIC MUX5"}, - {"ADC MUX5", "AMIC", "AMIC MUX5"}, - {"ADC MUX6", "DMIC", "DMIC MUX6"}, - {"ADC MUX6", "AMIC", "AMIC MUX6"}, - {"ADC MUX7", "DMIC", "DMIC MUX7"}, - {"ADC MUX7", "AMIC", "AMIC MUX7"}, - {"ADC MUX8", "DMIC", "DMIC MUX8"}, - {"ADC MUX8", "AMIC", "AMIC MUX8"}, - {"ADC MUX10", "DMIC", "DMIC MUX10"}, - {"ADC MUX10", "AMIC", "AMIC MUX10"}, - {"ADC MUX11", "DMIC", "DMIC MUX11"}, - {"ADC MUX11", "AMIC", "AMIC MUX11"}, - {"ADC MUX12", "DMIC", "DMIC MUX12"}, - {"ADC MUX12", "AMIC", "AMIC MUX12"}, - {"ADC MUX13", "DMIC", "DMIC MUX13"}, - {"ADC MUX13", "AMIC", "AMIC MUX13"}, - - {"ADC MUX0", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX0", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX0", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX0", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX1", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX1", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX1", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX1", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX2", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX2", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX2", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX2", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX3", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX3", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX3", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX3", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX4", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX4", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX4", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX4", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX5", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX5", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX5", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX5", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX6", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX6", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX6", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX6", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX7", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX7", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX7", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX7", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX8", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX8", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX8", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX8", "ANC_FB_TUNE2", "ADC MUX13"}, - - {"DMIC MUX0", "DMIC0", "DMIC0"}, - {"DMIC MUX0", "DMIC1", "DMIC1"}, - {"DMIC MUX0", "DMIC2", "DMIC2"}, - {"DMIC MUX0", "DMIC3", "DMIC3"}, - {"DMIC MUX0", "DMIC4", "DMIC4"}, - {"DMIC MUX0", "DMIC5", "DMIC5"}, - {"AMIC MUX0", "ADC1", "ADC1"}, - {"AMIC MUX0", "ADC2", "ADC2"}, - {"AMIC MUX0", "ADC3", "ADC3"}, - {"AMIC MUX0", "ADC4", "ADC4"}, - {"AMIC MUX0", "ADC5", "ADC5"}, - {"AMIC MUX0", "ADC6", "ADC6"}, - - {"DMIC MUX1", "DMIC0", "DMIC0"}, - {"DMIC MUX1", "DMIC1", "DMIC1"}, - {"DMIC MUX1", "DMIC2", "DMIC2"}, - {"DMIC MUX1", "DMIC3", "DMIC3"}, - {"DMIC MUX1", "DMIC4", "DMIC4"}, - {"DMIC MUX1", "DMIC5", "DMIC5"}, - {"AMIC MUX1", "ADC1", "ADC1"}, - {"AMIC MUX1", "ADC2", "ADC2"}, - {"AMIC MUX1", "ADC3", "ADC3"}, - {"AMIC MUX1", "ADC4", "ADC4"}, - {"AMIC MUX1", "ADC5", "ADC5"}, - {"AMIC MUX1", "ADC6", "ADC6"}, - - {"DMIC MUX2", "DMIC0", "DMIC0"}, - {"DMIC MUX2", "DMIC1", "DMIC1"}, - {"DMIC MUX2", "DMIC2", "DMIC2"}, - {"DMIC MUX2", "DMIC3", "DMIC3"}, - {"DMIC MUX2", "DMIC4", "DMIC4"}, - {"DMIC MUX2", "DMIC5", "DMIC5"}, - {"AMIC MUX2", "ADC1", "ADC1"}, - {"AMIC MUX2", "ADC2", "ADC2"}, - {"AMIC MUX2", "ADC3", "ADC3"}, - {"AMIC MUX2", "ADC4", "ADC4"}, - {"AMIC MUX2", "ADC5", "ADC5"}, - {"AMIC MUX2", "ADC6", "ADC6"}, - - {"DMIC MUX3", "DMIC0", "DMIC0"}, - {"DMIC MUX3", "DMIC1", "DMIC1"}, - {"DMIC MUX3", "DMIC2", "DMIC2"}, - {"DMIC MUX3", "DMIC3", "DMIC3"}, - {"DMIC MUX3", "DMIC4", "DMIC4"}, - {"DMIC MUX3", "DMIC5", "DMIC5"}, - {"AMIC MUX3", "ADC1", "ADC1"}, - {"AMIC MUX3", "ADC2", "ADC2"}, - {"AMIC MUX3", "ADC3", "ADC3"}, - {"AMIC MUX3", "ADC4", "ADC4"}, - {"AMIC MUX3", "ADC5", "ADC5"}, - {"AMIC MUX3", "ADC6", "ADC6"}, - - {"DMIC MUX4", "DMIC0", "DMIC0"}, - {"DMIC MUX4", "DMIC1", "DMIC1"}, - {"DMIC MUX4", "DMIC2", "DMIC2"}, - {"DMIC MUX4", "DMIC3", "DMIC3"}, - {"DMIC MUX4", "DMIC4", "DMIC4"}, - {"DMIC MUX4", "DMIC5", "DMIC5"}, - {"AMIC MUX4", "ADC1", "ADC1"}, - {"AMIC MUX4", "ADC2", "ADC2"}, - {"AMIC MUX4", "ADC3", "ADC3"}, - {"AMIC MUX4", "ADC4", "ADC4"}, - {"AMIC MUX4", "ADC5", "ADC5"}, - {"AMIC MUX4", "ADC6", "ADC6"}, - - {"DMIC MUX5", "DMIC0", "DMIC0"}, - {"DMIC MUX5", "DMIC1", "DMIC1"}, - {"DMIC MUX5", "DMIC2", "DMIC2"}, - {"DMIC MUX5", "DMIC3", "DMIC3"}, - {"DMIC MUX5", "DMIC4", "DMIC4"}, - {"DMIC MUX5", "DMIC5", "DMIC5"}, - {"AMIC MUX5", "ADC1", "ADC1"}, - {"AMIC MUX5", "ADC2", "ADC2"}, - {"AMIC MUX5", "ADC3", "ADC3"}, - {"AMIC MUX5", "ADC4", "ADC4"}, - {"AMIC MUX5", "ADC5", "ADC5"}, - {"AMIC MUX5", "ADC6", "ADC6"}, - - {"DMIC MUX6", "DMIC0", "DMIC0"}, - {"DMIC MUX6", "DMIC1", "DMIC1"}, - {"DMIC MUX6", "DMIC2", "DMIC2"}, - {"DMIC MUX6", "DMIC3", "DMIC3"}, - {"DMIC MUX6", "DMIC4", "DMIC4"}, - {"DMIC MUX6", "DMIC5", "DMIC5"}, - {"AMIC MUX6", "ADC1", "ADC1"}, - {"AMIC MUX6", "ADC2", "ADC2"}, - {"AMIC MUX6", "ADC3", "ADC3"}, - {"AMIC MUX6", "ADC4", "ADC4"}, - {"AMIC MUX6", "ADC5", "ADC5"}, - {"AMIC MUX6", "ADC6", "ADC6"}, - - {"DMIC MUX7", "DMIC0", "DMIC0"}, - {"DMIC MUX7", "DMIC1", "DMIC1"}, - {"DMIC MUX7", "DMIC2", "DMIC2"}, - {"DMIC MUX7", "DMIC3", "DMIC3"}, - {"DMIC MUX7", "DMIC4", "DMIC4"}, - {"DMIC MUX7", "DMIC5", "DMIC5"}, - {"AMIC MUX7", "ADC1", "ADC1"}, - {"AMIC MUX7", "ADC2", "ADC2"}, - {"AMIC MUX7", "ADC3", "ADC3"}, - {"AMIC MUX7", "ADC4", "ADC4"}, - {"AMIC MUX7", "ADC5", "ADC5"}, - {"AMIC MUX7", "ADC6", "ADC6"}, - - {"DMIC MUX8", "DMIC0", "DMIC0"}, - {"DMIC MUX8", "DMIC1", "DMIC1"}, - {"DMIC MUX8", "DMIC2", "DMIC2"}, - {"DMIC MUX8", "DMIC3", "DMIC3"}, - {"DMIC MUX8", "DMIC4", "DMIC4"}, - {"DMIC MUX8", "DMIC5", "DMIC5"}, - {"AMIC MUX8", "ADC1", "ADC1"}, - {"AMIC MUX8", "ADC2", "ADC2"}, - {"AMIC MUX8", "ADC3", "ADC3"}, - {"AMIC MUX8", "ADC4", "ADC4"}, - {"AMIC MUX8", "ADC5", "ADC5"}, - {"AMIC MUX8", "ADC6", "ADC6"}, - - {"DMIC MUX10", "DMIC0", "DMIC0"}, - {"DMIC MUX10", "DMIC1", "DMIC1"}, - {"DMIC MUX10", "DMIC2", "DMIC2"}, - {"DMIC MUX10", "DMIC3", "DMIC3"}, - {"DMIC MUX10", "DMIC4", "DMIC4"}, - {"DMIC MUX10", "DMIC5", "DMIC5"}, - {"AMIC MUX10", "ADC1", "ADC1"}, - {"AMIC MUX10", "ADC2", "ADC2"}, - {"AMIC MUX10", "ADC3", "ADC3"}, - {"AMIC MUX10", "ADC4", "ADC4"}, - {"AMIC MUX10", "ADC5", "ADC5"}, - {"AMIC MUX10", "ADC6", "ADC6"}, - - {"DMIC MUX11", "DMIC0", "DMIC0"}, - {"DMIC MUX11", "DMIC1", "DMIC1"}, - {"DMIC MUX11", "DMIC2", "DMIC2"}, - {"DMIC MUX11", "DMIC3", "DMIC3"}, - {"DMIC MUX11", "DMIC4", "DMIC4"}, - {"DMIC MUX11", "DMIC5", "DMIC5"}, - {"AMIC MUX11", "ADC1", "ADC1"}, - {"AMIC MUX11", "ADC2", "ADC2"}, - {"AMIC MUX11", "ADC3", "ADC3"}, - {"AMIC MUX11", "ADC4", "ADC4"}, - {"AMIC MUX11", "ADC5", "ADC5"}, - {"AMIC MUX11", "ADC6", "ADC6"}, - - {"DMIC MUX12", "DMIC0", "DMIC0"}, - {"DMIC MUX12", "DMIC1", "DMIC1"}, - {"DMIC MUX12", "DMIC2", "DMIC2"}, - {"DMIC MUX12", "DMIC3", "DMIC3"}, - {"DMIC MUX12", "DMIC4", "DMIC4"}, - {"DMIC MUX12", "DMIC5", "DMIC5"}, - {"AMIC MUX12", "ADC1", "ADC1"}, - {"AMIC MUX12", "ADC2", "ADC2"}, - {"AMIC MUX12", "ADC3", "ADC3"}, - {"AMIC MUX12", "ADC4", "ADC4"}, - {"AMIC MUX12", "ADC5", "ADC5"}, - {"AMIC MUX12", "ADC6", "ADC6"}, - - {"DMIC MUX13", "DMIC0", "DMIC0"}, - {"DMIC MUX13", "DMIC1", "DMIC1"}, - {"DMIC MUX13", "DMIC2", "DMIC2"}, - {"DMIC MUX13", "DMIC3", "DMIC3"}, - {"DMIC MUX13", "DMIC4", "DMIC4"}, - {"DMIC MUX13", "DMIC5", "DMIC5"}, - {"AMIC MUX13", "ADC1", "ADC1"}, - {"AMIC MUX13", "ADC2", "ADC2"}, - {"AMIC MUX13", "ADC3", "ADC3"}, - {"AMIC MUX13", "ADC4", "ADC4"}, - {"AMIC MUX13", "ADC5", "ADC5"}, - {"AMIC MUX13", "ADC6", "ADC6"}, - /* ADC Connections */ - {"ADC1", NULL, "AMIC1"}, - {"ADC2", NULL, "AMIC2"}, - {"ADC3", NULL, "AMIC3"}, - {"ADC4", NULL, "AMIC4"}, - {"ADC5", NULL, "AMIC5"}, - {"ADC6", NULL, "AMIC6"}, - - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"}, - {"RX INT3_1 MIX1", NULL, "RX INT3_1 MIX1 INP0"}, - {"RX INT3_1 MIX1", NULL, "RX INT3_1 MIX1 INP1"}, - {"RX INT3_1 MIX1", NULL, "RX INT3_1 MIX1 INP2"}, - {"RX INT4_1 MIX1", NULL, "RX INT4_1 MIX1 INP0"}, - {"RX INT4_1 MIX1", NULL, "RX INT4_1 MIX1 INP1"}, - {"RX INT4_1 MIX1", NULL, "RX INT4_1 MIX1 INP2"}, - {"RX INT5_1 MIX1", NULL, "RX INT5_1 MIX1 INP0"}, - {"RX INT5_1 MIX1", NULL, "RX INT5_1 MIX1 INP1"}, - {"RX INT5_1 MIX1", NULL, "RX INT5_1 MIX1 INP2"}, - {"RX INT6_1 MIX1", NULL, "RX INT6_1 MIX1 INP0"}, - {"RX INT6_1 MIX1", NULL, "RX INT6_1 MIX1 INP1"}, - {"RX INT6_1 MIX1", NULL, "RX INT6_1 MIX1 INP2"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP0"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP1"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP2"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP0"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP1"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP2"}, - - {"RX INT0 SEC MIX", NULL, "RX INT0_1 MIX1"}, - {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"}, - {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"}, - {"RX INT0 INTERP", NULL, "RX INT0 MIX2"}, - {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 INTERP"}, - {"RX INT0 DAC", NULL, "RX INT0 DEM MUX"}, - {"RX INT0 DAC", NULL, "RX_BIAS"}, - {"EAR PA", NULL, "RX INT0 DAC"}, - {"EAR", NULL, "EAR PA"}, - - {"SPL SRC0 MUX", "SRC_IN_HPHL", "RX INT1_1 MIX1"}, - {"RX INT1 SPLINE MIX", NULL, "RX INT1_1 MIX1"}, - {"RX INT1 SPLINE MIX", "HPHL Switch", "SPL SRC0 MUX"}, - {"RX INT1_1 NATIVE MUX", "ON", "RX INT1_1 MIX1"}, - {"RX INT1 SPLINE MIX", NULL, "RX INT1_1 NATIVE MUX"}, - {"RX INT1_1 NATIVE MUX", NULL, "RX INT1 NATIVE SUPPLY"}, - {"RX INT1 SEC MIX", NULL, "RX INT1 SPLINE MIX"}, - {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"}, - {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"}, - {"RX INT1 INTERP", NULL, "RX INT1 MIX2"}, - {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 INTERP"}, - {"RX INT1 DAC", NULL, "RX INT1 DEM MUX"}, - {"RX INT1 DAC", NULL, "RX_BIAS"}, - {"HPHL PA", NULL, "RX INT1 DAC"}, - {"HPHL", NULL, "HPHL PA"}, - - {"SPL SRC1 MUX", "SRC_IN_HPHR", "RX INT2_1 MIX1"}, - {"RX INT2 SPLINE MIX", NULL, "RX INT2_1 MIX1"}, - {"RX INT2 SPLINE MIX", "HPHR Switch", "SPL SRC1 MUX"}, - {"RX INT2_1 NATIVE MUX", "ON", "RX INT2_1 MIX1"}, - {"RX INT2 SPLINE MIX", NULL, "RX INT2_1 NATIVE MUX"}, - {"RX INT2_1 NATIVE MUX", NULL, "RX INT2 NATIVE SUPPLY"}, - {"RX INT2 SEC MIX", NULL, "RX INT2 SPLINE MIX"}, - {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"}, - {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"}, - {"RX INT2 INTERP", NULL, "RX INT2 MIX2"}, - {"RX INT2 DEM MUX", "CLSH_DSM_OUT", "RX INT2 INTERP"}, - {"RX INT2 DAC", NULL, "RX INT2 DEM MUX"}, - {"RX INT2 DAC", NULL, "RX_BIAS"}, - {"HPHR PA", NULL, "RX INT2 DAC"}, - {"HPHR", NULL, "HPHR PA"}, - - {"SPL SRC0 MUX", "SRC_IN_LO1", "RX INT3_1 MIX1"}, - {"RX INT3 SPLINE MIX", NULL, "RX INT3_1 MIX1"}, - {"RX INT3 SPLINE MIX", "LO1 Switch", "SPL SRC0 MUX"}, - {"RX INT3_1 NATIVE MUX", "ON", "RX INT3_1 MIX1"}, - {"RX INT3 SPLINE MIX", NULL, "RX INT3_1 NATIVE MUX"}, - {"RX INT3_1 NATIVE MUX", NULL, "RX INT3 NATIVE SUPPLY"}, - {"RX INT3 SEC MIX", NULL, "RX INT3 SPLINE MIX"}, - {"RX INT3 MIX2", NULL, "RX INT3 SEC MIX"}, - {"RX INT3 MIX2", NULL, "RX INT3 MIX2 INP"}, - {"RX INT3 INTERP", NULL, "RX INT3 MIX2"}, - {"RX INT3 DAC", NULL, "RX INT3 INTERP"}, - {"RX INT3 DAC", NULL, "RX_BIAS"}, - {"LINEOUT1 PA", NULL, "RX INT3 DAC"}, - {"LINEOUT1", NULL, "LINEOUT1 PA"}, - - {"SPL SRC1 MUX", "SRC_IN_LO2", "RX INT4_1 MIX1"}, - {"RX INT4 SPLINE MIX", NULL, "RX INT4_1 MIX1"}, - {"RX INT4 SPLINE MIX", "LO2 Switch", "SPL SRC1 MUX"}, - {"RX INT4_1 NATIVE MUX", "ON", "RX INT4_1 MIX1"}, - {"RX INT4 SPLINE MIX", NULL, "RX INT4_1 NATIVE MUX"}, - {"RX INT4_1 NATIVE MUX", NULL, "RX INT4 NATIVE SUPPLY"}, - {"RX INT4 SEC MIX", NULL, "RX INT4 SPLINE MIX"}, - {"RX INT4 MIX2", NULL, "RX INT4 SEC MIX"}, - {"RX INT4 MIX2", NULL, "RX INT4 MIX2 INP"}, - {"RX INT4 INTERP", NULL, "RX INT4 MIX2"}, - {"RX INT4 DAC", NULL, "RX INT4 INTERP"}, - {"RX INT4 DAC", NULL, "RX_BIAS"}, - {"LINEOUT2 PA", NULL, "RX INT4 DAC"}, - {"LINEOUT2", NULL, "LINEOUT2 PA"}, - - {"SPL SRC2 MUX", "SRC_IN_LO3", "RX INT5_1 MIX1"}, - {"RX INT5 SPLINE MIX", NULL, "RX INT5_1 MIX1"}, - {"RX INT5 SPLINE MIX", "LO3 Switch", "SPL SRC2 MUX"}, - {"RX INT5 SEC MIX", NULL, "RX INT5 SPLINE MIX"}, - {"RX INT5 MIX2", NULL, "RX INT5 SEC MIX"}, - {"RX INT5 INTERP", NULL, "RX INT5 MIX2"}, - - {"RX INT5 VBAT", "LO3 VBAT Enable", "RX INT5 INTERP"}, - {"RX INT5 DAC", NULL, "RX INT5 VBAT"}, - - {"RX INT5 DAC", NULL, "RX INT5 INTERP"}, - {"RX INT5 DAC", NULL, "RX_BIAS"}, - {"LINEOUT3 PA", NULL, "RX INT5 DAC"}, - {"LINEOUT3", NULL, "LINEOUT3 PA"}, - - {"SPL SRC3 MUX", "SRC_IN_LO4", "RX INT6_1 MIX1"}, - {"RX INT6 SPLINE MIX", NULL, "RX INT6_1 MIX1"}, - {"RX INT6 SPLINE MIX", "LO4 Switch", "SPL SRC3 MUX"}, - {"RX INT6 SEC MIX", NULL, "RX INT6 SPLINE MIX"}, - {"RX INT6 MIX2", NULL, "RX INT6 SEC MIX"}, - {"RX INT6 INTERP", NULL, "RX INT6 MIX2"}, - - {"RX INT6 VBAT", "LO4 VBAT Enable", "RX INT6 INTERP"}, - {"RX INT6 DAC", NULL, "RX INT6 VBAT"}, - - {"RX INT6 DAC", NULL, "RX INT6 INTERP"}, - {"RX INT6 DAC", NULL, "RX_BIAS"}, - {"LINEOUT4 PA", NULL, "RX INT6 DAC"}, - {"LINEOUT4", NULL, "LINEOUT4 PA"}, - - {"SPL SRC2 MUX", "SRC_IN_SPKRL", "RX INT7_1 MIX1"}, - {"RX INT7 SPLINE MIX", NULL, "RX INT7_1 MIX1"}, - {"RX INT7 SPLINE MIX", "SPKRL Switch", "SPL SRC2 MUX"}, - {"RX INT7 SEC MIX", NULL, "RX INT7 SPLINE MIX"}, - {"RX INT7 MIX2", NULL, "RX INT7 SEC MIX"}, - {"RX INT7 MIX2", NULL, "RX INT7 MIX2 INP"}, - - {"RX INT7 INTERP", NULL, "RX INT7 MIX2"}, - - {"RX INT7 VBAT", "SPKRL VBAT Enable", "RX INT7 INTERP"}, - {"RX INT7 CHAIN", NULL, "RX INT7 VBAT"}, - - {"RX INT7 CHAIN", NULL, "RX INT7 INTERP"}, - {"RX INT7 CHAIN", NULL, "RX_BIAS"}, - {"SPK1 OUT", NULL, "RX INT7 CHAIN"}, - - {"ANC SPKR PA Enable", "Switch", "RX INT7 CHAIN"}, - {"ANC SPK1 PA", NULL, "ANC SPKR PA Enable"}, - {"SPK1 OUT", NULL, "ANC SPK1 PA"}, - - {"SPL SRC3 MUX", "SRC_IN_SPKRR", "RX INT8_1 MIX1"}, - {"RX INT8 SPLINE MIX", NULL, "RX INT8_1 MIX1"}, - {"RX INT8 SPLINE MIX", "SPKRR Switch", "SPL SRC3 MUX"}, - {"RX INT8 SEC MIX", NULL, "RX INT8 SPLINE MIX"}, - {"RX INT8 INTERP", NULL, "RX INT8 SEC MIX"}, - - {"RX INT8 VBAT", "SPKRR VBAT Enable", "RX INT8 INTERP"}, - {"RX INT8 CHAIN", NULL, "RX INT8 VBAT"}, - - {"RX INT8 CHAIN", NULL, "RX INT8 INTERP"}, - {"RX INT8 CHAIN", NULL, "RX_BIAS"}, - {"SPK2 OUT", NULL, "RX INT8 CHAIN"}, - - {"ANC0 FB MUX", "ANC_IN_EAR", "RX INT0 MIX2"}, - {"ANC0 FB MUX", "ANC_IN_HPHL", "RX INT1 MIX2"}, - {"ANC0 FB MUX", "ANC_IN_LO1", "RX INT3 MIX2"}, - {"ANC0 FB MUX", "ANC_IN_EAR_SPKR", "RX INT7 MIX2"}, - {"ANC1 FB MUX", "ANC_IN_HPHR", "RX INT2 MIX2"}, - {"ANC1 FB MUX", "ANC_IN_LO2", "RX INT4 MIX2"}, - - {"ANC HPHL Enable", "Switch", "ADC MUX10"}, - {"ANC HPHL Enable", "Switch", "ADC MUX11"}, - {"RX INT1 MIX2", NULL, "ANC HPHL Enable"}, - - {"ANC HPHR Enable", "Switch", "ADC MUX12"}, - {"ANC HPHR Enable", "Switch", "ADC MUX13"}, - {"RX INT2 MIX2", NULL, "ANC HPHR Enable"}, - - {"ANC EAR Enable", "Switch", "ADC MUX10"}, - {"ANC EAR Enable", "Switch", "ADC MUX11"}, - {"RX INT0 MIX2", NULL, "ANC EAR Enable"}, - - {"ANC OUT EAR SPKR Enable", "Switch", "ADC MUX10"}, - {"ANC OUT EAR SPKR Enable", "Switch", "ADC MUX11"}, - {"RX INT7 MIX2", NULL, "ANC OUT EAR SPKR Enable"}, - - {"ANC LINEOUT1 Enable", "Switch", "ADC MUX10"}, - {"ANC LINEOUT1 Enable", "Switch", "ADC MUX11"}, - {"RX INT3 MIX2", NULL, "ANC LINEOUT1 Enable"}, - - {"ANC LINEOUT2 Enable", "Switch", "ADC MUX12"}, - {"ANC LINEOUT2 Enable", "Switch", "ADC MUX13"}, - {"RX INT4 MIX2", NULL, "ANC LINEOUT2 Enable"}, - - {"ANC EAR PA", NULL, "RX INT0 DAC"}, - {"ANC EAR", NULL, "ANC EAR PA"}, - {"ANC HPHL PA", NULL, "RX INT1 DAC"}, - {"ANC HPHL", NULL, "ANC HPHL PA"}, - {"ANC HPHR PA", NULL, "RX INT2 DAC"}, - {"ANC HPHR", NULL, "ANC HPHR PA"}, - {"ANC LINEOUT1 PA", NULL, "RX INT3 DAC"}, - {"ANC LINEOUT1", NULL, "ANC LINEOUT1 PA"}, - {"ANC LINEOUT2 PA", NULL, "RX INT4 DAC"}, - {"ANC LINEOUT2", NULL, "ANC LINEOUT2 PA"}, - - /* SLIM_MUX("AIF1_PB", "AIF1 PB"),*/ - {"SLIM RX0 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX1 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX2 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX3 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX4 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX5 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX6 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX7 MUX", "AIF1_PB", "AIF1 PB"}, - /* SLIM_MUX("AIF2_PB", "AIF2 PB"),*/ - {"SLIM RX0 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX1 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX2 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX3 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX4 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX5 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX6 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX7 MUX", "AIF2_PB", "AIF2 PB"}, - /* SLIM_MUX("AIF3_PB", "AIF3 PB"),*/ - {"SLIM RX0 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX1 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX2 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX3 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX4 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX5 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX6 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX7 MUX", "AIF3_PB", "AIF3 PB"}, - /* SLIM_MUX("AIF4_PB", "AIF4 PB"),*/ - {"SLIM RX0 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX1 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX2 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX3 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX4 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX5 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX6 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX7 MUX", "AIF4_PB", "AIF4 PB"}, - - /* SLIM_MUX("AIF_MIX1_PB", "AIF MIX1 PB"),*/ - {"SLIM RX0 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - {"SLIM RX1 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - {"SLIM RX2 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - {"SLIM RX3 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - {"SLIM RX4 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - {"SLIM RX5 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - {"SLIM RX6 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - {"SLIM RX7 MUX", "AIF_MIX1_PB", "AIF MIX1 PB"}, - - {"SLIM RX0", NULL, "SLIM RX0 MUX"}, - {"SLIM RX1", NULL, "SLIM RX1 MUX"}, - {"SLIM RX2", NULL, "SLIM RX2 MUX"}, - {"SLIM RX3", NULL, "SLIM RX3 MUX"}, - {"SLIM RX4", NULL, "SLIM RX4 MUX"}, - {"SLIM RX5", NULL, "SLIM RX5 MUX"}, - {"SLIM RX6", NULL, "SLIM RX6 MUX"}, - {"SLIM RX7", NULL, "SLIM RX7 MUX"}, - - {"RX INT0_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT0_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT0_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT0_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT0_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT0_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT0_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT0_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT0_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT0_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT0_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT0_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT0_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT0_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT0_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT0_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT0_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT0_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT0_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT0_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT0_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT0_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"}, - - /* MIXing path INT0 */ - {"RX INT0_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT0_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT0_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT0_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT0_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT0_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT0_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT0_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_2 MUX"}, - - /* MIXing path INT1 */ - {"RX INT1_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT1_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT1_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT1_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT1_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT1_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT1_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT1_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT1 SEC MIX", NULL, "RX INT1_2 MUX"}, - - /* MIXing path INT2 */ - {"RX INT2_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT2_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT2_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT2_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT2_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT2_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT2_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT2_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT2 SEC MIX", NULL, "RX INT2_2 MUX"}, - - /* MIXing path INT3 */ - {"RX INT3_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT3_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT3_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT3_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT3_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT3_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT3_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT3_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT3 SEC MIX", NULL, "RX INT3_2 MUX"}, - - /* MIXing path INT4 */ - {"RX INT4_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT4_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT4_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT4_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT4_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT4_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT4_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT4_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT4 SEC MIX", NULL, "RX INT4_2 MUX"}, - - /* MIXing path INT5 */ - {"RX INT5_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT5_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT5_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT5_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT5_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT5_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT5_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT5_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT5 SEC MIX", NULL, "RX INT5_2 MUX"}, - - /* MIXing path INT6 */ - {"RX INT6_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT6_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT6_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT6_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT6_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT6_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT6_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT6_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT6 SEC MIX", NULL, "RX INT6_2 MUX"}, - - /* MIXing path INT7 */ - {"RX INT7_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT7_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT7_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT7_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT7_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT7_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT7_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT7_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT7 SEC MIX", NULL, "RX INT7_2 MUX"}, - - /* MIXing path INT8 */ - {"RX INT8_2 MUX", "RX0", "SLIM RX0"}, - {"RX INT8_2 MUX", "RX1", "SLIM RX1"}, - {"RX INT8_2 MUX", "RX2", "SLIM RX2"}, - {"RX INT8_2 MUX", "RX3", "SLIM RX3"}, - {"RX INT8_2 MUX", "RX4", "SLIM RX4"}, - {"RX INT8_2 MUX", "RX5", "SLIM RX5"}, - {"RX INT8_2 MUX", "RX6", "SLIM RX6"}, - {"RX INT8_2 MUX", "RX7", "SLIM RX7"}, - {"RX INT8 SEC MIX", NULL, "RX INT8_2 MUX"}, - - {"RX INT1_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT1_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT1_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT1_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT1_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT1_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT1_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT1_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT1_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT1_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT1_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT1_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT1_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT1_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT1_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT1_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT1_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT1_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT1_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT1_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT1_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT1_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT2_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT2_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT2_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT2_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT2_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT2_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT2_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT2_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT2_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT2_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT2_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT2_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT2_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT2_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT2_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT2_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT2_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT2_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT2_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT2_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT2_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT3_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT3_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT3_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT3_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT3_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT3_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT3_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT3_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT3_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT3_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT3_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT3_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT3_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT3_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT3_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT3_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT3_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT3_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT3_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT3_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT3_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT3_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT3_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT3_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT3_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT3_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT3_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT3_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT3_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT3_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT4_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT4_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT4_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT4_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT4_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT4_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT4_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT4_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT4_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT4_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT4_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT4_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT4_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT4_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT4_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT4_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT4_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT4_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT4_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT4_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT4_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT4_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT4_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT4_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT4_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT4_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT4_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT4_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT4_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT4_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT5_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT5_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT5_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT5_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT5_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT5_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT5_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT5_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT5_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT5_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT5_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT5_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT5_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT5_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT5_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT5_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT5_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT5_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT5_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT5_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT5_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT5_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT5_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT5_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT5_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT5_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT5_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT5_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT5_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT5_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT6_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT6_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT6_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT6_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT6_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT6_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT6_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT6_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT6_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT6_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT6_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT6_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT6_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT6_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT6_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT6_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT6_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT6_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT6_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT6_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT6_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT6_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT6_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT6_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT6_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT6_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT6_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT6_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT6_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT6_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT7_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT7_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT7_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT7_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT7_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT7_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT7_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT7_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT7_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT7_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT7_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT7_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT7_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT7_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT7_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT7_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT7_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT7_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT7_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT7_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT7_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT7_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT7_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT7_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT7_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT7_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT7_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT8_1 MIX1 INP0", "RX0", "SLIM RX0"}, - {"RX INT8_1 MIX1 INP0", "RX1", "SLIM RX1"}, - {"RX INT8_1 MIX1 INP0", "RX2", "SLIM RX2"}, - {"RX INT8_1 MIX1 INP0", "RX3", "SLIM RX3"}, - {"RX INT8_1 MIX1 INP0", "RX4", "SLIM RX4"}, - {"RX INT8_1 MIX1 INP0", "RX5", "SLIM RX5"}, - {"RX INT8_1 MIX1 INP0", "RX6", "SLIM RX6"}, - {"RX INT8_1 MIX1 INP0", "RX7", "SLIM RX7"}, - {"RX INT8_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT8_1 MIX1 INP1", "RX0", "SLIM RX0"}, - {"RX INT8_1 MIX1 INP1", "RX1", "SLIM RX1"}, - {"RX INT8_1 MIX1 INP1", "RX2", "SLIM RX2"}, - {"RX INT8_1 MIX1 INP1", "RX3", "SLIM RX3"}, - {"RX INT8_1 MIX1 INP1", "RX4", "SLIM RX4"}, - {"RX INT8_1 MIX1 INP1", "RX5", "SLIM RX5"}, - {"RX INT8_1 MIX1 INP1", "RX6", "SLIM RX6"}, - {"RX INT8_1 MIX1 INP1", "RX7", "SLIM RX7"}, - {"RX INT8_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT8_1 MIX1 INP2", "RX0", "SLIM RX0"}, - {"RX INT8_1 MIX1 INP2", "RX1", "SLIM RX1"}, - {"RX INT8_1 MIX1 INP2", "RX2", "SLIM RX2"}, - {"RX INT8_1 MIX1 INP2", "RX3", "SLIM RX3"}, - {"RX INT8_1 MIX1 INP2", "RX4", "SLIM RX4"}, - {"RX INT8_1 MIX1 INP2", "RX5", "SLIM RX5"}, - {"RX INT8_1 MIX1 INP2", "RX6", "SLIM RX6"}, - {"RX INT8_1 MIX1 INP2", "RX7", "SLIM RX7"}, - {"RX INT8_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP2", "IIR1", "IIR1"}, - - /* SRC0, SRC1 inputs to Sidetone RX Mixer - * on RX0, RX1, RX2, RX3, RX4 and RX7 chains - */ - {"IIR0", NULL, "IIR0 INP0 MUX"}, - {"IIR0 INP0 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP0 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP0 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP0 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP0 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP0 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP0 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP0 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP0 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP0 MUX", "RX0", "SLIM RX0"}, - {"IIR0 INP0 MUX", "RX1", "SLIM RX1"}, - {"IIR0 INP0 MUX", "RX2", "SLIM RX2"}, - {"IIR0 INP0 MUX", "RX3", "SLIM RX3"}, - {"IIR0 INP0 MUX", "RX4", "SLIM RX4"}, - {"IIR0 INP0 MUX", "RX5", "SLIM RX5"}, - {"IIR0 INP0 MUX", "RX6", "SLIM RX6"}, - {"IIR0 INP0 MUX", "RX7", "SLIM RX7"}, - {"IIR0", NULL, "IIR0 INP1 MUX"}, - {"IIR0 INP1 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP1 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP1 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP1 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP1 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP1 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP1 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP1 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP1 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP1 MUX", "RX0", "SLIM RX0"}, - {"IIR0 INP1 MUX", "RX1", "SLIM RX1"}, - {"IIR0 INP1 MUX", "RX2", "SLIM RX2"}, - {"IIR0 INP1 MUX", "RX3", "SLIM RX3"}, - {"IIR0 INP1 MUX", "RX4", "SLIM RX4"}, - {"IIR0 INP1 MUX", "RX5", "SLIM RX5"}, - {"IIR0 INP1 MUX", "RX6", "SLIM RX6"}, - {"IIR0 INP1 MUX", "RX7", "SLIM RX7"}, - {"IIR0", NULL, "IIR0 INP2 MUX"}, - {"IIR0 INP2 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP2 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP2 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP2 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP2 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP2 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP2 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP2 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP2 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP2 MUX", "RX0", "SLIM RX0"}, - {"IIR0 INP2 MUX", "RX1", "SLIM RX1"}, - {"IIR0 INP2 MUX", "RX2", "SLIM RX2"}, - {"IIR0 INP2 MUX", "RX3", "SLIM RX3"}, - {"IIR0 INP2 MUX", "RX4", "SLIM RX4"}, - {"IIR0 INP2 MUX", "RX5", "SLIM RX5"}, - {"IIR0 INP2 MUX", "RX6", "SLIM RX6"}, - {"IIR0 INP2 MUX", "RX7", "SLIM RX7"}, - {"IIR0", NULL, "IIR0 INP3 MUX"}, - {"IIR0 INP3 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP3 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP3 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP3 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP3 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP3 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP3 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP3 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP3 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP3 MUX", "RX0", "SLIM RX0"}, - {"IIR0 INP3 MUX", "RX1", "SLIM RX1"}, - {"IIR0 INP3 MUX", "RX2", "SLIM RX2"}, - {"IIR0 INP3 MUX", "RX3", "SLIM RX3"}, - {"IIR0 INP3 MUX", "RX4", "SLIM RX4"}, - {"IIR0 INP3 MUX", "RX5", "SLIM RX5"}, - {"IIR0 INP3 MUX", "RX6", "SLIM RX6"}, - {"IIR0 INP3 MUX", "RX7", "SLIM RX7"}, - - {"IIR1", NULL, "IIR1 INP0 MUX"}, - {"IIR1 INP0 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP0 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP0 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP0 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP0 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP0 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP0 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP0 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP0 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP0 MUX", "RX0", "SLIM RX0"}, - {"IIR1 INP0 MUX", "RX1", "SLIM RX1"}, - {"IIR1 INP0 MUX", "RX2", "SLIM RX2"}, - {"IIR1 INP0 MUX", "RX3", "SLIM RX3"}, - {"IIR1 INP0 MUX", "RX4", "SLIM RX4"}, - {"IIR1 INP0 MUX", "RX5", "SLIM RX5"}, - {"IIR1 INP0 MUX", "RX6", "SLIM RX6"}, - {"IIR1 INP0 MUX", "RX7", "SLIM RX7"}, - {"IIR1", NULL, "IIR1 INP1 MUX"}, - {"IIR1 INP1 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP1 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP1 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP1 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP1 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP1 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP1 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP1 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP1 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP1 MUX", "RX0", "SLIM RX0"}, - {"IIR1 INP1 MUX", "RX1", "SLIM RX1"}, - {"IIR1 INP1 MUX", "RX2", "SLIM RX2"}, - {"IIR1 INP1 MUX", "RX3", "SLIM RX3"}, - {"IIR1 INP1 MUX", "RX4", "SLIM RX4"}, - {"IIR1 INP1 MUX", "RX5", "SLIM RX5"}, - {"IIR1 INP1 MUX", "RX6", "SLIM RX6"}, - {"IIR1 INP1 MUX", "RX7", "SLIM RX7"}, - {"IIR1", NULL, "IIR1 INP2 MUX"}, - {"IIR1 INP2 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP2 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP2 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP2 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP2 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP2 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP2 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP2 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP2 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP2 MUX", "RX0", "SLIM RX0"}, - {"IIR1 INP2 MUX", "RX1", "SLIM RX1"}, - {"IIR1 INP2 MUX", "RX2", "SLIM RX2"}, - {"IIR1 INP2 MUX", "RX3", "SLIM RX3"}, - {"IIR1 INP2 MUX", "RX4", "SLIM RX4"}, - {"IIR1 INP2 MUX", "RX5", "SLIM RX5"}, - {"IIR1 INP2 MUX", "RX6", "SLIM RX6"}, - {"IIR1 INP2 MUX", "RX7", "SLIM RX7"}, - {"IIR1", NULL, "IIR1 INP3 MUX"}, - {"IIR1 INP3 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP3 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP3 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP3 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP3 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP3 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP3 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP3 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP3 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP3 MUX", "RX0", "SLIM RX0"}, - {"IIR1 INP3 MUX", "RX1", "SLIM RX1"}, - {"IIR1 INP3 MUX", "RX2", "SLIM RX2"}, - {"IIR1 INP3 MUX", "RX3", "SLIM RX3"}, - {"IIR1 INP3 MUX", "RX4", "SLIM RX4"}, - {"IIR1 INP3 MUX", "RX5", "SLIM RX5"}, - {"IIR1 INP3 MUX", "RX6", "SLIM RX6"}, - {"IIR1 INP3 MUX", "RX7", "SLIM RX7"}, - - {"SRC0", NULL, "IIR0"}, - {"SRC1", NULL, "IIR1"}, - {"RX INT0 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT0 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT1 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT1 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT2 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT2 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT3 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT3 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT4 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT4 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT7 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT7 MIX2 INP", "SRC1", "SRC1"}, -}; - -static int tasha_amic_pwr_lvl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u16 amic_reg; - - if (!strcmp(kcontrol->id.name, "AMIC_1_2 PWR MODE")) - amic_reg = WCD9335_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AMIC_3_4 PWR MODE")) - amic_reg = WCD9335_ANA_AMIC3; - if (!strcmp(kcontrol->id.name, "AMIC_5_6 PWR MODE")) - amic_reg = WCD9335_ANA_AMIC5; - - ucontrol->value.integer.value[0] = - (snd_soc_read(codec, amic_reg) & WCD9335_AMIC_PWR_LVL_MASK) >> - WCD9335_AMIC_PWR_LVL_SHIFT; - - return 0; -} - -static int tasha_amic_pwr_lvl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u32 mode_val; - u16 amic_reg; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", - __func__, mode_val); - - if (!strcmp(kcontrol->id.name, "AMIC_1_2 PWR MODE")) - amic_reg = WCD9335_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AMIC_3_4 PWR MODE")) - amic_reg = WCD9335_ANA_AMIC3; - if (!strcmp(kcontrol->id.name, "AMIC_5_6 PWR MODE")) - amic_reg = WCD9335_ANA_AMIC5; - - snd_soc_update_bits(codec, amic_reg, WCD9335_AMIC_PWR_LVL_MASK, - mode_val << WCD9335_AMIC_PWR_LVL_SHIFT); - - return 0; -} - -static int tasha_rx_hph_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tasha->hph_mode; - return 0; -} - -static int tasha_rx_hph_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u32 mode_val; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", - __func__, mode_val); - - if (mode_val == 0) { - dev_warn(codec->dev, "%s:Invalid HPH Mode, default to Cls-H HiFi\n", - __func__); - mode_val = CLS_H_HIFI; - } - tasha->hph_mode = mode_val; - return 0; -} - -static const char *const tasha_conn_mad_text[] = { - "NOTUSED1", "ADC1", "ADC2", "ADC3", "ADC4", "ADC5", "ADC6", - "NOTUSED2", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", - "DMIC5", "NOTUSED3", "NOTUSED4" -}; - -static const struct soc_enum tasha_conn_mad_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tasha_conn_mad_text), - tasha_conn_mad_text); - -static int tasha_enable_ldo_h_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u8 val = 0; - - if (codec) - val = snd_soc_read(codec, WCD9335_LDOH_MODE) & 0x80; - - ucontrol->value.integer.value[0] = !!val; - - return 0; -} - -static int tasha_enable_ldo_h_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int value = ucontrol->value.integer.value[0]; - bool enable; - - enable = !!value; - if (codec) - tasha_codec_enable_standalone_ldo_h(codec, enable); - - return 0; -} - -static int tasha_mad_input_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 tasha_mad_input; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - tasha_mad_input = snd_soc_read(codec, - WCD9335_SOC_MAD_INP_SEL) & 0x0F; - ucontrol->value.integer.value[0] = tasha_mad_input; - - dev_dbg(codec->dev, - "%s: tasha_mad_input = %s\n", __func__, - tasha_conn_mad_text[tasha_mad_input]); - return 0; -} - -static int tasha_mad_input_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 tasha_mad_input; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_card *card = codec->component.card; - char mad_amic_input_widget[6]; - const char *mad_input_widget; - const char *source_widget = NULL; - u32 adc, i, mic_bias_found = 0; - int ret = 0; - char *mad_input; - - tasha_mad_input = ucontrol->value.integer.value[0]; - - if (tasha_mad_input >= ARRAY_SIZE(tasha_conn_mad_text)) { - dev_err(codec->dev, - "%s: tasha_mad_input = %d out of bounds\n", - __func__, tasha_mad_input); - return -EINVAL; - } - - if (!strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED1") || - !strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED2") || - !strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED3") || - !strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED4")) { - dev_err(codec->dev, - "%s: Unsupported tasha_mad_input = %s\n", - __func__, tasha_conn_mad_text[tasha_mad_input]); - return -EINVAL; - } - - if (strnstr(tasha_conn_mad_text[tasha_mad_input], - "ADC", sizeof("ADC"))) { - mad_input = strpbrk(tasha_conn_mad_text[tasha_mad_input], - "123456"); - if (!mad_input) { - dev_err(codec->dev, "%s: Invalid MAD input %s\n", - __func__, - tasha_conn_mad_text[tasha_mad_input]); - return -EINVAL; - } - ret = kstrtouint(mad_input, 10, &adc); - if ((ret < 0) || (adc > 6)) { - dev_err(codec->dev, - "%s: Invalid ADC = %s\n", __func__, - tasha_conn_mad_text[tasha_mad_input]); - ret = -EINVAL; - } - - snprintf(mad_amic_input_widget, 6, "%s%u", "AMIC", adc); - - mad_input_widget = mad_amic_input_widget; - } else { - /* DMIC type input widget*/ - mad_input_widget = tasha_conn_mad_text[tasha_mad_input]; - } - - dev_dbg(codec->dev, - "%s: tasha input widget = %s\n", __func__, - mad_input_widget); - - for (i = 0; i < card->num_of_dapm_routes; i++) { - if (!strcmp(card->of_dapm_routes[i].sink, mad_input_widget)) { - source_widget = card->of_dapm_routes[i].source; - if (!source_widget) { - dev_err(codec->dev, - "%s: invalid source widget\n", - __func__); - return -EINVAL; - } - - if (strnstr(source_widget, - "MIC BIAS1", sizeof("MIC BIAS1"))) { - mic_bias_found = 1; - break; - } else if (strnstr(source_widget, - "MIC BIAS2", sizeof("MIC BIAS2"))) { - mic_bias_found = 2; - break; - } else if (strnstr(source_widget, - "MIC BIAS3", sizeof("MIC BIAS3"))) { - mic_bias_found = 3; - break; - } else if (strnstr(source_widget, - "MIC BIAS4", sizeof("MIC BIAS4"))) { - mic_bias_found = 4; - break; - } - } - } - - if (!mic_bias_found) { - dev_err(codec->dev, - "%s: mic bias source not found for input = %s\n", - __func__, mad_input_widget); - return -EINVAL; - } - - dev_dbg(codec->dev, - "%s: mic_bias found = %d\n", __func__, - mic_bias_found); - - snd_soc_update_bits(codec, WCD9335_SOC_MAD_INP_SEL, - 0x0F, tasha_mad_input); - snd_soc_update_bits(codec, WCD9335_ANA_MAD_SETUP, - 0x07, mic_bias_found); - - return 0; -} - -static int tasha_pinctl_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u16 ctl_reg; - u8 reg_val, pinctl_position; - - pinctl_position = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - switch (pinctl_position >> 3) { - case 0: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_0; - break; - case 1: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_1; - break; - case 2: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_2; - break; - case 3: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_3; - break; - default: - dev_err(codec->dev, "%s: Invalid pinctl position = %d\n", - __func__, pinctl_position); - return -EINVAL; - } - - reg_val = snd_soc_read(codec, ctl_reg); - reg_val = (reg_val >> (pinctl_position & 0x07)) & 0x1; - ucontrol->value.integer.value[0] = reg_val; - - return 0; -} - -static int tasha_pinctl_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u16 ctl_reg, cfg_reg; - u8 ctl_val, cfg_val, pinctl_position, pinctl_mode, mask; - - /* 1- high or low; 0- high Z */ - pinctl_mode = ucontrol->value.integer.value[0]; - pinctl_position = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - switch (pinctl_position >> 3) { - case 0: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_0; - break; - case 1: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_1; - break; - case 2: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_2; - break; - case 3: - ctl_reg = WCD9335_TEST_DEBUG_PIN_CTL_OE_3; - break; - default: - dev_err(codec->dev, "%s: Invalid pinctl position = %d\n", - __func__, pinctl_position); - return -EINVAL; - } - - ctl_val = pinctl_mode << (pinctl_position & 0x07); - mask = 1 << (pinctl_position & 0x07); - snd_soc_update_bits(codec, ctl_reg, mask, ctl_val); - - cfg_reg = WCD9335_TLMM_BIST_MODE_PINCFG + pinctl_position; - if (!pinctl_mode) { - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - cfg_val = 0x4; - else - cfg_val = 0xC; - } else { - cfg_val = 0; - } - snd_soc_update_bits(codec, cfg_reg, 0x07, cfg_val); - - dev_dbg(codec->dev, "%s: reg=0x%x mask=0x%x val=%d reg=0x%x val=%d\n", - __func__, ctl_reg, mask, ctl_val, cfg_reg, cfg_val); - - return 0; -} - -static void wcd_vbat_adc_out_config_2_0(struct wcd_vbat *vbat, - struct snd_soc_codec *codec) -{ - u8 val1, val2; - - /* - * Measure dcp1 by using "ALT" branch of band gap - * voltage(Vbg) and use it in FAST mode - */ - snd_soc_update_bits(codec, WCD9335_BIAS_CTL, 0x82, 0x82); - snd_soc_update_bits(codec, WCD9335_CDC_VBAT_VBAT_PATH_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, WCD9335_CDC_VBAT_VBAT_DEBUG1, 0x01, 0x01); - snd_soc_update_bits(codec, WCD9335_ANA_VBADC, 0x80, 0x80); - snd_soc_update_bits(codec, WCD9335_VBADC_SUBBLOCK_EN, 0x20, 0x00); - - snd_soc_update_bits(codec, WCD9335_VBADC_FE_CTRL, 0x20, 0x20); - /* Wait 100 usec after calibration select as Vbg */ - usleep_range(100, 110); - - snd_soc_update_bits(codec, WCD9335_VBADC_ADC_IO, 0x40, 0x40); - val1 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTMSB); - val2 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTLSB); - snd_soc_update_bits(codec, WCD9335_VBADC_ADC_IO, 0x40, 0x00); - - vbat->dcp1 = (((val1 & 0xFF) << 3) | (val2 & 0x07)); - - snd_soc_update_bits(codec, WCD9335_BIAS_CTL, 0x40, 0x40); - /* Wait 100 usec after selecting Vbg as 1.05V */ - usleep_range(100, 110); - - snd_soc_update_bits(codec, WCD9335_VBADC_ADC_IO, 0x40, 0x40); - val1 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTMSB); - val2 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTLSB); - snd_soc_update_bits(codec, WCD9335_VBADC_ADC_IO, 0x40, 0x00); - - vbat->dcp2 = (((val1 & 0xFF) << 3) | (val2 & 0x07)); - - dev_dbg(codec->dev, "%s: dcp1:0x%x, dcp2:0x%x\n", - __func__, vbat->dcp1, vbat->dcp2); - - snd_soc_write(codec, WCD9335_BIAS_CTL, 0x28); - /* Wait 100 usec after selecting Vbg as 0.85V */ - usleep_range(100, 110); - - snd_soc_update_bits(codec, WCD9335_VBADC_FE_CTRL, 0x20, 0x00); - snd_soc_update_bits(codec, WCD9335_VBADC_SUBBLOCK_EN, 0x20, 0x20); - snd_soc_update_bits(codec, WCD9335_ANA_VBADC, 0x80, 0x00); - - snd_soc_update_bits(codec, WCD9335_CDC_VBAT_VBAT_PATH_CTL, 0x10, 0x00); - snd_soc_update_bits(codec, WCD9335_CDC_VBAT_VBAT_DEBUG1, 0x01, 0x00); -} - -static void wcd_vbat_adc_out_config_1_x(struct wcd_vbat *vbat, - struct snd_soc_codec *codec) -{ - u8 val1, val2; - - /* - * Measure dcp1 by applying band gap voltage(Vbg) - * of 0.85V - */ - snd_soc_write(codec, WCD9335_ANA_BIAS, 0x20); - snd_soc_write(codec, WCD9335_BIAS_CTL, 0x28); - snd_soc_write(codec, WCD9335_BIAS_VBG_FINE_ADJ, 0x05); - snd_soc_write(codec, WCD9335_ANA_BIAS, 0xA0); - /* Wait 2 sec after enabling band gap bias */ - usleep_range(2000000, 2000100); - - snd_soc_write(codec, WCD9335_ANA_CLK_TOP, 0x82); - snd_soc_write(codec, WCD9335_ANA_CLK_TOP, 0x87); - snd_soc_update_bits(codec, WCD9335_CDC_VBAT_VBAT_PATH_CTL, 0x10, 0x10); - snd_soc_write(codec, WCD9335_CDC_VBAT_VBAT_CFG, 0x0D); - snd_soc_write(codec, WCD9335_CDC_VBAT_VBAT_DEBUG1, 0x01); - - snd_soc_write(codec, WCD9335_ANA_VBADC, 0x80); - snd_soc_write(codec, WCD9335_VBADC_SUBBLOCK_EN, 0xDE); - snd_soc_write(codec, WCD9335_VBADC_FE_CTRL, 0x3C); - /* Wait 1 msec after calibration select as Vbg */ - usleep_range(1000, 1100); - - snd_soc_write(codec, WCD9335_VBADC_ADC_IO, 0xC0); - val1 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTMSB); - val2 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTLSB); - snd_soc_write(codec, WCD9335_VBADC_ADC_IO, 0x80); - - vbat->dcp1 = (((val1 & 0xFF) << 3) | (val2 & 0x07)); - - /* - * Measure dcp2 by applying band gap voltage(Vbg) - * of 1.05V - */ - snd_soc_write(codec, WCD9335_ANA_BIAS, 0x80); - snd_soc_write(codec, WCD9335_ANA_BIAS, 0xC0); - snd_soc_write(codec, WCD9335_BIAS_CTL, 0x68); - /* Wait 2 msec after selecting Vbg as 1.05V */ - usleep_range(2000, 2100); - - snd_soc_write(codec, WCD9335_ANA_BIAS, 0x80); - /* Wait 1 sec after enabling band gap bias */ - usleep_range(1000000, 1000100); - - snd_soc_write(codec, WCD9335_VBADC_ADC_IO, 0xC0); - val1 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTMSB); - val2 = snd_soc_read(codec, WCD9335_VBADC_ADC_DOUTLSB); - snd_soc_write(codec, WCD9335_VBADC_ADC_IO, 0x80); - - vbat->dcp2 = (((val1 & 0xFF) << 3) | (val2 & 0x07)); - - dev_dbg(codec->dev, "%s: dcp1:0x%x, dcp2:0x%x\n", - __func__, vbat->dcp1, vbat->dcp2); - - /* Reset the Vbat ADC configuration */ - snd_soc_write(codec, WCD9335_ANA_BIAS, 0x80); - snd_soc_write(codec, WCD9335_ANA_BIAS, 0xC0); - - snd_soc_write(codec, WCD9335_BIAS_CTL, 0x28); - /* Wait 2 msec after selecting Vbg as 0.85V */ - usleep_range(2000, 2100); - - snd_soc_write(codec, WCD9335_ANA_BIAS, 0xA0); - /* Wait 1 sec after enabling band gap bias */ - usleep_range(1000000, 1000100); - - snd_soc_write(codec, WCD9335_VBADC_FE_CTRL, 0x1C); - snd_soc_write(codec, WCD9335_VBADC_SUBBLOCK_EN, 0xFE); - snd_soc_write(codec, WCD9335_VBADC_ADC_IO, 0x80); - snd_soc_write(codec, WCD9335_ANA_VBADC, 0x00); - - snd_soc_write(codec, WCD9335_CDC_VBAT_VBAT_DEBUG1, 0x00); - snd_soc_write(codec, WCD9335_CDC_VBAT_VBAT_PATH_CTL, 0x00); - snd_soc_write(codec, WCD9335_CDC_VBAT_VBAT_CFG, 0x0A); -} - -static void wcd_vbat_adc_out_config(struct wcd_vbat *vbat, - struct snd_soc_codec *codec) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!vbat->adc_config) { - tasha_cdc_mclk_enable(codec, true, false); - - if (TASHA_IS_2_0(wcd9xxx)) - wcd_vbat_adc_out_config_2_0(vbat, codec); - else - wcd_vbat_adc_out_config_1_x(vbat, codec); - - tasha_cdc_mclk_enable(codec, false, false); - vbat->adc_config = true; - } -} - -static int tasha_update_vbat_reg_config(struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct firmware_cal *hwdep_cal = NULL; - struct vbat_monitor_reg *vbat_reg_ptr = NULL; - const void *data; - size_t cal_size, vbat_size_remaining; - int ret = 0, i; - u32 vbat_writes_size = 0; - u16 reg; - u8 mask, val, old_val; - - hwdep_cal = wcdcal_get_fw_cal(tasha->fw_data, WCD9XXX_VBAT_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration\n", - __func__); - } else { - dev_err(codec->dev, "%s: Vbat cal not received\n", - __func__); - ret = -EINVAL; - goto done; - } - - if (cal_size < sizeof(*vbat_reg_ptr)) { - dev_err(codec->dev, - "%s: Incorrect size %zd for Vbat Cal, expected %zd\n", - __func__, cal_size, sizeof(*vbat_reg_ptr)); - ret = -EINVAL; - goto done; - } - - vbat_reg_ptr = (struct vbat_monitor_reg *) (data); - - if (!vbat_reg_ptr) { - dev_err(codec->dev, - "%s: Invalid calibration data for Vbat\n", - __func__); - ret = -EINVAL; - goto done; - } - - vbat_writes_size = vbat_reg_ptr->size; - vbat_size_remaining = cal_size - sizeof(u32); - dev_dbg(codec->dev, "%s: vbat_writes_sz: %d, vbat_sz_remaining: %zd\n", - __func__, vbat_writes_size, vbat_size_remaining); - - if ((vbat_writes_size * TASHA_PACKED_REG_SIZE) - > vbat_size_remaining) { - pr_err("%s: Incorrect Vbat calibration data\n", __func__); - ret = -EINVAL; - goto done; - } - - for (i = 0 ; i < vbat_writes_size; i++) { - TASHA_CODEC_UNPACK_ENTRY(vbat_reg_ptr->writes[i], - reg, mask, val); - old_val = snd_soc_read(codec, reg); - snd_soc_write(codec, reg, (old_val & ~mask) | (val & mask)); - } - -done: - return ret; -} - -static int tasha_vbat_adc_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - wcd_vbat_adc_out_config(&tasha->vbat, codec); - - ucontrol->value.integer.value[0] = tasha->vbat.dcp1; - ucontrol->value.integer.value[1] = tasha->vbat.dcp2; - - dev_dbg(codec->dev, - "%s: Vbat ADC output values, Dcp1 : %lu, Dcp2: %lu\n", - __func__, ucontrol->value.integer.value[0], - ucontrol->value.integer.value[1]); - - return 0; -} - -static const char * const tasha_vbat_gsm_mode_text[] = { - "OFF", "ON"}; - -static const struct soc_enum tasha_vbat_gsm_mode_enum = - SOC_ENUM_SINGLE_EXT(2, tasha_vbat_gsm_mode_text); - -static int tasha_vbat_gsm_mode_func_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ucontrol->value.integer.value[0] = - ((snd_soc_read(codec, WCD9335_CDC_VBAT_VBAT_CFG) & 0x04) ? - 1 : 0); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int tasha_vbat_gsm_mode_func_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: value: %lu\n", __func__, - ucontrol->value.integer.value[0]); - - /* Set Vbat register configuration for GSM mode bit based on value */ - if (ucontrol->value.integer.value[0]) - snd_soc_update_bits(codec, WCD9335_CDC_VBAT_VBAT_CFG, - 0x04, 0x04); - else - snd_soc_update_bits(codec, WCD9335_CDC_VBAT_VBAT_CFG, - 0x04, 0x00); - - return 0; -} - -static int tasha_codec_vbat_enable_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u16 vbat_path_ctl, vbat_cfg, vbat_path_cfg; - - vbat_path_ctl = WCD9335_CDC_VBAT_VBAT_PATH_CTL; - vbat_cfg = WCD9335_CDC_VBAT_VBAT_CFG; - vbat_path_cfg = WCD9335_CDC_RX8_RX_PATH_CFG1; - - if (!strcmp(w->name, "RX INT8 VBAT")) - vbat_path_cfg = WCD9335_CDC_RX8_RX_PATH_CFG1; - else if (!strcmp(w->name, "RX INT7 VBAT")) - vbat_path_cfg = WCD9335_CDC_RX7_RX_PATH_CFG1; - else if (!strcmp(w->name, "RX INT6 VBAT")) - vbat_path_cfg = WCD9335_CDC_RX6_RX_PATH_CFG1; - else if (!strcmp(w->name, "RX INT5 VBAT")) - vbat_path_cfg = WCD9335_CDC_RX5_RX_PATH_CFG1; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = tasha_update_vbat_reg_config(codec); - if (ret) { - dev_dbg(codec->dev, - "%s : VBAT isn't calibrated, So not enabling it\n", - __func__); - return 0; - } - snd_soc_write(codec, WCD9335_ANA_VBADC, 0x80); - snd_soc_update_bits(codec, vbat_path_cfg, 0x02, 0x02); - snd_soc_update_bits(codec, vbat_path_ctl, 0x10, 0x10); - snd_soc_update_bits(codec, vbat_cfg, 0x01, 0x01); - tasha->vbat.is_enabled = true; - break; - case SND_SOC_DAPM_POST_PMD: - if (tasha->vbat.is_enabled) { - snd_soc_update_bits(codec, vbat_cfg, 0x01, 0x00); - snd_soc_update_bits(codec, vbat_path_ctl, 0x10, 0x00); - snd_soc_update_bits(codec, vbat_path_cfg, 0x02, 0x00); - snd_soc_write(codec, WCD9335_ANA_VBADC, 0x00); - tasha->vbat.is_enabled = false; - } - break; - }; - - return ret; -} - -static const char * const rx_hph_mode_mux_text[] = { - "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI" -}; - -static const struct soc_enum rx_hph_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), - rx_hph_mode_mux_text); - -static const char * const amic_pwr_lvl_text[] = { - "LOW_PWR", "DEFAULT", "HIGH_PERF" -}; - -static const struct soc_enum amic_pwr_lvl_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(amic_pwr_lvl_text), - amic_pwr_lvl_text); - -static const struct snd_kcontrol_new tasha_snd_controls[] = { - SOC_SINGLE_SX_TLV("RX0 Digital Volume", WCD9335_CDC_RX0_RX_VOL_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX1 Digital Volume", WCD9335_CDC_RX1_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX2 Digital Volume", WCD9335_CDC_RX2_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX3 Digital Volume", WCD9335_CDC_RX3_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX4 Digital Volume", WCD9335_CDC_RX4_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX5 Digital Volume", WCD9335_CDC_RX5_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX6 Digital Volume", WCD9335_CDC_RX6_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX7 Digital Volume", WCD9335_CDC_RX7_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX8 Digital Volume", WCD9335_CDC_RX8_RX_VOL_CTL, - 0, -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("RX0 Mix Digital Volume", - WCD9335_CDC_RX0_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX1 Mix Digital Volume", - WCD9335_CDC_RX1_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX2 Mix Digital Volume", - WCD9335_CDC_RX2_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX3 Mix Digital Volume", - WCD9335_CDC_RX3_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX4 Mix Digital Volume", - WCD9335_CDC_RX4_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX5 Mix Digital Volume", - WCD9335_CDC_RX5_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX6 Mix Digital Volume", - WCD9335_CDC_RX6_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX7 Mix Digital Volume", - WCD9335_CDC_RX7_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX8 Mix Digital Volume", - WCD9335_CDC_RX8_RX_VOL_MIX_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - - SOC_SINGLE_SX_TLV("DEC0 Volume", WCD9335_CDC_TX0_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC1 Volume", WCD9335_CDC_TX1_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC2 Volume", WCD9335_CDC_TX2_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC3 Volume", WCD9335_CDC_TX3_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC4 Volume", WCD9335_CDC_TX4_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC5 Volume", WCD9335_CDC_TX5_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC6 Volume", WCD9335_CDC_TX6_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC7 Volume", WCD9335_CDC_TX7_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC8 Volume", WCD9335_CDC_TX8_TX_VOL_CTL, 0, - -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("IIR0 INP0 Volume", - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, - 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP1 Volume", - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, - 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP2 Volume", - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, - 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP3 Volume", - WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, - 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP0 Volume", - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0, -84, - 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP1 Volume", - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0, -84, - 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP2 Volume", - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0, -84, - 40, digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP3 Volume", - WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0, -84, - 40, digital_gain), - - SOC_SINGLE_EXT("ANC Slot", SND_SOC_NOPM, 0, 100, 0, tasha_get_anc_slot, - tasha_put_anc_slot), - SOC_ENUM_EXT("ANC Function", tasha_anc_func_enum, tasha_get_anc_func, - tasha_put_anc_func), - - SOC_ENUM_EXT("CLK MODE", tasha_clkmode_enum, tasha_get_clkmode, - tasha_put_clkmode), - - SOC_ENUM("TX0 HPF cut off", cf_dec0_enum), - SOC_ENUM("TX1 HPF cut off", cf_dec1_enum), - SOC_ENUM("TX2 HPF cut off", cf_dec2_enum), - SOC_ENUM("TX3 HPF cut off", cf_dec3_enum), - SOC_ENUM("TX4 HPF cut off", cf_dec4_enum), - SOC_ENUM("TX5 HPF cut off", cf_dec5_enum), - SOC_ENUM("TX6 HPF cut off", cf_dec6_enum), - SOC_ENUM("TX7 HPF cut off", cf_dec7_enum), - SOC_ENUM("TX8 HPF cut off", cf_dec8_enum), - - SOC_ENUM("RX INT0_1 HPF cut off", cf_int0_1_enum), - SOC_ENUM("RX INT0_2 HPF cut off", cf_int0_2_enum), - SOC_ENUM("RX INT1_1 HPF cut off", cf_int1_1_enum), - SOC_ENUM("RX INT1_2 HPF cut off", cf_int1_2_enum), - SOC_ENUM("RX INT2_1 HPF cut off", cf_int2_1_enum), - SOC_ENUM("RX INT2_2 HPF cut off", cf_int2_2_enum), - SOC_ENUM("RX INT3_1 HPF cut off", cf_int3_1_enum), - SOC_ENUM("RX INT3_2 HPF cut off", cf_int3_2_enum), - SOC_ENUM("RX INT4_1 HPF cut off", cf_int4_1_enum), - SOC_ENUM("RX INT4_2 HPF cut off", cf_int4_2_enum), - SOC_ENUM("RX INT5_1 HPF cut off", cf_int5_1_enum), - SOC_ENUM("RX INT5_2 HPF cut off", cf_int5_2_enum), - SOC_ENUM("RX INT6_1 HPF cut off", cf_int6_1_enum), - SOC_ENUM("RX INT6_2 HPF cut off", cf_int6_2_enum), - SOC_ENUM("RX INT7_1 HPF cut off", cf_int7_1_enum), - SOC_ENUM("RX INT7_2 HPF cut off", cf_int7_2_enum), - SOC_ENUM("RX INT8_1 HPF cut off", cf_int8_1_enum), - SOC_ENUM("RX INT8_2 HPF cut off", cf_int8_2_enum), - - SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0, - tasha_get_iir_enable_audio_mixer, tasha_put_iir_enable_audio_mixer), - - SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5, - tasha_get_iir_band_audio_mixer, tasha_put_iir_band_audio_mixer), - - SOC_SINGLE_EXT("COMP1 Switch", SND_SOC_NOPM, COMPANDER_1, 1, 0, - tasha_get_compander, tasha_set_compander), - SOC_SINGLE_EXT("COMP2 Switch", SND_SOC_NOPM, COMPANDER_2, 1, 0, - tasha_get_compander, tasha_set_compander), - SOC_SINGLE_EXT("COMP3 Switch", SND_SOC_NOPM, COMPANDER_3, 1, 0, - tasha_get_compander, tasha_set_compander), - SOC_SINGLE_EXT("COMP4 Switch", SND_SOC_NOPM, COMPANDER_4, 1, 0, - tasha_get_compander, tasha_set_compander), - SOC_SINGLE_EXT("COMP5 Switch", SND_SOC_NOPM, COMPANDER_5, 1, 0, - tasha_get_compander, tasha_set_compander), - SOC_SINGLE_EXT("COMP6 Switch", SND_SOC_NOPM, COMPANDER_6, 1, 0, - tasha_get_compander, tasha_set_compander), - SOC_SINGLE_EXT("COMP7 Switch", SND_SOC_NOPM, COMPANDER_7, 1, 0, - tasha_get_compander, tasha_set_compander), - SOC_SINGLE_EXT("COMP8 Switch", SND_SOC_NOPM, COMPANDER_8, 1, 0, - tasha_get_compander, tasha_set_compander), - - SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, - tasha_rx_hph_mode_get, tasha_rx_hph_mode_put), - - SOC_ENUM_EXT("MAD Input", tasha_conn_mad_enum, - tasha_mad_input_get, tasha_mad_input_put), - SOC_SINGLE_EXT("LDO_H Enable", SND_SOC_NOPM, 0, 1, 0, - tasha_enable_ldo_h_get, tasha_enable_ldo_h_put), - - SOC_SINGLE_EXT("DMIC1_CLK_PIN_MODE", SND_SOC_NOPM, 17, 1, 0, - tasha_pinctl_mode_get, tasha_pinctl_mode_put), - - SOC_SINGLE_EXT("DMIC1_DATA_PIN_MODE", SND_SOC_NOPM, 18, 1, 0, - tasha_pinctl_mode_get, tasha_pinctl_mode_put), - - SOC_SINGLE_EXT("DMIC2_CLK_PIN_MODE", SND_SOC_NOPM, 19, 1, 0, - tasha_pinctl_mode_get, tasha_pinctl_mode_put), - - SOC_SINGLE_EXT("DMIC2_DATA_PIN_MODE", SND_SOC_NOPM, 20, 1, 0, - tasha_pinctl_mode_get, tasha_pinctl_mode_put), - - SOC_SINGLE_EXT("DMIC3_CLK_PIN_MODE", SND_SOC_NOPM, 21, 1, 0, - tasha_pinctl_mode_get, tasha_pinctl_mode_put), - - SOC_SINGLE_EXT("DMIC3_DATA_PIN_MODE", SND_SOC_NOPM, 22, 1, 0, - tasha_pinctl_mode_get, tasha_pinctl_mode_put), - SOC_ENUM_EXT("AMIC_1_2 PWR MODE", amic_pwr_lvl_enum, - tasha_amic_pwr_lvl_get, tasha_amic_pwr_lvl_put), - SOC_ENUM_EXT("AMIC_3_4 PWR MODE", amic_pwr_lvl_enum, - tasha_amic_pwr_lvl_get, tasha_amic_pwr_lvl_put), - SOC_ENUM_EXT("AMIC_5_6 PWR MODE", amic_pwr_lvl_enum, - tasha_amic_pwr_lvl_get, tasha_amic_pwr_lvl_put), - - SOC_SINGLE_MULTI_EXT("Vbat ADC data", SND_SOC_NOPM, 0, 0xFFFF, 0, 2, - tasha_vbat_adc_data_get, NULL), - - SOC_ENUM_EXT("GSM mode Enable", tasha_vbat_gsm_mode_enum, - tasha_vbat_gsm_mode_func_get, - tasha_vbat_gsm_mode_func_put), -}; - -static int tasha_put_dec_enum(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - u16 mic_sel_reg; - u8 mic_sel; - - val = ucontrol->value.enumerated.item[0]; - if (val > e->items - 1) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - switch (e->reg) { - case WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1: - mic_sel_reg = WCD9335_CDC_TX0_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1: - mic_sel_reg = WCD9335_CDC_TX1_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1: - mic_sel_reg = WCD9335_CDC_TX2_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1: - mic_sel_reg = WCD9335_CDC_TX3_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0: - mic_sel_reg = WCD9335_CDC_TX4_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0: - mic_sel_reg = WCD9335_CDC_TX5_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0: - mic_sel_reg = WCD9335_CDC_TX6_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0: - mic_sel_reg = WCD9335_CDC_TX7_TX_PATH_CFG0; - break; - case WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0: - mic_sel_reg = WCD9335_CDC_TX8_TX_PATH_CFG0; - break; - default: - dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n", - __func__, e->reg); - return -EINVAL; - } - - /* ADC: 0, DMIC: 1 */ - mic_sel = val ? 0x0 : 0x1; - snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, mic_sel << 7); - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int tasha_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - unsigned short look_ahead_dly_reg = WCD9335_CDC_RX0_RX_PATH_CFG0; - - val = ucontrol->value.enumerated.item[0]; - if (val >= e->items) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - if (e->reg == WCD9335_CDC_RX0_RX_PATH_SEC0) - look_ahead_dly_reg = WCD9335_CDC_RX0_RX_PATH_CFG0; - else if (e->reg == WCD9335_CDC_RX1_RX_PATH_SEC0) - look_ahead_dly_reg = WCD9335_CDC_RX1_RX_PATH_CFG0; - else if (e->reg == WCD9335_CDC_RX2_RX_PATH_SEC0) - look_ahead_dly_reg = WCD9335_CDC_RX2_RX_PATH_CFG0; - - /* Set Look Ahead Delay */ - snd_soc_update_bits(codec, look_ahead_dly_reg, - 0x08, (val ? 0x08 : 0x00)); - /* Set DEM INP Select */ - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int tasha_ear_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ear_pa_gain = snd_soc_read(codec, WCD9335_ANA_EAR); - - ear_pa_gain = (ear_pa_gain & 0x70) >> 4; - - ucontrol->value.integer.value[0] = ear_pa_gain; - - dev_dbg(codec->dev, "%s: ear_pa_gain = 0x%x\n", __func__, - ear_pa_gain); - - return 0; -} - -static int tasha_ear_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - ear_pa_gain = ucontrol->value.integer.value[0] << 4; - - snd_soc_update_bits(codec, WCD9335_ANA_EAR, 0x70, ear_pa_gain); - return 0; -} - -static int tasha_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tasha->ear_spkr_gain; - - dev_dbg(codec->dev, "%s: ear_spkr_gain = %ld\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int tasha_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - tasha->ear_spkr_gain = ucontrol->value.integer.value[0]; - - return 0; -} - -static int tasha_spkr_left_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, WCD9335_CDC_BOOST0_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int tasha_spkr_left_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, WCD9335_CDC_BOOST0_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int tasha_spkr_right_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, WCD9335_CDC_BOOST1_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int tasha_spkr_right_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, WCD9335_CDC_BOOST1_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int tasha_config_compander(struct snd_soc_codec *codec, int interp_n, - int event) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int comp; - u16 comp_ctl0_reg, rx_path_cfg0_reg; - - /* EAR does not have compander */ - if (!interp_n) - return 0; - - comp = interp_n - 1; - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, tasha->comp_enabled[comp]); - - if (!tasha->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = WCD9335_CDC_COMPANDER1_CTL0 + (comp * 8); - rx_path_cfg0_reg = WCD9335_CDC_RX1_RX_PATH_CFG0 + (comp * 20); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -static int tasha_codec_config_mad(struct snd_soc_codec *codec) -{ - int ret = 0; - int idx; - const struct firmware *fw; - struct firmware_cal *hwdep_cal = NULL; - struct wcd_mad_audio_cal *mad_cal = NULL; - const void *data; - const char *filename = TASHA_MAD_AUDIO_FIRMWARE_PATH; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - size_t cal_size; - - hwdep_cal = wcdcal_get_fw_cal(tasha->fw_data, WCD9XXX_MAD_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration\n", - __func__); - } else { - ret = request_firmware(&fw, filename, codec->dev); - if (ret || !fw) { - dev_err(codec->dev, - "%s: MAD firmware acquire failed, err = %d\n", - __func__, ret); - return -ENODEV; - } - data = fw->data; - cal_size = fw->size; - dev_dbg(codec->dev, "%s: using request_firmware calibration\n", - __func__); - } - - if (cal_size < sizeof(*mad_cal)) { - dev_err(codec->dev, - "%s: Incorrect size %zd for MAD Cal, expected %zd\n", - __func__, cal_size, sizeof(*mad_cal)); - ret = -ENOMEM; - goto done; - } - - mad_cal = (struct wcd_mad_audio_cal *) (data); - if (!mad_cal) { - dev_err(codec->dev, - "%s: Invalid calibration data\n", - __func__); - ret = -EINVAL; - goto done; - } - - snd_soc_write(codec, WCD9335_SOC_MAD_MAIN_CTL_2, - mad_cal->microphone_info.cycle_time); - snd_soc_update_bits(codec, WCD9335_SOC_MAD_MAIN_CTL_1, 0xFF << 3, - ((uint16_t)mad_cal->microphone_info.settle_time) - << 3); - - /* Audio */ - snd_soc_write(codec, WCD9335_SOC_MAD_AUDIO_CTL_8, - mad_cal->audio_info.rms_omit_samples); - snd_soc_update_bits(codec, WCD9335_SOC_MAD_AUDIO_CTL_1, - 0x07 << 4, mad_cal->audio_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD9335_SOC_MAD_AUDIO_CTL_2, 0x03 << 2, - mad_cal->audio_info.detection_mechanism << 2); - snd_soc_write(codec, WCD9335_SOC_MAD_AUDIO_CTL_7, - mad_cal->audio_info.rms_diff_threshold & 0x3F); - snd_soc_write(codec, WCD9335_SOC_MAD_AUDIO_CTL_5, - mad_cal->audio_info.rms_threshold_lsb); - snd_soc_write(codec, WCD9335_SOC_MAD_AUDIO_CTL_6, - mad_cal->audio_info.rms_threshold_msb); - - for (idx = 0; idx < ARRAY_SIZE(mad_cal->audio_info.iir_coefficients); - idx++) { - snd_soc_update_bits(codec, WCD9335_SOC_MAD_AUDIO_IIR_CTL_PTR, - 0x3F, idx); - snd_soc_write(codec, WCD9335_SOC_MAD_AUDIO_IIR_CTL_VAL, - mad_cal->audio_info.iir_coefficients[idx]); - dev_dbg(codec->dev, "%s:MAD Audio IIR Coef[%d] = 0X%x", - __func__, idx, - mad_cal->audio_info.iir_coefficients[idx]); - } - - /* Beacon */ - snd_soc_write(codec, WCD9335_SOC_MAD_BEACON_CTL_8, - mad_cal->beacon_info.rms_omit_samples); - snd_soc_update_bits(codec, WCD9335_SOC_MAD_BEACON_CTL_1, - 0x07 << 4, mad_cal->beacon_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD9335_SOC_MAD_BEACON_CTL_2, 0x03 << 2, - mad_cal->beacon_info.detection_mechanism << 2); - snd_soc_write(codec, WCD9335_SOC_MAD_BEACON_CTL_7, - mad_cal->beacon_info.rms_diff_threshold & 0x1F); - snd_soc_write(codec, WCD9335_SOC_MAD_BEACON_CTL_5, - mad_cal->beacon_info.rms_threshold_lsb); - snd_soc_write(codec, WCD9335_SOC_MAD_BEACON_CTL_6, - mad_cal->beacon_info.rms_threshold_msb); - - for (idx = 0; idx < ARRAY_SIZE(mad_cal->beacon_info.iir_coefficients); - idx++) { - snd_soc_update_bits(codec, WCD9335_SOC_MAD_BEACON_IIR_CTL_PTR, - 0x3F, idx); - snd_soc_write(codec, WCD9335_SOC_MAD_BEACON_IIR_CTL_VAL, - mad_cal->beacon_info.iir_coefficients[idx]); - dev_dbg(codec->dev, "%s:MAD Beacon IIR Coef[%d] = 0X%x", - __func__, idx, - mad_cal->beacon_info.iir_coefficients[idx]); - } - - /* Ultrasound */ - snd_soc_update_bits(codec, WCD9335_SOC_MAD_ULTR_CTL_1, - 0x07 << 4, - mad_cal->ultrasound_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD9335_SOC_MAD_ULTR_CTL_2, 0x03 << 2, - mad_cal->ultrasound_info.detection_mechanism << 2); - snd_soc_write(codec, WCD9335_SOC_MAD_ULTR_CTL_7, - mad_cal->ultrasound_info.rms_diff_threshold & 0x1F); - snd_soc_write(codec, WCD9335_SOC_MAD_ULTR_CTL_5, - mad_cal->ultrasound_info.rms_threshold_lsb); - snd_soc_write(codec, WCD9335_SOC_MAD_ULTR_CTL_6, - mad_cal->ultrasound_info.rms_threshold_msb); - -done: - if (!hwdep_cal) - release_firmware(fw); - - return ret; -} - -static int tasha_codec_enable_mad(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - - dev_dbg(codec->dev, - "%s: event = %d\n", __func__, event); - - /* Return if CPE INPUT is DEC1 */ - if (snd_soc_read(codec, WCD9335_CPE_SS_SVA_CFG) & 0x01) - return ret; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - - /* Turn on MAD clk */ - snd_soc_update_bits(codec, WCD9335_CPE_SS_MAD_CTL, - 0x01, 0x01); - - /* Undo reset for MAD */ - snd_soc_update_bits(codec, WCD9335_CPE_SS_MAD_CTL, - 0x02, 0x00); - ret = tasha_codec_config_mad(codec); - if (ret) - dev_err(codec->dev, - "%s: Failed to config MAD, err = %d\n", - __func__, ret); - break; - case SND_SOC_DAPM_POST_PMD: - /* Reset the MAD block */ - snd_soc_update_bits(codec, WCD9335_CPE_SS_MAD_CTL, - 0x02, 0x02); - /* Turn off MAD clk */ - snd_soc_update_bits(codec, WCD9335_CPE_SS_MAD_CTL, - 0x01, 0x00); - break; - } - - return ret; -} - -static int tasha_codec_configure_cpe_input(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, - "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Configure CPE input as DEC1 */ - snd_soc_update_bits(codec, WCD9335_CPE_SS_SVA_CFG, - 0x01, 0x01); - - /* Configure DEC1 Tx out with sample rate as 16K */ - snd_soc_update_bits(codec, WCD9335_CDC_TX1_TX_PATH_CTL, - 0x0F, 0x01); - - break; - case SND_SOC_DAPM_POST_PMD: - /* Reset DEC1 Tx out sample rate */ - snd_soc_update_bits(codec, WCD9335_CDC_TX1_TX_PATH_CTL, - 0x0F, 0x04); - snd_soc_update_bits(codec, WCD9335_CPE_SS_SVA_CFG, - 0x01, 0x00); - - break; - } - - return 0; -} - - -static int tasha_codec_aif4_mixer_switch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - - if (test_bit(AIF4_SWITCH_VALUE, &tasha_p->status_mask)) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - dev_dbg(codec->dev, "%s: AIF4 switch value = %ld\n", - __func__, ucontrol->value.integer.value[0]); - return 0; -} - -static int tasha_codec_aif4_mixer_switch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: AIF4 switch value = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - if (ucontrol->value.integer.value[0]) { - snd_soc_dapm_mixer_update_power(widget->dapm, - kcontrol, 1, update); - set_bit(AIF4_SWITCH_VALUE, &tasha_p->status_mask); - } else { - snd_soc_dapm_mixer_update_power(widget->dapm, - kcontrol, 0, update); - clear_bit(AIF4_SWITCH_VALUE, &tasha_p->status_mask); - } - - return 1; -} - -static const char * const tasha_ear_pa_gain_text[] = { - "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", - "G_0_DB", "G_M2P5_DB", "UNDEFINED", "G_M12_DB" -}; - -static const char * const tasha_ear_spkr_pa_gain_text[] = { - "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", "G_4_DB", - "G_5_DB", "G_6_DB" -}; - -static const char * const tasha_speaker_boost_stage_text[] = { - "NO_MAX_STATE", "MAX_STATE_1", "MAX_STATE_2" -}; - -static const struct soc_enum tasha_ear_pa_gain_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tasha_ear_pa_gain_text), - tasha_ear_pa_gain_text); - -static const struct soc_enum tasha_ear_spkr_pa_gain_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tasha_ear_spkr_pa_gain_text), - tasha_ear_spkr_pa_gain_text); - -static const struct soc_enum tasha_spkr_boost_stage_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tasha_speaker_boost_stage_text), - tasha_speaker_boost_stage_text); - -static const struct snd_kcontrol_new tasha_analog_gain_controls[] = { - SOC_ENUM_EXT("EAR PA Gain", tasha_ear_pa_gain_enum, - tasha_ear_pa_gain_get, tasha_ear_pa_gain_put), - - SOC_SINGLE_TLV("HPHL Volume", WCD9335_HPH_L_EN, 0, 20, 1, - line_gain), - SOC_SINGLE_TLV("HPHR Volume", WCD9335_HPH_R_EN, 0, 20, 1, - line_gain), - SOC_SINGLE_TLV("LINEOUT1 Volume", WCD9335_DIFF_LO_LO1_COMPANDER, - 3, 16, 1, line_gain), - SOC_SINGLE_TLV("LINEOUT2 Volume", WCD9335_DIFF_LO_LO2_COMPANDER, - 3, 16, 1, line_gain), - SOC_SINGLE_TLV("LINEOUT3 Volume", WCD9335_SE_LO_LO3_GAIN, 0, 20, 1, - line_gain), - SOC_SINGLE_TLV("LINEOUT4 Volume", WCD9335_SE_LO_LO4_GAIN, 0, 20, 1, - line_gain), - - SOC_SINGLE_TLV("ADC1 Volume", WCD9335_ANA_AMIC1, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC2 Volume", WCD9335_ANA_AMIC2, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC3 Volume", WCD9335_ANA_AMIC3, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC4 Volume", WCD9335_ANA_AMIC4, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC5 Volume", WCD9335_ANA_AMIC5, 0, 20, 0, - analog_gain), - SOC_SINGLE_TLV("ADC6 Volume", WCD9335_ANA_AMIC6, 0, 20, 0, - analog_gain), -}; - -static const struct snd_kcontrol_new tasha_spkr_wsa_controls[] = { - SOC_ENUM_EXT("EAR SPKR PA Gain", tasha_ear_spkr_pa_gain_enum, - tasha_ear_spkr_pa_gain_get, tasha_ear_spkr_pa_gain_put), - - SOC_ENUM_EXT("SPKR Left Boost Max State", tasha_spkr_boost_stage_enum, - tasha_spkr_left_boost_stage_get, - tasha_spkr_left_boost_stage_put), - - SOC_ENUM_EXT("SPKR Right Boost Max State", tasha_spkr_boost_stage_enum, - tasha_spkr_right_boost_stage_get, - tasha_spkr_right_boost_stage_put), -}; - -static const char * const spl_src0_mux_text[] = { - "ZERO", "SRC_IN_HPHL", "SRC_IN_LO1", -}; - -static const char * const spl_src1_mux_text[] = { - "ZERO", "SRC_IN_HPHR", "SRC_IN_LO2", -}; - -static const char * const spl_src2_mux_text[] = { - "ZERO", "SRC_IN_LO3", "SRC_IN_SPKRL", -}; - -static const char * const spl_src3_mux_text[] = { - "ZERO", "SRC_IN_LO4", "SRC_IN_SPKRR", -}; - -static const char * const rx_int0_7_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", - "RX6", "RX7", "PROXIMITY" -}; - -static const char * const rx_int_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", - "RX6", "RX7" -}; - -static const char * const rx_prim_mix_text[] = { - "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2", - "RX3", "RX4", "RX5", "RX6", "RX7" -}; - -static const char * const rx_sidetone_mix_text[] = { - "ZERO", "SRC0", "SRC1", "SRC_SUM" -}; - -static const char * const sb_tx0_mux_text[] = { - "ZERO", "RX_MIX_TX0", "DEC0", "DEC0_192" -}; - -static const char * const sb_tx1_mux_text[] = { - "ZERO", "RX_MIX_TX1", "DEC1", "DEC1_192" -}; - -static const char * const sb_tx2_mux_text[] = { - "ZERO", "RX_MIX_TX2", "DEC2", "DEC2_192" -}; - -static const char * const sb_tx3_mux_text[] = { - "ZERO", "RX_MIX_TX3", "DEC3", "DEC3_192" -}; - -static const char * const sb_tx4_mux_text[] = { - "ZERO", "RX_MIX_TX4", "DEC4", "DEC4_192" -}; - -static const char * const sb_tx5_mux_text[] = { - "ZERO", "RX_MIX_TX5", "DEC5", "DEC5_192" -}; - -static const char * const sb_tx6_mux_text[] = { - "ZERO", "RX_MIX_TX6", "DEC6", "DEC6_192" -}; - -static const char * const sb_tx7_mux_text[] = { - "ZERO", "RX_MIX_TX7", "DEC7", "DEC7_192" -}; - -static const char * const sb_tx8_mux_text[] = { - "ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192" -}; - -static const char * const sb_tx9_mux_text[] = { - "ZERO", "DEC7", "DEC7_192" -}; - -static const char * const sb_tx10_mux_text[] = { - "ZERO", "DEC6", "DEC6_192" -}; - -static const char * const sb_tx11_mux_text[] = { - "DEC_0_5", "DEC_9_12", "MAD_AUDIO", "MAD_BRDCST" -}; - -static const char * const sb_tx11_inp1_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4", - "DEC5", "RX_MIX_TX5", "DEC9_10", "DEC11_12" -}; - -static const char * const sb_tx13_mux_text[] = { - "ZERO", "DEC5", "DEC5_192" -}; - -static const char * const tx13_inp_mux_text[] = { - "CDC_DEC_5", "MAD_BRDCST", "CPE_TX_PP" -}; - -static const char * const iir_inp_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4", "DEC5", "DEC6", - "DEC7", "DEC8", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", "RX6", "RX7" -}; - -static const char * const rx_int_dem_inp_mux_text[] = { - "NORMAL_DSM_OUT", "CLSH_DSM_OUT", -}; - -static const char * const rx_int0_interp_mux_text[] = { - "ZERO", "RX INT0 MIX2", -}; - -static const char * const rx_int1_interp_mux_text[] = { - "ZERO", "RX INT1 MIX2", -}; - -static const char * const rx_int2_interp_mux_text[] = { - "ZERO", "RX INT2 MIX2", -}; - -static const char * const rx_int3_interp_mux_text[] = { - "ZERO", "RX INT3 MIX2", -}; - -static const char * const rx_int4_interp_mux_text[] = { - "ZERO", "RX INT4 MIX2", -}; - -static const char * const rx_int5_interp_mux_text[] = { - "ZERO", "RX INT5 MIX2", -}; - -static const char * const rx_int6_interp_mux_text[] = { - "ZERO", "RX INT6 MIX2", -}; - -static const char * const rx_int7_interp_mux_text[] = { - "ZERO", "RX INT7 MIX2", -}; - -static const char * const rx_int8_interp_mux_text[] = { - "ZERO", "RX INT8 SEC MIX" -}; - -static const char * const mad_sel_text[] = { - "SPE", "MSM" -}; - -static const char * const adc_mux_text[] = { - "DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2" -}; - -static const char * const dmic_mux_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5", - "SMIC0", "SMIC1", "SMIC2", "SMIC3" -}; - -static const char * const dmic_mux_alt_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5", -}; - -static const char * const amic_mux_text[] = { - "ZERO", "ADC1", "ADC2", "ADC3", "ADC4", "ADC5", "ADC6" -}; - -static const char * const rx_echo_mux_text[] = { - "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2", "RX_MIX3", "RX_MIX4", - "RX_MIX5", "RX_MIX6", "RX_MIX7", "RX_MIX8", "RX_MIX_VBAT5", - "RX_MIX_VBAT6", "RX_MIX_VBAT7", "RX_MIX_VBAT8" -}; - -static const char * const anc0_fb_mux_text[] = { - "ZERO", "ANC_IN_HPHL", "ANC_IN_EAR", "ANC_IN_EAR_SPKR", - "ANC_IN_LO1" -}; - -static const char * const anc1_fb_mux_text[] = { - "ZERO", "ANC_IN_HPHR", "ANC_IN_LO2" -}; - -static const char * const native_mux_text[] = { - "OFF", "ON", -}; - -static const struct soc_enum spl_src0_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0, 0, 3, - spl_src0_mux_text); - -static const struct soc_enum spl_src1_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0, 2, 3, - spl_src1_mux_text); - -static const struct soc_enum spl_src2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0, 4, 3, - spl_src2_mux_text); - -static const struct soc_enum spl_src3_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0, 6, 3, - spl_src3_mux_text); - -static const struct soc_enum rx_int0_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, 10, - rx_int0_7_mix_mux_text); - -static const struct soc_enum rx_int1_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, 9, - rx_int_mix_mux_text); - -static const struct soc_enum rx_int2_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, 9, - rx_int_mix_mux_text); - -static const struct soc_enum rx_int3_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1, 0, 9, - rx_int_mix_mux_text); - -static const struct soc_enum rx_int4_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1, 0, 9, - rx_int_mix_mux_text); - -static const struct soc_enum rx_int5_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1, 0, 9, - rx_int_mix_mux_text); - -static const struct soc_enum rx_int6_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1, 0, 9, - rx_int_mix_mux_text); - -static const struct soc_enum rx_int7_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1, 0, 10, - rx_int0_7_mix_mux_text); - -static const struct soc_enum rx_int8_2_mux_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1, 0, 9, - rx_int_mix_mux_text); - -static const struct soc_enum int1_1_native_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(native_mux_text), - native_mux_text); - -static const struct soc_enum int2_1_native_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(native_mux_text), - native_mux_text); - -static const struct soc_enum int3_1_native_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(native_mux_text), - native_mux_text); - -static const struct soc_enum int4_1_native_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(native_mux_text), - native_mux_text); - -static const struct soc_enum rx_int0_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int0_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int0_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int1_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int1_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int1_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int2_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int2_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int2_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int3_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int3_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int3_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int4_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int4_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int4_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int5_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int5_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int5_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int6_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int6_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int6_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int7_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int7_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int7_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int8_1_mix_inp0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0, 0, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int8_1_mix_inp1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int8_1_mix_inp2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1, 4, 13, - rx_prim_mix_text); - -static const struct soc_enum rx_int0_sidetone_mix_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0, 4, - rx_sidetone_mix_text); - -static const struct soc_enum rx_int1_sidetone_mix_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2, 4, - rx_sidetone_mix_text); - -static const struct soc_enum rx_int2_sidetone_mix_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4, 4, - rx_sidetone_mix_text); - -static const struct soc_enum rx_int3_sidetone_mix_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6, 4, - rx_sidetone_mix_text); - -static const struct soc_enum rx_int4_sidetone_mix_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 0, 4, - rx_sidetone_mix_text); - -static const struct soc_enum rx_int7_sidetone_mix_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 2, 4, - rx_sidetone_mix_text); - -static const struct soc_enum tx_adc_mux0_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux1_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux2_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux3_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux4_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux5_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux6_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux7_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux8_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux10_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux11_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux12_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_adc_mux13_chain_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 6, 4, - adc_mux_text); - -static const struct soc_enum tx_dmic_mux0_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 3, 11, - dmic_mux_text); - -static const struct soc_enum tx_dmic_mux1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 3, 11, - dmic_mux_text); - -static const struct soc_enum tx_dmic_mux2_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 3, 11, - dmic_mux_text); - -static const struct soc_enum tx_dmic_mux3_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 3, 11, - dmic_mux_text); - -static const struct soc_enum tx_dmic_mux4_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux5_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux6_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux7_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux8_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux10_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux11_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux12_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_dmic_mux13_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 3, 7, - dmic_mux_alt_text); - -static const struct soc_enum tx_amic_mux0_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux1_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux2_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux3_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux4_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux5_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux6_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux7_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux8_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux10_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux11_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux12_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum tx_amic_mux13_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 0, 7, - amic_mux_text); - -static const struct soc_enum sb_tx0_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 0, 4, - sb_tx0_mux_text); - -static const struct soc_enum sb_tx1_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 2, 4, - sb_tx1_mux_text); - -static const struct soc_enum sb_tx2_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 4, 4, - sb_tx2_mux_text); - -static const struct soc_enum sb_tx3_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 6, 4, - sb_tx3_mux_text); - -static const struct soc_enum sb_tx4_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 0, 4, - sb_tx4_mux_text); - -static const struct soc_enum sb_tx5_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 2, 4, - sb_tx5_mux_text); - -static const struct soc_enum sb_tx6_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 4, 4, - sb_tx6_mux_text); - -static const struct soc_enum sb_tx7_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 6, 4, - sb_tx7_mux_text); - -static const struct soc_enum sb_tx8_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2, 0, 4, - sb_tx8_mux_text); - -static const struct soc_enum sb_tx9_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2, 2, 3, - sb_tx9_mux_text); - -static const struct soc_enum sb_tx10_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2, 4, 3, - sb_tx10_mux_text); - -static const struct soc_enum sb_tx11_mux_enum = - SOC_ENUM_SINGLE(WCD9335_DATA_HUB_DATA_HUB_SB_TX11_INP_CFG, 0, 4, - sb_tx11_mux_text); - -static const struct soc_enum sb_tx11_inp1_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3, 0, 10, - sb_tx11_inp1_mux_text); - -static const struct soc_enum sb_tx13_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3, 4, 3, - sb_tx13_mux_text); - -static const struct soc_enum tx13_inp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_DATA_HUB_DATA_HUB_SB_TX13_INP_CFG, 0, 3, - tx13_inp_mux_text); - -static const struct soc_enum rx_mix_tx0_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG0, 0, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx1_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG0, 4, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx2_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG1, 0, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx3_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG1, 4, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx4_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG2, 0, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx5_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG2, 4, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx6_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG3, 0, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx7_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG3, 4, 14, - rx_echo_mux_text); - -static const struct soc_enum rx_mix_tx8_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG4, 0, 14, - rx_echo_mux_text); - -static const struct soc_enum iir0_inp0_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum iir0_inp1_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum iir0_inp2_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum iir0_inp3_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum iir1_inp0_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum iir1_inp1_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum iir1_inp2_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum iir1_inp3_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3, 0, 18, - iir_inp_mux_text); - -static const struct soc_enum rx_int0_dem_inp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_SEC0, 0, - ARRAY_SIZE(rx_int_dem_inp_mux_text), - rx_int_dem_inp_mux_text); - -static const struct soc_enum rx_int1_dem_inp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_SEC0, 0, - ARRAY_SIZE(rx_int_dem_inp_mux_text), - rx_int_dem_inp_mux_text); - -static const struct soc_enum rx_int2_dem_inp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_SEC0, 0, - ARRAY_SIZE(rx_int_dem_inp_mux_text), - rx_int_dem_inp_mux_text); - -static const struct soc_enum rx_int0_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_CTL, 5, 2, - rx_int0_interp_mux_text); - -static const struct soc_enum rx_int1_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_CTL, 5, 2, - rx_int1_interp_mux_text); - -static const struct soc_enum rx_int2_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_CTL, 5, 2, - rx_int2_interp_mux_text); - -static const struct soc_enum rx_int3_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX3_RX_PATH_CTL, 5, 2, - rx_int3_interp_mux_text); - -static const struct soc_enum rx_int4_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX4_RX_PATH_CTL, 5, 2, - rx_int4_interp_mux_text); - -static const struct soc_enum rx_int5_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX5_RX_PATH_CTL, 5, 2, - rx_int5_interp_mux_text); - -static const struct soc_enum rx_int6_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX6_RX_PATH_CTL, 5, 2, - rx_int6_interp_mux_text); - -static const struct soc_enum rx_int7_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX7_RX_PATH_CTL, 5, 2, - rx_int7_interp_mux_text); - -static const struct soc_enum rx_int8_interp_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX8_RX_PATH_CTL, 5, 2, - rx_int8_interp_mux_text); - -static const struct soc_enum mad_sel_enum = - SOC_ENUM_SINGLE(WCD9335_CPE_SS_CFG, 0, 2, mad_sel_text); - -static const struct soc_enum anc0_fb_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_ANC_CFG0, 0, 5, - anc0_fb_mux_text); - -static const struct soc_enum anc1_fb_mux_enum = - SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_ANC_CFG0, 3, 3, - anc1_fb_mux_text); - -static const struct snd_kcontrol_new rx_int0_dem_inp_mux = - SOC_DAPM_ENUM_EXT("RX INT0 DEM MUX Mux", rx_int0_dem_inp_mux_enum, - snd_soc_dapm_get_enum_double, - tasha_int_dem_inp_mux_put); - -static const struct snd_kcontrol_new rx_int1_dem_inp_mux = - SOC_DAPM_ENUM_EXT("RX INT1 DEM MUX Mux", rx_int1_dem_inp_mux_enum, - snd_soc_dapm_get_enum_double, - tasha_int_dem_inp_mux_put); - -static const struct snd_kcontrol_new rx_int2_dem_inp_mux = - SOC_DAPM_ENUM_EXT("RX INT2 DEM MUX Mux", rx_int2_dem_inp_mux_enum, - snd_soc_dapm_get_enum_double, - tasha_int_dem_inp_mux_put); - -static const struct snd_kcontrol_new spl_src0_mux = - SOC_DAPM_ENUM("SPL SRC0 MUX Mux", spl_src0_mux_chain_enum); - -static const struct snd_kcontrol_new spl_src1_mux = - SOC_DAPM_ENUM("SPL SRC1 MUX Mux", spl_src1_mux_chain_enum); - -static const struct snd_kcontrol_new spl_src2_mux = - SOC_DAPM_ENUM("SPL SRC2 MUX Mux", spl_src2_mux_chain_enum); - -static const struct snd_kcontrol_new spl_src3_mux = - SOC_DAPM_ENUM("SPL SRC3 MUX Mux", spl_src3_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int0_2_mux = - SOC_DAPM_ENUM("RX INT0_2 MUX Mux", rx_int0_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int1_2_mux = - SOC_DAPM_ENUM("RX INT1_2 MUX Mux", rx_int1_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int2_2_mux = - SOC_DAPM_ENUM("RX INT2_2 MUX Mux", rx_int2_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int3_2_mux = - SOC_DAPM_ENUM("RX INT3_2 MUX Mux", rx_int3_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int4_2_mux = - SOC_DAPM_ENUM("RX INT4_2 MUX Mux", rx_int4_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int5_2_mux = - SOC_DAPM_ENUM("RX INT5_2 MUX Mux", rx_int5_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int6_2_mux = - SOC_DAPM_ENUM("RX INT6_2 MUX Mux", rx_int6_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int7_2_mux = - SOC_DAPM_ENUM("RX INT7_2 MUX Mux", rx_int7_2_mux_chain_enum); - -static const struct snd_kcontrol_new rx_int8_2_mux = - SOC_DAPM_ENUM("RX INT8_2 MUX Mux", rx_int8_2_mux_chain_enum); - -static const struct snd_kcontrol_new int1_1_native_mux = - SOC_DAPM_ENUM("RX INT1_1 NATIVE MUX Mux", int1_1_native_enum); - -static const struct snd_kcontrol_new int2_1_native_mux = - SOC_DAPM_ENUM("RX INT2_1 NATIVE MUX Mux", int2_1_native_enum); - -static const struct snd_kcontrol_new int3_1_native_mux = - SOC_DAPM_ENUM("RX INT3_1 NATIVE MUX Mux", int3_1_native_enum); - -static const struct snd_kcontrol_new int4_1_native_mux = - SOC_DAPM_ENUM("RX INT4_1 NATIVE MUX Mux", int4_1_native_enum); - -static const struct snd_kcontrol_new rx_int0_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT0_1 MIX1 INP0 Mux", rx_int0_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int0_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT0_1 MIX1 INP1 Mux", rx_int0_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int0_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT0_1 MIX1 INP2 Mux", rx_int0_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int1_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT1_1 MIX1 INP0 Mux", rx_int1_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int1_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT1_1 MIX1 INP1 Mux", rx_int1_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int1_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT1_1 MIX1 INP2 Mux", rx_int1_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int2_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT2_1 MIX1 INP0 Mux", rx_int2_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int2_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT2_1 MIX1 INP1 Mux", rx_int2_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int2_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT2_1 MIX1 INP2 Mux", rx_int2_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int3_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT3_1 MIX1 INP0 Mux", rx_int3_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int3_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT3_1 MIX1 INP1 Mux", rx_int3_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int3_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT3_1 MIX1 INP2 Mux", rx_int3_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int4_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT4_1 MIX1 INP0 Mux", rx_int4_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int4_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT4_1 MIX1 INP1 Mux", rx_int4_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int4_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT4_1 MIX1 INP2 Mux", rx_int4_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int5_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT5_1 MIX1 INP0 Mux", rx_int5_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int5_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT5_1 MIX1 INP1 Mux", rx_int5_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int5_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT5_1 MIX1 INP2 Mux", rx_int5_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int6_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT6_1 MIX1 INP0 Mux", rx_int6_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int6_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT6_1 MIX1 INP1 Mux", rx_int6_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int6_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT6_1 MIX1 INP2 Mux", rx_int6_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int7_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT7_1 MIX1 INP0 Mux", rx_int7_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int7_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT7_1 MIX1 INP1 Mux", rx_int7_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int7_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT7_1 MIX1 INP2 Mux", rx_int7_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int8_1_mix_inp0_mux = - SOC_DAPM_ENUM("RX INT8_1 MIX1 INP0 Mux", rx_int8_1_mix_inp0_chain_enum); - -static const struct snd_kcontrol_new rx_int8_1_mix_inp1_mux = - SOC_DAPM_ENUM("RX INT8_1 MIX1 INP1 Mux", rx_int8_1_mix_inp1_chain_enum); - -static const struct snd_kcontrol_new rx_int8_1_mix_inp2_mux = - SOC_DAPM_ENUM("RX INT8_1 MIX1 INP2 Mux", rx_int8_1_mix_inp2_chain_enum); - -static const struct snd_kcontrol_new rx_int0_mix2_inp_mux = - SOC_DAPM_ENUM("RX INT0 MIX2 INP Mux", rx_int0_sidetone_mix_chain_enum); - -static const struct snd_kcontrol_new rx_int1_mix2_inp_mux = - SOC_DAPM_ENUM("RX INT1 MIX2 INP Mux", rx_int1_sidetone_mix_chain_enum); - -static const struct snd_kcontrol_new rx_int2_mix2_inp_mux = - SOC_DAPM_ENUM("RX INT2 MIX2 INP Mux", rx_int2_sidetone_mix_chain_enum); - -static const struct snd_kcontrol_new rx_int3_mix2_inp_mux = - SOC_DAPM_ENUM("RX INT3 MIX2 INP Mux", rx_int3_sidetone_mix_chain_enum); - -static const struct snd_kcontrol_new rx_int4_mix2_inp_mux = - SOC_DAPM_ENUM("RX INT4 MIX2 INP Mux", rx_int4_sidetone_mix_chain_enum); - -static const struct snd_kcontrol_new rx_int7_mix2_inp_mux = - SOC_DAPM_ENUM("RX INT7 MIX2 INP Mux", rx_int7_sidetone_mix_chain_enum); - -static const struct snd_kcontrol_new tx_adc_mux0 = - SOC_DAPM_ENUM_EXT("ADC MUX0 Mux", tx_adc_mux0_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux1 = - SOC_DAPM_ENUM_EXT("ADC MUX1 Mux", tx_adc_mux1_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux2 = - SOC_DAPM_ENUM_EXT("ADC MUX2 Mux", tx_adc_mux2_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux3 = - SOC_DAPM_ENUM_EXT("ADC MUX3 Mux", tx_adc_mux3_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux4 = - SOC_DAPM_ENUM_EXT("ADC MUX4 Mux", tx_adc_mux4_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux5 = - SOC_DAPM_ENUM_EXT("ADC MUX5 Mux", tx_adc_mux5_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux6 = - SOC_DAPM_ENUM_EXT("ADC MUX6 Mux", tx_adc_mux6_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux7 = - SOC_DAPM_ENUM_EXT("ADC MUX7 Mux", tx_adc_mux7_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux8 = - SOC_DAPM_ENUM_EXT("ADC MUX8 Mux", tx_adc_mux8_chain_enum, - snd_soc_dapm_get_enum_double, - tasha_put_dec_enum); - -static const struct snd_kcontrol_new tx_adc_mux10 = - SOC_DAPM_ENUM("ADC MUX10 Mux", tx_adc_mux10_chain_enum); - -static const struct snd_kcontrol_new tx_adc_mux11 = - SOC_DAPM_ENUM("ADC MUX11 Mux", tx_adc_mux11_chain_enum); - -static const struct snd_kcontrol_new tx_adc_mux12 = - SOC_DAPM_ENUM("ADC MUX12 Mux", tx_adc_mux12_chain_enum); - -static const struct snd_kcontrol_new tx_adc_mux13 = - SOC_DAPM_ENUM("ADC MUX13 Mux", tx_adc_mux13_chain_enum); - -static const struct snd_kcontrol_new tx_dmic_mux0 = - SOC_DAPM_ENUM("DMIC MUX0 Mux", tx_dmic_mux0_enum); - -static const struct snd_kcontrol_new tx_dmic_mux1 = - SOC_DAPM_ENUM("DMIC MUX1 Mux", tx_dmic_mux1_enum); - -static const struct snd_kcontrol_new tx_dmic_mux2 = - SOC_DAPM_ENUM("DMIC MUX2 Mux", tx_dmic_mux2_enum); - -static const struct snd_kcontrol_new tx_dmic_mux3 = - SOC_DAPM_ENUM("DMIC MUX3 Mux", tx_dmic_mux3_enum); - -static const struct snd_kcontrol_new tx_dmic_mux4 = - SOC_DAPM_ENUM("DMIC MUX4 Mux", tx_dmic_mux4_enum); - -static const struct snd_kcontrol_new tx_dmic_mux5 = - SOC_DAPM_ENUM("DMIC MUX5 Mux", tx_dmic_mux5_enum); - -static const struct snd_kcontrol_new tx_dmic_mux6 = - SOC_DAPM_ENUM("DMIC MUX6 Mux", tx_dmic_mux6_enum); - -static const struct snd_kcontrol_new tx_dmic_mux7 = - SOC_DAPM_ENUM("DMIC MUX7 Mux", tx_dmic_mux7_enum); - -static const struct snd_kcontrol_new tx_dmic_mux8 = - SOC_DAPM_ENUM("DMIC MUX8 Mux", tx_dmic_mux8_enum); - -static const struct snd_kcontrol_new tx_dmic_mux10 = - SOC_DAPM_ENUM("DMIC MUX10 Mux", tx_dmic_mux10_enum); - -static const struct snd_kcontrol_new tx_dmic_mux11 = - SOC_DAPM_ENUM("DMIC MUX11 Mux", tx_dmic_mux11_enum); - -static const struct snd_kcontrol_new tx_dmic_mux12 = - SOC_DAPM_ENUM("DMIC MUX12 Mux", tx_dmic_mux12_enum); - -static const struct snd_kcontrol_new tx_dmic_mux13 = - SOC_DAPM_ENUM("DMIC MUX13 Mux", tx_dmic_mux13_enum); - -static const struct snd_kcontrol_new tx_amic_mux0 = - SOC_DAPM_ENUM("AMIC MUX0 Mux", tx_amic_mux0_enum); - -static const struct snd_kcontrol_new tx_amic_mux1 = - SOC_DAPM_ENUM("AMIC MUX1 Mux", tx_amic_mux1_enum); - -static const struct snd_kcontrol_new tx_amic_mux2 = - SOC_DAPM_ENUM("AMIC MUX2 Mux", tx_amic_mux2_enum); - -static const struct snd_kcontrol_new tx_amic_mux3 = - SOC_DAPM_ENUM("AMIC MUX3 Mux", tx_amic_mux3_enum); - -static const struct snd_kcontrol_new tx_amic_mux4 = - SOC_DAPM_ENUM("AMIC MUX4 Mux", tx_amic_mux4_enum); - -static const struct snd_kcontrol_new tx_amic_mux5 = - SOC_DAPM_ENUM("AMIC MUX5 Mux", tx_amic_mux5_enum); - -static const struct snd_kcontrol_new tx_amic_mux6 = - SOC_DAPM_ENUM("AMIC MUX6 Mux", tx_amic_mux6_enum); - -static const struct snd_kcontrol_new tx_amic_mux7 = - SOC_DAPM_ENUM("AMIC MUX7 Mux", tx_amic_mux7_enum); - -static const struct snd_kcontrol_new tx_amic_mux8 = - SOC_DAPM_ENUM("AMIC MUX8 Mux", tx_amic_mux8_enum); - -static const struct snd_kcontrol_new tx_amic_mux10 = - SOC_DAPM_ENUM("AMIC MUX10 Mux", tx_amic_mux10_enum); - -static const struct snd_kcontrol_new tx_amic_mux11 = - SOC_DAPM_ENUM("AMIC MUX11 Mux", tx_amic_mux11_enum); - -static const struct snd_kcontrol_new tx_amic_mux12 = - SOC_DAPM_ENUM("AMIC MUX12 Mux", tx_amic_mux12_enum); - -static const struct snd_kcontrol_new tx_amic_mux13 = - SOC_DAPM_ENUM("AMIC MUX13 Mux", tx_amic_mux13_enum); - -static const struct snd_kcontrol_new sb_tx0_mux = - SOC_DAPM_ENUM("SLIM TX0 MUX Mux", sb_tx0_mux_enum); - -static const struct snd_kcontrol_new sb_tx1_mux = - SOC_DAPM_ENUM("SLIM TX1 MUX Mux", sb_tx1_mux_enum); - -static const struct snd_kcontrol_new sb_tx2_mux = - SOC_DAPM_ENUM("SLIM TX2 MUX Mux", sb_tx2_mux_enum); - -static const struct snd_kcontrol_new sb_tx3_mux = - SOC_DAPM_ENUM("SLIM TX3 MUX Mux", sb_tx3_mux_enum); - -static const struct snd_kcontrol_new sb_tx4_mux = - SOC_DAPM_ENUM("SLIM TX4 MUX Mux", sb_tx4_mux_enum); - -static const struct snd_kcontrol_new sb_tx5_mux = - SOC_DAPM_ENUM("SLIM TX5 MUX Mux", sb_tx5_mux_enum); - -static const struct snd_kcontrol_new sb_tx6_mux = - SOC_DAPM_ENUM("SLIM TX6 MUX Mux", sb_tx6_mux_enum); - -static const struct snd_kcontrol_new sb_tx7_mux = - SOC_DAPM_ENUM("SLIM TX7 MUX Mux", sb_tx7_mux_enum); - -static const struct snd_kcontrol_new sb_tx8_mux = - SOC_DAPM_ENUM("SLIM TX8 MUX Mux", sb_tx8_mux_enum); - -static const struct snd_kcontrol_new sb_tx9_mux = - SOC_DAPM_ENUM("SLIM TX9 MUX Mux", sb_tx9_mux_enum); - -static const struct snd_kcontrol_new sb_tx10_mux = - SOC_DAPM_ENUM("SLIM TX10 MUX Mux", sb_tx10_mux_enum); - -static const struct snd_kcontrol_new sb_tx11_mux = - SOC_DAPM_ENUM("SLIM TX11 MUX Mux", sb_tx11_mux_enum); - -static const struct snd_kcontrol_new sb_tx11_inp1_mux = - SOC_DAPM_ENUM("SLIM TX11 INP1 MUX Mux", sb_tx11_inp1_mux_enum); - -static const struct snd_kcontrol_new sb_tx13_mux = - SOC_DAPM_ENUM("SLIM TX13 MUX Mux", sb_tx13_mux_enum); - -static const struct snd_kcontrol_new tx13_inp_mux = - SOC_DAPM_ENUM("TX13 INP MUX Mux", tx13_inp_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx0_mux = - SOC_DAPM_ENUM("RX MIX TX0 MUX Mux", rx_mix_tx0_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx1_mux = - SOC_DAPM_ENUM("RX MIX TX1 MUX Mux", rx_mix_tx1_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx2_mux = - SOC_DAPM_ENUM("RX MIX TX2 MUX Mux", rx_mix_tx2_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx3_mux = - SOC_DAPM_ENUM("RX MIX TX3 MUX Mux", rx_mix_tx3_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx4_mux = - SOC_DAPM_ENUM("RX MIX TX4 MUX Mux", rx_mix_tx4_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx5_mux = - SOC_DAPM_ENUM("RX MIX TX5 MUX Mux", rx_mix_tx5_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx6_mux = - SOC_DAPM_ENUM("RX MIX TX6 MUX Mux", rx_mix_tx6_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx7_mux = - SOC_DAPM_ENUM("RX MIX TX7 MUX Mux", rx_mix_tx7_mux_enum); - -static const struct snd_kcontrol_new rx_mix_tx8_mux = - SOC_DAPM_ENUM("RX MIX TX8 MUX Mux", rx_mix_tx8_mux_enum); - -static const struct snd_kcontrol_new iir0_inp0_mux = - SOC_DAPM_ENUM("IIR0 INP0 Mux", iir0_inp0_mux_enum); - -static const struct snd_kcontrol_new iir0_inp1_mux = - SOC_DAPM_ENUM("IIR0 INP1 Mux", iir0_inp1_mux_enum); - -static const struct snd_kcontrol_new iir0_inp2_mux = - SOC_DAPM_ENUM("IIR0 INP2 Mux", iir0_inp2_mux_enum); - -static const struct snd_kcontrol_new iir0_inp3_mux = - SOC_DAPM_ENUM("IIR0 INP3 Mux", iir0_inp3_mux_enum); - -static const struct snd_kcontrol_new iir1_inp0_mux = - SOC_DAPM_ENUM("IIR1 INP0 Mux", iir1_inp0_mux_enum); - -static const struct snd_kcontrol_new iir1_inp1_mux = - SOC_DAPM_ENUM("IIR1 INP1 Mux", iir1_inp1_mux_enum); - -static const struct snd_kcontrol_new iir1_inp2_mux = - SOC_DAPM_ENUM("IIR1 INP2 Mux", iir1_inp2_mux_enum); - -static const struct snd_kcontrol_new iir1_inp3_mux = - SOC_DAPM_ENUM("IIR1 INP3 Mux", iir1_inp3_mux_enum); - -static const struct snd_kcontrol_new rx_int0_interp_mux = - SOC_DAPM_ENUM("RX INT0 INTERP Mux", rx_int0_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int1_interp_mux = - SOC_DAPM_ENUM("RX INT1 INTERP Mux", rx_int1_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int2_interp_mux = - SOC_DAPM_ENUM("RX INT2 INTERP Mux", rx_int2_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int3_interp_mux = - SOC_DAPM_ENUM("RX INT3 INTERP Mux", rx_int3_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int4_interp_mux = - SOC_DAPM_ENUM("RX INT4 INTERP Mux", rx_int4_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int5_interp_mux = - SOC_DAPM_ENUM("RX INT5 INTERP Mux", rx_int5_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int6_interp_mux = - SOC_DAPM_ENUM("RX INT6 INTERP Mux", rx_int6_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int7_interp_mux = - SOC_DAPM_ENUM("RX INT7 INTERP Mux", rx_int7_interp_mux_enum); - -static const struct snd_kcontrol_new rx_int8_interp_mux = - SOC_DAPM_ENUM("RX INT8 INTERP Mux", rx_int8_interp_mux_enum); - -static const struct snd_kcontrol_new mad_sel_mux = - SOC_DAPM_ENUM("MAD_SEL MUX Mux", mad_sel_enum); - -static const struct snd_kcontrol_new aif4_mad_switch = - SOC_DAPM_SINGLE("Switch", WCD9335_CPE_SS_CFG, 5, 1, 0); - -static const struct snd_kcontrol_new mad_brdcst_switch = - SOC_DAPM_SINGLE("Switch", WCD9335_CPE_SS_CFG, 6, 1, 0); - -static const struct snd_kcontrol_new aif4_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, tasha_codec_aif4_mixer_switch_get, - tasha_codec_aif4_mixer_switch_put); - -static const struct snd_kcontrol_new anc_hphl_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_hphr_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_ear_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_ear_spkr_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_lineout1_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_lineout2_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_spkr_pa_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux0_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux1_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux2_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux3_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux4_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux5_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux6_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux7_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux8_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc0_fb_mux = - SOC_DAPM_ENUM("ANC0 FB MUX Mux", anc0_fb_mux_enum); - -static const struct snd_kcontrol_new anc1_fb_mux = - SOC_DAPM_ENUM("ANC1 FB MUX Mux", anc1_fb_mux_enum); - -static int tasha_codec_ec_buf_mux_enable(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event = %d name = %s\n", - __func__, event, w->name); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, WCD9335_CPE_SS_EC_BUF_INT_PERIOD, 0x3B); - snd_soc_update_bits(codec, WCD9335_CPE_SS_CFG, 0x08, 0x08); - snd_soc_update_bits(codec, WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, - 0x08, 0x08); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, - 0x08, 0x00); - snd_soc_update_bits(codec, WCD9335_CPE_SS_CFG, 0x08, 0x00); - snd_soc_write(codec, WCD9335_CPE_SS_EC_BUF_INT_PERIOD, 0x00); - break; - } - - return 0; -}; - -static const char * const ec_buf_mux_text[] = { - "ZERO", "RXMIXEC", "SB_RX0", "SB_RX1", "SB_RX2", "SB_RX3", - "I2S_RX_SD0_L", "I2S_RX_SD0_R", "I2S_RX_SD1_L", "I2S_RX_SD1_R", - "DEC1" -}; - -static SOC_ENUM_SINGLE_DECL(ec_buf_mux_enum, WCD9335_CPE_SS_US_EC_MUX_CFG, - 0, ec_buf_mux_text); - -static const struct snd_kcontrol_new ec_buf_mux = - SOC_DAPM_ENUM("EC BUF Mux", ec_buf_mux_enum); - -static const struct snd_soc_dapm_widget tasha_dapm_widgets[] = { - SND_SOC_DAPM_OUTPUT("EAR"), - SND_SOC_DAPM_OUTPUT("ANC EAR"), - SND_SOC_DAPM_AIF_IN_E("AIF1 PB", "AIF1 Playback", 0, SND_SOC_NOPM, - AIF1_PB, 0, tasha_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF2 PB", "AIF2 Playback", 0, SND_SOC_NOPM, - AIF2_PB, 0, tasha_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF3 PB", "AIF3 Playback", 0, SND_SOC_NOPM, - AIF3_PB, 0, tasha_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF4 PB", "AIF4 Playback", 0, SND_SOC_NOPM, - AIF4_PB, 0, tasha_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF MIX1 PB", "AIF Mix Playback", 0, - SND_SOC_NOPM, AIF_MIX1_PB, 0, - tasha_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("SLIM RX0 MUX", SND_SOC_NOPM, TASHA_RX0, 0, - &slim_rx_mux[TASHA_RX0]), - SND_SOC_DAPM_MUX("SLIM RX1 MUX", SND_SOC_NOPM, TASHA_RX1, 0, - &slim_rx_mux[TASHA_RX1]), - SND_SOC_DAPM_MUX("SLIM RX2 MUX", SND_SOC_NOPM, TASHA_RX2, 0, - &slim_rx_mux[TASHA_RX2]), - SND_SOC_DAPM_MUX("SLIM RX3 MUX", SND_SOC_NOPM, TASHA_RX3, 0, - &slim_rx_mux[TASHA_RX3]), - SND_SOC_DAPM_MUX("SLIM RX4 MUX", SND_SOC_NOPM, TASHA_RX4, 0, - &slim_rx_mux[TASHA_RX4]), - SND_SOC_DAPM_MUX("SLIM RX5 MUX", SND_SOC_NOPM, TASHA_RX5, 0, - &slim_rx_mux[TASHA_RX5]), - SND_SOC_DAPM_MUX("SLIM RX6 MUX", SND_SOC_NOPM, TASHA_RX6, 0, - &slim_rx_mux[TASHA_RX6]), - SND_SOC_DAPM_MUX("SLIM RX7 MUX", SND_SOC_NOPM, TASHA_RX7, 0, - &slim_rx_mux[TASHA_RX7]), - - SND_SOC_DAPM_MIXER("SLIM RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX5", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX6", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX7", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MUX_E("SPL SRC0 MUX", SND_SOC_NOPM, SPLINE_SRC0, 0, - &spl_src0_mux, tasha_codec_enable_spline_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("SPL SRC1 MUX", SND_SOC_NOPM, SPLINE_SRC1, 0, - &spl_src1_mux, tasha_codec_enable_spline_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("SPL SRC2 MUX", SND_SOC_NOPM, SPLINE_SRC2, 0, - &spl_src2_mux, tasha_codec_enable_spline_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("SPL SRC3 MUX", SND_SOC_NOPM, SPLINE_SRC3, 0, - &spl_src3_mux, tasha_codec_enable_spline_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", WCD9335_CDC_RX0_RX_PATH_MIX_CTL, - 5, 0, &rx_int0_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", WCD9335_CDC_RX1_RX_PATH_MIX_CTL, - 5, 0, &rx_int1_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", WCD9335_CDC_RX2_RX_PATH_MIX_CTL, - 5, 0, &rx_int2_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT3_2 MUX", WCD9335_CDC_RX3_RX_PATH_MIX_CTL, - 5, 0, &rx_int3_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT4_2 MUX", WCD9335_CDC_RX4_RX_PATH_MIX_CTL, - 5, 0, &rx_int4_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT5_2 MUX", WCD9335_CDC_RX5_RX_PATH_MIX_CTL, - 5, 0, &rx_int5_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT6_2 MUX", WCD9335_CDC_RX6_RX_PATH_MIX_CTL, - 5, 0, &rx_int6_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT7_2 MUX", WCD9335_CDC_RX7_RX_PATH_MIX_CTL, - 5, 0, &rx_int7_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_MUX_E("RX INT8_2 MUX", WCD9335_CDC_RX8_RX_PATH_MIX_CTL, - 5, 0, &rx_int8_2_mux, tasha_codec_enable_mix_path, - SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int0_1_mix_inp0_mux), - SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int0_1_mix_inp1_mux), - SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int0_1_mix_inp2_mux), - SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int1_1_mix_inp0_mux), - SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int1_1_mix_inp1_mux), - SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int1_1_mix_inp2_mux), - SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int2_1_mix_inp0_mux), - SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int2_1_mix_inp1_mux), - SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int2_1_mix_inp2_mux), - SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int3_1_mix_inp0_mux), - SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int3_1_mix_inp1_mux), - SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int3_1_mix_inp2_mux), - SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int4_1_mix_inp0_mux), - SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int4_1_mix_inp1_mux), - SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int4_1_mix_inp2_mux), - SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int5_1_mix_inp0_mux), - SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int5_1_mix_inp1_mux), - SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int5_1_mix_inp2_mux), - SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int6_1_mix_inp0_mux), - SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int6_1_mix_inp1_mux), - SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int6_1_mix_inp2_mux), - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp0_mux, tasha_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp1_mux, tasha_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp2_mux, tasha_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp0_mux, tasha_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp1_mux, tasha_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp2_mux, tasha_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int1_spline_mix_switch, - ARRAY_SIZE(rx_int1_spline_mix_switch)), - SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int2_spline_mix_switch, - ARRAY_SIZE(rx_int2_spline_mix_switch)), - SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT3_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT3 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int3_spline_mix_switch, - ARRAY_SIZE(rx_int3_spline_mix_switch)), - SND_SOC_DAPM_MIXER("RX INT3 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT4_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT4 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int4_spline_mix_switch, - ARRAY_SIZE(rx_int4_spline_mix_switch)), - SND_SOC_DAPM_MIXER("RX INT4 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT5_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT5 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int5_spline_mix_switch, - ARRAY_SIZE(rx_int5_spline_mix_switch)), - SND_SOC_DAPM_MIXER("RX INT5 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER("RX INT6_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT6 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int6_spline_mix_switch, - ARRAY_SIZE(rx_int6_spline_mix_switch)), - SND_SOC_DAPM_MIXER("RX INT6 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER("RX INT7_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT7 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT7 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int7_spline_mix_switch, - ARRAY_SIZE(rx_int7_spline_mix_switch)), - - SND_SOC_DAPM_MIXER("RX INT8_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT8 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT8 SPLINE MIX", SND_SOC_NOPM, 0, 0, - rx_int8_spline_mix_switch, - ARRAY_SIZE(rx_int8_spline_mix_switch)), - - SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT3 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT4 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT5 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT6 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT7 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER_E("RX INT7 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, tasha_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT8 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, tasha_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("RX INT5 VBAT", SND_SOC_NOPM, 0, 0, - rx_int5_vbat_mix_switch, - ARRAY_SIZE(rx_int5_vbat_mix_switch), - tasha_codec_vbat_enable_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT6 VBAT", SND_SOC_NOPM, 0, 0, - rx_int6_vbat_mix_switch, - ARRAY_SIZE(rx_int6_vbat_mix_switch), - tasha_codec_vbat_enable_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT7 VBAT", SND_SOC_NOPM, 0, 0, - rx_int7_vbat_mix_switch, - ARRAY_SIZE(rx_int7_vbat_mix_switch), - tasha_codec_vbat_enable_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT8 VBAT", SND_SOC_NOPM, 0, 0, - rx_int8_vbat_mix_switch, - ARRAY_SIZE(rx_int8_vbat_mix_switch), - tasha_codec_vbat_enable_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("RX INT0 MIX2 INP", WCD9335_CDC_RX0_RX_PATH_CFG1, 4, - 0, &rx_int0_mix2_inp_mux), - SND_SOC_DAPM_MUX("RX INT1 MIX2 INP", WCD9335_CDC_RX1_RX_PATH_CFG1, 4, - 0, &rx_int1_mix2_inp_mux), - SND_SOC_DAPM_MUX("RX INT2 MIX2 INP", WCD9335_CDC_RX2_RX_PATH_CFG1, 4, - 0, &rx_int2_mix2_inp_mux), - SND_SOC_DAPM_MUX("RX INT3 MIX2 INP", WCD9335_CDC_RX3_RX_PATH_CFG1, 4, - 0, &rx_int3_mix2_inp_mux), - SND_SOC_DAPM_MUX("RX INT4 MIX2 INP", WCD9335_CDC_RX4_RX_PATH_CFG1, 4, - 0, &rx_int4_mix2_inp_mux), - SND_SOC_DAPM_MUX("RX INT7 MIX2 INP", WCD9335_CDC_RX7_RX_PATH_CFG1, 4, - 0, &rx_int7_mix2_inp_mux), - - SND_SOC_DAPM_MUX("SLIM TX0 MUX", SND_SOC_NOPM, TASHA_TX0, 0, - &sb_tx0_mux), - SND_SOC_DAPM_MUX("SLIM TX1 MUX", SND_SOC_NOPM, TASHA_TX1, 0, - &sb_tx1_mux), - SND_SOC_DAPM_MUX("SLIM TX2 MUX", SND_SOC_NOPM, TASHA_TX2, 0, - &sb_tx2_mux), - SND_SOC_DAPM_MUX("SLIM TX3 MUX", SND_SOC_NOPM, TASHA_TX3, 0, - &sb_tx3_mux), - SND_SOC_DAPM_MUX("SLIM TX4 MUX", SND_SOC_NOPM, TASHA_TX4, 0, - &sb_tx4_mux), - SND_SOC_DAPM_MUX("SLIM TX5 MUX", SND_SOC_NOPM, TASHA_TX5, 0, - &sb_tx5_mux), - SND_SOC_DAPM_MUX("SLIM TX6 MUX", SND_SOC_NOPM, TASHA_TX6, 0, - &sb_tx6_mux), - SND_SOC_DAPM_MUX("SLIM TX7 MUX", SND_SOC_NOPM, TASHA_TX7, 0, - &sb_tx7_mux), - SND_SOC_DAPM_MUX("SLIM TX8 MUX", SND_SOC_NOPM, TASHA_TX8, 0, - &sb_tx8_mux), - SND_SOC_DAPM_MUX("SLIM TX9 MUX", SND_SOC_NOPM, TASHA_TX9, 0, - &sb_tx9_mux), - SND_SOC_DAPM_MUX("SLIM TX10 MUX", SND_SOC_NOPM, TASHA_TX10, 0, - &sb_tx10_mux), - SND_SOC_DAPM_MUX("SLIM TX11 MUX", SND_SOC_NOPM, TASHA_TX11, 0, - &sb_tx11_mux), - SND_SOC_DAPM_MUX("SLIM TX11 INP1 MUX", SND_SOC_NOPM, TASHA_TX11, 0, - &sb_tx11_inp1_mux), - SND_SOC_DAPM_MUX("SLIM TX13 MUX", SND_SOC_NOPM, TASHA_TX13, 0, - &sb_tx13_mux), - SND_SOC_DAPM_MUX("TX13 INP MUX", SND_SOC_NOPM, 0, 0, - &tx13_inp_mux), - - SND_SOC_DAPM_MUX_E("ADC MUX0", WCD9335_CDC_TX0_TX_PATH_CTL, 5, 0, - &tx_adc_mux0, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX1", WCD9335_CDC_TX1_TX_PATH_CTL, 5, 0, - &tx_adc_mux1, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX2", WCD9335_CDC_TX2_TX_PATH_CTL, 5, 0, - &tx_adc_mux2, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX3", WCD9335_CDC_TX3_TX_PATH_CTL, 5, 0, - &tx_adc_mux3, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX4", WCD9335_CDC_TX4_TX_PATH_CTL, 5, 0, - &tx_adc_mux4, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX5", WCD9335_CDC_TX5_TX_PATH_CTL, 5, 0, - &tx_adc_mux5, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX6", WCD9335_CDC_TX6_TX_PATH_CTL, 5, 0, - &tx_adc_mux6, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX7", WCD9335_CDC_TX7_TX_PATH_CTL, 5, 0, - &tx_adc_mux7, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX8", WCD9335_CDC_TX8_TX_PATH_CTL, 5, 0, - &tx_adc_mux8, tasha_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX10", SND_SOC_NOPM, 10, 0, - &tx_adc_mux10, tasha_codec_tx_adc_cfg, - SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX_E("ADC MUX11", SND_SOC_NOPM, 11, 0, - &tx_adc_mux11, tasha_codec_tx_adc_cfg, - SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX_E("ADC MUX12", SND_SOC_NOPM, 12, 0, - &tx_adc_mux12, tasha_codec_tx_adc_cfg, - SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX_E("ADC MUX13", SND_SOC_NOPM, 13, 0, - &tx_adc_mux13, tasha_codec_tx_adc_cfg, - SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX("DMIC MUX0", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux0), - SND_SOC_DAPM_MUX("DMIC MUX1", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux1), - SND_SOC_DAPM_MUX("DMIC MUX2", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux2), - SND_SOC_DAPM_MUX("DMIC MUX3", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux3), - SND_SOC_DAPM_MUX("DMIC MUX4", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux4), - SND_SOC_DAPM_MUX("DMIC MUX5", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux5), - SND_SOC_DAPM_MUX("DMIC MUX6", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux6), - SND_SOC_DAPM_MUX("DMIC MUX7", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux7), - SND_SOC_DAPM_MUX("DMIC MUX8", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux8), - SND_SOC_DAPM_MUX("DMIC MUX10", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux10), - SND_SOC_DAPM_MUX("DMIC MUX11", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux11), - SND_SOC_DAPM_MUX("DMIC MUX12", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux12), - SND_SOC_DAPM_MUX("DMIC MUX13", SND_SOC_NOPM, 0, 0, - &tx_dmic_mux13), - - SND_SOC_DAPM_MUX("AMIC MUX0", SND_SOC_NOPM, 0, 0, - &tx_amic_mux0), - SND_SOC_DAPM_MUX("AMIC MUX1", SND_SOC_NOPM, 0, 0, - &tx_amic_mux1), - SND_SOC_DAPM_MUX("AMIC MUX2", SND_SOC_NOPM, 0, 0, - &tx_amic_mux2), - SND_SOC_DAPM_MUX("AMIC MUX3", SND_SOC_NOPM, 0, 0, - &tx_amic_mux3), - SND_SOC_DAPM_MUX("AMIC MUX4", SND_SOC_NOPM, 0, 0, - &tx_amic_mux4), - SND_SOC_DAPM_MUX("AMIC MUX5", SND_SOC_NOPM, 0, 0, - &tx_amic_mux5), - SND_SOC_DAPM_MUX("AMIC MUX6", SND_SOC_NOPM, 0, 0, - &tx_amic_mux6), - SND_SOC_DAPM_MUX("AMIC MUX7", SND_SOC_NOPM, 0, 0, - &tx_amic_mux7), - SND_SOC_DAPM_MUX("AMIC MUX8", SND_SOC_NOPM, 0, 0, - &tx_amic_mux8), - SND_SOC_DAPM_MUX("AMIC MUX10", SND_SOC_NOPM, 0, 0, - &tx_amic_mux10), - SND_SOC_DAPM_MUX("AMIC MUX11", SND_SOC_NOPM, 0, 0, - &tx_amic_mux11), - SND_SOC_DAPM_MUX("AMIC MUX12", SND_SOC_NOPM, 0, 0, - &tx_amic_mux12), - SND_SOC_DAPM_MUX("AMIC MUX13", SND_SOC_NOPM, 0, 0, - &tx_amic_mux13), - - SND_SOC_DAPM_ADC_E("ADC1", NULL, WCD9335_ANA_AMIC1, 7, 0, - tasha_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC2", NULL, WCD9335_ANA_AMIC2, 7, 0, - tasha_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC3", NULL, WCD9335_ANA_AMIC3, 7, 0, - tasha_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC4", NULL, WCD9335_ANA_AMIC4, 7, 0, - tasha_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC5", NULL, WCD9335_ANA_AMIC5, 7, 0, - tasha_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC6", NULL, WCD9335_ANA_AMIC6, 7, 0, - tasha_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - - SND_SOC_DAPM_SUPPLY("RX INT1 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_HPHL, 0, tasha_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_SUPPLY("RX INT2 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_HPHR, 0, tasha_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_SUPPLY("RX INT3 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_LO1, 0, tasha_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_SUPPLY("RX INT4 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_LO2, 0, tasha_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_INPUT("AMIC1"), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS1", SND_SOC_NOPM, 0, 0, - tasha_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS2", SND_SOC_NOPM, 0, 0, - tasha_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS3", SND_SOC_NOPM, 0, 0, - tasha_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS4", SND_SOC_NOPM, 0, 0, - tasha_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS1_STANDALONE, SND_SOC_NOPM, 0, 0, - tasha_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS2_STANDALONE, SND_SOC_NOPM, 0, 0, - tasha_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS3_STANDALONE, SND_SOC_NOPM, 0, 0, - tasha_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS4_STANDALONE, SND_SOC_NOPM, 0, 0, - tasha_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY(DAPM_LDO_H_STANDALONE, SND_SOC_NOPM, 0, 0, - tasha_codec_force_enable_ldo_h, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("ANC0 FB MUX", SND_SOC_NOPM, 0, 0, &anc0_fb_mux), - SND_SOC_DAPM_MUX("ANC1 FB MUX", SND_SOC_NOPM, 0, 0, &anc1_fb_mux), - - SND_SOC_DAPM_INPUT("AMIC2"), - SND_SOC_DAPM_INPUT("AMIC3"), - SND_SOC_DAPM_INPUT("AMIC4"), - SND_SOC_DAPM_INPUT("AMIC5"), - SND_SOC_DAPM_INPUT("AMIC6"), - - SND_SOC_DAPM_AIF_OUT_E("AIF1 CAP", "AIF1 Capture", 0, SND_SOC_NOPM, - AIF1_CAP, 0, tasha_codec_enable_slimtx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT_E("AIF2 CAP", "AIF2 Capture", 0, SND_SOC_NOPM, - AIF2_CAP, 0, tasha_codec_enable_slimtx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT_E("AIF3 CAP", "AIF3 Capture", 0, SND_SOC_NOPM, - AIF3_CAP, 0, tasha_codec_enable_slimtx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT_E("AIF4 VI", "VIfeed", 0, SND_SOC_NOPM, - AIF4_VIFEED, 0, tasha_codec_enable_slimvi_feedback, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER("AIF4_VI Mixer", SND_SOC_NOPM, AIF4_VIFEED, 0, - aif4_vi_mixer, ARRAY_SIZE(aif4_vi_mixer)), - - SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0, - aif1_cap_mixer, ARRAY_SIZE(aif1_cap_mixer)), - - SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0, - aif2_cap_mixer, ARRAY_SIZE(aif2_cap_mixer)), - - SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0, - aif3_cap_mixer, ARRAY_SIZE(aif3_cap_mixer)), - - SND_SOC_DAPM_MIXER("AIF4_MAD Mixer", SND_SOC_NOPM, AIF4_MAD_TX, 0, - aif4_mad_mixer, ARRAY_SIZE(aif4_mad_mixer)), - - SND_SOC_DAPM_INPUT("VIINPUT"), - - SND_SOC_DAPM_AIF_OUT("AIF5 CPE", "AIF5 CPE TX", 0, SND_SOC_NOPM, - AIF5_CPE_TX, 0), - - SND_SOC_DAPM_MUX_E("EC BUF MUX INP", SND_SOC_NOPM, 0, 0, &ec_buf_mux, - tasha_codec_ec_buf_mux_enable, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - /* Digital Mic Inputs */ - SND_SOC_DAPM_ADC_E("DMIC0", NULL, SND_SOC_NOPM, 0, 0, - tasha_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, - tasha_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0, - tasha_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0, - tasha_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0, - tasha_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 0, - tasha_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("IIR0 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp0_mux), - SND_SOC_DAPM_MUX("IIR0 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp1_mux), - SND_SOC_DAPM_MUX("IIR0 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp2_mux), - SND_SOC_DAPM_MUX("IIR0 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp3_mux), - SND_SOC_DAPM_MUX("IIR1 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp0_mux), - SND_SOC_DAPM_MUX("IIR1 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp1_mux), - SND_SOC_DAPM_MUX("IIR1 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp2_mux), - SND_SOC_DAPM_MUX("IIR1 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp3_mux), - - SND_SOC_DAPM_MIXER_E("IIR0", WCD9335_CDC_SIDETONE_IIR0_IIR_PATH_CTL, - 4, 0, NULL, 0, tasha_codec_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER_E("IIR1", WCD9335_CDC_SIDETONE_IIR1_IIR_PATH_CTL, - 4, 0, NULL, 0, tasha_codec_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER("SRC0", WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SRC1", WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - SND_SOC_DAPM_MIXER_E("CPE IN Mixer", SND_SOC_NOPM, 0, 0, - cpe_in_mix_switch, - ARRAY_SIZE(cpe_in_mix_switch), - tasha_codec_configure_cpe_input, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("RX INT1_1 NATIVE MUX", SND_SOC_NOPM, 0, 0, - &int1_1_native_mux), - SND_SOC_DAPM_MUX("RX INT2_1 NATIVE MUX", SND_SOC_NOPM, 0, 0, - &int2_1_native_mux), - SND_SOC_DAPM_MUX("RX INT3_1 NATIVE MUX", SND_SOC_NOPM, 0, 0, - &int3_1_native_mux), - SND_SOC_DAPM_MUX("RX INT4_1 NATIVE MUX", SND_SOC_NOPM, 0, 0, - &int4_1_native_mux), - SND_SOC_DAPM_MUX("RX MIX TX0 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx0_mux), - SND_SOC_DAPM_MUX("RX MIX TX1 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx1_mux), - SND_SOC_DAPM_MUX("RX MIX TX2 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx2_mux), - SND_SOC_DAPM_MUX("RX MIX TX3 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx3_mux), - SND_SOC_DAPM_MUX("RX MIX TX4 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx4_mux), - SND_SOC_DAPM_MUX("RX MIX TX5 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx5_mux), - SND_SOC_DAPM_MUX("RX MIX TX6 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx6_mux), - SND_SOC_DAPM_MUX("RX MIX TX7 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx7_mux), - SND_SOC_DAPM_MUX("RX MIX TX8 MUX", SND_SOC_NOPM, 0, 0, - &rx_mix_tx8_mux), - - SND_SOC_DAPM_MUX("RX INT0 DEM MUX", SND_SOC_NOPM, 0, 0, - &rx_int0_dem_inp_mux), - SND_SOC_DAPM_MUX("RX INT1 DEM MUX", SND_SOC_NOPM, 0, 0, - &rx_int1_dem_inp_mux), - SND_SOC_DAPM_MUX("RX INT2 DEM MUX", SND_SOC_NOPM, 0, 0, - &rx_int2_dem_inp_mux), - - SND_SOC_DAPM_MUX_E("RX INT0 INTERP", SND_SOC_NOPM, - INTERP_EAR, 0, &rx_int0_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1 INTERP", SND_SOC_NOPM, - INTERP_HPHL, 0, &rx_int1_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2 INTERP", SND_SOC_NOPM, - INTERP_HPHR, 0, &rx_int2_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT3 INTERP", SND_SOC_NOPM, - INTERP_LO1, 0, &rx_int3_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT4 INTERP", SND_SOC_NOPM, - INTERP_LO2, 0, &rx_int4_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT5 INTERP", SND_SOC_NOPM, - INTERP_LO3, 0, &rx_int5_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT6 INTERP", SND_SOC_NOPM, - INTERP_LO4, 0, &rx_int6_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7 INTERP", SND_SOC_NOPM, - INTERP_SPKR1, 0, &rx_int7_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8 INTERP", SND_SOC_NOPM, - INTERP_SPKR2, 0, &rx_int8_interp_mux, - tasha_codec_enable_interpolator, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_DAC_E("RX INT0 DAC", NULL, SND_SOC_NOPM, - 0, 0, tasha_codec_ear_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT1 DAC", NULL, SND_SOC_NOPM, - 0, 0, tasha_codec_hphl_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT2 DAC", NULL, SND_SOC_NOPM, - 0, 0, tasha_codec_hphr_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT3 DAC", NULL, SND_SOC_NOPM, - 0, 0, tasha_codec_lineout_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT4 DAC", NULL, SND_SOC_NOPM, - 0, 0, tasha_codec_lineout_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT5 DAC", NULL, SND_SOC_NOPM, - 0, 0, tasha_codec_lineout_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT6 DAC", NULL, SND_SOC_NOPM, - 0, 0, tasha_codec_lineout_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHL PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tasha_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHR PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tasha_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("EAR PA", WCD9335_ANA_EAR, 7, 0, NULL, 0, - tasha_codec_enable_ear_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("LINEOUT1 PA", WCD9335_ANA_LO_1_2, 7, 0, NULL, 0, - tasha_codec_enable_lineout_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("LINEOUT2 PA", WCD9335_ANA_LO_1_2, 6, 0, NULL, 0, - tasha_codec_enable_lineout_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("LINEOUT3 PA", WCD9335_ANA_LO_3_4, 7, 0, NULL, 0, - tasha_codec_enable_lineout_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("LINEOUT4 PA", WCD9335_ANA_LO_3_4, 6, 0, NULL, 0, - tasha_codec_enable_lineout_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC EAR PA", WCD9335_ANA_EAR, 7, 0, NULL, 0, - tasha_codec_enable_ear_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC HPHL PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tasha_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC HPHR PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tasha_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC LINEOUT1 PA", WCD9335_ANA_LO_1_2, - 7, 0, NULL, 0, - tasha_codec_enable_lineout_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC LINEOUT2 PA", WCD9335_ANA_LO_1_2, - 6, 0, NULL, 0, - tasha_codec_enable_lineout_pa, - SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC SPK1 PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tasha_codec_enable_spk_anc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("HPHL"), - SND_SOC_DAPM_OUTPUT("HPHR"), - SND_SOC_DAPM_OUTPUT("ANC HPHL"), - SND_SOC_DAPM_OUTPUT("ANC HPHR"), - SND_SOC_DAPM_SUPPLY("RX_BIAS", SND_SOC_NOPM, 0, 0, - tasha_codec_enable_rx_bias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_OUTPUT("SPK1 OUT"), - SND_SOC_DAPM_OUTPUT("SPK2 OUT"), - SND_SOC_DAPM_OUTPUT("LINEOUT1"), - SND_SOC_DAPM_OUTPUT("LINEOUT2"), - SND_SOC_DAPM_OUTPUT("LINEOUT3"), - SND_SOC_DAPM_OUTPUT("LINEOUT4"), - SND_SOC_DAPM_OUTPUT("ANC LINEOUT1"), - SND_SOC_DAPM_OUTPUT("ANC LINEOUT2"), - SND_SOC_DAPM_SUPPLY("MICBIAS_REGULATOR", SND_SOC_NOPM, - ON_DEMAND_MICBIAS, 0, - tasha_codec_enable_on_demand_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SWITCH("ADC US MUX0", WCD9335_CDC_TX0_TX_PATH_192_CTL, 0, - 0, &adc_us_mux0_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX1", WCD9335_CDC_TX1_TX_PATH_192_CTL, 0, - 0, &adc_us_mux1_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX2", WCD9335_CDC_TX2_TX_PATH_192_CTL, 0, - 0, &adc_us_mux2_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX3", WCD9335_CDC_TX3_TX_PATH_192_CTL, 0, - 0, &adc_us_mux3_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX4", WCD9335_CDC_TX4_TX_PATH_192_CTL, 0, - 0, &adc_us_mux4_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX5", WCD9335_CDC_TX5_TX_PATH_192_CTL, 0, - 0, &adc_us_mux5_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX6", WCD9335_CDC_TX6_TX_PATH_192_CTL, 0, - 0, &adc_us_mux6_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX7", WCD9335_CDC_TX7_TX_PATH_192_CTL, 0, - 0, &adc_us_mux7_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX8", WCD9335_CDC_TX8_TX_PATH_192_CTL, 0, - 0, &adc_us_mux8_switch), - /* MAD related widgets */ - SND_SOC_DAPM_AIF_OUT_E("AIF4 MAD", "AIF4 MAD TX", 0, - SND_SOC_NOPM, 0, 0, - tasha_codec_enable_mad, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("MAD_SEL MUX", SND_SOC_NOPM, 0, 0, - &mad_sel_mux), - SND_SOC_DAPM_INPUT("MAD_CPE_INPUT"), - SND_SOC_DAPM_INPUT("MADINPUT"), - SND_SOC_DAPM_SWITCH("MADONOFF", SND_SOC_NOPM, 0, 0, - &aif4_mad_switch), - SND_SOC_DAPM_SWITCH("MAD_BROADCAST", SND_SOC_NOPM, 0, 0, - &mad_brdcst_switch), - SND_SOC_DAPM_SWITCH("AIF4", SND_SOC_NOPM, 0, 0, - &aif4_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("ANC HPHL Enable", SND_SOC_NOPM, 0, 0, - &anc_hphl_switch), - SND_SOC_DAPM_SWITCH("ANC HPHR Enable", SND_SOC_NOPM, 0, 0, - &anc_hphr_switch), - SND_SOC_DAPM_SWITCH("ANC EAR Enable", SND_SOC_NOPM, 0, 0, - &anc_ear_switch), - SND_SOC_DAPM_SWITCH("ANC OUT EAR SPKR Enable", SND_SOC_NOPM, 0, 0, - &anc_ear_spkr_switch), - SND_SOC_DAPM_SWITCH("ANC LINEOUT1 Enable", SND_SOC_NOPM, 0, 0, - &anc_lineout1_switch), - SND_SOC_DAPM_SWITCH("ANC LINEOUT2 Enable", SND_SOC_NOPM, 0, 0, - &anc_lineout2_switch), - SND_SOC_DAPM_SWITCH("ANC SPKR PA Enable", SND_SOC_NOPM, 0, 0, - &anc_spkr_pa_switch), -}; - -static int tasha_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct tasha_priv *tasha_p = snd_soc_codec_get_drvdata(dai->codec); - u32 i = 0; - struct wcd9xxx_ch *ch; - - switch (dai->id) { - case AIF1_PB: - case AIF2_PB: - case AIF3_PB: - case AIF4_PB: - case AIF_MIX1_PB: - if (!rx_slot || !rx_num) { - pr_err("%s: Invalid rx_slot %pK or rx_num %pK\n", - __func__, rx_slot, rx_num); - return -EINVAL; - } - list_for_each_entry(ch, &tasha_p->dai[dai->id].wcd9xxx_ch_list, - list) { - pr_debug("%s: slot_num %u ch->ch_num %d\n", - __func__, i, ch->ch_num); - rx_slot[i++] = ch->ch_num; - } - pr_debug("%s: rx_num %d\n", __func__, i); - *rx_num = i; - break; - case AIF1_CAP: - case AIF2_CAP: - case AIF3_CAP: - case AIF4_MAD_TX: - case AIF4_VIFEED: - if (!tx_slot || !tx_num) { - pr_err("%s: Invalid tx_slot %pK or tx_num %pK\n", - __func__, tx_slot, tx_num); - return -EINVAL; - } - list_for_each_entry(ch, &tasha_p->dai[dai->id].wcd9xxx_ch_list, - list) { - pr_debug("%s: slot_num %u ch->ch_num %d\n", - __func__, i, ch->ch_num); - tx_slot[i++] = ch->ch_num; - } - pr_debug("%s: tx_num %d\n", __func__, i); - *tx_num = i; - break; - - default: - pr_err("%s: Invalid DAI ID %x\n", __func__, dai->id); - break; - } - - return 0; -} - -static int tasha_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - struct tasha_priv *tasha; - struct wcd9xxx *core; - struct wcd9xxx_codec_dai_data *dai_data = NULL; - - if (!dai) { - pr_err("%s: dai is empty\n", __func__); - return -EINVAL; - } - tasha = snd_soc_codec_get_drvdata(dai->codec); - core = dev_get_drvdata(dai->codec->dev->parent); - - if (!tx_slot || !rx_slot) { - pr_err("%s: Invalid tx_slot=%pK, rx_slot=%pK\n", - __func__, tx_slot, rx_slot); - return -EINVAL; - } - pr_debug("%s(): dai_name = %s DAI-ID %x tx_ch %d rx_ch %d\n" - "tasha->intf_type %d\n", - __func__, dai->name, dai->id, tx_num, rx_num, - tasha->intf_type); - - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - wcd9xxx_init_slimslave(core, core->slim->laddr, - tx_num, tx_slot, rx_num, rx_slot); - /* Reserve TX12/TX13 for MAD data channel */ - dai_data = &tasha->dai[AIF4_MAD_TX]; - if (dai_data) { - if (TASHA_IS_2_0(tasha->wcd9xxx)) - list_add_tail(&core->tx_chs[TASHA_TX13].list, - &dai_data->wcd9xxx_ch_list); - else - list_add_tail(&core->tx_chs[TASHA_TX12].list, - &dai_data->wcd9xxx_ch_list); - } - } - return 0; -} - -static int tasha_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - return 0; -} - -static void tasha_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(dai->codec); - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) - return; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - tasha_codec_vote_max_bw(dai->codec, false); -} - -static int tasha_set_decimator_rate(struct snd_soc_dai *dai, - u8 tx_fs_rate_reg_val, u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u32 tx_port = 0; - u8 shift = 0, shift_val = 0, tx_mux_sel = 0; - int decimator = -1; - u16 tx_port_reg = 0, tx_fs_reg = 0; - - list_for_each_entry(ch, &tasha->dai[dai->id].wcd9xxx_ch_list, list) { - tx_port = ch->port; - dev_dbg(codec->dev, "%s: dai->id = %d, tx_port = %d", - __func__, dai->id, tx_port); - - if ((tx_port < 0) || (tx_port == 12) || (tx_port >= 14)) { - dev_err(codec->dev, "%s: Invalid SLIM TX%u port. DAI ID: %d\n", - __func__, tx_port, dai->id); - return -EINVAL; - } - /* Find the SB TX MUX input - which decimator is connected */ - if (tx_port < 4) { - tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0; - shift = (tx_port << 1); - shift_val = 0x03; - } else if ((tx_port >= 4) && (tx_port < 8)) { - tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1; - shift = ((tx_port - 4) << 1); - shift_val = 0x03; - } else if ((tx_port >= 8) && (tx_port < 11)) { - tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2; - shift = ((tx_port - 8) << 1); - shift_val = 0x03; - } else if (tx_port == 11) { - tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3; - shift = 0; - shift_val = 0x0F; - } else if (tx_port == 13) { - tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3; - shift = 4; - shift_val = 0x03; - } - tx_mux_sel = snd_soc_read(codec, tx_port_reg) & - (shift_val << shift); - tx_mux_sel = tx_mux_sel >> shift; - - if (tx_port <= 8) { - if ((tx_mux_sel == 0x2) || (tx_mux_sel == 0x3)) - decimator = tx_port; - } else if (tx_port <= 10) { - if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) - decimator = ((tx_port == 9) ? 7 : 6); - } else if (tx_port == 11) { - if ((tx_mux_sel >= 1) && (tx_mux_sel < 7)) - decimator = tx_mux_sel - 1; - } else if (tx_port == 13) { - if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) - decimator = 5; - } - - if (decimator >= 0) { - tx_fs_reg = WCD9335_CDC_TX0_TX_PATH_CTL + - 16 * decimator; - dev_dbg(codec->dev, "%s: set DEC%u (-> SLIM_TX%u) rate to %u\n", - __func__, decimator, tx_port, sample_rate); - snd_soc_update_bits(codec, tx_fs_reg, 0x0F, - tx_fs_rate_reg_val); - } else if ((tx_port <= 8) && (tx_mux_sel == 0x01)) { - /* Check if the TX Mux input is RX MIX TXn */ - dev_dbg(codec->dev, "%s: RX_MIX_TX%u going to SLIM TX%u\n", - __func__, tx_port, tx_port); - } else { - dev_err(codec->dev, "%s: ERROR: Invalid decimator: %d\n", - __func__, decimator); - return -EINVAL; - } - } - return 0; -} - -static int tasha_set_mix_interpolator_rate(struct snd_soc_dai *dai, - u8 int_mix_fs_rate_reg_val, - u32 sample_rate) -{ - u8 int_2_inp; - u32 j; - u16 int_mux_cfg1, int_fs_reg; - u8 int_mux_cfg1_val; - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - list_for_each_entry(ch, &tasha->dai[dai->id].wcd9xxx_ch_list, list) { - int_2_inp = ch->port + INTn_2_INP_SEL_RX0 - - TASHA_RX_PORT_START_NUMBER; - if ((int_2_inp < INTn_2_INP_SEL_RX0) || - (int_2_inp > INTn_2_INP_SEL_RX7)) { - pr_err("%s: Invalid RX%u port, Dai ID is %d\n", - __func__, - (ch->port - TASHA_RX_PORT_START_NUMBER), - dai->id); - return -EINVAL; - } - - int_mux_cfg1 = WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1; - for (j = 0; j < TASHA_NUM_INTERPOLATORS; j++) { - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) & - 0x0F; - if (int_mux_cfg1_val == int_2_inp) { - int_fs_reg = WCD9335_CDC_RX0_RX_PATH_MIX_CTL + - 20 * j; - pr_debug("%s: AIF_MIX_PB DAI(%d) connected to INT%u_2\n", - __func__, dai->id, j); - pr_debug("%s: set INT%u_2 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, - 0x0F, int_mix_fs_rate_reg_val); - } - int_mux_cfg1 += 2; - } - } - return 0; -} - -static int tasha_set_prim_interpolator_rate(struct snd_soc_dai *dai, - u8 int_prim_fs_rate_reg_val, - u32 sample_rate) -{ - u8 int_1_mix1_inp; - u32 j; - u16 int_mux_cfg0, int_mux_cfg1; - u16 int_fs_reg; - u8 int_mux_cfg0_val, int_mux_cfg1_val; - u8 inp0_sel, inp1_sel, inp2_sel; - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - list_for_each_entry(ch, &tasha->dai[dai->id].wcd9xxx_ch_list, list) { - int_1_mix1_inp = ch->port + INTn_1_MIX_INP_SEL_RX0 - - TASHA_RX_PORT_START_NUMBER; - if ((int_1_mix1_inp < INTn_1_MIX_INP_SEL_RX0) || - (int_1_mix1_inp > INTn_1_MIX_INP_SEL_RX7)) { - pr_err("%s: Invalid RX%u port, Dai ID is %d\n", - __func__, - (ch->port - TASHA_RX_PORT_START_NUMBER), - dai->id); - return -EINVAL; - } - - int_mux_cfg0 = WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0; - - /* - * Loop through all interpolator MUX inputs and find out - * to which interpolator input, the slim rx port - * is connected - */ - for (j = 0; j < TASHA_NUM_INTERPOLATORS; j++) { - int_mux_cfg1 = int_mux_cfg0 + 1; - - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - inp0_sel = int_mux_cfg0_val & 0x0F; - inp1_sel = (int_mux_cfg0_val >> 4) & 0x0F; - inp2_sel = (int_mux_cfg1_val >> 4) & 0x0F; - if ((inp0_sel == int_1_mix1_inp) || - (inp1_sel == int_1_mix1_inp) || - (inp2_sel == int_1_mix1_inp)) { - int_fs_reg = WCD9335_CDC_RX0_RX_PATH_CTL + - 20 * j; - pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_1\n", - __func__, dai->id, j); - pr_debug("%s: set INT%u_1 sample rate to %u\n", - __func__, j, sample_rate); - /* sample_rate is in Hz */ - if ((j == 0) && (sample_rate == 44100)) { - pr_info("%s: Cannot set 44.1KHz on INT0\n", - __func__); - } else - snd_soc_update_bits(codec, int_fs_reg, - 0x0F, int_prim_fs_rate_reg_val); - } - int_mux_cfg0 += 2; - } - } - - return 0; -} - - -static int tasha_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - int rate_val = 0; - int i, ret; - - /* set mixing path rate */ - for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) { - if (sample_rate == - int_mix_sample_rate_val[i].sample_rate) { - rate_val = - int_mix_sample_rate_val[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || - (rate_val < 0)) - goto prim_rate; - ret = tasha_set_mix_interpolator_rate(dai, - (u8) rate_val, sample_rate); -prim_rate: - /* set primary path sample rate */ - for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) { - if (sample_rate == - int_prim_sample_rate_val[i].sample_rate) { - rate_val = - int_prim_sample_rate_val[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || - (rate_val < 0)) - return -EINVAL; - ret = tasha_set_prim_interpolator_rate(dai, - (u8) rate_val, sample_rate); - return ret; -} - -static int tasha_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - tasha_codec_vote_max_bw(dai->codec, false); - return 0; -} - -static int tasha_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(dai->codec); - int ret; - int tx_fs_rate = -EINVAL; - int rx_fs_rate = -EINVAL; - int i2s_bit_mode; - struct snd_soc_codec *codec = dai->codec; - - pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, - dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = tasha_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - pr_err("%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - switch (params_width(params)) { - case 16: - tasha->dai[dai->id].bit_width = 16; - i2s_bit_mode = 0x01; - break; - case 24: - tasha->dai[dai->id].bit_width = 24; - i2s_bit_mode = 0x00; - break; - default: - return -EINVAL; - } - tasha->dai[dai->id].rate = params_rate(params); - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - switch (params_rate(params)) { - case 8000: - rx_fs_rate = 0; - break; - case 16000: - rx_fs_rate = 1; - break; - case 32000: - rx_fs_rate = 2; - break; - case 48000: - rx_fs_rate = 3; - break; - case 96000: - rx_fs_rate = 4; - break; - case 192000: - rx_fs_rate = 5; - break; - default: - dev_err(tasha->dev, - "%s: Invalid RX sample rate: %d\n", - __func__, params_rate(params)); - return -EINVAL; - }; - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL, - 0x20, i2s_bit_mode << 5); - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL, - 0x1c, (rx_fs_rate << 2)); - } - break; - case SNDRV_PCM_STREAM_CAPTURE: - switch (params_rate(params)) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - case 384000: - tx_fs_rate = 7; - break; - default: - dev_err(tasha->dev, "%s: Invalid TX sample rate: %d\n", - __func__, params_rate(params)); - return -EINVAL; - - }; - if (dai->id != AIF4_VIFEED && - dai->id != AIF4_MAD_TX) { - ret = tasha_set_decimator_rate(dai, tx_fs_rate, - params_rate(params)); - if (ret < 0) { - dev_err(tasha->dev, "%s: cannot set TX Decimator rate: %d\n", - __func__, tx_fs_rate); - return ret; - } - } - tasha->dai[dai->id].rate = params_rate(params); - switch (params_width(params)) { - case 16: - tasha->dai[dai->id].bit_width = 16; - i2s_bit_mode = 0x01; - break; - case 24: - tasha->dai[dai->id].bit_width = 24; - i2s_bit_mode = 0x00; - break; - case 32: - tasha->dai[dai->id].bit_width = 32; - i2s_bit_mode = 0x00; - break; - default: - dev_err(tasha->dev, "%s: Invalid format 0x%x\n", - __func__, params_width(params)); - return -EINVAL; - }; - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL, - 0x20, i2s_bit_mode << 5); - if (tx_fs_rate > 1) - tx_fs_rate--; - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL, - 0x1c, tx_fs_rate << 2); - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_L_CFG, - 0x05, 0x05); - - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_R_CFG, - 0x05, 0x05); - - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_L_CFG, - 0x05, 0x05); - - snd_soc_update_bits(codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_R_CFG, - 0x05, 0x05); - } - break; - default: - pr_err("%s: Invalid stream type %d\n", __func__, - substream->stream); - return -EINVAL; - }; - if (dai->id == AIF4_VIFEED) - tasha->dai[dai->id].bit_width = 32; - - return 0; -} - -static int tasha_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(dai->codec); - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - /* CPU is master */ - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - if (dai->id == AIF1_CAP) - snd_soc_update_bits(dai->codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL, - 0x2, 0); - else if (dai->id == AIF1_PB) - snd_soc_update_bits(dai->codec, - WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL, - 0x2, 0); - } - break; - case SND_SOC_DAIFMT_CBM_CFM: - /* CPU is slave */ - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - if (dai->id == AIF1_CAP) - snd_soc_update_bits(dai->codec, - WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL, - 0x2, 0x2); - else if (dai->id == AIF1_PB) - snd_soc_update_bits(dai->codec, - WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL, - 0x2, 0x2); - } - break; - default: - return -EINVAL; - } - return 0; -} - -static int tasha_set_dai_sysclk(struct snd_soc_dai *dai, - int clk_id, unsigned int freq, int dir) -{ - pr_debug("%s\n", __func__); - return 0; -} - -static struct snd_soc_dai_ops tasha_dai_ops = { - .startup = tasha_startup, - .shutdown = tasha_shutdown, - .hw_params = tasha_hw_params, - .prepare = tasha_prepare, - .set_sysclk = tasha_set_dai_sysclk, - .set_fmt = tasha_set_dai_fmt, - .set_channel_map = tasha_set_channel_map, - .get_channel_map = tasha_get_channel_map, -}; - -static struct snd_soc_dai_driver tasha_dai[] = { - { - .name = "tasha_rx1", - .id = AIF1_PB, - .playback = { - .stream_name = "AIF1 Playback", - .rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_tx1", - .id = AIF1_CAP, - .capture = { - .stream_name = "AIF1 Capture", - .rates = WCD9335_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_rx2", - .id = AIF2_PB, - .playback = { - .stream_name = "AIF2 Playback", - .rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_tx2", - .id = AIF2_CAP, - .capture = { - .stream_name = "AIF2 Capture", - .rates = WCD9335_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_rx3", - .id = AIF3_PB, - .playback = { - .stream_name = "AIF3 Playback", - .rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_tx3", - .id = AIF3_CAP, - .capture = { - .stream_name = "AIF3 Capture", - .rates = WCD9335_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_rx4", - .id = AIF4_PB, - .playback = { - .stream_name = "AIF4 Playback", - .rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_mix_rx1", - .id = AIF_MIX1_PB, - .playback = { - .stream_name = "AIF Mix Playback", - .rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_mad1", - .id = AIF4_MAD_TX, - .capture = { - .stream_name = "AIF4 MAD TX", - .rates = SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_384000, - .formats = TASHA_FORMATS_S16_S24_S32_LE, - .rate_min = 16000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 1, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_vifeedback", - .id = AIF4_VIFEED, - .capture = { - .stream_name = "VIfeed", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, - .formats = TASHA_FORMATS_S16_S24_S32_LE, - .rate_max = 48000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_cpe", - .id = AIF5_CPE_TX, - .capture = { - .stream_name = "AIF5 CPE TX", - .rates = SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000, - .formats = TASHA_FORMATS_S16_S24_S32_LE, - .rate_min = 16000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 1, - }, - }, -}; - -static struct snd_soc_dai_driver tasha_i2s_dai[] = { - { - .name = "tasha_i2s_rx1", - .id = AIF1_PB, - .playback = { - .stream_name = "AIF1 Playback", - .rates = WCD9335_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_i2s_tx1", - .id = AIF1_CAP, - .capture = { - .stream_name = "AIF1 Capture", - .rates = WCD9335_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_i2s_rx2", - .id = AIF2_PB, - .playback = { - .stream_name = "AIF2 Playback", - .rates = WCD9335_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tasha_dai_ops, - }, - { - .name = "tasha_i2s_tx2", - .id = AIF2_CAP, - .capture = { - .stream_name = "AIF2 Capture", - .rates = WCD9335_RATES_MASK, - .formats = TASHA_FORMATS_S16_S24_LE, - .rate_max = 192000, - .rate_min = 8000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tasha_dai_ops, - }, -}; - -static void tasha_codec_power_gate_digital_core(struct tasha_priv *tasha) -{ - struct snd_soc_codec *codec = tasha->codec; - - if (!codec) - return; - - mutex_lock(&tasha->power_lock); - dev_dbg(codec->dev, "%s: Entering power gating function, %d\n", - __func__, tasha->power_active_ref); - - if (tasha->power_active_ref > 0) - goto exit; - - wcd9xxx_set_power_state(tasha->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_BEGIN, - WCD9XXX_DIG_CORE_REGION_1); - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x02, 0x00); - clear_bit(AUDIO_NOMINAL, &tasha->status_mask); - tasha_codec_update_sido_voltage(tasha, sido_buck_svs_voltage); - wcd9xxx_set_power_state(tasha->wcd9xxx, WCD_REGION_POWER_DOWN, - WCD9XXX_DIG_CORE_REGION_1); -exit: - dev_dbg(codec->dev, "%s: Exiting power gating function, %d\n", - __func__, tasha->power_active_ref); - mutex_unlock(&tasha->power_lock); -} - -static void tasha_codec_power_gate_work(struct work_struct *work) -{ - struct tasha_priv *tasha; - struct delayed_work *dwork; - struct snd_soc_codec *codec; - - dwork = to_delayed_work(work); - tasha = container_of(dwork, struct tasha_priv, power_gate_work); - codec = tasha->codec; - - if (!codec) - return; - - tasha_codec_power_gate_digital_core(tasha); -} - -/* called under power_lock acquisition */ -static int tasha_dig_core_remove_power_collapse(struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - tasha_codec_vote_max_bw(codec, true); - snd_soc_write(codec, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x5); - snd_soc_write(codec, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x7); - snd_soc_write(codec, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x3); - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_RST_CTL, 0x02, 0x00); - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_RST_CTL, 0x02, 0x02); - - wcd9xxx_set_power_state(tasha->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - regcache_mark_dirty(codec->component.regmap); - regcache_sync_region(codec->component.regmap, - TASHA_DIG_CORE_REG_MIN, TASHA_DIG_CORE_REG_MAX); - tasha_codec_vote_max_bw(codec, false); - - return 0; -} - -static int tasha_dig_core_power_collapse(struct tasha_priv *tasha, - int req_state) -{ - struct snd_soc_codec *codec; - int cur_state; - - /* Exit if feature is disabled */ - if (!dig_core_collapse_enable) - return 0; - - mutex_lock(&tasha->power_lock); - if (req_state == POWER_COLLAPSE) - tasha->power_active_ref--; - else if (req_state == POWER_RESUME) - tasha->power_active_ref++; - else - goto unlock_mutex; - - if (tasha->power_active_ref < 0) { - dev_dbg(tasha->dev, "%s: power_active_ref is negative\n", - __func__); - goto unlock_mutex; - } - - codec = tasha->codec; - if (!codec) - goto unlock_mutex; - - if (req_state == POWER_COLLAPSE) { - if (tasha->power_active_ref == 0) { - schedule_delayed_work(&tasha->power_gate_work, - msecs_to_jiffies(dig_core_collapse_timer * 1000)); - } - } else if (req_state == POWER_RESUME) { - if (tasha->power_active_ref == 1) { - /* - * At this point, there can be two cases: - * 1. Core already in power collapse state - * 2. Timer kicked in and still did not expire or - * waiting for the power_lock - */ - cur_state = wcd9xxx_get_current_power_state( - tasha->wcd9xxx, - WCD9XXX_DIG_CORE_REGION_1); - if (cur_state == WCD_REGION_POWER_DOWN) - tasha_dig_core_remove_power_collapse(codec); - else { - mutex_unlock(&tasha->power_lock); - cancel_delayed_work_sync( - &tasha->power_gate_work); - mutex_lock(&tasha->power_lock); - } - } - } - -unlock_mutex: - mutex_unlock(&tasha->power_lock); - - return 0; -} - -static int __tasha_cdc_mclk_enable_locked(struct tasha_priv *tasha, - bool enable) -{ - int ret = 0; - - if (!tasha->wcd_ext_clk) { - dev_err(tasha->dev, "%s: wcd ext clock is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(tasha->dev, "%s: mclk_enable = %u\n", __func__, enable); - - if (enable) { - tasha_dig_core_power_collapse(tasha, POWER_RESUME); - ret = tasha_cdc_req_mclk_enable(tasha, true); - if (ret) - goto err; - - set_bit(AUDIO_NOMINAL, &tasha->status_mask); - tasha_codec_apply_sido_voltage(tasha, - SIDO_VOLTAGE_NOMINAL_MV); - } else { - if (!dig_core_collapse_enable) { - clear_bit(AUDIO_NOMINAL, &tasha->status_mask); - tasha_codec_update_sido_voltage(tasha, - sido_buck_svs_voltage); - } - tasha_cdc_req_mclk_enable(tasha, false); - tasha_dig_core_power_collapse(tasha, POWER_COLLAPSE); - } - -err: - return ret; -} - -static int __tasha_cdc_mclk_enable(struct tasha_priv *tasha, - bool enable) -{ - int ret; - - WCD9XXX_V2_BG_CLK_LOCK(tasha->resmgr); - ret = __tasha_cdc_mclk_enable_locked(tasha, enable); - WCD9XXX_V2_BG_CLK_UNLOCK(tasha->resmgr); - - return ret; -} - -int tasha_cdc_mclk_enable(struct snd_soc_codec *codec, int enable, bool dapm) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - return __tasha_cdc_mclk_enable(tasha, enable); -} -EXPORT_SYMBOL(tasha_cdc_mclk_enable); - -int tasha_cdc_mclk_tx_enable(struct snd_soc_codec *codec, int enable, bool dapm) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(tasha->dev, "%s: clk_mode: %d, enable: %d, clk_internal: %d\n", - __func__, tasha->clk_mode, enable, tasha->clk_internal); - if (tasha->clk_mode || tasha->clk_internal) { - if (enable) { - tasha_cdc_sido_ccl_enable(tasha, true); - wcd_resmgr_enable_master_bias(tasha->resmgr); - tasha_dig_core_power_collapse(tasha, POWER_RESUME); - snd_soc_update_bits(codec, - WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - set_bit(CPE_NOMINAL, &tasha->status_mask); - tasha_codec_update_sido_voltage(tasha, - SIDO_VOLTAGE_NOMINAL_MV); - tasha->clk_internal = true; - } else { - tasha->clk_internal = false; - clear_bit(CPE_NOMINAL, &tasha->status_mask); - tasha_codec_update_sido_voltage(tasha, - sido_buck_svs_voltage); - tasha_dig_core_power_collapse(tasha, POWER_COLLAPSE); - wcd_resmgr_disable_master_bias(tasha->resmgr); - tasha_cdc_sido_ccl_enable(tasha, false); - } - } else { - ret = __tasha_cdc_mclk_enable(tasha, enable); - } - return ret; -} -EXPORT_SYMBOL(tasha_cdc_mclk_tx_enable); - -static ssize_t tasha_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, struct file *file, - char __user *buf, size_t count, loff_t pos) -{ - struct tasha_priv *tasha; - struct wcd9xxx *wcd9xxx; - char buffer[TASHA_VERSION_ENTRY_SIZE]; - int len = 0; - - tasha = (struct tasha_priv *) entry->private_data; - if (!tasha) { - pr_err("%s: tasha priv is null\n", __func__); - return -EINVAL; - } - - wcd9xxx = tasha->wcd9xxx; - - if (wcd9xxx->codec_type->id_major == TASHA_MAJOR) { - if (TASHA_IS_1_0(wcd9xxx)) - len = snprintf(buffer, sizeof(buffer), "WCD9335_1_0\n"); - else if (TASHA_IS_1_1(wcd9xxx)) - len = snprintf(buffer, sizeof(buffer), "WCD9335_1_1\n"); - else - snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } else if (wcd9xxx->codec_type->id_major == TASHA2P0_MAJOR) { - len = snprintf(buffer, sizeof(buffer), "WCD9335_2_0\n"); - } else - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops tasha_codec_info_ops = { - .read = tasha_codec_version_read, -}; - -/* - * tasha_codec_info_create_codec_entry - creates wcd9335 module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates wcd9335 module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int tasha_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct tasha_priv *tasha; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - tasha = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - tasha->entry = snd_info_create_subdir(codec_root->module, - "tasha", codec_root); - if (!tasha->entry) { - dev_dbg(codec->dev, "%s: failed to create wcd9335 entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - tasha->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd9335 version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = tasha; - version_entry->size = TASHA_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &tasha_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - tasha->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(tasha_codec_info_create_codec_entry); - -static int __tasha_codec_internal_rco_ctrl( - struct snd_soc_codec *codec, bool enable) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - if (enable) { - tasha_cdc_sido_ccl_enable(tasha, true); - if (wcd_resmgr_get_clk_type(tasha->resmgr) == - WCD_CLK_RCO) { - ret = wcd_resmgr_enable_clk_block(tasha->resmgr, - WCD_CLK_RCO); - } else { - ret = tasha_cdc_req_mclk_enable(tasha, true); - ret |= wcd_resmgr_enable_clk_block(tasha->resmgr, - WCD_CLK_RCO); - ret |= tasha_cdc_req_mclk_enable(tasha, false); - } - - } else { - ret = wcd_resmgr_disable_clk_block(tasha->resmgr, - WCD_CLK_RCO); - tasha_cdc_sido_ccl_enable(tasha, false); - } - - if (ret) { - dev_err(codec->dev, "%s: Error in %s RCO\n", - __func__, (enable ? "enabling" : "disabling")); - ret = -EINVAL; - } - - return ret; -} - -/* - * tasha_codec_internal_rco_ctrl() - * Make sure that the caller does not acquire - * BG_CLK_LOCK. - */ -static int tasha_codec_internal_rco_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - WCD9XXX_V2_BG_CLK_LOCK(tasha->resmgr); - ret = __tasha_codec_internal_rco_ctrl(codec, enable); - WCD9XXX_V2_BG_CLK_UNLOCK(tasha->resmgr); - return ret; -} - -/* - * tasha_mbhc_hs_detect: starts mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - * @mbhc_cfg: handle to mbhc configuration structure - * return 0 if mbhc_start is success or error code in case of failure - */ -int tasha_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - return wcd_mbhc_start(&tasha->mbhc, mbhc_cfg); -} -EXPORT_SYMBOL(tasha_mbhc_hs_detect); - -/* - * tasha_mbhc_hs_detect_exit: stop mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - */ -void tasha_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - wcd_mbhc_stop(&tasha->mbhc); -} -EXPORT_SYMBOL(tasha_mbhc_hs_detect_exit); - -static int wcd9335_get_micb_vout_ctl_val(u32 micb_mv) -{ - /* min micbias voltage is 1V and maximum is 2.85V */ - if (micb_mv < 1000 || micb_mv > 2850) { - pr_err("%s: unsupported micbias voltage\n", __func__); - return -EINVAL; - } - - return (micb_mv - 1000) / 50; -} - -static const struct tasha_reg_mask_val tasha_reg_update_reset_val_1_1[] = { - {WCD9335_RCO_CTRL_2, 0xFF, 0x47}, - {WCD9335_FLYBACK_VNEG_DAC_CTRL_4, 0xFF, 0x60}, -}; - -static const struct tasha_reg_mask_val tasha_codec_reg_init_val_1_1[] = { - {WCD9335_FLYBACK_VNEG_DAC_CTRL_1, 0xFF, 0x65}, - {WCD9335_FLYBACK_VNEG_DAC_CTRL_2, 0xFF, 0x52}, - {WCD9335_FLYBACK_VNEG_DAC_CTRL_3, 0xFF, 0xAF}, - {WCD9335_FLYBACK_VNEG_DAC_CTRL_4, 0xFF, 0x60}, - {WCD9335_FLYBACK_VNEG_CTRL_3, 0xFF, 0xF4}, - {WCD9335_FLYBACK_VNEG_CTRL_9, 0xFF, 0x40}, - {WCD9335_FLYBACK_VNEG_CTRL_2, 0xFF, 0x4F}, - {WCD9335_FLYBACK_EN, 0xFF, 0x6E}, - {WCD9335_CDC_RX2_RX_PATH_SEC0, 0xF8, 0xF8}, - {WCD9335_CDC_RX1_RX_PATH_SEC0, 0xF8, 0xF8}, -}; - -static const struct tasha_reg_mask_val tasha_codec_reg_init_val_1_0[] = { - {WCD9335_FLYBACK_VNEG_CTRL_3, 0xFF, 0x54}, - {WCD9335_CDC_RX2_RX_PATH_SEC0, 0xFC, 0xFC}, - {WCD9335_CDC_RX1_RX_PATH_SEC0, 0xFC, 0xFC}, -}; - -static const struct tasha_reg_mask_val tasha_codec_reg_init_val_2_0[] = { - {WCD9335_RCO_CTRL_2, 0x0F, 0x08}, - {WCD9335_RX_BIAS_FLYB_MID_RST, 0xF0, 0x10}, - {WCD9335_FLYBACK_CTRL_1, 0x20, 0x20}, - {WCD9335_HPH_OCP_CTL, 0xFF, 0x7A}, - {WCD9335_HPH_L_TEST, 0x01, 0x01}, - {WCD9335_HPH_R_TEST, 0x01, 0x01}, - {WCD9335_CDC_BOOST0_BOOST_CFG1, 0x3F, 0x12}, - {WCD9335_CDC_BOOST0_BOOST_CFG2, 0x1C, 0x08}, - {WCD9335_CDC_COMPANDER7_CTL7, 0x1E, 0x18}, - {WCD9335_CDC_BOOST1_BOOST_CFG1, 0x3F, 0x12}, - {WCD9335_CDC_BOOST1_BOOST_CFG2, 0x1C, 0x08}, - {WCD9335_CDC_COMPANDER8_CTL7, 0x1E, 0x18}, - {WCD9335_CDC_TX0_TX_PATH_SEC7, 0xFF, 0x45}, - {WCD9335_CDC_RX0_RX_PATH_SEC0, 0xFC, 0xF4}, - {WCD9335_HPH_REFBUFF_LP_CTL, 0x08, 0x08}, - {WCD9335_HPH_REFBUFF_LP_CTL, 0x06, 0x02}, - {WCD9335_DIFF_LO_CORE_OUT_PROG, 0xFC, 0xA0}, - {WCD9335_SE_LO_COM1, 0xFF, 0xC0}, - {WCD9335_CDC_RX3_RX_PATH_SEC0, 0xFC, 0xF4}, - {WCD9335_CDC_RX4_RX_PATH_SEC0, 0xFC, 0xF4}, - {WCD9335_CDC_RX5_RX_PATH_SEC0, 0xFC, 0xF8}, - {WCD9335_CDC_RX6_RX_PATH_SEC0, 0xFC, 0xF8}, -}; - -static const struct tasha_reg_mask_val tasha_codec_reg_defaults[] = { - {WCD9335_CODEC_RPM_CLK_GATE, 0x03, 0x00}, - {WCD9335_CODEC_RPM_CLK_MCLK_CFG, 0x03, 0x01}, - {WCD9335_CODEC_RPM_CLK_MCLK_CFG, 0x04, 0x04}, -}; - -static const struct tasha_reg_mask_val tasha_codec_reg_i2c_defaults[] = { - {WCD9335_ANA_CLK_TOP, 0x20, 0x20}, - {WCD9335_CODEC_RPM_CLK_GATE, 0x03, 0x01}, - {WCD9335_CODEC_RPM_CLK_MCLK_CFG, 0x03, 0x00}, - {WCD9335_CODEC_RPM_CLK_MCLK_CFG, 0x05, 0x05}, - {WCD9335_DATA_HUB_DATA_HUB_RX0_INP_CFG, 0x01, 0x01}, - {WCD9335_DATA_HUB_DATA_HUB_RX1_INP_CFG, 0x01, 0x01}, - {WCD9335_DATA_HUB_DATA_HUB_RX2_INP_CFG, 0x01, 0x01}, - {WCD9335_DATA_HUB_DATA_HUB_RX3_INP_CFG, 0x01, 0x01}, - {WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_L_CFG, 0x05, 0x05}, - {WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_R_CFG, 0x05, 0x05}, - {WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_L_CFG, 0x05, 0x05}, - {WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_R_CFG, 0x05, 0x05}, -}; - -static const struct tasha_reg_mask_val tasha_codec_reg_init_common_val[] = { - /* Rbuckfly/R_EAR(32) */ - {WCD9335_CDC_CLSH_K2_MSB, 0x0F, 0x00}, - {WCD9335_CDC_CLSH_K2_LSB, 0xFF, 0x60}, - {WCD9335_CPE_SS_DMIC_CFG, 0x80, 0x00}, - {WCD9335_CDC_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {WCD9335_CDC_BOOST1_BOOST_CTL, 0x7C, 0x58}, - {WCD9335_CDC_RX7_RX_PATH_CFG1, 0x08, 0x08}, - {WCD9335_CDC_RX8_RX_PATH_CFG1, 0x08, 0x08}, - {WCD9335_ANA_LO_1_2, 0x3C, 0X3C}, - {WCD9335_DIFF_LO_COM_SWCAP_REFBUF_FREQ, 0x70, 0x00}, - {WCD9335_SOC_MAD_AUDIO_CTL_2, 0x03, 0x03}, - {WCD9335_CDC_TOP_TOP_CFG1, 0x02, 0x02}, - {WCD9335_CDC_TOP_TOP_CFG1, 0x01, 0x01}, - {WCD9335_EAR_CMBUFF, 0x08, 0x00}, - {WCD9335_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_COMPANDER7_CTL3, 0x80, 0x80}, - {WCD9335_CDC_COMPANDER8_CTL3, 0x80, 0x80}, - {WCD9335_CDC_COMPANDER7_CTL7, 0x01, 0x01}, - {WCD9335_CDC_COMPANDER8_CTL7, 0x01, 0x01}, - {WCD9335_CDC_RX0_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX1_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX2_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX3_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX4_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX5_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX6_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX7_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX8_RX_PATH_CFG0, 0x01, 0x01}, - {WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 0x01, 0x01}, - {WCD9335_VBADC_IBIAS_FE, 0x0C, 0x08}, -}; - -static const struct tasha_reg_mask_val tasha_codec_reg_init_1_x_val[] = { - /* Enable TX HPF Filter & Linear Phase */ - {WCD9335_CDC_TX0_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX1_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX2_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX3_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX4_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX5_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX6_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX7_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_TX8_TX_PATH_CFG0, 0x11, 0x11}, - {WCD9335_CDC_RX0_RX_PATH_SEC0, 0xF8, 0xF8}, - {WCD9335_CDC_RX0_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX1_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX2_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX3_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX4_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX5_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX6_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX7_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX8_RX_PATH_SEC1, 0x08, 0x08}, - {WCD9335_CDC_RX0_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX1_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX2_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX3_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX4_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX5_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX6_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX7_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_RX8_RX_PATH_MIX_SEC0, 0x08, 0x08}, - {WCD9335_CDC_TX0_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX1_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX2_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX3_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX4_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX5_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX6_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX7_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_TX8_TX_PATH_SEC2, 0x01, 0x01}, - {WCD9335_CDC_RX3_RX_PATH_SEC0, 0xF8, 0xF0}, - {WCD9335_CDC_RX4_RX_PATH_SEC0, 0xF8, 0xF0}, - {WCD9335_CDC_RX5_RX_PATH_SEC0, 0xF8, 0xF8}, - {WCD9335_CDC_RX6_RX_PATH_SEC0, 0xF8, 0xF8}, - {WCD9335_RX_OCP_COUNT, 0xFF, 0xFF}, - {WCD9335_HPH_OCP_CTL, 0xF0, 0x70}, - {WCD9335_CPE_SS_CPAR_CFG, 0xFF, 0x00}, - {WCD9335_FLYBACK_VNEG_CTRL_1, 0xFF, 0x63}, - {WCD9335_FLYBACK_VNEG_CTRL_4, 0xFF, 0x7F}, - {WCD9335_CLASSH_CTRL_VCL_1, 0xFF, 0x60}, - {WCD9335_CLASSH_CTRL_CCL_5, 0xFF, 0x40}, - {WCD9335_RX_TIMER_DIV, 0xFF, 0x32}, - {WCD9335_SE_LO_COM2, 0xFF, 0x01}, - {WCD9335_MBHC_ZDET_ANA_CTL, 0x0F, 0x07}, - {WCD9335_RX_BIAS_HPH_PA, 0xF0, 0x60}, - {WCD9335_HPH_RDAC_LDO_CTL, 0x88, 0x88}, - {WCD9335_HPH_L_EN, 0x20, 0x20}, - {WCD9335_HPH_R_EN, 0x20, 0x20}, - {WCD9335_DIFF_LO_CORE_OUT_PROG, 0xFC, 0xD8}, - {WCD9335_CDC_RX5_RX_PATH_SEC3, 0xBD, 0xBD}, - {WCD9335_CDC_RX6_RX_PATH_SEC3, 0xBD, 0xBD}, - {WCD9335_DIFF_LO_COM_PA_FREQ, 0x70, 0x40}, -}; - -static void tasha_update_reg_reset_values(struct snd_soc_codec *codec) -{ - u32 i; - struct wcd9xxx *tasha_core = dev_get_drvdata(codec->dev->parent); - - if (TASHA_IS_1_1(tasha_core)) { - for (i = 0; i < ARRAY_SIZE(tasha_reg_update_reset_val_1_1); - i++) - snd_soc_write(codec, - tasha_reg_update_reset_val_1_1[i].reg, - tasha_reg_update_reset_val_1_1[i].val); - } -} - -static void tasha_codec_init_reg(struct snd_soc_codec *codec) -{ - u32 i; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - for (i = 0; i < ARRAY_SIZE(tasha_codec_reg_init_common_val); i++) - snd_soc_update_bits(codec, - tasha_codec_reg_init_common_val[i].reg, - tasha_codec_reg_init_common_val[i].mask, - tasha_codec_reg_init_common_val[i].val); - - if (TASHA_IS_1_1(wcd9xxx) || - TASHA_IS_1_0(wcd9xxx)) - for (i = 0; i < ARRAY_SIZE(tasha_codec_reg_init_1_x_val); i++) - snd_soc_update_bits(codec, - tasha_codec_reg_init_1_x_val[i].reg, - tasha_codec_reg_init_1_x_val[i].mask, - tasha_codec_reg_init_1_x_val[i].val); - - if (TASHA_IS_1_1(wcd9xxx)) { - for (i = 0; i < ARRAY_SIZE(tasha_codec_reg_init_val_1_1); i++) - snd_soc_update_bits(codec, - tasha_codec_reg_init_val_1_1[i].reg, - tasha_codec_reg_init_val_1_1[i].mask, - tasha_codec_reg_init_val_1_1[i].val); - } else if (TASHA_IS_1_0(wcd9xxx)) { - for (i = 0; i < ARRAY_SIZE(tasha_codec_reg_init_val_1_0); i++) - snd_soc_update_bits(codec, - tasha_codec_reg_init_val_1_0[i].reg, - tasha_codec_reg_init_val_1_0[i].mask, - tasha_codec_reg_init_val_1_0[i].val); - } else if (TASHA_IS_2_0(wcd9xxx)) { - for (i = 0; i < ARRAY_SIZE(tasha_codec_reg_init_val_2_0); i++) - snd_soc_update_bits(codec, - tasha_codec_reg_init_val_2_0[i].reg, - tasha_codec_reg_init_val_2_0[i].mask, - tasha_codec_reg_init_val_2_0[i].val); - } -} - -static void tasha_update_reg_defaults(struct tasha_priv *tasha) -{ - u32 i; - struct wcd9xxx *wcd9xxx; - - wcd9xxx = tasha->wcd9xxx; - for (i = 0; i < ARRAY_SIZE(tasha_codec_reg_defaults); i++) - regmap_update_bits(wcd9xxx->regmap, - tasha_codec_reg_defaults[i].reg, - tasha_codec_reg_defaults[i].mask, - tasha_codec_reg_defaults[i].val); - - tasha->intf_type = wcd9xxx_get_intf_type(); - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) - for (i = 0; i < ARRAY_SIZE(tasha_codec_reg_i2c_defaults); i++) - regmap_update_bits(wcd9xxx->regmap, - tasha_codec_reg_i2c_defaults[i].reg, - tasha_codec_reg_i2c_defaults[i].mask, - tasha_codec_reg_i2c_defaults[i].val); - -} - -static void tasha_slim_interface_init_reg(struct snd_soc_codec *codec) -{ - int i; - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - - for (i = 0; i < WCD9XXX_SLIM_NUM_PORT_REG; i++) - wcd9xxx_interface_reg_write(priv->wcd9xxx, - TASHA_SLIM_PGD_PORT_INT_EN0 + i, - 0xFF); -} - -static irqreturn_t tasha_slimbus_irq(int irq, void *data) -{ - struct tasha_priv *priv = data; - unsigned long status = 0; - int i, j, port_id, k; - u32 bit; - u8 val, int_val = 0; - bool tx, cleared; - unsigned short reg = 0; - - for (i = TASHA_SLIM_PGD_PORT_INT_STATUS_RX_0, j = 0; - i <= TASHA_SLIM_PGD_PORT_INT_STATUS_TX_1; i++, j++) { - val = wcd9xxx_interface_reg_read(priv->wcd9xxx, i); - status |= ((u32)val << (8 * j)); - } - - for_each_set_bit(j, &status, 32) { - tx = (j >= 16 ? true : false); - port_id = (tx ? j - 16 : j); - val = wcd9xxx_interface_reg_read(priv->wcd9xxx, - TASHA_SLIM_PGD_PORT_INT_RX_SOURCE0 + j); - if (val) { - if (!tx) - reg = TASHA_SLIM_PGD_PORT_INT_EN0 + - (port_id / 8); - else - reg = TASHA_SLIM_PGD_PORT_INT_TX_EN0 + - (port_id / 8); - int_val = wcd9xxx_interface_reg_read( - priv->wcd9xxx, reg); - /* - * Ignore interrupts for ports for which the - * interrupts are not specifically enabled. - */ - if (!(int_val & (1 << (port_id % 8)))) - continue; - } - if (val & TASHA_SLIM_IRQ_OVERFLOW) - pr_err_ratelimited( - "%s: overflow error on %s port %d, value %x\n", - __func__, (tx ? "TX" : "RX"), port_id, val); - if (val & TASHA_SLIM_IRQ_UNDERFLOW) - pr_err_ratelimited( - "%s: underflow error on %s port %d, value %x\n", - __func__, (tx ? "TX" : "RX"), port_id, val); - if ((val & TASHA_SLIM_IRQ_OVERFLOW) || - (val & TASHA_SLIM_IRQ_UNDERFLOW)) { - if (!tx) - reg = TASHA_SLIM_PGD_PORT_INT_EN0 + - (port_id / 8); - else - reg = TASHA_SLIM_PGD_PORT_INT_TX_EN0 + - (port_id / 8); - int_val = wcd9xxx_interface_reg_read( - priv->wcd9xxx, reg); - if (int_val & (1 << (port_id % 8))) { - int_val = int_val ^ (1 << (port_id % 8)); - wcd9xxx_interface_reg_write(priv->wcd9xxx, - reg, int_val); - } - } - if (val & TASHA_SLIM_IRQ_PORT_CLOSED) { - /* - * INT SOURCE register starts from RX to TX - * but port number in the ch_mask is in opposite way - */ - bit = (tx ? j - 16 : j + 16); - pr_debug("%s: %s port %d closed value %x, bit %u\n", - __func__, (tx ? "TX" : "RX"), port_id, val, - bit); - for (k = 0, cleared = false; k < NUM_CODEC_DAIS; k++) { - pr_debug("%s: priv->dai[%d].ch_mask = 0x%lx\n", - __func__, k, priv->dai[k].ch_mask); - if (test_and_clear_bit(bit, - &priv->dai[k].ch_mask)) { - cleared = true; - if (!priv->dai[k].ch_mask) - wake_up(&priv->dai[k].dai_wait); - /* - * There are cases when multiple DAIs - * might be using the same slimbus - * channel. Hence don't break here. - */ - } - } - WARN(!cleared, - "Couldn't find slimbus %s port %d for closing\n", - (tx ? "TX" : "RX"), port_id); - } - wcd9xxx_interface_reg_write(priv->wcd9xxx, - TASHA_SLIM_PGD_PORT_INT_CLR_RX_0 + - (j / 8), - 1 << (j % 8)); - } - - return IRQ_HANDLED; -} - -static int tasha_setup_irqs(struct tasha_priv *tasha) -{ - int ret = 0; - struct snd_soc_codec *codec = tasha->codec; - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - ret = wcd9xxx_request_irq(core_res, WCD9XXX_IRQ_SLIMBUS, - tasha_slimbus_irq, "SLIMBUS Slave", tasha); - if (ret) - pr_err("%s: Failed to request irq %d\n", __func__, - WCD9XXX_IRQ_SLIMBUS); - else - tasha_slim_interface_init_reg(codec); - - return ret; -} - -static void tasha_init_slim_slave_cfg(struct snd_soc_codec *codec) -{ - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - struct afe_param_cdc_slimbus_slave_cfg *cfg; - struct wcd9xxx *wcd9xxx = priv->wcd9xxx; - uint64_t eaddr = 0; - - cfg = &priv->slimbus_slave_cfg; - cfg->minor_version = 1; - cfg->tx_slave_port_offset = 0; - cfg->rx_slave_port_offset = 16; - - memcpy(&eaddr, &wcd9xxx->slim->e_addr, sizeof(wcd9xxx->slim->e_addr)); - WARN_ON(sizeof(wcd9xxx->slim->e_addr) != 6); - cfg->device_enum_addr_lsw = eaddr & 0xFFFFFFFF; - cfg->device_enum_addr_msw = eaddr >> 32; - - dev_dbg(codec->dev, "%s: slimbus logical address 0x%llx\n", - __func__, eaddr); -} - -static void tasha_cleanup_irqs(struct tasha_priv *tasha) -{ - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - wcd9xxx_free_irq(core_res, WCD9XXX_IRQ_SLIMBUS, tasha); -} - -static int tasha_handle_pdata(struct tasha_priv *tasha, - struct wcd9xxx_pdata *pdata) -{ - struct snd_soc_codec *codec = tasha->codec; - u8 dmic_ctl_val, mad_dmic_ctl_val; - u8 anc_ctl_value; - u32 def_dmic_rate, dmic_clk_drv; - int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; - int rc = 0; - - if (!pdata) { - dev_err(codec->dev, "%s: NULL pdata\n", __func__); - return -ENODEV; - } - - /* set micbias voltage */ - vout_ctl_1 = wcd9335_get_micb_vout_ctl_val(pdata->micbias.micb1_mv); - vout_ctl_2 = wcd9335_get_micb_vout_ctl_val(pdata->micbias.micb2_mv); - vout_ctl_3 = wcd9335_get_micb_vout_ctl_val(pdata->micbias.micb3_mv); - vout_ctl_4 = wcd9335_get_micb_vout_ctl_val(pdata->micbias.micb4_mv); - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || - vout_ctl_3 < 0 || vout_ctl_4 < 0) { - rc = -EINVAL; - goto done; - } - snd_soc_update_bits(codec, WCD9335_ANA_MICB1, 0x3F, vout_ctl_1); - snd_soc_update_bits(codec, WCD9335_ANA_MICB2, 0x3F, vout_ctl_2); - snd_soc_update_bits(codec, WCD9335_ANA_MICB3, 0x3F, vout_ctl_3); - snd_soc_update_bits(codec, WCD9335_ANA_MICB4, 0x3F, vout_ctl_4); - - /* Set the DMIC sample rate */ - switch (pdata->mclk_rate) { - case TASHA_MCLK_CLK_9P6MHZ: - def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ; - break; - case TASHA_MCLK_CLK_12P288MHZ: - def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P096MHZ; - break; - default: - /* should never happen */ - dev_err(codec->dev, "%s: Invalid mclk_rate %d\n", - __func__, pdata->mclk_rate); - rc = -EINVAL; - goto done; - }; - - if (pdata->dmic_sample_rate == - WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED) { - dev_info(codec->dev, "%s: dmic_rate invalid default = %d\n", - __func__, def_dmic_rate); - pdata->dmic_sample_rate = def_dmic_rate; - } - if (pdata->mad_dmic_sample_rate == - WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED) { - dev_info(codec->dev, "%s: mad_dmic_rate invalid default = %d\n", - __func__, def_dmic_rate); - /* - * use dmic_sample_rate as the default for MAD - * if mad dmic sample rate is undefined - */ - pdata->mad_dmic_sample_rate = pdata->dmic_sample_rate; - } - if (pdata->ecpp_dmic_sample_rate == - WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED) { - dev_info(codec->dev, - "%s: ecpp_dmic_rate invalid default = %d\n", - __func__, def_dmic_rate); - /* - * use dmic_sample_rate as the default for ECPP DMIC - * if ecpp dmic sample rate is undefined - */ - pdata->ecpp_dmic_sample_rate = pdata->dmic_sample_rate; - } - - if (pdata->dmic_clk_drv == - WCD9XXX_DMIC_CLK_DRIVE_UNDEFINED) { - pdata->dmic_clk_drv = WCD9335_DMIC_CLK_DRIVE_DEFAULT; - dev_info(codec->dev, - "%s: dmic_clk_strength invalid, default = %d\n", - __func__, pdata->dmic_clk_drv); - } - - switch (pdata->dmic_clk_drv) { - case 2: - dmic_clk_drv = 0; - break; - case 4: - dmic_clk_drv = 1; - break; - case 8: - dmic_clk_drv = 2; - break; - case 16: - dmic_clk_drv = 3; - break; - default: - dev_err(codec->dev, - "%s: invalid dmic_clk_drv %d, using default\n", - __func__, pdata->dmic_clk_drv); - dmic_clk_drv = 0; - break; - } - - snd_soc_update_bits(codec, WCD9335_TEST_DEBUG_PAD_DRVCTL, - 0x0C, dmic_clk_drv << 2); - - /* - * Default the DMIC clk rates to mad_dmic_sample_rate, - * whereas, the anc/txfe dmic rates to dmic_sample_rate - * since the anc/txfe are independent of mad block. - */ - mad_dmic_ctl_val = tasha_get_dmic_clk_val(tasha->codec, - pdata->mclk_rate, - pdata->mad_dmic_sample_rate); - snd_soc_update_bits(codec, WCD9335_CPE_SS_DMIC0_CTL, - 0x0E, mad_dmic_ctl_val << 1); - snd_soc_update_bits(codec, WCD9335_CPE_SS_DMIC1_CTL, - 0x0E, mad_dmic_ctl_val << 1); - snd_soc_update_bits(codec, WCD9335_CPE_SS_DMIC2_CTL, - 0x0E, mad_dmic_ctl_val << 1); - - dmic_ctl_val = tasha_get_dmic_clk_val(tasha->codec, - pdata->mclk_rate, - pdata->dmic_sample_rate); - - if (dmic_ctl_val == WCD9335_DMIC_CLK_DIV_2) - anc_ctl_value = WCD9335_ANC_DMIC_X2_FULL_RATE; - else - anc_ctl_value = WCD9335_ANC_DMIC_X2_HALF_RATE; - - snd_soc_update_bits(codec, WCD9335_CDC_ANC0_MODE_2_CTL, - 0x40, anc_ctl_value << 6); - snd_soc_update_bits(codec, WCD9335_CDC_ANC0_MODE_2_CTL, - 0x20, anc_ctl_value << 5); - snd_soc_update_bits(codec, WCD9335_CDC_ANC1_MODE_2_CTL, - 0x40, anc_ctl_value << 6); - snd_soc_update_bits(codec, WCD9335_CDC_ANC1_MODE_2_CTL, - 0x20, anc_ctl_value << 5); -done: - return rc; -} - -static struct wcd_cpe_core *tasha_codec_get_cpe_core( - struct snd_soc_codec *codec) -{ - struct tasha_priv *priv = snd_soc_codec_get_drvdata(codec); - - return priv->cpe_core; -} - -static int tasha_codec_cpe_fll_update_divider( - struct snd_soc_codec *codec, u32 cpe_fll_rate) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - u32 div_val = 0, l_val = 0; - u32 computed_cpe_fll; - - if (cpe_fll_rate != CPE_FLL_CLK_75MHZ && - cpe_fll_rate != CPE_FLL_CLK_150MHZ) { - dev_err(codec->dev, - "%s: Invalid CPE fll rate request %u\n", - __func__, cpe_fll_rate); - return -EINVAL; - } - - if (wcd9xxx->mclk_rate == TASHA_MCLK_CLK_12P288MHZ) { - /* update divider to 10 and enable 5x divider */ - snd_soc_write(codec, WCD9335_CPE_FLL_USER_CTL_1, - 0x55); - div_val = 10; - } else if (wcd9xxx->mclk_rate == TASHA_MCLK_CLK_9P6MHZ) { - /* update divider to 8 and enable 2x divider */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_USER_CTL_0, - 0x7C, 0x70); - snd_soc_update_bits(codec, WCD9335_CPE_FLL_USER_CTL_1, - 0xE0, 0x20); - div_val = 8; - } else { - dev_err(codec->dev, - "%s: Invalid MCLK rate %u\n", - __func__, wcd9xxx->mclk_rate); - return -EINVAL; - } - - l_val = ((cpe_fll_rate / 1000) * div_val) / - (wcd9xxx->mclk_rate / 1000); - - /* If l_val was integer truncated, increment l_val once */ - computed_cpe_fll = (wcd9xxx->mclk_rate / div_val) * l_val; - if (computed_cpe_fll < cpe_fll_rate) - l_val++; - - - /* update L value LSB and MSB */ - snd_soc_write(codec, WCD9335_CPE_FLL_L_VAL_CTL_0, - (l_val & 0xFF)); - snd_soc_write(codec, WCD9335_CPE_FLL_L_VAL_CTL_1, - ((l_val >> 8) & 0xFF)); - - tasha->current_cpe_clk_freq = cpe_fll_rate; - dev_dbg(codec->dev, - "%s: updated l_val to %u for cpe_clk %u and mclk %u\n", - __func__, l_val, cpe_fll_rate, wcd9xxx->mclk_rate); - - return 0; -} - -static int __tasha_cdc_change_cpe_clk(struct snd_soc_codec *codec, - u32 clk_freq) -{ - int ret = 0; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (!tasha_cdc_is_svs_enabled(tasha)) { - dev_dbg(codec->dev, - "%s: SVS not enabled or tasha is not 2p0, return\n", - __func__); - return 0; - } - dev_dbg(codec->dev, "%s: clk_freq = %u\n", __func__, clk_freq); - - if (clk_freq == CPE_FLL_CLK_75MHZ) { - /* Change to SVS */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x08, 0x08); - if (tasha_codec_cpe_fll_update_divider(codec, clk_freq)) { - ret = -EINVAL; - goto done; - } - - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x10, 0x10); - - clear_bit(CPE_NOMINAL, &tasha->status_mask); - tasha_codec_update_sido_voltage(tasha, sido_buck_svs_voltage); - - } else if (clk_freq == CPE_FLL_CLK_150MHZ) { - /* change to nominal */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x08, 0x08); - - set_bit(CPE_NOMINAL, &tasha->status_mask); - tasha_codec_update_sido_voltage(tasha, SIDO_VOLTAGE_NOMINAL_MV); - - if (tasha_codec_cpe_fll_update_divider(codec, clk_freq)) { - ret = -EINVAL; - goto done; - } - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x10, 0x10); - } else { - dev_err(codec->dev, - "%s: Invalid clk_freq request %d for CPE FLL\n", - __func__, clk_freq); - ret = -EINVAL; - } - -done: - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x10, 0x00); - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x08, 0x00); - return ret; -} - - -static int tasha_codec_cpe_fll_enable(struct snd_soc_codec *codec, - bool enable) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u8 clk_sel_reg_val = 0x00; - - dev_dbg(codec->dev, "%s: enable = %s\n", - __func__, enable ? "true" : "false"); - - if (enable) { - if (tasha_cdc_is_svs_enabled(tasha)) { - /* FLL enable is always at SVS */ - if (__tasha_cdc_change_cpe_clk(codec, - CPE_FLL_CLK_75MHZ)) { - dev_err(codec->dev, - "%s: clk change to %d failed\n", - __func__, CPE_FLL_CLK_75MHZ); - return -EINVAL; - } - } else { - if (tasha_codec_cpe_fll_update_divider(codec, - CPE_FLL_CLK_75MHZ)) { - dev_err(codec->dev, - "%s: clk change to %d failed\n", - __func__, CPE_FLL_CLK_75MHZ); - return -EINVAL; - } - } - - if (TASHA_IS_1_0(wcd9xxx)) { - tasha_cdc_mclk_enable(codec, true, false); - clk_sel_reg_val = 0x02; - } - - /* Setup CPE reference clk */ - snd_soc_update_bits(codec, WCD9335_ANA_CLK_TOP, - 0x02, clk_sel_reg_val); - - /* enable CPE FLL reference clk */ - snd_soc_update_bits(codec, WCD9335_ANA_CLK_TOP, - 0x01, 0x01); - - /* program the PLL */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_USER_CTL_0, - 0x01, 0x01); - - /* TEST clk setting */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_TEST_CTL_0, - 0x80, 0x80); - /* set FLL mode to HW controlled */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x60, 0x00); - snd_soc_write(codec, WCD9335_CPE_FLL_FLL_MODE, 0x80); - } else { - /* disable CPE FLL reference clk */ - snd_soc_update_bits(codec, WCD9335_ANA_CLK_TOP, - 0x01, 0x00); - /* undo TEST clk setting */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_TEST_CTL_0, - 0x80, 0x00); - /* undo FLL mode to HW control */ - snd_soc_write(codec, WCD9335_CPE_FLL_FLL_MODE, 0x00); - snd_soc_update_bits(codec, WCD9335_CPE_FLL_FLL_MODE, - 0x60, 0x20); - /* undo the PLL */ - snd_soc_update_bits(codec, WCD9335_CPE_FLL_USER_CTL_0, - 0x01, 0x00); - - if (TASHA_IS_1_0(wcd9xxx)) - tasha_cdc_mclk_enable(codec, false, false); - - /* - * FLL could get disabled while at nominal, - * scale it back to SVS - */ - if (tasha_cdc_is_svs_enabled(tasha)) - __tasha_cdc_change_cpe_clk(codec, - CPE_FLL_CLK_75MHZ); - } - - return 0; - -} - -static void tasha_cdc_query_cpe_clk_plan(void *data, - struct cpe_svc_cfg_clk_plan *clk_freq) -{ - struct snd_soc_codec *codec = data; - struct tasha_priv *tasha; - u32 cpe_clk_khz; - - if (!codec) { - pr_err("%s: Invalid codec handle\n", - __func__); - return; - } - - tasha = snd_soc_codec_get_drvdata(codec); - cpe_clk_khz = tasha->current_cpe_clk_freq / 1000; - - dev_dbg(codec->dev, - "%s: current_clk_freq = %u\n", - __func__, tasha->current_cpe_clk_freq); - - clk_freq->current_clk_feq = cpe_clk_khz; - clk_freq->num_clk_freqs = 2; - - if (tasha_cdc_is_svs_enabled(tasha)) { - clk_freq->clk_freqs[0] = CPE_FLL_CLK_75MHZ / 1000; - clk_freq->clk_freqs[1] = CPE_FLL_CLK_150MHZ / 1000; - } else { - clk_freq->clk_freqs[0] = CPE_FLL_CLK_75MHZ; - clk_freq->clk_freqs[1] = CPE_FLL_CLK_150MHZ; - } -} - -static void tasha_cdc_change_cpe_clk(void *data, - u32 clk_freq) -{ - struct snd_soc_codec *codec = data; - struct tasha_priv *tasha; - u32 cpe_clk_khz, req_freq = 0; - - if (!codec) { - pr_err("%s: Invalid codec handle\n", - __func__); - return; - } - - tasha = snd_soc_codec_get_drvdata(codec); - cpe_clk_khz = tasha->current_cpe_clk_freq / 1000; - - if (tasha_cdc_is_svs_enabled(tasha)) { - if ((clk_freq * 1000) <= CPE_FLL_CLK_75MHZ) - req_freq = CPE_FLL_CLK_75MHZ; - else - req_freq = CPE_FLL_CLK_150MHZ; - } - - dev_dbg(codec->dev, - "%s: requested clk_freq = %u, current clk_freq = %u\n", - __func__, clk_freq * 1000, - tasha->current_cpe_clk_freq); - - if (tasha_cdc_is_svs_enabled(tasha)) { - if (__tasha_cdc_change_cpe_clk(codec, req_freq)) - dev_err(codec->dev, - "%s: clock/voltage scaling failed\n", - __func__); - } -} - -static int tasha_codec_slim_reserve_bw(struct snd_soc_codec *codec, - u32 bw_ops, bool commit) -{ - struct wcd9xxx *wcd9xxx; - - if (!codec) { - pr_err("%s: Invalid handle to codec\n", - __func__); - return -EINVAL; - } - - wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!wcd9xxx) { - dev_err(codec->dev, "%s: Invalid parent drv_data\n", - __func__); - return -EINVAL; - } - - return wcd9xxx_slim_reserve_bw(wcd9xxx, bw_ops, commit); -} - -static int tasha_codec_vote_max_bw(struct snd_soc_codec *codec, - bool vote) -{ - u32 bw_ops; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) - return 0; - - mutex_lock(&tasha->sb_clk_gear_lock); - if (vote) { - tasha->ref_count++; - if (tasha->ref_count == 1) { - bw_ops = SLIM_BW_CLK_GEAR_9; - tasha_codec_slim_reserve_bw(codec, - bw_ops, true); - } - } else if (!vote && tasha->ref_count > 0) { - tasha->ref_count--; - if (tasha->ref_count == 0) { - bw_ops = SLIM_BW_UNVOTE; - tasha_codec_slim_reserve_bw(codec, - bw_ops, true); - } - }; - - dev_dbg(codec->dev, "%s Value of counter after vote or un-vote is %d\n", - __func__, tasha->ref_count); - - mutex_unlock(&tasha->sb_clk_gear_lock); - - return 0; -} - -static int tasha_cpe_err_irq_control(struct snd_soc_codec *codec, - enum cpe_err_irq_cntl_type cntl_type, u8 *status) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - u8 irq_bits; - - if (TASHA_IS_2_0(tasha->wcd9xxx)) - irq_bits = 0xFF; - else - irq_bits = 0x3F; - - if (status) - irq_bits = (*status) & irq_bits; - - switch (cntl_type) { - case CPE_ERR_IRQ_MASK: - snd_soc_update_bits(codec, - WCD9335_CPE_SS_SS_ERROR_INT_MASK, - irq_bits, irq_bits); - break; - case CPE_ERR_IRQ_UNMASK: - snd_soc_update_bits(codec, - WCD9335_CPE_SS_SS_ERROR_INT_MASK, - irq_bits, 0x00); - break; - case CPE_ERR_IRQ_CLEAR: - snd_soc_write(codec, WCD9335_CPE_SS_SS_ERROR_INT_CLEAR, - irq_bits); - break; - case CPE_ERR_IRQ_STATUS: - if (!status) - return -EINVAL; - *status = snd_soc_read(codec, - WCD9335_CPE_SS_SS_ERROR_INT_STATUS); - break; - } - - return 0; -} - -static const struct wcd_cpe_cdc_cb cpe_cb = { - .cdc_clk_en = tasha_codec_internal_rco_ctrl, - .cpe_clk_en = tasha_codec_cpe_fll_enable, - .get_afe_out_port_id = tasha_codec_get_mad_port_id, - .lab_cdc_ch_ctl = tasha_codec_enable_slimtx_mad, - .cdc_ext_clk = tasha_cdc_mclk_enable, - .bus_vote_bw = tasha_codec_vote_max_bw, - .cpe_err_irq_control = tasha_cpe_err_irq_control, -}; - -static struct cpe_svc_init_param cpe_svc_params = { - .version = CPE_SVC_INIT_PARAM_V1, - .query_freq_plans_cb = tasha_cdc_query_cpe_clk_plan, - .change_freq_plan_cb = tasha_cdc_change_cpe_clk, -}; - -static int tasha_cpe_initialize(struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd_cpe_params cpe_params; - - memset(&cpe_params, 0, - sizeof(struct wcd_cpe_params)); - cpe_params.codec = codec; - cpe_params.get_cpe_core = tasha_codec_get_cpe_core; - cpe_params.cdc_cb = &cpe_cb; - cpe_params.dbg_mode = cpe_debug_mode; - cpe_params.cdc_major_ver = CPE_SVC_CODEC_WCD9335; - cpe_params.cdc_minor_ver = CPE_SVC_CODEC_V1P0; - cpe_params.cdc_id = CPE_SVC_CODEC_WCD9335; - - cpe_params.cdc_irq_info.cpe_engine_irq = - WCD9335_IRQ_SVA_OUTBOX1; - cpe_params.cdc_irq_info.cpe_err_irq = - WCD9335_IRQ_SVA_ERROR; - cpe_params.cdc_irq_info.cpe_fatal_irqs = - TASHA_CPE_FATAL_IRQS; - - cpe_svc_params.context = codec; - cpe_params.cpe_svc_params = &cpe_svc_params; - - tasha->cpe_core = wcd_cpe_init("cpe_9335", codec, - &cpe_params); - if (IS_ERR_OR_NULL(tasha->cpe_core)) { - dev_err(codec->dev, - "%s: Failed to enable CPE\n", - __func__); - return -EINVAL; - } - - return 0; -} - -static const struct wcd_resmgr_cb tasha_resmgr_cb = { - .cdc_rco_ctrl = __tasha_codec_internal_rco_ctrl, -}; - -static int tasha_device_down(struct wcd9xxx *wcd9xxx) -{ - struct snd_soc_codec *codec; - struct tasha_priv *priv; - int count; - int i = 0; - - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - priv = snd_soc_codec_get_drvdata(codec); - snd_event_notify(priv->dev->parent, SND_EVENT_DOWN); - wcd_cpe_ssr_event(priv->cpe_core, WCD_CPE_BUS_DOWN_EVENT); - - if (!priv->swr_ctrl_data) - return -EINVAL; - - for (i = 0; i < priv->nr; i++) { - if (is_snd_event_fwk_enabled()) - swrm_wcd_notify( - priv->swr_ctrl_data[i].swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - swrm_wcd_notify(priv->swr_ctrl_data[i].swr_pdev, - SWR_DEVICE_DOWN, NULL); - } - - if (!is_snd_event_fwk_enabled()) - snd_soc_card_change_online_state(codec->component.card, 0); - for (count = 0; count < NUM_CODEC_DAIS; count++) - priv->dai[count].bus_down_in_recovery = true; - - priv->resmgr->sido_input_src = SIDO_SOURCE_INTERNAL; - - return 0; -} - -static int tasha_post_reset_cb(struct wcd9xxx *wcd9xxx) -{ - int i, ret = 0; - struct wcd9xxx *control; - struct snd_soc_codec *codec; - struct tasha_priv *tasha; - struct wcd9xxx_pdata *pdata; - - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - tasha = snd_soc_codec_get_drvdata(codec); - control = dev_get_drvdata(codec->dev->parent); - - wcd9xxx_set_power_state(tasha->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - - mutex_lock(&tasha->codec_mutex); - - tasha_slimbus_slave_port_cfg.slave_dev_intfdev_la = - control->slim_slave->laddr; - tasha_slimbus_slave_port_cfg.slave_dev_pgd_la = - control->slim->laddr; - tasha_init_slim_slave_cfg(codec); - if (tasha->machine_codec_event_cb) - tasha->machine_codec_event_cb(codec, - WCD9335_CODEC_EVENT_CODEC_UP); - if (!is_snd_event_fwk_enabled()) - snd_soc_card_change_online_state(codec->component.card, 1); - - /* Class-H Init*/ - wcd_clsh_init(&tasha->clsh_d); - - for (i = 0; i < TASHA_MAX_MICBIAS; i++) - tasha->micb_ref[i] = 0; - - tasha_update_reg_defaults(tasha); - - tasha->codec = codec; - - dev_dbg(codec->dev, "%s: MCLK Rate = %x\n", - __func__, control->mclk_rate); - - if (control->mclk_rate == TASHA_MCLK_CLK_12P288MHZ) - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x00); - else if (control->mclk_rate == TASHA_MCLK_CLK_9P6MHZ) - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x01); - tasha_codec_init_reg(codec); - - wcd_resmgr_post_ssr_v2(tasha->resmgr); - - tasha_enable_efuse_sensing(codec); - - regcache_mark_dirty(codec->component.regmap); - regcache_sync(codec->component.regmap); - - pdata = dev_get_platdata(codec->dev->parent); - ret = tasha_handle_pdata(tasha, pdata); - if (ret < 0) - dev_err(codec->dev, "%s: invalid pdata\n", __func__); - - /* Reset reference counter for voting for max bw */ - tasha->ref_count = 0; - /* MBHC Init */ - wcd_mbhc_deinit(&tasha->mbhc); - tasha->mbhc_started = false; - - /* Initialize MBHC module */ - ret = wcd_mbhc_init(&tasha->mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, TASHA_ZDET_SUPPORTED); - if (ret) - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - else - tasha_mbhc_hs_detect(codec, tasha->mbhc.mbhc_cfg); - - tasha_cleanup_irqs(tasha); - ret = tasha_setup_irqs(tasha); - if (ret) { - dev_err(codec->dev, "%s: tasha irq setup failed %d\n", - __func__, ret); - goto err; - } - - if (!tasha->swr_ctrl_data) { - ret = -EINVAL; - goto err; - } - - if (is_snd_event_fwk_enabled()) { - for (i = 0; i < tasha->nr; i++) - swrm_wcd_notify( - tasha->swr_ctrl_data[i].swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - } - - tasha_set_spkr_mode(codec, tasha->spkr_mode); - wcd_cpe_ssr_event(tasha->cpe_core, WCD_CPE_BUS_UP_EVENT); - snd_event_notify(tasha->dev->parent, SND_EVENT_UP); -err: - mutex_unlock(&tasha->codec_mutex); - return ret; -} - -static struct regulator *tasha_codec_find_ondemand_regulator( - struct snd_soc_codec *codec, const char *name) -{ - int i; - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = tasha->wcd9xxx; - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - - for (i = 0; i < wcd9xxx->num_of_supplies; ++i) { - if (pdata->regulator[i].ondemand && - wcd9xxx->supplies[i].supply && - !strcmp(wcd9xxx->supplies[i].supply, name)) - return wcd9xxx->supplies[i].consumer; - } - - dev_dbg(tasha->dev, "Warning: regulator not found:%s\n", - name); - return NULL; -} - -static void tasha_ssr_disable(struct device *dev, void *data) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - struct tasha_priv *tasha; - struct snd_soc_codec *codec; - int count = 0; - - if (!wcd9xxx) { - dev_dbg(dev, "%s: wcd9xxx pointer NULL.\n", __func__); - return; - } - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - tasha = snd_soc_codec_get_drvdata(codec); - - for (count = 0; count < NUM_CODEC_DAIS; count++) - tasha->dai[count].bus_down_in_recovery = true; -} - -static const struct snd_event_ops tasha_ssr_ops = { - .disable = tasha_ssr_disable, -}; - -static int tasha_codec_probe(struct snd_soc_codec *codec) -{ - struct wcd9xxx *control; - struct tasha_priv *tasha; - struct wcd9xxx_pdata *pdata; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int i, ret; - void *ptr = NULL; - struct regulator *supply; - - control = dev_get_drvdata(codec->dev->parent); - - dev_info(codec->dev, "%s()\n", __func__); - tasha = snd_soc_codec_get_drvdata(codec); - tasha->intf_type = wcd9xxx_get_intf_type(); - - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - control->dev_down = tasha_device_down; - control->post_reset = tasha_post_reset_cb; - control->ssr_priv = (void *)codec; - } - - /* Resource Manager post Init */ - ret = wcd_resmgr_post_init(tasha->resmgr, &tasha_resmgr_cb, codec); - if (ret) { - dev_err(codec->dev, "%s: wcd resmgr post init failed\n", - __func__); - goto err; - } - /* Class-H Init*/ - wcd_clsh_init(&tasha->clsh_d); - /* Default HPH Mode to Class-H HiFi */ - tasha->hph_mode = CLS_H_HIFI; - - tasha->codec = codec; - for (i = 0; i < COMPANDER_MAX; i++) - tasha->comp_enabled[i] = 0; - - tasha->spkr_gain_offset = RX_GAIN_OFFSET_0_DB; - tasha->intf_type = wcd9xxx_get_intf_type(); - tasha_update_reg_reset_values(codec); - pr_debug("%s: MCLK Rate = %x\n", __func__, control->mclk_rate); - if (control->mclk_rate == TASHA_MCLK_CLK_12P288MHZ) - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x00); - else if (control->mclk_rate == TASHA_MCLK_CLK_9P6MHZ) - snd_soc_update_bits(codec, WCD9335_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x01); - tasha_codec_init_reg(codec); - - tasha_enable_efuse_sensing(codec); - - pdata = dev_get_platdata(codec->dev->parent); - ret = tasha_handle_pdata(tasha, pdata); - if (ret < 0) { - pr_err("%s: bad pdata\n", __func__); - goto err; - } - - supply = tasha_codec_find_ondemand_regulator(codec, - on_demand_supply_name[ON_DEMAND_MICBIAS]); - if (supply) { - tasha->on_demand_list[ON_DEMAND_MICBIAS].supply = supply; - tasha->on_demand_list[ON_DEMAND_MICBIAS].ondemand_supply_count = - 0; - } - - tasha->fw_data = devm_kzalloc(codec->dev, - sizeof(*(tasha->fw_data)), GFP_KERNEL); - if (!tasha->fw_data) - goto err; - set_bit(WCD9XXX_ANC_CAL, tasha->fw_data->cal_bit); - set_bit(WCD9XXX_MBHC_CAL, tasha->fw_data->cal_bit); - set_bit(WCD9XXX_MAD_CAL, tasha->fw_data->cal_bit); - set_bit(WCD9XXX_VBAT_CAL, tasha->fw_data->cal_bit); - - ret = wcd_cal_create_hwdep(tasha->fw_data, - WCD9XXX_CODEC_HWDEP_NODE, codec); - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - goto err_hwdep; - } - - /* Initialize MBHC module */ - if (TASHA_IS_2_0(tasha->wcd9xxx)) { - wcd_mbhc_registers[WCD_MBHC_FSM_STATUS].reg = - WCD9335_MBHC_FSM_STATUS; - wcd_mbhc_registers[WCD_MBHC_FSM_STATUS].mask = 0x01; - } - ret = wcd_mbhc_init(&tasha->mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, TASHA_ZDET_SUPPORTED); - if (ret) { - pr_err("%s: mbhc initialization failed\n", __func__); - goto err_hwdep; - } - - ptr = devm_kzalloc(codec->dev, (sizeof(tasha_rx_chs) + - sizeof(tasha_tx_chs)), GFP_KERNEL); - if (!ptr) { - ret = -ENOMEM; - goto err_hwdep; - } - - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - snd_soc_dapm_new_controls(dapm, tasha_dapm_i2s_widgets, - ARRAY_SIZE(tasha_dapm_i2s_widgets)); - snd_soc_dapm_add_routes(dapm, audio_i2s_map, - ARRAY_SIZE(audio_i2s_map)); - for (i = 0; i < ARRAY_SIZE(tasha_i2s_dai); i++) { - INIT_LIST_HEAD(&tasha->dai[i].wcd9xxx_ch_list); - init_waitqueue_head(&tasha->dai[i].dai_wait); - } - } else if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - for (i = 0; i < NUM_CODEC_DAIS; i++) { - INIT_LIST_HEAD(&tasha->dai[i].wcd9xxx_ch_list); - init_waitqueue_head(&tasha->dai[i].dai_wait); - } - tasha_slimbus_slave_port_cfg.slave_dev_intfdev_la = - control->slim_slave->laddr; - tasha_slimbus_slave_port_cfg.slave_dev_pgd_la = - control->slim->laddr; - tasha_slimbus_slave_port_cfg.slave_port_mapping[0] = - TASHA_TX13; - tasha_init_slim_slave_cfg(codec); - } - - snd_soc_add_codec_controls(codec, impedance_detect_controls, - ARRAY_SIZE(impedance_detect_controls)); - snd_soc_add_codec_controls(codec, hph_type_detect_controls, - ARRAY_SIZE(hph_type_detect_controls)); - - snd_soc_add_codec_controls(codec, - tasha_analog_gain_controls, - ARRAY_SIZE(tasha_analog_gain_controls)); - if (tasha->is_wsa_attach) - snd_soc_add_codec_controls(codec, - tasha_spkr_wsa_controls, - ARRAY_SIZE(tasha_spkr_wsa_controls)); - control->num_rx_port = TASHA_RX_MAX; - control->rx_chs = ptr; - memcpy(control->rx_chs, tasha_rx_chs, sizeof(tasha_rx_chs)); - control->num_tx_port = TASHA_TX_MAX; - control->tx_chs = ptr + sizeof(tasha_rx_chs); - memcpy(control->tx_chs, tasha_tx_chs, sizeof(tasha_tx_chs)); - - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "AIF2 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF2 Capture"); - - if (tasha->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - snd_soc_dapm_ignore_suspend(dapm, "AIF3 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF3 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF Mix Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 MAD TX"); - snd_soc_dapm_ignore_suspend(dapm, "VIfeed"); - snd_soc_dapm_ignore_suspend(dapm, "AIF5 CPE TX"); - } - - snd_soc_dapm_sync(dapm); - - ret = tasha_setup_irqs(tasha); - if (ret) { - pr_err("%s: tasha irq setup failed %d\n", __func__, ret); - goto err_pdata; - } - - ret = tasha_cpe_initialize(codec); - if (ret) { - dev_err(codec->dev, - "%s: cpe initialization failed, err = %d\n", - __func__, ret); - /* Do not fail probe if CPE failed */ - ret = 0; - } - - for (i = 0; i < TASHA_NUM_DECIMATORS; i++) { - tasha->tx_hpf_work[i].tasha = tasha; - tasha->tx_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&tasha->tx_hpf_work[i].dwork, - tasha_tx_hpf_corner_freq_callback); - } - - for (i = 0; i < TASHA_NUM_DECIMATORS; i++) { - tasha->tx_mute_dwork[i].tasha = tasha; - tasha->tx_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&tasha->tx_mute_dwork[i].dwork, - tasha_tx_mute_update_callback); - } - - tasha->spk_anc_dwork.tasha = tasha; - INIT_DELAYED_WORK(&tasha->spk_anc_dwork.dwork, - tasha_spk_anc_update_callback); - - mutex_lock(&tasha->codec_mutex); - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT1"); - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT2"); - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT1 PA"); - snd_soc_dapm_disable_pin(dapm, "ANC LINEOUT2 PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR"); - snd_soc_dapm_disable_pin(dapm, "ANC SPK1 PA"); - mutex_unlock(&tasha->codec_mutex); - snd_soc_dapm_sync(dapm); - - return ret; - -err_pdata: - devm_kfree(codec->dev, ptr); - control->rx_chs = NULL; - control->tx_chs = NULL; -err_hwdep: - devm_kfree(codec->dev, tasha->fw_data); - tasha->fw_data = NULL; -err: - return ret; -} - -static int tasha_codec_remove(struct snd_soc_codec *codec) -{ - struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *control; - - control = dev_get_drvdata(codec->dev->parent); - control->num_rx_port = 0; - control->num_tx_port = 0; - control->rx_chs = NULL; - control->tx_chs = NULL; - - tasha_cleanup_irqs(tasha); - /* Cleanup MBHC */ - wcd_mbhc_deinit(&tasha->mbhc); - /* Cleanup resmgr */ - - return 0; -} - -static struct regmap *tasha_get_regmap(struct device *dev) -{ - struct wcd9xxx *control = dev_get_drvdata(dev->parent); - - return control->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_tasha = { - .probe = tasha_codec_probe, - .remove = tasha_codec_remove, - .get_regmap = tasha_get_regmap, - .component_driver = { - .controls = tasha_snd_controls, - .num_controls = ARRAY_SIZE(tasha_snd_controls), - .dapm_widgets = tasha_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tasha_dapm_widgets), - .dapm_routes = audio_map, - .num_dapm_routes = ARRAY_SIZE(audio_map), - }, -}; - -#ifdef CONFIG_PM -static int tasha_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tasha_priv *tasha = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system suspend\n", __func__); - if (cancel_delayed_work_sync(&tasha->power_gate_work)) - tasha_codec_power_gate_digital_core(tasha); - - return 0; -} - -static int tasha_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tasha_priv *tasha = platform_get_drvdata(pdev); - - if (!tasha) { - dev_err(dev, "%s: tasha private data is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(dev, "%s: system resume\n", __func__); - return 0; -} - -static const struct dev_pm_ops tasha_pm_ops = { - .suspend = tasha_suspend, - .resume = tasha_resume, -}; -#endif - -static int tasha_swrm_read(void *handle, int reg) -{ - struct tasha_priv *tasha; - struct wcd9xxx *wcd9xxx; - unsigned short swr_rd_addr_base; - unsigned short swr_rd_data_base; - int val, ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - tasha = (struct tasha_priv *)handle; - wcd9xxx = tasha->wcd9xxx; - - dev_dbg(tasha->dev, "%s: Reading soundwire register, 0x%x\n", - __func__, reg); - swr_rd_addr_base = WCD9335_SWR_AHB_BRIDGE_RD_ADDR_0; - swr_rd_data_base = WCD9335_SWR_AHB_BRIDGE_RD_DATA_0; - /* read_lock */ - mutex_lock(&tasha->swr_read_lock); - ret = regmap_bulk_write(wcd9xxx->regmap, swr_rd_addr_base, - (u8 *)®, 4); - if (ret < 0) { - pr_err("%s: RD Addr Failure\n", __func__); - goto err; - } - /* Check for RD status */ - ret = regmap_bulk_read(wcd9xxx->regmap, swr_rd_data_base, - (u8 *)&val, 4); - if (ret < 0) { - pr_err("%s: RD Data Failure\n", __func__); - goto err; - } - ret = val; -err: - /* read_unlock */ - mutex_unlock(&tasha->swr_read_lock); - return ret; -} - -static int tasha_swrm_i2s_bulk_write(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_reg_val *bulk_reg, - size_t len) -{ - int i, ret = 0; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - - swr_wr_addr_base = WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD9335_SWR_AHB_BRIDGE_WR_DATA_0; - - for (i = 0; i < (len * 2); i += 2) { - /* First Write the Data to register */ - ret = regmap_bulk_write(wcd9xxx->regmap, - swr_wr_data_base, bulk_reg[i].buf, 4); - if (ret < 0) { - dev_err(wcd9xxx->dev, "%s: WR Data Failure\n", - __func__); - break; - } - /* Next Write Address */ - ret = regmap_bulk_write(wcd9xxx->regmap, - swr_wr_addr_base, bulk_reg[i+1].buf, 4); - if (ret < 0) { - dev_err(wcd9xxx->dev, "%s: WR Addr Failure\n", - __func__); - break; - } - } - return ret; -} - -static int tasha_swrm_bulk_write(void *handle, u32 *reg, u32 *val, size_t len) -{ - struct tasha_priv *tasha; - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_reg_val *bulk_reg; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - int i, j, ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - if (len <= 0) { - pr_err("%s: Invalid size: %zu\n", __func__, len); - return -EINVAL; - } - tasha = (struct tasha_priv *)handle; - wcd9xxx = tasha->wcd9xxx; - - swr_wr_addr_base = WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD9335_SWR_AHB_BRIDGE_WR_DATA_0; - - bulk_reg = kzalloc((2 * len * sizeof(struct wcd9xxx_reg_val)), - GFP_KERNEL); - if (!bulk_reg) - return -ENOMEM; - - for (i = 0, j = 0; i < (len * 2); i += 2, j++) { - bulk_reg[i].reg = swr_wr_data_base; - bulk_reg[i].buf = (u8 *)(&val[j]); - bulk_reg[i].bytes = 4; - bulk_reg[i+1].reg = swr_wr_addr_base; - bulk_reg[i+1].buf = (u8 *)(®[j]); - bulk_reg[i+1].bytes = 4; - } - mutex_lock(&tasha->swr_write_lock); - - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) { - ret = tasha_swrm_i2s_bulk_write(wcd9xxx, bulk_reg, len); - if (ret) { - dev_err(tasha->dev, "%s: i2s bulk write failed, ret: %d\n", - __func__, ret); - } - } else { - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, - (len * 2), false); - if (ret) { - dev_err(tasha->dev, "%s: swrm bulk write failed, ret: %d\n", - __func__, ret); - } - } - - mutex_unlock(&tasha->swr_write_lock); - kfree(bulk_reg); - - return ret; -} - -static int tasha_swrm_write(void *handle, int reg, int val) -{ - struct tasha_priv *tasha; - struct wcd9xxx *wcd9xxx; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - struct wcd9xxx_reg_val bulk_reg[2]; - int ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - tasha = (struct tasha_priv *)handle; - wcd9xxx = tasha->wcd9xxx; - - swr_wr_addr_base = WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD9335_SWR_AHB_BRIDGE_WR_DATA_0; - - /* First Write the Data to register */ - bulk_reg[0].reg = swr_wr_data_base; - bulk_reg[0].buf = (u8 *)(&val); - bulk_reg[0].bytes = 4; - bulk_reg[1].reg = swr_wr_addr_base; - bulk_reg[1].buf = (u8 *)(®); - bulk_reg[1].bytes = 4; - - mutex_lock(&tasha->swr_write_lock); - - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) { - ret = tasha_swrm_i2s_bulk_write(wcd9xxx, bulk_reg, 1); - if (ret) { - dev_err(tasha->dev, "%s: i2s swrm write failed, ret: %d\n", - __func__, ret); - } - } else { - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, 2, false); - if (ret < 0) - pr_err("%s: WR Data Failure\n", __func__); - } - - mutex_unlock(&tasha->swr_write_lock); - return ret; -} - -static int tasha_swrm_clock(void *handle, bool enable) -{ - struct tasha_priv *tasha = (struct tasha_priv *) handle; - - mutex_lock(&tasha->swr_clk_lock); - - dev_dbg(tasha->dev, "%s: swrm clock %s\n", - __func__, (enable?"enable" : "disable")); - if (enable) { - tasha->swr_clk_users++; - if (tasha->swr_clk_users == 1) { - if (TASHA_IS_2_0(tasha->wcd9xxx)) - regmap_update_bits( - tasha->wcd9xxx->regmap, - WCD9335_TEST_DEBUG_NPL_DLY_TEST_1, - 0x10, 0x00); - __tasha_cdc_mclk_enable(tasha, true); - regmap_update_bits(tasha->wcd9xxx->regmap, - WCD9335_CDC_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - } - } else { - tasha->swr_clk_users--; - if (tasha->swr_clk_users == 0) { - regmap_update_bits(tasha->wcd9xxx->regmap, - WCD9335_CDC_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - __tasha_cdc_mclk_enable(tasha, false); - if (TASHA_IS_2_0(tasha->wcd9xxx)) - regmap_update_bits( - tasha->wcd9xxx->regmap, - WCD9335_TEST_DEBUG_NPL_DLY_TEST_1, - 0x10, 0x10); - } - } - dev_dbg(tasha->dev, "%s: swrm clock users %d\n", - __func__, tasha->swr_clk_users); - mutex_unlock(&tasha->swr_clk_lock); - return 0; -} - -static int tasha_swrm_handle_irq(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action) -{ - struct tasha_priv *tasha; - int ret = 0; - struct wcd9xxx *wcd9xxx; - - if (!handle) { - pr_err("%s: null handle received\n", __func__); - return -EINVAL; - } - tasha = (struct tasha_priv *) handle; - wcd9xxx = tasha->wcd9xxx; - - if (action) { - ret = wcd9xxx_request_irq(&wcd9xxx->core_res, - WCD9335_IRQ_SOUNDWIRE, - swrm_irq_handler, - "Tasha SWR Master", swrm_handle); - if (ret) - dev_err(tasha->dev, "%s: Failed to request irq %d\n", - __func__, WCD9335_IRQ_SOUNDWIRE); - } else - wcd9xxx_free_irq(&wcd9xxx->core_res, WCD9335_IRQ_SOUNDWIRE, - swrm_handle); - - return ret; -} - -static void tasha_add_child_devices(struct work_struct *work) -{ - struct tasha_priv *tasha; - struct platform_device *pdev; - struct device_node *node; - struct wcd9xxx *wcd9xxx; - struct tasha_swr_ctrl_data *swr_ctrl_data = NULL, *temp; - int ret, ctrl_num = 0; - struct wcd_swr_ctrl_platform_data *platdata; - char plat_dev_name[WCD9335_STRING_LEN]; - - tasha = container_of(work, struct tasha_priv, - tasha_add_child_devices_work); - if (!tasha) { - pr_err("%s: Memory for WCD9335 does not exist\n", - __func__); - return; - } - wcd9xxx = tasha->wcd9xxx; - if (!wcd9xxx) { - pr_err("%s: Memory for WCD9XXX does not exist\n", - __func__); - return; - } - if (!wcd9xxx->dev->of_node) { - pr_err("%s: DT node for wcd9xxx does not exist\n", - __func__); - return; - } - - platdata = &tasha->swr_plat_data; - tasha->child_count = 0; - - for_each_child_of_node(wcd9xxx->dev->of_node, node) { - if (!strcmp(node->name, "swr_master")) - strlcpy(plat_dev_name, "tasha_swr_ctrl", - (WCD9335_STRING_LEN - 1)); - else if (strnstr(node->name, "msm_cdc_pinctrl", - strlen("msm_cdc_pinctrl")) != NULL) - strlcpy(plat_dev_name, node->name, - (WCD9335_STRING_LEN - 1)); - else - continue; - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(wcd9xxx->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err; - } - pdev->dev.parent = tasha->dev; - pdev->dev.of_node = node; - - if (!strcmp(node->name, "swr_master")) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto fail_pdev_add; - } - tasha->is_wsa_attach = true; - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto fail_pdev_add; - } - - if (!strcmp(node->name, "swr_master")) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct tasha_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - dev_err(wcd9xxx->dev, "out of memory\n"); - ret = -ENOMEM; - goto err; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - tasha->nr = ctrl_num; - tasha->swr_ctrl_data = swr_ctrl_data; - } - - if (tasha->child_count < WCD9335_CHILD_DEVICES_MAX) - tasha->pdev_child_devices[tasha->child_count++] = pdev; - else - goto err; - } - - return; -fail_pdev_add: - platform_device_put(pdev); -err: - return; -} - -/* - * tasha_codec_ver: to get tasha codec version - * @codec: handle to snd_soc_codec * - * return enum codec_variant - version - */ -enum codec_variant tasha_codec_ver(void) -{ - return codec_ver; -} -EXPORT_SYMBOL(tasha_codec_ver); - -static int __tasha_enable_efuse_sensing(struct tasha_priv *tasha) -{ - int val, rc; - - __tasha_cdc_mclk_enable(tasha, true); - - regmap_update_bits(tasha->wcd9xxx->regmap, - WCD9335_CHIP_TIER_CTRL_EFUSE_CTL, 0x1E, 0x20); - regmap_update_bits(tasha->wcd9xxx->regmap, - WCD9335_CHIP_TIER_CTRL_EFUSE_CTL, 0x01, 0x01); - - /* - * 5ms sleep required after enabling efuse control - * before checking the status. - */ - usleep_range(5000, 5500); - rc = regmap_read(tasha->wcd9xxx->regmap, - WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS, &val); - - if (rc || (!(val & 0x01))) - WARN(1, "%s: Efuse sense is not complete\n", __func__); - - __tasha_cdc_mclk_enable(tasha, false); - - return rc; -} - -void tasha_get_codec_ver(struct tasha_priv *tasha) -{ - int i; - int val; - struct tasha_reg_mask_val codec_reg[] = { - {WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT10, 0xFF, 0xFF}, - {WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT11, 0xFF, 0x83}, - {WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT12, 0xFF, 0x0A}, - }; - - __tasha_enable_efuse_sensing(tasha); - for (i = 0; i < ARRAY_SIZE(codec_reg); i++) { - regmap_read(tasha->wcd9xxx->regmap, codec_reg[i].reg, &val); - if (!(val && codec_reg[i].val)) { - codec_ver = WCD9335; - goto ret; - } - } - codec_ver = WCD9326; -ret: - pr_debug("%s: codec is %d\n", __func__, codec_ver); -} -EXPORT_SYMBOL(tasha_get_codec_ver); - -static int tasha_probe(struct platform_device *pdev) -{ - int ret = 0; - struct tasha_priv *tasha; - struct clk *wcd_ext_clk, *wcd_native_clk; - struct wcd9xxx_resmgr_v2 *resmgr; - struct wcd9xxx_power_region *cdc_pwr; - - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) { - if (apr_get_subsys_state() == APR_SUBSYS_DOWN) { - dev_err(&pdev->dev, "%s: dsp down\n", __func__); - return -EPROBE_DEFER; - } - } - - tasha = devm_kzalloc(&pdev->dev, sizeof(struct tasha_priv), - GFP_KERNEL); - if (!tasha) - return -ENOMEM; - platform_set_drvdata(pdev, tasha); - - tasha->wcd9xxx = dev_get_drvdata(pdev->dev.parent); - tasha->dev = &pdev->dev; - INIT_DELAYED_WORK(&tasha->power_gate_work, tasha_codec_power_gate_work); - mutex_init(&tasha->power_lock); - mutex_init(&tasha->sido_lock); - INIT_WORK(&tasha->tasha_add_child_devices_work, - tasha_add_child_devices); - BLOCKING_INIT_NOTIFIER_HEAD(&tasha->notifier); - mutex_init(&tasha->micb_lock); - mutex_init(&tasha->swr_read_lock); - mutex_init(&tasha->swr_write_lock); - mutex_init(&tasha->swr_clk_lock); - mutex_init(&tasha->sb_clk_gear_lock); - mutex_init(&tasha->mclk_lock); - - cdc_pwr = devm_kzalloc(&pdev->dev, sizeof(struct wcd9xxx_power_region), - GFP_KERNEL); - if (!cdc_pwr) { - ret = -ENOMEM; - goto err_cdc_pwr; - } - tasha->wcd9xxx->wcd9xxx_pwr[WCD9XXX_DIG_CORE_REGION_1] = cdc_pwr; - cdc_pwr->pwr_collapse_reg_min = TASHA_DIG_CORE_REG_MIN; - cdc_pwr->pwr_collapse_reg_max = TASHA_DIG_CORE_REG_MAX; - wcd9xxx_set_power_state(tasha->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - - mutex_init(&tasha->codec_mutex); - /* - * Init resource manager so that if child nodes such as SoundWire - * requests for clock, resource manager can honor the request - */ - resmgr = wcd_resmgr_init(&tasha->wcd9xxx->core_res, NULL); - if (IS_ERR(resmgr)) { - ret = PTR_ERR(resmgr); - dev_err(&pdev->dev, "%s: Failed to initialize wcd resmgr\n", - __func__); - goto err_resmgr; - } - tasha->resmgr = resmgr; - tasha->swr_plat_data.handle = (void *) tasha; - tasha->swr_plat_data.read = tasha_swrm_read; - tasha->swr_plat_data.write = tasha_swrm_write; - tasha->swr_plat_data.bulk_write = tasha_swrm_bulk_write; - tasha->swr_plat_data.clk = tasha_swrm_clock; - tasha->swr_plat_data.handle_irq = tasha_swrm_handle_irq; - - /* Register for Clock */ - wcd_ext_clk = clk_get(tasha->wcd9xxx->dev, "wcd_clk"); - if (IS_ERR(wcd_ext_clk)) { - dev_err(tasha->wcd9xxx->dev, "%s: clk get %s failed\n", - __func__, "wcd_ext_clk"); - goto err_clk; - } - tasha->wcd_ext_clk = wcd_ext_clk; - tasha->sido_voltage = SIDO_VOLTAGE_NOMINAL_MV; - set_bit(AUDIO_NOMINAL, &tasha->status_mask); - tasha->sido_ccl_cnt = 0; - - /* Register native clk for 44.1 playback */ - wcd_native_clk = clk_get(tasha->wcd9xxx->dev, "wcd_native_clk"); - if (IS_ERR(wcd_native_clk)) - dev_dbg(tasha->wcd9xxx->dev, "%s: clk get %s failed\n", - __func__, "wcd_native_clk"); - else - tasha->wcd_native_clk = wcd_native_clk; - - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_tasha, - tasha_dai, ARRAY_SIZE(tasha_dai)); - else if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_tasha, - tasha_i2s_dai, - ARRAY_SIZE(tasha_i2s_dai)); - else - ret = -EINVAL; - if (ret) { - dev_err(&pdev->dev, "%s: Codec registration failed, ret = %d\n", - __func__, ret); - goto err_cdc_reg; - } - /* Update codec register default values */ - tasha_update_reg_defaults(tasha); - schedule_work(&tasha->tasha_add_child_devices_work); - tasha_get_codec_ver(tasha); - ret = snd_event_client_register(pdev->dev.parent, &tasha_ssr_ops, NULL); - if (!ret) { - snd_event_notify(pdev->dev.parent, SND_EVENT_UP); - } else { - pr_err("%s: Registration with SND event fwk failed ret = %d\n", - __func__, ret); - ret = 0; - } - - dev_info(&pdev->dev, "%s: Tasha driver probe done\n", __func__); - return ret; - -err_cdc_reg: - clk_put(tasha->wcd_ext_clk); - if (tasha->wcd_native_clk) - clk_put(tasha->wcd_native_clk); -err_clk: - wcd_resmgr_remove(tasha->resmgr); -err_resmgr: - devm_kfree(&pdev->dev, cdc_pwr); -err_cdc_pwr: - mutex_destroy(&tasha->mclk_lock); - devm_kfree(&pdev->dev, tasha); - return ret; -} - -static int tasha_remove(struct platform_device *pdev) -{ - struct tasha_priv *tasha; - int count = 0; - - tasha = platform_get_drvdata(pdev); - - if (!tasha) - return -EINVAL; - - snd_event_client_deregister(pdev->dev.parent); - for (count = 0; count < tasha->child_count && - count < WCD9335_CHILD_DEVICES_MAX; count++) - platform_device_unregister(tasha->pdev_child_devices[count]); - - mutex_destroy(&tasha->codec_mutex); - clk_put(tasha->wcd_ext_clk); - if (tasha->wcd_native_clk) - clk_put(tasha->wcd_native_clk); - mutex_destroy(&tasha->mclk_lock); - mutex_destroy(&tasha->sb_clk_gear_lock); - snd_soc_unregister_codec(&pdev->dev); - devm_kfree(&pdev->dev, tasha); - return 0; -} - -static struct platform_driver tasha_codec_driver = { - .probe = tasha_probe, - .remove = tasha_remove, - .driver = { - .name = "tasha_codec", - .owner = THIS_MODULE, -#ifdef CONFIG_PM - .pm = &tasha_pm_ops, -#endif - }, -}; - -module_platform_driver(tasha_codec_driver); - -MODULE_DESCRIPTION("Tasha Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9335.h b/techpack/audio/asoc/codecs/wcd9335.h deleted file mode 100644 index f5f103853b30..000000000000 --- a/techpack/audio/asoc/codecs/wcd9335.h +++ /dev/null @@ -1,238 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef WCD9335_H -#define WCD9335_H - -#include -#include -#include -#include "wcd9xxx-slimslave.h" -#include "wcd-mbhc-v2.h" - -#define TASHA_REG_VAL(reg, val) {reg, 0, val} - -#define TASHA_REGISTER_START_OFFSET 0x800 -#define TASHA_SB_PGD_PORT_RX_BASE 0x40 -#define TASHA_SB_PGD_PORT_TX_BASE 0x50 - -#define TASHA_ZDET_SUPPORTED true -/* z value defined in milliohm */ -#define TASHA_ZDET_VAL_32 32000 -#define TASHA_ZDET_VAL_400 400000 -#define TASHA_ZDET_VAL_1200 1200000 -#define TASHA_ZDET_VAL_100K 100000000 -/* z floating defined in ohms */ -#define TASHA_ZDET_FLOATING_IMPEDANCE 0x0FFFFFFE - -#define WCD9335_DMIC_CLK_DIV_2 0x0 -#define WCD9335_DMIC_CLK_DIV_3 0x1 -#define WCD9335_DMIC_CLK_DIV_4 0x2 -#define WCD9335_DMIC_CLK_DIV_6 0x3 -#define WCD9335_DMIC_CLK_DIV_8 0x4 -#define WCD9335_DMIC_CLK_DIV_16 0x5 -#define WCD9335_DMIC_CLK_DRIVE_DEFAULT 0x02 - -#define WCD9335_ANC_DMIC_X2_FULL_RATE 1 -#define WCD9335_ANC_DMIC_X2_HALF_RATE 0 - -/* Number of input and output Slimbus port */ -enum { - TASHA_RX0 = 0, - TASHA_RX1, - TASHA_RX2, - TASHA_RX3, - TASHA_RX4, - TASHA_RX5, - TASHA_RX6, - TASHA_RX7, - TASHA_RX8, - TASHA_RX9, - TASHA_RX10, - TASHA_RX11, - TASHA_RX12, - TASHA_RX_MAX, -}; - -enum { - TASHA_TX0 = 0, - TASHA_TX1, - TASHA_TX2, - TASHA_TX3, - TASHA_TX4, - TASHA_TX5, - TASHA_TX6, - TASHA_TX7, - TASHA_TX8, - TASHA_TX9, - TASHA_TX10, - TASHA_TX11, - TASHA_TX12, - TASHA_TX13, - TASHA_TX14, - TASHA_TX15, - TASHA_TX_MAX, -}; - -enum wcd9335_codec_event { - WCD9335_CODEC_EVENT_CODEC_UP = 0, -}; - -enum tasha_on_demand_supply { - ON_DEMAND_MICBIAS = 0, - ON_DEMAND_SUPPLIES_MAX, -}; - -/* structure used to put the defined - * ondemand supply for codec - * and count being used. - */ -struct on_demand_supply { - struct regulator *supply; - int ondemand_supply_count; -}; - -/* Dai data structure holds the - * dai specific info like rate, - * channel number etc. - */ -struct tasha_codec_dai_data { - u32 rate; - u32 *ch_num; - u32 ch_act; - u32 ch_tot; -}; - -/* Structure used to update codec - * register defaults after reset - */ -struct tasha_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -/* Selects compander and smart boost settings - * for a given speaker mode - */ -enum { - SPKR_MODE_DEFAULT, - SPKR_MODE_1, /* COMP Gain = 12dB, Smartboost Max = 5.5V */ -}; - -/* - * Rx path gain offsets - */ -enum { - RX_GAIN_OFFSET_M1P5_DB, - RX_GAIN_OFFSET_0_DB, -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD9335) -extern void *tasha_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type); -extern int tasha_cdc_mclk_enable(struct snd_soc_codec *codec, int enable, - bool dapm); -extern int tasha_cdc_mclk_tx_enable(struct snd_soc_codec *codec, int enable, - bool dapm); -extern int tasha_enable_efuse_sensing(struct snd_soc_codec *codec); -extern int tasha_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg); -extern void tasha_mbhc_hs_detect_exit(struct snd_soc_codec *codec); -extern void tasha_mbhc_zdet_gpio_ctrl( - int (*zdet_gpio_cb)(struct snd_soc_codec *codec, bool high), - struct snd_soc_codec *codec); -extern int tasha_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -extern void tasha_event_register( - int (*machine_event_cb)(struct snd_soc_codec *codec, - enum wcd9335_codec_event), - struct snd_soc_codec *codec); -extern int tasha_codec_enable_standalone_micbias(struct snd_soc_codec *codec, - int micb_num, - bool enable); -extern int tasha_set_spkr_mode(struct snd_soc_codec *codec, int mode); -extern int tasha_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset); -extern enum codec_variant tasha_codec_ver(void); -#else /* CONFIG_SND_SOC_WCD9335 */ -static inline void *tasha_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type) -{ - return NULL; -} -static inline int tasha_cdc_mclk_enable(struct snd_soc_codec *codec, - int enable, - bool dapm) -{ - return 0; -} -static inline int tasha_cdc_mclk_tx_enable(struct snd_soc_codec *codec, - int enable, - bool dapm) -{ - return 0; -} -static inline int tasha_enable_efuse_sensing(struct snd_soc_codec *codec) -{ - return 0; -} -static inline int tasha_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline void tasha_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ - -} -static inline void tasha_mbhc_zdet_gpio_ctrl( - int (*zdet_gpio_cb)(struct snd_soc_codec *codec, bool high), - struct snd_soc_codec *codec) -{ - -} -static inline int tasha_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -static inline void tasha_event_register( - int (*machine_event_cb)(struct snd_soc_codec *codec, - enum wcd9335_codec_event), - struct snd_soc_codec *codec) -{ - -} -static inline int tasha_codec_enable_standalone_micbias( - struct snd_soc_codec *codec, - int micb_num, - bool enable) -{ - return 0; -} -static inline int tasha_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - return 0; -} -static inline int tasha_set_spkr_gain_offset(struct snd_soc_codec *codec, - int offset) -{ - return 0; -} -static inline enum codec_variant tasha_codec_ver(void) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_WCD9335 */ -#endif diff --git a/techpack/audio/asoc/codecs/wcd9335_irq.h b/techpack/audio/asoc/codecs/wcd9335_irq.h deleted file mode 100644 index c666d3144359..000000000000 --- a/techpack/audio/asoc/codecs/wcd9335_irq.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD9335_IRQ_H_ -#define __WCD9335_IRQ_H_ - -enum { - /* INTR_REG 0 */ - WCD9335_IRQ_FLL_LOCK_LOSS = 1, - WCD9335_IRQ_HPH_PA_OCPL_FAULT, - WCD9335_IRQ_HPH_PA_OCPR_FAULT, - WCD9335_IRQ_EAR_PA_OCP_FAULT, - WCD9335_IRQ_HPH_PA_CNPL_COMPLETE, - WCD9335_IRQ_HPH_PA_CNPR_COMPLETE, - WCD9335_IRQ_EAR_PA_CNP_COMPLETE, - /* INTR_REG 1 */ - WCD9335_IRQ_MBHC_SW_DET, - WCD9335_IRQ_MBHC_ELECT_INS_REM_DET, - WCD9335_IRQ_MBHC_BUTTON_PRESS_DET, - WCD9335_IRQ_MBHC_BUTTON_RELEASE_DET, - WCD9335_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - WCD9335_IRQ_RESERVED_0, - WCD9335_IRQ_RESERVED_1, - WCD9335_IRQ_RESERVED_2, - /* INTR_REG 2 */ - WCD9335_IRQ_LINE_PA1_CNP_COMPLETE, - WCD9335_IRQ_LINE_PA2_CNP_COMPLETE, - WCD9335_IRQ_LINE_PA3_CNP_COMPLETE, - WCD9335_IRQ_LINE_PA4_CNP_COMPLETE, - WCD9335_IRQ_SOUNDWIRE, - WCD9335_IRQ_VDD_DIG_RAMP_COMPLETE, - WCD9335_IRQ_RCO_ERROR, - WCD9335_IRQ_SVA_ERROR, - /* INTR_REG 3 */ - WCD9335_IRQ_MAD_AUDIO, - WCD9335_IRQ_MAD_BEACON, - WCD9335_IRQ_MAD_ULTRASOUND, - WCD9335_IRQ_VBAT_ATTACK, - WCD9335_IRQ_VBAT_RESTORE, - WCD9335_IRQ_SVA_OUTBOX1, - WCD9335_IRQ_SVA_OUTBOX2, - WCD9335_NUM_IRQS, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9335_registers.h b/techpack/audio/asoc/codecs/wcd9335_registers.h deleted file mode 100644 index c50430d4278f..000000000000 --- a/techpack/audio/asoc/codecs/wcd9335_registers.h +++ /dev/null @@ -1,1348 +0,0 @@ -/* - * Copyright (c) 2015, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD9335_REGISTERS_H -#define _WCD9335_REGISTERS_H - -#define WCD9335_PAGE_SIZE 256 -#define WCD9335_NUM_PAGES 256 - -extern const u8 *wcd9335_reg[WCD9335_NUM_PAGES]; - -enum { - PAGE_0 = 0, - PAGE_1, - PAGE_2, - PAGE_6 = 6, - PAGE_10 = 0xA, - PAGE_11, - PAGE_12, - PAGE_13, - PAGE_0X80, -}; - -/* Page-0 Registers */ -#define WCD9335_PAGE0_PAGE_REGISTER 0x0000 -#define WCD9335_CODEC_RPM_CLK_BYPASS 0x0001 -#define WCD9335_CODEC_RPM_CLK_GATE 0x0002 -#define WCD9335_CODEC_RPM_CLK_MCLK_CFG 0x0003 -#define WCD9335_CODEC_RPM_RST_CTL 0x0009 -#define WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL 0x0011 -#define WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_1 0x0012 -#define WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_2 0x0013 -#define WCD9335_CODEC_RPM_PWR_CPE_DEEPSLP_3 0x0014 -#define WCD9335_CODEC_RPM_PWR_CPE_IRAM_SHUTDOWN 0x0015 -#define WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN 0x0016 -#define WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_1 0x0017 -#define WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_2 0x0018 -#define WCD9335_CODEC_RPM_INT_MASK 0x001d -#define WCD9335_CODEC_RPM_INT_STATUS 0x001e -#define WCD9335_CODEC_RPM_INT_CLEAR 0x001f -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0 0x0021 -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE1 0x0022 -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE2 0x0023 -#define WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE3 0x0024 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_CTL 0x0025 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_TEST0 0x0026 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_TEST1 0x0027 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0 0x0029 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 0x002a -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 0x002b -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT3 0x002c -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT4 0x002d -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT5 0x002e -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT6 0x002f -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT7 0x0030 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT8 0x0031 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT9 0x0032 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT10 0x0033 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT11 0x0034 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT12 0x0035 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT13 0x0036 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT14 0x0037 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT15 0x0038 -#define WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS 0x0039 -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO 0x003a -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_1 0x003b -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_2 0x003c -#define WCD9335_CHIP_TIER_CTRL_I2C_SLAVE_ID_3 0x003d -#define WCD9335_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL 0x003e -#define WCD9335_CHIP_TIER_CTRL_I2C_ACTIVE 0x003f -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_CTL 0x0041 -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_STATUS 0x0042 -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_MSB 0x0043 -#define WCD9335_CHIP_TIER_CTRL_PROC1_MON_CNT_LSB 0x0044 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_CTL 0x0045 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_STATUS 0x0046 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_MSB 0x0047 -#define WCD9335_CHIP_TIER_CTRL_PROC2_MON_CNT_LSB 0x0048 -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_CTL 0x0049 -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_STATUS 0x004a -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_MSB 0x004b -#define WCD9335_CHIP_TIER_CTRL_PROC3_MON_CNT_LSB 0x004c -#define WCD9335_DATA_HUB_DATA_HUB_RX_I2S_CTL 0x0051 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_CTL 0x0052 -#define WCD9335_DATA_HUB_DATA_HUB_I2S_CLK 0x0053 -#define WCD9335_DATA_HUB_DATA_HUB_RX0_INP_CFG 0x0054 -#define WCD9335_DATA_HUB_DATA_HUB_RX1_INP_CFG 0x0055 -#define WCD9335_DATA_HUB_DATA_HUB_RX2_INP_CFG 0x0056 -#define WCD9335_DATA_HUB_DATA_HUB_RX3_INP_CFG 0x0057 -#define WCD9335_DATA_HUB_DATA_HUB_RX4_INP_CFG 0x0058 -#define WCD9335_DATA_HUB_DATA_HUB_RX5_INP_CFG 0x0059 -#define WCD9335_DATA_HUB_DATA_HUB_RX6_INP_CFG 0x005a -#define WCD9335_DATA_HUB_DATA_HUB_RX7_INP_CFG 0x005b -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX0_INP_CFG 0x0061 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX1_INP_CFG 0x0062 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX2_INP_CFG 0x0063 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX3_INP_CFG 0x0064 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX4_INP_CFG 0x0065 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX5_INP_CFG 0x0066 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX6_INP_CFG 0x0067 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX7_INP_CFG 0x0068 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX8_INP_CFG 0x0069 -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX9_INP_CFG 0x006a -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX10_INP_CFG 0x006b -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX11_INP_CFG 0x006c -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX13_INP_CFG 0x006e -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX14_INP_CFG 0x006f -#define WCD9335_DATA_HUB_DATA_HUB_SB_TX15_INP_CFG 0x0070 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_L_CFG 0x0071 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD0_R_CFG 0x0072 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_L_CFG 0x0073 -#define WCD9335_DATA_HUB_DATA_HUB_TX_I2S_SD1_R_CFG 0x0074 -#define WCD9335_DATA_HUB_NATIVE_FIFO_SYNC 0x0075 -#define WCD9335_DATA_HUB_NATIVE_FIFO_STATUS 0x007D -#define WCD9335_INTR_CFG 0x0081 -#define WCD9335_INTR_CLR_COMMIT 0x0082 -#define WCD9335_INTR_PIN1_MASK0 0x0089 -#define WCD9335_INTR_PIN1_MASK1 0x008a -#define WCD9335_INTR_PIN1_MASK2 0x008b -#define WCD9335_INTR_PIN1_MASK3 0x008c -#define WCD9335_INTR_PIN1_STATUS0 0x0091 -#define WCD9335_INTR_PIN1_STATUS1 0x0092 -#define WCD9335_INTR_PIN1_STATUS2 0x0093 -#define WCD9335_INTR_PIN1_STATUS3 0x0094 -#define WCD9335_INTR_PIN1_CLEAR0 0x0099 -#define WCD9335_INTR_PIN1_CLEAR1 0x009a -#define WCD9335_INTR_PIN1_CLEAR2 0x009b -#define WCD9335_INTR_PIN1_CLEAR3 0x009c -#define WCD9335_INTR_PIN2_MASK0 0x00a1 -#define WCD9335_INTR_PIN2_MASK1 0x00a2 -#define WCD9335_INTR_PIN2_MASK2 0x00a3 -#define WCD9335_INTR_PIN2_MASK3 0x00a4 -#define WCD9335_INTR_PIN2_STATUS0 0x00a9 -#define WCD9335_INTR_PIN2_STATUS1 0x00aa -#define WCD9335_INTR_PIN2_STATUS2 0x00ab -#define WCD9335_INTR_PIN2_STATUS3 0x00ac -#define WCD9335_INTR_PIN2_CLEAR0 0x00b1 -#define WCD9335_INTR_PIN2_CLEAR1 0x00b2 -#define WCD9335_INTR_PIN2_CLEAR2 0x00b3 -#define WCD9335_INTR_PIN2_CLEAR3 0x00b4 -#define WCD9335_INTR_LEVEL0 0x00e1 -#define WCD9335_INTR_LEVEL1 0x00e2 -#define WCD9335_INTR_LEVEL2 0x00e3 -#define WCD9335_INTR_LEVEL3 0x00e4 -#define WCD9335_INTR_BYPASS0 0x00e9 -#define WCD9335_INTR_BYPASS1 0x00ea -#define WCD9335_INTR_BYPASS2 0x00eb -#define WCD9335_INTR_BYPASS3 0x00ec -#define WCD9335_INTR_SET0 0x00f1 -#define WCD9335_INTR_SET1 0x00f2 -#define WCD9335_INTR_SET2 0x00f3 -#define WCD9335_INTR_SET3 0x00f4 - -/* Page-1 Registers */ -#define WCD9335_PAGE1_PAGE_REGISTER 0x0100 -#define WCD9335_CPE_FLL_USER_CTL_0 0x0101 -#define WCD9335_CPE_FLL_USER_CTL_1 0x0102 -#define WCD9335_CPE_FLL_USER_CTL_2 0x0103 -#define WCD9335_CPE_FLL_USER_CTL_3 0x0104 -#define WCD9335_CPE_FLL_USER_CTL_4 0x0105 -#define WCD9335_CPE_FLL_USER_CTL_5 0x0106 -#define WCD9335_CPE_FLL_USER_CTL_6 0x0107 -#define WCD9335_CPE_FLL_USER_CTL_7 0x0108 -#define WCD9335_CPE_FLL_USER_CTL_8 0x0109 -#define WCD9335_CPE_FLL_USER_CTL_9 0x010a -#define WCD9335_CPE_FLL_L_VAL_CTL_0 0x010b -#define WCD9335_CPE_FLL_L_VAL_CTL_1 0x010c -#define WCD9335_CPE_FLL_DSM_FRAC_CTL_0 0x010d -#define WCD9335_CPE_FLL_DSM_FRAC_CTL_1 0x010e -#define WCD9335_CPE_FLL_CONFIG_CTL_0 0x010f -#define WCD9335_CPE_FLL_CONFIG_CTL_1 0x0110 -#define WCD9335_CPE_FLL_CONFIG_CTL_2 0x0111 -#define WCD9335_CPE_FLL_CONFIG_CTL_3 0x0112 -#define WCD9335_CPE_FLL_CONFIG_CTL_4 0x0113 -#define WCD9335_CPE_FLL_TEST_CTL_0 0x0114 -#define WCD9335_CPE_FLL_TEST_CTL_1 0x0115 -#define WCD9335_CPE_FLL_TEST_CTL_2 0x0116 -#define WCD9335_CPE_FLL_TEST_CTL_3 0x0117 -#define WCD9335_CPE_FLL_TEST_CTL_4 0x0118 -#define WCD9335_CPE_FLL_TEST_CTL_5 0x0119 -#define WCD9335_CPE_FLL_TEST_CTL_6 0x011a -#define WCD9335_CPE_FLL_TEST_CTL_7 0x011b -#define WCD9335_CPE_FLL_FREQ_CTL_0 0x011c -#define WCD9335_CPE_FLL_FREQ_CTL_1 0x011d -#define WCD9335_CPE_FLL_FREQ_CTL_2 0x011e -#define WCD9335_CPE_FLL_FREQ_CTL_3 0x011f -#define WCD9335_CPE_FLL_SSC_CTL_0 0x0120 -#define WCD9335_CPE_FLL_SSC_CTL_1 0x0121 -#define WCD9335_CPE_FLL_SSC_CTL_2 0x0122 -#define WCD9335_CPE_FLL_SSC_CTL_3 0x0123 -#define WCD9335_CPE_FLL_FLL_MODE 0x0124 -#define WCD9335_CPE_FLL_STATUS_0 0x0125 -#define WCD9335_CPE_FLL_STATUS_1 0x0126 -#define WCD9335_CPE_FLL_STATUS_2 0x0127 -#define WCD9335_CPE_FLL_STATUS_3 0x0128 -#define WCD9335_I2S_FLL_USER_CTL_0 0x0141 -#define WCD9335_I2S_FLL_USER_CTL_1 0x0142 -#define WCD9335_I2S_FLL_USER_CTL_2 0x0143 -#define WCD9335_I2S_FLL_USER_CTL_3 0x0144 -#define WCD9335_I2S_FLL_USER_CTL_4 0x0145 -#define WCD9335_I2S_FLL_USER_CTL_5 0x0146 -#define WCD9335_I2S_FLL_USER_CTL_6 0x0147 -#define WCD9335_I2S_FLL_USER_CTL_7 0x0148 -#define WCD9335_I2S_FLL_USER_CTL_8 0x0149 -#define WCD9335_I2S_FLL_USER_CTL_9 0x014a -#define WCD9335_I2S_FLL_L_VAL_CTL_0 0x014b -#define WCD9335_I2S_FLL_L_VAL_CTL_1 0x014c -#define WCD9335_I2S_FLL_DSM_FRAC_CTL_0 0x014d -#define WCD9335_I2S_FLL_DSM_FRAC_CTL_1 0x014e -#define WCD9335_I2S_FLL_CONFIG_CTL_0 0x014f -#define WCD9335_I2S_FLL_CONFIG_CTL_1 0x0150 -#define WCD9335_I2S_FLL_CONFIG_CTL_2 0x0151 -#define WCD9335_I2S_FLL_CONFIG_CTL_3 0x0152 -#define WCD9335_I2S_FLL_CONFIG_CTL_4 0x0153 -#define WCD9335_I2S_FLL_TEST_CTL_0 0x0154 -#define WCD9335_I2S_FLL_TEST_CTL_1 0x0155 -#define WCD9335_I2S_FLL_TEST_CTL_2 0x0156 -#define WCD9335_I2S_FLL_TEST_CTL_3 0x0157 -#define WCD9335_I2S_FLL_TEST_CTL_4 0x0158 -#define WCD9335_I2S_FLL_TEST_CTL_5 0x0159 -#define WCD9335_I2S_FLL_TEST_CTL_6 0x015a -#define WCD9335_I2S_FLL_TEST_CTL_7 0x015b -#define WCD9335_I2S_FLL_FREQ_CTL_0 0x015c -#define WCD9335_I2S_FLL_FREQ_CTL_1 0x015d -#define WCD9335_I2S_FLL_FREQ_CTL_2 0x015e -#define WCD9335_I2S_FLL_FREQ_CTL_3 0x015f -#define WCD9335_I2S_FLL_SSC_CTL_0 0x0160 -#define WCD9335_I2S_FLL_SSC_CTL_1 0x0161 -#define WCD9335_I2S_FLL_SSC_CTL_2 0x0162 -#define WCD9335_I2S_FLL_SSC_CTL_3 0x0163 -#define WCD9335_I2S_FLL_FLL_MODE 0x0164 -#define WCD9335_I2S_FLL_STATUS_0 0x0165 -#define WCD9335_I2S_FLL_STATUS_1 0x0166 -#define WCD9335_I2S_FLL_STATUS_2 0x0167 -#define WCD9335_I2S_FLL_STATUS_3 0x0168 -#define WCD9335_SB_FLL_USER_CTL_0 0x0181 -#define WCD9335_SB_FLL_USER_CTL_1 0x0182 -#define WCD9335_SB_FLL_USER_CTL_2 0x0183 -#define WCD9335_SB_FLL_USER_CTL_3 0x0184 -#define WCD9335_SB_FLL_USER_CTL_4 0x0185 -#define WCD9335_SB_FLL_USER_CTL_5 0x0186 -#define WCD9335_SB_FLL_USER_CTL_6 0x0187 -#define WCD9335_SB_FLL_USER_CTL_7 0x0188 -#define WCD9335_SB_FLL_USER_CTL_8 0x0189 -#define WCD9335_SB_FLL_USER_CTL_9 0x018a -#define WCD9335_SB_FLL_L_VAL_CTL_0 0x018b -#define WCD9335_SB_FLL_L_VAL_CTL_1 0x018c -#define WCD9335_SB_FLL_DSM_FRAC_CTL_0 0x018d -#define WCD9335_SB_FLL_DSM_FRAC_CTL_1 0x018e -#define WCD9335_SB_FLL_CONFIG_CTL_0 0x018f -#define WCD9335_SB_FLL_CONFIG_CTL_1 0x0190 -#define WCD9335_SB_FLL_CONFIG_CTL_2 0x0191 -#define WCD9335_SB_FLL_CONFIG_CTL_3 0x0192 -#define WCD9335_SB_FLL_CONFIG_CTL_4 0x0193 -#define WCD9335_SB_FLL_TEST_CTL_0 0x0194 -#define WCD9335_SB_FLL_TEST_CTL_1 0x0195 -#define WCD9335_SB_FLL_TEST_CTL_2 0x0196 -#define WCD9335_SB_FLL_TEST_CTL_3 0x0197 -#define WCD9335_SB_FLL_TEST_CTL_4 0x0198 -#define WCD9335_SB_FLL_TEST_CTL_5 0x0199 -#define WCD9335_SB_FLL_TEST_CTL_6 0x019a -#define WCD9335_SB_FLL_TEST_CTL_7 0x019b -#define WCD9335_SB_FLL_FREQ_CTL_0 0x019c -#define WCD9335_SB_FLL_FREQ_CTL_1 0x019d -#define WCD9335_SB_FLL_FREQ_CTL_2 0x019e -#define WCD9335_SB_FLL_FREQ_CTL_3 0x019f -#define WCD9335_SB_FLL_SSC_CTL_0 0x01a0 -#define WCD9335_SB_FLL_SSC_CTL_1 0x01a1 -#define WCD9335_SB_FLL_SSC_CTL_2 0x01a2 -#define WCD9335_SB_FLL_SSC_CTL_3 0x01a3 -#define WCD9335_SB_FLL_FLL_MODE 0x01a4 -#define WCD9335_SB_FLL_STATUS_0 0x01a5 -#define WCD9335_SB_FLL_STATUS_1 0x01a6 -#define WCD9335_SB_FLL_STATUS_2 0x01a7 -#define WCD9335_SB_FLL_STATUS_3 0x01a8 - -/* Page-2 Registers */ -#define WCD9335_PAGE2_PAGE_REGISTER 0x0200 -#define WCD9335_CPE_SS_MEM_PTR_0 0x0201 -#define WCD9335_CPE_SS_MEM_PTR_1 0x0202 -#define WCD9335_CPE_SS_MEM_PTR_2 0x0203 -#define WCD9335_CPE_SS_MEM_CTRL 0x0205 -#define WCD9335_CPE_SS_MEM_BANK_0 0x0206 -#define WCD9335_CPE_SS_MEM_BANK_1 0x0207 -#define WCD9335_CPE_SS_MEM_BANK_2 0x0208 -#define WCD9335_CPE_SS_MEM_BANK_3 0x0209 -#define WCD9335_CPE_SS_MEM_BANK_4 0x020a -#define WCD9335_CPE_SS_MEM_BANK_5 0x020b -#define WCD9335_CPE_SS_MEM_BANK_6 0x020c -#define WCD9335_CPE_SS_MEM_BANK_7 0x020d -#define WCD9335_CPE_SS_MEM_BANK_8 0x020e -#define WCD9335_CPE_SS_MEM_BANK_9 0x020f -#define WCD9335_CPE_SS_MEM_BANK_10 0x0210 -#define WCD9335_CPE_SS_MEM_BANK_11 0x0211 -#define WCD9335_CPE_SS_MEM_BANK_12 0x0212 -#define WCD9335_CPE_SS_MEM_BANK_13 0x0213 -#define WCD9335_CPE_SS_MEM_BANK_14 0x0214 -#define WCD9335_CPE_SS_MEM_BANK_15 0x0215 -#define WCD9335_CPE_SS_INBOX1_TRG 0x0216 -#define WCD9335_CPE_SS_INBOX2_TRG 0x0217 -#define WCD9335_CPE_SS_INBOX1_0 0x0218 -#define WCD9335_CPE_SS_INBOX1_1 0x0219 -#define WCD9335_CPE_SS_INBOX1_2 0x021a -#define WCD9335_CPE_SS_INBOX1_3 0x021b -#define WCD9335_CPE_SS_INBOX1_4 0x021c -#define WCD9335_CPE_SS_INBOX1_5 0x021d -#define WCD9335_CPE_SS_INBOX1_6 0x021e -#define WCD9335_CPE_SS_INBOX1_7 0x021f -#define WCD9335_CPE_SS_INBOX1_8 0x0220 -#define WCD9335_CPE_SS_INBOX1_9 0x0221 -#define WCD9335_CPE_SS_INBOX1_10 0x0222 -#define WCD9335_CPE_SS_INBOX1_11 0x0223 -#define WCD9335_CPE_SS_INBOX1_12 0x0224 -#define WCD9335_CPE_SS_INBOX1_13 0x0225 -#define WCD9335_CPE_SS_INBOX1_14 0x0226 -#define WCD9335_CPE_SS_INBOX1_15 0x0227 -#define WCD9335_CPE_SS_OUTBOX1_0 0x0228 -#define WCD9335_CPE_SS_OUTBOX1_1 0x0229 -#define WCD9335_CPE_SS_OUTBOX1_2 0x022a -#define WCD9335_CPE_SS_OUTBOX1_3 0x022b -#define WCD9335_CPE_SS_OUTBOX1_4 0x022c -#define WCD9335_CPE_SS_OUTBOX1_5 0x022d -#define WCD9335_CPE_SS_OUTBOX1_6 0x022e -#define WCD9335_CPE_SS_OUTBOX1_7 0x022f -#define WCD9335_CPE_SS_OUTBOX1_8 0x0230 -#define WCD9335_CPE_SS_OUTBOX1_9 0x0231 -#define WCD9335_CPE_SS_OUTBOX1_10 0x0232 -#define WCD9335_CPE_SS_OUTBOX1_11 0x0233 -#define WCD9335_CPE_SS_OUTBOX1_12 0x0234 -#define WCD9335_CPE_SS_OUTBOX1_13 0x0235 -#define WCD9335_CPE_SS_OUTBOX1_14 0x0236 -#define WCD9335_CPE_SS_OUTBOX1_15 0x0237 -#define WCD9335_CPE_SS_INBOX2_0 0x0238 -#define WCD9335_CPE_SS_INBOX2_1 0x0239 -#define WCD9335_CPE_SS_INBOX2_2 0x023a -#define WCD9335_CPE_SS_INBOX2_3 0x023b -#define WCD9335_CPE_SS_INBOX2_4 0x023c -#define WCD9335_CPE_SS_INBOX2_5 0x023d -#define WCD9335_CPE_SS_INBOX2_6 0x023e -#define WCD9335_CPE_SS_INBOX2_7 0x023f -#define WCD9335_CPE_SS_INBOX2_8 0x0240 -#define WCD9335_CPE_SS_INBOX2_9 0x0241 -#define WCD9335_CPE_SS_INBOX2_10 0x0242 -#define WCD9335_CPE_SS_INBOX2_11 0x0243 -#define WCD9335_CPE_SS_INBOX2_12 0x0244 -#define WCD9335_CPE_SS_INBOX2_13 0x0245 -#define WCD9335_CPE_SS_INBOX2_14 0x0246 -#define WCD9335_CPE_SS_INBOX2_15 0x0247 -#define WCD9335_CPE_SS_OUTBOX2_0 0x0248 -#define WCD9335_CPE_SS_OUTBOX2_1 0x0249 -#define WCD9335_CPE_SS_OUTBOX2_2 0x024a -#define WCD9335_CPE_SS_OUTBOX2_3 0x024b -#define WCD9335_CPE_SS_OUTBOX2_4 0x024c -#define WCD9335_CPE_SS_OUTBOX2_5 0x024d -#define WCD9335_CPE_SS_OUTBOX2_6 0x024e -#define WCD9335_CPE_SS_OUTBOX2_7 0x024f -#define WCD9335_CPE_SS_OUTBOX2_8 0x0250 -#define WCD9335_CPE_SS_OUTBOX2_9 0x0251 -#define WCD9335_CPE_SS_OUTBOX2_10 0x0252 -#define WCD9335_CPE_SS_OUTBOX2_11 0x0253 -#define WCD9335_CPE_SS_OUTBOX2_12 0x0254 -#define WCD9335_CPE_SS_OUTBOX2_13 0x0255 -#define WCD9335_CPE_SS_OUTBOX2_14 0x0256 -#define WCD9335_CPE_SS_OUTBOX2_15 0x0257 -#define WCD9335_CPE_SS_OUTBOX1_ACK 0x0258 -#define WCD9335_CPE_SS_OUTBOX2_ACK 0x0259 -#define WCD9335_CPE_SS_EC_BUF_INT_PERIOD 0x025a -#define WCD9335_CPE_SS_US_BUF_INT_PERIOD 0x025b -#define WCD9335_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD 0x025c -#define WCD9335_CPE_SS_CFG 0x025d -#define WCD9335_CPE_SS_US_EC_MUX_CFG 0x025e -#define WCD9335_CPE_SS_MAD_CTL 0x025f -#define WCD9335_CPE_SS_CPAR_CTL 0x0260 -#define WCD9335_CPE_SS_TX_PP_BUF_INT_PERIOD 0x0261 -#define WCD9335_CPE_SS_TX_PP_CFG 0x0262 -#define WCD9335_CPE_SS_DMIC0_CTL 0x0263 -#define WCD9335_CPE_SS_DMIC1_CTL 0x0264 -#define WCD9335_CPE_SS_DMIC2_CTL 0x0265 -#define WCD9335_CPE_SS_DMIC_CFG 0x0266 -#define WCD9335_CPE_SS_SVA_CFG 0x0267 -#define WCD9335_CPE_SS_CPAR_CFG 0x0271 -#define WCD9335_CPE_SS_WDOG_CFG 0x0272 -#define WCD9335_CPE_SS_BACKUP_INT 0x0273 -#define WCD9335_CPE_SS_STATUS 0x0274 -#define WCD9335_CPE_SS_CPE_OCD_CFG 0x0275 -#define WCD9335_CPE_SS_SS_ERROR_INT_MASK 0x0276 -#define WCD9335_CPE_SS_SS_ERROR_INT_STATUS 0x0277 -#define WCD9335_CPE_SS_SS_ERROR_INT_CLEAR 0x0278 -#define WCD9335_SOC_MAD_MAIN_CTL_1 0x0281 -#define WCD9335_SOC_MAD_MAIN_CTL_2 0x0282 -#define WCD9335_SOC_MAD_AUDIO_CTL_1 0x0283 -#define WCD9335_SOC_MAD_AUDIO_CTL_2 0x0284 -#define WCD9335_SOC_MAD_AUDIO_CTL_3 0x0285 -#define WCD9335_SOC_MAD_AUDIO_CTL_4 0x0286 -#define WCD9335_SOC_MAD_AUDIO_CTL_5 0x0287 -#define WCD9335_SOC_MAD_AUDIO_CTL_6 0x0288 -#define WCD9335_SOC_MAD_AUDIO_CTL_7 0x0289 -#define WCD9335_SOC_MAD_AUDIO_CTL_8 0x028a -#define WCD9335_SOC_MAD_AUDIO_IIR_CTL_PTR 0x028b -#define WCD9335_SOC_MAD_AUDIO_IIR_CTL_VAL 0x028c -#define WCD9335_SOC_MAD_ULTR_CTL_1 0x028d -#define WCD9335_SOC_MAD_ULTR_CTL_2 0x028e -#define WCD9335_SOC_MAD_ULTR_CTL_3 0x028f -#define WCD9335_SOC_MAD_ULTR_CTL_4 0x0290 -#define WCD9335_SOC_MAD_ULTR_CTL_5 0x0291 -#define WCD9335_SOC_MAD_ULTR_CTL_6 0x0292 -#define WCD9335_SOC_MAD_ULTR_CTL_7 0x0293 -#define WCD9335_SOC_MAD_BEACON_CTL_1 0x0294 -#define WCD9335_SOC_MAD_BEACON_CTL_2 0x0295 -#define WCD9335_SOC_MAD_BEACON_CTL_3 0x0296 -#define WCD9335_SOC_MAD_BEACON_CTL_4 0x0297 -#define WCD9335_SOC_MAD_BEACON_CTL_5 0x0298 -#define WCD9335_SOC_MAD_BEACON_CTL_6 0x0299 -#define WCD9335_SOC_MAD_BEACON_CTL_7 0x029a -#define WCD9335_SOC_MAD_BEACON_CTL_8 0x029b -#define WCD9335_SOC_MAD_BEACON_IIR_CTL_PTR 0x029c -#define WCD9335_SOC_MAD_BEACON_IIR_CTL_VAL 0x029d -#define WCD9335_SOC_MAD_INP_SEL 0x029e - -/* Page-6 Registers */ -#define WCD9335_PAGE6_PAGE_REGISTER 0x0600 -#define WCD9335_ANA_BIAS 0x0601 -#define WCD9335_ANA_CLK_TOP 0x0602 -#define WCD9335_ANA_RCO 0x0603 -#define WCD9335_ANA_BUCK_VOUT_A 0x0604 -#define WCD9335_ANA_BUCK_VOUT_D 0x0605 -#define WCD9335_ANA_BUCK_CTL 0x0606 -#define WCD9335_ANA_BUCK_STATUS 0x0607 -#define WCD9335_ANA_RX_SUPPLIES 0x0608 -#define WCD9335_ANA_HPH 0x0609 -#define WCD9335_ANA_EAR 0x060a -#define WCD9335_ANA_LO_1_2 0x060b -#define WCD9335_ANA_LO_3_4 0x060c -#define WCD9335_ANA_MAD_SETUP 0x060d -#define WCD9335_ANA_AMIC1 0x060e -#define WCD9335_ANA_AMIC2 0x060f -#define WCD9335_ANA_AMIC3 0x0610 -#define WCD9335_ANA_AMIC4 0x0611 -#define WCD9335_ANA_AMIC5 0x0612 -#define WCD9335_ANA_AMIC6 0x0613 -#define WCD9335_ANA_MBHC_MECH 0x0614 -#define WCD9335_ANA_MBHC_ELECT 0x0615 -#define WCD9335_ANA_MBHC_ZDET 0x0616 -#define WCD9335_ANA_MBHC_RESULT_1 0x0617 -#define WCD9335_ANA_MBHC_RESULT_2 0x0618 -#define WCD9335_ANA_MBHC_RESULT_3 0x0619 -#define WCD9335_ANA_MBHC_BTN0 0x061a -#define WCD9335_ANA_MBHC_BTN1 0x061b -#define WCD9335_ANA_MBHC_BTN2 0x061c -#define WCD9335_ANA_MBHC_BTN3 0x061d -#define WCD9335_ANA_MBHC_BTN4 0x061e -#define WCD9335_ANA_MBHC_BTN5 0x061f -#define WCD9335_ANA_MBHC_BTN6 0x0620 -#define WCD9335_ANA_MBHC_BTN7 0x0621 -#define WCD9335_ANA_MICB1 0x0622 -#define WCD9335_ANA_MICB2 0x0623 -#define WCD9335_ANA_MICB2_RAMP 0x0624 -#define WCD9335_ANA_MICB3 0x0625 -#define WCD9335_ANA_MICB4 0x0626 -#define WCD9335_ANA_VBADC 0x0627 -#define WCD9335_BIAS_CTL 0x0628 -#define WCD9335_BIAS_VBG_FINE_ADJ 0x0629 -#define WCD9335_CLOCK_TEST_CTL 0x062d -#define WCD9335_RCO_CTRL_1 0x062e -#define WCD9335_RCO_CTRL_2 0x062f -#define WCD9335_RCO_CAL 0x0630 -#define WCD9335_RCO_CAL_1 0x0631 -#define WCD9335_RCO_CAL_2 0x0632 -#define WCD9335_RCO_TEST_CTRL 0x0633 -#define WCD9335_RCO_CAL_OUT_1 0x0634 -#define WCD9335_RCO_CAL_OUT_2 0x0635 -#define WCD9335_RCO_CAL_OUT_3 0x0636 -#define WCD9335_RCO_CAL_OUT_4 0x0637 -#define WCD9335_RCO_CAL_OUT_5 0x0638 -#define WCD9335_SIDO_SIDO_MODE_1 0x063a -#define WCD9335_SIDO_SIDO_MODE_2 0x063b -#define WCD9335_SIDO_SIDO_MODE_3 0x063c -#define WCD9335_SIDO_SIDO_MODE_4 0x063d -#define WCD9335_SIDO_SIDO_VCL_1 0x063e -#define WCD9335_SIDO_SIDO_VCL_2 0x063f -#define WCD9335_SIDO_SIDO_VCL_3 0x0640 -#define WCD9335_SIDO_SIDO_CCL_1 0x0641 -#define WCD9335_SIDO_SIDO_CCL_2 0x0642 -#define WCD9335_SIDO_SIDO_CCL_3 0x0643 -#define WCD9335_SIDO_SIDO_CCL_4 0x0644 -#define WCD9335_SIDO_SIDO_CCL_5 0x0645 -#define WCD9335_SIDO_SIDO_CCL_6 0x0646 -#define WCD9335_SIDO_SIDO_CCL_7 0x0647 -#define WCD9335_SIDO_SIDO_CCL_8 0x0648 -#define WCD9335_SIDO_SIDO_CCL_9 0x0649 -#define WCD9335_SIDO_SIDO_CCL_10 0x064a -#define WCD9335_SIDO_SIDO_FILTER_1 0x064b -#define WCD9335_SIDO_SIDO_FILTER_2 0x064c -#define WCD9335_SIDO_SIDO_DRIVER_1 0x064d -#define WCD9335_SIDO_SIDO_DRIVER_2 0x064e -#define WCD9335_SIDO_SIDO_DRIVER_3 0x064f -#define WCD9335_SIDO_SIDO_CAL_CODE_EXT_1 0x0650 -#define WCD9335_SIDO_SIDO_CAL_CODE_EXT_2 0x0651 -#define WCD9335_SIDO_SIDO_CAL_CODE_OUT_1 0x0652 -#define WCD9335_SIDO_SIDO_CAL_CODE_OUT_2 0x0653 -#define WCD9335_SIDO_SIDO_TEST_1 0x0654 -#define WCD9335_SIDO_SIDO_TEST_2 0x0655 -#define WCD9335_MBHC_CTL_1 0x0656 -#define WCD9335_MBHC_CTL_2 0x0657 -#define WCD9335_MBHC_PLUG_DETECT_CTL 0x0658 -#define WCD9335_MBHC_ZDET_ANA_CTL 0x0659 -#define WCD9335_MBHC_ZDET_RAMP_CTL 0x065a -#define WCD9335_MBHC_FSM_DEBUG 0x065b /* v1.x */ -#define WCD9335_MBHC_FSM_STATUS 0x065b /* v2.0 */ -#define WCD9335_MBHC_TEST_CTL 0x065c -#define WCD9335_VBADC_SUBBLOCK_EN 0x065d -#define WCD9335_VBADC_IBIAS_FE 0x065e -#define WCD9335_VBADC_BIAS_ADC 0x065f -#define WCD9335_VBADC_FE_CTRL 0x0660 -#define WCD9335_VBADC_ADC_REF 0x0661 -#define WCD9335_VBADC_ADC_IO 0x0662 -#define WCD9335_VBADC_ADC_SAR 0x0663 -#define WCD9335_VBADC_DEBUG 0x0664 -#define WCD9335_VBADC_ADC_DOUTMSB 0x0665 -#define WCD9335_VBADC_ADC_DOUTLSB 0x0666 -#define WCD9335_LDOH_MODE 0x0667 -#define WCD9335_LDOH_BIAS 0x0668 -#define WCD9335_LDOH_STB_LOADS 0x0669 -#define WCD9335_LDOH_SLOWRAMP 0x066a -#define WCD9335_MICB1_TEST_CTL_1 0x066b -#define WCD9335_MICB1_TEST_CTL_2 0x066c -#define WCD9335_MICB1_TEST_CTL_3 0x066d -#define WCD9335_MICB2_TEST_CTL_1 0x066e -#define WCD9335_MICB2_TEST_CTL_2 0x066f -#define WCD9335_MICB2_TEST_CTL_3 0x0670 -#define WCD9335_MICB3_TEST_CTL_1 0x0671 -#define WCD9335_MICB3_TEST_CTL_2 0x0672 -#define WCD9335_MICB3_TEST_CTL_3 0x0673 -#define WCD9335_MICB4_TEST_CTL_1 0x0674 -#define WCD9335_MICB4_TEST_CTL_2 0x0675 -#define WCD9335_MICB4_TEST_CTL_3 0x0676 -#define WCD9335_TX_COM_ADC_VCM 0x0677 -#define WCD9335_TX_COM_BIAS_ATEST 0x0678 -#define WCD9335_TX_COM_ADC_INT1_IB 0x0679 -#define WCD9335_TX_COM_ADC_INT2_IB 0x067a -#define WCD9335_TX_COM_TXFE_DIV_CTL 0x067b -#define WCD9335_TX_COM_TXFE_DIV_START 0x067c -#define WCD9335_TX_COM_TXFE_DIV_STOP_9P6M 0x067d -#define WCD9335_TX_COM_TXFE_DIV_STOP_12P288M 0x067e -#define WCD9335_TX_1_2_TEST_EN 0x067f -#define WCD9335_TX_1_2_ADC_IB 0x0680 -#define WCD9335_TX_1_2_ATEST_REFCTL 0x0681 -#define WCD9335_TX_1_2_TEST_CTL 0x0682 -#define WCD9335_TX_1_2_TEST_BLK_EN 0x0683 -#define WCD9335_TX_1_2_TXFE_CLKDIV 0x0684 -#define WCD9335_TX_1_2_SAR1_ERR 0x0685 -#define WCD9335_TX_1_2_SAR2_ERR 0x0686 -#define WCD9335_TX_3_4_TEST_EN 0x0687 -#define WCD9335_TX_3_4_ADC_IB 0x0688 -#define WCD9335_TX_3_4_ATEST_REFCTL 0x0689 -#define WCD9335_TX_3_4_TEST_CTL 0x068a -#define WCD9335_TX_3_4_TEST_BLK_EN 0x068b -#define WCD9335_TX_3_4_TXFE_CLKDIV 0x068c -#define WCD9335_TX_3_4_SAR1_ERR 0x068d -#define WCD9335_TX_3_4_SAR2_ERR 0x068e -#define WCD9335_TX_5_6_TEST_EN 0x068f -#define WCD9335_TX_5_6_ADC_IB 0x0690 -#define WCD9335_TX_5_6_ATEST_REFCTL 0x0691 -#define WCD9335_TX_5_6_TEST_CTL 0x0692 -#define WCD9335_TX_5_6_TEST_BLK_EN 0x0693 -#define WCD9335_TX_5_6_TXFE_CLKDIV 0x0694 -#define WCD9335_TX_5_6_SAR1_ERR 0x0695 -#define WCD9335_TX_5_6_SAR2_ERR 0x0696 -#define WCD9335_CLASSH_MODE_1 0x0697 -#define WCD9335_CLASSH_MODE_2 0x0698 -#define WCD9335_CLASSH_MODE_3 0x0699 -#define WCD9335_CLASSH_CTRL_VCL_1 0x069a -#define WCD9335_CLASSH_CTRL_VCL_2 0x069b -#define WCD9335_CLASSH_CTRL_CCL_1 0x069c -#define WCD9335_CLASSH_CTRL_CCL_2 0x069d -#define WCD9335_CLASSH_CTRL_CCL_3 0x069e -#define WCD9335_CLASSH_CTRL_CCL_4 0x069f -#define WCD9335_CLASSH_CTRL_CCL_5 0x06a0 -#define WCD9335_CLASSH_BUCK_TMUX_A_D 0x06a1 -#define WCD9335_CLASSH_BUCK_SW_DRV_CNTL 0x06a2 -#define WCD9335_CLASSH_SPARE 0x06a3 -#define WCD9335_FLYBACK_EN 0x06a4 -#define WCD9335_FLYBACK_VNEG_CTRL_1 0x06a5 -#define WCD9335_FLYBACK_VNEG_CTRL_2 0x06a6 -#define WCD9335_FLYBACK_VNEG_CTRL_3 0x06a7 -#define WCD9335_FLYBACK_VNEG_CTRL_4 0x06a8 -#define WCD9335_FLYBACK_VNEG_CTRL_5 0x06a9 -#define WCD9335_FLYBACK_VNEG_CTRL_6 0x06aa -#define WCD9335_FLYBACK_VNEG_CTRL_7 0x06ab -#define WCD9335_FLYBACK_VNEG_CTRL_8 0x06ac -#define WCD9335_FLYBACK_VNEG_CTRL_9 0x06ad -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_1 0x06ae -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_2 0x06af -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_3 0x06b0 -#define WCD9335_FLYBACK_VNEG_DAC_CTRL_4 0x06b1 /* v1.x */ -#define WCD9335_FLYBACK_CTRL_1 0x06b1 /* v2.0 */ -#define WCD9335_FLYBACK_TEST_CTL 0x06b2 -#define WCD9335_RX_AUX_SW_CTL 0x06b3 -#define WCD9335_RX_PA_AUX_IN_CONN 0x06b4 -#define WCD9335_RX_TIMER_DIV 0x06b5 -#define WCD9335_RX_OCP_CTL 0x06b6 -#define WCD9335_RX_OCP_COUNT 0x06b7 -#define WCD9335_RX_BIAS_EAR_DAC 0x06b8 -#define WCD9335_RX_BIAS_EAR_AMP 0x06b9 -#define WCD9335_RX_BIAS_HPH_LDO 0x06ba -#define WCD9335_RX_BIAS_HPH_PA 0x06bb -#define WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2 0x06bc -#define WCD9335_RX_BIAS_HPH_RDAC_LDO 0x06bd -#define WCD9335_RX_BIAS_HPH_CNP1 0x06be -#define WCD9335_RX_BIAS_HPH_LOWPOWER 0x06bf -#define WCD9335_RX_BIAS_DIFFLO_PA 0x06c0 -#define WCD9335_RX_BIAS_DIFFLO_REF 0x06c1 -#define WCD9335_RX_BIAS_DIFFLO_LDO 0x06c2 -#define WCD9335_RX_BIAS_SELO_DAC_PA 0x06c3 -#define WCD9335_RX_BIAS_BUCK_RST 0x06c4 -#define WCD9335_RX_BIAS_BUCK_VREF_ERRAMP 0x06c5 -#define WCD9335_RX_BIAS_FLYB_ERRAMP 0x06c6 -#define WCD9335_RX_BIAS_FLYB_BUFF 0x06c7 -#define WCD9335_RX_BIAS_FLYB_MID_RST 0x06c8 -#define WCD9335_HPH_L_STATUS 0x06c9 -#define WCD9335_HPH_R_STATUS 0x06ca -#define WCD9335_HPH_CNP_EN 0x06cb -#define WCD9335_HPH_CNP_WG_CTL 0x06cc -#define WCD9335_HPH_CNP_WG_TIME 0x06cd -#define WCD9335_HPH_OCP_CTL 0x06ce -#define WCD9335_HPH_AUTO_CHOP 0x06cf -#define WCD9335_HPH_CHOP_CTL 0x06d0 -#define WCD9335_HPH_PA_CTL1 0x06d1 -#define WCD9335_HPH_PA_CTL2 0x06d2 -#define WCD9335_HPH_L_EN 0x06d3 -#define WCD9335_HPH_L_TEST 0x06d4 -#define WCD9335_HPH_L_ATEST 0x06d5 -#define WCD9335_HPH_R_EN 0x06d6 -#define WCD9335_HPH_R_TEST 0x06d7 -#define WCD9335_HPH_R_ATEST 0x06d8 -#define WCD9335_HPH_RDAC_CLK_CTL1 0x06d9 -#define WCD9335_HPH_RDAC_CLK_CTL2 0x06da -#define WCD9335_HPH_RDAC_LDO_CTL 0x06db -#define WCD9335_HPH_RDAC_CHOP_CLK_LP_CTL 0x06dc -#define WCD9335_HPH_REFBUFF_UHQA_CTL 0x06dd -#define WCD9335_HPH_REFBUFF_LP_CTL 0x06de -#define WCD9335_HPH_L_DAC_CTL 0x06df -#define WCD9335_HPH_R_DAC_CTL 0x06e0 -#define WCD9335_EAR_EN_REG 0x06e1 -#define WCD9335_EAR_CMBUFF 0x06e2 -#define WCD9335_EAR_ICTL 0x06e3 -#define WCD9335_EAR_EN_DBG_CTL 0x06e4 -#define WCD9335_EAR_CNP 0x06e5 -#define WCD9335_EAR_DAC_CTL_ATEST 0x06e6 -#define WCD9335_EAR_STATUS_REG 0x06e7 -#define WCD9335_EAR_OUT_SHORT 0x06e8 -#define WCD9335_DIFF_LO_MISC 0x06e9 -#define WCD9335_DIFF_LO_LO2_COMPANDER 0x06ea -#define WCD9335_DIFF_LO_LO1_COMPANDER 0x06eb -#define WCD9335_DIFF_LO_COMMON 0x06ec -#define WCD9335_DIFF_LO_BYPASS_EN 0x06ed -#define WCD9335_DIFF_LO_CNP 0x06ee -#define WCD9335_DIFF_LO_CORE_OUT_PROG 0x06ef -#define WCD9335_DIFF_LO_LDO_OUT_PROG 0x06f0 -#define WCD9335_DIFF_LO_COM_SWCAP_REFBUF_FREQ 0x06f1 -#define WCD9335_DIFF_LO_COM_PA_FREQ 0x06f2 -#define WCD9335_DIFF_LO_RESERVED_REG 0x06f3 -#define WCD9335_DIFF_LO_LO1_STATUS_1 0x06f4 -#define WCD9335_DIFF_LO_LO1_STATUS_2 0x06f5 -#define WCD9335_SE_LO_COM1 0x06f6 -#define WCD9335_SE_LO_COM2 0x06f7 -#define WCD9335_SE_LO_LO3_GAIN 0x06f8 -#define WCD9335_SE_LO_LO3_CTRL 0x06f9 -#define WCD9335_SE_LO_LO4_GAIN 0x06fa -#define WCD9335_SE_LO_LO4_CTRL 0x06fb -#define WCD9335_SE_LO_LO3_STATUS 0x06fe -#define WCD9335_SE_LO_LO4_STATUS 0x06ff - -/* Page-10 Registers */ -#define WCD9335_PAGE10_PAGE_REGISTER 0x0a00 -#define WCD9335_CDC_ANC0_CLK_RESET_CTL 0x0a01 -#define WCD9335_CDC_ANC0_MODE_1_CTL 0x0a02 -#define WCD9335_CDC_ANC0_MODE_2_CTL 0x0a03 -#define WCD9335_CDC_ANC0_FF_SHIFT 0x0a04 -#define WCD9335_CDC_ANC0_FB_SHIFT 0x0a05 -#define WCD9335_CDC_ANC0_LPF_FF_A_CTL 0x0a06 -#define WCD9335_CDC_ANC0_LPF_FF_B_CTL 0x0a07 -#define WCD9335_CDC_ANC0_LPF_FB_CTL 0x0a08 -#define WCD9335_CDC_ANC0_SMLPF_CTL 0x0a09 -#define WCD9335_CDC_ANC0_DCFLT_SHIFT_CTL 0x0a0a -#define WCD9335_CDC_ANC0_IIR_ADAPT_CTL 0x0a0b -#define WCD9335_CDC_ANC0_IIR_COEFF_1_CTL 0x0a0c -#define WCD9335_CDC_ANC0_IIR_COEFF_2_CTL 0x0a0d -#define WCD9335_CDC_ANC0_FF_A_GAIN_CTL 0x0a0e -#define WCD9335_CDC_ANC0_FF_B_GAIN_CTL 0x0a0f -#define WCD9335_CDC_ANC0_FB_GAIN_CTL 0x0a10 -#define WCD9335_CDC_ANC1_CLK_RESET_CTL 0x0a19 -#define WCD9335_CDC_ANC1_MODE_1_CTL 0x0a1a -#define WCD9335_CDC_ANC1_MODE_2_CTL 0x0a1b -#define WCD9335_CDC_ANC1_FF_SHIFT 0x0a1c -#define WCD9335_CDC_ANC1_FB_SHIFT 0x0a1d -#define WCD9335_CDC_ANC1_LPF_FF_A_CTL 0x0a1e -#define WCD9335_CDC_ANC1_LPF_FF_B_CTL 0x0a1f -#define WCD9335_CDC_ANC1_LPF_FB_CTL 0x0a20 -#define WCD9335_CDC_ANC1_SMLPF_CTL 0x0a21 -#define WCD9335_CDC_ANC1_DCFLT_SHIFT_CTL 0x0a22 -#define WCD9335_CDC_ANC1_IIR_ADAPT_CTL 0x0a23 -#define WCD9335_CDC_ANC1_IIR_COEFF_1_CTL 0x0a24 -#define WCD9335_CDC_ANC1_IIR_COEFF_2_CTL 0x0a25 -#define WCD9335_CDC_ANC1_FF_A_GAIN_CTL 0x0a26 -#define WCD9335_CDC_ANC1_FF_B_GAIN_CTL 0x0a27 -#define WCD9335_CDC_ANC1_FB_GAIN_CTL 0x0a28 -#define WCD9335_CDC_TX0_TX_PATH_CTL 0x0a31 -#define WCD9335_CDC_TX0_TX_PATH_CFG0 0x0a32 -#define WCD9335_CDC_TX0_TX_PATH_CFG1 0x0a33 -#define WCD9335_CDC_TX0_TX_VOL_CTL 0x0a34 -#define WCD9335_CDC_TX0_TX_PATH_192_CTL 0x0a35 -#define WCD9335_CDC_TX0_TX_PATH_192_CFG 0x0a36 -#define WCD9335_CDC_TX0_TX_PATH_SEC0 0x0a37 -#define WCD9335_CDC_TX0_TX_PATH_SEC1 0x0a38 -#define WCD9335_CDC_TX0_TX_PATH_SEC2 0x0a39 -#define WCD9335_CDC_TX0_TX_PATH_SEC3 0x0a3a -#define WCD9335_CDC_TX0_TX_PATH_SEC4 0x0a3b -#define WCD9335_CDC_TX0_TX_PATH_SEC5 0x0a3c -#define WCD9335_CDC_TX0_TX_PATH_SEC6 0x0a3d -#define WCD9335_CDC_TX0_TX_PATH_SEC7 0x0a3e -#define WCD9335_CDC_TX1_TX_PATH_CTL 0x0a41 -#define WCD9335_CDC_TX1_TX_PATH_CFG0 0x0a42 -#define WCD9335_CDC_TX1_TX_PATH_CFG1 0x0a43 -#define WCD9335_CDC_TX1_TX_VOL_CTL 0x0a44 -#define WCD9335_CDC_TX1_TX_PATH_192_CTL 0x0a45 -#define WCD9335_CDC_TX1_TX_PATH_192_CFG 0x0a46 -#define WCD9335_CDC_TX1_TX_PATH_SEC0 0x0a47 -#define WCD9335_CDC_TX1_TX_PATH_SEC1 0x0a48 -#define WCD9335_CDC_TX1_TX_PATH_SEC2 0x0a49 -#define WCD9335_CDC_TX1_TX_PATH_SEC3 0x0a4a -#define WCD9335_CDC_TX1_TX_PATH_SEC4 0x0a4b -#define WCD9335_CDC_TX1_TX_PATH_SEC5 0x0a4c -#define WCD9335_CDC_TX1_TX_PATH_SEC6 0x0a4d -#define WCD9335_CDC_TX2_TX_PATH_CTL 0x0a51 -#define WCD9335_CDC_TX2_TX_PATH_CFG0 0x0a52 -#define WCD9335_CDC_TX2_TX_PATH_CFG1 0x0a53 -#define WCD9335_CDC_TX2_TX_VOL_CTL 0x0a54 -#define WCD9335_CDC_TX2_TX_PATH_192_CTL 0x0a55 -#define WCD9335_CDC_TX2_TX_PATH_192_CFG 0x0a56 -#define WCD9335_CDC_TX2_TX_PATH_SEC0 0x0a57 -#define WCD9335_CDC_TX2_TX_PATH_SEC1 0x0a58 -#define WCD9335_CDC_TX2_TX_PATH_SEC2 0x0a59 -#define WCD9335_CDC_TX2_TX_PATH_SEC3 0x0a5a -#define WCD9335_CDC_TX2_TX_PATH_SEC4 0x0a5b -#define WCD9335_CDC_TX2_TX_PATH_SEC5 0x0a5c -#define WCD9335_CDC_TX2_TX_PATH_SEC6 0x0a5d -#define WCD9335_CDC_TX3_TX_PATH_CTL 0x0a61 -#define WCD9335_CDC_TX3_TX_PATH_CFG0 0x0a62 -#define WCD9335_CDC_TX3_TX_PATH_CFG1 0x0a63 -#define WCD9335_CDC_TX3_TX_VOL_CTL 0x0a64 -#define WCD9335_CDC_TX3_TX_PATH_192_CTL 0x0a65 -#define WCD9335_CDC_TX3_TX_PATH_192_CFG 0x0a66 -#define WCD9335_CDC_TX3_TX_PATH_SEC0 0x0a67 -#define WCD9335_CDC_TX3_TX_PATH_SEC1 0x0a68 -#define WCD9335_CDC_TX3_TX_PATH_SEC2 0x0a69 -#define WCD9335_CDC_TX3_TX_PATH_SEC3 0x0a6a -#define WCD9335_CDC_TX3_TX_PATH_SEC4 0x0a6b -#define WCD9335_CDC_TX3_TX_PATH_SEC5 0x0a6c -#define WCD9335_CDC_TX3_TX_PATH_SEC6 0x0a6d -#define WCD9335_CDC_TX4_TX_PATH_CTL 0x0a71 -#define WCD9335_CDC_TX4_TX_PATH_CFG0 0x0a72 -#define WCD9335_CDC_TX4_TX_PATH_CFG1 0x0a73 -#define WCD9335_CDC_TX4_TX_VOL_CTL 0x0a74 -#define WCD9335_CDC_TX4_TX_PATH_192_CTL 0x0a75 -#define WCD9335_CDC_TX4_TX_PATH_192_CFG 0x0a76 -#define WCD9335_CDC_TX4_TX_PATH_SEC0 0x0a77 -#define WCD9335_CDC_TX4_TX_PATH_SEC1 0x0a78 -#define WCD9335_CDC_TX4_TX_PATH_SEC2 0x0a79 -#define WCD9335_CDC_TX4_TX_PATH_SEC3 0x0a7a -#define WCD9335_CDC_TX4_TX_PATH_SEC4 0x0a7b -#define WCD9335_CDC_TX4_TX_PATH_SEC5 0x0a7c -#define WCD9335_CDC_TX4_TX_PATH_SEC6 0x0a7d -#define WCD9335_CDC_TX5_TX_PATH_CTL 0x0a81 -#define WCD9335_CDC_TX5_TX_PATH_CFG0 0x0a82 -#define WCD9335_CDC_TX5_TX_PATH_CFG1 0x0a83 -#define WCD9335_CDC_TX5_TX_VOL_CTL 0x0a84 -#define WCD9335_CDC_TX5_TX_PATH_192_CTL 0x0a85 -#define WCD9335_CDC_TX5_TX_PATH_192_CFG 0x0a86 -#define WCD9335_CDC_TX5_TX_PATH_SEC0 0x0a87 -#define WCD9335_CDC_TX5_TX_PATH_SEC1 0x0a88 -#define WCD9335_CDC_TX5_TX_PATH_SEC2 0x0a89 -#define WCD9335_CDC_TX5_TX_PATH_SEC3 0x0a8a -#define WCD9335_CDC_TX5_TX_PATH_SEC4 0x0a8b -#define WCD9335_CDC_TX5_TX_PATH_SEC5 0x0a8c -#define WCD9335_CDC_TX5_TX_PATH_SEC6 0x0a8d -#define WCD9335_CDC_TX6_TX_PATH_CTL 0x0a91 -#define WCD9335_CDC_TX6_TX_PATH_CFG0 0x0a92 -#define WCD9335_CDC_TX6_TX_PATH_CFG1 0x0a93 -#define WCD9335_CDC_TX6_TX_VOL_CTL 0x0a94 -#define WCD9335_CDC_TX6_TX_PATH_192_CTL 0x0a95 -#define WCD9335_CDC_TX6_TX_PATH_192_CFG 0x0a96 -#define WCD9335_CDC_TX6_TX_PATH_SEC0 0x0a97 -#define WCD9335_CDC_TX6_TX_PATH_SEC1 0x0a98 -#define WCD9335_CDC_TX6_TX_PATH_SEC2 0x0a99 -#define WCD9335_CDC_TX6_TX_PATH_SEC3 0x0a9a -#define WCD9335_CDC_TX6_TX_PATH_SEC4 0x0a9b -#define WCD9335_CDC_TX6_TX_PATH_SEC5 0x0a9c -#define WCD9335_CDC_TX6_TX_PATH_SEC6 0x0a9d -#define WCD9335_CDC_TX7_TX_PATH_CTL 0x0aa1 -#define WCD9335_CDC_TX7_TX_PATH_CFG0 0x0aa2 -#define WCD9335_CDC_TX7_TX_PATH_CFG1 0x0aa3 -#define WCD9335_CDC_TX7_TX_VOL_CTL 0x0aa4 -#define WCD9335_CDC_TX7_TX_PATH_192_CTL 0x0aa5 -#define WCD9335_CDC_TX7_TX_PATH_192_CFG 0x0aa6 -#define WCD9335_CDC_TX7_TX_PATH_SEC0 0x0aa7 -#define WCD9335_CDC_TX7_TX_PATH_SEC1 0x0aa8 -#define WCD9335_CDC_TX7_TX_PATH_SEC2 0x0aa9 -#define WCD9335_CDC_TX7_TX_PATH_SEC3 0x0aaa -#define WCD9335_CDC_TX7_TX_PATH_SEC4 0x0aab -#define WCD9335_CDC_TX7_TX_PATH_SEC5 0x0aac -#define WCD9335_CDC_TX7_TX_PATH_SEC6 0x0aad -#define WCD9335_CDC_TX8_TX_PATH_CTL 0x0ab1 -#define WCD9335_CDC_TX8_TX_PATH_CFG0 0x0ab2 -#define WCD9335_CDC_TX8_TX_PATH_CFG1 0x0ab3 -#define WCD9335_CDC_TX8_TX_VOL_CTL 0x0ab4 -#define WCD9335_CDC_TX8_TX_PATH_192_CTL 0x0ab5 -#define WCD9335_CDC_TX8_TX_PATH_192_CFG 0x0ab6 -#define WCD9335_CDC_TX8_TX_PATH_SEC0 0x0ab7 -#define WCD9335_CDC_TX8_TX_PATH_SEC1 0x0ab8 -#define WCD9335_CDC_TX8_TX_PATH_SEC2 0x0ab9 -#define WCD9335_CDC_TX8_TX_PATH_SEC3 0x0aba -#define WCD9335_CDC_TX8_TX_PATH_SEC4 0x0abb -#define WCD9335_CDC_TX8_TX_PATH_SEC5 0x0abc -#define WCD9335_CDC_TX8_TX_PATH_SEC6 0x0abd -#define WCD9335_CDC_TX9_SPKR_PROT_PATH_CTL 0x0ac2 -#define WCD9335_CDC_TX9_SPKR_PROT_PATH_CFG0 0x0ac3 -#define WCD9335_CDC_TX10_SPKR_PROT_PATH_CTL 0x0ac6 -#define WCD9335_CDC_TX10_SPKR_PROT_PATH_CFG0 0x0ac7 -#define WCD9335_CDC_TX11_SPKR_PROT_PATH_CTL 0x0aca -#define WCD9335_CDC_TX11_SPKR_PROT_PATH_CFG0 0x0acb -#define WCD9335_CDC_TX12_SPKR_PROT_PATH_CTL 0x0ace -#define WCD9335_CDC_TX12_SPKR_PROT_PATH_CFG0 0x0acf - -/* Page-11 Registers */ -#define WCD9335_PAGE11_PAGE_REGISTER 0x0b00 -#define WCD9335_CDC_COMPANDER1_CTL0 0x0b01 -#define WCD9335_CDC_COMPANDER1_CTL1 0x0b02 -#define WCD9335_CDC_COMPANDER1_CTL2 0x0b03 -#define WCD9335_CDC_COMPANDER1_CTL3 0x0b04 -#define WCD9335_CDC_COMPANDER1_CTL4 0x0b05 -#define WCD9335_CDC_COMPANDER1_CTL5 0x0b06 -#define WCD9335_CDC_COMPANDER1_CTL6 0x0b07 -#define WCD9335_CDC_COMPANDER1_CTL7 0x0b08 -#define WCD9335_CDC_COMPANDER2_CTL0 0x0b09 -#define WCD9335_CDC_COMPANDER2_CTL1 0x0b0a -#define WCD9335_CDC_COMPANDER2_CTL2 0x0b0b -#define WCD9335_CDC_COMPANDER2_CTL3 0x0b0c -#define WCD9335_CDC_COMPANDER2_CTL4 0x0b0d -#define WCD9335_CDC_COMPANDER2_CTL5 0x0b0e -#define WCD9335_CDC_COMPANDER2_CTL6 0x0b0f -#define WCD9335_CDC_COMPANDER2_CTL7 0x0b10 -#define WCD9335_CDC_COMPANDER3_CTL0 0x0b11 -#define WCD9335_CDC_COMPANDER3_CTL1 0x0b12 -#define WCD9335_CDC_COMPANDER3_CTL2 0x0b13 -#define WCD9335_CDC_COMPANDER3_CTL3 0x0b14 -#define WCD9335_CDC_COMPANDER3_CTL4 0x0b15 -#define WCD9335_CDC_COMPANDER3_CTL5 0x0b16 -#define WCD9335_CDC_COMPANDER3_CTL6 0x0b17 -#define WCD9335_CDC_COMPANDER3_CTL7 0x0b18 -#define WCD9335_CDC_COMPANDER4_CTL0 0x0b19 -#define WCD9335_CDC_COMPANDER4_CTL1 0x0b1a -#define WCD9335_CDC_COMPANDER4_CTL2 0x0b1b -#define WCD9335_CDC_COMPANDER4_CTL3 0x0b1c -#define WCD9335_CDC_COMPANDER4_CTL4 0x0b1d -#define WCD9335_CDC_COMPANDER4_CTL5 0x0b1e -#define WCD9335_CDC_COMPANDER4_CTL6 0x0b1f -#define WCD9335_CDC_COMPANDER4_CTL7 0x0b20 -#define WCD9335_CDC_COMPANDER5_CTL0 0x0b21 -#define WCD9335_CDC_COMPANDER5_CTL1 0x0b22 -#define WCD9335_CDC_COMPANDER5_CTL2 0x0b23 -#define WCD9335_CDC_COMPANDER5_CTL3 0x0b24 -#define WCD9335_CDC_COMPANDER5_CTL4 0x0b25 -#define WCD9335_CDC_COMPANDER5_CTL5 0x0b26 -#define WCD9335_CDC_COMPANDER5_CTL6 0x0b27 -#define WCD9335_CDC_COMPANDER5_CTL7 0x0b28 -#define WCD9335_CDC_COMPANDER6_CTL0 0x0b29 -#define WCD9335_CDC_COMPANDER6_CTL1 0x0b2a -#define WCD9335_CDC_COMPANDER6_CTL2 0x0b2b -#define WCD9335_CDC_COMPANDER6_CTL3 0x0b2c -#define WCD9335_CDC_COMPANDER6_CTL4 0x0b2d -#define WCD9335_CDC_COMPANDER6_CTL5 0x0b2e -#define WCD9335_CDC_COMPANDER6_CTL6 0x0b2f -#define WCD9335_CDC_COMPANDER6_CTL7 0x0b30 -#define WCD9335_CDC_COMPANDER7_CTL0 0x0b31 -#define WCD9335_CDC_COMPANDER7_CTL1 0x0b32 -#define WCD9335_CDC_COMPANDER7_CTL2 0x0b33 -#define WCD9335_CDC_COMPANDER7_CTL3 0x0b34 -#define WCD9335_CDC_COMPANDER7_CTL4 0x0b35 -#define WCD9335_CDC_COMPANDER7_CTL5 0x0b36 -#define WCD9335_CDC_COMPANDER7_CTL6 0x0b37 -#define WCD9335_CDC_COMPANDER7_CTL7 0x0b38 -#define WCD9335_CDC_COMPANDER8_CTL0 0x0b39 -#define WCD9335_CDC_COMPANDER8_CTL1 0x0b3a -#define WCD9335_CDC_COMPANDER8_CTL2 0x0b3b -#define WCD9335_CDC_COMPANDER8_CTL3 0x0b3c -#define WCD9335_CDC_COMPANDER8_CTL4 0x0b3d -#define WCD9335_CDC_COMPANDER8_CTL5 0x0b3e -#define WCD9335_CDC_COMPANDER8_CTL6 0x0b3f -#define WCD9335_CDC_COMPANDER8_CTL7 0x0b40 -#define WCD9335_CDC_RX0_RX_PATH_CTL 0x0b41 -#define WCD9335_CDC_RX0_RX_PATH_CFG0 0x0b42 -#define WCD9335_CDC_RX0_RX_PATH_CFG1 0x0b43 -#define WCD9335_CDC_RX0_RX_PATH_CFG2 0x0b44 -#define WCD9335_CDC_RX0_RX_VOL_CTL 0x0b45 -#define WCD9335_CDC_RX0_RX_PATH_MIX_CTL 0x0b46 -#define WCD9335_CDC_RX0_RX_PATH_MIX_CFG 0x0b47 -#define WCD9335_CDC_RX0_RX_VOL_MIX_CTL 0x0b48 -#define WCD9335_CDC_RX0_RX_PATH_SEC0 0x0b49 -#define WCD9335_CDC_RX0_RX_PATH_SEC1 0x0b4a -#define WCD9335_CDC_RX0_RX_PATH_SEC2 0x0b4b -#define WCD9335_CDC_RX0_RX_PATH_SEC3 0x0b4c -#define WCD9335_CDC_RX0_RX_PATH_SEC5 0x0b4e -#define WCD9335_CDC_RX0_RX_PATH_SEC6 0x0b4f -#define WCD9335_CDC_RX0_RX_PATH_SEC7 0x0b50 -#define WCD9335_CDC_RX0_RX_PATH_MIX_SEC0 0x0b51 -#define WCD9335_CDC_RX0_RX_PATH_MIX_SEC1 0x0b52 -#define WCD9335_CDC_RX1_RX_PATH_CTL 0x0b55 -#define WCD9335_CDC_RX1_RX_PATH_CFG0 0x0b56 -#define WCD9335_CDC_RX1_RX_PATH_CFG1 0x0b57 -#define WCD9335_CDC_RX1_RX_PATH_CFG2 0x0b58 -#define WCD9335_CDC_RX1_RX_VOL_CTL 0x0b59 -#define WCD9335_CDC_RX1_RX_PATH_MIX_CTL 0x0b5a -#define WCD9335_CDC_RX1_RX_PATH_MIX_CFG 0x0b5b -#define WCD9335_CDC_RX1_RX_VOL_MIX_CTL 0x0b5c -#define WCD9335_CDC_RX1_RX_PATH_SEC0 0x0b5d -#define WCD9335_CDC_RX1_RX_PATH_SEC1 0x0b5e -#define WCD9335_CDC_RX1_RX_PATH_SEC2 0x0b5f -#define WCD9335_CDC_RX1_RX_PATH_SEC3 0x0b60 -#define WCD9335_CDC_RX1_RX_PATH_SEC4 0x0b61 -#define WCD9335_CDC_RX1_RX_PATH_SEC5 0x0b62 -#define WCD9335_CDC_RX1_RX_PATH_SEC6 0x0b63 -#define WCD9335_CDC_RX1_RX_PATH_SEC7 0x0b64 -#define WCD9335_CDC_RX1_RX_PATH_MIX_SEC0 0x0b65 -#define WCD9335_CDC_RX1_RX_PATH_MIX_SEC1 0x0b66 -#define WCD9335_CDC_RX2_RX_PATH_CTL 0x0b69 -#define WCD9335_CDC_RX2_RX_PATH_CFG0 0x0b6a -#define WCD9335_CDC_RX2_RX_PATH_CFG1 0x0b6b -#define WCD9335_CDC_RX2_RX_PATH_CFG2 0x0b6c -#define WCD9335_CDC_RX2_RX_VOL_CTL 0x0b6d -#define WCD9335_CDC_RX2_RX_PATH_MIX_CTL 0x0b6e -#define WCD9335_CDC_RX2_RX_PATH_MIX_CFG 0x0b6f -#define WCD9335_CDC_RX2_RX_VOL_MIX_CTL 0x0b70 -#define WCD9335_CDC_RX2_RX_PATH_SEC0 0x0b71 -#define WCD9335_CDC_RX2_RX_PATH_SEC1 0x0b72 -#define WCD9335_CDC_RX2_RX_PATH_SEC2 0x0b73 -#define WCD9335_CDC_RX2_RX_PATH_SEC3 0x0b74 -#define WCD9335_CDC_RX2_RX_PATH_SEC4 0x0b75 -#define WCD9335_CDC_RX2_RX_PATH_SEC5 0x0b76 -#define WCD9335_CDC_RX2_RX_PATH_SEC6 0x0b77 -#define WCD9335_CDC_RX2_RX_PATH_SEC7 0x0b78 -#define WCD9335_CDC_RX2_RX_PATH_MIX_SEC0 0x0b79 -#define WCD9335_CDC_RX2_RX_PATH_MIX_SEC1 0x0b7a -#define WCD9335_CDC_RX3_RX_PATH_CTL 0x0b7d -#define WCD9335_CDC_RX3_RX_PATH_CFG0 0x0b7e -#define WCD9335_CDC_RX3_RX_PATH_CFG1 0x0b7f -#define WCD9335_CDC_RX3_RX_PATH_CFG2 0x0b80 -#define WCD9335_CDC_RX3_RX_VOL_CTL 0x0b81 -#define WCD9335_CDC_RX3_RX_PATH_MIX_CTL 0x0b82 -#define WCD9335_CDC_RX3_RX_PATH_MIX_CFG 0x0b83 -#define WCD9335_CDC_RX3_RX_VOL_MIX_CTL 0x0b84 -#define WCD9335_CDC_RX3_RX_PATH_SEC0 0x0b85 -#define WCD9335_CDC_RX3_RX_PATH_SEC1 0x0b86 -#define WCD9335_CDC_RX3_RX_PATH_SEC2 0x0b87 -#define WCD9335_CDC_RX3_RX_PATH_SEC3 0x0b88 -#define WCD9335_CDC_RX3_RX_PATH_SEC5 0x0b8a -#define WCD9335_CDC_RX3_RX_PATH_SEC6 0x0b8b -#define WCD9335_CDC_RX3_RX_PATH_SEC7 0x0b8c -#define WCD9335_CDC_RX3_RX_PATH_MIX_SEC0 0x0b8d -#define WCD9335_CDC_RX3_RX_PATH_MIX_SEC1 0x0b8e -#define WCD9335_CDC_RX4_RX_PATH_CTL 0x0b91 -#define WCD9335_CDC_RX4_RX_PATH_CFG0 0x0b92 -#define WCD9335_CDC_RX4_RX_PATH_CFG1 0x0b93 -#define WCD9335_CDC_RX4_RX_PATH_CFG2 0x0b94 -#define WCD9335_CDC_RX4_RX_VOL_CTL 0x0b95 -#define WCD9335_CDC_RX4_RX_PATH_MIX_CTL 0x0b96 -#define WCD9335_CDC_RX4_RX_PATH_MIX_CFG 0x0b97 -#define WCD9335_CDC_RX4_RX_VOL_MIX_CTL 0x0b98 -#define WCD9335_CDC_RX4_RX_PATH_SEC0 0x0b99 -#define WCD9335_CDC_RX4_RX_PATH_SEC1 0x0b9a -#define WCD9335_CDC_RX4_RX_PATH_SEC2 0x0b9b -#define WCD9335_CDC_RX4_RX_PATH_SEC3 0x0b9c -#define WCD9335_CDC_RX4_RX_PATH_SEC5 0x0b9e -#define WCD9335_CDC_RX4_RX_PATH_SEC6 0x0b9f -#define WCD9335_CDC_RX4_RX_PATH_SEC7 0x0ba0 -#define WCD9335_CDC_RX4_RX_PATH_MIX_SEC0 0x0ba1 -#define WCD9335_CDC_RX4_RX_PATH_MIX_SEC1 0x0ba2 -#define WCD9335_CDC_RX5_RX_PATH_CTL 0x0ba5 -#define WCD9335_CDC_RX5_RX_PATH_CFG0 0x0ba6 -#define WCD9335_CDC_RX5_RX_PATH_CFG1 0x0ba7 -#define WCD9335_CDC_RX5_RX_PATH_CFG2 0x0ba8 -#define WCD9335_CDC_RX5_RX_VOL_CTL 0x0ba9 -#define WCD9335_CDC_RX5_RX_PATH_MIX_CTL 0x0baa -#define WCD9335_CDC_RX5_RX_PATH_MIX_CFG 0x0bab -#define WCD9335_CDC_RX5_RX_VOL_MIX_CTL 0x0bac -#define WCD9335_CDC_RX5_RX_PATH_SEC0 0x0bad -#define WCD9335_CDC_RX5_RX_PATH_SEC1 0x0bae -#define WCD9335_CDC_RX5_RX_PATH_SEC2 0x0baf -#define WCD9335_CDC_RX5_RX_PATH_SEC3 0x0bb0 -#define WCD9335_CDC_RX5_RX_PATH_SEC5 0x0bb2 -#define WCD9335_CDC_RX5_RX_PATH_SEC6 0x0bb3 -#define WCD9335_CDC_RX5_RX_PATH_SEC7 0x0bb4 -#define WCD9335_CDC_RX5_RX_PATH_MIX_SEC0 0x0bb5 -#define WCD9335_CDC_RX5_RX_PATH_MIX_SEC1 0x0bb6 -#define WCD9335_CDC_RX6_RX_PATH_CTL 0x0bb9 -#define WCD9335_CDC_RX6_RX_PATH_CFG0 0x0bba -#define WCD9335_CDC_RX6_RX_PATH_CFG1 0x0bbb -#define WCD9335_CDC_RX6_RX_PATH_CFG2 0x0bbc -#define WCD9335_CDC_RX6_RX_VOL_CTL 0x0bbd -#define WCD9335_CDC_RX6_RX_PATH_MIX_CTL 0x0bbe -#define WCD9335_CDC_RX6_RX_PATH_MIX_CFG 0x0bbf -#define WCD9335_CDC_RX6_RX_VOL_MIX_CTL 0x0bc0 -#define WCD9335_CDC_RX6_RX_PATH_SEC0 0x0bc1 -#define WCD9335_CDC_RX6_RX_PATH_SEC1 0x0bc2 -#define WCD9335_CDC_RX6_RX_PATH_SEC2 0x0bc3 -#define WCD9335_CDC_RX6_RX_PATH_SEC3 0x0bc4 -#define WCD9335_CDC_RX6_RX_PATH_SEC5 0x0bc6 -#define WCD9335_CDC_RX6_RX_PATH_SEC6 0x0bc7 -#define WCD9335_CDC_RX6_RX_PATH_SEC7 0x0bc8 -#define WCD9335_CDC_RX6_RX_PATH_MIX_SEC0 0x0bc9 -#define WCD9335_CDC_RX6_RX_PATH_MIX_SEC1 0x0bca -#define WCD9335_CDC_RX7_RX_PATH_CTL 0x0bcd -#define WCD9335_CDC_RX7_RX_PATH_CFG0 0x0bce -#define WCD9335_CDC_RX7_RX_PATH_CFG1 0x0bcf -#define WCD9335_CDC_RX7_RX_PATH_CFG2 0x0bd0 -#define WCD9335_CDC_RX7_RX_VOL_CTL 0x0bd1 -#define WCD9335_CDC_RX7_RX_PATH_MIX_CTL 0x0bd2 -#define WCD9335_CDC_RX7_RX_PATH_MIX_CFG 0x0bd3 -#define WCD9335_CDC_RX7_RX_VOL_MIX_CTL 0x0bd4 -#define WCD9335_CDC_RX7_RX_PATH_SEC0 0x0bd5 -#define WCD9335_CDC_RX7_RX_PATH_SEC1 0x0bd6 -#define WCD9335_CDC_RX7_RX_PATH_SEC2 0x0bd7 -#define WCD9335_CDC_RX7_RX_PATH_SEC3 0x0bd8 -#define WCD9335_CDC_RX7_RX_PATH_SEC5 0x0bda -#define WCD9335_CDC_RX7_RX_PATH_SEC6 0x0bdb -#define WCD9335_CDC_RX7_RX_PATH_SEC7 0x0bdc -#define WCD9335_CDC_RX7_RX_PATH_MIX_SEC0 0x0bdd -#define WCD9335_CDC_RX7_RX_PATH_MIX_SEC1 0x0bde -#define WCD9335_CDC_RX8_RX_PATH_CTL 0x0be1 -#define WCD9335_CDC_RX8_RX_PATH_CFG0 0x0be2 -#define WCD9335_CDC_RX8_RX_PATH_CFG1 0x0be3 -#define WCD9335_CDC_RX8_RX_PATH_CFG2 0x0be4 -#define WCD9335_CDC_RX8_RX_VOL_CTL 0x0be5 -#define WCD9335_CDC_RX8_RX_PATH_MIX_CTL 0x0be6 -#define WCD9335_CDC_RX8_RX_PATH_MIX_CFG 0x0be7 -#define WCD9335_CDC_RX8_RX_VOL_MIX_CTL 0x0be8 -#define WCD9335_CDC_RX8_RX_PATH_SEC0 0x0be9 -#define WCD9335_CDC_RX8_RX_PATH_SEC1 0x0bea -#define WCD9335_CDC_RX8_RX_PATH_SEC2 0x0beb -#define WCD9335_CDC_RX8_RX_PATH_SEC3 0x0bec -#define WCD9335_CDC_RX8_RX_PATH_SEC5 0x0bee -#define WCD9335_CDC_RX8_RX_PATH_SEC6 0x0bef -#define WCD9335_CDC_RX8_RX_PATH_SEC7 0x0bf0 -#define WCD9335_CDC_RX8_RX_PATH_MIX_SEC0 0x0bf1 -#define WCD9335_CDC_RX8_RX_PATH_MIX_SEC1 0x0bf2 - -/* Page-12 Registers */ -#define WCD9335_PAGE12_PAGE_REGISTER 0x0c00 -#define WCD9335_CDC_CLSH_CRC 0x0c01 -#define WCD9335_CDC_CLSH_DLY_CTRL 0x0c02 -#define WCD9335_CDC_CLSH_DECAY_CTRL 0x0c03 -#define WCD9335_CDC_CLSH_HPH_V_PA 0x0c04 -#define WCD9335_CDC_CLSH_EAR_V_PA 0x0c05 -#define WCD9335_CDC_CLSH_HPH_V_HD 0x0c06 -#define WCD9335_CDC_CLSH_EAR_V_HD 0x0c07 -#define WCD9335_CDC_CLSH_K1_MSB 0x0c08 -#define WCD9335_CDC_CLSH_K1_LSB 0x0c09 -#define WCD9335_CDC_CLSH_K2_MSB 0x0c0a -#define WCD9335_CDC_CLSH_K2_LSB 0x0c0b -#define WCD9335_CDC_CLSH_IDLE_CTRL 0x0c0c -#define WCD9335_CDC_CLSH_IDLE_HPH 0x0c0d -#define WCD9335_CDC_CLSH_IDLE_EAR 0x0c0e -#define WCD9335_CDC_CLSH_TEST0 0x0c0f -#define WCD9335_CDC_CLSH_TEST1 0x0c10 -#define WCD9335_CDC_CLSH_OVR_VREF 0x0c11 -#define WCD9335_CDC_BOOST0_BOOST_PATH_CTL 0x0c19 -#define WCD9335_CDC_BOOST0_BOOST_CTL 0x0c1a -#define WCD9335_CDC_BOOST0_BOOST_CFG1 0x0c1b -#define WCD9335_CDC_BOOST0_BOOST_CFG2 0x0c1c -#define WCD9335_CDC_BOOST1_BOOST_PATH_CTL 0x0c21 -#define WCD9335_CDC_BOOST1_BOOST_CTL 0x0c22 -#define WCD9335_CDC_BOOST1_BOOST_CFG1 0x0c23 -#define WCD9335_CDC_BOOST1_BOOST_CFG2 0x0c24 -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_0 0x0c29 -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_1 0x0c2a -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_2 0x0c2b -#define WCD9335_SWR_AHB_BRIDGE_WR_DATA_3 0x0c2c -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_0 0x0c2d -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_1 0x0c2e -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_2 0x0c2f -#define WCD9335_SWR_AHB_BRIDGE_WR_ADDR_3 0x0c30 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_0 0x0c31 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_1 0x0c32 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_2 0x0c33 -#define WCD9335_SWR_AHB_BRIDGE_RD_ADDR_3 0x0c34 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_0 0x0c35 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_1 0x0c36 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_2 0x0c37 -#define WCD9335_SWR_AHB_BRIDGE_RD_DATA_3 0x0c38 -#define WCD9335_SWR_AHB_BRIDGE_ACCESS_CFG 0x0c39 -#define WCD9335_SWR_AHB_BRIDGE_ACCESS_STATUS 0x0c3a -#define WCD9335_CDC_VBAT_VBAT_PATH_CTL 0x0c3d -#define WCD9335_CDC_VBAT_VBAT_CFG 0x0c3e -#define WCD9335_CDC_VBAT_VBAT_ADC_CAL1 0x0c3f -#define WCD9335_CDC_VBAT_VBAT_ADC_CAL2 0x0c40 -#define WCD9335_CDC_VBAT_VBAT_ADC_CAL3 0x0c41 -#define WCD9335_CDC_VBAT_VBAT_PK_EST1 0x0c42 -#define WCD9335_CDC_VBAT_VBAT_PK_EST2 0x0c43 -#define WCD9335_CDC_VBAT_VBAT_PK_EST3 0x0c44 -#define WCD9335_CDC_VBAT_VBAT_RF_PROC1 0x0c45 -#define WCD9335_CDC_VBAT_VBAT_RF_PROC2 0x0c46 -#define WCD9335_CDC_VBAT_VBAT_TAC1 0x0c47 -#define WCD9335_CDC_VBAT_VBAT_TAC2 0x0c48 -#define WCD9335_CDC_VBAT_VBAT_TAC3 0x0c49 -#define WCD9335_CDC_VBAT_VBAT_TAC4 0x0c4a -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD1 0x0c4b -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD2 0x0c4c -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD3 0x0c4d -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD4 0x0c4e -#define WCD9335_CDC_VBAT_VBAT_DEBUG1 0x0c4f -#define WCD9335_CDC_VBAT_VBAT_GAIN_UPD_MON 0x0c50 -#define WCD9335_CDC_VBAT_VBAT_GAIN_MON_VAL 0x0c51 -#define WCD9335_SPLINE_SRC0_CLK_RST_CTL_0 0x0c55 -#define WCD9335_SPLINE_SRC0_STATUS 0x0c56 -#define WCD9335_SPLINE_SRC1_CLK_RST_CTL_0 0x0c6d -#define WCD9335_SPLINE_SRC1_STATUS 0x0c6e -#define WCD9335_SPLINE_SRC2_CLK_RST_CTL_0 0x0c85 -#define WCD9335_SPLINE_SRC2_STATUS 0x0c86 -#define WCD9335_SPLINE_SRC3_CLK_RST_CTL_0 0x0c9d -#define WCD9335_SPLINE_SRC3_STATUS 0x0c9e -#define WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL 0x0cb5 -#define WCD9335_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1 0x0cb6 -#define WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL 0x0cb9 -#define WCD9335_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1 0x0cba - -/* Page-13 Registers */ -#define WCD9335_PAGE13_PAGE_REGISTER 0x0d00 -#define WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0 0x0d01 -#define WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1 0x0d02 -#define WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0 0x0d03 -#define WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1 0x0d04 -#define WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0 0x0d05 -#define WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1 0x0d06 -#define WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0 0x0d07 -#define WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1 0x0d08 -#define WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0 0x0d09 -#define WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1 0x0d0a -#define WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0 0x0d0b -#define WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1 0x0d0c -#define WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0 0x0d0d -#define WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1 0x0d0e -#define WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0 0x0d0f -#define WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1 0x0d10 -#define WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0 0x0d11 -#define WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1 0x0d12 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG0 0x0d13 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG1 0x0d14 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG2 0x0d15 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG3 0x0d16 -#define WCD9335_CDC_RX_INP_MUX_RX_MIX_CFG4 0x0d17 -#define WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 0x0d18 -#define WCD9335_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1 0x0d19 -#define WCD9335_CDC_RX_INP_MUX_ANC_CFG0 0x0d1a -#define WCD9335_CDC_RX_INP_MUX_SPLINE_SRC_CFG0 0x0d1b -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0 0x0d1d -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1 0x0d1e -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0 0x0d1f -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1 0x0d20 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0 0x0d21 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1 0x0d22 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0 0x0d23 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1 0x0d24 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0 0x0d25 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0 0x0d26 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0 0x0d27 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0 0x0d28 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0 0x0d29 -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX10_CFG0 0x0d2b -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX11_CFG0 0x0d2c -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX12_CFG0 0x0d2d -#define WCD9335_CDC_TX_INP_MUX_ADC_MUX13_CFG0 0x0d2e -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0 0x0d31 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1 0x0d32 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2 0x0d33 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3 0x0d34 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0 0x0d35 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1 0x0d36 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2 0x0d37 -#define WCD9335_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3 0x0d38 -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0 0x0d3a -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1 0x0d3b -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2 0x0d3c -#define WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3 0x0d3d -#define WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL 0x0d41 -#define WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL 0x0d42 -#define WCD9335_CDC_CLK_RST_CTRL_SWR_CONTROL 0x0d43 -#define WCD9335_CDC_PROX_DETECT_PROX_CTL 0x0d49 -#define WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD0 0x0d4a -#define WCD9335_CDC_PROX_DETECT_PROX_POLL_PERIOD1 0x0d4b -#define WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB 0x0d4c -#define WCD9335_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB 0x0d4d -#define WCD9335_CDC_PROX_DETECT_PROX_STATUS 0x0d4e -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_CTRL 0x0d4f -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB 0x0d50 -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB 0x0d51 -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD 0x0d52 -#define WCD9335_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD 0x0d53 -#define WCD9335_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT 0x0d54 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_PATH_CTL 0x0d55 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL 0x0d56 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL 0x0d57 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL 0x0d58 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL 0x0d59 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL 0x0d5a -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL 0x0d5b -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL 0x0d5c -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL 0x0d5d -#define WCD9335_CDC_SIDETONE_IIR0_IIR_CTL 0x0d5e -#define WCD9335_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL 0x0d5f -#define WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL 0x0d60 -#define WCD9335_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL 0x0d61 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_PATH_CTL 0x0d65 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL 0x0d66 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL 0x0d67 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL 0x0d68 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL 0x0d69 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL 0x0d6a -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL 0x0d6b -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL 0x0d6c -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL 0x0d6d -#define WCD9335_CDC_SIDETONE_IIR1_IIR_CTL 0x0d6e -#define WCD9335_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL 0x0d6f -#define WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL 0x0d70 -#define WCD9335_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL 0x0d71 -#define WCD9335_CDC_TOP_TOP_CFG0 0x0d81 -#define WCD9335_CDC_TOP_TOP_CFG1 0x0d82 -#define WCD9335_CDC_TOP_TOP_CFG2 0x0d83 -#define WCD9335_CDC_TOP_TOP_CFG3 0x0d84 -#define WCD9335_CDC_TOP_TOP_CFG4 0x0d85 -#define WCD9335_CDC_TOP_TOP_CFG5 0x0d86 -#define WCD9335_CDC_TOP_TOP_CFG6 0x0d87 -#define WCD9335_CDC_TOP_TOP_CFG7 0x0d88 -#define WCD9335_CDC_TOP_HPHL_COMP_WR_LSB 0x0d89 -#define WCD9335_CDC_TOP_HPHL_COMP_WR_MSB 0x0d8a -#define WCD9335_CDC_TOP_HPHL_COMP_LUT 0x0d8b -#define WCD9335_CDC_TOP_HPHL_COMP_RD_LSB 0x0d8c -#define WCD9335_CDC_TOP_HPHL_COMP_RD_MSB 0x0d8d -#define WCD9335_CDC_TOP_HPHR_COMP_WR_LSB 0x0d8e -#define WCD9335_CDC_TOP_HPHR_COMP_WR_MSB 0x0d8f -#define WCD9335_CDC_TOP_HPHR_COMP_LUT 0x0d90 -#define WCD9335_CDC_TOP_HPHR_COMP_RD_LSB 0x0d91 -#define WCD9335_CDC_TOP_HPHR_COMP_RD_MSB 0x0d92 -#define WCD9335_CDC_TOP_DIFFL_COMP_WR_LSB 0x0d93 -#define WCD9335_CDC_TOP_DIFFL_COMP_WR_MSB 0x0d94 -#define WCD9335_CDC_TOP_DIFFL_COMP_LUT 0x0d95 -#define WCD9335_CDC_TOP_DIFFL_COMP_RD_LSB 0x0d96 -#define WCD9335_CDC_TOP_DIFFL_COMP_RD_MSB 0x0d97 -#define WCD9335_CDC_TOP_DIFFR_COMP_WR_LSB 0x0d98 -#define WCD9335_CDC_TOP_DIFFR_COMP_WR_MSB 0x0d99 -#define WCD9335_CDC_TOP_DIFFR_COMP_LUT 0x0d9a -#define WCD9335_CDC_TOP_DIFFR_COMP_RD_LSB 0x0d9b -#define WCD9335_CDC_TOP_DIFFR_COMP_RD_MSB 0x0d9c - -/* Page-0x80 Registers */ -#define WCD9335_PAGE80_PAGE_REGISTER 0x8000 -#define WCD9335_TLMM_BIST_MODE_PINCFG 0x8001 -#define WCD9335_TLMM_RF_PA_ON_PINCFG 0x8002 -#define WCD9335_TLMM_INTR1_PINCFG 0x8003 -#define WCD9335_TLMM_INTR2_PINCFG 0x8004 -#define WCD9335_TLMM_SWR_DATA_PINCFG 0x8005 -#define WCD9335_TLMM_SWR_CLK_PINCFG 0x8006 -#define WCD9335_TLMM_SLIMBUS_DATA2_PINCFG 0x8007 -#define WCD9335_TLMM_I2C_CLK_PINCFG 0x8008 -#define WCD9335_TLMM_I2C_DATA_PINCFG 0x8009 -#define WCD9335_TLMM_I2S_RX_SD0_PINCFG 0x800a -#define WCD9335_TLMM_I2S_RX_SD1_PINCFG 0x800b -#define WCD9335_TLMM_I2S_RX_SCK_PINCFG 0x800c -#define WCD9335_TLMM_I2S_RX_WS_PINCFG 0x800d -#define WCD9335_TLMM_I2S_TX_SD0_PINCFG 0x800e -#define WCD9335_TLMM_I2S_TX_SD1_PINCFG 0x800f -#define WCD9335_TLMM_I2S_TX_SCK_PINCFG 0x8010 -#define WCD9335_TLMM_I2S_TX_WS_PINCFG 0x8011 -#define WCD9335_TLMM_DMIC1_CLK_PINCFG 0x8012 -#define WCD9335_TLMM_DMIC1_DATA_PINCFG 0x8013 -#define WCD9335_TLMM_DMIC2_CLK_PINCFG 0x8014 -#define WCD9335_TLMM_DMIC2_DATA_PINCFG 0x8015 -#define WCD9335_TLMM_DMIC3_CLK_PINCFG 0x8016 -#define WCD9335_TLMM_DMIC3_DATA_PINCFG 0x8017 -#define WCD9335_TLMM_JTDI_PINCFG 0x8018 -#define WCD9335_TLMM_JTDO_PINCFG 0x8019 -#define WCD9335_TLMM_JTMS_PINCFG 0x801a -#define WCD9335_TLMM_JTCK_PINCFG 0x801b -#define WCD9335_TLMM_JTRST_PINCFG 0x801c -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_0 0x8031 -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_1 0x8032 -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_2 0x8033 -#define WCD9335_TEST_DEBUG_PIN_CTL_OE_3 0x8034 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_0 0x8035 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_1 0x8036 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_2 0x8037 -#define WCD9335_TEST_DEBUG_PIN_CTL_DATA_3 0x8038 -#define WCD9335_TEST_DEBUG_PAD_DRVCTL 0x8039 -#define WCD9335_TEST_DEBUG_PIN_STATUS 0x803a -#define WCD9335_TEST_DEBUG_NPL_DLY_TEST_1 0x803b -#define WCD9335_TEST_DEBUG_NPL_DLY_TEST_2 0x803c -#define WCD9335_TEST_DEBUG_MEM_CTRL 0x803d -#define WCD9335_TEST_DEBUG_DEBUG_BUS_SEL 0x8041 -#define WCD9335_TEST_DEBUG_DEBUG_JTAG 0x8042 -#define WCD9335_TEST_DEBUG_DEBUG_EN_1 0x8043 -#define WCD9335_TEST_DEBUG_DEBUG_EN_2 0x8044 -#define WCD9335_TEST_DEBUG_DEBUG_EN_3 0x8045 -#define WCD9335_MAX_REGISTER 0x80FF - -/* SLIMBUS Slave Registers */ -#define TASHA_SLIM_PGD_PORT_INT_EN0 (0x30) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_RX_0 (0x34) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_RX_1 (0x35) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_TX_0 (0x36) -#define TASHA_SLIM_PGD_PORT_INT_STATUS_TX_1 (0x37) -#define TASHA_SLIM_PGD_PORT_INT_CLR_RX_0 (0x38) -#define TASHA_SLIM_PGD_PORT_INT_CLR_RX_1 (0x39) -#define TASHA_SLIM_PGD_PORT_INT_CLR_TX_0 (0x3A) -#define TASHA_SLIM_PGD_PORT_INT_CLR_TX_1 (0x3B) -#define TASHA_SLIM_PGD_PORT_INT_RX_SOURCE0 (0x60) -#define TASHA_SLIM_PGD_PORT_INT_TX_SOURCE0 (0x70) - -/* Macros for Packing Register Writes into a U32 */ -#define TASHA_PACKED_REG_SIZE sizeof(u32) - -#define TASHA_CODEC_PACK_ENTRY(reg, mask, val) ((val & 0xff)|\ - ((mask & 0xff) << 8)|((reg & 0xffff) << 16)) -#define TASHA_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ - do { \ - ((reg) = ((packed >> 16) & (0xffff))); \ - ((mask) = ((packed >> 8) & (0xff))); \ - ((val) = ((packed) & (0xff))); \ - } while (0) -#endif diff --git a/techpack/audio/asoc/codecs/wcd934x/Android.mk b/techpack/audio/asoc/codecs/wcd934x/Android.mk deleted file mode 100644 index af4f17b04cd2..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/Android.mk +++ /dev/null @@ -1,66 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd934x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd934x.ko -LOCAL_MODULE_KBUILD_NAME := wcd934x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/wcd934x/Kbuild b/techpack/audio/asoc/codecs/wcd934x/Kbuild deleted file mode 100644 index 33cf0fba3144..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/Kbuild +++ /dev/null @@ -1,144 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.9 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ WCD934X ############ - -# for WCD934X Codec -ifdef CONFIG_SND_SOC_WCD934X - WCD934X_OBJS += wcd934x.o - WCD934X_OBJS += wcd934x-dsp-cntl.o - WCD934X_OBJS += wcd934x-mbhc.o - WCD934X_OBJS += wcd934x-dsd.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_WCD934X) += wcd934x_dlkm.o -wcd934x_dlkm-y := $(WCD934X_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.c b/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.c deleted file mode 100644 index eea18c3d951b..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.c +++ /dev/null @@ -1,772 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include "wcd934x-dsd.h" - -#define DSD_VOLUME_MAX_0dB 0 -#define DSD_VOLUME_MIN_M110dB -110 - -#define DSD_VOLUME_RANGE_CHECK(x) ((x >= DSD_VOLUME_MIN_M110dB) &&\ - (x <= DSD_VOLUME_MAX_0dB)) -#define DSD_VOLUME_STEPS 3 -#define DSD_VOLUME_UPDATE_DELAY_MS 30 -#define DSD_VOLUME_USLEEP_MARGIN_US 100 -#define DSD_VOLUME_STEP_DELAY_US ((1000 * DSD_VOLUME_UPDATE_DELAY_MS) / \ - (2 * DSD_VOLUME_STEPS)) - -#define TAVIL_VERSION_1_0 0 -#define TAVIL_VERSION_1_1 1 - -static const DECLARE_TLV_DB_MINMAX(tavil_dsd_db_scale, DSD_VOLUME_MIN_M110dB, - DSD_VOLUME_MAX_0dB); - -static const char *const dsd_if_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", "RX6", "RX7", - "DSD_DATA_PAD" -}; - -static const char * const dsd_filt0_mux_text[] = { - "ZERO", "DSD_L IF MUX", -}; - -static const char * const dsd_filt1_mux_text[] = { - "ZERO", "DSD_R IF MUX", -}; - -static const struct soc_enum dsd_filt0_mux_enum = - SOC_ENUM_SINGLE(WCD934X_CDC_DSD0_PATH_CTL, 0, - ARRAY_SIZE(dsd_filt0_mux_text), dsd_filt0_mux_text); - -static const struct soc_enum dsd_filt1_mux_enum = - SOC_ENUM_SINGLE(WCD934X_CDC_DSD1_PATH_CTL, 0, - ARRAY_SIZE(dsd_filt1_mux_text), dsd_filt1_mux_text); - -static SOC_ENUM_SINGLE_DECL(dsd_l_if_enum, WCD934X_CDC_DSD0_CFG0, - 2, dsd_if_text); -static SOC_ENUM_SINGLE_DECL(dsd_r_if_enum, WCD934X_CDC_DSD1_CFG0, - 2, dsd_if_text); - -static const struct snd_kcontrol_new dsd_filt0_mux = - SOC_DAPM_ENUM("DSD Filt0 Mux", dsd_filt0_mux_enum); - -static const struct snd_kcontrol_new dsd_filt1_mux = - SOC_DAPM_ENUM("DSD Filt1 Mux", dsd_filt1_mux_enum); - -static const struct snd_kcontrol_new dsd_l_if_mux = - SOC_DAPM_ENUM("DSD Left If Mux", dsd_l_if_enum); -static const struct snd_kcontrol_new dsd_r_if_mux = - SOC_DAPM_ENUM("DSD Right If Mux", dsd_r_if_enum); - -static const struct snd_soc_dapm_route tavil_dsd_audio_map[] = { - {"DSD_L IF MUX", "RX0", "CDC_IF RX0 MUX"}, - {"DSD_L IF MUX", "RX1", "CDC_IF RX1 MUX"}, - {"DSD_L IF MUX", "RX2", "CDC_IF RX2 MUX"}, - {"DSD_L IF MUX", "RX3", "CDC_IF RX3 MUX"}, - {"DSD_L IF MUX", "RX4", "CDC_IF RX4 MUX"}, - {"DSD_L IF MUX", "RX5", "CDC_IF RX5 MUX"}, - {"DSD_L IF MUX", "RX6", "CDC_IF RX6 MUX"}, - {"DSD_L IF MUX", "RX7", "CDC_IF RX7 MUX"}, - - {"DSD_FILTER_0", NULL, "DSD_L IF MUX"}, - {"DSD_FILTER_0", NULL, "RX INT1 NATIVE SUPPLY"}, - {"RX INT1 MIX3", "DSD HPHL Switch", "DSD_FILTER_0"}, - - {"DSD_R IF MUX", "RX0", "CDC_IF RX0 MUX"}, - {"DSD_R IF MUX", "RX1", "CDC_IF RX1 MUX"}, - {"DSD_R IF MUX", "RX2", "CDC_IF RX2 MUX"}, - {"DSD_R IF MUX", "RX3", "CDC_IF RX3 MUX"}, - {"DSD_R IF MUX", "RX4", "CDC_IF RX4 MUX"}, - {"DSD_R IF MUX", "RX5", "CDC_IF RX5 MUX"}, - {"DSD_R IF MUX", "RX6", "CDC_IF RX6 MUX"}, - {"DSD_R IF MUX", "RX7", "CDC_IF RX7 MUX"}, - - {"DSD_FILTER_1", NULL, "DSD_R IF MUX"}, - {"DSD_FILTER_1", NULL, "RX INT2 NATIVE SUPPLY"}, - {"RX INT2 MIX3", "DSD HPHR Switch", "DSD_FILTER_1"}, - - {"DSD_FILTER_0", NULL, "RX INT3 NATIVE SUPPLY"}, - {"RX INT3 MIX3", "DSD LO1 Switch", "DSD_FILTER_0"}, - {"DSD_FILTER_1", NULL, "RX INT4 NATIVE SUPPLY"}, - {"RX INT4 MIX3", "DSD LO2 Switch", "DSD_FILTER_1"}, -}; - -static bool is_valid_dsd_interpolator(int interp_num) -{ - if ((interp_num == INTERP_HPHL) || (interp_num == INTERP_HPHR) || - (interp_num == INTERP_LO1) || (interp_num == INTERP_LO2)) - return true; - - return false; -} - -/** - * tavil_dsd_set_mixer_value - Set DSD HPH/LO mixer value - * - * @dsd_conf: pointer to dsd config - * @interp_num: Interpolator number (HPHL/R, LO1/2) - * @sw_value: Mixer switch value - * - * Returns 0 on success or -EINVAL on failure - */ -int tavil_dsd_set_mixer_value(struct tavil_dsd_config *dsd_conf, - int interp_num, int sw_value) -{ - if (!dsd_conf) - return -EINVAL; - - if (!is_valid_dsd_interpolator(interp_num)) - return -EINVAL; - - dsd_conf->dsd_interp_mixer[interp_num] = !!sw_value; - - return 0; -} -EXPORT_SYMBOL(tavil_dsd_set_mixer_value); - -/** - * tavil_dsd_get_current_mixer_value - Get DSD HPH/LO mixer value - * - * @dsd_conf: pointer to dsd config - * @interp_num: Interpolator number (HPHL/R, LO1/2) - * - * Returns current mixer val for success or -EINVAL for failure - */ -int tavil_dsd_get_current_mixer_value(struct tavil_dsd_config *dsd_conf, - int interp_num) -{ - if (!dsd_conf) - return -EINVAL; - - if (!is_valid_dsd_interpolator(interp_num)) - return -EINVAL; - - return dsd_conf->dsd_interp_mixer[interp_num]; -} -EXPORT_SYMBOL(tavil_dsd_get_current_mixer_value); - -/** - * tavil_dsd_set_out_select - DSD0/1 out select to HPH or LO - * - * @dsd_conf: pointer to dsd config - * @interp_num: Interpolator number (HPHL/R, LO1/2) - * - * Returns 0 for success or -EINVAL for failure - */ -int tavil_dsd_set_out_select(struct tavil_dsd_config *dsd_conf, - int interp_num) -{ - unsigned int reg, val; - struct snd_soc_codec *codec; - - if (!dsd_conf || !dsd_conf->codec) - return -EINVAL; - - codec = dsd_conf->codec; - - if (!is_valid_dsd_interpolator(interp_num)) { - dev_err(codec->dev, "%s: Invalid Interpolator: %d for DSD\n", - __func__, interp_num); - return -EINVAL; - } - - switch (interp_num) { - case INTERP_HPHL: - reg = WCD934X_CDC_DSD0_CFG0; - val = 0x00; - break; - case INTERP_HPHR: - reg = WCD934X_CDC_DSD1_CFG0; - val = 0x00; - break; - case INTERP_LO1: - reg = WCD934X_CDC_DSD0_CFG0; - val = 0x02; - break; - case INTERP_LO2: - reg = WCD934X_CDC_DSD1_CFG0; - val = 0x02; - break; - default: - return -EINVAL; - } - - snd_soc_update_bits(codec, reg, 0x02, val); - - return 0; -} -EXPORT_SYMBOL(tavil_dsd_set_out_select); - -/** - * tavil_dsd_reset - Reset DSD block - * - * @dsd_conf: pointer to dsd config - * - */ -void tavil_dsd_reset(struct tavil_dsd_config *dsd_conf) -{ - if (!dsd_conf || !dsd_conf->codec) - return; - - snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_DSD0_PATH_CTL, - 0x02, 0x02); - snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_DSD0_PATH_CTL, - 0x01, 0x00); - snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_DSD1_PATH_CTL, - 0x02, 0x02); - snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_DSD1_PATH_CTL, - 0x01, 0x00); -} -EXPORT_SYMBOL(tavil_dsd_reset); - -/** - * tavil_dsd_set_interp_rate - Set interpolator rate for DSD - * - * @dsd_conf: pointer to dsd config - * @rx_port: RX port number - * @sample_rate: Sample rate of the RX interpolator - * @sample_rate_val: Interpolator rate value - */ -void tavil_dsd_set_interp_rate(struct tavil_dsd_config *dsd_conf, u16 rx_port, - u32 sample_rate, u8 sample_rate_val) -{ - u8 dsd_inp_sel; - u8 dsd0_inp, dsd1_inp; - u8 val0, val1; - u8 dsd0_out_sel, dsd1_out_sel; - u16 int_fs_reg, interp_num = 0; - struct snd_soc_codec *codec; - - if (!dsd_conf || !dsd_conf->codec) - return; - - codec = dsd_conf->codec; - - dsd_inp_sel = DSD_INP_SEL_RX0 + rx_port - WCD934X_RX_PORT_START_NUMBER; - - val0 = snd_soc_read(codec, WCD934X_CDC_DSD0_CFG0); - val1 = snd_soc_read(codec, WCD934X_CDC_DSD1_CFG0); - dsd0_inp = (val0 & 0x3C) >> 2; - dsd1_inp = (val1 & 0x3C) >> 2; - dsd0_out_sel = (val0 & 0x02) >> 1; - dsd1_out_sel = (val1 & 0x02) >> 1; - - /* Set HPHL or LO1 interp rate based on out select */ - if (dsd_inp_sel == dsd0_inp) { - interp_num = dsd0_out_sel ? INTERP_LO1 : INTERP_HPHL; - dsd_conf->base_sample_rate[DSD0] = sample_rate; - } - - /* Set HPHR or LO2 interp rate based on out select */ - if (dsd_inp_sel == dsd1_inp) { - interp_num = dsd1_out_sel ? INTERP_LO2 : INTERP_HPHR; - dsd_conf->base_sample_rate[DSD1] = sample_rate; - } - - if (interp_num) { - int_fs_reg = WCD934X_CDC_RX0_RX_PATH_CTL + 20 * interp_num; - if ((snd_soc_read(codec, int_fs_reg) & 0x0f) < 0x09) { - dev_dbg(codec->dev, "%s: Set Interp %d to sample_rate val 0x%x\n", - __func__, interp_num, sample_rate_val); - snd_soc_update_bits(codec, int_fs_reg, 0x0F, - sample_rate_val); - } - } -} -EXPORT_SYMBOL(tavil_dsd_set_interp_rate); - -static int tavil_set_dsd_mode(struct snd_soc_codec *codec, int dsd_num, - u8 *pcm_rate_val) -{ - unsigned int dsd_out_sel_reg; - u8 dsd_mode; - u32 sample_rate; - struct tavil_dsd_config *dsd_conf = tavil_get_dsd_config(codec); - - if (!dsd_conf) - return -EINVAL; - - if ((dsd_num < 0) || (dsd_num > 1)) - return -EINVAL; - - sample_rate = dsd_conf->base_sample_rate[dsd_num]; - dsd_out_sel_reg = WCD934X_CDC_DSD0_CFG0 + dsd_num * 16; - - switch (sample_rate) { - case 176400: - dsd_mode = 0; /* DSD_64 */ - *pcm_rate_val = 0xb; - break; - case 352800: - dsd_mode = 1; /* DSD_128 */ - *pcm_rate_val = 0xc; - break; - default: - dev_err(codec->dev, "%s: Invalid DSD rate: %d\n", - __func__, sample_rate); - return -EINVAL; - } - - snd_soc_update_bits(codec, dsd_out_sel_reg, 0x01, dsd_mode); - - return 0; -} - -static void tavil_dsd_data_pull(struct snd_soc_codec *codec, int dsd_num, - u8 pcm_rate_val, bool enable) -{ - u8 clk_en, mute_en; - u8 dsd_inp_sel; - - if (enable) { - clk_en = 0x20; - mute_en = 0x10; - } else { - clk_en = 0x00; - mute_en = 0x00; - } - - if (dsd_num & 0x01) { - snd_soc_update_bits(codec, WCD934X_CDC_RX7_RX_PATH_MIX_CTL, - 0x20, clk_en); - dsd_inp_sel = (snd_soc_read(codec, WCD934X_CDC_DSD0_CFG0) & - 0x3C) >> 2; - dsd_inp_sel = (enable) ? dsd_inp_sel : 0; - if (dsd_inp_sel < 9) { - snd_soc_update_bits(codec, - WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1, - 0x0F, dsd_inp_sel); - snd_soc_update_bits(codec, - WCD934X_CDC_RX7_RX_PATH_MIX_CTL, - 0x0F, pcm_rate_val); - snd_soc_update_bits(codec, - WCD934X_CDC_RX7_RX_PATH_MIX_CTL, - 0x10, mute_en); - } - } - if (dsd_num & 0x02) { - snd_soc_update_bits(codec, WCD934X_CDC_RX8_RX_PATH_MIX_CTL, - 0x20, clk_en); - dsd_inp_sel = (snd_soc_read(codec, WCD934X_CDC_DSD1_CFG0) & - 0x3C) >> 2; - dsd_inp_sel = (enable) ? dsd_inp_sel : 0; - if (dsd_inp_sel < 9) { - snd_soc_update_bits(codec, - WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1, - 0x0F, dsd_inp_sel); - snd_soc_update_bits(codec, - WCD934X_CDC_RX8_RX_PATH_MIX_CTL, - 0x0F, pcm_rate_val); - snd_soc_update_bits(codec, - WCD934X_CDC_RX8_RX_PATH_MIX_CTL, - 0x10, mute_en); - } - } -} - -static void tavil_dsd_update_volume(struct tavil_dsd_config *dsd_conf) -{ - snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_TOP_TOP_CFG0, - 0x01, 0x01); - snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_TOP_TOP_CFG0, - 0x01, 0x00); -} - -static int tavil_enable_dsd(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_dsd_config *dsd_conf = tavil_get_dsd_config(codec); - int rc, clk_users; - int interp_idx; - u8 pcm_rate_val; - - if (!dsd_conf) { - dev_err(codec->dev, "%s: null dsd_config pointer\n", __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: DSD%d, event: %d\n", __func__, - w->shift, event); - - if (w->shift == DSD0) { - /* Read out select */ - if (snd_soc_read(codec, WCD934X_CDC_DSD0_CFG0) & 0x02) - interp_idx = INTERP_LO1; - else - interp_idx = INTERP_HPHL; - } else if (w->shift == DSD1) { - /* Read out select */ - if (snd_soc_read(codec, WCD934X_CDC_DSD1_CFG0) & 0x02) - interp_idx = INTERP_LO2; - else - interp_idx = INTERP_HPHR; - } else { - dev_err(codec->dev, "%s: Unsupported DSD:%d\n", - __func__, w->shift); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - clk_users = tavil_codec_enable_interp_clk(codec, event, - interp_idx); - - rc = tavil_set_dsd_mode(codec, w->shift, &pcm_rate_val); - if (rc) - return rc; - - tavil_dsd_data_pull(codec, (1 << w->shift), pcm_rate_val, - true); - - snd_soc_update_bits(codec, - WCD934X_CDC_CLK_RST_CTRL_DSD_CONTROL, 0x01, - 0x01); - if (w->shift == DSD0) { - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_PATH_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_PATH_CTL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_PATH_CTL, - 0x01, 0x01); - /* Apply Gain */ - snd_soc_write(codec, WCD934X_CDC_DSD0_CFG1, - dsd_conf->volume[DSD0]); - if (dsd_conf->version == TAVIL_VERSION_1_1) - tavil_dsd_update_volume(dsd_conf); - - } else if (w->shift == DSD1) { - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_PATH_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_PATH_CTL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_PATH_CTL, - 0x01, 0x01); - /* Apply Gain */ - snd_soc_write(codec, WCD934X_CDC_DSD1_CFG1, - dsd_conf->volume[DSD1]); - if (dsd_conf->version == TAVIL_VERSION_1_1) - tavil_dsd_update_volume(dsd_conf); - } - /* 10msec sleep required after DSD clock is set */ - usleep_range(10000, 10100); - - if (clk_users > 1) { - snd_soc_update_bits(codec, WCD934X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (w->shift == DSD0) - snd_soc_update_bits(codec, - WCD934X_CDC_DSD0_CFG2, - 0x04, 0x00); - if (w->shift == DSD1) - snd_soc_update_bits(codec, - WCD934X_CDC_DSD1_CFG2, - 0x04, 0x00); - - } - break; - case SND_SOC_DAPM_POST_PMD: - if (w->shift == DSD0) { - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_PATH_CTL, - 0x01, 0x00); - } else if (w->shift == DSD1) { - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_PATH_CTL, - 0x01, 0x00); - } - - tavil_codec_enable_interp_clk(codec, event, interp_idx); - - if (!(snd_soc_read(codec, WCD934X_CDC_DSD0_PATH_CTL) & 0x01) && - !(snd_soc_read(codec, WCD934X_CDC_DSD1_PATH_CTL) & 0x01)) { - snd_soc_update_bits(codec, - WCD934X_CDC_CLK_RST_CTRL_DSD_CONTROL, - 0x01, 0x00); - tavil_dsd_data_pull(codec, 0x03, 0x04, false); - tavil_dsd_reset(dsd_conf); - } - break; - } - - return 0; -} - -static int tavil_dsd_vol_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = DSD_VOLUME_MIN_M110dB; - uinfo->value.integer.max = DSD_VOLUME_MAX_0dB; - - return 0; -} - -static int tavil_dsd_vol_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_dsd_config *dsd_conf = tavil_get_dsd_config(codec); - int nv[DSD_MAX], cv[DSD_MAX]; - int step_size, nv1; - int i, dsd_idx; - - if (!dsd_conf) - return 0; - - mutex_lock(&dsd_conf->vol_mutex); - - for (dsd_idx = DSD0; dsd_idx < DSD_MAX; dsd_idx++) { - cv[dsd_idx] = dsd_conf->volume[dsd_idx]; - nv[dsd_idx] = ucontrol->value.integer.value[dsd_idx]; - } - - if ((!DSD_VOLUME_RANGE_CHECK(nv[DSD0])) || - (!DSD_VOLUME_RANGE_CHECK(nv[DSD1]))) - goto done; - - for (dsd_idx = DSD0; dsd_idx < DSD_MAX; dsd_idx++) { - if (cv[dsd_idx] == nv[dsd_idx]) - continue; - - dev_dbg(codec->dev, "%s: DSD%d cur.vol: %d, new vol: %d\n", - __func__, dsd_idx, cv[dsd_idx], nv[dsd_idx]); - - step_size = (nv[dsd_idx] - cv[dsd_idx]) / - DSD_VOLUME_STEPS; - - nv1 = cv[dsd_idx]; - - for (i = 0; i < DSD_VOLUME_STEPS; i++) { - nv1 += step_size; - snd_soc_write(codec, - WCD934X_CDC_DSD0_CFG1 + 16 * dsd_idx, - nv1); - if (dsd_conf->version == TAVIL_VERSION_1_1) - tavil_dsd_update_volume(dsd_conf); - - /* sleep required after each volume step */ - usleep_range(DSD_VOLUME_STEP_DELAY_US, - (DSD_VOLUME_STEP_DELAY_US + - DSD_VOLUME_USLEEP_MARGIN_US)); - } - if (nv1 != nv[dsd_idx]) { - snd_soc_write(codec, - WCD934X_CDC_DSD0_CFG1 + 16 * dsd_idx, - nv[dsd_idx]); - - if (dsd_conf->version == TAVIL_VERSION_1_1) - tavil_dsd_update_volume(dsd_conf); - } - - dsd_conf->volume[dsd_idx] = nv[dsd_idx]; - } - -done: - mutex_unlock(&dsd_conf->vol_mutex); - - return 0; -} - -static int tavil_dsd_vol_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_dsd_config *dsd_conf = tavil_get_dsd_config(codec); - - if (dsd_conf) { - ucontrol->value.integer.value[0] = dsd_conf->volume[DSD0]; - ucontrol->value.integer.value[1] = dsd_conf->volume[DSD1]; - } - - return 0; -} - -static const struct snd_kcontrol_new tavil_dsd_vol_controls[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_TLV_READ), - .name = "DSD Volume", - .info = tavil_dsd_vol_info, - .get = tavil_dsd_vol_get, - .put = tavil_dsd_vol_put, - .tlv = { .p = tavil_dsd_db_scale }, - }, -}; - -static const struct snd_soc_dapm_widget tavil_dsd_widgets[] = { - SND_SOC_DAPM_MUX("DSD_L IF MUX", SND_SOC_NOPM, 0, 0, &dsd_l_if_mux), - SND_SOC_DAPM_MUX_E("DSD_FILTER_0", SND_SOC_NOPM, 0, 0, &dsd_filt0_mux, - tavil_enable_dsd, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("DSD_R IF MUX", SND_SOC_NOPM, 0, 0, &dsd_r_if_mux), - SND_SOC_DAPM_MUX_E("DSD_FILTER_1", SND_SOC_NOPM, 1, 0, &dsd_filt1_mux, - tavil_enable_dsd, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), -}; - -/** - * tavil_dsd_post_ssr_init - DSD intialization after subsystem restart - * - * @codec: pointer to snd_soc_codec - * - * Returns 0 on success or error on failure - */ -int tavil_dsd_post_ssr_init(struct tavil_dsd_config *dsd_conf) -{ - struct snd_soc_codec *codec; - - if (!dsd_conf || !dsd_conf->codec) - return -EINVAL; - - codec = dsd_conf->codec; - /* Disable DSD Interrupts */ - snd_soc_update_bits(codec, WCD934X_INTR_CODEC_MISC_MASK, 0x08, 0x08); - - /* DSD registers init */ - if (dsd_conf->version == TAVIL_VERSION_1_0) { - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, 0x02, 0x00); - } - /* DSD0: Mute EN */ - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, 0x04, 0x04); - /* DSD1: Mute EN */ - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG3, 0x10, - 0x10); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG3, 0x10, - 0x10); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG0, 0x0E, - 0x0A); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG0, 0x0E, - 0x0A); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG1, 0x07, - 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG1, 0x07, - 0x04); - - /* Enable DSD Interrupts */ - snd_soc_update_bits(codec, WCD934X_INTR_CODEC_MISC_MASK, 0x08, 0x00); - - return 0; -} -EXPORT_SYMBOL(tavil_dsd_post_ssr_init); - -/** - * tavil_dsd_init - DSD intialization - * - * @codec: pointer to snd_soc_codec - * - * Returns pointer to tavil_dsd_config for success or NULL for failure - */ -struct tavil_dsd_config *tavil_dsd_init(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm; - struct tavil_dsd_config *dsd_conf; - u8 val; - - if (!codec) - return NULL; - - dapm = snd_soc_codec_get_dapm(codec); - - /* Read efuse register to check if DSD is supported */ - val = snd_soc_read(codec, WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14); - if (val & 0x80) { - dev_info(codec->dev, "%s: DSD unsupported for this codec version\n", - __func__); - return NULL; - } - - dsd_conf = devm_kzalloc(codec->dev, sizeof(struct tavil_dsd_config), - GFP_KERNEL); - if (!dsd_conf) - return NULL; - - dsd_conf->codec = codec; - - /* Read version */ - dsd_conf->version = snd_soc_read(codec, - WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0); - /* DSD registers init */ - if (dsd_conf->version == TAVIL_VERSION_1_0) { - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, 0x02, 0x00); - } - /* DSD0: Mute EN */ - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, 0x04, 0x04); - /* DSD1: Mute EN */ - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG3, 0x10, - 0x10); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG3, 0x10, - 0x10); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG0, 0x0E, - 0x0A); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG0, 0x0E, - 0x0A); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG1, 0x07, - 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG1, 0x07, - 0x04); - - snd_soc_dapm_new_controls(dapm, tavil_dsd_widgets, - ARRAY_SIZE(tavil_dsd_widgets)); - - snd_soc_dapm_add_routes(dapm, tavil_dsd_audio_map, - ARRAY_SIZE(tavil_dsd_audio_map)); - - mutex_init(&dsd_conf->vol_mutex); - dsd_conf->volume[DSD0] = DSD_VOLUME_MAX_0dB; - dsd_conf->volume[DSD1] = DSD_VOLUME_MAX_0dB; - - snd_soc_add_codec_controls(codec, tavil_dsd_vol_controls, - ARRAY_SIZE(tavil_dsd_vol_controls)); - - /* Enable DSD Interrupts */ - snd_soc_update_bits(codec, WCD934X_INTR_CODEC_MISC_MASK, 0x08, 0x00); - - return dsd_conf; -} -EXPORT_SYMBOL(tavil_dsd_init); - -/** - * tavil_dsd_deinit - DSD de-intialization - * - * @dsd_conf: pointer to tavil_dsd_config - */ -void tavil_dsd_deinit(struct tavil_dsd_config *dsd_conf) -{ - struct snd_soc_codec *codec; - - if (!dsd_conf) - return; - - codec = dsd_conf->codec; - - mutex_destroy(&dsd_conf->vol_mutex); - - /* Disable DSD Interrupts */ - snd_soc_update_bits(codec, WCD934X_INTR_CODEC_MISC_MASK, 0x08, 0x08); - - devm_kfree(codec->dev, dsd_conf); -} -EXPORT_SYMBOL(tavil_dsd_deinit); diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.h b/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.h deleted file mode 100644 index 834b96cd1805..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsd.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD934X_DSD_H__ -#define __WCD934X_DSD_H__ - -#include -#include "wcd934x.h" - -enum { - DSD0, - DSD1, - DSD_MAX, -}; - -enum { - DSD_INP_SEL_ZERO = 0, - DSD_INP_SEL_RX0, - DSD_INP_SEL_RX1, - DSD_INP_SEL_RX2, - DSD_INP_SEL_RX3, - DSD_INP_SEL_RX4, - DSD_INP_SEL_RX5, - DSD_INP_SEL_RX6, - DSD_INP_SEL_RX7, -}; - -struct tavil_dsd_config { - struct snd_soc_codec *codec; - unsigned int dsd_interp_mixer[INTERP_MAX]; - u32 base_sample_rate[DSD_MAX]; - int volume[DSD_MAX]; - struct mutex vol_mutex; - int version; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD934X_DSD) -int tavil_dsd_set_mixer_value(struct tavil_dsd_config *dsd_conf, - int interp_num, int sw_value); -int tavil_dsd_get_current_mixer_value(struct tavil_dsd_config *dsd_conf, - int interp_num); -int tavil_dsd_set_out_select(struct tavil_dsd_config *dsd_conf, - int interp_num); -void tavil_dsd_reset(struct tavil_dsd_config *dsd_conf); -void tavil_dsd_set_interp_rate(struct tavil_dsd_config *dsd_conf, u16 rx_port, - u32 sample_rate, u8 sample_rate_val); -struct tavil_dsd_config *tavil_dsd_init(struct snd_soc_codec *codec); -void tavil_dsd_deinit(struct tavil_dsd_config *dsd_config); -int tavil_dsd_post_ssr_init(struct tavil_dsd_config *dsd_config); -#else -int tavil_dsd_set_mixer_value(struct tavil_dsd_config *dsd_conf, - int interp_num, int sw_value) -{ - return 0; -} - -int tavil_dsd_get_current_mixer_value(struct tavil_dsd_config *dsd_conf, - int interp_num) -{ - return 0; -} - -int tavil_dsd_set_out_select(struct tavil_dsd_config *dsd_conf, - int interp_num) -{ - return 0; -} - -void tavil_dsd_reset(struct tavil_dsd_config *dsd_conf) -{ } - -void tavil_dsd_set_interp_rate(struct tavil_dsd_config *dsd_conf, u16 rx_port, - u32 sample_rate, u8 sample_rate_val) -{ } - -struct tavil_dsd_config *tavil_dsd_init(struct snd_soc_codec *codec) -{ - return NULL; -} - -void tavil_dsd_deinit(struct tavil_dsd_config *dsd_config) -{ } -int tavil_dsd_post_ssr_init(struct tavil_dsd_config *dsd_config) -{ - return 0; -} -#endif -#endif diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c b/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c deleted file mode 100644 index f18cc81a91f8..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c +++ /dev/null @@ -1,1490 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "wcd934x.h" -#include "wcd934x-dsp-cntl.h" -#include "../wcd9xxx-irq.h" -#include "../core.h" - -#define WCD_CNTL_DIR_NAME_LEN_MAX 32 -#define WCD_CPE_FLL_MAX_RETRIES 5 -#define WCD_MEM_ENABLE_MAX_RETRIES 20 -#define WCD_DSP_BOOT_TIMEOUT_MS 3000 -#define WCD_SYSFS_ENTRY_MAX_LEN 8 -#define WCD_PROCFS_ENTRY_MAX_LEN 16 -#define WCD_934X_RAMDUMP_START_ADDR 0x20100000 -#define WCD_934X_RAMDUMP_SIZE ((1024 * 1024) - 128) -#define WCD_MISCDEV_CMD_MAX_LEN 11 - -#define WCD_CNTL_MUTEX_LOCK(codec, lock) \ -{ \ - dev_dbg(codec->dev, "%s: mutex_lock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_lock(&lock); \ -} - -#define WCD_CNTL_MUTEX_UNLOCK(codec, lock) \ -{ \ - dev_dbg(codec->dev, "%s: mutex_unlock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_unlock(&lock); \ -} - -enum wcd_mem_type { - WCD_MEM_TYPE_ALWAYS_ON, - WCD_MEM_TYPE_SWITCHABLE, -}; - -struct wcd_cntl_attribute { - struct attribute attr; - ssize_t (*show)(struct wcd_dsp_cntl *cntl, char *buf); - ssize_t (*store)(struct wcd_dsp_cntl *cntl, const char *buf, - ssize_t count); -}; - -#define WCD_CNTL_ATTR(_name, _mode, _show, _store) \ -static struct wcd_cntl_attribute cntl_attr_##_name = { \ - .attr = {.name = __stringify(_name), .mode = _mode}, \ - .show = _show, \ - .store = _store, \ -} - -#define to_wcd_cntl_attr(a) \ - container_of((a), struct wcd_cntl_attribute, attr) - -#define to_wcd_cntl(kobj) \ - container_of((kobj), struct wcd_dsp_cntl, wcd_kobj) - -static u8 mem_enable_values[] = { - 0xFE, 0xFC, 0xF8, 0xF0, - 0xE0, 0xC0, 0x80, 0x00, -}; - -#ifdef CONFIG_DEBUG_FS -#define WCD_CNTL_SET_ERR_IRQ_FLAG(cntl)\ - atomic_cmpxchg(&cntl->err_irq_flag, 0, 1) -#define WCD_CNTL_CLR_ERR_IRQ_FLAG(cntl)\ - atomic_set(&cntl->err_irq_flag, 0) - -static u16 wdsp_reg_for_debug_dump[] = { - WCD934X_CPE_SS_CPE_CTL, - WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0, - WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_1, - WCD934X_CPE_SS_PWR_CPEFLL_CTL, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_OVERRIDE, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_5, - WCD934X_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN, - WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL, - WCD934X_CPE_SS_MAD_CTL, - WCD934X_CPE_SS_CPAR_CTL, - WCD934X_CPE_SS_CPAR_CFG, - WCD934X_CPE_SS_WDOG_CFG, - WCD934X_CPE_SS_STATUS, - WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A, - WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B, - WCD934X_CPE_SS_SS_ERROR_INT_MASK_1A, - WCD934X_CPE_SS_SS_ERROR_INT_MASK_1B, - WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0A, - WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0B, - WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1A, - WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B, -}; - -static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl, - bool internal) -{ - struct snd_soc_codec *codec = cntl->codec; - struct wdsp_err_signal_arg arg; - enum wdsp_signal signal; - int i; - u8 val; - - /* If WDSP SSR happens, skip collecting debug dumps */ - if (WCD_CNTL_SET_ERR_IRQ_FLAG(cntl) != 0) - return; - - /* Mask all error interrupts */ - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A, - 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B, - 0xFF); - - /* Collect important WDSP registers dump for debug use */ - pr_err("%s: Dump the WDSP registers for debug use\n", __func__); - for (i = 0; i < sizeof(wdsp_reg_for_debug_dump)/sizeof(u16); i++) { - val = snd_soc_read(codec, wdsp_reg_for_debug_dump[i]); - pr_err("%s: reg = 0x%x, val = 0x%x\n", __func__, - wdsp_reg_for_debug_dump[i], val); - } - - /* Trigger NMI in WDSP to sync and update the memory */ - snd_soc_write(codec, WCD934X_CPE_SS_BACKUP_INT, 0x02); - - /* Collect WDSP ramdump for debug use */ - if (cntl->m_dev && cntl->m_ops && cntl->m_ops->signal_handler) { - arg.mem_dumps_enabled = cntl->ramdump_enable; - arg.remote_start_addr = WCD_934X_RAMDUMP_START_ADDR; - arg.dump_size = WCD_934X_RAMDUMP_SIZE; - signal = internal ? WDSP_DEBUG_DUMP_INTERNAL : WDSP_DEBUG_DUMP; - cntl->m_ops->signal_handler(cntl->m_dev, signal, &arg); - } - - /* Unmask the fatal irqs */ - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A, - ~(cntl->irqs.fatal_irqs & 0xFF)); - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B, - ~((cntl->irqs.fatal_irqs >> 8) & 0xFF)); - - WCD_CNTL_CLR_ERR_IRQ_FLAG(cntl); -} -#else -#define WCD_CNTL_SET_ERR_IRQ_FLAG(cntl) 0 -#define WCD_CNTL_CLR_ERR_IRQ_FLAG(cntl) do {} while (0) -static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl, - bool internal) -{ -} -#endif - -static ssize_t wdsp_boot_show(struct wcd_dsp_cntl *cntl, char *buf) -{ - return snprintf(buf, WCD_SYSFS_ENTRY_MAX_LEN, - "%u", cntl->boot_reqs); -} - -static ssize_t wdsp_boot_store(struct wcd_dsp_cntl *cntl, - const char *buf, ssize_t count) -{ - u32 val; - bool vote; - int ret; - - ret = kstrtou32(buf, 10, &val); - if (ret) { - dev_err(cntl->codec->dev, - "%s: Invalid entry, ret = %d\n", __func__, ret); - return -EINVAL; - } - - if (val > 0) { - cntl->boot_reqs++; - vote = true; - } else { - cntl->boot_reqs--; - vote = false; - } - - if (cntl->m_dev && cntl->m_ops && - cntl->m_ops->vote_for_dsp) - ret = cntl->m_ops->vote_for_dsp(cntl->m_dev, vote); - else - ret = -EINVAL; - - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: failed to %s dsp\n", __func__, - vote ? "enable" : "disable"); - return count; -} - -WCD_CNTL_ATTR(boot, 0660, wdsp_boot_show, wdsp_boot_store); - -static ssize_t wcd_cntl_sysfs_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct wcd_cntl_attribute *wcd_attr = to_wcd_cntl_attr(attr); - struct wcd_dsp_cntl *cntl = to_wcd_cntl(kobj); - ssize_t ret = -EINVAL; - - if (cntl && wcd_attr->show) - ret = wcd_attr->show(cntl, buf); - - return ret; -} - -static ssize_t wcd_cntl_sysfs_store(struct kobject *kobj, - struct attribute *attr, const char *buf, - size_t count) -{ - struct wcd_cntl_attribute *wcd_attr = to_wcd_cntl_attr(attr); - struct wcd_dsp_cntl *cntl = to_wcd_cntl(kobj); - ssize_t ret = -EINVAL; - - if (cntl && wcd_attr->store) - ret = wcd_attr->store(cntl, buf, count); - - return ret; -} - -static const struct sysfs_ops wcd_cntl_sysfs_ops = { - .show = wcd_cntl_sysfs_show, - .store = wcd_cntl_sysfs_store, -}; - -static struct kobj_type wcd_cntl_ktype = { - .sysfs_ops = &wcd_cntl_sysfs_ops, -}; - -static void wcd_cntl_change_online_state(struct wcd_dsp_cntl *cntl, - u8 online) -{ - struct wdsp_ssr_entry *ssr_entry = &cntl->ssr_entry; - unsigned long ret; - - WCD_CNTL_MUTEX_LOCK(cntl->codec, cntl->ssr_mutex); - ssr_entry->offline = !online; - /* Make sure the write is complete */ - wmb(); - ret = xchg(&ssr_entry->offline_change, 1); - wake_up_interruptible(&ssr_entry->offline_poll_wait); - dev_dbg(cntl->codec->dev, - "%s: requested %u, offline %u offline_change %u, ret = %ldn", - __func__, online, ssr_entry->offline, - ssr_entry->offline_change, ret); - WCD_CNTL_MUTEX_UNLOCK(cntl->codec, cntl->ssr_mutex); -} - -static ssize_t wdsp_ssr_entry_read(struct snd_info_entry *entry, - void *file_priv_data, struct file *file, - char __user *buf, size_t count, loff_t pos) -{ - int len = 0; - char buffer[WCD_PROCFS_ENTRY_MAX_LEN]; - struct wcd_dsp_cntl *cntl; - struct wdsp_ssr_entry *ssr_entry; - ssize_t ret; - u8 offline; - - cntl = (struct wcd_dsp_cntl *) entry->private_data; - if (!cntl) { - pr_err("%s: Invalid private data for SSR procfs entry\n", - __func__); - return -EINVAL; - } - - ssr_entry = &cntl->ssr_entry; - - WCD_CNTL_MUTEX_LOCK(cntl->codec, cntl->ssr_mutex); - offline = ssr_entry->offline; - /* Make sure the read is complete */ - rmb(); - dev_dbg(cntl->codec->dev, "%s: offline = %s\n", __func__, - offline ? "true" : "false"); - len = snprintf(buffer, sizeof(buffer), "%s\n", - offline ? "OFFLINE" : "ONLINE"); - ret = simple_read_from_buffer(buf, count, &pos, buffer, len); - WCD_CNTL_MUTEX_UNLOCK(cntl->codec, cntl->ssr_mutex); - - return ret; -} - -static unsigned int wdsp_ssr_entry_poll(struct snd_info_entry *entry, - void *private_data, struct file *file, - poll_table *wait) -{ - struct wcd_dsp_cntl *cntl; - struct wdsp_ssr_entry *ssr_entry; - unsigned int ret = 0; - - if (!entry || !entry->private_data) { - pr_err("%s: %s is NULL\n", __func__, - (!entry) ? "entry" : "private_data"); - return -EINVAL; - } - - cntl = (struct wcd_dsp_cntl *) entry->private_data; - ssr_entry = &cntl->ssr_entry; - - dev_dbg(cntl->codec->dev, "%s: Poll wait, offline = %u\n", - __func__, ssr_entry->offline); - poll_wait(file, &ssr_entry->offline_poll_wait, wait); - dev_dbg(cntl->codec->dev, "%s: Woken up Poll wait, offline = %u\n", - __func__, ssr_entry->offline); - - WCD_CNTL_MUTEX_LOCK(cntl->codec, cntl->ssr_mutex); - if (xchg(&ssr_entry->offline_change, 0)) - ret = POLLIN | POLLPRI | POLLRDNORM; - dev_dbg(cntl->codec->dev, "%s: ret (%d) from poll_wait\n", - __func__, ret); - WCD_CNTL_MUTEX_UNLOCK(cntl->codec, cntl->ssr_mutex); - - return ret; -} - -static struct snd_info_entry_ops wdsp_ssr_entry_ops = { - .read = wdsp_ssr_entry_read, - .poll = wdsp_ssr_entry_poll, -}; - -static int wcd_cntl_cpe_fll_calibrate(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0, retry = 0; - u8 cal_lsb, cal_msb; - u8 lock_det; - - /* Make sure clocks are gated */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPE_CTL, - 0x05, 0x00); - - /* Enable CPE FLL reference clock */ - snd_soc_update_bits(codec, WCD934X_CLK_SYS_MCLK2_PRG1, - 0x80, 0x80); - - snd_soc_update_bits(codec, WCD934X_CPE_FLL_USER_CTL_5, - 0xF3, 0x13); - snd_soc_write(codec, WCD934X_CPE_FLL_L_VAL_CTL_0, 0x50); - - /* Disable CPAR reset and Enable CPAR clk */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, - 0x02, 0x02); - - /* Write calibration l-value based on cdc clk rate */ - if (cntl->clk_rate == 9600000) { - cal_lsb = 0x6d; - cal_msb = 0x00; - } else { - cal_lsb = 0x56; - cal_msb = 0x00; - } - snd_soc_write(codec, WCD934X_CPE_FLL_USER_CTL_6, cal_lsb); - snd_soc_write(codec, WCD934X_CPE_FLL_USER_CTL_7, cal_msb); - - /* FLL mode to follow power up sequence */ - snd_soc_update_bits(codec, WCD934X_CPE_FLL_FLL_MODE, - 0x60, 0x00); - - /* HW controlled CPE FLL */ - snd_soc_update_bits(codec, WCD934X_CPE_FLL_FLL_MODE, - 0x80, 0x80); - - /* Force on CPE FLL */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CFG, - 0x04, 0x04); - - do { - /* Time for FLL calibration to complete */ - usleep_range(1000, 1100); - lock_det = snd_soc_read(codec, WCD934X_CPE_FLL_STATUS_3); - retry++; - } while (!(lock_det & 0x01) && - retry <= WCD_CPE_FLL_MAX_RETRIES); - - if (!(lock_det & 0x01)) { - dev_err(codec->dev, "%s: lock detect not set, 0x%02x\n", - __func__, lock_det); - ret = -EIO; - goto err_lock_det; - } - - snd_soc_update_bits(codec, WCD934X_CPE_FLL_FLL_MODE, - 0x60, 0x20); - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CFG, - 0x04, 0x00); - return ret; - -err_lock_det: - /* Undo the register settings */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CFG, - 0x04, 0x00); - snd_soc_update_bits(codec, WCD934X_CPE_FLL_FLL_MODE, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, - 0x02, 0x00); - return ret; -} - -static void wcd_cntl_config_cpar(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - u8 nom_lo, nom_hi, svs2_lo, svs2_hi; - - /* Configure CPAR */ - nom_hi = svs2_hi = 0; - if (cntl->clk_rate == 9600000) { - nom_lo = 0x90; - svs2_lo = 0x50; - } else { - nom_lo = 0x70; - svs2_lo = 0x3e; - } - - snd_soc_write(codec, WCD934X_TEST_DEBUG_LVAL_NOM_LOW, nom_lo); - snd_soc_write(codec, WCD934X_TEST_DEBUG_LVAL_NOM_HIGH, nom_hi); - snd_soc_write(codec, WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_LOW, svs2_lo); - snd_soc_write(codec, WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_HIGH, svs2_hi); - - snd_soc_update_bits(codec, WCD934X_CPE_SS_PWR_CPEFLL_CTL, - 0x03, 0x03); -} - -static int wcd_cntl_cpe_fll_ctrl(struct wcd_dsp_cntl *cntl, - bool enable) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - if (enable) { - ret = wcd_cntl_cpe_fll_calibrate(cntl); - if (ret < 0) { - dev_err(codec->dev, - "%s: cpe_fll_cal failed, err = %d\n", - __func__, ret); - goto done; - } - - wcd_cntl_config_cpar(cntl); - - /* Enable AHB CLK and CPE CLK*/ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPE_CTL, - 0x05, 0x05); - } else { - /* Disable AHB CLK and CPE CLK */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPE_CTL, - 0x05, 0x00); - /* Reset the CPAR mode for CPE FLL */ - snd_soc_write(codec, WCD934X_CPE_FLL_FLL_MODE, 0x20); - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CFG, - 0x04, 0x00); - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, - 0x02, 0x00); - } -done: - return ret; -} - -static int wcd_cntl_clocks_enable(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret; - - WCD_CNTL_MUTEX_LOCK(codec, cntl->clk_mutex); - /* Enable codec clock */ - if (cntl->cdc_cb && cntl->cdc_cb->cdc_clk_en) - ret = cntl->cdc_cb->cdc_clk_en(codec, true); - else - ret = -EINVAL; - - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to enable cdc clk, err = %d\n", - __func__, ret); - goto done; - } - /* Pull CPAR out of reset */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, 0x04, 0x00); - - /* Configure and Enable CPE FLL clock */ - ret = wcd_cntl_cpe_fll_ctrl(cntl, true); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to enable cpe clk, err = %d\n", - __func__, ret); - goto err_cpe_clk; - } - cntl->is_clk_enabled = true; - - /* Ungate the CPR clock */ - snd_soc_update_bits(codec, WCD934X_CODEC_RPM_CLK_GATE, 0x10, 0x00); -done: - WCD_CNTL_MUTEX_UNLOCK(codec, cntl->clk_mutex); - return ret; - -err_cpe_clk: - if (cntl->cdc_cb && cntl->cdc_cb->cdc_clk_en) - cntl->cdc_cb->cdc_clk_en(codec, false); - - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, 0x04, 0x04); - WCD_CNTL_MUTEX_UNLOCK(codec, cntl->clk_mutex); - return ret; -} - -static int wcd_cntl_clocks_disable(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - WCD_CNTL_MUTEX_LOCK(codec, cntl->clk_mutex); - if (!cntl->is_clk_enabled) { - dev_info(codec->dev, "%s: clocks already disabled\n", - __func__); - goto done; - } - - /* Gate the CPR clock */ - snd_soc_update_bits(codec, WCD934X_CODEC_RPM_CLK_GATE, 0x10, 0x10); - - /* Disable CPE FLL clock */ - ret = wcd_cntl_cpe_fll_ctrl(cntl, false); - if (ret < 0) - dev_err(codec->dev, - "%s: Failed to disable cpe clk, err = %d\n", - __func__, ret); - - /* - * Even if CPE FLL disable failed, go ahead and disable - * the codec clock - */ - if (cntl->cdc_cb && cntl->cdc_cb->cdc_clk_en) - ret = cntl->cdc_cb->cdc_clk_en(codec, false); - else - ret = -EINVAL; - - cntl->is_clk_enabled = false; - - /* Put CPAR in reset */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, 0x04, 0x04); -done: - WCD_CNTL_MUTEX_UNLOCK(codec, cntl->clk_mutex); - return ret; -} - -static void wcd_cntl_cpar_ctrl(struct wcd_dsp_cntl *cntl, - bool enable) -{ - struct snd_soc_codec *codec = cntl->codec; - - if (enable) - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, 0x03, 0x03); - else - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPAR_CTL, 0x03, 0x00); -} - -static int wcd_cntl_enable_memory(struct wcd_dsp_cntl *cntl, - enum wcd_mem_type mem_type) -{ - struct snd_soc_codec *codec = cntl->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int loop_cnt = 0; - u8 status; - int ret = 0; - - - switch (mem_type) { - - case WCD_MEM_TYPE_ALWAYS_ON: - - /* 512KB of always on region */ - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - break; - - case WCD_MEM_TYPE_SWITCHABLE: - - snd_soc_update_bits(codec, WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL, - 0x04, 0x00); - snd_soc_update_bits(codec, WCD934X_TEST_DEBUG_MEM_CTRL, - 0x80, 0x80); - snd_soc_update_bits(codec, WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL, - 0x01, 0x01); - do { - loop_cnt++; - /* Time to enable the power domain for memory */ - usleep_range(100, 150); - status = snd_soc_read(codec, - WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL); - } while ((status & 0x02) != 0x02 && - loop_cnt != WCD_MEM_ENABLE_MAX_RETRIES); - - if ((status & 0x02) != 0x02) { - dev_err(cntl->codec->dev, - "%s: power domain not enabled, status = 0x%02x\n", - __func__, status); - ret = -EIO; - goto done; - } - - /* Rest of the memory */ - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN, - 0x05); - break; - - default: - dev_err(cntl->codec->dev, "%s: Invalid mem_type %d\n", - __func__, mem_type); - ret = -EINVAL; - break; - } -done: - /* Make sure Deep sleep of memories is enabled for all banks */ - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0, 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1, 0x0F); - - return ret; -} - -static void wcd_cntl_disable_memory(struct wcd_dsp_cntl *cntl, - enum wcd_mem_type mem_type) -{ - struct snd_soc_codec *codec = cntl->codec; - u8 val; - - switch (mem_type) { - case WCD_MEM_TYPE_ALWAYS_ON: - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1, - 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0, - 0xFF); - break; - case WCD_MEM_TYPE_SWITCHABLE: - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3, - 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2, - 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN, - 0x07); - - snd_soc_update_bits(codec, WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL, - 0x01, 0x00); - val = snd_soc_read(codec, WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL); - if (val & 0x02) - dev_err(codec->dev, - "%s: Disable switchable failed, val = 0x%02x", - __func__, val); - - snd_soc_update_bits(codec, WCD934X_TEST_DEBUG_MEM_CTRL, - 0x80, 0x00); - break; - default: - dev_err(cntl->codec->dev, "%s: Invalid mem_type %d\n", - __func__, mem_type); - break; - } - - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0, 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1, 0x0F); -} - -static void wcd_cntl_do_shutdown(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - - /* Disable WDOG */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_WDOG_CFG, - 0x3F, 0x01); - - /* Put WDSP in reset state */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPE_CTL, - 0x02, 0x00); - - /* If DSP transitions from boot to shutdown, then vote for SVS */ - if (cntl->is_wdsp_booted) - cntl->cdc_cb->cdc_vote_svs(codec, true); - cntl->is_wdsp_booted = false; -} - -static int wcd_cntl_do_boot(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - /* - * Debug mode is set from debugfs file node. If debug_mode - * is set, then do not configure the watchdog timer. This - * will be required for debugging the DSP firmware. - */ - if (cntl->debug_mode) { - snd_soc_update_bits(codec, WCD934X_CPE_SS_WDOG_CFG, - 0x3F, 0x01); - } else { - snd_soc_update_bits(codec, WCD934X_CPE_SS_WDOG_CFG, - 0x3F, 0x21); - } - - /* Make sure all the error interrupts are cleared */ - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0A, 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0B, 0xFF); - - reinit_completion(&cntl->boot_complete); - - /* Remove WDSP out of reset */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_CPE_CTL, - 0x02, 0x02); - - /* - * In debug mode, DSP may not boot up normally, - * wait indefinitely for DSP to boot. - */ - if (cntl->debug_mode) { - wait_for_completion(&cntl->boot_complete); - dev_dbg(codec->dev, "%s: WDSP booted in dbg mode\n", __func__); - cntl->is_wdsp_booted = true; - goto done; - } - - /* Boot in normal mode */ - ret = wait_for_completion_timeout(&cntl->boot_complete, - msecs_to_jiffies(WCD_DSP_BOOT_TIMEOUT_MS)); - if (!ret) { - dev_err(codec->dev, "%s: WDSP boot timed out\n", - __func__); - if (cntl->dbg_dmp_enable) - wcd_cntl_collect_debug_dumps(cntl, true); - ret = -ETIMEDOUT; - goto err_boot; - } else { - /* - * Re-initialize the return code to 0, as in success case, - * it will hold the remaining time for completion timeout - */ - ret = 0; - } - - dev_dbg(codec->dev, "%s: WDSP booted in normal mode\n", __func__); - cntl->is_wdsp_booted = true; - - /* Enable WDOG */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_WDOG_CFG, - 0x10, 0x10); -done: - /* If dsp booted up, then remove vote on SVS */ - if (cntl->is_wdsp_booted) - cntl->cdc_cb->cdc_vote_svs(codec, false); - - return ret; -err_boot: - /* call shutdown to perform cleanup */ - wcd_cntl_do_shutdown(cntl); - return ret; -} - -static irqreturn_t wcd_cntl_ipc_irq(int irq, void *data) -{ - struct wcd_dsp_cntl *cntl = data; - int ret; - - complete(&cntl->boot_complete); - - if (cntl->m_dev && cntl->m_ops && - cntl->m_ops->signal_handler) - ret = cntl->m_ops->signal_handler(cntl->m_dev, WDSP_IPC1_INTR, - NULL); - else - ret = -EINVAL; - - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: Failed to handle irq %d\n", __func__, irq); - - return IRQ_HANDLED; -} - -static irqreturn_t wcd_cntl_err_irq(int irq, void *data) -{ - struct wcd_dsp_cntl *cntl = data; - struct snd_soc_codec *codec = cntl->codec; - struct wdsp_err_signal_arg arg; - u16 status = 0; - u8 reg_val; - int rc, ret = 0; - - reg_val = snd_soc_read(codec, WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0A); - status = status | reg_val; - - reg_val = snd_soc_read(codec, WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0B); - status = status | (reg_val << 8); - - dev_info(codec->dev, "%s: error interrupt status = 0x%x\n", - __func__, status); - - if ((status & cntl->irqs.fatal_irqs) && - (cntl->m_dev && cntl->m_ops && cntl->m_ops->signal_handler)) { - /* - * If WDSP SSR happens, skip collecting debug dumps. - * If debug dumps collecting happens first, WDSP_ERR_INTR - * will be blocked in signal_handler and get processed later. - */ - rc = WCD_CNTL_SET_ERR_IRQ_FLAG(cntl); - arg.mem_dumps_enabled = cntl->ramdump_enable; - arg.remote_start_addr = WCD_934X_RAMDUMP_START_ADDR; - arg.dump_size = WCD_934X_RAMDUMP_SIZE; - ret = cntl->m_ops->signal_handler(cntl->m_dev, WDSP_ERR_INTR, - &arg); - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: Failed to handle fatal irq 0x%x\n", - __func__, status & cntl->irqs.fatal_irqs); - wcd_cntl_change_online_state(cntl, 0); - if (rc == 0) - WCD_CNTL_CLR_ERR_IRQ_FLAG(cntl); - } else { - dev_err(cntl->codec->dev, "%s: Invalid signal_handler\n", - __func__); - } - - return IRQ_HANDLED; -} - -static int wcd_control_handler(struct device *dev, void *priv_data, - enum wdsp_event_type event, void *data) -{ - struct wcd_dsp_cntl *cntl = priv_data; - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - switch (event) { - case WDSP_EVENT_POST_INIT: - case WDSP_EVENT_POST_DLOAD_CODE: - case WDSP_EVENT_DLOAD_FAILED: - case WDSP_EVENT_POST_SHUTDOWN: - - /* Disable CPAR */ - wcd_cntl_cpar_ctrl(cntl, false); - /* Disable all the clocks */ - ret = wcd_cntl_clocks_disable(cntl); - if (ret < 0) - dev_err(codec->dev, - "%s: Failed to disable clocks, err = %d\n", - __func__, ret); - - if (event == WDSP_EVENT_POST_DLOAD_CODE) - /* Mark DSP online since code download is complete */ - wcd_cntl_change_online_state(cntl, 1); - break; - - case WDSP_EVENT_PRE_DLOAD_DATA: - case WDSP_EVENT_PRE_DLOAD_CODE: - - /* Enable all the clocks */ - ret = wcd_cntl_clocks_enable(cntl); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to enable clocks, err = %d\n", - __func__, ret); - goto done; - } - - /* Enable CPAR */ - wcd_cntl_cpar_ctrl(cntl, true); - - if (event == WDSP_EVENT_PRE_DLOAD_CODE) - wcd_cntl_enable_memory(cntl, WCD_MEM_TYPE_ALWAYS_ON); - else if (event == WDSP_EVENT_PRE_DLOAD_DATA) - wcd_cntl_enable_memory(cntl, WCD_MEM_TYPE_SWITCHABLE); - break; - - case WDSP_EVENT_DO_BOOT: - - ret = wcd_cntl_do_boot(cntl); - if (ret < 0) - dev_err(codec->dev, - "%s: WDSP boot failed, err = %d\n", - __func__, ret); - break; - - case WDSP_EVENT_DO_SHUTDOWN: - - wcd_cntl_do_shutdown(cntl); - wcd_cntl_disable_memory(cntl, WCD_MEM_TYPE_SWITCHABLE); - break; - - default: - dev_dbg(codec->dev, "%s: unhandled event %d\n", - __func__, event); - } - -done: - return ret; -} - -static int wcd_cntl_sysfs_init(char *dir, struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - ret = kobject_init_and_add(&cntl->wcd_kobj, &wcd_cntl_ktype, - kernel_kobj, dir); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to add kobject %s, err = %d\n", - __func__, dir, ret); - goto done; - } - - ret = sysfs_create_file(&cntl->wcd_kobj, &cntl_attr_boot.attr); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to add wdsp_boot sysfs entry to %s\n", - __func__, dir); - goto fail_create_file; - } - - return ret; - -fail_create_file: - kobject_put(&cntl->wcd_kobj); -done: - return ret; -} - -static void wcd_cntl_sysfs_remove(struct wcd_dsp_cntl *cntl) -{ - sysfs_remove_file(&cntl->wcd_kobj, &cntl_attr_boot.attr); - kobject_put(&cntl->wcd_kobj); -} - -static void wcd_cntl_debugfs_init(char *dir, struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - - cntl->entry = debugfs_create_dir(dir, NULL); - if (IS_ERR_OR_NULL(dir)) { - dev_err(codec->dev, "%s debugfs_create_dir failed for %s\n", - __func__, dir); - goto done; - } - - debugfs_create_u32("debug_mode", 0644, - cntl->entry, &cntl->debug_mode); - debugfs_create_bool("ramdump_enable", 0644, - cntl->entry, &cntl->ramdump_enable); - debugfs_create_bool("debug_dump_enable", 0644, - cntl->entry, &cntl->dbg_dmp_enable); -done: - return; -} - -static void wcd_cntl_debugfs_remove(struct wcd_dsp_cntl *cntl) -{ - if (cntl) - debugfs_remove(cntl->entry); -} - -static int wcd_miscdev_release(struct inode *inode, struct file *filep) -{ - struct wcd_dsp_cntl *cntl = container_of(filep->private_data, - struct wcd_dsp_cntl, miscdev); - if (!cntl->m_dev || !cntl->m_ops || - !cntl->m_ops->vote_for_dsp) { - dev_err(cntl->codec->dev, - "%s: DSP not ready to boot\n", __func__); - return -EINVAL; - } - - /* Make sure the DSP users goes to zero upon closing dev node */ - while (cntl->boot_reqs > 0) { - cntl->m_ops->vote_for_dsp(cntl->m_dev, false); - cntl->boot_reqs--; - } - - return 0; -} - -static ssize_t wcd_miscdev_write(struct file *filep, const char __user *ubuf, - size_t count, loff_t *pos) -{ - struct wcd_dsp_cntl *cntl = container_of(filep->private_data, - struct wcd_dsp_cntl, miscdev); - char val[WCD_MISCDEV_CMD_MAX_LEN + 1]; - bool vote; - int ret = 0; - - memset(val, 0, WCD_MISCDEV_CMD_MAX_LEN + 1); - - if (count == 0 || count > WCD_MISCDEV_CMD_MAX_LEN) { - pr_err("%s: Invalid count = %zd\n", __func__, count); - ret = -EINVAL; - goto done; - } - - ret = copy_from_user(val, ubuf, count); - if (ret < 0) { - dev_err(cntl->codec->dev, - "%s: copy_from_user failed, err = %d\n", - __func__, ret); - ret = -EFAULT; - goto done; - } - - if (val[0] == '1') { - cntl->boot_reqs++; - vote = true; - } else if (val[0] == '0') { - if (cntl->boot_reqs == 0) { - dev_err(cntl->codec->dev, - "%s: WDSP already disabled\n", - __func__); - ret = -EINVAL; - goto done; - } - cntl->boot_reqs--; - vote = false; - } else if (!strcmp(val, "DEBUG_DUMP")) { - if (cntl->dbg_dmp_enable) { - dev_dbg(cntl->codec->dev, - "%s: Collect dumps for debug use\n", __func__); - wcd_cntl_collect_debug_dumps(cntl, false); - } - /* - * simply ignore the request from userspace - * if dbg_dump_enable is not set from debugfs - */ - goto done; - } else { - dev_err(cntl->codec->dev, "%s: Invalid value %s\n", - __func__, val); - ret = -EINVAL; - goto done; - } - - dev_dbg(cntl->codec->dev, - "%s: booted = %s, ref_cnt = %d, vote = %s\n", - __func__, cntl->is_wdsp_booted ? "true" : "false", - cntl->boot_reqs, vote ? "true" : "false"); - - if (cntl->m_dev && cntl->m_ops && - cntl->m_ops->vote_for_dsp) - ret = cntl->m_ops->vote_for_dsp(cntl->m_dev, vote); - else - ret = -EINVAL; -done: - if (ret) - return ret; - else - return count; -} - -static const struct file_operations wcd_miscdev_fops = { - .write = wcd_miscdev_write, - .release = wcd_miscdev_release, -}; - -static int wcd_cntl_miscdev_create(struct wcd_dsp_cntl *cntl) -{ - snprintf(cntl->miscdev_name, ARRAY_SIZE(cntl->miscdev_name), - "wcd_dsp%u_control", cntl->dsp_instance); - cntl->miscdev.minor = MISC_DYNAMIC_MINOR; - cntl->miscdev.name = cntl->miscdev_name; - cntl->miscdev.fops = &wcd_miscdev_fops; - cntl->miscdev.parent = cntl->codec->dev; - - return misc_register(&cntl->miscdev); -} - -static void wcd_cntl_miscdev_destroy(struct wcd_dsp_cntl *cntl) -{ - misc_deregister(&cntl->miscdev); -} - -static int wcd_control_init(struct device *dev, void *priv_data) -{ - struct wcd_dsp_cntl *cntl = priv_data; - struct snd_soc_codec *codec = cntl->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - int ret; - bool err_irq_requested = false; - - ret = wcd9xxx_request_irq(core_res, - cntl->irqs.cpe_ipc1_irq, - wcd_cntl_ipc_irq, "CPE IPC1", - cntl); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to request cpe ipc irq, err = %d\n", - __func__, ret); - goto done; - } - - /* Unmask the fatal irqs */ - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A, - ~(cntl->irqs.fatal_irqs & 0xFF)); - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B, - ~((cntl->irqs.fatal_irqs >> 8) & 0xFF)); - - /* - * CPE ERR irq is used only for error reporting from WCD DSP, - * even if this request fails, DSP can be function normally. - * Continuing with init even if the CPE ERR irq request fails. - */ - if (wcd9xxx_request_irq(core_res, cntl->irqs.cpe_err_irq, - wcd_cntl_err_irq, "CPE ERR", cntl)) - dev_info(codec->dev, "%s: Failed request_irq(cpe_err_irq)", - __func__); - else - err_irq_requested = true; - - - /* Enable all the clocks */ - ret = wcd_cntl_clocks_enable(cntl); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to enable clocks, err = %d\n", - __func__, ret); - goto err_clk_enable; - } - wcd_cntl_cpar_ctrl(cntl, true); - - return 0; - -err_clk_enable: - /* Mask all error interrupts */ - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A, 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B, 0xFF); - - /* Free the irq's requested */ - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_ipc1_irq, cntl); - - if (err_irq_requested) - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_err_irq, cntl); -done: - return ret; -} - -static int wcd_control_deinit(struct device *dev, void *priv_data) -{ - struct wcd_dsp_cntl *cntl = priv_data; - struct snd_soc_codec *codec = cntl->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - - wcd_cntl_clocks_disable(cntl); - wcd_cntl_cpar_ctrl(cntl, false); - - /* Mask all error interrupts */ - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A, 0xFF); - snd_soc_write(codec, WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B, 0xFF); - - /* Free the irq's requested */ - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_err_irq, cntl); - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_ipc1_irq, cntl); - - return 0; -} - -static struct wdsp_cmpnt_ops control_ops = { - .init = wcd_control_init, - .deinit = wcd_control_deinit, - .event_handler = wcd_control_handler, -}; - -static int wcd_ctrl_component_bind(struct device *dev, - struct device *master, - void *data) -{ - struct wcd_dsp_cntl *cntl; - struct snd_soc_codec *codec; - struct snd_card *card; - struct snd_info_entry *entry; - char proc_name[WCD_PROCFS_ENTRY_MAX_LEN]; - char wcd_cntl_dir_name[WCD_CNTL_DIR_NAME_LEN_MAX]; - int ret = 0; - - if (!dev || !master || !data) { - pr_err("%s: Invalid parameters\n", __func__); - return -EINVAL; - } - - cntl = tavil_get_wcd_dsp_cntl(dev); - if (!cntl) { - dev_err(dev, "%s: Failed to get cntl reference\n", - __func__); - return -EINVAL; - } - - cntl->m_dev = master; - cntl->m_ops = data; - - if (!cntl->m_ops->register_cmpnt_ops) { - dev_err(dev, "%s: invalid master callback register_cmpnt_ops\n", - __func__); - ret = -EINVAL; - goto done; - } - - ret = cntl->m_ops->register_cmpnt_ops(master, dev, cntl, &control_ops); - if (ret) { - dev_err(dev, "%s: register_cmpnt_ops failed, err = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_cntl_miscdev_create(cntl); - if (ret < 0) { - dev_err(dev, "%s: misc dev register failed, err = %d\n", - __func__, ret); - goto done; - } - - snprintf(wcd_cntl_dir_name, WCD_CNTL_DIR_NAME_LEN_MAX, - "%s%d", "wdsp", cntl->dsp_instance); - ret = wcd_cntl_sysfs_init(wcd_cntl_dir_name, cntl); - if (ret < 0) { - dev_err(dev, "%s: sysfs_init failed, err = %d\n", - __func__, ret); - goto err_sysfs_init; - } - - wcd_cntl_debugfs_init(wcd_cntl_dir_name, cntl); - - codec = cntl->codec; - card = codec->component.card->snd_card; - snprintf(proc_name, WCD_PROCFS_ENTRY_MAX_LEN, "%s%d%s", "cpe", - cntl->dsp_instance, "_state"); - entry = snd_info_create_card_entry(card, proc_name, card->proc_root); - if (!entry) { - /* Do not treat this as Fatal error */ - dev_err(dev, "%s: Failed to create procfs entry %s\n", - __func__, proc_name); - goto err_sysfs_init; - } - - cntl->ssr_entry.entry = entry; - cntl->ssr_entry.offline = 1; - entry->size = WCD_PROCFS_ENTRY_MAX_LEN; - entry->content = SNDRV_INFO_CONTENT_DATA; - entry->c.ops = &wdsp_ssr_entry_ops; - entry->private_data = cntl; - ret = snd_info_register(entry); - if (ret < 0) { - dev_err(dev, "%s: Failed to register entry %s, err = %d\n", - __func__, proc_name, ret); - snd_info_free_entry(entry); - /* Let bind still happen even if creating the entry failed */ - ret = 0; - } -done: - return ret; - -err_sysfs_init: - wcd_cntl_miscdev_destroy(cntl); - return ret; -} - -static void wcd_ctrl_component_unbind(struct device *dev, - struct device *master, - void *data) -{ - struct wcd_dsp_cntl *cntl; - - if (!dev) { - pr_err("%s: Invalid device\n", __func__); - return; - } - - cntl = tavil_get_wcd_dsp_cntl(dev); - if (!cntl) { - dev_err(dev, "%s: Failed to get cntl reference\n", - __func__); - return; - } - - cntl->m_dev = NULL; - cntl->m_ops = NULL; - - /* Remove the sysfs entries */ - wcd_cntl_sysfs_remove(cntl); - - /* Remove the debugfs entries */ - wcd_cntl_debugfs_remove(cntl); - - /* Remove the misc device */ - wcd_cntl_miscdev_destroy(cntl); -} - -static const struct component_ops wcd_ctrl_component_ops = { - .bind = wcd_ctrl_component_bind, - .unbind = wcd_ctrl_component_unbind, -}; - -/* - * wcd_dsp_ssr_event: handle the SSR event raised by caller. - * @cntl: Handle to the wcd_dsp_cntl structure - * @event: The SSR event to be handled - * - * Notifies the manager driver about the SSR event. - * Returns 0 on success and negative error code on error. - */ -int wcd_dsp_ssr_event(struct wcd_dsp_cntl *cntl, enum cdc_ssr_event event) -{ - int ret = 0; - - if (!cntl) { - pr_err("%s: Invalid handle to control\n", __func__); - return -EINVAL; - } - - if (!cntl->m_dev || !cntl->m_ops || !cntl->m_ops->signal_handler) { - dev_err(cntl->codec->dev, - "%s: Invalid signal_handler callback\n", __func__); - return -EINVAL; - } - - switch (event) { - case WCD_CDC_DOWN_EVENT: - ret = cntl->m_ops->signal_handler(cntl->m_dev, - WDSP_CDC_DOWN_SIGNAL, - NULL); - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: WDSP_CDC_DOWN_SIGNAL failed, err = %d\n", - __func__, ret); - wcd_cntl_change_online_state(cntl, 0); - break; - case WCD_CDC_UP_EVENT: - ret = cntl->m_ops->signal_handler(cntl->m_dev, - WDSP_CDC_UP_SIGNAL, - NULL); - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: WDSP_CDC_UP_SIGNAL failed, err = %d\n", - __func__, ret); - break; - default: - dev_err(cntl->codec->dev, "%s: Invalid event %d\n", - __func__, event); - ret = -EINVAL; - break; - } - - return ret; -} -EXPORT_SYMBOL(wcd_dsp_ssr_event); - -/* - * wcd_dsp_cntl_init: Initialize the wcd-dsp control - * @codec: pointer to the codec handle - * @params: Parameters required to initialize wcd-dsp control - * - * This API is expected to be invoked by the codec driver and - * provide information essential for the wcd dsp control to - * configure and initialize the dsp - */ -void wcd_dsp_cntl_init(struct snd_soc_codec *codec, - struct wcd_dsp_params *params, - struct wcd_dsp_cntl **cntl) -{ - struct wcd_dsp_cntl *control; - int ret; - - if (!codec || !params) { - pr_err("%s: Invalid handle to %s\n", __func__, - (!codec) ? "codec" : "params"); - *cntl = NULL; - return; - } - - if (*cntl) { - pr_err("%s: cntl is non NULL, maybe already initialized ?\n", - __func__); - return; - } - - if (!params->cb || !params->cb->cdc_clk_en || - !params->cb->cdc_vote_svs) { - dev_err(codec->dev, - "%s: clk_en and vote_svs callbacks must be provided\n", - __func__); - return; - } - - control = kzalloc(sizeof(*control), GFP_KERNEL); - if (!(control)) - return; - - control->codec = codec; - control->clk_rate = params->clk_rate; - control->cdc_cb = params->cb; - control->dsp_instance = params->dsp_instance; - memcpy(&control->irqs, ¶ms->irqs, sizeof(control->irqs)); - init_completion(&control->boot_complete); - mutex_init(&control->clk_mutex); - mutex_init(&control->ssr_mutex); - init_waitqueue_head(&control->ssr_entry.offline_poll_wait); - WCD_CNTL_CLR_ERR_IRQ_FLAG(control); - - /* - * The default state of WDSP is in SVS mode. - * Vote for SVS now, the vote will be removed only - * after DSP is booted up. - */ - control->cdc_cb->cdc_vote_svs(codec, true); - - /* - * If this is the last component needed by master to be ready, - * then component_bind will be called within the component_add. - * Hence, the data pointer should be assigned before component_add, - * so that we can access it during this component's bind call. - */ - *cntl = control; - ret = component_add(codec->dev, &wcd_ctrl_component_ops); - if (ret) { - dev_err(codec->dev, "%s: component_add failed, err = %d\n", - __func__, ret); - kfree(*cntl); - *cntl = NULL; - } -} -EXPORT_SYMBOL(wcd_dsp_cntl_init); - -/* - * wcd_dsp_cntl_deinit: De-initialize the wcd-dsp control - * @cntl: The struct wcd_dsp_cntl to de-initialize - * - * This API is intended to be invoked by the codec driver - * to de-initialize the wcd dsp control - */ -void wcd_dsp_cntl_deinit(struct wcd_dsp_cntl **cntl) -{ - struct wcd_dsp_cntl *control = *cntl; - struct snd_soc_codec *codec; - - /* If control is NULL, there is nothing to de-initialize */ - if (!control) - return; - codec = control->codec; - - /* - * Calling shutdown will cleanup all register states, - * irrespective of DSP was booted up or not. - */ - wcd_cntl_do_shutdown(control); - wcd_cntl_disable_memory(control, WCD_MEM_TYPE_SWITCHABLE); - wcd_cntl_disable_memory(control, WCD_MEM_TYPE_ALWAYS_ON); - - component_del(codec->dev, &wcd_ctrl_component_ops); - - mutex_destroy(&control->clk_mutex); - mutex_destroy(&control->ssr_mutex); - kfree(*cntl); - *cntl = NULL; -} -EXPORT_SYMBOL(wcd_dsp_cntl_deinit); diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.h b/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.h deleted file mode 100644 index 5ce4fd85da13..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-dsp-cntl.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD934X_DSP_CNTL_H__ -#define __WCD934X_DSP_CNTL_H__ - -#include -#include -#include - -enum cdc_ssr_event { - WCD_CDC_DOWN_EVENT, - WCD_CDC_UP_EVENT, -}; - -struct wcd_dsp_cdc_cb { - /* Callback to enable codec clock */ - int (*cdc_clk_en)(struct snd_soc_codec *, bool); - /* Callback to vote and unvote for SVS2 mode */ - void (*cdc_vote_svs)(struct snd_soc_codec *, bool); -}; - -struct wcd_dsp_irq_info { - /* IPC interrupt */ - int cpe_ipc1_irq; - - /* CPE error summary interrupt */ - int cpe_err_irq; - - /* - * Bit mask to indicate which of the - * error interrupts are to be considered - * as fatal. - */ - u16 fatal_irqs; -}; - -struct wcd_dsp_params { - struct wcd_dsp_cdc_cb *cb; - struct wcd_dsp_irq_info irqs; - - /* Rate at which the codec clock operates */ - u32 clk_rate; - - /* - * Represents the dsp instance, will be used - * to create sysfs and debugfs entries with - * directory wdsp - */ - u32 dsp_instance; -}; - -struct wdsp_ssr_entry { - u8 offline; - u8 offline_change; - wait_queue_head_t offline_poll_wait; - struct snd_info_entry *entry; -}; - -struct wcd_dsp_cntl { - /* Handle to codec */ - struct snd_soc_codec *codec; - - /* Clk rate of the codec clock */ - u32 clk_rate; - - /* Callbacks to codec driver */ - const struct wcd_dsp_cdc_cb *cdc_cb; - - /* Completion to indicate WDSP boot done */ - struct completion boot_complete; - - struct wcd_dsp_irq_info irqs; - u32 dsp_instance; - - /* Sysfs entries related */ - int boot_reqs; - struct kobject wcd_kobj; - - /* Debugfs related */ - struct dentry *entry; - u32 debug_mode; - bool ramdump_enable; - bool dbg_dmp_enable; - - /* WDSP manager drivers data */ - struct device *m_dev; - struct wdsp_mgr_ops *m_ops; - - /* clk related */ - struct mutex clk_mutex; - bool is_clk_enabled; - - /* Keep track of WDSP boot status */ - bool is_wdsp_booted; - - /* SSR related */ - struct wdsp_ssr_entry ssr_entry; - struct mutex ssr_mutex; - - /* Misc device related */ - char miscdev_name[256]; - struct miscdevice miscdev; -#ifdef CONFIG_DEBUG_FS - /* Debug dump related */ - atomic_t err_irq_flag; -#endif -}; - -void wcd_dsp_cntl_init(struct snd_soc_codec *codec, - struct wcd_dsp_params *params, - struct wcd_dsp_cntl **cntl); -void wcd_dsp_cntl_deinit(struct wcd_dsp_cntl **cntl); -int wcd_dsp_ssr_event(struct wcd_dsp_cntl *cntl, enum cdc_ssr_event event); -#endif /* end __WCD_DSP_CONTROL_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.c b/techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.c deleted file mode 100644 index e411aac3441c..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.c +++ /dev/null @@ -1,1184 +0,0 @@ -/* - * Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd934x.h" -#include "wcd934x-mbhc.h" -#include -#include "wcd934x_irq.h" -#include "../core.h" -#include "../pdata.h" -#include "../wcd9xxx-irq.h" -#include "../wcdcal-hwdep.h" -#include "../wcd-mbhc-v2-api.h" - -#define TAVIL_ZDET_SUPPORTED true -/* Z value defined in milliohm */ -#define TAVIL_ZDET_VAL_32 32000 -#define TAVIL_ZDET_VAL_400 400000 -#define TAVIL_ZDET_VAL_1200 1200000 -#define TAVIL_ZDET_VAL_100K 100000000 -/* Z floating defined in ohms */ -#define TAVIL_ZDET_FLOATING_IMPEDANCE 0x0FFFFFFE - -#define TAVIL_ZDET_NUM_MEASUREMENTS 900 -#define TAVIL_MBHC_GET_C1(c) ((c & 0xC000) >> 14) -#define TAVIL_MBHC_GET_X1(x) (x & 0x3FFF) -/* Z value compared in milliOhm */ -#define TAVIL_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) -#define TAVIL_MBHC_ZDET_CONST (86 * 16384) -#define TAVIL_MBHC_MOISTURE_RREF R_24_KOHM - -static struct wcd_mbhc_register - wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { - WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN", - WCD934X_ANA_MBHC_MECH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN", - WCD934X_ANA_MBHC_MECH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE", - WCD934X_ANA_MBHC_MECH, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL", - WCD934X_MBHC_NEW_PLUG_DETECT_CTL, 0x30, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE", - WCD934X_ANA_MBHC_ELECT, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL", - WCD934X_MBHC_NEW_PLUG_DETECT_CTL, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL", - WCD934X_ANA_MBHC_MECH, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE", - WCD934X_ANA_MBHC_MECH, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE", - WCD934X_ANA_MBHC_MECH, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND", - WCD934X_ANA_MBHC_MECH, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC", - WCD934X_ANA_MBHC_ELECT, 0x06, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN", - WCD934X_ANA_MBHC_ELECT, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC", - WCD934X_MBHC_NEW_PLUG_DETECT_CTL, 0x0F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC", - WCD934X_MBHC_NEW_CTL_1, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF", - WCD934X_MBHC_NEW_CTL_2, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT", - WCD934X_ANA_MBHC_RESULT_3, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_IN2P_CLAMP_STATE", - WCD934X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT", - WCD934X_ANA_MBHC_RESULT_3, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT", - WCD934X_ANA_MBHC_RESULT_3, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT", - WCD934X_ANA_MBHC_RESULT_3, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN", - WCD934X_HPH_OCP_CTL, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT", - WCD934X_ANA_MBHC_RESULT_3, 0x07, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL", - WCD934X_ANA_MBHC_ELECT, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT", - WCD934X_ANA_MBHC_RESULT_3, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL", - WCD934X_ANA_MICB2, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME", - WCD934X_HPH_CNP_WG_TIME, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN", - WCD934X_ANA_HPH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN", - WCD934X_ANA_HPH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN", - WCD934X_ANA_HPH, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", - WCD934X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", - 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", - WCD934X_MBHC_CTL_BCS, 0x02, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", - WCD934X_MBHC_STATUS_SPARE_1, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", - WCD934X_MBHC_NEW_CTL_2, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS", - WCD934X_MBHC_NEW_FSM_STATUS, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND", - WCD934X_HPH_PA_CTL2, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND", - WCD934X_HPH_PA_CTL2, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_DET_EN", - WCD934X_HPH_L_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_DET_EN", - WCD934X_HPH_R_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_STATUS", - WCD934X_INTR_PIN1_STATUS0, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_STATUS", - WCD934X_INTR_PIN1_STATUS0, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_EN", - WCD934X_MBHC_NEW_CTL_1, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_COMPLETE", WCD934X_MBHC_NEW_FSM_STATUS, - 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_TIMEOUT", WCD934X_MBHC_NEW_FSM_STATUS, - 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_RESULT", WCD934X_MBHC_NEW_ADC_RESULT, - 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB2_VOUT", WCD934X_ANA_MICB2, 0x3F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_MODE", - WCD934X_MBHC_NEW_CTL_1, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_DETECTION_DONE", - WCD934X_MBHC_NEW_CTL_1, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_ISRC_EN", - WCD934X_ANA_MBHC_ZDET, 0x02, 1, 0), -}; - -static const struct wcd_mbhc_intr intr_ids = { - .mbhc_sw_intr = WCD934X_IRQ_MBHC_SW_DET, - .mbhc_btn_press_intr = WCD934X_IRQ_MBHC_BUTTON_PRESS_DET, - .mbhc_btn_release_intr = WCD934X_IRQ_MBHC_BUTTON_RELEASE_DET, - .mbhc_hs_ins_intr = WCD934X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - .mbhc_hs_rem_intr = WCD934X_IRQ_MBHC_ELECT_INS_REM_DET, - .hph_left_ocp = WCD934X_IRQ_HPH_PA_OCPL_FAULT, - .hph_right_ocp = WCD934X_IRQ_HPH_PA_OCPR_FAULT, -}; - - -static char on_demand_supply_name[][MAX_ON_DEMAND_SUPPLY_NAME_LENGTH] = { - "cdc-vdd-mic-bias", -}; - -struct tavil_mbhc_zdet_param { - u16 ldo_ctl; - u16 noff; - u16 nshift; - u16 btn5; - u16 btn6; - u16 btn7; -}; - -static int tavil_mbhc_request_irq(struct snd_soc_codec *codec, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - return wcd9xxx_request_irq(core_res, irq, handler, name, data); -} - -static void tavil_mbhc_irq_control(struct snd_soc_codec *codec, - int irq, bool enable) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - if (enable) - wcd9xxx_enable_irq(core_res, irq); - else - wcd9xxx_disable_irq(core_res, irq); -} - -static int tavil_mbhc_free_irq(struct snd_soc_codec *codec, - int irq, void *data) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - wcd9xxx_free_irq(core_res, irq, data); - return 0; -} - -static void tavil_mbhc_clk_setup(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_1, - 0x80, 0x80); - else - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_1, - 0x80, 0x00); -} - -static int tavil_mbhc_btn_to_num(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, WCD934X_ANA_MBHC_RESULT_3) & 0x7; -} - -static int tavil_enable_ext_mb_source(struct wcd_mbhc *mbhc, - bool turn_on) -{ - struct wcd934x_mbhc *wcd934x_mbhc; - struct snd_soc_codec *codec = mbhc->codec; - struct wcd934x_on_demand_supply *supply; - int ret = 0; - - wcd934x_mbhc = container_of(mbhc, struct wcd934x_mbhc, wcd_mbhc); - - supply = &wcd934x_mbhc->on_demand_list[WCD934X_ON_DEMAND_MICBIAS]; - if (!supply->supply) { - dev_dbg(codec->dev, "%s: warning supply not present ond for %s\n", - __func__, "onDemand Micbias"); - return ret; - } - - dev_dbg(codec->dev, "%s turn_on: %d count: %d\n", __func__, turn_on, - supply->ondemand_supply_count); - - if (turn_on) { - if (!(supply->ondemand_supply_count)) { - ret = snd_soc_dapm_force_enable_pin( - snd_soc_codec_get_dapm(codec), - "MICBIAS_REGULATOR"); - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - } - supply->ondemand_supply_count++; - } else { - if (supply->ondemand_supply_count > 0) - supply->ondemand_supply_count--; - if (!(supply->ondemand_supply_count)) { - ret = snd_soc_dapm_disable_pin( - snd_soc_codec_get_dapm(codec), - "MICBIAS_REGULATOR"); - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - } - } - - if (ret) - dev_err(codec->dev, "%s: Failed to %s external micbias source\n", - __func__, turn_on ? "enable" : "disabled"); - else - dev_dbg(codec->dev, "%s: %s external micbias source\n", - __func__, turn_on ? "Enabled" : "Disabled"); - - return ret; -} - -static void tavil_mbhc_mbhc_bias_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_ELECT, - 0x01, 0x01); - else - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_ELECT, - 0x01, 0x00); -} - -static void tavil_mbhc_program_btn_thr(struct snd_soc_codec *codec, - s16 *btn_low, s16 *btn_high, - int num_btn, bool is_micbias) -{ - int i; - int vth; - - if (num_btn > WCD_MBHC_DEF_BUTTONS) { - dev_err(codec->dev, "%s: invalid number of buttons: %d\n", - __func__, num_btn); - return; - } - /* - * Tavil just needs one set of thresholds for button detection - * due to micbias voltage ramp to pullup upon button press. So - * btn_low and is_micbias are ignored and always program button - * thresholds using btn_high. - */ - for (i = 0; i < num_btn; i++) { - vth = ((btn_high[i] * 2) / 25) & 0x3F; - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_BTN0 + i, - 0xFC, vth << 2); - dev_dbg(codec->dev, "%s: btn_high[%d]: %d, vth: %d\n", - __func__, i, btn_high[i], vth); - } -} - -static bool tavil_mbhc_lock_sleep(struct wcd_mbhc *mbhc, bool lock) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - bool ret = 0; - - if (lock) - ret = wcd9xxx_lock_sleep(core_res); - else - wcd9xxx_unlock_sleep(core_res); - - return ret; -} - -static int tavil_mbhc_register_notifier(struct wcd_mbhc *mbhc, - struct notifier_block *nblock, - bool enable) -{ - struct wcd934x_mbhc *wcd934x_mbhc; - - wcd934x_mbhc = container_of(mbhc, struct wcd934x_mbhc, wcd_mbhc); - - if (enable) - return blocking_notifier_chain_register(&wcd934x_mbhc->notifier, - nblock); - else - return blocking_notifier_chain_unregister( - &wcd934x_mbhc->notifier, nblock); -} - -static bool tavil_mbhc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num) -{ - u8 val; - - if (micb_num == MIC_BIAS_2) { - val = (snd_soc_read(mbhc->codec, WCD934X_ANA_MICB2) >> 6); - if (val == 0x01) - return true; - } - return false; -} - -static bool tavil_mbhc_hph_pa_on_status(struct snd_soc_codec *codec) -{ - return (snd_soc_read(codec, WCD934X_ANA_HPH) & 0xC0) ? true : false; -} - -static void tavil_mbhc_hph_l_pull_up_control( - struct snd_soc_codec *codec, - enum mbhc_hs_pullup_iref pull_up_cur) -{ - /* Default pull up current to 2uA */ - if (pull_up_cur < I_OFF || pull_up_cur > I_3P0_UA || - pull_up_cur == I_DEFAULT) - pull_up_cur = I_2P0_UA; - - dev_dbg(codec->dev, "%s: HS pull up current:%d\n", - __func__, pull_up_cur); - - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_PLUG_DETECT_CTL, - 0xC0, pull_up_cur << 6); -} - -static int tavil_mbhc_request_micbias(struct snd_soc_codec *codec, - int micb_num, int req) -{ - int ret; - - /* - * If micbias is requested, make sure that there - * is vote to enable mclk - */ - if (req == MICB_ENABLE) - tavil_cdc_mclk_enable(codec, true); - - ret = tavil_micbias_control(codec, micb_num, req, false); - - /* - * Release vote for mclk while requesting for - * micbias disable - */ - if (req == MICB_DISABLE) - tavil_cdc_mclk_enable(codec, false); - - return ret; -} - -static void tavil_mbhc_micb_ramp_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD934X_ANA_MICB2_RAMP, - 0x1C, 0x0C); - snd_soc_update_bits(codec, WCD934X_ANA_MICB2_RAMP, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, WCD934X_ANA_MICB2_RAMP, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD934X_ANA_MICB2_RAMP, - 0x1C, 0x00); - } -} - -static struct firmware_cal *tavil_get_hwdep_fw_cal(struct wcd_mbhc *mbhc, - enum wcd_cal_type type) -{ - struct wcd934x_mbhc *wcd934x_mbhc; - struct firmware_cal *hwdep_cal; - struct snd_soc_codec *codec = mbhc->codec; - - wcd934x_mbhc = container_of(mbhc, struct wcd934x_mbhc, wcd_mbhc); - - if (!codec) { - pr_err("%s: NULL codec pointer\n", __func__); - return NULL; - } - hwdep_cal = wcdcal_get_fw_cal(wcd934x_mbhc->fw_data, type); - if (!hwdep_cal) - dev_err(codec->dev, "%s: cal not sent by %d\n", - __func__, type); - - return hwdep_cal; -} - -static int tavil_mbhc_micb_ctrl_threshold_mic(struct snd_soc_codec *codec, - int micb_num, bool req_en) -{ - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - int rc, micb_mv; - - if (micb_num != MIC_BIAS_2) - return -EINVAL; - - /* - * If device tree micbias level is already above the minimum - * voltage needed to detect threshold microphone, then do - * not change the micbias, just return. - */ - if (pdata->micbias.micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) - return 0; - - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : pdata->micbias.micb2_mv; - - rc = tavil_mbhc_micb_adjust_voltage(codec, micb_mv, MIC_BIAS_2); - - return rc; -} - -static inline void tavil_mbhc_get_result_params(struct wcd9xxx *wcd9xxx, - s16 *d1_a, u16 noff, - int32_t *zdet) -{ - int i; - int val, val1; - s16 c1; - s32 x1, d1; - int32_t denom; - int minCode_param[] = { - 3277, 1639, 820, 410, 205, 103, 52, 26 - }; - - regmap_update_bits(wcd9xxx->regmap, WCD934X_ANA_MBHC_ZDET, 0x20, 0x20); - for (i = 0; i < TAVIL_ZDET_NUM_MEASUREMENTS; i++) { - regmap_read(wcd9xxx->regmap, WCD934X_ANA_MBHC_RESULT_2, &val); - if (val & 0x80) - break; - } - val = val << 0x8; - regmap_read(wcd9xxx->regmap, WCD934X_ANA_MBHC_RESULT_1, &val1); - val |= val1; - regmap_update_bits(wcd9xxx->regmap, WCD934X_ANA_MBHC_ZDET, 0x20, 0x00); - x1 = TAVIL_MBHC_GET_X1(val); - c1 = TAVIL_MBHC_GET_C1(val); - /* If ramp is not complete, give additional 5ms */ - if ((c1 < 2) && x1) - usleep_range(5000, 5050); - - if (!c1 || !x1) { - dev_dbg(wcd9xxx->dev, - "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", - __func__, c1, x1); - goto ramp_down; - } - d1 = d1_a[c1]; - denom = (x1 * d1) - (1 << (14 - noff)); - if (denom > 0) - *zdet = (TAVIL_MBHC_ZDET_CONST * 1000) / denom; - else if (x1 < minCode_param[noff]) - *zdet = TAVIL_ZDET_FLOATING_IMPEDANCE; - - dev_dbg(wcd9xxx->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", - __func__, d1, c1, x1, *zdet); -ramp_down: - i = 0; - while (x1) { - regmap_bulk_read(wcd9xxx->regmap, - WCD934X_ANA_MBHC_RESULT_1, (u8 *)&val, 2); - x1 = TAVIL_MBHC_GET_X1(val); - i++; - if (i == TAVIL_ZDET_NUM_MEASUREMENTS) - break; - } -} - -static void tavil_mbhc_zdet_ramp(struct snd_soc_codec *codec, - struct tavil_mbhc_zdet_param *zdet_param, - int32_t *zl, int32_t *zr, s16 *d1_a) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int32_t zdet = 0; - - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_ZDET_ANA_CTL, 0x70, - zdet_param->ldo_ctl << 4); - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_BTN5, 0xFC, - zdet_param->btn5); - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_BTN6, 0xFC, - zdet_param->btn6); - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_BTN7, 0xFC, - zdet_param->btn7); - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_ZDET_ANA_CTL, 0x0F, - zdet_param->noff); - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_ZDET_RAMP_CTL, 0x0F, - zdet_param->nshift); - - if (!zl) - goto z_right; - /* Start impedance measurement for HPH_L */ - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_ZDET, 0x80, 0x80); - dev_dbg(wcd9xxx->dev, "%s: ramp for HPH_L, noff = %d\n", - __func__, zdet_param->noff); - tavil_mbhc_get_result_params(wcd9xxx, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_ZDET, 0x80, 0x00); - - *zl = zdet; - -z_right: - if (!zr) - return; - /* Start impedance measurement for HPH_R */ - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_ZDET, 0x40, 0x40); - dev_dbg(wcd9xxx->dev, "%s: ramp for HPH_R, noff = %d\n", - __func__, zdet_param->noff); - tavil_mbhc_get_result_params(wcd9xxx, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_ZDET, 0x40, 0x00); - - *zr = zdet; -} - -static inline void tavil_wcd_mbhc_qfuse_cal(struct snd_soc_codec *codec, - int32_t *z_val, int flag_l_r) -{ - s16 q1; - int q1_cal; - - if (*z_val < (TAVIL_ZDET_VAL_400/1000)) - q1 = snd_soc_read(codec, - WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 + (2 * flag_l_r)); - else - q1 = snd_soc_read(codec, - WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 + (2 * flag_l_r)); - if (q1 & 0x80) - q1_cal = (10000 - ((q1 & 0x7F) * 25)); - else - q1_cal = (10000 + (q1 * 25)); - if (q1_cal > 0) - *z_val = ((*z_val) * 10000) / q1_cal; -} - -static void tavil_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - s16 reg0, reg1, reg2, reg3, reg4; - int32_t z1L, z1R, z1Ls; - int zMono, z_diff1, z_diff2; - bool is_fsm_disable = false; - struct tavil_mbhc_zdet_param zdet_param[] = { - {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */ - {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */ - {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */ - {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */ - }; - struct tavil_mbhc_zdet_param *zdet_param_ptr = NULL; - s16 d1_a[][4] = { - {0, 30, 90, 30}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - }; - s16 *d1 = NULL; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - reg0 = snd_soc_read(codec, WCD934X_ANA_MBHC_BTN5); - reg1 = snd_soc_read(codec, WCD934X_ANA_MBHC_BTN6); - reg2 = snd_soc_read(codec, WCD934X_ANA_MBHC_BTN7); - reg3 = snd_soc_read(codec, WCD934X_MBHC_CTL_CLK); - reg4 = snd_soc_read(codec, WCD934X_MBHC_NEW_ZDET_ANA_CTL); - - if (snd_soc_read(codec, WCD934X_ANA_MBHC_ELECT) & 0x80) { - is_fsm_disable = true; - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_ELECT, 0x80, 0x00); - } - - /* For NO-jack, disable L_DET_EN before Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_MECH, 0x80, 0x00); - - /* Turn off 100k pull down on HPHL */ - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_MECH, 0x01, 0x00); - - /* First get impedance on Left */ - d1 = d1_a[1]; - zdet_param_ptr = &zdet_param[1]; - tavil_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - - if (!TAVIL_MBHC_IS_SECOND_RAMP_REQUIRED(z1L)) - goto left_ch_impedance; - - /* Second ramp for left ch */ - if (z1L < TAVIL_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1L > TAVIL_ZDET_VAL_400) && (z1L <= TAVIL_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1L > TAVIL_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - tavil_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - -left_ch_impedance: - if ((z1L == TAVIL_ZDET_FLOATING_IMPEDANCE) || - (z1L > TAVIL_ZDET_VAL_100K)) { - *zl = TAVIL_ZDET_FLOATING_IMPEDANCE; - zdet_param_ptr = &zdet_param[1]; - d1 = d1_a[1]; - } else { - *zl = z1L/1000; - tavil_wcd_mbhc_qfuse_cal(codec, zl, 0); - } - dev_dbg(codec->dev, "%s: impedance on HPH_L = %d(ohms)\n", - __func__, *zl); - - /* Start of right impedance ramp and calculation */ - tavil_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - if (TAVIL_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) { - if (((z1R > TAVIL_ZDET_VAL_1200) && - (zdet_param_ptr->noff == 0x6)) || - ((*zl) != TAVIL_ZDET_FLOATING_IMPEDANCE)) - goto right_ch_impedance; - /* Second ramp for right ch */ - if (z1R < TAVIL_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1R > TAVIL_ZDET_VAL_400) && - (z1R <= TAVIL_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1R > TAVIL_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - tavil_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - } -right_ch_impedance: - if ((z1R == TAVIL_ZDET_FLOATING_IMPEDANCE) || - (z1R > TAVIL_ZDET_VAL_100K)) { - *zr = TAVIL_ZDET_FLOATING_IMPEDANCE; - } else { - *zr = z1R/1000; - tavil_wcd_mbhc_qfuse_cal(codec, zr, 1); - } - dev_dbg(codec->dev, "%s: impedance on HPH_R = %d(ohms)\n", - __func__, *zr); - - /* Mono/stereo detection */ - if ((*zl == TAVIL_ZDET_FLOATING_IMPEDANCE) && - (*zr == TAVIL_ZDET_FLOATING_IMPEDANCE)) { - dev_dbg(codec->dev, - "%s: plug type is invalid or extension cable\n", - __func__); - goto zdet_complete; - } - if ((*zl == TAVIL_ZDET_FLOATING_IMPEDANCE) || - (*zr == TAVIL_ZDET_FLOATING_IMPEDANCE) || - ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) || - ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) { - dev_dbg(codec->dev, - "%s: Mono plug type with one ch floating or shorted to GND\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - goto zdet_complete; - } - snd_soc_update_bits(codec, WCD934X_HPH_R_ATEST, 0x02, 0x02); - snd_soc_update_bits(codec, WCD934X_HPH_PA_CTL2, 0x40, 0x01); - if (*zl < (TAVIL_ZDET_VAL_32/1000)) - tavil_mbhc_zdet_ramp(codec, &zdet_param[0], &z1Ls, NULL, d1); - else - tavil_mbhc_zdet_ramp(codec, &zdet_param[1], &z1Ls, NULL, d1); - snd_soc_update_bits(codec, WCD934X_HPH_PA_CTL2, 0x40, 0x00); - snd_soc_update_bits(codec, WCD934X_HPH_R_ATEST, 0x02, 0x00); - z1Ls /= 1000; - tavil_wcd_mbhc_qfuse_cal(codec, &z1Ls, 0); - /* Parallel of left Z and 9 ohm pull down resistor */ - zMono = ((*zl) * 9) / ((*zl) + 9); - z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); - z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); - if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) { - dev_dbg(codec->dev, "%s: stereo plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } else { - dev_dbg(codec->dev, "%s: MONO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } - -zdet_complete: - snd_soc_write(codec, WCD934X_ANA_MBHC_BTN5, reg0); - snd_soc_write(codec, WCD934X_ANA_MBHC_BTN6, reg1); - snd_soc_write(codec, WCD934X_ANA_MBHC_BTN7, reg2); - /* Turn on 100k pull down on HPHL */ - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_MECH, 0x01, 0x01); - - /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_MECH, 0x80, 0x80); - - snd_soc_write(codec, WCD934X_MBHC_NEW_ZDET_ANA_CTL, reg4); - snd_soc_write(codec, WCD934X_MBHC_CTL_CLK, reg3); - if (is_fsm_disable) - regmap_update_bits(wcd9xxx->regmap, - WCD934X_ANA_MBHC_ELECT, 0x80, 0x80); -} - -static void tavil_mbhc_gnd_det_ctrl(struct snd_soc_codec *codec, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_MECH, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_MECH, - 0x40, 0x40); - } else { - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_MECH, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_MECH, - 0x02, 0x00); - } -} - -static void tavil_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD934X_HPH_PA_CTL2, - 0x40, 0x40); - snd_soc_update_bits(codec, WCD934X_HPH_PA_CTL2, - 0x10, 0x10); - } else { - snd_soc_update_bits(codec, WCD934X_HPH_PA_CTL2, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD934X_HPH_PA_CTL2, - 0x10, 0x00); - } -} -static void tavil_mbhc_moisture_config(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - /* Donot enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); -} - -static bool tavil_hph_register_recovery(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd934x_mbhc *wcd934x_mbhc = tavil_soc_get_mbhc(codec); - - if (!wcd934x_mbhc) - return false; - - wcd934x_mbhc->is_hph_recover = false; - snd_soc_dapm_force_enable_pin(snd_soc_codec_get_dapm(codec), - "RESET_HPH_REGISTERS"); - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - - snd_soc_dapm_disable_pin(snd_soc_codec_get_dapm(codec), - "RESET_HPH_REGISTERS"); - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - - return wcd934x_mbhc->is_hph_recover; -} - -static void tavil_update_anc_state(struct snd_soc_codec *codec, bool enable, - int anc_num) -{ - if (enable) - snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CFG0 + - (20 * anc_num), 0x10, 0x10); - else - snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CFG0 + - (20 * anc_num), 0x10, 0x00); -} - -static bool tavil_is_anc_on(struct wcd_mbhc *mbhc) -{ - bool anc_on = false; - u16 ancl, ancr; - - ancl = - (snd_soc_read(mbhc->codec, WCD934X_CDC_RX1_RX_PATH_CFG0)) & 0x10; - ancr = - (snd_soc_read(mbhc->codec, WCD934X_CDC_RX2_RX_PATH_CFG0)) & 0x10; - - anc_on = !!(ancl | ancr); - - return anc_on; -} - -static const struct wcd_mbhc_cb mbhc_cb = { - .request_irq = tavil_mbhc_request_irq, - .irq_control = tavil_mbhc_irq_control, - .free_irq = tavil_mbhc_free_irq, - .clk_setup = tavil_mbhc_clk_setup, - .map_btn_code_to_num = tavil_mbhc_btn_to_num, - .enable_mb_source = tavil_enable_ext_mb_source, - .mbhc_bias = tavil_mbhc_mbhc_bias_control, - .set_btn_thr = tavil_mbhc_program_btn_thr, - .lock_sleep = tavil_mbhc_lock_sleep, - .register_notifier = tavil_mbhc_register_notifier, - .micbias_enable_status = tavil_mbhc_micb_en_status, - .hph_pa_on_status = tavil_mbhc_hph_pa_on_status, - .hph_pull_up_control = tavil_mbhc_hph_l_pull_up_control, - .mbhc_micbias_control = tavil_mbhc_request_micbias, - .mbhc_micb_ramp_control = tavil_mbhc_micb_ramp_control, - .get_hwdep_fw_cal = tavil_get_hwdep_fw_cal, - .mbhc_micb_ctrl_thr_mic = tavil_mbhc_micb_ctrl_threshold_mic, - .compute_impedance = tavil_wcd_mbhc_calc_impedance, - .mbhc_gnd_det_ctrl = tavil_mbhc_gnd_det_ctrl, - .hph_pull_down_ctrl = tavil_mbhc_hph_pull_down_ctrl, - .mbhc_moisture_config = tavil_mbhc_moisture_config, - .hph_register_recovery = tavil_hph_register_recovery, - .update_anc_state = tavil_update_anc_state, - .is_anc_on = tavil_is_anc_on, -}; - -static struct regulator *tavil_codec_find_ondemand_regulator( - struct snd_soc_codec *codec, const char *name) -{ - int i; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - - for (i = 0; i < wcd9xxx->num_of_supplies; ++i) { - if (pdata->regulator[i].ondemand && - wcd9xxx->supplies[i].supply && - !strcmp(wcd9xxx->supplies[i].supply, name)) - return wcd9xxx->supplies[i].consumer; - } - - dev_dbg(codec->dev, "Warning: regulator not found:%s\n", - name); - return NULL; -} - -static int tavil_get_hph_type(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd934x_mbhc *wcd934x_mbhc = tavil_soc_get_mbhc(codec); - struct wcd_mbhc *mbhc; - - if (!wcd934x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mbhc = &wcd934x_mbhc->wcd_mbhc; - - ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; - dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); - - return 0; -} - -static int tavil_hph_impedance_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t zl, zr; - bool hphr; - struct soc_multi_mixer_control *mc; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd934x_mbhc *wcd934x_mbhc = tavil_soc_get_mbhc(codec); - - if (!wcd934x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - wcd_mbhc_get_impedance(&wcd934x_mbhc->wcd_mbhc, &zl, &zr); - dev_dbg(codec->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); - ucontrol->value.integer.value[0] = hphr ? zr : zl; - - return 0; -} - -static const struct snd_kcontrol_new hph_type_detect_controls[] = { - SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, - tavil_get_hph_type, NULL), -}; - -static const struct snd_kcontrol_new impedance_detect_controls[] = { - SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0, - tavil_hph_impedance_get, NULL), - SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0, - tavil_hph_impedance_get, NULL), -}; - -/* - * tavil_mbhc_get_impedance: get impedance of headphone left and right channels - * @wcd934x_mbhc: handle to struct wcd934x_mbhc * - * @zl: handle to left-ch impedance - * @zr: handle to right-ch impedance - * return 0 for success or error code in case of failure - */ -int tavil_mbhc_get_impedance(struct wcd934x_mbhc *wcd934x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (!wcd934x_mbhc) { - pr_err("%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - if (!zl || !zr) { - pr_err("%s: zl or zr null!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_get_impedance(&wcd934x_mbhc->wcd_mbhc, zl, zr); -} -EXPORT_SYMBOL(tavil_mbhc_get_impedance); - - -int tavil_mb_pull_down(struct snd_soc_codec *codec, bool active, - int value) -{ - int oldv = 0; - - if (active) { - oldv = snd_soc_read(codec, WCD934X_ANA_MICB2); - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_ELECT, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD934X_ANA_MICB2, 0xC0, 0xC0); - } else { - snd_soc_write(codec, WCD934X_ANA_MICB2, value); - snd_soc_update_bits(codec, WCD934X_ANA_MBHC_ELECT, - 0x80, 0x80); - } - - return oldv; -} -EXPORT_SYMBOL(tavil_mb_pull_down); - - -/* - * tavil_mbhc_hs_detect: starts mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - * @mbhc_cfg: handle to mbhc configuration structure - * return 0 if mbhc_start is success or error code in case of failure - */ -int tavil_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - struct wcd934x_mbhc *wcd934x_mbhc = tavil_soc_get_mbhc(codec); - - if (!wcd934x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_start(&wcd934x_mbhc->wcd_mbhc, mbhc_cfg); -} -EXPORT_SYMBOL(tavil_mbhc_hs_detect); - -/* - * tavil_mbhc_hs_detect_exit: stop mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - */ -void tavil_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ - struct wcd934x_mbhc *wcd934x_mbhc = tavil_soc_get_mbhc(codec); - - if (!wcd934x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return; - } - wcd_mbhc_stop(&wcd934x_mbhc->wcd_mbhc); -} -EXPORT_SYMBOL(tavil_mbhc_hs_detect_exit); - -/* - * tavil_mbhc_post_ssr_init: initialize mbhc for tavil post subsystem restart - * @mbhc: poniter to wcd934x_mbhc structure - * @codec: handle to snd_soc_codec * - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int tavil_mbhc_post_ssr_init(struct wcd934x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - int ret; - struct wcd_mbhc *wcd_mbhc; - - if (!mbhc || !codec) - return -EINVAL; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - return -EINVAL; - } - - tavil_mbhc_hs_detect_exit(codec); - wcd_mbhc_deinit(wcd_mbhc); - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, TAVIL_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto done; - } - if (wcd_mbhc->mbhc_detection_logic == WCD_DETECTION_LEGACY) { - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_1, 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_MBHC_CTL_BCS, 0x01, 0x01); - } - -done: - return ret; -} -EXPORT_SYMBOL(tavil_mbhc_post_ssr_init); - -/* - * tavil_mbhc_init: initialize mbhc for tavil - * @mbhc: poniter to wcd934x_mbhc struct pointer to store the configs - * @codec: handle to snd_soc_codec * - * @fw_data: handle to firmware data - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int tavil_mbhc_init(struct wcd934x_mbhc **mbhc, struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - struct regulator *supply; - struct wcd934x_mbhc *wcd934x_mbhc; - struct wcd_mbhc *wcd_mbhc; - int ret; - struct wcd9xxx_pdata *pdata; - - wcd934x_mbhc = devm_kzalloc(codec->dev, sizeof(struct wcd934x_mbhc), - GFP_KERNEL); - if (!wcd934x_mbhc) - return -ENOMEM; - - wcd934x_mbhc->wcd9xxx = dev_get_drvdata(codec->dev->parent); - wcd934x_mbhc->fw_data = fw_data; - BLOCKING_INIT_NOTIFIER_HEAD(&wcd934x_mbhc->notifier); - wcd_mbhc = &wcd934x_mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - - /* Setting default mbhc detection logic to ADC for Tavil */ - wcd_mbhc->mbhc_detection_logic = WCD_DETECTION_ADC; - - pdata = dev_get_platdata(codec->dev->parent); - if (!pdata) { - dev_err(codec->dev, "%s: pdata pointer is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - wcd_mbhc->micb_mv = pdata->micbias.micb2_mv; - - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, - &intr_ids, wcd_mbhc_registers, - TAVIL_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto err; - } - - supply = tavil_codec_find_ondemand_regulator(codec, - on_demand_supply_name[WCD934X_ON_DEMAND_MICBIAS]); - if (supply) { - wcd934x_mbhc->on_demand_list[ - WCD934X_ON_DEMAND_MICBIAS].supply = - supply; - wcd934x_mbhc->on_demand_list[ - WCD934X_ON_DEMAND_MICBIAS].ondemand_supply_count = - 0; - } - - (*mbhc) = wcd934x_mbhc; - snd_soc_add_codec_controls(codec, impedance_detect_controls, - ARRAY_SIZE(impedance_detect_controls)); - snd_soc_add_codec_controls(codec, hph_type_detect_controls, - ARRAY_SIZE(hph_type_detect_controls)); - - if (wcd_mbhc->mbhc_detection_logic == WCD_DETECTION_LEGACY) { - snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_1, 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_MBHC_CTL_BCS, 0x01, 0x01); - } - - return 0; -err: - devm_kfree(codec->dev, wcd934x_mbhc); - return ret; -} -EXPORT_SYMBOL(tavil_mbhc_init); - -/* - * tavil_mbhc_deinit: deinitialize mbhc for tavil - * @codec: handle to snd_soc_codec * - */ -void tavil_mbhc_deinit(struct snd_soc_codec *codec) -{ - struct wcd934x_mbhc *wcd934x_mbhc = tavil_soc_get_mbhc(codec); - - if (wcd934x_mbhc) { - wcd_mbhc_deinit(&wcd934x_mbhc->wcd_mbhc); - devm_kfree(codec->dev, wcd934x_mbhc); - } -} -EXPORT_SYMBOL(tavil_mbhc_deinit); diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.h b/techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.h deleted file mode 100644 index f1330863a2e3..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-mbhc.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD934X_MBHC_H__ -#define __WCD934X_MBHC_H__ -#include "../wcd-mbhc-v2.h" - -enum wcd934x_on_demand_supply_name { - WCD934X_ON_DEMAND_MICBIAS = 0, - WCD934X_ON_DEMAND_SUPPLIES_MAX, -}; - -struct wcd934x_on_demand_supply { - struct regulator *supply; - int ondemand_supply_count; -}; - -struct wcd934x_mbhc { - struct wcd_mbhc wcd_mbhc; - struct blocking_notifier_head notifier; - struct wcd934x_on_demand_supply on_demand_list[ - WCD934X_ON_DEMAND_SUPPLIES_MAX]; - struct wcd9xxx *wcd9xxx; - struct fw_info *fw_data; - bool mbhc_started; - bool is_hph_recover; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD934X_MBHC) -extern int tavil_mbhc_init(struct wcd934x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data); -extern void tavil_mbhc_hs_detect_exit(struct snd_soc_codec *codec); -extern int tavil_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg); -extern void tavil_mbhc_deinit(struct snd_soc_codec *codec); -extern int tavil_mbhc_post_ssr_init(struct wcd934x_mbhc *mbhc, - struct snd_soc_codec *codec); -extern int tavil_mbhc_get_impedance(struct wcd934x_mbhc *wcd934x_mbhc, - uint32_t *zl, uint32_t *zr); - -extern int tavil_mb_pull_down(struct snd_soc_codec *codec, bool active, - int value); - -#else -static inline int tavil_mbhc_init(struct wcd934x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - return 0; -} -static inline void tavil_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ -} -static inline int tavil_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline void tavil_mbhc_deinit(struct snd_soc_codec *codec) -{ -} -static inline int tavil_mbhc_post_ssr_init(struct wcd934x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - return 0; -} -static inline int tavil_mbhc_get_impedance(struct wcd934x_mbhc *wcd934x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (zl) - *zl = 0; - if (zr) - *zr = 0; - return -EINVAL; -} - - -static inline int tavil_mb_pull_down(struct snd_soc_codec *codec, bool active, - int value) -{ - return 0; -} - -#endif - -#endif /* __WCD934X_MBHC_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-regmap.c b/techpack/audio/asoc/codecs/wcd934x/wcd934x-regmap.c deleted file mode 100644 index 02cc05ca197f..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-regmap.c +++ /dev/null @@ -1,1956 +0,0 @@ -/* - * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include "../core.h" -#include "../wcd9xxx-regmap.h" - - -static const struct reg_sequence wcd934x_1_1_defaults[] = { - { WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0, 0x01 }, - { WCD934X_BIAS_VBG_FINE_ADJ, 0x75 }, - { WCD934X_HPH_REFBUFF_LP_CTL, 0x0E }, - { WCD934X_EAR_DAC_CTL_ATEST, 0x08 }, - { WCD934X_SIDO_NEW_VOUT_A_STARTUP, 0x17 }, - { WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40 }, - { WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81 }, - { WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81 }, -}; - -static const struct reg_default wcd934x_defaults[] = { - { WCD934X_PAGE0_PAGE_REGISTER, 0x00 }, - { WCD934X_CODEC_RPM_CLK_BYPASS, 0x00 }, - { WCD934X_CODEC_RPM_CLK_GATE, 0x1f }, - { WCD934X_CODEC_RPM_CLK_MCLK_CFG, 0x00 }, - { WCD934X_CODEC_RPM_CLK_MCLK2_CFG, 0x02 }, - { WCD934X_CODEC_RPM_I2S_DSD_CLK_SEL, 0x00 }, - { WCD934X_CODEC_RPM_RST_CTL, 0x00 }, - { WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x04 }, - { WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE1, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE2, 0x08 }, - { WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE3, 0x01 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_CTL, 0x10 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_TEST0, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_TEST1, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT1, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT2, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT3, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT4, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT5, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT6, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT7, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT8, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT9, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT10, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT11, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT12, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT13, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT15, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_EFUSE_STATUS, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO, 0x0d }, - { WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_1, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_2, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_3, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL, 0xcc }, - { WCD934X_CHIP_TIER_CTRL_SLNQ_WAIT_STATE_CTL, 0xcc }, - { WCD934X_CHIP_TIER_CTRL_I2C_ACTIVE, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_ALT_FUNC_EN, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_GPIO_CTL_OE, 0x00 }, - { WCD934X_CHIP_TIER_CTRL_GPIO_CTL_DATA, 0x00 }, - { WCD934X_DATA_HUB_RX0_CFG, 0x00 }, - { WCD934X_DATA_HUB_RX1_CFG, 0x00 }, - { WCD934X_DATA_HUB_RX2_CFG, 0x00 }, - { WCD934X_DATA_HUB_RX3_CFG, 0x00 }, - { WCD934X_DATA_HUB_RX4_CFG, 0x00 }, - { WCD934X_DATA_HUB_RX5_CFG, 0x00 }, - { WCD934X_DATA_HUB_RX6_CFG, 0x00 }, - { WCD934X_DATA_HUB_RX7_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX0_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX1_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX2_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX3_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX4_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX5_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX6_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX7_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX8_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX9_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX10_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX11_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX13_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX14_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_SB_TX15_INP_CFG, 0x00 }, - { WCD934X_DATA_HUB_I2S_TX0_CFG, 0x00 }, - { WCD934X_DATA_HUB_I2S_TX1_0_CFG, 0x00 }, - { WCD934X_DATA_HUB_I2S_TX1_1_CFG, 0x00 }, - { WCD934X_DATA_HUB_I2S_0_CTL, 0x0c }, - { WCD934X_DATA_HUB_I2S_1_CTL, 0x0c }, - { WCD934X_DATA_HUB_I2S_2_CTL, 0x0c }, - { WCD934X_DATA_HUB_I2S_3_CTL, 0x0c }, - { WCD934X_DATA_HUB_I2S_CLKSRC_CTL, 0x00 }, - { WCD934X_DATA_HUB_I2S_COMMON_CTL, 0x00 }, - { WCD934X_DATA_HUB_I2S_0_TDM_CTL, 0x00 }, - { WCD934X_DATA_HUB_I2S_STATUS, 0x00 }, - { WCD934X_DMA_RDMA_CTL_0, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_RDMA_0, 0xff }, - { WCD934X_DMA_CH_0_1_CFG_RDMA_0, 0xff }, - { WCD934X_DMA_RDMA_CTL_1, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_RDMA_1, 0xff }, - { WCD934X_DMA_CH_0_1_CFG_RDMA_1, 0xff }, - { WCD934X_DMA_RDMA_CTL_2, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_RDMA_2, 0xff }, - { WCD934X_DMA_CH_0_1_CFG_RDMA_2, 0xff }, - { WCD934X_DMA_RDMA_CTL_3, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_RDMA_3, 0xff }, - { WCD934X_DMA_CH_0_1_CFG_RDMA_3, 0xff }, - { WCD934X_DMA_RDMA_CTL_4, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_RDMA_4, 0xff }, - { WCD934X_DMA_CH_0_1_CFG_RDMA_4, 0xff }, - { WCD934X_DMA_RDMA4_PRT_CFG, 0x00 }, - { WCD934X_DMA_RDMA_SBTX0_7_CFG, 0x00 }, - { WCD934X_DMA_RDMA_SBTX8_11_CFG, 0x00 }, - { WCD934X_DMA_WDMA_CTL_0, 0x00 }, - { WCD934X_DMA_CH_4_5_CFG_WDMA_0, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_WDMA_0, 0x00 }, - { WCD934X_DMA_CH_0_1_CFG_WDMA_0, 0x00 }, - { WCD934X_DMA_WDMA_CTL_1, 0x00 }, - { WCD934X_DMA_CH_4_5_CFG_WDMA_1, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_WDMA_1, 0x00 }, - { WCD934X_DMA_CH_0_1_CFG_WDMA_1, 0x00 }, - { WCD934X_DMA_WDMA_CTL_2, 0x00 }, - { WCD934X_DMA_CH_4_5_CFG_WDMA_2, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_WDMA_2, 0x00 }, - { WCD934X_DMA_CH_0_1_CFG_WDMA_2, 0x00 }, - { WCD934X_DMA_WDMA_CTL_3, 0x00 }, - { WCD934X_DMA_CH_4_5_CFG_WDMA_3, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_WDMA_3, 0x00 }, - { WCD934X_DMA_CH_0_1_CFG_WDMA_3, 0x00 }, - { WCD934X_DMA_WDMA_CTL_4, 0x00 }, - { WCD934X_DMA_CH_4_5_CFG_WDMA_4, 0x00 }, - { WCD934X_DMA_CH_2_3_CFG_WDMA_4, 0x00 }, - { WCD934X_DMA_CH_0_1_CFG_WDMA_4, 0x00 }, - { WCD934X_DMA_WDMA0_PRT_CFG, 0x00 }, - { WCD934X_DMA_WDMA3_PRT_CFG, 0x00 }, - { WCD934X_DMA_WDMA4_PRT0_3_CFG, 0x00 }, - { WCD934X_DMA_WDMA4_PRT4_7_CFG, 0x00 }, - { WCD934X_PAGE1_PAGE_REGISTER, 0x00 }, - { WCD934X_CPE_FLL_USER_CTL_0, 0x71 }, - { WCD934X_CPE_FLL_USER_CTL_1, 0x34 }, - { WCD934X_CPE_FLL_USER_CTL_2, 0x0b }, - { WCD934X_CPE_FLL_USER_CTL_3, 0x02 }, - { WCD934X_CPE_FLL_USER_CTL_4, 0x04 }, - { WCD934X_CPE_FLL_USER_CTL_5, 0x02 }, - { WCD934X_CPE_FLL_USER_CTL_6, 0x6e }, - { WCD934X_CPE_FLL_USER_CTL_7, 0x00 }, - { WCD934X_CPE_FLL_USER_CTL_8, 0x94 }, - { WCD934X_CPE_FLL_USER_CTL_9, 0x50 }, - { WCD934X_CPE_FLL_L_VAL_CTL_0, 0x53 }, - { WCD934X_CPE_FLL_L_VAL_CTL_1, 0x00 }, - { WCD934X_CPE_FLL_DSM_FRAC_CTL_0, 0x00 }, - { WCD934X_CPE_FLL_DSM_FRAC_CTL_1, 0xff }, - { WCD934X_CPE_FLL_CONFIG_CTL_0, 0x6b }, - { WCD934X_CPE_FLL_CONFIG_CTL_1, 0x05 }, - { WCD934X_CPE_FLL_CONFIG_CTL_2, 0x08 }, - { WCD934X_CPE_FLL_CONFIG_CTL_3, 0x00 }, - { WCD934X_CPE_FLL_CONFIG_CTL_4, 0x10 }, - { WCD934X_CPE_FLL_TEST_CTL_0, 0x80 }, - { WCD934X_CPE_FLL_TEST_CTL_1, 0x00 }, - { WCD934X_CPE_FLL_TEST_CTL_2, 0x00 }, - { WCD934X_CPE_FLL_TEST_CTL_3, 0x00 }, - { WCD934X_CPE_FLL_TEST_CTL_4, 0x00 }, - { WCD934X_CPE_FLL_TEST_CTL_5, 0x00 }, - { WCD934X_CPE_FLL_TEST_CTL_6, 0x00 }, - { WCD934X_CPE_FLL_TEST_CTL_7, 0x33 }, - { WCD934X_CPE_FLL_FREQ_CTL_0, 0x00 }, - { WCD934X_CPE_FLL_FREQ_CTL_1, 0x00 }, - { WCD934X_CPE_FLL_FREQ_CTL_2, 0x00 }, - { WCD934X_CPE_FLL_FREQ_CTL_3, 0x00 }, - { WCD934X_CPE_FLL_SSC_CTL_0, 0x00 }, - { WCD934X_CPE_FLL_SSC_CTL_1, 0x00 }, - { WCD934X_CPE_FLL_SSC_CTL_2, 0x00 }, - { WCD934X_CPE_FLL_SSC_CTL_3, 0x00 }, - { WCD934X_CPE_FLL_FLL_MODE, 0x20 }, - { WCD934X_CPE_FLL_STATUS_0, 0x00 }, - { WCD934X_CPE_FLL_STATUS_1, 0x00 }, - { WCD934X_CPE_FLL_STATUS_2, 0x00 }, - { WCD934X_CPE_FLL_STATUS_3, 0x00 }, - { WCD934X_I2S_FLL_USER_CTL_0, 0x41 }, - { WCD934X_I2S_FLL_USER_CTL_1, 0x94 }, - { WCD934X_I2S_FLL_USER_CTL_2, 0x08 }, - { WCD934X_I2S_FLL_USER_CTL_3, 0x02 }, - { WCD934X_I2S_FLL_USER_CTL_4, 0x04 }, - { WCD934X_I2S_FLL_USER_CTL_5, 0x02 }, - { WCD934X_I2S_FLL_USER_CTL_6, 0x40 }, - { WCD934X_I2S_FLL_USER_CTL_7, 0x00 }, - { WCD934X_I2S_FLL_USER_CTL_8, 0x5f }, - { WCD934X_I2S_FLL_USER_CTL_9, 0x02 }, - { WCD934X_I2S_FLL_L_VAL_CTL_0, 0x40 }, - { WCD934X_I2S_FLL_L_VAL_CTL_1, 0x00 }, - { WCD934X_I2S_FLL_DSM_FRAC_CTL_0, 0x00 }, - { WCD934X_I2S_FLL_DSM_FRAC_CTL_1, 0xff }, - { WCD934X_I2S_FLL_CONFIG_CTL_0, 0x6b }, - { WCD934X_I2S_FLL_CONFIG_CTL_1, 0x05 }, - { WCD934X_I2S_FLL_CONFIG_CTL_2, 0x08 }, - { WCD934X_I2S_FLL_CONFIG_CTL_3, 0x00 }, - { WCD934X_I2S_FLL_CONFIG_CTL_4, 0x30 }, - { WCD934X_I2S_FLL_TEST_CTL_0, 0x80 }, - { WCD934X_I2S_FLL_TEST_CTL_1, 0x00 }, - { WCD934X_I2S_FLL_TEST_CTL_2, 0x00 }, - { WCD934X_I2S_FLL_TEST_CTL_3, 0x00 }, - { WCD934X_I2S_FLL_TEST_CTL_4, 0x00 }, - { WCD934X_I2S_FLL_TEST_CTL_5, 0x00 }, - { WCD934X_I2S_FLL_TEST_CTL_6, 0x00 }, - { WCD934X_I2S_FLL_TEST_CTL_7, 0xff }, - { WCD934X_I2S_FLL_FREQ_CTL_0, 0x00 }, - { WCD934X_I2S_FLL_FREQ_CTL_1, 0x00 }, - { WCD934X_I2S_FLL_FREQ_CTL_2, 0x00 }, - { WCD934X_I2S_FLL_FREQ_CTL_3, 0x00 }, - { WCD934X_I2S_FLL_SSC_CTL_0, 0x00 }, - { WCD934X_I2S_FLL_SSC_CTL_1, 0x00 }, - { WCD934X_I2S_FLL_SSC_CTL_2, 0x00 }, - { WCD934X_I2S_FLL_SSC_CTL_3, 0x00 }, - { WCD934X_I2S_FLL_FLL_MODE, 0x00 }, - { WCD934X_I2S_FLL_STATUS_0, 0x00 }, - { WCD934X_I2S_FLL_STATUS_1, 0x00 }, - { WCD934X_I2S_FLL_STATUS_2, 0x00 }, - { WCD934X_I2S_FLL_STATUS_3, 0x00 }, - { WCD934X_SB_FLL_USER_CTL_0, 0x41 }, - { WCD934X_SB_FLL_USER_CTL_1, 0x94 }, - { WCD934X_SB_FLL_USER_CTL_2, 0x08 }, - { WCD934X_SB_FLL_USER_CTL_3, 0x02 }, - { WCD934X_SB_FLL_USER_CTL_4, 0x04 }, - { WCD934X_SB_FLL_USER_CTL_5, 0x02 }, - { WCD934X_SB_FLL_USER_CTL_6, 0x40 }, - { WCD934X_SB_FLL_USER_CTL_7, 0x00 }, - { WCD934X_SB_FLL_USER_CTL_8, 0x5e }, - { WCD934X_SB_FLL_USER_CTL_9, 0x01 }, - { WCD934X_SB_FLL_L_VAL_CTL_0, 0x40 }, - { WCD934X_SB_FLL_L_VAL_CTL_1, 0x00 }, - { WCD934X_SB_FLL_DSM_FRAC_CTL_0, 0x00 }, - { WCD934X_SB_FLL_DSM_FRAC_CTL_1, 0xff }, - { WCD934X_SB_FLL_CONFIG_CTL_0, 0x6b }, - { WCD934X_SB_FLL_CONFIG_CTL_1, 0x05 }, - { WCD934X_SB_FLL_CONFIG_CTL_2, 0x08 }, - { WCD934X_SB_FLL_CONFIG_CTL_3, 0x00 }, - { WCD934X_SB_FLL_CONFIG_CTL_4, 0x10 }, - { WCD934X_SB_FLL_TEST_CTL_0, 0x00 }, - { WCD934X_SB_FLL_TEST_CTL_1, 0x00 }, - { WCD934X_SB_FLL_TEST_CTL_2, 0x00 }, - { WCD934X_SB_FLL_TEST_CTL_3, 0x00 }, - { WCD934X_SB_FLL_TEST_CTL_4, 0x00 }, - { WCD934X_SB_FLL_TEST_CTL_5, 0x00 }, - { WCD934X_SB_FLL_TEST_CTL_6, 0x00 }, - { WCD934X_SB_FLL_TEST_CTL_7, 0xff }, - { WCD934X_SB_FLL_FREQ_CTL_0, 0x00 }, - { WCD934X_SB_FLL_FREQ_CTL_1, 0x00 }, - { WCD934X_SB_FLL_FREQ_CTL_2, 0x00 }, - { WCD934X_SB_FLL_FREQ_CTL_3, 0x00 }, - { WCD934X_SB_FLL_SSC_CTL_0, 0x00 }, - { WCD934X_SB_FLL_SSC_CTL_1, 0x00 }, - { WCD934X_SB_FLL_SSC_CTL_2, 0x00 }, - { WCD934X_SB_FLL_SSC_CTL_3, 0x00 }, - { WCD934X_SB_FLL_FLL_MODE, 0x00 }, - { WCD934X_SB_FLL_STATUS_0, 0x00 }, - { WCD934X_SB_FLL_STATUS_1, 0x00 }, - { WCD934X_SB_FLL_STATUS_2, 0x00 }, - { WCD934X_SB_FLL_STATUS_3, 0x00 }, - { WCD934X_PAGE2_PAGE_REGISTER, 0x00 }, - { WCD934X_CPE_SS_CPE_CTL, 0x05 }, - { WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0, 0x01 }, - { WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_1, 0x00 }, - { WCD934X_CPE_SS_PWR_CPEFLL_CTL, 0x02 }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0, 0xff }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1, 0x0f }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_OVERRIDE, 0x00 }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0, 0xff }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1, 0xff }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2, 0xff }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3, 0xff }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4, 0xff }, - { WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_5, 0xff }, - { WCD934X_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN, 0x07 }, - { WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL, 0x00 }, - { WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL, 0x20 }, - { WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL1, 0x00 }, - { WCD934X_CPE_SS_US_BUF_INT_PERIOD, 0x60 }, - { WCD934X_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 0x13 }, - { WCD934X_CPE_SS_SVA_CFG, 0x41 }, - { WCD934X_CPE_SS_US_CFG, 0x00 }, - { WCD934X_CPE_SS_MAD_CTL, 0x00 }, - { WCD934X_CPE_SS_CPAR_CTL, 0x00 }, - { WCD934X_CPE_SS_DMIC0_CTL, 0x00 }, - { WCD934X_CPE_SS_DMIC1_CTL, 0x00 }, - { WCD934X_CPE_SS_DMIC2_CTL, 0x00 }, - { WCD934X_CPE_SS_DMIC_CFG, 0x80 }, - { WCD934X_CPE_SS_CPAR_CFG, 0x00 }, - { WCD934X_CPE_SS_WDOG_CFG, 0x01 }, - { WCD934X_CPE_SS_BACKUP_INT, 0x00 }, - { WCD934X_CPE_SS_STATUS, 0x00 }, - { WCD934X_CPE_SS_CPE_OCD_CFG, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A, 0xff }, - { WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B, 0x3f }, - { WCD934X_CPE_SS_SS_ERROR_INT_MASK_1A, 0xff }, - { WCD934X_CPE_SS_SS_ERROR_INT_MASK_1B, 0x3f }, - { WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0A, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0B, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1A, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0A, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0B, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1A, 0x00 }, - { WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1B, 0x00 }, - { WCD934X_SOC_MAD_MAIN_CTL_1, 0x00 }, - { WCD934X_SOC_MAD_MAIN_CTL_2, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_1, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_2, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_3, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_4, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_5, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_6, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_7, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_CTL_8, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_IIR_CTL_PTR, 0x00 }, - { WCD934X_SOC_MAD_AUDIO_IIR_CTL_VAL, 0x40 }, - { WCD934X_SOC_MAD_ULTR_CTL_1, 0x00 }, - { WCD934X_SOC_MAD_ULTR_CTL_2, 0x00 }, - { WCD934X_SOC_MAD_ULTR_CTL_3, 0x00 }, - { WCD934X_SOC_MAD_ULTR_CTL_4, 0x00 }, - { WCD934X_SOC_MAD_ULTR_CTL_5, 0x00 }, - { WCD934X_SOC_MAD_ULTR_CTL_6, 0x00 }, - { WCD934X_SOC_MAD_ULTR_CTL_7, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_1, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_2, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_3, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_4, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_5, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_6, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_7, 0x00 }, - { WCD934X_SOC_MAD_BEACON_CTL_8, 0x00 }, - { WCD934X_SOC_MAD_BEACON_IIR_CTL_PTR, 0x00 }, - { WCD934X_SOC_MAD_BEACON_IIR_CTL_VAL, 0x00 }, - { WCD934X_SOC_MAD_INP_SEL, 0x00 }, - { WCD934X_PAGE4_PAGE_REGISTER, 0x00 }, - { WCD934X_INTR_CFG, 0x00 }, - { WCD934X_INTR_CLR_COMMIT, 0x00 }, - { WCD934X_INTR_PIN1_MASK0, 0xff }, - { WCD934X_INTR_PIN1_MASK1, 0xff }, - { WCD934X_INTR_PIN1_MASK2, 0xff }, - { WCD934X_INTR_PIN1_MASK3, 0xff }, - { WCD934X_INTR_PIN1_STATUS0, 0x00 }, - { WCD934X_INTR_PIN1_STATUS1, 0x00 }, - { WCD934X_INTR_PIN1_STATUS2, 0x00 }, - { WCD934X_INTR_PIN1_STATUS3, 0x00 }, - { WCD934X_INTR_PIN1_CLEAR0, 0x00 }, - { WCD934X_INTR_PIN1_CLEAR1, 0x00 }, - { WCD934X_INTR_PIN1_CLEAR2, 0x00 }, - { WCD934X_INTR_PIN1_CLEAR3, 0x00 }, - { WCD934X_INTR_PIN2_MASK3, 0xff }, - { WCD934X_INTR_PIN2_STATUS3, 0x00 }, - { WCD934X_INTR_PIN2_CLEAR3, 0x00 }, - { WCD934X_INTR_CPESS_SUMRY_MASK2, 0xff }, - { WCD934X_INTR_CPESS_SUMRY_MASK3, 0xff }, - { WCD934X_INTR_CPESS_SUMRY_STATUS2, 0x00 }, - { WCD934X_INTR_CPESS_SUMRY_STATUS3, 0x00 }, - { WCD934X_INTR_CPESS_SUMRY_CLEAR2, 0x00 }, - { WCD934X_INTR_CPESS_SUMRY_CLEAR3, 0x00 }, - { WCD934X_INTR_LEVEL0, 0x03 }, - { WCD934X_INTR_LEVEL1, 0xe0 }, - { WCD934X_INTR_LEVEL2, 0x94 }, - { WCD934X_INTR_LEVEL3, 0x80 }, - { WCD934X_INTR_BYPASS0, 0x00 }, - { WCD934X_INTR_BYPASS1, 0x00 }, - { WCD934X_INTR_BYPASS2, 0x00 }, - { WCD934X_INTR_BYPASS3, 0x00 }, - { WCD934X_INTR_SET0, 0x00 }, - { WCD934X_INTR_SET1, 0x00 }, - { WCD934X_INTR_SET2, 0x00 }, - { WCD934X_INTR_SET3, 0x00 }, - { WCD934X_INTR_CODEC_MISC_MASK, 0x7f }, - { WCD934X_INTR_CODEC_MISC_STATUS, 0x00 }, - { WCD934X_INTR_CODEC_MISC_CLEAR, 0x00 }, - { WCD934X_PAGE5_PAGE_REGISTER, 0x00 }, - { WCD934X_SLNQ_DIG_DEVICE, 0x49 }, - { WCD934X_SLNQ_DIG_REVISION, 0x01 }, - { WCD934X_SLNQ_DIG_H_COMMAND, 0x00 }, - { WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_MSB, 0x00 }, - { WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_MASTER_ADDRESS_MSB, 0x00 }, - { WCD934X_SLNQ_DIG_MASTER_ADDRESS_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_SLAVE_ADDRESS_MSB, 0x00 }, - { WCD934X_SLNQ_DIG_SLAVE_ADDRESS_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_MSB, 0x40 }, - { WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_MSB, 0x40 }, - { WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_MSB, 0x40 }, - { WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_COMM_CTL, 0x00 }, - { WCD934X_SLNQ_DIG_FRAME_CTRL, 0x01 }, - { WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH1_2, 0x77 }, - { WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH3_4, 0x77 }, - { WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH5, 0x70 }, - { WCD934X_SLNQ_DIG_SW_EVENT_RD, 0x00 }, - { WCD934X_SLNQ_DIG_SW_EVENT_CTRL, 0x00 }, - { WCD934X_SLNQ_DIG_PDM_SELECT_1, 0x12 }, - { WCD934X_SLNQ_DIG_PDM_SELECT_2, 0x34 }, - { WCD934X_SLNQ_DIG_PDM_SELECT_3, 0x55 }, - { WCD934X_SLNQ_DIG_PDM_SAMPLING_FREQ, 0x01 }, - { WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_CTL, 0x00 }, - { WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_SEL, 0x11 }, - { WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_MSB, 0x00 }, - { WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_MSB, 0x00 }, - { WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_LSB, 0x00 }, - { WCD934X_SLNQ_DIG_RAM_CNTRL, 0x01 }, - { WCD934X_SLNQ_DIG_SRAM_BANK, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_0, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_1, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_2, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_3, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_4, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_5, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_6, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_7, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_8, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_9, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_A, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_B, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_C, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_D, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_E, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_F, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_10, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_11, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_12, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_13, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_14, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_15, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_16, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_17, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_18, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_19, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_1A, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_1B, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_1C, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_1D, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_1E, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_1F, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_20, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_21, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_22, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_23, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_24, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_25, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_26, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_27, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_28, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_29, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_2A, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_2B, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_2C, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_2D, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_2E, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_2F, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_30, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_31, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_32, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_33, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_34, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_35, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_36, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_37, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_38, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_39, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_3A, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_3B, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_3C, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_3D, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_3E, 0x00 }, - { WCD934X_SLNQ_DIG_SRAM_BYTE_3F, 0x00 }, - { WCD934X_SLNQ_DIG_TOP_CTRL1, 0x00 }, - { WCD934X_SLNQ_DIG_TOP_CTRL2, 0x00 }, - { WCD934X_SLNQ_DIG_PDM_CTRL, 0x00 }, - { WCD934X_SLNQ_DIG_PDM_MUTE_CTRL, 0x20 }, - { WCD934X_SLNQ_DIG_DEC_BYPASS_CTRL, 0x00 }, - { WCD934X_SLNQ_DIG_DEC_BYPASS_STATUS, 0x00 }, - { WCD934X_SLNQ_DIG_DEC_BYPASS_FS, 0x00 }, - { WCD934X_SLNQ_DIG_DEC_BYPASS_IN_SEL, 0x00 }, - { WCD934X_SLNQ_DIG_GPOUT_ENABLE, 0x00 }, - { WCD934X_SLNQ_DIG_GPOUT_VAL, 0x00 }, - { WCD934X_SLNQ_DIG_ANA_INTERRUPT_MASK, 0x00 }, - { WCD934X_SLNQ_DIG_ANA_INTERRUPT_STATUS, 0x00 }, - { WCD934X_SLNQ_DIG_ANA_INTERRUPT_CLR, 0x00 }, - { WCD934X_SLNQ_DIG_IP_TESTING, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_CNTRL, 0x0f }, - { WCD934X_SLNQ_DIG_INTERRUPT_CNT, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_CNT_MSB, 0xff }, - { WCD934X_SLNQ_DIG_INTERRUPT_CNT_LSB, 0xff }, - { WCD934X_SLNQ_DIG_INTERRUPT_MASK0, 0xff }, - { WCD934X_SLNQ_DIG_INTERRUPT_MASK1, 0xff }, - { WCD934X_SLNQ_DIG_INTERRUPT_MASK2, 0xff }, - { WCD934X_SLNQ_DIG_INTERRUPT_MASK3, 0xff }, - { WCD934X_SLNQ_DIG_INTERRUPT_MASK4, 0x1f }, - { WCD934X_SLNQ_DIG_INTERRUPT_STATUS0, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_STATUS1, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_STATUS2, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_STATUS3, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_STATUS4, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_CLR0, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_CLR1, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_CLR2, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_CLR3, 0x00 }, - { WCD934X_SLNQ_DIG_INTERRUPT_CLR4, 0x00 }, - { WCD934X_ANA_PAGE_REGISTER, 0x00 }, - { WCD934X_ANA_BIAS, 0x00 }, - { WCD934X_ANA_RCO, 0x00 }, - { WCD934X_ANA_PAGE6_SPARE2, 0x00 }, - { WCD934X_ANA_PAGE6_SPARE3, 0x00 }, - { WCD934X_ANA_BUCK_CTL, 0x00 }, - { WCD934X_ANA_BUCK_STATUS, 0x00 }, - { WCD934X_ANA_RX_SUPPLIES, 0x00 }, - { WCD934X_ANA_HPH, 0x0c }, - { WCD934X_ANA_EAR, 0x00 }, - { WCD934X_ANA_LO_1_2, 0x3c }, - { WCD934X_ANA_MAD_SETUP, 0x01 }, - { WCD934X_ANA_AMIC1, 0x20 }, - { WCD934X_ANA_AMIC2, 0x00 }, - { WCD934X_ANA_AMIC3, 0x20 }, - { WCD934X_ANA_AMIC4, 0x00 }, - { WCD934X_ANA_MBHC_MECH, 0x39 }, - { WCD934X_ANA_MBHC_ELECT, 0x08 }, - { WCD934X_ANA_MBHC_ZDET, 0x00 }, - { WCD934X_ANA_MBHC_RESULT_1, 0x00 }, - { WCD934X_ANA_MBHC_RESULT_2, 0x00 }, - { WCD934X_ANA_MBHC_RESULT_3, 0x00 }, - { WCD934X_ANA_MBHC_BTN0, 0x00 }, - { WCD934X_ANA_MBHC_BTN1, 0x10 }, - { WCD934X_ANA_MBHC_BTN2, 0x20 }, - { WCD934X_ANA_MBHC_BTN3, 0x30 }, - { WCD934X_ANA_MBHC_BTN4, 0x40 }, - { WCD934X_ANA_MBHC_BTN5, 0x50 }, - { WCD934X_ANA_MBHC_BTN6, 0x60 }, - { WCD934X_ANA_MBHC_BTN7, 0x70 }, - { WCD934X_ANA_MICB1, 0x10 }, - { WCD934X_ANA_MICB2, 0x10 }, - { WCD934X_ANA_MICB2_RAMP, 0x00 }, - { WCD934X_ANA_MICB3, 0x10 }, - { WCD934X_ANA_MICB4, 0x10 }, - { WCD934X_ANA_VBADC, 0x00 }, - { WCD934X_BIAS_CTL, 0x28 }, - { WCD934X_BIAS_VBG_FINE_ADJ, 0x65 }, - { WCD934X_RCO_CTRL_1, 0x44 }, - { WCD934X_RCO_CTRL_2, 0x48 }, - { WCD934X_RCO_CAL, 0x00 }, - { WCD934X_RCO_CAL_1, 0x00 }, - { WCD934X_RCO_CAL_2, 0x00 }, - { WCD934X_RCO_TEST_CTRL, 0x00 }, - { WCD934X_RCO_CAL_OUT_1, 0x00 }, - { WCD934X_RCO_CAL_OUT_2, 0x00 }, - { WCD934X_RCO_CAL_OUT_3, 0x00 }, - { WCD934X_RCO_CAL_OUT_4, 0x00 }, - { WCD934X_RCO_CAL_OUT_5, 0x00 }, - { WCD934X_SIDO_MODE_1, 0x84 }, - { WCD934X_SIDO_MODE_2, 0xfe }, - { WCD934X_SIDO_MODE_3, 0xf6 }, - { WCD934X_SIDO_MODE_4, 0x56 }, - { WCD934X_SIDO_VCL_1, 0x00 }, - { WCD934X_SIDO_VCL_2, 0x6c }, - { WCD934X_SIDO_VCL_3, 0x44 }, - { WCD934X_SIDO_CCL_1, 0x57 }, - { WCD934X_SIDO_CCL_2, 0x92 }, - { WCD934X_SIDO_CCL_3, 0x35 }, - { WCD934X_SIDO_CCL_4, 0x61 }, - { WCD934X_SIDO_CCL_5, 0x6d }, - { WCD934X_SIDO_CCL_6, 0x60 }, - { WCD934X_SIDO_CCL_7, 0x6f }, - { WCD934X_SIDO_CCL_8, 0x6f }, - { WCD934X_SIDO_CCL_9, 0x6e }, - { WCD934X_SIDO_CCL_10, 0x26 }, - { WCD934X_SIDO_FILTER_1, 0x92 }, - { WCD934X_SIDO_FILTER_2, 0x54 }, - { WCD934X_SIDO_DRIVER_1, 0x77 }, - { WCD934X_SIDO_DRIVER_2, 0x55 }, - { WCD934X_SIDO_DRIVER_3, 0x55 }, - { WCD934X_SIDO_CAL_CODE_EXT_1, 0x9c }, - { WCD934X_SIDO_CAL_CODE_EXT_2, 0x82 }, - { WCD934X_SIDO_CAL_CODE_OUT_1, 0x00 }, - { WCD934X_SIDO_CAL_CODE_OUT_2, 0x00 }, - { WCD934X_SIDO_TEST_1, 0x00 }, - { WCD934X_SIDO_TEST_2, 0x00 }, - { WCD934X_MBHC_CTL_CLK, 0x30 }, - { WCD934X_MBHC_CTL_ANA, 0x00 }, - { WCD934X_MBHC_CTL_SPARE_1, 0x00 }, - { WCD934X_MBHC_CTL_SPARE_2, 0x00 }, - { WCD934X_MBHC_CTL_BCS, 0x00 }, - { WCD934X_MBHC_STATUS_SPARE_1, 0x00 }, - { WCD934X_MBHC_TEST_CTL, 0x00 }, - { WCD934X_VBADC_SUBBLOCK_EN, 0xde }, - { WCD934X_VBADC_IBIAS_FE, 0x58 }, - { WCD934X_VBADC_BIAS_ADC, 0x51 }, - { WCD934X_VBADC_FE_CTRL, 0x1c }, - { WCD934X_VBADC_ADC_REF, 0x20 }, - { WCD934X_VBADC_ADC_IO, 0x80 }, - { WCD934X_VBADC_ADC_SAR, 0xff }, - { WCD934X_VBADC_DEBUG, 0x00 }, - { WCD934X_LDOH_MODE, 0x2b }, - { WCD934X_LDOH_BIAS, 0x68 }, - { WCD934X_LDOH_STB_LOADS, 0x00 }, - { WCD934X_LDOH_SLOWRAMP, 0x50 }, - { WCD934X_MICB1_TEST_CTL_1, 0x1a }, - { WCD934X_MICB1_TEST_CTL_2, 0x18 }, - { WCD934X_MICB1_TEST_CTL_3, 0xa4 }, - { WCD934X_MICB2_TEST_CTL_1, 0x1a }, - { WCD934X_MICB2_TEST_CTL_2, 0x18 }, - { WCD934X_MICB2_TEST_CTL_3, 0xa4 }, - { WCD934X_MICB3_TEST_CTL_1, 0x1a }, - { WCD934X_MICB3_TEST_CTL_2, 0x18 }, - { WCD934X_MICB3_TEST_CTL_3, 0xa4 }, - { WCD934X_MICB4_TEST_CTL_1, 0x1a }, - { WCD934X_MICB4_TEST_CTL_2, 0x18 }, - { WCD934X_MICB4_TEST_CTL_3, 0xa4 }, - { WCD934X_TX_COM_ADC_VCM, 0x39 }, - { WCD934X_TX_COM_BIAS_ATEST, 0xc0 }, - { WCD934X_TX_COM_ADC_INT1_IB, 0x6f }, - { WCD934X_TX_COM_ADC_INT2_IB, 0x4f }, - { WCD934X_TX_COM_TXFE_DIV_CTL, 0x2e }, - { WCD934X_TX_COM_TXFE_DIV_START, 0x00 }, - { WCD934X_TX_COM_TXFE_DIV_STOP_9P6M, 0xc7 }, - { WCD934X_TX_COM_TXFE_DIV_STOP_12P288M, 0xff }, - { WCD934X_TX_1_2_TEST_EN, 0xcc }, - { WCD934X_TX_1_2_ADC_IB, 0x09 }, - { WCD934X_TX_1_2_ATEST_REFCTL, 0x0a }, - { WCD934X_TX_1_2_TEST_CTL, 0x38 }, - { WCD934X_TX_1_2_TEST_BLK_EN, 0xff }, - { WCD934X_TX_1_2_TXFE_CLKDIV, 0x00 }, - { WCD934X_TX_1_2_SAR1_ERR, 0x00 }, - { WCD934X_TX_1_2_SAR2_ERR, 0x00 }, - { WCD934X_TX_3_4_TEST_EN, 0xcc }, - { WCD934X_TX_3_4_ADC_IB, 0x09 }, - { WCD934X_TX_3_4_ATEST_REFCTL, 0x0a }, - { WCD934X_TX_3_4_TEST_CTL, 0x38 }, - { WCD934X_TX_3_4_TEST_BLK_EN, 0xff }, - { WCD934X_TX_3_4_TXFE_CLKDIV, 0x00 }, - { WCD934X_TX_3_4_SAR1_ERR, 0x00 }, - { WCD934X_TX_3_4_SAR2_ERR, 0x00 }, - { WCD934X_CLASSH_MODE_1, 0x40 }, - { WCD934X_CLASSH_MODE_2, 0x3a }, - { WCD934X_CLASSH_MODE_3, 0x00 }, - { WCD934X_CLASSH_CTRL_VCL_1, 0x70 }, - { WCD934X_CLASSH_CTRL_VCL_2, 0x82 }, - { WCD934X_CLASSH_CTRL_CCL_1, 0x31 }, - { WCD934X_CLASSH_CTRL_CCL_2, 0x80 }, - { WCD934X_CLASSH_CTRL_CCL_3, 0x80 }, - { WCD934X_CLASSH_CTRL_CCL_4, 0x51 }, - { WCD934X_CLASSH_CTRL_CCL_5, 0x00 }, - { WCD934X_CLASSH_BUCK_TMUX_A_D, 0x00 }, - { WCD934X_CLASSH_BUCK_SW_DRV_CNTL, 0x77 }, - { WCD934X_CLASSH_SPARE, 0x00 }, - { WCD934X_FLYBACK_EN, 0x4e }, - { WCD934X_FLYBACK_VNEG_CTRL_1, 0x0b }, - { WCD934X_FLYBACK_VNEG_CTRL_2, 0x45 }, - { WCD934X_FLYBACK_VNEG_CTRL_3, 0x74 }, - { WCD934X_FLYBACK_VNEG_CTRL_4, 0x7f }, - { WCD934X_FLYBACK_VNEG_CTRL_5, 0x83 }, - { WCD934X_FLYBACK_VNEG_CTRL_6, 0x98 }, - { WCD934X_FLYBACK_VNEG_CTRL_7, 0xa9 }, - { WCD934X_FLYBACK_VNEG_CTRL_8, 0x68 }, - { WCD934X_FLYBACK_VNEG_CTRL_9, 0x64 }, - { WCD934X_FLYBACK_VNEGDAC_CTRL_1, 0xed }, - { WCD934X_FLYBACK_VNEGDAC_CTRL_2, 0xf0 }, - { WCD934X_FLYBACK_VNEGDAC_CTRL_3, 0xa6 }, - { WCD934X_FLYBACK_CTRL_1, 0x65 }, - { WCD934X_FLYBACK_TEST_CTL, 0x00 }, - { WCD934X_RX_AUX_SW_CTL, 0x00 }, - { WCD934X_RX_PA_AUX_IN_CONN, 0x00 }, - { WCD934X_RX_TIMER_DIV, 0x32 }, - { WCD934X_RX_OCP_CTL, 0x1f }, - { WCD934X_RX_OCP_COUNT, 0x77 }, - { WCD934X_RX_BIAS_EAR_DAC, 0xa0 }, - { WCD934X_RX_BIAS_EAR_AMP, 0xaa }, - { WCD934X_RX_BIAS_HPH_LDO, 0xa9 }, - { WCD934X_RX_BIAS_HPH_PA, 0xaa }, - { WCD934X_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8a }, - { WCD934X_RX_BIAS_HPH_RDAC_LDO, 0x88 }, - { WCD934X_RX_BIAS_HPH_CNP1, 0x82 }, - { WCD934X_RX_BIAS_HPH_LOWPOWER, 0x82 }, - { WCD934X_RX_BIAS_DIFFLO_PA, 0x80 }, - { WCD934X_RX_BIAS_DIFFLO_REF, 0x88 }, - { WCD934X_RX_BIAS_DIFFLO_LDO, 0x88 }, - { WCD934X_RX_BIAS_SELO_DAC_PA, 0xa8 }, - { WCD934X_RX_BIAS_BUCK_RST, 0x08 }, - { WCD934X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44 }, - { WCD934X_RX_BIAS_FLYB_ERRAMP, 0x40 }, - { WCD934X_RX_BIAS_FLYB_BUFF, 0xaa }, - { WCD934X_RX_BIAS_FLYB_MID_RST, 0x14 }, - { WCD934X_HPH_L_STATUS, 0x04 }, - { WCD934X_HPH_R_STATUS, 0x04 }, - { WCD934X_HPH_CNP_EN, 0x80 }, - { WCD934X_HPH_CNP_WG_CTL, 0x9a }, - { WCD934X_HPH_CNP_WG_TIME, 0x14 }, - { WCD934X_HPH_OCP_CTL, 0x28 }, - { WCD934X_HPH_AUTO_CHOP, 0x16 }, - { WCD934X_HPH_CHOP_CTL, 0x83 }, - { WCD934X_HPH_PA_CTL1, 0x46 }, - { WCD934X_HPH_PA_CTL2, 0x50 }, - { WCD934X_HPH_L_EN, 0x80 }, - { WCD934X_HPH_L_TEST, 0xe0 }, - { WCD934X_HPH_L_ATEST, 0x50 }, - { WCD934X_HPH_R_EN, 0x80 }, - { WCD934X_HPH_R_TEST, 0xe0 }, - { WCD934X_HPH_R_ATEST, 0x54 }, - { WCD934X_HPH_RDAC_CLK_CTL1, 0x99 }, - { WCD934X_HPH_RDAC_CLK_CTL2, 0x9b }, - { WCD934X_HPH_RDAC_LDO_CTL, 0x33 }, - { WCD934X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00 }, - { WCD934X_HPH_REFBUFF_UHQA_CTL, 0xa8 }, - { WCD934X_HPH_REFBUFF_LP_CTL, 0x0a }, - { WCD934X_HPH_L_DAC_CTL, 0x00 }, - { WCD934X_HPH_R_DAC_CTL, 0x00 }, - { WCD934X_EAR_EN_REG, 0x60 }, - { WCD934X_EAR_CMBUFF, 0x05 }, - { WCD934X_EAR_ICTL, 0x40 }, - { WCD934X_EAR_EN_DBG_CTL, 0x00 }, - { WCD934X_EAR_CNP, 0xe0 }, - { WCD934X_EAR_DAC_CTL_ATEST, 0x00 }, - { WCD934X_EAR_STATUS_REG, 0x04 }, - { WCD934X_EAR_EAR_MISC, 0x28 }, - { WCD934X_DIFF_LO_MISC, 0x03 }, - { WCD934X_DIFF_LO_LO2_COMPANDER, 0x00 }, - { WCD934X_DIFF_LO_LO1_COMPANDER, 0x00 }, - { WCD934X_DIFF_LO_COMMON, 0x40 }, - { WCD934X_DIFF_LO_BYPASS_EN, 0x00 }, - { WCD934X_DIFF_LO_CNP, 0x20 }, - { WCD934X_DIFF_LO_CORE_OUT_PROG, 0xa0 }, - { WCD934X_DIFF_LO_LDO_OUT_PROG, 0x00 }, - { WCD934X_DIFF_LO_COM_SWCAP_REFBUF_FREQ, 0x8b }, - { WCD934X_DIFF_LO_COM_PA_FREQ, 0xb0 }, - { WCD934X_DIFF_LO_RESERVED_REG, 0x60 }, - { WCD934X_DIFF_LO_LO1_STATUS_1, 0x00 }, - { WCD934X_DIFF_LO_LO1_STATUS_2, 0x00 }, - { WCD934X_ANA_NEW_PAGE_REGISTER, 0x00 }, - { WCD934X_HPH_NEW_ANA_HPH2, 0x00 }, - { WCD934X_HPH_NEW_ANA_HPH3, 0x00 }, - { WCD934X_SLNQ_ANA_EN, 0x02 }, - { WCD934X_SLNQ_ANA_STATUS, 0x00 }, - { WCD934X_SLNQ_ANA_LDO_CONFIG, 0xea }, - { WCD934X_SLNQ_ANA_LDO_OCP_CONFIG, 0x95 }, - { WCD934X_SLNQ_ANA_TX_LDO_CONFIG, 0xb6 }, - { WCD934X_SLNQ_ANA_TX_DRV_CONFIG, 0x26 }, - { WCD934X_SLNQ_ANA_RX_CONFIG_1, 0x64 }, - { WCD934X_SLNQ_ANA_RX_CONFIG_2, 0x40 }, - { WCD934X_SLNQ_ANA_PLL_ENABLES, 0x00 }, - { WCD934X_SLNQ_ANA_PLL_PRESET, 0x08 }, - { WCD934X_SLNQ_ANA_PLL_STATUS, 0x00 }, - { WCD934X_CLK_SYS_PLL_ENABLES, 0x00 }, - { WCD934X_CLK_SYS_PLL_PRESET, 0x00 }, - { WCD934X_CLK_SYS_PLL_STATUS, 0x00 }, - { WCD934X_CLK_SYS_MCLK_PRG, 0x00 }, - { WCD934X_CLK_SYS_MCLK2_PRG1, 0x00 }, - { WCD934X_CLK_SYS_MCLK2_PRG2, 0x00 }, - { WCD934X_CLK_SYS_XO_PRG, 0x00 }, - { WCD934X_CLK_SYS_XO_CAP_XTP, 0x00 }, - { WCD934X_CLK_SYS_XO_CAP_XTM, 0x00 }, - { WCD934X_BOOST_BST_EN_DLY, 0x40 }, - { WCD934X_BOOST_CTRL_ILIM, 0x9c }, - { WCD934X_BOOST_VOUT_SETTING, 0xca }, - { WCD934X_SIDO_NEW_VOUT_A_STARTUP, 0x05 }, - { WCD934X_SIDO_NEW_VOUT_D_STARTUP, 0x0d }, - { WCD934X_SIDO_NEW_VOUT_D_FREQ1, 0x07 }, - { WCD934X_SIDO_NEW_VOUT_D_FREQ2, 0x00 }, - { WCD934X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00 }, - { WCD934X_MBHC_NEW_CTL_1, 0x02 }, - { WCD934X_MBHC_NEW_CTL_2, 0x05 }, - { WCD934X_MBHC_NEW_PLUG_DETECT_CTL, 0xe9 }, - { WCD934X_MBHC_NEW_ZDET_ANA_CTL, 0x0f }, - { WCD934X_MBHC_NEW_ZDET_RAMP_CTL, 0x00 }, - { WCD934X_MBHC_NEW_FSM_STATUS, 0x00 }, - { WCD934X_MBHC_NEW_ADC_RESULT, 0x00 }, - { WCD934X_TX_NEW_AMIC_4_5_SEL, 0x00 }, - { WCD934X_VBADC_NEW_ADC_MODE, 0x10 }, - { WCD934X_VBADC_NEW_ADC_DOUTMSB, 0x00 }, - { WCD934X_VBADC_NEW_ADC_DOUTLSB, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_HD2_CTL, 0xa0 }, - { WCD934X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10 }, - { WCD934X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_MISC1, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_MISC1, 0x22 }, - { WCD934X_HPH_NEW_INT_PA_MISC2, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC, 0x00 }, - { WCD934X_HPH_NEW_INT_HPH_TIMER1, 0xfe }, - { WCD934X_HPH_NEW_INT_HPH_TIMER2, 0x02 }, - { WCD934X_HPH_NEW_INT_HPH_TIMER3, 0x4e }, - { WCD934X_HPH_NEW_INT_HPH_TIMER4, 0x54 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00 }, - { WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62 }, - { WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01 }, - { WCD934X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11 }, - { WCD934X_SLNQ_INT_ANA_INT_LDO_TEST, 0x0d }, - { WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_1, 0x85 }, - { WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_2, 0xb4 }, - { WCD934X_SLNQ_INT_ANA_INT_TX_LDO_TEST, 0x16 }, - { WCD934X_SLNQ_INT_ANA_INT_TX_DRV_TEST, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_RX_TEST, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_RX_TEST_STATUS, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_1, 0x50 }, - { WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_2, 0x04 }, - { WCD934X_SLNQ_INT_ANA_INT_CLK_CTRL, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_RESERVED_1, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_RESERVED_2, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG0, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG1, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG0, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG1, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG0, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG1, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_L_VAL, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_M_VAL, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_N_VAL, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG0, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_PFD_CP_DSM_PROG, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_VCO_PROG, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG1, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_LDO_LOCK_CFG, 0x00 }, - { WCD934X_SLNQ_INT_ANA_INT_PLL_DIG_LOCK_DET_CFG, 0x00 }, - { WCD934X_CLK_SYS_INT_POST_DIV_REG0, 0x00 }, - { WCD934X_CLK_SYS_INT_POST_DIV_REG1, 0x00 }, - { WCD934X_CLK_SYS_INT_REF_DIV_REG0, 0x00 }, - { WCD934X_CLK_SYS_INT_REF_DIV_REG1, 0x00 }, - { WCD934X_CLK_SYS_INT_FILTER_REG0, 0x00 }, - { WCD934X_CLK_SYS_INT_FILTER_REG1, 0x00 }, - { WCD934X_CLK_SYS_INT_PLL_L_VAL, 0x00 }, - { WCD934X_CLK_SYS_INT_PLL_M_VAL, 0x00 }, - { WCD934X_CLK_SYS_INT_PLL_N_VAL, 0x00 }, - { WCD934X_CLK_SYS_INT_TEST_REG0, 0x00 }, - { WCD934X_CLK_SYS_INT_PFD_CP_DSM_PROG, 0x00 }, - { WCD934X_CLK_SYS_INT_VCO_PROG, 0x00 }, - { WCD934X_CLK_SYS_INT_TEST_REG1, 0x00 }, - { WCD934X_CLK_SYS_INT_LDO_LOCK_CFG, 0x00 }, - { WCD934X_CLK_SYS_INT_DIG_LOCK_DET_CFG, 0x00 }, - { WCD934X_CLK_SYS_INT_CLK_TEST1, 0x00 }, - { WCD934X_CLK_SYS_INT_CLK_TEST2, 0x00 }, - { WCD934X_CLK_SYS_INT_CLK_TEST3, 0x00 }, - { WCD934X_CLK_SYS_INT_XO_TEST1, 0x98 }, - { WCD934X_CLK_SYS_INT_XO_TEST2, 0x00 }, - { WCD934X_BOOST_INT_VCOMP_HYST, 0x02 }, - { WCD934X_BOOST_INT_VLOOP_FILTER, 0xef }, - { WCD934X_BOOST_INT_CTRL_IDELTA, 0xa8 }, - { WCD934X_BOOST_INT_CTRL_ILIM_STARTUP, 0x17 }, - { WCD934X_BOOST_INT_CTRL_MIN_ONTIME, 0x5f }, - { WCD934X_BOOST_INT_CTRL_MAX_ONTIME, 0x88 }, - { WCD934X_BOOST_INT_CTRL_TIMING, 0x0a }, - { WCD934X_BOOST_INT_TMUX_A_D, 0x00 }, - { WCD934X_BOOST_INT_SW_DRV_CNTL, 0xf8 }, - { WCD934X_BOOST_INT_SPARE1, 0x00 }, - { WCD934X_BOOST_INT_SPARE2, 0x00 }, - { WCD934X_SIDO_NEW_INT_RAMP_STATUS, 0x00 }, - { WCD934X_SIDO_NEW_INT_SPARE_1, 0x00 }, - { WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_A, 0x64 }, - { WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_D, 0x40 }, - { WCD934X_SIDO_NEW_INT_RAMP_INC_WAIT, 0x24 }, - { WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_CTL, 0x09 }, - { WCD934X_SIDO_NEW_INT_RAMP_IBLEED_CTL, 0x7d }, - { WCD934X_SIDO_NEW_INT_DEBUG_CPROVR_TEST, 0x00 }, - { WCD934X_SIDO_NEW_INT_RAMP_CTL_A, 0x14 }, - { WCD934X_SIDO_NEW_INT_RAMP_CTL_D, 0x14 }, - { WCD934X_SIDO_NEW_INT_RAMP_TIMEOUT_PERIOD, 0x33 }, - { WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING1, 0x3f }, - { WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING2, 0x74 }, - { WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING3, 0x33 }, - { WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL1, 0x1d }, - { WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL2, 0x0a }, - { WCD934X_MBHC_NEW_INT_SLNQ_HPF, 0x50 }, - { WCD934X_MBHC_NEW_INT_SLNQ_REF, 0x24 }, - { WCD934X_MBHC_NEW_INT_SLNQ_COMP, 0x50 }, - { WCD934X_MBHC_NEW_INT_SPARE_2, 0x00 }, - { WCD934X_PAGE10_PAGE_REGISTER, 0x00 }, - { WCD934X_CDC_ANC0_CLK_RESET_CTL, 0x00 }, - { WCD934X_CDC_ANC0_MODE_1_CTL, 0x00 }, - { WCD934X_CDC_ANC0_MODE_2_CTL, 0x00 }, - { WCD934X_CDC_ANC0_FF_SHIFT, 0x00 }, - { WCD934X_CDC_ANC0_FB_SHIFT, 0x00 }, - { WCD934X_CDC_ANC0_LPF_FF_A_CTL, 0x00 }, - { WCD934X_CDC_ANC0_LPF_FF_B_CTL, 0x00 }, - { WCD934X_CDC_ANC0_LPF_FB_CTL, 0x00 }, - { WCD934X_CDC_ANC0_SMLPF_CTL, 0x00 }, - { WCD934X_CDC_ANC0_DCFLT_SHIFT_CTL, 0x00 }, - { WCD934X_CDC_ANC0_IIR_ADAPT_CTL, 0x00 }, - { WCD934X_CDC_ANC0_IIR_COEFF_1_CTL, 0x00 }, - { WCD934X_CDC_ANC0_IIR_COEFF_2_CTL, 0x00 }, - { WCD934X_CDC_ANC0_FF_A_GAIN_CTL, 0x00 }, - { WCD934X_CDC_ANC0_FF_B_GAIN_CTL, 0x00 }, - { WCD934X_CDC_ANC0_FB_GAIN_CTL, 0x00 }, - { WCD934X_CDC_ANC0_RC_COMMON_CTL, 0x00 }, - { WCD934X_CDC_ANC0_FIFO_COMMON_CTL, 0x88 }, - { WCD934X_CDC_ANC0_RC0_STATUS_FMIN_CNTR, 0x00 }, - { WCD934X_CDC_ANC0_RC1_STATUS_FMIN_CNTR, 0x00 }, - { WCD934X_CDC_ANC0_RC0_STATUS_FMAX_CNTR, 0x00 }, - { WCD934X_CDC_ANC0_RC1_STATUS_FMAX_CNTR, 0x00 }, - { WCD934X_CDC_ANC0_STATUS_FIFO, 0x00 }, - { WCD934X_CDC_ANC1_CLK_RESET_CTL, 0x00 }, - { WCD934X_CDC_ANC1_MODE_1_CTL, 0x00 }, - { WCD934X_CDC_ANC1_MODE_2_CTL, 0x00 }, - { WCD934X_CDC_ANC1_FF_SHIFT, 0x00 }, - { WCD934X_CDC_ANC1_FB_SHIFT, 0x00 }, - { WCD934X_CDC_ANC1_LPF_FF_A_CTL, 0x00 }, - { WCD934X_CDC_ANC1_LPF_FF_B_CTL, 0x00 }, - { WCD934X_CDC_ANC1_LPF_FB_CTL, 0x00 }, - { WCD934X_CDC_ANC1_SMLPF_CTL, 0x00 }, - { WCD934X_CDC_ANC1_DCFLT_SHIFT_CTL, 0x00 }, - { WCD934X_CDC_ANC1_IIR_ADAPT_CTL, 0x00 }, - { WCD934X_CDC_ANC1_IIR_COEFF_1_CTL, 0x00 }, - { WCD934X_CDC_ANC1_IIR_COEFF_2_CTL, 0x00 }, - { WCD934X_CDC_ANC1_FF_A_GAIN_CTL, 0x00 }, - { WCD934X_CDC_ANC1_FF_B_GAIN_CTL, 0x00 }, - { WCD934X_CDC_ANC1_FB_GAIN_CTL, 0x00 }, - { WCD934X_CDC_ANC1_RC_COMMON_CTL, 0x00 }, - { WCD934X_CDC_ANC1_FIFO_COMMON_CTL, 0x88 }, - { WCD934X_CDC_ANC1_RC0_STATUS_FMIN_CNTR, 0x00 }, - { WCD934X_CDC_ANC1_RC1_STATUS_FMIN_CNTR, 0x00 }, - { WCD934X_CDC_ANC1_RC0_STATUS_FMAX_CNTR, 0x00 }, - { WCD934X_CDC_ANC1_RC1_STATUS_FMAX_CNTR, 0x00 }, - { WCD934X_CDC_ANC1_STATUS_FIFO, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX0_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX0_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX0_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX0_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX0_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX0_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX0_TX_PATH_SEC7, 0x25 }, - { WCD934X_CDC_TX1_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX1_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX1_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX1_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX1_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX1_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX1_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX1_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX1_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX1_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX1_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX1_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX1_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX2_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX2_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX2_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX2_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX2_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX2_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX2_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX2_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX2_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX2_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX2_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX2_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX2_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX3_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX3_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX3_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX3_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX3_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX3_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX3_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX3_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX3_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX3_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX3_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX3_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX3_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX4_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX4_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX4_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX4_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX4_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX4_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX4_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX4_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX4_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX4_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX4_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX4_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX4_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX5_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX5_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX5_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX5_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX5_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX5_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX5_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX5_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX5_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX5_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX5_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX5_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX5_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX6_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX6_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX6_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX6_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX6_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX6_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX6_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX6_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX6_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX6_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX6_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX6_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX6_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX7_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX7_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX7_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX7_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX7_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX7_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX7_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX7_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX7_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX7_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX7_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX7_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX7_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX8_TX_PATH_CTL, 0x04 }, - { WCD934X_CDC_TX8_TX_PATH_CFG0, 0x10 }, - { WCD934X_CDC_TX8_TX_PATH_CFG1, 0x03 }, - { WCD934X_CDC_TX8_TX_VOL_CTL, 0x00 }, - { WCD934X_CDC_TX8_TX_PATH_192_CTL, 0x00 }, - { WCD934X_CDC_TX8_TX_PATH_192_CFG, 0x00 }, - { WCD934X_CDC_TX8_TX_PATH_SEC0, 0x00 }, - { WCD934X_CDC_TX8_TX_PATH_SEC1, 0x00 }, - { WCD934X_CDC_TX8_TX_PATH_SEC2, 0x01 }, - { WCD934X_CDC_TX8_TX_PATH_SEC3, 0x3c }, - { WCD934X_CDC_TX8_TX_PATH_SEC4, 0x20 }, - { WCD934X_CDC_TX8_TX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_TX8_TX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD934X_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x00 }, - { WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD934X_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x00 }, - { WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD934X_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x00 }, - { WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL, 0x02 }, - { WCD934X_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x00 }, - { WCD934X_PAGE11_PAGE_REGISTER, 0x00 }, - { WCD934X_CDC_COMPANDER1_CTL0, 0x60 }, - { WCD934X_CDC_COMPANDER1_CTL1, 0xdb }, - { WCD934X_CDC_COMPANDER1_CTL2, 0xff }, - { WCD934X_CDC_COMPANDER1_CTL3, 0x35 }, - { WCD934X_CDC_COMPANDER1_CTL4, 0xff }, - { WCD934X_CDC_COMPANDER1_CTL5, 0x00 }, - { WCD934X_CDC_COMPANDER1_CTL6, 0x01 }, - { WCD934X_CDC_COMPANDER1_CTL7, 0x08 }, - { WCD934X_CDC_COMPANDER2_CTL0, 0x60 }, - { WCD934X_CDC_COMPANDER2_CTL1, 0xdb }, - { WCD934X_CDC_COMPANDER2_CTL2, 0xff }, - { WCD934X_CDC_COMPANDER2_CTL3, 0x35 }, - { WCD934X_CDC_COMPANDER2_CTL4, 0xff }, - { WCD934X_CDC_COMPANDER2_CTL5, 0x00 }, - { WCD934X_CDC_COMPANDER2_CTL6, 0x01 }, - { WCD934X_CDC_COMPANDER2_CTL7, 0x08 }, - { WCD934X_CDC_COMPANDER3_CTL0, 0x60 }, - { WCD934X_CDC_COMPANDER3_CTL1, 0xdb }, - { WCD934X_CDC_COMPANDER3_CTL2, 0xff }, - { WCD934X_CDC_COMPANDER3_CTL3, 0x35 }, - { WCD934X_CDC_COMPANDER3_CTL4, 0xff }, - { WCD934X_CDC_COMPANDER3_CTL5, 0x00 }, - { WCD934X_CDC_COMPANDER3_CTL6, 0x01 }, - { WCD934X_CDC_COMPANDER3_CTL7, 0x08 }, - { WCD934X_CDC_COMPANDER4_CTL0, 0x60 }, - { WCD934X_CDC_COMPANDER4_CTL1, 0xdb }, - { WCD934X_CDC_COMPANDER4_CTL2, 0xff }, - { WCD934X_CDC_COMPANDER4_CTL3, 0x35 }, - { WCD934X_CDC_COMPANDER4_CTL4, 0xff }, - { WCD934X_CDC_COMPANDER4_CTL5, 0x00 }, - { WCD934X_CDC_COMPANDER4_CTL6, 0x01 }, - { WCD934X_CDC_COMPANDER4_CTL7, 0x08 }, - { WCD934X_CDC_COMPANDER7_CTL0, 0x60 }, - { WCD934X_CDC_COMPANDER7_CTL1, 0xdb }, - { WCD934X_CDC_COMPANDER7_CTL2, 0xff }, - { WCD934X_CDC_COMPANDER7_CTL3, 0x35 }, - { WCD934X_CDC_COMPANDER7_CTL4, 0xff }, - { WCD934X_CDC_COMPANDER7_CTL5, 0x00 }, - { WCD934X_CDC_COMPANDER7_CTL6, 0x01 }, - { WCD934X_CDC_COMPANDER7_CTL7, 0x08 }, - { WCD934X_CDC_COMPANDER8_CTL0, 0x60 }, - { WCD934X_CDC_COMPANDER8_CTL1, 0xdb }, - { WCD934X_CDC_COMPANDER8_CTL2, 0xff }, - { WCD934X_CDC_COMPANDER8_CTL3, 0x35 }, - { WCD934X_CDC_COMPANDER8_CTL4, 0xff }, - { WCD934X_CDC_COMPANDER8_CTL5, 0x00 }, - { WCD934X_CDC_COMPANDER8_CTL6, 0x01 }, - { WCD934X_CDC_COMPANDER8_CTL7, 0x08 }, - { WCD934X_CDC_RX0_RX_PATH_CTL, 0x04 }, - { WCD934X_CDC_RX0_RX_PATH_CFG0, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_CFG1, 0x64 }, - { WCD934X_CDC_RX0_RX_PATH_CFG2, 0x8f }, - { WCD934X_CDC_RX0_RX_VOL_CTL, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_MIX_CTL, 0x04 }, - { WCD934X_CDC_RX0_RX_PATH_MIX_CFG, 0x7e }, - { WCD934X_CDC_RX0_RX_VOL_MIX_CTL, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_SEC0, 0xfc }, - { WCD934X_CDC_RX0_RX_PATH_SEC1, 0x08 }, - { WCD934X_CDC_RX0_RX_PATH_SEC2, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_SEC3, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_SEC7, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_MIX_SEC0, 0x08 }, - { WCD934X_CDC_RX0_RX_PATH_MIX_SEC1, 0x00 }, - { WCD934X_CDC_RX0_RX_PATH_DSMDEM_CTL, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_CTL, 0x04 }, - { WCD934X_CDC_RX1_RX_PATH_CFG0, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_CFG1, 0x64 }, - { WCD934X_CDC_RX1_RX_PATH_CFG2, 0x8f }, - { WCD934X_CDC_RX1_RX_VOL_CTL, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_MIX_CTL, 0x04 }, - { WCD934X_CDC_RX1_RX_PATH_MIX_CFG, 0x7e }, - { WCD934X_CDC_RX1_RX_VOL_MIX_CTL, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_SEC0, 0xfc }, - { WCD934X_CDC_RX1_RX_PATH_SEC1, 0x08 }, - { WCD934X_CDC_RX1_RX_PATH_SEC2, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_SEC3, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_SEC4, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_SEC7, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_MIX_SEC0, 0x08 }, - { WCD934X_CDC_RX1_RX_PATH_MIX_SEC1, 0x00 }, - { WCD934X_CDC_RX1_RX_PATH_DSMDEM_CTL, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_CTL, 0x04 }, - { WCD934X_CDC_RX2_RX_PATH_CFG0, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_CFG1, 0x64 }, - { WCD934X_CDC_RX2_RX_PATH_CFG2, 0x8f }, - { WCD934X_CDC_RX2_RX_VOL_CTL, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_MIX_CTL, 0x04 }, - { WCD934X_CDC_RX2_RX_PATH_MIX_CFG, 0x7e }, - { WCD934X_CDC_RX2_RX_VOL_MIX_CTL, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_SEC0, 0xfc }, - { WCD934X_CDC_RX2_RX_PATH_SEC1, 0x08 }, - { WCD934X_CDC_RX2_RX_PATH_SEC2, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_SEC3, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_SEC4, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_SEC7, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_MIX_SEC0, 0x08 }, - { WCD934X_CDC_RX2_RX_PATH_MIX_SEC1, 0x00 }, - { WCD934X_CDC_RX2_RX_PATH_DSMDEM_CTL, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_CTL, 0x04 }, - { WCD934X_CDC_RX3_RX_PATH_CFG0, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_CFG1, 0x64 }, - { WCD934X_CDC_RX3_RX_PATH_CFG2, 0x8f }, - { WCD934X_CDC_RX3_RX_VOL_CTL, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_MIX_CTL, 0x04 }, - { WCD934X_CDC_RX3_RX_PATH_MIX_CFG, 0x7e }, - { WCD934X_CDC_RX3_RX_VOL_MIX_CTL, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_SEC0, 0xfc }, - { WCD934X_CDC_RX3_RX_PATH_SEC1, 0x08 }, - { WCD934X_CDC_RX3_RX_PATH_SEC2, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_SEC3, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_SEC7, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_MIX_SEC0, 0x08 }, - { WCD934X_CDC_RX3_RX_PATH_MIX_SEC1, 0x00 }, - { WCD934X_CDC_RX3_RX_PATH_DSMDEM_CTL, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_CTL, 0x04 }, - { WCD934X_CDC_RX4_RX_PATH_CFG0, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_CFG1, 0x64 }, - { WCD934X_CDC_RX4_RX_PATH_CFG2, 0x8f }, - { WCD934X_CDC_RX4_RX_VOL_CTL, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_MIX_CTL, 0x04 }, - { WCD934X_CDC_RX4_RX_PATH_MIX_CFG, 0x7e }, - { WCD934X_CDC_RX4_RX_VOL_MIX_CTL, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_SEC0, 0xfc }, - { WCD934X_CDC_RX4_RX_PATH_SEC1, 0x08 }, - { WCD934X_CDC_RX4_RX_PATH_SEC2, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_SEC3, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_SEC7, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_MIX_SEC0, 0x08 }, - { WCD934X_CDC_RX4_RX_PATH_MIX_SEC1, 0x00 }, - { WCD934X_CDC_RX4_RX_PATH_DSMDEM_CTL, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_CTL, 0x04 }, - { WCD934X_CDC_RX7_RX_PATH_CFG0, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_CFG1, 0x64 }, - { WCD934X_CDC_RX7_RX_PATH_CFG2, 0x8f }, - { WCD934X_CDC_RX7_RX_VOL_CTL, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_MIX_CTL, 0x04 }, - { WCD934X_CDC_RX7_RX_PATH_MIX_CFG, 0x7e }, - { WCD934X_CDC_RX7_RX_VOL_MIX_CTL, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_SEC0, 0x04 }, - { WCD934X_CDC_RX7_RX_PATH_SEC1, 0x08 }, - { WCD934X_CDC_RX7_RX_PATH_SEC2, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_SEC3, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_SEC7, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_MIX_SEC0, 0x08 }, - { WCD934X_CDC_RX7_RX_PATH_MIX_SEC1, 0x00 }, - { WCD934X_CDC_RX7_RX_PATH_DSMDEM_CTL, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_CTL, 0x04 }, - { WCD934X_CDC_RX8_RX_PATH_CFG0, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_CFG1, 0x64 }, - { WCD934X_CDC_RX8_RX_PATH_CFG2, 0x8f }, - { WCD934X_CDC_RX8_RX_VOL_CTL, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_MIX_CTL, 0x04 }, - { WCD934X_CDC_RX8_RX_PATH_MIX_CFG, 0x7e }, - { WCD934X_CDC_RX8_RX_VOL_MIX_CTL, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_SEC0, 0x04 }, - { WCD934X_CDC_RX8_RX_PATH_SEC1, 0x08 }, - { WCD934X_CDC_RX8_RX_PATH_SEC2, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_SEC3, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_SEC5, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_SEC6, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_SEC7, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_MIX_SEC0, 0x08 }, - { WCD934X_CDC_RX8_RX_PATH_MIX_SEC1, 0x00 }, - { WCD934X_CDC_RX8_RX_PATH_DSMDEM_CTL, 0x00 }, - { WCD934X_PAGE12_PAGE_REGISTER, 0x00 }, - { WCD934X_CDC_CLSH_CRC, 0x00 }, - { WCD934X_CDC_CLSH_DLY_CTRL, 0x03 }, - { WCD934X_CDC_CLSH_DECAY_CTRL, 0x02 }, - { WCD934X_CDC_CLSH_HPH_V_PA, 0x1c }, - { WCD934X_CDC_CLSH_EAR_V_PA, 0x39 }, - { WCD934X_CDC_CLSH_HPH_V_HD, 0x0c }, - { WCD934X_CDC_CLSH_EAR_V_HD, 0x0c }, - { WCD934X_CDC_CLSH_K1_MSB, 0x01 }, - { WCD934X_CDC_CLSH_K1_LSB, 0x00 }, - { WCD934X_CDC_CLSH_K2_MSB, 0x00 }, - { WCD934X_CDC_CLSH_K2_LSB, 0x80 }, - { WCD934X_CDC_CLSH_IDLE_CTRL, 0x00 }, - { WCD934X_CDC_CLSH_IDLE_HPH, 0x00 }, - { WCD934X_CDC_CLSH_IDLE_EAR, 0x00 }, - { WCD934X_CDC_CLSH_TEST0, 0x07 }, - { WCD934X_CDC_CLSH_TEST1, 0x00 }, - { WCD934X_CDC_CLSH_OVR_VREF, 0x00 }, - { WCD934X_CDC_BOOST0_BOOST_PATH_CTL, 0x00 }, - { WCD934X_CDC_BOOST0_BOOST_CTL, 0xb2 }, - { WCD934X_CDC_BOOST0_BOOST_CFG1, 0x00 }, - { WCD934X_CDC_BOOST0_BOOST_CFG2, 0x00 }, - { WCD934X_CDC_BOOST1_BOOST_PATH_CTL, 0x00 }, - { WCD934X_CDC_BOOST1_BOOST_CTL, 0xb2 }, - { WCD934X_CDC_BOOST1_BOOST_CFG1, 0x00 }, - { WCD934X_CDC_BOOST1_BOOST_CFG2, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_PATH_CTL, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_CFG, 0x1a }, - { WCD934X_CDC_VBAT_VBAT_ADC_CAL1, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_ADC_CAL2, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_ADC_CAL3, 0x04 }, - { WCD934X_CDC_VBAT_VBAT_PK_EST1, 0xe0 }, - { WCD934X_CDC_VBAT_VBAT_PK_EST2, 0x01 }, - { WCD934X_CDC_VBAT_VBAT_PK_EST3, 0x40 }, - { WCD934X_CDC_VBAT_VBAT_RF_PROC1, 0x2a }, - { WCD934X_CDC_VBAT_VBAT_RF_PROC2, 0x86 }, - { WCD934X_CDC_VBAT_VBAT_TAC1, 0x70 }, - { WCD934X_CDC_VBAT_VBAT_TAC2, 0x18 }, - { WCD934X_CDC_VBAT_VBAT_TAC3, 0x18 }, - { WCD934X_CDC_VBAT_VBAT_TAC4, 0x03 }, - { WCD934X_CDC_VBAT_VBAT_GAIN_UPD1, 0x01 }, - { WCD934X_CDC_VBAT_VBAT_GAIN_UPD2, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_GAIN_UPD3, 0x64 }, - { WCD934X_CDC_VBAT_VBAT_GAIN_UPD4, 0x01 }, - { WCD934X_CDC_VBAT_VBAT_DEBUG1, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_GAIN_UPD_MON, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_GAIN_MON_VAL, 0x00 }, - { WCD934X_CDC_VBAT_VBAT_BAN, 0x0c }, - { WCD934X_MIXING_ASRC0_CLK_RST_CTL, 0x00 }, - { WCD934X_MIXING_ASRC0_CTL0, 0x00 }, - { WCD934X_MIXING_ASRC0_CTL1, 0x00 }, - { WCD934X_MIXING_ASRC0_FIFO_CTL, 0xa8 }, - { WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC0_STATUS_FIFO, 0x00 }, - { WCD934X_MIXING_ASRC1_CLK_RST_CTL, 0x00 }, - { WCD934X_MIXING_ASRC1_CTL0, 0x00 }, - { WCD934X_MIXING_ASRC1_CTL1, 0x00 }, - { WCD934X_MIXING_ASRC1_FIFO_CTL, 0xa8 }, - { WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC1_STATUS_FIFO, 0x00 }, - { WCD934X_MIXING_ASRC2_CLK_RST_CTL, 0x00 }, - { WCD934X_MIXING_ASRC2_CTL0, 0x00 }, - { WCD934X_MIXING_ASRC2_CTL1, 0x00 }, - { WCD934X_MIXING_ASRC2_FIFO_CTL, 0xa8 }, - { WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC2_STATUS_FIFO, 0x00 }, - { WCD934X_MIXING_ASRC3_CLK_RST_CTL, 0x00 }, - { WCD934X_MIXING_ASRC3_CTL0, 0x00 }, - { WCD934X_MIXING_ASRC3_CTL1, 0x00 }, - { WCD934X_MIXING_ASRC3_FIFO_CTL, 0xa8 }, - { WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_MIXING_ASRC3_STATUS_FIFO, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_DATA_0, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_DATA_1, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_DATA_2, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_DATA_3, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_ADDR_0, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_ADDR_1, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_ADDR_2, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_WR_ADDR_3, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_ADDR_0, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_ADDR_1, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_ADDR_2, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_ADDR_3, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_DATA_0, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_DATA_1, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_DATA_2, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_RD_DATA_3, 0x00 }, - { WCD934X_SWR_AHB_BRIDGE_ACCESS_CFG, 0x0f }, - { WCD934X_SWR_AHB_BRIDGE_ACCESS_STATUS, 0x03 }, - { WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04 }, - { WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00 }, - { WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL, 0x04 }, - { WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1, 0x00 }, - { WCD934X_SIDETONE_ASRC0_CLK_RST_CTL, 0x00 }, - { WCD934X_SIDETONE_ASRC0_CTL0, 0x00 }, - { WCD934X_SIDETONE_ASRC0_CTL1, 0x00 }, - { WCD934X_SIDETONE_ASRC0_FIFO_CTL, 0xa8 }, - { WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_SIDETONE_ASRC0_STATUS_FIFO, 0x00 }, - { WCD934X_SIDETONE_ASRC1_CLK_RST_CTL, 0x00 }, - { WCD934X_SIDETONE_ASRC1_CTL0, 0x00 }, - { WCD934X_SIDETONE_ASRC1_CTL1, 0x00 }, - { WCD934X_SIDETONE_ASRC1_FIFO_CTL, 0xa8 }, - { WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_SIDETONE_ASRC1_STATUS_FIFO, 0x00 }, - { WCD934X_EC_REF_HQ0_EC_REF_HQ_PATH_CTL, 0x00 }, - { WCD934X_EC_REF_HQ0_EC_REF_HQ_CFG0, 0x01 }, - { WCD934X_EC_REF_HQ1_EC_REF_HQ_PATH_CTL, 0x00 }, - { WCD934X_EC_REF_HQ1_EC_REF_HQ_CFG0, 0x01 }, - { WCD934X_EC_ASRC0_CLK_RST_CTL, 0x00 }, - { WCD934X_EC_ASRC0_CTL0, 0x00 }, - { WCD934X_EC_ASRC0_CTL1, 0x00 }, - { WCD934X_EC_ASRC0_FIFO_CTL, 0xa8 }, - { WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_EC_ASRC0_STATUS_FIFO, 0x00 }, - { WCD934X_EC_ASRC1_CLK_RST_CTL, 0x00 }, - { WCD934X_EC_ASRC1_CTL0, 0x00 }, - { WCD934X_EC_ASRC1_CTL1, 0x00 }, - { WCD934X_EC_ASRC1_FIFO_CTL, 0xa8 }, - { WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00 }, - { WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00 }, - { WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00 }, - { WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00 }, - { WCD934X_EC_ASRC1_STATUS_FIFO, 0x00 }, - { WCD934X_PAGE13_PAGE_REGISTER, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG2, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG3, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG4, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_ANC_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 0x00 }, - { WCD934X_CDC_RX_INP_MUX_EC_REF_HQ_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 0x00 }, - { WCD934X_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3, 0x00 }, - { WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 0x00 }, - { WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 0x00 }, - { WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2, 0x00 }, - { WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3, 0x00 }, - { WCD934X_CDC_CLK_RST_CTRL_MCLK_CONTROL, 0x00 }, - { WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, 0x0c }, - { WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, 0x00 }, - { WCD934X_CDC_CLK_RST_CTRL_DSD_CONTROL, 0x00 }, - { WCD934X_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL, 0x0f }, - { WCD934X_CDC_CLK_RST_CTRL_GFM_CONTROL, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_CTL, 0x08 }, - { WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD0, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD1, 0x4b }, - { WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_STATUS, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_TEST_CTRL, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD, 0x00 }, - { WCD934X_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_PATH_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_CTL, 0x40 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_PATH_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_CTL, 0x40 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL, 0x00 }, - { WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL, 0x00 }, - { WCD934X_CDC_TOP_TOP_CFG0, 0x00 }, - { WCD934X_CDC_TOP_TOP_CFG1, 0x00 }, - { WCD934X_CDC_TOP_TOP_CFG7, 0x00 }, - { WCD934X_CDC_TOP_HPHL_COMP_WR_LSB, 0x00 }, - { WCD934X_CDC_TOP_HPHL_COMP_WR_MSB, 0x00 }, - { WCD934X_CDC_TOP_HPHL_COMP_LUT, 0x00 }, - { WCD934X_CDC_TOP_HPHL_COMP_RD_LSB, 0x00 }, - { WCD934X_CDC_TOP_HPHL_COMP_RD_MSB, 0x00 }, - { WCD934X_CDC_TOP_HPHR_COMP_WR_LSB, 0x00 }, - { WCD934X_CDC_TOP_HPHR_COMP_WR_MSB, 0x00 }, - { WCD934X_CDC_TOP_HPHR_COMP_LUT, 0x00 }, - { WCD934X_CDC_TOP_HPHR_COMP_RD_LSB, 0x00 }, - { WCD934X_CDC_TOP_HPHR_COMP_RD_MSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFL_COMP_WR_LSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFL_COMP_WR_MSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFL_COMP_LUT, 0x00 }, - { WCD934X_CDC_TOP_DIFFL_COMP_RD_LSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFL_COMP_RD_MSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFR_COMP_WR_LSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFR_COMP_WR_MSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFR_COMP_LUT, 0x00 }, - { WCD934X_CDC_TOP_DIFFR_COMP_RD_LSB, 0x00 }, - { WCD934X_CDC_TOP_DIFFR_COMP_RD_MSB, 0x00 }, - { WCD934X_CDC_DSD0_PATH_CTL, 0x00 }, - { WCD934X_CDC_DSD0_CFG0, 0x00 }, - { WCD934X_CDC_DSD0_CFG1, 0x00 }, - { WCD934X_CDC_DSD0_CFG2, 0x42 }, - { WCD934X_CDC_DSD0_CFG3, 0x00 }, - { WCD934X_CDC_DSD0_CFG4, 0x02 }, - { WCD934X_CDC_DSD0_CFG5, 0x00 }, - { WCD934X_CDC_DSD1_PATH_CTL, 0x00 }, - { WCD934X_CDC_DSD1_CFG0, 0x00 }, - { WCD934X_CDC_DSD1_CFG1, 0x00 }, - { WCD934X_CDC_DSD1_CFG2, 0x42 }, - { WCD934X_CDC_DSD1_CFG3, 0x00 }, - { WCD934X_CDC_DSD1_CFG4, 0x02 }, - { WCD934X_CDC_DSD1_CFG5, 0x00 }, - { WCD934X_CDC_RX_IDLE_DET_PATH_CTL, 0x00 }, - { WCD934X_CDC_RX_IDLE_DET_CFG0, 0x07 }, - { WCD934X_CDC_RX_IDLE_DET_CFG1, 0x3c }, - { WCD934X_CDC_RX_IDLE_DET_CFG2, 0x00 }, - { WCD934X_CDC_RX_IDLE_DET_CFG3, 0x00 }, - { WCD934X_PAGE14_PAGE_REGISTER, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_CLK_RST_CTL, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_CTL, 0x09 }, - { WCD934X_CDC_RATE_EST0_RE_PULSE_SUPR_CTL, 0x06 }, - { WCD934X_CDC_RATE_EST0_RE_TIMER, 0x01 }, - { WCD934X_CDC_RATE_EST0_RE_BW_SW, 0x20 }, - { WCD934X_CDC_RATE_EST0_RE_THRESH, 0xa0 }, - { WCD934X_CDC_RATE_EST0_RE_STATUS, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_CTRL, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_TIMER2, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW1, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW2, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW3, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW4, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW5, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW1, 0x03 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW2, 0x03 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW3, 0x03 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW4, 0x03 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW5, 0x03 }, - { WCD934X_CDC_RATE_EST0_RE_RMAX_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_RMIN_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_PH_DET, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_DIAG_CLR, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_MB_SW_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_MAST_DIAG_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_RATE_OUT_7_0, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_RATE_OUT_15_8, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_RATE_OUT_23_16, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_RATE_OUT_31_24, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_RATE_OUT_39_32, 0x00 }, - { WCD934X_CDC_RATE_EST0_RE_RATE_OUT_40_43, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_CLK_RST_CTL, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_CTL, 0x09 }, - { WCD934X_CDC_RATE_EST1_RE_PULSE_SUPR_CTL, 0x06 }, - { WCD934X_CDC_RATE_EST1_RE_TIMER, 0x01 }, - { WCD934X_CDC_RATE_EST1_RE_BW_SW, 0x20 }, - { WCD934X_CDC_RATE_EST1_RE_THRESH, 0xa0 }, - { WCD934X_CDC_RATE_EST1_RE_STATUS, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_CTRL, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_TIMER2, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW1, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW2, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW3, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW4, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW5, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW1, 0x03 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW2, 0x03 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW3, 0x03 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW4, 0x03 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW5, 0x03 }, - { WCD934X_CDC_RATE_EST1_RE_RMAX_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_RMIN_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_PH_DET, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_DIAG_CLR, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_MB_SW_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_MAST_DIAG_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_RATE_OUT_7_0, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_RATE_OUT_15_8, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_RATE_OUT_23_16, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_RATE_OUT_31_24, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_RATE_OUT_39_32, 0x00 }, - { WCD934X_CDC_RATE_EST1_RE_RATE_OUT_40_43, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_CLK_RST_CTL, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_CTL, 0x09 }, - { WCD934X_CDC_RATE_EST2_RE_PULSE_SUPR_CTL, 0x06 }, - { WCD934X_CDC_RATE_EST2_RE_TIMER, 0x01 }, - { WCD934X_CDC_RATE_EST2_RE_BW_SW, 0x20 }, - { WCD934X_CDC_RATE_EST2_RE_THRESH, 0xa0 }, - { WCD934X_CDC_RATE_EST2_RE_STATUS, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_CTRL, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_TIMER2, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW1, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW2, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW3, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW4, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW5, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW1, 0x03 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW2, 0x03 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW3, 0x03 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW4, 0x03 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW5, 0x03 }, - { WCD934X_CDC_RATE_EST2_RE_RMAX_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_RMIN_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_PH_DET, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_DIAG_CLR, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_MB_SW_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_MAST_DIAG_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_RATE_OUT_7_0, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_RATE_OUT_15_8, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_RATE_OUT_23_16, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_RATE_OUT_31_24, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_RATE_OUT_39_32, 0x00 }, - { WCD934X_CDC_RATE_EST2_RE_RATE_OUT_40_43, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_CLK_RST_CTL, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_CTL, 0x09 }, - { WCD934X_CDC_RATE_EST3_RE_PULSE_SUPR_CTL, 0x06 }, - { WCD934X_CDC_RATE_EST3_RE_TIMER, 0x01 }, - { WCD934X_CDC_RATE_EST3_RE_BW_SW, 0x20 }, - { WCD934X_CDC_RATE_EST3_RE_THRESH, 0xa0 }, - { WCD934X_CDC_RATE_EST3_RE_STATUS, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_CTRL, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_TIMER2, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW1, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW2, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW3, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW4, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW5, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW1, 0x08 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW2, 0x07 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW3, 0x05 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW4, 0x05 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW5, 0x05 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW1, 0x03 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW2, 0x03 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW3, 0x03 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW4, 0x03 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW5, 0x03 }, - { WCD934X_CDC_RATE_EST3_RE_RMAX_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_RMIN_DIAG, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_PH_DET, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_DIAG_CLR, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_MB_SW_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_MAST_DIAG_STATE, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_RATE_OUT_7_0, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_RATE_OUT_15_8, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_RATE_OUT_23_16, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_RATE_OUT_31_24, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_RATE_OUT_39_32, 0x00 }, - { WCD934X_CDC_RATE_EST3_RE_RATE_OUT_40_43, 0x00 }, - { WCD934X_PAGE15_PAGE_REGISTER, 0x00 }, - { WCD934X_SPLINE_SRC0_CLK_RST_CTL_0, 0x20 }, - { WCD934X_SPLINE_SRC0_STATUS, 0x00 }, - { WCD934X_SPLINE_SRC1_CLK_RST_CTL_0, 0x20 }, - { WCD934X_SPLINE_SRC1_STATUS, 0x00 }, - { WCD934X_SPLINE_SRC2_CLK_RST_CTL_0, 0x20 }, - { WCD934X_SPLINE_SRC2_STATUS, 0x00 }, - { WCD934X_SPLINE_SRC3_CLK_RST_CTL_0, 0x20 }, - { WCD934X_SPLINE_SRC3_STATUS, 0x00 }, - { WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG0, 0x11 }, - { WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG1, 0x20 }, - { WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG2, 0x00 }, - { WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG3, 0x08 }, - { WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG0, 0x11 }, - { WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG1, 0x20 }, - { WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG2, 0x00 }, - { WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG3, 0x08 }, - { WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG0, 0x00 }, - { WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG1, 0x00 }, - { WCD934X_CDC_DEBUG_RC_RE_ASRC_DEBUG_CFG0, 0x00 }, - { WCD934X_CDC_DEBUG_ANC0_RC0_FIFO_CTL, 0x4c }, - { WCD934X_CDC_DEBUG_ANC0_RC1_FIFO_CTL, 0x4c }, - { WCD934X_CDC_DEBUG_ANC1_RC0_FIFO_CTL, 0x4c }, - { WCD934X_CDC_DEBUG_ANC1_RC1_FIFO_CTL, 0x4c }, - { WCD934X_CDC_DEBUG_ANC_RC_RST_DBG_CNTR, 0x00 }, - { WCD934X_PAGE80_PAGE_REGISTER, 0x00 }, - { WCD934X_CODEC_CPR_WR_DATA_0, 0x00 }, - { WCD934X_CODEC_CPR_WR_DATA_1, 0x00 }, - { WCD934X_CODEC_CPR_WR_DATA_2, 0x00 }, - { WCD934X_CODEC_CPR_WR_DATA_3, 0x00 }, - { WCD934X_CODEC_CPR_WR_ADDR_0, 0x00 }, - { WCD934X_CODEC_CPR_WR_ADDR_1, 0x00 }, - { WCD934X_CODEC_CPR_WR_ADDR_2, 0x00 }, - { WCD934X_CODEC_CPR_WR_ADDR_3, 0x00 }, - { WCD934X_CODEC_CPR_RD_ADDR_0, 0x00 }, - { WCD934X_CODEC_CPR_RD_ADDR_1, 0x00 }, - { WCD934X_CODEC_CPR_RD_ADDR_2, 0x00 }, - { WCD934X_CODEC_CPR_RD_ADDR_3, 0x00 }, - { WCD934X_CODEC_CPR_RD_DATA_0, 0x00 }, - { WCD934X_CODEC_CPR_RD_DATA_1, 0x00 }, - { WCD934X_CODEC_CPR_RD_DATA_2, 0x00 }, - { WCD934X_CODEC_CPR_RD_DATA_3, 0x00 }, - { WCD934X_CODEC_CPR_ACCESS_CFG, 0x0f }, - { WCD934X_CODEC_CPR_ACCESS_STATUS, 0x03 }, - { WCD934X_CODEC_CPR_NOM_CX_VDD, 0xb4 }, - { WCD934X_CODEC_CPR_SVS_CX_VDD, 0x5c }, - { WCD934X_CODEC_CPR_SVS2_CX_VDD, 0x40 }, - { WCD934X_CODEC_CPR_NOM_MX_VDD, 0xb4 }, - { WCD934X_CODEC_CPR_SVS_MX_VDD, 0xb4 }, - { WCD934X_CODEC_CPR_SVS2_MX_VDD, 0xa0 }, - { WCD934X_CODEC_CPR_SVS2_MIN_CX_VDD, 0x28 }, - { WCD934X_CODEC_CPR_MAX_SVS2_STEP, 0x08 }, - { WCD934X_CODEC_CPR_CTL, 0x00 }, - { WCD934X_CODEC_CPR_SW_MODECHNG_STATUS, 0x00 }, - { WCD934X_CODEC_CPR_SW_MODECHNG_START, 0x00 }, - { WCD934X_CODEC_CPR_CPR_STATUS, 0x00 }, - { WCD934X_PAGE128_PAGE_REGISTER, 0x00 }, - { WCD934X_TLMM_BIST_MODE_PINCFG, 0x00 }, - { WCD934X_TLMM_RF_PA_ON_PINCFG, 0x00 }, - { WCD934X_TLMM_INTR1_PINCFG, 0x00 }, - { WCD934X_TLMM_INTR2_PINCFG, 0x00 }, - { WCD934X_TLMM_SWR_DATA_PINCFG, 0x00 }, - { WCD934X_TLMM_SWR_CLK_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_2_SCK_PINCFG, 0x00 }, - { WCD934X_TLMM_SLIMBUS_DATA1_PINCFG, 0x00 }, - { WCD934X_TLMM_SLIMBUS_DATA2_PINCFG, 0x00 }, - { WCD934X_TLMM_SLIMBUS_CLK_PINCFG, 0x00 }, - { WCD934X_TLMM_I2C_CLK_PINCFG, 0x00 }, - { WCD934X_TLMM_I2C_DATA_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_0_RX_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_0_TX_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_0_SCK_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_0_WS_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_1_RX_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_1_TX_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_1_SCK_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_1_WS_PINCFG, 0x00 }, - { WCD934X_TLMM_DMIC1_CLK_PINCFG, 0x00 }, - { WCD934X_TLMM_DMIC1_DATA_PINCFG, 0x00 }, - { WCD934X_TLMM_DMIC2_CLK_PINCFG, 0x00 }, - { WCD934X_TLMM_DMIC2_DATA_PINCFG, 0x00 }, - { WCD934X_TLMM_DMIC3_CLK_PINCFG, 0x00 }, - { WCD934X_TLMM_DMIC3_DATA_PINCFG, 0x00 }, - { WCD934X_TLMM_JTCK_PINCFG, 0x00 }, - { WCD934X_TLMM_GPIO1_PINCFG, 0x00 }, - { WCD934X_TLMM_GPIO2_PINCFG, 0x00 }, - { WCD934X_TLMM_GPIO3_PINCFG, 0x00 }, - { WCD934X_TLMM_GPIO4_PINCFG, 0x00 }, - { WCD934X_TLMM_SPI_S_CSN_PINCFG, 0x00 }, - { WCD934X_TLMM_SPI_S_CLK_PINCFG, 0x00 }, - { WCD934X_TLMM_SPI_S_DOUT_PINCFG, 0x00 }, - { WCD934X_TLMM_SPI_S_DIN_PINCFG, 0x00 }, - { WCD934X_TLMM_BA_N_PINCFG, 0x00 }, - { WCD934X_TLMM_GPIO0_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_2_RX_PINCFG, 0x00 }, - { WCD934X_TLMM_I2S_2_WS_PINCFG, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_OE_0, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_OE_1, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_OE_2, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_OE_3, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_OE_4, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_DATA_0, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_DATA_1, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_DATA_2, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_DATA_3, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_CTL_DATA_4, 0x00 }, - { WCD934X_TEST_DEBUG_PAD_DRVCTL_0, 0x00 }, - { WCD934X_TEST_DEBUG_PAD_DRVCTL_1, 0x00 }, - { WCD934X_TEST_DEBUG_PIN_STATUS, 0x00 }, - { WCD934X_TEST_DEBUG_NPL_DLY_TEST_1, 0x10 }, - { WCD934X_TEST_DEBUG_NPL_DLY_TEST_2, 0x60 }, - { WCD934X_TEST_DEBUG_MEM_CTRL, 0x00 }, - { WCD934X_TEST_DEBUG_DEBUG_BUS_SEL, 0x00 }, - { WCD934X_TEST_DEBUG_DEBUG_JTAG, 0x00 }, - { WCD934X_TEST_DEBUG_DEBUG_EN_1, 0x00 }, - { WCD934X_TEST_DEBUG_DEBUG_EN_2, 0x00 }, - { WCD934X_TEST_DEBUG_DEBUG_EN_3, 0x00 }, - { WCD934X_TEST_DEBUG_DEBUG_EN_4, 0x00 }, - { WCD934X_TEST_DEBUG_DEBUG_EN_5, 0x00 }, - { WCD934X_TEST_DEBUG_ANA_DTEST_DIR, 0x00 }, - { WCD934X_TEST_DEBUG_PAD_INP_DISABLE_0, 0x00 }, - { WCD934X_TEST_DEBUG_PAD_INP_DISABLE_1, 0x00 }, - { WCD934X_TEST_DEBUG_PAD_INP_DISABLE_2, 0x00 }, - { WCD934X_TEST_DEBUG_PAD_INP_DISABLE_3, 0x00 }, - { WCD934X_TEST_DEBUG_PAD_INP_DISABLE_4, 0x00 }, - { WCD934X_TEST_DEBUG_SYSMEM_CTRL, 0x00 }, - { WCD934X_TEST_DEBUG_SOC_SW_PWR_SEQ_DELAY, 0x00 }, - { WCD934X_TEST_DEBUG_LVAL_NOM_LOW, 0x96 }, - { WCD934X_TEST_DEBUG_LVAL_NOM_HIGH, 0x00 }, - { WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_LOW, 0x53 }, - { WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_HIGH, 0x00 }, - { WCD934X_TEST_DEBUG_SPI_SLAVE_CHAR, 0x00 }, - { WCD934X_TEST_DEBUG_CODEC_DIAGS, 0x00 }, -}; - -/* - * wcd934x_regmap_register_patch: Update register defaults based on version - * @regmap: handle to wcd9xxx regmap - * @version: wcd934x version - * - * Returns error code in case of failure or 0 for success - */ -int wcd934x_regmap_register_patch(struct regmap *regmap, int revision) -{ - int rc = 0; - - if (!regmap) { - pr_err("%s: regmap struct is NULL\n", __func__); - return -EINVAL; - } - - switch (revision) { - case TAVIL_VERSION_1_1: - case TAVIL_VERSION_WCD9340_1_1: - case TAVIL_VERSION_WCD9341_1_1: - regcache_cache_only(regmap, true); - rc = regmap_multi_reg_write(regmap, wcd934x_1_1_defaults, - ARRAY_SIZE(wcd934x_1_1_defaults)); - regcache_cache_only(regmap, false); - break; - } - - return rc; -} -EXPORT_SYMBOL(wcd934x_regmap_register_patch); - -static bool wcd934x_is_readable_register(struct device *dev, unsigned int reg) -{ - u8 pg_num, reg_offset; - const u8 *reg_tbl = NULL; - - /* - * Get the page number from MSB of codec register. If its 0x80, assign - * the corresponding page index PAGE_0x80. - */ - pg_num = reg >> 0x8; - if (pg_num == 0x80) - pg_num = WCD934X_PAGE_0X80; - else if (pg_num == 0x50) - pg_num = WCD934X_PAGE_0x50; - else if (pg_num > 0xF) - return false; - - reg_tbl = wcd934x_reg[pg_num]; - reg_offset = reg & 0xFF; - - if (reg_tbl && reg_tbl[reg_offset]) - return true; - else - return false; -} - -static bool wcd934x_is_volatile_register(struct device *dev, unsigned int reg) -{ - u8 pg_num, reg_offset; - const u8 *reg_tbl = NULL; - - pg_num = reg >> 0x8; - if (pg_num == 0x80) - pg_num = WCD934X_PAGE_0X80; - else if (pg_num == 0x50) - pg_num = WCD934X_PAGE_0x50; - else if (pg_num > 0xF) - return false; - - reg_tbl = wcd934x_reg[pg_num]; - reg_offset = reg & 0xFF; - - if (reg_tbl && reg_tbl[reg_offset] == WCD934X_READ) - return true; - - /* IIR Coeff registers are not cacheable */ - if ((reg >= WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL) && - (reg <= WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL)) - return true; - - if ((reg >= WCD934X_CDC_ANC0_IIR_COEFF_1_CTL) && - (reg <= WCD934X_CDC_ANC0_FB_GAIN_CTL)) - return true; - - if ((reg >= WCD934X_CDC_ANC1_IIR_COEFF_1_CTL) && - (reg <= WCD934X_CDC_ANC1_FB_GAIN_CTL)) - return true; - - if ((reg >= WCD934X_CODEC_CPR_WR_DATA_0) && - (reg <= WCD934X_CODEC_CPR_RD_DATA_3)) - return true; - - /* - * Need to mark volatile for registers that are writable but - * only few bits are read-only - */ - switch (reg) { - case WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL: - case WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0: - case WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_1: - case WCD934X_CPE_SS_CPAR_CTL: - case WCD934X_CPE_SS_STATUS: - case WCD934X_CODEC_RPM_RST_CTL: - case WCD934X_SIDO_NEW_VOUT_A_STARTUP: - case WCD934X_SIDO_NEW_VOUT_D_STARTUP: - case WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL: - case WCD934X_ANA_MBHC_MECH: - case WCD934X_ANA_MBHC_ELECT: - case WCD934X_ANA_MBHC_ZDET: - case WCD934X_ANA_MICB2: - case WCD934X_CODEC_RPM_CLK_MCLK_CFG: - case WCD934X_CLK_SYS_MCLK_PRG: - case WCD934X_CHIP_TIER_CTRL_EFUSE_CTL: - case WCD934X_ANA_BIAS: - case WCD934X_ANA_BUCK_CTL: - case WCD934X_ANA_RCO: - case WCD934X_CODEC_RPM_CLK_GATE: - case WCD934X_BIAS_VBG_FINE_ADJ: - case WCD934X_CODEC_CPR_SVS_CX_VDD: - case WCD934X_CODEC_CPR_SVS2_CX_VDD: - return true; - } - - return false; -} - -struct regmap_config wcd934x_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd934x_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd934x_defaults), - .max_register = WCD934X_MAX_REGISTER, - .volatile_reg = wcd934x_is_volatile_register, - .readable_reg = wcd934x_is_readable_register, - .can_multi_write = true, -}; diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-routing.h b/techpack/audio/asoc/codecs/wcd934x/wcd934x-routing.h deleted file mode 100644 index 8adeef79a7f0..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-routing.h +++ /dev/null @@ -1,1306 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef WCD934X_ROUTING_H -#define WCD934X_ROUTING_H - -#include - -const struct snd_soc_dapm_route tavil_slim_audio_map[] = { - - {"AIF4 MAD", NULL, "AIF4_MAD Mixer"}, - - /* Virtual input widget Mixer SLIMBUS*/ - {"AIF1_CAP Mixer", "SLIM TX0", "SLIM TX0"}, - {"AIF1_CAP Mixer", "SLIM TX1", "SLIM TX1"}, - {"AIF1_CAP Mixer", "SLIM TX2", "SLIM TX2"}, - {"AIF1_CAP Mixer", "SLIM TX3", "SLIM TX3"}, - {"AIF1_CAP Mixer", "SLIM TX4", "SLIM TX4"}, - {"AIF1_CAP Mixer", "SLIM TX5", "SLIM TX5"}, - {"AIF1_CAP Mixer", "SLIM TX6", "SLIM TX6"}, - {"AIF1_CAP Mixer", "SLIM TX7", "SLIM TX7"}, - {"AIF1_CAP Mixer", "SLIM TX8", "SLIM TX8"}, - {"AIF1_CAP Mixer", "SLIM TX9", "SLIM TX9"}, - {"AIF1_CAP Mixer", "SLIM TX10", "SLIM TX10"}, - {"AIF1_CAP Mixer", "SLIM TX11", "SLIM TX11"}, - {"AIF1_CAP Mixer", "SLIM TX13", "SLIM TX13"}, - - {"AIF2_CAP Mixer", "SLIM TX0", "SLIM TX0"}, - {"AIF2_CAP Mixer", "SLIM TX1", "SLIM TX1"}, - {"AIF2_CAP Mixer", "SLIM TX2", "SLIM TX2"}, - {"AIF2_CAP Mixer", "SLIM TX3", "SLIM TX3"}, - {"AIF2_CAP Mixer", "SLIM TX4", "SLIM TX4"}, - {"AIF2_CAP Mixer", "SLIM TX5", "SLIM TX5"}, - {"AIF2_CAP Mixer", "SLIM TX6", "SLIM TX6"}, - {"AIF2_CAP Mixer", "SLIM TX7", "SLIM TX7"}, - {"AIF2_CAP Mixer", "SLIM TX8", "SLIM TX8"}, - {"AIF2_CAP Mixer", "SLIM TX9", "SLIM TX9"}, - {"AIF2_CAP Mixer", "SLIM TX10", "SLIM TX10"}, - {"AIF2_CAP Mixer", "SLIM TX11", "SLIM TX11"}, - {"AIF2_CAP Mixer", "SLIM TX13", "SLIM TX13"}, - - {"AIF3_CAP Mixer", "SLIM TX0", "SLIM TX0"}, - {"AIF3_CAP Mixer", "SLIM TX1", "SLIM TX1"}, - {"AIF3_CAP Mixer", "SLIM TX2", "SLIM TX2"}, - {"AIF3_CAP Mixer", "SLIM TX3", "SLIM TX3"}, - {"AIF3_CAP Mixer", "SLIM TX4", "SLIM TX4"}, - {"AIF3_CAP Mixer", "SLIM TX5", "SLIM TX5"}, - {"AIF3_CAP Mixer", "SLIM TX6", "SLIM TX6"}, - {"AIF3_CAP Mixer", "SLIM TX7", "SLIM TX7"}, - {"AIF3_CAP Mixer", "SLIM TX8", "SLIM TX8"}, - {"AIF3_CAP Mixer", "SLIM TX9", "SLIM TX9"}, - {"AIF3_CAP Mixer", "SLIM TX10", "SLIM TX10"}, - {"AIF3_CAP Mixer", "SLIM TX11", "SLIM TX11"}, - {"AIF3_CAP Mixer", "SLIM TX13", "SLIM TX13"}, - - {"AIF4_MAD Mixer", "SLIM TX13", "SLIM TX13"}, - - /* CDC Tx interface with SLIMBUS */ - {"SLIM TX0", NULL, "CDC_IF TX0 MUX"}, - {"SLIM TX1", NULL, "CDC_IF TX1 MUX"}, - {"SLIM TX2", NULL, "CDC_IF TX2 MUX"}, - {"SLIM TX3", NULL, "CDC_IF TX3 MUX"}, - {"SLIM TX4", NULL, "CDC_IF TX4 MUX"}, - {"SLIM TX5", NULL, "CDC_IF TX5 MUX"}, - {"SLIM TX6", NULL, "CDC_IF TX6 MUX"}, - {"SLIM TX7", NULL, "CDC_IF TX7 MUX"}, - {"SLIM TX8", NULL, "CDC_IF TX8 MUX"}, - {"SLIM TX9", NULL, "CDC_IF TX9 MUX"}, - {"SLIM TX10", NULL, "CDC_IF TX10 MUX"}, - {"SLIM TX11", NULL, "CDC_IF TX11 MUX"}, - {"SLIM TX13", NULL, "CDC_IF TX13 MUX"}, - - {"SLIM RX0 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX1 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX2 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX3 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX4 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX5 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX6 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX7 MUX", "AIF1_PB", "AIF1 PB"}, - - {"SLIM RX0 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX1 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX2 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX3 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX4 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX5 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX6 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX7 MUX", "AIF2_PB", "AIF2 PB"}, - - {"SLIM RX0 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX1 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX2 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX3 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX4 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX5 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX6 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX7 MUX", "AIF3_PB", "AIF3 PB"}, - - {"SLIM RX0 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX1 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX2 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX3 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX4 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX5 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX6 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX7 MUX", "AIF4_PB", "AIF4 PB"}, - - {"SLIM RX0", NULL, "SLIM RX0 MUX"}, - {"SLIM RX1", NULL, "SLIM RX1 MUX"}, - {"SLIM RX2", NULL, "SLIM RX2 MUX"}, - {"SLIM RX3", NULL, "SLIM RX3 MUX"}, - {"SLIM RX4", NULL, "SLIM RX4 MUX"}, - {"SLIM RX5", NULL, "SLIM RX5 MUX"}, - {"SLIM RX6", NULL, "SLIM RX6 MUX"}, - {"SLIM RX7", NULL, "SLIM RX7 MUX"}, - - /* CDC Rx interface with SLIMBUS */ - {"CDC_IF RX0 MUX", "SLIM RX0", "SLIM RX0"}, - {"CDC_IF RX1 MUX", "SLIM RX1", "SLIM RX1"}, - {"CDC_IF RX2 MUX", "SLIM RX2", "SLIM RX2"}, - {"CDC_IF RX3 MUX", "SLIM RX3", "SLIM RX3"}, - {"CDC_IF RX4 MUX", "SLIM RX4", "SLIM RX4"}, - {"CDC_IF RX5 MUX", "SLIM RX5", "SLIM RX5"}, - {"CDC_IF RX6 MUX", "SLIM RX6", "SLIM RX6"}, - {"CDC_IF RX7 MUX", "SLIM RX7", "SLIM RX7"}, - - /* VI Feedback */ - {"AIF4_VI Mixer", "SPKR_VI_1", "VIINPUT"}, - {"AIF4_VI Mixer", "SPKR_VI_2", "VIINPUT"}, - {"AIF4 VI", NULL, "AIF4_VI Mixer"}, - -}; - -const struct snd_soc_dapm_route tavil_i2s_audio_map[] = { - - /* Virtual input widget Mixer I2S*/ - {"AIF1_CAP Mixer", "I2S TX1", "I2S TX1"}, - {"AIF1_CAP Mixer", "I2S TX2", "I2S TX2"}, - {"AIF1_CAP Mixer", "I2S TX3", "I2S TX3"}, - {"AIF1_CAP Mixer", "I2S TX4", "I2S TX4"}, - {"AIF1_CAP Mixer", "I2S TX5", "I2S TX5"}, - {"AIF1_CAP Mixer", "I2S TX6", "I2S TX6"}, - {"AIF1_CAP Mixer", "I2S TX7", "I2S TX7"}, - - {"AIF2_CAP Mixer", "I2S TX8", "I2S TX8"}, - {"AIF2_CAP Mixer", "I2S TX11", "I2S TX11"}, - - {"AIF3_CAP Mixer", "I2S TX0", "I2S TX0"}, - {"AIF3_CAP Mixer", "I2S TX1", "I2S TX1"}, - - /* CDC Tx interface with I2S */ - {"I2S TX0", NULL, "CDC_IF TX0 MUX"}, - {"I2S TX1", NULL, "CDC_IF TX1 MUX"}, - {"I2S TX2", NULL, "CDC_IF TX2 MUX"}, - {"I2S TX3", NULL, "CDC_IF TX3 MUX"}, - {"I2S TX4", NULL, "CDC_IF TX4 MUX"}, - {"I2S TX5", NULL, "CDC_IF TX5 MUX"}, - {"I2S TX6", NULL, "CDC_IF TX6 MUX"}, - {"I2S TX7", NULL, "CDC_IF TX7 MUX"}, - {"I2S TX8", NULL, "CDC_IF TX8 MUX"}, - {"I2S TX11", NULL, "CDC_IF TX11 MUX"}, - - {"I2S RX0 MUX", "AIF1_PB", "AIF1 PB"}, - {"I2S RX1 MUX", "AIF1_PB", "AIF1 PB"}, - {"I2S RX2 MUX", "AIF1_PB", "AIF1 PB"}, - {"I2S RX3 MUX", "AIF1_PB", "AIF1 PB"}, - {"I2S RX4 MUX", "AIF1_PB", "AIF1 PB"}, - {"I2S RX5 MUX", "AIF1_PB", "AIF1 PB"}, - {"I2S RX6 MUX", "AIF1_PB", "AIF1 PB"}, - {"I2S RX7 MUX", "AIF1_PB", "AIF1 PB"}, - - {"I2S RX2 MUX", "AIF2_PB", "AIF2 PB"}, - {"I2S RX3 MUX", "AIF2_PB", "AIF2 PB"}, - - {"I2S RX4 MUX", "AIF3_PB", "AIF3 PB"}, - {"I2S RX5 MUX", "AIF3_PB", "AIF3 PB"}, - - {"I2S RX0", NULL, "I2S RX0 MUX"}, - {"I2S RX1", NULL, "I2S RX1 MUX"}, - {"I2S RX2", NULL, "I2S RX2 MUX"}, - {"I2S RX3", NULL, "I2S RX3 MUX"}, - {"I2S RX4", NULL, "I2S RX4 MUX"}, - {"I2S RX5", NULL, "I2S RX5 MUX"}, - {"I2S RX6", NULL, "I2S RX6 MUX"}, - {"I2S RX7", NULL, "I2S RX7 MUX"}, - - /* CDC Rx interface with I2S */ - {"CDC_IF RX0 MUX", "I2S RX0", "I2S RX0"}, - {"CDC_IF RX1 MUX", "I2S RX1", "I2S RX1"}, - {"CDC_IF RX2 MUX", "I2S RX2", "I2S RX2"}, - {"CDC_IF RX3 MUX", "I2S RX3", "I2S RX3"}, - {"CDC_IF RX4 MUX", "I2S RX4", "I2S RX4"}, - {"CDC_IF RX5 MUX", "I2S RX5", "I2S RX5"}, - {"CDC_IF RX6 MUX", "I2S RX6", "I2S RX6"}, - {"CDC_IF RX7 MUX", "I2S RX7", "I2S RX7"}, - -}; - -const struct snd_soc_dapm_route tavil_audio_map[] = { - - /* - * AIF CAP to Mixer routes are common - * for both SLIM as well as I2S - */ - - /* Virtual input widgets */ - {"AIF1 CAP", NULL, "AIF1_CAP Mixer"}, - {"AIF2 CAP", NULL, "AIF2_CAP Mixer"}, - {"AIF3 CAP", NULL, "AIF3_CAP Mixer"}, - - /* WDMA3 */ - {"WDMA3 PORT0 MUX", "DEC0", "ADC MUX0"}, - {"WDMA3 PORT0 MUX", "RX_MIX_TX0", "RX MIX TX0 MUX"}, - {"WDMA3 PORT1 MUX", "DEC1", "ADC MUX1"}, - {"WDMA3 PORT1 MUX", "RX_MIX_TX1", "RX MIX TX1 MUX"}, - {"WDMA3 PORT2 MUX", "DEC2", "ADC MUX2"}, - {"WDMA3 PORT2 MUX", "RX_MIX_TX2", "RX MIX TX2 MUX"}, - {"WDMA3 PORT3 MUX", "DEC3", "ADC MUX3"}, - {"WDMA3 PORT3 MUX", "RX_MIX_TX3", "RX MIX TX3 MUX"}, - {"WDMA3 PORT4 MUX", "DEC4", "ADC MUX4"}, - {"WDMA3 PORT4 MUX", "RX_MIX_TX4", "RX MIX TX4 MUX"}, - {"WDMA3 PORT5 MUX", "DEC5", "ADC MUX5"}, - {"WDMA3 PORT5 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - {"WDMA3 PORT6 MUX", "DEC6", "ADC MUX6"}, - {"WDMA3 PORT6 MUX", "RX_MIX_TX6", "RX MIX TX6 MUX"}, - - {"WDMA3 CH0 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH0 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH0 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH0 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH0 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH0 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH0 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH0 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH0 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3 CH1 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH1 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH1 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH1 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH1 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH1 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH1 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH1 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH1 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3 CH2 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH2 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH2 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH2 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH2 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH2 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH2 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH2 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH2 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3 CH3 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH3 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH3 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH3 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH3 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH3 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH3 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH3 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH3 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH0 MUX"}, - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH1 MUX"}, - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH2 MUX"}, - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH3 MUX"}, - - {"WDMA3_ON_OFF", "Switch", "WDMA3_CH_MIXER"}, - {"WDMA3_OUT", NULL, "WDMA3_ON_OFF"}, - - /* MAD */ - {"MAD_SEL MUX", "SPE", "MAD_CPE_INPUT"}, - {"MAD_SEL MUX", "MSM", "MADINPUT"}, - - {"MAD_INP MUX", "MAD", "MAD_SEL MUX"}, - {"MAD_INP MUX", "DEC1", "ADC MUX1"}, - - {"MAD_BROADCAST", "Switch", "MAD_INP MUX"}, - {"MAD_CPE1", "Switch", "MAD_INP MUX"}, - {"MAD_CPE2", "Switch", "MAD_INP MUX"}, - - {"MAD_CPE_OUT1", NULL, "MAD_CPE1"}, - {"MAD_CPE_OUT2", NULL, "MAD_CPE2"}, - - {"CDC_IF TX0 MUX", "DEC0", "ADC MUX0"}, - {"CDC_IF TX0 MUX", "RX_MIX_TX0", "RX MIX TX0 MUX"}, - {"CDC_IF TX0 MUX", "DEC0_192", "ADC US MUX0"}, - - {"CDC_IF TX1 MUX", "DEC1", "ADC MUX1"}, - {"CDC_IF TX1 MUX", "RX_MIX_TX1", "RX MIX TX1 MUX"}, - {"CDC_IF TX1 MUX", "DEC1_192", "ADC US MUX1"}, - - {"CDC_IF TX2 MUX", "DEC2", "ADC MUX2"}, - {"CDC_IF TX2 MUX", "RX_MIX_TX2", "RX MIX TX2 MUX"}, - {"CDC_IF TX2 MUX", "DEC2_192", "ADC US MUX2"}, - - {"CDC_IF TX3 MUX", "DEC3", "ADC MUX3"}, - {"CDC_IF TX3 MUX", "RX_MIX_TX3", "RX MIX TX3 MUX"}, - {"CDC_IF TX3 MUX", "DEC3_192", "ADC US MUX3"}, - - {"CDC_IF TX4 MUX", "DEC4", "ADC MUX4"}, - {"CDC_IF TX4 MUX", "RX_MIX_TX4", "RX MIX TX4 MUX"}, - {"CDC_IF TX4 MUX", "DEC4_192", "ADC US MUX4"}, - - {"CDC_IF TX5 MUX", "DEC5", "ADC MUX5"}, - {"CDC_IF TX5 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - {"CDC_IF TX5 MUX", "DEC5_192", "ADC US MUX5"}, - - {"CDC_IF TX6 MUX", "DEC6", "ADC MUX6"}, - {"CDC_IF TX6 MUX", "RX_MIX_TX6", "RX MIX TX6 MUX"}, - {"CDC_IF TX6 MUX", "DEC6_192", "ADC US MUX6"}, - - {"CDC_IF TX7 MUX", "DEC7", "ADC MUX7"}, - {"CDC_IF TX7 MUX", "RX_MIX_TX7", "RX MIX TX7 MUX"}, - {"CDC_IF TX7 MUX", "DEC7_192", "ADC US MUX7"}, - - {"CDC_IF TX8 MUX", "DEC8", "ADC MUX8"}, - {"CDC_IF TX8 MUX", "RX_MIX_TX8", "RX MIX TX8 MUX"}, - {"CDC_IF TX8 MUX", "DEC8_192", "ADC US MUX8"}, - - {"CDC_IF TX9 MUX", "DEC7", "ADC MUX7"}, - {"CDC_IF TX9 MUX", "DEC7_192", "ADC US MUX7"}, - {"CDC_IF TX10 MUX", "DEC6", "ADC MUX6"}, - {"CDC_IF TX10 MUX", "DEC6_192", "ADC US MUX6"}, - - {"CDC_IF TX11 MUX", "DEC_0_5", "CDC_IF TX11 INP1 MUX"}, - {"CDC_IF TX11 MUX", "DEC_9_12", "CDC_IF TX11 INP1 MUX"}, - {"CDC_IF TX11 INP1 MUX", "DEC0", "ADC MUX0"}, - {"CDC_IF TX11 INP1 MUX", "DEC1", "ADC MUX1"}, - {"CDC_IF TX11 INP1 MUX", "DEC2", "ADC MUX2"}, - {"CDC_IF TX11 INP1 MUX", "DEC3", "ADC MUX3"}, - {"CDC_IF TX11 INP1 MUX", "DEC4", "ADC MUX4"}, - {"CDC_IF TX11 INP1 MUX", "DEC5", "ADC MUX5"}, - {"CDC_IF TX11 INP1 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - - {"CDC_IF TX13 MUX", "MAD_BRDCST", "MAD_BROADCAST"}, - {"CDC_IF TX13 MUX", "CDC_DEC_5", "CDC_IF TX13 INP1 MUX"}, - {"CDC_IF TX13 INP1 MUX", "DEC5", "ADC MUX5"}, - {"CDC_IF TX13 INP1 MUX", "DEC5_192", "ADC US MUX5"}, - - {"RX MIX TX0 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX1 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX2 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX3 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX4 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX5 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX6 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX7 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"RX MIX TX8 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX1", "RX INT1 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX2", "RX INT2 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX3", "RX INT3 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX4", "RX INT4 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - - {"ADC US MUX0", "US_Switch", "ADC MUX0"}, - {"ADC US MUX1", "US_Switch", "ADC MUX1"}, - {"ADC US MUX2", "US_Switch", "ADC MUX2"}, - {"ADC US MUX3", "US_Switch", "ADC MUX3"}, - {"ADC US MUX4", "US_Switch", "ADC MUX4"}, - {"ADC US MUX5", "US_Switch", "ADC MUX5"}, - {"ADC US MUX6", "US_Switch", "ADC MUX6"}, - {"ADC US MUX7", "US_Switch", "ADC MUX7"}, - {"ADC US MUX8", "US_Switch", "ADC MUX8"}, - - {"ADC MUX0", "DMIC", "DMIC MUX0"}, - {"ADC MUX0", "AMIC", "AMIC MUX0"}, - {"ADC MUX1", "DMIC", "DMIC MUX1"}, - {"ADC MUX1", "AMIC", "AMIC MUX1"}, - {"ADC MUX2", "DMIC", "DMIC MUX2"}, - {"ADC MUX2", "AMIC", "AMIC MUX2"}, - {"ADC MUX3", "DMIC", "DMIC MUX3"}, - {"ADC MUX3", "AMIC", "AMIC MUX3"}, - {"ADC MUX4", "DMIC", "DMIC MUX4"}, - {"ADC MUX4", "AMIC", "AMIC MUX4"}, - {"ADC MUX5", "DMIC", "DMIC MUX5"}, - {"ADC MUX5", "AMIC", "AMIC MUX5"}, - {"ADC MUX6", "DMIC", "DMIC MUX6"}, - {"ADC MUX6", "AMIC", "AMIC MUX6"}, - {"ADC MUX7", "DMIC", "DMIC MUX7"}, - {"ADC MUX7", "AMIC", "AMIC MUX7"}, - {"ADC MUX8", "DMIC", "DMIC MUX8"}, - {"ADC MUX8", "AMIC", "AMIC MUX8"}, - {"ADC MUX10", "DMIC", "DMIC MUX10"}, - {"ADC MUX10", "AMIC", "AMIC MUX10"}, - {"ADC MUX11", "DMIC", "DMIC MUX11"}, - {"ADC MUX11", "AMIC", "AMIC MUX11"}, - {"ADC MUX12", "DMIC", "DMIC MUX12"}, - {"ADC MUX12", "AMIC", "AMIC MUX12"}, - {"ADC MUX13", "DMIC", "DMIC MUX13"}, - {"ADC MUX13", "AMIC", "AMIC MUX13"}, - - {"ADC MUX0", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX0", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX0", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX0", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX1", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX1", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX1", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX1", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX2", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX2", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX2", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX2", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX3", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX3", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX3", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX3", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX4", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX4", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX4", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX4", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX5", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX5", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX5", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX5", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX6", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX6", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX6", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX6", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX7", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX7", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX7", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX7", "ANC_FB_TUNE2", "ADC MUX13"}, - {"ADC MUX8", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX8", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX8", "ANC_FB_TUNE2", "ADC MUX12"}, - {"ADC MUX8", "ANC_FB_TUNE2", "ADC MUX13"}, - - {"DMIC MUX0", "DMIC0", "DMIC0"}, - {"DMIC MUX0", "DMIC1", "DMIC1"}, - {"DMIC MUX0", "DMIC2", "DMIC2"}, - {"DMIC MUX0", "DMIC3", "DMIC3"}, - {"DMIC MUX0", "DMIC4", "DMIC4"}, - {"DMIC MUX0", "DMIC5", "DMIC5"}, - {"AMIC MUX0", "ADC1", "ADC1"}, - {"AMIC MUX0", "ADC2", "ADC2"}, - {"AMIC MUX0", "ADC3", "ADC3"}, - {"AMIC MUX0", "ADC4", "ADC4"}, - - {"DMIC MUX1", "DMIC0", "DMIC0"}, - {"DMIC MUX1", "DMIC1", "DMIC1"}, - {"DMIC MUX1", "DMIC2", "DMIC2"}, - {"DMIC MUX1", "DMIC3", "DMIC3"}, - {"DMIC MUX1", "DMIC4", "DMIC4"}, - {"DMIC MUX1", "DMIC5", "DMIC5"}, - {"AMIC MUX1", "ADC1", "ADC1"}, - {"AMIC MUX1", "ADC2", "ADC2"}, - {"AMIC MUX1", "ADC3", "ADC3"}, - {"AMIC MUX1", "ADC4", "ADC4"}, - - {"DMIC MUX2", "DMIC0", "DMIC0"}, - {"DMIC MUX2", "DMIC1", "DMIC1"}, - {"DMIC MUX2", "DMIC2", "DMIC2"}, - {"DMIC MUX2", "DMIC3", "DMIC3"}, - {"DMIC MUX2", "DMIC4", "DMIC4"}, - {"DMIC MUX2", "DMIC5", "DMIC5"}, - {"AMIC MUX2", "ADC1", "ADC1"}, - {"AMIC MUX2", "ADC2", "ADC2"}, - {"AMIC MUX2", "ADC3", "ADC3"}, - {"AMIC MUX2", "ADC4", "ADC4"}, - - {"DMIC MUX3", "DMIC0", "DMIC0"}, - {"DMIC MUX3", "DMIC1", "DMIC1"}, - {"DMIC MUX3", "DMIC2", "DMIC2"}, - {"DMIC MUX3", "DMIC3", "DMIC3"}, - {"DMIC MUX3", "DMIC4", "DMIC4"}, - {"DMIC MUX3", "DMIC5", "DMIC5"}, - {"AMIC MUX3", "ADC1", "ADC1"}, - {"AMIC MUX3", "ADC2", "ADC2"}, - {"AMIC MUX3", "ADC3", "ADC3"}, - {"AMIC MUX3", "ADC4", "ADC4"}, - - {"DMIC MUX4", "DMIC0", "DMIC0"}, - {"DMIC MUX4", "DMIC1", "DMIC1"}, - {"DMIC MUX4", "DMIC2", "DMIC2"}, - {"DMIC MUX4", "DMIC3", "DMIC3"}, - {"DMIC MUX4", "DMIC4", "DMIC4"}, - {"DMIC MUX4", "DMIC5", "DMIC5"}, - {"AMIC MUX4", "ADC1", "ADC1"}, - {"AMIC MUX4", "ADC2", "ADC2"}, - {"AMIC MUX4", "ADC3", "ADC3"}, - {"AMIC MUX4", "ADC4", "ADC4"}, - - {"DMIC MUX5", "DMIC0", "DMIC0"}, - {"DMIC MUX5", "DMIC1", "DMIC1"}, - {"DMIC MUX5", "DMIC2", "DMIC2"}, - {"DMIC MUX5", "DMIC3", "DMIC3"}, - {"DMIC MUX5", "DMIC4", "DMIC4"}, - {"DMIC MUX5", "DMIC5", "DMIC5"}, - {"AMIC MUX5", "ADC1", "ADC1"}, - {"AMIC MUX5", "ADC2", "ADC2"}, - {"AMIC MUX5", "ADC3", "ADC3"}, - {"AMIC MUX5", "ADC4", "ADC4"}, - - {"DMIC MUX6", "DMIC0", "DMIC0"}, - {"DMIC MUX6", "DMIC1", "DMIC1"}, - {"DMIC MUX6", "DMIC2", "DMIC2"}, - {"DMIC MUX6", "DMIC3", "DMIC3"}, - {"DMIC MUX6", "DMIC4", "DMIC4"}, - {"DMIC MUX6", "DMIC5", "DMIC5"}, - {"AMIC MUX6", "ADC1", "ADC1"}, - {"AMIC MUX6", "ADC2", "ADC2"}, - {"AMIC MUX6", "ADC3", "ADC3"}, - {"AMIC MUX6", "ADC4", "ADC4"}, - - {"DMIC MUX7", "DMIC0", "DMIC0"}, - {"DMIC MUX7", "DMIC1", "DMIC1"}, - {"DMIC MUX7", "DMIC2", "DMIC2"}, - {"DMIC MUX7", "DMIC3", "DMIC3"}, - {"DMIC MUX7", "DMIC4", "DMIC4"}, - {"DMIC MUX7", "DMIC5", "DMIC5"}, - {"AMIC MUX7", "ADC1", "ADC1"}, - {"AMIC MUX7", "ADC2", "ADC2"}, - {"AMIC MUX7", "ADC3", "ADC3"}, - {"AMIC MUX7", "ADC4", "ADC4"}, - - {"DMIC MUX8", "DMIC0", "DMIC0"}, - {"DMIC MUX8", "DMIC1", "DMIC1"}, - {"DMIC MUX8", "DMIC2", "DMIC2"}, - {"DMIC MUX8", "DMIC3", "DMIC3"}, - {"DMIC MUX8", "DMIC4", "DMIC4"}, - {"DMIC MUX8", "DMIC5", "DMIC5"}, - {"AMIC MUX8", "ADC1", "ADC1"}, - {"AMIC MUX8", "ADC2", "ADC2"}, - {"AMIC MUX8", "ADC3", "ADC3"}, - {"AMIC MUX8", "ADC4", "ADC4"}, - - {"DMIC MUX10", "DMIC0", "DMIC0"}, - {"DMIC MUX10", "DMIC1", "DMIC1"}, - {"DMIC MUX10", "DMIC2", "DMIC2"}, - {"DMIC MUX10", "DMIC3", "DMIC3"}, - {"DMIC MUX10", "DMIC4", "DMIC4"}, - {"DMIC MUX10", "DMIC5", "DMIC5"}, - {"AMIC MUX10", "ADC1", "ADC1"}, - {"AMIC MUX10", "ADC2", "ADC2"}, - {"AMIC MUX10", "ADC3", "ADC3"}, - {"AMIC MUX10", "ADC4", "ADC4"}, - - {"DMIC MUX11", "DMIC0", "DMIC0"}, - {"DMIC MUX11", "DMIC1", "DMIC1"}, - {"DMIC MUX11", "DMIC2", "DMIC2"}, - {"DMIC MUX11", "DMIC3", "DMIC3"}, - {"DMIC MUX11", "DMIC4", "DMIC4"}, - {"DMIC MUX11", "DMIC5", "DMIC5"}, - {"AMIC MUX11", "ADC1", "ADC1"}, - {"AMIC MUX11", "ADC2", "ADC2"}, - {"AMIC MUX11", "ADC3", "ADC3"}, - {"AMIC MUX11", "ADC4", "ADC4"}, - - {"DMIC MUX12", "DMIC0", "DMIC0"}, - {"DMIC MUX12", "DMIC1", "DMIC1"}, - {"DMIC MUX12", "DMIC2", "DMIC2"}, - {"DMIC MUX12", "DMIC3", "DMIC3"}, - {"DMIC MUX12", "DMIC4", "DMIC4"}, - {"DMIC MUX12", "DMIC5", "DMIC5"}, - {"AMIC MUX12", "ADC1", "ADC1"}, - {"AMIC MUX12", "ADC2", "ADC2"}, - {"AMIC MUX12", "ADC3", "ADC3"}, - {"AMIC MUX12", "ADC4", "ADC4"}, - - {"DMIC MUX13", "DMIC0", "DMIC0"}, - {"DMIC MUX13", "DMIC1", "DMIC1"}, - {"DMIC MUX13", "DMIC2", "DMIC2"}, - {"DMIC MUX13", "DMIC3", "DMIC3"}, - {"DMIC MUX13", "DMIC4", "DMIC4"}, - {"DMIC MUX13", "DMIC5", "DMIC5"}, - {"AMIC MUX13", "ADC1", "ADC1"}, - {"AMIC MUX13", "ADC2", "ADC2"}, - {"AMIC MUX13", "ADC3", "ADC3"}, - {"AMIC MUX13", "ADC4", "ADC4"}, - - {"AMIC4_5 SEL", "AMIC4", "AMIC4"}, - {"AMIC4_5 SEL", "AMIC5", "AMIC5"}, - - {"ADC1", NULL, "AMIC1"}, - {"ADC2", NULL, "AMIC2"}, - {"ADC3", NULL, "AMIC3"}, - {"ADC4", NULL, "AMIC4_5 SEL"}, - - {"RX INT0_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT0_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT1_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT1_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT1_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT1_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT1_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT1_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT1_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT1_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT1_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT1_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT1_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT1_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT1_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT1_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT1_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT1_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT1_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT1_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT1_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT1_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT1_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT1_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT1_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT2_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT2_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT2_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT2_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT2_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT2_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT2_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT2_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT2_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT2_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT2_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT2_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT2_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT2_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT2_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT2_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT2_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT2_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT2_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT2_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT2_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT2_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT3_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT3_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT3_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT3_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT3_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT3_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT3_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT3_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT3_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT3_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT3_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT3_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT3_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT3_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT3_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT3_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT3_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT3_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT3_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT3_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT3_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT3_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT3_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT3_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT3_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT3_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT3_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT3_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT3_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT3_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT4_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT4_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT4_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT4_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT4_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT4_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT4_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT4_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT4_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT4_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT4_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT4_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT4_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT4_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT4_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT4_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT4_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT4_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT4_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT4_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT4_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT4_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT4_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT4_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT4_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT4_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT4_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT4_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT4_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT4_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT7_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT7_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT7_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT8_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP0", "IIR1", "IIR1"}, - {"RX INT8_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP1", "IIR1", "IIR1"}, - {"RX INT8_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_1 MIX1 INP2", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP2", "IIR1", "IIR1"}, - - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"}, - {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"}, - {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"}, - {"RX INT3_1 MIX1", NULL, "RX INT3_1 MIX1 INP0"}, - {"RX INT3_1 MIX1", NULL, "RX INT3_1 MIX1 INP1"}, - {"RX INT3_1 MIX1", NULL, "RX INT3_1 MIX1 INP2"}, - {"RX INT4_1 MIX1", NULL, "RX INT4_1 MIX1 INP0"}, - {"RX INT4_1 MIX1", NULL, "RX INT4_1 MIX1 INP1"}, - {"RX INT4_1 MIX1", NULL, "RX INT4_1 MIX1 INP2"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP0"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP1"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP2"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP0"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP1"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP2"}, - - /* Mixing path INT0 */ - {"RX INT0_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"}, - - /* Mixing path INT1 */ - {"RX INT1_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT1_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT1_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT1_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT1_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT1_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT1_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT1_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"}, - {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"}, - - /* Mixing path INT2 */ - {"RX INT2_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT2_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT2_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT2_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT2_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT2_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT2_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT2_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"}, - {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"}, - - /* Mixing path INT3 */ - {"RX INT3_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT3_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT3_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT3_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT3_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT3_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT3_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT3_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT3_2 INTERP", NULL, "RX INT3_2 MUX"}, - {"RX INT3 SEC MIX", NULL, "RX INT3_2 INTERP"}, - - /* Mixing path INT4 */ - {"RX INT4_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT4_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT4_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT4_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT4_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT4_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT4_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT4_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT4_2 INTERP", NULL, "RX INT4_2 MUX"}, - {"RX INT4 SEC MIX", NULL, "RX INT4_2 INTERP"}, - - /* Mixing path INT7 */ - {"RX INT7_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_2 INTERP", NULL, "RX INT7_2 MUX"}, - {"RX INT7 SEC MIX", NULL, "RX INT7_2 INTERP"}, - - /* Mixing path INT8 */ - {"RX INT8_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_2 INTERP", NULL, "RX INT8_2 MUX"}, - {"RX INT8 SEC MIX", NULL, "RX INT8_2 INTERP"}, - - {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"}, - {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"}, - {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"}, - {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"}, - {"RX INT0 DAC", NULL, "RX INT0 DEM MUX"}, - {"RX INT0 DAC", NULL, "RX_BIAS"}, - {"EAR PA", NULL, "RX INT0 DAC"}, - {"EAR", NULL, "EAR PA"}, - - {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"}, - {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"}, - {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"}, - {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"}, - {"RX INT1 MIX3", NULL, "RX INT1 MIX2"}, - {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX3"}, - {"RX INT1 DAC", NULL, "RX INT1 DEM MUX"}, - {"RX INT1 DAC", NULL, "RX_BIAS"}, - {"HPHL PA", NULL, "RX INT1 DAC"}, - {"HPHL", NULL, "HPHL PA"}, - - {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"}, - {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"}, - {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"}, - {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"}, - {"RX INT2 MIX3", NULL, "RX INT2 MIX2"}, - {"RX INT2 DEM MUX", "CLSH_DSM_OUT", "RX INT2 MIX3"}, - {"RX INT2 DAC", NULL, "RX INT2 DEM MUX"}, - {"RX INT2 DAC", NULL, "RX_BIAS"}, - {"HPHR PA", NULL, "RX INT2 DAC"}, - {"HPHR", NULL, "HPHR PA"}, - - {"RX INT3_1 INTERP", NULL, "RX INT3_1 MIX1"}, - {"RX INT3 SEC MIX", NULL, "RX INT3_1 INTERP"}, - {"RX INT3 MIX2", NULL, "RX INT3 SEC MIX"}, - {"RX INT3 MIX2", NULL, "RX INT3 MIX2 INP"}, - {"RX INT3 MIX3", NULL, "RX INT3 MIX2"}, - {"RX INT3 DAC", NULL, "RX INT3 MIX3"}, - {"RX INT3 DAC", NULL, "RX_BIAS"}, - {"LINEOUT1 PA", NULL, "RX INT3 DAC"}, - {"LINEOUT1", NULL, "LINEOUT1 PA"}, - - {"RX INT4_1 INTERP", NULL, "RX INT4_1 MIX1"}, - {"RX INT4 SEC MIX", NULL, "RX INT4_1 INTERP"}, - {"RX INT4 SEC MIX", NULL, "RX INT4_1 MIX1"}, - {"RX INT4 MIX2", NULL, "RX INT4 SEC MIX"}, - {"RX INT4 MIX2", NULL, "RX INT4 MIX2 INP"}, - {"RX INT4 MIX3", NULL, "RX INT4 MIX2"}, - {"RX INT4 DAC", NULL, "RX INT4 MIX3"}, - {"RX INT4 DAC", NULL, "RX_BIAS"}, - {"LINEOUT2 PA", NULL, "RX INT4 DAC"}, - {"LINEOUT2", NULL, "LINEOUT2 PA"}, - - {"RX INT7_1 INTERP", NULL, "RX INT7_1 MIX1"}, - {"RX INT7 SEC MIX", NULL, "RX INT7_1 INTERP"}, - {"RX INT7 MIX2", NULL, "RX INT7 SEC MIX"}, - {"RX INT7 MIX2", NULL, "RX INT7 MIX2 INP"}, - {"RX INT7 CHAIN", NULL, "RX INT7 MIX2"}, - {"RX INT7 CHAIN", NULL, "RX_BIAS"}, - {"SPK1 OUT", NULL, "RX INT7 CHAIN"}, - - {"RX INT8_1 INTERP", NULL, "RX INT8_1 MIX1"}, - {"RX INT8 SEC MIX", NULL, "RX INT8_1 INTERP"}, - {"RX INT8 SEC MIX", NULL, "RX INT8_1 MIX1"}, - {"RX INT8 CHAIN", NULL, "RX INT8 SEC MIX"}, - {"RX INT8 CHAIN", NULL, "RX_BIAS"}, - {"SPK2 OUT", NULL, "RX INT8 CHAIN"}, - - /* ANC Routing */ - {"ANC0 FB MUX", "ANC_IN_EAR", "RX INT0 MIX2"}, - {"ANC0 FB MUX", "ANC_IN_HPHL", "RX INT1 MIX2"}, - {"ANC0 FB MUX", "ANC_IN_LO1", "RX INT3 MIX2"}, - {"ANC0 FB MUX", "ANC_IN_EAR_SPKR", "RX INT7 MIX2"}, - {"ANC1 FB MUX", "ANC_IN_HPHR", "RX INT2 MIX2"}, - {"ANC1 FB MUX", "ANC_IN_LO2", "RX INT4 MIX2"}, - - {"ANC OUT EAR Enable", "Switch", "ADC MUX10"}, - {"ANC OUT EAR Enable", "Switch", "ADC MUX11"}, - {"RX INT0 MIX2", NULL, "ANC OUT EAR Enable"}, - - {"ANC OUT HPHL Enable", "Switch", "ADC MUX10"}, - {"ANC OUT HPHL Enable", "Switch", "ADC MUX11"}, - {"RX INT1 MIX2", NULL, "ANC OUT HPHL Enable"}, - - {"ANC OUT HPHR Enable", "Switch", "ADC MUX12"}, - {"ANC OUT HPHR Enable", "Switch", "ADC MUX13"}, - {"RX INT2 MIX2", NULL, "ANC OUT HPHR Enable"}, - - {"ANC EAR PA", NULL, "RX INT0 DAC"}, - {"ANC EAR", NULL, "ANC EAR PA"}, - - {"ANC HPHL PA", NULL, "RX INT1 DAC"}, - {"ANC HPHL", NULL, "ANC HPHL PA"}, - - {"ANC HPHR PA", NULL, "RX INT2 DAC"}, - {"ANC HPHR", NULL, "ANC HPHR PA"}, - - {"ANC OUT EAR SPKR Enable", "Switch", "ADC MUX10"}, - {"ANC OUT EAR SPKR Enable", "Switch", "ADC MUX11"}, - {"RX INT7 MIX2", NULL, "ANC OUT EAR SPKR Enable"}, - - {"ANC SPKR PA Enable", "Switch", "RX INT7 CHAIN"}, - {"ANC SPK1 PA", NULL, "ANC SPKR PA Enable"}, - {"SPK1 OUT", NULL, "ANC SPK1 PA"}, - - /* - * SRC0, SRC1 inputs to Sidetone RX Mixer - * on RX0, RX1, RX2, RX3, RX4 and RX7 chains - */ - {"IIR0", NULL, "IIR0 INP0 MUX"}, - {"IIR0 INP0 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP0 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP0 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP0 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP0 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP0 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP0 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP0 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP0 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP0 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP0 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP0 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP0 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP0 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP0 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP0 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP0 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR0", NULL, "IIR0 INP1 MUX"}, - {"IIR0 INP1 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP1 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP1 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP1 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP1 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP1 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP1 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP1 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP1 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP1 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP1 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP1 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP1 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP1 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP1 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP1 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP1 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR0", NULL, "IIR0 INP2 MUX"}, - {"IIR0 INP2 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP2 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP2 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP2 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP2 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP2 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP2 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP2 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP2 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR0", NULL, "IIR0 INP3 MUX"}, - {"IIR0 INP3 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP3 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP3 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP3 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP3 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP3 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP3 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP3 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP3 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP3 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP3 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP3 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP3 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP3 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP3 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP3 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP3 MUX", "RX7", "CDC_IF RX7 MUX"}, - - {"IIR1", NULL, "IIR1 INP0 MUX"}, - {"IIR1 INP0 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP0 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP0 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP0 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP0 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP0 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP0 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP0 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP0 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP0 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR1 INP0 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR1 INP0 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR1 INP0 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR1 INP0 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR1 INP0 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR1 INP0 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR1 INP0 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR1", NULL, "IIR1 INP1 MUX"}, - {"IIR1 INP1 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP1 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP1 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP1 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP1 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP1 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP1 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP1 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP1 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP1 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR1 INP1 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR1 INP1 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR1 INP1 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR1 INP1 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR1 INP1 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR1 INP1 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR1 INP1 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR1", NULL, "IIR1 INP2 MUX"}, - {"IIR1 INP2 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP2 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP2 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP2 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP2 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP2 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP2 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP2 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP2 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR1 INP2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR1 INP2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR1 INP2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR1 INP2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR1 INP2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR1 INP2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR1 INP2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR1", NULL, "IIR1 INP3 MUX"}, - {"IIR1 INP3 MUX", "DEC0", "ADC MUX0"}, - {"IIR1 INP3 MUX", "DEC1", "ADC MUX1"}, - {"IIR1 INP3 MUX", "DEC2", "ADC MUX2"}, - {"IIR1 INP3 MUX", "DEC3", "ADC MUX3"}, - {"IIR1 INP3 MUX", "DEC4", "ADC MUX4"}, - {"IIR1 INP3 MUX", "DEC5", "ADC MUX5"}, - {"IIR1 INP3 MUX", "DEC6", "ADC MUX6"}, - {"IIR1 INP3 MUX", "DEC7", "ADC MUX7"}, - {"IIR1 INP3 MUX", "DEC8", "ADC MUX8"}, - {"IIR1 INP3 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR1 INP3 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR1 INP3 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR1 INP3 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR1 INP3 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR1 INP3 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR1 INP3 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR1 INP3 MUX", "RX7", "CDC_IF RX7 MUX"}, - - {"SRC0", NULL, "IIR0"}, - {"SRC1", NULL, "IIR1"}, - {"RX INT0 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT0 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT1 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT1 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT2 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT2 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT3 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT3 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT4 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT4 MIX2 INP", "SRC1", "SRC1"}, - {"RX INT7 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT7 MIX2 INP", "SRC1", "SRC1"}, - - /* Native clk main path routing */ - {"RX INT1_1 NATIVE MUX", "ON", "RX INT1_1 MIX1"}, - {"RX INT1_1 INTERP", NULL, "RX INT1_1 NATIVE MUX"}, - {"RX INT1_1 NATIVE MUX", NULL, "RX INT1 NATIVE SUPPLY"}, - - {"RX INT2_1 NATIVE MUX", "ON", "RX INT2_1 MIX1"}, - {"RX INT2_1 INTERP", NULL, "RX INT2_1 NATIVE MUX"}, - {"RX INT2_1 NATIVE MUX", NULL, "RX INT2 NATIVE SUPPLY"}, - - {"RX INT3_1 NATIVE MUX", "ON", "RX INT3_1 MIX1"}, - {"RX INT3_1 INTERP", NULL, "RX INT3_1 NATIVE MUX"}, - {"RX INT3_1 NATIVE MUX", NULL, "RX INT3 NATIVE SUPPLY"}, - - {"RX INT4_1 NATIVE MUX", "ON", "RX INT4_1 MIX1"}, - {"RX INT4_1 INTERP", NULL, "RX INT4_1 NATIVE MUX"}, - {"RX INT4_1 NATIVE MUX", NULL, "RX INT4 NATIVE SUPPLY"}, - - /* Native clk mix path routing */ - {"RX INT1_2 NATIVE MUX", "ON", "RX INT1_2 MUX"}, - {"RX INT1_2 INTERP", NULL, "RX INT1_2 NATIVE MUX"}, - {"RX INT1_2 NATIVE MUX", NULL, "RX INT1 NATIVE SUPPLY"}, - - {"RX INT2_2 NATIVE MUX", "ON", "RX INT2_2 MUX"}, - {"RX INT2_2 INTERP", NULL, "RX INT2_2 NATIVE MUX"}, - {"RX INT2_2 NATIVE MUX", NULL, "RX INT2 NATIVE SUPPLY"}, - - {"RX INT3_2 NATIVE MUX", "ON", "RX INT3_2 MUX"}, - {"RX INT3_2 INTERP", NULL, "RX INT3_2 NATIVE MUX"}, - {"RX INT3_2 NATIVE MUX", NULL, "RX INT3 NATIVE SUPPLY"}, - - {"RX INT4_2 NATIVE MUX", "ON", "RX INT4_2 MUX"}, - {"RX INT4_2 INTERP", NULL, "RX INT4_2 NATIVE MUX"}, - {"RX INT4_2 NATIVE MUX", NULL, "RX INT4 NATIVE SUPPLY"}, - - {"RX INT7_2 NATIVE MUX", "ON", "RX INT7_2 MUX"}, - {"RX INT7_2 INTERP", NULL, "RX INT7_2 NATIVE MUX"}, - {"RX INT7_2 NATIVE MUX", NULL, "RX INT7 NATIVE SUPPLY"}, - - {"RX INT8_2 NATIVE MUX", "ON", "RX INT8_2 MUX"}, - {"RX INT8_2 INTERP", NULL, "RX INT8_2 NATIVE MUX"}, - {"RX INT8_2 NATIVE MUX", NULL, "RX INT8 NATIVE SUPPLY"}, - - /* ASRC Routing */ - {"ASRC0 MUX", "ASRC_IN_HPHL", "RX INT1_2 INTERP"}, - {"RX INT1 SEC MIX", "HPHL Switch", "ASRC0 MUX"}, - - {"ASRC1 MUX", "ASRC_IN_HPHR", "RX INT2_2 INTERP"}, - {"RX INT2 SEC MIX", "HPHR Switch", "ASRC1 MUX"}, - - {"ASRC0 MUX", "ASRC_IN_LO1", "RX INT3_2 INTERP"}, - {"RX INT3 SEC MIX", "LO1 Switch", "ASRC0 MUX"}, - - {"ASRC1 MUX", "ASRC_IN_LO2", "RX INT4_2 INTERP"}, - {"RX INT4 SEC MIX", "LO2 Switch", "ASRC1 MUX"}, - - {"ASRC2 MUX", "ASRC_IN_SPKR1", "RX INT7_2 INTERP"}, - {"RX INT7 SEC MIX", NULL, "ASRC2 MUX"}, - - {"ASRC3 MUX", "ASRC_IN_SPKR2", "RX INT8_2 INTERP"}, - {"RX INT8 SEC MIX", NULL, "ASRC3 MUX"}, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x-tables.c b/techpack/audio/asoc/codecs/wcd934x/wcd934x-tables.c deleted file mode 100644 index 4e6c2fb2a1cc..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x-tables.c +++ /dev/null @@ -1,2155 +0,0 @@ -/* - * Copyright (c) 2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -#define WCD934X_REG(reg) ((reg) & 0xFF) - -const u8 wcd934x_page0_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE0_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_RPM_CLK_BYPASS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_RPM_CLK_GATE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_RPM_CLK_MCLK_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_RPM_CLK_MCLK2_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_RPM_I2S_DSD_CLK_SEL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_RPM_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_TEST0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_TEST1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT4)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT5)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT6)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT7)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT8)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT9)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT10)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT11)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT12)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT13)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT15)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_EFUSE_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_SLNQ_WAIT_STATE_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_I2C_ACTIVE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_ALT_FUNC_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_GPIO_CTL_OE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CHIP_TIER_CTRL_GPIO_CTL_DATA)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX0_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX1_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX2_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX3_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX4_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX5_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX6_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_RX7_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX0_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX1_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX2_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX3_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX4_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX5_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX6_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX7_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX8_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX9_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX10_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX11_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX13_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX14_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_SB_TX15_INP_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_TX0_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_TX1_0_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_TX1_1_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_0_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_1_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_2_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_3_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_CLKSRC_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_COMMON_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_0_TDM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DATA_HUB_I2S_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_DMA_RDMA_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_RDMA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_RDMA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_RDMA_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_RDMA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_RDMA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_RDMA_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_RDMA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_RDMA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_RDMA_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_RDMA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_RDMA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_RDMA_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_RDMA_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_RDMA_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_RDMA4_PRT_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_RDMA_SBTX0_7_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_RDMA_SBTX8_11_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_4_5_CFG_WDMA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_WDMA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_WDMA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_4_5_CFG_WDMA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_WDMA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_WDMA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_4_5_CFG_WDMA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_WDMA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_WDMA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_4_5_CFG_WDMA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_WDMA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_WDMA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_4_5_CFG_WDMA_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_2_3_CFG_WDMA_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_CH_0_1_CFG_WDMA_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA0_PRT_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA3_PRT_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA4_PRT0_3_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DMA_WDMA4_PRT4_7_CFG)] = WCD934X_READ_WRITE, -}; - -const u8 wcd934x_page1_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE1_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_USER_CTL_9)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_L_VAL_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_L_VAL_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_DSM_FRAC_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_DSM_FRAC_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_CONFIG_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_CONFIG_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_CONFIG_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_CONFIG_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_CONFIG_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_TEST_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_FREQ_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_FREQ_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_FREQ_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_FREQ_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_SSC_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_SSC_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_SSC_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_SSC_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_FLL_MODE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_FLL_STATUS_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CPE_FLL_STATUS_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CPE_FLL_STATUS_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CPE_FLL_STATUS_3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_USER_CTL_9)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_L_VAL_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_L_VAL_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_DSM_FRAC_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_DSM_FRAC_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_CONFIG_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_CONFIG_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_CONFIG_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_CONFIG_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_CONFIG_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_TEST_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_FREQ_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_FREQ_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_FREQ_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_FREQ_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_SSC_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_SSC_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_SSC_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_SSC_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_FLL_MODE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_I2S_FLL_STATUS_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_I2S_FLL_STATUS_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_I2S_FLL_STATUS_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_I2S_FLL_STATUS_3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_USER_CTL_9)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_L_VAL_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_L_VAL_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_DSM_FRAC_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_DSM_FRAC_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_CONFIG_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_CONFIG_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_CONFIG_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_CONFIG_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_CONFIG_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_TEST_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_FREQ_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_FREQ_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_FREQ_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_FREQ_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_SSC_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_SSC_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_SSC_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_SSC_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_FLL_MODE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SB_FLL_STATUS_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SB_FLL_STATUS_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SB_FLL_STATUS_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SB_FLL_STATUS_3)] = WCD934X_READ, -}; - -const u8 wcd934x_page2_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE2_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_CPE_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPEFLL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_OVERRIDE)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_US_BUF_INT_PERIOD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SVA_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_US_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_MAD_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_CPAR_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_DMIC0_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_DMIC1_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_DMIC2_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_DMIC_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_CPAR_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_WDOG_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_BACKUP_INT)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_STATUS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_CPE_OCD_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_MASK_1A)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_MASK_1B)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0A)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0B)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1A)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0A)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0B)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1A)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1B)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_MAIN_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_MAIN_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_CTL_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_IIR_CTL_PTR)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_AUDIO_IIR_CTL_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_ULTR_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_ULTR_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_ULTR_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_ULTR_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_ULTR_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_ULTR_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_ULTR_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_CTL_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_IIR_CTL_PTR)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_BEACON_IIR_CTL_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SOC_MAD_INP_SEL)] = WCD934X_READ_WRITE, -}; - -const u8 wcd934x_page4_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE4_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_CLR_COMMIT)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_MASK0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_MASK1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_MASK2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_MASK3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_STATUS0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_PIN1_STATUS1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_PIN1_STATUS2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_PIN1_STATUS3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_PIN1_CLEAR0)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_CLEAR1)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_CLEAR2)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN1_CLEAR3)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN2_MASK3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_PIN2_STATUS3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_PIN2_CLEAR3)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_CPESS_SUMRY_MASK2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_CPESS_SUMRY_MASK3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_CPESS_SUMRY_STATUS2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_CPESS_SUMRY_STATUS3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_CPESS_SUMRY_CLEAR2)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_CPESS_SUMRY_CLEAR3)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_INTR_LEVEL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_LEVEL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_LEVEL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_LEVEL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_BYPASS0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_BYPASS1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_BYPASS2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_BYPASS3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_SET0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_SET1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_SET2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_SET3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_CODEC_MISC_MASK)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_INTR_CODEC_MISC_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_INTR_CODEC_MISC_CLEAR)] = WCD934X_WRITE, -}; - -const u8 wcd934x_page5_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE5_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_DEVICE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_REVISION)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_H_COMMAND)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_MASTER_ADDRESS_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_MASTER_ADDRESS_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SLAVE_ADDRESS_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SLAVE_ADDRESS_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_MSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_LSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_MSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_LSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_MSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_LSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_COMM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_FRAME_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH1_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH3_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SW_EVENT_RD)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_SW_EVENT_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_SELECT_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_SELECT_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_SELECT_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_SAMPLING_FREQ)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_SEL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_RAM_CNTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BANK)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_9)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_A)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_B)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_C)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_D)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_E)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_F)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_10)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_11)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_12)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_13)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_14)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_15)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_16)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_17)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_18)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_19)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_1A)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_1B)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_1C)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_1D)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_1E)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_1F)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_20)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_21)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_22)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_23)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_24)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_25)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_26)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_27)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_28)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_29)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_2A)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_2B)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_2C)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_2D)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_2E)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_2F)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_30)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_31)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_32)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_33)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_34)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_35)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_36)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_37)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_38)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_39)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_3A)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_3B)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_3C)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_3D)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_3E)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_SRAM_BYTE_3F)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TOP_CTRL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_TOP_CTRL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_PDM_MUTE_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_DEC_BYPASS_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_DEC_BYPASS_STATUS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_DEC_BYPASS_FS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_DEC_BYPASS_IN_SEL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_GPOUT_ENABLE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_GPOUT_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_ANA_INTERRUPT_MASK)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_ANA_INTERRUPT_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_ANA_INTERRUPT_CLR)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_IP_TESTING)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CNTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CNT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CNT_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CNT_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_MASK0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_MASK1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_MASK2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_MASK3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_MASK4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_STATUS0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_STATUS1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_STATUS2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_STATUS3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_STATUS4)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CLR0)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CLR1)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CLR2)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CLR3)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_SLNQ_DIG_INTERRUPT_CLR4)] = WCD934X_WRITE, -}; - -const u8 wcd934x_page6_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_ANA_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_BIAS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_RCO)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_PAGE6_SPARE2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_PAGE6_SPARE3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_BUCK_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_BUCK_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_ANA_RX_SUPPLIES)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_HPH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_EAR)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_LO_1_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MAD_SETUP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_AMIC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_AMIC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_AMIC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_AMIC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_MECH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_ELECT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_ZDET)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_RESULT_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_ANA_MBHC_RESULT_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_ANA_MBHC_RESULT_3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MBHC_BTN7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MICB1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MICB2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MICB2_RAMP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MICB3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_MICB4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_ANA_VBADC)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BIAS_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BIAS_VBG_FINE_ADJ)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RCO_CTRL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RCO_CTRL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RCO_CAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RCO_CAL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RCO_CAL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RCO_TEST_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RCO_CAL_OUT_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_RCO_CAL_OUT_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_RCO_CAL_OUT_3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_RCO_CAL_OUT_4)] = WCD934X_READ, - [WCD934X_REG(WCD934X_RCO_CAL_OUT_5)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SIDO_MODE_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_MODE_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_MODE_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_MODE_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_VCL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_VCL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_VCL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_9)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CCL_10)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_FILTER_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_FILTER_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_DRIVER_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_DRIVER_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_DRIVER_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CAL_CODE_EXT_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CAL_CODE_EXT_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_CAL_CODE_OUT_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SIDO_CAL_CODE_OUT_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SIDO_TEST_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_TEST_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_CTL_CLK)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_CTL_ANA)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_CTL_SPARE_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_CTL_SPARE_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_CTL_BCS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_STATUS_SPARE_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MBHC_TEST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_SUBBLOCK_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_IBIAS_FE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_BIAS_ADC)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_FE_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_ADC_REF)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_ADC_IO)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_ADC_SAR)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_DEBUG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_LDOH_MODE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_LDOH_BIAS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_LDOH_STB_LOADS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_LDOH_SLOWRAMP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB1_TEST_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB1_TEST_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB1_TEST_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB2_TEST_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB2_TEST_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB2_TEST_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB3_TEST_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB3_TEST_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB3_TEST_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB4_TEST_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB4_TEST_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MICB4_TEST_CTL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_ADC_VCM)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_BIAS_ATEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_ADC_INT1_IB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_ADC_INT2_IB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_TXFE_DIV_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_TXFE_DIV_START)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_TXFE_DIV_STOP_9P6M)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_COM_TXFE_DIV_STOP_12P288M)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_1_2_TEST_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_1_2_ADC_IB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_1_2_ATEST_REFCTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_1_2_TEST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_1_2_TEST_BLK_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_1_2_TXFE_CLKDIV)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_1_2_SAR1_ERR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_TX_1_2_SAR2_ERR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_TX_3_4_TEST_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_3_4_ADC_IB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_3_4_ATEST_REFCTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_3_4_TEST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_3_4_TEST_BLK_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_3_4_TXFE_CLKDIV)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TX_3_4_SAR1_ERR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_TX_3_4_SAR2_ERR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CLASSH_MODE_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_MODE_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_MODE_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_CTRL_VCL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_CTRL_VCL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_CTRL_CCL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_CTRL_CCL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_CTRL_CCL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_CTRL_CCL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_CTRL_CCL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_BUCK_TMUX_A_D)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_BUCK_SW_DRV_CNTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLASSH_SPARE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_8)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEG_CTRL_9)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEGDAC_CTRL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEGDAC_CTRL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_VNEGDAC_CTRL_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_CTRL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_FLYBACK_TEST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_AUX_SW_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_PA_AUX_IN_CONN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_TIMER_DIV)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_OCP_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_OCP_COUNT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_EAR_DAC)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_EAR_AMP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_HPH_LDO)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_HPH_PA)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_HPH_RDACBUFF_CNP2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_HPH_RDAC_LDO)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_HPH_CNP1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_HPH_LOWPOWER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_DIFFLO_PA)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_DIFFLO_REF)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_DIFFLO_LDO)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_SELO_DAC_PA)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_BUCK_RST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_BUCK_VREF_ERRAMP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_FLYB_ERRAMP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_FLYB_BUFF)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_BIAS_FLYB_MID_RST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_L_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_HPH_R_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_HPH_CNP_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_CNP_WG_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_CNP_WG_TIME)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_OCP_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_AUTO_CHOP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_CHOP_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_PA_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_PA_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_L_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_L_TEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_L_ATEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_R_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_R_TEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_R_ATEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_RDAC_CLK_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_RDAC_CLK_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_RDAC_LDO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_RDAC_CHOP_CLK_LP_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_REFBUFF_UHQA_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_REFBUFF_LP_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_L_DAC_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_R_DAC_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EAR_EN_REG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EAR_CMBUFF)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EAR_ICTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EAR_EN_DBG_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EAR_CNP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EAR_DAC_CTL_ATEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EAR_STATUS_REG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EAR_EAR_MISC)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_MISC)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_LO2_COMPANDER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_LO1_COMPANDER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_COMMON)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_BYPASS_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_CNP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_CORE_OUT_PROG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_LDO_OUT_PROG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_COM_SWCAP_REFBUF_FREQ)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_COM_PA_FREQ)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_RESERVED_REG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_DIFF_LO_LO1_STATUS_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_DIFF_LO_LO1_STATUS_2)] = WCD934X_READ, -}; - -const u8 wcd934x_page7_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_ANA_NEW_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_ANA_HPH2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_ANA_HPH3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_EN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_ANA_LDO_CONFIG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_LDO_OCP_CONFIG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_TX_LDO_CONFIG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_TX_DRV_CONFIG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_RX_CONFIG_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_RX_CONFIG_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_PLL_ENABLES)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_PLL_PRESET)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_ANA_PLL_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CLK_SYS_PLL_ENABLES)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_PLL_PRESET)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_PLL_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CLK_SYS_MCLK_PRG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_MCLK2_PRG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_MCLK2_PRG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_XO_PRG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_XO_CAP_XTP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_XO_CAP_XTM)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_BST_EN_DLY)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_CTRL_ILIM)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_VOUT_SETTING)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_VOUT_A_STARTUP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_VOUT_D_STARTUP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_VOUT_D_FREQ1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_VOUT_D_FREQ2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_ELECT_REM_CLAMP_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_CTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_CTL_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_PLUG_DETECT_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_ZDET_ANA_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_ZDET_RAMP_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_FSM_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MBHC_NEW_ADC_RESULT)] = WCD934X_READ, - [WCD934X_REG(WCD934X_TX_NEW_AMIC_4_5_SEL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_NEW_ADC_MODE)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_VBADC_NEW_ADC_DOUTMSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_VBADC_NEW_ADC_DOUTLSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_RDAC_HD2_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_RDAC_VREF_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_RDAC_OVERRIDE_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_RDAC_MISC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_PA_MISC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_PA_MISC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_PA_RDAC_MISC)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_HPH_TIMER1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_HPH_TIMER2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_HPH_TIMER3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_HPH_TIMER4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_PA_RDAC_MISC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_HPH_NEW_INT_PA_RDAC_MISC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_ULP)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_RX_NEW_INT_HPH_RDAC_LDO_LP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_LDO_TEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_TX_LDO_TEST)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_TX_DRV_TEST)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_RX_TEST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_RX_TEST_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_CLK_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_RESERVED_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_RESERVED_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_L_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_M_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_N_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_PFD_CP_DSM_PROG)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_VCO_PROG)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_LDO_LOCK_CFG)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SLNQ_INT_ANA_INT_PLL_DIG_LOCK_DET_CFG)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_POST_DIV_REG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_POST_DIV_REG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_REF_DIV_REG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_REF_DIV_REG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_FILTER_REG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_FILTER_REG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_PLL_L_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_PLL_M_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_PLL_N_VAL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_TEST_REG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_PFD_CP_DSM_PROG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_VCO_PROG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_TEST_REG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_LDO_LOCK_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_DIG_LOCK_DET_CFG)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_CLK_TEST1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_CLK_TEST2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_CLK_TEST3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_XO_TEST1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CLK_SYS_INT_XO_TEST2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_VCOMP_HYST)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_VLOOP_FILTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_CTRL_IDELTA)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_CTRL_ILIM_STARTUP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_CTRL_MIN_ONTIME)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_CTRL_MAX_ONTIME)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_CTRL_TIMING)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_TMUX_A_D)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_SW_DRV_CNTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_SPARE1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_BOOST_INT_SPARE2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_RAMP_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_SPARE_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_A)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_D)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_RAMP_INC_WAIT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_RAMP_IBLEED_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_DEBUG_CPROVR_TEST)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_RAMP_CTL_A)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_RAMP_CTL_D)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_RAMP_TIMEOUT_PERIOD)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_INT_SLNQ_HPF)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_INT_SLNQ_REF)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_INT_SLNQ_COMP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MBHC_NEW_INT_SPARE_2)] = WCD934X_READ_WRITE, - -}; - -const u8 wcd934x_page10_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE10_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_CLK_RESET_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_MODE_1_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_MODE_2_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_FF_SHIFT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_FB_SHIFT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_LPF_FF_A_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_LPF_FF_B_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_LPF_FB_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_SMLPF_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_DCFLT_SHIFT_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_IIR_ADAPT_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_IIR_COEFF_1_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_IIR_COEFF_2_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_FF_A_GAIN_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_FF_B_GAIN_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_FB_GAIN_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_RC_COMMON_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_FIFO_COMMON_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC0_RC0_STATUS_FMIN_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC0_RC1_STATUS_FMIN_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC0_RC0_STATUS_FMAX_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC0_RC1_STATUS_FMAX_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC0_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC1_CLK_RESET_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_MODE_1_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_MODE_2_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_FF_SHIFT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_FB_SHIFT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_LPF_FF_A_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_LPF_FF_B_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_LPF_FB_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_SMLPF_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_DCFLT_SHIFT_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_IIR_ADAPT_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_IIR_COEFF_1_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_IIR_COEFF_2_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_FF_A_GAIN_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_FF_B_GAIN_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_FB_GAIN_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_RC_COMMON_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_FIFO_COMMON_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_ANC1_RC0_STATUS_FMIN_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC1_RC1_STATUS_FMIN_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC1_RC0_STATUS_FMAX_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC1_RC1_STATUS_FMAX_CNTR)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_ANC1_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX0_TX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX1_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX2_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX3_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX4_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX5_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX6_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX7_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_192_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_192_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX8_TX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX9_SPKR_PROT_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX10_SPKR_PROT_PATH_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX11_SPKR_PROT_PATH_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX12_SPKR_PROT_PATH_CFG0)] = - WCD934X_READ_WRITE, -}; - -const u8 wcd934x_page11_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE11_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL6)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_COMPANDER1_CTL7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL6)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_COMPANDER2_CTL7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL6)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_COMPANDER3_CTL7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL6)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_COMPANDER4_CTL7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL6)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_COMPANDER7_CTL7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL6)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_COMPANDER8_CTL7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_MIX_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_VOL_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_MIX_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_MIX_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX0_RX_PATH_DSMDEM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_MIX_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_VOL_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_MIX_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_MIX_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX1_RX_PATH_DSMDEM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_MIX_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_VOL_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_MIX_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_MIX_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX2_RX_PATH_DSMDEM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_MIX_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_VOL_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_MIX_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_MIX_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX3_RX_PATH_DSMDEM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_MIX_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_VOL_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_MIX_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_MIX_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX4_RX_PATH_DSMDEM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_MIX_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_VOL_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_MIX_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_MIX_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX7_RX_PATH_DSMDEM_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_VOL_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_MIX_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_VOL_MIX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_SEC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_SEC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_SEC5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_SEC6)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_SEC7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_MIX_SEC0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_MIX_SEC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX8_RX_PATH_DSMDEM_CTL)] = WCD934X_READ_WRITE, -}; - -const u8 wcd934x_page12_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE12_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_CRC)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_DLY_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_DECAY_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_HPH_V_PA)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_EAR_V_PA)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_HPH_V_HD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_EAR_V_HD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_K1_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_K1_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_K2_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_K2_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_IDLE_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_IDLE_HPH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_IDLE_EAR)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_TEST0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_TEST1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLSH_OVR_VREF)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST0_BOOST_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST0_BOOST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST0_BOOST_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST0_BOOST_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST1_BOOST_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST1_BOOST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST1_BOOST_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_BOOST1_BOOST_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_ADC_CAL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_ADC_CAL2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_ADC_CAL3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_PK_EST1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_PK_EST2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_PK_EST3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_RF_PROC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_RF_PROC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_TAC1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_TAC2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_TAC3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_TAC4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_GAIN_UPD1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_GAIN_UPD2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_GAIN_UPD3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_GAIN_UPD4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_DEBUG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_GAIN_UPD_MON)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_GAIN_MON_VAL)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_VBAT_VBAT_BAN)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC0_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC0_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC0_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC0_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC0_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC1_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC1_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC1_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC1_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC1_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC2_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC2_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC2_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC2_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC2_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC3_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC3_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC3_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC3_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_MIXING_ASRC3_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_DATA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_DATA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_DATA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_DATA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_ADDR_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_ADDR_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_ADDR_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_WR_ADDR_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_ADDR_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_ADDR_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_ADDR_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_ADDR_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_DATA_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_DATA_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_DATA_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_RD_DATA_3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_ACCESS_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SWR_AHB_BRIDGE_ACCESS_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC0_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_LSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_MSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_LSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_MSB)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_SIDETONE_ASRC1_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_REF_HQ0_EC_REF_HQ_PATH_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_REF_HQ0_EC_REF_HQ_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_REF_HQ1_EC_REF_HQ_PATH_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_REF_HQ1_EC_REF_HQ_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC0_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC0_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC0_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC0_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC0_STATUS_FIFO)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC1_CLK_RST_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC1_CTL0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC1_CTL1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC1_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_EC_ASRC1_STATUS_FIFO)] = WCD934X_READ, -}; - -const u8 wcd934x_page13_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE13_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_ANC_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_INP_MUX_EC_REF_HQ_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX10_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX11_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX12_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TX_INP_MUX_ADC_MUX13_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLK_RST_CTRL_MCLK_CONTROL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLK_RST_CTRL_DSD_CONTROL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_CLK_RST_CTRL_GFM_CONTROL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_TEST_CTRL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD)] = - WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_PATH_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_PATH_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_TOP_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_TOP_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_TOP_CFG7)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_HPHL_COMP_WR_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_HPHL_COMP_WR_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_HPHL_COMP_LUT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_HPHL_COMP_RD_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TOP_HPHL_COMP_RD_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TOP_HPHR_COMP_WR_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_HPHR_COMP_WR_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_HPHR_COMP_LUT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_HPHR_COMP_RD_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TOP_HPHR_COMP_RD_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFL_COMP_WR_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFL_COMP_WR_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFL_COMP_LUT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFL_COMP_RD_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFL_COMP_RD_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFR_COMP_WR_LSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFR_COMP_WR_MSB)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFR_COMP_LUT)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFR_COMP_RD_LSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_TOP_DIFFR_COMP_RD_MSB)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_DSD0_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD0_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD0_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD0_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD0_CFG3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD0_CFG4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD0_CFG5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD1_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD1_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD1_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD1_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD1_CFG3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD1_CFG4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DSD1_CFG5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_IDLE_DET_PATH_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_IDLE_DET_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_IDLE_DET_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_IDLE_DET_CFG2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RX_IDLE_DET_CFG3)] = WCD934X_READ_WRITE, -}; - -const u8 wcd934x_page14_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE14_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_CLK_RST_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_PULSE_SUPR_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_TIMER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_BW_SW)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_THRESH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_TIMER2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RMAX_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RMIN_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_PH_DET)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_DIAG_CLR)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_MB_SW_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_MAST_DIAG_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RATE_OUT_7_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RATE_OUT_15_8)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RATE_OUT_23_16)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RATE_OUT_31_24)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RATE_OUT_39_32)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST0_RE_RATE_OUT_40_43)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_CLK_RST_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_PULSE_SUPR_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_TIMER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_BW_SW)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_THRESH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_TIMER2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RMAX_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RMIN_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_PH_DET)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_DIAG_CLR)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_MB_SW_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_MAST_DIAG_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RATE_OUT_7_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RATE_OUT_15_8)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RATE_OUT_23_16)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RATE_OUT_31_24)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RATE_OUT_39_32)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST1_RE_RATE_OUT_40_43)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_CLK_RST_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_PULSE_SUPR_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_TIMER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_BW_SW)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_THRESH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_TIMER2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RMAX_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RMIN_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_PH_DET)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_DIAG_CLR)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_MB_SW_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_MAST_DIAG_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RATE_OUT_7_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RATE_OUT_15_8)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RATE_OUT_23_16)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RATE_OUT_31_24)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RATE_OUT_39_32)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST2_RE_RATE_OUT_40_43)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_CLK_RST_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_PULSE_SUPR_CTL)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_TIMER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_BW_SW)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_THRESH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_TIMER2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW5)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RMAX_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RMIN_DIAG)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_PH_DET)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_DIAG_CLR)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_MB_SW_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_MAST_DIAG_STATE)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RATE_OUT_7_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RATE_OUT_15_8)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RATE_OUT_23_16)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RATE_OUT_31_24)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RATE_OUT_39_32)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_RATE_EST3_RE_RATE_OUT_40_43)] = WCD934X_READ, -}; - -const u8 wcd934x_page15_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE15_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SPLINE_SRC0_CLK_RST_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SPLINE_SRC0_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SPLINE_SRC1_CLK_RST_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SPLINE_SRC1_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SPLINE_SRC2_CLK_RST_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SPLINE_SRC2_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_SPLINE_SRC3_CLK_RST_CTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_SPLINE_SRC3_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_RC_RE_ASRC_DEBUG_CFG0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_ANC0_RC0_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_ANC0_RC1_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_ANC1_RC0_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_ANC1_RC1_FIFO_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CDC_DEBUG_ANC_RC_RST_DBG_CNTR)] = - WCD934X_READ_WRITE, -}; - -const u8 wcd934x_page_0x50_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE80_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_ACCESS_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_ACCESS_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_NOM_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS2_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_NOM_MX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS_MX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS2_MX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS2_MIN_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_MAX_SVS2_STEP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SW_MODECHNG_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_SW_MODECHNG_START)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_CPR_STATUS)] = WCD934X_READ_WRITE, -}; - -const u8 wcd934x_page_0x80_reg_access[WCD934X_PAGE_SIZE] = { - [WCD934X_REG(WCD934X_PAGE80_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_DATA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_WR_ADDR_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_ADDR_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_0)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_1)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_2)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_RD_DATA_3)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_ACCESS_CFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_ACCESS_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_NOM_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS2_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_NOM_MX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS_MX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS2_MX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SVS2_MIN_CX_VDD)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_MAX_SVS2_STEP)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_CTL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_SW_MODECHNG_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_CODEC_CPR_SW_MODECHNG_START)] = WCD934X_WRITE, - [WCD934X_REG(WCD934X_CODEC_CPR_CPR_STATUS)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_PAGE128_PAGE_REGISTER)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_BIST_MODE_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_RF_PA_ON_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_INTR1_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_INTR2_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SWR_DATA_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SWR_CLK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_2_SCK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SLIMBUS_DATA1_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SLIMBUS_DATA2_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SLIMBUS_CLK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2C_CLK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2C_DATA_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_0_RX_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_0_TX_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_0_SCK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_0_WS_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_1_RX_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_1_TX_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_1_SCK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_1_WS_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_DMIC1_CLK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_DMIC1_DATA_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_DMIC2_CLK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_DMIC2_DATA_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_DMIC3_CLK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_DMIC3_DATA_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_JTCK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_GPIO1_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_GPIO2_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_GPIO3_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_GPIO4_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SPI_S_CSN_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SPI_S_CLK_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SPI_S_DOUT_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_SPI_S_DIN_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_BA_N_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_GPIO0_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_2_RX_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TLMM_I2S_2_WS_PINCFG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_OE_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_OE_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_OE_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_OE_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_OE_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_DATA_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_DATA_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_DATA_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_DATA_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_CTL_DATA_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PAD_DRVCTL_0)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PAD_DRVCTL_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PIN_STATUS)] = WCD934X_READ, - [WCD934X_REG(WCD934X_TEST_DEBUG_NPL_DLY_TEST_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_NPL_DLY_TEST_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_MEM_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_DEBUG_BUS_SEL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_DEBUG_JTAG)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_DEBUG_EN_1)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_DEBUG_EN_2)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_DEBUG_EN_3)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_DEBUG_EN_4)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_DEBUG_EN_5)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_ANA_DTEST_DIR)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PAD_INP_DISABLE_0)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PAD_INP_DISABLE_1)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PAD_INP_DISABLE_2)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PAD_INP_DISABLE_3)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_PAD_INP_DISABLE_4)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_SYSMEM_CTRL)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_SOC_SW_PWR_SEQ_DELAY)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_LVAL_NOM_LOW)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_LVAL_NOM_HIGH)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_LOW)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_HIGH)] = - WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_SPI_SLAVE_CHAR)] = WCD934X_READ_WRITE, - [WCD934X_REG(WCD934X_TEST_DEBUG_CODEC_DIAGS)] = WCD934X_READ, -}; - -const u8 * const wcd934x_reg[WCD934X_NUM_PAGES] = { - [WCD934X_PAGE_0] = wcd934x_page0_reg_access, - [WCD934X_PAGE_1] = wcd934x_page1_reg_access, - [WCD934X_PAGE_2] = wcd934x_page2_reg_access, - [WCD934X_PAGE_4] = wcd934x_page4_reg_access, - [WCD934X_PAGE_5] = wcd934x_page5_reg_access, - [WCD934X_PAGE_6] = wcd934x_page6_reg_access, - [WCD934X_PAGE_7] = wcd934x_page7_reg_access, - [WCD934X_PAGE_10] = wcd934x_page10_reg_access, - [WCD934X_PAGE_11] = wcd934x_page11_reg_access, - [WCD934X_PAGE_12] = wcd934x_page12_reg_access, - [WCD934X_PAGE_13] = wcd934x_page13_reg_access, - [WCD934X_PAGE_14] = wcd934x_page14_reg_access, - [WCD934X_PAGE_15] = wcd934x_page15_reg_access, - [WCD934X_PAGE_0x50] = wcd934x_page_0x50_reg_access, - [WCD934X_PAGE_0X80] = wcd934x_page_0x80_reg_access, -}; diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x.c b/techpack/audio/asoc/codecs/wcd934x/wcd934x.c deleted file mode 100644 index 0d89afe22f19..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x.c +++ /dev/null @@ -1,11370 +0,0 @@ -/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd934x.h" -#include "wcd934x-mbhc.h" -#include "wcd934x-routing.h" -#include "wcd934x-dsp-cntl.h" -#include "wcd934x_irq.h" -#include "../core.h" -#include "../pdata.h" -#include "../wcd9xxx-irq.h" -#include "../wcd9xxx-common-v2.h" -#include "../wcd9xxx-resmgr-v2.h" -#include "../wcdcal-hwdep.h" -#include "wcd934x-dsd.h" - -#define WCD934X_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\ - SNDRV_PCM_RATE_384000) -/* Fractional Rates */ -#define WCD934X_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ - SNDRV_PCM_RATE_176400) - -#define WCD934X_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE) - -#define WCD934X_FORMATS_S16_S24_S32_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -#define WCD934X_FORMATS_S16_LE (SNDRV_PCM_FMTBIT_S16_LE) - -#define MICB_LOAD_PROP "qcom,vreg-micb" -#define MICB_LOAD_DEFAULT 30400 - -/* Macros for packing register writes into a U32 */ -#define WCD934X_PACKED_REG_SIZE sizeof(u32) -#define WCD934X_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ - do { \ - ((reg) = ((packed >> 16) & (0xffff))); \ - ((mask) = ((packed >> 8) & (0xff))); \ - ((val) = ((packed) & (0xff))); \ - } while (0) - -#define STRING(name) #name -#define WCD_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define WCD_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define WCD_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -/* - * Timeout in milli seconds and it is the wait time for - * slim channel removal interrupt to receive. - */ -#define WCD934X_SLIM_CLOSE_TIMEOUT 1000 -#define WCD934X_SLIM_IRQ_OVERFLOW (1 << 0) -#define WCD934X_SLIM_IRQ_UNDERFLOW (1 << 1) -#define WCD934X_SLIM_IRQ_PORT_CLOSED (1 << 2) -#define WCD934X_MCLK_CLK_12P288MHZ 12288000 -#define WCD934X_MCLK_CLK_9P6MHZ 9600000 - -#define WCD934X_INTERP_MUX_NUM_INPUTS 3 -#define WCD934X_NUM_INTERPOLATORS 9 -#define WCD934X_NUM_DECIMATORS 9 -#define WCD934X_RX_PATH_CTL_OFFSET 20 - -#define BYTE_BIT_MASK(nr) (1 << ((nr) % BITS_PER_BYTE)) - -#define WCD934X_REG_BITS 8 -#define WCD934X_MAX_VALID_ADC_MUX 13 -#define WCD934X_INVALID_ADC_MUX 9 - -#define WCD934X_AMIC_PWR_LEVEL_LP 0 -#define WCD934X_AMIC_PWR_LEVEL_DEFAULT 1 -#define WCD934X_AMIC_PWR_LEVEL_HP 2 -#define WCD934X_AMIC_PWR_LEVEL_HYBRID 3 -#define WCD934X_AMIC_PWR_LVL_MASK 0x60 -#define WCD934X_AMIC_PWR_LVL_SHIFT 0x5 - -#define WCD934X_DMIC_DRV_CTL_MASK 0x0C -#define WCD934X_DMIC_DRV_CTL_SHIFT 0x02 - -#define WCD934X_DEC_PWR_LVL_MASK 0x06 -#define WCD934X_DEC_PWR_LVL_LP 0x02 -#define WCD934X_DEC_PWR_LVL_HP 0x04 -#define WCD934X_DEC_PWR_LVL_DF 0x00 -#define WCD934X_DEC_PWR_LVL_HYBRID WCD934X_DEC_PWR_LVL_DF -#define WCD934X_STRING_LEN 100 - -#define WCD934X_CDC_SIDETONE_IIR_COEFF_MAX 5 -#define WCD934X_CDC_REPEAT_WRITES_MAX 16 -#define WCD934X_DIG_CORE_REG_MIN WCD934X_CDC_ANC0_CLK_RESET_CTL -#define WCD934X_DIG_CORE_REG_MAX 0xFFF - -#define WCD934X_CHILD_DEVICES_MAX 6 - -#define WCD934X_MAX_MICBIAS 4 -#define DAPM_MICBIAS1_STANDALONE "MIC BIAS1 Standalone" -#define DAPM_MICBIAS2_STANDALONE "MIC BIAS2 Standalone" -#define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone" -#define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone" - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define SB_OF_UF_MAX_RETRY_CNT 5 -#define CPE_ERR_WDOG_BITE BIT(0) -#define CPE_FATAL_IRQS CPE_ERR_WDOG_BITE - -#define WCD934X_MAD_AUDIO_FIRMWARE_PATH "wcd934x/wcd934x_mad_audio.bin" - -#define TAVIL_VERSION_ENTRY_SIZE 17 - -#define WCD934X_DIG_CORE_COLLAPSE_TIMER_MS (5 * 1000) - -enum { - POWER_COLLAPSE, - POWER_RESUME, -}; - -static int dig_core_collapse_enable = 1; -module_param(dig_core_collapse_enable, int, 0664); -MODULE_PARM_DESC(dig_core_collapse_enable, "enable/disable power gating"); - -/* dig_core_collapse timer in seconds */ -static int dig_core_collapse_timer = (WCD934X_DIG_CORE_COLLAPSE_TIMER_MS/1000); -module_param(dig_core_collapse_timer, int, 0664); -MODULE_PARM_DESC(dig_core_collapse_timer, "timer for power gating"); - -#define TAVIL_HPH_REG_RANGE_1 (WCD934X_HPH_R_DAC_CTL - WCD934X_HPH_CNP_EN + 1) -#define TAVIL_HPH_REG_RANGE_2 (WCD934X_HPH_NEW_ANA_HPH3 -\ - WCD934X_HPH_NEW_ANA_HPH2 + 1) -#define TAVIL_HPH_REG_RANGE_3 (WCD934X_HPH_NEW_INT_PA_RDAC_MISC3 -\ - WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL + 1) -#define TAVIL_HPH_TOTAL_REG (TAVIL_HPH_REG_RANGE_1 + TAVIL_HPH_REG_RANGE_2 +\ - TAVIL_HPH_REG_RANGE_3) - -enum { - VI_SENSE_1, - VI_SENSE_2, - AUDIO_NOMINAL, - HPH_PA_DELAY, - CLSH_Z_CONFIG, - ANC_MIC_AMIC1, - ANC_MIC_AMIC2, - ANC_MIC_AMIC3, - ANC_MIC_AMIC4, - CLK_INTERNAL, - CLK_MODE, -}; - -enum { - AIF1_PB = 0, - AIF1_CAP, - AIF2_PB, - AIF2_CAP, - AIF3_PB, - AIF3_CAP, - AIF4_PB, - AIF4_VIFEED, - AIF4_MAD_TX, - NUM_CODEC_DAIS, -}; - -enum { - INTn_1_INP_SEL_ZERO = 0, - INTn_1_INP_SEL_DEC0, - INTn_1_INP_SEL_DEC1, - INTn_1_INP_SEL_IIR0, - INTn_1_INP_SEL_IIR1, - INTn_1_INP_SEL_RX0, - INTn_1_INP_SEL_RX1, - INTn_1_INP_SEL_RX2, - INTn_1_INP_SEL_RX3, - INTn_1_INP_SEL_RX4, - INTn_1_INP_SEL_RX5, - INTn_1_INP_SEL_RX6, - INTn_1_INP_SEL_RX7, -}; - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_RX2, - INTn_2_INP_SEL_RX3, - INTn_2_INP_SEL_RX4, - INTn_2_INP_SEL_RX5, - INTn_2_INP_SEL_RX6, - INTn_2_INP_SEL_RX7, - INTn_2_INP_SEL_PROXIMITY, -}; - -enum { - INTERP_MAIN_PATH, - INTERP_MIX_PATH, -}; - -struct tavil_idle_detect_config { - u8 hph_idle_thr; - u8 hph_idle_detect_en; -}; - -struct tavil_cpr_reg_defaults { - int wr_data; - int wr_addr; -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -static struct interp_sample_rate sr_val_tbl[] = { - {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5}, - {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA}, - {176400, 0xB}, {352800, 0xC}, -}; - -static const struct wcd9xxx_ch tavil_rx_chs[WCD934X_RX_MAX] = { - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER, 0), - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER + 1, 1), - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER + 2, 2), - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER + 3, 3), - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER + 4, 4), - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER + 5, 5), - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER + 6, 6), - WCD9XXX_CH(WCD934X_RX_PORT_START_NUMBER + 7, 7), -}; - -static const struct wcd9xxx_ch tavil_tx_chs[WCD934X_TX_MAX] = { - WCD9XXX_CH(0, 0), - WCD9XXX_CH(1, 1), - WCD9XXX_CH(2, 2), - WCD9XXX_CH(3, 3), - WCD9XXX_CH(4, 4), - WCD9XXX_CH(5, 5), - WCD9XXX_CH(6, 6), - WCD9XXX_CH(7, 7), - WCD9XXX_CH(8, 8), - WCD9XXX_CH(9, 9), - WCD9XXX_CH(10, 10), - WCD9XXX_CH(11, 11), - WCD9XXX_CH(12, 12), - WCD9XXX_CH(13, 13), - WCD9XXX_CH(14, 14), - WCD9XXX_CH(15, 15), -}; - -static const u32 vport_slim_check_table[NUM_CODEC_DAIS] = { - 0, /* AIF1_PB */ - BIT(AIF2_CAP) | BIT(AIF3_CAP) | BIT(AIF4_MAD_TX), /* AIF1_CAP */ - 0, /* AIF2_PB */ - BIT(AIF1_CAP) | BIT(AIF3_CAP) | BIT(AIF4_MAD_TX), /* AIF2_CAP */ - 0, /* AIF3_PB */ - BIT(AIF1_CAP) | BIT(AIF2_CAP) | BIT(AIF4_MAD_TX), /* AIF3_CAP */ - 0, /* AIF4_PB */ -}; - -/* Codec supports 2 IIR filters */ -enum { - IIR0 = 0, - IIR1, - IIR_MAX, -}; - -/* Each IIR has 5 Filter Stages */ -enum { - BAND1 = 0, - BAND2, - BAND3, - BAND4, - BAND5, - BAND_MAX, -}; - -enum { - COMPANDER_1, /* HPH_L */ - COMPANDER_2, /* HPH_R */ - COMPANDER_3, /* LO1_DIFF */ - COMPANDER_4, /* LO2_DIFF */ - COMPANDER_5, /* LO3_SE - not used in Tavil */ - COMPANDER_6, /* LO4_SE - not used in Tavil */ - COMPANDER_7, /* SWR SPK CH1 */ - COMPANDER_8, /* SWR SPK CH2 */ - COMPANDER_MAX, -}; - -enum { - ASRC_IN_HPHL, - ASRC_IN_LO1, - ASRC_IN_HPHR, - ASRC_IN_LO2, - ASRC_IN_SPKR1, - ASRC_IN_SPKR2, - ASRC_INVALID, -}; - -enum { - ASRC0, - ASRC1, - ASRC2, - ASRC3, - ASRC_MAX, -}; - -enum { - CONV_88P2K_TO_384K, - CONV_96K_TO_352P8K, - CONV_352P8K_TO_384K, - CONV_384K_TO_352P8K, - CONV_384K_TO_384K, - CONV_96K_TO_384K, -}; - -static struct afe_param_slimbus_slave_port_cfg tavil_slimbus_slave_port_cfg = { - .minor_version = 1, - .slimbus_dev_id = AFE_SLIMBUS_DEVICE_1, - .slave_dev_pgd_la = 0, - .slave_dev_intfdev_la = 0, - .bit_width = 16, - .data_format = 0, - .num_channels = 1 -}; - -static struct afe_param_cdc_reg_page_cfg tavil_cdc_reg_page_cfg = { - .minor_version = AFE_API_VERSION_CDC_REG_PAGE_CFG, - .enable = 1, - .proc_id = AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_1, -}; - -static struct afe_param_cdc_reg_cfg audio_reg_cfg[] = { - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_SOC_MAD_MAIN_CTL_1), - HW_MAD_AUDIO_ENABLE, 0x1, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_SOC_MAD_AUDIO_CTL_3), - HW_MAD_AUDIO_SLEEP_TIME, 0xF, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_SOC_MAD_AUDIO_CTL_4), - HW_MAD_TX_AUDIO_SWITCH_OFF, 0x1, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_INTR_CFG), - MAD_AUDIO_INT_DEST_SELECT_REG, 0x2, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_INTR_PIN2_MASK3), - MAD_AUDIO_INT_MASK_REG, 0x1, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_INTR_PIN2_STATUS3), - MAD_AUDIO_INT_STATUS_REG, 0x1, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_INTR_PIN2_CLEAR3), - MAD_AUDIO_INT_CLEAR_REG, 0x1, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_SB_PGD_PORT_TX_BASE), - SB_PGD_PORT_TX_WATERMARK_N, 0x1E, WCD934X_REG_BITS, 0x1 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_SB_PGD_PORT_TX_BASE), - SB_PGD_PORT_TX_ENABLE_N, 0x1, WCD934X_REG_BITS, 0x1 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_SB_PGD_PORT_RX_BASE), - SB_PGD_PORT_RX_WATERMARK_N, 0x1E, WCD934X_REG_BITS, 0x1 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + WCD934X_SB_PGD_PORT_RX_BASE), - SB_PGD_PORT_RX_ENABLE_N, 0x1, WCD934X_REG_BITS, 0x1 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + - WCD934X_CDC_ANC0_IIR_ADAPT_CTL), - AANC_FF_GAIN_ADAPTIVE, 0x4, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + - WCD934X_CDC_ANC0_IIR_ADAPT_CTL), - AANC_FFGAIN_ADAPTIVE_EN, 0x8, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + - WCD934X_CDC_ANC0_FF_A_GAIN_CTL), - AANC_GAIN_CONTROL, 0xFF, WCD934X_REG_BITS, 0 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + - SB_PGD_TX_PORT_MULTI_CHANNEL_0(0)), - SB_PGD_TX_PORTn_MULTI_CHNL_0, 0xFF, WCD934X_REG_BITS, 0x4 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + - SB_PGD_TX_PORT_MULTI_CHANNEL_1(0)), - SB_PGD_TX_PORTn_MULTI_CHNL_1, 0xFF, WCD934X_REG_BITS, 0x4 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + - SB_PGD_RX_PORT_MULTI_CHANNEL_0(0x180, 0)), - SB_PGD_RX_PORTn_MULTI_CHNL_0, 0xFF, WCD934X_REG_BITS, 0x4 - }, - { - 1, - (WCD934X_REGISTER_START_OFFSET + - SB_PGD_RX_PORT_MULTI_CHANNEL_0(0x181, 0)), - SB_PGD_RX_PORTn_MULTI_CHNL_1, 0xFF, WCD934X_REG_BITS, 0x4 - }, -}; - -static struct afe_param_cdc_reg_cfg_data tavil_audio_reg_cfg = { - .num_registers = ARRAY_SIZE(audio_reg_cfg), - .reg_data = audio_reg_cfg, -}; - -static struct afe_param_id_cdc_aanc_version tavil_cdc_aanc_version = { - .cdc_aanc_minor_version = AFE_API_VERSION_CDC_AANC_VERSION, - .aanc_hw_version = AANC_HW_BLOCK_VERSION_2, -}; - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); -static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1); -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); - -#define WCD934X_TX_UNMUTE_DELAY_MS 40 - -static int tx_unmute_delay = WCD934X_TX_UNMUTE_DELAY_MS; -module_param(tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path"); - -static void tavil_codec_set_tx_hold(struct snd_soc_codec *, u16, bool); - -/* Hold instance to soundwire platform device */ -struct tavil_swr_ctrl_data { - struct platform_device *swr_pdev; -}; - -struct wcd_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, void *data), - void *swrm_handle, int action); -}; - -/* Holds all Soundwire and speaker related information */ -struct wcd934x_swr { - struct tavil_swr_ctrl_data *ctrl_data; - struct wcd_swr_ctrl_platform_data plat_data; - struct mutex read_mutex; - struct mutex write_mutex; - struct mutex clk_mutex; - int spkr_gain_offset; - int spkr_mode; - int clk_users; - int rx_7_count; - int rx_8_count; -}; - -struct tx_mute_work { - struct tavil_priv *tavil; - u8 decimator; - struct delayed_work dwork; -}; - -#define WCD934X_SPK_ANC_EN_DELAY_MS 550 -static int spk_anc_en_delay = WCD934X_SPK_ANC_EN_DELAY_MS; -module_param(spk_anc_en_delay, int, 0664); -MODULE_PARM_DESC(spk_anc_en_delay, "delay to enable anc in speaker path"); - -struct spk_anc_work { - struct tavil_priv *tavil; - struct delayed_work dwork; -}; - -struct hpf_work { - struct tavil_priv *tavil; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -struct tavil_priv { - struct device *dev; - struct wcd9xxx *wcd9xxx; - struct snd_soc_codec *codec; - u32 rx_bias_count; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - s32 micb_ref[TAVIL_MAX_MICBIAS]; - s32 pullup_ref[TAVIL_MAX_MICBIAS]; - - /* ANC related */ - u32 anc_slot; - bool anc_func; - - /* compander */ - int comp_enabled[COMPANDER_MAX]; - int ear_spkr_gain; - - /* class h specific data */ - struct wcd_clsh_cdc_data clsh_d; - /* Tavil Interpolator Mode Select for EAR, HPH_L and HPH_R */ - u32 hph_mode; - - /* Mad switch reference count */ - int mad_switch_cnt; - - /* track tavil interface type */ - u8 intf_type; - - /* to track the status */ - unsigned long status_mask; - - struct afe_param_cdc_slimbus_slave_cfg slimbus_slave_cfg; - - /* num of slim ports required */ - struct wcd9xxx_codec_dai_data dai[NUM_CODEC_DAIS]; - /* Port values for Rx and Tx codec_dai */ - unsigned int rx_port_value[WCD934X_RX_MAX]; - unsigned int tx_port_value; - - struct wcd9xxx_resmgr_v2 *resmgr; - struct wcd934x_swr swr; - struct mutex micb_lock; - - struct delayed_work power_gate_work; - struct mutex power_lock; - - struct clk *wcd_ext_clk; - - /* mbhc module */ - struct wcd934x_mbhc *mbhc; - - struct mutex codec_mutex; - struct work_struct tavil_add_child_devices_work; - struct hpf_work tx_hpf_work[WCD934X_NUM_DECIMATORS]; - struct tx_mute_work tx_mute_dwork[WCD934X_NUM_DECIMATORS]; - struct spk_anc_work spk_anc_dwork; - - unsigned int vi_feed_value; - - /* DSP control */ - struct wcd_dsp_cntl *wdsp_cntl; - - /* cal info for codec */ - struct fw_info *fw_data; - - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - - /* SVS voting related */ - struct mutex svs_mutex; - int svs_ref_cnt; - - int native_clk_users; - /* ASRC users count */ - int asrc_users[ASRC_MAX]; - int asrc_output_mode[ASRC_MAX]; - /* Main path clock users count */ - int main_clk_users[WCD934X_NUM_INTERPOLATORS]; - struct tavil_dsd_config *dsd_config; - struct tavil_idle_detect_config idle_det_cfg; - - int power_active_ref; - u8 sidetone_coeff_array[IIR_MAX][BAND_MAX] - [WCD934X_CDC_SIDETONE_IIR_COEFF_MAX * 4]; - unsigned short slim_tx_of_uf_cnt[WCD934X_TX_MAX][SB_PORT_ERR_MAX]; - struct spi_device *spi; - struct platform_device *pdev_child_devices - [WCD934X_CHILD_DEVICES_MAX]; - int child_count; - int micbias_num; - struct regulator *micb_load; - int micb_load_low; - int micb_load_high; - u8 dmic_drv_ctl; -}; - -static const struct tavil_reg_mask_val tavil_spkr_default[] = { - {WCD934X_CDC_COMPANDER7_CTL3, 0x80, 0x80}, - {WCD934X_CDC_COMPANDER8_CTL3, 0x80, 0x80}, - {WCD934X_CDC_COMPANDER7_CTL7, 0x01, 0x01}, - {WCD934X_CDC_COMPANDER8_CTL7, 0x01, 0x01}, - {WCD934X_CDC_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {WCD934X_CDC_BOOST1_BOOST_CTL, 0x7C, 0x58}, -}; - -static const struct tavil_reg_mask_val tavil_spkr_mode1[] = { - {WCD934X_CDC_COMPANDER7_CTL3, 0x80, 0x00}, - {WCD934X_CDC_COMPANDER8_CTL3, 0x80, 0x00}, - {WCD934X_CDC_COMPANDER7_CTL7, 0x01, 0x00}, - {WCD934X_CDC_COMPANDER8_CTL7, 0x01, 0x00}, - {WCD934X_CDC_BOOST0_BOOST_CTL, 0x7C, 0x44}, - {WCD934X_CDC_BOOST1_BOOST_CTL, 0x7C, 0x44}, -}; - -static int __tavil_enable_efuse_sensing(struct tavil_priv *tavil); - -/** - * tavil_set_spkr_gain_offset - offset the speaker path - * gain with the given offset value. - * - * @codec: codec instance - * @offset: Indicates speaker path gain offset value. - * - * Returns 0 on success or -EINVAL on error. - */ -int tavil_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); - - if (!priv) - return -EINVAL; - - priv->swr.spkr_gain_offset = offset; - return 0; -} -EXPORT_SYMBOL(tavil_set_spkr_gain_offset); - -/** - * tavil_set_spkr_mode - Configures speaker compander and smartboost - * settings based on speaker mode. - * - * @codec: codec instance - * @mode: Indicates speaker configuration mode. - * - * Returns 0 on success or -EINVAL on error. - */ -int tavil_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); - int i; - const struct tavil_reg_mask_val *regs; - int size; - - if (!priv) - return -EINVAL; - - switch (mode) { - case WCD934X_SPKR_MODE_1: - regs = tavil_spkr_mode1; - size = ARRAY_SIZE(tavil_spkr_mode1); - break; - default: - regs = tavil_spkr_default; - size = ARRAY_SIZE(tavil_spkr_default); - break; - } - - priv->swr.spkr_mode = mode; - for (i = 0; i < size; i++) - snd_soc_update_bits(codec, regs[i].reg, - regs[i].mask, regs[i].val); - return 0; -} -EXPORT_SYMBOL(tavil_set_spkr_mode); - -/** - * tavil_get_afe_config - returns specific codec configuration to afe to write - * - * @codec: codec instance - * @config_type: Indicates type of configuration to write. - */ -void *tavil_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type) -{ - struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); - - switch (config_type) { - case AFE_SLIMBUS_SLAVE_CONFIG: - return &priv->slimbus_slave_cfg; - case AFE_CDC_REGISTERS_CONFIG: - return &tavil_audio_reg_cfg; - case AFE_SLIMBUS_SLAVE_PORT_CONFIG: - return &tavil_slimbus_slave_port_cfg; - case AFE_AANC_VERSION: - return &tavil_cdc_aanc_version; - case AFE_CDC_REGISTER_PAGE_CONFIG: - return &tavil_cdc_reg_page_cfg; - default: - dev_info(codec->dev, "%s: Unknown config_type 0x%x\n", - __func__, config_type); - return NULL; - } -} -EXPORT_SYMBOL(tavil_get_afe_config); - -static bool is_tavil_playback_dai(int dai_id) -{ - if ((dai_id == AIF1_PB) || (dai_id == AIF2_PB) || - (dai_id == AIF3_PB) || (dai_id == AIF4_PB)) - return true; - - return false; -} - -static int tavil_find_playback_dai_id_for_port(int port_id, - struct tavil_priv *tavil) -{ - struct wcd9xxx_codec_dai_data *dai; - struct wcd9xxx_ch *ch; - int i, slv_port_id; - - for (i = AIF1_PB; i < NUM_CODEC_DAIS; i++) { - if (!is_tavil_playback_dai(i)) - continue; - - dai = &tavil->dai[i]; - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - slv_port_id = wcd9xxx_get_slave_port(ch->ch_num); - if ((slv_port_id > 0) && (slv_port_id == port_id)) - return i; - } - } - - return -EINVAL; -} - -static void tavil_vote_svs(struct tavil_priv *tavil, bool vote) -{ - struct wcd9xxx *wcd9xxx; - - wcd9xxx = tavil->wcd9xxx; - - mutex_lock(&tavil->svs_mutex); - if (vote) { - tavil->svs_ref_cnt++; - if (tavil->svs_ref_cnt == 1) - regmap_update_bits(wcd9xxx->regmap, - WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0, - 0x01, 0x01); - } else { - /* Do not decrement ref count if it is already 0 */ - if (tavil->svs_ref_cnt == 0) - goto done; - - tavil->svs_ref_cnt--; - if (tavil->svs_ref_cnt == 0) - regmap_update_bits(wcd9xxx->regmap, - WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0, - 0x01, 0x00); - } -done: - dev_dbg(tavil->dev, "%s: vote = %s, updated ref cnt = %u\n", __func__, - vote ? "vote" : "Unvote", tavil->svs_ref_cnt); - mutex_unlock(&tavil->svs_mutex); -} - -static int tavil_get_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil->anc_slot; - return 0; -} - -static int tavil_put_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - tavil->anc_slot = ucontrol->value.integer.value[0]; - return 0; -} - -static int tavil_get_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = (tavil->anc_func == true ? 1 : 0); - return 0; -} - -static int tavil_put_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - mutex_lock(&tavil->codec_mutex); - tavil->anc_func = (!ucontrol->value.integer.value[0] ? false : true); - dev_dbg(codec->dev, "%s: anc_func %x", __func__, tavil->anc_func); - - if (tavil->anc_func == true) { - snd_soc_dapm_enable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_enable_pin(dapm, "ANC EAR"); - snd_soc_dapm_enable_pin(dapm, "ANC SPK1 PA"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_enable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_disable_pin(dapm, "EAR PA"); - snd_soc_dapm_disable_pin(dapm, "EAR"); - snd_soc_dapm_disable_pin(dapm, "HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "HPHL"); - snd_soc_dapm_disable_pin(dapm, "HPHR"); - } else { - snd_soc_dapm_disable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR"); - snd_soc_dapm_disable_pin(dapm, "ANC SPK1 PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_enable_pin(dapm, "EAR PA"); - snd_soc_dapm_enable_pin(dapm, "EAR"); - snd_soc_dapm_enable_pin(dapm, "HPHL"); - snd_soc_dapm_enable_pin(dapm, "HPHR"); - snd_soc_dapm_enable_pin(dapm, "HPHL PA"); - snd_soc_dapm_enable_pin(dapm, "HPHR PA"); - } - mutex_unlock(&tavil->codec_mutex); - - snd_soc_dapm_sync(dapm); - return 0; -} - -static int tavil_codec_enable_anc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - const char *filename; - const struct firmware *fw; - int i; - int ret = 0; - int num_anc_slots; - struct wcd9xxx_anc_header *anc_head; - struct firmware_cal *hwdep_cal = NULL; - u32 anc_writes_size = 0; - int anc_size_remaining; - u32 *anc_ptr; - u16 reg; - u8 mask, val; - size_t cal_size; - const void *data; - - if (!tavil->anc_func) - return 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - hwdep_cal = wcdcal_get_fw_cal(tavil->fw_data, WCD9XXX_ANC_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration, cal_size %zd", - __func__, cal_size); - } else { - filename = "WCD934X/WCD934X_anc.bin"; - ret = request_firmware(&fw, filename, codec->dev); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to acquire ANC data: %d\n", - __func__, ret); - return ret; - } - if (!fw) { - dev_err(codec->dev, "%s: Failed to get anc fw\n", - __func__); - return -ENODEV; - } - data = fw->data; - cal_size = fw->size; - dev_dbg(codec->dev, "%s: using request_firmware calibration\n", - __func__); - } - if (cal_size < sizeof(struct wcd9xxx_anc_header)) { - dev_err(codec->dev, "%s: Invalid cal_size %zd\n", - __func__, cal_size); - ret = -EINVAL; - goto err; - } - /* First number is the number of register writes */ - anc_head = (struct wcd9xxx_anc_header *)(data); - anc_ptr = (u32 *)(data + sizeof(struct wcd9xxx_anc_header)); - anc_size_remaining = cal_size - - sizeof(struct wcd9xxx_anc_header); - num_anc_slots = anc_head->num_anc_slots; - - if (tavil->anc_slot >= num_anc_slots) { - dev_err(codec->dev, "%s: Invalid ANC slot selected\n", - __func__); - ret = -EINVAL; - goto err; - } - for (i = 0; i < num_anc_slots; i++) { - if (anc_size_remaining < WCD934X_PACKED_REG_SIZE) { - dev_err(codec->dev, "%s: Invalid register format\n", - __func__); - ret = -EINVAL; - goto err; - } - anc_writes_size = (u32)(*anc_ptr); - anc_size_remaining -= sizeof(u32); - anc_ptr += 1; - - if ((anc_writes_size * WCD934X_PACKED_REG_SIZE) > - anc_size_remaining) { - dev_err(codec->dev, "%s: Invalid register format\n", - __func__); - ret = -EINVAL; - goto err; - } - - if (tavil->anc_slot == i) - break; - - anc_size_remaining -= (anc_writes_size * - WCD934X_PACKED_REG_SIZE); - anc_ptr += anc_writes_size; - } - if (i == num_anc_slots) { - dev_err(codec->dev, "%s: Selected ANC slot not present\n", - __func__); - ret = -EINVAL; - goto err; - } - - i = 0; - - if (!strcmp(w->name, "RX INT1 DAC") || - !strcmp(w->name, "RX INT3 DAC")) - anc_writes_size = anc_writes_size / 2; - else if (!strcmp(w->name, "RX INT2 DAC") || - !strcmp(w->name, "RX INT4 DAC")) - i = anc_writes_size / 2; - - for (; i < anc_writes_size; i++) { - WCD934X_CODEC_UNPACK_ENTRY(anc_ptr[i], reg, mask, val); - snd_soc_write(codec, reg, (val & mask)); - } - - /* Rate converter clk enable and set bypass mode */ - if (!strcmp(w->name, "RX INT0 DAC") || - !strcmp(w->name, "RX INT1 DAC") || - !strcmp(w->name, "ANC SPK1 PA")) { - snd_soc_update_bits(codec, - WCD934X_CDC_ANC0_RC_COMMON_CTL, - 0x05, 0x05); - if (!strcmp(w->name, "RX INT1 DAC")) { - snd_soc_update_bits(codec, - WCD934X_CDC_ANC0_FIFO_COMMON_CTL, - 0x66, 0x66); - } - } else if (!strcmp(w->name, "RX INT2 DAC")) { - snd_soc_update_bits(codec, - WCD934X_CDC_ANC1_RC_COMMON_CTL, - 0x05, 0x05); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC1_FIFO_COMMON_CTL, - 0x66, 0x66); - } - if (!strcmp(w->name, "RX INT1 DAC")) - snd_soc_update_bits(codec, - WCD934X_CDC_ANC0_CLK_RESET_CTL, 0x08, 0x08); - else if (!strcmp(w->name, "RX INT2 DAC")) - snd_soc_update_bits(codec, - WCD934X_CDC_ANC1_CLK_RESET_CTL, 0x08, 0x08); - - if (!hwdep_cal) - release_firmware(fw); - break; - - case SND_SOC_DAPM_POST_PMU: - if (!strcmp(w->name, "ANC HPHL PA") || - !strcmp(w->name, "ANC HPHR PA")) { - /* Remove ANC Rx from reset */ - snd_soc_update_bits(codec, - WCD934X_CDC_ANC0_CLK_RESET_CTL, - 0x08, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC1_CLK_RESET_CTL, - 0x08, 0x00); - } - - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, WCD934X_CDC_ANC0_RC_COMMON_CTL, - 0x05, 0x00); - if (!strcmp(w->name, "ANC EAR PA") || - !strcmp(w->name, "ANC SPK1 PA") || - !strcmp(w->name, "ANC HPHL PA")) { - snd_soc_update_bits(codec, WCD934X_CDC_ANC0_MODE_1_CTL, - 0x30, 0x00); - msleep(50); - snd_soc_update_bits(codec, WCD934X_CDC_ANC0_MODE_1_CTL, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC0_CLK_RESET_CTL, - 0x38, 0x38); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC0_CLK_RESET_CTL, - 0x07, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC0_CLK_RESET_CTL, - 0x38, 0x00); - } else if (!strcmp(w->name, "ANC HPHR PA")) { - snd_soc_update_bits(codec, WCD934X_CDC_ANC1_MODE_1_CTL, - 0x30, 0x00); - msleep(50); - snd_soc_update_bits(codec, WCD934X_CDC_ANC1_MODE_1_CTL, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC1_CLK_RESET_CTL, - 0x38, 0x38); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC1_CLK_RESET_CTL, - 0x07, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_ANC1_CLK_RESET_CTL, - 0x38, 0x00); - } - break; - } - - return 0; -err: - if (!hwdep_cal) - release_firmware(fw); - return ret; -} - -static int tavil_get_clkmode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - if (test_bit(CLK_MODE, &tavil_p->status_mask)) - ucontrol->value.enumerated.item[0] = 1; - else - ucontrol->value.enumerated.item[0] = 0; - - dev_dbg(codec->dev, "%s: is_low_power_clock: %s\n", __func__, - test_bit(CLK_MODE, &tavil_p->status_mask) ? "true" : "false"); - - return 0; -} - -static int tavil_put_clkmode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - if (ucontrol->value.enumerated.item[0]) - set_bit(CLK_MODE, &tavil_p->status_mask); - else - clear_bit(CLK_MODE, &tavil_p->status_mask); - - dev_dbg(codec->dev, "%s: is_low_power_clock: %s\n", __func__, - test_bit(CLK_MODE, &tavil_p->status_mask) ? "true" : "false"); - - return 0; -} - -static int tavil_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil_p->vi_feed_value; - - return 0; -} - -static int tavil_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: enable: %d, port_id:%d, dai_id: %d\n", - __func__, enable, port_id, dai_id); - - tavil_p->vi_feed_value = ucontrol->value.integer.value[0]; - - mutex_lock(&tavil_p->codec_mutex); - if (enable) { - if (port_id == WCD934X_TX14 && !test_bit(VI_SENSE_1, - &tavil_p->status_mask)) { - list_add_tail(&core->tx_chs[WCD934X_TX14].list, - &tavil_p->dai[dai_id].wcd9xxx_ch_list); - set_bit(VI_SENSE_1, &tavil_p->status_mask); - } - if (port_id == WCD934X_TX15 && !test_bit(VI_SENSE_2, - &tavil_p->status_mask)) { - list_add_tail(&core->tx_chs[WCD934X_TX15].list, - &tavil_p->dai[dai_id].wcd9xxx_ch_list); - set_bit(VI_SENSE_2, &tavil_p->status_mask); - } - } else { - if (port_id == WCD934X_TX14 && test_bit(VI_SENSE_1, - &tavil_p->status_mask)) { - list_del_init(&core->tx_chs[WCD934X_TX14].list); - clear_bit(VI_SENSE_1, &tavil_p->status_mask); - } - if (port_id == WCD934X_TX15 && test_bit(VI_SENSE_2, - &tavil_p->status_mask)) { - list_del_init(&core->tx_chs[WCD934X_TX15].list); - clear_bit(VI_SENSE_2, &tavil_p->status_mask); - } - } - mutex_unlock(&tavil_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); - - return 0; -} - -static int slim_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil_p->tx_port_value; - return 0; -} - -static int slim_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - u32 vtable; - - dev_dbg(codec->dev, "%s: wname %s cname %s value %u shift %d item %ld\n", - __func__, - widget->name, ucontrol->id.name, tavil_p->tx_port_value, - widget->shift, ucontrol->value.integer.value[0]); - - mutex_lock(&tavil_p->codec_mutex); - if (dai_id >= ARRAY_SIZE(vport_slim_check_table)) { - dev_err(codec->dev, "%s: dai_id: %d, out of bounds\n", - __func__, dai_id); - mutex_unlock(&tavil_p->codec_mutex); - return -EINVAL; - } - vtable = vport_slim_check_table[dai_id]; - - switch (dai_id) { - case AIF1_CAP: - case AIF2_CAP: - case AIF3_CAP: - /* only add to the list if value not set */ - if (enable && !(tavil_p->tx_port_value & 1 << port_id)) { - if (wcd9xxx_tx_vport_validation(vtable, port_id, - tavil_p->dai, NUM_CODEC_DAIS)) { - dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n", - __func__, port_id); - mutex_unlock(&tavil_p->codec_mutex); - return 0; - } - tavil_p->tx_port_value |= 1 << port_id; - list_add_tail(&core->tx_chs[port_id].list, - &tavil_p->dai[dai_id].wcd9xxx_ch_list); - } else if (!enable && (tavil_p->tx_port_value & - 1 << port_id)) { - tavil_p->tx_port_value &= ~(1 << port_id); - list_del_init(&core->tx_chs[port_id].list); - } else { - if (enable) - dev_dbg(codec->dev, "%s: TX%u port is used by\n" - "this virtual port\n", - __func__, port_id); - else - dev_dbg(codec->dev, "%s: TX%u port is not used by\n" - "this virtual port\n", - __func__, port_id); - /* avoid update power function */ - mutex_unlock(&tavil_p->codec_mutex); - return 0; - } - break; - case AIF4_MAD_TX: - break; - default: - dev_err(codec->dev, "Unknown AIF %d\n", dai_id); - mutex_unlock(&tavil_p->codec_mutex); - return -EINVAL; - } - dev_dbg(codec->dev, "%s: name %s sname %s updated value %u shift %d\n", - __func__, widget->name, widget->sname, tavil_p->tx_port_value, - widget->shift); - - mutex_unlock(&tavil_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} - -static int i2s_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil_p->tx_port_value; - return 0; -} - -static int i2s_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - (struct soc_multi_mixer_control *)kcontrol->private_value; - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - u32 vtable; - - dev_dbg(codec->dev, "%s: wname %s cname %s value %u shift %d item %ld\n", - __func__, - widget->name, ucontrol->id.name, tavil_p->tx_port_value, - widget->shift, ucontrol->value.integer.value[0]); - - mutex_lock(&tavil_p->codec_mutex); - if (dai_id >= ARRAY_SIZE(vport_slim_check_table)) { - dev_err(codec->dev, "%s: dai_id: %d, out of bounds\n", - __func__, dai_id); - mutex_unlock(&tavil_p->codec_mutex); - return -EINVAL; - } - vtable = vport_slim_check_table[dai_id]; - - switch (dai_id) { - case AIF1_CAP: - case AIF2_CAP: - case AIF3_CAP: - /* only add to the list if value not set */ - if (enable && !(tavil_p->tx_port_value & 1 << port_id)) { - if (wcd9xxx_tx_vport_validation(vtable, port_id, - tavil_p->dai, NUM_CODEC_DAIS)) { - dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n", - __func__, port_id); - mutex_unlock(&tavil_p->codec_mutex); - return 0; - } - tavil_p->tx_port_value |= 1 << port_id; - } else if (!enable && (tavil_p->tx_port_value & - 1 << port_id)) { - tavil_p->tx_port_value &= ~(1 << port_id); - } else { - if (enable) - dev_dbg(codec->dev, "%s: TX%u port is used by\n" - "this virtual port\n", - __func__, port_id); - else - dev_dbg(codec->dev, "%s: TX%u port is not used by\n" - "this virtual port\n", - __func__, port_id); - /* avoid update power function */ - mutex_unlock(&tavil_p->codec_mutex); - return 0; - } - break; - default: - dev_err(codec->dev, "Unknown AIF %d\n", dai_id); - mutex_unlock(&tavil_p->codec_mutex); - return -EINVAL; - } - dev_dbg(codec->dev, "%s: name %s sname %s updated value %u shift %d\n", - __func__, widget->name, widget->sname, tavil_p->tx_port_value, - widget->shift); - - mutex_unlock(&tavil_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} - -static int slim_rx_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = - tavil_p->rx_port_value[widget->shift]; - return 0; -} - -static int slim_rx_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - unsigned int rx_port_value; - u32 port_id = widget->shift; - - tavil_p->rx_port_value[port_id] = ucontrol->value.enumerated.item[0]; - rx_port_value = tavil_p->rx_port_value[port_id]; - - mutex_lock(&tavil_p->codec_mutex); - dev_dbg(codec->dev, "%s: wname %s cname %s value %u shift %d item %ld\n", - __func__, widget->name, ucontrol->id.name, - rx_port_value, widget->shift, - ucontrol->value.integer.value[0]); - - /* value need to match the Virtual port and AIF number */ - switch (rx_port_value) { - case 0: - list_del_init(&core->rx_chs[port_id].list); - break; - case 1: - if (wcd9xxx_rx_vport_validation(port_id + - WCD934X_RX_PORT_START_NUMBER, - &tavil_p->dai[AIF1_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tavil_p->dai[AIF1_PB].wcd9xxx_ch_list); - break; - case 2: - if (wcd9xxx_rx_vport_validation(port_id + - WCD934X_RX_PORT_START_NUMBER, - &tavil_p->dai[AIF2_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tavil_p->dai[AIF2_PB].wcd9xxx_ch_list); - break; - case 3: - if (wcd9xxx_rx_vport_validation(port_id + - WCD934X_RX_PORT_START_NUMBER, - &tavil_p->dai[AIF3_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tavil_p->dai[AIF3_PB].wcd9xxx_ch_list); - break; - case 4: - if (wcd9xxx_rx_vport_validation(port_id + - WCD934X_RX_PORT_START_NUMBER, - &tavil_p->dai[AIF4_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &tavil_p->dai[AIF4_PB].wcd9xxx_ch_list); - break; - default: - dev_err(codec->dev, "Unknown AIF %d\n", rx_port_value); - goto err; - } -rtn: - mutex_unlock(&tavil_p->codec_mutex); - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - - return 0; -err: - mutex_unlock(&tavil_p->codec_mutex); - return -EINVAL; -} - -static void tavil_codec_enable_slim_port_intr( - struct wcd9xxx_codec_dai_data *dai, - struct snd_soc_codec *codec) -{ - struct wcd9xxx_ch *ch; - int port_num = 0; - unsigned short reg = 0; - u8 val = 0; - struct tavil_priv *tavil_p; - - if (!dai || !codec) { - pr_err("%s: Invalid params\n", __func__); - return; - } - - tavil_p = snd_soc_codec_get_drvdata(codec); - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - if (ch->port >= WCD934X_RX_PORT_START_NUMBER) { - port_num = ch->port - WCD934X_RX_PORT_START_NUMBER; - reg = WCD934X_SLIM_PGD_PORT_INT_RX_EN0 + (port_num / 8); - val = wcd9xxx_interface_reg_read(tavil_p->wcd9xxx, - reg); - if (!(val & BYTE_BIT_MASK(port_num))) { - val |= BYTE_BIT_MASK(port_num); - wcd9xxx_interface_reg_write( - tavil_p->wcd9xxx, reg, val); - val = wcd9xxx_interface_reg_read( - tavil_p->wcd9xxx, reg); - } - } else { - port_num = ch->port; - reg = WCD934X_SLIM_PGD_PORT_INT_TX_EN0 + (port_num / 8); - val = wcd9xxx_interface_reg_read(tavil_p->wcd9xxx, - reg); - if (!(val & BYTE_BIT_MASK(port_num))) { - val |= BYTE_BIT_MASK(port_num); - wcd9xxx_interface_reg_write(tavil_p->wcd9xxx, - reg, val); - val = wcd9xxx_interface_reg_read( - tavil_p->wcd9xxx, reg); - } - } - } -} - -static int tavil_codec_enable_slim_chmask(struct wcd9xxx_codec_dai_data *dai, - bool up) -{ - int ret = 0; - struct wcd9xxx_ch *ch; - - if (up) { - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - ret = wcd9xxx_get_slave_port(ch->ch_num); - if (ret < 0) { - pr_err("%s: Invalid slave port ID: %d\n", - __func__, ret); - ret = -EINVAL; - } else { - set_bit(ret, &dai->ch_mask); - } - } - } else { - ret = wait_event_timeout(dai->dai_wait, (dai->ch_mask == 0), - msecs_to_jiffies( - WCD934X_SLIM_CLOSE_TIMEOUT)); - if (!ret) { - pr_err("%s: Slim close tx/rx wait timeout, ch_mask:0x%lx\n", - __func__, dai->ch_mask); - ret = -ETIMEDOUT; - } else { - ret = 0; - } - } - return ret; -} - -static void tavil_codec_mute_dsd(struct snd_soc_codec *codec, - struct list_head *ch_list) -{ - u8 dsd0_in; - u8 dsd1_in; - struct wcd9xxx_ch *ch; - - /* Read DSD Input Ports */ - dsd0_in = (snd_soc_read(codec, WCD934X_CDC_DSD0_CFG0) & 0x3C) >> 2; - dsd1_in = (snd_soc_read(codec, WCD934X_CDC_DSD1_CFG0) & 0x3C) >> 2; - - if ((dsd0_in == 0) && (dsd1_in == 0)) - return; - - /* - * Check if the ports getting disabled are connected to DSD inputs. - * If connected, enable DSD mute to avoid DC entering into DSD Filter - */ - list_for_each_entry(ch, ch_list, list) { - if (ch->port == (dsd0_in + WCD934X_RX_PORT_START_NUMBER - 1)) - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, - 0x04, 0x04); - if (ch->port == (dsd1_in + WCD934X_RX_PORT_START_NUMBER - 1)) - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, - 0x04, 0x04); - } -} - -static int tavil_codec_set_i2s_rx_ch(struct snd_soc_dapm_widget *w, - u32 i2s_reg, bool up) -{ - int rx_fs_rate = -EINVAL; - int i2s_bit_mode; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_codec_dai_data *dai; - - dai = &tavil_p->dai[w->shift]; - dev_dbg(tavil_p->dev, "%s: %d up/down, %d width, %d rate\n", - __func__, up, dai->bit_width, dai->rate); - if (up) { - if (dai->bit_width == 16) - i2s_bit_mode = 0x01; - else - i2s_bit_mode = 0x00; - - switch (dai->rate) { - case 8000: - rx_fs_rate = 0; - break; - case 16000: - rx_fs_rate = 1; - break; - case 32000: - rx_fs_rate = 2; - break; - case 48000: - rx_fs_rate = 3; - break; - case 96000: - rx_fs_rate = 4; - break; - case 192000: - rx_fs_rate = 5; - break; - case 384000: - rx_fs_rate = 6; - break; - default: - dev_err(tavil_p->dev, "%s: Invalid RX sample rate: %d\n", - __func__, dai->rate); - return -EINVAL; - }; - snd_soc_update_bits(codec, i2s_reg, - 0x40, i2s_bit_mode << 6); - snd_soc_update_bits(codec, i2s_reg, - 0x3c, (rx_fs_rate << 2)); - } else { - snd_soc_update_bits(codec, i2s_reg, - 0x40, 0x00); - snd_soc_update_bits(codec, i2s_reg, - 0x3c, 0x00); - } - return 0; -} - -static int tavil_codec_set_i2s_tx_ch(struct snd_soc_dapm_widget *w, - u32 i2s_reg, bool up) -{ - int tx_fs_rate = -EINVAL; - int i2s_bit_mode; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_codec_dai_data *dai; - - dai = &tavil_p->dai[w->shift]; - if (up) { - if (dai->bit_width == 16) - i2s_bit_mode = 0x01; - else - i2s_bit_mode = 0x00; - - snd_soc_update_bits(codec, i2s_reg, 0x40, i2s_bit_mode << 6); - - switch (dai->rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 2; - break; - case 48000: - tx_fs_rate = 3; - break; - case 96000: - tx_fs_rate = 4; - break; - case 192000: - tx_fs_rate = 5; - break; - case 384000: - tx_fs_rate = 6; - break; - default: - dev_err(tavil_p->dev, "%s: Invalid sample rate: %d\n", - __func__, dai->rate); - return -EINVAL; - }; - - snd_soc_update_bits(codec, i2s_reg, 0x3c, tx_fs_rate << 2); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX0_CFG, - 0x03, 0x01); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX0_CFG, - 0x0C, 0x01); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX1_0_CFG, - 0x03, 0x01); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX1_1_CFG, - 0x05, 0x05); - } else { - snd_soc_update_bits(codec, i2s_reg, 0x40, 0x00); - snd_soc_update_bits(codec, i2s_reg, 0x3c, 0x00); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX0_CFG, - 0x03, 0x00); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX0_CFG, - 0x0C, 0x00); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX1_0_CFG, - 0x03, 0x00); - - snd_soc_update_bits(codec, - WCD934X_DATA_HUB_I2S_TX1_1_CFG, - 0x05, 0x00); - } - return 0; -} - -static int tavil_codec_enable_rx_i2c(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - int ret = -EINVAL; - u32 i2s_reg; - - switch (tavil_p->rx_port_value[w->shift]) { - case AIF1_PB: - case AIF1_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_0_CTL; - break; - case AIF2_PB: - case AIF2_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_1_CTL; - break; - case AIF3_PB: - case AIF3_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_2_CTL; - break; - default: - dev_err(codec->dev, "%s Invalid i2s Id received", __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - ret = tavil_codec_set_i2s_rx_ch(w, i2s_reg, true); - break; - case SND_SOC_DAPM_POST_PMD: - ret = tavil_codec_set_i2s_rx_ch(w, i2s_reg, false); - break; - } - - return ret; -} - -static int tavil_codec_enable_rx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct wcd9xxx *core; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - int ret = 0; - struct wcd9xxx_codec_dai_data *dai; - struct tavil_dsd_config *dsd_conf = tavil_p->dsd_config; - - core = dev_get_drvdata(codec->dev->parent); - - dev_dbg(codec->dev, "%s: event called! codec name %s num_dai %d\n" - "stream name %s event %d\n", - __func__, codec->component.name, - codec->component.num_dai, w->sname, event); - - dai = &tavil_p->dai[w->shift]; - dev_dbg(codec->dev, "%s: w->name %s w->shift %d event %d\n", - __func__, w->name, w->shift, event); - - if (tavil_p->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - ret = tavil_codec_enable_rx_i2c(w, kcontrol, event); - return ret; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - dai->bus_down_in_recovery = false; - tavil_codec_enable_slim_port_intr(dai, codec); - (void) tavil_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - if (dsd_conf) - tavil_codec_mute_dsd(codec, &dai->wcd9xxx_ch_list); - - ret = wcd9xxx_disconnect_port(core, &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect RX port, ret = %d\n", - __func__, ret); - - if (!dai->bus_down_in_recovery) - ret = tavil_codec_enable_slim_chmask(dai, false); - else - dev_dbg(codec->dev, - "%s: bus in recovery skip enable slim_chmask", - __func__); - ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list, - dai->grph); - break; - } - return ret; -} - -static int tavil_codec_enable_tx_i2c(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - int ret = -EINVAL; - u32 i2s_reg; - - switch (tavil_p->rx_port_value[w->shift]) { - case AIF1_PB: - case AIF1_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_0_CTL; - break; - case AIF2_PB: - case AIF2_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_1_CTL; - break; - case AIF3_PB: - case AIF3_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_2_CTL; - break; - default: - dev_err(codec->dev, "%s Invalid i2s Id received", __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - ret = tavil_codec_set_i2s_tx_ch(w, i2s_reg, true); - break; - case SND_SOC_DAPM_POST_PMD: - ret = tavil_codec_set_i2s_tx_ch(w, i2s_reg, false); - break; - } - - return ret; -} - -static int tavil_codec_enable_tx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_codec_dai_data *dai; - struct wcd9xxx *core; - struct wcd9xxx_ch *ch; - int ret = 0; - - dev_dbg(codec->dev, - "%s: w->name %s, w->shift = %d, num_dai %d stream name %s\n", - __func__, w->name, w->shift, - codec->component.num_dai, w->sname); - - dai = &tavil_p->dai[w->shift]; - core = dev_get_drvdata(codec->dev->parent); - - if (tavil_p->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - ret = tavil_codec_enable_tx_i2c(w, kcontrol, event); - return ret; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - dai->bus_down_in_recovery = false; - tavil_codec_enable_slim_port_intr(dai, codec); - (void) tavil_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->grph); - if (!dai->bus_down_in_recovery) - ret = tavil_codec_enable_slim_chmask(dai, false); - if (ret < 0) { - ret = wcd9xxx_disconnect_port(core, - &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect RX port, ret = %d\n", - __func__, ret); - } - /* reset overflow and underflow counts */ - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - tavil_p->slim_tx_of_uf_cnt[ch->port][SB_PORT_ERR_OF] - = 0; - tavil_p->slim_tx_of_uf_cnt[ch->port][SB_PORT_ERR_UF] - = 0; - } - break; - } - return ret; -} - -static int tavil_codec_enable_slimvi_feedback(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct wcd9xxx *core = NULL; - struct snd_soc_codec *codec = NULL; - struct tavil_priv *tavil_p = NULL; - int ret = 0; - struct wcd9xxx_codec_dai_data *dai = NULL; - struct wcd9xxx_ch *ch; - - codec = snd_soc_dapm_to_codec(w->dapm); - tavil_p = snd_soc_codec_get_drvdata(codec); - core = dev_get_drvdata(codec->dev->parent); - - dev_dbg(codec->dev, - "%s: num_dai %d stream name %s w->name %s event %d shift %d\n", - __func__, codec->component.num_dai, w->sname, - w->name, event, w->shift); - - if (w->shift != AIF4_VIFEED) { - pr_err("%s Error in enabling the tx path\n", __func__); - ret = -EINVAL; - goto done; - } - dai = &tavil_p->dai[w->shift]; - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (test_bit(VI_SENSE_1, &tavil_p->status_mask)) { - dev_dbg(codec->dev, "%s: spkr1 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL, 0x0F, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, - WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - if (test_bit(VI_SENSE_2, &tavil_p->status_mask)) { - pr_debug("%s: spkr2 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - dai->bus_down_in_recovery = false; - tavil_codec_enable_slim_port_intr(dai, codec); - (void) tavil_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->grph); - if (ret) - dev_err(codec->dev, "%s error in close_slim_sch_tx %d\n", - __func__, ret); - if (!dai->bus_down_in_recovery) - ret = tavil_codec_enable_slim_chmask(dai, false); - if (ret < 0) { - ret = wcd9xxx_disconnect_port(core, - &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect TX port, ret = %d\n", - __func__, ret); - } - /* reset over.f and under.f counts */ - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - tavil_p->slim_tx_of_uf_cnt[ch->port][SB_PORT_ERR_OF] - = 0; - tavil_p->slim_tx_of_uf_cnt[ch->port][SB_PORT_ERR_UF] - = 0; - } - if (test_bit(VI_SENSE_1, &tavil_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr1 disabled\n", __func__); - snd_soc_update_bits(codec, - WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - if (test_bit(VI_SENSE_2, &tavil_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr2 disabled\n", __func__); - snd_soc_update_bits(codec, - WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - break; - } -done: - return ret; -} - -static int tavil_codec_enable_rx_bias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil->rx_bias_count++; - if (tavil->rx_bias_count == 1) { - snd_soc_update_bits(codec, WCD934X_ANA_RX_SUPPLIES, - 0x01, 0x01); - } - break; - case SND_SOC_DAPM_POST_PMD: - tavil->rx_bias_count--; - if (!tavil->rx_bias_count) - snd_soc_update_bits(codec, WCD934X_ANA_RX_SUPPLIES, - 0x01, 0x00); - break; - }; - dev_dbg(codec->dev, "%s: Current RX BIAS user count: %d\n", __func__, - tavil->rx_bias_count); - - return 0; -} - -static void tavil_spk_anc_update_callback(struct work_struct *work) -{ - struct spk_anc_work *spk_anc_dwork; - struct tavil_priv *tavil; - struct delayed_work *delayed_work; - struct snd_soc_codec *codec; - - delayed_work = to_delayed_work(work); - spk_anc_dwork = container_of(delayed_work, struct spk_anc_work, dwork); - tavil = spk_anc_dwork->tavil; - codec = tavil->codec; - - snd_soc_update_bits(codec, WCD934X_CDC_RX7_RX_PATH_CFG0, 0x10, 0x10); -} - -static int tavil_codec_enable_spkr_anc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - if (!tavil->anc_func) - return 0; - - dev_dbg(codec->dev, "%s: w: %s event: %d anc: %d\n", __func__, - w->name, event, tavil->anc_func); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = tavil_codec_enable_anc(w, kcontrol, event); - schedule_delayed_work(&tavil->spk_anc_dwork.dwork, - msecs_to_jiffies(spk_anc_en_delay)); - break; - case SND_SOC_DAPM_POST_PMD: - cancel_delayed_work_sync(&tavil->spk_anc_dwork.dwork); - snd_soc_update_bits(codec, WCD934X_CDC_RX7_RX_PATH_CFG0, - 0x10, 0x00); - ret = tavil_codec_enable_anc(w, kcontrol, event); - break; - } - return ret; -} - -static int tavil_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* - * 5ms sleep is required after PA is enabled as per - * HW requirement - */ - usleep_range(5000, 5500); - snd_soc_update_bits(codec, WCD934X_CDC_RX0_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD934X_CDC_RX0_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD934X_CDC_RX0_RX_PATH_MIX_CTL, - 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 5ms sleep is required after PA is disabled as per - * HW requirement - */ - usleep_range(5000, 5500); - - if (!(strcmp(w->name, "ANC EAR PA"))) { - ret = tavil_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, WCD934X_CDC_RX0_RX_PATH_CFG0, - 0x10, 0x00); - } - break; - }; - - return ret; -} - -static void tavil_codec_override(struct snd_soc_codec *codec, int mode, - int event) -{ - if (mode == CLS_AB || mode == CLS_AB_HIFI) { - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, - WCD9XXX_A_ANA_RX_SUPPLIES, 0x02, 0x02); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD9XXX_A_ANA_RX_SUPPLIES, 0x02, 0x00); - break; - } - } -} - -static void tavil_codec_clear_anc_tx_hold(struct tavil_priv *tavil) -{ - if (test_and_clear_bit(ANC_MIC_AMIC1, &tavil->status_mask)) - tavil_codec_set_tx_hold(tavil->codec, WCD934X_ANA_AMIC1, false); - if (test_and_clear_bit(ANC_MIC_AMIC2, &tavil->status_mask)) - tavil_codec_set_tx_hold(tavil->codec, WCD934X_ANA_AMIC2, false); - if (test_and_clear_bit(ANC_MIC_AMIC3, &tavil->status_mask)) - tavil_codec_set_tx_hold(tavil->codec, WCD934X_ANA_AMIC3, false); - if (test_and_clear_bit(ANC_MIC_AMIC4, &tavil->status_mask)) - tavil_codec_set_tx_hold(tavil->codec, WCD934X_ANA_AMIC4, false); -} - - -static void tavil_ocp_control(struct snd_soc_codec *codec, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD934X_HPH_OCP_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, WCD934X_RX_OCP_CTL, 0x0F, 0x02); - } else { - snd_soc_update_bits(codec, WCD934X_RX_OCP_CTL, 0x0F, 0x0F); - snd_soc_update_bits(codec, WCD934X_HPH_OCP_CTL, 0x10, 0x00); - } -} - -static int tavil_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - struct tavil_dsd_config *dsd_conf = tavil->dsd_config; - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil_ocp_control(codec, false); - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL, - 0x06, (0x03 << 1)); - - if ((!(strcmp(w->name, "ANC HPHR PA"))) && - (test_bit(HPH_PA_DELAY, &tavil->status_mask))) - snd_soc_update_bits(codec, WCD934X_ANA_HPH, 0xC0, 0xC0); - - set_bit(HPH_PA_DELAY, &tavil->status_mask); - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD1_PATH_CTL) & 0x01)) { - /* Set regulator mode to AB if DSD is enabled */ - snd_soc_update_bits(codec, WCD934X_ANA_RX_SUPPLIES, - 0x02, 0x02); - } - break; - case SND_SOC_DAPM_POST_PMU: - if ((!(strcmp(w->name, "ANC HPHR PA")))) { - if ((snd_soc_read(codec, WCD934X_ANA_HPH) & 0xC0) - != 0xC0) - /* - * If PA_EN is not set (potentially in ANC case) - * then do nothing for POST_PMU and let left - * channel handle everything. - */ - break; - } - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is needed. - */ - if (test_bit(HPH_PA_DELAY, &tavil->status_mask)) { - if (!tavil->comp_enabled[COMPANDER_2]) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &tavil->status_mask); - } - if (tavil->anc_func) { - /* Clear Tx FE HOLD if both PAs are enabled */ - if ((snd_soc_read(tavil->codec, WCD934X_ANA_HPH) & - 0xC0) == 0xC0) - tavil_codec_clear_anc_tx_hold(tavil); - } - - snd_soc_update_bits(codec, WCD934X_HPH_R_TEST, 0x01, 0x01); - - /* Remove mute */ - snd_soc_update_bits(codec, WCD934X_CDC_RX2_RX_PATH_CTL, - 0x10, 0x00); - /* Enable GM3 boost */ - snd_soc_update_bits(codec, WCD934X_HPH_CNP_WG_CTL, - 0x80, 0x80); - /* Enable AutoChop timer at the end of power up */ - snd_soc_update_bits(codec, WCD934X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD934X_CDC_RX2_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD934X_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x00); - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD1_PATH_CTL) & 0x01)) - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, - 0x04, 0x00); - if (!(strcmp(w->name, "ANC HPHR PA"))) { - pr_debug("%s:Do everything needed for left channel\n", - __func__); - /* Do everything needed for left channel */ - snd_soc_update_bits(codec, WCD934X_HPH_L_TEST, - 0x01, 0x01); - - /* Remove mute */ - snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CTL, - 0x10, 0x00); - - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, - WCD934X_CDC_RX1_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD934X_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x00); - - if (dsd_conf && (snd_soc_read(codec, - WCD934X_CDC_DSD0_PATH_CTL) & - 0x01)) - snd_soc_update_bits(codec, - WCD934X_CDC_DSD0_CFG2, - 0x04, 0x00); - /* Remove ANC Rx from reset */ - ret = tavil_codec_enable_anc(w, kcontrol, event); - } - tavil_codec_override(codec, tavil->hph_mode, event); - tavil_ocp_control(codec, true); - break; - case SND_SOC_DAPM_PRE_PMD: - tavil_ocp_control(codec, false); - if (tavil->mbhc) - blocking_notifier_call_chain(&tavil->mbhc->notifier, - WCD_EVENT_PRE_HPHR_PA_OFF, - &tavil->mbhc->wcd_mbhc); - /* Enable DSD Mute before PA disable */ - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD1_PATH_CTL) & 0x01)) - snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_HPH_R_TEST, 0x01, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_RX2_RX_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, WCD934X_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x10); - if (!(strcmp(w->name, "ANC HPHR PA"))) - snd_soc_update_bits(codec, WCD934X_ANA_HPH, 0x40, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 5ms sleep is required after PA disable. If compander is - * disabled, then 20ms delay is needed after PA disable. - */ - if (!tavil->comp_enabled[COMPANDER_2]) - usleep_range(20000, 20100); - else - usleep_range(5000, 5100); - tavil_codec_override(codec, tavil->hph_mode, event); - if (tavil->mbhc) - blocking_notifier_call_chain(&tavil->mbhc->notifier, - WCD_EVENT_POST_HPHR_PA_OFF, - &tavil->mbhc->wcd_mbhc); - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL, - 0x06, 0x0); - if (!(strcmp(w->name, "ANC HPHR PA"))) { - ret = tavil_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, - WCD934X_CDC_RX2_RX_PATH_CFG0, - 0x10, 0x00); - } - tavil_ocp_control(codec, true); - break; - }; - - return ret; -} - -static int tavil_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - struct tavil_dsd_config *dsd_conf = tavil->dsd_config; - int ret = 0; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil_ocp_control(codec, false); - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL, - 0x06, (0x03 << 1)); - if ((!(strcmp(w->name, "ANC HPHL PA"))) && - (test_bit(HPH_PA_DELAY, &tavil->status_mask))) - snd_soc_update_bits(codec, WCD934X_ANA_HPH, - 0xC0, 0xC0); - set_bit(HPH_PA_DELAY, &tavil->status_mask); - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD0_PATH_CTL) & 0x01)) { - /* Set regulator mode to AB if DSD is enabled */ - snd_soc_update_bits(codec, WCD934X_ANA_RX_SUPPLIES, - 0x02, 0x02); - } - break; - case SND_SOC_DAPM_POST_PMU: - if (!(strcmp(w->name, "ANC HPHL PA"))) { - if ((snd_soc_read(codec, WCD934X_ANA_HPH) & 0xC0) - != 0xC0) - /* - * If PA_EN is not set (potentially in ANC - * case) then do nothing for POST_PMU and - * let right channel handle everything. - */ - break; - } - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is needed. - */ - if (test_bit(HPH_PA_DELAY, &tavil->status_mask)) { - if (!tavil->comp_enabled[COMPANDER_1]) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &tavil->status_mask); - } - if (tavil->anc_func) { - /* Clear Tx FE HOLD if both PAs are enabled */ - if ((snd_soc_read(tavil->codec, WCD934X_ANA_HPH) & - 0xC0) == 0xC0) - tavil_codec_clear_anc_tx_hold(tavil); - } - - snd_soc_update_bits(codec, WCD934X_HPH_L_TEST, 0x01, 0x01); - /* Remove Mute on primary path */ - snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CTL, - 0x10, 0x00); - /* Enable GM3 boost */ - snd_soc_update_bits(codec, WCD934X_HPH_CNP_WG_CTL, - 0x80, 0x80); - /* Enable AutoChop timer at the end of power up */ - snd_soc_update_bits(codec, WCD934X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD934X_CDC_RX1_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD934X_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x00); - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD0_PATH_CTL) & 0x01)) - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, - 0x04, 0x00); - if (!(strcmp(w->name, "ANC HPHL PA"))) { - pr_debug("%s:Do everything needed for right channel\n", - __func__); - - /* Do everything needed for right channel */ - snd_soc_update_bits(codec, WCD934X_HPH_R_TEST, - 0x01, 0x01); - - /* Remove mute */ - snd_soc_update_bits(codec, WCD934X_CDC_RX2_RX_PATH_CTL, - 0x10, 0x00); - - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, - WCD934X_CDC_RX2_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD934X_CDC_RX2_RX_PATH_MIX_CTL, - 0x10, 0x00); - if (dsd_conf && (snd_soc_read(codec, - WCD934X_CDC_DSD1_PATH_CTL) & 0x01)) - snd_soc_update_bits(codec, - WCD934X_CDC_DSD1_CFG2, - 0x04, 0x00); - /* Remove ANC Rx from reset */ - ret = tavil_codec_enable_anc(w, kcontrol, event); - } - tavil_codec_override(codec, tavil->hph_mode, event); - tavil_ocp_control(codec, true); - break; - case SND_SOC_DAPM_PRE_PMD: - tavil_ocp_control(codec, false); - if (tavil->mbhc) - blocking_notifier_call_chain(&tavil->mbhc->notifier, - WCD_EVENT_PRE_HPHL_PA_OFF, - &tavil->mbhc->wcd_mbhc); - /* Enable DSD Mute before PA disable */ - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD0_PATH_CTL) & 0x01)) - snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, - 0x04, 0x04); - - snd_soc_update_bits(codec, WCD934X_HPH_L_TEST, 0x01, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CTL, - 0x10, 0x10); - snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_MIX_CTL, - 0x10, 0x10); - if (!(strcmp(w->name, "ANC HPHL PA"))) - snd_soc_update_bits(codec, WCD934X_ANA_HPH, - 0x80, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 5ms sleep is required after PA disable. If compander is - * disabled, then 20ms delay is needed after PA disable. - */ - if (!tavil->comp_enabled[COMPANDER_1]) - usleep_range(20000, 20100); - else - usleep_range(5000, 5100); - tavil_codec_override(codec, tavil->hph_mode, event); - if (tavil->mbhc) - blocking_notifier_call_chain(&tavil->mbhc->notifier, - WCD_EVENT_POST_HPHL_PA_OFF, - &tavil->mbhc->wcd_mbhc); - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, WCD934X_HPH_REFBUFF_LP_CTL, - 0x06, 0x0); - if (!(strcmp(w->name, "ANC HPHL PA"))) { - ret = tavil_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, - WCD934X_CDC_RX1_RX_PATH_CFG0, 0x10, 0x00); - } - tavil_ocp_control(codec, true); - break; - }; - - return ret; -} - -static int tavil_codec_enable_lineout_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 lineout_vol_reg = 0, lineout_mix_vol_reg = 0; - u16 dsd_mute_reg = 0, dsd_clk_reg = 0; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - struct tavil_dsd_config *dsd_conf = tavil->dsd_config; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (w->reg == WCD934X_ANA_LO_1_2) { - if (w->shift == 7) { - lineout_vol_reg = WCD934X_CDC_RX3_RX_PATH_CTL; - lineout_mix_vol_reg = WCD934X_CDC_RX3_RX_PATH_MIX_CTL; - dsd_mute_reg = WCD934X_CDC_DSD0_CFG2; - dsd_clk_reg = WCD934X_CDC_DSD0_PATH_CTL; - } else if (w->shift == 6) { - lineout_vol_reg = WCD934X_CDC_RX4_RX_PATH_CTL; - lineout_mix_vol_reg = WCD934X_CDC_RX4_RX_PATH_MIX_CTL; - dsd_mute_reg = WCD934X_CDC_DSD1_CFG2; - dsd_clk_reg = WCD934X_CDC_DSD1_PATH_CTL; - } - } else { - dev_err(codec->dev, "%s: Error enabling lineout PA\n", - __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil_codec_override(codec, CLS_AB, event); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * 5ms sleep is required after PA is enabled as per - * HW requirement - */ - usleep_range(5000, 5500); - snd_soc_update_bits(codec, lineout_vol_reg, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, lineout_mix_vol_reg)) & 0x10) - snd_soc_update_bits(codec, - lineout_mix_vol_reg, - 0x10, 0x00); - if (dsd_conf && (snd_soc_read(codec, dsd_clk_reg) & 0x01)) - snd_soc_update_bits(codec, dsd_mute_reg, 0x04, 0x00); - break; - case SND_SOC_DAPM_PRE_PMD: - if (dsd_conf && (snd_soc_read(codec, dsd_clk_reg) & 0x01)) - snd_soc_update_bits(codec, dsd_mute_reg, 0x04, 0x04); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 5ms sleep is required after PA is disabled as per - * HW requirement - */ - usleep_range(5000, 5500); - tavil_codec_override(codec, CLS_AB, event); - default: - break; - }; - - return 0; -} - -static int i2s_rx_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = - tavil_p->rx_port_value[widget->shift]; - return 0; -} - -static int i2s_rx_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - unsigned int rx_port_value; - u32 port_id = widget->shift; - - tavil_p->rx_port_value[port_id] = ucontrol->value.enumerated.item[0]; - rx_port_value = tavil_p->rx_port_value[port_id]; - - dev_dbg(codec->dev, "%s: wname %s cname %s value %u shift %d item %ld\n", - __func__, widget->name, ucontrol->id.name, - rx_port_value, widget->shift, - ucontrol->value.integer.value[0]); - - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - return 0; -} - -static int tavil_codec_enable_i2s_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - u32 i2s_reg; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - - switch (tavil_p->rx_port_value[w->shift]) { - case AIF1_PB: - case AIF1_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_0_CTL; - break; - case AIF2_PB: - case AIF2_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_1_CTL; - break; - case AIF3_PB: - case AIF3_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_2_CTL; - break; - default: - dev_err(codec->dev, "%s Invalid i2s Id received", __func__); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = snd_soc_update_bits(codec, i2s_reg, 0x01, 0x01); - break; - case SND_SOC_DAPM_POST_PMD: - ret = snd_soc_update_bits(codec, i2s_reg, 0x01, 0x00); - break; - } - - return ret; -} - -static int tavil_codec_ear_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Disable AutoChop timer during power up */ - snd_soc_update_bits(codec, WCD934X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - - if (tavil->anc_func) - ret = tavil_codec_enable_anc(w, kcontrol, event); - - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_EAR, - CLS_H_NORMAL); - if (tavil->anc_func) - snd_soc_update_bits(codec, WCD934X_CDC_RX0_RX_PATH_CFG0, - 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_EAR, - CLS_H_NORMAL); - break; - default: - break; - }; - - return ret; -} - -static int tavil_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int hph_mode = tavil->hph_mode; - u8 dem_inp; - struct tavil_dsd_config *dsd_conf = tavil->dsd_config; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d hph_mode: %d\n", __func__, - w->name, event, hph_mode); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (tavil->anc_func) { - ret = tavil_codec_enable_anc(w, kcontrol, event); - /* 40 msec delay is needed to avoid click and pop */ - msleep(40); - } - /* Read DEM INP Select */ - dem_inp = snd_soc_read(codec, WCD934X_CDC_RX2_RX_PATH_SEC0) & - 0x03; - if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) || - (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) { - dev_err(codec->dev, "%s: DEM Input not set correctly, hph_mode: %d\n", - __func__, hph_mode); - return -EINVAL; - } - if ((hph_mode != CLS_H_LP) && (hph_mode != CLS_H_ULP)) - /* Ripple freq control enable */ - snd_soc_update_bits(codec, - WCD934X_SIDO_NEW_VOUT_D_FREQ2, - 0x01, 0x01); - /* Disable AutoChop timer during power up */ - snd_soc_update_bits(codec, WCD934X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - /* Set RDAC gain */ - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, - WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, - 0xF0, 0x40); - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD1_PATH_CTL) & 0x01)) - hph_mode = CLS_H_HIFI; - - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHR, - hph_mode); - if (tavil->anc_func) - snd_soc_update_bits(codec, - WCD934X_CDC_RX2_RX_PATH_CFG0, - 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHR, - hph_mode); - if ((hph_mode != CLS_H_LP) && (hph_mode != CLS_H_ULP)) - /* Ripple freq control disable */ - snd_soc_update_bits(codec, - WCD934X_SIDO_NEW_VOUT_D_FREQ2, - 0x01, 0x0); - /* Re-set RDAC gain */ - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, - WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, - 0xF0, 0x0); - break; - default: - break; - }; - - return 0; -} - -static int tavil_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int hph_mode = tavil->hph_mode; - u8 dem_inp; - int ret = 0; - struct tavil_dsd_config *dsd_conf = tavil->dsd_config; - uint32_t impedl = 0, impedr = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d hph_mode: %d\n", __func__, - w->name, event, hph_mode); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (tavil->anc_func) { - ret = tavil_codec_enable_anc(w, kcontrol, event); - /* 40 msec delay is needed to avoid click and pop */ - msleep(40); - } - /* Read DEM INP Select */ - dem_inp = snd_soc_read(codec, WCD934X_CDC_RX1_RX_PATH_SEC0) & - 0x03; - if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) || - (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) { - dev_err(codec->dev, "%s: DEM Input not set correctly, hph_mode: %d\n", - __func__, hph_mode); - return -EINVAL; - } - if ((hph_mode != CLS_H_LP) && (hph_mode != CLS_H_ULP)) - /* Ripple freq control enable */ - snd_soc_update_bits(codec, - WCD934X_SIDO_NEW_VOUT_D_FREQ2, - 0x01, 0x01); - /* Disable AutoChop timer during power up */ - snd_soc_update_bits(codec, WCD934X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - /* Set RDAC gain */ - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, - WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, - 0xF0, 0x40); - if (dsd_conf && - (snd_soc_read(codec, WCD934X_CDC_DSD0_PATH_CTL) & 0x01)) - hph_mode = CLS_H_HIFI; - - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHL, - hph_mode); - - if (tavil->anc_func) - snd_soc_update_bits(codec, - WCD934X_CDC_RX1_RX_PATH_CFG0, - 0x10, 0x10); - - ret = tavil_mbhc_get_impedance(tavil->mbhc, - &impedl, &impedr); - if (!ret) { - wcd_clsh_imped_config(codec, impedl, false); - set_bit(CLSH_Z_CONFIG, &tavil->status_mask); - } else { - dev_dbg(codec->dev, "%s: Failed to get mbhc impedance %d\n", - __func__, ret); - ret = 0; - } - - break; - case SND_SOC_DAPM_POST_PMD: - /* 1000us required as per HW requirement */ - usleep_range(1000, 1100); - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHL, - hph_mode); - if ((hph_mode != CLS_H_LP) && (hph_mode != CLS_H_ULP)) - /* Ripple freq control disable */ - snd_soc_update_bits(codec, - WCD934X_SIDO_NEW_VOUT_D_FREQ2, - 0x01, 0x0); - /* Re-set RDAC gain */ - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - snd_soc_update_bits(codec, - WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, - 0xF0, 0x0); - - if (test_bit(CLSH_Z_CONFIG, &tavil->status_mask)) { - wcd_clsh_imped_config(codec, impedl, true); - clear_bit(CLSH_Z_CONFIG, &tavil->status_mask); - } - break; - default: - break; - }; - - return ret; -} - -static int tavil_codec_lineout_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_LO, - CLS_AB); - break; - case SND_SOC_DAPM_POST_PMD: - wcd_clsh_fsm(codec, &tavil->clsh_d, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_LO, - CLS_AB); - break; - } - - return 0; -} - -static int tavil_codec_spk_boost_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 boost_path_ctl, boost_path_cfg1; - u16 reg, reg_mix; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (!strcmp(w->name, "RX INT7 CHAIN")) { - boost_path_ctl = WCD934X_CDC_BOOST0_BOOST_PATH_CTL; - boost_path_cfg1 = WCD934X_CDC_RX7_RX_PATH_CFG1; - reg = WCD934X_CDC_RX7_RX_PATH_CTL; - reg_mix = WCD934X_CDC_RX7_RX_PATH_MIX_CTL; - } else if (!strcmp(w->name, "RX INT8 CHAIN")) { - boost_path_ctl = WCD934X_CDC_BOOST1_BOOST_PATH_CTL; - boost_path_cfg1 = WCD934X_CDC_RX8_RX_PATH_CFG1; - reg = WCD934X_CDC_RX8_RX_PATH_CTL; - reg_mix = WCD934X_CDC_RX8_RX_PATH_MIX_CTL; - } else { - dev_err(codec->dev, "%s: unknown widget: %s\n", - __func__, w->name); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x01); - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x10); - snd_soc_update_bits(codec, reg, 0x10, 0x00); - if ((snd_soc_read(codec, reg_mix)) & 0x10) - snd_soc_update_bits(codec, reg_mix, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x00); - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x00); - break; - }; - - return 0; -} - -static int __tavil_codec_enable_swr(struct snd_soc_dapm_widget *w, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil; - int ch_cnt = 0; - - tavil = snd_soc_codec_get_drvdata(codec); - - if (!tavil->swr.ctrl_data) - return -EINVAL; - if (!tavil->swr.ctrl_data[0].swr_pdev) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (((strnstr(w->name, "INT7_", sizeof("RX INT7_"))) || - (strnstr(w->name, "INT7 MIX2", - sizeof("RX INT7 MIX2"))))) - tavil->swr.rx_7_count++; - if ((strnstr(w->name, "INT8_", sizeof("RX INT8_"))) && - !tavil->swr.rx_8_count) - tavil->swr.rx_8_count++; - ch_cnt = !!(tavil->swr.rx_7_count) + tavil->swr.rx_8_count; - - if (wcd9xxx_get_current_power_state(tavil->wcd9xxx, - WCD9XXX_DIG_CORE_REGION_1) - != WCD_REGION_POWER_COLLAPSE_REMOVE) - goto done; - - swrm_wcd_notify(tavil->swr.ctrl_data[0].swr_pdev, - SWR_DEVICE_UP, NULL); - swrm_wcd_notify(tavil->swr.ctrl_data[0].swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - break; - case SND_SOC_DAPM_POST_PMD: - if ((strnstr(w->name, "INT7_", sizeof("RX INT7_"))) || - (strnstr(w->name, "INT7 MIX2", - sizeof("RX INT7 MIX2")))) - tavil->swr.rx_7_count--; - if ((strnstr(w->name, "INT8_", sizeof("RX INT8_"))) && - tavil->swr.rx_8_count) - tavil->swr.rx_8_count--; - ch_cnt = !!(tavil->swr.rx_7_count) + tavil->swr.rx_8_count; - - swrm_wcd_notify(tavil->swr.ctrl_data[0].swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - - break; - } -done: - dev_dbg(tavil->dev, "%s: %s: current swr ch cnt: %d\n", - __func__, w->name, ch_cnt); - - return 0; -} - -static int tavil_codec_enable_swr(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return __tavil_codec_enable_swr(w, event); -} - -static int tavil_codec_config_mad(struct snd_soc_codec *codec) -{ - int ret = 0; - int idx; - const struct firmware *fw; - struct firmware_cal *hwdep_cal = NULL; - struct wcd_mad_audio_cal *mad_cal = NULL; - const void *data; - const char *filename = WCD934X_MAD_AUDIO_FIRMWARE_PATH; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - size_t cal_size; - - hwdep_cal = wcdcal_get_fw_cal(tavil->fw_data, WCD9XXX_MAD_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration\n", - __func__); - } else { - ret = request_firmware(&fw, filename, codec->dev); - if (ret || !fw) { - dev_err(codec->dev, - "%s: MAD firmware acquire failed, err = %d\n", - __func__, ret); - return -ENODEV; - } - data = fw->data; - cal_size = fw->size; - dev_dbg(codec->dev, "%s: using request_firmware calibration\n", - __func__); - } - - if (cal_size < sizeof(*mad_cal)) { - dev_err(codec->dev, - "%s: Incorrect size %zd for MAD Cal, expected %zd\n", - __func__, cal_size, sizeof(*mad_cal)); - ret = -ENOMEM; - goto done; - } - - mad_cal = (struct wcd_mad_audio_cal *) (data); - if (!mad_cal) { - dev_err(codec->dev, - "%s: Invalid calibration data\n", - __func__); - ret = -EINVAL; - goto done; - } - - snd_soc_write(codec, WCD934X_SOC_MAD_MAIN_CTL_2, - mad_cal->microphone_info.cycle_time); - snd_soc_update_bits(codec, WCD934X_SOC_MAD_MAIN_CTL_1, 0xFF << 3, - ((uint16_t)mad_cal->microphone_info.settle_time) - << 3); - - /* Audio */ - snd_soc_write(codec, WCD934X_SOC_MAD_AUDIO_CTL_8, - mad_cal->audio_info.rms_omit_samples); - snd_soc_update_bits(codec, WCD934X_SOC_MAD_AUDIO_CTL_1, - 0x07 << 4, mad_cal->audio_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD934X_SOC_MAD_AUDIO_CTL_2, 0x03 << 2, - mad_cal->audio_info.detection_mechanism << 2); - snd_soc_write(codec, WCD934X_SOC_MAD_AUDIO_CTL_7, - mad_cal->audio_info.rms_diff_threshold & 0x3F); - snd_soc_write(codec, WCD934X_SOC_MAD_AUDIO_CTL_5, - mad_cal->audio_info.rms_threshold_lsb); - snd_soc_write(codec, WCD934X_SOC_MAD_AUDIO_CTL_6, - mad_cal->audio_info.rms_threshold_msb); - - for (idx = 0; idx < ARRAY_SIZE(mad_cal->audio_info.iir_coefficients); - idx++) { - snd_soc_update_bits(codec, WCD934X_SOC_MAD_AUDIO_IIR_CTL_PTR, - 0x3F, idx); - snd_soc_write(codec, WCD934X_SOC_MAD_AUDIO_IIR_CTL_VAL, - mad_cal->audio_info.iir_coefficients[idx]); - dev_dbg(codec->dev, "%s:MAD Audio IIR Coef[%d] = 0X%x", - __func__, idx, - mad_cal->audio_info.iir_coefficients[idx]); - } - - /* Beacon */ - snd_soc_write(codec, WCD934X_SOC_MAD_BEACON_CTL_8, - mad_cal->beacon_info.rms_omit_samples); - snd_soc_update_bits(codec, WCD934X_SOC_MAD_BEACON_CTL_1, - 0x07 << 4, mad_cal->beacon_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD934X_SOC_MAD_BEACON_CTL_2, 0x03 << 2, - mad_cal->beacon_info.detection_mechanism << 2); - snd_soc_write(codec, WCD934X_SOC_MAD_BEACON_CTL_7, - mad_cal->beacon_info.rms_diff_threshold & 0x1F); - snd_soc_write(codec, WCD934X_SOC_MAD_BEACON_CTL_5, - mad_cal->beacon_info.rms_threshold_lsb); - snd_soc_write(codec, WCD934X_SOC_MAD_BEACON_CTL_6, - mad_cal->beacon_info.rms_threshold_msb); - - for (idx = 0; idx < ARRAY_SIZE(mad_cal->beacon_info.iir_coefficients); - idx++) { - snd_soc_update_bits(codec, WCD934X_SOC_MAD_BEACON_IIR_CTL_PTR, - 0x3F, idx); - snd_soc_write(codec, WCD934X_SOC_MAD_BEACON_IIR_CTL_VAL, - mad_cal->beacon_info.iir_coefficients[idx]); - dev_dbg(codec->dev, "%s:MAD Beacon IIR Coef[%d] = 0X%x", - __func__, idx, - mad_cal->beacon_info.iir_coefficients[idx]); - } - - /* Ultrasound */ - snd_soc_update_bits(codec, WCD934X_SOC_MAD_ULTR_CTL_1, - 0x07 << 4, - mad_cal->ultrasound_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD934X_SOC_MAD_ULTR_CTL_2, 0x03 << 2, - mad_cal->ultrasound_info.detection_mechanism << 2); - snd_soc_write(codec, WCD934X_SOC_MAD_ULTR_CTL_7, - mad_cal->ultrasound_info.rms_diff_threshold & 0x1F); - snd_soc_write(codec, WCD934X_SOC_MAD_ULTR_CTL_5, - mad_cal->ultrasound_info.rms_threshold_lsb); - snd_soc_write(codec, WCD934X_SOC_MAD_ULTR_CTL_6, - mad_cal->ultrasound_info.rms_threshold_msb); - -done: - if (!hwdep_cal) - release_firmware(fw); - - return ret; -} - -static int __tavil_codec_enable_mad(struct snd_soc_codec *codec, bool enable) -{ - int rc = 0; - - /* Return if CPE INPUT is DEC1 */ - if (snd_soc_read(codec, WCD934X_CPE_SS_SVA_CFG) & 0x04) { - dev_dbg(codec->dev, "%s: MAD is bypassed, skip mad %s\n", - __func__, enable ? "enable" : "disable"); - return rc; - } - - dev_dbg(codec->dev, "%s: enable = %s\n", __func__, - enable ? "enable" : "disable"); - - if (enable) { - snd_soc_update_bits(codec, WCD934X_SOC_MAD_AUDIO_CTL_2, - 0x03, 0x03); - rc = tavil_codec_config_mad(codec); - if (rc < 0) { - snd_soc_update_bits(codec, WCD934X_SOC_MAD_AUDIO_CTL_2, - 0x03, 0x00); - goto done; - } - - /* Turn on MAD clk */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_MAD_CTL, - 0x01, 0x01); - - /* Undo reset for MAD */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_MAD_CTL, - 0x02, 0x00); - } else { - snd_soc_update_bits(codec, WCD934X_SOC_MAD_AUDIO_CTL_2, - 0x03, 0x00); - /* Reset the MAD block */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_MAD_CTL, - 0x02, 0x02); - /* Turn off MAD clk */ - snd_soc_update_bits(codec, WCD934X_CPE_SS_MAD_CTL, - 0x01, 0x00); - } -done: - return rc; -} - -static int tavil_codec_ape_enable_mad(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int rc = 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WCD934X_CPE_SS_SVA_CFG, 0x40, 0x40); - rc = __tavil_codec_enable_mad(codec, true); - break; - case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, WCD934X_CPE_SS_SVA_CFG, 0x40, 0x00); - __tavil_codec_enable_mad(codec, false); - break; - } - - dev_dbg(tavil->dev, "%s: event = %d\n", __func__, event); - return rc; -} - -static int tavil_codec_cpe_mad_ctl(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int rc = 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil->mad_switch_cnt++; - if (tavil->mad_switch_cnt != 1) - goto done; - - snd_soc_update_bits(codec, WCD934X_CPE_SS_SVA_CFG, 0x20, 0x20); - rc = __tavil_codec_enable_mad(codec, true); - if (rc < 0) { - tavil->mad_switch_cnt--; - goto done; - } - - break; - case SND_SOC_DAPM_PRE_PMD: - tavil->mad_switch_cnt--; - if (tavil->mad_switch_cnt != 0) - goto done; - - snd_soc_update_bits(codec, WCD934X_CPE_SS_SVA_CFG, 0x20, 0x00); - __tavil_codec_enable_mad(codec, false); - break; - } -done: - dev_dbg(tavil->dev, "%s: event = %d, mad_switch_cnt = %d\n", - __func__, event, tavil->mad_switch_cnt); - return rc; -} - -static int tavil_get_asrc_mode(struct tavil_priv *tavil, int asrc, - u8 main_sr, u8 mix_sr) -{ - u8 asrc_output_mode; - int asrc_mode = CONV_88P2K_TO_384K; - - if ((asrc < 0) || (asrc >= ASRC_MAX)) - return 0; - - asrc_output_mode = tavil->asrc_output_mode[asrc]; - - if (asrc_output_mode) { - /* - * If Mix sample rate is < 96KHz, use 96K to 352.8K - * conversion, or else use 384K to 352.8K conversion - */ - if (mix_sr < 5) - asrc_mode = CONV_96K_TO_352P8K; - else - asrc_mode = CONV_384K_TO_352P8K; - } else { - /* Integer main and Fractional mix path */ - if (main_sr < 8 && mix_sr > 9) { - asrc_mode = CONV_352P8K_TO_384K; - } else if (main_sr > 8 && mix_sr < 8) { - /* Fractional main and Integer mix path */ - if (mix_sr < 5) - asrc_mode = CONV_96K_TO_352P8K; - else - asrc_mode = CONV_384K_TO_352P8K; - } else if (main_sr < 8 && mix_sr < 8) { - /* Integer main and Integer mix path */ - asrc_mode = CONV_96K_TO_384K; - } - } - - return asrc_mode; -} - -static int tavil_codec_wdma3_ctl(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Fix to 16KHz */ - snd_soc_update_bits(codec, WCD934X_DMA_WDMA_CTL_3, - 0xF0, 0x10); - /* Select mclk_1 */ - snd_soc_update_bits(codec, WCD934X_DMA_WDMA_CTL_3, - 0x02, 0x00); - /* Enable DMA */ - snd_soc_update_bits(codec, WCD934X_DMA_WDMA_CTL_3, - 0x01, 0x01); - break; - - case SND_SOC_DAPM_POST_PMD: - /* Disable DMA */ - snd_soc_update_bits(codec, WCD934X_DMA_WDMA_CTL_3, - 0x01, 0x00); - break; - - }; - - return 0; -} - -static int tavil_codec_enable_asrc(struct snd_soc_codec *codec, - int asrc_in, int event) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u16 cfg_reg, ctl_reg, clk_reg, asrc_ctl, mix_ctl_reg, paired_reg; - int asrc, ret = 0; - u8 main_sr, mix_sr, asrc_mode = 0; - - switch (asrc_in) { - case ASRC_IN_HPHL: - cfg_reg = WCD934X_CDC_RX1_RX_PATH_CFG0; - ctl_reg = WCD934X_CDC_RX1_RX_PATH_CTL; - clk_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL; - paired_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL; - asrc_ctl = WCD934X_MIXING_ASRC0_CTL1; - asrc = ASRC0; - break; - case ASRC_IN_LO1: - cfg_reg = WCD934X_CDC_RX3_RX_PATH_CFG0; - ctl_reg = WCD934X_CDC_RX3_RX_PATH_CTL; - clk_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL; - paired_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL; - asrc_ctl = WCD934X_MIXING_ASRC0_CTL1; - asrc = ASRC0; - break; - case ASRC_IN_HPHR: - cfg_reg = WCD934X_CDC_RX2_RX_PATH_CFG0; - ctl_reg = WCD934X_CDC_RX2_RX_PATH_CTL; - clk_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL; - paired_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL; - asrc_ctl = WCD934X_MIXING_ASRC1_CTL1; - asrc = ASRC1; - break; - case ASRC_IN_LO2: - cfg_reg = WCD934X_CDC_RX4_RX_PATH_CFG0; - ctl_reg = WCD934X_CDC_RX4_RX_PATH_CTL; - clk_reg = WCD934X_MIXING_ASRC1_CLK_RST_CTL; - paired_reg = WCD934X_MIXING_ASRC0_CLK_RST_CTL; - asrc_ctl = WCD934X_MIXING_ASRC1_CTL1; - asrc = ASRC1; - break; - case ASRC_IN_SPKR1: - cfg_reg = WCD934X_CDC_RX7_RX_PATH_CFG0; - ctl_reg = WCD934X_CDC_RX7_RX_PATH_CTL; - clk_reg = WCD934X_MIXING_ASRC2_CLK_RST_CTL; - paired_reg = WCD934X_MIXING_ASRC3_CLK_RST_CTL; - asrc_ctl = WCD934X_MIXING_ASRC2_CTL1; - asrc = ASRC2; - break; - case ASRC_IN_SPKR2: - cfg_reg = WCD934X_CDC_RX8_RX_PATH_CFG0; - ctl_reg = WCD934X_CDC_RX8_RX_PATH_CTL; - clk_reg = WCD934X_MIXING_ASRC3_CLK_RST_CTL; - paired_reg = WCD934X_MIXING_ASRC2_CLK_RST_CTL; - asrc_ctl = WCD934X_MIXING_ASRC3_CTL1; - asrc = ASRC3; - break; - default: - dev_err(codec->dev, "%s: Invalid asrc input :%d\n", __func__, - asrc_in); - ret = -EINVAL; - goto done; - }; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (tavil->asrc_users[asrc] == 0) { - if ((snd_soc_read(codec, clk_reg) & 0x02) || - (snd_soc_read(codec, paired_reg) & 0x02)) { - snd_soc_update_bits(codec, clk_reg, - 0x02, 0x00); - snd_soc_update_bits(codec, paired_reg, - 0x02, 0x00); - } - snd_soc_update_bits(codec, cfg_reg, 0x80, 0x80); - snd_soc_update_bits(codec, clk_reg, 0x01, 0x01); - main_sr = snd_soc_read(codec, ctl_reg) & 0x0F; - mix_ctl_reg = ctl_reg + 5; - mix_sr = snd_soc_read(codec, mix_ctl_reg) & 0x0F; - asrc_mode = tavil_get_asrc_mode(tavil, asrc, - main_sr, mix_sr); - dev_dbg(codec->dev, "%s: main_sr:%d mix_sr:%d asrc_mode %d\n", - __func__, main_sr, mix_sr, asrc_mode); - snd_soc_update_bits(codec, asrc_ctl, 0x07, asrc_mode); - } - tavil->asrc_users[asrc]++; - break; - case SND_SOC_DAPM_POST_PMD: - tavil->asrc_users[asrc]--; - if (tavil->asrc_users[asrc] <= 0) { - tavil->asrc_users[asrc] = 0; - snd_soc_update_bits(codec, asrc_ctl, 0x07, 0x00); - snd_soc_update_bits(codec, cfg_reg, 0x80, 0x00); - snd_soc_update_bits(codec, clk_reg, 0x03, 0x02); - } - break; - }; - - dev_dbg(codec->dev, "%s: ASRC%d, users: %d\n", - __func__, asrc, tavil->asrc_users[asrc]); - -done: - return ret; -} - -static int tavil_codec_enable_asrc_resampler(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - u8 cfg, asrc_in; - - cfg = snd_soc_read(codec, WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0); - if (!(cfg & 0xFF)) { - dev_err(codec->dev, "%s: ASRC%u input not selected\n", - __func__, w->shift); - return -EINVAL; - } - - switch (w->shift) { - case ASRC0: - asrc_in = ((cfg & 0x03) == 1) ? ASRC_IN_HPHL : ASRC_IN_LO1; - ret = tavil_codec_enable_asrc(codec, asrc_in, event); - break; - case ASRC1: - asrc_in = ((cfg & 0x0C) == 4) ? ASRC_IN_HPHR : ASRC_IN_LO2; - ret = tavil_codec_enable_asrc(codec, asrc_in, event); - break; - case ASRC2: - asrc_in = ((cfg & 0x30) == 0x20) ? ASRC_IN_SPKR1 : ASRC_INVALID; - ret = tavil_codec_enable_asrc(codec, asrc_in, event); - break; - case ASRC3: - asrc_in = ((cfg & 0xC0) == 0x80) ? ASRC_IN_SPKR2 : ASRC_INVALID; - ret = tavil_codec_enable_asrc(codec, asrc_in, event); - break; - default: - dev_err(codec->dev, "%s: Invalid asrc:%u\n", __func__, - w->shift); - ret = -EINVAL; - break; - }; - - return ret; -} - -static int tavil_enable_native_supply(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (++tavil->native_clk_users == 1) { - snd_soc_update_bits(codec, WCD934X_CLK_SYS_PLL_ENABLES, - 0x01, 0x01); - usleep_range(100, 120); - snd_soc_update_bits(codec, WCD934X_CLK_SYS_MCLK2_PRG1, - 0x06, 0x02); - snd_soc_update_bits(codec, WCD934X_CLK_SYS_MCLK2_PRG1, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD934X_CODEC_RPM_CLK_GATE, - 0x04, 0x00); - usleep_range(30, 50); - snd_soc_update_bits(codec, - WCD934X_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x02); - snd_soc_update_bits(codec, - WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x10, 0x10); - } - break; - case SND_SOC_DAPM_PRE_PMD: - if (tavil->native_clk_users && - (--tavil->native_clk_users == 0)) { - snd_soc_update_bits(codec, - WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x10, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CODEC_RPM_CLK_GATE, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_CLK_SYS_MCLK2_PRG1, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD934X_CLK_SYS_MCLK2_PRG1, - 0x06, 0x00); - snd_soc_update_bits(codec, WCD934X_CLK_SYS_PLL_ENABLES, - 0x01, 0x00); - } - break; - } - - dev_dbg(codec->dev, "%s: native_clk_users: %d, event: %d\n", - __func__, tavil->native_clk_users, event); - - return 0; -} - -static void tavil_codec_hphdelay_lutbypass(struct snd_soc_codec *codec, - u16 interp_idx, int event) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u8 hph_dly_mask; - u16 hph_lut_bypass_reg = 0; - u16 hph_comp_ctrl7 = 0; - - - switch (interp_idx) { - case INTERP_HPHL: - hph_dly_mask = 1; - hph_lut_bypass_reg = WCD934X_CDC_TOP_HPHL_COMP_LUT; - hph_comp_ctrl7 = WCD934X_CDC_COMPANDER1_CTL7; - break; - case INTERP_HPHR: - hph_dly_mask = 2; - hph_lut_bypass_reg = WCD934X_CDC_TOP_HPHR_COMP_LUT; - hph_comp_ctrl7 = WCD934X_CDC_COMPANDER2_CTL7; - break; - default: - break; - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, WCD934X_CDC_CLSH_TEST0, - hph_dly_mask, 0x0); - snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x80); - if (tavil->hph_mode == CLS_H_ULP) - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x20); - } - - if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, WCD934X_CDC_CLSH_TEST0, - hph_dly_mask, hph_dly_mask); - snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x00); - snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x0); - } -} - -static void tavil_codec_hd2_control(struct tavil_priv *priv, - u16 interp_idx, int event) -{ - u16 hd2_scale_reg; - u16 hd2_enable_reg = 0; - struct snd_soc_codec *codec = priv->codec; - - if (TAVIL_IS_1_1(priv->wcd9xxx)) - return; - - switch (interp_idx) { - case INTERP_HPHL: - hd2_scale_reg = WCD934X_CDC_RX1_RX_PATH_SEC3; - hd2_enable_reg = WCD934X_CDC_RX1_RX_PATH_CFG0; - break; - case INTERP_HPHR: - hd2_scale_reg = WCD934X_CDC_RX2_RX_PATH_SEC3; - hd2_enable_reg = WCD934X_CDC_RX2_RX_PATH_CFG0; - break; - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) { - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x14); - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04); - } - - if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00); - snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00); - } -} - -static int tavil_codec_config_ear_spkr_gain(struct snd_soc_codec *codec, - int event, int gain_reg) -{ - int comp_gain_offset, val; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - switch (tavil->swr.spkr_mode) { - /* Compander gain in SPKR_MODE1 case is 12 dB */ - case WCD934X_SPKR_MODE_1: - comp_gain_offset = -12; - break; - /* Default case compander gain is 15 dB */ - default: - comp_gain_offset = -15; - break; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* Apply ear spkr gain only if compander is enabled */ - if (tavil->comp_enabled[COMPANDER_7] && - (gain_reg == WCD934X_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD934X_CDC_RX7_RX_VOL_MIX_CTL) && - (tavil->ear_spkr_gain != 0)) { - /* For example, val is -8(-12+5-1) for 4dB of gain */ - val = comp_gain_offset + tavil->ear_spkr_gain - 1; - snd_soc_write(codec, gain_reg, val); - - dev_dbg(codec->dev, "%s: RX7 Volume %d dB\n", - __func__, val); - } - break; - case SND_SOC_DAPM_POST_PMD: - /* - * Reset RX7 volume to 0 dB if compander is enabled and - * ear_spkr_gain is non-zero. - */ - if (tavil->comp_enabled[COMPANDER_7] && - (gain_reg == WCD934X_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD934X_CDC_RX7_RX_VOL_MIX_CTL) && - (tavil->ear_spkr_gain != 0)) { - snd_soc_write(codec, gain_reg, 0x0); - - dev_dbg(codec->dev, "%s: Reset RX7 Volume to 0 dB\n", - __func__); - } - break; - } - - return 0; -} - -static int tavil_config_compander(struct snd_soc_codec *codec, int interp_n, - int event) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int comp; - u16 comp_ctl0_reg, rx_path_cfg0_reg; - - /* EAR does not have compander */ - if (!interp_n) - return 0; - - comp = interp_n - 1; - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp + 1, tavil->comp_enabled[comp]); - - if (!tavil->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = WCD934X_CDC_COMPANDER1_CTL0 + (comp * 8); - rx_path_cfg0_reg = WCD934X_CDC_RX1_RX_PATH_CFG0 + (comp * 20); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -static void tavil_codec_idle_detect_control(struct snd_soc_codec *codec, - int interp, int event) -{ - int reg = 0, mask, val; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - if (!tavil->idle_det_cfg.hph_idle_detect_en) - return; - - if (interp == INTERP_HPHL) { - reg = WCD934X_CDC_RX_IDLE_DET_PATH_CTL; - mask = 0x01; - val = 0x01; - } - if (interp == INTERP_HPHR) { - reg = WCD934X_CDC_RX_IDLE_DET_PATH_CTL; - mask = 0x02; - val = 0x02; - } - - if (reg && SND_SOC_DAPM_EVENT_ON(event)) - snd_soc_update_bits(codec, reg, mask, val); - - if (reg && SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, reg, mask, 0x00); - tavil->idle_det_cfg.hph_idle_thr = 0; - snd_soc_write(codec, WCD934X_CDC_RX_IDLE_DET_CFG3, 0x0); - } -} - -/** - * tavil_codec_enable_interp_clk - Enable main path Interpolator - * clock. - * - * @codec: Codec instance - * @event: Indicates speaker path gain offset value - * @intp_idx: Interpolator index - * Returns number of main clock users - */ -int tavil_codec_enable_interp_clk(struct snd_soc_codec *codec, - int event, int interp_idx) -{ - struct tavil_priv *tavil; - u16 main_reg; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - tavil = snd_soc_codec_get_drvdata(codec); - main_reg = WCD934X_CDC_RX0_RX_PATH_CTL + (interp_idx * 20); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - if (tavil->main_clk_users[interp_idx] == 0) { - /* Main path PGA mute enable */ - snd_soc_update_bits(codec, main_reg, 0x10, 0x10); - /* Clk enable */ - snd_soc_update_bits(codec, main_reg, 0x20, 0x20); - tavil_codec_idle_detect_control(codec, interp_idx, - event); - tavil_codec_hd2_control(tavil, interp_idx, event); - tavil_codec_hphdelay_lutbypass(codec, interp_idx, - event); - tavil_config_compander(codec, interp_idx, event); - } - tavil->main_clk_users[interp_idx]++; - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - tavil->main_clk_users[interp_idx]--; - if (tavil->main_clk_users[interp_idx] <= 0) { - tavil->main_clk_users[interp_idx] = 0; - tavil_config_compander(codec, interp_idx, event); - tavil_codec_hphdelay_lutbypass(codec, interp_idx, - event); - tavil_codec_hd2_control(tavil, interp_idx, event); - tavil_codec_idle_detect_control(codec, interp_idx, - event); - /* Clk Disable */ - snd_soc_update_bits(codec, main_reg, 0x20, 0x00); - /* Reset enable and disable */ - snd_soc_update_bits(codec, main_reg, 0x40, 0x40); - snd_soc_update_bits(codec, main_reg, 0x40, 0x00); - /* Reset rate to 48K*/ - snd_soc_update_bits(codec, main_reg, 0x0F, 0x04); - } - } - - dev_dbg(codec->dev, "%s event %d main_clk_users %d\n", - __func__, event, tavil->main_clk_users[interp_idx]); - - return tavil->main_clk_users[interp_idx]; -} -EXPORT_SYMBOL(tavil_codec_enable_interp_clk); - -static int tavil_anc_out_switch_cb(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - tavil_codec_enable_interp_clk(codec, event, w->shift); - - return 0; -} -static int tavil_codec_set_idle_detect_thr(struct snd_soc_codec *codec, - int interp, int path_type) -{ - int port_id[4] = { 0, 0, 0, 0 }; - int *port_ptr, num_ports; - int bit_width = 0, i; - int mux_reg, mux_reg_val; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int dai_id, idle_thr; - - if ((interp != INTERP_HPHL) && (interp != INTERP_HPHR)) - return 0; - - if (!tavil->idle_det_cfg.hph_idle_detect_en) - return 0; - - port_ptr = &port_id[0]; - num_ports = 0; - - /* - * Read interpolator MUX input registers and find - * which slimbus port is connected and store the port - * numbers in port_id array. - */ - if (path_type == INTERP_MIX_PATH) { - mux_reg = WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1 + - 2 * (interp - 1); - mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f; - - if ((mux_reg_val >= INTn_2_INP_SEL_RX0) && - (mux_reg_val < INTn_2_INP_SEL_PROXIMITY)) { - *port_ptr++ = mux_reg_val + - WCD934X_RX_PORT_START_NUMBER - 1; - num_ports++; - } - } - - if (path_type == INTERP_MAIN_PATH) { - mux_reg = WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0 + - 2 * (interp - 1); - mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f; - i = WCD934X_INTERP_MUX_NUM_INPUTS; - - while (i) { - if ((mux_reg_val >= INTn_1_INP_SEL_RX0) && - (mux_reg_val <= INTn_1_INP_SEL_RX7)) { - *port_ptr++ = mux_reg_val + - WCD934X_RX_PORT_START_NUMBER - - INTn_1_INP_SEL_RX0; - num_ports++; - } - mux_reg_val = (snd_soc_read(codec, mux_reg) & - 0xf0) >> 4; - mux_reg += 1; - i--; - } - } - - dev_dbg(codec->dev, "%s: num_ports: %d, ports[%d %d %d %d]\n", - __func__, num_ports, port_id[0], port_id[1], - port_id[2], port_id[3]); - - i = 0; - while (num_ports) { - dai_id = tavil_find_playback_dai_id_for_port(port_id[i++], - tavil); - - if ((dai_id >= 0) && (dai_id < NUM_CODEC_DAIS)) { - dev_dbg(codec->dev, "%s: dai_id: %d bit_width: %d\n", - __func__, dai_id, - tavil->dai[dai_id].bit_width); - - if (tavil->dai[dai_id].bit_width > bit_width) - bit_width = tavil->dai[dai_id].bit_width; - } - - num_ports--; - } - - switch (bit_width) { - case 16: - idle_thr = 0xff; /* F16 */ - break; - case 24: - case 32: - idle_thr = 0x03; /* F22 */ - break; - default: - idle_thr = 0x00; - break; - } - - dev_dbg(codec->dev, "%s: (new) idle_thr: %d, (cur) idle_thr: %d\n", - __func__, idle_thr, tavil->idle_det_cfg.hph_idle_thr); - - if ((tavil->idle_det_cfg.hph_idle_thr == 0) || - (idle_thr < tavil->idle_det_cfg.hph_idle_thr)) { - snd_soc_write(codec, WCD934X_CDC_RX_IDLE_DET_CFG3, idle_thr); - tavil->idle_det_cfg.hph_idle_thr = idle_thr; - } - - return 0; -} - -static int tavil_codec_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u16 gain_reg, mix_reg; - int offset_val = 0; - int val = 0; - - if (w->shift >= WCD934X_NUM_INTERPOLATORS || - w->shift == INTERP_LO3_NA || w->shift == INTERP_LO4_NA) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - }; - - gain_reg = WCD934X_CDC_RX0_RX_VOL_MIX_CTL + - (w->shift * WCD934X_RX_PATH_CTL_OFFSET); - mix_reg = WCD934X_CDC_RX0_RX_PATH_MIX_CTL + - (w->shift * WCD934X_RX_PATH_CTL_OFFSET); - - if (w->shift == INTERP_SPKR1 || w->shift == INTERP_SPKR2) - __tavil_codec_enable_swr(w, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil_codec_set_idle_detect_thr(codec, w->shift, - INTERP_MIX_PATH); - tavil_codec_enable_interp_clk(codec, event, w->shift); - /* Clk enable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x20); - break; - case SND_SOC_DAPM_POST_PMU: - if ((tavil->swr.spkr_gain_offset == - WCD934X_RX_GAIN_OFFSET_M1P5_DB) && - (tavil->comp_enabled[COMPANDER_7] || - tavil->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD934X_CDC_RX7_RX_VOL_MIX_CTL || - gain_reg == WCD934X_CDC_RX8_RX_VOL_MIX_CTL)) { - snd_soc_update_bits(codec, WCD934X_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD934X_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD934X_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD934X_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - tavil_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - /* Clk Disable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x00); - tavil_codec_enable_interp_clk(codec, event, w->shift); - /* Reset enable and disable */ - snd_soc_update_bits(codec, mix_reg, 0x40, 0x40); - snd_soc_update_bits(codec, mix_reg, 0x40, 0x00); - - if ((tavil->swr.spkr_gain_offset == - WCD934X_RX_GAIN_OFFSET_M1P5_DB) && - (tavil->comp_enabled[COMPANDER_7] || - tavil->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD934X_CDC_RX7_RX_VOL_MIX_CTL || - gain_reg == WCD934X_CDC_RX8_RX_VOL_MIX_CTL)) { - snd_soc_update_bits(codec, WCD934X_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - tavil_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - }; - dev_dbg(codec->dev, "%s event %d name %s\n", __func__, event, w->name); - - return 0; -} - -/** - * tavil_get_dsd_config - Get pointer to dsd config structure - * - * @codec: pointer to snd_soc_codec structure - * - * Returns pointer to tavil_dsd_config structure - */ -struct tavil_dsd_config *tavil_get_dsd_config(struct snd_soc_codec *codec) -{ - struct tavil_priv *tavil; - - if (!codec) - return NULL; - - tavil = snd_soc_codec_get_drvdata(codec); - - if (!tavil) - return NULL; - - return tavil->dsd_config; -} -EXPORT_SYMBOL(tavil_get_dsd_config); - -static int tavil_codec_enable_main_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u16 gain_reg; - u16 reg; - int val; - int offset_val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (w->shift >= WCD934X_NUM_INTERPOLATORS || - w->shift == INTERP_LO3_NA || w->shift == INTERP_LO4_NA) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - }; - - reg = WCD934X_CDC_RX0_RX_PATH_CTL + (w->shift * - WCD934X_RX_PATH_CTL_OFFSET); - gain_reg = WCD934X_CDC_RX0_RX_VOL_CTL + (w->shift * - WCD934X_RX_PATH_CTL_OFFSET); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil_codec_set_idle_detect_thr(codec, w->shift, - INTERP_MAIN_PATH); - tavil_codec_enable_interp_clk(codec, event, w->shift); - break; - case SND_SOC_DAPM_POST_PMU: - /* apply gain after int clk is enabled */ - if ((tavil->swr.spkr_gain_offset == - WCD934X_RX_GAIN_OFFSET_M1P5_DB) && - (tavil->comp_enabled[COMPANDER_7] || - tavil->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD934X_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD934X_CDC_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, WCD934X_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD934X_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD934X_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD934X_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - tavil_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - tavil_codec_enable_interp_clk(codec, event, w->shift); - - if ((tavil->swr.spkr_gain_offset == - WCD934X_RX_GAIN_OFFSET_M1P5_DB) && - (tavil->comp_enabled[COMPANDER_7] || - tavil->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD934X_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD934X_CDC_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, WCD934X_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD934X_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - tavil_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - }; - - return 0; -} - -static int tavil_codec_set_iir_gain(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: /* fall through */ - case SND_SOC_DAPM_PRE_PMD: - if (strnstr(w->name, "IIR0", sizeof("IIR0"))) { - snd_soc_write(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)); - } else { - snd_soc_write(codec, - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL)); - } - break; - } - return 0; -} - -static int tavil_codec_find_amic_input(struct snd_soc_codec *codec, - int adc_mux_n) -{ - u16 mask, shift, adc_mux_in_reg; - u16 amic_mux_sel_reg; - bool is_amic; - - if (adc_mux_n < 0 || adc_mux_n > WCD934X_MAX_VALID_ADC_MUX || - adc_mux_n == WCD934X_INVALID_ADC_MUX) - return 0; - - if (adc_mux_n < 3) { - adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - 2 * adc_mux_n; - mask = 0x03; - shift = 0; - amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - 2 * adc_mux_n; - } else if (adc_mux_n < 4) { - adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1; - mask = 0x03; - shift = 0; - amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - 2 * adc_mux_n; - } else if (adc_mux_n < 7) { - adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - 2 * (adc_mux_n - 4); - mask = 0x0C; - shift = 2; - amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_n - 4; - } else if (adc_mux_n < 8) { - adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1; - mask = 0x0C; - shift = 2; - amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_n - 4; - } else if (adc_mux_n < 12) { - adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - 2 * (((adc_mux_n == 8) ? (adc_mux_n - 8) : - (adc_mux_n - 9))); - mask = 0x30; - shift = 4; - amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0 + - ((adc_mux_n == 8) ? (adc_mux_n - 8) : - (adc_mux_n - 9)); - } else if (adc_mux_n < 13) { - adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1; - mask = 0x30; - shift = 4; - amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_n - 5; - } else { - adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1; - mask = 0xC0; - shift = 6; - amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_n - 5; - } - - is_amic = (((snd_soc_read(codec, adc_mux_in_reg) & mask) >> shift) - == 1); - if (!is_amic) - return 0; - - return snd_soc_read(codec, amic_mux_sel_reg) & 0x07; -} - -static void tavil_codec_set_tx_hold(struct snd_soc_codec *codec, - u16 amic_reg, bool set) -{ - u8 mask = 0x20; - u8 val; - - if (amic_reg == WCD934X_ANA_AMIC1 || - amic_reg == WCD934X_ANA_AMIC3) - mask = 0x40; - - val = set ? mask : 0x00; - - switch (amic_reg) { - case WCD934X_ANA_AMIC1: - case WCD934X_ANA_AMIC2: - snd_soc_update_bits(codec, WCD934X_ANA_AMIC2, mask, val); - break; - case WCD934X_ANA_AMIC3: - case WCD934X_ANA_AMIC4: - snd_soc_update_bits(codec, WCD934X_ANA_AMIC4, mask, val); - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic_reg); - break; - } -} - -static int tavil_codec_tx_adc_cfg(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - int adc_mux_n = w->shift; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int amic_n; - - dev_dbg(codec->dev, "%s: event: %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - amic_n = tavil_codec_find_amic_input(codec, adc_mux_n); - if (amic_n) { - /* - * Prevent ANC Rx pop by leaving Tx FE in HOLD - * state until PA is up. Track AMIC being used - * so we can release the HOLD later. - */ - set_bit(ANC_MIC_AMIC1 + amic_n - 1, - &tavil->status_mask); - } - break; - default: - break; - } - - return 0; -} - -static u16 tavil_codec_get_amic_pwlvl_reg(struct snd_soc_codec *codec, int amic) -{ - u16 pwr_level_reg = 0; - - switch (amic) { - case 1: - case 2: - pwr_level_reg = WCD934X_ANA_AMIC1; - break; - - case 3: - case 4: - pwr_level_reg = WCD934X_ANA_AMIC3; - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic); - break; - } - - return pwr_level_reg; -} - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -static void tavil_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work; - struct hpf_work *hpf_work; - struct tavil_priv *tavil; - struct snd_soc_codec *codec; - u16 dec_cfg_reg, amic_reg, go_bit_reg; - u8 hpf_cut_off_freq; - int amic_n; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - tavil = hpf_work->tavil; - codec = tavil->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = WCD934X_CDC_TX0_TX_PATH_CFG0 + 16 * hpf_work->decimator; - go_bit_reg = dec_cfg_reg + 7; - - dev_dbg(codec->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - amic_n = tavil_codec_find_amic_input(codec, hpf_work->decimator); - if (amic_n) { - amic_reg = WCD934X_ANA_AMIC1 + amic_n - 1; - tavil_codec_set_tx_hold(codec, amic_reg, false); - } - snd_soc_update_bits(codec, dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, go_bit_reg, 0x02, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, go_bit_reg, 0x02, 0x00); -} - -static void tavil_tx_mute_update_callback(struct work_struct *work) -{ - struct tx_mute_work *tx_mute_dwork; - struct tavil_priv *tavil; - struct delayed_work *delayed_work; - struct snd_soc_codec *codec; - u16 tx_vol_ctl_reg, hpf_gate_reg; - - delayed_work = to_delayed_work(work); - tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork); - tavil = tx_mute_dwork->tavil; - codec = tavil->codec; - - tx_vol_ctl_reg = WCD934X_CDC_TX0_TX_PATH_CTL + - 16 * tx_mute_dwork->decimator; - hpf_gate_reg = WCD934X_CDC_TX0_TX_PATH_SEC2 + - 16 * tx_mute_dwork->decimator; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); -} - -static int tavil_codec_enable_rx_path_clk(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 sidetone_reg; - - dev_dbg(codec->dev, "%s %d %d\n", __func__, event, w->shift); - sidetone_reg = WCD934X_CDC_RX0_RX_PATH_CFG1 + 0x14*(w->shift); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (!strcmp(w->name, "RX INT7 MIX2 INP")) - __tavil_codec_enable_swr(w, event); - tavil_codec_enable_interp_clk(codec, event, w->shift); - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x00); - tavil_codec_enable_interp_clk(codec, event, w->shift); - if (!strcmp(w->name, "RX INT7 MIX2 INP")) - __tavil_codec_enable_swr(w, event); - break; - default: - break; - }; - return 0; -} - -static int tavil_codec_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - unsigned int decimator; - char *dec_adc_mux_name = NULL; - char *widget_name = NULL; - char *wname; - int ret = 0, amic_n; - u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg; - u16 tx_gain_ctl_reg; - char *dec; - u8 hpf_cut_off_freq; - - dev_dbg(codec->dev, "%s %d\n", __func__, event); - - widget_name = kstrndup(w->name, 15, GFP_KERNEL); - if (!widget_name) - return -ENOMEM; - - wname = widget_name; - dec_adc_mux_name = strsep(&widget_name, " "); - if (!dec_adc_mux_name) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, w->name); - ret = -EINVAL; - goto out; - } - dec_adc_mux_name = widget_name; - - dec = strpbrk(dec_adc_mux_name, "012345678"); - if (!dec) { - dev_err(codec->dev, "%s: decimator index not found\n", - __func__); - ret = -EINVAL; - goto out; - } - - ret = kstrtouint(dec, 10, &decimator); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, wname); - ret = -EINVAL; - goto out; - } - - dev_dbg(codec->dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = WCD934X_CDC_TX0_TX_PATH_CTL + 16 * decimator; - hpf_gate_reg = WCD934X_CDC_TX0_TX_PATH_SEC2 + 16 * decimator; - dec_cfg_reg = WCD934X_CDC_TX0_TX_PATH_CFG0 + 16 * decimator; - tx_gain_ctl_reg = WCD934X_CDC_TX0_TX_VOL_CTL + 16 * decimator; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - amic_n = tavil_codec_find_amic_input(codec, decimator); - if (amic_n) - pwr_level_reg = tavil_codec_get_amic_pwlvl_reg(codec, - amic_n); - - if (pwr_level_reg) { - switch ((snd_soc_read(codec, pwr_level_reg) & - WCD934X_AMIC_PWR_LVL_MASK) >> - WCD934X_AMIC_PWR_LVL_SHIFT) { - case WCD934X_AMIC_PWR_LEVEL_LP: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD934X_DEC_PWR_LVL_MASK, - WCD934X_DEC_PWR_LVL_LP); - break; - - case WCD934X_AMIC_PWR_LEVEL_HP: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD934X_DEC_PWR_LVL_MASK, - WCD934X_DEC_PWR_LVL_HP); - break; - case WCD934X_AMIC_PWR_LEVEL_DEFAULT: - case WCD934X_AMIC_PWR_LEVEL_HYBRID: - default: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD934X_DEC_PWR_LVL_MASK, - WCD934X_DEC_PWR_LVL_DF); - break; - } - } - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - - tavil->tx_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per - * HW spec. - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x00); - /* schedule work queue to Remove Mute */ - schedule_delayed_work(&tavil->tx_mute_dwork[decimator].dwork, - msecs_to_jiffies(tx_unmute_delay)); - if (tavil->tx_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) - schedule_delayed_work( - &tavil->tx_hpf_work[decimator].dwork, - msecs_to_jiffies(300)); - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, tx_gain_ctl_reg)); - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - tavil->tx_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &tavil->tx_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per - * HW spec. - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x00); - } - } - cancel_delayed_work_sync( - &tavil->tx_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - snd_soc_update_bits(codec, dec_cfg_reg, - WCD934X_DEC_PWR_LVL_MASK, - WCD934X_DEC_PWR_LVL_DF); - break; - }; -out: - kfree(wname); - return ret; -} - -static u32 tavil_get_dmic_sample_rate(struct snd_soc_codec *codec, - unsigned int dmic, - struct wcd9xxx_pdata *pdata) -{ - u8 tx_stream_fs; - u8 adc_mux_index = 0, adc_mux_sel = 0; - bool dec_found = false; - u16 adc_mux_ctl_reg, tx_fs_reg; - u32 dmic_fs; - - while (dec_found == 0 && adc_mux_index < WCD934X_MAX_VALID_ADC_MUX) { - if (adc_mux_index < 4) { - adc_mux_ctl_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - (adc_mux_index * 2); - } else if (adc_mux_index < WCD934X_INVALID_ADC_MUX) { - adc_mux_ctl_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_index - 4; - } else if (adc_mux_index == WCD934X_INVALID_ADC_MUX) { - ++adc_mux_index; - continue; - } - adc_mux_sel = ((snd_soc_read(codec, adc_mux_ctl_reg) & - 0xF8) >> 3) - 1; - - if (adc_mux_sel == dmic) { - dec_found = true; - break; - } - - ++adc_mux_index; - } - - if (dec_found && adc_mux_index <= 8) { - tx_fs_reg = WCD934X_CDC_TX0_TX_PATH_CTL + (16 * adc_mux_index); - tx_stream_fs = snd_soc_read(codec, tx_fs_reg) & 0x0F; - if (tx_stream_fs <= 4) { - if (pdata->dmic_sample_rate <= - WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ) - dmic_fs = pdata->dmic_sample_rate; - else - dmic_fs = WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ; - } else - dmic_fs = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ; - } else { - dmic_fs = pdata->dmic_sample_rate; - } - - return dmic_fs; -} - -static u8 tavil_get_dmic_clk_val(struct snd_soc_codec *codec, - u32 mclk_rate, u32 dmic_clk_rate) -{ - u32 div_factor; - u8 dmic_ctl_val; - - dev_dbg(codec->dev, - "%s: mclk_rate = %d, dmic_sample_rate = %d\n", - __func__, mclk_rate, dmic_clk_rate); - - /* Default value to return in case of error */ - if (mclk_rate == WCD934X_MCLK_CLK_9P6MHZ) - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_2; - else - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_3; - - if (dmic_clk_rate == 0) { - dev_err(codec->dev, - "%s: dmic_sample_rate cannot be 0\n", - __func__); - goto done; - } - - div_factor = mclk_rate / dmic_clk_rate; - switch (div_factor) { - case 2: - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_2; - break; - case 3: - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_3; - break; - case 4: - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_4; - break; - case 6: - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_6; - break; - case 8: - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_8; - break; - case 16: - dmic_ctl_val = WCD934X_DMIC_CLK_DIV_16; - break; - default: - dev_err(codec->dev, - "%s: Invalid div_factor %u, clk_rate(%u), dmic_rate(%u)\n", - __func__, div_factor, mclk_rate, dmic_clk_rate); - break; - } - -done: - return dmic_ctl_val; -} - -static int tavil_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event:%d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - tavil_codec_set_tx_hold(codec, w->reg, true); - break; - default: - break; - } - - return 0; -} - -static int tavil_codec_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - u8 dmic_clk_en = 0x01; - u16 dmic_clk_reg; - s32 *dmic_clk_cnt; - u8 dmic_rate_val, dmic_rate_shift = 1; - unsigned int dmic; - u32 dmic_sample_rate; - int ret; - char *wname; - - wname = strpbrk(w->name, "012345"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(tavil->dmic_0_1_clk_cnt); - dmic_clk_reg = WCD934X_CPE_SS_DMIC0_CTL; - break; - case 2: - case 3: - dmic_clk_cnt = &(tavil->dmic_2_3_clk_cnt); - dmic_clk_reg = WCD934X_CPE_SS_DMIC1_CTL; - break; - case 4: - case 5: - dmic_clk_cnt = &(tavil->dmic_4_5_clk_cnt); - dmic_clk_reg = WCD934X_CPE_SS_DMIC2_CTL; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - }; - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - dmic_sample_rate = tavil_get_dmic_sample_rate(codec, dmic, - pdata); - dmic_rate_val = - tavil_get_dmic_clk_val(codec, - pdata->mclk_rate, - dmic_sample_rate); - - snd_soc_update_bits(codec, WCD934X_TEST_DEBUG_PAD_DRVCTL_0, - WCD934X_DMIC_DRV_CTL_MASK, - tavil->dmic_drv_ctl << - WCD934X_DMIC_DRV_CTL_SHIFT); - - (*dmic_clk_cnt)++; - if (*dmic_clk_cnt == 1) { - snd_soc_update_bits(codec, dmic_clk_reg, - 0x07 << dmic_rate_shift, - dmic_rate_val << dmic_rate_shift); - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, dmic_clk_en); - } - - break; - case SND_SOC_DAPM_POST_PMD: - dmic_rate_val = - tavil_get_dmic_clk_val(codec, - pdata->mclk_rate, - pdata->mad_dmic_sample_rate); - (*dmic_clk_cnt)--; - if (*dmic_clk_cnt == 0) { - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, 0); - snd_soc_update_bits(codec, dmic_clk_reg, - 0x07 << dmic_rate_shift, - dmic_rate_val << dmic_rate_shift); - } - break; - }; - - return 0; -} - -/* - * tavil_mbhc_micb_adjust_voltage: adjust specific micbias voltage - * @codec: handle to snd_soc_codec * - * @req_volt: micbias voltage to be set - * @micb_num: micbias to be set, e.g. micbias1 or micbias2 - * - * return 0 if adjustment is success or error code in case of failure - */ -int tavil_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, int micb_num) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int cur_vout_ctl, req_vout_ctl; - int micb_reg, micb_val, micb_en; - int ret = 0; - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD934X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD934X_ANA_MICB2; - break; - case MIC_BIAS_3: - micb_reg = WCD934X_ANA_MICB3; - break; - case MIC_BIAS_4: - micb_reg = WCD934X_ANA_MICB4; - break; - default: - return -EINVAL; - } - mutex_lock(&tavil->micb_lock); - - /* - * If requested micbias voltage is same as current micbias - * voltage, then just return. Otherwise, adjust voltage as - * per requested value. If micbias is already enabled, then - * to avoid slow micbias ramp-up or down enable pull-up - * momentarily, change the micbias value and then re-enable - * micbias. - */ - micb_val = snd_soc_read(codec, micb_reg); - micb_en = (micb_val & 0xC0) >> 6; - cur_vout_ctl = micb_val & 0x3F; - - req_vout_ctl = wcd934x_get_micb_vout_ctl_val(req_volt); - if (req_vout_ctl < 0) { - ret = -EINVAL; - goto exit; - } - if (cur_vout_ctl == req_vout_ctl) { - ret = 0; - goto exit; - } - - dev_dbg(codec->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", - __func__, micb_num, WCD_VOUT_CTL_TO_MICB(cur_vout_ctl), - req_volt, micb_en); - - if (micb_en == 0x1) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - - snd_soc_update_bits(codec, micb_reg, 0x3F, req_vout_ctl); - - if (micb_en == 0x1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - /* - * Add 2ms delay as per HW requirement after enabling - * micbias - */ - usleep_range(2000, 2100); - } -exit: - mutex_unlock(&tavil->micb_lock); - return ret; -} -EXPORT_SYMBOL(tavil_mbhc_micb_adjust_voltage); - -/* - * tavil_micbias_control: enable/disable micbias - * @codec: handle to snd_soc_codec * - * @micb_num: micbias to be enabled/disabled, e.g. micbias1 or micbias2 - * @req: control requested, enable/disable or pullup enable/disable - * @is_dapm: triggered by dapm or not - * - * return 0 if control is success or error code in case of failure - */ -int tavil_micbias_control(struct snd_soc_codec *codec, - int micb_num, int req, bool is_dapm) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int micb_index = micb_num - 1; - u16 micb_reg; - int pre_off_event = 0, post_off_event = 0; - int post_on_event = 0, post_dapm_off = 0; - int post_dapm_on = 0; - - if ((micb_index < 0) || (micb_index > TAVIL_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD934X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD934X_ANA_MICB2; - pre_off_event = WCD_EVENT_PRE_MICBIAS_2_OFF; - post_off_event = WCD_EVENT_POST_MICBIAS_2_OFF; - post_on_event = WCD_EVENT_POST_MICBIAS_2_ON; - post_dapm_on = WCD_EVENT_POST_DAPM_MICBIAS_2_ON; - post_dapm_off = WCD_EVENT_POST_DAPM_MICBIAS_2_OFF; - break; - case MIC_BIAS_3: - micb_reg = WCD934X_ANA_MICB3; - break; - case MIC_BIAS_4: - micb_reg = WCD934X_ANA_MICB4; - break; - default: - dev_err(codec->dev, "%s: Invalid micbias number: %d\n", - __func__, micb_num); - return -EINVAL; - } - mutex_lock(&tavil->micb_lock); - - switch (req) { - case MICB_PULLUP_ENABLE: - tavil->pullup_ref[micb_index]++; - if ((tavil->pullup_ref[micb_index] == 1) && - (tavil->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - break; - case MICB_PULLUP_DISABLE: - if (tavil->pullup_ref[micb_index] > 0) - tavil->pullup_ref[micb_index]--; - if ((tavil->pullup_ref[micb_index] == 0) && - (tavil->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - break; - case MICB_ENABLE: - tavil->micb_ref[micb_index]++; - if (tavil->micb_ref[micb_index] == 1) { - if (tavil->micb_load) - regulator_set_load(tavil->micb_load, - tavil->micb_load_high); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - if (post_on_event && tavil->mbhc) - blocking_notifier_call_chain( - &tavil->mbhc->notifier, - post_on_event, - &tavil->mbhc->wcd_mbhc); - } - if (is_dapm && post_dapm_on && tavil->mbhc) - blocking_notifier_call_chain(&tavil->mbhc->notifier, - post_dapm_on, &tavil->mbhc->wcd_mbhc); - break; - case MICB_DISABLE: - if (tavil->micb_ref[micb_index] > 0) - tavil->micb_ref[micb_index]--; - if ((tavil->micb_ref[micb_index] == 0) && - (tavil->pullup_ref[micb_index] > 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - else if ((tavil->micb_ref[micb_index] == 0) && - (tavil->pullup_ref[micb_index] == 0)) { - if (pre_off_event && tavil->mbhc) - blocking_notifier_call_chain( - &tavil->mbhc->notifier, - pre_off_event, - &tavil->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - if (post_off_event && tavil->mbhc) - blocking_notifier_call_chain( - &tavil->mbhc->notifier, - post_off_event, - &tavil->mbhc->wcd_mbhc); - if (tavil->micb_load) - regulator_set_load(tavil->micb_load, - tavil->micb_load_low); - } - if (is_dapm && post_dapm_off && tavil->mbhc) - blocking_notifier_call_chain(&tavil->mbhc->notifier, - post_dapm_off, &tavil->mbhc->wcd_mbhc); - break; - }; - - dev_dbg(codec->dev, "%s: micb_num:%d, micb_ref: %d, pullup_ref: %d\n", - __func__, micb_num, tavil->micb_ref[micb_index], - tavil->pullup_ref[micb_index]); - - mutex_unlock(&tavil->micb_lock); - - return 0; -} -EXPORT_SYMBOL(tavil_micbias_control); - -static int __tavil_codec_enable_micbias(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2"))) - micb_num = MIC_BIAS_2; - else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3"))) - micb_num = MIC_BIAS_3; - else if (strnstr(w->name, "MIC BIAS4", sizeof("MIC BIAS4"))) - micb_num = MIC_BIAS_4; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* - * MIC BIAS can also be requested by MBHC, - * so use ref count to handle micbias pullup - * and enable requests - */ - tavil_micbias_control(codec, micb_num, MICB_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - /* wait for cnp time */ - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - tavil_micbias_control(codec, micb_num, MICB_DISABLE, true); - break; - }; - - return 0; -} - -/* - * tavil_codec_enable_standalone_micbias - enable micbias standalone - * @codec: pointer to codec instance - * @micb_num: number of micbias to be enabled - * @enable: true to enable micbias or false to disable - * - * This function is used to enable micbias (1, 2, 3 or 4) during - * standalone independent of whether TX use-case is running or not - * - * Return: error code in case of failure or 0 for success - */ -int tavil_codec_enable_standalone_micbias(struct snd_soc_codec *codec, - int micb_num, - bool enable) -{ - const char * const micb_names[] = { - DAPM_MICBIAS1_STANDALONE, DAPM_MICBIAS2_STANDALONE, - DAPM_MICBIAS3_STANDALONE, DAPM_MICBIAS4_STANDALONE - }; - int micb_index = micb_num - 1; - int rc; - - if (!codec) { - pr_err("%s: Codec memory is NULL\n", __func__); - return -EINVAL; - } - - if ((micb_index < 0) || (micb_index > TAVIL_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - - if (enable) - rc = snd_soc_dapm_force_enable_pin( - snd_soc_codec_get_dapm(codec), - micb_names[micb_index]); - else - rc = snd_soc_dapm_disable_pin(snd_soc_codec_get_dapm(codec), - micb_names[micb_index]); - - if (!rc) - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - else - dev_err(codec->dev, "%s: micbias%d force %s pin failed\n", - __func__, micb_num, (enable ? "enable" : "disable")); - - return rc; -} -EXPORT_SYMBOL(tavil_codec_enable_standalone_micbias); - -static int tavil_codec_force_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd_resmgr_enable_master_bias(tavil->resmgr); - tavil_cdc_mclk_enable(codec, true); - ret = __tavil_codec_enable_micbias(w, SND_SOC_DAPM_PRE_PMU); - /* Wait for 1ms for better cnp */ - usleep_range(1000, 1100); - tavil_cdc_mclk_enable(codec, false); - break; - case SND_SOC_DAPM_POST_PMD: - ret = __tavil_codec_enable_micbias(w, SND_SOC_DAPM_POST_PMD); - wcd_resmgr_disable_master_bias(tavil->resmgr); - break; - } - - return ret; -} - -static int tavil_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return __tavil_codec_enable_micbias(w, event); -} - - -static const struct reg_sequence tavil_hph_reset_tbl[] = { - { WCD934X_HPH_CNP_EN, 0x80 }, - { WCD934X_HPH_CNP_WG_CTL, 0x9A }, - { WCD934X_HPH_CNP_WG_TIME, 0x14 }, - { WCD934X_HPH_OCP_CTL, 0x28 }, - { WCD934X_HPH_AUTO_CHOP, 0x16 }, - { WCD934X_HPH_CHOP_CTL, 0x83 }, - { WCD934X_HPH_PA_CTL1, 0x46 }, - { WCD934X_HPH_PA_CTL2, 0x50 }, - { WCD934X_HPH_L_EN, 0x80 }, - { WCD934X_HPH_L_TEST, 0xE0 }, - { WCD934X_HPH_L_ATEST, 0x50 }, - { WCD934X_HPH_R_EN, 0x80 }, - { WCD934X_HPH_R_TEST, 0xE0 }, - { WCD934X_HPH_R_ATEST, 0x54 }, - { WCD934X_HPH_RDAC_CLK_CTL1, 0x99 }, - { WCD934X_HPH_RDAC_CLK_CTL2, 0x9B }, - { WCD934X_HPH_RDAC_LDO_CTL, 0x33 }, - { WCD934X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00 }, - { WCD934X_HPH_REFBUFF_UHQA_CTL, 0xA8 }, -}; - -static const struct reg_sequence tavil_hph_reset_tbl_1_0[] = { - { WCD934X_HPH_REFBUFF_LP_CTL, 0x0A }, - { WCD934X_HPH_L_DAC_CTL, 0x00 }, - { WCD934X_HPH_R_DAC_CTL, 0x00 }, - { WCD934X_HPH_NEW_ANA_HPH2, 0x00 }, - { WCD934X_HPH_NEW_ANA_HPH3, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_HD2_CTL, 0xA0 }, - { WCD934X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10 }, - { WCD934X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_MISC1, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_MISC1, 0x22 }, - { WCD934X_HPH_NEW_INT_PA_MISC2, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC, 0x00 }, - { WCD934X_HPH_NEW_INT_HPH_TIMER1, 0xFE }, - { WCD934X_HPH_NEW_INT_HPH_TIMER2, 0x2 }, - { WCD934X_HPH_NEW_INT_HPH_TIMER3, 0x4e}, - { WCD934X_HPH_NEW_INT_HPH_TIMER4, 0x54 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00 }, -}; - -static const struct reg_sequence tavil_hph_reset_tbl_1_1[] = { - { WCD934X_HPH_REFBUFF_LP_CTL, 0x0E }, - { WCD934X_HPH_L_DAC_CTL, 0x00 }, - { WCD934X_HPH_R_DAC_CTL, 0x00 }, - { WCD934X_HPH_NEW_ANA_HPH2, 0x00 }, - { WCD934X_HPH_NEW_ANA_HPH3, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40 }, - { WCD934X_HPH_NEW_INT_RDAC_HD2_CTL, 0x81 }, - { WCD934X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10 }, - { WCD934X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00 }, - { WCD934X_HPH_NEW_INT_RDAC_MISC1, 0x81 }, - { WCD934X_HPH_NEW_INT_PA_MISC1, 0x22 }, - { WCD934X_HPH_NEW_INT_PA_MISC2, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC, 0x00 }, - { WCD934X_HPH_NEW_INT_HPH_TIMER1, 0xFE }, - { WCD934X_HPH_NEW_INT_HPH_TIMER2, 0x2 }, - { WCD934X_HPH_NEW_INT_HPH_TIMER3, 0x4e}, - { WCD934X_HPH_NEW_INT_HPH_TIMER4, 0x54 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00 }, -}; - -static const struct tavil_reg_mask_val tavil_pa_disable[] = { - { WCD934X_CDC_RX1_RX_PATH_CTL, 0x30, 0x10 }, /* RX1 mute enable */ - { WCD934X_CDC_RX2_RX_PATH_CTL, 0x30, 0x10 }, /* RX2 mute enable */ - { WCD934X_HPH_CNP_WG_CTL, 0x80, 0x00 }, /* GM3 boost disable */ - { WCD934X_ANA_HPH, 0x80, 0x00 }, /* HPHL PA disable */ - { WCD934X_ANA_HPH, 0x40, 0x00 }, /* HPHR PA disable */ - { WCD934X_ANA_HPH, 0x20, 0x00 }, /* HPHL REF dsable */ - { WCD934X_ANA_HPH, 0x10, 0x00 }, /* HPHR REF disable */ -}; - -static const struct tavil_reg_mask_val tavil_ocp_en_seq[] = { - { WCD934X_RX_OCP_CTL, 0x0F, 0x02 }, /* OCP number of attempts is 2 */ - { WCD934X_HPH_OCP_CTL, 0xFA, 0x3A }, /* OCP current limit */ - { WCD934X_HPH_L_TEST, 0x01, 0x01 }, /* Enable HPHL OCP */ - { WCD934X_HPH_R_TEST, 0x01, 0x01 }, /* Enable HPHR OCP */ -}; - -static const struct tavil_reg_mask_val tavil_ocp_en_seq_1[] = { - { WCD934X_RX_OCP_CTL, 0x0F, 0x02 }, /* OCP number of attempts is 2 */ - { WCD934X_HPH_OCP_CTL, 0xFA, 0x3A }, /* OCP current limit */ -}; - -/* LO-HIFI */ -static const struct tavil_reg_mask_val tavil_pre_pa_en_lohifi[] = { - { WCD934X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00 }, - { WCD934X_FLYBACK_VNEG_CTRL_4, 0xf0, 0x80 }, - { WCD934X_HPH_NEW_INT_PA_MISC2, 0x20, 0x20 }, - { WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, 0xf0, 0x40 }, - { WCD934X_HPH_CNP_WG_CTL, 0x80, 0x00 }, - { WCD934X_RX_BIAS_HPH_LOWPOWER, 0xf0, 0xc0 }, - { WCD934X_HPH_PA_CTL1, 0x0e, 0x02 }, - { WCD934X_HPH_REFBUFF_LP_CTL, 0x06, 0x06 }, -}; - -static const struct tavil_reg_mask_val tavil_pre_pa_en[] = { - { WCD934X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00 }, - { WCD934X_HPH_NEW_INT_PA_MISC2, 0x20, 0x0 }, - { WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, 0xf0, 0x40 }, - { WCD934X_HPH_CNP_WG_CTL, 0x80, 0x00 }, - { WCD934X_RX_BIAS_HPH_LOWPOWER, 0xf0, 0x80 }, - { WCD934X_HPH_PA_CTL1, 0x0e, 0x06 }, - { WCD934X_HPH_REFBUFF_LP_CTL, 0x06, 0x06 }, -}; - -static const struct tavil_reg_mask_val tavil_post_pa_en[] = { - { WCD934X_HPH_L_TEST, 0x01, 0x01 }, /* Enable HPHL OCP */ - { WCD934X_HPH_R_TEST, 0x01, 0x01 }, /* Enable HPHR OCP */ - { WCD934X_CDC_RX1_RX_PATH_CTL, 0x30, 0x20 }, /* RX1 mute disable */ - { WCD934X_CDC_RX2_RX_PATH_CTL, 0x30, 0x20 }, /* RX2 mute disable */ - { WCD934X_HPH_CNP_WG_CTL, 0x80, 0x80 }, /* GM3 boost enable */ - { WCD934X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x02 }, -}; - -static void tavil_codec_hph_reg_range_read(struct regmap *map, u8 *buf) -{ - regmap_bulk_read(map, WCD934X_HPH_CNP_EN, buf, TAVIL_HPH_REG_RANGE_1); - regmap_bulk_read(map, WCD934X_HPH_NEW_ANA_HPH2, - buf + TAVIL_HPH_REG_RANGE_1, TAVIL_HPH_REG_RANGE_2); - regmap_bulk_read(map, WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL, - buf + TAVIL_HPH_REG_RANGE_1 + TAVIL_HPH_REG_RANGE_2, - TAVIL_HPH_REG_RANGE_3); -} - -static void tavil_codec_hph_reg_recover(struct tavil_priv *tavil, - struct regmap *map, int pa_status) -{ - int i; - unsigned int reg; - - if (tavil->mbhc) - blocking_notifier_call_chain(&tavil->mbhc->notifier, - WCD_EVENT_OCP_OFF, - &tavil->mbhc->wcd_mbhc); - - if (pa_status & 0xC0) - goto pa_en_restore; - - dev_dbg(tavil->dev, "%s: HPH PA in disable state (0x%x)\n", - __func__, pa_status); - - regmap_write_bits(map, WCD934X_CDC_RX1_RX_PATH_CTL, 0x10, 0x10); - regmap_write_bits(map, WCD934X_CDC_RX2_RX_PATH_CTL, 0x10, 0x10); - regmap_write_bits(map, WCD934X_ANA_HPH, 0xC0, 0x00); - regmap_write_bits(map, WCD934X_ANA_HPH, 0x30, 0x00); - regmap_write_bits(map, WCD934X_CDC_RX1_RX_PATH_CTL, 0x10, 0x00); - regmap_write_bits(map, WCD934X_CDC_RX2_RX_PATH_CTL, 0x10, 0x00); - - /* Restore to HW defaults */ - regmap_multi_reg_write(map, tavil_hph_reset_tbl, - ARRAY_SIZE(tavil_hph_reset_tbl)); - if (TAVIL_IS_1_1(tavil->wcd9xxx)) - regmap_multi_reg_write(map, tavil_hph_reset_tbl_1_1, - ARRAY_SIZE(tavil_hph_reset_tbl_1_1)); - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - regmap_multi_reg_write(map, tavil_hph_reset_tbl_1_0, - ARRAY_SIZE(tavil_hph_reset_tbl_1_0)); - - for (i = 0; i < ARRAY_SIZE(tavil_ocp_en_seq); i++) - regmap_write_bits(map, tavil_ocp_en_seq[i].reg, - tavil_ocp_en_seq[i].mask, - tavil_ocp_en_seq[i].val); - goto end; - - -pa_en_restore: - dev_dbg(tavil->dev, "%s: HPH PA in enable state (0x%x)\n", - __func__, pa_status); - - /* Disable PA and other registers before restoring */ - for (i = 0; i < ARRAY_SIZE(tavil_pa_disable); i++) { - if (TAVIL_IS_1_1(tavil->wcd9xxx) && - (tavil_pa_disable[i].reg == WCD934X_HPH_CNP_WG_CTL)) - continue; - regmap_write_bits(map, tavil_pa_disable[i].reg, - tavil_pa_disable[i].mask, - tavil_pa_disable[i].val); - } - - regmap_multi_reg_write(map, tavil_hph_reset_tbl, - ARRAY_SIZE(tavil_hph_reset_tbl)); - if (TAVIL_IS_1_1(tavil->wcd9xxx)) - regmap_multi_reg_write(map, tavil_hph_reset_tbl_1_1, - ARRAY_SIZE(tavil_hph_reset_tbl_1_1)); - if (TAVIL_IS_1_0(tavil->wcd9xxx)) - regmap_multi_reg_write(map, tavil_hph_reset_tbl_1_0, - ARRAY_SIZE(tavil_hph_reset_tbl_1_0)); - - for (i = 0; i < ARRAY_SIZE(tavil_ocp_en_seq_1); i++) - regmap_write_bits(map, tavil_ocp_en_seq_1[i].reg, - tavil_ocp_en_seq_1[i].mask, - tavil_ocp_en_seq_1[i].val); - - if (tavil->hph_mode == CLS_H_LOHIFI) { - for (i = 0; i < ARRAY_SIZE(tavil_pre_pa_en_lohifi); i++) { - reg = tavil_pre_pa_en_lohifi[i].reg; - if ((TAVIL_IS_1_1(tavil->wcd9xxx)) && - ((reg == WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL) || - (reg == WCD934X_HPH_CNP_WG_CTL) || - (reg == WCD934X_HPH_REFBUFF_LP_CTL))) - continue; - regmap_write_bits(map, - tavil_pre_pa_en_lohifi[i].reg, - tavil_pre_pa_en_lohifi[i].mask, - tavil_pre_pa_en_lohifi[i].val); - } - } else { - for (i = 0; i < ARRAY_SIZE(tavil_pre_pa_en); i++) { - reg = tavil_pre_pa_en[i].reg; - if ((TAVIL_IS_1_1(tavil->wcd9xxx)) && - ((reg == WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL) || - (reg == WCD934X_HPH_CNP_WG_CTL) || - (reg == WCD934X_HPH_REFBUFF_LP_CTL))) - continue; - regmap_write_bits(map, tavil_pre_pa_en[i].reg, - tavil_pre_pa_en[i].mask, - tavil_pre_pa_en[i].val); - } - } - - if (TAVIL_IS_1_1(tavil->wcd9xxx)) { - regmap_write(map, WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x84); - regmap_write(map, WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x84); - } - - regmap_write_bits(map, WCD934X_ANA_HPH, 0x0C, pa_status & 0x0C); - regmap_write_bits(map, WCD934X_ANA_HPH, 0x30, 0x30); - /* wait for 100usec after HPH DAC is enabled */ - usleep_range(100, 110); - regmap_write(map, WCD934X_ANA_HPH, pa_status); - /* Sleep for 7msec after PA is enabled */ - usleep_range(7000, 7100); - - for (i = 0; i < ARRAY_SIZE(tavil_post_pa_en); i++) { - if ((TAVIL_IS_1_1(tavil->wcd9xxx)) && - (tavil_post_pa_en[i].reg == WCD934X_HPH_CNP_WG_CTL)) - continue; - regmap_write_bits(map, tavil_post_pa_en[i].reg, - tavil_post_pa_en[i].mask, - tavil_post_pa_en[i].val); - } - -end: - if (tavil->mbhc) { - tavil->mbhc->is_hph_recover = true; - blocking_notifier_call_chain( - &tavil->mbhc->notifier, - WCD_EVENT_OCP_ON, - &tavil->mbhc->wcd_mbhc); - } -} - -static int tavil_codec_reset_hph_registers(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - u8 cache_val[TAVIL_HPH_TOTAL_REG]; - u8 hw_val[TAVIL_HPH_TOTAL_REG]; - int pa_status; - int ret; - - dev_dbg(wcd9xxx->dev, "%s: event: %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - memset(cache_val, 0, TAVIL_HPH_TOTAL_REG); - memset(hw_val, 0, TAVIL_HPH_TOTAL_REG); - - regmap_read(wcd9xxx->regmap, WCD934X_ANA_HPH, &pa_status); - - tavil_codec_hph_reg_range_read(wcd9xxx->regmap, cache_val); - - /* Read register values from HW directly */ - regcache_cache_bypass(wcd9xxx->regmap, true); - tavil_codec_hph_reg_range_read(wcd9xxx->regmap, hw_val); - regcache_cache_bypass(wcd9xxx->regmap, false); - - /* compare both the registers to know if there is corruption */ - ret = memcmp(cache_val, hw_val, TAVIL_HPH_TOTAL_REG); - - /* If both the values are same, it means no corruption */ - if (ret) { - dev_dbg(codec->dev, "%s: cache and hw reg are not same\n", - __func__); - tavil_codec_hph_reg_recover(tavil, wcd9xxx->regmap, - pa_status); - } else { - dev_dbg(codec->dev, "%s: cache and hw reg are same\n", - __func__); - if (tavil->mbhc) - tavil->mbhc->is_hph_recover = false; - } - break; - default: - break; - }; - - return 0; -} - -static void tavil_restore_iir_coeff(struct tavil_priv *tavil, int iir_idx, - int band_idx) -{ - u16 reg_add; - int no_of_reg = 0; - - regmap_write(tavil->wcd9xxx->regmap, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - reg_add = WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx; - - if (tavil->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS) - return; - /* - * Since wcd9xxx_slim_write_repeat() supports only maximum of 16 - * registers at a time, split total 20 writes(5 coefficients per - * band and 4 writes per coefficient) into 16 and 4. - */ - no_of_reg = WCD934X_CDC_REPEAT_WRITES_MAX; - wcd9xxx_slim_write_repeat(tavil->wcd9xxx, reg_add, no_of_reg, - &tavil->sidetone_coeff_array[iir_idx][band_idx][0]); - - no_of_reg = (WCD934X_CDC_SIDETONE_IIR_COEFF_MAX * 4) - - WCD934X_CDC_REPEAT_WRITES_MAX; - wcd9xxx_slim_write_repeat(tavil->wcd9xxx, reg_add, no_of_reg, - &tavil->sidetone_coeff_array[iir_idx][band_idx] - [WCD934X_CDC_REPEAT_WRITES_MAX]); -} - -static int tavil_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - /* IIR filter band registers are at integer multiples of 16 */ - u16 iir_reg = WCD934X_CDC_SIDETONE_IIR0_IIR_CTL + 16 * iir_idx; - - ucontrol->value.integer.value[0] = (snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0; - - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0]); - return 0; -} - -static int tavil_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - bool iir_band_en_status; - int value = ucontrol->value.integer.value[0]; - u16 iir_reg = WCD934X_CDC_SIDETONE_IIR0_IIR_CTL + 16 * iir_idx; - - tavil_restore_iir_coeff(tavil, iir_idx, band_idx); - - /* Mask first 5 bits, 6-8 are reserved */ - snd_soc_update_bits(codec, iir_reg, (1 << band_idx), - (value << band_idx)); - - iir_band_en_status = ((snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0); - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, iir_band_en_status); - return 0; -} - -static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - int coeff_idx) -{ - uint32_t value = 0; - - /* Address does not automatically update if reading */ - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t)) & 0x7F); - - value |= snd_soc_read(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx)); - - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 1) & 0x7F); - - value |= (snd_soc_read(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) << 8); - - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 2) & 0x7F); - - value |= (snd_soc_read(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) << 16); - - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 3) & 0x7F); - - /* Mask bits top 2 bits since they are reserved */ - value |= ((snd_soc_read(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) & 0x3F) << 24); - - return value; -} - -static int tavil_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - get_iir_band_coeff(codec, iir_idx, band_idx, 0); - ucontrol->value.integer.value[1] = - get_iir_band_coeff(codec, iir_idx, band_idx, 1); - ucontrol->value.integer.value[2] = - get_iir_band_coeff(codec, iir_idx, band_idx, 2); - ucontrol->value.integer.value[3] = - get_iir_band_coeff(codec, iir_idx, band_idx, 3); - ucontrol->value.integer.value[4] = - get_iir_band_coeff(codec, iir_idx, band_idx, 4); - - dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[1], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[2], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[3], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[4]); - return 0; -} - -static void set_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - uint32_t value) -{ - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value & 0xFF)); - - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 8) & 0xFF); - - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 16) & 0xFF); - - /* Mask top 2 bits, 7-8 are reserved */ - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 24) & 0x3F); -} - -static int tavil_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int coeff_idx, idx = 0; - - /* - * Mask top bit it is reserved - * Updates addr automatically for each B2 write - */ - snd_soc_write(codec, - (WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - /* Store the coefficients in sidetone coeff array */ - for (coeff_idx = 0; coeff_idx < WCD934X_CDC_SIDETONE_IIR_COEFF_MAX; - coeff_idx++) { - uint32_t value = ucontrol->value.integer.value[coeff_idx]; - - set_iir_band_coeff(codec, iir_idx, band_idx, value); - - /* Four 8 bit values(one 32 bit) per coefficient */ - tavil->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value & 0xFF); - tavil->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 8) & 0xFF; - tavil->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 16) & 0xFF; - tavil->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value >> 24) & 0xFF; - } - - pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 0), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 1), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 2), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 3), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 4)); - return 0; -} - -static int tavil_compander_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil->comp_enabled[comp]; - return 0; -} - -static int tavil_compander_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, tavil->comp_enabled[comp], value); - tavil->comp_enabled[comp] = value; - - /* Any specific register configuration for compander */ - switch (comp) { - case COMPANDER_1: - /* Set Gain Source Select based on compander enable/disable */ - snd_soc_update_bits(codec, WCD934X_HPH_L_EN, 0x20, - (value ? 0x00:0x20)); - /* Disable Compander Clock */ - snd_soc_update_bits(codec, WCD934X_CDC_RX1_RX_PATH_CFG0, 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x02, 0x02); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x01, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER1_CTL0, 0x04, 0x00); - break; - case COMPANDER_2: - snd_soc_update_bits(codec, WCD934X_HPH_R_EN, 0x20, - (value ? 0x00:0x20)); - /* Disable Compander Clock */ - snd_soc_update_bits(codec, WCD934X_CDC_RX2_RX_PATH_CFG0, 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x04, 0x04); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x02, 0x02); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x02, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x01, 0x00); - snd_soc_update_bits(codec, WCD934X_CDC_COMPANDER2_CTL0, 0x04, 0x00); - - break; - case COMPANDER_3: - case COMPANDER_4: - case COMPANDER_7: - case COMPANDER_8: - break; - default: - /* - * if compander is not enabled for any interpolator, - * it does not cause any audio failure, so do not - * return error in this case, but just print a log - */ - dev_warn(codec->dev, "%s: unknown compander: %d\n", - __func__, comp); - }; - return 0; -} - -static int tavil_hph_asrc_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int index = -EINVAL; - - if (!strcmp(kcontrol->id.name, "ASRC0 Output Mode")) - index = ASRC0; - if (!strcmp(kcontrol->id.name, "ASRC1 Output Mode")) - index = ASRC1; - - if (tavil && (index >= 0) && (index < ASRC_MAX)) - tavil->asrc_output_mode[index] = - ucontrol->value.integer.value[0]; - - return 0; -} - -static int tavil_hph_asrc_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int val = 0; - int index = -EINVAL; - - if (!strcmp(kcontrol->id.name, "ASRC0 Output Mode")) - index = ASRC0; - if (!strcmp(kcontrol->id.name, "ASRC1 Output Mode")) - index = ASRC1; - - if (tavil && (index >= 0) && (index < ASRC_MAX)) - val = tavil->asrc_output_mode[index]; - - ucontrol->value.integer.value[0] = val; - - return 0; -} - -static int tavil_hph_idle_detect_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int val = 0; - - if (tavil) - val = tavil->idle_det_cfg.hph_idle_detect_en; - - ucontrol->value.integer.value[0] = val; - - return 0; -} - -static int tavil_hph_idle_detect_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - if (tavil) - tavil->idle_det_cfg.hph_idle_detect_en = - ucontrol->value.integer.value[0]; - - return 0; -} - -static int tavil_dmic_pin_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u16 dmic_pin; - u8 reg_val, pinctl_position; - - pinctl_position = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - dmic_pin = pinctl_position & 0x07; - reg_val = snd_soc_read(codec, - WCD934X_TLMM_DMIC1_CLK_PINCFG + dmic_pin - 1); - - ucontrol->value.integer.value[0] = !!reg_val; - - return 0; -} - -static int tavil_dmic_pin_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u16 ctl_reg, cfg_reg, dmic_pin; - u8 ctl_val, cfg_val, pinctl_position, pinctl_mode, mask; - - /* 0- high or low; 1- high Z */ - pinctl_mode = ucontrol->value.integer.value[0]; - pinctl_position = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - switch (pinctl_position >> 3) { - case 0: - ctl_reg = WCD934X_TEST_DEBUG_PIN_CTL_OE_0; - break; - case 1: - ctl_reg = WCD934X_TEST_DEBUG_PIN_CTL_OE_1; - break; - case 2: - ctl_reg = WCD934X_TEST_DEBUG_PIN_CTL_OE_2; - break; - case 3: - ctl_reg = WCD934X_TEST_DEBUG_PIN_CTL_OE_3; - break; - default: - dev_err(codec->dev, "%s: Invalid pinctl position = %d\n", - __func__, pinctl_position); - return -EINVAL; - } - - ctl_val = ~(pinctl_mode << (pinctl_position & 0x07)); - mask = 1 << (pinctl_position & 0x07); - snd_soc_update_bits(codec, ctl_reg, mask, ctl_val); - - dmic_pin = pinctl_position & 0x07; - cfg_reg = WCD934X_TLMM_DMIC1_CLK_PINCFG + dmic_pin - 1; - if (pinctl_mode) { - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - cfg_val = 0x6; - else - cfg_val = 0xD; - } else - cfg_val = 0; - snd_soc_update_bits(codec, cfg_reg, 0x1F, cfg_val); - - dev_dbg(codec->dev, "%s: reg=0x%x mask=0x%x val=%d reg=0x%x val=%d\n", - __func__, ctl_reg, mask, ctl_val, cfg_reg, cfg_val); - - return 0; -} - -static int tavil_amic_pwr_lvl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u16 amic_reg = 0; - - if (!strcmp(kcontrol->id.name, "AMIC_1_2 PWR MODE")) - amic_reg = WCD934X_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AMIC_3_4 PWR MODE")) - amic_reg = WCD934X_ANA_AMIC3; - - if (amic_reg) - ucontrol->value.integer.value[0] = - (snd_soc_read(codec, amic_reg) & - WCD934X_AMIC_PWR_LVL_MASK) >> - WCD934X_AMIC_PWR_LVL_SHIFT; - return 0; -} - -static int tavil_amic_pwr_lvl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u32 mode_val; - u16 amic_reg = 0; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (!strcmp(kcontrol->id.name, "AMIC_1_2 PWR MODE")) - amic_reg = WCD934X_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AMIC_3_4 PWR MODE")) - amic_reg = WCD934X_ANA_AMIC3; - - if (amic_reg) - snd_soc_update_bits(codec, amic_reg, WCD934X_AMIC_PWR_LVL_MASK, - mode_val << WCD934X_AMIC_PWR_LVL_SHIFT); - return 0; -} - -static const char *const tavil_conn_mad_text[] = { - "NOTUSED1", "ADC1", "ADC2", "ADC3", "ADC4", "NOTUSED5", - "NOTUSED6", "NOTUSED2", "DMIC0", "DMIC1", "DMIC2", "DMIC3", - "DMIC4", "DMIC5", "NOTUSED3", "NOTUSED4" -}; - -static const struct soc_enum tavil_conn_mad_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tavil_conn_mad_text), - tavil_conn_mad_text); - -static int tavil_mad_input_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u8 tavil_mad_input; - - tavil_mad_input = snd_soc_read(codec, WCD934X_SOC_MAD_INP_SEL) & 0x0F; - ucontrol->value.integer.value[0] = tavil_mad_input; - - dev_dbg(codec->dev, "%s: tavil_mad_input = %s\n", __func__, - tavil_conn_mad_text[tavil_mad_input]); - - return 0; -} - -static int tavil_mad_input_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_card *card = codec->component.card; - u8 tavil_mad_input; - char mad_amic_input_widget[6]; - const char *mad_input_widget; - const char *source_widget = NULL; - u32 adc, i, mic_bias_found = 0; - int ret = 0; - char *mad_input; - bool is_adc_input = false; - - tavil_mad_input = ucontrol->value.integer.value[0]; - - if (tavil_mad_input >= sizeof(tavil_conn_mad_text)/ - sizeof(tavil_conn_mad_text[0])) { - dev_err(codec->dev, - "%s: tavil_mad_input = %d out of bounds\n", - __func__, tavil_mad_input); - return -EINVAL; - } - - if (strnstr(tavil_conn_mad_text[tavil_mad_input], "NOTUSED", - sizeof("NOTUSED"))) { - dev_dbg(codec->dev, - "%s: Unsupported tavil_mad_input = %s\n", - __func__, tavil_conn_mad_text[tavil_mad_input]); - /* Make sure the MAD register is updated */ - snd_soc_update_bits(codec, WCD934X_ANA_MAD_SETUP, - 0x88, 0x00); - return -EINVAL; - } - - if (strnstr(tavil_conn_mad_text[tavil_mad_input], - "ADC", sizeof("ADC"))) { - mad_input = strpbrk(tavil_conn_mad_text[tavil_mad_input], - "1234"); - if (!mad_input) { - dev_err(codec->dev, "%s: Invalid MAD input %s\n", - __func__, tavil_conn_mad_text[tavil_mad_input]); - return -EINVAL; - } - - ret = kstrtouint(mad_input, 10, &adc); - if ((ret < 0) || (adc > 4)) { - dev_err(codec->dev, "%s: Invalid ADC = %s\n", __func__, - tavil_conn_mad_text[tavil_mad_input]); - return -EINVAL; - } - - /*AMIC4 and AMIC5 share ADC4*/ - if ((adc == 4) && - (snd_soc_read(codec, WCD934X_TX_NEW_AMIC_4_5_SEL) & 0x10)) - adc = 5; - - snprintf(mad_amic_input_widget, 6, "%s%u", "AMIC", adc); - - mad_input_widget = mad_amic_input_widget; - is_adc_input = true; - } else { - /* DMIC type input widget*/ - mad_input_widget = tavil_conn_mad_text[tavil_mad_input]; - } - - dev_dbg(codec->dev, - "%s: tavil input widget = %s, adc_input = %s\n", __func__, - mad_input_widget, is_adc_input ? "true" : "false"); - - for (i = 0; i < card->num_of_dapm_routes; i++) { - if (!strcmp(card->of_dapm_routes[i].sink, mad_input_widget)) { - source_widget = card->of_dapm_routes[i].source; - if (!source_widget) { - dev_err(codec->dev, - "%s: invalid source widget\n", - __func__); - return -EINVAL; - } - - if (strnstr(source_widget, - "MIC BIAS1", sizeof("MIC BIAS1"))) { - mic_bias_found = 1; - break; - } else if (strnstr(source_widget, - "MIC BIAS2", sizeof("MIC BIAS2"))) { - mic_bias_found = 2; - break; - } else if (strnstr(source_widget, - "MIC BIAS3", sizeof("MIC BIAS3"))) { - mic_bias_found = 3; - break; - } else if (strnstr(source_widget, - "MIC BIAS4", sizeof("MIC BIAS4"))) { - mic_bias_found = 4; - break; - } - } - } - - if (!mic_bias_found) { - dev_err(codec->dev, "%s: mic bias not found for input %s\n", - __func__, mad_input_widget); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: mic_bias found = %d\n", __func__, - mic_bias_found); - - snd_soc_update_bits(codec, WCD934X_SOC_MAD_INP_SEL, - 0x0F, tavil_mad_input); - snd_soc_update_bits(codec, WCD934X_ANA_MAD_SETUP, - 0x07, mic_bias_found); - /* for all adc inputs, mad should be in micbias mode with BG enabled */ - if (is_adc_input) - snd_soc_update_bits(codec, WCD934X_ANA_MAD_SETUP, - 0x88, 0x88); - else - snd_soc_update_bits(codec, WCD934X_ANA_MAD_SETUP, - 0x88, 0x00); - return 0; -} - -static const char *const tavil_micbias_text[] = { - "OFF", "MICBIAS1", "MICBIAS2", "MICBIAS3", "MICBIAS4" -}; - -static const struct soc_enum tavil_micbias_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tavil_micbias_text), - tavil_micbias_text); - -static int tavil_micb_status_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = priv->micbias_num;; - - dev_dbg(codec->dev, "%s: tavil_micbias_num = %s\n", __func__, - tavil_micbias_text[priv->micbias_num]); - - return 0; -} - -static int tavil_micb_status_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); - u8 tavil_micbias_num; - - tavil_micbias_num = ucontrol->value.integer.value[0]; - - if (tavil_micbias_num >= sizeof(tavil_micbias_text)/ - sizeof(tavil_micbias_text[0])) { - dev_err(codec->dev, - "%s: tavil_micbias_num = %d out of bounds\n", - __func__, tavil_micbias_num); - return -EINVAL; - } - priv->micbias_num = tavil_micbias_num; - - if (tavil_micbias_num == 0) { - tavil_codec_enable_standalone_micbias(codec, 1, false); - tavil_codec_enable_standalone_micbias(codec, 2, false); - tavil_codec_enable_standalone_micbias(codec, 3, false); - tavil_codec_enable_standalone_micbias(codec, 4, false); - dev_err(codec->dev, "====>PFT: %s: turn off all micbias.\n", __func__); - } else { - tavil_codec_enable_standalone_micbias(codec, tavil_micbias_num, true); - dev_err(codec->dev, "====>PFT: %s: turn on micbias %d.\n", - __func__, tavil_micbias_num); - } - - return 0; -} - - -static int tavil_ear_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ear_pa_gain = snd_soc_read(codec, WCD934X_ANA_EAR); - - ear_pa_gain = (ear_pa_gain & 0x70) >> 4; - - ucontrol->value.integer.value[0] = ear_pa_gain; - - dev_dbg(codec->dev, "%s: ear_pa_gain = 0x%x\n", __func__, - ear_pa_gain); - - return 0; -} - -static int tavil_ear_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - ear_pa_gain = ucontrol->value.integer.value[0] << 4; - - snd_soc_update_bits(codec, WCD934X_ANA_EAR, 0x70, ear_pa_gain); - return 0; -} - -static int tavil_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil->ear_spkr_gain; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int tavil_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - tavil->ear_spkr_gain = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: gain = %d\n", __func__, tavil->ear_spkr_gain); - - return 0; -} - -static int tavil_spkr_left_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, WCD934X_CDC_BOOST0_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int tavil_spkr_left_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, WCD934X_CDC_BOOST0_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int tavil_spkr_right_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, WCD934X_CDC_BOOST1_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int tavil_spkr_right_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, WCD934X_CDC_BOOST1_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int tavil_rx_hph_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil->hph_mode; - return 0; -} - -static int tavil_rx_hph_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u32 mode_val; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (mode_val == 0) { - dev_warn(codec->dev, "%s:Invalid HPH Mode, default to Cls-H LOHiFi\n", - __func__); - mode_val = CLS_H_LOHIFI; - } - tavil->hph_mode = mode_val; - return 0; -} - -static int tavil_dmic_drv_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = tavil->dmic_drv_ctl; - return 0; -} - -static int tavil_dmic_drv_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u32 dmic_drv_val; - - dmic_drv_val = ucontrol->value.enumerated.item[0]; - - tavil->dmic_drv_ctl = dmic_drv_val; - snd_soc_update_bits(codec, WCD934X_TEST_DEBUG_PAD_DRVCTL_0, - WCD934X_DMIC_DRV_CTL_MASK, - tavil->dmic_drv_ctl << - WCD934X_DMIC_DRV_CTL_SHIFT); - return 0; -} - -static const char * const dmic_drv_ctl_text[] = { - "DRV_2MA", "DRV_4MA", "DRV_8MA", "DRV_16MA", -}; - -static const struct soc_enum dmic_drv_ctl_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dmic_drv_ctl_text), - dmic_drv_ctl_text); - -static const char * const rx_hph_mode_mux_text[] = { - "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", - "CLS_H_ULP", "CLS_AB_HIFI", -}; - -static const struct soc_enum rx_hph_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), - rx_hph_mode_mux_text); - -static const char *const tavil_anc_func_text[] = {"OFF", "ON"}; -static const struct soc_enum tavil_anc_func_enum = - SOC_ENUM_SINGLE_EXT(2, tavil_anc_func_text); - -static const char *const tavil_clkmode_text[] = {"EXTERNAL", "INTERNAL"}; -static SOC_ENUM_SINGLE_EXT_DECL(tavil_clkmode_enum, tavil_clkmode_text); - -/* Cutoff frequency for high pass filter */ -static const char * const cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ" -}; - -static const char * const rx_cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ", - "CF_NEG_3DB_0P48HZ" -}; - -static const char * const amic_pwr_lvl_text[] = { - "LOW_PWR", "DEFAULT", "HIGH_PERF", "HYBRID" -}; - -static const char * const hph_idle_detect_text[] = { - "OFF", "ON" -}; - -static const char * const asrc_mode_text[] = { - "INT", "FRAC" -}; - -static const char * const tavil_ear_pa_gain_text[] = { - "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", - "G_0_DB", "G_M2P5_DB", "UNDEFINED", "G_M12_DB" -}; - -static const char * const tavil_ear_spkr_pa_gain_text[] = { - "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", - "G_4_DB", "G_5_DB", "G_6_DB" -}; - -static const char * const tavil_speaker_boost_stage_text[] = { - "NO_MAX_STATE", "MAX_STATE_1", "MAX_STATE_2" -}; - -static SOC_ENUM_SINGLE_EXT_DECL(tavil_ear_pa_gain_enum, tavil_ear_pa_gain_text); -static SOC_ENUM_SINGLE_EXT_DECL(tavil_ear_spkr_pa_gain_enum, - tavil_ear_spkr_pa_gain_text); -static SOC_ENUM_SINGLE_EXT_DECL(tavil_spkr_boost_stage_enum, - tavil_speaker_boost_stage_text); -static SOC_ENUM_SINGLE_EXT_DECL(amic_pwr_lvl_enum, amic_pwr_lvl_text); -static SOC_ENUM_SINGLE_EXT_DECL(hph_idle_detect_enum, hph_idle_detect_text); -static SOC_ENUM_SINGLE_EXT_DECL(asrc_mode_enum, asrc_mode_text); -static SOC_ENUM_SINGLE_DECL(cf_dec0_enum, WCD934X_CDC_TX0_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec1_enum, WCD934X_CDC_TX1_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec2_enum, WCD934X_CDC_TX2_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec3_enum, WCD934X_CDC_TX3_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec4_enum, WCD934X_CDC_TX4_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec5_enum, WCD934X_CDC_TX5_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec6_enum, WCD934X_CDC_TX6_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec7_enum, WCD934X_CDC_TX7_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec8_enum, WCD934X_CDC_TX8_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int0_1_enum, WCD934X_CDC_RX0_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int0_2_enum, WCD934X_CDC_RX0_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int1_1_enum, WCD934X_CDC_RX1_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int1_2_enum, WCD934X_CDC_RX1_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int2_1_enum, WCD934X_CDC_RX2_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int2_2_enum, WCD934X_CDC_RX2_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int3_1_enum, WCD934X_CDC_RX3_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int3_2_enum, WCD934X_CDC_RX3_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int4_1_enum, WCD934X_CDC_RX4_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int4_2_enum, WCD934X_CDC_RX4_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int7_1_enum, WCD934X_CDC_RX7_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int7_2_enum, WCD934X_CDC_RX7_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int8_1_enum, WCD934X_CDC_RX8_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int8_2_enum, WCD934X_CDC_RX8_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct snd_kcontrol_new tavil_snd_controls[] = { - SOC_ENUM_EXT("EAR PA Gain", tavil_ear_pa_gain_enum, - tavil_ear_pa_gain_get, tavil_ear_pa_gain_put), - SOC_ENUM_EXT("EAR SPKR PA Gain", tavil_ear_spkr_pa_gain_enum, - tavil_ear_spkr_pa_gain_get, tavil_ear_spkr_pa_gain_put), - SOC_ENUM_EXT("SPKR Left Boost Max State", tavil_spkr_boost_stage_enum, - tavil_spkr_left_boost_stage_get, - tavil_spkr_left_boost_stage_put), - SOC_ENUM_EXT("SPKR Right Boost Max State", tavil_spkr_boost_stage_enum, - tavil_spkr_right_boost_stage_get, - tavil_spkr_right_boost_stage_put), - SOC_SINGLE_TLV("HPHL Volume", WCD934X_HPH_L_EN, 0, 24, 1, line_gain), - SOC_SINGLE_TLV("HPHR Volume", WCD934X_HPH_R_EN, 0, 24, 1, line_gain), - SOC_SINGLE_TLV("LINEOUT1 Volume", WCD934X_DIFF_LO_LO1_COMPANDER, - 3, 16, 1, line_gain), - SOC_SINGLE_TLV("LINEOUT2 Volume", WCD934X_DIFF_LO_LO2_COMPANDER, - 3, 16, 1, line_gain), - SOC_SINGLE_TLV("ADC1 Volume", WCD934X_ANA_AMIC1, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC2 Volume", WCD934X_ANA_AMIC2, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC3 Volume", WCD934X_ANA_AMIC3, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC4 Volume", WCD934X_ANA_AMIC4, 0, 20, 0, analog_gain), - - SOC_SINGLE_SX_TLV("RX0 Digital Volume", WCD934X_CDC_RX0_RX_VOL_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX1 Digital Volume", WCD934X_CDC_RX1_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX2 Digital Volume", WCD934X_CDC_RX2_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX3 Digital Volume", WCD934X_CDC_RX3_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX4 Digital Volume", WCD934X_CDC_RX4_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX7 Digital Volume", WCD934X_CDC_RX7_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX8 Digital Volume", WCD934X_CDC_RX8_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX0 Mix Digital Volume", - WCD934X_CDC_RX0_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX1 Mix Digital Volume", - WCD934X_CDC_RX1_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX2 Mix Digital Volume", - WCD934X_CDC_RX2_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX3 Mix Digital Volume", - WCD934X_CDC_RX3_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX4 Mix Digital Volume", - WCD934X_CDC_RX4_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX7 Mix Digital Volume", - WCD934X_CDC_RX7_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX8 Mix Digital Volume", - WCD934X_CDC_RX8_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("DEC0 Volume", WCD934X_CDC_TX0_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC1 Volume", WCD934X_CDC_TX1_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC2 Volume", WCD934X_CDC_TX2_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC3 Volume", WCD934X_CDC_TX3_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC4 Volume", WCD934X_CDC_TX4_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC5 Volume", WCD934X_CDC_TX5_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC6 Volume", WCD934X_CDC_TX6_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC7 Volume", WCD934X_CDC_TX7_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC8 Volume", WCD934X_CDC_TX8_TX_VOL_CTL, 0, - -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("IIR0 INP0 Volume", - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP1 Volume", - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP2 Volume", - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP3 Volume", - WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP0 Volume", - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP1 Volume", - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP2 Volume", - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR1 INP3 Volume", - WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - - SOC_SINGLE_EXT("ANC Slot", SND_SOC_NOPM, 0, 100, 0, tavil_get_anc_slot, - tavil_put_anc_slot), - SOC_ENUM_EXT("ANC Function", tavil_anc_func_enum, tavil_get_anc_func, - tavil_put_anc_func), - - SOC_ENUM_EXT("CLK MODE", tavil_clkmode_enum, tavil_get_clkmode, - tavil_put_clkmode), - - SOC_ENUM("TX0 HPF cut off", cf_dec0_enum), - SOC_ENUM("TX1 HPF cut off", cf_dec1_enum), - SOC_ENUM("TX2 HPF cut off", cf_dec2_enum), - SOC_ENUM("TX3 HPF cut off", cf_dec3_enum), - SOC_ENUM("TX4 HPF cut off", cf_dec4_enum), - SOC_ENUM("TX5 HPF cut off", cf_dec5_enum), - SOC_ENUM("TX6 HPF cut off", cf_dec6_enum), - SOC_ENUM("TX7 HPF cut off", cf_dec7_enum), - SOC_ENUM("TX8 HPF cut off", cf_dec8_enum), - - SOC_ENUM("RX INT0_1 HPF cut off", cf_int0_1_enum), - SOC_ENUM("RX INT0_2 HPF cut off", cf_int0_2_enum), - SOC_ENUM("RX INT1_1 HPF cut off", cf_int1_1_enum), - SOC_ENUM("RX INT1_2 HPF cut off", cf_int1_2_enum), - SOC_ENUM("RX INT2_1 HPF cut off", cf_int2_1_enum), - SOC_ENUM("RX INT2_2 HPF cut off", cf_int2_2_enum), - SOC_ENUM("RX INT3_1 HPF cut off", cf_int3_1_enum), - SOC_ENUM("RX INT3_2 HPF cut off", cf_int3_2_enum), - SOC_ENUM("RX INT4_1 HPF cut off", cf_int4_1_enum), - SOC_ENUM("RX INT4_2 HPF cut off", cf_int4_2_enum), - SOC_ENUM("RX INT7_1 HPF cut off", cf_int7_1_enum), - SOC_ENUM("RX INT7_2 HPF cut off", cf_int7_2_enum), - SOC_ENUM("RX INT8_1 HPF cut off", cf_int8_1_enum), - SOC_ENUM("RX INT8_2 HPF cut off", cf_int8_2_enum), - - SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, - tavil_rx_hph_mode_get, tavil_rx_hph_mode_put), - - SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0, - tavil_iir_enable_audio_mixer_get, - tavil_iir_enable_audio_mixer_put), - - SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5, - tavil_iir_band_audio_mixer_get, tavil_iir_band_audio_mixer_put), - - SOC_SINGLE_EXT("COMP1 Switch", SND_SOC_NOPM, COMPANDER_1, 1, 0, - tavil_compander_get, tavil_compander_put), - SOC_SINGLE_EXT("COMP2 Switch", SND_SOC_NOPM, COMPANDER_2, 1, 0, - tavil_compander_get, tavil_compander_put), - SOC_SINGLE_EXT("COMP3 Switch", SND_SOC_NOPM, COMPANDER_3, 1, 0, - tavil_compander_get, tavil_compander_put), - SOC_SINGLE_EXT("COMP4 Switch", SND_SOC_NOPM, COMPANDER_4, 1, 0, - tavil_compander_get, tavil_compander_put), - SOC_SINGLE_EXT("COMP7 Switch", SND_SOC_NOPM, COMPANDER_7, 1, 0, - tavil_compander_get, tavil_compander_put), - SOC_SINGLE_EXT("COMP8 Switch", SND_SOC_NOPM, COMPANDER_8, 1, 0, - tavil_compander_get, tavil_compander_put), - - SOC_ENUM_EXT("ASRC0 Output Mode", asrc_mode_enum, - tavil_hph_asrc_mode_get, tavil_hph_asrc_mode_put), - SOC_ENUM_EXT("ASRC1 Output Mode", asrc_mode_enum, - tavil_hph_asrc_mode_get, tavil_hph_asrc_mode_put), - - SOC_ENUM_EXT("HPH Idle Detect", hph_idle_detect_enum, - tavil_hph_idle_detect_get, tavil_hph_idle_detect_put), - - SOC_ENUM_EXT("MAD Input", tavil_conn_mad_enum, - tavil_mad_input_get, tavil_mad_input_put), - - SOC_ENUM_EXT("Mic Bias", tavil_micbias_enum, - tavil_micb_status_get, tavil_micb_status_put), - - - SOC_SINGLE_EXT("DMIC1_CLK_PIN_MODE", SND_SOC_NOPM, 17, 1, 0, - tavil_dmic_pin_mode_get, tavil_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC1_DATA_PIN_MODE", SND_SOC_NOPM, 18, 1, 0, - tavil_dmic_pin_mode_get, tavil_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC2_CLK_PIN_MODE", SND_SOC_NOPM, 19, 1, 0, - tavil_dmic_pin_mode_get, tavil_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC2_DATA_PIN_MODE", SND_SOC_NOPM, 20, 1, 0, - tavil_dmic_pin_mode_get, tavil_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC3_CLK_PIN_MODE", SND_SOC_NOPM, 21, 1, 0, - tavil_dmic_pin_mode_get, tavil_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC3_DATA_PIN_MODE", SND_SOC_NOPM, 22, 1, 0, - tavil_dmic_pin_mode_get, tavil_dmic_pin_mode_put), - SOC_ENUM_EXT("AMIC_1_2 PWR MODE", amic_pwr_lvl_enum, - tavil_amic_pwr_lvl_get, tavil_amic_pwr_lvl_put), - SOC_ENUM_EXT("AMIC_3_4 PWR MODE", amic_pwr_lvl_enum, - tavil_amic_pwr_lvl_get, tavil_amic_pwr_lvl_put), - SOC_ENUM_EXT("AMIC_5_6 PWR MODE", amic_pwr_lvl_enum, - tavil_amic_pwr_lvl_get, tavil_amic_pwr_lvl_put), - - SOC_ENUM_EXT("DMIC Drive Ctl", dmic_drv_ctl_enum, - tavil_dmic_drv_get, tavil_dmic_drv_put), -}; - -static int tavil_dec_enum_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - u16 mic_sel_reg = 0; - u8 mic_sel; - - val = ucontrol->value.enumerated.item[0]; - if (val > e->items - 1) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - switch (e->reg) { - case WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD934X_CDC_TX0_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD934X_CDC_TX4_TX_PATH_CFG0; - else if (e->shift_l == 4) - mic_sel_reg = WCD934X_CDC_TX8_TX_PATH_CFG0; - break; - case WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD934X_CDC_TX1_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD934X_CDC_TX5_TX_PATH_CFG0; - break; - case WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD934X_CDC_TX2_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD934X_CDC_TX6_TX_PATH_CFG0; - break; - case WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD934X_CDC_TX3_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD934X_CDC_TX7_TX_PATH_CFG0; - break; - default: - dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n", - __func__, e->reg); - return -EINVAL; - } - - /* ADC: 0, DMIC: 1 */ - mic_sel = val ? 0x0 : 0x1; - if (mic_sel_reg) - snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, mic_sel << 7); - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int tavil_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - unsigned short look_ahead_dly_reg = WCD934X_CDC_RX0_RX_PATH_CFG0; - - val = ucontrol->value.enumerated.item[0]; - if (val >= e->items) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - if (e->reg == WCD934X_CDC_RX0_RX_PATH_SEC0) - look_ahead_dly_reg = WCD934X_CDC_RX0_RX_PATH_CFG0; - else if (e->reg == WCD934X_CDC_RX1_RX_PATH_SEC0) - look_ahead_dly_reg = WCD934X_CDC_RX1_RX_PATH_CFG0; - else if (e->reg == WCD934X_CDC_RX2_RX_PATH_SEC0) - look_ahead_dly_reg = WCD934X_CDC_RX2_RX_PATH_CFG0; - - /* Set Look Ahead Delay */ - snd_soc_update_bits(codec, look_ahead_dly_reg, - 0x08, (val ? 0x08 : 0x00)); - /* Set DEM INP Select */ - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static const char * const rx_int0_7_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", - "RX6", "RX7", "PROXIMITY" -}; - -static const char * const rx_int_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", - "RX6", "RX7" -}; - -static const char * const rx_prim_mix_text[] = { - "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2", - "RX3", "RX4", "RX5", "RX6", "RX7" -}; - -static const char * const rx_sidetone_mix_text[] = { - "ZERO", "SRC0", "SRC1", "SRC_SUM" -}; - -static const char * const cdc_if_tx0_mux_text[] = { - "ZERO", "RX_MIX_TX0", "DEC0", "DEC0_192" -}; -static const char * const cdc_if_tx1_mux_text[] = { - "ZERO", "RX_MIX_TX1", "DEC1", "DEC1_192" -}; -static const char * const cdc_if_tx2_mux_text[] = { - "ZERO", "RX_MIX_TX2", "DEC2", "DEC2_192" -}; -static const char * const cdc_if_tx3_mux_text[] = { - "ZERO", "RX_MIX_TX3", "DEC3", "DEC3_192" -}; -static const char * const cdc_if_tx4_mux_text[] = { - "ZERO", "RX_MIX_TX4", "DEC4", "DEC4_192" -}; -static const char * const cdc_if_tx5_mux_text[] = { - "ZERO", "RX_MIX_TX5", "DEC5", "DEC5_192" -}; -static const char * const cdc_if_tx6_mux_text[] = { - "ZERO", "RX_MIX_TX6", "DEC6", "DEC6_192" -}; -static const char * const cdc_if_tx7_mux_text[] = { - "ZERO", "RX_MIX_TX7", "DEC7", "DEC7_192" -}; -static const char * const cdc_if_tx8_mux_text[] = { - "ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192" -}; -static const char * const cdc_if_tx9_mux_text[] = { - "ZERO", "DEC7", "DEC7_192" -}; -static const char * const cdc_if_tx10_mux_text[] = { - "ZERO", "DEC6", "DEC6_192" -}; -static const char * const cdc_if_tx11_mux_text[] = { - "DEC_0_5", "DEC_9_12", "MAD_AUDIO", "MAD_BRDCST" -}; -static const char * const cdc_if_tx11_inp1_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4", - "DEC5", "RX_MIX_TX5", "DEC9_10", "DEC11_12" -}; -static const char * const cdc_if_tx13_mux_text[] = { - "CDC_DEC_5", "MAD_BRDCST" -}; -static const char * const cdc_if_tx13_inp1_mux_text[] = { - "ZERO", "DEC5", "DEC5_192" -}; - -static const char * const iir_inp_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4", "DEC5", "DEC6", - "DEC7", "DEC8", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", "RX6", "RX7" -}; - -static const char * const rx_int_dem_inp_mux_text[] = { - "NORMAL_DSM_OUT", "CLSH_DSM_OUT", -}; - -static const char * const rx_int0_1_interp_mux_text[] = { - "ZERO", "RX INT0_1 MIX1", -}; - -static const char * const rx_int1_1_interp_mux_text[] = { - "ZERO", "RX INT1_1 MIX1", -}; - -static const char * const rx_int2_1_interp_mux_text[] = { - "ZERO", "RX INT2_1 MIX1", -}; - -static const char * const rx_int3_1_interp_mux_text[] = { - "ZERO", "RX INT3_1 MIX1", -}; - -static const char * const rx_int4_1_interp_mux_text[] = { - "ZERO", "RX INT4_1 MIX1", -}; - -static const char * const rx_int7_1_interp_mux_text[] = { - "ZERO", "RX INT7_1 MIX1", -}; - -static const char * const rx_int8_1_interp_mux_text[] = { - "ZERO", "RX INT8_1 MIX1", -}; - -static const char * const rx_int0_2_interp_mux_text[] = { - "ZERO", "RX INT0_2 MUX", -}; - -static const char * const rx_int1_2_interp_mux_text[] = { - "ZERO", "RX INT1_2 MUX", -}; - -static const char * const rx_int2_2_interp_mux_text[] = { - "ZERO", "RX INT2_2 MUX", -}; - -static const char * const rx_int3_2_interp_mux_text[] = { - "ZERO", "RX INT3_2 MUX", -}; - -static const char * const rx_int4_2_interp_mux_text[] = { - "ZERO", "RX INT4_2 MUX", -}; - -static const char * const rx_int7_2_interp_mux_text[] = { - "ZERO", "RX INT7_2 MUX", -}; - -static const char * const rx_int8_2_interp_mux_text[] = { - "ZERO", "RX INT8_2 MUX", -}; - -static const char * const mad_sel_txt[] = { - "SPE", "MSM" -}; - -static const char * const mad_inp_mux_txt[] = { - "MAD", "DEC1" -}; - -static const char * const adc_mux_text[] = { - "DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2" -}; - -static const char * const dmic_mux_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5" -}; - -static const char * const amic_mux_text[] = { - "ZERO", "ADC1", "ADC2", "ADC3", "ADC4" -}; - -static const char * const amic4_5_sel_text[] = { - "AMIC4", "AMIC5" -}; - -static const char * const anc0_fb_mux_text[] = { - "ZERO", "ANC_IN_HPHL", "ANC_IN_EAR", "ANC_IN_EAR_SPKR", - "ANC_IN_LO1" -}; - -static const char * const anc1_fb_mux_text[] = { - "ZERO", "ANC_IN_HPHR", "ANC_IN_LO2" -}; - -static const char * const rx_echo_mux_text[] = { - "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2", "RX_MIX3", "RX_MIX4", - "RX_MIX5", "RX_MIX6", "RX_MIX7", "RX_MIX8" -}; - -static const char *const slim_rx_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB" -}; - -static const char *const i2s_rx01_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB" -}; - -static const char *const i2s_rx23_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB" -}; - -static const char *const i2s_rx45_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB" -}; - -static const char *const i2s_rx67_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB" -}; - -static const char *const cdc_if_rx0_mux_text[] = { - "SLIM RX0", "I2S RX0" -}; -static const char *const cdc_if_rx1_mux_text[] = { - "SLIM RX1", "I2S RX1" -}; -static const char *const cdc_if_rx2_mux_text[] = { - "SLIM RX2", "I2S RX2" -}; -static const char *const cdc_if_rx3_mux_text[] = { - "SLIM RX3", "I2S RX3" -}; -static const char *const cdc_if_rx4_mux_text[] = { - "SLIM RX4", "I2S RX4" -}; -static const char *const cdc_if_rx5_mux_text[] = { - "SLIM RX5", "I2S RX5" -}; -static const char *const cdc_if_rx6_mux_text[] = { - "SLIM RX6", "I2S RX6" -}; -static const char *const cdc_if_rx7_mux_text[] = { - "SLIM RX7", "I2S RX7" -}; - -static const char * const asrc0_mux_text[] = { - "ZERO", "ASRC_IN_HPHL", "ASRC_IN_LO1", -}; - -static const char * const asrc1_mux_text[] = { - "ZERO", "ASRC_IN_HPHR", "ASRC_IN_LO2", -}; - -static const char * const asrc2_mux_text[] = { - "ZERO", "ASRC_IN_SPKR1", -}; - -static const char * const asrc3_mux_text[] = { - "ZERO", "ASRC_IN_SPKR2", -}; - -static const char * const native_mux_text[] = { - "OFF", "ON", -}; - -static const char *const wdma3_port0_text[] = { - "RX_MIX_TX0", "DEC0" -}; - -static const char *const wdma3_port1_text[] = { - "RX_MIX_TX1", "DEC1" -}; - -static const char *const wdma3_port2_text[] = { - "RX_MIX_TX2", "DEC2" -}; - -static const char *const wdma3_port3_text[] = { - "RX_MIX_TX3", "DEC3" -}; - -static const char *const wdma3_port4_text[] = { - "RX_MIX_TX4", "DEC4" -}; - -static const char *const wdma3_port5_text[] = { - "RX_MIX_TX5", "DEC5" -}; - -static const char *const wdma3_port6_text[] = { - "RX_MIX_TX6", "DEC6" -}; - -static const char *const wdma3_ch_text[] = { - "PORT_0", "PORT_1", "PORT_2", "PORT_3", "PORT_4", - "PORT_5", "PORT_6", "PORT_7", "PORT_8", -}; - -static const struct snd_kcontrol_new aif4_vi_mixer[] = { - SOC_SINGLE_EXT("SPKR_VI_1", SND_SOC_NOPM, WCD934X_TX14, 1, 0, - tavil_vi_feed_mixer_get, tavil_vi_feed_mixer_put), - SOC_SINGLE_EXT("SPKR_VI_2", SND_SOC_NOPM, WCD934X_TX15, 1, 0, - tavil_vi_feed_mixer_get, tavil_vi_feed_mixer_put), -}; - -static const struct snd_kcontrol_new aif1_slim_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD934X_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD934X_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD934X_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD934X_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD934X_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD934X_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD934X_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD934X_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD934X_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD934X_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD934X_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD934X_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif1_i2s_cap_mixer[] = { - SOC_SINGLE_EXT("I2S TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX2", SND_SOC_NOPM, WCD934X_TX2, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX3", SND_SOC_NOPM, WCD934X_TX3, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX4", SND_SOC_NOPM, WCD934X_TX4, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX5", SND_SOC_NOPM, WCD934X_TX5, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX6", SND_SOC_NOPM, WCD934X_TX6, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX7", SND_SOC_NOPM, WCD934X_TX7, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif2_slim_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD934X_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD934X_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD934X_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD934X_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD934X_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD934X_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD934X_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD934X_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD934X_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD934X_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD934X_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD934X_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif2_i2s_cap_mixer[] = { - SOC_SINGLE_EXT("I2S TX8", SND_SOC_NOPM, WCD934X_TX8, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX11", SND_SOC_NOPM, WCD934X_TX11, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif3_slim_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD934X_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD934X_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD934X_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD934X_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD934X_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD934X_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD934X_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD934X_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD934X_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD934X_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD934X_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD934X_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif3_i2s_cap_mixer[] = { - SOC_SINGLE_EXT("I2S TX0", SND_SOC_NOPM, WCD934X_TX0, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), - SOC_SINGLE_EXT("I2S TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0, - i2s_tx_mixer_get, i2s_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif4_slim_mad_mixer[] = { - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD934X_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -WCD_DAPM_ENUM_EXT(slim_rx0, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx1, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx2, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx3, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx4, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx5, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx6, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx7, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); - -WCD_DAPM_ENUM(cdc_if_rx0, SND_SOC_NOPM, 0, cdc_if_rx0_mux_text); -WCD_DAPM_ENUM(cdc_if_rx1, SND_SOC_NOPM, 0, cdc_if_rx1_mux_text); -WCD_DAPM_ENUM(cdc_if_rx2, SND_SOC_NOPM, 0, cdc_if_rx2_mux_text); -WCD_DAPM_ENUM(cdc_if_rx3, SND_SOC_NOPM, 0, cdc_if_rx3_mux_text); -WCD_DAPM_ENUM(cdc_if_rx4, SND_SOC_NOPM, 0, cdc_if_rx4_mux_text); -WCD_DAPM_ENUM(cdc_if_rx5, SND_SOC_NOPM, 0, cdc_if_rx5_mux_text); -WCD_DAPM_ENUM(cdc_if_rx6, SND_SOC_NOPM, 0, cdc_if_rx6_mux_text); -WCD_DAPM_ENUM(cdc_if_rx7, SND_SOC_NOPM, 0, cdc_if_rx7_mux_text); - -WCD_DAPM_ENUM(rx_int0_2, WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, - rx_int0_7_mix_mux_text); -WCD_DAPM_ENUM(rx_int1_2, WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, - rx_int_mix_mux_text); -WCD_DAPM_ENUM(rx_int2_2, WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, - rx_int_mix_mux_text); -WCD_DAPM_ENUM(rx_int3_2, WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1, 0, - rx_int_mix_mux_text); -WCD_DAPM_ENUM(rx_int4_2, WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1, 0, - rx_int_mix_mux_text); -WCD_DAPM_ENUM(rx_int7_2, WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1, 0, - rx_int0_7_mix_mux_text); -WCD_DAPM_ENUM(rx_int8_2, WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1, 0, - rx_int_mix_mux_text); - -WCD_DAPM_ENUM(rx_int0_1_mix_inp0, WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int0_1_mix_inp1, WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int0_1_mix_inp2, WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int1_1_mix_inp0, WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int1_1_mix_inp1, WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int1_1_mix_inp2, WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int2_1_mix_inp0, WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int2_1_mix_inp1, WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int2_1_mix_inp2, WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int3_1_mix_inp0, WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int3_1_mix_inp1, WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int3_1_mix_inp2, WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int4_1_mix_inp0, WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int4_1_mix_inp1, WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int4_1_mix_inp2, WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int7_1_mix_inp0, WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int7_1_mix_inp1, WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int7_1_mix_inp2, WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int8_1_mix_inp0, WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int8_1_mix_inp1, WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int8_1_mix_inp2, WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1, 4, - rx_prim_mix_text); - -WCD_DAPM_ENUM(rx_int0_mix2_inp, WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0, - rx_sidetone_mix_text); -WCD_DAPM_ENUM(rx_int1_mix2_inp, WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2, - rx_sidetone_mix_text); -WCD_DAPM_ENUM(rx_int2_mix2_inp, WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4, - rx_sidetone_mix_text); -WCD_DAPM_ENUM(rx_int3_mix2_inp, WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6, - rx_sidetone_mix_text); -WCD_DAPM_ENUM(rx_int4_mix2_inp, WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 0, - rx_sidetone_mix_text); -WCD_DAPM_ENUM(rx_int7_mix2_inp, WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 2, - rx_sidetone_mix_text); - -WCD_DAPM_ENUM(tx_adc_mux10, WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 4, - adc_mux_text); -WCD_DAPM_ENUM(tx_adc_mux11, WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 4, - adc_mux_text); -WCD_DAPM_ENUM(tx_adc_mux12, WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 4, - adc_mux_text); -WCD_DAPM_ENUM(tx_adc_mux13, WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 6, - adc_mux_text); - - -WCD_DAPM_ENUM(tx_dmic_mux0, WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux1, WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux2, WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux3, WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux4, WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux5, WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux6, WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux7, WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux8, WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux10, WCD934X_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux11, WCD934X_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux12, WCD934X_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux13, WCD934X_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 3, - dmic_mux_text); - - -WCD_DAPM_ENUM(tx_amic_mux0, WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux1, WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux2, WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux3, WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux4, WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux5, WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux6, WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux7, WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux8, WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux10, WCD934X_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux11, WCD934X_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux12, WCD934X_CDC_TX_INP_MUX_ADC_MUX12_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux13, WCD934X_CDC_TX_INP_MUX_ADC_MUX13_CFG0, 0, - amic_mux_text); - -WCD_DAPM_ENUM(tx_amic4_5, WCD934X_TX_NEW_AMIC_4_5_SEL, 7, amic4_5_sel_text); - -WCD_DAPM_ENUM(cdc_if_tx0, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 0, - cdc_if_tx0_mux_text); -WCD_DAPM_ENUM(cdc_if_tx1, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 2, - cdc_if_tx1_mux_text); -WCD_DAPM_ENUM(cdc_if_tx2, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 4, - cdc_if_tx2_mux_text); -WCD_DAPM_ENUM(cdc_if_tx3, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 6, - cdc_if_tx3_mux_text); -WCD_DAPM_ENUM(cdc_if_tx4, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 0, - cdc_if_tx4_mux_text); -WCD_DAPM_ENUM(cdc_if_tx5, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 2, - cdc_if_tx5_mux_text); -WCD_DAPM_ENUM(cdc_if_tx6, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 4, - cdc_if_tx6_mux_text); -WCD_DAPM_ENUM(cdc_if_tx7, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 6, - cdc_if_tx7_mux_text); -WCD_DAPM_ENUM(cdc_if_tx8, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2, 0, - cdc_if_tx8_mux_text); -WCD_DAPM_ENUM(cdc_if_tx9, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2, 2, - cdc_if_tx9_mux_text); -WCD_DAPM_ENUM(cdc_if_tx10, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2, 4, - cdc_if_tx10_mux_text); -WCD_DAPM_ENUM(cdc_if_tx11_inp1, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3, 0, - cdc_if_tx11_inp1_mux_text); -WCD_DAPM_ENUM(cdc_if_tx11, WCD934X_DATA_HUB_SB_TX11_INP_CFG, 0, - cdc_if_tx11_mux_text); -WCD_DAPM_ENUM(cdc_if_tx13_inp1, WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3, 4, - cdc_if_tx13_inp1_mux_text); -WCD_DAPM_ENUM(cdc_if_tx13, WCD934X_DATA_HUB_SB_TX13_INP_CFG, 0, - cdc_if_tx13_mux_text); - -WCD_DAPM_ENUM(rx_mix_tx0, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG0, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx1, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG0, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx2, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG1, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx3, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG1, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx4, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG2, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx5, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG2, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx6, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG3, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx7, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG3, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx8, WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG4, 0, - rx_echo_mux_text); - -WCD_DAPM_ENUM(iir0_inp0, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir0_inp1, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir0_inp2, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir0_inp3, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir1_inp0, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir1_inp1, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir1_inp2, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir1_inp3, WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3, 0, - iir_inp_mux_text); - -WCD_DAPM_ENUM(rx_int0_1_interp, SND_SOC_NOPM, 0, rx_int0_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int1_1_interp, SND_SOC_NOPM, 0, rx_int1_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int2_1_interp, SND_SOC_NOPM, 0, rx_int2_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int3_1_interp, SND_SOC_NOPM, 0, rx_int3_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int4_1_interp, SND_SOC_NOPM, 0, rx_int4_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int7_1_interp, SND_SOC_NOPM, 0, rx_int7_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int8_1_interp, SND_SOC_NOPM, 0, rx_int8_1_interp_mux_text); - -WCD_DAPM_ENUM(rx_int0_2_interp, SND_SOC_NOPM, 0, rx_int0_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int1_2_interp, SND_SOC_NOPM, 0, rx_int1_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int2_2_interp, SND_SOC_NOPM, 0, rx_int2_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int3_2_interp, SND_SOC_NOPM, 0, rx_int3_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int4_2_interp, SND_SOC_NOPM, 0, rx_int4_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int7_2_interp, SND_SOC_NOPM, 0, rx_int7_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int8_2_interp, SND_SOC_NOPM, 0, rx_int8_2_interp_mux_text); - -WCD_DAPM_ENUM(mad_sel, WCD934X_CPE_SS_SVA_CFG, 0, - mad_sel_txt); - -WCD_DAPM_ENUM(mad_inp_mux, WCD934X_CPE_SS_SVA_CFG, 2, - mad_inp_mux_txt); - -WCD_DAPM_ENUM_EXT(rx_int0_dem_inp, WCD934X_CDC_RX0_RX_PATH_SEC0, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - tavil_int_dem_inp_mux_put); -WCD_DAPM_ENUM_EXT(rx_int1_dem_inp, WCD934X_CDC_RX1_RX_PATH_SEC0, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - tavil_int_dem_inp_mux_put); -WCD_DAPM_ENUM_EXT(rx_int2_dem_inp, WCD934X_CDC_RX2_RX_PATH_SEC0, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - tavil_int_dem_inp_mux_put); - -WCD_DAPM_ENUM_EXT(tx_adc_mux0, WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux1, WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux2, WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux3, WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux4, WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux5, WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux6, WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux7, WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux8, WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 4, - adc_mux_text, snd_soc_dapm_get_enum_double, tavil_dec_enum_put); - -WCD_DAPM_ENUM(asrc0, WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 0, - asrc0_mux_text); -WCD_DAPM_ENUM(asrc1, WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 2, - asrc1_mux_text); -WCD_DAPM_ENUM(asrc2, WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 4, - asrc2_mux_text); -WCD_DAPM_ENUM(asrc3, WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 6, - asrc3_mux_text); - -WCD_DAPM_ENUM(int1_1_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int2_1_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int3_1_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int4_1_native, SND_SOC_NOPM, 0, native_mux_text); - -WCD_DAPM_ENUM(int1_2_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int2_2_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int3_2_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int4_2_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int7_2_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int8_2_native, SND_SOC_NOPM, 0, native_mux_text); - -WCD_DAPM_ENUM(anc0_fb, WCD934X_CDC_RX_INP_MUX_ANC_CFG0, 0, anc0_fb_mux_text); -WCD_DAPM_ENUM(anc1_fb, WCD934X_CDC_RX_INP_MUX_ANC_CFG0, 3, anc1_fb_mux_text); - -WCD_DAPM_ENUM_EXT(i2s_rx0, SND_SOC_NOPM, 0, i2s_rx01_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); -WCD_DAPM_ENUM_EXT(i2s_rx1, SND_SOC_NOPM, 0, i2s_rx01_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); -WCD_DAPM_ENUM_EXT(i2s_rx2, SND_SOC_NOPM, 0, i2s_rx23_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); -WCD_DAPM_ENUM_EXT(i2s_rx3, SND_SOC_NOPM, 0, i2s_rx23_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); -WCD_DAPM_ENUM_EXT(i2s_rx4, SND_SOC_NOPM, 0, i2s_rx45_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); -WCD_DAPM_ENUM_EXT(i2s_rx5, SND_SOC_NOPM, 0, i2s_rx45_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); -WCD_DAPM_ENUM_EXT(i2s_rx6, SND_SOC_NOPM, 0, i2s_rx67_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); -WCD_DAPM_ENUM_EXT(i2s_rx7, SND_SOC_NOPM, 0, i2s_rx67_mux_text, - i2s_rx_mux_get, i2s_rx_mux_put); - -WCD_DAPM_ENUM(wdma3_port0, WCD934X_DMA_WDMA3_PRT_CFG, 0, wdma3_port0_text); -WCD_DAPM_ENUM(wdma3_port1, WCD934X_DMA_WDMA3_PRT_CFG, 1, wdma3_port1_text); -WCD_DAPM_ENUM(wdma3_port2, WCD934X_DMA_WDMA3_PRT_CFG, 2, wdma3_port2_text); -WCD_DAPM_ENUM(wdma3_port3, WCD934X_DMA_WDMA3_PRT_CFG, 3, wdma3_port3_text); -WCD_DAPM_ENUM(wdma3_port4, WCD934X_DMA_WDMA3_PRT_CFG, 4, wdma3_port4_text); -WCD_DAPM_ENUM(wdma3_port5, WCD934X_DMA_WDMA3_PRT_CFG, 5, wdma3_port5_text); -WCD_DAPM_ENUM(wdma3_port6, WCD934X_DMA_WDMA3_PRT_CFG, 6, wdma3_port6_text); - -WCD_DAPM_ENUM(wdma3_ch0, WCD934X_DMA_CH_0_1_CFG_WDMA_3, 0, wdma3_ch_text); -WCD_DAPM_ENUM(wdma3_ch1, WCD934X_DMA_CH_0_1_CFG_WDMA_3, 4, wdma3_ch_text); -WCD_DAPM_ENUM(wdma3_ch2, WCD934X_DMA_CH_2_3_CFG_WDMA_3, 0, wdma3_ch_text); -WCD_DAPM_ENUM(wdma3_ch3, WCD934X_DMA_CH_2_3_CFG_WDMA_3, 4, wdma3_ch_text); - -static const struct snd_kcontrol_new anc_ear_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_ear_spkr_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_spkr_pa_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_hphl_pa_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_hphr_pa_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new mad_cpe1_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new mad_cpe2_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new mad_brdcst_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux0_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux1_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux2_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux3_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux4_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux5_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux6_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux7_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux8_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new rx_int1_asrc_switch[] = { - SOC_DAPM_SINGLE("HPHL Switch", SND_SOC_NOPM, 0, 1, 0), -}; - -static const struct snd_kcontrol_new rx_int2_asrc_switch[] = { - SOC_DAPM_SINGLE("HPHR Switch", SND_SOC_NOPM, 0, 1, 0), -}; - -static const struct snd_kcontrol_new rx_int3_asrc_switch[] = { - SOC_DAPM_SINGLE("LO1 Switch", SND_SOC_NOPM, 0, 1, 0), -}; - -static const struct snd_kcontrol_new rx_int4_asrc_switch[] = { - SOC_DAPM_SINGLE("LO2 Switch", SND_SOC_NOPM, 0, 1, 0), -}; - -static const struct snd_kcontrol_new wdma3_onoff_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_soc_dapm_widget tavil_dapm_i2s_widgets[] = { - - SND_SOC_DAPM_MUX_E("I2S RX0 MUX", SND_SOC_NOPM, WCD934X_RX0, 0, - &i2s_rx0_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("I2S RX1 MUX", SND_SOC_NOPM, WCD934X_RX1, 0, - &i2s_rx1_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("I2S RX2 MUX", SND_SOC_NOPM, WCD934X_RX2, 0, - &i2s_rx2_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("I2S RX3 MUX", SND_SOC_NOPM, WCD934X_RX3, 0, - &i2s_rx3_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("I2S RX4 MUX", SND_SOC_NOPM, WCD934X_RX4, 0, - &i2s_rx4_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("I2S RX5 MUX", SND_SOC_NOPM, WCD934X_RX5, 0, - &i2s_rx5_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("I2S RX6 MUX", SND_SOC_NOPM, WCD934X_RX6, 0, - &i2s_rx6_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("I2S RX7 MUX", SND_SOC_NOPM, WCD934X_RX7, 0, - &i2s_rx7_mux, tavil_codec_enable_i2s_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("I2S RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("I2S RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("I2S RX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("I2S RX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("I2S RX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("I2S RX5", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("I2S RX6", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("I2S RX7", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER_E("I2S TX0", SND_SOC_NOPM, WCD934X_TX0, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX1", SND_SOC_NOPM, WCD934X_TX1, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX2", SND_SOC_NOPM, WCD934X_TX2, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX3", SND_SOC_NOPM, WCD934X_TX3, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX4", SND_SOC_NOPM, WCD934X_TX4, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX5", SND_SOC_NOPM, WCD934X_TX5, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX6", SND_SOC_NOPM, WCD934X_TX6, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX7", SND_SOC_NOPM, WCD934X_TX7, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX8", SND_SOC_NOPM, WCD934X_TX8, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("I2S TX11", SND_SOC_NOPM, WCD934X_TX11, 0, NULL, 0, - tavil_codec_enable_i2s_path, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0, - aif1_i2s_cap_mixer, ARRAY_SIZE(aif1_i2s_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0, - aif2_i2s_cap_mixer, ARRAY_SIZE(aif2_i2s_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0, - aif3_i2s_cap_mixer, ARRAY_SIZE(aif3_i2s_cap_mixer)), -}; - -static int tavil_dsd_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_context *dapm = - snd_soc_dapm_kcontrol_dapm(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct tavil_dsd_config *dsd_conf = tavil_p->dsd_config; - int val; - - val = tavil_dsd_get_current_mixer_value(dsd_conf, mc->shift); - - ucontrol->value.integer.value[0] = ((val < 0) ? 0 : val); - - return 0; -} - -static int tavil_dsd_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_context *dapm = - snd_soc_dapm_kcontrol_dapm(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm); - struct tavil_priv *tavil_p = snd_soc_codec_get_drvdata(codec); - unsigned int wval = ucontrol->value.integer.value[0]; - struct tavil_dsd_config *dsd_conf = tavil_p->dsd_config; - - if (!dsd_conf) - return 0; - - mutex_lock(&tavil_p->codec_mutex); - - tavil_dsd_set_out_select(dsd_conf, mc->shift); - tavil_dsd_set_mixer_value(dsd_conf, mc->shift, wval); - - mutex_unlock(&tavil_p->codec_mutex); - snd_soc_dapm_mixer_update_power(dapm, kcontrol, wval, NULL); - - return 0; -} - -static const struct snd_kcontrol_new hphl_mixer[] = { - SOC_SINGLE_EXT("DSD HPHL Switch", SND_SOC_NOPM, INTERP_HPHL, 1, 0, - tavil_dsd_mixer_get, tavil_dsd_mixer_put), -}; - -static const struct snd_kcontrol_new hphr_mixer[] = { - SOC_SINGLE_EXT("DSD HPHR Switch", SND_SOC_NOPM, INTERP_HPHR, 1, 0, - tavil_dsd_mixer_get, tavil_dsd_mixer_put), -}; - -static const struct snd_kcontrol_new lo1_mixer[] = { - SOC_SINGLE_EXT("DSD LO1 Switch", SND_SOC_NOPM, INTERP_LO1, 1, 0, - tavil_dsd_mixer_get, tavil_dsd_mixer_put), -}; - -static const struct snd_kcontrol_new lo2_mixer[] = { - SOC_SINGLE_EXT("DSD LO2 Switch", SND_SOC_NOPM, INTERP_LO2, 1, 0, - tavil_dsd_mixer_get, tavil_dsd_mixer_put), -}; - -static const struct snd_soc_dapm_widget tavil_dapm_slim_widgets[] = { - SND_SOC_DAPM_AIF_IN_E("AIF4 PB", "AIF4 Playback", 0, SND_SOC_NOPM, - AIF4_PB, 0, tavil_codec_enable_rx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT_E("AIF4 VI", "VIfeed", 0, SND_SOC_NOPM, - AIF4_VIFEED, 0, - tavil_codec_enable_slimvi_feedback, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT("AIF4 MAD", "AIF4 MAD TX", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_MIXER("AIF4_VI Mixer", SND_SOC_NOPM, AIF4_VIFEED, 0, - aif4_vi_mixer, ARRAY_SIZE(aif4_vi_mixer)), - SND_SOC_DAPM_INPUT("VIINPUT"), - - WCD_DAPM_MUX("SLIM RX0 MUX", WCD934X_RX0, slim_rx0), - WCD_DAPM_MUX("SLIM RX1 MUX", WCD934X_RX1, slim_rx1), - WCD_DAPM_MUX("SLIM RX2 MUX", WCD934X_RX2, slim_rx2), - WCD_DAPM_MUX("SLIM RX3 MUX", WCD934X_RX3, slim_rx3), - WCD_DAPM_MUX("SLIM RX4 MUX", WCD934X_RX4, slim_rx4), - WCD_DAPM_MUX("SLIM RX5 MUX", WCD934X_RX5, slim_rx5), - WCD_DAPM_MUX("SLIM RX6 MUX", WCD934X_RX6, slim_rx6), - WCD_DAPM_MUX("SLIM RX7 MUX", WCD934X_RX7, slim_rx7), - - SND_SOC_DAPM_MIXER("SLIM RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX5", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX6", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX7", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0, - aif1_slim_cap_mixer, - ARRAY_SIZE(aif1_slim_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0, - aif2_slim_cap_mixer, - ARRAY_SIZE(aif2_slim_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0, - aif3_slim_cap_mixer, - ARRAY_SIZE(aif3_slim_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF4_MAD Mixer", SND_SOC_NOPM, AIF4_MAD_TX, 0, - aif4_slim_mad_mixer, - ARRAY_SIZE(aif4_slim_mad_mixer)), -}; - -static const struct snd_soc_dapm_widget tavil_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN_E("AIF1 PB", "AIF1 Playback", 0, SND_SOC_NOPM, - AIF1_PB, 0, tavil_codec_enable_rx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF2 PB", "AIF2 Playback", 0, SND_SOC_NOPM, - AIF2_PB, 0, tavil_codec_enable_rx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF3 PB", "AIF3 Playback", 0, SND_SOC_NOPM, - AIF3_PB, 0, tavil_codec_enable_rx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("CDC_IF RX0 MUX", WCD934X_RX0, cdc_if_rx0), - WCD_DAPM_MUX("CDC_IF RX1 MUX", WCD934X_RX1, cdc_if_rx1), - WCD_DAPM_MUX("CDC_IF RX2 MUX", WCD934X_RX2, cdc_if_rx2), - WCD_DAPM_MUX("CDC_IF RX3 MUX", WCD934X_RX3, cdc_if_rx3), - WCD_DAPM_MUX("CDC_IF RX4 MUX", WCD934X_RX4, cdc_if_rx4), - WCD_DAPM_MUX("CDC_IF RX5 MUX", WCD934X_RX5, cdc_if_rx5), - WCD_DAPM_MUX("CDC_IF RX6 MUX", WCD934X_RX6, cdc_if_rx6), - WCD_DAPM_MUX("CDC_IF RX7 MUX", WCD934X_RX7, cdc_if_rx7), - - SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_EAR, 0, - &rx_int0_2_mux, tavil_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int1_2_mux, tavil_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int2_2_mux, tavil_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT3_2 MUX", SND_SOC_NOPM, INTERP_LO1, 0, - &rx_int3_2_mux, tavil_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT4_2 MUX", SND_SOC_NOPM, INTERP_LO2, 0, - &rx_int4_2_mux, tavil_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_2 MUX", SND_SOC_NOPM, INTERP_SPKR1, 0, - &rx_int7_2_mux, tavil_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_2 MUX", SND_SOC_NOPM, INTERP_SPKR2, 0, - &rx_int8_2_mux, tavil_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("RX INT0_1 MIX1 INP0", 0, rx_int0_1_mix_inp0), - WCD_DAPM_MUX("RX INT0_1 MIX1 INP1", 0, rx_int0_1_mix_inp1), - WCD_DAPM_MUX("RX INT0_1 MIX1 INP2", 0, rx_int0_1_mix_inp2), - WCD_DAPM_MUX("RX INT1_1 MIX1 INP0", 0, rx_int1_1_mix_inp0), - WCD_DAPM_MUX("RX INT1_1 MIX1 INP1", 0, rx_int1_1_mix_inp1), - WCD_DAPM_MUX("RX INT1_1 MIX1 INP2", 0, rx_int1_1_mix_inp2), - WCD_DAPM_MUX("RX INT2_1 MIX1 INP0", 0, rx_int2_1_mix_inp0), - WCD_DAPM_MUX("RX INT2_1 MIX1 INP1", 0, rx_int2_1_mix_inp1), - WCD_DAPM_MUX("RX INT2_1 MIX1 INP2", 0, rx_int2_1_mix_inp2), - WCD_DAPM_MUX("RX INT3_1 MIX1 INP0", 0, rx_int3_1_mix_inp0), - WCD_DAPM_MUX("RX INT3_1 MIX1 INP1", 0, rx_int3_1_mix_inp1), - WCD_DAPM_MUX("RX INT3_1 MIX1 INP2", 0, rx_int3_1_mix_inp2), - WCD_DAPM_MUX("RX INT4_1 MIX1 INP0", 0, rx_int4_1_mix_inp0), - WCD_DAPM_MUX("RX INT4_1 MIX1 INP1", 0, rx_int4_1_mix_inp1), - WCD_DAPM_MUX("RX INT4_1 MIX1 INP2", 0, rx_int4_1_mix_inp2), - - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp0_mux, tavil_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp1_mux, tavil_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp2_mux, tavil_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp0_mux, tavil_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp1_mux, tavil_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp2_mux, tavil_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, - rx_int1_asrc_switch, ARRAY_SIZE(rx_int1_asrc_switch)), - SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, - rx_int2_asrc_switch, ARRAY_SIZE(rx_int2_asrc_switch)), - SND_SOC_DAPM_MIXER("RX INT3_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT3 SEC MIX", SND_SOC_NOPM, 0, 0, - rx_int3_asrc_switch, ARRAY_SIZE(rx_int3_asrc_switch)), - SND_SOC_DAPM_MIXER("RX INT4_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT4 SEC MIX", SND_SOC_NOPM, 0, 0, - rx_int4_asrc_switch, ARRAY_SIZE(rx_int4_asrc_switch)), - SND_SOC_DAPM_MIXER("RX INT7_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT7 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT8_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT8 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT1 MIX3", SND_SOC_NOPM, 0, 0, hphl_mixer, - ARRAY_SIZE(hphl_mixer)), - SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT2 MIX3", SND_SOC_NOPM, 0, 0, hphr_mixer, - ARRAY_SIZE(hphr_mixer)), - SND_SOC_DAPM_MIXER("RX INT3 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT3 MIX3", SND_SOC_NOPM, 0, 0, lo1_mixer, - ARRAY_SIZE(lo1_mixer)), - SND_SOC_DAPM_MIXER("RX INT4 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT4 MIX3", SND_SOC_NOPM, 0, 0, lo2_mixer, - ARRAY_SIZE(lo2_mixer)), - SND_SOC_DAPM_MIXER("RX INT7 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER_E("RX INT7 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, tavil_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT8 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, tavil_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_EAR, - 0, &rx_int0_mix2_inp_mux, tavil_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL, - 0, &rx_int1_mix2_inp_mux, tavil_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR, - 0, &rx_int2_mix2_inp_mux, tavil_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT3 MIX2 INP", SND_SOC_NOPM, INTERP_LO1, - 0, &rx_int3_mix2_inp_mux, tavil_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT4 MIX2 INP", SND_SOC_NOPM, INTERP_LO2, - 0, &rx_int4_mix2_inp_mux, tavil_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7 MIX2 INP", SND_SOC_NOPM, INTERP_SPKR1, - 0, &rx_int7_mix2_inp_mux, tavil_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("CDC_IF TX0 MUX", WCD934X_TX0, cdc_if_tx0), - WCD_DAPM_MUX("CDC_IF TX1 MUX", WCD934X_TX1, cdc_if_tx1), - WCD_DAPM_MUX("CDC_IF TX2 MUX", WCD934X_TX2, cdc_if_tx2), - WCD_DAPM_MUX("CDC_IF TX3 MUX", WCD934X_TX3, cdc_if_tx3), - WCD_DAPM_MUX("CDC_IF TX4 MUX", WCD934X_TX4, cdc_if_tx4), - WCD_DAPM_MUX("CDC_IF TX5 MUX", WCD934X_TX5, cdc_if_tx5), - WCD_DAPM_MUX("CDC_IF TX6 MUX", WCD934X_TX6, cdc_if_tx6), - WCD_DAPM_MUX("CDC_IF TX7 MUX", WCD934X_TX7, cdc_if_tx7), - WCD_DAPM_MUX("CDC_IF TX8 MUX", WCD934X_TX8, cdc_if_tx8), - WCD_DAPM_MUX("CDC_IF TX9 MUX", WCD934X_TX9, cdc_if_tx9), - WCD_DAPM_MUX("CDC_IF TX10 MUX", WCD934X_TX10, cdc_if_tx10), - WCD_DAPM_MUX("CDC_IF TX11 MUX", WCD934X_TX11, cdc_if_tx11), - WCD_DAPM_MUX("CDC_IF TX11 INP1 MUX", WCD934X_TX11, cdc_if_tx11_inp1), - WCD_DAPM_MUX("CDC_IF TX13 MUX", WCD934X_TX13, cdc_if_tx13), - WCD_DAPM_MUX("CDC_IF TX13 INP1 MUX", WCD934X_TX13, cdc_if_tx13_inp1), - - SND_SOC_DAPM_MUX_E("ADC MUX0", WCD934X_CDC_TX0_TX_PATH_CTL, 5, 0, - &tx_adc_mux0_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX1", WCD934X_CDC_TX1_TX_PATH_CTL, 5, 0, - &tx_adc_mux1_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX2", WCD934X_CDC_TX2_TX_PATH_CTL, 5, 0, - &tx_adc_mux2_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX3", WCD934X_CDC_TX3_TX_PATH_CTL, 5, 0, - &tx_adc_mux3_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX4", WCD934X_CDC_TX4_TX_PATH_CTL, 5, 0, - &tx_adc_mux4_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX5", WCD934X_CDC_TX5_TX_PATH_CTL, 5, 0, - &tx_adc_mux5_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX6", WCD934X_CDC_TX6_TX_PATH_CTL, 5, 0, - &tx_adc_mux6_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX7", WCD934X_CDC_TX7_TX_PATH_CTL, 5, 0, - &tx_adc_mux7_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX8", WCD934X_CDC_TX8_TX_PATH_CTL, 5, 0, - &tx_adc_mux8_mux, tavil_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX10", SND_SOC_NOPM, 10, 0, &tx_adc_mux10_mux, - tavil_codec_tx_adc_cfg, SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX_E("ADC MUX11", SND_SOC_NOPM, 11, 0, &tx_adc_mux11_mux, - tavil_codec_tx_adc_cfg, SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX_E("ADC MUX12", SND_SOC_NOPM, 12, 0, &tx_adc_mux12_mux, - tavil_codec_tx_adc_cfg, SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX_E("ADC MUX13", SND_SOC_NOPM, 13, 0, &tx_adc_mux13_mux, - tavil_codec_tx_adc_cfg, SND_SOC_DAPM_POST_PMU), - - WCD_DAPM_MUX("DMIC MUX0", 0, tx_dmic_mux0), - WCD_DAPM_MUX("DMIC MUX1", 0, tx_dmic_mux1), - WCD_DAPM_MUX("DMIC MUX2", 0, tx_dmic_mux2), - WCD_DAPM_MUX("DMIC MUX3", 0, tx_dmic_mux3), - WCD_DAPM_MUX("DMIC MUX4", 0, tx_dmic_mux4), - WCD_DAPM_MUX("DMIC MUX5", 0, tx_dmic_mux5), - WCD_DAPM_MUX("DMIC MUX6", 0, tx_dmic_mux6), - WCD_DAPM_MUX("DMIC MUX7", 0, tx_dmic_mux7), - WCD_DAPM_MUX("DMIC MUX8", 0, tx_dmic_mux8), - WCD_DAPM_MUX("DMIC MUX10", 0, tx_dmic_mux10), - WCD_DAPM_MUX("DMIC MUX11", 0, tx_dmic_mux11), - WCD_DAPM_MUX("DMIC MUX12", 0, tx_dmic_mux12), - WCD_DAPM_MUX("DMIC MUX13", 0, tx_dmic_mux13), - - WCD_DAPM_MUX("AMIC MUX0", 0, tx_amic_mux0), - WCD_DAPM_MUX("AMIC MUX1", 0, tx_amic_mux1), - WCD_DAPM_MUX("AMIC MUX2", 0, tx_amic_mux2), - WCD_DAPM_MUX("AMIC MUX3", 0, tx_amic_mux3), - WCD_DAPM_MUX("AMIC MUX4", 0, tx_amic_mux4), - WCD_DAPM_MUX("AMIC MUX5", 0, tx_amic_mux5), - WCD_DAPM_MUX("AMIC MUX6", 0, tx_amic_mux6), - WCD_DAPM_MUX("AMIC MUX7", 0, tx_amic_mux7), - WCD_DAPM_MUX("AMIC MUX8", 0, tx_amic_mux8), - WCD_DAPM_MUX("AMIC MUX10", 0, tx_amic_mux10), - WCD_DAPM_MUX("AMIC MUX11", 0, tx_amic_mux11), - WCD_DAPM_MUX("AMIC MUX12", 0, tx_amic_mux12), - WCD_DAPM_MUX("AMIC MUX13", 0, tx_amic_mux13), - - SND_SOC_DAPM_ADC_E("ADC1", NULL, WCD934X_ANA_AMIC1, 7, 0, - tavil_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC2", NULL, WCD934X_ANA_AMIC2, 7, 0, - tavil_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC3", NULL, WCD934X_ANA_AMIC3, 7, 0, - tavil_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC4", NULL, WCD934X_ANA_AMIC4, 7, 0, - tavil_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - - WCD_DAPM_MUX("AMIC4_5 SEL", 0, tx_amic4_5), - - WCD_DAPM_MUX("ANC0 FB MUX", 0, anc0_fb), - WCD_DAPM_MUX("ANC1 FB MUX", 0, anc1_fb), - - SND_SOC_DAPM_INPUT("AMIC1"), - SND_SOC_DAPM_INPUT("AMIC2"), - SND_SOC_DAPM_INPUT("AMIC3"), - SND_SOC_DAPM_INPUT("AMIC4"), - SND_SOC_DAPM_INPUT("AMIC5"), - - SND_SOC_DAPM_MICBIAS_E("MIC BIAS1", SND_SOC_NOPM, 0, 0, - tavil_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS2", SND_SOC_NOPM, 0, 0, - tavil_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS3", SND_SOC_NOPM, 0, 0, - tavil_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS4", SND_SOC_NOPM, 0, 0, - tavil_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - /* - * Not supply widget, this is used to recover HPH registers. - * It is not connected to any other widgets - */ - SND_SOC_DAPM_SUPPLY("RESET_HPH_REGISTERS", SND_SOC_NOPM, - 0, 0, tavil_codec_reset_hph_registers, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS1_STANDALONE, SND_SOC_NOPM, 0, 0, - tavil_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS2_STANDALONE, SND_SOC_NOPM, 0, 0, - tavil_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS3_STANDALONE, SND_SOC_NOPM, 0, 0, - tavil_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS4_STANDALONE, SND_SOC_NOPM, 0, 0, - tavil_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT_E("AIF1 CAP", "AIF1 Capture", 0, SND_SOC_NOPM, - AIF1_CAP, 0, tavil_codec_enable_tx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_OUT_E("AIF2 CAP", "AIF2 Capture", 0, SND_SOC_NOPM, - AIF2_CAP, 0, tavil_codec_enable_tx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_OUT_E("AIF3 CAP", "AIF3 Capture", 0, SND_SOC_NOPM, - AIF3_CAP, 0, tavil_codec_enable_tx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("SLIM TX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX5", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX6", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX7", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX8", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX9", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX10", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX11", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX13", SND_SOC_NOPM, 0, 0, NULL, 0), - - /* Digital Mic Inputs */ - SND_SOC_DAPM_ADC_E("DMIC0", NULL, SND_SOC_NOPM, 0, 0, - tavil_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, - tavil_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0, - tavil_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0, - tavil_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0, - tavil_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 0, - tavil_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("IIR0 INP0 MUX", 0, iir0_inp0), - WCD_DAPM_MUX("IIR0 INP1 MUX", 0, iir0_inp1), - WCD_DAPM_MUX("IIR0 INP2 MUX", 0, iir0_inp2), - WCD_DAPM_MUX("IIR0 INP3 MUX", 0, iir0_inp3), - WCD_DAPM_MUX("IIR1 INP0 MUX", 0, iir1_inp0), - WCD_DAPM_MUX("IIR1 INP1 MUX", 0, iir1_inp1), - WCD_DAPM_MUX("IIR1 INP2 MUX", 0, iir1_inp2), - WCD_DAPM_MUX("IIR1 INP3 MUX", 0, iir1_inp3), - - SND_SOC_DAPM_MIXER_E("IIR0", WCD934X_CDC_SIDETONE_IIR0_IIR_PATH_CTL, - 4, 0, NULL, 0, tavil_codec_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER_E("IIR1", WCD934X_CDC_SIDETONE_IIR1_IIR_PATH_CTL, - 4, 0, NULL, 0, tavil_codec_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER("SRC0", WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SRC1", WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - - WCD_DAPM_MUX("RX MIX TX0 MUX", 0, rx_mix_tx0), - WCD_DAPM_MUX("RX MIX TX1 MUX", 0, rx_mix_tx1), - WCD_DAPM_MUX("RX MIX TX2 MUX", 0, rx_mix_tx2), - WCD_DAPM_MUX("RX MIX TX3 MUX", 0, rx_mix_tx3), - WCD_DAPM_MUX("RX MIX TX4 MUX", 0, rx_mix_tx4), - WCD_DAPM_MUX("RX MIX TX5 MUX", 0, rx_mix_tx5), - WCD_DAPM_MUX("RX MIX TX6 MUX", 0, rx_mix_tx6), - WCD_DAPM_MUX("RX MIX TX7 MUX", 0, rx_mix_tx7), - WCD_DAPM_MUX("RX MIX TX8 MUX", 0, rx_mix_tx8), - WCD_DAPM_MUX("RX INT0 DEM MUX", 0, rx_int0_dem_inp), - WCD_DAPM_MUX("RX INT1 DEM MUX", 0, rx_int1_dem_inp), - WCD_DAPM_MUX("RX INT2 DEM MUX", 0, rx_int2_dem_inp), - - SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_EAR, 0, - &rx_int0_1_interp_mux, tavil_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0, - &rx_int1_1_interp_mux, tavil_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0, - &rx_int2_1_interp_mux, tavil_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT3_1 INTERP", SND_SOC_NOPM, INTERP_LO1, 0, - &rx_int3_1_interp_mux, tavil_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT4_1 INTERP", SND_SOC_NOPM, INTERP_LO2, 0, - &rx_int4_1_interp_mux, tavil_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 INTERP", SND_SOC_NOPM, INTERP_SPKR1, 0, - &rx_int7_1_interp_mux, tavil_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 INTERP", SND_SOC_NOPM, INTERP_SPKR2, 0, - &rx_int8_1_interp_mux, tavil_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("RX INT0_2 INTERP", 0, rx_int0_2_interp), - WCD_DAPM_MUX("RX INT1_2 INTERP", 0, rx_int1_2_interp), - WCD_DAPM_MUX("RX INT2_2 INTERP", 0, rx_int2_2_interp), - WCD_DAPM_MUX("RX INT3_2 INTERP", 0, rx_int3_2_interp), - WCD_DAPM_MUX("RX INT4_2 INTERP", 0, rx_int4_2_interp), - WCD_DAPM_MUX("RX INT7_2 INTERP", 0, rx_int7_2_interp), - WCD_DAPM_MUX("RX INT8_2 INTERP", 0, rx_int8_2_interp), - - SND_SOC_DAPM_SWITCH("ADC US MUX0", WCD934X_CDC_TX0_TX_PATH_192_CTL, 0, - 0, &adc_us_mux0_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX1", WCD934X_CDC_TX1_TX_PATH_192_CTL, 0, - 0, &adc_us_mux1_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX2", WCD934X_CDC_TX2_TX_PATH_192_CTL, 0, - 0, &adc_us_mux2_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX3", WCD934X_CDC_TX3_TX_PATH_192_CTL, 0, - 0, &adc_us_mux3_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX4", WCD934X_CDC_TX4_TX_PATH_192_CTL, 0, - 0, &adc_us_mux4_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX5", WCD934X_CDC_TX5_TX_PATH_192_CTL, 0, - 0, &adc_us_mux5_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX6", WCD934X_CDC_TX6_TX_PATH_192_CTL, 0, - 0, &adc_us_mux6_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX7", WCD934X_CDC_TX7_TX_PATH_192_CTL, 0, - 0, &adc_us_mux7_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX8", WCD934X_CDC_TX8_TX_PATH_192_CTL, 0, - 0, &adc_us_mux8_switch), - - /* MAD related widgets */ - SND_SOC_DAPM_INPUT("MAD_CPE_INPUT"), - SND_SOC_DAPM_INPUT("MADINPUT"), - - WCD_DAPM_MUX("MAD_SEL MUX", 0, mad_sel), - WCD_DAPM_MUX("MAD_INP MUX", 0, mad_inp_mux), - - SND_SOC_DAPM_SWITCH_E("MAD_BROADCAST", SND_SOC_NOPM, 0, 0, - &mad_brdcst_switch, tavil_codec_ape_enable_mad, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_SWITCH_E("MAD_CPE1", SND_SOC_NOPM, 0, 0, - &mad_cpe1_switch, tavil_codec_cpe_mad_ctl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SWITCH_E("MAD_CPE2", SND_SOC_NOPM, 0, 0, - &mad_cpe2_switch, tavil_codec_cpe_mad_ctl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_OUTPUT("MAD_CPE_OUT1"), - SND_SOC_DAPM_OUTPUT("MAD_CPE_OUT2"), - - SND_SOC_DAPM_DAC_E("RX INT0 DAC", NULL, SND_SOC_NOPM, - 0, 0, tavil_codec_ear_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT1 DAC", NULL, WCD934X_ANA_HPH, - 5, 0, tavil_codec_hphl_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT2 DAC", NULL, WCD934X_ANA_HPH, - 4, 0, tavil_codec_hphr_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT3 DAC", NULL, SND_SOC_NOPM, - 0, 0, tavil_codec_lineout_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RX INT4 DAC", NULL, SND_SOC_NOPM, - 0, 0, tavil_codec_lineout_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_PGA_E("EAR PA", WCD934X_ANA_EAR, 7, 0, NULL, 0, - tavil_codec_enable_ear_pa, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHL PA", WCD934X_ANA_HPH, 7, 0, NULL, 0, - tavil_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHR PA", WCD934X_ANA_HPH, 6, 0, NULL, 0, - tavil_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("LINEOUT1 PA", WCD934X_ANA_LO_1_2, 7, 0, NULL, 0, - tavil_codec_enable_lineout_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("LINEOUT2 PA", WCD934X_ANA_LO_1_2, 6, 0, NULL, 0, - tavil_codec_enable_lineout_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC EAR PA", WCD934X_ANA_EAR, 7, 0, NULL, 0, - tavil_codec_enable_ear_pa, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC SPK1 PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tavil_codec_enable_spkr_anc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC HPHL PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tavil_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC HPHR PA", SND_SOC_NOPM, 0, 0, NULL, 0, - tavil_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("EAR"), - SND_SOC_DAPM_OUTPUT("HPHL"), - SND_SOC_DAPM_OUTPUT("HPHR"), - SND_SOC_DAPM_OUTPUT("LINEOUT1"), - SND_SOC_DAPM_OUTPUT("LINEOUT2"), - SND_SOC_DAPM_OUTPUT("SPK1 OUT"), - SND_SOC_DAPM_OUTPUT("SPK2 OUT"), - SND_SOC_DAPM_OUTPUT("ANC EAR"), - SND_SOC_DAPM_OUTPUT("ANC HPHL"), - SND_SOC_DAPM_OUTPUT("ANC HPHR"), - - SND_SOC_DAPM_SWITCH("ANC OUT EAR Enable", SND_SOC_NOPM, 0, 0, - &anc_ear_switch), - SND_SOC_DAPM_SWITCH("ANC OUT EAR SPKR Enable", SND_SOC_NOPM, 0, 0, - &anc_ear_spkr_switch), - SND_SOC_DAPM_SWITCH("ANC SPKR PA Enable", SND_SOC_NOPM, 0, 0, - &anc_spkr_pa_switch), - - SND_SOC_DAPM_SWITCH_E("ANC OUT HPHL Enable", SND_SOC_NOPM, INTERP_HPHL, - 0, &anc_hphl_pa_switch, tavil_anc_out_switch_cb, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SWITCH_E("ANC OUT HPHR Enable", SND_SOC_NOPM, INTERP_HPHR, - 0, &anc_hphr_pa_switch, tavil_anc_out_switch_cb, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_SUPPLY("RX_BIAS", SND_SOC_NOPM, 0, 0, - tavil_codec_enable_rx_bias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("RX INT1 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_HPHL, 0, tavil_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("RX INT2 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_HPHR, 0, tavil_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("RX INT3 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_LO1, 0, tavil_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("RX INT4 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_LO2, 0, tavil_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("RX INT7 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_SPKR1, 0, tavil_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("RX INT8 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_SPKR2, 0, tavil_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - WCD_DAPM_MUX("RX INT1_1 NATIVE MUX", 0, int1_1_native), - WCD_DAPM_MUX("RX INT2_1 NATIVE MUX", 0, int2_1_native), - WCD_DAPM_MUX("RX INT3_1 NATIVE MUX", 0, int3_1_native), - WCD_DAPM_MUX("RX INT4_1 NATIVE MUX", 0, int4_1_native), - - WCD_DAPM_MUX("RX INT1_2 NATIVE MUX", 0, int1_2_native), - WCD_DAPM_MUX("RX INT2_2 NATIVE MUX", 0, int2_2_native), - WCD_DAPM_MUX("RX INT3_2 NATIVE MUX", 0, int3_2_native), - WCD_DAPM_MUX("RX INT4_2 NATIVE MUX", 0, int4_2_native), - WCD_DAPM_MUX("RX INT7_2 NATIVE MUX", 0, int7_2_native), - WCD_DAPM_MUX("RX INT8_2 NATIVE MUX", 0, int8_2_native), - - SND_SOC_DAPM_MUX_E("ASRC0 MUX", SND_SOC_NOPM, ASRC0, 0, - &asrc0_mux, tavil_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("ASRC1 MUX", SND_SOC_NOPM, ASRC1, 0, - &asrc1_mux, tavil_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("ASRC2 MUX", SND_SOC_NOPM, ASRC2, 0, - &asrc2_mux, tavil_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("ASRC3 MUX", SND_SOC_NOPM, ASRC3, 0, - &asrc3_mux, tavil_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /* WDMA3 widgets */ - WCD_DAPM_MUX("WDMA3 PORT0 MUX", 0, wdma3_port0), - WCD_DAPM_MUX("WDMA3 PORT1 MUX", 1, wdma3_port1), - WCD_DAPM_MUX("WDMA3 PORT2 MUX", 2, wdma3_port2), - WCD_DAPM_MUX("WDMA3 PORT3 MUX", 3, wdma3_port3), - WCD_DAPM_MUX("WDMA3 PORT4 MUX", 4, wdma3_port4), - WCD_DAPM_MUX("WDMA3 PORT5 MUX", 5, wdma3_port5), - WCD_DAPM_MUX("WDMA3 PORT6 MUX", 6, wdma3_port6), - - WCD_DAPM_MUX("WDMA3 CH0 MUX", 0, wdma3_ch0), - WCD_DAPM_MUX("WDMA3 CH1 MUX", 4, wdma3_ch1), - WCD_DAPM_MUX("WDMA3 CH2 MUX", 0, wdma3_ch2), - WCD_DAPM_MUX("WDMA3 CH3 MUX", 4, wdma3_ch3), - - SND_SOC_DAPM_MIXER("WDMA3_CH_MIXER", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_SWITCH_E("WDMA3_ON_OFF", SND_SOC_NOPM, 0, 0, - &wdma3_onoff_switch, tavil_codec_wdma3_ctl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("WDMA3_OUT"), -}; - -static int tavil_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(dai->codec); - u32 i = 0; - struct wcd9xxx_ch *ch; - int ret = 0; - - switch (dai->id) { - case AIF1_PB: - case AIF2_PB: - case AIF3_PB: - case AIF4_PB: - if (!rx_slot || !rx_num) { - dev_err(tavil->dev, "%s: Invalid rx_slot 0x%pK or rx_num 0x%pK\n", - __func__, rx_slot, rx_num); - ret = -EINVAL; - break; - } - list_for_each_entry(ch, &tavil->dai[dai->id].wcd9xxx_ch_list, - list) { - dev_dbg(tavil->dev, "%s: slot_num %u ch->ch_num %d\n", - __func__, i, ch->ch_num); - rx_slot[i++] = ch->ch_num; - } - *rx_num = i; - dev_dbg(tavil->dev, "%s: dai_name = %s dai_id = %x rx_num = %d\n", - __func__, dai->name, dai->id, i); - if (*rx_num == 0) { - dev_err(tavil->dev, "%s: Channel list empty for dai_name = %s dai_id = %x\n", - __func__, dai->name, dai->id); - ret = -EINVAL; - } - break; - case AIF1_CAP: - case AIF2_CAP: - case AIF3_CAP: - case AIF4_MAD_TX: - case AIF4_VIFEED: - if (!tx_slot || !tx_num) { - dev_err(tavil->dev, "%s: Invalid tx_slot 0x%pK or tx_num 0x%pK\n", - __func__, tx_slot, tx_num); - ret = -EINVAL; - break; - } - list_for_each_entry(ch, &tavil->dai[dai->id].wcd9xxx_ch_list, - list) { - dev_dbg(tavil->dev, "%s: slot_num %u ch->ch_num %d\n", - __func__, i, ch->ch_num); - tx_slot[i++] = ch->ch_num; - } - *tx_num = i; - dev_dbg(tavil->dev, "%s: dai_name = %s dai_id = %x tx_num = %d\n", - __func__, dai->name, dai->id, i); - if (*tx_num == 0) { - dev_err(tavil->dev, "%s: Channel list empty for dai_name = %s dai_id = %x\n", - __func__, dai->name, dai->id); - ret = -EINVAL; - } - break; - default: - dev_err(tavil->dev, "%s: Invalid DAI ID %x\n", - __func__, dai->id); - ret = -EINVAL; - break; - } - - return ret; -} - -static int tavil_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - struct tavil_priv *tavil; - struct wcd9xxx *core; - struct wcd9xxx_codec_dai_data *dai_data = NULL; - - tavil = snd_soc_codec_get_drvdata(dai->codec); - core = dev_get_drvdata(dai->codec->dev->parent); - - if (!tx_slot || !rx_slot) { - dev_err(tavil->dev, "%s: Invalid tx_slot 0x%pK, rx_slot 0x%pK\n", - __func__, tx_slot, rx_slot); - return -EINVAL; - } - dev_dbg(tavil->dev, "%s(): dai_name = %s DAI-ID %x tx_ch %d rx_ch %d\n", - __func__, dai->name, dai->id, tx_num, rx_num); - - wcd9xxx_init_slimslave(core, core->slim->laddr, - tx_num, tx_slot, rx_num, rx_slot); - /* Reserve TX13 for MAD data channel */ - dai_data = &tavil->dai[AIF4_MAD_TX]; - if (dai_data) - list_add_tail(&core->tx_chs[WCD934X_TX13].list, - &dai_data->wcd9xxx_ch_list); - - return 0; -} - -static int tavil_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - return 0; -} - -static void tavil_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); -} - -static int tavil_set_decimator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - u32 tx_port = 0, tx_fs_rate = 0; - u8 shift = 0, shift_val = 0, tx_mux_sel = 0; - int decimator = -1; - u16 tx_port_reg = 0, tx_fs_reg = 0; - - switch (sample_rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - default: - dev_err(tavil->dev, "%s: Invalid TX sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - - }; - - list_for_each_entry(ch, &tavil->dai[dai->id].wcd9xxx_ch_list, list) { - tx_port = ch->port; - dev_dbg(codec->dev, "%s: dai->id = %d, tx_port = %d", - __func__, dai->id, tx_port); - - if ((tx_port < 0) || (tx_port == 12) || (tx_port >= 14)) { - dev_err(codec->dev, "%s: Invalid SLIM TX%u port. DAI ID: %d\n", - __func__, tx_port, dai->id); - return -EINVAL; - } - /* Find the SB TX MUX input - which decimator is connected */ - if (tx_port < 4) { - tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0; - shift = (tx_port << 1); - shift_val = 0x03; - } else if ((tx_port >= 4) && (tx_port < 8)) { - tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1; - shift = ((tx_port - 4) << 1); - shift_val = 0x03; - } else if ((tx_port >= 8) && (tx_port < 11)) { - tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2; - shift = ((tx_port - 8) << 1); - shift_val = 0x03; - } else if (tx_port == 11) { - tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3; - shift = 0; - shift_val = 0x0F; - } else if (tx_port == 13) { - tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3; - shift = 4; - shift_val = 0x03; - } - tx_mux_sel = snd_soc_read(codec, tx_port_reg) & - (shift_val << shift); - tx_mux_sel = tx_mux_sel >> shift; - - if (tx_port <= 8) { - if ((tx_mux_sel == 0x2) || (tx_mux_sel == 0x3)) - decimator = tx_port; - } else if (tx_port <= 10) { - if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) - decimator = ((tx_port == 9) ? 7 : 6); - } else if (tx_port == 11) { - if ((tx_mux_sel >= 1) && (tx_mux_sel < 7)) - decimator = tx_mux_sel - 1; - } else if (tx_port == 13) { - if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) - decimator = 5; - } - - if (decimator >= 0) { - tx_fs_reg = WCD934X_CDC_TX0_TX_PATH_CTL + - 16 * decimator; - dev_dbg(codec->dev, "%s: set DEC%u (-> SLIM_TX%u) rate to %u\n", - __func__, decimator, tx_port, sample_rate); - snd_soc_update_bits(codec, tx_fs_reg, 0x0F, tx_fs_rate); - } else if ((tx_port <= 8) && (tx_mux_sel == 0x01)) { - /* Check if the TX Mux input is RX MIX TXn */ - dev_dbg(codec->dev, "%s: RX_MIX_TX%u going to CDC_IF TX%u\n", - __func__, tx_port, tx_port); - } else { - dev_err(codec->dev, "%s: ERROR: Invalid decimator: %d\n", - __func__, decimator); - return -EINVAL; - } - } - return 0; -} - -static int tavil_set_mix_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_2_inp; - u32 j; - u16 int_mux_cfg1, int_fs_reg; - u8 int_mux_cfg1_val; - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - list_for_each_entry(ch, &tavil->dai[dai->id].wcd9xxx_ch_list, list) { - int_2_inp = INTn_2_INP_SEL_RX0 + ch->port - - WCD934X_RX_PORT_START_NUMBER; - if ((int_2_inp < INTn_2_INP_SEL_RX0) || - (int_2_inp > INTn_2_INP_SEL_RX7)) { - dev_err(codec->dev, "%s: Invalid RX%u port, Dai ID is %d\n", - __func__, - (ch->port - WCD934X_RX_PORT_START_NUMBER), - dai->id); - return -EINVAL; - } - - int_mux_cfg1 = WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1; - for (j = 0; j < WCD934X_NUM_INTERPOLATORS; j++) { - /* Interpolators 5 and 6 are not aviliable in Tavil */ - if (j == INTERP_LO3_NA || j == INTERP_LO4_NA) { - int_mux_cfg1 += 2; - continue; - } - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) & - 0x0F; - if (int_mux_cfg1_val == int_2_inp) { - /* - * Ear mix path supports only 48, 96, 192, - * 384KHz only - */ - if ((j == INTERP_EAR) && - (rate_reg_val < 0x4 || - rate_reg_val > 0x7)) { - dev_err_ratelimited(codec->dev, - "%s: Invalid rate for AIF_PB DAI(%d)\n", - __func__, dai->id); - return -EINVAL; - } - - int_fs_reg = WCD934X_CDC_RX0_RX_PATH_MIX_CTL + - 20 * j; - dev_dbg(codec->dev, "%s: AIF_PB DAI(%d) connected to INT%u_2\n", - __func__, dai->id, j); - dev_dbg(codec->dev, "%s: set INT%u_2 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, 0x0F, - rate_reg_val); - } - int_mux_cfg1 += 2; - } - } - return 0; -} - -static int tavil_set_prim_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_1_mix1_inp; - u32 j; - u16 int_mux_cfg0, int_mux_cfg1; - u16 int_fs_reg; - u8 int_mux_cfg0_val, int_mux_cfg1_val; - u8 inp0_sel, inp1_sel, inp2_sel; - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - struct tavil_dsd_config *dsd_conf = tavil->dsd_config; - - list_for_each_entry(ch, &tavil->dai[dai->id].wcd9xxx_ch_list, list) { - int_1_mix1_inp = INTn_1_INP_SEL_RX0 + ch->port - - WCD934X_RX_PORT_START_NUMBER; - if ((int_1_mix1_inp < INTn_1_INP_SEL_RX0) || - (int_1_mix1_inp > INTn_1_INP_SEL_RX7)) { - dev_err(codec->dev, "%s: Invalid RX%u port, Dai ID is %d\n", - __func__, - (ch->port - WCD934X_RX_PORT_START_NUMBER), - dai->id); - return -EINVAL; - } - - int_mux_cfg0 = WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0; - - /* - * Loop through all interpolator MUX inputs and find out - * to which interpolator input, the slim rx port - * is connected - */ - for (j = 0; j < WCD934X_NUM_INTERPOLATORS; j++) { - /* Interpolators 5 and 6 are not aviliable in Tavil */ - if (j == INTERP_LO3_NA || j == INTERP_LO4_NA) { - int_mux_cfg0 += 2; - continue; - } - int_mux_cfg1 = int_mux_cfg0 + 1; - - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - inp0_sel = int_mux_cfg0_val & 0x0F; - inp1_sel = (int_mux_cfg0_val >> 4) & 0x0F; - inp2_sel = (int_mux_cfg1_val >> 4) & 0x0F; - if ((inp0_sel == int_1_mix1_inp) || - (inp1_sel == int_1_mix1_inp) || - (inp2_sel == int_1_mix1_inp)) { - /* - * Ear and speaker primary path does not support - * native sample rates - */ - if ((j == INTERP_EAR || j == INTERP_SPKR1 || - j == INTERP_SPKR2) && - (rate_reg_val > 0x7)) { - dev_err_ratelimited(codec->dev, - "%s: Invalid rate for AIF_PB DAI(%d)\n", - __func__, dai->id); - return -EINVAL; - } - - int_fs_reg = WCD934X_CDC_RX0_RX_PATH_CTL + - 20 * j; - dev_dbg(codec->dev, - "%s: AIF_PB DAI(%d) connected to INT%u_1\n", - __func__, dai->id, j); - dev_dbg(codec->dev, - "%s: set INT%u_1 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, 0x0F, - rate_reg_val); - } - int_mux_cfg0 += 2; - } - if (dsd_conf) - tavil_dsd_set_interp_rate(dsd_conf, ch->port, - sample_rate, rate_reg_val); - } - - return 0; -} - - -static int tavil_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - int rate_val = 0; - int i, ret; - - for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) { - if (sample_rate == sr_val_tbl[i].sample_rate) { - rate_val = sr_val_tbl[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) { - dev_err(codec->dev, "%s: Unsupported sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - } - - ret = tavil_set_prim_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - ret = tavil_set_mix_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - - return ret; -} - -static int tavil_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - return 0; -} - -static int tavil_vi_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(dai->codec); - - dev_dbg(tavil->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params)); - - tavil->dai[dai->id].rate = params_rate(params); - tavil->dai[dai->id].bit_width = 32; - - return 0; -} - -static int tavil_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(dai->codec); - int ret = 0; - - dev_dbg(tavil->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = tavil_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - dev_err(tavil->dev, "%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - switch (params_width(params)) { - case 16: - tavil->dai[dai->id].bit_width = 16; - break; - case 24: - tavil->dai[dai->id].bit_width = 24; - break; - case 32: - tavil->dai[dai->id].bit_width = 32; - break; - default: - return -EINVAL; - } - tavil->dai[dai->id].rate = params_rate(params); - break; - case SNDRV_PCM_STREAM_CAPTURE: - if (dai->id != AIF4_MAD_TX) - ret = tavil_set_decimator_rate(dai, - params_rate(params)); - if (ret) { - dev_err(tavil->dev, "%s: cannot set TX Decimator rate: %d\n", - __func__, ret); - return ret; - } - switch (params_width(params)) { - case 16: - tavil->dai[dai->id].bit_width = 16; - break; - case 24: - tavil->dai[dai->id].bit_width = 24; - break; - default: - dev_err(tavil->dev, "%s: Invalid format 0x%x\n", - __func__, params_width(params)); - return -EINVAL; - }; - tavil->dai[dai->id].rate = params_rate(params); - break; - default: - dev_err(tavil->dev, "%s: Invalid stream type %d\n", __func__, - substream->stream); - return -EINVAL; - }; - - return 0; -} - -static int tavil_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - u32 i2s_reg; - - switch (dai->id) { - case AIF1_PB: - case AIF1_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_0_CTL; - break; - case AIF2_PB: - case AIF2_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_1_CTL; - break; - case AIF3_PB: - case AIF3_CAP: - i2s_reg = WCD934X_DATA_HUB_I2S_2_CTL; - break; - default: - dev_err(dai->codec->dev, "%s Invalid i2s Id", __func__); - return -EINVAL; - } - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - /* CPU is master */ - snd_soc_update_bits(dai->codec, i2s_reg, 0x2, 0x0); - break; - case SND_SOC_DAIFMT_CBM_CFM: - /* CPU is slave */ - snd_soc_update_bits(dai->codec, i2s_reg, 0x2, 0x2); - break; - default: - return -EINVAL; - } - return 0; -} - -static struct snd_soc_dai_ops tavil_dai_ops = { - .startup = tavil_startup, - .shutdown = tavil_shutdown, - .hw_params = tavil_hw_params, - .prepare = tavil_prepare, - .set_channel_map = tavil_set_channel_map, - .get_channel_map = tavil_get_channel_map, -}; - -static struct snd_soc_dai_ops tavil_i2s_dai_ops = { - .startup = tavil_startup, - .shutdown = tavil_shutdown, - .hw_params = tavil_hw_params, - .prepare = tavil_prepare, - .set_fmt = tavil_set_dai_fmt, -}; - -static struct snd_soc_dai_ops tavil_vi_dai_ops = { - .hw_params = tavil_vi_hw_params, - .set_channel_map = tavil_set_channel_map, - .get_channel_map = tavil_get_channel_map, -}; - -static struct snd_soc_dai_driver tavil_slim_dai[] = { - { - .name = "tavil_rx1", - .id = AIF1_PB, - .playback = { - .stream_name = "AIF1 Playback", - .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_dai_ops, - }, - { - .name = "tavil_tx1", - .id = AIF1_CAP, - .capture = { - .stream_name = "AIF1 Capture", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tavil_dai_ops, - }, - { - .name = "tavil_rx2", - .id = AIF2_PB, - .playback = { - .stream_name = "AIF2 Playback", - .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_dai_ops, - }, - { - .name = "tavil_tx2", - .id = AIF2_CAP, - .capture = { - .stream_name = "AIF2 Capture", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tavil_dai_ops, - }, - { - .name = "tavil_rx3", - .id = AIF3_PB, - .playback = { - .stream_name = "AIF3 Playback", - .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_dai_ops, - }, - { - .name = "tavil_tx3", - .id = AIF3_CAP, - .capture = { - .stream_name = "AIF3 Capture", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tavil_dai_ops, - }, - { - .name = "tavil_rx4", - .id = AIF4_PB, - .playback = { - .stream_name = "AIF4 Playback", - .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_dai_ops, - }, - { - .name = "tavil_vifeedback", - .id = AIF4_VIFEED, - .capture = { - .stream_name = "VIfeed", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &tavil_vi_dai_ops, - }, - { - .name = "tavil_mad1", - .id = AIF4_MAD_TX, - .capture = { - .stream_name = "AIF4 MAD TX", - .rates = SNDRV_PCM_RATE_16000, - .formats = WCD934X_FORMATS_S16_LE, - .rate_min = 16000, - .rate_max = 16000, - .channels_min = 1, - .channels_max = 1, - }, - .ops = &tavil_dai_ops, - }, -}; - -static struct snd_soc_dai_driver tavil_i2s_dai[] = { - { - .name = "tavil_i2s_rx1", - .id = AIF1_PB, - .playback = { - .stream_name = "AIF1 Playback", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_i2s_dai_ops, - }, - { - .name = "tavil_i2s_tx1", - .id = AIF1_CAP, - .capture = { - .stream_name = "AIF1 Capture", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_i2s_dai_ops, - }, - { - .name = "tavil_i2s_rx2", - .id = AIF2_PB, - .playback = { - .stream_name = "AIF2 Playback", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_i2s_dai_ops, - }, - { - .name = "tavil_i2s_tx2", - .id = AIF2_CAP, - .capture = { - .stream_name = "AIF2 Capture", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_i2s_dai_ops, - }, - { - .name = "tavil_i2s_rx3", - .id = AIF3_PB, - .playback = { - .stream_name = "AIF3 Playback", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_i2s_dai_ops, - }, - { - .name = "tavil_i2s_tx3", - .id = AIF3_CAP, - .capture = { - .stream_name = "AIF3 Capture", - .rates = WCD934X_RATES_MASK, - .formats = WCD934X_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &tavil_i2s_dai_ops, - }, -}; - -static void tavil_codec_power_gate_digital_core(struct tavil_priv *tavil) -{ - mutex_lock(&tavil->power_lock); - dev_dbg(tavil->dev, "%s: Entering power gating function, %d\n", - __func__, tavil->power_active_ref); - - if (tavil->power_active_ref > 0) - goto exit; - - wcd9xxx_set_power_state(tavil->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_BEGIN, - WCD9XXX_DIG_CORE_REGION_1); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x04, 0x04); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x01, 0x00); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x02, 0x00); - wcd9xxx_set_power_state(tavil->wcd9xxx, WCD_REGION_POWER_DOWN, - WCD9XXX_DIG_CORE_REGION_1); -exit: - dev_dbg(tavil->dev, "%s: Exiting power gating function, %d\n", - __func__, tavil->power_active_ref); - mutex_unlock(&tavil->power_lock); -} - -static void tavil_codec_power_gate_work(struct work_struct *work) -{ - struct tavil_priv *tavil; - struct delayed_work *dwork; - - dwork = to_delayed_work(work); - tavil = container_of(dwork, struct tavil_priv, power_gate_work); - - tavil_codec_power_gate_digital_core(tavil); -} - -/* called under power_lock acquisition */ -static int tavil_dig_core_remove_power_collapse(struct tavil_priv *tavil) -{ - regmap_write(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x05); - regmap_write(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x07); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_RST_CTL, 0x02, 0x00); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_RST_CTL, 0x02, 0x02); - regmap_write(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x03); - - wcd9xxx_set_power_state(tavil->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - regcache_mark_dirty(tavil->wcd9xxx->regmap); - regcache_sync_region(tavil->wcd9xxx->regmap, - WCD934X_DIG_CORE_REG_MIN, - WCD934X_DIG_CORE_REG_MAX); - - return 0; -} - -static int tavil_dig_core_power_collapse(struct tavil_priv *tavil, - int req_state) -{ - int cur_state; - - /* Exit if feature is disabled */ - if (!dig_core_collapse_enable) - return 0; - - mutex_lock(&tavil->power_lock); - if (req_state == POWER_COLLAPSE) - tavil->power_active_ref--; - else if (req_state == POWER_RESUME) - tavil->power_active_ref++; - else - goto unlock_mutex; - - if (tavil->power_active_ref < 0) { - dev_dbg(tavil->dev, - "%s: power_active_ref is negative, reset it\n", - __func__); - tavil->power_active_ref = 0; - goto unlock_mutex; - } - - if (req_state == POWER_COLLAPSE) { - if (tavil->power_active_ref == 0) { - schedule_delayed_work(&tavil->power_gate_work, - msecs_to_jiffies(dig_core_collapse_timer * 1000)); - } - } else if (req_state == POWER_RESUME) { - if (tavil->power_active_ref == 1) { - /* - * At this point, there can be two cases: - * 1. Core already in power collapse state - * 2. Timer kicked in and still did not expire or - * waiting for the power_lock - */ - cur_state = wcd9xxx_get_current_power_state( - tavil->wcd9xxx, - WCD9XXX_DIG_CORE_REGION_1); - if (cur_state == WCD_REGION_POWER_DOWN) { - tavil_dig_core_remove_power_collapse(tavil); - } else { - mutex_unlock(&tavil->power_lock); - cancel_delayed_work_sync( - &tavil->power_gate_work); - mutex_lock(&tavil->power_lock); - } - } - } - -unlock_mutex: - mutex_unlock(&tavil->power_lock); - - return 0; -} - -static int tavil_cdc_req_mclk_enable(struct tavil_priv *tavil, - bool enable) -{ - int ret = 0; - - if (enable) { - ret = clk_prepare_enable(tavil->wcd_ext_clk); - if (ret) { - dev_err(tavil->dev, "%s: ext clk enable failed\n", - __func__); - goto done; - } - /* get BG */ - wcd_resmgr_enable_master_bias(tavil->resmgr); - /* get MCLK */ - wcd_resmgr_enable_clk_block(tavil->resmgr, WCD_CLK_MCLK); - } else { - /* put MCLK */ - wcd_resmgr_disable_clk_block(tavil->resmgr, WCD_CLK_MCLK); - /* put BG */ - wcd_resmgr_disable_master_bias(tavil->resmgr); - clk_disable_unprepare(tavil->wcd_ext_clk); - } - -done: - return ret; -} - -static int __tavil_cdc_mclk_enable_locked(struct tavil_priv *tavil, - bool enable) -{ - int ret = 0; - - if (!tavil->wcd_ext_clk) { - dev_err(tavil->dev, "%s: wcd ext clock is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(tavil->dev, "%s: mclk_enable = %u\n", __func__, enable); - - if (enable) { - tavil_dig_core_power_collapse(tavil, POWER_RESUME); - tavil_vote_svs(tavil, true); - ret = tavil_cdc_req_mclk_enable(tavil, true); - if (ret) - goto done; - } else { - tavil_cdc_req_mclk_enable(tavil, false); - tavil_vote_svs(tavil, false); - tavil_dig_core_power_collapse(tavil, POWER_COLLAPSE); - } - -done: - return ret; -} - -static int __tavil_cdc_mclk_enable(struct tavil_priv *tavil, - bool enable) -{ - int ret; - - WCD9XXX_V2_BG_CLK_LOCK(tavil->resmgr); - ret = __tavil_cdc_mclk_enable_locked(tavil, enable); - if (enable) - wcd_resmgr_set_sido_input_src(tavil->resmgr, - SIDO_SOURCE_RCO_BG); - WCD9XXX_V2_BG_CLK_UNLOCK(tavil->resmgr); - - return ret; -} - -static ssize_t tavil_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct tavil_priv *tavil; - struct wcd9xxx *wcd9xxx; - char buffer[TAVIL_VERSION_ENTRY_SIZE]; - int len = 0; - - tavil = (struct tavil_priv *) entry->private_data; - if (!tavil) { - pr_err("%s: tavil priv is null\n", __func__); - return -EINVAL; - } - - wcd9xxx = tavil->wcd9xxx; - - switch (wcd9xxx->version) { - case TAVIL_VERSION_WCD9340_1_0: - len = snprintf(buffer, sizeof(buffer), "WCD9340_1_0\n"); - break; - case TAVIL_VERSION_WCD9341_1_0: - len = snprintf(buffer, sizeof(buffer), "WCD9341_1_0\n"); - break; - case TAVIL_VERSION_WCD9340_1_1: - len = snprintf(buffer, sizeof(buffer), "WCD9340_1_1\n"); - break; - case TAVIL_VERSION_WCD9341_1_1: - len = snprintf(buffer, sizeof(buffer), "WCD9341_1_1\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops tavil_codec_info_ops = { - .read = tavil_codec_version_read, -}; - -/* - * tavil_codec_info_create_codec_entry - creates wcd934x module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates wcd934x module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int tavil_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct tavil_priv *tavil; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - tavil = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - tavil->entry = snd_info_create_subdir(codec_root->module, - "tavil", codec_root); - if (!tavil->entry) { - dev_dbg(codec->dev, "%s: failed to create wcd934x entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - tavil->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd934x version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = tavil; - version_entry->size = TAVIL_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &tavil_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - tavil->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(tavil_codec_info_create_codec_entry); - -/** - * tavil_cdc_mclk_enable - Enable/disable codec mclk - * - * @codec: codec instance - * @enable: Indicates clk enable or disable - * - * Returns 0 on Success and error on failure - */ -int tavil_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - return __tavil_cdc_mclk_enable(tavil, enable); -} -EXPORT_SYMBOL(tavil_cdc_mclk_enable); - -static int __tavil_codec_internal_rco_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - if (enable) { - if (wcd_resmgr_get_clk_type(tavil->resmgr) == - WCD_CLK_RCO) { - ret = wcd_resmgr_enable_clk_block(tavil->resmgr, - WCD_CLK_RCO); - } else { - ret = tavil_cdc_req_mclk_enable(tavil, true); - if (ret) { - dev_err(codec->dev, - "%s: mclk_enable failed, err = %d\n", - __func__, ret); - goto done; - } - wcd_resmgr_set_sido_input_src(tavil->resmgr, - SIDO_SOURCE_RCO_BG); - ret = wcd_resmgr_enable_clk_block(tavil->resmgr, - WCD_CLK_RCO); - ret |= tavil_cdc_req_mclk_enable(tavil, false); - } - - } else { - ret = wcd_resmgr_disable_clk_block(tavil->resmgr, - WCD_CLK_RCO); - } - - if (ret) { - dev_err(codec->dev, "%s: Error in %s RCO\n", - __func__, (enable ? "enabling" : "disabling")); - ret = -EINVAL; - } - -done: - return ret; -} - -/* - * tavil_codec_internal_rco_ctrl: Enable/Disable codec's RCO clock - * @codec: Handle to the codec - * @enable: Indicates whether clock should be enabled or disabled - */ -static int tavil_codec_internal_rco_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - WCD9XXX_V2_BG_CLK_LOCK(tavil->resmgr); - ret = __tavil_codec_internal_rco_ctrl(codec, enable); - WCD9XXX_V2_BG_CLK_UNLOCK(tavil->resmgr); - return ret; -} - -/* - * tavil_cdc_mclk_tx_enable: Enable/Disable codec's clock for TX path - * @codec: Handle to codec - * @enable: Indicates whether clock should be enabled or disabled - */ -int tavil_cdc_mclk_tx_enable(struct snd_soc_codec *codec, bool enable) -{ - struct tavil_priv *tavil_p; - int ret = 0; - bool clk_mode; - bool clk_internal; - - if (!codec) - return -EINVAL; - - tavil_p = snd_soc_codec_get_drvdata(codec); - clk_mode = test_bit(CLK_MODE, &tavil_p->status_mask); - clk_internal = test_bit(CLK_INTERNAL, &tavil_p->status_mask); - - dev_dbg(codec->dev, "%s: clkmode: %d, enable: %d, clk_internal: %d\n", - __func__, clk_mode, enable, clk_internal); - - if (clk_mode || clk_internal) { - if (enable) { - wcd_resmgr_enable_master_bias(tavil_p->resmgr); - tavil_dig_core_power_collapse(tavil_p, POWER_RESUME); - tavil_vote_svs(tavil_p, true); - ret = tavil_codec_internal_rco_ctrl(codec, enable); - set_bit(CLK_INTERNAL, &tavil_p->status_mask); - } else { - clear_bit(CLK_INTERNAL, &tavil_p->status_mask); - tavil_codec_internal_rco_ctrl(codec, enable); - tavil_vote_svs(tavil_p, false); - tavil_dig_core_power_collapse(tavil_p, POWER_COLLAPSE); - wcd_resmgr_disable_master_bias(tavil_p->resmgr); - } - } else { - ret = __tavil_cdc_mclk_enable(tavil_p, enable); - } - - return ret; -} -EXPORT_SYMBOL(tavil_cdc_mclk_tx_enable); - -static const struct wcd_resmgr_cb tavil_resmgr_cb = { - .cdc_rco_ctrl = __tavil_codec_internal_rco_ctrl, -}; - -static const struct tavil_reg_mask_val tavil_codec_mclk2_1_1_defaults[] = { - {WCD934X_CLK_SYS_MCLK2_PRG1, 0x60, 0x20}, -}; - -static const struct tavil_reg_mask_val tavil_codec_mclk2_1_0_defaults[] = { - /* - * PLL Settings: - * Clock Root: MCLK2, - * Clock Source: EXT_CLK, - * Clock Destination: MCLK2 - * Clock Freq In: 19.2MHz, - * Clock Freq Out: 11.2896MHz - */ - {WCD934X_CLK_SYS_MCLK2_PRG1, 0x60, 0x20}, - {WCD934X_CLK_SYS_INT_POST_DIV_REG0, 0xFF, 0x5E}, - {WCD934X_CLK_SYS_INT_POST_DIV_REG1, 0x1F, 0x1F}, - {WCD934X_CLK_SYS_INT_REF_DIV_REG0, 0xFF, 0x54}, - {WCD934X_CLK_SYS_INT_REF_DIV_REG1, 0xFF, 0x01}, - {WCD934X_CLK_SYS_INT_FILTER_REG1, 0x07, 0x04}, - {WCD934X_CLK_SYS_INT_PLL_L_VAL, 0xFF, 0x93}, - {WCD934X_CLK_SYS_INT_PLL_N_VAL, 0xFF, 0xFA}, - {WCD934X_CLK_SYS_INT_TEST_REG0, 0xFF, 0x90}, - {WCD934X_CLK_SYS_INT_PFD_CP_DSM_PROG, 0xFF, 0x7E}, - {WCD934X_CLK_SYS_INT_VCO_PROG, 0xFF, 0xF8}, - {WCD934X_CLK_SYS_INT_TEST_REG1, 0xFF, 0x68}, - {WCD934X_CLK_SYS_INT_LDO_LOCK_CFG, 0xFF, 0x40}, - {WCD934X_CLK_SYS_INT_DIG_LOCK_DET_CFG, 0xFF, 0x32}, -}; - -static const struct tavil_reg_mask_val tavil_codec_reg_defaults[] = { - {WCD934X_BIAS_VBG_FINE_ADJ, 0xFF, 0x75}, - {WCD934X_CODEC_CPR_SVS_CX_VDD, 0xFF, 0x7C}, /* value in svs mode */ - {WCD934X_CODEC_CPR_SVS2_CX_VDD, 0xFF, 0x58}, /* value in svs2 mode */ - {WCD934X_CDC_RX0_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD934X_CDC_RX1_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD934X_CDC_RX2_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD934X_CDC_RX3_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD934X_CDC_RX4_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD934X_CDC_RX7_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD934X_CDC_RX8_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD934X_CDC_COMPANDER8_CTL7, 0x1E, 0x18}, - {WCD934X_CDC_COMPANDER7_CTL7, 0x1E, 0x18}, - {WCD934X_CDC_RX0_RX_PATH_SEC0, 0x08, 0x0}, - {WCD934X_CDC_CLSH_DECAY_CTRL, 0x03, 0x0}, - {WCD934X_MICB1_TEST_CTL_2, 0x07, 0x01}, - {WCD934X_CDC_BOOST0_BOOST_CFG1, 0x3F, 0x12}, - {WCD934X_CDC_BOOST0_BOOST_CFG2, 0x1C, 0x08}, - {WCD934X_CDC_BOOST1_BOOST_CFG1, 0x3F, 0x12}, - {WCD934X_CDC_BOOST1_BOOST_CFG2, 0x1C, 0x08}, - {WCD934X_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 0x1F, 0x09}, - {WCD934X_CDC_TX0_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX1_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX2_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX3_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX4_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX5_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX6_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX7_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_CDC_TX8_TX_PATH_CFG1, 0x01, 0x00}, - {WCD934X_RX_OCP_CTL, 0x0F, 0x02}, /* OCP number of attempts is 2 */ - {WCD934X_HPH_OCP_CTL, 0xFF, 0x3A}, /* OCP current limit */ - {WCD934X_HPH_L_TEST, 0x01, 0x01}, - {WCD934X_HPH_R_TEST, 0x01, 0x01}, - {WCD934X_CPE_FLL_CONFIG_CTL_2, 0xFF, 0x20}, - {WCD934X_MBHC_NEW_CTL_2, 0x0C, 0x00}, - {WCD934X_CODEC_RPM_CLK_MCLK_CFG, 0x04, 0x04}, -}; - -static const struct tavil_reg_mask_val tavil_codec_reg_init_1_1_val[] = { - {WCD934X_CDC_COMPANDER1_CTL7, 0x1E, 0x06}, - {WCD934X_CDC_COMPANDER2_CTL7, 0x1E, 0x06}, - {WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0xFF, 0x84}, - {WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0xFF, 0x84}, - {WCD934X_CDC_RX3_RX_PATH_SEC0, 0xFC, 0xF4}, - {WCD934X_CDC_RX4_RX_PATH_SEC0, 0xFC, 0xF4}, -}; - -static const struct tavil_cpr_reg_defaults cpr_defaults[] = { - { 0x00000820, 0x00000094 }, - { 0x00000fC0, 0x00000048 }, - { 0x0000f000, 0x00000044 }, - { 0x0000bb80, 0xC0000178 }, - { 0x00000000, 0x00000160 }, - { 0x10854522, 0x00000060 }, - { 0x10854509, 0x00000064 }, - { 0x108544dd, 0x00000068 }, - { 0x108544ad, 0x0000006C }, - { 0x0000077E, 0x00000070 }, - { 0x000007da, 0x00000074 }, - { 0x00000000, 0x00000078 }, - { 0x00000000, 0x0000007C }, - { 0x00042029, 0x00000080 }, - { 0x4002002A, 0x00000090 }, - { 0x4002002B, 0x00000090 }, -}; - -static const struct tavil_reg_mask_val tavil_codec_reg_init_common_val[] = { - {WCD934X_CDC_CLSH_K2_MSB, 0x0F, 0x00}, - {WCD934X_CDC_CLSH_K2_LSB, 0xFF, 0x60}, - {WCD934X_CPE_SS_DMIC_CFG, 0x80, 0x00}, - {WCD934X_CDC_BOOST0_BOOST_CTL, 0x7C, 0x58}, - {WCD934X_CDC_BOOST1_BOOST_CTL, 0x7C, 0x58}, - {WCD934X_CDC_RX7_RX_PATH_CFG1, 0x08, 0x08}, - {WCD934X_CDC_RX8_RX_PATH_CFG1, 0x08, 0x08}, - {WCD934X_CDC_TOP_TOP_CFG1, 0x02, 0x02}, - {WCD934X_CDC_TOP_TOP_CFG1, 0x01, 0x01}, - {WCD934X_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD934X_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD934X_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD934X_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD934X_DATA_HUB_SB_TX11_INP_CFG, 0x01, 0x01}, - {WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, 0x01, 0x01}, - {WCD934X_CDC_COMPANDER7_CTL3, 0x80, 0x80}, - {WCD934X_CDC_COMPANDER8_CTL3, 0x80, 0x80}, - {WCD934X_CDC_COMPANDER7_CTL7, 0x01, 0x01}, - {WCD934X_CDC_COMPANDER8_CTL7, 0x01, 0x01}, - {WCD934X_CODEC_RPM_CLK_GATE, 0x08, 0x00}, - {WCD934X_TLMM_DMIC3_CLK_PINCFG, 0xFF, 0x0a}, - {WCD934X_TLMM_DMIC3_DATA_PINCFG, 0xFF, 0x0a}, - {WCD934X_CPE_SS_SVA_CFG, 0x60, 0x00}, - {WCD934X_CPE_SS_CPAR_CFG, 0x10, 0x10}, - {WCD934X_MICB1_TEST_CTL_1, 0xff, 0xfa}, - {WCD934X_MICB2_TEST_CTL_1, 0xff, 0xfa}, - {WCD934X_MICB3_TEST_CTL_1, 0xff, 0xfa}, - {WCD934X_MICB4_TEST_CTL_1, 0xff, 0xfa}, -}; - -static void tavil_codec_init_reg(struct tavil_priv *priv) -{ - struct snd_soc_codec *codec = priv->codec; - u32 i; - - for (i = 0; i < ARRAY_SIZE(tavil_codec_reg_init_common_val); i++) - snd_soc_update_bits(codec, - tavil_codec_reg_init_common_val[i].reg, - tavil_codec_reg_init_common_val[i].mask, - tavil_codec_reg_init_common_val[i].val); - - if (TAVIL_IS_1_1(priv->wcd9xxx)) { - for (i = 0; i < ARRAY_SIZE(tavil_codec_reg_init_1_1_val); i++) - snd_soc_update_bits(codec, - tavil_codec_reg_init_1_1_val[i].reg, - tavil_codec_reg_init_1_1_val[i].mask, - tavil_codec_reg_init_1_1_val[i].val); - } -} - -static const struct tavil_reg_mask_val tavil_codec_reg_i2c_defaults[] = { - {WCD934X_CLK_SYS_MCLK_PRG, 0x40, 0x00}, - {WCD934X_CODEC_RPM_CLK_GATE, 0x03, 0x01}, - {WCD934X_CODEC_RPM_CLK_MCLK_CFG, 0x03, 0x00}, - {WCD934X_CODEC_RPM_CLK_MCLK_CFG, 0x05, 0x05}, - {WCD934X_DATA_HUB_RX0_CFG, 0x71, 0x31}, - {WCD934X_DATA_HUB_RX1_CFG, 0x71, 0x31}, - {WCD934X_DATA_HUB_RX2_CFG, 0x03, 0x01}, - {WCD934X_DATA_HUB_RX3_CFG, 0x03, 0x01}, - {WCD934X_DATA_HUB_I2S_TX0_CFG, 0x01, 0x01}, - {WCD934X_DATA_HUB_I2S_TX0_CFG, 0x04, 0x01}, - {WCD934X_DATA_HUB_I2S_TX1_0_CFG, 0x01, 0x01}, - {WCD934X_DATA_HUB_I2S_TX1_1_CFG, 0x05, 0x05}, - {WCD934X_CHIP_TIER_CTRL_ALT_FUNC_EN, 0x1, 0x1}, -}; - -static void tavil_update_reg_defaults(struct tavil_priv *tavil) -{ - u32 i; - struct wcd9xxx *wcd9xxx; - - wcd9xxx = tavil->wcd9xxx; - for (i = 0; i < ARRAY_SIZE(tavil_codec_reg_defaults); i++) - regmap_update_bits(wcd9xxx->regmap, - tavil_codec_reg_defaults[i].reg, - tavil_codec_reg_defaults[i].mask, - tavil_codec_reg_defaults[i].val); - - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - for (i = 0; i < ARRAY_SIZE(tavil_codec_reg_i2c_defaults); i++) { - regmap_update_bits(wcd9xxx->regmap, - tavil_codec_reg_i2c_defaults[i].reg, - tavil_codec_reg_i2c_defaults[i].mask, - tavil_codec_reg_i2c_defaults[i].val); - } - } -} - -static void tavil_update_cpr_defaults(struct tavil_priv *tavil) -{ - int i; - struct wcd9xxx *wcd9xxx; - - wcd9xxx = tavil->wcd9xxx; - if (!TAVIL_IS_1_1(wcd9xxx)) - return; - - __tavil_cdc_mclk_enable(tavil, true); - - regmap_write(wcd9xxx->regmap, WCD934X_CODEC_CPR_SVS2_MIN_CX_VDD, 0x2C); - regmap_update_bits(wcd9xxx->regmap, WCD934X_CODEC_RPM_CLK_GATE, - 0x10, 0x00); - - for (i = 0; i < ARRAY_SIZE(cpr_defaults); i++) { - regmap_bulk_write(wcd9xxx->regmap, - WCD934X_CODEC_CPR_WR_DATA_0, - (u8 *)&cpr_defaults[i].wr_data, 4); - regmap_bulk_write(wcd9xxx->regmap, - WCD934X_CODEC_CPR_WR_ADDR_0, - (u8 *)&cpr_defaults[i].wr_addr, 4); - } - - __tavil_cdc_mclk_enable(tavil, false); -} - -static void tavil_slim_interface_init_reg(struct snd_soc_codec *codec) -{ - int i; - struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); - - for (i = 0; i < WCD9XXX_SLIM_NUM_PORT_REG; i++) - wcd9xxx_interface_reg_write(priv->wcd9xxx, - WCD934X_SLIM_PGD_PORT_INT_RX_EN0 + i, - 0xFF); -} - -static irqreturn_t tavil_misc_irq(int irq, void *data) -{ - struct tavil_priv *tavil = data; - int misc_val; - - /* Find source of interrupt */ - regmap_read(tavil->wcd9xxx->regmap, WCD934X_INTR_CODEC_MISC_STATUS, - &misc_val); - - if (misc_val & 0x08) { - dev_info(tavil->dev, "%s: irq: %d, DSD DC detected!\n", - __func__, irq); - /* DSD DC interrupt, reset DSD path */ - tavil_dsd_reset(tavil->dsd_config); - } else { - dev_err(tavil->dev, "%s: Codec misc irq: %d, val: 0x%x\n", - __func__, irq, misc_val); - } - - /* Clear interrupt status */ - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_INTR_CODEC_MISC_CLEAR, misc_val, 0x00); - - return IRQ_HANDLED; -} - -static irqreturn_t tavil_slimbus_irq(int irq, void *data) -{ - struct tavil_priv *tavil = data; - unsigned long status = 0; - int i, j, port_id, k; - u32 bit; - u8 val, int_val = 0; - bool tx, cleared; - unsigned short reg = 0; - - for (i = WCD934X_SLIM_PGD_PORT_INT_STATUS_RX_0, j = 0; - i <= WCD934X_SLIM_PGD_PORT_INT_STATUS_TX_1; i++, j++) { - val = wcd9xxx_interface_reg_read(tavil->wcd9xxx, i); - status |= ((u32)val << (8 * j)); - } - - for_each_set_bit(j, &status, 32) { - tx = (j >= 16 ? true : false); - port_id = (tx ? j - 16 : j); - val = wcd9xxx_interface_reg_read(tavil->wcd9xxx, - WCD934X_SLIM_PGD_PORT_INT_RX_SOURCE0 + j); - if (val) { - if (!tx) - reg = WCD934X_SLIM_PGD_PORT_INT_RX_EN0 + - (port_id / 8); - else - reg = WCD934X_SLIM_PGD_PORT_INT_TX_EN0 + - (port_id / 8); - int_val = wcd9xxx_interface_reg_read( - tavil->wcd9xxx, reg); - /* - * Ignore interrupts for ports for which the - * interrupts are not specifically enabled. - */ - if (!(int_val & (1 << (port_id % 8)))) - continue; - } - if (val & WCD934X_SLIM_IRQ_OVERFLOW) - dev_err_ratelimited(tavil->dev, "%s: overflow error on %s port %d, value %x\n", - __func__, (tx ? "TX" : "RX"), port_id, val); - if (val & WCD934X_SLIM_IRQ_UNDERFLOW) - dev_err_ratelimited(tavil->dev, "%s: underflow error on %s port %d, value %x\n", - __func__, (tx ? "TX" : "RX"), port_id, val); - if (tx) { - /* inc count */ - if (val & WCD934X_SLIM_IRQ_OVERFLOW) { - tavil->slim_tx_of_uf_cnt[port_id] - [SB_PORT_ERR_OF]++; - dev_err_ratelimited(tavil->dev, "%s: tx port(%d) overflow cnt: %d\n", - __func__, port_id, - tavil->slim_tx_of_uf_cnt[port_id] - [SB_PORT_ERR_OF]); - } - if (val & WCD934X_SLIM_IRQ_UNDERFLOW) { - tavil->slim_tx_of_uf_cnt[port_id] - [SB_PORT_ERR_UF]++; - dev_err_ratelimited(tavil->dev, "%s: tx port(%d) underflow cnt: %d\n", - __func__, port_id, - tavil->slim_tx_of_uf_cnt[port_id] - [SB_PORT_ERR_UF]); - } - - } - - if ((val & WCD934X_SLIM_IRQ_OVERFLOW) || - (val & WCD934X_SLIM_IRQ_UNDERFLOW)) { - if (!tx) - reg = WCD934X_SLIM_PGD_PORT_INT_RX_EN0 + - (port_id / 8); - else if ((tavil->slim_tx_of_uf_cnt[port_id] - [SB_PORT_ERR_OF] > SB_OF_UF_MAX_RETRY_CNT) || - (tavil->slim_tx_of_uf_cnt[port_id] - [SB_PORT_ERR_UF] > SB_OF_UF_MAX_RETRY_CNT)) - reg = WCD934X_SLIM_PGD_PORT_INT_TX_EN0 + - (port_id / 8); - else - goto skip_port_disable; - int_val = wcd9xxx_interface_reg_read( - tavil->wcd9xxx, reg); - if (int_val & (1 << (port_id % 8))) { - int_val = int_val ^ (1 << (port_id % 8)); - wcd9xxx_interface_reg_write(tavil->wcd9xxx, - reg, int_val); - } - } -skip_port_disable: - if (val & WCD934X_SLIM_IRQ_PORT_CLOSED) { - /* - * INT SOURCE register starts from RX to TX - * but port number in the ch_mask is in opposite way - */ - bit = (tx ? j - 16 : j + 16); - dev_dbg(tavil->dev, "%s: %s port %d closed value %x, bit %u\n", - __func__, (tx ? "TX" : "RX"), port_id, val, - bit); - for (k = 0, cleared = false; k < NUM_CODEC_DAIS; k++) { - dev_dbg(tavil->dev, "%s: tavil->dai[%d].ch_mask = 0x%lx\n", - __func__, k, tavil->dai[k].ch_mask); - if (test_and_clear_bit(bit, - &tavil->dai[k].ch_mask)) { - cleared = true; - if (!tavil->dai[k].ch_mask) - wake_up( - &tavil->dai[k].dai_wait); - /* - * There are cases when multiple DAIs - * might be using the same slimbus - * channel. Hence don't break here. - */ - } - } - WARN(!cleared, - "Couldn't find slimbus %s port %d for closing\n", - (tx ? "TX" : "RX"), port_id); - } - wcd9xxx_interface_reg_write(tavil->wcd9xxx, - WCD934X_SLIM_PGD_PORT_INT_CLR_RX_0 + - (j / 8), - 1 << (j % 8)); - } - - return IRQ_HANDLED; -} - -static int tavil_setup_irqs(struct tavil_priv *tavil) -{ - int ret = 0; - struct snd_soc_codec *codec = tavil->codec; - struct wcd9xxx *wcd9xxx = tavil->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - ret = wcd9xxx_request_irq(core_res, WCD9XXX_IRQ_SLIMBUS, - tavil_slimbus_irq, "SLIMBUS Slave", tavil); - if (ret) - dev_err(codec->dev, "%s: Failed to request irq %d\n", __func__, - WCD9XXX_IRQ_SLIMBUS); - else - tavil_slim_interface_init_reg(codec); - - /* Register for misc interrupts as well */ - ret = wcd9xxx_request_irq(core_res, WCD934X_IRQ_MISC, - tavil_misc_irq, "CDC MISC Irq", tavil); - if (ret) - dev_err(codec->dev, "%s: Failed to request cdc misc irq\n", - __func__); - - return ret; -} - -static void tavil_init_slim_slave_cfg(struct snd_soc_codec *codec) -{ - struct tavil_priv *priv = snd_soc_codec_get_drvdata(codec); - struct afe_param_cdc_slimbus_slave_cfg *cfg; - struct wcd9xxx *wcd9xxx = priv->wcd9xxx; - uint64_t eaddr = 0; - - cfg = &priv->slimbus_slave_cfg; - cfg->minor_version = 1; - cfg->tx_slave_port_offset = 0; - cfg->rx_slave_port_offset = 16; - - memcpy(&eaddr, &wcd9xxx->slim->e_addr, sizeof(wcd9xxx->slim->e_addr)); - WARN_ON(sizeof(wcd9xxx->slim->e_addr) != 6); - cfg->device_enum_addr_lsw = eaddr & 0xFFFFFFFF; - cfg->device_enum_addr_msw = eaddr >> 32; - - dev_dbg(codec->dev, "%s: slimbus logical address 0x%llx\n", - __func__, eaddr); -} - -static void tavil_cleanup_irqs(struct tavil_priv *tavil) -{ - struct wcd9xxx *wcd9xxx = tavil->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - wcd9xxx_free_irq(core_res, WCD9XXX_IRQ_SLIMBUS, tavil); - wcd9xxx_free_irq(core_res, WCD934X_IRQ_MISC, tavil); -} - -/* - * wcd934x_get_micb_vout_ctl_val: converts micbias from volts to register value - * @micb_mv: micbias in mv - * - * return register value converted - */ -int wcd934x_get_micb_vout_ctl_val(u32 micb_mv) -{ - /* min micbias voltage is 1V and maximum is 2.85V */ - if (micb_mv < 1000 || micb_mv > 2850) { - pr_err("%s: unsupported micbias voltage\n", __func__); - return -EINVAL; - } - - return (micb_mv - 1000) / 50; -} -EXPORT_SYMBOL(wcd934x_get_micb_vout_ctl_val); - -static int tavil_handle_pdata(struct tavil_priv *tavil, - struct wcd9xxx_pdata *pdata) -{ - struct snd_soc_codec *codec = tavil->codec; - u8 mad_dmic_ctl_val; - u8 anc_ctl_value; - u32 def_dmic_rate, dmic_clk_drv; - int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; - int rc = 0; - - if (!pdata) { - dev_err(codec->dev, "%s: NULL pdata\n", __func__); - return -ENODEV; - } - - /* set micbias voltage */ - vout_ctl_1 = wcd934x_get_micb_vout_ctl_val(pdata->micbias.micb1_mv); - vout_ctl_2 = wcd934x_get_micb_vout_ctl_val(pdata->micbias.micb2_mv); - vout_ctl_3 = wcd934x_get_micb_vout_ctl_val(pdata->micbias.micb3_mv); - vout_ctl_4 = wcd934x_get_micb_vout_ctl_val(pdata->micbias.micb4_mv); - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || - vout_ctl_3 < 0 || vout_ctl_4 < 0) { - rc = -EINVAL; - goto done; - } - snd_soc_update_bits(codec, WCD934X_ANA_MICB1, 0x3F, vout_ctl_1); - snd_soc_update_bits(codec, WCD934X_ANA_MICB2, 0x3F, vout_ctl_2); - snd_soc_update_bits(codec, WCD934X_ANA_MICB3, 0x3F, vout_ctl_3); - snd_soc_update_bits(codec, WCD934X_ANA_MICB4, 0x3F, vout_ctl_4); - - /* Set the DMIC sample rate */ - switch (pdata->mclk_rate) { - case WCD934X_MCLK_CLK_9P6MHZ: - def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ; - break; - case WCD934X_MCLK_CLK_12P288MHZ: - def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P096MHZ; - break; - default: - /* should never happen */ - dev_err(codec->dev, "%s: Invalid mclk_rate %d\n", - __func__, pdata->mclk_rate); - rc = -EINVAL; - goto done; - }; - - if (pdata->dmic_sample_rate == - WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED) { - dev_info(codec->dev, "%s: dmic_rate invalid default = %d\n", - __func__, def_dmic_rate); - pdata->dmic_sample_rate = def_dmic_rate; - } - if (pdata->mad_dmic_sample_rate == - WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED) { - dev_info(codec->dev, "%s: mad_dmic_rate invalid default = %d\n", - __func__, def_dmic_rate); - /* - * use dmic_sample_rate as the default for MAD - * if mad dmic sample rate is undefined - */ - pdata->mad_dmic_sample_rate = pdata->dmic_sample_rate; - } - - if (pdata->dmic_clk_drv == - WCD9XXX_DMIC_CLK_DRIVE_UNDEFINED) { - pdata->dmic_clk_drv = WCD934X_DMIC_CLK_DRIVE_DEFAULT; - dev_dbg(codec->dev, - "%s: dmic_clk_strength invalid, default = %d\n", - __func__, pdata->dmic_clk_drv); - } - - switch (pdata->dmic_clk_drv) { - case 2: - dmic_clk_drv = 0; - break; - case 4: - dmic_clk_drv = 1; - break; - case 8: - dmic_clk_drv = 2; - break; - case 16: - dmic_clk_drv = 3; - break; - default: - dev_err(codec->dev, - "%s: invalid dmic_clk_drv %d, using default\n", - __func__, pdata->dmic_clk_drv); - dmic_clk_drv = 0; - break; - } - - snd_soc_update_bits(codec, WCD934X_TEST_DEBUG_PAD_DRVCTL_0, - 0x0C, dmic_clk_drv << 2); - - /* - * Default the DMIC clk rates to mad_dmic_sample_rate, - * whereas, the anc/txfe dmic rates to dmic_sample_rate - * since the anc/txfe are independent of mad block. - */ - mad_dmic_ctl_val = tavil_get_dmic_clk_val(tavil->codec, - pdata->mclk_rate, - pdata->mad_dmic_sample_rate); - snd_soc_update_bits(codec, WCD934X_CPE_SS_DMIC0_CTL, - 0x0E, mad_dmic_ctl_val << 1); - snd_soc_update_bits(codec, WCD934X_CPE_SS_DMIC1_CTL, - 0x0E, mad_dmic_ctl_val << 1); - snd_soc_update_bits(codec, WCD934X_CPE_SS_DMIC2_CTL, - 0x0E, mad_dmic_ctl_val << 1); - - if (dmic_clk_drv == WCD934X_DMIC_CLK_DIV_2) - anc_ctl_value = WCD934X_ANC_DMIC_X2_FULL_RATE; - else - anc_ctl_value = WCD934X_ANC_DMIC_X2_HALF_RATE; - - snd_soc_update_bits(codec, WCD934X_CDC_ANC0_MODE_2_CTL, - 0x40, anc_ctl_value << 6); - snd_soc_update_bits(codec, WCD934X_CDC_ANC0_MODE_2_CTL, - 0x20, anc_ctl_value << 5); - snd_soc_update_bits(codec, WCD934X_CDC_ANC1_MODE_2_CTL, - 0x40, anc_ctl_value << 6); - snd_soc_update_bits(codec, WCD934X_CDC_ANC1_MODE_2_CTL, - 0x20, anc_ctl_value << 5); - -done: - return rc; -} - -static void tavil_cdc_vote_svs(struct snd_soc_codec *codec, bool vote) -{ - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - return tavil_vote_svs(tavil, vote); -} - -static struct wcd_dsp_cdc_cb cdc_cb = { - .cdc_clk_en = tavil_codec_internal_rco_ctrl, - .cdc_vote_svs = tavil_cdc_vote_svs, -}; - -static int tavil_wdsp_initialize(struct snd_soc_codec *codec) -{ - struct wcd9xxx *control; - struct tavil_priv *tavil; - struct wcd_dsp_params params; - int ret = 0; - - control = dev_get_drvdata(codec->dev->parent); - tavil = snd_soc_codec_get_drvdata(codec); - - params.cb = &cdc_cb; - params.irqs.cpe_ipc1_irq = WCD934X_IRQ_CPE1_INTR; - params.irqs.cpe_err_irq = WCD934X_IRQ_CPE_ERROR; - params.irqs.fatal_irqs = CPE_FATAL_IRQS; - params.clk_rate = control->mclk_rate; - params.dsp_instance = 0; - - wcd_dsp_cntl_init(codec, ¶ms, &tavil->wdsp_cntl); - if (!tavil->wdsp_cntl) { - dev_err(tavil->dev, "%s: wcd-dsp-control init failed\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -/* - * tavil_soc_get_mbhc: get wcd934x_mbhc handle of corresponding codec - * @codec: handle to snd_soc_codec * - * - * return wcd934x_mbhc handle or error code in case of failure - */ -struct wcd934x_mbhc *tavil_soc_get_mbhc(struct snd_soc_codec *codec) -{ - struct tavil_priv *tavil; - - if (!codec) { - pr_err("%s: Invalid params, NULL codec\n", __func__); - return NULL; - } - tavil = snd_soc_codec_get_drvdata(codec); - - if (!tavil) { - pr_err("%s: Invalid params, NULL tavil\n", __func__); - return NULL; - } - - return tavil->mbhc; -} -EXPORT_SYMBOL(tavil_soc_get_mbhc); - -static void tavil_mclk2_reg_defaults(struct tavil_priv *tavil) -{ - int i; - struct snd_soc_codec *codec = tavil->codec; - - if (TAVIL_IS_1_0(tavil->wcd9xxx)) { - /* MCLK2 configuration */ - for (i = 0; i < ARRAY_SIZE(tavil_codec_mclk2_1_0_defaults); i++) - snd_soc_update_bits(codec, - tavil_codec_mclk2_1_0_defaults[i].reg, - tavil_codec_mclk2_1_0_defaults[i].mask, - tavil_codec_mclk2_1_0_defaults[i].val); - } - if (TAVIL_IS_1_1(tavil->wcd9xxx)) { - /* MCLK2 configuration */ - for (i = 0; i < ARRAY_SIZE(tavil_codec_mclk2_1_1_defaults); i++) - snd_soc_update_bits(codec, - tavil_codec_mclk2_1_1_defaults[i].reg, - tavil_codec_mclk2_1_1_defaults[i].mask, - tavil_codec_mclk2_1_1_defaults[i].val); - } -} - -static int tavil_device_down(struct wcd9xxx *wcd9xxx) -{ - struct snd_soc_codec *codec; - struct tavil_priv *priv; - int count; - int decimator; - int ret; - - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - if (!codec->component.card) { - dev_err(codec->dev, "%s: sound card is not enumerated.\n", - __func__); - return -EINVAL; - } - - priv = snd_soc_codec_get_drvdata(codec); - for (count = 0; count < NUM_CODEC_DAIS; count++) - priv->dai[count].bus_down_in_recovery = true; - snd_event_notify(priv->dev->parent, SND_EVENT_DOWN); - - if (priv->mbhc) - priv->mbhc->wcd_mbhc.deinit_in_progress = true; - if (delayed_work_pending(&priv->spk_anc_dwork.dwork)) - cancel_delayed_work(&priv->spk_anc_dwork.dwork); - for (decimator = 0; decimator < WCD934X_NUM_DECIMATORS; decimator++) { - if (delayed_work_pending - (&priv->tx_mute_dwork[decimator].dwork)) - cancel_delayed_work - (&priv->tx_mute_dwork[decimator].dwork); - if (delayed_work_pending - (&priv->tx_hpf_work[decimator].dwork)) - cancel_delayed_work - (&priv->tx_hpf_work[decimator].dwork); - } - if (delayed_work_pending(&priv->power_gate_work)) - cancel_delayed_work_sync(&priv->power_gate_work); - if (priv->mbhc) { - if (delayed_work_pending(&priv->mbhc->wcd_mbhc.mbhc_btn_dwork)) { - ret = cancel_delayed_work( - &priv->mbhc->wcd_mbhc.mbhc_btn_dwork); - if (ret) - priv->mbhc->wcd_mbhc.mbhc_cb->lock_sleep - (&priv->mbhc->wcd_mbhc, false); - } - } - - if (priv->swr.ctrl_data) { - if (is_snd_event_fwk_enabled()) - swrm_wcd_notify(priv->swr.ctrl_data[0].swr_pdev, - SWR_DEVICE_SSR_DOWN, NULL); - swrm_wcd_notify(priv->swr.ctrl_data[0].swr_pdev, - SWR_DEVICE_DOWN, NULL); - } - tavil_dsd_reset(priv->dsd_config); - if (!is_snd_event_fwk_enabled()) - snd_soc_card_change_online_state(codec->component.card, 0); - wcd_dsp_ssr_event(priv->wdsp_cntl, WCD_CDC_DOWN_EVENT); - wcd_resmgr_set_sido_input_src_locked(priv->resmgr, - SIDO_SOURCE_INTERNAL); - - return 0; -} - -static int tavil_post_reset_cb(struct wcd9xxx *wcd9xxx) -{ - int i, ret = 0; - struct wcd9xxx *control; - struct snd_soc_codec *codec; - struct tavil_priv *tavil; - struct wcd9xxx_pdata *pdata; - struct wcd_mbhc *mbhc; - - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - if (!codec->component.card) { - dev_err(codec->dev, "%s: sound card is not enumerated.\n", - __func__); - return -EINVAL; - } - tavil = snd_soc_codec_get_drvdata(codec); - control = dev_get_drvdata(codec->dev->parent); - - wcd9xxx_set_power_state(tavil->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - - mutex_lock(&tavil->codec_mutex); - - tavil_vote_svs(tavil, true); - tavil_slimbus_slave_port_cfg.slave_dev_intfdev_la = - control->slim_slave->laddr; - tavil_slimbus_slave_port_cfg.slave_dev_pgd_la = - control->slim->laddr; - tavil_init_slim_slave_cfg(codec); - if (!is_snd_event_fwk_enabled()) - snd_soc_card_change_online_state(codec->component.card, 1); - - for (i = 0; i < TAVIL_MAX_MICBIAS; i++) - tavil->micb_ref[i] = 0; - - dev_dbg(codec->dev, "%s: MCLK Rate = %x\n", - __func__, control->mclk_rate); - - if (control->mclk_rate == WCD934X_MCLK_CLK_12P288MHZ) - snd_soc_update_bits(codec, WCD934X_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x00); - else if (control->mclk_rate == WCD934X_MCLK_CLK_9P6MHZ) - snd_soc_update_bits(codec, WCD934X_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x01); - tavil_update_reg_defaults(tavil); - wcd_resmgr_post_ssr_v2(tavil->resmgr); - tavil_codec_init_reg(tavil); - __tavil_enable_efuse_sensing(tavil); - tavil_mclk2_reg_defaults(tavil); - - __tavil_cdc_mclk_enable(tavil, true); - regcache_mark_dirty(codec->component.regmap); - regcache_sync(codec->component.regmap); - __tavil_cdc_mclk_enable(tavil, false); - - tavil_update_cpr_defaults(tavil); - - pdata = dev_get_platdata(codec->dev->parent); - ret = tavil_handle_pdata(tavil, pdata); - if (ret < 0) - dev_err(codec->dev, "%s: invalid pdata\n", __func__); - - /* Initialize MBHC module */ - if (tavil->mbhc) { - mbhc = &tavil->mbhc->wcd_mbhc; - ret = tavil_mbhc_post_ssr_init(tavil->mbhc, codec); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto done; - } else { - tavil_mbhc_hs_detect(codec, mbhc->mbhc_cfg); - } - } - /* DSD initialization */ - ret = tavil_dsd_post_ssr_init(tavil->dsd_config); - if (ret) - dev_dbg(tavil->dev, "%s: DSD init failed\n", __func__); - - tavil_cleanup_irqs(tavil); - ret = tavil_setup_irqs(tavil); - if (ret) { - dev_err(codec->dev, "%s: tavil irq setup failed %d\n", - __func__, ret); - goto done; - } - - if (tavil->swr.ctrl_data && is_snd_event_fwk_enabled()) - swrm_wcd_notify(tavil->swr.ctrl_data[0].swr_pdev, - SWR_DEVICE_SSR_UP, NULL); - tavil_set_spkr_mode(codec, tavil->swr.spkr_mode); - /* - * Once the codec initialization is completed, the svs vote - * can be released allowing the codec to go to SVS2. - */ - tavil_vote_svs(tavil, false); - wcd_dsp_ssr_event(tavil->wdsp_cntl, WCD_CDC_UP_EVENT); - snd_event_notify(tavil->dev->parent, SND_EVENT_UP); - -done: - mutex_unlock(&tavil->codec_mutex); - return ret; -} - -static int tavil_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct wcd9xxx *control; - struct tavil_priv *tavil; - struct wcd9xxx_pdata *pdata; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int i, ret; - void *ptr = NULL; - - control = dev_get_drvdata(codec->dev->parent); - - dev_info(codec->dev, "%s()\n", __func__); - tavil = snd_soc_codec_get_drvdata(codec); - tavil->intf_type = wcd9xxx_get_intf_type(); - - control->dev_down = tavil_device_down; - control->post_reset = tavil_post_reset_cb; - control->ssr_priv = (void *)codec; - - /* Resource Manager post Init */ - ret = wcd_resmgr_post_init(tavil->resmgr, &tavil_resmgr_cb, codec); - if (ret) { - dev_err(codec->dev, "%s: wcd resmgr post init failed\n", - __func__); - goto err; - } - /* Class-H Init */ - wcd_clsh_init(&tavil->clsh_d); - /* Default HPH Mode to Class-H Low HiFi */ - tavil->hph_mode = CLS_H_LOHIFI; - - tavil->fw_data = devm_kzalloc(codec->dev, sizeof(*(tavil->fw_data)), - GFP_KERNEL); - if (!tavil->fw_data) - goto err; - - set_bit(WCD9XXX_ANC_CAL, tavil->fw_data->cal_bit); - set_bit(WCD9XXX_MBHC_CAL, tavil->fw_data->cal_bit); - set_bit(WCD9XXX_MAD_CAL, tavil->fw_data->cal_bit); - set_bit(WCD9XXX_VBAT_CAL, tavil->fw_data->cal_bit); - - ret = wcd_cal_create_hwdep(tavil->fw_data, - WCD9XXX_CODEC_HWDEP_NODE, codec); - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - goto err_hwdep; - } - - /* Initialize MBHC module */ - ret = tavil_mbhc_init(&tavil->mbhc, codec, tavil->fw_data); - if (ret) { - pr_err("%s: mbhc initialization failed\n", __func__); - goto err_hwdep; - } - - tavil->codec = codec; - for (i = 0; i < COMPANDER_MAX; i++) - tavil->comp_enabled[i] = 0; - - tavil_codec_init_reg(tavil); - - pdata = dev_get_platdata(codec->dev->parent); - ret = tavil_handle_pdata(tavil, pdata); - if (ret < 0) { - dev_err(codec->dev, "%s: bad pdata\n", __func__); - goto err_hwdep; - } - - ptr = devm_kzalloc(codec->dev, (sizeof(tavil_rx_chs) + - sizeof(tavil_tx_chs)), GFP_KERNEL); - if (!ptr) { - ret = -ENOMEM; - goto err_hwdep; - } - - for (i = 0; i < NUM_CODEC_DAIS; i++) { - INIT_LIST_HEAD(&tavil->dai[i].wcd9xxx_ch_list); - init_waitqueue_head(&tavil->dai[i].dai_wait); - } - - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - snd_soc_dapm_new_controls(dapm, tavil_dapm_slim_widgets, - ARRAY_SIZE(tavil_dapm_slim_widgets)); - snd_soc_dapm_add_routes(dapm, tavil_slim_audio_map, - ARRAY_SIZE(tavil_slim_audio_map)); - tavil_slimbus_slave_port_cfg.slave_dev_intfdev_la = - control->slim_slave->laddr; - tavil_slimbus_slave_port_cfg.slave_dev_pgd_la = - control->slim->laddr; - tavil_slimbus_slave_port_cfg.slave_port_mapping[0] = - WCD934X_TX13; - tavil_init_slim_slave_cfg(codec); - } else { - snd_soc_dapm_new_controls(dapm, tavil_dapm_i2s_widgets, - ARRAY_SIZE(tavil_dapm_i2s_widgets)); - snd_soc_dapm_add_routes(dapm, tavil_i2s_audio_map, - ARRAY_SIZE(tavil_i2s_audio_map)); - } - - control->num_rx_port = WCD934X_RX_MAX; - control->rx_chs = ptr; - memcpy(control->rx_chs, tavil_rx_chs, sizeof(tavil_rx_chs)); - control->num_tx_port = WCD934X_TX_MAX; - control->tx_chs = ptr + sizeof(tavil_rx_chs); - memcpy(control->tx_chs, tavil_tx_chs, sizeof(tavil_tx_chs)); - - ret = tavil_setup_irqs(tavil); - if (ret) { - dev_err(tavil->dev, "%s: tavil irq setup failed %d\n", - __func__, ret); - goto err_pdata; - } - - for (i = 0; i < WCD934X_NUM_DECIMATORS; i++) { - tavil->tx_hpf_work[i].tavil = tavil; - tavil->tx_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&tavil->tx_hpf_work[i].dwork, - tavil_tx_hpf_corner_freq_callback); - - tavil->tx_mute_dwork[i].tavil = tavil; - tavil->tx_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&tavil->tx_mute_dwork[i].dwork, - tavil_tx_mute_update_callback); - } - - tavil->spk_anc_dwork.tavil = tavil; - INIT_DELAYED_WORK(&tavil->spk_anc_dwork.dwork, - tavil_spk_anc_update_callback); - - tavil_mclk2_reg_defaults(tavil); - - /* DSD initialization */ - tavil->dsd_config = tavil_dsd_init(codec); - if (IS_ERR_OR_NULL(tavil->dsd_config)) - dev_dbg(tavil->dev, "%s: DSD init failed\n", __func__); - - mutex_lock(&tavil->codec_mutex); - snd_soc_dapm_disable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHL"); - snd_soc_dapm_disable_pin(dapm, "ANC HPHR"); - snd_soc_dapm_enable_pin(dapm, "ANC SPK1 PA"); - mutex_unlock(&tavil->codec_mutex); - - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "AIF2 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF2 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "AIF3 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF3 Capture"); - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - snd_soc_dapm_ignore_suspend(dapm, "AIF4 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 MAD TX"); - snd_soc_dapm_ignore_suspend(dapm, "VIfeed"); - } - - snd_soc_dapm_sync(dapm); - - tavil_wdsp_initialize(codec); - - /* - * Once the codec initialization is completed, the svs vote - * can be released allowing the codec to go to SVS2. - */ - tavil_vote_svs(tavil, false); - - return ret; - -err_pdata: - devm_kfree(codec->dev, ptr); - control->rx_chs = NULL; - control->tx_chs = NULL; -err_hwdep: - devm_kfree(codec->dev, tavil->fw_data); - tavil->fw_data = NULL; -err: - return ret; -} - -static int tavil_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct wcd9xxx *control; - struct tavil_priv *tavil = snd_soc_codec_get_drvdata(codec); - - control = dev_get_drvdata(codec->dev->parent); - devm_kfree(codec->dev, control->rx_chs); - /* slimslave deinit in wcd core looks for this value */ - control->num_rx_port = 0; - control->num_tx_port = 0; - control->rx_chs = NULL; - control->tx_chs = NULL; - tavil_cleanup_irqs(tavil); - - if (tavil->wdsp_cntl) - wcd_dsp_cntl_deinit(&tavil->wdsp_cntl); - - /* Deinitialize MBHC module */ - tavil_mbhc_deinit(codec); - tavil->mbhc = NULL; - - return 0; -} - -static struct regmap *tavil_get_regmap(struct device *dev) -{ - struct wcd9xxx *control = dev_get_drvdata(dev->parent); - - return control->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_tavil = { - .probe = tavil_soc_codec_probe, - .remove = tavil_soc_codec_remove, - .get_regmap = tavil_get_regmap, - .component_driver = { - .controls = tavil_snd_controls, - .num_controls = ARRAY_SIZE(tavil_snd_controls), - .dapm_widgets = tavil_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tavil_dapm_widgets), - .dapm_routes = tavil_audio_map, - .num_dapm_routes = ARRAY_SIZE(tavil_audio_map), - }, -}; - -#ifdef CONFIG_PM -static int tavil_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tavil_priv *tavil = platform_get_drvdata(pdev); - - if (!tavil) { - dev_err(dev, "%s: tavil private data is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(dev, "%s: system suspend\n", __func__); - if (delayed_work_pending(&tavil->power_gate_work) && - cancel_delayed_work_sync(&tavil->power_gate_work)) - tavil_codec_power_gate_digital_core(tavil); - return 0; -} - -static int tavil_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tavil_priv *tavil = platform_get_drvdata(pdev); - - if (!tavil) { - dev_err(dev, "%s: tavil private data is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(dev, "%s: system resume\n", __func__); - return 0; -} - -static const struct dev_pm_ops tavil_pm_ops = { - .suspend = tavil_suspend, - .resume = tavil_resume, -}; -#endif - -static int wcd9xxx_swrm_i2c_bulk_write(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_reg_val *bulk_reg, - size_t len) -{ - int i, ret = 0; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - - swr_wr_addr_base = WCD934X_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD934X_SWR_AHB_BRIDGE_WR_DATA_0; - - for (i = 0; i < (len * 2); i += 2) { - /* First Write the Data to register */ - ret = regmap_bulk_write(wcd9xxx->regmap, - swr_wr_data_base, bulk_reg[i].buf, 4); - if (ret < 0) { - dev_err(wcd9xxx->dev, "%s: WR Data Failure\n", - __func__); - break; - } - /* Next Write Address */ - ret = regmap_bulk_write(wcd9xxx->regmap, - swr_wr_addr_base, - bulk_reg[i+1].buf, 4); - if (ret < 0) { - dev_err(wcd9xxx->dev, "%s: WR Addr Failure\n", - __func__); - break; - } - } - return ret; -} - -static int tavil_swrm_read(void *handle, int reg) -{ - struct tavil_priv *tavil; - struct wcd9xxx *wcd9xxx; - unsigned short swr_rd_addr_base; - unsigned short swr_rd_data_base; - int val, ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - tavil = (struct tavil_priv *)handle; - wcd9xxx = tavil->wcd9xxx; - - dev_dbg(tavil->dev, "%s: Reading soundwire register, 0x%x\n", - __func__, reg); - swr_rd_addr_base = WCD934X_SWR_AHB_BRIDGE_RD_ADDR_0; - swr_rd_data_base = WCD934X_SWR_AHB_BRIDGE_RD_DATA_0; - - mutex_lock(&tavil->swr.read_mutex); - ret = regmap_bulk_write(wcd9xxx->regmap, swr_rd_addr_base, - (u8 *)®, 4); - if (ret < 0) { - dev_err(tavil->dev, "%s: RD Addr Failure\n", __func__); - goto done; - } - ret = regmap_bulk_read(wcd9xxx->regmap, swr_rd_data_base, - (u8 *)&val, 4); - if (ret < 0) { - dev_err(tavil->dev, "%s: RD Data Failure\n", __func__); - goto done; - } - ret = val; -done: - mutex_unlock(&tavil->swr.read_mutex); - - return ret; -} - -static int tavil_swrm_bulk_write(void *handle, u32 *reg, u32 *val, size_t len) -{ - struct tavil_priv *tavil; - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_reg_val *bulk_reg; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - int i, j, ret; - - if (!handle || !reg || !val) { - pr_err("%s: NULL parameter\n", __func__); - return -EINVAL; - } - if (len <= 0) { - pr_err("%s: Invalid size: %zu\n", __func__, len); - return -EINVAL; - } - tavil = (struct tavil_priv *)handle; - wcd9xxx = tavil->wcd9xxx; - - swr_wr_addr_base = WCD934X_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD934X_SWR_AHB_BRIDGE_WR_DATA_0; - - bulk_reg = kzalloc((2 * len * sizeof(struct wcd9xxx_reg_val)), - GFP_KERNEL); - if (!bulk_reg) - return -ENOMEM; - - for (i = 0, j = 0; i < (len * 2); i += 2, j++) { - bulk_reg[i].reg = swr_wr_data_base; - bulk_reg[i].buf = (u8 *)(&val[j]); - bulk_reg[i].bytes = 4; - bulk_reg[i+1].reg = swr_wr_addr_base; - bulk_reg[i+1].buf = (u8 *)(®[j]); - bulk_reg[i+1].bytes = 4; - } - - mutex_lock(&tavil->swr.write_mutex); - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, - (len * 2), false); - else - ret = wcd9xxx_swrm_i2c_bulk_write(wcd9xxx, bulk_reg, len); - if (ret) { - dev_err(tavil->dev, "%s: swrm bulk write failed, ret: %d\n", - __func__, ret); - } - mutex_unlock(&tavil->swr.write_mutex); - - kfree(bulk_reg); - return ret; -} - -static int tavil_swrm_write(void *handle, int reg, int val) -{ - struct tavil_priv *tavil; - struct wcd9xxx *wcd9xxx; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - struct wcd9xxx_reg_val bulk_reg[2]; - int ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - tavil = (struct tavil_priv *)handle; - wcd9xxx = tavil->wcd9xxx; - - swr_wr_addr_base = WCD934X_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD934X_SWR_AHB_BRIDGE_WR_DATA_0; - - /* First Write the Data to register */ - bulk_reg[0].reg = swr_wr_data_base; - bulk_reg[0].buf = (u8 *)(&val); - bulk_reg[0].bytes = 4; - bulk_reg[1].reg = swr_wr_addr_base; - bulk_reg[1].buf = (u8 *)(®); - bulk_reg[1].bytes = 4; - - mutex_lock(&tavil->swr.write_mutex); - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, 2, false); - else - ret = wcd9xxx_swrm_i2c_bulk_write(wcd9xxx, bulk_reg, 1); - if (ret < 0) - dev_err(tavil->dev, "%s: WR Data Failure\n", __func__); - mutex_unlock(&tavil->swr.write_mutex); - - return ret; -} - -static int tavil_swrm_clock(void *handle, bool enable) -{ - struct tavil_priv *tavil; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - tavil = (struct tavil_priv *)handle; - - mutex_lock(&tavil->swr.clk_mutex); - dev_dbg(tavil->dev, "%s: swrm clock %s\n", - __func__, (enable?"enable" : "disable")); - if (enable) { - tavil->swr.clk_users++; - if (tavil->swr.clk_users == 1) { - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_TEST_DEBUG_NPL_DLY_TEST_1, - 0x10, 0x00); - __tavil_cdc_mclk_enable(tavil, true); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - } - } else { - tavil->swr.clk_users--; - if (tavil->swr.clk_users == 0) { - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - __tavil_cdc_mclk_enable(tavil, false); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_TEST_DEBUG_NPL_DLY_TEST_1, - 0x10, 0x10); - } - } - dev_dbg(tavil->dev, "%s: swrm clock users %d\n", - __func__, tavil->swr.clk_users); - mutex_unlock(&tavil->swr.clk_mutex); - - return 0; -} - -static int tavil_swrm_handle_irq(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action) -{ - struct tavil_priv *tavil; - int ret = 0; - struct wcd9xxx *wcd9xxx; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - tavil = (struct tavil_priv *) handle; - wcd9xxx = tavil->wcd9xxx; - - if (action) { - ret = wcd9xxx_request_irq(&wcd9xxx->core_res, - WCD934X_IRQ_SOUNDWIRE, - swrm_irq_handler, - "Tavil SWR Master", swrm_handle); - if (ret) - dev_err(tavil->dev, "%s: Failed to request irq %d\n", - __func__, WCD934X_IRQ_SOUNDWIRE); - } else - wcd9xxx_free_irq(&wcd9xxx->core_res, WCD934X_IRQ_SOUNDWIRE, - swrm_handle); - - return ret; -} - -static void tavil_codec_add_spi_device(struct tavil_priv *tavil, - struct device_node *node) -{ - struct spi_master *master; - struct spi_device *spi; - u32 prop_value; - int rc; - - /* Read the master bus num from DT node */ - rc = of_property_read_u32(node, "qcom,master-bus-num", - &prop_value); - if (rc < 0) { - dev_err(tavil->dev, "%s: prop %s not found in node %s", - __func__, "qcom,master-bus-num", node->full_name); - goto done; - } - - /* Get the reference to SPI master */ - master = spi_busnum_to_master(prop_value); - if (!master) { - dev_err(tavil->dev, "%s: Invalid spi_master for bus_num %u\n", - __func__, prop_value); - goto done; - } - - /* Allocate the spi device */ - spi = spi_alloc_device(master); - if (!spi) { - dev_err(tavil->dev, "%s: spi_alloc_device failed\n", - __func__); - goto err_spi_alloc_dev; - } - - /* Initialize device properties */ - if (of_modalias_node(node, spi->modalias, - sizeof(spi->modalias)) < 0) { - dev_err(tavil->dev, "%s: cannot find modalias for %s\n", - __func__, node->full_name); - goto err_dt_parse; - } - - rc = of_property_read_u32(node, "qcom,chip-select", - &prop_value); - if (rc < 0) { - dev_err(tavil->dev, "%s: prop %s not found in node %s", - __func__, "qcom,chip-select", node->full_name); - goto err_dt_parse; - } - spi->chip_select = prop_value; - - rc = of_property_read_u32(node, "qcom,max-frequency", - &prop_value); - if (rc < 0) { - dev_err(tavil->dev, "%s: prop %s not found in node %s", - __func__, "qcom,max-frequency", node->full_name); - goto err_dt_parse; - } - spi->max_speed_hz = prop_value; - - spi->dev.of_node = node; - - rc = spi_add_device(spi); - if (rc < 0) { - dev_err(tavil->dev, "%s: spi_add_device failed\n", __func__); - goto err_dt_parse; - } - - tavil->spi = spi; - /* Put the reference to SPI master */ - put_device(&master->dev); - - return; - -err_dt_parse: - spi_dev_put(spi); - -err_spi_alloc_dev: - /* Put the reference to SPI master */ - put_device(&master->dev); -done: - return; -} - -static void tavil_add_child_devices(struct work_struct *work) -{ - struct tavil_priv *tavil; - struct platform_device *pdev; - struct device_node *node; - struct wcd9xxx *wcd9xxx; - struct tavil_swr_ctrl_data *swr_ctrl_data = NULL, *temp; - int ret, ctrl_num = 0; - struct wcd_swr_ctrl_platform_data *platdata; - char plat_dev_name[WCD934X_STRING_LEN]; - - tavil = container_of(work, struct tavil_priv, - tavil_add_child_devices_work); - if (!tavil) { - pr_err("%s: Memory for WCD934X does not exist\n", - __func__); - return; - } - wcd9xxx = tavil->wcd9xxx; - if (!wcd9xxx) { - pr_err("%s: Memory for WCD9XXX does not exist\n", - __func__); - return; - } - if (!wcd9xxx->dev->of_node) { - dev_err(wcd9xxx->dev, "%s: DT node for wcd9xxx does not exist\n", - __func__); - return; - } - - platdata = &tavil->swr.plat_data; - tavil->child_count = 0; - - for_each_child_of_node(wcd9xxx->dev->of_node, node) { - - /* Parse and add the SPI device node */ - if (!strcmp(node->name, "wcd_spi")) { - tavil_codec_add_spi_device(tavil, node); - continue; - } - - /* Parse other child device nodes and add platform device */ - if (!strcmp(node->name, "swr_master")) - strlcpy(plat_dev_name, "tavil_swr_ctrl", - (WCD934X_STRING_LEN - 1)); - else if (strnstr(node->name, "msm_cdc_pinctrl", - strlen("msm_cdc_pinctrl")) != NULL) - strlcpy(plat_dev_name, node->name, - (WCD934X_STRING_LEN - 1)); - else - continue; - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(wcd9xxx->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err_mem; - } - pdev->dev.parent = tavil->dev; - pdev->dev.of_node = node; - - if (strcmp(node->name, "swr_master") == 0) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto err_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto err_pdev_add; - } - - if (strcmp(node->name, "swr_master") == 0) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct tavil_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - dev_err(wcd9xxx->dev, "out of memory\n"); - ret = -ENOMEM; - goto err_pdev_add; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - tavil->swr.ctrl_data = swr_ctrl_data; - } - if (tavil->child_count < WCD934X_CHILD_DEVICES_MAX) - tavil->pdev_child_devices[tavil->child_count++] = pdev; - else - goto err_mem; - } - - return; - -err_pdev_add: - platform_device_put(pdev); -err_mem: - return; -} - -static int __tavil_enable_efuse_sensing(struct tavil_priv *tavil) -{ - int val, rc; - - WCD9XXX_V2_BG_CLK_LOCK(tavil->resmgr); - __tavil_cdc_mclk_enable_locked(tavil, true); - - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CHIP_TIER_CTRL_EFUSE_CTL, 0x1E, 0x10); - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CHIP_TIER_CTRL_EFUSE_CTL, 0x01, 0x01); - /* - * 5ms sleep required after enabling efuse control - * before checking the status. - */ - usleep_range(5000, 5500); - wcd_resmgr_set_sido_input_src(tavil->resmgr, - SIDO_SOURCE_RCO_BG); - - WCD9XXX_V2_BG_CLK_UNLOCK(tavil->resmgr); - - rc = regmap_read(tavil->wcd9xxx->regmap, - WCD934X_CHIP_TIER_CTRL_EFUSE_STATUS, &val); - if (rc || (!(val & 0x01))) - WARN(1, "%s: Efuse sense is not complete val=%x, ret=%d\n", - __func__, val, rc); - - __tavil_cdc_mclk_enable(tavil, false); - - return rc; -} - -static void ___tavil_get_codec_fine_version(struct tavil_priv *tavil) -{ - int val1, val2, version; - struct regmap *regmap; - u16 id_minor; - u32 version_mask = 0; - - regmap = tavil->wcd9xxx->regmap; - version = tavil->wcd9xxx->version; - id_minor = tavil->wcd9xxx->codec_type->id_minor; - - regmap_read(regmap, WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14, &val1); - regmap_read(regmap, WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT15, &val2); - - dev_dbg(tavil->dev, "%s: chip version :0x%x 0x:%x\n", - __func__, val1, val2); - - version_mask |= (!!((u8)val1 & 0x80)) << DSD_DISABLED_MASK; - version_mask |= (!!((u8)val2 & 0x01)) << SLNQ_DISABLED_MASK; - - switch (version_mask) { - case DSD_DISABLED | SLNQ_DISABLED: - if (id_minor == cpu_to_le16(0)) - version = TAVIL_VERSION_WCD9340_1_0; - else if (id_minor == cpu_to_le16(0x01)) - version = TAVIL_VERSION_WCD9340_1_1; - break; - case SLNQ_DISABLED: - if (id_minor == cpu_to_le16(0)) - version = TAVIL_VERSION_WCD9341_1_0; - else if (id_minor == cpu_to_le16(0x01)) - version = TAVIL_VERSION_WCD9341_1_1; - break; - } - - tavil->wcd9xxx->version = version; - tavil->wcd9xxx->codec_type->version = version; -} - -/* - * tavil_get_wcd_dsp_cntl: Get the reference to wcd_dsp_cntl - * @dev: Device pointer for codec device - * - * This API gets the reference to codec's struct wcd_dsp_cntl - */ -struct wcd_dsp_cntl *tavil_get_wcd_dsp_cntl(struct device *dev) -{ - struct platform_device *pdev; - struct tavil_priv *tavil; - - if (!dev) { - pr_err("%s: Invalid device\n", __func__); - return NULL; - } - - pdev = to_platform_device(dev); - tavil = platform_get_drvdata(pdev); - - return tavil->wdsp_cntl; -} -EXPORT_SYMBOL(tavil_get_wcd_dsp_cntl); - -static void wcd934x_ssr_disable(struct device *dev, void *data) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - struct tavil_priv *tavil; - struct snd_soc_codec *codec; - int count = 0; - - if (!wcd9xxx) { - dev_dbg(dev, "%s: wcd9xxx pointer NULL.\n", __func__); - return; - } - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - tavil = snd_soc_codec_get_drvdata(codec); - - for (count = 0; count < NUM_CODEC_DAIS; count++) - tavil->dai[count].bus_down_in_recovery = true; -} - -static const struct snd_event_ops wcd934x_ssr_ops = { - .disable = wcd934x_ssr_disable, -}; - -static int tavil_probe(struct platform_device *pdev) -{ - int ret = 0, len = 0; - struct tavil_priv *tavil; - struct clk *wcd_ext_clk; - struct wcd9xxx_resmgr_v2 *resmgr; - struct wcd9xxx_power_region *cdc_pwr; - const __be32 *micb_prop; - - tavil = devm_kzalloc(&pdev->dev, sizeof(struct tavil_priv), - GFP_KERNEL); - if (!tavil) - return -ENOMEM; - - tavil->intf_type = wcd9xxx_get_intf_type(); - if (tavil->intf_type != WCD9XXX_INTERFACE_TYPE_I2C && - tavil->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - devm_kfree(&pdev->dev, tavil); - return -EPROBE_DEFER; - } - - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - if (apr_get_subsys_state() == APR_SUBSYS_DOWN) { - dev_dbg(&pdev->dev, "%s: dsp down\n", __func__); - devm_kfree(&pdev->dev, tavil); - return -EPROBE_DEFER; - } - } - - platform_set_drvdata(pdev, tavil); - - tavil->wcd9xxx = dev_get_drvdata(pdev->dev.parent); - tavil->dev = &pdev->dev; - INIT_DELAYED_WORK(&tavil->power_gate_work, tavil_codec_power_gate_work); - mutex_init(&tavil->power_lock); - INIT_WORK(&tavil->tavil_add_child_devices_work, - tavil_add_child_devices); - mutex_init(&tavil->micb_lock); - mutex_init(&tavil->swr.read_mutex); - mutex_init(&tavil->swr.write_mutex); - mutex_init(&tavil->swr.clk_mutex); - mutex_init(&tavil->codec_mutex); - mutex_init(&tavil->svs_mutex); - - /* - * Codec hardware by default comes up in SVS mode. - * Initialize the svs_ref_cnt to 1 to reflect the hardware - * state in the driver. - */ - tavil->svs_ref_cnt = 1; - - cdc_pwr = devm_kzalloc(&pdev->dev, sizeof(struct wcd9xxx_power_region), - GFP_KERNEL); - if (!cdc_pwr) { - ret = -ENOMEM; - goto err_resmgr; - } - tavil->wcd9xxx->wcd9xxx_pwr[WCD9XXX_DIG_CORE_REGION_1] = cdc_pwr; - cdc_pwr->pwr_collapse_reg_min = WCD934X_DIG_CORE_REG_MIN; - cdc_pwr->pwr_collapse_reg_max = WCD934X_DIG_CORE_REG_MAX; - wcd9xxx_set_power_state(tavil->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - /* - * Init resource manager so that if child nodes such as SoundWire - * requests for clock, resource manager can honor the request - */ - resmgr = wcd_resmgr_init(&tavil->wcd9xxx->core_res, NULL); - if (IS_ERR(resmgr)) { - ret = PTR_ERR(resmgr); - dev_err(&pdev->dev, "%s: Failed to initialize wcd resmgr\n", - __func__); - goto err_resmgr; - } - tavil->resmgr = resmgr; - tavil->swr.plat_data.handle = (void *) tavil; - tavil->swr.plat_data.read = tavil_swrm_read; - tavil->swr.plat_data.write = tavil_swrm_write; - tavil->swr.plat_data.bulk_write = tavil_swrm_bulk_write; - tavil->swr.plat_data.clk = tavil_swrm_clock; - tavil->swr.plat_data.handle_irq = tavil_swrm_handle_irq; - tavil->swr.spkr_gain_offset = WCD934X_RX_GAIN_OFFSET_0_DB; - tavil->micbias_num = 0; - - /* Register for Clock */ - wcd_ext_clk = clk_get(tavil->wcd9xxx->dev, "wcd_clk"); - if (IS_ERR(wcd_ext_clk)) { - dev_err(tavil->wcd9xxx->dev, "%s: clk get %s failed\n", - __func__, "wcd_ext_clk"); - goto err_clk; - } - tavil->wcd_ext_clk = wcd_ext_clk; - set_bit(AUDIO_NOMINAL, &tavil->status_mask); - /* Update codec register default values */ - dev_dbg(&pdev->dev, "%s: MCLK Rate = %x\n", __func__, - tavil->wcd9xxx->mclk_rate); - if (tavil->wcd9xxx->mclk_rate == WCD934X_MCLK_CLK_12P288MHZ) - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x00); - else if (tavil->wcd9xxx->mclk_rate == WCD934X_MCLK_CLK_9P6MHZ) - regmap_update_bits(tavil->wcd9xxx->regmap, - WCD934X_CODEC_RPM_CLK_MCLK_CFG, - 0x03, 0x01); - tavil_update_reg_defaults(tavil); - __tavil_enable_efuse_sensing(tavil); - ___tavil_get_codec_fine_version(tavil); - tavil_update_cpr_defaults(tavil); - - /* Register with soc framework */ - if (tavil->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_tavil, - tavil_i2s_dai, - ARRAY_SIZE(tavil_i2s_dai)); - else - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_tavil, - tavil_slim_dai, - ARRAY_SIZE(tavil_slim_dai)); - - if (ret) { - dev_err(&pdev->dev, "%s: Codec registration failed\n", - __func__); - goto err_cdc_reg; - } - schedule_work(&tavil->tavil_add_child_devices_work); - - ret = snd_event_client_register(pdev->dev.parent, &wcd934x_ssr_ops, NULL); - if (!ret) { - snd_event_notify(pdev->dev.parent, SND_EVENT_UP); - } else { - pr_err("%s: Registration with SND event fwk failed ret = %d\n", - __func__, ret); - ret = 0; - } - - tavil->micb_load = NULL; - - if (of_get_property(tavil->wcd9xxx->dev->of_node, - "qcom,vreg-micb-supply", NULL)) { - micb_prop = of_get_property(tavil->wcd9xxx->dev->of_node, - "qcom,cdc-vdd-mic-bias-current", - &len); - if (!micb_prop || (len != (2 * sizeof(__be32)))) { - tavil->micb_load_low = MICB_LOAD_DEFAULT; - tavil->micb_load_high = MICB_LOAD_DEFAULT; - } else { - tavil->micb_load_low = be32_to_cpup(&micb_prop[0]); - tavil->micb_load_high = be32_to_cpup(&micb_prop[1]); - } - tavil->micb_load = regulator_get(&pdev->dev, MICB_LOAD_PROP); - if (IS_ERR(tavil->micb_load)) - dev_dbg(tavil->dev, "%s micb load get failed\n", - __func__); - } - - return ret; - -err_cdc_reg: - clk_put(tavil->wcd_ext_clk); -err_clk: - wcd_resmgr_remove(tavil->resmgr); -err_resmgr: - mutex_destroy(&tavil->micb_lock); - mutex_destroy(&tavil->svs_mutex); - mutex_destroy(&tavil->codec_mutex); - mutex_destroy(&tavil->swr.read_mutex); - mutex_destroy(&tavil->swr.write_mutex); - mutex_destroy(&tavil->swr.clk_mutex); - devm_kfree(&pdev->dev, tavil); - - return ret; -} - -static int tavil_remove(struct platform_device *pdev) -{ - struct tavil_priv *tavil; - int count = 0; - - tavil = platform_get_drvdata(pdev); - if (!tavil) - return -EINVAL; - - /* do dsd deinit before codec->component->regmap becomes freed */ - if (tavil->dsd_config) { - tavil_dsd_deinit(tavil->dsd_config); - tavil->dsd_config = NULL; - } - - snd_event_client_deregister(pdev->dev.parent); - - if (tavil->spi) - spi_unregister_device(tavil->spi); - for (count = 0; count < tavil->child_count && - count < WCD934X_CHILD_DEVICES_MAX; count++) - platform_device_unregister(tavil->pdev_child_devices[count]); - - if (tavil->micb_load) - regulator_put(tavil->micb_load); - - mutex_destroy(&tavil->micb_lock); - mutex_destroy(&tavil->svs_mutex); - mutex_destroy(&tavil->codec_mutex); - mutex_destroy(&tavil->swr.read_mutex); - mutex_destroy(&tavil->swr.write_mutex); - mutex_destroy(&tavil->swr.clk_mutex); - - snd_soc_unregister_codec(&pdev->dev); - clk_put(tavil->wcd_ext_clk); - wcd_resmgr_remove(tavil->resmgr); - devm_kfree(&pdev->dev, tavil); - return 0; -} - -static struct platform_driver tavil_codec_driver = { - .probe = tavil_probe, - .remove = tavil_remove, - .driver = { - .name = "tavil_codec", - .owner = THIS_MODULE, -#ifdef CONFIG_PM - .pm = &tavil_pm_ops, -#endif - }, -}; - -module_platform_driver(tavil_codec_driver); - -MODULE_DESCRIPTION("Tavil Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x.h b/techpack/audio/asoc/codecs/wcd934x/wcd934x.h deleted file mode 100644 index c96e93aa56df..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef WCD934X_H -#define WCD934X_H - -#include -#include "wcd934x-dsp-cntl.h" -#include "../wcd9xxx-slimslave.h" -#include "../wcd9xxx-common-v2.h" -#include "../wcd-mbhc-v2.h" - -#define WCD934X_REGISTER_START_OFFSET 0x800 -#define WCD934X_SB_PGD_PORT_RX_BASE 0x40 -#define WCD934X_SB_PGD_PORT_TX_BASE 0x50 -#define WCD934X_RX_PORT_START_NUMBER 16 - -#define WCD934X_DMIC_CLK_DIV_2 0x0 -#define WCD934X_DMIC_CLK_DIV_3 0x1 -#define WCD934X_DMIC_CLK_DIV_4 0x2 -#define WCD934X_DMIC_CLK_DIV_6 0x3 -#define WCD934X_DMIC_CLK_DIV_8 0x4 -#define WCD934X_DMIC_CLK_DIV_16 0x5 -#define WCD934X_DMIC_CLK_DRIVE_DEFAULT 0x02 - -#define WCD934X_ANC_DMIC_X2_FULL_RATE 1 -#define WCD934X_ANC_DMIC_X2_HALF_RATE 0 - -#define TAVIL_MAX_MICBIAS 4 -#define TAVIL_NUM_INTERPOLATORS 9 -#define MAX_ON_DEMAND_SUPPLY_NAME_LENGTH 64 - -/* Convert from vout ctl to micbias voltage in mV */ -#define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) - -/* Feature masks to distinguish codec version */ -#define DSD_DISABLED_MASK 0 -#define SLNQ_DISABLED_MASK 1 - -#define DSD_DISABLED (1 << DSD_DISABLED_MASK) -#define SLNQ_DISABLED (1 << SLNQ_DISABLED_MASK) - -/* Number of input and output Slimbus port */ -enum { - WCD934X_RX0 = 0, - WCD934X_RX1, - WCD934X_RX2, - WCD934X_RX3, - WCD934X_RX4, - WCD934X_RX5, - WCD934X_RX6, - WCD934X_RX7, - WCD934X_RX_MAX, -}; - -enum { - WCD934X_TX0 = 0, - WCD934X_TX1, - WCD934X_TX2, - WCD934X_TX3, - WCD934X_TX4, - WCD934X_TX5, - WCD934X_TX6, - WCD934X_TX7, - WCD934X_TX8, - WCD934X_TX9, - WCD934X_TX10, - WCD934X_TX11, - WCD934X_TX12, - WCD934X_TX13, - WCD934X_TX14, - WCD934X_TX15, - WCD934X_TX_MAX, -}; - -enum { - INTERP_EAR = 0, - INTERP_HPHL, - INTERP_HPHR, - INTERP_LO1, - INTERP_LO2, - INTERP_LO3_NA, /* LO3 not avalible in Tavil*/ - INTERP_LO4_NA, - INTERP_SPKR1, - INTERP_SPKR2, - INTERP_MAX, -}; - -/* WCD934X slimbus slave port error status */ -enum { - SB_PORT_ERR_OF, /* SB port overflow */ - SB_PORT_ERR_UF, /* SB port underflow */ - SB_PORT_ERR_MAX, -}; - -/* - * Selects compander and smart boost settings - * for a given speaker mode - */ -enum { - WCD934X_SPKR_MODE_DEFAULT, - WCD934X_SPKR_MODE_1, /* COMP Gain = 12dB, Smartboost Max = 5.5V */ -}; - -/* - * Rx path gain offsets - */ -enum { - WCD934X_RX_GAIN_OFFSET_M1P5_DB, - WCD934X_RX_GAIN_OFFSET_0_DB, -}; - -/* - * Dai data structure holds the - * dai specific info like rate, - * channel number etc. - */ -struct tavil_codec_dai_data { - u32 rate; - u32 *ch_num; - u32 ch_act; - u32 ch_tot; -}; - -/* - * Structure used to update codec - * register defaults after reset - */ -struct tavil_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD934X) -extern void *tavil_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type); -extern int tavil_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable); -extern int tavil_cdc_mclk_tx_enable(struct snd_soc_codec *codec, bool enable); -extern int tavil_set_spkr_mode(struct snd_soc_codec *codec, int mode); -extern int tavil_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset); -extern struct wcd_dsp_cntl *tavil_get_wcd_dsp_cntl(struct device *dev); -extern int wcd934x_get_micb_vout_ctl_val(u32 micb_mv); -extern int tavil_micbias_control(struct snd_soc_codec *codec, - int micb_num, - int req, bool is_dapm); -extern int tavil_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, - int micb_num); -extern struct wcd934x_mbhc *tavil_soc_get_mbhc(struct snd_soc_codec *codec); -extern int tavil_codec_enable_interp_clk(struct snd_soc_codec *codec, - int event, int intp_idx); -extern struct tavil_dsd_config *tavil_get_dsd_config( - struct snd_soc_codec *codec); -extern int tavil_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -#else -extern void *tavil_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type) -{ - return NULL; -} -extern int tavil_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable) -{ - return 0; -} -extern int tavil_cdc_mclk_tx_enable(struct snd_soc_codec *codec, bool enable) -{ - return 0; -} -extern int tavil_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - return 0; -} -extern int tavil_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - return 0; -} -extern struct wcd_dsp_cntl *tavil_get_wcd_dsp_cntl(struct device *dev) -{ - return NULL; -} -extern int wcd934x_get_micb_vout_ctl_val(u32 micb_mv) -{ - return 0; -} -extern int tavil_micbias_control(struct snd_soc_codec *codec, - int micb_num, - int req, bool is_dapm) -{ - return 0; -} -extern int tavil_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, - int micb_num) -{ - return 0; -} -extern struct wcd934x_mbhc *tavil_soc_get_mbhc(struct snd_soc_codec *codec) -{ - return NULL; -} -extern int tavil_codec_enable_interp_clk(struct snd_soc_codec *codec, - int event, int intp_idx) -{ - return 0; -} -extern struct tavil_dsd_config *tavil_get_dsd_config( - struct snd_soc_codec *codec) -{ - return NULL; -} -extern int tavil_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} - -#endif - -#endif diff --git a/techpack/audio/asoc/codecs/wcd934x/wcd934x_irq.h b/techpack/audio/asoc/codecs/wcd934x/wcd934x_irq.h deleted file mode 100644 index 1a18be376eb1..000000000000 --- a/techpack/audio/asoc/codecs/wcd934x/wcd934x_irq.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD934X_IRQ_H_ -#define __WCD934X_IRQ_H_ - -enum { - /* INTR_REG 0 */ - WCD934X_IRQ_MISC = 1, - WCD934X_IRQ_HPH_PA_OCPL_FAULT, - WCD934X_IRQ_HPH_PA_OCPR_FAULT, - WCD934X_IRQ_EAR_PA_OCP_FAULT, - WCD934X_IRQ_HPH_PA_CNPL_COMPLETE, - WCD934X_IRQ_HPH_PA_CNPR_COMPLETE, - WCD934X_IRQ_EAR_PA_CNP_COMPLETE, - /* INTR_REG 1 */ - WCD934X_IRQ_MBHC_SW_DET, - WCD934X_IRQ_MBHC_ELECT_INS_REM_DET, - WCD934X_IRQ_MBHC_BUTTON_PRESS_DET, - WCD934X_IRQ_MBHC_BUTTON_RELEASE_DET, - WCD934X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - WCD934X_IRQ_RESERVED_0, - WCD934X_IRQ_RESERVED_1, - WCD934X_IRQ_RESERVED_2, - /* INTR_REG 2 */ - WCD934X_IRQ_LINE_PA1_CNP_COMPLETE, - WCD934X_IRQ_LINE_PA2_CNP_COMPLETE, - WCD934X_IRQ_SLNQ_ANALOG_ERROR, - WCD934X_IRQ_RESERVED_3, - WCD934X_IRQ_SOUNDWIRE, - WCD934X_IRQ_VDD_DIG_RAMP_COMPLETE, - WCD934X_IRQ_RCO_ERROR, - WCD934X_IRQ_CPE_ERROR, - /* INTR_REG 3 */ - WCD934X_IRQ_MAD_AUDIO, - WCD934X_IRQ_MAD_BEACON, - WCD934X_IRQ_MAD_ULTRASOUND, - WCD934X_IRQ_VBAT_ATTACK, - WCD934X_IRQ_VBAT_RESTORE, - WCD934X_IRQ_CPE1_INTR, - WCD934X_IRQ_RESERVED_4, - WCD934X_IRQ_SLNQ_DIGITAL, - WCD934X_NUM_IRQS, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9360/Android.mk b/techpack/audio/asoc/codecs/wcd9360/Android.mk deleted file mode 100644 index 492061265f26..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/Android.mk +++ /dev/null @@ -1,50 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msmnile),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd9360_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd9360.ko -LOCAL_MODULE_KBUILD_NAME := wcd9360_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/wcd9360/Kbuild b/techpack/audio/asoc/codecs/wcd9360/Kbuild deleted file mode 100644 index de239832ae8b..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/Kbuild +++ /dev/null @@ -1,113 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ WCD934X ############ - -# for WCD9360 Codec -ifdef CONFIG_SND_SOC_WCD9360 - WCD9360_OBJS += wcd9360.o - WCD9360_OBJS += wcd9360-dsp-cntl.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_WCD9360) += wcd9360_dlkm.o -wcd9360_dlkm-y := $(WCD9360_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360-defaults.h b/techpack/audio/asoc/codecs/wcd9360/wcd9360-defaults.h deleted file mode 100644 index 5557ddafa865..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360-defaults.h +++ /dev/null @@ -1,2231 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD9360_DEFAULTS_H__ -#define __WCD9360_DEFAULTS_H__ - -#include -#include - -#define WCD9360_REG(reg) ((reg) & 0xFF) - -static const struct reg_default wcd9360_defaults[] = { -{WCD9360_PAGE0_PAGE_REGISTER, 0x00}, -{WCD9360_CODEC_RPM_CLK_BYPASS, 0x00}, -{WCD9360_CODEC_RPM_CLK_GATE, 0x1F}, -{WCD9360_CODEC_RPM_CLK_MCLK_CFG, 0x00}, -{WCD9360_CODEC_RPM_CLK_MCLK2_CFG, 0x02}, -{WCD9360_CODEC_RPM_I2S_DSD_CLK_SEL, 0x00}, -{WCD9360_CODEC_RPM_RST_CTL, 0x00}, -{WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x04}, -{WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE0, 0x10}, -{WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE1, 0x60}, -{WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE2, 0x93}, -{WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE3, 0x01}, -{WCD9360_CHIP_TIER_CTRL_EFUSE_CTL, 0x10}, -{WCD9360_CHIP_TIER_CTRL_EFUSE_TEST0, 0x00}, -{WCD9360_CHIP_TIER_CTRL_EFUSE_TEST1, 0x00}, -{WCD9360_CHIP_TIER_CTRL_EFUSE_STATUS, 0x00}, -{WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO, 0x0D}, -{WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_1, 0x00}, -{WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_2, 0x00}, -{WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_3, 0x00}, -{WCD9360_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL, 0x44}, -{WCD9360_CHIP_TIER_CTRL_I2C_ACTIVE, 0x00}, -{WCD9360_CHIP_TIER_CTRL_ALT_FUNC_EN, 0x00}, -{WCD9360_CHIP_TIER_CTRL_GPIO_CTL_OE, 0x00}, -{WCD9360_CHIP_TIER_CTRL_GPIO_CTL_DATA, 0x00}, -{WCD9360_DATA_HUB_RX0_CFG, 0x00}, -{WCD9360_DATA_HUB_RX1_CFG, 0x00}, -{WCD9360_DATA_HUB_RX2_CFG, 0x00}, -{WCD9360_DATA_HUB_RX3_CFG, 0x00}, -{WCD9360_DATA_HUB_RX4_CFG, 0x00}, -{WCD9360_DATA_HUB_RX5_CFG, 0x00}, -{WCD9360_DATA_HUB_RX6_CFG, 0x00}, -{WCD9360_DATA_HUB_RX7_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX0_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX1_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX2_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX3_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX4_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX5_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX6_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX7_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX8_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX9_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX10_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX11_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX12_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX13_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX14_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_SB_TX15_INP_CFG, 0x00}, -{WCD9360_DATA_HUB_I2S_TX0_CFG, 0x00}, -{WCD9360_DATA_HUB_I2S_TX0_CFG2, 0x00}, -{WCD9360_DATA_HUB_I2S_TX1_0_CFG, 0x00}, -{WCD9360_DATA_HUB_I2S_TX1_1_CFG, 0x00}, -{WCD9360_DATA_HUB_DATA_HUB_CFG, 0x03}, -{WCD9360_DATA_HUB_I2S_0_CTL, 0x0C}, -{WCD9360_DATA_HUB_I2S_1_CTL, 0x0C}, -{WCD9360_DATA_HUB_I2S_0_CTL2, 0x01}, -{WCD9360_DATA_HUB_I2S_1_CTL2, 0x01}, -{WCD9360_DATA_HUB_I2S_CLKSRC_CTL, 0x00}, -{WCD9360_DATA_HUB_I2S_COMMON_CTL, 0x00}, -{WCD9360_DATA_HUB_I2S_0_TDM_CTL, 0x00}, -{WCD9360_DATA_HUB_I2S_0_TDM_CTL2, 0x05}, -{WCD9360_DATA_HUB_I2S_0_TDM_CH_RX, 0x00}, -{WCD9360_DATA_HUB_I2S_0_TDM_CH_TX, 0x00}, -{WCD9360_DATA_HUB_I2S_0_TDM_CFG, 0x00}, -{WCD9360_DATA_HUB_I2S_0_TDM_STRETCH, 0x00}, -{WCD9360_DATA_HUB_I2S_RESET_CTL, 0x00}, -{WCD9360_DMA_RDMA_CTL_0, 0x00}, -{WCD9360_DMA_RDMA_CTL_1, 0x00}, -{WCD9360_DMA_RDMA_CTL_2, 0x00}, -{WCD9360_DMA_RDMA_CTL_3, 0x00}, -{WCD9360_DMA_RDMA_CTL_4, 0x00}, -{WCD9360_DMA_CH_2_3_CFG_RDMA_0, 0xFF}, -{WCD9360_DMA_CH_2_3_CFG_RDMA_1, 0xFF}, -{WCD9360_DMA_CH_2_3_CFG_RDMA_2, 0xFF}, -{WCD9360_DMA_CH_2_3_CFG_RDMA_3, 0xFF}, -{WCD9360_DMA_CH_2_3_CFG_RDMA_4, 0xFF}, -{WCD9360_DMA_CH_0_1_CFG_RDMA_0, 0xFF}, -{WCD9360_DMA_CH_0_1_CFG_RDMA_1, 0xFF}, -{WCD9360_DMA_CH_0_1_CFG_RDMA_2, 0xFF}, -{WCD9360_DMA_CH_0_1_CFG_RDMA_3, 0xFF}, -{WCD9360_DMA_CH_0_1_CFG_RDMA_4, 0xFF}, -{WCD9360_DMA_RDMA4_PRT_CFG, 0x00}, -{WCD9360_DMA_RDMA_SBTX0_7_CFG, 0x00}, -{WCD9360_DMA_RDMA_SBTX8_10_CFG, 0x00}, -{WCD9360_DMA_WDMA_CTL_0, 0x00}, -{WCD9360_DMA_WDMA_CTL_1, 0x00}, -{WCD9360_DMA_WDMA_CTL_2, 0x00}, -{WCD9360_DMA_WDMA_CTL_3, 0x00}, -{WCD9360_DMA_WDMA_CTL_4, 0x00}, -{WCD9360_DMA_CH_4_5_CFG_WDMA_0, 0x00}, -{WCD9360_DMA_CH_4_5_CFG_WDMA_1, 0x00}, -{WCD9360_DMA_CH_4_5_CFG_WDMA_2, 0x00}, -{WCD9360_DMA_CH_4_5_CFG_WDMA_3, 0x00}, -{WCD9360_DMA_CH_4_5_CFG_WDMA_4, 0x00}, -{WCD9360_DMA_CH_2_3_CFG_WDMA_0, 0x00}, -{WCD9360_DMA_CH_2_3_CFG_WDMA_1, 0x00}, -{WCD9360_DMA_CH_2_3_CFG_WDMA_2, 0x00}, -{WCD9360_DMA_CH_2_3_CFG_WDMA_3, 0x00}, -{WCD9360_DMA_CH_2_3_CFG_WDMA_4, 0x00}, -{WCD9360_DMA_CH_0_1_CFG_WDMA_0, 0x00}, -{WCD9360_DMA_CH_0_1_CFG_WDMA_1, 0x00}, -{WCD9360_DMA_CH_0_1_CFG_WDMA_2, 0x00}, -{WCD9360_DMA_CH_0_1_CFG_WDMA_3, 0x00}, -{WCD9360_DMA_CH_0_1_CFG_WDMA_4, 0x00}, -{WCD9360_DMA_WDMA0_PRT_CFG, 0x00}, -{WCD9360_DMA_WDMA3_PRT_CFG, 0x00}, -{WCD9360_DMA_WDMA4_PRT0_3_CFG, 0x00}, -{WCD9360_DMA_WDMA4_PRT4_7_CFG, 0x00}, -{WCD9360_PAGE1_PAGE_REGISTER, 0x00}, -{WCD9360_CPE_FLL_USER_CTL_0, 0x71}, -{WCD9360_CPE_FLL_USER_CTL_1, 0x34}, -{WCD9360_CPE_FLL_USER_CTL_2, 0x0B}, -{WCD9360_CPE_FLL_USER_CTL_3, 0x02}, -{WCD9360_CPE_FLL_USER_CTL_4, 0x04}, -{WCD9360_CPE_FLL_USER_CTL_5, 0x02}, -{WCD9360_CPE_FLL_USER_CTL_6, 0x6E}, -{WCD9360_CPE_FLL_USER_CTL_7, 0x00}, -{WCD9360_CPE_FLL_USER_CTL_8, 0x94}, -{WCD9360_CPE_FLL_USER_CTL_9, 0x50}, -{WCD9360_CPE_FLL_L_VAL_CTL_0, 0x53}, -{WCD9360_CPE_FLL_L_VAL_CTL_1, 0x00}, -{WCD9360_CPE_FLL_DSM_FRAC_CTL_0, 0x00}, -{WCD9360_CPE_FLL_DSM_FRAC_CTL_1, 0xFF}, -{WCD9360_CPE_FLL_CONFIG_CTL_0, 0x6B}, -{WCD9360_CPE_FLL_CONFIG_CTL_1, 0x05}, -{WCD9360_CPE_FLL_CONFIG_CTL_2, 0x20}, -{WCD9360_CPE_FLL_CONFIG_CTL_3, 0x00}, -{WCD9360_CPE_FLL_CONFIG_CTL_4, 0x10}, -{WCD9360_CPE_FLL_TEST_CTL_0, 0x80}, -{WCD9360_CPE_FLL_TEST_CTL_1, 0x00}, -{WCD9360_CPE_FLL_TEST_CTL_2, 0x00}, -{WCD9360_CPE_FLL_TEST_CTL_3, 0x00}, -{WCD9360_CPE_FLL_TEST_CTL_4, 0x00}, -{WCD9360_CPE_FLL_TEST_CTL_5, 0x00}, -{WCD9360_CPE_FLL_TEST_CTL_6, 0x04}, -{WCD9360_CPE_FLL_TEST_CTL_7, 0x33}, -{WCD9360_CPE_FLL_FREQ_CTL_0, 0x00}, -{WCD9360_CPE_FLL_FREQ_CTL_1, 0x00}, -{WCD9360_CPE_FLL_FREQ_CTL_2, 0x00}, -{WCD9360_CPE_FLL_FREQ_CTL_3, 0x00}, -{WCD9360_CPE_FLL_SSC_CTL_0, 0x00}, -{WCD9360_CPE_FLL_SSC_CTL_1, 0x00}, -{WCD9360_CPE_FLL_SSC_CTL_2, 0x00}, -{WCD9360_CPE_FLL_SSC_CTL_3, 0x00}, -{WCD9360_CPE_FLL_FLL_MODE, 0x20}, -{WCD9360_CPE_FLL_STATUS_0, 0x00}, -{WCD9360_CPE_FLL_STATUS_1, 0x00}, -{WCD9360_CPE_FLL_STATUS_2, 0x00}, -{WCD9360_CPE_FLL_STATUS_3, 0x00}, -{WCD9360_I2S_FLL_USER_CTL_0, 0x41}, -{WCD9360_I2S_FLL_USER_CTL_1, 0x94}, -{WCD9360_I2S_FLL_USER_CTL_2, 0x08}, -{WCD9360_I2S_FLL_USER_CTL_3, 0x02}, -{WCD9360_I2S_FLL_USER_CTL_4, 0x04}, -{WCD9360_I2S_FLL_USER_CTL_5, 0x02}, -{WCD9360_I2S_FLL_USER_CTL_6, 0x40}, -{WCD9360_I2S_FLL_USER_CTL_7, 0x00}, -{WCD9360_I2S_FLL_USER_CTL_8, 0x5F}, -{WCD9360_I2S_FLL_USER_CTL_9, 0x02}, -{WCD9360_I2S_FLL_L_VAL_CTL_0, 0x40}, -{WCD9360_I2S_FLL_L_VAL_CTL_1, 0x00}, -{WCD9360_I2S_FLL_DSM_FRAC_CTL_0, 0x00}, -{WCD9360_I2S_FLL_DSM_FRAC_CTL_1, 0xFF}, -{WCD9360_I2S_FLL_CONFIG_CTL_0, 0x6B}, -{WCD9360_I2S_FLL_CONFIG_CTL_1, 0x05}, -{WCD9360_I2S_FLL_CONFIG_CTL_2, 0x20}, -{WCD9360_I2S_FLL_CONFIG_CTL_3, 0x00}, -{WCD9360_I2S_FLL_CONFIG_CTL_4, 0x30}, -{WCD9360_I2S_FLL_TEST_CTL_0, 0x80}, -{WCD9360_I2S_FLL_TEST_CTL_1, 0x00}, -{WCD9360_I2S_FLL_TEST_CTL_2, 0x00}, -{WCD9360_I2S_FLL_TEST_CTL_3, 0x00}, -{WCD9360_I2S_FLL_TEST_CTL_4, 0x00}, -{WCD9360_I2S_FLL_TEST_CTL_5, 0x00}, -{WCD9360_I2S_FLL_TEST_CTL_6, 0x04}, -{WCD9360_I2S_FLL_TEST_CTL_7, 0xFF}, -{WCD9360_I2S_FLL_FREQ_CTL_0, 0x00}, -{WCD9360_I2S_FLL_FREQ_CTL_1, 0x00}, -{WCD9360_I2S_FLL_FREQ_CTL_2, 0x00}, -{WCD9360_I2S_FLL_FREQ_CTL_3, 0x00}, -{WCD9360_I2S_FLL_SSC_CTL_0, 0x00}, -{WCD9360_I2S_FLL_SSC_CTL_1, 0x00}, -{WCD9360_I2S_FLL_SSC_CTL_2, 0x00}, -{WCD9360_I2S_FLL_SSC_CTL_3, 0x00}, -{WCD9360_I2S_FLL_FLL_MODE, 0x00}, -{WCD9360_I2S_FLL_STATUS_0, 0x00}, -{WCD9360_I2S_FLL_STATUS_1, 0x00}, -{WCD9360_I2S_FLL_STATUS_2, 0x00}, -{WCD9360_I2S_FLL_STATUS_3, 0x00}, -{WCD9360_PAGE2_PAGE_REGISTER, 0x00}, -{WCD9360_CPE_SS_CPE_CTL, 0x05}, -{WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_0, 0x01}, -{WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_1, 0x00}, -{WCD9360_CPE_SS_PWR_CPEFLL_CTL, 0x02}, -{WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0, 0xFF}, -{WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1, 0x03}, -{WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0, 0xFF}, -{WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1, 0xFF}, -{WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2, 0xFF}, -{WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3, 0xFF}, -{WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4, 0xFF}, -{WCD9360_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN, 0x07}, -{WCD9360_CPE_SS_US_BUF_INT_PERIOD, 0x5F}, -{WCD9360_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 0x13}, -{WCD9360_CPE_SS_SVA_CFG, 0x41}, -{WCD9360_CPE_SS_US_CFG, 0x00}, -{WCD9360_CPE_SS_MAD_CTL, 0x00}, -{WCD9360_CPE_SS_CPAR_CTL, 0x00}, -{WCD9360_CPE_SS_DMIC0_CTL, 0x00}, -{WCD9360_CPE_SS_DMIC1_CTL, 0x00}, -{WCD9360_CPE_SS_DMIC2_CTL, 0x00}, -{WCD9360_CPE_SS_DMIC_CFG, 0x80}, -{WCD9360_CPE_SS_CPAR_CFG, 0x00}, -{WCD9360_CPE_SS_WDOG_CFG, 0x01}, -{WCD9360_CPE_SS_BACKUP_INT, 0x00}, -{WCD9360_CPE_SS_STATUS, 0x00}, -{WCD9360_CPE_SS_CPE_OCD_CFG, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_MASK_0A, 0xFF}, -{WCD9360_CPE_SS_SS_ERROR_INT_MASK_0B, 0x3F}, -{WCD9360_CPE_SS_SS_ERROR_INT_MASK_1A, 0xFF}, -{WCD9360_CPE_SS_SS_ERROR_INT_MASK_1B, 0x3F}, -{WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0A, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0B, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_STATUS_1A, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_STATUS_1B, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0A, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0B, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_1A, 0x00}, -{WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_1B, 0x00}, -{WCD9360_CPE_SS_DMIC3_CTL, 0x00}, -{WCD9360_CPE_SS_WDOG_RESET, 0x00}, -{WCD9360_CPE_SS_LPASS_MCLK_PRG, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_0, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_1, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_2, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_3, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_4, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_5, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_6, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_7, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_8, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_9, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_10, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_11, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_12, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_13, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_14, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_IN_15, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_0, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_1, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_2, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_3, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_4, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_5, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_6, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_7, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_8, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_9, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_10, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_11, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_12, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_13, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_14, 0x00}, -{WCD9360_CPE_SS_LPASS_IPC_OUT_15, 0x00}, -{WCD9360_CPE_SS_LPASS_ARB_CTL, 0x00}, -{WCD9360_CPE_SS_MEM_DEEPSLEEP_RD_0, 0x00}, -{WCD9360_CPE_SS_MEM_DEEPSLEEP_RD_1, 0x00}, -{WCD9360_CPE_SS_MEM_DEEPSLEEP_BYPASS_0, 0x00}, -{WCD9360_CPE_SS_MEM_DEEPSLEEP_BYPASS_1, 0x00}, -{WCD9360_SOC_MAD_MAIN_CTL_1, 0x00}, -{WCD9360_SOC_MAD_MAIN_CTL_2, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_1, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_2, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_3, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_4, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_5, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_6, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_7, 0x00}, -{WCD9360_SOC_MAD_AUDIO_CTL_8, 0x00}, -{WCD9360_SOC_MAD_AUDIO_IIR_CTL_PTR, 0x00}, -{WCD9360_SOC_MAD_AUDIO_IIR_CTL_VAL, 0x40}, -{WCD9360_SOC_MAD_ULTR_CTL_1, 0x00}, -{WCD9360_SOC_MAD_ULTR_CTL_2, 0x00}, -{WCD9360_SOC_MAD_ULTR_CTL_3, 0x00}, -{WCD9360_SOC_MAD_ULTR_CTL_4, 0x00}, -{WCD9360_SOC_MAD_ULTR_CTL_5, 0x00}, -{WCD9360_SOC_MAD_ULTR_CTL_6, 0x00}, -{WCD9360_SOC_MAD_ULTR_CTL_7, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_1, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_2, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_3, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_4, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_5, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_6, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_7, 0x00}, -{WCD9360_SOC_MAD_BEACON_CTL_8, 0x00}, -{WCD9360_SOC_MAD_BEACON_IIR_CTL_PTR, 0x00}, -{WCD9360_SOC_MAD_BEACON_IIR_CTL_VAL, 0x00}, -{WCD9360_SOC_MAD_INP_SEL, 0x00}, -{WCD9360_SOC_MAD_MAD2_INP_SEL, 0x00}, -{WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_CTRL, 0x00}, -{WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_STATUS, 0x00}, -{WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_FS, 0x00}, -{WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_IN_SEL, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT0, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT1, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT2, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT3, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT4, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT5, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT6, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT7, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT8, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT9, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT10, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT11, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT12, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT13, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT14, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT15, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT0, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT1, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT2, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT3, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT4, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT5, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT6, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT7, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT8, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT9, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT10, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT11, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT12, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT13, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT14, 0x00}, -{WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT15, 0x00}, -{WCD9360_PAGE4_PAGE_REGISTER, 0x00}, -{WCD9360_INTR_CFG, 0x00}, -{WCD9360_INTR_CLR_COMMIT, 0x00}, -{WCD9360_INTR_PIN1_MASK0, 0xFF}, -{WCD9360_INTR_PIN1_MASK1, 0xFF}, -{WCD9360_INTR_PIN1_MASK2, 0xFF}, -{WCD9360_INTR_PIN1_MASK3, 0xFF}, -{WCD9360_INTR_PIN1_STATUS0, 0x00}, -{WCD9360_INTR_PIN1_STATUS1, 0x00}, -{WCD9360_INTR_PIN1_STATUS2, 0x00}, -{WCD9360_INTR_PIN1_STATUS3, 0x00}, -{WCD9360_INTR_PIN1_CLEAR0, 0x00}, -{WCD9360_INTR_PIN1_CLEAR1, 0x00}, -{WCD9360_INTR_PIN1_CLEAR2, 0x00}, -{WCD9360_INTR_PIN1_CLEAR3, 0x00}, -{WCD9360_INTR_PIN2_MASK3, 0xFF}, -{WCD9360_INTR_PIN2_STATUS3, 0x00}, -{WCD9360_INTR_PIN2_CLEAR3, 0x00}, -{WCD9360_INTR_CPESS_SUMRY_MASK2, 0xFF}, -{WCD9360_INTR_CPESS_SUMRY_MASK3, 0xFF}, -{WCD9360_INTR_CPESS_SUMRY_STATUS2, 0x00}, -{WCD9360_INTR_CPESS_SUMRY_STATUS3, 0x00}, -{WCD9360_INTR_CPESS_SUMRY_CLEAR2, 0x00}, -{WCD9360_INTR_CPESS_SUMRY_CLEAR3, 0x00}, -{WCD9360_INTR_LEVEL0, 0x3B}, -{WCD9360_INTR_LEVEL1, 0x00}, -{WCD9360_INTR_LEVEL2, 0xD0}, -{WCD9360_INTR_LEVEL3, 0x00}, -{WCD9360_INTR_BYPASS0, 0x00}, -{WCD9360_INTR_BYPASS1, 0x00}, -{WCD9360_INTR_BYPASS2, 0x00}, -{WCD9360_INTR_BYPASS3, 0x00}, -{WCD9360_INTR_SET0, 0x00}, -{WCD9360_INTR_SET1, 0x00}, -{WCD9360_INTR_SET2, 0x00}, -{WCD9360_INTR_SET3, 0x00}, -{WCD9360_INTR_CODEC_MISC_MASK, 0x73}, -{WCD9360_INTR_CODEC_MISC_STATUS, 0x00}, -{WCD9360_INTR_CODEC_MISC_CLEAR, 0x00}, -{WCD9360_ANA_PAGE_REGISTER, 0x00}, -{WCD9360_ANA_BIAS, 0x00}, -{WCD9360_ANA_RCO, 0x00}, -{WCD9360_ANA_BUCK_CTL, 0x00}, -{WCD9360_ANA_BUCK_STATUS, 0x00}, -{WCD9360_ANA_EAR, 0x00}, -{WCD9360_ANA_MAD_SETUP, 0x01}, -{WCD9360_ANA_AMIC1, 0x20}, -{WCD9360_ANA_AMIC2, 0x00}, -{WCD9360_ANA_AMIC3, 0x20}, -{WCD9360_ANA_AMIC4, 0x00}, -{WCD9360_ANA_MICB1, 0x10}, -{WCD9360_ANA_MICB2, 0x10}, -{WCD9360_ANA_MICB3, 0x10}, -{WCD9360_ANA_MICB4, 0x10}, -{WCD9360_BIAS_CTL, 0x2A}, -{WCD9360_BIAS_VBG_FINE_ADJ, 0x55}, -{WCD9360_RCO_CTRL_1, 0x44}, -{WCD9360_RCO_CTRL_2, 0x48}, -{WCD9360_RCO_CAL, 0x00}, -{WCD9360_RCO_CAL_1, 0x00}, -{WCD9360_RCO_CAL_2, 0x00}, -{WCD9360_RCO_TEST_CTRL, 0x00}, -{WCD9360_RCO_CAL_OUT_1, 0x00}, -{WCD9360_RCO_CAL_OUT_2, 0x00}, -{WCD9360_RCO_CAL_OUT_3, 0x00}, -{WCD9360_RCO_CAL_OUT_4, 0x00}, -{WCD9360_RCO_CAL_OUT_5, 0x00}, -{WCD9360_SIDO_MODE_1, 0x84}, -{WCD9360_SIDO_MODE_2, 0xFE}, -{WCD9360_SIDO_MODE_3, 0xF6}, -{WCD9360_SIDO_MODE_4, 0x56}, -{WCD9360_SIDO_VCL_1, 0x00}, -{WCD9360_SIDO_VCL_2, 0x6C}, -{WCD9360_SIDO_VCL_3, 0x44}, -{WCD9360_SIDO_CCL_1, 0x57}, -{WCD9360_SIDO_CCL_2, 0x92}, -{WCD9360_SIDO_CCL_3, 0x35}, -{WCD9360_SIDO_CCL_4, 0x61}, -{WCD9360_SIDO_CCL_5, 0x6D}, -{WCD9360_SIDO_CCL_6, 0x60}, -{WCD9360_SIDO_CCL_7, 0x6F}, -{WCD9360_SIDO_CCL_8, 0x6F}, -{WCD9360_SIDO_CCL_9, 0x6E}, -{WCD9360_SIDO_CCL_10, 0x26}, -{WCD9360_SIDO_FILTER_1, 0x92}, -{WCD9360_SIDO_FILTER_2, 0x54}, -{WCD9360_SIDO_DRIVER_1, 0x77}, -{WCD9360_SIDO_DRIVER_2, 0x55}, -{WCD9360_SIDO_DRIVER_3, 0x55}, -{WCD9360_SIDO_CAL_CODE_EXT_1, 0x9C}, -{WCD9360_SIDO_CAL_CODE_EXT_2, 0x82}, -{WCD9360_SIDO_CAL_CODE_OUT_1, 0x00}, -{WCD9360_SIDO_CAL_CODE_OUT_2, 0x00}, -{WCD9360_SIDO_TEST_1, 0x00}, -{WCD9360_SIDO_TEST_2, 0x00}, -{WCD9360_LDOH_MODE, 0x2B}, -{WCD9360_LDOH_BIAS, 0x68}, -{WCD9360_LDOH_STB_LOADS, 0x00}, -{WCD9360_LDOH_SLOWRAMP, 0x50}, -{WCD9360_MICB1_TEST_CTL_1, 0x1A}, -{WCD9360_MICB1_TEST_CTL_2, 0x18}, -{WCD9360_MICB1_TEST_CTL_3, 0xA4}, -{WCD9360_MICB2_TEST_CTL_1, 0x1A}, -{WCD9360_MICB2_TEST_CTL_2, 0x18}, -{WCD9360_MICB2_TEST_CTL_3, 0xA4}, -{WCD9360_MICB3_TEST_CTL_1, 0x1A}, -{WCD9360_MICB3_TEST_CTL_2, 0x18}, -{WCD9360_MICB3_TEST_CTL_3, 0xA4}, -{WCD9360_MICB4_TEST_CTL_1, 0x1A}, -{WCD9360_MICB4_TEST_CTL_2, 0x18}, -{WCD9360_MICB4_TEST_CTL_3, 0xA4}, -{WCD9360_TX_COM_ADC_VCM, 0x39}, -{WCD9360_TX_COM_BIAS_ATEST, 0xC0}, -{WCD9360_TX_COM_ADC_INT1_IB, 0x6F}, -{WCD9360_TX_COM_ADC_INT2_IB, 0x4F}, -{WCD9360_TX_COM_TXFE_DIV_CTL, 0x2E}, -{WCD9360_TX_COM_TXFE_DIV_START, 0x00}, -{WCD9360_TX_COM_TXFE_DIV_STOP_9P6M, 0xC7}, -{WCD9360_TX_COM_TXFE_DIV_STOP_12P288M, 0xFF}, -{WCD9360_TX_1_2_TEST_EN, 0xCC}, -{WCD9360_TX_1_2_ADC_IB, 0x09}, -{WCD9360_TX_1_2_ATEST_REFCTL, 0x0A}, -{WCD9360_TX_1_2_TEST_CTL, 0x38}, -{WCD9360_TX_1_2_TEST_BLK_EN, 0xFF}, -{WCD9360_TX_1_2_TXFE_CLKDIV, 0x00}, -{WCD9360_TX_1_2_SAR1_ERR, 0x00}, -{WCD9360_TX_1_2_SAR2_ERR, 0x00}, -{WCD9360_TX_3_4_TEST_EN, 0xCC}, -{WCD9360_TX_3_4_ADC_IB, 0x09}, -{WCD9360_TX_3_4_ATEST_REFCTL, 0x0A}, -{WCD9360_TX_3_4_TEST_CTL, 0x38}, -{WCD9360_TX_3_4_TEST_BLK_EN, 0xFF}, -{WCD9360_TX_3_4_TXFE_CLKDIV, 0x00}, -{WCD9360_TX_3_4_SAR1_ERR, 0x00}, -{WCD9360_TX_3_4_SAR2_ERR, 0x00}, -{WCD9360_RX_RX_EAR_BIAS_CON_1, 0x2A}, -{WCD9360_RX_RX_EAR_BIAS_CON_2, 0x8A}, -{WCD9360_RX_RX_AUX_BIAS_CON_1, 0x2A}, -{WCD9360_RX_RX_AUX_BIAS_CON_2, 0x8A}, -{WCD9360_RX_RX_BIAS_ATEST, 0x0C}, -{WCD9360_RX_RXTOP_RESERVED, 0x00}, -{WCD9360_EAR_EAR_EN_REG, 0x22}, -{WCD9360_EAR_EAR_PA_CON, 0x44}, -{WCD9360_EAR_EAR_SP_CON, 0xDB}, -{WCD9360_EAR_EAR_DAC_CON, 0x00}, -{WCD9360_EAR_EAR_CNP_FSM_CON, 0xB6}, -{WCD9360_EAR_DAC_CTL_TEST, 0x00}, -{WCD9360_EAR_STATUS_REG, 0x00}, -{WCD9360_EAR_EAR_COMPANDER_CON, 0x02}, -{WCD9360_ANA_NEW_PAGE_REGISTER, 0x00}, -{WCD9360_CLK_SYS_PLL_ENABLES, 0x00}, -{WCD9360_CLK_SYS_PLL_PRESET, 0x00}, -{WCD9360_CLK_SYS_PLL_STATUS, 0x00}, -{WCD9360_CLK_SYS_MCLK_PRG, 0x10}, -{WCD9360_CLK_SYS_MCLK2_PRG1, 0x00}, -{WCD9360_CLK_SYS_MCLK_MISC, 0x00}, -{WCD9360_SIDO_NEW_VOUT_A_STARTUP, 0x17}, -{WCD9360_SIDO_NEW_VOUT_D_STARTUP, 0x0D}, -{WCD9360_SIDO_NEW_VOUT_D_FREQ1, 0x07}, -{WCD9360_SIDO_NEW_VOUT_D_FREQ2, 0x00}, -{WCD9360_AUX_ANA_EAR, 0x00}, -{WCD9360_LDORXTX_LDORXTX, 0x10}, -{WCD9360_DIE_CRACK_CTL, 0x00}, -{WCD9360_DIE_CRACK_OUT, 0x00}, -{WCD9360_LOOP_BACK_EN, 0x00}, -{WCD9360_CLK_SYS_INT_POST_DIV_REG0, 0x00}, -{WCD9360_CLK_SYS_INT_POST_DIV_REG1, 0x00}, -{WCD9360_CLK_SYS_INT_REF_DIV_REG0, 0x00}, -{WCD9360_CLK_SYS_INT_REF_DIV_REG1, 0x00}, -{WCD9360_CLK_SYS_INT_FILTER_REG0, 0x00}, -{WCD9360_CLK_SYS_INT_FILTER_REG1, 0x00}, -{WCD9360_CLK_SYS_INT_PLL_L_VAL, 0x00}, -{WCD9360_CLK_SYS_INT_PLL_M_VAL, 0x00}, -{WCD9360_CLK_SYS_INT_PLL_N_VAL, 0x00}, -{WCD9360_CLK_SYS_INT_TEST_REG0, 0x00}, -{WCD9360_CLK_SYS_INT_PFD_CP_DSM_PROG, 0x00}, -{WCD9360_CLK_SYS_INT_VCO_PROG, 0x00}, -{WCD9360_CLK_SYS_INT_TEST_REG1, 0x00}, -{WCD9360_CLK_SYS_INT_LDO_LOCK_CFG, 0x00}, -{WCD9360_CLK_SYS_INT_DIG_LOCK_DET_CFG, 0x00}, -{WCD9360_CLK_SYS_INT_CLK_TEST1, 0x00}, -{WCD9360_CLK_SYS_INT_CLK_TEST2, 0x00}, -{WCD9360_CLK_SYS_INT_CLK_TEST3, 0x00}, -{WCD9360_SIDO_NEW_INT_RAMP_STATUS, 0x00}, -{WCD9360_SIDO_NEW_INT_SPARE_1, 0x00}, -{WCD9360_SIDO_NEW_INT_DEBUG_VOUT_SETTING_A, 0x64}, -{WCD9360_SIDO_NEW_INT_DEBUG_VOUT_SETTING_D, 0x40}, -{WCD9360_SIDO_NEW_INT_RAMP_INC_WAIT, 0x24}, -{WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_CTL, 0x09}, -{WCD9360_SIDO_NEW_INT_RAMP_IBLEED_CTL, 0x7D}, -{WCD9360_SIDO_NEW_INT_DEBUG_CPROVR_TEST, 0x00}, -{WCD9360_SIDO_NEW_INT_RAMP_CTL_A, 0x14}, -{WCD9360_SIDO_NEW_INT_RAMP_CTL_D, 0x14}, -{WCD9360_SIDO_NEW_INT_RAMP_TIMEOUT_PERIOD, 0x33}, -{WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING1, 0x3F}, -{WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING2, 0x74}, -{WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING3, 0x33}, -{WCD9360_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL1, 0x1D}, -{WCD9360_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL2, 0x0A}, -{WCD9360_EAR_INT_NEW_EAR_CHOPPER_CON, 0xA8}, -{WCD9360_EAR_INT_NEW_EAR_VCM_GEN_CON1, 0x42}, -{WCD9360_EAR_INT_NEW_EAR_VCM_GEN_CON2, 0x22}, -{WCD9360_EAR_INT_NEW_EAR_DYNAMIC_BIAS, 0x00}, -{WCD9360_AUX_INT_AUX_EN_REG, 0x22}, -{WCD9360_AUX_INT_AUX_PA_CON, 0x46}, -{WCD9360_AUX_INT_AUX_SP_CON, 0xD2}, -{WCD9360_AUX_INT_AUX_DAC_CON, 0x00}, -{WCD9360_AUX_INT_AUX_CNP_FSM_CON, 0xB6}, -{WCD9360_AUX_INT_AUX_TEST, 0x00}, -{WCD9360_AUX_INT_STATUS_REG, 0x00}, -{WCD9360_AUX_INT_AUX_MISC, 0x00}, -{WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL1, 0xFF}, -{WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL2, 0xD8}, -{WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL3, 0x80}, -{WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL4, 0xFF}, -{WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL5, 0x09}, -{WCD9360_LDORXTX_INT_ANA_LDORXTX_STATUS, 0x00}, -{WCD9360_DIE_CRACK_INT_INT1, 0x02}, -{WCD9360_DIE_CRACK_INT_INT2, 0x60}, -{WCD9360_LOOP_BACK_INT_SPARE, 0x00}, -{WCD9360_PAGE10_PAGE_REGISTER, 0x00}, -{WCD9360_CDC_ANC0_CLK_RESET_CTL, 0x00}, -{WCD9360_CDC_ANC0_MODE_1_CTL, 0x00}, -{WCD9360_CDC_ANC0_MODE_2_CTL, 0x00}, -{WCD9360_CDC_ANC0_FF_SHIFT, 0x00}, -{WCD9360_CDC_ANC0_FB_SHIFT, 0x00}, -{WCD9360_CDC_ANC0_LPF_FF_A_CTL, 0x00}, -{WCD9360_CDC_ANC0_LPF_FF_B_CTL, 0x00}, -{WCD9360_CDC_ANC0_LPF_FB_CTL, 0x00}, -{WCD9360_CDC_ANC0_SMLPF_CTL, 0x00}, -{WCD9360_CDC_ANC0_DCFLT_SHIFT_CTL, 0x00}, -{WCD9360_CDC_ANC0_IIR_ADAPT_CTL, 0x00}, -{WCD9360_CDC_ANC0_IIR_COEFF_1_CTL, 0x00}, -{WCD9360_CDC_ANC0_IIR_COEFF_2_CTL, 0x00}, -{WCD9360_CDC_ANC0_FF_A_GAIN_CTL, 0x00}, -{WCD9360_CDC_ANC0_FF_B_GAIN_CTL, 0x00}, -{WCD9360_CDC_ANC0_FB_GAIN_CTL, 0x00}, -{WCD9360_CDC_TX0_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX0_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX0_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX0_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX0_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX0_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX0_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX0_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX0_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX0_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX0_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX0_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX0_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX1_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX1_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX1_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX1_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX1_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX1_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX1_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX1_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX1_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX1_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX1_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX1_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX1_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX2_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX2_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX2_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX2_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX2_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX2_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX2_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX2_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX2_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX2_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX2_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX2_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX2_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX3_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX3_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX3_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX3_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX3_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX3_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX3_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX3_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX3_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX3_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX3_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX3_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX3_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX4_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX4_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX4_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX4_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX4_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX4_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX4_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX4_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX4_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX4_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX4_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX4_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX4_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX5_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX5_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX5_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX5_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX5_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX5_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX5_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX5_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX5_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX5_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX5_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX5_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX5_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX6_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX6_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX6_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX6_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX6_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX6_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX6_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX6_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX6_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX6_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX6_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX6_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX6_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX7_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX7_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX7_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX7_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX7_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX7_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX7_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX7_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX7_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX7_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX7_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX7_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX7_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX8_TX_PATH_CTL, 0x04}, -{WCD9360_CDC_TX8_TX_PATH_CFG0, 0x10}, -{WCD9360_CDC_TX8_TX_PATH_CFG1, 0x03}, -{WCD9360_CDC_TX8_TX_VOL_CTL, 0x00}, -{WCD9360_CDC_TX8_TX_PATH_192_CTL, 0x00}, -{WCD9360_CDC_TX8_TX_PATH_192_CFG, 0x00}, -{WCD9360_CDC_TX8_TX_PATH_SEC0, 0x00}, -{WCD9360_CDC_TX8_TX_PATH_SEC1, 0x00}, -{WCD9360_CDC_TX8_TX_PATH_SEC2, 0x01}, -{WCD9360_CDC_TX8_TX_PATH_SEC3, 0x3C}, -{WCD9360_CDC_TX8_TX_PATH_SEC4, 0x20}, -{WCD9360_CDC_TX8_TX_PATH_SEC5, 0x00}, -{WCD9360_CDC_TX8_TX_PATH_SEC6, 0x00}, -{WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL, 0x02}, -{WCD9360_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x00}, -{WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL, 0x02}, -{WCD9360_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x00}, -{WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL, 0x02}, -{WCD9360_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x00}, -{WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL, 0x02}, -{WCD9360_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x00}, -{WCD9360_PAGE11_PAGE_REGISTER, 0x00}, -{WCD9360_CDC_COMPANDER0_CTL0, 0x60}, -{WCD9360_CDC_COMPANDER0_CTL1, 0xDB}, -{WCD9360_CDC_COMPANDER0_CTL2, 0xFF}, -{WCD9360_CDC_COMPANDER0_CTL3, 0x35}, -{WCD9360_CDC_COMPANDER0_CTL4, 0xFF}, -{WCD9360_CDC_COMPANDER0_CTL5, 0x00}, -{WCD9360_CDC_COMPANDER0_CTL6, 0x01}, -{WCD9360_CDC_COMPANDER0_CTL7, 0x06}, -{WCD9360_CDC_COMPANDER7_CTL0, 0x60}, -{WCD9360_CDC_COMPANDER7_CTL1, 0xDB}, -{WCD9360_CDC_COMPANDER7_CTL2, 0xFF}, -{WCD9360_CDC_COMPANDER7_CTL3, 0x35}, -{WCD9360_CDC_COMPANDER7_CTL4, 0xFF}, -{WCD9360_CDC_COMPANDER7_CTL5, 0x00}, -{WCD9360_CDC_COMPANDER7_CTL6, 0x01}, -{WCD9360_CDC_COMPANDER7_CTL7, 0x06}, -{WCD9360_CDC_COMPANDER8_CTL0, 0x60}, -{WCD9360_CDC_COMPANDER8_CTL1, 0xDB}, -{WCD9360_CDC_COMPANDER8_CTL2, 0xFF}, -{WCD9360_CDC_COMPANDER8_CTL3, 0x35}, -{WCD9360_CDC_COMPANDER8_CTL4, 0xFF}, -{WCD9360_CDC_COMPANDER8_CTL5, 0x00}, -{WCD9360_CDC_COMPANDER8_CTL6, 0x01}, -{WCD9360_CDC_COMPANDER8_CTL7, 0x06}, -{WCD9360_CDC_RX0_RX_PATH_CTL, 0x04}, -{WCD9360_CDC_RX0_RX_PATH_CFG0, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_CFG1, 0x64}, -{WCD9360_CDC_RX0_RX_PATH_CFG2, 0x80}, -{WCD9360_CDC_RX0_RX_VOL_CTL, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_MIX_CTL, 0x04}, -{WCD9360_CDC_RX0_RX_PATH_MIX_CFG, 0x12}, -{WCD9360_CDC_RX0_RX_VOL_MIX_CTL, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_SEC0, 0xFC}, -{WCD9360_CDC_RX0_RX_PATH_SEC1, 0x08}, -{WCD9360_CDC_RX0_RX_PATH_SEC2, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_SEC3, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_SEC5, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_SEC6, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_SEC7, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_MIX_SEC0, 0x08}, -{WCD9360_CDC_RX0_RX_PATH_MIX_SEC1, 0x00}, -{WCD9360_CDC_RX0_RX_PATH_DSMDEM_CTL, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_CTL, 0x04}, -{WCD9360_CDC_RX9_RX_PATH_CFG0, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_CFG1, 0x64}, -{WCD9360_CDC_RX9_RX_PATH_CFG2, 0x80}, -{WCD9360_CDC_RX9_RX_VOL_CTL, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_MIX_CTL, 0x04}, -{WCD9360_CDC_RX9_RX_PATH_MIX_CFG, 0x12}, -{WCD9360_CDC_RX9_RX_VOL_MIX_CTL, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_SEC0, 0xFC}, -{WCD9360_CDC_RX9_RX_PATH_SEC1, 0x08}, -{WCD9360_CDC_RX9_RX_PATH_SEC2, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_SEC3, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_SEC5, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_SEC6, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_SEC7, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_MIX_SEC0, 0x08}, -{WCD9360_CDC_RX9_RX_PATH_MIX_SEC1, 0x00}, -{WCD9360_CDC_RX9_RX_PATH_DSMDEM_CTL, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_CTL, 0x04}, -{WCD9360_CDC_RX7_RX_PATH_CFG0, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_CFG1, 0x64}, -{WCD9360_CDC_RX7_RX_PATH_CFG2, 0x80}, -{WCD9360_CDC_RX7_RX_VOL_CTL, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_MIX_CTL, 0x04}, -{WCD9360_CDC_RX7_RX_PATH_MIX_CFG, 0x12}, -{WCD9360_CDC_RX7_RX_VOL_MIX_CTL, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_SEC0, 0x04}, -{WCD9360_CDC_RX7_RX_PATH_SEC1, 0x08}, -{WCD9360_CDC_RX7_RX_PATH_SEC2, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_SEC3, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_SEC5, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_SEC6, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_SEC7, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_MIX_SEC0, 0x08}, -{WCD9360_CDC_RX7_RX_PATH_MIX_SEC1, 0x00}, -{WCD9360_CDC_RX7_RX_PATH_DSMDEM_CTL, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_CTL, 0x04}, -{WCD9360_CDC_RX8_RX_PATH_CFG0, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_CFG1, 0x64}, -{WCD9360_CDC_RX8_RX_PATH_CFG2, 0x80}, -{WCD9360_CDC_RX8_RX_VOL_CTL, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_MIX_CTL, 0x04}, -{WCD9360_CDC_RX8_RX_PATH_MIX_CFG, 0x12}, -{WCD9360_CDC_RX8_RX_VOL_MIX_CTL, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_SEC0, 0x04}, -{WCD9360_CDC_RX8_RX_PATH_SEC1, 0x08}, -{WCD9360_CDC_RX8_RX_PATH_SEC2, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_SEC3, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_SEC5, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_SEC6, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_SEC7, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_MIX_SEC0, 0x08}, -{WCD9360_CDC_RX8_RX_PATH_MIX_SEC1, 0x00}, -{WCD9360_CDC_RX8_RX_PATH_DSMDEM_CTL, 0x00}, -{WCD9360_PAGE12_PAGE_REGISTER, 0x00}, -{WCD9360_CDC_BOOST0_BOOST_PATH_CTL, 0x00}, -{WCD9360_CDC_BOOST0_BOOST_CTL, 0xD0}, -{WCD9360_CDC_BOOST0_BOOST_CFG1, 0x89}, -{WCD9360_CDC_BOOST0_BOOST_CFG2, 0x04}, -{WCD9360_CDC_BOOST1_BOOST_PATH_CTL, 0x00}, -{WCD9360_CDC_BOOST1_BOOST_CTL, 0xD0}, -{WCD9360_CDC_BOOST1_BOOST_CFG1, 0x89}, -{WCD9360_CDC_BOOST1_BOOST_CFG2, 0x04}, -{WCD9360_MIXING_ASRC2_CLK_RST_CTL, 0x00}, -{WCD9360_MIXING_ASRC2_CTL0, 0x00}, -{WCD9360_MIXING_ASRC2_CTL1, 0x00}, -{WCD9360_MIXING_ASRC2_FIFO_CTL, 0xA8}, -{WCD9360_MIXING_ASRC2_STATUS_FMIN_CNTR_LSB, 0x00}, -{WCD9360_MIXING_ASRC2_STATUS_FMIN_CNTR_MSB, 0x00}, -{WCD9360_MIXING_ASRC2_STATUS_FMAX_CNTR_LSB, 0x00}, -{WCD9360_MIXING_ASRC2_STATUS_FMAX_CNTR_MSB, 0x00}, -{WCD9360_MIXING_ASRC2_STATUS_FIFO, 0x00}, -{WCD9360_MIXING_ASRC3_CLK_RST_CTL, 0x00}, -{WCD9360_MIXING_ASRC3_CTL0, 0x00}, -{WCD9360_MIXING_ASRC3_CTL1, 0x00}, -{WCD9360_MIXING_ASRC3_FIFO_CTL, 0xA8}, -{WCD9360_MIXING_ASRC3_STATUS_FMIN_CNTR_LSB, 0x00}, -{WCD9360_MIXING_ASRC3_STATUS_FMIN_CNTR_MSB, 0x00}, -{WCD9360_MIXING_ASRC3_STATUS_FMAX_CNTR_LSB, 0x00}, -{WCD9360_MIXING_ASRC3_STATUS_FMAX_CNTR_MSB, 0x00}, -{WCD9360_MIXING_ASRC3_STATUS_FIFO, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_DATA_0, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_DATA_1, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_DATA_2, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_DATA_3, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_ADDR_0, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_ADDR_1, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_ADDR_2, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_WR_ADDR_3, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_ADDR_0, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_ADDR_1, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_ADDR_2, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_ADDR_3, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_DATA_0, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_DATA_1, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_DATA_2, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_RD_DATA_3, 0x00}, -{WCD9360_SWR_AHB_BRIDGE_ACCESS_CFG, 0x0F}, -{WCD9360_SWR_AHB_BRIDGE_ACCESS_STATUS, 0x03}, -{WCD9360_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04}, -{WCD9360_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00}, -{WCD9360_SIDETONE_ASRC0_CLK_RST_CTL, 0x00}, -{WCD9360_SIDETONE_ASRC0_CTL0, 0x00}, -{WCD9360_SIDETONE_ASRC0_CTL1, 0x00}, -{WCD9360_SIDETONE_ASRC0_FIFO_CTL, 0xA8}, -{WCD9360_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, -{WCD9360_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, -{WCD9360_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, -{WCD9360_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, -{WCD9360_SIDETONE_ASRC0_STATUS_FIFO, 0x00}, -{WCD9360_EC_REF_HQ0_EC_REF_HQ_PATH_CTL, 0x00}, -{WCD9360_EC_REF_HQ0_EC_REF_HQ_CFG0, 0x01}, -{WCD9360_EC_REF_HQ1_EC_REF_HQ_PATH_CTL, 0x00}, -{WCD9360_EC_REF_HQ1_EC_REF_HQ_CFG0, 0x01}, -{WCD9360_EC_ASRC0_CLK_RST_CTL, 0x00}, -{WCD9360_EC_ASRC0_CTL0, 0x00}, -{WCD9360_EC_ASRC0_CTL1, 0x00}, -{WCD9360_EC_ASRC0_FIFO_CTL, 0xA8}, -{WCD9360_EC_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00}, -{WCD9360_EC_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00}, -{WCD9360_EC_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00}, -{WCD9360_EC_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00}, -{WCD9360_EC_ASRC0_STATUS_FIFO, 0x00}, -{WCD9360_EC_ASRC1_CLK_RST_CTL, 0x00}, -{WCD9360_EC_ASRC1_CTL0, 0x00}, -{WCD9360_EC_ASRC1_CTL1, 0x00}, -{WCD9360_EC_ASRC1_FIFO_CTL, 0xA8}, -{WCD9360_EC_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00}, -{WCD9360_EC_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00}, -{WCD9360_EC_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00}, -{WCD9360_EC_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00}, -{WCD9360_EC_ASRC1_STATUS_FIFO, 0x00}, -{WCD9360_PAGE13_PAGE_REGISTER, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG1, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG1, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG1, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG1, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG1, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG2, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG3, 0x00}, -{WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG4, 0x00}, -{WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 0x00}, -{WCD9360_CDC_RX_INP_MUX_ANC_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 0x00}, -{WCD9360_CDC_RX_INP_MUX_EC_REF_HQ_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0x00}, -{WCD9360_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0x00}, -{WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00}, -{WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1, 0x00}, -{WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2, 0x00}, -{WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3, 0x00}, -{WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0, 0x00}, -{WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1, 0x00}, -{WCD9360_CDC_IF_ROUTER_TX_MUX_CFG2, 0x00}, -{WCD9360_CDC_IF_ROUTER_TX_MUX_CFG3, 0x00}, -{WCD9360_CDC_CLK_RST_CTRL_MCLK_CONTROL, 0x00}, -{WCD9360_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00}, -{WCD9360_CDC_CLK_RST_CTRL_SWR_CONTROL, 0x00}, -{WCD9360_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL, 0x0A}, -{WCD9360_CDC_PROX_DETECT_PROX_CTL, 0x08}, -{WCD9360_CDC_PROX_DETECT_PROX_POLL_PERIOD0, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_POLL_PERIOD1, 0x4B}, -{WCD9360_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_STATUS, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_TEST_CTRL, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD, 0x00}, -{WCD9360_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_PATH_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_CTL, 0x40}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00}, -{WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00}, -{WCD9360_CDC_TOP_TOP_CFG0, 0x00}, -{WCD9360_CDC_TOP_TOP_CFG1, 0x00}, -{WCD9360_CDC_TOP_TOP_CFG7, 0x00}, -{WCD9360_CDC_TOP_EAR_COMP_WR_LSB, 0x00}, -{WCD9360_CDC_TOP_EAR_COMP_WR_MSB, 0x00}, -{WCD9360_CDC_TOP_EAR_COMP_LUT, 0x00}, -{WCD9360_CDC_TOP_EAR_COMP_RD_LSB, 0x00}, -{WCD9360_CDC_TOP_EAR_COMP_RD_MSB, 0x00}, -{WCD9360_CDC_TOP_TOP_DEBUG, 0x00}, -{WCD9360_PAGE80_PAGE_REGISTER, 0x00}, -{WCD9360_CODEC_CPR_WR_DATA_0, 0x00}, -{WCD9360_CODEC_CPR_WR_DATA_1, 0x00}, -{WCD9360_CODEC_CPR_WR_DATA_2, 0x00}, -{WCD9360_CODEC_CPR_WR_DATA_3, 0x00}, -{WCD9360_CODEC_CPR_WR_ADDR_0, 0x00}, -{WCD9360_CODEC_CPR_WR_ADDR_1, 0x00}, -{WCD9360_CODEC_CPR_WR_ADDR_2, 0x00}, -{WCD9360_CODEC_CPR_WR_ADDR_3, 0x00}, -{WCD9360_CODEC_CPR_RD_ADDR_0, 0x00}, -{WCD9360_CODEC_CPR_RD_ADDR_1, 0x00}, -{WCD9360_CODEC_CPR_RD_ADDR_2, 0x00}, -{WCD9360_CODEC_CPR_RD_ADDR_3, 0x00}, -{WCD9360_CODEC_CPR_RD_DATA_0, 0x00}, -{WCD9360_CODEC_CPR_RD_DATA_1, 0x00}, -{WCD9360_CODEC_CPR_RD_DATA_2, 0x00}, -{WCD9360_CODEC_CPR_RD_DATA_3, 0x00}, -{WCD9360_CODEC_CPR_ACCESS_CFG, 0x0F}, -{WCD9360_CODEC_CPR_ACCESS_STATUS, 0x03}, -{WCD9360_CODEC_CPR_NOM_CX_VDD, 0xB4}, -{WCD9360_CODEC_CPR_SVS_CX_VDD, 0x7C}, -{WCD9360_CODEC_CPR_SVS2_CX_VDD, 0x58}, -{WCD9360_CODEC_CPR_NOM_MX_VDD, 0xB4}, -{WCD9360_CODEC_CPR_SVS_MX_VDD, 0xB4}, -{WCD9360_CODEC_CPR_SVS2_MX_VDD, 0xA0}, -{WCD9360_CODEC_CPR_SVS2_MIN_CX_VDD, 0x2C}, -{WCD9360_CODEC_CPR_MAX_SVS2_STEP, 0x08}, -{WCD9360_CODEC_CPR_CTL, 0x00}, -{WCD9360_CODEC_CPR_SW_MODECHNG_STATUS, 0x00}, -{WCD9360_CODEC_CPR_SW_MODECHNG_START, 0x00}, -{WCD9360_CODEC_CPR_CPR_STATUS, 0x00}, -{WCD9360_PAGE128_PAGE_REGISTER, 0x00}, -{WCD9360_TLMM_JTCK_PINCFG, 0x00}, -{WCD9360_TLMM_INTR1_PINCFG, 0x00}, -{WCD9360_TLMM_INTR2_PINCFG, 0x00}, -{WCD9360_TLMM_SWR_DATA_PINCFG, 0x00}, -{WCD9360_TLMM_SWR_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_SLIMBUS_DATA1_PINCFG, 0x00}, -{WCD9360_TLMM_SLIMBUS_DATA2_PINCFG, 0x00}, -{WCD9360_TLMM_SLIMBUS_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_I2C_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_I2C_DATA_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_0_RX_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_0_TX_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_0_SCK_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_0_WS_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_1_RX_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_1_TX_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_1_SCK_PINCFG, 0x00}, -{WCD9360_TLMM_I2S_1_WS_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC1_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC1_DATA_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC2_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC2_DATA_PINCFG, 0x00}, -{WCD9360_TLMM_GPIO1_PINCFG, 0x00}, -{WCD9360_TLMM_GPIO2_PINCFG, 0x00}, -{WCD9360_TLMM_GPIO3_PINCFG, 0x00}, -{WCD9360_TLMM_GPIO4_PINCFG, 0x00}, -{WCD9360_TLMM_SPI_S_CSN_PINCFG, 0x00}, -{WCD9360_TLMM_SPI_S_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_SPI_S_DOUT_PINCFG, 0x00}, -{WCD9360_TLMM_SPI_S_DIN_PINCFG, 0x00}, -{WCD9360_TLMM_GPIO0_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC3_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC3_DATA_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC4_CLK_PINCFG, 0x00}, -{WCD9360_TLMM_DMIC4_DATA_PINCFG, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_OE_0, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_OE_1, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_OE_2, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_OE_3, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_OE_4, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_DATA_0, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_DATA_1, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_DATA_2, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_DATA_3, 0x00}, -{WCD9360_TEST_DEBUG_PIN_CTL_DATA_4, 0x00}, -{WCD9360_TEST_DEBUG_PAD_DRVCTL_0, 0x00}, -{WCD9360_TEST_DEBUG_PAD_DRVCTL_1, 0x00}, -{WCD9360_TEST_DEBUG_PIN_STATUS, 0x00}, -{WCD9360_TEST_DEBUG_NPL_DLY_TEST_1, 0x10}, -{WCD9360_TEST_DEBUG_NPL_DLY_TEST_2, 0x60}, -{WCD9360_TEST_DEBUG_MEM_CTRL, 0x00}, -{WCD9360_TEST_DEBUG_DEBUG_BUS_SEL, 0x00}, -{WCD9360_TEST_DEBUG_DEBUG_JTAG, 0x00}, -{WCD9360_TEST_DEBUG_DEBUG_EN_1, 0x00}, -{WCD9360_TEST_DEBUG_DEBUG_EN_2, 0x00}, -{WCD9360_TEST_DEBUG_DEBUG_EN_3, 0x00}, -{WCD9360_TEST_DEBUG_DEBUG_EN_4, 0x00}, -{WCD9360_TEST_DEBUG_DEBUG_EN_5, 0x00}, -{WCD9360_TEST_DEBUG_ANA_DTEST_DIR, 0x00}, -{WCD9360_TEST_DEBUG_PAD_INP_DISABLE_0, 0x00}, -{WCD9360_TEST_DEBUG_PAD_INP_DISABLE_1, 0x00}, -{WCD9360_TEST_DEBUG_PAD_INP_DISABLE_2, 0x00}, -{WCD9360_TEST_DEBUG_PAD_INP_DISABLE_3, 0x00}, -{WCD9360_TEST_DEBUG_PAD_INP_DISABLE_4, 0x00}, -{WCD9360_TEST_DEBUG_SYSMEM_CTRL, 0x00}, -{WCD9360_TEST_DEBUG_LVAL_NOM_LOW, 0x96}, -{WCD9360_TEST_DEBUG_LVAL_NOM_HIGH, 0x00}, -{WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_LOW, 0x53}, -{WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_HIGH, 0x00}, -{WCD9360_TEST_DEBUG_SPI_SLAVE_CHAR, 0x00}, -{WCD9360_TEST_DEBUG_CODEC_DIAGS, 0x00}, -}; - - -const u8 wcd9360_page0_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE0_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_RPM_CLK_BYPASS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_RPM_CLK_GATE)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_RPM_CLK_MCLK_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_RPM_CLK_MCLK2_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_RPM_I2S_DSD_CLK_SEL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_RPM_RST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_EFUSE_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_EFUSE_TEST0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_EFUSE_TEST1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_EFUSE_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_I2C_ACTIVE)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_ALT_FUNC_EN)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_GPIO_CTL_OE)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CHIP_TIER_CTRL_GPIO_CTL_DATA)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX0_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX1_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX2_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX3_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX4_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX5_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX6_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_RX7_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX0_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX1_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX2_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX3_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX4_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX5_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX6_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX7_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX8_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX9_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX10_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX11_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX12_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX13_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX14_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_SB_TX15_INP_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_TX0_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_TX0_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_TX1_0_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_TX1_1_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_DATA_HUB_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_1_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_CTL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_1_CTL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_CLKSRC_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_COMMON_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_TDM_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_TDM_CTL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_TDM_CH_RX)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_TDM_CH_TX)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_TDM_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_0_TDM_STRETCH)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DATA_HUB_I2S_RESET_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_RDMA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_RDMA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_RDMA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_RDMA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_RDMA_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_RDMA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_RDMA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_RDMA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_RDMA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_RDMA_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA4_PRT_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA_SBTX0_7_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_RDMA_SBTX8_10_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_4_5_CFG_WDMA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_4_5_CFG_WDMA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_4_5_CFG_WDMA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_4_5_CFG_WDMA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_4_5_CFG_WDMA_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_WDMA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_WDMA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_WDMA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_WDMA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_2_3_CFG_WDMA_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_WDMA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_WDMA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_WDMA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_WDMA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_CH_0_1_CFG_WDMA_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA0_PRT_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA3_PRT_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA4_PRT0_3_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DMA_WDMA4_PRT4_7_CFG)] = WCD9360_RW, -}; - -const u8 wcd9360_page1_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE1_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_8)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_USER_CTL_9)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_L_VAL_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_L_VAL_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_DSM_FRAC_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_DSM_FRAC_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_CONFIG_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_CONFIG_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_CONFIG_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_CONFIG_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_CONFIG_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_TEST_CTL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_FREQ_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_FREQ_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_FREQ_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_FREQ_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_SSC_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_SSC_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_SSC_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_SSC_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_FLL_MODE)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_FLL_STATUS_0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_FLL_STATUS_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_FLL_STATUS_2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_FLL_STATUS_3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_8)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_USER_CTL_9)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_L_VAL_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_L_VAL_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_DSM_FRAC_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_DSM_FRAC_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_CONFIG_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_CONFIG_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_CONFIG_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_CONFIG_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_CONFIG_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_TEST_CTL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_FREQ_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_FREQ_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_FREQ_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_FREQ_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_SSC_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_SSC_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_SSC_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_SSC_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_FLL_MODE)] = WCD9360_RW, -[WCD9360_REG(WCD9360_I2S_FLL_STATUS_0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_I2S_FLL_STATUS_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_I2S_FLL_STATUS_2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_I2S_FLL_STATUS_3)] = WCD9360_RO, -}; - -const u8 wcd9360_page2_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE2_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_CPE_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPEFLL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_US_BUF_INT_PERIOD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_SVA_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_US_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_MAD_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_CPAR_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_DMIC0_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_DMIC1_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_DMIC2_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_DMIC_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_CPAR_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_WDOG_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_BACKUP_INT)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_STATUS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_CPE_OCD_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_MASK_0A)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_MASK_0B)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_MASK_1A)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_MASK_1B)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0A)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0B)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_STATUS_1A)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_STATUS_1B)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0A)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0B)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_1A)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_1B)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_DMIC3_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_WDOG_RESET)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_MCLK_PRG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_0)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_1)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_2)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_3)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_4)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_5)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_6)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_7)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_8)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_9)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_10)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_11)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_12)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_13)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_14)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_IN_15)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_4)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_5)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_6)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_7)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_8)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_9)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_10)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_11)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_12)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_13)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_14)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_IPC_OUT_15)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_LPASS_ARB_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_MEM_DEEPSLEEP_RD_0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_MEM_DEEPSLEEP_RD_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CPE_SS_MEM_DEEPSLEEP_BYPASS_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CPE_SS_MEM_DEEPSLEEP_BYPASS_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_MAIN_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_MAIN_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_CTL_8)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_IIR_CTL_PTR)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_AUDIO_IIR_CTL_VAL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_ULTR_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_ULTR_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_ULTR_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_ULTR_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_ULTR_CTL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_ULTR_CTL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_ULTR_CTL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_CTL_8)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_IIR_CTL_PTR)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_BEACON_IIR_CTL_VAL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_INP_SEL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SOC_MAD_MAD2_INP_SEL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_CTRL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_STATUS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_FS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_IN_SEL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT4)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT5)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT6)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT7)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT8)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT9)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT10)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT11)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT12)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT13)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT14)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT15)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT4)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT5)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT6)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT7)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT8)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT9)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT10)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT11)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT12)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT13)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT14)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT15)] = WCD9360_RO, -}; - -const u8 wcd9360_page4_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE4_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_CLR_COMMIT)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_PIN1_MASK0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_PIN1_MASK1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_PIN1_MASK2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_PIN1_MASK3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_PIN1_STATUS0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_PIN1_STATUS1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_PIN1_STATUS2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_PIN1_STATUS3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_PIN1_CLEAR0)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_PIN1_CLEAR1)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_PIN1_CLEAR2)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_PIN1_CLEAR3)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_PIN2_MASK3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_PIN2_STATUS3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_PIN2_CLEAR3)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_CPESS_SUMRY_MASK2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_CPESS_SUMRY_MASK3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_CPESS_SUMRY_STATUS2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_CPESS_SUMRY_STATUS3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_CPESS_SUMRY_CLEAR2)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_CPESS_SUMRY_CLEAR3)] = WCD9360_WO, -[WCD9360_REG(WCD9360_INTR_LEVEL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_LEVEL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_LEVEL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_LEVEL3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_BYPASS0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_BYPASS1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_BYPASS2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_BYPASS3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_SET0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_SET1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_SET2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_SET3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_CODEC_MISC_MASK)] = WCD9360_RW, -[WCD9360_REG(WCD9360_INTR_CODEC_MISC_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_INTR_CODEC_MISC_CLEAR)] = WCD9360_WO, -}; - -const u8 wcd9360_page6_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_ANA_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_BIAS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_AMIC_INPUT_SWITCH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_RCO)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_BUCK_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_BUCK_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_ANA_EAR)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_MAD_SETUP)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_AMIC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_AMIC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_AMIC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_AMIC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_MICB1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_MICB2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_MICB3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_ANA_MICB4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_BIAS_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_BIAS_VBG_FINE_ADJ)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RCO_CTRL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RCO_CTRL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RCO_CAL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RCO_CAL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RCO_CAL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RCO_TEST_CTRL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RCO_CAL_OUT_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_RCO_CAL_OUT_2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_RCO_CAL_OUT_3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_RCO_CAL_OUT_4)] = WCD9360_RO, -[WCD9360_REG(WCD9360_RCO_CAL_OUT_5)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDO_MODE_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_MODE_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_MODE_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_MODE_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_VCL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_VCL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_VCL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_8)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_9)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CCL_10)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_FILTER_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_FILTER_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_DRIVER_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_DRIVER_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_DRIVER_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CAL_CODE_EXT_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CAL_CODE_EXT_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_CAL_CODE_OUT_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDO_CAL_CODE_OUT_2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDO_TEST_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_TEST_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDOH_MODE)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDOH_BIAS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDOH_STB_LOADS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDOH_SLOWRAMP)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB1_TEST_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB1_TEST_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB1_TEST_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB2_TEST_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB2_TEST_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB2_TEST_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB3_TEST_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB3_TEST_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB3_TEST_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB4_TEST_CTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB4_TEST_CTL_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MICB4_TEST_CTL_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_ADC_VCM)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_BIAS_ATEST)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_ADC_INT1_IB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_ADC_INT2_IB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_TXFE_DIV_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_TXFE_DIV_START)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_TXFE_DIV_STOP_9P6M)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_COM_TXFE_DIV_STOP_12P288M)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_1_2_TEST_EN)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_1_2_ADC_IB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_1_2_ATEST_REFCTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_1_2_TEST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_1_2_TEST_BLK_EN)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_1_2_TXFE_CLKDIV)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_1_2_SAR1_ERR)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TX_1_2_SAR2_ERR)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TX_3_4_TEST_EN)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_3_4_ADC_IB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_3_4_ATEST_REFCTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_3_4_TEST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_3_4_TEST_BLK_EN)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_3_4_TXFE_CLKDIV)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TX_3_4_SAR1_ERR)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TX_3_4_SAR2_ERR)] = WCD9360_RO, -[WCD9360_REG(WCD9360_RX_RX_EAR_BIAS_CON_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RX_RX_EAR_BIAS_CON_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RX_RX_AUX_BIAS_CON_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RX_RX_AUX_BIAS_CON_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RX_RX_BIAS_ATEST)] = WCD9360_RW, -[WCD9360_REG(WCD9360_RX_RXTOP_RESERVED)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_EAR_EN_REG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_EAR_PA_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_EAR_SP_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_EAR_DAC_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_EAR_CNP_FSM_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_DAC_CTL_TEST)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_STATUS_REG)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EAR_EAR_COMPANDER_CON)] = WCD9360_RW, -}; - -const u8 wcd9360_page7_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_ANA_NEW_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_PLL_ENABLES)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_PLL_PRESET)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_PLL_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CLK_SYS_MCLK_PRG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_MCLK2_PRG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_MCLK_MISC)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_VOUT_A_STARTUP)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_VOUT_D_STARTUP)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_VOUT_D_FREQ1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_VOUT_D_FREQ2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_ANA_EAR)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDORXTX_LDORXTX)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DIE_CRACK_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DIE_CRACK_OUT)] = WCD9360_RO, -[WCD9360_REG(WCD9360_LOOP_BACK_EN)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_POST_DIV_REG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_POST_DIV_REG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_REF_DIV_REG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_REF_DIV_REG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_FILTER_REG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_FILTER_REG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_PLL_L_VAL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_PLL_M_VAL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_PLL_N_VAL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_TEST_REG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_PFD_CP_DSM_PROG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_VCO_PROG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_TEST_REG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_LDO_LOCK_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_DIG_LOCK_DET_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_CLK_TEST1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_CLK_TEST2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CLK_SYS_INT_CLK_TEST3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_RAMP_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_SPARE_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_DEBUG_VOUT_SETTING_A)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_DEBUG_VOUT_SETTING_D)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_RAMP_INC_WAIT)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_RAMP_IBLEED_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_DEBUG_CPROVR_TEST)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_RAMP_CTL_A)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_RAMP_CTL_D)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_RAMP_TIMEOUT_PERIOD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_INT_NEW_EAR_CHOPPER_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_INT_NEW_EAR_VCM_GEN_CON1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_INT_NEW_EAR_VCM_GEN_CON2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EAR_INT_NEW_EAR_DYNAMIC_BIAS)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_INT_AUX_EN_REG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_INT_AUX_PA_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_INT_AUX_SP_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_INT_AUX_DAC_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_INT_AUX_CNP_FSM_CON)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_INT_AUX_TEST)] = WCD9360_RW, -[WCD9360_REG(WCD9360_AUX_INT_STATUS_REG)] = WCD9360_RO, -[WCD9360_REG(WCD9360_AUX_INT_AUX_MISC)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LDORXTX_INT_ANA_LDORXTX_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_DIE_CRACK_INT_INT1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_DIE_CRACK_INT_INT2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_LOOP_BACK_INT_SPARE)] = WCD9360_RW, -}; - -const u8 wcd9360_page10_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE10_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_CLK_RESET_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_MODE_1_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_MODE_2_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_FF_SHIFT)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_FB_SHIFT)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_LPF_FF_A_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_LPF_FF_B_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_LPF_FB_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_SMLPF_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_DCFLT_SHIFT_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_IIR_ADAPT_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_IIR_COEFF_1_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_IIR_COEFF_2_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_FF_A_GAIN_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_FF_B_GAIN_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_ANC0_FB_GAIN_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX0_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX1_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX2_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX3_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX4_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX5_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX6_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX7_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_192_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_192_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_SEC4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX8_TX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX9_SPKR_PROT_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX10_SPKR_PROT_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX11_SPKR_PROT_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX12_SPKR_PROT_PATH_CFG0)] = WCD9360_RW, -}; - -const u8 wcd9360_page11_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE11_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL6)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_COMPANDER0_CTL7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL6)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_COMPANDER7_CTL7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL6)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_COMPANDER8_CTL7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_MIX_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_VOL_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_SEC7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_MIX_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_MIX_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX0_RX_PATH_DSMDEM_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_MIX_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_VOL_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_SEC7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_MIX_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_MIX_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX9_RX_PATH_DSMDEM_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_MIX_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_VOL_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_SEC7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_MIX_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_MIX_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX7_RX_PATH_DSMDEM_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_VOL_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_MIX_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_VOL_MIX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_SEC2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_SEC3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_SEC5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_SEC6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_SEC7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_MIX_SEC0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_MIX_SEC1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX8_RX_PATH_DSMDEM_CTL)] = WCD9360_RW, -}; - -const u8 wcd9360_page12_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE12_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST0_BOOST_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST0_BOOST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST0_BOOST_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST0_BOOST_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST1_BOOST_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST1_BOOST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST1_BOOST_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_BOOST1_BOOST_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC2_CLK_RST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC2_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC2_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC2_FIFO_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC2_STATUS_FMIN_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC2_STATUS_FMIN_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC2_STATUS_FMAX_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC2_STATUS_FMAX_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC2_STATUS_FIFO)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC3_CLK_RST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC3_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC3_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC3_FIFO_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_MIXING_ASRC3_STATUS_FMIN_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC3_STATUS_FMIN_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC3_STATUS_FMAX_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC3_STATUS_FMAX_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_MIXING_ASRC3_STATUS_FIFO)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_DATA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_DATA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_DATA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_DATA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_ADDR_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_ADDR_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_ADDR_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_WR_ADDR_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_ADDR_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_ADDR_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_ADDR_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_ADDR_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_DATA_0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_DATA_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_DATA_2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_RD_DATA_3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_ACCESS_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SWR_AHB_BRIDGE_ACCESS_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_CLK_RST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_FIFO_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_SIDETONE_ASRC0_STATUS_FIFO)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_REF_HQ0_EC_REF_HQ_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_REF_HQ0_EC_REF_HQ_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_REF_HQ1_EC_REF_HQ_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_REF_HQ1_EC_REF_HQ_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC0_CLK_RST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC0_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC0_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC0_FIFO_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC0_STATUS_FMIN_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC0_STATUS_FMIN_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC0_STATUS_FMAX_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC0_STATUS_FMAX_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC0_STATUS_FIFO)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC1_CLK_RST_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC1_CTL0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC1_CTL1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC1_FIFO_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_EC_ASRC1_STATUS_FMIN_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC1_STATUS_FMIN_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC1_STATUS_FMAX_CNTR_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC1_STATUS_FMAX_CNTR_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_EC_ASRC1_STATUS_FIFO)] = WCD9360_RO, -}; - -const u8 wcd9360_page13_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE13_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_ANC_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_RX_INP_MUX_EC_REF_HQ_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX5_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX6_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX7_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX8_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX10_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TX_INP_MUX_ADC_MUX11_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_IF_ROUTER_TX_MUX_CFG2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_IF_ROUTER_TX_MUX_CFG3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_CLK_RST_CTRL_MCLK_CONTROL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_CLK_RST_CTRL_FS_CNT_CONTROL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_CLK_RST_CTRL_SWR_CONTROL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_POLL_PERIOD0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_POLL_PERIOD1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_TEST_CTRL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_PATH_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TOP_TOP_CFG0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TOP_TOP_CFG1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TOP_TOP_CFG7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TOP_EAR_COMP_WR_LSB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TOP_EAR_COMP_WR_MSB)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TOP_EAR_COMP_LUT)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CDC_TOP_EAR_COMP_RD_LSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_TOP_EAR_COMP_RD_MSB)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CDC_TOP_TOP_DEBUG)] = WCD9360_RW, -}; - -const u8 wcd9360_page80_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE80_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_DATA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_DATA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_DATA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_DATA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_ADDR_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_ADDR_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_ADDR_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_WR_ADDR_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_ADDR_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_ADDR_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_ADDR_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_ADDR_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_DATA_0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_DATA_1)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_DATA_2)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CODEC_CPR_RD_DATA_3)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CODEC_CPR_ACCESS_CFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_ACCESS_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CODEC_CPR_NOM_CX_VDD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_SVS_CX_VDD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_SVS2_CX_VDD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_NOM_MX_VDD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_SVS_MX_VDD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_SVS2_MX_VDD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_SVS2_MIN_CX_VDD)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_MAX_SVS2_STEP)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_CTL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_CODEC_CPR_SW_MODECHNG_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_CODEC_CPR_SW_MODECHNG_START)] = WCD9360_WO, -[WCD9360_REG(WCD9360_CODEC_CPR_CPR_STATUS)] = WCD9360_RW, -}; - -const u8 wcd9360_page128_reg_access[WCD9360_PAGE_SIZE] = { -[WCD9360_REG(WCD9360_PAGE128_PAGE_REGISTER)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_JTCK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_INTR1_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_INTR2_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SWR_DATA_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SWR_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SLIMBUS_DATA1_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SLIMBUS_DATA2_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SLIMBUS_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2C_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2C_DATA_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_0_RX_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_0_TX_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_0_SCK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_0_WS_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_1_RX_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_1_TX_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_1_SCK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_I2S_1_WS_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC1_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC1_DATA_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC2_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC2_DATA_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_GPIO1_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_GPIO2_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_GPIO3_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_GPIO4_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SPI_S_CSN_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SPI_S_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SPI_S_DOUT_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_SPI_S_DIN_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_GPIO0_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC3_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC3_DATA_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC4_CLK_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TLMM_DMIC4_DATA_PINCFG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_OE_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_OE_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_OE_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_OE_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_OE_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_DATA_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_DATA_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_DATA_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_DATA_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_CTL_DATA_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_DRVCTL_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_DRVCTL_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PIN_STATUS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TEST_DEBUG_NPL_DLY_TEST_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_NPL_DLY_TEST_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_MEM_CTRL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_BUS_SEL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_JTAG)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_EN_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_EN_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_EN_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_EN_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_EN_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_ANA_DTEST_DIR)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_INP_DISABLE_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_INP_DISABLE_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_INP_DISABLE_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_INP_DISABLE_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_INP_DISABLE_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_SYSMEM_CTRL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_LVAL_NOM_LOW)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_LVAL_NOM_HIGH)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_LOW)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_HIGH)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_SPI_SLAVE_CHAR)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_CODEC_DIAGS)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TEST_DEBUG_PAD_TEST)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_0)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_1)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_2)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_3)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_4)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_5)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_6)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_7)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_8)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_9)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_10)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_11)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_12)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_13)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_14)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_15)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_16)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_17)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_18)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_19)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_20)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_21)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_22)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_23)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_24)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_25)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_26)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_27)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_28)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_29)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_30)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_31)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_RD_CTRL)] = WCD9360_RW, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_RD_7_0)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_RD_15_8)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_RD_23_16)] = WCD9360_RO, -[WCD9360_REG(WCD9360_TEST_DEBUG_DEBUG_MUX_RD_31_24)] = WCD9360_RO, - -}; - -const u8 * const wcd9360_reg[WCD9360_PAGE_MAX] = { -[WCD9360_PAGE_0] = wcd9360_page0_reg_access, -[WCD9360_PAGE_1] = wcd9360_page1_reg_access, -[WCD9360_PAGE_2] = wcd9360_page2_reg_access, -[WCD9360_PAGE_4] = wcd9360_page4_reg_access, -[WCD9360_PAGE_6] = wcd9360_page6_reg_access, -[WCD9360_PAGE_7] = wcd9360_page7_reg_access, -[WCD9360_PAGE_10] = wcd9360_page10_reg_access, -[WCD9360_PAGE_11] = wcd9360_page11_reg_access, -[WCD9360_PAGE_12] = wcd9360_page12_reg_access, -[WCD9360_PAGE_13] = wcd9360_page13_reg_access, -[WCD9360_PAGE_80] = wcd9360_page80_reg_access, -[WCD9360_PAGE_128] = wcd9360_page128_reg_access, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.c b/techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.c deleted file mode 100644 index 37536f86c54c..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.c +++ /dev/null @@ -1,1357 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "wcd9360.h" -#include "wcd9360-dsp-cntl.h" -#include "../wcd9xxx-irq.h" -#include "../core.h" - -#define WCD_CNTL_DIR_NAME_LEN_MAX 32 -#define WCD_CPE_FLL_MAX_RETRIES 5 -#define WCD_MEM_ENABLE_MAX_RETRIES 20 -#define WCD_DSP_BOOT_TIMEOUT_MS 3000 -#define WCD_SYSFS_ENTRY_MAX_LEN 8 -#define WCD_PROCFS_ENTRY_MAX_LEN 16 -#define WCD_9360_RAMDUMP_START_ADDR 0x20100000 -#define WCD_9360_RAMDUMP_SIZE ((1024 * 1024) - 128) -#define WCD_MISCDEV_CMD_MAX_LEN 2 - -#define WCD_CNTL_MUTEX_LOCK(codec, lock) \ -{ \ - dev_dbg(codec->dev, "%s: mutex_lock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_lock(&lock); \ -} - -#define WCD_CNTL_MUTEX_UNLOCK(codec, lock) \ -{ \ - dev_dbg(codec->dev, "%s: mutex_unlock(%s)\n", \ - __func__, __stringify_1(lock)); \ - mutex_unlock(&lock); \ -} - -enum wcd_mem_type { - WCD_MEM_TYPE_ALWAYS_ON, - WCD_MEM_TYPE_SWITCHABLE, -}; - -struct wcd_cntl_attribute { - struct attribute attr; - ssize_t (*show)(struct wcd_dsp_cntl *cntl, char *buf); - ssize_t (*store)(struct wcd_dsp_cntl *cntl, const char *buf, - ssize_t count); -}; - -#define WCD_CNTL_ATTR(_name, _mode, _show, _store) \ -static struct wcd_cntl_attribute cntl_attr_##_name = { \ - .attr = {.name = __stringify(_name), .mode = _mode}, \ - .show = _show, \ - .store = _store, \ -} - -#define to_wcd_cntl_attr(a) \ - container_of((a), struct wcd_cntl_attribute, attr) - -#define to_wcd_cntl(kobj) \ - container_of((kobj), struct wcd_dsp_cntl, wcd_kobj) - -static u8 mem_enable_values[] = { - 0xFE, 0xFC, 0xF8, 0xF0, - 0xE0, 0xC0, 0x80, 0x00, -}; - -static ssize_t wdsp_boot_show(struct wcd_dsp_cntl *cntl, char *buf) -{ - return snprintf(buf, WCD_SYSFS_ENTRY_MAX_LEN, - "%u", cntl->boot_reqs); -} - -static ssize_t wdsp_boot_store(struct wcd_dsp_cntl *cntl, - const char *buf, ssize_t count) -{ - u32 val; - bool vote; - int ret; - - ret = kstrtou32(buf, 10, &val); - if (ret) { - dev_err(cntl->codec->dev, - "%s: Invalid entry, ret = %d\n", __func__, ret); - return -EINVAL; - } - - if (val > 0) { - cntl->boot_reqs++; - vote = true; - } else { - cntl->boot_reqs--; - vote = false; - } - - if (cntl->m_dev && cntl->m_ops && - cntl->m_ops->vote_for_dsp) - ret = cntl->m_ops->vote_for_dsp(cntl->m_dev, vote); - else - ret = -EINVAL; - - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: failed to %s dsp\n", __func__, - vote ? "enable" : "disable"); - return count; -} - -WCD_CNTL_ATTR(boot, 0660, wdsp_boot_show, wdsp_boot_store); - -static ssize_t wcd_cntl_sysfs_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct wcd_cntl_attribute *wcd_attr = to_wcd_cntl_attr(attr); - struct wcd_dsp_cntl *cntl = to_wcd_cntl(kobj); - ssize_t ret = -EINVAL; - - if (cntl && wcd_attr->show) - ret = wcd_attr->show(cntl, buf); - - return ret; -} - -static ssize_t wcd_cntl_sysfs_store(struct kobject *kobj, - struct attribute *attr, const char *buf, - size_t count) -{ - struct wcd_cntl_attribute *wcd_attr = to_wcd_cntl_attr(attr); - struct wcd_dsp_cntl *cntl = to_wcd_cntl(kobj); - ssize_t ret = -EINVAL; - - if (cntl && wcd_attr->store) - ret = wcd_attr->store(cntl, buf, count); - - return ret; -} - -static const struct sysfs_ops wcd_cntl_sysfs_ops = { - .show = wcd_cntl_sysfs_show, - .store = wcd_cntl_sysfs_store, -}; - -static struct kobj_type wcd_cntl_ktype = { - .sysfs_ops = &wcd_cntl_sysfs_ops, -}; - -static void wcd_cntl_change_online_state(struct wcd_dsp_cntl *cntl, - u8 online) -{ - struct wdsp_ssr_entry *ssr_entry = &cntl->ssr_entry; - unsigned long ret; - - WCD_CNTL_MUTEX_LOCK(cntl->codec, cntl->ssr_mutex); - ssr_entry->offline = !online; - /* Make sure the write is complete */ - wmb(); - ret = xchg(&ssr_entry->offline_change, 1); - wake_up_interruptible(&ssr_entry->offline_poll_wait); - dev_dbg(cntl->codec->dev, - "%s: requested %u, offline %u offline_change %u, ret = %ldn", - __func__, online, ssr_entry->offline, - ssr_entry->offline_change, ret); - WCD_CNTL_MUTEX_UNLOCK(cntl->codec, cntl->ssr_mutex); -} - -static ssize_t wdsp_ssr_entry_read(struct snd_info_entry *entry, - void *file_priv_data, struct file *file, - char __user *buf, size_t count, loff_t pos) -{ - int len = 0; - char buffer[WCD_PROCFS_ENTRY_MAX_LEN]; - struct wcd_dsp_cntl *cntl; - struct wdsp_ssr_entry *ssr_entry; - ssize_t ret; - u8 offline; - - cntl = (struct wcd_dsp_cntl *) entry->private_data; - if (!cntl) { - pr_err("%s: Invalid private data for SSR procfs entry\n", - __func__); - return -EINVAL; - } - - ssr_entry = &cntl->ssr_entry; - - WCD_CNTL_MUTEX_LOCK(cntl->codec, cntl->ssr_mutex); - offline = ssr_entry->offline; - /* Make sure the read is complete */ - rmb(); - dev_dbg(cntl->codec->dev, "%s: offline = %s\n", __func__, - offline ? "true" : "false"); - len = snprintf(buffer, sizeof(buffer), "%s\n", - offline ? "OFFLINE" : "ONLINE"); - ret = simple_read_from_buffer(buf, count, &pos, buffer, len); - WCD_CNTL_MUTEX_UNLOCK(cntl->codec, cntl->ssr_mutex); - - return ret; -} - -static unsigned int wdsp_ssr_entry_poll(struct snd_info_entry *entry, - void *private_data, struct file *file, - poll_table *wait) -{ - struct wcd_dsp_cntl *cntl; - struct wdsp_ssr_entry *ssr_entry; - unsigned int ret = 0; - - if (!entry || !entry->private_data) { - pr_err("%s: %s is NULL\n", __func__, - (!entry) ? "entry" : "private_data"); - return -EINVAL; - } - - cntl = (struct wcd_dsp_cntl *) entry->private_data; - ssr_entry = &cntl->ssr_entry; - - dev_dbg(cntl->codec->dev, "%s: Poll wait, offline = %u\n", - __func__, ssr_entry->offline); - poll_wait(file, &ssr_entry->offline_poll_wait, wait); - dev_dbg(cntl->codec->dev, "%s: Woken up Poll wait, offline = %u\n", - __func__, ssr_entry->offline); - - WCD_CNTL_MUTEX_LOCK(cntl->codec, cntl->ssr_mutex); - if (xchg(&ssr_entry->offline_change, 0)) - ret = POLLIN | POLLPRI | POLLRDNORM; - dev_dbg(cntl->codec->dev, "%s: ret (%d) from poll_wait\n", - __func__, ret); - WCD_CNTL_MUTEX_UNLOCK(cntl->codec, cntl->ssr_mutex); - - return ret; -} - -static struct snd_info_entry_ops wdsp_ssr_entry_ops = { - .read = wdsp_ssr_entry_read, - .poll = wdsp_ssr_entry_poll, -}; - -static int wcd_cntl_cpe_fll_calibrate(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0, retry = 0; - u8 cal_lsb, cal_msb; - u8 lock_det; - - /* Make sure clocks are gated */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPE_CTL, - 0x05, 0x00); - - /* Enable CPE FLL reference clock */ - snd_soc_update_bits(codec, WCD9360_CLK_SYS_MCLK2_PRG1, - 0x80, 0x80); - - snd_soc_update_bits(codec, WCD9360_CPE_FLL_USER_CTL_5, - 0xF3, 0x13); - snd_soc_write(codec, WCD9360_CPE_FLL_L_VAL_CTL_0, 0x50); - - /* Disable CPAR reset and Enable CPAR clk */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, - 0x02, 0x02); - - /* Write calibration l-value based on cdc clk rate */ - if (cntl->clk_rate == 9600000) { - cal_lsb = 0x6d; - cal_msb = 0x00; - } else { - cal_lsb = 0x56; - cal_msb = 0x00; - } - snd_soc_write(codec, WCD9360_CPE_FLL_USER_CTL_6, cal_lsb); - snd_soc_write(codec, WCD9360_CPE_FLL_USER_CTL_7, cal_msb); - - /* FLL mode to follow power up sequence */ - snd_soc_update_bits(codec, WCD9360_CPE_FLL_FLL_MODE, - 0x60, 0x00); - - /* HW controlled CPE FLL */ - snd_soc_update_bits(codec, WCD9360_CPE_FLL_FLL_MODE, - 0x80, 0x80); - - /* Force on CPE FLL */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CFG, - 0x04, 0x04); - - do { - /* Time for FLL calibration to complete */ - usleep_range(1000, 1100); - lock_det = snd_soc_read(codec, WCD9360_CPE_FLL_STATUS_3); - retry++; - } while (!(lock_det & 0x01) && - retry <= WCD_CPE_FLL_MAX_RETRIES); - - if (!(lock_det & 0x01)) { - dev_err(codec->dev, "%s: lock detect not set, 0x%02x\n", - __func__, lock_det); - ret = -EIO; - goto err_lock_det; - } - - snd_soc_update_bits(codec, WCD9360_CPE_FLL_FLL_MODE, - 0x60, 0x20); - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CFG, - 0x04, 0x00); - return ret; - -err_lock_det: - /* Undo the register settings */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CFG, - 0x04, 0x00); - snd_soc_update_bits(codec, WCD9360_CPE_FLL_FLL_MODE, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, - 0x02, 0x00); - return ret; -} - -static void wcd_cntl_config_cpar(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - u8 nom_lo, nom_hi, svs2_lo, svs2_hi; - - /* Configure CPAR */ - nom_hi = svs2_hi = 0; - if (cntl->clk_rate == 9600000) { - nom_lo = 0x90; - svs2_lo = 0x50; - } else { - nom_lo = 0x70; - svs2_lo = 0x3e; - } - - snd_soc_write(codec, WCD9360_TEST_DEBUG_LVAL_NOM_LOW, nom_lo); - snd_soc_write(codec, WCD9360_TEST_DEBUG_LVAL_NOM_HIGH, nom_hi); - snd_soc_write(codec, WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_LOW, svs2_lo); - snd_soc_write(codec, WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_HIGH, svs2_hi); - - snd_soc_update_bits(codec, WCD9360_CPE_SS_PWR_CPEFLL_CTL, - 0x03, 0x03); -} - -static int wcd_cntl_cpe_fll_ctrl(struct wcd_dsp_cntl *cntl, - bool enable) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - if (enable) { - ret = wcd_cntl_cpe_fll_calibrate(cntl); - if (ret < 0) { - dev_err(codec->dev, - "%s: cpe_fll_cal failed, err = %d\n", - __func__, ret); - goto done; - } - - wcd_cntl_config_cpar(cntl); - - /* Enable AHB CLK and CPE CLK*/ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPE_CTL, - 0x05, 0x05); - } else { - /* Disable AHB CLK and CPE CLK */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPE_CTL, - 0x05, 0x00); - /* Reset the CPAR mode for CPE FLL */ - snd_soc_write(codec, WCD9360_CPE_FLL_FLL_MODE, 0x20); - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CFG, - 0x04, 0x00); - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, - 0x02, 0x00); - } -done: - return ret; -} - -static int wcd_cntl_clocks_enable(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret; - - WCD_CNTL_MUTEX_LOCK(codec, cntl->clk_mutex); - /* Enable codec clock */ - if (cntl->cdc_cb && cntl->cdc_cb->cdc_clk_en) - ret = cntl->cdc_cb->cdc_clk_en(codec, true); - else - ret = -EINVAL; - - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to enable cdc clk, err = %d\n", - __func__, ret); - goto done; - } - /* Pull CPAR out of reset */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, 0x04, 0x00); - - /* Configure and Enable CPE FLL clock */ - ret = wcd_cntl_cpe_fll_ctrl(cntl, true); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to enable cpe clk, err = %d\n", - __func__, ret); - goto err_cpe_clk; - } - cntl->is_clk_enabled = true; - - /* Ungate the CPR clock */ - snd_soc_update_bits(codec, WCD9360_CODEC_RPM_CLK_GATE, 0x10, 0x00); -done: - WCD_CNTL_MUTEX_UNLOCK(codec, cntl->clk_mutex); - return ret; - -err_cpe_clk: - if (cntl->cdc_cb && cntl->cdc_cb->cdc_clk_en) - cntl->cdc_cb->cdc_clk_en(codec, false); - - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, 0x04, 0x04); - WCD_CNTL_MUTEX_UNLOCK(codec, cntl->clk_mutex); - return ret; -} - -static int wcd_cntl_clocks_disable(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - WCD_CNTL_MUTEX_LOCK(codec, cntl->clk_mutex); - if (!cntl->is_clk_enabled) { - dev_info(codec->dev, "%s: clocks already disabled\n", - __func__); - goto done; - } - - /* Gate the CPR clock */ - snd_soc_update_bits(codec, WCD9360_CODEC_RPM_CLK_GATE, 0x10, 0x10); - - /* Disable CPE FLL clock */ - ret = wcd_cntl_cpe_fll_ctrl(cntl, false); - if (ret < 0) - dev_err(codec->dev, - "%s: Failed to disable cpe clk, err = %d\n", - __func__, ret); - - /* - * Even if CPE FLL disable failed, go ahead and disable - * the codec clock - */ - if (cntl->cdc_cb && cntl->cdc_cb->cdc_clk_en) - ret = cntl->cdc_cb->cdc_clk_en(codec, false); - else - ret = -EINVAL; - - cntl->is_clk_enabled = false; - - /* Put CPAR in reset */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, 0x04, 0x04); -done: - WCD_CNTL_MUTEX_UNLOCK(codec, cntl->clk_mutex); - return ret; -} - -static void wcd_cntl_cpar_ctrl(struct wcd_dsp_cntl *cntl, - bool enable) -{ - struct snd_soc_codec *codec = cntl->codec; - - if (enable) - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, 0x03, 0x03); - else - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPAR_CTL, 0x03, 0x00); -} - -static int wcd_cntl_enable_memory(struct wcd_dsp_cntl *cntl, - enum wcd_mem_type mem_type) -{ - struct snd_soc_codec *codec = cntl->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int loop_cnt = 0; - u8 status = 0; - int ret = 0; - - - switch (mem_type) { - - case WCD_MEM_TYPE_ALWAYS_ON: - - /* 512KB of always on region */ - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - break; - - case WCD_MEM_TYPE_SWITCHABLE: - - snd_soc_update_bits(codec, WCD9360_TEST_DEBUG_MEM_CTRL, - 0x80, 0x80); - do { - loop_cnt++; - /* Time to enable the power domain for memory */ - usleep_range(100, 150); - } while ((status & 0x02) != 0x02 && - loop_cnt != WCD_MEM_ENABLE_MAX_RETRIES); - - if ((status & 0x02) != 0x02) { - dev_err(cntl->codec->dev, - "%s: power domain not enabled, status = 0x%02x\n", - __func__, status); - ret = -EIO; - goto done; - } - - /* Rest of the memory */ - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - wcd9xxx_slim_write_repeat(wcd9xxx, - WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3, - ARRAY_SIZE(mem_enable_values), - mem_enable_values); - - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN, - 0x05); - break; - - default: - dev_err(cntl->codec->dev, "%s: Invalid mem_type %d\n", - __func__, mem_type); - ret = -EINVAL; - break; - } -done: - /* Make sure Deep sleep of memories is enabled for all banks */ - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0, 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1, 0x0F); - - return ret; -} - -static void wcd_cntl_disable_memory(struct wcd_dsp_cntl *cntl, - enum wcd_mem_type mem_type) -{ - struct snd_soc_codec *codec = cntl->codec; - - switch (mem_type) { - case WCD_MEM_TYPE_ALWAYS_ON: - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1, - 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0, - 0xFF); - break; - case WCD_MEM_TYPE_SWITCHABLE: - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3, - 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2, - 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN, - 0x07); - - snd_soc_update_bits(codec, WCD9360_TEST_DEBUG_MEM_CTRL, - 0x80, 0x00); - break; - default: - dev_err(cntl->codec->dev, "%s: Invalid mem_type %d\n", - __func__, mem_type); - break; - } - - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0, 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1, 0x0F); -} - -static void wcd_cntl_do_shutdown(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - - /* Disable WDOG */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_WDOG_CFG, - 0x3F, 0x01); - - /* Put WDSP in reset state */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPE_CTL, - 0x02, 0x00); - - /* If DSP transitions from boot to shutdown, then vote for SVS */ - if (cntl->is_wdsp_booted) - cntl->cdc_cb->cdc_vote_svs(codec, true); - cntl->is_wdsp_booted = false; -} - -static int wcd_cntl_do_boot(struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - /* - * Debug mode is set from debugfs file node. If debug_mode - * is set, then do not configure the watchdog timer. This - * will be required for debugging the DSP firmware. - */ - if (cntl->debug_mode) { - snd_soc_update_bits(codec, WCD9360_CPE_SS_WDOG_CFG, - 0x3F, 0x01); - } else { - snd_soc_update_bits(codec, WCD9360_CPE_SS_WDOG_CFG, - 0x3F, 0x21); - } - - /* Make sure all the error interrupts are cleared */ - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0A, 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0B, 0xFF); - - reinit_completion(&cntl->boot_complete); - - /* Remove WDSP out of reset */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_CPE_CTL, - 0x02, 0x02); - - /* - * In debug mode, DSP may not boot up normally, - * wait indefinitely for DSP to boot. - */ - if (cntl->debug_mode) { - wait_for_completion(&cntl->boot_complete); - dev_dbg(codec->dev, "%s: WDSP booted in dbg mode\n", __func__); - cntl->is_wdsp_booted = true; - goto done; - } - - /* Boot in normal mode */ - ret = wait_for_completion_timeout(&cntl->boot_complete, - msecs_to_jiffies(WCD_DSP_BOOT_TIMEOUT_MS)); - if (!ret) { - dev_err(codec->dev, "%s: WDSP boot timed out\n", - __func__); - ret = -ETIMEDOUT; - goto err_boot; - } else { - /* - * Re-initialize the return code to 0, as in success case, - * it will hold the remaining time for completion timeout - */ - ret = 0; - } - - dev_dbg(codec->dev, "%s: WDSP booted in normal mode\n", __func__); - cntl->is_wdsp_booted = true; - - /* Enable WDOG */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_WDOG_CFG, - 0x10, 0x10); -done: - /* If dsp booted up, then remove vote on SVS */ - if (cntl->is_wdsp_booted) - cntl->cdc_cb->cdc_vote_svs(codec, false); - - return ret; -err_boot: - /* call shutdown to perform cleanup */ - wcd_cntl_do_shutdown(cntl); - return ret; -} - -static irqreturn_t wcd_cntl_ipc_irq(int irq, void *data) -{ - struct wcd_dsp_cntl *cntl = data; - int ret; - - complete(&cntl->boot_complete); - - if (cntl->m_dev && cntl->m_ops && - cntl->m_ops->signal_handler) - ret = cntl->m_ops->signal_handler(cntl->m_dev, WDSP_IPC1_INTR, - NULL); - else - ret = -EINVAL; - - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: Failed to handle irq %d\n", __func__, irq); - - return IRQ_HANDLED; -} - -static irqreturn_t wcd_cntl_err_irq(int irq, void *data) -{ - struct wcd_dsp_cntl *cntl = data; - struct snd_soc_codec *codec = cntl->codec; - struct wdsp_err_signal_arg arg; - u16 status = 0; - u8 reg_val; - int ret = 0; - - reg_val = snd_soc_read(codec, WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0A); - status = status | reg_val; - - reg_val = snd_soc_read(codec, WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0B); - status = status | (reg_val << 8); - - dev_info(codec->dev, "%s: error interrupt status = 0x%x\n", - __func__, status); - - if ((status & cntl->irqs.fatal_irqs) && - (cntl->m_dev && cntl->m_ops && cntl->m_ops->signal_handler)) { - arg.mem_dumps_enabled = cntl->ramdump_enable; - arg.remote_start_addr = WCD_9360_RAMDUMP_START_ADDR; - arg.dump_size = WCD_9360_RAMDUMP_SIZE; - ret = cntl->m_ops->signal_handler(cntl->m_dev, WDSP_ERR_INTR, - &arg); - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: Failed to handle fatal irq 0x%x\n", - __func__, status & cntl->irqs.fatal_irqs); - wcd_cntl_change_online_state(cntl, 0); - } else { - dev_err(cntl->codec->dev, "%s: Invalid signal_handler\n", - __func__); - } - - return IRQ_HANDLED; -} - -static int wcd_control_handler(struct device *dev, void *priv_data, - enum wdsp_event_type event, void *data) -{ - struct wcd_dsp_cntl *cntl = priv_data; - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - switch (event) { - case WDSP_EVENT_POST_INIT: - case WDSP_EVENT_POST_DLOAD_CODE: - case WDSP_EVENT_DLOAD_FAILED: - case WDSP_EVENT_POST_SHUTDOWN: - - /* Disable CPAR */ - wcd_cntl_cpar_ctrl(cntl, false); - /* Disable all the clocks */ - ret = wcd_cntl_clocks_disable(cntl); - if (ret < 0) - dev_err(codec->dev, - "%s: Failed to disable clocks, err = %d\n", - __func__, ret); - - if (event == WDSP_EVENT_POST_DLOAD_CODE) - /* Mark DSP online since code download is complete */ - wcd_cntl_change_online_state(cntl, 1); - break; - - case WDSP_EVENT_PRE_DLOAD_DATA: - case WDSP_EVENT_PRE_DLOAD_CODE: - - /* Enable all the clocks */ - ret = wcd_cntl_clocks_enable(cntl); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to enable clocks, err = %d\n", - __func__, ret); - goto done; - } - - /* Enable CPAR */ - wcd_cntl_cpar_ctrl(cntl, true); - - if (event == WDSP_EVENT_PRE_DLOAD_CODE) - wcd_cntl_enable_memory(cntl, WCD_MEM_TYPE_ALWAYS_ON); - else if (event == WDSP_EVENT_PRE_DLOAD_DATA) - wcd_cntl_enable_memory(cntl, WCD_MEM_TYPE_SWITCHABLE); - break; - - case WDSP_EVENT_DO_BOOT: - - ret = wcd_cntl_do_boot(cntl); - if (ret < 0) - dev_err(codec->dev, - "%s: WDSP boot failed, err = %d\n", - __func__, ret); - break; - - case WDSP_EVENT_DO_SHUTDOWN: - - wcd_cntl_do_shutdown(cntl); - wcd_cntl_disable_memory(cntl, WCD_MEM_TYPE_SWITCHABLE); - break; - - default: - dev_dbg(codec->dev, "%s: unhandled event %d\n", - __func__, event); - } - -done: - return ret; -} - -static int wcd_cntl_sysfs_init(char *dir, struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - int ret = 0; - - ret = kobject_init_and_add(&cntl->wcd_kobj, &wcd_cntl_ktype, - kernel_kobj, dir); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to add kobject %s, err = %d\n", - __func__, dir, ret); - goto done; - } - - ret = sysfs_create_file(&cntl->wcd_kobj, &cntl_attr_boot.attr); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to add wdsp_boot sysfs entry to %s\n", - __func__, dir); - goto fail_create_file; - } - - return ret; - -fail_create_file: - kobject_put(&cntl->wcd_kobj); -done: - return ret; -} - -static void wcd_cntl_sysfs_remove(struct wcd_dsp_cntl *cntl) -{ - sysfs_remove_file(&cntl->wcd_kobj, &cntl_attr_boot.attr); - kobject_put(&cntl->wcd_kobj); -} - -static void wcd_cntl_debugfs_init(char *dir, struct wcd_dsp_cntl *cntl) -{ - struct snd_soc_codec *codec = cntl->codec; - - cntl->entry = debugfs_create_dir(dir, NULL); - if (IS_ERR_OR_NULL(dir)) { - dev_err(codec->dev, "%s debugfs_create_dir failed for %s\n", - __func__, dir); - goto done; - } - - debugfs_create_u32("debug_mode", 0644, - cntl->entry, &cntl->debug_mode); - debugfs_create_bool("ramdump_enable", 0644, - cntl->entry, &cntl->ramdump_enable); -done: - return; -} - -static void wcd_cntl_debugfs_remove(struct wcd_dsp_cntl *cntl) -{ - if (cntl) - debugfs_remove(cntl->entry); -} - -static int wcd_miscdev_release(struct inode *inode, struct file *filep) -{ - struct wcd_dsp_cntl *cntl = container_of(filep->private_data, - struct wcd_dsp_cntl, miscdev); - if (!cntl->m_dev || !cntl->m_ops || - !cntl->m_ops->vote_for_dsp) { - dev_err(cntl->codec->dev, - "%s: DSP not ready to boot\n", __func__); - return -EINVAL; - } - - /* Make sure the DSP users goes to zero upon closing dev node */ - while (cntl->boot_reqs > 0) { - cntl->m_ops->vote_for_dsp(cntl->m_dev, false); - cntl->boot_reqs--; - } - - return 0; -} - -static ssize_t wcd_miscdev_write(struct file *filep, const char __user *ubuf, - size_t count, loff_t *pos) -{ - struct wcd_dsp_cntl *cntl = container_of(filep->private_data, - struct wcd_dsp_cntl, miscdev); - char val[WCD_MISCDEV_CMD_MAX_LEN + 1]; - bool vote; - int ret = 0; - - memset(val, 0, WCD_MISCDEV_CMD_MAX_LEN + 1); - - if (count == 0 || count > WCD_MISCDEV_CMD_MAX_LEN) { - pr_err("%s: Invalid count = %zd\n", __func__, count); - ret = -EINVAL; - goto done; - } - - ret = copy_from_user(val, ubuf, count); - if (ret < 0) { - dev_err(cntl->codec->dev, - "%s: copy_from_user failed, err = %d\n", - __func__, ret); - ret = -EFAULT; - goto done; - } - - if (val[0] == '1') { - cntl->boot_reqs++; - vote = true; - } else if (val[0] == '0') { - if (cntl->boot_reqs == 0) { - dev_err(cntl->codec->dev, - "%s: WDSP already disabled\n", __func__); - ret = -EINVAL; - goto done; - } - cntl->boot_reqs--; - vote = false; - } else { - dev_err(cntl->codec->dev, "%s: Invalid value %s\n", - __func__, val); - ret = -EINVAL; - goto done; - } - - dev_dbg(cntl->codec->dev, - "%s: booted = %s, ref_cnt = %d, vote = %s\n", - __func__, cntl->is_wdsp_booted ? "true" : "false", - cntl->boot_reqs, vote ? "true" : "false"); - - if (cntl->m_dev && cntl->m_ops && - cntl->m_ops->vote_for_dsp) - ret = cntl->m_ops->vote_for_dsp(cntl->m_dev, vote); - else - ret = -EINVAL; -done: - if (ret) - return ret; - else - return count; -} - -static const struct file_operations wcd_miscdev_fops = { - .write = wcd_miscdev_write, - .release = wcd_miscdev_release, -}; - -static int wcd_cntl_miscdev_create(struct wcd_dsp_cntl *cntl) -{ - snprintf(cntl->miscdev_name, ARRAY_SIZE(cntl->miscdev_name), - "wcd_dsp%u_control", cntl->dsp_instance); - cntl->miscdev.minor = MISC_DYNAMIC_MINOR; - cntl->miscdev.name = cntl->miscdev_name; - cntl->miscdev.fops = &wcd_miscdev_fops; - cntl->miscdev.parent = cntl->codec->dev; - - return misc_register(&cntl->miscdev); -} - -static void wcd_cntl_miscdev_destroy(struct wcd_dsp_cntl *cntl) -{ - misc_deregister(&cntl->miscdev); -} - -static int wcd_control_init(struct device *dev, void *priv_data) -{ - struct wcd_dsp_cntl *cntl = priv_data; - struct snd_soc_codec *codec = cntl->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - int ret; - bool err_irq_requested = false; - - ret = wcd9xxx_request_irq(core_res, - cntl->irqs.cpe_ipc1_irq, - wcd_cntl_ipc_irq, "CPE IPC1", - cntl); - if (ret < 0) { - dev_err(codec->dev, - "%s: Failed to request cpe ipc irq, err = %d\n", - __func__, ret); - goto done; - } - - /* Unmask the fatal irqs */ - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_MASK_0A, - ~(cntl->irqs.fatal_irqs & 0xFF)); - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_MASK_0B, - ~((cntl->irqs.fatal_irqs >> 8) & 0xFF)); - - /* - * CPE ERR irq is used only for error reporting from WCD DSP, - * even if this request fails, DSP can be function normally. - * Continuing with init even if the CPE ERR irq request fails. - */ - if (wcd9xxx_request_irq(core_res, cntl->irqs.cpe_err_irq, - wcd_cntl_err_irq, "CPE ERR", cntl)) - dev_info(codec->dev, "%s: Failed request_irq(cpe_err_irq)", - __func__); - else - err_irq_requested = true; - - - /* Enable all the clocks */ - ret = wcd_cntl_clocks_enable(cntl); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to enable clocks, err = %d\n", - __func__, ret); - goto err_clk_enable; - } - wcd_cntl_cpar_ctrl(cntl, true); - - return 0; - -err_clk_enable: - /* Mask all error interrupts */ - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_MASK_0A, 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_MASK_0B, 0xFF); - - /* Free the irq's requested */ - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_ipc1_irq, cntl); - - if (err_irq_requested) - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_err_irq, cntl); -done: - return ret; -} - -static int wcd_control_deinit(struct device *dev, void *priv_data) -{ - struct wcd_dsp_cntl *cntl = priv_data; - struct snd_soc_codec *codec = cntl->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - - wcd_cntl_clocks_disable(cntl); - wcd_cntl_cpar_ctrl(cntl, false); - - /* Mask all error interrupts */ - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_MASK_0A, 0xFF); - snd_soc_write(codec, WCD9360_CPE_SS_SS_ERROR_INT_MASK_0B, 0xFF); - - /* Free the irq's requested */ - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_err_irq, cntl); - wcd9xxx_free_irq(core_res, cntl->irqs.cpe_ipc1_irq, cntl); - - return 0; -} - -static struct wdsp_cmpnt_ops control_ops = { - .init = wcd_control_init, - .deinit = wcd_control_deinit, - .event_handler = wcd_control_handler, -}; - -static int wcd_ctrl_component_bind(struct device *dev, - struct device *master, - void *data) -{ - struct wcd_dsp_cntl *cntl; - struct snd_soc_codec *codec; - struct snd_card *card; - struct snd_info_entry *entry; - char proc_name[WCD_PROCFS_ENTRY_MAX_LEN]; - char wcd_cntl_dir_name[WCD_CNTL_DIR_NAME_LEN_MAX]; - int ret = 0; - - if (!dev || !master || !data) { - pr_err("%s: Invalid parameters\n", __func__); - return -EINVAL; - } - - cntl = (struct wcd_dsp_cntl *) pahu_get_wcd_dsp_cntl(dev); - if (!cntl) { - dev_err(dev, "%s: Failed to get cntl reference\n", - __func__); - return -EINVAL; - } - - cntl->m_dev = master; - cntl->m_ops = data; - - if (!cntl->m_ops->register_cmpnt_ops) { - dev_err(dev, "%s: invalid master callback register_cmpnt_ops\n", - __func__); - ret = -EINVAL; - goto done; - } - - ret = cntl->m_ops->register_cmpnt_ops(master, dev, cntl, &control_ops); - if (ret) { - dev_err(dev, "%s: register_cmpnt_ops failed, err = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_cntl_miscdev_create(cntl); - if (ret < 0) { - dev_err(dev, "%s: misc dev register failed, err = %d\n", - __func__, ret); - goto done; - } - - snprintf(wcd_cntl_dir_name, WCD_CNTL_DIR_NAME_LEN_MAX, - "%s%d", "wdsp", cntl->dsp_instance); - ret = wcd_cntl_sysfs_init(wcd_cntl_dir_name, cntl); - if (ret < 0) { - dev_err(dev, "%s: sysfs_init failed, err = %d\n", - __func__, ret); - goto err_sysfs_init; - } - - wcd_cntl_debugfs_init(wcd_cntl_dir_name, cntl); - - codec = cntl->codec; - card = codec->component.card->snd_card; - snprintf(proc_name, WCD_PROCFS_ENTRY_MAX_LEN, "%s%d%s", "cpe", - cntl->dsp_instance, "_state"); - entry = snd_info_create_card_entry(card, proc_name, card->proc_root); - if (!entry) { - /* Do not treat this as Fatal error */ - dev_err(dev, "%s: Failed to create procfs entry %s\n", - __func__, proc_name); - goto err_sysfs_init; - } - - cntl->ssr_entry.entry = entry; - cntl->ssr_entry.offline = 1; - entry->size = WCD_PROCFS_ENTRY_MAX_LEN; - entry->content = SNDRV_INFO_CONTENT_DATA; - entry->c.ops = &wdsp_ssr_entry_ops; - entry->private_data = cntl; - ret = snd_info_register(entry); - if (ret < 0) { - dev_err(dev, "%s: Failed to register entry %s, err = %d\n", - __func__, proc_name, ret); - snd_info_free_entry(entry); - /* Let bind still happen even if creating the entry failed */ - ret = 0; - } -done: - return ret; - -err_sysfs_init: - wcd_cntl_miscdev_destroy(cntl); - return ret; -} - -static void wcd_ctrl_component_unbind(struct device *dev, - struct device *master, - void *data) -{ - struct wcd_dsp_cntl *cntl; - - if (!dev) { - pr_err("%s: Invalid device\n", __func__); - return; - } - - cntl = (struct wcd_dsp_cntl *) pahu_get_wcd_dsp_cntl(dev); - if (!cntl) { - dev_err(dev, "%s: Failed to get cntl reference\n", - __func__); - return; - } - - cntl->m_dev = NULL; - cntl->m_ops = NULL; - - /* Remove the sysfs entries */ - wcd_cntl_sysfs_remove(cntl); - - /* Remove the debugfs entries */ - wcd_cntl_debugfs_remove(cntl); - - /* Remove the misc device */ - wcd_cntl_miscdev_destroy(cntl); -} - -static const struct component_ops wcd_ctrl_component_ops = { - .bind = wcd_ctrl_component_bind, - .unbind = wcd_ctrl_component_unbind, -}; - -/* - * wcd9360_dsp_ssr_event: handle the SSR event raised by caller. - * @cntl: Handle to the wcd_dsp_cntl structure - * @event: The SSR event to be handled - * - * Notifies the manager driver about the SSR event. - * Returns 0 on success and negative error code on error. - */ -int wcd9360_dsp_ssr_event(struct wcd_dsp_cntl *cntl, enum cdc_ssr_event event) -{ - int ret = 0; - - if (!cntl) { - pr_err("%s: Invalid handle to control\n", __func__); - return -EINVAL; - } - - if (!cntl->m_dev || !cntl->m_ops || !cntl->m_ops->signal_handler) { - dev_err(cntl->codec->dev, - "%s: Invalid signal_handler callback\n", __func__); - return -EINVAL; - } - - switch (event) { - case WCD_CDC_DOWN_EVENT: - ret = cntl->m_ops->signal_handler(cntl->m_dev, - WDSP_CDC_DOWN_SIGNAL, - NULL); - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: WDSP_CDC_DOWN_SIGNAL failed, err = %d\n", - __func__, ret); - wcd_cntl_change_online_state(cntl, 0); - break; - case WCD_CDC_UP_EVENT: - ret = cntl->m_ops->signal_handler(cntl->m_dev, - WDSP_CDC_UP_SIGNAL, - NULL); - if (ret < 0) - dev_err(cntl->codec->dev, - "%s: WDSP_CDC_UP_SIGNAL failed, err = %d\n", - __func__, ret); - break; - default: - dev_err(cntl->codec->dev, "%s: Invalid event %d\n", - __func__, event); - ret = -EINVAL; - break; - } - - return ret; -} -EXPORT_SYMBOL(wcd9360_dsp_ssr_event); - -/* - * wcd9360_dsp_cntl_init: Initialize the wcd-dsp control - * @codec: pointer to the codec handle - * @params: Parameters required to initialize wcd-dsp control - * - * This API is expected to be invoked by the codec driver and - * provide information essential for the wcd dsp control to - * configure and initialize the dsp - */ -void wcd9360_dsp_cntl_init(struct snd_soc_codec *codec, - struct wcd_dsp_params *params, - struct wcd_dsp_cntl **cntl) -{ - struct wcd_dsp_cntl *control; - int ret; - - if (!codec || !params) { - pr_err("%s: Invalid handle to %s\n", __func__, - (!codec) ? "codec" : "params"); - *cntl = NULL; - return; - } - - if (*cntl) { - pr_err("%s: cntl is non NULL, maybe already initialized ?\n", - __func__); - return; - } - - if (!params->cb || !params->cb->cdc_clk_en || - !params->cb->cdc_vote_svs) { - dev_err(codec->dev, - "%s: clk_en and vote_svs callbacks must be provided\n", - __func__); - return; - } - - control = kzalloc(sizeof(*control), GFP_KERNEL); - if (!(control)) - return; - - control->codec = codec; - control->clk_rate = params->clk_rate; - control->cdc_cb = params->cb; - control->dsp_instance = params->dsp_instance; - memcpy(&control->irqs, ¶ms->irqs, sizeof(control->irqs)); - init_completion(&control->boot_complete); - mutex_init(&control->clk_mutex); - mutex_init(&control->ssr_mutex); - init_waitqueue_head(&control->ssr_entry.offline_poll_wait); - - /* - * The default state of WDSP is in SVS mode. - * Vote for SVS now, the vote will be removed only - * after DSP is booted up. - */ - control->cdc_cb->cdc_vote_svs(codec, true); - - /* - * If this is the last component needed by master to be ready, - * then component_bind will be called within the component_add. - * Hence, the data pointer should be assigned before component_add, - * so that we can access it during this component's bind call. - */ - *cntl = control; - ret = component_add(codec->dev, &wcd_ctrl_component_ops); - if (ret) { - dev_err(codec->dev, "%s: component_add failed, err = %d\n", - __func__, ret); - kfree(*cntl); - *cntl = NULL; - } -} -EXPORT_SYMBOL(wcd9360_dsp_cntl_init); - -/* - * wcd9360_dsp_cntl_deinit: De-initialize the wcd-dsp control - * @cntl: The struct wcd_dsp_cntl to de-initialize - * - * This API is intended to be invoked by the codec driver - * to de-initialize the wcd dsp control - */ -void wcd9360_dsp_cntl_deinit(struct wcd_dsp_cntl **cntl) -{ - struct wcd_dsp_cntl *control = *cntl; - struct snd_soc_codec *codec; - - /* If control is NULL, there is nothing to de-initialize */ - if (!control) - return; - codec = control->codec; - - /* - * Calling shutdown will cleanup all register states, - * irrespective of DSP was booted up or not. - */ - wcd_cntl_do_shutdown(control); - wcd_cntl_disable_memory(control, WCD_MEM_TYPE_SWITCHABLE); - wcd_cntl_disable_memory(control, WCD_MEM_TYPE_ALWAYS_ON); - - component_del(codec->dev, &wcd_ctrl_component_ops); - - mutex_destroy(&control->clk_mutex); - mutex_destroy(&control->ssr_mutex); - kfree(*cntl); - *cntl = NULL; -} -EXPORT_SYMBOL(wcd9360_dsp_cntl_deinit); diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.h b/techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.h deleted file mode 100644 index db8b4310552b..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360-dsp-cntl.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD9360_DSP_CNTL_H__ -#define __WCD9360_DSP_CNTL_H__ - -#include -#include -#include - -enum cdc_ssr_event { - WCD_CDC_DOWN_EVENT, - WCD_CDC_UP_EVENT, -}; - -struct wcd_dsp_cdc_cb { - /* Callback to enable codec clock */ - int (*cdc_clk_en)(struct snd_soc_codec *, bool); - /* Callback to vote and unvote for SVS2 mode */ - void (*cdc_vote_svs)(struct snd_soc_codec *, bool); -}; - -struct wcd_dsp_irq_info { - /* IPC interrupt */ - int cpe_ipc1_irq; - - /* CPE error summary interrupt */ - int cpe_err_irq; - - /* - * Bit mask to indicate which of the - * error interrupts are to be considered - * as fatal. - */ - u16 fatal_irqs; -}; - -struct wcd_dsp_params { - struct wcd_dsp_cdc_cb *cb; - struct wcd_dsp_irq_info irqs; - - /* Rate at which the codec clock operates */ - u32 clk_rate; - - /* - * Represents the dsp instance, will be used - * to create sysfs and debugfs entries with - * directory wdsp - */ - u32 dsp_instance; -}; - -struct wdsp_ssr_entry { - u8 offline; - u8 offline_change; - wait_queue_head_t offline_poll_wait; - struct snd_info_entry *entry; -}; - -struct wcd_dsp_cntl { - /* Handle to codec */ - struct snd_soc_codec *codec; - - /* Clk rate of the codec clock */ - u32 clk_rate; - - /* Callbacks to codec driver */ - const struct wcd_dsp_cdc_cb *cdc_cb; - - /* Completion to indicate WDSP boot done */ - struct completion boot_complete; - - struct wcd_dsp_irq_info irqs; - u32 dsp_instance; - - /* Sysfs entries related */ - int boot_reqs; - struct kobject wcd_kobj; - - /* Debugfs related */ - struct dentry *entry; - u32 debug_mode; - bool ramdump_enable; - - /* WDSP manager drivers data */ - struct device *m_dev; - struct wdsp_mgr_ops *m_ops; - - /* clk related */ - struct mutex clk_mutex; - bool is_clk_enabled; - - /* Keep track of WDSP boot status */ - bool is_wdsp_booted; - - /* SSR related */ - struct wdsp_ssr_entry ssr_entry; - struct mutex ssr_mutex; - - /* Misc device related */ - char miscdev_name[256]; - struct miscdevice miscdev; -}; - -void wcd9360_dsp_cntl_init(struct snd_soc_codec *codec, - struct wcd_dsp_params *params, - struct wcd_dsp_cntl **cntl); -void wcd9360_dsp_cntl_deinit(struct wcd_dsp_cntl **cntl); -int wcd9360_dsp_ssr_event(struct wcd_dsp_cntl *cntl, enum cdc_ssr_event event); -#endif /* end __WCD_DSP_CONTROL_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360-irq.h b/techpack/audio/asoc/codecs/wcd9360/wcd9360-irq.h deleted file mode 100644 index fa79447709b3..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360-irq.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD9360_IRQ_H_ -#define __WCD9360_IRQ_H_ - -enum { - /* INTR_REG 0 */ - WCD9360_IRQ_MISC = 1, - WCD9360_IRQ_RESERVED_0, - WCD9360_IRQ_LDO_RXTX_SCD, - WCD9360_IRQ_EAR_PA_SCD, - WCD9360_IRQ_AUX_PA_SCD, - WCD9360_IRQ_AUX_PA_CNP_COMPLETE, - WCD9360_IRQ_EAR_PA_CNP_COMPLETE, - /* INTR_REG 1 */ - WCD9360_IRQ_RESERVED_1, - WCD9360_IRQ_RESERVED_2, - WCD9360_IRQ_RESERVED_3, - WCD9360_IRQ_RESERVED_4, - WCD9360_IRQ_RESERVED_5, - WCD9360_IRQ_RESERVED_6, - WCD9360_IRQ_RESERVED_7, - WCD9360_IRQ_RESERVED_8, - /* INTR_REG 2 */ - WCD9360_IRQ_RESERVED_9, - WCD9360_IRQ_RESERVED_10, - WCD9360_IRQ_RESERVED_11, - WCD9360_IRQ_RESERVED_12, - WCD9360_IRQ_SOUNDWIRE, - WCD9360_IRQ_RESERVED_13, - WCD9360_IRQ_RCO_ERROR, - WCD9360_IRQ_CPE_ERROR, - /* INTR_REG 3 */ - WCD9360_IRQ_MAD_AUDIO, - WCD9360_IRQ_MAD_BEACON, - WCD9360_IRQ_MAD_ULTRASOUND, - WCD9360_IRQ_RESERVED_14, - WCD9360_IRQ_RESERVED_15, - WCD9360_IRQ_CPE1_INTR, - WCD9360_IRQ_CPE2_INTR, - WCD9360_IRQ_CPE_LPASS_ACK, - WCD9360_NUM_IRQS, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360-regmap.c b/techpack/audio/asoc/codecs/wcd9360/wcd9360-regmap.c deleted file mode 100644 index b74c1fb5c608..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360-regmap.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include "../core.h" -#include "../wcd9xxx-regmap.h" -#include "wcd9360-defaults.h" - -static bool wcd9360_is_readable_register(struct device *dev, unsigned int reg) -{ - u8 pg_num, reg_offset; - const u8 *reg_tbl = NULL; - - /* - * Get the page number from MSB of codec register. If its 0x80, assign - * the corresponding page index PAGE_0x80. - */ - pg_num = reg >> 8; - if (pg_num == 128) - pg_num = WCD9360_PAGE_128; - else if (pg_num == 80) - pg_num = WCD9360_PAGE_80; - else if (pg_num > 15) - return false; - - reg_tbl = wcd9360_reg[pg_num]; - reg_offset = reg & 0xFF; - - if (reg_tbl && reg_tbl[reg_offset]) - return true; - else - return false; -} - -static bool wcd9360_is_volatile_register(struct device *dev, unsigned int reg) -{ - u8 pg_num, reg_offset; - const u8 *reg_tbl = NULL; - - pg_num = reg >> 8; - - if (pg_num == 1 || pg_num == 2 || - pg_num == 6 || pg_num == 7) - return true; - else if (pg_num == 128) - pg_num = WCD9360_PAGE_128; - else if (pg_num == 80) - pg_num = WCD9360_PAGE_80; - else if (pg_num > 15) - return false; - - reg_tbl = wcd9360_reg[pg_num]; - reg_offset = reg & 0xFF; - - if (reg_tbl && reg_tbl[reg_offset] == WCD9360_RO) - return true; - - if ((reg >= WCD9360_CODEC_RPM_RST_CTL) && - (reg <= WCD9360_CHIP_TIER_CTRL_ALT_FUNC_EN)) - return true; - - if ((reg >= WCD9360_CDC_ANC0_IIR_COEFF_1_CTL) && - (reg <= WCD9360_CDC_ANC0_FB_GAIN_CTL)) - return true; - - if ((reg >= WCD9360_CODEC_CPR_WR_DATA_0) && - (reg <= WCD9360_CODEC_CPR_RD_DATA_3)) - return true; - - /* - * Need to mark volatile for registers that are writable but - * only few bits are read-only - */ - switch (reg) { - case WCD9360_CODEC_RPM_CLK_BYPASS: - case WCD9360_CODEC_RPM_CLK_GATE: - case WCD9360_CODEC_RPM_CLK_MCLK_CFG: - case WCD9360_CODEC_CPR_SVS_CX_VDD: - case WCD9360_CODEC_CPR_SVS2_CX_VDD: - case WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL: - case WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL: - return true; - } - - return false; -} - -struct regmap_config wcd9360_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd9360_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd9360_defaults), - .max_register = WCD9360_MAX_REGISTER, - .volatile_reg = wcd9360_is_volatile_register, - .readable_reg = wcd9360_is_readable_register, - .can_multi_write = true, -}; diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360-routing.h b/techpack/audio/asoc/codecs/wcd9360/wcd9360-routing.h deleted file mode 100644 index c305d2e23bf7..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360-routing.h +++ /dev/null @@ -1,882 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD9360_ROUTING_H__ -#define __WCD9360_ROUTING_H__ - -#include - -const struct snd_soc_dapm_route pahu_slim_audio_map[] = { - - {"AIF4 MAD", NULL, "AIF4_MAD Mixer"}, - - /* Virtual input widget Mixer SLIMBUS */ - {"AIF1_CAP Mixer", "SLIM TX0", "SLIM TX0"}, - {"AIF1_CAP Mixer", "SLIM TX1", "SLIM TX1"}, - {"AIF1_CAP Mixer", "SLIM TX2", "SLIM TX2"}, - {"AIF1_CAP Mixer", "SLIM TX3", "SLIM TX3"}, - {"AIF1_CAP Mixer", "SLIM TX4", "SLIM TX4"}, - {"AIF1_CAP Mixer", "SLIM TX5", "SLIM TX5"}, - {"AIF1_CAP Mixer", "SLIM TX6", "SLIM TX6"}, - {"AIF1_CAP Mixer", "SLIM TX7", "SLIM TX7"}, - {"AIF1_CAP Mixer", "SLIM TX8", "SLIM TX8"}, - {"AIF1_CAP Mixer", "SLIM TX9", "SLIM TX9"}, - {"AIF1_CAP Mixer", "SLIM TX10", "SLIM TX10"}, - {"AIF1_CAP Mixer", "SLIM TX11", "SLIM TX11"}, - {"AIF1_CAP Mixer", "SLIM TX13", "SLIM TX13"}, - - {"AIF2_CAP Mixer", "SLIM TX0", "SLIM TX0"}, - {"AIF2_CAP Mixer", "SLIM TX1", "SLIM TX1"}, - {"AIF2_CAP Mixer", "SLIM TX2", "SLIM TX2"}, - {"AIF2_CAP Mixer", "SLIM TX3", "SLIM TX3"}, - {"AIF2_CAP Mixer", "SLIM TX4", "SLIM TX4"}, - {"AIF2_CAP Mixer", "SLIM TX5", "SLIM TX5"}, - {"AIF2_CAP Mixer", "SLIM TX6", "SLIM TX6"}, - {"AIF2_CAP Mixer", "SLIM TX7", "SLIM TX7"}, - {"AIF2_CAP Mixer", "SLIM TX8", "SLIM TX8"}, - {"AIF2_CAP Mixer", "SLIM TX9", "SLIM TX9"}, - {"AIF2_CAP Mixer", "SLIM TX10", "SLIM TX10"}, - {"AIF2_CAP Mixer", "SLIM TX11", "SLIM TX11"}, - {"AIF2_CAP Mixer", "SLIM TX13", "SLIM TX13"}, - - {"AIF3_CAP Mixer", "SLIM TX0", "SLIM TX0"}, - {"AIF3_CAP Mixer", "SLIM TX1", "SLIM TX1"}, - {"AIF3_CAP Mixer", "SLIM TX2", "SLIM TX2"}, - {"AIF3_CAP Mixer", "SLIM TX3", "SLIM TX3"}, - {"AIF3_CAP Mixer", "SLIM TX4", "SLIM TX4"}, - {"AIF3_CAP Mixer", "SLIM TX5", "SLIM TX5"}, - {"AIF3_CAP Mixer", "SLIM TX6", "SLIM TX6"}, - {"AIF3_CAP Mixer", "SLIM TX7", "SLIM TX7"}, - {"AIF3_CAP Mixer", "SLIM TX8", "SLIM TX8"}, - {"AIF3_CAP Mixer", "SLIM TX9", "SLIM TX9"}, - {"AIF3_CAP Mixer", "SLIM TX10", "SLIM TX10"}, - {"AIF3_CAP Mixer", "SLIM TX11", "SLIM TX11"}, - {"AIF3_CAP Mixer", "SLIM TX13", "SLIM TX13"}, - - {"AIF4_MAD Mixer", "SLIM TX13", "SLIM TX13"}, - - /* CDC Tx interface with SLIMBUS */ - {"SLIM TX0", NULL, "CDC_IF TX0 MUX"}, - {"SLIM TX1", NULL, "CDC_IF TX1 MUX"}, - {"SLIM TX2", NULL, "CDC_IF TX2 MUX"}, - {"SLIM TX3", NULL, "CDC_IF TX3 MUX"}, - {"SLIM TX4", NULL, "CDC_IF TX4 MUX"}, - {"SLIM TX5", NULL, "CDC_IF TX5 MUX"}, - {"SLIM TX6", NULL, "CDC_IF TX6 MUX"}, - {"SLIM TX7", NULL, "CDC_IF TX7 MUX"}, - {"SLIM TX8", NULL, "CDC_IF TX8 MUX"}, - {"SLIM TX9", NULL, "CDC_IF TX9 MUX"}, - {"SLIM TX10", NULL, "CDC_IF TX10 MUX2"}, - {"SLIM TX11", NULL, "CDC_IF TX11 MUX2"}, - {"SLIM TX13", NULL, "CDC_IF TX13 MUX"}, - - {"SLIM RX0 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX1 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX2 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX3 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX4 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX5 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX6 MUX", "AIF1_PB", "AIF1 PB"}, - {"SLIM RX7 MUX", "AIF1_PB", "AIF1 PB"}, - - {"SLIM RX0 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX1 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX2 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX3 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX4 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX5 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX6 MUX", "AIF2_PB", "AIF2 PB"}, - {"SLIM RX7 MUX", "AIF2_PB", "AIF2 PB"}, - - {"SLIM RX0 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX1 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX2 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX3 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX4 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX5 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX6 MUX", "AIF3_PB", "AIF3 PB"}, - {"SLIM RX7 MUX", "AIF3_PB", "AIF3 PB"}, - - {"SLIM RX0 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX1 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX2 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX3 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX4 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX5 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX6 MUX", "AIF4_PB", "AIF4 PB"}, - {"SLIM RX7 MUX", "AIF4_PB", "AIF4 PB"}, - - {"SLIM RX0", NULL, "SLIM RX0 MUX"}, - {"SLIM RX1", NULL, "SLIM RX1 MUX"}, - {"SLIM RX2", NULL, "SLIM RX2 MUX"}, - {"SLIM RX3", NULL, "SLIM RX3 MUX"}, - {"SLIM RX4", NULL, "SLIM RX4 MUX"}, - {"SLIM RX5", NULL, "SLIM RX5 MUX"}, - {"SLIM RX6", NULL, "SLIM RX6 MUX"}, - {"SLIM RX7", NULL, "SLIM RX7 MUX"}, - - /* CDC Rx interface with SLIMBUS */ - {"CDC_IF RX0 MUX", "SLIM RX0", "SLIM RX0"}, - {"CDC_IF RX1 MUX", "SLIM RX1", "SLIM RX1"}, - {"CDC_IF RX2 MUX", "SLIM RX2", "SLIM RX2"}, - {"CDC_IF RX3 MUX", "SLIM RX3", "SLIM RX3"}, - {"CDC_IF RX4 MUX", "SLIM RX4", "SLIM RX4"}, - {"CDC_IF RX5 MUX", "SLIM RX5", "SLIM RX5"}, - {"CDC_IF RX6 MUX", "SLIM RX6", "SLIM RX6"}, - {"CDC_IF RX7 MUX", "SLIM RX7", "SLIM RX7"}, - - /* VI Feedback */ - {"AIF4_VI Mixer", "SPKR_VI_1", "VIINPUT"}, - {"AIF4_VI Mixer", "SPKR_VI_2", "VIINPUT"}, - {"AIF4 VI", NULL, "AIF4_VI Mixer"}, -}; - -const struct snd_soc_dapm_route pahu_audio_map[] = { - - /* Virtual input widgets */ - {"AIF1 CAP", NULL, "AIF1_CAP Mixer"}, - {"AIF2 CAP", NULL, "AIF2_CAP Mixer"}, - {"AIF3 CAP", NULL, "AIF3_CAP Mixer"}, - - /* WDMA3 */ - {"WDMA3 PORT0 MUX", "DEC0", "ADC MUX0"}, - {"WDMA3 PORT0 MUX", "RX_MIX_TX0", "RX MIX TX0 MUX"}, - {"WDMA3 PORT1 MUX", "DEC1", "ADC MUX1"}, - {"WDMA3 PORT1 MUX", "RX_MIX_TX1", "RX MIX TX1 MUX"}, - {"WDMA3 PORT2 MUX", "DEC2", "ADC MUX2"}, - {"WDMA3 PORT2 MUX", "RX_MIX_TX2", "RX MIX TX2 MUX"}, - {"WDMA3 PORT3 MUX", "DEC3", "ADC MUX3"}, - {"WDMA3 PORT3 MUX", "RX_MIX_TX3", "RX MIX TX3 MUX"}, - {"WDMA3 PORT4 MUX", "DEC4", "ADC MUX4"}, - {"WDMA3 PORT4 MUX", "RX_MIX_TX4", "RX MIX TX4 MUX"}, - {"WDMA3 PORT5 MUX", "DEC5", "ADC MUX5"}, - {"WDMA3 PORT5 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - {"WDMA3 PORT6 MUX", "DEC6", "ADC MUX6"}, - {"WDMA3 PORT6 MUX", "RX_MIX_TX6", "RX MIX TX6 MUX"}, - - {"WDMA3 CH0 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH0 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH0 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH0 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH0 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH0 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH0 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH0 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH0 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3 CH1 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH1 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH1 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH1 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH1 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH1 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH1 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH1 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH1 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3 CH2 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH2 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH2 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH2 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH2 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH2 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH2 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH2 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH2 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3 CH3 MUX", "PORT_0", "WDMA3 PORT0 MUX"}, - {"WDMA3 CH3 MUX", "PORT_1", "WDMA3 PORT1 MUX"}, - {"WDMA3 CH3 MUX", "PORT_2", "WDMA3 PORT2 MUX"}, - {"WDMA3 CH3 MUX", "PORT_3", "WDMA3 PORT3 MUX"}, - {"WDMA3 CH3 MUX", "PORT_4", "WDMA3 PORT4 MUX"}, - {"WDMA3 CH3 MUX", "PORT_5", "WDMA3 PORT5 MUX"}, - {"WDMA3 CH3 MUX", "PORT_6", "WDMA3 PORT6 MUX"}, - {"WDMA3 CH3 MUX", "PORT_7", "ADC MUX7"}, - {"WDMA3 CH3 MUX", "PORT_8", "ADC MUX8"}, - - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH0 MUX"}, - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH1 MUX"}, - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH2 MUX"}, - {"WDMA3_CH_MIXER", NULL, "WDMA3 CH3 MUX"}, - - {"WDMA3_ON_OFF", "Switch", "WDMA3_CH_MIXER"}, - {"WDMA3_OUT", NULL, "WDMA3_ON_OFF"}, - - /* MAD */ - {"MAD_SEL MUX", "SPE", "MAD_CPE_INPUT"}, - {"MAD_SEL MUX", "MSM", "MADINPUT"}, - - {"MAD_INP MUX", "MAD", "MAD_SEL MUX"}, - {"MAD_INP MUX", "DEC1", "ADC MUX1"}, - - {"MAD_BROADCAST", "Switch", "MAD_INP MUX"}, - {"MAD_CPE1", "Switch", "MAD_INP MUX"}, - {"MAD_CPE2", "Switch", "MAD_INP MUX"}, - - {"MAD_CPE_OUT1", NULL, "MAD_CPE1"}, - {"MAD_CPE_OUT2", NULL, "MAD_CPE2"}, - - {"CDC_IF TX0 MUX", "DEC0", "ADC MUX0"}, - {"CDC_IF TX0 MUX", "RX_MIX_TX0", "RX MIX TX0 MUX"}, - {"CDC_IF TX0 MUX", "DEC0_192", "ADC US MUX0"}, - - {"CDC_IF TX1 MUX", "DEC1", "ADC MUX1"}, - {"CDC_IF TX1 MUX", "RX_MIX_TX1", "RX MIX TX1 MUX"}, - {"CDC_IF TX1 MUX", "DEC1_192", "ADC US MUX1"}, - - {"CDC_IF TX2 MUX", "DEC2", "ADC MUX2"}, - {"CDC_IF TX2 MUX", "RX_MIX_TX2", "RX MIX TX2 MUX"}, - {"CDC_IF TX2 MUX", "DEC2_192", "ADC US MUX2"}, - - {"CDC_IF TX3 MUX", "DEC3", "ADC MUX3"}, - {"CDC_IF TX3 MUX", "RX_MIX_TX3", "RX MIX TX3 MUX"}, - {"CDC_IF TX3 MUX", "DEC3_192", "ADC US MUX3"}, - - {"CDC_IF TX4 MUX", "DEC4", "ADC MUX4"}, - {"CDC_IF TX4 MUX", "RX_MIX_TX4", "RX MIX TX4 MUX"}, - {"CDC_IF TX4 MUX", "DEC4_192", "ADC US MUX4"}, - - {"CDC_IF TX5 MUX", "DEC5", "ADC MUX5"}, - {"CDC_IF TX5 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - {"CDC_IF TX5 MUX", "DEC5_192", "ADC US MUX5"}, - - {"CDC_IF TX6 MUX", "DEC6", "ADC MUX6"}, - {"CDC_IF TX6 MUX", "RX_MIX_TX6", "RX MIX TX6 MUX"}, - {"CDC_IF TX6 MUX", "DEC6_192", "ADC US MUX6"}, - - {"CDC_IF TX7 MUX", "DEC7", "ADC MUX7"}, - {"CDC_IF TX7 MUX", "RX_MIX_TX7", "RX MIX TX7 MUX"}, - {"CDC_IF TX7 MUX", "DEC7_192", "ADC US MUX7"}, - - {"CDC_IF TX8 MUX", "DEC8", "ADC MUX8"}, - {"CDC_IF TX8 MUX", "RX_MIX_TX8", "RX MIX TX8 MUX"}, - {"CDC_IF TX8 MUX", "DEC8_192", "ADC US MUX8"}, - - {"CDC_IF TX9 MUX", "DEC7", "ADC MUX7"}, - {"CDC_IF TX9 MUX", "DEC7_192", "ADC US MUX7"}, - {"CDC_IF TX10 MUX", "DEC6", "ADC MUX6"}, - {"CDC_IF TX10 MUX", "DEC6_192", "ADC US MUX6"}, - {"CDC_IF TX10 MUX2", "TX10_MUX1", "CDC_IF TX10 MUX"}, - - {"CDC_IF TX11 MUX2", "TX11_MUX1", "CDC_IF TX11 MUX"}, - {"CDC_IF TX11 MUX", "DEC_0_5", "CDC_IF TX11 INP1 MUX"}, - {"CDC_IF TX11 MUX", "DEC_9_12", "CDC_IF TX11 INP1 MUX"}, - {"CDC_IF TX11 INP1 MUX", "DEC0", "ADC MUX0"}, - {"CDC_IF TX11 INP1 MUX", "DEC1", "ADC MUX1"}, - {"CDC_IF TX11 INP1 MUX", "DEC2", "ADC MUX2"}, - {"CDC_IF TX11 INP1 MUX", "DEC3", "ADC MUX3"}, - {"CDC_IF TX11 INP1 MUX", "DEC4", "ADC MUX4"}, - {"CDC_IF TX11 INP1 MUX", "DEC5", "ADC MUX5"}, - {"CDC_IF TX11 INP1 MUX", "RX_MIX_TX5", "RX MIX TX5 MUX"}, - - {"CDC_IF TX13 MUX", "MAD_BRDCST", "MAD_BROADCAST"}, - {"CDC_IF TX13 MUX", "CDC_DEC_5", "CDC_IF TX13 INP1 MUX"}, - {"CDC_IF TX13 INP1 MUX", "DEC5", "ADC MUX5"}, - {"CDC_IF TX13 INP1 MUX", "DEC5_192", "ADC US MUX5"}, - - {"RX MIX TX0 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX0 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX1 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX1 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX2 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX2 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX3 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX3 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX4 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX4 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX5 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX5 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX6 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX6 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX7 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX7 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"RX MIX TX8 MUX", "RX_MIX0", "RX INT0 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX7", "RX INT7 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX8", "RX INT8 SEC MIX"}, - {"RX MIX TX8 MUX", "RX_MIX9", "RX INT9 SEC MIX"}, - - {"ADC US MUX0", "US_Switch", "ADC MUX0"}, - {"ADC US MUX1", "US_Switch", "ADC MUX1"}, - {"ADC US MUX2", "US_Switch", "ADC MUX2"}, - {"ADC US MUX3", "US_Switch", "ADC MUX3"}, - {"ADC US MUX4", "US_Switch", "ADC MUX4"}, - {"ADC US MUX5", "US_Switch", "ADC MUX5"}, - {"ADC US MUX6", "US_Switch", "ADC MUX6"}, - {"ADC US MUX7", "US_Switch", "ADC MUX7"}, - {"ADC US MUX8", "US_Switch", "ADC MUX8"}, - - {"ADC MUX0", "DMIC", "DMIC MUX0"}, - {"ADC MUX0", "AMIC", "AMIC MUX0"}, - {"ADC MUX1", "DMIC", "DMIC MUX1"}, - {"ADC MUX1", "AMIC", "AMIC MUX1"}, - {"ADC MUX2", "DMIC", "DMIC MUX2"}, - {"ADC MUX2", "AMIC", "AMIC MUX2"}, - {"ADC MUX3", "DMIC", "DMIC MUX3"}, - {"ADC MUX3", "AMIC", "AMIC MUX3"}, - {"ADC MUX4", "DMIC", "DMIC MUX4"}, - {"ADC MUX4", "AMIC", "AMIC MUX4"}, - {"ADC MUX5", "DMIC", "DMIC MUX5"}, - {"ADC MUX5", "AMIC", "AMIC MUX5"}, - {"ADC MUX6", "DMIC", "DMIC MUX6"}, - {"ADC MUX6", "AMIC", "AMIC MUX6"}, - {"ADC MUX7", "DMIC", "DMIC MUX7"}, - {"ADC MUX7", "AMIC", "AMIC MUX7"}, - {"ADC MUX8", "DMIC", "DMIC MUX8"}, - {"ADC MUX8", "AMIC", "AMIC MUX8"}, - {"ADC MUX10", "DMIC", "DMIC MUX10"}, - {"ADC MUX10", "AMIC", "AMIC MUX10"}, - {"ADC MUX11", "DMIC", "DMIC MUX11"}, - {"ADC MUX11", "AMIC", "AMIC MUX11"}, - - {"ADC MUX0", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX0", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX1", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX1", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX2", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX2", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX3", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX3", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX4", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX4", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX5", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX5", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX6", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX6", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX7", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX7", "ANC_FB_TUNE1", "ADC MUX11"}, - {"ADC MUX8", "ANC_FB_TUNE1", "ADC MUX10"}, - {"ADC MUX8", "ANC_FB_TUNE1", "ADC MUX11"}, - - {"DMIC MUX0", "DMIC0", "DMIC0"}, - {"DMIC MUX0", "DMIC1", "DMIC1"}, - {"DMIC MUX0", "DMIC2", "DMIC2"}, - {"DMIC MUX0", "DMIC3", "DMIC3"}, - {"DMIC MUX0", "DMIC4", "DMIC4"}, - {"DMIC MUX0", "DMIC5", "DMIC5"}, - {"DMIC MUX0", "DMIC6", "DMIC6"}, - {"DMIC MUX0", "DMIC7", "DMIC7"}, - {"AMIC MUX0", "ADC1", "ADC1"}, - {"AMIC MUX0", "ADC2", "ADC2"}, - {"AMIC MUX0", "ADC3", "ADC3"}, - {"AMIC MUX0", "ADC4", "ADC4"}, - - {"DMIC MUX1", "DMIC0", "DMIC0"}, - {"DMIC MUX1", "DMIC1", "DMIC1"}, - {"DMIC MUX1", "DMIC2", "DMIC2"}, - {"DMIC MUX1", "DMIC3", "DMIC3"}, - {"DMIC MUX1", "DMIC4", "DMIC4"}, - {"DMIC MUX1", "DMIC5", "DMIC5"}, - {"DMIC MUX1", "DMIC6", "DMIC6"}, - {"DMIC MUX1", "DMIC7", "DMIC7"}, - {"AMIC MUX1", "ADC1", "ADC1"}, - {"AMIC MUX1", "ADC2", "ADC2"}, - {"AMIC MUX1", "ADC3", "ADC3"}, - {"AMIC MUX1", "ADC4", "ADC4"}, - - {"DMIC MUX2", "DMIC0", "DMIC0"}, - {"DMIC MUX2", "DMIC1", "DMIC1"}, - {"DMIC MUX2", "DMIC2", "DMIC2"}, - {"DMIC MUX2", "DMIC3", "DMIC3"}, - {"DMIC MUX2", "DMIC4", "DMIC4"}, - {"DMIC MUX2", "DMIC5", "DMIC5"}, - {"DMIC MUX2", "DMIC6", "DMIC6"}, - {"DMIC MUX2", "DMIC7", "DMIC7"}, - {"AMIC MUX2", "ADC1", "ADC1"}, - {"AMIC MUX2", "ADC2", "ADC2"}, - {"AMIC MUX2", "ADC3", "ADC3"}, - {"AMIC MUX2", "ADC4", "ADC4"}, - - {"DMIC MUX3", "DMIC0", "DMIC0"}, - {"DMIC MUX3", "DMIC1", "DMIC1"}, - {"DMIC MUX3", "DMIC2", "DMIC2"}, - {"DMIC MUX3", "DMIC3", "DMIC3"}, - {"DMIC MUX3", "DMIC4", "DMIC4"}, - {"DMIC MUX3", "DMIC5", "DMIC5"}, - {"DMIC MUX3", "DMIC6", "DMIC6"}, - {"DMIC MUX3", "DMIC7", "DMIC7"}, - {"AMIC MUX3", "ADC1", "ADC1"}, - {"AMIC MUX3", "ADC2", "ADC2"}, - {"AMIC MUX3", "ADC3", "ADC3"}, - {"AMIC MUX3", "ADC4", "ADC4"}, - - {"DMIC MUX4", "DMIC0", "DMIC0"}, - {"DMIC MUX4", "DMIC1", "DMIC1"}, - {"DMIC MUX4", "DMIC2", "DMIC2"}, - {"DMIC MUX4", "DMIC3", "DMIC3"}, - {"DMIC MUX4", "DMIC4", "DMIC4"}, - {"DMIC MUX4", "DMIC5", "DMIC5"}, - {"DMIC MUX4", "DMIC6", "DMIC6"}, - {"DMIC MUX4", "DMIC7", "DMIC7"}, - {"AMIC MUX4", "ADC1", "ADC1"}, - {"AMIC MUX4", "ADC2", "ADC2"}, - {"AMIC MUX4", "ADC3", "ADC3"}, - {"AMIC MUX4", "ADC4", "ADC4"}, - - {"DMIC MUX5", "DMIC0", "DMIC0"}, - {"DMIC MUX5", "DMIC1", "DMIC1"}, - {"DMIC MUX5", "DMIC2", "DMIC2"}, - {"DMIC MUX5", "DMIC3", "DMIC3"}, - {"DMIC MUX5", "DMIC4", "DMIC4"}, - {"DMIC MUX5", "DMIC5", "DMIC5"}, - {"DMIC MUX5", "DMIC6", "DMIC6"}, - {"DMIC MUX5", "DMIC7", "DMIC7"}, - {"AMIC MUX5", "ADC1", "ADC1"}, - {"AMIC MUX5", "ADC2", "ADC2"}, - {"AMIC MUX5", "ADC3", "ADC3"}, - {"AMIC MUX5", "ADC4", "ADC4"}, - - {"DMIC MUX6", "DMIC0", "DMIC0"}, - {"DMIC MUX6", "DMIC1", "DMIC1"}, - {"DMIC MUX6", "DMIC2", "DMIC2"}, - {"DMIC MUX6", "DMIC3", "DMIC3"}, - {"DMIC MUX6", "DMIC4", "DMIC4"}, - {"DMIC MUX6", "DMIC5", "DMIC5"}, - {"DMIC MUX6", "DMIC6", "DMIC6"}, - {"DMIC MUX6", "DMIC7", "DMIC7"}, - {"AMIC MUX6", "ADC1", "ADC1"}, - {"AMIC MUX6", "ADC2", "ADC2"}, - {"AMIC MUX6", "ADC3", "ADC3"}, - {"AMIC MUX6", "ADC4", "ADC4"}, - - {"DMIC MUX7", "DMIC0", "DMIC0"}, - {"DMIC MUX7", "DMIC1", "DMIC1"}, - {"DMIC MUX7", "DMIC2", "DMIC2"}, - {"DMIC MUX7", "DMIC3", "DMIC3"}, - {"DMIC MUX7", "DMIC4", "DMIC4"}, - {"DMIC MUX7", "DMIC5", "DMIC5"}, - {"DMIC MUX7", "DMIC6", "DMIC6"}, - {"DMIC MUX7", "DMIC7", "DMIC7"}, - {"AMIC MUX7", "ADC1", "ADC1"}, - {"AMIC MUX7", "ADC2", "ADC2"}, - {"AMIC MUX7", "ADC3", "ADC3"}, - {"AMIC MUX7", "ADC4", "ADC4"}, - - {"DMIC MUX8", "DMIC0", "DMIC0"}, - {"DMIC MUX8", "DMIC1", "DMIC1"}, - {"DMIC MUX8", "DMIC2", "DMIC2"}, - {"DMIC MUX8", "DMIC3", "DMIC3"}, - {"DMIC MUX8", "DMIC4", "DMIC4"}, - {"DMIC MUX8", "DMIC5", "DMIC5"}, - {"DMIC MUX8", "DMIC6", "DMIC6"}, - {"DMIC MUX8", "DMIC7", "DMIC7"}, - {"AMIC MUX8", "ADC1", "ADC1"}, - {"AMIC MUX8", "ADC2", "ADC2"}, - {"AMIC MUX8", "ADC3", "ADC3"}, - {"AMIC MUX8", "ADC4", "ADC4"}, - - {"DMIC MUX10", "DMIC0", "DMIC0"}, - {"DMIC MUX10", "DMIC1", "DMIC1"}, - {"DMIC MUX10", "DMIC2", "DMIC2"}, - {"DMIC MUX10", "DMIC3", "DMIC3"}, - {"DMIC MUX10", "DMIC4", "DMIC4"}, - {"DMIC MUX10", "DMIC5", "DMIC5"}, - {"DMIC MUX10", "DMIC6", "DMIC6"}, - {"DMIC MUX10", "DMIC7", "DMIC7"}, - {"AMIC MUX10", "ADC1", "ADC1"}, - {"AMIC MUX10", "ADC2", "ADC2"}, - {"AMIC MUX10", "ADC3", "ADC3"}, - {"AMIC MUX10", "ADC4", "ADC4"}, - - {"DMIC MUX11", "DMIC0", "DMIC0"}, - {"DMIC MUX11", "DMIC1", "DMIC1"}, - {"DMIC MUX11", "DMIC2", "DMIC2"}, - {"DMIC MUX11", "DMIC3", "DMIC3"}, - {"DMIC MUX11", "DMIC4", "DMIC4"}, - {"DMIC MUX11", "DMIC5", "DMIC5"}, - {"DMIC MUX11", "DMIC6", "DMIC6"}, - {"DMIC MUX11", "DMIC7", "DMIC7"}, - {"AMIC MUX11", "ADC1", "ADC1"}, - {"AMIC MUX11", "ADC2", "ADC2"}, - {"AMIC MUX11", "ADC3", "ADC3"}, - {"AMIC MUX11", "ADC4", "ADC4"}, - - {"ADC2_IN", "AMIC1", "AMIC1"}, - {"ADC2_IN", "AMIC2", "AMIC2"}, - {"ADC4_IN", "AMIC3", "AMIC3"}, - {"ADC4_IN", "AMIC4", "AMIC4"}, - - {"ADC1", NULL, "AMIC1"}, - {"ADC2", NULL, "ADC2_IN"}, - {"ADC3", NULL, "AMIC3"}, - {"ADC4", NULL, "ADC4_IN"}, - - {"ADC1", NULL, "LDO_RXTX"}, - {"ADC2", NULL, "LDO_RXTX"}, - {"ADC3", NULL, "LDO_RXTX"}, - {"ADC4", NULL, "LDO_RXTX"}, - - {"RX INT0_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT0_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"}, - - {"RX INT7_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT7_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_1 MIX1 INP2", "IIR0", "IIR0"}, - - {"RX INT8_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT8_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_1 MIX1 INP2", "IIR0", "IIR0"}, - - {"RX INT9_1 MIX1 INP0", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT9_1 MIX1 INP0", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT9_1 MIX1 INP0", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT9_1 MIX1 INP0", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT9_1 MIX1 INP0", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT9_1 MIX1 INP0", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT9_1 MIX1 INP0", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT9_1 MIX1 INP0", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT9_1 MIX1 INP0", "IIR0", "IIR0"}, - {"RX INT9_1 MIX1 INP1", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT9_1 MIX1 INP1", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT9_1 MIX1 INP1", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT9_1 MIX1 INP1", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT9_1 MIX1 INP1", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT9_1 MIX1 INP1", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT9_1 MIX1 INP1", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT9_1 MIX1 INP1", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT9_1 MIX1 INP1", "IIR0", "IIR0"}, - {"RX INT9_1 MIX1 INP2", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT9_1 MIX1 INP2", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT9_1 MIX1 INP2", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT9_1 MIX1 INP2", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT9_1 MIX1 INP2", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT9_1 MIX1 INP2", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT9_1 MIX1 INP2", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT9_1 MIX1 INP2", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT9_1 MIX1 INP2", "IIR0", "IIR0"}, - - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"}, - {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP0"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP1"}, - {"RX INT7_1 MIX1", NULL, "RX INT7_1 MIX1 INP2"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP0"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP1"}, - {"RX INT8_1 MIX1", NULL, "RX INT8_1 MIX1 INP2"}, - {"RX INT9_1 MIX1", NULL, "RX INT9_1 MIX1 INP0"}, - {"RX INT9_1 MIX1", NULL, "RX INT9_1 MIX1 INP1"}, - {"RX INT9_1 MIX1", NULL, "RX INT9_1 MIX1 INP2"}, - - /* Mixing path INT0 */ - {"RX INT0_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT0_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT0_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT0_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT0_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT0_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT0_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT0_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"}, - - /* Mixing path INT7 */ - {"RX INT7_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT7_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT7_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT7_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT7_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT7_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT7_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT7_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT7_2 INTERP", NULL, "RX INT7_2 MUX"}, - {"RX INT7 SEC MIX", NULL, "RX INT7_2 INTERP"}, - - /* Mixing path INT8 */ - {"RX INT8_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT8_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT8_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT8_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT8_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT8_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT8_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT8_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT8_2 INTERP", NULL, "RX INT8_2 MUX"}, - {"RX INT8 SEC MIX", NULL, "RX INT8_2 INTERP"}, - - /* Mixing path INT9 */ - {"RX INT9_2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"RX INT9_2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"RX INT9_2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"RX INT9_2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"RX INT9_2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"RX INT9_2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"RX INT9_2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"RX INT9_2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"RX INT9_2 INTERP", NULL, "RX INT9_2 MUX"}, - {"RX INT9 SEC MIX", NULL, "RX INT9_2 INTERP"}, - - {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"}, - {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"}, - {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"}, - {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"}, - {"RX INT0 DEM MUX", NULL, "RX INT0 MIX2"}, - {"RX INT0 DAC", NULL, "RX INT0 DEM MUX"}, - {"RX INT0 DAC", NULL, "LDO_RXTX"}, - {"EAR PA", NULL, "RX INT0 DAC"}, - {"EAR", NULL, "EAR PA"}, - - {"RX INT7_1 INTERP", NULL, "RX INT7_1 MIX1"}, - {"RX INT7 SEC MIX", NULL, "RX INT7_1 INTERP"}, - {"RX INT7 MIX2", NULL, "RX INT7 SEC MIX"}, - {"RX INT7 MIX2", NULL, "RX INT7 MIX2 INP"}, - {"RX INT7 CHAIN", NULL, "RX INT7 MIX2"}, - {"SPK1 OUT", NULL, "RX INT7 CHAIN"}, - - {"RX INT8_1 INTERP", NULL, "RX INT8_1 MIX1"}, - {"RX INT8 SEC MIX", NULL, "RX INT8_1 INTERP"}, - {"RX INT8 SEC MIX", NULL, "RX INT8_1 MIX1"}, - {"RX INT8 CHAIN", NULL, "RX INT8 SEC MIX"}, - {"SPK2 OUT", NULL, "RX INT8 CHAIN"}, - - {"RX INT9_1 INTERP", NULL, "RX INT9_1 MIX1"}, - {"RX INT9 SEC MIX", NULL, "RX INT9_1 INTERP"}, - {"RX INT9 MIX2", NULL, "RX INT9 SEC MIX"}, - {"RX INT9 MIX2", NULL, "RX INT9 MIX2 INP"}, - {"RX INT9 DEM MUX", NULL, "RX INT9 MIX2"}, - {"RX INT9 DAC", NULL, "RX INT9 DEM MUX"}, - {"RX INT9 DAC", NULL, "LDO_RXTX"}, - {"AUX PA", NULL, "RX INT9 DAC"}, - {"AUX", NULL, "AUX PA"}, - - /* ANC Routing */ - {"ANC0 FB MUX", "ANC_IN_EAR", "RX INT0 MIX2"}, - {"ANC0 FB MUX", "ANC_IN_EAR_SPKR", "RX INT7 MIX2"}, - - {"ANC OUT EAR Enable", "Switch", "ADC MUX10"}, - {"ANC OUT EAR Enable", "Switch", "ADC MUX11"}, - {"RX INT0 MIX2", NULL, "ANC OUT EAR Enable"}, - - {"ANC EAR PA", NULL, "RX INT0 DAC"}, - {"ANC EAR", NULL, "ANC EAR PA"}, - - {"ANC OUT EAR SPKR Enable", "Switch", "ADC MUX10"}, - {"ANC OUT EAR SPKR Enable", "Switch", "ADC MUX11"}, - {"RX INT7 MIX2", NULL, "ANC OUT EAR SPKR Enable"}, - - {"ANC SPKR PA Enable", "Switch", "RX INT7 CHAIN"}, - {"ANC SPK1 PA", NULL, "ANC SPKR PA Enable"}, - {"SPK1 OUT", NULL, "ANC SPK1 PA"}, - - /* - * SRC0 input to Sidetone RX Mixer - * on RX0, RX1, RX2, RX3, RX4 and RX7 chains - */ - {"IIR0", NULL, "IIR0 INP0 MUX"}, - {"IIR0 INP0 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP0 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP0 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP0 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP0 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP0 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP0 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP0 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP0 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP0 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP0 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP0 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP0 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP0 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP0 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP0 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP0 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR0", NULL, "IIR0 INP1 MUX"}, - {"IIR0 INP1 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP1 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP1 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP1 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP1 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP1 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP1 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP1 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP1 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP1 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP1 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP1 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP1 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP1 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP1 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP1 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP1 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR0", NULL, "IIR0 INP2 MUX"}, - {"IIR0 INP2 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP2 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP2 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP2 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP2 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP2 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP2 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP2 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP2 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP2 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP2 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP2 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP2 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP2 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP2 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP2 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP2 MUX", "RX7", "CDC_IF RX7 MUX"}, - {"IIR0", NULL, "IIR0 INP3 MUX"}, - {"IIR0 INP3 MUX", "DEC0", "ADC MUX0"}, - {"IIR0 INP3 MUX", "DEC1", "ADC MUX1"}, - {"IIR0 INP3 MUX", "DEC2", "ADC MUX2"}, - {"IIR0 INP3 MUX", "DEC3", "ADC MUX3"}, - {"IIR0 INP3 MUX", "DEC4", "ADC MUX4"}, - {"IIR0 INP3 MUX", "DEC5", "ADC MUX5"}, - {"IIR0 INP3 MUX", "DEC6", "ADC MUX6"}, - {"IIR0 INP3 MUX", "DEC7", "ADC MUX7"}, - {"IIR0 INP3 MUX", "DEC8", "ADC MUX8"}, - {"IIR0 INP3 MUX", "RX0", "CDC_IF RX0 MUX"}, - {"IIR0 INP3 MUX", "RX1", "CDC_IF RX1 MUX"}, - {"IIR0 INP3 MUX", "RX2", "CDC_IF RX2 MUX"}, - {"IIR0 INP3 MUX", "RX3", "CDC_IF RX3 MUX"}, - {"IIR0 INP3 MUX", "RX4", "CDC_IF RX4 MUX"}, - {"IIR0 INP3 MUX", "RX5", "CDC_IF RX5 MUX"}, - {"IIR0 INP3 MUX", "RX6", "CDC_IF RX6 MUX"}, - {"IIR0 INP3 MUX", "RX7", "CDC_IF RX7 MUX"}, - - {"SRC0", NULL, "IIR0"}, - {"RX INT0 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT7 MIX2 INP", "SRC0", "SRC0"}, - {"RX INT9 MIX2 INP", "SRC0", "SRC0"}, - - /* Native clk mix path routing */ - {"RX INT7_2 NATIVE MUX", "ON", "RX INT7_2 MUX"}, - {"RX INT7_2 INTERP", NULL, "RX INT7_2 NATIVE MUX"}, - {"RX INT7_2 NATIVE MUX", NULL, "RX INT7 NATIVE SUPPLY"}, - - {"RX INT8_2 NATIVE MUX", "ON", "RX INT8_2 MUX"}, - {"RX INT8_2 INTERP", NULL, "RX INT8_2 NATIVE MUX"}, - {"RX INT8_2 NATIVE MUX", NULL, "RX INT8 NATIVE SUPPLY"}, - - /* ASRC Routing */ - {"ASRC2 MUX", "ASRC_IN_SPKR1", "RX INT7_2 INTERP"}, - {"RX INT7 SEC MIX", NULL, "ASRC2 MUX"}, - - {"ASRC3 MUX", "ASRC_IN_SPKR2", "RX INT8_2 INTERP"}, - {"RX INT8 SEC MIX", NULL, "ASRC3 MUX"}, - - /* SLIMBUS-I2S Bridge interface */ - {"I2S TX1_0 MUX", "SB_RX2", "SLIM RX2"}, - - {"I2S TX1_1 MUX", "SB_RX0", "SLIM RX0"}, - {"I2S TX1_1 MUX", "SB_RX1", "SLIM RX1"}, - {"I2S TX1_1 MUX", "SB_RX2", "SLIM RX2"}, - {"I2S TX1_1 MUX", "SB_RX3", "SLIM RX3"}, - - {"I2S TX1 MIXER", NULL, "I2S TX1_0 MUX"}, - {"I2S TX1 MIXER", NULL, "I2S TX1_1 MUX"}, - {"I2S1 CAP", NULL, "I2S TX1 MIXER"}, - - {"CDC_IF TX10 MUX2", "I2SRX1_0_BRDG", "CDC_IF RX2 MUX"}, - {"CDC_IF TX11 MUX2", "I2SRX1_1_BRDG", "CDC_IF RX3 MUX"}, - {"CDC_IF RX2 MUX", "I2SRX1_0", "I2S1 PB"}, - {"CDC_IF RX3 MUX", "I2SRX1_1", "I2S1 PB"}, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360.c b/techpack/audio/asoc/codecs/wcd9360/wcd9360.c deleted file mode 100644 index 075a77fb60ca..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360.c +++ /dev/null @@ -1,8101 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd9360.h" -#include "wcd9360-routing.h" -#include "wcd9360-dsp-cntl.h" -#include "wcd9360-irq.h" -#include "../core.h" -#include "../pdata.h" -#include "../wcd9xxx-irq.h" -#include "../wcd9xxx-common-v2.h" -#include "../wcd9xxx-resmgr-v2.h" -#include "../wcdcal-hwdep.h" -#include "../msm-cdc-supply.h" - - -#define WCD9360_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\ - SNDRV_PCM_RATE_384000) -/* Fractional Rates */ -#define WCD9360_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ - SNDRV_PCM_RATE_176400) - -#define WCD9360_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE) - -#define WCD9360_FORMATS_S16_S24_S32_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -#define WCD9360_FORMATS_S16_LE (SNDRV_PCM_FMTBIT_S16_LE) - -/* Macros for packing register writes into a U32 */ -#define WCD9360_PACKED_REG_SIZE sizeof(u32) -#define WCD9360_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ - do { \ - ((reg) = ((packed >> 16) & (0xffff))); \ - ((mask) = ((packed >> 8) & (0xff))); \ - ((val) = ((packed) & (0xff))); \ - } while (0) - -#define STRING(name) #name -#define WCD_DAPM_ENUM(name, reg, offset, text) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM(STRING(name), name##_enum) - -#define WCD_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \ -static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \ -static const struct snd_kcontrol_new name##_mux = \ - SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname) - -#define WCD_DAPM_MUX(name, shift, kctl) \ - SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux) - -/* - * Timeout in milli seconds and it is the wait time for - * slim channel removal interrupt to receive. - */ -#define WCD9360_SLIM_CLOSE_TIMEOUT 1000 -#define WCD9360_SLIM_IRQ_OVERFLOW (1 << 0) -#define WCD9360_SLIM_IRQ_UNDERFLOW (1 << 1) -#define WCD9360_SLIM_IRQ_PORT_CLOSED (1 << 2) - -#define WCD9360_MCLK_CLK_9P6MHZ 9600000 - -#define WCD9360_INTERP_MUX_NUM_INPUTS 3 -#define WCD9360_NUM_INTERPOLATORS 10 -#define WCD9360_NUM_DECIMATORS 9 -#define WCD9360_RX_PATH_CTL_OFFSET 20 -#define WCD9360_TLMM_DMIC_PINCFG_OFFSET 15 - -#define BYTE_BIT_MASK(nr) (1 << ((nr) % BITS_PER_BYTE)) - -#define WCD9360_REG_BITS 8 -#define WCD9360_MAX_VALID_ADC_MUX 11 -#define WCD9360_INVALID_ADC_MUX 9 - -#define WCD9360_AMIC_PWR_LEVEL_LP 0 -#define WCD9360_AMIC_PWR_LEVEL_DEFAULT 1 -#define WCD9360_AMIC_PWR_LEVEL_HP 2 -#define WCD9360_AMIC_PWR_LVL_MASK 0x60 -#define WCD9360_AMIC_PWR_LVL_SHIFT 0x5 - -#define WCD9360_DEC_PWR_LVL_MASK 0x06 -#define WCD9360_DEC_PWR_LVL_LP 0x02 -#define WCD9360_DEC_PWR_LVL_HP 0x04 -#define WCD9360_DEC_PWR_LVL_DF 0x00 -#define WCD9360_STRING_LEN 100 - -#define WCD9360_CDC_SIDETONE_IIR_COEFF_MAX 5 -#define WCD9360_CDC_REPEAT_WRITES_MAX 16 -#define WCD9360_DIG_CORE_REG_MIN WCD9360_CDC_ANC0_CLK_RESET_CTL -#define WCD9360_DIG_CORE_REG_MAX 0xFFF - -#define WCD9360_CHILD_DEVICES_MAX 6 - -#define WCD9360_MAX_MICBIAS 4 -#define DAPM_MICBIAS1_STANDALONE "MIC BIAS1 Standalone" -#define DAPM_MICBIAS2_STANDALONE "MIC BIAS2 Standalone" -#define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone" -#define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone" - -#define WCD9360_LDO_RXTX_SUPPLY_NAME "cdc-vdd-ldo-rxtx" - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -#define CPE_ERR_WDOG_BITE BIT(0) -#define CPE_FATAL_IRQS CPE_ERR_WDOG_BITE - -#define WCD9360_MAD_AUDIO_FIRMWARE_PATH "wcd9360/wcd9360_mad_audio.bin" - -#define PAHU_VERSION_ENTRY_SIZE 17 - -#define WCD9360_DIG_CORE_COLLAPSE_TIMER_MS (5 * 1000) - -enum { - INTERP_EAR = 0, - /* Headset and Lineout are not avalible in pahu */ - INTERP_HPHL_NA, - INTERP_HPHR_NA, - INTERP_LO1_NA, - INTERP_LO2_NA, - INTERP_LO3_NA, - INTERP_LO4_NA, - INTERP_SPKR1, - INTERP_SPKR2, - INTERP_AUX, - INTERP_MAX, -}; - -enum { - POWER_COLLAPSE, - POWER_RESUME, -}; - -static int dig_core_collapse_enable = 1; -module_param(dig_core_collapse_enable, int, 0664); -MODULE_PARM_DESC(dig_core_collapse_enable, "enable/disable power gating"); - -/* dig_core_collapse timer in seconds */ -static int dig_core_collapse_timer = (WCD9360_DIG_CORE_COLLAPSE_TIMER_MS/1000); -module_param(dig_core_collapse_timer, int, 0664); -MODULE_PARM_DESC(dig_core_collapse_timer, "timer for power gating"); - -enum { - VI_SENSE_1, - VI_SENSE_2, - CLK_INTERNAL, - CLK_MODE, -}; - -enum { - AIF1_PB = 0, - AIF1_CAP, - AIF2_PB, - AIF2_CAP, - AIF3_PB, - AIF3_CAP, - AIF4_PB, - AIF4_VIFEED, - AIF4_MAD_TX, - I2S1_PB, - I2S1_CAP, - NUM_CODEC_DAIS, -}; - -enum { - INTn_1_INP_SEL_ZERO = 0, - INTn_1_INP_SEL_DEC0, - INTn_1_INP_SEL_DEC1, - INTn_1_INP_SEL_IIR0, - INTn_1_INP_SEL_NA, - INTn_1_INP_SEL_RX0, - INTn_1_INP_SEL_RX1, - INTn_1_INP_SEL_RX2, - INTn_1_INP_SEL_RX3, - INTn_1_INP_SEL_RX4, - INTn_1_INP_SEL_RX5, - INTn_1_INP_SEL_RX6, - INTn_1_INP_SEL_RX7, -}; - -enum { - INTn_2_INP_SEL_ZERO = 0, - INTn_2_INP_SEL_RX0, - INTn_2_INP_SEL_RX1, - INTn_2_INP_SEL_RX2, - INTn_2_INP_SEL_RX3, - INTn_2_INP_SEL_RX4, - INTn_2_INP_SEL_RX5, - INTn_2_INP_SEL_RX6, - INTn_2_INP_SEL_RX7, - INTn_2_INP_SEL_PROXIMITY, -}; - -enum { - INTERP_MAIN_PATH, - INTERP_MIX_PATH, -}; - -struct pahu_cpr_reg_defaults { - int wr_data; - int wr_addr; -}; - -struct interp_sample_rate { - int sample_rate; - int rate_val; -}; - -static struct interp_sample_rate sr_val_tbl[] = { - {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5}, - {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA}, - {176400, 0xB}, {352800, 0xC}, -}; - -static const struct wcd9xxx_ch pahu_rx_chs[WCD9360_RX_MAX] = { - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER, 0), - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER + 1, 1), - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER + 2, 2), - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER + 3, 3), - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER + 4, 4), - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER + 5, 5), - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER + 6, 6), - WCD9XXX_CH(WCD9360_RX_PORT_START_NUMBER + 7, 7), -}; - -static const struct wcd9xxx_ch pahu_tx_chs[WCD9360_TX_MAX] = { - WCD9XXX_CH(0, 0), - WCD9XXX_CH(1, 1), - WCD9XXX_CH(2, 2), - WCD9XXX_CH(3, 3), - WCD9XXX_CH(4, 4), - WCD9XXX_CH(5, 5), - WCD9XXX_CH(6, 6), - WCD9XXX_CH(7, 7), - WCD9XXX_CH(8, 8), - WCD9XXX_CH(9, 9), - WCD9XXX_CH(10, 10), - WCD9XXX_CH(11, 11), - WCD9XXX_CH(12, 12), - WCD9XXX_CH(13, 13), - WCD9XXX_CH(14, 14), - WCD9XXX_CH(15, 15), -}; - -static const u32 vport_slim_check_table[NUM_CODEC_DAIS] = { - 0, /* AIF1_PB */ - BIT(AIF2_CAP) | BIT(AIF3_CAP) | BIT(AIF4_MAD_TX), /* AIF1_CAP */ - 0, /* AIF2_PB */ - BIT(AIF1_CAP) | BIT(AIF3_CAP) | BIT(AIF4_MAD_TX), /* AIF2_CAP */ - 0, /* AIF3_PB */ - BIT(AIF1_CAP) | BIT(AIF2_CAP) | BIT(AIF4_MAD_TX), /* AIF3_CAP */ - 0, /* AIF4_PB */ -}; - -/* Codec supports 2 IIR filters */ -enum { - IIR0 = 0, - IIR_MAX, -}; - -/* Each IIR has 5 Filter Stages */ -enum { - BAND1 = 0, - BAND2, - BAND3, - BAND4, - BAND5, - BAND_MAX, -}; - -enum { - COMPANDER_0, /* EAR */ - COMPANDER_1, /* HPH_L */ - COMPANDER_2, /* HPH_R */ - COMPANDER_3, /* LO1_DIFF */ - COMPANDER_4, /* LO2_DIFF */ - COMPANDER_5, /* LO3_SE */ - COMPANDER_6, /* LO4_SE */ - COMPANDER_7, /* SWR SPK CH1 */ - COMPANDER_8, /* SWR SPK CH2 */ - COMPANDER_9, /* AUX */ - COMPANDER_MAX, -}; - -enum { - ASRC_IN_SPKR1, - ASRC_IN_SPKR2, - ASRC_INVALID, -}; - -enum { - ASRC2, - ASRC3, - ASRC_MAX, -}; - -enum { - CONV_88P2K_TO_384K, - CONV_96K_TO_352P8K, - CONV_352P8K_TO_384K, - CONV_384K_TO_352P8K, - CONV_384K_TO_384K, - CONV_96K_TO_384K, -}; - -static struct afe_param_slimbus_slave_port_cfg pahu_slimbus_slave_port_cfg = { - .minor_version = 1, - .slimbus_dev_id = AFE_SLIMBUS_DEVICE_1, - .slave_dev_pgd_la = 0, - .slave_dev_intfdev_la = 0, - .bit_width = 16, - .data_format = 0, - .num_channels = 1 -}; - -static struct afe_param_cdc_reg_page_cfg pahu_cdc_reg_page_cfg = { - .minor_version = AFE_API_VERSION_CDC_REG_PAGE_CFG, - .enable = 1, - .proc_id = AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_1, -}; - -static struct afe_param_cdc_reg_cfg audio_reg_cfg[] = { - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_SOC_MAD_MAIN_CTL_1), - HW_MAD_AUDIO_ENABLE, 0x1, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_SOC_MAD_AUDIO_CTL_3), - HW_MAD_AUDIO_SLEEP_TIME, 0xF, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_SOC_MAD_AUDIO_CTL_4), - HW_MAD_TX_AUDIO_SWITCH_OFF, 0x1, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_INTR_CFG), - MAD_AUDIO_INT_DEST_SELECT_REG, 0x2, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_INTR_PIN2_MASK3), - MAD_AUDIO_INT_MASK_REG, 0x1, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_INTR_PIN2_STATUS3), - MAD_AUDIO_INT_STATUS_REG, 0x1, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_INTR_PIN2_CLEAR3), - MAD_AUDIO_INT_CLEAR_REG, 0x1, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_SB_PGD_PORT_TX_BASE), - SB_PGD_PORT_TX_WATERMARK_N, 0x1E, WCD9360_REG_BITS, 0x1 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_SB_PGD_PORT_TX_BASE), - SB_PGD_PORT_TX_ENABLE_N, 0x1, WCD9360_REG_BITS, 0x1 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_SB_PGD_PORT_RX_BASE), - SB_PGD_PORT_RX_WATERMARK_N, 0x1E, WCD9360_REG_BITS, 0x1 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + WCD9360_SB_PGD_PORT_RX_BASE), - SB_PGD_PORT_RX_ENABLE_N, 0x1, WCD9360_REG_BITS, 0x1 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + - WCD9360_CDC_ANC0_IIR_ADAPT_CTL), - AANC_FF_GAIN_ADAPTIVE, 0x4, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + - WCD9360_CDC_ANC0_IIR_ADAPT_CTL), - AANC_FFGAIN_ADAPTIVE_EN, 0x8, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + - WCD9360_CDC_ANC0_FF_A_GAIN_CTL), - AANC_GAIN_CONTROL, 0xFF, WCD9360_REG_BITS, 0 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + - SB_PGD_TX_PORT_MULTI_CHANNEL_0(0)), - SB_PGD_TX_PORTn_MULTI_CHNL_0, 0xFF, WCD9360_REG_BITS, 0x4 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + - SB_PGD_TX_PORT_MULTI_CHANNEL_1(0)), - SB_PGD_TX_PORTn_MULTI_CHNL_1, 0xFF, WCD9360_REG_BITS, 0x4 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + - SB_PGD_RX_PORT_MULTI_CHANNEL_0(0x180, 0)), - SB_PGD_RX_PORTn_MULTI_CHNL_0, 0xFF, WCD9360_REG_BITS, 0x4 - }, - { - 1, - (WCD9360_REGISTER_START_OFFSET + - SB_PGD_RX_PORT_MULTI_CHANNEL_0(0x181, 0)), - SB_PGD_RX_PORTn_MULTI_CHNL_1, 0xFF, WCD9360_REG_BITS, 0x4 - }, -}; - -static struct afe_param_cdc_reg_cfg_data pahu_audio_reg_cfg = { - .num_registers = ARRAY_SIZE(audio_reg_cfg), - .reg_data = audio_reg_cfg, -}; - -static struct afe_param_id_cdc_aanc_version pahu_cdc_aanc_version = { - .cdc_aanc_minor_version = AFE_API_VERSION_CDC_AANC_VERSION, - .aanc_hw_version = AANC_HW_BLOCK_VERSION_2, -}; - -static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); - -#define WCD9360_TX_UNMUTE_DELAY_MS 40 - -static int tx_unmute_delay = WCD9360_TX_UNMUTE_DELAY_MS; -module_param(tx_unmute_delay, int, 0664); -MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path"); - -static void pahu_codec_set_tx_hold(struct snd_soc_codec *, u16, bool); - -/* Hold instance to soundwire platform device */ -struct pahu_swr_ctrl_data { - struct platform_device *swr_pdev; -}; - -struct wcd_swr_ctrl_platform_data { - void *handle; /* holds codec private data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*handle_irq)(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, void *data), - void *swrm_handle, int action); -}; - -/* Holds all Soundwire and speaker related information */ -struct wcd9360_swr { - struct pahu_swr_ctrl_data *ctrl_data; - struct wcd_swr_ctrl_platform_data plat_data; - struct mutex read_mutex; - struct mutex write_mutex; - struct mutex clk_mutex; - int spkr_gain_offset; - int spkr_mode; - int clk_users; - int rx_7_count; - int rx_8_count; -}; - -struct tx_mute_work { - struct pahu_priv *pahu; - u8 decimator; - struct delayed_work dwork; -}; - -#define WCD9360_SPK_ANC_EN_DELAY_MS 550 -static int spk_anc_en_delay = WCD9360_SPK_ANC_EN_DELAY_MS; -module_param(spk_anc_en_delay, int, 0664); -MODULE_PARM_DESC(spk_anc_en_delay, "delay to enable anc in speaker path"); - -struct spk_anc_work { - struct pahu_priv *pahu; - struct delayed_work dwork; -}; - -struct hpf_work { - struct pahu_priv *pahu; - u8 decimator; - u8 hpf_cut_off_freq; - struct delayed_work dwork; -}; - -struct pahu_priv { - struct device *dev; - struct wcd9xxx *wcd9xxx; - struct snd_soc_codec *codec; - s32 ldo_rxtx_cnt; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - s32 dmic_6_7_clk_cnt; - s32 micb_ref[PAHU_MAX_MICBIAS]; - s32 pullup_ref[PAHU_MAX_MICBIAS]; - - /* ANC related */ - u32 anc_slot; - bool anc_func; - - /* compander */ - int comp_enabled[COMPANDER_MAX]; - int ear_spkr_gain; - - /* Mad switch reference count */ - int mad_switch_cnt; - - /* track pahu interface type */ - u8 intf_type; - - /* to track the status */ - unsigned long status_mask; - - struct afe_param_cdc_slimbus_slave_cfg slimbus_slave_cfg; - - /* num of slim ports required */ - struct wcd9xxx_codec_dai_data dai[NUM_CODEC_DAIS]; - /* Port values for Rx and Tx codec_dai */ - unsigned int rx_port_value[WCD9360_RX_MAX]; - unsigned int tx_port_value; - - struct wcd9xxx_resmgr_v2 *resmgr; - struct wcd9360_swr swr; - struct mutex micb_lock; - - struct delayed_work power_gate_work; - struct mutex power_lock; - - struct clk *wcd_ext_clk; - - struct mutex codec_mutex; - struct work_struct pahu_add_child_devices_work; - struct hpf_work tx_hpf_work[WCD9360_NUM_DECIMATORS]; - struct tx_mute_work tx_mute_dwork[WCD9360_NUM_DECIMATORS]; - struct spk_anc_work spk_anc_dwork; - - unsigned int vi_feed_value; - - /* DSP control */ - struct wcd_dsp_cntl *wdsp_cntl; - - /* cal info for codec */ - struct fw_info *fw_data; - - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - - /* SVS voting related */ - struct mutex svs_mutex; - int svs_ref_cnt; - - int native_clk_users; - /* ASRC users count */ - int asrc_users[ASRC_MAX]; - int asrc_output_mode[ASRC_MAX]; - /* Main path clock users count */ - int main_clk_users[WCD9360_NUM_INTERPOLATORS]; - - int power_active_ref; - u8 sidetone_coeff_array[IIR_MAX][BAND_MAX] - [WCD9360_CDC_SIDETONE_IIR_COEFF_MAX * 4]; - - struct spi_device *spi; - struct platform_device *pdev_child_devices - [WCD9360_CHILD_DEVICES_MAX]; - int child_count; - int i2s_ref_cnt; -}; - -static const struct pahu_reg_mask_val pahu_spkr_default[] = { - {WCD9360_CDC_COMPANDER7_CTL3, 0x80, 0x80}, - {WCD9360_CDC_COMPANDER8_CTL3, 0x80, 0x80}, - {WCD9360_CDC_COMPANDER7_CTL7, 0x01, 0x01}, - {WCD9360_CDC_COMPANDER8_CTL7, 0x01, 0x01}, - {WCD9360_CDC_BOOST0_BOOST_CTL, 0x7C, 0x50}, - {WCD9360_CDC_BOOST1_BOOST_CTL, 0x7C, 0x50}, -}; - -static const struct pahu_reg_mask_val pahu_spkr_mode1[] = { - {WCD9360_CDC_COMPANDER7_CTL3, 0x80, 0x00}, - {WCD9360_CDC_COMPANDER8_CTL3, 0x80, 0x00}, - {WCD9360_CDC_COMPANDER7_CTL7, 0x01, 0x00}, - {WCD9360_CDC_COMPANDER8_CTL7, 0x01, 0x00}, - {WCD9360_CDC_BOOST0_BOOST_CTL, 0x7C, 0x44}, - {WCD9360_CDC_BOOST1_BOOST_CTL, 0x7C, 0x44}, -}; - -static int __pahu_enable_efuse_sensing(struct pahu_priv *pahu); - -/** - * pahu_set_spkr_gain_offset - offset the speaker path - * gain with the given offset value. - * - * @codec: codec instance - * @offset: Indicates speaker path gain offset value. - * - * Returns 0 on success or -EINVAL on error. - */ -int pahu_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - struct pahu_priv *priv = snd_soc_codec_get_drvdata(codec); - - if (!priv) - return -EINVAL; - - priv->swr.spkr_gain_offset = offset; - return 0; -} -EXPORT_SYMBOL(pahu_set_spkr_gain_offset); - -/** - * pahu_set_spkr_mode - Configures speaker compander and smartboost - * settings based on speaker mode. - * - * @codec: codec instance - * @mode: Indicates speaker configuration mode. - * - * Returns 0 on success or -EINVAL on error. - */ -int pahu_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - struct pahu_priv *priv = snd_soc_codec_get_drvdata(codec); - int i; - const struct pahu_reg_mask_val *regs; - int size; - - if (!priv) - return -EINVAL; - - switch (mode) { - case WCD9360_SPKR_MODE_1: - regs = pahu_spkr_mode1; - size = ARRAY_SIZE(pahu_spkr_mode1); - break; - default: - regs = pahu_spkr_default; - size = ARRAY_SIZE(pahu_spkr_default); - break; - } - - priv->swr.spkr_mode = mode; - for (i = 0; i < size; i++) - snd_soc_update_bits(codec, regs[i].reg, - regs[i].mask, regs[i].val); - return 0; -} -EXPORT_SYMBOL(pahu_set_spkr_mode); - -/** - * pahu_get_afe_config - returns specific codec configuration to afe to write - * - * @codec: codec instance - * @config_type: Indicates type of configuration to write. - */ -void *pahu_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type) -{ - struct pahu_priv *priv = snd_soc_codec_get_drvdata(codec); - - switch (config_type) { - case AFE_SLIMBUS_SLAVE_CONFIG: - return &priv->slimbus_slave_cfg; - case AFE_CDC_REGISTERS_CONFIG: - return &pahu_audio_reg_cfg; - case AFE_SLIMBUS_SLAVE_PORT_CONFIG: - return &pahu_slimbus_slave_port_cfg; - case AFE_AANC_VERSION: - return &pahu_cdc_aanc_version; - case AFE_CDC_REGISTER_PAGE_CONFIG: - return &pahu_cdc_reg_page_cfg; - default: - dev_info(codec->dev, "%s: Unknown config_type 0x%x\n", - __func__, config_type); - return NULL; - } -} -EXPORT_SYMBOL(pahu_get_afe_config); - -static void pahu_vote_svs(struct pahu_priv *pahu, bool vote) -{ - struct wcd9xxx *wcd9xxx; - - wcd9xxx = pahu->wcd9xxx; - - mutex_lock(&pahu->svs_mutex); - if (vote) { - pahu->svs_ref_cnt++; - if (pahu->svs_ref_cnt == 1) - regmap_update_bits(wcd9xxx->regmap, - WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_0, - 0x01, 0x01); - } else { - /* Do not decrement ref count if it is already 0 */ - if (pahu->svs_ref_cnt == 0) - goto done; - - pahu->svs_ref_cnt--; - if (pahu->svs_ref_cnt == 0) - regmap_update_bits(wcd9xxx->regmap, - WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_0, - 0x01, 0x00); - } -done: - dev_dbg(pahu->dev, "%s: vote = %s, updated ref cnt = %u\n", __func__, - vote ? "vote" : "Unvote", pahu->svs_ref_cnt); - mutex_unlock(&pahu->svs_mutex); -} - -static int pahu_get_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = pahu->anc_slot; - return 0; -} - -static int pahu_put_anc_slot(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - pahu->anc_slot = ucontrol->value.integer.value[0]; - return 0; -} - -static int pahu_get_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = (pahu->anc_func == true ? 1 : 0); - return 0; -} - -static int pahu_put_anc_func(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - mutex_lock(&pahu->codec_mutex); - pahu->anc_func = (!ucontrol->value.integer.value[0] ? false : true); - dev_dbg(codec->dev, "%s: anc_func %x", __func__, pahu->anc_func); - - if (pahu->anc_func == true) { - snd_soc_dapm_enable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_enable_pin(dapm, "ANC EAR"); - snd_soc_dapm_enable_pin(dapm, "ANC SPK1 PA"); - snd_soc_dapm_disable_pin(dapm, "EAR PA"); - snd_soc_dapm_disable_pin(dapm, "EAR"); - } else { - snd_soc_dapm_disable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR"); - snd_soc_dapm_disable_pin(dapm, "ANC SPK1 PA"); - snd_soc_dapm_enable_pin(dapm, "EAR PA"); - snd_soc_dapm_enable_pin(dapm, "EAR"); - } - mutex_unlock(&pahu->codec_mutex); - - snd_soc_dapm_sync(dapm); - return 0; -} - -static int pahu_codec_enable_anc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - const char *filename; - const struct firmware *fw; - int i; - int ret = 0; - int num_anc_slots; - struct wcd9xxx_anc_header *anc_head; - struct firmware_cal *hwdep_cal = NULL; - u32 anc_writes_size = 0; - int anc_size_remaining; - u32 *anc_ptr; - u16 reg; - u8 mask, val; - size_t cal_size; - const void *data; - - if (!pahu->anc_func) - return 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - hwdep_cal = wcdcal_get_fw_cal(pahu->fw_data, WCD9XXX_ANC_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration, cal_size %zd", - __func__, cal_size); - } else { - filename = "wcd9360/WCD9360_anc.bin"; - ret = request_firmware(&fw, filename, codec->dev); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to acquire ANC data: %d\n", - __func__, ret); - return ret; - } - if (!fw) { - dev_err(codec->dev, "%s: Failed to get anc fw\n", - __func__); - return -ENODEV; - } - data = fw->data; - cal_size = fw->size; - dev_dbg(codec->dev, "%s: using request_firmware calibration\n", - __func__); - } - if (cal_size < sizeof(struct wcd9xxx_anc_header)) { - dev_err(codec->dev, "%s: Invalid cal_size %zd\n", - __func__, cal_size); - ret = -EINVAL; - goto err; - } - /* First number is the number of register writes */ - anc_head = (struct wcd9xxx_anc_header *)(data); - anc_ptr = (u32 *)(data + sizeof(struct wcd9xxx_anc_header)); - anc_size_remaining = cal_size - - sizeof(struct wcd9xxx_anc_header); - num_anc_slots = anc_head->num_anc_slots; - - if (pahu->anc_slot >= num_anc_slots) { - dev_err(codec->dev, "%s: Invalid ANC slot selected\n", - __func__); - ret = -EINVAL; - goto err; - } - for (i = 0; i < num_anc_slots; i++) { - if (anc_size_remaining < WCD9360_PACKED_REG_SIZE) { - dev_err(codec->dev, "%s: Invalid register format\n", - __func__); - ret = -EINVAL; - goto err; - } - anc_writes_size = (u32)(*anc_ptr); - anc_size_remaining -= sizeof(u32); - anc_ptr += 1; - - if ((anc_writes_size * WCD9360_PACKED_REG_SIZE) > - anc_size_remaining) { - dev_err(codec->dev, "%s: Invalid register format\n", - __func__); - ret = -EINVAL; - goto err; - } - - if (pahu->anc_slot == i) - break; - - anc_size_remaining -= (anc_writes_size * - WCD9360_PACKED_REG_SIZE); - anc_ptr += anc_writes_size; - } - if (i == num_anc_slots) { - dev_err(codec->dev, "%s: Selected ANC slot not present\n", - __func__); - ret = -EINVAL; - goto err; - } - - for (i = 0; i < anc_writes_size; i++) { - WCD9360_CODEC_UNPACK_ENTRY(anc_ptr[i], reg, mask, val); - snd_soc_write(codec, reg, (val & mask)); - } - - if (!hwdep_cal) - release_firmware(fw); - break; - - case SND_SOC_DAPM_POST_PMU: - break; - - case SND_SOC_DAPM_POST_PMD: - if (!strcmp(w->name, "ANC EAR PA") || - !strcmp(w->name, "ANC SPK1 PA")) { - snd_soc_update_bits(codec, WCD9360_CDC_ANC0_MODE_1_CTL, - 0x30, 0x00); - msleep(50); - snd_soc_update_bits(codec, WCD9360_CDC_ANC0_MODE_1_CTL, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_ANC0_CLK_RESET_CTL, - 0x38, 0x38); - snd_soc_update_bits(codec, - WCD9360_CDC_ANC0_CLK_RESET_CTL, - 0x07, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_ANC0_CLK_RESET_CTL, - 0x38, 0x00); - } - break; - } - - return 0; -err: - if (!hwdep_cal) - release_firmware(fw); - return ret; -} - -static int pahu_get_clkmode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - - if (test_bit(CLK_MODE, &pahu_p->status_mask)) - ucontrol->value.enumerated.item[0] = 1; - else - ucontrol->value.enumerated.item[0] = 0; - - dev_dbg(codec->dev, "%s: is_low_power_clock: %s\n", __func__, - test_bit(CLK_MODE, &pahu_p->status_mask) ? "true" : "false"); - - return 0; -} - -static int pahu_put_clkmode(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - - if (ucontrol->value.enumerated.item[0]) - set_bit(CLK_MODE, &pahu_p->status_mask); - else - clear_bit(CLK_MODE, &pahu_p->status_mask); - - dev_dbg(codec->dev, "%s: is_low_power_clock: %s\n", __func__, - test_bit(CLK_MODE, &pahu_p->status_mask) ? "true" : "false"); - - return 0; -} - -static int pahu_vi_feed_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = pahu_p->vi_feed_value; - - return 0; -} - -static int pahu_vi_feed_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: enable: %d, port_id:%d, dai_id: %d\n", - __func__, enable, port_id, dai_id); - - pahu_p->vi_feed_value = ucontrol->value.integer.value[0]; - - mutex_lock(&pahu_p->codec_mutex); - if (enable) { - if (port_id == WCD9360_TX14 && !test_bit(VI_SENSE_1, - &pahu_p->status_mask)) { - list_add_tail(&core->tx_chs[WCD9360_TX14].list, - &pahu_p->dai[dai_id].wcd9xxx_ch_list); - set_bit(VI_SENSE_1, &pahu_p->status_mask); - } - if (port_id == WCD9360_TX15 && !test_bit(VI_SENSE_2, - &pahu_p->status_mask)) { - list_add_tail(&core->tx_chs[WCD9360_TX15].list, - &pahu_p->dai[dai_id].wcd9xxx_ch_list); - set_bit(VI_SENSE_2, &pahu_p->status_mask); - } - } else { - if (port_id == WCD9360_TX14 && test_bit(VI_SENSE_1, - &pahu_p->status_mask)) { - list_del_init(&core->tx_chs[WCD9360_TX14].list); - clear_bit(VI_SENSE_1, &pahu_p->status_mask); - } - if (port_id == WCD9360_TX15 && test_bit(VI_SENSE_2, - &pahu_p->status_mask)) { - list_del_init(&core->tx_chs[WCD9360_TX15].list); - clear_bit(VI_SENSE_2, &pahu_p->status_mask); - } - } - mutex_unlock(&pahu_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL); - - return 0; -} - -static int slim_tx_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = pahu_p->tx_port_value; - return 0; -} - -static int slim_tx_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct snd_soc_dapm_update *update = NULL; - struct soc_multi_mixer_control *mixer = - ((struct soc_multi_mixer_control *)kcontrol->private_value); - u32 dai_id = widget->shift; - u32 port_id = mixer->shift; - u32 enable = ucontrol->value.integer.value[0]; - u32 vtable; - - dev_dbg(codec->dev, "%s: wname %s cname %s value %u shift %d item %ld\n", - __func__, - widget->name, ucontrol->id.name, pahu_p->tx_port_value, - widget->shift, ucontrol->value.integer.value[0]); - - mutex_lock(&pahu_p->codec_mutex); - if (dai_id >= ARRAY_SIZE(vport_slim_check_table)) { - dev_err(codec->dev, "%s: dai_id: %d, out of bounds\n", - __func__, dai_id); - mutex_unlock(&pahu_p->codec_mutex); - return -EINVAL; - } - vtable = vport_slim_check_table[dai_id]; - - switch (dai_id) { - case AIF1_CAP: - case AIF2_CAP: - case AIF3_CAP: - /* only add to the list if value not set */ - if (enable && !(pahu_p->tx_port_value & 1 << port_id)) { - if (wcd9xxx_tx_vport_validation(vtable, port_id, - pahu_p->dai, NUM_CODEC_DAIS)) { - dev_dbg(codec->dev, "%s: TX%u is used by other virtual port\n", - __func__, port_id); - mutex_unlock(&pahu_p->codec_mutex); - return 0; - } - pahu_p->tx_port_value |= 1 << port_id; - list_add_tail(&core->tx_chs[port_id].list, - &pahu_p->dai[dai_id].wcd9xxx_ch_list); - } else if (!enable && (pahu_p->tx_port_value & - 1 << port_id)) { - pahu_p->tx_port_value &= ~(1 << port_id); - list_del_init(&core->tx_chs[port_id].list); - } else { - if (enable) - dev_dbg(codec->dev, "%s: TX%u port is used by\n" - "this virtual port\n", - __func__, port_id); - else - dev_dbg(codec->dev, "%s: TX%u port is not used by\n" - "this virtual port\n", - __func__, port_id); - /* avoid update power function */ - mutex_unlock(&pahu_p->codec_mutex); - return 0; - } - break; - case AIF4_MAD_TX: - break; - default: - dev_err(codec->dev, "Unknown AIF %d\n", dai_id); - mutex_unlock(&pahu_p->codec_mutex); - return -EINVAL; - } - dev_dbg(codec->dev, "%s: name %s sname %s updated value %u shift %d\n", - __func__, widget->name, widget->sname, pahu_p->tx_port_value, - widget->shift); - - mutex_unlock(&pahu_p->codec_mutex); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); - - return 0; -} - -static int slim_rx_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.enumerated.item[0] = - pahu_p->rx_port_value[widget->shift]; - return 0; -} - -static int slim_rx_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - unsigned int rx_port_value; - u32 port_id = widget->shift; - - pahu_p->rx_port_value[port_id] = ucontrol->value.enumerated.item[0]; - rx_port_value = pahu_p->rx_port_value[port_id]; - - mutex_lock(&pahu_p->codec_mutex); - dev_dbg(codec->dev, "%s: wname %s cname %s value %u shift %d item %ld\n", - __func__, widget->name, ucontrol->id.name, - rx_port_value, widget->shift, - ucontrol->value.integer.value[0]); - - /* value need to match the Virtual port and AIF number */ - switch (rx_port_value) { - case 0: - list_del_init(&core->rx_chs[port_id].list); - break; - case 1: - if (wcd9xxx_rx_vport_validation(port_id + - WCD9360_RX_PORT_START_NUMBER, - &pahu_p->dai[AIF1_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &pahu_p->dai[AIF1_PB].wcd9xxx_ch_list); - break; - case 2: - if (wcd9xxx_rx_vport_validation(port_id + - WCD9360_RX_PORT_START_NUMBER, - &pahu_p->dai[AIF2_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &pahu_p->dai[AIF2_PB].wcd9xxx_ch_list); - break; - case 3: - if (wcd9xxx_rx_vport_validation(port_id + - WCD9360_RX_PORT_START_NUMBER, - &pahu_p->dai[AIF3_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &pahu_p->dai[AIF3_PB].wcd9xxx_ch_list); - break; - case 4: - if (wcd9xxx_rx_vport_validation(port_id + - WCD9360_RX_PORT_START_NUMBER, - &pahu_p->dai[AIF4_PB].wcd9xxx_ch_list)) { - dev_dbg(codec->dev, "%s: RX%u is used by current requesting AIF_PB itself\n", - __func__, port_id); - goto rtn; - } - list_add_tail(&core->rx_chs[port_id].list, - &pahu_p->dai[AIF4_PB].wcd9xxx_ch_list); - break; - default: - dev_err(codec->dev, "Unknown AIF %d\n", rx_port_value); - goto err; - } -rtn: - mutex_unlock(&pahu_p->codec_mutex); - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - rx_port_value, e, update); - - return 0; -err: - mutex_unlock(&pahu_p->codec_mutex); - return -EINVAL; -} - -static void pahu_codec_enable_slim_port_intr( - struct wcd9xxx_codec_dai_data *dai, - struct snd_soc_codec *codec) -{ - struct wcd9xxx_ch *ch; - int port_num = 0; - unsigned short reg = 0; - u8 val = 0; - struct pahu_priv *pahu_p; - - if (!dai || !codec) { - pr_err("%s: Invalid params\n", __func__); - return; - } - - pahu_p = snd_soc_codec_get_drvdata(codec); - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - if (ch->port >= WCD9360_RX_PORT_START_NUMBER) { - port_num = ch->port - WCD9360_RX_PORT_START_NUMBER; - reg = WCD9360_SLIM_PGD_PORT_INT_RX_EN0 + (port_num / 8); - val = wcd9xxx_interface_reg_read(pahu_p->wcd9xxx, - reg); - if (!(val & BYTE_BIT_MASK(port_num))) { - val |= BYTE_BIT_MASK(port_num); - wcd9xxx_interface_reg_write( - pahu_p->wcd9xxx, reg, val); - val = wcd9xxx_interface_reg_read( - pahu_p->wcd9xxx, reg); - } - } else { - port_num = ch->port; - reg = WCD9360_SLIM_PGD_PORT_INT_TX_EN0 + (port_num / 8); - val = wcd9xxx_interface_reg_read(pahu_p->wcd9xxx, - reg); - if (!(val & BYTE_BIT_MASK(port_num))) { - val |= BYTE_BIT_MASK(port_num); - wcd9xxx_interface_reg_write(pahu_p->wcd9xxx, - reg, val); - val = wcd9xxx_interface_reg_read( - pahu_p->wcd9xxx, reg); - } - } - } -} - -static int pahu_codec_enable_slim_chmask(struct wcd9xxx_codec_dai_data *dai, - bool up) -{ - int ret = 0; - struct wcd9xxx_ch *ch; - - if (up) { - list_for_each_entry(ch, &dai->wcd9xxx_ch_list, list) { - ret = wcd9xxx_get_slave_port(ch->ch_num); - if (ret < 0) { - pr_err("%s: Invalid slave port ID: %d\n", - __func__, ret); - ret = -EINVAL; - } else { - set_bit(ret, &dai->ch_mask); - } - } - } else { - ret = wait_event_timeout(dai->dai_wait, (dai->ch_mask == 0), - msecs_to_jiffies( - WCD9360_SLIM_CLOSE_TIMEOUT)); - if (!ret) { - pr_err("%s: Slim close tx/rx wait timeout, ch_mask:0x%lx\n", - __func__, dai->ch_mask); - ret = -ETIMEDOUT; - } else { - ret = 0; - } - } - return ret; -} - -static int pahu_codec_enable_slimrx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct wcd9xxx *core; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - int ret = 0; - struct wcd9xxx_codec_dai_data *dai; - - core = dev_get_drvdata(codec->dev->parent); - - dev_dbg(codec->dev, "%s: event called! codec name %s num_dai %d\n" - "stream name %s event %d\n", - __func__, codec->component.name, - codec->component.num_dai, w->sname, event); - - dai = &pahu_p->dai[w->shift]; - dev_dbg(codec->dev, "%s: w->name %s w->shift %d event %d\n", - __func__, w->name, w->shift, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - dai->bus_down_in_recovery = false; - pahu_codec_enable_slim_port_intr(dai, codec); - (void) pahu_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_disconnect_port(core, &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect RX port, ret = %d\n", - __func__, ret); - - if (!dai->bus_down_in_recovery) - ret = pahu_codec_enable_slim_chmask(dai, false); - else - dev_dbg(codec->dev, - "%s: bus in recovery skip enable slim_chmask", - __func__); - ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list, - dai->grph); - break; - } - return ret; -} - -static int pahu_codec_enable_slimtx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu_p = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_codec_dai_data *dai; - struct wcd9xxx *core; - int ret = 0; - - dev_dbg(codec->dev, - "%s: w->name %s, w->shift = %d, num_dai %d stream name %s\n", - __func__, w->name, w->shift, - codec->component.num_dai, w->sname); - - dai = &pahu_p->dai[w->shift]; - core = dev_get_drvdata(codec->dev->parent); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - dai->bus_down_in_recovery = false; - pahu_codec_enable_slim_port_intr(dai, codec); - (void) pahu_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->grph); - if (!dai->bus_down_in_recovery) - ret = pahu_codec_enable_slim_chmask(dai, false); - if (ret < 0) { - ret = wcd9xxx_disconnect_port(core, - &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect RX port, ret = %d\n", - __func__, ret); - } - break; - } - return ret; -} - -static int pahu_codec_enable_slimvi_feedback(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct wcd9xxx *core = NULL; - struct snd_soc_codec *codec = NULL; - struct pahu_priv *pahu_p = NULL; - int ret = 0; - struct wcd9xxx_codec_dai_data *dai = NULL; - - codec = snd_soc_dapm_to_codec(w->dapm); - pahu_p = snd_soc_codec_get_drvdata(codec); - core = dev_get_drvdata(codec->dev->parent); - - dev_dbg(codec->dev, - "%s: num_dai %d stream name %s w->name %s event %d shift %d\n", - __func__, codec->component.num_dai, w->sname, - w->name, event, w->shift); - - if (w->shift != AIF4_VIFEED) { - pr_err("%s Error in enabling the tx path\n", __func__); - ret = -EINVAL; - goto done; - } - dai = &pahu_p->dai[w->shift]; - switch (event) { - case SND_SOC_DAPM_POST_PMU: - if (test_bit(VI_SENSE_1, &pahu_p->status_mask)) { - dev_dbg(codec->dev, "%s: spkr1 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL, 0x0F, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, - WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - if (test_bit(VI_SENSE_2, &pahu_p->status_mask)) { - pr_debug("%s: spkr2 enabled\n", __func__); - /* Enable V&I sensing */ - snd_soc_update_bits(codec, - WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL, 0x0F, - 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x10); - snd_soc_update_bits(codec, - WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x00); - } - dai->bus_down_in_recovery = false; - pahu_codec_enable_slim_port_intr(dai, codec); - (void) pahu_codec_enable_slim_chmask(dai, true); - ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->rate, dai->bit_width, - &dai->grph); - break; - case SND_SOC_DAPM_POST_PMD: - ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list, - dai->grph); - if (ret) - dev_err(codec->dev, "%s error in close_slim_sch_tx %d\n", - __func__, ret); - if (!dai->bus_down_in_recovery) - ret = pahu_codec_enable_slim_chmask(dai, false); - if (ret < 0) { - ret = wcd9xxx_disconnect_port(core, - &dai->wcd9xxx_ch_list, - dai->grph); - dev_dbg(codec->dev, "%s: Disconnect TX port, ret = %d\n", - __func__, ret); - } - if (test_bit(VI_SENSE_1, &pahu_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr1 disabled\n", __func__); - snd_soc_update_bits(codec, - WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - if (test_bit(VI_SENSE_2, &pahu_p->status_mask)) { - /* Disable V&I sensing */ - dev_dbg(codec->dev, "%s: spkr2 disabled\n", __func__); - snd_soc_update_bits(codec, - WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL, 0x20, - 0x20); - snd_soc_update_bits(codec, - WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL, 0x10, - 0x00); - } - break; - } -done: - return ret; -} - -static void pahu_codec_enable_i2s(struct snd_soc_codec *codec, bool enable) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - if (enable) { - if (++pahu->i2s_ref_cnt == 1) - snd_soc_update_bits(codec, WCD9360_DATA_HUB_I2S_1_CTL, - 0x01, 0x01); - } else { - if (--pahu->i2s_ref_cnt == 0) - snd_soc_update_bits(codec, WCD9360_DATA_HUB_I2S_1_CTL, - 0x01, 0x00); - } -} - -static int pahu_i2s_aif_rx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - switch(event) { - case SND_SOC_DAPM_PRE_PMU: - pahu_cdc_mclk_enable(codec, true); - break; - case SND_SOC_DAPM_POST_PMU: - pahu_codec_enable_i2s(codec, true); - break; - case SND_SOC_DAPM_PRE_PMD: - pahu_codec_enable_i2s(codec, false); - break; - case SND_SOC_DAPM_POST_PMD: - pahu_cdc_mclk_enable(codec, false); - break; - } - - return 0; -} - -static int pahu_i2s_aif_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - switch(event) { - case SND_SOC_DAPM_PRE_PMU: - pahu_cdc_mclk_enable(codec, true); - break; - case SND_SOC_DAPM_POST_PMU: - pahu_codec_enable_i2s(codec, true); - break; - case SND_SOC_DAPM_PRE_PMD: - pahu_codec_enable_i2s(codec, false); - break; - case SND_SOC_DAPM_POST_PMD: - pahu_cdc_mclk_enable(codec, false); - break; - } - - return 0; -} - -static int pahu_codec_enable_ldo_rxtx(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - pahu->ldo_rxtx_cnt++; - if (pahu->ldo_rxtx_cnt == 1) { - /* Enable VDD_LDO_RxTx regulator */ - msm_cdc_enable_ondemand_supply(pahu->wcd9xxx->dev, - pahu->wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies, - WCD9360_LDO_RXTX_SUPPLY_NAME); - - snd_soc_update_bits(codec, WCD9360_LDORXTX_LDORXTX, - 0x80, 0x80); - /* - * 200us sleep is required after LDO_RXTX is enabled as per - * HW requirement - */ - usleep_range(200, 250); - } - break; - case SND_SOC_DAPM_POST_PMD: - pahu->ldo_rxtx_cnt--; - if (pahu->ldo_rxtx_cnt < 0) - pahu->ldo_rxtx_cnt = 0; - - if (!pahu->ldo_rxtx_cnt) { - snd_soc_update_bits(codec, WCD9360_LDORXTX_LDORXTX, - 0x80, 0x00); - /* Disable VDD_LDO_RxTx regulator */ - msm_cdc_disable_ondemand_supply(pahu->wcd9xxx->dev, - pahu->wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies, - WCD9360_LDO_RXTX_SUPPLY_NAME); - } - break; - }; - dev_dbg(codec->dev, "%s: Current LDO RXTX user count: %d\n", __func__, - pahu->ldo_rxtx_cnt); - - return 0; -} - -static void pahu_spk_anc_update_callback(struct work_struct *work) -{ - struct spk_anc_work *spk_anc_dwork; - struct pahu_priv *pahu; - struct delayed_work *delayed_work; - struct snd_soc_codec *codec; - - delayed_work = to_delayed_work(work); - spk_anc_dwork = container_of(delayed_work, struct spk_anc_work, dwork); - pahu = spk_anc_dwork->pahu; - codec = pahu->codec; - - snd_soc_update_bits(codec, WCD9360_CDC_RX7_RX_PATH_CFG0, 0x10, 0x10); -} - -static int pahu_codec_enable_spkr_anc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - if (!pahu->anc_func) - return 0; - - dev_dbg(codec->dev, "%s: w: %s event: %d anc: %d\n", __func__, - w->name, event, pahu->anc_func); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = pahu_codec_enable_anc(w, kcontrol, event); - schedule_delayed_work(&pahu->spk_anc_dwork.dwork, - msecs_to_jiffies(spk_anc_en_delay)); - break; - case SND_SOC_DAPM_POST_PMD: - cancel_delayed_work_sync(&pahu->spk_anc_dwork.dwork); - snd_soc_update_bits(codec, WCD9360_CDC_RX7_RX_PATH_CFG0, - 0x10, 0x00); - ret = pahu_codec_enable_anc(w, kcontrol, event); - break; - } - return ret; -} - -static int pahu_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* - * 5ms sleep is required after PA is enabled as per - * HW requirement - */ - usleep_range(5000, 5500); - snd_soc_update_bits(codec, WCD9360_CDC_RX9_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD9360_CDC_RX9_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD9360_CDC_RX9_RX_PATH_MIX_CTL, - 0x10, 0x00); - break; - default: - break; - }; - - return ret; -} - -static int pahu_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* - * 5ms sleep is required after PA is enabled as per - * HW requirement - */ - usleep_range(5000, 5500); - snd_soc_update_bits(codec, WCD9360_CDC_RX0_RX_PATH_CTL, - 0x10, 0x00); - /* Remove mix path mute if it is enabled */ - if ((snd_soc_read(codec, WCD9360_CDC_RX0_RX_PATH_MIX_CTL)) & - 0x10) - snd_soc_update_bits(codec, - WCD9360_CDC_RX0_RX_PATH_MIX_CTL, - 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 5ms sleep is required after PA is disabled as per - * HW requirement - */ - usleep_range(5000, 5500); - - if (!(strcmp(w->name, "ANC EAR PA"))) { - ret = pahu_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, WCD9360_CDC_RX0_RX_PATH_CFG0, - 0x10, 0x00); - } - break; - }; - - return ret; -} - -static int pahu_codec_ear_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (pahu->anc_func) { - ret = pahu_codec_enable_anc(w, kcontrol, event); - snd_soc_update_bits(codec, WCD9360_CDC_RX0_RX_PATH_CFG0, - 0x10, 0x10); - } - break; - default: - break; - }; - - return ret; -} - -static int pahu_codec_spk_boost_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 boost_path_ctl, boost_path_cfg1; - u16 reg, reg_mix; - - dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event); - - if (!strcmp(w->name, "RX INT7 CHAIN")) { - boost_path_ctl = WCD9360_CDC_BOOST0_BOOST_PATH_CTL; - boost_path_cfg1 = WCD9360_CDC_RX7_RX_PATH_CFG1; - reg = WCD9360_CDC_RX7_RX_PATH_CTL; - reg_mix = WCD9360_CDC_RX7_RX_PATH_MIX_CTL; - } else if (!strcmp(w->name, "RX INT8 CHAIN")) { - boost_path_ctl = WCD9360_CDC_BOOST1_BOOST_PATH_CTL; - boost_path_cfg1 = WCD9360_CDC_RX8_RX_PATH_CFG1; - reg = WCD9360_CDC_RX8_RX_PATH_CTL; - reg_mix = WCD9360_CDC_RX8_RX_PATH_MIX_CTL; - } else { - dev_err(codec->dev, "%s: unknown widget: %s\n", - __func__, w->name); - return -EINVAL; - } - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x01); - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x10); - snd_soc_update_bits(codec, reg, 0x10, 0x00); - if ((snd_soc_read(codec, reg_mix)) & 0x10) - snd_soc_update_bits(codec, reg_mix, 0x10, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, boost_path_ctl, 0x10, 0x00); - snd_soc_update_bits(codec, boost_path_cfg1, 0x01, 0x00); - break; - }; - - return 0; -} - -static int __pahu_codec_enable_swr(struct snd_soc_dapm_widget *w, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu; - int ch_cnt = 0; - - pahu = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (((strnstr(w->name, "INT7_", sizeof("RX INT7_"))) || - (strnstr(w->name, "INT7 MIX2", - sizeof("RX INT7 MIX2"))))) - pahu->swr.rx_7_count++; - if ((strnstr(w->name, "INT8_", sizeof("RX INT8_"))) && - !pahu->swr.rx_8_count) - pahu->swr.rx_8_count++; - ch_cnt = !!(pahu->swr.rx_7_count) + pahu->swr.rx_8_count; - - swrm_wcd_notify(pahu->swr.ctrl_data[0].swr_pdev, - SWR_DEVICE_UP, NULL); - swrm_wcd_notify(pahu->swr.ctrl_data[0].swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - break; - case SND_SOC_DAPM_POST_PMD: - if ((strnstr(w->name, "INT7_", sizeof("RX INT7_"))) || - (strnstr(w->name, "INT7 MIX2", - sizeof("RX INT7 MIX2")))) - pahu->swr.rx_7_count--; - if ((strnstr(w->name, "INT8_", sizeof("RX INT8_"))) && - pahu->swr.rx_8_count) - pahu->swr.rx_8_count--; - ch_cnt = !!(pahu->swr.rx_7_count) + pahu->swr.rx_8_count; - - swrm_wcd_notify(pahu->swr.ctrl_data[0].swr_pdev, - SWR_SET_NUM_RX_CH, &ch_cnt); - - break; - } - dev_dbg(pahu->dev, "%s: %s: current swr ch cnt: %d\n", - __func__, w->name, ch_cnt); - - return 0; -} - -static int pahu_codec_enable_swr(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return __pahu_codec_enable_swr(w, event); -} - -static int pahu_codec_config_mad(struct snd_soc_codec *codec) -{ - int ret = 0; - int idx; - const struct firmware *fw; - struct firmware_cal *hwdep_cal = NULL; - struct wcd_mad_audio_cal *mad_cal = NULL; - const void *data; - const char *filename = WCD9360_MAD_AUDIO_FIRMWARE_PATH; - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - size_t cal_size; - - hwdep_cal = wcdcal_get_fw_cal(pahu->fw_data, WCD9XXX_MAD_CAL); - if (hwdep_cal) { - data = hwdep_cal->data; - cal_size = hwdep_cal->size; - dev_dbg(codec->dev, "%s: using hwdep calibration\n", - __func__); - } else { - ret = request_firmware(&fw, filename, codec->dev); - if (ret || !fw) { - dev_err(codec->dev, - "%s: MAD firmware acquire failed, err = %d\n", - __func__, ret); - return -ENODEV; - } - data = fw->data; - cal_size = fw->size; - dev_dbg(codec->dev, "%s: using request_firmware calibration\n", - __func__); - } - - if (cal_size < sizeof(*mad_cal)) { - dev_err(codec->dev, - "%s: Incorrect size %zd for MAD Cal, expected %zd\n", - __func__, cal_size, sizeof(*mad_cal)); - ret = -ENOMEM; - goto done; - } - - mad_cal = (struct wcd_mad_audio_cal *) (data); - if (!mad_cal) { - dev_err(codec->dev, - "%s: Invalid calibration data\n", - __func__); - ret = -EINVAL; - goto done; - } - - snd_soc_write(codec, WCD9360_SOC_MAD_MAIN_CTL_2, - mad_cal->microphone_info.cycle_time); - snd_soc_update_bits(codec, WCD9360_SOC_MAD_MAIN_CTL_1, 0xFF << 3, - ((uint16_t)mad_cal->microphone_info.settle_time) - << 3); - - /* Audio */ - snd_soc_write(codec, WCD9360_SOC_MAD_AUDIO_CTL_8, - mad_cal->audio_info.rms_omit_samples); - snd_soc_update_bits(codec, WCD9360_SOC_MAD_AUDIO_CTL_1, - 0x07 << 4, mad_cal->audio_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD9360_SOC_MAD_AUDIO_CTL_2, 0x03 << 2, - mad_cal->audio_info.detection_mechanism << 2); - snd_soc_write(codec, WCD9360_SOC_MAD_AUDIO_CTL_7, - mad_cal->audio_info.rms_diff_threshold & 0x3F); - snd_soc_write(codec, WCD9360_SOC_MAD_AUDIO_CTL_5, - mad_cal->audio_info.rms_threshold_lsb); - snd_soc_write(codec, WCD9360_SOC_MAD_AUDIO_CTL_6, - mad_cal->audio_info.rms_threshold_msb); - - for (idx = 0; idx < ARRAY_SIZE(mad_cal->audio_info.iir_coefficients); - idx++) { - snd_soc_update_bits(codec, WCD9360_SOC_MAD_AUDIO_IIR_CTL_PTR, - 0x3F, idx); - snd_soc_write(codec, WCD9360_SOC_MAD_AUDIO_IIR_CTL_VAL, - mad_cal->audio_info.iir_coefficients[idx]); - dev_dbg(codec->dev, "%s:MAD Audio IIR Coef[%d] = 0X%x", - __func__, idx, - mad_cal->audio_info.iir_coefficients[idx]); - } - - /* Beacon */ - snd_soc_write(codec, WCD9360_SOC_MAD_BEACON_CTL_8, - mad_cal->beacon_info.rms_omit_samples); - snd_soc_update_bits(codec, WCD9360_SOC_MAD_BEACON_CTL_1, - 0x07 << 4, mad_cal->beacon_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD9360_SOC_MAD_BEACON_CTL_2, 0x03 << 2, - mad_cal->beacon_info.detection_mechanism << 2); - snd_soc_write(codec, WCD9360_SOC_MAD_BEACON_CTL_7, - mad_cal->beacon_info.rms_diff_threshold & 0x1F); - snd_soc_write(codec, WCD9360_SOC_MAD_BEACON_CTL_5, - mad_cal->beacon_info.rms_threshold_lsb); - snd_soc_write(codec, WCD9360_SOC_MAD_BEACON_CTL_6, - mad_cal->beacon_info.rms_threshold_msb); - - for (idx = 0; idx < ARRAY_SIZE(mad_cal->beacon_info.iir_coefficients); - idx++) { - snd_soc_update_bits(codec, WCD9360_SOC_MAD_BEACON_IIR_CTL_PTR, - 0x3F, idx); - snd_soc_write(codec, WCD9360_SOC_MAD_BEACON_IIR_CTL_VAL, - mad_cal->beacon_info.iir_coefficients[idx]); - dev_dbg(codec->dev, "%s:MAD Beacon IIR Coef[%d] = 0X%x", - __func__, idx, - mad_cal->beacon_info.iir_coefficients[idx]); - } - - /* Ultrasound */ - snd_soc_update_bits(codec, WCD9360_SOC_MAD_ULTR_CTL_1, - 0x07 << 4, - mad_cal->ultrasound_info.rms_comp_time << 4); - snd_soc_update_bits(codec, WCD9360_SOC_MAD_ULTR_CTL_2, 0x03 << 2, - mad_cal->ultrasound_info.detection_mechanism << 2); - snd_soc_write(codec, WCD9360_SOC_MAD_ULTR_CTL_7, - mad_cal->ultrasound_info.rms_diff_threshold & 0x1F); - snd_soc_write(codec, WCD9360_SOC_MAD_ULTR_CTL_5, - mad_cal->ultrasound_info.rms_threshold_lsb); - snd_soc_write(codec, WCD9360_SOC_MAD_ULTR_CTL_6, - mad_cal->ultrasound_info.rms_threshold_msb); - -done: - if (!hwdep_cal) - release_firmware(fw); - - return ret; -} - -static int __pahu_codec_enable_mad(struct snd_soc_codec *codec, bool enable) -{ - int rc = 0; - - /* Return if CPE INPUT is DEC1 */ - if (snd_soc_read(codec, WCD9360_CPE_SS_SVA_CFG) & 0x04) { - dev_dbg(codec->dev, "%s: MAD is bypassed, skip mad %s\n", - __func__, enable ? "enable" : "disable"); - return rc; - } - - dev_dbg(codec->dev, "%s: enable = %s\n", __func__, - enable ? "enable" : "disable"); - - if (enable) { - snd_soc_update_bits(codec, WCD9360_SOC_MAD_AUDIO_CTL_2, - 0x03, 0x03); - rc = pahu_codec_config_mad(codec); - if (rc < 0) { - snd_soc_update_bits(codec, WCD9360_SOC_MAD_AUDIO_CTL_2, - 0x03, 0x00); - goto done; - } - - /* Turn on MAD clk */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_MAD_CTL, - 0x01, 0x01); - - /* Undo reset for MAD */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_MAD_CTL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD9360_CODEC_RPM_CLK_MCLK_CFG, - 0x04, 0x04); - } else { - snd_soc_update_bits(codec, WCD9360_SOC_MAD_AUDIO_CTL_2, - 0x03, 0x00); - /* Reset the MAD block */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_MAD_CTL, - 0x02, 0x02); - /* Turn off MAD clk */ - snd_soc_update_bits(codec, WCD9360_CPE_SS_MAD_CTL, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD9360_CODEC_RPM_CLK_MCLK_CFG, - 0x04, 0x00); - } -done: - return rc; -} - -static int pahu_codec_ape_enable_mad(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int rc = 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WCD9360_CPE_SS_SVA_CFG, 0x40, 0x40); - rc = __pahu_codec_enable_mad(codec, true); - break; - case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, WCD9360_CPE_SS_SVA_CFG, 0x40, 0x00); - __pahu_codec_enable_mad(codec, false); - break; - } - - dev_dbg(pahu->dev, "%s: event = %d\n", __func__, event); - return rc; -} - -static int pahu_codec_cpe_mad_ctl(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int rc = 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - pahu->mad_switch_cnt++; - if (pahu->mad_switch_cnt != 1) - goto done; - - snd_soc_update_bits(codec, WCD9360_CPE_SS_SVA_CFG, 0x20, 0x20); - rc = __pahu_codec_enable_mad(codec, true); - if (rc < 0) { - pahu->mad_switch_cnt--; - goto done; - } - - break; - case SND_SOC_DAPM_PRE_PMD: - pahu->mad_switch_cnt--; - if (pahu->mad_switch_cnt != 0) - goto done; - - snd_soc_update_bits(codec, WCD9360_CPE_SS_SVA_CFG, 0x20, 0x00); - __pahu_codec_enable_mad(codec, false); - break; - } -done: - dev_dbg(pahu->dev, "%s: event = %d, mad_switch_cnt = %d\n", - __func__, event, pahu->mad_switch_cnt); - return rc; -} - -static int pahu_get_asrc_mode(struct pahu_priv *pahu, int asrc, - u8 main_sr, u8 mix_sr) -{ - u8 asrc_output_mode; - int asrc_mode = CONV_88P2K_TO_384K; - - if ((asrc < 0) || (asrc >= ASRC_MAX)) - return 0; - - asrc_output_mode = pahu->asrc_output_mode[asrc]; - - if (asrc_output_mode) { - /* - * If Mix sample rate is < 96KHz, use 96K to 352.8K - * conversion, or else use 384K to 352.8K conversion - */ - if (mix_sr < 5) - asrc_mode = CONV_96K_TO_352P8K; - else - asrc_mode = CONV_384K_TO_352P8K; - } else { - /* Integer main and Fractional mix path */ - if (main_sr < 8 && mix_sr > 9) { - asrc_mode = CONV_352P8K_TO_384K; - } else if (main_sr > 8 && mix_sr < 8) { - /* Fractional main and Integer mix path */ - if (mix_sr < 5) - asrc_mode = CONV_96K_TO_352P8K; - else - asrc_mode = CONV_384K_TO_352P8K; - } else if (main_sr < 8 && mix_sr < 8) { - /* Integer main and Integer mix path */ - asrc_mode = CONV_96K_TO_384K; - } - } - - return asrc_mode; -} - -static int pahu_codec_wdma3_ctl(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* Fix to 16KHz */ - snd_soc_update_bits(codec, WCD9360_DMA_WDMA_CTL_3, - 0xF0, 0x10); - /* Select mclk_1 */ - snd_soc_update_bits(codec, WCD9360_DMA_WDMA_CTL_3, - 0x02, 0x00); - /* Enable DMA */ - snd_soc_update_bits(codec, WCD9360_DMA_WDMA_CTL_3, - 0x01, 0x01); - break; - - case SND_SOC_DAPM_POST_PMD: - /* Disable DMA */ - snd_soc_update_bits(codec, WCD9360_DMA_WDMA_CTL_3, - 0x01, 0x00); - break; - - }; - - return 0; -} -static int pahu_codec_enable_asrc(struct snd_soc_codec *codec, - int asrc_in, int event) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - u16 cfg_reg, ctl_reg, clk_reg, asrc_ctl, mix_ctl_reg, paired_reg; - int asrc, ret = 0; - u8 main_sr, mix_sr, asrc_mode = 0; - - switch (asrc_in) { - case ASRC_IN_SPKR1: - cfg_reg = WCD9360_CDC_RX7_RX_PATH_CFG0; - ctl_reg = WCD9360_CDC_RX7_RX_PATH_CTL; - clk_reg = WCD9360_MIXING_ASRC2_CLK_RST_CTL; - paired_reg = WCD9360_MIXING_ASRC2_CLK_RST_CTL; - asrc_ctl = WCD9360_MIXING_ASRC2_CTL1; - asrc = ASRC2; - break; - case ASRC_IN_SPKR2: - cfg_reg = WCD9360_CDC_RX8_RX_PATH_CFG0; - ctl_reg = WCD9360_CDC_RX8_RX_PATH_CTL; - clk_reg = WCD9360_MIXING_ASRC3_CLK_RST_CTL; - paired_reg = WCD9360_MIXING_ASRC3_CLK_RST_CTL; - asrc_ctl = WCD9360_MIXING_ASRC3_CTL1; - asrc = ASRC3; - break; - default: - dev_err(codec->dev, "%s: Invalid asrc input :%d\n", __func__, - asrc_in); - ret = -EINVAL; - goto done; - }; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (pahu->asrc_users[asrc] == 0) { - if ((snd_soc_read(codec, clk_reg) & 0x02) || - (snd_soc_read(codec, paired_reg) & 0x02)) { - snd_soc_update_bits(codec, clk_reg, - 0x02, 0x00); - snd_soc_update_bits(codec, paired_reg, - 0x02, 0x00); - } - snd_soc_update_bits(codec, cfg_reg, 0x80, 0x80); - snd_soc_update_bits(codec, clk_reg, 0x01, 0x01); - main_sr = snd_soc_read(codec, ctl_reg) & 0x0F; - mix_ctl_reg = ctl_reg + 5; - mix_sr = snd_soc_read(codec, mix_ctl_reg) & 0x0F; - asrc_mode = pahu_get_asrc_mode(pahu, asrc, - main_sr, mix_sr); - dev_dbg(codec->dev, "%s: main_sr:%d mix_sr:%d asrc_mode %d\n", - __func__, main_sr, mix_sr, asrc_mode); - snd_soc_update_bits(codec, asrc_ctl, 0x07, asrc_mode); - } - pahu->asrc_users[asrc]++; - break; - case SND_SOC_DAPM_POST_PMD: - pahu->asrc_users[asrc]--; - if (pahu->asrc_users[asrc] <= 0) { - pahu->asrc_users[asrc] = 0; - snd_soc_update_bits(codec, asrc_ctl, 0x07, 0x00); - snd_soc_update_bits(codec, cfg_reg, 0x80, 0x00); - snd_soc_update_bits(codec, clk_reg, 0x03, 0x02); - } - break; - }; - - dev_dbg(codec->dev, "%s: ASRC%d, users: %d\n", - __func__, asrc, pahu->asrc_users[asrc]); - -done: - return ret; -} - -static int pahu_codec_enable_asrc_resampler(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - u8 cfg, asrc_in; - - cfg = snd_soc_read(codec, WCD9360_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0); - if (!(cfg & 0xFF)) { - dev_err(codec->dev, "%s: ASRC%u input not selected\n", - __func__, w->shift); - return -EINVAL; - } - - switch (w->shift) { - case ASRC2: - asrc_in = ((cfg & 0x30) == 0x20) ? ASRC_IN_SPKR1 : ASRC_INVALID; - ret = pahu_codec_enable_asrc(codec, asrc_in, event); - break; - case ASRC3: - asrc_in = ((cfg & 0xC0) == 0x80) ? ASRC_IN_SPKR2 : ASRC_INVALID; - ret = pahu_codec_enable_asrc(codec, asrc_in, event); - break; - default: - dev_err(codec->dev, "%s: Invalid asrc:%u\n", __func__, - w->shift); - ret = -EINVAL; - break; - }; - - return ret; -} - -static int pahu_enable_native_supply(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (++pahu->native_clk_users == 1) { - snd_soc_update_bits(codec, WCD9360_CLK_SYS_PLL_ENABLES, - 0x01, 0x01); - usleep_range(100, 120); - snd_soc_update_bits(codec, WCD9360_CLK_SYS_MCLK2_PRG1, - 0x06, 0x02); - snd_soc_update_bits(codec, WCD9360_CLK_SYS_MCLK2_PRG1, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD9360_CODEC_RPM_CLK_GATE, - 0x04, 0x00); - /* Add sleep as per HW register sequence */ - usleep_range(30, 50); - snd_soc_update_bits(codec, - WCD9360_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x02); - snd_soc_update_bits(codec, - WCD9360_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x10, 0x10); - } - break; - case SND_SOC_DAPM_PRE_PMD: - if (pahu->native_clk_users && - (--pahu->native_clk_users == 0)) { - snd_soc_update_bits(codec, - WCD9360_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x10, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD9360_CODEC_RPM_CLK_GATE, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD9360_CLK_SYS_MCLK2_PRG1, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD9360_CLK_SYS_MCLK2_PRG1, - 0x06, 0x00); - snd_soc_update_bits(codec, WCD9360_CLK_SYS_PLL_ENABLES, - 0x01, 0x00); - } - break; - } - - dev_dbg(codec->dev, "%s: native_clk_users: %d, event: %d\n", - __func__, pahu->native_clk_users, event); - - return 0; -} - -static int pahu_codec_config_ear_spkr_gain(struct snd_soc_codec *codec, - int event, int gain_reg) -{ - int comp_gain_offset, val; - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - switch (pahu->swr.spkr_mode) { - /* Compander gain in SPKR_MODE1 case is 12 dB */ - case WCD9360_SPKR_MODE_1: - comp_gain_offset = -12; - break; - /* Default case compander gain is 15 dB */ - default: - comp_gain_offset = -15; - break; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - /* Apply ear spkr gain only if compander is enabled */ - if (pahu->comp_enabled[COMPANDER_7] && - (gain_reg == WCD9360_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9360_CDC_RX7_RX_VOL_MIX_CTL) && - (pahu->ear_spkr_gain != 0)) { - /* For example, val is -8(-12+5-1) for 4dB of gain */ - val = comp_gain_offset + pahu->ear_spkr_gain - 1; - snd_soc_write(codec, gain_reg, val); - - dev_dbg(codec->dev, "%s: RX7 Volume %d dB\n", - __func__, val); - } - break; - case SND_SOC_DAPM_POST_PMD: - /* - * Reset RX7 volume to 0 dB if compander is enabled and - * ear_spkr_gain is non-zero. - */ - if (pahu->comp_enabled[COMPANDER_7] && - (gain_reg == WCD9360_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9360_CDC_RX7_RX_VOL_MIX_CTL) && - (pahu->ear_spkr_gain != 0)) { - snd_soc_write(codec, gain_reg, 0x0); - - dev_dbg(codec->dev, "%s: Reset RX7 Volume to 0 dB\n", - __func__); - } - break; - } - - return 0; -} - -static int pahu_config_compander(struct snd_soc_codec *codec, int interp_n, - int event) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int comp; - u16 comp_ctl0_reg, rx_path_cfg0_reg; - - /* HPH, LO are not valid and AUX does not have compander */ - if (((interp_n >= INTERP_HPHL_NA) && (interp_n <= INTERP_LO4_NA)) || - (interp_n == INTERP_AUX)) - return 0; - - comp = interp_n; - dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n", - __func__, event, comp, pahu->comp_enabled[comp]); - - if (!pahu->comp_enabled[comp]) - return 0; - - comp_ctl0_reg = WCD9360_CDC_COMPANDER0_CTL0 + (comp * 8); - rx_path_cfg0_reg = WCD9360_CDC_RX0_RX_PATH_CFG0 + (comp * 20); - - if (SND_SOC_DAPM_EVENT_ON(event)) { - /* Enable Compander Clock */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01); - /* Soft reset */ - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - /* Compander enable */ - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02); - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00); - snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00); - } - - return 0; -} - -/** - * pahu_codec_enable_interp_clk - Enable main path Interpolator - * clock. - * - * @codec: Codec instance - * @event: Indicates speaker path gain offset value - * @intp_idx: Interpolator index - * Returns number of main clock users - */ -int pahu_codec_enable_interp_clk(struct snd_soc_codec *codec, - int event, int interp_idx) -{ - struct pahu_priv *pahu; - u16 main_reg; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - pahu = snd_soc_codec_get_drvdata(codec); - - main_reg = WCD9360_CDC_RX0_RX_PATH_CTL + - (interp_idx * WCD9360_RX_PATH_CTL_OFFSET); - - if (interp_idx == INTERP_AUX) - main_reg = WCD9360_CDC_RX9_RX_PATH_CTL; - - if (SND_SOC_DAPM_EVENT_ON(event)) { - if (pahu->main_clk_users[interp_idx] == 0) { - /* Main path PGA mute enable */ - snd_soc_update_bits(codec, main_reg, 0x10, 0x10); - /* Clk enable */ - snd_soc_update_bits(codec, main_reg, 0x20, 0x20); - pahu_config_compander(codec, interp_idx, event); - } - pahu->main_clk_users[interp_idx]++; - } - - if (SND_SOC_DAPM_EVENT_OFF(event)) { - pahu->main_clk_users[interp_idx]--; - if (pahu->main_clk_users[interp_idx] <= 0) { - pahu->main_clk_users[interp_idx] = 0; - pahu_config_compander(codec, interp_idx, event); - /* Clk Disable */ - snd_soc_update_bits(codec, main_reg, 0x20, 0x00); - /* Reset enable and disable */ - snd_soc_update_bits(codec, main_reg, 0x40, 0x40); - snd_soc_update_bits(codec, main_reg, 0x40, 0x00); - /* Reset rate to 48K*/ - snd_soc_update_bits(codec, main_reg, 0x0F, 0x04); - } - } - - dev_dbg(codec->dev, "%s event %d main_clk_users %d\n", - __func__, event, pahu->main_clk_users[interp_idx]); - - return pahu->main_clk_users[interp_idx]; -} -EXPORT_SYMBOL(pahu_codec_enable_interp_clk); - -static int pahu_codec_enable_mix_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - u16 gain_reg, mix_reg; - int offset_val = 0; - int val = 0; - - if (w->shift >= WCD9360_NUM_INTERPOLATORS || - ((w->shift >= INTERP_HPHL_NA) && (w->shift <= INTERP_LO4_NA))) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - }; - - gain_reg = WCD9360_CDC_RX0_RX_VOL_MIX_CTL + - (w->shift * WCD9360_RX_PATH_CTL_OFFSET); - mix_reg = WCD9360_CDC_RX0_RX_PATH_MIX_CTL + - (w->shift * WCD9360_RX_PATH_CTL_OFFSET); - - if (w->shift == INTERP_AUX) { - gain_reg = WCD9360_CDC_RX9_RX_VOL_MIX_CTL; - mix_reg = WCD9360_CDC_RX9_RX_PATH_MIX_CTL; - } - - if (w->shift == INTERP_SPKR1 || w->shift == INTERP_SPKR2) - __pahu_codec_enable_swr(w, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - pahu_codec_enable_interp_clk(codec, event, w->shift); - /* Clk enable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x20); - break; - case SND_SOC_DAPM_POST_PMU: - if ((pahu->swr.spkr_gain_offset == - WCD9360_RX_GAIN_OFFSET_M1P5_DB) && - (pahu->comp_enabled[COMPANDER_7] || - pahu->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9360_CDC_RX7_RX_VOL_MIX_CTL || - gain_reg == WCD9360_CDC_RX8_RX_VOL_MIX_CTL)) { - snd_soc_update_bits(codec, WCD9360_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9360_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD9360_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9360_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - pahu_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - /* Clk Disable */ - snd_soc_update_bits(codec, mix_reg, 0x20, 0x00); - pahu_codec_enable_interp_clk(codec, event, w->shift); - /* Reset enable and disable */ - snd_soc_update_bits(codec, mix_reg, 0x40, 0x40); - snd_soc_update_bits(codec, mix_reg, 0x40, 0x00); - - if ((pahu->swr.spkr_gain_offset == - WCD9360_RX_GAIN_OFFSET_M1P5_DB) && - (pahu->comp_enabled[COMPANDER_7] || - pahu->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9360_CDC_RX7_RX_VOL_MIX_CTL || - gain_reg == WCD9360_CDC_RX8_RX_VOL_MIX_CTL)) { - snd_soc_update_bits(codec, WCD9360_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD9360_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - pahu_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - }; - dev_dbg(codec->dev, "%s event %d name %s\n", __func__, event, w->name); - - return 0; -} - -static int pahu_codec_enable_main_path(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - u16 gain_reg; - u16 reg; - int val; - int offset_val = 0; - - dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name); - - if (w->shift >= WCD9360_NUM_INTERPOLATORS || - ((w->shift >= INTERP_HPHL_NA) && (w->shift <= INTERP_LO4_NA))) { - dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n", - __func__, w->shift, w->name); - return -EINVAL; - }; - - reg = WCD9360_CDC_RX0_RX_PATH_CTL + (w->shift * - WCD9360_RX_PATH_CTL_OFFSET); - gain_reg = WCD9360_CDC_RX0_RX_VOL_CTL + (w->shift * - WCD9360_RX_PATH_CTL_OFFSET); - - if (w->shift == INTERP_AUX) { - reg = WCD9360_CDC_RX9_RX_PATH_CTL; - gain_reg = WCD9360_CDC_RX9_RX_VOL_CTL; - } - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - pahu_codec_enable_interp_clk(codec, event, w->shift); - break; - case SND_SOC_DAPM_POST_PMU: - /* apply gain after int clk is enabled */ - if ((pahu->swr.spkr_gain_offset == - WCD9360_RX_GAIN_OFFSET_M1P5_DB) && - (pahu->comp_enabled[COMPANDER_7] || - pahu->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9360_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9360_CDC_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, WCD9360_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9360_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD9360_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD9360_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x01); - offset_val = -2; - } - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - pahu_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - case SND_SOC_DAPM_POST_PMD: - pahu_codec_enable_interp_clk(codec, event, w->shift); - - if ((pahu->swr.spkr_gain_offset == - WCD9360_RX_GAIN_OFFSET_M1P5_DB) && - (pahu->comp_enabled[COMPANDER_7] || - pahu->comp_enabled[COMPANDER_8]) && - (gain_reg == WCD9360_CDC_RX7_RX_VOL_CTL || - gain_reg == WCD9360_CDC_RX8_RX_VOL_CTL)) { - snd_soc_update_bits(codec, WCD9360_CDC_RX7_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_RX7_RX_PATH_MIX_SEC0, - 0x01, 0x00); - snd_soc_update_bits(codec, WCD9360_CDC_RX8_RX_PATH_SEC1, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD9360_CDC_RX8_RX_PATH_MIX_SEC0, - 0x01, 0x00); - offset_val = 2; - val = snd_soc_read(codec, gain_reg); - val += offset_val; - snd_soc_write(codec, gain_reg, val); - } - pahu_codec_config_ear_spkr_gain(codec, event, gain_reg); - break; - }; - - return 0; -} - -static int pahu_codec_set_iir_gain(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: /* fall through */ - case SND_SOC_DAPM_PRE_PMD: - if (strnstr(w->name, "IIR0", sizeof("IIR0"))) { - snd_soc_write(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, - snd_soc_read(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL)); - snd_soc_write(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, - snd_soc_read(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL)); - snd_soc_write(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, - snd_soc_read(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL)); - snd_soc_write(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, - snd_soc_read(codec, - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL)); - } - break; - } - return 0; -} - -static int pahu_codec_find_amic_input(struct snd_soc_codec *codec, - int adc_mux_n) -{ - u16 mask, shift, adc_mux_in_reg; - u16 amic_mux_sel_reg; - bool is_amic; - - if (adc_mux_n < 0 || adc_mux_n > WCD9360_MAX_VALID_ADC_MUX || - adc_mux_n == WCD9360_INVALID_ADC_MUX) - return 0; - - if (adc_mux_n < 3) { - adc_mux_in_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - 2 * adc_mux_n; - mask = 0x03; - shift = 0; - amic_mux_sel_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - 2 * adc_mux_n; - } else if (adc_mux_n < 4) { - adc_mux_in_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1; - mask = 0x03; - shift = 0; - amic_mux_sel_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - 2 * adc_mux_n; - } else if (adc_mux_n < 7) { - adc_mux_in_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - 2 * (adc_mux_n - 4); - mask = 0x0C; - shift = 2; - amic_mux_sel_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_n - 4; - } else if (adc_mux_n < 8) { - adc_mux_in_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1; - mask = 0x0C; - shift = 2; - amic_mux_sel_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_n - 4; - } else if (adc_mux_n < 12) { - adc_mux_in_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + - 2 * (((adc_mux_n == 8) ? (adc_mux_n - 8) : - (adc_mux_n - 9))); - mask = 0x30; - shift = 4; - amic_mux_sel_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX8_CFG0 + - ((adc_mux_n == 8) ? (adc_mux_n - 8) : - (adc_mux_n - 9)); - } - - is_amic = (((snd_soc_read(codec, adc_mux_in_reg) & mask) >> shift) - == 1); - if (!is_amic) - return 0; - - return snd_soc_read(codec, amic_mux_sel_reg) & 0x07; -} - -static void pahu_codec_set_tx_hold(struct snd_soc_codec *codec, - u16 amic_reg, bool set) -{ - u8 mask = 0x20; - u8 val; - - if (amic_reg == WCD9360_ANA_AMIC1 || - amic_reg == WCD9360_ANA_AMIC3) - mask = 0x40; - - val = set ? mask : 0x00; - - switch (amic_reg) { - case WCD9360_ANA_AMIC1: - case WCD9360_ANA_AMIC2: - snd_soc_update_bits(codec, WCD9360_ANA_AMIC2, mask, val); - break; - case WCD9360_ANA_AMIC3: - case WCD9360_ANA_AMIC4: - snd_soc_update_bits(codec, WCD9360_ANA_AMIC4, mask, val); - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic_reg); - break; - } -} - -static int pahu_codec_tx_adc_cfg(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - int adc_mux_n = w->shift; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int amic_n; - - dev_dbg(codec->dev, "%s: event: %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - amic_n = pahu_codec_find_amic_input(codec, adc_mux_n); - break; - default: - break; - } - - return 0; -} - -static u16 pahu_codec_get_amic_pwlvl_reg(struct snd_soc_codec *codec, int amic) -{ - u16 pwr_level_reg = 0; - - switch (amic) { - case 1: - case 2: - pwr_level_reg = WCD9360_ANA_AMIC1; - break; - - case 3: - case 4: - pwr_level_reg = WCD9360_ANA_AMIC3; - break; - default: - dev_dbg(codec->dev, "%s: invalid amic: %d\n", - __func__, amic); - break; - } - - return pwr_level_reg; -} - -#define TX_HPF_CUT_OFF_FREQ_MASK 0x60 -#define CF_MIN_3DB_4HZ 0x0 -#define CF_MIN_3DB_75HZ 0x1 -#define CF_MIN_3DB_150HZ 0x2 - -static void pahu_tx_hpf_corner_freq_callback(struct work_struct *work) -{ - struct delayed_work *hpf_delayed_work; - struct hpf_work *hpf_work; - struct pahu_priv *pahu; - struct snd_soc_codec *codec; - u16 dec_cfg_reg, amic_reg, go_bit_reg; - u8 hpf_cut_off_freq; - int amic_n; - - hpf_delayed_work = to_delayed_work(work); - hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork); - pahu = hpf_work->pahu; - codec = pahu->codec; - hpf_cut_off_freq = hpf_work->hpf_cut_off_freq; - - dec_cfg_reg = WCD9360_CDC_TX0_TX_PATH_CFG0 + 16 * hpf_work->decimator; - go_bit_reg = dec_cfg_reg + 7; - - dev_dbg(codec->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n", - __func__, hpf_work->decimator, hpf_cut_off_freq); - - amic_n = pahu_codec_find_amic_input(codec, hpf_work->decimator); - if (amic_n) { - amic_reg = WCD9360_ANA_AMIC1 + amic_n - 1; - pahu_codec_set_tx_hold(codec, amic_reg, false); - } - snd_soc_update_bits(codec, dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, go_bit_reg, 0x02, 0x02); - /* Minimum 1 clk cycle delay is required as per HW spec */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, go_bit_reg, 0x02, 0x00); -} - -static void pahu_tx_mute_update_callback(struct work_struct *work) -{ - struct tx_mute_work *tx_mute_dwork; - struct pahu_priv *pahu; - struct delayed_work *delayed_work; - struct snd_soc_codec *codec; - u16 tx_vol_ctl_reg; - - delayed_work = to_delayed_work(work); - tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork); - pahu = tx_mute_dwork->pahu; - codec = pahu->codec; - - tx_vol_ctl_reg = WCD9360_CDC_TX0_TX_PATH_CTL + - 16 * tx_mute_dwork->decimator; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); -} - -static int pahu_codec_enable_rx_path_clk(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - u16 sidetone_reg; - - dev_dbg(codec->dev, "%s %d %d\n", __func__, event, w->shift); - sidetone_reg = WCD9360_CDC_RX0_RX_PATH_CFG1 + 0x14*(w->shift); - - if (w->shift == INTERP_AUX) - sidetone_reg = WCD9360_CDC_RX9_RX_PATH_CFG1; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (!strcmp(w->name, "RX INT7 MIX2 INP")) - __pahu_codec_enable_swr(w, event); - pahu_codec_enable_interp_clk(codec, event, w->shift); - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x00); - pahu_codec_enable_interp_clk(codec, event, w->shift); - if (!strcmp(w->name, "RX INT7 MIX2 INP")) - __pahu_codec_enable_swr(w, event); - break; - default: - break; - }; - return 0; -} - -static int pahu_codec_enable_dec(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - unsigned int decimator; - char *dec_adc_mux_name = NULL; - char *widget_name = NULL; - char *wname; - int ret = 0, amic_n; - u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg; - u16 tx_gain_ctl_reg; - char *dec; - u8 hpf_cut_off_freq; - - dev_dbg(codec->dev, "%s %d\n", __func__, event); - - widget_name = kstrndup(w->name, 15, GFP_KERNEL); - if (!widget_name) - return -ENOMEM; - - wname = widget_name; - dec_adc_mux_name = strsep(&widget_name, " "); - if (!dec_adc_mux_name) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, w->name); - ret = -EINVAL; - goto out; - } - dec_adc_mux_name = widget_name; - - dec = strpbrk(dec_adc_mux_name, "012345678"); - if (!dec) { - dev_err(codec->dev, "%s: decimator index not found\n", - __func__); - ret = -EINVAL; - goto out; - } - - ret = kstrtouint(dec, 10, &decimator); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid decimator = %s\n", - __func__, wname); - ret = -EINVAL; - goto out; - } - - dev_dbg(codec->dev, "%s(): widget = %s decimator = %u\n", __func__, - w->name, decimator); - - tx_vol_ctl_reg = WCD9360_CDC_TX0_TX_PATH_CTL + 16 * decimator; - hpf_gate_reg = WCD9360_CDC_TX0_TX_PATH_SEC2 + 16 * decimator; - dec_cfg_reg = WCD9360_CDC_TX0_TX_PATH_CFG0 + 16 * decimator; - tx_gain_ctl_reg = WCD9360_CDC_TX0_TX_VOL_CTL + 16 * decimator; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - amic_n = pahu_codec_find_amic_input(codec, decimator); - if (amic_n) - pwr_level_reg = pahu_codec_get_amic_pwlvl_reg(codec, - amic_n); - - if (pwr_level_reg) { - switch ((snd_soc_read(codec, pwr_level_reg) & - WCD9360_AMIC_PWR_LVL_MASK) >> - WCD9360_AMIC_PWR_LVL_SHIFT) { - case WCD9360_AMIC_PWR_LEVEL_LP: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD9360_DEC_PWR_LVL_MASK, - WCD9360_DEC_PWR_LVL_LP); - break; - - case WCD9360_AMIC_PWR_LEVEL_HP: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD9360_DEC_PWR_LVL_MASK, - WCD9360_DEC_PWR_LVL_HP); - break; - case WCD9360_AMIC_PWR_LEVEL_DEFAULT: - default: - snd_soc_update_bits(codec, dec_cfg_reg, - WCD9360_DEC_PWR_LVL_MASK, - WCD9360_DEC_PWR_LVL_DF); - break; - } - } - /* Enable TX PGA Mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - break; - case SND_SOC_DAPM_POST_PMU: - hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) & - TX_HPF_CUT_OFF_FREQ_MASK) >> 5; - - pahu->tx_hpf_work[decimator].hpf_cut_off_freq = - hpf_cut_off_freq; - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - CF_MIN_3DB_150HZ << 5); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per - * HW spec. - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, 0x02, 0x00); - } - /* schedule work queue to Remove Mute */ - schedule_delayed_work(&pahu->tx_mute_dwork[decimator].dwork, - msecs_to_jiffies(tx_unmute_delay)); - if (pahu->tx_hpf_work[decimator].hpf_cut_off_freq != - CF_MIN_3DB_150HZ) - schedule_delayed_work( - &pahu->tx_hpf_work[decimator].dwork, - msecs_to_jiffies(300)); - /* apply gain after decimator is enabled */ - snd_soc_write(codec, tx_gain_ctl_reg, - snd_soc_read(codec, tx_gain_ctl_reg)); - break; - case SND_SOC_DAPM_PRE_PMD: - hpf_cut_off_freq = - pahu->tx_hpf_work[decimator].hpf_cut_off_freq; - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10); - if (cancel_delayed_work_sync( - &pahu->tx_hpf_work[decimator].dwork)) { - if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) { - snd_soc_update_bits(codec, dec_cfg_reg, - TX_HPF_CUT_OFF_FREQ_MASK, - hpf_cut_off_freq << 5); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x02); - /* - * Minimum 1 clk cycle delay is required as per - * HW spec. - */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, hpf_gate_reg, - 0x02, 0x00); - } - } - cancel_delayed_work_sync( - &pahu->tx_mute_dwork[decimator].dwork); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00); - snd_soc_update_bits(codec, dec_cfg_reg, - WCD9360_DEC_PWR_LVL_MASK, - WCD9360_DEC_PWR_LVL_DF); - break; - }; -out: - kfree(wname); - return ret; -} - -static u32 pahu_get_dmic_sample_rate(struct snd_soc_codec *codec, - unsigned int dmic, - struct wcd9xxx_pdata *pdata) -{ - u8 tx_stream_fs; - u8 adc_mux_index = 0, adc_mux_sel = 0; - bool dec_found = false; - u16 adc_mux_ctl_reg, tx_fs_reg; - u32 dmic_fs; - - while (dec_found == 0 && adc_mux_index < WCD9360_MAX_VALID_ADC_MUX) { - if (adc_mux_index < 4) { - adc_mux_ctl_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + - (adc_mux_index * 2); - } else if (adc_mux_index < WCD9360_INVALID_ADC_MUX) { - adc_mux_ctl_reg = WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + - adc_mux_index - 4; - } else if (adc_mux_index == WCD9360_INVALID_ADC_MUX) { - ++adc_mux_index; - continue; - } - adc_mux_sel = ((snd_soc_read(codec, adc_mux_ctl_reg) & - 0xF8) >> 3) - 1; - - if (adc_mux_sel == dmic) { - dec_found = true; - break; - } - - ++adc_mux_index; - } - - if (dec_found && adc_mux_index <= 8) { - tx_fs_reg = WCD9360_CDC_TX0_TX_PATH_CTL + (16 * adc_mux_index); - tx_stream_fs = snd_soc_read(codec, tx_fs_reg) & 0x0F; - if (tx_stream_fs <= 4) { - if (pdata->dmic_sample_rate <= - WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ) - dmic_fs = pdata->dmic_sample_rate; - else - dmic_fs = WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ; - } else - dmic_fs = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ; - } else { - dmic_fs = pdata->dmic_sample_rate; - } - - return dmic_fs; -} - -static u8 pahu_get_dmic_clk_val(struct snd_soc_codec *codec, - u32 dmic_clk_rate) -{ - u32 div_factor; - u8 dmic_ctl_val = WCD9360_DMIC_CLK_DIV_2; - - dev_dbg(codec->dev, "%s: dmic_sample_rate = %d\n", - __func__, dmic_clk_rate); - - if (dmic_clk_rate == 0) { - dev_err(codec->dev, "%s: dmic_sample_rate cannot be 0\n", - __func__); - goto done; - } - - div_factor = WCD9360_MCLK_CLK_9P6MHZ / dmic_clk_rate; - switch (div_factor) { - case 2: - dmic_ctl_val = WCD9360_DMIC_CLK_DIV_2; - break; - case 3: - dmic_ctl_val = WCD9360_DMIC_CLK_DIV_3; - break; - case 4: - dmic_ctl_val = WCD9360_DMIC_CLK_DIV_4; - break; - case 6: - dmic_ctl_val = WCD9360_DMIC_CLK_DIV_6; - break; - case 8: - dmic_ctl_val = WCD9360_DMIC_CLK_DIV_8; - break; - case 16: - dmic_ctl_val = WCD9360_DMIC_CLK_DIV_16; - break; - default: - dev_err(codec->dev, - "%s: Invalid div_factor %u, dmic_rate(%u)\n", - __func__, div_factor, dmic_clk_rate); - break; - } - -done: - return dmic_ctl_val; -} - -static int pahu_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s: event:%d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - pahu_codec_set_tx_hold(codec, w->reg, true); - break; - default: - break; - } - - return 0; -} - -static int pahu_codec_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - struct wcd9xxx_pdata *pdata = dev_get_platdata(codec->dev->parent); - u8 dmic_clk_en = 0x01; - u16 dmic_clk_reg; - s32 *dmic_clk_cnt; - u8 dmic_rate_val, dmic_rate_shift = 1; - unsigned int dmic; - u32 dmic_sample_rate; - - dmic = w->shift; - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(pahu->dmic_0_1_clk_cnt); - dmic_clk_reg = WCD9360_CPE_SS_DMIC0_CTL; - break; - case 2: - case 3: - dmic_clk_cnt = &(pahu->dmic_2_3_clk_cnt); - dmic_clk_reg = WCD9360_CPE_SS_DMIC1_CTL; - break; - case 4: - case 5: - dmic_clk_cnt = &(pahu->dmic_4_5_clk_cnt); - dmic_clk_reg = WCD9360_CPE_SS_DMIC2_CTL; - break; - case 6: - case 7: - dmic_clk_cnt = &(pahu->dmic_6_7_clk_cnt); - dmic_clk_reg = WCD9360_CPE_SS_DMIC3_CTL; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - }; - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - dmic_sample_rate = pahu_get_dmic_sample_rate(codec, dmic, - pdata); - dmic_rate_val = - pahu_get_dmic_clk_val(codec, - dmic_sample_rate); - - (*dmic_clk_cnt)++; - if (*dmic_clk_cnt == 1) { - snd_soc_update_bits(codec, dmic_clk_reg, - 0x07 << dmic_rate_shift, - dmic_rate_val << dmic_rate_shift); - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, dmic_clk_en); - } - - break; - case SND_SOC_DAPM_POST_PMD: - dmic_rate_val = - pahu_get_dmic_clk_val(codec, - pdata->mad_dmic_sample_rate); - (*dmic_clk_cnt)--; - if (*dmic_clk_cnt == 0) { - snd_soc_update_bits(codec, dmic_clk_reg, - dmic_clk_en, 0); - snd_soc_update_bits(codec, dmic_clk_reg, - 0x07 << dmic_rate_shift, - dmic_rate_val << dmic_rate_shift); - } - break; - }; - - return 0; -} - -/* - * pahu_micbias_control: enable/disable micbias - * @codec: handle to snd_soc_codec * - * @micb_num: micbias to be enabled/disabled, e.g. micbias1 or micbias2 - * @req: control requested, enable/disable or pullup enable/disable - * @is_dapm: triggered by dapm or not - * - * return 0 if control is success or error code in case of failure - */ -int pahu_micbias_control(struct snd_soc_codec *codec, - int micb_num, int req, bool is_dapm) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int micb_index = micb_num - 1; - u16 micb_reg; - - if ((micb_index < 0) || (micb_index > PAHU_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - - switch (micb_num) { - case WCD9360_MIC_BIAS_1: - micb_reg = WCD9360_ANA_MICB1; - break; - case WCD9360_MIC_BIAS_2: - micb_reg = WCD9360_ANA_MICB2; - break; - case WCD9360_MIC_BIAS_3: - micb_reg = WCD9360_ANA_MICB3; - break; - case WCD9360_MIC_BIAS_4: - micb_reg = WCD9360_ANA_MICB4; - break; - default: - dev_err(codec->dev, "%s: Invalid micbias number: %d\n", - __func__, micb_num); - return -EINVAL; - } - mutex_lock(&pahu->micb_lock); - - switch (req) { - case WCD9360_MICB_PULLUP_ENABLE: - pahu->pullup_ref[micb_index]++; - if ((pahu->pullup_ref[micb_index] == 1) && - (pahu->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - break; - case WCD9360_MICB_PULLUP_DISABLE: - if (pahu->pullup_ref[micb_index] > 0) - pahu->pullup_ref[micb_index]--; - if ((pahu->pullup_ref[micb_index] == 0) && - (pahu->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - break; - case WCD9360_MICB_ENABLE: - pahu->micb_ref[micb_index]++; - if (pahu->micb_ref[micb_index] == 1) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - break; - case WCD9360_MICB_DISABLE: - if (pahu->micb_ref[micb_index] > 0) - pahu->micb_ref[micb_index]--; - if ((pahu->micb_ref[micb_index] == 0) && - (pahu->pullup_ref[micb_index] > 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - else if ((pahu->micb_ref[micb_index] == 0) && - (pahu->pullup_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - break; - } - - dev_dbg(codec->dev, "%s: micb_num:%d, micb_ref: %d\n", - __func__, micb_num, pahu->micb_ref[micb_index]); - - mutex_unlock(&pahu->micb_lock); - - return 0; -} -EXPORT_SYMBOL(pahu_micbias_control); - -static int __pahu_codec_enable_micbias(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1"))) - micb_num = WCD9360_MIC_BIAS_1; - else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2"))) - micb_num = WCD9360_MIC_BIAS_2; - else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3"))) - micb_num = WCD9360_MIC_BIAS_3; - else if (strnstr(w->name, "MIC BIAS4", sizeof("MIC BIAS4"))) - micb_num = WCD9360_MIC_BIAS_4; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - /* - * Use ref count to handle micbias pullup - * and enable requests - */ - pahu_micbias_control(codec, micb_num, WCD9360_MICB_ENABLE, - true); - break; - case SND_SOC_DAPM_POST_PMU: - /* wait for cnp time */ - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - pahu_micbias_control(codec, micb_num, WCD9360_MICB_DISABLE, - true); - break; - }; - - return 0; -} - -/* - * pahu_codec_enable_standalone_micbias - enable micbias standalone - * @codec: pointer to codec instance - * @micb_num: number of micbias to be enabled - * @enable: true to enable micbias or false to disable - * - * This function is used to enable micbias (1, 2, 3 or 4) during - * standalone independent of whether TX use-case is running or not - * - * Return: error code in case of failure or 0 for success - */ -int pahu_codec_enable_standalone_micbias(struct snd_soc_codec *codec, - int micb_num, - bool enable) -{ - const char * const micb_names[] = { - DAPM_MICBIAS1_STANDALONE, DAPM_MICBIAS2_STANDALONE, - DAPM_MICBIAS3_STANDALONE, DAPM_MICBIAS4_STANDALONE - }; - int micb_index = micb_num - 1; - int rc; - - if (!codec) { - pr_err("%s: Codec memory is NULL\n", __func__); - return -EINVAL; - } - - if ((micb_index < 0) || (micb_index > PAHU_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - - if (enable) - rc = snd_soc_dapm_force_enable_pin( - snd_soc_codec_get_dapm(codec), - micb_names[micb_index]); - else - rc = snd_soc_dapm_disable_pin(snd_soc_codec_get_dapm(codec), - micb_names[micb_index]); - - if (!rc) - snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); - else - dev_err(codec->dev, "%s: micbias%d force %s pin failed\n", - __func__, micb_num, (enable ? "enable" : "disable")); - - return rc; -} -EXPORT_SYMBOL(pahu_codec_enable_standalone_micbias); - -static int pahu_codec_force_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - int ret = 0; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd_resmgr_enable_master_bias(pahu->resmgr); - pahu_cdc_mclk_enable(codec, true); - ret = __pahu_codec_enable_micbias(w, SND_SOC_DAPM_PRE_PMU); - /* Wait for 1ms for better cnp */ - usleep_range(1000, 1100); - pahu_cdc_mclk_enable(codec, false); - break; - case SND_SOC_DAPM_POST_PMD: - ret = __pahu_codec_enable_micbias(w, SND_SOC_DAPM_POST_PMD); - wcd_resmgr_disable_master_bias(pahu->resmgr); - break; - } - - return ret; -} - -static int pahu_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - return __pahu_codec_enable_micbias(w, event); -} - -static void pahu_restore_iir_coeff(struct pahu_priv *pahu, int iir_idx, - int band_idx) -{ - u16 reg_add; - int no_of_reg = 0; - - regmap_write(pahu->wcd9xxx->regmap, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - reg_add = WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx; - - if (pahu->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS) - return; - /* - * Since wcd9xxx_slim_write_repeat() supports only maximum of 16 - * registers at a time, split total 20 writes(5 coefficients per - * band and 4 writes per coefficient) into 16 and 4. - */ - no_of_reg = WCD9360_CDC_REPEAT_WRITES_MAX; - wcd9xxx_slim_write_repeat(pahu->wcd9xxx, reg_add, no_of_reg, - &pahu->sidetone_coeff_array[iir_idx][band_idx][0]); - - no_of_reg = (WCD9360_CDC_SIDETONE_IIR_COEFF_MAX * 4) - - WCD9360_CDC_REPEAT_WRITES_MAX; - wcd9xxx_slim_write_repeat(pahu->wcd9xxx, reg_add, no_of_reg, - &pahu->sidetone_coeff_array[iir_idx][band_idx] - [WCD9360_CDC_REPEAT_WRITES_MAX]); -} - -static int pahu_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - /* IIR filter band registers are at integer multiples of 16 */ - u16 iir_reg = WCD9360_CDC_SIDETONE_IIR0_IIR_CTL + 16 * iir_idx; - - ucontrol->value.integer.value[0] = (snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0; - - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0]); - return 0; -} - -static int pahu_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - bool iir_band_en_status; - int value = ucontrol->value.integer.value[0]; - u16 iir_reg = WCD9360_CDC_SIDETONE_IIR0_IIR_CTL + 16 * iir_idx; - - pahu_restore_iir_coeff(pahu, iir_idx, band_idx); - - /* Mask first 5 bits, 6-8 are reserved */ - snd_soc_update_bits(codec, iir_reg, (1 << band_idx), - (value << band_idx)); - - iir_band_en_status = ((snd_soc_read(codec, iir_reg) & - (1 << band_idx)) != 0); - dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__, - iir_idx, band_idx, iir_band_en_status); - return 0; -} - -static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - int coeff_idx) -{ - uint32_t value = 0; - - /* Address does not automatically update if reading */ - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t)) & 0x7F); - - value |= snd_soc_read(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx)); - - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 1) & 0x7F); - - value |= (snd_soc_read(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) << 8); - - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 2) & 0x7F); - - value |= (snd_soc_read(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) << 16); - - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - ((band_idx * BAND_MAX + coeff_idx) - * sizeof(uint32_t) + 3) & 0x7F); - - /* Mask bits top 2 bits since they are reserved */ - value |= ((snd_soc_read(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + - 16 * iir_idx)) & 0x3F) << 24); - - return value; -} - -static int pahu_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - ucontrol->value.integer.value[0] = - get_iir_band_coeff(codec, iir_idx, band_idx, 0); - ucontrol->value.integer.value[1] = - get_iir_band_coeff(codec, iir_idx, band_idx, 1); - ucontrol->value.integer.value[2] = - get_iir_band_coeff(codec, iir_idx, band_idx, 2); - ucontrol->value.integer.value[3] = - get_iir_band_coeff(codec, iir_idx, band_idx, 3); - ucontrol->value.integer.value[4] = - get_iir_band_coeff(codec, iir_idx, band_idx, 4); - - dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[0], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[1], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[2], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[3], - __func__, iir_idx, band_idx, - (uint32_t)ucontrol->value.integer.value[4]); - return 0; -} - -static void set_iir_band_coeff(struct snd_soc_codec *codec, - int iir_idx, int band_idx, - uint32_t value) -{ - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value & 0xFF)); - - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 8) & 0xFF); - - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 16) & 0xFF); - - /* Mask top 2 bits, 7-8 are reserved */ - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx), - (value >> 24) & 0x3F); -} - -static int pahu_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int iir_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int coeff_idx, idx = 0; - - /* - * Mask top bit it is reserved - * Updates addr automatically for each B2 write - */ - snd_soc_write(codec, - (WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx), - (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F); - - /* Store the coefficients in sidetone coeff array */ - for (coeff_idx = 0; coeff_idx < WCD9360_CDC_SIDETONE_IIR_COEFF_MAX; - coeff_idx++) { - uint32_t value = ucontrol->value.integer.value[coeff_idx]; - - set_iir_band_coeff(codec, iir_idx, band_idx, value); - - /* Four 8 bit values(one 32 bit) per coefficient */ - pahu->sidetone_coeff_array[iir_idx][band_idx][idx++] = - (value & 0xFF); - pahu->sidetone_coeff_array[iir_idx][band_idx][idx++] = - ((value >> 8) & 0xFF); - pahu->sidetone_coeff_array[iir_idx][band_idx][idx++] = - ((value >> 16) & 0xFF); - pahu->sidetone_coeff_array[iir_idx][band_idx][idx++] = - ((value >> 24) & 0xFF); - } - - pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n" - "%s: IIR #%d band #%d b1 = 0x%x\n" - "%s: IIR #%d band #%d b2 = 0x%x\n" - "%s: IIR #%d band #%d a1 = 0x%x\n" - "%s: IIR #%d band #%d a2 = 0x%x\n", - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 0), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 1), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 2), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 3), - __func__, iir_idx, band_idx, - get_iir_band_coeff(codec, iir_idx, band_idx, 4)); - return 0; -} - -static int pahu_compander_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = pahu->comp_enabled[comp]; - return 0; -} - -static int pahu_compander_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int comp = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n", - __func__, comp + 1, pahu->comp_enabled[comp], value); - pahu->comp_enabled[comp] = value; - - return 0; -} - -static int pahu_dmic_pin_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u16 offset; - u8 reg_val, pinctl_position; - - pinctl_position = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - offset = pinctl_position - WCD9360_TLMM_DMIC_PINCFG_OFFSET; - reg_val = snd_soc_read(codec, - WCD9360_TLMM_DMIC1_CLK_PINCFG + offset); - - ucontrol->value.integer.value[0] = !!reg_val; - - return 0; -} - -static int pahu_dmic_pin_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - u16 ctl_reg, cfg_reg, offset; - u8 ctl_val, cfg_val, pinctl_position, pinctl_mode, mask; - - /* 0- high or low; 1- high Z */ - pinctl_mode = ucontrol->value.integer.value[0]; - pinctl_position = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - switch (pinctl_position >> 3) { - case 0: - ctl_reg = WCD9360_TEST_DEBUG_PIN_CTL_OE_0; - break; - case 1: - ctl_reg = WCD9360_TEST_DEBUG_PIN_CTL_OE_1; - break; - case 2: - ctl_reg = WCD9360_TEST_DEBUG_PIN_CTL_OE_2; - break; - case 3: - ctl_reg = WCD9360_TEST_DEBUG_PIN_CTL_OE_3; - break; - default: - dev_err(codec->dev, "%s: Invalid pinctl position = %d\n", - __func__, pinctl_position); - return -EINVAL; - } - - ctl_val = ~(pinctl_mode << (pinctl_position & 0x07)); - mask = 1 << (pinctl_position & 0x07); - snd_soc_update_bits(codec, ctl_reg, mask, ctl_val); - - offset = pinctl_position - WCD9360_TLMM_DMIC_PINCFG_OFFSET; - cfg_reg = WCD9360_TLMM_DMIC1_CLK_PINCFG + offset; - if (pinctl_mode) { - if (pahu->intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - cfg_val = 0x5; - else - cfg_val = 0xD; - } else - cfg_val = 0; - snd_soc_update_bits(codec, cfg_reg, 0x1F, cfg_val); - - dev_dbg(codec->dev, "%s: reg=0x%x mask=0x%x val=%d reg=0x%x val=%d\n", - __func__, ctl_reg, mask, ctl_val, cfg_reg, cfg_val); - - return 0; -} - -static int pahu_amic_pwr_lvl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u16 amic_reg = 0; - - if (!strcmp(kcontrol->id.name, "AMIC_1_2 PWR MODE")) - amic_reg = WCD9360_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AMIC_3_4 PWR MODE")) - amic_reg = WCD9360_ANA_AMIC3; - - if (amic_reg) - ucontrol->value.integer.value[0] = - (snd_soc_read(codec, amic_reg) & - WCD9360_AMIC_PWR_LVL_MASK) >> - WCD9360_AMIC_PWR_LVL_SHIFT; - return 0; -} - -static int pahu_amic_pwr_lvl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u32 mode_val; - u16 amic_reg = 0; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (!strcmp(kcontrol->id.name, "AMIC_1_2 PWR MODE")) - amic_reg = WCD9360_ANA_AMIC1; - if (!strcmp(kcontrol->id.name, "AMIC_3_4 PWR MODE")) - amic_reg = WCD9360_ANA_AMIC3; - - if (amic_reg) - snd_soc_update_bits(codec, amic_reg, WCD9360_AMIC_PWR_LVL_MASK, - mode_val << WCD9360_AMIC_PWR_LVL_SHIFT); - return 0; -} - -static const char *const pahu_conn_mad_text[] = { - "NOTUSED1", "ADC1", "ADC2", "ADC3", "ADC4", "NOTUSED5", - "NOTUSED6", "NOTUSED2", "DMIC0", "DMIC1", "DMIC2", "DMIC3", - "DMIC4", "DMIC5", "DMIC6", "DMIC7" -}; - -static const struct soc_enum pahu_conn_mad_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(pahu_conn_mad_text), - pahu_conn_mad_text); - -static int pahu_mad_input_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u8 pahu_mad_input; - - pahu_mad_input = snd_soc_read(codec, WCD9360_SOC_MAD_INP_SEL) & 0x0F; - ucontrol->value.integer.value[0] = pahu_mad_input; - - dev_dbg(codec->dev, "%s: pahu_mad_input = %s\n", __func__, - pahu_conn_mad_text[pahu_mad_input]); - - return 0; -} - -static int pahu_mad_input_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_card *card = codec->component.card; - u8 pahu_mad_input; - char mad_amic_input_widget[6]; - const char *mad_input_widget; - const char *source_widget = NULL; - u32 adc, i, mic_bias_found = 0; - int ret = 0; - char *mad_input; - bool is_adc_input = false; - - pahu_mad_input = ucontrol->value.integer.value[0]; - - if (pahu_mad_input >= sizeof(pahu_conn_mad_text)/ - sizeof(pahu_conn_mad_text[0])) { - dev_err(codec->dev, - "%s: pahu_mad_input = %d out of bounds\n", - __func__, pahu_mad_input); - return -EINVAL; - } - - if (strnstr(pahu_conn_mad_text[pahu_mad_input], "NOTUSED", - sizeof("NOTUSED"))) { - dev_dbg(codec->dev, - "%s: Unsupported pahu_mad_input = %s\n", - __func__, pahu_conn_mad_text[pahu_mad_input]); - /* Make sure the MAD register is updated */ - snd_soc_update_bits(codec, WCD9360_ANA_MAD_SETUP, - 0x88, 0x00); - return -EINVAL; - } - - if (strnstr(pahu_conn_mad_text[pahu_mad_input], - "ADC", sizeof("ADC"))) { - mad_input = strpbrk(pahu_conn_mad_text[pahu_mad_input], - "1234"); - if (!mad_input) { - dev_err(codec->dev, "%s: Invalid MAD input %s\n", - __func__, pahu_conn_mad_text[pahu_mad_input]); - return -EINVAL; - } - - ret = kstrtouint(mad_input, 10, &adc); - if ((ret < 0) || (adc > 4)) { - dev_err(codec->dev, "%s: Invalid ADC = %s\n", __func__, - pahu_conn_mad_text[pahu_mad_input]); - return -EINVAL; - } - - snprintf(mad_amic_input_widget, 6, "%s%u", "AMIC", adc); - - mad_input_widget = mad_amic_input_widget; - is_adc_input = true; - } else { - /* DMIC type input widget*/ - mad_input_widget = pahu_conn_mad_text[pahu_mad_input]; - } - - dev_dbg(codec->dev, - "%s: pahu input widget = %s, adc_input = %s\n", __func__, - mad_input_widget, is_adc_input ? "true" : "false"); - - for (i = 0; i < card->num_of_dapm_routes; i++) { - if (!strcmp(card->of_dapm_routes[i].sink, mad_input_widget)) { - source_widget = card->of_dapm_routes[i].source; - if (!source_widget) { - dev_err(codec->dev, - "%s: invalid source widget\n", - __func__); - return -EINVAL; - } - - if (strnstr(source_widget, - "MIC BIAS1", sizeof("MIC BIAS1"))) { - mic_bias_found = 1; - break; - } else if (strnstr(source_widget, - "MIC BIAS2", sizeof("MIC BIAS2"))) { - mic_bias_found = 2; - break; - } else if (strnstr(source_widget, - "MIC BIAS3", sizeof("MIC BIAS3"))) { - mic_bias_found = 3; - break; - } else if (strnstr(source_widget, - "MIC BIAS4", sizeof("MIC BIAS4"))) { - mic_bias_found = 4; - break; - } - } - } - - if (!mic_bias_found) { - dev_err(codec->dev, "%s: mic bias not found for input %s\n", - __func__, mad_input_widget); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: mic_bias found = %d\n", __func__, - mic_bias_found); - - snd_soc_update_bits(codec, WCD9360_SOC_MAD_INP_SEL, - 0x0F, pahu_mad_input); - snd_soc_update_bits(codec, WCD9360_ANA_MAD_SETUP, - 0x07, mic_bias_found); - /* for all adc inputs, mad should be in micbias mode with BG enabled */ - if (is_adc_input) - snd_soc_update_bits(codec, WCD9360_ANA_MAD_SETUP, - 0x88, 0x88); - else - snd_soc_update_bits(codec, WCD9360_ANA_MAD_SETUP, - 0x88, 0x00); - return 0; -} - -static int pahu_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = pahu->ear_spkr_gain; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int pahu_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - pahu->ear_spkr_gain = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: gain = %d\n", __func__, pahu->ear_spkr_gain); - - return 0; -} - -static int pahu_spkr_left_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, WCD9360_CDC_BOOST0_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int pahu_spkr_left_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, WCD9360_CDC_BOOST0_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static int pahu_spkr_right_boost_stage_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - bst_state_max = snd_soc_read(codec, WCD9360_CDC_BOOST1_BOOST_CTL); - bst_state_max = (bst_state_max & 0x0c) >> 2; - ucontrol->value.integer.value[0] = bst_state_max; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int pahu_spkr_right_boost_stage_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 bst_state_max; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - bst_state_max = ucontrol->value.integer.value[0] << 2; - snd_soc_update_bits(codec, WCD9360_CDC_BOOST1_BOOST_CTL, - 0x0c, bst_state_max); - - return 0; -} - -static const char *const pahu_anc_func_text[] = {"OFF", "ON"}; -static const struct soc_enum pahu_anc_func_enum = - SOC_ENUM_SINGLE_EXT(2, pahu_anc_func_text); - -static const char *const pahu_clkmode_text[] = {"EXTERNAL", "INTERNAL"}; -static SOC_ENUM_SINGLE_EXT_DECL(pahu_clkmode_enum, pahu_clkmode_text); - -/* Cutoff frequency for high pass filter */ -static const char * const cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ" -}; - -static const char * const rx_cf_text[] = { - "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ", - "CF_NEG_3DB_0P48HZ" -}; - -static const char * const amic_pwr_lvl_text[] = { - "LOW_PWR", "DEFAULT", "HIGH_PERF", "HYBRID" -}; - -static const char * const pahu_ear_pa_gain_text[] = { - "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", - "G_0_DB", "G_M2P5_DB", "UNDEFINED", "G_M12_DB" -}; - -static const char * const pahu_ear_spkr_pa_gain_text[] = { - "G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB", - "G_4_DB", "G_5_DB", "G_6_DB" -}; - -static const char * const pahu_speaker_boost_stage_text[] = { - "NO_MAX_STATE", "MAX_STATE_1", "MAX_STATE_2" -}; - -static SOC_ENUM_SINGLE_EXT_DECL(pahu_ear_pa_gain_enum, pahu_ear_pa_gain_text); -static SOC_ENUM_SINGLE_EXT_DECL(pahu_ear_spkr_pa_gain_enum, - pahu_ear_spkr_pa_gain_text); -static SOC_ENUM_SINGLE_EXT_DECL(pahu_spkr_boost_stage_enum, - pahu_speaker_boost_stage_text); -static SOC_ENUM_SINGLE_EXT_DECL(amic_pwr_lvl_enum, amic_pwr_lvl_text); -static SOC_ENUM_SINGLE_DECL(cf_dec0_enum, WCD9360_CDC_TX0_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec1_enum, WCD9360_CDC_TX1_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec2_enum, WCD9360_CDC_TX2_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec3_enum, WCD9360_CDC_TX3_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec4_enum, WCD9360_CDC_TX4_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec5_enum, WCD9360_CDC_TX5_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec6_enum, WCD9360_CDC_TX6_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec7_enum, WCD9360_CDC_TX7_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_dec8_enum, WCD9360_CDC_TX8_TX_PATH_CFG0, 5, - cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int0_1_enum, WCD9360_CDC_RX0_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int0_2_enum, WCD9360_CDC_RX0_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int7_1_enum, WCD9360_CDC_RX7_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int7_2_enum, WCD9360_CDC_RX7_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int8_1_enum, WCD9360_CDC_RX8_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int8_2_enum, WCD9360_CDC_RX8_RX_PATH_MIX_CFG, 2, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int9_1_enum, WCD9360_CDC_RX9_RX_PATH_CFG2, 0, - rx_cf_text); -static SOC_ENUM_SINGLE_DECL(cf_int9_2_enum, WCD9360_CDC_RX9_RX_PATH_MIX_CFG, 2, - rx_cf_text); - -static const struct snd_kcontrol_new pahu_snd_controls[] = { - SOC_ENUM_EXT("EAR SPKR PA Gain", pahu_ear_spkr_pa_gain_enum, - pahu_ear_spkr_pa_gain_get, pahu_ear_spkr_pa_gain_put), - SOC_ENUM_EXT("SPKR Left Boost Max State", pahu_spkr_boost_stage_enum, - pahu_spkr_left_boost_stage_get, - pahu_spkr_left_boost_stage_put), - SOC_ENUM_EXT("SPKR Right Boost Max State", pahu_spkr_boost_stage_enum, - pahu_spkr_right_boost_stage_get, - pahu_spkr_right_boost_stage_put), - SOC_SINGLE_TLV("ADC1 Volume", WCD9360_ANA_AMIC1, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC2 Volume", WCD9360_ANA_AMIC2, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC3 Volume", WCD9360_ANA_AMIC3, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC4 Volume", WCD9360_ANA_AMIC4, 0, 20, 0, analog_gain), - - SOC_SINGLE_SX_TLV("RX0 Digital Volume", WCD9360_CDC_RX0_RX_VOL_CTL, - 0, -84, 40, digital_gain), /* -84dB min - 40dB max */ - SOC_SINGLE_SX_TLV("RX7 Digital Volume", WCD9360_CDC_RX7_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX8 Digital Volume", WCD9360_CDC_RX8_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX9 Digital Volume", WCD9360_CDC_RX9_RX_VOL_CTL, - 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX0 Mix Digital Volume", - WCD9360_CDC_RX0_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX7 Mix Digital Volume", - WCD9360_CDC_RX7_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX8 Mix Digital Volume", - WCD9360_CDC_RX8_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("RX9 Mix Digital Volume", - WCD9360_CDC_RX9_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("DEC0 Volume", WCD9360_CDC_TX0_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC1 Volume", WCD9360_CDC_TX1_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC2 Volume", WCD9360_CDC_TX2_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC3 Volume", WCD9360_CDC_TX3_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC4 Volume", WCD9360_CDC_TX4_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC5 Volume", WCD9360_CDC_TX5_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC6 Volume", WCD9360_CDC_TX6_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC7 Volume", WCD9360_CDC_TX7_TX_VOL_CTL, 0, - -84, 40, digital_gain), - SOC_SINGLE_SX_TLV("DEC8 Volume", WCD9360_CDC_TX8_TX_VOL_CTL, 0, - -84, 40, digital_gain), - - SOC_SINGLE_SX_TLV("IIR0 INP0 Volume", - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP1 Volume", - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP2 Volume", - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40, - digital_gain), - SOC_SINGLE_SX_TLV("IIR0 INP3 Volume", - WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40, - digital_gain), - - SOC_SINGLE_EXT("ANC Slot", SND_SOC_NOPM, 0, 100, 0, pahu_get_anc_slot, - pahu_put_anc_slot), - SOC_ENUM_EXT("ANC Function", pahu_anc_func_enum, pahu_get_anc_func, - pahu_put_anc_func), - - SOC_ENUM_EXT("CLK MODE", pahu_clkmode_enum, pahu_get_clkmode, - pahu_put_clkmode), - - SOC_ENUM("TX0 HPF cut off", cf_dec0_enum), - SOC_ENUM("TX1 HPF cut off", cf_dec1_enum), - SOC_ENUM("TX2 HPF cut off", cf_dec2_enum), - SOC_ENUM("TX3 HPF cut off", cf_dec3_enum), - SOC_ENUM("TX4 HPF cut off", cf_dec4_enum), - SOC_ENUM("TX5 HPF cut off", cf_dec5_enum), - SOC_ENUM("TX6 HPF cut off", cf_dec6_enum), - SOC_ENUM("TX7 HPF cut off", cf_dec7_enum), - SOC_ENUM("TX8 HPF cut off", cf_dec8_enum), - - SOC_ENUM("RX INT0_1 HPF cut off", cf_int0_1_enum), - SOC_ENUM("RX INT0_2 HPF cut off", cf_int0_2_enum), - SOC_ENUM("RX INT7_1 HPF cut off", cf_int7_1_enum), - SOC_ENUM("RX INT7_2 HPF cut off", cf_int7_2_enum), - SOC_ENUM("RX INT8_1 HPF cut off", cf_int8_1_enum), - SOC_ENUM("RX INT8_2 HPF cut off", cf_int8_2_enum), - SOC_ENUM("RX INT9_1 HPF cut off", cf_int9_1_enum), - SOC_ENUM("RX INT9_2 HPF cut off", cf_int9_2_enum), - - SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0, - pahu_iir_enable_audio_mixer_get, - pahu_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0, - pahu_iir_enable_audio_mixer_get, - pahu_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0, - pahu_iir_enable_audio_mixer_get, - pahu_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0, - pahu_iir_enable_audio_mixer_get, - pahu_iir_enable_audio_mixer_put), - SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0, - pahu_iir_enable_audio_mixer_get, - pahu_iir_enable_audio_mixer_put), - - SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5, - pahu_iir_band_audio_mixer_get, pahu_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5, - pahu_iir_band_audio_mixer_get, pahu_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5, - pahu_iir_band_audio_mixer_get, pahu_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5, - pahu_iir_band_audio_mixer_get, pahu_iir_band_audio_mixer_put), - SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5, - pahu_iir_band_audio_mixer_get, pahu_iir_band_audio_mixer_put), - - SOC_SINGLE_EXT("COMP0 Switch", SND_SOC_NOPM, COMPANDER_0, 1, 0, - pahu_compander_get, pahu_compander_put), - SOC_SINGLE_EXT("COMP7 Switch", SND_SOC_NOPM, COMPANDER_7, 1, 0, - pahu_compander_get, pahu_compander_put), - SOC_SINGLE_EXT("COMP8 Switch", SND_SOC_NOPM, COMPANDER_8, 1, 0, - pahu_compander_get, pahu_compander_put), - - SOC_ENUM_EXT("MAD Input", pahu_conn_mad_enum, - pahu_mad_input_get, pahu_mad_input_put), - - SOC_SINGLE_EXT("DMIC1_CLK_PIN_MODE", SND_SOC_NOPM, 15, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC1_DATA_PIN_MODE", SND_SOC_NOPM, 16, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC2_CLK_PIN_MODE", SND_SOC_NOPM, 17, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC2_DATA_PIN_MODE", SND_SOC_NOPM, 18, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC3_CLK_PIN_MODE", SND_SOC_NOPM, 28, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC3_DATA_PIN_MODE", SND_SOC_NOPM, 29, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC4_CLK_PIN_MODE", SND_SOC_NOPM, 30, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_SINGLE_EXT("DMIC4_DATA_PIN_MODE", SND_SOC_NOPM, 31, 1, 0, - pahu_dmic_pin_mode_get, pahu_dmic_pin_mode_put), - - SOC_ENUM_EXT("AMIC_1_2 PWR MODE", amic_pwr_lvl_enum, - pahu_amic_pwr_lvl_get, pahu_amic_pwr_lvl_put), - SOC_ENUM_EXT("AMIC_3_4 PWR MODE", amic_pwr_lvl_enum, - pahu_amic_pwr_lvl_get, pahu_amic_pwr_lvl_put), -}; - -static int pahu_dec_enum_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - u16 mic_sel_reg = 0; - u8 mic_sel; - - val = ucontrol->value.enumerated.item[0]; - if (val > e->items - 1) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - switch (e->reg) { - case WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD9360_CDC_TX0_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD9360_CDC_TX4_TX_PATH_CFG0; - else if (e->shift_l == 4) - mic_sel_reg = WCD9360_CDC_TX8_TX_PATH_CFG0; - break; - case WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD9360_CDC_TX1_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD9360_CDC_TX5_TX_PATH_CFG0; - break; - case WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD9360_CDC_TX2_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD9360_CDC_TX6_TX_PATH_CFG0; - break; - case WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1: - if (e->shift_l == 0) - mic_sel_reg = WCD9360_CDC_TX3_TX_PATH_CFG0; - else if (e->shift_l == 2) - mic_sel_reg = WCD9360_CDC_TX7_TX_PATH_CFG0; - break; - default: - dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n", - __func__, e->reg); - return -EINVAL; - } - - /* ADC: 0, DMIC: 1 */ - mic_sel = val ? 0x0 : 0x1; - if (mic_sel_reg) - snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, mic_sel << 7); - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static int pahu_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - unsigned int val; - unsigned short look_ahead_dly_reg = WCD9360_CDC_RX0_RX_PATH_CFG0; - - val = ucontrol->value.enumerated.item[0]; - if (val >= e->items) - return -EINVAL; - - dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__, - widget->name, val); - - if (e->reg == WCD9360_CDC_RX0_RX_PATH_SEC0) - look_ahead_dly_reg = WCD9360_CDC_RX0_RX_PATH_CFG0; - else if (e->reg == WCD9360_CDC_RX9_RX_PATH_SEC0) - look_ahead_dly_reg = WCD9360_CDC_RX9_RX_PATH_CFG0; - - /* Set Look Ahead Delay */ - snd_soc_update_bits(codec, look_ahead_dly_reg, - 0x08, (val ? 0x08 : 0x00)); - /* Set DEM INP Select */ - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static const char * const rx_int0_7_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", - "RX6", "RX7", "PROXIMITY", "IIR0" -}; - -static const char * const rx_int_mix_mux_text[] = { - "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", - "RX6", "RX7", "NA", "IIR0" -}; - -static const char * const rx_prim_mix_text[] = { - "ZERO", "DEC0", "DEC1", "IIR0", "INVALID", "RX0", "RX1", "RX2", - "RX3", "RX4", "RX5", "RX6", "RX7" -}; - -static const char * const rx_sidetone_mix_text[] = { - "ZERO", "SRC0" -}; - -static const char * const cdc_if_tx0_mux_text[] = { - "ZERO", "RX_MIX_TX0", "DEC0", "DEC0_192" -}; -static const char * const cdc_if_tx1_mux_text[] = { - "ZERO", "RX_MIX_TX1", "DEC1", "DEC1_192" -}; -static const char * const cdc_if_tx2_mux_text[] = { - "ZERO", "RX_MIX_TX2", "DEC2", "DEC2_192" -}; -static const char * const cdc_if_tx3_mux_text[] = { - "ZERO", "RX_MIX_TX3", "DEC3", "DEC3_192" -}; -static const char * const cdc_if_tx4_mux_text[] = { - "ZERO", "RX_MIX_TX4", "DEC4", "DEC4_192" -}; -static const char * const cdc_if_tx5_mux_text[] = { - "ZERO", "RX_MIX_TX5", "DEC5", "DEC5_192" -}; -static const char * const cdc_if_tx6_mux_text[] = { - "ZERO", "RX_MIX_TX6", "DEC6", "DEC6_192" -}; -static const char * const cdc_if_tx7_mux_text[] = { - "ZERO", "RX_MIX_TX7", "DEC7", "DEC7_192" -}; -static const char * const cdc_if_tx8_mux_text[] = { - "ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192" -}; -static const char * const cdc_if_tx9_mux_text[] = { - "ZERO", "DEC7", "DEC7_192" -}; -static const char * const cdc_if_tx10_mux_text[] = { - "ZERO", "DEC6", "DEC6_192" -}; -static const char * const cdc_if_tx10_mux2_text[] = { - "TX10_MUX1", "I2SRX1_0_BRDG" -}; -static const char * const cdc_if_tx11_mux2_text[] = { - "TX11_MUX1", "I2SRX1_1_BRDG", "SWR_PACKED_PDM" -}; -static const char * const cdc_if_tx11_mux_text[] = { - "RDMA_TX11", "DEC_0_5", "DEC_9_12", "MAD_AUDIO", "MAD_BRDCST" -}; -static const char * const cdc_if_tx11_inp1_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4", - "DEC5", "RX_MIX_TX5", "DEC9_10", "DEC11_12" -}; -static const char * const cdc_if_tx13_mux_text[] = { - "CDC_DEC_5", "MAD_BRDCST" -}; -static const char * const cdc_if_tx13_inp1_mux_text[] = { - "ZERO", "DEC5", "DEC5_192" -}; - -static const char * const iir_inp_mux_text[] = { - "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4", "DEC5", "DEC6", - "DEC7", "DEC8", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", "RX6", "RX7" -}; - -static const char * const rx_int_dem_inp_mux_text[] = { - "NORMAL_DSM_OUT", "NOT_VALID", "ADC_LOOPBACK" -}; - -static const char * const rx_int0_1_interp_mux_text[] = { - "ZERO", "RX INT0_1 MIX1", -}; - -static const char * const rx_int7_1_interp_mux_text[] = { - "ZERO", "RX INT7_1 MIX1", -}; - -static const char * const rx_int8_1_interp_mux_text[] = { - "ZERO", "RX INT8_1 MIX1", -}; - -static const char * const rx_int9_1_interp_mux_text[] = { - "ZERO", "RX INT9_1 MIX1", -}; - -static const char * const rx_int0_2_interp_mux_text[] = { - "ZERO", "RX INT0_2 MUX", -}; - -static const char * const rx_int7_2_interp_mux_text[] = { - "ZERO", "RX INT7_2 MUX", -}; - -static const char * const rx_int8_2_interp_mux_text[] = { - "ZERO", "RX INT8_2 MUX", -}; - -static const char * const rx_int9_2_interp_mux_text[] = { - "ZERO", "RX INT9_2 MUX", -}; - -static const char * const mad_sel_txt[] = { - "SPE", "MSM" -}; - -static const char * const mad_inp_mux_txt[] = { - "MAD", "DEC1" -}; - -static const char * const adc_mux_text[] = { - "DMIC", "AMIC", "ANC_FB_TUNE1" -}; - -static const char * const dmic_mux_text[] = { - "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5", - "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "DMIC6", - "DMIC7" -}; - -static const char * const amic_mux_text[] = { - "ZERO", "ADC1", "ADC2", "ADC3", "ADC4" -}; - -static const char * const adc2_in_text[] = { - "AMIC2", "AMIC1" -}; - -static const char * const adc4_in_text[] = { - "AMIC4", "AMIC3" -}; - -static const char * const anc0_fb_mux_text[] = { - "ZERO", "INVALID", "ANC_IN_EAR", "ANC_IN_EAR_SPKR", -}; - -static const char * const rx_echo_mux_text[] = { - "ZERO", "RX_MIX0", "NA", "NA", "NA", "NA", "NA", "NA", - "RX_MIX7", "RX_MIX8", "NA", "NA", "NA", "NA", "RX_MIX9" -}; - -static const char *const slim_rx_mux_text[] = { - "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB" -}; - -static const char *const cdc_if_rx0_mux_text[] = { - "SLIM RX0", "I2S RX0" -}; -static const char *const cdc_if_rx1_mux_text[] = { - "SLIM RX1", "I2S RX1" -}; -static const char *const cdc_if_rx2_mux_text[] = { - "SLIM RX2", "I2SRX1_0", "I2SRX0_2" -}; -static const char *const cdc_if_rx3_mux_text[] = { - "SLIM RX3", "I2SRX1_1", "I2SRX0_3" -}; -static const char *const cdc_if_rx4_mux_text[] = { - "SLIM RX4", "I2S RX4" -}; -static const char *const cdc_if_rx5_mux_text[] = { - "SLIM RX5", "I2S RX5" -}; -static const char *const cdc_if_rx6_mux_text[] = { - "SLIM RX6", "I2S RX6" -}; -static const char *const cdc_if_rx7_mux_text[] = { - "SLIM RX7", "I2S RX7" -}; - -static const char * const asrc2_mux_text[] = { - "ZERO", "ASRC_IN_SPKR1", -}; - -static const char * const asrc3_mux_text[] = { - "ZERO", "ASRC_IN_SPKR2", -}; - -static const char * const native_mux_text[] = { - "OFF", "ON", -}; - -static const char *const wdma3_port0_text[] = { - "RX_MIX_TX0", "DEC0" -}; - -static const char *const wdma3_port1_text[] = { - "RX_MIX_TX1", "DEC1" -}; - -static const char *const wdma3_port2_text[] = { - "RX_MIX_TX2", "DEC2" -}; - -static const char *const wdma3_port3_text[] = { - "RX_MIX_TX3", "DEC3" -}; - -static const char *const wdma3_port4_text[] = { - "RX_MIX_TX4", "DEC4" -}; - -static const char *const wdma3_port5_text[] = { - "RX_MIX_TX5", "DEC5" -}; - -static const char *const wdma3_port6_text[] = { - "RX_MIX_TX6", "DEC6" -}; - -static const char *const wdma3_ch_text[] = { - "PORT_0", "PORT_1", "PORT_2", "PORT_3", "PORT_4", - "PORT_5", "PORT_6", "PORT_7", "PORT_8", -}; - -static const struct snd_kcontrol_new aif4_vi_mixer[] = { - SOC_SINGLE_EXT("SPKR_VI_1", SND_SOC_NOPM, WCD9360_TX14, 1, 0, - pahu_vi_feed_mixer_get, pahu_vi_feed_mixer_put), - SOC_SINGLE_EXT("SPKR_VI_2", SND_SOC_NOPM, WCD9360_TX15, 1, 0, - pahu_vi_feed_mixer_get, pahu_vi_feed_mixer_put), -}; - -static const struct snd_kcontrol_new aif1_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9360_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9360_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9360_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9360_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9360_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9360_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9360_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9360_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9360_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9360_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9360_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9360_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9360_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif2_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9360_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9360_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9360_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9360_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9360_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9360_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9360_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9360_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9360_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9360_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9360_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9360_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9360_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif3_cap_mixer[] = { - SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9360_TX0, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9360_TX1, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9360_TX2, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9360_TX3, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9360_TX4, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9360_TX5, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9360_TX6, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9360_TX7, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9360_TX8, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9360_TX9, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9360_TX10, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9360_TX11, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9360_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -static const struct snd_kcontrol_new aif4_mad_mixer[] = { - SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9360_TX13, 1, 0, - slim_tx_mixer_get, slim_tx_mixer_put), -}; - -WCD_DAPM_ENUM_EXT(slim_rx0, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx1, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx2, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx3, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx4, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx5, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx6, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); -WCD_DAPM_ENUM_EXT(slim_rx7, SND_SOC_NOPM, 0, slim_rx_mux_text, - slim_rx_mux_get, slim_rx_mux_put); - -WCD_DAPM_ENUM(cdc_if_rx0, SND_SOC_NOPM, 0, cdc_if_rx0_mux_text); -WCD_DAPM_ENUM(cdc_if_rx1, SND_SOC_NOPM, 0, cdc_if_rx1_mux_text); -WCD_DAPM_ENUM(cdc_if_rx2, SND_SOC_NOPM, 0, cdc_if_rx2_mux_text); -WCD_DAPM_ENUM(cdc_if_rx3, SND_SOC_NOPM, 0, cdc_if_rx3_mux_text); -WCD_DAPM_ENUM(cdc_if_rx4, SND_SOC_NOPM, 0, cdc_if_rx4_mux_text); -WCD_DAPM_ENUM(cdc_if_rx5, SND_SOC_NOPM, 0, cdc_if_rx5_mux_text); -WCD_DAPM_ENUM(cdc_if_rx6, SND_SOC_NOPM, 0, cdc_if_rx6_mux_text); -WCD_DAPM_ENUM(cdc_if_rx7, SND_SOC_NOPM, 0, cdc_if_rx7_mux_text); - -WCD_DAPM_ENUM(rx_int0_2, WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, - rx_int0_7_mix_mux_text); -WCD_DAPM_ENUM(rx_int7_2, WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG1, 0, - rx_int0_7_mix_mux_text); -WCD_DAPM_ENUM(rx_int8_2, WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG1, 0, - rx_int_mix_mux_text); -WCD_DAPM_ENUM(rx_int9_2, WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG1, 0, - rx_int0_7_mix_mux_text); - -WCD_DAPM_ENUM(rx_int0_1_mix_inp0, WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int0_1_mix_inp1, WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int0_1_mix_inp2, WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int7_1_mix_inp0, WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int7_1_mix_inp1, WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int7_1_mix_inp2, WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int8_1_mix_inp0, WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int8_1_mix_inp1, WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int8_1_mix_inp2, WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG1, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int9_1_mix_inp0, WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG0, 0, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int9_1_mix_inp1, WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG0, 4, - rx_prim_mix_text); -WCD_DAPM_ENUM(rx_int9_1_mix_inp2, WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG1, 4, - rx_prim_mix_text); - -WCD_DAPM_ENUM(rx_int0_mix2_inp, WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0, - rx_sidetone_mix_text); -WCD_DAPM_ENUM(rx_int7_mix2_inp, WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 2, - rx_sidetone_mix_text); -WCD_DAPM_ENUM(rx_int9_mix2_inp, WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 4, - rx_sidetone_mix_text); - -WCD_DAPM_ENUM(tx_adc_mux10, WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 4, - adc_mux_text); -WCD_DAPM_ENUM(tx_adc_mux11, WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 4, - adc_mux_text); - -WCD_DAPM_ENUM(tx_dmic_mux0, WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux1, WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux2, WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux3, WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux4, WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux5, WCD9360_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux6, WCD9360_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux7, WCD9360_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux8, WCD9360_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux10, WCD9360_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 3, - dmic_mux_text); -WCD_DAPM_ENUM(tx_dmic_mux11, WCD9360_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 3, - dmic_mux_text); - -WCD_DAPM_ENUM(tx_amic_mux0, WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux1, WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux2, WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux3, WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux4, WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux5, WCD9360_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux6, WCD9360_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux7, WCD9360_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux8, WCD9360_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux10, WCD9360_CDC_TX_INP_MUX_ADC_MUX10_CFG0, 0, - amic_mux_text); -WCD_DAPM_ENUM(tx_amic_mux11, WCD9360_CDC_TX_INP_MUX_ADC_MUX11_CFG0, 0, - amic_mux_text); - -WCD_DAPM_ENUM(tx_adc2_in, WCD9360_ANA_AMIC_INPUT_SWITCH_CTL, 7, adc2_in_text); -WCD_DAPM_ENUM(tx_adc4_in, WCD9360_ANA_AMIC_INPUT_SWITCH_CTL, 6, adc4_in_text); - -WCD_DAPM_ENUM(cdc_if_tx0, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0, 0, - cdc_if_tx0_mux_text); -WCD_DAPM_ENUM(cdc_if_tx1, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0, 2, - cdc_if_tx1_mux_text); -WCD_DAPM_ENUM(cdc_if_tx2, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0, 4, - cdc_if_tx2_mux_text); -WCD_DAPM_ENUM(cdc_if_tx3, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0, 6, - cdc_if_tx3_mux_text); -WCD_DAPM_ENUM(cdc_if_tx4, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1, 0, - cdc_if_tx4_mux_text); -WCD_DAPM_ENUM(cdc_if_tx5, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1, 2, - cdc_if_tx5_mux_text); -WCD_DAPM_ENUM(cdc_if_tx6, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1, 4, - cdc_if_tx6_mux_text); -WCD_DAPM_ENUM(cdc_if_tx7, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1, 6, - cdc_if_tx7_mux_text); -WCD_DAPM_ENUM(cdc_if_tx8, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG2, 0, - cdc_if_tx8_mux_text); -WCD_DAPM_ENUM(cdc_if_tx9, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG2, 2, - cdc_if_tx9_mux_text); -WCD_DAPM_ENUM(cdc_if_tx10, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG2, 4, - cdc_if_tx10_mux_text); -WCD_DAPM_ENUM(cdc_if_tx10_inp2, WCD9360_DATA_HUB_SB_TX10_INP_CFG, 3, - cdc_if_tx10_mux2_text); -WCD_DAPM_ENUM(cdc_if_tx11_inp1, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG3, 0, - cdc_if_tx11_inp1_mux_text); -WCD_DAPM_ENUM(cdc_if_tx11, WCD9360_DATA_HUB_SB_TX11_INP_CFG, 0, - cdc_if_tx11_mux_text); -WCD_DAPM_ENUM(cdc_if_tx11_inp2, WCD9360_DATA_HUB_SB_TX11_INP_CFG, 3, - cdc_if_tx11_mux2_text); -WCD_DAPM_ENUM(cdc_if_tx13_inp1, WCD9360_CDC_IF_ROUTER_TX_MUX_CFG3, 4, - cdc_if_tx13_inp1_mux_text); -WCD_DAPM_ENUM(cdc_if_tx13, WCD9360_DATA_HUB_SB_TX13_INP_CFG, 0, - cdc_if_tx13_mux_text); - -WCD_DAPM_ENUM(rx_mix_tx0, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG0, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx1, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG0, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx2, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG1, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx3, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG1, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx4, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG2, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx5, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG2, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx6, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG3, 0, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx7, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG3, 4, - rx_echo_mux_text); -WCD_DAPM_ENUM(rx_mix_tx8, WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG4, 0, - rx_echo_mux_text); - -WCD_DAPM_ENUM(iir0_inp0, WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir0_inp1, WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir0_inp2, WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2, 0, - iir_inp_mux_text); -WCD_DAPM_ENUM(iir0_inp3, WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3, 0, - iir_inp_mux_text); - -WCD_DAPM_ENUM(rx_int0_1_interp, SND_SOC_NOPM, 0, rx_int0_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int7_1_interp, SND_SOC_NOPM, 0, rx_int7_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int8_1_interp, SND_SOC_NOPM, 0, rx_int8_1_interp_mux_text); -WCD_DAPM_ENUM(rx_int9_1_interp, SND_SOC_NOPM, 0, rx_int9_1_interp_mux_text); - -WCD_DAPM_ENUM(rx_int0_2_interp, SND_SOC_NOPM, 0, rx_int0_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int7_2_interp, SND_SOC_NOPM, 0, rx_int7_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int8_2_interp, SND_SOC_NOPM, 0, rx_int8_2_interp_mux_text); -WCD_DAPM_ENUM(rx_int9_2_interp, SND_SOC_NOPM, 0, rx_int9_2_interp_mux_text); - -WCD_DAPM_ENUM(mad_sel, WCD9360_CPE_SS_SVA_CFG, 0, - mad_sel_txt); - -WCD_DAPM_ENUM(mad_inp_mux, WCD9360_CPE_SS_SVA_CFG, 2, - mad_inp_mux_txt); - -WCD_DAPM_ENUM_EXT(rx_int0_dem_inp, WCD9360_CDC_RX0_RX_PATH_SEC0, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - pahu_int_dem_inp_mux_put); - -WCD_DAPM_ENUM_EXT(rx_int9_dem_inp, WCD9360_CDC_RX9_RX_PATH_SEC0, 0, - rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double, - pahu_int_dem_inp_mux_put); - -WCD_DAPM_ENUM_EXT(tx_adc_mux0, WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux1, WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux2, WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux3, WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux4, WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux5, WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux6, WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux7, WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 2, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); -WCD_DAPM_ENUM_EXT(tx_adc_mux8, WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 4, - adc_mux_text, snd_soc_dapm_get_enum_double, pahu_dec_enum_put); - -WCD_DAPM_ENUM(asrc2, WCD9360_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 4, - asrc2_mux_text); -WCD_DAPM_ENUM(asrc3, WCD9360_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0, 6, - asrc3_mux_text); - -WCD_DAPM_ENUM(int7_2_native, SND_SOC_NOPM, 0, native_mux_text); -WCD_DAPM_ENUM(int8_2_native, SND_SOC_NOPM, 0, native_mux_text); - -WCD_DAPM_ENUM(anc0_fb, WCD9360_CDC_RX_INP_MUX_ANC_CFG0, 0, anc0_fb_mux_text); - -WCD_DAPM_ENUM(wdma3_port0, WCD9360_DMA_WDMA3_PRT_CFG, 0, wdma3_port0_text); -WCD_DAPM_ENUM(wdma3_port1, WCD9360_DMA_WDMA3_PRT_CFG, 1, wdma3_port1_text); -WCD_DAPM_ENUM(wdma3_port2, WCD9360_DMA_WDMA3_PRT_CFG, 2, wdma3_port2_text); -WCD_DAPM_ENUM(wdma3_port3, WCD9360_DMA_WDMA3_PRT_CFG, 3, wdma3_port3_text); -WCD_DAPM_ENUM(wdma3_port4, WCD9360_DMA_WDMA3_PRT_CFG, 4, wdma3_port4_text); -WCD_DAPM_ENUM(wdma3_port5, WCD9360_DMA_WDMA3_PRT_CFG, 5, wdma3_port5_text); -WCD_DAPM_ENUM(wdma3_port6, WCD9360_DMA_WDMA3_PRT_CFG, 6, wdma3_port6_text); - -WCD_DAPM_ENUM(wdma3_ch0, WCD9360_DMA_CH_0_1_CFG_WDMA_3, 0, wdma3_ch_text); -WCD_DAPM_ENUM(wdma3_ch1, WCD9360_DMA_CH_0_1_CFG_WDMA_3, 4, wdma3_ch_text); -WCD_DAPM_ENUM(wdma3_ch2, WCD9360_DMA_CH_2_3_CFG_WDMA_3, 0, wdma3_ch_text); -WCD_DAPM_ENUM(wdma3_ch3, WCD9360_DMA_CH_2_3_CFG_WDMA_3, 4, wdma3_ch_text); - -static const struct snd_kcontrol_new anc_ear_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_ear_spkr_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new anc_spkr_pa_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new mad_cpe1_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new mad_cpe2_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new mad_brdcst_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux0_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux1_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux2_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux3_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux4_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux5_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux6_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux7_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new adc_us_mux8_switch = - SOC_DAPM_SINGLE("US_Switch", SND_SOC_NOPM, 0, 1, 0); - -static const struct snd_kcontrol_new wdma3_onoff_switch = - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); - -static const char *const i2s_tx1_0_txt[] = { - "ZERO", "SB_TX8", "SB_RX2", "SB_TX12" -}; - -static const char *const i2s_tx1_1_txt[] = { - "ZERO", "SB_RX0", "SB_RX1", "SB_RX2", "SB_RX3", "SB_TX11" -}; - -WCD_DAPM_ENUM(i2s_tx1_0_inp, WCD9360_DATA_HUB_I2S_TX1_0_CFG, 0, i2s_tx1_0_txt); -WCD_DAPM_ENUM(i2s_tx1_1_inp, WCD9360_DATA_HUB_I2S_TX1_1_CFG, 0, i2s_tx1_1_txt); - -static const struct snd_soc_dapm_widget pahu_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN_E("AIF1 PB", "AIF1 Playback", 0, SND_SOC_NOPM, - AIF1_PB, 0, pahu_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF2 PB", "AIF2 Playback", 0, SND_SOC_NOPM, - AIF2_PB, 0, pahu_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF3 PB", "AIF3 Playback", 0, SND_SOC_NOPM, - AIF3_PB, 0, pahu_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_IN_E("AIF4 PB", "AIF4 Playback", 0, SND_SOC_NOPM, - AIF4_PB, 0, pahu_codec_enable_slimrx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_IN_E("I2S1 PB", "I2S1 Playback", 0, SND_SOC_NOPM, - I2S1_PB, 0, pahu_i2s_aif_rx_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("SLIM RX0 MUX", WCD9360_RX0, slim_rx0), - WCD_DAPM_MUX("SLIM RX1 MUX", WCD9360_RX1, slim_rx1), - WCD_DAPM_MUX("SLIM RX2 MUX", WCD9360_RX2, slim_rx2), - WCD_DAPM_MUX("SLIM RX3 MUX", WCD9360_RX3, slim_rx3), - WCD_DAPM_MUX("SLIM RX4 MUX", WCD9360_RX4, slim_rx4), - WCD_DAPM_MUX("SLIM RX5 MUX", WCD9360_RX5, slim_rx5), - WCD_DAPM_MUX("SLIM RX6 MUX", WCD9360_RX6, slim_rx6), - WCD_DAPM_MUX("SLIM RX7 MUX", WCD9360_RX7, slim_rx7), - - SND_SOC_DAPM_MIXER("SLIM RX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX5", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX6", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM RX7", SND_SOC_NOPM, 0, 0, NULL, 0), - - WCD_DAPM_MUX("CDC_IF RX0 MUX", WCD9360_RX0, cdc_if_rx0), - WCD_DAPM_MUX("CDC_IF RX1 MUX", WCD9360_RX1, cdc_if_rx1), - WCD_DAPM_MUX("CDC_IF RX2 MUX", WCD9360_RX2, cdc_if_rx2), - WCD_DAPM_MUX("CDC_IF RX3 MUX", WCD9360_RX3, cdc_if_rx3), - WCD_DAPM_MUX("CDC_IF RX4 MUX", WCD9360_RX4, cdc_if_rx4), - WCD_DAPM_MUX("CDC_IF RX5 MUX", WCD9360_RX5, cdc_if_rx5), - WCD_DAPM_MUX("CDC_IF RX6 MUX", WCD9360_RX6, cdc_if_rx6), - WCD_DAPM_MUX("CDC_IF RX7 MUX", WCD9360_RX7, cdc_if_rx7), - - SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_EAR, 0, - &rx_int0_2_mux, pahu_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_2 MUX", SND_SOC_NOPM, INTERP_SPKR1, 0, - &rx_int7_2_mux, pahu_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_2 MUX", SND_SOC_NOPM, INTERP_SPKR2, 0, - &rx_int8_2_mux, pahu_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT9_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0, - &rx_int9_2_mux, pahu_codec_enable_mix_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("RX INT0_1 MIX1 INP0", 0, rx_int0_1_mix_inp0), - WCD_DAPM_MUX("RX INT0_1 MIX1 INP1", 0, rx_int0_1_mix_inp1), - WCD_DAPM_MUX("RX INT0_1 MIX1 INP2", 0, rx_int0_1_mix_inp2), - - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp0_mux, pahu_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp1_mux, pahu_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int7_1_mix_inp2_mux, pahu_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp0_mux, pahu_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp1_mux, pahu_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, - &rx_int8_1_mix_inp2_mux, pahu_codec_enable_swr, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("RX INT9_1 MIX1 INP0", 0, rx_int9_1_mix_inp0), - WCD_DAPM_MUX("RX INT9_1 MIX1 INP1", 0, rx_int9_1_mix_inp1), - WCD_DAPM_MUX("RX INT9_1 MIX1 INP2", 0, rx_int9_1_mix_inp2), - - SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT7_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT7 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT8_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT8 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT9_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT9 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT7 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("RX INT9 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_MIXER_E("RX INT7 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, pahu_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX INT8 CHAIN", SND_SOC_NOPM, 0, 0, - NULL, 0, pahu_codec_spk_boost_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_EAR, - 0, &rx_int0_mix2_inp_mux, pahu_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7 MIX2 INP", SND_SOC_NOPM, INTERP_SPKR1, - 0, &rx_int7_mix2_inp_mux, pahu_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT9 MIX2 INP", SND_SOC_NOPM, INTERP_AUX, - 0, &rx_int9_mix2_inp_mux, pahu_codec_enable_rx_path_clk, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("CDC_IF TX0 MUX", WCD9360_TX0, cdc_if_tx0), - WCD_DAPM_MUX("CDC_IF TX1 MUX", WCD9360_TX1, cdc_if_tx1), - WCD_DAPM_MUX("CDC_IF TX2 MUX", WCD9360_TX2, cdc_if_tx2), - WCD_DAPM_MUX("CDC_IF TX3 MUX", WCD9360_TX3, cdc_if_tx3), - WCD_DAPM_MUX("CDC_IF TX4 MUX", WCD9360_TX4, cdc_if_tx4), - WCD_DAPM_MUX("CDC_IF TX5 MUX", WCD9360_TX5, cdc_if_tx5), - WCD_DAPM_MUX("CDC_IF TX6 MUX", WCD9360_TX6, cdc_if_tx6), - WCD_DAPM_MUX("CDC_IF TX7 MUX", WCD9360_TX7, cdc_if_tx7), - WCD_DAPM_MUX("CDC_IF TX8 MUX", WCD9360_TX8, cdc_if_tx8), - WCD_DAPM_MUX("CDC_IF TX9 MUX", WCD9360_TX9, cdc_if_tx9), - WCD_DAPM_MUX("CDC_IF TX10 MUX", WCD9360_TX10, cdc_if_tx10), - WCD_DAPM_MUX("CDC_IF TX11 MUX", WCD9360_TX11, cdc_if_tx11), - WCD_DAPM_MUX("CDC_IF TX11 INP1 MUX", WCD9360_TX11, cdc_if_tx11_inp1), - WCD_DAPM_MUX("CDC_IF TX13 MUX", WCD9360_TX13, cdc_if_tx13), - WCD_DAPM_MUX("CDC_IF TX13 INP1 MUX", WCD9360_TX13, cdc_if_tx13_inp1), - WCD_DAPM_MUX("CDC_IF TX10 MUX2", WCD9360_TX10, cdc_if_tx10_inp2), - WCD_DAPM_MUX("CDC_IF TX11 MUX2", WCD9360_TX11, cdc_if_tx11_inp2), - - SND_SOC_DAPM_MUX_E("ADC MUX0", WCD9360_CDC_TX0_TX_PATH_CTL, 5, 0, - &tx_adc_mux0_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX1", WCD9360_CDC_TX1_TX_PATH_CTL, 5, 0, - &tx_adc_mux1_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX2", WCD9360_CDC_TX2_TX_PATH_CTL, 5, 0, - &tx_adc_mux2_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX3", WCD9360_CDC_TX3_TX_PATH_CTL, 5, 0, - &tx_adc_mux3_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX4", WCD9360_CDC_TX4_TX_PATH_CTL, 5, 0, - &tx_adc_mux4_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX5", WCD9360_CDC_TX5_TX_PATH_CTL, 5, 0, - &tx_adc_mux5_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX6", WCD9360_CDC_TX6_TX_PATH_CTL, 5, 0, - &tx_adc_mux6_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX7", WCD9360_CDC_TX7_TX_PATH_CTL, 5, 0, - &tx_adc_mux7_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX8", WCD9360_CDC_TX8_TX_PATH_CTL, 5, 0, - &tx_adc_mux8_mux, pahu_codec_enable_dec, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX_E("ADC MUX10", SND_SOC_NOPM, 10, 0, &tx_adc_mux10_mux, - pahu_codec_tx_adc_cfg, SND_SOC_DAPM_POST_PMU), - - SND_SOC_DAPM_MUX_E("ADC MUX11", SND_SOC_NOPM, 11, 0, &tx_adc_mux11_mux, - pahu_codec_tx_adc_cfg, SND_SOC_DAPM_POST_PMU), - - WCD_DAPM_MUX("DMIC MUX0", 0, tx_dmic_mux0), - WCD_DAPM_MUX("DMIC MUX1", 0, tx_dmic_mux1), - WCD_DAPM_MUX("DMIC MUX2", 0, tx_dmic_mux2), - WCD_DAPM_MUX("DMIC MUX3", 0, tx_dmic_mux3), - WCD_DAPM_MUX("DMIC MUX4", 0, tx_dmic_mux4), - WCD_DAPM_MUX("DMIC MUX5", 0, tx_dmic_mux5), - WCD_DAPM_MUX("DMIC MUX6", 0, tx_dmic_mux6), - WCD_DAPM_MUX("DMIC MUX7", 0, tx_dmic_mux7), - WCD_DAPM_MUX("DMIC MUX8", 0, tx_dmic_mux8), - WCD_DAPM_MUX("DMIC MUX10", 0, tx_dmic_mux10), - WCD_DAPM_MUX("DMIC MUX11", 0, tx_dmic_mux11), - - WCD_DAPM_MUX("AMIC MUX0", 0, tx_amic_mux0), - WCD_DAPM_MUX("AMIC MUX1", 0, tx_amic_mux1), - WCD_DAPM_MUX("AMIC MUX2", 0, tx_amic_mux2), - WCD_DAPM_MUX("AMIC MUX3", 0, tx_amic_mux3), - WCD_DAPM_MUX("AMIC MUX4", 0, tx_amic_mux4), - WCD_DAPM_MUX("AMIC MUX5", 0, tx_amic_mux5), - WCD_DAPM_MUX("AMIC MUX6", 0, tx_amic_mux6), - WCD_DAPM_MUX("AMIC MUX7", 0, tx_amic_mux7), - WCD_DAPM_MUX("AMIC MUX8", 0, tx_amic_mux8), - WCD_DAPM_MUX("AMIC MUX10", 0, tx_amic_mux10), - WCD_DAPM_MUX("AMIC MUX11", 0, tx_amic_mux11), - - SND_SOC_DAPM_ADC_E("ADC1", NULL, WCD9360_ANA_AMIC1, 7, 0, - pahu_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC2", NULL, WCD9360_ANA_AMIC2, 7, 0, - pahu_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC3", NULL, WCD9360_ANA_AMIC3, 7, 0, - pahu_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - SND_SOC_DAPM_ADC_E("ADC4", NULL, WCD9360_ANA_AMIC4, 7, 0, - pahu_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), - - WCD_DAPM_MUX("ANC0 FB MUX", 0, anc0_fb), - - WCD_DAPM_MUX("ADC2_IN", 0, tx_adc2_in), - WCD_DAPM_MUX("ADC4_IN", 0, tx_adc4_in), - - SND_SOC_DAPM_INPUT("AMIC1"), - SND_SOC_DAPM_INPUT("AMIC2"), - SND_SOC_DAPM_INPUT("AMIC3"), - SND_SOC_DAPM_INPUT("AMIC4"), - - SND_SOC_DAPM_MICBIAS_E("MIC BIAS1", SND_SOC_NOPM, 0, 0, - pahu_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS2", SND_SOC_NOPM, 0, 0, - pahu_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS3", SND_SOC_NOPM, 0, 0, - pahu_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS4", SND_SOC_NOPM, 0, 0, - pahu_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS1_STANDALONE, SND_SOC_NOPM, 0, 0, - pahu_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS2_STANDALONE, SND_SOC_NOPM, 0, 0, - pahu_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS3_STANDALONE, SND_SOC_NOPM, 0, 0, - pahu_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS4_STANDALONE, SND_SOC_NOPM, 0, 0, - pahu_codec_force_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT_E("AIF1 CAP", "AIF1 Capture", 0, SND_SOC_NOPM, - AIF1_CAP, 0, pahu_codec_enable_slimtx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_OUT_E("AIF2 CAP", "AIF2 Capture", 0, SND_SOC_NOPM, - AIF2_CAP, 0, pahu_codec_enable_slimtx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_AIF_OUT_E("AIF3 CAP", "AIF3 Capture", 0, SND_SOC_NOPM, - AIF3_CAP, 0, pahu_codec_enable_slimtx, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("I2S TX1_0 MUX", 0, i2s_tx1_0_inp), - WCD_DAPM_MUX("I2S TX1_1 MUX", 0, i2s_tx1_1_inp), - SND_SOC_DAPM_MIXER("I2S TX1 MIXER", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_AIF_OUT_E("I2S1 CAP", "I2S1 Capture", 0, - SND_SOC_NOPM, I2S1_CAP, 0, pahu_i2s_aif_tx_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0, - aif1_cap_mixer, ARRAY_SIZE(aif1_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0, - aif2_cap_mixer, ARRAY_SIZE(aif2_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0, - aif3_cap_mixer, ARRAY_SIZE(aif3_cap_mixer)), - SND_SOC_DAPM_MIXER("AIF4_MAD Mixer", SND_SOC_NOPM, AIF4_MAD_TX, 0, - aif4_mad_mixer, ARRAY_SIZE(aif4_mad_mixer)), - - SND_SOC_DAPM_AIF_OUT_E("AIF4 VI", "VIfeed", 0, SND_SOC_NOPM, - AIF4_VIFEED, 0, pahu_codec_enable_slimvi_feedback, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_AIF_OUT("AIF4 MAD", "AIF4 MAD TX", 0, - SND_SOC_NOPM, 0, 0), - - SND_SOC_DAPM_MIXER("AIF4_VI Mixer", SND_SOC_NOPM, AIF4_VIFEED, 0, - aif4_vi_mixer, ARRAY_SIZE(aif4_vi_mixer)), - SND_SOC_DAPM_INPUT("VIINPUT"), - - SND_SOC_DAPM_MIXER("SLIM TX0", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX1", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX2", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX3", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX4", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX5", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX6", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX7", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX8", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX9", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX10", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX11", SND_SOC_NOPM, 0, 0, NULL, 0), - SND_SOC_DAPM_MIXER("SLIM TX13", SND_SOC_NOPM, 0, 0, NULL, 0), - - /* Digital Mic Inputs */ - SND_SOC_DAPM_ADC_E("DMIC0", NULL, SND_SOC_NOPM, 0, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 1, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 2, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 3, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 4, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 5, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 6, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC7", NULL, SND_SOC_NOPM, 7, 0, - pahu_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("IIR0 INP0 MUX", 0, iir0_inp0), - WCD_DAPM_MUX("IIR0 INP1 MUX", 0, iir0_inp1), - WCD_DAPM_MUX("IIR0 INP2 MUX", 0, iir0_inp2), - WCD_DAPM_MUX("IIR0 INP3 MUX", 0, iir0_inp3), - - SND_SOC_DAPM_MIXER_E("IIR0", WCD9360_CDC_SIDETONE_IIR0_IIR_PATH_CTL, - 4, 0, NULL, 0, pahu_codec_set_iir_gain, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_MIXER("SRC0", WCD9360_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL, - 4, 0, NULL, 0), - - WCD_DAPM_MUX("RX MIX TX0 MUX", 0, rx_mix_tx0), - WCD_DAPM_MUX("RX MIX TX1 MUX", 0, rx_mix_tx1), - WCD_DAPM_MUX("RX MIX TX2 MUX", 0, rx_mix_tx2), - WCD_DAPM_MUX("RX MIX TX3 MUX", 0, rx_mix_tx3), - WCD_DAPM_MUX("RX MIX TX4 MUX", 0, rx_mix_tx4), - WCD_DAPM_MUX("RX MIX TX5 MUX", 0, rx_mix_tx5), - WCD_DAPM_MUX("RX MIX TX6 MUX", 0, rx_mix_tx6), - WCD_DAPM_MUX("RX MIX TX7 MUX", 0, rx_mix_tx7), - WCD_DAPM_MUX("RX MIX TX8 MUX", 0, rx_mix_tx8), - WCD_DAPM_MUX("RX INT0 DEM MUX", 0, rx_int0_dem_inp), - WCD_DAPM_MUX("RX INT9 DEM MUX", 0, rx_int9_dem_inp), - - SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_EAR, 0, - &rx_int0_1_interp_mux, pahu_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT7_1 INTERP", SND_SOC_NOPM, INTERP_SPKR1, 0, - &rx_int7_1_interp_mux, pahu_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT8_1 INTERP", SND_SOC_NOPM, INTERP_SPKR2, 0, - &rx_int8_1_interp_mux, pahu_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("RX INT9_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0, - &rx_int9_1_interp_mux, pahu_codec_enable_main_path, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - WCD_DAPM_MUX("RX INT0_2 INTERP", 0, rx_int0_2_interp), - WCD_DAPM_MUX("RX INT7_2 INTERP", 0, rx_int7_2_interp), - WCD_DAPM_MUX("RX INT8_2 INTERP", 0, rx_int8_2_interp), - WCD_DAPM_MUX("RX INT9_2 INTERP", 0, rx_int9_2_interp), - - SND_SOC_DAPM_SWITCH("ADC US MUX0", WCD9360_CDC_TX0_TX_PATH_192_CTL, 0, - 0, &adc_us_mux0_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX1", WCD9360_CDC_TX1_TX_PATH_192_CTL, 0, - 0, &adc_us_mux1_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX2", WCD9360_CDC_TX2_TX_PATH_192_CTL, 0, - 0, &adc_us_mux2_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX3", WCD9360_CDC_TX3_TX_PATH_192_CTL, 0, - 0, &adc_us_mux3_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX4", WCD9360_CDC_TX4_TX_PATH_192_CTL, 0, - 0, &adc_us_mux4_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX5", WCD9360_CDC_TX5_TX_PATH_192_CTL, 0, - 0, &adc_us_mux5_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX6", WCD9360_CDC_TX6_TX_PATH_192_CTL, 0, - 0, &adc_us_mux6_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX7", WCD9360_CDC_TX7_TX_PATH_192_CTL, 0, - 0, &adc_us_mux7_switch), - SND_SOC_DAPM_SWITCH("ADC US MUX8", WCD9360_CDC_TX8_TX_PATH_192_CTL, 0, - 0, &adc_us_mux8_switch), - - /* MAD related widgets */ - SND_SOC_DAPM_INPUT("MAD_CPE_INPUT"), - SND_SOC_DAPM_INPUT("MADINPUT"), - - WCD_DAPM_MUX("MAD_SEL MUX", 0, mad_sel), - WCD_DAPM_MUX("MAD_INP MUX", 0, mad_inp_mux), - - SND_SOC_DAPM_SWITCH_E("MAD_BROADCAST", SND_SOC_NOPM, 0, 0, - &mad_brdcst_switch, pahu_codec_ape_enable_mad, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_SWITCH_E("MAD_CPE1", SND_SOC_NOPM, 0, 0, - &mad_cpe1_switch, pahu_codec_cpe_mad_ctl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SWITCH_E("MAD_CPE2", SND_SOC_NOPM, 0, 0, - &mad_cpe2_switch, pahu_codec_cpe_mad_ctl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - SND_SOC_DAPM_OUTPUT("MAD_CPE_OUT1"), - SND_SOC_DAPM_OUTPUT("MAD_CPE_OUT2"), - - SND_SOC_DAPM_DAC_E("RX INT0 DAC", NULL, SND_SOC_NOPM, - 0, 0, pahu_codec_ear_dac_event, SND_SOC_DAPM_PRE_PMU), - - SND_SOC_DAPM_PGA_E("EAR PA", WCD9360_ANA_EAR, 7, 0, NULL, 0, - pahu_codec_enable_ear_pa, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC EAR PA", WCD9360_ANA_EAR, 7, 0, NULL, 0, - pahu_codec_enable_ear_pa, SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("ANC SPK1 PA", SND_SOC_NOPM, 0, 0, NULL, 0, - pahu_codec_enable_spkr_anc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("EAR"), - SND_SOC_DAPM_OUTPUT("SPK1 OUT"), - SND_SOC_DAPM_OUTPUT("SPK2 OUT"), - SND_SOC_DAPM_OUTPUT("ANC EAR"), - - SND_SOC_DAPM_SWITCH("ANC OUT EAR Enable", SND_SOC_NOPM, 0, 0, - &anc_ear_switch), - SND_SOC_DAPM_SWITCH("ANC OUT EAR SPKR Enable", SND_SOC_NOPM, 0, 0, - &anc_ear_spkr_switch), - SND_SOC_DAPM_SWITCH("ANC SPKR PA Enable", SND_SOC_NOPM, 0, 0, - &anc_spkr_pa_switch), - - SND_SOC_DAPM_DAC("RX INT9 DAC", NULL, SND_SOC_NOPM, 0, 0), - SND_SOC_DAPM_PGA_E("AUX PA", WCD9360_AUX_ANA_EAR, 7, 0, NULL, 0, - pahu_codec_enable_aux_pa, SND_SOC_DAPM_POST_PMU), - SND_SOC_DAPM_OUTPUT("AUX"), - - - SND_SOC_DAPM_SUPPLY("LDO_RXTX", SND_SOC_NOPM, 0, 0, - pahu_codec_enable_ldo_rxtx, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("RX INT7 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_SPKR1, 0, pahu_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("RX INT8 NATIVE SUPPLY", SND_SOC_NOPM, - INTERP_SPKR2, 0, pahu_enable_native_supply, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), - - WCD_DAPM_MUX("RX INT7_2 NATIVE MUX", 0, int7_2_native), - WCD_DAPM_MUX("RX INT8_2 NATIVE MUX", 0, int8_2_native), - - SND_SOC_DAPM_MUX_E("ASRC2 MUX", SND_SOC_NOPM, ASRC2, 0, - &asrc2_mux, pahu_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MUX_E("ASRC3 MUX", SND_SOC_NOPM, ASRC3, 0, - &asrc3_mux, pahu_codec_enable_asrc_resampler, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /* WDMA3 widgets */ - WCD_DAPM_MUX("WDMA3 PORT0 MUX", 0, wdma3_port0), - WCD_DAPM_MUX("WDMA3 PORT1 MUX", 1, wdma3_port1), - WCD_DAPM_MUX("WDMA3 PORT2 MUX", 2, wdma3_port2), - WCD_DAPM_MUX("WDMA3 PORT3 MUX", 3, wdma3_port3), - WCD_DAPM_MUX("WDMA3 PORT4 MUX", 4, wdma3_port4), - WCD_DAPM_MUX("WDMA3 PORT5 MUX", 5, wdma3_port5), - WCD_DAPM_MUX("WDMA3 PORT6 MUX", 6, wdma3_port6), - - WCD_DAPM_MUX("WDMA3 CH0 MUX", 0, wdma3_ch0), - WCD_DAPM_MUX("WDMA3 CH1 MUX", 4, wdma3_ch1), - WCD_DAPM_MUX("WDMA3 CH2 MUX", 0, wdma3_ch2), - WCD_DAPM_MUX("WDMA3 CH3 MUX", 4, wdma3_ch3), - - SND_SOC_DAPM_MIXER("WDMA3_CH_MIXER", SND_SOC_NOPM, 0, 0, NULL, 0), - - SND_SOC_DAPM_SWITCH_E("WDMA3_ON_OFF", SND_SOC_NOPM, 0, 0, - &wdma3_onoff_switch, pahu_codec_wdma3_ctl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("WDMA3_OUT"), -}; - -static int pahu_get_channel_map(struct snd_soc_dai *dai, - unsigned int *tx_num, unsigned int *tx_slot, - unsigned int *rx_num, unsigned int *rx_slot) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(dai->codec); - u32 i = 0; - struct wcd9xxx_ch *ch; - int ret = 0; - - switch (dai->id) { - case AIF1_PB: - case AIF2_PB: - case AIF3_PB: - case AIF4_PB: - if (!rx_slot || !rx_num) { - dev_err(pahu->dev, "%s: Invalid rx_slot 0x%pK or rx_num 0x%pK\n", - __func__, rx_slot, rx_num); - ret = -EINVAL; - break; - } - list_for_each_entry(ch, &pahu->dai[dai->id].wcd9xxx_ch_list, - list) { - dev_dbg(pahu->dev, "%s: slot_num %u ch->ch_num %d\n", - __func__, i, ch->ch_num); - rx_slot[i++] = ch->ch_num; - } - *rx_num = i; - dev_dbg(pahu->dev, "%s: dai_name = %s dai_id = %x rx_num = %d\n", - __func__, dai->name, dai->id, i); - if (*rx_num == 0) { - dev_err(pahu->dev, "%s: Channel list empty for dai_name = %s dai_id = %x\n", - __func__, dai->name, dai->id); - ret = -EINVAL; - } - break; - case AIF1_CAP: - case AIF2_CAP: - case AIF3_CAP: - case AIF4_MAD_TX: - case AIF4_VIFEED: - if (!tx_slot || !tx_num) { - dev_err(pahu->dev, "%s: Invalid tx_slot 0x%pK or tx_num 0x%pK\n", - __func__, tx_slot, tx_num); - ret = -EINVAL; - break; - } - list_for_each_entry(ch, &pahu->dai[dai->id].wcd9xxx_ch_list, - list) { - dev_dbg(pahu->dev, "%s: slot_num %u ch->ch_num %d\n", - __func__, i, ch->ch_num); - tx_slot[i++] = ch->ch_num; - } - *tx_num = i; - dev_dbg(pahu->dev, "%s: dai_name = %s dai_id = %x tx_num = %d\n", - __func__, dai->name, dai->id, i); - if (*tx_num == 0) { - dev_err(pahu->dev, "%s: Channel list empty for dai_name = %s dai_id = %x\n", - __func__, dai->name, dai->id); - ret = -EINVAL; - } - break; - default: - dev_err(pahu->dev, "%s: Invalid DAI ID %x\n", - __func__, dai->id); - ret = -EINVAL; - break; - } - - return ret; -} - -static int pahu_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - struct pahu_priv *pahu; - struct wcd9xxx *core; - struct wcd9xxx_codec_dai_data *dai_data = NULL; - - pahu = snd_soc_codec_get_drvdata(dai->codec); - core = dev_get_drvdata(dai->codec->dev->parent); - - if (!tx_slot || !rx_slot) { - dev_err(pahu->dev, "%s: Invalid tx_slot 0x%pK, rx_slot 0x%pK\n", - __func__, tx_slot, rx_slot); - return -EINVAL; - } - dev_dbg(pahu->dev, "%s(): dai_name = %s DAI-ID %x tx_ch %d rx_ch %d\n", - __func__, dai->name, dai->id, tx_num, rx_num); - - wcd9xxx_init_slimslave(core, core->slim->laddr, - tx_num, tx_slot, rx_num, rx_slot); - /* Reserve TX13 for MAD data channel */ - dai_data = &pahu->dai[AIF4_MAD_TX]; - if (dai_data) - list_add_tail(&core->tx_chs[WCD9360_TX13].list, - &dai_data->wcd9xxx_ch_list); - - return 0; -} - -static int pahu_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - return 0; -} - -static void pahu_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); -} - -static int pahu_set_decimator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - u32 tx_port = 0, tx_fs_rate = 0; - u8 shift = 0, shift_val = 0, tx_mux_sel = 0; - int decimator = -1; - u16 tx_port_reg = 0, tx_fs_reg = 0; - - switch (sample_rate) { - case 8000: - tx_fs_rate = 0; - break; - case 16000: - tx_fs_rate = 1; - break; - case 32000: - tx_fs_rate = 3; - break; - case 48000: - tx_fs_rate = 4; - break; - case 96000: - tx_fs_rate = 5; - break; - case 192000: - tx_fs_rate = 6; - break; - default: - dev_err(pahu->dev, "%s: Invalid TX sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - - }; - - list_for_each_entry(ch, &pahu->dai[dai->id].wcd9xxx_ch_list, list) { - tx_port = ch->port; - dev_dbg(codec->dev, "%s: dai->id = %d, tx_port = %d", - __func__, dai->id, tx_port); - - if ((tx_port < 0) || (tx_port == 12) || (tx_port >= 14)) { - dev_err(codec->dev, "%s: Invalid SLIM TX%u port. DAI ID: %d\n", - __func__, tx_port, dai->id); - return -EINVAL; - } - /* Find the SB TX MUX input - which decimator is connected */ - if (tx_port < 4) { - tx_port_reg = WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0; - shift = (tx_port << 1); - shift_val = 0x03; - } else if ((tx_port >= 4) && (tx_port < 8)) { - tx_port_reg = WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1; - shift = ((tx_port - 4) << 1); - shift_val = 0x03; - } else if ((tx_port >= 8) && (tx_port < 11)) { - tx_port_reg = WCD9360_CDC_IF_ROUTER_TX_MUX_CFG2; - shift = ((tx_port - 8) << 1); - shift_val = 0x03; - } else if (tx_port == 11) { - tx_port_reg = WCD9360_CDC_IF_ROUTER_TX_MUX_CFG3; - shift = 0; - shift_val = 0x0F; - } else if (tx_port == 13) { - tx_port_reg = WCD9360_CDC_IF_ROUTER_TX_MUX_CFG3; - shift = 4; - shift_val = 0x03; - } - tx_mux_sel = snd_soc_read(codec, tx_port_reg) & - (shift_val << shift); - tx_mux_sel = tx_mux_sel >> shift; - - if (tx_port <= 8) { - if ((tx_mux_sel == 0x2) || (tx_mux_sel == 0x3)) - decimator = tx_port; - } else if (tx_port <= 10) { - if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) - decimator = ((tx_port == 9) ? 7 : 6); - } else if (tx_port == 11) { - if ((tx_mux_sel >= 1) && (tx_mux_sel < 7)) - decimator = tx_mux_sel - 1; - } else if (tx_port == 13) { - if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) - decimator = 5; - } - - if (decimator >= 0) { - tx_fs_reg = WCD9360_CDC_TX0_TX_PATH_CTL + - 16 * decimator; - dev_dbg(codec->dev, "%s: set DEC%u (-> SLIM_TX%u) rate to %u\n", - __func__, decimator, tx_port, sample_rate); - snd_soc_update_bits(codec, tx_fs_reg, 0x0F, tx_fs_rate); - } else if ((tx_port <= 8) && (tx_mux_sel == 0x01)) { - /* Check if the TX Mux input is RX MIX TXn */ - dev_dbg(codec->dev, "%s: RX_MIX_TX%u going to CDC_IF TX%u\n", - __func__, tx_port, tx_port); - } else { - dev_err(codec->dev, "%s: ERROR: Invalid decimator: %d\n", - __func__, decimator); - return -EINVAL; - } - } - return 0; -} - -static int pahu_set_mix_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_2_inp; - u32 j; - u16 int_mux_cfg1, int_fs_reg; - u8 int_mux_cfg1_val; - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - list_for_each_entry(ch, &pahu->dai[dai->id].wcd9xxx_ch_list, list) { - int_2_inp = INTn_2_INP_SEL_RX0 + ch->port - - WCD9360_RX_PORT_START_NUMBER; - if ((int_2_inp < INTn_2_INP_SEL_RX0) || - (int_2_inp > INTn_2_INP_SEL_RX7)) { - dev_err(codec->dev, "%s: Invalid RX%u port, Dai ID is %d\n", - __func__, - (ch->port - WCD9360_RX_PORT_START_NUMBER), - dai->id); - return -EINVAL; - } - - for (j = 0; j < WCD9360_NUM_INTERPOLATORS; j++) { - if (j == INTERP_EAR) { - int_mux_cfg1 = - WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG1; - int_fs_reg = WCD9360_CDC_RX0_RX_PATH_MIX_CTL; - } else if (j == INTERP_SPKR1) { - int_mux_cfg1 = - WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG1; - int_fs_reg = WCD9360_CDC_RX7_RX_PATH_MIX_CTL; - } else if (j == INTERP_SPKR2) { - int_mux_cfg1 = - WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG1; - int_fs_reg = WCD9360_CDC_RX8_RX_PATH_MIX_CTL; - } else if (j == INTERP_AUX) { - int_mux_cfg1 = - WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG1; - int_fs_reg = WCD9360_CDC_RX9_RX_PATH_MIX_CTL; - } else { - continue; - } - - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) & - 0x0F; - if (int_mux_cfg1_val == int_2_inp) { - /* - * Ear mix path supports only 48, 96, 192, - * 384KHz only - */ - if ((j == INTERP_EAR || j == INTERP_AUX) && - (rate_reg_val < 0x4 || rate_reg_val > 0x7)) { - dev_err_ratelimited(codec->dev, - "%s: Invalid rate for AIF_PB DAI(%d)\n", - __func__, dai->id); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: AIF_PB DAI(%d) connected to INT%u_2\n", - __func__, dai->id, j); - dev_dbg(codec->dev, "%s: set INT%u_2 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, 0x0F, - rate_reg_val); - } - } - } - return 0; -} - -static int pahu_set_prim_interpolator_rate(struct snd_soc_dai *dai, - u8 rate_reg_val, - u32 sample_rate) -{ - u8 int_1_mix1_inp; - u32 j; - u16 int_mux_cfg0, int_mux_cfg1; - u16 int_fs_reg; - u8 int_mux_cfg0_val, int_mux_cfg1_val; - u8 inp0_sel, inp1_sel, inp2_sel; - struct snd_soc_codec *codec = dai->codec; - struct wcd9xxx_ch *ch; - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - list_for_each_entry(ch, &pahu->dai[dai->id].wcd9xxx_ch_list, list) { - int_1_mix1_inp = INTn_1_INP_SEL_RX0 + ch->port - - WCD9360_RX_PORT_START_NUMBER; - if ((int_1_mix1_inp < INTn_1_INP_SEL_RX0) || - (int_1_mix1_inp > INTn_1_INP_SEL_RX7)) { - dev_err(codec->dev, "%s: Invalid RX%u port, Dai ID is %d\n", - __func__, - (ch->port - WCD9360_RX_PORT_START_NUMBER), - dai->id); - return -EINVAL; - } - - /* - * Loop through all interpolator MUX inputs and find out - * to which interpolator input, the slim rx port - * is connected - */ - for (j = 0; j < WCD9360_NUM_INTERPOLATORS; j++) { - if (j == INTERP_EAR) { - int_mux_cfg0 = - WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG0; - int_fs_reg = WCD9360_CDC_RX0_RX_PATH_CTL; - } else if (j == INTERP_SPKR1) { - int_mux_cfg0 = - WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG0; - int_fs_reg = WCD9360_CDC_RX7_RX_PATH_CTL; - } else if (j == INTERP_SPKR2) { - int_mux_cfg0 = - WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG0; - int_fs_reg = WCD9360_CDC_RX8_RX_PATH_CTL; - } else if (j == INTERP_AUX) { - int_mux_cfg0 = - WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG0; - int_fs_reg = WCD9360_CDC_RX9_RX_PATH_CTL; - } else { - continue; - } - int_mux_cfg1 = int_mux_cfg0 + 1; - - int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0); - int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1); - inp0_sel = int_mux_cfg0_val & 0x0F; - inp1_sel = (int_mux_cfg0_val >> 4) & 0x0F; - inp2_sel = (int_mux_cfg1_val >> 4) & 0x0F; - if ((inp0_sel == int_1_mix1_inp) || - (inp1_sel == int_1_mix1_inp) || - (inp2_sel == int_1_mix1_inp)) { - /* - * Primary path does not support - * native sample rates - */ - if (rate_reg_val > 0x7) { - dev_err_ratelimited(codec->dev, - "%s: Invalid rate for AIF_PB DAI(%d)\n", - __func__, dai->id); - return -EINVAL; - } - dev_dbg(codec->dev, - "%s: AIF_PB DAI(%d) connected to INT%u_1\n", - __func__, dai->id, j); - dev_dbg(codec->dev, - "%s: set INT%u_1 sample rate to %u\n", - __func__, j, sample_rate); - snd_soc_update_bits(codec, int_fs_reg, 0x0F, - rate_reg_val); - } - int_mux_cfg0 += 2; - } - } - - return 0; -} - - -static int pahu_set_interpolator_rate(struct snd_soc_dai *dai, - u32 sample_rate) -{ - struct snd_soc_codec *codec = dai->codec; - int rate_val = 0; - int i, ret; - - for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) { - if (sample_rate == sr_val_tbl[i].sample_rate) { - rate_val = sr_val_tbl[i].rate_val; - break; - } - } - if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) { - dev_err(codec->dev, "%s: Unsupported sample rate: %d\n", - __func__, sample_rate); - return -EINVAL; - } - - ret = pahu_set_prim_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - ret = pahu_set_mix_interpolator_rate(dai, (u8)rate_val, sample_rate); - if (ret) - return ret; - - return ret; -} - -static int pahu_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - return 0; -} - -static int pahu_vi_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(dai->codec); - - dev_dbg(pahu->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params)); - - pahu->dai[dai->id].rate = params_rate(params); - pahu->dai[dai->id].bit_width = 32; - - return 0; -} - -static int pahu_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(dai->codec); - int ret = 0; - - dev_dbg(pahu->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params)); - - switch (substream->stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - ret = pahu_set_interpolator_rate(dai, params_rate(params)); - if (ret) { - dev_err(pahu->dev, "%s: cannot set sample rate: %u\n", - __func__, params_rate(params)); - return ret; - } - switch (params_width(params)) { - case 16: - pahu->dai[dai->id].bit_width = 16; - break; - case 24: - pahu->dai[dai->id].bit_width = 24; - break; - case 32: - pahu->dai[dai->id].bit_width = 32; - break; - default: - return -EINVAL; - } - pahu->dai[dai->id].rate = params_rate(params); - break; - case SNDRV_PCM_STREAM_CAPTURE: - if (dai->id != AIF4_MAD_TX) - ret = pahu_set_decimator_rate(dai, - params_rate(params)); - if (ret) { - dev_err(pahu->dev, "%s: cannot set TX Decimator rate: %d\n", - __func__, ret); - return ret; - } - switch (params_width(params)) { - case 16: - pahu->dai[dai->id].bit_width = 16; - break; - case 24: - pahu->dai[dai->id].bit_width = 24; - break; - default: - dev_err(pahu->dev, "%s: Invalid format 0x%x\n", - __func__, params_width(params)); - return -EINVAL; - }; - pahu->dai[dai->id].rate = params_rate(params); - break; - default: - dev_err(pahu->dev, "%s: Invalid stream type %d\n", __func__, - substream->stream); - return -EINVAL; - }; - - return 0; -} - -static int pahu_i2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(dai->codec); - - dev_dbg(dai->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", - __func__, dai->name, dai->id, params_rate(params), - params_channels(params)); - - pahu->dai[dai->id].rate = params_rate(params); - pahu->dai[dai->id].bit_width = params_width(params); - - return 0; -} - -static struct snd_soc_dai_ops pahu_dai_ops = { - .startup = pahu_startup, - .shutdown = pahu_shutdown, - .hw_params = pahu_hw_params, - .prepare = pahu_prepare, - .set_channel_map = pahu_set_channel_map, - .get_channel_map = pahu_get_channel_map, -}; - -static struct snd_soc_dai_ops pahu_vi_dai_ops = { - .hw_params = pahu_vi_hw_params, - .set_channel_map = pahu_set_channel_map, - .get_channel_map = pahu_get_channel_map, -}; - -static struct snd_soc_dai_ops pahu_i2s_dai_ops = { - .hw_params = pahu_i2s_hw_params, -}; - -static struct snd_soc_dai_driver pahu_dai[] = { - { - .name = "pahu_rx1", - .id = AIF1_PB, - .playback = { - .stream_name = "AIF1 Playback", - .rates = WCD9360_RATES_MASK | WCD9360_FRAC_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_tx1", - .id = AIF1_CAP, - .capture = { - .stream_name = "AIF1 Capture", - .rates = WCD9360_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_rx2", - .id = AIF2_PB, - .playback = { - .stream_name = "AIF2 Playback", - .rates = WCD9360_RATES_MASK | WCD9360_FRAC_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_tx2", - .id = AIF2_CAP, - .capture = { - .stream_name = "AIF2 Capture", - .rates = WCD9360_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_rx3", - .id = AIF3_PB, - .playback = { - .stream_name = "AIF3 Playback", - .rates = WCD9360_RATES_MASK | WCD9360_FRAC_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_tx3", - .id = AIF3_CAP, - .capture = { - .stream_name = "AIF3 Capture", - .rates = WCD9360_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 8, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_rx4", - .id = AIF4_PB, - .playback = { - .stream_name = "AIF4 Playback", - .rates = WCD9360_RATES_MASK | WCD9360_FRAC_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_vifeedback", - .id = AIF4_VIFEED, - .capture = { - .stream_name = "VIfeed", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, - .formats = WCD9360_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 4, - }, - .ops = &pahu_vi_dai_ops, - }, - { - .name = "pahu_mad1", - .id = AIF4_MAD_TX, - .capture = { - .stream_name = "AIF4 MAD TX", - .rates = SNDRV_PCM_RATE_16000, - .formats = WCD9360_FORMATS_S16_LE, - .rate_min = 16000, - .rate_max = 16000, - .channels_min = 1, - .channels_max = 1, - }, - .ops = &pahu_dai_ops, - }, - { - .name = "pahu_i2s1_rx", - .id = I2S1_PB, - .playback = { - .stream_name = "I2S1 Playback", - .rates = WCD9360_RATES_MASK | WCD9360_FRAC_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &pahu_i2s_dai_ops, - }, - { - .name = "pahu_i2s1_tx", - .id = I2S1_CAP, - .capture = { - .stream_name = "I2S1 Capture", - .rates = WCD9360_RATES_MASK | WCD9360_FRAC_RATES_MASK, - .formats = WCD9360_FORMATS_S16_S24_S32_LE, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 2, - }, - .ops = &pahu_i2s_dai_ops, - }, -}; - -static void pahu_codec_power_gate_digital_core(struct pahu_priv *pahu) -{ - mutex_lock(&pahu->power_lock); - dev_dbg(pahu->dev, "%s: Entering power gating function, %d\n", - __func__, pahu->power_active_ref); - - if (pahu->power_active_ref > 0) - goto exit; - - wcd9xxx_set_power_state(pahu->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_BEGIN, - WCD9XXX_DIG_CORE_REGION_1); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x04, 0x04); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x01, 0x00); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x02, 0x00); - wcd9xxx_set_power_state(pahu->wcd9xxx, WCD_REGION_POWER_DOWN, - WCD9XXX_DIG_CORE_REGION_1); -exit: - dev_dbg(pahu->dev, "%s: Exiting power gating function, %d\n", - __func__, pahu->power_active_ref); - mutex_unlock(&pahu->power_lock); -} - -static void pahu_codec_power_gate_work(struct work_struct *work) -{ - struct pahu_priv *pahu; - struct delayed_work *dwork; - - dwork = to_delayed_work(work); - pahu = container_of(dwork, struct pahu_priv, power_gate_work); - - pahu_codec_power_gate_digital_core(pahu); -} - -/* called under power_lock acquisition */ -static int pahu_dig_core_remove_power_collapse(struct pahu_priv *pahu) -{ - regmap_write(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x05); - regmap_write(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x07); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_RST_CTL, 0x02, 0x00); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_RST_CTL, 0x02, 0x02); - regmap_write(pahu->wcd9xxx->regmap, - WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x03); - - wcd9xxx_set_power_state(pahu->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - regcache_mark_dirty(pahu->wcd9xxx->regmap); - regcache_sync_region(pahu->wcd9xxx->regmap, - WCD9360_DIG_CORE_REG_MIN, - WCD9360_DIG_CORE_REG_MAX); - return 0; -} - -static int pahu_dig_core_power_collapse(struct pahu_priv *pahu, - int req_state) -{ - int cur_state; - - /* Exit if feature is disabled */ - if (!dig_core_collapse_enable) - return 0; - - mutex_lock(&pahu->power_lock); - if (req_state == POWER_COLLAPSE) - pahu->power_active_ref--; - else if (req_state == POWER_RESUME) - pahu->power_active_ref++; - else - goto unlock_mutex; - - if (pahu->power_active_ref < 0) { - dev_dbg(pahu->dev, "%s: power_active_ref is negative\n", - __func__); - goto unlock_mutex; - } - - if (req_state == POWER_COLLAPSE) { - if (pahu->power_active_ref == 0) { - schedule_delayed_work(&pahu->power_gate_work, - msecs_to_jiffies(dig_core_collapse_timer * 1000)); - } - } else if (req_state == POWER_RESUME) { - if (pahu->power_active_ref == 1) { - /* - * At this point, there can be two cases: - * 1. Core already in power collapse state - * 2. Timer kicked in and still did not expire or - * waiting for the power_lock - */ - cur_state = wcd9xxx_get_current_power_state( - pahu->wcd9xxx, - WCD9XXX_DIG_CORE_REGION_1); - if (cur_state == WCD_REGION_POWER_DOWN) { - pahu_dig_core_remove_power_collapse(pahu); - } else { - mutex_unlock(&pahu->power_lock); - cancel_delayed_work_sync( - &pahu->power_gate_work); - mutex_lock(&pahu->power_lock); - } - } - } - -unlock_mutex: - mutex_unlock(&pahu->power_lock); - - return 0; -} - -static int pahu_cdc_req_mclk_enable(struct pahu_priv *pahu, - bool enable) -{ - int ret = 0; - - if (enable) { - ret = clk_prepare_enable(pahu->wcd_ext_clk); - if (ret) { - dev_err(pahu->dev, "%s: ext clk enable failed\n", - __func__); - goto done; - } - /* get BG */ - wcd_resmgr_enable_master_bias(pahu->resmgr); - /* get MCLK */ - wcd_resmgr_enable_clk_block(pahu->resmgr, WCD_CLK_MCLK); - } else { - /* put MCLK */ - wcd_resmgr_disable_clk_block(pahu->resmgr, WCD_CLK_MCLK); - /* put BG */ - wcd_resmgr_disable_master_bias(pahu->resmgr); - clk_disable_unprepare(pahu->wcd_ext_clk); - } - -done: - return ret; -} - -static int __pahu_cdc_mclk_enable_locked(struct pahu_priv *pahu, - bool enable) -{ - int ret = 0; - - if (!pahu->wcd_ext_clk) { - dev_err(pahu->dev, "%s: wcd ext clock is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(pahu->dev, "%s: mclk_enable = %u\n", __func__, enable); - - if (enable) { - pahu_dig_core_power_collapse(pahu, POWER_RESUME); - pahu_vote_svs(pahu, true); - ret = pahu_cdc_req_mclk_enable(pahu, true); - if (ret) - goto done; - } else { - pahu_cdc_req_mclk_enable(pahu, false); - pahu_vote_svs(pahu, false); - pahu_dig_core_power_collapse(pahu, POWER_COLLAPSE); - } - -done: - return ret; -} - -static int __pahu_cdc_mclk_enable(struct pahu_priv *pahu, - bool enable) -{ - int ret; - - WCD9XXX_V2_BG_CLK_LOCK(pahu->resmgr); - ret = __pahu_cdc_mclk_enable_locked(pahu, enable); - if (enable) - wcd_resmgr_set_sido_input_src(pahu->resmgr, - SIDO_SOURCE_RCO_BG); - WCD9XXX_V2_BG_CLK_UNLOCK(pahu->resmgr); - - return ret; -} - -static ssize_t pahu_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct pahu_priv *pahu; - struct wcd9xxx *wcd9xxx; - char buffer[PAHU_VERSION_ENTRY_SIZE]; - int len = 0; - - pahu = (struct pahu_priv *) entry->private_data; - if (!pahu) { - pr_err("%s: pahu priv is null\n", __func__); - return -EINVAL; - } - - wcd9xxx = pahu->wcd9xxx; - - switch (wcd9xxx->version) { - case PAHU_VERSION_1_0: - len = snprintf(buffer, sizeof(buffer), "WCD9360_1_0\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops pahu_codec_info_ops = { - .read = pahu_codec_version_read, -}; - -/* - * pahu_codec_info_create_codec_entry - creates wcd9360 module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates wcd9360 module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int pahu_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct pahu_priv *pahu; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - pahu = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - pahu->entry = snd_info_create_subdir(codec_root->module, - "pahu", codec_root); - if (!pahu->entry) { - dev_dbg(codec->dev, "%s: failed to create wcd9360 entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - pahu->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd9360 version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = pahu; - version_entry->size = PAHU_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &pahu_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - pahu->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(pahu_codec_info_create_codec_entry); - -/** - * pahu_cdc_mclk_enable - Enable/disable codec mclk - * - * @codec: codec instance - * @enable: Indicates clk enable or disable - * - * Returns 0 on Success and error on failure - */ -int pahu_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - return __pahu_cdc_mclk_enable(pahu, enable); -} -EXPORT_SYMBOL(pahu_cdc_mclk_enable); - -static int __pahu_codec_internal_rco_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - if (enable) { - if (wcd_resmgr_get_clk_type(pahu->resmgr) == - WCD_CLK_RCO) { - ret = wcd_resmgr_enable_clk_block(pahu->resmgr, - WCD_CLK_RCO); - } else { - ret = pahu_cdc_req_mclk_enable(pahu, true); - if (ret) { - dev_err(codec->dev, - "%s: mclk_enable failed, err = %d\n", - __func__, ret); - goto done; - } - wcd_resmgr_set_sido_input_src(pahu->resmgr, - SIDO_SOURCE_RCO_BG); - ret = wcd_resmgr_enable_clk_block(pahu->resmgr, - WCD_CLK_RCO); - ret |= pahu_cdc_req_mclk_enable(pahu, false); - } - - } else { - ret = wcd_resmgr_disable_clk_block(pahu->resmgr, - WCD_CLK_RCO); - } - - if (ret) { - dev_err(codec->dev, "%s: Error in %s RCO\n", - __func__, (enable ? "enabling" : "disabling")); - ret = -EINVAL; - } - -done: - return ret; -} - -/* - * pahu_codec_internal_rco_ctrl: Enable/Disable codec's RCO clock - * @codec: Handle to the codec - * @enable: Indicates whether clock should be enabled or disabled - */ -static int pahu_codec_internal_rco_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - WCD9XXX_V2_BG_CLK_LOCK(pahu->resmgr); - ret = __pahu_codec_internal_rco_ctrl(codec, enable); - WCD9XXX_V2_BG_CLK_UNLOCK(pahu->resmgr); - return ret; -} - -/* - * pahu_cdc_mclk_tx_enable: Enable/Disable codec's clock for TX path - * @codec: Handle to codec - * @enable: Indicates whether clock should be enabled or disabled - */ -int pahu_cdc_mclk_tx_enable(struct snd_soc_codec *codec, bool enable) -{ - struct pahu_priv *pahu_p; - int ret = 0; - bool clk_mode; - bool clk_internal; - - if (!codec) - return -EINVAL; - - pahu_p = snd_soc_codec_get_drvdata(codec); - clk_mode = test_bit(CLK_MODE, &pahu_p->status_mask); - clk_internal = test_bit(CLK_INTERNAL, &pahu_p->status_mask); - - dev_dbg(codec->dev, "%s: clkmode: %d, enable: %d, clk_internal: %d\n", - __func__, clk_mode, enable, clk_internal); - - if (clk_mode || clk_internal) { - if (enable) { - wcd_resmgr_enable_master_bias(pahu_p->resmgr); - pahu_dig_core_power_collapse(pahu_p, POWER_RESUME); - pahu_vote_svs(pahu_p, true); - ret = pahu_codec_internal_rco_ctrl(codec, enable); - set_bit(CLK_INTERNAL, &pahu_p->status_mask); - } else { - clear_bit(CLK_INTERNAL, &pahu_p->status_mask); - pahu_codec_internal_rco_ctrl(codec, enable); - pahu_vote_svs(pahu_p, false); - pahu_dig_core_power_collapse(pahu_p, POWER_COLLAPSE); - wcd_resmgr_disable_master_bias(pahu_p->resmgr); - } - } else { - ret = __pahu_cdc_mclk_enable(pahu_p, enable); - } - - return ret; -} -EXPORT_SYMBOL(pahu_cdc_mclk_tx_enable); - -static const struct wcd_resmgr_cb pahu_resmgr_cb = { - .cdc_rco_ctrl = __pahu_codec_internal_rco_ctrl, -}; - -static const struct pahu_reg_mask_val pahu_codec_mclk2_1_0_defaults[] = { - /* - * PLL Settings: - * Clock Root: MCLK2, - * Clock Source: EXT_CLK, - * Clock Destination: MCLK2 - * Clock Freq In: 19.2MHz, - * Clock Freq Out: 11.2896MHz - */ - {WCD9360_CLK_SYS_MCLK2_PRG1, 0x60, 0x20}, - {WCD9360_CLK_SYS_INT_POST_DIV_REG0, 0xFF, 0x5E}, - {WCD9360_CLK_SYS_INT_POST_DIV_REG1, 0x1F, 0x1F}, - {WCD9360_CLK_SYS_INT_REF_DIV_REG0, 0xFF, 0x54}, - {WCD9360_CLK_SYS_INT_REF_DIV_REG1, 0xFF, 0x01}, - {WCD9360_CLK_SYS_INT_FILTER_REG1, 0x07, 0x04}, - {WCD9360_CLK_SYS_INT_PLL_L_VAL, 0xFF, 0x93}, - {WCD9360_CLK_SYS_INT_PLL_N_VAL, 0xFF, 0xFA}, - {WCD9360_CLK_SYS_INT_TEST_REG0, 0xFF, 0x90}, - {WCD9360_CLK_SYS_INT_PFD_CP_DSM_PROG, 0xFF, 0x7E}, - {WCD9360_CLK_SYS_INT_VCO_PROG, 0xFF, 0xF8}, - {WCD9360_CLK_SYS_INT_TEST_REG1, 0xFF, 0x68}, - {WCD9360_CLK_SYS_INT_LDO_LOCK_CFG, 0xFF, 0x40}, - {WCD9360_CLK_SYS_INT_DIG_LOCK_DET_CFG, 0xFF, 0x32}, -}; - -static const struct pahu_reg_mask_val pahu_codec_reg_defaults[] = { - {WCD9360_BIAS_VBG_FINE_ADJ, 0xFF, 0x75}, - {WCD9360_CODEC_RPM_CLK_MCLK_CFG, 0x03, 0x01}, - {WCD9360_CODEC_CPR_SVS_CX_VDD, 0xFF, 0x7C}, /* value in svs mode */ - {WCD9360_CODEC_CPR_SVS2_CX_VDD, 0xFF, 0x58}, /* value in svs2 mode */ - {WCD9360_CDC_RX0_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD9360_CDC_RX7_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD9360_CDC_RX8_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD9360_CDC_RX9_RX_PATH_DSMDEM_CTL, 0x01, 0x01}, - {WCD9360_CDC_COMPANDER8_CTL7, 0x1E, 0x18}, - {WCD9360_CDC_COMPANDER7_CTL7, 0x1E, 0x18}, - {WCD9360_CDC_RX0_RX_PATH_SEC0, 0x08, 0x00}, - {WCD9360_CDC_RX9_RX_PATH_SEC0, 0x08, 0x00}, - {WCD9360_MICB1_TEST_CTL_2, 0x07, 0x01}, - {WCD9360_CDC_BOOST0_BOOST_CFG1, 0x3F, 0x12}, - {WCD9360_CDC_BOOST0_BOOST_CFG2, 0x1C, 0x08}, - {WCD9360_CDC_BOOST1_BOOST_CFG1, 0x3F, 0x12}, - {WCD9360_CDC_BOOST1_BOOST_CFG2, 0x1C, 0x08}, - {WCD9360_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 0x1F, 0x09}, - {WCD9360_CDC_TX0_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX1_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX2_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX3_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX4_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX5_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX6_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX7_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CDC_TX8_TX_PATH_CFG1, 0x01, 0x00}, - {WCD9360_CPE_FLL_CONFIG_CTL_2, 0xFF, 0x20}, - {WCD9360_CPE_SS_DMIC_CFG, 0x80, 0x00}, - {WCD9360_CDC_BOOST0_BOOST_CTL, 0x70, 0x50}, - {WCD9360_CDC_BOOST1_BOOST_CTL, 0x70, 0x50}, - {WCD9360_CDC_RX7_RX_PATH_CFG1, 0x08, 0x08}, - {WCD9360_CDC_RX8_RX_PATH_CFG1, 0x08, 0x08}, - {WCD9360_CDC_TOP_TOP_CFG1, 0x02, 0x02}, - {WCD9360_CDC_TOP_TOP_CFG1, 0x01, 0x01}, - {WCD9360_CDC_TOP_EAR_COMP_LUT, 0x80, 0x80}, - {WCD9360_EAR_EAR_DAC_CON, 0x06, 0x02}, - {WCD9360_AUX_INT_AUX_DAC_CON, 0x06, 0x02}, - {WCD9360_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9360_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9360_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9360_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x01, 0x01}, - {WCD9360_DATA_HUB_SB_TX11_INP_CFG, 0x01, 0x01}, - {WCD9360_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, 0x01, 0x01}, - {WCD9360_CDC_COMPANDER7_CTL3, 0x80, 0x80}, - {WCD9360_CDC_COMPANDER8_CTL3, 0x80, 0x80}, - {WCD9360_CDC_COMPANDER7_CTL7, 0x01, 0x01}, - {WCD9360_CDC_COMPANDER8_CTL7, 0x01, 0x01}, - {WCD9360_CODEC_RPM_CLK_GATE, 0x08, 0x00}, - {WCD9360_CPE_SS_SVA_CFG, 0x60, 0x00}, - {WCD9360_CPE_SS_CPAR_CFG, 0x10, 0x10}, -}; - -static const struct pahu_cpr_reg_defaults cpr_defaults[] = { - { 0x00000820, 0x00000094 }, - { 0x00000fC0, 0x00000048 }, - { 0x0000f000, 0x00000044 }, - { 0x0000bb80, 0xC0000178 }, - { 0x00000000, 0x00000160 }, - { 0x10854522, 0x00000060 }, - { 0x10854509, 0x00000064 }, - { 0x108544dd, 0x00000068 }, - { 0x108544ad, 0x0000006C }, - { 0x0000077E, 0x00000070 }, - { 0x000007da, 0x00000074 }, - { 0x00000000, 0x00000078 }, - { 0x00000000, 0x0000007C }, - { 0x00042029, 0x00000080 }, - { 0x4002002A, 0x00000090 }, - { 0x4002002B, 0x00000090 }, -}; - -static void pahu_update_reg_defaults(struct pahu_priv *pahu) -{ - u32 i; - struct wcd9xxx *wcd9xxx; - - wcd9xxx = pahu->wcd9xxx; - for (i = 0; i < ARRAY_SIZE(pahu_codec_reg_defaults); i++) - regmap_update_bits(wcd9xxx->regmap, - pahu_codec_reg_defaults[i].reg, - pahu_codec_reg_defaults[i].mask, - pahu_codec_reg_defaults[i].val); -} - -static void pahu_update_cpr_defaults(struct pahu_priv *pahu) -{ - int i; - struct wcd9xxx *wcd9xxx; - - wcd9xxx = pahu->wcd9xxx; - - __pahu_cdc_mclk_enable(pahu, true); - - regmap_update_bits(wcd9xxx->regmap, WCD9360_CODEC_RPM_CLK_GATE, - 0x10, 0x00); - - for (i = 0; i < ARRAY_SIZE(cpr_defaults); i++) { - regmap_bulk_write(wcd9xxx->regmap, - WCD9360_CODEC_CPR_WR_DATA_0, - (u8 *)&cpr_defaults[i].wr_data, 4); - regmap_bulk_write(wcd9xxx->regmap, - WCD9360_CODEC_CPR_WR_ADDR_0, - (u8 *)&cpr_defaults[i].wr_addr, 4); - } - - __pahu_cdc_mclk_enable(pahu, false); -} - -static void pahu_slim_interface_init_reg(struct snd_soc_codec *codec) -{ - int i; - struct pahu_priv *priv = snd_soc_codec_get_drvdata(codec); - - for (i = 0; i < WCD9XXX_SLIM_NUM_PORT_REG; i++) - wcd9xxx_interface_reg_write(priv->wcd9xxx, - WCD9360_SLIM_PGD_PORT_INT_RX_EN0 + i, - 0xFF); -} - -static irqreturn_t pahu_misc_irq(int irq, void *data) -{ - struct pahu_priv *pahu = data; - int misc_val; - - /* Find source of interrupt */ - regmap_read(pahu->wcd9xxx->regmap, WCD9360_INTR_CODEC_MISC_STATUS, - &misc_val); - - dev_dbg(pahu->dev, "%s: Codec misc irq: %d, val: 0x%x\n", - __func__, irq, misc_val); - - /* Clear interrupt status */ - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_INTR_CODEC_MISC_CLEAR, misc_val, 0x00); - - return IRQ_HANDLED; -} - -static irqreturn_t pahu_slimbus_irq(int irq, void *data) -{ - struct pahu_priv *pahu = data; - unsigned long status = 0; - int i, j, port_id, k; - u32 bit; - u8 val, int_val = 0; - bool tx, cleared; - unsigned short reg = 0; - - for (i = WCD9360_SLIM_PGD_PORT_INT_STATUS_RX_0, j = 0; - i <= WCD9360_SLIM_PGD_PORT_INT_STATUS_TX_1; i++, j++) { - val = wcd9xxx_interface_reg_read(pahu->wcd9xxx, i); - status |= ((u32)val << (8 * j)); - } - - for_each_set_bit(j, &status, 32) { - tx = (j >= 16 ? true : false); - port_id = (tx ? j - 16 : j); - val = wcd9xxx_interface_reg_read(pahu->wcd9xxx, - WCD9360_SLIM_PGD_PORT_INT_RX_SOURCE0 + j); - if (val) { - if (!tx) - reg = WCD9360_SLIM_PGD_PORT_INT_RX_EN0 + - (port_id / 8); - else - reg = WCD9360_SLIM_PGD_PORT_INT_TX_EN0 + - (port_id / 8); - int_val = wcd9xxx_interface_reg_read( - pahu->wcd9xxx, reg); - /* - * Ignore interrupts for ports for which the - * interrupts are not specifically enabled. - */ - if (!(int_val & (1 << (port_id % 8)))) - continue; - } - if (val & WCD9360_SLIM_IRQ_OVERFLOW) - dev_err_ratelimited(pahu->dev, "%s: overflow error on %s port %d, value %x\n", - __func__, (tx ? "TX" : "RX"), port_id, val); - if (val & WCD9360_SLIM_IRQ_UNDERFLOW) - dev_err_ratelimited(pahu->dev, "%s: underflow error on %s port %d, value %x\n", - __func__, (tx ? "TX" : "RX"), port_id, val); - if ((val & WCD9360_SLIM_IRQ_OVERFLOW) || - (val & WCD9360_SLIM_IRQ_UNDERFLOW)) { - if (!tx) - reg = WCD9360_SLIM_PGD_PORT_INT_RX_EN0 + - (port_id / 8); - else - reg = WCD9360_SLIM_PGD_PORT_INT_TX_EN0 + - (port_id / 8); - int_val = wcd9xxx_interface_reg_read( - pahu->wcd9xxx, reg); - if (int_val & (1 << (port_id % 8))) { - int_val = int_val ^ (1 << (port_id % 8)); - wcd9xxx_interface_reg_write(pahu->wcd9xxx, - reg, int_val); - } - } - if (val & WCD9360_SLIM_IRQ_PORT_CLOSED) { - /* - * INT SOURCE register starts from RX to TX - * but port number in the ch_mask is in opposite way - */ - bit = (tx ? j - 16 : j + 16); - dev_dbg(pahu->dev, "%s: %s port %d closed value %x, bit %u\n", - __func__, (tx ? "TX" : "RX"), port_id, val, - bit); - for (k = 0, cleared = false; k < NUM_CODEC_DAIS; k++) { - dev_dbg(pahu->dev, "%s: pahu->dai[%d].ch_mask = 0x%lx\n", - __func__, k, pahu->dai[k].ch_mask); - if (test_and_clear_bit(bit, - &pahu->dai[k].ch_mask)) { - cleared = true; - if (!pahu->dai[k].ch_mask) - wake_up( - &pahu->dai[k].dai_wait); - /* - * There are cases when multiple DAIs - * might be using the same slimbus - * channel. Hence don't break here. - */ - } - } - } - wcd9xxx_interface_reg_write(pahu->wcd9xxx, - WCD9360_SLIM_PGD_PORT_INT_CLR_RX_0 + - (j / 8), - 1 << (j % 8)); - } - - return IRQ_HANDLED; -} - -static int pahu_setup_irqs(struct pahu_priv *pahu) -{ - int ret = 0; - struct snd_soc_codec *codec = pahu->codec; - struct wcd9xxx *wcd9xxx = pahu->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - ret = wcd9xxx_request_irq(core_res, WCD9XXX_IRQ_SLIMBUS, - pahu_slimbus_irq, "SLIMBUS Slave", pahu); - if (ret) - dev_err(codec->dev, "%s: Failed to request irq %d\n", __func__, - WCD9XXX_IRQ_SLIMBUS); - else - pahu_slim_interface_init_reg(codec); - - /* Register for misc interrupts as well */ - ret = wcd9xxx_request_irq(core_res, WCD9360_IRQ_MISC, - pahu_misc_irq, "CDC MISC Irq", pahu); - if (ret) - dev_err(codec->dev, "%s: Failed to request cdc misc irq\n", - __func__); - - return ret; -} - -static void pahu_init_slim_slave_cfg(struct snd_soc_codec *codec) -{ - struct pahu_priv *priv = snd_soc_codec_get_drvdata(codec); - struct afe_param_cdc_slimbus_slave_cfg *cfg; - struct wcd9xxx *wcd9xxx = priv->wcd9xxx; - uint64_t eaddr = 0; - - cfg = &priv->slimbus_slave_cfg; - cfg->minor_version = 1; - cfg->tx_slave_port_offset = 0; - cfg->rx_slave_port_offset = 16; - - memcpy(&eaddr, &wcd9xxx->slim->e_addr, sizeof(wcd9xxx->slim->e_addr)); - WARN_ON(sizeof(wcd9xxx->slim->e_addr) != 6); - cfg->device_enum_addr_lsw = eaddr & 0xFFFFFFFF; - cfg->device_enum_addr_msw = eaddr >> 32; - - dev_dbg(codec->dev, "%s: slimbus logical address 0x%llx\n", - __func__, eaddr); -} - -static void pahu_cleanup_irqs(struct pahu_priv *pahu) -{ - struct wcd9xxx *wcd9xxx = pahu->wcd9xxx; - struct wcd9xxx_core_resource *core_res = - &wcd9xxx->core_res; - - wcd9xxx_free_irq(core_res, WCD9XXX_IRQ_SLIMBUS, pahu); - wcd9xxx_free_irq(core_res, WCD9360_IRQ_MISC, pahu); -} - -/* - * wcd9360_get_micb_vout_ctl_val: converts micbias from volts to register value - * @micb_mv: micbias in mv - * - * return register value converted - */ -int wcd9360_get_micb_vout_ctl_val(u32 micb_mv) -{ - /* min micbias voltage is 1V and maximum is 2.85V */ - if (micb_mv < 1000 || micb_mv > 2850) { - pr_err("%s: unsupported micbias voltage\n", __func__); - return -EINVAL; - } - - return (micb_mv - 1000) / 50; -} -EXPORT_SYMBOL(wcd9360_get_micb_vout_ctl_val); - -static int pahu_handle_pdata(struct pahu_priv *pahu, - struct wcd9xxx_pdata *pdata) -{ - struct snd_soc_codec *codec = pahu->codec; - u8 mad_dmic_ctl_val; - u8 anc_ctl_value; - u32 dmic_clk_drv; - int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; - int rc = 0; - - if (!pdata) { - dev_err(codec->dev, "%s: NULL pdata\n", __func__); - return -ENODEV; - } - - /* set micbias voltage */ - vout_ctl_1 = wcd9360_get_micb_vout_ctl_val(pdata->micbias.micb1_mv); - vout_ctl_2 = wcd9360_get_micb_vout_ctl_val(pdata->micbias.micb2_mv); - vout_ctl_3 = wcd9360_get_micb_vout_ctl_val(pdata->micbias.micb3_mv); - vout_ctl_4 = wcd9360_get_micb_vout_ctl_val(pdata->micbias.micb4_mv); - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || - vout_ctl_3 < 0 || vout_ctl_4 < 0) { - rc = -EINVAL; - goto done; - } - snd_soc_update_bits(codec, WCD9360_ANA_MICB1, 0x3F, vout_ctl_1); - snd_soc_update_bits(codec, WCD9360_ANA_MICB2, 0x3F, vout_ctl_2); - snd_soc_update_bits(codec, WCD9360_ANA_MICB3, 0x3F, vout_ctl_3); - snd_soc_update_bits(codec, WCD9360_ANA_MICB4, 0x3F, vout_ctl_4); - - if (pdata->dmic_sample_rate == - WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED) { - dev_info(codec->dev, "%s: dmic_rate invalid default = %d\n", - __func__, WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ); - pdata->dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ; - } - if (pdata->mad_dmic_sample_rate == - WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED) { - dev_info(codec->dev, "%s: mad_dmic_rate invalid default = %d\n", - __func__, WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ); - /* - * use dmic_sample_rate as the default for MAD - * if mad dmic sample rate is undefined - */ - pdata->mad_dmic_sample_rate = pdata->dmic_sample_rate; - } - - if (pdata->dmic_clk_drv == - WCD9XXX_DMIC_CLK_DRIVE_UNDEFINED) { - pdata->dmic_clk_drv = WCD9360_DMIC_CLK_DRIVE_DEFAULT; - dev_dbg(codec->dev, - "%s: dmic_clk_strength invalid, default = %d\n", - __func__, pdata->dmic_clk_drv); - } - - switch (pdata->dmic_clk_drv) { - case 2: - dmic_clk_drv = 0; - break; - case 4: - dmic_clk_drv = 1; - break; - case 8: - dmic_clk_drv = 2; - break; - case 16: - dmic_clk_drv = 3; - break; - default: - dev_err(codec->dev, - "%s: invalid dmic_clk_drv %d, using default\n", - __func__, pdata->dmic_clk_drv); - dmic_clk_drv = 0; - break; - } - - snd_soc_update_bits(codec, WCD9360_TEST_DEBUG_PAD_DRVCTL_0, - 0x0C, dmic_clk_drv << 2); - - /* - * Default the DMIC clk rates to mad_dmic_sample_rate, - * whereas, the anc/txfe dmic rates to dmic_sample_rate - * since the anc/txfe are independent of mad block. - */ - mad_dmic_ctl_val = pahu_get_dmic_clk_val(pahu->codec, - pdata->mad_dmic_sample_rate); - snd_soc_update_bits(codec, WCD9360_CPE_SS_DMIC0_CTL, - 0x0E, mad_dmic_ctl_val << 1); - snd_soc_update_bits(codec, WCD9360_CPE_SS_DMIC1_CTL, - 0x0E, mad_dmic_ctl_val << 1); - snd_soc_update_bits(codec, WCD9360_CPE_SS_DMIC2_CTL, - 0x0E, mad_dmic_ctl_val << 1); - - if (dmic_clk_drv == WCD9360_DMIC_CLK_DIV_2) - anc_ctl_value = WCD9360_ANC_DMIC_X2_FULL_RATE; - else - anc_ctl_value = WCD9360_ANC_DMIC_X2_HALF_RATE; - - snd_soc_update_bits(codec, WCD9360_CDC_ANC0_MODE_2_CTL, - 0x40, anc_ctl_value << 6); - snd_soc_update_bits(codec, WCD9360_CDC_ANC0_MODE_2_CTL, - 0x20, anc_ctl_value << 5); - -done: - return rc; -} - -static void pahu_cdc_vote_svs(struct snd_soc_codec *codec, bool vote) -{ - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - return pahu_vote_svs(pahu, vote); -} - -static struct wcd_dsp_cdc_cb cdc_cb = { - .cdc_clk_en = pahu_codec_internal_rco_ctrl, - .cdc_vote_svs = pahu_cdc_vote_svs, -}; - -static int pahu_wdsp_initialize(struct snd_soc_codec *codec) -{ - struct wcd9xxx *control; - struct pahu_priv *pahu; - struct wcd_dsp_params params; - int ret = 0; - - control = dev_get_drvdata(codec->dev->parent); - pahu = snd_soc_codec_get_drvdata(codec); - - params.cb = &cdc_cb; - params.irqs.cpe_ipc1_irq = WCD9360_IRQ_CPE1_INTR; - params.irqs.cpe_err_irq = WCD9360_IRQ_CPE_ERROR; - params.irqs.fatal_irqs = CPE_FATAL_IRQS; - params.clk_rate = control->mclk_rate; - params.dsp_instance = 0; - - wcd9360_dsp_cntl_init(codec, ¶ms, &pahu->wdsp_cntl); - if (!pahu->wdsp_cntl) { - dev_err(pahu->dev, "%s: wcd-dsp-control init failed\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -static void pahu_mclk2_reg_defaults(struct pahu_priv *pahu) -{ - int i; - struct snd_soc_codec *codec = pahu->codec; - - /* MCLK2 configuration */ - for (i = 0; i < ARRAY_SIZE(pahu_codec_mclk2_1_0_defaults); i++) - snd_soc_update_bits(codec, - pahu_codec_mclk2_1_0_defaults[i].reg, - pahu_codec_mclk2_1_0_defaults[i].mask, - pahu_codec_mclk2_1_0_defaults[i].val); -} - -static int pahu_device_down(struct wcd9xxx *wcd9xxx) -{ - struct snd_soc_codec *codec; - struct pahu_priv *priv; - int count; - - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - priv = snd_soc_codec_get_drvdata(codec); - if (priv->swr.ctrl_data) - swrm_wcd_notify(priv->swr.ctrl_data[0].swr_pdev, - SWR_DEVICE_DOWN, NULL); - snd_soc_card_change_online_state(codec->component.card, 0); - for (count = 0; count < NUM_CODEC_DAIS; count++) - priv->dai[count].bus_down_in_recovery = true; - wcd9360_dsp_ssr_event(priv->wdsp_cntl, WCD_CDC_DOWN_EVENT); - wcd_resmgr_set_sido_input_src_locked(priv->resmgr, - SIDO_SOURCE_INTERNAL); - - return 0; -} - -static int pahu_post_reset_cb(struct wcd9xxx *wcd9xxx) -{ - int i, ret = 0; - struct wcd9xxx *control; - struct snd_soc_codec *codec; - struct pahu_priv *pahu; - struct wcd9xxx_pdata *pdata; - - codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv); - pahu = snd_soc_codec_get_drvdata(codec); - control = dev_get_drvdata(codec->dev->parent); - - wcd9xxx_set_power_state(pahu->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - - mutex_lock(&pahu->codec_mutex); - - pahu_vote_svs(pahu, true); - pahu_slimbus_slave_port_cfg.slave_dev_intfdev_la = - control->slim_slave->laddr; - pahu_slimbus_slave_port_cfg.slave_dev_pgd_la = - control->slim->laddr; - pahu_init_slim_slave_cfg(codec); - snd_soc_card_change_online_state(codec->component.card, 1); - - for (i = 0; i < PAHU_MAX_MICBIAS; i++) - pahu->micb_ref[i] = 0; - - dev_dbg(codec->dev, "%s: MCLK Rate = %x\n", - __func__, control->mclk_rate); - - pahu_update_reg_defaults(pahu); - wcd_resmgr_post_ssr_v2(pahu->resmgr); - __pahu_enable_efuse_sensing(pahu); - pahu_mclk2_reg_defaults(pahu); - - __pahu_cdc_mclk_enable(pahu, true); - regcache_mark_dirty(codec->component.regmap); - regcache_sync(codec->component.regmap); - __pahu_cdc_mclk_enable(pahu, false); - - pahu_update_cpr_defaults(pahu); - - pdata = dev_get_platdata(codec->dev->parent); - ret = pahu_handle_pdata(pahu, pdata); - if (ret < 0) - dev_err(codec->dev, "%s: invalid pdata\n", __func__); - - pahu_cleanup_irqs(pahu); - ret = pahu_setup_irqs(pahu); - if (ret) { - dev_err(codec->dev, "%s: pahu irq setup failed %d\n", - __func__, ret); - goto done; - } - - pahu_set_spkr_mode(codec, pahu->swr.spkr_mode); - /* - * Once the codec initialization is completed, the svs vote - * can be released allowing the codec to go to SVS2. - */ - pahu_vote_svs(pahu, false); - wcd9360_dsp_ssr_event(pahu->wdsp_cntl, WCD_CDC_UP_EVENT); - -done: - mutex_unlock(&pahu->codec_mutex); - return ret; -} - -static int pahu_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct wcd9xxx *control; - struct pahu_priv *pahu; - struct wcd9xxx_pdata *pdata; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int i, ret; - void *ptr = NULL; - - control = dev_get_drvdata(codec->dev->parent); - - dev_info(codec->dev, "%s()\n", __func__); - pahu = snd_soc_codec_get_drvdata(codec); - pahu->intf_type = wcd9xxx_get_intf_type(); - - control->dev_down = pahu_device_down; - control->post_reset = pahu_post_reset_cb; - control->ssr_priv = (void *)codec; - - /* Resource Manager post Init */ - ret = wcd_resmgr_post_init(pahu->resmgr, &pahu_resmgr_cb, codec); - if (ret) { - dev_err(codec->dev, "%s: wcd resmgr post init failed\n", - __func__); - goto err; - } - - pahu->fw_data = devm_kzalloc(codec->dev, sizeof(*(pahu->fw_data)), - GFP_KERNEL); - if (!pahu->fw_data) - goto err; - - set_bit(WCD9XXX_ANC_CAL, pahu->fw_data->cal_bit); - set_bit(WCD9XXX_MAD_CAL, pahu->fw_data->cal_bit); - - ret = wcd_cal_create_hwdep(pahu->fw_data, - WCD9XXX_CODEC_HWDEP_NODE, codec); - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - goto err_hwdep; - } - - pahu->codec = codec; - for (i = 0; i < COMPANDER_MAX; i++) - pahu->comp_enabled[i] = 0; - - pdata = dev_get_platdata(codec->dev->parent); - ret = pahu_handle_pdata(pahu, pdata); - if (ret < 0) { - dev_err(codec->dev, "%s: bad pdata\n", __func__); - goto err_hwdep; - } - - ptr = devm_kzalloc(codec->dev, (sizeof(pahu_rx_chs) + - sizeof(pahu_tx_chs)), GFP_KERNEL); - if (!ptr) { - ret = -ENOMEM; - goto err_hwdep; - } - - snd_soc_dapm_add_routes(dapm, pahu_slim_audio_map, - ARRAY_SIZE(pahu_slim_audio_map)); - for (i = 0; i < NUM_CODEC_DAIS; i++) { - INIT_LIST_HEAD(&pahu->dai[i].wcd9xxx_ch_list); - init_waitqueue_head(&pahu->dai[i].dai_wait); - } - pahu_slimbus_slave_port_cfg.slave_dev_intfdev_la = - control->slim_slave->laddr; - pahu_slimbus_slave_port_cfg.slave_dev_pgd_la = - control->slim->laddr; - pahu_slimbus_slave_port_cfg.slave_port_mapping[0] = - WCD9360_TX13; - pahu_init_slim_slave_cfg(codec); - - control->num_rx_port = WCD9360_RX_MAX; - control->rx_chs = ptr; - memcpy(control->rx_chs, pahu_rx_chs, sizeof(pahu_rx_chs)); - control->num_tx_port = WCD9360_TX_MAX; - control->tx_chs = ptr + sizeof(pahu_rx_chs); - memcpy(control->tx_chs, pahu_tx_chs, sizeof(pahu_tx_chs)); - - ret = pahu_setup_irqs(pahu); - if (ret) { - dev_err(pahu->dev, "%s: pahu irq setup failed %d\n", - __func__, ret); - goto err_pdata; - } - - for (i = 0; i < WCD9360_NUM_DECIMATORS; i++) { - pahu->tx_hpf_work[i].pahu = pahu; - pahu->tx_hpf_work[i].decimator = i; - INIT_DELAYED_WORK(&pahu->tx_hpf_work[i].dwork, - pahu_tx_hpf_corner_freq_callback); - - pahu->tx_mute_dwork[i].pahu = pahu; - pahu->tx_mute_dwork[i].decimator = i; - INIT_DELAYED_WORK(&pahu->tx_mute_dwork[i].dwork, - pahu_tx_mute_update_callback); - } - - pahu->spk_anc_dwork.pahu = pahu; - INIT_DELAYED_WORK(&pahu->spk_anc_dwork.dwork, - pahu_spk_anc_update_callback); - - pahu_mclk2_reg_defaults(pahu); - - mutex_lock(&pahu->codec_mutex); - snd_soc_dapm_disable_pin(dapm, "ANC EAR PA"); - snd_soc_dapm_disable_pin(dapm, "ANC EAR"); - snd_soc_dapm_enable_pin(dapm, "ANC SPK1 PA"); - mutex_unlock(&pahu->codec_mutex); - - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF1 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "AIF2 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF2 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "AIF3 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF3 Capture"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 MAD TX"); - snd_soc_dapm_ignore_suspend(dapm, "VIfeed"); - snd_soc_dapm_ignore_suspend(dapm, "I2S1 Playback"); - snd_soc_dapm_ignore_suspend(dapm, "I2S1 Capture"); - - snd_soc_dapm_sync(dapm); - - pahu_wdsp_initialize(codec); - - /* - * Once the codec initialization is completed, the svs vote - * can be released allowing the codec to go to SVS2. - */ - pahu_vote_svs(pahu, false); - - return ret; - -err_pdata: - devm_kfree(codec->dev, ptr); - control->rx_chs = NULL; - control->tx_chs = NULL; -err_hwdep: - devm_kfree(codec->dev, pahu->fw_data); - pahu->fw_data = NULL; -err: - return ret; -} - -static int pahu_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct wcd9xxx *control; - struct pahu_priv *pahu = snd_soc_codec_get_drvdata(codec); - - control = dev_get_drvdata(codec->dev->parent); - devm_kfree(codec->dev, control->rx_chs); - /* slimslave deinit in wcd core looks for this value */ - control->num_rx_port = 0; - control->num_tx_port = 0; - control->rx_chs = NULL; - control->tx_chs = NULL; - pahu_cleanup_irqs(pahu); - - if (pahu->wdsp_cntl) - wcd9360_dsp_cntl_deinit(&pahu->wdsp_cntl); - - return 0; -} - -static struct regmap *pahu_get_regmap(struct device *dev) -{ - struct wcd9xxx *control = dev_get_drvdata(dev->parent); - - return control->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_pahu = { - .probe = pahu_soc_codec_probe, - .remove = pahu_soc_codec_remove, - .get_regmap = pahu_get_regmap, - .component_driver = { - .controls = pahu_snd_controls, - .num_controls = ARRAY_SIZE(pahu_snd_controls), - .dapm_widgets = pahu_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pahu_dapm_widgets), - .dapm_routes = pahu_audio_map, - .num_dapm_routes = ARRAY_SIZE(pahu_audio_map), - }, -}; - -#ifdef CONFIG_PM -static int pahu_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct pahu_priv *pahu = platform_get_drvdata(pdev); - - if (!pahu) { - dev_err(dev, "%s: pahu private data is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(dev, "%s: system suspend\n", __func__); - if (delayed_work_pending(&pahu->power_gate_work) && - cancel_delayed_work_sync(&pahu->power_gate_work)) - pahu_codec_power_gate_digital_core(pahu); - return 0; -} - -static int pahu_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct pahu_priv *pahu = platform_get_drvdata(pdev); - - if (!pahu) { - dev_err(dev, "%s: pahu private data is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(dev, "%s: system resume\n", __func__); - return 0; -} - -static const struct dev_pm_ops pahu_pm_ops = { - .suspend = pahu_suspend, - .resume = pahu_resume, -}; -#endif - -static int pahu_swrm_read(void *handle, int reg) -{ - struct pahu_priv *pahu; - struct wcd9xxx *wcd9xxx; - unsigned short swr_rd_addr_base; - unsigned short swr_rd_data_base; - int val, ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - pahu = (struct pahu_priv *)handle; - wcd9xxx = pahu->wcd9xxx; - - dev_dbg(pahu->dev, "%s: Reading soundwire register, 0x%x\n", - __func__, reg); - swr_rd_addr_base = WCD9360_SWR_AHB_BRIDGE_RD_ADDR_0; - swr_rd_data_base = WCD9360_SWR_AHB_BRIDGE_RD_DATA_0; - - mutex_lock(&pahu->swr.read_mutex); - ret = regmap_bulk_write(wcd9xxx->regmap, swr_rd_addr_base, - (u8 *)®, 4); - if (ret < 0) { - dev_err(pahu->dev, "%s: RD Addr Failure\n", __func__); - goto done; - } - ret = regmap_bulk_read(wcd9xxx->regmap, swr_rd_data_base, - (u8 *)&val, 4); - if (ret < 0) { - dev_err(pahu->dev, "%s: RD Data Failure\n", __func__); - goto done; - } - ret = val; -done: - mutex_unlock(&pahu->swr.read_mutex); - - return ret; -} - -static int pahu_swrm_bulk_write(void *handle, u32 *reg, u32 *val, size_t len) -{ - struct pahu_priv *pahu; - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_reg_val *bulk_reg; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - int i, j, ret; - - if (!handle || !reg || !val) { - pr_err("%s: NULL parameter\n", __func__); - return -EINVAL; - } - if (len <= 0) { - pr_err("%s: Invalid size: %zu\n", __func__, len); - return -EINVAL; - } - pahu = (struct pahu_priv *)handle; - wcd9xxx = pahu->wcd9xxx; - - swr_wr_addr_base = WCD9360_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD9360_SWR_AHB_BRIDGE_WR_DATA_0; - - bulk_reg = kzalloc((2 * len * sizeof(struct wcd9xxx_reg_val)), - GFP_KERNEL); - if (!bulk_reg) - return -ENOMEM; - - for (i = 0, j = 0; i < (len * 2); i += 2, j++) { - bulk_reg[i].reg = swr_wr_data_base; - bulk_reg[i].buf = (u8 *)(&val[j]); - bulk_reg[i].bytes = 4; - bulk_reg[i+1].reg = swr_wr_addr_base; - bulk_reg[i+1].buf = (u8 *)(®[j]); - bulk_reg[i+1].bytes = 4; - } - - mutex_lock(&pahu->swr.write_mutex); - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, - (len * 2), false); - if (ret) { - dev_err(pahu->dev, "%s: swrm bulk write failed, ret: %d\n", - __func__, ret); - } - mutex_unlock(&pahu->swr.write_mutex); - - kfree(bulk_reg); - return ret; -} - -static int pahu_swrm_write(void *handle, int reg, int val) -{ - struct pahu_priv *pahu; - struct wcd9xxx *wcd9xxx; - unsigned short swr_wr_addr_base; - unsigned short swr_wr_data_base; - struct wcd9xxx_reg_val bulk_reg[2]; - int ret; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - pahu = (struct pahu_priv *)handle; - wcd9xxx = pahu->wcd9xxx; - - swr_wr_addr_base = WCD9360_SWR_AHB_BRIDGE_WR_ADDR_0; - swr_wr_data_base = WCD9360_SWR_AHB_BRIDGE_WR_DATA_0; - - /* First Write the Data to register */ - bulk_reg[0].reg = swr_wr_data_base; - bulk_reg[0].buf = (u8 *)(&val); - bulk_reg[0].bytes = 4; - bulk_reg[1].reg = swr_wr_addr_base; - bulk_reg[1].buf = (u8 *)(®); - bulk_reg[1].bytes = 4; - - mutex_lock(&pahu->swr.write_mutex); - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, 2, false); - if (ret < 0) - dev_err(pahu->dev, "%s: WR Data Failure\n", __func__); - mutex_unlock(&pahu->swr.write_mutex); - - return ret; -} - -static int pahu_swrm_clock(void *handle, bool enable) -{ - struct pahu_priv *pahu; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - pahu = (struct pahu_priv *)handle; - - mutex_lock(&pahu->swr.clk_mutex); - dev_dbg(pahu->dev, "%s: swrm clock %s\n", - __func__, (enable?"enable" : "disable")); - if (enable) { - pahu->swr.clk_users++; - if (pahu->swr.clk_users == 1) { - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_TEST_DEBUG_NPL_DLY_TEST_1, - 0x10, 0x00); - __pahu_cdc_mclk_enable(pahu, true); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CDC_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x01); - } - } else { - pahu->swr.clk_users--; - if (pahu->swr.clk_users == 0) { - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CDC_CLK_RST_CTRL_SWR_CONTROL, - 0x01, 0x00); - __pahu_cdc_mclk_enable(pahu, false); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_TEST_DEBUG_NPL_DLY_TEST_1, - 0x10, 0x10); - } - } - dev_dbg(pahu->dev, "%s: swrm clock users %d\n", - __func__, pahu->swr.clk_users); - mutex_unlock(&pahu->swr.clk_mutex); - - return 0; -} - -static int pahu_swrm_handle_irq(void *handle, - irqreturn_t (*swrm_irq_handler)(int irq, - void *data), - void *swrm_handle, - int action) -{ - struct pahu_priv *pahu; - int ret = 0; - struct wcd9xxx *wcd9xxx; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - pahu = (struct pahu_priv *) handle; - wcd9xxx = pahu->wcd9xxx; - - if (action) { - ret = wcd9xxx_request_irq(&wcd9xxx->core_res, - WCD9360_IRQ_SOUNDWIRE, - swrm_irq_handler, - "Pahu SWR Master", swrm_handle); - if (ret) - dev_err(pahu->dev, "%s: Failed to request irq %d\n", - __func__, WCD9360_IRQ_SOUNDWIRE); - } else - wcd9xxx_free_irq(&wcd9xxx->core_res, WCD9360_IRQ_SOUNDWIRE, - swrm_handle); - - return ret; -} - -static void pahu_codec_add_spi_device(struct pahu_priv *pahu, - struct device_node *node) -{ - struct spi_master *master; - struct spi_device *spi; - u32 prop_value; - int rc; - - /* Read the master bus num from DT node */ - rc = of_property_read_u32(node, "qcom,master-bus-num", - &prop_value); - if (rc < 0) { - dev_err(pahu->dev, "%s: prop %s not found in node %s", - __func__, "qcom,master-bus-num", node->full_name); - goto done; - } - - /* Get the reference to SPI master */ - master = spi_busnum_to_master(prop_value); - if (!master) { - dev_err(pahu->dev, "%s: Invalid spi_master for bus_num %u\n", - __func__, prop_value); - goto done; - } - - /* Allocate the spi device */ - spi = spi_alloc_device(master); - if (!spi) { - dev_err(pahu->dev, "%s: spi_alloc_device failed\n", - __func__); - goto err_spi_alloc_dev; - } - - /* Initialize device properties */ - if (of_modalias_node(node, spi->modalias, - sizeof(spi->modalias)) < 0) { - dev_err(pahu->dev, "%s: cannot find modalias for %s\n", - __func__, node->full_name); - goto err_dt_parse; - } - - rc = of_property_read_u32(node, "qcom,chip-select", - &prop_value); - if (rc < 0) { - dev_err(pahu->dev, "%s: prop %s not found in node %s", - __func__, "qcom,chip-select", node->full_name); - goto err_dt_parse; - } - spi->chip_select = prop_value; - - rc = of_property_read_u32(node, "qcom,max-frequency", - &prop_value); - if (rc < 0) { - dev_err(pahu->dev, "%s: prop %s not found in node %s", - __func__, "qcom,max-frequency", node->full_name); - goto err_dt_parse; - } - spi->max_speed_hz = prop_value; - - spi->dev.of_node = node; - - rc = spi_add_device(spi); - if (rc < 0) { - dev_err(pahu->dev, "%s: spi_add_device failed\n", __func__); - goto err_dt_parse; - } - - pahu->spi = spi; - /* Put the reference to SPI master */ - put_device(&master->dev); - - return; - -err_dt_parse: - spi_dev_put(spi); - -err_spi_alloc_dev: - /* Put the reference to SPI master */ - put_device(&master->dev); -done: - return; -} - -static void pahu_add_child_devices(struct work_struct *work) -{ - struct pahu_priv *pahu; - struct platform_device *pdev; - struct device_node *node; - struct wcd9xxx *wcd9xxx; - struct pahu_swr_ctrl_data *swr_ctrl_data = NULL, *temp; - int ret, ctrl_num = 0; - struct wcd_swr_ctrl_platform_data *platdata; - char plat_dev_name[WCD9360_STRING_LEN]; - - pahu = container_of(work, struct pahu_priv, - pahu_add_child_devices_work); - if (!pahu) { - pr_err("%s: Memory for wcd9360 does not exist\n", - __func__); - return; - } - wcd9xxx = pahu->wcd9xxx; - if (!wcd9xxx) { - pr_err("%s: Memory for WCD9XXX does not exist\n", - __func__); - return; - } - if (!wcd9xxx->dev->of_node) { - dev_err(wcd9xxx->dev, "%s: DT node for wcd9xxx does not exist\n", - __func__); - return; - } - - platdata = &pahu->swr.plat_data; - pahu->child_count = 0; - - for_each_child_of_node(wcd9xxx->dev->of_node, node) { - - /* Parse and add the SPI device node */ - if (!strcmp(node->name, "wcd_spi")) { - pahu_codec_add_spi_device(pahu, node); - continue; - } - - /* Parse other child device nodes and add platform device */ - if (!strcmp(node->name, "swr_master")) - strlcpy(plat_dev_name, "pahu_swr_ctrl", - (WCD9360_STRING_LEN - 1)); - else if (strnstr(node->name, "msm_cdc_pinctrl", - strlen("msm_cdc_pinctrl")) != NULL) - strlcpy(plat_dev_name, node->name, - (WCD9360_STRING_LEN - 1)); - else - continue; - - pdev = platform_device_alloc(plat_dev_name, -1); - if (!pdev) { - dev_err(wcd9xxx->dev, "%s: pdev memory alloc failed\n", - __func__); - ret = -ENOMEM; - goto err_mem; - } - pdev->dev.parent = pahu->dev; - pdev->dev.of_node = node; - - if (strcmp(node->name, "swr_master") == 0) { - ret = platform_device_add_data(pdev, platdata, - sizeof(*platdata)); - if (ret) { - dev_err(&pdev->dev, - "%s: cannot add plat data ctrl:%d\n", - __func__, ctrl_num); - goto err_pdev_add; - } - } - - ret = platform_device_add(pdev); - if (ret) { - dev_err(&pdev->dev, - "%s: Cannot add platform device\n", - __func__); - goto err_pdev_add; - } - - if (strcmp(node->name, "swr_master") == 0) { - temp = krealloc(swr_ctrl_data, - (ctrl_num + 1) * sizeof( - struct pahu_swr_ctrl_data), - GFP_KERNEL); - if (!temp) { - dev_err(wcd9xxx->dev, "out of memory\n"); - ret = -ENOMEM; - goto err_pdev_add; - } - swr_ctrl_data = temp; - swr_ctrl_data[ctrl_num].swr_pdev = pdev; - ctrl_num++; - dev_dbg(&pdev->dev, - "%s: Added soundwire ctrl device(s)\n", - __func__); - pahu->swr.ctrl_data = swr_ctrl_data; - } - if (pahu->child_count < WCD9360_CHILD_DEVICES_MAX) - pahu->pdev_child_devices[pahu->child_count++] = pdev; - else - goto err_mem; - } - - return; - -err_pdev_add: - platform_device_put(pdev); -err_mem: - return; -} - -static int __pahu_enable_efuse_sensing(struct pahu_priv *pahu) -{ - int val, rc; - - WCD9XXX_V2_BG_CLK_LOCK(pahu->resmgr); - __pahu_cdc_mclk_enable_locked(pahu, true); - - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CHIP_TIER_CTRL_EFUSE_CTL, 0x1E, 0x10); - regmap_update_bits(pahu->wcd9xxx->regmap, - WCD9360_CHIP_TIER_CTRL_EFUSE_CTL, 0x01, 0x01); - /* - * 5ms sleep required after enabling efuse control - * before checking the status. - */ - usleep_range(5000, 5500); - wcd_resmgr_set_sido_input_src(pahu->resmgr, - SIDO_SOURCE_RCO_BG); - - WCD9XXX_V2_BG_CLK_UNLOCK(pahu->resmgr); - - rc = regmap_read(pahu->wcd9xxx->regmap, - WCD9360_CHIP_TIER_CTRL_EFUSE_STATUS, &val); - if (rc || (!(val & 0x01))) - WARN(1, "%s: Efuse sense is not complete val=%x, ret=%d\n", - __func__, val, rc); - - __pahu_cdc_mclk_enable(pahu, false); - - return rc; -} - -/* - * pahu_get_wcd_dsp_cntl: Get the reference to wcd_dsp_cntl - * @dev: Device pointer for codec device - * - * This API gets the reference to codec's struct wcd_dsp_cntl - */ -void *pahu_get_wcd_dsp_cntl(struct device *dev) -{ - struct platform_device *pdev; - struct pahu_priv *pahu; - - if (!dev) { - pr_err("%s: Invalid device\n", __func__); - return NULL; - } - - pdev = to_platform_device(dev); - pahu = platform_get_drvdata(pdev); - - return pahu->wdsp_cntl; -} -EXPORT_SYMBOL(pahu_get_wcd_dsp_cntl); - -static int pahu_probe(struct platform_device *pdev) -{ - int ret = 0; - struct pahu_priv *pahu; - struct clk *wcd_ext_clk; - struct wcd9xxx_resmgr_v2 *resmgr; - struct wcd9xxx_power_region *cdc_pwr; - - pahu = devm_kzalloc(&pdev->dev, sizeof(struct pahu_priv), - GFP_KERNEL); - if (!pahu) - return -ENOMEM; - - platform_set_drvdata(pdev, pahu); - - pahu->wcd9xxx = dev_get_drvdata(pdev->dev.parent); - pahu->dev = &pdev->dev; - INIT_DELAYED_WORK(&pahu->power_gate_work, pahu_codec_power_gate_work); - mutex_init(&pahu->power_lock); - INIT_WORK(&pahu->pahu_add_child_devices_work, - pahu_add_child_devices); - mutex_init(&pahu->micb_lock); - mutex_init(&pahu->swr.read_mutex); - mutex_init(&pahu->swr.write_mutex); - mutex_init(&pahu->swr.clk_mutex); - mutex_init(&pahu->codec_mutex); - mutex_init(&pahu->svs_mutex); - - /* - * Codec hardware by default comes up in SVS mode. - * Initialize the svs_ref_cnt to 1 to reflect the hardware - * state in the driver. - */ - pahu->svs_ref_cnt = 1; - - cdc_pwr = devm_kzalloc(&pdev->dev, sizeof(struct wcd9xxx_power_region), - GFP_KERNEL); - if (!cdc_pwr) { - ret = -ENOMEM; - goto err_resmgr; - } - pahu->wcd9xxx->wcd9xxx_pwr[WCD9XXX_DIG_CORE_REGION_1] = cdc_pwr; - cdc_pwr->pwr_collapse_reg_min = WCD9360_DIG_CORE_REG_MIN; - cdc_pwr->pwr_collapse_reg_max = WCD9360_DIG_CORE_REG_MAX; - wcd9xxx_set_power_state(pahu->wcd9xxx, - WCD_REGION_POWER_COLLAPSE_REMOVE, - WCD9XXX_DIG_CORE_REGION_1); - /* - * Init resource manager so that if child nodes such as SoundWire - * requests for clock, resource manager can honor the request - */ - resmgr = wcd_resmgr_init(&pahu->wcd9xxx->core_res, NULL); - if (IS_ERR(resmgr)) { - ret = PTR_ERR(resmgr); - dev_err(&pdev->dev, "%s: Failed to initialize wcd resmgr\n", - __func__); - goto err_resmgr; - } - pahu->resmgr = resmgr; - pahu->swr.plat_data.handle = (void *) pahu; - pahu->swr.plat_data.read = pahu_swrm_read; - pahu->swr.plat_data.write = pahu_swrm_write; - pahu->swr.plat_data.bulk_write = pahu_swrm_bulk_write; - pahu->swr.plat_data.clk = pahu_swrm_clock; - pahu->swr.plat_data.handle_irq = pahu_swrm_handle_irq; - pahu->swr.spkr_gain_offset = WCD9360_RX_GAIN_OFFSET_0_DB; - - /* Register for Clock */ - wcd_ext_clk = clk_get(pahu->wcd9xxx->dev, "wcd_clk"); - if (IS_ERR(wcd_ext_clk)) { - dev_err(pahu->wcd9xxx->dev, "%s: clk get %s failed\n", - __func__, "wcd_ext_clk"); - goto err_clk; - } - pahu->wcd_ext_clk = wcd_ext_clk; - dev_dbg(&pdev->dev, "%s: MCLK Rate = %x\n", __func__, - pahu->wcd9xxx->mclk_rate); - /* Probe defer if mlck is failed */ - ret = clk_prepare_enable(pahu->wcd_ext_clk); - if (ret) { - dev_dbg(pahu->dev, "%s: ext clk enable failed\n", - __func__); - ret = -EPROBE_DEFER; - goto err_cdc_reg; - } - clk_disable_unprepare(pahu->wcd_ext_clk); - - /* Update codec register default values */ - pahu_update_reg_defaults(pahu); - __pahu_enable_efuse_sensing(pahu); - pahu_update_cpr_defaults(pahu); - - /* Register with soc framework */ - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pahu, - pahu_dai, ARRAY_SIZE(pahu_dai)); - if (ret) { - dev_err(&pdev->dev, "%s: Codec registration failed\n", - __func__); - goto err_cdc_reg; - } - schedule_work(&pahu->pahu_add_child_devices_work); - - return ret; - -err_cdc_reg: - clk_put(pahu->wcd_ext_clk); -err_clk: - wcd_resmgr_remove(pahu->resmgr); -err_resmgr: - mutex_destroy(&pahu->micb_lock); - mutex_destroy(&pahu->svs_mutex); - mutex_destroy(&pahu->codec_mutex); - mutex_destroy(&pahu->swr.read_mutex); - mutex_destroy(&pahu->swr.write_mutex); - mutex_destroy(&pahu->swr.clk_mutex); - devm_kfree(&pdev->dev, pahu); - - return ret; -} - -static int pahu_remove(struct platform_device *pdev) -{ - struct pahu_priv *pahu; - int count = 0; - - pahu = platform_get_drvdata(pdev); - if (!pahu) - return -EINVAL; - - if (pahu->spi) - spi_unregister_device(pahu->spi); - for (count = 0; count < pahu->child_count && - count < WCD9360_CHILD_DEVICES_MAX; count++) - platform_device_unregister(pahu->pdev_child_devices[count]); - - mutex_destroy(&pahu->micb_lock); - mutex_destroy(&pahu->svs_mutex); - mutex_destroy(&pahu->codec_mutex); - mutex_destroy(&pahu->swr.read_mutex); - mutex_destroy(&pahu->swr.write_mutex); - mutex_destroy(&pahu->swr.clk_mutex); - - snd_soc_unregister_codec(&pdev->dev); - clk_put(pahu->wcd_ext_clk); - wcd_resmgr_remove(pahu->resmgr); - devm_kfree(&pdev->dev, pahu); - return 0; -} - -static struct platform_driver pahu_codec_driver = { - .probe = pahu_probe, - .remove = pahu_remove, - .driver = { - .name = "pahu_codec", - .owner = THIS_MODULE, -#ifdef CONFIG_PM - .pm = &pahu_pm_ops, -#endif - }, -}; - -module_platform_driver(pahu_codec_driver); - -MODULE_DESCRIPTION("Pahu Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9360/wcd9360.h b/techpack/audio/asoc/codecs/wcd9360/wcd9360.h deleted file mode 100644 index 04fb76d1a838..000000000000 --- a/techpack/audio/asoc/codecs/wcd9360/wcd9360.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD9360_H__ -#define __WCD9360_H__ - -#include -#include "../wcd9xxx-slimslave.h" -#include "../wcd9xxx-common-v2.h" - -#define WCD9360_REGISTER_START_OFFSET 0x800 -#define WCD9360_SB_PGD_PORT_RX_BASE 0x40 -#define WCD9360_SB_PGD_PORT_TX_BASE 0x50 -#define WCD9360_RX_PORT_START_NUMBER 16 - -#define WCD9360_DMIC_CLK_DIV_2 0x0 -#define WCD9360_DMIC_CLK_DIV_3 0x1 -#define WCD9360_DMIC_CLK_DIV_4 0x2 -#define WCD9360_DMIC_CLK_DIV_6 0x3 -#define WCD9360_DMIC_CLK_DIV_8 0x4 -#define WCD9360_DMIC_CLK_DIV_16 0x5 -#define WCD9360_DMIC_CLK_DRIVE_DEFAULT 0x02 - -#define WCD9360_ANC_DMIC_X2_FULL_RATE 1 -#define WCD9360_ANC_DMIC_X2_HALF_RATE 0 - -#define PAHU_MAX_MICBIAS 4 -#define PAHU_NUM_INTERPOLATORS 10 -#define MAX_ON_DEMAND_SUPPLY_NAME_LENGTH 64 - -/* Convert from vout ctl to micbias voltage in mV */ -#define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) - - -/* Number of input and output Slimbus port */ -enum { - WCD9360_RX0 = 0, - WCD9360_RX1, - WCD9360_RX2, - WCD9360_RX3, - WCD9360_RX4, - WCD9360_RX5, - WCD9360_RX6, - WCD9360_RX7, - WCD9360_RX_MAX, -}; - -enum { - WCD9360_TX0 = 0, - WCD9360_TX1, - WCD9360_TX2, - WCD9360_TX3, - WCD9360_TX4, - WCD9360_TX5, - WCD9360_TX6, - WCD9360_TX7, - WCD9360_TX8, - WCD9360_TX9, - WCD9360_TX10, - WCD9360_TX11, - WCD9360_TX12, - WCD9360_TX13, - WCD9360_TX14, - WCD9360_TX15, - WCD9360_TX_MAX, -}; - -/* - * Selects compander and smart boost settings - * for a given speaker mode - */ -enum { - WCD9360_SPKR_MODE_DEFAULT, - WCD9360_SPKR_MODE_1, /* COMP Gain = 12dB, Smartboost Max = 5.5V */ -}; - -/* - * Rx path gain offsets - */ -enum { - WCD9360_RX_GAIN_OFFSET_M1P5_DB, - WCD9360_RX_GAIN_OFFSET_0_DB, -}; - -enum { - WCD9360_MIC_BIAS_1 = 1, - WCD9360_MIC_BIAS_2, - WCD9360_MIC_BIAS_3, - WCD9360_MIC_BIAS_4 -}; - -enum { - WCD9360_MICB_PULLUP_ENABLE, - WCD9360_MICB_PULLUP_DISABLE, - WCD9360_MICB_ENABLE, - WCD9360_MICB_DISABLE, -}; - -/* - * Dai data structure holds the - * dai specific info like rate, - * channel number etc. - */ -struct pahu_codec_dai_data { - u32 rate; - u32 *ch_num; - u32 ch_act; - u32 ch_tot; -}; - -/* - * Structure used to update codec - * register defaults after reset - */ -struct pahu_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD9360) -extern void *pahu_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type); -extern int pahu_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable); -extern int pahu_cdc_mclk_tx_enable(struct snd_soc_codec *codec, bool enable); -extern int pahu_set_spkr_mode(struct snd_soc_codec *codec, int mode); -extern int pahu_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset); -extern void *pahu_get_wcd_dsp_cntl(struct device *dev); -extern int wcd9360_get_micb_vout_ctl_val(u32 micb_mv); -extern int pahu_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -#else -extern void *pahu_get_afe_config(struct snd_soc_codec *codec, - enum afe_config_type config_type) -{ - return NULL; -} -extern int pahu_cdc_mclk_enable(struct snd_soc_codec *codec, bool enable) -{ - return 0; -} -extern int pahu_cdc_mclk_tx_enable(struct snd_soc_codec *codec, bool enable) -{ - return 0; -} -extern int pahu_set_spkr_mode(struct snd_soc_codec *codec, int mode) -{ - return 0; -} -extern int pahu_set_spkr_gain_offset(struct snd_soc_codec *codec, int offset) -{ - return 0; -} -extern void *pahu_get_wcd_dsp_cntl(struct device *dev) -{ - return NULL; -} -extern int wcd9360_get_micb_vout_ctl_val(u32 micb_mv) -{ - return 0; -} -extern int pahu_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -#endif - -#endif diff --git a/techpack/audio/asoc/codecs/wcd937x/Android.mk b/techpack/audio/asoc/codecs/wcd937x/Android.mk deleted file mode 100644 index dec151ad0438..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/Android.mk +++ /dev/null @@ -1,57 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=wcd937x_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wcd937x_slave.ko -LOCAL_MODULE_KBUILD_NAME := wcd937x_slave_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/asoc/codecs/wcd937x/Kbuild b/techpack/audio/asoc/codecs/wcd937x/Kbuild deleted file mode 100644 index 42c2defb1018..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/Kbuild +++ /dev/null @@ -1,121 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - - - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ WCD937X ############ - -# for WCD937X Codec -ifdef CONFIG_SND_SOC_WCD937X - WCD937X_OBJS += wcd937x.o - WCD937X_OBJS += wcd937x-regmap.o - WCD937X_OBJS += wcd937x-tables.o - WCD937X_OBJS += wcd937x-mbhc.o -endif - -ifdef CONFIG_SND_SOC_WCD937X_SLAVE - WCD937X_SLAVE_OBJS += wcd937x_slave.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_SND_SOC_WCD937X) += wcd937x_dlkm.o -wcd937x_dlkm-y := $(WCD937X_OBJS) - -obj-$(CONFIG_SND_SOC_WCD937X_SLAVE) += wcd937x_slave_dlkm.o -wcd937x_slave_dlkm-y := $(WCD937X_SLAVE_OBJS) - -# inject some build related information diff --git a/techpack/audio/asoc/codecs/wcd937x/internal.h b/techpack/audio/asoc/codecs/wcd937x/internal.h deleted file mode 100644 index bc335a565ed3..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/internal.h +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (c) 2018-2020, 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 - * only version 2 as published by the Free Software Foundation. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD937X_INTERNAL_H -#define _WCD937X_INTERNAL_H - -#include "../wcd-clsh.h" -#include "../wcd-mbhc-v2.h" -#include "asoc/wcd-irq.h" -#include "wcd937x-mbhc.h" - -#define WCD937X_MAX_MICBIAS 3 - -/* Convert from vout ctl to micbias voltage in mV */ -#define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) -#define MAX_PORT 8 -#define MAX_CH_PER_PORT 8 - -extern struct regmap_config wcd937x_regmap_config; - -struct codec_port_info { - u32 slave_port_type; - u32 master_port_type; - u32 ch_mask; - u32 num_ch; - u32 ch_rate; -}; -struct wcd937x_priv { - struct device *dev; - - int variant; - struct snd_soc_codec *codec; - struct device_node *rst_np; - struct regmap *regmap; - - struct swr_device *rx_swr_dev; - struct swr_device *tx_swr_dev; - - s32 micb_ref[WCD937X_MAX_MICBIAS]; - s32 pullup_ref[WCD937X_MAX_MICBIAS]; - - struct fw_info *fw_data; - struct device_node *wcd_rst_np; - - struct mutex micb_lock; - s32 dmic_0_1_clk_cnt; - s32 dmic_2_3_clk_cnt; - s32 dmic_4_5_clk_cnt; - /* class h specific info */ - struct wcd_clsh_cdc_info clsh_info; - /* mbhc module */ - struct wcd937x_mbhc *mbhc; - - u32 hph_mode; - bool comp1_enable; - bool comp2_enable; - - struct irq_domain *virq; - struct wcd_irq_info irq_info; - u32 rx_clk_cnt; - int num_irq_regs; - /* to track the status */ - unsigned long status_mask; - - u8 num_tx_ports; - u8 num_rx_ports; - struct codec_port_info - tx_port_mapping[MAX_PORT][MAX_CH_PER_PORT]; - struct codec_port_info - rx_port_mapping[MAX_PORT][MAX_CH_PER_PORT]; - struct regulator_bulk_data *supplies; - struct notifier_block nblock; - /* wcd callback to bolero */ - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); - int (*wakeup)(void *handle, bool enable); - u32 version; - /* Entry for version info */ - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - /*Entry for Variant info*/ - struct snd_info_entry *variant_entry; - int ana_clk_count; - struct mutex ana_tx_clk_lock; -}; - -struct wcd937x_micbias_setting { - u8 ldoh_v; - u32 cfilt1_mv; - u32 micb1_mv; - u32 micb2_mv; - u32 micb3_mv; - u8 bias1_cfilt_sel; -}; - -struct wcd937x_pdata { - struct device_node *rst_np; - struct device_node *rx_slave; - struct device_node *tx_slave; - struct wcd937x_micbias_setting micbias; - - struct cdc_regulator *regulator; - int num_supplies; -}; - -struct wcd_ctrl_platform_data { - void *handle; - int (*update_wcd_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -enum { - WCD_RX1, - WCD_RX2, - WCD_RX3 -}; - -enum { - BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR = 1, - BOLERO_WCD_EVT_PA_OFF_PRE_SSR, - BOLERO_WCD_EVT_SSR_DOWN, - BOLERO_WCD_EVT_SSR_UP, -}; - -enum { - WCD_BOLERO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ - WCD_BOLERO_EVT_IMPED_TRUE, /* for imped true */ - WCD_BOLERO_EVT_IMPED_FALSE, /* for imped false */ - WCD_BOLERO_EVT_BCS_CLK_OFF, -}; - -enum { - /* INTR_CTRL_INT_MASK_0 */ - WCD937X_IRQ_MBHC_BUTTON_PRESS_DET = 0, - WCD937X_IRQ_MBHC_BUTTON_RELEASE_DET, - WCD937X_IRQ_MBHC_ELECT_INS_REM_DET, - WCD937X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - WCD937X_IRQ_MBHC_SW_DET, - WCD937X_IRQ_HPHR_OCP_INT, - WCD937X_IRQ_HPHR_CNP_INT, - WCD937X_IRQ_HPHL_OCP_INT, - - /* INTR_CTRL_INT_MASK_1 */ - WCD937X_IRQ_HPHL_CNP_INT, - WCD937X_IRQ_EAR_CNP_INT, - WCD937X_IRQ_EAR_SCD_INT, - WCD937X_IRQ_AUX_CNP_INT, - WCD937X_IRQ_AUX_SCD_INT, - WCD937X_IRQ_HPHL_PDM_WD_INT, - WCD937X_IRQ_HPHR_PDM_WD_INT, - WCD937X_IRQ_AUX_PDM_WD_INT, - - /* INTR_CTRL_INT_MASK_2 */ - WCD937X_IRQ_LDORT_SCD_INT, - WCD937X_IRQ_MBHC_MOISTURE_INT, - WCD937X_IRQ_HPHL_SURGE_DET_INT, - WCD937X_IRQ_HPHR_SURGE_DET_INT, - WCD937X_NUM_IRQS, -}; - -extern void wcd937x_disable_bcs_before_slow_insert( - struct snd_soc_codec *codec, - bool bcs_disable); -extern struct wcd937x_mbhc *wcd937x_soc_get_mbhc( - struct snd_soc_codec *codec); -extern int wcd937x_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int volt, int micb_num); -extern int wcd937x_get_micb_vout_ctl_val(u32 micb_mv); -extern int wcd937x_micbias_control(struct snd_soc_codec *codec, int micb_num, - int req, bool is_dapm); -#endif diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.c b/techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.c deleted file mode 100644 index 546c4e670531..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.c +++ /dev/null @@ -1,1137 +0,0 @@ -/* Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd937x-registers.h" -#include "../wcdcal-hwdep.h" -#include "../wcd-mbhc-v2-api.h" -#include "internal.h" - -#define WCD937X_ZDET_SUPPORTED true -/* Z value defined in milliohm */ -#define WCD937X_ZDET_VAL_32 32000 -#define WCD937X_ZDET_VAL_400 400000 -#define WCD937X_ZDET_VAL_1200 1200000 -#define WCD937X_ZDET_VAL_100K 100000000 -/* Z floating defined in ohms */ -#define WCD937X_ZDET_FLOATING_IMPEDANCE 0x0FFFFFFE - -#define WCD937X_ZDET_NUM_MEASUREMENTS 900 -#define WCD937X_MBHC_GET_C1(c) ((c & 0xC000) >> 14) -#define WCD937X_MBHC_GET_X1(x) (x & 0x3FFF) -/* Z value compared in milliOhm */ -#define WCD937X_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) -#define WCD937X_MBHC_ZDET_CONST (86 * 16384) -#define WCD937X_MBHC_MOISTURE_RREF R_24_KOHM - -static struct wcd_mbhc_register - wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { - WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN", - WCD937X_ANA_MBHC_MECH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN", - WCD937X_ANA_MBHC_MECH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE", - WCD937X_ANA_MBHC_MECH, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL", - WCD937X_MBHC_NEW_PLUG_DETECT_CTL, 0x30, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE", - WCD937X_ANA_MBHC_ELECT, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL", - WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x1F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL", - WCD937X_ANA_MBHC_MECH, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE", - WCD937X_ANA_MBHC_MECH, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE", - WCD937X_ANA_MBHC_MECH, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND", - WCD937X_ANA_MBHC_MECH, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC", - WCD937X_ANA_MBHC_ELECT, 0x06, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN", - WCD937X_ANA_MBHC_ELECT, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC", - WCD937X_MBHC_NEW_PLUG_DETECT_CTL, 0x0F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC", - WCD937X_MBHC_NEW_CTL_1, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF", - WCD937X_MBHC_NEW_CTL_2, 0x03, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_IN2P_CLAMP_STATE", - WCD937X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN", - WCD937X_HPH_OCP_CTL, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0x07, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL", - WCD937X_ANA_MBHC_ELECT, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT", - WCD937X_ANA_MBHC_RESULT_3, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL", - WCD937X_ANA_MICB2, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME", - WCD937X_HPH_CNP_WG_TIME, 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN", - WCD937X_ANA_HPH, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN", - WCD937X_ANA_HPH, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN", - WCD937X_ANA_HPH, 0xC0, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", - WCD937X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", - 0, 0, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", - WCD937X_MBHC_CTL_BCS, 0x02, 1, 0), - WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", - WCD937X_MBHC_NEW_FSM_STATUS, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", - WCD937X_MBHC_NEW_CTL_2, 0x70, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS", - WCD937X_MBHC_NEW_FSM_STATUS, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND", - WCD937X_HPH_PA_CTL2, 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND", - WCD937X_HPH_PA_CTL2, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_DET_EN", - WCD937X_HPH_L_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_DET_EN", - WCD937X_HPH_R_TEST, 0x01, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_STATUS", - WCD937X_DIGITAL_INTR_STATUS_0, 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_STATUS", - WCD937X_DIGITAL_INTR_STATUS_0, 0x20, 5, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_EN", - WCD937X_MBHC_NEW_CTL_1, 0x08, 3, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_COMPLETE", WCD937X_MBHC_NEW_FSM_STATUS, - 0x40, 6, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_TIMEOUT", WCD937X_MBHC_NEW_FSM_STATUS, - 0x80, 7, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_RESULT", WCD937X_MBHC_NEW_ADC_RESULT, - 0xFF, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MICB2_VOUT", WCD937X_ANA_MICB2, 0x3F, 0, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ADC_MODE", - WCD937X_MBHC_NEW_CTL_1, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_DETECTION_DONE", - WCD937X_MBHC_NEW_CTL_1, 0x04, 2, 0), - WCD_MBHC_REGISTER("WCD_MBHC_ELECT_ISRC_EN", - WCD937X_ANA_MBHC_ZDET, 0x02, 1, 0), -}; - -static const struct wcd_mbhc_intr intr_ids = { - .mbhc_sw_intr = WCD937X_IRQ_MBHC_SW_DET, - .mbhc_btn_press_intr = WCD937X_IRQ_MBHC_BUTTON_PRESS_DET, - .mbhc_btn_release_intr = WCD937X_IRQ_MBHC_BUTTON_RELEASE_DET, - .mbhc_hs_ins_intr = WCD937X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, - .mbhc_hs_rem_intr = WCD937X_IRQ_MBHC_ELECT_INS_REM_DET, - .hph_left_ocp = WCD937X_IRQ_HPHL_OCP_INT, - .hph_right_ocp = WCD937X_IRQ_HPHR_OCP_INT, -}; - -struct wcd937x_mbhc_zdet_param { - u16 ldo_ctl; - u16 noff; - u16 nshift; - u16 btn5; - u16 btn6; - u16 btn7; -}; - -static int wcd937x_mbhc_request_irq(struct snd_soc_codec *codec, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - return wcd_request_irq(&wcd937x->irq_info, irq, name, handler, data); -} - -static void wcd937x_mbhc_irq_control(struct snd_soc_codec *codec, - int irq, bool enable) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - if (enable) - wcd_enable_irq(&wcd937x->irq_info, irq); - else - wcd_disable_irq(&wcd937x->irq_info, irq); -} - -static int wcd937x_mbhc_free_irq(struct snd_soc_codec *codec, - int irq, void *data) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - wcd_free_irq(&wcd937x->irq_info, irq, data); - - return 0; -} - -static void wcd937x_mbhc_clk_setup(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_1, - 0x80, 0x80); - else - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_1, - 0x80, 0x00); -} - -static int wcd937x_mbhc_btn_to_num(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, WCD937X_ANA_MBHC_RESULT_3) & 0x7; -} - -static void wcd937x_mbhc_mbhc_bias_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_ELECT, - 0x01, 0x01); - else - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_ELECT, - 0x01, 0x00); -} - -static void wcd937x_mbhc_program_btn_thr(struct snd_soc_codec *codec, - s16 *btn_low, s16 *btn_high, - int num_btn, bool is_micbias) -{ - int i; - int vth; - - if (num_btn > WCD_MBHC_DEF_BUTTONS) { - dev_err(codec->dev, "%s: invalid number of buttons: %d\n", - __func__, num_btn); - return; - } - - for (i = 0; i < num_btn; i++) { - vth = ((btn_high[i] * 2) / 25) & 0x3F; - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN0 + i, - 0xFC, vth << 2); - dev_dbg(codec->dev, "%s: btn_high[%d]: %d, vth: %d\n", - __func__, i, btn_high[i], vth); - } -} - -static bool wcd937x_mbhc_lock_sleep(struct wcd_mbhc *mbhc, bool lock) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - - wcd937x->wakeup((void*)wcd937x, lock); - return true; -} - -static int wcd937x_mbhc_register_notifier(struct wcd_mbhc *mbhc, - struct notifier_block *nblock, - bool enable) -{ - struct wcd937x_mbhc *wcd937x_mbhc; - - wcd937x_mbhc = container_of(mbhc, struct wcd937x_mbhc, wcd_mbhc); - - if (enable) - return blocking_notifier_chain_register(&wcd937x_mbhc->notifier, - nblock); - else - return blocking_notifier_chain_unregister( - &wcd937x_mbhc->notifier, nblock); -} - -static bool wcd937x_mbhc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num) -{ - u8 val = 0; - - if (micb_num == MIC_BIAS_2) { - val = ((snd_soc_read(mbhc->codec, WCD937X_ANA_MICB2) & 0xC0) - >> 6); - if (val == 0x01) - return true; - } - return false; -} - -static bool wcd937x_mbhc_hph_pa_on_status(struct snd_soc_codec *codec) -{ - return (snd_soc_read(codec, WCD937X_ANA_HPH) & 0xC0) ? true : false; -} - -static void wcd937x_mbhc_hph_l_pull_up_control(struct snd_soc_codec *codec, - int pull_up_cur) -{ - /* Default pull up current to 2uA */ - if (pull_up_cur > HS_PULLUP_I_OFF || pull_up_cur < HS_PULLUP_I_3P0_UA || - pull_up_cur == HS_PULLUP_I_DEFAULT) - pull_up_cur = HS_PULLUP_I_2P0_UA; - - dev_dbg(codec->dev, "%s: HS pull up current:%d\n", - __func__, pull_up_cur); - - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT, - 0x1F, pull_up_cur); -} - -static int wcd937x_mbhc_request_micbias(struct snd_soc_codec *codec, - int micb_num, int req) -{ - int ret = 0; - - ret = wcd937x_micbias_control(codec, micb_num, req, false); - - return ret; -} - -static void wcd937x_mbhc_micb_ramp_control(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x1C, 0x0C); - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x80, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_MICB2_RAMP, - 0x1C, 0x00); - } -} - -static struct firmware_cal *wcd937x_get_hwdep_fw_cal(struct wcd_mbhc *mbhc, - enum wcd_cal_type type) -{ - struct wcd937x_mbhc *wcd937x_mbhc; - struct firmware_cal *hwdep_cal; - struct snd_soc_codec *codec = mbhc->codec; - - wcd937x_mbhc = container_of(mbhc, struct wcd937x_mbhc, wcd_mbhc); - - if (!codec) { - pr_err("%s: NULL codec pointer\n", __func__); - return NULL; - } - hwdep_cal = wcdcal_get_fw_cal(wcd937x_mbhc->fw_data, type); - if (!hwdep_cal) - dev_err(codec->dev, "%s: cal not sent by %d\n", - __func__, type); - - return hwdep_cal; -} - -static int wcd937x_mbhc_micb_ctrl_threshold_mic(struct snd_soc_codec *codec, - int micb_num, bool req_en) -{ - struct wcd937x_pdata *pdata = dev_get_platdata(codec->dev); - int rc, micb_mv; - - if (micb_num != MIC_BIAS_2) - return -EINVAL; - /* - * If device tree micbias level is already above the minimum - * voltage needed to detect threshold microphone, then do - * not change the micbias, just return. - */ - if (pdata->micbias.micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) - return 0; - - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : pdata->micbias.micb2_mv; - - rc = wcd937x_mbhc_micb_adjust_voltage(codec, micb_mv, MIC_BIAS_2); - - return rc; -} - -static inline void wcd937x_mbhc_get_result_params(struct wcd937x_priv *wcd937x, - s16 *d1_a, u16 noff, - int32_t *zdet) -{ - int i; - int val, val1; - s16 c1; - s32 x1, d1; - int32_t denom; - int minCode_param[] = { - 3277, 1639, 820, 410, 205, 103, 52, 26 - }; - - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x20); - for (i = 0; i < WCD937X_ZDET_NUM_MEASUREMENTS; i++) { - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_2, &val); - if (val & 0x80) - break; - } - val = val << 0x8; - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_1, &val1); - val |= val1; - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x00); - x1 = WCD937X_MBHC_GET_X1(val); - c1 = WCD937X_MBHC_GET_C1(val); - /* If ramp is not complete, give additional 5ms */ - if ((c1 < 2) && x1) - usleep_range(5000, 5050); - - if (!c1 || !x1) { - dev_dbg(wcd937x->dev, - "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", - __func__, c1, x1); - goto ramp_down; - } - d1 = d1_a[c1]; - denom = (x1 * d1) - (1 << (14 - noff)); - if (denom > 0) - *zdet = (WCD937X_MBHC_ZDET_CONST * 1000) / denom; - else if (x1 < minCode_param[noff]) - *zdet = WCD937X_ZDET_FLOATING_IMPEDANCE; - - dev_dbg(wcd937x->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", - __func__, d1, c1, x1, *zdet); -ramp_down: - i = 0; - while (x1) { - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_1, &val); - regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_2, &val1); - val = val << 0x8; - val |= val1; - x1 = WCD937X_MBHC_GET_X1(val); - i++; - if (i == WCD937X_ZDET_NUM_MEASUREMENTS) - break; - } -} - -static void wcd937x_mbhc_zdet_ramp(struct snd_soc_codec *codec, - struct wcd937x_mbhc_zdet_param *zdet_param, - int32_t *zl, int32_t *zr, s16 *d1_a) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - int32_t zdet = 0; - - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL, 0x70, - zdet_param->ldo_ctl << 4); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN5, 0xFC, - zdet_param->btn5); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN6, 0xFC, - zdet_param->btn6); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_BTN7, 0xFC, - zdet_param->btn7); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL, 0x0F, - zdet_param->noff); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_ZDET_RAMP_CTL, 0x0F, - zdet_param->nshift); - - if (!zl) - goto z_right; - /* Start impedance measurement for HPH_L */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x80, 0x80); - dev_dbg(wcd937x->dev, "%s: ramp for HPH_L, noff = %d\n", - __func__, zdet_param->noff); - wcd937x_mbhc_get_result_params(wcd937x, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x80, 0x00); - - *zl = zdet; - -z_right: - if (!zr) - return; - /* Start impedance measurement for HPH_R */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x40, 0x40); - dev_dbg(wcd937x->dev, "%s: ramp for HPH_R, noff = %d\n", - __func__, zdet_param->noff); - wcd937x_mbhc_get_result_params(wcd937x, d1_a, zdet_param->noff, &zdet); - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ZDET, 0x40, 0x00); - - *zr = zdet; -} - -static inline void wcd937x_wcd_mbhc_qfuse_cal(struct snd_soc_codec *codec, - int32_t *z_val, int flag_l_r) -{ - s16 q1; - int q1_cal; - - if (*z_val < (WCD937X_ZDET_VAL_400/1000)) - q1 = snd_soc_read(codec, - WCD937X_DIGITAL_EFUSE_REG_23 + (2 * flag_l_r)); - else - q1 = snd_soc_read(codec, - WCD937X_DIGITAL_EFUSE_REG_24 + (2 * flag_l_r)); - if (q1 & 0x80) - q1_cal = (10000 - ((q1 & 0x7F) * 25)); - else - q1_cal = (10000 + (q1 * 25)); - if (q1_cal > 0) - *z_val = ((*z_val) * 10000) / q1_cal; -} - -static void wcd937x_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, - uint32_t *zr) -{ - struct snd_soc_codec *codec = mbhc->codec; - struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev); - s16 reg0, reg1, reg2, reg3, reg4; - int32_t z1L, z1R, z1Ls; - int zMono, z_diff1, z_diff2; - bool is_fsm_disable = false; - struct wcd937x_mbhc_zdet_param zdet_param[] = { - {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */ - {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */ - {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */ - {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */ - }; - struct wcd937x_mbhc_zdet_param *zdet_param_ptr = NULL; - s16 d1_a[][4] = { - {0, 30, 90, 30}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - {0, 30, 30, 5}, - }; - s16 *d1 = NULL; - - WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - - reg0 = snd_soc_read(codec, WCD937X_ANA_MBHC_BTN5); - reg1 = snd_soc_read(codec, WCD937X_ANA_MBHC_BTN6); - reg2 = snd_soc_read(codec, WCD937X_ANA_MBHC_BTN7); - reg3 = snd_soc_read(codec, WCD937X_MBHC_CTL_CLK); - reg4 = snd_soc_read(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL); - - if (snd_soc_read(codec, WCD937X_ANA_MBHC_ELECT) & 0x80) { - is_fsm_disable = true; - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ELECT, 0x80, 0x00); - } - - /* For NO-jack, disable L_DET_EN before Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x80, 0x00); - - /* Turn off 100k pull down on HPHL */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x01, 0x00); - - /* - * Disable surge protection before impedance detection. - * This is done to give correct value for high impedance. - */ - regmap_update_bits(wcd937x->regmap, - WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0x00); - - /* First get impedance on Left */ - d1 = d1_a[1]; - zdet_param_ptr = &zdet_param[1]; - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - - if (!WCD937X_MBHC_IS_SECOND_RAMP_REQUIRED(z1L)) - goto left_ch_impedance; - - /* Second ramp for left ch */ - if (z1L < WCD937X_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1L > WCD937X_ZDET_VAL_400) && - (z1L <= WCD937X_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1L > WCD937X_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, &z1L, NULL, d1); - -left_ch_impedance: - if ((z1L == WCD937X_ZDET_FLOATING_IMPEDANCE) || - (z1L > WCD937X_ZDET_VAL_100K)) { - *zl = WCD937X_ZDET_FLOATING_IMPEDANCE; - zdet_param_ptr = &zdet_param[1]; - d1 = d1_a[1]; - } else { - *zl = z1L/1000; - wcd937x_wcd_mbhc_qfuse_cal(codec, zl, 0); - } - dev_dbg(codec->dev, "%s: impedance on HPH_L = %d(ohms)\n", - __func__, *zl); - - /* Start of right impedance ramp and calculation */ - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - if (WCD937X_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) { - if (((z1R > WCD937X_ZDET_VAL_1200) && - (zdet_param_ptr->noff == 0x6)) || - ((*zl) != WCD937X_ZDET_FLOATING_IMPEDANCE)) - goto right_ch_impedance; - /* Second ramp for right ch */ - if (z1R < WCD937X_ZDET_VAL_32) { - zdet_param_ptr = &zdet_param[0]; - d1 = d1_a[0]; - } else if ((z1R > WCD937X_ZDET_VAL_400) && - (z1R <= WCD937X_ZDET_VAL_1200)) { - zdet_param_ptr = &zdet_param[2]; - d1 = d1_a[2]; - } else if (z1R > WCD937X_ZDET_VAL_1200) { - zdet_param_ptr = &zdet_param[3]; - d1 = d1_a[3]; - } - wcd937x_mbhc_zdet_ramp(codec, zdet_param_ptr, NULL, &z1R, d1); - } -right_ch_impedance: - if ((z1R == WCD937X_ZDET_FLOATING_IMPEDANCE) || - (z1R > WCD937X_ZDET_VAL_100K)) { - *zr = WCD937X_ZDET_FLOATING_IMPEDANCE; - } else { - *zr = z1R/1000; - wcd937x_wcd_mbhc_qfuse_cal(codec, zr, 1); - } - dev_dbg(codec->dev, "%s: impedance on HPH_R = %d(ohms)\n", - __func__, *zr); - - /* Mono/stereo detection */ - if ((*zl == WCD937X_ZDET_FLOATING_IMPEDANCE) && - (*zr == WCD937X_ZDET_FLOATING_IMPEDANCE)) { - dev_dbg(codec->dev, - "%s: plug type is invalid or extension cable\n", - __func__); - goto zdet_complete; - } - if ((*zl == WCD937X_ZDET_FLOATING_IMPEDANCE) || - (*zr == WCD937X_ZDET_FLOATING_IMPEDANCE) || - ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) || - ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) { - dev_dbg(codec->dev, - "%s: Mono plug type with one ch floating or shorted to GND\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - goto zdet_complete; - } - snd_soc_update_bits(codec, WCD937X_HPH_R_ATEST, 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, 0x40, 0x01); - if (*zl < (WCD937X_ZDET_VAL_32/1000)) - wcd937x_mbhc_zdet_ramp(codec, &zdet_param[0], &z1Ls, NULL, d1); - else - wcd937x_mbhc_zdet_ramp(codec, &zdet_param[1], &z1Ls, NULL, d1); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_HPH_R_ATEST, 0x02, 0x00); - z1Ls /= 1000; - wcd937x_wcd_mbhc_qfuse_cal(codec, &z1Ls, 0); - /* Parallel of left Z and 9 ohm pull down resistor */ - zMono = ((*zl) * 9) / ((*zl) + 9); - z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); - z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); - if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) { - dev_dbg(codec->dev, "%s: stereo plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_STEREO; - } else { - dev_dbg(codec->dev, "%s: MONO plug type detected\n", - __func__); - mbhc->hph_type = WCD_MBHC_HPH_MONO; - } - - /* Enable surge protection again after impedance detection */ - regmap_update_bits(wcd937x->regmap, - WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); -zdet_complete: - snd_soc_write(codec, WCD937X_ANA_MBHC_BTN5, reg0); - snd_soc_write(codec, WCD937X_ANA_MBHC_BTN6, reg1); - snd_soc_write(codec, WCD937X_ANA_MBHC_BTN7, reg2); - /* Turn on 100k pull down on HPHL */ - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x01, 0x01); - - /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ - if (mbhc->hphl_swh) - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_MECH, 0x80, 0x80); - - snd_soc_write(codec, WCD937X_MBHC_NEW_ZDET_ANA_CTL, reg4); - snd_soc_write(codec, WCD937X_MBHC_CTL_CLK, reg3); - if (is_fsm_disable) - regmap_update_bits(wcd937x->regmap, - WCD937X_ANA_MBHC_ELECT, 0x80, 0x80); -} - -static void wcd937x_mbhc_gnd_det_ctrl(struct snd_soc_codec *codec, bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x40, 0x40); - } else { - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x02, 0x00); - } -} - -static void wcd937x_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, - bool enable) -{ - if (enable) { - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x40, 0x40); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x10, 0x10); - } else { - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_HPH_PA_CTL2, - 0x10, 0x00); - } -} - -static void wcd937x_mbhc_moisture_config(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - /* Do not enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - return; - } - - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); -} - -static void wcd937x_mbhc_moisture_detect_en(struct wcd_mbhc *mbhc, bool enable) -{ - struct snd_soc_codec *codec = mbhc->codec; - - if (enable) - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, mbhc->moist_rref << 2); - else - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); -} - -static bool wcd937x_mbhc_get_moisture_status(struct wcd_mbhc *mbhc) -{ - struct snd_soc_codec *codec = mbhc->codec; - bool ret = false; - - if ((mbhc->moist_rref == R_OFF) || - (mbhc->mbhc_cfg->enable_usbc_analog)) { - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - goto done; - } - - /* Do not enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", - __func__); - snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2, - 0x0C, R_OFF << 2); - goto done; - } - - /* If moisture_en is already enabled, then skip to plug type - * detection. - */ - if ((snd_soc_read(codec, WCD937X_MBHC_NEW_CTL_2) & 0x0C)) - goto done; - - wcd937x_mbhc_moisture_detect_en(mbhc, true); - /* Read moisture comparator status */ - ret = ((snd_soc_read(codec, WCD937X_MBHC_NEW_FSM_STATUS) - & 0x20) ? 0 : 1); - -done: - return ret; - -} - -static void wcd937x_mbhc_moisture_polling_ctrl(struct wcd_mbhc *mbhc, - bool enable) -{ - struct snd_soc_codec *codec = mbhc->codec; - - snd_soc_update_bits(codec, - WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, - 0x04, (enable << 2)); -} - -static void wcd937x_mbhc_bcs_enable(struct wcd_mbhc *mbhc, - bool bcs_enable) -{ - if (bcs_enable) - wcd937x_disable_bcs_before_slow_insert(mbhc->codec, false); - else - wcd937x_disable_bcs_before_slow_insert(mbhc->codec, true); -} - -static const struct wcd_mbhc_cb mbhc_cb = { - .request_irq = wcd937x_mbhc_request_irq, - .irq_control = wcd937x_mbhc_irq_control, - .free_irq = wcd937x_mbhc_free_irq, - .clk_setup = wcd937x_mbhc_clk_setup, - .map_btn_code_to_num = wcd937x_mbhc_btn_to_num, - .mbhc_bias = wcd937x_mbhc_mbhc_bias_control, - .set_btn_thr = wcd937x_mbhc_program_btn_thr, - .lock_sleep = wcd937x_mbhc_lock_sleep, - .register_notifier = wcd937x_mbhc_register_notifier, - .micbias_enable_status = wcd937x_mbhc_micb_en_status, - .hph_pa_on_status = wcd937x_mbhc_hph_pa_on_status, - .hph_pull_up_control_v2 = wcd937x_mbhc_hph_l_pull_up_control, - .mbhc_micbias_control = wcd937x_mbhc_request_micbias, - .mbhc_micb_ramp_control = wcd937x_mbhc_micb_ramp_control, - .get_hwdep_fw_cal = wcd937x_get_hwdep_fw_cal, - .mbhc_micb_ctrl_thr_mic = wcd937x_mbhc_micb_ctrl_threshold_mic, - .compute_impedance = wcd937x_wcd_mbhc_calc_impedance, - .mbhc_gnd_det_ctrl = wcd937x_mbhc_gnd_det_ctrl, - .hph_pull_down_ctrl = wcd937x_mbhc_hph_pull_down_ctrl, - .mbhc_moisture_config = wcd937x_mbhc_moisture_config, - .mbhc_get_moisture_status = wcd937x_mbhc_get_moisture_status, - .mbhc_moisture_polling_ctrl = wcd937x_mbhc_moisture_polling_ctrl, - .mbhc_moisture_detect_en = wcd937x_mbhc_moisture_detect_en, - .bcs_enable = wcd937x_mbhc_bcs_enable, -}; - -static int wcd937x_get_hph_type(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_mbhc *wcd937x_mbhc = wcd937x_soc_get_mbhc(codec); - struct wcd_mbhc *mbhc; - - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mbhc = &wcd937x_mbhc->wcd_mbhc; - - ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; - dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); - - return 0; -} - -static int wcd937x_hph_impedance_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t zl, zr; - bool hphr; - struct soc_multi_mixer_control *mc; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_mbhc *wcd937x_mbhc = wcd937x_soc_get_mbhc(codec); - - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - wcd_mbhc_get_impedance(&wcd937x_mbhc->wcd_mbhc, &zl, &zr); - dev_dbg(codec->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); - ucontrol->value.integer.value[0] = hphr ? zr : zl; - - return 0; -} - -static const struct snd_kcontrol_new hph_type_detect_controls[] = { - SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, - wcd937x_get_hph_type, NULL), -}; - -static const struct snd_kcontrol_new impedance_detect_controls[] = { - SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0, - wcd937x_hph_impedance_get, NULL), - SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0, - wcd937x_hph_impedance_get, NULL), -}; - -/* - * wcd937x_mbhc_get_impedance: get impedance of headphone - * left and right channels - * @wcd937x_mbhc: handle to struct wcd937x_mbhc * - * @zl: handle to left-ch impedance - * @zr: handle to right-ch impedance - * return 0 for success or error code in case of failure - */ -int wcd937x_mbhc_get_impedance(struct wcd937x_mbhc *wcd937x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (!wcd937x_mbhc) { - pr_err("%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - if (!zl || !zr) { - pr_err("%s: zl or zr null!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_get_impedance(&wcd937x_mbhc->wcd_mbhc, zl, zr); -} -EXPORT_SYMBOL(wcd937x_mbhc_get_impedance); - -/* - * wcd937x_mbhc_hs_detect: starts mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - * @mbhc_cfg: handle to mbhc configuration structure - * return 0 if mbhc_start is success or error code in case of failure - */ -int wcd937x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - struct wcd937x_priv *wcd937x = NULL; - struct wcd937x_mbhc *wcd937x_mbhc = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - wcd937x = snd_soc_codec_get_drvdata(codec); - if (!wcd937x) { - pr_err("%s: wcd937x is NULL\n", __func__); - return -EINVAL; - } - - wcd937x_mbhc = wcd937x->mbhc; - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return -EINVAL; - } - - return wcd_mbhc_start(&wcd937x_mbhc->wcd_mbhc, mbhc_cfg); -} -EXPORT_SYMBOL(wcd937x_mbhc_hs_detect); - -/* - * wcd937x_mbhc_hs_detect_exit: stop mbhc insertion/removal functionality - * @codec: handle to snd_soc_codec * - */ -void wcd937x_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = NULL; - struct wcd937x_mbhc *wcd937x_mbhc = NULL; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - wcd937x = snd_soc_codec_get_drvdata(codec); - if (!wcd937x) { - pr_err("%s: wcd937x is NULL\n", __func__); - return; - } - - wcd937x_mbhc = wcd937x->mbhc; - if (!wcd937x_mbhc) { - dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); - return; - } - wcd_mbhc_stop(&wcd937x_mbhc->wcd_mbhc); -} -EXPORT_SYMBOL(wcd937x_mbhc_hs_detect_exit); - -/* - * wcd937x_mbhc_ssr_down: stop mbhc during - * wcd937x subsystem restart - * @mbhc: pointer to wcd937x_mbhc structure - * @codec: handle to snd_soc_codec * - */ -void wcd937x_mbhc_ssr_down(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - struct wcd_mbhc *wcd_mbhc = NULL; - - if (!mbhc || !codec) - return; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - dev_err(codec->dev, "%s: wcd_mbhc is NULL\n", __func__); - return; - } - - wcd937x_mbhc_hs_detect_exit(codec); - wcd_mbhc_deinit(wcd_mbhc); -} -EXPORT_SYMBOL(wcd937x_mbhc_ssr_down); - -/* - * wcd937x_mbhc_post_ssr_init: initialize mbhc for - * wcd937x post subsystem restart - * @mbhc: poniter to wcd937x_mbhc structure - * @codec: handle to snd_soc_codec * - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int wcd937x_mbhc_post_ssr_init(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - int ret = 0; - struct wcd_mbhc *wcd_mbhc = NULL; - - if (!mbhc || !codec) - return -EINVAL; - - wcd_mbhc = &mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - return -EINVAL; - } - - snd_soc_update_bits(codec, WCD937X_ANA_MBHC_MECH, - 0x20, 0x20); - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, WCD937X_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(wcd937x_mbhc_post_ssr_init); - -/* - * wcd937x_mbhc_init: initialize mbhc for wcd937x - * @mbhc: poniter to wcd937x_mbhc struct pointer to store the configs - * @codec: handle to snd_soc_codec * - * @fw_data: handle to firmware data - * - * return 0 if mbhc_init is success or error code in case of failure - */ -int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc, struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - struct wcd937x_mbhc *wcd937x_mbhc = NULL; - struct wcd_mbhc *wcd_mbhc = NULL; - struct wcd937x_pdata *pdata; - int ret = 0; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - - wcd937x_mbhc = devm_kzalloc(codec->dev, sizeof(struct wcd937x_mbhc), - GFP_KERNEL); - if (!wcd937x_mbhc) - return -ENOMEM; - - wcd937x_mbhc->fw_data = fw_data; - BLOCKING_INIT_NOTIFIER_HEAD(&wcd937x_mbhc->notifier); - wcd_mbhc = &wcd937x_mbhc->wcd_mbhc; - if (wcd_mbhc == NULL) { - pr_err("%s: wcd_mbhc is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - - /* Setting default mbhc detection logic to ADC */ - wcd_mbhc->mbhc_detection_logic = WCD_DETECTION_ADC; - - pdata = dev_get_platdata(codec->dev); - if (!pdata) { - dev_err(codec->dev, "%s: pdata pointer is NULL\n", - __func__); - ret = -EINVAL; - goto err; - } - wcd_mbhc->micb_mv = pdata->micbias.micb2_mv; - - ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, - &intr_ids, wcd_mbhc_registers, - WCD937X_ZDET_SUPPORTED); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - goto err; - } - - (*mbhc) = wcd937x_mbhc; - snd_soc_add_codec_controls(codec, impedance_detect_controls, - ARRAY_SIZE(impedance_detect_controls)); - snd_soc_add_codec_controls(codec, hph_type_detect_controls, - ARRAY_SIZE(hph_type_detect_controls)); - - return 0; -err: - devm_kfree(codec->dev, wcd937x_mbhc); - return ret; -} -EXPORT_SYMBOL(wcd937x_mbhc_init); - -/* - * wcd937x_mbhc_deinit: deinitialize mbhc for wcd937x - * @codec: handle to snd_soc_codec * - */ -void wcd937x_mbhc_deinit(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x; - struct wcd937x_mbhc *wcd937x_mbhc; - - if (!codec) { - pr_err("%s: codec is NULL\n", __func__); - return; - } - - wcd937x = snd_soc_codec_get_drvdata(codec); - if (!wcd937x) { - pr_err("%s: wcd937x is NULL\n", __func__); - return; - } - - wcd937x_mbhc = wcd937x->mbhc; - if (wcd937x_mbhc) { - wcd_mbhc_deinit(&wcd937x_mbhc->wcd_mbhc); - devm_kfree(codec->dev, wcd937x_mbhc); - } -} -EXPORT_SYMBOL(wcd937x_mbhc_deinit); diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.h b/techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.h deleted file mode 100644 index 634cba6cb618..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x-mbhc.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD937X_MBHC_H__ -#define __WCD937X_MBHC_H__ -#include "../wcd-mbhc-v2.h" - -struct wcd937x_mbhc { - struct wcd_mbhc wcd_mbhc; - struct blocking_notifier_head notifier; - struct fw_info *fw_data; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD937X) -extern int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data); -extern void wcd937x_mbhc_hs_detect_exit(struct snd_soc_codec *codec); -extern int wcd937x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg); -extern void wcd937x_mbhc_deinit(struct snd_soc_codec *codec); -extern int wcd937x_mbhc_post_ssr_init(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec); -extern void wcd937x_mbhc_ssr_down(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec); -extern int wcd937x_mbhc_get_impedance(struct wcd937x_mbhc *wcd937x_mbhc, - uint32_t *zl, uint32_t *zr); -#else -static inline int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc, - struct snd_soc_codec *codec, - struct fw_info *fw_data) -{ - return 0; -} -static inline void wcd937x_mbhc_hs_detect_exit(struct snd_soc_codec *codec) -{ -} -static inline int wcd937x_mbhc_hs_detect(struct snd_soc_codec *codec, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -static inline void wcd937x_mbhc_deinit(struct snd_soc_codec *codec) -{ -} -static inline int wcd937x_mbhc_post_ssr_init(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ - return 0; -} -static inline void wcd937x_mbhc_ssr_down(struct wcd937x_mbhc *mbhc, - struct snd_soc_codec *codec) -{ -} -static inline int wcd937x_mbhc_get_impedance(struct wcd937x_mbhc *wcd937x_mbhc, - uint32_t *zl, uint32_t *zr) -{ - if (zl) - *zl = 0; - if (zr) - *zr = 0; - return -EINVAL; -} -#endif - -#endif /* __WCD937X_MBHC_H__ */ diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x-registers.h b/techpack/audio/asoc/codecs/wcd937x/wcd937x-registers.h deleted file mode 100644 index 332e4348a2b2..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x-registers.h +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD937X_REGISTERS_H -#define _WCD937X_REGISTERS_H - -#define WCD937X_BASE_ADDRESS 0x3000 - -#define WCD937X_REG(reg) (reg - WCD937X_BASE_ADDRESS) - -enum { - REG_NO_ACCESS, - RD_REG, - WR_REG, - RD_WR_REG -}; - -#define WCD937X_ANA_BIAS (WCD937X_BASE_ADDRESS+0x001) -#define WCD937X_ANA_RX_SUPPLIES (WCD937X_BASE_ADDRESS+0x008) -#define WCD937X_ANA_HPH (WCD937X_BASE_ADDRESS+0x009) -#define WCD937X_ANA_EAR (WCD937X_BASE_ADDRESS+0x00A) -#define WCD937X_ANA_EAR_COMPANDER_CTL (WCD937X_BASE_ADDRESS+0x00B) -#define WCD937X_ANA_TX_CH1 (WCD937X_BASE_ADDRESS+0x00E) -#define WCD937X_ANA_TX_CH2 (WCD937X_BASE_ADDRESS+0x00F) -#define WCD937X_ANA_TX_CH3 (WCD937X_BASE_ADDRESS+0x010) -#define WCD937X_ANA_TX_CH3_HPF (WCD937X_BASE_ADDRESS+0x011) -#define WCD937X_ANA_MICB1_MICB2_DSP_EN_LOGIC (WCD937X_BASE_ADDRESS+0x012) -#define WCD937X_ANA_MICB3_DSP_EN_LOGIC (WCD937X_BASE_ADDRESS+0x013) -#define WCD937X_ANA_MBHC_MECH (WCD937X_BASE_ADDRESS+0x014) -#define WCD937X_ANA_MBHC_ELECT (WCD937X_BASE_ADDRESS+0x015) -#define WCD937X_ANA_MBHC_ZDET (WCD937X_BASE_ADDRESS+0x016) -#define WCD937X_ANA_MBHC_RESULT_1 (WCD937X_BASE_ADDRESS+0x017) -#define WCD937X_ANA_MBHC_RESULT_2 (WCD937X_BASE_ADDRESS+0x018) -#define WCD937X_ANA_MBHC_RESULT_3 (WCD937X_BASE_ADDRESS+0x019) -#define WCD937X_ANA_MBHC_BTN0 (WCD937X_BASE_ADDRESS+0x01A) -#define WCD937X_ANA_MBHC_BTN1 (WCD937X_BASE_ADDRESS+0x01B) -#define WCD937X_ANA_MBHC_BTN2 (WCD937X_BASE_ADDRESS+0x01C) -#define WCD937X_ANA_MBHC_BTN3 (WCD937X_BASE_ADDRESS+0x01D) -#define WCD937X_ANA_MBHC_BTN4 (WCD937X_BASE_ADDRESS+0x01E) -#define WCD937X_ANA_MBHC_BTN5 (WCD937X_BASE_ADDRESS+0x01F) -#define WCD937X_ANA_MBHC_BTN6 (WCD937X_BASE_ADDRESS+0x020) -#define WCD937X_ANA_MBHC_BTN7 (WCD937X_BASE_ADDRESS+0x021) -#define WCD937X_ANA_MICB1 (WCD937X_BASE_ADDRESS+0x022) -#define WCD937X_ANA_MICB2 (WCD937X_BASE_ADDRESS+0x023) -#define WCD937X_ANA_MICB2_RAMP (WCD937X_BASE_ADDRESS+0x024) -#define WCD937X_ANA_MICB3 (WCD937X_BASE_ADDRESS+0x025) -#define WCD937X_BIAS_CTL (WCD937X_BASE_ADDRESS+0x028) -#define WCD937X_BIAS_VBG_FINE_ADJ (WCD937X_BASE_ADDRESS+0x029) -#define WCD937X_LDOL_VDDCX_ADJUST (WCD937X_BASE_ADDRESS+0x040) -#define WCD937X_LDOL_DISABLE_LDOL (WCD937X_BASE_ADDRESS+0x041) -#define WCD937X_MBHC_CTL_CLK (WCD937X_BASE_ADDRESS+0x056) -#define WCD937X_MBHC_CTL_ANA (WCD937X_BASE_ADDRESS+0x057) -#define WCD937X_MBHC_CTL_SPARE_1 (WCD937X_BASE_ADDRESS+0x058) -#define WCD937X_MBHC_CTL_SPARE_2 (WCD937X_BASE_ADDRESS+0x059) -#define WCD937X_MBHC_CTL_BCS (WCD937X_BASE_ADDRESS+0x05A) -#define WCD937X_MBHC_MOISTURE_DET_FSM_STATUS (WCD937X_BASE_ADDRESS+0x05B) -#define WCD937X_MBHC_TEST_CTL (WCD937X_BASE_ADDRESS+0x05C) -#define WCD937X_LDOH_MODE (WCD937X_BASE_ADDRESS+0x067) -#define WCD937X_LDOH_BIAS (WCD937X_BASE_ADDRESS+0x068) -#define WCD937X_LDOH_STB_LOADS (WCD937X_BASE_ADDRESS+0x069) -#define WCD937X_LDOH_SLOWRAMP (WCD937X_BASE_ADDRESS+0x06A) -#define WCD937X_MICB1_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x06B) -#define WCD937X_MICB1_TEST_CTL_2 (WCD937X_BASE_ADDRESS+0x06C) -#define WCD937X_MICB1_TEST_CTL_3 (WCD937X_BASE_ADDRESS+0x06D) -#define WCD937X_MICB2_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x06E) -#define WCD937X_MICB2_TEST_CTL_2 (WCD937X_BASE_ADDRESS+0x06F) -#define WCD937X_MICB2_TEST_CTL_3 (WCD937X_BASE_ADDRESS+0x070) -#define WCD937X_MICB3_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x071) -#define WCD937X_MICB3_TEST_CTL_2 (WCD937X_BASE_ADDRESS+0x072) -#define WCD937X_MICB3_TEST_CTL_3 (WCD937X_BASE_ADDRESS+0x073) -#define WCD937X_TX_COM_ADC_VCM (WCD937X_BASE_ADDRESS+0x077) -#define WCD937X_TX_COM_BIAS_ATEST (WCD937X_BASE_ADDRESS+0x078) -#define WCD937X_TX_COM_ADC_INT1_IB (WCD937X_BASE_ADDRESS+0x079) -#define WCD937X_TX_COM_ADC_INT2_IB (WCD937X_BASE_ADDRESS+0x07A) -#define WCD937X_TX_COM_TXFE_DIV_CTL (WCD937X_BASE_ADDRESS+0x07B) -#define WCD937X_TX_COM_TXFE_DIV_START (WCD937X_BASE_ADDRESS+0x07C) -#define WCD937X_TX_COM_TXFE_DIV_STOP_9P6M (WCD937X_BASE_ADDRESS+0x07D) -#define WCD937X_TX_COM_TXFE_DIV_STOP_12P288M (WCD937X_BASE_ADDRESS+0x07E) -#define WCD937X_TX_1_2_TEST_EN (WCD937X_BASE_ADDRESS+0x07F) -#define WCD937X_TX_1_2_ADC_IB (WCD937X_BASE_ADDRESS+0x080) -#define WCD937X_TX_1_2_ATEST_REFCTL (WCD937X_BASE_ADDRESS+0x081) -#define WCD937X_TX_1_2_TEST_CTL (WCD937X_BASE_ADDRESS+0x082) -#define WCD937X_TX_1_2_TEST_BLK_EN (WCD937X_BASE_ADDRESS+0x083) -#define WCD937X_TX_1_2_TXFE_CLKDIV (WCD937X_BASE_ADDRESS+0x084) -#define WCD937X_TX_1_2_SAR2_ERR (WCD937X_BASE_ADDRESS+0x085) -#define WCD937X_TX_1_2_SAR1_ERR (WCD937X_BASE_ADDRESS+0x086) -#define WCD937X_TX_3_TEST_EN (WCD937X_BASE_ADDRESS+0x087) -#define WCD937X_TX_3_ADC_IB (WCD937X_BASE_ADDRESS+0x088) -#define WCD937X_TX_3_ATEST_REFCTL (WCD937X_BASE_ADDRESS+0x089) -#define WCD937X_TX_3_TEST_CTL (WCD937X_BASE_ADDRESS+0x08A) -#define WCD937X_TX_3_TEST_BLK_EN (WCD937X_BASE_ADDRESS+0x08B) -#define WCD937X_TX_3_TXFE_CLKDIV (WCD937X_BASE_ADDRESS+0x08C) -#define WCD937X_TX_3_SPARE_MONO (WCD937X_BASE_ADDRESS+0x08D) -#define WCD937X_TX_3_SAR1_ERR (WCD937X_BASE_ADDRESS+0x08E) -#define WCD937X_CLASSH_MODE_1 (WCD937X_BASE_ADDRESS+0x097) -#define WCD937X_CLASSH_MODE_2 (WCD937X_BASE_ADDRESS+0x098) -#define WCD937X_CLASSH_MODE_3 (WCD937X_BASE_ADDRESS+0x099) -#define WCD937X_CLASSH_CTRL_VCL_1 (WCD937X_BASE_ADDRESS+0x09A) -#define WCD937X_CLASSH_CTRL_VCL_2 (WCD937X_BASE_ADDRESS+0x09B) -#define WCD937X_CLASSH_CTRL_CCL_1 (WCD937X_BASE_ADDRESS+0x09C) -#define WCD937X_CLASSH_CTRL_CCL_2 (WCD937X_BASE_ADDRESS+0x09D) -#define WCD937X_CLASSH_CTRL_CCL_3 (WCD937X_BASE_ADDRESS+0x09E) -#define WCD937X_CLASSH_CTRL_CCL_4 (WCD937X_BASE_ADDRESS+0x09F) -#define WCD937X_CLASSH_CTRL_CCL_5 (WCD937X_BASE_ADDRESS+0x0A0) -#define WCD937X_CLASSH_BUCK_TMUX_A_D (WCD937X_BASE_ADDRESS+0x0A1) -#define WCD937X_CLASSH_BUCK_SW_DRV_CNTL (WCD937X_BASE_ADDRESS+0x0A2) -#define WCD937X_CLASSH_SPARE (WCD937X_BASE_ADDRESS+0x0A3) -#define WCD937X_FLYBACK_EN (WCD937X_BASE_ADDRESS+0x0A4) -#define WCD937X_FLYBACK_VNEG_CTRL_1 (WCD937X_BASE_ADDRESS+0x0A5) -#define WCD937X_FLYBACK_VNEG_CTRL_2 (WCD937X_BASE_ADDRESS+0x0A6) -#define WCD937X_FLYBACK_VNEG_CTRL_3 (WCD937X_BASE_ADDRESS+0x0A7) -#define WCD937X_FLYBACK_VNEG_CTRL_4 (WCD937X_BASE_ADDRESS+0x0A8) -#define WCD937X_FLYBACK_VNEG_CTRL_5 (WCD937X_BASE_ADDRESS+0x0A9) -#define WCD937X_FLYBACK_VNEG_CTRL_6 (WCD937X_BASE_ADDRESS+0x0AA) -#define WCD937X_FLYBACK_VNEG_CTRL_7 (WCD937X_BASE_ADDRESS+0x0AB) -#define WCD937X_FLYBACK_VNEG_CTRL_8 (WCD937X_BASE_ADDRESS+0x0AC) -#define WCD937X_FLYBACK_VNEG_CTRL_9 (WCD937X_BASE_ADDRESS+0x0AD) -#define WCD937X_FLYBACK_VNEGDAC_CTRL_1 (WCD937X_BASE_ADDRESS+0x0AE) -#define WCD937X_FLYBACK_VNEGDAC_CTRL_2 (WCD937X_BASE_ADDRESS+0x0AF) -#define WCD937X_FLYBACK_VNEGDAC_CTRL_3 (WCD937X_BASE_ADDRESS+0x0B0) -#define WCD937X_FLYBACK_CTRL_1 (WCD937X_BASE_ADDRESS+0x0B1) -#define WCD937X_FLYBACK_TEST_CTL (WCD937X_BASE_ADDRESS+0x0B2) -#define WCD937X_RX_AUX_SW_CTL (WCD937X_BASE_ADDRESS+0x0B3) -#define WCD937X_RX_PA_AUX_IN_CONN (WCD937X_BASE_ADDRESS+0x0B4) -#define WCD937X_RX_TIMER_DIV (WCD937X_BASE_ADDRESS+0x0B5) -#define WCD937X_RX_OCP_CTL (WCD937X_BASE_ADDRESS+0x0B6) -#define WCD937X_RX_OCP_COUNT (WCD937X_BASE_ADDRESS+0x0B7) -#define WCD937X_RX_BIAS_EAR_DAC (WCD937X_BASE_ADDRESS+0x0B8) -#define WCD937X_RX_BIAS_EAR_AMP (WCD937X_BASE_ADDRESS+0x0B9) -#define WCD937X_RX_BIAS_HPH_LDO (WCD937X_BASE_ADDRESS+0x0BA) -#define WCD937X_RX_BIAS_HPH_PA (WCD937X_BASE_ADDRESS+0x0BB) -#define WCD937X_RX_BIAS_HPH_RDACBUFF_CNP2 (WCD937X_BASE_ADDRESS+0x0BC) -#define WCD937X_RX_BIAS_HPH_RDAC_LDO (WCD937X_BASE_ADDRESS+0x0BD) -#define WCD937X_RX_BIAS_HPH_CNP1 (WCD937X_BASE_ADDRESS+0x0BE) -#define WCD937X_RX_BIAS_HPH_LOWPOWER (WCD937X_BASE_ADDRESS+0x0BF) -#define WCD937X_RX_BIAS_AUX_DAC (WCD937X_BASE_ADDRESS+0x0C0) -#define WCD937X_RX_BIAS_AUX_AMP (WCD937X_BASE_ADDRESS+0x0C1) -#define WCD937X_RX_BIAS_VNEGDAC_BLEEDER (WCD937X_BASE_ADDRESS+0x0C2) -#define WCD937X_RX_BIAS_MISC (WCD937X_BASE_ADDRESS+0x0C3) -#define WCD937X_RX_BIAS_BUCK_RST (WCD937X_BASE_ADDRESS+0x0C4) -#define WCD937X_RX_BIAS_BUCK_VREF_ERRAMP (WCD937X_BASE_ADDRESS+0x0C5) -#define WCD937X_RX_BIAS_FLYB_ERRAMP (WCD937X_BASE_ADDRESS+0x0C6) -#define WCD937X_RX_BIAS_FLYB_BUFF (WCD937X_BASE_ADDRESS+0x0C7) -#define WCD937X_RX_BIAS_FLYB_MID_RST (WCD937X_BASE_ADDRESS+0x0C8) -#define WCD937X_HPH_L_STATUS (WCD937X_BASE_ADDRESS+0x0C9) -#define WCD937X_HPH_R_STATUS (WCD937X_BASE_ADDRESS+0x0CA) -#define WCD937X_HPH_CNP_EN (WCD937X_BASE_ADDRESS+0x0CB) -#define WCD937X_HPH_CNP_WG_CTL (WCD937X_BASE_ADDRESS+0x0CC) -#define WCD937X_HPH_CNP_WG_TIME (WCD937X_BASE_ADDRESS+0x0CD) -#define WCD937X_HPH_OCP_CTL (WCD937X_BASE_ADDRESS+0x0CE) -#define WCD937X_HPH_AUTO_CHOP (WCD937X_BASE_ADDRESS+0x0CF) -#define WCD937X_HPH_CHOP_CTL (WCD937X_BASE_ADDRESS+0x0D0) -#define WCD937X_HPH_PA_CTL1 (WCD937X_BASE_ADDRESS+0x0D1) -#define WCD937X_HPH_PA_CTL2 (WCD937X_BASE_ADDRESS+0x0D2) -#define WCD937X_HPH_L_EN (WCD937X_BASE_ADDRESS+0x0D3) -#define WCD937X_HPH_L_TEST (WCD937X_BASE_ADDRESS+0x0D4) -#define WCD937X_HPH_L_ATEST (WCD937X_BASE_ADDRESS+0x0D5) -#define WCD937X_HPH_R_EN (WCD937X_BASE_ADDRESS+0x0D6) -#define WCD937X_HPH_R_TEST (WCD937X_BASE_ADDRESS+0x0D7) -#define WCD937X_HPH_R_ATEST (WCD937X_BASE_ADDRESS+0x0D8) -#define WCD937X_HPH_RDAC_CLK_CTL1 (WCD937X_BASE_ADDRESS+0x0D9) -#define WCD937X_HPH_RDAC_CLK_CTL2 (WCD937X_BASE_ADDRESS+0x0DA) -#define WCD937X_HPH_RDAC_LDO_CTL (WCD937X_BASE_ADDRESS+0x0DB) -#define WCD937X_HPH_RDAC_CHOP_CLK_LP_CTL (WCD937X_BASE_ADDRESS+0x0DC) -#define WCD937X_HPH_REFBUFF_UHQA_CTL (WCD937X_BASE_ADDRESS+0x0DD) -#define WCD937X_HPH_REFBUFF_LP_CTL (WCD937X_BASE_ADDRESS+0x0DE) -#define WCD937X_HPH_L_DAC_CTL (WCD937X_BASE_ADDRESS+0x0DF) -#define WCD937X_HPH_R_DAC_CTL (WCD937X_BASE_ADDRESS+0x0E0) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_COMP_SEL (WCD937X_BASE_ADDRESS+0x0E1) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_EN (WCD937X_BASE_ADDRESS+0x0E2) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_MISC1 (WCD937X_BASE_ADDRESS+0x0E3) -#define WCD937X_HPH_SURGE_HPHLR_SURGE_STATUS (WCD937X_BASE_ADDRESS+0x0E4) -#define WCD937X_EAR_EAR_EN_REG (WCD937X_BASE_ADDRESS+0x0E9) -#define WCD937X_EAR_EAR_PA_CON (WCD937X_BASE_ADDRESS+0x0EA) -#define WCD937X_EAR_EAR_SP_CON (WCD937X_BASE_ADDRESS+0x0EB) -#define WCD937X_EAR_EAR_DAC_CON (WCD937X_BASE_ADDRESS+0x0EC) -#define WCD937X_EAR_EAR_CNP_FSM_CON (WCD937X_BASE_ADDRESS+0x0ED) -#define WCD937X_EAR_TEST_CTL (WCD937X_BASE_ADDRESS+0x0EE) -#define WCD937X_EAR_STATUS_REG_1 (WCD937X_BASE_ADDRESS+0x0EF) -#define WCD937X_EAR_STATUS_REG_2 (WCD937X_BASE_ADDRESS+0x0F0) -#define WCD937X_ANA_NEW_PAGE_REGISTER (WCD937X_BASE_ADDRESS+0x100) -#define WCD937X_HPH_NEW_ANA_HPH2 (WCD937X_BASE_ADDRESS+0x101) -#define WCD937X_HPH_NEW_ANA_HPH3 (WCD937X_BASE_ADDRESS+0x102) -#define WCD937X_SLEEP_CTL (WCD937X_BASE_ADDRESS+0x103) -#define WCD937X_SLEEP_WATCHDOG_CTL (WCD937X_BASE_ADDRESS+0x104) -#define WCD937X_MBHC_NEW_ELECT_REM_CLAMP_CTL (WCD937X_BASE_ADDRESS+0x11F) -#define WCD937X_MBHC_NEW_CTL_1 (WCD937X_BASE_ADDRESS+0x120) -#define WCD937X_MBHC_NEW_CTL_2 (WCD937X_BASE_ADDRESS+0x121) -#define WCD937X_MBHC_NEW_PLUG_DETECT_CTL (WCD937X_BASE_ADDRESS+0x122) -#define WCD937X_MBHC_NEW_ZDET_ANA_CTL (WCD937X_BASE_ADDRESS+0x123) -#define WCD937X_MBHC_NEW_ZDET_RAMP_CTL (WCD937X_BASE_ADDRESS+0x124) -#define WCD937X_MBHC_NEW_FSM_STATUS (WCD937X_BASE_ADDRESS+0x125) -#define WCD937X_MBHC_NEW_ADC_RESULT (WCD937X_BASE_ADDRESS+0x126) -#define WCD937X_TX_NEW_TX_CH2_SEL (WCD937X_BASE_ADDRESS+0x127) -#define WCD937X_AUX_AUXPA (WCD937X_BASE_ADDRESS+0x128) -#define WCD937X_LDORXTX_MODE (WCD937X_BASE_ADDRESS+0x129) -#define WCD937X_LDORXTX_CONFIG (WCD937X_BASE_ADDRESS+0x12A) -#define WCD937X_DIE_CRACK_DIE_CRK_DET_EN (WCD937X_BASE_ADDRESS+0x12C) -#define WCD937X_DIE_CRACK_DIE_CRK_DET_OUT (WCD937X_BASE_ADDRESS+0x12D) -#define WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL (WCD937X_BASE_ADDRESS+0x132) -#define WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L (WCD937X_BASE_ADDRESS+0x133) -#define WCD937X_HPH_NEW_INT_RDAC_VREF_CTL (WCD937X_BASE_ADDRESS+0x134) -#define WCD937X_HPH_NEW_INT_RDAC_OVERRIDE_CTL (WCD937X_BASE_ADDRESS+0x135) -#define WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R (WCD937X_BASE_ADDRESS+0x136) -#define WCD937X_HPH_NEW_INT_PA_MISC1 (WCD937X_BASE_ADDRESS+0x137) -#define WCD937X_HPH_NEW_INT_PA_MISC2 (WCD937X_BASE_ADDRESS+0x138) -#define WCD937X_HPH_NEW_INT_PA_RDAC_MISC (WCD937X_BASE_ADDRESS+0x139) -#define WCD937X_HPH_NEW_INT_HPH_TIMER1 (WCD937X_BASE_ADDRESS+0x13A) -#define WCD937X_HPH_NEW_INT_HPH_TIMER2 (WCD937X_BASE_ADDRESS+0x13B) -#define WCD937X_HPH_NEW_INT_HPH_TIMER3 (WCD937X_BASE_ADDRESS+0x13C) -#define WCD937X_HPH_NEW_INT_HPH_TIMER4 (WCD937X_BASE_ADDRESS+0x13D) -#define WCD937X_HPH_NEW_INT_PA_RDAC_MISC2 (WCD937X_BASE_ADDRESS+0x13E) -#define WCD937X_HPH_NEW_INT_PA_RDAC_MISC3 (WCD937X_BASE_ADDRESS+0x13F) -#define WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI (WCD937X_BASE_ADDRESS+0x145) -#define WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_ULP (WCD937X_BASE_ADDRESS+0x146) -#define WCD937X_RX_NEW_INT_HPH_RDAC_LDO_LP (WCD937X_BASE_ADDRESS+0x147) -#define WCD937X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL (WCD937X_BASE_ADDRESS+0x1AF) -#define WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL \ - (WCD937X_BASE_ADDRESS+0x1B0) -#define WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT (WCD937X_BASE_ADDRESS+0x1B1) -#define WCD937X_MBHC_NEW_INT_SPARE_2 (WCD937X_BASE_ADDRESS+0x1B2) -#define WCD937X_EAR_INT_NEW_EAR_CHOPPER_CON (WCD937X_BASE_ADDRESS+0x1B7) -#define WCD937X_EAR_INT_NEW_CNP_VCM_CON1 (WCD937X_BASE_ADDRESS+0x1B8) -#define WCD937X_EAR_INT_NEW_CNP_VCM_CON2 (WCD937X_BASE_ADDRESS+0x1B9) -#define WCD937X_EAR_INT_NEW_EAR_DYNAMIC_BIAS (WCD937X_BASE_ADDRESS+0x1BA) -#define WCD937X_AUX_INT_EN_REG (WCD937X_BASE_ADDRESS+0x1BD) -#define WCD937X_AUX_INT_PA_CTRL (WCD937X_BASE_ADDRESS+0x1BE) -#define WCD937X_AUX_INT_SP_CTRL (WCD937X_BASE_ADDRESS+0x1BF) -#define WCD937X_AUX_INT_DAC_CTRL (WCD937X_BASE_ADDRESS+0x1C0) -#define WCD937X_AUX_INT_CLK_CTRL (WCD937X_BASE_ADDRESS+0x1C1) -#define WCD937X_AUX_INT_TEST_CTRL (WCD937X_BASE_ADDRESS+0x1C2) -#define WCD937X_AUX_INT_STATUS_REG (WCD937X_BASE_ADDRESS+0x1C3) -#define WCD937X_AUX_INT_MISC (WCD937X_BASE_ADDRESS+0x1C4) -#define WCD937X_LDORXTX_INT_BIAS (WCD937X_BASE_ADDRESS+0x1C5) -#define WCD937X_LDORXTX_INT_STB_LOADS_DTEST (WCD937X_BASE_ADDRESS+0x1C6) -#define WCD937X_LDORXTX_INT_TEST0 (WCD937X_BASE_ADDRESS+0x1C7) -#define WCD937X_LDORXTX_INT_STARTUP_TIMER (WCD937X_BASE_ADDRESS+0x1C8) -#define WCD937X_LDORXTX_INT_TEST1 (WCD937X_BASE_ADDRESS+0x1C9) -#define WCD937X_LDORXTX_INT_STATUS (WCD937X_BASE_ADDRESS+0x1CA) -#define WCD937X_SLEEP_INT_WATCHDOG_CTL_1 (WCD937X_BASE_ADDRESS+0x1D0) -#define WCD937X_SLEEP_INT_WATCHDOG_CTL_2 (WCD937X_BASE_ADDRESS+0x1D1) -#define WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT1 (WCD937X_BASE_ADDRESS+0x1D3) -#define WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT2 (WCD937X_BASE_ADDRESS+0x1D4) -#define WCD937X_DIGITAL_PAGE_REGISTER (WCD937X_BASE_ADDRESS+0x400) -#define WCD937X_DIGITAL_CHIP_ID0 (WCD937X_BASE_ADDRESS+0x401) -#define WCD937X_DIGITAL_CHIP_ID1 (WCD937X_BASE_ADDRESS+0x402) -#define WCD937X_DIGITAL_CHIP_ID2 (WCD937X_BASE_ADDRESS+0x403) -#define WCD937X_DIGITAL_CHIP_ID3 (WCD937X_BASE_ADDRESS+0x404) -#define WCD937X_DIGITAL_CDC_RST_CTL (WCD937X_BASE_ADDRESS+0x406) -#define WCD937X_DIGITAL_TOP_CLK_CFG (WCD937X_BASE_ADDRESS+0x407) -#define WCD937X_DIGITAL_CDC_ANA_CLK_CTL (WCD937X_BASE_ADDRESS+0x408) -#define WCD937X_DIGITAL_CDC_DIG_CLK_CTL (WCD937X_BASE_ADDRESS+0x409) -#define WCD937X_DIGITAL_SWR_RST_EN (WCD937X_BASE_ADDRESS+0x40A) -#define WCD937X_DIGITAL_CDC_PATH_MODE (WCD937X_BASE_ADDRESS+0x40B) -#define WCD937X_DIGITAL_CDC_RX_RST (WCD937X_BASE_ADDRESS+0x40C) -#define WCD937X_DIGITAL_CDC_RX0_CTL (WCD937X_BASE_ADDRESS+0x40D) -#define WCD937X_DIGITAL_CDC_RX1_CTL (WCD937X_BASE_ADDRESS+0x40E) -#define WCD937X_DIGITAL_CDC_RX2_CTL (WCD937X_BASE_ADDRESS+0x40F) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA0 (WCD937X_BASE_ADDRESS+0x410) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA1 (WCD937X_BASE_ADDRESS+0x411) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA2 (WCD937X_BASE_ADDRESS+0x412) -#define WCD937X_DIGITAL_DEM_BYPASS_DATA3 (WCD937X_BASE_ADDRESS+0x413) -#define WCD937X_DIGITAL_CDC_COMP_CTL_0 (WCD937X_BASE_ADDRESS+0x414) -#define WCD937X_DIGITAL_CDC_RX_DELAY_CTL (WCD937X_BASE_ADDRESS+0x417) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A1_0 (WCD937X_BASE_ADDRESS+0x418) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A1_1 (WCD937X_BASE_ADDRESS+0x419) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A2_0 (WCD937X_BASE_ADDRESS+0x41A) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A2_1 (WCD937X_BASE_ADDRESS+0x41B) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A3_0 (WCD937X_BASE_ADDRESS+0x41C) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A3_1 (WCD937X_BASE_ADDRESS+0x41D) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A4_0 (WCD937X_BASE_ADDRESS+0x41E) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A4_1 (WCD937X_BASE_ADDRESS+0x41F) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A5_0 (WCD937X_BASE_ADDRESS+0x420) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A5_1 (WCD937X_BASE_ADDRESS+0x421) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A6_0 (WCD937X_BASE_ADDRESS+0x422) -#define WCD937X_DIGITAL_CDC_HPH_DSM_A7_0 (WCD937X_BASE_ADDRESS+0x423) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_0 (WCD937X_BASE_ADDRESS+0x424) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_1 (WCD937X_BASE_ADDRESS+0x425) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_2 (WCD937X_BASE_ADDRESS+0x426) -#define WCD937X_DIGITAL_CDC_HPH_DSM_C_3 (WCD937X_BASE_ADDRESS+0x427) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R1 (WCD937X_BASE_ADDRESS+0x428) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R2 (WCD937X_BASE_ADDRESS+0x429) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R3 (WCD937X_BASE_ADDRESS+0x42A) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R4 (WCD937X_BASE_ADDRESS+0x42B) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R5 (WCD937X_BASE_ADDRESS+0x42C) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R6 (WCD937X_BASE_ADDRESS+0x42D) -#define WCD937X_DIGITAL_CDC_HPH_DSM_R7 (WCD937X_BASE_ADDRESS+0x42E) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A1_0 (WCD937X_BASE_ADDRESS+0x42F) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A1_1 (WCD937X_BASE_ADDRESS+0x430) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A2_0 (WCD937X_BASE_ADDRESS+0x431) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A2_1 (WCD937X_BASE_ADDRESS+0x432) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A3_0 (WCD937X_BASE_ADDRESS+0x433) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A3_1 (WCD937X_BASE_ADDRESS+0x434) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A4_0 (WCD937X_BASE_ADDRESS+0x435) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A4_1 (WCD937X_BASE_ADDRESS+0x436) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A5_0 (WCD937X_BASE_ADDRESS+0x437) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A5_1 (WCD937X_BASE_ADDRESS+0x438) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A6_0 (WCD937X_BASE_ADDRESS+0x439) -#define WCD937X_DIGITAL_CDC_AUX_DSM_A7_0 (WCD937X_BASE_ADDRESS+0x43A) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_0 (WCD937X_BASE_ADDRESS+0x43B) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_1 (WCD937X_BASE_ADDRESS+0x43C) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_2 (WCD937X_BASE_ADDRESS+0x43D) -#define WCD937X_DIGITAL_CDC_AUX_DSM_C_3 (WCD937X_BASE_ADDRESS+0x43E) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R1 (WCD937X_BASE_ADDRESS+0x43F) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R2 (WCD937X_BASE_ADDRESS+0x440) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R3 (WCD937X_BASE_ADDRESS+0x441) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R4 (WCD937X_BASE_ADDRESS+0x442) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R5 (WCD937X_BASE_ADDRESS+0x443) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R6 (WCD937X_BASE_ADDRESS+0x444) -#define WCD937X_DIGITAL_CDC_AUX_DSM_R7 (WCD937X_BASE_ADDRESS+0x445) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_RX_0 (WCD937X_BASE_ADDRESS+0x446) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_RX_1 (WCD937X_BASE_ADDRESS+0x447) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_0 (WCD937X_BASE_ADDRESS+0x448) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_1 (WCD937X_BASE_ADDRESS+0x449) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_2 (WCD937X_BASE_ADDRESS+0x44A) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_0 (WCD937X_BASE_ADDRESS+0x44B) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_1 (WCD937X_BASE_ADDRESS+0x44C) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_2 (WCD937X_BASE_ADDRESS+0x44D) -#define WCD937X_DIGITAL_CDC_HPH_GAIN_CTL (WCD937X_BASE_ADDRESS+0x44E) -#define WCD937X_DIGITAL_CDC_AUX_GAIN_CTL (WCD937X_BASE_ADDRESS+0x44F) -#define WCD937X_DIGITAL_CDC_EAR_PATH_CTL (WCD937X_BASE_ADDRESS+0x450) -#define WCD937X_DIGITAL_CDC_SWR_CLH (WCD937X_BASE_ADDRESS+0x451) -#define WCD937X_DIGITAL_SWR_CLH_BYP (WCD937X_BASE_ADDRESS+0x452) -#define WCD937X_DIGITAL_CDC_TX0_CTL (WCD937X_BASE_ADDRESS+0x453) -#define WCD937X_DIGITAL_CDC_TX1_CTL (WCD937X_BASE_ADDRESS+0x454) -#define WCD937X_DIGITAL_CDC_TX2_CTL (WCD937X_BASE_ADDRESS+0x455) -#define WCD937X_DIGITAL_CDC_TX_RST (WCD937X_BASE_ADDRESS+0x456) -#define WCD937X_DIGITAL_CDC_REQ_CTL (WCD937X_BASE_ADDRESS+0x457) -#define WCD937X_DIGITAL_CDC_AMIC_CTL (WCD937X_BASE_ADDRESS+0x45A) -#define WCD937X_DIGITAL_CDC_DMIC_CTL (WCD937X_BASE_ADDRESS+0x45B) -#define WCD937X_DIGITAL_CDC_DMIC1_CTL (WCD937X_BASE_ADDRESS+0x45C) -#define WCD937X_DIGITAL_CDC_DMIC2_CTL (WCD937X_BASE_ADDRESS+0x45D) -#define WCD937X_DIGITAL_CDC_DMIC3_CTL (WCD937X_BASE_ADDRESS+0x45E) -#define WCD937X_DIGITAL_EFUSE_CTL (WCD937X_BASE_ADDRESS+0x45F) -#define WCD937X_DIGITAL_EFUSE_PRG_CTL (WCD937X_BASE_ADDRESS+0x460) -#define WCD937X_DIGITAL_EFUSE_TEST_CTL_0 (WCD937X_BASE_ADDRESS+0x461) -#define WCD937X_DIGITAL_EFUSE_TEST_CTL_1 (WCD937X_BASE_ADDRESS+0x462) -#define WCD937X_DIGITAL_EFUSE_T_DATA_0 (WCD937X_BASE_ADDRESS+0x463) -#define WCD937X_DIGITAL_EFUSE_T_DATA_1 (WCD937X_BASE_ADDRESS+0x464) -#define WCD937X_DIGITAL_PDM_WD_CTL0 (WCD937X_BASE_ADDRESS+0x465) -#define WCD937X_DIGITAL_PDM_WD_CTL1 (WCD937X_BASE_ADDRESS+0x466) -#define WCD937X_DIGITAL_PDM_WD_CTL2 (WCD937X_BASE_ADDRESS+0x467) -#define WCD937X_DIGITAL_INTR_MODE (WCD937X_BASE_ADDRESS+0x46A) -#define WCD937X_DIGITAL_INTR_MASK_0 (WCD937X_BASE_ADDRESS+0x46B) -#define WCD937X_DIGITAL_INTR_MASK_1 (WCD937X_BASE_ADDRESS+0x46C) -#define WCD937X_DIGITAL_INTR_MASK_2 (WCD937X_BASE_ADDRESS+0x46D) -#define WCD937X_DIGITAL_INTR_STATUS_0 (WCD937X_BASE_ADDRESS+0x46E) -#define WCD937X_DIGITAL_INTR_STATUS_1 (WCD937X_BASE_ADDRESS+0x46F) -#define WCD937X_DIGITAL_INTR_STATUS_2 (WCD937X_BASE_ADDRESS+0x470) -#define WCD937X_DIGITAL_INTR_CLEAR_0 (WCD937X_BASE_ADDRESS+0x471) -#define WCD937X_DIGITAL_INTR_CLEAR_1 (WCD937X_BASE_ADDRESS+0x472) -#define WCD937X_DIGITAL_INTR_CLEAR_2 (WCD937X_BASE_ADDRESS+0x473) -#define WCD937X_DIGITAL_INTR_LEVEL_0 (WCD937X_BASE_ADDRESS+0x474) -#define WCD937X_DIGITAL_INTR_LEVEL_1 (WCD937X_BASE_ADDRESS+0x475) -#define WCD937X_DIGITAL_INTR_LEVEL_2 (WCD937X_BASE_ADDRESS+0x476) -#define WCD937X_DIGITAL_INTR_SET_0 (WCD937X_BASE_ADDRESS+0x477) -#define WCD937X_DIGITAL_INTR_SET_1 (WCD937X_BASE_ADDRESS+0x478) -#define WCD937X_DIGITAL_INTR_SET_2 (WCD937X_BASE_ADDRESS+0x479) -#define WCD937X_DIGITAL_INTR_TEST_0 (WCD937X_BASE_ADDRESS+0x47A) -#define WCD937X_DIGITAL_INTR_TEST_1 (WCD937X_BASE_ADDRESS+0x47B) -#define WCD937X_DIGITAL_INTR_TEST_2 (WCD937X_BASE_ADDRESS+0x47C) -#define WCD937X_DIGITAL_CDC_CONN_RX0_CTL (WCD937X_BASE_ADDRESS+0x47F) -#define WCD937X_DIGITAL_CDC_CONN_RX1_CTL (WCD937X_BASE_ADDRESS+0x480) -#define WCD937X_DIGITAL_CDC_CONN_RX2_CTL (WCD937X_BASE_ADDRESS+0x481) -#define WCD937X_DIGITAL_CDC_CONN_TX_CTL (WCD937X_BASE_ADDRESS+0x482) -#define WCD937X_DIGITAL_LOOP_BACK_MODE (WCD937X_BASE_ADDRESS+0x483) -#define WCD937X_DIGITAL_SWR_DAC_TEST (WCD937X_BASE_ADDRESS+0x484) -#define WCD937X_DIGITAL_SWR_HM_TEST_RX_0 (WCD937X_BASE_ADDRESS+0x485) -#define WCD937X_DIGITAL_SWR_HM_TEST_TX_0 (WCD937X_BASE_ADDRESS+0x491) -#define WCD937X_DIGITAL_SWR_HM_TEST_RX_1 (WCD937X_BASE_ADDRESS+0x492) -#define WCD937X_DIGITAL_SWR_HM_TEST_TX_1 (WCD937X_BASE_ADDRESS+0x493) -#define WCD937X_DIGITAL_SWR_HM_TEST (WCD937X_BASE_ADDRESS+0x494) -#define WCD937X_DIGITAL_PAD_CTL_PDM_RX0 (WCD937X_BASE_ADDRESS+0x495) -#define WCD937X_DIGITAL_PAD_CTL_PDM_RX1 (WCD937X_BASE_ADDRESS+0x496) -#define WCD937X_DIGITAL_PAD_CTL_PDM_TX0 (WCD937X_BASE_ADDRESS+0x497) -#define WCD937X_DIGITAL_PAD_CTL_PDM_TX1 (WCD937X_BASE_ADDRESS+0x498) -#define WCD937X_DIGITAL_PAD_INP_DIS_0 (WCD937X_BASE_ADDRESS+0x499) -#define WCD937X_DIGITAL_PAD_INP_DIS_1 (WCD937X_BASE_ADDRESS+0x49A) -#define WCD937X_DIGITAL_DRIVE_STRENGTH_0 (WCD937X_BASE_ADDRESS+0x49B) -#define WCD937X_DIGITAL_DRIVE_STRENGTH_1 (WCD937X_BASE_ADDRESS+0x49C) -#define WCD937X_DIGITAL_DRIVE_STRENGTH_2 (WCD937X_BASE_ADDRESS+0x49D) -#define WCD937X_DIGITAL_RX_DATA_EDGE_CTL (WCD937X_BASE_ADDRESS+0x49E) -#define WCD937X_DIGITAL_TX_DATA_EDGE_CTL (WCD937X_BASE_ADDRESS+0x49F) -#define WCD937X_DIGITAL_GPIO_MODE (WCD937X_BASE_ADDRESS+0x4A0) -#define WCD937X_DIGITAL_PIN_CTL_OE (WCD937X_BASE_ADDRESS+0x4A1) -#define WCD937X_DIGITAL_PIN_CTL_DATA_0 (WCD937X_BASE_ADDRESS+0x4A2) -#define WCD937X_DIGITAL_PIN_CTL_DATA_1 (WCD937X_BASE_ADDRESS+0x4A3) -#define WCD937X_DIGITAL_PIN_STATUS_0 (WCD937X_BASE_ADDRESS+0x4A4) -#define WCD937X_DIGITAL_PIN_STATUS_1 (WCD937X_BASE_ADDRESS+0x4A5) -#define WCD937X_DIGITAL_DIG_DEBUG_CTL (WCD937X_BASE_ADDRESS+0x4A6) -#define WCD937X_DIGITAL_DIG_DEBUG_EN (WCD937X_BASE_ADDRESS+0x4A7) -#define WCD937X_DIGITAL_ANA_CSR_DBG_ADD (WCD937X_BASE_ADDRESS+0x4A8) -#define WCD937X_DIGITAL_ANA_CSR_DBG_CTL (WCD937X_BASE_ADDRESS+0x4A9) -#define WCD937X_DIGITAL_SSP_DBG (WCD937X_BASE_ADDRESS+0x4AA) -#define WCD937X_DIGITAL_MODE_STATUS_0 (WCD937X_BASE_ADDRESS+0x4AB) -#define WCD937X_DIGITAL_MODE_STATUS_1 (WCD937X_BASE_ADDRESS+0x4AC) -#define WCD937X_DIGITAL_SPARE_0 (WCD937X_BASE_ADDRESS+0x4AD) -#define WCD937X_DIGITAL_SPARE_1 (WCD937X_BASE_ADDRESS+0x4AE) -#define WCD937X_DIGITAL_SPARE_2 (WCD937X_BASE_ADDRESS+0x4AF) -#define WCD937X_DIGITAL_EFUSE_REG_0 (WCD937X_BASE_ADDRESS+0x4B0) -#define WCD937X_DIGITAL_EFUSE_REG_1 (WCD937X_BASE_ADDRESS+0x4B1) -#define WCD937X_DIGITAL_EFUSE_REG_2 (WCD937X_BASE_ADDRESS+0x4B2) -#define WCD937X_DIGITAL_EFUSE_REG_3 (WCD937X_BASE_ADDRESS+0x4B3) -#define WCD937X_DIGITAL_EFUSE_REG_4 (WCD937X_BASE_ADDRESS+0x4B4) -#define WCD937X_DIGITAL_EFUSE_REG_5 (WCD937X_BASE_ADDRESS+0x4B5) -#define WCD937X_DIGITAL_EFUSE_REG_6 (WCD937X_BASE_ADDRESS+0x4B6) -#define WCD937X_DIGITAL_EFUSE_REG_7 (WCD937X_BASE_ADDRESS+0x4B7) -#define WCD937X_DIGITAL_EFUSE_REG_8 (WCD937X_BASE_ADDRESS+0x4B8) -#define WCD937X_DIGITAL_EFUSE_REG_9 (WCD937X_BASE_ADDRESS+0x4B9) -#define WCD937X_DIGITAL_EFUSE_REG_10 (WCD937X_BASE_ADDRESS+0x4BA) -#define WCD937X_DIGITAL_EFUSE_REG_11 (WCD937X_BASE_ADDRESS+0x4BB) -#define WCD937X_DIGITAL_EFUSE_REG_12 (WCD937X_BASE_ADDRESS+0x4BC) -#define WCD937X_DIGITAL_EFUSE_REG_13 (WCD937X_BASE_ADDRESS+0x4BD) -#define WCD937X_DIGITAL_EFUSE_REG_14 (WCD937X_BASE_ADDRESS+0x4BE) -#define WCD937X_DIGITAL_EFUSE_REG_15 (WCD937X_BASE_ADDRESS+0x4BF) -#define WCD937X_DIGITAL_EFUSE_REG_16 (WCD937X_BASE_ADDRESS+0x4C0) -#define WCD937X_DIGITAL_EFUSE_REG_17 (WCD937X_BASE_ADDRESS+0x4C1) -#define WCD937X_DIGITAL_EFUSE_REG_18 (WCD937X_BASE_ADDRESS+0x4C2) -#define WCD937X_DIGITAL_EFUSE_REG_19 (WCD937X_BASE_ADDRESS+0x4C3) -#define WCD937X_DIGITAL_EFUSE_REG_20 (WCD937X_BASE_ADDRESS+0x4C4) -#define WCD937X_DIGITAL_EFUSE_REG_21 (WCD937X_BASE_ADDRESS+0x4C5) -#define WCD937X_DIGITAL_EFUSE_REG_22 (WCD937X_BASE_ADDRESS+0x4C6) -#define WCD937X_DIGITAL_EFUSE_REG_23 (WCD937X_BASE_ADDRESS+0x4C7) -#define WCD937X_DIGITAL_EFUSE_REG_24 (WCD937X_BASE_ADDRESS+0x4C8) -#define WCD937X_DIGITAL_EFUSE_REG_25 (WCD937X_BASE_ADDRESS+0x4C9) -#define WCD937X_DIGITAL_EFUSE_REG_26 (WCD937X_BASE_ADDRESS+0x4CA) -#define WCD937X_DIGITAL_EFUSE_REG_27 (WCD937X_BASE_ADDRESS+0x4CB) -#define WCD937X_DIGITAL_EFUSE_REG_28 (WCD937X_BASE_ADDRESS+0x4CC) -#define WCD937X_DIGITAL_EFUSE_REG_29 (WCD937X_BASE_ADDRESS+0x4CD) -#define WCD937X_DIGITAL_EFUSE_REG_30 (WCD937X_BASE_ADDRESS+0x4CE) -#define WCD937X_DIGITAL_EFUSE_REG_31 (WCD937X_BASE_ADDRESS+0x4CF) - -#define WCD937X_REGISTERS_MAX_SIZE (WCD937X_BASE_ADDRESS+0x4D0) -#define WCD937X_MAX_REGISTER (WCD937X_REGISTERS_MAX_SIZE - 1) - -#endif diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x-regmap.c b/techpack/audio/asoc/codecs/wcd937x/wcd937x-regmap.c deleted file mode 100644 index b16a5fd0836e..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x-regmap.c +++ /dev/null @@ -1,472 +0,0 @@ -/* - * Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "wcd937x-registers.h" - -extern const u8 wcd937x_reg_access[WCD937X_REGISTERS_MAX_SIZE]; - -static const struct reg_default wcd937x_defaults[] = { - { WCD937X_ANA_BIAS, 0x00 }, - { WCD937X_ANA_RX_SUPPLIES, 0x00 }, - { WCD937X_ANA_HPH, 0x0C }, - { WCD937X_ANA_EAR, 0x00 }, - { WCD937X_ANA_EAR_COMPANDER_CTL, 0x02 }, - { WCD937X_ANA_TX_CH1, 0x20 }, - { WCD937X_ANA_TX_CH2, 0x00 }, - { WCD937X_ANA_TX_CH3, 0x20 }, - { WCD937X_ANA_TX_CH3_HPF, 0x00 }, - { WCD937X_ANA_MICB1_MICB2_DSP_EN_LOGIC, 0x00 }, - { WCD937X_ANA_MICB3_DSP_EN_LOGIC, 0x00 }, - { WCD937X_ANA_MBHC_MECH, 0x39 }, - { WCD937X_ANA_MBHC_ELECT, 0x08 }, - { WCD937X_ANA_MBHC_ZDET, 0x00 }, - { WCD937X_ANA_MBHC_RESULT_1, 0x00 }, - { WCD937X_ANA_MBHC_RESULT_2, 0x00 }, - { WCD937X_ANA_MBHC_RESULT_3, 0x00 }, - { WCD937X_ANA_MBHC_BTN0, 0x00 }, - { WCD937X_ANA_MBHC_BTN1, 0x10 }, - { WCD937X_ANA_MBHC_BTN2, 0x20 }, - { WCD937X_ANA_MBHC_BTN3, 0x30 }, - { WCD937X_ANA_MBHC_BTN4, 0x40 }, - { WCD937X_ANA_MBHC_BTN5, 0x50 }, - { WCD937X_ANA_MBHC_BTN6, 0x60 }, - { WCD937X_ANA_MBHC_BTN7, 0x70 }, - { WCD937X_ANA_MICB1, 0x10 }, - { WCD937X_ANA_MICB2, 0x10 }, - { WCD937X_ANA_MICB2_RAMP, 0x00 }, - { WCD937X_ANA_MICB3, 0x10 }, - { WCD937X_BIAS_CTL, 0x2A }, - { WCD937X_BIAS_VBG_FINE_ADJ, 0x55 }, - { WCD937X_LDOL_VDDCX_ADJUST, 0x01 }, - { WCD937X_LDOL_DISABLE_LDOL, 0x00 }, - { WCD937X_MBHC_CTL_CLK, 0x00 }, - { WCD937X_MBHC_CTL_ANA, 0x00 }, - { WCD937X_MBHC_CTL_SPARE_1, 0x00 }, - { WCD937X_MBHC_CTL_SPARE_2, 0x00 }, - { WCD937X_MBHC_CTL_BCS, 0x00 }, - { WCD937X_MBHC_MOISTURE_DET_FSM_STATUS, 0x00 }, - { WCD937X_MBHC_TEST_CTL, 0x00 }, - { WCD937X_LDOH_MODE, 0x2B }, - { WCD937X_LDOH_BIAS, 0x68 }, - { WCD937X_LDOH_STB_LOADS, 0x00 }, - { WCD937X_LDOH_SLOWRAMP, 0x50 }, - { WCD937X_MICB1_TEST_CTL_1, 0x1A }, - { WCD937X_MICB1_TEST_CTL_2, 0x18 }, - { WCD937X_MICB1_TEST_CTL_3, 0xA4 }, - { WCD937X_MICB2_TEST_CTL_1, 0x1A }, - { WCD937X_MICB2_TEST_CTL_2, 0x18 }, - { WCD937X_MICB2_TEST_CTL_3, 0xA4 }, - { WCD937X_MICB3_TEST_CTL_1, 0x1A }, - { WCD937X_MICB3_TEST_CTL_2, 0x18 }, - { WCD937X_MICB3_TEST_CTL_3, 0xA4 }, - { WCD937X_TX_COM_ADC_VCM, 0x39 }, - { WCD937X_TX_COM_BIAS_ATEST, 0xC0 }, - { WCD937X_TX_COM_ADC_INT1_IB, 0x6F }, - { WCD937X_TX_COM_ADC_INT2_IB, 0x4F }, - { WCD937X_TX_COM_TXFE_DIV_CTL, 0x2E }, - { WCD937X_TX_COM_TXFE_DIV_START, 0x00 }, - { WCD937X_TX_COM_TXFE_DIV_STOP_9P6M, 0xC7 }, - { WCD937X_TX_COM_TXFE_DIV_STOP_12P288M, 0xFF }, - { WCD937X_TX_1_2_TEST_EN, 0xCC }, - { WCD937X_TX_1_2_ADC_IB, 0x09 }, - { WCD937X_TX_1_2_ATEST_REFCTL, 0x0A }, - { WCD937X_TX_1_2_TEST_CTL, 0x38 }, - { WCD937X_TX_1_2_TEST_BLK_EN, 0xFF }, - { WCD937X_TX_1_2_TXFE_CLKDIV, 0x00 }, - { WCD937X_TX_1_2_SAR2_ERR, 0x00 }, - { WCD937X_TX_1_2_SAR1_ERR, 0x00 }, - { WCD937X_TX_3_TEST_EN, 0xCC }, - { WCD937X_TX_3_ADC_IB, 0x09 }, - { WCD937X_TX_3_ATEST_REFCTL, 0x0A }, - { WCD937X_TX_3_TEST_CTL, 0x38 }, - { WCD937X_TX_3_TEST_BLK_EN, 0xFF }, - { WCD937X_TX_3_TXFE_CLKDIV, 0x00 }, - { WCD937X_TX_3_SPARE_MONO, 0x00 }, - { WCD937X_TX_3_SAR1_ERR, 0x00 }, - { WCD937X_CLASSH_MODE_1, 0x40 }, - { WCD937X_CLASSH_MODE_2, 0x3A }, - { WCD937X_CLASSH_MODE_3, 0x00 }, - { WCD937X_CLASSH_CTRL_VCL_1, 0x70 }, - { WCD937X_CLASSH_CTRL_VCL_2, 0x82 }, - { WCD937X_CLASSH_CTRL_CCL_1, 0x31 }, - { WCD937X_CLASSH_CTRL_CCL_2, 0x80 }, - { WCD937X_CLASSH_CTRL_CCL_3, 0x80 }, - { WCD937X_CLASSH_CTRL_CCL_4, 0x51 }, - { WCD937X_CLASSH_CTRL_CCL_5, 0x00 }, - { WCD937X_CLASSH_BUCK_TMUX_A_D, 0x00 }, - { WCD937X_CLASSH_BUCK_SW_DRV_CNTL, 0x77 }, - { WCD937X_CLASSH_SPARE, 0x00 }, - { WCD937X_FLYBACK_EN, 0x4E }, - { WCD937X_FLYBACK_VNEG_CTRL_1, 0x0B }, - { WCD937X_FLYBACK_VNEG_CTRL_2, 0x45 }, - { WCD937X_FLYBACK_VNEG_CTRL_3, 0x74 }, - { WCD937X_FLYBACK_VNEG_CTRL_4, 0x7F }, - { WCD937X_FLYBACK_VNEG_CTRL_5, 0x83 }, - { WCD937X_FLYBACK_VNEG_CTRL_6, 0x98 }, - { WCD937X_FLYBACK_VNEG_CTRL_7, 0xA9 }, - { WCD937X_FLYBACK_VNEG_CTRL_8, 0x68 }, - { WCD937X_FLYBACK_VNEG_CTRL_9, 0x64 }, - { WCD937X_FLYBACK_VNEGDAC_CTRL_1, 0xED }, - { WCD937X_FLYBACK_VNEGDAC_CTRL_2, 0xF0 }, - { WCD937X_FLYBACK_VNEGDAC_CTRL_3, 0xA6 }, - { WCD937X_FLYBACK_CTRL_1, 0x65 }, - { WCD937X_FLYBACK_TEST_CTL, 0x00 }, - { WCD937X_RX_AUX_SW_CTL, 0x00 }, - { WCD937X_RX_PA_AUX_IN_CONN, 0x00 }, - { WCD937X_RX_TIMER_DIV, 0x32 }, - { WCD937X_RX_OCP_CTL, 0x1F }, - { WCD937X_RX_OCP_COUNT, 0x77 }, - { WCD937X_RX_BIAS_EAR_DAC, 0xA0 }, - { WCD937X_RX_BIAS_EAR_AMP, 0xAA }, - { WCD937X_RX_BIAS_HPH_LDO, 0xA9 }, - { WCD937X_RX_BIAS_HPH_PA, 0xAA }, - { WCD937X_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A }, - { WCD937X_RX_BIAS_HPH_RDAC_LDO, 0x88 }, - { WCD937X_RX_BIAS_HPH_CNP1, 0x82 }, - { WCD937X_RX_BIAS_HPH_LOWPOWER, 0x82 }, - { WCD937X_RX_BIAS_AUX_DAC, 0xA0 }, - { WCD937X_RX_BIAS_AUX_AMP, 0xAA }, - { WCD937X_RX_BIAS_VNEGDAC_BLEEDER, 0x50 }, - { WCD937X_RX_BIAS_MISC, 0x00 }, - { WCD937X_RX_BIAS_BUCK_RST, 0x08 }, - { WCD937X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44 }, - { WCD937X_RX_BIAS_FLYB_ERRAMP, 0x40 }, - { WCD937X_RX_BIAS_FLYB_BUFF, 0xAA }, - { WCD937X_RX_BIAS_FLYB_MID_RST, 0x14 }, - { WCD937X_HPH_L_STATUS, 0x04 }, - { WCD937X_HPH_R_STATUS, 0x04 }, - { WCD937X_HPH_CNP_EN, 0x80 }, - { WCD937X_HPH_CNP_WG_CTL, 0x9A }, - { WCD937X_HPH_CNP_WG_TIME, 0x14 }, - { WCD937X_HPH_OCP_CTL, 0x28 }, - { WCD937X_HPH_AUTO_CHOP, 0x16 }, - { WCD937X_HPH_CHOP_CTL, 0x83 }, - { WCD937X_HPH_PA_CTL1, 0x46 }, - { WCD937X_HPH_PA_CTL2, 0x50 }, - { WCD937X_HPH_L_EN, 0x80 }, - { WCD937X_HPH_L_TEST, 0xE0 }, - { WCD937X_HPH_L_ATEST, 0x50 }, - { WCD937X_HPH_R_EN, 0x80 }, - { WCD937X_HPH_R_TEST, 0xE0 }, - { WCD937X_HPH_R_ATEST, 0x54 }, - { WCD937X_HPH_RDAC_CLK_CTL1, 0x99 }, - { WCD937X_HPH_RDAC_CLK_CTL2, 0x9B }, - { WCD937X_HPH_RDAC_LDO_CTL, 0x33 }, - { WCD937X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00 }, - { WCD937X_HPH_REFBUFF_UHQA_CTL, 0xA8 }, - { WCD937X_HPH_REFBUFF_LP_CTL, 0x0E }, - { WCD937X_HPH_L_DAC_CTL, 0x20 }, - { WCD937X_HPH_R_DAC_CTL, 0x20 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_COMP_SEL, 0x55 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0x19 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_MISC1, 0xA0 }, - { WCD937X_HPH_SURGE_HPHLR_SURGE_STATUS, 0x00 }, - { WCD937X_EAR_EAR_EN_REG, 0x22 }, - { WCD937X_EAR_EAR_PA_CON, 0x44 }, - { WCD937X_EAR_EAR_SP_CON, 0xDB }, - { WCD937X_EAR_EAR_DAC_CON, 0x80 }, - { WCD937X_EAR_EAR_CNP_FSM_CON, 0xB2 }, - { WCD937X_EAR_TEST_CTL, 0x00 }, - { WCD937X_EAR_STATUS_REG_1, 0x00 }, - { WCD937X_EAR_STATUS_REG_2, 0x00 }, - { WCD937X_ANA_NEW_PAGE_REGISTER, 0x00 }, - { WCD937X_HPH_NEW_ANA_HPH2, 0x00 }, - { WCD937X_HPH_NEW_ANA_HPH3, 0x00 }, - { WCD937X_SLEEP_CTL, 0x16 }, - { WCD937X_SLEEP_WATCHDOG_CTL, 0x00 }, - { WCD937X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00 }, - { WCD937X_MBHC_NEW_CTL_1, 0x02 }, - { WCD937X_MBHC_NEW_CTL_2, 0x05 }, - { WCD937X_MBHC_NEW_PLUG_DETECT_CTL, 0xE9 }, - { WCD937X_MBHC_NEW_ZDET_ANA_CTL, 0x0F }, - { WCD937X_MBHC_NEW_ZDET_RAMP_CTL, 0x00 }, - { WCD937X_MBHC_NEW_FSM_STATUS, 0x00 }, - { WCD937X_MBHC_NEW_ADC_RESULT, 0x00 }, - { WCD937X_TX_NEW_TX_CH2_SEL, 0x00 }, - { WCD937X_AUX_AUXPA, 0x00 }, - { WCD937X_LDORXTX_MODE, 0x0C }, - { WCD937X_LDORXTX_CONFIG, 0x10 }, - { WCD937X_DIE_CRACK_DIE_CRK_DET_EN, 0x00 }, - { WCD937X_DIE_CRACK_DIE_CRK_DET_OUT, 0x00 }, - { WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40 }, - { WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81 }, - { WCD937X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10 }, - { WCD937X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00 }, - { WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81 }, - { WCD937X_HPH_NEW_INT_PA_MISC1, 0x22 }, - { WCD937X_HPH_NEW_INT_PA_MISC2, 0x00 }, - { WCD937X_HPH_NEW_INT_PA_RDAC_MISC, 0x00 }, - { WCD937X_HPH_NEW_INT_HPH_TIMER1, 0xFE }, - { WCD937X_HPH_NEW_INT_HPH_TIMER2, 0x02 }, - { WCD937X_HPH_NEW_INT_HPH_TIMER3, 0x4E }, - { WCD937X_HPH_NEW_INT_HPH_TIMER4, 0x54 }, - { WCD937X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00 }, - { WCD937X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00 }, - { WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62 }, - { WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01 }, - { WCD937X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11 }, - { WCD937X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57 }, - { WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01 }, - { WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00 }, - { WCD937X_MBHC_NEW_INT_SPARE_2, 0x00 }, - { WCD937X_EAR_INT_NEW_EAR_CHOPPER_CON, 0xA8 }, - { WCD937X_EAR_INT_NEW_CNP_VCM_CON1, 0x42 }, - { WCD937X_EAR_INT_NEW_CNP_VCM_CON2, 0x22 }, - { WCD937X_EAR_INT_NEW_EAR_DYNAMIC_BIAS, 0x00 }, - { WCD937X_AUX_INT_EN_REG, 0x00 }, - { WCD937X_AUX_INT_PA_CTRL, 0x06 }, - { WCD937X_AUX_INT_SP_CTRL, 0xD2 }, - { WCD937X_AUX_INT_DAC_CTRL, 0x80 }, - { WCD937X_AUX_INT_CLK_CTRL, 0x50 }, - { WCD937X_AUX_INT_TEST_CTRL, 0x00 }, - { WCD937X_AUX_INT_STATUS_REG, 0x00 }, - { WCD937X_AUX_INT_MISC, 0x00 }, - { WCD937X_LDORXTX_INT_BIAS, 0x6E }, - { WCD937X_LDORXTX_INT_STB_LOADS_DTEST, 0x50 }, - { WCD937X_LDORXTX_INT_TEST0, 0x1C }, - { WCD937X_LDORXTX_INT_STARTUP_TIMER, 0xFF }, - { WCD937X_LDORXTX_INT_TEST1, 0x1F }, - { WCD937X_LDORXTX_INT_STATUS, 0x00 }, - { WCD937X_SLEEP_INT_WATCHDOG_CTL_1, 0x0A }, - { WCD937X_SLEEP_INT_WATCHDOG_CTL_2, 0x0A }, - { WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT1, 0x02 }, - { WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT2, 0x60 }, - { WCD937X_DIGITAL_PAGE_REGISTER, 0x00 }, - { WCD937X_DIGITAL_CHIP_ID0, 0x01 }, - { WCD937X_DIGITAL_CHIP_ID1, 0x00 }, - { WCD937X_DIGITAL_CHIP_ID2, 0x0A }, - { WCD937X_DIGITAL_CHIP_ID3, 0x01 }, - { WCD937X_DIGITAL_CDC_RST_CTL, 0x03 }, - { WCD937X_DIGITAL_TOP_CLK_CFG, 0x00 }, - { WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0x00 }, - { WCD937X_DIGITAL_SWR_RST_EN, 0x00 }, - { WCD937X_DIGITAL_CDC_PATH_MODE, 0x55 }, - { WCD937X_DIGITAL_CDC_RX_RST, 0x00 }, - { WCD937X_DIGITAL_CDC_RX0_CTL, 0xFC }, - { WCD937X_DIGITAL_CDC_RX1_CTL, 0xFC }, - { WCD937X_DIGITAL_CDC_RX2_CTL, 0xFC }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA0, 0x55 }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA1, 0x55 }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA2, 0x55 }, - { WCD937X_DIGITAL_DEM_BYPASS_DATA3, 0x01 }, - { WCD937X_DIGITAL_CDC_COMP_CTL_0, 0x00 }, - { WCD937X_DIGITAL_CDC_RX_DELAY_CTL, 0x66 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A1_0, 0x00 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A1_1, 0x01 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A2_0, 0x63 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A2_1, 0x04 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A3_0, 0xAC }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A3_1, 0x04 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A4_0, 0x1A }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A4_1, 0x03 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A5_0, 0xBC }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A5_1, 0x02 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A6_0, 0xC7 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_A7_0, 0xF8 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_0, 0x47 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_1, 0x43 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_2, 0xB1 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_C_3, 0x17 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R1, 0x4B }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R2, 0x26 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R3, 0x32 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R4, 0x57 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R5, 0x63 }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R6, 0x7C }, - { WCD937X_DIGITAL_CDC_HPH_DSM_R7, 0x57 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A1_0, 0x00 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A1_1, 0x01 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A2_0, 0x96 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A2_1, 0x09 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A3_0, 0xAB }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A3_1, 0x05 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A4_0, 0x1C }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A4_1, 0x02 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A5_0, 0x17 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A5_1, 0x02 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A6_0, 0xAA }, - { WCD937X_DIGITAL_CDC_AUX_DSM_A7_0, 0xE3 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_0, 0x69 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_1, 0x54 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_2, 0x02 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_C_3, 0x15 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R1, 0xA4 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R2, 0xB5 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R3, 0x86 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R4, 0x85 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R5, 0xAA }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R6, 0xE2 }, - { WCD937X_DIGITAL_CDC_AUX_DSM_R7, 0x62 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_RX_0, 0x55 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_RX_1, 0xA9 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_0, 0x3D }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_1, 0x2E }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_2, 0x01 }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_0, 0x00 }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_1, 0xFC }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_2, 0x01 }, - { WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_AUX_GAIN_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_EAR_PATH_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_SWR_CLH, 0x00 }, - { WCD937X_DIGITAL_SWR_CLH_BYP, 0x00 }, - { WCD937X_DIGITAL_CDC_TX0_CTL, 0x68 }, - { WCD937X_DIGITAL_CDC_TX1_CTL, 0x68 }, - { WCD937X_DIGITAL_CDC_TX2_CTL, 0x68 }, - { WCD937X_DIGITAL_CDC_TX_RST, 0x00 }, - { WCD937X_DIGITAL_CDC_REQ_CTL, 0x01 }, - { WCD937X_DIGITAL_CDC_AMIC_CTL, 0x07 }, - { WCD937X_DIGITAL_CDC_DMIC_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_DMIC1_CTL, 0x01 }, - { WCD937X_DIGITAL_CDC_DMIC2_CTL, 0x01 }, - { WCD937X_DIGITAL_CDC_DMIC3_CTL, 0x01 }, - { WCD937X_DIGITAL_EFUSE_CTL, 0x2B }, - { WCD937X_DIGITAL_EFUSE_PRG_CTL, 0x00 }, - { WCD937X_DIGITAL_EFUSE_TEST_CTL_0, 0x00 }, - { WCD937X_DIGITAL_EFUSE_TEST_CTL_1, 0x00 }, - { WCD937X_DIGITAL_EFUSE_T_DATA_0, 0x00 }, - { WCD937X_DIGITAL_EFUSE_T_DATA_1, 0x00 }, - { WCD937X_DIGITAL_PDM_WD_CTL0, 0x00 }, - { WCD937X_DIGITAL_PDM_WD_CTL1, 0x00 }, - { WCD937X_DIGITAL_PDM_WD_CTL2, 0x00 }, - { WCD937X_DIGITAL_INTR_MODE, 0x00 }, - { WCD937X_DIGITAL_INTR_MASK_0, 0xFF }, - { WCD937X_DIGITAL_INTR_MASK_1, 0xFF }, - { WCD937X_DIGITAL_INTR_MASK_2, 0x0F }, - { WCD937X_DIGITAL_INTR_STATUS_0, 0x00 }, - { WCD937X_DIGITAL_INTR_STATUS_1, 0x00 }, - { WCD937X_DIGITAL_INTR_STATUS_2, 0x00 }, - { WCD937X_DIGITAL_INTR_CLEAR_0, 0x00 }, - { WCD937X_DIGITAL_INTR_CLEAR_1, 0x00 }, - { WCD937X_DIGITAL_INTR_CLEAR_2, 0x00 }, - { WCD937X_DIGITAL_INTR_LEVEL_0, 0x00 }, - { WCD937X_DIGITAL_INTR_LEVEL_1, 0x00 }, - { WCD937X_DIGITAL_INTR_LEVEL_2, 0x00 }, - { WCD937X_DIGITAL_INTR_SET_0, 0x00 }, - { WCD937X_DIGITAL_INTR_SET_1, 0x00 }, - { WCD937X_DIGITAL_INTR_SET_2, 0x00 }, - { WCD937X_DIGITAL_INTR_TEST_0, 0x00 }, - { WCD937X_DIGITAL_INTR_TEST_1, 0x00 }, - { WCD937X_DIGITAL_INTR_TEST_2, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_RX0_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_RX1_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_RX2_CTL, 0x00 }, - { WCD937X_DIGITAL_CDC_CONN_TX_CTL, 0x00 }, - { WCD937X_DIGITAL_LOOP_BACK_MODE, 0x00 }, - { WCD937X_DIGITAL_SWR_DAC_TEST, 0x00 }, - { WCD937X_DIGITAL_SWR_HM_TEST_RX_0, 0x40 }, - { WCD937X_DIGITAL_SWR_HM_TEST_TX_0, 0x40 }, - { WCD937X_DIGITAL_SWR_HM_TEST_RX_1, 0x00 }, - { WCD937X_DIGITAL_SWR_HM_TEST_TX_1, 0x00 }, - { WCD937X_DIGITAL_SWR_HM_TEST, 0x00 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_RX0, 0xF1 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_RX1, 0xF1 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_TX0, 0xF1 }, - { WCD937X_DIGITAL_PAD_CTL_PDM_TX1, 0xF1 }, - { WCD937X_DIGITAL_PAD_INP_DIS_0, 0x00 }, - { WCD937X_DIGITAL_PAD_INP_DIS_1, 0x00 }, - { WCD937X_DIGITAL_DRIVE_STRENGTH_0, 0x00 }, - { WCD937X_DIGITAL_DRIVE_STRENGTH_1, 0x00 }, - { WCD937X_DIGITAL_DRIVE_STRENGTH_2, 0x00 }, - { WCD937X_DIGITAL_RX_DATA_EDGE_CTL, 0x1F }, - { WCD937X_DIGITAL_TX_DATA_EDGE_CTL, 0x10 }, - { WCD937X_DIGITAL_GPIO_MODE, 0x00 }, - { WCD937X_DIGITAL_PIN_CTL_OE, 0x00 }, - { WCD937X_DIGITAL_PIN_CTL_DATA_0, 0x00 }, - { WCD937X_DIGITAL_PIN_CTL_DATA_1, 0x00 }, - { WCD937X_DIGITAL_PIN_STATUS_0, 0x00 }, - { WCD937X_DIGITAL_PIN_STATUS_1, 0x00 }, - { WCD937X_DIGITAL_DIG_DEBUG_CTL, 0x00 }, - { WCD937X_DIGITAL_DIG_DEBUG_EN, 0x00 }, - { WCD937X_DIGITAL_ANA_CSR_DBG_ADD, 0x00 }, - { WCD937X_DIGITAL_ANA_CSR_DBG_CTL, 0x48 }, - { WCD937X_DIGITAL_SSP_DBG, 0x00 }, - { WCD937X_DIGITAL_MODE_STATUS_0, 0x00 }, - { WCD937X_DIGITAL_MODE_STATUS_1, 0x00 }, - { WCD937X_DIGITAL_SPARE_0, 0x00 }, - { WCD937X_DIGITAL_SPARE_1, 0x00 }, - { WCD937X_DIGITAL_SPARE_2, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_0, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_1, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_2, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_3, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_4, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_5, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_6, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_7, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_8, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_9, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_10, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_11, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_12, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_13, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_14, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_15, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_16, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_17, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_18, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_19, 0xFF }, - { WCD937X_DIGITAL_EFUSE_REG_20, 0x0E }, - { WCD937X_DIGITAL_EFUSE_REG_21, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_22, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_23, 0xF8 }, - { WCD937X_DIGITAL_EFUSE_REG_24, 0x16 }, - { WCD937X_DIGITAL_EFUSE_REG_25, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_26, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_27, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_28, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_29, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_30, 0x00 }, - { WCD937X_DIGITAL_EFUSE_REG_31, 0x00 }, -}; - -static bool wcd937x_readable_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD937X_BASE_ADDRESS) - return 0; - return wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG; -} - -static bool wcd937x_writeable_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD937X_BASE_ADDRESS) - return 0; - return wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG; -} - -static bool wcd937x_volatile_register(struct device *dev, unsigned int reg) -{ - if(reg <= WCD937X_BASE_ADDRESS) - return 0; - if ((wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG) - && !(wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG)) - return true; - return false; -} - -struct regmap_config wcd937x_regmap_config = { - .name = "wcd937x_csr", - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wcd937x_defaults, - .num_reg_defaults = ARRAY_SIZE(wcd937x_defaults), - .max_register = WCD937X_MAX_REGISTER, - .readable_reg = wcd937x_readable_register, - .writeable_reg = wcd937x_writeable_register, - .volatile_reg = wcd937x_volatile_register, - .can_multi_write = true, -}; diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x-tables.c b/techpack/audio/asoc/codecs/wcd937x/wcd937x-tables.c deleted file mode 100644 index d39a5a3b3af4..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x-tables.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "wcd937x-registers.h" - -const u8 wcd937x_reg_access[WCD937X_REG(WCD937X_REGISTERS_MAX_SIZE)] = { - [WCD937X_REG(WCD937X_ANA_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_RX_SUPPLIES)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_HPH)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_EAR)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_EAR_COMPANDER_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_TX_CH3_HPF)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB1_MICB2_DSP_EN_LOGIC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB3_DSP_EN_LOGIC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_MECH)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_ELECT)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_ZDET)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_RESULT_1)] = RD_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_RESULT_2)] = RD_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_RESULT_3)] = RD_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MBHC_BTN7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB2_RAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_ANA_MICB3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_BIAS_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_BIAS_VBG_FINE_ADJ)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOL_VDDCX_ADJUST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOL_DISABLE_LDOL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_CLK)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_ANA)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_SPARE_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_SPARE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_CTL_BCS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_MOISTURE_DET_FSM_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_MBHC_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_STB_LOADS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDOH_SLOWRAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB1_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB1_TEST_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB1_TEST_CTL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB2_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB2_TEST_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB2_TEST_CTL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB3_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB3_TEST_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MICB3_TEST_CTL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_ADC_VCM)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_BIAS_ATEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_ADC_INT1_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_ADC_INT2_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_START)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_STOP_9P6M)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_COM_TXFE_DIV_STOP_12P288M)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TEST_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_ADC_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_ATEST_REFCTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TEST_BLK_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_TXFE_CLKDIV)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_1_2_SAR2_ERR)] = RD_REG, - [WCD937X_REG(WCD937X_TX_1_2_SAR1_ERR)] = RD_REG, - [WCD937X_REG(WCD937X_TX_3_TEST_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_ADC_IB)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_ATEST_REFCTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_TEST_BLK_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_TXFE_CLKDIV)] = RD_WR_REG, - [WCD937X_REG(WCD937X_TX_3_SPARE_MONO)] = RD_REG, - [WCD937X_REG(WCD937X_TX_3_SAR1_ERR)] = RD_REG, - [WCD937X_REG(WCD937X_CLASSH_MODE_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_MODE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_MODE_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_VCL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_VCL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_CTRL_CCL_5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_BUCK_TMUX_A_D)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_BUCK_SW_DRV_CNTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_CLASSH_SPARE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_8)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEG_CTRL_9)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEGDAC_CTRL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEGDAC_CTRL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_VNEGDAC_CTRL_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_CTRL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_FLYBACK_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_AUX_SW_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_PA_AUX_IN_CONN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_TIMER_DIV)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_OCP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_OCP_COUNT)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_EAR_DAC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_EAR_AMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_LDO)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_PA)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_RDACBUFF_CNP2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_RDAC_LDO)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_CNP1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_HPH_LOWPOWER)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_AUX_DAC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_AUX_AMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_VNEGDAC_BLEEDER)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_MISC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_BUCK_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_BUCK_VREF_ERRAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_FLYB_ERRAMP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_FLYB_BUFF)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_BIAS_FLYB_MID_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_R_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_CNP_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_CNP_WG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_CNP_WG_TIME)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_OCP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_AUTO_CHOP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_CHOP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_PA_CTL1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_PA_CTL2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_ATEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_ATEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_CLK_CTL1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_CLK_CTL2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_LDO_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_RDAC_CHOP_CLK_LP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_REFBUFF_UHQA_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_REFBUFF_LP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_L_DAC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_R_DAC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_COMP_SEL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_MISC1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_SURGE_HPHLR_SURGE_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_EAR_EAR_EN_REG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_PA_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_SP_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_DAC_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_EAR_CNP_FSM_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_TEST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_STATUS_REG_1)] = RD_REG, - [WCD937X_REG(WCD937X_EAR_STATUS_REG_2)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_NEW_ANA_HPH2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_ANA_HPH3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_SLEEP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_SLEEP_WATCHDOG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ELECT_REM_CLAMP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_PLUG_DETECT_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ZDET_ANA_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ZDET_RAMP_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_FSM_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_ADC_RESULT)] = RD_REG, - [WCD937X_REG(WCD937X_TX_NEW_TX_CH2_SEL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_AUXPA)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_CONFIG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_OUT)] = RD_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_VREF_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_OVERRIDE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_MISC1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_MISC2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_RDAC_MISC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_HPH_TIMER4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_RDAC_MISC2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_HPH_NEW_INT_PA_RDAC_MISC3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_NEW_INT_HPH_RDAC_BIAS_ULP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_RX_NEW_INT_HPH_RDAC_LDO_LP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL)] - = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_MECH_DET_CURRENT)] = RD_WR_REG, - [WCD937X_REG(WCD937X_MBHC_NEW_INT_SPARE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_EAR_CHOPPER_CON)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_CNP_VCM_CON1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_CNP_VCM_CON2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_EAR_INT_NEW_EAR_DYNAMIC_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_EN_REG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_PA_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_SP_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_DAC_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_CLK_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_TEST_CTRL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_AUX_INT_STATUS_REG)] = RD_REG, - [WCD937X_REG(WCD937X_AUX_INT_MISC)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_BIAS)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_STB_LOADS_DTEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_TEST0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_STARTUP_TIMER)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_TEST1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_LDORXTX_INT_STATUS)] = RD_REG, - [WCD937X_REG(WCD937X_SLEEP_INT_WATCHDOG_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_SLEEP_INT_WATCHDOG_CTL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID2)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CHIP_ID3)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RST_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_TOP_CLK_CFG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_ANA_CLK_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DIG_CLK_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_RST_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_PATH_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX0_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DEM_BYPASS_DATA3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_COMP_CTL_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_RX_DELAY_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A1_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A1_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A2_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A2_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A3_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A3_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A4_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A4_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A5_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A5_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A6_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_A7_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_C_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A1_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A1_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A2_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A2_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A3_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A3_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A4_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A4_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A5_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A5_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A6_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A7_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_C_3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R3)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R4)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R5)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R6)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_R7)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_RX_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_RX_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_DSD_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_DSD_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_GAIN_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_GAIN_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_EAR_PATH_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_SWR_CLH)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_CLH_BYP)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX0_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_TX_RST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_REQ_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_AMIC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_DMIC3_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_PRG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_TEST_CTL_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_TEST_CTL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_T_DATA_0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_T_DATA_1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_PDM_WD_CTL0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PDM_WD_CTL1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PDM_WD_CTL2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MASK_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MASK_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_MASK_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_STATUS_0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_STATUS_1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_STATUS_2)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_CLEAR_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_CLEAR_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_CLEAR_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_LEVEL_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_LEVEL_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_LEVEL_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_SET_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_SET_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_SET_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_TEST_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_TEST_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_INTR_TEST_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_RX0_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_RX1_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_RX2_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_CDC_CONN_TX_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_LOOP_BACK_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_DAC_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_RX_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_TX_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_RX_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST_TX_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SWR_HM_TEST)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_RX0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_RX1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_TX0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_TX1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_INP_DIS_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PAD_INP_DIS_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_RX_DATA_EDGE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_TX_DATA_EDGE_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_GPIO_MODE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_CTL_OE)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_CTL_DATA_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_CTL_DATA_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_STATUS_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_PIN_STATUS_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DIG_DEBUG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_DIG_DEBUG_EN)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_ANA_CSR_DBG_ADD)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_ANA_CSR_DBG_CTL)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SSP_DBG)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_MODE_STATUS_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_MODE_STATUS_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SPARE_0)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SPARE_1)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_SPARE_2)] = RD_WR_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_0)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_1)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_2)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_3)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_4)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_5)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_6)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_7)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_8)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_9)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_10)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_11)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_12)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_13)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_14)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_15)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_16)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_17)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_18)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_19)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_20)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_21)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_22)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_23)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_24)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_25)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_26)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_27)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_28)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_29)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_30)] = RD_REG, - [WCD937X_REG(WCD937X_DIGITAL_EFUSE_REG_31)] = RD_REG, -}; diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x.c b/techpack/audio/asoc/codecs/wcd937x/wcd937x.c deleted file mode 100644 index 2252f491ea58..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x.c +++ /dev/null @@ -1,2889 +0,0 @@ -/* - * Copyright (c) 2018-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "internal.h" -#include "wcd937x.h" -#include "../wcdcal-hwdep.h" -#include "wcd937x-registers.h" -#include "../msm-cdc-pinctrl.h" -#include -#include "../msm-cdc-supply.h" - -#define WCD9370_VARIANT 0 -#define WCD9375_VARIANT 5 -#define WCD937X_VARIANT_ENTRY_SIZE 32 - -#define NUM_SWRS_DT_PARAMS 5 - -#define WCD937X_VERSION_1_0 1 -#define WCD937X_VERSION_ENTRY_SIZE 32 - -enum { - CODEC_TX = 0, - CODEC_RX, -}; - -enum { - ALLOW_BUCK_DISABLE, - HPH_COMP_DELAY, - HPH_PA_DELAY, - AMIC2_BCS_ENABLE, -}; - -static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1); -static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); - -static int wcd937x_handle_post_irq(void *data); -static int wcd937x_reset(struct device *dev); -static int wcd937x_reset_low(struct device *dev); - -static const struct regmap_irq wcd937x_irqs[WCD937X_NUM_IRQS] = { - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x02), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_ELECT_INS_REM_DET, 0, 0x04), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 0, 0x08), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_SW_DET, 0, 0x10), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_OCP_INT, 0, 0x20), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_CNP_INT, 0, 0x40), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_OCP_INT, 0, 0x80), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_CNP_INT, 1, 0x01), - REGMAP_IRQ_REG(WCD937X_IRQ_EAR_CNP_INT, 1, 0x02), - REGMAP_IRQ_REG(WCD937X_IRQ_EAR_SCD_INT, 1, 0x04), - REGMAP_IRQ_REG(WCD937X_IRQ_AUX_CNP_INT, 1, 0x08), - REGMAP_IRQ_REG(WCD937X_IRQ_AUX_SCD_INT, 1, 0x10), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_PDM_WD_INT, 1, 0x20), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_PDM_WD_INT, 1, 0x40), - REGMAP_IRQ_REG(WCD937X_IRQ_AUX_PDM_WD_INT, 1, 0x80), - REGMAP_IRQ_REG(WCD937X_IRQ_LDORT_SCD_INT, 2, 0x01), - REGMAP_IRQ_REG(WCD937X_IRQ_MBHC_MOISTURE_INT, 2, 0x02), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHL_SURGE_DET_INT, 2, 0x04), - REGMAP_IRQ_REG(WCD937X_IRQ_HPHR_SURGE_DET_INT, 2, 0x08), -}; - -static struct regmap_irq_chip wcd937x_regmap_irq_chip = { - .name = "wcd937x", - .irqs = wcd937x_irqs, - .num_irqs = ARRAY_SIZE(wcd937x_irqs), - .num_regs = 3, - .status_base = WCD937X_DIGITAL_INTR_STATUS_0, - .mask_base = WCD937X_DIGITAL_INTR_MASK_0, - .ack_base = WCD937X_DIGITAL_INTR_CLEAR_0, - .use_ack = 1, - .clear_ack = 1, - .type_base = WCD937X_DIGITAL_INTR_LEVEL_0, - .runtime_pm = false, - .handle_post_irq = wcd937x_handle_post_irq, - .irq_drv_data = NULL, -}; -static int wcd937x_handle_post_irq(void *data) -{ - struct wcd937x_priv *wcd937x = data; - u32 status1 = 0, status2 = 0, status3 = 0; - - regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_0, &status1); - regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_1, &status2); - regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_2, &status3); - - wcd937x->tx_swr_dev->slave_irq_pending = - ((status1 || status2 || status3) ? true : false); - - return IRQ_HANDLED; -} - -static int wcd937x_init_reg(struct snd_soc_codec *codec) -{ - snd_soc_update_bits(codec, WCD937X_SLEEP_CTL, 0x0E, 0x0E); - snd_soc_update_bits(codec, WCD937X_SLEEP_CTL, 0x80, 0x80); - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WCD937X_SLEEP_CTL, 0x40, 0x40); - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WCD937X_LDORXTX_CONFIG, 0x10, 0x00); - snd_soc_update_bits(codec, WCD937X_BIAS_VBG_FINE_ADJ, 0xF0, 0x80); - snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x80, 0x80); - snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x40, 0x40); - usleep_range(10000, 10010); - snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_HPH_OCP_CTL, 0xFF, 0x3A); - snd_soc_update_bits(codec, WCD937X_RX_OCP_CTL, 0x0F, 0x02); - snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xFF, - 0xD9); - snd_soc_update_bits(codec, WCD937X_MICB1_TEST_CTL_1, 0xFF, 0xFA); - snd_soc_update_bits(codec, WCD937X_MICB2_TEST_CTL_1, 0xFF, 0xFA); - snd_soc_update_bits(codec, WCD937X_MICB3_TEST_CTL_1, 0xFF, 0xFA); - return 0; -} - -static int wcd937x_set_port_params(struct snd_soc_codec *codec, u8 slv_prt_type, - u8 *port_id, u8 *num_ch, u8 *ch_mask, u32 *ch_rate, - u8 *port_type, u8 path) -{ - int i, j; - u8 num_ports = 0; - struct codec_port_info (*map)[MAX_PORT][MAX_CH_PER_PORT] = NULL; - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - switch (path) { - case CODEC_RX: - map = &wcd937x->rx_port_mapping; - num_ports = wcd937x->num_rx_ports; - break; - case CODEC_TX: - map = &wcd937x->tx_port_mapping; - num_ports = wcd937x->num_tx_ports; - break; - } - - for (i = 0; i <= num_ports; i++) { - for (j = 0; j < MAX_CH_PER_PORT; j++) { - if ((*map)[i][j].slave_port_type == slv_prt_type) - goto found; - } - } -found: - if (i > num_ports || j == MAX_CH_PER_PORT) { - dev_err(codec->dev, "%s Failed to find slave port for type %u\n", - __func__, slv_prt_type); - return -EINVAL; - } - *port_id = i; - *num_ch = (*map)[i][j].num_ch; - *ch_mask = (*map)[i][j].ch_mask; - *ch_rate = (*map)[i][j].ch_rate; - *port_type = (*map)[i][j].master_port_type; - - return 0; -} - -static int wcd937x_parse_port_mapping(struct device *dev, - char *prop, u8 path) -{ - u32 *dt_array, map_size, map_length; - u32 port_num = 0, ch_mask, ch_rate, old_port_num = 0; - u32 slave_port_type, master_port_type; - u32 i, ch_iter = 0; - int ret = 0; - u8 *num_ports = NULL; - struct codec_port_info (*map)[MAX_PORT][MAX_CH_PER_PORT] = NULL; - struct wcd937x_priv *wcd937x = dev_get_drvdata(dev); - - switch (path) { - case CODEC_RX: - map = &wcd937x->rx_port_mapping; - num_ports = &wcd937x->num_rx_ports; - break; - case CODEC_TX: - map = &wcd937x->tx_port_mapping; - num_ports = &wcd937x->num_tx_ports; - break; - } - - if (!of_find_property(dev->of_node, prop, - &map_size)) { - dev_err(dev, "missing port mapping prop %s\n", prop); - ret = -EINVAL; - goto err; - } - - map_length = map_size / (NUM_SWRS_DT_PARAMS * sizeof(u32)); - - dt_array = kzalloc(map_size, GFP_KERNEL); - - if (!dt_array) { - ret = -ENOMEM; - goto err; - } - ret = of_property_read_u32_array(dev->of_node, prop, dt_array, - NUM_SWRS_DT_PARAMS * map_length); - if (ret) { - dev_err(dev, "%s: Failed to read port mapping from prop %s\n", - __func__, prop); - ret = -EINVAL; - goto err_pdata_fail; - } - - for (i = 0; i < map_length; i++) { - port_num = dt_array[NUM_SWRS_DT_PARAMS * i]; - slave_port_type = dt_array[NUM_SWRS_DT_PARAMS * i + 1]; - ch_mask = dt_array[NUM_SWRS_DT_PARAMS * i + 2]; - ch_rate = dt_array[NUM_SWRS_DT_PARAMS * i + 3]; - master_port_type = dt_array[NUM_SWRS_DT_PARAMS * i + 4]; - - if (port_num != old_port_num) - ch_iter = 0; - - (*map)[port_num][ch_iter].slave_port_type = slave_port_type; - (*map)[port_num][ch_iter].ch_mask = ch_mask; - (*map)[port_num][ch_iter].master_port_type = master_port_type; - (*map)[port_num][ch_iter].num_ch = __sw_hweight8(ch_mask); - (*map)[port_num][ch_iter++].ch_rate = ch_rate; - old_port_num = port_num; - } - *num_ports = port_num; - kfree(dt_array); - return 0; - -err_pdata_fail: - kfree(dt_array); -err: - return ret; -} - -static int wcd937x_tx_connect_port(struct snd_soc_codec *codec, - u8 slv_port_type, u8 enable) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u8 port_id; - u8 num_ch; - u8 ch_mask; - u32 ch_rate; - u8 port_type; - u8 num_port = 1; - int ret = 0; - - ret = wcd937x_set_port_params(codec, slv_port_type, &port_id, - &num_ch, &ch_mask, &ch_rate, - &port_type, CODEC_TX); - - if (ret) - return ret; - - if (enable) - ret = swr_connect_port(wcd937x->tx_swr_dev, &port_id, - num_port, &ch_mask, &ch_rate, - &num_ch, &port_type); - else - ret = swr_disconnect_port(wcd937x->tx_swr_dev, &port_id, - num_port, &ch_mask, &port_type); - return ret; - -} -static int wcd937x_rx_connect_port(struct snd_soc_codec *codec, - u8 slv_port_type, u8 enable) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u8 port_id; - u8 num_ch; - u8 ch_mask; - u32 ch_rate; - u8 port_type; - u8 num_port = 1; - int ret = 0; - - ret = wcd937x_set_port_params(codec, slv_port_type, &port_id, - &num_ch, &ch_mask, &ch_rate, - &port_type, CODEC_RX); - - if (ret) - return ret; - - if (enable) - ret = swr_connect_port(wcd937x->rx_swr_dev, &port_id, - num_port, &ch_mask, &ch_rate, - &num_ch, &port_type); - else - ret = swr_disconnect_port(wcd937x->rx_swr_dev, &port_id, - num_port, &ch_mask, &port_type); - return ret; -} - -static int wcd937x_rx_clk_enable(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (wcd937x->rx_clk_cnt == 0) { - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x08, 0x08); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX0_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX1_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX2_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x02, 0x02); - } - wcd937x->rx_clk_cnt++; - - return 0; -} - -static int wcd937x_rx_clk_disable(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (wcd937x->rx_clk_cnt == 0) { - dev_dbg(wcd937x->dev, "%s:clk already disabled\n", __func__); - return 0; - } - wcd937x->rx_clk_cnt--; - if (wcd937x->rx_clk_cnt == 0) { - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, 0x01, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x02, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x01, 0x00); - } - return 0; -} - -/* - * wcd937x_soc_get_mbhc: get wcd937x_mbhc handle of corresponding codec - * @codec: handle to snd_soc_codec * - * - * return wcd937x_mbhc handle or error code in case of failure - */ -struct wcd937x_mbhc *wcd937x_soc_get_mbhc(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x; - - if (!codec) { - pr_err("%s: Invalid params, NULL codec\n", __func__); - return NULL; - } - wcd937x = snd_soc_codec_get_drvdata(codec); - - if (!wcd937x) { - pr_err("%s: Invalid params, NULL tavil\n", __func__); - return NULL; - } - - return wcd937x->mbhc; -} -EXPORT_SYMBOL(wcd937x_soc_get_mbhc); - -static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_HPH_RDAC_CLK_CTL1, - 0x80, 0x00); - set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x02); - else if (hph_mode == CLS_H_LOHIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x06); - if (wcd937x->comp1_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x02); - snd_soc_update_bits(codec, - WCD937X_HPH_L_EN, 0x20, 0x00); - if (wcd937x->comp2_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD937X_HPH_R_EN, 0x20, 0x00); - } - /* - * 5ms sleep is required after COMP is enabled as per - * HW requirement - */ - if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) { - usleep_range(5000, 5100); - clear_bit(HPH_COMP_DELAY, - &wcd937x->status_mask); - } - } else { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x00); - snd_soc_update_bits(codec, - WCD937X_HPH_L_EN, 0x20, 0x20); - } - snd_soc_update_bits(codec, WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x01); - break; - } - - return 0; -} - -static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, - 0x08, 0x08); - snd_soc_update_bits(codec, WCD937X_HPH_RDAC_CLK_CTL1, - 0x80, 0x00); - set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x02); - else if (hph_mode == CLS_H_LOHIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x06); - if (wcd937x->comp2_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x01, 0x01); - snd_soc_update_bits(codec, - WCD937X_HPH_R_EN, 0x20, 0x00); - if (wcd937x->comp1_enable) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x02); - snd_soc_update_bits(codec, - WCD937X_HPH_L_EN, 0x20, 0x00); - } - /* - * 5ms sleep is required after COMP is enabled as per - * HW requirement - */ - if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) { - usleep_range(5000, 5100); - clear_bit(HPH_COMP_DELAY, - &wcd937x->status_mask); - } - } else { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x01, 0x00); - snd_soc_update_bits(codec, - WCD937X_HPH_R_EN, 0x20, 0x20); - } - snd_soc_update_bits(codec, WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x00); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, - 0x0F, 0x01); - break; - } - - return 0; -} - -static int wcd937x_codec_ear_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_HPH_GAIN_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x01, 0x01); - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x02); - else if (hph_mode == CLS_H_LOHIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x06); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_COMP_CTL_0, - 0x02, 0x02); - usleep_range(5000, 5010); - snd_soc_update_bits(codec, WCD937X_FLYBACK_EN, - 0x04, 0x00); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_EAR, - hph_mode); - - break; - case SND_SOC_DAPM_POST_PMD: - if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_LOHIFI || - hph_mode == CLS_H_HIFI) - snd_soc_update_bits(codec, - WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, - 0x0F, 0x01); - break; - }; - return 0; - -} - -static int wcd937x_codec_aux_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_clk_enable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_AUX_GAIN_CTL, - 0x01, 0x01); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_AUX, - hph_mode); - - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_rx_clk_disable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x04, 0x00); - break; - }; - return 0; - -} - -static int wcd937x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHR, - hph_mode); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x10, 0x10); - usleep_range(100, 110); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp2_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_HPH_R_TEST, 0x01, 0x01); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX2 << 0x10)); - break; - case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, WCD937X_HPH_R_TEST, 0x01, 0x00); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX2 << 0x10 | 0x1)); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_PRE_HPHR_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 7ms sleep is required after PA is disabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp2_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, WCD937X_DIGITAL_PDM_WD_CTL1, - 0x17, 0x00); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_POST_HPHR_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x10, 0x00); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHR, - hph_mode); - break; - }; - return ret; -} - -static int wcd937x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - int hph_mode = wcd937x->hph_mode; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_PRE_DAC, - WCD_CLSH_STATE_HPHL, - hph_mode); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x20, 0x20); - usleep_range(100, 110); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMU: - /* - * 7ms sleep is required after PA is enabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp1_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, WCD937X_HPH_NEW_INT_HPH_TIMER1, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_HPH_L_TEST, 0x01, 0x01); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10)); - break; - case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, WCD937X_HPH_L_TEST, 0x01, 0x00); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10 | 0x1)); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_PRE_HPHL_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - set_bit(HPH_PA_DELAY, &wcd937x->status_mask); - break; - case SND_SOC_DAPM_POST_PMD: - /* - * 7ms sleep is required after PA is disabled as per - * HW requirement. If compander is disabled, then - * 20ms delay is required. - */ - if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { - if (!wcd937x->comp1_enable) - usleep_range(20000, 20100); - else - usleep_range(7000, 7100); - clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); - } - - snd_soc_update_bits(codec, WCD937X_DIGITAL_PDM_WD_CTL0, - 0x17, 0x00); - blocking_notifier_call_chain(&wcd937x->mbhc->notifier, - WCD_EVENT_POST_HPHL_PA_OFF, - &wcd937x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x20, 0x00); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_HPHL, - hph_mode); - break; - }; - return ret; -} - -static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - break; - case SND_SOC_DAPM_POST_PMU: - usleep_range(1000, 1010); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10)); - break; - case SND_SOC_DAPM_PRE_PMD: - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX3 << 0x10 | 0x1)); - break; - case SND_SOC_DAPM_POST_PMD: - usleep_range(1000, 1010); - usleep_range(1000, 1010); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_AUX, - hph_mode); - break; - }; - return ret; -} - -static int wcd937x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int hph_mode = wcd937x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - true); - if (!wcd937x->comp1_enable) - snd_soc_update_bits(codec, - WCD937X_ANA_EAR_COMPANDER_CTL, 0x80, 0x80); - break; - case SND_SOC_DAPM_POST_PMU: - usleep_range(6000, 6010); - if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI) - snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, - 0x02, 0x02); - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10)); - break; - case SND_SOC_DAPM_PRE_PMD: - if (wcd937x->update_wcd_event) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_RX_MUTE, - (WCD_RX1 << 0x10 | 0x1)); - break; - case SND_SOC_DAPM_POST_PMD: - if (!wcd937x->comp1_enable) - snd_soc_update_bits(codec, - WCD937X_ANA_EAR_COMPANDER_CTL, 0x80, 0x00); - usleep_range(7000, 7010); - wcd_cls_h_fsm(codec, &wcd937x->clsh_info, - WCD_CLSH_EVENT_POST_PA, - WCD_CLSH_STATE_EAR, - hph_mode); - snd_soc_update_bits(codec, WCD937X_FLYBACK_EN, - 0x04, 0x04); - break; - }; - return ret; -} - -static int wcd937x_enable_clsh(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int mode = wcd937x->hph_mode; - int ret = 0; - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - if (mode == CLS_H_LOHIFI || mode == CLS_H_ULP || - mode == CLS_H_HIFI || mode == CLS_H_LP) { - wcd937x_rx_connect_port(codec, CLSH, - SND_SOC_DAPM_EVENT_ON(event)); - } - if (SND_SOC_DAPM_EVENT_OFF(event)) - ret = swr_slvdev_datapath_control( - wcd937x->rx_swr_dev, - wcd937x->rx_swr_dev->dev_num, - false); - return ret; -} - -static int wcd937x_enable_rx1(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_connect_port(codec, HPH_L, true); - if (wcd937x->comp1_enable) - wcd937x_rx_connect_port(codec, COMP_L, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_rx_connect_port(codec, HPH_L, false); - if (wcd937x->comp1_enable) - wcd937x_rx_connect_port(codec, COMP_L, false); - wcd937x_rx_clk_disable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x01, 0x00); - break; - }; - return 0; -} - -static int wcd937x_enable_rx2(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_connect_port(codec, HPH_R, true); - if (wcd937x->comp2_enable) - wcd937x_rx_connect_port(codec, COMP_R, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_rx_connect_port(codec, HPH_R, false); - if (wcd937x->comp2_enable) - wcd937x_rx_connect_port(codec, COMP_R, false); - wcd937x_rx_clk_disable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x02, 0x00); - break; - }; - - return 0; -} - -static int wcd937x_enable_rx3(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_rx_connect_port(codec, LO, true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_rx_connect_port(codec, LO, false); - usleep_range(6000, 6010); - wcd937x_rx_clk_disable(codec); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x04, 0x00); - break; - } - return 0; - -} - -static int wcd937x_codec_enable_dmic(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u16 dmic_clk_reg; - s32 *dmic_clk_cnt; - unsigned int dmic; - char *wname; - int ret = 0; - - wname = strpbrk(w->name, "012345"); - - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (dmic) { - case 0: - case 1: - dmic_clk_cnt = &(wcd937x->dmic_0_1_clk_cnt); - dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC1_CTL; - break; - case 2: - case 3: - dmic_clk_cnt = &(wcd937x->dmic_2_3_clk_cnt); - dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC2_CTL; - break; - case 4: - case 5: - dmic_clk_cnt = &(wcd937x->dmic_4_5_clk_cnt); - dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC3_CTL; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - }; - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n", - __func__, event, dmic, *dmic_clk_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x80); - snd_soc_update_bits(codec, dmic_clk_reg, 0x07, 0x02); - snd_soc_update_bits(codec, dmic_clk_reg, 0x08, 0x08); - snd_soc_update_bits(codec, dmic_clk_reg, 0x70, 0x20); - wcd937x_tx_connect_port(codec, DMIC0 + (w->shift), true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_tx_connect_port(codec, DMIC0 + (w->shift), false); - break; - - }; - return 0; -} - -/* - * wcd937x_get_micb_vout_ctl_val: converts micbias from volts to register value - * @micb_mv: micbias in mv - * - * return register value converted - */ -int wcd937x_get_micb_vout_ctl_val(u32 micb_mv) -{ - /* min micbias voltage is 1V and maximum is 2.85V */ - if (micb_mv < 1000 || micb_mv > 2850) { - pr_err("%s: unsupported micbias voltage\n", __func__); - return -EINVAL; - } - - return (micb_mv - 1000) / 50; -} -EXPORT_SYMBOL(wcd937x_get_micb_vout_ctl_val); - -/* - * wcd937x_mbhc_micb_adjust_voltage: adjust specific micbias voltage - * @codec: handle to snd_soc_codec * - * @req_volt: micbias voltage to be set - * @micb_num: micbias to be set, e.g. micbias1 or micbias2 - * - * return 0 if adjustment is success or error code in case of failure - */ -int wcd937x_mbhc_micb_adjust_voltage(struct snd_soc_codec *codec, - int req_volt, int micb_num) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int cur_vout_ctl, req_vout_ctl; - int micb_reg, micb_val, micb_en; - int ret = 0; - - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD937X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD937X_ANA_MICB2; - break; - case MIC_BIAS_3: - micb_reg = WCD937X_ANA_MICB3; - break; - default: - return -EINVAL; - } - mutex_lock(&wcd937x->micb_lock); - - /* - * If requested micbias voltage is same as current micbias - * voltage, then just return. Otherwise, adjust voltage as - * per requested value. If micbias is already enabled, then - * to avoid slow micbias ramp-up or down enable pull-up - * momentarily, change the micbias value and then re-enable - * micbias. - */ - micb_val = snd_soc_read(codec, micb_reg); - micb_en = (micb_val & 0xC0) >> 6; - cur_vout_ctl = micb_val & 0x3F; - - req_vout_ctl = wcd937x_get_micb_vout_ctl_val(req_volt); - if (req_vout_ctl < 0) { - ret = -EINVAL; - goto exit; - } - if (cur_vout_ctl == req_vout_ctl) { - ret = 0; - goto exit; - } - - dev_dbg(codec->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", - __func__, micb_num, WCD_VOUT_CTL_TO_MICB(cur_vout_ctl), - req_volt, micb_en); - - if (micb_en == 0x1) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - - snd_soc_update_bits(codec, micb_reg, 0x3F, req_vout_ctl); - - if (micb_en == 0x1) { - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - /* - * Add 2ms delay as per HW requirement after enabling - * micbias - */ - usleep_range(2000, 2100); - } -exit: - mutex_unlock(&wcd937x->micb_lock); - return ret; -} -EXPORT_SYMBOL(wcd937x_mbhc_micb_adjust_voltage); - -static int wcd937x_tx_swr_ctrl(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = swr_slvdev_datapath_control(wcd937x->tx_swr_dev, - wcd937x->tx_swr_dev->dev_num, - true); - break; - case SND_SOC_DAPM_POST_PMD: - ret = swr_slvdev_datapath_control(wcd937x->tx_swr_dev, - wcd937x->tx_swr_dev->dev_num, - false); - break; - }; - - return ret; -} - -static int wcd937x_codec_enable_adc(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event){ - - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count++; - mutex_unlock(&wcd937x->ana_tx_clk_lock); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x80); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x08, 0x08); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x10, 0x10); - /* Enable BCS for Headset mic */ - if (w->shift == 1 && !(snd_soc_read(codec, - WCD937X_TX_NEW_TX_CH2_SEL) & 0x80)) { - wcd937x_tx_connect_port(codec, MBHC, true); - set_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask); - } - wcd937x_tx_connect_port(codec, ADC1 + (w->shift), true); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_tx_connect_port(codec, ADC1 + (w->shift), false); - if (w->shift == 1 && - test_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask)) { - wcd937x_tx_connect_port(codec, MBHC, false); - clear_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask); - } - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x08, 0x00); - break; - }; - - return 0; -} - -static int wcd937x_enable_req(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_REQ_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_REQ_CTL, 0x01, - 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x40); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH3_HPF, 0x40, 0x40); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x70, 0x70); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x80); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x80, 0x80); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH3, 0x80, 0x80); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x80, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_TX_CH3, 0x80, 0x00); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x10, 0x00); - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count--; - if (wcd937x->ana_clk_count <= 0) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x10, 0x00); - wcd937x->ana_clk_count = 0; - } - mutex_unlock(&wcd937x->ana_tx_clk_lock); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, - 0x80, 0x00); - break; - }; - return 0; -} - -int wcd937x_micbias_control(struct snd_soc_codec *codec, - int micb_num, int req, bool is_dapm) -{ - - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int micb_index = micb_num - 1; - u16 micb_reg; - int pre_off_event = 0, post_off_event = 0; - int post_on_event = 0, post_dapm_off = 0; - int post_dapm_on = 0; - - if ((micb_index < 0) || (micb_index > WCD937X_MAX_MICBIAS - 1)) { - dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", - __func__, micb_index); - return -EINVAL; - } - switch (micb_num) { - case MIC_BIAS_1: - micb_reg = WCD937X_ANA_MICB1; - break; - case MIC_BIAS_2: - micb_reg = WCD937X_ANA_MICB2; - pre_off_event = WCD_EVENT_PRE_MICBIAS_2_OFF; - post_off_event = WCD_EVENT_POST_MICBIAS_2_OFF; - post_on_event = WCD_EVENT_POST_MICBIAS_2_ON; - post_dapm_on = WCD_EVENT_POST_DAPM_MICBIAS_2_ON; - post_dapm_off = WCD_EVENT_POST_DAPM_MICBIAS_2_OFF; - break; - case MIC_BIAS_3: - micb_reg = WCD937X_ANA_MICB3; - break; - default: - dev_err(codec->dev, "%s: Invalid micbias number: %d\n", - __func__, micb_num); - return -EINVAL; - }; - mutex_lock(&wcd937x->micb_lock); - - switch (req) { - case MICB_PULLUP_ENABLE: - wcd937x->pullup_ref[micb_index]++; - if ((wcd937x->pullup_ref[micb_index] == 1) && - (wcd937x->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - break; - case MICB_PULLUP_DISABLE: - if (wcd937x->pullup_ref[micb_index] > 0) - wcd937x->pullup_ref[micb_index]--; - if ((wcd937x->pullup_ref[micb_index] == 0) && - (wcd937x->micb_ref[micb_index] == 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - break; - case MICB_ENABLE: - wcd937x->micb_ref[micb_index]++; - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count++; - mutex_unlock(&wcd937x->ana_tx_clk_lock); - if (wcd937x->micb_ref[micb_index] == 1) { - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0xE0, 0xE0); - snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); - snd_soc_update_bits(codec, WCD937X_MICB1_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_MICB2_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, WCD937X_MICB3_TEST_CTL_2, 0x01, 0x01); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - if (post_on_event && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, post_on_event, - &wcd937x->mbhc->wcd_mbhc); - } - if (is_dapm && post_dapm_on && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, post_dapm_on, - &wcd937x->mbhc->wcd_mbhc); - break; - case MICB_DISABLE: - mutex_lock(&wcd937x->ana_tx_clk_lock); - wcd937x->ana_clk_count--; - mutex_unlock(&wcd937x->ana_tx_clk_lock); - if (wcd937x->micb_ref[micb_index] > 0) - wcd937x->micb_ref[micb_index]--; - if ((wcd937x->micb_ref[micb_index] == 0) && - (wcd937x->pullup_ref[micb_index] > 0)) - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); - else if ((wcd937x->micb_ref[micb_index] == 0) && - (wcd937x->pullup_ref[micb_index] == 0)) { - if (pre_off_event && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, pre_off_event, - &wcd937x->mbhc->wcd_mbhc); - snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - if (post_off_event && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, - post_off_event, - &wcd937x->mbhc->wcd_mbhc); - } - mutex_lock(&wcd937x->ana_tx_clk_lock); - if (wcd937x->ana_clk_count <= 0) { - snd_soc_update_bits(codec, - WCD937X_DIGITAL_CDC_ANA_CLK_CTL, - 0x10, 0x00); - wcd937x->ana_clk_count = 0; - } - mutex_unlock(&wcd937x->ana_tx_clk_lock); - if (is_dapm && post_dapm_off && wcd937x->mbhc) - blocking_notifier_call_chain( - &wcd937x->mbhc->notifier, post_dapm_off, - &wcd937x->mbhc->wcd_mbhc); - break; - }; - - dev_dbg(codec->dev, "%s: micb_num:%d, micb_ref: %d, pullup_ref: %d\n", - __func__, micb_num, wcd937x->micb_ref[micb_index], - wcd937x->pullup_ref[micb_index]); - mutex_unlock(&wcd937x->micb_lock); - - return 0; -} -EXPORT_SYMBOL(wcd937x_micbias_control); - -void wcd937x_disable_bcs_before_slow_insert(struct snd_soc_codec *codec, - bool bcs_disable) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (wcd937x->update_wcd_event) { - if (bcs_disable) - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_BCS_CLK_OFF, 0); - else - wcd937x->update_wcd_event(wcd937x->handle, - WCD_BOLERO_EVT_BCS_CLK_OFF, 1); - } -} - -static int wcd937x_get_logical_addr(struct swr_device *swr_dev) -{ - int ret = 0; - uint8_t devnum = 0; - - ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum); - if (ret) { - dev_err(&swr_dev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, swr_dev->addr); - return ret; - } - swr_dev->dev_num = devnum; - return 0; -} - -static int wcd937x_event_notify(struct notifier_block *block, - unsigned long val, - void *data) -{ - u16 event = (val & 0xffff); - u16 amic = (val >> 0x10); - u16 mask = 0x40, reg = 0x0; - int ret = 0; - struct wcd937x_priv *wcd937x = dev_get_drvdata((struct device *)data); - struct snd_soc_codec *codec = wcd937x->codec; - struct wcd_mbhc *mbhc; - - switch (event) { - case BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR: - if (amic == 0x1 || amic == 0x2) - reg = WCD937X_ANA_TX_CH2; - else if (amic == 0x3) - reg = WCD937X_ANA_TX_CH3_HPF; - else - return 0; - if (amic == 0x2) - mask = 0x20; - snd_soc_update_bits(codec, reg, mask, 0x00); - break; - case BOLERO_WCD_EVT_PA_OFF_PRE_SSR: - snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0xC0, 0x00); - snd_soc_update_bits(codec, WCD937X_ANA_EAR, 0x80, 0x00); - snd_soc_update_bits(codec, WCD937X_AUX_AUXPA, 0x80, 0x00); - break; - case BOLERO_WCD_EVT_SSR_DOWN: - mbhc = &wcd937x->mbhc->wcd_mbhc; - wcd937x_mbhc_ssr_down(wcd937x->mbhc, codec); - wcd937x_reset_low(wcd937x->dev); - break; - case BOLERO_WCD_EVT_SSR_UP: - wcd937x_reset(wcd937x->dev); - wcd937x_get_logical_addr(wcd937x->tx_swr_dev); - wcd937x_get_logical_addr(wcd937x->rx_swr_dev); - regcache_mark_dirty(wcd937x->regmap); - regcache_sync(wcd937x->regmap); - /* Enable surge protection */ - snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN, - 0xFF, 0xD9); - /* Initialize MBHC module */ - mbhc = &wcd937x->mbhc->wcd_mbhc; - ret = wcd937x_mbhc_post_ssr_init(wcd937x->mbhc, codec); - if (ret) { - dev_err(codec->dev, "%s: mbhc initialization failed\n", - __func__); - } else { - wcd937x_mbhc_hs_detect(codec, mbhc->mbhc_cfg); - } - break; - default: - dev_err(codec->dev, "%s: invalid event %d\n", __func__, event); - break; - } - return 0; -} - -static int __wcd937x_codec_enable_micbias(struct snd_soc_dapm_widget *w, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int micb_num; - - dev_dbg(codec->dev, "%s: wname: %s, event: %d\n", - __func__, w->name, event); - - if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1"))) - micb_num = MIC_BIAS_1; - else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2"))) - micb_num = MIC_BIAS_2; - else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3"))) - micb_num = MIC_BIAS_3; - else - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wcd937x_micbias_control(codec, micb_num, MICB_ENABLE, true); - break; - case SND_SOC_DAPM_POST_PMU: - usleep_range(1000, 1100); - break; - case SND_SOC_DAPM_POST_PMD: - wcd937x_micbias_control(codec, micb_num, MICB_DISABLE, true); - break; - }; - - return 0; - -} - -static int wcd937x_codec_enable_micbias(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - return __wcd937x_codec_enable_micbias(w, event); -} - -static int wcd937x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wcd937x->hph_mode; - return 0; -} - -static int wcd937x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - u32 mode_val; - - mode_val = ucontrol->value.enumerated.item[0]; - - dev_dbg(codec->dev, "%s: mode: %d\n", __func__, mode_val); - - if (mode_val == 0) { - dev_warn(codec->dev, "%s:Invalid HPH Mode, default to class_AB\n", - __func__); - mode_val = 3; /* enum will be updated later */ - } - wcd937x->hph_mode = mode_val; - return 0; -} - -static int wcd937x_ear_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - ear_pa_gain = snd_soc_read(codec, WCD937X_ANA_EAR_COMPANDER_CTL); - - ear_pa_gain = (ear_pa_gain & 0x7C) >> 2; - - ucontrol->value.integer.value[0] = ear_pa_gain; - - dev_dbg(codec->dev, "%s: ear_pa_gain = 0x%x\n", __func__, - ear_pa_gain); - - return 0; -} - -static int wcd937x_ear_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u8 ear_pa_gain = 0; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - ear_pa_gain = ucontrol->value.integer.value[0] << 2; - - if (!wcd937x->comp1_enable) { - snd_soc_update_bits(codec, WCD937X_ANA_EAR_COMPANDER_CTL, - 0x7C, ear_pa_gain); - } - - return 0; -} - -static int wcd937x_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - bool hphr; - struct soc_multi_mixer_control *mc; - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - - ucontrol->value.integer.value[0] = hphr ? wcd937x->comp2_enable : - wcd937x->comp1_enable; - return 0; -} - -static int wcd937x_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - bool hphr; - struct soc_multi_mixer_control *mc; - - mc = (struct soc_multi_mixer_control *)(kcontrol->private_value); - hphr = mc->shift; - if (hphr) - wcd937x->comp2_enable = value; - else - wcd937x->comp1_enable = value; - - return 0; -} - -static int wcd937x_codec_enable_vdd_buck(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - struct wcd937x_pdata *pdata = NULL; - int ret = 0; - - pdata = dev_get_platdata(wcd937x->dev); - - if (!pdata) { - dev_err(codec->dev, "%s: pdata is NULL\n", __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__, - w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - if (test_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask)) { - dev_dbg(codec->dev, - "%s: buck already in enabled state\n", - __func__); - clear_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - return 0; - } - ret = msm_cdc_enable_ondemand_supply(wcd937x->dev, - wcd937x->supplies, - pdata->regulator, - pdata->num_supplies, - "cdc-vdd-buck"); - if (ret == -EINVAL) { - dev_err(codec->dev, "%s: vdd buck is not enabled\n", - __func__); - return ret; - } - clear_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - /* - * 200us sleep is required after LDO15 is enabled as per - * HW requirement - */ - usleep_range(200, 250); - break; - case SND_SOC_DAPM_POST_PMD: - set_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - break; - } - return 0; -} - -static const char * const rx_hph_mode_mux_text[] = { - "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", - "CLS_H_ULP", "CLS_AB_HIFI", -}; - -static const char * const wcd937x_ear_pa_gain_text[] = { - "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", "G_0_DB", - "G_M1P5_DB", "G_M3_DB", "G_M4P5_DB", - "G_M6_DB", "G_7P5_DB", "G_M9_DB", - "G_M10P5_DB", "G_M12_DB", "G_M13P5_DB", - "G_M15_DB", "G_M16P5_DB", "G_M18_DB", -}; - -static const struct soc_enum rx_hph_mode_mux_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), - rx_hph_mode_mux_text); - -static SOC_ENUM_SINGLE_EXT_DECL(wcd937x_ear_pa_gain_enum, - wcd937x_ear_pa_gain_text); - -static const struct snd_kcontrol_new wcd937x_snd_controls[] = { - SOC_ENUM_EXT("EAR PA GAIN", wcd937x_ear_pa_gain_enum, - wcd937x_ear_pa_gain_get, wcd937x_ear_pa_gain_put), - SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, - wcd937x_rx_hph_mode_get, wcd937x_rx_hph_mode_put), - SOC_SINGLE_EXT("HPHL_COMP Switch", SND_SOC_NOPM, 0, 1, 0, - wcd937x_get_compander, wcd937x_set_compander), - SOC_SINGLE_EXT("HPHR_COMP Switch", SND_SOC_NOPM, 1, 1, 0, - wcd937x_get_compander, wcd937x_set_compander), - - SOC_SINGLE_TLV("HPHL Volume", WCD937X_HPH_L_EN, 0, 20, 1, line_gain), - SOC_SINGLE_TLV("HPHR Volume", WCD937X_HPH_R_EN, 0, 20, 1, line_gain), - SOC_SINGLE_TLV("ADC1 Volume", WCD937X_ANA_TX_CH1, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC2 Volume", WCD937X_ANA_TX_CH2, 0, 20, 0, analog_gain), - SOC_SINGLE_TLV("ADC3 Volume", WCD937X_ANA_TX_CH3, 0, 20, 0, analog_gain), -}; - -static const struct snd_kcontrol_new adc1_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new adc2_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new adc3_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic1_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic2_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic3_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic4_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic5_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new dmic6_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new ear_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new aux_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new hphl_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const struct snd_kcontrol_new hphr_rdac_switch[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static const char * const adc2_mux_text[] = { - "INP2", "INP3" -}; - -static const char * const rdac3_mux_text[] = { - "RX1", "RX3" -}; - -static const struct soc_enum adc2_enum = - SOC_ENUM_SINGLE(WCD937X_TX_NEW_TX_CH2_SEL, 7, - ARRAY_SIZE(adc2_mux_text), adc2_mux_text); - - -static const struct soc_enum rdac3_enum = - SOC_ENUM_SINGLE(WCD937X_DIGITAL_CDC_EAR_PATH_CTL, 0, - ARRAY_SIZE(rdac3_mux_text), rdac3_mux_text); - -static const struct snd_kcontrol_new tx_adc2_mux = - SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum); - -static const struct snd_kcontrol_new rx_rdac3_mux = - SOC_DAPM_ENUM("RDAC3_MUX Mux", rdac3_enum); - -static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = { - - /*input widgets*/ - - SND_SOC_DAPM_INPUT("AMIC1"), - SND_SOC_DAPM_INPUT("AMIC2"), - SND_SOC_DAPM_INPUT("AMIC3"), - SND_SOC_DAPM_INPUT("IN1_HPHL"), - SND_SOC_DAPM_INPUT("IN2_HPHR"), - SND_SOC_DAPM_INPUT("IN3_AUX"), - - /*tx widgets*/ - SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0, - wcd937x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("ADC1 REQ", SND_SOC_NOPM, 0, 0, - NULL, 0, wcd937x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 0, 0, - NULL, 0, wcd937x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, - &tx_adc2_mux), - - /*tx mixers*/ - SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, 0, 0, - adc1_switch, ARRAY_SIZE(adc1_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, 0, 0, - adc2_switch, ARRAY_SIZE(adc2_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - /* micbias widgets*/ - SND_SOC_DAPM_MICBIAS_E("MIC BIAS1", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS2", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MICBIAS_E("MIC BIAS3", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_micbias, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_vdd_buck, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("CLS_H_PORT", 1, SND_SOC_NOPM, 0, 0, - wcd937x_enable_clsh, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /*rx widgets*/ - SND_SOC_DAPM_PGA_E("EAR PGA", WCD937X_ANA_EAR, 7, 0, NULL, 0, - wcd937x_codec_enable_ear_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("AUX PGA", WCD937X_AUX_AUXPA, 7, 0, NULL, 0, - wcd937x_codec_enable_aux_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHL PGA", WCD937X_ANA_HPH, 7, 0, NULL, 0, - wcd937x_codec_enable_hphl_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_PGA_E("HPHR PGA", WCD937X_ANA_HPH, 6, 0, NULL, 0, - wcd937x_codec_enable_hphr_pa, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_DAC_E("RDAC1", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_hphl_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC2", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_hphr_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC3", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_ear_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_DAC_E("RDAC4", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_aux_dac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("RDAC3_MUX", SND_SOC_NOPM, 0, 0, &rx_rdac3_mux), - - SND_SOC_DAPM_MIXER_E("RX1", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd937x_enable_rx1, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX2", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd937x_enable_rx2, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("RX3", SND_SOC_NOPM, 0, 0, NULL, 0, - wcd937x_enable_rx3, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - - /* rx mixer widgets*/ - - SND_SOC_DAPM_MIXER("EAR_RDAC", SND_SOC_NOPM, 0, 0, - ear_rdac_switch, ARRAY_SIZE(ear_rdac_switch)), - SND_SOC_DAPM_MIXER("AUX_RDAC", SND_SOC_NOPM, 0, 0, - aux_rdac_switch, ARRAY_SIZE(aux_rdac_switch)), - SND_SOC_DAPM_MIXER("HPHL_RDAC", SND_SOC_NOPM, 0, 0, - hphl_rdac_switch, ARRAY_SIZE(hphl_rdac_switch)), - SND_SOC_DAPM_MIXER("HPHR_RDAC", SND_SOC_NOPM, 0, 0, - hphr_rdac_switch, ARRAY_SIZE(hphr_rdac_switch)), - - /*output widgets tx*/ - - SND_SOC_DAPM_OUTPUT("ADC1_OUTPUT"), - SND_SOC_DAPM_OUTPUT("ADC2_OUTPUT"), - - /*output widgets rx*/ - SND_SOC_DAPM_OUTPUT("EAR"), - SND_SOC_DAPM_OUTPUT("AUX"), - SND_SOC_DAPM_OUTPUT("HPHL"), - SND_SOC_DAPM_OUTPUT("HPHR"), - -}; - -static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = { - - /*input widgets*/ - SND_SOC_DAPM_INPUT("AMIC4"), - - /*tx widgets*/ - SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0, - wcd937x_codec_enable_adc, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIXER_E("ADC3 REQ", SND_SOC_NOPM, 0, 0, - NULL, 0, wcd937x_enable_req, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0, - wcd937x_codec_enable_dmic, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /*tx mixer widgets*/ - SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, 0, - 0, dmic1_switch, ARRAY_SIZE(dmic1_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, 0, - 0, dmic2_switch, ARRAY_SIZE(dmic2_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, 0, - 0, dmic3_switch, ARRAY_SIZE(dmic3_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, 0, - 0, dmic4_switch, ARRAY_SIZE(dmic4_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, 0, - 0, dmic5_switch, ARRAY_SIZE(dmic5_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, 0, - 0, dmic6_switch, ARRAY_SIZE(dmic6_switch), - wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, 0, 0, adc3_switch, - ARRAY_SIZE(adc3_switch), wcd937x_tx_swr_ctrl, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - /*output widgets*/ - SND_SOC_DAPM_OUTPUT("DMIC1_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC2_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC3_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC4_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC5_OUTPUT"), - SND_SOC_DAPM_OUTPUT("DMIC6_OUTPUT"), - SND_SOC_DAPM_OUTPUT("ADC3_OUTPUT"), - -}; - -static const struct snd_soc_dapm_route wcd937x_audio_map[] = { - {"ADC1_OUTPUT", NULL, "ADC1_MIXER"}, - {"ADC1_MIXER", "Switch", "ADC1 REQ"}, - {"ADC1 REQ", NULL, "ADC1"}, - {"ADC1", NULL, "AMIC1"}, - - {"ADC2_OUTPUT", NULL, "ADC2_MIXER"}, - {"ADC2_MIXER", "Switch", "ADC2 REQ"}, - {"ADC2 REQ", NULL, "ADC2"}, - {"ADC2", NULL, "ADC2 MUX"}, - {"ADC2 MUX", "INP3", "AMIC3"}, - {"ADC2 MUX", "INP2", "AMIC2"}, - - {"IN1_HPHL", NULL, "VDD_BUCK"}, - {"IN1_HPHL", NULL, "CLS_H_PORT"}, - {"RX1", NULL, "IN1_HPHL"}, - {"RDAC1", NULL, "RX1"}, - {"HPHL_RDAC", "Switch", "RDAC1"}, - {"HPHL PGA", NULL, "HPHL_RDAC"}, - {"HPHL", NULL, "HPHL PGA"}, - - {"IN2_HPHR", NULL, "VDD_BUCK"}, - {"IN2_HPHR", NULL, "CLS_H_PORT"}, - {"RX2", NULL, "IN2_HPHR"}, - {"RDAC2", NULL, "RX2"}, - {"HPHR_RDAC", "Switch", "RDAC2"}, - {"HPHR PGA", NULL, "HPHR_RDAC"}, - {"HPHR", NULL, "HPHR PGA"}, - - {"IN3_AUX", NULL, "VDD_BUCK"}, - {"IN3_AUX", NULL, "CLS_H_PORT"}, - {"RX3", NULL, "IN3_AUX"}, - {"RDAC4", NULL, "RX3"}, - {"AUX_RDAC", "Switch", "RDAC4"}, - {"AUX PGA", NULL, "AUX_RDAC"}, - {"AUX", NULL, "AUX PGA"}, - - {"RDAC3_MUX", "RX3", "RX3"}, - {"RDAC3_MUX", "RX1", "RX1"}, - {"RDAC3", NULL, "RDAC3_MUX"}, - {"EAR_RDAC", "Switch", "RDAC3"}, - {"EAR PGA", NULL, "EAR_RDAC"}, - {"EAR", NULL, "EAR PGA"}, -}; - -static const struct snd_soc_dapm_route wcd9375_audio_map[] = { - - {"ADC3_OUTPUT", NULL, "ADC3_MIXER"}, - {"ADC3_MIXER", "Switch", "ADC3 REQ"}, - {"ADC3 REQ", NULL, "ADC3"}, - {"ADC3", NULL, "AMIC4"}, - - {"DMIC1_OUTPUT", NULL, "DMIC1_MIXER"}, - {"DMIC1_MIXER", "Switch", "DMIC1"}, - - {"DMIC2_OUTPUT", NULL, "DMIC2_MIXER"}, - {"DMIC2_MIXER", "Switch", "DMIC2"}, - - {"DMIC3_OUTPUT", NULL, "DMIC3_MIXER"}, - {"DMIC3_MIXER", "Switch", "DMIC3"}, - - {"DMIC4_OUTPUT", NULL, "DMIC4_MIXER"}, - {"DMIC4_MIXER", "Switch", "DMIC4"}, - - {"DMIC5_OUTPUT", NULL, "DMIC5_MIXER"}, - {"DMIC5_MIXER", "Switch", "DMIC5"}, - - {"DMIC6_OUTPUT", NULL, "DMIC6_MIXER"}, - {"DMIC6_MIXER", "Switch", "DMIC6"}, - -}; - -static ssize_t wcd937x_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct wcd937x_priv *priv; - char buffer[WCD937X_VERSION_ENTRY_SIZE]; - int len = 0; - - priv = (struct wcd937x_priv *) entry->private_data; - if (!priv) { - pr_err("%s: wcd937x priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->version) { - case WCD937X_VERSION_1_0: - len = snprintf(buffer, sizeof(buffer), "WCD937X_1_0\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wcd937x_info_ops = { - .read = wcd937x_version_read, -}; - - -static ssize_t wcd937x_variant_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) -{ - struct wcd937x_priv *priv; - char buffer[WCD937X_VARIANT_ENTRY_SIZE]; - int len = 0; - - priv = (struct wcd937x_priv *) entry->private_data; - if (!priv) { - pr_err("%s: wcd937x priv is null\n", __func__); - return -EINVAL; - } - - switch (priv->variant) { - case WCD9370_VARIANT: - len = snprintf(buffer, sizeof(buffer), "WCD9370\n"); - break; - case WCD9375_VARIANT: - len = snprintf(buffer, sizeof(buffer), "WCD9375\n"); - break; - default: - len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n"); - } - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wcd937x_variant_ops = { - .read = wcd937x_variant_read, -}; - -/* - * wcd937x_info_create_codec_entry - creates wcd937x module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates wcd937x module, variant and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int wcd937x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct snd_info_entry *variant_entry; - struct wcd937x_priv *priv; - struct snd_soc_card *card; - - if (!codec_root || !codec) - return -EINVAL; - - priv = snd_soc_codec_get_drvdata(codec); - if (priv->entry) { - dev_dbg(priv->dev, - "%s:wcd937x module already created\n", __func__); - return 0; - } - card = codec->component.card; - priv->entry = snd_info_create_subdir(codec_root->module, - "wcd937x", codec_root); - if (!priv->entry) { - dev_dbg(codec->dev, "%s: failed to create wcd937x entry\n", - __func__); - return -ENOMEM; - } - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - priv->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd937x version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = priv; - version_entry->size = WCD937X_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &wcd937x_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - priv->version_entry = version_entry; - - variant_entry = snd_info_create_card_entry(card->snd_card, - "variant", - priv->entry); - if (!variant_entry) { - dev_dbg(codec->dev, "%s: failed to create wcd937x variant entry\n", - __func__); - return -ENOMEM; - } - - variant_entry->private_data = priv; - variant_entry->size = WCD937X_VARIANT_ENTRY_SIZE; - variant_entry->content = SNDRV_INFO_CONTENT_DATA; - variant_entry->c.ops = &wcd937x_variant_ops; - - if (snd_info_register(variant_entry) < 0) { - snd_info_free_entry(variant_entry); - return -ENOMEM; - } - priv->variant_entry = variant_entry; - return 0; -} -EXPORT_SYMBOL(wcd937x_info_create_codec_entry); - -static int wcd937x_set_micbias_data(struct wcd937x_priv *wcd937x, - struct wcd937x_pdata *pdata) -{ - int vout_ctl_1 = 0, vout_ctl_2 = 0, vout_ctl_3 = 0; - int rc = 0; - - if (!pdata) { - dev_err(wcd937x->dev, "%s: NULL pdata\n", __func__); - return -ENODEV; - } - - /* set micbias voltage */ - vout_ctl_1 = wcd937x_get_micb_vout_ctl_val(pdata->micbias.micb1_mv); - vout_ctl_2 = wcd937x_get_micb_vout_ctl_val(pdata->micbias.micb2_mv); - vout_ctl_3 = wcd937x_get_micb_vout_ctl_val(pdata->micbias.micb3_mv); - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0) { - rc = -EINVAL; - goto done; - } - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB1, 0x3F, - vout_ctl_1); - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB2, 0x3F, - vout_ctl_2); - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB3, 0x3F, - vout_ctl_3); - -done: - return rc; -} - -static int wcd937x_soc_codec_probe(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int variant; - int ret = -EINVAL; - - dev_info(codec->dev, "%s()\n", __func__); - wcd937x = snd_soc_codec_get_drvdata(codec); - - if (!wcd937x) - return -EINVAL; - - wcd937x->codec = codec; - variant = (snd_soc_read(codec, WCD937X_DIGITAL_EFUSE_REG_0) & 0x1E) >> 1; - wcd937x->variant = variant; - - wcd937x->fw_data = devm_kzalloc(codec->dev, - sizeof(*(wcd937x->fw_data)), - GFP_KERNEL); - if (!wcd937x->fw_data) { - dev_err(codec->dev, "Failed to allocate fw_data\n"); - ret = -ENOMEM; - goto err; - } - - set_bit(WCD9XXX_MBHC_CAL, wcd937x->fw_data->cal_bit); - ret = wcd_cal_create_hwdep(wcd937x->fw_data, - WCD9XXX_CODEC_HWDEP_NODE, codec); - - if (ret < 0) { - dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret); - goto err_hwdep; - } - - ret = wcd937x_mbhc_init(&wcd937x->mbhc, codec, wcd937x->fw_data); - if (ret) { - pr_err("%s: mbhc initialization failed\n", __func__); - goto err_hwdep; - } - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "IN1_HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "IN2_HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "IN3_AUX"); - snd_soc_dapm_ignore_suspend(dapm, "ADC1_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC2_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "AUX"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_sync(dapm); - - wcd_cls_h_init(&wcd937x->clsh_info); - wcd937x_init_reg(codec); - - if (wcd937x->variant == WCD9375_VARIANT) { - ret = snd_soc_dapm_new_controls(dapm, wcd9375_dapm_widgets, - ARRAY_SIZE(wcd9375_dapm_widgets)); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to add snd_ctls\n", - __func__); - goto err_hwdep; - } - ret = snd_soc_dapm_add_routes(dapm, wcd9375_audio_map, - ARRAY_SIZE(wcd9375_audio_map)); - if (ret < 0) { - dev_err(codec->dev, "%s: Failed to add routes\n", - __func__); - goto err_hwdep; - } - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC5_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC6_OUTPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ADC3_OUTPUT"); - snd_soc_dapm_sync(dapm); - } - wcd937x->version = WCD937X_VERSION_1_0; - /* Register event notifier */ - wcd937x->nblock.notifier_call = wcd937x_event_notify; - if (wcd937x->register_notifier) { - ret = wcd937x->register_notifier(wcd937x->handle, - &wcd937x->nblock, - true); - if (ret) { - dev_err(codec->dev, - "%s: Failed to register notifier %d\n", - __func__, ret); - return ret; - } - } - return ret; - -err_hwdep: - wcd937x->fw_data = NULL; - -err: - return ret; -} - -static int wcd937x_soc_codec_remove(struct snd_soc_codec *codec) -{ - struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec); - - if (!wcd937x) - return -EINVAL; - - if (wcd937x->register_notifier) - return wcd937x->register_notifier(wcd937x->handle, - &wcd937x->nblock, - false); - return 0; -} - -static struct regmap *wcd937x_get_regmap(struct device *dev) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(dev); - - return wcd937x->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_wcd937x = { - .probe = wcd937x_soc_codec_probe, - .remove = wcd937x_soc_codec_remove, - .get_regmap = wcd937x_get_regmap, - .component_driver = { - .controls = wcd937x_snd_controls, - .num_controls = ARRAY_SIZE(wcd937x_snd_controls), - .dapm_widgets = wcd937x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wcd937x_dapm_widgets), - .dapm_routes = wcd937x_audio_map, - .num_dapm_routes = ARRAY_SIZE(wcd937x_audio_map), - }, -}; - -#ifdef CONFIG_PM_SLEEP -static int wcd937x_suspend(struct device *dev) -{ - struct wcd937x_priv *wcd937x = NULL; - int ret = 0; - struct wcd937x_pdata *pdata = NULL; - - if (!dev) - return -ENODEV; - - wcd937x = dev_get_drvdata(dev); - if (!wcd937x) - return -EINVAL; - - pdata = dev_get_platdata(wcd937x->dev); - - if (!pdata) { - dev_err(dev, "%s: pdata is NULL\n", __func__); - return -EINVAL; - } - - if (test_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask)) { - ret = msm_cdc_disable_ondemand_supply(wcd937x->dev, - wcd937x->supplies, - pdata->regulator, - pdata->num_supplies, - "cdc-vdd-buck"); - if (ret == -EINVAL) { - dev_err(dev, "%s: vdd buck is not disabled\n", - __func__); - return 0; - } - clear_bit(ALLOW_BUCK_DISABLE, &wcd937x->status_mask); - } - return 0; -} - -static int wcd937x_resume(struct device *dev) -{ - return 0; -} -#endif - -static int wcd937x_reset(struct device *dev) -{ - struct wcd937x_priv *wcd937x = NULL; - int rc = 0; - int value = 0; - - if (!dev) - return -ENODEV; - - wcd937x = dev_get_drvdata(dev); - if (!wcd937x) - return -EINVAL; - - if (!wcd937x->rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - value = msm_cdc_pinctrl_get_state(wcd937x->rst_np); - if (value > 0) - return 0; - - rc = msm_cdc_pinctrl_select_sleep_state(wcd937x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - /* 20ms sleep required after pulling the reset gpio to LOW */ - usleep_range(20, 30); - - rc = msm_cdc_pinctrl_select_active_state(wcd937x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd active state request fail!\n", - __func__); - return rc; - } - /* 20ms sleep required after pulling the reset gpio to HIGH */ - usleep_range(20, 30); - - return rc; -} - -static int wcd937x_read_of_property_u32(struct device *dev, const char *name, - u32 *val) -{ - int rc = 0; - - rc = of_property_read_u32(dev->of_node, name, val); - if (rc) - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, name, dev->of_node->full_name); - - return rc; -} - -static void wcd937x_dt_parse_micbias_info(struct device *dev, - struct wcd937x_micbias_setting *mb) -{ - u32 prop_val = 0; - int rc = 0; - - /* MB1 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias1-mv", - NULL)) { - rc = wcd937x_read_of_property_u32(dev, - "qcom,cdc-micbias1-mv", - &prop_val); - if (!rc) - mb->micb1_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias1 DT property not found\n", - __func__); - } - - /* MB2 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias2-mv", - NULL)) { - rc = wcd937x_read_of_property_u32(dev, - "qcom,cdc-micbias2-mv", - &prop_val); - if (!rc) - mb->micb2_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias2 DT property not found\n", - __func__); - } - - /* MB3 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias3-mv", - NULL)) { - rc = wcd937x_read_of_property_u32(dev, - "qcom,cdc-micbias3-mv", - &prop_val); - if (!rc) - mb->micb3_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias3 DT property not found\n", - __func__); - } -} - -static int wcd937x_reset_low(struct device *dev) -{ - struct wcd937x_priv *wcd937x = NULL; - int rc = 0; - - if (!dev) - return -ENODEV; - - wcd937x = dev_get_drvdata(dev); - if (!wcd937x) - return -EINVAL; - - if (!wcd937x->rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - rc = msm_cdc_pinctrl_select_sleep_state(wcd937x->rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - /* 20ms sleep required after pulling the reset gpio to LOW */ - usleep_range(20, 30); - - return rc; -} - -struct wcd937x_pdata *wcd937x_populate_dt_data(struct device *dev) -{ - struct wcd937x_pdata *pdata = NULL; - - pdata = kzalloc(sizeof(struct wcd937x_pdata), - GFP_KERNEL); - if (!pdata) - return NULL; - - pdata->rst_np = of_parse_phandle(dev->of_node, - "qcom,wcd-rst-gpio-node", 0); - - if (!pdata->rst_np) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,wcd-rst-gpio-node", - dev->of_node->full_name); - return NULL; - } - - /* Parse power supplies */ - msm_cdc_get_power_supplies(dev, &pdata->regulator, - &pdata->num_supplies); - if (!pdata->regulator || (pdata->num_supplies <= 0)) { - dev_err(dev, "%s: no power supplies defined for codec\n", - __func__); - return NULL; - } - - pdata->rx_slave = of_parse_phandle(dev->of_node, "qcom,rx-slave", 0); - pdata->tx_slave = of_parse_phandle(dev->of_node, "qcom,tx-slave", 0); - wcd937x_dt_parse_micbias_info(dev, &pdata->micbias); - - return pdata; -} - -static int wcd937x_wakeup(void *handle, bool enable) -{ - struct wcd937x_priv *priv; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - priv = (struct wcd937x_priv *)handle; - if (!priv->tx_swr_dev) { - pr_err("%s: tx swr dev is NULL\n", __func__); - return -EINVAL; - } - if (enable) - return swr_device_wakeup_vote(priv->tx_swr_dev); - else - return swr_device_wakeup_unvote(priv->tx_swr_dev); -} - -static int wcd937x_bind(struct device *dev) -{ - int ret = 0, i = 0; - struct wcd937x_priv *wcd937x = NULL; - struct wcd937x_pdata *pdata = NULL; - struct wcd_ctrl_platform_data *plat_data = NULL; - - wcd937x = kzalloc(sizeof(struct wcd937x_priv), GFP_KERNEL); - if (!wcd937x) - return -ENOMEM; - - dev_set_drvdata(dev, wcd937x); - - pdata = wcd937x_populate_dt_data(dev); - if (!pdata) { - dev_err(dev, "%s: Fail to obtain platform data\n", __func__); - return -EINVAL; - } - wcd937x->dev = dev; - wcd937x->dev->platform_data = pdata; - wcd937x->rst_np = pdata->rst_np; - ret = msm_cdc_init_supplies(dev, &wcd937x->supplies, - pdata->regulator, pdata->num_supplies); - if (!wcd937x->supplies) { - dev_err(dev, "%s: Cannot init wcd supplies\n", - __func__); - goto err_bind_all; - } - - plat_data = dev_get_platdata(dev->parent); - if (!plat_data) { - dev_err(dev, "%s: platform data from parent is NULL\n", - __func__); - ret = -EINVAL; - goto err_bind_all; - } - wcd937x->handle = (void *)plat_data->handle; - if (!wcd937x->handle) { - dev_err(dev, "%s: handle is NULL\n", __func__); - ret = -EINVAL; - goto err_bind_all; - } - wcd937x->update_wcd_event = plat_data->update_wcd_event; - if (!wcd937x->update_wcd_event) { - dev_err(dev, "%s: update_wcd_event api is null!\n", - __func__); - ret = -EINVAL; - goto err_bind_all; - } - wcd937x->register_notifier = plat_data->register_notifier; - if (!wcd937x->register_notifier) { - dev_err(dev, "%s: register_notifier api is null!\n", - __func__); - ret = -EINVAL; - goto err_bind_all; - } - - ret = msm_cdc_enable_static_supplies(dev, wcd937x->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(dev, "%s: wcd static supply enable failed!\n", - __func__); - goto err_bind_all; - } - - wcd937x_reset(dev); - /* - * Add 5msec delay to provide sufficient time for - * soundwire auto enumeration of slave devices as - * as per HW requirement. - */ - usleep_range(5000, 5010); - wcd937x->wakeup = wcd937x_wakeup; - - ret = component_bind_all(dev, wcd937x); - if (ret) { - dev_err(dev, "%s: Slave bind failed, ret = %d\n", - __func__, ret); - goto err_bind_all; - } - - ret = wcd937x_parse_port_mapping(dev, "qcom,rx_swr_ch_map", CODEC_RX); - ret |= wcd937x_parse_port_mapping(dev, "qcom,tx_swr_ch_map", CODEC_TX); - - if (ret) { - dev_err(dev, "Failed to read port mapping\n"); - goto err; - } - - wcd937x->rx_swr_dev = get_matching_swr_slave_device(pdata->rx_slave); - if (!wcd937x->rx_swr_dev) { - dev_err(dev, "%s: Could not find RX swr slave device\n", - __func__); - ret = -ENODEV; - goto err; - } - - wcd937x->tx_swr_dev = get_matching_swr_slave_device(pdata->tx_slave); - if (!wcd937x->tx_swr_dev) { - dev_err(dev, "%s: Could not find TX swr slave device\n", - __func__); - ret = -ENODEV; - goto err; - } - - wcd937x->regmap = devm_regmap_init_swr(wcd937x->tx_swr_dev, - &wcd937x_regmap_config); - if (!wcd937x->regmap) { - dev_err(dev, "%s: Regmap init failed\n", - __func__); - goto err; - } - - /* Set all interupts as edge triggered */ - for (i = 0; i < wcd937x_regmap_irq_chip.num_regs; i++) - regmap_write(wcd937x->regmap, - (WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0); - - wcd937x_regmap_irq_chip.irq_drv_data = wcd937x; - wcd937x->irq_info.wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip; - wcd937x->irq_info.codec_name = "WCD937X"; - wcd937x->irq_info.regmap = wcd937x->regmap; - wcd937x->irq_info.dev = dev; - ret = wcd_irq_init(&wcd937x->irq_info, &wcd937x->virq); - - if (ret) { - dev_err(dev, "%s: IRQ init failed: %d\n", - __func__, ret); - goto err; - } - wcd937x->tx_swr_dev->slave_irq = wcd937x->virq; - - ret = wcd937x_set_micbias_data(wcd937x, pdata); - if (ret < 0) { - dev_err(dev, "%s: bad micbias pdata\n", __func__); - goto err_irq; - } - - mutex_init(&wcd937x->micb_lock); - mutex_init(&wcd937x->ana_tx_clk_lock); - ret = snd_soc_register_codec(dev, &soc_codec_dev_wcd937x, - NULL, 0); - if (ret) { - dev_err(dev, "%s: Codec registration failed\n", - __func__); - goto err_irq; - } - - return ret; -err_irq: - wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq); -err: - component_unbind_all(dev, wcd937x); -err_bind_all: - dev_set_drvdata(dev, NULL); - kfree(pdata); - kfree(wcd937x); - return ret; -} - -static void wcd937x_unbind(struct device *dev) -{ - struct wcd937x_priv *wcd937x = dev_get_drvdata(dev); - struct wcd937x_pdata *pdata = dev_get_platdata(wcd937x->dev); - - wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq); - snd_soc_unregister_codec(dev); - component_unbind_all(dev, wcd937x); - mutex_destroy(&wcd937x->micb_lock); - mutex_destroy(&wcd937x->ana_tx_clk_lock); - dev_set_drvdata(dev, NULL); - kfree(pdata); - kfree(wcd937x); -} - -static const struct of_device_id wcd937x_dt_match[] = { - { .compatible = "qcom,wcd937x-codec" }, - {} -}; - -static const struct component_master_ops wcd937x_comp_ops = { - .bind = wcd937x_bind, - .unbind = wcd937x_unbind, -}; - -static int wcd937x_compare_of(struct device *dev, void *data) -{ - return dev->of_node == data; -} - -static void wcd937x_release_of(struct device *dev, void *data) -{ - of_node_put(data); -} - -static int wcd937x_add_slave_components(struct device *dev, - struct component_match **matchptr) -{ - struct device_node *np, *rx_node, *tx_node; - - np = dev->of_node; - - rx_node = of_parse_phandle(np, "qcom,rx-slave", 0); - if (!rx_node) { - dev_err(dev, "%s: Rx-slave node not defined\n", __func__); - return -ENODEV; - } - of_node_get(rx_node); - component_match_add_release(dev, matchptr, - wcd937x_release_of, - wcd937x_compare_of, - rx_node); - - tx_node = of_parse_phandle(np, "qcom,tx-slave", 0); - if (!tx_node) { - dev_err(dev, "%s: Tx-slave node not defined\n", __func__); - return -ENODEV; - } - of_node_get(tx_node); - component_match_add_release(dev, matchptr, - wcd937x_release_of, - wcd937x_compare_of, - tx_node); - return 0; -} - -static int wcd937x_probe(struct platform_device *pdev) -{ - struct component_match *match = NULL; - int ret; - - ret = wcd937x_add_slave_components(&pdev->dev, &match); - if (ret) - return ret; - - return component_master_add_with_match(&pdev->dev, - &wcd937x_comp_ops, match); -} - -static int wcd937x_remove(struct platform_device *pdev) -{ - component_master_del(&pdev->dev, &wcd937x_comp_ops); - dev_set_drvdata(&pdev->dev, NULL); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static const struct dev_pm_ops wcd937x_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - wcd937x_suspend, - wcd937x_resume - ) -}; -#endif - -static struct platform_driver wcd937x_codec_driver = { - .probe = wcd937x_probe, - .remove = wcd937x_remove, - .driver = { - .name = "wcd937x_codec", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(wcd937x_dt_match), -#ifdef CONFIG_PM_SLEEP - .pm = &wcd937x_dev_pm_ops, -#endif - }, -}; - -module_platform_driver(wcd937x_codec_driver); -MODULE_DESCRIPTION("WCD937X Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x.h b/techpack/audio/asoc/codecs/wcd937x/wcd937x.h deleted file mode 100644 index 49905d77f54c..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD937X_H -#define _WCD937X_H - -#ifdef CONFIG_SND_SOC_WCD937X -extern int wcd937x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -#else -extern int wcd937x_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} -#endif /* CONFIG_SND_SOC_WCD937X */ - -#endif diff --git a/techpack/audio/asoc/codecs/wcd937x/wcd937x_slave.c b/techpack/audio/asoc/codecs/wcd937x/wcd937x_slave.c deleted file mode 100644 index baab26fe6de3..000000000000 --- a/techpack/audio/asoc/codecs/wcd937x/wcd937x_slave.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -struct wcd937x_slave_priv { - struct swr_device *swr_slave; -}; - -static int wcd937x_slave_bind(struct device *dev, - struct device *master, void *data) -{ - int ret = 0; - struct wcd937x_slave_priv *wcd937x_slave = NULL; - uint8_t devnum = 0; - struct swr_device *pdev = to_swr_device(dev); - - if (pdev == NULL) { - dev_err(dev, "%s: pdev is NULL\n", __func__); - return -EINVAL; - } - - wcd937x_slave = devm_kzalloc(&pdev->dev, - sizeof(struct wcd937x_slave_priv), GFP_KERNEL); - if (!wcd937x_slave) - return -ENOMEM; - - swr_set_dev_data(pdev, wcd937x_slave); - - wcd937x_slave->swr_slave = pdev; - - ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum); - if (ret) { - dev_dbg(&pdev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, pdev->addr); - swr_remove_device(pdev); - return ret; - } - pdev->dev_num = devnum; - - return ret; -} - -static void wcd937x_slave_unbind(struct device *dev, - struct device *master, void *data) -{ - struct wcd937x_slave_priv *wcd937x_slave = NULL; - struct swr_device *pdev = to_swr_device(dev); - - if (pdev == NULL) { - dev_err(dev, "%s: pdev is NULL\n", __func__); - return; - } - - wcd937x_slave = swr_get_dev_data(pdev); - if (!wcd937x_slave) { - dev_err(&pdev->dev, "%s: wcd937x_slave is NULL\n", __func__); - return; - } - - swr_set_dev_data(pdev, NULL); -} - -static const struct swr_device_id wcd937x_swr_id[] = { - {"wcd937x-slave", 0}, - {} -}; - -static const struct of_device_id wcd937x_swr_dt_match[] = { - { - .compatible = "qcom,wcd937x-slave", - }, - {} -}; - -static const struct component_ops wcd937x_slave_comp_ops = { - .bind = wcd937x_slave_bind, - .unbind = wcd937x_slave_unbind, -}; - -static int wcd937x_swr_up(struct swr_device *pdev) -{ - return 0; -} - -static int wcd937x_swr_down(struct swr_device *pdev) -{ - return 0; -} - -static int wcd937x_swr_reset(struct swr_device *pdev) -{ - return 0; -} - -static int wcd937x_swr_probe(struct swr_device *pdev) -{ - return component_add(&pdev->dev, &wcd937x_slave_comp_ops); -} - -static int wcd937x_swr_remove(struct swr_device *pdev) -{ - component_del(&pdev->dev, &wcd937x_slave_comp_ops); - return 0; -} - -static struct swr_driver wcd937x_slave_driver = { - .driver = { - .name = "wcd937x-slave", - .owner = THIS_MODULE, - .of_match_table = wcd937x_swr_dt_match, - }, - .probe = wcd937x_swr_probe, - .remove = wcd937x_swr_remove, - .id_table = wcd937x_swr_id, - .device_up = wcd937x_swr_up, - .device_down = wcd937x_swr_down, - .reset_device = wcd937x_swr_reset, -}; - -static int __init wcd937x_slave_init(void) -{ - return swr_driver_register(&wcd937x_slave_driver); -} - -static void __exit wcd937x_slave_exit(void) -{ - swr_driver_unregister(&wcd937x_slave_driver); -} - -module_init(wcd937x_slave_init); -module_exit(wcd937x_slave_exit); - -MODULE_DESCRIPTION("WCD937X Swr Slave driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-common-v2.c b/techpack/audio/asoc/codecs/wcd9xxx-common-v2.c deleted file mode 100644 index df42ce59de63..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-common-v2.c +++ /dev/null @@ -1,1369 +0,0 @@ -/* - * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include "core.h" -#include "wcd9xxx-common-v2.h" - -#define WCD_USLEEP_RANGE 50 -#define MAX_IMPED_PARAMS 6 - -enum { - DAC_GAIN_0DB = 0, - DAC_GAIN_0P2DB, - DAC_GAIN_0P4DB, - DAC_GAIN_0P6DB, - DAC_GAIN_0P8DB, - DAC_GAIN_M0P2DB, - DAC_GAIN_M0P4DB, - DAC_GAIN_M0P6DB, -}; - -enum { - VREF_FILT_R_0OHM = 0, - VREF_FILT_R_25KOHM, - VREF_FILT_R_50KOHM, - VREF_FILT_R_100KOHM, -}; - -enum { - DELTA_I_0MA, - DELTA_I_10MA, - DELTA_I_20MA, - DELTA_I_30MA, - DELTA_I_40MA, - DELTA_I_50MA, -}; - -struct wcd_imped_val { - u32 imped_val; - u8 index; -}; - -static const struct wcd_reg_mask_val imped_table[][MAX_IMPED_PARAMS] = { - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf5}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x0}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x0}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfe}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xff}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, -}; - -static const struct wcd_reg_mask_val imped_table_tavil[][MAX_IMPED_PARAMS] = { - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf2}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf4}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf7}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xf9}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfa}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfb}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfc}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x00}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x00}, - }, - { - {WCD9XXX_CDC_RX1_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX1_RX_PATH_SEC1, 0x01, 0x01}, - {WCD9XXX_CDC_RX2_RX_VOL_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL, 0xff, 0xfd}, - {WCD9XXX_CDC_RX2_RX_PATH_SEC1, 0x01, 0x01}, - }, -}; - -static const struct wcd_imped_val imped_index[] = { - {4, 0}, - {5, 1}, - {6, 2}, - {7, 3}, - {8, 4}, - {9, 5}, - {10, 6}, - {11, 7}, - {12, 8}, - {13, 9}, -}; - -static void (*clsh_state_fp[NUM_CLSH_STATES_V2])(struct snd_soc_codec *, - struct wcd_clsh_cdc_data *, - u8 req_state, bool en, int mode); - -static int get_impedance_index(int imped) -{ - int i = 0; - - if (imped < imped_index[i].imped_val) { - pr_debug("%s, detected impedance is less than 4 Ohm\n", - __func__); - i = 0; - goto ret; - } - if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) { - pr_debug("%s, detected impedance is greater than 12 Ohm\n", - __func__); - i = ARRAY_SIZE(imped_index) - 1; - goto ret; - } - for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) { - if (imped >= imped_index[i].imped_val && - imped < imped_index[i + 1].imped_val) - break; - } -ret: - pr_debug("%s: selected impedance index = %d\n", - __func__, imped_index[i].index); - return imped_index[i].index; -} - -/* - * Function: wcd_clsh_imped_config - * Params: codec, imped, reset - * Description: - * This function updates HPHL and HPHR gain settings - * according to the impedance value. - */ -void wcd_clsh_imped_config(struct snd_soc_codec *codec, int imped, bool reset) -{ - int i; - int index = 0; - int table_size; - - static const struct wcd_reg_mask_val - (*imped_table_ptr)[MAX_IMPED_PARAMS]; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (IS_CODEC_TYPE(wcd9xxx, WCD934X)) { - table_size = ARRAY_SIZE(imped_table_tavil); - imped_table_ptr = imped_table_tavil; - } else { - table_size = ARRAY_SIZE(imped_table); - imped_table_ptr = imped_table; - } - - /* reset = 1, which means request is to reset the register values */ - if (reset) { - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, 0); - return; - } - index = get_impedance_index(imped); - if (index >= (ARRAY_SIZE(imped_index) - 1)) { - pr_debug("%s, impedance not in range = %d\n", __func__, imped); - return; - } - if (index >= table_size) { - pr_debug("%s, impedance index not in range = %d\n", __func__, - index); - return; - } - for (i = 0; i < MAX_IMPED_PARAMS; i++) - snd_soc_update_bits(codec, - imped_table_ptr[index][i].reg, - imped_table_ptr[index][i].mask, - imped_table_ptr[index][i].val); -} -EXPORT_SYMBOL(wcd_clsh_imped_config); - -static bool is_native_44_1_active(struct snd_soc_codec *codec) -{ - bool native_active = false; - u8 native_clk, rx1_rate, rx2_rate; - - native_clk = snd_soc_read(codec, - WCD9XXX_CDC_CLK_RST_CTRL_MCLK_CONTROL); - rx1_rate = snd_soc_read(codec, WCD9XXX_CDC_RX1_RX_PATH_CTL); - rx2_rate = snd_soc_read(codec, WCD9XXX_CDC_RX2_RX_PATH_CTL); - - dev_dbg(codec->dev, "%s: native_clk %x rx1_rate= %x rx2_rate= %x", - __func__, native_clk, rx1_rate, rx2_rate); - - if ((native_clk & 0x2) && - ((rx1_rate & 0x0F) == 0x9 || (rx2_rate & 0x0F) == 0x9)) - native_active = true; - - return native_active; -} - -static const char *mode_to_str(int mode) -{ - switch (mode) { - case CLS_H_NORMAL: - return "CLS_H_NORMAL"; - case CLS_H_HIFI: - return "CLS_H_HIFI"; - case CLS_H_LOHIFI: - return "CLS_H_LOHIFI"; - case CLS_H_LP: - return "CLS_H_LP"; - case CLS_H_ULP: - return "CLS_H_ULP"; - case CLS_AB: - return "CLS_AB"; - case CLS_AB_HIFI: - return "CLS_AB_HIFI"; - default: - return "CLS_H_INVALID"; - }; -} - -static const char *state_to_str(u8 state, char *buf, size_t buflen) -{ - int i; - int cnt = 0; - /* - * This array of strings should match with enum wcd_clsh_state_bit. - */ - static const char *const states[] = { - "STATE_EAR", - "STATE_HPH_L", - "STATE_HPH_R", - "STATE_LO", - }; - - if (state == WCD_CLSH_STATE_IDLE) { - snprintf(buf, buflen, "[STATE_IDLE]"); - goto done; - } - - buf[0] = '\0'; - for (i = 0; i < ARRAY_SIZE(states); i++) { - if (!(state & (1 << i))) - continue; - cnt = snprintf(buf, buflen - cnt - 1, "%s%s%s", buf, - buf[0] == '\0' ? "[" : "|", - states[i]); - } - if (cnt > 0) - strlcat(buf + cnt, "]", buflen); - -done: - if (buf[0] == '\0') - snprintf(buf, buflen, "[STATE_UNKNOWN]"); - return buf; -} - -static inline void -wcd_enable_clsh_block(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, bool enable) -{ - if ((enable && ++clsh_d->clsh_users == 1) || - (!enable && --clsh_d->clsh_users == 0)) - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_CRC, 0x01, - (u8) enable); - if (clsh_d->clsh_users < 0) - clsh_d->clsh_users = 0; - dev_dbg(codec->dev, "%s: clsh_users %d, enable %d", __func__, - clsh_d->clsh_users, enable); -} - -static inline bool wcd_clsh_enable_status(struct snd_soc_codec *codec) -{ - return snd_soc_read(codec, WCD9XXX_A_CDC_CLSH_CRC) & 0x01; -} - -static inline int wcd_clsh_get_int_mode(struct wcd_clsh_cdc_data *clsh_d, - int clsh_state) -{ - int mode; - - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_LO)) - mode = CLS_NONE; - else - mode = clsh_d->interpolator_modes[ffs(clsh_state)]; - - return mode; -} - -static inline void wcd_clsh_set_int_mode(struct wcd_clsh_cdc_data *clsh_d, - int clsh_state, int mode) -{ - if ((clsh_state != WCD_CLSH_STATE_EAR) && - (clsh_state != WCD_CLSH_STATE_HPHL) && - (clsh_state != WCD_CLSH_STATE_HPHR) && - (clsh_state != WCD_CLSH_STATE_LO)) - return; - - clsh_d->interpolator_modes[ffs(clsh_state)] = mode; -} - -static inline void wcd_clsh_set_buck_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x08, 0x08); /* set to HIFI */ - else - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x08, 0x00); /* set to default */ -} - -static inline void wcd_clsh_set_flyback_mode(struct snd_soc_codec *codec, - int mode) -{ - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x04, 0x04); /* set to HIFI */ - else - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x04, 0x00); /* set to Default */ -} - -static inline void wcd_clsh_gm3_boost_disable(struct snd_soc_codec *codec, - int mode) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!IS_CODEC_TYPE(wcd9xxx, WCD934X)) - return; - - if (mode == CLS_H_HIFI || mode == CLS_H_LOHIFI || - mode == CLS_AB_HIFI || mode == CLS_AB) { - if (TAVIL_IS_1_0(wcd9xxx)) - snd_soc_update_bits(codec, WCD9XXX_HPH_CNP_WG_CTL, - 0x80, 0x0); /* disable GM3 Boost */ - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x80); - } else { - snd_soc_update_bits(codec, WCD9XXX_HPH_CNP_WG_CTL, - 0x80, 0x80); /* set to Default */ - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_4, - 0xF0, 0x70); - } -} - - -static inline void wcd_clsh_force_iq_ctl(struct snd_soc_codec *codec, - int mode) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!IS_CODEC_TYPE(wcd9xxx, WCD934X)) - return; - - if (mode == CLS_H_LOHIFI || mode == CLS_AB) { - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x20); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0xC0); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x02); - } else { - - snd_soc_update_bits(codec, WCD9XXX_HPH_NEW_INT_PA_MISC2, - 0x20, 0x0); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_HPH_LOWPOWER, - 0xF0, 0x80); - snd_soc_update_bits(codec, WCD9XXX_HPH_PA_CTL1, - 0x0E, 0x06); - } -} - -static void wcd_clsh_buck_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - int mode, - bool enable) -{ - /* enable/disable buck */ - if ((enable && (++clsh_d->buck_users == 1)) || - (!enable && (--clsh_d->buck_users == 0))) - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - (1 << 7), (enable << 7)); - dev_dbg(codec->dev, "%s: buck_users %d, enable %d, mode: %s", - __func__, clsh_d->buck_users, enable, mode_to_str(mode)); - /* - * 500us sleep is required after buck enable/disable - * as per HW requirement - */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); -} - -static void wcd_clsh_flyback_ctrl(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - int mode, - bool enable) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_reg_val bulk_reg[2]; - u8 vneg[] = {0x00, 0x40}; - - /* enable/disable flyback */ - if ((enable && (++clsh_d->flyback_users == 1)) || - (!enable && (--clsh_d->flyback_users == 0))) { - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - (1 << 6), (enable << 6)); - /* 100usec delay is needed as per HW requirement */ - usleep_range(100, 110); - if (enable && (TASHA_IS_1_1(wcd9xxx))) { - wcd_clsh_set_flyback_mode(codec, CLS_H_HIFI); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_EN, - 0x60, 0x40); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_EN, - 0x10, 0x10); - vneg[0] = snd_soc_read(codec, - WCD9XXX_A_ANA_RX_SUPPLIES); - vneg[0] &= ~(0x40); - vneg[1] = vneg[0] | 0x40; - bulk_reg[0].reg = WCD9XXX_A_ANA_RX_SUPPLIES; - bulk_reg[0].buf = &vneg[0]; - bulk_reg[0].bytes = 1; - bulk_reg[1].reg = WCD9XXX_A_ANA_RX_SUPPLIES; - bulk_reg[1].buf = &vneg[1]; - bulk_reg[1].bytes = 1; - /* 500usec delay is needed as per HW requirement */ - usleep_range(500, 510); - wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, 2, - false); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_EN, - 0x10, 0x00); - wcd_clsh_set_flyback_mode(codec, mode); - } - - } - dev_dbg(codec->dev, "%s: flyback_users %d, enable %d, mode: %s", - __func__, clsh_d->flyback_users, enable, mode_to_str(mode)); - /* - * 500us sleep is required after flyback enable/disable - * as per HW requirement - */ - usleep_range(500, 500 + WCD_USLEEP_RANGE); -} - -static void wcd_clsh_set_gain_path(struct snd_soc_codec *codec, - int mode) -{ - u8 val = 0; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!TASHA_IS_2_0(wcd9xxx)) - return; - - switch (mode) { - case CLS_H_NORMAL: - case CLS_AB: - val = 0x00; - break; - case CLS_H_HIFI: - val = 0x02; - break; - case CLS_H_LP: - val = 0x01; - break; - default: - return; - }; - snd_soc_update_bits(codec, WCD9XXX_HPH_L_EN, 0xC0, (val << 6)); - snd_soc_update_bits(codec, WCD9XXX_HPH_R_EN, 0xC0, (val << 6)); -} - -static void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec, - int mode) -{ - u8 val = 0; - u8 gain = 0; - u8 res_val = VREF_FILT_R_0OHM; - u8 ipeak = DELTA_I_50MA; - - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - switch (mode) { - case CLS_H_NORMAL: - res_val = VREF_FILT_R_50KOHM; - val = 0x00; - gain = DAC_GAIN_0DB; - ipeak = DELTA_I_50MA; - break; - case CLS_AB: - val = 0x00; - gain = DAC_GAIN_0DB; - ipeak = DELTA_I_50MA; - break; - case CLS_AB_HIFI: - val = 0x08; - break; - case CLS_H_HIFI: - val = 0x08; - gain = DAC_GAIN_M0P2DB; - ipeak = DELTA_I_50MA; - break; - case CLS_H_LOHIFI: - val = 0x00; - if ((IS_CODEC_TYPE(wcd9xxx, WCD9335)) || - (IS_CODEC_TYPE(wcd9xxx, WCD9326))) { - val = 0x08; - gain = DAC_GAIN_M0P2DB; - ipeak = DELTA_I_50MA; - } - break; - case CLS_H_ULP: - val = 0x0C; - break; - case CLS_H_LP: - val = 0x04; - ipeak = DELTA_I_30MA; - break; - default: - return; - }; - - /* - * For tavil set mode to Lower_power for - * CLS_H_LOHIFI and CLS_AB - */ - if ((IS_CODEC_TYPE(wcd9xxx, WCD934X)) && - (mode == CLS_H_LOHIFI || mode == CLS_AB)) - val = 0x04; - - snd_soc_update_bits(codec, WCD9XXX_A_ANA_HPH, 0x0C, val); - if (TASHA_IS_2_0(wcd9xxx)) { - snd_soc_update_bits(codec, WCD9XXX_CLASSH_CTRL_VCL_2, - 0x30, (res_val << 4)); - if (mode != CLS_H_LP) - snd_soc_update_bits(codec, WCD9XXX_HPH_REFBUFF_UHQA_CTL, - 0x07, gain); - snd_soc_update_bits(codec, WCD9XXX_CLASSH_CTRL_CCL_1, - 0xF0, (ipeak << 4)); - } -} - -static void wcd_clsh_set_flyback_vneg_ctl(struct snd_soc_codec *codec, - bool enable) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!TASHA_IS_2_0(wcd9xxx)) - return; - - if (enable) { - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_1, 0xE0, - 0x00); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, (0x07 << 5)); - } else { - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEG_CTRL_1, 0xE0, - (0x07 << 5)); - snd_soc_update_bits(codec, WCD9XXX_FLYBACK_VNEGDAC_CTRL_2, - 0xE0, (0x02 << 5)); - } -} - -static void wcd_clsh_set_flyback_current(struct snd_soc_codec *codec, int mode) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - - if (!TASHA_IS_2_0(wcd9xxx)) - return; - - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0x0F, 0x0A); - snd_soc_update_bits(codec, WCD9XXX_RX_BIAS_FLYB_BUFF, 0xF0, 0xA0); - /* Sleep needed to avoid click and pop as per HW requirement */ - usleep_range(100, 110); -} - -static void wcd_clsh_set_buck_regulator_mode(struct snd_soc_codec *codec, - int mode) -{ - snd_soc_update_bits(codec, WCD9XXX_A_ANA_RX_SUPPLIES, - 0x02, 0x00); -} - -static void wcd_clsh_state_lo(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - dev_err(codec->dev, "%s: LO cannot be in this mode: %d\n", - __func__, mode); - return; - } - - if (is_enable) { - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_vneg_ctl(codec, true); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - } else { - wcd_clsh_buck_ctrl(codec, clsh_d, mode, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_vneg_ctl(codec, false); - wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_hph_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - int hph_mode = 0; - - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - if (req_state == WCD_CLSH_STATE_EAR) { - /* If HPH is running in CLS-AB when - * EAR comes, let it continue to run - * in Class-AB, no need to enable Class-H - * for EAR. - */ - if (clsh_d->state & WCD_CLSH_STATE_HPHL) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHL); - else if (clsh_d->state & WCD_CLSH_STATE_HPHR) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHR); - else - return; - if (hph_mode != CLS_AB && hph_mode != CLS_AB_HIFI - && !is_native_44_1_active(codec)) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - } - - if (is_native_44_1_active(codec)) { - snd_soc_write(codec, WCD9XXX_CDC_CLSH_HPH_V_PA, 0x39); - snd_soc_update_bits(codec, - WCD9XXX_CDC_RX0_RX_PATH_SEC0, - 0x03, 0x00); - if ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR)) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - } - - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - if ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR)) { - wcd_clsh_set_gain_path(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_hph_mode(codec, mode); - } - } else { - if (req_state == WCD_CLSH_STATE_EAR) { - /* - * If EAR goes away, disable EAR Channel Enable - * if HPH running in Class-H otherwise - * and if HPH requested mode is CLS_AB then - * no need to disable EAR channel enable bit. - */ - if (wcd_clsh_enable_status(codec)) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - } - - if (is_native_44_1_active(codec)) { - snd_soc_write(codec, WCD9XXX_CDC_CLSH_HPH_V_PA, 0x1C); - snd_soc_update_bits(codec, - WCD9XXX_CDC_RX0_RX_PATH_SEC0, - 0x03, 0x01); - if (((clsh_d->state & WCD_CLSH_STATE_HPH_ST) - != WCD_CLSH_STATE_HPH_ST) && - ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR))) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - } - - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - if ((req_state & WCD_CLSH_STATE_HPH_ST) && - !wcd_clsh_enable_status(codec)) { - /* If Class-H is not enabled when HPH is turned - * off, enable it as EAR is in progress - */ - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } - } -} - -static void wcd_clsh_state_ear_lo(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - /* LO powerup is taken care in PA sequence. - * No need to change to class AB here. - */ - if (req_state == WCD_CLSH_STATE_EAR) { - /* EAR powerup.*/ - if (!wcd_clsh_enable_status(codec)) { - wcd_enable_clsh_block(codec, clsh_d, true); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - } - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - } - } else { - if (req_state == WCD_CLSH_STATE_EAR) { - /* EAR powerdown.*/ - wcd_enable_clsh_block(codec, clsh_d, false); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - } - /* LO powerdown is taken care in PA sequence. - * No need to change to class H here. - */ - } -} - -static void wcd_clsh_state_hph_lo(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - int hph_mode = 0; - - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (is_enable) { - /* - * If requested state is LO, put regulator - * in class-AB or if requested state is HPH, - * which means LO is already enabled, keep - * the regulator config the same at class-AB - * and just set the power modes for flyback - * and buck. - */ - if (req_state == WCD_CLSH_STATE_LO) - wcd_clsh_set_buck_regulator_mode(codec, CLS_AB); - else { - if (!wcd_clsh_enable_status(codec)) { - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_set_flyback_vneg_ctl(codec, false); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_hph_mode(codec, mode); - wcd_clsh_set_gain_path(codec, mode); - } else { - dev_dbg(codec->dev, "%s:clsh is already enabled\n", - __func__); - } - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } - } else { - if ((req_state == WCD_CLSH_STATE_HPHL) || - (req_state == WCD_CLSH_STATE_HPHR)) { - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - /* - * If HPH is powering down first, then disable clsh, - * set the buck/flyback mode to default and keep the - * regulator at Class-AB - */ - if ((clsh_d->state & WCD_CLSH_STATE_HPH_ST) - != WCD_CLSH_STATE_HPH_ST) { - wcd_enable_clsh_block(codec, clsh_d, false); - wcd_clsh_set_flyback_vneg_ctl(codec, true); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } - } else { - /* LO powerdown. - * If HPH mode also is CLS-AB, no need - * to turn-on class-H, otherwise enable - * Class-H configuration. - */ - if (clsh_d->state & WCD_CLSH_STATE_HPHL) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHL); - else if (clsh_d->state & WCD_CLSH_STATE_HPHR) - hph_mode = wcd_clsh_get_int_mode(clsh_d, - WCD_CLSH_STATE_HPHR); - else - return; - dev_dbg(codec->dev, "%s: hph_mode = %d\n", __func__, - hph_mode); - - if ((hph_mode == CLS_AB) || - (hph_mode == CLS_AB_HIFI) || - (hph_mode == CLS_NONE)) - goto end; - - /* - * If Class-H is already enabled (HPH ON and then - * LO ON), no need to turn on again, just set the - * regulator mode. - */ - if (wcd_clsh_enable_status(codec)) { - wcd_clsh_set_buck_regulator_mode(codec, - hph_mode); - goto end; - } else { - dev_dbg(codec->dev, "%s: clsh is not enabled\n", - __func__); - } - - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - wcd_clsh_set_buck_regulator_mode(codec, - hph_mode); - if (clsh_d->state & WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (clsh_d->state & WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - wcd_clsh_set_hph_mode(codec, hph_mode); - } - } -end: - return; -} - -static void wcd_clsh_state_hph_st(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_AB || mode == CLS_AB_HIFI) - return; - - if (is_enable) { - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } else { - if (req_state == WCD_CLSH_STATE_HPHL) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - if (req_state == WCD_CLSH_STATE_HPHR) - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - } -} - -static void wcd_clsh_state_hph_r(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_err(codec->dev, "%s: Normal mode not applicable for hph_r\n", - __func__); - return; - } - - if (is_enable) { - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - wcd_enable_clsh_block(codec, clsh_d, true); - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x40); - } - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_gm3_boost_disable(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - wcd_clsh_set_gain_path(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX2_RX_PATH_CFG0, - 0x40, 0x00); - wcd_enable_clsh_block(codec, clsh_d, false); - } - /* buck and flyback set to default mode and disable */ - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL); - wcd_clsh_gm3_boost_disable(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_hph_l(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode == CLS_H_NORMAL) { - dev_err(codec->dev, "%s: Normal mode not applicable for hph_l\n", - __func__); - return; - } - - if (is_enable) { - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - wcd_enable_clsh_block(codec, clsh_d, true); - /* - * These K1 values depend on the Headphone Impedance - * For now it is assumed to be 16 ohm - */ - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_MSB, - 0x0F, 0x00); - snd_soc_update_bits(codec, WCD9XXX_A_CDC_CLSH_K1_LSB, - 0xFF, 0xC0); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x40); - } - wcd_clsh_set_buck_regulator_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_gm3_boost_disable(codec, mode); - wcd_clsh_force_iq_ctl(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_hph_mode(codec, mode); - wcd_clsh_set_gain_path(codec, mode); - } else { - wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL); - - if (mode != CLS_AB && mode != CLS_AB_HIFI) { - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX1_RX_PATH_CFG0, - 0x40, 0x00); - wcd_enable_clsh_block(codec, clsh_d, false); - } - /* set buck and flyback to Default Mode */ - wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false); - wcd_clsh_force_iq_ctl(codec, CLS_H_NORMAL); - wcd_clsh_gm3_boost_disable(codec, CLS_H_NORMAL); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_ear(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - dev_dbg(codec->dev, "%s: mode: %s, %s\n", __func__, mode_to_str(mode), - is_enable ? "enable" : "disable"); - - if (mode != CLS_H_NORMAL) { - dev_err(codec->dev, "%s: mode: %s cannot be used for EAR\n", - __func__, mode_to_str(mode)); - return; - } - - if (is_enable) { - wcd_enable_clsh_block(codec, clsh_d, true); - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x40); - wcd_clsh_set_buck_mode(codec, mode); - wcd_clsh_set_flyback_mode(codec, mode); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true); - wcd_clsh_set_flyback_current(codec, mode); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, true); - } else { - snd_soc_update_bits(codec, - WCD9XXX_A_CDC_RX0_RX_PATH_CFG0, - 0x40, 0x00); - wcd_enable_clsh_block(codec, clsh_d, false); - wcd_clsh_buck_ctrl(codec, clsh_d, mode, false); - wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false); - wcd_clsh_set_flyback_mode(codec, CLS_H_NORMAL); - wcd_clsh_set_buck_mode(codec, CLS_H_NORMAL); - } -} - -static void wcd_clsh_state_err(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *clsh_d, - u8 req_state, bool is_enable, int mode) -{ - char msg[128]; - - dev_err(codec->dev, - "%s Wrong request for class H state machine requested to %s %s", - __func__, is_enable ? "enable" : "disable", - state_to_str(req_state, msg, sizeof(msg))); - WARN_ON(1); -} - -/* - * Function: wcd_clsh_is_state_valid - * Params: state - * Description: - * Provides information on valid states of Class H configuration - */ -static bool wcd_clsh_is_state_valid(u8 state) -{ - switch (state) { - case WCD_CLSH_STATE_IDLE: - case WCD_CLSH_STATE_EAR: - case WCD_CLSH_STATE_HPHL: - case WCD_CLSH_STATE_HPHR: - case WCD_CLSH_STATE_HPH_ST: - case WCD_CLSH_STATE_LO: - case WCD_CLSH_STATE_HPHL_EAR: - case WCD_CLSH_STATE_HPHR_EAR: - case WCD_CLSH_STATE_HPH_ST_EAR: - case WCD_CLSH_STATE_HPHL_LO: - case WCD_CLSH_STATE_HPHR_LO: - case WCD_CLSH_STATE_HPH_ST_LO: - case WCD_CLSH_STATE_EAR_LO: - return true; - default: - return false; - }; -} - -/* - * Function: wcd_clsh_fsm - * Params: codec, cdc_clsh_d, req_state, req_type, clsh_event - * Description: - * This function handles PRE DAC and POST DAC conditions of different devices - * and updates class H configuration of different combination of devices - * based on validity of their states. cdc_clsh_d will contain current - * class h state information - */ -void wcd_clsh_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode) -{ - u8 old_state, new_state; - char msg0[128], msg1[128]; - - switch (clsh_event) { - case WCD_CLSH_EVENT_PRE_DAC: - old_state = cdc_clsh_d->state; - new_state = old_state | req_state; - - if (!wcd_clsh_is_state_valid(new_state)) { - dev_err(codec->dev, - "%s: Class-H not a valid new state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, sizeof(msg0))); - return; - } - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, int_mode); - (*clsh_state_fp[new_state]) (codec, cdc_clsh_d, req_state, - CLSH_REQ_ENABLE, int_mode); - dev_dbg(codec->dev, - "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, sizeof(msg1))); - break; - case WCD_CLSH_EVENT_POST_PA: - old_state = cdc_clsh_d->state; - new_state = old_state & (~req_state); - if (new_state < NUM_CLSH_STATES_V2) { - if (!wcd_clsh_is_state_valid(old_state)) { - dev_err(codec->dev, - "%s:Invalid old state:%s\n", - __func__, - state_to_str(old_state, msg0, - sizeof(msg0))); - return; - } - if (new_state == old_state) { - dev_err(codec->dev, - "%s: Class-H already in requested state: %s\n", - __func__, - state_to_str(new_state, msg0, - sizeof(msg0))); - return; - } - (*clsh_state_fp[old_state]) (codec, cdc_clsh_d, - req_state, CLSH_REQ_DISABLE, - int_mode); - cdc_clsh_d->state = new_state; - wcd_clsh_set_int_mode(cdc_clsh_d, req_state, CLS_NONE); - dev_dbg(codec->dev, "%s: ClassH state transition from %s to %s\n", - __func__, state_to_str(old_state, msg0, - sizeof(msg0)), - state_to_str(cdc_clsh_d->state, msg1, - sizeof(msg1))); - } - break; - }; -} -EXPORT_SYMBOL(wcd_clsh_fsm); - -int wcd_clsh_get_clsh_state(struct wcd_clsh_cdc_data *clsh) -{ - return clsh->state; -} -EXPORT_SYMBOL(wcd_clsh_get_clsh_state); - -void wcd_clsh_init(struct wcd_clsh_cdc_data *clsh) -{ - int i; - - clsh->state = WCD_CLSH_STATE_IDLE; - - for (i = 0; i < NUM_CLSH_STATES_V2; i++) - clsh_state_fp[i] = wcd_clsh_state_err; - - clsh_state_fp[WCD_CLSH_STATE_EAR] = wcd_clsh_state_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHL] = - wcd_clsh_state_hph_l; - clsh_state_fp[WCD_CLSH_STATE_HPHR] = - wcd_clsh_state_hph_r; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST] = - wcd_clsh_state_hph_st; - clsh_state_fp[WCD_CLSH_STATE_LO] = wcd_clsh_state_lo; - clsh_state_fp[WCD_CLSH_STATE_HPHL_EAR] = - wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHR_EAR] = - wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_EAR] = - wcd_clsh_state_hph_ear; - clsh_state_fp[WCD_CLSH_STATE_HPHL_LO] = wcd_clsh_state_hph_lo; - clsh_state_fp[WCD_CLSH_STATE_HPHR_LO] = wcd_clsh_state_hph_lo; - clsh_state_fp[WCD_CLSH_STATE_HPH_ST_LO] = - wcd_clsh_state_hph_lo; - clsh_state_fp[WCD_CLSH_STATE_EAR_LO] = wcd_clsh_state_ear_lo; - /* Set interpolaotr modes to NONE */ - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_EAR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHL, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_HPHR, CLS_NONE); - wcd_clsh_set_int_mode(clsh, WCD_CLSH_STATE_LO, CLS_NONE); - clsh->flyback_users = 0; - clsh->buck_users = 0; - clsh->clsh_users = 0; -} -EXPORT_SYMBOL(wcd_clsh_init); - -MODULE_DESCRIPTION("WCD9XXX Common Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-common-v2.h b/techpack/audio/asoc/codecs/wcd9xxx-common-v2.h deleted file mode 100644 index 53c9a84b51ad..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-common-v2.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD9XXX_COMMON_V2 - -#define _WCD9XXX_COMMON_V2 - -#define CLSH_REQ_ENABLE true -#define CLSH_REQ_DISABLE false - -#define WCD_CLSH_EVENT_PRE_DAC 0x01 -#define WCD_CLSH_EVENT_POST_PA 0x02 -#define MAX_VBAT_MONITOR_WRITES 17 -/* - * Basic states for Class H state machine. - * represented as a bit mask within a u8 data type - * bit 0: EAR mode - * bit 1: HPH Left mode - * bit 2: HPH Right mode - * bit 3: Lineout mode - */ -#define WCD_CLSH_STATE_IDLE 0x00 -#define WCD_CLSH_STATE_EAR (0x01 << 0) -#define WCD_CLSH_STATE_HPHL (0x01 << 1) -#define WCD_CLSH_STATE_HPHR (0x01 << 2) -#define WCD_CLSH_STATE_LO (0x01 << 3) - -/* - * Though number of CLSH states are 4, max state shoulbe be 5 - * because state array index starts from 1. - */ -#define WCD_CLSH_STATE_MAX 5 -#define NUM_CLSH_STATES_V2 (0x01 << WCD_CLSH_STATE_MAX) - - -/* Derived State: Bits 1 and 2 should be set for Headphone stereo */ -#define WCD_CLSH_STATE_HPH_ST (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_HPHR) - -#define WCD_CLSH_STATE_HPHL_LO (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_HPHR_LO (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_HPH_ST_LO (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_EAR_LO (WCD_CLSH_STATE_EAR | \ - WCD_CLSH_STATE_LO) -#define WCD_CLSH_STATE_HPHL_EAR (WCD_CLSH_STATE_HPHL | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPHR_EAR (WCD_CLSH_STATE_HPHR | \ - WCD_CLSH_STATE_EAR) -#define WCD_CLSH_STATE_HPH_ST_EAR (WCD_CLSH_STATE_HPH_ST | \ - WCD_CLSH_STATE_EAR) - -enum { - CLS_H_NORMAL = 0, /* Class-H Default */ - CLS_H_HIFI, /* Class-H HiFi */ - CLS_H_LP, /* Class-H Low Power */ - CLS_AB, /* Class-AB Low HIFI*/ - CLS_H_LOHIFI, /* LoHIFI */ - CLS_H_ULP, /* Ultra Low power */ - CLS_AB_HIFI, /* Class-AB */ - CLS_NONE, /* None of the above modes */ -}; - -/* Class H data that the codec driver will maintain */ -struct wcd_clsh_cdc_data { - u8 state; - int flyback_users; - int buck_users; - int clsh_users; - int interpolator_modes[WCD_CLSH_STATE_MAX]; -}; - -struct wcd_mad_audio_header { - u32 reserved[3]; - u32 num_reg_cfg; -}; - -struct wcd_mad_microphone_info { - uint8_t input_microphone; - uint8_t cycle_time; - uint8_t settle_time; - uint8_t padding; -} __packed; - -struct wcd_mad_micbias_info { - uint8_t micbias; - uint8_t k_factor; - uint8_t external_bypass_capacitor; - uint8_t internal_biasing; - uint8_t cfilter; - uint8_t padding[3]; -} __packed; - -struct wcd_mad_rms_audio_beacon_info { - uint8_t rms_omit_samples; - uint8_t rms_comp_time; - uint8_t detection_mechanism; - uint8_t rms_diff_threshold; - uint8_t rms_threshold_lsb; - uint8_t rms_threshold_msb; - uint8_t padding[2]; - uint8_t iir_coefficients[36]; -} __packed; - -struct wcd_mad_rms_ultrasound_info { - uint8_t rms_comp_time; - uint8_t detection_mechanism; - uint8_t rms_diff_threshold; - uint8_t rms_threshold_lsb; - uint8_t rms_threshold_msb; - uint8_t padding[3]; - uint8_t iir_coefficients[36]; -} __packed; - -struct wcd_mad_audio_cal { - uint32_t version; - struct wcd_mad_microphone_info microphone_info; - struct wcd_mad_micbias_info micbias_info; - struct wcd_mad_rms_audio_beacon_info audio_info; - struct wcd_mad_rms_audio_beacon_info beacon_info; - struct wcd_mad_rms_ultrasound_info ultrasound_info; -} __packed; - -struct wcd9xxx_anc_header { - u32 reserved[3]; - u32 num_anc_slots; -}; - -struct vbat_monitor_reg { - u32 size; - u32 writes[MAX_VBAT_MONITOR_WRITES]; -} __packed; - -struct wcd_reg_mask_val { - u16 reg; - u8 mask; - u8 val; -}; - -extern void wcd_clsh_fsm(struct snd_soc_codec *codec, - struct wcd_clsh_cdc_data *cdc_clsh_d, - u8 clsh_event, u8 req_state, - int int_mode); - -extern void wcd_clsh_init(struct wcd_clsh_cdc_data *clsh); -extern int wcd_clsh_get_clsh_state(struct wcd_clsh_cdc_data *clsh); -extern void wcd_clsh_imped_config(struct snd_soc_codec *codec, int imped, - bool reset); - -enum { - RESERVED = 0, - AANC_LPF_FF_FB = 1, - AANC_LPF_COEFF_MSB, - AANC_LPF_COEFF_LSB, - HW_MAD_AUDIO_ENABLE, - HW_MAD_ULTR_ENABLE, - HW_MAD_BEACON_ENABLE, - HW_MAD_AUDIO_SLEEP_TIME, - HW_MAD_ULTR_SLEEP_TIME, - HW_MAD_BEACON_SLEEP_TIME, - HW_MAD_TX_AUDIO_SWITCH_OFF, - HW_MAD_TX_ULTR_SWITCH_OFF, - HW_MAD_TX_BEACON_SWITCH_OFF, - MAD_AUDIO_INT_DEST_SELECT_REG, - MAD_ULT_INT_DEST_SELECT_REG, - MAD_BEACON_INT_DEST_SELECT_REG, - MAD_CLIP_INT_DEST_SELECT_REG, - VBAT_INT_DEST_SELECT_REG, - MAD_AUDIO_INT_MASK_REG, - MAD_ULT_INT_MASK_REG, - MAD_BEACON_INT_MASK_REG, - MAD_CLIP_INT_MASK_REG, - VBAT_INT_MASK_REG, - MAD_AUDIO_INT_STATUS_REG, - MAD_ULT_INT_STATUS_REG, - MAD_BEACON_INT_STATUS_REG, - MAD_CLIP_INT_STATUS_REG, - VBAT_INT_STATUS_REG, - MAD_AUDIO_INT_CLEAR_REG, - MAD_ULT_INT_CLEAR_REG, - MAD_BEACON_INT_CLEAR_REG, - MAD_CLIP_INT_CLEAR_REG, - VBAT_INT_CLEAR_REG, - SB_PGD_PORT_TX_WATERMARK_N, - SB_PGD_PORT_TX_ENABLE_N, - SB_PGD_PORT_RX_WATERMARK_N, - SB_PGD_PORT_RX_ENABLE_N, - SB_PGD_TX_PORTn_MULTI_CHNL_0, - SB_PGD_TX_PORTn_MULTI_CHNL_1, - SB_PGD_RX_PORTn_MULTI_CHNL_0, - SB_PGD_RX_PORTn_MULTI_CHNL_1, - AANC_FF_GAIN_ADAPTIVE, - AANC_FFGAIN_ADAPTIVE_EN, - AANC_GAIN_CONTROL, - SPKR_CLIP_PIPE_BANK_SEL, - SPKR_CLIPDET_VAL0, - SPKR_CLIPDET_VAL1, - SPKR_CLIPDET_VAL2, - SPKR_CLIPDET_VAL3, - SPKR_CLIPDET_VAL4, - SPKR_CLIPDET_VAL5, - SPKR_CLIPDET_VAL6, - SPKR_CLIPDET_VAL7, - VBAT_RELEASE_INT_DEST_SELECT_REG, - VBAT_RELEASE_INT_MASK_REG, - VBAT_RELEASE_INT_STATUS_REG, - VBAT_RELEASE_INT_CLEAR_REG, - MAD2_CLIP_INT_DEST_SELECT_REG, - MAD2_CLIP_INT_MASK_REG, - MAD2_CLIP_INT_STATUS_REG, - MAD2_CLIP_INT_CLEAR_REG, - SPKR2_CLIP_PIPE_BANK_SEL, - SPKR2_CLIPDET_VAL0, - SPKR2_CLIPDET_VAL1, - SPKR2_CLIPDET_VAL2, - SPKR2_CLIPDET_VAL3, - SPKR2_CLIPDET_VAL4, - SPKR2_CLIPDET_VAL5, - SPKR2_CLIPDET_VAL6, - SPKR2_CLIPDET_VAL7, - MAX_CFG_REGISTERS, -}; - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9xxx-core-init.c b/techpack/audio/asoc/codecs/wcd9xxx-core-init.c deleted file mode 100644 index e575e0d3472e..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-core-init.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "msm-cdc-pinctrl.h" -#include "wcd9xxx-irq.h" -#include "core.h" - -#define NUM_DRIVERS_REG_RET 3 - -static int __init wcd9xxx_core_init(void) -{ - int ret[NUM_DRIVERS_REG_RET] = {0}; - int i = 0; - - ret[0] = msm_cdc_pinctrl_drv_init(); - if (ret[0]) - pr_err("%s: Failed init pinctrl drv: %d\n", __func__, ret[0]); - - ret[1] = wcd9xxx_irq_drv_init(); - if (ret[1]) - pr_err("%s: Failed init irq drv: %d\n", __func__, ret[1]); - - ret[2] = wcd9xxx_init(); - if (ret[2]) - pr_err("%s: Failed wcd core drv: %d\n", __func__, ret[2]); - - for (i = 0; i < NUM_DRIVERS_REG_RET; i++) { - if (ret[i]) - return ret[i]; - } - - return 0; -} -module_init(wcd9xxx_core_init); - -static void __exit wcd9xxx_core_exit(void) -{ - wcd9xxx_exit(); - wcd9xxx_irq_drv_exit(); - msm_cdc_pinctrl_drv_exit(); -} -module_exit(wcd9xxx_core_exit); - -MODULE_DESCRIPTION("WCD9XXX CODEC core init driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-core.c b/techpack/audio/asoc/codecs/wcd9xxx-core.c deleted file mode 100644 index f1b34b047251..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-core.c +++ /dev/null @@ -1,1751 +0,0 @@ -/* Copyright (c) 2011-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "core.h" -#include "pdata.h" -#include "msm-cdc-pinctrl.h" -#include "msm-cdc-supply.h" -#include "wcd9xxx-irq.h" -#include "wcd9xxx-utils.h" -#include "wcd9xxx-regmap.h" -#include "wcd9xxx-slimslave.h" - -#define WCD9XXX_REGISTER_START_OFFSET 0x800 -#define WCD9XXX_SLIM_RW_MAX_TRIES 3 -#define SLIMBUS_PRESENT_TIMEOUT 100 - -#define MAX_WCD9XXX_DEVICE 4 -#define WCD9XXX_I2C_GSBI_SLAVE_ID "3-000d" -#define WCD9XXX_I2C_TOP_SLAVE_ADDR 0x0d -#define WCD9XXX_ANALOG_I2C_SLAVE_ADDR 0x77 -#define WCD9XXX_DIGITAL1_I2C_SLAVE_ADDR 0x66 -#define WCD9XXX_DIGITAL2_I2C_SLAVE_ADDR 0x55 -#define WCD9XXX_I2C_TOP_LEVEL 0 -#define WCD9XXX_I2C_ANALOG 1 -#define WCD9XXX_I2C_DIGITAL_1 2 -#define WCD9XXX_I2C_DIGITAL_2 3 - -/* - * Number of return values needs to be checked for each - * registration of Slimbus of I2C bus for each codec - */ -#define NUM_WCD9XXX_REG_RET 5 - -#define SLIM_USR_MC_REPEAT_CHANGE_VALUE 0x0 -#define SLIM_REPEAT_WRITE_MAX_SLICE 16 -#define REG_BYTES 2 -#define VAL_BYTES 1 -#define WCD9XXX_PAGE_NUM(reg) (((reg) >> 8) & 0xff) -#define WCD9XXX_PAGE_SIZE 256 - -struct wcd9xxx_i2c { - struct i2c_client *client; - struct i2c_msg xfer_msg[2]; - struct mutex xfer_lock; - int mod_id; -}; - -static struct regmap_config wcd9xxx_base_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .can_multi_write = true, -}; - -static struct regmap_config wcd9xxx_i2c_base_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .can_multi_write = false, - .use_single_rw = true, -}; - -static u8 wcd9xxx_pgd_la; -static u8 wcd9xxx_inf_la; - -static const int wcd9xxx_cdc_types[] = { - [WCD9XXX] = WCD9XXX, - [WCD9330] = WCD9330, - [WCD9335] = WCD9335, - [WCD934X] = WCD934X, - [WCD9360] = WCD9360, -}; - -static const struct of_device_id wcd9xxx_of_match[] = { - { .compatible = "qcom,tavil-i2c", - .data = (void *)&wcd9xxx_cdc_types[WCD934X]}, - { .compatible = "qcom,tasha-i2c-pgd", - .data = (void *)&wcd9xxx_cdc_types[WCD9335]}, - { .compatible = "qcom,wcd9xxx-i2c", - .data = (void *)&wcd9xxx_cdc_types[WCD9330]}, - { } -}; -MODULE_DEVICE_TABLE(of, wcd9xxx_of_match); - -static int wcd9xxx_slim_device_up(struct slim_device *sldev); -static int wcd9xxx_slim_device_down(struct slim_device *sldev); - -struct wcd9xxx_i2c wcd9xxx_modules[MAX_WCD9XXX_DEVICE]; - -static int wcd9xxx_slim_multi_reg_write(struct wcd9xxx *wcd9xxx, - const void *data, size_t count) -{ - unsigned int reg; - struct device *dev; - u8 val[WCD9XXX_PAGE_SIZE]; - int ret = 0; - int i = 0; - int n = 0; - unsigned int page_num; - size_t num_regs = (count / (REG_BYTES + VAL_BYTES)); - struct wcd9xxx_reg_val *bulk_reg; - u8 *buf; - - dev = wcd9xxx->dev; - if (!data) { - dev_err(dev, "%s: data is NULL\n", __func__); - return -EINVAL; - } - if (num_regs == 0) - return -EINVAL; - - bulk_reg = kzalloc(num_regs * (sizeof(struct wcd9xxx_reg_val)), - GFP_KERNEL); - if (!bulk_reg) - return -ENOMEM; - - buf = (u8 *)data; - reg = *(u16 *)buf; - page_num = WCD9XXX_PAGE_NUM(reg); - for (i = 0, n = 0; n < num_regs; i++, n++) { - reg = *(u16 *)buf; - if (page_num != WCD9XXX_PAGE_NUM(reg)) { - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, - i, false); - page_num = WCD9XXX_PAGE_NUM(reg); - i = 0; - } - buf += REG_BYTES; - val[i] = *buf; - buf += VAL_BYTES; - bulk_reg[i].reg = reg; - bulk_reg[i].buf = &val[i]; - bulk_reg[i].bytes = 1; - } - ret = wcd9xxx_slim_bulk_write(wcd9xxx, bulk_reg, - i, false); - if (ret) - dev_err(dev, "%s: error writing bulk regs\n", - __func__); - - kfree(bulk_reg); - return ret; -} - -/* - * wcd9xxx_interface_reg_read: Read slim interface registers - * - * @wcd9xxx: Pointer to wcd9xxx structure - * @reg: register adderss - * - * Returns register value in success and negative error code in case of failure - */ -int wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg) -{ - u8 val; - int ret; - - mutex_lock(&wcd9xxx->io_lock); - ret = wcd9xxx->read_dev(wcd9xxx, reg, 1, (void *)&val, - true); - if (ret < 0) - dev_err(wcd9xxx->dev, "%s: Codec read 0x%x failed\n", - __func__, reg); - else - dev_dbg(wcd9xxx->dev, "%s: Read 0x%02x from 0x%x\n", - __func__, val, reg); - - mutex_unlock(&wcd9xxx->io_lock); - - if (ret < 0) - return ret; - else - return val; -} -EXPORT_SYMBOL(wcd9xxx_interface_reg_read); - -/* - * wcd9xxx_interface_reg_write: Write slim interface registers - * - * @wcd9xxx: Pointer to wcd9xxx structure - * @reg: register adderss - * @val: value of the register to be written - * - * Returns 0 for success and negative error code in case of failure - */ -int wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg, - u8 val) -{ - int ret; - - mutex_lock(&wcd9xxx->io_lock); - ret = wcd9xxx->write_dev(wcd9xxx, reg, 1, (void *)&val, true); - dev_dbg(wcd9xxx->dev, "%s: Write %02x to 0x%x ret(%d)\n", - __func__, val, reg, ret); - mutex_unlock(&wcd9xxx->io_lock); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_interface_reg_write); - -static int wcd9xxx_slim_read_device(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *dest, bool interface) -{ - int ret; - struct slim_ele_access msg; - int slim_read_tries = WCD9XXX_SLIM_RW_MAX_TRIES; - - msg.start_offset = WCD9XXX_REGISTER_START_OFFSET + reg; - msg.num_bytes = bytes; - msg.comp = NULL; - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No read allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - return 0; - } - - while (1) { - mutex_lock(&wcd9xxx->xfer_lock); - ret = slim_request_val_element(interface ? - wcd9xxx->slim_slave : wcd9xxx->slim, - &msg, dest, bytes); - mutex_unlock(&wcd9xxx->xfer_lock); - if (likely(ret == 0) || (--slim_read_tries == 0)) - break; - usleep_range(5000, 5100); - } - - if (ret) - dev_err(wcd9xxx->dev, "%s: Error, Codec read failed (%d)\n", - __func__, ret); - - return ret; -} - -/* - * Interface specifies whether the write is to the interface or general - * registers. - */ -static int wcd9xxx_slim_write_device(struct wcd9xxx *wcd9xxx, - unsigned short reg, int bytes, void *src, bool interface) -{ - int ret; - struct slim_ele_access msg; - int slim_write_tries = WCD9XXX_SLIM_RW_MAX_TRIES; - - msg.start_offset = WCD9XXX_REGISTER_START_OFFSET + reg; - msg.num_bytes = bytes; - msg.comp = NULL; - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No write allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - return 0; - } - - while (1) { - mutex_lock(&wcd9xxx->xfer_lock); - ret = slim_change_val_element(interface ? - wcd9xxx->slim_slave : wcd9xxx->slim, - &msg, src, bytes); - mutex_unlock(&wcd9xxx->xfer_lock); - if (likely(ret == 0) || (--slim_write_tries == 0)) - break; - usleep_range(5000, 5100); - } - - if (ret) - pr_err("%s: Error, Codec write failed (%d)\n", __func__, ret); - - return ret; -} - -static int wcd9xxx_slim_get_allowed_slice(struct wcd9xxx *wcd9xxx, - int bytes) -{ - int allowed_sz = bytes; - - if (likely(bytes == SLIM_REPEAT_WRITE_MAX_SLICE)) - allowed_sz = 16; - else if (bytes >= 12) - allowed_sz = 12; - else if (bytes >= 8) - allowed_sz = 8; - else if (bytes >= 6) - allowed_sz = 6; - else if (bytes >= 4) - allowed_sz = 4; - else - allowed_sz = bytes; - - return allowed_sz; -} - -/* - * wcd9xxx_slim_write_repeat: Write the same register with multiple values - * @wcd9xxx: handle to wcd core - * @reg: register to be written - * @bytes: number of bytes to be written to reg - * @src: buffer with data content to be written to reg - * This API will write reg with bytes from src in a single slimbus - * transaction. All values from 1 to 16 are supported by this API. - */ -int wcd9xxx_slim_write_repeat(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src) -{ - int ret = 0, bytes_to_write = bytes, bytes_allowed; - struct slim_ele_access slim_msg; - - mutex_lock(&wcd9xxx->io_lock); - if (wcd9xxx->type == WCD9335 || wcd9xxx->type == WCD934X || - wcd9xxx->type == WCD9360) { - ret = wcd9xxx_page_write(wcd9xxx, ®); - if (ret) - goto done; - } - - slim_msg.start_offset = WCD9XXX_REGISTER_START_OFFSET + reg; - slim_msg.comp = NULL; - - if (unlikely(bytes > SLIM_REPEAT_WRITE_MAX_SLICE)) { - dev_err(wcd9xxx->dev, "%s: size %d not supported\n", - __func__, bytes); - ret = -EINVAL; - goto done; - } - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No write allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - ret = 0; - goto done; - } - - while (bytes_to_write > 0) { - bytes_allowed = wcd9xxx_slim_get_allowed_slice(wcd9xxx, - bytes_to_write); - - slim_msg.num_bytes = bytes_allowed; - mutex_lock(&wcd9xxx->xfer_lock); - ret = slim_user_msg(wcd9xxx->slim, wcd9xxx->slim->laddr, - SLIM_MSG_MT_DEST_REFERRED_USER, - SLIM_USR_MC_REPEAT_CHANGE_VALUE, - &slim_msg, src, bytes_allowed); - mutex_unlock(&wcd9xxx->xfer_lock); - - if (ret) { - dev_err(wcd9xxx->dev, "%s: failed, ret = %d\n", - __func__, ret); - break; - } - - bytes_to_write = bytes_to_write - bytes_allowed; - src = ((u8 *)src) + bytes_allowed; - } - -done: - mutex_unlock(&wcd9xxx->io_lock); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_slim_write_repeat); - -/* - * wcd9xxx_slim_reserve_bw: API to reserve the slimbus bandwidth - * @wcd9xxx: Handle to the wcd9xxx core - * @bw_ops: value of the bandwidth that is requested - * @commit: Flag to indicate if bandwidth change is to be committed - * right away - */ -int wcd9xxx_slim_reserve_bw(struct wcd9xxx *wcd9xxx, - u32 bw_ops, bool commit) -{ - if (!wcd9xxx || !wcd9xxx->slim) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!wcd9xxx) ? "wcd9xxx" : "slim_device"); - return -EINVAL; - } - - return slim_reservemsg_bw(wcd9xxx->slim, bw_ops, commit); -} -EXPORT_SYMBOL(wcd9xxx_slim_reserve_bw); - -/* - * wcd9xxx_slim_bulk_write: API to write multiple registers with one descriptor - * @wcd9xxx: Handle to the wcd9xxx core - * @wcd9xxx_reg_val: structure holding register and values to be written - * @size: Indicates number of messages to be written with one descriptor - * @is_interface: Indicates whether the register is for slim interface or for - * general registers. - * @return: returns 0 if success or error information to the caller in case - * of failure. - */ -int wcd9xxx_slim_bulk_write(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_reg_val *bulk_reg, - unsigned int size, bool is_interface) -{ - int ret, i; - struct slim_val_inf *msgs; - unsigned short reg; - - if (!bulk_reg || !size || !wcd9xxx) { - pr_err("%s: Invalid parameters\n", __func__); - return -EINVAL; - } - - if (!wcd9xxx->dev_up) { - dev_dbg_ratelimited( - wcd9xxx->dev, "%s: No write allowed. dev_up = %d\n", - __func__, wcd9xxx->dev_up); - return 0; - } - - msgs = kzalloc(size * (sizeof(struct slim_val_inf)), GFP_KERNEL); - if (!msgs) { - ret = -ENOMEM; - goto mem_fail; - } - - mutex_lock(&wcd9xxx->io_lock); - reg = bulk_reg->reg; - for (i = 0; i < size; i++) { - msgs[i].start_offset = WCD9XXX_REGISTER_START_OFFSET + - (bulk_reg->reg & 0xFF); - msgs[i].num_bytes = bulk_reg->bytes; - msgs[i].wbuf = bulk_reg->buf; - bulk_reg++; - } - ret = wcd9xxx_page_write(wcd9xxx, ®); - if (ret) { - pr_err("%s: Page write error for reg: 0x%x\n", - __func__, reg); - goto err; - } - - ret = slim_bulk_msg_write(is_interface ? - wcd9xxx->slim_slave : wcd9xxx->slim, - SLIM_MSG_MT_CORE, - SLIM_MSG_MC_CHANGE_VALUE, msgs, size, - NULL, NULL); - if (ret) - pr_err("%s: Error, Codec bulk write failed (%d)\n", - __func__, ret); - /* 100 usec sleep is needed as per HW requirement */ - usleep_range(100, 110); -err: - mutex_unlock(&wcd9xxx->io_lock); - kfree(msgs); -mem_fail: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_slim_bulk_write); - -static int wcd9xxx_num_irq_regs(const struct wcd9xxx *wcd9xxx) -{ - return (wcd9xxx->codec_type->num_irqs / 8) + - ((wcd9xxx->codec_type->num_irqs % 8) ? 1 : 0); -} - -static int wcd9xxx_regmap_init_cache(struct wcd9xxx *wcd9xxx) -{ - struct regmap_config *regmap_config; - int rc; - - regmap_config = wcd9xxx_get_regmap_config(wcd9xxx->type); - if (!regmap_config) { - dev_err(wcd9xxx->dev, "regmap config is not defined\n"); - return -EINVAL; - } - - rc = regmap_reinit_cache(wcd9xxx->regmap, regmap_config); - if (rc != 0) { - dev_err(wcd9xxx->dev, "%s:Failed to reinit register cache: %d\n", - __func__, rc); - } - - return rc; -} - -static int wcd9xxx_device_init(struct wcd9xxx *wcd9xxx) -{ - int ret = 0, i; - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - regmap_patch_fptr regmap_apply_patch = NULL; - - mutex_init(&wcd9xxx->io_lock); - mutex_init(&wcd9xxx->xfer_lock); - mutex_init(&wcd9xxx->reset_lock); - - ret = wcd9xxx_bringup(wcd9xxx->dev); - if (ret) { - ret = -EPROBE_DEFER; - goto err_bring_up; - } - - wcd9xxx->codec_type = devm_kzalloc(wcd9xxx->dev, - sizeof(struct wcd9xxx_codec_type), GFP_KERNEL); - if (!wcd9xxx->codec_type) { - ret = -ENOMEM; - goto err_bring_up; - } - ret = wcd9xxx_get_codec_info(wcd9xxx->dev); - if (ret) { - ret = -EPROBE_DEFER; - goto fail_cdc_fill; - } - wcd9xxx->version = wcd9xxx->codec_type->version; - if (!wcd9xxx->codec_type->dev || !wcd9xxx->codec_type->size) - goto fail_cdc_fill; - - core_res->parent = wcd9xxx; - core_res->dev = wcd9xxx->dev; - core_res->intr_table = wcd9xxx->codec_type->intr_tbl; - core_res->intr_table_size = wcd9xxx->codec_type->intr_tbl_size; - - for (i = 0; i < WCD9XXX_INTR_REG_MAX; i++) - wcd9xxx->core_res.intr_reg[i] = - wcd9xxx->codec_type->intr_reg[i]; - - wcd9xxx_core_res_init(&wcd9xxx->core_res, - wcd9xxx->codec_type->num_irqs, - wcd9xxx_num_irq_regs(wcd9xxx), - wcd9xxx->regmap); - - if (wcd9xxx_core_irq_init(&wcd9xxx->core_res)) - goto err; - - ret = wcd9xxx_regmap_init_cache(wcd9xxx); - if (ret) - goto err_irq; - - regmap_apply_patch = wcd9xxx_get_regmap_reg_patch( - wcd9xxx->type); - if (regmap_apply_patch) { - ret = regmap_apply_patch(wcd9xxx->regmap, - wcd9xxx->version); - if (ret) - dev_err(wcd9xxx->dev, - "Failed to register patch: %d\n", ret); - } - - ret = mfd_add_devices(wcd9xxx->dev, -1, wcd9xxx->codec_type->dev, - wcd9xxx->codec_type->size, NULL, 0, NULL); - if (ret != 0) { - dev_err(wcd9xxx->dev, "Failed to add children: %d\n", ret); - goto err_irq; - } - - ret = device_init_wakeup(wcd9xxx->dev, true); - if (ret) { - dev_err(wcd9xxx->dev, "Device wakeup init failed: %d\n", ret); - goto err_irq; - } - - return ret; -err_irq: - wcd9xxx_irq_exit(&wcd9xxx->core_res); -fail_cdc_fill: - devm_kfree(wcd9xxx->dev, wcd9xxx->codec_type); - wcd9xxx->codec_type = NULL; -err: - wcd9xxx_bringdown(wcd9xxx->dev); - wcd9xxx_core_res_deinit(&wcd9xxx->core_res); -err_bring_up: - mutex_destroy(&wcd9xxx->io_lock); - mutex_destroy(&wcd9xxx->xfer_lock); - mutex_destroy(&wcd9xxx->reset_lock); - return ret; -} - -static void wcd9xxx_device_exit(struct wcd9xxx *wcd9xxx) -{ - device_init_wakeup(wcd9xxx->dev, false); - wcd9xxx_irq_exit(&wcd9xxx->core_res); - mfd_remove_devices(wcd9xxx->dev); - wcd9xxx_bringdown(wcd9xxx->dev); - wcd9xxx_reset_low(wcd9xxx->dev); - wcd9xxx_core_res_deinit(&wcd9xxx->core_res); - mutex_destroy(&wcd9xxx->io_lock); - mutex_destroy(&wcd9xxx->xfer_lock); - mutex_destroy(&wcd9xxx->reset_lock); - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_SLIMBUS) - slim_remove_device(wcd9xxx->slim_slave); -} - - -#ifdef CONFIG_DEBUG_FS -struct wcd9xxx *debugCodec; - -static struct dentry *debugfs_wcd9xxx_dent; -static struct dentry *debugfs_peek; -static struct dentry *debugfs_poke; -static struct dentry *debugfs_power_state; -static struct dentry *debugfs_reg_dump; - -static unsigned char read_data; - -static int codec_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, long int *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token != NULL) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtoul(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t wcd9xxx_slimslave_reg_show(char __user *ubuf, size_t count, - loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[25]; /* each line is 12 bytes but 25 for margin of error */ - - for (i = (int) *ppos / 12; i <= SLIM_MAX_REG_ADDR; i++) { - reg_val = wcd9xxx_interface_reg_read(debugCodec, i); - len = snprintf(tmp_buf, sizeof(tmp_buf), - "0x%.3x: 0x%.2x\n", i, reg_val); - if (len < 0) { - pr_err("%s: fail to fill the buffer\n", __func__); - total = -EFAULT; - goto copy_err; - } - - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t codec_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[8]; - char *access_str = file->private_data; - ssize_t ret_cnt; - - if (*ppos < 0 || !count) - return -EINVAL; - - if (!strcmp(access_str, "slimslave_peek")) { - snprintf(lbuf, sizeof(lbuf), "0x%x\n", read_data); - ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); - } else if (!strcmp(access_str, "slimslave_reg_dump")) { - ret_cnt = wcd9xxx_slimslave_reg_show(ubuf, count, ppos); - } else { - pr_err("%s: %s not permitted to read\n", __func__, access_str); - ret_cnt = -EPERM; - } - - return ret_cnt; -} - -static void wcd9xxx_set_reset_pin_state(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_pdata *pdata, - bool active) -{ - if (wcd9xxx->wcd_rst_np) { - if (active) - msm_cdc_pinctrl_select_active_state( - wcd9xxx->wcd_rst_np); - else - msm_cdc_pinctrl_select_sleep_state( - wcd9xxx->wcd_rst_np); - - return; - } else if (gpio_is_valid(wcd9xxx->reset_gpio)) { - gpio_direction_output(wcd9xxx->reset_gpio, - (active == true ? 1 : 0)); - } -} - -static int codec_debug_process_cdc_power(char *lbuf) -{ - long int param; - int rc; - struct wcd9xxx_pdata *pdata; - - if (wcd9xxx_get_intf_type() != WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - pr_err("%s: CODEC is not in SLIMBUS mode\n", __func__); - rc = -EPERM; - goto error_intf; - } - - rc = get_parameters(lbuf, ¶m, 1); - - if (likely(!rc)) { - pdata = debugCodec->slim->dev.platform_data; - if (param == 0) { - wcd9xxx_slim_device_down(debugCodec->slim); - msm_cdc_disable_static_supplies(debugCodec->dev, - debugCodec->supplies, - pdata->regulator, - pdata->num_supplies); - wcd9xxx_set_reset_pin_state(debugCodec, pdata, false); - } else if (param == 1) { - msm_cdc_enable_static_supplies(debugCodec->dev, - debugCodec->supplies, - pdata->regulator, - pdata->num_supplies); - usleep_range(1000, 2000); - wcd9xxx_set_reset_pin_state(debugCodec, pdata, false); - usleep_range(1000, 2000); - wcd9xxx_set_reset_pin_state(debugCodec, pdata, true); - usleep_range(1000, 2000); - wcd9xxx_slim_device_up(debugCodec->slim); - } else { - pr_err("%s: invalid command %ld\n", __func__, param); - } - } - -error_intf: - return rc; -} - -static ssize_t codec_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *access_str = filp->private_data; - char lbuf[32]; - int rc; - long int param[5]; - - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - - if (!strcmp(access_str, "slimslave_poke")) { - /* write */ - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= 0x3FF) && (param[1] <= 0xFF) && - (rc == 0)) - wcd9xxx_interface_reg_write(debugCodec, param[0], - param[1]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "slimslave_peek")) { - /* read */ - rc = get_parameters(lbuf, param, 1); - if ((param[0] <= 0x3FF) && (rc == 0)) - read_data = wcd9xxx_interface_reg_read(debugCodec, - param[0]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "power_state")) { - rc = codec_debug_process_cdc_power(lbuf); - } - - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations codec_debug_ops = { - .open = codec_debug_open, - .write = codec_debug_write, - .read = codec_debug_read -}; -#endif - -static struct wcd9xxx_i2c *wcd9xxx_i2c_get_device_info(struct wcd9xxx *wcd9xxx, - u16 reg) -{ - u16 mask = 0x0f00; - int value = 0; - struct wcd9xxx_i2c *wcd9xxx_i2c = NULL; - - if (wcd9xxx->type == WCD9335) { - wcd9xxx_i2c = &wcd9xxx_modules[0]; - } else { - value = ((reg & mask) >> 8) & 0x000f; - switch (value) { - case 0: - wcd9xxx_i2c = &wcd9xxx_modules[0]; - break; - case 1: - wcd9xxx_i2c = &wcd9xxx_modules[1]; - break; - case 2: - wcd9xxx_i2c = &wcd9xxx_modules[2]; - break; - case 3: - wcd9xxx_i2c = &wcd9xxx_modules[3]; - break; - - default: - break; - } - } - return wcd9xxx_i2c; -} - -static int wcd9xxx_i2c_write_device(struct wcd9xxx *wcd9xxx, u16 reg, u8 *value, - u32 bytes) -{ - - struct i2c_msg *msg; - int ret = 0; - u8 reg_addr = 0; - u8 data[bytes + 1]; - struct wcd9xxx_i2c *wcd9xxx_i2c; - - wcd9xxx_i2c = wcd9xxx_i2c_get_device_info(wcd9xxx, reg); - if (wcd9xxx_i2c == NULL || wcd9xxx_i2c->client == NULL) { - pr_err("failed to get device info\n"); - return -ENODEV; - } - reg_addr = (u8)reg; - msg = &wcd9xxx_i2c->xfer_msg[0]; - msg->addr = wcd9xxx_i2c->client->addr; - msg->len = bytes + 1; - msg->flags = 0; - data[0] = reg; - data[1] = *value; - msg->buf = data; - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 1); - /* Try again if the write fails */ - if (ret != 1) { - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 1); - if (ret != 1) { - pr_err("failed to write the device\n"); - return ret; - } - } - pr_debug("write success register = %x val = %x\n", reg, data[1]); - return 0; -} - - -static int wcd9xxx_i2c_read_device(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, unsigned char *dest) -{ - struct i2c_msg *msg; - int ret = 0; - u8 reg_addr = 0; - struct wcd9xxx_i2c *wcd9xxx_i2c; - u8 i = 0; - - wcd9xxx_i2c = wcd9xxx_i2c_get_device_info(wcd9xxx, reg); - if (wcd9xxx_i2c == NULL || wcd9xxx_i2c->client == NULL) { - pr_err("failed to get device info\n"); - return -ENODEV; - } - for (i = 0; i < bytes; i++) { - reg_addr = (u8)reg++; - msg = &wcd9xxx_i2c->xfer_msg[0]; - msg->addr = wcd9xxx_i2c->client->addr; - msg->len = 1; - msg->flags = 0; - msg->buf = ®_addr; - - msg = &wcd9xxx_i2c->xfer_msg[1]; - msg->addr = wcd9xxx_i2c->client->addr; - msg->len = 1; - msg->flags = I2C_M_RD; - msg->buf = dest++; - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 2); - - /* Try again if read fails first time */ - if (ret != 2) { - ret = i2c_transfer(wcd9xxx_i2c->client->adapter, - wcd9xxx_i2c->xfer_msg, 2); - if (ret != 2) { - pr_err("failed to read wcd9xxx register\n"); - return ret; - } - } - } - return 0; -} - -int wcd9xxx_i2c_read(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *dest, bool interface_reg) -{ - return wcd9xxx_i2c_read_device(wcd9xxx, reg, bytes, dest); -} - -int wcd9xxx_i2c_write(struct wcd9xxx *wcd9xxx, unsigned short reg, - int bytes, void *src, bool interface_reg) -{ - return wcd9xxx_i2c_write_device(wcd9xxx, reg, src, bytes); -} - -static int wcd9xxx_i2c_get_client_index(struct i2c_client *client, - int *wcd9xx_index) -{ - int ret = 0; - - switch (client->addr) { - case WCD9XXX_I2C_TOP_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_TOP_LEVEL; - break; - case WCD9XXX_ANALOG_I2C_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_ANALOG; - break; - case WCD9XXX_DIGITAL1_I2C_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_DIGITAL_1; - break; - case WCD9XXX_DIGITAL2_I2C_SLAVE_ADDR: - *wcd9xx_index = WCD9XXX_I2C_DIGITAL_2; - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - -static int wcd9xxx_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct wcd9xxx *wcd9xxx = NULL; - struct wcd9xxx_pdata *pdata = NULL; - int val = 0; - int ret = 0; - int wcd9xx_index = 0; - struct device *dev; - int intf_type; - const struct of_device_id *of_id; - - intf_type = wcd9xxx_get_intf_type(); - - pr_debug("%s: interface status %d\n", __func__, intf_type); - if (intf_type == WCD9XXX_INTERFACE_TYPE_SLIMBUS) { - dev_dbg(&client->dev, "%s:Codec is detected in slimbus mode\n", - __func__); - return -ENODEV; - } else if (intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - ret = wcd9xxx_i2c_get_client_index(client, &wcd9xx_index); - if (ret != 0) - dev_err(&client->dev, "%s: I2C set codec I2C\n" - "client failed\n", __func__); - else { - dev_err(&client->dev, "%s:probe for other slaves\n" - "devices of codec I2C slave Addr = %x\n", - __func__, client->addr); - wcd9xxx_modules[wcd9xx_index].client = client; - } - return ret; - } else if (intf_type == WCD9XXX_INTERFACE_TYPE_PROBING) { - dev = &client->dev; - if (client->dev.of_node) { - dev_dbg(&client->dev, "%s:Platform data\n" - "from device tree\n", __func__); - pdata = wcd9xxx_populate_dt_data(&client->dev); - if (!pdata) { - dev_err(&client->dev, - "%s: Fail to obtain pdata from device tree\n", - __func__); - ret = -EINVAL; - goto fail; - } - client->dev.platform_data = pdata; - } else { - dev_dbg(&client->dev, "%s:Platform data from\n" - "board file\n", __func__); - pdata = client->dev.platform_data; - } - wcd9xxx = devm_kzalloc(&client->dev, sizeof(struct wcd9xxx), - GFP_KERNEL); - if (!wcd9xxx) { - ret = -ENOMEM; - goto fail; - } - - if (!pdata) { - dev_dbg(&client->dev, "no platform data?\n"); - ret = -EINVAL; - goto fail; - } - wcd9xxx->type = WCD9XXX; - if (client->dev.of_node) { - of_id = of_match_device(wcd9xxx_of_match, &client->dev); - if (of_id) { - wcd9xxx->type = *((int *)of_id->data); - dev_info(&client->dev, "%s: codec type is %d\n", - __func__, wcd9xxx->type); - } - } else { - dev_info(&client->dev, "%s: dev.of_node is NULL, default to WCD9XXX\n", - __func__); - wcd9xxx->type = WCD9XXX; - } - wcd9xxx->regmap = wcd9xxx_regmap_init(&client->dev, - &wcd9xxx_i2c_base_regmap_config); - if (IS_ERR(wcd9xxx->regmap)) { - ret = PTR_ERR(wcd9xxx->regmap); - dev_err(&client->dev, "%s: Failed to allocate register map: %d\n", - __func__, ret); - goto err_codec; - } - wcd9xxx->reset_gpio = pdata->reset_gpio; - wcd9xxx->wcd_rst_np = pdata->wcd_rst_np; - - if (!wcd9xxx->wcd_rst_np) { - pdata->use_pinctrl = false; - dev_err(&client->dev, "%s: pinctrl not used for rst_n\n", - __func__); - goto err_codec; - } - - if (i2c_check_functionality(client->adapter, - I2C_FUNC_I2C) == 0) { - dev_dbg(&client->dev, "can't talk I2C?\n"); - ret = -EIO; - goto fail; - } - dev_set_drvdata(&client->dev, wcd9xxx); - wcd9xxx->dev = &client->dev; - wcd9xxx->dev_up = true; - if (client->dev.of_node) - wcd9xxx->mclk_rate = pdata->mclk_rate; - - wcd9xxx->num_of_supplies = pdata->num_supplies; - ret = msm_cdc_init_supplies(wcd9xxx->dev, &wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - if (!wcd9xxx->supplies) { - dev_err(wcd9xxx->dev, "%s: Cannot init wcd supplies\n", - __func__); - goto err_codec; - } - ret = msm_cdc_enable_static_supplies(wcd9xxx->dev, - wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(wcd9xxx->dev, "%s: wcd static supply enable failed!\n", - __func__); - goto err_codec; - } - /* For WCD9335, it takes about 600us for the Vout_A and - * Vout_D to be ready after BUCK_SIDO is powered up\ - * SYS_RST_N shouldn't be pulled high during this time - */ - if (wcd9xxx->type == WCD9335) - usleep_range(600, 650); - else - usleep_range(5, 10); - - ret = wcd9xxx_reset(wcd9xxx->dev); - if (ret) { - pr_err("%s: Resetting Codec failed\n", __func__); - goto err_supplies; - } - - ret = wcd9xxx_i2c_get_client_index(client, &wcd9xx_index); - if (ret != 0) { - pr_err("%s:Set codec I2C client failed\n", __func__); - goto err_supplies; - } - - wcd9xxx_modules[wcd9xx_index].client = client; - wcd9xxx->read_dev = wcd9xxx_i2c_read; - wcd9xxx->write_dev = wcd9xxx_i2c_write; - if (!wcd9xxx->dev->of_node) - wcd9xxx_assign_irq(&wcd9xxx->core_res, - pdata->irq, pdata->irq_base); - - ret = wcd9xxx_device_init(wcd9xxx); - if (ret) { - pr_err("%s: error, initializing device failed (%d)\n", - __func__, ret); - goto err_device_init; - } - - ret = wcd9xxx_i2c_read(wcd9xxx, WCD9XXX_A_CHIP_STATUS, 1, - &val, 0); - if (ret < 0) - pr_err("%s: failed to read the wcd9xxx status (%d)\n", - __func__, ret); - if (val != wcd9xxx->codec_type->i2c_chip_status) - pr_err("%s: unknown chip status 0x%x\n", __func__, val); - - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_I2C); - - return ret; - } - - pr_err("%s: I2C probe in wrong state\n", __func__); - - -err_device_init: - wcd9xxx_reset_low(wcd9xxx->dev); -err_supplies: - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - pdata->regulator = NULL; - pdata->num_supplies = 0; -err_codec: - devm_kfree(&client->dev, wcd9xxx); - dev_set_drvdata(&client->dev, NULL); -fail: - return ret; -} - -static int wcd9xxx_i2c_remove(struct i2c_client *client) -{ - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_pdata *pdata = client->dev.platform_data; - - wcd9xxx = dev_get_drvdata(&client->dev); - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - wcd9xxx_device_exit(wcd9xxx); - dev_set_drvdata(&client->dev, NULL); - return 0; -} - -static int wcd9xxx_dt_parse_slim_interface_dev_info(struct device *dev, - struct slim_device *slim_ifd) -{ - int ret = 0; - struct property *prop; - - ret = of_property_read_string(dev->of_node, "qcom,cdc-slim-ifd", - &slim_ifd->name); - if (ret) { - dev_err(dev, "Looking up %s property in node %s failed", - "qcom,cdc-slim-ifd-dev", dev->of_node->full_name); - return -ENODEV; - } - prop = of_find_property(dev->of_node, - "qcom,cdc-slim-ifd-elemental-addr", NULL); - if (!prop) { - dev_err(dev, "Looking up %s property in node %s failed", - "qcom,cdc-slim-ifd-elemental-addr", - dev->of_node->full_name); - return -ENODEV; - } else if (prop->length != 6) { - dev_err(dev, "invalid codec slim ifd addr. addr length = %d\n", - prop->length); - return -ENODEV; - } - memcpy(slim_ifd->e_addr, prop->value, 6); - - return 0; -} - -static int wcd9xxx_slim_get_laddr(struct slim_device *sb, - const u8 *e_addr, u8 e_len, u8 *laddr) -{ - int ret; - const unsigned long timeout = jiffies + - msecs_to_jiffies(SLIMBUS_PRESENT_TIMEOUT); - - do { - ret = slim_get_logical_addr(sb, e_addr, e_len, laddr); - if (!ret) - break; - /* Give SLIMBUS time to report present and be ready. */ - usleep_range(1000, 1100); - pr_debug_ratelimited("%s: retyring get logical addr\n", - __func__); - } while time_before(jiffies, timeout); - - return ret; -} - -static int wcd9xxx_slim_probe(struct slim_device *slim) -{ - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_pdata *pdata; - const struct slim_device_id *device_id; - int ret = 0; - int intf_type; - - if (!slim) - return -EINVAL; - - intf_type = wcd9xxx_get_intf_type(); - - wcd9xxx = devm_kzalloc(&slim->dev, sizeof(struct wcd9xxx), - GFP_KERNEL); - if (!wcd9xxx) - return -ENOMEM; - - if (intf_type == WCD9XXX_INTERFACE_TYPE_I2C) { - dev_dbg(&slim->dev, "%s:Codec is detected in I2C mode\n", - __func__); - ret = -ENODEV; - goto err; - } - if (slim->dev.of_node) { - dev_dbg(&slim->dev, "Platform data from device tree\n"); - pdata = wcd9xxx_populate_dt_data(&slim->dev); - if (!pdata) { - dev_err(&slim->dev, - "%s: Fail to obtain pdata from device tree\n", - __func__); - ret = -EINVAL; - goto err; - } - - ret = wcd9xxx_dt_parse_slim_interface_dev_info(&slim->dev, - &pdata->slimbus_slave_device); - if (ret) { - dev_err(&slim->dev, "Error, parsing slim interface\n"); - devm_kfree(&slim->dev, pdata); - ret = -EINVAL; - goto err; - } - slim->dev.platform_data = pdata; - - } else { - dev_info(&slim->dev, "Platform data from board file\n"); - pdata = slim->dev.platform_data; - } - - if (!pdata) { - dev_err(&slim->dev, "Error, no platform data\n"); - ret = -EINVAL; - goto err; - } - - if (!slim->ctrl) { - dev_err(&slim->dev, "%s: Error, no SLIMBUS control data\n", - __func__); - ret = -EINVAL; - goto err_codec; - } - - if (pdata->has_buck_vsel_gpio) - msm_cdc_pinctrl_select_active_state(pdata->buck_vsel_ctl_np); - - if (pdata->has_micb_supply_en_gpio) - msm_cdc_pinctrl_select_active_state(pdata->micb_en_ctl); - - device_id = slim_get_device_id(slim); - if (!device_id) { - dev_err(&slim->dev, "%s: Error, no device id\n", __func__); - ret = -EINVAL; - goto err; - } - - wcd9xxx->type = device_id->driver_data; - dev_info(&slim->dev, "%s: probing for wcd type: %d, name: %s\n", - __func__, wcd9xxx->type, device_id->name); - - /* wcd9xxx members init */ - wcd9xxx->multi_reg_write = wcd9xxx_slim_multi_reg_write; - wcd9xxx->slim = slim; - slim_set_clientdata(slim, wcd9xxx); - wcd9xxx->reset_gpio = pdata->reset_gpio; - wcd9xxx->dev = &slim->dev; - wcd9xxx->mclk_rate = pdata->mclk_rate; - wcd9xxx->dev_up = true; - wcd9xxx->wcd_rst_np = pdata->wcd_rst_np; - - wcd9xxx->regmap = wcd9xxx_regmap_init(&slim->dev, - &wcd9xxx_base_regmap_config); - if (IS_ERR(wcd9xxx->regmap)) { - ret = PTR_ERR(wcd9xxx->regmap); - dev_err(&slim->dev, "%s: Failed to allocate register map: %d\n", - __func__, ret); - goto err_codec; - } - - if (!wcd9xxx->wcd_rst_np) { - pdata->use_pinctrl = false; - dev_err(&slim->dev, "%s: pinctrl not used for rst_n\n", - __func__); - goto err_codec; - } - - wcd9xxx->num_of_supplies = pdata->num_supplies; - ret = msm_cdc_init_supplies(&slim->dev, &wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - if (!wcd9xxx->supplies) { - dev_err(wcd9xxx->dev, "%s: Cannot init wcd supplies\n", - __func__); - goto err_codec; - } - ret = msm_cdc_enable_static_supplies(wcd9xxx->dev, - wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - if (ret) { - dev_err(wcd9xxx->dev, "%s: wcd static supply enable failed!\n", - __func__); - goto err_codec; - } - - /* - * For WCD9335, it takes about 600us for the Vout_A and - * Vout_D to be ready after BUCK_SIDO is powered up. - * SYS_RST_N shouldn't be pulled high during this time - */ - if (wcd9xxx->type == WCD9335 || wcd9xxx->type == WCD934X || - wcd9xxx->type == WCD9360) - usleep_range(600, 650); - else - usleep_range(5, 10); - - ret = wcd9xxx_reset(&slim->dev); - if (ret) { - dev_err(&slim->dev, "%s: Resetting Codec failed\n", __func__); - goto err_supplies; - } - - ret = wcd9xxx_slim_get_laddr(wcd9xxx->slim, wcd9xxx->slim->e_addr, - ARRAY_SIZE(wcd9xxx->slim->e_addr), - &wcd9xxx->slim->laddr); - if (ret) { - dev_err(&slim->dev, "%s: failed to get slimbus %s logical address: %d\n", - __func__, wcd9xxx->slim->name, ret); - goto err_reset; - } - wcd9xxx->read_dev = wcd9xxx_slim_read_device; - wcd9xxx->write_dev = wcd9xxx_slim_write_device; - wcd9xxx_pgd_la = wcd9xxx->slim->laddr; - wcd9xxx->slim_slave = &pdata->slimbus_slave_device; - if (!wcd9xxx->dev->of_node) - wcd9xxx_assign_irq(&wcd9xxx->core_res, - pdata->irq, pdata->irq_base); - - ret = slim_add_device(slim->ctrl, wcd9xxx->slim_slave); - if (ret) { - dev_err(&slim->dev, "%s: error, adding SLIMBUS device failed\n", - __func__); - goto err_reset; - } - - ret = wcd9xxx_slim_get_laddr(wcd9xxx->slim_slave, - wcd9xxx->slim_slave->e_addr, - ARRAY_SIZE(wcd9xxx->slim_slave->e_addr), - &wcd9xxx->slim_slave->laddr); - if (ret) { - dev_err(&slim->dev, "%s: failed to get slimbus %s logical address: %d\n", - __func__, wcd9xxx->slim->name, ret); - goto err_slim_add; - } - wcd9xxx_inf_la = wcd9xxx->slim_slave->laddr; - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_SLIMBUS); - - ret = wcd9xxx_device_init(wcd9xxx); - if (ret) { - dev_err(&slim->dev, "%s: error, initializing device failed (%d)\n", - __func__, ret); - goto err_slim_add; - } -#ifdef CONFIG_DEBUG_FS - debugCodec = wcd9xxx; - - debugfs_wcd9xxx_dent = debugfs_create_dir - ("wcd9xxx_core", 0); - if (!IS_ERR(debugfs_wcd9xxx_dent)) { - debugfs_peek = debugfs_create_file("slimslave_peek", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "slimslave_peek", &codec_debug_ops); - - debugfs_poke = debugfs_create_file("slimslave_poke", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "slimslave_poke", &codec_debug_ops); - - debugfs_power_state = debugfs_create_file("power_state", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "power_state", &codec_debug_ops); - - debugfs_reg_dump = debugfs_create_file("slimslave_reg_dump", - S_IFREG | 0444, debugfs_wcd9xxx_dent, - (void *) "slimslave_reg_dump", &codec_debug_ops); - } -#endif - - return ret; - -err_slim_add: - slim_remove_device(wcd9xxx->slim_slave); -err_reset: - wcd9xxx_reset_low(wcd9xxx->dev); -err_supplies: - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); -err_codec: - slim_set_clientdata(slim, NULL); -err: - devm_kfree(&slim->dev, wcd9xxx); - return ret; -} -static int wcd9xxx_slim_remove(struct slim_device *pdev) -{ - struct wcd9xxx *wcd9xxx; - struct wcd9xxx_pdata *pdata = pdev->dev.platform_data; - -#ifdef CONFIG_DEBUG_FS - debugfs_remove_recursive(debugfs_wcd9xxx_dent); -#endif - wcd9xxx = slim_get_devicedata(pdev); - wcd9xxx_deinit_slimslave(wcd9xxx); - slim_remove_device(wcd9xxx->slim_slave); - msm_cdc_release_supplies(wcd9xxx->dev, wcd9xxx->supplies, - pdata->regulator, - pdata->num_supplies); - wcd9xxx_device_exit(wcd9xxx); - slim_set_clientdata(pdev, NULL); - return 0; -} - -static int wcd9xxx_device_up(struct wcd9xxx *wcd9xxx) -{ - int ret = 0; - struct wcd9xxx_core_resource *wcd9xxx_res = &wcd9xxx->core_res; - - dev_info(wcd9xxx->dev, "%s: codec bring up\n", __func__); - wcd9xxx_bringup(wcd9xxx->dev); - ret = wcd9xxx_irq_init(wcd9xxx_res); - if (ret) { - pr_err("%s: wcd9xx_irq_init failed : %d\n", __func__, ret); - } else { - if (wcd9xxx->post_reset) - ret = wcd9xxx->post_reset(wcd9xxx); - } - return ret; -} - -static int wcd9xxx_slim_device_reset(struct slim_device *sldev) -{ - int ret; - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - dev_info(wcd9xxx->dev, "%s: device reset, dev_up = %d\n", - __func__, wcd9xxx->dev_up); - if (wcd9xxx->dev_up) - return 0; - - mutex_lock(&wcd9xxx->reset_lock); - ret = wcd9xxx_reset(wcd9xxx->dev); - if (ret) - dev_err(wcd9xxx->dev, "%s: Resetting Codec failed\n", __func__); - mutex_unlock(&wcd9xxx->reset_lock); - - return ret; -} - -static int wcd9xxx_slim_device_up(struct slim_device *sldev) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - int ret = 0; - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - dev_info(wcd9xxx->dev, "%s: slim device up, dev_up = %d\n", - __func__, wcd9xxx->dev_up); - if (wcd9xxx->dev_up) - return 0; - - wcd9xxx->dev_up = true; - - mutex_lock(&wcd9xxx->reset_lock); - ret = wcd9xxx_device_up(wcd9xxx); - mutex_unlock(&wcd9xxx->reset_lock); - - return ret; -} - -static int wcd9xxx_slim_device_down(struct slim_device *sldev) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - dev_info(wcd9xxx->dev, "%s: device down, dev_up = %d\n", - __func__, wcd9xxx->dev_up); - if (!wcd9xxx->dev_up) - return 0; - - wcd9xxx->dev_up = false; - - mutex_lock(&wcd9xxx->reset_lock); - if (wcd9xxx->dev_down) - wcd9xxx->dev_down(wcd9xxx); - wcd9xxx_irq_exit(&wcd9xxx->core_res); - wcd9xxx_reset_low(wcd9xxx->dev); - mutex_unlock(&wcd9xxx->reset_lock); - - return 0; -} - -static int wcd9xxx_slim_resume(struct slim_device *sldev) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - return wcd9xxx_core_res_resume(&wcd9xxx->core_res); -} - -static int wcd9xxx_i2c_resume(struct device *dev) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - - if (wcd9xxx) - return wcd9xxx_core_res_resume(&wcd9xxx->core_res); - else - return 0; -} - -static int wcd9xxx_slim_suspend(struct slim_device *sldev, pm_message_t pmesg) -{ - struct wcd9xxx *wcd9xxx = slim_get_devicedata(sldev); - - return wcd9xxx_core_res_suspend(&wcd9xxx->core_res, pmesg); -} - -static int wcd9xxx_i2c_suspend(struct device *dev) -{ - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - pm_message_t pmesg = {0}; - - if (wcd9xxx) - return wcd9xxx_core_res_suspend(&wcd9xxx->core_res, pmesg); - else - return 0; -} - -static const struct slim_device_id wcd_slim_device_id[] = { - {"sitar-slim", 0}, - {"sitar1p1-slim", 0}, - {"tabla-slim", 0}, - {"tabla2x-slim", 0}, - {"taiko-slim-pgd", 0}, - {"tapan-slim-pgd", 0}, - {"tomtom-slim-pgd", WCD9330}, - {"tasha-slim-pgd", WCD9335}, - {"tavil-slim-pgd", WCD934X}, - {"pahu-slim-pgd", WCD9360}, - {} -}; - -static struct slim_driver wcd_slim_driver = { - .driver = { - .name = "wcd-slim", - .owner = THIS_MODULE, - }, - .probe = wcd9xxx_slim_probe, - .remove = wcd9xxx_slim_remove, - .id_table = wcd_slim_device_id, - .resume = wcd9xxx_slim_resume, - .suspend = wcd9xxx_slim_suspend, - .device_up = wcd9xxx_slim_device_up, - .reset_device = wcd9xxx_slim_device_reset, - .device_down = wcd9xxx_slim_device_down, -}; - -static struct i2c_device_id wcd9xxx_id_table[] = { - {"wcd9xxx-i2c", WCD9XXX_I2C_TOP_LEVEL}, - {"wcd9xxx-i2c", WCD9XXX_I2C_ANALOG}, - {"wcd9xxx-i2c", WCD9XXX_I2C_DIGITAL_1}, - {"wcd9xxx-i2c", WCD9XXX_I2C_DIGITAL_2}, - {} -}; - -static struct i2c_device_id tasha_id_table[] = { - {"tasha-i2c-pgd", WCD9XXX_I2C_TOP_LEVEL}, - {} -}; - -static struct i2c_device_id tavil_id_table[] = { - {"tavil-i2c", WCD9XXX_I2C_TOP_LEVEL}, - {} -}; - -static struct i2c_device_id tabla_id_table[] = { - {"tabla top level", WCD9XXX_I2C_TOP_LEVEL}, - {"tabla analog", WCD9XXX_I2C_ANALOG}, - {"tabla digital1", WCD9XXX_I2C_DIGITAL_1}, - {"tabla digital2", WCD9XXX_I2C_DIGITAL_2}, - {} -}; -MODULE_DEVICE_TABLE(i2c, tabla_id_table); - -static const struct dev_pm_ops wcd9xxx_i2c_pm_ops = { - .suspend = wcd9xxx_i2c_suspend, - .resume = wcd9xxx_i2c_resume, -}; - -static struct i2c_driver tabla_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "tabla-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = tabla_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -static struct i2c_driver wcd9xxx_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "wcd9xxx-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = wcd9xxx_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -static struct i2c_driver wcd9335_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "tasha-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = tasha_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -static struct i2c_driver wcd934x_i2c_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "tavil-i2c-core", - .pm = &wcd9xxx_i2c_pm_ops, - }, - .id_table = tavil_id_table, - .probe = wcd9xxx_i2c_probe, - .remove = wcd9xxx_i2c_remove, -}; - -int wcd9xxx_init(void) -{ - int ret[NUM_WCD9XXX_REG_RET] = {0}; - int i = 0; - - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_PROBING); - - ret[0] = i2c_add_driver(&tabla_i2c_driver); - if (ret[0]) - pr_err("%s: Failed to add the tabla2x I2C driver: %d\n", - __func__, ret[0]); - - ret[1] = i2c_add_driver(&wcd9xxx_i2c_driver); - if (ret[1]) - pr_err("%s: Failed to add the wcd9xxx I2C driver: %d\n", - __func__, ret[1]); - - ret[2] = i2c_add_driver(&wcd9335_i2c_driver); - if (ret[2]) - pr_err("%s: Failed to add the wcd9335 I2C driver: %d\n", - __func__, ret[2]); - - ret[3] = slim_driver_register(&wcd_slim_driver); - if (ret[3]) - pr_err("%s: Failed to register wcd SB driver: %d\n", - __func__, ret[3]); - - ret[4] = i2c_add_driver(&wcd934x_i2c_driver); - if (ret[4]) - pr_err("%s: Failed to add the wcd934x I2C driver: %d\n", - __func__, ret[4]); - - for (i = 0; i < NUM_WCD9XXX_REG_RET; i++) { - if (ret[i]) - return ret[i]; - } - - return 0; -} - -void wcd9xxx_exit(void) -{ - wcd9xxx_set_intf_type(WCD9XXX_INTERFACE_TYPE_PROBING); - - i2c_del_driver(&tabla_i2c_driver); - i2c_del_driver(&wcd9xxx_i2c_driver); - i2c_del_driver(&wcd9335_i2c_driver); - i2c_del_driver(&wcd934x_i2c_driver); - slim_driver_unregister(&wcd_slim_driver); -} - -MODULE_DESCRIPTION("Codec core driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-irq.c b/techpack/audio/asoc/codecs/wcd9xxx-irq.c deleted file mode 100644 index 952dff4bcfbd..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-irq.c +++ /dev/null @@ -1,897 +0,0 @@ -/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "core.h" -#include "wcd9xxx-irq.h" - -#define BYTE_BIT_MASK(nr) (1UL << ((nr) % BITS_PER_BYTE)) -#define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE) - -#define WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS 100 - -#ifndef NO_IRQ -#define NO_IRQ (-1) -#endif - -#ifdef CONFIG_OF -struct wcd9xxx_irq_drv_data { - struct irq_domain *domain; - int irq; -}; -#endif - -static int virq_to_phyirq( - struct wcd9xxx_core_resource *wcd9xxx_res, int virq); -static int phyirq_to_virq( - struct wcd9xxx_core_resource *wcd9xxx_res, int irq); -static unsigned int wcd9xxx_irq_get_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res); -static void wcd9xxx_irq_put_downstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res); -static void wcd9xxx_irq_put_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res); -static int wcd9xxx_map_irq( - struct wcd9xxx_core_resource *wcd9xxx_res, int irq); - -static void wcd9xxx_irq_lock(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - mutex_lock(&wcd9xxx_res->irq_lock); -} - -static void wcd9xxx_irq_sync_unlock(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - int i; - - if ((ARRAY_SIZE(wcd9xxx_res->irq_masks_cur) > - WCD9XXX_MAX_IRQ_REGS) || - (ARRAY_SIZE(wcd9xxx_res->irq_masks_cache) > - WCD9XXX_MAX_IRQ_REGS)) { - pr_err("%s: Array Size out of bound\n", __func__); - return; - } - if (!wcd9xxx_res->wcd_core_regmap) { - pr_err("%s: Codec core regmap not defined\n", - __func__); - return; - } - - for (i = 0; i < ARRAY_SIZE(wcd9xxx_res->irq_masks_cur); i++) { - /* If there's been a change in the mask write it back - * to the hardware. - */ - if (wcd9xxx_res->irq_masks_cur[i] != - wcd9xxx_res->irq_masks_cache[i]) { - - wcd9xxx_res->irq_masks_cache[i] = - wcd9xxx_res->irq_masks_cur[i]; - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_MASK_BASE] + i, - wcd9xxx_res->irq_masks_cur[i]); - } - } - - mutex_unlock(&wcd9xxx_res->irq_lock); -} - -static void wcd9xxx_irq_enable(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - int wcd9xxx_irq = virq_to_phyirq(wcd9xxx_res, data->irq); - int byte = BIT_BYTE(wcd9xxx_irq); - int size = ARRAY_SIZE(wcd9xxx_res->irq_masks_cur); - - if ((byte < size) && (byte >= 0)) { - wcd9xxx_res->irq_masks_cur[byte] &= - ~(BYTE_BIT_MASK(wcd9xxx_irq)); - } else { - pr_err("%s: Array size is %d but index is %d: Out of range\n", - __func__, size, byte); - } -} - -static void wcd9xxx_irq_disable(struct irq_data *data) -{ - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - int wcd9xxx_irq = virq_to_phyirq(wcd9xxx_res, data->irq); - int byte = BIT_BYTE(wcd9xxx_irq); - int size = ARRAY_SIZE(wcd9xxx_res->irq_masks_cur); - - if ((byte < size) && (byte >= 0)) { - wcd9xxx_res->irq_masks_cur[byte] - |= BYTE_BIT_MASK(wcd9xxx_irq); - } else { - pr_err("%s: Array size is %d but index is %d: Out of range\n", - __func__, size, byte); - } -} - -static void wcd9xxx_irq_ack(struct irq_data *data) -{ - int wcd9xxx_irq = 0; - struct wcd9xxx_core_resource *wcd9xxx_res = - irq_data_get_irq_chip_data(data); - - if (wcd9xxx_res == NULL) { - pr_err("%s: wcd9xxx_res is NULL\n", __func__); - return; - } - wcd9xxx_irq = virq_to_phyirq(wcd9xxx_res, data->irq); - pr_debug("%s: IRQ_ACK called for WCD9XXX IRQ: %d\n", - __func__, wcd9xxx_irq); -} - -static void wcd9xxx_irq_mask(struct irq_data *d) -{ - /* do nothing but required as linux calls irq_mask without NULL check */ -} - -static struct irq_chip wcd9xxx_irq_chip = { - .name = "wcd9xxx", - .irq_bus_lock = wcd9xxx_irq_lock, - .irq_bus_sync_unlock = wcd9xxx_irq_sync_unlock, - .irq_disable = wcd9xxx_irq_disable, - .irq_enable = wcd9xxx_irq_enable, - .irq_mask = wcd9xxx_irq_mask, - .irq_ack = wcd9xxx_irq_ack, -}; - -bool wcd9xxx_lock_sleep( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - enum wcd9xxx_pm_state os; - - /* - * wcd9xxx_{lock/unlock}_sleep will be called by wcd9xxx_irq_thread - * and its subroutines only motly. - * but btn0_lpress_fn is not wcd9xxx_irq_thread's subroutine and - * It can race with wcd9xxx_irq_thread. - * So need to embrace wlock_holders with mutex. - * - * If system didn't resume, we can simply return false so codec driver's - * IRQ handler can return without handling IRQ. - * As interrupt line is still active, codec will have another IRQ to - * retry shortly. - */ - mutex_lock(&wcd9xxx_res->pm_lock); - if (wcd9xxx_res->wlock_holders++ == 0) { - pr_debug("%s: holding wake lock\n", __func__); - pm_qos_update_request(&wcd9xxx_res->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - pm_stay_awake(wcd9xxx_res->dev); - } - mutex_unlock(&wcd9xxx_res->pm_lock); - - if (!wait_event_timeout(wcd9xxx_res->pm_wq, - ((os = wcd9xxx_pm_cmpxchg(wcd9xxx_res, - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_AWAKE)) == - WCD9XXX_PM_SLEEPABLE || - (os == WCD9XXX_PM_AWAKE)), - msecs_to_jiffies( - WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS))) { - pr_warn("%s: system didn't resume within %dms, s %d, w %d\n", - __func__, - WCD9XXX_SYSTEM_RESUME_TIMEOUT_MS, wcd9xxx_res->pm_state, - wcd9xxx_res->wlock_holders); - wcd9xxx_unlock_sleep(wcd9xxx_res); - return false; - } - wake_up_all(&wcd9xxx_res->pm_wq); - return true; -} -EXPORT_SYMBOL(wcd9xxx_lock_sleep); - -void wcd9xxx_unlock_sleep( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - mutex_lock(&wcd9xxx_res->pm_lock); - if (--wcd9xxx_res->wlock_holders == 0) { - pr_debug("%s: releasing wake lock pm_state %d -> %d\n", - __func__, wcd9xxx_res->pm_state, WCD9XXX_PM_SLEEPABLE); - /* - * if wcd9xxx_lock_sleep failed, pm_state would be still - * WCD9XXX_PM_ASLEEP, don't overwrite - */ - if (likely(wcd9xxx_res->pm_state == WCD9XXX_PM_AWAKE)) - wcd9xxx_res->pm_state = WCD9XXX_PM_SLEEPABLE; - pm_qos_update_request(&wcd9xxx_res->pm_qos_req, - PM_QOS_DEFAULT_VALUE); - pm_relax(wcd9xxx_res->dev); - } - mutex_unlock(&wcd9xxx_res->pm_lock); - wake_up_all(&wcd9xxx_res->pm_wq); -} -EXPORT_SYMBOL(wcd9xxx_unlock_sleep); - -void wcd9xxx_nested_irq_lock(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - mutex_lock(&wcd9xxx_res->nested_irq_lock); -} - -void wcd9xxx_nested_irq_unlock(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - mutex_unlock(&wcd9xxx_res->nested_irq_lock); -} - - -static void wcd9xxx_irq_dispatch(struct wcd9xxx_core_resource *wcd9xxx_res, - struct intr_data *irqdata) -{ - int irqbit = irqdata->intr_num; - - if (!wcd9xxx_res->wcd_core_regmap) { - pr_err("%s: codec core regmap not defined\n", - __func__); - return; - } - - if (irqdata->clear_first) { - wcd9xxx_nested_irq_lock(wcd9xxx_res); - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLEAR_BASE] + - BIT_BYTE(irqbit), - BYTE_BIT_MASK(irqbit)); - - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLR_COMMIT], - 0x02); - handle_nested_irq(phyirq_to_virq(wcd9xxx_res, irqbit)); - wcd9xxx_nested_irq_unlock(wcd9xxx_res); - } else { - wcd9xxx_nested_irq_lock(wcd9xxx_res); - handle_nested_irq(phyirq_to_virq(wcd9xxx_res, irqbit)); - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLEAR_BASE] + - BIT_BYTE(irqbit), - BYTE_BIT_MASK(irqbit)); - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLR_COMMIT], - 0x02); - - wcd9xxx_nested_irq_unlock(wcd9xxx_res); - } -} - -static irqreturn_t wcd9xxx_irq_thread(int irq, void *data) -{ - int ret; - int i; - struct intr_data irqdata; - char linebuf[128]; - static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 1); - struct wcd9xxx_core_resource *wcd9xxx_res = data; - int num_irq_regs = wcd9xxx_res->num_irq_regs; - struct wcd9xxx *wcd9xxx; - u8 status[4], status1[4] = {0}, unmask_status[4] = {0}; - - if (unlikely(wcd9xxx_lock_sleep(wcd9xxx_res) == false)) { - dev_err(wcd9xxx_res->dev, "Failed to hold suspend\n"); - return IRQ_NONE; - } - - if (!wcd9xxx_res->wcd_core_regmap) { - dev_err(wcd9xxx_res->dev, - "%s: Codec core regmap not supplied\n", - __func__); - goto err_disable_irq; - } - - wcd9xxx = (struct wcd9xxx *)wcd9xxx_res->parent; - if (!wcd9xxx) { - dev_err(wcd9xxx_res->dev, - "%s: Codec core not supplied\n", __func__); - goto err_disable_irq; - } - - if (!wcd9xxx->dev_up) { - dev_info_ratelimited(wcd9xxx_res->dev, "wcd9xxx dev not up\n"); - /* - * sleep to not block the core when device is - * not up (slimbus will not be available) to - * process interrupts. - */ - msleep(10); - } - - memset(status, 0, sizeof(status)); - ret = regmap_bulk_read(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_STATUS_BASE], - status, num_irq_regs); - - if (ret < 0) { - dev_err(wcd9xxx_res->dev, - "Failed to read interrupt status: %d\n", ret); - goto err_disable_irq; - } - /* - * If status is 0 return without clearing. - * status contains: HW status - masked interrupts - * status1 contains: unhandled interrupts - masked interrupts - * unmasked_status contains: unhandled interrupts - */ - if (unlikely(!memcmp(status, status1, sizeof(status)))) { - pr_debug("%s: status is 0\n", __func__); - wcd9xxx_unlock_sleep(wcd9xxx_res); - return IRQ_HANDLED; - } - - /* - * Copy status to unmask_status before masking, otherwise SW may miss - * to clear masked interrupt in corner case. - */ - memcpy(unmask_status, status, sizeof(unmask_status)); - - /* Apply masking */ - for (i = 0; i < num_irq_regs; i++) - status[i] &= ~wcd9xxx_res->irq_masks_cur[i]; - - memcpy(status1, status, sizeof(status1)); - - /* Find out which interrupt was triggered and call that interrupt's - * handler function - * - * Since codec has only one hardware irq line which is shared by - * codec's different internal interrupts, so it's possible master irq - * handler dispatches multiple nested irq handlers after breaking - * order. Dispatch interrupts in the order that is maintained by - * the interrupt table. - */ - for (i = 0; i < wcd9xxx_res->intr_table_size; i++) { - irqdata = wcd9xxx_res->intr_table[i]; - if (status[BIT_BYTE(irqdata.intr_num)] & - BYTE_BIT_MASK(irqdata.intr_num)) { - wcd9xxx_irq_dispatch(wcd9xxx_res, &irqdata); - status1[BIT_BYTE(irqdata.intr_num)] &= - ~BYTE_BIT_MASK(irqdata.intr_num); - unmask_status[BIT_BYTE(irqdata.intr_num)] &= - ~BYTE_BIT_MASK(irqdata.intr_num); - } - } - - /* - * As a failsafe if unhandled irq is found, clear it to prevent - * interrupt storm. - * Note that we can say there was an unhandled irq only when no irq - * handled by nested irq handler since Taiko supports qdsp as irqs' - * destination for few irqs. Therefore driver shouldn't clear pending - * irqs when few handled while few others not. - */ - if (unlikely(!memcmp(status, status1, sizeof(status)))) { - if (__ratelimit(&ratelimit)) { - pr_warn("%s: Unhandled irq found\n", __func__); - hex_dump_to_buffer(status, sizeof(status), 16, 1, - linebuf, sizeof(linebuf), false); - pr_warn("%s: status0 : %s\n", __func__, linebuf); - hex_dump_to_buffer(status1, sizeof(status1), 16, 1, - linebuf, sizeof(linebuf), false); - pr_warn("%s: status1 : %s\n", __func__, linebuf); - } - /* - * unmask_status contains unhandled interrupts, hence clear all - * unhandled interrupts. - */ - ret = regmap_bulk_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLEAR_BASE], - unmask_status, num_irq_regs); - if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C) - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_CLR_COMMIT], - 0x02); - } - wcd9xxx_unlock_sleep(wcd9xxx_res); - - return IRQ_HANDLED; - -err_disable_irq: - dev_err(wcd9xxx_res->dev, - "Disable irq %d\n", wcd9xxx_res->irq); - - disable_irq_wake(wcd9xxx_res->irq); - disable_irq_nosync(wcd9xxx_res->irq); - wcd9xxx_unlock_sleep(wcd9xxx_res); - return IRQ_NONE; -} - -/** - * wcd9xxx_free_irq - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * @data: data pointer - * - */ -void wcd9xxx_free_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq, void *data) -{ - free_irq(phyirq_to_virq(wcd9xxx_res, irq), data); -} -EXPORT_SYMBOL(wcd9xxx_free_irq); - -/** - * wcd9xxx_enable_irq - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * - */ -void wcd9xxx_enable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - if (wcd9xxx_res->irq) - enable_irq(phyirq_to_virq(wcd9xxx_res, irq)); -} -EXPORT_SYMBOL(wcd9xxx_enable_irq); - -/** - * wcd9xxx_disable_irq - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * - */ -void wcd9xxx_disable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - if (wcd9xxx_res->irq) - disable_irq_nosync(phyirq_to_virq(wcd9xxx_res, irq)); -} -EXPORT_SYMBOL(wcd9xxx_disable_irq); - -/** - * wcd9xxx_disable_irq_sync - * - * @wcd9xxx_res: pointer to core resource - * irq: irq number - * - */ -void wcd9xxx_disable_irq_sync( - struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - if (wcd9xxx_res->irq) - disable_irq(phyirq_to_virq(wcd9xxx_res, irq)); -} -EXPORT_SYMBOL(wcd9xxx_disable_irq_sync); - -static int wcd9xxx_irq_setup_downstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - int irq, virq, ret; - - pr_debug("%s: enter\n", __func__); - - for (irq = 0; irq < wcd9xxx_res->num_irqs; irq++) { - /* Map OF irq */ - virq = wcd9xxx_map_irq(wcd9xxx_res, irq); - pr_debug("%s: irq %d -> %d\n", __func__, irq, virq); - if (virq == NO_IRQ) { - pr_err("%s, No interrupt specifier for irq %d\n", - __func__, irq); - return NO_IRQ; - } - - ret = irq_set_chip_data(virq, wcd9xxx_res); - if (ret) { - pr_err("%s: Failed to configure irq %d (%d)\n", - __func__, irq, ret); - return ret; - } - - if (wcd9xxx_res->irq_level_high[irq]) - irq_set_chip_and_handler(virq, &wcd9xxx_irq_chip, - handle_level_irq); - else - irq_set_chip_and_handler(virq, &wcd9xxx_irq_chip, - handle_edge_irq); - - irq_set_nested_thread(virq, 1); - } - - pr_debug("%s: leave\n", __func__); - - return 0; -} - -/** - * wcd9xxx_irq_init - * - * @wcd9xxx_res: pointer to core resource - * - * Returns 0 on success, appropriate error code otherwise - */ -int wcd9xxx_irq_init(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - int i, ret; - u8 irq_level[wcd9xxx_res->num_irq_regs]; - struct irq_domain *domain; - struct device_node *pnode; - - mutex_init(&wcd9xxx_res->irq_lock); - mutex_init(&wcd9xxx_res->nested_irq_lock); - - pnode = of_irq_find_parent(wcd9xxx_res->dev->of_node); - if (unlikely(!pnode)) - return -EINVAL; - - domain = irq_find_host(pnode); - if (unlikely(!domain)) - return -EINVAL; - - wcd9xxx_res->domain = domain; - - wcd9xxx_res->irq = wcd9xxx_irq_get_upstream_irq(wcd9xxx_res); - if (!wcd9xxx_res->irq) { - pr_warn("%s: irq driver is not yet initialized\n", __func__); - mutex_destroy(&wcd9xxx_res->irq_lock); - mutex_destroy(&wcd9xxx_res->nested_irq_lock); - return -EPROBE_DEFER; - } - pr_debug("%s: probed irq %d\n", __func__, wcd9xxx_res->irq); - - /* Setup downstream IRQs */ - ret = wcd9xxx_irq_setup_downstream_irq(wcd9xxx_res); - if (ret) { - pr_err("%s: Failed to setup downstream IRQ\n", __func__); - wcd9xxx_irq_put_upstream_irq(wcd9xxx_res); - mutex_destroy(&wcd9xxx_res->irq_lock); - mutex_destroy(&wcd9xxx_res->nested_irq_lock); - return ret; - } - - /* All other wcd9xxx interrupts are edge triggered */ - wcd9xxx_res->irq_level_high[0] = true; - - /* mask all the interrupts */ - memset(irq_level, 0, wcd9xxx_res->num_irq_regs); - for (i = 0; i < wcd9xxx_res->num_irqs; i++) { - wcd9xxx_res->irq_masks_cur[BIT_BYTE(i)] |= BYTE_BIT_MASK(i); - wcd9xxx_res->irq_masks_cache[BIT_BYTE(i)] |= BYTE_BIT_MASK(i); - irq_level[BIT_BYTE(i)] |= - wcd9xxx_res->irq_level_high[i] << (i % BITS_PER_BYTE); - } - - if (!wcd9xxx_res->wcd_core_regmap) { - dev_err(wcd9xxx_res->dev, - "%s: Codec core regmap not defined\n", - __func__); - ret = -EINVAL; - goto fail_irq_init; - } - - for (i = 0; i < wcd9xxx_res->num_irq_regs; i++) { - /* Initialize interrupt mask and level registers */ - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_LEVEL_BASE] + i, - irq_level[i]); - regmap_write(wcd9xxx_res->wcd_core_regmap, - wcd9xxx_res->intr_reg[WCD9XXX_INTR_MASK_BASE] + i, - wcd9xxx_res->irq_masks_cur[i]); - } - - ret = request_threaded_irq(wcd9xxx_res->irq, NULL, wcd9xxx_irq_thread, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - "wcd9xxx", wcd9xxx_res); - if (ret != 0) - dev_err(wcd9xxx_res->dev, "Failed to request IRQ %d: %d\n", - wcd9xxx_res->irq, ret); - else { - ret = enable_irq_wake(wcd9xxx_res->irq); - if (ret) - dev_err(wcd9xxx_res->dev, - "Failed to set wake interrupt on IRQ %d: %d\n", - wcd9xxx_res->irq, ret); - if (ret) - free_irq(wcd9xxx_res->irq, wcd9xxx_res); - } - - if (ret) - goto fail_irq_init; - - return ret; - -fail_irq_init: - dev_err(wcd9xxx_res->dev, - "%s: Failed to init wcd9xxx irq\n", __func__); - wcd9xxx_irq_put_upstream_irq(wcd9xxx_res); - mutex_destroy(&wcd9xxx_res->irq_lock); - mutex_destroy(&wcd9xxx_res->nested_irq_lock); - return ret; -} -EXPORT_SYMBOL(wcd9xxx_irq_init); - -int wcd9xxx_request_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq, irq_handler_t handler, - const char *name, void *data) -{ - int virq; - - virq = phyirq_to_virq(wcd9xxx_res, irq); - - return request_threaded_irq(virq, NULL, handler, IRQF_TRIGGER_RISING, - name, data); -} -EXPORT_SYMBOL(wcd9xxx_request_irq); - -void wcd9xxx_irq_exit(struct wcd9xxx_core_resource *wcd9xxx_res) -{ - dev_dbg(wcd9xxx_res->dev, "%s: Cleaning up irq %d\n", __func__, - wcd9xxx_res->irq); - - if (wcd9xxx_res->irq) { - disable_irq_wake(wcd9xxx_res->irq); - free_irq(wcd9xxx_res->irq, wcd9xxx_res); - wcd9xxx_res->irq = 0; - wcd9xxx_irq_put_downstream_irq(wcd9xxx_res); - wcd9xxx_irq_put_upstream_irq(wcd9xxx_res); - } - mutex_destroy(&wcd9xxx_res->irq_lock); - mutex_destroy(&wcd9xxx_res->nested_irq_lock); -} - -#ifndef CONFIG_OF -static int phyirq_to_virq( - struct wcd9xxx_core_resource *wcd9xxx_res, - int offset) -{ - return wcd9xxx_res->irq_base + offset; -} - -static int virq_to_phyirq( - struct wcd9xxx_core_resource *wcd9xxx_res, - int virq) -{ - return virq - wcd9xxx_res->irq_base; -} - -static unsigned int wcd9xxx_irq_get_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - return wcd9xxx_res->irq; -} - -static void wcd9xxx_irq_put_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - /* Do nothing */ -} - -static int wcd9xxx_map_irq( - struct wcd9xxx_core_resource *wcd9xxx_core_res, int irq) -{ - return phyirq_to_virq(wcd9xxx_core_res, irq); -} -#else -static struct wcd9xxx_irq_drv_data * -wcd9xxx_irq_add_domain(struct device_node *node, - struct device_node *parent) -{ - struct wcd9xxx_irq_drv_data *data = NULL; - - pr_debug("%s: node %s, node parent %s\n", __func__, - node->name, node->parent->name); - - data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return NULL; - - /* - * wcd9xxx_intc interrupt controller supports N to N irq mapping with - * single cell binding with irq numbers(offsets) only. - * Use irq_domain_simple_ops that has irq_domain_simple_map and - * irq_domain_xlate_onetwocell. - */ - data->domain = irq_domain_add_linear(node, WCD9XXX_MAX_NUM_IRQS, - &irq_domain_simple_ops, data); - if (!data->domain) { - kfree(data); - return NULL; - } - - return data; -} - -static struct wcd9xxx_irq_drv_data * -wcd9xxx_get_irq_drv_d(const struct wcd9xxx_core_resource *wcd9xxx_res) -{ - struct irq_domain *domain; - - domain = wcd9xxx_res->domain; - - if (domain) - return domain->host_data; - else - return NULL; -} - -static int phyirq_to_virq(struct wcd9xxx_core_resource *wcd9xxx_res, int offset) -{ - struct wcd9xxx_irq_drv_data *data; - - data = wcd9xxx_get_irq_drv_d(wcd9xxx_res); - if (!data) { - pr_warn("%s: not registered to interrupt controller\n", - __func__); - return -EINVAL; - } - return irq_linear_revmap(data->domain, offset); -} - -static int virq_to_phyirq(struct wcd9xxx_core_resource *wcd9xxx_res, int virq) -{ - struct irq_data *irq_data = irq_get_irq_data(virq); - - if (unlikely(!irq_data)) { - pr_err("%s: irq_data is NULL", __func__); - return -EINVAL; - } - return irq_data->hwirq; -} - -static unsigned int wcd9xxx_irq_get_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - struct wcd9xxx_irq_drv_data *data; - - data = wcd9xxx_get_irq_drv_d(wcd9xxx_res); - if (!data) { - pr_err("%s: interrupt controller is not registered\n", - __func__); - return 0; - } - - /* Make sure data is updated before return. */ - rmb(); - return data->irq; -} - -static void wcd9xxx_irq_put_downstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - int irq, virq, ret; - - /* - * IRQ migration hits error if the chip data and handles - * are not made NULL. make associated data and handles - * to NULL at irq_exit - */ - for (irq = 0; irq < wcd9xxx_res->num_irqs; irq++) { - virq = wcd9xxx_map_irq(wcd9xxx_res, irq); - pr_debug("%s: irq %d -> %d\n", __func__, irq, virq); - ret = irq_set_chip_data(virq, NULL); - if (ret) { - pr_err("%s: Failed to configure irq %d (%d)\n", - __func__, irq, ret); - return; - } - irq_set_chip_and_handler(virq, NULL, NULL); - } -} - -static void wcd9xxx_irq_put_upstream_irq( - struct wcd9xxx_core_resource *wcd9xxx_res) -{ - wcd9xxx_res->domain = NULL; -} - -static int wcd9xxx_map_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq) -{ - return of_irq_to_resource(wcd9xxx_res->dev->of_node, irq, NULL); -} - -static int wcd9xxx_irq_probe(struct platform_device *pdev) -{ - int irq, dir_apps_irq = -EINVAL; - struct wcd9xxx_irq_drv_data *data; - struct device_node *node = pdev->dev.of_node; - int ret = -EINVAL; - - irq = of_get_named_gpio(node, "qcom,gpio-connect", 0); - if (!gpio_is_valid(irq)) - dir_apps_irq = platform_get_irq_byname(pdev, "wcd_irq"); - - if (!gpio_is_valid(irq) && dir_apps_irq < 0) { - dev_err(&pdev->dev, "TLMM connect gpio not found\n"); - return -EPROBE_DEFER; - } - if (dir_apps_irq > 0) { - irq = dir_apps_irq; - } else { - irq = gpio_to_irq(irq); - if (irq < 0) { - dev_err(&pdev->dev, "Unable to configure irq\n"); - return irq; - } - } - dev_dbg(&pdev->dev, "%s: virq = %d\n", __func__, irq); - data = wcd9xxx_irq_add_domain(node, node->parent); - if (!data) { - pr_err("%s: irq_add_domain failed\n", __func__); - return -EINVAL; - } - data->irq = irq; - - /* Make sure irq is saved before return. */ - wmb(); - ret = 0; - - return ret; -} - -static int wcd9xxx_irq_remove(struct platform_device *pdev) -{ - struct irq_domain *domain; - struct wcd9xxx_irq_drv_data *data; - - domain = irq_find_host(pdev->dev.of_node); - if (unlikely(!domain)) { - pr_err("%s: domain is NULL", __func__); - return -EINVAL; - } - data = (struct wcd9xxx_irq_drv_data *)domain->host_data; - data->irq = 0; - - /* Make sure irq variable is updated in data, before irq removal. */ - wmb(); - irq_domain_remove(data->domain); - kfree(data); - - return 0; -} - -static const struct of_device_id of_match[] = { - { .compatible = "qcom,wcd9xxx-irq" }, - { } -}; - -static struct platform_driver wcd9xxx_irq_driver = { - .probe = wcd9xxx_irq_probe, - .remove = wcd9xxx_irq_remove, - .driver = { - .name = "wcd9xxx_intc", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(of_match), - }, -}; - -int wcd9xxx_irq_drv_init(void) -{ - return platform_driver_register(&wcd9xxx_irq_driver); -} - -void wcd9xxx_irq_drv_exit(void) -{ - platform_driver_unregister(&wcd9xxx_irq_driver); -} -#endif /* CONFIG_OF */ diff --git a/techpack/audio/asoc/codecs/wcd9xxx-irq.h b/techpack/audio/asoc/codecs/wcd9xxx-irq.h deleted file mode 100644 index dfe0b929a84b..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-irq.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "core.h" - -#ifndef __MFD_WCD9XXX_IRQ_H -#define __MFD_WCD9XXX_IRQ_H -bool wcd9xxx_lock_sleep(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_unlock_sleep(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_nested_irq_lock(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_nested_irq_unlock(struct wcd9xxx_core_resource *wcd9xxx_res); -int wcd9xxx_request_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq, - irq_handler_t handler, const char *name, void *data); - -void wcd9xxx_free_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq, void *data); -void wcd9xxx_enable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, int irq); -void wcd9xxx_disable_irq(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq); -void wcd9xxx_disable_irq_sync(struct wcd9xxx_core_resource *wcd9xxx_res, - int irq); - -int wcd9xxx_irq_init(struct wcd9xxx_core_resource *wcd9xxx_res); -void wcd9xxx_irq_exit(struct wcd9xxx_core_resource *wcd9xxx_res); -int wcd9xxx_irq_drv_init(void); -void wcd9xxx_irq_drv_exit(void); -#endif diff --git a/techpack/audio/asoc/codecs/wcd9xxx-regmap.h b/techpack/audio/asoc/codecs/wcd9xxx-regmap.h deleted file mode 100644 index 18e0e58b5117..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-regmap.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD9XXX_REGMAP_ -#define _WCD9XXX_REGMAP_ - -#include -#include "core.h" - -typedef int (*regmap_patch_fptr)(struct regmap *, int); - -extern struct regmap_config wcd9360_regmap_config; - -extern struct regmap_config wcd934x_regmap_config; -extern int wcd934x_regmap_register_patch(struct regmap *regmap, - int version); - -extern struct regmap_config wcd9335_regmap_config; -extern int wcd9335_regmap_register_patch(struct regmap *regmap, - int version); - -static inline struct regmap_config *wcd9xxx_get_regmap_config(int type) -{ - struct regmap_config *regmap_config; - - switch (type) { - case WCD9360: - regmap_config = &wcd9360_regmap_config; - break; - case WCD934X: - regmap_config = &wcd934x_regmap_config; - break; - case WCD9335: - regmap_config = &wcd9335_regmap_config; - break; - default: - regmap_config = NULL; - break; - }; - - return regmap_config; -} - -static inline regmap_patch_fptr wcd9xxx_get_regmap_reg_patch(int type) -{ - regmap_patch_fptr apply_patch; - - switch (type) { - case WCD9335: - apply_patch = wcd9335_regmap_register_patch; - break; - case WCD934X: - apply_patch = wcd934x_regmap_register_patch; - break; - default: - apply_patch = NULL; - break; - } - - return apply_patch; -} - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.c b/techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.c deleted file mode 100644 index d390558ce660..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.c +++ /dev/null @@ -1,694 +0,0 @@ -/* - * Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include "wcd9xxx-resmgr-v2.h" -#include "core.h" - -#define WCD9XXX_RCO_CALIBRATION_DELAY_INC_US 5000 -/* This register is valid only for WCD9335 */ -#define WCD93XX_ANA_CLK_TOP 0x0602 - -#define WCD93XX_ANA_BIAS 0x0601 -#define WCD93XX_CDC_CLK_RST_CTRL_MCLK_CONTROL 0x0d41 -#define WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL 0x0d42 -#define WCD93XX_CLK_SYS_MCLK_PRG 0x711 -#define WCD93XX_CODEC_RPM_CLK_GATE 0x002 -#define WCD93XX_ANA_RCO 0x603 -#define WCD93XX_ANA_BUCK_CTL 0x606 - -static const char *wcd_resmgr_clk_type_to_str(enum wcd_clock_type clk_type) -{ - if (clk_type == WCD_CLK_OFF) - return "WCD_CLK_OFF"; - else if (clk_type == WCD_CLK_RCO) - return "WCD_CLK_RCO"; - else if (clk_type == WCD_CLK_MCLK) - return "WCD_CLK_MCLK"; - else - return "WCD_CLK_UNDEFINED"; -} - -static int wcd_resmgr_codec_reg_update_bits(struct wcd9xxx_resmgr_v2 *resmgr, - u16 reg, u8 mask, u8 val) -{ - bool change; - int ret; - - if (resmgr->codec_type != WCD9335) { - /* Tavil and Pahu does not support ANA_CLK_TOP register */ - if (reg == WCD93XX_ANA_CLK_TOP) - return 0; - } else { - /* Tasha does not support CLK_SYS_MCLK_PRG register */ - if (reg == WCD93XX_CLK_SYS_MCLK_PRG) - return 0; - } - if (resmgr->codec) { - ret = snd_soc_update_bits(resmgr->codec, reg, mask, val); - } else if (resmgr->core_res->wcd_core_regmap) { - ret = regmap_update_bits_check( - resmgr->core_res->wcd_core_regmap, - reg, mask, val, &change); - if (!ret) - ret = change; - } else { - pr_err("%s: codec/regmap not defined\n", __func__); - ret = -EINVAL; - } - - return ret; -} - -static int wcd_resmgr_codec_reg_read(struct wcd9xxx_resmgr_v2 *resmgr, - unsigned int reg) -{ - int val, ret; - - if (resmgr->codec_type != WCD9335) { - if (reg == WCD93XX_ANA_CLK_TOP) - return 0; - } else { - if (reg == WCD93XX_CLK_SYS_MCLK_PRG) - return 0; - } - if (resmgr->codec) { - val = snd_soc_read(resmgr->codec, reg); - } else if (resmgr->core_res->wcd_core_regmap) { - ret = regmap_read(resmgr->core_res->wcd_core_regmap, - reg, &val); - if (ret) - val = ret; - } else { - pr_err("%s: wcd regmap is null\n", __func__); - return -EINVAL; - } - - return val; -} - -/* - * wcd_resmgr_get_clk_type() - * Returns clk type that is currently enabled - */ -int wcd_resmgr_get_clk_type(struct wcd9xxx_resmgr_v2 *resmgr) -{ - if (!resmgr) { - pr_err("%s: resmgr not initialized\n", __func__); - return -EINVAL; - } - return resmgr->clk_type; -} -EXPORT_SYMBOL(wcd_resmgr_get_clk_type); - -static void wcd_resmgr_cdc_specific_get_clk(struct wcd9xxx_resmgr_v2 *resmgr, - int clk_users) -{ - /* Caller of this function should have acquired BG_CLK lock */ - if (clk_users) { - if (resmgr->resmgr_cb && - resmgr->resmgr_cb->cdc_rco_ctrl) { - while (clk_users--) - resmgr->resmgr_cb->cdc_rco_ctrl(resmgr->codec, - true); - } - } -} - -/* - * wcd_resmgr_post_ssr_v2 - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -void wcd_resmgr_post_ssr_v2(struct wcd9xxx_resmgr_v2 *resmgr) -{ - int old_bg_audio_users; - int old_clk_rco_users, old_clk_mclk_users; - - WCD9XXX_V2_BG_CLK_LOCK(resmgr); - - old_bg_audio_users = resmgr->master_bias_users; - old_clk_mclk_users = resmgr->clk_mclk_users; - old_clk_rco_users = resmgr->clk_rco_users; - resmgr->master_bias_users = 0; - resmgr->clk_mclk_users = 0; - resmgr->clk_rco_users = 0; - resmgr->clk_type = WCD_CLK_OFF; - - pr_debug("%s: old_bg_audio_users=%d old_clk_mclk_users=%d old_clk_rco_users=%d\n", - __func__, old_bg_audio_users, - old_clk_mclk_users, old_clk_rco_users); - - if (old_bg_audio_users) { - while (old_bg_audio_users--) - wcd_resmgr_enable_master_bias(resmgr); - } - - if (old_clk_mclk_users) { - while (old_clk_mclk_users--) - wcd_resmgr_enable_clk_block(resmgr, WCD_CLK_MCLK); - } - - if (old_clk_rco_users) - wcd_resmgr_cdc_specific_get_clk(resmgr, old_clk_rco_users); - - WCD9XXX_V2_BG_CLK_UNLOCK(resmgr); -} -EXPORT_SYMBOL(wcd_resmgr_post_ssr_v2); - -/* - * wcd_resmgr_enable_master_bias: enable codec master bias - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -int wcd_resmgr_enable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr) -{ - mutex_lock(&resmgr->master_bias_lock); - - resmgr->master_bias_users++; - if (resmgr->master_bias_users == 1) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x80, 0x80); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x40, 0x40); - /* - * 1ms delay is required after pre-charge is enabled - * as per HW requirement - */ - usleep_range(1000, 1100); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x40, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_BIAS, 0x20, 0x00); - } - - pr_debug("%s: current master bias users: %d\n", __func__, - resmgr->master_bias_users); - - mutex_unlock(&resmgr->master_bias_lock); - return 0; -} -EXPORT_SYMBOL(wcd_resmgr_enable_master_bias); - -/* - * wcd_resmgr_disable_master_bias: disable codec master bias - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -int wcd_resmgr_disable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr) -{ - mutex_lock(&resmgr->master_bias_lock); - if (resmgr->master_bias_users <= 0) { - mutex_unlock(&resmgr->master_bias_lock); - return -EINVAL; - } - - resmgr->master_bias_users--; - if (resmgr->master_bias_users == 0) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BIAS, - 0x80, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_BIAS, 0x20, 0x00); - } - mutex_unlock(&resmgr->master_bias_lock); - return 0; -} -EXPORT_SYMBOL(wcd_resmgr_disable_master_bias); - -static int wcd_resmgr_enable_clk_mclk(struct wcd9xxx_resmgr_v2 *resmgr) -{ - /* Enable mclk requires master bias to be enabled first */ - if (resmgr->master_bias_users <= 0) { - pr_err("%s: Cannot turn on MCLK, BG is not enabled\n", - __func__); - return -EINVAL; - } - - if (((resmgr->clk_mclk_users == 0) && - (resmgr->clk_type == WCD_CLK_MCLK)) || - ((resmgr->clk_mclk_users > 0) && - (resmgr->clk_type != WCD_CLK_MCLK))) { - pr_err("%s: Error enabling MCLK, clk_type: %s\n", - __func__, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - return -EINVAL; - } - - if (++resmgr->clk_mclk_users == 1) { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, 0x80, 0x80); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, 0x08, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, 0x04, 0x04); - if (resmgr->codec_type != WCD9335) { - /* - * In tavil clock contrl register is changed - * to CLK_SYS_MCLK_PRG - */ - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x80, 0x80); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x30, 0x10); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x02, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x02, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CODEC_RPM_CLK_GATE, 0x03, 0x00); - } else { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CDC_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - } - /* - * 10us sleep is required after clock is enabled - * as per HW requirement - */ - usleep_range(10, 15); - } - - resmgr->clk_type = WCD_CLK_MCLK; - - pr_debug("%s: mclk_users: %d, clk_type: %s\n", __func__, - resmgr->clk_mclk_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -static int wcd_resmgr_disable_clk_mclk(struct wcd9xxx_resmgr_v2 *resmgr) -{ - if (resmgr->clk_mclk_users <= 0) { - pr_err("%s: No mclk users, cannot disable mclk\n", __func__); - return -EINVAL; - } - - if (--resmgr->clk_mclk_users == 0) { - if (resmgr->clk_rco_users > 0) { - /* MCLK to RCO switch */ - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, - 0x08, 0x08); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x02, 0x02); - /* Disable clock buffer */ - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x80, 0x00); - resmgr->clk_type = WCD_CLK_RCO; - } else { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, - 0x04, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, 0x81, 0x00); - resmgr->clk_type = WCD_CLK_OFF; - } - - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_CLK_TOP, - 0x80, 0x00); - } - - if ((resmgr->codec_type != WCD9335) && - (resmgr->clk_type == WCD_CLK_OFF)) - wcd_resmgr_set_sido_input_src(resmgr, SIDO_SOURCE_INTERNAL); - - pr_debug("%s: mclk_users: %d, clk_type: %s\n", __func__, - resmgr->clk_mclk_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -static void wcd_resmgr_set_buck_accuracy(struct wcd9xxx_resmgr_v2 *resmgr) -{ - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x02, 0x02); - /* 100us sleep needed after HIGH_ACCURACY_PRE_EN1 */ - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x01, 0x01); - /* 100us sleep needed after HIGH_ACCURACY_PRE_EN2 */ - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x04, 0x04); - /* 100us sleep needed after HIGH_ACCURACY_EN */ - usleep_range(100, 110); -} - -static int wcd_resmgr_enable_clk_rco(struct wcd9xxx_resmgr_v2 *resmgr) -{ - bool rco_cal_done = true; - - resmgr->clk_rco_users++; - if ((resmgr->clk_rco_users == 1) && - ((resmgr->clk_type == WCD_CLK_OFF) || - (resmgr->clk_mclk_users == 0))) { - pr_warn("%s: RCO enable requires MCLK to be ON first\n", - __func__); - resmgr->clk_rco_users--; - return -EINVAL; - } else if ((resmgr->clk_rco_users == 1) && - (resmgr->clk_mclk_users)) { - /* RCO Enable */ - if (resmgr->sido_input_src == SIDO_SOURCE_INTERNAL) { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_RCO, - 0x80, 0x80); - if (resmgr->codec_type != WCD9335) - wcd_resmgr_set_buck_accuracy(resmgr); - } - - /* - * 20us required after RCO BG is enabled as per HW - * requirements - */ - usleep_range(20, 25); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x40, 0x40); - /* - * 20us required after RCO is enabled as per HW - * requirements - */ - usleep_range(20, 25); - /* RCO Calibration */ - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x04, 0x04); - if (resmgr->codec_type != WCD9335) - /* - * For wcd934x and wcd936x codecs, 20us sleep is needed - * after enabling RCO calibration - */ - usleep_range(20, 25); - - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x04, 0x00); - if (resmgr->codec_type != WCD9335) - /* - * For wcd934x and wcd936x codecs, 20us sleep is needed - * after disabling RCO calibration - */ - usleep_range(20, 25); - - /* RCO calibration takes app. 5ms to complete */ - usleep_range(WCD9XXX_RCO_CALIBRATION_DELAY_INC_US, - WCD9XXX_RCO_CALIBRATION_DELAY_INC_US + 100); - if (wcd_resmgr_codec_reg_read(resmgr, WCD93XX_ANA_RCO) & 0x02) - rco_cal_done = false; - - WARN((!rco_cal_done), "RCO Calibration failed\n"); - - /* Switch MUX to RCO */ - if (resmgr->clk_mclk_users == 1) { - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_CLK_TOP, - 0x08, 0x08); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, - 0x02, 0x02); - resmgr->clk_type = WCD_CLK_RCO; - } - } - pr_debug("%s: rco clk users: %d, clk_type: %s\n", __func__, - resmgr->clk_rco_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -static int wcd_resmgr_disable_clk_rco(struct wcd9xxx_resmgr_v2 *resmgr) -{ - if ((resmgr->clk_rco_users <= 0) || - (resmgr->clk_type == WCD_CLK_OFF)) { - pr_err("%s: rco_clk_users = %d, clk_type = %d, cannot disable\n", - __func__, resmgr->clk_rco_users, resmgr->clk_type); - return -EINVAL; - } - - resmgr->clk_rco_users--; - - if ((resmgr->clk_rco_users == 0) && - (resmgr->clk_type == WCD_CLK_RCO)) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_CLK_TOP, - 0x08, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, - 0x02, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_CLK_TOP, - 0x04, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x40, 0x00); - if (resmgr->sido_input_src == SIDO_SOURCE_INTERNAL) - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_RCO, - 0x80, 0x00); - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_CLK_SYS_MCLK_PRG, - 0x01, 0x00); - resmgr->clk_type = WCD_CLK_OFF; - } else if ((resmgr->clk_rco_users == 0) && - (resmgr->clk_mclk_users)) { - /* Disable RCO while MCLK is ON */ - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x40, 0x00); - if (resmgr->sido_input_src == SIDO_SOURCE_INTERNAL) - wcd_resmgr_codec_reg_update_bits(resmgr, - WCD93XX_ANA_RCO, - 0x80, 0x00); - } - - if ((resmgr->codec_type != WCD9335) && - (resmgr->clk_type == WCD_CLK_OFF)) - wcd_resmgr_set_sido_input_src(resmgr, SIDO_SOURCE_INTERNAL); - - pr_debug("%s: rco clk users: %d, clk_type: %s\n", __func__, - resmgr->clk_rco_users, - wcd_resmgr_clk_type_to_str(resmgr->clk_type)); - - return 0; -} - -/* - * wcd_resmgr_enable_clk_block: enable MCLK or RCO - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - * @type: Clock type to enable - */ -int wcd_resmgr_enable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type) -{ - int ret; - - switch (type) { - case WCD_CLK_MCLK: - ret = wcd_resmgr_enable_clk_mclk(resmgr); - break; - case WCD_CLK_RCO: - ret = wcd_resmgr_enable_clk_rco(resmgr); - break; - default: - pr_err("%s: Unknown Clock type: %s\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - ret = -EINVAL; - break; - }; - - if (ret) - pr_err("%s: Enable clock %s failed\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - - return ret; -} -EXPORT_SYMBOL(wcd_resmgr_enable_clk_block); - -void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src) -{ - if (!resmgr) - return; - - if (sido_src == resmgr->sido_input_src) - return; - - if (sido_src == SIDO_SOURCE_INTERNAL) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x04, 0x00); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x03, 0x00); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x80, 0x00); - usleep_range(100, 110); - resmgr->sido_input_src = SIDO_SOURCE_INTERNAL; - pr_debug("%s: sido input src to internal\n", __func__); - } else if (sido_src == SIDO_SOURCE_RCO_BG) { - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_RCO, - 0x80, 0x80); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x02, 0x02); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x01, 0x01); - usleep_range(100, 110); - wcd_resmgr_codec_reg_update_bits(resmgr, WCD93XX_ANA_BUCK_CTL, - 0x04, 0x04); - usleep_range(100, 110); - resmgr->sido_input_src = SIDO_SOURCE_RCO_BG; - pr_debug("%s: sido input src to external\n", __func__); - } -} -EXPORT_SYMBOL(wcd_resmgr_set_sido_input_src); - -/* - * wcd_resmgr_set_sido_input_src_locked: - * Set SIDO input in BG_CLK locked context - * - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - * @sido_src: Select the SIDO input source - */ -void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src) -{ - if (!resmgr) - return; - - WCD9XXX_V2_BG_CLK_LOCK(resmgr); - wcd_resmgr_set_sido_input_src(resmgr, sido_src); - WCD9XXX_V2_BG_CLK_UNLOCK(resmgr); -} -EXPORT_SYMBOL(wcd_resmgr_set_sido_input_src_locked); - -/* - * wcd_resmgr_disable_clk_block: disable MCLK or RCO - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - * @type: Clock type to disable - */ -int wcd_resmgr_disable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type) -{ - int ret; - - switch (type) { - case WCD_CLK_MCLK: - ret = wcd_resmgr_disable_clk_mclk(resmgr); - break; - case WCD_CLK_RCO: - ret = wcd_resmgr_disable_clk_rco(resmgr); - break; - default: - pr_err("%s: Unknown Clock type: %s\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - ret = -EINVAL; - break; - }; - - if (ret) - pr_err("%s: Disable clock %s failed\n", __func__, - wcd_resmgr_clk_type_to_str(type)); - - return ret; -} -EXPORT_SYMBOL(wcd_resmgr_disable_clk_block); - -/* - * wcd_resmgr_init: initialize wcd resource manager - * @core_res: handle to struct wcd9xxx_core_resource - * - * Early init call without a handle to snd_soc_codec * - */ -struct wcd9xxx_resmgr_v2 *wcd_resmgr_init( - struct wcd9xxx_core_resource *core_res, - struct snd_soc_codec *codec) -{ - struct wcd9xxx_resmgr_v2 *resmgr; - struct wcd9xxx *wcd9xxx; - - resmgr = kzalloc(sizeof(struct wcd9xxx_resmgr_v2), GFP_KERNEL); - if (!resmgr) - return ERR_PTR(-ENOMEM); - - wcd9xxx = container_of(core_res, struct wcd9xxx, core_res); - if (!wcd9xxx) { - kfree(resmgr); - pr_err("%s: Cannot get wcd9xx pointer\n", __func__); - return ERR_PTR(-EINVAL); - } - - mutex_init(&resmgr->codec_bg_clk_lock); - mutex_init(&resmgr->master_bias_lock); - resmgr->master_bias_users = 0; - resmgr->clk_mclk_users = 0; - resmgr->clk_rco_users = 0; - resmgr->master_bias_users = 0; - resmgr->codec = codec; - resmgr->core_res = core_res; - resmgr->sido_input_src = SIDO_SOURCE_INTERNAL; - resmgr->codec_type = wcd9xxx->type; - - return resmgr; -} -EXPORT_SYMBOL(wcd_resmgr_init); - -/* - * wcd_resmgr_remove: Clean-up wcd resource manager - * @resmgr: handle to struct wcd9xxx_resmgr_v2 - */ -void wcd_resmgr_remove(struct wcd9xxx_resmgr_v2 *resmgr) -{ - mutex_destroy(&resmgr->master_bias_lock); - kfree(resmgr); -} -EXPORT_SYMBOL(wcd_resmgr_remove); - -/* - * wcd_resmgr_post_init: post init call to assign codec handle - * @resmgr: handle to struct wcd9xxx_resmgr_v2 created during early init - * @resmgr_cb: codec callback function for resmgr - * @codec: handle to struct snd_soc_codec - */ -int wcd_resmgr_post_init(struct wcd9xxx_resmgr_v2 *resmgr, - const struct wcd_resmgr_cb *resmgr_cb, - struct snd_soc_codec *codec) -{ - if (!resmgr) { - pr_err("%s: resmgr not allocated\n", __func__); - return -EINVAL; - } - - if (!codec) { - pr_err("%s: Codec memory is NULL, nothing to post init\n", - __func__); - return -EINVAL; - } - - resmgr->codec = codec; - resmgr->resmgr_cb = resmgr_cb; - - return 0; -} -EXPORT_SYMBOL(wcd_resmgr_post_init); - -MODULE_DESCRIPTION("wcd9xxx resmgr v2 module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.h b/techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.h deleted file mode 100644 index e9d3531e262e..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-resmgr-v2.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD9XXX_COMMON_V2_H__ -#define __WCD9XXX_COMMON_V2_H__ - -#include -#include "core.h" - -enum wcd_clock_type { - WCD_CLK_OFF, - WCD_CLK_RCO, - WCD_CLK_MCLK, -}; - -enum { - SIDO_SOURCE_INTERNAL, - SIDO_SOURCE_RCO_BG, -}; - -struct wcd_resmgr_cb { - int (*cdc_rco_ctrl)(struct snd_soc_codec *, bool); -}; - -struct wcd9xxx_resmgr_v2 { - struct snd_soc_codec *codec; - struct wcd9xxx_core_resource *core_res; - - int master_bias_users; - int clk_mclk_users; - int clk_rco_users; - - struct mutex codec_bg_clk_lock; - struct mutex master_bias_lock; - - enum codec_variant codec_type; - enum wcd_clock_type clk_type; - - const struct wcd_resmgr_cb *resmgr_cb; - int sido_input_src; -}; - -#define WCD9XXX_V2_BG_CLK_LOCK(resmgr) \ -{ \ - struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \ - pr_debug("%s: Acquiring BG_CLK\n", __func__); \ - mutex_lock(&__resmgr->codec_bg_clk_lock); \ - pr_debug("%s: Acquiring BG_CLK done\n", __func__); \ -} - -#define WCD9XXX_V2_BG_CLK_UNLOCK(resmgr) \ -{ \ - struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \ - pr_debug("%s: Releasing BG_CLK\n", __func__); \ - mutex_unlock(&__resmgr->codec_bg_clk_lock); \ -} - -#define WCD9XXX_V2_BG_CLK_ASSERT_LOCKED(resmgr) \ -{ \ - WARN_ONCE(!mutex_is_locked(&resmgr->codec_bg_clk_lock), \ - "%s: BG_CLK lock should have acquired\n", __func__); \ -} - -int wcd_resmgr_enable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr); -int wcd_resmgr_disable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr); -struct wcd9xxx_resmgr_v2 *wcd_resmgr_init( - struct wcd9xxx_core_resource *core_res, - struct snd_soc_codec *codec); -void wcd_resmgr_remove(struct wcd9xxx_resmgr_v2 *resmgr); -int wcd_resmgr_post_init(struct wcd9xxx_resmgr_v2 *resmgr, - const struct wcd_resmgr_cb *resmgr_cb, - struct snd_soc_codec *codec); -int wcd_resmgr_enable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type); -int wcd_resmgr_disable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr, - enum wcd_clock_type type); -int wcd_resmgr_get_clk_type(struct wcd9xxx_resmgr_v2 *resmgr); -void wcd_resmgr_post_ssr_v2(struct wcd9xxx_resmgr_v2 *resmgr); -void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src); -void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr, - int sido_src); - -#endif diff --git a/techpack/audio/asoc/codecs/wcd9xxx-rst.c b/techpack/audio/asoc/codecs/wcd9xxx-rst.c deleted file mode 100644 index 563dd78508f1..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-rst.c +++ /dev/null @@ -1,602 +0,0 @@ -/* Copyright (c) 2017-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include "core.h" -#include "pdata.h" -#include "wcd9xxx-utils.h" -#include "wcd9335_registers.h" -#include "wcd9335_irq.h" -#include -#include "wcd934x/wcd934x_irq.h" -#include -#include "wcd9360/wcd9360-irq.h" - -/* wcd9335 interrupt table */ -static const struct intr_data wcd9335_intr_table[] = { - {WCD9XXX_IRQ_SLIMBUS, false}, - {WCD9335_IRQ_MBHC_SW_DET, true}, - {WCD9335_IRQ_MBHC_BUTTON_PRESS_DET, true}, - {WCD9335_IRQ_MBHC_BUTTON_RELEASE_DET, true}, - {WCD9335_IRQ_MBHC_ELECT_INS_REM_DET, true}, - {WCD9335_IRQ_MBHC_ELECT_INS_REM_LEG_DET, true}, - {WCD9335_IRQ_FLL_LOCK_LOSS, false}, - {WCD9335_IRQ_HPH_PA_CNPL_COMPLETE, false}, - {WCD9335_IRQ_HPH_PA_CNPR_COMPLETE, false}, - {WCD9335_IRQ_EAR_PA_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA1_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA2_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA3_CNP_COMPLETE, false}, - {WCD9335_IRQ_LINE_PA4_CNP_COMPLETE, false}, - {WCD9335_IRQ_HPH_PA_OCPL_FAULT, false}, - {WCD9335_IRQ_HPH_PA_OCPR_FAULT, false}, - {WCD9335_IRQ_EAR_PA_OCP_FAULT, false}, - {WCD9335_IRQ_SOUNDWIRE, false}, - {WCD9335_IRQ_VDD_DIG_RAMP_COMPLETE, false}, - {WCD9335_IRQ_RCO_ERROR, false}, - {WCD9335_IRQ_SVA_ERROR, false}, - {WCD9335_IRQ_MAD_AUDIO, false}, - {WCD9335_IRQ_MAD_BEACON, false}, - {WCD9335_IRQ_SVA_OUTBOX1, true}, - {WCD9335_IRQ_SVA_OUTBOX2, true}, - {WCD9335_IRQ_MAD_ULTRASOUND, false}, - {WCD9335_IRQ_VBAT_ATTACK, false}, - {WCD9335_IRQ_VBAT_RESTORE, false}, -}; - -static const struct intr_data wcd934x_intr_table[] = { - {WCD9XXX_IRQ_SLIMBUS, false}, - {WCD934X_IRQ_MBHC_SW_DET, true}, - {WCD934X_IRQ_MBHC_BUTTON_PRESS_DET, true}, - {WCD934X_IRQ_MBHC_BUTTON_RELEASE_DET, true}, - {WCD934X_IRQ_MBHC_ELECT_INS_REM_DET, true}, - {WCD934X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, true}, - {WCD934X_IRQ_MISC, false}, - {WCD934X_IRQ_HPH_PA_CNPL_COMPLETE, false}, - {WCD934X_IRQ_HPH_PA_CNPR_COMPLETE, false}, - {WCD934X_IRQ_EAR_PA_CNP_COMPLETE, false}, - {WCD934X_IRQ_LINE_PA1_CNP_COMPLETE, false}, - {WCD934X_IRQ_LINE_PA2_CNP_COMPLETE, false}, - {WCD934X_IRQ_SLNQ_ANALOG_ERROR, false}, - {WCD934X_IRQ_RESERVED_3, false}, - {WCD934X_IRQ_HPH_PA_OCPL_FAULT, false}, - {WCD934X_IRQ_HPH_PA_OCPR_FAULT, false}, - {WCD934X_IRQ_EAR_PA_OCP_FAULT, false}, - {WCD934X_IRQ_SOUNDWIRE, false}, - {WCD934X_IRQ_VDD_DIG_RAMP_COMPLETE, false}, - {WCD934X_IRQ_RCO_ERROR, false}, - {WCD934X_IRQ_CPE_ERROR, false}, - {WCD934X_IRQ_MAD_AUDIO, false}, - {WCD934X_IRQ_MAD_BEACON, false}, - {WCD934X_IRQ_CPE1_INTR, true}, - {WCD934X_IRQ_RESERVED_4, false}, - {WCD934X_IRQ_MAD_ULTRASOUND, false}, - {WCD934X_IRQ_VBAT_ATTACK, false}, - {WCD934X_IRQ_VBAT_RESTORE, false}, -}; - -static const struct intr_data wcd9360_intr_table[] = { - {WCD9XXX_IRQ_SLIMBUS, false}, - {WCD9360_IRQ_MISC, false}, - {WCD9360_IRQ_LDO_RXTX_SCD, false}, - {WCD9360_IRQ_EAR_PA_SCD, false}, - {WCD9360_IRQ_AUX_PA_SCD, false}, - {WCD9360_IRQ_EAR_PA_CNP_COMPLETE, false}, - {WCD9360_IRQ_AUX_PA_CNP_COMPLETE, false}, - {WCD9360_IRQ_RESERVED_3, false}, - {WCD9360_IRQ_SOUNDWIRE, false}, - {WCD9360_IRQ_RCO_ERROR, false}, - {WCD9360_IRQ_CPE_ERROR, false}, - {WCD9360_IRQ_MAD_AUDIO, false}, - {WCD9360_IRQ_MAD_BEACON, false}, - {WCD9360_IRQ_CPE1_INTR, true}, - {WCD9360_IRQ_RESERVED_4, false}, - {WCD9360_IRQ_MAD_ULTRASOUND, false}, -}; - -/* - * wcd9335_bring_down: Bringdown WCD Codec - * - * @wcd9xxx: Pointer to wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9335_bring_down(struct wcd9xxx *wcd9xxx) -{ - if (!wcd9xxx || !wcd9xxx->regmap) - return -EINVAL; - - regmap_write(wcd9xxx->regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x04); - - return 0; -} - -/* - * wcd9335_bring_up: Bringup WCD Codec - * - * @wcd9xxx: Pointer to the wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9335_bring_up(struct wcd9xxx *wcd9xxx) -{ - int ret = 0; - int val, byte0; - struct regmap *wcd_regmap; - - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null!\n", - __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - regmap_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, &val); - regmap_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, &byte0); - - if ((val < 0) || (byte0 < 0)) { - dev_err(wcd9xxx->dev, "%s: tasha codec version detection fail!\n", - __func__); - return -EINVAL; - } - if ((val & 0x80) && (byte0 == 0x0)) { - dev_info(wcd9xxx->dev, "%s: wcd9335 codec version is v1.1\n", - __func__); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_2, 0xFC); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_4, 0x21); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x5); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x7); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x3); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x3); - } else if (byte0 == 0x1) { - dev_info(wcd9xxx->dev, "%s: wcd9335 codec version is v2.0\n", - __func__); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_TEST_2, 0x00); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_8, 0x6F); - regmap_write(wcd_regmap, WCD9335_BIAS_VBG_FINE_ADJ, 0x65); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x5); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x7); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x3); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x3); - } else if ((byte0 == 0) && (!(val & 0x80))) { - dev_info(wcd9xxx->dev, "%s: wcd9335 codec version is v1.0\n", - __func__); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_2, 0xFC); - regmap_write(wcd_regmap, WCD9335_SIDO_SIDO_CCL_4, 0x21); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x3); - regmap_write(wcd_regmap, WCD9335_CODEC_RPM_RST_CTL, 0x3); - } else { - dev_err(wcd9xxx->dev, "%s: tasha codec version unknown\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -/* - * wcd9335_get_cdc_info: Get codec specific information - * - * @wcd9xxx: pointer to wcd9xxx structure - * @wcd_type: pointer to wcd9xxx_codec_type structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9335_get_cdc_info(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_codec_type *wcd_type) -{ - u16 id_minor, id_major; - struct regmap *wcd_regmap; - int rc, val, version = 0; - - if (!wcd9xxx || !wcd_type) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null!\n", - __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - rc = regmap_bulk_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, - (u8 *)&id_minor, sizeof(u16)); - if (rc) - return -EINVAL; - - rc = regmap_bulk_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE2, - (u8 *)&id_major, sizeof(u16)); - if (rc) - return -EINVAL; - - dev_info(wcd9xxx->dev, "%s: wcd9xxx chip id major 0x%x, minor 0x%x\n", - __func__, id_major, id_minor); - - /* Version detection */ - if (id_major == TASHA_MAJOR) { - regmap_read(wcd_regmap, WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, - &val); - version = ((u8)val & 0x80) >> 7; - } else if (id_major == TASHA2P0_MAJOR) - version = 2; - else - dev_err(wcd9xxx->dev, "%s: wcd9335 version unknown (major 0x%x, minor 0x%x)\n", - __func__, id_major, id_minor); - - /* Fill codec type info */ - wcd_type->id_major = id_major; - wcd_type->id_minor = id_minor; - wcd_type->num_irqs = WCD9335_NUM_IRQS; - wcd_type->version = version; - wcd_type->slim_slave_type = WCD9XXX_SLIM_SLAVE_ADDR_TYPE_1; - wcd_type->i2c_chip_status = 0x01; - wcd_type->intr_tbl = wcd9335_intr_table; - wcd_type->intr_tbl_size = ARRAY_SIZE(wcd9335_intr_table); - - wcd_type->intr_reg[WCD9XXX_INTR_STATUS_BASE] = - WCD9335_INTR_PIN1_STATUS0; - wcd_type->intr_reg[WCD9XXX_INTR_CLEAR_BASE] = - WCD9335_INTR_PIN1_CLEAR0; - wcd_type->intr_reg[WCD9XXX_INTR_MASK_BASE] = - WCD9335_INTR_PIN1_MASK0; - wcd_type->intr_reg[WCD9XXX_INTR_LEVEL_BASE] = - WCD9335_INTR_LEVEL0; - wcd_type->intr_reg[WCD9XXX_INTR_CLR_COMMIT] = - WCD9335_INTR_CLR_COMMIT; - - return rc; -} - -/* - * wcd934x_bring_down: Bringdown WCD Codec - * - * @wcd9xxx: Pointer to wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd934x_bring_down(struct wcd9xxx *wcd9xxx) -{ - if (!wcd9xxx || !wcd9xxx->regmap) - return -EINVAL; - - regmap_write(wcd9xxx->regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x04); - - return 0; -} - -/* - * wcd934x_bring_up: Bringup WCD Codec - * - * @wcd9xxx: Pointer to the wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd934x_bring_up(struct wcd9xxx *wcd9xxx) -{ - struct regmap *wcd_regmap; - - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null!\n", - __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD934X_SIDO_NEW_VOUT_A_STARTUP, 0x19); - regmap_write(wcd_regmap, WCD934X_SIDO_NEW_VOUT_D_STARTUP, 0x15); - /* Add 1msec delay for VOUT to settle */ - usleep_range(1000, 1100); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x5); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x7); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_RST_CTL, 0x3); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_RST_CTL, 0x7); - regmap_write(wcd_regmap, WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x3); - - return 0; -} - -/* - * wcd934x_get_cdc_info: Get codec specific information - * - * @wcd9xxx: pointer to wcd9xxx structure - * @wcd_type: pointer to wcd9xxx_codec_type structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd934x_get_cdc_info(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_codec_type *wcd_type) -{ - u16 id_minor, id_major; - struct regmap *wcd_regmap; - int rc, version = -1; - - if (!wcd9xxx || !wcd_type) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null\n", __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - rc = regmap_bulk_read(wcd_regmap, WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0, - (u8 *)&id_minor, sizeof(u16)); - if (rc) - return -EINVAL; - - rc = regmap_bulk_read(wcd_regmap, WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE2, - (u8 *)&id_major, sizeof(u16)); - if (rc) - return -EINVAL; - - dev_info(wcd9xxx->dev, "%s: wcd9xxx chip id major 0x%x, minor 0x%x\n", - __func__, id_major, id_minor); - - if (id_major != TAVIL_MAJOR) - goto version_unknown; - - /* - * As fine version info cannot be retrieved before tavil probe. - * Assign coarse versions for possible future use before tavil probe. - */ - if (id_minor == cpu_to_le16(0)) - version = TAVIL_VERSION_1_0; - else if (id_minor == cpu_to_le16(0x01)) - version = TAVIL_VERSION_1_1; - -version_unknown: - if (version < 0) - dev_err(wcd9xxx->dev, "%s: wcd934x version unknown\n", - __func__); - - /* Fill codec type info */ - wcd_type->id_major = id_major; - wcd_type->id_minor = id_minor; - wcd_type->num_irqs = WCD934X_NUM_IRQS; - wcd_type->version = version; - wcd_type->slim_slave_type = WCD9XXX_SLIM_SLAVE_ADDR_TYPE_1; - wcd_type->i2c_chip_status = 0x01; - wcd_type->intr_tbl = wcd934x_intr_table; - wcd_type->intr_tbl_size = ARRAY_SIZE(wcd934x_intr_table); - - wcd_type->intr_reg[WCD9XXX_INTR_STATUS_BASE] = - WCD934X_INTR_PIN1_STATUS0; - wcd_type->intr_reg[WCD9XXX_INTR_CLEAR_BASE] = - WCD934X_INTR_PIN1_CLEAR0; - wcd_type->intr_reg[WCD9XXX_INTR_MASK_BASE] = - WCD934X_INTR_PIN1_MASK0; - wcd_type->intr_reg[WCD9XXX_INTR_LEVEL_BASE] = - WCD934X_INTR_LEVEL0; - wcd_type->intr_reg[WCD9XXX_INTR_CLR_COMMIT] = - WCD934X_INTR_CLR_COMMIT; - - return rc; -} - -/* - * wcd9360_bring_down: Bringdown WCD Codec - * - * @wcd9xxx: Pointer to wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9360_bring_down(struct wcd9xxx *wcd9xxx) -{ - if (!wcd9xxx || !wcd9xxx->regmap) - return -EINVAL; - - regmap_write(wcd9xxx->regmap, WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, - 0x04); - - return 0; -} - -/* - * wcd9360_bring_up: Bringup WCD Codec - * - * @wcd9xxx: Pointer to the wcd9xxx structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9360_bring_up(struct wcd9xxx *wcd9xxx) -{ - struct regmap *wcd_regmap; - - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null!\n", - __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - regmap_write(wcd_regmap, WCD9360_CODEC_RPM_RST_CTL, 0x01); - regmap_write(wcd_regmap, WCD9360_SIDO_NEW_VOUT_A_STARTUP, 0x19); - regmap_write(wcd_regmap, WCD9360_SIDO_NEW_VOUT_D_STARTUP, 0x15); - /* Add 1msec delay for VOUT to settle */ - usleep_range(1000, 1100); - regmap_write(wcd_regmap, WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x5); - regmap_write(wcd_regmap, WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x7); - regmap_write(wcd_regmap, WCD9360_CODEC_RPM_RST_CTL, 0x3); - regmap_write(wcd_regmap, WCD9360_CODEC_RPM_RST_CTL, 0x7); - regmap_write(wcd_regmap, WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x3); - - return 0; -} - -/* - * wcd9360_get_cdc_info: Get codec specific information - * - * @wcd9xxx: pointer to wcd9xxx structure - * @wcd_type: pointer to wcd9xxx_codec_type structure - * - * Returns 0 for success or negative error code for failure - */ -static int wcd9360_get_cdc_info(struct wcd9xxx *wcd9xxx, - struct wcd9xxx_codec_type *wcd_type) -{ - u16 id_minor, id_major; - struct regmap *wcd_regmap; - int rc, version = -1; - - if (!wcd9xxx || !wcd_type) - return -EINVAL; - - if (!wcd9xxx->regmap) { - dev_err(wcd9xxx->dev, "%s: wcd9xxx regmap is null\n", __func__); - return -EINVAL; - } - wcd_regmap = wcd9xxx->regmap; - - rc = regmap_bulk_read(wcd_regmap, WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE0, - (u8 *)&id_minor, sizeof(u16)); - if (rc) - return -EINVAL; - - rc = regmap_bulk_read(wcd_regmap, WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE2, - (u8 *)&id_major, sizeof(u16)); - if (rc) - return -EINVAL; - - dev_info(wcd9xxx->dev, "%s: wcd9xxx chip id major 0x%x, minor 0x%x\n", - __func__, id_major, id_minor); - - if (id_major != PAHU_MAJOR) - goto version_unknown; - - /* - * As fine version info cannot be retrieved before pahu probe. - * Assign coarse versions for possible future use before Pahu probe. - */ - if (id_minor == cpu_to_le16(0)) - version = PAHU_VERSION_1_0; - -version_unknown: - if (version < 0) - dev_err(wcd9xxx->dev, "%s: wcd934x version unknown\n", - __func__); - - /* Fill codec type info */ - wcd_type->id_major = id_major; - wcd_type->id_minor = id_minor; - wcd_type->num_irqs = WCD9360_NUM_IRQS; - wcd_type->version = version; - wcd_type->slim_slave_type = WCD9XXX_SLIM_SLAVE_ADDR_TYPE_1; - wcd_type->i2c_chip_status = 0x01; - wcd_type->intr_tbl = wcd9360_intr_table; - wcd_type->intr_tbl_size = ARRAY_SIZE(wcd9360_intr_table); - - wcd_type->intr_reg[WCD9XXX_INTR_STATUS_BASE] = - WCD9360_INTR_PIN1_STATUS0; - wcd_type->intr_reg[WCD9XXX_INTR_CLEAR_BASE] = - WCD9360_INTR_PIN1_CLEAR0; - wcd_type->intr_reg[WCD9XXX_INTR_MASK_BASE] = - WCD9360_INTR_PIN1_MASK0; - wcd_type->intr_reg[WCD9XXX_INTR_LEVEL_BASE] = - WCD9360_INTR_LEVEL0; - wcd_type->intr_reg[WCD9XXX_INTR_CLR_COMMIT] = - WCD9360_INTR_CLR_COMMIT; - - return rc; -} - -codec_bringdown_fn wcd9xxx_bringdown_fn(int type) -{ - codec_bringdown_fn cdc_bdown_fn; - - switch (type) { - case WCD9360: - cdc_bdown_fn = wcd9360_bring_down; - break; - case WCD934X: - cdc_bdown_fn = wcd934x_bring_down; - break; - case WCD9335: - cdc_bdown_fn = wcd9335_bring_down; - break; - default: - cdc_bdown_fn = NULL; - break; - } - - return cdc_bdown_fn; -} - -codec_bringup_fn wcd9xxx_bringup_fn(int type) -{ - codec_bringup_fn cdc_bup_fn; - - switch (type) { - case WCD9360: - cdc_bup_fn = wcd9360_bring_up; - break; - case WCD934X: - cdc_bup_fn = wcd934x_bring_up; - break; - case WCD9335: - cdc_bup_fn = wcd9335_bring_up; - break; - default: - cdc_bup_fn = NULL; - break; - } - - return cdc_bup_fn; -} - -codec_type_fn wcd9xxx_get_codec_info_fn(int type) -{ - codec_type_fn cdc_type_fn; - - switch (type) { - case WCD9360: - cdc_type_fn = wcd9360_get_cdc_info; - break; - case WCD934X: - cdc_type_fn = wcd934x_get_cdc_info; - break; - case WCD9335: - cdc_type_fn = wcd9335_get_cdc_info; - break; - default: - cdc_type_fn = NULL; - break; - } - - return cdc_type_fn; -} - diff --git a/techpack/audio/asoc/codecs/wcd9xxx-slimslave.c b/techpack/audio/asoc/codecs/wcd9xxx-slimslave.c deleted file mode 100644 index 1b3d85d0e1ca..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-slimslave.c +++ /dev/null @@ -1,608 +0,0 @@ -/* Copyright (c) 2012-2017, 2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include "wcd9xxx-slimslave.h" - -struct wcd9xxx_slim_sch { - u16 rx_port_ch_reg_base; - u16 port_tx_cfg_reg_base; - u16 port_rx_cfg_reg_base; -}; - -static struct wcd9xxx_slim_sch sh_ch; - -static int wcd9xxx_alloc_slim_sh_ch(struct wcd9xxx *wcd9xxx, - u8 wcd9xxx_pgd_la, u32 cnt, - struct wcd9xxx_ch *channels, u32 path); - -static int wcd9xxx_dealloc_slim_sh_ch(struct slim_device *slim, - u32 cnt, struct wcd9xxx_ch *channels); - -static int wcd9xxx_configure_ports(struct wcd9xxx *wcd9xxx) -{ - if (wcd9xxx->codec_type->slim_slave_type == - WCD9XXX_SLIM_SLAVE_ADDR_TYPE_0) { - sh_ch.rx_port_ch_reg_base = 0x180; - sh_ch.port_rx_cfg_reg_base = 0x040; - sh_ch.port_tx_cfg_reg_base = 0x040; - } else { - sh_ch.rx_port_ch_reg_base = - 0x180 - (TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS * 4); - sh_ch.port_rx_cfg_reg_base = - 0x040 - TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS; - sh_ch.port_tx_cfg_reg_base = 0x050; - } - - return 0; -} - -/** - * wcd9xxx_init_slimslave - * - * @wcd9xxx: pointer to wcd9xxx struct - * @wcd9xxx_pgd_la: pgd_la value - * @tx_num: tx number - * @rx_num: rx number - * @tx_slot: pointer to tx slot - * @rx_slot: pointer to rx slot - * - * Returns 0 on success, appropriate error code otherwise - */ -int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - int ret = 0; - int i; - - ret = wcd9xxx_configure_ports(wcd9xxx); - if (ret) { - pr_err("%s: Failed to configure register address offset\n", - __func__); - goto err; - } - - if (!rx_num || rx_num > wcd9xxx->num_rx_port) { - pr_err("%s: invalid rx num %d\n", __func__, rx_num); - return -EINVAL; - } - if (wcd9xxx->rx_chs) { - wcd9xxx->num_rx_port = rx_num; - for (i = 0; i < rx_num; i++) { - wcd9xxx->rx_chs[i].ch_num = rx_slot[i]; - INIT_LIST_HEAD(&wcd9xxx->rx_chs[i].list); - } - ret = wcd9xxx_alloc_slim_sh_ch(wcd9xxx, wcd9xxx_pgd_la, - wcd9xxx->num_rx_port, - wcd9xxx->rx_chs, - SLIM_SINK); - if (ret) { - pr_err("%s: Failed to alloc %d rx slimbus channels\n", - __func__, wcd9xxx->num_rx_port); - kfree(wcd9xxx->rx_chs); - wcd9xxx->rx_chs = NULL; - wcd9xxx->num_rx_port = 0; - } - } else { - pr_err("Not able to allocate memory for %d slimbus rx ports\n", - wcd9xxx->num_rx_port); - } - - if (!tx_num || tx_num > wcd9xxx->num_tx_port) { - pr_err("%s: invalid tx num %d\n", __func__, tx_num); - return -EINVAL; - } - if (wcd9xxx->tx_chs) { - wcd9xxx->num_tx_port = tx_num; - for (i = 0; i < tx_num; i++) { - wcd9xxx->tx_chs[i].ch_num = tx_slot[i]; - INIT_LIST_HEAD(&wcd9xxx->tx_chs[i].list); - } - ret = wcd9xxx_alloc_slim_sh_ch(wcd9xxx, wcd9xxx_pgd_la, - wcd9xxx->num_tx_port, - wcd9xxx->tx_chs, - SLIM_SRC); - if (ret) { - pr_err("%s: Failed to alloc %d tx slimbus channels\n", - __func__, wcd9xxx->num_tx_port); - kfree(wcd9xxx->tx_chs); - wcd9xxx->tx_chs = NULL; - wcd9xxx->num_tx_port = 0; - } - } else { - pr_err("Not able to allocate memory for %d slimbus tx ports\n", - wcd9xxx->num_tx_port); - } - return 0; -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_init_slimslave); - -int wcd9xxx_deinit_slimslave(struct wcd9xxx *wcd9xxx) -{ - if (wcd9xxx->num_rx_port) { - wcd9xxx_dealloc_slim_sh_ch(wcd9xxx->slim, - wcd9xxx->num_rx_port, - wcd9xxx->rx_chs); - wcd9xxx->num_rx_port = 0; - } - if (wcd9xxx->num_tx_port) { - wcd9xxx_dealloc_slim_sh_ch(wcd9xxx->slim, - wcd9xxx->num_tx_port, - wcd9xxx->tx_chs); - wcd9xxx->num_tx_port = 0; - } - return 0; -} - - -static int wcd9xxx_alloc_slim_sh_ch(struct wcd9xxx *wcd9xxx, - u8 wcd9xxx_pgd_la, u32 cnt, - struct wcd9xxx_ch *channels, u32 path) -{ - int ret = 0; - u32 ch_idx; - - /* The slimbus channel allocation seem take longer time - * so do the allocation up front to avoid delay in start of - * playback - */ - pr_debug("%s: pgd_la[%d]\n", __func__, wcd9xxx_pgd_la); - for (ch_idx = 0; ch_idx < cnt; ch_idx++) { - ret = slim_get_slaveport(wcd9xxx_pgd_la, - channels[ch_idx].port, - &channels[ch_idx].sph, path); - pr_debug("%s: pgd_la[%d] channels[%d].port[%d]\n" - "channels[%d].sph[%d] path[%d]\n", - __func__, wcd9xxx_pgd_la, ch_idx, - channels[ch_idx].port, - ch_idx, channels[ch_idx].sph, path); - if (ret < 0) { - pr_err("%s: slave port failure id[%d] ret[%d]\n", - __func__, channels[ch_idx].ch_num, ret); - goto err; - } - - ret = slim_query_ch(wcd9xxx->slim, - channels[ch_idx].ch_num, - &channels[ch_idx].ch_h); - if (ret < 0) { - pr_err("%s: slim_query_ch failed ch-num[%d] ret[%d]\n", - __func__, channels[ch_idx].ch_num, ret); - goto err; - } - } -err: - return ret; -} - -static int wcd9xxx_dealloc_slim_sh_ch(struct slim_device *slim, - u32 cnt, struct wcd9xxx_ch *channels) -{ - int idx = 0; - int ret = 0; - /* slim_dealloc_ch */ - for (idx = 0; idx < cnt; idx++) { - ret = slim_dealloc_ch(slim, channels[idx].ch_h); - if (ret < 0) { - pr_err("%s: slim_dealloc_ch fail ret[%d] ch_h[%d]\n", - __func__, ret, channels[idx].ch_h); - } - } - return ret; -} - -/* Enable slimbus slave device for RX path */ -int wcd9xxx_cfg_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph) -{ - u8 ch_cnt = 0; - u16 ch_h[SLIM_MAX_RX_PORTS] = {0}; - u8 payload = 0; - u16 codec_port = 0; - int ret; - struct slim_ch prop; - struct wcd9xxx_ch *rx; - int size = ARRAY_SIZE(ch_h); - - /* Configure slave interface device */ - - list_for_each_entry(rx, wcd9xxx_ch_list, list) { - payload |= 1 << rx->shift; - if (ch_cnt < size) { - ch_h[ch_cnt] = rx->ch_h; - ch_cnt++; - pr_debug("list ch->ch_h %d ch->sph %d\n", - rx->ch_h, rx->sph); - } else { - pr_err("%s: allocated channel number %u is out of max rangae %d\n", - __func__, ch_cnt, - size); - ret = EINVAL; - goto err; - } - } - pr_debug("%s: ch_cnt[%d] rate=%d WATER_MARK_VAL %d\n", - __func__, ch_cnt, rate, WATER_MARK_VAL); - /* slim_define_ch api */ - prop.prot = SLIM_AUTO_ISO; - if ((rate == 44100) || (rate == 88200) || (rate == 176400) || - (rate == 352800)) { - prop.baser = SLIM_RATE_11025HZ; - prop.ratem = (rate/11025); - } else { - prop.baser = SLIM_RATE_4000HZ; - prop.ratem = (rate/4000); - } - prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; - prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; - prop.sampleszbits = bit_width; - - pr_debug("Before slim_define_ch:\n" - "ch_cnt %d,ch_h[0] %d ch_h[1] %d, grph %d\n", - ch_cnt, ch_h[0], ch_h[1], *grph); - ret = slim_define_ch(wcd9xxx->slim, &prop, ch_h, ch_cnt, - true, grph); - if (ret < 0) { - pr_err("%s: slim_define_ch failed ret[%d]\n", - __func__, ret); - goto err; - } - - list_for_each_entry(rx, wcd9xxx_ch_list, list) { - codec_port = rx->port; - pr_debug("%s: codec_port %d rx 0x%p, payload %d\n" - "sh_ch.rx_port_ch_reg_base0 0x%x\n" - "sh_ch.port_rx_cfg_reg_base 0x%x\n", - __func__, codec_port, rx, payload, - sh_ch.rx_port_ch_reg_base, - sh_ch.port_rx_cfg_reg_base); - - /* look for the valid port range and chose the - * payload accordingly - */ - /* write to interface device */ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_RX_PORT_MULTI_CHANNEL_0( - sh_ch.rx_port_ch_reg_base, codec_port), - payload); - - if (ret < 0) { - pr_err("%s:Intf-dev fail reg[%d] payload[%d] ret[%d]\n", - __func__, - SB_PGD_RX_PORT_MULTI_CHANNEL_0( - sh_ch.rx_port_ch_reg_base, codec_port), - payload, ret); - goto err; - } - /* configure the slave port for water mark and enable*/ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_PORT_CFG_BYTE_ADDR( - sh_ch.port_rx_cfg_reg_base, codec_port), - WATER_MARK_VAL); - if (ret < 0) { - pr_err("%s:watermark set failure for port[%d] ret[%d]", - __func__, codec_port, ret); - } - - ret = slim_connect_sink(wcd9xxx->slim, &rx->sph, 1, rx->ch_h); - if (ret < 0) { - pr_err("%s: slim_connect_sink failed ret[%d]\n", - __func__, ret); - goto err_close_slim_sch; - } - } - /* slim_control_ch */ - ret = slim_control_ch(wcd9xxx->slim, *grph, SLIM_CH_ACTIVATE, - true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", - __func__, ret); - goto err_close_slim_sch; - } - return 0; - -err_close_slim_sch: - /* release all acquired handles */ - wcd9xxx_close_slim_sch_rx(wcd9xxx, wcd9xxx_ch_list, *grph); -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_cfg_slim_sch_rx); - -static void wcd9xxx_slim_tx_auto_recovery_cfg(struct wcd9xxx *wcd9xxx, - u16 codec_port) -{ - int ret; - - if (wcd9xxx->codec_type->id_major != TAVIL_MAJOR) - return; - - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_PORT_TX_OR_UR_CFG(codec_port), - 0x02); - if (ret < 0) - pr_err("%s:auto_recovery set failure for port[%d] ret[%d]", - __func__, codec_port, ret); - else - pr_debug("%s: auto recovery register 0x%x value: 0x%x\n", - __func__, SB_PGD_PORT_TX_OR_UR_CFG(codec_port), - wcd9xxx_interface_reg_read(wcd9xxx, - SB_PGD_PORT_TX_OR_UR_CFG(codec_port))); -} - -/* Enable slimbus slave device for RX path */ -int wcd9xxx_cfg_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph) -{ - u16 ch_cnt = 0; - u16 payload = 0; - u16 ch_h[SLIM_MAX_TX_PORTS] = {0}; - u16 codec_port; - int ret = 0; - struct wcd9xxx_ch *tx; - int size = ARRAY_SIZE(ch_h); - - struct slim_ch prop; - - list_for_each_entry(tx, wcd9xxx_ch_list, list) { - payload |= 1 << tx->shift; - if (ch_cnt < size) { - ch_h[ch_cnt] = tx->ch_h; - ch_cnt++; - } else { - pr_err("%s: allocated channel number %u is out of max rangae %d\n", - __func__, ch_cnt, - size); - ret = EINVAL; - goto err; - } - } - - /* slim_define_ch api */ - prop.prot = SLIM_AUTO_ISO; - prop.baser = SLIM_RATE_4000HZ; - prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; - prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; - prop.ratem = (rate/4000); - prop.sampleszbits = bit_width; - ret = slim_define_ch(wcd9xxx->slim, &prop, ch_h, ch_cnt, - true, grph); - if (ret < 0) { - pr_err("%s: slim_define_ch failed ret[%d]\n", - __func__, ret); - goto err; - } - - pr_debug("%s: ch_cnt[%d] rate[%d] bitwidth[%u]\n", __func__, ch_cnt, - rate, bit_width); - list_for_each_entry(tx, wcd9xxx_ch_list, list) { - codec_port = tx->port; - pr_debug("%s: codec_port %d tx 0x%p, payload 0x%x\n", - __func__, codec_port, tx, payload); - - wcd9xxx_slim_tx_auto_recovery_cfg(wcd9xxx, codec_port); - /* write to interface device */ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_TX_PORT_MULTI_CHANNEL_0(codec_port), - payload & 0x00FF); - if (ret < 0) { - pr_err("%s:Intf-dev fail reg[%d] payload[%d] ret[%d]\n", - __func__, - SB_PGD_TX_PORT_MULTI_CHANNEL_0(codec_port), - payload, ret); - goto err; - } - /* ports 8,9 */ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_TX_PORT_MULTI_CHANNEL_1(codec_port), - (payload & 0xFF00)>>8); - if (ret < 0) { - pr_err("%s:Intf-dev fail reg[%d] payload[%d] ret[%d]\n", - __func__, - SB_PGD_TX_PORT_MULTI_CHANNEL_1(codec_port), - payload, ret); - goto err; - } - /* configure the slave port for water mark and enable*/ - ret = wcd9xxx_interface_reg_write(wcd9xxx, - SB_PGD_PORT_CFG_BYTE_ADDR( - sh_ch.port_tx_cfg_reg_base, codec_port), - WATER_MARK_VAL); - if (ret < 0) { - pr_err("%s:watermark set failure for port[%d] ret[%d]", - __func__, codec_port, ret); - } - - ret = slim_connect_src(wcd9xxx->slim, tx->sph, tx->ch_h); - - if (ret < 0) { - pr_err("%s: slim_connect_src failed ret[%d]\n", - __func__, ret); - goto err; - } - } - /* slim_control_ch */ - ret = slim_control_ch(wcd9xxx->slim, *grph, SLIM_CH_ACTIVATE, - true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", - __func__, ret); - goto err; - } - return 0; -err: - /* release all acquired handles */ - wcd9xxx_close_slim_sch_tx(wcd9xxx, wcd9xxx_ch_list, *grph); - return ret; -} -EXPORT_SYMBOL(wcd9xxx_cfg_slim_sch_tx); - -int wcd9xxx_close_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph) -{ - u32 sph[SLIM_MAX_RX_PORTS] = {0}; - int ch_cnt = 0; - int ret = 0; - struct wcd9xxx_ch *rx; - - list_for_each_entry(rx, wcd9xxx_ch_list, list) - sph[ch_cnt++] = rx->sph; - - pr_debug("%s ch_cht %d, sph[0] %d sph[1] %d\n", __func__, ch_cnt, - sph[0], sph[1]); - - /* slim_control_ch (REMOVE) */ - pr_debug("%s before slim_control_ch grph %d\n", __func__, grph); - ret = slim_control_ch(wcd9xxx->slim, grph, SLIM_CH_REMOVE, true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", __func__, ret); - goto err; - } -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_close_slim_sch_rx); - -int wcd9xxx_close_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - u16 grph) -{ - u32 sph[SLIM_MAX_TX_PORTS] = {0}; - int ret = 0; - int ch_cnt = 0; - struct wcd9xxx_ch *tx; - - pr_debug("%s\n", __func__); - list_for_each_entry(tx, wcd9xxx_ch_list, list) - sph[ch_cnt++] = tx->sph; - - pr_debug("%s ch_cht %d, sph[0] %d sph[1] %d\n", - __func__, ch_cnt, sph[0], sph[1]); - /* slim_control_ch (REMOVE) */ - ret = slim_control_ch(wcd9xxx->slim, grph, SLIM_CH_REMOVE, true); - if (ret < 0) { - pr_err("%s: slim_control_ch failed ret[%d]\n", - __func__, ret); - goto err; - } -err: - return ret; -} -EXPORT_SYMBOL(wcd9xxx_close_slim_sch_tx); - -int wcd9xxx_get_slave_port(unsigned int ch_num) -{ - int ret = 0; - - ret = (ch_num - BASE_CH_NUM); - pr_debug("%s: ch_num[%d] slave port[%d]\n", __func__, ch_num, ret); - if (ret < 0) { - pr_err("%s: Error:- Invalid slave port found = %d\n", - __func__, ret); - return -EINVAL; - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_get_slave_port); - -int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph) -{ - u32 sph[SLIM_MAX_TX_PORTS + SLIM_MAX_RX_PORTS] = {0}; - int ch_cnt = 0; - int ret = 0; - struct wcd9xxx_ch *slim_ch; - - list_for_each_entry(slim_ch, wcd9xxx_ch_list, list) - sph[ch_cnt++] = slim_ch->sph; - - /* slim_disconnect_port */ - ret = slim_disconnect_ports(wcd9xxx->slim, sph, ch_cnt); - if (ret < 0) { - pr_err("%s: slim_disconnect_ports failed ret[%d]\n", - __func__, ret); - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_disconnect_port); - -/* This function is called with mutex acquired */ -int wcd9xxx_rx_vport_validation(u32 port_id, - struct list_head *codec_dai_list) -{ - struct wcd9xxx_ch *ch; - int ret = 0; - - pr_debug("%s: port_id %u\n", __func__, port_id); - - list_for_each_entry(ch, - codec_dai_list, list) { - pr_debug("%s: ch->port %u\n", __func__, ch->port); - if (ch->port == port_id) { - ret = -EINVAL; - break; - } - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_rx_vport_validation); - - -/* This function is called with mutex acquired */ -int wcd9xxx_tx_vport_validation(u32 table, u32 port_id, - struct wcd9xxx_codec_dai_data *codec_dai, - u32 num_codec_dais) -{ - struct wcd9xxx_ch *ch; - int ret = 0; - u32 index; - unsigned long vtable = table; - u32 size = sizeof(table) * BITS_PER_BYTE; - - pr_debug("%s: vtable 0x%lx port_id %u size %d\n", __func__, - vtable, port_id, size); - for_each_set_bit(index, &vtable, size) { - if (index < num_codec_dais) { - list_for_each_entry(ch, - &codec_dai[index].wcd9xxx_ch_list, - list) { - pr_debug("%s: index %u ch->port %u vtable 0x%lx\n", - __func__, index, ch->port, - vtable); - if (ch->port == port_id) { - pr_err("%s: TX%u is used by AIF%u_CAP Mixer\n", - __func__, port_id + 1, - (index + 1)/2); - ret = -EINVAL; - break; - } - } - } else { - pr_err("%s: Invalid index %d of codec dai", - __func__, index); - ret = -EINVAL; - } - if (ret) - break; - } - return ret; -} -EXPORT_SYMBOL(wcd9xxx_tx_vport_validation); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-slimslave.h b/techpack/audio/asoc/codecs/wcd9xxx-slimslave.h deleted file mode 100644 index c407b76c598c..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-slimslave.h +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (c) 2012-2015, 2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD9XXX_SLIMSLAVE_H_ -#define __WCD9XXX_SLIMSLAVE_H_ - -#include -#include "core.h" - - -/* - * client is expected to give port ids in the range of - * 1-10 for pre Taiko Tx ports and 1-16 for Taiko - * 1-7 for pre Taiko Rx ports and 1-16 for Tako, - * we need to add offset for getting the absolute slave - * port id before configuring the HW - */ -#define TABLA_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS 10 -#define TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS 16 - -#define SLIM_MAX_TX_PORTS TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS - -#define TABLA_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS \ - TABLA_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS -#define TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS \ - TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS - -#define TABLA_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS 7 -#define TAIKO_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS 13 - -#define SLIM_MAX_RX_PORTS TAIKO_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS - -#define SLIM_MAX_REG_ADDR (0x180 + 4 * (SLIM_MAX_RX_PORTS)) - -#define TABLA_SB_PGD_RX_PORT_MULTI_CHANNEL_0_START_PORT_ID \ - TABLA_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS -#define TAIKO_SB_PGD_RX_PORT_MULTI_CHANNEL_0_START_PORT_ID \ - TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS - -#define TABLA_SB_PGD_RX_PORT_MULTI_CHANNEL_0_END_PORT_ID 16 -#define TAIKO_SB_PGD_RX_PORT_MULTI_CHANNEL_0_END_PORT_ID 31 - -#define TABLA_SB_PGD_TX_PORT_MULTI_CHANNEL_1_END_PORT_ID 9 -#define TAIKO_SB_PGD_TX_PORT_MULTI_CHANNEL_1_END_PORT_ID 15 - -/* below details are taken from SLIMBUS slave SWI */ -#define SB_PGD_PORT_BASE 0x000 - -#define SB_PGD_PORT_CFG_BYTE_ADDR(offset, port_num) \ - (SB_PGD_PORT_BASE + offset + (1 * port_num)) - -#define SB_PGD_TX_PORT_MULTI_CHANNEL_0(port_num) \ - (SB_PGD_PORT_BASE + 0x100 + 4*port_num) -#define SB_PGD_TX_PORT_MULTI_CHANNEL_0_START_PORT_ID 0 -#define SB_PGD_TX_PORT_MULTI_CHANNEL_0_END_PORT_ID 7 - -#define SB_PGD_TX_PORT_MULTI_CHANNEL_1(port_num) \ - (SB_PGD_PORT_BASE + 0x101 + 4*port_num) -#define SB_PGD_TX_PORT_MULTI_CHANNEL_1_START_PORT_ID 8 - -#define SB_PGD_RX_PORT_MULTI_CHANNEL_0(offset, port_num) \ - (SB_PGD_PORT_BASE + offset + (4 * port_num)) - -#define SB_PGD_PORT_TX_OR_UR_CFG(port) (0x1F0 + port) - -/* slave port water mark level - * (0: 6bytes, 1: 9bytes, 2: 12 bytes, 3: 15 bytes) - */ -#define SLAVE_PORT_WATER_MARK_6BYTES 0 -#define SLAVE_PORT_WATER_MARK_9BYTES 1 -#define SLAVE_PORT_WATER_MARK_12BYTES 2 -#define SLAVE_PORT_WATER_MARK_15BYTES 3 -#define SLAVE_PORT_WATER_MARK_SHIFT 1 -#define SLAVE_PORT_ENABLE 1 -#define SLAVE_PORT_DISABLE 0 -#define WATER_MARK_VAL \ - ((SLAVE_PORT_WATER_MARK_12BYTES << SLAVE_PORT_WATER_MARK_SHIFT) | \ - (SLAVE_PORT_ENABLE)) -#define BASE_CH_NUM 128 - - -int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, - u8 wcd9xxx_pgd_la, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot); - -int wcd9xxx_deinit_slimslave(struct wcd9xxx *wcd9xxx); - -int wcd9xxx_cfg_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph); -int wcd9xxx_cfg_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, - unsigned int rate, unsigned int bit_width, - u16 *grph); -int wcd9xxx_close_slim_sch_rx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph); -int wcd9xxx_close_slim_sch_tx(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph); -int wcd9xxx_get_channel(struct wcd9xxx *wcd9xxx, - unsigned int *rx_ch, - unsigned int *tx_ch); -int wcd9xxx_get_slave_port(unsigned int ch_num); -int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, - struct list_head *wcd9xxx_ch_list, u16 grph); -int wcd9xxx_rx_vport_validation(u32 port_id, - struct list_head *codec_dai_list); -int wcd9xxx_tx_vport_validation(u32 vtable, u32 port_id, - struct wcd9xxx_codec_dai_data *codec_dai, - u32 num_codec_dais); -#endif /* __WCD9XXX_SLIMSLAVE_H_ */ diff --git a/techpack/audio/asoc/codecs/wcd9xxx-soc-init.c b/techpack/audio/asoc/codecs/wcd9xxx-soc-init.c deleted file mode 100644 index fa8abb7de5e4..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-soc-init.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "audio-ext-clk-up.h" - -static int __init wcd9xxx_soc_init(void) -{ - int ret = 0; - - ret = wcd_dsp_mgr_init(); - if (!ret) { - ret = audio_ref_clk_platform_init(); - if (ret) { - pr_err("%s: init extclk fail: %d\n", __func__, ret); - wcd_dsp_mgr_exit(); - } - } else { - pr_err("%s: init dsp mgr fail: %d\n", __func__, ret); - } - - return ret; -} -module_init(wcd9xxx_soc_init); - -static void __exit wcd9xxx_soc_exit(void) -{ - audio_ref_clk_platform_exit(); - wcd_dsp_mgr_exit(); -} -module_exit(wcd9xxx_soc_exit); - -MODULE_DESCRIPTION("WCD9XXX CODEC soc init driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-utils.c b/techpack/audio/asoc/codecs/wcd9xxx-utils.c deleted file mode 100644 index 7dc18f68b1e9..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-utils.c +++ /dev/null @@ -1,1239 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "core.h" -#include "msm-cdc-supply.h" -#include "msm-cdc-pinctrl.h" -#include "pdata.h" -#include "wcd9xxx-irq.h" -#include "wcd9xxx-utils.h" - -#define REG_BYTES 2 -#define VAL_BYTES 1 -/* - * Page Register Address that APP Proc uses to - * access WCD9335 Codec registers is identified - * as 0x00 - */ -#define PAGE_REG_ADDR 0x00 - -static enum wcd9xxx_intf_status wcd9xxx_intf = -1; - -static struct mfd_cell pahu_devs[] = { - { - .name = "qcom-wcd-pinctrl", - .of_compatible = "qcom,wcd-pinctrl", - }, - { - .name = "pahu_codec", - }, -}; - -static struct mfd_cell tavil_devs[] = { - { - .name = "qcom-wcd-pinctrl", - .of_compatible = "qcom,wcd-pinctrl", - }, - { - .name = "tavil_codec", - }, -}; - -static struct mfd_cell tasha_devs[] = { - { - .name = "tasha_codec", - }, -}; - -static struct mfd_cell tomtom_devs[] = { - { - .name = "tomtom_codec", - }, -}; - -static int wcd9xxx_read_of_property_u32(struct device *dev, const char *name, - u32 *val) -{ - int rc = 0; - - rc = of_property_read_u32(dev->of_node, name, val); - if (rc) - dev_err(dev, "%s: Looking up %s property in node %s failed", - __func__, name, dev->of_node->full_name); - - return rc; -} - -static void wcd9xxx_dt_parse_micbias_info(struct device *dev, - struct wcd9xxx_micbias_setting *mb) -{ - u32 prop_val; - int rc; - - if (of_find_property(dev->of_node, "qcom,cdc-micbias-ldoh-v", NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-ldoh-v", - &prop_val); - if (!rc) - mb->ldoh_v = (u8)prop_val; - } - - /* MB1 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias-cfilt1-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-cfilt1-mv", - &prop_val); - if (!rc) - mb->cfilt1_mv = prop_val; - - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias1-cfilt-sel", - &prop_val); - if (!rc) - mb->bias1_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias1-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias1-mv", - &prop_val); - if (!rc) - mb->micb1_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias1 DT property not found\n", - __func__); - } - - /* MB2 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias-cfilt2-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-cfilt2-mv", - &prop_val); - if (!rc) - mb->cfilt2_mv = prop_val; - - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias2-cfilt-sel", - &prop_val); - if (!rc) - mb->bias2_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias2-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias2-mv", - &prop_val); - if (!rc) - mb->micb2_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias2 DT property not found\n", - __func__); - } - - /* MB3 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias-cfilt3-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias-cfilt3-mv", - &prop_val); - if (!rc) - mb->cfilt3_mv = prop_val; - - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias3-cfilt-sel", - &prop_val); - if (!rc) - mb->bias3_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias3-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias3-mv", - &prop_val); - if (!rc) - mb->micb3_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias3 DT property not found\n", - __func__); - } - - /* MB4 */ - if (of_find_property(dev->of_node, "qcom,cdc-micbias4-cfilt-sel", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias4-cfilt-sel", - &prop_val); - if (!rc) - mb->bias4_cfilt_sel = (u8)prop_val; - - } else if (of_find_property(dev->of_node, "qcom,cdc-micbias4-mv", - NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-micbias4-mv", - &prop_val); - if (!rc) - mb->micb4_mv = prop_val; - } else { - dev_info(dev, "%s: Micbias4 DT property not found\n", - __func__); - } - - mb->bias1_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias1-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - mb->bias2_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias2-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - mb->bias3_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias3-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - mb->bias4_cap_mode = - (of_property_read_bool(dev->of_node, "qcom,cdc-micbias4-ext-cap") ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - - mb->bias2_is_headset_only = - of_property_read_bool(dev->of_node, - "qcom,cdc-micbias2-headset-only"); - - /* Print micbias info */ - dev_dbg(dev, "%s: ldoh_v %u cfilt1_mv %u cfilt2_mv %u cfilt3_mv %u", - __func__, (u32)mb->ldoh_v, (u32)mb->cfilt1_mv, - (u32)mb->cfilt2_mv, (u32)mb->cfilt3_mv); - - dev_dbg(dev, "%s: micb1_mv %u micb2_mv %u micb3_mv %u micb4_mv %u", - __func__, mb->micb1_mv, mb->micb2_mv, - mb->micb3_mv, mb->micb4_mv); - - dev_dbg(dev, "%s: bias1_cfilt_sel %u bias2_cfilt_sel %u\n", - __func__, (u32)mb->bias1_cfilt_sel, (u32)mb->bias2_cfilt_sel); - - dev_dbg(dev, "%s: bias3_cfilt_sel %u bias4_cfilt_sel %u\n", - __func__, (u32)mb->bias3_cfilt_sel, (u32)mb->bias4_cfilt_sel); - - dev_dbg(dev, "%s: bias1_ext_cap %d bias2_ext_cap %d\n", - __func__, mb->bias1_cap_mode, mb->bias2_cap_mode); - - dev_dbg(dev, "%s: bias3_ext_cap %d bias4_ext_cap %d\n", - __func__, mb->bias3_cap_mode, mb->bias4_cap_mode); - - dev_dbg(dev, "%s: bias2_is_headset_only %d\n", - __func__, mb->bias2_is_headset_only); -} - -/* - * wcd9xxx_validate_dmic_sample_rate: - * Given the dmic_sample_rate and mclk rate, validate the - * dmic_sample_rate. If dmic rate is found to be invalid, - * assign the dmic rate as undefined, so individual codec - * drivers can use their own defaults - * @dev: the device for which the dmic is to be configured - * @dmic_sample_rate: The input dmic_sample_rate - * @mclk_rate: The input codec mclk rate - * @dmic_rate_type: String to indicate the type of dmic sample - * rate, used for debug/error logging. - */ -static u32 wcd9xxx_validate_dmic_sample_rate(struct device *dev, - u32 dmic_sample_rate, u32 mclk_rate, - const char *dmic_rate_type) -{ - u32 div_factor; - - if (dmic_sample_rate == WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) - goto undefined_rate; - - div_factor = mclk_rate / dmic_sample_rate; - - switch (div_factor) { - case 2: - case 3: - case 4: - case 8: - case 16: - /* Valid dmic DIV factors */ - dev_dbg(dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - break; - case 6: - /* - * DIV 6 is valid for both 9.6MHz and 12.288MHz - * MCLK on Tavil. Older codecs support DIV6 only - * for 12.288MHz MCLK. - */ - if ((mclk_rate == WCD9XXX_MCLK_CLK_9P6HZ) && - (of_device_is_compatible(dev->of_node, - "qcom,tavil-slim-pgd"))) - dev_dbg(dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); - else if (mclk_rate != WCD9XXX_MCLK_CLK_12P288MHZ) - goto undefined_rate; - break; - default: - /* Any other DIV factor is invalid */ - goto undefined_rate; - } - - return dmic_sample_rate; - -undefined_rate: - dev_dbg(dev, "%s: Invalid %s = %d, for mclk %d\n", - __func__, dmic_rate_type, dmic_sample_rate, mclk_rate); - dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - - return dmic_sample_rate; -} - -/* - * wcd9xxx_populate_dt_data: - * Parse device tree properties for the given codec device - * - * @dev: pointer to codec device - * - * Returns pointer to the platform data resulting from parsing - * device tree. - */ -struct wcd9xxx_pdata *wcd9xxx_populate_dt_data(struct device *dev) -{ - struct wcd9xxx_pdata *pdata; - u32 dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - u32 mad_dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - u32 ecpp_dmic_sample_rate = WCD9XXX_DMIC_SAMPLE_RATE_UNDEFINED; - u32 dmic_clk_drive = WCD9XXX_DMIC_CLK_DRIVE_UNDEFINED; - u32 prop_val; - int rc = 0; - - if (!dev || !dev->of_node) - return NULL; - - pdata = devm_kzalloc(dev, sizeof(struct wcd9xxx_pdata), - GFP_KERNEL); - if (!pdata) - return NULL; - - /* Parse power supplies */ - msm_cdc_get_power_supplies(dev, &pdata->regulator, - &pdata->num_supplies); - if (!pdata->regulator || (pdata->num_supplies <= 0)) { - dev_err(dev, "%s: no power supplies defined for codec\n", - __func__); - goto err_power_sup; - } - - /* Parse micbias info */ - wcd9xxx_dt_parse_micbias_info(dev, &pdata->micbias); - - pdata->wcd_rst_np = of_parse_phandle(dev->of_node, - "qcom,wcd-rst-gpio-node", 0); - if (!pdata->wcd_rst_np) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,wcd-rst-gpio-node", - dev->of_node->full_name); - goto err_parse_dt_prop; - } - - pdata->has_buck_vsel_gpio = of_property_read_bool(dev->of_node, - "qcom,has-buck-vsel-gpio"); - if (pdata->has_buck_vsel_gpio) { - pdata->buck_vsel_ctl_np = of_parse_phandle(dev->of_node, - "qcom,buck-vsel-gpio-node", 0); - if (!pdata->buck_vsel_ctl_np) { - dev_err(dev, "%s No entry for %s property in node %s\n", - __func__, "qcom,buck-vsel-gpio-node", - dev->of_node->full_name); - goto err_parse_dt_prop; - } - } - - pdata->has_micb_supply_en_gpio = of_property_read_bool(dev->of_node, - "qcom,has-micbias-supply-en-gpio"); - if (pdata->has_micb_supply_en_gpio) { - pdata->micb_en_ctl = of_parse_phandle(dev->of_node, - "qcom,micbias-supply-en-gpio-node", 0); - if (!pdata->micb_en_ctl) { - dev_err(dev, "%s No entry for %s property in node %s\n", - __func__, "qcom,micbias-supply-en-gpio-node", - dev->of_node->full_name); - goto err_parse_dt_prop; - } - } - - if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-mclk-clk-rate", - &prop_val))) - pdata->mclk_rate = prop_val; - - if (pdata->mclk_rate != WCD9XXX_MCLK_CLK_9P6HZ && - pdata->mclk_rate != WCD9XXX_MCLK_CLK_12P288MHZ) { - dev_err(dev, "%s: Invalid mclk_rate = %u\n", __func__, - pdata->mclk_rate); - goto err_parse_dt_prop; - } - - if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-dmic-sample-rate", - &prop_val))) - dmic_sample_rate = prop_val; - - pdata->dmic_sample_rate = wcd9xxx_validate_dmic_sample_rate(dev, - dmic_sample_rate, - pdata->mclk_rate, - "audio_dmic_rate"); - if (!(wcd9xxx_read_of_property_u32(dev, "qcom,cdc-mad-dmic-rate", - &prop_val))) - mad_dmic_sample_rate = prop_val; - - pdata->mad_dmic_sample_rate = wcd9xxx_validate_dmic_sample_rate(dev, - mad_dmic_sample_rate, - pdata->mclk_rate, - "mad_dmic_rate"); - - if (of_find_property(dev->of_node, "qcom,cdc-ecpp-dmic-rate", NULL)) { - rc = wcd9xxx_read_of_property_u32(dev, - "qcom,cdc-ecpp-dmic-rate", - &prop_val); - if (!rc) - ecpp_dmic_sample_rate = prop_val; - } - - pdata->ecpp_dmic_sample_rate = wcd9xxx_validate_dmic_sample_rate(dev, - ecpp_dmic_sample_rate, - pdata->mclk_rate, - "ecpp_dmic_rate"); - - if (!(of_property_read_u32(dev->of_node, - "qcom,cdc-dmic-clk-drv-strength", - &prop_val))) { - dmic_clk_drive = prop_val; - - if (dmic_clk_drive != 2 && dmic_clk_drive != 4 && - dmic_clk_drive != 8 && dmic_clk_drive != 16) - dev_err(dev, "Invalid cdc-dmic-clk-drv-strength %d\n", - dmic_clk_drive); - } - - pdata->dmic_clk_drv = dmic_clk_drive; - - return pdata; - -err_parse_dt_prop: - devm_kfree(dev, pdata->regulator); - pdata->regulator = NULL; - pdata->num_supplies = 0; -err_power_sup: - devm_kfree(dev, pdata); - return NULL; -} -EXPORT_SYMBOL(wcd9xxx_populate_dt_data); - -static bool is_wcd9xxx_reg_power_down(struct wcd9xxx *wcd9xxx, u16 rreg) -{ - bool ret = false; - int i; - struct wcd9xxx_power_region *wcd9xxx_pwr; - - if (!wcd9xxx) - return ret; - - for (i = 0; i < WCD9XXX_MAX_PWR_REGIONS; i++) { - wcd9xxx_pwr = wcd9xxx->wcd9xxx_pwr[i]; - if (!wcd9xxx_pwr) - continue; - if (((wcd9xxx_pwr->pwr_collapse_reg_min == 0) && - (wcd9xxx_pwr->pwr_collapse_reg_max == 0)) || - (wcd9xxx_pwr->power_state == - WCD_REGION_POWER_COLLAPSE_REMOVE)) - ret = false; - else if (((wcd9xxx_pwr->power_state == - WCD_REGION_POWER_DOWN) || - (wcd9xxx_pwr->power_state == - WCD_REGION_POWER_COLLAPSE_BEGIN)) && - (rreg >= wcd9xxx_pwr->pwr_collapse_reg_min) && - (rreg <= wcd9xxx_pwr->pwr_collapse_reg_max)) - ret = true; - } - return ret; -} - -/* - * wcd9xxx_page_write: - * Retrieve page number from register and - * write that page number to the page address. - * Called under io_lock acquisition. - * - * @wcd9xxx: pointer to wcd9xxx - * @reg: Register address from which page number is retrieved - * - * Returns 0 for success and negative error code for failure. - */ -int wcd9xxx_page_write(struct wcd9xxx *wcd9xxx, unsigned short *reg) -{ - int ret = 0; - unsigned short c_reg, reg_addr; - u8 pg_num, prev_pg_num; - - if (wcd9xxx->type != WCD9335 && wcd9xxx->type != WCD934X && - wcd9xxx->type != WCD9360) - return ret; - - c_reg = *reg; - pg_num = c_reg >> 8; - reg_addr = c_reg & 0xff; - if (wcd9xxx->prev_pg_valid) { - prev_pg_num = wcd9xxx->prev_pg; - if (prev_pg_num != pg_num) { - ret = wcd9xxx->write_dev( - wcd9xxx, PAGE_REG_ADDR, 1, - (void *) &pg_num, false); - if (ret < 0) - pr_err("page write error, pg_num: 0x%x\n", - pg_num); - else { - wcd9xxx->prev_pg = pg_num; - dev_dbg(wcd9xxx->dev, "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - } else { - ret = wcd9xxx->write_dev( - wcd9xxx, PAGE_REG_ADDR, 1, (void *) &pg_num, - false); - if (ret < 0) - pr_err("page write error, pg_num: 0x%x\n", pg_num); - else { - wcd9xxx->prev_pg = pg_num; - wcd9xxx->prev_pg_valid = true; - dev_dbg(wcd9xxx->dev, "%s: Page 0x%x Write to 0x00\n", - __func__, pg_num); - } - } - *reg = reg_addr; - return ret; -} -EXPORT_SYMBOL(wcd9xxx_page_write); - -static int regmap_bus_read(void *context, const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - unsigned short c_reg, rreg; - int ret, i; - - if (!wcd9xxx) { - dev_err(dev, "%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - - mutex_lock(&wcd9xxx->io_lock); - c_reg = *(u16 *)reg; - rreg = c_reg; - - if (is_wcd9xxx_reg_power_down(wcd9xxx, rreg)) { - ret = 0; - for (i = 0; i < val_size; i++) - ((u8 *)val)[i] = 0; - goto err; - } - ret = wcd9xxx_page_write(wcd9xxx, &c_reg); - if (ret) - goto err; - ret = wcd9xxx->read_dev(wcd9xxx, c_reg, val_size, val, false); - if (ret < 0) - dev_err(dev, "%s: Codec read failed (%d), reg: 0x%x, size:%zd\n", - __func__, ret, rreg, val_size); - else { - for (i = 0; i < val_size; i++) - dev_dbg(dev, "%s: Read 0x%02x from 0x%x\n", - __func__, ((u8 *)val)[i], rreg + i); - } -err: - mutex_unlock(&wcd9xxx->io_lock); - - return ret; -} - -static int regmap_bus_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_size) -{ - struct device *dev = context; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - unsigned short c_reg, rreg; - int ret, i; - - if (!wcd9xxx) { - dev_err(dev, "%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - if (!reg || !val) { - dev_err(dev, "%s: reg or val is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != REG_BYTES) { - dev_err(dev, "%s: register size %zd bytes, not supported\n", - __func__, reg_size); - return -EINVAL; - } - mutex_lock(&wcd9xxx->io_lock); - c_reg = *(u16 *)reg; - rreg = c_reg; - - if (is_wcd9xxx_reg_power_down(wcd9xxx, rreg)) { - ret = 0; - goto err; - } - ret = wcd9xxx_page_write(wcd9xxx, &c_reg); - if (ret) - goto err; - - for (i = 0; i < val_size; i++) - dev_dbg(dev, "Write %02x to 0x%x\n", ((u8 *)val)[i], - rreg + i); - - ret = wcd9xxx->write_dev(wcd9xxx, c_reg, val_size, (void *) val, - false); - if (ret < 0) - dev_err(dev, "%s: Codec write failed (%d), reg:0x%x, size:%zd\n", - __func__, ret, rreg, val_size); - -err: - mutex_unlock(&wcd9xxx->io_lock); - return ret; -} - -static int regmap_bus_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(dev); - - if (!wcd9xxx) - return -EINVAL; - - WARN_ON(count < REG_BYTES); - - if (count > (REG_BYTES + VAL_BYTES)) { - if (wcd9xxx->multi_reg_write) - return wcd9xxx->multi_reg_write(wcd9xxx, - data, count); - } else - return regmap_bus_gather_write(context, data, REG_BYTES, - data + REG_BYTES, - count - REG_BYTES); - - dev_err(dev, "%s: bus multi reg write failure\n", __func__); - - return -EINVAL; -} - -static struct regmap_bus regmap_bus_config = { - .write = regmap_bus_write, - .gather_write = regmap_bus_gather_write, - .read = regmap_bus_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -/* - * wcd9xxx_regmap_init: - * Initialize wcd9xxx register map - * - * @dev: pointer to wcd device - * @config: pointer to register map config - * - * Returns pointer to regmap structure for success - * or NULL in case of failure. - */ -struct regmap *wcd9xxx_regmap_init(struct device *dev, - const struct regmap_config *config) -{ - return devm_regmap_init(dev, ®map_bus_config, dev, config); -} -EXPORT_SYMBOL(wcd9xxx_regmap_init); - -/* - * wcd9xxx_reset: - * Reset wcd9xxx codec - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_reset(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - int value; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->wcd_rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - - value = msm_cdc_pinctrl_get_state(wcd9xxx->wcd_rst_np); - if (value > 0) { - wcd9xxx->avoid_cdc_rstlow = 1; - return 0; - } - - rc = msm_cdc_pinctrl_select_sleep_state(wcd9xxx->wcd_rst_np); - if (rc) { - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - return rc; - } - - /* 20ms sleep required after pulling the reset gpio to LOW */ - msleep(20); - - rc = msm_cdc_pinctrl_select_active_state(wcd9xxx->wcd_rst_np); - if (rc) { - dev_err(dev, "%s: wcd active state request fail!\n", - __func__); - return rc; - } - msleep(20); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_reset); - -/* - * wcd9xxx_reset_low: - * Pull the wcd9xxx codec reset_n to low - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_reset_low(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - if (!wcd9xxx->wcd_rst_np) { - dev_err(dev, "%s: reset gpio device node not specified\n", - __func__); - return -EINVAL; - } - if (wcd9xxx->avoid_cdc_rstlow) { - wcd9xxx->avoid_cdc_rstlow = 0; - dev_dbg(dev, "%s: avoid pull down of reset GPIO\n", __func__); - return 0; - } - - rc = msm_cdc_pinctrl_select_sleep_state(wcd9xxx->wcd_rst_np); - if (rc) - dev_err(dev, "%s: wcd sleep state request fail!\n", - __func__); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_reset_low); - -/* - * wcd9xxx_bringup: - * Toggle reset analog and digital cores of wcd9xxx codec - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_bringup(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - codec_bringup_fn cdc_bup_fn; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - cdc_bup_fn = wcd9xxx_bringup_fn(wcd9xxx->type); - if (!cdc_bup_fn) { - dev_err(dev, "%s: Codec bringup fn NULL!\n", - __func__); - return -EINVAL; - } - rc = cdc_bup_fn(wcd9xxx); - if (rc) - dev_err(dev, "%s: Codec bringup error, rc: %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_bringup); - -/* - * wcd9xxx_bringup: - * Set analog and digital cores of wcd9xxx codec in reset state - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_bringdown(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - codec_bringdown_fn cdc_bdown_fn; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - cdc_bdown_fn = wcd9xxx_bringdown_fn(wcd9xxx->type); - if (!cdc_bdown_fn) { - dev_err(dev, "%s: Codec bring down fn NULL!\n", - __func__); - return -EINVAL; - } - rc = cdc_bdown_fn(wcd9xxx); - if (rc) - dev_err(dev, "%s: Codec bring down error, rc: %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_bringdown); - -/* - * wcd9xxx_get_codec_info: - * Fill codec specific information like interrupts, version - * - * @dev: pointer to wcd device - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_get_codec_info(struct device *dev) -{ - struct wcd9xxx *wcd9xxx; - int rc; - codec_type_fn cdc_type_fn; - struct wcd9xxx_codec_type *cinfo; - - if (!dev) - return -ENODEV; - - wcd9xxx = dev_get_drvdata(dev); - if (!wcd9xxx) - return -EINVAL; - - cdc_type_fn = wcd9xxx_get_codec_info_fn(wcd9xxx->type); - if (!cdc_type_fn) { - dev_err(dev, "%s: Codec fill type fn NULL!\n", - __func__); - return -EINVAL; - } - - cinfo = wcd9xxx->codec_type; - if (!cinfo) - return -EINVAL; - - rc = cdc_type_fn(wcd9xxx, cinfo); - if (rc) { - dev_err(dev, "%s: Codec type fill failed, rc:%d\n", - __func__, rc); - return rc; - - } - - switch (wcd9xxx->type) { - case WCD9360: - cinfo->dev = pahu_devs; - cinfo->size = ARRAY_SIZE(pahu_devs); - break; - case WCD934X: - cinfo->dev = tavil_devs; - cinfo->size = ARRAY_SIZE(tavil_devs); - break; - case WCD9335: - cinfo->dev = tasha_devs; - cinfo->size = ARRAY_SIZE(tasha_devs); - break; - case WCD9330: - cinfo->dev = tomtom_devs; - cinfo->size = ARRAY_SIZE(tomtom_devs); - break; - default: - cinfo->dev = NULL; - cinfo->size = 0; - break; - } - - return rc; -} -EXPORT_SYMBOL(wcd9xxx_get_codec_info); - -/* - * wcd9xxx_core_irq_init: - * Initialize wcd9xxx codec irq instance - * - * @wcd9xxx_core_res: pointer to wcd core resource - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_core_irq_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - int ret = 0; - - if (!wcd9xxx_core_res) - return -EINVAL; - - if (wcd9xxx_core_res->irq != 1) { - ret = wcd9xxx_irq_init(wcd9xxx_core_res); - if (ret) - pr_err("IRQ initialization failed\n"); - } - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_core_irq_init); - -/* - * wcd9xxx_assign_irq: - * Assign irq and irq_base to wcd9xxx core resource - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @irq: irq number - * @irq_base: base irq number - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_assign_irq( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - unsigned int irq, - unsigned int irq_base) -{ - if (!wcd9xxx_core_res) - return -EINVAL; - - wcd9xxx_core_res->irq = irq; - wcd9xxx_core_res->irq_base = irq_base; - - return 0; -} -EXPORT_SYMBOL(wcd9xxx_assign_irq); - -/* - * wcd9xxx_core_res_init: - * Initialize wcd core resource instance - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @num_irqs: number of irqs for wcd9xxx core - * @num_irq_regs: number of irq registers - * @wcd_regmap: pointer to the wcd register map - * - * Returns 0 for success or negative error code in case of failure - */ -int wcd9xxx_core_res_init( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - int num_irqs, int num_irq_regs, struct regmap *wcd_regmap) -{ - if (!wcd9xxx_core_res || !wcd_regmap) - return -EINVAL; - - mutex_init(&wcd9xxx_core_res->pm_lock); - wcd9xxx_core_res->wlock_holders = 0; - wcd9xxx_core_res->pm_state = WCD9XXX_PM_SLEEPABLE; - init_waitqueue_head(&wcd9xxx_core_res->pm_wq); - pm_qos_add_request(&wcd9xxx_core_res->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - wcd9xxx_core_res->num_irqs = num_irqs; - wcd9xxx_core_res->num_irq_regs = num_irq_regs; - wcd9xxx_core_res->wcd_core_regmap = wcd_regmap; - - pr_debug("%s: num_irqs = %d, num_irq_regs = %d\n", - __func__, wcd9xxx_core_res->num_irqs, - wcd9xxx_core_res->num_irq_regs); - - return 0; -} -EXPORT_SYMBOL(wcd9xxx_core_res_init); - -/* - * wcd9xxx_core_res_deinit: - * Deinit wcd core resource instance - * - * @wcd9xxx_core_res: pointer to wcd core resource - */ -void wcd9xxx_core_res_deinit(struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - if (!wcd9xxx_core_res) - return; - - pm_qos_remove_request(&wcd9xxx_core_res->pm_qos_req); - mutex_destroy(&wcd9xxx_core_res->pm_lock); -} -EXPORT_SYMBOL(wcd9xxx_core_res_deinit); - -/* - * wcd9xxx_pm_cmpxchg: - * Check old state and exchange with pm new state - * if old state matches with current state - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @o: pm old state - * @n: pm new state - * - * Returns old state - */ -enum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - enum wcd9xxx_pm_state o, - enum wcd9xxx_pm_state n) -{ - enum wcd9xxx_pm_state old; - - if (!wcd9xxx_core_res) - return o; - - mutex_lock(&wcd9xxx_core_res->pm_lock); - old = wcd9xxx_core_res->pm_state; - if (old == o) - wcd9xxx_core_res->pm_state = n; - mutex_unlock(&wcd9xxx_core_res->pm_lock); - - return old; -} -EXPORT_SYMBOL(wcd9xxx_pm_cmpxchg); - -/* - * wcd9xxx_core_res_suspend: - * Suspend callback function for wcd9xxx core - * - * @wcd9xxx_core_res: pointer to wcd core resource - * @pm_message_t: pm message - * - * Returns 0 for success or negative error code for failure/busy - */ -int wcd9xxx_core_res_suspend( - struct wcd9xxx_core_resource *wcd9xxx_core_res, - pm_message_t pmesg) -{ - int ret = 0; - - pr_debug("%s: enter\n", __func__); - /* - * pm_qos_update_request() can be called after this suspend chain call - * started. thus suspend can be called while lock is being held - */ - mutex_lock(&wcd9xxx_core_res->pm_lock); - if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_SLEEPABLE) { - pr_debug("%s: suspending system, state %d, wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - wcd9xxx_core_res->pm_state = WCD9XXX_PM_ASLEEP; - } else if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_AWAKE) { - /* - * unlock to wait for pm_state == WCD9XXX_PM_SLEEPABLE - * then set to WCD9XXX_PM_ASLEEP - */ - pr_debug("%s: waiting to suspend system, state %d, wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - mutex_unlock(&wcd9xxx_core_res->pm_lock); - if (!(wait_event_timeout(wcd9xxx_core_res->pm_wq, - wcd9xxx_pm_cmpxchg(wcd9xxx_core_res, - WCD9XXX_PM_SLEEPABLE, - WCD9XXX_PM_ASLEEP) == - WCD9XXX_PM_SLEEPABLE, - HZ))) { - pr_debug("%s: suspend failed state %d, wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - ret = -EBUSY; - } else { - pr_debug("%s: done, state %d, wlock %d\n", __func__, - wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - } - mutex_lock(&wcd9xxx_core_res->pm_lock); - } else if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_ASLEEP) { - pr_warn("%s: system is already suspended, state %d, wlock %dn", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - } - mutex_unlock(&wcd9xxx_core_res->pm_lock); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_core_res_suspend); - -/* - * wcd9xxx_core_res_resume: - * Resume callback function for wcd9xxx core - * - * @wcd9xxx_core_res: pointer to wcd core resource - * - * Returns 0 for success or negative error code for failure/busy - */ -int wcd9xxx_core_res_resume( - struct wcd9xxx_core_resource *wcd9xxx_core_res) -{ - int ret = 0; - - pr_debug("%s: enter\n", __func__); - mutex_lock(&wcd9xxx_core_res->pm_lock); - if (wcd9xxx_core_res->pm_state == WCD9XXX_PM_ASLEEP) { - pr_debug("%s: resuming system, state %d, wlock %d\n", __func__, - wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - wcd9xxx_core_res->pm_state = WCD9XXX_PM_SLEEPABLE; - } else { - pr_warn("%s: system is already awake, state %d wlock %d\n", - __func__, wcd9xxx_core_res->pm_state, - wcd9xxx_core_res->wlock_holders); - } - mutex_unlock(&wcd9xxx_core_res->pm_lock); - wake_up_all(&wcd9xxx_core_res->pm_wq); - - return ret; -} -EXPORT_SYMBOL(wcd9xxx_core_res_resume); - -/* - * wcd9xxx_get_intf_type: - * Get interface type of wcd9xxx core - * - * Returns interface type - */ -enum wcd9xxx_intf_status wcd9xxx_get_intf_type(void) -{ - return wcd9xxx_intf; -} -EXPORT_SYMBOL(wcd9xxx_get_intf_type); - -/* - * wcd9xxx_set_intf_type: - * Set interface type of wcd9xxx core - * - */ -void wcd9xxx_set_intf_type(enum wcd9xxx_intf_status intf_status) -{ - wcd9xxx_intf = intf_status; -} -EXPORT_SYMBOL(wcd9xxx_set_intf_type); - -/* - * wcd9xxx_set_power_state: set power state for the region - * @wcd9xxx: handle to wcd core - * @state: power state to be set - * @region: region index - * - * Returns error code in case of failure or 0 for success - */ -int wcd9xxx_set_power_state(struct wcd9xxx *wcd9xxx, - enum codec_power_states state, - enum wcd_power_regions region) -{ - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - if ((region < 0) || (region >= WCD9XXX_MAX_PWR_REGIONS)) { - dev_err(wcd9xxx->dev, "%s: region index %d out of bounds\n", - __func__, region); - return -EINVAL; - } - if (!wcd9xxx->wcd9xxx_pwr[region]) { - dev_err(wcd9xxx->dev, "%s: memory not created for region: %d\n", - __func__, region); - return -EINVAL; - } - mutex_lock(&wcd9xxx->io_lock); - wcd9xxx->wcd9xxx_pwr[region]->power_state = state; - mutex_unlock(&wcd9xxx->io_lock); - - return 0; -} -EXPORT_SYMBOL(wcd9xxx_set_power_state); - -/* - * wcd9xxx_get_current_power_state: Get power state of the region - * @wcd9xxx: handle to wcd core - * @region: region index - * - * Returns current power state of the region or error code for failure - */ -int wcd9xxx_get_current_power_state(struct wcd9xxx *wcd9xxx, - enum wcd_power_regions region) -{ - int state; - - if (!wcd9xxx) { - pr_err("%s: wcd9xxx is NULL\n", __func__); - return -EINVAL; - } - - if ((region < 0) || (region >= WCD9XXX_MAX_PWR_REGIONS)) { - dev_err(wcd9xxx->dev, "%s: region index %d out of bounds\n", - __func__, region); - return -EINVAL; - } - if (!wcd9xxx->wcd9xxx_pwr[region]) { - dev_err(wcd9xxx->dev, "%s: memory not created for region: %d\n", - __func__, region); - return -EINVAL; - } - - mutex_lock(&wcd9xxx->io_lock); - state = wcd9xxx->wcd9xxx_pwr[region]->power_state; - mutex_unlock(&wcd9xxx->io_lock); - - return state; -} -EXPORT_SYMBOL(wcd9xxx_get_current_power_state); diff --git a/techpack/audio/asoc/codecs/wcd9xxx-utils.h b/techpack/audio/asoc/codecs/wcd9xxx-utils.h deleted file mode 100644 index a7ec56c2da0a..000000000000 --- a/techpack/audio/asoc/codecs/wcd9xxx-utils.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD9XXX_UTILS_H__ -#define __WCD9XXX_UTILS_H__ - -#include -#include -#include -#include "pdata.h" -#include "core.h" - -struct wcd9xxx_pdata *wcd9xxx_populate_dt_data(struct device *dev); -int wcd9xxx_bringup(struct device *dev); -int wcd9xxx_bringdown(struct device *dev); -struct regmap *wcd9xxx_regmap_init(struct device *dev, - const struct regmap_config *config); -int wcd9xxx_reset(struct device *dev); -int wcd9xxx_reset_low(struct device *dev); -int wcd9xxx_get_codec_info(struct device *dev); - -typedef int (*codec_bringup_fn)(struct wcd9xxx *); -typedef int (*codec_bringdown_fn)(struct wcd9xxx *); -typedef int (*codec_type_fn)(struct wcd9xxx *, - struct wcd9xxx_codec_type *); - -codec_bringdown_fn wcd9xxx_bringdown_fn(int type); -codec_bringup_fn wcd9xxx_bringup_fn(int type); -codec_type_fn wcd9xxx_get_codec_info_fn(int type); - -#endif diff --git a/techpack/audio/asoc/codecs/wcd_cmi_api.h b/techpack/audio/asoc/codecs/wcd_cmi_api.h deleted file mode 100644 index 39be6417e327..000000000000 --- a/techpack/audio/asoc/codecs/wcd_cmi_api.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __CMI_API__ -#define __CMI_API__ - -enum cmi_api_result { - CMI_API_FAILED = 1, - CMI_API_BUSY, - CMI_API_NO_MEMORY, - CMI_API_NOT_READY, -}; - -enum cmi_api_event { - CMI_API_MSG = 1, - CMI_API_OFFLINE, - CMI_API_ONLINE, - CMI_API_DEINITIALIZED, -}; - -struct cmi_api_notification { - enum cmi_api_event event; - enum cmi_api_result result; - void *message; -}; - -void *cmi_register( - void notification_callback - (const struct cmi_api_notification *parameter), - u32 service); -enum cmi_api_result cmi_deregister(void *reg_handle); -enum cmi_api_result cmi_send_msg(void *message); - -#endif /*__CMI_API__*/ diff --git a/techpack/audio/asoc/codecs/wcd_cpe_core.c b/techpack/audio/asoc/codecs/wcd_cpe_core.c deleted file mode 100644 index d64a74978ce9..000000000000 --- a/techpack/audio/asoc/codecs/wcd_cpe_core.c +++ /dev/null @@ -1,4598 +0,0 @@ -/* Copyright (c) 2014-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "core.h" -#include "cpe_core.h" -#include "cpe_err.h" -#include "cpe_cmi.h" -#include "wcd_cpe_core.h" -#include "wcd_cpe_services.h" -#include "wcd_cmi_api.h" -#include "wcd9xxx-irq.h" - -#define CMI_CMD_TIMEOUT (10 * HZ) -#define WCD_CPE_LSM_MAX_SESSIONS 2 -#define WCD_CPE_AFE_MAX_PORTS 4 -#define AFE_SVC_EXPLICIT_PORT_START 1 -#define WCD_CPE_EC_PP_BUF_SIZE 480 /* 5 msec buffer */ - -#define ELF_FLAG_EXECUTE (1 << 0) -#define ELF_FLAG_WRITE (1 << 1) -#define ELF_FLAG_READ (1 << 2) - -#define ELF_FLAG_RW (ELF_FLAG_READ | ELF_FLAG_WRITE) - -#define WCD_CPE_GRAB_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock acquire\n", \ - __func__, name); \ - mutex_lock(lock); \ -} - -#define WCD_CPE_REL_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock release\n", \ - __func__, name); \ - mutex_unlock(lock); \ -} - -#define WCD_CPE_STATE_MAX_LEN 11 -#define CPE_OFFLINE_WAIT_TIMEOUT (2 * HZ) -#define CPE_READY_WAIT_TIMEOUT (3 * HZ) -#define WCD_CPE_SYSFS_DIR_MAX_LENGTH 32 - -#define CPE_ERR_IRQ_CB(core) \ - (core->cpe_cdc_cb->cpe_err_irq_control) - -/* - * AFE output buffer size is always - * (sample_rate * number of bytes per sample/2*1000) - */ -#define AFE_OUT_BUF_SIZE(bit_width, sample_rate) \ - (((sample_rate) * (bit_width / BITS_PER_BYTE))/(2*1000)) - -enum afe_port_state { - AFE_PORT_STATE_DEINIT = 0, - AFE_PORT_STATE_INIT, - AFE_PORT_STATE_CONFIG, - AFE_PORT_STATE_STARTED, - AFE_PORT_STATE_SUSPENDED, -}; - -struct wcd_cmi_afe_port_data { - u8 port_id; - struct mutex afe_lock; - struct completion afe_cmd_complete; - enum afe_port_state port_state; - u8 cmd_result; - u32 mem_handle; -}; - -struct cpe_lsm_ids { - u32 module_id; - u32 param_id; -}; - -static struct wcd_cpe_core *core_d; -static struct cpe_lsm_session - *lsm_sessions[WCD_CPE_LSM_MAX_SESSIONS + 1]; -struct wcd_cpe_core * (*wcd_get_cpe_core)(struct snd_soc_codec *); -static struct wcd_cmi_afe_port_data afe_ports[WCD_CPE_AFE_MAX_PORTS + 1]; -static void wcd_cpe_svc_event_cb(const struct cpe_svc_notification *param); -static int wcd_cpe_setup_irqs(struct wcd_cpe_core *core); -static void wcd_cpe_cleanup_irqs(struct wcd_cpe_core *core); -static ssize_t cpe_ftm_test_trigger(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos); -static u32 ramdump_enable; -static u32 cpe_ftm_test_status; -static const struct file_operations cpe_ftm_test_trigger_fops = { - .open = simple_open, - .write = cpe_ftm_test_trigger, -}; - -static int wcd_cpe_afe_svc_cmd_mode(void *core_handle, - u8 mode); -struct wcd_cpe_attribute { - struct attribute attr; - ssize_t (*show)(struct wcd_cpe_core *core, char *buf); - ssize_t (*store)(struct wcd_cpe_core *core, const char *buf, - ssize_t count); -}; - -#define WCD_CPE_ATTR(_name, _mode, _show, _store) \ -static struct wcd_cpe_attribute cpe_attr_##_name = { \ - .attr = {.name = __stringify(_name), .mode = _mode}, \ - .show = _show, \ - .store = _store, \ -} - -#define to_wcd_cpe_attr(a) \ - container_of((a), struct wcd_cpe_attribute, attr) - -#define kobj_to_cpe_core(kobj) \ - container_of((kobj), struct wcd_cpe_core, cpe_kobj) - -/* wcd_cpe_lsm_session_active: check if any session is active - * return true if any session is active. - */ -static bool wcd_cpe_lsm_session_active(void) -{ - int index = 1; - bool lsm_active = false; - - /* session starts from index 1 */ - for (; index <= WCD_CPE_LSM_MAX_SESSIONS; index++) { - if (lsm_sessions[index] != NULL) { - lsm_active = true; - break; - } else { - lsm_active = false; - } - } - return lsm_active; -} - -static int wcd_cpe_get_sfr_dump(struct wcd_cpe_core *core) -{ - struct cpe_svc_mem_segment dump_seg; - int rc; - u8 *sfr_dump; - - sfr_dump = kzalloc(core->sfr_buf_size, GFP_KERNEL); - if (!sfr_dump) - goto done; - - dump_seg.type = CPE_SVC_DATA_MEM; - dump_seg.cpe_addr = core->sfr_buf_addr; - dump_seg.size = core->sfr_buf_size; - dump_seg.data = sfr_dump; - dev_dbg(core->dev, - "%s: reading SFR from CPE, size = %zu\n", - __func__, core->sfr_buf_size); - - rc = cpe_svc_ramdump(core->cpe_handle, &dump_seg); - if (rc < 0) { - dev_err(core->dev, - "%s: Failed to read cpe sfr_dump, err = %d\n", - __func__, rc); - goto free_sfr_dump; - } - - dev_info(core->dev, - "%s: cpe_sfr = %s\n", __func__, sfr_dump); - -free_sfr_dump: - kfree(sfr_dump); -done: - /* Even if SFR dump failed, do not return error */ - return 0; -} - -static int wcd_cpe_collect_ramdump(struct wcd_cpe_core *core) -{ - struct cpe_svc_mem_segment dump_seg; - int rc; - - if (!core->cpe_ramdump_dev || !core->cpe_dump_v_addr || - core->hw_info.dram_size == 0) { - dev_err(core->dev, - "%s: Ramdump devices not set up, size = %zu\n", - __func__, core->hw_info.dram_size); - return -EINVAL; - } - - dump_seg.type = CPE_SVC_DATA_MEM; - dump_seg.cpe_addr = core->hw_info.dram_offset; - dump_seg.size = core->hw_info.dram_size; - dump_seg.data = core->cpe_dump_v_addr; - - dev_dbg(core->dev, - "%s: Reading ramdump from CPE\n", - __func__); - - rc = cpe_svc_ramdump(core->cpe_handle, &dump_seg); - if (rc < 0) { - dev_err(core->dev, - "%s: Failed to read CPE ramdump, err = %d\n", - __func__, rc); - return rc; - } - - dev_dbg(core->dev, - "%s: completed reading ramdump from CPE\n", - __func__); - - core->cpe_ramdump_seg.address = (unsigned long) core->cpe_dump_addr; - core->cpe_ramdump_seg.size = core->hw_info.dram_size; - core->cpe_ramdump_seg.v_address = core->cpe_dump_v_addr; - - rc = do_ramdump(core->cpe_ramdump_dev, - &core->cpe_ramdump_seg, 1); - if (rc) - dev_err(core->dev, - "%s: fail to dump cpe ram to device, err = %d\n", - __func__, rc); - return rc; -} - -/* wcd_cpe_is_valid_elf_hdr: check if the ELF header is valid - * @core: handle to wcd_cpe_core - * @fw_size: size of firmware from request_firmware - * @ehdr: the elf header to be checked for - * return true if all checks pass, true if any elf check fails - */ -static bool wcd_cpe_is_valid_elf_hdr(struct wcd_cpe_core *core, size_t fw_size, - const struct elf32_hdr *ehdr) -{ - if (fw_size < sizeof(*ehdr)) { - dev_err(core->dev, "%s:Firmware too small\n", __func__); - goto elf_check_fail; - } - - if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) { - dev_err(core->dev, "%s: Not an ELF file\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) { - dev_err(core->dev, "%s: Not a executable image\n", __func__); - goto elf_check_fail; - } - - if (ehdr->e_phnum == 0) { - dev_err(core->dev, "%s: no segments to load\n", __func__); - goto elf_check_fail; - } - - if (sizeof(struct elf32_phdr) * ehdr->e_phnum + - sizeof(struct elf32_hdr) > fw_size) { - dev_err(core->dev, "%s: Too small MDT file\n", __func__); - goto elf_check_fail; - } - - return true; - -elf_check_fail: - return false; -} - -/* - * wcd_cpe_load_each_segment: download segment to CPE - * @core: handle to struct wcd_cpe_core - * @file_idx: index of split firmware image file name - * @phdr: program header from metadata - */ -static int wcd_cpe_load_each_segment(struct wcd_cpe_core *core, - int file_idx, const struct elf32_phdr *phdr) -{ - const struct firmware *split_fw; - char split_fname[32]; - int ret = 0; - struct cpe_svc_mem_segment *segment; - - if (!core || !phdr) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - /* file size can be 0 for bss segments */ - if (phdr->p_filesz == 0 || phdr->p_memsz == 0) - return 0; - - segment = kzalloc(sizeof(struct cpe_svc_mem_segment), GFP_KERNEL); - if (!segment) - return -ENOMEM; - - snprintf(split_fname, sizeof(split_fname), "%s.b%02d", - core->fname, file_idx); - - ret = request_firmware(&split_fw, split_fname, core->dev); - if (ret) { - dev_err(core->dev, "firmware %s not found\n", - split_fname); - ret = -EIO; - goto fw_req_fail; - } - - if (phdr->p_flags & ELF_FLAG_EXECUTE) - segment->type = CPE_SVC_INSTRUCTION_MEM; - else if (phdr->p_flags & ELF_FLAG_RW) - segment->type = CPE_SVC_DATA_MEM; - else { - dev_err(core->dev, "%s invalid flags 0x%x\n", - __func__, phdr->p_flags); - goto done; - } - - if (phdr->p_filesz != split_fw->size) { - dev_err(core->dev, - "%s: %s size mismatch, phdr_size: 0x%x fw_size: 0x%zx", - __func__, split_fname, phdr->p_filesz, split_fw->size); - ret = -EINVAL; - goto done; - } - - segment->cpe_addr = phdr->p_paddr; - segment->size = phdr->p_filesz; - segment->data = (u8 *) split_fw->data; - - dev_dbg(core->dev, - "%s: cpe segment type %s read from firmware\n", __func__, - (segment->type == CPE_SVC_INSTRUCTION_MEM) ? - "INSTRUCTION" : "DATA"); - - ret = cpe_svc_download_segment(core->cpe_handle, segment); - if (ret) { - dev_err(core->dev, - "%s: Failed to download %s, error = %d\n", - __func__, split_fname, ret); - goto done; - } - -done: - release_firmware(split_fw); - -fw_req_fail: - kfree(segment); - return ret; -} - -/* - * wcd_cpe_enable_cpe_clks: enable the clocks for CPE - * @core: handle to wcd_cpe_core - * @enable: flag indicating whether to enable/disable cpe clocks - */ -static int wcd_cpe_enable_cpe_clks(struct wcd_cpe_core *core, bool enable) -{ - int ret, ret1; - - if (!core || !core->cpe_cdc_cb || - !core->cpe_cdc_cb->cpe_clk_en) { - pr_err("%s: invalid handle\n", - __func__); - return -EINVAL; - } - - ret = core->cpe_cdc_cb->cdc_clk_en(core->codec, enable); - if (ret) { - dev_err(core->dev, "%s: Failed to enable RCO\n", - __func__); - return ret; - } - - if (!enable && core->cpe_clk_ref > 0) - core->cpe_clk_ref--; - - /* - * CPE clk will be enabled at the first time - * and be disabled at the last time. - */ - if (core->cpe_clk_ref == 0) { - ret = core->cpe_cdc_cb->cpe_clk_en(core->codec, enable); - if (ret) { - dev_err(core->dev, - "%s: cpe_clk_en() failed, err = %d\n", - __func__, ret); - goto cpe_clk_fail; - } - } - - if (enable) - core->cpe_clk_ref++; - - return 0; - -cpe_clk_fail: - /* Release the codec clk if CPE clk enable failed */ - if (enable) { - ret1 = core->cpe_cdc_cb->cdc_clk_en(core->codec, !enable); - if (ret1) - dev_err(core->dev, - "%s: Fail to release codec clk, err = %d\n", - __func__, ret1); - } - - return ret; -} - -/* - * wcd_cpe_bus_vote_max_bw: Function to vote for max bandwidth on codec bus - * @core: handle to core for cpe - * @vote: flag to indicate enable/disable of vote - * - * This function will try to use the codec provided callback to - * vote/unvote for the max bandwidth of the bus that is used by - * the codec for register reads/writes. - */ -static int wcd_cpe_bus_vote_max_bw(struct wcd_cpe_core *core, - bool vote) -{ - if (!core || !core->cpe_cdc_cb) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!core) ? "core" : "codec callbacks"); - return -EINVAL; - } - - if (core->cpe_cdc_cb->bus_vote_bw) { - dev_dbg(core->dev, "%s: %s cdc bus max bandwidth\n", - __func__, vote ? "Vote" : "Unvote"); - core->cpe_cdc_cb->bus_vote_bw(core->codec, vote); - } - - return 0; -} - -/* - * wcd_cpe_load_fw: Function to load the fw image - * @core: cpe core pointer - * @load_type: indicates whether to load to data section - * or the instruction section - * - * Parse the mdt file to look for program headers, load each - * split file corresponding to the program headers. - */ -static int wcd_cpe_load_fw(struct wcd_cpe_core *core, - unsigned int load_type) -{ - - int ret, phdr_idx; - struct snd_soc_codec *codec = NULL; - struct wcd9xxx *wcd9xxx = NULL; - const struct elf32_hdr *ehdr; - const struct elf32_phdr *phdr; - const struct firmware *fw; - const u8 *elf_ptr; - char mdt_name[64]; - bool img_dload_fail = false; - bool load_segment; - - if (!core || !core->cpe_handle) { - pr_err("%s: Error CPE core %pK\n", __func__, - core); - return -EINVAL; - } - codec = core->codec; - wcd9xxx = dev_get_drvdata(codec->dev->parent); - snprintf(mdt_name, sizeof(mdt_name), "%s.mdt", core->fname); - ret = request_firmware(&fw, mdt_name, core->dev); - if (ret < 0) { - dev_err(core->dev, "firmware %s not found\n", mdt_name); - return ret; - } - - ehdr = (struct elf32_hdr *) fw->data; - if (!wcd_cpe_is_valid_elf_hdr(core, fw->size, ehdr)) { - dev_err(core->dev, "%s: fw mdt %s is invalid\n", - __func__, mdt_name); - ret = -EINVAL; - goto done; - } - - elf_ptr = fw->data + sizeof(*ehdr); - - if (load_type == ELF_FLAG_EXECUTE) { - /* Reset CPE first */ - ret = cpe_svc_reset(core->cpe_handle); - if (ret < 0) { - dev_err(core->dev, - "%s: Failed to reset CPE with error %d\n", - __func__, ret); - goto done; - } - } - - dev_dbg(core->dev, "%s: start image dload, name = %s, load_type = 0x%x\n", - __func__, core->fname, load_type); - - wcd_cpe_bus_vote_max_bw(core, true); - - /* parse every program header and request corresponding firmware */ - for (phdr_idx = 0; phdr_idx < ehdr->e_phnum; phdr_idx++) { - phdr = (struct elf32_phdr *)elf_ptr; - load_segment = false; - - dev_dbg(core->dev, - "index = %d, vaddr = 0x%x, paddr = 0x%x, filesz = 0x%x, memsz = 0x%x, flags = 0x%x\n" - , phdr_idx, phdr->p_vaddr, phdr->p_paddr, - phdr->p_filesz, phdr->p_memsz, phdr->p_flags); - - switch (load_type) { - case ELF_FLAG_EXECUTE: - if (phdr->p_flags & load_type) - load_segment = true; - break; - case ELF_FLAG_RW: - if (!(phdr->p_flags & ELF_FLAG_EXECUTE) && - (phdr->p_flags & load_type)) - load_segment = true; - break; - default: - pr_err("%s: Invalid load_type 0x%x\n", - __func__, load_type); - ret = -EINVAL; - goto rel_bus_vote; - } - - if (load_segment) { - ret = wcd_cpe_load_each_segment(core, - phdr_idx, phdr); - if (ret < 0) { - dev_err(core->dev, - "Failed to load segment %d, aborting img dload\n", - phdr_idx); - img_dload_fail = true; - goto rel_bus_vote; - } - } else { - dev_dbg(core->dev, - "%s: skipped segment with index %d\n", - __func__, phdr_idx); - } - - elf_ptr = elf_ptr + sizeof(*phdr); - } - if (load_type == ELF_FLAG_EXECUTE) - core->ssr_type = WCD_CPE_IMEM_DOWNLOADED; - -rel_bus_vote: - wcd_cpe_bus_vote_max_bw(core, false); - -done: - release_firmware(fw); - return ret; -} - -/* - * wcd_cpe_change_online_state - mark cpe online/offline state - * @core: core session to mark - * @online: whether online of offline - * - */ -static void wcd_cpe_change_online_state(struct wcd_cpe_core *core, - int online) -{ - struct wcd_cpe_ssr_entry *ssr_entry = NULL; - unsigned long ret; - - if (!core) { - pr_err("%s: Invalid core handle\n", - __func__); - return; - } - - ssr_entry = &core->ssr_entry; - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - ssr_entry->offline = !online; - - /* Make sure write to offline state is completed. */ - wmb(); - ret = xchg(&ssr_entry->offline_change, 1); - wake_up_interruptible(&ssr_entry->offline_poll_wait); - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); - pr_debug("%s: change state 0x%x offline_change 0x%x\n" - " core->offline 0x%x, ret = %ld\n", - __func__, online, - ssr_entry->offline_change, - core->ssr_entry.offline, ret); -} - -/* - * wcd_cpe_load_fw_image: work function to load the fw image - * @work: work that is scheduled to perform the image loading - * - * Parse the mdt file to look for program headers, load each - * split file corresponding to the program headers. - */ -static void wcd_cpe_load_fw_image(struct work_struct *work) -{ - struct wcd_cpe_core *core; - int ret = 0; - - core = container_of(work, struct wcd_cpe_core, load_fw_work); - ret = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (!ret) - wcd_cpe_change_online_state(core, 1); - else - pr_err("%s: failed to load instruction section, err = %d\n", - __func__, ret); -} - -/* - * wcd_cpe_get_core_handle: get the handle to wcd_cpe_core - * @codec: codec from which this handle is to be obtained - * Codec driver should provide a callback function to obtain - * handle to wcd_cpe_core during initialization of wcd_cpe_core - */ -void *wcd_cpe_get_core_handle( - struct snd_soc_codec *codec) -{ - struct wcd_cpe_core *core = NULL; - - if (!codec) { - pr_err("%s: Invalid codec handle\n", - __func__); - goto done; - } - - if (!wcd_get_cpe_core) { - dev_err(codec->dev, - "%s: codec callback not available\n", - __func__); - goto done; - } - - core = wcd_get_cpe_core(codec); - - if (!core) - dev_err(codec->dev, - "%s: handle to core not available\n", - __func__); -done: - return core; -} -EXPORT_SYMBOL(wcd_cpe_get_core_handle); - -/* - * svass_engine_irq: threaded interrupt handler for svass engine irq - * @irq: interrupt number - * @data: data pointer passed during irq registration - */ -static irqreturn_t svass_engine_irq(int irq, void *data) -{ - struct wcd_cpe_core *core = data; - int ret = 0; - - if (!core) { - pr_err("%s: Invalid data for interrupt handler\n", - __func__); - goto done; - } - - ret = cpe_svc_process_irq(core->cpe_handle, CPE_IRQ_OUTBOX_IRQ); - if (ret < 0) - dev_err(core->dev, - "%s: Error processing irq from cpe_Services\n", - __func__); -done: - return IRQ_HANDLED; -} - -/* - * wcd_cpe_state_read - update read status in procfs - * @entry: snd_info_entry - * @buf: buffer where the read status is updated. - * - */ -static ssize_t wcd_cpe_state_read(struct snd_info_entry *entry, - void *file_private_data, struct file *file, - char __user *buf, size_t count, loff_t pos) -{ - int len = 0; - char buffer[WCD_CPE_STATE_MAX_LEN]; - struct wcd_cpe_core *core = NULL; - struct wcd_cpe_ssr_entry *ssr_entry = NULL; - - core = (struct wcd_cpe_core *) entry->private_data; - if (!core) { - pr_err("%s: CPE core NULL\n", __func__); - return -EINVAL; - } - ssr_entry = &core->ssr_entry; - - /* Make sure read from ssr_entry is completed. */ - rmb(); - dev_dbg(core->dev, - "%s: Offline 0x%x\n", __func__, - ssr_entry->offline); - - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - len = snprintf(buffer, sizeof(buffer), "%s\n", - ssr_entry->offline ? "OFFLINE" : "ONLINE"); - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -/* - * wcd_cpe_state_poll - polls for change state - * @entry: snd_info_entry - * @wait: wait for duration for poll wait - * - */ -static unsigned int wcd_cpe_state_poll(struct snd_info_entry *entry, - void *private_data, struct file *file, - poll_table *wait) -{ - struct wcd_cpe_core *core = NULL; - struct wcd_cpe_ssr_entry *ssr_entry = NULL; - int ret = 0; - - core = (struct wcd_cpe_core *) entry->private_data; - if (!core) { - pr_err("%s: CPE core NULL\n", __func__); - return -EINVAL; - } - - ssr_entry = &core->ssr_entry; - - dev_dbg(core->dev, "%s: CPE Poll wait\n", - __func__); - poll_wait(file, &ssr_entry->offline_poll_wait, wait); - dev_dbg(core->dev, "%s: Wake-up Poll wait\n", - __func__); - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - - if (xchg(&ssr_entry->offline_change, 0)) - ret = POLLIN | POLLPRI | POLLRDNORM; - - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); - - dev_dbg(core->dev, "%s: ret (%d) from poll_wait\n", - __func__, ret); - return ret; -} - -/* - * wcd_cpe_is_online_state - return true if card is online state - * @core: core offline to query - */ -static bool wcd_cpe_is_online_state(void *core_handle) -{ - struct wcd_cpe_core *core = core_handle; - - if (core_handle) { - return !core->ssr_entry.offline; - } else { - pr_err("%s: Core handle NULL\n", __func__); - /* still return 1- offline if core ptr null */ - return false; - } -} - -static struct snd_info_entry_ops wcd_cpe_state_proc_ops = { - .read = wcd_cpe_state_read, - .poll = wcd_cpe_state_poll, -}; - -static int wcd_cpe_check_new_image(struct wcd_cpe_core *core) -{ - int rc = 0; - char temp_img_name[WCD_CPE_IMAGE_FNAME_MAX]; - - if (!strcmp(core->fname, core->dyn_fname) && - core->ssr_type != WCD_CPE_INITIALIZED) { - dev_dbg(core->dev, - "%s: Firmware unchanged, fname = %s, ssr_type 0x%x\n", - __func__, core->fname, core->ssr_type); - goto done; - } - - /* - * Different firmware name requested, - * Re-load the instruction section - */ - strlcpy(temp_img_name, core->fname, - WCD_CPE_IMAGE_FNAME_MAX); - strlcpy(core->fname, core->dyn_fname, - WCD_CPE_IMAGE_FNAME_MAX); - - rc = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (rc) { - dev_err(core->dev, - "%s: Failed to dload new image %s, err = %d\n", - __func__, core->fname, rc); - /* If new image download failed, revert back to old image */ - strlcpy(core->fname, temp_img_name, - WCD_CPE_IMAGE_FNAME_MAX); - rc = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (rc) - dev_err(core->dev, - "%s: Failed to re-dload image %s, err = %d\n", - __func__, core->fname, rc); - } else { - dev_info(core->dev, "%s: fw changed to %s\n", - __func__, core->fname); - } -done: - return rc; -} - -static int wcd_cpe_enable(struct wcd_cpe_core *core, - bool enable) -{ - int ret = 0; - - if (enable) { - /* Reset CPE first */ - ret = cpe_svc_reset(core->cpe_handle); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE Reset failed, error = %d\n", - __func__, ret); - goto done; - } - - ret = wcd_cpe_setup_irqs(core); - if (ret) { - dev_err(core->dev, - "%s: CPE IRQs setup failed, error = %d\n", - __func__, ret); - goto done; - } - ret = wcd_cpe_check_new_image(core); - if (ret) - goto fail_boot; - - /* Dload data section */ - ret = wcd_cpe_load_fw(core, ELF_FLAG_RW); - if (ret) { - dev_err(core->dev, - "%s: Failed to dload data section, err = %d\n", - __func__, ret); - goto fail_boot; - } - - ret = wcd_cpe_enable_cpe_clks(core, true); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE clk enable failed, err = %d\n", - __func__, ret); - goto fail_boot; - } - - ret = cpe_svc_boot(core->cpe_handle, - core->cpe_debug_mode); - if (ret < 0) { - dev_err(core->dev, - "%s: Failed to boot CPE\n", - __func__); - goto fail_boot; - } - - /* wait for CPE to be online */ - dev_dbg(core->dev, - "%s: waiting for CPE bootup\n", - __func__); - - wait_for_completion(&core->online_compl); - - dev_dbg(core->dev, - "%s: CPE bootup done\n", - __func__); - - core->ssr_type = WCD_CPE_ENABLED; - } else { - if (core->ssr_type == WCD_CPE_BUS_DOWN_EVENT || - core->ssr_type == WCD_CPE_SSR_EVENT) { - /* - * If this disable vote is when - * SSR is in progress, do not disable CPE here, - * instead SSR handler will control CPE. - */ - wcd_cpe_enable_cpe_clks(core, false); - wcd_cpe_cleanup_irqs(core); - goto done; - } - - ret = cpe_svc_shutdown(core->cpe_handle); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE shutdown failed, error %d\n", - __func__, ret); - goto done; - } - - wcd_cpe_enable_cpe_clks(core, false); - wcd_cpe_cleanup_irqs(core); - core->ssr_type = WCD_CPE_IMEM_DOWNLOADED; - } - - return ret; - -fail_boot: - wcd_cpe_cleanup_irqs(core); - -done: - return ret; -} - -/* - * wcd_cpe_boot_ssr: Load the images to CPE after ssr and bootup cpe - * @core: handle to the core - */ -static int wcd_cpe_boot_ssr(struct wcd_cpe_core *core) -{ - int rc = 0; - - if (!core || !core->cpe_handle) { - pr_err("%s: Invalid handle\n", __func__); - rc = -EINVAL; - goto fail; - } - /* Load the instruction section and mark CPE as online */ - rc = wcd_cpe_load_fw(core, ELF_FLAG_EXECUTE); - if (rc) { - dev_err(core->dev, - "%s: Failed to load instruction, err = %d\n", - __func__, rc); - goto fail; - } else { - wcd_cpe_change_online_state(core, 1); - } - -fail: - return rc; -} - -/* - * wcd_cpe_clr_ready_status: - * Clear the value from the ready status for CPE - * @core: handle to the core - * @value: flag/bitmask that is to be cleared - * - * This function should not be invoked with ssr_lock acquired - */ -static void wcd_cpe_clr_ready_status(struct wcd_cpe_core *core, - u8 value) -{ - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - core->ready_status &= ~(value); - dev_dbg(core->dev, - "%s: ready_status = 0x%x\n", - __func__, core->ready_status); - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); -} - -/* - * wcd_cpe_set_and_complete: - * Set the ready status with the provided value and - * flag the completion object if ready status moves - * to ready to download - * @core: handle to the core - * @value: flag/bitmask that is to be set - */ -static void wcd_cpe_set_and_complete(struct wcd_cpe_core *core, - u8 value) -{ - WCD_CPE_GRAB_LOCK(&core->ssr_lock, "SSR"); - core->ready_status |= value; - if ((core->ready_status & WCD_CPE_READY_TO_DLOAD) == - WCD_CPE_READY_TO_DLOAD) { - dev_dbg(core->dev, - "%s: marking ready, status = 0x%x\n", - __func__, core->ready_status); - complete(&core->ready_compl); - } - WCD_CPE_REL_LOCK(&core->ssr_lock, "SSR"); -} - - -/* - * wcd_cpe_ssr_work: work function to handle CPE SSR - * @work: work that is scheduled to perform CPE shutdown - * and restart - */ -static void wcd_cpe_ssr_work(struct work_struct *work) -{ - - int rc = 0; - u32 irq = 0; - struct wcd_cpe_core *core = NULL; - u8 status = 0; - - core = container_of(work, struct wcd_cpe_core, ssr_work); - if (!core) { - pr_err("%s: Core handle NULL\n", __func__); - return; - } - - /* Obtain pm request up in case of suspend mode */ - pm_qos_add_request(&core->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - pm_qos_update_request(&core->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - dev_dbg(core->dev, - "%s: CPE SSR with event %d\n", - __func__, core->ssr_type); - - if (core->ssr_type == WCD_CPE_SSR_EVENT) { - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_STATUS, - &status); - if (status & core->irq_info.cpe_fatal_irqs) - irq = CPE_IRQ_WDOG_BITE; - } else { - /* If bus is down, cdc reg cannot be read */ - irq = CPE_IRQ_WDOG_BITE; - } - - if (core->cpe_users > 0) { - rc = cpe_svc_process_irq(core->cpe_handle, irq); - if (rc < 0) - /* - * Even if process_irq fails, - * wait for cpe to move to offline state - */ - dev_err(core->dev, - "%s: irq processing failed, error = %d\n", - __func__, rc); - - rc = wait_for_completion_timeout(&core->offline_compl, - CPE_OFFLINE_WAIT_TIMEOUT); - if (!rc) { - dev_err(core->dev, - "%s: wait for cpe offline timed out\n", - __func__); - goto err_ret; - } - if (core->ssr_type != WCD_CPE_BUS_DOWN_EVENT) { - wcd_cpe_get_sfr_dump(core); - - /* - * Ramdump has to be explicitly enabled - * through debugfs and cannot be collected - * when bus is down. - */ - if (ramdump_enable) - wcd_cpe_collect_ramdump(core); - } - } else { - pr_err("%s: no cpe users, mark as offline\n", __func__); - wcd_cpe_change_online_state(core, 0); - wcd_cpe_set_and_complete(core, - WCD_CPE_BLK_READY); - } - - rc = wait_for_completion_timeout(&core->ready_compl, - CPE_READY_WAIT_TIMEOUT); - if (!rc) { - dev_err(core->dev, - "%s: ready to online timed out, status = %u\n", - __func__, core->ready_status); - goto err_ret; - } - - rc = wcd_cpe_boot_ssr(core); - - /* Once image are downloaded make sure all - * error interrupts are cleared - */ - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_CLEAR, NULL); - -err_ret: - /* remove after default pm qos */ - pm_qos_update_request(&core->pm_qos_req, - PM_QOS_DEFAULT_VALUE); - pm_qos_remove_request(&core->pm_qos_req); -} - -/* - * wcd_cpe_ssr_handle: handle SSR events here. - * @core_handle: handle to the cpe core - * @event: indicates ADSP or CDSP SSR. - */ -int wcd_cpe_ssr_event(void *core_handle, - enum wcd_cpe_ssr_state_event event) -{ - struct wcd_cpe_core *core = core_handle; - - if (!core) { - pr_err("%s: Invalid handle to core\n", - __func__); - return -EINVAL; - } - - /* - * If CPE is not even enabled, the SSR event for - * CPE needs to be ignored - */ - if (core->ssr_type == WCD_CPE_INITIALIZED) { - dev_info(core->dev, - "%s: CPE initialized but not enabled, skip CPE ssr\n", - __func__); - return 0; - } - - dev_dbg(core->dev, - "%s: Schedule ssr work, event = %d\n", - __func__, core->ssr_type); - - switch (event) { - case WCD_CPE_BUS_DOWN_EVENT: - /* - * If bus down, then CPE block is also - * treated to be down - */ - wcd_cpe_clr_ready_status(core, WCD_CPE_READY_TO_DLOAD); - core->ssr_type = event; - schedule_work(&core->ssr_work); - break; - - case WCD_CPE_SSR_EVENT: - wcd_cpe_clr_ready_status(core, WCD_CPE_BLK_READY); - core->ssr_type = event; - schedule_work(&core->ssr_work); - break; - - case WCD_CPE_BUS_UP_EVENT: - wcd_cpe_set_and_complete(core, WCD_CPE_BUS_READY); - /* - * In case of bus up event ssr_type will be changed - * to WCD_CPE_ACTIVE once CPE is online - */ - break; - - default: - dev_err(core->dev, - "%s: unhandled SSR event %d\n", - __func__, event); - return -EINVAL; - } - - return 0; -} -EXPORT_SYMBOL(wcd_cpe_ssr_event); - -/* - * svass_exception_irq: threaded irq handler for sva error interrupts - * @irq: interrupt number - * @data: data pointer passed during irq registration - * - * Once a error interrupt is received, it is not cleared, since - * clearing this interrupt will raise spurious interrupts unless - * CPE is reset. - */ -static irqreturn_t svass_exception_irq(int irq, void *data) -{ - struct wcd_cpe_core *core = data; - u8 status = 0; - - if (!core || !CPE_ERR_IRQ_CB(core)) { - pr_err("%s: Invalid %s\n", - __func__, - (!core) ? "core" : "cdc control"); - return IRQ_HANDLED; - } - - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_STATUS, &status); - - while (status != 0) { - if (status & core->irq_info.cpe_fatal_irqs) { - dev_err(core->dev, - "%s: CPE SSR event,err_status = 0x%02x\n", - __func__, status); - wcd_cpe_ssr_event(core, WCD_CPE_SSR_EVENT); - /* - * If fatal interrupt is received, - * trigger SSR and stop processing - * further interrupts - */ - break; - } - /* - * Mask the interrupt that was raised to - * avoid spurious interrupts - */ - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_MASK, &status); - - /* Clear only the interrupt that was raised */ - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_CLEAR, &status); - dev_err(core->dev, - "%s: err_interrupt status = 0x%x\n", - __func__, status); - - /* Read status for pending interrupts */ - core->cpe_cdc_cb->cpe_err_irq_control(core->codec, - CPE_ERR_IRQ_STATUS, &status); - } - - return IRQ_HANDLED; -} - -/* - * wcd_cpe_cmi_afe_cb: callback called on response to afe commands - * @param: parameter containing the response code, etc - * - * Process the request to the command sent to CPE and wakeup the - * command send wait. - */ -static void wcd_cpe_cmi_afe_cb(const struct cmi_api_notification *param) -{ - struct cmi_hdr *hdr; - struct wcd_cmi_afe_port_data *afe_port_d; - u8 port_id; - - if (!param) { - pr_err("%s: param is null\n", __func__); - return; - } - - if (param->event != CMI_API_MSG) { - pr_err("%s: unhandled event 0x%x\n", - __func__, param->event); - return; - } - - pr_debug("%s: param->result = %d\n", - __func__, param->result); - - hdr = (struct cmi_hdr *) param->message; - - /* - * for AFE cmd response, port id is - * stored at session id field of header - */ - port_id = CMI_HDR_GET_SESSION_ID(hdr); - if (port_id > WCD_CPE_AFE_MAX_PORTS) { - pr_err("%s: invalid port_id %d\n", - __func__, port_id); - return; - } - - afe_port_d = &(afe_ports[port_id]); - - if (hdr->opcode == CPE_CMI_BASIC_RSP_OPCODE) { - - u8 *payload = ((u8 *)param->message) + (sizeof(struct cmi_hdr)); - u8 result = payload[0]; - - afe_port_d->cmd_result = result; - complete(&afe_port_d->afe_cmd_complete); - - } else if (hdr->opcode == CPE_AFE_PORT_CMDRSP_SHARED_MEM_ALLOC) { - - struct cpe_cmdrsp_shmem_alloc *cmdrsp_shmem_alloc = - (struct cpe_cmdrsp_shmem_alloc *) param->message; - - if (cmdrsp_shmem_alloc->addr == 0) { - pr_err("%s: Failed AFE shared mem alloc\n", __func__); - afe_port_d->cmd_result = CMI_SHMEM_ALLOC_FAILED; - } else { - pr_debug("%s AFE shared mem addr = 0x%x\n", - __func__, cmdrsp_shmem_alloc->addr); - afe_port_d->mem_handle = cmdrsp_shmem_alloc->addr; - afe_port_d->cmd_result = 0; - } - complete(&afe_port_d->afe_cmd_complete); - } -} - -/* - * wcd_cpe_initialize_afe_port_data: Initialize all AFE ports - * - * Initialize the data for all the afe ports. Assign the - * afe port state to INIT state. - */ -static void wcd_cpe_initialize_afe_port_data(void) -{ - struct wcd_cmi_afe_port_data *afe_port_d; - int i; - - for (i = 0; i <= WCD_CPE_AFE_MAX_PORTS; i++) { - afe_port_d = &afe_ports[i]; - afe_port_d->port_id = i; - init_completion(&afe_port_d->afe_cmd_complete); - afe_port_d->port_state = AFE_PORT_STATE_INIT; - mutex_init(&afe_port_d->afe_lock); - } -} - -/* - * wcd_cpe_deinitialize_afe_port_data: De-initialize all AFE ports - * - * De-Initialize the data for all the afe ports. Assign the - * afe port state to DEINIT state. - */ -static void wcd_cpe_deinitialize_afe_port_data(void) -{ - struct wcd_cmi_afe_port_data *afe_port_d; - int i; - - for (i = 0; i <= WCD_CPE_AFE_MAX_PORTS; i++) { - afe_port_d = &afe_ports[i]; - afe_port_d->port_state = AFE_PORT_STATE_DEINIT; - mutex_destroy(&afe_port_d->afe_lock); - } -} - -/* - * wcd_cpe_svc_event_cb: callback from cpe services, indicating - * CPE is online or offline. - * @param: parameter / payload for event to be notified - */ -static void wcd_cpe_svc_event_cb(const struct cpe_svc_notification *param) -{ - struct snd_soc_codec *codec; - struct wcd_cpe_core *core; - struct cpe_svc_boot_event *boot_data; - bool active_sessions; - - if (!param) { - pr_err("%s: Invalid event\n", __func__); - return; - } - - codec = param->private_data; - if (!codec) { - pr_err("%s: Invalid handle to codec\n", - __func__); - return; - } - - core = wcd_cpe_get_core_handle(codec); - if (!core) { - pr_err("%s: Invalid handle to core\n", - __func__); - return; - } - - dev_dbg(core->dev, - "%s: event = 0x%x, ssr_type = 0x%x\n", - __func__, param->event, core->ssr_type); - - switch (param->event) { - case CPE_SVC_BOOT: - boot_data = (struct cpe_svc_boot_event *) - param->payload; - core->sfr_buf_addr = boot_data->debug_address; - core->sfr_buf_size = boot_data->debug_buffer_size; - dev_dbg(core->dev, - "%s: CPE booted, sfr_addr = %d, sfr_size = %zu\n", - __func__, core->sfr_buf_addr, - core->sfr_buf_size); - break; - case CPE_SVC_ONLINE: - core->ssr_type = WCD_CPE_ACTIVE; - dev_dbg(core->dev, "%s CPE is now online\n", - __func__); - complete(&core->online_compl); - break; - case CPE_SVC_OFFLINE: - /* - * offline can happen during normal shutdown, - * but we are interested in offline only during - * SSR. - */ - if (core->ssr_type != WCD_CPE_SSR_EVENT && - core->ssr_type != WCD_CPE_BUS_DOWN_EVENT) - break; - - active_sessions = wcd_cpe_lsm_session_active(); - wcd_cpe_change_online_state(core, 0); - complete(&core->offline_compl); - dev_err(core->dev, "%s: CPE is now offline\n", - __func__); - break; - case CPE_SVC_CMI_CLIENTS_DEREG: - - /* - * Only when either CPE SSR is in progress, - * or the bus is down, we need to mark the CPE - * as ready. In all other cases, this event is - * ignored - */ - if (core->ssr_type == WCD_CPE_SSR_EVENT || - core->ssr_type == WCD_CPE_BUS_DOWN_EVENT) - wcd_cpe_set_and_complete(core, - WCD_CPE_BLK_READY); - break; - default: - dev_err(core->dev, - "%s: unhandled notification\n", - __func__); - break; - } -} - -/* - * wcd_cpe_cleanup_irqs: free the irq resources required by cpe - * @core: handle the cpe core - * - * This API will free the IRQs for CPE but does not mask the - * CPE interrupts. If masking is needed, it has to be done - * explicity by caller. - */ -static void wcd_cpe_cleanup_irqs(struct wcd_cpe_core *core) -{ - - struct snd_soc_codec *codec = core->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - - wcd9xxx_free_irq(core_res, - core->irq_info.cpe_engine_irq, - core); - wcd9xxx_free_irq(core_res, - core->irq_info.cpe_err_irq, - core); - -} - -/* - * wcd_cpe_setup_sva_err_intr: setup the irqs for CPE - * @core: handle to wcd_cpe_core - * All interrupts needed for CPE are acquired. If any - * request_irq fails, then all irqs are free'd - */ -static int wcd_cpe_setup_irqs(struct wcd_cpe_core *core) -{ - int ret; - struct snd_soc_codec *codec = core->codec; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - struct wcd9xxx_core_resource *core_res = &wcd9xxx->core_res; - - ret = wcd9xxx_request_irq(core_res, - core->irq_info.cpe_engine_irq, - svass_engine_irq, "SVASS_Engine", core); - if (ret) { - dev_err(core->dev, - "%s: Failed to request svass engine irq\n", - __func__); - goto fail_engine_irq; - } - - /* Make sure all error interrupts are cleared */ - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_CLEAR, - NULL); - - /* Enable required error interrupts */ - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_UNMASK, - NULL); - - ret = wcd9xxx_request_irq(core_res, - core->irq_info.cpe_err_irq, - svass_exception_irq, "SVASS_Exception", core); - if (ret) { - dev_err(core->dev, - "%s: Failed to request svass err irq\n", - __func__); - goto fail_exception_irq; - } - - return 0; - -fail_exception_irq: - wcd9xxx_free_irq(core_res, - core->irq_info.cpe_engine_irq, core); - -fail_engine_irq: - return ret; -} - -static int wcd_cpe_get_cal_index(int32_t cal_type) -{ - int cal_index = -EINVAL; - - if (cal_type == ULP_AFE_CAL_TYPE) - cal_index = WCD_CPE_LSM_CAL_AFE; - else if (cal_type == ULP_LSM_CAL_TYPE) - cal_index = WCD_CPE_LSM_CAL_LSM; - else if (cal_type == ULP_LSM_TOPOLOGY_ID_CAL_TYPE) - cal_index = WCD_CPE_LSM_CAL_TOPOLOGY_ID; - else - pr_err("%s: invalid cal_type %d\n", - __func__, cal_type); - - return cal_index; -} - -static int wcd_cpe_alloc_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = wcd_cpe_get_cal_index(cal_type); - if (cal_index < 0) { - pr_err("%s: invalid caltype %d\n", - __func__, cal_type); - return -EINVAL; - } - - ret = cal_utils_alloc_cal(data_size, data, - core_d->cal_data[cal_index], - 0, NULL); - if (ret < 0) - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - return ret; -} - -static int wcd_cpe_dealloc_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - cal_index = wcd_cpe_get_cal_index(cal_type); - if (cal_index < 0) { - pr_err("%s: invalid caltype %d\n", - __func__, cal_type); - return -EINVAL; - } - - ret = cal_utils_dealloc_cal(data_size, data, - core_d->cal_data[cal_index]); - if (ret < 0) - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - return ret; -} - -static int wcd_cpe_set_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = wcd_cpe_get_cal_index(cal_type); - if (cal_index < 0) { - pr_err("%s: invalid caltype %d\n", - __func__, cal_type); - return -EINVAL; - } - - ret = cal_utils_set_cal(data_size, data, - core_d->cal_data[cal_index], - 0, NULL); - if (ret < 0) - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - return ret; -} - -static int wcd_cpe_cal_init(struct wcd_cpe_core *core) -{ - int ret = 0; - - struct cal_type_info cal_type_info[] = { - {{ULP_AFE_CAL_TYPE, - {wcd_cpe_alloc_cal, wcd_cpe_dealloc_cal, NULL, - wcd_cpe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ULP_LSM_CAL_TYPE, - {wcd_cpe_alloc_cal, wcd_cpe_dealloc_cal, NULL, - wcd_cpe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ULP_LSM_TOPOLOGY_ID_CAL_TYPE, - {wcd_cpe_alloc_cal, wcd_cpe_dealloc_cal, NULL, - wcd_cpe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - - ret = cal_utils_create_cal_types(WCD_CPE_LSM_CAL_MAX, - core->cal_data, - cal_type_info); - if (ret < 0) - pr_err("%s: could not create cal type!\n", - __func__); - return ret; -} - -/* - * wcd_cpe_enable: setup the cpe interrupts and schedule - * the work to download image and bootup the CPE. - * core: handle to cpe core structure - */ -static int wcd_cpe_vote(struct wcd_cpe_core *core, - bool enable) -{ - int ret = 0; - - if (!core) { - pr_err("%s: Invalid handle to core\n", - __func__); - ret = -EINVAL; - goto done; - } - - dev_dbg(core->dev, - "%s: enter, enable = %s, cpe_users = %u\n", - __func__, (enable ? "true" : "false"), - core->cpe_users); - - if (enable) { - core->cpe_users++; - if (core->cpe_users == 1) { - ret = wcd_cpe_enable(core, enable); - if (ret) { - dev_err(core->dev, - "%s: CPE enable failed, err = %d\n", - __func__, ret); - goto done; - } - } else { - dev_dbg(core->dev, - "%s: cpe already enabled, users = %u\n", - __func__, core->cpe_users); - goto done; - } - } else { - core->cpe_users--; - if (core->cpe_users == 0) { - ret = wcd_cpe_enable(core, enable); - if (ret) { - dev_err(core->dev, - "%s: CPE disable failed, err = %d\n", - __func__, ret); - goto done; - } - } else { - dev_dbg(core->dev, - "%s: %u valid users on cpe\n", - __func__, core->cpe_users); - goto done; - } - } - - dev_dbg(core->dev, - "%s: leave, enable = %s, cpe_users = %u\n", - __func__, (enable ? "true" : "false"), - core->cpe_users); - -done: - return ret; -} - -static int wcd_cpe_debugfs_init(struct wcd_cpe_core *core) -{ - int rc = 0; - - struct dentry *dir = debugfs_create_dir("wcd_cpe", NULL); - - if (IS_ERR_OR_NULL(dir)) { - dir = NULL; - rc = -ENODEV; - goto err_create_dir; - } - - if (!debugfs_create_u32("ramdump_enable", 0644, - dir, &ramdump_enable)) { - dev_err(core->dev, "%s: Failed to create debugfs node %s\n", - __func__, "ramdump_enable"); - rc = -ENODEV; - goto err_create_entry; - } - - if (!debugfs_create_file("cpe_ftm_test_trigger", 0200, - dir, core, &cpe_ftm_test_trigger_fops)) { - dev_err(core->dev, "%s: Failed to create debugfs node %s\n", - __func__, "cpe_ftm_test_trigger"); - rc = -ENODEV; - goto err_create_entry; - } - - if (!debugfs_create_u32("cpe_ftm_test_status", 0444, - dir, &cpe_ftm_test_status)) { - dev_err(core->dev, "%s: Failed to create debugfs node %s\n", - __func__, "cpe_ftm_test_status"); - rc = -ENODEV; - goto err_create_entry; - } - -err_create_entry: - debugfs_remove(dir); - -err_create_dir: - return rc; -} - -static ssize_t fw_name_show(struct wcd_cpe_core *core, char *buf) -{ - return snprintf(buf, WCD_CPE_IMAGE_FNAME_MAX, "%s", - core->dyn_fname); -} - -static ssize_t fw_name_store(struct wcd_cpe_core *core, - const char *buf, ssize_t count) -{ - int copy_count = count; - const char *pos; - - pos = memchr(buf, '\n', count); - if (pos) - copy_count = pos - buf; - - if (copy_count > (WCD_CPE_IMAGE_FNAME_MAX - 1)) { - dev_err(core->dev, - "%s: Invalid length %d, max allowed %d\n", - __func__, copy_count, WCD_CPE_IMAGE_FNAME_MAX - 1); - return -EINVAL; - } - - strlcpy(core->dyn_fname, buf, copy_count + 1); - - return count; -} - -WCD_CPE_ATTR(fw_name, 0660, fw_name_show, fw_name_store); - -static ssize_t wcd_cpe_sysfs_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct wcd_cpe_attribute *cpe_attr = to_wcd_cpe_attr(attr); - struct wcd_cpe_core *core = kobj_to_cpe_core(kobj); - ssize_t ret = -EINVAL; - - if (core && cpe_attr->show) - ret = cpe_attr->show(core, buf); - - return ret; -} - -static ssize_t wcd_cpe_sysfs_store(struct kobject *kobj, - struct attribute *attr, const char *buf, - size_t count) -{ - struct wcd_cpe_attribute *cpe_attr = to_wcd_cpe_attr(attr); - struct wcd_cpe_core *core = kobj_to_cpe_core(kobj); - ssize_t ret = -EINVAL; - - if (core && cpe_attr->store) - ret = cpe_attr->store(core, buf, count); - - return ret; -} - -static const struct sysfs_ops wcd_cpe_sysfs_ops = { - .show = wcd_cpe_sysfs_show, - .store = wcd_cpe_sysfs_store, -}; - -static struct kobj_type wcd_cpe_ktype = { - .sysfs_ops = &wcd_cpe_sysfs_ops, -}; - -static int wcd_cpe_sysfs_init(struct wcd_cpe_core *core, int id) -{ - char sysfs_dir_name[WCD_CPE_SYSFS_DIR_MAX_LENGTH]; - int rc = 0; - - snprintf(sysfs_dir_name, WCD_CPE_SYSFS_DIR_MAX_LENGTH, - "%s%d", "wcd_cpe", id); - - rc = kobject_init_and_add(&core->cpe_kobj, &wcd_cpe_ktype, - kernel_kobj, - sysfs_dir_name); - if (unlikely(rc)) { - dev_err(core->dev, - "%s: Failed to add kobject %s, err = %d\n", - __func__, sysfs_dir_name, rc); - goto done; - } - - rc = sysfs_create_file(&core->cpe_kobj, &cpe_attr_fw_name.attr); - if (rc) { - dev_err(core->dev, - "%s: Failed to fw_name sysfs entry to %s\n", - __func__, sysfs_dir_name); - goto fail_create_file; - } - - return 0; - -fail_create_file: - kobject_put(&core->cpe_kobj); -done: - return rc; -} - -static ssize_t cpe_ftm_test_trigger(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -{ - struct wcd_cpe_core *core = file->private_data; - int ret = 0; - - /* Enable the clks for cpe */ - ret = wcd_cpe_enable_cpe_clks(core, true); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE clk enable failed, err = %d\n", - __func__, ret); - goto done; - } - - /* Get the CPE_STATUS */ - ret = cpe_svc_ftm_test(core->cpe_handle, &cpe_ftm_test_status); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE FTM test failed, err = %d\n", - __func__, ret); - if (ret == CPE_SVC_BUSY) { - cpe_ftm_test_status = 1; - ret = 0; - } - } - - /* Disable the clks for cpe */ - ret = wcd_cpe_enable_cpe_clks(core, false); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE clk disable failed, err = %d\n", - __func__, ret); - } - -done: - if (ret < 0) - return ret; - else - return count; -} - -static int wcd_cpe_validate_params( - struct snd_soc_codec *codec, - struct wcd_cpe_params *params) -{ - - if (!codec) { - pr_err("%s: Invalid codec\n", __func__); - return -EINVAL; - } - - if (!params) { - dev_err(codec->dev, - "%s: No params supplied for codec %s\n", - __func__, codec->component.name); - return -EINVAL; - } - - if (!params->codec || !params->get_cpe_core || - !params->cdc_cb) { - dev_err(codec->dev, - "%s: Invalid params for codec %s\n", - __func__, codec->component.name); - return -EINVAL; - } - - return 0; -} - -/* - * wcd_cpe_init: Initialize CPE related structures - * @img_fname: filename for firmware image - * @codec: handle to codec requesting for image download - * @params: parameter structure passed from caller - * - * This API will initialize the cpe core but will not - * download the image or boot the cpe core. - */ -struct wcd_cpe_core *wcd_cpe_init(const char *img_fname, - struct snd_soc_codec *codec, - struct wcd_cpe_params *params) -{ - struct wcd_cpe_core *core; - int ret = 0; - struct snd_card *card = NULL; - struct snd_info_entry *entry = NULL; - char proc_name[WCD_CPE_STATE_MAX_LEN]; - const char *cpe_name = "cpe"; - const char *state_name = "_state"; - const struct cpe_svc_hw_cfg *hw_info; - int id = 0; - - if (wcd_cpe_validate_params(codec, params)) - return NULL; - - core = kzalloc(sizeof(struct wcd_cpe_core), GFP_KERNEL); - if (!core) - return NULL; - - snprintf(core->fname, sizeof(core->fname), "%s", img_fname); - strlcpy(core->dyn_fname, core->fname, WCD_CPE_IMAGE_FNAME_MAX); - - wcd_get_cpe_core = params->get_cpe_core; - - core->codec = params->codec; - core->dev = params->codec->dev; - core->cpe_debug_mode = params->dbg_mode; - - core->cdc_info.major_version = params->cdc_major_ver; - core->cdc_info.minor_version = params->cdc_minor_ver; - core->cdc_info.id = params->cdc_id; - - core->cpe_cdc_cb = params->cdc_cb; - - memcpy(&core->irq_info, ¶ms->cdc_irq_info, - sizeof(core->irq_info)); - - INIT_WORK(&core->load_fw_work, wcd_cpe_load_fw_image); - INIT_WORK(&core->ssr_work, wcd_cpe_ssr_work); - init_completion(&core->offline_compl); - init_completion(&core->ready_compl); - init_completion(&core->online_compl); - init_waitqueue_head(&core->ssr_entry.offline_poll_wait); - mutex_init(&core->ssr_lock); - mutex_init(&core->session_lock); - core->cpe_users = 0; - core->cpe_clk_ref = 0; - - /* - * By default, during probe, it is assumed that - * both CPE hardware block and underlying bus to codec - * are ready - */ - core->ready_status = WCD_CPE_READY_TO_DLOAD; - - core->cpe_handle = cpe_svc_initialize(NULL, &core->cdc_info, - params->cpe_svc_params); - if (!core->cpe_handle) { - dev_err(core->dev, - "%s: failed to initialize cpe services\n", - __func__); - goto fail_cpe_initialize; - } - - core->cpe_reg_handle = cpe_svc_register(core->cpe_handle, - wcd_cpe_svc_event_cb, - CPE_SVC_ONLINE | CPE_SVC_OFFLINE | - CPE_SVC_BOOT | - CPE_SVC_CMI_CLIENTS_DEREG, - "codec cpe handler"); - if (!core->cpe_reg_handle) { - dev_err(core->dev, - "%s: failed to register cpe service\n", - __func__); - goto fail_cpe_register; - } - - card = codec->component.card->snd_card; - snprintf(proc_name, sizeof(proc_name), - "%s%d%s", cpe_name, id, state_name); - entry = snd_info_create_card_entry(card, proc_name, - card->proc_root); - if (entry) { - core->ssr_entry.entry = entry; - core->ssr_entry.offline = 1; - entry->size = WCD_CPE_STATE_MAX_LEN; - entry->content = SNDRV_INFO_CONTENT_DATA; - entry->c.ops = &wcd_cpe_state_proc_ops; - entry->private_data = core; - ret = snd_info_register(entry); - if (ret < 0) { - dev_err(core->dev, - "%s: snd_info_register failed (%d)\n", - __func__, ret); - snd_info_free_entry(entry); - entry = NULL; - } - } else { - dev_err(core->dev, - "%s: Failed to create CPE SSR status entry\n", - __func__); - /* - * Even if SSR entry creation fails, continue - * with image download - */ - } - - core_d = core; - ret = wcd_cpe_cal_init(core); - if (ret < 0) { - dev_err(core->dev, - "%s: CPE calibration init failed, err = %d\n", - __func__, ret); - goto fail_cpe_reset; - } - - wcd_cpe_debugfs_init(core); - - wcd_cpe_sysfs_init(core, id); - - hw_info = cpe_svc_get_hw_cfg(core->cpe_handle); - if (!hw_info) { - dev_err(core->dev, - "%s: hw info not available\n", - __func__); - goto schedule_dload_work; - } else { - core->hw_info.dram_offset = hw_info->DRAM_offset; - core->hw_info.dram_size = hw_info->DRAM_size; - core->hw_info.iram_offset = hw_info->IRAM_offset; - core->hw_info.iram_size = hw_info->IRAM_size; - } - - /* Setup the ramdump device and buffer */ - core->cpe_ramdump_dev = create_ramdump_device("cpe", - core->dev); - if (!core->cpe_ramdump_dev) { - dev_err(core->dev, - "%s: Failed to create ramdump device\n", - __func__); - goto schedule_dload_work; - } - - arch_setup_dma_ops(core->dev, 0, 0, NULL, 0); - core->cpe_dump_v_addr = dma_alloc_coherent(core->dev, - core->hw_info.dram_size, - &core->cpe_dump_addr, - GFP_KERNEL); - if (!core->cpe_dump_v_addr) { - dev_err(core->dev, - "%s: Failed to alloc memory for cpe dump, size = %zd\n", - __func__, core->hw_info.dram_size); - goto schedule_dload_work; - } else { - memset(core->cpe_dump_v_addr, 0, core->hw_info.dram_size); - } - -schedule_dload_work: - core->ssr_type = WCD_CPE_INITIALIZED; - schedule_work(&core->load_fw_work); - return core; - -fail_cpe_reset: - cpe_svc_deregister(core->cpe_handle, core->cpe_reg_handle); - -fail_cpe_register: - cpe_svc_deinitialize(core->cpe_handle); - -fail_cpe_initialize: - kfree(core); - return NULL; -} -EXPORT_SYMBOL(wcd_cpe_init); - -/* - * wcd_cpe_cmi_lsm_callback: callback called from cpe services - * to notify command response for lsm - * service - * @param: param containing the response code and status - * - * This callback is registered with cpe services while registering - * the LSM service - */ -static void wcd_cpe_cmi_lsm_callback(const struct cmi_api_notification *param) -{ - struct cmi_hdr *hdr; - struct cpe_lsm_session *lsm_session; - u8 session_id; - - if (!param) { - pr_err("%s: param is null\n", __func__); - return; - } - - if (param->event != CMI_API_MSG) { - pr_err("%s: unhandled event 0x%x\n", __func__, param->event); - return; - } - - hdr = (struct cmi_hdr *) param->message; - session_id = CMI_HDR_GET_SESSION_ID(hdr); - - if (session_id > WCD_CPE_LSM_MAX_SESSIONS) { - pr_err("%s: invalid lsm session id = %d\n", - __func__, session_id); - return; - } - - lsm_session = lsm_sessions[session_id]; - - if (hdr->opcode == CPE_CMI_BASIC_RSP_OPCODE) { - - u8 *payload = ((u8 *)param->message) + (sizeof(struct cmi_hdr)); - u8 result = payload[0]; - - lsm_session->cmd_err_code = result; - complete(&lsm_session->cmd_comp); - - } else if (hdr->opcode == CPE_LSM_SESSION_CMDRSP_SHARED_MEM_ALLOC) { - - struct cpe_cmdrsp_shmem_alloc *cmdrsp_shmem_alloc = - (struct cpe_cmdrsp_shmem_alloc *) param->message; - - if (cmdrsp_shmem_alloc->addr == 0) { - pr_err("%s: Failed LSM shared mem alloc\n", __func__); - lsm_session->cmd_err_code = CMI_SHMEM_ALLOC_FAILED; - - } else { - - pr_debug("%s LSM shared mem addr = 0x%x\n", - __func__, cmdrsp_shmem_alloc->addr); - lsm_session->lsm_mem_handle = cmdrsp_shmem_alloc->addr; - lsm_session->cmd_err_code = 0; - } - - complete(&lsm_session->cmd_comp); - - } else if (hdr->opcode == CPE_LSM_SESSION_EVENT_DETECTION_STATUS_V2) { - - struct cpe_lsm_event_detect_v2 *event_detect_v2 = - (struct cpe_lsm_event_detect_v2 *) param->message; - - if (!lsm_session->priv_d) { - pr_err("%s: private data is not present\n", - __func__); - return; - } - - pr_debug("%s: event payload, status = %u, size = %u\n", - __func__, event_detect_v2->detection_status, - event_detect_v2->size); - - if (lsm_session->event_cb) - lsm_session->event_cb( - lsm_session->priv_d, - event_detect_v2->detection_status, - event_detect_v2->size, - event_detect_v2->payload); - } -} - -/* - * wcd_cpe_cmi_send_lsm_msg: send a message to lsm service - * @core: handle to cpe core - * @session: session on which to send the message - * @message: actual message containing header and payload - * - * Sends message to lsm service for specified session and wait - * for response back on the message. - * should be called after acquiring session specific mutex - */ -static int wcd_cpe_cmi_send_lsm_msg( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *message) -{ - int ret = 0; - struct cmi_hdr *hdr = message; - - pr_debug("%s: sending message with opcode 0x%x\n", - __func__, hdr->opcode); - - if (unlikely(!wcd_cpe_is_online_state(core))) { - dev_err(core->dev, - "%s: MSG not sent, CPE offline\n", - __func__); - goto done; - } - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, true); - - reinit_completion(&session->cmd_comp); - ret = cmi_send_msg(message); - if (ret) { - pr_err("%s: msg opcode (0x%x) send failed (%d)\n", - __func__, hdr->opcode, ret); - goto rel_bus_vote; - } - - ret = wait_for_completion_timeout(&session->cmd_comp, - CMI_CMD_TIMEOUT); - if (ret > 0) { - pr_debug("%s: command 0x%x, received response 0x%x\n", - __func__, hdr->opcode, session->cmd_err_code); - if (session->cmd_err_code == CMI_SHMEM_ALLOC_FAILED) - session->cmd_err_code = CPE_ENOMEMORY; - if (session->cmd_err_code > 0) - pr_err("%s: CPE returned error[%s]\n", - __func__, cpe_err_get_err_str( - session->cmd_err_code)); - ret = cpe_err_get_lnx_err_code(session->cmd_err_code); - goto rel_bus_vote; - } else { - pr_err("%s: command (0x%x) send timed out\n", - __func__, hdr->opcode); - ret = -ETIMEDOUT; - goto rel_bus_vote; - } - - -rel_bus_vote: - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, false); - -done: - return ret; -} - - -/* - * fill_cmi_header: fill the cmi header with specified values - * - * @hdr: header to be updated with values - * @session_id: session id of the header, - * in case of AFE service it is port_id - * @service_id: afe/lsm, etc - * @version: update the version field in header - * @payload_size: size of the payload following after header - * @opcode: opcode of the message - * @obm_flag: indicates if this header is for obm message - * - */ -static int fill_cmi_header(struct cmi_hdr *hdr, - u8 session_id, u8 service_id, - bool version, u8 payload_size, - u16 opcode, bool obm_flag) -{ - /* sanitize the data */ - if (!IS_VALID_SESSION_ID(session_id) || - !IS_VALID_SERVICE_ID(service_id) || - !IS_VALID_PLD_SIZE(payload_size)) { - pr_err("Invalid header creation request\n"); - return -EINVAL; - } - - CMI_HDR_SET_SESSION(hdr, session_id); - CMI_HDR_SET_SERVICE(hdr, service_id); - if (version) - CMI_HDR_SET_VERSION(hdr, 1); - else - CMI_HDR_SET_VERSION(hdr, 0); - - CMI_HDR_SET_PAYLOAD_SIZE(hdr, payload_size); - - hdr->opcode = opcode; - - if (obm_flag) - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_OUT_BAND); - else - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_IN_BAND); - - return 0; -} - -/* - * fill_lsm_cmd_header_v0_inband: - * Given the header, fill the header with information - * for lsm service, version 0 and inband message - * @hdr: the cmi header to be filled. - * @session_id: ID for the lsm session - * @payload_size: size for cmi message payload - * @opcode: opcode for cmi message - */ -static int fill_lsm_cmd_header_v0_inband(struct cmi_hdr *hdr, - u8 session_id, u8 payload_size, u16 opcode) -{ - return fill_cmi_header(hdr, session_id, - CMI_CPE_LSM_SERVICE_ID, false, - payload_size, opcode, false); -} - -/* - * wcd_cpe_is_valid_lsm_session: - * Check session parameters to identify validity for the sesion - * @core: handle to cpe core - * @session: handle to the lsm session - * @func: invoking function to be printed in error logs - */ -static int wcd_cpe_is_valid_lsm_session(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - const char *func) -{ - if (unlikely(IS_ERR_OR_NULL(core))) { - pr_err("%s: invalid handle to core\n", - func); - return -EINVAL; - } - - if (unlikely(IS_ERR_OR_NULL(session))) { - dev_err(core->dev, "%s: invalid session\n", - func); - return -EINVAL; - } - - if (session->id > WCD_CPE_LSM_MAX_SESSIONS) { - dev_err(core->dev, "%s: invalid session id (%u)\n", - func, session->id); - return -EINVAL; - } - - dev_dbg(core->dev, "%s: session_id = %u\n", - func, session->id); - return 0; -} - -static int wcd_cpe_cmd_lsm_open_tx_v2( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session) -{ - struct cpe_lsm_cmd_open_tx_v2 cmd_open_tx_v2; - struct cal_block_data *top_cal = NULL; - struct audio_cal_info_lsm_top *lsm_top; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - if (core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID] == NULL) { - dev_err(core->dev, - "%s: LSM_TOPOLOGY cal not allocated!\n", - __func__); - return -EINVAL; - } - - mutex_lock(&core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID]->lock); - top_cal = cal_utils_get_only_cal_block( - core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID]); - if (!top_cal) { - dev_err(core->dev, - "%s: Failed to get LSM TOPOLOGY cal block\n", - __func__); - ret = -EINVAL; - goto unlock_cal_mutex; - } - - lsm_top = (struct audio_cal_info_lsm_top *) - top_cal->cal_info; - - if (!lsm_top) { - dev_err(core->dev, - "%s: cal_info for LSM_TOPOLOGY not found\n", - __func__); - ret = -EINVAL; - goto unlock_cal_mutex; - } - - dev_dbg(core->dev, - "%s: topology_id = 0x%x, acdb_id = 0x%x, app_type = 0x%x\n", - __func__, lsm_top->topology, lsm_top->acdb_id, - lsm_top->app_type); - - if (lsm_top->topology == 0) { - dev_err(core->dev, - "%s: topology id not sent for app_type 0x%x\n", - __func__, lsm_top->app_type); - ret = -EINVAL; - goto unlock_cal_mutex; - } - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_open_tx_v2, 0, sizeof(struct cpe_lsm_cmd_open_tx_v2)); - if (fill_lsm_cmd_header_v0_inband(&cmd_open_tx_v2.hdr, - session->id, OPEN_V2_CMD_PAYLOAD_SIZE, - CPE_LSM_SESSION_CMD_OPEN_TX_V2)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_open_tx_v2.topology_id = lsm_top->topology; - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_open_tx_v2); - if (ret) - dev_err(core->dev, - "%s: failed to send open_tx_v2 cmd, err = %d\n", - __func__, ret); - else - session->is_topology_used = true; -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - -unlock_cal_mutex: - mutex_unlock(&core->cal_data[WCD_CPE_LSM_CAL_TOPOLOGY_ID]->lock); - return ret; -} - -/* - * wcd_cpe_cmd_lsm_open_tx: compose and send lsm open command - * @core_handle: handle to cpe core - * @session: session for which the command needs to be sent - * @app_id: application id part of the command - * @sample_rate: sample rate for this session - */ -static int wcd_cpe_cmd_lsm_open_tx(void *core_handle, - struct cpe_lsm_session *session, - u16 app_id, u16 sample_rate) -{ - struct cpe_lsm_cmd_open_tx cmd_open_tx; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - /* Try to open with topology first */ - ret = wcd_cpe_cmd_lsm_open_tx_v2(core, session); - if (!ret) - goto done; - - dev_dbg(core->dev, "%s: Try open_tx without topology\n", - __func__); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_open_tx, 0, sizeof(struct cpe_lsm_cmd_open_tx)); - if (fill_lsm_cmd_header_v0_inband(&cmd_open_tx.hdr, - session->id, OPEN_CMD_PAYLOAD_SIZE, - CPE_LSM_SESSION_CMD_OPEN_TX)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_open_tx.app_id = app_id; - cmd_open_tx.sampling_rate = sample_rate; - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_open_tx); - if (ret) - dev_err(core->dev, - "%s: failed to send open_tx cmd, err = %d\n", - __func__, ret); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -done: - return ret; -} - -/* - * wcd_cpe_cmd_close_tx: compose and send lsm close command - * @core_handle: handle to cpe core - * @session: session for which the command needs to be sent - */ -static int wcd_cpe_cmd_lsm_close_tx(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_close_tx; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_close_tx, 0, sizeof(cmd_close_tx)); - if (fill_lsm_cmd_header_v0_inband(&cmd_close_tx, session->id, - 0, CPE_LSM_SESSION_CMD_CLOSE_TX)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_close_tx); - if (ret) - dev_err(core->dev, - "%s: lsm close_tx cmd failed, err = %d\n", - __func__, ret); - else - session->is_topology_used = false; -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_cmd_shmem_alloc: compose and send lsm shared - * memory allocation command - * @core_handle: handle to cpe core - * @session: session for which the command needs to be sent - * @size: size of memory to be allocated - */ -static int wcd_cpe_cmd_lsm_shmem_alloc(void *core_handle, - struct cpe_lsm_session *session, - u32 size) -{ - struct cpe_cmd_shmem_alloc cmd_shmem_alloc; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_shmem_alloc, 0, sizeof(cmd_shmem_alloc)); - if (fill_lsm_cmd_header_v0_inband(&cmd_shmem_alloc.hdr, session->id, - SHMEM_ALLOC_CMD_PLD_SIZE, - CPE_LSM_SESSION_CMD_SHARED_MEM_ALLOC)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_shmem_alloc.size = size; - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_shmem_alloc); - if (ret) - dev_err(core->dev, - "%s: lsm_shmem_alloc cmd send fail, %d\n", - __func__, ret); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_cmd_lsm_shmem_dealloc: deallocate the shared memory - * for the specified session - * @core_handle: handle to cpe core - * @session: session for which memory needs to be deallocated. - */ -static int wcd_cpe_cmd_lsm_shmem_dealloc(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cpe_cmd_shmem_dealloc cmd_dealloc; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_dealloc, 0, sizeof(cmd_dealloc)); - if (fill_lsm_cmd_header_v0_inband(&cmd_dealloc.hdr, session->id, - SHMEM_DEALLOC_CMD_PLD_SIZE, - CPE_LSM_SESSION_CMD_SHARED_MEM_DEALLOC)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_dealloc.addr = session->lsm_mem_handle; - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_dealloc); - if (ret) { - dev_err(core->dev, - "%s: lsm_shmem_dealloc cmd failed, rc %d\n", - __func__, ret); - goto end_ret; - } - - memset(&session->lsm_mem_handle, 0, - sizeof(session->lsm_mem_handle)); - -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_send_lsm_cal: send the calibration for lsm service - * from acdb to the cpe - * @core: handle to cpe core - * @session: session for which the calibration needs to be set. - */ -static int wcd_cpe_send_lsm_cal( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session) -{ - - u8 *msg_pld; - struct cmi_hdr *hdr; - struct cal_block_data *lsm_cal = NULL; - void *inb_msg; - int rc = 0; - - if (core->cal_data[WCD_CPE_LSM_CAL_LSM] == NULL) { - pr_err("%s: LSM cal not allocated!\n", __func__); - return -EINVAL; - } - - mutex_lock(&core->cal_data[WCD_CPE_LSM_CAL_LSM]->lock); - lsm_cal = cal_utils_get_only_cal_block( - core->cal_data[WCD_CPE_LSM_CAL_LSM]); - if (!lsm_cal) { - pr_err("%s: failed to get lsm cal block\n", __func__); - rc = -EINVAL; - goto unlock_cal_mutex; - } - - if (lsm_cal->cal_data.size == 0) { - dev_dbg(core->dev, "%s: No LSM cal to send\n", - __func__); - rc = 0; - goto unlock_cal_mutex; - } - - inb_msg = kzalloc(sizeof(struct cmi_hdr) + lsm_cal->cal_data.size, - GFP_KERNEL); - if (!inb_msg) { - rc = -ENOMEM; - goto unlock_cal_mutex; - } - - hdr = (struct cmi_hdr *) inb_msg; - - rc = fill_lsm_cmd_header_v0_inband(hdr, session->id, - lsm_cal->cal_data.size, - CPE_LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: invalid params for header, err = %d\n", - __func__, rc); - goto free_msg; - } - - msg_pld = ((u8 *) inb_msg) + sizeof(struct cmi_hdr); - memcpy(msg_pld, lsm_cal->cal_data.kvaddr, - lsm_cal->cal_data.size); - - rc = wcd_cpe_cmi_send_lsm_msg(core, session, inb_msg); - if (rc) - pr_err("%s: acdb lsm_params send failed, err = %d\n", - __func__, rc); - -free_msg: - kfree(inb_msg); - -unlock_cal_mutex: - mutex_unlock(&core->cal_data[WCD_CPE_LSM_CAL_LSM]->lock); - return rc; - -} - -static void wcd_cpe_set_param_data(struct cpe_param_data *param_d, - struct cpe_lsm_ids *ids, u32 p_size, - u32 set_param_cmd) -{ - param_d->module_id = ids->module_id; - param_d->param_id = ids->param_id; - - switch (set_param_cmd) { - case CPE_LSM_SESSION_CMD_SET_PARAMS_V2: - param_d->p_size.param_size = p_size; - break; - case CPE_LSM_SESSION_CMD_SET_PARAMS: - default: - param_d->p_size.sr.param_size = - (u16) p_size; - param_d->p_size.sr.reserved = 0; - break; - } -} - -static int wcd_cpe_send_param_epd_thres(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids) -{ - struct snd_lsm_ep_det_thres *ep_det_data; - struct cpe_lsm_param_epd_thres epd_cmd; - struct cmi_hdr *msg_hdr = &epd_cmd.hdr; - struct cpe_param_data *param_d = - &epd_cmd.param; - int rc; - - memset(&epd_cmd, 0, sizeof(epd_cmd)); - ep_det_data = (struct snd_lsm_ep_det_thres *) data; - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_EPD_THRES_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_EPD_THRES_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - epd_cmd.minor_version = 1; - epd_cmd.epd_begin = ep_det_data->epd_begin; - epd_cmd.epd_end = ep_det_data->epd_end; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &epd_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(EPD Threshold) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_opmode(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids) -{ - struct snd_lsm_detect_mode *opmode_d; - struct cpe_lsm_param_opmode opmode_cmd; - struct cmi_hdr *msg_hdr = &opmode_cmd.hdr; - struct cpe_param_data *param_d = - &opmode_cmd.param; - int rc; - - memset(&opmode_cmd, 0, sizeof(opmode_cmd)); - opmode_d = (struct snd_lsm_detect_mode *) data; - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_OPMODE_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_OPMODE_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - opmode_cmd.minor_version = 1; - if (opmode_d->mode == LSM_MODE_KEYWORD_ONLY_DETECTION) - opmode_cmd.mode = 1; - else - opmode_cmd.mode = 3; - - if (opmode_d->detect_failure) - opmode_cmd.mode |= 0x04; - - opmode_cmd.reserved = 0; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &opmode_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(operation_mode) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_gain(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids) -{ - struct snd_lsm_gain *gain_d; - struct cpe_lsm_param_gain gain_cmd; - struct cmi_hdr *msg_hdr = &gain_cmd.hdr; - struct cpe_param_data *param_d = - &gain_cmd.param; - int rc; - - memset(&gain_cmd, 0, sizeof(gain_cmd)); - gain_d = (struct snd_lsm_gain *) data; - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_GAIN_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_GAIN_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - gain_cmd.minor_version = 1; - gain_cmd.gain = gain_d->gain; - gain_cmd.reserved = 0; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &gain_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(lsm_gain) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_connectport(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, struct cpe_lsm_ids *ids, u16 port_id) -{ - struct cpe_lsm_param_connectport con_port_cmd; - struct cmi_hdr *msg_hdr = &con_port_cmd.hdr; - struct cpe_param_data *param_d = - &con_port_cmd.param; - int rc; - - memset(&con_port_cmd, 0, sizeof(con_port_cmd)); - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_CMD_CONNECTPORT_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - wcd_cpe_set_param_data(param_d, ids, - CPE_CONNECTPORT_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - con_port_cmd.minor_version = 1; - con_port_cmd.afe_port_id = port_id; - con_port_cmd.reserved = 0; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, &con_port_cmd); - if (unlikely(rc)) - dev_err(core->dev, - "%s: set_param(connect_port) failed, rc %dn", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - return rc; -} - -static int wcd_cpe_send_param_conf_levels( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - struct cpe_lsm_ids *ids) -{ - struct cpe_lsm_conf_level conf_level_data; - struct cmi_hdr *hdr = &(conf_level_data.hdr); - struct cpe_param_data *param_d = &(conf_level_data.param); - u8 pld_size = 0; - u8 pad_bytes = 0; - void *message; - int ret = 0; - - memset(&conf_level_data, 0, sizeof(conf_level_data)); - - pld_size = (sizeof(struct cpe_lsm_conf_level) - sizeof(struct cmi_hdr)); - pld_size += session->num_confidence_levels; - pad_bytes = ((4 - (pld_size % 4)) % 4); - pld_size += pad_bytes; - - fill_cmi_header(hdr, session->id, CMI_CPE_LSM_SERVICE_ID, - false, pld_size, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2, false); - - wcd_cpe_set_param_data(param_d, ids, - pld_size - sizeof(struct cpe_param_data), - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - conf_level_data.num_active_models = session->num_confidence_levels; - - message = kzalloc(sizeof(struct cpe_lsm_conf_level) + - conf_level_data.num_active_models + pad_bytes, - GFP_KERNEL); - if (!message) { - pr_err("%s: no memory for conf_level\n", __func__); - return -ENOMEM; - } - - memcpy(message, &conf_level_data, - sizeof(struct cpe_lsm_conf_level)); - memcpy(((u8 *) message) + sizeof(struct cpe_lsm_conf_level), - session->conf_levels, conf_level_data.num_active_models); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, message); - if (ret) - pr_err("%s: lsm_set_conf_levels failed, err = %d\n", - __func__, ret); - kfree(message); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -static int wcd_cpe_send_param_snd_model(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, struct cpe_lsm_ids *ids) -{ - int ret = 0; - struct cmi_obm_msg obm_msg; - struct cpe_param_data *param_d; - - - ret = fill_cmi_header(&obm_msg.hdr, session->id, - CMI_CPE_LSM_SERVICE_ID, 0, 20, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2, true); - if (ret) { - dev_err(core->dev, - "%s: Invalid parameters, rc = %d\n", - __func__, ret); - goto err_ret; - } - - obm_msg.pld.version = 0; - obm_msg.pld.size = session->snd_model_size; - obm_msg.pld.data_ptr.kvaddr = session->snd_model_data; - obm_msg.pld.mem_handle = session->lsm_mem_handle; - - param_d = (struct cpe_param_data *) session->snd_model_data; - wcd_cpe_set_param_data(param_d, ids, - (session->snd_model_size - sizeof(*param_d)), - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &obm_msg); - if (ret) - dev_err(core->dev, - "%s: snd_model_register failed, %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - -err_ret: - return ret; -} - -static int wcd_cpe_send_param_dereg_model( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - struct cpe_lsm_ids *ids) -{ - struct cmi_hdr *hdr; - struct cpe_param_data *param_d; - u8 *message; - u32 pld_size; - int rc = 0; - - pld_size = sizeof(*hdr) + sizeof(*param_d); - - message = kzalloc(pld_size, GFP_KERNEL); - if (!message) - return -ENOMEM; - - hdr = (struct cmi_hdr *) message; - param_d = (struct cpe_param_data *) - (((u8 *) message) + sizeof(*hdr)); - - if (fill_lsm_cmd_header_v0_inband(hdr, - session->id, - sizeof(*param_d), - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - wcd_cpe_set_param_data(param_d, ids, 0, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, message); - if (rc) - dev_err(core->dev, - "%s: snd_model_deregister failed, %d\n", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - kfree(message); - return rc; -} - -static int wcd_cpe_send_custom_param( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - void *data, u32 msg_size) -{ - u8 *msg; - struct cmi_hdr *hdr; - u8 *msg_pld; - int rc; - - if (msg_size > CMI_INBAND_MESSAGE_SIZE) { - dev_err(core->dev, - "%s: out of band custom params not supported\n", - __func__); - return -EINVAL; - } - - msg = kzalloc(sizeof(*hdr) + msg_size, GFP_KERNEL); - if (!msg) - return -ENOMEM; - - hdr = (struct cmi_hdr *) msg; - msg_pld = msg + sizeof(struct cmi_hdr); - - if (fill_lsm_cmd_header_v0_inband(hdr, - session->id, - msg_size, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - rc = -EINVAL; - goto err_ret; - } - - memcpy(msg_pld, data, msg_size); - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - rc = wcd_cpe_cmi_send_lsm_msg(core, session, msg); - if (rc) - dev_err(core->dev, - "%s: custom params send failed, err = %d\n", - __func__, rc); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -err_ret: - kfree(msg); - return rc; -} - -static int wcd_cpe_set_one_param(void *core_handle, - struct cpe_lsm_session *session, struct lsm_params_info *p_info, - void *data, uint32_t param_type) -{ - struct wcd_cpe_core *core = core_handle; - int rc = 0; - struct cpe_lsm_ids ids; - - memset(&ids, 0, sizeof(ids)); - ids.module_id = p_info->module_id; - ids.param_id = p_info->param_id; - - switch (param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: - rc = wcd_cpe_send_param_epd_thres(core, session, - data, &ids); - break; - case LSM_OPERATION_MODE: - rc = wcd_cpe_send_param_opmode(core, session, data, &ids); - break; - case LSM_GAIN: - rc = wcd_cpe_send_param_gain(core, session, data, &ids); - break; - case LSM_MIN_CONFIDENCE_LEVELS: - rc = wcd_cpe_send_param_conf_levels(core, session, &ids); - break; - case LSM_REG_SND_MODEL: - rc = wcd_cpe_send_param_snd_model(core, session, &ids); - break; - case LSM_DEREG_SND_MODEL: - rc = wcd_cpe_send_param_dereg_model(core, session, &ids); - break; - case LSM_CUSTOM_PARAMS: - rc = wcd_cpe_send_custom_param(core, session, - data, p_info->param_size); - break; - default: - pr_err("%s: wrong param_type 0x%x\n", - __func__, param_type); - } - - if (rc) - dev_err(core->dev, - "%s: send_param(%d) failed, err %d\n", - __func__, param_type, rc); - return rc; -} - -/* - * wcd_cpe_lsm_set_params: set the parameters for lsm service - * @core: handle to cpe core - * @session: session for which the parameters are to be set - * @detect_mode: mode for detection - * @detect_failure: flag indicating failure detection enabled/disabled - * - */ -static int wcd_cpe_lsm_set_params(struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, bool detect_failure) -{ - struct cpe_lsm_ids ids; - struct snd_lsm_detect_mode det_mode; - - int ret = 0; - - /* Send lsm calibration */ - ret = wcd_cpe_send_lsm_cal(core, session); - if (ret) { - pr_err("%s: fail to sent acdb cal, err = %d", - __func__, ret); - goto err_ret; - } - - /* Send operation mode */ - ids.module_id = CPE_LSM_MODULE_ID_VOICE_WAKEUP; - ids.param_id = CPE_LSM_PARAM_ID_OPERATION_MODE; - det_mode.mode = detect_mode; - det_mode.detect_failure = detect_failure; - ret = wcd_cpe_send_param_opmode(core, session, - &det_mode, &ids); - if (ret) - dev_err(core->dev, - "%s: Failed to set opmode, err=%d\n", - __func__, ret); - -err_ret: - return ret; -} - -static int wcd_cpe_lsm_set_data(void *core_handle, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, - bool detect_failure) -{ - struct wcd_cpe_core *core = core_handle; - struct cpe_lsm_ids ids; - int ret = 0; - - if (session->num_confidence_levels > 0) { - ret = wcd_cpe_lsm_set_params(core, session, detect_mode, - detect_failure); - if (ret) { - dev_err(core->dev, - "%s: lsm set params failed, rc = %d\n", - __func__, ret); - goto err_ret; - } - - ids.module_id = CPE_LSM_MODULE_ID_VOICE_WAKEUP; - ids.param_id = CPE_LSM_PARAM_ID_MIN_CONFIDENCE_LEVELS; - ret = wcd_cpe_send_param_conf_levels(core, session, &ids); - if (ret) { - dev_err(core->dev, - "%s: lsm confidence levels failed, rc = %d\n", - __func__, ret); - goto err_ret; - } - } else { - dev_dbg(core->dev, - "%s: no conf levels to set\n", - __func__); - } - -err_ret: - return ret; -} - -/* - * wcd_cpe_lsm_reg_snd_model: register the sound model for listen - * @session: session for which to register the sound model - * @detect_mode: detection mode, user dependent/independent - * @detect_failure: flag to indicate if failure detection is enabled - * - * The memory required for sound model should be pre-allocated on CPE - * before this function is invoked. - */ -static int wcd_cpe_lsm_reg_snd_model(void *core_handle, - struct cpe_lsm_session *session, - enum lsm_detection_mode detect_mode, - bool detect_failure) -{ - int ret = 0; - struct cmi_obm_msg obm_msg; - struct wcd_cpe_core *core = core_handle; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - ret = wcd_cpe_lsm_set_data(core_handle, session, - detect_mode, detect_failure); - if (ret) { - dev_err(core->dev, - "%s: fail to set lsm data, err = %d\n", - __func__, ret); - return ret; - } - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - ret = fill_cmi_header(&obm_msg.hdr, session->id, - CMI_CPE_LSM_SERVICE_ID, 0, 20, - CPE_LSM_SESSION_CMD_REGISTER_SOUND_MODEL, true); - if (ret) { - dev_err(core->dev, - "%s: Invalid parameters, rc = %d\n", - __func__, ret); - goto err_ret; - } - - obm_msg.pld.version = 0; - obm_msg.pld.size = session->snd_model_size; - obm_msg.pld.data_ptr.kvaddr = session->snd_model_data; - obm_msg.pld.mem_handle = session->lsm_mem_handle; - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &obm_msg); - if (ret) - dev_err(core->dev, - "%s: snd_model_register failed, %d\n", - __func__, ret); -err_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_lsm_dereg_snd_model: deregister the sound model for listen - * @core_handle: handle to cpe core - * @session: session for which to deregister the sound model - * - */ -static int wcd_cpe_lsm_dereg_snd_model(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_dereg_snd_model; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_dereg_snd_model, 0, sizeof(cmd_dereg_snd_model)); - if (fill_lsm_cmd_header_v0_inband(&cmd_dereg_snd_model, session->id, - 0, CPE_LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_dereg_snd_model); - if (ret) - dev_err(core->dev, - "%s: failed to send dereg_snd_model cmd\n", - __func__); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_lsm_get_afe_out_port_id: get afe output port id - * @core_handle: handle to the CPE core - * @session: session for which port id needs to get - */ -static int wcd_cpe_lsm_get_afe_out_port_id(void *core_handle, - struct cpe_lsm_session *session) -{ - struct wcd_cpe_core *core = core_handle; - struct snd_soc_codec *codec; - int rc = 0; - - if (!core || !core->codec) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!core) ? "core" : "codec"); - rc = -EINVAL; - goto done; - } - - if (!session) { - dev_err(core->dev, "%s: Invalid session\n", - __func__); - rc = -EINVAL; - goto done; - } - - if (!core->cpe_cdc_cb || - !core->cpe_cdc_cb->get_afe_out_port_id) { - session->afe_out_port_id = WCD_CPE_AFE_OUT_PORT_2; - dev_dbg(core->dev, - "%s: callback not defined, default port_id = %d\n", - __func__, session->afe_out_port_id); - goto done; - } - - codec = core->codec; - rc = core->cpe_cdc_cb->get_afe_out_port_id(codec, - &session->afe_out_port_id); - if (rc) { - dev_err(core->dev, - "%s: failed to get port id, err = %d\n", - __func__, rc); - goto done; - } - dev_dbg(core->dev, "%s: port_id: %d\n", __func__, - session->afe_out_port_id); - -done: - return rc; -} - -/* - * wcd_cpe_cmd_lsm_start: send the start command to lsm - * @core_handle: handle to the CPE core - * @session: session for which start command to be sent - * - */ -static int wcd_cpe_cmd_lsm_start(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_lsm_start; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_lsm_start, 0, sizeof(struct cmi_hdr)); - if (fill_lsm_cmd_header_v0_inband(&cmd_lsm_start, session->id, 0, - CPE_LSM_SESSION_CMD_START)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_lsm_start); - if (ret) - dev_err(core->dev, "failed to send lsm_start cmd\n"); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_cmd_lsm_stop: send the stop command for LSM service - * @core_handle: handle to the cpe core - * @session: session for which stop command to be sent - * - */ -static int wcd_cpe_cmd_lsm_stop(void *core_handle, - struct cpe_lsm_session *session) -{ - struct cmi_hdr cmd_lsm_stop; - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - ret = wcd_cpe_is_valid_lsm_session(core, session, - __func__); - if (ret) - return ret; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&cmd_lsm_stop, 0, sizeof(struct cmi_hdr)); - if (fill_lsm_cmd_header_v0_inband(&cmd_lsm_stop, session->id, 0, - CPE_LSM_SESSION_CMD_STOP)) { - ret = -EINVAL; - goto end_ret; - } - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cmd_lsm_stop); - if (ret) - dev_err(core->dev, - "%s: failed to send lsm_stop cmd\n", - __func__); -end_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; - -} - -/* - * wcd_cpe_alloc_lsm_session: allocate a lsm session - * @core: handle to wcd_cpe_core - * @lsm_priv_d: lsm private data - */ -static struct cpe_lsm_session *wcd_cpe_alloc_lsm_session( - void *core_handle, void *client_data, - void (*event_cb)(void *, u8, u8, u8 *)) -{ - struct cpe_lsm_session *session; - int i, session_id = -1; - struct wcd_cpe_core *core = core_handle; - bool afe_register_service = false; - int ret = 0; - - /* - * Even if multiple listen sessions can be - * allocated, the AFE service registration - * should be done only once as CPE can only - * have one instance of AFE service. - * - * If this is the first session to be allocated, - * only then register the afe service. - */ - WCD_CPE_GRAB_LOCK(&core->session_lock, "session_lock"); - if (!wcd_cpe_lsm_session_active()) - afe_register_service = true; - - for (i = 1; i <= WCD_CPE_LSM_MAX_SESSIONS; i++) { - if (!lsm_sessions[i]) { - session_id = i; - break; - } - } - - if (session_id < 0) { - dev_err(core->dev, - "%s: max allowed sessions already allocated\n", - __func__); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return NULL; - } - - ret = wcd_cpe_vote(core, true); - if (ret) { - dev_err(core->dev, - "%s: Failed to enable cpe, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return NULL; - } - - session = kzalloc(sizeof(struct cpe_lsm_session), GFP_KERNEL); - if (!session) - goto err_session_alloc; - - session->id = session_id; - session->event_cb = event_cb; - session->cmi_reg_handle = cmi_register(wcd_cpe_cmi_lsm_callback, - CMI_CPE_LSM_SERVICE_ID); - if (!session->cmi_reg_handle) { - dev_err(core->dev, - "%s: Failed to register LSM service with CMI\n", - __func__); - goto err_ret; - } - session->priv_d = client_data; - mutex_init(&session->lsm_lock); - if (afe_register_service) { - /* Register for AFE Service */ - core->cmi_afe_handle = cmi_register(wcd_cpe_cmi_afe_cb, - CMI_CPE_AFE_SERVICE_ID); - wcd_cpe_initialize_afe_port_data(); - if (!core->cmi_afe_handle) { - dev_err(core->dev, - "%s: Failed to register AFE service with CMI\n", - __func__); - goto err_afe_svc_reg; - } - - /* Once AFE service is registered, send the mode command */ - ret = wcd_cpe_afe_svc_cmd_mode(core, - AFE_SVC_EXPLICIT_PORT_START); - if (ret) - goto err_afe_mode_cmd; - } - - session->lsm_mem_handle = 0; - init_completion(&session->cmd_comp); - - lsm_sessions[session_id] = session; - - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return session; - -err_afe_mode_cmd: - cmi_deregister(core->cmi_afe_handle); - -err_afe_svc_reg: - cmi_deregister(session->cmi_reg_handle); - mutex_destroy(&session->lsm_lock); - -err_ret: - kfree(session); - -err_session_alloc: - wcd_cpe_vote(core, false); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return NULL; -} - -/* - * wcd_cpe_lsm_config_lab_latency: send lab latency value - * @core: handle to wcd_cpe_core - * @session: lsm session - * @latency: the value of latency for lab setup in msec - */ -static int wcd_cpe_lsm_config_lab_latency( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session, - u32 latency) -{ - int ret = 0, pld_size = CPE_PARAM_LSM_LAB_LATENCY_SIZE; - struct cpe_lsm_lab_latency_config cpe_lab_latency; - struct cpe_lsm_lab_config *lab_lat = &cpe_lab_latency.latency_cfg; - struct cpe_param_data *param_d = &lab_lat->param; - struct cpe_lsm_ids ids; - - if (fill_lsm_cmd_header_v0_inband(&cpe_lab_latency.hdr, session->id, - (u8) pld_size, CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - pr_err("%s: Failed to create header\n", __func__); - return -EINVAL; - } - if (latency == 0x00 || latency > WCD_CPE_LAB_MAX_LATENCY) { - pr_err("%s: Invalid latency %u\n", - __func__, latency); - return -EINVAL; - } - - lab_lat->latency = latency; - lab_lat->minor_ver = 1; - ids.module_id = CPE_LSM_MODULE_ID_LAB; - ids.param_id = CPE_LSM_PARAM_ID_LAB_CONFIG; - wcd_cpe_set_param_data(param_d, &ids, - PARAM_SIZE_LSM_LATENCY_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - pr_debug("%s: Module 0x%x Param 0x%x size %zu pld_size 0x%x\n", - __func__, lab_lat->param.module_id, - lab_lat->param.param_id, PARAM_SIZE_LSM_LATENCY_SIZE, - pld_size); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cpe_lab_latency); - if (ret != 0) - pr_err("%s: lsm_set_params failed, error = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - return ret; -} - -/* - * wcd_cpe_lsm_lab_control: enable/disable lab - * @core: handle to wcd_cpe_core - * @session: lsm session - * @enable: Indicates whether to enable / disable lab - */ -static int wcd_cpe_lsm_lab_control( - void *core_handle, - struct cpe_lsm_session *session, - bool enable) -{ - struct wcd_cpe_core *core = core_handle; - int ret = 0, pld_size = CPE_PARAM_SIZE_LSM_LAB_CONTROL; - struct cpe_lsm_control_lab cpe_lab_enable; - struct cpe_lsm_lab_enable *lab_enable = &cpe_lab_enable.lab_enable; - struct cpe_param_data *param_d = &lab_enable->param; - struct cpe_lsm_ids ids; - - pr_debug("%s: enter payload_size = %d Enable %d\n", - __func__, pld_size, enable); - - memset(&cpe_lab_enable, 0, sizeof(cpe_lab_enable)); - - if (fill_lsm_cmd_header_v0_inband(&cpe_lab_enable.hdr, session->id, - (u8) pld_size, CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - return -EINVAL; - } - if (enable == true) - lab_enable->enable = 1; - else - lab_enable->enable = 0; - - ids.module_id = CPE_LSM_MODULE_ID_LAB; - ids.param_id = CPE_LSM_PARAM_ID_LAB_ENABLE; - wcd_cpe_set_param_data(param_d, &ids, - PARAM_SIZE_LSM_CONTROL_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - pr_debug("%s: Module 0x%x, Param 0x%x size %zu pld_size 0x%x\n", - __func__, lab_enable->param.module_id, - lab_enable->param.param_id, PARAM_SIZE_LSM_CONTROL_SIZE, - pld_size); - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &cpe_lab_enable); - if (ret != 0) { - pr_err("%s: lsm_set_params failed, error = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - goto done; - } - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - - if (lab_enable->enable) - ret = wcd_cpe_lsm_config_lab_latency(core, session, - WCD_CPE_LAB_MAX_LATENCY); -done: - return ret; -} - -/* - * wcd_cpe_lsm_eob: stop lab - * @core: handle to wcd_cpe_core - * @session: lsm session to be deallocated - */ -static int wcd_cpe_lsm_eob( - struct wcd_cpe_core *core, - struct cpe_lsm_session *session) -{ - int ret = 0; - struct cmi_hdr lab_eob; - - if (fill_lsm_cmd_header_v0_inband(&lab_eob, session->id, - 0, CPE_LSM_SESSION_CMD_EOB)) { - return -EINVAL; - } - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &lab_eob); - if (ret != 0) - pr_err("%s: lsm_set_params failed\n", __func__); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); - - return ret; -} - -/* - * wcd_cpe_dealloc_lsm_session: deallocate lsm session - * @core: handle to wcd_cpe_core - * @session: lsm session to be deallocated - */ -static int wcd_cpe_dealloc_lsm_session(void *core_handle, - struct cpe_lsm_session *session) -{ - struct wcd_cpe_core *core = core_handle; - int ret = 0; - - WCD_CPE_GRAB_LOCK(&core->session_lock, "session_lock"); - if (!session) { - dev_err(core->dev, - "%s: Invalid lsm session\n", __func__); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return -EINVAL; - } - - dev_dbg(core->dev, "%s: session %d being deallocated\n", - __func__, session->id); - if (session->id > WCD_CPE_LSM_MAX_SESSIONS) { - dev_err(core->dev, - "%s: Wrong session id %d max allowed = %d\n", - __func__, session->id, - WCD_CPE_LSM_MAX_SESSIONS); - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return -EINVAL; - } - - cmi_deregister(session->cmi_reg_handle); - mutex_destroy(&session->lsm_lock); - lsm_sessions[session->id] = NULL; - kfree(session); - - if (!wcd_cpe_lsm_session_active()) { - cmi_deregister(core->cmi_afe_handle); - core->cmi_afe_handle = NULL; - wcd_cpe_deinitialize_afe_port_data(); - } - - ret = wcd_cpe_vote(core, false); - if (ret) - dev_dbg(core->dev, - "%s: Failed to un-vote cpe, err = %d\n", - __func__, ret); - - WCD_CPE_REL_LOCK(&core->session_lock, "session_lock"); - return ret; -} - -static int wcd_cpe_lab_ch_setup(void *core_handle, - struct cpe_lsm_session *session, - enum wcd_cpe_event event) -{ - struct wcd_cpe_core *core = core_handle; - struct snd_soc_codec *codec; - int rc = 0; - u8 cpe_intr_bits; - - if (!core || !core->codec) { - pr_err("%s: Invalid handle to %s\n", - __func__, - (!core) ? "core" : "codec"); - rc = EINVAL; - goto done; - } - - if (!core->cpe_cdc_cb || - !core->cpe_cdc_cb->cdc_ext_clk || - !core->cpe_cdc_cb->lab_cdc_ch_ctl) { - dev_err(core->dev, - "%s: Invalid codec callbacks\n", - __func__); - rc = -EINVAL; - goto done; - } - - codec = core->codec; - dev_dbg(core->dev, - "%s: event = 0x%x\n", - __func__, event); - - switch (event) { - case WCD_CPE_PRE_ENABLE: - rc = core->cpe_cdc_cb->cdc_ext_clk(codec, true, false); - if (rc) { - dev_err(core->dev, - "%s: failed to enable cdc clk, err = %d\n", - __func__, rc); - goto done; - } - - rc = core->cpe_cdc_cb->lab_cdc_ch_ctl(codec, - true); - if (rc) { - dev_err(core->dev, - "%s: failed to enable cdc port, err = %d\n", - __func__, rc); - rc = core->cpe_cdc_cb->cdc_ext_clk(codec, false, false); - goto done; - } - - break; - - case WCD_CPE_POST_ENABLE: - rc = cpe_svc_toggle_lab(core->cpe_handle, true); - if (rc) - dev_err(core->dev, - "%s: Failed to enable lab\n", __func__); - break; - - case WCD_CPE_PRE_DISABLE: - /* - * Mask the non-fatal interrupts in CPE as they will - * be generated during lab teardown and may flood. - */ - cpe_intr_bits = ~(core->irq_info.cpe_fatal_irqs & 0xFF); - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_MASK, - &cpe_intr_bits); - - rc = core->cpe_cdc_cb->lab_cdc_ch_ctl(codec, - false); - if (rc) - dev_err(core->dev, - "%s: failed to disable cdc port, err = %d\n", - __func__, rc); - break; - - case WCD_CPE_POST_DISABLE: - rc = wcd_cpe_lsm_eob(core, session); - if (rc) - dev_err(core->dev, - "%s: eob send failed, err = %d\n", - __func__, rc); - - /* Continue teardown even if eob failed */ - rc = cpe_svc_toggle_lab(core->cpe_handle, false); - if (rc) - dev_err(core->dev, - "%s: Failed to disable lab\n", __func__); - - /* Continue with disabling even if toggle lab fails */ - rc = core->cpe_cdc_cb->cdc_ext_clk(codec, false, false); - if (rc) - dev_err(core->dev, - "%s: failed to disable cdc clk, err = %d\n", - __func__, rc); - - /* Unmask non-fatal CPE interrupts */ - cpe_intr_bits = ~(core->irq_info.cpe_fatal_irqs & 0xFF); - if (CPE_ERR_IRQ_CB(core)) - core->cpe_cdc_cb->cpe_err_irq_control( - core->codec, - CPE_ERR_IRQ_UNMASK, - &cpe_intr_bits); - break; - - default: - dev_err(core->dev, - "%s: Invalid event 0x%x\n", - __func__, event); - rc = -EINVAL; - break; - } - -done: - return rc; -} - -static int wcd_cpe_lsm_set_fmt_cfg(void *core_handle, - struct cpe_lsm_session *session) -{ - int ret; - struct cpe_lsm_output_format_cfg out_fmt_cfg; - struct wcd_cpe_core *core = core_handle; - - ret = wcd_cpe_is_valid_lsm_session(core, session, __func__); - if (ret) - goto done; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - - memset(&out_fmt_cfg, 0, sizeof(out_fmt_cfg)); - if (fill_lsm_cmd_header_v0_inband(&out_fmt_cfg.hdr, - session->id, OUT_FMT_CFG_CMD_PAYLOAD_SIZE, - CPE_LSM_SESSION_CMD_TX_BUFF_OUTPUT_CONFIG)) { - ret = -EINVAL; - goto err_ret; - } - - out_fmt_cfg.format = session->out_fmt_cfg.format; - out_fmt_cfg.packing = session->out_fmt_cfg.pack_mode; - out_fmt_cfg.data_path_events = session->out_fmt_cfg.data_path_events; - - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &out_fmt_cfg); - if (ret) - dev_err(core->dev, - "%s: lsm_set_output_format_cfg failed, err = %d\n", - __func__, ret); - -err_ret: - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -done: - return ret; -} - -static void wcd_cpe_snd_model_offset(void *core_handle, - struct cpe_lsm_session *session, size_t *offset) -{ - *offset = sizeof(struct cpe_param_data); -} - -static int wcd_cpe_lsm_set_media_fmt_params(void *core_handle, - struct cpe_lsm_session *session, - struct lsm_hw_params *param) -{ - struct cpe_lsm_media_fmt_param media_fmt; - struct cmi_hdr *msg_hdr = &media_fmt.hdr; - struct wcd_cpe_core *core = core_handle; - struct cpe_param_data *param_d = &media_fmt.param; - struct cpe_lsm_ids ids; - int ret; - - memset(&media_fmt, 0, sizeof(media_fmt)); - if (fill_lsm_cmd_header_v0_inband(msg_hdr, - session->id, - CPE_MEDIA_FMT_PLD_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2)) { - ret = -EINVAL; - goto done; - } - - memset(&ids, 0, sizeof(ids)); - ids.module_id = CPE_LSM_MODULE_FRAMEWORK; - ids.param_id = CPE_LSM_PARAM_ID_MEDIA_FMT; - - wcd_cpe_set_param_data(param_d, &ids, CPE_MEDIA_FMT_PARAM_SIZE, - CPE_LSM_SESSION_CMD_SET_PARAMS_V2); - - media_fmt.minor_version = 1; - media_fmt.sample_rate = param->sample_rate; - media_fmt.num_channels = param->num_chs; - media_fmt.bit_width = param->bit_width; - - WCD_CPE_GRAB_LOCK(&session->lsm_lock, "lsm"); - ret = wcd_cpe_cmi_send_lsm_msg(core, session, &media_fmt); - if (ret) - dev_err(core->dev, - "%s: Set_param(media_format) failed, err=%d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&session->lsm_lock, "lsm"); -done: - return ret; -} - -static int wcd_cpe_lsm_set_port(void *core_handle, - struct cpe_lsm_session *session, void *data) -{ - u32 port_id; - int ret; - struct cpe_lsm_ids ids; - struct wcd_cpe_core *core = core_handle; - - ret = wcd_cpe_is_valid_lsm_session(core, session, __func__); - if (ret) - goto done; - - if (!data) { - dev_err(core->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - port_id = *(u32 *)data; - dev_dbg(core->dev, "%s: port_id: %d\n", __func__, port_id); - - memset(&ids, 0, sizeof(ids)); - ids.module_id = LSM_MODULE_ID_FRAMEWORK; - ids.param_id = LSM_PARAM_ID_CONNECT_TO_PORT; - - ret = wcd_cpe_send_param_connectport(core, session, NULL, - &ids, port_id); - if (ret) - dev_err(core->dev, - "%s: send_param_connectport failed, err %d\n", - __func__, ret); -done: - return ret; -} - -/* - * wcd_cpe_get_lsm_ops: register lsm driver to codec - * @lsm_ops: structure with lsm callbacks - * @codec: codec to which this lsm driver is registered to - */ -int wcd_cpe_get_lsm_ops(struct wcd_cpe_lsm_ops *lsm_ops) -{ - lsm_ops->lsm_alloc_session = wcd_cpe_alloc_lsm_session; - lsm_ops->lsm_dealloc_session = wcd_cpe_dealloc_lsm_session; - lsm_ops->lsm_open_tx = wcd_cpe_cmd_lsm_open_tx; - lsm_ops->lsm_close_tx = wcd_cpe_cmd_lsm_close_tx; - lsm_ops->lsm_shmem_alloc = wcd_cpe_cmd_lsm_shmem_alloc; - lsm_ops->lsm_shmem_dealloc = wcd_cpe_cmd_lsm_shmem_dealloc; - lsm_ops->lsm_register_snd_model = wcd_cpe_lsm_reg_snd_model; - lsm_ops->lsm_deregister_snd_model = wcd_cpe_lsm_dereg_snd_model; - lsm_ops->lsm_get_afe_out_port_id = wcd_cpe_lsm_get_afe_out_port_id; - lsm_ops->lsm_start = wcd_cpe_cmd_lsm_start; - lsm_ops->lsm_stop = wcd_cpe_cmd_lsm_stop; - lsm_ops->lsm_lab_control = wcd_cpe_lsm_lab_control; - lsm_ops->lab_ch_setup = wcd_cpe_lab_ch_setup; - lsm_ops->lsm_set_data = wcd_cpe_lsm_set_data; - lsm_ops->lsm_set_fmt_cfg = wcd_cpe_lsm_set_fmt_cfg; - lsm_ops->lsm_set_one_param = wcd_cpe_set_one_param; - lsm_ops->lsm_get_snd_model_offset = wcd_cpe_snd_model_offset; - lsm_ops->lsm_set_media_fmt_params = wcd_cpe_lsm_set_media_fmt_params; - lsm_ops->lsm_set_port = wcd_cpe_lsm_set_port; - - return 0; -} -EXPORT_SYMBOL(wcd_cpe_get_lsm_ops); - -static int fill_afe_cmd_header(struct cmi_hdr *hdr, u8 port_id, - u16 opcode, u8 pld_size, - bool obm_flag) -{ - CMI_HDR_SET_SESSION(hdr, port_id); - CMI_HDR_SET_SERVICE(hdr, CMI_CPE_AFE_SERVICE_ID); - - CMI_HDR_SET_PAYLOAD_SIZE(hdr, pld_size); - - hdr->opcode = opcode; - - if (obm_flag) - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_OUT_BAND); - else - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_IN_BAND); - - return 0; -} - -/* - * wcd_cpe_cmi_send_afe_msg: send message to AFE service - * @core: wcd cpe core handle - * @port_cfg: configuration data for the afe port - * for which this message is to be sent - * @message: actual message with header and payload - * - * Port specific lock needs to be acquired before this - * function can be invoked - */ -static int wcd_cpe_cmi_send_afe_msg( - struct wcd_cpe_core *core, - struct wcd_cmi_afe_port_data *port_d, - void *message) -{ - int ret = 0; - struct cmi_hdr *hdr = message; - - pr_debug("%s: sending message with opcode 0x%x\n", - __func__, hdr->opcode); - - if (unlikely(!wcd_cpe_is_online_state(core))) { - dev_err(core->dev, "%s: CPE offline\n", __func__); - return 0; - } - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, true); - - ret = cmi_send_msg(message); - if (ret) { - pr_err("%s: cmd 0x%x send failed, err = %d\n", - __func__, hdr->opcode, ret); - goto rel_bus_vote; - } - - ret = wait_for_completion_timeout(&port_d->afe_cmd_complete, - CMI_CMD_TIMEOUT); - if (ret > 0) { - pr_debug("%s: command 0x%x, received response 0x%x\n", - __func__, hdr->opcode, port_d->cmd_result); - if (port_d->cmd_result == CMI_SHMEM_ALLOC_FAILED) - port_d->cmd_result = CPE_ENOMEMORY; - if (port_d->cmd_result > 0) - pr_err("%s: CPE returned error[%s]\n", - __func__, cpe_err_get_err_str( - port_d->cmd_result)); - ret = cpe_err_get_lnx_err_code(port_d->cmd_result); - goto rel_bus_vote; - } else { - pr_err("%s: command 0x%x send timed out\n", - __func__, hdr->opcode); - ret = -ETIMEDOUT; - goto rel_bus_vote; - } - -rel_bus_vote: - reinit_completion(&port_d->afe_cmd_complete); - - if (CMI_HDR_GET_OBM_FLAG(hdr)) - wcd_cpe_bus_vote_max_bw(core, false); - - return ret; -} - - - -/* - * wcd_cpe_afe_shmem_alloc: allocate the cpe memory for afe service - * @core: handle to cpe core - * @port_cfg: configuration data for the port which needs - * memory to be allocated on CPE - * @size: size of the memory to be allocated - */ -static int wcd_cpe_afe_shmem_alloc( - struct wcd_cpe_core *core, - struct wcd_cmi_afe_port_data *port_d, - u32 size) -{ - struct cpe_cmd_shmem_alloc cmd_shmem_alloc; - int ret = 0; - - pr_debug("%s: enter: size = %d\n", __func__, size); - - memset(&cmd_shmem_alloc, 0, sizeof(cmd_shmem_alloc)); - if (fill_afe_cmd_header(&cmd_shmem_alloc.hdr, port_d->port_id, - CPE_AFE_PORT_CMD_SHARED_MEM_ALLOC, - SHMEM_ALLOC_CMD_PLD_SIZE, false)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_shmem_alloc.size = size; - - ret = wcd_cpe_cmi_send_afe_msg(core, port_d, &cmd_shmem_alloc); - if (ret) { - pr_err("%s: afe_shmem_alloc fail,ret = %d\n", - __func__, ret); - goto end_ret; - } - - pr_debug("%s: completed %s, mem_handle = 0x%x\n", - __func__, "CPE_AFE_CMD_SHARED_MEM_ALLOC", - port_d->mem_handle); - -end_ret: - return ret; -} - -/* - * wcd_cpe_afe_shmem_dealloc: deallocate the cpe memory for - * afe service - * @core: handle to cpe core - * @port_d: configuration data for the port which needs - * memory to be deallocated on CPE - * The memory handle to be de-allocated is saved in the - * port configuration data - */ -static int wcd_cpe_afe_shmem_dealloc( - struct wcd_cpe_core *core, - struct wcd_cmi_afe_port_data *port_d) -{ - struct cpe_cmd_shmem_dealloc cmd_dealloc; - int ret = 0; - - pr_debug("%s: enter, port_id = %d\n", - __func__, port_d->port_id); - - memset(&cmd_dealloc, 0, sizeof(cmd_dealloc)); - if (fill_afe_cmd_header(&cmd_dealloc.hdr, port_d->port_id, - CPE_AFE_PORT_CMD_SHARED_MEM_DEALLOC, - SHMEM_DEALLOC_CMD_PLD_SIZE, false)) { - ret = -EINVAL; - goto end_ret; - } - - cmd_dealloc.addr = port_d->mem_handle; - ret = wcd_cpe_cmi_send_afe_msg(core, port_d, &cmd_dealloc); - if (ret) { - pr_err("failed to send shmem_dealloc cmd\n"); - goto end_ret; - } - memset(&port_d->mem_handle, 0, - sizeof(port_d->mem_handle)); - -end_ret: - return ret; -} - -/* - * wcd_cpe_send_afe_cal: send the acdb calibration to AFE port - * @core: handle to cpe core - * @port_d: configuration data for the port for which the - * calibration needs to be appplied - */ -static int wcd_cpe_send_afe_cal(void *core_handle, - struct wcd_cmi_afe_port_data *port_d) -{ - - struct cal_block_data *afe_cal = NULL; - struct wcd_cpe_core *core = core_handle; - struct cmi_obm_msg obm_msg; - void *inb_msg = NULL; - void *msg; - int rc = 0; - bool is_obm_msg; - - if (core->cal_data[WCD_CPE_LSM_CAL_AFE] == NULL) { - pr_err("%s: LSM cal not allocated!\n", - __func__); - rc = -EINVAL; - goto rel_cal_mutex; - } - - mutex_lock(&core->cal_data[WCD_CPE_LSM_CAL_AFE]->lock); - afe_cal = cal_utils_get_only_cal_block( - core->cal_data[WCD_CPE_LSM_CAL_AFE]); - if (!afe_cal) { - pr_err("%s: failed to get afe cal block\n", - __func__); - rc = -EINVAL; - goto rel_cal_mutex; - } - - if (afe_cal->cal_data.size == 0) { - dev_dbg(core->dev, "%s: No AFE cal to send\n", - __func__); - rc = 0; - goto rel_cal_mutex; - } - - is_obm_msg = (afe_cal->cal_data.size > - CMI_INBAND_MESSAGE_SIZE) ? true : false; - - if (is_obm_msg) { - struct cmi_hdr *hdr = &(obm_msg.hdr); - struct cmi_obm *pld = &(obm_msg.pld); - - rc = wcd_cpe_afe_shmem_alloc(core, port_d, - afe_cal->cal_data.size); - if (rc) { - dev_err(core->dev, - "%s: AFE shmem alloc fail %d\n", - __func__, rc); - goto rel_cal_mutex; - } - - rc = fill_afe_cmd_header(hdr, port_d->port_id, - CPE_AFE_CMD_SET_PARAM, - CPE_AFE_PARAM_PAYLOAD_SIZE, - true); - if (rc) { - dev_err(core->dev, - "%s: invalid params for header, err = %d\n", - __func__, rc); - wcd_cpe_afe_shmem_dealloc(core, port_d); - goto rel_cal_mutex; - } - - pld->version = 0; - pld->size = afe_cal->cal_data.size; - pld->data_ptr.kvaddr = afe_cal->cal_data.kvaddr; - pld->mem_handle = port_d->mem_handle; - msg = &obm_msg; - - } else { - u8 *msg_pld; - struct cmi_hdr *hdr; - - inb_msg = kzalloc(sizeof(struct cmi_hdr) + - afe_cal->cal_data.size, - GFP_KERNEL); - if (!inb_msg) { - dev_err(core->dev, - "%s: no memory for afe cal inband\n", - __func__); - rc = -ENOMEM; - goto rel_cal_mutex; - } - - hdr = (struct cmi_hdr *) inb_msg; - - rc = fill_afe_cmd_header(hdr, port_d->port_id, - CPE_AFE_CMD_SET_PARAM, - CPE_AFE_PARAM_PAYLOAD_SIZE, - false); - if (rc) { - dev_err(core->dev, - "%s: invalid params for header, err = %d\n", - __func__, rc); - kfree(inb_msg); - inb_msg = NULL; - goto rel_cal_mutex; - } - - msg_pld = ((u8 *) inb_msg) + sizeof(struct cmi_hdr); - memcpy(msg_pld, afe_cal->cal_data.kvaddr, - afe_cal->cal_data.size); - - msg = inb_msg; - } - - rc = wcd_cpe_cmi_send_afe_msg(core, port_d, msg); - if (rc) - pr_err("%s: afe cal for listen failed, rc = %d\n", - __func__, rc); - - if (is_obm_msg) { - wcd_cpe_afe_shmem_dealloc(core, port_d); - port_d->mem_handle = 0; - } else { - kfree(inb_msg); - inb_msg = NULL; - } - -rel_cal_mutex: - mutex_unlock(&core->cal_data[WCD_CPE_LSM_CAL_AFE]->lock); - return rc; -} - -/* - * wcd_cpe_is_valid_port: check validity of afe port id - * @core: handle to core to check for validity - * @afe_cfg: client provided afe configuration - * @func: function name invoking this validity check, - * used for logging purpose only. - */ -static int wcd_cpe_is_valid_port(struct wcd_cpe_core *core, - struct wcd_cpe_afe_port_cfg *afe_cfg, - const char *func) -{ - if (unlikely(IS_ERR_OR_NULL(core))) { - pr_err("%s: Invalid core handle\n", func); - return -EINVAL; - } - - if (afe_cfg->port_id > WCD_CPE_AFE_MAX_PORTS) { - dev_err(core->dev, - "%s: invalid afe port (%u)\n", - func, afe_cfg->port_id); - return -EINVAL; - } - - dev_dbg(core->dev, - "%s: port_id = %u\n", - func, afe_cfg->port_id); - - return 0; -} - -static int wcd_cpe_afe_svc_cmd_mode(void *core_handle, - u8 mode) -{ - struct cpe_afe_svc_cmd_mode afe_mode; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret; - - afe_port_d = &afe_ports[0]; - /* - * AFE SVC mode command is for the service and not port - * specific, hence use AFE port as 0 so the command will - * be applied to all AFE ports on CPE. - */ - afe_port_d->port_id = 0; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - memset(&afe_mode, 0, sizeof(afe_mode)); - if (fill_afe_cmd_header(&afe_mode.hdr, afe_port_d->port_id, - CPE_AFE_SVC_CMD_LAB_MODE, - CPE_AFE_CMD_MODE_PAYLOAD_SIZE, - false)) { - ret = -EINVAL; - goto err_ret; - } - - afe_mode.mode = mode; - - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &afe_mode); - if (ret) - dev_err(core->dev, - "%s: afe_svc_mode cmd failed, err = %d\n", - __func__, ret); - -err_ret: - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -static int wcd_cpe_afe_cmd_port_cfg(void *core_handle, - struct wcd_cpe_afe_port_cfg *afe_cfg) -{ - struct cpe_afe_cmd_port_cfg port_cfg_cmd; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret; - - ret = wcd_cpe_is_valid_port(core, afe_cfg, __func__); - if (ret) - goto done; - - afe_port_d = &afe_ports[afe_cfg->port_id]; - afe_port_d->port_id = afe_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - memset(&port_cfg_cmd, 0, sizeof(port_cfg_cmd)); - if (fill_afe_cmd_header(&port_cfg_cmd.hdr, - afe_cfg->port_id, - CPE_AFE_PORT_CMD_GENERIC_CONFIG, - CPE_AFE_CMD_PORT_CFG_PAYLOAD_SIZE, - false)) { - ret = -EINVAL; - goto err_ret; - } - - port_cfg_cmd.bit_width = afe_cfg->bit_width; - port_cfg_cmd.num_channels = afe_cfg->num_channels; - port_cfg_cmd.sample_rate = afe_cfg->sample_rate; - - if (afe_port_d->port_id == CPE_AFE_PORT_3_TX) - port_cfg_cmd.buffer_size = WCD_CPE_EC_PP_BUF_SIZE; - else - port_cfg_cmd.buffer_size = AFE_OUT_BUF_SIZE(afe_cfg->bit_width, - afe_cfg->sample_rate); - - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &port_cfg_cmd); - if (ret) - dev_err(core->dev, - "%s: afe_port_config failed, err = %d\n", - __func__, ret); - -err_ret: - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); -done: - return ret; -} - -/* - * wcd_cpe_afe_set_params: set the parameters for afe port - * @afe_cfg: configuration data for the port for which the - * parameters are to be set - */ -static int wcd_cpe_afe_set_params(void *core_handle, - struct wcd_cpe_afe_port_cfg *afe_cfg, bool afe_mad_ctl) -{ - struct cpe_afe_params afe_params; - struct cpe_afe_hw_mad_ctrl *hw_mad_ctrl = &afe_params.hw_mad_ctrl; - struct cpe_afe_port_cfg *port_cfg = &afe_params.port_cfg; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0, pld_size = 0; - - ret = wcd_cpe_is_valid_port(core, afe_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[afe_cfg->port_id]; - afe_port_d->port_id = afe_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - ret = wcd_cpe_send_afe_cal(core, afe_port_d); - if (ret) { - dev_err(core->dev, - "%s: afe acdb cal send failed, err = %d\n", - __func__, ret); - goto err_ret; - } - - pld_size = CPE_AFE_PARAM_PAYLOAD_SIZE; - memset(&afe_params, 0, sizeof(afe_params)); - - if (fill_afe_cmd_header(&afe_params.hdr, - afe_cfg->port_id, - CPE_AFE_CMD_SET_PARAM, - (u8) pld_size, false)) { - ret = -EINVAL; - goto err_ret; - } - - hw_mad_ctrl->param.module_id = CPE_AFE_MODULE_HW_MAD; - hw_mad_ctrl->param.param_id = CPE_AFE_PARAM_ID_HW_MAD_CTL; - hw_mad_ctrl->param.p_size.sr.param_size = PARAM_SIZE_AFE_HW_MAD_CTRL; - hw_mad_ctrl->param.p_size.sr.reserved = 0; - hw_mad_ctrl->minor_version = 1; - hw_mad_ctrl->mad_type = MAD_TYPE_AUDIO; - hw_mad_ctrl->mad_enable = afe_mad_ctl; - - port_cfg->param.module_id = CPE_AFE_MODULE_AUDIO_DEV_INTERFACE; - port_cfg->param.param_id = CPE_AFE_PARAM_ID_GENERIC_PORT_CONFIG; - port_cfg->param.p_size.sr.param_size = PARAM_SIZE_AFE_PORT_CFG; - port_cfg->param.p_size.sr.reserved = 0; - port_cfg->minor_version = 1; - port_cfg->bit_width = afe_cfg->bit_width; - port_cfg->num_channels = afe_cfg->num_channels; - port_cfg->sample_rate = afe_cfg->sample_rate; - - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &afe_params); - if (ret) - dev_err(core->dev, - "%s: afe_port_config failed, err = %d\n", - __func__, ret); -err_ret: - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_start: send the start command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be started. - */ -static int wcd_cpe_afe_port_start(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(struct cmi_hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_START, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_port_start cmd failed, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_stop: send stop command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be stopped. - */ -static int wcd_cpe_afe_port_stop(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_STOP, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_stop cmd failed, err = %d\n", - __func__, ret); - - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_suspend: send suspend command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be suspended. - */ -static int wcd_cpe_afe_port_suspend(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(struct cmi_hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_SUSPEND, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_suspend cmd failed, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; -} - -/* - * wcd_cpe_afe_port_resume: send the resume command to afe service - * @core_handle: handle to the cpe core - * @port_cfg: configuration data for the afe port which needs - * to be resumed. - */ -static int wcd_cpe_afe_port_resume(void *core_handle, - struct wcd_cpe_afe_port_cfg *port_cfg) -{ - struct cmi_hdr hdr; - struct wcd_cpe_core *core = core_handle; - struct wcd_cmi_afe_port_data *afe_port_d; - int ret = 0; - - ret = wcd_cpe_is_valid_port(core, port_cfg, __func__); - if (ret) - return ret; - - afe_port_d = &afe_ports[port_cfg->port_id]; - afe_port_d->port_id = port_cfg->port_id; - - WCD_CPE_GRAB_LOCK(&afe_port_d->afe_lock, "afe"); - - memset(&hdr, 0, sizeof(hdr)); - fill_afe_cmd_header(&hdr, port_cfg->port_id, - CPE_AFE_PORT_CMD_RESUME, - 0, false); - ret = wcd_cpe_cmi_send_afe_msg(core, afe_port_d, &hdr); - if (ret) - dev_err(core->dev, - "%s: afe_resume cmd failed, err = %d\n", - __func__, ret); - WCD_CPE_REL_LOCK(&afe_port_d->afe_lock, "afe"); - return ret; - -} - -/* - * wcd_cpe_register_afe_driver: register lsm driver to codec - * @cpe_ops: structure with lsm callbacks - * @codec: codec to which this lsm driver is registered to - */ -int wcd_cpe_get_afe_ops(struct wcd_cpe_afe_ops *afe_ops) -{ - afe_ops->afe_set_params = wcd_cpe_afe_set_params; - afe_ops->afe_port_start = wcd_cpe_afe_port_start; - afe_ops->afe_port_stop = wcd_cpe_afe_port_stop; - afe_ops->afe_port_suspend = wcd_cpe_afe_port_suspend; - afe_ops->afe_port_resume = wcd_cpe_afe_port_resume; - afe_ops->afe_port_cmd_cfg = wcd_cpe_afe_cmd_port_cfg; - - return 0; -} -EXPORT_SYMBOL(wcd_cpe_get_afe_ops); - -MODULE_DESCRIPTION("WCD CPE Core"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd_cpe_core.h b/techpack/audio/asoc/codecs/wcd_cpe_core.h deleted file mode 100644 index 269c5f2a5b00..000000000000 --- a/techpack/audio/asoc/codecs/wcd_cpe_core.h +++ /dev/null @@ -1,243 +0,0 @@ -/* Copyright (c) 2013-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef WCD_CPE_CORE_H -#define WCD_CPE_CORE_H - -#include -#include -#include "wcd_cpe_services.h" - -#define WCD_CPE_LAB_MAX_LATENCY 250 -#define WCD_CPE_MAD_SLIM_CHANNEL 140 - -/* Indicates CPE block is ready for image re-download */ -#define WCD_CPE_BLK_READY (1 << 0) -/* Indicates the underlying bus is ready */ -#define WCD_CPE_BUS_READY (1 << 1) - -/* - * only when the underlying bus and CPE block both are ready, - * the state will be ready to download - */ -#define WCD_CPE_READY_TO_DLOAD \ - (WCD_CPE_BLK_READY | WCD_CPE_BUS_READY) - -#define WCD_CPE_LOAD_IMEM (1 << 0) -#define WCD_CPE_LOAD_DATA (1 << 1) -#define WCD_CPE_LOAD_ALL \ - (WCD_CPE_LOAD_IMEM | WCD_CPE_LOAD_DATA) - -#define WCD_CPE_IMAGE_FNAME_MAX 64 - -#define WCD_CPE_AFE_OUT_PORT_2 2 -#define WCD_CPE_AFE_OUT_PORT_4 4 - -enum { - WCD_CPE_LSM_CAL_AFE = 0, - WCD_CPE_LSM_CAL_LSM, - WCD_CPE_LSM_CAL_TOPOLOGY_ID, - WCD_CPE_LSM_CAL_MAX, -}; - -enum cpe_err_irq_cntl_type { - CPE_ERR_IRQ_MASK = 0, - CPE_ERR_IRQ_UNMASK, - CPE_ERR_IRQ_CLEAR, - CPE_ERR_IRQ_STATUS, -}; - -struct wcd_cpe_cdc_cb { - /* codec provided callback to enable RCO */ - int (*cdc_clk_en)(struct snd_soc_codec *, bool); - - /* callback for FLL setup for codec */ - int (*cpe_clk_en)(struct snd_soc_codec *, bool); - int (*cdc_ext_clk)(struct snd_soc_codec *codec, int enable, bool dapm); - int (*lab_cdc_ch_ctl)(struct snd_soc_codec *codec, u8 event); - int (*get_afe_out_port_id)(struct snd_soc_codec *codec, u16 *port_id); - int (*bus_vote_bw)(struct snd_soc_codec *codec, - bool vote); - - /* Callback to control the cpe error interrupt mask/status/clear */ - int (*cpe_err_irq_control)(struct snd_soc_codec *codec, - enum cpe_err_irq_cntl_type cntl_type, - u8 *status); -}; - -enum wcd_cpe_ssr_state_event { - /* Indicates CPE is initialized */ - WCD_CPE_INITIALIZED = 0, - /* Indicates that IMEM is downloaded to CPE */ - WCD_CPE_IMEM_DOWNLOADED, - /* Indicates CPE is enabled */ - WCD_CPE_ENABLED, - /* Indicates that CPE is currently active */ - WCD_CPE_ACTIVE, - /* Event from underlying bus notifying bus is down */ - WCD_CPE_BUS_DOWN_EVENT, - /* Event from CPE block, notifying CPE is down */ - WCD_CPE_SSR_EVENT, - /* Event from underlying bus notifying bus is up */ - WCD_CPE_BUS_UP_EVENT, -}; - -struct wcd_cpe_ssr_entry { - int offline; - u32 offline_change; - wait_queue_head_t offline_poll_wait; - struct snd_info_entry *entry; -}; - -struct wcd_cpe_irq_info { - int cpe_engine_irq; - int cpe_err_irq; - u8 cpe_fatal_irqs; -}; - -struct wcd_cpe_hw_info { - u32 dram_offset; - size_t dram_size; - u32 iram_offset; - size_t iram_size; -}; - -struct wcd_cpe_core { - /* handle to cpe services */ - void *cpe_handle; - - /* registration handle to cpe services */ - void *cpe_reg_handle; - - /* cmi registration handle for afe service */ - void *cmi_afe_handle; - - /* handle to codec */ - struct snd_soc_codec *codec; - - /* codec device */ - struct device *dev; - - /* firmware image file name */ - char fname[WCD_CPE_IMAGE_FNAME_MAX]; - - /* firmware image file name from sysfs */ - char dyn_fname[WCD_CPE_IMAGE_FNAME_MAX]; - - /* codec information needed by cpe services */ - struct cpe_svc_codec_info_v1 cdc_info; - - /* work to perform image download */ - struct work_struct load_fw_work; - - /* flag to indicate mode in which cpe needs to be booted */ - int cpe_debug_mode; - - /* callbacks for codec specific implementation */ - const struct wcd_cpe_cdc_cb *cpe_cdc_cb; - - /* work to handle CPE SSR*/ - struct work_struct ssr_work; - - /* PM handle for suspend mode during SSR */ - struct pm_qos_request pm_qos_req; - - /* completion event indicating CPE OFFLINE */ - struct completion offline_compl; - - /* entry into snd card procfs indicating cpe status */ - struct wcd_cpe_ssr_entry ssr_entry; - - /* - * completion event to signal CPE is - * ready for image re-download - */ - struct completion ready_compl; - - /* maintains the status for cpe ssr */ - u8 ready_status; - - /* Indicate SSR type */ - enum wcd_cpe_ssr_state_event ssr_type; - - /* mutex to protect cpe ssr status variables */ - struct mutex ssr_lock; - - /* mutex to protect cpe session status variables */ - struct mutex session_lock; - - /* Store the calibration data needed for cpe */ - struct cal_type_data *cal_data[WCD_CPE_LSM_CAL_MAX]; - - /* completion event to signal CPE is online */ - struct completion online_compl; - - /* reference counter for cpe usage */ - u8 cpe_users; - - /* Ramdump support */ - void *cpe_ramdump_dev; - struct ramdump_segment cpe_ramdump_seg; - dma_addr_t cpe_dump_addr; - void *cpe_dump_v_addr; - - /* SFR support */ - u32 sfr_buf_addr; - size_t sfr_buf_size; - - /* IRQ information for CPE interrupts */ - struct wcd_cpe_irq_info irq_info; - - /* Kobject for sysfs entry */ - struct kobject cpe_kobj; - - /* Reference count for cpe clk*/ - int cpe_clk_ref; - - /* codec based hardware info */ - struct wcd_cpe_hw_info hw_info; -}; - -struct wcd_cpe_params { - struct snd_soc_codec *codec; - struct wcd_cpe_core * (*get_cpe_core)( - struct snd_soc_codec *); - const struct wcd_cpe_cdc_cb *cdc_cb; - int dbg_mode; - u16 cdc_major_ver; - u16 cdc_minor_ver; - u32 cdc_id; - - struct wcd_cpe_irq_info cdc_irq_info; - - struct cpe_svc_init_param *cpe_svc_params; -}; - -#if IS_ENABLED(CONFIG_SND_SOC_WCD_CPE) -int wcd_cpe_ssr_event(void *core_handle, - enum wcd_cpe_ssr_state_event event); -struct wcd_cpe_core *wcd_cpe_init(const char *img_fname, -struct snd_soc_codec *codec, struct wcd_cpe_params *params); -#else /* CONFIG_SND_SOC_WCD_CPE */ -static inline int wcd_cpe_ssr_event(void *core_handle, - enum wcd_cpe_ssr_state_event event) -{ - return 0; -} -static inline struct wcd_cpe_core *wcd_cpe_init(const char *img_fname, - struct snd_soc_codec *codec, - struct wcd_cpe_params *params) -{ - return NULL; -} -#endif /* CONFIG_SND_SOC_WCD_CPE */ -#endif diff --git a/techpack/audio/asoc/codecs/wcd_cpe_services.c b/techpack/audio/asoc/codecs/wcd_cpe_services.c deleted file mode 100644 index e584cf05a6ef..000000000000 --- a/techpack/audio/asoc/codecs/wcd_cpe_services.c +++ /dev/null @@ -1,2727 +0,0 @@ -/* Copyright (c) 2014-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcd9335_registers.h" -#include "core.h" -#include "cpe_cmi.h" -#include "wcd_cpe_services.h" -#include "wcd_cmi_api.h" - -#define CPE_MSG_BUFFER_SIZE 132 -#define CPE_NO_SERVICE 0 - -#define CMI_DRIVER_SUPPORTED_VERSION 0 -#define CMI_API_SUCCESS 0 -#define CMI_MSG_TRANSPORT (0x0002) -#define CPE_SVC_INACTIVE_STATE_RETRIES_MAX 10 - -#define TOMTOM_A_SVASS_SPE_DRAM_OFFSET 0x50000 -#define TOMTOM_A_SVASS_SPE_DRAM_SIZE 0x30000 -#define TOMTOM_A_SVASS_SPE_IRAM_OFFSET 0x80000 -#define TOMTOM_A_SVASS_SPE_IRAM_SIZE 0xC000 -#define TOMTOM_A_SVASS_SPE_INBOX_SIZE 12 -#define TOMTOM_A_SVASS_SPE_OUTBOX_SIZE 12 - -#define MEM_ACCESS_NONE_VAL 0x0 -#define MEM_ACCESS_IRAM_VAL 0x1 -#define MEM_ACCESS_DRAM_VAL 0x2 -#define LISTEN_CTL_SPE_VAL 0x0 -#define LISTEN_CTL_MSM_VAL 0x1 - -#define WCD9335_CPE_SS_SPE_DRAM_OFFSET 0x48000 -#define WCD9335_CPE_SS_SPE_DRAM_SIZE 0x34000 -#define WCD9335_CPE_SS_SPE_IRAM_OFFSET 0x80000 -#define WCD9335_CPE_SS_SPE_IRAM_SIZE 0x20000 - -#define WCD9335_CPE_SS_SPE_INBOX_SIZE 16 -#define WCD9335_CPE_SS_SPE_OUTBOX_SIZE 16 -#define WCD9335_CPE_SS_SPE_MEM_BANK_SIZ 16 - -#define WCD9335_CPE_SS_SPE_INBOX1(N) (WCD9335_CPE_SS_INBOX1_0 + (N)) -#define WCD9335_CPE_SS_SPE_OUTBOX1(N) (WCD9335_CPE_SS_OUTBOX1_0 + (N)) -#define WCD9335_CPE_SS_MEM_BANK(N) (WCD9335_CPE_SS_MEM_BANK_0 + (N)) - -#define CHUNK_SIZE 16 - -#define CPE_SVC_GRAB_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock acquire\n", \ - __func__, name); \ - mutex_lock(lock); \ -} - -#define CPE_SVC_REL_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock release\n", \ - __func__, name); \ - mutex_unlock(lock); \ -} - -static const struct cpe_svc_hw_cfg cpe_svc_tomtom_info = { - TOMTOM_A_SVASS_SPE_DRAM_SIZE, - TOMTOM_A_SVASS_SPE_DRAM_OFFSET, - TOMTOM_A_SVASS_SPE_IRAM_SIZE, - TOMTOM_A_SVASS_SPE_IRAM_OFFSET, - TOMTOM_A_SVASS_SPE_INBOX_SIZE, - TOMTOM_A_SVASS_SPE_OUTBOX_SIZE -}; - -static const struct cpe_svc_hw_cfg cpe_svc_wcd9335_info = { - WCD9335_CPE_SS_SPE_DRAM_SIZE, - WCD9335_CPE_SS_SPE_DRAM_OFFSET, - WCD9335_CPE_SS_SPE_IRAM_SIZE, - WCD9335_CPE_SS_SPE_IRAM_OFFSET, - WCD9335_CPE_SS_SPE_INBOX_SIZE, - WCD9335_CPE_SS_SPE_OUTBOX_SIZE -}; - -enum cpe_state { - CPE_STATE_UNINITIALIZED = 0, - CPE_STATE_INITIALIZED, - CPE_STATE_IDLE, - CPE_STATE_DOWNLOADING, - CPE_STATE_BOOTING, - CPE_STATE_SENDING_MSG, - CPE_STATE_OFFLINE, - CPE_STATE_BUFFERING, - CPE_STATE_BUFFERING_CANCELLED -}; - -enum cpe_substate { - CPE_SS_IDLE = 0, - CPE_SS_MSG_REQUEST_ACCESS, - CPE_SS_MSG_SEND_INBOX, - CPE_SS_MSG_SENT, - CPE_SS_DL_DOWNLOADING, - CPE_SS_DL_COMPLETED, - CPE_SS_BOOT, - CPE_SS_BOOT_INIT, - CPE_SS_ONLINE -}; - -enum cpe_command { - CPE_CMD_KILL_THREAD = 0, - CPE_CMD_BOOT, - CPE_CMD_BOOT_INITIALIZE, - CPE_CMD_BOOT_COMPLETE, - CPE_CMD_SEND_MSG, - CPE_CMD_SEND_TRANS_MSG, - CPE_CMD_SEND_MSG_COMPLETE, - CPE_CMD_PROCESS_IRQ, - CPE_CMD_RAMDUMP, - CPE_CMD_DL_SEGMENT, - CPE_CMD_SHUTDOWN, - CPE_CMD_RESET, - CPE_CMD_DEINITIALIZE, - CPE_CMD_READ, - CPE_CMD_ENABLE_LAB, - CPE_CMD_DISABLE_LAB, - CPE_CMD_SWAP_BUFFER, - CPE_LAB_CFG_SB, - CPE_CMD_CANCEL_MEMACCESS, - CPE_CMD_PROC_INCOMING_MSG, - CPE_CMD_FTM_TEST, -}; - -enum cpe_process_result { - CPE_PROC_SUCCESS = 0, - CPE_PROC_FAILED, - CPE_PROC_KILLED, - CPE_PROC_QUEUED, -}; - -struct cpe_command_node { - enum cpe_command command; - enum cpe_svc_result result; - void *data; - struct list_head list; -}; - -struct cpe_info { - struct list_head main_queue; - struct completion cmd_complete; - struct completion thread_comp; - void *thread_handler; - bool stop_thread; - struct mutex msg_lock; - enum cpe_state state; - enum cpe_substate substate; - struct list_head client_list; - enum cpe_process_result (*cpe_process_command) - (struct cpe_command_node *command_node); - enum cpe_svc_result (*cpe_cmd_validate) - (const struct cpe_info *i, - enum cpe_command command); - enum cpe_svc_result (*cpe_start_notification) - (struct cpe_info *i); - u32 initialized; - struct cpe_svc_tgt_abstraction *tgt; - void *pending; - void *data; - void *client_context; - u32 codec_id; - struct work_struct clk_plan_work; - struct completion core_svc_cmd_compl; -}; - -struct cpe_tgt_waiti_info { - u8 tgt_waiti_size; - u8 *tgt_waiti_data; -}; - -struct cpe_svc_tgt_abstraction { - enum cpe_svc_result (*tgt_boot)(int debug_mode); - - u32 (*tgt_cpar_init_done)(void); - - u32 (*tgt_is_active)(void); - - enum cpe_svc_result (*tgt_reset)(void); - - enum cpe_svc_result (*tgt_stop)(void); - - enum cpe_svc_result (*tgt_read_mailbox) - (u8 *buffer, size_t size); - - enum cpe_svc_result (*tgt_write_mailbox) - (u8 *buffer, size_t size); - - enum cpe_svc_result (*tgt_read_ram) - (struct cpe_info *c, - struct cpe_svc_mem_segment *data); - - enum cpe_svc_result (*tgt_write_ram) - (struct cpe_info *c, - const struct cpe_svc_mem_segment *data); - - enum cpe_svc_result (*tgt_route_notification) - (enum cpe_svc_module module, - enum cpe_svc_route_dest dest); - - enum cpe_svc_result (*tgt_set_debug_mode)(u32 enable); - const struct cpe_svc_hw_cfg *(*tgt_get_cpe_info)(void); - enum cpe_svc_result (*tgt_deinit) - (struct cpe_svc_tgt_abstraction *param); - enum cpe_svc_result (*tgt_voice_tx_lab) - (bool); - u8 *inbox; - u8 *outbox; - struct cpe_tgt_waiti_info *tgt_waiti_info; -}; - -static enum cpe_svc_result cpe_tgt_tomtom_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param); - -static enum cpe_svc_result cpe_tgt_wcd9335_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param); - -struct cpe_send_msg { - u8 *payload; - u32 isobm; - u32 address; - size_t size; -}; - -struct cpe_read_handle { - void *registration; - struct cpe_info t_info; - struct list_head buffers; - void *config; -}; - -struct generic_notification { - void (*notification) - (const struct cpe_svc_notification *parameter); - void (*cmi_notification) - (const struct cmi_api_notification *parameter); -}; - -struct cpe_notif_node { - struct generic_notification notif; - u32 mask; - u32 service; - const struct cpe_info *context; - const char *name; - u32 disabled; - struct list_head list; -}; - -struct cpe_priv { - struct cpe_info *cpe_default_handle; - void (*cpe_irq_control_callback)(u32 enable); - void (*cpe_query_freq_plans_cb) - (void *cdc_priv, - struct cpe_svc_cfg_clk_plan *clk_freq); - void (*cpe_change_freq_plan_cb)(void *cdc_priv, - u32 clk_freq); - u32 cpe_msg_buffer; - void *cpe_cmi_handle; - struct mutex cpe_api_mutex; - struct mutex cpe_svc_lock; - struct cpe_svc_boot_event cpe_debug_vector; - void *cdc_priv; -}; - -static struct cpe_priv cpe_d; - -static enum cpe_svc_result __cpe_svc_shutdown(void *cpe_handle); - -static enum cpe_svc_result cpe_is_command_valid( - const struct cpe_info *t_info, - enum cpe_command command); - -static int cpe_register_read(u32 reg, u8 *val) -{ - *(val) = snd_soc_read(cpe_d.cdc_priv, reg); - return 0; -} - -static enum cpe_svc_result cpe_update_bits(u32 reg, - u32 mask, u32 value) -{ - int ret = 0; - - ret = snd_soc_update_bits(cpe_d.cdc_priv, reg, - mask, value); - if (ret < 0) - return CPE_SVC_FAILED; - - return CPE_SVC_SUCCESS; -} - -static int cpe_register_write(u32 reg, u32 val) -{ - int ret = 0; - - if (reg != WCD9335_CPE_SS_MEM_BANK_0) - pr_debug("%s: reg = 0x%x, value = 0x%x\n", - __func__, reg, val); - - ret = snd_soc_write(cpe_d.cdc_priv, reg, val); - if (ret < 0) - return CPE_SVC_FAILED; - - return CPE_SVC_SUCCESS; -} - -static int cpe_register_write_repeat(u32 reg, u8 *ptr, u32 to_write) -{ - struct snd_soc_codec *codec = cpe_d.cdc_priv; - struct wcd9xxx *wcd9xxx = dev_get_drvdata(codec->dev->parent); - int ret = 0; - - ret = wcd9xxx_slim_write_repeat(wcd9xxx, reg, to_write, ptr); - if (ret != 0) - pr_err("%s: slim_write_repeat failed\n", __func__); - - if (ret < 0) - return CPE_SVC_FAILED; - - return CPE_SVC_SUCCESS; -} - -static bool cpe_register_read_autoinc_supported(void) -{ - return true; -} - - -/* Called under msgq locked context */ -static void cpe_cmd_received(struct cpe_info *t_info) -{ - struct cpe_command_node *node = NULL; - enum cpe_process_result proc_rc = CPE_PROC_SUCCESS; - - if (!t_info) { - pr_err("%s: Invalid thread info\n", - __func__); - return; - } - - while (!list_empty(&t_info->main_queue)) { - if (proc_rc != CPE_PROC_SUCCESS) - break; - node = list_first_entry(&t_info->main_queue, - struct cpe_command_node, list); - if (!node) - break; - list_del(&node->list); - proc_rc = t_info->cpe_process_command(node); - pr_debug("%s: process command return %d\n", - __func__, proc_rc); - - switch (proc_rc) { - case CPE_PROC_SUCCESS: - kfree(node); - break; - case CPE_PROC_FAILED: - kfree(node); - pr_err("%s: cmd failed\n", __func__); - break; - case CPE_PROC_KILLED: - break; - default: - list_add(&node->list, &(t_info->main_queue)); - - } - } -} - -static int cpe_worker_thread(void *context) -{ - struct cpe_info *t_info = (struct cpe_info *)context; - - /* - * Thread will run until requested to stop explicitly - * by setting the t_info->stop_thread flag - */ - while (1) { - /* Wait for command to be processed */ - wait_for_completion(&t_info->cmd_complete); - - CPE_SVC_GRAB_LOCK(&t_info->msg_lock, "msg_lock"); - cpe_cmd_received(t_info); - reinit_completion(&t_info->cmd_complete); - /* Check if thread needs to be stopped */ - if (t_info->stop_thread) - goto unlock_and_exit; - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - }; - -unlock_and_exit: - pr_debug("%s: thread stopped\n", __func__); - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - complete_and_exit(&t_info->thread_comp, 0); -} - -static void cpe_create_worker_thread(struct cpe_info *t_info) -{ - INIT_LIST_HEAD(&t_info->main_queue); - init_completion(&t_info->cmd_complete); - init_completion(&t_info->thread_comp); - t_info->stop_thread = false; - t_info->thread_handler = kthread_run(cpe_worker_thread, - (void *)t_info, "cpe-worker-thread"); - pr_debug("%s: Created new worker thread\n", - __func__); -} - -static void cpe_cleanup_worker_thread(struct cpe_info *t_info) -{ - if (!t_info->thread_handler) { - pr_err("%s: thread not created\n", __func__); - return; - } - - /* - * Wake up the command handler in case - * it is waiting for an command to be processed. - */ - CPE_SVC_GRAB_LOCK(&t_info->msg_lock, "msg_lock"); - t_info->stop_thread = true; - complete(&t_info->cmd_complete); - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - - /* Wait for the thread to exit */ - wait_for_completion(&t_info->thread_comp); - t_info->thread_handler = NULL; - - pr_debug("%s: Thread cleaned up successfully\n", - __func__); -} - -static enum cpe_svc_result -cpe_send_cmd_to_thread(struct cpe_info *t_info, - enum cpe_command command, void *data, - bool high_prio) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_command_node *cmd = NULL; - - rc = cpe_is_command_valid(t_info, command); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Invalid command %d\n", - __func__, command); - return rc; - } - - cmd = kzalloc(sizeof(struct cpe_command_node), - GFP_ATOMIC); - if (!cmd) - return CPE_SVC_NO_MEMORY; - - cmd->command = command; - cmd->data = data; - - CPE_SVC_GRAB_LOCK(&t_info->msg_lock, "msg_lock"); - if (high_prio) - list_add(&(cmd->list), - &(t_info->main_queue)); - else - list_add_tail(&(cmd->list), - &(t_info->main_queue)); - complete(&t_info->cmd_complete); - CPE_SVC_REL_LOCK(&t_info->msg_lock, "msg_lock"); - - return rc; -} - -static enum cpe_svc_result cpe_change_state( - struct cpe_info *t_info, - enum cpe_state state, enum cpe_substate ss) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - t_info->state = state; - t_info->substate = ss; - - pr_debug("%s: current state: %d,%d, new_state: %d,%d\n", - __func__, t_info->state, t_info->substate, - state, ss); - - return rc; -} - -static enum cpe_svc_result -cpe_is_command_valid(const struct cpe_info *t_info, - enum cpe_command command) -{ - enum cpe_svc_result rc = CPE_SVC_INVALID_HANDLE; - - if (t_info && t_info->cpe_cmd_validate) - rc = t_info->cpe_cmd_validate(t_info, command); - else - pr_err("%s: invalid handle or callback\n", - __func__); - return rc; -} - -static void cpe_notify_client(struct cpe_notif_node *client, - struct cpe_svc_notification *payload) -{ - if (!client || !payload) { - pr_err("%s: invalid client or payload\n", - __func__); - return; - } - - if (!(client->mask & payload->event)) { - pr_debug("%s: client mask 0x%x not registered for event 0x%x\n", - __func__, client->mask, payload->event); - return; - } - - if (client->notif.notification && !client->disabled) - client->notif.notification(payload); - - if ((client->mask & CPE_SVC_CMI_MSG) && - client->notif.cmi_notification) - client->notif.cmi_notification( - (const struct cmi_api_notification *)payload); -} - -static void cpe_broadcast_notification(const struct cpe_info *t_info, - struct cpe_svc_notification *payload) -{ - struct cpe_notif_node *n = NULL; - - if (!t_info || !payload) { - pr_err("%s: invalid handle\n", __func__); - return; - } - - pr_debug("%s: notify clients, event = %d\n", - __func__, payload->event); - payload->private_data = cpe_d.cdc_priv; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_for_each_entry(n, &t_info->client_list, list) { - if (!(n->mask & CPE_SVC_CMI_MSG)) - cpe_notify_client(n, payload); - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); -} - -static void *cpe_register_generic(struct cpe_info *t_info, - void notification_callback( - const struct cpe_svc_notification *parameter), - void cmi_callback( - const struct cmi_api_notification *parameter), - u32 mask, u32 service, const char *name) -{ - struct cpe_notif_node *n = NULL; - - n = kzalloc(sizeof(struct cpe_notif_node), - GFP_KERNEL); - if (!n) - return NULL; - n->mask = mask; - n->service = service; - n->notif.notification = notification_callback; - n->notif.cmi_notification = cmi_callback; - n->context = t_info; - n->disabled = false; - n->name = name; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - /* Make sure CPE core service is first */ - if (service == CMI_CPE_CORE_SERVICE_ID) - list_add(&n->list, &t_info->client_list); - else - list_add_tail(&n->list, &t_info->client_list); - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - - return n; -} - -static enum cpe_svc_result cpe_deregister_generic(struct cpe_info *t_info, - void *reg_handle) -{ - struct cpe_notif_node *n = (struct cpe_notif_node *)reg_handle; - - if (!t_info || !reg_handle) { - pr_err("%s: invalid handle\n", __func__); - return CPE_SVC_INVALID_HANDLE; - } - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_del(&(n->list)); - kfree(reg_handle); - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_svc_tgt_init(struct cpe_svc_codec_info_v1 *i, - struct cpe_svc_tgt_abstraction *abs) -{ - if (!i || !abs) { - pr_err("%s: Incorrect information provided\n", - __func__); - return CPE_SVC_FAILED; - } - - switch (i->id) { - case CPE_SVC_CODEC_TOMTOM: - return cpe_tgt_tomtom_init(i, abs); - case CPE_SVC_CODEC_WCD9335: - return cpe_tgt_wcd9335_init(i, abs); - default: - pr_err("%s: Codec type %d not supported\n", - __func__, i->id); - return CPE_SVC_FAILED; - } - - return CPE_SVC_SUCCESS; -} - -static void cpe_notify_cmi_client(struct cpe_info *t_info, u8 *payload, - enum cpe_svc_result result) -{ - struct cpe_notif_node *n = NULL; - struct cmi_api_notification notif; - struct cmi_hdr *hdr; - u8 service = 0; - - if (!t_info || !payload) { - pr_err("%s: invalid payload/handle\n", - __func__); - return; - } - - hdr = CMI_GET_HEADER(payload); - service = CMI_HDR_GET_SERVICE(hdr); - - notif.event = CMI_API_MSG; - notif.result = result; - notif.message = payload; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_for_each_entry(n, &t_info->client_list, list) { - - if ((n->mask & CPE_SVC_CMI_MSG) && - n->service == service && - n->notif.cmi_notification) { - n->notif.cmi_notification(¬if); - break; - } - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); -} - -static void cpe_toggle_irq_notification(struct cpe_info *t_info, u32 value) -{ - if (cpe_d.cpe_irq_control_callback) - cpe_d.cpe_irq_control_callback(value); -} - -static void cpe_command_cleanup(struct cpe_command_node *command_node) -{ - switch (command_node->command) { - case CPE_CMD_SEND_MSG: - case CPE_CMD_SEND_TRANS_MSG: - case CPE_CMD_SEND_MSG_COMPLETE: - case CPE_CMD_SHUTDOWN: - case CPE_CMD_READ: - kfree(command_node->data); - command_node->data = NULL; - break; - default: - pr_err("%s: unhandled command\n", - __func__); - break; - } -} - -static enum cpe_svc_result cpe_send_msg_to_inbox( - struct cpe_info *t_info, u32 opcode, - struct cpe_send_msg *msg) -{ - size_t bytes = 0; - size_t inbox_size = - t_info->tgt->tgt_get_cpe_info()->inbox_size; - struct cmi_hdr *hdr; - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - memset(t_info->tgt->inbox, 0, inbox_size); - hdr = CMI_GET_HEADER(t_info->tgt->inbox); - CMI_HDR_SET_SESSION(hdr, 1); - CMI_HDR_SET_SERVICE(hdr, CMI_CPE_CORE_SERVICE_ID); - CMI_HDR_SET_VERSION(hdr, CMI_DRIVER_SUPPORTED_VERSION); - CMI_HDR_SET_OBM(hdr, CMI_OBM_FLAG_IN_BAND); - - switch (opcode) { - case CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC: { - struct cmi_core_svc_cmd_shared_mem_alloc *m; - - CMI_HDR_SET_OPCODE(hdr, - CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, - sizeof(struct cmi_core_svc_cmd_shared_mem_alloc)); - m = (struct cmi_core_svc_cmd_shared_mem_alloc *) - CMI_GET_PAYLOAD(t_info->tgt->inbox); - m->size = CPE_MSG_BUFFER_SIZE; - pr_debug("send shared mem alloc msg to cpe inbox\n"); - } - break; - case CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ: - CMI_HDR_SET_OPCODE(hdr, - CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, 0); - pr_debug("%s: Creating DRAM acces request msg\n", - __func__); - break; - - case CPE_CMI_BASIC_RSP_OPCODE: { - struct cmi_basic_rsp_result *rsp; - - CMI_HDR_SET_OPCODE(hdr, - CPE_CMI_BASIC_RSP_OPCODE); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, - sizeof(struct cmi_basic_rsp_result)); - rsp = (struct cmi_basic_rsp_result *) - CMI_GET_PAYLOAD(t_info->tgt->inbox); - rsp->status = 0; - pr_debug("%s: send basic response\n", __func__); - } - break; - - default: - if (msg->address != 0) { - struct cmi_msg_transport *m = NULL; - struct cpe_svc_mem_segment mem_seg; - - mem_seg.type = CPE_SVC_DATA_MEM; - if (msg->isobm) { - struct cmi_obm *obm = (struct cmi_obm *) - - CMI_GET_PAYLOAD(msg->payload); - mem_seg.cpe_addr = obm->mem_handle; - mem_seg.data = (u8 *)obm->data_ptr.kvaddr; - mem_seg.size = obm->size; - t_info->tgt->tgt_write_ram(t_info, &mem_seg); - } - - mem_seg.cpe_addr = msg->address; - mem_seg.data = msg->payload; - mem_seg.size = msg->size; - t_info->tgt->tgt_write_ram(t_info, &mem_seg); - - hdr = CMI_GET_HEADER(t_info->tgt->inbox); - CMI_HDR_SET_OPCODE(hdr, CMI_MSG_TRANSPORT); - m = (struct cmi_msg_transport *) - CMI_GET_PAYLOAD(t_info->tgt->inbox); - m->addr = msg->address; - m->size = msg->size; - CMI_HDR_SET_PAYLOAD_SIZE(hdr, - sizeof(struct cmi_msg_transport)); - } else { - memcpy(t_info->tgt->inbox, msg->payload, - msg->size); - } - - break; - } - - pr_debug("%s: sending message to cpe inbox\n", - __func__); - bytes = sizeof(struct cmi_hdr); - hdr = CMI_GET_HEADER(t_info->tgt->inbox); - bytes += CMI_HDR_GET_PAYLOAD_SIZE(hdr); - rc = t_info->tgt->tgt_write_mailbox(t_info->tgt->inbox, bytes); - - return rc; -} - -static bool cpe_is_cmd_clk_req(void *cmd) -{ - struct cmi_hdr *hdr; - - hdr = CMI_GET_HEADER(cmd); - - if ((CMI_HDR_GET_SERVICE(hdr) == - CMI_CPE_CORE_SERVICE_ID)) { - if (CMI_GET_OPCODE(cmd) == - CPE_CORE_SVC_CMD_CLK_FREQ_REQUEST) - return true; - } - - return false; -} - -static enum cpe_svc_result cpe_process_clk_change_req( - struct cpe_info *t_info) -{ - struct cmi_core_svc_cmd_clk_freq_request *req; - - req = (struct cmi_core_svc_cmd_clk_freq_request *) - CMI_GET_PAYLOAD(t_info->tgt->outbox); - - if (!cpe_d.cpe_change_freq_plan_cb) { - pr_err("%s: No support for clk freq change\n", - __func__); - return CPE_SVC_FAILED; - } - - cpe_d.cpe_change_freq_plan_cb(cpe_d.cdc_priv, - req->clk_freq); - - /*send a basic response*/ - cpe_send_msg_to_inbox(t_info, - CPE_CMI_BASIC_RSP_OPCODE, NULL); - - return CPE_SVC_SUCCESS; -} - -static void cpe_process_irq_int(u32 irq, - struct cpe_info *t_info) -{ - struct cpe_command_node temp_node; - struct cpe_send_msg *m; - u8 size = 0; - bool err_irq = false; - struct cmi_hdr *hdr; - - pr_debug("%s: irq = %u\n", __func__, irq); - - if (!t_info) { - pr_err("%s: Invalid handle\n", - __func__); - return; - } - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - switch (irq) { - case CPE_IRQ_OUTBOX_IRQ: - size = t_info->tgt->tgt_get_cpe_info()->outbox_size; - t_info->tgt->tgt_read_mailbox(t_info->tgt->outbox, size); - break; - - case CPE_IRQ_MEM_ACCESS_ERROR: - err_irq = true; - cpe_change_state(t_info, CPE_STATE_OFFLINE, CPE_SS_IDLE); - break; - - case CPE_IRQ_WDOG_BITE: - case CPE_IRQ_RCO_WDOG_INT: - err_irq = true; - __cpe_svc_shutdown(t_info); - break; - - case CPE_IRQ_FLL_LOCK_LOST: - default: - err_irq = true; - break; - } - - if (err_irq) { - pr_err("%s: CPE error IRQ %u occurred\n", - __func__, irq); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return; - } - - switch (t_info->state) { - case CPE_STATE_BOOTING: - - switch (t_info->substate) { - case CPE_SS_BOOT: - temp_node.command = CPE_CMD_BOOT_INITIALIZE; - temp_node.result = CPE_SVC_SUCCESS; - t_info->substate = CPE_SS_BOOT_INIT; - t_info->cpe_process_command(&temp_node); - break; - - case CPE_SS_BOOT_INIT: - temp_node.command = CPE_CMD_BOOT_COMPLETE; - temp_node.result = CPE_SVC_SUCCESS; - t_info->substate = CPE_SS_ONLINE; - t_info->cpe_process_command(&temp_node); - break; - - default: - pr_debug("%s: unhandled substate %d for state %d\n", - __func__, t_info->state, t_info->substate); - break; - } - break; - - case CPE_STATE_SENDING_MSG: - hdr = CMI_GET_HEADER(t_info->tgt->outbox); - if (CMI_GET_OPCODE(t_info->tgt->outbox) == - CPE_LSM_SESSION_EVENT_DETECTION_STATUS_V2) { - pr_debug("%s: session_id: %u, state: %d,%d, event received\n", - __func__, CMI_HDR_GET_SESSION_ID(hdr), - t_info->state, t_info->substate); - temp_node.command = CPE_CMD_PROC_INCOMING_MSG; - temp_node.data = NULL; - t_info->cpe_process_command(&temp_node); - break; - } - - m = (struct cpe_send_msg *)t_info->pending; - - switch (t_info->substate) { - case CPE_SS_MSG_REQUEST_ACCESS: - cpe_send_cmd_to_thread(t_info, - CPE_CMD_SEND_TRANS_MSG, m, true); - break; - - case CPE_SS_MSG_SEND_INBOX: - if (cpe_is_cmd_clk_req(t_info->tgt->outbox)) - cpe_process_clk_change_req(t_info); - else - cpe_send_cmd_to_thread(t_info, - CPE_CMD_SEND_MSG_COMPLETE, m, true); - break; - - default: - pr_debug("%s: unhandled substate %d for state %d\n", - __func__, t_info->state, t_info->substate); - break; - } - break; - - case CPE_STATE_IDLE: - pr_debug("%s: Message received, notifying client\n", - __func__); - temp_node.command = CPE_CMD_PROC_INCOMING_MSG; - temp_node.data = NULL; - t_info->cpe_process_command(&temp_node); - break; - - default: - pr_debug("%s: unhandled state %d\n", - __func__, t_info->state); - break; - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); -} - - -static void broacast_boot_failed(void) -{ - struct cpe_info *t_info = cpe_d.cpe_default_handle; - struct cpe_svc_notification payload; - - payload.event = CPE_SVC_BOOT_FAILED; - payload.result = CPE_SVC_FAILED; - payload.payload = NULL; - if (t_info) - payload.private_data = - t_info->client_context; - cpe_broadcast_notification(t_info, &payload); -} - -static enum cpe_svc_result broadcast_boot_event( - struct cpe_info *t_info) -{ - struct cpe_svc_notification payload; - - payload.event = CPE_SVC_ONLINE; - payload.result = CPE_SVC_SUCCESS; - payload.payload = NULL; - if (t_info) - payload.private_data = - t_info->client_context; - cpe_broadcast_notification(t_info, &payload); - - return CPE_SVC_SUCCESS; -} - -static enum cpe_process_result cpe_boot_initialize(struct cpe_info *t_info, - enum cpe_svc_result *cpe_rc) -{ - enum cpe_process_result rc = CPE_SVC_FAILED; - struct cpe_svc_notification payload; - struct cmi_core_svc_event_system_boot *p = NULL; - - if (CMI_GET_OPCODE(t_info->tgt->outbox) != - CPE_CORE_SVC_EVENT_SYSTEM_BOOT) { - broacast_boot_failed(); - return rc; - } - - p = (struct cmi_core_svc_event_system_boot *) - CMI_GET_PAYLOAD(t_info->tgt->outbox); - if (p->status != CPE_BOOT_SUCCESS) { - pr_err("%s: cpe boot failed, status = %d\n", - __func__, p->status); - broacast_boot_failed(); - return rc; - } - - /* boot was successful */ - if (p->version == - CPE_CORE_VERSION_SYSTEM_BOOT_EVENT) { - cpe_d.cpe_debug_vector.debug_address = - p->sfr_buff_address; - cpe_d.cpe_debug_vector.debug_buffer_size = - p->sfr_buff_size; - cpe_d.cpe_debug_vector.status = p->status; - payload.event = CPE_SVC_BOOT; - payload.result = CPE_SVC_SUCCESS; - payload.payload = (void *)&cpe_d.cpe_debug_vector; - payload.private_data = t_info->client_context; - cpe_broadcast_notification(t_info, &payload); - } - cpe_change_state(t_info, CPE_STATE_BOOTING, - CPE_SS_BOOT_INIT); - (*cpe_rc) = cpe_send_msg_to_inbox(t_info, - CPE_CORE_SVC_CMD_SHARED_MEM_ALLOC, NULL); - rc = CPE_PROC_SUCCESS; - return rc; -} - -static void cpe_svc_core_cmi_handler( - const struct cmi_api_notification *parameter) -{ - struct cmi_hdr *hdr; - - if (!parameter) - return; - - pr_debug("%s: event = %d\n", - __func__, parameter->event); - - if (parameter->event != CMI_API_MSG) - return; - - hdr = (struct cmi_hdr *) parameter->message; - - if (hdr->opcode == CPE_CMI_BASIC_RSP_OPCODE) { - struct cmi_basic_rsp_result *result; - - result = (struct cmi_basic_rsp_result *) - ((u8 *)parameter->message) + (sizeof(*hdr)); - if (result->status) - pr_err("%s: error response, error code = %u\n", - __func__, result->status); - complete(&cpe_d.cpe_default_handle->core_svc_cmd_compl); - } -} - -static void cpe_clk_plan_work(struct work_struct *work) -{ - struct cpe_info *t_info = NULL; - size_t size = 0; - struct cpe_svc_cfg_clk_plan plan; - u8 *cmi_msg; - struct cmi_hdr *hdr; - int rc; - - t_info = container_of(work, struct cpe_info, clk_plan_work); - if (!t_info) { - pr_err("%s: Invalid handle for cpe_info\n", - __func__); - return; - } - - /* Register the core service */ - cpe_d.cpe_cmi_handle = cmi_register( - cpe_svc_core_cmi_handler, - CMI_CPE_CORE_SERVICE_ID); - - /* send the clk plan command */ - if (!cpe_d.cpe_query_freq_plans_cb) { - pr_err("%s: No support for querying clk plans\n", - __func__); - return; - } - - cpe_d.cpe_query_freq_plans_cb(cpe_d.cdc_priv, &plan); - size = sizeof(plan.current_clk_feq) + - sizeof(plan.num_clk_freqs); - size += plan.num_clk_freqs * - sizeof(plan.clk_freqs[0]); - cmi_msg = kzalloc(size + sizeof(struct cmi_hdr), - GFP_KERNEL); - if (!cmi_msg) - return; - - hdr = (struct cmi_hdr *) cmi_msg; - CMI_HDR_SET_OPCODE(hdr, - CPE_CORE_SVC_CMD_CFG_CLK_PLAN); - CMI_HDR_SET_SERVICE(hdr, CMI_CPE_CORE_SERVICE_ID); - CMI_HDR_SET_SESSION(hdr, 1); - CMI_HDR_SET_VERSION(hdr, CMI_DRIVER_SUPPORTED_VERSION); - CMI_HDR_SET_PAYLOAD_SIZE(hdr, size); - memcpy(CMI_GET_PAYLOAD(cmi_msg), &plan, - size); - cmi_send_msg(cmi_msg); - - /* Wait for clk plan command to complete */ - rc = wait_for_completion_timeout(&t_info->core_svc_cmd_compl, - (10 * HZ)); - if (!rc) { - pr_err("%s: clk plan cmd timed out\n", - __func__); - goto cmd_fail; - } - - /* clk plan cmd is successful, send start notification */ - if (t_info->cpe_start_notification) - t_info->cpe_start_notification(t_info); - else - pr_err("%s: no start notification\n", - __func__); - -cmd_fail: - kfree(cmi_msg); - cmi_deregister(cpe_d.cpe_cmi_handle); -} - -static enum cpe_process_result cpe_boot_complete( - struct cpe_info *t_info) -{ - struct cmi_core_svc_cmdrsp_shared_mem_alloc *p = NULL; - - if (CMI_GET_OPCODE(t_info->tgt->outbox) != - CPE_CORE_SVC_CMDRSP_SHARED_MEM_ALLOC) { - broacast_boot_failed(); - return CPE_PROC_FAILED; - } - - p = (struct cmi_core_svc_cmdrsp_shared_mem_alloc *) - CMI_GET_PAYLOAD(t_info->tgt->outbox); - cpe_d.cpe_msg_buffer = p->addr; - - if (cpe_d.cpe_msg_buffer == 0) { - pr_err("%s: Invalid cpe buffer for message\n", - __func__); - broacast_boot_failed(); - return CPE_PROC_FAILED; - } - - cpe_change_state(t_info, CPE_STATE_IDLE, CPE_SS_IDLE); - cpe_create_worker_thread(t_info); - - if (t_info->codec_id != CPE_SVC_CODEC_TOMTOM) { - schedule_work(&t_info->clk_plan_work); - } else { - if (t_info->cpe_start_notification) - t_info->cpe_start_notification(t_info); - else - pr_err("%s: no start notification\n", - __func__); - } - - pr_debug("%s: boot complete\n", __func__); - return CPE_PROC_SUCCESS; -} - -static enum cpe_process_result cpe_process_send_msg( - struct cpe_info *t_info, - enum cpe_svc_result *cpe_rc, - struct cpe_command_node *command_node) -{ - enum cpe_process_result rc = CPE_PROC_SUCCESS; - struct cpe_send_msg *m = - (struct cpe_send_msg *)command_node->data; - u32 size = m->size; - - if (t_info->pending) { - pr_debug("%s: message queued\n", __func__); - *cpe_rc = CPE_SVC_SUCCESS; - return CPE_PROC_QUEUED; - } - - pr_debug("%s: Send CMI message, size = %u\n", - __func__, size); - - if (size <= t_info->tgt->tgt_get_cpe_info()->inbox_size) { - pr_debug("%s: Msg fits mailbox, size %u\n", - __func__, size); - cpe_change_state(t_info, CPE_STATE_SENDING_MSG, - CPE_SS_MSG_SEND_INBOX); - t_info->pending = m; - *cpe_rc = cpe_send_msg_to_inbox(t_info, 0, m); - } else if (size < CPE_MSG_BUFFER_SIZE) { - m->address = cpe_d.cpe_msg_buffer; - pr_debug("%s: Message req CMI mem access\n", - __func__); - t_info->pending = m; - cpe_change_state(t_info, CPE_STATE_SENDING_MSG, - CPE_SS_MSG_REQUEST_ACCESS); - *cpe_rc = cpe_send_msg_to_inbox(t_info, - CPE_CORE_SVC_CMD_DRAM_ACCESS_REQ, m); - } else { - pr_debug("%s: Invalid msg size %u\n", - __func__, size); - cpe_command_cleanup(command_node); - rc = CPE_PROC_FAILED; - cpe_change_state(t_info, CPE_STATE_IDLE, - CPE_SS_IDLE); - } - - return rc; -} - -static enum cpe_process_result cpe_process_incoming( - struct cpe_info *t_info) -{ - enum cpe_process_result rc = CPE_PROC_FAILED; - struct cmi_hdr *hdr; - - hdr = CMI_GET_HEADER(t_info->tgt->outbox); - - if (CMI_HDR_GET_SERVICE(hdr) == - CMI_CPE_CORE_SERVICE_ID) { - pr_debug("%s: core service message received\n", - __func__); - - switch (CMI_GET_OPCODE(t_info->tgt->outbox)) { - case CPE_CORE_SVC_CMD_CLK_FREQ_REQUEST: - cpe_process_clk_change_req(t_info); - rc = CPE_PROC_SUCCESS; - break; - case CMI_MSG_TRANSPORT: - pr_debug("%s: transport msg received\n", - __func__); - rc = CPE_PROC_SUCCESS; - break; - case CPE_CMI_BASIC_RSP_OPCODE: - pr_debug("%s: received basic rsp\n", - __func__); - rc = CPE_PROC_SUCCESS; - break; - default: - pr_debug("%s: unknown message received\n", - __func__); - break; - } - } else { - /* if service id if for a CMI client, notify client */ - pr_debug("%s: Message received, notifying client\n", - __func__); - cpe_notify_cmi_client(t_info, - t_info->tgt->outbox, CPE_SVC_SUCCESS); - rc = CPE_PROC_SUCCESS; - } - - return rc; -} - -static enum cpe_process_result cpe_process_kill_thread( - struct cpe_info *t_info, - struct cpe_command_node *command_node) -{ - struct cpe_svc_notification payload; - - cpe_d.cpe_msg_buffer = 0; - payload.result = CPE_SVC_SHUTTING_DOWN; - payload.event = CPE_SVC_OFFLINE; - payload.payload = NULL; - payload.private_data = t_info->client_context; - /* - * Make state as offline before broadcasting - * the message to clients. - */ - cpe_change_state(t_info, CPE_STATE_OFFLINE, - CPE_SS_IDLE); - cpe_broadcast_notification(t_info, &payload); - - return CPE_PROC_KILLED; -} - -static enum cpe_process_result cpe_mt_process_cmd( - struct cpe_command_node *command_node) -{ - struct cpe_info *t_info = cpe_d.cpe_default_handle; - enum cpe_svc_result cpe_rc = CPE_SVC_SUCCESS; - enum cpe_process_result rc = CPE_PROC_SUCCESS; - struct cpe_send_msg *m; - struct cmi_hdr *hdr; - u8 service = 0; - u8 retries = 0; - - if (!t_info || !command_node) { - pr_err("%s: Invalid handle/command node\n", - __func__); - return CPE_PROC_FAILED; - } - - pr_debug("%s: cmd = %u\n", __func__, command_node->command); - - cpe_rc = cpe_is_command_valid(t_info, command_node->command); - - if (cpe_rc != CPE_SVC_SUCCESS) { - pr_err("%s: Invalid command %d, err = %d\n", - __func__, command_node->command, cpe_rc); - return CPE_PROC_FAILED; - } - - switch (command_node->command) { - - case CPE_CMD_BOOT_INITIALIZE: - rc = cpe_boot_initialize(t_info, &cpe_rc); - break; - - case CPE_CMD_BOOT_COMPLETE: - rc = cpe_boot_complete(t_info); - break; - - case CPE_CMD_SEND_MSG: - rc = cpe_process_send_msg(t_info, &cpe_rc, - command_node); - break; - - case CPE_CMD_SEND_TRANS_MSG: - m = (struct cpe_send_msg *)command_node->data; - - while (retries < CPE_SVC_INACTIVE_STATE_RETRIES_MAX) { - if (t_info->tgt->tgt_is_active()) { - ++retries; - /* Wait for CPE to be inactive */ - usleep_range(5000, 5100); - } else { - break; - } - } - - pr_debug("%s: cpe inactive after %d attempts\n", - __func__, retries); - - cpe_change_state(t_info, CPE_STATE_SENDING_MSG, - CPE_SS_MSG_SEND_INBOX); - rc = cpe_send_msg_to_inbox(t_info, 0, m); - break; - - case CPE_CMD_SEND_MSG_COMPLETE: - hdr = CMI_GET_HEADER(t_info->tgt->outbox); - service = CMI_HDR_GET_SERVICE(hdr); - pr_debug("%s: msg send success, notifying clients\n", - __func__); - cpe_command_cleanup(command_node); - t_info->pending = NULL; - cpe_change_state(t_info, - CPE_STATE_IDLE, CPE_SS_IDLE); - cpe_notify_cmi_client(t_info, - t_info->tgt->outbox, CPE_SVC_SUCCESS); - break; - - case CPE_CMD_PROC_INCOMING_MSG: - rc = cpe_process_incoming(t_info); - break; - - case CPE_CMD_KILL_THREAD: - rc = cpe_process_kill_thread(t_info, command_node); - break; - - default: - pr_err("%s: unhandled cpe cmd = %d\n", - __func__, command_node->command); - break; - } - - if (cpe_rc != CPE_SVC_SUCCESS) { - pr_err("%s: failed to execute command\n", __func__); - if (t_info->pending) { - m = (struct cpe_send_msg *)t_info->pending; - cpe_notify_cmi_client(t_info, m->payload, - CPE_SVC_FAILED); - t_info->pending = NULL; - } - - cpe_command_cleanup(command_node); - rc = CPE_PROC_FAILED; - cpe_change_state(t_info, CPE_STATE_IDLE, - CPE_SS_IDLE); - } - - return rc; -} - -static enum cpe_svc_result cpe_mt_validate_cmd( - const struct cpe_info *t_info, - enum cpe_command command) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - if ((t_info == NULL) || t_info->initialized == false) { - pr_err("%s: cpe service is not ready\n", - __func__); - return CPE_SVC_NOT_READY; - } - - switch (t_info->state) { - case CPE_STATE_UNINITIALIZED: - case CPE_STATE_INITIALIZED: - switch (command) { - case CPE_CMD_RESET: - case CPE_CMD_DL_SEGMENT: - case CPE_CMD_RAMDUMP: - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_KILL_THREAD: - case CPE_CMD_DEINITIALIZE: - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_SUCCESS; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - case CPE_STATE_DOWNLOADING: - switch (command) { - case CPE_CMD_RESET: - case CPE_CMD_DL_SEGMENT: - case CPE_CMD_BOOT: - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_SUCCESS; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - case CPE_STATE_BOOTING: - switch (command) { - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_BOOT_INITIALIZE: - case CPE_CMD_BOOT_COMPLETE: - case CPE_CMD_SHUTDOWN: - rc = CPE_SVC_SUCCESS; - break; - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_BUSY; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - case CPE_STATE_IDLE: - switch (command) { - case CPE_CMD_SEND_MSG: - case CPE_CMD_SEND_TRANS_MSG: - case CPE_CMD_SEND_MSG_COMPLETE: - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_RESET: - case CPE_CMD_SHUTDOWN: - case CPE_CMD_KILL_THREAD: - case CPE_CMD_PROC_INCOMING_MSG: - rc = CPE_SVC_SUCCESS; - break; - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_BUSY; - break; - default: - rc = CPE_SVC_FAILED; - break; - } - break; - - case CPE_STATE_SENDING_MSG: - switch (command) { - case CPE_CMD_SEND_MSG: - case CPE_CMD_SEND_TRANS_MSG: - case CPE_CMD_SEND_MSG_COMPLETE: - case CPE_CMD_PROCESS_IRQ: - case CPE_CMD_SHUTDOWN: - case CPE_CMD_KILL_THREAD: - case CPE_CMD_PROC_INCOMING_MSG: - rc = CPE_SVC_SUCCESS; - break; - case CPE_CMD_FTM_TEST: - rc = CPE_SVC_BUSY; - break; - default: - rc = CPE_SVC_FAILED; - break; - } - break; - - case CPE_STATE_OFFLINE: - switch (command) { - case CPE_CMD_RESET: - case CPE_CMD_RAMDUMP: - case CPE_CMD_KILL_THREAD: - rc = CPE_SVC_SUCCESS; - break; - default: - rc = CPE_SVC_NOT_READY; - break; - } - break; - - default: - pr_debug("%s: unhandled state %d\n", - __func__, t_info->state); - break; - } - - if (rc != CPE_SVC_SUCCESS) - pr_err("%s: invalid command %d, state = %d\n", - __func__, command, t_info->state); - return rc; -} - -void *cpe_svc_initialize( - void irq_control_callback(u32 enable), - const void *codec_info, void *context) -{ - struct cpe_info *t_info = NULL; - const struct cpe_svc_hw_cfg *cap = NULL; - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_svc_init_param *init_context = - (struct cpe_svc_init_param *) context; - void *client_context = NULL; - - if (cpe_d.cpe_default_handle && - cpe_d.cpe_default_handle->initialized == true) - return (void *)cpe_d.cpe_default_handle; - cpe_d.cpe_query_freq_plans_cb = NULL; - cpe_d.cpe_change_freq_plan_cb = NULL; - - if (context) { - client_context = init_context->context; - switch (init_context->version) { - case CPE_SVC_INIT_PARAM_V1: - cpe_d.cpe_query_freq_plans_cb = - init_context->query_freq_plans_cb; - cpe_d.cpe_change_freq_plan_cb = - init_context->change_freq_plan_cb; - break; - default: - break; - } - } - - if (!cpe_d.cpe_default_handle) { - cpe_d.cpe_default_handle = kzalloc(sizeof(struct cpe_info), - GFP_KERNEL); - if (!cpe_d.cpe_default_handle) - goto err_register; - - memset(cpe_d.cpe_default_handle, 0, - sizeof(struct cpe_info)); - } - - t_info = cpe_d.cpe_default_handle; - t_info->client_context = client_context; - - INIT_LIST_HEAD(&t_info->client_list); - cpe_d.cdc_priv = client_context; - INIT_WORK(&t_info->clk_plan_work, cpe_clk_plan_work); - init_completion(&t_info->core_svc_cmd_compl); - - t_info->tgt = kzalloc(sizeof(struct cpe_svc_tgt_abstraction), - GFP_KERNEL); - if (!t_info->tgt) - goto err_tgt_alloc; - t_info->codec_id = - ((struct cpe_svc_codec_info_v1 *) codec_info)->id; - - rc = cpe_svc_tgt_init((struct cpe_svc_codec_info_v1 *)codec_info, - t_info->tgt); - - if (rc != CPE_SVC_SUCCESS) - goto err_tgt_init; - - cap = t_info->tgt->tgt_get_cpe_info(); - - memset(t_info->tgt->outbox, 0, cap->outbox_size); - memset(t_info->tgt->inbox, 0, cap->inbox_size); - mutex_init(&t_info->msg_lock); - cpe_d.cpe_irq_control_callback = irq_control_callback; - t_info->cpe_process_command = cpe_mt_process_cmd; - t_info->cpe_cmd_validate = cpe_mt_validate_cmd; - t_info->cpe_start_notification = broadcast_boot_event; - mutex_init(&cpe_d.cpe_api_mutex); - mutex_init(&cpe_d.cpe_svc_lock); - pr_debug("%s: cpe services initialized\n", __func__); - t_info->state = CPE_STATE_INITIALIZED; - t_info->initialized = true; - - return t_info; - -err_tgt_init: - kfree(t_info->tgt); - -err_tgt_alloc: - kfree(cpe_d.cpe_default_handle); - cpe_d.cpe_default_handle = NULL; - -err_register: - return NULL; -} - -enum cpe_svc_result cpe_svc_deinitialize(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_DEINITIALIZE); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Invalid command %d\n", - __func__, CPE_CMD_DEINITIALIZE); - return rc; - } - - if (cpe_d.cpe_default_handle == t_info) - cpe_d.cpe_default_handle = NULL; - - t_info->tgt->tgt_deinit(t_info->tgt); - cpe_change_state(t_info, CPE_STATE_UNINITIALIZED, - CPE_SS_IDLE); - mutex_destroy(&t_info->msg_lock); - kfree(t_info->tgt); - kfree(t_info); - mutex_destroy(&cpe_d.cpe_api_mutex); - mutex_destroy(&cpe_d.cpe_svc_lock); - - return rc; -} - -void *cpe_svc_register(void *cpe_handle, - void (*notification_callback) - (const struct cpe_svc_notification *parameter), - u32 mask, const char *name) -{ - void *reg_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!cpe_d.cpe_default_handle) { - cpe_d.cpe_default_handle = kzalloc(sizeof(struct cpe_info), - GFP_KERNEL); - if (!cpe_d.cpe_default_handle) { - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return NULL; - } - - memset(cpe_d.cpe_default_handle, 0, - sizeof(struct cpe_info)); - } - - if (!cpe_handle) - cpe_handle = cpe_d.cpe_default_handle; - - reg_handle = cpe_register_generic((struct cpe_info *)cpe_handle, - notification_callback, - NULL, - mask, CPE_NO_SERVICE, name); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return reg_handle; -} - -enum cpe_svc_result cpe_svc_deregister(void *cpe_handle, void *reg_handle) -{ - enum cpe_svc_result rc; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!cpe_handle) - cpe_handle = cpe_d.cpe_default_handle; - - rc = cpe_deregister_generic((struct cpe_info *)cpe_handle, - reg_handle); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_download_segment(void *cpe_handle, - const struct cpe_svc_mem_segment *segment) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_DL_SEGMENT); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_DL_SEGMENT); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - cpe_toggle_irq_notification(t_info, false); - t_info->state = CPE_STATE_DOWNLOADING; - t_info->substate = CPE_SS_DL_DOWNLOADING; - rc = t_info->tgt->tgt_write_ram(t_info, segment); - cpe_toggle_irq_notification(t_info, true); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_boot(void *cpe_handle, int debug_mode) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_BOOT); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_BOOT); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - if (rc == CPE_SVC_SUCCESS) { - t_info->tgt->tgt_boot(debug_mode); - t_info->state = CPE_STATE_BOOTING; - t_info->substate = CPE_SS_BOOT; - pr_debug("%s: cpe service booting\n", - __func__); - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cpe_svc_result cpe_svc_process_irq(void *cpe_handle, u32 cpe_irq) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - cpe_toggle_irq_notification(t_info, false); - cpe_process_irq_int(cpe_irq, t_info); - cpe_toggle_irq_notification(t_info, true); - - return rc; -} - -enum cpe_svc_result cpe_svc_route_notification(void *cpe_handle, - enum cpe_svc_module module, enum cpe_svc_route_dest dest) -{ - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - enum cpe_svc_result rc = CPE_SVC_NOT_READY; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - rc = t_info->tgt->tgt_route_notification(module, dest); - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -static enum cpe_svc_result __cpe_svc_shutdown(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - struct cpe_command_node *n = NULL; - struct cpe_command_node kill_cmd; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_SHUTDOWN); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_SHUTDOWN); - return rc; - } - - while (!list_empty(&t_info->main_queue)) { - n = list_first_entry(&t_info->main_queue, - struct cpe_command_node, list); - - if (n->command == CPE_CMD_SEND_MSG) { - cpe_notify_cmi_client(t_info, (u8 *)n->data, - CPE_SVC_SHUTTING_DOWN); - } - /* - * Since command cannot be processed, - * delete it from the list and perform cleanup - */ - list_del(&n->list); - cpe_command_cleanup(n); - kfree(n); - } - - pr_debug("%s: cpe service OFFLINE state\n", __func__); - - t_info->state = CPE_STATE_OFFLINE; - t_info->substate = CPE_SS_IDLE; - - memset(&kill_cmd, 0, sizeof(kill_cmd)); - kill_cmd.command = CPE_CMD_KILL_THREAD; - - if (t_info->pending) { - struct cpe_send_msg *m = - (struct cpe_send_msg *)t_info->pending; - cpe_notify_cmi_client(t_info, m->payload, - CPE_SVC_SHUTTING_DOWN); - kfree(t_info->pending); - t_info->pending = NULL; - } - - cpe_cleanup_worker_thread(t_info); - t_info->cpe_process_command(&kill_cmd); - - return rc; -} - -enum cpe_svc_result cpe_svc_shutdown(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - rc = __cpe_svc_shutdown(cpe_handle); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cpe_svc_result cpe_svc_reset(void *cpe_handle) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_RESET); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_RESET); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - if (t_info && t_info->tgt) { - rc = t_info->tgt->tgt_reset(); - pr_debug("%s: cpe services in INITIALIZED state\n", - __func__); - t_info->state = CPE_STATE_INITIALIZED; - t_info->substate = CPE_SS_IDLE; - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_ramdump(void *cpe_handle, - struct cpe_svc_mem_segment *buffer) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_RAMDUMP); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_RAMDUMP); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; - } - - if (t_info->tgt) { - rc = t_info->tgt->tgt_read_ram(t_info, buffer); - } else { - pr_err("%s: cpe service not ready\n", __func__); - rc = CPE_SVC_NOT_READY; - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -enum cpe_svc_result cpe_svc_set_debug_mode(void *cpe_handle, u32 mode) -{ - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - enum cpe_svc_result rc = CPE_SVC_INVALID_HANDLE; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - rc = t_info->tgt->tgt_set_debug_mode(mode); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return rc; -} - -const struct cpe_svc_hw_cfg *cpe_svc_get_hw_cfg(void *cpe_handle) -{ - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - return t_info->tgt->tgt_get_cpe_info(); - - return NULL; -} - -void *cmi_register( - void notification_callback( - const struct cmi_api_notification *parameter), - u32 service) -{ - void *reg_handle = NULL; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - reg_handle = cpe_register_generic(cpe_d.cpe_default_handle, - NULL, - notification_callback, - (CPE_SVC_CMI_MSG | CPE_SVC_OFFLINE | - CPE_SVC_ONLINE), - service, - "CMI_CLIENT"); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - - return reg_handle; -} - -enum cmi_api_result cmi_deregister(void *reg_handle) -{ - u32 clients = 0; - struct cpe_notif_node *n = NULL; - enum cmi_api_result rc = CMI_API_SUCCESS; - struct cpe_svc_notification payload; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - rc = (enum cmi_api_result) cpe_deregister_generic( - cpe_d.cpe_default_handle, reg_handle); - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - list_for_each_entry(n, &cpe_d.cpe_default_handle->client_list, list) { - if (n->mask & CPE_SVC_CMI_MSG) - clients++; - } - CPE_SVC_REL_LOCK(&cpe_d.cpe_svc_lock, "cpe_svc"); - - if (clients == 0) { - payload.event = CPE_SVC_CMI_CLIENTS_DEREG; - payload.payload = NULL; - payload.result = CPE_SVC_SUCCESS; - cpe_broadcast_notification(cpe_d.cpe_default_handle, &payload); - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cmi_api_result cmi_send_msg(void *message) -{ - enum cmi_api_result rc = CMI_API_SUCCESS; - struct cpe_send_msg *msg = NULL; - struct cmi_hdr *hdr; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - hdr = CMI_GET_HEADER(message); - msg = kzalloc(sizeof(struct cpe_send_msg), - GFP_ATOMIC); - if (!msg) { - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return CPE_SVC_NO_MEMORY; - } - - if (CMI_HDR_GET_OBM_FLAG(hdr) == CMI_OBM_FLAG_OUT_BAND) - msg->isobm = 1; - else - msg->isobm = 0; - - msg->size = sizeof(struct cmi_hdr) + - CMI_HDR_GET_PAYLOAD_SIZE(hdr); - - msg->payload = kzalloc(msg->size, GFP_ATOMIC); - if (!msg->payload) { - kfree(msg); - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return CPE_SVC_NO_MEMORY; - } - - msg->address = 0; - memcpy((void *)msg->payload, message, msg->size); - - rc = (enum cmi_api_result) cpe_send_cmd_to_thread( - cpe_d.cpe_default_handle, - CPE_CMD_SEND_MSG, - (void *)msg, false); - - if (rc != 0) { - pr_err("%s: Failed to queue message\n", __func__); - kfree(msg->payload); - kfree(msg); - } - - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -enum cpe_svc_result cpe_svc_ftm_test(void *cpe_handle, u32 *status) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - struct cpe_svc_mem_segment backup_seg; - struct cpe_svc_mem_segment waiti_seg; - u8 *backup_data = NULL; - - CPE_SVC_GRAB_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - rc = cpe_is_command_valid(t_info, CPE_CMD_FTM_TEST); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: cmd validation fail, cmd = %d\n", - __func__, CPE_CMD_FTM_TEST); - goto fail_cmd; - } - - if (t_info && t_info->tgt) { - backup_data = kzalloc( - t_info->tgt->tgt_waiti_info->tgt_waiti_size, - GFP_KERNEL); - - /* CPE reset */ - rc = t_info->tgt->tgt_reset(); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: CPE reset fail! err = %d\n", - __func__, rc); - goto err_return; - } - - /* Back up the 4 byte IRAM data first */ - backup_seg.type = CPE_SVC_INSTRUCTION_MEM; - backup_seg.cpe_addr = - t_info->tgt->tgt_get_cpe_info()->IRAM_offset; - backup_seg.size = t_info->tgt->tgt_waiti_info->tgt_waiti_size; - backup_seg.data = backup_data; - - pr_debug("%s: Backing up IRAM data from CPE\n", - __func__); - - rc = t_info->tgt->tgt_read_ram(t_info, &backup_seg); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to backup CPE IRAM data, err = %d\n", - __func__, rc); - goto err_return; - } - - pr_debug("%s: Complete backing up IRAM data from CPE\n", - __func__); - - /* Write the WAITI instruction data */ - waiti_seg.type = CPE_SVC_INSTRUCTION_MEM; - waiti_seg.cpe_addr = - t_info->tgt->tgt_get_cpe_info()->IRAM_offset; - waiti_seg.size = t_info->tgt->tgt_waiti_info->tgt_waiti_size; - waiti_seg.data = t_info->tgt->tgt_waiti_info->tgt_waiti_data; - - rc = t_info->tgt->tgt_write_ram(t_info, &waiti_seg); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to write the WAITI data, err = %d\n", - __func__, rc); - goto restore_iram; - } - - /* Boot up cpe to execute the WAITI instructions */ - rc = t_info->tgt->tgt_boot(1); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to boot CPE, err = %d\n", - __func__, rc); - goto reset; - } - - /* - * 1ms delay is suggested by the hw team to - * wait for cpe to boot up. - */ - usleep_range(1000, 1100); - - /* Check if the cpe init is done after executing the WAITI */ - *status = t_info->tgt->tgt_cpar_init_done(); - -reset: - /* Set the cpe back to reset state */ - rc = t_info->tgt->tgt_reset(); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: CPE reset fail! err = %d\n", - __func__, rc); - goto restore_iram; - } - -restore_iram: - /* Restore the IRAM 4 bytes data */ - rc = t_info->tgt->tgt_write_ram(t_info, &backup_seg); - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Fail to restore the IRAM data, err = %d\n", - __func__, rc); - goto err_return; - } - } - -err_return: - kfree(backup_data); -fail_cmd: - CPE_SVC_REL_LOCK(&cpe_d.cpe_api_mutex, "cpe_api"); - return rc; -} - -static enum cpe_svc_result cpe_tgt_tomtom_boot(int debug_mode) -{ - return CPE_SVC_SUCCESS; -} - -static u32 cpe_tgt_tomtom_is_cpar_init_done(void) -{ - return 0; -} - -static u32 cpe_tgt_tomtom_is_active(void) -{ - return 0; -} - -static enum cpe_svc_result cpe_tgt_tomtom_reset(void) -{ - return CPE_SVC_SUCCESS; -} - -enum cpe_svc_result cpe_tgt_tomtom_voicetx(bool enable) -{ - return CPE_SVC_SUCCESS; -} - -enum cpe_svc_result cpe_svc_toggle_lab(void *cpe_handle, bool enable) -{ - - struct cpe_info *t_info = (struct cpe_info *)cpe_handle; - - if (!t_info) - t_info = cpe_d.cpe_default_handle; - - if (t_info->tgt) - return t_info->tgt->tgt_voice_tx_lab(enable); - else - return CPE_SVC_INVALID_HANDLE; -} - -static enum cpe_svc_result cpe_tgt_tomtom_read_mailbox(u8 *buffer, - size_t size) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_write_mailbox(u8 *buffer, - size_t size) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_read_RAM(struct cpe_info *t_info, - struct cpe_svc_mem_segment *mem_seg) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_write_RAM(struct cpe_info *t_info, - const struct cpe_svc_mem_segment *mem_seg) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_route_notification( - enum cpe_svc_module module, - enum cpe_svc_route_dest dest) -{ - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_tomtom_set_debug_mode(u32 enable) -{ - return CPE_SVC_SUCCESS; -} - -static const struct cpe_svc_hw_cfg *cpe_tgt_tomtom_get_cpe_info(void) -{ - return &cpe_svc_tomtom_info; -} - -static enum cpe_svc_result cpe_tgt_tomtom_deinit( - struct cpe_svc_tgt_abstraction *param) -{ - kfree(param->inbox); - param->inbox = NULL; - kfree(param->outbox); - param->outbox = NULL; - memset(param, 0, sizeof(struct cpe_svc_tgt_abstraction)); - return CPE_SVC_SUCCESS; -} - -static u8 cpe_tgt_tomtom_waiti_data[] = {0x00, 0x70, 0x00, 0x00}; - -static struct cpe_tgt_waiti_info cpe_tgt_tomtom_waiti_info = { - .tgt_waiti_size = ARRAY_SIZE(cpe_tgt_tomtom_waiti_data), - .tgt_waiti_data = cpe_tgt_tomtom_waiti_data, -}; - -static enum cpe_svc_result cpe_tgt_tomtom_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param) -{ - if (!codec_info) - return CPE_SVC_INVALID_HANDLE; - if (!param) - return CPE_SVC_INVALID_HANDLE; - - if (codec_info->id == CPE_SVC_CODEC_TOMTOM) { - param->tgt_boot = cpe_tgt_tomtom_boot; - param->tgt_cpar_init_done = cpe_tgt_tomtom_is_cpar_init_done; - param->tgt_is_active = cpe_tgt_tomtom_is_active; - param->tgt_reset = cpe_tgt_tomtom_reset; - param->tgt_read_mailbox = cpe_tgt_tomtom_read_mailbox; - param->tgt_write_mailbox = cpe_tgt_tomtom_write_mailbox; - param->tgt_read_ram = cpe_tgt_tomtom_read_RAM; - param->tgt_write_ram = cpe_tgt_tomtom_write_RAM; - param->tgt_route_notification = - cpe_tgt_tomtom_route_notification; - param->tgt_set_debug_mode = cpe_tgt_tomtom_set_debug_mode; - param->tgt_get_cpe_info = cpe_tgt_tomtom_get_cpe_info; - param->tgt_deinit = cpe_tgt_tomtom_deinit; - param->tgt_voice_tx_lab = cpe_tgt_tomtom_voicetx; - param->tgt_waiti_info = &cpe_tgt_tomtom_waiti_info; - - param->inbox = kzalloc(TOMTOM_A_SVASS_SPE_INBOX_SIZE, - GFP_KERNEL); - if (!param->inbox) - return CPE_SVC_NO_MEMORY; - - param->outbox = kzalloc(TOMTOM_A_SVASS_SPE_OUTBOX_SIZE, - GFP_KERNEL); - if (!param->outbox) { - kfree(param->inbox); - return CPE_SVC_NO_MEMORY; - } - } - - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_boot(int debug_mode) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - if (!debug_mode) - rc |= cpe_update_bits( - WCD9335_CPE_SS_WDOG_CFG, - 0x3f, 0x31); - else - pr_info("%s: CPE in debug mode, WDOG disabled\n", - __func__); - - rc |= cpe_register_write(WCD9335_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD, 19); - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x04, 0x00); - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x02, 0x02); - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x01, 0x01); - - if (unlikely(rc)) { - pr_err("%s: Failed to boot, err = %d\n", - __func__, rc); - rc = CPE_SVC_FAILED; - } - - return rc; -} - -static u32 cpe_tgt_wcd9335_is_cpar_init_done(void) -{ - u8 temp = 0; - - cpe_register_read(WCD9335_CPE_SS_STATUS, &temp); - return temp & 0x1; -} - -static u32 cpe_tgt_wcd9335_is_active(void) -{ - u8 temp = 0; - - cpe_register_read(WCD9335_CPE_SS_STATUS, &temp); - return temp & 0x4; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_reset(void) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CFG, 0x01, 0x00); - - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_IRAM_SHUTDOWN, 0x00); - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_DRAM1_SHUTDOWN, 0x00); - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_1, 0x00); - rc |= cpe_register_write( - WCD9335_CODEC_RPM_PWR_CPE_DRAM0_SHUTDOWN_2, 0x00); - - rc |= cpe_update_bits(WCD9335_CPE_SS_CPAR_CTL, 0x04, 0x04); - - if (unlikely(rc)) { - pr_err("%s: failed to reset cpe, err = %d\n", - __func__, rc); - rc = CPE_SVC_FAILED; - } - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_read_mailbox(u8 *buffer, - size_t size) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u32 cnt = 0; - - pr_debug("%s: size=%zd\n", __func__, size); - - if (size > WCD9335_CPE_SS_SPE_OUTBOX_SIZE) - size = WCD9335_CPE_SS_SPE_OUTBOX_SIZE; - - for (cnt = 0; (cnt < size) && (rc == CPE_SVC_SUCCESS); cnt++) - rc = cpe_register_read(WCD9335_CPE_SS_SPE_OUTBOX1(cnt), - &buffer[cnt]); - - rc = cpe_register_write(WCD9335_CPE_SS_OUTBOX1_ACK, 0x01); - - if (unlikely(rc)) { - pr_err("%s: failed to ACK outbox, err = %d\n", - __func__, rc); - rc = CPE_SVC_FAILED; - } - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_write_mailbox(u8 *buffer, - size_t size) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u32 cnt = 0; - - pr_debug("%s: size = %zd\n", __func__, size); - if (size > WCD9335_CPE_SS_SPE_INBOX_SIZE) - size = WCD9335_CPE_SS_SPE_INBOX_SIZE; - for (cnt = 0; (cnt < size) && (rc == CPE_SVC_SUCCESS); cnt++) { - rc |= cpe_register_write(WCD9335_CPE_SS_SPE_INBOX1(cnt), - buffer[cnt]); - } - - if (unlikely(rc)) { - pr_err("%s: Error %d writing mailbox registers\n", - __func__, rc); - return rc; - } - - rc = cpe_register_write(WCD9335_CPE_SS_INBOX1_TRG, 1); - return rc; -} - -static enum cpe_svc_result cpe_wcd9335_get_mem_addr(struct cpe_info *t_info, - const struct cpe_svc_mem_segment *mem_seg, - u32 *addr, u8 *mem) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u32 offset, mem_sz, address; - u8 mem_type; - - switch (mem_seg->type) { - case CPE_SVC_DATA_MEM: - mem_type = MEM_ACCESS_DRAM_VAL; - offset = WCD9335_CPE_SS_SPE_DRAM_OFFSET; - mem_sz = WCD9335_CPE_SS_SPE_DRAM_SIZE; - break; - - case CPE_SVC_INSTRUCTION_MEM: - mem_type = MEM_ACCESS_IRAM_VAL; - offset = WCD9335_CPE_SS_SPE_IRAM_OFFSET; - mem_sz = WCD9335_CPE_SS_SPE_IRAM_SIZE; - break; - - default: - pr_err("%s: Invalid mem type = %u\n", - __func__, mem_seg->type); - return CPE_SVC_INVALID_HANDLE; - } - - if (mem_seg->cpe_addr < offset) { - pr_err("%s: Invalid addr %x for mem type %u\n", - __func__, mem_seg->cpe_addr, mem_type); - return CPE_SVC_INVALID_HANDLE; - } - - address = mem_seg->cpe_addr - offset; - if (address + mem_seg->size > mem_sz) { - pr_err("%s: wrong size %zu, start address %x, mem_type %u\n", - __func__, mem_seg->size, address, mem_type); - return CPE_SVC_INVALID_HANDLE; - } - - (*addr) = address; - (*mem) = mem_type; - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_read_RAM(struct cpe_info *t_info, - struct cpe_svc_mem_segment *mem_seg) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u8 temp = 0; - u32 cnt = 0; - u8 mem = 0x0; - u32 addr = 0; - u32 lastaddr = 0; - u32 ptr_update = true; - bool autoinc; - - if (!mem_seg) { - pr_err("%s: Invalid buffer\n", __func__); - return CPE_SVC_INVALID_HANDLE; - } - - rc = cpe_wcd9335_get_mem_addr(t_info, mem_seg, &addr, &mem); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Cannot obtain address, mem_type %u\n", - __func__, mem_seg->type); - return rc; - } - - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - autoinc = cpe_register_read_autoinc_supported(); - - if (autoinc) - temp = 0x18; - else - temp = 0x10; - - temp |= mem; - - lastaddr = ~addr; - do { - if (!autoinc || (ptr_update)) { - /* write LSB only if modified */ - if ((lastaddr & 0xFF) != (addr & 0xFF)) - rc |= cpe_register_write( - WCD9335_CPE_SS_MEM_PTR_0, - (addr & 0xFF)); - /* write middle byte only if modified */ - if (((lastaddr >> 8) & 0xFF) != ((addr >> 8) & 0xFF)) - rc |= cpe_register_write( - WCD9335_CPE_SS_MEM_PTR_1, - ((addr>>8) & 0xFF)); - /* write MSB only if modified */ - if (((lastaddr >> 16) & 0xFF) != ((addr >> 16) & 0xFF)) - rc |= cpe_register_write( - WCD9335_CPE_SS_MEM_PTR_2, - ((addr>>16) & 0xFF)); - - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, temp); - lastaddr = addr; - addr++; - ptr_update = false; - } - - rc |= cpe_register_read(WCD9335_CPE_SS_MEM_BANK_0, - &mem_seg->data[cnt]); - - if (!autoinc) - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - } while ((++cnt < mem_seg->size) || - (rc != CPE_SVC_SUCCESS)); - - rc |= cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - - if (rc) - pr_err("%s: Failed to read registers, err = %d\n", - __func__, rc); - - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_write_RAM(struct cpe_info *t_info, - const struct cpe_svc_mem_segment *mem_seg) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u8 mem_reg_val = 0; - u8 mem = MEM_ACCESS_NONE_VAL; - u32 addr = 0; - u8 *temp_ptr = NULL; - u32 temp_size = 0; - bool autoinc; - - if (!mem_seg) { - pr_err("%s: Invalid mem segment\n", - __func__); - return CPE_SVC_INVALID_HANDLE; - } - - rc = cpe_wcd9335_get_mem_addr(t_info, mem_seg, &addr, &mem); - - if (rc != CPE_SVC_SUCCESS) { - pr_err("%s: Cannot obtain address, mem_type %u\n", - __func__, mem_seg->type); - return rc; - } - - autoinc = cpe_register_read_autoinc_supported(); - if (autoinc) - mem_reg_val = 0x18; - else - mem_reg_val = 0x10; - - mem_reg_val |= mem; - - rc = cpe_update_bits(WCD9335_CPE_SS_MEM_CTRL, - 0x0F, mem_reg_val); - - rc = cpe_register_write(WCD9335_CPE_SS_MEM_PTR_0, - (addr & 0xFF)); - rc = cpe_register_write(WCD9335_CPE_SS_MEM_PTR_1, - ((addr >> 8) & 0xFF)); - - rc = cpe_register_write(WCD9335_CPE_SS_MEM_PTR_2, - ((addr >> 16) & 0xFF)); - - temp_size = 0; - temp_ptr = mem_seg->data; - - while (temp_size <= mem_seg->size) { - u32 to_write = (mem_seg->size >= temp_size+CHUNK_SIZE) - ? CHUNK_SIZE : (mem_seg->size - temp_size); - - if (t_info->state == CPE_STATE_OFFLINE) { - pr_err("%s: CPE is offline\n", __func__); - return CPE_SVC_FAILED; - } - - cpe_register_write_repeat(WCD9335_CPE_SS_MEM_BANK_0, - temp_ptr, to_write); - temp_size += CHUNK_SIZE; - temp_ptr += CHUNK_SIZE; - } - - rc = cpe_register_write(WCD9335_CPE_SS_MEM_CTRL, 0); - - if (rc) - pr_err("%s: Failed to write registers, err = %d\n", - __func__, rc); - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_route_notification( - enum cpe_svc_module module, - enum cpe_svc_route_dest dest) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - pr_debug("%s: Module = %d, Destination = %d\n", - __func__, module, dest); - - switch (module) { - case CPE_SVC_LISTEN_PROC: - switch (dest) { - case CPE_SVC_EXTERNAL: - rc = cpe_update_bits(WCD9335_CPE_SS_CFG, 0x01, 0x01); - break; - case CPE_SVC_INTERNAL: - rc = cpe_update_bits(WCD9335_CPE_SS_CFG, 0x01, 0x00); - break; - default: - pr_err("%s: Invalid destination %d\n", - __func__, dest); - return CPE_SVC_FAILED; - } - break; - default: - pr_err("%s: Invalid module %d\n", - __func__, module); - rc = CPE_SVC_FAILED; - break; - } - return rc; -} - -static enum cpe_svc_result cpe_tgt_wcd9335_set_debug_mode(u32 enable) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - - pr_debug("%s: enable = %s\n", __func__, - (enable) ? "true" : "false"); - - return rc; -} - -static const struct cpe_svc_hw_cfg *cpe_tgt_wcd9335_get_cpe_info(void) -{ - return &cpe_svc_wcd9335_info; -} - -static enum cpe_svc_result -cpe_tgt_wcd9335_deinit(struct cpe_svc_tgt_abstraction *param) -{ - kfree(param->inbox); - param->inbox = NULL; - kfree(param->outbox); - param->outbox = NULL; - memset(param, 0, sizeof(struct cpe_svc_tgt_abstraction)); - - return CPE_SVC_SUCCESS; -} - -static enum cpe_svc_result - cpe_tgt_wcd9335_voicetx(bool enable) -{ - enum cpe_svc_result rc = CPE_SVC_SUCCESS; - u8 val = 0; - - pr_debug("%s: enable = %u\n", __func__, enable); - if (enable) - val = 0x02; - else - val = 0x00; - - rc = cpe_update_bits(WCD9335_CPE_SS_CFG, 0x02, val); - val = 0; - cpe_register_read(WCD9335_CPE_SS_CFG, &val); - - return rc; -} - -static u8 cpe_tgt_wcd9335_waiti_data[] = {0x00, 0x70, 0x00, 0x00}; - -static struct cpe_tgt_waiti_info cpe_tgt_wcd9335_waiti_info = { - .tgt_waiti_size = ARRAY_SIZE(cpe_tgt_wcd9335_waiti_data), - .tgt_waiti_data = cpe_tgt_wcd9335_waiti_data, -}; - -static enum cpe_svc_result cpe_tgt_wcd9335_init( - struct cpe_svc_codec_info_v1 *codec_info, - struct cpe_svc_tgt_abstraction *param) -{ - if (!codec_info) - return CPE_SVC_INVALID_HANDLE; - if (!param) - return CPE_SVC_INVALID_HANDLE; - - if (codec_info->id == CPE_SVC_CODEC_WCD9335) { - param->tgt_boot = cpe_tgt_wcd9335_boot; - param->tgt_cpar_init_done = cpe_tgt_wcd9335_is_cpar_init_done; - param->tgt_is_active = cpe_tgt_wcd9335_is_active; - param->tgt_reset = cpe_tgt_wcd9335_reset; - param->tgt_read_mailbox = cpe_tgt_wcd9335_read_mailbox; - param->tgt_write_mailbox = cpe_tgt_wcd9335_write_mailbox; - param->tgt_read_ram = cpe_tgt_wcd9335_read_RAM; - param->tgt_write_ram = cpe_tgt_wcd9335_write_RAM; - param->tgt_route_notification = - cpe_tgt_wcd9335_route_notification; - param->tgt_set_debug_mode = cpe_tgt_wcd9335_set_debug_mode; - param->tgt_get_cpe_info = cpe_tgt_wcd9335_get_cpe_info; - param->tgt_deinit = cpe_tgt_wcd9335_deinit; - param->tgt_voice_tx_lab = cpe_tgt_wcd9335_voicetx; - param->tgt_waiti_info = &cpe_tgt_wcd9335_waiti_info; - - param->inbox = kzalloc(WCD9335_CPE_SS_SPE_INBOX_SIZE, - GFP_KERNEL); - if (!param->inbox) - return CPE_SVC_NO_MEMORY; - - param->outbox = kzalloc(WCD9335_CPE_SS_SPE_OUTBOX_SIZE, - GFP_KERNEL); - if (!param->outbox) { - kfree(param->inbox); - return CPE_SVC_NO_MEMORY; - } - } - - return CPE_SVC_SUCCESS; -} - -MODULE_DESCRIPTION("WCD CPE Services"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wcd_cpe_services.h b/techpack/audio/asoc/codecs/wcd_cpe_services.h deleted file mode 100644 index 68eb61996a69..000000000000 --- a/techpack/audio/asoc/codecs/wcd_cpe_services.h +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright (c) 2014-2015, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __CPE_SERVICES__ -#define __CPE_SERVICES__ - -#define CPE_IRQ_OUTBOX_IRQ 0x01 -#define CPE_IRQ_MEM_ACCESS_ERROR 0x02 -#define CPE_IRQ_WDOG_BITE 0x04 -#define CPE_IRQ_BUFFER_OVERFLOW 0x08 -#define CPE_IRQ_LAB_OVFUNF 0x10 -#define CPE_IRQ_FLL_LOCK_LOST 0x20 -#define CPE_IRQ_RCO_WDOG_INT 0x40 - -#define EFAILED (MAX_ERRNO - 1) -#define ENOTREADY (MAX_ERRNO - 2) - -#define MAX_SUPPORTED_CLKFREQ 8 -#define CPE_SVC_INIT_PARAM_V1 1 - -enum cpe_svc_result { - CPE_SVC_SUCCESS = 0, - CPE_SVC_FAILED = -EFAILED, - CPE_SVC_NO_MEMORY = -ENOMEM, - CPE_SVC_INVALID_HANDLE = -EINVAL, - CPE_SVC_NOT_READY = -ENOTREADY, - CPE_SVC_SHUTTING_DOWN = -ESHUTDOWN, - CPE_SVC_BUSY = -EBUSY, -}; - -enum cpe_svc_event { - CPE_SVC_CMI_MSG = 0x01, - CPE_SVC_OFFLINE = 0x02, - CPE_SVC_ONLINE = 0x04, - CPE_SVC_BOOT_FAILED = 0x08, - CPE_SVC_READ_COMPLETE = 0x10, - CPE_SVC_READ_ERROR = 0x20, - CPE_SVC_BOOT = 0x40, - CPE_SVC_CMI_CLIENTS_DEREG = 0x100, - CPE_SVC_EVENT_ANCHOR = 0x7FFF -}; - -enum cpe_svc_module { - CPE_SVC_LISTEN_PROC = 1, - CPE_SVC_MODULE_ANCHOR = 0x7F -}; - -enum cpe_svc_route_dest { - CPE_SVC_EXTERNAL = 1, - CPE_SVC_INTERNAL = 2, - CPE_SVC_ROUTE_ANCHOR = 0x7F -}; - -enum cpe_svc_mem_type { - CPE_SVC_DATA_MEM = 1, - CPE_SVC_INSTRUCTION_MEM = 2, - CPE_SVC_IPC_MEM = 3, - CPE_SVC_MEM_TYPE_ANCHOR = 0x7F -}; - -enum cpe_svc_codec_id { - CPE_SVC_CODEC_TOMTOM = 5, - CPE_SVC_CODEC_WCD9335 = 7, - CPE_SVC_CODEC_WCD9326 = 8, - CPE_SVC_CODEC_ID_ANCHOR = 0x7ffffff -}; - -enum cpe_svc_codec_version { - CPE_SVC_CODEC_V1P0 = 1, - CPE_SVC_CODEC_VERSION_ANCHOR = 0x7fffffff -}; - -struct cpe_svc_codec_info_v1 { - u16 major_version;/*must be 1*/ - u16 minor_version;/*must be 0*/ - u32 id; - u32 version; - /*Add 1.1 version fields after this line*/ -}; - -struct cpe_svc_notification { - enum cpe_svc_event event; - enum cpe_svc_result result; - void *payload; - void *private_data; -}; - -struct cpe_svc_msg_payload { - u8 *cmi_msg; -}; - -struct cpe_svc_read_complete { - u8 *buffer; - size_t size; -}; - -struct cpe_svc_boot_event { - u32 debug_address; - size_t debug_buffer_size; - u32 status; -}; - -struct cpe_svc_mem_segment { - enum cpe_svc_mem_type type; - u32 cpe_addr; - size_t size; - u8 *data; -}; - -struct cpe_svc_hw_cfg { - size_t DRAM_size; - u32 DRAM_offset; - size_t IRAM_size; - u32 IRAM_offset; - u8 inbox_size; - u8 outbox_size; -}; - -struct cpe_svc_cfg_clk_plan { - u32 current_clk_feq; - u32 num_clk_freqs; - u32 clk_freqs[MAX_SUPPORTED_CLKFREQ]; -}; - -struct cpe_svc_init_param { - void *context; - u32 version; - void (*query_freq_plans_cb)(void *cdc_priv, - struct cpe_svc_cfg_clk_plan *clk_freq); - void (*change_freq_plan_cb)(void *cdc_priv, - u32 clk_freq); -}; - - -void *cpe_svc_initialize( - void irq_control_callback(u32 enable), - const void *codec_info, void *context); -enum cpe_svc_result cpe_svc_deinitialize(void *cpe_handle); - -void *cpe_svc_register(void *cpe_handle, - void (*notification_callback)( - const struct cpe_svc_notification *parameter), - u32 mask, const char *name); - -enum cpe_svc_result cpe_svc_deregister(void *cpe_handle, void *reg_handle); - -enum cpe_svc_result cpe_svc_download_segment(void *cpe_handle, - const struct cpe_svc_mem_segment *segment); - -enum cpe_svc_result cpe_svc_boot(void *cpe_handle, int debug_mode); - -enum cpe_svc_result cpe_svc_shutdown(void *cpe_handle); - -enum cpe_svc_result cpe_svc_reset(void *cpe_handle); - -enum cpe_svc_result cpe_svc_process_irq(void *cpe_handle, u32 cpe_irq); - -enum cpe_svc_result -cpe_svc_route_notification(void *cpe_handle, enum cpe_svc_module module, - enum cpe_svc_route_dest dest); - -enum cpe_svc_result cpe_svc_ramdump(void *cpe_handle, - struct cpe_svc_mem_segment *buffer); - -enum cpe_svc_result cpe_svc_set_debug_mode(void *cpe_handle, u32 mode); - -const struct cpe_svc_hw_cfg *cpe_svc_get_hw_cfg(void *cpe_handle); -enum cpe_svc_result cpe_svc_toggle_lab(void *cpe_handle, bool enable); -enum cpe_svc_result cpe_svc_ftm_test(void *cpe_handle, u32 *status); -#endif /*__CPE_SERVICES__*/ diff --git a/techpack/audio/asoc/codecs/wcdcal-hwdep.c b/techpack/audio/asoc/codecs/wcdcal-hwdep.c deleted file mode 100644 index 31eae69b1f4b..000000000000 --- a/techpack/audio/asoc/codecs/wcdcal-hwdep.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "wcdcal-hwdep.h" - -const int cal_size_info[WCD9XXX_MAX_CAL] = { - [WCD9XXX_ANC_CAL] = 16384, - [WCD9XXX_MBHC_CAL] = 4096, - [WCD9XXX_MAD_CAL] = 4096, - [WCD9XXX_VBAT_CAL] = 72, -}; - -const char *cal_name_info[WCD9XXX_MAX_CAL] = { - [WCD9XXX_ANC_CAL] = "anc", - [WCD9XXX_MBHC_CAL] = "mbhc", - [WCD9XXX_MAD_CAL] = "mad", - [WCD9XXX_VBAT_CAL] = "vbat", -}; - -struct firmware_cal *wcdcal_get_fw_cal(struct fw_info *fw_data, - enum wcd_cal_type type) -{ - if (!fw_data) { - pr_err("%s: fw_data is NULL\n", __func__); - return NULL; - } - if (type >= WCD9XXX_MAX_CAL || - type < WCD9XXX_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", __func__, type); - return NULL; - } - mutex_lock(&fw_data->lock); - if (!test_bit(WCDCAL_RECIEVED, - &fw_data->wcdcal_state[type])) { - pr_err("%s: cal not sent by userspace %d\n", - __func__, type); - mutex_unlock(&fw_data->lock); - return NULL; - } - mutex_unlock(&fw_data->lock); - return fw_data->fw[type]; -} -EXPORT_SYMBOL(wcdcal_get_fw_cal); - -static int wcdcal_hwdep_ioctl_shared(struct snd_hwdep *hw, - struct wcdcal_ioctl_buffer fw_user) -{ - struct fw_info *fw_data = hw->private_data; - struct firmware_cal **fw = fw_data->fw; - void *data; - - if (!test_bit(fw_user.cal_type, fw_data->cal_bit)) { - pr_err("%s: codec didn't set this %d!!\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.cal_type >= WCD9XXX_MAX_CAL || - fw_user.cal_type < WCD9XXX_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.size > cal_size_info[fw_user.cal_type] || - fw_user.size <= 0) { - pr_err("%s: incorrect firmware size %d for %s\n", - __func__, fw_user.size, - cal_name_info[fw_user.cal_type]); - return -EFAULT; - } - data = fw[fw_user.cal_type]->data; - if (copy_from_user(data, fw_user.buffer, fw_user.size)) - return -EFAULT; - fw[fw_user.cal_type]->size = fw_user.size; - mutex_lock(&fw_data->lock); - set_bit(WCDCAL_RECIEVED, &fw_data->wcdcal_state[fw_user.cal_type]); - mutex_unlock(&fw_data->lock); - return 0; -} - -#ifdef CONFIG_COMPAT -struct wcdcal_ioctl_buffer32 { - u32 size; - compat_uptr_t buffer; - enum wcd_cal_type cal_type; -}; - -enum { - SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32 = - _IOW('U', 0x1, struct wcdcal_ioctl_buffer32), -}; - -static int wcdcal_hwdep_ioctl_compat(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct wcdcal_ioctl_buffer __user *argp = (void __user *)arg; - struct wcdcal_ioctl_buffer32 fw_user32; - struct wcdcal_ioctl_buffer fw_user_compat; - - if (cmd != SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32) { - pr_err("%s: wrong ioctl command sent %u!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user32, argp, sizeof(fw_user32))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - fw_user_compat.size = fw_user32.size; - fw_user_compat.buffer = compat_ptr(fw_user32.buffer); - fw_user_compat.cal_type = fw_user32.cal_type; - return wcdcal_hwdep_ioctl_shared(hw, fw_user_compat); -} -#else -#define wcdcal_hwdep_ioctl_compat NULL -#endif - -static int wcdcal_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct wcdcal_ioctl_buffer __user *argp = (void __user *)arg; - struct wcdcal_ioctl_buffer fw_user; - - if (cmd != SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE) { - pr_err("%s: wrong ioctl command sent %d!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user, argp, sizeof(fw_user))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - return wcdcal_hwdep_ioctl_shared(hw, fw_user); -} - -static int wcdcal_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ - struct fw_info *fw_data = hw->private_data; - - mutex_lock(&fw_data->lock); - /* clear all the calibrations */ - memset(fw_data->wcdcal_state, 0, - sizeof(fw_data->wcdcal_state)); - mutex_unlock(&fw_data->lock); - return 0; -} - -int wcd_cal_create_hwdep(void *data, int node, struct snd_soc_codec *codec) -{ - char hwname[40]; - struct snd_hwdep *hwdep; - struct firmware_cal **fw; - struct fw_info *fw_data = data; - int err, cal_bit; - - if (!fw_data || !codec) { - pr_err("%s: wrong arguments passed\n", __func__); - return -EINVAL; - } - - fw = fw_data->fw; - snprintf(hwname, strlen("Codec %s"), "Codec %s", - codec->component.name); - err = snd_hwdep_new(codec->component.card->snd_card, - hwname, node, &hwdep); - if (err < 0) { - dev_err(codec->dev, "%s: new hwdep failed %d\n", - __func__, err); - return err; - } - snprintf(hwdep->name, strlen("Codec %s"), "Codec %s", - codec->component.name); - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_CODEC; - hwdep->private_data = fw_data; - hwdep->ops.ioctl_compat = wcdcal_hwdep_ioctl_compat; - hwdep->ops.ioctl = wcdcal_hwdep_ioctl; - hwdep->ops.release = wcdcal_hwdep_release; - mutex_init(&fw_data->lock); - - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - set_bit(WCDCAL_UNINITIALISED, - &fw_data->wcdcal_state[cal_bit]); - fw[cal_bit] = kzalloc(sizeof *(fw[cal_bit]), GFP_KERNEL); - if (!fw[cal_bit]) { - dev_err(codec->dev, "%s: no memory for %s cal\n", - __func__, cal_name_info[cal_bit]); - goto end; - } - } - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - fw[cal_bit]->data = kzalloc(cal_size_info[cal_bit], - GFP_KERNEL); - if (!fw[cal_bit]->data) - goto exit; - set_bit(WCDCAL_INITIALISED, - &fw_data->wcdcal_state[cal_bit]); - } - return 0; -exit: - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - kfree(fw[cal_bit]->data); - fw[cal_bit]->data = NULL; - } -end: - for_each_set_bit(cal_bit, fw_data->cal_bit, WCD9XXX_MAX_CAL) { - kfree(fw[cal_bit]); - fw[cal_bit] = NULL; - } - return -ENOMEM; -} -EXPORT_SYMBOL(wcd_cal_create_hwdep); diff --git a/techpack/audio/asoc/codecs/wcdcal-hwdep.h b/techpack/audio/asoc/codecs/wcdcal-hwdep.h deleted file mode 100644 index 632e2f11f323..000000000000 --- a/techpack/audio/asoc/codecs/wcdcal-hwdep.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __WCD9XXX_HWDEP_H__ -#define __WCD9XXX_HWDEP_H__ -#include - -enum wcd_cal_states { - WCDCAL_UNINITIALISED, - WCDCAL_INITIALISED, - WCDCAL_RECIEVED -}; - -struct fw_info { - struct firmware_cal *fw[WCD9XXX_MAX_CAL]; - DECLARE_BITMAP(cal_bit, WCD9XXX_MAX_CAL); - /* for calibration tracking */ - unsigned long wcdcal_state[WCD9XXX_MAX_CAL]; - struct mutex lock; -}; - -struct firmware_cal { - u8 *data; - size_t size; -}; - -struct snd_soc_codec; -int wcd_cal_create_hwdep(void *fw, int node, struct snd_soc_codec *codec); -struct firmware_cal *wcdcal_get_fw_cal(struct fw_info *fw_data, - enum wcd_cal_type type); -#endif /* __WCD9XXX_HWDEP_H__ */ diff --git a/techpack/audio/asoc/codecs/wsa881x-analog.c b/techpack/audio/asoc/codecs/wsa881x-analog.c deleted file mode 100644 index 696ae7f29dbf..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-analog.c +++ /dev/null @@ -1,1444 +0,0 @@ -/* Copyright (c) 2015-2016, 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-cdc-pinctrl.h" -#include "wsa881x-analog.h" -#include "wsa881x-temp-sensor.h" - -#define SPK_GAIN_12DB 4 -#define WIDGET_NAME_MAX_SIZE 80 - -/* - * Private data Structure for wsa881x. All parameters related to - * WSA881X codec needs to be defined here. - */ -struct wsa881x_pdata { - struct regmap *regmap[2]; - struct i2c_client *client[2]; - struct snd_soc_codec *codec; - - /* track wsa881x status during probe */ - int status; - bool boost_enable; - bool visense_enable; - int spk_pa_gain; - struct i2c_msg xfer_msg[2]; - struct mutex xfer_lock; - bool regmap_flag; - bool wsa_active; - int index; - struct clk *wsa_mclk; - struct wsa881x_tz_priv tz_pdata; - int bg_cnt; - int clk_cnt; - int enable_cnt; - int version; - struct mutex bg_lock; - struct mutex res_lock; - struct delayed_work ocp_ctl_work; - struct device_node *wsa_vi_gpio_p; - struct device_node *wsa_clk_gpio_p; - struct device_node *wsa_reset_gpio_p; -}; - -enum { - WSA881X_STATUS_PROBING, - WSA881X_STATUS_I2C, -}; - -#define WSA881X_OCP_CTL_TIMER_SEC 2 -#define WSA881X_OCP_CTL_TEMP_CELSIUS 25 -#define WSA881X_OCP_CTL_POLL_TIMER_SEC 60 - -static int wsa881x_ocp_poll_timer_sec = WSA881X_OCP_CTL_POLL_TIMER_SEC; -module_param(wsa881x_ocp_poll_timer_sec, int, 0664); -MODULE_PARM_DESC(wsa881x_ocp_poll_timer_sec, "timer for ocp ctl polling"); - -static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec, - bool enable); - -const char *wsa_tz_names[] = {"wsa881x.0e", "wsa881x.0f"}; - -struct wsa881x_pdata wsa_pdata[MAX_WSA881X_DEVICE]; - - -static int wsa881x_populate_dt_pdata(struct device *dev, int wsa881x_index); -static int wsa881x_reset(struct wsa881x_pdata *pdata, bool enable); -static int wsa881x_startup(struct wsa881x_pdata *pdata); -static int wsa881x_shutdown(struct wsa881x_pdata *pdata); - -static int delay_array_msec[] = {10, 20, 30, 40, 50}; - -static int wsa881x_i2c_addr = -1; -static int wsa881x_probing_count; -static int wsa881x_presence_count; - -static const char * const wsa881x_spk_pa_gain_text[] = { -"POS_13P5_DB", "POS_12_DB", "POS_10P5_DB", "POS_9_DB", "POS_7P5_DB", -"POS_6_DB", "POS_4P5_DB", "POS_3_DB", "POS_1P5_DB", "POS_0_DB"}; - -static const struct soc_enum wsa881x_spk_pa_gain_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wsa881x_spk_pa_gain_text), - wsa881x_spk_pa_gain_text), -}; - -static int wsa881x_spk_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->spk_pa_gain; - - dev_dbg(codec->dev, "%s: spk_pa_gain = %ld\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int wsa881x_spk_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - if (ucontrol->value.integer.value[0] < 0 || - ucontrol->value.integer.value[0] > 0xC) { - dev_err(codec->dev, "%s: Unsupported gain val %ld\n", - __func__, ucontrol->value.integer.value[0]); - return -EINVAL; - } - wsa881x->spk_pa_gain = ucontrol->value.integer.value[0]; - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int get_i2c_wsa881x_device_index(u16 reg) -{ - u16 mask = 0x0f00; - int value = 0; - - value = ((reg & mask) >> 8) & 0x000f; - - switch (value) { - case 0: - return 0; - case 1: - return 1; - default: - break; - } - return -EINVAL; -} - -static int wsa881x_i2c_write_device(struct wsa881x_pdata *wsa881x, - unsigned int reg, unsigned int val) -{ - int i = 0, rc = 0; - int wsa881x_index; - struct i2c_msg *msg; - int ret = 0; - int bytes = 1; - u8 reg_addr = 0; - u8 data[bytes + 1]; - - wsa881x_index = get_i2c_wsa881x_device_index(reg); - if (wsa881x_index < 0) { - pr_err_ratelimited("%s:invalid register to write\n", __func__); - return -EINVAL; - } - if (wsa881x->regmap_flag) { - rc = regmap_write(wsa881x->regmap[wsa881x_index], reg, val); - for (i = 0; rc && i < ARRAY_SIZE(delay_array_msec); i++) { - pr_err_ratelimited("Failed writing reg=%u-retry(%d)\n", - reg, i); - /* retry after delay of increasing order */ - msleep(delay_array_msec[i]); - rc = regmap_write(wsa881x->regmap[wsa881x_index], - reg, val); - } - if (rc) - pr_err_ratelimited("Failed writing reg=%u rc=%d\n", - reg, rc); - else - pr_debug("write success register = %x val = %x\n", - reg, val); - } else { - reg_addr = (u8)reg; - msg = &wsa881x->xfer_msg[0]; - msg->addr = wsa881x->client[wsa881x_index]->addr; - msg->len = bytes + 1; - msg->flags = 0; - data[0] = reg; - data[1] = (u8)val; - msg->buf = data; - ret = i2c_transfer(wsa881x->client[wsa881x_index]->adapter, - wsa881x->xfer_msg, 1); - /* Try again if the write fails */ - if (ret != 1) { - ret = i2c_transfer( - wsa881x->client[wsa881x_index]->adapter, - wsa881x->xfer_msg, 1); - if (ret != 1) { - pr_err_ratelimited("failed to write the device\n"); - return ret; - } - } - pr_debug("write success reg = %x val = %x\n", reg, data[1]); - } - return rc; -} - -static int wsa881x_i2c_read_device(struct wsa881x_pdata *wsa881x, - unsigned int reg) -{ - int wsa881x_index; - int i = 0, rc = 0; - unsigned int val; - struct i2c_msg *msg; - int ret = 0; - u8 reg_addr = 0; - u8 dest[5] = {0}; - - wsa881x_index = get_i2c_wsa881x_device_index(reg); - if (wsa881x_index < 0) { - pr_err_ratelimited("%s:invalid register to read\n", __func__); - return -EINVAL; - } - if (wsa881x->regmap_flag) { - rc = regmap_read(wsa881x->regmap[wsa881x_index], reg, &val); - for (i = 0; rc && i < ARRAY_SIZE(delay_array_msec); i++) { - pr_err_ratelimited("Failed reading reg=%u - retry(%d)\n", - reg, i); - /*retry after delay of increasing orde*/ - msleep(delay_array_msec[i]); - rc = regmap_read(wsa881x->regmap[wsa881x_index], - reg, &val); - } - if (rc) { - pr_err_ratelimited("Failed reading reg=%u rc=%d\n", - reg, rc); - return rc; - } - pr_debug("read success reg = %x val = %x\n", - reg, val); - } else { - reg_addr = (u8)reg; - msg = &wsa881x->xfer_msg[0]; - msg->addr = wsa881x->client[wsa881x_index]->addr; - msg->len = 1; - msg->flags = 0; - msg->buf = ®_addr; - - msg = &wsa881x->xfer_msg[1]; - msg->addr = wsa881x->client[wsa881x_index]->addr; - msg->len = 1; - msg->flags = I2C_M_RD; - msg->buf = dest; - ret = i2c_transfer(wsa881x->client[wsa881x_index]->adapter, - wsa881x->xfer_msg, 2); - - /* Try again if read fails first time */ - if (ret != 2) { - ret = i2c_transfer( - wsa881x->client[wsa881x_index]->adapter, - wsa881x->xfer_msg, 2); - if (ret != 2) { - pr_err_ratelimited("failed to read wsa register:%d\n", - reg); - return ret; - } - } - val = dest[0]; - } - return val; -} - -static unsigned int wsa881x_i2c_read(struct snd_soc_codec *codec, - unsigned int reg) -{ - struct wsa881x_pdata *wsa881x; - int wsa881x_index; - - if (codec == NULL) { - pr_err_ratelimited("%s: invalid codec\n", __func__); - return -EINVAL; - } - wsa881x = snd_soc_codec_get_drvdata(codec); - if (!wsa881x->wsa_active) - return 0; - - wsa881x_index = get_i2c_wsa881x_device_index(reg); - if (wsa881x_index < 0) { - pr_err_ratelimited("%s:invalid register to read\n", __func__); - return -EINVAL; - } - return wsa881x_i2c_read_device(wsa881x, reg); -} - -static int wsa881x_i2c_write(struct snd_soc_codec *codec, unsigned int reg, - unsigned int val) -{ - struct wsa881x_pdata *wsa881x; - int wsa881x_index; - - if (codec == NULL) { - pr_err_ratelimited("%s: invalid codec\n", __func__); - return -EINVAL; - } - wsa881x = snd_soc_codec_get_drvdata(codec); - if (!wsa881x->wsa_active) - return 0; - - wsa881x_index = get_i2c_wsa881x_device_index(reg); - if (wsa881x_index < 0) { - pr_err_ratelimited("%s:invalid register to read\n", __func__); - return -EINVAL; - } - return wsa881x_i2c_write_device(wsa881x, reg, val); -} - -static int wsa881x_i2c_get_client_index(struct i2c_client *client, - int *wsa881x_index) -{ - int ret = 0; - - switch (client->addr) { - case WSA881X_I2C_SPK0_SLAVE0_ADDR: - case WSA881X_I2C_SPK0_SLAVE1_ADDR: - *wsa881x_index = WSA881X_I2C_SPK0_SLAVE0; - break; - case WSA881X_I2C_SPK1_SLAVE0_ADDR: - case WSA881X_I2C_SPK1_SLAVE1_ADDR: - *wsa881x_index = WSA881X_I2C_SPK1_SLAVE0; - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - -static int wsa881x_boost_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: enable:%d\n", __func__, enable); - if (enable) { - if (!WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_ANA_CTL, - 0x01, 0x01); - snd_soc_update_bits(codec, WSA881X_ANA_CTL, - 0x04, 0x04); - snd_soc_update_bits(codec, WSA881X_BOOST_PS_CTL, - 0x40, 0x00); - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1, - 0xF0, 0xB0); - snd_soc_update_bits(codec, WSA881X_BOOST_ZX_CTL, - 0x20, 0x00); - snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, - 0x80, 0x80); - } else { - snd_soc_update_bits(codec, WSA881X_BOOST_LOOP_STABILITY, - 0x03, 0x03); - snd_soc_update_bits(codec, WSA881X_BOOST_MISC2_CTL, - 0xFF, 0x14); - snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, - 0x80, 0x80); - snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, - 0x03, 0x00); - snd_soc_update_bits(codec, - WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, - 0x0C, 0x04); - snd_soc_update_bits(codec, - WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, - 0x03, 0x00); - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1, - 0xF0, 0x70); - snd_soc_update_bits(codec, WSA881X_ANA_CTL, 0x03, 0x01); - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, - 0x08, 0x08); - snd_soc_update_bits(codec, WSA881X_ANA_CTL, 0x04, 0x04); - snd_soc_update_bits(codec, WSA881X_BOOST_CURRENT_LIMIT, - 0x0F, 0x08); - snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, - 0x80, 0x80); - } - /* For WSA8810, start-up time is 1500us as per qcrg sequence */ - usleep_range(1500, 1510); - } else { - /* ENSURE: Class-D amp is shutdown. CLK is still on */ - snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x00); - /* boost settle time is 1500us as per qcrg sequence */ - usleep_range(1500, 1510); - } - return 0; -} - -static int wsa881x_visense_txfe_ctrl(struct snd_soc_codec *codec, bool enable, - u8 isense1_gain, u8 isense2_gain, - u8 vsense_gain) -{ - u8 value = 0; - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: enable:%d\n", __func__, enable); - - if (enable) { - if (WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_OTP_REG_28, - 0x3F, 0x3A); - snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG1, - 0xFF, 0xB2); - snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG2, - 0xFF, 0x05); - } - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_VSENSE_VCM, - 0x08, 0x00); - if (WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_ATEST2, - 0x1C, 0x04); - } else { - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_ATEST2, - 0x08, 0x08); - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_ATEST2, - 0x02, 0x02); - } - value = ((isense2_gain << 6) | (isense1_gain << 4) | - (vsense_gain << 3)); - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN, - 0xF8, value); - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN, - 0x01, 0x01); - } else { - if (WSA881X_IS_2_0(wsa881x->version)) - snd_soc_update_bits(codec, - WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x10, 0x10); - else - snd_soc_update_bits(codec, - WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x08, 0x08); - /* - * 200us sleep is needed after visense txfe disable as per - * HW requirement. - */ - usleep_range(200, 210); - - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN, - 0x01, 0x00); - } - return 0; -} - -static int wsa881x_visense_adc_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: enable:%d\n", __func__, enable); - if (enable) { - if (!WSA881X_IS_2_0(wsa881x->version)) - snd_soc_update_bits(codec, WSA881X_ADC_SEL_IBIAS, - 0x70, 0x40); - snd_soc_update_bits(codec, WSA881X_ADC_EN_SEL_IBIAS, - 0x07, 0x04); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, 0x80, 0x80); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_I, 0x80, 0x80); - } else { - /* Ensure: Speaker Protection has been stopped */ - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, 0x80, 0x00); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_I, 0x80, 0x00); - } - - return 0; -} - -static void wsa881x_bandgap_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: enable:%d, bg_count:%d\n", __func__, - enable, wsa881x->bg_cnt); - mutex_lock(&wsa881x->bg_lock); - if (enable) { - ++wsa881x->bg_cnt; - if (wsa881x->bg_cnt == 1) { - snd_soc_update_bits(codec, WSA881X_TEMP_OP, - 0x08, 0x08); - /* 400usec sleep is needed as per HW requirement */ - usleep_range(400, 410); - snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x04, 0x04); - } - } else { - --wsa881x->bg_cnt; - if (wsa881x->bg_cnt <= 0) { - WARN_ON(wsa881x->bg_cnt < 0); - wsa881x->bg_cnt = 0; - snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x04, 0x00); - snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x08, 0x00); - } - } - mutex_unlock(&wsa881x->bg_lock); -} - -static void wsa881x_clk_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s:ss enable:%d, clk_count:%d\n", __func__, - enable, wsa881x->clk_cnt); - mutex_lock(&wsa881x->res_lock); - if (enable) { - ++wsa881x->clk_cnt; - if (wsa881x->clk_cnt == 1) { - snd_soc_write(codec, WSA881X_CDC_RST_CTL, 0x02); - snd_soc_write(codec, WSA881X_CDC_RST_CTL, 0x03); - snd_soc_write(codec, WSA881X_CLOCK_CONFIG, 0x01); - - snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x01); - snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x01); - - } - } else { - --wsa881x->clk_cnt; - if (wsa881x->clk_cnt <= 0) { - WARN_ON(wsa881x->clk_cnt < 0); - wsa881x->clk_cnt = 0; - snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x00); - snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x00); - if (WSA881X_IS_2_0(wsa881x->version)) - snd_soc_update_bits(codec, - WSA881X_CDC_TOP_CLK_CTL, 0x01, 0x00); - } - } - mutex_unlock(&wsa881x->res_lock); -} - -static int wsa881x_rdac_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: enable:%d\n", __func__, enable); - if (enable) { - snd_soc_update_bits(codec, WSA881X_ANA_CTL, 0x08, 0x00); - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, 0x08, 0x08); - snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x20, 0x20); - snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x20, 0x00); - snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x40, 0x40); - snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x80, 0x80); - if (WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL, - 0x01, 0x01); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, - 0x30, 0x30); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, - 0x0C, 0x00); - } - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, 0xF0, 0x40); - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0x01, 0x01); - } else { - /* Ensure class-D amp is off */ - snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x80, 0x00); - } - return 0; -} - -static int wsa881x_spkr_pa_ctrl(struct snd_soc_codec *codec, bool enable) -{ - int ret = 0; - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: enable:%d\n", __func__, enable); - if (enable) { - /* - * Ensure: Boost is enabled and stable, Analog input is up - * and outputting silence - */ - if (!WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_I, - 0xFF, 0x01); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, - 0x02, 0x02); - snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_V, - 0xFF, 0x10); - snd_soc_update_bits(codec, WSA881X_SPKR_PWRSTG_DBG, - 0xA0, 0xA0); - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, - 0x80, 0x80); - usleep_range(700, 710); - snd_soc_update_bits(codec, WSA881X_SPKR_PWRSTG_DBG, - 0x00, 0x00); - snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_V, - 0xFF, 0x00); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, - 0x02, 0x00); - snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_I, - 0xFF, 0x00); - } else - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, - 0x80, 0x80); - /* add 1000us delay as per qcrg */ - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x01, 0x01); - if (WSA881X_IS_2_0(wsa881x->version)) - snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL, - 0x01, 0x00); - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, 0xF0, - (wsa881x->spk_pa_gain << 4)); - if (wsa881x->visense_enable) { - ret = msm_cdc_pinctrl_select_active_state( - wsa881x->wsa_vi_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be activated %s\n", - __func__, "wsa_vi"); - return ret; - } - wsa881x_visense_txfe_ctrl(codec, true, - 0x00, 0x01, 0x00); - wsa881x_visense_adc_ctrl(codec, true); - } - } else { - /* - * Ensure: Boost is still on, Stream from Analog input and - * Speaker Protection has been stopped and input is at 0V - */ - if (WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL, - 0x01, 0x01); - usleep_range(1000, 1010); - snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL, - 0x01, 0x00); - msleep(20); - snd_soc_update_bits(codec, WSA881X_ANA_CTL, - 0x03, 0x00); - usleep_range(200, 210); - } - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x80, 0x00); - } - return 0; -} - -static int wsa881x_get_boost(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->boost_enable; - return 0; -} - -static int wsa881x_set_boost(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Boost enable current %d, new %d\n", - __func__, wsa881x->boost_enable, value); - wsa881x->boost_enable = value; - return 0; -} - -static int wsa881x_get_visense(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->visense_enable; - return 0; -} - -static int wsa881x_set_visense(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: VIsense enable current %d, new %d\n", - __func__, wsa881x->visense_enable, value); - wsa881x->visense_enable = value; - return 0; -} - -static const struct snd_kcontrol_new wsa881x_snd_controls[] = { - SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_boost, wsa881x_set_boost), - - SOC_SINGLE_EXT("VISENSE Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_visense, wsa881x_set_visense), - - SOC_ENUM_EXT("WSA_SPK PA Gain", wsa881x_spk_pa_gain_enum[0], - wsa881x_spk_pa_gain_get, wsa881x_spk_pa_gain_put), -}; - -static const char * const rdac_text[] = { - "ZERO", "Switch", -}; - -static const struct soc_enum rdac_enum = - SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(rdac_text), rdac_text); - -static const struct snd_kcontrol_new rdac_mux[] = { - SOC_DAPM_ENUM("RDAC", rdac_enum) -}; - -static int wsa881x_rdac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - dev_dbg(codec->dev, "%s: %s %d boost %d visense %d\n", - __func__, w->name, event, - wsa881x->boost_enable, wsa881x->visense_enable); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = wsa881x_startup(wsa881x); - if (ret) { - pr_err("%s: wsa startup failed ret: %d", __func__, ret); - return ret; - } - wsa881x_clk_ctrl(codec, true); - snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x02, 0x02); - if (!WSA881X_IS_2_0(wsa881x->version)) - snd_soc_update_bits(codec, WSA881X_BIAS_REF_CTRL, - 0x0F, 0x08); - wsa881x_bandgap_ctrl(codec, true); - if (!WSA881X_IS_2_0(wsa881x->version)) - snd_soc_update_bits(codec, WSA881X_SPKR_BBM_CTL, - 0x02, 0x02); - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0xC0, 0x80); - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0x06, 0x06); - if (!WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL2, - 0x04, 0x04); - snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_INT, - 0x09, 0x09); - } - snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0xF0, 0x20); - if (WSA881X_IS_2_0(wsa881x->version)) - snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, - 0x0E, 0x0E); - if (wsa881x->boost_enable) - wsa881x_boost_ctrl(codec, true); - break; - case SND_SOC_DAPM_POST_PMU: - wsa881x_rdac_ctrl(codec, true); - break; - case SND_SOC_DAPM_PRE_PMD: - wsa881x_rdac_ctrl(codec, false); - if (wsa881x->visense_enable) { - wsa881x_visense_adc_ctrl(codec, false); - wsa881x_visense_txfe_ctrl(codec, false, - 0x00, 0x01, 0x00); - ret = msm_cdc_pinctrl_select_sleep_state( - wsa881x->wsa_vi_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be suspended %s\n", - __func__, "wsa_vi"); - return ret; - } - } - break; - case SND_SOC_DAPM_POST_PMD: - if (wsa881x->boost_enable) - wsa881x_boost_ctrl(codec, false); - wsa881x_clk_ctrl(codec, false); - wsa881x_bandgap_ctrl(codec, false); - ret = wsa881x_shutdown(wsa881x); - if (ret < 0) { - pr_err("%s: wsa shutdown failed ret: %d", - __func__, ret); - return ret; - } - break; - default: - pr_err("%s: invalid event:%d\n", __func__, event); - return -EINVAL; - } - return 0; -} - -static void wsa881x_ocp_ctl_work(struct work_struct *work) -{ - struct wsa881x_pdata *wsa881x; - struct delayed_work *dwork; - struct snd_soc_codec *codec; - int temp_val; - - dwork = to_delayed_work(work); - wsa881x = container_of(dwork, struct wsa881x_pdata, ocp_ctl_work); - - if (!wsa881x) - return; - - codec = wsa881x->codec; - wsa881x_get_temp(wsa881x->tz_pdata.tz_dev, &temp_val); - dev_dbg(codec->dev, " temp = %d\n", temp_val); - - if (temp_val <= WSA881X_OCP_CTL_TEMP_CELSIUS) - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x00); - else - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0); - - schedule_delayed_work(&wsa881x->ocp_ctl_work, - msecs_to_jiffies(wsa881x_ocp_poll_timer_sec * 1000)); -} - -static int wsa881x_spkr_pa_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - pr_debug("%s: %s %d\n", __func__, w->name, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x80); - break; - case SND_SOC_DAPM_POST_PMU: - wsa881x_spkr_pa_ctrl(codec, true); - schedule_delayed_work(&wsa881x->ocp_ctl_work, - msecs_to_jiffies(WSA881X_OCP_CTL_TIMER_SEC * 1000)); - break; - case SND_SOC_DAPM_PRE_PMD: - wsa881x_spkr_pa_ctrl(codec, false); - break; - case SND_SOC_DAPM_POST_PMD: - cancel_delayed_work_sync(&wsa881x->ocp_ctl_work); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0); - break; - default: - pr_err("%s: invalid event:%d\n", __func__, event); - return -EINVAL; - } - return 0; -} - - -static const struct snd_soc_dapm_widget wsa881x_dapm_widgets[] = { - SND_SOC_DAPM_INPUT("WSA_IN"), - - SND_SOC_DAPM_DAC_E("RDAC Analog", NULL, SND_SOC_NOPM, 0, 0, - wsa881x_rdac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MUX("WSA_RDAC", SND_SOC_NOPM, 0, 0, - rdac_mux), - - SND_SOC_DAPM_PGA_S("WSA_SPKR PGA", 1, SND_SOC_NOPM, 0, 0, - wsa881x_spkr_pa_event, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | - SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("WSA_SPKR"), -}; - -static const struct snd_soc_dapm_route wsa881x_audio_map[] = { - {"WSA_RDAC", "Switch", "WSA_IN"}, - {"RDAC Analog", NULL, "WSA_RDAC"}, - {"WSA_SPKR PGA", NULL, "RDAC Analog"}, - {"WSA_SPKR", NULL, "WSA_SPKR PGA"}, -}; - - -static int wsa881x_startup(struct wsa881x_pdata *pdata) -{ - int ret = 0; - struct snd_soc_codec *codec = pdata->codec; - struct snd_soc_card *card = codec->component.card; - - pr_debug("%s(): wsa startup, enable_cnt:%d\n", __func__, - pdata->enable_cnt); - - if (pdata->enable_cnt++ > 0) - return 0; - ret = msm_cdc_pinctrl_select_active_state(pdata->wsa_clk_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be activated %s\n", - __func__, "wsa_clk"); - return ret; - } - clk_prepare_enable(pdata->wsa_mclk); - - ret = wsa881x_reset(pdata, true); - return ret; -} - -static int wsa881x_shutdown(struct wsa881x_pdata *pdata) -{ - int ret = 0; - struct snd_soc_codec *codec = pdata->codec; - - pr_debug("%s(): wsa shutdown, enable_cnt:%d\n", __func__, - pdata->enable_cnt); - if (--pdata->enable_cnt > 0) - return 0; - ret = wsa881x_reset(pdata, false); - if (ret) { - pr_err("%s: wsa reset failed suspend %d\n", - __func__, ret); - return ret; - } - - clk_disable_unprepare(pdata->wsa_mclk); - ret = msm_cdc_pinctrl_select_sleep_state(pdata->wsa_clk_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be suspended %s\n", - __func__, "wsa_clk"); - return ret; - } - - return 0; -} - -static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec, - bool enable) -{ - int ret = 0; - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - if (enable) { - ret = wsa881x_startup(wsa881x); - if (ret < 0) { - dev_err_ratelimited(codec->dev, - "%s: failed to startup\n", __func__); - return ret; - } - } - wsa881x_clk_ctrl(codec, enable); - wsa881x_bandgap_ctrl(codec, enable); - if (!enable) { - ret = wsa881x_shutdown(wsa881x); - if (ret < 0) - dev_err_ratelimited(codec->dev, - "%s: failed to shutdown\n", __func__); - } - return ret; -} - -static int32_t wsa881x_temp_reg_read(struct snd_soc_codec *codec, - struct wsa_temp_register *wsa_temp_reg) -{ - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - int ret = 0; - - if (!wsa881x) { - dev_err(codec->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - ret = wsa881x_resource_acquire(codec, true); - if (ret) { - dev_err_ratelimited(codec->dev, - "%s: resource acquire fail\n", __func__); - return ret; - } - - if (WSA881X_IS_2_0(wsa881x->version)) { - snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x00); - wsa_temp_reg->dmeas_msb = snd_soc_read(codec, WSA881X_TEMP_MSB); - wsa_temp_reg->dmeas_lsb = snd_soc_read(codec, WSA881X_TEMP_LSB); - snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x01); - } else { - wsa_temp_reg->dmeas_msb = snd_soc_read(codec, - WSA881X_TEMP_DOUT_MSB); - wsa_temp_reg->dmeas_lsb = snd_soc_read(codec, - WSA881X_TEMP_DOUT_LSB); - } - wsa_temp_reg->d1_msb = snd_soc_read(codec, WSA881X_OTP_REG_1); - wsa_temp_reg->d1_lsb = snd_soc_read(codec, WSA881X_OTP_REG_2); - wsa_temp_reg->d2_msb = snd_soc_read(codec, WSA881X_OTP_REG_3); - wsa_temp_reg->d2_lsb = snd_soc_read(codec, WSA881X_OTP_REG_4); - - ret = wsa881x_resource_acquire(codec, false); - if (ret) - dev_err_ratelimited(codec->dev, - "%s: resource release fail\n", __func__); - - return ret; -} - -static int wsa881x_probe(struct snd_soc_codec *codec) -{ - struct i2c_client *client; - int ret = 0; - int wsa881x_index = 0; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - char *widget_name = NULL; - struct snd_soc_card *card = codec->component.card; - struct snd_soc_codec_conf *codec_conf = card->codec_conf; - - client = dev_get_drvdata(codec->dev); - ret = wsa881x_i2c_get_client_index(client, &wsa881x_index); - if (ret != 0) { - dev_err(&client->dev, "%s: I2C get codec I2C\n" - "client failed\n", __func__); - return ret; - } - mutex_init(&wsa_pdata[wsa881x_index].bg_lock); - mutex_init(&wsa_pdata[wsa881x_index].res_lock); - snprintf(wsa_pdata[wsa881x_index].tz_pdata.name, 100, "%s", - wsa_tz_names[wsa881x_index]); - wsa_pdata[wsa881x_index].codec = codec; - wsa_pdata[wsa881x_index].spk_pa_gain = SPK_GAIN_12DB; - wsa_pdata[wsa881x_index].codec = codec; - wsa_pdata[wsa881x_index].tz_pdata.codec = codec; - wsa_pdata[wsa881x_index].tz_pdata.wsa_temp_reg_read = - wsa881x_temp_reg_read; - snd_soc_codec_set_drvdata(codec, &wsa_pdata[wsa881x_index]); - wsa881x_init_thermal(&wsa_pdata[wsa881x_index].tz_pdata); - INIT_DELAYED_WORK(&wsa_pdata[wsa881x_index].ocp_ctl_work, - wsa881x_ocp_ctl_work); - - if (codec_conf->name_prefix) { - widget_name = kcalloc(WIDGET_NAME_MAX_SIZE, sizeof(char), - GFP_KERNEL); - if (!widget_name) - return -ENOMEM; - - snprintf(widget_name, WIDGET_NAME_MAX_SIZE, - "%s WSA_SPKR", codec_conf->name_prefix); - snd_soc_dapm_ignore_suspend(dapm, widget_name); - snprintf(widget_name, WIDGET_NAME_MAX_SIZE, - "%s WSA_IN", codec_conf->name_prefix); - snd_soc_dapm_ignore_suspend(dapm, widget_name); - kfree(widget_name); - } else { - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPKR"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_IN"); - } - - snd_soc_dapm_sync(dapm); - return 0; -} - -static int wsa881x_remove(struct snd_soc_codec *codec) -{ - struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec); - - if (wsa881x->tz_pdata.tz_dev) - wsa881x_deinit_thermal(wsa881x->tz_pdata.tz_dev); - - mutex_destroy(&wsa881x->bg_lock); - mutex_destroy(&wsa881x->res_lock); - return 0; -} - -static struct snd_soc_codec_driver soc_codec_dev_wsa881x = { - .probe = wsa881x_probe, - .remove = wsa881x_remove, - - .read = wsa881x_i2c_read, - .write = wsa881x_i2c_write, - - .reg_cache_size = WSA881X_CACHE_SIZE, - .reg_cache_default = wsa881x_ana_reg_defaults, - .reg_word_size = 1, - - .component_driver = { - .controls = wsa881x_snd_controls, - .num_controls = ARRAY_SIZE(wsa881x_snd_controls), - .dapm_widgets = wsa881x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wsa881x_dapm_widgets), - .dapm_routes = wsa881x_audio_map, - .num_dapm_routes = ARRAY_SIZE(wsa881x_audio_map), - }, -}; - -static int wsa881x_reset(struct wsa881x_pdata *pdata, bool enable) -{ - int ret = 0; - - /* - * shutdown the GPIOs WSA_EN, WSA_MCLK, regulators - * and restore defaults in soc cache when shutdown. - * Enable regulators, GPIOs WSA_MCLK, WSA_EN when powerup. - */ - if (enable) { - if (pdata->wsa_active) - return 0; - ret = msm_cdc_pinctrl_select_active_state( - pdata->wsa_reset_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be activated %s\n", - __func__, "wsa_reset"); - return ret; - } - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->wsa_reset_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be suspended(powerup) %s\n", - __func__, "wsa_reset"); - return ret; - } - ret = msm_cdc_pinctrl_select_active_state( - pdata->wsa_reset_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be activated %s\n", - __func__, "wsa_reset"); - return ret; - } - pdata->wsa_active = true; - } else { - if (!pdata->wsa_active) - return 0; - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->wsa_reset_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be suspended %s\n", - __func__, "wsa_reset"); - return ret; - } - pdata->wsa_active = false; - } - return ret; -} - -int wsa881x_get_client_index(void) -{ - return wsa881x_i2c_addr; -} -EXPORT_SYMBOL(wsa881x_get_client_index); - -int wsa881x_get_probing_count(void) -{ - return wsa881x_probing_count; -} -EXPORT_SYMBOL(wsa881x_get_probing_count); - -int wsa881x_get_presence_count(void) -{ - return wsa881x_presence_count; -} -EXPORT_SYMBOL(wsa881x_get_presence_count); - -int wsa881x_set_mclk_callback( - int (*enable_mclk_callback)(struct snd_soc_card *, bool)) -{ - int i; - - for (i = 0; i < MAX_WSA881X_DEVICE; i++) { - if (wsa_pdata[i].status == WSA881X_STATUS_I2C) - wsa_pdata[i].enable_mclk = enable_mclk_callback; - } - return 0; -} -EXPORT_SYMBOL(wsa881x_set_mclk_callback); - -static int check_wsa881x_presence(struct i2c_client *client) -{ - int ret = 0; - int wsa881x_index = 0; - - ret = wsa881x_i2c_get_client_index(client, &wsa881x_index); - if (ret != 0) { - dev_err(&client->dev, "%s: I2C get codec I2C\n" - "client failed\n", __func__); - return ret; - } - ret = wsa881x_i2c_read_device(&wsa_pdata[wsa881x_index], - WSA881X_CDC_RST_CTL); - if (ret < 0) { - dev_err(&client->dev, "failed to read wsa881x with addr %x\n", - client->addr); - return ret; - } - ret = wsa881x_i2c_write_device(&wsa_pdata[wsa881x_index], - WSA881X_CDC_RST_CTL, 0x01); - if (ret < 0) { - dev_err(&client->dev, "failed write addr %x reg:0x5 val:0x1\n", - client->addr); - return ret; - } - /* allow 20ms before trigger next write to verify wsa881x presence */ - msleep(20); - ret = wsa881x_i2c_write_device(&wsa_pdata[wsa881x_index], - WSA881X_CDC_RST_CTL, 0x00); - if (ret < 0) { - dev_err(&client->dev, "failed write addr %x reg:0x5 val:0x0\n", - client->addr); - return ret; - } - return ret; -} - -static int wsa881x_populate_dt_pdata(struct device *dev, int wsa881x_index) -{ - int ret = 0; - struct wsa881x_pdata *pdata = &wsa_pdata[wsa881x_index]; - - /* reading the gpio configurations from dtsi file */ - pdata->wsa_vi_gpio_p = of_parse_phandle(dev->of_node, - "qcom,wsa-analog-vi-gpio", 0); - pdata->wsa_clk_gpio_p = of_parse_phandle(dev->of_node, - "qcom,wsa-analog-clk-gpio", 0); - pdata->wsa_reset_gpio_p = of_parse_phandle(dev->of_node, - "qcom,wsa-analog-reset-gpio", 0); - pinctrl_init = true; - return ret; -} - -static int wsa881x_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - int ret = 0; - int wsa881x_index = 0; - struct wsa881x_pdata *pdata = NULL; - - ret = wsa881x_i2c_get_client_index(client, &wsa881x_index); - - if (ret != 0) { - dev_err(&client->dev, "%s: I2C get codec I2C\n" - "client failed\n", __func__); - return ret; - } - - pdata = &wsa_pdata[wsa881x_index]; - if ((client->addr == WSA881X_I2C_SPK0_SLAVE1_ADDR || - client->addr == WSA881X_I2C_SPK1_SLAVE1_ADDR) && - (pdata->status == WSA881X_STATUS_PROBING)) { - wsa881x_probing_count++; - return ret; - } - - if (pdata->status == WSA881X_STATUS_I2C) { - dev_dbg(&client->dev, "%s:probe for other slaves\n" - "devices of codec I2C slave Addr = %x\n", - __func__, client->addr); - dev_dbg(&client->dev, "%s:wsa_idx = %d SLAVE = %d\n", - __func__, wsa881x_index, WSA881X_ANALOG_SLAVE); - pdata->regmap[WSA881X_ANALOG_SLAVE] = - devm_regmap_init_i2c( - client, - &wsa881x_ana_regmap_config[WSA881X_ANALOG_SLAVE]); - regcache_cache_bypass(pdata->regmap[WSA881X_ANALOG_SLAVE], - true); - if (IS_ERR(pdata->regmap[WSA881X_ANALOG_SLAVE])) { - ret = PTR_ERR(pdata->regmap[WSA881X_ANALOG_SLAVE]); - dev_err(&client->dev, - "%s: regmap_init failed %d\n", - __func__, ret); - } - client->dev.platform_data = pdata; - i2c_set_clientdata(client, pdata); - pdata->client[WSA881X_ANALOG_SLAVE] = client; - if (pdata->version == WSA881X_2_0) - wsa881x_update_regmap_2_0( - pdata->regmap[WSA881X_ANALOG_SLAVE], - WSA881X_ANALOG_SLAVE); - - wsa881x_probing_count++; - return ret; - } else if (pdata->status == WSA881X_STATUS_PROBING) { - pdata->index = wsa881x_index; - if (client->dev.of_node) { - dev_dbg(&client->dev, "%s:Platform data\n" - "from device tree\n", __func__); - ret = wsa881x_populate_dt_pdata( - &client->dev, wsa881x_index); - if (ret < 0) { - dev_err(&client->dev, - "%s: Fail to obtain pdata from device tree\n", - __func__); - ret = -EINVAL; - goto err; - } - client->dev.platform_data = pdata; - } else { - dev_dbg(&client->dev, "%s:Platform data from\n" - "board file\n", __func__); - pdata = client->dev.platform_data; - } - if (!pdata) { - dev_dbg(&client->dev, "no platform data?\n"); - ret = -EINVAL; - goto err; - } - dev_set_drvdata(&client->dev, client); - - pdata->regmap[WSA881X_DIGITAL_SLAVE] = - devm_regmap_init_i2c( - client, - &wsa881x_ana_regmap_config[WSA881X_DIGITAL_SLAVE]); - regcache_cache_bypass(pdata->regmap[WSA881X_DIGITAL_SLAVE], - true); - if (IS_ERR(pdata->regmap[WSA881X_DIGITAL_SLAVE])) { - ret = PTR_ERR(pdata->regmap[WSA881X_DIGITAL_SLAVE]); - dev_err(&client->dev, "%s: regmap_init failed %d\n", - __func__, ret); - goto err; - } - pdata->wsa_mclk = devm_clk_get(&client->dev, "wsa_mclk"); - } - if (IS_ERR(pdata->wsa_mclk)) { - ret = PTR_ERR(pdata->wsa_mclk); - dev_dbg(&client->dev, "%s: clk get %s failed %d\n", - __func__, "wsa_mclk", ret); - pdata->wsa_mclk = NULL; - ret = 0; - } - /*bus reset sequence*/ - ret = wsa881x_reset(pdata, true); - if (ret < 0) { - wsa881x_probing_count++; - dev_err(&client->dev, "%s: WSA enable Failed %d\n", - __func__, ret); - goto err; - } - pdata->client[WSA881X_DIGITAL_SLAVE] = client; - pdata->regmap_flag = true; - ret = check_wsa881x_presence(client); - if (ret < 0) { - dev_err(&client->dev, - "failed to ping wsa with addr:%x, ret = %d\n", - client->addr, ret); - wsa881x_probing_count++; - goto err1; - } - pdata->version = wsa881x_i2c_read_device(pdata, - WSA881X_CHIP_ID1); - pr_debug("%s: wsa881x version: %d\n", __func__, pdata->version); - if (pdata->version == WSA881X_2_0) { - wsa881x_update_reg_defaults_2_0(); - wsa881x_update_regmap_2_0( - pdata->regmap[WSA881X_DIGITAL_SLAVE], - WSA881X_DIGITAL_SLAVE); - } - wsa881x_presence_count++; - wsa881x_probing_count++; - ret = snd_soc_register_codec(&client->dev, - &soc_codec_dev_wsa881x, - NULL, 0); - if (ret < 0) - goto err1; - pdata->status = WSA881X_STATUS_I2C; -err1: - wsa881x_reset(pdata, false); -err: - return 0; -} - -static int wsa881x_i2c_remove(struct i2c_client *client) -{ - struct wsa881x_pdata *wsa881x = client->dev.platform_data; - - snd_soc_unregister_codec(&client->dev); - i2c_set_clientdata(client, NULL); - kfree(wsa881x); - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int wsa881x_i2c_suspend(struct device *dev) -{ - pr_debug("%s: system suspend\n", __func__); - return 0; -} - -static int wsa881x_i2c_resume(struct device *dev) -{ - pr_debug("%s: system resume\n", __func__); - return 0; -} - -static const struct dev_pm_ops wsa881x_i2c_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(wsa881x_i2c_suspend, wsa881x_i2c_resume) -}; -#endif /* CONFIG_PM_SLEEP */ - -static const struct i2c_device_id wsa881x_i2c_id[] = { - {"wsa881x-i2c-dev", WSA881X_I2C_SPK0_SLAVE0_ADDR}, - {"wsa881x-i2c-dev", WSA881X_I2C_SPK0_SLAVE1_ADDR}, - {"wsa881x-i2c-dev", WSA881X_I2C_SPK1_SLAVE0_ADDR}, - {"wsa881x-i2c-dev", WSA881X_I2C_SPK1_SLAVE1_ADDR}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, wsa881x_i2c_id); - - -static const struct of_device_id msm_match_table[] = { - {.compatible = "qcom,wsa881x-i2c-codec"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_match_table); - -static struct i2c_driver wsa881x_codec_driver = { - .driver = { - .name = "wsa881x-i2c-codec", - .owner = THIS_MODULE, - .probe_type = PROBE_PREFER_ASYNCHRONOUS, -#ifdef CONFIG_PM_SLEEP - .pm = &wsa881x_i2c_pm_ops, -#endif - .of_match_table = msm_match_table, - }, - .id_table = wsa881x_i2c_id, - .probe = wsa881x_i2c_probe, - .remove = wsa881x_i2c_remove, -}; - -static int __init wsa881x_codec_init(void) -{ - int i = 0; - - for (i = 0; i < MAX_WSA881X_DEVICE; i++) - wsa_pdata[i].status = WSA881X_STATUS_PROBING; - return i2c_add_driver(&wsa881x_codec_driver); -} -module_init(wsa881x_codec_init); - -static void __exit wsa881x_codec_exit(void) -{ - i2c_del_driver(&wsa881x_codec_driver); -} - -module_exit(wsa881x_codec_exit); - -MODULE_DESCRIPTION("WSA881x Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wsa881x-analog.h b/techpack/audio/asoc/codecs/wsa881x-analog.h deleted file mode 100644 index b52245af2cea..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-analog.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2015, 2018-2019, 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 - * only version 2 as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WSA881X_H -#define _WSA881X_H - -#include -#include "wsa881x-registers-analog.h" -#include - -#define WSA881X_I2C_SPK0_SLAVE0_ADDR 0x0E -#define WSA881X_I2C_SPK0_SLAVE1_ADDR 0x44 -#define WSA881X_I2C_SPK1_SLAVE0_ADDR 0x0F -#define WSA881X_I2C_SPK1_SLAVE1_ADDR 0x45 - -#define WSA881X_I2C_SPK0_SLAVE0 0 -#define WSA881X_I2C_SPK1_SLAVE0 1 -#define MAX_WSA881X_DEVICE 2 -#define WSA881X_DIGITAL_SLAVE 0 -#define WSA881X_ANALOG_SLAVE 1 - -enum { - WSA881X_1_X = 0, - WSA881X_2_0, -}; - -#define WSA881X_IS_2_0(ver) \ - ((ver == WSA881X_2_0) ? 1 : 0) - -extern const u8 wsa881x_ana_reg_readable[WSA881X_CACHE_SIZE]; -extern struct reg_default wsa881x_ana_reg_defaults[WSA881X_CACHE_SIZE]; -extern struct regmap_config wsa881x_ana_regmap_config[2]; -int wsa881x_get_client_index(void); -int wsa881x_get_probing_count(void); -int wsa881x_get_presence_count(void); -int wsa881x_set_mclk_callback( - int (*enable_mclk_callback)(struct snd_soc_card *, bool)); -void wsa881x_update_reg_defaults_2_0(void); -void wsa881x_update_regmap_2_0(struct regmap *regmap, int flag); - -#endif /* _WSA881X_H */ diff --git a/techpack/audio/asoc/codecs/wsa881x-registers-analog.h b/techpack/audio/asoc/codecs/wsa881x-registers-analog.h deleted file mode 100644 index 4674b1145382..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-registers-analog.h +++ /dev/null @@ -1,206 +0,0 @@ -/* Copyright (c) 2015, 2018-2019, 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 - * only version 2 as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef WSA881X_REGISTERS_H -#define WSA881X_REGISTERS_H - -#define WSA881X_DIGITAL_BASE 0x0000 -#define WSA881X_ANALOG_BASE 0x0100 - -#define WSA881X_CHIP_ID0 (WSA881X_DIGITAL_BASE+0x0000) -#define WSA881X_CHIP_ID1 (WSA881X_DIGITAL_BASE+0x0001) -#define WSA881X_CHIP_ID2 (WSA881X_DIGITAL_BASE+0x0002) -#define WSA881X_CHIP_ID3 (WSA881X_DIGITAL_BASE+0x0003) -#define WSA881X_BUS_ID (WSA881X_DIGITAL_BASE+0x0004) -#define WSA881X_CDC_RST_CTL (WSA881X_DIGITAL_BASE+0x0005) -#define WSA881X_CDC_TOP_CLK_CTL (WSA881X_DIGITAL_BASE+0x0006) -#define WSA881X_CDC_ANA_CLK_CTL (WSA881X_DIGITAL_BASE+0x0007) -#define WSA881X_CDC_DIG_CLK_CTL (WSA881X_DIGITAL_BASE+0x0008) -#define WSA881X_CLOCK_CONFIG (WSA881X_DIGITAL_BASE+0x0009) -#define WSA881X_ANA_CTL (WSA881X_DIGITAL_BASE+0x000A) -#define WSA881X_SWR_RESET_EN (WSA881X_DIGITAL_BASE+0x000B) -#define WSA881X_RESET_CTL (WSA881X_DIGITAL_BASE+0x000C) -#define WSA881X_TADC_VALUE_CTL (WSA881X_DIGITAL_BASE+0x000F) -#define WSA881X_TEMP_DETECT_CTL (WSA881X_DIGITAL_BASE+0x0010) -#define WSA881X_TEMP_MSB (WSA881X_DIGITAL_BASE+0x0011) -#define WSA881X_TEMP_LSB (WSA881X_DIGITAL_BASE+0x0012) -#define WSA881X_TEMP_CONFIG0 (WSA881X_DIGITAL_BASE+0x0013) -#define WSA881X_TEMP_CONFIG1 (WSA881X_DIGITAL_BASE+0x0014) -#define WSA881X_CDC_CLIP_CTL (WSA881X_DIGITAL_BASE+0x0015) -#define WSA881X_SDM_PDM9_LSB (WSA881X_DIGITAL_BASE+0x0016) -#define WSA881X_SDM_PDM9_MSB (WSA881X_DIGITAL_BASE+0x0017) -#define WSA881X_CDC_RX_CTL (WSA881X_DIGITAL_BASE+0x0018) -#define WSA881X_DEM_BYPASS_DATA0 (WSA881X_DIGITAL_BASE+0x0019) -#define WSA881X_DEM_BYPASS_DATA1 (WSA881X_DIGITAL_BASE+0x001A) -#define WSA881X_DEM_BYPASS_DATA2 (WSA881X_DIGITAL_BASE+0x001B) -#define WSA881X_DEM_BYPASS_DATA3 (WSA881X_DIGITAL_BASE+0x001C) -#define WSA881X_OTP_CTRL0 (WSA881X_DIGITAL_BASE+0x001D) -#define WSA881X_OTP_CTRL1 (WSA881X_DIGITAL_BASE+0x001E) -#define WSA881X_HDRIVE_CTL_GROUP1 (WSA881X_DIGITAL_BASE+0x001F) -#define WSA881X_INTR_MODE (WSA881X_DIGITAL_BASE+0x0020) -#define WSA881X_INTR_MASK (WSA881X_DIGITAL_BASE+0x0021) -#define WSA881X_INTR_STATUS (WSA881X_DIGITAL_BASE+0x0022) -#define WSA881X_INTR_CLEAR (WSA881X_DIGITAL_BASE+0x0023) -#define WSA881X_INTR_LEVEL (WSA881X_DIGITAL_BASE+0x0024) -#define WSA881X_INTR_SET (WSA881X_DIGITAL_BASE+0x0025) -#define WSA881X_INTR_TEST (WSA881X_DIGITAL_BASE+0x0026) -#define WSA881X_PDM_TEST_MODE (WSA881X_DIGITAL_BASE+0x0030) -#define WSA881X_ATE_TEST_MODE (WSA881X_DIGITAL_BASE+0x0031) -#define WSA881X_PIN_CTL_MODE (WSA881X_DIGITAL_BASE+0x0032) -#define WSA881X_PIN_CTL_OE (WSA881X_DIGITAL_BASE+0x0033) -#define WSA881X_PIN_WDATA_IOPAD (WSA881X_DIGITAL_BASE+0x0034) -#define WSA881X_PIN_STATUS (WSA881X_DIGITAL_BASE+0x0035) -#define WSA881X_DIG_DEBUG_MODE (WSA881X_DIGITAL_BASE+0x0037) -#define WSA881X_DIG_DEBUG_SEL (WSA881X_DIGITAL_BASE+0x0038) -#define WSA881X_DIG_DEBUG_EN (WSA881X_DIGITAL_BASE+0x0039) -#define WSA881X_SWR_HM_TEST1 (WSA881X_DIGITAL_BASE+0x003B) -#define WSA881X_SWR_HM_TEST2 (WSA881X_DIGITAL_BASE+0x003C) -#define WSA881X_TEMP_DETECT_DBG_CTL (WSA881X_DIGITAL_BASE+0x003D) -#define WSA881X_TEMP_DEBUG_MSB (WSA881X_DIGITAL_BASE+0x003E) -#define WSA881X_TEMP_DEBUG_LSB (WSA881X_DIGITAL_BASE+0x003F) -#define WSA881X_SAMPLE_EDGE_SEL (WSA881X_DIGITAL_BASE+0x0044) -#define WSA881X_IOPAD_CTL (WSA881X_DIGITAL_BASE+0x0045) -#define WSA881X_SPARE_0 (WSA881X_DIGITAL_BASE+0x0050) -#define WSA881X_SPARE_1 (WSA881X_DIGITAL_BASE+0x0051) -#define WSA881X_SPARE_2 (WSA881X_DIGITAL_BASE+0x0052) -#define WSA881X_OTP_REG_0 (WSA881X_DIGITAL_BASE+0x0080) -#define WSA881X_OTP_REG_1 (WSA881X_DIGITAL_BASE+0x0081) -#define WSA881X_OTP_REG_2 (WSA881X_DIGITAL_BASE+0x0082) -#define WSA881X_OTP_REG_3 (WSA881X_DIGITAL_BASE+0x0083) -#define WSA881X_OTP_REG_4 (WSA881X_DIGITAL_BASE+0x0084) -#define WSA881X_OTP_REG_5 (WSA881X_DIGITAL_BASE+0x0085) -#define WSA881X_OTP_REG_6 (WSA881X_DIGITAL_BASE+0x0086) -#define WSA881X_OTP_REG_7 (WSA881X_DIGITAL_BASE+0x0087) -#define WSA881X_OTP_REG_8 (WSA881X_DIGITAL_BASE+0x0088) -#define WSA881X_OTP_REG_9 (WSA881X_DIGITAL_BASE+0x0089) -#define WSA881X_OTP_REG_10 (WSA881X_DIGITAL_BASE+0x008A) -#define WSA881X_OTP_REG_11 (WSA881X_DIGITAL_BASE+0x008B) -#define WSA881X_OTP_REG_12 (WSA881X_DIGITAL_BASE+0x008C) -#define WSA881X_OTP_REG_13 (WSA881X_DIGITAL_BASE+0x008D) -#define WSA881X_OTP_REG_14 (WSA881X_DIGITAL_BASE+0x008E) -#define WSA881X_OTP_REG_15 (WSA881X_DIGITAL_BASE+0x008F) -#define WSA881X_OTP_REG_16 (WSA881X_DIGITAL_BASE+0x0090) -#define WSA881X_OTP_REG_17 (WSA881X_DIGITAL_BASE+0x0091) -#define WSA881X_OTP_REG_18 (WSA881X_DIGITAL_BASE+0x0092) -#define WSA881X_OTP_REG_19 (WSA881X_DIGITAL_BASE+0x0093) -#define WSA881X_OTP_REG_20 (WSA881X_DIGITAL_BASE+0x0094) -#define WSA881X_OTP_REG_21 (WSA881X_DIGITAL_BASE+0x0095) -#define WSA881X_OTP_REG_22 (WSA881X_DIGITAL_BASE+0x0096) -#define WSA881X_OTP_REG_23 (WSA881X_DIGITAL_BASE+0x0097) -#define WSA881X_OTP_REG_24 (WSA881X_DIGITAL_BASE+0x0098) -#define WSA881X_OTP_REG_25 (WSA881X_DIGITAL_BASE+0x0099) -#define WSA881X_OTP_REG_26 (WSA881X_DIGITAL_BASE+0x009A) -#define WSA881X_OTP_REG_27 (WSA881X_DIGITAL_BASE+0x009B) -#define WSA881X_OTP_REG_28 (WSA881X_DIGITAL_BASE+0x009C) -#define WSA881X_OTP_REG_29 (WSA881X_DIGITAL_BASE+0x009D) -#define WSA881X_OTP_REG_30 (WSA881X_DIGITAL_BASE+0x009E) -#define WSA881X_OTP_REG_31 (WSA881X_DIGITAL_BASE+0x009F) -#define WSA881X_OTP_REG_32 (WSA881X_DIGITAL_BASE+0x00A0) -#define WSA881X_OTP_REG_33 (WSA881X_DIGITAL_BASE+0x00A1) -#define WSA881X_OTP_REG_34 (WSA881X_DIGITAL_BASE+0x00A2) -#define WSA881X_OTP_REG_35 (WSA881X_DIGITAL_BASE+0x00A3) -#define WSA881X_OTP_REG_36 (WSA881X_DIGITAL_BASE+0x00A4) -#define WSA881X_OTP_REG_37 (WSA881X_DIGITAL_BASE+0x00A5) -#define WSA881X_OTP_REG_38 (WSA881X_DIGITAL_BASE+0x00A6) -#define WSA881X_OTP_REG_39 (WSA881X_DIGITAL_BASE+0x00A7) -#define WSA881X_OTP_REG_40 (WSA881X_DIGITAL_BASE+0x00A8) -#define WSA881X_OTP_REG_41 (WSA881X_DIGITAL_BASE+0x00A9) -#define WSA881X_OTP_REG_42 (WSA881X_DIGITAL_BASE+0x00AA) -#define WSA881X_OTP_REG_43 (WSA881X_DIGITAL_BASE+0x00AB) -#define WSA881X_OTP_REG_44 (WSA881X_DIGITAL_BASE+0x00AC) -#define WSA881X_OTP_REG_45 (WSA881X_DIGITAL_BASE+0x00AD) -#define WSA881X_OTP_REG_46 (WSA881X_DIGITAL_BASE+0x00AE) -#define WSA881X_OTP_REG_47 (WSA881X_DIGITAL_BASE+0x00AF) -#define WSA881X_OTP_REG_48 (WSA881X_DIGITAL_BASE+0x00B0) -#define WSA881X_OTP_REG_49 (WSA881X_DIGITAL_BASE+0x00B1) -#define WSA881X_OTP_REG_50 (WSA881X_DIGITAL_BASE+0x00B2) -#define WSA881X_OTP_REG_51 (WSA881X_DIGITAL_BASE+0x00B3) -#define WSA881X_OTP_REG_52 (WSA881X_DIGITAL_BASE+0x00B4) -#define WSA881X_OTP_REG_53 (WSA881X_DIGITAL_BASE+0x00B5) -#define WSA881X_OTP_REG_54 (WSA881X_DIGITAL_BASE+0x00B6) -#define WSA881X_OTP_REG_55 (WSA881X_DIGITAL_BASE+0x00B7) -#define WSA881X_OTP_REG_56 (WSA881X_DIGITAL_BASE+0x00B8) -#define WSA881X_OTP_REG_57 (WSA881X_DIGITAL_BASE+0x00B9) -#define WSA881X_OTP_REG_58 (WSA881X_DIGITAL_BASE+0x00BA) -#define WSA881X_OTP_REG_59 (WSA881X_DIGITAL_BASE+0x00BB) -#define WSA881X_OTP_REG_60 (WSA881X_DIGITAL_BASE+0x00BC) -#define WSA881X_OTP_REG_61 (WSA881X_DIGITAL_BASE+0x00BD) -#define WSA881X_OTP_REG_62 (WSA881X_DIGITAL_BASE+0x00BE) -#define WSA881X_OTP_REG_63 (WSA881X_DIGITAL_BASE+0x00BF) -/* Analog Register address space */ -#define WSA881X_BIAS_REF_CTRL (WSA881X_ANALOG_BASE+0x0000) -#define WSA881X_BIAS_TEST (WSA881X_ANALOG_BASE+0x0001) -#define WSA881X_BIAS_BIAS (WSA881X_ANALOG_BASE+0x0002) -#define WSA881X_TEMP_OP (WSA881X_ANALOG_BASE+0x0003) -#define WSA881X_TEMP_IREF_CTRL (WSA881X_ANALOG_BASE+0x0004) -#define WSA881X_TEMP_ISENS_CTRL (WSA881X_ANALOG_BASE+0x0005) -#define WSA881X_TEMP_CLK_CTRL (WSA881X_ANALOG_BASE+0x0006) -#define WSA881X_TEMP_TEST (WSA881X_ANALOG_BASE+0x0007) -#define WSA881X_TEMP_BIAS (WSA881X_ANALOG_BASE+0x0008) -#define WSA881X_TEMP_ADC_CTRL (WSA881X_ANALOG_BASE+0x0009) -#define WSA881X_TEMP_DOUT_MSB (WSA881X_ANALOG_BASE+0x000A) -#define WSA881X_TEMP_DOUT_LSB (WSA881X_ANALOG_BASE+0x000B) -#define WSA881X_ADC_EN_MODU_V (WSA881X_ANALOG_BASE+0x0010) -#define WSA881X_ADC_EN_MODU_I (WSA881X_ANALOG_BASE+0x0011) -#define WSA881X_ADC_EN_DET_TEST_V (WSA881X_ANALOG_BASE+0x0012) -#define WSA881X_ADC_EN_DET_TEST_I (WSA881X_ANALOG_BASE+0x0013) -#define WSA881X_ADC_SEL_IBIAS (WSA881X_ANALOG_BASE+0x0014) -#define WSA881X_ADC_EN_SEL_IBIAS (WSA881X_ANALOG_BASE+0x0015) -#define WSA881X_SPKR_DRV_EN (WSA881X_ANALOG_BASE+0x001A) -#define WSA881X_SPKR_DRV_GAIN (WSA881X_ANALOG_BASE+0x001B) -#define WSA881X_SPKR_DAC_CTL (WSA881X_ANALOG_BASE+0x001C) -#define WSA881X_SPKR_DRV_DBG (WSA881X_ANALOG_BASE+0x001D) -#define WSA881X_SPKR_PWRSTG_DBG (WSA881X_ANALOG_BASE+0x001E) -#define WSA881X_SPKR_OCP_CTL (WSA881X_ANALOG_BASE+0x001F) -#define WSA881X_SPKR_CLIP_CTL (WSA881X_ANALOG_BASE+0x0020) -#define WSA881X_SPKR_BBM_CTL (WSA881X_ANALOG_BASE+0x0021) -#define WSA881X_SPKR_MISC_CTL1 (WSA881X_ANALOG_BASE+0x0022) -#define WSA881X_SPKR_MISC_CTL2 (WSA881X_ANALOG_BASE+0x0023) -#define WSA881X_SPKR_BIAS_INT (WSA881X_ANALOG_BASE+0x0024) -#define WSA881X_SPKR_PA_INT (WSA881X_ANALOG_BASE+0x0025) -#define WSA881X_SPKR_BIAS_CAL (WSA881X_ANALOG_BASE+0x0026) -#define WSA881X_SPKR_BIAS_PSRR (WSA881X_ANALOG_BASE+0x0027) -#define WSA881X_SPKR_STATUS1 (WSA881X_ANALOG_BASE+0x0028) -#define WSA881X_SPKR_STATUS2 (WSA881X_ANALOG_BASE+0x0029) -#define WSA881X_BOOST_EN_CTL (WSA881X_ANALOG_BASE+0x002A) -#define WSA881X_BOOST_CURRENT_LIMIT (WSA881X_ANALOG_BASE+0x002B) -#define WSA881X_BOOST_PS_CTL (WSA881X_ANALOG_BASE+0x002C) -#define WSA881X_BOOST_PRESET_OUT1 (WSA881X_ANALOG_BASE+0x002D) -#define WSA881X_BOOST_PRESET_OUT2 (WSA881X_ANALOG_BASE+0x002E) -#define WSA881X_BOOST_FORCE_OUT (WSA881X_ANALOG_BASE+0x002F) -#define WSA881X_BOOST_LDO_PROG (WSA881X_ANALOG_BASE+0x0030) -#define WSA881X_BOOST_SLOPE_COMP_ISENSE_FB (WSA881X_ANALOG_BASE+0x0031) -#define WSA881X_BOOST_RON_CTL (WSA881X_ANALOG_BASE+0x0032) -#define WSA881X_BOOST_LOOP_STABILITY (WSA881X_ANALOG_BASE+0x0033) -#define WSA881X_BOOST_ZX_CTL (WSA881X_ANALOG_BASE+0x0034) -#define WSA881X_BOOST_START_CTL (WSA881X_ANALOG_BASE+0x0035) -#define WSA881X_BOOST_MISC1_CTL (WSA881X_ANALOG_BASE+0x0036) -#define WSA881X_BOOST_MISC2_CTL (WSA881X_ANALOG_BASE+0x0037) -#define WSA881X_BOOST_MISC3_CTL (WSA881X_ANALOG_BASE+0x0038) -#define WSA881X_BOOST_ATEST_CTL (WSA881X_ANALOG_BASE+0x0039) -#define WSA881X_SPKR_PROT_FE_GAIN (WSA881X_ANALOG_BASE+0x003A) -#define WSA881X_SPKR_PROT_FE_CM_LDO_SET (WSA881X_ANALOG_BASE+0x003B) -#define WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1 (WSA881X_ANALOG_BASE+0x003C) -#define WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2 (WSA881X_ANALOG_BASE+0x003D) -#define WSA881X_SPKR_PROT_ATEST1 (WSA881X_ANALOG_BASE+0x003E) -#define WSA881X_SPKR_PROT_ATEST2 (WSA881X_ANALOG_BASE+0x003F) -#define WSA881X_SPKR_PROT_FE_VSENSE_VCM (WSA881X_ANALOG_BASE+0x0040) -#define WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1 (WSA881X_ANALOG_BASE+0x0041) -#define WSA881X_BONGO_RESRV_REG1 (WSA881X_ANALOG_BASE+0x0042) -#define WSA881X_BONGO_RESRV_REG2 (WSA881X_ANALOG_BASE+0x0043) -#define WSA881X_SPKR_PROT_SAR (WSA881X_ANALOG_BASE+0x0044) -#define WSA881X_SPKR_STATUS3 (WSA881X_ANALOG_BASE+0x0045) - -#define WSA881X_NUM_REGISTERS (WSA881X_SPKR_STATUS3+1) -#define WSA881X_MAX_REGISTER (WSA881X_NUM_REGISTERS-1) -#define WSA881X_CACHE_SIZE WSA881X_NUM_REGISTERS -#endif /* WSA881X_REGISTERS_H */ diff --git a/techpack/audio/asoc/codecs/wsa881x-registers.h b/techpack/audio/asoc/codecs/wsa881x-registers.h deleted file mode 100644 index 825a5f034da8..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-registers.h +++ /dev/null @@ -1,178 +0,0 @@ -/* Copyright (c) 2015, 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 - * only version 2 as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef WSA881X_REGISTERS_H -#define WSA881X_REGISTERS_H - -#define WSA881X_DIGITAL_BASE 0x3000 -#define WSA881X_ANALOG_BASE 0x3100 - -/* Digital register address space */ -#define WSA881X_CHIP_ID0 (WSA881X_DIGITAL_BASE+0x0000) -#define WSA881X_CHIP_ID1 (WSA881X_DIGITAL_BASE+0x0001) -#define WSA881X_CHIP_ID2 (WSA881X_DIGITAL_BASE+0x0002) -#define WSA881X_CHIP_ID3 (WSA881X_DIGITAL_BASE+0x0003) -#define WSA881X_BUS_ID (WSA881X_DIGITAL_BASE+0x0004) -#define WSA881X_CDC_RST_CTL (WSA881X_DIGITAL_BASE+0x0005) -#define WSA881X_CDC_TOP_CLK_CTL (WSA881X_DIGITAL_BASE+0x0006) -#define WSA881X_CDC_ANA_CLK_CTL (WSA881X_DIGITAL_BASE+0x0007) -#define WSA881X_CDC_DIG_CLK_CTL (WSA881X_DIGITAL_BASE+0x0008) -#define WSA881X_CLOCK_CONFIG (WSA881X_DIGITAL_BASE+0x0009) -#define WSA881X_ANA_CTL (WSA881X_DIGITAL_BASE+0x000A) -#define WSA881X_SWR_RESET_EN (WSA881X_DIGITAL_BASE+0x000B) -#define WSA881X_RESET_CTL (WSA881X_DIGITAL_BASE+0x000C) -#define WSA881X_TADC_VALUE_CTL (WSA881X_DIGITAL_BASE+0x000F) -#define WSA881X_TEMP_DETECT_CTL (WSA881X_DIGITAL_BASE+0x0010) -#define WSA881X_TEMP_MSB (WSA881X_DIGITAL_BASE+0x0011) -#define WSA881X_TEMP_LSB (WSA881X_DIGITAL_BASE+0x0012) -#define WSA881X_TEMP_CONFIG0 (WSA881X_DIGITAL_BASE+0x0013) -#define WSA881X_TEMP_CONFIG1 (WSA881X_DIGITAL_BASE+0x0014) -#define WSA881X_CDC_CLIP_CTL (WSA881X_DIGITAL_BASE+0x0015) -#define WSA881X_SDM_PDM9_LSB (WSA881X_DIGITAL_BASE+0x0016) -#define WSA881X_SDM_PDM9_MSB (WSA881X_DIGITAL_BASE+0x0017) -#define WSA881X_CDC_RX_CTL (WSA881X_DIGITAL_BASE+0x0018) -#define WSA881X_DEM_BYPASS_DATA0 (WSA881X_DIGITAL_BASE+0x0019) -#define WSA881X_DEM_BYPASS_DATA1 (WSA881X_DIGITAL_BASE+0x001A) -#define WSA881X_DEM_BYPASS_DATA2 (WSA881X_DIGITAL_BASE+0x001B) -#define WSA881X_DEM_BYPASS_DATA3 (WSA881X_DIGITAL_BASE+0x001C) -#define WSA881X_OTP_CTRL0 (WSA881X_DIGITAL_BASE+0x001D) -#define WSA881X_OTP_CTRL1 (WSA881X_DIGITAL_BASE+0x001E) -#define WSA881X_HDRIVE_CTL_GROUP1 (WSA881X_DIGITAL_BASE+0x001F) -#define WSA881X_INTR_MODE (WSA881X_DIGITAL_BASE+0x0020) -#define WSA881X_INTR_MASK (WSA881X_DIGITAL_BASE+0x0021) -#define WSA881X_INTR_STATUS (WSA881X_DIGITAL_BASE+0x0022) -#define WSA881X_INTR_CLEAR (WSA881X_DIGITAL_BASE+0x0023) -#define WSA881X_INTR_LEVEL (WSA881X_DIGITAL_BASE+0x0024) -#define WSA881X_INTR_SET (WSA881X_DIGITAL_BASE+0x0025) -#define WSA881X_INTR_TEST (WSA881X_DIGITAL_BASE+0x0026) -#define WSA881X_PDM_TEST_MODE (WSA881X_DIGITAL_BASE+0x0030) -#define WSA881X_ATE_TEST_MODE (WSA881X_DIGITAL_BASE+0x0031) -#define WSA881X_PIN_CTL_MODE (WSA881X_DIGITAL_BASE+0x0032) -#define WSA881X_PIN_CTL_OE (WSA881X_DIGITAL_BASE+0x0033) -#define WSA881X_PIN_WDATA_IOPAD (WSA881X_DIGITAL_BASE+0x0034) -#define WSA881X_PIN_STATUS (WSA881X_DIGITAL_BASE+0x0035) -#define WSA881X_DIG_DEBUG_MODE (WSA881X_DIGITAL_BASE+0x0037) -#define WSA881X_DIG_DEBUG_SEL (WSA881X_DIGITAL_BASE+0x0038) -#define WSA881X_DIG_DEBUG_EN (WSA881X_DIGITAL_BASE+0x0039) -#define WSA881X_SWR_HM_TEST1 (WSA881X_DIGITAL_BASE+0x003B) -#define WSA881X_SWR_HM_TEST2 (WSA881X_DIGITAL_BASE+0x003C) -#define WSA881X_TEMP_DETECT_DBG_CTL (WSA881X_DIGITAL_BASE+0x003D) -#define WSA881X_TEMP_DEBUG_MSB (WSA881X_DIGITAL_BASE+0x003E) -#define WSA881X_TEMP_DEBUG_LSB (WSA881X_DIGITAL_BASE+0x003F) -#define WSA881X_SAMPLE_EDGE_SEL (WSA881X_DIGITAL_BASE+0x0044) -#define WSA881X_IOPAD_CTL (WSA881X_DIGITAL_BASE+0x0045) -#define WSA881X_SPARE_0 (WSA881X_DIGITAL_BASE+0x0050) -#define WSA881X_SPARE_1 (WSA881X_DIGITAL_BASE+0x0051) -#define WSA881X_SPARE_2 (WSA881X_DIGITAL_BASE+0x0052) -#define WSA881X_OTP_REG_0 (WSA881X_DIGITAL_BASE+0x0080) -#define WSA881X_OTP_REG_1 (WSA881X_DIGITAL_BASE+0x0081) -#define WSA881X_OTP_REG_2 (WSA881X_DIGITAL_BASE+0x0082) -#define WSA881X_OTP_REG_3 (WSA881X_DIGITAL_BASE+0x0083) -#define WSA881X_OTP_REG_4 (WSA881X_DIGITAL_BASE+0x0084) -#define WSA881X_OTP_REG_5 (WSA881X_DIGITAL_BASE+0x0085) -#define WSA881X_OTP_REG_6 (WSA881X_DIGITAL_BASE+0x0086) -#define WSA881X_OTP_REG_7 (WSA881X_DIGITAL_BASE+0x0087) -#define WSA881X_OTP_REG_8 (WSA881X_DIGITAL_BASE+0x0088) -#define WSA881X_OTP_REG_9 (WSA881X_DIGITAL_BASE+0x0089) -#define WSA881X_OTP_REG_10 (WSA881X_DIGITAL_BASE+0x008A) -#define WSA881X_OTP_REG_11 (WSA881X_DIGITAL_BASE+0x008B) -#define WSA881X_OTP_REG_12 (WSA881X_DIGITAL_BASE+0x008C) -#define WSA881X_OTP_REG_13 (WSA881X_DIGITAL_BASE+0x008D) -#define WSA881X_OTP_REG_14 (WSA881X_DIGITAL_BASE+0x008E) -#define WSA881X_OTP_REG_15 (WSA881X_DIGITAL_BASE+0x008F) -#define WSA881X_OTP_REG_16 (WSA881X_DIGITAL_BASE+0x0090) -#define WSA881X_OTP_REG_17 (WSA881X_DIGITAL_BASE+0x0091) -#define WSA881X_OTP_REG_18 (WSA881X_DIGITAL_BASE+0x0092) -#define WSA881X_OTP_REG_19 (WSA881X_DIGITAL_BASE+0x0093) -#define WSA881X_OTP_REG_20 (WSA881X_DIGITAL_BASE+0x0094) -#define WSA881X_OTP_REG_21 (WSA881X_DIGITAL_BASE+0x0095) -#define WSA881X_OTP_REG_22 (WSA881X_DIGITAL_BASE+0x0096) -#define WSA881X_OTP_REG_23 (WSA881X_DIGITAL_BASE+0x0097) -#define WSA881X_OTP_REG_24 (WSA881X_DIGITAL_BASE+0x0098) -#define WSA881X_OTP_REG_25 (WSA881X_DIGITAL_BASE+0x0099) -#define WSA881X_OTP_REG_26 (WSA881X_DIGITAL_BASE+0x009A) -#define WSA881X_OTP_REG_27 (WSA881X_DIGITAL_BASE+0x009B) -#define WSA881X_OTP_REG_28 (WSA881X_DIGITAL_BASE+0x009C) -#define WSA881X_OTP_REG_29 (WSA881X_DIGITAL_BASE+0x009D) -#define WSA881X_OTP_REG_30 (WSA881X_DIGITAL_BASE+0x009E) -#define WSA881X_OTP_REG_31 (WSA881X_DIGITAL_BASE+0x009F) -#define WSA881X_OTP_REG_63 (WSA881X_DIGITAL_BASE+0x00BF) - -/* Analog Register address space */ -#define WSA881X_BIAS_REF_CTRL (WSA881X_ANALOG_BASE+0x0000) -#define WSA881X_BIAS_TEST (WSA881X_ANALOG_BASE+0x0001) -#define WSA881X_BIAS_BIAS (WSA881X_ANALOG_BASE+0x0002) -#define WSA881X_TEMP_OP (WSA881X_ANALOG_BASE+0x0003) -#define WSA881X_TEMP_IREF_CTRL (WSA881X_ANALOG_BASE+0x0004) -#define WSA881X_TEMP_ISENS_CTRL (WSA881X_ANALOG_BASE+0x0005) -#define WSA881X_TEMP_CLK_CTRL (WSA881X_ANALOG_BASE+0x0006) -#define WSA881X_TEMP_TEST (WSA881X_ANALOG_BASE+0x0007) -#define WSA881X_TEMP_BIAS (WSA881X_ANALOG_BASE+0x0008) -#define WSA881X_TEMP_ADC_CTRL (WSA881X_ANALOG_BASE+0x0009) -#define WSA881X_TEMP_DOUT_MSB (WSA881X_ANALOG_BASE+0x000A) -#define WSA881X_TEMP_DOUT_LSB (WSA881X_ANALOG_BASE+0x000B) -#define WSA881X_ADC_EN_MODU_V (WSA881X_ANALOG_BASE+0x0010) -#define WSA881X_ADC_EN_MODU_I (WSA881X_ANALOG_BASE+0x0011) -#define WSA881X_ADC_EN_DET_TEST_V (WSA881X_ANALOG_BASE+0x0012) -#define WSA881X_ADC_EN_DET_TEST_I (WSA881X_ANALOG_BASE+0x0013) -#define WSA881X_ADC_SEL_IBIAS (WSA881X_ANALOG_BASE+0x0014) -#define WSA881X_ADC_EN_SEL_IBAIS (WSA881X_ANALOG_BASE+0x0015) -#define WSA881X_SPKR_DRV_EN (WSA881X_ANALOG_BASE+0x001A) -#define WSA881X_SPKR_DRV_GAIN (WSA881X_ANALOG_BASE+0x001B) -#define WSA881X_SPKR_DAC_CTL (WSA881X_ANALOG_BASE+0x001C) -#define WSA881X_SPKR_DRV_DBG (WSA881X_ANALOG_BASE+0x001D) -#define WSA881X_SPKR_PWRSTG_DBG (WSA881X_ANALOG_BASE+0x001E) -#define WSA881X_SPKR_OCP_CTL (WSA881X_ANALOG_BASE+0x001F) -#define WSA881X_SPKR_CLIP_CTL (WSA881X_ANALOG_BASE+0x0020) -#define WSA881X_SPKR_BBM_CTL (WSA881X_ANALOG_BASE+0x0021) -#define WSA881X_SPKR_MISC_CTL1 (WSA881X_ANALOG_BASE+0x0022) -#define WSA881X_SPKR_MISC_CTL2 (WSA881X_ANALOG_BASE+0x0023) -#define WSA881X_SPKR_BIAS_INT (WSA881X_ANALOG_BASE+0x0024) -#define WSA881X_SPKR_PA_INT (WSA881X_ANALOG_BASE+0x0025) -#define WSA881X_SPKR_BIAS_CAL (WSA881X_ANALOG_BASE+0x0026) -#define WSA881X_SPKR_BIAS_PSRR (WSA881X_ANALOG_BASE+0x0027) -#define WSA881X_SPKR_STATUS1 (WSA881X_ANALOG_BASE+0x0028) -#define WSA881X_SPKR_STATUS2 (WSA881X_ANALOG_BASE+0x0029) -#define WSA881X_BOOST_EN_CTL (WSA881X_ANALOG_BASE+0x002A) -#define WSA881X_BOOST_CURRENT_LIMIT (WSA881X_ANALOG_BASE+0x002B) -#define WSA881X_BOOST_PS_CTL (WSA881X_ANALOG_BASE+0x002C) -#define WSA881X_BOOST_PRESET_OUT1 (WSA881X_ANALOG_BASE+0x002D) -#define WSA881X_BOOST_PRESET_OUT2 (WSA881X_ANALOG_BASE+0x002E) -#define WSA881X_BOOST_FORCE_OUT (WSA881X_ANALOG_BASE+0x002F) -#define WSA881X_BOOST_LDO_PROG (WSA881X_ANALOG_BASE+0x0030) -#define WSA881X_BOOST_SLOPE_COMP_ISENSE_FB (WSA881X_ANALOG_BASE+0x0031) -#define WSA881X_BOOST_RON_CTL (WSA881X_ANALOG_BASE+0x0032) -#define WSA881X_BOOST_LOOP_STABILITY (WSA881X_ANALOG_BASE+0x0033) -#define WSA881X_BOOST_ZX_CTL (WSA881X_ANALOG_BASE+0x0034) -#define WSA881X_BOOST_START_CTL (WSA881X_ANALOG_BASE+0x0035) -#define WSA881X_BOOST_MISC1_CTL (WSA881X_ANALOG_BASE+0x0036) -#define WSA881X_BOOST_MISC2_CTL (WSA881X_ANALOG_BASE+0x0037) -#define WSA881X_BOOST_MISC3_CTL (WSA881X_ANALOG_BASE+0x0038) -#define WSA881X_BOOST_ATEST_CTL (WSA881X_ANALOG_BASE+0x0039) -#define WSA881X_SPKR_PROT_FE_GAIN (WSA881X_ANALOG_BASE+0x003A) -#define WSA881X_SPKR_PROT_FE_CM_LDO_SET (WSA881X_ANALOG_BASE+0x003B) -#define WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1 (WSA881X_ANALOG_BASE+0x003C) -#define WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2 (WSA881X_ANALOG_BASE+0x003D) -#define WSA881X_SPKR_PROT_ATEST1 (WSA881X_ANALOG_BASE+0x003E) -#define WSA881X_SPKR_PROT_ATEST2 (WSA881X_ANALOG_BASE+0x003F) -#define WSA881X_SPKR_PROT_FE_VSENSE_VCM (WSA881X_ANALOG_BASE+0x0040) -#define WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1 (WSA881X_ANALOG_BASE+0x0041) -#define WSA881X_BONGO_RESRV_REG1 (WSA881X_ANALOG_BASE+0x0042) -#define WSA881X_BONGO_RESRV_REG2 (WSA881X_ANALOG_BASE+0x0043) -#define WSA881X_SPKR_PROT_SAR (WSA881X_ANALOG_BASE+0x0044) -#define WSA881X_SPKR_STATUS3 (WSA881X_ANALOG_BASE+0x0045) - -#define WSA881X_NUM_REGISTERS (WSA881X_SPKR_STATUS3+1) -#define WSA881X_MAX_REGISTER (WSA881X_NUM_REGISTERS-1) -#define WSA881X_CACHE_SIZE WSA881X_NUM_REGISTERS - -#endif /* WSA881X_REGISTERS_H */ diff --git a/techpack/audio/asoc/codecs/wsa881x-regmap-analog.c b/techpack/audio/asoc/codecs/wsa881x-regmap-analog.c deleted file mode 100644 index 4d971c1a96e4..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-regmap-analog.c +++ /dev/null @@ -1,498 +0,0 @@ -/* Copyright (c) 2015, 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "wsa881x-registers-analog.h" -#include "wsa881x-analog.h" - -struct reg_default wsa881x_ana_reg_defaults[] = { - {WSA881X_CHIP_ID0, 0x00}, - {WSA881X_CHIP_ID1, 0x00}, - {WSA881X_CHIP_ID2, 0x00}, - {WSA881X_CHIP_ID3, 0x02}, - {WSA881X_BUS_ID, 0x00}, - {WSA881X_CDC_RST_CTL, 0x00}, - {WSA881X_CDC_TOP_CLK_CTL, 0x03}, - {WSA881X_CDC_ANA_CLK_CTL, 0x00}, - {WSA881X_CDC_DIG_CLK_CTL, 0x00}, - {WSA881X_CLOCK_CONFIG, 0x00}, - {WSA881X_ANA_CTL, 0x08}, - {WSA881X_SWR_RESET_EN, 0x00}, - {WSA881X_TEMP_DETECT_CTL, 0x01}, - {WSA881X_TEMP_MSB, 0x00}, - {WSA881X_TEMP_LSB, 0x00}, - {WSA881X_TEMP_CONFIG0, 0x00}, - {WSA881X_TEMP_CONFIG1, 0x00}, - {WSA881X_CDC_CLIP_CTL, 0x03}, - {WSA881X_SDM_PDM9_LSB, 0x00}, - {WSA881X_SDM_PDM9_MSB, 0x00}, - {WSA881X_CDC_RX_CTL, 0x7E}, - {WSA881X_DEM_BYPASS_DATA0, 0x00}, - {WSA881X_DEM_BYPASS_DATA1, 0x00}, - {WSA881X_DEM_BYPASS_DATA2, 0x00}, - {WSA881X_DEM_BYPASS_DATA3, 0x00}, - {WSA881X_OTP_CTRL0, 0x00}, - {WSA881X_OTP_CTRL1, 0x00}, - {WSA881X_HDRIVE_CTL_GROUP1, 0x00}, - {WSA881X_INTR_MODE, 0x00}, - {WSA881X_INTR_MASK, 0x1F}, - {WSA881X_INTR_STATUS, 0x00}, - {WSA881X_INTR_CLEAR, 0x00}, - {WSA881X_INTR_LEVEL, 0x00}, - {WSA881X_INTR_SET, 0x00}, - {WSA881X_INTR_TEST, 0x00}, - {WSA881X_PDM_TEST_MODE, 0x00}, - {WSA881X_ATE_TEST_MODE, 0x00}, - {WSA881X_PIN_CTL_MODE, 0x00}, - {WSA881X_PIN_CTL_OE, 0x00}, - {WSA881X_PIN_WDATA_IOPAD, 0x00}, - {WSA881X_PIN_STATUS, 0x00}, - {WSA881X_DIG_DEBUG_MODE, 0x00}, - {WSA881X_DIG_DEBUG_SEL, 0x00}, - {WSA881X_DIG_DEBUG_EN, 0x00}, - {WSA881X_SWR_HM_TEST1, 0x08}, - {WSA881X_SWR_HM_TEST2, 0x00}, - {WSA881X_TEMP_DETECT_DBG_CTL, 0x00}, - {WSA881X_TEMP_DEBUG_MSB, 0x00}, - {WSA881X_TEMP_DEBUG_LSB, 0x00}, - {WSA881X_SAMPLE_EDGE_SEL, 0x0C}, - {WSA881X_SPARE_0, 0x00}, - {WSA881X_SPARE_1, 0x00}, - {WSA881X_SPARE_2, 0x00}, - {WSA881X_OTP_REG_0, 0x01}, - {WSA881X_OTP_REG_1, 0xFF}, - {WSA881X_OTP_REG_2, 0xC0}, - {WSA881X_OTP_REG_3, 0xFF}, - {WSA881X_OTP_REG_4, 0xC0}, - {WSA881X_OTP_REG_5, 0xFF}, - {WSA881X_OTP_REG_6, 0xFF}, - {WSA881X_OTP_REG_7, 0xFF}, - {WSA881X_OTP_REG_8, 0xFF}, - {WSA881X_OTP_REG_9, 0xFF}, - {WSA881X_OTP_REG_10, 0xFF}, - {WSA881X_OTP_REG_11, 0xFF}, - {WSA881X_OTP_REG_12, 0xFF}, - {WSA881X_OTP_REG_13, 0xFF}, - {WSA881X_OTP_REG_14, 0xFF}, - {WSA881X_OTP_REG_15, 0xFF}, - {WSA881X_OTP_REG_16, 0xFF}, - {WSA881X_OTP_REG_17, 0xFF}, - {WSA881X_OTP_REG_18, 0xFF}, - {WSA881X_OTP_REG_19, 0xFF}, - {WSA881X_OTP_REG_20, 0xFF}, - {WSA881X_OTP_REG_21, 0xFF}, - {WSA881X_OTP_REG_22, 0xFF}, - {WSA881X_OTP_REG_23, 0xFF}, - {WSA881X_OTP_REG_24, 0x03}, - {WSA881X_OTP_REG_25, 0x01}, - {WSA881X_OTP_REG_26, 0x03}, - {WSA881X_OTP_REG_27, 0x11}, - {WSA881X_OTP_REG_28, 0xFF}, - {WSA881X_OTP_REG_29, 0xFF}, - {WSA881X_OTP_REG_30, 0xFF}, - {WSA881X_OTP_REG_31, 0xFF}, - {WSA881X_OTP_REG_63, 0x40}, - /* WSA881x Analog registers */ - {WSA881X_BIAS_REF_CTRL, 0x6C}, - {WSA881X_BIAS_TEST, 0x16}, - {WSA881X_BIAS_BIAS, 0xF0}, - {WSA881X_TEMP_OP, 0x00}, - {WSA881X_TEMP_IREF_CTRL, 0x56}, - {WSA881X_TEMP_ISENS_CTRL, 0x47}, - {WSA881X_TEMP_CLK_CTRL, 0x87}, - {WSA881X_TEMP_TEST, 0x00}, - {WSA881X_TEMP_BIAS, 0x51}, - {WSA881X_TEMP_ADC_CTRL, 0x00}, - {WSA881X_TEMP_DOUT_MSB, 0x00}, - {WSA881X_TEMP_DOUT_LSB, 0x00}, - {WSA881X_ADC_EN_MODU_V, 0x00}, - {WSA881X_ADC_EN_MODU_I, 0x00}, - {WSA881X_ADC_EN_DET_TEST_V, 0x00}, - {WSA881X_ADC_EN_DET_TEST_I, 0x00}, - {WSA881X_ADC_SEL_IBIAS, 0x25}, - {WSA881X_ADC_EN_SEL_IBIAS, 0x10}, - {WSA881X_SPKR_DRV_EN, 0x74}, - {WSA881X_SPKR_DRV_GAIN, 0x01}, - {WSA881X_SPKR_DAC_CTL, 0x40}, - {WSA881X_SPKR_DRV_DBG, 0x15}, - {WSA881X_SPKR_PWRSTG_DBG, 0x00}, - {WSA881X_SPKR_OCP_CTL, 0xD4}, - {WSA881X_SPKR_CLIP_CTL, 0x90}, - {WSA881X_SPKR_BBM_CTL, 0x00}, - {WSA881X_SPKR_MISC_CTL1, 0x80}, - {WSA881X_SPKR_MISC_CTL2, 0x00}, - {WSA881X_SPKR_BIAS_INT, 0x56}, - {WSA881X_SPKR_PA_INT, 0x54}, - {WSA881X_SPKR_BIAS_CAL, 0xAC}, - {WSA881X_SPKR_BIAS_PSRR, 0x54}, - {WSA881X_SPKR_STATUS1, 0x00}, - {WSA881X_SPKR_STATUS2, 0x00}, - {WSA881X_BOOST_EN_CTL, 0x18}, - {WSA881X_BOOST_CURRENT_LIMIT, 0x7A}, - {WSA881X_BOOST_PS_CTL, 0xC0}, - {WSA881X_BOOST_PRESET_OUT1, 0x77}, - {WSA881X_BOOST_PRESET_OUT2, 0x70}, - {WSA881X_BOOST_FORCE_OUT, 0x0E}, - {WSA881X_BOOST_LDO_PROG, 0x16}, - {WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, 0x71}, - {WSA881X_BOOST_RON_CTL, 0x0F}, - {WSA881X_BOOST_LOOP_STABILITY, 0xAD}, - {WSA881X_BOOST_ZX_CTL, 0x34}, - {WSA881X_BOOST_START_CTL, 0x23}, - {WSA881X_BOOST_MISC1_CTL, 0x80}, - {WSA881X_BOOST_MISC2_CTL, 0x00}, - {WSA881X_BOOST_MISC3_CTL, 0x00}, - {WSA881X_BOOST_ATEST_CTL, 0x00}, - {WSA881X_SPKR_PROT_FE_GAIN, 0x46}, - {WSA881X_SPKR_PROT_FE_CM_LDO_SET, 0x3B}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1, 0x8D}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2, 0x8D}, - {WSA881X_SPKR_PROT_ATEST1, 0x01}, - {WSA881X_SPKR_PROT_ATEST2, 0x00}, - {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x8D}, - {WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1, 0x4D}, - {WSA881X_BONGO_RESRV_REG1, 0x00}, - {WSA881X_BONGO_RESRV_REG2, 0x00}, - {WSA881X_SPKR_PROT_SAR, 0x00}, - {WSA881X_SPKR_STATUS3, 0x00}, -}; - -struct reg_default wsa881x_ana_reg_defaults_0[] = { - {WSA881X_CHIP_ID0, 0x00}, - {WSA881X_CHIP_ID1, 0x00}, - {WSA881X_CHIP_ID2, 0x00}, - {WSA881X_CHIP_ID3, 0x02}, - {WSA881X_BUS_ID, 0x00}, - {WSA881X_CDC_RST_CTL, 0x00}, - {WSA881X_CDC_TOP_CLK_CTL, 0x03}, - {WSA881X_CDC_ANA_CLK_CTL, 0x00}, - {WSA881X_CDC_DIG_CLK_CTL, 0x00}, - {WSA881X_CLOCK_CONFIG, 0x00}, - {WSA881X_ANA_CTL, 0x08}, - {WSA881X_SWR_RESET_EN, 0x00}, - {WSA881X_TEMP_DETECT_CTL, 0x01}, - {WSA881X_TEMP_MSB, 0x00}, - {WSA881X_TEMP_LSB, 0x00}, - {WSA881X_TEMP_CONFIG0, 0x00}, - {WSA881X_TEMP_CONFIG1, 0x00}, - {WSA881X_CDC_CLIP_CTL, 0x03}, - {WSA881X_SDM_PDM9_LSB, 0x00}, - {WSA881X_SDM_PDM9_MSB, 0x00}, - {WSA881X_CDC_RX_CTL, 0x7E}, - {WSA881X_DEM_BYPASS_DATA0, 0x00}, - {WSA881X_DEM_BYPASS_DATA1, 0x00}, - {WSA881X_DEM_BYPASS_DATA2, 0x00}, - {WSA881X_DEM_BYPASS_DATA3, 0x00}, - {WSA881X_OTP_CTRL0, 0x00}, - {WSA881X_OTP_CTRL1, 0x00}, - {WSA881X_HDRIVE_CTL_GROUP1, 0x00}, - {WSA881X_INTR_MODE, 0x00}, - {WSA881X_INTR_MASK, 0x1F}, - {WSA881X_INTR_STATUS, 0x00}, - {WSA881X_INTR_CLEAR, 0x00}, - {WSA881X_INTR_LEVEL, 0x00}, - {WSA881X_INTR_SET, 0x00}, - {WSA881X_INTR_TEST, 0x00}, - {WSA881X_PDM_TEST_MODE, 0x00}, - {WSA881X_ATE_TEST_MODE, 0x00}, - {WSA881X_PIN_CTL_MODE, 0x00}, - {WSA881X_PIN_CTL_OE, 0x00}, - {WSA881X_PIN_WDATA_IOPAD, 0x00}, - {WSA881X_PIN_STATUS, 0x00}, - {WSA881X_DIG_DEBUG_MODE, 0x00}, - {WSA881X_DIG_DEBUG_SEL, 0x00}, - {WSA881X_DIG_DEBUG_EN, 0x00}, - {WSA881X_SWR_HM_TEST1, 0x08}, - {WSA881X_SWR_HM_TEST2, 0x00}, - {WSA881X_TEMP_DETECT_DBG_CTL, 0x00}, - {WSA881X_TEMP_DEBUG_MSB, 0x00}, - {WSA881X_TEMP_DEBUG_LSB, 0x00}, - {WSA881X_SAMPLE_EDGE_SEL, 0x0C}, - {WSA881X_SPARE_0, 0x00}, - {WSA881X_SPARE_1, 0x00}, - {WSA881X_SPARE_2, 0x00}, - {WSA881X_OTP_REG_0, 0x01}, - {WSA881X_OTP_REG_1, 0xFF}, - {WSA881X_OTP_REG_2, 0xC0}, - {WSA881X_OTP_REG_3, 0xFF}, - {WSA881X_OTP_REG_4, 0xC0}, - {WSA881X_OTP_REG_5, 0xFF}, - {WSA881X_OTP_REG_6, 0xFF}, - {WSA881X_OTP_REG_7, 0xFF}, - {WSA881X_OTP_REG_8, 0xFF}, - {WSA881X_OTP_REG_9, 0xFF}, - {WSA881X_OTP_REG_10, 0xFF}, - {WSA881X_OTP_REG_11, 0xFF}, - {WSA881X_OTP_REG_12, 0xFF}, - {WSA881X_OTP_REG_13, 0xFF}, - {WSA881X_OTP_REG_14, 0xFF}, - {WSA881X_OTP_REG_15, 0xFF}, - {WSA881X_OTP_REG_16, 0xFF}, - {WSA881X_OTP_REG_17, 0xFF}, - {WSA881X_OTP_REG_18, 0xFF}, - {WSA881X_OTP_REG_19, 0xFF}, - {WSA881X_OTP_REG_20, 0xFF}, - {WSA881X_OTP_REG_21, 0xFF}, - {WSA881X_OTP_REG_22, 0xFF}, - {WSA881X_OTP_REG_23, 0xFF}, - {WSA881X_OTP_REG_24, 0x03}, - {WSA881X_OTP_REG_25, 0x01}, - {WSA881X_OTP_REG_26, 0x03}, - {WSA881X_OTP_REG_27, 0x11}, - {WSA881X_OTP_REG_28, 0xFF}, - {WSA881X_OTP_REG_29, 0xFF}, - {WSA881X_OTP_REG_30, 0xFF}, - {WSA881X_OTP_REG_31, 0xFF}, - {WSA881X_OTP_REG_63, 0x40}, -}; - -struct reg_default wsa881x_ana_reg_defaults_1[] = { - {WSA881X_BIAS_REF_CTRL - WSA881X_ANALOG_BASE, 0x6C}, - {WSA881X_BIAS_TEST - WSA881X_ANALOG_BASE, 0x16}, - {WSA881X_BIAS_BIAS - WSA881X_ANALOG_BASE, 0xF0}, - {WSA881X_TEMP_OP - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_TEMP_IREF_CTRL - WSA881X_ANALOG_BASE, 0x56}, - {WSA881X_TEMP_ISENS_CTRL - WSA881X_ANALOG_BASE, 0x47}, - {WSA881X_TEMP_CLK_CTRL - WSA881X_ANALOG_BASE, 0x87}, - {WSA881X_TEMP_TEST - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_TEMP_BIAS - WSA881X_ANALOG_BASE, 0x51}, - {WSA881X_TEMP_ADC_CTRL - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_TEMP_DOUT_MSB - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_TEMP_DOUT_LSB - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_ADC_EN_MODU_V - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_ADC_EN_MODU_I - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_ADC_EN_DET_TEST_V - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_ADC_EN_DET_TEST_I - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_ADC_SEL_IBIAS - WSA881X_ANALOG_BASE, 0x25}, - {WSA881X_ADC_EN_SEL_IBIAS - WSA881X_ANALOG_BASE, 0x10}, - {WSA881X_SPKR_DRV_EN - WSA881X_ANALOG_BASE, 0x74}, - {WSA881X_SPKR_DRV_GAIN - WSA881X_ANALOG_BASE, 0x01}, - {WSA881X_SPKR_DAC_CTL - WSA881X_ANALOG_BASE, 0x40}, - {WSA881X_SPKR_DRV_DBG - WSA881X_ANALOG_BASE, 0x15}, - {WSA881X_SPKR_PWRSTG_DBG - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_OCP_CTL - WSA881X_ANALOG_BASE, 0xD4}, - {WSA881X_SPKR_CLIP_CTL - WSA881X_ANALOG_BASE, 0x90}, - {WSA881X_SPKR_BBM_CTL - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_MISC_CTL1 - WSA881X_ANALOG_BASE, 0x80}, - {WSA881X_SPKR_MISC_CTL2 - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_BIAS_INT - WSA881X_ANALOG_BASE, 0x56}, - {WSA881X_SPKR_PA_INT - WSA881X_ANALOG_BASE, 0x54}, - {WSA881X_SPKR_BIAS_CAL - WSA881X_ANALOG_BASE, 0xAC}, - {WSA881X_SPKR_BIAS_PSRR - WSA881X_ANALOG_BASE, 0x54}, - {WSA881X_SPKR_STATUS1 - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_STATUS2 - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_BOOST_EN_CTL - WSA881X_ANALOG_BASE, 0x18}, - {WSA881X_BOOST_CURRENT_LIMIT - WSA881X_ANALOG_BASE, 0x7A}, - {WSA881X_BOOST_PS_CTL - WSA881X_ANALOG_BASE, 0xC0}, - {WSA881X_BOOST_PRESET_OUT1 - WSA881X_ANALOG_BASE, 0x77}, - {WSA881X_BOOST_PRESET_OUT2 - WSA881X_ANALOG_BASE, 0x70}, - {WSA881X_BOOST_FORCE_OUT - WSA881X_ANALOG_BASE, 0x0E}, - {WSA881X_BOOST_LDO_PROG - WSA881X_ANALOG_BASE, 0x16}, - {WSA881X_BOOST_SLOPE_COMP_ISENSE_FB - WSA881X_ANALOG_BASE, 0x71}, - {WSA881X_BOOST_RON_CTL - WSA881X_ANALOG_BASE, 0x0F}, - {WSA881X_BOOST_LOOP_STABILITY - WSA881X_ANALOG_BASE, 0xAD}, - {WSA881X_BOOST_ZX_CTL - WSA881X_ANALOG_BASE, 0x34}, - {WSA881X_BOOST_START_CTL - WSA881X_ANALOG_BASE, 0x23}, - {WSA881X_BOOST_MISC1_CTL - WSA881X_ANALOG_BASE, 0x80}, - {WSA881X_BOOST_MISC2_CTL - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_BOOST_MISC3_CTL - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_BOOST_ATEST_CTL - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_PROT_FE_GAIN - WSA881X_ANALOG_BASE, 0x46}, - {WSA881X_SPKR_PROT_FE_CM_LDO_SET - WSA881X_ANALOG_BASE, 0x3B}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1 - WSA881X_ANALOG_BASE, 0x8D}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2 - WSA881X_ANALOG_BASE, 0x8D}, - {WSA881X_SPKR_PROT_ATEST1 - WSA881X_ANALOG_BASE, 0x01}, - {WSA881X_SPKR_PROT_ATEST2 - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_PROT_FE_VSENSE_VCM - WSA881X_ANALOG_BASE, 0x8D}, - {WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1 - WSA881X_ANALOG_BASE, 0x4D}, - {WSA881X_BONGO_RESRV_REG1 - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_BONGO_RESRV_REG2 - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_PROT_SAR - WSA881X_ANALOG_BASE, 0x00}, - {WSA881X_SPKR_STATUS3 - WSA881X_ANALOG_BASE, 0x00}, -}; - -static const struct reg_sequence wsa881x_rev_2_0_dig[] = { - {WSA881X_RESET_CTL, 0x00}, - {WSA881X_TADC_VALUE_CTL, 0x01}, - {WSA881X_INTR_MASK, 0x1B}, - {WSA881X_IOPAD_CTL, 0x00}, - {WSA881X_OTP_REG_28, 0x3F}, - {WSA881X_OTP_REG_29, 0x3F}, - {WSA881X_OTP_REG_30, 0x01}, - {WSA881X_OTP_REG_31, 0x01}, -}; - -static const struct reg_sequence wsa881x_rev_2_0_ana[] = { - {WSA881X_TEMP_ADC_CTRL, 0x03}, - {WSA881X_ADC_SEL_IBIAS, 0x45}, - {WSA881X_SPKR_DRV_GAIN, 0xC1}, - {WSA881X_SPKR_DAC_CTL, 0x42}, - {WSA881X_SPKR_BBM_CTL, 0x02}, - {WSA881X_SPKR_MISC_CTL1, 0x40}, - {WSA881X_SPKR_MISC_CTL2, 0x07}, - {WSA881X_SPKR_BIAS_INT, 0x5F}, - {WSA881X_SPKR_BIAS_PSRR, 0x44}, - {WSA881X_BOOST_PS_CTL, 0xA0}, - {WSA881X_BOOST_PRESET_OUT1, 0xB7}, - {WSA881X_BOOST_LOOP_STABILITY, 0x8D}, - {WSA881X_SPKR_PROT_ATEST2, 0x02}, - {WSA881X_BONGO_RESRV_REG1, 0x5E}, - {WSA881X_BONGO_RESRV_REG2, 0x07}, -}; - -struct reg_default wsa881x_rev_2_0_regmap_ana[] = { - {WSA881X_TEMP_ADC_CTRL - WSA881X_ANALOG_BASE, 0x03}, - {WSA881X_ADC_SEL_IBIAS - WSA881X_ANALOG_BASE, 0x45}, - {WSA881X_SPKR_DRV_GAIN - WSA881X_ANALOG_BASE, 0xC1}, - {WSA881X_SPKR_DAC_CTL - WSA881X_ANALOG_BASE, 0x42}, - {WSA881X_SPKR_BBM_CTL - WSA881X_ANALOG_BASE, 0x02}, - {WSA881X_SPKR_MISC_CTL1 - WSA881X_ANALOG_BASE, 0x40}, - {WSA881X_SPKR_MISC_CTL2 - WSA881X_ANALOG_BASE, 0x07}, - {WSA881X_SPKR_BIAS_INT - WSA881X_ANALOG_BASE, 0x5F}, - {WSA881X_SPKR_BIAS_PSRR - WSA881X_ANALOG_BASE, 0x44}, - {WSA881X_BOOST_PS_CTL - WSA881X_ANALOG_BASE, 0xA0}, - {WSA881X_BOOST_PRESET_OUT1 - WSA881X_ANALOG_BASE, 0xB7}, - {WSA881X_BOOST_LOOP_STABILITY - WSA881X_ANALOG_BASE, 0x8D}, - {WSA881X_SPKR_PROT_ATEST2 - WSA881X_ANALOG_BASE, 0x02}, - {WSA881X_BONGO_RESRV_REG1 - WSA881X_ANALOG_BASE, 0x5E}, - {WSA881X_BONGO_RESRV_REG2 - WSA881X_ANALOG_BASE, 0x07}, -}; - -/** - * wsa881x_update_reg_defaults_2_0 - update default values of regs for v2.0 - * - * wsa881x v2.0 has different default values for certain analog and digital - * registers compared to v1.x. Therefore, update the values of these registers - * with the values from tables defined above for v2.0. - */ -void wsa881x_update_reg_defaults_2_0(void) -{ - int i, j; - - for (i = 0; i < ARRAY_SIZE(wsa881x_rev_2_0_dig); i++) { - for (j = 0; j < ARRAY_SIZE(wsa881x_ana_reg_defaults); j++) - if (wsa881x_ana_reg_defaults[j].reg == - wsa881x_rev_2_0_dig[i].reg) - wsa881x_ana_reg_defaults[j].def = - wsa881x_rev_2_0_dig[i].def; - } - for (i = 0; i < ARRAY_SIZE(wsa881x_rev_2_0_ana); i++) { - for (j = 0; j < ARRAY_SIZE(wsa881x_ana_reg_defaults); j++) - if (wsa881x_ana_reg_defaults[j].reg == - wsa881x_rev_2_0_ana[i].reg) - wsa881x_ana_reg_defaults[j].def = - wsa881x_rev_2_0_ana[i].def; - } -} -EXPORT_SYMBOL(wsa881x_update_reg_defaults_2_0); - -/** - * wsa881x_update_regmap_2_0 - update regmap framework with new tables - * @regmap: pointer to wsa881x regmap structure - * @flag: indicates digital or analog wsa881x slave - * - * wsa881x v2.0 has some new registers for both analog and digital slaves. - * Update the regmap framework with all the new registers. - */ -void wsa881x_update_regmap_2_0(struct regmap *regmap, int flag) -{ - u16 ret = 0; - - switch (flag) { - case WSA881X_DIGITAL_SLAVE: - ret = regmap_register_patch(regmap, wsa881x_rev_2_0_dig, - ARRAY_SIZE(wsa881x_rev_2_0_dig)); - break; - case WSA881X_ANALOG_SLAVE: - ret = regmap_register_patch(regmap, wsa881x_rev_2_0_ana, - ARRAY_SIZE(wsa881x_rev_2_0_ana)); - break; - default: - pr_debug("%s: unknown version", __func__); - ret = -EINVAL; - break; - } - if (ret) - pr_err("%s: Failed to update regmap defaults ret= %d\n", - __func__, ret); -} -EXPORT_SYMBOL(wsa881x_update_regmap_2_0); - -static bool wsa881x_readable_register(struct device *dev, unsigned int reg) -{ - return wsa881x_ana_reg_readable[reg]; -} - -static bool wsa881x_volatile_register(struct device *dev, unsigned int reg) -{ - switch (reg) { - case WSA881X_CHIP_ID0: - case WSA881X_CHIP_ID1: - case WSA881X_CHIP_ID2: - case WSA881X_CHIP_ID3: - case WSA881X_BUS_ID: - case WSA881X_TEMP_MSB: - case WSA881X_TEMP_LSB: - case WSA881X_SDM_PDM9_LSB: - case WSA881X_SDM_PDM9_MSB: - case WSA881X_OTP_REG_0: - case WSA881X_OTP_REG_1: - case WSA881X_OTP_REG_2: - case WSA881X_OTP_REG_3: - case WSA881X_OTP_REG_4: - case WSA881X_OTP_REG_5: - case WSA881X_OTP_REG_31: - case WSA881X_TEMP_DOUT_MSB: - case WSA881X_TEMP_DOUT_LSB: - case WSA881X_TEMP_OP: - case WSA881X_OTP_CTRL1: - case WSA881X_INTR_STATUS: - case WSA881X_ATE_TEST_MODE: - case WSA881X_PIN_STATUS: - case WSA881X_SWR_HM_TEST2: - case WSA881X_SPKR_STATUS1: - case WSA881X_SPKR_STATUS2: - case WSA881X_SPKR_STATUS3: - case WSA881X_SPKR_PROT_SAR: - return true; - default: - return false; - } -} - -struct regmap_config wsa881x_ana_regmap_config[] = { -{ - .reg_bits = 8, - .val_bits = 8, - .cache_type = REGCACHE_NONE, - .reg_defaults = wsa881x_ana_reg_defaults_0, - .num_reg_defaults = ARRAY_SIZE(wsa881x_ana_reg_defaults_0), - .max_register = WSA881X_MAX_REGISTER, - .volatile_reg = wsa881x_volatile_register, - .readable_reg = wsa881x_readable_register, - .reg_format_endian = REGMAP_ENDIAN_NATIVE, - .val_format_endian = REGMAP_ENDIAN_NATIVE, -}, -{ - .reg_bits = 8, - .val_bits = 8, - .cache_type = REGCACHE_NONE, - .reg_defaults = wsa881x_ana_reg_defaults_1, - .num_reg_defaults = ARRAY_SIZE(wsa881x_ana_reg_defaults_1), - .max_register = WSA881X_MAX_REGISTER, - .volatile_reg = wsa881x_volatile_register, - .readable_reg = wsa881x_readable_register, - .reg_format_endian = REGMAP_ENDIAN_NATIVE, - .val_format_endian = REGMAP_ENDIAN_NATIVE, -} -}; diff --git a/techpack/audio/asoc/codecs/wsa881x-regmap.c b/techpack/audio/asoc/codecs/wsa881x-regmap.c deleted file mode 100644 index 63bbbfa6beab..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-regmap.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2015-2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "wsa881x-registers.h" -#include "wsa881x.h" - -/* - * Default register reset values that are common across different versions - * are defined here. If a register reset value is changed based on version - * then remove it from this structure and add it in version specific - * structures. - */ -static struct reg_default wsa881x_defaults[] = { - {WSA881X_CHIP_ID0, 0x00}, - {WSA881X_CHIP_ID1, 0x00}, - {WSA881X_CHIP_ID2, 0x00}, - {WSA881X_CHIP_ID3, 0x02}, - {WSA881X_BUS_ID, 0x00}, - {WSA881X_CDC_RST_CTL, 0x00}, - {WSA881X_CDC_TOP_CLK_CTL, 0x03}, - {WSA881X_CDC_ANA_CLK_CTL, 0x00}, - {WSA881X_CDC_DIG_CLK_CTL, 0x00}, - {WSA881X_CLOCK_CONFIG, 0x00}, - {WSA881X_ANA_CTL, 0x08}, - {WSA881X_SWR_RESET_EN, 0x00}, - {WSA881X_TEMP_DETECT_CTL, 0x01}, - {WSA881X_TEMP_MSB, 0x00}, - {WSA881X_TEMP_LSB, 0x00}, - {WSA881X_TEMP_CONFIG0, 0x00}, - {WSA881X_TEMP_CONFIG1, 0x00}, - {WSA881X_CDC_CLIP_CTL, 0x03}, - {WSA881X_SDM_PDM9_LSB, 0x00}, - {WSA881X_SDM_PDM9_MSB, 0x00}, - {WSA881X_CDC_RX_CTL, 0x7E}, - {WSA881X_DEM_BYPASS_DATA0, 0x00}, - {WSA881X_DEM_BYPASS_DATA1, 0x00}, - {WSA881X_DEM_BYPASS_DATA2, 0x00}, - {WSA881X_DEM_BYPASS_DATA3, 0x00}, - {WSA881X_OTP_CTRL0, 0x00}, - {WSA881X_OTP_CTRL1, 0x00}, - {WSA881X_HDRIVE_CTL_GROUP1, 0x00}, - {WSA881X_INTR_MODE, 0x00}, - {WSA881X_INTR_STATUS, 0x00}, - {WSA881X_INTR_CLEAR, 0x00}, - {WSA881X_INTR_LEVEL, 0x00}, - {WSA881X_INTR_SET, 0x00}, - {WSA881X_INTR_TEST, 0x00}, - {WSA881X_PDM_TEST_MODE, 0x00}, - {WSA881X_ATE_TEST_MODE, 0x00}, - {WSA881X_PIN_CTL_MODE, 0x00}, - {WSA881X_PIN_CTL_OE, 0x00}, - {WSA881X_PIN_WDATA_IOPAD, 0x00}, - {WSA881X_PIN_STATUS, 0x00}, - {WSA881X_DIG_DEBUG_MODE, 0x00}, - {WSA881X_DIG_DEBUG_SEL, 0x00}, - {WSA881X_DIG_DEBUG_EN, 0x00}, - {WSA881X_SWR_HM_TEST1, 0x08}, - {WSA881X_SWR_HM_TEST2, 0x00}, - {WSA881X_TEMP_DETECT_DBG_CTL, 0x00}, - {WSA881X_TEMP_DEBUG_MSB, 0x00}, - {WSA881X_TEMP_DEBUG_LSB, 0x00}, - {WSA881X_SAMPLE_EDGE_SEL, 0x0C}, - {WSA881X_SPARE_0, 0x00}, - {WSA881X_SPARE_1, 0x00}, - {WSA881X_SPARE_2, 0x00}, - {WSA881X_OTP_REG_0, 0x01}, - {WSA881X_OTP_REG_1, 0xFF}, - {WSA881X_OTP_REG_2, 0xC0}, - {WSA881X_OTP_REG_3, 0xFF}, - {WSA881X_OTP_REG_4, 0xC0}, - {WSA881X_OTP_REG_5, 0xFF}, - {WSA881X_OTP_REG_6, 0xFF}, - {WSA881X_OTP_REG_7, 0xFF}, - {WSA881X_OTP_REG_8, 0xFF}, - {WSA881X_OTP_REG_9, 0xFF}, - {WSA881X_OTP_REG_10, 0xFF}, - {WSA881X_OTP_REG_11, 0xFF}, - {WSA881X_OTP_REG_12, 0xFF}, - {WSA881X_OTP_REG_13, 0xFF}, - {WSA881X_OTP_REG_14, 0xFF}, - {WSA881X_OTP_REG_15, 0xFF}, - {WSA881X_OTP_REG_16, 0xFF}, - {WSA881X_OTP_REG_17, 0xFF}, - {WSA881X_OTP_REG_18, 0xFF}, - {WSA881X_OTP_REG_19, 0xFF}, - {WSA881X_OTP_REG_20, 0xFF}, - {WSA881X_OTP_REG_21, 0xFF}, - {WSA881X_OTP_REG_22, 0xFF}, - {WSA881X_OTP_REG_23, 0xFF}, - {WSA881X_OTP_REG_24, 0x03}, - {WSA881X_OTP_REG_25, 0x01}, - {WSA881X_OTP_REG_26, 0x03}, - {WSA881X_OTP_REG_27, 0x11}, - {WSA881X_OTP_REG_63, 0x40}, - /* WSA881x Analog registers */ - {WSA881X_BIAS_REF_CTRL, 0x6C}, - {WSA881X_BIAS_TEST, 0x16}, - {WSA881X_BIAS_BIAS, 0xF0}, - {WSA881X_TEMP_OP, 0x00}, - {WSA881X_TEMP_IREF_CTRL, 0x56}, - {WSA881X_TEMP_ISENS_CTRL, 0x47}, - {WSA881X_TEMP_CLK_CTRL, 0x87}, - {WSA881X_TEMP_TEST, 0x00}, - {WSA881X_TEMP_BIAS, 0x51}, - {WSA881X_TEMP_DOUT_MSB, 0x00}, - {WSA881X_TEMP_DOUT_LSB, 0x00}, - {WSA881X_ADC_EN_MODU_V, 0x00}, - {WSA881X_ADC_EN_MODU_I, 0x00}, - {WSA881X_ADC_EN_DET_TEST_V, 0x00}, - {WSA881X_ADC_EN_DET_TEST_I, 0x00}, - {WSA881X_ADC_EN_SEL_IBAIS, 0x10}, - {WSA881X_SPKR_DRV_EN, 0x74}, - {WSA881X_SPKR_DRV_DBG, 0x15}, - {WSA881X_SPKR_PWRSTG_DBG, 0x00}, - {WSA881X_SPKR_OCP_CTL, 0xD4}, - {WSA881X_SPKR_CLIP_CTL, 0x90}, - {WSA881X_SPKR_PA_INT, 0x54}, - {WSA881X_SPKR_BIAS_CAL, 0xAC}, - {WSA881X_SPKR_STATUS1, 0x00}, - {WSA881X_SPKR_STATUS2, 0x00}, - {WSA881X_BOOST_EN_CTL, 0x18}, - {WSA881X_BOOST_CURRENT_LIMIT, 0x7A}, - {WSA881X_BOOST_PRESET_OUT2, 0x70}, - {WSA881X_BOOST_FORCE_OUT, 0x0E}, - {WSA881X_BOOST_LDO_PROG, 0x16}, - {WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, 0x71}, - {WSA881X_BOOST_RON_CTL, 0x0F}, - {WSA881X_BOOST_ZX_CTL, 0x34}, - {WSA881X_BOOST_START_CTL, 0x23}, - {WSA881X_BOOST_MISC1_CTL, 0x80}, - {WSA881X_BOOST_MISC2_CTL, 0x00}, - {WSA881X_BOOST_MISC3_CTL, 0x00}, - {WSA881X_BOOST_ATEST_CTL, 0x00}, - {WSA881X_SPKR_PROT_FE_GAIN, 0x46}, - {WSA881X_SPKR_PROT_FE_CM_LDO_SET, 0x3B}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1, 0x8D}, - {WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2, 0x8D}, - {WSA881X_SPKR_PROT_ATEST1, 0x01}, - {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x8D}, - {WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1, 0x4D}, - {WSA881X_SPKR_PROT_SAR, 0x00}, - {WSA881X_SPKR_STATUS3, 0x00}, -}; - -/* Default register reset values for WSA881x rev 2.0 */ -static struct reg_sequence wsa881x_rev_2_0[] = { - {WSA881X_RESET_CTL, 0x00, 0x00}, - {WSA881X_TADC_VALUE_CTL, 0x01, 0x00}, - {WSA881X_INTR_MASK, 0x1B, 0x00}, - {WSA881X_IOPAD_CTL, 0x00, 0x00}, - {WSA881X_OTP_REG_28, 0x3F, 0x00}, - {WSA881X_OTP_REG_29, 0x3F, 0x00}, - {WSA881X_OTP_REG_30, 0x01, 0x00}, - {WSA881X_OTP_REG_31, 0x01, 0x00}, - {WSA881X_TEMP_ADC_CTRL, 0x03, 0x00}, - {WSA881X_ADC_SEL_IBIAS, 0x45, 0x00}, - {WSA881X_SPKR_DRV_GAIN, 0xC1, 0x00}, - {WSA881X_SPKR_DAC_CTL, 0x42, 0x00}, - {WSA881X_SPKR_BBM_CTL, 0x02, 0x00}, - {WSA881X_SPKR_MISC_CTL1, 0x40, 0x00}, - {WSA881X_SPKR_MISC_CTL2, 0x07, 0x00}, - {WSA881X_SPKR_BIAS_INT, 0x5F, 0x00}, - {WSA881X_SPKR_BIAS_PSRR, 0x44, 0x00}, - {WSA881X_BOOST_PS_CTL, 0xA0, 0x00}, - {WSA881X_BOOST_PRESET_OUT1, 0xB7, 0x00}, - {WSA881X_BOOST_LOOP_STABILITY, 0x8D, 0x00}, - {WSA881X_SPKR_PROT_ATEST2, 0x02, 0x00}, - {WSA881X_BONGO_RESRV_REG1, 0x5E, 0x00}, - {WSA881X_BONGO_RESRV_REG2, 0x07, 0x00}, -}; - -/* - * wsa881x_regmap_defaults - update regmap default register values - * @regmap: pointer to regmap structure - * @version: wsa881x version id - * - * Update regmap default register values based on version id - * - */ -void wsa881x_regmap_defaults(struct regmap *regmap, u8 version) -{ - u16 ret = 0; - - if (!regmap) { - pr_debug("%s: regmap structure is NULL\n", __func__); - return; - } - - regcache_cache_only(regmap, true); - ret = regmap_multi_reg_write(regmap, wsa881x_rev_2_0, - ARRAY_SIZE(wsa881x_rev_2_0)); - regcache_cache_only(regmap, false); - - if (ret) - pr_debug("%s: Failed to update regmap defaults ret= %d\n", - __func__, ret); -} -EXPORT_SYMBOL(wsa881x_regmap_defaults); - -static bool wsa881x_readable_register(struct device *dev, unsigned int reg) -{ - return wsa881x_reg_readable[reg]; -} - -static bool wsa881x_volatile_register(struct device *dev, unsigned int reg) -{ - switch (reg) { - case WSA881X_CHIP_ID0: - case WSA881X_CHIP_ID1: - case WSA881X_CHIP_ID2: - case WSA881X_CHIP_ID3: - case WSA881X_BUS_ID: - case WSA881X_TEMP_MSB: - case WSA881X_TEMP_LSB: - case WSA881X_SDM_PDM9_LSB: - case WSA881X_SDM_PDM9_MSB: - case WSA881X_OTP_CTRL1: - case WSA881X_INTR_STATUS: - case WSA881X_ATE_TEST_MODE: - case WSA881X_PIN_STATUS: - case WSA881X_SWR_HM_TEST2: - case WSA881X_SPKR_STATUS1: - case WSA881X_SPKR_STATUS2: - case WSA881X_SPKR_STATUS3: - case WSA881X_OTP_REG_0: - case WSA881X_OTP_REG_1: - case WSA881X_OTP_REG_2: - case WSA881X_OTP_REG_3: - case WSA881X_OTP_REG_4: - case WSA881X_OTP_REG_5: - case WSA881X_OTP_REG_31: - case WSA881X_TEMP_DOUT_MSB: - case WSA881X_TEMP_DOUT_LSB: - case WSA881X_TEMP_OP: - case WSA881X_SPKR_PROT_SAR: - return true; - default: - return false; - } -} - -struct regmap_config wsa881x_regmap_config = { - .reg_bits = 16, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .reg_defaults = wsa881x_defaults, - .num_reg_defaults = ARRAY_SIZE(wsa881x_defaults), - .max_register = WSA881X_MAX_REGISTER, - .volatile_reg = wsa881x_volatile_register, - .readable_reg = wsa881x_readable_register, - .reg_format_endian = REGMAP_ENDIAN_NATIVE, - .val_format_endian = REGMAP_ENDIAN_NATIVE, - .can_multi_write = true, -}; diff --git a/techpack/audio/asoc/codecs/wsa881x-tables-analog.c b/techpack/audio/asoc/codecs/wsa881x-tables-analog.c deleted file mode 100644 index 6cd17eee647c..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-tables-analog.c +++ /dev/null @@ -1,170 +0,0 @@ -/* Copyright (c) 2015, 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "wsa881x-registers-analog.h" - -const u8 wsa881x_ana_reg_readable[WSA881X_CACHE_SIZE] = { - [WSA881X_CHIP_ID0] = 1, - [WSA881X_CHIP_ID1] = 1, - [WSA881X_CHIP_ID2] = 1, - [WSA881X_CHIP_ID3] = 1, - [WSA881X_BUS_ID] = 1, - [WSA881X_CDC_RST_CTL] = 1, - [WSA881X_CDC_TOP_CLK_CTL] = 1, - [WSA881X_CDC_ANA_CLK_CTL] = 1, - [WSA881X_CDC_DIG_CLK_CTL] = 1, - [WSA881X_CLOCK_CONFIG] = 1, - [WSA881X_ANA_CTL] = 1, - [WSA881X_SWR_RESET_EN] = 1, - [WSA881X_RESET_CTL] = 1, - [WSA881X_TADC_VALUE_CTL] = 1, - [WSA881X_TEMP_DETECT_CTL] = 1, - [WSA881X_TEMP_MSB] = 1, - [WSA881X_TEMP_LSB] = 1, - [WSA881X_TEMP_CONFIG0] = 1, - [WSA881X_TEMP_CONFIG1] = 1, - [WSA881X_CDC_CLIP_CTL] = 1, - [WSA881X_SDM_PDM9_LSB] = 1, - [WSA881X_SDM_PDM9_MSB] = 1, - [WSA881X_CDC_RX_CTL] = 1, - [WSA881X_DEM_BYPASS_DATA0] = 1, - [WSA881X_DEM_BYPASS_DATA1] = 1, - [WSA881X_DEM_BYPASS_DATA2] = 1, - [WSA881X_DEM_BYPASS_DATA3] = 1, - [WSA881X_OTP_CTRL0] = 1, - [WSA881X_OTP_CTRL1] = 1, - [WSA881X_HDRIVE_CTL_GROUP1] = 1, - [WSA881X_INTR_MODE] = 1, - [WSA881X_INTR_MASK] = 1, - [WSA881X_INTR_STATUS] = 1, - [WSA881X_INTR_CLEAR] = 1, - [WSA881X_INTR_LEVEL] = 1, - [WSA881X_INTR_SET] = 1, - [WSA881X_INTR_TEST] = 1, - [WSA881X_PDM_TEST_MODE] = 1, - [WSA881X_ATE_TEST_MODE] = 1, - [WSA881X_PIN_CTL_MODE] = 1, - [WSA881X_PIN_CTL_OE] = 1, - [WSA881X_PIN_WDATA_IOPAD] = 1, - [WSA881X_PIN_STATUS] = 1, - [WSA881X_DIG_DEBUG_MODE] = 1, - [WSA881X_DIG_DEBUG_SEL] = 1, - [WSA881X_DIG_DEBUG_EN] = 1, - [WSA881X_SWR_HM_TEST1] = 1, - [WSA881X_SWR_HM_TEST2] = 1, - [WSA881X_TEMP_DETECT_DBG_CTL] = 1, - [WSA881X_TEMP_DEBUG_MSB] = 1, - [WSA881X_TEMP_DEBUG_LSB] = 1, - [WSA881X_SAMPLE_EDGE_SEL] = 1, - [WSA881X_IOPAD_CTL] = 1, - [WSA881X_SPARE_0] = 1, - [WSA881X_SPARE_1] = 1, - [WSA881X_SPARE_2] = 1, - [WSA881X_OTP_REG_0] = 1, - [WSA881X_OTP_REG_1] = 1, - [WSA881X_OTP_REG_2] = 1, - [WSA881X_OTP_REG_3] = 1, - [WSA881X_OTP_REG_4] = 1, - [WSA881X_OTP_REG_5] = 1, - [WSA881X_OTP_REG_6] = 1, - [WSA881X_OTP_REG_7] = 1, - [WSA881X_OTP_REG_8] = 1, - [WSA881X_OTP_REG_9] = 1, - [WSA881X_OTP_REG_10] = 1, - [WSA881X_OTP_REG_11] = 1, - [WSA881X_OTP_REG_12] = 1, - [WSA881X_OTP_REG_13] = 1, - [WSA881X_OTP_REG_14] = 1, - [WSA881X_OTP_REG_15] = 1, - [WSA881X_OTP_REG_16] = 1, - [WSA881X_OTP_REG_17] = 1, - [WSA881X_OTP_REG_18] = 1, - [WSA881X_OTP_REG_19] = 1, - [WSA881X_OTP_REG_20] = 1, - [WSA881X_OTP_REG_21] = 1, - [WSA881X_OTP_REG_22] = 1, - [WSA881X_OTP_REG_23] = 1, - [WSA881X_OTP_REG_24] = 1, - [WSA881X_OTP_REG_25] = 1, - [WSA881X_OTP_REG_26] = 1, - [WSA881X_OTP_REG_27] = 1, - [WSA881X_OTP_REG_28] = 1, - [WSA881X_OTP_REG_29] = 1, - [WSA881X_OTP_REG_30] = 1, - [WSA881X_OTP_REG_31] = 1, - [WSA881X_OTP_REG_63] = 1, - /* Analog Registers */ - [WSA881X_BIAS_REF_CTRL] = 1, - [WSA881X_BIAS_TEST] = 1, - [WSA881X_BIAS_BIAS] = 1, - [WSA881X_TEMP_OP] = 1, - [WSA881X_TEMP_IREF_CTRL] = 1, - [WSA881X_TEMP_ISENS_CTRL] = 1, - [WSA881X_TEMP_CLK_CTRL] = 1, - [WSA881X_TEMP_TEST] = 1, - [WSA881X_TEMP_BIAS] = 1, - [WSA881X_TEMP_ADC_CTRL] = 1, - [WSA881X_TEMP_DOUT_MSB] = 1, - [WSA881X_TEMP_DOUT_LSB] = 1, - [WSA881X_ADC_EN_MODU_V] = 1, - [WSA881X_ADC_EN_MODU_I] = 1, - [WSA881X_ADC_EN_DET_TEST_V] = 1, - [WSA881X_ADC_EN_DET_TEST_I] = 1, - [WSA881X_ADC_SEL_IBIAS] = 1, - [WSA881X_ADC_EN_SEL_IBIAS] = 1, - [WSA881X_SPKR_DRV_EN] = 1, - [WSA881X_SPKR_DRV_GAIN] = 1, - [WSA881X_SPKR_DAC_CTL] = 1, - [WSA881X_SPKR_DRV_DBG] = 1, - [WSA881X_SPKR_PWRSTG_DBG] = 1, - [WSA881X_SPKR_OCP_CTL] = 1, - [WSA881X_SPKR_CLIP_CTL] = 1, - [WSA881X_SPKR_BBM_CTL] = 1, - [WSA881X_SPKR_MISC_CTL1] = 1, - [WSA881X_SPKR_MISC_CTL2] = 1, - [WSA881X_SPKR_BIAS_INT] = 1, - [WSA881X_SPKR_PA_INT] = 1, - [WSA881X_SPKR_BIAS_CAL] = 1, - [WSA881X_SPKR_BIAS_PSRR] = 1, - [WSA881X_SPKR_STATUS1] = 1, - [WSA881X_SPKR_STATUS2] = 1, - [WSA881X_BOOST_EN_CTL] = 1, - [WSA881X_BOOST_CURRENT_LIMIT] = 1, - [WSA881X_BOOST_PS_CTL] = 1, - [WSA881X_BOOST_PRESET_OUT1] = 1, - [WSA881X_BOOST_PRESET_OUT2] = 1, - [WSA881X_BOOST_FORCE_OUT] = 1, - [WSA881X_BOOST_LDO_PROG] = 1, - [WSA881X_BOOST_SLOPE_COMP_ISENSE_FB] = 1, - [WSA881X_BOOST_RON_CTL] = 1, - [WSA881X_BOOST_LOOP_STABILITY] = 1, - [WSA881X_BOOST_ZX_CTL] = 1, - [WSA881X_BOOST_START_CTL] = 1, - [WSA881X_BOOST_MISC1_CTL] = 1, - [WSA881X_BOOST_MISC2_CTL] = 1, - [WSA881X_BOOST_MISC3_CTL] = 1, - [WSA881X_BOOST_ATEST_CTL] = 1, - [WSA881X_SPKR_PROT_FE_GAIN] = 1, - [WSA881X_SPKR_PROT_FE_CM_LDO_SET] = 1, - [WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1] = 1, - [WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2] = 1, - [WSA881X_SPKR_PROT_ATEST1] = 1, - [WSA881X_SPKR_PROT_ATEST2] = 1, - [WSA881X_SPKR_PROT_FE_VSENSE_VCM] = 1, - [WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1] = 1, - [WSA881X_BONGO_RESRV_REG1] = 1, - [WSA881X_BONGO_RESRV_REG2] = 1, - [WSA881X_SPKR_PROT_SAR] = 1, - [WSA881X_SPKR_STATUS3] = 1, -}; diff --git a/techpack/audio/asoc/codecs/wsa881x-tables.c b/techpack/audio/asoc/codecs/wsa881x-tables.c deleted file mode 100644 index 4f1212be9c5b..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-tables.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2015, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "wsa881x-registers.h" - -const u8 wsa881x_reg_readable[WSA881X_CACHE_SIZE] = { - [WSA881X_CHIP_ID0] = 1, - [WSA881X_CHIP_ID1] = 1, - [WSA881X_CHIP_ID2] = 1, - [WSA881X_CHIP_ID3] = 1, - [WSA881X_BUS_ID] = 1, - [WSA881X_CDC_RST_CTL] = 1, - [WSA881X_CDC_TOP_CLK_CTL] = 1, - [WSA881X_CDC_ANA_CLK_CTL] = 1, - [WSA881X_CDC_DIG_CLK_CTL] = 1, - [WSA881X_CLOCK_CONFIG] = 1, - [WSA881X_ANA_CTL] = 1, - [WSA881X_SWR_RESET_EN] = 1, - [WSA881X_RESET_CTL] = 1, - [WSA881X_TADC_VALUE_CTL] = 1, - [WSA881X_TEMP_DETECT_CTL] = 1, - [WSA881X_TEMP_MSB] = 1, - [WSA881X_TEMP_LSB] = 1, - [WSA881X_TEMP_CONFIG0] = 1, - [WSA881X_TEMP_CONFIG1] = 1, - [WSA881X_CDC_CLIP_CTL] = 1, - [WSA881X_SDM_PDM9_LSB] = 1, - [WSA881X_SDM_PDM9_MSB] = 1, - [WSA881X_CDC_RX_CTL] = 1, - [WSA881X_DEM_BYPASS_DATA0] = 1, - [WSA881X_DEM_BYPASS_DATA1] = 1, - [WSA881X_DEM_BYPASS_DATA2] = 1, - [WSA881X_DEM_BYPASS_DATA3] = 1, - [WSA881X_OTP_CTRL0] = 1, - [WSA881X_OTP_CTRL1] = 1, - [WSA881X_HDRIVE_CTL_GROUP1] = 1, - [WSA881X_INTR_MODE] = 1, - [WSA881X_INTR_MASK] = 1, - [WSA881X_INTR_STATUS] = 1, - [WSA881X_INTR_CLEAR] = 1, - [WSA881X_INTR_LEVEL] = 1, - [WSA881X_INTR_SET] = 1, - [WSA881X_INTR_TEST] = 1, - [WSA881X_PDM_TEST_MODE] = 1, - [WSA881X_ATE_TEST_MODE] = 1, - [WSA881X_PIN_CTL_MODE] = 1, - [WSA881X_PIN_CTL_OE] = 1, - [WSA881X_PIN_WDATA_IOPAD] = 1, - [WSA881X_PIN_STATUS] = 1, - [WSA881X_DIG_DEBUG_MODE] = 1, - [WSA881X_DIG_DEBUG_SEL] = 1, - [WSA881X_DIG_DEBUG_EN] = 1, - [WSA881X_SWR_HM_TEST1] = 1, - [WSA881X_SWR_HM_TEST2] = 1, - [WSA881X_TEMP_DETECT_DBG_CTL] = 1, - [WSA881X_TEMP_DEBUG_MSB] = 1, - [WSA881X_TEMP_DEBUG_LSB] = 1, - [WSA881X_SAMPLE_EDGE_SEL] = 1, - [WSA881X_IOPAD_CTL] = 1, - [WSA881X_SPARE_0] = 1, - [WSA881X_SPARE_1] = 1, - [WSA881X_SPARE_2] = 1, - [WSA881X_OTP_REG_0] = 1, - [WSA881X_OTP_REG_1] = 1, - [WSA881X_OTP_REG_2] = 1, - [WSA881X_OTP_REG_3] = 1, - [WSA881X_OTP_REG_4] = 1, - [WSA881X_OTP_REG_5] = 1, - [WSA881X_OTP_REG_6] = 1, - [WSA881X_OTP_REG_7] = 1, - [WSA881X_OTP_REG_8] = 1, - [WSA881X_OTP_REG_9] = 1, - [WSA881X_OTP_REG_10] = 1, - [WSA881X_OTP_REG_11] = 1, - [WSA881X_OTP_REG_12] = 1, - [WSA881X_OTP_REG_13] = 1, - [WSA881X_OTP_REG_14] = 1, - [WSA881X_OTP_REG_15] = 1, - [WSA881X_OTP_REG_16] = 1, - [WSA881X_OTP_REG_17] = 1, - [WSA881X_OTP_REG_18] = 1, - [WSA881X_OTP_REG_19] = 1, - [WSA881X_OTP_REG_20] = 1, - [WSA881X_OTP_REG_21] = 1, - [WSA881X_OTP_REG_22] = 1, - [WSA881X_OTP_REG_23] = 1, - [WSA881X_OTP_REG_24] = 1, - [WSA881X_OTP_REG_25] = 1, - [WSA881X_OTP_REG_26] = 1, - [WSA881X_OTP_REG_27] = 1, - [WSA881X_OTP_REG_28] = 1, - [WSA881X_OTP_REG_29] = 1, - [WSA881X_OTP_REG_30] = 1, - [WSA881X_OTP_REG_31] = 1, - [WSA881X_OTP_REG_63] = 1, - /* Analog Registers */ - [WSA881X_BIAS_REF_CTRL] = 1, - [WSA881X_BIAS_TEST] = 1, - [WSA881X_BIAS_BIAS] = 1, - [WSA881X_TEMP_OP] = 1, - [WSA881X_TEMP_IREF_CTRL] = 1, - [WSA881X_TEMP_ISENS_CTRL] = 1, - [WSA881X_TEMP_CLK_CTRL] = 1, - [WSA881X_TEMP_TEST] = 1, - [WSA881X_TEMP_BIAS] = 1, - [WSA881X_TEMP_ADC_CTRL] = 1, - [WSA881X_TEMP_DOUT_MSB] = 1, - [WSA881X_TEMP_DOUT_LSB] = 1, - [WSA881X_ADC_EN_MODU_V] = 1, - [WSA881X_ADC_EN_MODU_I] = 1, - [WSA881X_ADC_EN_DET_TEST_V] = 1, - [WSA881X_ADC_EN_DET_TEST_I] = 1, - [WSA881X_ADC_SEL_IBIAS] = 1, - [WSA881X_ADC_EN_SEL_IBAIS] = 1, - [WSA881X_SPKR_DRV_EN] = 1, - [WSA881X_SPKR_DRV_GAIN] = 1, - [WSA881X_SPKR_DAC_CTL] = 1, - [WSA881X_SPKR_DRV_DBG] = 1, - [WSA881X_SPKR_PWRSTG_DBG] = 1, - [WSA881X_SPKR_OCP_CTL] = 1, - [WSA881X_SPKR_CLIP_CTL] = 1, - [WSA881X_SPKR_BBM_CTL] = 1, - [WSA881X_SPKR_MISC_CTL1] = 1, - [WSA881X_SPKR_MISC_CTL2] = 1, - [WSA881X_SPKR_BIAS_INT] = 1, - [WSA881X_SPKR_PA_INT] = 1, - [WSA881X_SPKR_BIAS_CAL] = 1, - [WSA881X_SPKR_BIAS_PSRR] = 1, - [WSA881X_SPKR_STATUS1] = 1, - [WSA881X_SPKR_STATUS2] = 1, - [WSA881X_BOOST_EN_CTL] = 1, - [WSA881X_BOOST_CURRENT_LIMIT] = 1, - [WSA881X_BOOST_PS_CTL] = 1, - [WSA881X_BOOST_PRESET_OUT1] = 1, - [WSA881X_BOOST_PRESET_OUT2] = 1, - [WSA881X_BOOST_FORCE_OUT] = 1, - [WSA881X_BOOST_LDO_PROG] = 1, - [WSA881X_BOOST_SLOPE_COMP_ISENSE_FB] = 1, - [WSA881X_BOOST_RON_CTL] = 1, - [WSA881X_BOOST_LOOP_STABILITY] = 1, - [WSA881X_BOOST_ZX_CTL] = 1, - [WSA881X_BOOST_START_CTL] = 1, - [WSA881X_BOOST_MISC1_CTL] = 1, - [WSA881X_BOOST_MISC2_CTL] = 1, - [WSA881X_BOOST_MISC3_CTL] = 1, - [WSA881X_BOOST_ATEST_CTL] = 1, - [WSA881X_SPKR_PROT_FE_GAIN] = 1, - [WSA881X_SPKR_PROT_FE_CM_LDO_SET] = 1, - [WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET1] = 1, - [WSA881X_SPKR_PROT_FE_ISENSE_BIAS_SET2] = 1, - [WSA881X_SPKR_PROT_ATEST1] = 1, - [WSA881X_SPKR_PROT_ATEST2] = 1, - [WSA881X_SPKR_PROT_FE_VSENSE_VCM] = 1, - [WSA881X_SPKR_PROT_FE_VSENSE_BIAS_SET1] = 1, - [WSA881X_BONGO_RESRV_REG1] = 1, - [WSA881X_BONGO_RESRV_REG2] = 1, - [WSA881X_SPKR_PROT_SAR] = 1, - [WSA881X_SPKR_STATUS3] = 1, -}; diff --git a/techpack/audio/asoc/codecs/wsa881x-temp-sensor.c b/techpack/audio/asoc/codecs/wsa881x-temp-sensor.c deleted file mode 100644 index 2a1291f34f02..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-temp-sensor.c +++ /dev/null @@ -1,196 +0,0 @@ -/* Copyright (c) 2015, 2017-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "wsa881x-temp-sensor.h" - -#define T1_TEMP -10 -#define T2_TEMP 150 -#define LOW_TEMP_THRESHOLD 5 -#define HIGH_TEMP_THRESHOLD 45 -#define TEMP_INVALID 0xFFFF -#define WSA881X_TEMP_RETRY 3 -/* - * wsa881x_get_temp - get wsa temperature - * @thermal: thermal zone device - * @temp: temperature value - * - * Get the temperature of wsa881x. - * - * Return: 0 on success or negative error code on failure. - */ -int wsa881x_get_temp(struct thermal_zone_device *thermal, - int *temp) -{ - struct wsa881x_tz_priv *pdata; - struct snd_soc_codec *codec; - struct wsa_temp_register reg; - int dmeas, d1, d2; - int ret = 0; - int temp_val; - int t1 = T1_TEMP; - int t2 = T2_TEMP; - u8 retry = WSA881X_TEMP_RETRY; - - if (!thermal) - return -EINVAL; - - if (thermal->devdata) { - pdata = thermal->devdata; - if (pdata->codec) { - codec = pdata->codec; - } else { - pr_err("%s: codec is NULL\n", __func__); - return -EINVAL; - } - } else { - pr_err("%s: pdata is NULL\n", __func__); - return -EINVAL; - } - if (atomic_cmpxchg(&pdata->is_suspend_spk, 1, 0)) { - /* - * get_temp query happens as part of POST_PM_SUSPEND - * from thermal core. To avoid calls to slimbus - * as part of this thermal query, return default temp - * and reset the suspend flag. - */ - if (!pdata->t0_init) { - if (temp) - *temp = pdata->curr_temp; - return 0; - } - } - -temp_retry: - if (pdata->wsa_temp_reg_read) { - ret = pdata->wsa_temp_reg_read(codec, ®); - if (ret) { - pr_err("%s: temp read failed: %d, current temp: %d\n", - __func__, ret, pdata->curr_temp); - if (temp) - *temp = pdata->curr_temp; - return 0; - } - } else { - pr_err("%s: wsa_temp_reg_read is NULL\n", __func__); - return -EINVAL; - } - /* - * Temperature register values are expected to be in the - * following range. - * d1_msb = 68 - 92 and d1_lsb = 0, 64, 128, 192 - * d2_msb = 185 -218 and d2_lsb = 0, 64, 128, 192 - */ - if ((reg.d1_msb < 68 || reg.d1_msb > 92) || - (!(reg.d1_lsb == 0 || reg.d1_lsb == 64 || reg.d1_lsb == 128 || - reg.d1_lsb == 192)) || - (reg.d2_msb < 185 || reg.d2_msb > 218) || - (!(reg.d2_lsb == 0 || reg.d2_lsb == 64 || reg.d2_lsb == 128 || - reg.d2_lsb == 192))) { - printk_ratelimited("%s: Temperature registers[%d %d %d %d] are out of range\n", - __func__, reg.d1_msb, reg.d1_lsb, reg.d2_msb, - reg.d2_lsb); - } - dmeas = ((reg.dmeas_msb << 0x8) | reg.dmeas_lsb) >> 0x6; - d1 = ((reg.d1_msb << 0x8) | reg.d1_lsb) >> 0x6; - d2 = ((reg.d2_msb << 0x8) | reg.d2_lsb) >> 0x6; - - if (d1 == d2) - temp_val = TEMP_INVALID; - else - temp_val = t1 + (((dmeas - d1) * (t2 - t1))/(d2 - d1)); - - if (temp_val <= LOW_TEMP_THRESHOLD || - temp_val >= HIGH_TEMP_THRESHOLD) { - printk_ratelimited("%s: T0: %d is out of range[%d, %d]\n", - __func__, temp_val, LOW_TEMP_THRESHOLD, - HIGH_TEMP_THRESHOLD); - if (retry--) { - msleep(20); - goto temp_retry; - } - } - pdata->curr_temp = temp_val; - - if (temp) - *temp = temp_val; - pr_debug("%s: t0 measured: %d dmeas = %d, d1 = %d, d2 = %d\n", - __func__, temp_val, dmeas, d1, d2); - return ret; -} -EXPORT_SYMBOL(wsa881x_get_temp); - -static struct thermal_zone_device_ops wsa881x_thermal_ops = { - .get_temp = wsa881x_get_temp, -}; - - -static int wsa881x_pm_notify(struct notifier_block *nb, - unsigned long mode, void *_unused) -{ - struct wsa881x_tz_priv *pdata = - container_of(nb, struct wsa881x_tz_priv, pm_nb); - - switch (mode) { - case PM_SUSPEND_PREPARE: - atomic_set(&pdata->is_suspend_spk, 1); - break; - default: - break; - } - return 0; -} - -int wsa881x_init_thermal(struct wsa881x_tz_priv *tz_pdata) -{ - struct thermal_zone_device *tz_dev; - - if (tz_pdata == NULL) { - pr_err("%s: thermal pdata is NULL\n", __func__); - return -EINVAL; - } - /* Register with the thermal zone */ - tz_dev = thermal_zone_device_register(tz_pdata->name, - 0, 0, tz_pdata, - &wsa881x_thermal_ops, NULL, 0, 0); - if (IS_ERR(tz_dev)) { - pr_err("%s: thermal device register failed.\n", __func__); - return -EINVAL; - } - tz_pdata->tz_dev = tz_dev; - tz_pdata->pm_nb.notifier_call = wsa881x_pm_notify; - register_pm_notifier(&tz_pdata->pm_nb); - atomic_set(&tz_pdata->is_suspend_spk, 0); - - return 0; -} -EXPORT_SYMBOL(wsa881x_init_thermal); - -void wsa881x_deinit_thermal(struct thermal_zone_device *tz_dev) -{ - struct wsa881x_tz_priv *pdata; - - if (tz_dev && tz_dev->devdata) { - pdata = tz_dev->devdata; - if (pdata) - unregister_pm_notifier(&pdata->pm_nb); - } - if (tz_dev) - thermal_zone_device_unregister(tz_dev); -} -EXPORT_SYMBOL(wsa881x_deinit_thermal); diff --git a/techpack/audio/asoc/codecs/wsa881x-temp-sensor.h b/techpack/audio/asoc/codecs/wsa881x-temp-sensor.h deleted file mode 100644 index 26828b716d07..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x-temp-sensor.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2015, 2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef WSA881X_TEMP_SENSOR_H -#define WSA881X_TEMP_SENSOR_H - -#include -#include - -struct wsa_temp_register { - u8 d1_msb; - u8 d1_lsb; - u8 d2_msb; - u8 d2_lsb; - u8 dmeas_msb; - u8 dmeas_lsb; -}; -typedef int32_t (*wsa_temp_register_read)(struct snd_soc_codec *codec, - struct wsa_temp_register *wsa_temp_reg); -struct wsa881x_tz_priv { - struct thermal_zone_device *tz_dev; - struct snd_soc_codec *codec; - struct wsa_temp_register *wsa_temp_reg; - char name[80]; - wsa_temp_register_read wsa_temp_reg_read; - struct notifier_block pm_nb; - atomic_t is_suspend_spk; - int t0_init; - int curr_temp; -}; - -int wsa881x_get_temp(struct thermal_zone_device *tz_dev, int *temp); -int wsa881x_init_thermal(struct wsa881x_tz_priv *tz_pdata); -void wsa881x_deinit_thermal(struct thermal_zone_device *tz_dev); -#endif diff --git a/techpack/audio/asoc/codecs/wsa881x.c b/techpack/audio/asoc/codecs/wsa881x.c deleted file mode 100644 index 74378644d123..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x.c +++ /dev/null @@ -1,1649 +0,0 @@ -/* - * Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-cdc-pinctrl.h" -#include "wsa881x.h" -#include "wsa881x-temp-sensor.h" - -#define WSA881X_NUM_RETRY 5 - -enum { - G_18DB = 0, - G_16P5DB, - G_15DB, - G_13P5DB, - G_12DB, - G_10P5DB, - G_9DB, - G_7P5DB, - G_6DB, - G_4P5DB, - G_3DB, - G_1P5DB, - G_0DB, -}; - -enum { - DISABLE = 0, - ENABLE, -}; - -enum { - SWR_DAC_PORT, - SWR_COMP_PORT, - SWR_BOOST_PORT, - SWR_VISENSE_PORT, -}; - -struct swr_port { - u8 port_id; - u8 ch_mask; - u32 ch_rate; - u8 num_ch; - u8 port_type; -}; - -enum { - WSA881X_DEV_DOWN, - WSA881X_DEV_UP, - WSA881X_DEV_READY, -}; - -/* - * Private data Structure for wsa881x. All parameters related to - * WSA881X codec needs to be defined here. - */ -struct wsa881x_priv { - struct regmap *regmap; - struct device *dev; - struct swr_device *swr_slave; - struct snd_soc_codec *codec; - bool comp_enable; - bool boost_enable; - bool visense_enable; - u8 pa_gain; - struct swr_port port[WSA881X_MAX_SWR_PORTS]; - int pd_gpio; - struct wsa881x_tz_priv tz_pdata; - int bg_cnt; - int clk_cnt; - int version; - struct mutex bg_lock; - struct mutex res_lock; - struct mutex temp_lock; - struct snd_info_entry *entry; - struct snd_info_entry *version_entry; - int state; - struct delayed_work ocp_ctl_work; - struct device_node *wsa_rst_np; - int pa_mute; - struct device_node *bolero_np; - struct platform_device* bolero_dev; - struct notifier_block bolero_nblock; - void *handle; - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -/* from bolero to WSA events */ -enum { - BOLERO_WSA_EVT_TX_CH_HOLD_CLEAR = 1, - BOLERO_WSA_EVT_PA_OFF_PRE_SSR, - BOLERO_WSA_EVT_SSR_DOWN, - BOLERO_WSA_EVT_SSR_UP, - BOLERO_WSA_EVT_PA_ON_POST_FSCLK, -}; - -struct wsa_ctrl_platform_data { - void *handle; - int (*update_wsa_event)(void *handle, u16 event, u32 data); - int (*register_notifier)(void *handle, - struct notifier_block *nblock, - bool enable); -}; - -#define SWR_SLV_MAX_REG_ADDR 0x390 -#define SWR_SLV_START_REG_ADDR 0x40 -#define SWR_SLV_MAX_BUF_LEN 25 -#define BYTES_PER_LINE 12 -#define SWR_SLV_RD_BUF_LEN 8 -#define SWR_SLV_WR_BUF_LEN 32 -#define SWR_SLV_MAX_DEVICES 2 - -#define WSA881X_VERSION_ENTRY_SIZE 27 -#define WSA881X_OCP_CTL_TIMER_SEC 2 -#define WSA881X_OCP_CTL_TEMP_CELSIUS 25 -#define WSA881X_OCP_CTL_POLL_TIMER_SEC 60 - -static int wsa881x_ocp_poll_timer_sec = WSA881X_OCP_CTL_POLL_TIMER_SEC; -module_param(wsa881x_ocp_poll_timer_sec, int, 0664); -MODULE_PARM_DESC(wsa881x_ocp_poll_timer_sec, "timer for ocp ctl polling"); - -static struct wsa881x_priv *dbgwsa881x; -static struct dentry *debugfs_wsa881x_dent; -static struct dentry *debugfs_peek; -static struct dentry *debugfs_poke; -static struct dentry *debugfs_reg_dump; -static unsigned int read_data; -static unsigned int devnum; - -static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec, - bool enable); - -static const char * const wsa_pa_gain_text[] = { - "G_18_DB", "G_16P5_DB", "G_15_DB", "G_13P5_DB", "G_12_DB", "G_10P5_DB", - "G_9_DB", "G_7P5_DB", "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", - "G_0_DB" -}; - -static const struct soc_enum wsa_pa_gain_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wsa_pa_gain_text), wsa_pa_gain_text); - -static int wsa_pa_gain_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->pa_gain; - - dev_dbg(codec->dev, "%s: PA gain = 0x%x\n", __func__, wsa881x->pa_gain); - - return 0; -} - -static int wsa_pa_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - wsa881x->pa_gain = ucontrol->value.integer.value[0]; - - return 0; -} - -static int wsa881x_get_mute(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->pa_mute; - - return 0; -} - -static int wsa881x_set_mute(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: mute current %d, new %d\n", - __func__, wsa881x->pa_mute, value); - - if (value) - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x80, 0x00); - wsa881x->pa_mute = value; - - return 0; -} - -static int wsa881x_get_t0_init(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; - - ucontrol->value.integer.value[0] = pdata->t0_init; - dev_dbg(codec->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); - - return 0; -} - -static int wsa881x_set_t0_init(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; - - pdata->t0_init = ucontrol->value.integer.value[0]; - dev_dbg(codec->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); - - return 0; -} - -static const struct snd_kcontrol_new wsa_snd_controls[] = { - SOC_ENUM_EXT("WSA PA Gain", wsa_pa_gain_enum, - wsa_pa_gain_get, wsa_pa_gain_put), - SOC_SINGLE_EXT("WSA PA Mute", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_mute, wsa881x_set_mute), - SOC_SINGLE_EXT("WSA T0 Init", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_t0_init, wsa881x_set_t0_init), -}; - -static int codec_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t wsa881x_codec_version_read(struct snd_info_entry *entry, - void *file_private_data, struct file *file, - char __user *buf, size_t count, loff_t pos) -{ - struct wsa881x_priv *wsa881x; - char buffer[WSA881X_VERSION_ENTRY_SIZE]; - int len; - - wsa881x = (struct wsa881x_priv *) entry->private_data; - if (!wsa881x) { - pr_err("%s: wsa881x priv is null\n", __func__); - return -EINVAL; - } - - len = snprintf(buffer, sizeof(buffer), "WSA881X-SOUNDWIRE_2_0\n"); - - return simple_read_from_buffer(buf, count, &pos, buffer, len); -} - -static struct snd_info_entry_ops wsa881x_codec_info_ops = { - .read = wsa881x_codec_version_read, -}; - -/* - * wsa881x_codec_info_create_codec_entry - creates wsa881x module - * @codec_root: The parent directory - * @codec: Codec instance - * - * Creates wsa881x module and version entry under the given - * parent directory. - * - * Return: 0 on success or negative error code on failure. - */ -int wsa881x_codec_info_create_codec_entry(struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - struct snd_info_entry *version_entry; - struct wsa881x_priv *wsa881x; - struct snd_soc_card *card; - char name[80]; - - if (!codec_root || !codec) - return -EINVAL; - - wsa881x = snd_soc_codec_get_drvdata(codec); - card = codec->component.card; - snprintf(name, sizeof(name), "%s.%x", "wsa881x", - (u32)wsa881x->swr_slave->addr); - - wsa881x->entry = snd_info_create_subdir(codec_root->module, - (const char *)name, - codec_root); - if (!wsa881x->entry) { - dev_dbg(codec->dev, "%s: failed to create wsa881x entry\n", - __func__); - return -ENOMEM; - } - - version_entry = snd_info_create_card_entry(card->snd_card, - "version", - wsa881x->entry); - if (!version_entry) { - dev_dbg(codec->dev, "%s: failed to create wsa881x version entry\n", - __func__); - return -ENOMEM; - } - - version_entry->private_data = wsa881x; - version_entry->size = WSA881X_VERSION_ENTRY_SIZE; - version_entry->content = SNDRV_INFO_CONTENT_DATA; - version_entry->c.ops = &wsa881x_codec_info_ops; - - if (snd_info_register(version_entry) < 0) { - snd_info_free_entry(version_entry); - return -ENOMEM; - } - wsa881x->version_entry = version_entry; - - return 0; -} -EXPORT_SYMBOL(wsa881x_codec_info_create_codec_entry); - -static bool is_swr_slv_reg_readable(int reg) -{ - bool ret = true; - - if (((reg > 0x46) && (reg < 0x4A)) || - ((reg > 0x4A) && (reg < 0x50)) || - ((reg > 0x55) && (reg < 0xE0)) || - ((reg > 0xE0) && (reg < 0xF0)) || - ((reg > 0xF0) && (reg < 0x100)) || - ((reg > 0x105) && (reg < 0x120)) || - ((reg > 0x128) && (reg < 0x130)) || - ((reg > 0x138) && (reg < 0x200)) || - ((reg > 0x205) && (reg < 0x220)) || - ((reg > 0x228) && (reg < 0x230)) || - ((reg > 0x238) && (reg < 0x300)) || - ((reg > 0x305) && (reg < 0x320)) || - ((reg > 0x328) && (reg < 0x330)) || - ((reg > 0x338) && (reg < 0x400)) || - ((reg > 0x405) && (reg < 0x420))) - ret = false; - - return ret; -} - -static ssize_t wsa881x_swrslave_reg_show(char __user *ubuf, size_t count, - loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[SWR_SLV_MAX_BUF_LEN]; - - if (!ubuf || !ppos || (devnum == 0)) - return 0; - - for (i = (((int) *ppos / BYTES_PER_LINE) + SWR_SLV_START_REG_ADDR); - i <= SWR_SLV_MAX_REG_ADDR; i++) { - if (!is_swr_slv_reg_readable(i)) - continue; - swr_read(dbgwsa881x->swr_slave, devnum, - i, ®_val, 1); - len = snprintf(tmp_buf, sizeof(tmp_buf), "0x%.3x: 0x%.2x\n", i, - (reg_val & 0xFF)); - if (len < 0) { - pr_err("%s: fail to fill the buffer\n", __func__); - total = -EFAULT; - goto copy_err; - } - - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t codec_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_SLV_RD_BUF_LEN]; - char *access_str; - ssize_t ret_cnt; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - access_str = file->private_data; - if (*ppos < 0) - return -EINVAL; - - if (!strcmp(access_str, "swrslave_peek")) { - snprintf(lbuf, sizeof(lbuf), "0x%x\n", (read_data & 0xFF)); - ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); - } else if (!strcmp(access_str, "swrslave_reg_dump")) { - ret_cnt = wsa881x_swrslave_reg_show(ubuf, count, ppos); - } else { - pr_err("%s: %s not permitted to read\n", __func__, access_str); - ret_cnt = -EPERM; - } - return ret_cnt; -} - -static ssize_t codec_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char lbuf[SWR_SLV_WR_BUF_LEN]; - int rc; - u32 param[5]; - char *access_str; - - if (!filp || !ppos || !ubuf) - return -EINVAL; - - access_str = filp->private_data; - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - if (!strcmp(access_str, "swrslave_poke")) { - /* write */ - rc = get_parameters(lbuf, param, 3); - if ((param[0] <= SWR_SLV_MAX_REG_ADDR) && (param[1] <= 0xFF) && - (rc == 0)) - swr_write(dbgwsa881x->swr_slave, param[2], - param[0], ¶m[1]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "swrslave_peek")) { - /* read */ - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= SWR_SLV_MAX_REG_ADDR) && (rc == 0)) - swr_read(dbgwsa881x->swr_slave, param[1], - param[0], &read_data, 1); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "swrslave_reg_dump")) { - /* reg dump */ - rc = get_parameters(lbuf, param, 1); - if ((rc == 0) && (param[0] > 0) && - (param[0] <= SWR_SLV_MAX_DEVICES)) - devnum = param[0]; - else - rc = -EINVAL; - } - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations codec_debug_ops = { - .open = codec_debug_open, - .write = codec_debug_write, - .read = codec_debug_read, -}; - -static void wsa881x_regcache_sync(struct wsa881x_priv *wsa881x) -{ - mutex_lock(&wsa881x->res_lock); - if (wsa881x->state != WSA881X_DEV_READY) { - regcache_mark_dirty(wsa881x->regmap); - regcache_sync(wsa881x->regmap); - wsa881x->state = WSA881X_DEV_READY; - } - mutex_unlock(&wsa881x->res_lock); -} - -static const struct reg_sequence wsa881x_pre_pmu_pa[] = { - {WSA881X_SPKR_DRV_GAIN, 0x41, 0}, - {WSA881X_SPKR_MISC_CTL1, 0x01, 0}, - {WSA881X_ADC_EN_DET_TEST_I, 0x01, 0}, - {WSA881X_ADC_EN_MODU_V, 0x02, 0}, - {WSA881X_ADC_EN_DET_TEST_V, 0x10, 0}, - {WSA881X_SPKR_PWRSTG_DBG, 0xA0, 0}, -}; - -static const struct reg_sequence wsa881x_pre_pmu_pa_2_0[] = { - {WSA881X_SPKR_DRV_GAIN, 0x41, 0}, - {WSA881X_SPKR_MISC_CTL1, 0x87, 0}, -}; - -static const struct reg_sequence wsa881x_post_pmu_pa[] = { - {WSA881X_SPKR_PWRSTG_DBG, 0x00, 0}, - {WSA881X_ADC_EN_DET_TEST_V, 0x00, 0}, - {WSA881X_ADC_EN_MODU_V, 0x00, 0}, - {WSA881X_ADC_EN_DET_TEST_I, 0x00, 0}, -}; - -static const struct reg_sequence wsa881x_vi_txfe_en[] = { - {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x85, 0}, - {WSA881X_SPKR_PROT_ATEST2, 0x0A, 0}, - {WSA881X_SPKR_PROT_FE_GAIN, 0xCF, 0}, -}; - -static const struct reg_sequence wsa881x_vi_txfe_en_2_0[] = { - {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x85, 0}, - {WSA881X_SPKR_PROT_ATEST2, 0x0A, 0}, - {WSA881X_SPKR_PROT_FE_GAIN, 0x47, 0}, -}; - -static int wsa881x_boost_ctrl(struct snd_soc_codec *codec, bool enable) -{ - dev_dbg(codec->dev, "%s: enable:%d\n", __func__, enable); - if (enable) - snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x80); - else - snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x00); - /* - * 1.5ms sleep is needed after boost enable/disable as per - * HW requirement - */ - usleep_range(1500, 1510); - return 0; -} - -static int wsa881x_visense_txfe_ctrl(struct snd_soc_codec *codec, bool enable, - u8 isense1_gain, u8 isense2_gain, - u8 vsense_gain) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, - "%s: enable:%d, isense1 gain: %d, isense2 gain: %d, vsense_gain %d\n", - __func__, enable, isense1_gain, isense2_gain, vsense_gain); - - if (enable) { - regmap_multi_reg_write(wsa881x->regmap, - wsa881x_vi_txfe_en_2_0, - ARRAY_SIZE(wsa881x_vi_txfe_en_2_0)); - } else { - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_VSENSE_VCM, - 0x08, 0x08); - /* - * 200us sleep is needed after visense txfe disable as per - * HW requirement. - */ - usleep_range(200, 210); - snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN, - 0x01, 0x00); - } - return 0; -} - -static int wsa881x_visense_adc_ctrl(struct snd_soc_codec *codec, bool enable) -{ - - dev_dbg(codec->dev, "%s: enable:%d\n", __func__, enable); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, (0x01 << 7), - (enable << 7)); - snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_I, (0x01 << 7), - (enable << 7)); - return 0; -} - -static void wsa881x_bandgap_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: enable:%d, bg_count:%d\n", __func__, - enable, wsa881x->bg_cnt); - mutex_lock(&wsa881x->bg_lock); - if (enable) { - ++wsa881x->bg_cnt; - if (wsa881x->bg_cnt == 1) { - snd_soc_update_bits(codec, WSA881X_TEMP_OP, - 0x08, 0x08); - /* 400usec sleep is needed as per HW requirement */ - usleep_range(400, 410); - snd_soc_update_bits(codec, WSA881X_TEMP_OP, - 0x04, 0x04); - } - } else { - --wsa881x->bg_cnt; - if (wsa881x->bg_cnt <= 0) { - WARN_ON(wsa881x->bg_cnt < 0); - wsa881x->bg_cnt = 0; - snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x04, 0x00); - snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x08, 0x00); - } - } - mutex_unlock(&wsa881x->bg_lock); -} - -static void wsa881x_clk_ctrl(struct snd_soc_codec *codec, bool enable) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: enable:%d, clk_count:%d\n", __func__, - enable, wsa881x->clk_cnt); - mutex_lock(&wsa881x->res_lock); - if (enable) { - ++wsa881x->clk_cnt; - if (wsa881x->clk_cnt == 1) { - snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x01); - snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x01); - } - } else { - --wsa881x->clk_cnt; - if (wsa881x->clk_cnt <= 0) { - WARN_ON(wsa881x->clk_cnt < 0); - wsa881x->clk_cnt = 0; - snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x00); - snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x00); - } - } - mutex_unlock(&wsa881x->res_lock); -} - -static int wsa881x_get_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->comp_enable; - return 0; -} - -static int wsa881x_set_compander(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Compander enable current %d, new %d\n", - __func__, wsa881x->comp_enable, value); - wsa881x->comp_enable = value; - return 0; -} - -static int wsa881x_get_boost(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->boost_enable; - return 0; -} - -static int wsa881x_set_boost(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: Boost enable current %d, new %d\n", - __func__, wsa881x->boost_enable, value); - wsa881x->boost_enable = value; - return 0; -} - -static int wsa881x_get_visense(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - ucontrol->value.integer.value[0] = wsa881x->visense_enable; - return 0; -} - -static int wsa881x_set_visense(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int value = ucontrol->value.integer.value[0]; - - dev_dbg(codec->dev, "%s: VIsense enable current %d, new %d\n", - __func__, wsa881x->visense_enable, value); - wsa881x->visense_enable = value; - return 0; -} - -static int wsa881x_set_boost_level(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u8 wsa_boost_level = 0; - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - wsa_boost_level = ucontrol->value.integer.value[0]; - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1, - 0xff, wsa_boost_level); - - return 0; -} - -static int wsa881x_get_boost_level(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - u8 wsa_boost_level = 0; - - wsa_boost_level = snd_soc_read(codec, WSA881X_BOOST_PRESET_OUT1); - ucontrol->value.integer.value[0] = wsa_boost_level; - dev_dbg(codec->dev, "%s: boost level = 0x%x\n", __func__, - wsa_boost_level); - - return 0; -} - -static const struct snd_kcontrol_new wsa881x_snd_controls[] = { - SOC_SINGLE_EXT("COMP Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_compander, wsa881x_set_compander), - - SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_boost, wsa881x_set_boost), - - SOC_SINGLE_EXT("VISENSE Switch", SND_SOC_NOPM, 0, 1, 0, - wsa881x_get_visense, wsa881x_set_visense), - - SOC_SINGLE_EXT("Boost Level", SND_SOC_NOPM, 0, 0xff, 0, - wsa881x_get_boost_level, wsa881x_set_boost_level), -}; - -static const struct snd_kcontrol_new swr_dac_port[] = { - SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) -}; - -static int wsa881x_set_port(struct snd_soc_codec *codec, int port_idx, - u8 *port_id, u8 *num_ch, u8 *ch_mask, u32 *ch_rate, - u8 *port_type) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - *port_id = wsa881x->port[port_idx].port_id; - *num_ch = wsa881x->port[port_idx].num_ch; - *ch_mask = wsa881x->port[port_idx].ch_mask; - *ch_rate = wsa881x->port[port_idx].ch_rate; - *port_type = wsa881x->port[port_idx].port_type; - return 0; -} - -static int wsa881x_enable_swr_dac_port(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - u8 port_id[WSA881X_MAX_SWR_PORTS]; - u8 num_ch[WSA881X_MAX_SWR_PORTS]; - u8 ch_mask[WSA881X_MAX_SWR_PORTS]; - u32 ch_rate[WSA881X_MAX_SWR_PORTS]; - u8 port_type[WSA881X_MAX_SWR_PORTS]; - u8 num_port = 0; - - dev_dbg(codec->dev, "%s: event %d name %s\n", __func__, - event, w->name); - if (wsa881x == NULL) - return -EINVAL; - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - wsa881x_set_port(codec, SWR_DAC_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - - if (wsa881x->comp_enable) { - wsa881x_set_port(codec, SWR_COMP_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->boost_enable) { - wsa881x_set_port(codec, SWR_BOOST_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->visense_enable) { - wsa881x_set_port(codec, SWR_VISENSE_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - swr_connect_port(wsa881x->swr_slave, &port_id[0], num_port, - &ch_mask[0], &ch_rate[0], &num_ch[0], - &port_type[0]); - break; - case SND_SOC_DAPM_POST_PMU: - break; - case SND_SOC_DAPM_PRE_PMD: - break; - case SND_SOC_DAPM_POST_PMD: - wsa881x_set_port(codec, SWR_DAC_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - - if (wsa881x->comp_enable) { - wsa881x_set_port(codec, SWR_COMP_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->boost_enable) { - wsa881x_set_port(codec, SWR_BOOST_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - if (wsa881x->visense_enable) { - wsa881x_set_port(codec, SWR_VISENSE_PORT, - &port_id[num_port], &num_ch[num_port], - &ch_mask[num_port], &ch_rate[num_port], - &port_type[num_port]); - ++num_port; - } - swr_disconnect_port(wsa881x->swr_slave, &port_id[0], num_port, - &ch_mask[0], &port_type[0]); - break; - default: - break; - } - return 0; -} - -static int wsa881x_rdac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "%s: %s %d boost %d visense %d\n", __func__, - w->name, event, wsa881x->boost_enable, - wsa881x->visense_enable); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - mutex_lock(&wsa881x->temp_lock); - wsa881x_resource_acquire(codec, ENABLE); - mutex_unlock(&wsa881x->temp_lock); - wsa881x_boost_ctrl(codec, ENABLE); - break; - case SND_SOC_DAPM_POST_PMD: - swr_slvdev_datapath_control(wsa881x->swr_slave, - wsa881x->swr_slave->dev_num, - false); - wsa881x_boost_ctrl(codec, DISABLE); - mutex_lock(&wsa881x->temp_lock); - wsa881x_resource_acquire(codec, DISABLE); - mutex_unlock(&wsa881x->temp_lock); - break; - } - return 0; -} - -static int wsa881x_ramp_pa_gain(struct snd_soc_codec *codec, - int min_gain, int max_gain, int udelay) -{ - int val; - - for (val = min_gain; max_gain <= val; val--) { - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, - 0xF0, val << 4); - /* - * 1ms delay is needed for every step change in gain as per - * HW requirement. - */ - usleep_range(udelay, udelay+10); - } - return 0; -} - -static void wsa881x_ocp_ctl_work(struct work_struct *work) -{ - struct wsa881x_priv *wsa881x; - struct delayed_work *dwork; - struct snd_soc_codec *codec; - int temp_val; - - dwork = to_delayed_work(work); - wsa881x = container_of(dwork, struct wsa881x_priv, ocp_ctl_work); - - codec = wsa881x->codec; - wsa881x_get_temp(wsa881x->tz_pdata.tz_dev, &temp_val); - dev_dbg(codec->dev, " temp = %d\n", temp_val); - - if (temp_val <= WSA881X_OCP_CTL_TEMP_CELSIUS) - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x00); - else - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0); - - schedule_delayed_work(&wsa881x->ocp_ctl_work, - msecs_to_jiffies(wsa881x_ocp_poll_timer_sec * 1000)); -} - -static int wsa881x_spkr_pa_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int min_gain, max_gain; - - dev_dbg(codec->dev, "%s: %s %d\n", __func__, w->name, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x80); - regmap_multi_reg_write(wsa881x->regmap, - wsa881x_pre_pmu_pa_2_0, - ARRAY_SIZE(wsa881x_pre_pmu_pa_2_0)); - swr_slvdev_datapath_control(wsa881x->swr_slave, - wsa881x->swr_slave->dev_num, - true); - /* Set register mode if compander is not enabled */ - if (!wsa881x->comp_enable) - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, - 0x08, 0x08); - else - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, - 0x08, 0x00); - - break; - case SND_SOC_DAPM_POST_PMU: - if (!wsa881x->bolero_dev) - snd_soc_update_bits(codec, - WSA881X_SPKR_DRV_EN, - 0x80, 0x80); - if (!wsa881x->comp_enable) { - max_gain = wsa881x->pa_gain; - /* - * Gain has to set incrementally in 4 steps - * as per HW sequence - */ - if (max_gain > G_4P5DB) - min_gain = G_0DB; - else - min_gain = max_gain + 3; - /* - * 1ms delay is needed before change in gain - * as per HW requirement. - */ - usleep_range(1000, 1010); - wsa881x_ramp_pa_gain(codec, min_gain, max_gain, 1000); - } - if (wsa881x->visense_enable) { - wsa881x_visense_txfe_ctrl(codec, ENABLE, - 0x00, 0x03, 0x01); - snd_soc_update_bits(codec, WSA881X_ADC_EN_SEL_IBAIS, - 0x07, 0x01); - wsa881x_visense_adc_ctrl(codec, ENABLE); - } - schedule_delayed_work(&wsa881x->ocp_ctl_work, - msecs_to_jiffies(WSA881X_OCP_CTL_TIMER_SEC * 1000)); - /* Force remove group */ - swr_remove_from_group(wsa881x->swr_slave, - wsa881x->swr_slave->dev_num); - break; - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x80, 0x00); - if (wsa881x->visense_enable) { - wsa881x_visense_adc_ctrl(codec, DISABLE); - wsa881x_visense_txfe_ctrl(codec, DISABLE, - 0x00, 0x01, 0x01); - } - cancel_delayed_work_sync(&wsa881x->ocp_ctl_work); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0); - break; - } - return 0; -} - -static const struct snd_soc_dapm_widget wsa881x_dapm_widgets[] = { - SND_SOC_DAPM_INPUT("IN"), - - SND_SOC_DAPM_MIXER_E("SWR DAC_Port", SND_SOC_NOPM, 0, 0, swr_dac_port, - ARRAY_SIZE(swr_dac_port), wsa881x_enable_swr_dac_port, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_DAC_E("RDAC", NULL, WSA881X_SPKR_DAC_CTL, 7, 0, - wsa881x_rdac_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_PGA_E("SPKR PGA", SND_SOC_NOPM, 0, 0, NULL, 0, - wsa881x_spkr_pa_event, SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_OUTPUT("SPKR"), -}; - -static const struct snd_soc_dapm_route wsa881x_audio_map[] = { - {"SWR DAC_Port", "Switch", "IN"}, - {"RDAC", NULL, "SWR DAC_Port"}, - {"SPKR PGA", NULL, "RDAC"}, - {"SPKR", NULL, "SPKR PGA"}, -}; - -int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, u8 num_port, - unsigned int *ch_mask, unsigned int *ch_rate, - u8 *port_type) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - int i; - - if (!port || !ch_mask || !ch_rate || - (num_port > WSA881X_MAX_SWR_PORTS)) { - dev_err(codec->dev, - "%s: Invalid port=%pK, ch_mask=%pK, ch_rate=%pK\n", - __func__, port, ch_mask, ch_rate); - return -EINVAL; - } - for (i = 0; i < num_port; i++) { - wsa881x->port[i].port_id = port[i]; - wsa881x->port[i].ch_mask = ch_mask[i]; - wsa881x->port[i].ch_rate = ch_rate[i]; - wsa881x->port[i].num_ch = __sw_hweight8(ch_mask[i]); - if (port_type) - wsa881x->port[i].port_type = port_type[i]; - } - return 0; -} -EXPORT_SYMBOL(wsa881x_set_channel_map); - -static void wsa881x_init(struct snd_soc_codec *codec) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - wsa881x->version = snd_soc_read(codec, WSA881X_CHIP_ID1); - wsa881x_regmap_defaults(wsa881x->regmap, wsa881x->version); - /* Enable software reset output from soundwire slave */ - snd_soc_update_bits(codec, WSA881X_SWR_RESET_EN, 0x07, 0x07); - /* Bring out of analog reset */ - snd_soc_update_bits(codec, WSA881X_CDC_RST_CTL, 0x02, 0x02); - /* Bring out of digital reset */ - snd_soc_update_bits(codec, WSA881X_CDC_RST_CTL, 0x01, 0x01); - - snd_soc_update_bits(codec, WSA881X_CLOCK_CONFIG, 0x10, 0x10); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x02, 0x02); - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0xC0, 0x80); - snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0x06, 0x06); - snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_INT, 0xFF, 0x00); - snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0xF0, 0x40); - snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0x0E, 0x0E); - snd_soc_update_bits(codec, WSA881X_BOOST_LOOP_STABILITY, - 0x03, 0x03); - snd_soc_update_bits(codec, WSA881X_BOOST_MISC2_CTL, 0xFF, 0x14); - snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, 0x80, 0x80); - snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, 0x03, 0x00); - snd_soc_update_bits(codec, WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, - 0x0C, 0x04); - snd_soc_update_bits(codec, WSA881X_BOOST_SLOPE_COMP_ISENSE_FB, - 0x03, 0x00); - if (snd_soc_read(codec, WSA881X_OTP_REG_0)) - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1, - 0xF0, 0x70); - snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT2, - 0xF0, 0x30); - snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x08, 0x08); - snd_soc_update_bits(codec, WSA881X_BOOST_CURRENT_LIMIT, - 0x0F, 0x08); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x30, 0x30); - snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x0C, 0x00); - snd_soc_update_bits(codec, WSA881X_OTP_REG_28, 0x3F, 0x3A); - snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG1, - 0xFF, 0xB2); - snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG2, - 0xFF, 0x05); -} - -static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec, - bool enable) -{ - wsa881x_clk_ctrl(codec, enable); - wsa881x_bandgap_ctrl(codec, enable); - return 0; -} - -static int32_t wsa881x_temp_reg_read(struct snd_soc_codec *codec, - struct wsa_temp_register *wsa_temp_reg) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct swr_device *dev; - u8 retry = WSA881X_NUM_RETRY; - u8 devnum = 0; - - if (!wsa881x) { - dev_err(codec->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - dev = wsa881x->swr_slave; - if (dev && (wsa881x->state == WSA881X_DEV_DOWN)) { - while (swr_get_logical_dev_num(dev, dev->addr, &devnum) && - retry--) { - /* Retry after 1 msec delay */ - usleep_range(1000, 1100); - } - if (retry == 0) { - dev_err(codec->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, dev->addr); - return -EINVAL; - } - } - wsa881x_regcache_sync(wsa881x); - mutex_lock(&wsa881x->temp_lock); - wsa881x_resource_acquire(codec, ENABLE); - - snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x00); - wsa_temp_reg->dmeas_msb = snd_soc_read(codec, WSA881X_TEMP_MSB); - wsa_temp_reg->dmeas_lsb = snd_soc_read(codec, WSA881X_TEMP_LSB); - snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x01); - wsa_temp_reg->d1_msb = snd_soc_read(codec, WSA881X_OTP_REG_1); - wsa_temp_reg->d1_lsb = snd_soc_read(codec, WSA881X_OTP_REG_2); - wsa_temp_reg->d2_msb = snd_soc_read(codec, WSA881X_OTP_REG_3); - wsa_temp_reg->d2_lsb = snd_soc_read(codec, WSA881X_OTP_REG_4); - - wsa881x_resource_acquire(codec, DISABLE); - mutex_unlock(&wsa881x->temp_lock); - - return 0; -} - -static int wsa881x_probe(struct snd_soc_codec *codec) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - struct swr_device *dev; - - if (!wsa881x) - return -EINVAL; - - dev = wsa881x->swr_slave; - wsa881x->codec = codec; - mutex_init(&wsa881x->bg_lock); - wsa881x_init(codec); - snprintf(wsa881x->tz_pdata.name, sizeof(wsa881x->tz_pdata.name), - "%s.%x", "wsatz", (u8)dev->addr); - wsa881x->bg_cnt = 0; - wsa881x->clk_cnt = 0; - wsa881x->tz_pdata.codec = codec; - wsa881x->tz_pdata.wsa_temp_reg_read = wsa881x_temp_reg_read; - wsa881x_init_thermal(&wsa881x->tz_pdata); - snd_soc_add_codec_controls(codec, wsa_snd_controls, - ARRAY_SIZE(wsa_snd_controls)); - INIT_DELAYED_WORK(&wsa881x->ocp_ctl_work, wsa881x_ocp_ctl_work); - return 0; -} - -static int wsa881x_remove(struct snd_soc_codec *codec) -{ - struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec); - - if (wsa881x->tz_pdata.tz_dev) - wsa881x_deinit_thermal(wsa881x->tz_pdata.tz_dev); - mutex_destroy(&wsa881x->bg_lock); - - return 0; -} - -static struct regmap *wsa881x_get_regmap(struct device *dev) -{ - struct wsa881x_priv *control = swr_get_dev_data(to_swr_device(dev)); - - if (!control) - return NULL; - - return control->regmap; -} - -static struct snd_soc_codec_driver soc_codec_dev_wsa881x = { - .probe = wsa881x_probe, - .remove = wsa881x_remove, - .get_regmap = wsa881x_get_regmap, - .component_driver = { - .controls = wsa881x_snd_controls, - .num_controls = ARRAY_SIZE(wsa881x_snd_controls), - .dapm_widgets = wsa881x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wsa881x_dapm_widgets), - .dapm_routes = wsa881x_audio_map, - .num_dapm_routes = ARRAY_SIZE(wsa881x_audio_map), - }, -}; - -static int wsa881x_gpio_ctrl(struct wsa881x_priv *wsa881x, bool enable) -{ - int ret = 0; - - if (wsa881x->pd_gpio < 0) { - dev_err(wsa881x->dev, "%s: gpio is not valid %d\n", - __func__, wsa881x->pd_gpio); - return -EINVAL; - } - - if (wsa881x->wsa_rst_np) { - if (enable) - ret = msm_cdc_pinctrl_select_active_state( - wsa881x->wsa_rst_np); - else - ret = msm_cdc_pinctrl_select_sleep_state( - wsa881x->wsa_rst_np); - if (ret != 0) - dev_err(wsa881x->dev, - "%s: Failed to turn state %d; ret=%d\n", - __func__, enable, ret); - } else { - if (gpio_is_valid(wsa881x->pd_gpio)) - gpio_direction_output(wsa881x->pd_gpio, enable); - } - - return ret; -} - -static int wsa881x_gpio_init(struct swr_device *pdev) -{ - int ret = 0; - struct wsa881x_priv *wsa881x; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(&pdev->dev, "%s: gpio %d request with name %s\n", - __func__, wsa881x->pd_gpio, dev_name(&pdev->dev)); - ret = gpio_request(wsa881x->pd_gpio, dev_name(&pdev->dev)); - if (ret) { - if (ret == -EBUSY) { - /* GPIO was already requested */ - dev_dbg(&pdev->dev, - "%s: gpio %d is already set to high\n", - __func__, wsa881x->pd_gpio); - ret = 0; - } else { - dev_err(&pdev->dev, "%s: Failed to request gpio %d, err: %d\n", - __func__, wsa881x->pd_gpio, ret); - } - } - return ret; -} - -static int wsa881x_event_notify(struct notifier_block *nb, - unsigned long val, void *ptr) -{ - u16 event = (val & 0xffff); - struct wsa881x_priv *wsa881x = container_of(nb, struct wsa881x_priv, - bolero_nblock); - - if (!wsa881x) - return -EINVAL; - - switch (event) { - case BOLERO_WSA_EVT_PA_OFF_PRE_SSR: - snd_soc_update_bits(wsa881x->codec, - WSA881X_SPKR_DRV_GAIN, - 0xF0, 0xC0); - snd_soc_update_bits(wsa881x->codec, - WSA881X_SPKR_DRV_EN, - 0x80, 0x00); - break; - case BOLERO_WSA_EVT_PA_ON_POST_FSCLK: - if ((snd_soc_read(wsa881x->codec, - WSA881X_SPKR_DAC_CTL) & 0x80) == 0x80) - snd_soc_update_bits(wsa881x->codec, - WSA881X_SPKR_DRV_EN, - 0x80, 0x80); - default: - break; - } - - return 0; -} - -static int wsa881x_swr_probe(struct swr_device *pdev) -{ - int ret = 0; - struct wsa881x_priv *wsa881x; - u8 devnum = 0; - bool pin_state_current = false; - struct wsa_ctrl_platform_data *plat_data = NULL; - - wsa881x = devm_kzalloc(&pdev->dev, sizeof(struct wsa881x_priv), - GFP_KERNEL); - if (!wsa881x) - return -ENOMEM; - wsa881x->wsa_rst_np = of_parse_phandle(pdev->dev.of_node, - "qcom,spkr-sd-n-node", 0); - if (!wsa881x->wsa_rst_np) { - dev_dbg(&pdev->dev, "%s: Not using pinctrl, fallback to gpio\n", - __func__); - wsa881x->pd_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,spkr-sd-n-gpio", 0); - if (wsa881x->pd_gpio < 0) { - dev_err(&pdev->dev, "%s: %s property is not found %d\n", - __func__, "qcom,spkr-sd-n-gpio", - wsa881x->pd_gpio); - goto err; - } - dev_dbg(&pdev->dev, "%s: reset gpio %d\n", __func__, - wsa881x->pd_gpio); - } - swr_set_dev_data(pdev, wsa881x); - - wsa881x->swr_slave = pdev; - - if (!wsa881x->wsa_rst_np) { - ret = wsa881x_gpio_init(pdev); - if (ret) - goto err; - } - if (wsa881x->wsa_rst_np) - pin_state_current = msm_cdc_pinctrl_get_state( - wsa881x->wsa_rst_np); - wsa881x_gpio_ctrl(wsa881x, true); - wsa881x->state = WSA881X_DEV_UP; - - if (!debugfs_wsa881x_dent) { - dbgwsa881x = wsa881x; - debugfs_wsa881x_dent = debugfs_create_dir( - "wsa881x_swr_slave", 0); - if (!IS_ERR(debugfs_wsa881x_dent)) { - debugfs_peek = debugfs_create_file("swrslave_peek", - S_IFREG | 0444, debugfs_wsa881x_dent, - (void *) "swrslave_peek", - &codec_debug_ops); - - debugfs_poke = debugfs_create_file("swrslave_poke", - S_IFREG | 0444, debugfs_wsa881x_dent, - (void *) "swrslave_poke", - &codec_debug_ops); - - debugfs_reg_dump = debugfs_create_file( - "swrslave_reg_dump", - S_IFREG | 0444, - debugfs_wsa881x_dent, - (void *) "swrslave_reg_dump", - &codec_debug_ops); - } - } - - /* - * Add 5msec delay to provide sufficient time for - * soundwire auto enumeration of slave devices as - * as per HW requirement. - */ - usleep_range(5000, 5010); - ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum); - if (ret) { - dev_dbg(&pdev->dev, - "%s get devnum %d for dev addr %lx failed\n", - __func__, devnum, pdev->addr); - goto dev_err; - } - pdev->dev_num = devnum; - - wsa881x->regmap = devm_regmap_init_swr(pdev, - &wsa881x_regmap_config); - if (IS_ERR(wsa881x->regmap)) { - ret = PTR_ERR(wsa881x->regmap); - dev_err(&pdev->dev, "%s: regmap_init failed %d\n", - __func__, ret); - goto dev_err; - } - - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wsa881x, - NULL, 0); - if (ret) { - dev_err(&pdev->dev, "%s: Codec registration failed\n", - __func__); - goto dev_err; - } - - wsa881x->bolero_np = of_parse_phandle(pdev->dev.of_node, - "qcom,bolero-handle", 0); - if (wsa881x->bolero_np) { - wsa881x->bolero_dev = - of_find_device_by_node(wsa881x->bolero_np); - if (wsa881x->bolero_dev) { - plat_data = dev_get_platdata(&wsa881x->bolero_dev->dev); - if (plat_data) { - wsa881x->bolero_nblock.notifier_call = - wsa881x_event_notify; - if (plat_data->register_notifier) - plat_data->register_notifier( - plat_data->handle, - &wsa881x->bolero_nblock, - true); - wsa881x->register_notifier = - plat_data->register_notifier; - wsa881x->handle = plat_data->handle; - } else { - dev_err(&pdev->dev, "%s: plat data not found\n", - __func__); - } - } else { - dev_err(&pdev->dev, "%s: bolero dev not found\n", - __func__); - } - } else { - dev_info(&pdev->dev, "%s: bolero node not found\n", __func__); - } - - mutex_init(&wsa881x->res_lock); - mutex_init(&wsa881x->temp_lock); - - return 0; - -dev_err: - if (pin_state_current == false) - wsa881x_gpio_ctrl(wsa881x, false); - swr_remove_device(pdev); -err: - return ret; -} - -static int wsa881x_swr_remove(struct swr_device *pdev) -{ - struct wsa881x_priv *wsa881x; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - - if (wsa881x->register_notifier) - wsa881x->register_notifier(wsa881x->handle, - &wsa881x->bolero_nblock, false); - debugfs_remove_recursive(debugfs_wsa881x_dent); - debugfs_wsa881x_dent = NULL; - mutex_destroy(&wsa881x->res_lock); - mutex_destroy(&wsa881x->temp_lock); - snd_soc_unregister_codec(&pdev->dev); - if (wsa881x->pd_gpio) - gpio_free(wsa881x->pd_gpio); - swr_set_dev_data(pdev, NULL); - return 0; -} - -static int wsa881x_swr_up(struct swr_device *pdev) -{ - int ret; - struct wsa881x_priv *wsa881x; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - ret = wsa881x_gpio_ctrl(wsa881x, true); - if (ret) - dev_err(&pdev->dev, "%s: Failed to enable gpio\n", __func__); - else - wsa881x->state = WSA881X_DEV_UP; - - return ret; -} - -static int wsa881x_swr_down(struct swr_device *pdev) -{ - struct wsa881x_priv *wsa881x; - int ret; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - if (delayed_work_pending(&wsa881x->ocp_ctl_work)) - cancel_delayed_work_sync(&wsa881x->ocp_ctl_work); - ret = wsa881x_gpio_ctrl(wsa881x, false); - if (ret) - dev_err(&pdev->dev, "%s: Failed to disable gpio\n", __func__); - else - wsa881x->state = WSA881X_DEV_DOWN; - - return ret; -} - -static int wsa881x_swr_reset(struct swr_device *pdev) -{ - struct wsa881x_priv *wsa881x; - u8 retry = WSA881X_NUM_RETRY; - u8 devnum = 0; - - wsa881x = swr_get_dev_data(pdev); - if (!wsa881x) { - dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); - return -EINVAL; - } - if (wsa881x->state == WSA881X_DEV_READY) { - dev_dbg(&pdev->dev, "%s: device already active\n", __func__); - return 0; - } - - wsa881x->bg_cnt = 0; - wsa881x->clk_cnt = 0; - while (swr_get_logical_dev_num(pdev, pdev->addr, &devnum) && retry--) { - /* Retry after 1 msec delay */ - usleep_range(1000, 1100); - } - pdev->dev_num = devnum; - wsa881x_regcache_sync(wsa881x); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int wsa881x_swr_suspend(struct device *dev) -{ - dev_dbg(dev, "%s: system suspend\n", __func__); - return 0; -} - -static int wsa881x_swr_resume(struct device *dev) -{ - struct wsa881x_priv *wsa881x = swr_get_dev_data(to_swr_device(dev)); - - if (!wsa881x) { - dev_err(dev, "%s: wsa881x private data is NULL\n", __func__); - return -EINVAL; - } - dev_dbg(dev, "%s: system resume\n", __func__); - return 0; -} -#endif /* CONFIG_PM_SLEEP */ - -static const struct dev_pm_ops wsa881x_swr_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(wsa881x_swr_suspend, wsa881x_swr_resume) -}; - -static const struct swr_device_id wsa881x_swr_id[] = { - {"wsa881x", 0}, - {} -}; - -static const struct of_device_id wsa881x_swr_dt_match[] = { - { - .compatible = "qcom,wsa881x", - }, - {} -}; - -static struct swr_driver wsa881x_codec_driver = { - .driver = { - .name = "wsa881x", - .owner = THIS_MODULE, - .pm = &wsa881x_swr_pm_ops, - .of_match_table = wsa881x_swr_dt_match, - }, - .probe = wsa881x_swr_probe, - .remove = wsa881x_swr_remove, - .id_table = wsa881x_swr_id, - .device_up = wsa881x_swr_up, - .device_down = wsa881x_swr_down, - .reset_device = wsa881x_swr_reset, -}; - -static int __init wsa881x_codec_init(void) -{ - return swr_driver_register(&wsa881x_codec_driver); -} - -static void __exit wsa881x_codec_exit(void) -{ - swr_driver_unregister(&wsa881x_codec_driver); -} - -module_init(wsa881x_codec_init); -module_exit(wsa881x_codec_exit); - -MODULE_DESCRIPTION("WSA881x Codec driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/codecs/wsa881x.h b/techpack/audio/asoc/codecs/wsa881x.h deleted file mode 100644 index 9f998e37f9e5..000000000000 --- a/techpack/audio/asoc/codecs/wsa881x.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WSA881X_H -#define _WSA881X_H - -#include -#include -#include -#include "wsa881x-registers.h" - -#define WSA881X_MAX_SWR_PORTS 4 - -#if IS_ENABLED(CONFIG_SND_SOC_WSA881X) -extern int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, - u8 num_port, unsigned int *ch_mask, - unsigned int *ch_rate, u8 *port_type); - -extern const u8 wsa881x_reg_readable[WSA881X_CACHE_SIZE]; -extern struct regmap_config wsa881x_regmap_config; -extern int wsa881x_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec); -void wsa881x_regmap_defaults(struct regmap *regmap, u8 version); - -#else -extern int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, - u8 num_port, unsigned int *ch_mask, - unsigned int *ch_rate, u8 *port_type); -{ - return 0; -} - -extern int wsa881x_codec_info_create_codec_entry( - struct snd_info_entry *codec_root, - struct snd_soc_codec *codec) -{ - return 0; -} - -void wsa881x_regmap_defaults(struct regmap *regmap, u8 version) -{ -} - -#endif - -#endif /* _WSA881X_H */ diff --git a/techpack/audio/asoc/device_event.h b/techpack/audio/asoc/device_event.h deleted file mode 100644 index 408d114e3c84..000000000000 --- a/techpack/audio/asoc/device_event.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __DEVICE_EVENT_H -#define __DEVICE_EVENT_H - -#define QC_AUDIO_EXTERNAL_SPK_1_EVENT "qc_ext_spk_1" -#define QC_AUDIO_EXTERNAL_SPK_2_EVENT "qc_ext_spk_2" -#define QC_AUDIO_EXTERNAL_MIC_EVENT "qc_ext_mic" - -#endif /* __DEVICE_EVENT_H */ diff --git a/techpack/audio/asoc/machine_815x_init.c b/techpack/audio/asoc/machine_815x_init.c deleted file mode 100644 index 911294707ff0..000000000000 --- a/techpack/audio/asoc/machine_815x_init.c +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright (c) 2017-2018, 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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -* -*/ - -#include -#include -#include "machine_815x_init.h" - -static int __init audio_machine_815x_init(void) -{ - sm8150_init(); -#ifdef CONFIG_SND_SOC_SA8155 - sa8155_init(); -#endif - return 0; -} - -static void audio_machine_815x_exit(void) -{ - sm8150_exit(); -#ifdef CONFIG_SND_SOC_SA8155 - sa8155_exit(); -#endif -} - -module_init(audio_machine_815x_init); -module_exit(audio_machine_815x_exit); - -MODULE_DESCRIPTION("Audio Machine 815X Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/machine_815x_init.h b/techpack/audio/asoc/machine_815x_init.h deleted file mode 100644 index 4ee6d4f96dc2..000000000000 --- a/techpack/audio/asoc/machine_815x_init.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright (c) 2017-2018, 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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -* -*/ - -#ifndef __MACHINE_815X_INIT_H__ -#define __MACHINE_815X_INIT_H__ -int sm8150_init(void); -int sa8155_init(void); - -void sm8150_exit(void); -void sa8155_exit(void); -#endif - diff --git a/techpack/audio/asoc/msm-audio-effects-q6-v2.c b/techpack/audio/asoc/msm-audio-effects-q6-v2.c deleted file mode 100644 index dc94c3d872ed..000000000000 --- a/techpack/audio/asoc/msm-audio-effects-q6-v2.c +++ /dev/null @@ -1,1424 +0,0 @@ -/* Copyright (c) 2013-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_ENABLE_CMD_SIZE 32 - -#define GET_NEXT(ptr, upper_limit, rc) \ -({ \ - if (((ptr) + 1) > (upper_limit)) { \ - pr_err_ratelimited("%s: param list out of boundary\n", \ - __func__); \ - (rc) = -EINVAL; \ - } \ - ((rc) == 0) ? *(ptr)++ : -EINVAL; \ -}) - -#define CHECK_PARAM_LEN(len, max_len, tag, rc) \ -do { \ - if ((len) > (max_len)) { \ - pr_err_ratelimited("%s: params length overflows\n", \ - (tag)); \ - (rc) = -EINVAL; \ - } \ -} while (0) - - -/** - * msm_audio_effects_is_effmodule_supp_in_top - - * Checks if given topology and module in effects - * - */ -bool msm_audio_effects_is_effmodule_supp_in_top(int effect_module, - int topology) -{ - switch (effect_module) { - case VIRTUALIZER_MODULE: - case REVERB_MODULE: - case BASS_BOOST_MODULE: - case PBE_MODULE: - case EQ_MODULE: - switch (topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_SA_PLUS: - return true; - default: - return false; - } - default: - return false; - } -} -EXPORT_SYMBOL(msm_audio_effects_is_effmodule_supp_in_top); - -int msm_audio_effects_enable_extn(struct audio_client *ac, - struct msm_nt_eff_all_config *effects, - bool flag) -{ - u32 flag_param = flag ? 1 : 0; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s\n", __func__); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VIRTUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = VIRTUALIZER_ENABLE_PARAM_SZ; - if (effects->virtualizer.enable_flag) - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_hdr, - (u8 *) &flag_param); - - param_hdr.module_id = AUDPROC_MODULE_ID_BASS_BOOST; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = BASS_BOOST_ENABLE_PARAM_SZ; - if (effects->bass_boost.enable_flag) - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_hdr, - (u8 *) &flag_param); - - param_hdr.module_id = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = EQ_ENABLE_PARAM_SZ; - if (effects->equalizer.enable_flag) - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_hdr, - (u8 *) &flag_param); - - return rc; -} - -/** - * msm_audio_effects_virtualizer_handler - - * Audio effects handler for virtualizer - * - * @ac: audio client handle - * @pbe: virtualizer params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_virtualizer_handler(struct audio_client *ac, - struct virtualizer_params *virtualizer, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VIRTUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case VIRTUALIZER_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("VIRT ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = virtualizer->enable_flag; - virtualizer->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s:VIRT ENABLE prev:%d, new:%d\n", __func__, - prev_enable_flag, virtualizer->enable_flag); - if (prev_enable_flag == virtualizer->enable_flag) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_ENABLE; - param_hdr.param_size = VIRTUALIZER_ENABLE_PARAM_SZ; - param_data = (u8 *) &virtualizer->enable_flag; - break; - case VIRTUALIZER_STRENGTH: - if (length != 1 || index_offset != 0) { - pr_err("VIRT STRENGTH:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - virtualizer->strength = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: VIRT STRENGTH val: %d\n", - __func__, virtualizer->strength); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_STRENGTH_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT STRENGTH", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_STRENGTH; - param_hdr.param_size = VIRTUALIZER_STRENGTH_PARAM_SZ; - param_data = (u8 *) &virtualizer->strength; - break; - case VIRTUALIZER_OUT_TYPE: - if (length != 1 || index_offset != 0) { - pr_err("VIRT OUT_TYPE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - virtualizer->out_type = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: VIRT OUT_TYPE val:%d\n", - __func__, virtualizer->out_type); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_OUT_TYPE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT OUT_TYPE", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_OUT_TYPE; - param_hdr.param_size = VIRTUALIZER_OUT_TYPE_PARAM_SZ; - param_data = (u8 *) &virtualizer->out_type; - break; - case VIRTUALIZER_GAIN_ADJUST: - if (length != 1 || index_offset != 0) { - pr_err("VIRT GAIN_ADJUST: invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - virtualizer->gain_adjust = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: VIRT GAIN_ADJUST val:%d\n", - __func__, virtualizer->gain_adjust); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - VIRTUALIZER_GAIN_ADJUST_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VIRT GAIN_ADJUST", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_VIRTUALIZER_GAIN_ADJUST; - param_hdr.param_size = VIRTUALIZER_GAIN_ADJUST_PARAM_SZ; - param_data = (u8 *) &virtualizer->gain_adjust; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_virtualizer_handler); - -/** - * msm_audio_effects_reverb_handler - - * Audio effects handler for reverb - * - * @ac: audio client handle - * @pbe: reverb params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_reverb_handler(struct audio_client *ac, - struct reverb_params *reverb, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_REVERB; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case REVERB_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = reverb->enable_flag; - reverb->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s:REVERB_ENABLE prev:%d,new:%d\n", __func__, - prev_enable_flag, reverb->enable_flag); - if (prev_enable_flag == reverb->enable_flag) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_ENABLE; - param_hdr.param_size = REVERB_ENABLE_PARAM_SZ; - param_data = (u8 *) &reverb->enable_flag; - break; - case REVERB_MODE: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_MODE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->mode = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_MODE val:%d\n", - __func__, reverb->mode); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_MODE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_MODE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_MODE; - param_hdr.param_size = REVERB_MODE_PARAM_SZ; - param_data = (u8 *) &reverb->mode; - break; - case REVERB_PRESET: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_PRESET:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->preset = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_PRESET val:%d\n", - __func__, reverb->preset); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_PRESET_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_PRESET", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_PRESET; - param_hdr.param_size = REVERB_PRESET_PARAM_SZ; - param_data = (u8 *) &reverb->preset; - break; - case REVERB_WET_MIX: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_WET_MIX:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->wet_mix = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_WET_MIX val:%d\n", - __func__, reverb->wet_mix); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_WET_MIX_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_WET_MIX", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_WET_MIX; - param_hdr.param_size = REVERB_WET_MIX_PARAM_SZ; - param_data = (u8 *) &reverb->wet_mix; - break; - case REVERB_GAIN_ADJUST: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_GAIN_ADJUST:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->gain_adjust = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_GAIN_ADJUST val:%d\n", - __func__, reverb->gain_adjust); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_GAIN_ADJUST_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_GAIN_ADJUST", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_GAIN_ADJUST; - param_hdr.param_size = REVERB_GAIN_ADJUST_PARAM_SZ; - param_data = (u8 *) &reverb->gain_adjust; - break; - case REVERB_ROOM_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_ROOM_LEVEL:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->room_level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_ROOM_LEVEL val:%d\n", - __func__, reverb->room_level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_ROOM_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_ROOM_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_ROOM_LEVEL; - param_hdr.param_size = REVERB_ROOM_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->room_level; - break; - case REVERB_ROOM_HF_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_ROOM_HF_LEVEL:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->room_hf_level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_ROOM_HF_LEVEL val%d\n", - __func__, reverb->room_hf_level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_ROOM_HF_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_ROOM_HF_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_ROOM_HF_LEVEL; - param_hdr.param_size = REVERB_ROOM_HF_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->room_hf_level; - break; - case REVERB_DECAY_TIME: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DECAY_TIME:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->decay_time = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DECAY_TIME val:%d\n", - __func__, reverb->decay_time); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DECAY_TIME_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DECAY_TIME", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DECAY_TIME; - param_hdr.param_size = REVERB_DECAY_TIME_PARAM_SZ; - param_data = (u8 *) &reverb->decay_time; - break; - case REVERB_DECAY_HF_RATIO: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DECAY_HF_RATIOinvalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->decay_hf_ratio = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DECAY_HF_RATIO val%d\n", - __func__, reverb->decay_hf_ratio); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DECAY_HF_RATIO_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DECAY_HF_RATIO", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_DECAY_HF_RATIO; - param_hdr.param_size = REVERB_DECAY_HF_RATIO_PARAM_SZ; - param_data = (u8 *) &reverb->decay_hf_ratio; - break; - case REVERB_REFLECTIONS_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_REFLECTION_LVLinvalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->reflections_level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_REFLECTIONS_LEVEL val:%d\n", - __func__, reverb->reflections_level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_REFLECTIONS_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_REFLECTIONS_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_REFLECTIONS_LEVEL; - param_hdr.param_size = - REVERB_REFLECTIONS_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->reflections_level; - break; - case REVERB_REFLECTIONS_DELAY: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_REFLECTION_DLYinvalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->reflections_delay = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_REFLECTIONS_DELAY val:%d\n", - __func__, reverb->reflections_delay); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_REFLECTIONS_DELAY_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_REFLECTIONS_DELAY", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_REVERB_REFLECTIONS_DELAY; - param_hdr.param_size = - REVERB_REFLECTIONS_DELAY_PARAM_SZ; - param_data = (u8 *) &reverb->reflections_delay; - break; - case REVERB_LEVEL: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_LEVEL:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->level = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_LEVEL val:%d\n", - __func__, reverb->level); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_LEVEL_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_LEVEL", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_LEVEL; - param_hdr.param_size = REVERB_LEVEL_PARAM_SZ; - param_data = (u8 *) &reverb->level; - break; - case REVERB_DELAY: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DELAY:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->delay = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s:REVERB_DELAY val:%d\n", - __func__, reverb->delay); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DELAY_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DELAY", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DELAY; - param_hdr.param_size = REVERB_DELAY_PARAM_SZ; - param_data = (u8 *) &reverb->delay; - break; - case REVERB_DIFFUSION: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DIFFUSION:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->diffusion = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DIFFUSION val:%d\n", - __func__, reverb->diffusion); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DIFFUSION_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DIFFUSION", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DIFFUSION; - param_hdr.param_size = REVERB_DIFFUSION_PARAM_SZ; - param_data = (u8 *) &reverb->diffusion; - break; - case REVERB_DENSITY: - if (length != 1 || index_offset != 0) { - pr_err("REVERB_DENSITY:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - reverb->density = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: REVERB_DENSITY val:%d\n", - __func__, reverb->density); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - REVERB_DENSITY_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "REVERB_DENSITY", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_REVERB_DENSITY; - param_hdr.param_size = REVERB_DENSITY_PARAM_SZ; - param_data = (u8 *) &reverb->density; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_reverb_handler); - -/** - * msm_audio_effects_bass_boost_handler - - * Audio effects handler for bass_boost - * - * @ac: audio client handle - * @bass_boost: bass_boost params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_bass_boost_handler(struct audio_client *ac, - struct bass_boost_params *bass_boost, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_BASS_BOOST; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case BASS_BOOST_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("BASS_BOOST_ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = bass_boost->enable_flag; - bass_boost->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: BASS_BOOST_ENABLE prev:%d new:%d\n", - __func__, prev_enable_flag, - bass_boost->enable_flag); - if (prev_enable_flag == bass_boost->enable_flag) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - BASS_BOOST_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "BASS_BOOST_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_BASS_BOOST_ENABLE; - param_hdr.param_size = BASS_BOOST_ENABLE_PARAM_SZ; - param_data = (u8 *) &bass_boost->enable_flag; - break; - case BASS_BOOST_MODE: - if (length != 1 || index_offset != 0) { - pr_err("BASS_BOOST_MODE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - bass_boost->mode = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: BASS_BOOST_MODE val:%d\n", - __func__, bass_boost->mode); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - BASS_BOOST_MODE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "BASS_BOOST_MODE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_BASS_BOOST_MODE; - param_hdr.param_size = BASS_BOOST_MODE_PARAM_SZ; - param_data = (u8 *) &bass_boost->mode; - break; - case BASS_BOOST_STRENGTH: - if (length != 1 || index_offset != 0) { - pr_err("BASS_BOOST_STRENGTH:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - bass_boost->strength = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: BASS_BOOST_STRENGTH val:%d\n", - __func__, bass_boost->strength); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - BASS_BOOST_STRENGTH_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "BASS_BOOST_STRENGTH", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_BASS_BOOST_STRENGTH; - param_hdr.param_size = BASS_BOOST_STRENGTH_PARAM_SZ; - param_data = (u8 *) &bass_boost->strength; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_bass_boost_handler); - -/** - * msm_audio_effects_pbe_handler - - * Audio effects handler for pbe - * - * @ac: audio client handle - * @pbe: pbe params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_pbe_handler(struct audio_client *ac, - struct pbe_params *pbe, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_PBE; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case PBE_ENABLE: - pr_debug("%s: PBE_ENABLE\n", __func__); - if (length != 1 || index_offset != 0) { - pr_err("no valid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = pbe->enable_flag; - pbe->enable_flag = - GET_NEXT(values, param_max_offset, rc); - if (prev_enable_flag == pbe->enable_flag) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - PBE_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "PBE_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_PBE_ENABLE; - param_hdr.param_size = PBE_ENABLE_PARAM_SZ; - param_data = (u8 *) &pbe->enable_flag; - break; - case PBE_CONFIG: - pr_debug("%s: PBE_PARAM length %u\n", __func__, length); - if (length > sizeof(struct pbe_config_t) || - length < PBE_CONFIG_PARAM_LEN || - index_offset != 0) { - pr_err("no valid params, len %d\n", length); - rc = -EINVAL; - goto invalid_config; - } - if (command_config_state != CONFIG_SET) - break; - max_params_length = - params_length + COMMAND_IID_PAYLOAD_SZ + length; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "PBE_PARAM", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_PBE_PARAM_CONFIG; - param_hdr.param_size = length; - param_data = (u8 *) values; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); -invalid_config: - kfree(params); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_pbe_handler); - -/** - * msm_audio_effects_popless_eq_handler - - * Audio effects handler for popless equalizer - * - * @ac: audio client handle - * @eq: equalizer params - * @values: values to be updated - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_popless_eq_handler(struct audio_client *ac, - struct eq_params *eq, - long *values) -{ - long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - char *params = NULL; - u8 *updt_params = NULL; - int rc = 0; - int devices = GET_NEXT(values, param_max_offset, rc); - int num_commands = GET_NEXT(values, param_max_offset, rc); - int i, prev_enable_flag; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u8 *param_data = NULL; - u32 packed_data_size = 0; - u8 *eq_config_data = NULL; - u32 *updt_config_data = NULL; - int config_param_length; - - pr_debug("%s\n", __func__); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - pr_debug("%s: device: %d\n", __func__, devices); - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; - param_hdr.instance_id = INSTANCE_ID_0; - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - uint32_t idx; - int j; - - switch (command_id) { - case EQ_ENABLE: - if (length != 1 || index_offset != 0) { - pr_err("EQ_ENABLE:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - prev_enable_flag = eq->enable_flag; - eq->enable_flag = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: EQ_ENABLE prev:%d new:%d\n", __func__, - prev_enable_flag, eq->enable_flag); - if (prev_enable_flag == eq->enable_flag) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - EQ_ENABLE_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_ENABLE", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_EQ_ENABLE; - param_hdr.param_size = EQ_ENABLE_PARAM_SZ; - param_data = (u8 *) &eq->enable_flag; - break; - case EQ_CONFIG: - if (length < EQ_CONFIG_PARAM_LEN || index_offset != 0) { - pr_err("EQ_CONFIG:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - pr_debug("%s: EQ_CONFIG bands:%d, pgain:%d, pset:%d\n", - __func__, eq->config.num_bands, - eq->config.eq_pregain, eq->config.preset_id); - for (idx = 0; idx < MAX_EQ_BANDS; idx++) - eq->per_band_cfg[idx].band_idx = -1; - eq->config.eq_pregain = - GET_NEXT(values, param_max_offset, rc); - eq->config.preset_id = - GET_NEXT(values, param_max_offset, rc); - eq->config.num_bands = - GET_NEXT(values, param_max_offset, rc); - if (eq->config.num_bands > MAX_EQ_BANDS) { - pr_err("EQ_CONFIG:invalid num of bands\n"); - rc = -EINVAL; - goto invalid_config; - } - if (eq->config.num_bands && - (((length - EQ_CONFIG_PARAM_LEN)/ - EQ_CONFIG_PER_BAND_PARAM_LEN) - != eq->config.num_bands)) { - pr_err("EQ_CONFIG:invalid length per band\n"); - rc = -EINVAL; - goto invalid_config; - } - for (j = 0; j < eq->config.num_bands; j++) { - idx = GET_NEXT(values, param_max_offset, rc); - if (idx >= MAX_EQ_BANDS) { - pr_err("EQ_CONFIG:invalid band index\n"); - rc = -EINVAL; - goto invalid_config; - } - eq->per_band_cfg[idx].band_idx = idx; - eq->per_band_cfg[idx].filter_type = - GET_NEXT(values, param_max_offset, rc); - eq->per_band_cfg[idx].freq_millihertz = - GET_NEXT(values, param_max_offset, rc); - eq->per_band_cfg[idx].gain_millibels = - GET_NEXT(values, param_max_offset, rc); - eq->per_band_cfg[idx].quality_factor = - GET_NEXT(values, param_max_offset, rc); - } - if (command_config_state != CONFIG_SET) - break; - config_param_length = EQ_CONFIG_PARAM_SZ + - (EQ_CONFIG_PER_BAND_PARAM_SZ * - eq->config.num_bands); - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - config_param_length; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_CONFIG", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_EQ_CONFIG; - param_hdr.param_size = config_param_length; - - if (!eq_config_data) - eq_config_data = kzalloc(config_param_length, - GFP_KERNEL); - else - memset(eq_config_data, 0, config_param_length); - if (!eq_config_data) { - pr_err("%s, EQ_CONFIG:memory alloc failed\n", - __func__); - rc = -ENOMEM; - goto invalid_config; - } - param_data = eq_config_data; - updt_config_data = (u32 *) eq_config_data; - *updt_config_data++ = eq->config.eq_pregain; - *updt_config_data++ = eq->config.preset_id; - *updt_config_data++ = eq->config.num_bands; - for (idx = 0; idx < MAX_EQ_BANDS; idx++) { - if (eq->per_band_cfg[idx].band_idx < 0) - continue; - *updt_config_data++ = - eq->per_band_cfg[idx].filter_type; - *updt_config_data++ = - eq->per_band_cfg[idx].freq_millihertz; - *updt_config_data++ = - eq->per_band_cfg[idx].gain_millibels; - *updt_config_data++ = - eq->per_band_cfg[idx].quality_factor; - *updt_config_data++ = - eq->per_band_cfg[idx].band_idx; - } - break; - case EQ_BAND_INDEX: - if (length != 1 || index_offset != 0) { - pr_err("EQ_BAND_INDEX:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - idx = GET_NEXT(values, param_max_offset, rc); - if (idx > MAX_EQ_BANDS) { - pr_err("EQ_BAND_INDEX:invalid band index\n"); - rc = -EINVAL; - goto invalid_config; - } - eq->band_index = idx; - pr_debug("%s: EQ_BAND_INDEX val:%d\n", - __func__, eq->band_index); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - EQ_BAND_INDEX_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_BAND_INDEX", rc); - if (rc != 0) - break; - param_hdr.param_id = AUDPROC_PARAM_ID_EQ_BAND_INDEX; - param_hdr.param_size = EQ_BAND_INDEX_PARAM_SZ; - param_data = (u8 *) &eq->band_index; - break; - case EQ_SINGLE_BAND_FREQ: - if (length != 1 || index_offset != 0) { - pr_err("EQ_SINGLE_BAND_FREQ:invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - if (eq->band_index > MAX_EQ_BANDS) { - pr_err("EQ_SINGLE_BAND_FREQ:invalid index\n"); - break; - } - eq->freq_millihertz = - GET_NEXT(values, param_max_offset, rc); - pr_debug("%s: EQ_SINGLE_BAND_FREQ idx:%d, val:%d\n", - __func__, eq->band_index, eq->freq_millihertz); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - EQ_SINGLE_BAND_FREQ_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "EQ_SINGLE_BAND_FREQ", rc); - if (rc != 0) - break; - param_hdr.param_id = - AUDPROC_PARAM_ID_EQ_SINGLE_BAND_FREQ; - param_hdr.param_size = EQ_SINGLE_BAND_FREQ_PARAM_SZ; - param_data = (u8 *) &eq->freq_millihertz; - break; - default: - pr_err_ratelimited("%s: Invalid command to set config\n", - __func__); - continue; - } - if (rc) - goto invalid_config; - - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - param_data, &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); - else - pr_debug("%s: did not send pp params\n", __func__); -invalid_config: - kfree(params); - kfree(eq_config_data); - return rc; -} -EXPORT_SYMBOL(msm_audio_effects_popless_eq_handler); - -static int __msm_audio_effects_volume_handler(struct audio_client *ac, - struct soft_volume_params *vol, - long *values, - int instance) -{ - int devices; - int num_commands; - char *params = NULL; - u8 *updt_params; - int i; - uint32_t vol_gain_2ch = 0; - uint32_t max_params_length = 0; - uint32_t params_length = 0; - struct param_hdr_v3 param_hdr; - u32 packed_data_size = 0; - long *param_max_offset; - int rc = 0; - - pr_debug("%s: instance: %d\n", __func__, instance); - if (!values) { - pr_err("%s: set audio effects failed, no valid data\n", - __func__); - return -EINVAL; - } - param_max_offset = values + MAX_PP_PARAMS_SZ - 1; - devices = GET_NEXT(values, param_max_offset, rc); - num_commands = GET_NEXT(values, param_max_offset, rc); - if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) { - pr_err("%s: cannot set audio effects\n", __func__); - return -EINVAL; - } - params = kzalloc(MAX_INBAND_PARAM_SZ, GFP_KERNEL); - if (!params) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - updt_params = (u8 *) params; - /* Set MID and IID once at top and only update param specific fields*/ - memset(¶m_hdr, 0, sizeof(param_hdr)); - q6asm_set_soft_volume_module_instance_ids(instance, ¶m_hdr); - for (i = 0; i < num_commands; i++) { - uint32_t command_id = - GET_NEXT(values, param_max_offset, rc); - uint32_t command_config_state = - GET_NEXT(values, param_max_offset, rc); - uint32_t index_offset = - GET_NEXT(values, param_max_offset, rc); - uint32_t length = - GET_NEXT(values, param_max_offset, rc); - switch (command_id) { - case SOFT_VOLUME_GAIN_2CH: - case SOFT_VOLUME2_GAIN_2CH: - if (length != 2 || index_offset != 0) { - pr_err("VOLUME_GAIN_2CH: invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - vol->left_gain = GET_NEXT(values, param_max_offset, rc); - vol->right_gain = - GET_NEXT(values, param_max_offset, rc); - vol->master_gain = 0x2000; - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_2CH_PARAM_SZ + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_MASTER_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VOLUME/VOLUME2_GAIN_2CH", rc); - break; - case SOFT_VOLUME_GAIN_MASTER: - case SOFT_VOLUME2_GAIN_MASTER: - if (length != 1 || index_offset != 0) { - pr_err("VOLUME_GAIN_MASTER: invalid params\n"); - rc = -EINVAL; - goto invalid_config; - } - vol->left_gain = 0x2000; - vol->right_gain = 0x2000; - vol->master_gain = - GET_NEXT(values, param_max_offset, rc); - if (command_config_state != CONFIG_SET) - break; - max_params_length = params_length + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_2CH_PARAM_SZ + - COMMAND_IID_PAYLOAD_SZ + - SOFT_VOLUME_GAIN_MASTER_PARAM_SZ; - CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ, - "VOLUME/VOLUME2_GAIN_MASTER", rc); - break; - default: - pr_err_ratelimited("%s: Invalid command id: %d to set config\n", - __func__, command_id); - continue; - } - if (rc) - continue; - - /* Set Volume Control for Left/Right */ - param_hdr.param_id = ASM_PARAM_ID_VOL_CTRL_LR_CHANNEL_GAIN; - param_hdr.param_size = SOFT_VOLUME_GAIN_2CH_PARAM_SZ; - vol_gain_2ch = (vol->left_gain << 16) | vol->right_gain; - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - (u8 *) &vol_gain_2ch, - &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - - /* Set Master Volume Control */ - param_hdr.param_id = ASM_PARAM_ID_VOL_CTRL_MASTER_GAIN; - param_hdr.param_size = SOFT_VOLUME_GAIN_MASTER_PARAM_SZ; - rc = q6common_pack_pp_params(updt_params, ¶m_hdr, - (u8 *) &vol->master_gain, - &packed_data_size); - if (rc) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, rc); - goto invalid_config; - } - - updt_params += packed_data_size; - params_length += packed_data_size; - } - if (params_length && (rc == 0)) - q6asm_set_pp_params(ac, NULL, params, params_length); -invalid_config: - kfree(params); - return rc; -} - -int msm_audio_effects_volume_handler(struct audio_client *ac, - struct soft_volume_params *vol, - long *values) -{ - return __msm_audio_effects_volume_handler(ac, vol, values, - SOFT_VOLUME_INSTANCE_1); -} - -/** - * msm_audio_effects_volume_handler_v2 - - * Audio effects handler for volume - * - * @ac: audio client handle - * @vol: volume params - * @values: values to be updated - * @instance: instance to update - * - * Return 0 on success or error on failure - */ -int msm_audio_effects_volume_handler_v2(struct audio_client *ac, - struct soft_volume_params *vol, - long *values, int instance) -{ - return __msm_audio_effects_volume_handler(ac, vol, values, instance); -} -EXPORT_SYMBOL(msm_audio_effects_volume_handler_v2); diff --git a/techpack/audio/asoc/msm-compress-q6-v2.c b/techpack/audio/asoc/msm-compress-q6-v2.c deleted file mode 100644 index 5ba373ea74f0..000000000000 --- a/techpack/audio/asoc/msm-compress-q6-v2.c +++ /dev/null @@ -1,4723 +0,0 @@ -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "msm-qti-pp-config.h" - -#define TIMEOUT_MS 1000 -#define DSP_PP_BUFFERING_IN_MSEC 25 -#define PARTIAL_DRAIN_ACK_EARLY_BY_MSEC 150 -#define MP3_OUTPUT_FRAME_SZ 1152 -#define AAC_OUTPUT_FRAME_SZ 1024 -#define AC3_OUTPUT_FRAME_SZ 1536 -#define EAC3_OUTPUT_FRAME_SZ 1536 -#define DSP_NUM_OUTPUT_FRAME_BUFFERED 2 -#define FLAC_BLK_SIZE_LIMIT 65535 - -/* Timestamp mode payload offsets */ -#define CAPTURE_META_DATA_TS_OFFSET_LSW 6 -#define CAPTURE_META_DATA_TS_OFFSET_MSW 7 - -/* decoder parameter length */ -#define DDP_DEC_MAX_NUM_PARAM 18 - -/* Default values used if user space does not set */ -#define COMPR_PLAYBACK_MIN_FRAGMENT_SIZE (8 * 1024) -#define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024) -#define COMPR_PLAYBACK_MIN_NUM_FRAGMENTS (4) -#define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4) - -#define COMPRESSED_LR_VOL_MAX_STEPS 0x2000 -const DECLARE_TLV_DB_LINEAR(msm_compr_vol_gain, 0, - COMPRESSED_LR_VOL_MAX_STEPS); - -/* Stream id switches between 1 and 2 */ -#define NEXT_STREAM_ID(stream_id) ((stream_id & 1) + 1) - -#define STREAM_ARRAY_INDEX(stream_id) (stream_id - 1) - -#define MAX_NUMBER_OF_STREAMS 2 - -struct msm_compr_gapless_state { - bool set_next_stream_id; - int32_t stream_opened[MAX_NUMBER_OF_STREAMS]; - uint32_t initial_samples_drop; - uint32_t trailing_samples_drop; - uint32_t gapless_transition; - bool use_dsp_gapless_mode; - union snd_codec_options codec_options; -}; - -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, - 88200, 96000, 128000, 144000, 176400, 192000, 352800, 384000, 2822400, - 5644800 -}; - -struct msm_compr_pdata { - struct snd_compr_stream *cstream[MSM_FRONTEND_DAI_MAX]; - uint32_t volume[MSM_FRONTEND_DAI_MAX][2]; /* For both L & R */ - struct msm_compr_audio_effects *audio_effects[MSM_FRONTEND_DAI_MAX]; - bool use_dsp_gapless_mode; - bool use_legacy_api; /* indicates use older asm apis*/ - struct msm_compr_dec_params *dec_params[MSM_FRONTEND_DAI_MAX]; - struct msm_compr_ch_map *ch_map[MSM_FRONTEND_DAI_MAX]; - bool is_in_use[MSM_FRONTEND_DAI_MAX]; - struct mutex lock; -}; - -struct msm_compr_audio { - struct snd_compr_stream *cstream; - struct snd_compr_caps compr_cap; - struct snd_compr_codec_caps codec_caps; - struct snd_compr_params codec_param; - struct audio_client *audio_client; - - uint32_t codec; - uint32_t compr_passthr; - void *buffer; /* virtual address */ - phys_addr_t buffer_paddr; /* physical address */ - uint32_t app_pointer; - uint32_t buffer_size; - uint32_t byte_offset; - uint64_t copied_total; /* bytes consumed by DSP */ - uint64_t bytes_received; /* from userspace */ - uint64_t bytes_sent; /* to DSP */ - - uint64_t received_total; /* bytes received from DSP */ - uint64_t bytes_copied; /* to userspace */ - uint64_t bytes_read; /* from DSP */ - uint32_t bytes_read_offset; /* bytes read offset */ - - uint32_t ts_header_offset; /* holds the timestamp header offset */ - - int32_t first_buffer; - int32_t last_buffer; - int32_t partial_drain_delay; - - uint16_t session_id; - - uint32_t sample_rate; - uint32_t num_channels; - - /* - * convention - commands coming from the same thread - * can use the common cmd_ack var. Others (e.g drain/EOS) - * must use separate vars to track command status. - */ - uint32_t cmd_ack; - uint32_t cmd_interrupt; - uint32_t drain_ready; - uint32_t eos_ack; - - uint32_t stream_available; - uint32_t next_stream; - - uint32_t run_mode; - uint32_t start_delay_lsw; - uint32_t start_delay_msw; - - uint64_t marker_timestamp; - - struct msm_compr_gapless_state gapless_state; - - atomic_t start; - atomic_t eos; - atomic_t drain; - atomic_t xrun; - atomic_t close; - atomic_t wait_on_close; - atomic_t error; - - wait_queue_head_t eos_wait; - wait_queue_head_t drain_wait; - wait_queue_head_t close_wait; - wait_queue_head_t wait_for_stream_avail; - - spinlock_t lock; -}; - -const u32 compr_codecs[] = { - SND_AUDIOCODEC_AC3, SND_AUDIOCODEC_EAC3, SND_AUDIOCODEC_DTS, - SND_AUDIOCODEC_DSD, SND_AUDIOCODEC_TRUEHD, SND_AUDIOCODEC_IEC61937}; - -struct query_audio_effect { - uint32_t mod_id; - uint32_t parm_id; - uint32_t size; - uint32_t offset; - uint32_t device; -}; - -struct msm_compr_audio_effects { - struct bass_boost_params bass_boost; - struct pbe_params pbe; - struct virtualizer_params virtualizer; - struct reverb_params reverb; - struct eq_params equalizer; - struct soft_volume_params volume; - struct query_audio_effect query; -}; - -struct msm_compr_dec_params { - struct snd_dec_ddp ddp_params; -}; - -struct msm_compr_ch_map { - bool set_ch_map; - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; -}; - -static int msm_compr_send_dec_params(struct snd_compr_stream *cstream, - struct msm_compr_dec_params *dec_params, - int stream_id); - -static int msm_compr_set_render_mode(struct msm_compr_audio *prtd, - uint32_t render_mode) { - int ret = -EINVAL; - struct audio_client *ac = prtd->audio_client; - - pr_debug("%s, got render mode %u\n", __func__, render_mode); - - if (render_mode == SNDRV_COMPRESS_RENDER_MODE_AUDIO_MASTER) { - render_mode = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT; - } else if (render_mode == SNDRV_COMPRESS_RENDER_MODE_STC_MASTER) { - render_mode = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC; - prtd->run_mode = ASM_SESSION_CMD_RUN_STARTIME_RUN_WITH_DELAY; - } else { - pr_err("%s, Invalid render mode %u\n", __func__, - render_mode); - ret = -EINVAL; - goto exit; - } - - ret = q6asm_send_mtmx_strtr_render_mode(ac, render_mode); - if (ret) { - pr_err("%s, Render mode can't be set error %d\n", __func__, - ret); - } -exit: - return ret; -} - -static int msm_compr_set_clk_rec_mode(struct audio_client *ac, - uint32_t clk_rec_mode) { - int ret = -EINVAL; - - pr_debug("%s, got clk rec mode %u\n", __func__, clk_rec_mode); - - if (clk_rec_mode == SNDRV_COMPRESS_CLK_REC_MODE_NONE) { - clk_rec_mode = ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_NONE; - } else if (clk_rec_mode == SNDRV_COMPRESS_CLK_REC_MODE_AUTO) { - clk_rec_mode = ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_AUTO; - } else { - pr_err("%s, Invalid clk rec_mode mode %u\n", __func__, - clk_rec_mode); - ret = -EINVAL; - goto exit; - } - - ret = q6asm_send_mtmx_strtr_clk_rec_mode(ac, clk_rec_mode); - if (ret) { - pr_err("%s, clk rec mode can't be set, error %d\n", __func__, - ret); - } - -exit: - return ret; -} - -static int msm_compr_set_render_window(struct audio_client *ac, - uint32_t ws_lsw, uint32_t ws_msw, - uint32_t we_lsw, uint32_t we_msw) -{ - int ret = -EINVAL; - struct asm_session_mtmx_strtr_param_window_v2_t asm_mtmx_strtr_window; - uint32_t param_id; - - pr_debug("%s, ws_lsw 0x%x ws_msw 0x%x we_lsw 0x%x we_ms 0x%x\n", - __func__, ws_lsw, ws_msw, we_lsw, we_msw); - - memset(&asm_mtmx_strtr_window, 0, - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t)); - asm_mtmx_strtr_window.window_lsw = ws_lsw; - asm_mtmx_strtr_window.window_msw = ws_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, - param_id); - if (ret) { - pr_err("%s, start window can't be set error %d\n", __func__, - ret); - goto exit; - } - - asm_mtmx_strtr_window.window_lsw = we_lsw; - asm_mtmx_strtr_window.window_msw = we_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, - param_id); - if (ret) { - pr_err("%s, end window can't be set error %d\n", __func__, - ret); - } - -exit: - return ret; -} - -static int msm_compr_enable_adjust_session_clock(struct audio_client *ac, - bool enable) -{ - int ret; - - pr_debug("%s, enable adjust_session %d\n", __func__, enable); - - ret = q6asm_send_mtmx_strtr_enable_adjust_session_clock(ac, enable); - if (ret) - pr_err("%s, adjust session clock can't be set error %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_adjust_session_clock(struct audio_client *ac, - uint32_t adjust_session_lsw, uint32_t adjust_session_msw) -{ - int ret; - - pr_debug("%s, adjust_session_time_msw 0x%x adjust_session_time_lsw 0x%x\n", - __func__, adjust_session_msw, adjust_session_lsw); - - ret = q6asm_adjust_session_clock(ac, - adjust_session_lsw, - adjust_session_msw); - if (ret) - pr_err("%s, adjust session clock can't be set error %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_set_volume(struct snd_compr_stream *cstream, - uint32_t volume_l, uint32_t volume_r) -{ - struct msm_compr_audio *prtd; - int rc = 0; - uint32_t avg_vol, gain_list[VOLUME_CONTROL_MAX_CHANNELS]; - uint32_t num_channels; - struct snd_soc_pcm_runtime *rtd; - struct msm_compr_pdata *pdata; - bool use_default = true; - u8 *chmap = NULL; - - pr_debug("%s: volume_l %d volume_r %d\n", - __func__, volume_l, volume_r); - if (!cstream || !cstream->runtime) { - pr_err("%s: session not active\n", __func__); - return -EPERM; - } - rtd = cstream->private_data; - prtd = cstream->runtime->private_data; - - if (!rtd || !rtd->platform || !prtd || !prtd->audio_client) { - pr_err("%s: invalid rtd, prtd or audio client", __func__); - return rc; - } - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No volume config for passthrough %d\n", - __func__, prtd->compr_passthr); - return rc; - } - - use_default = !(pdata->ch_map[rtd->dai_link->id]->set_ch_map); - chmap = pdata->ch_map[rtd->dai_link->id]->channel_map; - num_channels = prtd->num_channels; - - if (prtd->num_channels > 2) { - /* - * Currently the left and right gains are averaged an applied - * to all channels. This might not be desirable. But currently, - * there exists no API in userspace to send a list of gains for - * each channel either. If such an API does become available, - * the mixer control must be updated to accept more than 2 - * channel gains. - * - */ - avg_vol = (volume_l + volume_r) / 2; - rc = q6asm_set_volume(prtd->audio_client, avg_vol); - } else { - gain_list[0] = volume_l; - gain_list[1] = volume_r; - gain_list[2] = volume_l; - num_channels = 3; - use_default = true; - rc = q6asm_set_multich_gain(prtd->audio_client, num_channels, - gain_list, chmap, use_default); - } - - if (rc < 0) - pr_err("%s: Send vol gain command failed rc=%d\n", - __func__, rc); - - return rc; -} - -static int msm_compr_send_ddp_cfg(struct audio_client *ac, - struct snd_dec_ddp *ddp, - int stream_id) -{ - int i, rc; - - pr_debug("%s\n", __func__); - for (i = 0; i < ddp->params_length; i++) { - rc = q6asm_ds1_set_stream_endp_params(ac, ddp->params_id[i], - ddp->params_value[i], - stream_id); - if (rc) { - pr_err("sending params_id: %d failed\n", - ddp->params_id[i]); - return rc; - } - } - return 0; -} - -static int msm_compr_send_buffer(struct msm_compr_audio *prtd) -{ - int buffer_length; - uint64_t bytes_available; - struct audio_aio_write_param param; - struct snd_codec_metadata *buff_addr; - - if (!atomic_read(&prtd->start)) { - pr_err("%s: stream is not in started state\n", __func__); - return -EINVAL; - } - - - if (atomic_read(&prtd->xrun)) { - WARN(1, "%s called while xrun is true", __func__); - return -EPERM; - } - - pr_debug("%s: bytes_received = %llu copied_total = %llu\n", - __func__, prtd->bytes_received, prtd->copied_total); - if (prtd->first_buffer && prtd->gapless_state.use_dsp_gapless_mode && - prtd->compr_passthr == LEGACY_PCM) - q6asm_stream_send_meta_data(prtd->audio_client, - prtd->audio_client->stream_id, - prtd->gapless_state.initial_samples_drop, - prtd->gapless_state.trailing_samples_drop); - - buffer_length = prtd->codec_param.buffer.fragment_size; - bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < prtd->codec_param.buffer.fragment_size) - buffer_length = bytes_available; - - if (prtd->byte_offset + buffer_length > prtd->buffer_size) { - buffer_length = (prtd->buffer_size - prtd->byte_offset); - pr_debug("%s: wrap around situation, send partial data %d now", - __func__, buffer_length); - } - - if (buffer_length) { - param.paddr = prtd->buffer_paddr + prtd->byte_offset; - WARN(prtd->byte_offset % 32 != 0, "offset %x not multiple of 32\n", - prtd->byte_offset); - } else { - param.paddr = prtd->buffer_paddr; - } - param.len = buffer_length; - if (prtd->ts_header_offset) { - buff_addr = (struct snd_codec_metadata *) - (prtd->buffer + prtd->byte_offset); - param.len = buff_addr->length; - param.msw_ts = (uint32_t) - ((buff_addr->timestamp & 0xFFFFFFFF00000000LL) >> 32); - param.lsw_ts = (uint32_t) (buff_addr->timestamp & 0xFFFFFFFFLL); - param.paddr += prtd->ts_header_offset; - param.flags = SET_TIMESTAMP; - param.metadata_len = prtd->ts_header_offset; - } else { - param.msw_ts = 0; - param.lsw_ts = 0; - param.flags = NO_TIMESTAMP; - param.metadata_len = 0; - } - param.uid = buffer_length; - param.last_buffer = prtd->last_buffer; - - pr_debug("%s: sending %d bytes to DSP byte_offset = %d\n", - __func__, param.len, prtd->byte_offset); - if (q6asm_async_write(prtd->audio_client, ¶m) < 0) { - pr_err("%s:q6asm_async_write failed\n", __func__); - } else { - prtd->bytes_sent += buffer_length; - if (prtd->first_buffer) - prtd->first_buffer = 0; - } - - return 0; -} - -static int msm_compr_read_buffer(struct msm_compr_audio *prtd) -{ - int buffer_length; - uint64_t bytes_available; - uint64_t buffer_sent; - struct audio_aio_read_param param; - int ret; - - if (!atomic_read(&prtd->start)) { - pr_err("%s: stream is not in started state\n", __func__); - return -EINVAL; - } - - buffer_length = prtd->codec_param.buffer.fragment_size - - prtd->ts_header_offset; - bytes_available = prtd->received_total - prtd->bytes_copied; - buffer_sent = prtd->bytes_read - prtd->bytes_copied; - if (buffer_sent + buffer_length + prtd->ts_header_offset - > prtd->buffer_size) { - pr_debug(" %s : Buffer is Full bytes_available: %llu\n", - __func__, bytes_available); - return 0; - } - - memset(¶m, 0x0, sizeof(struct audio_aio_read_param)); - param.paddr = prtd->buffer_paddr + prtd->bytes_read_offset + - prtd->ts_header_offset; - param.len = buffer_length; - param.uid = buffer_length; - param.flags = prtd->codec_param.codec.flags; - - pr_debug("%s: reading %d bytes from DSP byte_offset = %llu\n", - __func__, buffer_length, prtd->bytes_read); - ret = q6asm_async_read(prtd->audio_client, ¶m); - if (ret < 0) { - pr_err("%s: q6asm_async_read failed - %d\n", - __func__, ret); - return ret; - } - prtd->bytes_read += buffer_length + prtd->ts_header_offset; - prtd->bytes_read_offset += buffer_length + prtd->ts_header_offset; - if (prtd->bytes_read_offset >= prtd->buffer_size) - prtd->bytes_read_offset -= prtd->buffer_size; - - return 0; -} - -static void compr_event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct msm_compr_audio *prtd = priv; - struct snd_compr_stream *cstream; - struct audio_client *ac; - uint32_t chan_mode = 0; - uint32_t sample_rate = 0; - uint64_t bytes_available; - int stream_id; - uint32_t stream_index; - unsigned long flags; - uint64_t read_size; - uint32_t *buff_addr; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - if (!prtd) { - pr_err("%s: prtd is NULL\n", __func__); - return; - } - cstream = prtd->cstream; - if (!cstream) { - pr_err("%s: cstream is NULL\n", __func__); - return; - } - - ac = prtd->audio_client; - - /* - * Token for rest of the compressed commands use to set - * session id, stream id, dir etc. - */ - stream_id = q6asm_get_stream_id_from_token(token); - - pr_debug("%s opcode =%08x\n", __func__, opcode); - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: - spin_lock_irqsave(&prtd->lock, flags); - - if (payload[3]) { - pr_err("%s: WRITE FAILED w/ err 0x%x !, paddr 0x%x, byte_offset=%d,copied_total=%llu,token=%d\n", - __func__, - payload[3], - payload[0], - prtd->byte_offset, - prtd->copied_total, token); - - if (atomic_cmpxchg(&prtd->drain, 1, 0) && - prtd->last_buffer) { - pr_debug("%s: wake up on drain\n", __func__); - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - prtd->last_buffer = 0; - } else { - atomic_set(&prtd->start, 0); - } - } else { - pr_debug("ASM_DATA_EVENT_WRITE_DONE_V2 offset %d, length %d\n", - prtd->byte_offset, token); - } - - /* - * Token for WRITE command represents the amount of data - * written to ADSP in the last write, update offset and - * total copied data accordingly. - */ - if (prtd->ts_header_offset) { - /* Always assume that the data will be sent to DSP on - * frame boundary. - * i.e, one frame of userspace write will result in - * one kernel write to DSP. This is needed as - * timestamp will be sent per frame. - */ - prtd->byte_offset += - prtd->codec_param.buffer.fragment_size; - prtd->copied_total += - prtd->codec_param.buffer.fragment_size; - } else { - prtd->byte_offset += token; - prtd->copied_total += token; - } - if (prtd->byte_offset >= prtd->buffer_size) - prtd->byte_offset -= prtd->buffer_size; - - snd_compr_fragment_elapsed(cstream); - - if (!atomic_read(&prtd->start)) { - /* Writes must be restarted from _copy() */ - pr_debug("write_done received while not started, treat as xrun"); - atomic_set(&prtd->xrun, 1); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { - pr_debug("WRITE_DONE Insufficient data to send. break out\n"); - atomic_set(&prtd->xrun, 1); - - if (prtd->last_buffer) - prtd->last_buffer = 0; - if (atomic_read(&prtd->drain)) { - pr_debug("wake up on drain\n"); - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - atomic_set(&prtd->drain, 0); - } - } else if ((bytes_available == cstream->runtime->fragment_size) - && atomic_read(&prtd->drain)) { - prtd->last_buffer = 1; - msm_compr_send_buffer(prtd); - prtd->last_buffer = 0; - } else - msm_compr_send_buffer(prtd); - - spin_unlock_irqrestore(&prtd->lock, flags); - break; - - case ASM_DATA_EVENT_READ_DONE_V2: - spin_lock_irqsave(&prtd->lock, flags); - - pr_debug("ASM_DATA_EVENT_READ_DONE_V2 offset %d, length %d\n", - prtd->byte_offset, payload[4]); - - if (prtd->ts_header_offset) { - /* Update the header for received buffer */ - buff_addr = prtd->buffer + prtd->byte_offset; - /* Write the actual length of the received buffer */ - *buff_addr = payload[4]; - buff_addr++; - /* Write the offset */ - *buff_addr = prtd->ts_header_offset; - buff_addr++; - /* Write the TS LSW */ - *buff_addr = payload[CAPTURE_META_DATA_TS_OFFSET_LSW]; - buff_addr++; - /* Write the TS MSW */ - *buff_addr = payload[CAPTURE_META_DATA_TS_OFFSET_MSW]; - } - /* Always assume read_size is same as fragment_size */ - read_size = prtd->codec_param.buffer.fragment_size; - prtd->byte_offset += read_size; - prtd->received_total += read_size; - if (prtd->byte_offset >= prtd->buffer_size) - prtd->byte_offset -= prtd->buffer_size; - - snd_compr_fragment_elapsed(cstream); - - if (!atomic_read(&prtd->start)) { - pr_debug("read_done received while not started, treat as xrun"); - atomic_set(&prtd->xrun, 1); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - msm_compr_read_buffer(prtd); - - spin_unlock_irqrestore(&prtd->lock, flags); - break; - - case ASM_DATA_EVENT_RENDERED_EOS: - spin_lock_irqsave(&prtd->lock, flags); - pr_debug("%s: ASM_DATA_CMDRSP_EOS token 0x%x,stream id %d\n", - __func__, token, stream_id); - if (atomic_read(&prtd->eos) && - !prtd->gapless_state.set_next_stream_id) { - pr_debug("ASM_DATA_CMDRSP_EOS wake up\n"); - prtd->eos_ack = 1; - wake_up(&prtd->eos_wait); - } - atomic_set(&prtd->eos, 0); - stream_index = STREAM_ARRAY_INDEX(stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || - stream_index < 0) { - pr_err("%s: Invalid stream index %d", __func__, - stream_index); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - if (prtd->gapless_state.set_next_stream_id && - prtd->gapless_state.stream_opened[stream_index]) { - pr_debug("%s: CMD_CLOSE stream_id %d\n", - __func__, stream_id); - q6asm_stream_cmd_nowait(ac, CMD_CLOSE, stream_id); - atomic_set(&prtd->close, 1); - prtd->gapless_state.stream_opened[stream_index] = 0; - prtd->gapless_state.set_next_stream_id = false; - } - if (prtd->gapless_state.gapless_transition) - prtd->gapless_state.gapless_transition = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - case ASM_STREAM_PP_EVENT: - case ASM_STREAM_CMD_ENCDEC_EVENTS: - pr_debug("%s: ASM_STREAM_EVENT(0x%x)\n", __func__, opcode); - rtd = cstream->private_data; - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return; - } - - ret = msm_adsp_inform_mixer_ctl(rtd, payload); - if (ret) { - pr_err("%s: failed to inform mixer ctrl. err = %d\n", - __func__, ret); - return; - } - break; - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: { - pr_debug("ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY\n"); - chan_mode = payload[1] >> 16; - sample_rate = payload[2] >> 16; - if (prtd && (chan_mode != prtd->num_channels || - sample_rate != prtd->sample_rate)) { - prtd->num_channels = chan_mode; - prtd->sample_rate = sample_rate; - } - } - /* Fallthrough here */ - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - /* check if the first buffer need to be sent to DSP */ - pr_debug("ASM_SESSION_CMD_RUN_V2\n"); - - /* FIXME: A state is a better way, dealing with this */ - spin_lock_irqsave(&prtd->lock, flags); - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - atomic_set(&prtd->start, 1); - msm_compr_read_buffer(prtd); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - if (!prtd->bytes_sent) { - bytes_available = prtd->bytes_received - - prtd->copied_total; - if (bytes_available < - cstream->runtime->fragment_size) { - pr_debug("CMD_RUN_V2 Insufficient data to send. break out\n"); - atomic_set(&prtd->xrun, 1); - } else { - msm_compr_send_buffer(prtd); - } - } - - /* - * The condition below ensures playback finishes in the - * follow cornercase - * WRITE(last buffer) - * WAIT_FOR_DRAIN - * PAUSE - * WRITE_DONE(X) - * RESUME - */ - if ((prtd->copied_total == prtd->bytes_sent) && - atomic_read(&prtd->drain)) { - bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { - pr_debug("%s: RUN ack, wake up & continue pending drain\n", - __func__); - - if (prtd->last_buffer) - prtd->last_buffer = 0; - - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - atomic_set(&prtd->drain, 0); - } else if (atomic_read(&prtd->xrun)) { - pr_debug("%s: RUN ack, continue write cycle\n", __func__); - atomic_set(&prtd->xrun, 0); - msm_compr_send_buffer(prtd); - } - } - - spin_unlock_irqrestore(&prtd->lock, flags); - break; - case ASM_STREAM_CMD_FLUSH: - pr_debug("%s: ASM_STREAM_CMD_FLUSH:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - prtd->cmd_ack = 1; - break; - case ASM_DATA_CMD_REMOVE_INITIAL_SILENCE: - pr_debug("%s: ASM_DATA_CMD_REMOVE_INITIAL_SILENCE:", - __func__); - pr_debug("token 0x%x, stream id = %d\n", token, - stream_id); - break; - case ASM_DATA_CMD_REMOVE_TRAILING_SILENCE: - pr_debug("%s: ASM_DATA_CMD_REMOVE_TRAILING_SILENCE:", - __func__); - pr_debug("token = 0x%x, stream id = %d\n", token, - stream_id); - break; - case ASM_STREAM_CMD_CLOSE: - pr_debug("%s: ASM_DATA_CMD_CLOSE:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - /* - * wakeup wait for stream avail on stream 3 - * after stream 1 ends. - */ - if (prtd->next_stream) { - pr_debug("%s:CLOSE:wakeup wait for stream\n", - __func__); - prtd->stream_available = 1; - wake_up(&prtd->wait_for_stream_avail); - prtd->next_stream = 0; - } - if (atomic_read(&prtd->close) && - atomic_read(&prtd->wait_on_close)) { - prtd->cmd_ack = 1; - wake_up(&prtd->close_wait); - } - atomic_set(&prtd->close, 0); - break; - case ASM_STREAM_CMD_REGISTER_PP_EVENTS: - pr_debug("%s: ASM_STREAM_CMD_REGISTER_PP_EVENTS:", - __func__); - break; - default: - break; - } - break; - } - case ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3: - pr_debug("%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3\n", - __func__); - break; - case RESET_EVENTS: - pr_err("%s: Received reset events CB, move to error state", - __func__); - spin_lock_irqsave(&prtd->lock, flags); - /* - * Since ADSP is down, let this driver pretend that it copied - * all the bytes received, so that next write will be triggered - */ - prtd->copied_total = prtd->bytes_received; - snd_compr_fragment_elapsed(cstream); - atomic_set(&prtd->error, 1); - wake_up(&prtd->drain_wait); - if (atomic_cmpxchg(&prtd->eos, 1, 0)) { - pr_debug("%s:unblock eos wait queues", __func__); - wake_up(&prtd->eos_wait); - } - spin_unlock_irqrestore(&prtd->lock, flags); - break; - default: - pr_debug("%s: Not Supported Event opcode[0x%x]\n", - __func__, opcode); - break; - } -} - -static int msm_compr_get_partial_drain_delay(int frame_sz, int sample_rate) -{ - int delay_time_ms = 0; - - delay_time_ms = ((DSP_NUM_OUTPUT_FRAME_BUFFERED * frame_sz * 1000) / - sample_rate) + DSP_PP_BUFFERING_IN_MSEC; - delay_time_ms = delay_time_ms > PARTIAL_DRAIN_ACK_EARLY_BY_MSEC ? - delay_time_ms - PARTIAL_DRAIN_ACK_EARLY_BY_MSEC : 0; - - pr_debug("%s: frame_sz %d, sample_rate %d, partial drain delay %d\n", - __func__, frame_sz, sample_rate, delay_time_ms); - return delay_time_ms; -} - -static void populate_codec_list(struct msm_compr_audio *prtd) -{ - pr_debug("%s\n", __func__); - prtd->compr_cap.direction = SND_COMPRESS_PLAYBACK; - prtd->compr_cap.min_fragment_size = - COMPR_PLAYBACK_MIN_FRAGMENT_SIZE; - prtd->compr_cap.max_fragment_size = - COMPR_PLAYBACK_MAX_FRAGMENT_SIZE; - prtd->compr_cap.min_fragments = - COMPR_PLAYBACK_MIN_NUM_FRAGMENTS; - prtd->compr_cap.max_fragments = - COMPR_PLAYBACK_MAX_NUM_FRAGMENTS; - prtd->compr_cap.num_codecs = 17; - prtd->compr_cap.codecs[0] = SND_AUDIOCODEC_MP3; - prtd->compr_cap.codecs[1] = SND_AUDIOCODEC_AAC; - prtd->compr_cap.codecs[2] = SND_AUDIOCODEC_AC3; - prtd->compr_cap.codecs[3] = SND_AUDIOCODEC_EAC3; - prtd->compr_cap.codecs[4] = SND_AUDIOCODEC_MP2; - prtd->compr_cap.codecs[5] = SND_AUDIOCODEC_PCM; - prtd->compr_cap.codecs[6] = SND_AUDIOCODEC_WMA; - prtd->compr_cap.codecs[7] = SND_AUDIOCODEC_WMA_PRO; - prtd->compr_cap.codecs[8] = SND_AUDIOCODEC_FLAC; - prtd->compr_cap.codecs[9] = SND_AUDIOCODEC_VORBIS; - prtd->compr_cap.codecs[10] = SND_AUDIOCODEC_ALAC; - prtd->compr_cap.codecs[11] = SND_AUDIOCODEC_APE; - prtd->compr_cap.codecs[12] = SND_AUDIOCODEC_DTS; - prtd->compr_cap.codecs[13] = SND_AUDIOCODEC_DSD; - prtd->compr_cap.codecs[14] = SND_AUDIOCODEC_APTX; - prtd->compr_cap.codecs[15] = SND_AUDIOCODEC_TRUEHD; - prtd->compr_cap.codecs[16] = SND_AUDIOCODEC_IEC61937; -} - -static int msm_compr_send_media_format_block(struct snd_compr_stream *cstream, - int stream_id, - bool use_gapless_codec_options) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - struct asm_aac_cfg aac_cfg; - struct asm_wma_cfg wma_cfg; - struct asm_wmapro_cfg wma_pro_cfg; - struct asm_flac_cfg flac_cfg; - struct asm_vorbis_cfg vorbis_cfg; - struct asm_alac_cfg alac_cfg; - struct asm_ape_cfg ape_cfg; - struct asm_dsd_cfg dsd_cfg; - struct aptx_dec_bt_addr_cfg aptx_cfg; - union snd_codec_options *codec_options; - - int ret = 0; - uint16_t bit_width; - bool use_default_chmap = true; - char *chmap = NULL; - uint16_t sample_word_size; - - pr_debug("%s: use_gapless_codec_options %d\n", - __func__, use_gapless_codec_options); - - if (use_gapless_codec_options) - codec_options = &(prtd->gapless_state.codec_options); - else - codec_options = &(prtd->codec_param.codec.options); - - if (!codec_options) { - pr_err("%s: codec_options is NULL\n", __func__); - return -EINVAL; - } - - switch (prtd->codec) { - case FORMAT_LINEAR_PCM: - pr_debug("SND_AUDIOCODEC_PCM\n"); - if (pdata->ch_map[rtd->dai_link->id]) { - use_default_chmap = - !(pdata->ch_map[rtd->dai_link->id]->set_ch_map); - chmap = - pdata->ch_map[rtd->dai_link->id]->channel_map; - } - - switch (prtd->codec_param.codec.format) { - case SNDRV_PCM_FORMAT_S32_LE: - bit_width = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bit_width = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bit_width = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_width = 16; - sample_word_size = 16; - break; - } - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) { - ret = q6asm_media_format_block_pcm_format_support_v5( - prtd->audio_client, - prtd->sample_rate, - prtd->num_channels, - bit_width, stream_id, - use_default_chmap, - chmap, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } else { - ret = q6asm_media_format_block_pcm_format_support_v4( - prtd->audio_client, - prtd->sample_rate, - prtd->num_channels, - bit_width, stream_id, - use_default_chmap, - chmap, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - - break; - case FORMAT_MP3: - pr_debug("SND_AUDIOCODEC_MP3\n"); - /* no media format block needed */ - break; - case FORMAT_MPEG4_AAC: - pr_debug("SND_AUDIOCODEC_AAC\n"); - memset(&aac_cfg, 0x0, sizeof(struct asm_aac_cfg)); - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - if (prtd->codec_param.codec.format == - SND_AUDIOSTREAMFORMAT_MP4ADTS) - aac_cfg.format = 0x0; - else if (prtd->codec_param.codec.format == - SND_AUDIOSTREAMFORMAT_MP4LATM) - aac_cfg.format = 0x04; - else - aac_cfg.format = 0x03; - aac_cfg.ch_cfg = prtd->num_channels; - aac_cfg.sample_rate = prtd->sample_rate; - ret = q6asm_stream_media_format_block_aac(prtd->audio_client, - &aac_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case FORMAT_AC3: - pr_debug("SND_AUDIOCODEC_AC3\n"); - break; - case FORMAT_EAC3: - pr_debug("SND_AUDIOCODEC_EAC3\n"); - break; - case FORMAT_WMA_V9: - pr_debug("SND_AUDIOCODEC_WMA\n"); - memset(&wma_cfg, 0x0, sizeof(struct asm_wma_cfg)); - wma_cfg.format_tag = prtd->codec_param.codec.format; - wma_cfg.ch_cfg = prtd->codec_param.codec.ch_in; - wma_cfg.sample_rate = prtd->sample_rate; - wma_cfg.avg_bytes_per_sec = codec_options->wma.avg_bit_rate/8; - wma_cfg.block_align = codec_options->wma.super_block_align; - wma_cfg.valid_bits_per_sample = - codec_options->wma.bits_per_sample; - wma_cfg.ch_mask = codec_options->wma.channelmask; - wma_cfg.encode_opt = codec_options->wma.encodeopt; - ret = q6asm_media_format_block_wma(prtd->audio_client, - &wma_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case FORMAT_WMA_V10PRO: - pr_debug("SND_AUDIOCODEC_WMA_PRO\n"); - memset(&wma_pro_cfg, 0x0, sizeof(struct asm_wmapro_cfg)); - wma_pro_cfg.format_tag = prtd->codec_param.codec.format; - wma_pro_cfg.ch_cfg = prtd->codec_param.codec.ch_in; - wma_pro_cfg.sample_rate = prtd->sample_rate; - wma_cfg.avg_bytes_per_sec = codec_options->wma.avg_bit_rate/8; - wma_pro_cfg.block_align = codec_options->wma.super_block_align; - wma_pro_cfg.valid_bits_per_sample = - codec_options->wma.bits_per_sample; - wma_pro_cfg.ch_mask = codec_options->wma.channelmask; - wma_pro_cfg.encode_opt = codec_options->wma.encodeopt; - wma_pro_cfg.adv_encode_opt = codec_options->wma.encodeopt1; - wma_pro_cfg.adv_encode_opt2 = codec_options->wma.encodeopt2; - ret = q6asm_media_format_block_wmapro(prtd->audio_client, - &wma_pro_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case FORMAT_MP2: - pr_debug("%s: SND_AUDIOCODEC_MP2\n", __func__); - break; - case FORMAT_FLAC: - pr_debug("%s: SND_AUDIOCODEC_FLAC\n", __func__); - memset(&flac_cfg, 0x0, sizeof(struct asm_flac_cfg)); - flac_cfg.ch_cfg = prtd->num_channels; - flac_cfg.sample_rate = prtd->sample_rate; - flac_cfg.stream_info_present = 1; - flac_cfg.sample_size = codec_options->flac_dec.sample_size; - flac_cfg.min_blk_size = codec_options->flac_dec.min_blk_size; - flac_cfg.max_blk_size = codec_options->flac_dec.max_blk_size; - flac_cfg.max_frame_size = - codec_options->flac_dec.max_frame_size; - flac_cfg.min_frame_size = - codec_options->flac_dec.min_frame_size; - - ret = q6asm_stream_media_format_block_flac(prtd->audio_client, - &flac_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - - break; - case FORMAT_VORBIS: - pr_debug("%s: SND_AUDIOCODEC_VORBIS\n", __func__); - memset(&vorbis_cfg, 0x0, sizeof(struct asm_vorbis_cfg)); - vorbis_cfg.bit_stream_fmt = - codec_options->vorbis_dec.bit_stream_fmt; - - ret = q6asm_stream_media_format_block_vorbis( - prtd->audio_client, &vorbis_cfg, - stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - - break; - case FORMAT_ALAC: - pr_debug("%s: SND_AUDIOCODEC_ALAC\n", __func__); - memset(&alac_cfg, 0x0, sizeof(struct asm_alac_cfg)); - alac_cfg.num_channels = prtd->num_channels; - alac_cfg.sample_rate = prtd->sample_rate; - alac_cfg.frame_length = codec_options->alac.frame_length; - alac_cfg.compatible_version = - codec_options->alac.compatible_version; - alac_cfg.bit_depth = codec_options->alac.bit_depth; - alac_cfg.pb = codec_options->alac.pb; - alac_cfg.mb = codec_options->alac.mb; - alac_cfg.kb = codec_options->alac.kb; - alac_cfg.max_run = codec_options->alac.max_run; - alac_cfg.max_frame_bytes = codec_options->alac.max_frame_bytes; - alac_cfg.avg_bit_rate = codec_options->alac.avg_bit_rate; - alac_cfg.channel_layout_tag = - codec_options->alac.channel_layout_tag; - - ret = q6asm_media_format_block_alac(prtd->audio_client, - &alac_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_APE: - pr_debug("%s: SND_AUDIOCODEC_APE\n", __func__); - memset(&ape_cfg, 0x0, sizeof(struct asm_ape_cfg)); - ape_cfg.num_channels = prtd->num_channels; - ape_cfg.sample_rate = prtd->sample_rate; - ape_cfg.compatible_version = - codec_options->ape.compatible_version; - ape_cfg.compression_level = - codec_options->ape.compression_level; - ape_cfg.format_flags = codec_options->ape.format_flags; - ape_cfg.blocks_per_frame = codec_options->ape.blocks_per_frame; - ape_cfg.final_frame_blocks = - codec_options->ape.final_frame_blocks; - ape_cfg.total_frames = codec_options->ape.total_frames; - ape_cfg.bits_per_sample = codec_options->ape.bits_per_sample; - ape_cfg.seek_table_present = - codec_options->ape.seek_table_present; - - ret = q6asm_media_format_block_ape(prtd->audio_client, - &ape_cfg, stream_id); - - if (ret < 0) - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_DTS: - pr_debug("SND_AUDIOCODEC_DTS\n"); - /* no media format block needed */ - break; - case FORMAT_DSD: - pr_debug("%s: SND_AUDIOCODEC_DSD\n", __func__); - memset(&dsd_cfg, 0x0, sizeof(struct asm_dsd_cfg)); - dsd_cfg.num_channels = prtd->num_channels; - dsd_cfg.dsd_data_rate = prtd->sample_rate; - dsd_cfg.num_version = 0; - dsd_cfg.is_bitwise_big_endian = 1; - dsd_cfg.dsd_channel_block_size = 1; - ret = q6asm_media_format_block_dsd(prtd->audio_client, - &dsd_cfg, stream_id); - if (ret < 0) - pr_err("%s: CMD DSD Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_TRUEHD: - pr_debug("SND_AUDIOCODEC_TRUEHD\n"); - /* no media format block needed */ - break; - case FORMAT_IEC61937: - pr_debug("SND_AUDIOCODEC_IEC61937\n"); - ret = q6asm_media_format_block_iec(prtd->audio_client, - prtd->sample_rate, - prtd->num_channels); - if (ret < 0) - pr_err("%s: CMD IEC61937 Format block failed ret %d\n", - __func__, ret); - break; - case FORMAT_APTX: - pr_debug("SND_AUDIOCODEC_APTX\n"); - memset(&aptx_cfg, 0x0, sizeof(struct aptx_dec_bt_addr_cfg)); - ret = q6asm_stream_media_format_block_aptx_dec( - prtd->audio_client, - prtd->sample_rate, - stream_id); - if (ret >= 0) { - aptx_cfg.nap = codec_options->aptx_dec.nap; - aptx_cfg.uap = codec_options->aptx_dec.uap; - aptx_cfg.lap = codec_options->aptx_dec.lap; - q6asm_set_aptx_dec_bt_addr(prtd->audio_client, - &aptx_cfg); - } else { - pr_err("%s: CMD Format block failed ret %d\n", - __func__, ret); - } - break; - default: - pr_debug("%s, unsupported format, skip", __func__); - break; - } - return ret; -} - -static int msm_compr_init_pp_params(struct snd_compr_stream *cstream, - struct audio_client *ac) -{ - int ret = 0; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - switch (ac->topology) { - default: - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - - break; - } - return ret; -} - -static int msm_compr_configure_dsp_for_playback - (struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = cstream->private_data; - uint16_t bits_per_sample = 24; - int dir = IN, ret = 0; - struct audio_client *ac = prtd->audio_client; - uint32_t stream_index; - struct asm_softpause_params softpause = { - .enable = SOFT_PAUSE_ENABLE, - .period = SOFT_PAUSE_PERIOD, - .step = SOFT_PAUSE_STEP, - .rampingcurve = SOFT_PAUSE_CURVE_LINEAR, - }; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - struct snd_kcontrol *kctl; - struct snd_ctl_elem_value kctl_elem_value; - uint16_t target_asm_bit_width = 0; - - pr_debug("%s: stream_id %d\n", __func__, ac->stream_id); - stream_index = STREAM_ARRAY_INDEX(ac->stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || stream_index < 0) { - pr_err("%s: Invalid stream index:%d", __func__, stream_index); - return -EINVAL; - } - - kctl = snd_soc_card_get_kcontrol(soc_prtd->card, - DSP_BIT_WIDTH_MIXER_CTL); - if (kctl) { - kctl->get(kctl, &kctl_elem_value); - target_asm_bit_width = kctl_elem_value.value.integer.value[0]; - if (target_asm_bit_width > 0) { - pr_debug("%s enforce ASM bitwidth to %d from %d\n", - __func__, - target_asm_bit_width, - bits_per_sample); - bits_per_sample = target_asm_bit_width; - } - } else { - pr_info("%s: failed to get mixer ctl for %s.\n", - __func__, DSP_BIT_WIDTH_MIXER_CTL); - } - - if ((prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S24_LE) || - (prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S24_3LE)) - bits_per_sample = 24; - else if (prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S32_LE) - bits_per_sample = 32; - - if (prtd->compr_passthr != LEGACY_PCM) { - ret = q6asm_open_write_compressed(ac, prtd->codec, - prtd->compr_passthr); - if (ret < 0) { - pr_err("%s:ASM open write err[%d] for compr_type[%d]\n", - __func__, ret, prtd->compr_passthr); - return ret; - } - prtd->gapless_state.stream_opened[stream_index] = 1; - - ret = msm_pcm_routing_reg_phy_compr_stream( - soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_PLAYBACK, - prtd->compr_passthr); - if (ret) { - pr_err("%s: compr stream reg failed:%d\n", __func__, - ret); - return ret; - } - } else { - pr_debug("%s: stream_id %d bits_per_sample %d\n", - __func__, ac->stream_id, bits_per_sample); - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) - ret = q6asm_stream_open_write_v5(ac, - prtd->codec, bits_per_sample, - ac->stream_id, - prtd->gapless_state.use_dsp_gapless_mode); - else - ret = q6asm_stream_open_write_v4(ac, - prtd->codec, bits_per_sample, - ac->stream_id, - prtd->gapless_state.use_dsp_gapless_mode); - if (ret < 0) { - pr_err("%s:ASM open write err[%d] for compr type[%d]\n", - __func__, ret, prtd->compr_passthr); - return -ENOMEM; - } - prtd->gapless_state.stream_opened[stream_index] = 1; - - pr_debug("%s: BE id %d\n", __func__, soc_prtd->dai_link->id); - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_PLAYBACK); - if (ret) { - pr_err("%s: stream reg failed:%d\n", __func__, ret); - return ret; - } - } - - ret = msm_compr_set_volume(cstream, 0, 0); - if (ret < 0) - pr_err("%s : Set Volume failed : %d", __func__, ret); - - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s : Don't send cal and PP params for compress path", - __func__); - } else { - ret = q6asm_send_cal(ac); - if (ret < 0) - pr_debug("%s : Send cal failed : %d", __func__, ret); - - ret = q6asm_set_softpause(ac, &softpause); - if (ret < 0) - pr_err("%s: Send SoftPause Param failed ret=%d\n", - __func__, ret); - - ret = q6asm_set_softvolume(ac, &softvol); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - } - ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -EINVAL; - } - - runtime->fragments = prtd->codec_param.buffer.fragments; - runtime->fragment_size = prtd->codec_param.buffer.fragment_size; - pr_debug("allocate %d buffers each of size %d\n", - runtime->fragments, - runtime->fragment_size); - ret = q6asm_audio_client_buf_alloc_contiguous(dir, ac, - runtime->fragment_size, - runtime->fragments); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret); - return -ENOMEM; - } - - prtd->byte_offset = 0; - prtd->copied_total = 0; - prtd->app_pointer = 0; - prtd->bytes_received = 0; - prtd->bytes_sent = 0; - prtd->buffer = ac->port[dir].buf[0].data; - prtd->buffer_paddr = ac->port[dir].buf[0].phys; - prtd->buffer_size = runtime->fragments * runtime->fragment_size; - - /* Bit-0 of flags represent timestamp mode */ - if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) - prtd->ts_header_offset = sizeof(struct snd_codec_metadata); - else - prtd->ts_header_offset = 0; - - ret = msm_compr_send_media_format_block(cstream, ac->stream_id, false); - if (ret < 0) - pr_err("%s, failed to send media format block\n", __func__); - - return ret; -} - -static int msm_compr_configure_dsp_for_capture(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = cstream->private_data; - uint16_t bits_per_sample; - uint16_t sample_word_size; - int dir = OUT, ret = 0; - struct audio_client *ac = prtd->audio_client; - uint32_t stream_index; - uint32_t enc_cfg_id = ENC_CFG_ID_NONE; - - switch (prtd->codec_param.codec.format) { - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - bits_per_sample = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - if (prtd->codec == FORMAT_BESPOKE) - enc_cfg_id = - prtd->codec_param.codec.options.generic.reserved[0]; - break; - } - - pr_debug("%s: stream_id %d bits_per_sample %d compr_passthr %d\n", - __func__, ac->stream_id, bits_per_sample, - prtd->compr_passthr); - - if (prtd->compr_passthr != LEGACY_PCM) { - ret = q6asm_open_read_compressed(prtd->audio_client, - prtd->codec, prtd->compr_passthr); - if (ret < 0) { - pr_err("%s:ASM open read err[%d] for compr_type[%d]\n", - __func__, ret, prtd->compr_passthr); - return ret; - } - - ret = msm_pcm_routing_reg_phy_compr_stream( - soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_CAPTURE, - prtd->compr_passthr); - if (ret) { - pr_err("%s: compr stream reg failed:%d\n", - __func__, ret); - return ret; - } - } else { - if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) { - ret = q6asm_open_read_v4(prtd->audio_client, - prtd->codec, - bits_per_sample, true, enc_cfg_id); - } else { - ret = q6asm_open_read_v4(prtd->audio_client, - prtd->codec, - bits_per_sample, false, enc_cfg_id); - } - if (ret < 0) { - pr_err("%s: q6asm_open_read failed:%d\n", - __func__, ret); - return ret; - } - - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - ac->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_CAPTURE); - if (ret) { - pr_err("%s: stream reg failed:%d\n", __func__, ret); - return ret; - } - } - - ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -EINVAL; - } - - stream_index = STREAM_ARRAY_INDEX(ac->stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || stream_index < 0) { - pr_err("%s: Invalid stream index:%d", __func__, stream_index); - return -EINVAL; - } - - runtime->fragments = prtd->codec_param.buffer.fragments; - runtime->fragment_size = prtd->codec_param.buffer.fragment_size; - pr_debug("%s: allocate %d buffers each of size %d\n", - __func__, runtime->fragments, - runtime->fragment_size); - ret = q6asm_audio_client_buf_alloc_contiguous(dir, ac, - runtime->fragment_size, - runtime->fragments); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret); - return -ENOMEM; - } - - prtd->byte_offset = 0; - prtd->received_total = 0; - prtd->app_pointer = 0; - prtd->bytes_copied = 0; - prtd->bytes_read = 0; - prtd->bytes_read_offset = 0; - prtd->buffer = ac->port[dir].buf[0].data; - prtd->buffer_paddr = ac->port[dir].buf[0].phys; - prtd->buffer_size = runtime->fragments * runtime->fragment_size; - - /* Bit-0 of flags represent timestamp mode */ - if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) - prtd->ts_header_offset = sizeof(struct snd_codec_metadata); - else - prtd->ts_header_offset = 0; - - pr_debug("%s: sample_rate = %d channels = %d bps = %d sample_word_size = %d\n", - __func__, prtd->sample_rate, prtd->num_channels, - bits_per_sample, sample_word_size); - if (prtd->codec == FORMAT_BESPOKE) { - /* - * For BESPOKE codec, encoder specific config params are - * included as part of generic. - */ - ret = q6asm_enc_cfg_blk_custom(prtd->audio_client, prtd->sample_rate, - prtd->num_channels, prtd->codec, - (void *)&prtd->codec_param.codec.options.generic); - } else if (prtd->compr_passthr == LEGACY_PCM) { - ret = q6asm_enc_cfg_blk_pcm_format_support_v4(prtd->audio_client, - prtd->sample_rate, prtd->num_channels, - bits_per_sample, sample_word_size, - ASM_LITTLE_ENDIAN, DEFAULT_QF); - } - - return ret; -} - -static int msm_compr_playback_open(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_audio *prtd = NULL; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - enum apr_subsys_state q6_state; - - pr_debug("%s\n", __func__); - if (pdata->is_in_use[rtd->dai_link->id] == true) { - pr_err("%s: %s is already in use, err: %d\n", - __func__, rtd->dai_link->cpu_dai_name, -EBUSY); - return -EBUSY; - } - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - prtd = kzalloc(sizeof(struct msm_compr_audio), GFP_KERNEL); - if (prtd == NULL) { - pr_err("Failed to allocate memory for msm_compr_audio\n"); - return -ENOMEM; - } - - runtime->private_data = NULL; - prtd->cstream = cstream; - pdata->cstream[rtd->dai_link->id] = cstream; - pdata->audio_effects[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_compr_audio_effects), GFP_KERNEL); - if (pdata->audio_effects[rtd->dai_link->id] == NULL) { - pr_err("%s: Could not allocate memory for effects\n", __func__); - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - return -ENOMEM; - } - pdata->dec_params[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_compr_dec_params), GFP_KERNEL); - if (pdata->dec_params[rtd->dai_link->id] == NULL) { - pr_err("%s: Could not allocate memory for dec params\n", - __func__); - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - return -ENOMEM; - } - prtd->codec = FORMAT_MP3; - prtd->bytes_received = 0; - prtd->bytes_sent = 0; - prtd->copied_total = 0; - prtd->byte_offset = 0; - prtd->sample_rate = 44100; - prtd->num_channels = 2; - prtd->drain_ready = 0; - prtd->last_buffer = 0; - prtd->first_buffer = 1; - prtd->partial_drain_delay = 0; - prtd->next_stream = 0; - memset(&prtd->gapless_state, 0, sizeof(struct msm_compr_gapless_state)); - /* - * Update the use_dsp_gapless_mode from gapless struture with the value - * part of platform data. - */ - prtd->gapless_state.use_dsp_gapless_mode = pdata->use_dsp_gapless_mode; - - pr_debug("%s: gapless mode %d", __func__, pdata->use_dsp_gapless_mode); - - spin_lock_init(&prtd->lock); - - atomic_set(&prtd->eos, 0); - atomic_set(&prtd->start, 0); - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 0); - atomic_set(&prtd->close, 0); - atomic_set(&prtd->wait_on_close, 0); - atomic_set(&prtd->error, 0); - - init_waitqueue_head(&prtd->eos_wait); - init_waitqueue_head(&prtd->drain_wait); - init_waitqueue_head(&prtd->close_wait); - init_waitqueue_head(&prtd->wait_for_stream_avail); - - runtime->private_data = prtd; - populate_codec_list(prtd); - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)compr_event_handler, prtd); - if (prtd->audio_client == NULL) { - pr_err("%s: Could not allocate memory for client\n", __func__); - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - kfree(pdata->dec_params[rtd->dai_link->id]); - pdata->dec_params[rtd->dai_link->id] = NULL; - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - runtime->private_data = NULL; - return -ENOMEM; - } - pr_debug("%s: session ID %d\n", __func__, prtd->audio_client->session); - prtd->audio_client->perf_mode = false; - prtd->session_id = prtd->audio_client->session; - msm_adsp_init_mixer_ctl_pp_event_queue(rtd); - pdata->is_in_use[rtd->dai_link->id] = true; - return 0; -} - -static int msm_compr_capture_open(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_audio *prtd; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - enum apr_subsys_state q6_state; - - pr_debug("%s\n", __func__); - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - prtd = kzalloc(sizeof(struct msm_compr_audio), GFP_KERNEL); - if (prtd == NULL) { - pr_err("Failed to allocate memory for msm_compr_audio\n"); - return -ENOMEM; - } - - runtime->private_data = NULL; - prtd->cstream = cstream; - pdata->cstream[rtd->dai_link->id] = cstream; - - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)compr_event_handler, prtd); - if (!prtd->audio_client) { - pr_err("%s: Could not allocate memory for client\n", __func__); - pdata->cstream[rtd->dai_link->id] = NULL; - kfree(prtd); - return -ENOMEM; - } - pr_debug("%s: session ID %d\n", __func__, prtd->audio_client->session); - prtd->audio_client->perf_mode = false; - prtd->session_id = prtd->audio_client->session; - prtd->codec = FORMAT_LINEAR_PCM; - prtd->bytes_copied = 0; - prtd->bytes_read = 0; - prtd->bytes_read_offset = 0; - prtd->received_total = 0; - prtd->byte_offset = 0; - prtd->sample_rate = 48000; - prtd->num_channels = 2; - prtd->first_buffer = 0; - - spin_lock_init(&prtd->lock); - - atomic_set(&prtd->eos, 0); - atomic_set(&prtd->start, 0); - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 0); - atomic_set(&prtd->close, 0); - atomic_set(&prtd->wait_on_close, 0); - atomic_set(&prtd->error, 0); - - init_waitqueue_head(&prtd->eos_wait); - init_waitqueue_head(&prtd->drain_wait); - init_waitqueue_head(&prtd->close_wait); - init_waitqueue_head(&prtd->wait_for_stream_avail); - - runtime->private_data = prtd; - - return 0; -} - -static int msm_compr_open(struct snd_compr_stream *cstream) -{ - int ret = 0; - - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_playback_open(cstream); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_capture_open(cstream); - return ret; -} - -static int msm_compr_playback_free(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime; - struct msm_compr_audio *prtd; - struct snd_soc_pcm_runtime *soc_prtd; - struct msm_compr_pdata *pdata; - struct audio_client *ac; - int dir = IN, ret = 0, stream_id; - unsigned long flags; - uint32_t stream_index; - - pr_debug("%s\n", __func__); - - if (!cstream) { - pr_err("%s cstream is null\n", __func__); - return 0; - } - runtime = cstream->runtime; - soc_prtd = cstream->private_data; - if (!runtime || !soc_prtd || !(soc_prtd->platform)) { - pr_err("%s runtime or soc_prtd or platform is null\n", - __func__); - return 0; - } - prtd = runtime->private_data; - if (!prtd) { - pr_err("%s prtd is null\n", __func__); - return 0; - } - prtd->cmd_interrupt = 1; - wake_up(&prtd->drain_wait); - pdata = snd_soc_platform_get_drvdata(soc_prtd->platform); - ac = prtd->audio_client; - if (!pdata || !ac) { - pr_err("%s pdata or ac is null\n", __func__); - return 0; - } - if (atomic_read(&prtd->eos)) { - ret = wait_event_timeout(prtd->eos_wait, - prtd->eos_ack, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: CMD_EOS failed\n", __func__); - } - if (atomic_read(&prtd->close)) { - prtd->cmd_ack = 0; - atomic_set(&prtd->wait_on_close, 1); - ret = wait_event_timeout(prtd->close_wait, - prtd->cmd_ack, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: CMD_CLOSE failed\n", __func__); - } - - spin_lock_irqsave(&prtd->lock, flags); - stream_id = ac->stream_id; - stream_index = STREAM_ARRAY_INDEX(NEXT_STREAM_ID(stream_id)); - - if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0) && - (prtd->gapless_state.stream_opened[stream_index])) { - prtd->gapless_state.stream_opened[stream_index] = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - pr_debug(" close stream %d", NEXT_STREAM_ID(stream_id)); - q6asm_stream_cmd(ac, CMD_CLOSE, NEXT_STREAM_ID(stream_id)); - spin_lock_irqsave(&prtd->lock, flags); - } - - stream_index = STREAM_ARRAY_INDEX(stream_id); - if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0) && - (prtd->gapless_state.stream_opened[stream_index])) { - prtd->gapless_state.stream_opened[stream_index] = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - pr_debug("close stream %d", stream_id); - q6asm_stream_cmd(ac, CMD_CLOSE, stream_id); - spin_lock_irqsave(&prtd->lock, flags); - } - spin_unlock_irqrestore(&prtd->lock, flags); - - mutex_lock(&pdata->lock); - pdata->cstream[soc_prtd->dai_link->id] = NULL; - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_PLAYBACK); - } - - q6asm_audio_client_buf_free_contiguous(dir, ac); - - q6asm_audio_client_free(ac); - msm_adsp_clean_mixer_ctl_pp_event_queue(soc_prtd); - if (pdata->audio_effects[soc_prtd->dai_link->id] != NULL) { - kfree(pdata->audio_effects[soc_prtd->dai_link->id]); - pdata->audio_effects[soc_prtd->dai_link->id] = NULL; - } - if (pdata->dec_params[soc_prtd->dai_link->id] != NULL) { - kfree(pdata->dec_params[soc_prtd->dai_link->id]); - pdata->dec_params[soc_prtd->dai_link->id] = NULL; - } - pdata->is_in_use[soc_prtd->dai_link->id] = false; - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_compr_capture_free(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime; - struct msm_compr_audio *prtd; - struct snd_soc_pcm_runtime *soc_prtd; - struct msm_compr_pdata *pdata; - struct audio_client *ac; - int dir = OUT, stream_id; - unsigned long flags; - uint32_t stream_index; - - if (!cstream) { - pr_err("%s cstream is null\n", __func__); - return 0; - } - runtime = cstream->runtime; - soc_prtd = cstream->private_data; - if (!runtime || !soc_prtd || !(soc_prtd->platform)) { - pr_err("%s runtime or soc_prtd or platform is null\n", - __func__); - return 0; - } - prtd = runtime->private_data; - if (!prtd) { - pr_err("%s prtd is null\n", __func__); - return 0; - } - pdata = snd_soc_platform_get_drvdata(soc_prtd->platform); - ac = prtd->audio_client; - if (!pdata || !ac) { - pr_err("%s pdata or ac is null\n", __func__); - return 0; - } - - spin_lock_irqsave(&prtd->lock, flags); - stream_id = ac->stream_id; - - stream_index = STREAM_ARRAY_INDEX(stream_id); - if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0)) { - spin_unlock_irqrestore(&prtd->lock, flags); - pr_debug("close stream %d", stream_id); - q6asm_stream_cmd(ac, CMD_CLOSE, stream_id); - spin_lock_irqsave(&prtd->lock, flags); - } - spin_unlock_irqrestore(&prtd->lock, flags); - - mutex_lock(&pdata->lock); - pdata->cstream[soc_prtd->dai_link->id] = NULL; - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - - q6asm_audio_client_buf_free_contiguous(dir, ac); - - q6asm_audio_client_free(ac); - - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_compr_free(struct snd_compr_stream *cstream) -{ - int ret = 0; - - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_playback_free(cstream); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_capture_free(cstream); - return ret; -} - -static bool msm_compr_validate_codec_compr(__u32 codec_id) -{ - int32_t i; - - for (i = 0; i < ARRAY_SIZE(compr_codecs); i++) { - if (compr_codecs[i] == codec_id) - return true; - } - return false; -} - -/* compress stream operations */ -static int msm_compr_set_params(struct snd_compr_stream *cstream, - struct snd_compr_params *params) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - int ret = 0, frame_sz = 0; - int i, num_rates; - bool is_format_gapless = false; - - pr_debug("%s\n", __func__); - - num_rates = sizeof(supported_sample_rates)/sizeof(unsigned int); - for (i = 0; i < num_rates; i++) - if (params->codec.sample_rate == supported_sample_rates[i]) - break; - if (i == num_rates) - return -EINVAL; - - memcpy(&prtd->codec_param, params, sizeof(struct snd_compr_params)); - /* ToDo: remove duplicates */ - prtd->num_channels = prtd->codec_param.codec.ch_in; - prtd->sample_rate = prtd->codec_param.codec.sample_rate; - pr_debug("%s: sample_rate %d\n", __func__, prtd->sample_rate); - - if ((prtd->codec_param.codec.compr_passthr >= LEGACY_PCM && - prtd->codec_param. - codec.compr_passthr <= COMPRESSED_PASSTHROUGH_DSD) || - (prtd->codec_param. - codec.compr_passthr == COMPRESSED_PASSTHROUGH_IEC61937)) - prtd->compr_passthr = prtd->codec_param.codec.compr_passthr; - else - prtd->compr_passthr = LEGACY_PCM; - pr_debug("%s: compr_passthr = %d", __func__, prtd->compr_passthr); - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: Reset gapless mode playback for compr_type[%d]\n", - __func__, prtd->compr_passthr); - prtd->gapless_state.use_dsp_gapless_mode = 0; - if (!msm_compr_validate_codec_compr(params->codec.id)) { - pr_err("%s codec not supported in passthrough,id =%d\n", - __func__, params->codec.id); - return -EINVAL; - } - } - - switch (params->codec.id) { - case SND_AUDIOCODEC_PCM: { - pr_debug("SND_AUDIOCODEC_PCM\n"); - prtd->codec = FORMAT_LINEAR_PCM; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_MP3: { - pr_debug("SND_AUDIOCODEC_MP3\n"); - prtd->codec = FORMAT_MP3; - frame_sz = MP3_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_AAC: { - pr_debug("SND_AUDIOCODEC_AAC\n"); - prtd->codec = FORMAT_MPEG4_AAC; - frame_sz = AAC_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_AC3: { - pr_debug("SND_AUDIOCODEC_AC3\n"); - prtd->codec = FORMAT_AC3; - frame_sz = AC3_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_EAC3: { - pr_debug("SND_AUDIOCODEC_EAC3\n"); - prtd->codec = FORMAT_EAC3; - frame_sz = EAC3_OUTPUT_FRAME_SZ; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_MP2: { - pr_debug("SND_AUDIOCODEC_MP2\n"); - prtd->codec = FORMAT_MP2; - break; - } - - case SND_AUDIOCODEC_WMA: { - pr_debug("SND_AUDIOCODEC_WMA\n"); - prtd->codec = FORMAT_WMA_V9; - break; - } - - case SND_AUDIOCODEC_WMA_PRO: { - pr_debug("SND_AUDIOCODEC_WMA_PRO\n"); - prtd->codec = FORMAT_WMA_V10PRO; - break; - } - - case SND_AUDIOCODEC_FLAC: { - pr_debug("%s: SND_AUDIOCODEC_FLAC\n", __func__); - prtd->codec = FORMAT_FLAC; - /* - * DSP bufferring is based on blk size, - * consider mininum buffering to rule out any false wait - */ - frame_sz = - prtd->codec_param.codec.options.flac_dec.min_blk_size; - is_format_gapless = true; - break; - } - - case SND_AUDIOCODEC_VORBIS: { - pr_debug("%s: SND_AUDIOCODEC_VORBIS\n", __func__); - prtd->codec = FORMAT_VORBIS; - break; - } - - case SND_AUDIOCODEC_ALAC: { - pr_debug("%s: SND_AUDIOCODEC_ALAC\n", __func__); - prtd->codec = FORMAT_ALAC; - break; - } - - case SND_AUDIOCODEC_APE: { - pr_debug("%s: SND_AUDIOCODEC_APE\n", __func__); - prtd->codec = FORMAT_APE; - break; - } - - case SND_AUDIOCODEC_DTS: { - pr_debug("%s: SND_AUDIOCODEC_DTS\n", __func__); - prtd->codec = FORMAT_DTS; - break; - } - - case SND_AUDIOCODEC_DSD: { - pr_debug("%s: SND_AUDIOCODEC_DSD\n", __func__); - prtd->codec = FORMAT_DSD; - break; - } - - case SND_AUDIOCODEC_TRUEHD: { - pr_debug("%s: SND_AUDIOCODEC_TRUEHD\n", __func__); - prtd->codec = FORMAT_TRUEHD; - break; - } - - case SND_AUDIOCODEC_IEC61937: { - pr_debug("%s: SND_AUDIOCODEC_IEC61937\n", __func__); - prtd->codec = FORMAT_IEC61937; - break; - } - - case SND_AUDIOCODEC_APTX: { - pr_debug("%s: SND_AUDIOCODEC_APTX\n", __func__); - prtd->codec = FORMAT_APTX; - break; - } - - case SND_AUDIOCODEC_BESPOKE: { - pr_debug("%s: SND_AUDIOCODEC_BESPOKE\n", __func__); - prtd->codec = FORMAT_BESPOKE; - break; - } - - default: - pr_err("codec not supported, id =%d\n", params->codec.id); - return -EINVAL; - } - - if (!is_format_gapless) - prtd->gapless_state.use_dsp_gapless_mode = false; - - prtd->partial_drain_delay = - msm_compr_get_partial_drain_delay(frame_sz, prtd->sample_rate); - - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_configure_dsp_for_playback(cstream); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_configure_dsp_for_capture(cstream); - - return ret; -} - -static int msm_compr_drain_buffer(struct msm_compr_audio *prtd, - unsigned long *flags) -{ - int rc = 0; - - atomic_set(&prtd->drain, 1); - prtd->drain_ready = 0; - spin_unlock_irqrestore(&prtd->lock, *flags); - pr_debug("%s: wait for buffer to be drained\n", __func__); - rc = wait_event_interruptible(prtd->drain_wait, - prtd->drain_ready || - prtd->cmd_interrupt || - atomic_read(&prtd->xrun) || - atomic_read(&prtd->error)); - pr_debug("%s: out of buffer drain wait with ret %d\n", __func__, rc); - spin_lock_irqsave(&prtd->lock, *flags); - if (prtd->cmd_interrupt) { - pr_debug("%s: buffer drain interrupted by flush)\n", __func__); - rc = -EINTR; - prtd->cmd_interrupt = 0; - } - if (atomic_read(&prtd->error)) { - pr_err("%s: Got RESET EVENTS notification, return\n", - __func__); - rc = -ENETRESET; - } - return rc; -} - -static int msm_compr_wait_for_stream_avail(struct msm_compr_audio *prtd, - unsigned long *flags) -{ - int rc = 0; - - pr_debug("next session is already in opened state\n"); - prtd->next_stream = 1; - prtd->cmd_interrupt = 0; - spin_unlock_irqrestore(&prtd->lock, *flags); - /* - * Wait for stream to be available, or the wait to be interrupted by - * commands like flush or till a timeout of one second. - */ - rc = wait_event_timeout(prtd->wait_for_stream_avail, - prtd->stream_available || prtd->cmd_interrupt, 1 * HZ); - pr_err("%s:prtd->stream_available %d, prtd->cmd_interrupt %d rc %d\n", - __func__, prtd->stream_available, prtd->cmd_interrupt, rc); - - spin_lock_irqsave(&prtd->lock, *flags); - if (rc == 0) { - pr_err("%s: wait_for_stream_avail timed out\n", - __func__); - rc = -ETIMEDOUT; - } else if (prtd->cmd_interrupt == 1) { - /* - * This scenario might not happen as we do not allow - * flush in transition state. - */ - pr_debug("%s: wait_for_stream_avail interrupted\n", __func__); - prtd->cmd_interrupt = 0; - prtd->stream_available = 0; - rc = -EINTR; - } else { - prtd->stream_available = 0; - rc = 0; - } - pr_debug("%s : rc = %d", __func__, rc); - return rc; -} - -static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_pdata *pdata = - snd_soc_platform_get_drvdata(rtd->platform); - uint32_t *volume = pdata->volume[rtd->dai_link->id]; - struct audio_client *ac = prtd->audio_client; - unsigned long fe_id = rtd->dai_link->id; - int rc = 0; - int bytes_to_write; - unsigned long flags; - int stream_id; - uint32_t stream_index; - uint16_t bits_per_sample = 24; - - spin_lock_irqsave(&prtd->lock, flags); - if (atomic_read(&prtd->error)) { - pr_err("%s Got RESET EVENTS notification, return immediately", - __func__); - spin_unlock_irqrestore(&prtd->lock, flags); - return 0; - } - spin_unlock_irqrestore(&prtd->lock, flags); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - pr_debug("%s: SNDRV_PCM_TRIGGER_START\n", __func__); - atomic_set(&prtd->start, 1); - - /* - * compr_set_volume and compr_init_pp_params - * are used to configure ASM volume hence not - * needed for compress passthrough playback. - * - * compress passthrough volume is controlled in - * ADM by adm_send_compressed_device_mute() - */ - if (prtd->compr_passthr == LEGACY_PCM && - cstream->direction == SND_COMPRESS_PLAYBACK) { - /* set volume for the stream before RUN */ - rc = msm_compr_set_volume(cstream, - volume[0], volume[1]); - if (rc) - pr_err("%s : Set Volume failed : %d\n", - __func__, rc); - - rc = msm_compr_init_pp_params(cstream, ac); - if (rc) - pr_err("%s : init PP params failed : %d\n", - __func__, rc); - } else { - msm_compr_read_buffer(prtd); - } - /* issue RUN command for the stream */ - q6asm_run_nowait(prtd->audio_client, prtd->run_mode, - prtd->start_delay_msw, prtd->start_delay_lsw); - break; - case SNDRV_PCM_TRIGGER_STOP: - spin_lock_irqsave(&prtd->lock, flags); - pr_debug("%s: SNDRV_PCM_TRIGGER_STOP transition %d\n", __func__, - prtd->gapless_state.gapless_transition); - stream_id = ac->stream_id; - atomic_set(&prtd->start, 0); - if (cstream->direction == SND_COMPRESS_CAPTURE) { - q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->xrun, 0); - prtd->received_total = 0; - prtd->bytes_copied = 0; - prtd->bytes_read = 0; - prtd->bytes_read_offset = 0; - prtd->byte_offset = 0; - prtd->app_pointer = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - if (prtd->next_stream) { - pr_debug("%s: interrupt next track wait queues\n", - __func__); - prtd->cmd_interrupt = 1; - wake_up(&prtd->wait_for_stream_avail); - prtd->next_stream = 0; - } - if (atomic_read(&prtd->eos)) { - pr_debug("%s: interrupt eos wait queues", __func__); - /* - * Gapless playback does not wait for eos, do not set - * cmd_int and do not wake up eos_wait during gapless - * transition - */ - if (!prtd->gapless_state.gapless_transition) { - prtd->cmd_interrupt = 1; - wake_up(&prtd->eos_wait); - } - atomic_set(&prtd->eos, 0); - } - if (atomic_read(&prtd->drain)) { - pr_debug("%s: interrupt drain wait queues", __func__); - prtd->cmd_interrupt = 1; - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - atomic_set(&prtd->drain, 0); - } - prtd->last_buffer = 0; - prtd->cmd_ack = 0; - if (!prtd->gapless_state.gapless_transition) { - pr_debug("issue CMD_FLUSH stream_id %d\n", stream_id); - spin_unlock_irqrestore(&prtd->lock, flags); - q6asm_stream_cmd( - prtd->audio_client, CMD_FLUSH, stream_id); - spin_lock_irqsave(&prtd->lock, flags); - } else { - prtd->first_buffer = 0; - } - /* FIXME. only reset if flush was successful */ - prtd->byte_offset = 0; - prtd->copied_total = 0; - prtd->app_pointer = 0; - prtd->bytes_received = 0; - prtd->bytes_sent = 0; - prtd->marker_timestamp = 0; - - atomic_set(&prtd->xrun, 0); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE_PUSH transition %d\n", - prtd->gapless_state.gapless_transition); - if (!prtd->gapless_state.gapless_transition) { - pr_debug("issue CMD_PAUSE stream_id %d\n", - ac->stream_id); - q6asm_stream_cmd_nowait(ac, CMD_PAUSE, ac->stream_id); - atomic_set(&prtd->start, 0); - } - break; - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE_RELEASE transition %d\n", - prtd->gapless_state.gapless_transition); - if (!prtd->gapless_state.gapless_transition) { - atomic_set(&prtd->start, 1); - q6asm_run_nowait(prtd->audio_client, prtd->run_mode, - 0, 0); - } - break; - case SND_COMPR_TRIGGER_PARTIAL_DRAIN: - pr_debug("%s: SND_COMPR_TRIGGER_PARTIAL_DRAIN\n", __func__); - if (!prtd->gapless_state.use_dsp_gapless_mode) { - pr_debug("%s: set partial drain as drain\n", __func__); - cmd = SND_COMPR_TRIGGER_DRAIN; - } - case SND_COMPR_TRIGGER_DRAIN: - pr_debug("%s: SNDRV_COMPRESS_DRAIN\n", __func__); - /* Make sure all the data is sent to DSP before sending EOS */ - spin_lock_irqsave(&prtd->lock, flags); - - if (!atomic_read(&prtd->start)) { - pr_err("%s: stream is not in started state\n", - __func__); - rc = -EPERM; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - if (prtd->bytes_received > prtd->copied_total) { - pr_debug("%s: wait till all the data is sent to dsp\n", - __func__); - rc = msm_compr_drain_buffer(prtd, &flags); - if (rc || !atomic_read(&prtd->start)) { - if (rc != -ENETRESET) - rc = -EINTR; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - /* - * FIXME: Bug. - * Write(32767) - * Start - * Drain <- Indefinite wait - * sol1 : if (prtd->copied_total) then wait? - * sol2 : (prtd->cmd_interrupt || prtd->drain_ready || - * atomic_read(xrun) - */ - bytes_to_write = prtd->bytes_received - - prtd->copied_total; - WARN(bytes_to_write > runtime->fragment_size, - "last write %d cannot be > than fragment_size", - bytes_to_write); - - if (bytes_to_write > 0) { - pr_debug("%s: send %d partial bytes at the end", - __func__, bytes_to_write); - atomic_set(&prtd->xrun, 0); - prtd->last_buffer = 1; - msm_compr_send_buffer(prtd); - } - } - - if ((cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN) && - (prtd->gapless_state.set_next_stream_id)) { - /* wait for the last buffer to be returned */ - - if (prtd->last_buffer) { - pr_debug("%s: last buffer drain\n", __func__); - rc = msm_compr_drain_buffer(prtd, &flags); - if (rc || !atomic_read(&prtd->start)) { - spin_unlock_irqrestore(&prtd->lock, - flags); - break; - } - } - /* send EOS */ - prtd->eos_ack = 0; - atomic_set(&prtd->eos, 1); - pr_debug("issue CMD_EOS stream_id %d\n", ac->stream_id); - q6asm_stream_cmd_nowait(ac, CMD_EOS, ac->stream_id); - pr_info("PARTIAL DRAIN, do not wait for EOS ack\n"); - - /* send a zero length buffer */ - atomic_set(&prtd->xrun, 0); - msm_compr_send_buffer(prtd); - - /* wait for the zero length buffer to be returned */ - pr_debug("%s: zero length buffer drain\n", __func__); - rc = msm_compr_drain_buffer(prtd, &flags); - if (rc || !atomic_read(&prtd->start)) { - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - /* sleep for additional duration partial drain */ - atomic_set(&prtd->drain, 1); - prtd->drain_ready = 0; - pr_debug("%s, additional sleep: %d\n", __func__, - prtd->partial_drain_delay); - spin_unlock_irqrestore(&prtd->lock, flags); - rc = wait_event_timeout(prtd->drain_wait, - prtd->drain_ready || prtd->cmd_interrupt, - msecs_to_jiffies(prtd->partial_drain_delay)); - pr_debug("%s: out of additional wait for low sample rate\n", - __func__); - spin_lock_irqsave(&prtd->lock, flags); - if (prtd->cmd_interrupt) { - pr_debug("%s: additional wait interrupted by flush)\n", - __func__); - rc = -EINTR; - prtd->cmd_interrupt = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - - /* move to next stream and reset vars */ - pr_debug("%s: Moving to next stream in gapless\n", - __func__); - ac->stream_id = NEXT_STREAM_ID(ac->stream_id); - prtd->byte_offset = 0; - prtd->app_pointer = 0; - prtd->first_buffer = 1; - prtd->last_buffer = 0; - /* - * Set gapless transition flag only if EOS hasn't been - * acknowledged already. - */ - if (atomic_read(&prtd->eos)) - prtd->gapless_state.gapless_transition = 1; - prtd->marker_timestamp = 0; - - /* - * Don't reset these as these vars map to - * total_bytes_transferred and total_bytes_available - * directly, only total_bytes_transferred will be - * updated in the next avail() ioctl - * prtd->copied_total = 0; - * prtd->bytes_received = 0; - */ - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 1); - pr_debug("%s: issue CMD_RUN", __func__); - q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - /* - * moving to next stream failed, so reset the gapless state - * set next stream id for the same session so that the same - * stream can be used for gapless playback - */ - prtd->gapless_state.set_next_stream_id = false; - prtd->gapless_state.gapless_transition = 0; - pr_debug("%s:CMD_EOS stream_id %d\n", __func__, ac->stream_id); - - prtd->eos_ack = 0; - atomic_set(&prtd->eos, 1); - q6asm_stream_cmd_nowait(ac, CMD_EOS, ac->stream_id); - - spin_unlock_irqrestore(&prtd->lock, flags); - - - /* Wait indefinitely for DRAIN. Flush can also signal this*/ - rc = wait_event_interruptible(prtd->eos_wait, - (prtd->eos_ack || - prtd->cmd_interrupt || - atomic_read(&prtd->error))); - - if (rc < 0) - pr_err("%s: EOS wait failed\n", __func__); - - pr_debug("%s: SNDRV_COMPRESS_DRAIN out of wait for EOS\n", - __func__); - - if (prtd->cmd_interrupt) - rc = -EINTR; - - if (atomic_read(&prtd->error)) { - pr_err("%s: Got RESET EVENTS notification, return\n", - __func__); - rc = -ENETRESET; - } - - /*FIXME : what if a flush comes while PC is here */ - if (rc == 0) { - /* - * Failed to open second stream in DSP for gapless - * so prepare the current stream in session - * for gapless playback - */ - spin_lock_irqsave(&prtd->lock, flags); - pr_debug("%s:issue CMD_PAUSE stream_id %d", - __func__, ac->stream_id); - q6asm_stream_cmd_nowait(ac, CMD_PAUSE, ac->stream_id); - prtd->cmd_ack = 0; - spin_unlock_irqrestore(&prtd->lock, flags); - - /* - * Cache this time as last known time - */ - if (pdata->use_legacy_api) - q6asm_get_session_time_legacy( - prtd->audio_client, - &prtd->marker_timestamp); - else - q6asm_get_session_time(prtd->audio_client, - &prtd->marker_timestamp); - - spin_lock_irqsave(&prtd->lock, flags); - /* - * Don't reset these as these vars map to - * total_bytes_transferred and total_bytes_available. - * Just total_bytes_transferred will be updated - * in the next avail() ioctl. - * prtd->copied_total = 0; - * prtd->bytes_received = 0; - * do not reset prtd->bytes_sent as well as the same - * session is used for gapless playback - */ - prtd->byte_offset = 0; - - prtd->app_pointer = 0; - prtd->first_buffer = 1; - prtd->last_buffer = 0; - atomic_set(&prtd->drain, 0); - atomic_set(&prtd->xrun, 1); - spin_unlock_irqrestore(&prtd->lock, flags); - - pr_debug("%s:issue CMD_FLUSH ac->stream_id %d", - __func__, ac->stream_id); - q6asm_stream_cmd(ac, CMD_FLUSH, ac->stream_id); - - q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - } - prtd->cmd_interrupt = 0; - break; - case SND_COMPR_TRIGGER_NEXT_TRACK: - if (!prtd->gapless_state.use_dsp_gapless_mode) { - pr_debug("%s: ignore trigger next track\n", __func__); - rc = 0; - break; - } - pr_debug("%s: SND_COMPR_TRIGGER_NEXT_TRACK\n", __func__); - spin_lock_irqsave(&prtd->lock, flags); - rc = 0; - /* next stream in gapless */ - stream_id = NEXT_STREAM_ID(ac->stream_id); - /* - * Wait if stream 1 has not completed before honoring next - * track for stream 3. Scenario happens if second clip is - * small and fills in one buffer so next track will be - * called immediately. - */ - stream_index = STREAM_ARRAY_INDEX(stream_id); - if (stream_index >= MAX_NUMBER_OF_STREAMS || - stream_index < 0) { - pr_err("%s: Invalid stream index: %d", __func__, - stream_index); - spin_unlock_irqrestore(&prtd->lock, flags); - rc = -EINVAL; - break; - } - - if (prtd->gapless_state.stream_opened[stream_index]) { - if (prtd->gapless_state.gapless_transition) { - rc = msm_compr_wait_for_stream_avail(prtd, - &flags); - } else { - /* - * If session is already opened break out if - * the state is not gapless transition. This - * is when seek happens after the last buffer - * is sent to the driver. Next track would be - * called again after last buffer is sent. - */ - pr_debug("next session is in opened state\n"); - spin_unlock_irqrestore(&prtd->lock, flags); - break; - } - } - spin_unlock_irqrestore(&prtd->lock, flags); - if (rc < 0) { - /* - * if return type EINTR then reset to zero. Tiny - * compress treats EINTR as error and prevents PARTIAL - * DRAIN. EINTR is not an error. wait for stream avail - * is interrupted by some other command like FLUSH. - */ - if (rc == -EINTR) { - pr_debug("%s: EINTR reset rc to 0\n", __func__); - rc = 0; - } - break; - } - - if (prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S24_LE) - bits_per_sample = 24; - else if (prtd->codec_param.codec.format == - SNDRV_PCM_FORMAT_S32_LE) - bits_per_sample = 32; - - pr_debug("%s: open_write stream_id %d bits_per_sample %d", - __func__, stream_id, bits_per_sample); - rc = q6asm_stream_open_write_v4(prtd->audio_client, - prtd->codec, bits_per_sample, - stream_id, - prtd->gapless_state.use_dsp_gapless_mode); - if (rc < 0) { - pr_err("%s: Session out open failed for gapless\n", - __func__); - break; - } - - spin_lock_irqsave(&prtd->lock, flags); - prtd->gapless_state.stream_opened[stream_index] = 1; - prtd->gapless_state.set_next_stream_id = true; - spin_unlock_irqrestore(&prtd->lock, flags); - - rc = msm_compr_send_media_format_block(cstream, - stream_id, false); - if (rc < 0) { - pr_err("%s, failed to send media format block\n", - __func__); - break; - } - msm_compr_send_dec_params(cstream, pdata->dec_params[fe_id], - stream_id); - break; - } - - return rc; -} - -static int msm_compr_pointer(struct snd_compr_stream *cstream, - struct snd_compr_tstamp *arg) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct msm_compr_audio *prtd = runtime->private_data; - struct msm_compr_pdata *pdata = NULL; - struct snd_compr_tstamp tstamp; - uint64_t timestamp = 0; - int rc = 0, first_buffer; - unsigned long flags; - uint32_t gapless_transition; - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pr_debug("%s\n", __func__); - memset(&tstamp, 0x0, sizeof(struct snd_compr_tstamp)); - - spin_lock_irqsave(&prtd->lock, flags); - tstamp.sampling_rate = prtd->sample_rate; - tstamp.byte_offset = prtd->byte_offset; - if (cstream->direction == SND_COMPRESS_PLAYBACK) - tstamp.copied_total = prtd->copied_total; - else if (cstream->direction == SND_COMPRESS_CAPTURE) - tstamp.copied_total = prtd->received_total; - first_buffer = prtd->first_buffer; - if (atomic_read(&prtd->error)) { - pr_err_ratelimited("%s Got RESET EVENTS notification, return error\n", - __func__); - if (cstream->direction == SND_COMPRESS_PLAYBACK) - runtime->total_bytes_transferred = tstamp.copied_total; - else - runtime->total_bytes_available = tstamp.copied_total; - tstamp.pcm_io_frames = 0; - memcpy(arg, &tstamp, sizeof(struct snd_compr_tstamp)); - spin_unlock_irqrestore(&prtd->lock, flags); - return -ENETRESET; - } - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - - gapless_transition = prtd->gapless_state.gapless_transition; - spin_unlock_irqrestore(&prtd->lock, flags); - if (gapless_transition) - pr_debug("%s session time in gapless transition", - __func__); - /* - *- Do not query if no buffer has been given. - *- Do not query on a gapless transition. - * Playback for the 2nd stream can start (thus returning time - * starting from 0) before the driver knows about EOS of first - * stream. - */ - if (!first_buffer || gapless_transition) { - - if (pdata->use_legacy_api) - rc = q6asm_get_session_time_legacy( - prtd->audio_client, &prtd->marker_timestamp); - else - rc = q6asm_get_session_time( - prtd->audio_client, &prtd->marker_timestamp); - if (rc < 0) { - if (atomic_read(&prtd->error)) - return -ENETRESET; - else - return rc; - } - } - } else { - spin_unlock_irqrestore(&prtd->lock, flags); - } - timestamp = prtd->marker_timestamp; - - /* DSP returns timestamp in usec */ - pr_debug("%s: timestamp = %lld usec\n", __func__, timestamp); - timestamp *= prtd->sample_rate; - tstamp.pcm_io_frames = (snd_pcm_uframes_t)div64_u64(timestamp, 1000000); - memcpy(arg, &tstamp, sizeof(struct snd_compr_tstamp)); - - return 0; -} - -static int msm_compr_ack(struct snd_compr_stream *cstream, - size_t count) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - void *src, *dstn; - size_t copy; - unsigned long flags; - - WARN(1, "This path is untested"); - return -EINVAL; - - pr_debug("%s: count = %zd\n", __func__, count); - if (!prtd->buffer) { - pr_err("%s: Buffer is not allocated yet ??\n", __func__); - return -EINVAL; - } - src = runtime->buffer + prtd->app_pointer; - dstn = prtd->buffer + prtd->app_pointer; - if (count < prtd->buffer_size - prtd->app_pointer) { - memcpy(dstn, src, count); - prtd->app_pointer += count; - } else { - copy = prtd->buffer_size - prtd->app_pointer; - memcpy(dstn, src, copy); - memcpy(prtd->buffer, runtime->buffer, count - copy); - prtd->app_pointer = count - copy; - } - - /* - * If the stream is started and all the bytes received were - * copied to DSP, the newly received bytes should be - * sent right away - */ - spin_lock_irqsave(&prtd->lock, flags); - - if (atomic_read(&prtd->start) && - prtd->bytes_received == prtd->copied_total) { - prtd->bytes_received += count; - msm_compr_send_buffer(prtd); - } else - prtd->bytes_received += count; - - spin_unlock_irqrestore(&prtd->lock, flags); - - return 0; -} - -static int msm_compr_playback_copy(struct snd_compr_stream *cstream, - char __user *buf, size_t count) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - void *dstn; - size_t copy; - uint64_t bytes_available = 0; - unsigned long flags; - - pr_debug("%s: count = %zd\n", __func__, count); - if (!prtd->buffer) { - pr_err("%s: Buffer is not allocated yet ??", __func__); - return 0; - } - - spin_lock_irqsave(&prtd->lock, flags); - if (atomic_read(&prtd->error)) { - pr_err("%s Got RESET EVENTS notification", __func__); - spin_unlock_irqrestore(&prtd->lock, flags); - return -ENETRESET; - } - spin_unlock_irqrestore(&prtd->lock, flags); - - dstn = prtd->buffer + prtd->app_pointer; - if (count < prtd->buffer_size - prtd->app_pointer) { - if (copy_from_user(dstn, buf, count)) - return -EFAULT; - prtd->app_pointer += count; - } else { - copy = prtd->buffer_size - prtd->app_pointer; - if (copy_from_user(dstn, buf, copy)) - return -EFAULT; - if (copy_from_user(prtd->buffer, buf + copy, count - copy)) - return -EFAULT; - prtd->app_pointer = count - copy; - } - - /* - * If stream is started and there has been an xrun, - * since the available bytes fits fragment_size, copy the data - * right away. - */ - spin_lock_irqsave(&prtd->lock, flags); - prtd->bytes_received += count; - if (atomic_read(&prtd->start)) { - if (atomic_read(&prtd->xrun)) { - pr_debug("%s: in xrun, count = %zd\n", __func__, count); - bytes_available = prtd->bytes_received - - prtd->copied_total; - if (bytes_available >= runtime->fragment_size) { - pr_debug("%s: handle xrun, bytes_to_write = %llu\n", - __func__, bytes_available); - atomic_set(&prtd->xrun, 0); - msm_compr_send_buffer(prtd); - } /* else not sufficient data */ - } /* writes will continue on the next write_done */ - } - - spin_unlock_irqrestore(&prtd->lock, flags); - - return count; -} - -static int msm_compr_capture_copy(struct snd_compr_stream *cstream, - char __user *buf, size_t count) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - void *source; - unsigned long flags; - - pr_debug("%s: count = %zd\n", __func__, count); - if (!prtd->buffer) { - pr_err("%s: Buffer is not allocated yet ??", __func__); - return 0; - } - - spin_lock_irqsave(&prtd->lock, flags); - if (atomic_read(&prtd->error)) { - pr_err("%s Got RESET EVENTS notification", __func__); - spin_unlock_irqrestore(&prtd->lock, flags); - return -ENETRESET; - } - - source = prtd->buffer + prtd->app_pointer; - /* check if we have requested amount of data to copy to user*/ - if (count <= prtd->received_total - prtd->bytes_copied) { - spin_unlock_irqrestore(&prtd->lock, flags); - if (copy_to_user(buf, source, count)) { - pr_err("copy_to_user failed"); - return -EFAULT; - } - spin_lock_irqsave(&prtd->lock, flags); - prtd->app_pointer += count; - if (prtd->app_pointer >= prtd->buffer_size) - prtd->app_pointer -= prtd->buffer_size; - prtd->bytes_copied += count; - } - msm_compr_read_buffer(prtd); - - spin_unlock_irqrestore(&prtd->lock, flags); - return count; -} - -static int msm_compr_copy(struct snd_compr_stream *cstream, - char __user *buf, size_t count) -{ - int ret = 0; - - pr_debug(" In %s\n", __func__); - if (cstream->direction == SND_COMPRESS_PLAYBACK) - ret = msm_compr_playback_copy(cstream, buf, count); - else if (cstream->direction == SND_COMPRESS_CAPTURE) - ret = msm_compr_capture_copy(cstream, buf, count); - return ret; -} - -static int msm_compr_get_caps(struct snd_compr_stream *cstream, - struct snd_compr_caps *arg) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_compr_audio *prtd = runtime->private_data; - int ret = 0; - - pr_debug("%s\n", __func__); - if ((arg != NULL) && (prtd != NULL)) { - memcpy(arg, &prtd->compr_cap, sizeof(struct snd_compr_caps)); - } else { - ret = -EINVAL; - pr_err("%s: arg (0x%pK), prtd (0x%pK)\n", __func__, arg, prtd); - } - - return ret; -} - -static int msm_compr_get_codec_caps(struct snd_compr_stream *cstream, - struct snd_compr_codec_caps *codec) -{ - pr_debug("%s\n", __func__); - - switch (codec->codec) { - case SND_AUDIOCODEC_MP3: - codec->num_descriptors = 2; - codec->descriptor[0].max_ch = 2; - memcpy(codec->descriptor[0].sample_rates, - supported_sample_rates, - sizeof(supported_sample_rates)); - codec->descriptor[0].num_sample_rates = - sizeof(supported_sample_rates)/sizeof(unsigned int); - codec->descriptor[0].bit_rate[0] = 320; /* 320kbps */ - codec->descriptor[0].bit_rate[1] = 128; - codec->descriptor[0].num_bitrates = 2; - codec->descriptor[0].profiles = 0; - codec->descriptor[0].modes = SND_AUDIOCHANMODE_MP3_STEREO; - codec->descriptor[0].formats = 0; - break; - case SND_AUDIOCODEC_AAC: - codec->num_descriptors = 2; - codec->descriptor[1].max_ch = 2; - memcpy(codec->descriptor[1].sample_rates, - supported_sample_rates, - sizeof(supported_sample_rates)); - codec->descriptor[1].num_sample_rates = - sizeof(supported_sample_rates)/sizeof(unsigned int); - codec->descriptor[1].bit_rate[0] = 320; /* 320kbps */ - codec->descriptor[1].bit_rate[1] = 128; - codec->descriptor[1].num_bitrates = 2; - codec->descriptor[1].profiles = 0; - codec->descriptor[1].modes = 0; - codec->descriptor[1].formats = - (SND_AUDIOSTREAMFORMAT_MP4ADTS | - SND_AUDIOSTREAMFORMAT_RAW); - break; - case SND_AUDIOCODEC_AC3: - case SND_AUDIOCODEC_EAC3: - case SND_AUDIOCODEC_FLAC: - case SND_AUDIOCODEC_VORBIS: - case SND_AUDIOCODEC_ALAC: - case SND_AUDIOCODEC_APE: - case SND_AUDIOCODEC_DTS: - case SND_AUDIOCODEC_DSD: - case SND_AUDIOCODEC_TRUEHD: - case SND_AUDIOCODEC_IEC61937: - case SND_AUDIOCODEC_APTX: - break; - default: - pr_err("%s: Unsupported audio codec %d\n", - __func__, codec->codec); - return -EINVAL; - } - - return 0; -} - -static int msm_compr_set_metadata(struct snd_compr_stream *cstream, - struct snd_compr_metadata *metadata) -{ - struct msm_compr_audio *prtd; - struct audio_client *ac; - pr_debug("%s\n", __func__); - - if (!metadata || !cstream) - return -EINVAL; - - prtd = cstream->runtime->private_data; - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return -EINVAL; - } - - if (((metadata->key == SNDRV_COMPRESS_ENCODER_PADDING) || - (metadata->key == SNDRV_COMPRESS_ENCODER_DELAY)) && - (prtd->compr_passthr != LEGACY_PCM)) { - pr_debug("%s: No trailing silence for compress_type[%d]\n", - __func__, prtd->compr_passthr); - return 0; - } - - ac = prtd->audio_client; - if (metadata->key == SNDRV_COMPRESS_ENCODER_PADDING) { - pr_debug("%s, got encoder padding %u", - __func__, metadata->value[0]); - prtd->gapless_state.trailing_samples_drop = metadata->value[0]; - } else if (metadata->key == SNDRV_COMPRESS_ENCODER_DELAY) { - pr_debug("%s, got encoder delay %u", - __func__, metadata->value[0]); - prtd->gapless_state.initial_samples_drop = metadata->value[0]; - } else if (metadata->key == SNDRV_COMPRESS_RENDER_MODE) { - return msm_compr_set_render_mode(prtd, metadata->value[0]); - } else if (metadata->key == SNDRV_COMPRESS_CLK_REC_MODE) { - return msm_compr_set_clk_rec_mode(ac, metadata->value[0]); - } else if (metadata->key == SNDRV_COMPRESS_RENDER_WINDOW) { - return msm_compr_set_render_window( - ac, - metadata->value[0], - metadata->value[1], - metadata->value[2], - metadata->value[3]); - } else if (metadata->key == SNDRV_COMPRESS_START_DELAY) { - prtd->start_delay_lsw = metadata->value[0]; - prtd->start_delay_msw = metadata->value[1]; - } else if (metadata->key == - SNDRV_COMPRESS_ENABLE_ADJUST_SESSION_CLOCK) { - return msm_compr_enable_adjust_session_clock(ac, - metadata->value[0]); - } else if (metadata->key == SNDRV_COMPRESS_ADJUST_SESSION_CLOCK) { - return msm_compr_adjust_session_clock(ac, - metadata->value[0], - metadata->value[1]); - } - - return 0; -} - -static int msm_compr_get_metadata(struct snd_compr_stream *cstream, - struct snd_compr_metadata *metadata) -{ - struct msm_compr_audio *prtd; - struct audio_client *ac; - int ret = -EINVAL; - - pr_debug("%s\n", __func__); - - if (!metadata || !cstream || !cstream->runtime) - return ret; - - if (metadata->key != SNDRV_COMPRESS_PATH_DELAY) { - pr_err("%s, unsupported key %d\n", __func__, metadata->key); - return ret; - } - - prtd = cstream->runtime->private_data; - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return ret; - } - - ac = prtd->audio_client; - ret = q6asm_get_path_delay(prtd->audio_client); - if (ret) { - pr_err("%s: get_path_delay failed, ret=%d\n", __func__, ret); - return ret; - } - - pr_debug("%s, path delay(in us) %u\n", __func__, ac->path_delay); - - metadata->value[0] = ac->path_delay; - - return ret; -} - - -static int msm_compr_set_next_track_param(struct snd_compr_stream *cstream, - union snd_codec_options *codec_options) -{ - struct msm_compr_audio *prtd; - struct audio_client *ac; - int ret = 0; - - if (!codec_options || !cstream) - return -EINVAL; - - prtd = cstream->runtime->private_data; - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return -EINVAL; - } - - ac = prtd->audio_client; - - pr_debug("%s: got codec options for codec type %u", - __func__, prtd->codec); - switch (prtd->codec) { - case FORMAT_WMA_V9: - case FORMAT_WMA_V10PRO: - case FORMAT_FLAC: - case FORMAT_VORBIS: - case FORMAT_ALAC: - case FORMAT_APE: - memcpy(&(prtd->gapless_state.codec_options), - codec_options, - sizeof(union snd_codec_options)); - ret = msm_compr_send_media_format_block(cstream, - ac->stream_id, true); - if (ret < 0) { - pr_err("%s: failed to send media format block\n", - __func__); - } - break; - - default: - pr_debug("%s: Ignore sending CMD Format block\n", - __func__); - break; - } - - return ret; -} - -static int msm_compr_volume_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - uint32_t *volume = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - volume = pdata->volume[fe_id]; - - volume[0] = ucontrol->value.integer.value[0]; - volume[1] = ucontrol->value.integer.value[1]; - pr_debug("%s: fe_id %lu left_vol %d right_vol %d\n", - __func__, fe_id, volume[0], volume[1]); - if (cstream) - msm_compr_set_volume(cstream, volume[0], volume[1]); - return 0; -} - -static int msm_compr_volume_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - - struct msm_compr_pdata *pdata = - snd_soc_component_get_drvdata(comp); - uint32_t *volume = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - volume = pdata->volume[fe_id]; - pr_debug("%s: fe_id %lu\n", __func__, fe_id); - ucontrol->value.integer.value[0] = volume[0]; - ucontrol->value.integer.value[1] = volume[1]; - - return 0; -} - -static int msm_compr_audio_effects_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); - int ret = 0; - int effects_module; - - pr_debug("%s\n", __func__); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto done; - } - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No effects for compr_type[%d]\n", - __func__, prtd->compr_passthr); - goto done; - } - pr_debug("%s: Effects supported for compr_type[%d]\n", - __func__, prtd->compr_passthr); - - effects_module = *values++; - switch (effects_module) { - case VIRTUALIZER_MODULE: - pr_debug("%s: VIRTUALIZER_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_virtualizer_handler( - prtd->audio_client, - &(audio_effects->virtualizer), - values); - break; - case REVERB_MODULE: - pr_debug("%s: REVERB_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_reverb_handler(prtd->audio_client, - &(audio_effects->reverb), - values); - break; - case BASS_BOOST_MODULE: - pr_debug("%s: BASS_BOOST_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_bass_boost_handler(prtd->audio_client, - &(audio_effects->bass_boost), - values); - break; - case PBE_MODULE: - pr_debug("%s: PBE_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_pbe_handler(prtd->audio_client, - &(audio_effects->pbe), - values); - break; - case EQ_MODULE: - pr_debug("%s: EQ_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_popless_eq_handler(prtd->audio_client, - &(audio_effects->equalizer), - values); - break; - case SOFT_VOLUME_MODULE: - pr_debug("%s: SOFT_VOLUME_MODULE\n", __func__); - break; - case SOFT_VOLUME2_MODULE: - pr_debug("%s: SOFT_VOLUME2_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_audio_effects_volume_handler_v2(prtd->audio_client, - &(audio_effects->volume), - values, SOFT_VOLUME_INSTANCE_2); - break; - default: - pr_err("%s Invalid effects config module\n", __func__); - ret = -EINVAL; - } -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - int ret = 0; - struct msm_compr_audio *prtd = NULL; - - pr_debug("%s\n", __func__); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_debug("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - } -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_query_audio_effect_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - int ret = 0; - long *values = &(ucontrol->value.integer.value[0]); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto done; - } - if (prtd->compr_passthr != LEGACY_PCM) { - pr_err("%s: No effects for compr_type[%d]\n", - __func__, prtd->compr_passthr); - ret = -EPERM; - goto done; - } - audio_effects->query.mod_id = (u32)*values++; - audio_effects->query.parm_id = (u32)*values++; - audio_effects->query.size = (u32)*values++; - audio_effects->query.offset = (u32)*values++; - audio_effects->query.device = (u32)*values++; - -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_query_audio_effect_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - int ret = 0; - long *values = &(ucontrol->value.integer.value[0]); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_debug("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto done; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto done; - } - values[0] = (long)audio_effects->query.mod_id; - values[1] = (long)audio_effects->query.parm_id; - values[2] = (long)audio_effects->query.size; - values[3] = (long)audio_effects->query.offset; - values[4] = (long)audio_effects->query.device; -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_send_dec_params(struct snd_compr_stream *cstream, - struct msm_compr_dec_params *dec_params, - int stream_id) -{ - - int rc = 0; - struct msm_compr_audio *prtd = NULL; - struct snd_dec_ddp *ddp = &dec_params->ddp_params; - - if (!cstream || !dec_params) { - pr_err("%s: stream or dec_params inactive\n", __func__); - rc = -EINVAL; - goto end; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set dec_params\n", __func__); - rc = -EINVAL; - goto end; - } - switch (prtd->codec) { - case FORMAT_MP3: - case FORMAT_MPEG4_AAC: - case FORMAT_TRUEHD: - case FORMAT_IEC61937: - case FORMAT_APTX: - pr_debug("%s: no runtime parameters for codec: %d\n", __func__, - prtd->codec); - break; - case FORMAT_AC3: - case FORMAT_EAC3: - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No DDP param for compr_type[%d]\n", - __func__, prtd->compr_passthr); - break; - } - rc = msm_compr_send_ddp_cfg(prtd->audio_client, ddp, stream_id); - if (rc < 0) - pr_err("%s: DDP CMD CFG failed %d\n", __func__, rc); - break; - default: - break; - } -end: - return rc; - -} -static int msm_compr_dec_params_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_compr_dec_params *dec_params = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); - int rc = 0; - - pr_debug("%s\n", __func__); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - dec_params = pdata->dec_params[fe_id]; - - if (!cstream || !dec_params) { - pr_err("%s: stream or dec_params inactive\n", __func__); - return -EINVAL; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set dec_params\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - switch (prtd->codec) { - case FORMAT_MP3: - case FORMAT_MPEG4_AAC: - case FORMAT_FLAC: - case FORMAT_VORBIS: - case FORMAT_ALAC: - case FORMAT_APE: - case FORMAT_DTS: - case FORMAT_DSD: - case FORMAT_TRUEHD: - case FORMAT_IEC61937: - case FORMAT_APTX: - pr_debug("%s: no runtime parameters for codec: %d\n", __func__, - prtd->codec); - break; - case FORMAT_AC3: - case FORMAT_EAC3: { - struct snd_dec_ddp *ddp = &dec_params->ddp_params; - int cnt; - - if (prtd->compr_passthr != LEGACY_PCM) { - pr_debug("%s: No DDP param for compr_type[%d]\n", - __func__, prtd->compr_passthr); - break; - } - - ddp->params_length = (*values++); - if (ddp->params_length > DDP_DEC_MAX_NUM_PARAM) { - pr_err("%s: invalid num of params:: %d\n", __func__, - ddp->params_length); - rc = -EINVAL; - goto end; - } - for (cnt = 0; cnt < ddp->params_length; cnt++) { - ddp->params_id[cnt] = *values++; - ddp->params_value[cnt] = *values++; - } - prtd = cstream->runtime->private_data; - if (prtd && prtd->audio_client) - rc = msm_compr_send_dec_params(cstream, dec_params, - prtd->audio_client->stream_id); - break; - } - default: - break; - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_compr_dec_params_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* dummy function */ - return 0; -} - -static int msm_compr_playback_app_type_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_playback_app_type_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_compr_capture_app_type_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_compr_capture_app_type_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_compr_channel_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - int rc = 0, i; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - - if (pdata->ch_map[fe_id]) { - pdata->ch_map[fe_id]->set_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - pdata->ch_map[fe_id]->channel_map[i] = - (char)(ucontrol->value.integer.value[i]); - } else { - pr_debug("%s: no memory for ch_map, default will be set\n", - __func__); - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_compr_channel_map_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - int rc = 0, i; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s: Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - if (pdata->ch_map[fe_id]) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - pdata->ch_map[fe_id]->channel_map[i]; - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_compr_adsp_stream_cmd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd; - int ret = 0; - struct msm_adsp_event_data *event_data = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - return -EINVAL; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)ucontrol->value.bytes.data; - if ((event_data->event_type < ADSP_STREAM_PP_EVENT) || - (event_data->event_type >= ADSP_STREAM_EVENT_MAX)) { - pr_err("%s: invalid event_type=%d", - __func__, event_data->event_type); - ret = -EINVAL; - goto done; - } - - if (event_data->payload_len > sizeof(ucontrol->value.bytes.data) - - sizeof(struct msm_adsp_event_data)) { - pr_err("%s param length=%d exceeds limit", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_stream_cmd(prtd->audio_client, event_data); - if (ret < 0) - pr_err("%s: failed to send stream event cmd, err = %d\n", - __func__, ret); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_ion_fd_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd; - int fd; - int ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds invalid fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - return -EINVAL; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(&fd, ucontrol->value.bytes.data, sizeof(fd)); - ret = q6asm_send_ion_fd(prtd->audio_client, fd); - if (ret < 0) - pr_err("%s: failed to register ion fd\n", __func__); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_rtic_event_ack_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_compr_audio *prtd; - int ret = 0; - int param_length = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(¶m_length, ucontrol->value.bytes.data, - sizeof(param_length)); - if ((param_length + sizeof(param_length)) - >= sizeof(ucontrol->value.bytes.data)) { - pr_err("%s param length=%d exceeds limit", - __func__, param_length); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_rtic_event_ack(prtd->audio_client, - ucontrol->value.bytes.data + sizeof(param_length), - param_length); - if (ret < 0) - pr_err("%s: failed to send rtic event ack, err = %d\n", - __func__, ret); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_compr_gapless_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_component_get_drvdata(comp); - pdata->use_dsp_gapless_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: value: %ld\n", __func__, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_compr_gapless_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct msm_compr_pdata *pdata = - snd_soc_component_get_drvdata(comp); - pr_debug("%s:gapless mode %d\n", __func__, pdata->use_dsp_gapless_mode); - ucontrol->value.integer.value[0] = pdata->use_dsp_gapless_mode; - - return 0; -} - -static const struct snd_kcontrol_new msm_compr_gapless_controls[] = { - SOC_SINGLE_EXT("Compress Gapless Playback", - 0, 0, 1, 0, - msm_compr_gapless_get, - msm_compr_gapless_put), -}; - -static int msm_compr_probe(struct snd_soc_platform *platform) -{ - struct msm_compr_pdata *pdata; - int i; - int rc; - const char *qdsp_version; - - pr_debug("%s\n", __func__); - pdata = (struct msm_compr_pdata *) - kzalloc(sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - mutex_init(&pdata->lock); - snd_soc_platform_set_drvdata(platform, pdata); - - for (i = 0; i < MSM_FRONTEND_DAI_MAX; i++) { - pdata->volume[i][0] = COMPRESSED_LR_VOL_MAX_STEPS; - pdata->volume[i][1] = COMPRESSED_LR_VOL_MAX_STEPS; - pdata->audio_effects[i] = NULL; - pdata->dec_params[i] = NULL; - pdata->cstream[i] = NULL; - pdata->ch_map[i] = NULL; - pdata->is_in_use[i] = false; - } - - snd_soc_add_platform_controls(platform, msm_compr_gapless_controls, - ARRAY_SIZE(msm_compr_gapless_controls)); - - rc = of_property_read_string(platform->dev->of_node, - "qcom,adsp-version", &qdsp_version); - if (!rc) { - if (!strcmp(qdsp_version, "MDSP 1.2")) - pdata->use_legacy_api = true; - else - pdata->use_legacy_api = false; - } else - pdata->use_legacy_api = false; - - pr_debug("%s: use legacy api %d\n", __func__, pdata->use_legacy_api); - /* - * use_dsp_gapless_mode part of platform data(pdata) is updated from HAL - * through a mixer control before compress driver is opened. The mixer - * control is used to decide if dsp gapless mode needs to be enabled. - * Gapless is disabled by default. - */ - pdata->use_dsp_gapless_mode = false; - return 0; -} - -static int msm_compr_remove(struct snd_soc_platform *platform) -{ - - struct msm_compr_pdata *pdata = (struct msm_compr_pdata *) - snd_soc_platform_get_drvdata(platform); - if (!pdata) { - pr_err("%s pdata is null\n", __func__); - return -ENOMEM; - } - - mutex_destroy(&pdata->lock); - kfree(pdata); - - return 0; -} - -static int msm_compr_volume_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = COMPRESSED_LR_VOL_MAX_STEPS; - return 0; -} - -static int msm_compr_audio_effects_config_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = MAX_PP_PARAMS_SZ; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_query_audio_effect_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 128; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_dec_params_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 128; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_app_type_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 5; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_compr_channel_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = PCM_FORMAT_MAX_NUM_CHANNEL_V8; - uinfo->value.integer.min = 0; - /* See PCM_CHANNEL_RSD=34 in apr_audio-v2.h */ - uinfo->value.integer.max = 34; - return 0; -} - -static int msm_compr_add_volume_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Compress Playback"; - const char *deviceNo = "NN"; - const char *suffix = "Volume"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_volume_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_volume_info, - .tlv.p = msm_compr_vol_gain, - .get = msm_compr_volume_get, - .put = msm_compr_volume_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 + - strlen(suffix) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - pr_err("failed to allocate mixer ctrl str of len %d", ctl_len); - return 0; - } - snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name, - rtd->pcm->device, suffix); - fe_volume_control[0].name = mixer_str; - fe_volume_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, fe_volume_control, - ARRAY_SIZE(fe_volume_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_audio_effects_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Audio Effects Config"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_audio_effects_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_audio_effects_config_info, - .get = msm_compr_audio_effects_config_get, - .put = msm_compr_audio_effects_config_put, - .private_value = 0, - } - }; - - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return 0; - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - - fe_audio_effects_config_control[0].name = mixer_str; - fe_audio_effects_config_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s\n", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_audio_effects_config_control, - ARRAY_SIZE(fe_audio_effects_config_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_query_audio_effect_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Query Audio Effect Param"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_query_audio_effect_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_query_audio_effect_info, - .get = msm_compr_query_audio_effect_get, - .put = msm_compr_query_audio_effect_put, - .private_value = 0, - } - }; - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - pr_err("failed to allocate mixer ctrl str of len %d", ctl_len); - return 0; - } - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_query_audio_effect_control[0].name = mixer_str; - fe_query_audio_effect_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: registering new mixer ctl %s\n", __func__, mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_query_audio_effect_control, - ARRAY_SIZE(fe_query_audio_effect_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_audio_adsp_stream_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CMD; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_audio_adsp_stream_cmd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_compr_adsp_stream_cmd_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_stream_cmd_config_control[0].name = mixer_str; - fe_audio_adsp_stream_cmd_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_stream_cmd_config_control, - ARRAY_SIZE(fe_audio_adsp_stream_cmd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_compr_add_audio_adsp_stream_callback_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol *kctl; - - struct snd_kcontrol_new fe_audio_adsp_callback_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_callback_info, - .get = msm_adsp_stream_callback_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_callback_config_control[0].name = mixer_str; - fe_audio_adsp_callback_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_callback_config_control, - ARRAY_SIZE(fe_audio_adsp_callback_config_control)); - if (ret < 0) { - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl %s.\n", __func__, mixer_str); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl->private_data = NULL; - -free_mixer_str: - kfree(mixer_str); -done: - return ret; -} - -static int msm_compr_add_dec_runtime_params_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Audio Stream"; - const char *deviceNo = "NN"; - const char *suffix = "Dec Params"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_dec_params_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_dec_params_info, - .get = msm_compr_dec_params_get, - .put = msm_compr_dec_params_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 + - strlen(suffix) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return 0; - - snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name, - rtd->pcm->device, suffix); - - fe_dec_params_control[0].name = mixer_str; - fe_dec_params_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_dec_params_control, - ARRAY_SIZE(fe_dec_params_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_app_type_cfg_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - char *mixer_str = NULL; - int ctl_len; - struct snd_kcontrol_new fe_app_type_cfg_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_app_type_cfg_info, - .put = msm_compr_playback_app_type_cfg_put, - .get = msm_compr_playback_app_type_cfg_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return 0; - } - - pr_debug("%s: added new compr FE ctl with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) - ctl_len = strlen(playback_mixer_ctl_name) + 1 + strlen(deviceNo) - + 1 + strlen(suffix) + 1; - else - ctl_len = strlen(capture_mixer_ctl_name) + 1 + strlen(deviceNo) - + 1 + strlen(suffix) + 1; - - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return 0; - - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) - snprintf(mixer_str, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - else - snprintf(mixer_str, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - - fe_app_type_cfg_control[0].name = mixer_str; - fe_app_type_cfg_control[0].private_value = rtd->dai_link->id; - - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) { - fe_app_type_cfg_control[0].put = - msm_compr_playback_app_type_cfg_put; - fe_app_type_cfg_control[0].get = - msm_compr_playback_app_type_cfg_get; - } else { - fe_app_type_cfg_control[0].put = - msm_compr_capture_app_type_cfg_put; - fe_app_type_cfg_control[0].get = - msm_compr_capture_app_type_cfg_get; - } - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_app_type_cfg_control, - ARRAY_SIZE(fe_app_type_cfg_control)); - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_channel_map_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Channel Map"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - struct msm_compr_pdata *pdata = NULL; - int ctl_len; - struct snd_kcontrol_new fe_channel_map_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_compr_channel_map_info, - .get = msm_compr_channel_map_get, - .put = msm_compr_channel_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: NULL rtd\n", __func__); - return -EINVAL; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s%d", mixer_ctl_name, rtd->pcm->device); - - fe_channel_map_control[0].name = mixer_str; - fe_channel_map_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_channel_map_control, - ARRAY_SIZE(fe_channel_map_control)); - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pdata->ch_map[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_compr_ch_map), GFP_KERNEL); - if (!pdata->ch_map[rtd->dai_link->id]) { - pr_err("%s: Could not allocate memory for channel map\n", - __func__); - kfree(mixer_str); - return -ENOMEM; - } - kfree(mixer_str); - return 0; -} - -static int msm_compr_add_io_fd_cmd_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback ION FD"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_ion_fd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_compr_ion_fd_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_ion_fd_config_control[0].name = mixer_str; - fe_ion_fd_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_ion_fd_config_control, - ARRAY_SIZE(fe_ion_fd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_compr_add_event_ack_cmd_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Event Ack"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_event_ack_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_compr_rtic_event_ack_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_event_ack_config_control[0].name = mixer_str; - fe_event_ack_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_event_ack_config_control, - ARRAY_SIZE(fe_event_ack_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_compr_new(struct snd_soc_pcm_runtime *rtd) -{ - int rc; - - rc = msm_compr_add_volume_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Volume Control\n", __func__); - - rc = msm_compr_add_audio_effects_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Audio Effects Control\n", - __func__); - - rc = msm_compr_add_audio_adsp_stream_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add Compr ADSP Stream Cmd Control\n", - __func__); - - rc = msm_compr_add_audio_adsp_stream_callback_control(rtd); - if (rc) - pr_err("%s: Could not add Compr ADSP Stream Callback Control\n", - __func__); - - rc = msm_compr_add_io_fd_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add Compr ion fd Control\n", - __func__); - - rc = msm_compr_add_event_ack_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add Compr event ack Control\n", - __func__); - - rc = msm_compr_add_query_audio_effect_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Query Audio Effect Control\n", - __func__); - - rc = msm_compr_add_dec_runtime_params_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Dec runtime params Control\n", - __func__); - rc = msm_compr_add_app_type_cfg_control(rtd); - if (rc) - pr_err("%s: Could not add Compr App Type Cfg Control\n", - __func__); - rc = msm_compr_add_channel_map_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Channel Map Control\n", - __func__); - return 0; -} - -static struct snd_compr_ops msm_compr_ops = { - .open = msm_compr_open, - .free = msm_compr_free, - .trigger = msm_compr_trigger, - .pointer = msm_compr_pointer, - .set_params = msm_compr_set_params, - .set_metadata = msm_compr_set_metadata, - .get_metadata = msm_compr_get_metadata, - .set_next_track_param = msm_compr_set_next_track_param, - .ack = msm_compr_ack, - .copy = msm_compr_copy, - .get_caps = msm_compr_get_caps, - .get_codec_caps = msm_compr_get_codec_caps, -}; - -static struct snd_soc_platform_driver msm_soc_platform = { - .probe = msm_compr_probe, - .compr_ops = &msm_compr_ops, - .pcm_new = msm_compr_new, - .remove = msm_compr_remove, -}; - -static int msm_compr_dev_probe(struct platform_device *pdev) -{ - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_compr_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_compr_dt_match[] = { - {.compatible = "qcom,msm-compress-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_compr_dt_match); - -static struct platform_driver msm_compr_driver = { - .driver = { - .name = "msm-compress-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_compr_dt_match, - }, - .probe = msm_compr_dev_probe, - .remove = msm_compr_dev_remove, -}; - -int __init msm_compress_dsp_init(void) -{ - return platform_driver_register(&msm_compr_driver); -} - -void msm_compress_dsp_exit(void) -{ - platform_driver_unregister(&msm_compr_driver); -} - -MODULE_DESCRIPTION("Compress Offload platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-cpe-lsm.c b/techpack/audio/asoc/msm-cpe-lsm.c deleted file mode 100644 index ea91e0e08ff8..000000000000 --- a/techpack/audio/asoc/msm-cpe-lsm.c +++ /dev/null @@ -1,3356 +0,0 @@ -/* - * Copyright (c) 2013-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-slim-dma.h" -#include "codecs/cpe_core.h" - -#define SAMPLE_RATE_48KHZ 48000 -#define SAMPLE_RATE_16KHZ 16000 -#define LSM_VOICE_WAKEUP_APP_V2 2 -#define AFE_PORT_ID_1 1 -#define AFE_PORT_ID_3 3 -#define AFE_OUT_PORT_2 2 -#define LISTEN_MIN_NUM_PERIODS 2 -#define LISTEN_MAX_NUM_PERIODS 12 -#define LISTEN_MAX_PERIOD_SIZE 61440 -#define LISTEN_MIN_PERIOD_SIZE 320 -#define LISTEN_MAX_STATUS_PAYLOAD_SIZE 256 -#define MSM_CPE_MAX_CUSTOM_PARAM_SIZE 2048 - -#define MSM_CPE_LAB_THREAD_TIMEOUT (3 * (HZ/10)) - -#define MSM_CPE_LSM_GRAB_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock acquire\n", \ - __func__, name); \ - mutex_lock(lock); \ -} - -#define MSM_CPE_LSM_REL_LOCK(lock, name) \ -{ \ - pr_debug("%s: %s lock release\n", \ - __func__, name); \ - mutex_unlock(lock); \ -} - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 16000, 48000, 192000, 384000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - - -static struct snd_pcm_hardware msm_pcm_hardware_listen = { - .info = (SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | - SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE), - .rates = (SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_384000), - .rate_min = 16000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = LISTEN_MAX_NUM_PERIODS * - LISTEN_MAX_PERIOD_SIZE, - .period_bytes_min = LISTEN_MIN_PERIOD_SIZE, - .period_bytes_max = LISTEN_MAX_PERIOD_SIZE, - .periods_min = LISTEN_MIN_NUM_PERIODS, - .periods_max = LISTEN_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -enum { - AFE_CMD_INVALID = 0, - AFE_CMD_PORT_START, - AFE_CMD_PORT_SUSPEND, - AFE_CMD_PORT_RESUME, - AFE_CMD_PORT_STOP, -}; - -enum cpe_lab_thread_status { - MSM_LSM_LAB_THREAD_STOP, - MSM_LSM_LAB_THREAD_RUNNING, - MSM_LSM_LAB_THREAD_ERROR, -}; - -struct cpe_hw_params { - u32 sample_rate; - u16 sample_size; - u32 buf_sz; - u32 period_count; - u16 channels; -}; - -struct cpe_data_pcm_buf { - u8 *mem; - phys_addr_t phys; -}; - -struct cpe_lsm_lab { - atomic_t in_count; - atomic_t abort_read; - u32 dma_write; - u32 buf_idx; - u32 pcm_size; - enum cpe_lab_thread_status thread_status; - struct cpe_data_pcm_buf *pcm_buf; - wait_queue_head_t period_wait; - struct completion comp; - struct completion thread_complete; -}; - -struct cpe_priv { - void *core_handle; - struct snd_soc_codec *codec; - struct wcd_cpe_lsm_ops lsm_ops; - struct wcd_cpe_afe_ops afe_ops; - bool afe_mad_ctl; - u32 input_port_id; -}; - -struct cpe_lsm_data { - struct device *dev; - struct cpe_lsm_session *lsm_session; - struct mutex lsm_api_lock; - struct cpe_lsm_lab lab; - struct cpe_hw_params hw_params; - struct snd_pcm_substream *substream; - - wait_queue_head_t event_wait; - atomic_t event_avail; - atomic_t event_stop; - - u8 ev_det_status; - u8 ev_det_pld_size; - u8 *ev_det_payload; - - bool cpe_prepared; -}; - -static int msm_cpe_afe_mad_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct cpe_priv *cpe = kcontrol->private_data; - - ucontrol->value.integer.value[0] = cpe->afe_mad_ctl; - return 0; -} - -static int msm_cpe_afe_mad_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct cpe_priv *cpe = kcontrol->private_data; - - cpe->afe_mad_ctl = ucontrol->value.integer.value[0]; - return 0; -} - -static struct snd_kcontrol_new msm_cpe_kcontrols[] = { - SOC_SINGLE_EXT("CPE AFE MAD Enable", SND_SOC_NOPM, 0, 1, 0, - msm_cpe_afe_mad_ctl_get, msm_cpe_afe_mad_ctl_put), -}; - -/* - * cpe_get_private_data: obtain ASoC platform driver private data - * @substream: ASoC substream for which private data to be obtained - */ -static struct cpe_priv *cpe_get_private_data( - struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd; - - if (!substream || !substream->private_data) { - pr_err("%s: %s is invalid\n", - __func__, - (!substream) ? "substream" : "private_data"); - goto err_ret; - } - - rtd = substream->private_data; - - if (!rtd || !rtd->platform) { - pr_err("%s: %s is invalid\n", - __func__, - (!rtd) ? "runtime" : "platform"); - goto err_ret; - } - - return snd_soc_platform_get_drvdata(rtd->platform); - -err_ret: - return NULL; -} - -/* - * cpe_get_lsm_data: obtain the lsm session data given the substream - * @substream: ASoC substream for which lsm session data to be obtained - */ -static struct cpe_lsm_data *cpe_get_lsm_data( - struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - - return runtime->private_data; -} - -static void msm_cpe_process_event_status(void *data, - u8 detect_status, u8 size, u8 *payload) -{ - struct cpe_lsm_data *lsm_d = data; - - lsm_d->ev_det_status = detect_status; - lsm_d->ev_det_pld_size = size; - - lsm_d->ev_det_payload = kzalloc(size, GFP_KERNEL); - if (!lsm_d->ev_det_payload) - return; - - memcpy(lsm_d->ev_det_payload, payload, size); - - atomic_set(&lsm_d->event_avail, 1); - wake_up(&lsm_d->event_wait); -} - -static void msm_cpe_process_event_status_done(struct cpe_lsm_data *lsm_data) -{ - kfree(lsm_data->ev_det_payload); - lsm_data->ev_det_payload = NULL; - - lsm_data->ev_det_status = 0; - lsm_data->ev_det_pld_size = 0; -} - -/* - * msm_cpe_afe_port_cntl: Perform the afe port control - * @substream: substream for which afe port command to be performed - * @core_handle: handle to core - * @afe_ops: handle to the afe operations - * @afe_cfg: afe port configuration data - * @cmd: command to be sent to AFE - * - */ -static int msm_cpe_afe_port_cntl( - struct snd_pcm_substream *substream, - void *core_handle, - struct wcd_cpe_afe_ops *afe_ops, - struct wcd_cpe_afe_port_cfg *afe_cfg, - int cmd) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (!afe_cfg->port_id) { - /* - * It is possible driver can get closed without prepare, - * in which case afe ports will not be initialized. - */ - dev_dbg(rtd->dev, - "%s: Invalid afe port id\n", - __func__); - return 0; - } - - switch (cmd) { - case AFE_CMD_PORT_START: - rc = afe_ops->afe_port_start(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: AFE port start failed\n", - __func__); - break; - case AFE_CMD_PORT_SUSPEND: - rc = afe_ops->afe_port_suspend(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: afe_suspend failed, err = %d\n", - __func__, rc); - break; - case AFE_CMD_PORT_RESUME: - rc = afe_ops->afe_port_resume(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: afe_resume failed, err = %d\n", - __func__, rc); - break; - case AFE_CMD_PORT_STOP: - rc = afe_ops->afe_port_stop(core_handle, afe_cfg); - if (rc != 0) - dev_err(rtd->dev, - "%s: afe_stopfailed, err = %d\n", - __func__, rc); - break; - } - - return rc; -} - -static int msm_cpe_lsm_lab_stop(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - struct wcd_cpe_afe_ops *afe_ops; - struct cpe_lsm_session *session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct msm_slim_dma_data *dma_data = NULL; - int rc; - - /* - * the caller is not aware of LAB status and will - * try to stop lab even if it is already stopped. - * return success right away is LAB is already stopped - */ - if (lab_d->thread_status == MSM_LSM_LAB_THREAD_STOP) { - dev_dbg(rtd->dev, - "%s: lab already stopped\n", - __func__); - return 0; - } - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - lsm_ops = &cpe->lsm_ops; - afe_ops = &cpe->afe_ops; - session = lsm_d->lsm_session; - if (rtd->cpu_dai) - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) { - dev_err(rtd->dev, - "%s: dma_data is not set\n", - __func__); - return -EINVAL; - } - - if (lab_d->thread_status == MSM_LSM_LAB_THREAD_RUNNING) { - dev_dbg(rtd->dev, "%s: stopping lab thread\n", - __func__); - rc = kthread_stop(session->lsm_lab_thread); - - /* - * kthread_stop returns EINTR if the thread_fn - * was not scheduled before calling kthread_stop. - * In this case, we dont need to wait for lab - * thread to complete as lab thread will not be - * scheduled at all. - */ - if (rc == -EINTR) - goto done; - - /* Wait for the lab thread to exit */ - rc = wait_for_completion_timeout( - &lab_d->thread_complete, - MSM_CPE_LAB_THREAD_TIMEOUT); - if (!rc) { - dev_err(rtd->dev, - "%s: Wait for lab thread timedout\n", - __func__); - return -ETIMEDOUT; - } - } - - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_PRE_DISABLE); - if (rc) - dev_err(rtd->dev, - "%s: PRE ch teardown failed, err = %d\n", - __func__, rc); - /* continue with teardown even if any intermediate step fails */ - rc = dma_data->dai_channel_ctl(dma_data, rtd->cpu_dai, false); - if (rc) - dev_err(rtd->dev, - "%s: open data failed %d\n", __func__, rc); - dma_data->ph = 0; - - /* - * Even though LAB stop failed, - * output AFE port needs to be stopped - */ - rc = afe_ops->afe_port_stop(cpe->core_handle, - &session->afe_out_port_cfg); - if (rc) - dev_err(rtd->dev, - "%s: AFE out port stop failed, err = %d\n", - __func__, rc); - - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_POST_DISABLE); - if (rc) - dev_err(rtd->dev, - "%s: POST ch teardown failed, err = %d\n", - __func__, rc); - -done: - lab_d->thread_status = MSM_LSM_LAB_THREAD_STOP; - lab_d->buf_idx = 0; - atomic_set(&lab_d->in_count, 0); - lab_d->dma_write = 0; - - return 0; -} - -static int msm_cpe_lab_buf_alloc(struct snd_pcm_substream *substream, - struct cpe_lsm_session *session, - struct msm_slim_dma_data *dma_data) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct cpe_hw_params *hw_params = &lsm_d->hw_params; - struct cpe_data_pcm_buf *pcm_buf = NULL; - int rc = 0; - int dma_alloc = 0; - u32 count = 0; - u32 bufsz, bufcnt; - - if (lab_d->pcm_buf && - lab_d->pcm_buf->mem) { - dev_dbg(rtd->dev, - "%s: LAB buf already allocated\n", - __func__); - goto exit; - } - - bufsz = hw_params->buf_sz; - bufcnt = hw_params->period_count; - - dev_dbg(rtd->dev, - "%s:Buf Size %d Buf count %d\n", - __func__, - bufsz, bufcnt); - - pcm_buf = kzalloc(((sizeof(struct cpe_data_pcm_buf)) * bufcnt), - GFP_KERNEL); - if (!pcm_buf) { - rc = -ENOMEM; - goto exit; - } - - lab_d->pcm_buf = pcm_buf; - dma_alloc = bufsz * bufcnt; - pcm_buf->mem = NULL; - pcm_buf->mem = kzalloc(dma_alloc, GFP_DMA); - if (!pcm_buf->mem) { - rc = -ENOMEM; - goto fail; - } - - pcm_buf->phys = dma_map_single(dma_data->sdev->dev.parent, - pcm_buf->mem, dma_alloc, DMA_BIDIRECTIONAL); - if (dma_mapping_error(dma_data->sdev->dev.parent, pcm_buf->phys)) { - dev_err(rtd->dev, "%s Error mapping DMA buffers\n", __func__); - pcm_buf->phys = (phys_addr_t)NULL; - rc = -EFAULT; - goto fail; - } - - count = 0; - while (count < bufcnt) { - pcm_buf[count].mem = pcm_buf[0].mem + (count * bufsz); - pcm_buf[count].phys = pcm_buf[0].phys + (count * bufsz); - dev_dbg(rtd->dev, - "%s: pcm_buf[%d].mem %pK pcm_buf[%d].phys %pK\n", - __func__, count, - (void *)pcm_buf[count].mem, - count, &(pcm_buf[count].phys)); - count++; - } - - return 0; -fail: - if (pcm_buf && pcm_buf->mem) - kfree(pcm_buf->mem); - kfree(pcm_buf); - lab_d->pcm_buf = NULL; -exit: - return rc; -} - -static int msm_cpe_lab_buf_dealloc(struct snd_pcm_substream *substream, - struct cpe_lsm_session *session, struct msm_slim_dma_data *dma_data) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct cpe_hw_params *hw_params = &lsm_d->hw_params; - int rc = 0; - int dma_alloc = 0; - struct cpe_data_pcm_buf *pcm_buf = NULL; - int bufsz, bufcnt; - - bufsz = hw_params->buf_sz; - bufcnt = hw_params->period_count; - - dev_dbg(rtd->dev, - "%s:Buf Size %d Buf count %d\n", __func__, - bufsz, bufcnt); - - if (bufcnt <= 0 || bufsz <= 0) { - dev_err(rtd->dev, - "%s: Invalid params, bufsz = %u, bufcnt = %u\n", - __func__, bufsz, bufcnt); - return -EINVAL; - } - - pcm_buf = lab_d->pcm_buf; - dma_alloc = bufsz * bufcnt; - if (dma_data && pcm_buf) - if (pcm_buf->phys) - dma_unmap_single(dma_data->sdev->dev.parent, - pcm_buf->phys, dma_alloc, DMA_BIDIRECTIONAL); - if (pcm_buf) - kfree(pcm_buf->mem); - - kfree(pcm_buf); - lab_d->pcm_buf = NULL; - return rc; -} - -/* - * msm_cpe_lab_thread: Initiated on KW detection - * @data: lab data - * - * Start lab thread and call CPE core API for SLIM - * read operations. - */ -static int msm_cpe_lab_thread(void *data) -{ - struct cpe_lsm_data *lsm_d = data; - struct cpe_lsm_session *session = lsm_d->lsm_session; - struct snd_pcm_substream *substream = lsm_d->substream; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct cpe_hw_params *hw_params = &lsm_d->hw_params; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - struct wcd_cpe_afe_ops *afe_ops; - struct cpe_data_pcm_buf *cur_buf, *next_buf; - struct msm_slim_dma_data *dma_data = NULL; - struct snd_soc_pcm_runtime *rtd = NULL; - bool wait_timedout = false; - int rc = 0; - u32 done_len = 0; - u32 buf_count = 0; - u32 prd_cnt; - - allow_signal(SIGKILL); - set_current_state(TASK_INTERRUPTIBLE); - - pr_debug("%s: Lab thread start\n", __func__); - init_completion(&lab_d->comp); - - if (PCM_RUNTIME_CHECK(substream)) { - rc = -EINVAL; - goto done; - } - - if (!cpe || !cpe->core_handle) { - pr_err("%s: Handle to %s is invalid\n", - __func__, - (!cpe) ? "cpe" : "core"); - rc = -EINVAL; - goto done; - } - - rtd = substream->private_data; - if (rtd->cpu_dai) - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) { - pr_err("%s: dma_data is not set\n", __func__); - rc = -EINVAL; - goto done; - } - - lsm_ops = &cpe->lsm_ops; - afe_ops = &cpe->afe_ops; - - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_PRE_ENABLE); - if (rc) { - dev_err(rtd->dev, - "%s: PRE ch setup failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = dma_data->dai_channel_ctl(dma_data, rtd->cpu_dai, true); - if (rc) { - dev_err(rtd->dev, - "%s: open data failed %d\n", __func__, rc); - goto done; - } - - dev_dbg(rtd->dev, "%s: Established data channel\n", - __func__); - - init_waitqueue_head(&lab_d->period_wait); - memset(lab_d->pcm_buf[0].mem, 0, lab_d->pcm_size); - - rc = slim_port_xfer(dma_data->sdev, dma_data->ph, - lab_d->pcm_buf[0].mem, - hw_params->buf_sz, &lab_d->comp); - if (rc) { - dev_err(rtd->dev, - "%s: buf[0] slim_port_xfer failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = slim_port_xfer(dma_data->sdev, dma_data->ph, - lab_d->pcm_buf[1].mem, - hw_params->buf_sz, &lab_d->comp); - if (rc) { - dev_err(rtd->dev, - "%s: buf[0] slim_port_xfer failed, err = %d\n", - __func__, rc); - goto done; - } - - cur_buf = &lab_d->pcm_buf[0]; - next_buf = &lab_d->pcm_buf[2]; - prd_cnt = hw_params->period_count; - rc = lsm_ops->lab_ch_setup(cpe->core_handle, - session, - WCD_CPE_POST_ENABLE); - if (rc) { - dev_err(rtd->dev, - "%s: POST ch setup failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = afe_ops->afe_port_start(cpe->core_handle, - &session->afe_out_port_cfg); - if (rc) { - dev_err(rtd->dev, - "%s: AFE out port start failed, err = %d\n", - __func__, rc); - goto done; - } - - while (!kthread_should_stop() && - lab_d->thread_status != MSM_LSM_LAB_THREAD_ERROR) { - - rc = slim_port_xfer(dma_data->sdev, dma_data->ph, - next_buf->mem, - hw_params->buf_sz, &lab_d->comp); - if (rc) { - dev_err(rtd->dev, - "%s: slim_port_xfer failed, err = %d\n", - __func__, rc); - lab_d->thread_status = MSM_LSM_LAB_THREAD_ERROR; - } - - rc = wait_for_completion_timeout(&lab_d->comp, (2 * HZ/10)); - if (!rc) { - dev_err(rtd->dev, - "%s: wait timedout for slim buffer\n", - __func__); - wait_timedout = true; - } else { - wait_timedout = false; - } - - rc = slim_port_get_xfer_status(dma_data->sdev, - dma_data->ph, - &cur_buf->phys, &done_len); - if (rc || - (!rc && wait_timedout)) { - dev_err(rtd->dev, - "%s: xfer_status failure, rc = %d, wait_timedout = %s\n", - __func__, rc, - (wait_timedout ? "true" : "false")); - lab_d->thread_status = MSM_LSM_LAB_THREAD_ERROR; - } - - if (done_len || - ((!done_len) && - lab_d->thread_status == MSM_LSM_LAB_THREAD_ERROR)) { - atomic_inc(&lab_d->in_count); - lab_d->dma_write += snd_pcm_lib_period_bytes(substream); - snd_pcm_period_elapsed(substream); - wake_up(&lab_d->period_wait); - buf_count++; - - cur_buf = &lab_d->pcm_buf[buf_count % prd_cnt]; - next_buf = &lab_d->pcm_buf[(buf_count + 2) % prd_cnt]; - dev_dbg(rtd->dev, - "%s: Cur buf.mem = %pK Next Buf.mem = %pK\n" - " buf count = 0x%x\n", __func__, - cur_buf->mem, next_buf->mem, buf_count); - } else { - dev_err(rtd->dev, - "%s: SB get status, invalid len = 0x%x\n", - __func__, done_len); - } - done_len = 0; - } - -done: - if (rc) - lab_d->thread_status = MSM_LSM_LAB_THREAD_ERROR; - pr_debug("%s: Exit lab_thread, exit_status=%d, thread_status=%d\n", - __func__, rc, lab_d->thread_status); - complete(&lab_d->thread_complete); - - return 0; -} - -/* - * msm_cpe_lsm_open: ASoC call to open the stream - * @substream: substream that is to be opened - * - * Create session data for lsm session and open the lsm session - * on CPE. - */ -static int msm_cpe_lsm_open(struct snd_pcm_substream *substream) -{ - struct cpe_lsm_data *lsm_d; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - int rc = 0; - - if (!cpe || !cpe->codec) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - runtime->hw = msm_pcm_hardware_listen; - - rc = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (rc < 0) { - pr_err("snd_pcm_hw_constraint_list failed rc %d\n", rc); - return -EINVAL; - } - - /* Ensure that buffer size is a multiple of period size */ - rc = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (rc < 0) { - pr_err("%s: Unable to set pcm_param_periods, rc %d\n", - __func__, rc); - return -EINVAL; - } - - rc = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - LISTEN_MIN_NUM_PERIODS * LISTEN_MIN_PERIOD_SIZE, - LISTEN_MAX_NUM_PERIODS * LISTEN_MAX_PERIOD_SIZE); - if (rc < 0) { - pr_err("%s: Unable to set pcm constraints, rc %d\n", - __func__, rc); - return -EINVAL; - } - - cpe->core_handle = wcd_cpe_get_core_handle(cpe->codec); - - if (!cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid handle to codec core\n", - __func__); - return -EINVAL; - } - - lsm_ops = &cpe->lsm_ops; - lsm_d = kzalloc(sizeof(struct cpe_lsm_data), GFP_KERNEL); - if (!lsm_d) { - dev_err(rtd->dev, - "%s: ENOMEM for lsm session, size = %zd\n", - __func__, sizeof(struct cpe_lsm_data)); - rc = -ENOMEM; - goto fail_return; - } - mutex_init(&lsm_d->lsm_api_lock); - - lsm_d->lsm_session = lsm_ops->lsm_alloc_session(cpe->core_handle, - lsm_d, msm_cpe_process_event_status); - if (!lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: session allocation failed", - __func__); - rc = -EINVAL; - goto fail_session_alloc; - } - /* Explicitly Assign the LAB thread to STOP state */ - lsm_d->lab.thread_status = MSM_LSM_LAB_THREAD_STOP; - lsm_d->lsm_session->started = false; - lsm_d->substream = substream; - init_waitqueue_head(&lsm_d->lab.period_wait); - lsm_d->cpe_prepared = false; - - dev_dbg(rtd->dev, "%s: allocated session with id = %d\n", - __func__, lsm_d->lsm_session->id); - - - rc = lsm_ops->lsm_open_tx(cpe->core_handle, lsm_d->lsm_session, - LSM_VOICE_WAKEUP_APP_V2, 16000); - if (rc < 0) { - dev_err(rtd->dev, - "%s: OPEN_TX cmd failed, err = %d\n", - __func__, rc); - goto fail_open_tx; - } - - init_waitqueue_head(&lsm_d->event_wait); - atomic_set(&lsm_d->event_avail, 0); - atomic_set(&lsm_d->event_stop, 0); - runtime->private_data = lsm_d; - - return 0; - -fail_open_tx: - lsm_ops->lsm_dealloc_session(cpe->core_handle, lsm_d->lsm_session); - -fail_session_alloc: - mutex_destroy(&lsm_d->lsm_api_lock); - kfree(lsm_d); -fail_return: - return rc; -} - -/* - * msm_cpe_lsm_close: ASoC call to close/cleanup the stream - * @substream: substream that is to be closed - * - * Deallocate the session and release the AFE port. It is not - * required to deregister the sound model as long as we close - * the lsm session on CPE. - */ -static int msm_cpe_lsm_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct wcd_cpe_lsm_ops *lsm_ops; - struct cpe_lsm_session *session; - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *afe_cfg; - int rc = 0; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - lsm_ops = &cpe->lsm_ops; - session = lsm_d->lsm_session; - afe_ops = &cpe->afe_ops; - afe_cfg = &(lsm_d->lsm_session->afe_port_cfg); - - /* - * If driver is closed without stopping LAB, - * explicitly stop LAB before cleaning up the - * driver resources. - */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to stop lab, error = %d\n", - __func__, rc); - return rc; - } - - rc = msm_cpe_afe_port_cntl(substream, - cpe->core_handle, - afe_ops, afe_cfg, - AFE_CMD_PORT_STOP); - - lsm_d->cpe_prepared = false; - - rc = lsm_ops->lsm_close_tx(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: lsm_close fail, err = %d\n", - __func__, rc); - return rc; - } - - lsm_ops->lsm_dealloc_session(cpe->core_handle, session); - runtime->private_data = NULL; - mutex_destroy(&lsm_d->lsm_api_lock); - kfree(lsm_d); - - return rc; -} - -static int msm_cpe_lsm_get_conf_levels( - struct cpe_lsm_session *session, - u8 *conf_levels_ptr) -{ - int rc = 0; - - if (session->num_confidence_levels <= 0) { - pr_debug("%s: conf_levels (%u), skip set params\n", - __func__, - session->num_confidence_levels); - goto done; - } - - session->conf_levels = kzalloc(session->num_confidence_levels, - GFP_KERNEL); - if (!session->conf_levels) { - rc = -ENOMEM; - goto done; - } - - if (copy_from_user(session->conf_levels, - conf_levels_ptr, - session->num_confidence_levels)) { - pr_err("%s: copy_from_user failed for confidence levels %u\n", - __func__, session->num_confidence_levels); - kfree(session->conf_levels); - session->conf_levels = NULL; - rc = -EFAULT; - goto done; - } - -done: - return rc; -} - -static int msm_cpe_lsm_validate_out_format( - struct snd_pcm_substream *substream, - struct snd_lsm_output_format_cfg *cfg) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (!cfg) { - dev_err(rtd->dev, - "%s: Invalid lsm out cfg\n", __func__); - rc = -EINVAL; - goto done; - } - - if (cfg->format != LSM_OUT_FORMAT_PCM && - cfg->format != LSM_OUT_FORMAT_ADPCM) { - dev_err(rtd->dev, - "%s: Invalid format %u\n", - __func__, cfg->format); - rc = -EINVAL; - goto done; - } - - if (cfg->packing != LSM_OUT_DATA_RAW && - cfg->packing != LSM_OUT_DATA_PACKED) { - dev_err(rtd->dev, - "%s: Invalid packing method %u\n", - __func__, cfg->packing); - rc = -EINVAL; - goto done; - } - - if (cfg->events != LSM_OUT_DATA_EVENTS_DISABLED && - cfg->events != LSM_OUT_DATA_EVENTS_ENABLED) { - dev_err(rtd->dev, - "%s: Invalid events provided %u\n", - __func__, cfg->events); - rc = -EINVAL; - goto done; - } - - if (cfg->mode != LSM_OUT_TRANSFER_MODE_RT && - cfg->mode != LSM_OUT_TRANSFER_MODE_FTRT) { - dev_err(rtd->dev, - "%s: Invalid transfer mode %u\n", - __func__, cfg->mode); - rc = -EINVAL; - goto done; - } - -done: - return rc; -} - -/* - * msm_cpe_lsm_ioctl_shared: Shared IOCTL for this platform driver - * @substream: ASoC substream for which the operation is invoked - * @cmd: command for the ioctl - * @arg: argument for the ioctl - * - * Perform dedicated listen functions like register sound model, - * deregister sound model, etc - * Called with lsm_api_lock acquired. - */ -static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_lsm_sound_model_v2 snd_model; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_session *session; - struct wcd_cpe_lsm_ops *lsm_ops; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct msm_slim_dma_data *dma_data = NULL; - struct snd_lsm_detection_params det_params; - int rc = 0; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - switch (cmd) { - case SNDRV_LSM_STOP_LAB: - dev_dbg(rtd->dev, - "%s: %s, lab_enable = %d, lab_thread_ststus = %d\n", - __func__, "SNDRV_LSM_STOP_LAB", - session->lab_enable, - lab_d->thread_status); - - if (session->lab_enable && - lab_d->thread_status != MSM_LSM_LAB_THREAD_STOP) { - atomic_inc(&lab_d->abort_read); - wake_up(&lab_d->period_wait); - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: stop LAB failed, error = %d\n", - __func__, rc); - return rc; - } - } else if (!session->lab_enable) { - dev_dbg(rtd->dev, - "%s: LAB already stopped\n", - __func__); - } - - break; - - case SNDRV_LSM_LAB_CONTROL: - if (copy_from_user(&session->lab_enable, (void *)arg, - sizeof(u32))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size %zd\n", - __func__, sizeof(u32)); - return -EFAULT; - } - - dev_dbg(rtd->dev, - "%s: %s, lab_enable = %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", - session->lab_enable); - if (rtd->cpu_dai) - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) { - dev_err(rtd->dev, - "%s: dma_data is not set\n", __func__); - return -EINVAL; - } - - if (session->lab_enable) { - rc = msm_cpe_lab_buf_alloc(substream, - session, dma_data); - if (rc < 0) { - dev_err(rtd->dev, - "%s: lab buffer alloc failed, err = %d\n", - __func__, rc); - return rc; - } - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = lab_d->pcm_buf[0].mem; - dma_buf->addr = lab_d->pcm_buf[0].phys; - dma_buf->bytes = (lsm_d->hw_params.buf_sz * - lsm_d->hw_params.period_count); - init_completion(&lab_d->thread_complete); - snd_pcm_set_runtime_buffer(substream, - &substream->dma_buffer); - rc = lsm_ops->lsm_lab_control(cpe->core_handle, - session, true); - if (rc < 0) { - dev_err(rtd->dev, - "%s: Lab Enable Failed rc %d\n", - __func__, rc); - return rc; - } - } else { - /* - * It is possible that lab is still enabled - * when trying to de-allocate the lab buffer. - * Make sure to disable lab before de-allocating - * the lab buffer. - */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc < 0) { - dev_err(rtd->dev, - "%s: LAB stop failed, error = %d\n", - __func__, rc); - return rc; - } - /* - * Buffer has to be de-allocated even if - * lab_control failed. - */ - rc = msm_cpe_lab_buf_dealloc(substream, - session, dma_data); - if (rc < 0) { - dev_err(rtd->dev, - "%s: lab buffer free failed, err = %d\n", - __func__, rc); - return rc; - } - } - break; - case SNDRV_LSM_REG_SND_MODEL_V2: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_REG_SND_MODEL_V2"); - - memcpy(&snd_model, arg, - sizeof(struct snd_lsm_sound_model_v2)); - - session->num_confidence_levels = - snd_model.num_confidence_levels; - rc = msm_cpe_lsm_get_conf_levels(session, - snd_model.confidence_level); - if (rc) { - dev_err(rtd->dev, - "%s: %s get_conf_levels fail, err = %d\n", - __func__, "SNDRV_LSM_REG_SND_MODEL_V2", - rc); - break; - } - - session->snd_model_data = kzalloc(snd_model.data_size, - GFP_KERNEL); - if (!session->snd_model_data) { - kfree(session->conf_levels); - session->conf_levels = NULL; - return -ENOMEM; - } - session->snd_model_size = snd_model.data_size; - - if (copy_from_user(session->snd_model_data, - snd_model.data, snd_model.data_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for snd_model\n", - __func__); - kfree(session->conf_levels); - kfree(session->snd_model_data); - session->conf_levels = NULL; - session->snd_model_data = NULL; - return -EFAULT; - } - - rc = lsm_ops->lsm_shmem_alloc(cpe->core_handle, session, - session->snd_model_size); - if (rc != 0) { - dev_err(rtd->dev, - "%s: shared memory allocation failed, err = %d\n", - __func__, rc); - kfree(session->snd_model_data); - kfree(session->conf_levels); - session->snd_model_data = NULL; - session->conf_levels = NULL; - return rc; - } - - rc = lsm_ops->lsm_register_snd_model(cpe->core_handle, session, - snd_model.detection_mode, - snd_model.detect_failure); - if (rc != 0) { - dev_err(rtd->dev, - "%s: snd_model_reg failed, err = %d\n", - __func__, rc); - lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); - kfree(session->snd_model_data); - kfree(session->conf_levels); - session->snd_model_data = NULL; - session->conf_levels = NULL; - return rc; - } - - break; - - case SNDRV_LSM_DEREG_SND_MODEL: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_DEREG_SND_MODEL"); - - if (session->lab_enable) { - /* - * It is possible that lab is still enabled - * when trying to deregister sound model. - * Make sure to disable lab before de-allocating - * the lab buffer. - */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: LAB stop failed, error = %d\n", - __func__, rc); - return rc; - } - - rc = lsm_ops->lsm_lab_control(cpe->core_handle, - session, false); - if (rc) - dev_err(rtd->dev, - "%s: Lab Disable Failed rc %d\n", - __func__, rc); - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, - substream); - if (!dma_data || !dma_data->dai_channel_ctl) - dev_err(rtd->dev, - "%s: dma_data is not set\n", __func__); - - /* - * Buffer has to be de-allocated even if - * lab_control failed and/or dma data is invalid. - */ - rc = msm_cpe_lab_buf_dealloc(substream, - session, dma_data); - if (rc < 0) - dev_err(rtd->dev, - "%s: lab buffer free failed, err = %d\n", - __func__, rc); - } - - rc = lsm_ops->lsm_deregister_snd_model( - cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: snd_model de-reg failed, err = %d\n", - __func__, rc); - return rc; - } - - kfree(session->snd_model_data); - kfree(session->conf_levels); - session->snd_model_data = NULL; - session->conf_levels = NULL; - - rc = lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: LSM shared memory dealloc failed, err = %d\n", - __func__, rc); - return rc; - } - - break; - - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status *user; - struct snd_lsm_event_status_v3 *user_v3; - - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_EVENT_STATUS(_V3)"); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, - "SNDRV_LSM_EVENT_STATUS(_V3)"); - return -EINVAL; - } - - /* - * Release the api lock before wait to allow - * other IOCTLs to be invoked while waiting - * for event - */ - MSM_CPE_LSM_REL_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - rc = wait_event_freezable(lsm_d->event_wait, - (atomic_read(&lsm_d->event_avail) == 1) || - (atomic_read(&lsm_d->event_stop) == 1)); - - MSM_CPE_LSM_GRAB_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - if (!rc) { - if (atomic_read(&lsm_d->event_avail) == 1) { - rc = 0; - atomic_set(&lsm_d->event_avail, 0); - - if (cmd == SNDRV_LSM_EVENT_STATUS) { - user = arg; - if (lsm_d->ev_det_pld_size > - user->payload_size) { - dev_err(rtd->dev, - "%s: avail pld_bytes = %u, needed = %u\n", - __func__, - user->payload_size, - lsm_d->ev_det_pld_size); - return -EINVAL; - } - - user->status = lsm_d->ev_det_status; - user->payload_size = - lsm_d->ev_det_pld_size; - memcpy(user->payload, - lsm_d->ev_det_payload, - lsm_d->ev_det_pld_size); - } else { - user_v3 = arg; - if (lsm_d->ev_det_pld_size > - user_v3->payload_size) { - dev_err(rtd->dev, - "%s: avail pld_bytes = %u, needed = %u\n", - __func__, - user_v3->payload_size, - lsm_d->ev_det_pld_size); - return -EINVAL; - } - /* event status timestamp not supported - * on CPE mode. Set msw and lsw to 0. - */ - user_v3->timestamp_lsw = 0; - user_v3->timestamp_msw = 0; - user_v3->status = lsm_d->ev_det_status; - user_v3->payload_size = - lsm_d->ev_det_pld_size; - memcpy(user_v3->payload, - lsm_d->ev_det_payload, - lsm_d->ev_det_pld_size); - } - } else if (atomic_read(&lsm_d->event_stop) == 1) { - dev_dbg(rtd->dev, - "%s: wait_aborted\n", __func__); - if (cmd == SNDRV_LSM_EVENT_STATUS) { - user = arg; - user->payload_size = 0; - } else { - user_v3 = arg; - user_v3->payload_size = 0; - } - rc = 0; - } - } - } - break; - - case SNDRV_LSM_ABORT_EVENT: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_ABORT_EVENT"); - atomic_set(&lsm_d->event_stop, 1); - wake_up(&lsm_d->event_wait); - break; - - case SNDRV_LSM_START: - dev_dbg(rtd->dev, - "%s: %s\n", - __func__, "SNDRV_LSM_START"); - rc = lsm_ops->lsm_start(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: lsm_start fail, err = %d\n", - __func__, rc); - return rc; - } - session->started = true; - break; - - case SNDRV_LSM_STOP: - dev_dbg(rtd->dev, - "%s: %s, lab_enable = %d, lab_thread_status = %d\n", - __func__, "SNDRV_LSM_STOP", - session->lab_enable, - lab_d->thread_status); - if ((session->lab_enable && - lab_d->thread_status == - MSM_LSM_LAB_THREAD_RUNNING)) { - /* Explicitly stop LAB */ - rc = msm_cpe_lsm_lab_stop(substream); - if (rc) { - dev_err(rtd->dev, - "%s: lab_stop failed, err = %d\n", - __func__, rc); - return rc; - } - } - - rc = lsm_ops->lsm_stop(cpe->core_handle, session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: lsm_stop fail err = %d\n", - __func__, rc); - - return rc; - } - session->started = false; - break; - - case SNDRV_LSM_SET_PARAMS: - memcpy(&det_params, arg, - sizeof(det_params)); - if (det_params.num_confidence_levels <= 0) { - dev_err(rtd->dev, - "%s: %s: Invalid confidence levels %u\n", - __func__, "SNDRV_LSM_SET_PARAMS", - det_params.num_confidence_levels); - return -EINVAL; - } - - session->num_confidence_levels = - det_params.num_confidence_levels; - rc = msm_cpe_lsm_get_conf_levels(session, - det_params.conf_level); - if (rc) { - dev_err(rtd->dev, - "%s: %s get_conf_levels fail, err = %d\n", - __func__, "SNDRV_LSM_SET_PARAMS", - rc); - break; - } - - rc = lsm_ops->lsm_set_data(cpe->core_handle, session, - det_params.detect_mode, - det_params.detect_failure); - if (rc) { - dev_err(rtd->dev, - "%s: lsm_set_data failed, err = %d\n", - __func__, rc); - return rc; - } - - kfree(session->conf_levels); - session->conf_levels = NULL; - - break; - - case SNDRV_LSM_OUT_FORMAT_CFG: { - struct snd_lsm_output_format_cfg u_fmt_cfg; - - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, "SNDRV_LSM_OUT_FORMAT_CFG"); - return -EINVAL; - } - - if (copy_from_user(&u_fmt_cfg, arg, - sizeof(u_fmt_cfg))) { - dev_err(rtd->dev, - "%s: copy_from_user failed for out_fmt_cfg\n", - __func__); - return -EFAULT; - } - - if (msm_cpe_lsm_validate_out_format(substream, - &u_fmt_cfg)) - return -EINVAL; - - session->out_fmt_cfg.format = u_fmt_cfg.format; - session->out_fmt_cfg.pack_mode = u_fmt_cfg.packing; - session->out_fmt_cfg.data_path_events = - u_fmt_cfg.events; - session->out_fmt_cfg.transfer_mode = u_fmt_cfg.mode; - - rc = lsm_ops->lsm_set_fmt_cfg(cpe->core_handle, - session); - if (rc) { - dev_err(rtd->dev, - "%s: lsm_set_fmt_cfg failed, err = %d\n", - __func__, rc); - return rc; - } - } - break; - - case SNDRV_LSM_SET_PORT: { - u32 port_id = cpe->input_port_id; - - dev_dbg(rtd->dev, "%s: %s\n", __func__, "SNDRV_LSM_SET_PORT"); - rc = lsm_ops->lsm_set_port(cpe->core_handle, session, &port_id); - if (rc) { - dev_err(rtd->dev, - "%s: lsm_set_port failed, err = %d\n", - __func__, rc); - return rc; - } - } - break; - - default: - dev_dbg(rtd->dev, - "%s: Default snd_lib_ioctl cmd 0x%x\n", - __func__, cmd); - rc = snd_pcm_lib_ioctl(substream, cmd, arg); - } - - return rc; -} - -static int msm_cpe_lsm_lab_start(struct snd_pcm_substream *substream, - u16 event_det_status) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct cpe_lsm_lab *lab_d = NULL; - struct cpe_hw_params *hw_params; - struct wcd_cpe_lsm_ops *lsm_ops; - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *out_port; - int rc; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - __func__, substream); - return -EINVAL; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - lab_d = &lsm_d->lab; - afe_ops = &cpe->afe_ops; - hw_params = &lsm_d->hw_params; - - if (!session->started) { - dev_dbg(rtd->dev, - "%s: Session is stopped, cannot start LAB\n", - __func__); - return 0; - } - - reinit_completion(&lab_d->thread_complete); - - if (session->lab_enable && - event_det_status == - LSM_VOICE_WAKEUP_STATUS_DETECTED) { - out_port = &session->afe_out_port_cfg; - out_port->port_id = session->afe_out_port_id; - out_port->bit_width = hw_params->sample_size; - out_port->num_channels = hw_params->channels; - out_port->sample_rate = hw_params->sample_rate; - dev_dbg(rtd->dev, "%s: port_id= %u, bit_width= %u, rate= %u\n", - __func__, out_port->port_id, out_port->bit_width, - out_port->sample_rate); - - rc = afe_ops->afe_port_cmd_cfg(cpe->core_handle, - out_port); - if (rc) { - dev_err(rtd->dev, - "%s: Failed afe generic config v2, err = %d\n", - __func__, rc); - return rc; - } - - atomic_set(&lab_d->abort_read, 0); - dev_dbg(rtd->dev, - "%s: KW detected, scheduling LAB thread\n", - __func__); - - /* - * Even though thread might be only scheduled and - * not currently running, mark the internal driver - * status to running so driver can cancel this thread - * if it needs to before the thread gets chance to run. - */ - lab_d->thread_status = MSM_LSM_LAB_THREAD_RUNNING; - session->lsm_lab_thread = kthread_run( - msm_cpe_lab_thread, - lsm_d, - "lab_thread"); - } - - return 0; -} - -static bool msm_cpe_lsm_is_valid_stream(struct snd_pcm_substream *substream, - const char *func) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - func, substream); - return false; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - func); - return false; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - func); - return false; - } - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (!lsm_ops) { - dev_err(rtd->dev, - "%s: Invalid lsm_ops\n", func); - return false; - } - - return true; -} - -static int msm_cpe_lsm_set_epd(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - struct snd_lsm_ep_det_thres epd_thres; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size != sizeof(epd_thres)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&epd_thres, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, &epd_thres, - LSM_ENDPOINT_DETECT_THRESHOLD); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(epd_threshold) failed, rc %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_cpe_lsm_set_mode(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - struct snd_lsm_detect_mode det_mode; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size != sizeof(det_mode)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&det_mode, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, &det_mode, - LSM_OPERATION_MODE); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(epd_threshold) failed, rc %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_cpe_lsm_set_gain(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - struct snd_lsm_gain gain; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size != sizeof(gain)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&gain, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, &gain, - LSM_GAIN); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(epd_threshold) failed, rc %d\n", - __func__, rc); -done: - return rc; - -} - -static int msm_cpe_lsm_set_conf(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - session->num_confidence_levels = - p_info->param_size; - rc = msm_cpe_lsm_get_conf_levels(session, - p_info->param_data); - if (rc) { - dev_err(rtd->dev, - "%s: get_conf_levels failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, NULL, - LSM_MIN_CONFIDENCE_LEVELS); - if (unlikely(rc)) - dev_err(rtd->dev, - "%s: set_one_param(conf_levels) failed, rc %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_cpe_lsm_reg_model(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - int rc; - size_t offset; - u8 *snd_model_ptr; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - lsm_ops->lsm_get_snd_model_offset(cpe->core_handle, - session, &offset); - /* Check if 'p_info->param_size + offset' crosses U32_MAX. */ - if (p_info->param_size > U32_MAX - offset) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - return -EINVAL; - } - session->snd_model_size = p_info->param_size + offset; - - session->snd_model_data = vzalloc(session->snd_model_size); - if (!session->snd_model_data) - return -ENOMEM; - - snd_model_ptr = ((u8 *) session->snd_model_data) + offset; - - if (copy_from_user(snd_model_ptr, - p_info->param_data, p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user for snd_model failed\n", - __func__); - rc = -EFAULT; - goto free_snd_model_data; - } - - rc = lsm_ops->lsm_shmem_alloc(cpe->core_handle, session, - session->snd_model_size); - if (rc != 0) { - dev_err(rtd->dev, - "%s: shared memory allocation failed, err = %d\n", - __func__, rc); - rc = -EINVAL; - goto free_snd_model_data; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, NULL, - LSM_REG_SND_MODEL); - if (unlikely(rc)) { - dev_err(rtd->dev, - "%s: set_one_param(snd_model) failed, rc %d\n", - __func__, rc); - goto dealloc_shmem; - } - return 0; - -dealloc_shmem: - lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); - -free_snd_model_data: - vfree(session->snd_model_data); - return rc; -} - -static int msm_cpe_lsm_dereg_model(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, NULL, - LSM_DEREG_SND_MODEL); - if (rc) - dev_err(rtd->dev, - "%s: dereg_snd_model failed\n", - __func__); - return lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); -} - -static int msm_cpe_lsm_set_custom(struct snd_pcm_substream *substream, - struct lsm_params_info *p_info) -{ - struct snd_soc_pcm_runtime *rtd; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - u8 *data; - int rc; - - if (!msm_cpe_lsm_is_valid_stream(substream, __func__)) - return -EINVAL; - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - if (p_info->param_size > MSM_CPE_MAX_CUSTOM_PARAM_SIZE) { - dev_err(rtd->dev, - "%s: invalid size %d, max allowed %d\n", - __func__, p_info->param_size, - MSM_CPE_MAX_CUSTOM_PARAM_SIZE); - return -EINVAL; - } - - data = kzalloc(p_info->param_size, GFP_KERNEL); - if (!data) - return -ENOMEM; - - if (copy_from_user(data, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for custom params, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto err_ret; - } - - rc = lsm_ops->lsm_set_one_param(cpe->core_handle, - session, p_info, data, - LSM_CUSTOM_PARAMS); - if (rc) - dev_err(rtd->dev, - "%s: custom_params failed, err = %d\n", - __func__, rc); -err_ret: - kfree(data); - return rc; -} - -static int msm_cpe_lsm_process_params(struct snd_pcm_substream *substream, - struct snd_lsm_module_params *p_data, - void *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct lsm_params_info *p_info; - int i; - int rc = 0; - - p_info = (struct lsm_params_info *) params; - - for (i = 0; i < p_data->num_params; i++) { - dev_dbg(rtd->dev, - "%s: param (%d), module_id = 0x%x, param_id = 0x%x, param_size = 0x%x, param_type = 0x%x\n", - __func__, i, p_info->module_id, - p_info->param_id, p_info->param_size, - p_info->param_type); - - switch (p_info->param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: - rc = msm_cpe_lsm_set_epd(substream, p_info); - break; - case LSM_OPERATION_MODE: - rc = msm_cpe_lsm_set_mode(substream, p_info); - break; - case LSM_GAIN: - rc = msm_cpe_lsm_set_gain(substream, p_info); - break; - case LSM_MIN_CONFIDENCE_LEVELS: - rc = msm_cpe_lsm_set_conf(substream, p_info); - break; - case LSM_REG_SND_MODEL: - rc = msm_cpe_lsm_reg_model(substream, p_info); - break; - case LSM_DEREG_SND_MODEL: - rc = msm_cpe_lsm_dereg_model(substream, p_info); - break; - case LSM_CUSTOM_PARAMS: - rc = msm_cpe_lsm_set_custom(substream, p_info); - break; - default: - dev_err(rtd->dev, - "%s: Invalid param_type %d\n", - __func__, p_info->param_type); - rc = -EINVAL; - break; - } - if (rc) { - pr_err("%s: set_param fail for param_type %d\n", - __func__, p_info->param_type); - return rc; - } - - p_info++; - } - - return rc; -} - -static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - struct snd_soc_pcm_runtime *rtd; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - __func__, substream); - return -EINVAL; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - MSM_CPE_LSM_GRAB_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - switch (cmd) { - case SNDRV_LSM_REG_SND_MODEL_V2: { - struct snd_lsm_sound_model_v2 snd_model; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "LSM_REG_SND_MODEL_V2"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&snd_model, (void *)arg, - sizeof(struct snd_lsm_sound_model_v2))) { - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_sound_model_v2)); - err = -EFAULT; - goto done; - } - - err = msm_cpe_lsm_ioctl_shared(substream, cmd, - &snd_model); - } - break; - case SNDRV_LSM_EVENT_STATUS: { - struct snd_lsm_event_status u_event_status; - struct snd_lsm_event_status *event_status = NULL; - int u_pld_size = 0; - - if (copy_from_user(&u_event_status, (void *)arg, - sizeof(struct snd_lsm_event_status))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status)); - err = -EFAULT; - goto done; - } - - if (u_event_status.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status) + - u_event_status.payload_size; - - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - } - - if (!err && copy_to_user(arg, event_status, u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - } - break; - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status_v3 u_event_status; - struct snd_lsm_event_status_v3 *event_status = NULL; - int u_pld_size = 0; - - if (copy_from_user(&u_event_status, (void *)arg, - sizeof(struct snd_lsm_event_status_v3))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status_v3)); - err = -EFAULT; - goto done; - } - - if (u_event_status.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status_v3) + - u_event_status.payload_size; - - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - } - - if (!err && copy_to_user(arg, event_status, u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - } - break; - case SNDRV_LSM_SET_PARAMS: { - struct snd_lsm_detection_params det_params; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&det_params, (void *) arg, - sizeof(det_params))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS", - sizeof(det_params)); - err = -EFAULT; - goto done; - } - - err = msm_cpe_lsm_ioctl_shared(substream, cmd, - &det_params); - } - break; - - case SNDRV_LSM_SET_MODULE_PARAMS: { - struct snd_lsm_module_params p_data; - size_t p_size; - u8 *params; - - if (!session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS"); - err = -EINVAL; - goto done; - } - - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data, arg, - sizeof(p_data))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "p_data", sizeof(p_data)); - err = -EFAULT; - goto done; - } - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS", - p_data.num_params); - err = -EINVAL; - goto done; - } - - p_size = p_data.num_params * - sizeof(struct lsm_params_info); - - if (p_data.data_size != p_size) { - dev_err(rtd->dev, - "%s: %s: Invalid size %zd\n", - __func__, "SET_MODULE_PARAMS", p_size); - - err = -EFAULT; - goto done; - } - - params = kzalloc(p_size, GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "params", p_data.data_size); - kfree(params); - err = -EFAULT; - goto done; - } - - err = msm_cpe_lsm_process_params(substream, &p_data, params); - if (err) - dev_err(rtd->dev, - "%s: %s: Failed to set params, err = %d\n", - __func__, "SET_MODULE_PARAMS", err); - kfree(params); - break; - } - default: - err = msm_cpe_lsm_ioctl_shared(substream, cmd, arg); - break; - } - -done: - MSM_CPE_LSM_REL_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - return err; -} - -#ifdef CONFIG_COMPAT -struct snd_lsm_sound_model_v2_32 { - compat_uptr_t data; - compat_uptr_t confidence_level; - u32 data_size; - enum lsm_detection_mode detection_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct snd_lsm_detection_params_32 { - compat_uptr_t conf_level; - enum lsm_detection_mode detect_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct lsm_params_info_32 { - u32 module_id; - u32 param_id; - u32 param_size; - compat_uptr_t param_data; - uint32_t param_type; -}; - -struct snd_lsm_module_params_32 { - compat_uptr_t params; - u32 num_params; - u32 data_size; -}; - -enum { - SNDRV_LSM_REG_SND_MODEL_V2_32 = - _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), - SNDRV_LSM_SET_PARAMS32 = - _IOW('U', 0x0A, struct snd_lsm_detection_params_32), - SNDRV_LSM_SET_MODULE_PARAMS_32 = - _IOW('U', 0x0B, struct snd_lsm_module_params_32), -}; - -static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - struct snd_soc_pcm_runtime *rtd; - struct cpe_priv *cpe = NULL; - struct cpe_lsm_data *lsm_d = NULL; - struct cpe_lsm_session *session = NULL; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%pK)\n", - __func__, substream); - return -EINVAL; - } - - rtd = substream->private_data; - lsm_d = cpe_get_lsm_data(substream); - cpe = cpe_get_private_data(substream); - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - MSM_CPE_LSM_GRAB_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - - session = lsm_d->lsm_session; - lsm_ops = &cpe->lsm_ops; - - switch (cmd) { - case SNDRV_LSM_REG_SND_MODEL_V2_32: { - struct snd_lsm_sound_model_v2 snd_model; - struct snd_lsm_sound_model_v2_32 snd_model32; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "LSM_REG_SND_MODEL_V2_32"); - err = -EINVAL; - goto done; - } - - dev_dbg(rtd->dev, - "%s: ioctl %s\n", __func__, - "SNDRV_LSM_REG_SND_MODEL_V2_32"); - - if (copy_from_user(&snd_model32, (void *)arg, - sizeof(snd_model32))) { - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, - sizeof(snd_model32)); - err = -EFAULT; - goto done; - } - - snd_model.data = compat_ptr(snd_model32.data); - snd_model.confidence_level = - compat_ptr(snd_model32.confidence_level); - snd_model.data_size = snd_model32.data_size; - snd_model.detect_failure = snd_model32.detect_failure; - snd_model.num_confidence_levels = - snd_model32.num_confidence_levels; - snd_model.detection_mode = snd_model32.detection_mode; - - cmd = SNDRV_LSM_REG_SND_MODEL_V2; - err = msm_cpe_lsm_ioctl_shared(substream, cmd, &snd_model); - if (err) - dev_err(rtd->dev, - "%s: %s failed, error = %d\n", - __func__, - "SNDRV_LSM_REG_SND_MODEL_V2_32", - err); - } - break; - case SNDRV_LSM_EVENT_STATUS: { - struct snd_lsm_event_status *event_status = NULL; - struct snd_lsm_event_status u_event_status32; - struct snd_lsm_event_status *udata_32 = NULL; - int u_pld_size = 0; - - dev_dbg(rtd->dev, - "%s: ioctl %s\n", __func__, - "SNDRV_LSM_EVENT_STATUS32"); - - if (copy_from_user(&u_event_status32, (void *)arg, - sizeof(struct snd_lsm_event_status))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status)); - err = -EFAULT; - goto done; - } - - if (u_event_status32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status) + - u_event_status32.payload_size; - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - dev_err(rtd->dev, - "%s: No memory for event status\n", - __func__); - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status32.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - if (err) - dev_err(rtd->dev, - "%s: %s failed, error = %d\n", - __func__, - "SNDRV_LSM_EVENT_STATUS32", - err); - } - - if (!err) { - udata_32 = kzalloc(u_pld_size, GFP_KERNEL); - if (!udata_32) { - dev_err(rtd->dev, - "%s: nomem for udata\n", - __func__); - err = -EFAULT; - } else { - udata_32->status = event_status->status; - udata_32->payload_size = - event_status->payload_size; - memcpy(udata_32->payload, - event_status->payload, - u_pld_size); - } - } - - if (!err && copy_to_user(arg, udata_32, - u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - kfree(udata_32); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - kfree(udata_32); - } - break; - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status_v3 *event_status = NULL; - struct snd_lsm_event_status_v3 u_event_status32; - struct snd_lsm_event_status_v3 *udata_32 = NULL; - int u_pld_size = 0; - - dev_dbg(rtd->dev, - "%s: ioctl %s\n", __func__, - "SNDRV_LSM_EVENT_STATUS_V3_32"); - - if (copy_from_user(&u_event_status32, (void *)arg, - sizeof(struct snd_lsm_event_status_v3))) { - dev_err(rtd->dev, - "%s: event status copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_event_status_v3)); - err = -EFAULT; - goto done; - } - - if (u_event_status32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, u_event_status32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - u_pld_size = sizeof(struct snd_lsm_event_status_v3) + - u_event_status32.payload_size; - event_status = kzalloc(u_pld_size, GFP_KERNEL); - if (!event_status) { - dev_err(rtd->dev, - "%s: No memory for event status\n", - __func__); - err = -ENOMEM; - goto done; - } else { - event_status->payload_size = - u_event_status32.payload_size; - err = msm_cpe_lsm_ioctl_shared(substream, - cmd, event_status); - if (err) - dev_err(rtd->dev, - "%s: %s failed, error = %d\n", - __func__, - "SNDRV_LSM_EVENT_STATUS_V3_32", - err); - } - - if (!err) { - udata_32 = kzalloc(u_pld_size, GFP_KERNEL); - if (!udata_32) { - dev_err(rtd->dev, - "%s: nomem for udata\n", - __func__); - err = -EFAULT; - } else { - udata_32->timestamp_lsw = - event_status->timestamp_lsw; - udata_32->timestamp_msw = - event_status->timestamp_msw; - udata_32->status = event_status->status; - udata_32->payload_size = - event_status->payload_size; - memcpy(udata_32->payload, - event_status->payload, - u_pld_size); - } - } - - if (!err && copy_to_user(arg, udata_32, - u_pld_size)) { - dev_err(rtd->dev, - "%s: copy to user failed\n", - __func__); - kfree(event_status); - kfree(udata_32); - err = -EFAULT; - goto done; - } - - msm_cpe_lsm_lab_start(substream, event_status->status); - msm_cpe_process_event_status_done(lsm_d); - kfree(event_status); - kfree(udata_32); - } - break; - case SNDRV_LSM_SET_PARAMS32: { - struct snd_lsm_detection_params_32 det_params32; - struct snd_lsm_detection_params det_params; - - if (session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SNDRV_LSM_SET_PARAMS32"); - - err = -EINVAL; - goto done; - } - - if (copy_from_user(&det_params32, arg, - sizeof(det_params32))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS_32", - sizeof(det_params32)); - } else { - det_params.conf_level = - compat_ptr(det_params32.conf_level); - det_params.detect_mode = - det_params32.detect_mode; - det_params.num_confidence_levels = - det_params32.num_confidence_levels; - det_params.detect_failure = - det_params32.detect_failure; - cmd = SNDRV_LSM_SET_PARAMS; - err = msm_cpe_lsm_ioctl_shared(substream, cmd, - &det_params); - if (err) - dev_err(rtd->dev, - "%s: ioctl %s failed\n", __func__, - "SNDRV_LSM_SET_PARAMS"); - } - - break; - } - - case SNDRV_LSM_SET_MODULE_PARAMS_32: { - struct snd_lsm_module_params_32 p_data_32; - struct snd_lsm_module_params p_data; - u8 *params, *params32; - size_t p_size; - struct lsm_params_info_32 *p_info_32; - struct lsm_params_info *p_info; - int i; - - if (!session->is_topology_used) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS_32"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data_32, arg, - sizeof(p_data_32))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SET_MODULE_PARAMS_32", - sizeof(p_data_32)); - err = -EFAULT; - goto done; - } - - p_data.params = compat_ptr(p_data_32.params); - p_data.num_params = p_data_32.num_params; - p_data.data_size = p_data_32.data_size; - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS_32", - p_data.num_params); - err = -EINVAL; - goto done; - } - - if (p_data.data_size != - (p_data.num_params * sizeof(struct lsm_params_info_32))) { - dev_err(rtd->dev, - "%s: %s: Invalid size %d\n", - __func__, "SET_MODULE_PARAMS_32", - p_data.data_size); - err = -EINVAL; - goto done; - } - - p_size = sizeof(struct lsm_params_info_32) * - p_data.num_params; - - params32 = kzalloc(p_size, GFP_KERNEL); - if (!params32) { - err = -ENOMEM; - goto done; - } - - p_size = sizeof(struct lsm_params_info) * p_data.num_params; - params = kzalloc(p_size, GFP_KERNEL); - if (!params) { - kfree(params32); - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params32, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "params32", p_data.data_size); - kfree(params32); - kfree(params); - err = -EFAULT; - goto done; - } - - p_info_32 = (struct lsm_params_info_32 *) params32; - p_info = (struct lsm_params_info *) params; - for (i = 0; i < p_data.num_params; i++) { - p_info->module_id = p_info_32->module_id; - p_info->param_id = p_info_32->param_id; - p_info->param_size = p_info_32->param_size; - p_info->param_data = compat_ptr(p_info_32->param_data); - p_info->param_type = p_info_32->param_type; - - p_info_32++; - p_info++; - } - - err = msm_cpe_lsm_process_params(substream, - &p_data, params); - if (err) - dev_err(rtd->dev, - "%s: Failed to process params, err = %d\n", - __func__, err); - kfree(params); - kfree(params32); - break; - } - case SNDRV_LSM_REG_SND_MODEL_V2: - case SNDRV_LSM_SET_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS: - /* - * In ideal cases, the compat_ioctl should never be called - * with the above unlocked ioctl commands. Print error - * and return error if it does. - */ - dev_err(rtd->dev, - "%s: Invalid cmd for compat_ioctl\n", - __func__); - err = -EINVAL; - break; - default: - err = msm_cpe_lsm_ioctl_shared(substream, cmd, arg); - break; - } -done: - MSM_CPE_LSM_REL_LOCK(&lsm_d->lsm_api_lock, - "lsm_api_lock"); - return err; -} - -#else -#define msm_cpe_lsm_ioctl_compat NULL -#endif - -/* - * msm_cpe_lsm_prepare: prepare call from ASoC core for this platform - * @substream: ASoC substream for which the operation is invoked - * - * start the AFE port on CPE associated for this listen session - */ -static int msm_cpe_lsm_prepare(struct snd_pcm_substream *substream) -{ - int rc = 0; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *afe_cfg; - struct cpe_lsm_session *lsm_session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_hw_params lsm_param; - struct wcd_cpe_lsm_ops *lsm_ops; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - if (runtime->status->state == SNDRV_PCM_STATE_XRUN || - runtime->status->state == SNDRV_PCM_STATE_PREPARED) { - pr_err("%s: XRUN ignore for now\n", __func__); - return 0; - } - - lsm_session = lsm_d->lsm_session; - lab_d->pcm_size = snd_pcm_lib_buffer_bytes(substream); - - dev_dbg(rtd->dev, - "%s: pcm_size 0x%x", __func__, lab_d->pcm_size); - - if (lsm_d->cpe_prepared) { - dev_dbg(rtd->dev, "%s: CPE is alredy prepared\n", - __func__); - return 0; - } - - lsm_ops = &cpe->lsm_ops; - afe_ops = &cpe->afe_ops; - afe_cfg = &(lsm_d->lsm_session->afe_port_cfg); - - switch (cpe->input_port_id) { - case AFE_PORT_ID_3: - afe_cfg->port_id = AFE_PORT_ID_3; - afe_cfg->bit_width = 16; - afe_cfg->num_channels = 1; - afe_cfg->sample_rate = SAMPLE_RATE_48KHZ; - rc = afe_ops->afe_port_cmd_cfg(cpe->core_handle, afe_cfg); - break; - case AFE_PORT_ID_1: - default: - afe_cfg->port_id = AFE_PORT_ID_1; - afe_cfg->bit_width = 16; - afe_cfg->num_channels = 1; - afe_cfg->sample_rate = SAMPLE_RATE_16KHZ; - rc = afe_ops->afe_set_params(cpe->core_handle, - afe_cfg, cpe->afe_mad_ctl); - break; - } - - if (rc != 0) { - dev_err(rtd->dev, - "%s: cpe afe params failed for port = %d, err = %d\n", - __func__, afe_cfg->port_id, rc); - return rc; - } - lsm_param.sample_rate = afe_cfg->sample_rate; - lsm_param.num_chs = afe_cfg->num_channels; - lsm_param.bit_width = afe_cfg->bit_width; - rc = lsm_ops->lsm_set_media_fmt_params(cpe->core_handle, lsm_session, - &lsm_param); - if (rc) - dev_dbg(rtd->dev, - "%s: failed to set lsm media fmt params, err = %d\n", - __func__, rc); - - /* Send connect to port (input) */ - rc = lsm_ops->lsm_set_port(cpe->core_handle, lsm_session, - &cpe->input_port_id); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to set connect input port, err=%d\n", - __func__, rc); - return rc; - } - - if (cpe->input_port_id != 3) { - rc = lsm_ops->lsm_get_afe_out_port_id(cpe->core_handle, - lsm_session); - if (rc != 0) { - dev_err(rtd->dev, - "%s: failed to get port id, err = %d\n", - __func__, rc); - return rc; - } - /* Send connect to port (output) */ - rc = lsm_ops->lsm_set_port(cpe->core_handle, lsm_session, - &lsm_session->afe_out_port_id); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to set connect output port, err=%d\n", - __func__, rc); - return rc; - } - } - rc = msm_cpe_afe_port_cntl(substream, - cpe->core_handle, - afe_ops, afe_cfg, - AFE_CMD_PORT_START); - if (rc) - dev_err(rtd->dev, - "%s: cpe_afe_port start failed, err = %d\n", - __func__, rc); - else - lsm_d->cpe_prepared = true; - - return rc; -} - -/* - * msm_cpe_lsm_trigger: trigger call from ASoC core for this platform - * @substream: ASoC substream for which the operation is invoked - * @cmd: the trigger command from framework - * - * suspend/resume the AFE port on CPE associated with listen session - */ -static int msm_cpe_lsm_trigger(struct snd_pcm_substream *substream, - int cmd) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct wcd_cpe_afe_ops *afe_ops; - struct wcd_cpe_afe_port_cfg *afe_cfg; - int afe_cmd = AFE_CMD_INVALID; - int rc = 0; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid private data\n", - __func__); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid session data\n", - __func__); - return -EINVAL; - } - - afe_ops = &cpe->afe_ops; - afe_cfg = &(lsm_d->lsm_session->afe_port_cfg); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - afe_cmd = AFE_CMD_PORT_SUSPEND; - break; - - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - afe_cmd = AFE_CMD_PORT_RESUME; - break; - - default: - afe_cmd = AFE_CMD_INVALID; - dev_dbg(rtd->dev, - "%s: unhandled trigger cmd %d\n", - __func__, cmd); - break; - } - - if (afe_cmd != AFE_CMD_INVALID) - rc = msm_cpe_afe_port_cntl(substream, - cpe->core_handle, - afe_ops, afe_cfg, - afe_cmd); - - return rc; -} - -static int msm_cpe_lsm_hwparams(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct cpe_priv *cpe = cpe_get_private_data(substream); - struct cpe_lsm_session *session = NULL; - struct cpe_hw_params *hw_params = NULL; - - if (!cpe || !cpe->core_handle) { - dev_err(rtd->dev, - "%s: Invalid %s\n", - __func__, - (!cpe) ? "cpe" : "core"); - return -EINVAL; - } - - if (!lsm_d || !lsm_d->lsm_session) { - dev_err(rtd->dev, - "%s: Invalid %s\n", - __func__, - (!lsm_d) ? "priv_data" : "session"); - return -EINVAL; - } - - session = lsm_d->lsm_session; - hw_params = &lsm_d->hw_params; - hw_params->buf_sz = (params_buffer_bytes(params) - / params_periods(params)); - hw_params->period_count = params_periods(params); - hw_params->channels = params_channels(params); - hw_params->sample_rate = params_rate(params); - - if (params_format(params) == SNDRV_PCM_FORMAT_S16_LE) - hw_params->sample_size = 16; - else if (params_format(params) == - SNDRV_PCM_FORMAT_S24_LE) - hw_params->sample_size = 24; - else if (params_format(params) == - SNDRV_PCM_FORMAT_S32_LE) - hw_params->sample_size = 32; - else { - dev_err(rtd->dev, - "%s: Invalid Format 0x%x\n", - __func__, params_format(params)); - return -EINVAL; - } - - dev_dbg(rtd->dev, - "%s: Format %d buffer size(bytes) %d period count %d\n" - " Channel %d period in bytes 0x%x Period Size 0x%x rate = %d\n", - __func__, params_format(params), params_buffer_bytes(params), - params_periods(params), params_channels(params), - params_period_bytes(params), params_period_size(params), - params_rate(params)); - - return 0; -} - -static snd_pcm_uframes_t msm_cpe_lsm_pointer( - struct snd_pcm_substream *substream) -{ - - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct cpe_lsm_session *session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - - session = lsm_d->lsm_session; - if (lab_d->dma_write >= lab_d->pcm_size) - lab_d->dma_write = 0; - dev_dbg(rtd->dev, - "%s:pcm_dma_pos = %d\n", - __func__, lab_d->dma_write); - - return bytes_to_frames(runtime, (lab_d->dma_write)); -} - -static int msm_cpe_lsm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - struct cpe_lsm_data *lsm_d = cpe_get_lsm_data(substream); - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_pcm_runtime *runtime = substream->runtime; - struct cpe_lsm_session *session; - struct cpe_lsm_lab *lab_d = &lsm_d->lab; - char *pcm_buf; - int rc = 0; - - if (runtime->status->state == SNDRV_PCM_STATE_XRUN || - runtime->status->state == SNDRV_PCM_STATE_PREPARED) { - pr_err("%s: XRUN ignore for now\n", __func__); - return 0; - } - session = lsm_d->lsm_session; - - /* Check if buffer reading is already in error state */ - if (lab_d->thread_status == MSM_LSM_LAB_THREAD_ERROR) { - dev_err(rtd->dev, - "%s: Bufferring is in error state\n", - __func__); - /* - * Advance the period so there is no wait in case - * read is invoked even after error is propogated - */ - atomic_inc(&lab_d->in_count); - lab_d->dma_write += snd_pcm_lib_period_bytes(substream); - snd_pcm_period_elapsed(substream); - return -ENETRESET; - } else if (lab_d->thread_status == MSM_LSM_LAB_THREAD_STOP) { - dev_err(rtd->dev, - "%s: Buferring is in stopped\n", - __func__); - return -EIO; - } - - rc = wait_event_timeout(lab_d->period_wait, - (atomic_read(&lab_d->in_count) || - atomic_read(&lab_d->abort_read)), - (2 * HZ)); - if (atomic_read(&lab_d->abort_read)) { - pr_debug("%s: LSM LAB Abort read\n", __func__); - return -EIO; - } - if (lab_d->thread_status != MSM_LSM_LAB_THREAD_RUNNING) { - pr_err("%s: Lab stopped\n", __func__); - return -EIO; - } - if (!rc) { - pr_err("%s:LAB err wait_event_timeout\n", __func__); - rc = -EAGAIN; - goto fail; - } - if (lab_d->buf_idx >= (lsm_d->hw_params.period_count)) - lab_d->buf_idx = 0; - pcm_buf = (lab_d->pcm_buf[lab_d->buf_idx].mem); - pr_debug("%s: Buf IDX = 0x%x pcm_buf %pK\n", - __func__, lab_d->buf_idx, pcm_buf); - if (pcm_buf) { - if (copy_to_user(buf, pcm_buf, fbytes)) { - pr_err("Failed to copy buf to user\n"); - rc = -EFAULT; - goto fail; - } - } - lab_d->buf_idx++; - atomic_dec(&lab_d->in_count); - return 0; -fail: - return rc; -} - -/* - * msm_asoc_cpe_lsm_probe: ASoC framework for lsm platform driver - * @platform: platform registered with ASoC core - * - * Allocate the private data for this platform and obtain the ops for - * lsm and afe modules from underlying driver. Also find the codec - * for this platform as specified by machine driver for ASoC framework. - */ -static int msm_asoc_cpe_lsm_probe(struct snd_soc_platform *platform) -{ - struct snd_soc_card *card; - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; - struct cpe_priv *cpe_priv; - const struct snd_kcontrol_new *kcontrol; - bool found_runtime = false; - const char *cpe_dev_id = "qcom,msm-cpe-lsm-id"; - u32 port_id = 0; - int ret = 0; - - if (!platform || !platform->component.card) { - pr_err("%s: Invalid platform or card\n", - __func__); - return -EINVAL; - } - - card = platform->component.card; - - /* Match platform to codec */ - list_for_each_entry(rtd, &card->rtd_list, list) { - if (!rtd->platform) - continue; - if (!strcmp(rtd->platform->component.name, - platform->component.name)) { - found_runtime = true; - break; - } - } - - if (!found_runtime) { - dev_err(platform->dev, - "%s: Failed to find runtime for platform\n", - __func__); - return -EINVAL; - } - - ret = of_property_read_u32(platform->dev->of_node, cpe_dev_id, - &port_id); - if (ret) { - dev_dbg(platform->dev, - "%s: missing 0x%x in dt node\n", __func__, port_id); - port_id = 1; - } - - codec = rtd->codec; - - cpe_priv = kzalloc(sizeof(struct cpe_priv), - GFP_KERNEL); - if (!cpe_priv) - return -ENOMEM; - - cpe_priv->codec = codec; - cpe_priv->input_port_id = port_id; - wcd_cpe_get_lsm_ops(&cpe_priv->lsm_ops); - wcd_cpe_get_afe_ops(&cpe_priv->afe_ops); - - snd_soc_platform_set_drvdata(platform, cpe_priv); - kcontrol = &msm_cpe_kcontrols[0]; - snd_ctl_add(card->snd_card, snd_ctl_new1(kcontrol, cpe_priv)); - return 0; -} - -static const struct snd_pcm_ops msm_cpe_lsm_ops = { - .open = msm_cpe_lsm_open, - .close = msm_cpe_lsm_close, - .ioctl = msm_cpe_lsm_ioctl, - .prepare = msm_cpe_lsm_prepare, - .trigger = msm_cpe_lsm_trigger, - .pointer = msm_cpe_lsm_pointer, - .copy_user = msm_cpe_lsm_copy, - .hw_params = msm_cpe_lsm_hwparams, - .compat_ioctl = msm_cpe_lsm_ioctl_compat, -}; - -static struct snd_soc_platform_driver msm_soc_cpe_platform = { - .ops = &msm_cpe_lsm_ops, - .probe = msm_asoc_cpe_lsm_probe, -}; - -/* - * msm_cpe_lsm_probe: platform driver probe - * @pdev: platform device - * - * Register the ASoC platform driver with ASoC core - */ -static int msm_cpe_lsm_probe(struct platform_device *pdev) -{ - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_cpe_platform); -} - -/* - * msm_cpe_lsm_remove: platform driver remove - * @pdev: platform device - * - * Deregister the ASoC platform driver - */ -static int msm_cpe_lsm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_cpe_lsm_dt_match[] = { - {.compatible = "qcom,msm-cpe-lsm" }, - { } -}; - -static struct platform_driver msm_cpe_lsm_driver = { - .driver = { - .name = "msm-cpe-lsm", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(msm_cpe_lsm_dt_match), - }, - .probe = msm_cpe_lsm_probe, - .remove = msm_cpe_lsm_remove, -}; - -int __init msm_cpe_lsm_init(void) -{ - return platform_driver_register(&msm_cpe_lsm_driver); -} - -void __exit msm_cpe_lsm_exit(void) -{ - platform_driver_unregister(&msm_cpe_lsm_driver); -} - -module_init(msm_cpe_lsm_init); -module_exit(msm_cpe_lsm_exit); -MODULE_DESCRIPTION("CPE LSM platform driver"); -MODULE_DEVICE_TABLE(of, msm_cpe_lsm_dt_match); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-dai-fe.c b/techpack/audio/asoc/msm-dai-fe.c deleted file mode 100644 index 9198301c9c36..000000000000 --- a/techpack/audio/asoc/msm-dai-fe.c +++ /dev/null @@ -1,2832 +0,0 @@ -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include - -static struct snd_soc_dai_ops msm_fe_dai_ops = {}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, - 88200, 96000, 176400, 192000, 352800, 384000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int multimedia_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - snd_pcm_hw_constraint_list(substream->runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - return 0; -} - -static int fe_dai_probe(struct snd_soc_dai *dai) -{ - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai || !dai->driver) { - pr_err("%s invalid params\n", __func__); - return -EINVAL; - } - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.stream_name; - intercon.sink = dai->driver->playback.aif_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - snd_soc_dapm_ignore_suspend(dapm, intercon.source); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.stream_name; - intercon.source = dai->driver->capture.aif_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - snd_soc_dapm_ignore_suspend(dapm, intercon.sink); - } - return 0; -} - -static struct snd_soc_dai_ops msm_fe_Multimedia_dai_ops = { - .startup = multimedia_startup, -}; - -static const struct snd_soc_component_driver msm_fe_dai_component = { - .name = "msm-dai-fe", -}; - -static struct snd_soc_dai_driver msm_fe_dais[] = { - { - .playback = { - .stream_name = "MultiMedia1 Playback", - .aif_name = "MM_DL1", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia1 Capture", - .aif_name = "MM_UL1", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia1", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia2 Playback", - .aif_name = "MM_DL2", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia2 Capture", - .aif_name = "MM_UL2", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia2", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VoIP Playback", - .aif_name = "VOIP_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VoIP Capture", - .aif_name = "VOIP_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VoIP", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia3 Playback", - .aif_name = "MM_DL3", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 6, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia3 Capture", - .aif_name = "MM_UL3", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia3", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia4 Playback", - .aif_name = "MM_DL4", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia4", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia5 Playback", - .aif_name = "MM_DL5", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia5 Capture", - .aif_name = "MM_UL5", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia5", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia6 Playback", - .aif_name = "MM_DL6", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia6 Capture", - .aif_name = "MM_UL6", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia6", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia7 Playback", - .aif_name = "MM_DL7", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 16, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia7", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia8 Playback", - .aif_name = "MM_DL8", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia8 Capture", - .aif_name = "MM_UL8", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia8", - .probe = fe_dai_probe, - }, - /* FE DAIs created for hostless operation purpose */ - { - .playback = { - .stream_name = "SLIMBUS0_HOSTLESS Playback", - .aif_name = "SLIM0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS0_HOSTLESS Capture", - .aif_name = "SLIM0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_96000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS1_HOSTLESS Playback", - .aif_name = "SLIM1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS1_HOSTLESS Capture", - .aif_name = "SLIM1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS3_HOSTLESS Playback", - .aif_name = "SLIM3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS3_HOSTLESS Capture", - .aif_name = "SLIM3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS4_HOSTLESS Playback", - .aif_name = "SLIM4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS4_HOSTLESS Capture", - .aif_name = "SLIM4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS6_HOSTLESS Playback", - .aif_name = "SLIM6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS7_HOSTLESS Playback", - .aif_name = "SLIM7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS7_HOSTLESS Capture", - .aif_name = "SLIM7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SLIMBUS8_HOSTLESS Playback", - .aif_name = "SLIM8_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .aif_name = "SLIM8_UL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SLIMBUS8_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "CDC_DMA_HOSTLESS Playback", - .aif_name = "CDC_DMA_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "CDC_DMA_HOSTLESS Capture", - .aif_name = "CDC_DMA_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "CDC_DMA_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "TX3_CDC_DMA_HOSTLESS Capture", - .aif_name = "TX3_CDC_DMA_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "TX3_CDC_DMA_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT_FM_HOSTLESS Playback", - .aif_name = "INTFM_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT_FM_HOSTLESS Capture", - .aif_name = "INTFM_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT_FM_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT_HFP_BT Hostless Playback", - .aif_name = "INTHFP_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 16000, - }, - .capture = { - .stream_name = "INT_HFP_BT Hostless Capture", - .aif_name = "INTHFP_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT_HFP_BT_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "USBAUDIO_HOSTLESS Playback", - .aif_name = "USBAUDIO_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "USBAUDIO_HOSTLESS Capture", - .aif_name = "USBAUDIO_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "USBAUDIO_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "AFE Playback", - .aif_name = "PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "AFE Capture", - .aif_name = "PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "AFE-PROXY", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "HDMI_HOSTLESS Playback", - .aif_name = "HDMI_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "HDMI_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "AUXPCM_HOSTLESS Playback", - .aif_name = "AUXPCM_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .capture = { - .stream_name = "AUXPCM_HOSTLESS Capture", - .aif_name = "AUXPCM_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "AUXPCM_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SEC_AUXPCM_HOSTLESS Playback", - .aif_name = "SEC_AUXPCM_DL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_AUXPCM_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "SEC_AUXPCM_HOSTLESS Capture", - .aif_name = "SEC_AUXPCM_UL_HL", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 16000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_AUXPCM_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VOICE_STUB Playback", - .aif_name = "VOICE_STUB_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VOICE_STUB Capture", - .aif_name = "VOICE_STUB_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VOICE_STUB", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MI2S_RX_HOSTLESS Playback", - .aif_name = "MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "MI2S_TX_HOSTLESS Capture", - .aif_name = "MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "SEC_I2S_RX_HOSTLESS Playback", - .aif_name = "SEC_I2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_I2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary MI2S_TX Hostless Capture", - .aif_name = "PRI_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary MI2S_RX Hostless Playback", - .aif_name = "PRI_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary MI2S_TX Hostless Capture", - .aif_name = "SEC_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary MI2S_RX Hostless Playback", - .aif_name = "SEC_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary MI2S_TX Hostless Capture", - .aif_name = "TERT_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary MI2S_RX Hostless Playback", - .aif_name = "TERT_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary MI2S_TX Hostless Capture", - .aif_name = "QUAT_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary MI2S_RX Hostless Playback", - .aif_name = "QUAT_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT0 MI2S_RX Hostless Playback", - .aif_name = "INT0_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT0_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "INT4 MI2S_RX Hostless Playback", - .aif_name = "INT4_MI2S_DL_HL", - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT4_MI2S_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "INT3 MI2S_TX Hostless Capture", - .aif_name = "INT3_MI2S_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "INT3_MI2S_TX_HOSTLESS", - .probe = fe_dai_probe, - }, - /* TDM Hostless */ - { - .capture = { - .stream_name = "Primary TDM0 Hostless Capture", - .aif_name = "PRI_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM0 Hostless Playback", - .aif_name = "PRI_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM1 Hostless Capture", - .aif_name = "PRI_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM1 Hostless Playback", - .aif_name = "PRI_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM2 Hostless Capture", - .aif_name = "PRI_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM2 Hostless Playback", - .aif_name = "PRI_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM3 Hostless Capture", - .aif_name = "PRI_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM3 Hostless Playback", - .aif_name = "PRI_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM4 Hostless Capture", - .aif_name = "PRI_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM4 Hostless Playback", - .aif_name = "PRI_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM5 Hostless Capture", - .aif_name = "PRI_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM5 Hostless Playback", - .aif_name = "PRI_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM6 Hostless Capture", - .aif_name = "PRI_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM6 Hostless Playback", - .aif_name = "PRI_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Primary TDM7 Hostless Capture", - .aif_name = "PRI_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Primary TDM7 Hostless Playback", - .aif_name = "PRI_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "PRI_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM0 Hostless Capture", - .aif_name = "SEC_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM0 Hostless Playback", - .aif_name = "SEC_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM1 Hostless Capture", - .aif_name = "SEC_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM1 Hostless Playback", - .aif_name = "SEC_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM2 Hostless Capture", - .aif_name = "SEC_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM2 Hostless Playback", - .aif_name = "SEC_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM3 Hostless Capture", - .aif_name = "SEC_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM3 Hostless Playback", - .aif_name = "SEC_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM4 Hostless Capture", - .aif_name = "SEC_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM4 Hostless Playback", - .aif_name = "SEC_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM5 Hostless Capture", - .aif_name = "SEC_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM5 Hostless Playback", - .aif_name = "SEC_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM6 Hostless Capture", - .aif_name = "SEC_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM6 Hostless Playback", - .aif_name = "SEC_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Secondary TDM7 Hostless Capture", - .aif_name = "SEC_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Secondary TDM7 Hostless Playback", - .aif_name = "SEC_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "SEC_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM0 Hostless Capture", - .aif_name = "TERT_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM0 Hostless Playback", - .aif_name = "TERT_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM1 Hostless Capture", - .aif_name = "TERT_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM1 Hostless Playback", - .aif_name = "TERT_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM2 Hostless Capture", - .aif_name = "TERT_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM2 Hostless Playback", - .aif_name = "TERT_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM3 Hostless Capture", - .aif_name = "TERT_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM3 Hostless Playback", - .aif_name = "TERT_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM4 Hostless Capture", - .aif_name = "TERT_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM4 Hostless Playback", - .aif_name = "TERT_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM5 Hostless Capture", - .aif_name = "TERT_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM5 Hostless Playback", - .aif_name = "TERT_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM6 Hostless Capture", - .aif_name = "TERT_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM6 Hostless Playback", - .aif_name = "TERT_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Tertiary TDM7 Hostless Capture", - .aif_name = "TERT_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Tertiary TDM7 Hostless Playback", - .aif_name = "TERT_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "TERT_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM0 Hostless Capture", - .aif_name = "QUAT_TDM_TX_0_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM0 Hostless Playback", - .aif_name = "QUAT_TDM_RX_0_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_0_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM1 Hostless Capture", - .aif_name = "QUAT_TDM_TX_1_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM1 Hostless Playback", - .aif_name = "QUAT_TDM_RX_1_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_1_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM2 Hostless Capture", - .aif_name = "QUAT_TDM_TX_2_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM2 Hostless Playback", - .aif_name = "QUAT_TDM_RX_2_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_2_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM3 Hostless Capture", - .aif_name = "QUAT_TDM_TX_3_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM3 Hostless Playback", - .aif_name = "QUAT_TDM_RX_3_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_3_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM4 Hostless Capture", - .aif_name = "QUAT_TDM_TX_4_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM4 Hostless Playback", - .aif_name = "QUAT_TDM_RX_4_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_4_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM5 Hostless Capture", - .aif_name = "QUAT_TDM_TX_5_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM5 Hostless Playback", - .aif_name = "QUAT_TDM_RX_5_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_5_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM6 Hostless Capture", - .aif_name = "QUAT_TDM_TX_6_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM6 Hostless Playback", - .aif_name = "QUAT_TDM_RX_6_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_6_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Quaternary TDM7 Hostless Capture", - .aif_name = "QUAT_TDM_TX_7_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_TX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "Quaternary TDM7 Hostless Playback", - .aif_name = "QUAT_TDM_RX_7_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QUAT_TDM_RX_7_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "DTMF_RX_HOSTLESS Playback", - .aif_name = "DTMF_DL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "DTMF_RX_HOSTLESS", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "CPE Listen Audio capture", - .aif_name = "CPE_LSM_UL_HL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "CPE_LSM_NOHOST", - }, - { - .playback = { - .stream_name = "VOLTE_STUB Playback", - .aif_name = "VOLTE_STUB_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VOLTE_STUB Capture", - .aif_name = "VOLTE_STUB_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VOLTE_STUB", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VOICE2_STUB Playback", - .aif_name = "VOICE2_STUB_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VOICE2_STUB Capture", - .aif_name = "VOICE2_STUB_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VOICE2_STUB", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia9 Playback", - .aif_name = "MM_DL9", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia9 Capture", - .aif_name = "MM_UL9", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia9", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "QCHAT Playback", - .aif_name = "QCHAT_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "QCHAT Capture", - .aif_name = "QCHAT_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "QCHAT", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 1 Audio Service Capture", - .aif_name = "LSM1_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM1", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 2 Audio Service Capture", - .aif_name = "LSM2_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM2", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 3 Audio Service Capture", - .aif_name = "LSM3_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM3", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 4 Audio Service Capture", - .aif_name = "LSM4_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM4", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 5 Audio Service Capture", - .aif_name = "LSM5_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM5", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 6 Audio Service Capture", - .aif_name = "LSM6_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM6", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 7 Audio Service Capture", - .aif_name = "LSM7_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM7", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "Listen 8 Audio Service Capture", - .aif_name = "LSM8_UL_HL", - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .channels_min = 1, - .channels_max = 4, - .rate_min = 16000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "LSM8", - .probe = fe_dai_probe, - }, - /* FE DAIs created for multiple instances of offload playback */ - { - .playback = { - .stream_name = "MultiMedia10 Playback", - .aif_name = "MM_DL10", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia10 Capture", - .aif_name = "MM_UL10", - .rates = (SNDRV_PCM_RATE_8000_48000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia10", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia11 Playback", - .aif_name = "MM_DL11", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia11", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia12 Playback", - .aif_name = "MM_DL12", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia12", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia13 Playback", - .aif_name = "MM_DL13", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia13", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia14 Playback", - .aif_name = "MM_DL14", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia14", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia15 Playback", - .aif_name = "MM_DL15", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia15", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia16 Playback", - .aif_name = "MM_DL16", - .rates = (SNDRV_PCM_RATE_8000_384000 | - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia16 Capture", - .aif_name = "MM_UL16", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia16", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VoiceMMode1 Playback", - .aif_name = "VOICEMMODE1_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VoiceMMode1 Capture", - .aif_name = "VOICEMMODE1_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VoiceMMode1", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "VoiceMMode2 Playback", - .aif_name = "VOICEMMODE2_DL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "VoiceMMode2 Capture", - .aif_name = "VOICEMMODE2_UL", - .rates = SNDRV_PCM_RATE_8000_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "VoiceMMode2", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia17 Capture", - .aif_name = "MM_UL17", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia17", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia18 Capture", - .aif_name = "MM_UL18", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia18", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia19 Capture", - .aif_name = "MM_UL19", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia19", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia20 Playback", - .aif_name = "MM_DL20", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia20 Capture", - .aif_name = "MM_UL20", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia20", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia21 Playback", - .aif_name = "MM_DL21", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "MultiMedia21 Capture", - .aif_name = "MM_UL21", - .rates = (SNDRV_PCM_RATE_8000_48000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia21", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia26 Playback", - .aif_name = "MM_DL26", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia26", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia27 Capture", - .aif_name = "MM_UL27", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia27", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia28 Capture", - .aif_name = "MM_UL28", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia28", - .probe = fe_dai_probe, - }, - { - .capture = { - .stream_name = "MultiMedia29 Capture", - .aif_name = "MM_UL29", - .rates = (SNDRV_PCM_RATE_8000_192000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .compress_new = snd_soc_new_compress, - .name = "MultiMedia29", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia30 Playback", - .aif_name = "MM_DL30", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia30", - .probe = fe_dai_probe, - }, - { - .playback = { - .stream_name = "MultiMedia31 Playback", - .aif_name = "MM_DL31", - .rates = (SNDRV_PCM_RATE_8000_384000| - SNDRV_PCM_RATE_KNOT), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .channels_min = 1, - .channels_max = 32, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_fe_Multimedia_dai_ops, - .name = "MultiMedia31", - .probe = fe_dai_probe, - }, -}; - -static int msm_fe_dai_dev_probe(struct platform_device *pdev) -{ - - dev_dbg(&pdev->dev, "%s: dev name %s\n", __func__, - dev_name(&pdev->dev)); - return snd_soc_register_component(&pdev->dev, &msm_fe_dai_component, - msm_fe_dais, ARRAY_SIZE(msm_fe_dais)); -} - -static int msm_fe_dai_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_fe_dt_match[] = { - {.compatible = "qcom,msm-dai-fe"}, - {} -}; - -static struct platform_driver msm_fe_dai_driver = { - .probe = msm_fe_dai_dev_probe, - .remove = msm_fe_dai_dev_remove, - .driver = { - .name = "msm-dai-fe", - .owner = THIS_MODULE, - .of_match_table = msm_dai_fe_dt_match, - }, -}; - -int __init msm_fe_dai_init(void) -{ - return platform_driver_register(&msm_fe_dai_driver); -} - -void msm_fe_dai_exit(void) -{ - platform_driver_unregister(&msm_fe_dai_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM Frontend DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-dai-q6-hdmi-v2.c b/techpack/audio/asoc/msm-dai-q6-hdmi-v2.c deleted file mode 100644 index 4291077fcbb9..000000000000 --- a/techpack/audio/asoc/msm-dai-q6-hdmi-v2.c +++ /dev/null @@ -1,612 +0,0 @@ -/* Copyright (c) 2012-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-dai-q6-v2.h" - -#define HDMI_RX_CA_MAX 0x32 - -enum { - STATUS_PORT_STARTED, /* track if AFE port has started */ - STATUS_MAX -}; - -struct msm_ext_disp_ca { - bool set_ca; - u32 ca; -}; - -struct msm_dai_q6_hdmi_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 stream_idx; - u32 ctl_idx; - struct msm_ext_disp_ca ca; - union afe_port_config port_config; -}; - -static int msm_dai_q6_ext_disp_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - dai_data->port_config.hdmi_multi_ch.datatype = value; - pr_debug("%s: value = %d\n", __func__, value); - - return 0; -} - -static int msm_dai_q6_ext_disp_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = - dai_data->port_config.hdmi_multi_ch.datatype; - pr_debug("%s: value = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_ext_disp_device_idx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - dai_data->ctl_idx = ucontrol->value.integer.value[0]; - dai_data->stream_idx = ucontrol->value.integer.value[1]; - pr_debug("%s: DP ctl id %d stream id %d\n", __func__, - dai_data->ctl_idx, dai_data->stream_idx); - - return 0; -} - -static int msm_dai_q6_ext_disp_device_idx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = dai_data->ctl_idx; - ucontrol->value.integer.value[1] = dai_data->stream_idx; - pr_debug("%s: DP ctl id %d stream id %d\n", __func__, - dai_data->ctl_idx, dai_data->stream_idx); - - return 0; -} - -static int msm_dai_q6_ext_disp_ca_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - dai_data->ca.ca = ucontrol->value.integer.value[0]; - dai_data->ca.set_ca = true; - pr_debug("%s: ca = %d\n", __func__, dai_data->ca.ca); - return 0; -} - -static int msm_dai_q6_ext_disp_ca_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = dai_data->ca.ca; - pr_debug("%s: ca = %d\n", __func__, dai_data->ca.ca); - return 0; -} - -/* HDMI format field for AFE_PORT_MULTI_CHAN_HDMI_AUDIO_IF_CONFIG command - * 0: linear PCM - * 1: non-linear PCM - */ -static const char * const hdmi_format[] = { - "LPCM", - "Compr" -}; - -static const struct soc_enum hdmi_config_enum[] = { - SOC_ENUM_SINGLE_EXT(2, hdmi_format), -}; - -static int msm_dai_q6_ext_disp_drift_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_param_id_dev_timing_stats); - - return 0; -} - -static int msm_dai_q6_ext_disp_drift_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - struct afe_param_id_dev_timing_stats timing_stats; - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: afe port not started. status_mask = %ld\n", - __func__, *dai_data->status_mask); - goto done; - } - - memset(&timing_stats, 0, sizeof(struct afe_param_id_dev_timing_stats)); - ret = afe_get_av_dev_drift(&timing_stats, dai->id); - if (ret) { - pr_err("%s: Error getting AFE Drift for port %d, err=%d\n", - __func__, dai->id, ret); - - ret = -EINVAL; - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&timing_stats, - sizeof(struct afe_param_id_dev_timing_stats)); -done: - return ret; -} - -static const struct snd_kcontrol_new hdmi_config_controls[] = { - SOC_ENUM_EXT("HDMI RX Format", hdmi_config_enum[0], - msm_dai_q6_ext_disp_format_get, - msm_dai_q6_ext_disp_format_put), - SOC_SINGLE_MULTI_EXT("HDMI RX CA", SND_SOC_NOPM, 0, - HDMI_RX_CA_MAX, 0, 1, - msm_dai_q6_ext_disp_ca_get, - msm_dai_q6_ext_disp_ca_put), - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "HDMI DRIFT", - .info = msm_dai_q6_ext_disp_drift_info, - .get = msm_dai_q6_ext_disp_drift_get, - }, -}; - -static const struct snd_kcontrol_new display_port_config_controls[] = { - SOC_ENUM_EXT("Display Port RX Format", hdmi_config_enum[0], - msm_dai_q6_ext_disp_format_get, - msm_dai_q6_ext_disp_format_put), - SOC_SINGLE_MULTI_EXT("Display Port RX CA", SND_SOC_NOPM, 0, - HDMI_RX_CA_MAX, 0, 1, - msm_dai_q6_ext_disp_ca_get, - msm_dai_q6_ext_disp_ca_put), - SOC_SINGLE_MULTI_EXT("Display Port RX DEVICE IDX", SND_SOC_NOPM, 0, - 1, 0, 1, - msm_dai_q6_ext_disp_device_idx_get, - msm_dai_q6_ext_disp_device_idx_put), - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "DISPLAY_PORT DRIFT", - .info = msm_dai_q6_ext_disp_drift_info, - .get = msm_dai_q6_ext_disp_drift_get, - }, -}; - -/* Current implementation assumes hw_param is called once - * This may not be the case but what to do when ADM and AFE - * port are already opened and parameter changes - */ -static int msm_dai_q6_hdmi_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - dai_data->port_config.hdmi_multi_ch.reserved = 0; - dai_data->port_config.hdmi_multi_ch.hdmi_cfg_minor_version = 1; - dai_data->port_config.hdmi_multi_ch.sample_rate = dai_data->rate; - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->port_config.hdmi_multi_ch.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.hdmi_multi_ch.bit_width = 24; - break; - } - - /*refer to HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4*/ - switch (dai_data->channels) { - case 2: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0; - break; - case 3: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x02; - break; - case 4: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x06; - break; - case 5: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x0A; - break; - case 6: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x0B; - break; - case 7: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x12; - break; - case 8: - dai_data->port_config.hdmi_multi_ch.channel_allocation = 0x13; - break; - default: - dev_err(dai->dev, "invalid Channels = %u\n", - dai_data->channels); - return -EINVAL; - } - dev_dbg(dai->dev, "%s() minor version: %u samplerate: %u bitwidth: %u\n" - "num_ch = %u channel_allocation = %u datatype = %d\n", __func__, - dai_data->port_config.hdmi_multi_ch.hdmi_cfg_minor_version, - dai_data->port_config.hdmi_multi_ch.sample_rate, - dai_data->port_config.hdmi_multi_ch.bit_width, - dai_data->channels, - dai_data->port_config.hdmi_multi_ch.channel_allocation, - dai_data->port_config.hdmi_multi_ch.datatype); - - return 0; -} - - -static void msm_dai_q6_hdmi_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_info("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - return; - } - - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); -} - - -static int msm_dai_q6_hdmi_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (dai_data->ca.set_ca) - dai_data->port_config.hdmi_multi_ch.channel_allocation = - dai_data->ca.ca; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - - rc = afe_set_display_stream(dai->id, dai_data->stream_idx, - dai_data->ctl_idx); - if (rc < 0) { - dev_err(dai->dev, "fail to set AFE ctl, stream ID params %x\n", - dai->id); - if (rc != -EOPNOTSUPP) { - dev_err(dai->dev, "not starting AFE port\n"); - goto err; - } - } - - rc = afe_port_start(dai->id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port %x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - -err: - return rc; -} - -static inline void msm_dai_q6_hdmi_set_dai_id(struct snd_soc_dai *dai) -{ - if (!dai->driver->id) { - dev_warn(dai->dev, "DAI driver id is not set\n"); - return; - } - dai->id = dai->driver->id; -} - -static int msm_dai_q6_hdmi_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data; - const struct snd_kcontrol_new *kcontrol; - int rc = 0; - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai || !dai->driver) { - pr_err("%s: dai or dai->driver is NULL\n", __func__); - return -EINVAL; - } - dai_data = kzalloc(sizeof(struct msm_dai_q6_hdmi_dai_data), - GFP_KERNEL); - - if (!dai_data) { - dev_err(dai->dev, "DAI-%d: fail to allocate dai data\n", - dai->id); - rc = -ENOMEM; - } else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_hdmi_set_dai_id(dai); - - if (dai->driver->id == HDMI_RX) { - kcontrol = &hdmi_config_controls[0]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &hdmi_config_controls[1]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &hdmi_config_controls[2]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai)); - } else if (dai->driver->id == DISPLAY_PORT_RX) { - kcontrol = &display_port_config_controls[0]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[1]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[2]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai_data)); - - kcontrol = &display_port_config_controls[3]; - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(kcontrol, dai)); - } else { - dev_err(dai->dev, "%s: Invalid id:%d\n", - __func__, dai->driver->id); - kfree(dai_data); - dev_set_drvdata(dai->dev, NULL); - return -EINVAL; - } - - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (!rc) { - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - } - return rc; -} - -static int msm_dai_q6_hdmi_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_hdmi_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - kfree(dai_data); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_q6_hdmi_ops = { - .prepare = msm_dai_q6_hdmi_prepare, - .hw_params = msm_dai_q6_hdmi_hw_params, - .shutdown = msm_dai_q6_hdmi_shutdown, -}; - -static struct snd_soc_dai_driver msm_dai_q6_hdmi_hdmi_rx_dai = { - .playback = { - .stream_name = "HDMI Playback", - .aif_name = "HDMI", - .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 2, - .channels_max = 8, - .rate_max = 192000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_hdmi_ops, - .id = HDMI_RX, - .probe = msm_dai_q6_hdmi_dai_probe, - .remove = msm_dai_q6_hdmi_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_display_port_rx_dai[] = { - { - .playback = { - .stream_name = "Display Port Playback", - .aif_name = "DISPLAY_PORT", - .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 2, - .channels_max = 8, - .rate_max = 192000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_hdmi_ops, - .id = DISPLAY_PORT_RX, - .probe = msm_dai_q6_hdmi_dai_probe, - .remove = msm_dai_q6_hdmi_dai_remove, - }, -}; - -static const struct snd_soc_component_driver msm_dai_hdmi_q6_component = { - .name = "msm-dai-q6-hdmi", -}; - -/* To do: change to register DAIs as batch */ -static int msm_dai_q6_hdmi_dev_probe(struct platform_device *pdev) -{ - int rc, id; - const char *q6_dev_id = "qcom,msm-dai-q6-dev-id"; - - rc = of_property_read_u32(pdev->dev.of_node, q6_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, q6_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (pdev->id) { - case HDMI_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_hdmi_q6_component, - &msm_dai_q6_hdmi_hdmi_rx_dai, 1); - break; - case DISPLAY_PORT_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_hdmi_q6_component, - &msm_dai_q6_display_port_rx_dai[0], - ARRAY_SIZE(msm_dai_q6_display_port_rx_dai)); - break; - default: - dev_err(&pdev->dev, "invalid device ID %d\n", pdev->id); - rc = -ENODEV; - break; - } - return rc; -} - -static int msm_dai_q6_hdmi_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_hdmi_dt_match[] = { - {.compatible = "qcom,msm-dai-q6-hdmi"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_hdmi_dt_match); - -static struct platform_driver msm_dai_q6_hdmi_driver = { - .probe = msm_dai_q6_hdmi_dev_probe, - .remove = msm_dai_q6_hdmi_dev_remove, - .driver = { - .name = "msm-dai-q6-hdmi", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_hdmi_dt_match, - }, -}; - -int __init msm_dai_q6_hdmi_init(void) -{ - return platform_driver_register(&msm_dai_q6_hdmi_driver); -} - -void msm_dai_q6_hdmi_exit(void) -{ - platform_driver_unregister(&msm_dai_q6_hdmi_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM DSP HDMI DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-dai-q6-v2.c b/techpack/audio/asoc/msm-dai-q6-v2.c deleted file mode 100644 index 4c043edafc27..000000000000 --- a/techpack/audio/asoc/msm-dai-q6-v2.c +++ /dev/null @@ -1,11415 +0,0 @@ -/* Copyright (c) 2012-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-dai-q6-v2.h" -#include "codecs/core.h" -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI -#include "codecs/tfa98xx/inc/tfa_platform_interface_definition.h" -#endif - -#define MSM_DAI_PRI_AUXPCM_DT_DEV_ID 1 -#define MSM_DAI_SEC_AUXPCM_DT_DEV_ID 2 -#define MSM_DAI_TERT_AUXPCM_DT_DEV_ID 3 -#define MSM_DAI_QUAT_AUXPCM_DT_DEV_ID 4 -#define MSM_DAI_QUIN_AUXPCM_DT_DEV_ID 5 - -#define MSM_DAI_TWS_CHANNEL_MODE_ONE 1 -#define MSM_DAI_TWS_CHANNEL_MODE_TWO 2 - -#define spdif_clock_value(rate) (2*rate*32*2) -#define CHANNEL_STATUS_SIZE 24 -#define CHANNEL_STATUS_MASK_INIT 0x0 -#define CHANNEL_STATUS_MASK 0x4 -#define AFE_API_VERSION_CLOCK_SET 1 -#define MSM_DAI_SYSFS_ENTRY_MAX_LEN 64 - -#define DAI_FORMATS_S16_S24_S32_LE (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id); - -enum { - ENC_FMT_NONE, - DEC_FMT_NONE = ENC_FMT_NONE, - ENC_FMT_SBC = ASM_MEDIA_FMT_SBC, - DEC_FMT_SBC = ASM_MEDIA_FMT_SBC, - ENC_FMT_AAC_V2 = ASM_MEDIA_FMT_AAC_V2, - DEC_FMT_AAC_V2 = ASM_MEDIA_FMT_AAC_V2, - ENC_FMT_APTX = ASM_MEDIA_FMT_APTX, - ENC_FMT_APTX_HD = ASM_MEDIA_FMT_APTX_HD, - ENC_FMT_CELT = ASM_MEDIA_FMT_CELT, - ENC_FMT_LDAC = ASM_MEDIA_FMT_LDAC, - ENC_FMT_APTX_ADAPTIVE = ASM_MEDIA_FMT_APTX_ADAPTIVE, - DEC_FMT_APTX_ADAPTIVE = ASM_MEDIA_FMT_APTX_ADAPTIVE, - DEC_FMT_MP3 = ASM_MEDIA_FMT_MP3, -}; - -enum { - SPKR_1, - SPKR_2, -}; - -static const struct afe_clk_set lpass_clk_set_default = { - AFE_API_VERSION_CLOCK_SET, - Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT, - Q6AFE_LPASS_OSR_CLK_2_P048_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, -}; - -static const struct afe_clk_cfg lpass_clk_cfg_default = { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_OSR_CLK_2_P048_MHZ, - 0, - Q6AFE_LPASS_CLK_SRC_INTERNAL, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - Q6AFE_LPASS_MODE_CLK1_VALID, - 0, -}; -enum { - STATUS_PORT_STARTED, /* track if AFE port has started */ - /* track AFE Tx port status for bi-directional transfers */ - STATUS_TX_PORT, - /* track AFE Rx port status for bi-directional transfers */ - STATUS_RX_PORT, - STATUS_MAX -}; - -enum { - RATE_8KHZ, - RATE_16KHZ, - RATE_MAX_NUM_OF_AUX_PCM_RATES, -}; - -enum { - IDX_PRIMARY_TDM_RX_0, - IDX_PRIMARY_TDM_RX_1, - IDX_PRIMARY_TDM_RX_2, - IDX_PRIMARY_TDM_RX_3, - IDX_PRIMARY_TDM_RX_4, - IDX_PRIMARY_TDM_RX_5, - IDX_PRIMARY_TDM_RX_6, - IDX_PRIMARY_TDM_RX_7, - IDX_PRIMARY_TDM_TX_0, - IDX_PRIMARY_TDM_TX_1, - IDX_PRIMARY_TDM_TX_2, - IDX_PRIMARY_TDM_TX_3, - IDX_PRIMARY_TDM_TX_4, - IDX_PRIMARY_TDM_TX_5, - IDX_PRIMARY_TDM_TX_6, - IDX_PRIMARY_TDM_TX_7, - IDX_SECONDARY_TDM_RX_0, - IDX_SECONDARY_TDM_RX_1, - IDX_SECONDARY_TDM_RX_2, - IDX_SECONDARY_TDM_RX_3, - IDX_SECONDARY_TDM_RX_4, - IDX_SECONDARY_TDM_RX_5, - IDX_SECONDARY_TDM_RX_6, - IDX_SECONDARY_TDM_RX_7, - IDX_SECONDARY_TDM_TX_0, - IDX_SECONDARY_TDM_TX_1, - IDX_SECONDARY_TDM_TX_2, - IDX_SECONDARY_TDM_TX_3, - IDX_SECONDARY_TDM_TX_4, - IDX_SECONDARY_TDM_TX_5, - IDX_SECONDARY_TDM_TX_6, - IDX_SECONDARY_TDM_TX_7, - IDX_TERTIARY_TDM_RX_0, - IDX_TERTIARY_TDM_RX_1, - IDX_TERTIARY_TDM_RX_2, - IDX_TERTIARY_TDM_RX_3, - IDX_TERTIARY_TDM_RX_4, - IDX_TERTIARY_TDM_RX_5, - IDX_TERTIARY_TDM_RX_6, - IDX_TERTIARY_TDM_RX_7, - IDX_TERTIARY_TDM_TX_0, - IDX_TERTIARY_TDM_TX_1, - IDX_TERTIARY_TDM_TX_2, - IDX_TERTIARY_TDM_TX_3, - IDX_TERTIARY_TDM_TX_4, - IDX_TERTIARY_TDM_TX_5, - IDX_TERTIARY_TDM_TX_6, - IDX_TERTIARY_TDM_TX_7, - IDX_QUATERNARY_TDM_RX_0, - IDX_QUATERNARY_TDM_RX_1, - IDX_QUATERNARY_TDM_RX_2, - IDX_QUATERNARY_TDM_RX_3, - IDX_QUATERNARY_TDM_RX_4, - IDX_QUATERNARY_TDM_RX_5, - IDX_QUATERNARY_TDM_RX_6, - IDX_QUATERNARY_TDM_RX_7, - IDX_QUATERNARY_TDM_TX_0, - IDX_QUATERNARY_TDM_TX_1, - IDX_QUATERNARY_TDM_TX_2, - IDX_QUATERNARY_TDM_TX_3, - IDX_QUATERNARY_TDM_TX_4, - IDX_QUATERNARY_TDM_TX_5, - IDX_QUATERNARY_TDM_TX_6, - IDX_QUATERNARY_TDM_TX_7, - IDX_QUINARY_TDM_RX_0, - IDX_QUINARY_TDM_RX_1, - IDX_QUINARY_TDM_RX_2, - IDX_QUINARY_TDM_RX_3, - IDX_QUINARY_TDM_RX_4, - IDX_QUINARY_TDM_RX_5, - IDX_QUINARY_TDM_RX_6, - IDX_QUINARY_TDM_RX_7, - IDX_QUINARY_TDM_TX_0, - IDX_QUINARY_TDM_TX_1, - IDX_QUINARY_TDM_TX_2, - IDX_QUINARY_TDM_TX_3, - IDX_QUINARY_TDM_TX_4, - IDX_QUINARY_TDM_TX_5, - IDX_QUINARY_TDM_TX_6, - IDX_QUINARY_TDM_TX_7, - IDX_TDM_MAX, -}; - -enum { - IDX_GROUP_PRIMARY_TDM_RX, - IDX_GROUP_PRIMARY_TDM_TX, - IDX_GROUP_SECONDARY_TDM_RX, - IDX_GROUP_SECONDARY_TDM_TX, - IDX_GROUP_TERTIARY_TDM_RX, - IDX_GROUP_TERTIARY_TDM_TX, - IDX_GROUP_QUATERNARY_TDM_RX, - IDX_GROUP_QUATERNARY_TDM_TX, - IDX_GROUP_QUINARY_TDM_RX, - IDX_GROUP_QUINARY_TDM_TX, - IDX_GROUP_TDM_MAX, -}; - -struct msm_dai_q6_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - DECLARE_BITMAP(hwfree_status, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u32 cal_mode; - u32 afe_rx_in_channels; - u16 afe_rx_in_bitformat; - u32 afe_tx_out_channels; - u16 afe_tx_out_bitformat; - struct afe_enc_config enc_config; - struct afe_dec_config dec_config; - union afe_port_config port_config; - u16 vi_feed_mono; - u32 xt_logging_disable; -}; - -struct msm_dai_q6_spdif_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u16 port_id; - struct afe_spdif_port_config spdif_port; - struct afe_event_fmt_update fmt_event; - struct kobject *kobj; -}; - -struct msm_dai_q6_spdif_event_msg { - struct afe_port_mod_evt_rsp_hdr evt_hdr; - struct afe_event_fmt_update fmt_event; -}; - -struct msm_dai_q6_mi2s_dai_config { - u16 pdata_mi2s_lines; - struct msm_dai_q6_dai_data mi2s_dai_data; -}; - -struct msm_dai_q6_mi2s_dai_data { - u32 is_island_dai; - struct msm_dai_q6_mi2s_dai_config tx_dai; - struct msm_dai_q6_mi2s_dai_config rx_dai; -}; - -struct msm_dai_q6_cdc_dma_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - DECLARE_BITMAP(hwfree_status, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u32 is_island_dai; - u32 xt_logging_disable; - union afe_port_config port_config; -}; - -struct msm_dai_q6_auxpcm_dai_data { - /* BITMAP to track Rx and Tx port usage count */ - DECLARE_BITMAP(auxpcm_port_status, STATUS_MAX); - struct mutex rlock; /* auxpcm dev resource lock */ - u16 rx_pid; /* AUXPCM RX AFE port ID */ - u16 tx_pid; /* AUXPCM TX AFE port ID */ - u16 afe_clk_ver; - u32 is_island_dai; - struct afe_clk_cfg clk_cfg; /* hold LPASS clock configuration */ - struct afe_clk_set clk_set; /* hold LPASS clock configuration */ - struct msm_dai_q6_dai_data bdai_data; /* incoporate base DAI data */ -}; - -struct msm_dai_q6_tdm_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u32 num_group_ports; - u32 is_island_dai; - struct afe_clk_set clk_set; /* hold LPASS clock config. */ - union afe_port_group_config group_cfg; /* hold tdm group config */ - struct afe_tdm_port_config port_cfg; /* hold tdm config */ -}; - -/* MI2S format field for AFE_PORT_CMD_I2S_CONFIG command - * 0: linear PCM - * 1: non-linear PCM - * 2: PCM data in IEC 60968 container - * 3: compressed data in IEC 60958 container - */ -static const char *const mi2s_format[] = { - "LPCM", - "Compr", - "LPCM-60958", - "Compr-60958" -}; - -static const char *const mi2s_vi_feed_mono[] = { - "Left", - "Right", -}; - -static const struct soc_enum mi2s_config_enum[] = { - SOC_ENUM_SINGLE_EXT(4, mi2s_format), - SOC_ENUM_SINGLE_EXT(2, mi2s_vi_feed_mono), -}; - -static const char *const cdc_dma_format[] = { - "UNPACKED", - "PACKED_16B", -}; - -static const struct soc_enum cdc_dma_config_enum[] = { - SOC_ENUM_SINGLE_EXT(2, cdc_dma_format), -}; - -static const char *const sb_format[] = { - "UNPACKED", - "PACKED_16B", - "DSD_DOP", -}; - -static const struct soc_enum sb_config_enum[] = { - SOC_ENUM_SINGLE_EXT(3, sb_format), -}; - -static const char * const xt_logging_disable_text[] = { - "FALSE", - "TRUE", -}; - -static const struct soc_enum xt_logging_disable_enum[] = { - SOC_ENUM_SINGLE_EXT(2, xt_logging_disable_text), -}; - -static const char *const tdm_data_format[] = { - "LPCM", - "Compr", - "Gen Compr" -}; - -static const char *const tdm_header_type[] = { - "Invalid", - "Default", - "Entertainment", -}; - -static const struct soc_enum tdm_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_data_format), tdm_data_format), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_header_type), tdm_header_type), -}; - -static DEFINE_MUTEX(tdm_mutex); - -static atomic_t tdm_group_ref[IDX_GROUP_TDM_MAX]; - -/* cache of group cfg per parent node */ -static struct afe_param_id_group_device_tdm_cfg tdm_group_cfg = { - AFE_API_VERSION_GROUP_DEVICE_TDM_CONFIG, - AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX, - 0, - {AFE_PORT_ID_QUATERNARY_TDM_RX, - AFE_PORT_ID_QUATERNARY_TDM_RX_1, - AFE_PORT_ID_QUATERNARY_TDM_RX_2, - AFE_PORT_ID_QUATERNARY_TDM_RX_3, - AFE_PORT_ID_QUATERNARY_TDM_RX_4, - AFE_PORT_ID_QUATERNARY_TDM_RX_5, - AFE_PORT_ID_QUATERNARY_TDM_RX_6, - AFE_PORT_ID_QUATERNARY_TDM_RX_7}, - 8, - 48000, - 32, - 8, - 32, - 0xFF, -}; - -static u32 num_tdm_group_ports; - -static struct afe_clk_set tdm_clk_set = { - AFE_API_VERSION_CLOCK_SET, - Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT, - Q6AFE_LPASS_IBIT_CLK_DISABLE, - Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, -}; - -static int msm_dai_q6_get_tdm_clk_ref(u16 id) -{ - switch (id) { - case IDX_GROUP_PRIMARY_TDM_RX: - case IDX_GROUP_PRIMARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_PRIMARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_PRIMARY_TDM_TX]); - case IDX_GROUP_SECONDARY_TDM_RX: - case IDX_GROUP_SECONDARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_SECONDARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_SECONDARY_TDM_TX]); - case IDX_GROUP_TERTIARY_TDM_RX: - case IDX_GROUP_TERTIARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_TERTIARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_TERTIARY_TDM_TX]); - case IDX_GROUP_QUATERNARY_TDM_RX: - case IDX_GROUP_QUATERNARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_QUATERNARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_QUATERNARY_TDM_TX]); - case IDX_GROUP_QUINARY_TDM_RX: - case IDX_GROUP_QUINARY_TDM_TX: - return atomic_read(&tdm_group_ref[IDX_GROUP_QUINARY_TDM_RX]) + - atomic_read(&tdm_group_ref[IDX_GROUP_QUINARY_TDM_TX]); - default: return -EINVAL; - } -} - -int msm_dai_q6_get_group_idx(u16 id) -{ - switch (id) { - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_GROUP_PRIMARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_GROUP_PRIMARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_GROUP_SECONDARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_GROUP_SECONDARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_GROUP_TERTIARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_GROUP_TERTIARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_GROUP_QUATERNARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_GROUP_QUATERNARY_TDM_TX; - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_GROUP_QUINARY_TDM_RX; - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_GROUP_QUINARY_TDM_TX; - default: return -EINVAL; - } -} - -int msm_dai_q6_get_port_idx(u16 id) -{ - switch (id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - return IDX_PRIMARY_TDM_RX_0; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return IDX_PRIMARY_TDM_TX_0; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return IDX_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return IDX_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return IDX_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return IDX_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return IDX_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return IDX_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return IDX_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return IDX_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return IDX_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return IDX_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return IDX_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return IDX_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return IDX_SECONDARY_TDM_RX_0; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return IDX_SECONDARY_TDM_TX_0; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return IDX_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return IDX_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return IDX_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return IDX_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return IDX_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return IDX_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return IDX_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return IDX_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return IDX_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return IDX_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return IDX_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return IDX_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return IDX_TERTIARY_TDM_RX_0; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return IDX_TERTIARY_TDM_TX_0; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return IDX_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return IDX_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return IDX_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return IDX_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return IDX_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return IDX_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return IDX_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return IDX_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return IDX_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return IDX_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return IDX_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return IDX_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return IDX_QUATERNARY_TDM_RX_0; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return IDX_QUATERNARY_TDM_TX_0; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return IDX_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return IDX_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return IDX_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return IDX_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return IDX_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return IDX_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return IDX_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return IDX_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return IDX_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return IDX_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return IDX_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return IDX_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return IDX_QUINARY_TDM_RX_0; - case AFE_PORT_ID_QUINARY_TDM_TX: - return IDX_QUINARY_TDM_TX_0; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return IDX_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return IDX_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return IDX_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return IDX_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return IDX_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return IDX_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return IDX_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return IDX_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return IDX_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return IDX_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return IDX_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return IDX_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_QUINARY_TDM_TX_7; - default: return -EINVAL; - } -} - -static u16 msm_dai_q6_max_num_slot(int frame_rate) -{ - /* Max num of slots is bits per frame divided - * by bits per sample which is 16 - */ - switch (frame_rate) { - case AFE_PORT_PCM_BITS_PER_FRAME_8: - return 0; - case AFE_PORT_PCM_BITS_PER_FRAME_16: - return 1; - case AFE_PORT_PCM_BITS_PER_FRAME_32: - return 2; - case AFE_PORT_PCM_BITS_PER_FRAME_64: - return 4; - case AFE_PORT_PCM_BITS_PER_FRAME_128: - return 8; - case AFE_PORT_PCM_BITS_PER_FRAME_256: - return 16; - default: - pr_err("%s Invalid bits per frame %d\n", - __func__, frame_rate); - return 0; - } -} - -static int msm_dai_q6_dai_add_route(struct snd_soc_dai *dai) -{ - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->driver) { - pr_err("%s: Invalid params dai driver\n", __func__); - return -EINVAL; - } - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - return 0; -} - -static int msm_dai_q6_auxpcm_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = &aux_dai_data->bdai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = - (struct msm_dai_auxpcm_pdata *) dai->dev->platform_data; - int rc = 0, slot_mapping_copy_len = 0; - - if (params_channels(params) != 1 || (params_rate(params) != 8000 && - params_rate(params) != 16000)) { - dev_err(dai->dev, "%s: invalid param chan %d rate %d\n", - __func__, params_channels(params), params_rate(params)); - return -EINVAL; - } - - mutex_lock(&aux_dai_data->rlock); - - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - /* AUXPCM DAI in use */ - if (dai_data->rate != params_rate(params)) { - dev_err(dai->dev, "%s: rate mismatch of running DAI\n", - __func__); - rc = -EINVAL; - } - mutex_unlock(&aux_dai_data->rlock); - return rc; - } - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - if (dai_data->rate == 8000) { - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = auxpcm_pdata->mode_8k.mode; - dai_data->port_config.pcm.sync_src = auxpcm_pdata->mode_8k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_8k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_8k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_8k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_8k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_8k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_8k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_8k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(dai->dev, "%s 8khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } - } else { - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = - auxpcm_pdata->mode_16k.mode; - dai_data->port_config.pcm.sync_src = - auxpcm_pdata->mode_16k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_16k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_16k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_16k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_16k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_16k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_16k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_16k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(dai->dev, "%s 16khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } - } - - dev_dbg(dai->dev, "%s: aux_mode 0x%x sync_src 0x%x frame_setting 0x%x\n", - __func__, dai_data->port_config.pcm.aux_mode, - dai_data->port_config.pcm.sync_src, - dai_data->port_config.pcm.frame_setting); - dev_dbg(dai->dev, "%s: qtype 0x%x dout 0x%x num_map[0] 0x%x\n" - "num_map[1] 0x%x num_map[2] 0x%x num_map[3] 0x%x\n", - __func__, dai_data->port_config.pcm.quantype, - dai_data->port_config.pcm.ctrl_data_out_enable, - dai_data->port_config.pcm.slot_number_mapping[0], - dai_data->port_config.pcm.slot_number_mapping[1], - dai_data->port_config.pcm.slot_number_mapping[2], - dai_data->port_config.pcm.slot_number_mapping[3]); - - mutex_unlock(&aux_dai_data->rlock); - return rc; -} - -static int msm_dai_q6_auxpcm_set_clk( - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data, - u16 port_id, bool enable) -{ - int rc; - - pr_debug("%s: afe_clk_ver: %d, port_id: %d, enable: %d\n", __func__, - aux_dai_data->afe_clk_ver, port_id, enable); - if (aux_dai_data->afe_clk_ver == AFE_CLK_VERSION_V2) { - aux_dai_data->clk_set.enable = enable; - rc = afe_set_lpass_clock_v2(port_id, - &aux_dai_data->clk_set); - } else { - if (!enable) - aux_dai_data->clk_cfg.clk_val1 = 0; - rc = afe_set_lpass_clock(port_id, - &aux_dai_data->clk_cfg); - } - return rc; -} - -static void msm_dai_q6_auxpcm_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = - dev_get_drvdata(dai->dev); - - mutex_lock(&aux_dai_data->rlock); - - if (!(test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status))) { - dev_dbg(dai->dev, "%s(): dai->id %d PCM ports already closed\n", - __func__, dai->id); - goto exit; - } - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status)) - clear_bit(STATUS_TX_PORT, - aux_dai_data->auxpcm_port_status); - else { - dev_dbg(dai->dev, "%s: PCM_TX port already closed\n", - __func__); - goto exit; - } - } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) - clear_bit(STATUS_RX_PORT, - aux_dai_data->auxpcm_port_status); - else { - dev_dbg(dai->dev, "%s: PCM_RX port already closed\n", - __func__); - goto exit; - } - } - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: cannot shutdown PCM ports\n", - __func__); - goto exit; - } - - dev_dbg(dai->dev, "%s: dai->id = %d closing PCM AFE ports\n", - __func__, dai->id); - - rc = afe_close(aux_dai_data->rx_pid); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close PCM_RX AFE port\n"); - - rc = afe_close(aux_dai_data->tx_pid); - if (rc < 0) - dev_err(dai->dev, "fail to close AUX PCM TX port\n"); - - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->rx_pid, false); - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->tx_pid, false); -exit: - mutex_unlock(&aux_dai_data->rlock); -} - -static int msm_dai_q6_auxpcm_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = &aux_dai_data->bdai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = NULL; - int rc = 0; - u32 pcm_clk_rate; - - auxpcm_pdata = dai->dev->platform_data; - mutex_lock(&aux_dai_data->rlock); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (test_bit(STATUS_TX_PORT, - aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: PCM_TX port already ON\n", - __func__); - goto exit; - } else - set_bit(STATUS_TX_PORT, - aux_dai_data->auxpcm_port_status); - } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (test_bit(STATUS_RX_PORT, - aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: PCM_RX port already ON\n", - __func__); - goto exit; - } else - set_bit(STATUS_RX_PORT, - aux_dai_data->auxpcm_port_status); - } - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) && - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - dev_dbg(dai->dev, "%s: PCM ports already set\n", __func__); - goto exit; - } - - dev_dbg(dai->dev, "%s: dai->id:%d opening afe ports\n", - __func__, dai->id); - - rc = afe_q6_interface_prepare(); - if (rc < 0) { - dev_err(dai->dev, "fail to open AFE APR\n"); - goto fail; - } - - /* - * For AUX PCM Interface the below sequence of clk - * settings and afe_open is a strict requirement. - * - * Also using afe_open instead of afe_port_start_nowait - * to make sure the port is open before deasserting the - * clock line. This is required because pcm register is - * not written before clock deassert. Hence the hw does - * not get updated with new setting if the below clock - * assert/deasset and afe_open sequence is not followed. - */ - - if (dai_data->rate == 8000) { - pcm_clk_rate = auxpcm_pdata->mode_8k.pcm_clk_rate; - } else if (dai_data->rate == 16000) { - pcm_clk_rate = (auxpcm_pdata->mode_16k.pcm_clk_rate); - } else { - dev_err(dai->dev, "%s: Invalid AUX PCM rate %d\n", __func__, - dai_data->rate); - rc = -EINVAL; - goto fail; - } - if (aux_dai_data->afe_clk_ver == AFE_CLK_VERSION_V2) { - memcpy(&aux_dai_data->clk_set, &lpass_clk_set_default, - sizeof(struct afe_clk_set)); - aux_dai_data->clk_set.clk_freq_in_hz = pcm_clk_rate; - - switch (dai->id) { - case MSM_DAI_PRI_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_PRI_PCM_EBIT; - break; - case MSM_DAI_SEC_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEC_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_SEC_PCM_EBIT; - break; - case MSM_DAI_TERT_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_TER_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_TER_PCM_EBIT; - break; - case MSM_DAI_QUAT_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUAD_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUAD_PCM_EBIT; - break; - case MSM_DAI_QUIN_AUXPCM_DT_DEV_ID: - if (pcm_clk_rate) - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUIN_PCM_IBIT; - else - aux_dai_data->clk_set.clk_id = - Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT; - break; - default: - dev_err(dai->dev, "%s: AUXPCM id: %d not supported\n", - __func__, dai->id); - break; - } - } else { - memcpy(&aux_dai_data->clk_cfg, &lpass_clk_cfg_default, - sizeof(struct afe_clk_cfg)); - aux_dai_data->clk_cfg.clk_val1 = pcm_clk_rate; - } - - rc = msm_dai_q6_auxpcm_set_clk(aux_dai_data, - aux_dai_data->rx_pid, true); - if (rc < 0) { - dev_err(dai->dev, - "%s:afe_set_lpass_clock on RX pcm_src_clk failed\n", - __func__); - goto fail; - } - - rc = msm_dai_q6_auxpcm_set_clk(aux_dai_data, - aux_dai_data->tx_pid, true); - if (rc < 0) { - dev_err(dai->dev, - "%s:afe_set_lpass_clock on TX pcm_src_clk failed\n", - __func__); - goto fail; - } - - afe_open(aux_dai_data->rx_pid, &dai_data->port_config, dai_data->rate); - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4) { - /* - * send island mode config - * This should be the first configuration - */ - rc = afe_send_port_island_mode(aux_dai_data->tx_pid); - if (rc) - dev_err(dai->dev, "%s: afe send island mode failed %d\n", - __func__, rc); - } - afe_open(aux_dai_data->tx_pid, &dai_data->port_config, dai_data->rate); - goto exit; - -fail: - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - clear_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); - else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - clear_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status); - -exit: - mutex_unlock(&aux_dai_data->rlock); - return rc; -} - -static int msm_dai_q6_auxpcm_trigger(struct snd_pcm_substream *substream, - int cmd, struct snd_soc_dai *dai) -{ - int rc = 0; - - pr_debug("%s:port:%d cmd:%d\n", - __func__, dai->id, cmd); - - switch (cmd) { - - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - /* afe_open will be called from prepare */ - return 0; - - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - return 0; - - default: - pr_err("%s: cmd %d\n", __func__, cmd); - rc = -EINVAL; - } - - return rc; - -} - -static int msm_dai_q6_dai_auxpcm_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data; - int rc; - - aux_dai_data = dev_get_drvdata(dai->dev); - - dev_dbg(dai->dev, "%s: dai->id %d closing afe\n", - __func__, dai->id); - - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || - test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) { - rc = afe_close(aux_dai_data->rx_pid); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AUXPCM RX AFE port\n"); - rc = afe_close(aux_dai_data->tx_pid); - if (rc < 0) - dev_err(dai->dev, "fail to close AUXPCM TX AFE port\n"); - clear_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); - clear_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status); - } - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->rx_pid, false); - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->tx_pid, false); - return 0; -} - -static int msm_dai_q6_island_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value = ucontrol->value.integer.value[0]; - u16 port_id = (u16)kcontrol->private_value; - - pr_debug("%s: island mode = %d\n", __func__, value); - - afe_set_island_mode_cfg(port_id, value); - return 0; -} - -static int msm_dai_q6_island_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int value; - u16 port_id = (u16)kcontrol->private_value; - - afe_get_island_mode_cfg(port_id, &value); - ucontrol->value.integer.value[0] = value; - return 0; -} - -static void island_mx_ctl_private_free(struct snd_kcontrol *kcontrol) -{ - struct snd_kcontrol_new *knew = snd_kcontrol_chip(kcontrol); - - kfree(knew); -} - -static int msm_dai_q6_add_island_mx_ctls(struct snd_card *card, - const char *dai_name, - int dai_id, void *dai_data) -{ - const char *mx_ctl_name = "TX island"; - char *mixer_str = NULL; - int dai_str_len = 0, ctl_len = 0; - int rc = 0; - struct snd_kcontrol_new *knew = NULL; - struct snd_kcontrol *kctl = NULL; - - dai_str_len = strlen(dai_name) + 1; - - /* Add island related mixer controls */ - ctl_len = dai_str_len + strlen(mx_ctl_name) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %s", dai_name, mx_ctl_name); - - knew = kzalloc(sizeof(struct snd_kcontrol_new), GFP_KERNEL); - if (!knew) { - kfree(mixer_str); - return -ENOMEM; - } - knew->iface = SNDRV_CTL_ELEM_IFACE_MIXER; - knew->info = snd_ctl_boolean_mono_info; - knew->get = msm_dai_q6_island_mode_get; - knew->put = msm_dai_q6_island_mode_put; - knew->name = mixer_str; - knew->private_value = dai_id; - kctl = snd_ctl_new1(knew, knew); - if (!kctl) { - kfree(knew); - kfree(mixer_str); - return -ENOMEM; - } - kctl->private_free = island_mx_ctl_private_free; - rc = snd_ctl_add(card, kctl); - if (rc < 0) - pr_err("%s: err add config ctl, DAI = %s\n", - __func__, dai_name); - kfree(mixer_str); - - return rc; -} - -/* - * For single CPU DAI registration, the dai id needs to be - * set explicitly in the dai probe as ASoC does not read - * the cpu->driver->id field rather it assigns the dai id - * from the device name that is in the form %s.%d. This dai - * id should be assigned to back-end AFE port id and used - * during dai prepare. For multiple dai registration, it - * is not required to call this function, however the dai-> - * driver->id field must be defined and set to corresponding - * AFE Port id. - */ -static inline void msm_dai_q6_set_dai_id(struct snd_soc_dai *dai) -{ - if (!dai->driver) { - dev_err(dai->dev, "DAI driver is not set\n"); - return; - } - if (!dai->driver->id) { - dev_dbg(dai->dev, "DAI driver id is not set\n"); - return; - } - dai->id = dai->driver->id; -} - -static int msm_dai_q6_aux_pcm_probe(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_auxpcm_dai_data *dai_data = NULL; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - msm_dai_q6_set_dai_id(dai); - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai_data->tx_pid, - (void *)dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static struct snd_soc_dai_ops msm_dai_q6_auxpcm_ops = { - .prepare = msm_dai_q6_auxpcm_prepare, - .trigger = msm_dai_q6_auxpcm_trigger, - .hw_params = msm_dai_q6_auxpcm_hw_params, - .shutdown = msm_dai_q6_auxpcm_shutdown, -}; - -static const struct snd_soc_component_driver - msm_dai_q6_aux_pcm_dai_component = { - .name = "msm-auxpcm-dev", -}; - -static struct snd_soc_dai_driver msm_dai_q6_aux_pcm_dai[] = { - { - .playback = { - .stream_name = "AUX PCM Playback", - .aif_name = "AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "AUX PCM Capture", - .aif_name = "AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_PRI_AUXPCM_DT_DEV_ID, - .name = "Pri AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Sec AUX PCM Playback", - .aif_name = "SEC_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Sec AUX PCM Capture", - .aif_name = "SEC_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_SEC_AUXPCM_DT_DEV_ID, - .name = "Sec AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Tert AUX PCM Playback", - .aif_name = "TERT_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Tert AUX PCM Capture", - .aif_name = "TERT_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_TERT_AUXPCM_DT_DEV_ID, - .name = "Tert AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Quat AUX PCM Playback", - .aif_name = "QUAT_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Quat AUX PCM Capture", - .aif_name = "QUAT_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_QUAT_AUXPCM_DT_DEV_ID, - .name = "Quat AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, - { - .playback = { - .stream_name = "Quin AUX PCM Playback", - .aif_name = "QUIN_AUX_PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .capture = { - .stream_name = "Quin AUX PCM Capture", - .aif_name = "QUIN_AUX_PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .id = MSM_DAI_QUIN_AUXPCM_DT_DEV_ID, - .name = "Quin AUX PCM", - .ops = &msm_dai_q6_auxpcm_ops, - .probe = msm_dai_q6_aux_pcm_probe, - .remove = msm_dai_q6_dai_auxpcm_remove, - }, -}; - -static int msm_dai_q6_spdif_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->spdif_port.cfg.data_format = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_spdif_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->spdif_port.cfg.data_format; - return 0; -} - -static int msm_dai_q6_spdif_source_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->spdif_port.cfg.src_sel = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_spdif_source_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->spdif_port.cfg.src_sel; - return 0; -} - -static const char * const spdif_format[] = { - "LPCM", - "Compr" -}; - -static const char * const spdif_source[] = { - "Optical", "EXT-ARC", "Coaxial", "VT-ARC" -}; - -static const struct soc_enum spdif_rx_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_format), spdif_format), -}; - -static const struct soc_enum spdif_tx_config_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_source), spdif_source), - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spdif_format), spdif_format), -}; - -static int msm_dai_q6_spdif_chstatus_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - int ret = 0; - - dai_data->spdif_port.ch_status.status_type = - AFE_API_VERSION_SPDIF_CH_STATUS_CONFIG; - memset(dai_data->spdif_port.ch_status.status_mask, - CHANNEL_STATUS_MASK_INIT, CHANNEL_STATUS_SIZE); - dai_data->spdif_port.ch_status.status_mask[0] = - CHANNEL_STATUS_MASK; - - memcpy(dai_data->spdif_port.ch_status.status_bits, - ucontrol->value.iec958.status, CHANNEL_STATUS_SIZE); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: Port already started. Dynamic update\n", - __func__); - ret = afe_send_spdif_ch_status_cfg( - &dai_data->spdif_port.ch_status, - dai_data->port_id); - } - return ret; -} - -static int msm_dai_q6_spdif_chstatus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_dai_q6_spdif_dai_data *dai_data = kcontrol->private_data; - - memcpy(ucontrol->value.iec958.status, - dai_data->spdif_port.ch_status.status_bits, - CHANNEL_STATUS_SIZE); - return 0; -} - -static int msm_dai_q6_spdif_chstatus_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; - uinfo->count = 1; - return 0; -} - -static const struct snd_kcontrol_new spdif_rx_config_controls[] = { - /* Primary SPDIF output */ - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM), - .info = msm_dai_q6_spdif_chstatus_info, - .get = msm_dai_q6_spdif_chstatus_get, - .put = msm_dai_q6_spdif_chstatus_put, - }, - SOC_ENUM_EXT("PRI SPDIF RX Format", spdif_rx_config_enum[0], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put), - /* Secondary SPDIF output */ - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = SNDRV_CTL_NAME_IEC958("SEC", PLAYBACK, PCM_STREAM), - .info = msm_dai_q6_spdif_chstatus_info, - .get = msm_dai_q6_spdif_chstatus_get, - .put = msm_dai_q6_spdif_chstatus_put, - }, - SOC_ENUM_EXT("SEC SPDIF RX Format", spdif_rx_config_enum[0], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put) -}; - -static const struct snd_kcontrol_new spdif_tx_config_controls[] = { - SOC_ENUM_EXT("PRI SPDIF TX Source", spdif_tx_config_enum[0], - msm_dai_q6_spdif_source_get, - msm_dai_q6_spdif_source_put), - SOC_ENUM_EXT("PRI SPDIF TX Format", spdif_tx_config_enum[1], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put), - SOC_ENUM_EXT("SEC SPDIF TX Source", spdif_tx_config_enum[0], - msm_dai_q6_spdif_source_get, - msm_dai_q6_spdif_source_put), - SOC_ENUM_EXT("SEC SPDIF TX Format", spdif_tx_config_enum[1], - msm_dai_q6_spdif_format_get, - msm_dai_q6_spdif_format_put) -}; - -static void msm_dai_q6_spdif_process_event(uint32_t opcode, uint32_t token, - uint32_t *payload, void *private_data) -{ - struct msm_dai_q6_spdif_event_msg *evt; - struct msm_dai_q6_spdif_dai_data *dai_data; - - evt = (struct msm_dai_q6_spdif_event_msg *)payload; - dai_data = (struct msm_dai_q6_spdif_dai_data *)private_data; - - pr_debug("%s: old state %d, fmt %d, rate %d\n", - __func__, dai_data->fmt_event.status, - dai_data->fmt_event.data_format, - dai_data->fmt_event.sample_rate); - pr_debug("%s: new state %d, fmt %d, rate %d\n", - __func__, evt->fmt_event.status, - evt->fmt_event.data_format, - evt->fmt_event.sample_rate); - - dai_data->fmt_event.status = evt->fmt_event.status; - dai_data->fmt_event.data_format = evt->fmt_event.data_format; - dai_data->fmt_event.sample_rate = evt->fmt_event.sample_rate; -} - -static int msm_dai_q6_spdif_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->spdif_port.cfg.num_channels = dai_data->channels; - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->spdif_port.cfg.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->spdif_port.cfg.bit_width = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->bitwidth = dai_data->spdif_port.cfg.bit_width; - dai_data->spdif_port.cfg.sample_rate = dai_data->rate; - dai_data->spdif_port.cfg.spdif_cfg_minor_version = - AFE_API_VERSION_SPDIF_CONFIG_V2; - dev_dbg(dai->dev, " channel %d sample rate %d bit width %d\n", - dai_data->channels, dai_data->rate, - dai_data->spdif_port.cfg.bit_width); - dai_data->spdif_port.cfg.reserved = 0; - return 0; -} - -static void msm_dai_q6_spdif_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_info("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - return; - } - - rc = afe_close(dai->id); - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - dai_data->fmt_event.status = 0; /* report invalid line state */ - - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); -} - -static int msm_dai_q6_spdif_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_spdif_reg_event_cfg(dai->id, - AFE_MODULE_REGISTER_EVENT_FLAG, - msm_dai_q6_spdif_process_event, - dai_data); - if (rc < 0) - dev_err(dai->dev, - "fail to register event for port 0x%x\n", - dai->id); - - rc = afe_spdif_port_start(dai->id, &dai_data->spdif_port, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - - return rc; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_state(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.status); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.status); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_format(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.data_format); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.data_format); - - return ret; -} - -static ssize_t msm_dai_q6_spdif_sysfs_rda_audio_rate(struct device *dev, - struct device_attribute *attr, char *buf) -{ - ssize_t ret; - struct msm_dai_q6_spdif_dai_data *dai_data = dev_get_drvdata(dev); - - if (!dai_data) { - pr_err("%s: invalid input\n", __func__); - return -EINVAL; - } - - ret = snprintf(buf, MSM_DAI_SYSFS_ENTRY_MAX_LEN, "%d\n", - dai_data->fmt_event.sample_rate); - pr_debug("%s: '%d'\n", __func__, dai_data->fmt_event.sample_rate); - - return ret; -} - -static DEVICE_ATTR(audio_state, 0444, msm_dai_q6_spdif_sysfs_rda_audio_state, - NULL); -static DEVICE_ATTR(audio_format, 0444, msm_dai_q6_spdif_sysfs_rda_audio_format, - NULL); -static DEVICE_ATTR(audio_rate, 0444, msm_dai_q6_spdif_sysfs_rda_audio_rate, - NULL); - -static struct attribute *msm_dai_q6_spdif_fs_attrs[] = { - &dev_attr_audio_state.attr, - &dev_attr_audio_format.attr, - &dev_attr_audio_rate.attr, - NULL, -}; -static struct attribute_group msm_dai_q6_spdif_fs_attrs_group = { - .attrs = msm_dai_q6_spdif_fs_attrs, -}; - -static int msm_dai_q6_spdif_sysfs_create(struct snd_soc_dai *dai, - struct msm_dai_q6_spdif_dai_data *dai_data) -{ - int rc; - - rc = sysfs_create_group(&dai->dev->kobj, - &msm_dai_q6_spdif_fs_attrs_group); - if (rc) { - pr_err("%s: failed, rc=%d\n", __func__, rc); - return rc; - } - dai_data->kobj = &dai->dev->kobj; - - return 0; -} - -static void msm_dai_q6_spdif_sysfs_remove(struct snd_soc_dai *dai, - struct msm_dai_q6_spdif_dai_data *dai_data) -{ - if (dai_data->kobj) - sysfs_remove_group(dai_data->kobj, - &msm_dai_q6_spdif_fs_attrs_group); - dai_data->kobj = NULL; -} - -static int msm_dai_q6_spdif_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data; - int rc = 0; - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai) { - pr_err("%s: dai not found!!\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - dai_data = kzalloc(sizeof(struct msm_dai_q6_spdif_dai_data), - GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_set_dai_id(dai); - dai_data->port_id = dai->id; - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_rx_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_rx_config_controls[3], - dai_data)); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - rc = msm_dai_q6_spdif_sysfs_create(dai, dai_data); - - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - rc = msm_dai_q6_spdif_sysfs_create(dai, dai_data); - - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&spdif_tx_config_controls[3], - dai_data)); - break; - } - if (rc < 0) - dev_err(dai->dev, - "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - dapm = snd_soc_component_get_dapm(dai->component); - - memset(&intercon, 0, sizeof(intercon)); - if (!rc && dai && dai->driver) { - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s: add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s: src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - } - return rc; -} - -static int msm_dai_q6_spdif_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_spdif_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_spdif_reg_event_cfg(dai->id, - AFE_MODULE_DEREGISTER_EVENT_FLAG, - NULL, - dai_data); - if (rc < 0) - dev_err(dai->dev, - "fail to deregister event for port 0x%x\n", - dai->id); - - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - - msm_dai_q6_spdif_sysfs_remove(dai, dai_data); - - kfree(dai_data); - - return 0; -} - - -static struct snd_soc_dai_ops msm_dai_q6_spdif_ops = { - .prepare = msm_dai_q6_spdif_prepare, - .hw_params = msm_dai_q6_spdif_hw_params, - .shutdown = msm_dai_q6_spdif_shutdown, -}; - -static struct snd_soc_dai_driver msm_dai_q6_spdif_spdif_rx_dai[] = { - { - .playback = { - .stream_name = "Primary SPDIF Playback", - .aif_name = "PRI_SPDIF_RX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "PRI_SPDIF_RX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_PRIMARY_SPDIF_RX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, - { - .playback = { - .stream_name = "Secondary SPDIF Playback", - .aif_name = "SEC_SPDIF_RX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "SEC_SPDIF_RX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_SECONDARY_SPDIF_RX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_spdif_spdif_tx_dai[] = { - { - .capture = { - .stream_name = "Primary SPDIF Capture", - .aif_name = "PRI_SPDIF_TX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "PRI_SPDIF_TX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_PRIMARY_SPDIF_TX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, - { - .capture = { - .stream_name = "Secondary SPDIF Capture", - .aif_name = "SEC_SPDIF_TX", - .rates = SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 32000, - .rate_max = 192000, - }, - .name = "SEC_SPDIF_TX", - .ops = &msm_dai_q6_spdif_ops, - .id = AFE_PORT_ID_SECONDARY_SPDIF_TX, - .probe = msm_dai_q6_spdif_dai_probe, - .remove = msm_dai_q6_spdif_dai_remove, - }, -}; - -static const struct snd_soc_component_driver msm_dai_spdif_q6_component = { - .name = "msm-dai-q6-spdif", -}; - -static int msm_dai_q6_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if (dai_data->enc_config.format != ENC_FMT_NONE) { - int bitwidth = 0; - - switch (dai_data->afe_rx_in_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - bitwidth = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bitwidth = 16; - break; - } - pr_debug("%s: calling AFE_PORT_START_V2 with enc_format: %d\n", - __func__, dai_data->enc_config.format); - rc = afe_port_start_v2(dai->id, &dai_data->port_config, - dai_data->rate, - dai_data->afe_rx_in_channels, - bitwidth, - &dai_data->enc_config, NULL); - if (rc < 0) - pr_err("%s: afe_port_start_v2 failed error: %d\n", - __func__, rc); - } else if (dai_data->dec_config.format != DEC_FMT_NONE) { - int bitwidth = 0; - - /* - * If bitwidth is not configured set default value to - * zero, so that decoder port config uses slim device - * bit width value in afe decoder config. - */ - switch (dai_data->afe_tx_out_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - bitwidth = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - bitwidth = 16; - break; - default: - bitwidth = 0; - break; - } - pr_debug("%s: calling AFE_PORT_START_V2 with dec format: %d\n", - __func__, dai_data->dec_config.format); - rc = afe_port_start_v2(dai->id, &dai_data->port_config, - dai_data->rate, - dai_data->afe_tx_out_channels, - bitwidth, - NULL, &dai_data->dec_config); - if (rc < 0) { - pr_err("%s: fail to open AFE port 0x%x\n", - __func__, dai->id); - } - } else { - rc = afe_port_start(dai->id, &dai_data->port_config, - dai_data->rate); - } - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - return rc; -} - -static int msm_dai_q6_cdc_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - switch (dai_data->channels) { - case 2: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_STEREO; - break; - case 1: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - return -EINVAL; - pr_err("%s: err channels %d\n", - __func__, dai_data->channels); - break; - } - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.i2s.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.i2s.bit_width = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->port_config.i2s.sample_rate = dai_data->rate; - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.data_format = AFE_LINEAR_PCM_DATA; - dev_dbg(dai->dev, " channel %d sample rate %d entered\n", - dai_data->channels, dai_data->rate); - - dai_data->port_config.i2s.channel_mode = 1; - return 0; -} - -static u16 num_of_bits_set(u16 sd_line_mask) -{ - u8 num_bits_set = 0; - - while (sd_line_mask) { - num_bits_set++; - sd_line_mask = sd_line_mask & (sd_line_mask - 1); - } - return num_bits_set; -} - -static int msm_dai_q6_i2s_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - struct msm_i2s_data *i2s_pdata = - (struct msm_i2s_data *) dai->dev->platform_data; - - dai_data->channels = params_channels(params); - if (num_of_bits_set(i2s_pdata->sd_lines) == 1) { - switch (dai_data->channels) { - case 2: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_STEREO; - break; - case 1: - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - pr_warn("%s: greater than stereo has not been validated %d", - __func__, dai_data->channels); - break; - } - } - dai_data->rate = params_rate(params); - dai_data->port_config.i2s.sample_rate = dai_data->rate; - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.data_format = AFE_LINEAR_PCM_DATA; - /* Q6 only supports 16 as now */ - dai_data->port_config.i2s.bit_width = 16; - dai_data->port_config.i2s.channel_mode = 1; - - return 0; -} - -static int msm_dai_q6_slim_bus_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.slim_sch.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.slim_sch.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.slim_sch.bit_width = 32; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->port_config.slim_sch.sb_cfg_minor_version = - AFE_API_VERSION_SLIMBUS_CONFIG; - dai_data->port_config.slim_sch.sample_rate = dai_data->rate; - dai_data->port_config.slim_sch.num_channels = dai_data->channels; - - switch (dai->id) { - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - dai_data->port_config.slim_sch.slimbus_dev_id = - AFE_SLIMBUS_DEVICE_2; - break; - default: - dai_data->port_config.slim_sch.slimbus_dev_id = - AFE_SLIMBUS_DEVICE_1; - break; - } - - dev_dbg(dai->dev, "%s:slimbus_dev_id[%hu] bit_wd[%hu] format[%hu]\n" - "num_channel %hu shared_ch_mapping[0] %hu\n" - "slave_port_mapping[1] %hu slave_port_mapping[2] %hu\n" - "sample_rate %d\n", __func__, - dai_data->port_config.slim_sch.slimbus_dev_id, - dai_data->port_config.slim_sch.bit_width, - dai_data->port_config.slim_sch.data_format, - dai_data->port_config.slim_sch.num_channels, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1], - dai_data->port_config.slim_sch.shared_ch_mapping[2], - dai_data->rate); - - return 0; -} - -static int msm_dai_q6_usb_audio_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.usb_audio.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.usb_audio.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.usb_audio.bit_width = 32; - break; - - default: - dev_err(dai->dev, "%s: invalid format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - dai_data->port_config.usb_audio.cfg_minor_version = - AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - dai_data->port_config.usb_audio.num_channels = dai_data->channels; - dai_data->port_config.usb_audio.sample_rate = dai_data->rate; - - dev_dbg(dai->dev, "%s: dev_id[0x%x] bit_wd[%hu] format[%hu]\n" - "num_channel %hu sample_rate %d\n", __func__, - dai_data->port_config.usb_audio.dev_token, - dai_data->port_config.usb_audio.bit_width, - dai_data->port_config.usb_audio.data_format, - dai_data->port_config.usb_audio.num_channels, - dai_data->port_config.usb_audio.sample_rate); - - return 0; -} - -static int msm_dai_q6_bt_fm_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - dev_dbg(dai->dev, "channels %d sample rate %d entered\n", - dai_data->channels, dai_data->rate); - - memset(&dai_data->port_config, 0, sizeof(dai_data->port_config)); - - pr_debug("%s: setting bt_fm parameters\n", __func__); - - dai_data->port_config.int_bt_fm.bt_fm_cfg_minor_version = - AFE_API_VERSION_INTERNAL_BT_FM_CONFIG; - dai_data->port_config.int_bt_fm.num_channels = dai_data->channels; - dai_data->port_config.int_bt_fm.sample_rate = dai_data->rate; - dai_data->port_config.int_bt_fm.bit_width = 16; - - return 0; -} - -static int msm_dai_q6_afe_rtproxy_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->rate = params_rate(params); - dai_data->port_config.rtproxy.num_channels = params_channels(params); - dai_data->port_config.rtproxy.sample_rate = params_rate(params); - - pr_debug("channel %d entered,dai_id: %d,rate: %d\n", - dai_data->port_config.rtproxy.num_channels, dai->id, dai_data->rate); - - dai_data->port_config.rtproxy.rt_proxy_cfg_minor_version = - AFE_API_VERSION_RT_PROXY_CONFIG; - dai_data->port_config.rtproxy.bit_width = 16; /* Q6 only supports 16 */ - dai_data->port_config.rtproxy.interleaved = 1; - dai_data->port_config.rtproxy.frame_size = params_period_bytes(params); - dai_data->port_config.rtproxy.jitter_allowance = - dai_data->port_config.rtproxy.frame_size/2; - dai_data->port_config.rtproxy.low_water_mark = 0; - dai_data->port_config.rtproxy.high_water_mark = 0; - - return 0; -} - -static int msm_dai_q6_pseudo_port_hw_params(struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai, int stream) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - /* Q6 only supports 16 as now */ - dai_data->port_config.pseudo_port.pseud_port_cfg_minor_version = - AFE_API_VERSION_PSEUDO_PORT_CONFIG; - dai_data->port_config.pseudo_port.num_channels = - params_channels(params); - dai_data->port_config.pseudo_port.bit_width = 16; - dai_data->port_config.pseudo_port.data_format = 0; - dai_data->port_config.pseudo_port.timing_mode = - AFE_PSEUDOPORT_TIMING_MODE_TIMER; - dai_data->port_config.pseudo_port.sample_rate = params_rate(params); - - dev_dbg(dai->dev, "%s: bit_wd[%hu] num_channels [%hu] format[%hu]\n" - "timing Mode %hu sample_rate %d\n", __func__, - dai_data->port_config.pseudo_port.bit_width, - dai_data->port_config.pseudo_port.num_channels, - dai_data->port_config.pseudo_port.data_format, - dai_data->port_config.pseudo_port.timing_mode, - dai_data->port_config.pseudo_port.sample_rate); - - return 0; -} - -/* Current implementation assumes hw_param is called once - * This may not be the case but what to do when ADM and AFE - * port are already opened and parameter changes - */ -static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - int rc = 0; - - switch (dai->id) { - case PRIMARY_I2S_TX: - case PRIMARY_I2S_RX: - case SECONDARY_I2S_RX: - rc = msm_dai_q6_cdc_hw_params(params, dai, substream->stream); - break; - case MI2S_RX: - rc = msm_dai_q6_i2s_hw_params(params, dai, substream->stream); - break; - case SLIMBUS_0_RX: - case SLIMBUS_1_RX: - case SLIMBUS_2_RX: - case SLIMBUS_3_RX: - case SLIMBUS_4_RX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_7_RX: - case SLIMBUS_8_RX: - case SLIMBUS_9_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_TX: - case SLIMBUS_2_TX: - case SLIMBUS_3_TX: - case SLIMBUS_4_TX: - case SLIMBUS_5_TX: - case SLIMBUS_6_TX: - case SLIMBUS_7_TX: - case SLIMBUS_8_TX: - case SLIMBUS_9_TX: - rc = msm_dai_q6_slim_bus_hw_params(params, dai, - substream->stream); - break; - case INT_BT_SCO_RX: - case INT_BT_SCO_TX: - case INT_BT_A2DP_RX: - case INT_FM_RX: - case INT_FM_TX: - rc = msm_dai_q6_bt_fm_hw_params(params, dai, substream->stream); - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - rc = msm_dai_q6_usb_audio_hw_params(params, dai, - substream->stream); - break; - case RT_PROXY_DAI_001_TX: - case RT_PROXY_DAI_001_RX: - case RT_PROXY_DAI_002_TX: - case RT_PROXY_DAI_002_RX: - case RT_PROXY_PORT_002_TX: - case RT_PROXY_PORT_002_RX: - rc = msm_dai_q6_afe_rtproxy_hw_params(params, dai); - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - rc = msm_dai_q6_pseudo_port_hw_params(params, - dai, substream->stream); - break; - default: - dev_err(dai->dev, "invalid AFE port ID 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - - return rc; -} - -static void msm_dai_q6_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - int rc = 0; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: stop pseudo port:%d\n", __func__, dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - pr_debug("%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } -} - -static int msm_dai_q6_cdc_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - dai_data->port_config.i2s.ws_src = 1; /* CPU is master */ - break; - case SND_SOC_DAIFMT_CBM_CFM: - dai_data->port_config.i2s.ws_src = 0; /* CPU is slave */ - break; - default: - pr_err("%s: fmt 0x%x\n", - __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - int rc = 0; - - dev_dbg(dai->dev, "%s: id = %d fmt[%d]\n", __func__, - dai->id, fmt); - switch (dai->id) { - case PRIMARY_I2S_TX: - case PRIMARY_I2S_RX: - case MI2S_RX: - case SECONDARY_I2S_RX: - rc = msm_dai_q6_cdc_set_fmt(dai, fmt); - break; - default: - dev_err(dai->dev, "invalid cpu_dai id 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - - return rc; -} - -static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) - -{ - int rc = 0; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - unsigned int i = 0; - - dev_dbg(dai->dev, "%s: id = %d\n", __func__, dai->id); - switch (dai->id) { - case SLIMBUS_0_RX: - case SLIMBUS_1_RX: - case SLIMBUS_2_RX: - case SLIMBUS_3_RX: - case SLIMBUS_4_RX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_7_RX: - case SLIMBUS_8_RX: - case SLIMBUS_9_RX: - /* - * channel number to be between 128 and 255. - * For RX port use channel numbers - * from 138 to 144 for pre-Taiko - * from 144 to 159 for Taiko - */ - if (!rx_slot) { - pr_err("%s: rx slot not found\n", __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - pr_err("%s: invalid rx num %d\n", __func__, rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) { - dai_data->port_config.slim_sch.shared_ch_mapping[i] = - rx_slot[i]; - pr_debug("%s: find number of channels[%d] ch[%d]\n", - __func__, i, rx_slot[i]); - } - dai_data->port_config.slim_sch.num_channels = rx_num; - pr_debug("%s: SLIMBUS_%d_RX cnt[%d] ch[%d %d]\n", __func__, - (dai->id - SLIMBUS_0_RX) / 2, rx_num, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1]); - - break; - case SLIMBUS_0_TX: - case SLIMBUS_1_TX: - case SLIMBUS_2_TX: - case SLIMBUS_3_TX: - case SLIMBUS_4_TX: - case SLIMBUS_5_TX: - case SLIMBUS_6_TX: - case SLIMBUS_7_TX: - case SLIMBUS_8_TX: - case SLIMBUS_9_TX: - /* - * channel number to be between 128 and 255. - * For TX port use channel numbers - * from 128 to 137 for pre-Taiko - * from 128 to 143 for Taiko - */ - if (!tx_slot) { - pr_err("%s: tx slot not found\n", __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - pr_err("%s: invalid tx num %d\n", __func__, tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) { - dai_data->port_config.slim_sch.shared_ch_mapping[i] = - tx_slot[i]; - pr_debug("%s: find number of channels[%d] ch[%d]\n", - __func__, i, tx_slot[i]); - } - dai_data->port_config.slim_sch.num_channels = tx_num; - pr_debug("%s:SLIMBUS_%d_TX cnt[%d] ch[%d %d]\n", __func__, - (dai->id - SLIMBUS_0_TX) / 2, tx_num, - dai_data->port_config.slim_sch.shared_ch_mapping[0], - dai_data->port_config.slim_sch.shared_ch_mapping[1]); - break; - default: - dev_err(dai->dev, "invalid cpu_dai id 0x%x\n", dai->id); - rc = -EINVAL; - break; - } - return rc; -} - -static int msm_dai_q6_spk_digital_mute(struct snd_soc_dai *dai, - int mute) -{ - int port_id = dai->id; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (mute && !dai_data->xt_logging_disable) - afe_get_sp_xt_logging_data(port_id); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_q6_ops = { - .prepare = msm_dai_q6_prepare, - .hw_params = msm_dai_q6_hw_params, - .shutdown = msm_dai_q6_shutdown, - .set_fmt = msm_dai_q6_set_fmt, - .set_channel_map = msm_dai_q6_set_channel_map, -}; - -static struct snd_soc_dai_ops msm_dai_slimbus_0_rx_ops = { - .prepare = msm_dai_q6_prepare, - .hw_params = msm_dai_q6_hw_params, - .shutdown = msm_dai_q6_shutdown, - .set_fmt = msm_dai_q6_set_fmt, - .set_channel_map = msm_dai_q6_set_channel_map, - .digital_mute = msm_dai_q6_spk_digital_mute, -}; - -static int msm_dai_q6_cal_info_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u16 port_id = ((struct soc_enum *) - kcontrol->private_value)->reg; - - dai_data->cal_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: setting cal_mode to %d\n", - __func__, dai_data->cal_mode); - afe_set_cal_mode(port_id, dai_data->cal_mode); - - return 0; -} - -static int msm_dai_q6_cal_info_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = dai_data->cal_mode; - return 0; -} - -static int msm_dai_q6_cdc_dma_xt_logging_disable_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->xt_logging_disable = ucontrol->value.integer.value[0]; - pr_debug("%s: setting xt logging disable to %d\n", - __func__, dai_data->xt_logging_disable); - } - - return 0; -} - -static int msm_dai_q6_cdc_dma_xt_logging_disable_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = dai_data->xt_logging_disable; - return 0; -} - -static int msm_dai_q6_sb_xt_logging_disable_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->xt_logging_disable = ucontrol->value.integer.value[0]; - pr_debug("%s: setting xt logging disable to %d\n", - __func__, dai_data->xt_logging_disable); - } - - return 0; -} - -static int msm_dai_q6_sb_xt_logging_disable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = dai_data->xt_logging_disable; - return 0; -} - -static int msm_dai_q6_sb_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.slim_sch.data_format = value; - pr_debug("%s: format = %d\n", __func__, value); - } - - return 0; -} - -static int msm_dai_q6_sb_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) - ucontrol->value.integer.value[0] = - dai_data->port_config.slim_sch.data_format; - - return 0; -} - -static int msm_dai_q6_usb_audio_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.usb_audio.dev_token = val; - pr_debug("%s: dev_token = 0x%x\n", __func__, - dai_data->port_config.usb_audio.dev_token); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - } - - return 0; -} - -static int msm_dai_q6_usb_audio_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.dev_token; - pr_debug("%s: dev_token = 0x%x\n", __func__, - dai_data->port_config.usb_audio.dev_token); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - } - - return 0; -} - -static int msm_dai_q6_usb_audio_endian_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (dai_data) { - dai_data->port_config.usb_audio.endian = val; - pr_debug("%s: endian = 0x%x\n", __func__, - dai_data->port_config.usb_audio.endian); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_usb_audio_endian_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.endian; - pr_debug("%s: endian = 0x%x\n", __func__, - dai_data->port_config.usb_audio.endian); - } else { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_usb_audio_svc_interval_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 val = ucontrol->value.integer.value[0]; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - dai_data->port_config.usb_audio.service_interval = val; - pr_debug("%s: new service interval = %u\n", __func__, - dai_data->port_config.usb_audio.service_interval); - return 0; -} - -static int msm_dai_q6_usb_audio_svc_interval_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: dai_data is NULL\n", __func__); - return -EINVAL; - } - ucontrol->value.integer.value[0] = - dai_data->port_config.usb_audio.service_interval; - pr_debug("%s: service interval = %d\n", __func__, - dai_data->port_config.usb_audio.service_interval); - return 0; -} - -static int msm_dai_q6_afe_enc_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_enc_config); - - return 0; -} - -static int msm_dai_q6_afe_enc_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - int format_size = sizeof(dai_data->enc_config.format); - - pr_debug("%s: encoder config for %d format\n", - __func__, dai_data->enc_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->enc_config.format, - format_size); - switch (dai_data->enc_config.format) { - case ENC_FMT_SBC: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_sbc_enc_cfg_t)); - break; - case ENC_FMT_AAC_V2: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aac_enc_cfg_t)); - break; - case ENC_FMT_APTX: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_enc_cfg_t)); - break; - case ENC_FMT_APTX_HD: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_custom_enc_cfg_t)); - break; - case ENC_FMT_CELT: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_celt_enc_cfg_t)); - break; - case ENC_FMT_LDAC: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_ldac_enc_cfg_t)); - break; - case ENC_FMT_APTX_ADAPTIVE: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->enc_config.data, - sizeof(struct asm_aptx_ad_enc_cfg_t)); - break; - default: - pr_debug("%s: unknown format = %d\n", - __func__, dai_data->enc_config.format); - ret = -EINVAL; - break; - } - } - - return ret; -} - -static int msm_dai_q6_afe_enc_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - int format_size = sizeof(dai_data->enc_config.format); - - memset(&dai_data->enc_config, 0x0, - sizeof(struct afe_enc_config)); - memcpy(&dai_data->enc_config.format, - ucontrol->value.bytes.data, - format_size); - pr_debug("%s: Received encoder config for %d format\n", - __func__, dai_data->enc_config.format); - switch (dai_data->enc_config.format) { - case ENC_FMT_SBC: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_sbc_enc_cfg_t)); - break; - case ENC_FMT_AAC_V2: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aac_enc_cfg_t)); - break; - case ENC_FMT_APTX: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_enc_cfg_t)); - break; - case ENC_FMT_APTX_HD: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_custom_enc_cfg_t)); - break; - case ENC_FMT_CELT: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_celt_enc_cfg_t)); - break; - case ENC_FMT_LDAC: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_ldac_enc_cfg_t)); - break; - case ENC_FMT_APTX_ADAPTIVE: - memcpy(&dai_data->enc_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aptx_ad_enc_cfg_t)); - break; - default: - pr_debug("%s: Ignore enc config for unknown format = %d\n", - __func__, dai_data->enc_config.format); - ret = -EINVAL; - break; - } - } else - ret = -EINVAL; - - return ret; -} - -static const char *const afe_chs_text[] = {"Zero", "One", "Two"}; - -static const struct soc_enum afe_chs_enum[] = { - SOC_ENUM_SINGLE_EXT(3, afe_chs_text), -}; - -static const char *const afe_bit_format_text[] = {"S16_LE", "S24_LE", - "S32_LE"}; - -static const struct soc_enum afe_bit_format_enum[] = { - SOC_ENUM_SINGLE_EXT(3, afe_bit_format_text), -}; - -static const char *const tws_chs_mode_text[] = {"Zero", "One", "Two"}; - -static const struct soc_enum tws_chs_mode_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tws_chs_mode_text), tws_chs_mode_text), -}; - -static int msm_dai_q6_afe_input_channel_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = dai_data->afe_rx_in_channels; - pr_debug("%s:afe input channel = %d\n", - __func__, dai_data->afe_rx_in_channels); - } - - return 0; -} - -static int msm_dai_q6_afe_input_channel_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->afe_rx_in_channels = ucontrol->value.integer.value[0]; - pr_debug("%s: updating afe input channel : %d\n", - __func__, dai_data->afe_rx_in_channels); - } - - return 0; -} - -static int msm_dai_q6_tws_channel_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = NULL; - - if (dai) - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->enc_config.mono_mode; - pr_debug("%s:tws channel mode = %d\n", - __func__, dai_data->enc_config.mono_mode); - } - - return 0; -} - -static int msm_dai_q6_tws_channel_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = NULL; - int ret = 0; - - if (dai) - dai_data = dev_get_drvdata(dai->dev); - - if (dai_data && (dai_data->enc_config.format == ENC_FMT_APTX)) { - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - ret = afe_set_tws_channel_mode(dai->id, - ucontrol->value.integer.value[0]); - if (ret < 0) { - pr_err("%s: channel mode setting failed for TWS\n", - __func__); - goto exit; - } else { - pr_debug("%s: updating tws channel mode : %d\n", - __func__, dai_data->enc_config.mono_mode); - } - } - if (ucontrol->value.integer.value[0] == - MSM_DAI_TWS_CHANNEL_MODE_ONE || - ucontrol->value.integer.value[0] == - MSM_DAI_TWS_CHANNEL_MODE_TWO) - dai_data->enc_config.mono_mode = - ucontrol->value.integer.value[0]; - else - return -EINVAL; - } -exit: - return ret; -} - -static int msm_dai_q6_afe_input_bit_format_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - switch (dai_data->afe_rx_in_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: afe input bit format : %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_afe_input_bit_format_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - switch (ucontrol->value.integer.value[0]) { - case 2: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S32_LE; - break; - case 1: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - dai_data->afe_rx_in_bitformat = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: updating afe input bit format : %d\n", - __func__, dai_data->afe_rx_in_bitformat); - - return 0; -} - -static int msm_dai_q6_afe_output_bit_format_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - switch (dai_data->afe_tx_out_bitformat) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: afe output bit format : %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_dai_q6_afe_output_bit_format_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - switch (ucontrol->value.integer.value[0]) { - case 2: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S32_LE; - break; - case 1: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - dai_data->afe_tx_out_bitformat = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: updating afe output bit format : %d\n", - __func__, dai_data->afe_tx_out_bitformat); - - return 0; -} - -static int msm_dai_q6_afe_output_channel_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - ucontrol->value.integer.value[0] = - dai_data->afe_tx_out_channels; - pr_debug("%s:afe output channel = %d\n", - __func__, dai_data->afe_tx_out_channels); - } - return 0; -} - -static int msm_dai_q6_afe_output_channel_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (dai_data) { - dai_data->afe_tx_out_channels = - ucontrol->value.integer.value[0]; - pr_debug("%s: updating afe output channel : %d\n", - __func__, dai_data->afe_tx_out_channels); - } - return 0; -} - -static int msm_dai_q6_afe_scrambler_mode_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - ucontrol->value.integer.value[0] = dai_data->enc_config.scrambler_mode; - - return 0; -} - -static int msm_dai_q6_afe_scrambler_mode_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - dai_data->enc_config.scrambler_mode = ucontrol->value.integer.value[0]; - pr_debug("%s: afe scrambler mode : %d\n", - __func__, dai_data->enc_config.scrambler_mode); - return 0; -} - -static const struct snd_kcontrol_new afe_enc_config_controls[] = { - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_RX Encoder Config", - .info = msm_dai_q6_afe_enc_cfg_info, - .get = msm_dai_q6_afe_enc_cfg_get, - .put = msm_dai_q6_afe_enc_cfg_put, - }, - SOC_ENUM_EXT("AFE Input Channels", afe_chs_enum[0], - msm_dai_q6_afe_input_channel_get, - msm_dai_q6_afe_input_channel_put), - SOC_ENUM_EXT("AFE Input Bit Format", afe_bit_format_enum[0], - msm_dai_q6_afe_input_bit_format_get, - msm_dai_q6_afe_input_bit_format_put), - SOC_SINGLE_EXT("AFE Scrambler Mode", - 0, 0, 1, 0, - msm_dai_q6_afe_scrambler_mode_get, - msm_dai_q6_afe_scrambler_mode_put), - SOC_ENUM_EXT("TWS Channel Mode", tws_chs_mode_enum[0], - msm_dai_q6_tws_channel_mode_get, - msm_dai_q6_tws_channel_mode_put) -}; - -static int msm_dai_q6_afe_dec_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_dec_config); - - return 0; -} - -static int msm_dai_q6_afe_dec_cfg_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - format_size = sizeof(dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data, - &dai_data->dec_config.format, - format_size); - switch (dai_data->dec_config.format) { - case DEC_FMT_AAC_V2: - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.data, - sizeof(struct asm_aac_dec_cfg_v2_t)); - break; - case DEC_FMT_SBC: - case DEC_FMT_MP3: - /* No decoder specific data available */ - break; - default: - pr_debug("%s: Default decoder config for %d format: Expect abr_dec_cfg\n", - __func__, dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.abr_dec_cfg, - sizeof(struct afe_abr_dec_cfg_t)); - - break; - } - return 0; -} - -static int msm_dai_q6_afe_dec_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - u32 format_size = 0; - - if (!dai_data) { - pr_err("%s: Invalid dai data\n", __func__); - return -EINVAL; - } - - memset(&dai_data->dec_config, 0x0, - sizeof(struct afe_dec_config)); - format_size = sizeof(dai_data->dec_config.format); - memcpy(&dai_data->dec_config.format, - ucontrol->value.bytes.data, - format_size); - pr_debug("%s: Received decoder config for %d format\n", - __func__, dai_data->dec_config.format); - switch (dai_data->dec_config.format) { - case DEC_FMT_AAC_V2: - memcpy(&dai_data->dec_config.data, - ucontrol->value.bytes.data + format_size, - sizeof(struct asm_aac_dec_cfg_v2_t)); - break; - case DEC_FMT_SBC: - case DEC_FMT_MP3: - /* No decoder specific data available */ - break; - default: - pr_debug("%s: Default decoder config for %d format: Expect abr_dec_cfg\n", - __func__, dai_data->dec_config.format); - memcpy(&dai_data->dec_config.abr_dec_cfg, - ucontrol->value.bytes.data + format_size, - sizeof(struct afe_abr_dec_cfg_t)); - break; - } - return 0; -} - -static const struct snd_kcontrol_new afe_dec_config_controls[] = { - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_7_TX Decoder Config", - .info = msm_dai_q6_afe_dec_cfg_info, - .get = msm_dai_q6_afe_dec_cfg_get, - .put = msm_dai_q6_afe_dec_cfg_put, - }, - { - .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_INACTIVE), - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIM_9_TX Decoder Config", - .info = msm_dai_q6_afe_dec_cfg_info, - .get = msm_dai_q6_afe_dec_cfg_get, - .put = msm_dai_q6_afe_dec_cfg_put, - }, - SOC_ENUM_EXT("AFE Output Channels", afe_chs_enum[0], - msm_dai_q6_afe_output_channel_get, - msm_dai_q6_afe_output_channel_put), - SOC_ENUM_EXT("AFE Output Bit Format", afe_bit_format_enum[0], - msm_dai_q6_afe_output_bit_format_get, - msm_dai_q6_afe_output_bit_format_put), -}; - -static int msm_dai_q6_slim_rx_drift_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct afe_param_id_dev_timing_stats); - - return 0; -} - -static int msm_dai_q6_slim_rx_drift_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - struct afe_param_id_dev_timing_stats timing_stats; - struct snd_soc_dai *dai = kcontrol->private_data; - struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: afe port not started. dai_data->status_mask = %ld\n", - __func__, *dai_data->status_mask); - goto done; - } - - memset(&timing_stats, 0, sizeof(struct afe_param_id_dev_timing_stats)); - ret = afe_get_av_dev_drift(&timing_stats, dai->id); - if (ret) { - pr_err("%s: Error getting AFE Drift for port %d, err=%d\n", - __func__, dai->id, ret); - - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&timing_stats, - sizeof(struct afe_param_id_dev_timing_stats)); -done: - return ret; -} - -static const char * const afe_cal_mode_text[] = { - "CAL_MODE_DEFAULT", "CAL_MODE_NONE" -}; - -static const struct soc_enum slim_2_rx_enum = - SOC_ENUM_SINGLE(SLIMBUS_2_RX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct soc_enum rt_proxy_1_rx_enum = - SOC_ENUM_SINGLE(RT_PROXY_PORT_001_RX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct soc_enum rt_proxy_1_tx_enum = - SOC_ENUM_SINGLE(RT_PROXY_PORT_001_TX, 0, ARRAY_SIZE(afe_cal_mode_text), - afe_cal_mode_text); - -static const struct snd_kcontrol_new sb_config_controls[] = { - SOC_ENUM_EXT("SLIM_4_TX Format", sb_config_enum[0], - msm_dai_q6_sb_format_get, - msm_dai_q6_sb_format_put), - SOC_ENUM_EXT("SLIM_2_RX SetCalMode", slim_2_rx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), - SOC_ENUM_EXT("SLIM_2_RX Format", sb_config_enum[0], - msm_dai_q6_sb_format_get, - msm_dai_q6_sb_format_put), - SOC_ENUM_EXT("SLIM_0_RX XTLoggingDisable", xt_logging_disable_enum[0], - msm_dai_q6_sb_xt_logging_disable_get, - msm_dai_q6_sb_xt_logging_disable_put), -}; - -static const struct snd_kcontrol_new rt_proxy_config_controls[] = { - SOC_ENUM_EXT("RT_PROXY_1_RX SetCalMode", rt_proxy_1_rx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), - SOC_ENUM_EXT("RT_PROXY_1_TX SetCalMode", rt_proxy_1_tx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), -}; - -static const struct snd_kcontrol_new usb_audio_cfg_controls[] = { - SOC_SINGLE_EXT("USB_AUDIO_RX dev_token", 0, 0, UINT_MAX, 0, - msm_dai_q6_usb_audio_cfg_get, - msm_dai_q6_usb_audio_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_RX endian", 0, 0, 1, 0, - msm_dai_q6_usb_audio_endian_cfg_get, - msm_dai_q6_usb_audio_endian_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_TX dev_token", 0, 0, UINT_MAX, 0, - msm_dai_q6_usb_audio_cfg_get, - msm_dai_q6_usb_audio_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_TX endian", 0, 0, 1, 0, - msm_dai_q6_usb_audio_endian_cfg_get, - msm_dai_q6_usb_audio_endian_cfg_put), - SOC_SINGLE_EXT("USB_AUDIO_RX service_interval", SND_SOC_NOPM, 0, - UINT_MAX, 0, - msm_dai_q6_usb_audio_svc_interval_get, - msm_dai_q6_usb_audio_svc_interval_put), -}; - -static const struct snd_kcontrol_new avd_drift_config_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_0_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_6_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_PCM, - .name = "SLIMBUS_7_RX DRIFT", - .info = msm_dai_q6_slim_rx_drift_info, - .get = msm_dai_q6_slim_rx_drift_get, - }, -}; -static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data; - int rc = 0; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - dai_data = kzalloc(sizeof(struct msm_dai_q6_dai_data), GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - else - dev_set_drvdata(dai->dev, dai_data); - - msm_dai_q6_set_dai_id(dai); - - switch (dai->id) { - case SLIMBUS_4_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[0], - dai_data)); - break; - case SLIMBUS_2_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[2], - dai_data)); - break; - case SLIMBUS_7_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[3], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_enc_config_controls[4], - dai)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[2], - dai)); - break; - case SLIMBUS_7_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[0], - dai_data)); - break; - case SLIMBUS_9_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&afe_dec_config_controls[3], - dai_data)); - break; - case RT_PROXY_DAI_001_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&rt_proxy_config_controls[0], - dai_data)); - break; - case RT_PROXY_DAI_001_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&rt_proxy_config_controls[1], - dai_data)); - break; - case AFE_PORT_ID_USB_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[0], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[1], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[4], - dai_data)); - break; - case AFE_PORT_ID_USB_TX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[2], - dai_data)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&usb_audio_cfg_controls[3], - dai_data)); - break; - case SLIMBUS_0_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[0], - dai)); - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&sb_config_controls[3], - dai_data)); - break; - case SLIMBUS_6_RX: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&avd_drift_config_controls[1], - dai)); - break; - } - if (rc < 0) - dev_err(dai->dev, "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static int msm_dai_q6_dai_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_dai_data *dai_data; - int rc; - - dai_data = dev_get_drvdata(dai->dev); - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - pr_debug("%s: stop pseudo port:%d\n", __func__, dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - kfree(dai_data); - - return 0; -} - -static struct snd_soc_dai_driver msm_dai_q6_afe_rx_dai[] = { - { - .playback = { - .stream_name = "AFE Playback", - .aif_name = "PCM_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_001_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "AFE-PROXY RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_002_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_afe_tx_dai[] = { - { - .capture = { - .stream_name = "AFE Capture", - .aif_name = "PCM_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_002_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "AFE-PROXY TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_DAI_001_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_sco_rx_dai = { - .playback = { - .stream_name = "Internal BT-SCO Playback", - .aif_name = "INT_BT_SCO_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_SCO_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_a2dp_rx_dai = { - .playback = { - .stream_name = "Internal BT-A2DP Playback", - .aif_name = "INT_BT_A2DP_RX", - .rates = SNDRV_PCM_RATE_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_A2DP_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_bt_sco_tx_dai = { - .capture = { - .stream_name = "Internal BT-SCO Capture", - .aif_name = "INT_BT_SCO_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .rate_max = 16000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_BT_SCO_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_fm_rx_dai = { - .playback = { - .stream_name = "Internal FM Playback", - .aif_name = "INT_FM_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 2, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_FM_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_fm_tx_dai = { - .capture = { - .stream_name = "Internal FM Capture", - .aif_name = "INT_FM_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 2, - .channels_max = 2, - .rate_max = 48000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = INT_FM_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_voc_playback_dai[] = { - { - .playback = { - .stream_name = "Voice Farend Playback", - .aif_name = "VOICE_PLAYBACK_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_PLAYBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Voice2 Farend Playback", - .aif_name = "VOICE2_PLAYBACK_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE2_PLAYBACK_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_incall_record_dai[] = { - { - .capture = { - .stream_name = "Voice Uplink Capture", - .aif_name = "INCALL_RECORD_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_RECORD_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Voice Downlink Capture", - .aif_name = "INCALL_RECORD_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = VOICE_RECORD_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_proxy_tx_dai = { - .capture = { - .stream_name = "Proxy Capture", - .aif_name = "PROXY_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_PORT_002_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_proxy_rx_dai = { - .playback = { - .stream_name = "Proxy Playback", - .aif_name = "PROXY_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_ops, - .id = RT_PROXY_PORT_002_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_usb_rx_dai = { - .playback = { - .stream_name = "USB Audio Playback", - .aif_name = "USB_AUDIO_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_max = 384000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = AFE_PORT_ID_USB_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_q6_usb_tx_dai = { - .capture = { - .stream_name = "USB Audio Capture", - .aif_name = "USB_AUDIO_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_max = 384000, - .rate_min = 8000, - }, - .ops = &msm_dai_q6_ops, - .id = AFE_PORT_ID_USB_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, -}; - -static int msm_auxpcm_dev_probe(struct platform_device *pdev) -{ - struct msm_dai_q6_auxpcm_dai_data *dai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata; - uint32_t val_array[RATE_MAX_NUM_OF_AUX_PCM_RATES]; - uint32_t val = 0; - const char *intf_name; - int rc = 0, i = 0, len = 0; - const uint32_t *slot_mapping_array = NULL; - u32 array_length = 0; - - dai_data = kzalloc(sizeof(struct msm_dai_q6_auxpcm_dai_data), - GFP_KERNEL); - if (!dai_data) - return -ENOMEM; - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - auxpcm_pdata = kzalloc(sizeof(struct msm_dai_auxpcm_pdata), - GFP_KERNEL); - - if (!auxpcm_pdata) { - dev_err(&pdev->dev, "Failed to allocate memory for platform data\n"); - goto fail_pdata_nomem; - } - - dev_dbg(&pdev->dev, "%s: dev %pK, dai_data %pK, auxpcm_pdata %pK\n", - __func__, &pdev->dev, dai_data, auxpcm_pdata); - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-mode", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-mode missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.mode = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.mode = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-sync", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-sync missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.sync = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.sync = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-frame", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-frame missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.frame = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.frame = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-quant", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-quant missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.quant = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.quant = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-num-slots", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-num-slots missing in DT node\n", - __func__); - goto fail_invalid_dt; - } - auxpcm_pdata->mode_8k.num_slots = (u16)val_array[RATE_8KHZ]; - - if (auxpcm_pdata->mode_8k.num_slots > - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_8k.frame)) { - dev_err(&pdev->dev, "%s Max slots %d greater than DT node %d\n", - __func__, - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_8k.frame), - auxpcm_pdata->mode_8k.num_slots); - rc = -EINVAL; - goto fail_invalid_dt; - } - auxpcm_pdata->mode_16k.num_slots = (u16)val_array[RATE_16KHZ]; - - if (auxpcm_pdata->mode_16k.num_slots > - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_16k.frame)) { - dev_err(&pdev->dev, "%s Max slots %d greater than DT node %d\n", - __func__, - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_16k.frame), - auxpcm_pdata->mode_16k.num_slots); - rc = -EINVAL; - goto fail_invalid_dt; - } - - slot_mapping_array = of_get_property(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-slot-mapping", &len); - - if (slot_mapping_array == NULL) { - dev_err(&pdev->dev, "%s slot_mapping_array is not valid\n", - __func__); - rc = -EINVAL; - goto fail_invalid_dt; - } - - array_length = auxpcm_pdata->mode_8k.num_slots + - auxpcm_pdata->mode_16k.num_slots; - - if (len != sizeof(uint32_t) * array_length) { - dev_err(&pdev->dev, "%s Length is %d and expected is %zd\n", - __func__, len, sizeof(uint32_t) * array_length); - rc = -EINVAL; - goto fail_invalid_dt; - } - - auxpcm_pdata->mode_8k.slot_mapping = - kzalloc(sizeof(uint16_t) * - auxpcm_pdata->mode_8k.num_slots, - GFP_KERNEL); - if (!auxpcm_pdata->mode_8k.slot_mapping) { - dev_err(&pdev->dev, "%s No mem for mode_8k slot mapping\n", - __func__); - rc = -ENOMEM; - goto fail_invalid_dt; - } - - for (i = 0; i < auxpcm_pdata->mode_8k.num_slots; i++) - auxpcm_pdata->mode_8k.slot_mapping[i] = - (u16)be32_to_cpu(slot_mapping_array[i]); - - auxpcm_pdata->mode_16k.slot_mapping = - kzalloc(sizeof(uint16_t) * - auxpcm_pdata->mode_16k.num_slots, - GFP_KERNEL); - - if (!auxpcm_pdata->mode_16k.slot_mapping) { - dev_err(&pdev->dev, "%s No mem for mode_16k slot mapping\n", - __func__); - rc = -ENOMEM; - goto fail_invalid_16k_slot_mapping; - } - - for (i = 0; i < auxpcm_pdata->mode_16k.num_slots; i++) - auxpcm_pdata->mode_16k.slot_mapping[i] = - (u16)be32_to_cpu(slot_mapping_array[i + - auxpcm_pdata->mode_8k.num_slots]); - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-data", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-cpudai-auxpcm-data missing in DT node\n", - __func__); - goto fail_invalid_dt1; - } - auxpcm_pdata->mode_8k.data = (u16)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.data = (u16)val_array[RATE_16KHZ]; - - rc = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-cpudai-auxpcm-pcm-clk-rate", - val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); - if (rc) { - dev_err(&pdev->dev, - "%s: qcom,msm-cpudai-auxpcm-pcm-clk-rate missing in DT\n", - __func__); - goto fail_invalid_dt1; - } - auxpcm_pdata->mode_8k.pcm_clk_rate = (int)val_array[RATE_8KHZ]; - auxpcm_pdata->mode_16k.pcm_clk_rate = (int)val_array[RATE_16KHZ]; - - rc = of_property_read_string(pdev->dev.of_node, - "qcom,msm-auxpcm-interface", &intf_name); - if (rc) { - dev_err(&pdev->dev, - "%s: qcom,msm-auxpcm-interface missing in DT node\n", - __func__); - goto fail_nodev_intf; - } - - if (!strcmp(intf_name, "primary")) { - dai_data->rx_pid = AFE_PORT_ID_PRIMARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_PRIMARY_PCM_TX; - pdev->id = MSM_DAI_PRI_AUXPCM_DT_DEV_ID; - i = 0; - } else if (!strcmp(intf_name, "secondary")) { - dai_data->rx_pid = AFE_PORT_ID_SECONDARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_SECONDARY_PCM_TX; - pdev->id = MSM_DAI_SEC_AUXPCM_DT_DEV_ID; - i = 1; - } else if (!strcmp(intf_name, "tertiary")) { - dai_data->rx_pid = AFE_PORT_ID_TERTIARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_TERTIARY_PCM_TX; - pdev->id = MSM_DAI_TERT_AUXPCM_DT_DEV_ID; - i = 2; - } else if (!strcmp(intf_name, "quaternary")) { - dai_data->rx_pid = AFE_PORT_ID_QUATERNARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_QUATERNARY_PCM_TX; - pdev->id = MSM_DAI_QUAT_AUXPCM_DT_DEV_ID; - i = 3; - } else if (!strcmp(intf_name, "quinary")) { - dai_data->rx_pid = AFE_PORT_ID_QUINARY_PCM_RX; - dai_data->tx_pid = AFE_PORT_ID_QUINARY_PCM_TX; - pdev->id = MSM_DAI_QUIN_AUXPCM_DT_DEV_ID; - i = 4; - } else { - dev_err(&pdev->dev, "%s: invalid DT intf name %s\n", - __func__, intf_name); - goto fail_invalid_intf; - } - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-afe-clk-ver", &val); - if (rc) - dai_data->afe_clk_ver = AFE_CLK_VERSION_V1; - else - dai_data->afe_clk_ver = val; - - mutex_init(&dai_data->rlock); - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - - dev_set_drvdata(&pdev->dev, dai_data); - pdev->dev.platform_data = (void *) auxpcm_pdata; - - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_aux_pcm_dai_component, - &msm_dai_q6_aux_pcm_dai[i], 1); - if (rc) { - dev_err(&pdev->dev, "%s: auxpcm dai reg failed, rc=%d\n", - __func__, rc); - goto fail_reg_dai; - } - - return rc; - -fail_reg_dai: -fail_invalid_intf: -fail_nodev_intf: -fail_invalid_dt1: - kfree(auxpcm_pdata->mode_16k.slot_mapping); -fail_invalid_16k_slot_mapping: - kfree(auxpcm_pdata->mode_8k.slot_mapping); -fail_invalid_dt: - kfree(auxpcm_pdata); -fail_pdata_nomem: - kfree(dai_data); - return rc; -} - -static int msm_auxpcm_dev_remove(struct platform_device *pdev) -{ - struct msm_dai_q6_auxpcm_dai_data *dai_data; - - dai_data = dev_get_drvdata(&pdev->dev); - - snd_soc_unregister_component(&pdev->dev); - - mutex_destroy(&dai_data->rlock); - kfree(dai_data); - kfree(pdev->dev.platform_data); - - return 0; -} - -static const struct of_device_id msm_auxpcm_dev_dt_match[] = { - { .compatible = "qcom,msm-auxpcm-dev", }, - {} -}; - - -static struct platform_driver msm_auxpcm_dev_driver = { - .probe = msm_auxpcm_dev_probe, - .remove = msm_auxpcm_dev_remove, - .driver = { - .name = "msm-auxpcm-dev", - .owner = THIS_MODULE, - .of_match_table = msm_auxpcm_dev_dt_match, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_slimbus_rx_dai[] = { - { - .playback = { - .stream_name = "Slimbus Playback", - .aif_name = "SLIMBUS_0_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_slimbus_0_rx_ops, - .id = SLIMBUS_0_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus1 Playback", - .aif_name = "SLIMBUS_1_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_1_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus2 Playback", - .aif_name = "SLIMBUS_2_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_2_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus3 Playback", - .aif_name = "SLIMBUS_3_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_3_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus4 Playback", - .aif_name = "SLIMBUS_4_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_4_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus6 Playback", - .aif_name = "SLIMBUS_6_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_6_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus5 Playback", - .aif_name = "SLIMBUS_5_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_5_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus7 Playback", - .aif_name = "SLIMBUS_7_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_7_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus8 Playback", - .aif_name = "SLIMBUS_8_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_8_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .playback = { - .stream_name = "Slimbus9 Playback", - .aif_name = "SLIMBUS_9_RX", - .rates = SNDRV_PCM_RATE_8000_384000, - .formats = DAI_FORMATS_S16_S24_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_9_RX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_q6_slimbus_tx_dai[] = { - { - .capture = { - .stream_name = "Slimbus Capture", - .aif_name = "SLIMBUS_0_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_0_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus1 Capture", - .aif_name = "SLIMBUS_1_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_1_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus2 Capture", - .aif_name = "SLIMBUS_2_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_2_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus3 Capture", - .aif_name = "SLIMBUS_3_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 2, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_3_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus4 Capture", - .aif_name = "SLIMBUS_4_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 2, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_4_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus5 Capture", - .aif_name = "SLIMBUS_5_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_5_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus6 Capture", - .aif_name = "SLIMBUS_6_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_6_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus7 Capture", - .aif_name = "SLIMBUS_7_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_7_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus8 Capture", - .aif_name = "SLIMBUS_8_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_8_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, - { - .capture = { - .stream_name = "Slimbus9 Capture", - .aif_name = "SLIMBUS_9_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_ops, - .id = SLIMBUS_9_TX, - .probe = msm_dai_q6_dai_probe, - .remove = msm_dai_q6_dai_remove, - }, -}; - -static int msm_dai_q6_mi2s_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_config.i2s.data_format = value; - pr_debug("%s: value = %d, channel = %d, line = %d\n", - __func__, value, dai_data->port_config.i2s.mono_stereo, - dai_data->port_config.i2s.channel_mode); - return 0; -} - -static int msm_dai_q6_mi2s_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_config.i2s.data_format; - return 0; -} - -static int msm_dai_q6_mi2s_vi_feed_mono_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->vi_feed_mono = value; - pr_debug("%s: value = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_mi2s_vi_feed_mono_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = dai_data->vi_feed_mono; - return 0; -} - -static const struct snd_kcontrol_new mi2s_config_controls[] = { - SOC_ENUM_EXT("PRI MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SEC MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("TERT MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUAT MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUIN MI2S RX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("PRI MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SEC MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("TERT MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUAT MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("QUIN MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("SENARY MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), - SOC_ENUM_EXT("INT5 MI2S TX Format", mi2s_config_enum[0], - msm_dai_q6_mi2s_format_get, - msm_dai_q6_mi2s_format_put), -}; - -static const struct snd_kcontrol_new mi2s_vi_feed_controls[] = { - SOC_ENUM_EXT("INT5 MI2S VI MONO", mi2s_config_enum[1], - msm_dai_q6_mi2s_vi_feed_mono_get, - msm_dai_q6_mi2s_vi_feed_mono_put), -}; - -static int msm_dai_q6_dai_mi2s_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_mi2s_pdata *mi2s_pdata = - (struct msm_mi2s_pdata *) dai->dev->platform_data; - struct snd_kcontrol *kcontrol = NULL; - int rc = 0; - const struct snd_kcontrol_new *ctrl = NULL; - const struct snd_kcontrol_new *vi_feed_ctrl = NULL; - u16 dai_id = 0; - - dai->id = mi2s_pdata->intf_id; - - if (mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.channel_mode) { - if (dai->id == MSM_PRIM_MI2S) - ctrl = &mi2s_config_controls[0]; - if (dai->id == MSM_SEC_MI2S) - ctrl = &mi2s_config_controls[1]; - if (dai->id == MSM_TERT_MI2S) - ctrl = &mi2s_config_controls[2]; - if (dai->id == MSM_QUAT_MI2S) - ctrl = &mi2s_config_controls[3]; - if (dai->id == MSM_QUIN_MI2S) - ctrl = &mi2s_config_controls[4]; - } - - if (ctrl) { - kcontrol = snd_ctl_new1(ctrl, - &mi2s_dai_data->rx_dai.mi2s_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, kcontrol); - if (rc < 0) { - dev_err(dai->dev, "%s: err add RX fmt ctl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - ctrl = NULL; - if (mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.channel_mode) { - if (dai->id == MSM_PRIM_MI2S) - ctrl = &mi2s_config_controls[5]; - if (dai->id == MSM_SEC_MI2S) - ctrl = &mi2s_config_controls[6]; - if (dai->id == MSM_TERT_MI2S) - ctrl = &mi2s_config_controls[7]; - if (dai->id == MSM_QUAT_MI2S) - ctrl = &mi2s_config_controls[8]; - if (dai->id == MSM_QUIN_MI2S) - ctrl = &mi2s_config_controls[9]; - if (dai->id == MSM_SENARY_MI2S) - ctrl = &mi2s_config_controls[10]; - if (dai->id == MSM_INT5_MI2S) - ctrl = &mi2s_config_controls[11]; - } - - if (ctrl) { - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(ctrl, - &mi2s_dai_data->tx_dai.mi2s_dai_data)); - if (rc < 0) { - if (kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - kcontrol); - dev_err(dai->dev, "%s: err add TX fmt ctl DAI = %s\n", - __func__, dai->name); - } - } - - if (dai->id == MSM_INT5_MI2S) - vi_feed_ctrl = &mi2s_vi_feed_controls[0]; - - if (vi_feed_ctrl) { - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(vi_feed_ctrl, - &mi2s_dai_data->tx_dai.mi2s_dai_data)); - - if (rc < 0) { - dev_err(dai->dev, "%s: err add TX vi feed channel ctl DAI = %s\n", - __func__, dai->name); - } - } - - if (mi2s_dai_data->is_island_dai) { - msm_mi2s_get_port_id(dai->id, SNDRV_PCM_STREAM_CAPTURE, - &dai_id); - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai_id, - (void *)mi2s_dai_data); - } - - rc = msm_dai_q6_dai_add_route(dai); -rtn: - return rc; -} - - -static int msm_dai_q6_dai_mi2s_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - int rc; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask)) { - rc = afe_close(MI2S_RX); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close MI2S_RX port\n"); - clear_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask); - } - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask)) { - rc = afe_close(MI2S_TX); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close MI2S_TX port\n"); - clear_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask); - } - return 0; -} - -static int msm_dai_q6_mi2s_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - - return 0; -} - -static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id) -{ - int ret = 0; - - switch (stream) { - case SNDRV_PCM_STREAM_PLAYBACK: - switch (mi2s_id) { - case MSM_PRIM_MI2S: - *port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_SEC_MI2S: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_TERT_MI2S: - *port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_QUAT_MI2S: - *port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_SEC_MI2S_SD1: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - break; - case MSM_QUIN_MI2S: - *port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_INT0_MI2S: - *port_id = AFE_PORT_ID_INT0_MI2S_RX; - break; - case MSM_INT1_MI2S: - *port_id = AFE_PORT_ID_INT1_MI2S_RX; - break; - case MSM_INT2_MI2S: - *port_id = AFE_PORT_ID_INT2_MI2S_RX; - break; - case MSM_INT3_MI2S: - *port_id = AFE_PORT_ID_INT3_MI2S_RX; - break; - case MSM_INT4_MI2S: - *port_id = AFE_PORT_ID_INT4_MI2S_RX; - break; - case MSM_INT5_MI2S: - *port_id = AFE_PORT_ID_INT5_MI2S_RX; - break; - case MSM_INT6_MI2S: - *port_id = AFE_PORT_ID_INT6_MI2S_RX; - break; - default: - pr_err("%s: playback err id 0x%x\n", - __func__, mi2s_id); - ret = -1; - break; - } - break; - case SNDRV_PCM_STREAM_CAPTURE: - switch (mi2s_id) { - case MSM_PRIM_MI2S: - *port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_SEC_MI2S: - *port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_TERT_MI2S: - *port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_QUAT_MI2S: - *port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_QUIN_MI2S: - *port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case MSM_SENARY_MI2S: - *port_id = AFE_PORT_ID_SENARY_MI2S_TX; - break; - case MSM_INT0_MI2S: - *port_id = AFE_PORT_ID_INT0_MI2S_TX; - break; - case MSM_INT1_MI2S: - *port_id = AFE_PORT_ID_INT1_MI2S_TX; - break; - case MSM_INT2_MI2S: - *port_id = AFE_PORT_ID_INT2_MI2S_TX; - break; - case MSM_INT3_MI2S: - *port_id = AFE_PORT_ID_INT3_MI2S_TX; - break; - case MSM_INT4_MI2S: - *port_id = AFE_PORT_ID_INT4_MI2S_TX; - break; - case MSM_INT5_MI2S: - *port_id = AFE_PORT_ID_INT5_MI2S_TX; - break; - case MSM_INT6_MI2S: - *port_id = AFE_PORT_ID_INT6_MI2S_TX; - break; - default: - pr_err("%s: capture err id 0x%x\n", __func__, mi2s_id); - ret = -1; - break; - } - break; - default: - pr_err("%s: default err %d\n", __func__, stream); - ret = -1; - break; - } - pr_debug("%s: port_id = 0x%x\n", __func__, *port_id); - return ret; -} - -static int msm_dai_q6_mi2s_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - u16 port_id = 0; - int rc = 0; - - if (msm_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - return -EINVAL; - } - - dev_dbg(dai->dev, "%s: dai id %d, afe port id = 0x%x\n" - "dai_data->channels = %u sample_rate = %u\n", __func__, - dai->id, port_id, dai_data->channels, dai_data->rate); - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4) { - /* - * send island mode config. - * This should be the first configuration - */ - rc = afe_send_port_island_mode(port_id); - if (rc) - dev_err(dai->dev, "%s: afe send island mode failed %d\n", - __func__, rc); - } - - /* PORT START should be set if prepare called - * in active state. - */ - rc = afe_port_start(port_id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - if (!test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) { - set_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); - dev_dbg(dai->dev, "%s: set hwfree_status to started\n", - __func__); - } - return rc; -} - -static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_mi2s_dai_config *mi2s_dai_config = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai : &mi2s_dai_data->tx_dai); - struct msm_dai_q6_dai_data *dai_data = &mi2s_dai_config->mi2s_dai_data; - struct afe_param_id_i2s_cfg *i2s = &dai_data->port_config.i2s; -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - u16 port_id = 0; - - if (msm_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - return -EINVAL; - } -#endif - dai_data->channels = params_channels(params); - switch (dai_data->channels) { - case 15: - case 16: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_16CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 13: - case 14: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_14CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 11: - case 12: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_12CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 9: - case 10: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - dai_data->port_config.i2s.channel_mode - = AFE_PORT_I2S_10CHS; - break; - default: - goto error_invalid_data; - }; - break; - case 8: - case 7: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_8CHS) - goto error_invalid_data; - else - if (mi2s_dai_config->pdata_mi2s_lines - == AFE_PORT_I2S_8CHS_2) - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_8CHS_2; - else - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_8CHS; - break; - case 6: - case 5: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_6CHS) - goto error_invalid_data; - dai_data->port_config.i2s.channel_mode = AFE_PORT_I2S_6CHS; - break; - case 4: - case 3: - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - goto error_invalid_data; - break; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_QUAD23: - case AFE_PORT_I2S_QUAD45: - case AFE_PORT_I2S_QUAD67: - dai_data->port_config.i2s.channel_mode = - mi2s_dai_config->pdata_mi2s_lines; - break; - case AFE_PORT_I2S_8CHS_2: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_QUAD45; - break; - default: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_QUAD01; - break; - }; - break; - case 2: - case 1: - if (mi2s_dai_config->pdata_mi2s_lines < AFE_PORT_I2S_SD0) - goto error_invalid_data; - switch (mi2s_dai_config->pdata_mi2s_lines) { - case AFE_PORT_I2S_SD0: - case AFE_PORT_I2S_SD1: - case AFE_PORT_I2S_SD2: - case AFE_PORT_I2S_SD3: - case AFE_PORT_I2S_SD4: - case AFE_PORT_I2S_SD5: - case AFE_PORT_I2S_SD6: - case AFE_PORT_I2S_SD7: - dai_data->port_config.i2s.channel_mode = - mi2s_dai_config->pdata_mi2s_lines; - break; - case AFE_PORT_I2S_QUAD01: - case AFE_PORT_I2S_6CHS: - case AFE_PORT_I2S_8CHS: - case AFE_PORT_I2S_10CHS: - case AFE_PORT_I2S_12CHS: - case AFE_PORT_I2S_14CHS: - case AFE_PORT_I2S_16CHS: - if (dai_data->vi_feed_mono == SPKR_1) - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD0; - else - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD1; - break; - case AFE_PORT_I2S_QUAD23: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD2; - break; - case AFE_PORT_I2S_QUAD45: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD4; - break; - case AFE_PORT_I2S_QUAD67: - dai_data->port_config.i2s.channel_mode = - AFE_PORT_I2S_SD6; - break; - } - if (dai_data->channels == 2) - dai_data->port_config.i2s.mono_stereo = - MSM_AFE_CH_STEREO; - else - dai_data->port_config.i2s.mono_stereo = MSM_AFE_MONO; - break; - default: - pr_err("%s: default err channels %d\n", - __func__, dai_data->channels); - goto error_invalid_data; - } - dai_data->rate = params_rate(params); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.i2s.bit_width = 16; - dai_data->bitwidth = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.i2s.bit_width = 24; - dai_data->bitwidth = 24; - break; - default: - pr_err("%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->port_config.i2s.i2s_cfg_minor_version = - AFE_API_VERSION_I2S_CONFIG; - dai_data->port_config.i2s.sample_rate = dai_data->rate; - if ((test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask) && - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.hwfree_status)) || - (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask) && - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.hwfree_status))) { -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - if (AFE_PORT_ID_TFADSP_RX == port_id || - AFE_PORT_ID_TFADSP_TX == port_id) { - dev_dbg(dai->dev, "%s, port_id = 0x%x\n", __func__, port_id); - } else -#endif - if ((mi2s_dai_data->tx_dai.mi2s_dai_data.rate != - mi2s_dai_data->rx_dai.mi2s_dai_data.rate) || - (mi2s_dai_data->rx_dai.mi2s_dai_data.bitwidth != - mi2s_dai_data->tx_dai.mi2s_dai_data.bitwidth)) { - dev_err(dai->dev, "%s: Error mismatch in HW params\n" - "Tx sample_rate = %u bit_width = %hu\n" - "Rx sample_rate = %u bit_width = %hu\n" - , __func__, - mi2s_dai_data->tx_dai.mi2s_dai_data.rate, - mi2s_dai_data->tx_dai.mi2s_dai_data.bitwidth, - mi2s_dai_data->rx_dai.mi2s_dai_data.rate, - mi2s_dai_data->rx_dai.mi2s_dai_data.bitwidth); - return -EINVAL; - } - } - dev_dbg(dai->dev, "%s: dai id %d dai_data->channels = %d\n" - "sample_rate = %u i2s_cfg_minor_version = 0x%x\n" - "bit_width = %hu channel_mode = 0x%x mono_stereo = %#x\n" - "ws_src = 0x%x sample_rate = %u data_format = 0x%x\n" - "reserved = %u\n", __func__, dai->id, dai_data->channels, - dai_data->rate, i2s->i2s_cfg_minor_version, i2s->bit_width, - i2s->channel_mode, i2s->mono_stereo, i2s->ws_src, - i2s->sample_rate, i2s->data_format, i2s->reserved); - - return 0; - -error_invalid_data: - pr_err("%s: dai_data->channels = %d channel_mode = %d\n", __func__, - dai_data->channels, dai_data->port_config.i2s.channel_mode); - return -EINVAL; -} - - -static int msm_dai_q6_mi2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - - if (test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->rx_dai.mi2s_dai_data.status_mask) || - test_bit(STATUS_PORT_STARTED, - mi2s_dai_data->tx_dai.mi2s_dai_data.status_mask)) { - dev_err(dai->dev, "%s: err chg i2s mode while dai running", - __func__); - return -EPERM; - } - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBS_CFS: - mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.ws_src = 1; - mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.ws_src = 1; - break; - case SND_SOC_DAIFMT_CBM_CFM: - mi2s_dai_data->rx_dai.mi2s_dai_data.port_config.i2s.ws_src = 0; - mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.ws_src = 0; - break; - default: - pr_err("%s: fmt %d\n", - __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); - return -EINVAL; - } - - return 0; -} - -static int msm_dai_q6_mi2s_hw_free(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) { - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); - dev_dbg(dai->dev, "%s: clear hwfree_status\n", __func__); - } - return 0; -} - -static void msm_dai_q6_mi2s_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_mi2s_dai_data *mi2s_dai_data = - dev_get_drvdata(dai->dev); - struct msm_dai_q6_dai_data *dai_data = - (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - &mi2s_dai_data->rx_dai.mi2s_dai_data : - &mi2s_dai_data->tx_dai.mi2s_dai_data); - u16 port_id = 0; - int rc = 0; - - if (msm_mi2s_get_port_id(dai->id, substream->stream, - &port_id) != 0) { - dev_err(dai->dev, "%s: Invalid Port ID 0x%x\n", - __func__, port_id); - } - - dev_dbg(dai->dev, "%s: closing afe port id = 0x%x\n", - __func__, port_id); - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(port_id); - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); -} - -static struct snd_soc_dai_ops msm_dai_q6_mi2s_ops = { - .startup = msm_dai_q6_mi2s_startup, - .prepare = msm_dai_q6_mi2s_prepare, - .hw_params = msm_dai_q6_mi2s_hw_params, - .hw_free = msm_dai_q6_mi2s_hw_free, - .set_fmt = msm_dai_q6_mi2s_set_fmt, - .shutdown = msm_dai_q6_mi2s_shutdown, -}; - -/* Channel min and max are initialized base on platform data */ -static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = { - { - .playback = { - .stream_name = "Primary MI2S Playback", - .aif_name = "PRI_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 384000, - }, - .capture = { - .stream_name = "Primary MI2S Capture", - .aif_name = "PRI_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Primary MI2S", - .id = MSM_PRIM_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Secondary MI2S Playback", - .aif_name = "SEC_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Secondary MI2S Capture", - .aif_name = "SEC_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Secondary MI2S", - .id = MSM_SEC_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Tertiary MI2S Playback", - .aif_name = "TERT_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Tertiary MI2S Capture", - .aif_name = "TERT_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Tertiary MI2S", - .id = MSM_TERT_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Quaternary MI2S Playback", - .aif_name = "QUAT_MI2S_RX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Quaternary MI2S Capture", - .aif_name = "QUAT_MI2S_TX", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Quaternary MI2S", - .id = MSM_QUAT_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Quinary MI2S Playback", - .aif_name = "QUIN_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "Quinary MI2S Capture", - .aif_name = "QUIN_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Quinary MI2S", - .id = MSM_QUIN_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "Secondary MI2S Playback SD1", - .aif_name = "SEC_MI2S_RX_SD1", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .id = MSM_SEC_MI2S_SD1, - }, - { - .capture = { - .stream_name = "Senary_mi2s Capture", - .aif_name = "SENARY_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "Senary MI2S", - .id = MSM_SENARY_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT0 MI2S Playback", - .aif_name = "INT0_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "INT0 MI2S Capture", - .aif_name = "INT0_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT0 MI2S", - .id = MSM_INT0_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT1 MI2S Playback", - .aif_name = "INT1_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT1 MI2S Capture", - .aif_name = "INT1_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT1 MI2S", - .id = MSM_INT1_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT2 MI2S Playback", - .aif_name = "INT2_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT2 MI2S Capture", - .aif_name = "INT2_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT2 MI2S", - .id = MSM_INT2_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT3 MI2S Playback", - .aif_name = "INT3_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT3 MI2S Capture", - .aif_name = "INT3_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT3 MI2S", - .id = MSM_INT3_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT4 MI2S Playback", - .aif_name = "INT4_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 192000, - }, - .capture = { - .stream_name = "INT4 MI2S Capture", - .aif_name = "INT4_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT4 MI2S", - .id = MSM_INT4_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT5 MI2S Playback", - .aif_name = "INT5_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT5 MI2S Capture", - .aif_name = "INT5_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT5 MI2S", - .id = MSM_INT5_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, - { - .playback = { - .stream_name = "INT6 MI2S Playback", - .aif_name = "INT6_MI2S_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "INT6 MI2S Capture", - .aif_name = "INT6_MI2S_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_q6_mi2s_ops, - .name = "INT6 MI2S", - .id = MSM_INT6_MI2S, - .probe = msm_dai_q6_dai_mi2s_probe, - .remove = msm_dai_q6_dai_mi2s_remove, - }, -}; - - -static int msm_dai_q6_mi2s_get_lineconfig(u16 sd_lines, u16 *config_ptr, - unsigned int *ch_cnt) -{ - u8 num_of_sd_lines; - - num_of_sd_lines = num_of_bits_set(sd_lines); - switch (num_of_sd_lines) { - case 0: - pr_debug("%s: no line is assigned\n", __func__); - break; - case 1: - switch (sd_lines) { - case MSM_MI2S_SD0: - *config_ptr = AFE_PORT_I2S_SD0; - break; - case MSM_MI2S_SD1: - *config_ptr = AFE_PORT_I2S_SD1; - break; - case MSM_MI2S_SD2: - *config_ptr = AFE_PORT_I2S_SD2; - break; - case MSM_MI2S_SD3: - *config_ptr = AFE_PORT_I2S_SD3; - break; - case MSM_MI2S_SD4: - *config_ptr = AFE_PORT_I2S_SD4; - break; - case MSM_MI2S_SD5: - *config_ptr = AFE_PORT_I2S_SD5; - break; - case MSM_MI2S_SD6: - *config_ptr = AFE_PORT_I2S_SD6; - break; - case MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_SD7; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 2: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1: - *config_ptr = AFE_PORT_I2S_QUAD01; - break; - case MSM_MI2S_SD2 | MSM_MI2S_SD3: - *config_ptr = AFE_PORT_I2S_QUAD23; - break; - case MSM_MI2S_SD4 | MSM_MI2S_SD5: - *config_ptr = AFE_PORT_I2S_QUAD45; - break; - case MSM_MI2S_SD6 | MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_QUAD67; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 3: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2: - *config_ptr = AFE_PORT_I2S_6CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 4: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 | MSM_MI2S_SD3: - *config_ptr = AFE_PORT_I2S_8CHS; - break; - case MSM_MI2S_SD4 | MSM_MI2S_SD5 | MSM_MI2S_SD6 | MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_8CHS_2; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 5: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 - | MSM_MI2S_SD3 | MSM_MI2S_SD4: - *config_ptr = AFE_PORT_I2S_10CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 6: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 - | MSM_MI2S_SD3 | MSM_MI2S_SD4 | MSM_MI2S_SD5: - *config_ptr = AFE_PORT_I2S_12CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 7: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 | MSM_MI2S_SD3 - | MSM_MI2S_SD4 | MSM_MI2S_SD5 | MSM_MI2S_SD6: - *config_ptr = AFE_PORT_I2S_14CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - case 8: - switch (sd_lines) { - case MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 | MSM_MI2S_SD3 - | MSM_MI2S_SD4 | MSM_MI2S_SD5 | MSM_MI2S_SD6 | MSM_MI2S_SD7: - *config_ptr = AFE_PORT_I2S_16CHS; - break; - default: - pr_err("%s: invalid SD lines %d\n", - __func__, sd_lines); - goto error_invalid_data; - } - break; - default: - pr_err("%s: invalid SD lines %d\n", __func__, num_of_sd_lines); - goto error_invalid_data; - } - *ch_cnt = num_of_sd_lines; - return 0; - -error_invalid_data: - pr_err("%s: invalid data\n", __func__); - return -EINVAL; -} - -static int msm_dai_q6_mi2s_platform_data_validation( - struct platform_device *pdev, struct snd_soc_dai_driver *dai_driver) -{ - struct msm_dai_q6_mi2s_dai_data *dai_data = dev_get_drvdata(&pdev->dev); - struct msm_mi2s_pdata *mi2s_pdata = - (struct msm_mi2s_pdata *) pdev->dev.platform_data; - unsigned int ch_cnt; - int rc = 0; - u16 sd_line; - - if (mi2s_pdata == NULL) { - pr_err("%s: mi2s_pdata NULL", __func__); - return -EINVAL; - } - - rc = msm_dai_q6_mi2s_get_lineconfig(mi2s_pdata->rx_sd_lines, - &sd_line, &ch_cnt); - if (rc < 0) { - dev_err(&pdev->dev, "invalid MI2S RX sd line config\n"); - goto rtn; - } - - if (ch_cnt) { - dai_data->rx_dai.mi2s_dai_data.port_config.i2s.channel_mode = - sd_line; - dai_data->rx_dai.pdata_mi2s_lines = sd_line; - dai_driver->playback.channels_min = 1; - dai_driver->playback.channels_max = ch_cnt << 1; - } else { - dai_driver->playback.channels_min = 0; - dai_driver->playback.channels_max = 0; - } - rc = msm_dai_q6_mi2s_get_lineconfig(mi2s_pdata->tx_sd_lines, - &sd_line, &ch_cnt); - if (rc < 0) { - dev_err(&pdev->dev, "invalid MI2S TX sd line config\n"); - goto rtn; - } - - if (ch_cnt) { - dai_data->tx_dai.mi2s_dai_data.port_config.i2s.channel_mode = - sd_line; - dai_data->tx_dai.pdata_mi2s_lines = sd_line; - dai_driver->capture.channels_min = 1; - dai_driver->capture.channels_max = ch_cnt << 1; - } else { - dai_driver->capture.channels_min = 0; - dai_driver->capture.channels_max = 0; - } - - dev_dbg(&pdev->dev, "%s: playback sdline 0x%x capture sdline 0x%x\n", - __func__, dai_data->rx_dai.pdata_mi2s_lines, - dai_data->tx_dai.pdata_mi2s_lines); - dev_dbg(&pdev->dev, "%s: playback ch_max %d capture ch_mx %d\n", - __func__, dai_driver->playback.channels_max, - dai_driver->capture.channels_max); -rtn: - return rc; -} - -static const struct snd_soc_component_driver msm_q6_mi2s_dai_component = { - .name = "msm-dai-q6-mi2s", -}; -static int msm_dai_q6_mi2s_dev_probe(struct platform_device *pdev) -{ - struct msm_dai_q6_mi2s_dai_data *dai_data; - const char *q6_mi2s_dev_id = "qcom,msm-dai-q6-mi2s-dev-id"; - u32 tx_line = 0; - u32 rx_line = 0; - u32 mi2s_intf = 0; - struct msm_mi2s_pdata *mi2s_pdata; - int rc; - - rc = of_property_read_u32(pdev->dev.of_node, q6_mi2s_dev_id, - &mi2s_intf); - if (rc) { - dev_err(&pdev->dev, - "%s: missing 0x%x in dt node\n", __func__, mi2s_intf); - goto rtn; - } - - dev_dbg(&pdev->dev, "dev name %s dev id 0x%x\n", dev_name(&pdev->dev), - mi2s_intf); - - if ((mi2s_intf < MSM_MI2S_MIN || mi2s_intf > MSM_MI2S_MAX) - || (mi2s_intf >= ARRAY_SIZE(msm_dai_q6_mi2s_dai))) { - dev_err(&pdev->dev, - "%s: Invalid MI2S ID %u from Device Tree\n", - __func__, mi2s_intf); - rc = -ENXIO; - goto rtn; - } - - pdev->id = mi2s_intf; - - mi2s_pdata = kzalloc(sizeof(struct msm_mi2s_pdata), GFP_KERNEL); - if (!mi2s_pdata) { - rc = -ENOMEM; - goto rtn; - } - - rc = of_property_read_u32(pdev->dev.of_node, "qcom,msm-mi2s-rx-lines", - &rx_line); - if (rc) { - dev_err(&pdev->dev, "%s: Rx line from DT file %s\n", __func__, - "qcom,msm-mi2s-rx-lines"); - goto free_pdata; - } - - rc = of_property_read_u32(pdev->dev.of_node, "qcom,msm-mi2s-tx-lines", - &tx_line); - if (rc) { - dev_err(&pdev->dev, "%s: Tx line from DT file %s\n", __func__, - "qcom,msm-mi2s-tx-lines"); - goto free_pdata; - } - dev_dbg(&pdev->dev, "dev name %s Rx line 0x%x , Tx ine 0x%x\n", - dev_name(&pdev->dev), rx_line, tx_line); - mi2s_pdata->rx_sd_lines = rx_line; - mi2s_pdata->tx_sd_lines = tx_line; - mi2s_pdata->intf_id = mi2s_intf; - - dai_data = kzalloc(sizeof(struct msm_dai_q6_mi2s_dai_data), - GFP_KERNEL); - if (!dai_data) { - rc = -ENOMEM; - goto free_pdata; - } else - dev_set_drvdata(&pdev->dev, dai_data); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - pdev->dev.platform_data = mi2s_pdata; - - rc = msm_dai_q6_mi2s_platform_data_validation(pdev, - &msm_dai_q6_mi2s_dai[mi2s_intf]); - if (rc < 0) - goto free_dai_data; - - rc = snd_soc_register_component(&pdev->dev, &msm_q6_mi2s_dai_component, - &msm_dai_q6_mi2s_dai[mi2s_intf], 1); - if (rc < 0) - goto err_register; - return 0; - -err_register: - dev_err(&pdev->dev, "fail to msm_dai_q6_mi2s_dev_probe\n"); -free_dai_data: - kfree(dai_data); -free_pdata: - kfree(mi2s_pdata); -rtn: - return rc; -} - -static int msm_dai_q6_mi2s_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct snd_soc_component_driver msm_dai_q6_component = { - .name = "msm-dai-q6-dev", -}; - -static int msm_dai_q6_dev_probe(struct platform_device *pdev) -{ - int rc, id, i, len; - const char *q6_dev_id = "qcom,msm-dai-q6-dev-id"; - char stream_name[80]; - - rc = of_property_read_u32(pdev->dev.of_node, q6_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, q6_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (id) { - case SLIMBUS_0_RX: - strlcpy(stream_name, "Slimbus Playback", 80); - goto register_slim_playback; - case SLIMBUS_2_RX: - strlcpy(stream_name, "Slimbus2 Playback", 80); - goto register_slim_playback; - case SLIMBUS_1_RX: - strlcpy(stream_name, "Slimbus1 Playback", 80); - goto register_slim_playback; - case SLIMBUS_3_RX: - strlcpy(stream_name, "Slimbus3 Playback", 80); - goto register_slim_playback; - case SLIMBUS_4_RX: - strlcpy(stream_name, "Slimbus4 Playback", 80); - goto register_slim_playback; - case SLIMBUS_5_RX: - strlcpy(stream_name, "Slimbus5 Playback", 80); - goto register_slim_playback; - case SLIMBUS_6_RX: - strlcpy(stream_name, "Slimbus6 Playback", 80); - goto register_slim_playback; - case SLIMBUS_7_RX: - strlcpy(stream_name, "Slimbus7 Playback", sizeof(stream_name)); - goto register_slim_playback; - case SLIMBUS_8_RX: - strlcpy(stream_name, "Slimbus8 Playback", sizeof(stream_name)); - goto register_slim_playback; - case SLIMBUS_9_RX: - strlcpy(stream_name, "Slimbus9 Playback", sizeof(stream_name)); - goto register_slim_playback; -register_slim_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_slimbus_rx_dai); i++) { - if (msm_dai_q6_slimbus_rx_dai[i].playback.stream_name && - !strcmp(stream_name, - msm_dai_q6_slimbus_rx_dai[i] - .playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_slimbus_rx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case SLIMBUS_0_TX: - strlcpy(stream_name, "Slimbus Capture", 80); - goto register_slim_capture; - case SLIMBUS_1_TX: - strlcpy(stream_name, "Slimbus1 Capture", 80); - goto register_slim_capture; - case SLIMBUS_2_TX: - strlcpy(stream_name, "Slimbus2 Capture", 80); - goto register_slim_capture; - case SLIMBUS_3_TX: - strlcpy(stream_name, "Slimbus3 Capture", 80); - goto register_slim_capture; - case SLIMBUS_4_TX: - strlcpy(stream_name, "Slimbus4 Capture", 80); - goto register_slim_capture; - case SLIMBUS_5_TX: - strlcpy(stream_name, "Slimbus5 Capture", 80); - goto register_slim_capture; - case SLIMBUS_6_TX: - strlcpy(stream_name, "Slimbus6 Capture", 80); - goto register_slim_capture; - case SLIMBUS_7_TX: - strlcpy(stream_name, "Slimbus7 Capture", sizeof(stream_name)); - goto register_slim_capture; - case SLIMBUS_8_TX: - strlcpy(stream_name, "Slimbus8 Capture", sizeof(stream_name)); - goto register_slim_capture; - case SLIMBUS_9_TX: - strlcpy(stream_name, "Slimbus9 Capture", sizeof(stream_name)); - goto register_slim_capture; -register_slim_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_slimbus_tx_dai); i++) { - if (msm_dai_q6_slimbus_tx_dai[i].capture.stream_name && - !strcmp(stream_name, - msm_dai_q6_slimbus_tx_dai[i] - .capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_slimbus_tx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case INT_BT_SCO_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_sco_rx_dai, 1); - break; - case INT_BT_SCO_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_sco_tx_dai, 1); - break; - case INT_BT_A2DP_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_bt_a2dp_rx_dai, 1); - break; - case INT_FM_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_fm_rx_dai, 1); - break; - case INT_FM_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_fm_tx_dai, 1); - break; - case AFE_PORT_ID_USB_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_usb_rx_dai, 1); - break; - case AFE_PORT_ID_USB_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_usb_tx_dai, 1); - break; - case RT_PROXY_DAI_001_RX: - strlcpy(stream_name, "AFE Playback", 80); - goto register_afe_playback; - case RT_PROXY_DAI_002_RX: - strlcpy(stream_name, "AFE-PROXY RX", 80); -register_afe_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_afe_rx_dai); i++) { - if (msm_dai_q6_afe_rx_dai[i].playback.stream_name && - !strcmp(stream_name, - msm_dai_q6_afe_rx_dai[i].playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_rx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case RT_PROXY_DAI_001_TX: - strlcpy(stream_name, "AFE-PROXY TX", 80); - goto register_afe_capture; - case RT_PROXY_DAI_002_TX: - strlcpy(stream_name, "AFE Capture", 80); -register_afe_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_afe_tx_dai); i++) { - if (msm_dai_q6_afe_tx_dai[i].capture.stream_name && - !strcmp(stream_name, - msm_dai_q6_afe_tx_dai[i].capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_afe_tx_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case VOICE_PLAYBACK_TX: - strlcpy(stream_name, "Voice Farend Playback", 80); - goto register_voice_playback; - case VOICE2_PLAYBACK_TX: - strlcpy(stream_name, "Voice2 Farend Playback", 80); -register_voice_playback: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_voc_playback_dai); i++) { - if (msm_dai_q6_voc_playback_dai[i].playback.stream_name - && !strcmp(stream_name, - msm_dai_q6_voc_playback_dai[i].playback.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_voc_playback_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s Device not found stream name %s\n", - __func__, stream_name); - break; - case VOICE_RECORD_RX: - strlcpy(stream_name, "Voice Downlink Capture", 80); - goto register_uplink_capture; - case VOICE_RECORD_TX: - strlcpy(stream_name, "Voice Uplink Capture", 80); -register_uplink_capture: - rc = -ENODEV; - len = strnlen(stream_name, 80); - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_incall_record_dai); i++) { - if (msm_dai_q6_incall_record_dai[i].capture.stream_name - && !strcmp(stream_name, - msm_dai_q6_incall_record_dai[i]. - capture.stream_name)) { - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, - &msm_dai_q6_incall_record_dai[i], 1); - break; - } - } - if (rc) - pr_err("%s: Device not found stream name %s\n", - __func__, stream_name); - break; - case RT_PROXY_PORT_002_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_proxy_rx_dai, 1); - break; - case RT_PROXY_PORT_002_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_q6_component, &msm_dai_q6_proxy_tx_dai, 1); - break; - default: - rc = -ENODEV; - break; - } - - return rc; -} - -static int msm_dai_q6_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-q6-dev", }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_dev_dt_match); - -static struct platform_driver msm_dai_q6_dev = { - .probe = msm_dai_q6_dev_probe, - .remove = msm_dai_q6_dev_remove, - .driver = { - .name = "msm-dai-q6-dev", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_dev_dt_match, - .probe_type = PROBE_FORCE_SYNCHRONOUS, - }, -}; - -static int msm_dai_q6_probe(struct platform_device *pdev) -{ - int rc; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - - return rc; -} - -static int msm_dai_q6_remove(struct platform_device *pdev) -{ - of_platform_depopulate(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_dt_match[] = { - { .compatible = "qcom,msm-dai-q6", }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_dt_match); -static struct platform_driver msm_dai_q6 = { - .probe = msm_dai_q6_probe, - .remove = msm_dai_q6_remove, - .driver = { - .name = "msm-dai-q6", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_dt_match, - .probe_type = PROBE_FORCE_SYNCHRONOUS, - }, -}; - -static int msm_dai_mi2s_q6_probe(struct platform_device *pdev) -{ - int rc; - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - return rc; -} - -static int msm_dai_mi2s_q6_remove(struct platform_device *pdev) -{ - return 0; -} - -static const struct of_device_id msm_dai_mi2s_dt_match[] = { - { .compatible = "qcom,msm-dai-mi2s", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_mi2s_dt_match); - -static struct platform_driver msm_dai_mi2s_q6 = { - .probe = msm_dai_mi2s_q6_probe, - .remove = msm_dai_mi2s_q6_remove, - .driver = { - .name = "msm-dai-mi2s", - .owner = THIS_MODULE, - .of_match_table = msm_dai_mi2s_dt_match, - }, -}; - -static const struct of_device_id msm_dai_q6_mi2s_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-q6-mi2s", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_q6_mi2s_dev_dt_match); - -static struct platform_driver msm_dai_q6_mi2s_driver = { - .probe = msm_dai_q6_mi2s_dev_probe, - .remove = msm_dai_q6_mi2s_dev_remove, - .driver = { - .name = "msm-dai-q6-mi2s", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_mi2s_dev_dt_match, - }, -}; - -static int msm_dai_q6_spdif_dev_probe(struct platform_device *pdev) -{ - int rc, id; - const char *q6_dev_id = "qcom,msm-dai-q6-dev-id"; - - rc = of_property_read_u32(pdev->dev.of_node, q6_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, q6_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (pdev->id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_rx_dai[0], 1); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_rx_dai[1], 1); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_tx_dai[0], 1); - break; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_spdif_q6_component, - &msm_dai_q6_spdif_spdif_tx_dai[1], 1); - break; - default: - dev_err(&pdev->dev, "invalid device ID %d\n", pdev->id); - rc = -ENODEV; - break; - } - - return rc; -} - -static int msm_dai_q6_spdif_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_spdif_dt_match[] = { - {.compatible = "qcom,msm-dai-q6-spdif"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_dai_q6_spdif_dt_match); - -static struct platform_driver msm_dai_q6_spdif_driver = { - .probe = msm_dai_q6_spdif_dev_probe, - .remove = msm_dai_q6_spdif_dev_remove, - .driver = { - .name = "msm-dai-q6-spdif", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_spdif_dt_match, - }, -}; - -static int msm_dai_q6_tdm_set_clk_param(u32 group_id, - struct afe_clk_set *clk_set, u32 mode) -{ - switch (group_id) { - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_PRI_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT; - break; - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX: - if (mode) - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT; - else - clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT; - break; - default: - return -EINVAL; - } - return 0; -} - -static int msm_dai_tdm_q6_probe(struct platform_device *pdev) -{ - int rc = 0; - const uint32_t *port_id_array = NULL; - uint32_t array_length = 0; - int i = 0; - int group_idx = 0; - u32 clk_mode = 0; - - /* extract tdm group info into static */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-group-id", - (u32 *)&tdm_group_cfg.group_id); - if (rc) { - dev_err(&pdev->dev, "%s: Group ID from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-group-id"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Group ID from DT file 0x%x\n", - __func__, tdm_group_cfg.group_id); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-group-num-ports", - &num_tdm_group_ports); - if (rc) { - dev_err(&pdev->dev, "%s: Group Num Ports from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-group-num-ports"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Group Num Ports from DT file 0x%x\n", - __func__, num_tdm_group_ports); - - if (num_tdm_group_ports > AFE_GROUP_DEVICE_NUM_PORTS) { - dev_err(&pdev->dev, "%s Group Num Ports %d greater than Max %d\n", - __func__, num_tdm_group_ports, - AFE_GROUP_DEVICE_NUM_PORTS); - rc = -EINVAL; - goto rtn; - } - - port_id_array = of_get_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-group-port-id", - &array_length); - if (port_id_array == NULL) { - dev_err(&pdev->dev, "%s port_id_array is not valid\n", - __func__); - rc = -EINVAL; - goto rtn; - } - if (array_length != sizeof(uint32_t) * num_tdm_group_ports) { - dev_err(&pdev->dev, "%s array_length is %d, expected is %zd\n", - __func__, array_length, - sizeof(uint32_t) * num_tdm_group_ports); - rc = -EINVAL; - goto rtn; - } - - for (i = 0; i < num_tdm_group_ports; i++) - tdm_group_cfg.port_id[i] = - (u16)be32_to_cpu(port_id_array[i]); - /* Unused index should be filled with 0 or AFE_PORT_INVALID */ - for (i = num_tdm_group_ports; i < AFE_GROUP_DEVICE_NUM_PORTS; i++) - tdm_group_cfg.port_id[i] = - AFE_PORT_INVALID; - - /* extract tdm clk info into static */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-rate", - &tdm_clk_set.clk_freq_in_hz); - if (rc) { - dev_err(&pdev->dev, "%s: Clk Rate from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-clk-rate"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Clk Rate from DT file %d\n", - __func__, tdm_clk_set.clk_freq_in_hz); - - /* initialize static tdm clk attribute to default value */ - tdm_clk_set.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO; - - /* extract tdm clk attribute into static */ - if (of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-attribute", NULL)) { - rc = of_property_read_u16(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-attribute", - &tdm_clk_set.clk_attri); - if (rc) { - dev_err(&pdev->dev, "%s: value for clk attribute not found %s\n", - __func__, "qcom,msm-cpudai-tdm-clk-attribute"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: clk attribute from DT file %d\n", - __func__, tdm_clk_set.clk_attri); - } else - dev_dbg(&pdev->dev, "%s: clk attribute not found\n", __func__); - - /* extract tdm clk src master/slave info into static */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-clk-internal", - &clk_mode); - if (rc) { - dev_err(&pdev->dev, "%s: Clk id from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-clk-internal"); - goto rtn; - } - dev_dbg(&pdev->dev, "%s: Clk id from DT file %d\n", - __func__, clk_mode); - - rc = msm_dai_q6_tdm_set_clk_param(tdm_group_cfg.group_id, - &tdm_clk_set, clk_mode); - if (rc) { - dev_err(&pdev->dev, "%s: group id not supported 0x%x\n", - __func__, tdm_group_cfg.group_id); - goto rtn; - } - - /* other initializations within device group */ - group_idx = msm_dai_q6_get_group_idx(tdm_group_cfg.group_id); - if (group_idx < 0) { - dev_err(&pdev->dev, "%s: group id 0x%x not supported\n", - __func__, tdm_group_cfg.group_id); - rc = -EINVAL; - goto rtn; - } - atomic_set(&tdm_group_ref[group_idx], 0); - - /* probe child node info */ - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - goto rtn; - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - -rtn: - return rc; -} - -static int msm_dai_tdm_q6_remove(struct platform_device *pdev) -{ - return 0; -} - -static const struct of_device_id msm_dai_tdm_dt_match[] = { - { .compatible = "qcom,msm-dai-tdm", }, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_dai_tdm_dt_match); - -static struct platform_driver msm_dai_tdm_q6 = { - .probe = msm_dai_tdm_q6_probe, - .remove = msm_dai_tdm_q6_remove, - .driver = { - .name = "msm-dai-tdm", - .owner = THIS_MODULE, - .of_match_table = msm_dai_tdm_dt_match, - .probe_type = PROBE_FORCE_SYNCHRONOUS, - }, -}; - -static int msm_dai_q6_tdm_data_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - switch (value) { - case 0: - dai_data->port_cfg.tdm.data_format = AFE_LINEAR_PCM_DATA; - break; - case 1: - dai_data->port_cfg.tdm.data_format = AFE_NON_LINEAR_DATA; - break; - case 2: - dai_data->port_cfg.tdm.data_format = AFE_GENERIC_COMPRESSED; - break; - default: - pr_err("%s: data_format invalid\n", __func__); - break; - } - pr_debug("%s: data_format = %d\n", - __func__, dai_data->port_cfg.tdm.data_format); - return 0; -} - -static int msm_dai_q6_tdm_data_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_cfg.tdm.data_format; - pr_debug("%s: data_format = %d\n", - __func__, dai_data->port_cfg.tdm.data_format); - return 0; -} - -static int msm_dai_q6_tdm_header_type_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_cfg.custom_tdm_header.header_type = value; - pr_debug("%s: header_type = %d\n", - __func__, - dai_data->port_cfg.custom_tdm_header.header_type); - return 0; -} - -static int msm_dai_q6_tdm_header_type_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_cfg.custom_tdm_header.header_type; - pr_debug("%s: header_type = %d\n", - __func__, - dai_data->port_cfg.custom_tdm_header.header_type); - return 0; -} - -static int msm_dai_q6_tdm_header_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int i = 0; - - for (i = 0; i < AFE_CUSTOM_TDM_HEADER_MAX_CNT; i++) { - dai_data->port_cfg.custom_tdm_header.header[i] = - (u16)ucontrol->value.integer.value[i]; - pr_debug("%s: header #%d = 0x%x\n", - __func__, i, - dai_data->port_cfg.custom_tdm_header.header[i]); - } - return 0; -} - -static int msm_dai_q6_tdm_header_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data; - int i = 0; - - for (i = 0; i < AFE_CUSTOM_TDM_HEADER_MAX_CNT; i++) { - ucontrol->value.integer.value[i] = - dai_data->port_cfg.custom_tdm_header.header[i]; - pr_debug("%s: header #%d = 0x%x\n", - __func__, i, - dai_data->port_cfg.custom_tdm_header.header[i]); - } - return 0; -} - -static const struct snd_kcontrol_new tdm_config_controls_data_format[] = { - SOC_ENUM_EXT("PRI_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_4 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_5 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_6 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_7 Data Format", tdm_config_enum[0], - msm_dai_q6_tdm_data_format_get, - msm_dai_q6_tdm_data_format_put), -}; - -static const struct snd_kcontrol_new tdm_config_controls_header_type[] = { - SOC_ENUM_EXT("PRI_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("PRI_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("SEC_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("TERT_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUAT_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_RX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_4 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_5 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_6 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), - SOC_ENUM_EXT("QUIN_TDM_TX_7 Header Type", tdm_config_enum[1], - msm_dai_q6_tdm_header_type_get, - msm_dai_q6_tdm_header_type_put), -}; - -static const struct snd_kcontrol_new tdm_config_controls_header[] = { - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_0 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_1 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_2 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_3 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_4 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_5 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_6 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_7 Header", - SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8, - msm_dai_q6_tdm_header_get, - msm_dai_q6_tdm_header_put), -}; - -static int msm_dai_q6_tdm_set_clk( - struct msm_dai_q6_tdm_dai_data *dai_data, - u16 port_id, bool enable) -{ - int rc = 0; - - dai_data->clk_set.enable = enable; - - rc = afe_set_lpass_clock_v2(port_id, - &dai_data->clk_set); - if (rc < 0) - pr_err("%s: afe lpass clock failed, err:%d\n", - __func__, rc); - - return rc; -} - -static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *tdm_dai_data = NULL; - struct snd_kcontrol *data_format_kcontrol = NULL; - struct snd_kcontrol *header_type_kcontrol = NULL; - struct snd_kcontrol *header_kcontrol = NULL; - int port_idx = 0; - const struct snd_kcontrol_new *data_format_ctrl = NULL; - const struct snd_kcontrol_new *header_type_ctrl = NULL; - const struct snd_kcontrol_new *header_ctrl = NULL; - - tdm_dai_data = dev_get_drvdata(dai->dev); - - msm_dai_q6_set_dai_id(dai); - - port_idx = msm_dai_q6_get_port_idx(dai->id); - if (port_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - rc = -EINVAL; - goto rtn; - } - - data_format_ctrl = - &tdm_config_controls_data_format[port_idx]; - header_type_ctrl = - &tdm_config_controls_header_type[port_idx]; - header_ctrl = - &tdm_config_controls_header[port_idx]; - - if (data_format_ctrl) { - data_format_kcontrol = snd_ctl_new1(data_format_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - data_format_kcontrol); - if (rc < 0) { - dev_err(dai->dev, "%s: err add data format ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (header_type_ctrl) { - header_type_kcontrol = snd_ctl_new1(header_type_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - header_type_kcontrol); - if (rc < 0) { - if (data_format_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - data_format_kcontrol); - dev_err(dai->dev, "%s: err add header type ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (header_ctrl) { - header_kcontrol = snd_ctl_new1(header_ctrl, - tdm_dai_data); - rc = snd_ctl_add(dai->component->card->snd_card, - header_kcontrol); - if (rc < 0) { - if (header_type_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - header_type_kcontrol); - if (data_format_kcontrol) - snd_ctl_remove(dai->component->card->snd_card, - data_format_kcontrol); - dev_err(dai->dev, "%s: err add header ctrl DAI = %s\n", - __func__, dai->name); - goto rtn; - } - } - - if (tdm_dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, - dai->id, (void *)tdm_dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - -rtn: - return rc; -} - - -static int msm_dai_q6_dai_tdm_remove(struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *tdm_dai_data = - dev_get_drvdata(dai->dev); - u16 group_id = tdm_dai_data->group_cfg.tdm_cfg.group_id; - int group_idx = 0; - atomic_t *group_ref = NULL; - - group_idx = msm_dai_q6_get_group_idx(dai->id); - if (group_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - return -EINVAL; - } - - group_ref = &tdm_group_ref[group_idx]; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, tdm_dai_data->status_mask)) { - rc = afe_close(dai->id); /* can block */ - if (rc < 0) { - dev_err(dai->dev, "%s: fail to close AFE port 0x%x\n", - __func__, dai->id); - } - atomic_dec(group_ref); - clear_bit(STATUS_PORT_STARTED, - tdm_dai_data->status_mask); - - if (atomic_read(group_ref) == 0) { - rc = afe_port_group_enable(group_id, - NULL, false); - if (rc < 0) { - dev_err(dai->dev, "fail to disable AFE group 0x%x\n", - group_id); - } - } - - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - rc = msm_dai_q6_tdm_set_clk(tdm_dai_data, - dai->id, false); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE clk 0x%x\n", - __func__, dai->id); - } - } - } - - return 0; -} - -static int msm_dai_q6_tdm_set_tdm_slot(struct snd_soc_dai *dai, - unsigned int tx_mask, - unsigned int rx_mask, - int slots, int slot_width) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - struct afe_param_id_group_device_tdm_cfg *tdm_group = - &dai_data->group_cfg.tdm_cfg; - unsigned int cap_mask; - - dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); - - /* HW only supports 16 and 32 bit slot width configuration */ - if ((slot_width != 16) && (slot_width != 32)) { - dev_err(dai->dev, "%s: invalid slot_width %d\n", - __func__, slot_width); - return -EINVAL; - } - - /* HW supports 1-32 slots configuration. Typical: 1, 2, 4, 8, 16, 32 */ - switch (slots) { - case 1: - cap_mask = 0x01; - break; - case 2: - cap_mask = 0x03; - break; - case 4: - cap_mask = 0x0F; - break; - case 8: - cap_mask = 0xFF; - break; - case 16: - cap_mask = 0xFFFF; - break; - default: - dev_err(dai->dev, "%s: invalid slots %d\n", - __func__, slots); - return -EINVAL; - } - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - tdm_group->nslots_per_frame = slots; - tdm_group->slot_width = slot_width; - tdm_group->slot_mask = rx_mask & cap_mask; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - tdm_group->nslots_per_frame = slots; - tdm_group->slot_width = slot_width; - tdm_group->slot_mask = tx_mask & cap_mask; - break; - default: - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - - return rc; -} - -static int msm_dai_q6_tdm_set_sysclk(struct snd_soc_dai *dai, - int clk_id, unsigned int freq, int dir) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - if ((dai->id >= AFE_PORT_ID_PRIMARY_TDM_RX) && - (dai->id <= AFE_PORT_ID_QUINARY_TDM_TX_7)) { - dai_data->clk_set.clk_freq_in_hz = freq; - } else { - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - - dev_dbg(dai->dev, "%s: dai id = 0x%x, group clk_freq = %d\n", - __func__, dai->id, freq); - return 0; -} - -static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - struct afe_param_id_slot_mapping_cfg *slot_mapping = - &dai_data->port_cfg.slot_mapping; - int i = 0; - - dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); - - switch (dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - if (!rx_slot) { - dev_err(dai->dev, "%s: rx slot not found\n", __func__); - return -EINVAL; - } - if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid rx num %d\n", __func__, - rx_num); - return -EINVAL; - } - - for (i = 0; i < rx_num; i++) - slot_mapping->offset[i] = rx_slot[i]; - for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++) - slot_mapping->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping->num_channel = rx_num; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - if (!tx_slot) { - dev_err(dai->dev, "%s: tx slot not found\n", __func__); - return -EINVAL; - } - if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid tx num %d\n", __func__, - tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) - slot_mapping->offset[i] = tx_slot[i]; - for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++) - slot_mapping->offset[i] = - AFE_SLOT_MAPPING_OFFSET_INVALID; - - slot_mapping->num_channel = tx_num; - break; - default: - dev_err(dai->dev, "%s: invalid dai id 0x%x\n", - __func__, dai->id); - return -EINVAL; - } - - return rc; -} - -static unsigned int tdm_param_set_slot_mask(u16 *slot_offset, int slot_width, - int slots_per_frame) -{ - unsigned int i = 0; - unsigned int slot_index = 0; - unsigned long slot_mask = 0; - unsigned int slot_width_bytes = slot_width / 8; - - for (i = 0; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++) { - if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID) { - slot_index = slot_offset[i] / slot_width_bytes; - if (slot_index < slots_per_frame) - set_bit(slot_index, &slot_mask); - else { - pr_err("%s: invalid slot map setting\n", - __func__); - return 0; - } - } else - break; - } - - return slot_mask; -} - -static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - struct afe_param_id_group_device_tdm_cfg *tdm_group = - &dai_data->group_cfg.tdm_cfg; - struct afe_param_id_tdm_cfg *tdm = - &dai_data->port_cfg.tdm; - struct afe_param_id_slot_mapping_cfg *slot_mapping = - &dai_data->port_cfg.slot_mapping; - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header = - &dai_data->port_cfg.custom_tdm_header; - - pr_debug("%s: dev_name: %s\n", - __func__, dev_name(dai->dev)); - - if ((params_channels(params) == 0) || - (params_channels(params) > 8)) { - dev_err(dai->dev, "%s: invalid param channels %d\n", - __func__, params_channels(params)); - return -EINVAL; - } - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->bitwidth = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->bitwidth = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->bitwidth = 32; - break; - default: - dev_err(dai->dev, "%s: invalid param format 0x%x\n", - __func__, params_format(params)); - return -EINVAL; - } - dai_data->channels = params_channels(params); - dai_data->rate = params_rate(params); - - /* - * update tdm group config param - * NOTE: group config is set to the same as slot config. - */ - tdm_group->bit_width = tdm_group->slot_width; - tdm_group->num_channels = tdm_group->nslots_per_frame; - tdm_group->sample_rate = dai_data->rate; - - pr_debug("%s: TDM GROUP:\n" - "num_channels=%d sample_rate=%d bit_width=%d\n" - "nslots_per_frame=%d slot_width=%d slot_mask=0x%x\n", - __func__, - tdm_group->num_channels, - tdm_group->sample_rate, - tdm_group->bit_width, - tdm_group->nslots_per_frame, - tdm_group->slot_width, - tdm_group->slot_mask); - pr_debug("%s: TDM GROUP:\n" - "port_id[0]=0x%x port_id[1]=0x%x port_id[2]=0x%x port_id[3]=0x%x\n" - "port_id[4]=0x%x port_id[5]=0x%x port_id[6]=0x%x port_id[7]=0x%x\n", - __func__, - tdm_group->port_id[0], - tdm_group->port_id[1], - tdm_group->port_id[2], - tdm_group->port_id[3], - tdm_group->port_id[4], - tdm_group->port_id[5], - tdm_group->port_id[6], - tdm_group->port_id[7]); - - /* - * update tdm config param - * NOTE: channels/rate/bitwidth are per stream property - */ - tdm->num_channels = dai_data->channels; - tdm->sample_rate = dai_data->rate; - tdm->bit_width = dai_data->bitwidth; - /* - * port slot config is the same as group slot config - * port slot mask should be set according to offset - */ - tdm->nslots_per_frame = tdm_group->nslots_per_frame; - tdm->slot_width = tdm_group->slot_width; - tdm->slot_mask = tdm_param_set_slot_mask(slot_mapping->offset, - tdm_group->slot_width, - tdm_group->nslots_per_frame); - - pr_debug("%s: TDM:\n" - "num_channels=%d sample_rate=%d bit_width=%d\n" - "nslots_per_frame=%d slot_width=%d slot_mask=0x%x\n" - "data_format=0x%x sync_mode=0x%x sync_src=0x%x\n" - "data_out=0x%x invert_sync=0x%x data_delay=0x%x\n", - __func__, - tdm->num_channels, - tdm->sample_rate, - tdm->bit_width, - tdm->nslots_per_frame, - tdm->slot_width, - tdm->slot_mask, - tdm->data_format, - tdm->sync_mode, - tdm->sync_src, - tdm->ctrl_data_out_enable, - tdm->ctrl_invert_sync_pulse, - tdm->ctrl_sync_data_delay); - - /* - * update slot mapping config param - * NOTE: channels/rate/bitwidth are per stream property - */ - slot_mapping->bitwidth = dai_data->bitwidth; - - pr_debug("%s: SLOT MAPPING:\n" - "num_channel=%d bitwidth=%d data_align=0x%x\n", - __func__, - slot_mapping->num_channel, - slot_mapping->bitwidth, - slot_mapping->data_align_type); - pr_debug("%s: SLOT MAPPING:\n" - "offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n" - "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n", - __func__, - slot_mapping->offset[0], - slot_mapping->offset[1], - slot_mapping->offset[2], - slot_mapping->offset[3], - slot_mapping->offset[4], - slot_mapping->offset[5], - slot_mapping->offset[6], - slot_mapping->offset[7]); - - /* - * update custom header config param - * NOTE: channels/rate/bitwidth are per playback stream property. - * custom tdm header only applicable to playback stream. - */ - if (custom_tdm_header->header_type != - AFE_CUSTOM_TDM_HEADER_TYPE_INVALID) { - pr_debug("%s: CUSTOM TDM HEADER:\n" - "start_offset=0x%x header_width=%d\n" - "num_frame_repeat=%d header_type=0x%x\n", - __func__, - custom_tdm_header->start_offset, - custom_tdm_header->header_width, - custom_tdm_header->num_frame_repeat, - custom_tdm_header->header_type); - pr_debug("%s: CUSTOM TDM HEADER:\n" - "header[0]=0x%x header[1]=0x%x header[2]=0x%x header[3]=0x%x\n" - "header[4]=0x%x header[5]=0x%x header[6]=0x%x header[7]=0x%x\n", - __func__, - custom_tdm_header->header[0], - custom_tdm_header->header[1], - custom_tdm_header->header[2], - custom_tdm_header->header[3], - custom_tdm_header->header[4], - custom_tdm_header->header[5], - custom_tdm_header->header[6], - custom_tdm_header->header[7]); - } - - return 0; -} - -static int msm_dai_q6_tdm_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - u16 group_id = dai_data->group_cfg.tdm_cfg.group_id; - int group_idx = 0; - atomic_t *group_ref = NULL; - - dev_dbg(dai->dev, "%s: dev_name: %s dev_id: 0x%x group_id: 0x%x\n", - __func__, dev_name(dai->dev), dai->dev->id, group_id); - - if (dai_data->port_cfg.custom_tdm_header.minor_version == 0) - dev_dbg(dai->dev, - "%s: Custom tdm header not supported\n", __func__); - - group_idx = msm_dai_q6_get_group_idx(dai->id); - if (group_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - return -EINVAL; - } - - mutex_lock(&tdm_mutex); - - group_ref = &tdm_group_ref[group_idx]; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4) { - /* - * send island mode config. - * This should be the first configuration - */ - rc = afe_send_port_island_mode(dai->id); - if (rc) - dev_err(dai->dev, "%s: afe send island mode failed %d\n", - __func__, rc); - } - - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - /* TX and RX share the same clk. So enable the clk - * per TDM interface. */ - rc = msm_dai_q6_tdm_set_clk(dai_data, - dai->id, true); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to enable AFE clk 0x%x\n", - __func__, dai->id); - goto rtn; - } - } - - /* PORT START should be set if prepare called - * in active state. - */ - if (atomic_read(group_ref) == 0) { - /* - * if only one port, don't do group enable as there - * is no group need for only one port - */ - if (dai_data->num_group_ports > 1) { - rc = afe_port_group_enable(group_id, - &dai_data->group_cfg, true); - if (rc < 0) { - dev_err(dai->dev, - "%s: fail to enable AFE group 0x%x\n", - __func__, group_id); - goto rtn; - } - } - } - - rc = afe_tdm_port_start(dai->id, &dai_data->port_cfg, - dai_data->rate, dai_data->num_group_ports); - if (rc < 0) { - if (atomic_read(group_ref) == 0) { - afe_port_group_enable(group_id, - NULL, false); - } - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - msm_dai_q6_tdm_set_clk(dai_data, - dai->id, false); - } - dev_err(dai->dev, "%s: fail to open AFE port 0x%x\n", - __func__, dai->id); - } else { - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - atomic_inc(group_ref); - } - - /* TODO: need to monitor PCM/MI2S/TDM HW status */ - /* NOTE: AFE should error out if HW resource contention */ - - } - -rtn: - mutex_unlock(&tdm_mutex); - return rc; -} - -static void msm_dai_q6_tdm_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - int rc = 0; - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(dai->dev); - u16 group_id = dai_data->group_cfg.tdm_cfg.group_id; - int group_idx = 0; - atomic_t *group_ref = NULL; - - group_idx = msm_dai_q6_get_group_idx(dai->id); - if (group_idx < 0) { - dev_err(dai->dev, "%s port id 0x%x not supported\n", - __func__, dai->id); - return; - } - - mutex_lock(&tdm_mutex); - - group_ref = &tdm_group_ref[group_idx]; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - rc = afe_close(dai->id); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to close AFE port 0x%x\n", - __func__, dai->id); - } - atomic_dec(group_ref); - clear_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - - if (atomic_read(group_ref) == 0) { - rc = afe_port_group_enable(group_id, - NULL, false); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE group 0x%x\n", - __func__, group_id); - } - } - - if (msm_dai_q6_get_tdm_clk_ref(group_idx) == 0) { - rc = msm_dai_q6_tdm_set_clk(dai_data, - dai->id, false); - if (rc < 0) { - dev_err(dai->dev, "%s: fail to disable AFE clk 0x%x\n", - __func__, dai->id); - } - } - - /* TODO: need to monitor PCM/MI2S/TDM HW status */ - /* NOTE: AFE should error out if HW resource contention */ - - } - - mutex_unlock(&tdm_mutex); -} - -static struct snd_soc_dai_ops msm_dai_q6_tdm_ops = { - .prepare = msm_dai_q6_tdm_prepare, - .hw_params = msm_dai_q6_tdm_hw_params, - .set_tdm_slot = msm_dai_q6_tdm_set_tdm_slot, - .set_channel_map = msm_dai_q6_tdm_set_channel_map, - .set_sysclk = msm_dai_q6_tdm_set_sysclk, - .shutdown = msm_dai_q6_tdm_shutdown, -}; - -static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = { - { - .playback = { - .stream_name = "Primary TDM0 Playback", - .aif_name = "PRI_TDM_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM1 Playback", - .aif_name = "PRI_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM2 Playback", - .aif_name = "PRI_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM3 Playback", - .aif_name = "PRI_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM4 Playback", - .aif_name = "PRI_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM5 Playback", - .aif_name = "PRI_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM6 Playback", - .aif_name = "PRI_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Primary TDM7 Playback", - .aif_name = "PRI_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM0 Capture", - .aif_name = "PRI_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM1 Capture", - .aif_name = "PRI_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM2 Capture", - .aif_name = "PRI_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM3 Capture", - .aif_name = "PRI_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM4 Capture", - .aif_name = "PRI_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM5 Capture", - .aif_name = "PRI_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM6 Capture", - .aif_name = "PRI_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Primary TDM7 Capture", - .aif_name = "PRI_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "PRI_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_PRIMARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM0 Playback", - .aif_name = "SEC_TDM_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM1 Playback", - .aif_name = "SEC_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM2 Playback", - .aif_name = "SEC_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM3 Playback", - .aif_name = "SEC_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM4 Playback", - .aif_name = "SEC_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM5 Playback", - .aif_name = "SEC_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM6 Playback", - .aif_name = "SEC_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Secondary TDM7 Playback", - .aif_name = "SEC_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM0 Capture", - .aif_name = "SEC_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM1 Capture", - .aif_name = "SEC_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM2 Capture", - .aif_name = "SEC_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM3 Capture", - .aif_name = "SEC_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM4 Capture", - .aif_name = "SEC_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM5 Capture", - .aif_name = "SEC_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM6 Capture", - .aif_name = "SEC_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Secondary TDM7 Capture", - .aif_name = "SEC_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "SEC_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_SECONDARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM0 Playback", - .aif_name = "TERT_TDM_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM1 Playback", - .aif_name = "TERT_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM2 Playback", - .aif_name = "TERT_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM3 Playback", - .aif_name = "TERT_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM4 Playback", - .aif_name = "TERT_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM5 Playback", - .aif_name = "TERT_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM6 Playback", - .aif_name = "TERT_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Tertiary TDM7 Playback", - .aif_name = "TERT_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM0 Capture", - .aif_name = "TERT_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM1 Capture", - .aif_name = "TERT_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM2 Capture", - .aif_name = "TERT_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM3 Capture", - .aif_name = "TERT_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM4 Capture", - .aif_name = "TERT_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM5 Capture", - .aif_name = "TERT_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM6 Capture", - .aif_name = "TERT_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Tertiary TDM7 Capture", - .aif_name = "TERT_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "TERT_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_TERTIARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM0 Playback", - .aif_name = "QUAT_TDM_RX_0", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM1 Playback", - .aif_name = "QUAT_TDM_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM2 Playback", - .aif_name = "QUAT_TDM_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM3 Playback", - .aif_name = "QUAT_TDM_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM4 Playback", - .aif_name = "QUAT_TDM_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM5 Playback", - .aif_name = "QUAT_TDM_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM6 Playback", - .aif_name = "QUAT_TDM_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quaternary TDM7 Playback", - .aif_name = "QUAT_TDM_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM0 Capture", - .aif_name = "QUAT_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM1 Capture", - .aif_name = "QUAT_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM2 Capture", - .aif_name = "QUAT_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM3 Capture", - .aif_name = "QUAT_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM4 Capture", - .aif_name = "QUAT_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM5 Capture", - .aif_name = "QUAT_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM6 Capture", - .aif_name = "QUAT_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quaternary TDM7 Capture", - .aif_name = "QUAT_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUAT_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUATERNARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM0 Playback", - .aif_name = "QUIN_TDM_RX_0", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM1 Playback", - .aif_name = "QUIN_TDM_RX_1", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM2 Playback", - .aif_name = "QUIN_TDM_RX_2", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM3 Playback", - .aif_name = "QUIN_TDM_RX_3", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM4 Playback", - .aif_name = "QUIN_TDM_RX_4", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM5 Playback", - .aif_name = "QUIN_TDM_RX_5", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM6 Playback", - .aif_name = "QUIN_TDM_RX_6", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .playback = { - .stream_name = "Quinary TDM7 Playback", - .aif_name = "QUIN_TDM_RX_7", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_RX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_RX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM0 Capture", - .aif_name = "QUIN_TDM_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_0", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM1 Capture", - .aif_name = "QUIN_TDM_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_1", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_1, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM2 Capture", - .aif_name = "QUIN_TDM_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_2", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_2, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM3 Capture", - .aif_name = "QUIN_TDM_TX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_3", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_3, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM4 Capture", - .aif_name = "QUIN_TDM_TX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_4", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_4, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM5 Capture", - .aif_name = "QUIN_TDM_TX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_5", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_5, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM6 Capture", - .aif_name = "QUIN_TDM_TX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_6", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_6, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, - { - .capture = { - .stream_name = "Quinary TDM7 Capture", - .aif_name = "QUIN_TDM_TX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 352800, - }, - .name = "QUIN_TDM_TX_7", - .ops = &msm_dai_q6_tdm_ops, - .id = AFE_PORT_ID_QUINARY_TDM_TX_7, - .probe = msm_dai_q6_dai_tdm_probe, - .remove = msm_dai_q6_dai_tdm_remove, - }, -}; - -static const struct snd_soc_component_driver msm_q6_tdm_dai_component = { - .name = "msm-dai-q6-tdm", -}; - -static int msm_dai_q6_tdm_dev_probe(struct platform_device *pdev) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = NULL; - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header = NULL; - int rc = 0; - u32 tdm_dev_id = 0; - int port_idx = 0; - struct device_node *tdm_parent_node = NULL; - - /* retrieve device/afe id */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-dev-id", - &tdm_dev_id); - if (rc) { - dev_err(&pdev->dev, "%s: Device ID missing in DT file\n", - __func__); - goto rtn; - } - if ((tdm_dev_id < AFE_PORT_ID_TDM_PORT_RANGE_START) || - (tdm_dev_id > AFE_PORT_ID_TDM_PORT_RANGE_END)) { - dev_err(&pdev->dev, "%s: Invalid TDM Device ID 0x%x in DT file\n", - __func__, tdm_dev_id); - rc = -ENXIO; - goto rtn; - } - pdev->id = tdm_dev_id; - - dai_data = kzalloc(sizeof(struct msm_dai_q6_tdm_dai_data), - GFP_KERNEL); - if (!dai_data) { - rc = -ENOMEM; - dev_err(&pdev->dev, - "%s Failed to allocate memory for tdm dai_data\n", - __func__); - goto rtn; - } - memset(dai_data, 0, sizeof(*dai_data)); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - /* TDM CFG */ - tdm_parent_node = of_get_parent(pdev->dev.of_node); - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-sync-mode", - (u32 *)&dai_data->port_cfg.tdm.sync_mode); - if (rc) { - dev_err(&pdev->dev, "%s: Sync Mode from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-sync-mode"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Sync Mode from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.sync_mode); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-sync-src", - (u32 *)&dai_data->port_cfg.tdm.sync_src); - if (rc) { - dev_err(&pdev->dev, "%s: Sync Src from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-sync-src"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Sync Src from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.sync_src); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-data-out", - (u32 *)&dai_data->port_cfg.tdm.ctrl_data_out_enable); - if (rc) { - dev_err(&pdev->dev, "%s: Data Out from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-data-out"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Data Out from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.ctrl_data_out_enable); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-invert-sync", - (u32 *)&dai_data->port_cfg.tdm.ctrl_invert_sync_pulse); - if (rc) { - dev_err(&pdev->dev, "%s: Invert Sync from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-invert-sync"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Invert Sync from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.ctrl_invert_sync_pulse); - - rc = of_property_read_u32(tdm_parent_node, - "qcom,msm-cpudai-tdm-data-delay", - (u32 *)&dai_data->port_cfg.tdm.ctrl_sync_data_delay); - if (rc) { - dev_err(&pdev->dev, "%s: Data Delay from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-data-delay"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Data Delay from DT file 0x%x\n", - __func__, dai_data->port_cfg.tdm.ctrl_sync_data_delay); - - /* TDM CFG -- set default */ - dai_data->port_cfg.tdm.data_format = AFE_LINEAR_PCM_DATA; - dai_data->port_cfg.tdm.tdm_cfg_minor_version = - AFE_API_VERSION_TDM_CONFIG; - - /* TDM SLOT MAPPING CFG */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-data-align", - &dai_data->port_cfg.slot_mapping.data_align_type); - if (rc) { - dev_err(&pdev->dev, "%s: Data Align from DT file %s\n", - __func__, - "qcom,msm-cpudai-tdm-data-align"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Data Align from DT file 0x%x\n", - __func__, dai_data->port_cfg.slot_mapping.data_align_type); - - /* TDM SLOT MAPPING CFG -- set default */ - dai_data->port_cfg.slot_mapping.minor_version = - AFE_API_VERSION_SLOT_MAPPING_CONFIG; - - /* CUSTOM TDM HEADER CFG */ - custom_tdm_header = &dai_data->port_cfg.custom_tdm_header; - if (of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-start-offset", NULL) && - of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-width", NULL) && - of_find_property(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-num-frame-repeat", NULL)) { - /* if the property exist */ - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-start-offset", - (u32 *)&custom_tdm_header->start_offset); - if (rc) { - dev_err(&pdev->dev, "%s: Header Start Offset from DT file %s\n", - __func__, - "qcom,msm-cpudai-tdm-header-start-offset"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Header Start Offset from DT file 0x%x\n", - __func__, custom_tdm_header->start_offset); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-width", - (u32 *)&custom_tdm_header->header_width); - if (rc) { - dev_err(&pdev->dev, "%s: Header Width from DT file %s\n", - __func__, "qcom,msm-cpudai-tdm-header-width"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Header Width from DT file 0x%x\n", - __func__, custom_tdm_header->header_width); - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-cpudai-tdm-header-num-frame-repeat", - (u32 *)&custom_tdm_header->num_frame_repeat); - if (rc) { - dev_err(&pdev->dev, "%s: Header Num Frame Repeat from DT file %s\n", - __func__, - "qcom,msm-cpudai-tdm-header-num-frame-repeat"); - goto free_dai_data; - } - dev_dbg(&pdev->dev, "%s: Header Num Frame Repeat from DT file 0x%x\n", - __func__, custom_tdm_header->num_frame_repeat); - - /* CUSTOM TDM HEADER CFG -- set default */ - custom_tdm_header->minor_version = - AFE_API_VERSION_CUSTOM_TDM_HEADER_CONFIG; - custom_tdm_header->header_type = - AFE_CUSTOM_TDM_HEADER_TYPE_INVALID; - } else { - /* CUSTOM TDM HEADER CFG -- set default */ - custom_tdm_header->header_type = - AFE_CUSTOM_TDM_HEADER_TYPE_INVALID; - /* proceed with probe */ - } - - /* copy static clk per parent node */ - dai_data->clk_set = tdm_clk_set; - /* copy static group cfg per parent node */ - dai_data->group_cfg.tdm_cfg = tdm_group_cfg; - /* copy static num group ports per parent node */ - dai_data->num_group_ports = num_tdm_group_ports; - - - dev_set_drvdata(&pdev->dev, dai_data); - - port_idx = msm_dai_q6_get_port_idx(tdm_dev_id); - if (port_idx < 0) { - dev_err(&pdev->dev, "%s Port id 0x%x not supported\n", - __func__, tdm_dev_id); - rc = -EINVAL; - goto free_dai_data; - } - - rc = snd_soc_register_component(&pdev->dev, - &msm_q6_tdm_dai_component, - &msm_dai_q6_tdm_dai[port_idx], 1); - - if (rc) { - dev_err(&pdev->dev, "%s: TDM dai 0x%x register failed, rc=%d\n", - __func__, tdm_dev_id, rc); - goto err_register; - } - - return 0; - -err_register: -free_dai_data: - kfree(dai_data); -rtn: - return rc; -} - -static int msm_dai_q6_tdm_dev_remove(struct platform_device *pdev) -{ - struct msm_dai_q6_tdm_dai_data *dai_data = - dev_get_drvdata(&pdev->dev); - - snd_soc_unregister_component(&pdev->dev); - - kfree(dai_data); - - return 0; -} - -static const struct of_device_id msm_dai_q6_tdm_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-q6-tdm", }, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_dai_q6_tdm_dev_dt_match); - -static struct platform_driver msm_dai_q6_tdm_driver = { - .probe = msm_dai_q6_tdm_dev_probe, - .remove = msm_dai_q6_tdm_dev_remove, - .driver = { - .name = "msm-dai-q6-tdm", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_tdm_dev_dt_match, - .probe_type = PROBE_FORCE_SYNCHRONOUS, - }, -}; - -static int msm_dai_q6_cdc_dma_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - int value = ucontrol->value.integer.value[0]; - - dai_data->port_config.cdc_dma.data_format = value; - pr_debug("%s: format = %d\n", __func__, value); - return 0; -} - -static int msm_dai_q6_cdc_dma_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = kcontrol->private_data; - - ucontrol->value.integer.value[0] = - dai_data->port_config.cdc_dma.data_format; - return 0; -} - -static const struct snd_kcontrol_new cdc_dma_config_controls[] = { - SOC_ENUM_EXT("WSA_CDC_DMA_0 TX Format", cdc_dma_config_enum[0], - msm_dai_q6_cdc_dma_format_get, - msm_dai_q6_cdc_dma_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_0 RX XTLoggingDisable", - xt_logging_disable_enum[0], - msm_dai_q6_cdc_dma_xt_logging_disable_get, - msm_dai_q6_cdc_dma_xt_logging_disable_put), -}; - -/* SOC probe for codec DMA interface */ -static int msm_dai_q6_dai_cdc_dma_probe(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = NULL; - int rc = 0; - - if (!dai) { - pr_err("%s: Invalid params dai\n", __func__); - return -EINVAL; - } - if (!dai->dev) { - pr_err("%s: Invalid params dai dev\n", __func__); - return -EINVAL; - } - - msm_dai_q6_set_dai_id(dai); - dai_data = dev_get_drvdata(dai->dev); - - switch (dai->id) { - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&cdc_dma_config_controls[0], - dai_data)); - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - rc = snd_ctl_add(dai->component->card->snd_card, - snd_ctl_new1(&cdc_dma_config_controls[1], - dai_data)); - break; - default: - break; - } - - if (rc < 0) - dev_err(dai->dev, "%s: err add config ctl, DAI = %s\n", - __func__, dai->name); - - if (dai_data->is_island_dai) - rc = msm_dai_q6_add_island_mx_ctls( - dai->component->card->snd_card, - dai->name, dai->id, - (void *)dai_data); - - rc = msm_dai_q6_dai_add_route(dai); - return rc; -} - -static int msm_dai_q6_dai_cdc_dma_remove(struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - int rc = 0; - - /* If AFE port is still up, close it */ - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - dev_dbg(dai->dev, "%s: stop codec dma port:%d\n", __func__, - dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - return rc; -} - -static int msm_dai_q6_cdc_dma_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num_ch, unsigned int *tx_ch_mask, - unsigned int rx_num_ch, unsigned int *rx_ch_mask) - -{ - int rc = 0; - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - unsigned int ch_mask = 0, ch_num = 0; - - dev_dbg(dai->dev, "%s: id = %d\n", __func__, dai->id); - switch (dai->id) { - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - if (!rx_ch_mask) { - dev_err(dai->dev, "%s: invalid rx ch mask\n", __func__); - return -EINVAL; - } - if (rx_num_ch > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid rx_num_ch %d\n", - __func__, rx_num_ch); - return -EINVAL; - } - ch_mask = *rx_ch_mask; - ch_num = rx_num_ch; - break; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - if (!tx_ch_mask) { - dev_err(dai->dev, "%s: invalid tx ch mask\n", __func__); - return -EINVAL; - } - if (tx_num_ch > AFE_PORT_MAX_AUDIO_CHAN_CNT) { - dev_err(dai->dev, "%s: invalid tx_num_ch %d\n", - __func__, tx_num_ch); - return -EINVAL; - } - ch_mask = *tx_ch_mask; - ch_num = tx_num_ch; - break; - default: - dev_err(dai->dev, "%s: invalid dai id %d\n", __func__, dai->id); - return -EINVAL; - } - - dai_data->port_config.cdc_dma.active_channels_mask = ch_mask; - dev_dbg(dai->dev, "%s: CDC_DMA_%d_ch cnt[%d] ch mask[0x%x]\n", __func__, - dai->id, ch_num, ch_mask); - return rc; -} - -static int msm_dai_q6_cdc_dma_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - case SNDRV_PCM_FORMAT_SPECIAL: - dai_data->port_config.cdc_dma.bit_width = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - dai_data->port_config.cdc_dma.bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->port_config.cdc_dma.bit_width = 32; - break; - default: - dev_err(dai->dev, "%s: format %d\n", - __func__, params_format(params)); - return -EINVAL; - } - - dai_data->rate = params_rate(params); - dai_data->channels = params_channels(params); - - dai_data->port_config.cdc_dma.cdc_dma_cfg_minor_version = - AFE_API_VERSION_CODEC_DMA_CONFIG; - dai_data->port_config.cdc_dma.sample_rate = dai_data->rate; - dai_data->port_config.cdc_dma.num_channels = dai_data->channels; - dev_dbg(dai->dev, "%s: bit_wd[%hu] format[%hu]\n" - "num_channel %hu sample_rate %d\n", __func__, - dai_data->port_config.cdc_dma.bit_width, - dai_data->port_config.cdc_dma.data_format, - dai_data->port_config.cdc_dma.num_channels, - dai_data->rate); - - return 0; -} - -static int msm_dai_q6_cdc_dma_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - int rc = 0; - - if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4) { - /* - * send island mode config. - * This should be the first configuration - */ - rc = afe_send_port_island_mode(dai->id); - if (rc) - pr_err("%s: afe send island mode failed %d\n", - __func__, rc); - } - if ((dai->id == AFE_PORT_ID_WSA_CODEC_DMA_TX_0) && - (dai_data->port_config.cdc_dma.data_format == 1)) - dai_data->port_config.cdc_dma.data_format = - AFE_LINEAR_PCM_DATA_PACKED_16BIT; - - rc = afe_port_start(dai->id, &dai_data->port_config, - dai_data->rate); - if (rc < 0) - dev_err(dai->dev, "fail to open AFE port 0x%x\n", - dai->id); - else - set_bit(STATUS_PORT_STARTED, - dai_data->status_mask); - } - return rc; -} - - -static void msm_dai_q6_cdc_dma_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - int rc = 0; - - if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { - dev_dbg(dai->dev, "%s: stop AFE port:%d\n", __func__, - dai->id); - rc = afe_close(dai->id); /* can block */ - if (rc < 0) - dev_err(dai->dev, "fail to close AFE port\n"); - - dev_dbg(dai->dev, "%s: dai_data->status_mask = %ld\n", __func__, - *dai_data->status_mask); - clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); - } - - if (test_bit(STATUS_PORT_STARTED, dai_data->hwfree_status)) - clear_bit(STATUS_PORT_STARTED, dai_data->hwfree_status); -} - -static int msm_dai_q6_cdc_dma_digital_mute(struct snd_soc_dai *dai, - int mute) -{ - int port_id = dai->id; - struct msm_dai_q6_cdc_dma_dai_data *dai_data = - dev_get_drvdata(dai->dev); - - if (mute && !dai_data->xt_logging_disable) - afe_get_sp_xt_logging_data(port_id); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_q6_cdc_dma_ops = { - .prepare = msm_dai_q6_cdc_dma_prepare, - .hw_params = msm_dai_q6_cdc_dma_hw_params, - .shutdown = msm_dai_q6_cdc_dma_shutdown, - .set_channel_map = msm_dai_q6_cdc_dma_set_channel_map, -}; - -static struct snd_soc_dai_ops msm_dai_q6_cdc_wsa_dma_ops = { - .prepare = msm_dai_q6_cdc_dma_prepare, - .hw_params = msm_dai_q6_cdc_dma_hw_params, - .shutdown = msm_dai_q6_cdc_dma_shutdown, - .set_channel_map = msm_dai_q6_cdc_dma_set_channel_map, - .digital_mute = msm_dai_q6_cdc_dma_digital_mute, -}; - -static struct snd_soc_dai_driver msm_dai_q6_cdc_dma_dai[] = { - { - .playback = { - .stream_name = "WSA CDC DMA0 Playback", - .aif_name = "WSA_CDC_DMA_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_RX_0", - .ops = &msm_dai_q6_cdc_wsa_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_RX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "WSA CDC DMA0 Capture", - .aif_name = "WSA_CDC_DMA_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_TX_0", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "WSA CDC DMA1 Playback", - .aif_name = "WSA_CDC_DMA_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_RX_1", - .ops = &msm_dai_q6_cdc_wsa_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_RX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "WSA CDC DMA1 Capture", - .aif_name = "WSA_CDC_DMA_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_TX_1", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "WSA CDC DMA2 Capture", - .aif_name = "WSA_CDC_DMA_TX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "WSA_CDC_DMA_TX_2", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_WSA_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "VA CDC DMA0 Capture", - .aif_name = "VA_CDC_DMA_TX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "VA_CDC_DMA_TX_0", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_VA_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "VA CDC DMA1 Capture", - .aif_name = "VA_CDC_DMA_TX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .name = "VA_CDC_DMA_TX_1", - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_VA_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA0 Playback", - .aif_name = "RX_CDC_DMA_RX_0", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA0 Capture", - .aif_name = "TX_CDC_DMA_TX_0", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 3, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_0, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA1 Playback", - .aif_name = "RX_CDC_DMA_RX_1", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA1 Capture", - .aif_name = "TX_CDC_DMA_TX_1", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 3, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_1, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA2 Playback", - .aif_name = "RX_CDC_DMA_RX_2", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA2 Capture", - .aif_name = "TX_CDC_DMA_TX_2", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_2, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, { - .playback = { - .stream_name = "RX CDC DMA3 Playback", - .aif_name = "RX_CDC_DMA_RX_3", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_3, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA3 Capture", - .aif_name = "TX_CDC_DMA_TX_3", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_3, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA4 Playback", - .aif_name = "RX_CDC_DMA_RX_4", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 6, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_4, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA4 Capture", - .aif_name = "TX_CDC_DMA_TX_4", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 8, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_4, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA5 Playback", - .aif_name = "RX_CDC_DMA_RX_5", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_5, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .capture = { - .stream_name = "TX CDC DMA5 Capture", - .aif_name = "TX_CDC_DMA_TX_5", - .rates = SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | - SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000 | - SNDRV_PCM_RATE_192000 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_TX_CODEC_DMA_TX_5, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA6 Playback", - .aif_name = "RX_CDC_DMA_RX_6", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 4, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_6, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, - { - .playback = { - .stream_name = "RX CDC DMA7 Playback", - .aif_name = "RX_CDC_DMA_RX_7", - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | - SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | - SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | - SNDRV_PCM_RATE_384000, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 384000, - }, - .ops = &msm_dai_q6_cdc_dma_ops, - .id = AFE_PORT_ID_RX_CODEC_DMA_RX_7, - .probe = msm_dai_q6_dai_cdc_dma_probe, - .remove = msm_dai_q6_dai_cdc_dma_remove, - }, -}; - -static const struct snd_soc_component_driver msm_q6_cdc_dma_dai_component = { - .name = "msm-dai-cdc-dma-dev", -}; - -/* DT related probe for each codec DMA interface device */ -static int msm_dai_q6_cdc_dma_dev_probe(struct platform_device *pdev) -{ - const char *q6_cdc_dma_dev_id = "qcom,msm-dai-cdc-dma-dev-id"; - u32 cdc_dma_id = 0; - int i; - int rc = 0; - struct msm_dai_q6_cdc_dma_dai_data *dai_data = NULL; - - rc = of_property_read_u32(pdev->dev.of_node, q6_cdc_dma_dev_id, - &cdc_dma_id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing 0x%x in dt node\n", __func__, cdc_dma_id); - return rc; - } - - dev_dbg(&pdev->dev, "%s: dev name %s dev id 0x%x\n", __func__, - dev_name(&pdev->dev), cdc_dma_id); - - pdev->id = cdc_dma_id; - - dai_data = devm_kzalloc(&pdev->dev, - sizeof(struct msm_dai_q6_cdc_dma_dai_data), - GFP_KERNEL); - - if (!dai_data) - return -ENOMEM; - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-dai-is-island-supported", - &dai_data->is_island_dai); - if (rc) - dev_dbg(&pdev->dev, "island supported entry not found\n"); - - dev_set_drvdata(&pdev->dev, dai_data); - - for (i = 0; i < ARRAY_SIZE(msm_dai_q6_cdc_dma_dai); i++) { - if (msm_dai_q6_cdc_dma_dai[i].id == cdc_dma_id) { - return snd_soc_register_component(&pdev->dev, - &msm_q6_cdc_dma_dai_component, - &msm_dai_q6_cdc_dma_dai[i], 1); - } - } - return -ENODEV; -} - -static int msm_dai_q6_cdc_dma_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_q6_cdc_dma_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-cdc-dma-dev", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_q6_cdc_dma_dev_dt_match); - -static struct platform_driver msm_dai_q6_cdc_dma_driver = { - .probe = msm_dai_q6_cdc_dma_dev_probe, - .remove = msm_dai_q6_cdc_dma_dev_remove, - .driver = { - .name = "msm-dai-cdc-dma-dev", - .owner = THIS_MODULE, - .of_match_table = msm_dai_q6_cdc_dma_dev_dt_match, - }, -}; - -/* DT related probe for codec DMA interface device group */ -static int msm_dai_cdc_dma_q6_probe(struct platform_device *pdev) -{ - int rc; - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - return rc; -} - -static int msm_dai_cdc_dma_q6_remove(struct platform_device *pdev) -{ - of_platform_depopulate(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_cdc_dma_dt_match[] = { - { .compatible = "qcom,msm-dai-cdc-dma", }, - { } -}; - -MODULE_DEVICE_TABLE(of, msm_dai_cdc_dma_dt_match); - -static struct platform_driver msm_dai_cdc_dma_q6 = { - .probe = msm_dai_cdc_dma_q6_probe, - .remove = msm_dai_cdc_dma_q6_remove, - .driver = { - .name = "msm-dai-cdc-dma", - .owner = THIS_MODULE, - .of_match_table = msm_dai_cdc_dma_dt_match, - }, -}; - -int __init msm_dai_q6_init(void) -{ - int rc; - - rc = platform_driver_register(&msm_auxpcm_dev_driver); - if (rc) { - pr_err("%s: fail to register auxpcm dev driver", __func__); - goto fail; - } - - rc = platform_driver_register(&msm_dai_q6); - if (rc) { - pr_err("%s: fail to register dai q6 driver", __func__); - goto dai_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_dev); - if (rc) { - pr_err("%s: fail to register dai q6 dev driver", __func__); - goto dai_q6_dev_fail; - } - - rc = platform_driver_register(&msm_dai_q6_mi2s_driver); - if (rc) { - pr_err("%s: fail to register dai MI2S dev drv\n", __func__); - goto dai_q6_mi2s_drv_fail; - } - - rc = platform_driver_register(&msm_dai_mi2s_q6); - if (rc) { - pr_err("%s: fail to register dai MI2S\n", __func__); - goto dai_mi2s_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_spdif_driver); - if (rc) { - pr_err("%s: fail to register dai SPDIF\n", __func__); - goto dai_spdif_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_tdm_driver); - if (rc) { - pr_err("%s: fail to register dai TDM dev drv\n", __func__); - goto dai_q6_tdm_drv_fail; - } - - rc = platform_driver_register(&msm_dai_tdm_q6); - if (rc) { - pr_err("%s: fail to register dai TDM\n", __func__); - goto dai_tdm_q6_fail; - } - - rc = platform_driver_register(&msm_dai_q6_cdc_dma_driver); - if (rc) { - pr_err("%s: fail to register dai CDC DMA dev\n", __func__); - goto dai_cdc_dma_q6_dev_fail; - } - - - rc = platform_driver_register(&msm_dai_cdc_dma_q6); - if (rc) { - pr_err("%s: fail to register dai CDC DMA\n", __func__); - goto dai_cdc_dma_q6_fail; - } - return rc; - -dai_cdc_dma_q6_fail: - platform_driver_unregister(&msm_dai_q6_cdc_dma_driver); -dai_cdc_dma_q6_dev_fail: - platform_driver_unregister(&msm_dai_tdm_q6); -dai_tdm_q6_fail: - platform_driver_unregister(&msm_dai_q6_tdm_driver); -dai_q6_tdm_drv_fail: - platform_driver_unregister(&msm_dai_q6_spdif_driver); -dai_spdif_q6_fail: - platform_driver_unregister(&msm_dai_mi2s_q6); -dai_mi2s_q6_fail: - platform_driver_unregister(&msm_dai_q6_mi2s_driver); -dai_q6_mi2s_drv_fail: - platform_driver_unregister(&msm_dai_q6_dev); -dai_q6_dev_fail: - platform_driver_unregister(&msm_dai_q6); -dai_q6_fail: - platform_driver_unregister(&msm_auxpcm_dev_driver); -fail: - return rc; -} - -void msm_dai_q6_exit(void) -{ - platform_driver_unregister(&msm_dai_cdc_dma_q6); - platform_driver_unregister(&msm_dai_q6_cdc_dma_driver); - platform_driver_unregister(&msm_dai_tdm_q6); - platform_driver_unregister(&msm_dai_q6_tdm_driver); - platform_driver_unregister(&msm_dai_q6_spdif_driver); - platform_driver_unregister(&msm_dai_mi2s_q6); - platform_driver_unregister(&msm_dai_q6_mi2s_driver); - platform_driver_unregister(&msm_dai_q6_dev); - platform_driver_unregister(&msm_dai_q6); - platform_driver_unregister(&msm_auxpcm_dev_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM DSP DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-dai-q6-v2.h b/techpack/audio/asoc/msm-dai-q6-v2.h deleted file mode 100644 index 2327cfd72eca..000000000000 --- a/techpack/audio/asoc/msm-dai-q6-v2.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2012-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MSM_DAI_Q6_PDATA_H__ - -#define __MSM_DAI_Q6_PDATA_H__ - -#define MSM_MI2S_SD0 (1 << 0) -#define MSM_MI2S_SD1 (1 << 1) -#define MSM_MI2S_SD2 (1 << 2) -#define MSM_MI2S_SD3 (1 << 3) -#define MSM_MI2S_SD4 (1 << 4) -#define MSM_MI2S_SD5 (1 << 5) -#define MSM_MI2S_SD6 (1 << 6) -#define MSM_MI2S_SD7 (1 << 7) - -#define MSM_MI2S_CAP_RX 0 -#define MSM_MI2S_CAP_TX 1 - -#define MSM_PRIM_MI2S 0 -#define MSM_SEC_MI2S 1 -#define MSM_TERT_MI2S 2 -#define MSM_QUAT_MI2S 3 -#define MSM_QUIN_MI2S 4 -#define MSM_SEC_MI2S_SD1 5 -#define MSM_SENARY_MI2S 6 -#define MSM_INT0_MI2S 7 -#define MSM_INT1_MI2S 8 -#define MSM_INT2_MI2S 9 -#define MSM_INT3_MI2S 10 -#define MSM_INT4_MI2S 11 -#define MSM_INT5_MI2S 12 -#define MSM_INT6_MI2S 13 -#define MSM_MI2S_MIN MSM_PRIM_MI2S -#define MSM_MI2S_MAX MSM_INT6_MI2S - -struct msm_dai_auxpcm_config { - u16 mode; - u16 sync; - u16 frame; - u16 quant; - u16 num_slots; - u16 *slot_mapping; - u16 data; - u32 pcm_clk_rate; -}; - -struct msm_dai_auxpcm_pdata { - struct msm_dai_auxpcm_config mode_8k; - struct msm_dai_auxpcm_config mode_16k; -}; - -struct msm_mi2s_pdata { - u16 rx_sd_lines; - u16 tx_sd_lines; - u16 intf_id; -}; - -struct msm_i2s_data { - u32 capability; /* RX or TX */ - u16 sd_lines; -}; - -struct msm_dai_tdm_group_config { - u16 group_id; - u16 num_ports; - u16 *port_id; - u32 clk_rate; -}; - -struct msm_dai_tdm_config { - u16 sync_mode; - u16 sync_src; - u16 data_out; - u16 invert_sync; - u16 data_delay; - u32 data_align; - u16 header_start_offset; - u16 header_width; - u16 header_num_frame_repeat; -}; - -struct msm_dai_tdm_pdata { - struct msm_dai_tdm_group_config group_config; - struct msm_dai_tdm_config config; -}; - -#endif diff --git a/techpack/audio/asoc/msm-dai-slim.c b/techpack/audio/asoc/msm-dai-slim.c deleted file mode 100644 index e8bdf13fdc6c..000000000000 --- a/techpack/audio/asoc/msm-dai-slim.c +++ /dev/null @@ -1,663 +0,0 @@ -/* - * Copyright (c) 2014-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-slim-dma.h" - -#define SLIM_DEV_NAME "msm-dai-slim" - -#define SLIM_DAI_RATES (SNDRV_PCM_RATE_48000 | \ - SNDRV_PCM_RATE_8000 | \ - SNDRV_PCM_RATE_16000 | \ - SNDRV_PCM_RATE_96000 | \ - SNDRV_PCM_RATE_192000 | \ - SNDRV_PCM_RATE_384000) - -#define SLIM_DAI_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -#define DAI_STATE_INITIALIZED (0x01 << 0) -#define DAI_STATE_PREPARED (0x01 << 1) -#define DAI_STATE_RUNNING (0x01 << 2) - -#define SET_DAI_STATE(status, state) \ - (status |= state) - -#define CLR_DAI_STATE(status, state) \ - (status = status & (~state)) - -enum { - MSM_DAI_SLIM0 = 0, - NUM_SLIM_DAIS, -}; - -struct msm_slim_dai_data { - unsigned int dai_id; - u16 *chan_h; - u16 *sh_ch; - u16 grph; - u32 rate; - u16 bits; - u16 ch_cnt; - u8 status; - struct snd_soc_dai_driver *dai_drv; - struct msm_slim_dma_data dma_data; - struct slim_port_cfg port_cfg; -}; - -struct msm_dai_slim_drv_data { - struct slim_device *sdev; - u16 num_dais; - struct msm_slim_dai_data slim_dai_data[NUM_SLIM_DAIS]; -}; - -struct msm_slim_dai_data *msm_slim_get_dai_data( - struct msm_dai_slim_drv_data *drv_data, - struct snd_soc_dai *dai) -{ - struct msm_slim_dai_data *dai_data_t; - int i; - - for (i = 0; i < drv_data->num_dais; i++) { - dai_data_t = &drv_data->slim_dai_data[i]; - if (dai_data_t->dai_id == dai->id) - return dai_data_t; - } - - dev_err(dai->dev, - "%s: no dai data found for dai_id %d\n", - __func__, dai->id); - return NULL; -} - -static int msm_dai_slim_ch_ctl(struct msm_slim_dma_data *dma_data, - struct snd_soc_dai *dai, bool enable) -{ - struct slim_device *sdev; - struct msm_dai_slim_drv_data *drv_data; - struct msm_slim_dai_data *dai_data; - int rc, rc1, i; - - if (!dma_data || !dma_data->sdev) { - pr_err("%s: Invalid %s\n", __func__, - (!dma_data) ? "dma_data" : "slim_device"); - return -EINVAL; - } - - sdev = dma_data->sdev; - drv_data = dev_get_drvdata(&sdev->dev); - dai_data = msm_slim_get_dai_data(drv_data, dai); - - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai_id %d\n", - __func__, dai->id); - return -EINVAL; - } - - dev_dbg(&sdev->dev, - "%s: enable = %s, rate = %u\n", __func__, - enable ? "true" : "false", - dai_data->rate); - - if (enable) { - if (!(dai_data->status & DAI_STATE_PREPARED)) { - dev_err(&sdev->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return -EINVAL; - } - - rc = slim_alloc_mgrports(sdev, - SLIM_REQ_DEFAULT, dai_data->ch_cnt, - &(dma_data->ph), - sizeof(dma_data->ph)); - if (rc < 0) { - dev_err(&sdev->dev, - "%s:alloc mgrport failed rc %d\n", - __func__, rc); - goto done; - } - - rc = slim_config_mgrports(sdev, &(dma_data->ph), - dai_data->ch_cnt, - &(dai_data->port_cfg)); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: config mgrport failed rc %d\n", - __func__, rc); - goto err_done; - } - - for (i = 0; i < dai_data->ch_cnt; i++) { - rc = slim_connect_sink(sdev, - &dma_data->ph, 1, - dai_data->chan_h[i]); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: slim_connect_sink failed, ch = %d, err = %d\n", - __func__, i, rc); - goto err_done; - } - } - - rc = slim_control_ch(sdev, - dai_data->grph, - SLIM_CH_ACTIVATE, true); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: slim activate ch failed, err = %d\n", - __func__, rc); - goto err_done; - } - /* Mark dai status as running */ - SET_DAI_STATE(dai_data->status, DAI_STATE_RUNNING); - } else { - if (!(dai_data->status & DAI_STATE_RUNNING)) { - dev_err(&sdev->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return -EINVAL; - } - - rc = slim_control_ch(sdev, - dai_data->grph, - SLIM_CH_REMOVE, true); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: slim activate ch failed, err = %d\n", - __func__, rc); - goto done; - } - - rc = slim_dealloc_mgrports(sdev, - &dma_data->ph, 1); - if (rc < 0) { - dev_err(&sdev->dev, - "%s: dealloc mgrport failed, err = %d\n", - __func__, rc); - goto done; - } - /* clear running state for dai*/ - CLR_DAI_STATE(dai_data->status, DAI_STATE_RUNNING); - } - - return rc; - -err_done: - rc1 = slim_dealloc_mgrports(sdev, - &dma_data->ph, 1); - if (rc1 < 0) - dev_err(&sdev->dev, - "%s: dealloc mgrport failed, err = %d\n", - __func__, rc1); -done: - return rc; -} - -static int msm_dai_slim_hw_params( - struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dai_data *dai_data; - int rc = 0; - - dai_data = msm_slim_get_dai_data(drv_data, dai); - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai_id %d\n", - __func__, dai->id); - rc = -EINVAL; - goto done; - } - - if (!dai_data->ch_cnt || dai_data->ch_cnt != params_channels(params)) { - dev_err(dai->dev, "%s: invalid ch_cnt %d %d\n", - __func__, dai_data->ch_cnt, params_channels(params)); - rc = -EINVAL; - goto done; - } - - dai_data->rate = params_rate(params); - dai_data->port_cfg.port_opts = SLIM_OPT_NONE; - if (dai_data->rate >= SNDRV_PCM_RATE_48000) - dai_data->port_cfg.watermark = 16; - else - dai_data->port_cfg.watermark = 8; - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - dai_data->bits = 16; - break; - case SNDRV_PCM_FORMAT_S24_LE: - dai_data->bits = 24; - break; - case SNDRV_PCM_FORMAT_S32_LE: - dai_data->bits = 32; - break; - default: - dev_err(dai->dev, "%s: invalid format %d\n", __func__, - params_format(params)); - rc = -EINVAL; - goto done; - } - - dev_dbg(dai->dev, "%s: ch_cnt=%u rate=%u, bit_width = %u\n", - __func__, dai_data->ch_cnt, dai_data->rate, - dai_data->bits); -done: - return rc; -} - -static int msm_dai_slim_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dai_data *dai_data; - struct snd_soc_dai_driver *dai_drv; - u8 i = 0; - - dev_dbg(dai->dev, - "%s: tx_num=%u, rx_num=%u\n", - __func__, tx_num, rx_num); - - dai_data = msm_slim_get_dai_data(drv_data, dai); - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai_id %d\n", - __func__, dai->id); - return -EINVAL; - } - - dai_drv = dai_data->dai_drv; - - if (tx_num > dai_drv->capture.channels_max) { - dev_err(dai->dev, "%s: tx_num %u max out master port cnt\n", - __func__, tx_num); - return -EINVAL; - } - - for (i = 0; i < tx_num; i++) - dai_data->sh_ch[i] = tx_slot[i]; - - dai_data->ch_cnt = tx_num; - return 0; -} - -static int msm_dai_slim_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dma_data *dma_data; - struct msm_slim_dai_data *dai_data = NULL; - struct slim_ch prop; - int rc; - u8 i, j; - - dai_data = msm_slim_get_dai_data(drv_data, dai); - if (!dai_data) { - dev_err(dai->dev, - "%s: Invalid dai_data for dai %d\n", - __func__, dai->id); - return -EINVAL; - } - - if (!(dai_data->status & DAI_STATE_INITIALIZED)) { - dev_err(dai->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return -EINVAL; - } - - if (dai_data->status & DAI_STATE_PREPARED) { - dev_dbg(dai->dev, - "%s: dai id (%d) has already prepared.\n", - __func__, dai->id); - return 0; - } - - dma_data = &dai_data->dma_data; - snd_soc_dai_set_dma_data(dai, substream, dma_data); - - for (i = 0; i < dai_data->ch_cnt; i++) { - rc = slim_query_ch(drv_data->sdev, dai_data->sh_ch[i], - &dai_data->chan_h[i]); - if (rc) { - dev_err(dai->dev, "%s:query chan handle failed rc %d\n", - __func__, rc); - goto error_chan_query; - } - } - - prop.prot = SLIM_AUTO_ISO; - prop.baser = SLIM_RATE_4000HZ; - prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; - prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; - prop.ratem = (dai_data->rate/4000); - prop.sampleszbits = dai_data->bits; - - rc = slim_define_ch(drv_data->sdev, &prop, dai_data->chan_h, - dai_data->ch_cnt, true, &dai_data->grph); - - if (rc) { - dev_err(dai->dev, "%s:define chan failed rc %d\n", - __func__, rc); - goto error_define_chan; - } - - /* Mark stream status as prepared */ - SET_DAI_STATE(dai_data->status, DAI_STATE_PREPARED); - - return rc; - -error_define_chan: -error_chan_query: - for (j = 0; j < i; j++) - slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[j]); - return rc; -} - -static void msm_dai_slim_shutdown(struct snd_pcm_substream *stream, - struct snd_soc_dai *dai) -{ - struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); - struct msm_slim_dma_data *dma_data = NULL; - struct msm_slim_dai_data *dai_data; - int i, rc = 0; - - dai_data = msm_slim_get_dai_data(drv_data, dai); - dma_data = snd_soc_dai_get_dma_data(dai, stream); - if (!dma_data || !dai_data) { - dev_err(dai->dev, - "%s: Invalid %s\n", __func__, - (!dma_data) ? "dma_data" : "dai_data"); - return; - } - - if ((!(dai_data->status & DAI_STATE_PREPARED)) || - dai_data->status & DAI_STATE_RUNNING) { - dev_err(dai->dev, - "%s: dai id (%d) has invalid state 0x%x\n", - __func__, dai->id, dai_data->status); - return; - } - - for (i = 0; i < dai_data->ch_cnt; i++) { - rc = slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[i]); - if (rc) { - dev_err(dai->dev, - "%s: dealloc_ch failed, err = %d\n", - __func__, rc); - } - } - - snd_soc_dai_set_dma_data(dai, stream, NULL); - /* clear prepared state for the dai */ - CLR_DAI_STATE(dai_data->status, DAI_STATE_PREPARED); -} - -static const struct snd_soc_component_driver msm_dai_slim_component = { - .name = "msm-dai-slim-cmpnt", -}; - -static struct snd_soc_dai_ops msm_dai_slim_ops = { - .prepare = msm_dai_slim_prepare, - .hw_params = msm_dai_slim_hw_params, - .shutdown = msm_dai_slim_shutdown, - .set_channel_map = msm_dai_slim_set_channel_map, -}; - -static struct snd_soc_dai_driver msm_slim_dais[] = { - { - /* - * The first dai name should be same as device name - * to support registering single and multile dais. - */ - .name = SLIM_DEV_NAME, - .id = MSM_DAI_SLIM0, - .capture = { - .rates = SLIM_DAI_RATES, - .formats = SLIM_DAI_FORMATS, - .channels_min = 1, - /* - * max channels allowed is - * dependent on platform and - * will be updated before this - * dai driver is registered. - */ - .channels_max = 1, - .rate_min = 8000, - .rate_max = 384000, - .stream_name = "SLIM_DAI0 Capture", - }, - .ops = &msm_dai_slim_ops, - }, - /* - * If multiple dais are needed, - * add dais here and update the - * dai_id enum. - */ -}; - -static void msm_dai_slim_remove_dai_data( - struct device *dev, - struct msm_dai_slim_drv_data *drv_data) -{ - int i; - struct msm_slim_dai_data *dai_data_t; - - for (i = 0; i < drv_data->num_dais; i++) { - dai_data_t = &drv_data->slim_dai_data[i]; - - kfree(dai_data_t->chan_h); - dai_data_t->chan_h = NULL; - kfree(dai_data_t->sh_ch); - dai_data_t->sh_ch = NULL; - } -} - -static int msm_dai_slim_populate_dai_data(struct device *dev, - struct msm_dai_slim_drv_data *drv_data) -{ - struct snd_soc_dai_driver *dai_drv; - struct msm_slim_dai_data *dai_data_t; - u8 num_ch; - int i, j, rc; - - for (i = 0; i < drv_data->num_dais; i++) { - num_ch = 0; - dai_drv = &msm_slim_dais[i]; - num_ch += dai_drv->capture.channels_max; - num_ch += dai_drv->playback.channels_max; - - dai_data_t = &drv_data->slim_dai_data[i]; - dai_data_t->dai_drv = dai_drv; - dai_data_t->dai_id = dai_drv->id; - dai_data_t->dma_data.sdev = drv_data->sdev; - dai_data_t->dma_data.dai_channel_ctl = - msm_dai_slim_ch_ctl; - SET_DAI_STATE(dai_data_t->status, - DAI_STATE_INITIALIZED); - - dai_data_t->chan_h = devm_kzalloc(dev, - sizeof(u16) * num_ch, - GFP_KERNEL); - if (!dai_data_t->chan_h) { - dev_err(dev, - "%s: DAI ID %d, Failed to alloc channel handles\n", - __func__, i); - rc = -ENOMEM; - goto err_mem_alloc; - } - - dai_data_t->sh_ch = devm_kzalloc(dev, - sizeof(u16) * num_ch, - GFP_KERNEL); - if (!dai_data_t->sh_ch) { - dev_err(dev, - "%s: DAI ID %d, Failed to alloc sh_ch\n", - __func__, i); - rc = -ENOMEM; - goto err_mem_alloc; - } - } - return 0; - -err_mem_alloc: - for (j = 0; j < i; j++) { - dai_data_t = &drv_data->slim_dai_data[i]; - - devm_kfree(dev, dai_data_t->chan_h); - dai_data_t->chan_h = NULL; - - devm_kfree(dev, dai_data_t->sh_ch); - dai_data_t->sh_ch = NULL; - } - return rc; -} - -static int msm_dai_slim_dev_probe(struct slim_device *sdev) -{ - int rc, i; - u8 max_channels; - u32 apps_ch_pipes; - struct msm_dai_slim_drv_data *drv_data; - struct device *dev = &sdev->dev; - struct snd_soc_dai_driver *dai_drv; - - if (!dev->of_node || - !dev->of_node->parent) { - dev_err(dev, - "%s: Invalid %s\n", __func__, - (!dev->of_node) ? "of_node" : "parent_of_node"); - return -EINVAL; - } - - rc = of_property_read_u32(dev->of_node->parent, - "qcom,apps-ch-pipes", - &apps_ch_pipes); - if (rc) { - dev_err(dev, - "%s: Failed to lookup property %s in node %s, err = %d\n", - __func__, "qcom,apps-ch-pipes", - dev->of_node->parent->full_name, rc); - goto err_ret; - } - - max_channels = hweight_long(apps_ch_pipes); - if (max_channels <= 0) { - dev_err(dev, - "%s: Invalid apps owned ports %d\n", - __func__, max_channels); - goto err_ret; - } - - dev_dbg(dev, "%s: max channels = %u\n", - __func__, max_channels); - - for (i = 0; i < ARRAY_SIZE(msm_slim_dais); i++) { - dai_drv = &msm_slim_dais[i]; - dai_drv->capture.channels_max = max_channels; - dai_drv->playback.channels_max = max_channels; - } - - drv_data = devm_kzalloc(dev, sizeof(*drv_data), - GFP_KERNEL); - if (!drv_data) { - rc = -ENOMEM; - goto err_ret; - } - - drv_data->sdev = sdev; - drv_data->num_dais = NUM_SLIM_DAIS; - - rc = msm_dai_slim_populate_dai_data(dev, drv_data); - if (rc) { - dev_err(dev, - "%s: failed to setup dai_data, err = %d\n", - __func__, rc); - goto err_populate_dai; - } - - rc = snd_soc_register_component(&sdev->dev, &msm_dai_slim_component, - msm_slim_dais, NUM_SLIM_DAIS); - if (rc < 0) { - dev_err(dev, "%s: failed to register DAI, err = %d\n", - __func__, rc); - goto err_reg_comp; - } - - dev_set_drvdata(dev, drv_data); - return rc; - -err_reg_comp: - msm_dai_slim_remove_dai_data(dev, drv_data); - -err_populate_dai: - devm_kfree(dev, drv_data); - -err_ret: - return rc; -} - -static int msm_dai_slim_dev_remove(struct slim_device *sdev) -{ - snd_soc_unregister_component(&sdev->dev); - return 0; -} - -static const struct slim_device_id msm_dai_slim_dt_match[] = { - {SLIM_DEV_NAME, 0 }, - {} -}; - -static struct slim_driver msm_dai_slim_driver = { - .driver = { - .name = SLIM_DEV_NAME, - .owner = THIS_MODULE, - }, - .probe = msm_dai_slim_dev_probe, - .remove = msm_dai_slim_dev_remove, - .id_table = msm_dai_slim_dt_match, -}; - -int __init msm_dai_slim_init(void) -{ - int rc; - - rc = slim_driver_register(&msm_dai_slim_driver); - if (rc) - pr_err("%s: failed to register with slimbus driver rc = %d", - __func__, rc); - return rc; -} - -void msm_dai_slim_exit(void) -{ - slim_driver_unregister(&msm_dai_slim_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("Slimbus apps-owned channel handling driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-dai-stub-v2.c b/techpack/audio/asoc/msm-dai-stub-v2.c deleted file mode 100644 index c8b6b7736631..000000000000 --- a/techpack/audio/asoc/msm-dai-stub-v2.c +++ /dev/null @@ -1,392 +0,0 @@ -/* Copyright (c) 2013-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - STUB_RX, - STUB_TX, - STUB_1_RX, - STUB_1_TX, - STUB_DTMF_TX, - STUB_HOST_RX_CAPTURE_TX, - STUB_HOST_RX_PLAYBACK_RX, - STUB_HOST_TX_CAPTURE_TX, - STUB_HOST_TX_PLAYBACK_RX, -}; - -static int msm_dai_stub_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - pr_debug("%s:\n", __func__); - - return 0; -} - -static struct snd_soc_dai_ops msm_dai_stub_ops = { - .set_channel_map = msm_dai_stub_set_channel_map, -}; - -static int msm_dai_stub_add_route(struct snd_soc_dai *dai) -{ - struct snd_soc_dapm_route intercon; - struct snd_soc_dapm_context *dapm; - - if (!dai || !dai->driver) { - pr_err("%s Invalid params\n", __func__); - return -EINVAL; - } - dapm = snd_soc_component_get_dapm(dai->component); - memset(&intercon, 0, sizeof(intercon)); - if (dai->driver->playback.stream_name && - dai->driver->playback.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->playback.stream_name); - intercon.source = dai->driver->playback.aif_name; - intercon.sink = dai->driver->playback.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - if (dai->driver->capture.stream_name && - dai->driver->capture.aif_name) { - dev_dbg(dai->dev, "%s add route for widget %s", - __func__, dai->driver->capture.stream_name); - intercon.sink = dai->driver->capture.aif_name; - intercon.source = dai->driver->capture.stream_name; - dev_dbg(dai->dev, "%s src %s sink %s\n", - __func__, intercon.source, intercon.sink); - snd_soc_dapm_add_routes(dapm, &intercon, 1); - } - return 0; -} - -static int msm_dai_stub_dai_probe(struct snd_soc_dai *dai) -{ - return msm_dai_stub_add_route(dai); -} - -static int msm_dai_stub_dai_remove(struct snd_soc_dai *dai) -{ - pr_debug("%s:\n", __func__); - return 0; -} - -static struct snd_soc_dai_driver msm_dai_stub_dai_rx = { - .playback = { - .stream_name = "Stub Playback", - .aif_name = "STUB_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_stub_dai_tx[] = { - { - .capture = { - .stream_name = "Stub Capture", - .aif_name = "STUB_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, - { - .capture = { - .stream_name = "Stub1 Capture", - .aif_name = "STUB_1_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - } -}; - -static struct snd_soc_dai_driver msm_dai_stub_dtmf_tx_dai = { - .capture = { - .stream_name = "DTMF TX", - .aif_name = "STUB_DTMF_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, -}; - -static struct snd_soc_dai_driver msm_dai_stub_host_capture_tx_dai[] = { - { - .capture = { - .stream_name = "CS-VOICE HOST RX CAPTURE", - .aif_name = "STUB_HOST_RX_CAPTURE_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, - { - .capture = { - .stream_name = "CS-VOICE HOST TX CAPTURE", - .aif_name = "STUB_HOST_TX_CAPTURE_TX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, -}; - -static struct snd_soc_dai_driver msm_dai_stub_host_playback_rx_dai[] = { - { - .playback = { - .stream_name = "CS-VOICE HOST RX PLAYBACK", - .aif_name = "STUB_HOST_RX_PLAYBACK_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, - { - .playback = { - .stream_name = "CS-VOICE HOST TX PLAYBACK", - .aif_name = "STUB_HOST_TX_PLAYBACK_RX", - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_dai_stub_ops, - .probe = &msm_dai_stub_dai_probe, - .remove = &msm_dai_stub_dai_remove, - }, -}; - -static const struct snd_soc_component_driver msm_dai_stub_component = { - .name = "msm-dai-stub-dev", -}; - -static int msm_dai_stub_dev_probe(struct platform_device *pdev) -{ - int rc, id = -1; - const char *stub_dev_id = "qcom,msm-dai-stub-dev-id"; - - rc = of_property_read_u32(pdev->dev.of_node, stub_dev_id, &id); - if (rc) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, stub_dev_id); - return rc; - } - - pdev->id = id; - - pr_debug("%s: dev name %s, id:%d\n", __func__, - dev_name(&pdev->dev), pdev->id); - - switch (id) { - case STUB_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, &msm_dai_stub_dai_rx, 1); - break; - case STUB_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, &msm_dai_stub_dai_tx[0], 1); - break; - case STUB_1_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, &msm_dai_stub_dai_tx[1], 1); - break; - case STUB_DTMF_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_dtmf_tx_dai, 1); - break; - case STUB_HOST_RX_CAPTURE_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_capture_tx_dai[0], 1); - break; - case STUB_HOST_TX_CAPTURE_TX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_capture_tx_dai[1], 1); - break; - case STUB_HOST_RX_PLAYBACK_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_playback_rx_dai[0], 1); - break; - case STUB_HOST_TX_PLAYBACK_RX: - rc = snd_soc_register_component(&pdev->dev, - &msm_dai_stub_component, - &msm_dai_stub_host_playback_rx_dai[1], 1); - break; - } - - return rc; -} - -static int msm_dai_stub_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_component(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_dai_stub_dev_dt_match[] = { - { .compatible = "qcom,msm-dai-stub-dev", }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_dai_stub_dev_dt_match); - -static struct platform_driver msm_dai_stub_dev = { - .probe = msm_dai_stub_dev_probe, - .remove = msm_dai_stub_dev_remove, - .driver = { - .name = "msm-dai-stub-dev", - .owner = THIS_MODULE, - .of_match_table = msm_dai_stub_dev_dt_match, - }, -}; - -static int msm_dai_stub_probe(struct platform_device *pdev) -{ - int rc = 0; - - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - } else - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - - return rc; -} - -static int msm_dai_stub_remove(struct platform_device *pdev) -{ - pr_debug("%s:\n", __func__); - - return 0; -} - -static const struct of_device_id msm_dai_stub_dt_match[] = { - {.compatible = "qcom,msm-dai-stub"}, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_dai_stub_dt_match); - - -static struct platform_driver msm_dai_stub_driver = { - .probe = msm_dai_stub_probe, - .remove = msm_dai_stub_remove, - .driver = { - .name = "msm-dai-stub", - .owner = THIS_MODULE, - .of_match_table = msm_dai_stub_dt_match, - }, -}; - -int __init msm_dai_stub_init(void) -{ - int rc = 0; - - pr_debug("%s:\n", __func__); - - rc = platform_driver_register(&msm_dai_stub_driver); - if (rc) { - pr_err("%s: fail to register dai q6 driver", __func__); - goto fail; - } - - rc = platform_driver_register(&msm_dai_stub_dev); - if (rc) { - pr_err("%s: fail to register dai q6 dev driver", __func__); - goto dai_stub_dev_fail; - } - return rc; - -dai_stub_dev_fail: - platform_driver_unregister(&msm_dai_stub_driver); -fail: - return rc; -} - -void msm_dai_stub_exit(void) -{ - pr_debug("%s:\n", __func__); - - platform_driver_unregister(&msm_dai_stub_dev); - platform_driver_unregister(&msm_dai_stub_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("MSM Stub DSP DAI driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-dolby-common.h b/techpack/audio/asoc/msm-dolby-common.h deleted file mode 100644 index 885d283ef03d..000000000000 --- a/techpack/audio/asoc/msm-dolby-common.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2013-2014, 2016 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_DOLBY_COMMON_H_ -#define _MSM_DOLBY_COMMON_H_ - -#include - - -#define DOLBY_BUNDLE_MODULE_ID 0x00010723 -#define DOLBY_VISUALIZER_MODULE_ID 0x0001072B - -#define DOLBY_PARAM_ID_VDHE 0x0001074D -#define DOLBY_PARAM_ID_VSPE 0x00010750 -#define DOLBY_PARAM_ID_DSSF 0x00010753 -#define DOLBY_PARAM_ID_DVLI 0x0001073E -#define DOLBY_PARAM_ID_DVLO 0x0001073F -#define DOLBY_PARAM_ID_DVLE 0x0001073C -#define DOLBY_PARAM_ID_DVMC 0x00010741 -#define DOLBY_PARAM_ID_DVME 0x00010740 -#define DOLBY_PARAM_ID_IENB 0x00010744 -#define DOLBY_PARAM_ID_IEBF 0x00010745 -#define DOLBY_PARAM_ID_IEON 0x00010743 -#define DOLBY_PARAM_ID_DEON 0x00010738 -#define DOLBY_PARAM_ID_NGON 0x00010736 -#define DOLBY_PARAM_ID_GEON 0x00010748 -#define DOLBY_PARAM_ID_GENB 0x00010749 -#define DOLBY_PARAM_ID_GEBF 0x0001074A -#define DOLBY_PARAM_ID_AONB 0x0001075B -#define DOLBY_PARAM_ID_AOBF 0x0001075C -#define DOLBY_PARAM_ID_AOBG 0x0001075D -#define DOLBY_PARAM_ID_AOON 0x00010759 -#define DOLBY_PARAM_ID_ARNB 0x0001075F -#define DOLBY_PARAM_ID_ARBF 0x00010760 -#define DOLBY_PARAM_ID_PLB 0x00010768 -#define DOLBY_PARAM_ID_PLMD 0x00010767 -#define DOLBY_PARAM_ID_DHSB 0x0001074E -#define DOLBY_PARAM_ID_DHRG 0x0001074F -#define DOLBY_PARAM_ID_DSSB 0x00010751 -#define DOLBY_PARAM_ID_DSSA 0x00010752 -#define DOLBY_PARAM_ID_DVLA 0x0001073D -#define DOLBY_PARAM_ID_IEBT 0x00010746 -#define DOLBY_PARAM_ID_IEA 0x0001076A -#define DOLBY_PARAM_ID_DEA 0x00010739 -#define DOLBY_PARAM_ID_DED 0x0001073A -#define DOLBY_PARAM_ID_GEBG 0x0001074B -#define DOLBY_PARAM_ID_AOCC 0x0001075A -#define DOLBY_PARAM_ID_ARBI 0x00010761 -#define DOLBY_PARAM_ID_ARBL 0x00010762 -#define DOLBY_PARAM_ID_ARBH 0x00010763 -#define DOLBY_PARAM_ID_AROD 0x00010764 -#define DOLBY_PARAM_ID_ARTP 0x00010765 -#define DOLBY_PARAM_ID_VMON 0x00010756 -#define DOLBY_PARAM_ID_VMB 0x00010757 -#define DOLBY_PARAM_ID_VCNB 0x00010733 -#define DOLBY_PARAM_ID_VCBF 0x00010734 -#define DOLBY_PARAM_ID_PREG 0x00010728 -#define DOLBY_PARAM_ID_VEN 0x00010732 -#define DOLBY_PARAM_ID_PSTG 0x00010729 -#define DOLBY_PARAM_ID_INIT_ENDP 0x00010727 - -/* Not Used with Set Param kcontrol, only to query using Get Param */ -#define DOLBY_PARAM_ID_VER 0x00010726 - -#define DOLBY_PARAM_ID_VCBG 0x00010730 -#define DOLBY_PARAM_ID_VCBE 0x00010731 - -/* DOLBY DAP control params */ -#define DOLBY_COMMIT_ALL_TO_DSP 0x70000001 -#define DOLBY_COMMIT_TO_DSP 0x70000002 -#define DOLBY_USE_CACHE 0x70000003 -#define DOLBY_AUTO_ENDP 0x70000004 -#define DOLBY_AUTO_ENDDEP_PARAMS 0x70000005 -#define DOLBY_DAP_BYPASS 0x70000006 - -#define DOLBY_ENABLE_CUSTOM_STEREO 0x000108c7 - -/* DOLBY DAP offsets start */ -#define DOLBY_PARAM_VDHE_LENGTH 1 -#define DOLBY_PARAM_VDHE_OFFSET 0 -#define DOLBY_PARAM_VSPE_LENGTH 1 -#define DOLBY_PARAM_VSPE_OFFSET (DOLBY_PARAM_VDHE_OFFSET + \ - DOLBY_PARAM_VDHE_LENGTH) -#define DOLBY_PARAM_DSSF_LENGTH 1 -#define DOLBY_PARAM_DSSF_OFFSET (DOLBY_PARAM_VSPE_OFFSET + \ - DOLBY_PARAM_VSPE_LENGTH) -#define DOLBY_PARAM_DVLI_LENGTH 1 -#define DOLBY_PARAM_DVLI_OFFSET (DOLBY_PARAM_DSSF_OFFSET + \ - DOLBY_PARAM_DSSF_LENGTH) -#define DOLBY_PARAM_DVLO_LENGTH 1 -#define DOLBY_PARAM_DVLO_OFFSET (DOLBY_PARAM_DVLI_OFFSET + \ - DOLBY_PARAM_DVLI_LENGTH) -#define DOLBY_PARAM_DVLE_LENGTH 1 -#define DOLBY_PARAM_DVLE_OFFSET (DOLBY_PARAM_DVLO_OFFSET + \ - DOLBY_PARAM_DVLO_LENGTH) -#define DOLBY_PARAM_DVMC_LENGTH 1 -#define DOLBY_PARAM_DVMC_OFFSET (DOLBY_PARAM_DVLE_OFFSET + \ - DOLBY_PARAM_DVLE_LENGTH) -#define DOLBY_PARAM_DVME_LENGTH 1 -#define DOLBY_PARAM_DVME_OFFSET (DOLBY_PARAM_DVMC_OFFSET + \ - DOLBY_PARAM_DVMC_LENGTH) -#define DOLBY_PARAM_IENB_LENGTH 1 -#define DOLBY_PARAM_IENB_OFFSET (DOLBY_PARAM_DVME_OFFSET + \ - DOLBY_PARAM_DVME_LENGTH) -#define DOLBY_PARAM_IEBF_LENGTH 40 -#define DOLBY_PARAM_IEBF_OFFSET (DOLBY_PARAM_IENB_OFFSET + \ - DOLBY_PARAM_IENB_LENGTH) -#define DOLBY_PARAM_IEON_LENGTH 1 -#define DOLBY_PARAM_IEON_OFFSET (DOLBY_PARAM_IEBF_OFFSET + \ - DOLBY_PARAM_IEBF_LENGTH) -#define DOLBY_PARAM_DEON_LENGTH 1 -#define DOLBY_PARAM_DEON_OFFSET (DOLBY_PARAM_IEON_OFFSET + \ - DOLBY_PARAM_IEON_LENGTH) -#define DOLBY_PARAM_NGON_LENGTH 1 -#define DOLBY_PARAM_NGON_OFFSET (DOLBY_PARAM_DEON_OFFSET + \ - DOLBY_PARAM_DEON_LENGTH) -#define DOLBY_PARAM_GEON_LENGTH 1 -#define DOLBY_PARAM_GEON_OFFSET (DOLBY_PARAM_NGON_OFFSET + \ - DOLBY_PARAM_NGON_LENGTH) -#define DOLBY_PARAM_GENB_LENGTH 1 -#define DOLBY_PARAM_GENB_OFFSET (DOLBY_PARAM_GEON_OFFSET + \ - DOLBY_PARAM_GEON_LENGTH) -#define DOLBY_PARAM_GEBF_LENGTH 40 -#define DOLBY_PARAM_GEBF_OFFSET (DOLBY_PARAM_GENB_OFFSET + \ - DOLBY_PARAM_GENB_LENGTH) -#define DOLBY_PARAM_AONB_LENGTH 1 -#define DOLBY_PARAM_AONB_OFFSET (DOLBY_PARAM_GEBF_OFFSET + \ - DOLBY_PARAM_GEBF_LENGTH) -#define DOLBY_PARAM_AOBF_LENGTH 40 -#define DOLBY_PARAM_AOBF_OFFSET (DOLBY_PARAM_AONB_OFFSET + \ - DOLBY_PARAM_AONB_LENGTH) -#define DOLBY_PARAM_AOBG_LENGTH 329 -#define DOLBY_PARAM_AOBG_OFFSET (DOLBY_PARAM_AOBF_OFFSET + \ - DOLBY_PARAM_AOBF_LENGTH) -#define DOLBY_PARAM_AOON_LENGTH 1 -#define DOLBY_PARAM_AOON_OFFSET (DOLBY_PARAM_AOBG_OFFSET + \ - DOLBY_PARAM_AOBG_LENGTH) -#define DOLBY_PARAM_ARNB_LENGTH 1 -#define DOLBY_PARAM_ARNB_OFFSET (DOLBY_PARAM_AOON_OFFSET + \ - DOLBY_PARAM_AOON_LENGTH) -#define DOLBY_PARAM_ARBF_LENGTH 40 -#define DOLBY_PARAM_ARBF_OFFSET (DOLBY_PARAM_ARNB_OFFSET + \ - DOLBY_PARAM_ARNB_LENGTH) -#define DOLBY_PARAM_PLB_LENGTH 1 -#define DOLBY_PARAM_PLB_OFFSET (DOLBY_PARAM_ARBF_OFFSET + \ - DOLBY_PARAM_ARBF_LENGTH) -#define DOLBY_PARAM_PLMD_LENGTH 1 -#define DOLBY_PARAM_PLMD_OFFSET (DOLBY_PARAM_PLB_OFFSET + \ - DOLBY_PARAM_PLB_LENGTH) -#define DOLBY_PARAM_DHSB_LENGTH 1 -#define DOLBY_PARAM_DHSB_OFFSET (DOLBY_PARAM_PLMD_OFFSET + \ - DOLBY_PARAM_PLMD_LENGTH) -#define DOLBY_PARAM_DHRG_LENGTH 1 -#define DOLBY_PARAM_DHRG_OFFSET (DOLBY_PARAM_DHSB_OFFSET + \ - DOLBY_PARAM_DHSB_LENGTH) -#define DOLBY_PARAM_DSSB_LENGTH 1 -#define DOLBY_PARAM_DSSB_OFFSET (DOLBY_PARAM_DHRG_OFFSET + \ - DOLBY_PARAM_DHRG_LENGTH) -#define DOLBY_PARAM_DSSA_LENGTH 1 -#define DOLBY_PARAM_DSSA_OFFSET (DOLBY_PARAM_DSSB_OFFSET + \ - DOLBY_PARAM_DSSB_LENGTH) -#define DOLBY_PARAM_DVLA_LENGTH 1 -#define DOLBY_PARAM_DVLA_OFFSET (DOLBY_PARAM_DSSA_OFFSET + \ - DOLBY_PARAM_DSSA_LENGTH) -#define DOLBY_PARAM_IEBT_LENGTH 40 -#define DOLBY_PARAM_IEBT_OFFSET (DOLBY_PARAM_DVLA_OFFSET + \ - DOLBY_PARAM_DVLA_LENGTH) -#define DOLBY_PARAM_IEA_LENGTH 1 -#define DOLBY_PARAM_IEA_OFFSET (DOLBY_PARAM_IEBT_OFFSET + \ - DOLBY_PARAM_IEBT_LENGTH) -#define DOLBY_PARAM_DEA_LENGTH 1 -#define DOLBY_PARAM_DEA_OFFSET (DOLBY_PARAM_IEA_OFFSET + \ - DOLBY_PARAM_IEA_LENGTH) -#define DOLBY_PARAM_DED_LENGTH 1 -#define DOLBY_PARAM_DED_OFFSET (DOLBY_PARAM_DEA_OFFSET + \ - DOLBY_PARAM_DEA_LENGTH) -#define DOLBY_PARAM_GEBG_LENGTH 40 -#define DOLBY_PARAM_GEBG_OFFSET (DOLBY_PARAM_DED_OFFSET + \ - DOLBY_PARAM_DED_LENGTH) -#define DOLBY_PARAM_AOCC_LENGTH 1 -#define DOLBY_PARAM_AOCC_OFFSET (DOLBY_PARAM_GEBG_OFFSET + \ - DOLBY_PARAM_GEBG_LENGTH) -#define DOLBY_PARAM_ARBI_LENGTH 40 -#define DOLBY_PARAM_ARBI_OFFSET (DOLBY_PARAM_AOCC_OFFSET + \ - DOLBY_PARAM_AOCC_LENGTH) -#define DOLBY_PARAM_ARBL_LENGTH 40 -#define DOLBY_PARAM_ARBL_OFFSET (DOLBY_PARAM_ARBI_OFFSET + \ - DOLBY_PARAM_ARBI_LENGTH) -#define DOLBY_PARAM_ARBH_LENGTH 40 -#define DOLBY_PARAM_ARBH_OFFSET (DOLBY_PARAM_ARBL_OFFSET + \ - DOLBY_PARAM_ARBL_LENGTH) -#define DOLBY_PARAM_AROD_LENGTH 1 -#define DOLBY_PARAM_AROD_OFFSET (DOLBY_PARAM_ARBH_OFFSET + \ - DOLBY_PARAM_ARBH_LENGTH) -#define DOLBY_PARAM_ARTP_LENGTH 1 -#define DOLBY_PARAM_ARTP_OFFSET (DOLBY_PARAM_AROD_OFFSET + \ - DOLBY_PARAM_AROD_LENGTH) -#define DOLBY_PARAM_VMON_LENGTH 1 -#define DOLBY_PARAM_VMON_OFFSET (DOLBY_PARAM_ARTP_OFFSET + \ - DOLBY_PARAM_ARTP_LENGTH) -#define DOLBY_PARAM_VMB_LENGTH 1 -#define DOLBY_PARAM_VMB_OFFSET (DOLBY_PARAM_VMON_OFFSET + \ - DOLBY_PARAM_VMON_LENGTH) -#define DOLBY_PARAM_VCNB_LENGTH 1 -#define DOLBY_PARAM_VCNB_OFFSET (DOLBY_PARAM_VMB_OFFSET + \ - DOLBY_PARAM_VMB_LENGTH) -#define DOLBY_PARAM_VCBF_LENGTH 20 -#define DOLBY_PARAM_VCBF_OFFSET (DOLBY_PARAM_VCNB_OFFSET + \ - DOLBY_PARAM_VCNB_LENGTH) -#define DOLBY_PARAM_PREG_LENGTH 1 -#define DOLBY_PARAM_PREG_OFFSET (DOLBY_PARAM_VCBF_OFFSET + \ - DOLBY_PARAM_VCBF_LENGTH) -#define DOLBY_PARAM_VEN_LENGTH 1 -#define DOLBY_PARAM_VEN_OFFSET (DOLBY_PARAM_PREG_OFFSET + \ - DOLBY_PARAM_PREG_LENGTH) -#define DOLBY_PARAM_PSTG_LENGTH 1 -#define DOLBY_PARAM_PSTG_OFFSET (DOLBY_PARAM_VEN_OFFSET + \ - DOLBY_PARAM_VEN_LENGTH) - -#define DOLBY_PARAM_INT_ENDP_LENGTH 1 -#define DOLBY_PARAM_PAYLOAD_SIZE 3 -#define DOLBY_MAX_LENGTH_INDIVIDUAL_PARAM 329 - -#define TOTAL_LENGTH_DOLBY_PARAM 745 -#define DOLBY_VIS_PARAM_HEADER_SIZE 25 -#define DOLBY_PARAM_VCNB_MAX_LENGTH 40 - -#define DOLBY_INVALID_PORT_ID -1 - -enum { - DEVICE_NONE = 0x0, - /* output devices */ - EARPIECE = 0x1, - SPEAKER = 0x2, - WIRED_HEADSET = 0x4, - WIRED_HEADPHONE = 0x8, - BLUETOOTH_SCO = 0x10, - BLUETOOTH_SCO_HEADSET = 0x20, - BLUETOOTH_SCO_CARKIT = 0x40, - BLUETOOTH_A2DP = 0x80, - BLUETOOTH_A2DP_HEADPHONES = 0x100, - BLUETOOTH_A2DP_SPEAKER = 0x200, - AUX_DIGITAL = 0x400, - ANLG_DOCK_HEADSET = 0x800, - DGTL_DOCK_HEADSET = 0x1000, - USB_ACCESSORY = 0x2000, - USB_DEVICE = 0x4000, - REMOTE_SUBMIX = 0x8000, - ANC_HEADSET = 0x10000, - ANC_HEADPHONE = 0x20000, - PROXY = 0x2000000, - FM = 0x100000, - FM_TX = 0x1000000, - DEVICE_OUT_DEFAULT = 0x40000000, - DEVICE_OUT_ALL = 0x403FFFFF, -}; -#endif diff --git a/techpack/audio/asoc/msm-dolby-dap-config.h b/techpack/audio/asoc/msm-dolby-dap-config.h deleted file mode 100644 index b2b713907130..000000000000 --- a/techpack/audio/asoc/msm-dolby-dap-config.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2013-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_DOLBY_DAP_CONFIG_H_ -#define _MSM_DOLBY_DAP_CONFIG_H_ - -#include -#include "msm-dolby-common.h" - -#ifdef CONFIG_DOLBY_DAP -/* DOLBY DOLBY GUIDS */ -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0x0001033B -#define NUM_DOLBY_ENDP_DEVICE 23 - -#define DOLBY_NUM_ENDP_DEPENDENT_PARAMS 3 -#define DOLBY_ENDDEP_PARAM_DVLO_OFFSET 0 -#define DOLBY_ENDDEP_PARAM_DVLO_LENGTH 1 -#define DOLBY_ENDDEP_PARAM_DVLI_OFFSET (DOLBY_ENDDEP_PARAM_DVLO_OFFSET + \ - DOLBY_ENDDEP_PARAM_DVLO_LENGTH) -#define DOLBY_ENDDEP_PARAM_DVLI_LENGTH 1 -#define DOLBY_ENDDEP_PARAM_VMB_OFFSET (DOLBY_ENDDEP_PARAM_DVLI_OFFSET + \ - DOLBY_ENDDEP_PARAM_DVLI_LENGTH) -#define DOLBY_ENDDEP_PARAM_VMB_LENGTH 1 -#define DOLBY_ENDDEP_PARAM_LENGTH (DOLBY_ENDDEP_PARAM_DVLO_LENGTH + \ - DOLBY_ENDDEP_PARAM_DVLI_LENGTH + DOLBY_ENDDEP_PARAM_VMB_LENGTH) - -#define MAX_DOLBY_PARAMS 47 -#define MAX_DOLBY_CTRL_PARAMS 5 -#define ALL_DOLBY_PARAMS (MAX_DOLBY_PARAMS + \ - MAX_DOLBY_CTRL_PARAMS) -#define DOLBY_COMMIT_ALL_IDX MAX_DOLBY_PARAMS -#define DOLBY_COMMIT_IDX (MAX_DOLBY_PARAMS+1) -#define DOLBY_USE_CACHE_IDX (MAX_DOLBY_PARAMS+2) -#define DOLBY_AUTO_ENDP_IDX (MAX_DOLBY_PARAMS+3) -#define DOLBY_AUTO_ENDDEP_IDX (MAX_DOLBY_PARAMS+4) - -/* DOLBY device definitions */ -enum { - DOLBY_ENDP_INT_SPEAKERS = 0, - DOLBY_ENDP_EXT_SPEAKERS, - DOLBY_ENDP_HEADPHONES, - DOLBY_ENDP_HDMI, - DOLBY_ENDP_SPDIF, - DOLBY_ENDP_DLNA, - DOLBY_ENDP_ANALOG, -}; - -/* DOLBY device definitions end */ - -struct dolby_dap_params { - uint32_t value[TOTAL_LENGTH_DOLBY_PARAM + MAX_DOLBY_PARAMS]; -} __packed; - -int msm_dolby_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on); -void msm_dolby_dap_deinit(int port_id); -void msm_dolby_dap_add_controls(struct snd_soc_platform *platform); -int dolby_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled); -/* Dolby DOLBY end */ -#else -int msm_dolby_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on) -{ - return 0; -} -void msm_dolby_dap_deinit(int port_id) { } -void msm_dolby_dap_add_controls(struct snd_soc_platform *platform) { } -int dolby_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled) -{ - return 0; -} -#endif - -#endif diff --git a/techpack/audio/asoc/msm-ds2-dap-config.c b/techpack/audio/asoc/msm-ds2-dap-config.c deleted file mode 100644 index ad7a3c6a406f..000000000000 --- a/techpack/audio/asoc/msm-ds2-dap-config.c +++ /dev/null @@ -1,2204 +0,0 @@ -/* - * Copyright (c) 2013-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "msm-ds2-dap-config.h" -#include "msm-pcm-routing-v2.h" - - -/* ramp up/down for 30ms */ -#define DOLBY_SOFT_VOLUME_PERIOD 40 -/* Step value 0ms or 0us */ -#define DOLBY_SOFT_VOLUME_STEP 1000 -#define DOLBY_ADDITIONAL_RAMP_WAIT 10 -#define SOFT_VOLUME_PARAM_SIZE 3 -#define PARAM_PAYLOAD_SIZE 3 - -enum { - DOLBY_SOFT_VOLUME_CURVE_LINEAR = 0, - DOLBY_SOFT_VOLUME_CURVE_EXP, - DOLBY_SOFT_VOLUME_CURVE_LOG, -}; - -#define VOLUME_ZERO_GAIN 0x0 -#define VOLUME_UNITY_GAIN 0x2000 -/* Wait time for module enable/disble */ -#define DOLBY_MODULE_ENABLE_PERIOD 50 - -/* DOLBY device definitions end */ -enum { - DOLBY_OFF_CACHE = 0, - DOLBY_SPEAKER_CACHE, - DOLBY_HEADPHONE_CACHE, - DOLBY_HDMI_CACHE, - DOLBY_WFD_CACHE, - DOLBY_FM_CACHE, - DOLBY_MAX_CACHE, -}; - -enum { - DAP_SOFT_BYPASS = 0, - DAP_HARD_BYPASS, -}; - -enum { - MODULE_DISABLE = 0, - MODULE_ENABLE, -}; -/* dolby param ids to/from dsp */ -static uint32_t ds2_dap_params_id[MAX_DS2_PARAMS] = { - DOLBY_PARAM_ID_VDHE, DOLBY_PARAM_ID_VSPE, DOLBY_PARAM_ID_DSSF, - DOLBY_PARAM_ID_DVLI, DOLBY_PARAM_ID_DVLO, DOLBY_PARAM_ID_DVLE, - DOLBY_PARAM_ID_DVMC, DOLBY_PARAM_ID_DVME, DOLBY_PARAM_ID_IENB, - DOLBY_PARAM_ID_IEBF, DOLBY_PARAM_ID_IEON, DOLBY_PARAM_ID_DEON, - DOLBY_PARAM_ID_NGON, DOLBY_PARAM_ID_GEON, DOLBY_PARAM_ID_GENB, - DOLBY_PARAM_ID_GEBF, DOLBY_PARAM_ID_AONB, DOLBY_PARAM_ID_AOBF, - DOLBY_PARAM_ID_AOBG, DOLBY_PARAM_ID_AOON, DOLBY_PARAM_ID_ARNB, - DOLBY_PARAM_ID_ARBF, DOLBY_PARAM_ID_PLB, DOLBY_PARAM_ID_PLMD, - DOLBY_PARAM_ID_DHSB, DOLBY_PARAM_ID_DHRG, DOLBY_PARAM_ID_DSSB, - DOLBY_PARAM_ID_DSSA, DOLBY_PARAM_ID_DVLA, DOLBY_PARAM_ID_IEBT, - DOLBY_PARAM_ID_IEA, DOLBY_PARAM_ID_DEA, DOLBY_PARAM_ID_DED, - DOLBY_PARAM_ID_GEBG, DOLBY_PARAM_ID_AOCC, DOLBY_PARAM_ID_ARBI, - DOLBY_PARAM_ID_ARBL, DOLBY_PARAM_ID_ARBH, DOLBY_PARAM_ID_AROD, - DOLBY_PARAM_ID_ARTP, DOLBY_PARAM_ID_VMON, DOLBY_PARAM_ID_VMB, - DOLBY_PARAM_ID_VCNB, DOLBY_PARAM_ID_VCBF, DOLBY_PARAM_ID_PREG, - DOLBY_PARAM_ID_VEN, DOLBY_PARAM_ID_PSTG, DOLBY_PARAM_ID_INIT_ENDP, -}; - -/* modifed state: 0x00000000 - Not updated - * > 0x00000000 && < 0x00010000 - * Updated and not committed to DSP - * 0x00010001 - Updated and committed to DSP - * > 0x00010001 - Modified the committed value - */ -/* param offset */ -static uint32_t ds2_dap_params_offset[MAX_DS2_PARAMS] = { - DOLBY_PARAM_VDHE_OFFSET, DOLBY_PARAM_VSPE_OFFSET, - DOLBY_PARAM_DSSF_OFFSET, DOLBY_PARAM_DVLI_OFFSET, - DOLBY_PARAM_DVLO_OFFSET, DOLBY_PARAM_DVLE_OFFSET, - DOLBY_PARAM_DVMC_OFFSET, DOLBY_PARAM_DVME_OFFSET, - DOLBY_PARAM_IENB_OFFSET, DOLBY_PARAM_IEBF_OFFSET, - DOLBY_PARAM_IEON_OFFSET, DOLBY_PARAM_DEON_OFFSET, - DOLBY_PARAM_NGON_OFFSET, DOLBY_PARAM_GEON_OFFSET, - DOLBY_PARAM_GENB_OFFSET, DOLBY_PARAM_GEBF_OFFSET, - DOLBY_PARAM_AONB_OFFSET, DOLBY_PARAM_AOBF_OFFSET, - DOLBY_PARAM_AOBG_OFFSET, DOLBY_PARAM_AOON_OFFSET, - DOLBY_PARAM_ARNB_OFFSET, DOLBY_PARAM_ARBF_OFFSET, - DOLBY_PARAM_PLB_OFFSET, DOLBY_PARAM_PLMD_OFFSET, - DOLBY_PARAM_DHSB_OFFSET, DOLBY_PARAM_DHRG_OFFSET, - DOLBY_PARAM_DSSB_OFFSET, DOLBY_PARAM_DSSA_OFFSET, - DOLBY_PARAM_DVLA_OFFSET, DOLBY_PARAM_IEBT_OFFSET, - DOLBY_PARAM_IEA_OFFSET, DOLBY_PARAM_DEA_OFFSET, - DOLBY_PARAM_DED_OFFSET, DOLBY_PARAM_GEBG_OFFSET, - DOLBY_PARAM_AOCC_OFFSET, DOLBY_PARAM_ARBI_OFFSET, - DOLBY_PARAM_ARBL_OFFSET, DOLBY_PARAM_ARBH_OFFSET, - DOLBY_PARAM_AROD_OFFSET, DOLBY_PARAM_ARTP_OFFSET, - DOLBY_PARAM_VMON_OFFSET, DOLBY_PARAM_VMB_OFFSET, - DOLBY_PARAM_VCNB_OFFSET, DOLBY_PARAM_VCBF_OFFSET, - DOLBY_PARAM_PREG_OFFSET, DOLBY_PARAM_VEN_OFFSET, - DOLBY_PARAM_PSTG_OFFSET, DOLBY_PARAM_INT_ENDP_OFFSET, -}; -/* param_length */ -static uint32_t ds2_dap_params_length[MAX_DS2_PARAMS] = { - DOLBY_PARAM_VDHE_LENGTH, DOLBY_PARAM_VSPE_LENGTH, - DOLBY_PARAM_DSSF_LENGTH, DOLBY_PARAM_DVLI_LENGTH, - DOLBY_PARAM_DVLO_LENGTH, DOLBY_PARAM_DVLE_LENGTH, - DOLBY_PARAM_DVMC_LENGTH, DOLBY_PARAM_DVME_LENGTH, - DOLBY_PARAM_IENB_LENGTH, DOLBY_PARAM_IEBF_LENGTH, - DOLBY_PARAM_IEON_LENGTH, DOLBY_PARAM_DEON_LENGTH, - DOLBY_PARAM_NGON_LENGTH, DOLBY_PARAM_GEON_LENGTH, - DOLBY_PARAM_GENB_LENGTH, DOLBY_PARAM_GEBF_LENGTH, - DOLBY_PARAM_AONB_LENGTH, DOLBY_PARAM_AOBF_LENGTH, - DOLBY_PARAM_AOBG_LENGTH, DOLBY_PARAM_AOON_LENGTH, - DOLBY_PARAM_ARNB_LENGTH, DOLBY_PARAM_ARBF_LENGTH, - DOLBY_PARAM_PLB_LENGTH, DOLBY_PARAM_PLMD_LENGTH, - DOLBY_PARAM_DHSB_LENGTH, DOLBY_PARAM_DHRG_LENGTH, - DOLBY_PARAM_DSSB_LENGTH, DOLBY_PARAM_DSSA_LENGTH, - DOLBY_PARAM_DVLA_LENGTH, DOLBY_PARAM_IEBT_LENGTH, - DOLBY_PARAM_IEA_LENGTH, DOLBY_PARAM_DEA_LENGTH, - DOLBY_PARAM_DED_LENGTH, DOLBY_PARAM_GEBG_LENGTH, - DOLBY_PARAM_AOCC_LENGTH, DOLBY_PARAM_ARBI_LENGTH, - DOLBY_PARAM_ARBL_LENGTH, DOLBY_PARAM_ARBH_LENGTH, - DOLBY_PARAM_AROD_LENGTH, DOLBY_PARAM_ARTP_LENGTH, - DOLBY_PARAM_VMON_LENGTH, DOLBY_PARAM_VMB_LENGTH, - DOLBY_PARAM_VCNB_LENGTH, DOLBY_PARAM_VCBF_LENGTH, - DOLBY_PARAM_PREG_LENGTH, DOLBY_PARAM_VEN_LENGTH, - DOLBY_PARAM_PSTG_LENGTH, DOLBY_PARAM_INT_ENDP_LENGTH, -}; - -struct ds2_dap_params_s { - int32_t params_val[TOTAL_LENGTH_DS2_PARAM]; - int32_t dap_params_modified[MAX_DS2_PARAMS]; -}; - -struct audio_rx_cal_data { - char aud_proc_data[AUD_PROC_BLOCK_SIZE]; - int32_t aud_proc_size; - char aud_vol_data[AUD_VOL_BLOCK_SIZE]; - int32_t aud_vol_size; -}; - -static struct ds2_dap_params_s ds2_dap_params[DOLBY_MAX_CACHE]; - -struct ds2_device_mapping { - int32_t device_id; /* audio_out_... */ - int port_id; /* afe port. constant for a target variant. routing-v2*/ - /*Only one Dolby COPP for a specific port*/ - int copp_idx; /* idx for the copp port on which ds2 is active */ - int cache_dev; /* idx to a shared parameter array dependent on device*/ - uint32_t stream_ref_count; - bool active; - void *cal_data; -}; - -static struct ds2_device_mapping dev_map[DS2_DEVICES_ALL]; - -struct ds2_dap_params_states_s { - bool use_cache; - bool dap_bypass; - bool dap_bypass_type; - bool node_opened; - int32_t device; - bool custom_stereo_onoff; -}; - -static struct ds2_dap_params_states_s ds2_dap_params_states = {true, false, - false, DEVICE_NONE}; - -static int all_supported_devices = EARPIECE|SPEAKER|WIRED_HEADSET| - WIRED_HEADPHONE|BLUETOOTH_SCO|AUX_DIGITAL| - ANLG_DOCK_HEADSET|DGTL_DOCK_HEADSET| - REMOTE_SUBMIX|ANC_HEADSET|ANC_HEADPHONE| - PROXY|FM|FM_TX|DEVICE_NONE| - BLUETOOTH_SCO_HEADSET|BLUETOOTH_SCO_CARKIT; - - -static void msm_ds2_dap_check_and_update_ramp_wait(int port_id, int copp_idx, - int *ramp_wait) -{ - - int32_t *update_params_value = NULL; - uint32_t params_length = SOFT_VOLUME_PARAM_SIZE * sizeof(uint32_t); - uint32_t param_payload_len = PARAM_PAYLOAD_SIZE * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - int rc = 0; - - update_params_value = kzalloc(params_length + param_payload_len, - GFP_KERNEL); - if (!update_params_value) { - pr_err("%s: params memory alloc failed\n", __func__); - goto end; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOL_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS; - param_hdr.param_size = params_length + param_payload_len; - rc = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, (char *) update_params_value); - if (rc == 0) { - pr_debug("%s: params_value [0x%x, 0x%x, 0x%x]\n", - __func__, update_params_value[0], - update_params_value[1], - update_params_value[2]); - *ramp_wait = update_params_value[0]; - } -end: - kfree(update_params_value); - /* - * No error returned as we do not need to error out from dap on/dap - * bypass. The default ramp parameter will be used to wait during - * ramp down. - */ -} - -static int msm_ds2_dap_set_vspe_vdhe(int dev_map_idx, - bool is_custom_stereo_enabled) -{ - u8 *packed_param_data = NULL; - u8 *param_data = NULL; - struct param_hdr_v3 param_hdr; - u32 packed_param_size = 0; - u32 param_size = 0; - int cdev; - int rc = 0; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: Invalid port id\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].port_id != SLIMBUS_0_RX) && - (dev_map[dev_map_idx].port_id != RT_PROXY_PORT_001_RX)) { - pr_debug("%s:No Custom stereo for port:0x%x\n", - __func__, dev_map[dev_map_idx].port_id); - goto end; - } - - /* Allocate the max space needed */ - packed_param_size = (TOTAL_LENGTH_DOLBY_PARAM * sizeof(uint32_t)) + - (2 * sizeof(union param_hdrs)); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - - packed_param_size = 0; - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* Set common values */ - cdev = dev_map[dev_map_idx].cache_dev; - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - - /* Pack VDHE header + data */ - param_hdr.param_id = DOLBY_PARAM_ID_VDHE; - param_size = DOLBY_PARAM_VDHE_LENGTH * sizeof(uint32_t); - param_hdr.param_size = param_size; - - if (is_custom_stereo_enabled) - param_data = NULL; - else - param_data = (u8 *) &ds2_dap_params[cdev] - .params_val[DOLBY_PARAM_VDHE_OFFSET]; - - rc = q6common_pack_pp_params(packed_param_data, ¶m_hdr, param_data, - ¶m_size); - if (rc) { - pr_err("%s: Failed to pack params for dolby vdhe, error %d\n", - __func__, rc); - goto end; - } - packed_param_size += param_size; - - /* Pack VSPE header + data */ - param_hdr.param_id = DOLBY_PARAM_ID_VSPE; - param_size = DOLBY_PARAM_VSPE_LENGTH * sizeof(uint32_t); - param_hdr.param_size = param_size; - - if (is_custom_stereo_enabled) - param_data = NULL; - else - param_data = (u8 *) &ds2_dap_params[cdev] - .params_val[DOLBY_PARAM_VSPE_OFFSET]; - - rc = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, param_data, ¶m_size); - if (rc) { - pr_err("%s: Failed to pack params for dolby vspe, error %d\n", - __func__, rc); - goto end; - } - packed_param_size += param_size; - - rc = adm_set_pp_params(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, NULL, - packed_param_data, packed_param_size); - if (rc) { - pr_err("%s: send vdhe/vspe params failed with rc=%d\n", - __func__, rc); - rc = -EINVAL; - goto end; - } -end: - kfree(packed_param_data); - return rc; -} - -int qti_set_custom_stereo_on(int port_id, int copp_idx, - bool is_custom_stereo_on) -{ - struct custom_stereo_param custom_stereo; - struct param_hdr_v3 param_hdr; - uint16_t op_FL_ip_FL_weight; - uint16_t op_FL_ip_FR_weight; - uint16_t op_FR_ip_FL_weight; - uint16_t op_FR_ip_FR_weight; - int rc = 0; - - if ((port_id != SLIMBUS_0_RX) && - (port_id != RT_PROXY_PORT_001_RX)) { - pr_debug("%s:No Custom stereo for port:0x%x\n", - __func__, port_id); - return 0; - } - - memset(&custom_stereo, 0, sizeof(custom_stereo)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - pr_debug("%s: port 0x%x, copp_idx %d, is_custom_stereo_on %d\n", - __func__, port_id, copp_idx, is_custom_stereo_on); - if (is_custom_stereo_on) { - op_FL_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FL_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - } else { - op_FL_ip_FL_weight = Q14_GAIN_UNITY; - op_FL_ip_FR_weight = 0; - op_FR_ip_FL_weight = 0; - op_FR_ip_FR_weight = Q14_GAIN_UNITY; - } - - param_hdr.module_id = MTMX_MODULE_ID_DEFAULT_CHMIXER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DEFAULT_CHMIXER_PARAM_ID_COEFF; - param_hdr.param_size = sizeof(struct custom_stereo_param); - - /* index is 32-bit param in little endian*/ - custom_stereo.index = CUSTOM_STEREO_INDEX_PARAM; - custom_stereo.reserved = 0; - /* for stereo mixing num out ch*/ - custom_stereo.num_out_ch = CUSTOM_STEREO_NUM_OUT_CH; - /* for stereo mixing num in ch*/ - custom_stereo.num_in_ch = CUSTOM_STEREO_NUM_IN_CH; - - /* Out ch map FL/FR*/ - custom_stereo.out_fl = PCM_CHANNEL_FL; - custom_stereo.out_fr = PCM_CHANNEL_FR; - - /* In ch map FL/FR*/ - custom_stereo.in_fl = PCM_CHANNEL_FL; - custom_stereo.in_fr = PCM_CHANNEL_FR; - - /* weighting coefficients as name suggests, - * mixing will be done according to these coefficients - */ - custom_stereo.op_FL_ip_FL_weight = op_FL_ip_FL_weight; - custom_stereo.op_FL_ip_FR_weight = op_FL_ip_FR_weight; - custom_stereo.op_FR_ip_FL_weight = op_FR_ip_FL_weight; - custom_stereo.op_FR_ip_FR_weight = op_FR_ip_FR_weight; - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (u8 *) &custom_stereo); - if (rc) { - pr_err("%s: send params failed rc=%d\n", __func__, rc); - return -EINVAL; - } - - return 0; -} -static int dap_set_custom_stereo_onoff(int dev_map_idx, - bool is_custom_stereo_enabled) -{ - uint32_t enable = is_custom_stereo_enabled ? 1 : 0; - struct param_hdr_v3 param_hdr; - int rc = 0; - - if ((dev_map[dev_map_idx].port_id != SLIMBUS_0_RX) && - (dev_map[dev_map_idx].port_id != RT_PROXY_PORT_001_RX)) { - pr_debug("%s:No Custom stereo for port:0x%x\n", - __func__, dev_map[dev_map_idx].port_id); - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - rc = -EINVAL; - goto end; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* DAP custom stereo */ - msm_ds2_dap_set_vspe_vdhe(dev_map_idx, - is_custom_stereo_enabled); - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_ENABLE_CUSTOM_STEREO; - param_hdr.param_size = sizeof(enable); - - rc = adm_pack_and_set_one_pp_param(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - param_hdr, (u8 *) &enable); - if (rc) { - pr_err("%s: set custom stereo enable failed with rc=%d\n", - __func__, rc); - rc = -EINVAL; - } -end: - return rc; - -} - - -static int set_custom_stereo_onoff(int dev_map_idx, - bool is_custom_stereo_enabled) -{ - int rc = 0; - - pr_debug("%s: map index %d, custom stereo %d\n", __func__, dev_map_idx, - is_custom_stereo_enabled); - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port id\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: invalid copp idx\n", __func__); - rc = -EINVAL; - goto end; - } - - if (ds2_dap_params_states.dap_bypass == true && - ds2_dap_params_states.dap_bypass_type == DAP_HARD_BYPASS) { - - rc = qti_set_custom_stereo_on(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - is_custom_stereo_enabled); - if (rc < 0) { - pr_err("%s:qti_set_custom_stereo_on_copp failed C.S %d", - __func__, is_custom_stereo_enabled); - } - goto end; - - } - - if (ds2_dap_params_states.dap_bypass == false) { - rc = dap_set_custom_stereo_onoff(dev_map_idx, - is_custom_stereo_enabled); - if (rc < 0) { - pr_err("%s:qti_set_custom_stereo_on_copp failed C.S %d", - __func__, is_custom_stereo_enabled); - } - goto end; - } -end: - return rc; -} - -static int msm_ds2_dap_alloc_and_store_cal_data(int dev_map_idx, int path, - int perf_mode) -{ - int rc = 0; - struct audio_rx_cal_data *aud_cal_data; - - pr_debug("%s: path %d, perf_mode %d, dev_map_idx %d\n", - __func__, path, perf_mode, dev_map_idx); - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - aud_cal_data = kzalloc(sizeof(struct audio_rx_cal_data), GFP_KERNEL); - if (!aud_cal_data) { - rc = -ENOMEM; - goto end; - } - - rc = adm_store_cal_data(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, path, perf_mode, - ADM_AUDPROC_CAL, aud_cal_data->aud_proc_data, - &aud_cal_data->aud_proc_size); - if (rc < 0) { - pr_err("%s: store cal data err %d\n", __func__, rc); - kfree(aud_cal_data); - goto end; - } - - rc = adm_store_cal_data(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, path, perf_mode, - ADM_AUDVOL_CAL, aud_cal_data->aud_vol_data, - &aud_cal_data->aud_vol_size); - if (rc < 0) { - pr_err("%s: store cal data err %d\n", __func__, rc); - kfree(aud_cal_data); - goto end; - } - - dev_map[dev_map_idx].cal_data = (void *)aud_cal_data; - -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_ds2_dap_free_cal_data(int dev_map_idx) -{ - int rc = 0; - struct audio_rx_cal_data *aud_cal_data; - - pr_debug("%s: dev_map_idx %d\n", __func__, dev_map_idx); - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - aud_cal_data = (struct audio_rx_cal_data *) - dev_map[dev_map_idx].cal_data; - kfree(aud_cal_data); - dev_map[dev_map_idx].cal_data = NULL; - -end: - return rc; -} - -static int msm_ds2_dap_send_cal_data(int dev_map_idx) -{ - int rc = 0; - struct audio_rx_cal_data *aud_cal_data = NULL; - - pr_debug("%s: devmap index %d\n", __func__, dev_map_idx); - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - if (dev_map[dev_map_idx].cal_data == NULL) { - pr_err("%s: No valid calibration data stored for idx %d\n", - __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - /* send aud proc cal */ - aud_cal_data = (struct audio_rx_cal_data *) - dev_map[dev_map_idx].cal_data; - rc = adm_send_calibration(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - ADM_PATH_PLAYBACK, 0, - ADM_AUDPROC_CAL, - aud_cal_data->aud_proc_data, - aud_cal_data->aud_proc_size); - if (rc < 0) { - pr_err("%s: adm_send_calibration failed %d\n", __func__, rc); - goto end; - } - - /* send aud volume cal*/ - rc = adm_send_calibration(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - ADM_PATH_PLAYBACK, 0, - ADM_AUDVOL_CAL, - aud_cal_data->aud_vol_data, - aud_cal_data->aud_vol_size); - if (rc < 0) - pr_err("%s: adm_send_calibration failed %d\n", __func__, rc); -end: - pr_debug("%s: return %d\n", __func__, rc); - return rc; -} - -static inline int msm_ds2_dap_can_enable_module(int32_t module_id) -{ - if (module_id == MTMX_MODULE_ID_DEFAULT_CHMIXER || - module_id == AUDPROC_MODULE_ID_RESAMPLER || - module_id == AUDPROC_MODULE_ID_VOL_CTRL) { - return false; - } - return true; -} - -static int msm_ds2_dap_init_modules_in_topology(int dev_map_idx) -{ - int rc = 0, i = 0, port_id, copp_idx; - /* Account for 32 bit integer allocation */ - int32_t param_sz = - (ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH / sizeof(uint32_t)); - int32_t *update_param_val = NULL; - struct module_instance_info mod_inst_info; - int mod_inst_info_sz = 0; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - port_id = dev_map[dev_map_idx].port_id; - copp_idx = dev_map[dev_map_idx].copp_idx; - pr_debug("%s: port_id 0x%x copp_idx %d\n", __func__, port_id, copp_idx); - update_param_val = - kzalloc(ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, GFP_KERNEL); - if (!update_param_val) { - pr_err("%s, param memory alloc failed\n", __func__); - rc = -ENOMEM; - goto end; - } - - if (!ds2_dap_params_states.dap_bypass) { - /* get modules from dsp */ - rc = adm_get_pp_topo_module_list_v2( - port_id, copp_idx, - ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, - update_param_val); - if (rc < 0) { - pr_err("%s:topo list port %d, err %d,copp_idx %d\n", - __func__, port_id, copp_idx, rc); - goto end; - } - - if (update_param_val[0] > (param_sz - 1)) { - pr_err("%s:max modules exp/ret [%d: %d]\n", - __func__, (param_sz - 1), - update_param_val[0]); - rc = -EINVAL; - goto end; - } - - mod_inst_info_sz = sizeof(struct module_instance_info) / - sizeof(uint32_t); - /* Turn off modules */ - for (i = 1; i < update_param_val[0] * mod_inst_info_sz; - i += mod_inst_info_sz) { - if (!msm_ds2_dap_can_enable_module( - update_param_val[i]) || - (update_param_val[i] == DS2_MODULE_ID)) { - pr_debug("%s: Do not enable/disable %d\n", - __func__, update_param_val[i]); - continue; - } - - pr_debug("%s: param disable %d\n", - __func__, update_param_val[i]); - memcpy(&mod_inst_info, &update_param_val[i], - sizeof(mod_inst_info)); - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_DISABLE); - } - } else { - msm_ds2_dap_send_cal_data(dev_map_idx); - - } - - mod_inst_info.module_id = DS2_MODULE_ID; - mod_inst_info.instance_id = INSTANCE_ID_0; - adm_param_enable_v2(port_id, copp_idx, mod_inst_info, - !ds2_dap_params_states.dap_bypass); -end: - kfree(update_param_val); - return rc; -} - -static bool msm_ds2_dap_check_is_param_modified(int32_t *dap_params_modified, - int32_t idx, int32_t commit) -{ - if ((dap_params_modified[idx] == 0) || - (commit && - ((dap_params_modified[idx] & 0x00010000) && - ((dap_params_modified[idx] & 0x0000FFFF) <= 1)))) { - pr_debug("%s: not modified at idx %d\n", __func__, idx); - return false; - } - pr_debug("%s: modified at idx %d\n", __func__, idx); - return true; -} - -static int msm_ds2_dap_map_device_to_dolby_cache_devices(int32_t device_id) -{ - int32_t cache_dev = -1; - - switch (device_id) { - case DEVICE_NONE: - cache_dev = DOLBY_OFF_CACHE; - break; - case EARPIECE: - case SPEAKER: - cache_dev = DOLBY_SPEAKER_CACHE; - break; - case WIRED_HEADSET: - case WIRED_HEADPHONE: - case ANLG_DOCK_HEADSET: - case DGTL_DOCK_HEADSET: - case ANC_HEADSET: - case ANC_HEADPHONE: - case BLUETOOTH_SCO: - case BLUETOOTH_SCO_HEADSET: - case BLUETOOTH_SCO_CARKIT: - cache_dev = DOLBY_HEADPHONE_CACHE; - break; - case FM: - case FM_TX: - cache_dev = DOLBY_FM_CACHE; - break; - case AUX_DIGITAL: - cache_dev = DOLBY_HDMI_CACHE; - break; - case PROXY: - case REMOTE_SUBMIX: - cache_dev = DOLBY_WFD_CACHE; - break; - default: - pr_err("%s: invalid cache device\n", __func__); - } - pr_debug("%s: cache device %d\n", __func__, cache_dev); - return cache_dev; -} - -static int msm_ds2_dap_update_num_devices(struct dolby_param_data *dolby_data, - int32_t *num_device, int32_t *dev_arr, - int32_t array_size) -{ - int32_t idx = 0; - int supported_devices = 0; - - if (!array_size) { - pr_err("%s: array size zero\n", __func__); - return -EINVAL; - } - - if (dolby_data->device_id == DEVICE_OUT_ALL || - dolby_data->device_id == DEVICE_OUT_DEFAULT) - supported_devices = all_supported_devices; - else - supported_devices = dolby_data->device_id; - - if ((idx < array_size) && (supported_devices & EARPIECE)) - dev_arr[idx++] = EARPIECE; - if ((idx < array_size) && (supported_devices & SPEAKER)) - dev_arr[idx++] = SPEAKER; - if ((idx < array_size) && (supported_devices & WIRED_HEADSET)) - dev_arr[idx++] = WIRED_HEADSET; - if ((idx < array_size) && (supported_devices & WIRED_HEADPHONE)) - dev_arr[idx++] = WIRED_HEADPHONE; - if ((idx < array_size) && (supported_devices & BLUETOOTH_SCO)) - dev_arr[idx++] = BLUETOOTH_SCO; - if ((idx < array_size) && (supported_devices & BLUETOOTH_SCO_CARKIT)) - dev_arr[idx++] = BLUETOOTH_SCO_CARKIT; - if ((idx < array_size) && (supported_devices & BLUETOOTH_SCO_HEADSET)) - dev_arr[idx++] = BLUETOOTH_SCO_HEADSET; - if ((idx < array_size) && (supported_devices & AUX_DIGITAL)) - dev_arr[idx++] = AUX_DIGITAL; - if ((idx < array_size) && (supported_devices & ANLG_DOCK_HEADSET)) - dev_arr[idx++] = ANLG_DOCK_HEADSET; - if ((idx < array_size) && (supported_devices & DGTL_DOCK_HEADSET)) - dev_arr[idx++] = DGTL_DOCK_HEADSET; - if ((idx < array_size) && (supported_devices & REMOTE_SUBMIX)) - dev_arr[idx++] = REMOTE_SUBMIX; - if ((idx < array_size) && (supported_devices & ANC_HEADSET)) - dev_arr[idx++] = ANC_HEADSET; - if ((idx < array_size) && (supported_devices & ANC_HEADPHONE)) - dev_arr[idx++] = ANC_HEADPHONE; - if ((idx < array_size) && (supported_devices & PROXY)) - dev_arr[idx++] = PROXY; - if ((idx < array_size) && (supported_devices & FM)) - dev_arr[idx++] = FM; - if ((idx < array_size) && (supported_devices & FM_TX)) - dev_arr[idx++] = FM_TX; - /* CHECK device none separately */ - if ((idx < array_size) && (supported_devices == DEVICE_NONE)) - dev_arr[idx++] = DEVICE_NONE; - pr_debug("%s: dev id 0x%x, idx %d\n", __func__, - supported_devices, idx); - *num_device = idx; - return 0; -} - -static int msm_ds2_dap_get_port_id( - int32_t device_id, int32_t be_id) -{ - struct msm_pcm_routing_bdai_data bedais; - int port_id = DOLBY_INVALID_PORT_ID; - int port_type = 0; - - if (be_id < 0) { - port_id = -1; - goto end; - } - - msm_pcm_routing_get_bedai_info(be_id, &bedais); - pr_debug("%s: be port_id %d\n", __func__, bedais.port_id); - port_id = bedais.port_id; - port_type = afe_get_port_type(bedais.port_id); - if (port_type != MSM_AFE_PORT_TYPE_RX) - port_id = DOLBY_INVALID_PORT_ID; -end: - pr_debug("%s: device_id 0x%x, be_id %d, port_id %d\n", - __func__, device_id, be_id, port_id); - return port_id; -} - -static int msm_ds2_dap_update_dev_map_port_id(int32_t device_id, int port_id) -{ - int i; - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if (dev_map[i].device_id == device_id) - dev_map[i].port_id = port_id; - } - pr_debug("%s: port_id %d, device_id 0x%x\n", - __func__, port_id, device_id); - return 0; -} - -static int msm_ds2_dap_handle_bypass_wait(int port_id, int copp_idx, - int wait_time) -{ - int ret = 0; - - adm_set_wait_parameters(port_id, copp_idx); - msm_pcm_routing_release_lock(); - ret = adm_wait_timeout(port_id, copp_idx, wait_time); - msm_pcm_routing_acquire_lock(); - /* Reset the parameters if wait has timed out */ - if (ret == 0) - adm_reset_wait_parameters(port_id, copp_idx); - return ret; -} - -static int msm_ds2_dap_handle_bypass(struct dolby_param_data *dolby_data) -{ - int rc = 0, i = 0, j = 0; - /*Account for 32 bit integer allocation */ - int32_t param_sz = - (ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH / sizeof(uint32_t)); - int32_t *mod_list = NULL; - int port_id = 0, copp_idx = -1; - bool cs_onoff = ds2_dap_params_states.custom_stereo_onoff; - int ramp_wait = DOLBY_SOFT_VOLUME_PERIOD; - struct module_instance_info mod_inst_info; - int mod_inst_info_sz = 0; - - pr_debug("%s: bypass type %d bypass %d custom stereo %d\n", __func__, - ds2_dap_params_states.dap_bypass_type, - ds2_dap_params_states.dap_bypass, - ds2_dap_params_states.custom_stereo_onoff); - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - mod_list = - kzalloc(ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, GFP_KERNEL); - if (!mod_list) { - pr_err("%s: param memory alloc failed\n", __func__); - rc = -ENOMEM; - goto end; - } - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - pr_debug("%s: active dev %d\n", __func__, dev_map[i].active); - if (dev_map[i].active) { - port_id = dev_map[i].port_id; - copp_idx = dev_map[i].copp_idx; - - if (port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port\n", __func__); - rc = 0; - goto end; - } - - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = 0; - goto end; - } - - /* getmodules from dsp */ - rc = adm_get_pp_topo_module_list_v2( - port_id, copp_idx, - ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH, - mod_list); - if (rc < 0) { - pr_err("%s:adm get topo list port %d", - __func__, port_id); - pr_err("copp_idx %d, err %d\n", - copp_idx, rc); - goto end; - } - if (mod_list[0] > (param_sz - 1)) { - pr_err("%s:max modules exp/ret [%d: %d]\n", - __func__, (param_sz - 1), - mod_list[0]); - rc = -EINVAL; - goto end; - } - /* - * get ramp parameters - * check for change in ramp parameters - * update ramp wait - */ - msm_ds2_dap_check_and_update_ramp_wait(port_id, - copp_idx, - &ramp_wait); - - /* Mute before switching modules */ - rc = adm_set_volume(port_id, copp_idx, - VOLUME_ZERO_GAIN); - if (rc < 0) { - /* - * Not Fatal can continue bypass operations. - * Do not need to block playback - */ - pr_info("%s :Set volume port_id %d", - __func__, port_id); - pr_info("copp_idx %d, error %d\n", - copp_idx, rc); - } - - rc = msm_ds2_dap_handle_bypass_wait(port_id, copp_idx, - (ramp_wait + - DOLBY_ADDITIONAL_RAMP_WAIT)); - if (rc == -EINTR) { - pr_info("%s:bypass interrupted-ignore,port %d", - __func__, port_id); - pr_info("copp_idx %d\n", copp_idx); - rc = 0; - continue; - } - - /* if dap bypass is set */ - if (ds2_dap_params_states.dap_bypass) { - /* Turn off dap module */ - mod_inst_info.module_id = DS2_MODULE_ID; - mod_inst_info.instance_id = INSTANCE_ID_0; - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_DISABLE); - /* - * If custom stereo is on at the time of bypass, - * switch off custom stereo on dap and turn on - * custom stereo on qti channel mixer. - */ - if (cs_onoff) { - rc = dap_set_custom_stereo_onoff(i, - !cs_onoff); - if (rc < 0) { - pr_info("%s:D_CS i %d,rc %d\n", - __func__, i, rc); - } - rc = qti_set_custom_stereo_on(port_id, - copp_idx, - cs_onoff); - if (rc < 0) { - pr_info("%s:Q_CS port id 0x%x", - __func__, port_id); - pr_info("copp idx %d, rc %d\n", - copp_idx, rc); - } - } - - mod_inst_info_sz = - sizeof(struct module_instance_info) / - sizeof(uint32_t); - /* Turn on qti modules */ - for (j = 1; j < mod_list[0] * mod_inst_info_sz; - j += mod_inst_info_sz) { - if (!msm_ds2_dap_can_enable_module( - mod_list[j]) || - mod_list[j] == - DS2_MODULE_ID) - continue; - pr_debug("%s: param enable %d\n", - __func__, mod_list[j]); - memcpy(&mod_inst_info, &mod_list[j], - sizeof(mod_inst_info)); - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_ENABLE); - } - - /* Add adm api to resend calibration on port */ - rc = msm_ds2_dap_send_cal_data(i); - if (rc < 0) { - /* - * Not fatal,continue bypass operations. - * Do not need to block playback - */ - pr_info("%s:send cal err %d index %d\n", - __func__, rc, i); - } - } else { - /* Turn off qti modules */ - for (j = 1; j < mod_list[0] * mod_inst_info_sz; - j += mod_inst_info_sz) { - if (!msm_ds2_dap_can_enable_module( - mod_list[j]) || - mod_list[j] == - DS2_MODULE_ID) - continue; - pr_debug("%s: param disable %d\n", - __func__, mod_list[j]); - memcpy(&mod_inst_info, &mod_list[j], - sizeof(mod_inst_info)); - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_DISABLE); - } - - /* Enable DAP modules */ - pr_debug("%s:DS2 param enable\n", __func__); - mod_inst_info.module_id = DS2_MODULE_ID; - mod_inst_info.instance_id = INSTANCE_ID_0; - adm_param_enable_v2(port_id, copp_idx, - mod_inst_info, - MODULE_ENABLE); - /* - * If custom stereo is on at the time of dap on, - * switch off custom stereo on qti channel mixer - * and turn on custom stereo on DAP. - * mixer(qti). - */ - if (cs_onoff) { - rc = qti_set_custom_stereo_on(port_id, - copp_idx, - !cs_onoff); - if (rc < 0) { - pr_info("%s:Q_CS port_id 0x%x", - __func__, port_id); - pr_info("copp_idx %d rc %d\n", - copp_idx, rc); - } - rc = dap_set_custom_stereo_onoff(i, - cs_onoff); - if (rc < 0) { - pr_info("%s:D_CS i %d,rc %d\n", - __func__, i, rc); - } - } - } - - rc = msm_ds2_dap_handle_bypass_wait(port_id, copp_idx, - DOLBY_MODULE_ENABLE_PERIOD); - if (rc == -EINTR) { - pr_info("%s:bypass interrupted port_id %d copp_idx %d\n", - __func__, port_id, copp_idx); - /* Interrupted ignore bypass */ - rc = 0; - continue; - } - - /* set volume to unity gain after module on/off */ - rc = adm_set_volume(port_id, copp_idx, - VOLUME_UNITY_GAIN); - if (rc < 0) { - /* - * Not Fatal can continue bypass operations. - * Do not need to block playback - */ - pr_info("%s: Set vol port %d copp %d, rc %d\n", - __func__, port_id, copp_idx, rc); - rc = 0; - } - } - } - -end: - kfree(mod_list); - pr_debug("%s:return rc=%d\n", __func__, rc); - return rc; -} - -static int msm_ds2_dap_send_end_point(int dev_map_idx, int endp_idx) -{ - uint32_t offset = 0; - struct param_hdr_v3 param_hdr; - int cache_device = 0; - struct ds2_dap_params_s *ds2_ap_params_obj = NULL; - int32_t *modified_param = NULL; - int rc = 0; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - rc = -EINVAL; - goto end; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - cache_device = dev_map[dev_map_idx].cache_dev; - - ds2_ap_params_obj = &ds2_dap_params[cache_device]; - pr_debug("%s: cache dev %d, dev_map_idx %d\n", __func__, - cache_device, dev_map_idx); - pr_debug("%s: endp - %pK %pK\n", __func__, - &ds2_dap_params[cache_device], ds2_ap_params_obj); - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = -EINVAL; - goto end; - } - - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_INIT_ENDP; - param_hdr.param_size = sizeof(offset); - offset = ds2_ap_params_obj->params_val[ds2_dap_params_offset[endp_idx]]; - pr_debug("%s: off %d, length %d\n", __func__, - ds2_dap_params_offset[endp_idx], - ds2_dap_params_length[endp_idx]); - pr_debug("%s: param 0x%x, param val %d\n", __func__, - ds2_dap_params_id[endp_idx], ds2_ap_params_obj-> - params_val[ds2_dap_params_offset[endp_idx]]); - rc = adm_pack_and_set_one_pp_param(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, - param_hdr, (u8 *) &offset); - if (rc) { - pr_err("%s: send dolby params failed rc %d\n", __func__, rc); - rc = -EINVAL; - } - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified param structure invalid\n", - __func__); - rc = -EINVAL; - goto end; - } - - if (msm_ds2_dap_check_is_param_modified(modified_param, endp_idx, 0)) - ds2_ap_params_obj->dap_params_modified[endp_idx] = 0x00010001; - -end: - return rc; -} - -static int msm_ds2_dap_send_cached_params(int dev_map_idx, - int commit) -{ - uint8_t *packed_params = NULL; - uint32_t packed_params_size = 0; - uint32_t param_size = 0; - struct param_hdr_v3 param_hdr; - uint32_t idx, i, ret = 0; - int cache_device = 0; - struct ds2_dap_params_s *ds2_ap_params_obj = NULL; - int32_t *modified_param = NULL; - - if (dev_map_idx < 0 || dev_map_idx >= DS2_DEVICES_ALL) { - pr_err("%s: invalid dev map index %d\n", __func__, dev_map_idx); - ret = -EINVAL; - goto end; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - cache_device = dev_map[dev_map_idx].cache_dev; - - /* Use off profile cache in only for soft bypass */ - if (ds2_dap_params_states.dap_bypass_type == DAP_SOFT_BYPASS && - ds2_dap_params_states.dap_bypass == true) { - pr_debug("%s: use bypass cache 0\n", __func__); - cache_device = dev_map[0].cache_dev; - } - - ds2_ap_params_obj = &ds2_dap_params[cache_device]; - pr_debug("%s: cached param - %pK %pK, cache_device %d\n", __func__, - &ds2_dap_params[cache_device], ds2_ap_params_obj, - cache_device); - - /* - * Allocate the max space needed. This is enough space to hold the - * header for each param plus the total size of all the params. - */ - packed_params_size = (sizeof(param_hdr) * (MAX_DS2_PARAMS - 1)) + - (TOTAL_LENGTH_DOLBY_PARAM * sizeof(uint32_t)); - packed_params = kzalloc(packed_params_size, GFP_KERNEL); - if (!packed_params) - return -ENOMEM; - - if (dev_map[dev_map_idx].port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port id\n", __func__); - ret = -EINVAL; - goto end; - } - - if ((dev_map[dev_map_idx].copp_idx < 0) || - (dev_map[dev_map_idx].copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - ret = -EINVAL; - goto end; - } - - packed_params_size = 0; - for (i = 0; i < (MAX_DS2_PARAMS-1); i++) { - /*get the pointer to the param modified array in the cache*/ - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified param structure invalid\n", - __func__); - ret = -EINVAL; - goto end; - } - if (!msm_ds2_dap_check_is_param_modified(modified_param, i, - commit)) - continue; - - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = ds2_dap_params_id[i]; - param_hdr.param_size = - ds2_dap_params_length[i] * sizeof(uint32_t); - - idx = ds2_dap_params_offset[i]; - ret = q6common_pack_pp_params( - packed_params + packed_params_size, ¶m_hdr, - (u8 *) &ds2_ap_params_obj->params_val[idx], - ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, ret); - goto end; - } - - packed_params_size += param_size; - } - - pr_debug("%s: total packed param length: %d\n", __func__, - packed_params_size); - if (packed_params_size) { - ret = adm_set_pp_params(dev_map[dev_map_idx].port_id, - dev_map[dev_map_idx].copp_idx, NULL, - packed_params, packed_params_size); - if (ret) { - pr_err("%s: send dolby params failed ret %d\n", - __func__, ret); - ret = -EINVAL; - goto end; - } - for (i = 0; i < MAX_DS2_PARAMS-1; i++) { - /*get pointer to the param modified array in the cache*/ - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified param struct invalid\n", - __func__); - ret = -EINVAL; - goto end; - } - if (!msm_ds2_dap_check_is_param_modified( - modified_param, i, commit)) - continue; - ds2_ap_params_obj->dap_params_modified[i] = 0x00010001; - } - } -end: - kfree(packed_params); - return ret; -} - -static int msm_ds2_dap_commit_params(struct dolby_param_data *dolby_data, - int commit) -{ - int ret = 0, i, idx; - struct ds2_dap_params_s *ds2_ap_params_obj = NULL; - int32_t *modified_param = NULL; - - /* Do not commit params if in hard bypass */ - if (ds2_dap_params_states.dap_bypass_type == DAP_HARD_BYPASS && - ds2_dap_params_states.dap_bypass == true) { - pr_debug("%s: called in bypass", __func__); - ret = -EINVAL; - goto end; - } - for (idx = 0; idx < MAX_DS2_PARAMS; idx++) { - if (ds2_dap_params_id[idx] == DOLBY_PARAM_ID_INIT_ENDP) - break; - } - if (idx >= MAX_DS2_PARAMS || idx < 0) { - pr_err("%s: index of DS2 Param not found idx %d\n", - __func__, idx); - ret = -EINVAL; - goto end; - } - pr_debug("%s: found endp - idx %d 0x%x\n", __func__, idx, - ds2_dap_params_id[idx]); - for (i = 0; i < DS2_DEVICES_ALL; i++) { - pr_debug("%s:dev[0x%x,0x%x],i:%d,active:%d,bypass:%d,type:%d\n", - __func__, dolby_data->device_id, dev_map[i].device_id, - i, dev_map[i].active, ds2_dap_params_states.dap_bypass, - ds2_dap_params_states.dap_bypass_type); - - if (((dev_map[i].device_id & ds2_dap_params_states.device) || - ((ds2_dap_params_states.dap_bypass_type == - DAP_SOFT_BYPASS) && - (ds2_dap_params_states.dap_bypass == true))) && - (dev_map[i].active == true)) { - - /*get ptr to the cache storing the params for device*/ - if ((ds2_dap_params_states.dap_bypass_type == - DAP_SOFT_BYPASS) && - (ds2_dap_params_states.dap_bypass == true)) - ds2_ap_params_obj = - &ds2_dap_params[dev_map[0].cache_dev]; - else - ds2_ap_params_obj = - &ds2_dap_params[dev_map[i].cache_dev]; - - /*get the pointer to the param modified array in cache*/ - modified_param = ds2_ap_params_obj->dap_params_modified; - if (modified_param == NULL) { - pr_err("%s: modified_param NULL\n", __func__); - ret = -EINVAL; - goto end; - } - - /* - * Send the endp param if use cache is set - * or if param is modified - */ - if (!commit || msm_ds2_dap_check_is_param_modified( - modified_param, idx, commit)) { - msm_ds2_dap_send_end_point(i, idx); - commit = 0; - } - ret = msm_ds2_dap_send_cached_params(i, commit); - if (ret < 0) { - pr_err("%s: send cached param %d\n", - __func__, ret); - goto end; - } - } - } -end: - return ret; -} - -static int msm_ds2_dap_handle_commands(u32 cmd, void *arg) -{ - int ret = 0, port_id = 0; - int32_t data; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - - if (get_user(data, &dolby_data->data[0])) { - pr_debug("%s error getting data\n", __func__); - ret = -EFAULT; - goto end; - } - - pr_debug("%s: param_id %d,be_id %d,device_id 0x%x,length %d,data %d\n", - __func__, dolby_data->param_id, dolby_data->be_id, - dolby_data->device_id, dolby_data->length, data); - - switch (dolby_data->param_id) { - case DAP_CMD_COMMIT_ALL: - msm_ds2_dap_commit_params(dolby_data, 0); - break; - - case DAP_CMD_COMMIT_CHANGED: - msm_ds2_dap_commit_params(dolby_data, 1); - break; - - case DAP_CMD_USE_CACHE_FOR_INIT: - ds2_dap_params_states.use_cache = data; - break; - - case DAP_CMD_SET_BYPASS: - pr_debug("%s: bypass %d bypass type %d, data %d\n", __func__, - ds2_dap_params_states.dap_bypass, - ds2_dap_params_states.dap_bypass_type, - data); - /* Do not perform bypass operation if bypass state is same*/ - if (ds2_dap_params_states.dap_bypass == data) - break; - ds2_dap_params_states.dap_bypass = data; - /* hard bypass */ - if (ds2_dap_params_states.dap_bypass_type == DAP_HARD_BYPASS) - msm_ds2_dap_handle_bypass(dolby_data); - /* soft bypass */ - msm_ds2_dap_commit_params(dolby_data, 0); - break; - - case DAP_CMD_SET_BYPASS_TYPE: - if (data == true) - ds2_dap_params_states.dap_bypass_type = - DAP_HARD_BYPASS; - else - ds2_dap_params_states.dap_bypass_type = - DAP_SOFT_BYPASS; - pr_debug("%s: bypass type %d", __func__, - ds2_dap_params_states.dap_bypass_type); - break; - - case DAP_CMD_SET_ACTIVE_DEVICE: - pr_debug("%s: DAP_CMD_SET_ACTIVE_DEVICE length %d\n", - __func__, dolby_data->length); - /* TODO: need to handle multiple instance*/ - ds2_dap_params_states.device |= dolby_data->device_id; - port_id = msm_ds2_dap_get_port_id( - dolby_data->device_id, - dolby_data->be_id); - pr_debug("%s: device id 0x%x all_dev 0x%x port_id %d\n", - __func__, dolby_data->device_id, - ds2_dap_params_states.device, port_id); - msm_ds2_dap_update_dev_map_port_id(dolby_data->device_id, - port_id); - if (port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: invalid port id %d\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - break; - } -end: - return ret; - -} - -static int msm_ds2_dap_set_param(u32 cmd, void *arg) -{ - int rc = 0, idx, i, j, off, port_id = 0, cdev = 0; - int32_t num_device = 0; - int32_t data = 0; - int32_t dev_arr[DS2_DSP_SUPPORTED_ENDP_DEVICE] = {0}; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - - rc = msm_ds2_dap_update_num_devices(dolby_data, &num_device, dev_arr, - DS2_DSP_SUPPORTED_ENDP_DEVICE); - if (num_device == 0 || rc < 0) { - pr_err("%s: num devices 0\n", __func__); - rc = -EINVAL; - goto end; - } - for (i = 0; i < num_device; i++) { - port_id = msm_ds2_dap_get_port_id(dev_arr[i], - dolby_data->be_id); - if (port_id != DOLBY_INVALID_PORT_ID) - msm_ds2_dap_update_dev_map_port_id(dev_arr[i], port_id); - - cdev = msm_ds2_dap_map_device_to_dolby_cache_devices( - dev_arr[i]); - if (cdev < 0 || cdev >= DOLBY_MAX_CACHE) { - pr_err("%s: Invalid cache device %d for device 0x%x\n", - __func__, cdev, dev_arr[i]); - rc = -EINVAL; - goto end; - } - pr_debug("%s:port:%d,be:%d,dev:0x%x,cdev:%d,param:0x%x,len:%d\n" - , __func__, port_id, dolby_data->be_id, dev_arr[i], - cdev, dolby_data->param_id, dolby_data->length); - for (idx = 0; idx < MAX_DS2_PARAMS; idx++) { - /*paramid from user space*/ - if (dolby_data->param_id == ds2_dap_params_id[idx]) - break; - } - if (idx > MAX_DS2_PARAMS-1) { - pr_err("%s: invalid param id 0x%x at idx %d\n", - __func__, dolby_data->param_id, idx); - rc = -EINVAL; - goto end; - } - - off = ds2_dap_params_offset[idx]; - if ((dolby_data->length <= 0) || - (dolby_data->length > TOTAL_LENGTH_DS2_PARAM - off)) { - pr_err("%s: invalid length %d at idx %d\n", - __func__, dolby_data->length, idx); - rc = -EINVAL; - goto end; - } - - /* cache the parameters */ - ds2_dap_params[cdev].dap_params_modified[idx] += 1; - for (j = 0; j < dolby_data->length; j++) { - if (get_user(data, &dolby_data->data[j])) { - pr_debug("%s:error getting data\n", __func__); - rc = -EFAULT; - goto end; - } - ds2_dap_params[cdev].params_val[off + j] = data; - pr_debug("%s:off %d,val[i/p:o/p]-[%d / %d]\n", - __func__, off, data, - ds2_dap_params[cdev]. - params_val[off + j]); - } - } -end: - return rc; -} - -static int msm_ds2_dap_get_param(u32 cmd, void *arg) -{ - int rc = 0, i, port_id = 0, copp_idx = -1; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - int32_t *params_value = NULL; - uint32_t params_length = DOLBY_MAX_LENGTH_INDIVIDUAL_PARAM * - sizeof(uint32_t); - uint32_t param_payload_len = - DOLBY_PARAM_PAYLOAD_SIZE * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - - /* Return error on get param in soft or hard bypass */ - if (ds2_dap_params_states.dap_bypass == true) { - pr_err("%s: called in bypass_type %d bypass %d\n", __func__, - ds2_dap_params_states.dap_bypass_type, - ds2_dap_params_states.dap_bypass); - rc = -EINVAL; - goto end; - } - - /* Return if invalid length */ - if ((dolby_data->length > - (DOLBY_MAX_LENGTH_INDIVIDUAL_PARAM - DOLBY_PARAM_PAYLOAD_SIZE)) || - (dolby_data->length <= 0)) { - pr_err("Invalid length %d", dolby_data->length); - rc = -EINVAL; - goto end; - } - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].active) && - (dev_map[i].device_id & dolby_data->device_id)) { - port_id = dev_map[i].port_id; - copp_idx = dev_map[i].copp_idx; - break; - } - } - - if (port_id == DOLBY_INVALID_PORT_ID) { - pr_err("%s: Invalid port\n", __func__); - rc = -EINVAL; - goto end; - } - - if ((copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp_idx\n", __func__); - rc = -EINVAL; - goto end; - } - - pr_debug("%s: port_id 0x%x, copp_idx %d, dev_map[i].device_id %x\n", - __func__, port_id, copp_idx, dev_map[i].device_id); - - params_value = kzalloc(params_length + param_payload_len, - GFP_KERNEL); - if (!params_value) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - if (dolby_data->param_id == DOLBY_PARAM_ID_VER) { - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_VER; - param_hdr.param_size = params_length + param_payload_len; - } else { - for (i = 0; i < MAX_DS2_PARAMS; i++) - if (ds2_dap_params_id[i] == - dolby_data->param_id) - break; - if (i > MAX_DS2_PARAMS-1) { - pr_err("%s: invalid param id 0x%x at id %d\n", __func__, - dolby_data->param_id, i); - rc = -EINVAL; - goto end; - } else { - params_length = - ds2_dap_params_length[i] * sizeof(uint32_t); - - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = ds2_dap_params_id[i]; - param_hdr.param_size = - params_length + param_payload_len; - } - } - rc = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, (u8 *) params_value); - if (rc) { - pr_err("%s: get parameters failed rc %d\n", __func__, rc); - rc = -EINVAL; - goto end; - } - if (copy_to_user((void __user *) dolby_data->data, - ¶ms_value[DOLBY_PARAM_PAYLOAD_SIZE], - (dolby_data->length * sizeof(uint32_t)))) { - pr_err("%s: error getting param\n", __func__); - rc = -EFAULT; - goto end; - } -end: - kfree(params_value); - return rc; -} - -static int msm_ds2_dap_param_visualizer_control_get(u32 cmd, void *arg) -{ - int32_t *visualizer_data = NULL; - int i = 0, ret = 0, port_id = -1, cache_dev = -1, copp_idx = -1; - int32_t *update_visualizer_data = NULL; - struct dolby_param_data *dolby_data = (struct dolby_param_data *)arg; - uint32_t offset, length, params_length; - uint32_t param_payload_len = - DOLBY_PARAM_PAYLOAD_SIZE * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].active)) { - port_id = dev_map[i].port_id; - cache_dev = dev_map[i].cache_dev; - copp_idx = dev_map[i].copp_idx; - break; - } - } - - if (port_id == DOLBY_INVALID_PORT_ID || - (copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - ret = 0; - dolby_data->length = 0; - pr_err("%s: no device active\n", __func__); - goto end; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - length = ds2_dap_params[cache_dev].params_val[DOLBY_PARAM_VCNB_OFFSET]; - - if (length > DOLBY_PARAM_VCNB_MAX_LENGTH || length <= 0) { - ret = 0; - dolby_data->length = 0; - pr_err("%s Incorrect VCNB length", __func__); - return -EINVAL; - } - - params_length = (2*length + DOLBY_VIS_PARAM_HEADER_SIZE) * - sizeof(uint32_t); - - visualizer_data = kzalloc(params_length, GFP_KERNEL); - if (!visualizer_data) { - pr_err("%s: params memory alloc failed\n", __func__); - ret = -ENOMEM; - dolby_data->length = 0; - goto end; - } - memset(visualizer_data, 0x0, params_length); - - /* Return error on get param in soft or hard bypass */ - if (ds2_dap_params_states.dap_bypass == true) { - pr_debug("%s: visualizer called in bypass, return 0\n", - __func__); - ret = 0; - dolby_data->length = 0; - goto end; - } - - offset = 0; - params_length = length * sizeof(uint32_t); - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_VCBG; - param_hdr.param_size = length * sizeof(uint32_t) + param_payload_len; - ret = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, - (((char *) (visualizer_data)) + offset)); - if (ret) { - pr_err("%s: get parameters failed ret %d\n", __func__, ret); - ret = -EINVAL; - dolby_data->length = 0; - goto end; - } - offset = length * sizeof(uint32_t); - param_hdr.module_id = DOLBY_BUNDLE_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = DOLBY_PARAM_ID_VCBE; - param_hdr.param_size = length * sizeof(uint32_t) + param_payload_len; - ret = adm_get_pp_params(port_id, copp_idx, ADM_CLIENT_ID_DEFAULT, NULL, - ¶m_hdr, - (((char *) (visualizer_data)) + offset)); - if (ret) { - pr_err("%s: get parameters failed ret %d\n", __func__, ret); - ret = -EINVAL; - dolby_data->length = 0; - goto end; - } - update_visualizer_data = visualizer_data; - dolby_data->length = 2 * length; - - if (copy_to_user((void *)dolby_data->data, - (void *)update_visualizer_data, - (dolby_data->length * sizeof(uint32_t)))) { - pr_err("%s: copy to user failed for data\n", __func__); - dolby_data->length = 0; - ret = -EFAULT; - goto end; - } - -end: - kfree(visualizer_data); - return ret; -} - -int msm_ds2_dap_set_security_control(u32 cmd, void *arg) -{ - struct dolby_param_license *dolby_license = - ((struct dolby_param_license *)arg); - pr_debug("%s: dmid %d license key %d\n", __func__, - dolby_license->dmid, dolby_license->license_key); - core_set_dolby_manufacturer_id(dolby_license->dmid); - core_set_license(dolby_license->license_key, DOLBY_DS1_LICENSE_ID); - return 0; -} - -int msm_ds2_dap_update_port_parameters(struct snd_hwdep *hw, struct file *file, - bool open) -{ - int i = 0, dev_id = 0; - - pr_debug("%s: open %d\n", __func__, open); - ds2_dap_params_states.node_opened = open; - ds2_dap_params_states.dap_bypass = true; - ds2_dap_params_states.dap_bypass_type = 0; - ds2_dap_params_states.use_cache = 0; - ds2_dap_params_states.device = 0; - ds2_dap_params_states.custom_stereo_onoff = 0; - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if (i == 0) - dev_map[i].device_id = 0; - else { - dev_id = (1 << (i-1)); - if (all_supported_devices & dev_id) - dev_map[i].device_id = dev_id; - else - continue; - } - dev_map[i].cache_dev = - msm_ds2_dap_map_device_to_dolby_cache_devices( - dev_map[i].device_id); - if (dev_map[i].cache_dev < 0 || - dev_map[i].cache_dev >= DOLBY_MAX_CACHE) - pr_err("%s: Invalid cache device %d for device 0x%x\n", - __func__, - dev_map[i].cache_dev, - dev_map[i].device_id); - dev_map[i].port_id = -1; - dev_map[i].active = false; - dev_map[i].stream_ref_count = 0; - dev_map[i].cal_data = NULL; - dev_map[i].copp_idx = -1; - pr_debug("%s: device_id 0x%x, cache_dev %d act %d\n", __func__, - dev_map[i].device_id, dev_map[i].cache_dev, - dev_map[i].active); - } - return 0; - -} - -int msm_ds2_dap_ioctl_shared(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - int ret = 0; - - pr_debug("%s: cmd: 0x%x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM: - ret = msm_ds2_dap_set_param(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM: - ret = msm_ds2_dap_get_param(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND: - ret = msm_ds2_dap_handle_commands(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE: - ret = msm_ds2_dap_set_security_control(cmd, arg); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: - ret = msm_ds2_dap_param_visualizer_control_get(cmd, arg); - break; - default: - pr_err("%s: called with invalid control 0x%x\n", __func__, cmd); - ret = -EINVAL; - } - return ret; -} - -int msm_ds2_dap_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - - int ret = 0; - - pr_debug("%s: cmd: 0x%x\n", __func__, cmd); - if (!arg) { - pr_err("%s: Invalid params event status\n", __func__); - ret = -EINVAL; - goto end; - } - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND: { - struct dolby_param_data dolby_data; - - if (copy_from_user((void *)&dolby_data, (void *)arg, - sizeof(struct dolby_param_data))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE: { - struct dolby_param_license dolby_license; - - if (copy_from_user((void *)&dolby_license, (void *)arg, - sizeof(struct dolby_param_license))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_license); - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: { - struct dolby_param_data dolby_data; - - if (copy_from_user((void *)&dolby_data, (void *)arg, - sizeof(struct dolby_param_data))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - if (ret < 0) - pr_err("%s: ioctl cmd %d returned err %d\n", - __func__, cmd, ret); - if (copy_to_user((void *)arg, &dolby_data, - sizeof(struct dolby_param_data))) { - pr_err("%s: Copy to user failed\n", __func__); - ret = -EFAULT; - goto end; - } - break; - } - default: - pr_err("%s: called with invalid control 0x%x\n", __func__, cmd); - ret = -EINVAL; - } -end: - return ret; - -} -#ifdef CONFIG_COMPAT -int msm_ds2_dap_compat_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - int ret = 0; - - pr_debug("%s: cmd: 0x%x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM; - goto handle_set_ioctl; - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND; -handle_set_ioctl: - { - struct dolby_param_data32 dolby_data32; - struct dolby_param_data dolby_data; - - memset(&dolby_data32, 0, sizeof(dolby_data32)); - memset(&dolby_data, 0, sizeof(dolby_data)); - if (copy_from_user(&dolby_data32, (void *)arg, - sizeof(struct dolby_param_data32))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - dolby_data.version = dolby_data32.version; - dolby_data.device_id = dolby_data32.device_id; - dolby_data.be_id = dolby_data32.be_id; - dolby_data.param_id = dolby_data32.param_id; - dolby_data.length = dolby_data32.length; - dolby_data.data = compat_ptr(dolby_data32.data); - - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM; - goto handle_get_ioctl; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32: - cmd = SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER; -handle_get_ioctl: - { - struct dolby_param_data32 dolby_data32; - struct dolby_param_data dolby_data; - - memset(&dolby_data32, 0, sizeof(dolby_data32)); - memset(&dolby_data, 0, sizeof(dolby_data)); - if (copy_from_user(&dolby_data32, (void *)arg, - sizeof(struct dolby_param_data32))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - dolby_data.version = dolby_data32.version; - dolby_data.device_id = dolby_data32.device_id; - dolby_data.be_id = dolby_data32.be_id; - dolby_data.param_id = dolby_data32.param_id; - dolby_data.length = dolby_data32.length; - dolby_data.data = compat_ptr(dolby_data32.data); - - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_data); - if (ret < 0) - pr_err("%s: ioctl cmd %d, returned err %d\n", - __func__, cmd, ret); - dolby_data32.length = dolby_data.length; - if (copy_to_user((void *)arg, &dolby_data32, - sizeof(struct dolby_param_data32))) { - pr_err("%s: Copy to user failed\n", __func__); - ret = -EFAULT; - goto end; - } - break; - } - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE32: { - struct dolby_param_license32 dolby_license32; - struct dolby_param_license dolby_license; - - cmd = SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE; - if (copy_from_user((void *)&dolby_license32, (void *)arg, - sizeof(struct dolby_param_license32))) { - pr_err("%s: Copy from user failed\n", __func__); - ret = -EFAULT; - goto end; - } - dolby_license.dmid = dolby_license32.dmid; - dolby_license.license_key = dolby_license32.license_key; - ret = msm_ds2_dap_ioctl_shared(hw, file, cmd, &dolby_license); - break; - } - default: - pr_err("%s: called with invalid control 0x%x\n", - __func__, cmd); - ret = -EINVAL; - } -end: - return ret; - -} -#endif - -int msm_ds2_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on) -{ - int ret = 0, idx = -1, i; - struct dolby_param_data dolby_data; - - struct audproc_softvolume_params softvol = { - .period = DOLBY_SOFT_VOLUME_PERIOD, - .step = DOLBY_SOFT_VOLUME_STEP, - .rampingcurve = DOLBY_SOFT_VOLUME_CURVE_EXP, - }; - - pr_debug("%s: port id %d, copp_idx %d\n", __func__, port_id, copp_idx); - - if (port_id != DOLBY_INVALID_PORT_ID) { - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].port_id == port_id) && - /* device part of active device */ - (dev_map[i].device_id & - ds2_dap_params_states.device)) { - idx = i; - /* Give priority to headset in case of - * combo device - */ - if (dev_map[i].device_id == SPEAKER) - continue; - else - break; - } - } - if (idx < 0) { - pr_err("%s: invalid index for port %d\n", - __func__, port_id); - ret = -EINVAL; - goto end; - } - pr_debug("%s:index %d, dev[0x%x,0x%x]\n", __func__, idx, - dev_map[idx].device_id, ds2_dap_params_states.device); - dev_map[idx].active = true; - dev_map[idx].copp_idx = copp_idx; - dolby_data.param_id = DOLBY_COMMIT_ALL_TO_DSP; - dolby_data.length = 0; - dolby_data.data = NULL; - dolby_data.device_id = dev_map[idx].device_id; - pr_debug("%s: idx %d, active %d, dev id 0x%x, ref count %d\n", - __func__, idx, dev_map[idx].active, - dev_map[idx].device_id, - dev_map[idx].stream_ref_count); - if (dev_map[idx].stream_ref_count == 0) { - /*perform next 3 func only if hard bypass enabled*/ - if (ds2_dap_params_states.dap_bypass_type == - DAP_HARD_BYPASS) { - ret = msm_ds2_dap_alloc_and_store_cal_data(idx, - ADM_PATH_PLAYBACK, 0); - if (ret < 0) { - pr_err("%s: Failed to alloc and store cal data for idx %d, device %d, copp_idx %d", - __func__, - idx, dev_map[idx].device_id, - dev_map[idx].copp_idx); - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - goto end; - } - - ret = adm_set_softvolume(port_id, copp_idx, - &softvol); - if (ret < 0) { - pr_err("%s: Soft volume ret error %d\n", - __func__, ret); - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - goto end; - } - - ret = msm_ds2_dap_init_modules_in_topology( - idx); - if (ret < 0) { - pr_err("%s: Failed to init modules in topolofy for idx %d, device %d, copp_idx %d\n", - __func__, idx, - dev_map[idx].device_id, - dev_map[idx].copp_idx); - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - goto end; - } - } - - ret = msm_ds2_dap_commit_params(&dolby_data, 0); - if (ret < 0) { - pr_debug("%s: commit params ret %d\n", - __func__, ret); - ret = 0; - } - } - dev_map[idx].stream_ref_count++; - if (is_custom_stereo_on) { - ds2_dap_params_states.custom_stereo_onoff = - is_custom_stereo_on; - set_custom_stereo_onoff(idx, - is_custom_stereo_on); - } - } - -end: - return ret; -} - -void msm_ds2_dap_deinit(int port_id) -{ - /* - * Get the active port corrresponding to the active device - * Check if this is same as incoming port - * Set it to invalid - */ - int idx = -1, i; - - pr_debug("%s: port_id %d\n", __func__, port_id); - if (port_id != DOLBY_INVALID_PORT_ID) { - for (i = 0; i < DS2_DEVICES_ALL; i++) { - /* Active port */ - if ((dev_map[i].port_id == port_id) && - /* device part of active device */ - (dev_map[i].device_id & - ds2_dap_params_states.device) && - /* - * Need this check to avoid race condition of - * active device being set and playback - * instance opened - */ - /* active device*/ - dev_map[i].active) { - idx = i; - if (dev_map[i].device_id == SPEAKER) - continue; - else - break; - } - } - if (idx < 0) { - pr_err("%s: invalid index for port %d\n", - __func__, port_id); - return; - } - pr_debug("%s:index %d, dev [0x%x, 0x%x]\n", __func__, idx, - dev_map[idx].device_id, ds2_dap_params_states.device); - dev_map[idx].stream_ref_count--; - if (dev_map[idx].stream_ref_count == 0) { - /*perform next func only if hard bypass enabled*/ - if (ds2_dap_params_states.dap_bypass_type == - DAP_HARD_BYPASS) { - msm_ds2_dap_free_cal_data(idx); - } - ds2_dap_params_states.device &= ~dev_map[idx].device_id; - dev_map[idx].active = false; - dev_map[idx].copp_idx = -1; - } - pr_debug("%s:idx %d, active %d, dev id 0x%x ref count %d\n", - __func__, idx, dev_map[idx].active, - dev_map[idx].device_id, dev_map[idx].stream_ref_count); - } -} - -int msm_ds2_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled) -{ - int idx = -1, rc = 0, i; - - pr_debug("%s: port_id %d\n", __func__, port_id); - if (port_id != DOLBY_INVALID_PORT_ID) { - for (i = 0; i < DS2_DEVICES_ALL; i++) { - if ((dev_map[i].port_id == port_id) && - /* device part of active device */ - (dev_map[i].device_id & - ds2_dap_params_states.device)) { - idx = i; - if (dev_map[i].device_id == SPEAKER) - continue; - else - break; - } - } - if (idx < 0) { - pr_err("%s: invalid index for port %d\n", - __func__, port_id); - return rc; - } - ds2_dap_params_states.custom_stereo_onoff = - is_custom_stereo_enabled; - rc = set_custom_stereo_onoff(idx, - is_custom_stereo_enabled); - if (rc < 0) { - pr_err("%s: Custom stereo err %d on port %d\n", - __func__, rc, port_id); - } - } - return rc; -} diff --git a/techpack/audio/asoc/msm-ds2-dap-config.h b/techpack/audio/asoc/msm-ds2-dap-config.h deleted file mode 100644 index 4d6b5eb3d210..000000000000 --- a/techpack/audio/asoc/msm-ds2-dap-config.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2013-2014, 2017-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_DS2_DAP_CONFIG_H_ -#define _MSM_DS2_DAP_CONFIG_H_ - -#include -#include "msm-dolby-common.h" -#include -#include - -#ifdef CONFIG_COMPAT -struct dolby_param_data32 { - s32 version; - s32 device_id; - s32 be_id; - s32 param_id; - s32 length; - compat_uptr_t data; -}; - -struct dolby_param_license32 { - compat_uptr_t dmid; - compat_uptr_t license_key; -}; - -#define SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM32\ - _IOWR('U', 0x10, struct dolby_param_data32) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM32\ - _IOR('U', 0x11, struct dolby_param_data32) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND32\ - _IOWR('U', 0x13, struct dolby_param_data32) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE32\ - _IOWR('U', 0x14, struct dolby_param_license32) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32\ - _IOR('U', 0x15, struct dolby_param_data32) -#endif - -#if defined(CONFIG_DOLBY_DS2) || defined(CONFIG_DOLBY_LICENSE) -/* DOLBY DOLBY GUIDS */ -#define DS2_MODULE_ID 0x00010775 - -#define DS2_DSP_SUPPORTED_ENDP_DEVICE 17 -#define DS2_DEVICES_ALL 32 /* enum val is 4 bytes */ - -enum { - - DAP_CMD_COMMIT_ALL = 0, - DAP_CMD_COMMIT_CHANGED = 1, - DAP_CMD_USE_CACHE_FOR_INIT = 2, - DAP_CMD_SET_BYPASS = 3, - DAP_CMD_SET_ACTIVE_DEVICE = 4, - DAP_CMD_SET_BYPASS_TYPE = 5, -}; - -struct custom_stereo_param { - /* Index is 32-bit param in little endian */ - u16 index; - u16 reserved; - - /* For stereo mixing, the number of out channels */ - u16 num_out_ch; - /* For stereo mixing, the number of in channels */ - u16 num_in_ch; - - /* Out channel map FL/FR*/ - u16 out_fl; - u16 out_fr; - - /* In channel map FL/FR*/ - u16 in_fl; - u16 in_fr; - - /* - * Weighting coefficients. Mixing will be done according to - * these coefficients. - */ - u16 op_FL_ip_FL_weight; - u16 op_FL_ip_FR_weight; - u16 op_FR_ip_FL_weight; - u16 op_FR_ip_FR_weight; -}; - -#define DOLBY_PARAM_INT_ENDP_LENGTH 1 -#define DOLBY_PARAM_INT_ENDP_OFFSET (DOLBY_PARAM_PSTG_OFFSET + \ - DOLBY_PARAM_PSTG_LENGTH) -#define MAX_DS2_PARAMS 48 -#define MAX_DS2_CTRL_PARAMS 4 -#define ALL_DS2_PARAMS (MAX_DS2_PARAMS + \ - MAX_DS2_CTRL_PARAMS) -#define TOTAL_LENGTH_DS2_PARAM (TOTAL_LENGTH_DOLBY_PARAM + 1) - -int msm_ds2_dap_update_port_parameters(struct snd_hwdep *hw, struct file *file, - bool open); -int msm_ds2_dap_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg); -int msm_ds2_dap_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - u32 cmd, void *arg); -int msm_ds2_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on); -void msm_ds2_dap_deinit(int port_id); -int msm_ds2_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled); -/* Dolby DOLBY end */ -#else - -static inline int msm_ds2_dap_update_port_parameters(struct snd_hwdep *hw, - struct file *file, - bool open) -{ - return 0; -} - -static inline int msm_ds2_dap_ioctl(struct snd_hwdep *hw, struct file *file, - u32 cmd, void *arg) -{ - return 0; -} - -static inline int msm_ds2_dap_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - u32 cmd, void *arg) -{ - return 0; -} -static inline int msm_ds2_dap_init(int port_id, int copp_idx, int channels, - bool is_custom_stereo_on) -{ - return 0; -} - -static inline void msm_ds2_dap_deinit(int port_id) { } - -static inline int msm_ds2_dap_set_custom_stereo_onoff(int port_id, int copp_idx, - bool is_custom_stereo_enabled) -{ - return 0; -} -#endif -#endif diff --git a/techpack/audio/asoc/msm-lsm-client.c b/techpack/audio/asoc/msm-lsm-client.c deleted file mode 100644 index 6cc8d43575c9..000000000000 --- a/techpack/audio/asoc/msm-lsm-client.c +++ /dev/null @@ -1,3033 +0,0 @@ -/* - * Copyright (c) 2013-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" - -#define CAPTURE_MIN_NUM_PERIODS 2 -#define CAPTURE_MAX_NUM_PERIODS 8 -#define CAPTURE_MAX_PERIOD_SIZE 61440 -#define CAPTURE_MIN_PERIOD_SIZE 320 -#define LISTEN_MAX_STATUS_PAYLOAD_SIZE 256 - -#define LAB_BUFFER_ALLOC 1 -#define LAB_BUFFER_DEALLOC 0 - -#define LSM_IS_LAST_STAGE(client, stage_idx) \ - (client->num_stages == (stage_idx + 1)) - -static struct snd_pcm_hardware msm_pcm_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE), - .rates = (SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .rate_min = 16000, - .rate_max = 48000, - .channels_min = LSM_INPUT_NUM_CHANNELS_MIN, - .channels_max = LSM_INPUT_NUM_CHANNELS_MAX, - .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * - CAPTURE_MAX_PERIOD_SIZE, - .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE, - .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE, - .periods_min = CAPTURE_MIN_NUM_PERIODS, - .periods_max = CAPTURE_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 16000, 48000, -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -struct lsm_priv { - struct snd_pcm_substream *substream; - struct lsm_client *lsm_client; - struct snd_lsm_event_status_v3 *event_status; - struct snd_lsm_event_status *det_event; - spinlock_t event_lock; - wait_queue_head_t event_wait; - unsigned long event_avail; - atomic_t event_wait_stop; - atomic_t buf_count; - atomic_t read_abort; - wait_queue_head_t period_wait; - struct mutex lsm_api_lock; - int appl_cnt; - int dma_write; - int xrun_count; - int xrun_index; - spinlock_t xrun_lock; -}; - -enum { /* lsm session states */ - IDLE = 0, - RUNNING, -}; - -static int msm_lsm_queue_lab_buffer(struct lsm_priv *prtd, int i) -{ - int rc = 0; - struct lsm_cmd_read cmd_read; - struct snd_soc_pcm_runtime *rtd; - - if (!prtd || !prtd->lsm_client) { - pr_err("%s: Invalid params prtd %pK lsm client %pK\n", - __func__, prtd, ((!prtd) ? NULL : prtd->lsm_client)); - return -EINVAL; - } - if (!prtd->substream || !prtd->substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!prtd->substream) ? "substream" : "private_data"); - return -EINVAL; - } - rtd = prtd->substream->private_data; - - if (!prtd->lsm_client->lab_buffer || - i >= prtd->lsm_client->out_hw_params.period_count) { - dev_err(rtd->dev, - "%s: Lab buffer not setup %pK incorrect index %d period count %d\n", - __func__, prtd->lsm_client->lab_buffer, i, - prtd->lsm_client->out_hw_params.period_count); - return -EINVAL; - } - cmd_read.buf_addr_lsw = - lower_32_bits(prtd->lsm_client->lab_buffer[i].phys); - cmd_read.buf_addr_msw = - msm_audio_populate_upper_32_bits( - prtd->lsm_client->lab_buffer[i].phys); - cmd_read.buf_size = prtd->lsm_client->lab_buffer[i].size; - cmd_read.mem_map_handle = - prtd->lsm_client->lab_buffer[i].mem_map_handle; - rc = q6lsm_read(prtd->lsm_client, &cmd_read); - if (rc) - dev_err(rtd->dev, - "%s: error in queuing the lab buffer rc %d\n", - __func__, rc); - return rc; -} - -static int lsm_lab_buffer_sanity(struct lsm_priv *prtd, - struct lsm_cmd_read_done *read_done, int *index) -{ - int i = 0, rc = -EINVAL; - struct snd_soc_pcm_runtime *rtd; - - if (!prtd || !read_done || !index) { - pr_err("%s: Invalid params prtd %pK read_done %pK index %pK\n", - __func__, prtd, read_done, index); - return -EINVAL; - } - - if (!prtd->substream || !prtd->substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!prtd->substream) ? "substream" : "private_data"); - return -EINVAL; - } - rtd = prtd->substream->private_data; - - if (!prtd->lsm_client->lab_enable || !prtd->lsm_client->lab_buffer) { - dev_err(rtd->dev, - "%s: Lab not enabled %d invalid lab buffer %pK\n", - __func__, prtd->lsm_client->lab_enable, - prtd->lsm_client->lab_buffer); - return -EINVAL; - } - for (i = 0; i < prtd->lsm_client->out_hw_params.period_count; i++) { - if ((lower_32_bits(prtd->lsm_client->lab_buffer[i].phys) == - read_done->buf_addr_lsw) && - (msm_audio_populate_upper_32_bits - (prtd->lsm_client->lab_buffer[i].phys) == - read_done->buf_addr_msw) && - (prtd->lsm_client->lab_buffer[i].mem_map_handle == - read_done->mem_map_handle)) { - dev_dbg(rtd->dev, - "%s: Buffer found %pK memmap handle %d\n", - __func__, &prtd->lsm_client->lab_buffer[i].phys, - prtd->lsm_client->lab_buffer[i].mem_map_handle); - if (read_done->total_size > - prtd->lsm_client->lab_buffer[i].size) { - dev_err(rtd->dev, - "%s: Size mismatch call back size %d actual size %zd\n", - __func__, read_done->total_size, - prtd->lsm_client->lab_buffer[i].size); - rc = -EINVAL; - break; - } else { - *index = i; - rc = 0; - break; - } - } - } - return rc; -} - -static void lsm_event_handler(uint32_t opcode, uint32_t token, - uint32_t *payload, uint16_t client_size, - void *priv) -{ - unsigned long flags; - struct lsm_priv *prtd = priv; - struct snd_pcm_substream *substream = prtd->substream; - struct snd_soc_pcm_runtime *rtd; - struct snd_lsm_event_status_v3 *temp; - uint16_t status = 0; - uint16_t payload_size = 0; - uint16_t index = 0; - uint32_t event_ts_lsw = 0; - uint32_t event_ts_msw = 0; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return; - } - rtd = substream->private_data; - - switch (opcode) { - case LSM_DATA_EVENT_READ_DONE: { - int rc; - struct lsm_cmd_read_done *read_done = (struct lsm_cmd_read_done *)payload; - int buf_index = 0; - unsigned long flags = 0; - - if (prtd->lsm_client->session != token || - !read_done) { - dev_err(rtd->dev, - "%s: EVENT_READ_DONE invalid callback, session %d callback %d payload %pK", - __func__, prtd->lsm_client->session, - token, read_done); - return; - } - if (atomic_read(&prtd->read_abort)) { - dev_dbg(rtd->dev, - "%s: read abort set skip data\n", __func__); - return; - } - if (!lsm_lab_buffer_sanity(prtd, read_done, &buf_index)) { - dev_dbg(rtd->dev, - "%s: process read done index %d\n", - __func__, buf_index); - if (buf_index >= - prtd->lsm_client->out_hw_params.period_count) { - dev_err(rtd->dev, - "%s: Invalid index %d buf_index max cnt %d\n", - __func__, buf_index, - prtd->lsm_client->out_hw_params.period_count); - return; - } - spin_lock_irqsave(&prtd->xrun_lock, flags); - prtd->dma_write += read_done->total_size; - atomic_inc(&prtd->buf_count); - snd_pcm_period_elapsed(substream); - wake_up(&prtd->period_wait); - if (atomic_read(&prtd->buf_count) < - prtd->lsm_client->out_hw_params.period_count) { - /* queue the next period buffer */ - buf_index = (buf_index + 1) % - prtd->lsm_client->out_hw_params.period_count; - rc = msm_lsm_queue_lab_buffer(prtd, buf_index); - if (rc) - dev_err(rtd->dev, - "%s: error in queuing the lab buffer rc %d\n", - __func__, rc); - } else { - dev_dbg(rtd->dev, - "%s: xrun: further lab to be queued after read from user\n", - __func__); - if (!prtd->xrun_count) - prtd->xrun_index = buf_index; - (prtd->xrun_count)++; - } - spin_unlock_irqrestore(&prtd->xrun_lock, flags); - } else - dev_err(rtd->dev, "%s: Invalid lab buffer returned by dsp\n", - __func__); - break; - } - - case LSM_SESSION_EVENT_DETECTION_STATUS: - if (client_size < 3 * sizeof(uint8_t)) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - return; - } - status = (uint16_t)((uint8_t *)payload)[0]; - payload_size = (uint16_t)((uint8_t *)payload)[2]; - index = 4; - dev_dbg(rtd->dev, - "%s: event detect status = %d payload size = %d\n", - __func__, status, payload_size); - break; - - case LSM_SESSION_EVENT_DETECTION_STATUS_V2: - if (client_size < 2 * sizeof(uint8_t)) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - return; - } - status = (uint16_t)((uint8_t *)payload)[0]; - payload_size = (uint16_t)((uint8_t *)payload)[1]; - index = 2; - dev_dbg(rtd->dev, - "%s: event detect status = %d payload size = %d\n", - __func__, status, payload_size); - break; - - case LSM_SESSION_EVENT_DETECTION_STATUS_V3: - if (client_size < 2 * (sizeof(uint32_t) + sizeof(uint8_t))) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - return; - } - event_ts_lsw = ((uint32_t *)payload)[0]; - event_ts_msw = ((uint32_t *)payload)[1]; - status = (uint16_t)((uint8_t *)payload)[8]; - payload_size = (uint16_t)((uint8_t *)payload)[9]; - index = 10; - dev_dbg(rtd->dev, - "%s: ts_msw = %u, ts_lsw = %u, event detect status = %d payload size = %d\n", - __func__, event_ts_msw, event_ts_lsw, status, - payload_size); - break; - - case LSM_SESSION_DETECTION_ENGINE_GENERIC_EVENT: { - struct snd_lsm_event_status *tmp; - if (client_size < 2 * sizeof(uint16_t)) { - dev_err(rtd->dev, - "%s: client_size has invalid size[%d]\n", - __func__, client_size); - return; - } - - - status = ((uint16_t *)payload)[0]; - payload_size = ((uint16_t *)payload)[1]; - - spin_lock_irqsave(&prtd->event_lock, flags); - tmp = krealloc(prtd->det_event, - sizeof(struct snd_lsm_event_status) + - payload_size, GFP_ATOMIC); - if (!tmp) { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Failed to allocate memory for %s, size = %zu\n", - __func__, - "LSM_SESSION_DETECTION_ENGINE_GENERIC_EVENT", - sizeof(struct snd_lsm_event_status) + - payload_size); - return; - } - - prtd->det_event = tmp; - prtd->det_event->status = status; - prtd->det_event->payload_size = payload_size; - if (client_size >= payload_size + 4) { - memcpy(prtd->det_event->payload, - &((uint8_t *)payload)[4], payload_size); - } else { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Failed to copy memory with invalid size = %d\n", - __func__, payload_size); - return; - } - prtd->event_avail = 1; - spin_unlock_irqrestore(&prtd->event_lock, flags); - wake_up(&prtd->event_wait); - - if (substream->timer_running) - snd_timer_interrupt(substream->timer, 1); - - dev_dbg(rtd->dev, - "%s: Generic det event status = %d payload size = %d\n", - __func__, prtd->det_event->status, - prtd->det_event->payload_size); - break; - } - - default: - break; - } - - if (opcode == LSM_SESSION_EVENT_DETECTION_STATUS || - opcode == LSM_SESSION_EVENT_DETECTION_STATUS_V2 || - opcode == LSM_SESSION_EVENT_DETECTION_STATUS_V3) { - spin_lock_irqsave(&prtd->event_lock, flags); - temp = krealloc(prtd->event_status, - sizeof(struct snd_lsm_event_status_v3) + - payload_size, GFP_ATOMIC); - if (!temp) { - dev_err(rtd->dev, "%s: no memory for event status\n", - __func__); - return; - } - /* - * event status timestamp will be non-zero and valid if - * opcode is LSM_SESSION_EVENT_DETECTION_STATUS_V3 - */ - prtd->event_status = temp; - prtd->event_status->timestamp_lsw = event_ts_lsw; - prtd->event_status->timestamp_msw = event_ts_msw; - prtd->event_status->status = status; - prtd->event_status->payload_size = payload_size; - - if (likely(prtd->event_status)) { - if (client_size >= (payload_size + index)) { - memcpy(prtd->event_status->payload, - &((uint8_t *)payload)[index], - payload_size); - prtd->event_avail = 1; - spin_unlock_irqrestore(&prtd->event_lock, flags); - wake_up(&prtd->event_wait); - } else { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Failed to copy memory with invalid size = %d\n", - __func__, payload_size); - return; - } - } else { - spin_unlock_irqrestore(&prtd->event_lock, flags); - dev_err(rtd->dev, - "%s: Couldn't allocate %d bytes of memory\n", - __func__, payload_size); - } - if (substream->timer_running) - snd_timer_interrupt(substream->timer, 1); - } -} - -static int msm_lsm_lab_buffer_alloc(struct lsm_priv *lsm, int alloc) -{ - int ret = 0; - struct snd_dma_buffer *dma_buf = NULL; - - if (!lsm) { - pr_err("%s: Invalid param lsm %pK\n", __func__, lsm); - return -EINVAL; - } - if (alloc) { - if (!lsm->substream) { - pr_err("%s: substream is NULL\n", __func__); - return -EINVAL; - } - ret = q6lsm_lab_buffer_alloc(lsm->lsm_client, alloc); - if (ret) { - pr_err("%s: alloc lab buffer failed ret %d\n", - __func__, ret); - goto exit; - } - dma_buf = &lsm->substream->dma_buffer; - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = lsm->substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = lsm->lsm_client->lab_buffer[0].data; - dma_buf->addr = lsm->lsm_client->lab_buffer[0].phys; - dma_buf->bytes = lsm->lsm_client->out_hw_params.buf_sz * - lsm->lsm_client->out_hw_params.period_count; - snd_pcm_set_runtime_buffer(lsm->substream, dma_buf); - } else { - ret = q6lsm_lab_buffer_alloc(lsm->lsm_client, alloc); - if (ret) - pr_err("%s: free lab buffer failed ret %d\n", - __func__, ret); - kfree(lsm->lsm_client->lab_buffer); - lsm->lsm_client->lab_buffer = NULL; - } -exit: - return ret; -} - -static int msm_lsm_get_conf_levels(struct lsm_client *client, - u8 *conf_levels_ptr) -{ - int rc = 0; - - if (client->num_confidence_levels == 0) { - pr_debug("%s: no confidence levels provided\n", - __func__); - client->confidence_levels = NULL; - goto done; - } - - client->confidence_levels = - kzalloc((sizeof(uint8_t) * client->num_confidence_levels), - GFP_KERNEL); - if (!client->confidence_levels) { - pr_err("%s: No memory for confidence\n" - "levels num of level from user = %d\n", - __func__, client->num_confidence_levels); - rc = -ENOMEM; - goto done; - } - - if (copy_from_user(client->confidence_levels, - conf_levels_ptr, - client->num_confidence_levels)) { - pr_err("%s: copy from user failed, size = %d\n", - __func__, client->num_confidence_levels); - rc = -EFAULT; - goto copy_err; - } - - return rc; - -copy_err: - kfree(client->confidence_levels); - client->confidence_levels = NULL; -done: - return rc; - -} - -static int msm_lsm_set_epd(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - struct snd_lsm_ep_det_thres epd_th; - - if (p_info->param_size != sizeof(epd_th)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&epd_th, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &epd_th, LSM_ENDPOINT_DETECT_THRESHOLD); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set epd param, err = %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_lsm_set_mode(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_detect_mode mode; - int rc = 0; - - if (p_info->param_size != sizeof(mode)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&mode, p_info->param_data, - sizeof(mode))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(mode)); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &mode, LSM_OPERATION_MODE); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set det_mode param, err = %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_lsm_set_gain(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_gain gain; - int rc = 0; - - if (p_info->param_size != sizeof(gain)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&gain, p_info->param_data, - sizeof(gain))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(gain)); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &gain, LSM_GAIN); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set det_mode param, err = %d\n", - __func__, rc); -done: - return rc; -} - -static int msm_lsm_set_conf(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (p_info->param_size > MAX_NUM_CONFIDENCE) { - dev_err(rtd->dev, - "%s: invalid confidence levels %d\n", - __func__, p_info->param_size); - return -EINVAL; - } - - prtd->lsm_client->num_confidence_levels = - p_info->param_size; - rc = msm_lsm_get_conf_levels(prtd->lsm_client, - p_info->param_data); - if (rc) { - dev_err(rtd->dev, - "%s: get_conf_levels failed, err = %d\n", - __func__, rc); - return rc; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - prtd->lsm_client->confidence_levels, - LSM_MIN_CONFIDENCE_LEVELS); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set min_conf_levels, err = %d\n", - __func__, rc); - - return rc; -} - -static int msm_lsm_reg_model(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - struct lsm_sound_model *sm = NULL; - size_t offset = sizeof(union param_hdrs); - - rc = q6lsm_snd_model_buf_alloc(prtd->lsm_client, - p_info->param_size, p_info); - if (rc) { - dev_err(rtd->dev, - "%s: snd_model buf alloc failed, size = %d\n", - __func__, p_info->param_size); - return rc; - } - - q6lsm_sm_set_param_data(prtd->lsm_client, p_info, &offset); - - /* - * For set_param, advance the sound model data with the - * number of bytes required by param_data. - */ - - sm = &prtd->lsm_client->stage_cfg[p_info->stage_idx].sound_model; - if (copy_from_user((u8 *)sm->data + offset, - p_info->param_data, p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user for snd_model failed, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto err_copy; - } - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, NULL, - LSM_REG_SND_MODEL); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to set sound_model, err = %d\n", - __func__, rc); - goto err_copy; - } - return rc; - -err_copy: - q6lsm_snd_model_buf_free(prtd->lsm_client, p_info); - return rc; -} - -static int msm_lsm_dereg_model(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - NULL, LSM_DEREG_SND_MODEL); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set det_mode param, err = %d\n", - __func__, rc); - - q6lsm_snd_model_buf_free(prtd->lsm_client, p_info); - - return rc; -} - -static int msm_lsm_set_custom(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - u8 *data; - int rc = 0; - - data = kzalloc(p_info->param_size, GFP_KERNEL); - if (!data) - return -ENOMEM; - - if (copy_from_user(data, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for custom params, size = %d\n", - __func__, p_info->param_size); - rc = -EFAULT; - goto err_ret; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - data, LSM_CUSTOM_PARAMS); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set custom param, err = %d\n", - __func__, rc); - -err_ret: - kfree(data); - return rc; -} - -static int msm_lsm_check_and_set_lab_controls(struct snd_pcm_substream *substream, - u32 enable, struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct lsm_hw_params *out_hw_params = &prtd->lsm_client->out_hw_params; - u8 chmap[out_hw_params->num_chs]; - u32 ch_idx; - int rc = 0, stage_idx = p_info->stage_idx; - - if (prtd->lsm_client->stage_cfg[stage_idx].lab_enable == enable) { - dev_dbg(rtd->dev, "%s: Lab for session %d, stage %d already %s\n", - __func__, prtd->lsm_client->session, - stage_idx, enable ? "enabled" : "disabled"); - return rc; - } - - rc = q6lsm_lab_control(prtd->lsm_client, enable, p_info); - if (rc) { - dev_err(rtd->dev, "%s: Failed to set lab_control param, err = %d\n", - __func__, rc); - return rc; - } else { - if (LSM_IS_LAST_STAGE(prtd->lsm_client, stage_idx)) { - rc = msm_lsm_lab_buffer_alloc(prtd, - enable ? LAB_BUFFER_ALLOC : LAB_BUFFER_DEALLOC); - if (rc) { - dev_err(rtd->dev, - "%s: msm_lsm_lab_buffer_alloc failed rc %d for %s\n", - __func__, rc, enable ? "ALLOC" : "DEALLOC"); - return rc; - } else { - /* set client level flag based on last stage control */ - prtd->lsm_client->lab_enable = enable; - } - } - if (!rc) - prtd->lsm_client->stage_cfg[stage_idx].lab_enable = enable; - } - - memset(chmap, 0, out_hw_params->num_chs); - /* - * First channel to be read from lab is always the - * best channel (0xff). For second channel onwards, - * the channel indices are 0, 1, .. etc - */ - chmap[0] = 0xFF; - for (ch_idx = 1; ch_idx < out_hw_params->num_chs; ch_idx++) - chmap[ch_idx] = ch_idx - 1; - - rc = q6lsm_lab_out_ch_cfg(prtd->lsm_client, chmap, p_info); - if (rc) - dev_err(rtd->dev, "%s: Failed to set lab out ch cfg %d\n", - __func__, rc); - - return rc; -} - -static int msm_lsm_set_lab_control(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_lab_control lab_ctrl; - int rc = 0; - - if (p_info->param_size != sizeof(lab_ctrl)) - return -EINVAL; - - if (prtd->lsm_client->started) { - dev_err(rtd->dev, "%s: lab control sent after start\n", __func__); - return -EAGAIN; - } - - if (copy_from_user(&lab_ctrl, p_info->param_data, - p_info->param_size)) { - dev_err(rtd->dev, - "%s: copy_from_user failed for lab_control params, size = %d\n", - __func__, p_info->param_size); - return -EFAULT; - } - - rc = msm_lsm_check_and_set_lab_controls(substream, lab_ctrl.enable, p_info); - return rc; -} - -static int msm_lsm_set_poll_enable(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_lsm_poll_enable poll_enable; - int rc = 0; - - if (p_info->param_size != sizeof(poll_enable)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&poll_enable, p_info->param_data, - sizeof(poll_enable))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(poll_enable)); - rc = -EFAULT; - goto done; - } - - if (prtd->lsm_client->poll_enable == poll_enable.poll_en) { - dev_dbg(rtd->dev, - "%s: Polling for session %d already %s\n", - __func__, prtd->lsm_client->session, - (poll_enable.poll_en ? "enabled" : "disabled")); - rc = 0; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &poll_enable, LSM_POLLING_ENABLE); - if (!rc) { - prtd->lsm_client->poll_enable = poll_enable.poll_en; - } else { - dev_err(rtd->dev, - "%s: Failed to set poll enable, err = %d\n", - __func__, rc); - } -done: - return rc; -} - -static int msm_lsm_set_det_event_type(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_lsm_det_event_type det_event_type; - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - if (p_info->param_size != sizeof(det_event_type)) { - dev_err(rtd->dev, - "%s: Invalid param_size %d\n", - __func__, p_info->param_size); - rc = -EINVAL; - goto done; - } - - if (copy_from_user(&det_event_type, p_info->param_data, - sizeof(det_event_type))) { - dev_err(rtd->dev, - "%s: copy_from_user failed, size = %zd\n", - __func__, sizeof(det_event_type)); - rc = -EFAULT; - goto done; - } - - rc = q6lsm_set_one_param(prtd->lsm_client, p_info, - &det_event_type, LSM_DET_EVENT_TYPE); - if (!rc) - prtd->lsm_client->event_type = det_event_type.event_type; - else - dev_err(rtd->dev, - "%s: Failed to set detection event type %s, err = %d\n", - __func__, (det_event_type.event_type ? - "LSM_DET_EVENT_TYPE_GENERIC" : - "LSM_DET_EVENT_TYPE_LEGACY"), rc); -done: - return rc; -} - -static int msm_lsm_process_params(struct snd_pcm_substream *substream, - struct lsm_params_info_v2 *p_info) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int rc = 0; - - dev_dbg(rtd->dev, - "%s: mid=0x%x, pid=0x%x, iid=0x%x, stage_idx=%d, size=0x%x, type=%d\n", - __func__, p_info->module_id, p_info->param_id, p_info->instance_id, - p_info->stage_idx, p_info->param_size, p_info->param_type); - - if (!prtd->lsm_client || - prtd->lsm_client->num_stages <= p_info->stage_idx) { - dev_err(rtd->dev, - "%s: invalid stage_idx(%d) for client(%p) having num_stages(%d)\n", - __func__, p_info->stage_idx, prtd->lsm_client, - prtd->lsm_client ? prtd->lsm_client->num_stages : 0); - return -EINVAL; - } - - switch (p_info->param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: - rc = msm_lsm_set_epd(substream, p_info); - break; - case LSM_OPERATION_MODE: - rc = msm_lsm_set_mode(substream, p_info); - break; - case LSM_GAIN: - rc = msm_lsm_set_gain(substream, p_info); - break; - case LSM_MIN_CONFIDENCE_LEVELS: - rc = msm_lsm_set_conf(substream, p_info); - break; - case LSM_REG_SND_MODEL: - rc = msm_lsm_reg_model(substream, p_info); - break; - case LSM_DEREG_SND_MODEL: - rc = msm_lsm_dereg_model(substream, p_info); - break; - case LSM_CUSTOM_PARAMS: - rc = msm_lsm_set_custom(substream, p_info); - break; - case LSM_POLLING_ENABLE: - rc = msm_lsm_set_poll_enable(substream, p_info); - break; - case LSM_DET_EVENT_TYPE: - rc = msm_lsm_set_det_event_type(substream, p_info); - break; - case LSM_LAB_CONTROL: - rc = msm_lsm_set_lab_control(substream, p_info); - break; - default: - dev_err(rtd->dev, - "%s: Invalid param_type %d\n", - __func__, p_info->param_type); - rc = -EINVAL; - break; - } - if (rc) { - pr_err("%s: set_param fail for param_type %d\n", - __func__, p_info->param_type); - } - - return rc; -} - -static int msm_lsm_start_lab_buffer(struct lsm_priv *prtd, uint16_t status) -{ - struct lsm_client *lsm_client = prtd->lsm_client; - int rc = 0; - - if (lsm_client && lsm_client->lab_enable && - !lsm_client->lab_started && - status == LSM_VOICE_WAKEUP_STATUS_DETECTED) { - atomic_set(&prtd->read_abort, 0); - atomic_set(&prtd->buf_count, 0); - prtd->appl_cnt = 0; - prtd->dma_write = 0; - prtd->xrun_count = 0; - prtd->xrun_index = 0; - - rc = msm_lsm_queue_lab_buffer(prtd, 0); - if (rc) - pr_err("%s: Queue buffer failed for lab rc = %d\n", - __func__, rc); - else - prtd->lsm_client->lab_started = true; - } - - return rc; -} - -static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_soc_pcm_runtime *rtd; - unsigned long flags; - int ret; - struct snd_lsm_sound_model_v2 snd_model_v2; - struct snd_lsm_session_data session_data; - struct snd_lsm_session_data_v2 ses_data_v2 = {0}; - int rc = 0, stage_idx; - int xchg = 0; - struct snd_pcm_runtime *runtime; - struct lsm_priv *prtd; - struct snd_lsm_detection_params det_params; - uint8_t *confidence_level = NULL; - uint32_t max_detection_stages_supported = LSM_MAX_STAGES_PER_SESSION; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return -EINVAL; - } - - runtime = substream->runtime; - prtd = runtime->private_data; - rtd = substream->private_data; - - switch (cmd) { - case SNDRV_LSM_SET_SESSION_DATA: - case SNDRV_LSM_SET_SESSION_DATA_V2: - - if (cmd == SNDRV_LSM_SET_SESSION_DATA) { - dev_dbg(rtd->dev, "%s: set session data\n", __func__); - rc = copy_from_user(&session_data, arg, sizeof(session_data)); - if (!rc) { - ses_data_v2.app_id = session_data.app_id; - ses_data_v2.num_stages = 1; - } - } else { - dev_dbg(rtd->dev, "%s: set session data_v2\n", __func__); - rc = copy_from_user(&ses_data_v2, arg, sizeof(ses_data_v2)); - } - if (rc) { - dev_err(rtd->dev, "%s: %s: copy_from_user failed\n", - __func__, "LSM_SET_SESSION_DATA(_V2)"); - return -EFAULT; - } - - if (ses_data_v2.app_id != LSM_VOICE_WAKEUP_APP_ID_V2) { - dev_err(rtd->dev, - "%s:Invalid App id %d for Listen client\n", - __func__, ses_data_v2.app_id); - rc = -EINVAL; - break; - } - - /* - * Before validating num_stages from user argument. - * Check ADSP support for multi-stage session, - * and reset max_detection_stages_supported to "1" if required. - */ - if (!q6lsm_adsp_supports_multi_stage_detection()) { - dev_dbg(rtd->dev, - "%s: multi-stage session not supported by adsp\n", __func__); - max_detection_stages_supported = 1; - } - - if (ses_data_v2.num_stages <= 0 || - ses_data_v2.num_stages > max_detection_stages_supported) { - dev_err(rtd->dev, - "%s: Unsupported number of stages req(%d)/max(%d)\n", - __func__, ses_data_v2.num_stages, - max_detection_stages_supported); - rc = -EINVAL; - break; - } - - prtd->lsm_client->app_id = ses_data_v2.app_id; - prtd->lsm_client->num_stages = ses_data_v2.num_stages; - for (stage_idx = LSM_STAGE_INDEX_FIRST; - stage_idx < ses_data_v2.num_stages; stage_idx++) { - prtd->lsm_client->stage_cfg[stage_idx].app_type = - ses_data_v2.stage_info[stage_idx].app_type; - prtd->lsm_client->stage_cfg[stage_idx].lpi_enable = - ses_data_v2.stage_info[stage_idx].lpi_enable; - } - - ret = q6lsm_open(prtd->lsm_client, ses_data_v2.app_id); - if (ret < 0) { - dev_err(rtd->dev, - "%s: lsm open failed, %d\n", - __func__, ret); - return ret; - } - prtd->lsm_client->opened = true; - dev_dbg(rtd->dev, "%s: Session_ID = %d, APP ID = %d, Num stages %d\n", - __func__, - prtd->lsm_client->session, - prtd->lsm_client->app_id, - prtd->lsm_client->num_stages); - break; - case SNDRV_LSM_REG_SND_MODEL_V2: { - /* - * With multi-stage support sm buff allocation/free usage param info - * to check stage index for which this sound model is being set, and - * to check whether sm data is sent using set param command or not. - * Hence, set param ids to '0' to indicate allocation is for legacy - * reg_sm cmd, where buffer for param header need not be allocated, - * also set stage index to LSM_STAGE_INDEX_FIRST. - */ - struct lsm_params_info_v2 p_info = {0}; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - - dev_dbg(rtd->dev, "%s: Registering sound model V2\n", - __func__); - memcpy(&snd_model_v2, arg, - sizeof(struct snd_lsm_sound_model_v2)); - if (snd_model_v2.num_confidence_levels > - MAX_NUM_CONFIDENCE) { - dev_err(rtd->dev, - "%s: Invalid conf_levels = %d, maximum allowed = %d\n", - __func__, snd_model_v2.num_confidence_levels, - MAX_NUM_CONFIDENCE); - rc = -EINVAL; - break; - } - rc = q6lsm_snd_model_buf_alloc(prtd->lsm_client, - snd_model_v2.data_size, &p_info); - if (rc) { - dev_err(rtd->dev, - "%s: q6lsm buffer alloc failed V2, size %d\n", - __func__, snd_model_v2.data_size); - break; - } - if (copy_from_user( - prtd->lsm_client->stage_cfg[p_info.stage_idx].sound_model.data, - snd_model_v2.data, snd_model_v2.data_size)) { - dev_err(rtd->dev, - "%s: copy from user data failed\n" - "data %pK size %d\n", __func__, - snd_model_v2.data, snd_model_v2.data_size); - q6lsm_snd_model_buf_free(prtd->lsm_client, &p_info); - rc = -EFAULT; - break; - } - - dev_dbg(rtd->dev, "SND Model Magic no byte[0] %x,\n" - "byte[1] %x, byte[2] %x byte[3] %x\n", - snd_model_v2.data[0], snd_model_v2.data[1], - snd_model_v2.data[2], snd_model_v2.data[3]); - prtd->lsm_client->num_confidence_levels = - snd_model_v2.num_confidence_levels; - - rc = msm_lsm_get_conf_levels(prtd->lsm_client, - snd_model_v2.confidence_level); - if (rc) { - dev_err(rtd->dev, - "%s: get_conf_levels failed, err = %d\n", - __func__, rc); - break; - } - - rc = q6lsm_register_sound_model(prtd->lsm_client, - snd_model_v2.detection_mode, - snd_model_v2.detect_failure); - if (rc < 0) { - dev_err(rtd->dev, - "%s: Register snd Model v2 failed =%d\n", - __func__, rc); - kfree(confidence_level); - q6lsm_snd_model_buf_free(prtd->lsm_client, &p_info); - } - - kfree(prtd->lsm_client->confidence_levels); - prtd->lsm_client->confidence_levels = NULL; - break; - } - case SNDRV_LSM_SET_PARAMS: - dev_dbg(rtd->dev, "%s: set_params\n", __func__); - memcpy(&det_params, arg, - sizeof(det_params)); - if (det_params.num_confidence_levels > - MAX_NUM_CONFIDENCE) { - rc = -EINVAL; - break; - } - - prtd->lsm_client->num_confidence_levels = - det_params.num_confidence_levels; - - rc = msm_lsm_get_conf_levels(prtd->lsm_client, - det_params.conf_level); - if (rc) { - dev_err(rtd->dev, - "%s: Failed to get conf_levels, err = %d\n", - __func__, rc); - break; - } - - rc = q6lsm_set_data(prtd->lsm_client, - det_params.detect_mode, - det_params.detect_failure); - if (rc) - dev_err(rtd->dev, - "%s: Failed to set params, err = %d\n", - __func__, rc); - - kfree(prtd->lsm_client->confidence_levels); - prtd->lsm_client->confidence_levels = NULL; - - break; - - case SNDRV_LSM_DEREG_SND_MODEL: - dev_dbg(rtd->dev, "%s: Deregistering sound model\n", - __func__); - rc = q6lsm_deregister_sound_model(prtd->lsm_client); - if (rc) - dev_err(rtd->dev, - "%s: Sound model de-register failed, err = %d\n", - __func__, rc); - break; - - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_EVENT_STATUS_V3: { - uint32_t ts_lsw, ts_msw; - uint16_t status = 0, payload_size = 0; - - dev_dbg(rtd->dev, "%s: Get event status\n", __func__); - atomic_set(&prtd->event_wait_stop, 0); - - /* - * Release the api lock before wait to allow - * other IOCTLs to be invoked while waiting - * for event - */ - mutex_unlock(&prtd->lsm_api_lock); - rc = wait_event_freezable(prtd->event_wait, - (cmpxchg(&prtd->event_avail, 1, 0) || - (xchg = atomic_cmpxchg(&prtd->event_wait_stop, - 1, 0)))); - mutex_lock(&prtd->lsm_api_lock); - dev_dbg(rtd->dev, "%s: wait_event_freezable %d event_wait_stop %d\n", - __func__, rc, xchg); - if (!rc && !xchg) { - dev_dbg(rtd->dev, "%s: New event available %ld\n", - __func__, prtd->event_avail); - spin_lock_irqsave(&prtd->event_lock, flags); - - if (prtd->event_status) { - payload_size = prtd->event_status->payload_size; - ts_lsw = prtd->event_status->timestamp_lsw; - ts_msw = prtd->event_status->timestamp_msw; - status = prtd->event_status->status; - spin_unlock_irqrestore(&prtd->event_lock, - flags); - } else { - spin_unlock_irqrestore(&prtd->event_lock, - flags); - rc = -EINVAL; - dev_err(rtd->dev, - "%s: prtd->event_status is NULL\n", - __func__); - break; - } - - if (cmd == SNDRV_LSM_EVENT_STATUS) { - struct snd_lsm_event_status *user = arg; - - if (user->payload_size < payload_size) { - dev_dbg(rtd->dev, - "%s: provided %d bytes isn't enough, needs %d bytes\n", - __func__, user->payload_size, - payload_size); - rc = -ENOMEM; - } else { - user->status = status; - user->payload_size = payload_size; - memcpy(user->payload, - prtd->event_status->payload, - payload_size); - } - } else { - struct snd_lsm_event_status_v3 *user_v3 = arg; - - if (user_v3->payload_size < payload_size) { - dev_dbg(rtd->dev, - "%s: provided %d bytes isn't enough, needs %d bytes\n", - __func__, user_v3->payload_size, - payload_size); - rc = -ENOMEM; - } else { - user_v3->timestamp_lsw = ts_lsw; - user_v3->timestamp_msw = ts_msw; - user_v3->status = status; - user_v3->payload_size = payload_size; - memcpy(user_v3->payload, - prtd->event_status->payload, - payload_size); - } - } - - if (!rc) - rc = msm_lsm_start_lab_buffer(prtd, status); - } else if (xchg) { - dev_dbg(rtd->dev, "%s: Wait aborted\n", __func__); - rc = 0; - } - break; - } - - case SNDRV_LSM_GENERIC_DET_EVENT: { - struct snd_lsm_event_status *user = arg; - uint16_t status = 0; - uint16_t payload_size = 0; - - dev_dbg(rtd->dev, - "%s: SNDRV_LSM_GENERIC_DET_EVENT\n", __func__); - - atomic_set(&prtd->event_wait_stop, 0); - - /* - * Release the api lock before wait to allow - * other IOCTLs to be invoked while waiting - * for event - */ - mutex_unlock(&prtd->lsm_api_lock); - rc = wait_event_freezable(prtd->event_wait, - (cmpxchg(&prtd->event_avail, 1, 0) || - (xchg = atomic_cmpxchg(&prtd->event_wait_stop, - 1, 0)))); - mutex_lock(&prtd->lsm_api_lock); - - dev_dbg(rtd->dev, "%s: wait_event_freezable %d event_wait_stop %d\n", - __func__, rc, xchg); - - if (!rc && !xchg) { - dev_dbg(rtd->dev, "%s: %s: New event available %ld\n", - __func__, "SNDRV_LSM_GENERIC_DET_EVENT", - prtd->event_avail); - - spin_lock_irqsave(&prtd->event_lock, flags); - - if (prtd->det_event) { - payload_size = prtd->det_event->payload_size; - status = prtd->det_event->status; - spin_unlock_irqrestore(&prtd->event_lock, - flags); - } else { - spin_unlock_irqrestore(&prtd->event_lock, - flags); - dev_err(rtd->dev, - "%s: %s: prtd->event_status is NULL\n", - __func__, - "SNDRV_LSM_GENERIC_DET_EVENT"); - rc = -EINVAL; - break; - } - - if (user->payload_size < payload_size) { - dev_err(rtd->dev, - "%s: provided %d bytes isn't enough, needs %d bytes\n", - __func__, user->payload_size, - payload_size); - rc = -ENOMEM; - break; - } - user->status = status; - user->payload_size = payload_size; - memcpy(user->payload, prtd->det_event->payload, - payload_size); - - rc = msm_lsm_start_lab_buffer(prtd, status); - } else if (xchg) { - dev_dbg(rtd->dev, "%s: %s: Wait aborted\n", - __func__, "SNDRV_LSM_GENERIC_DET_EVENT"); - rc = 0; - } - break; - } - - case SNDRV_LSM_ABORT_EVENT: - dev_dbg(rtd->dev, "%s: Aborting event status wait\n", - __func__); - atomic_set(&prtd->event_wait_stop, 1); - wake_up(&prtd->event_wait); - break; - - case SNDRV_LSM_START: - dev_dbg(rtd->dev, "%s: Starting LSM client session\n", - __func__); - if (!prtd->lsm_client->started) { - ret = q6lsm_start(prtd->lsm_client, true); - if (!ret) { - prtd->lsm_client->started = true; - dev_dbg(rtd->dev, "%s: LSM client session started\n", - __func__); - } - } - break; - - case SNDRV_LSM_STOP: { - dev_dbg(rtd->dev, - "%s: Stopping LSM client session\n", - __func__); - if (prtd->lsm_client->started) { - if (prtd->lsm_client->lab_enable) { - atomic_set(&prtd->read_abort, 1); - if (prtd->lsm_client->lab_started) { - ret = q6lsm_stop_lab(prtd->lsm_client); - if (ret) - dev_err(rtd->dev, - "%s: stop lab failed ret %d\n", - __func__, ret); - prtd->lsm_client->lab_started = false; - } - } - ret = q6lsm_stop(prtd->lsm_client, true); - if (!ret) - dev_dbg(rtd->dev, - "%s: LSM client session stopped %d\n", - __func__, ret); - prtd->lsm_client->started = false; - } - break; - } - case SNDRV_LSM_LAB_CONTROL: { - u32 enable = 0; - struct lsm_params_info_v2 p_info = {0}; - - if (prtd->lsm_client->num_stages > 1) { - dev_err(rtd->dev, "%s: %s: not supported for multi stage session\n", - __func__, "LSM_LAB_CONTROL"); - return -EINVAL; - } - - if (copy_from_user(&enable, arg, sizeof(enable))) { - dev_err(rtd->dev, "%s: %s: copy_frm_user failed\n", - __func__, "LSM_LAB_CONTROL"); - return -EFAULT; - } - - dev_dbg(rtd->dev, "%s: ioctl %s, enable = %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", enable); - - if (prtd->lsm_client->started) { - dev_err(rtd->dev, "%s: ioctl %s issued after start", - __func__, "SNDRV_LSM_LAB_CONTROL"); - rc = -EINVAL; - break; - } - - /* - * With multi-stage support lab control needs to set param info - * specifying stage index for which this lab control is issued, - * along with values of module/instance ids applicable for the stage. - * Hence, set param info with default lab module/instance ids, and - * set stage index to LSM_STAGE_INDEX_FIRST. - */ - p_info.param_type = LSM_LAB_CONTROL; - p_info.module_id = LSM_MODULE_ID_LAB; - p_info.instance_id = INSTANCE_ID_0; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - p_info.param_size = 0; - rc = msm_lsm_check_and_set_lab_controls(substream, enable, &p_info); - break; - } - case SNDRV_LSM_STOP_LAB: - dev_dbg(rtd->dev, "%s: stopping LAB\n", __func__); - if (prtd->lsm_client->lab_enable && - prtd->lsm_client->lab_started) { - atomic_set(&prtd->read_abort, 1); - rc = q6lsm_stop_lab(prtd->lsm_client); - if (rc) - dev_err(rtd->dev, - "%s: Lab stop failed for session %d rc %d\n", - __func__, - prtd->lsm_client->session, rc); - prtd->lsm_client->lab_started = false; - } - break; - - case SNDRV_LSM_SET_PORT: - dev_dbg(rtd->dev, "%s: set LSM port\n", __func__); - rc = q6lsm_set_port_connected(prtd->lsm_client); - break; - - case SNDRV_LSM_SET_FWK_MODE_CONFIG: { - u32 mode; - - if (copy_from_user(&mode, arg, sizeof(mode))) { - dev_err(rtd->dev, "%s: %s: copy_frm_user failed\n", - __func__, "LSM_SET_FWK_MODE_CONFIG"); - return -EFAULT; - } - - dev_dbg(rtd->dev, "%s: ioctl %s, enable = %d\n", - __func__, "SNDRV_LSM_SET_FWK_MODE_CONFIG", mode); - if (prtd->lsm_client->event_mode == mode) { - dev_dbg(rtd->dev, - "%s: mode for %d already set to %d\n", - __func__, prtd->lsm_client->session, mode); - rc = 0; - } else { - dev_dbg(rtd->dev, "%s: Event mode = %d\n", - __func__, mode); - rc = q6lsm_set_fwk_mode_cfg(prtd->lsm_client, mode); - if (!rc) - prtd->lsm_client->event_mode = mode; - else - dev_err(rtd->dev, - "%s: set event mode failed %d\n", - __func__, rc); - } - break; - } - case SNDRV_LSM_SET_INPUT_HW_PARAMS: { - struct lsm_hw_params *in_params; - struct snd_lsm_input_hw_params params; - - if (copy_from_user(¶ms, arg, sizeof(params))) { - dev_err(rtd->dev, "%s: %s: copy_from_user failed\n", - __func__, "LSM_SET_INPUT_HW_PARAMS"); - return -EFAULT; - } - - in_params = &prtd->lsm_client->in_hw_params; - in_params->sample_rate = params.sample_rate; - in_params->sample_size = params.bit_width; - in_params->num_chs = params.num_channels; - - break; - } - - default: - dev_dbg(rtd->dev, - "%s: Falling into default snd_lib_ioctl cmd 0x%x\n", - __func__, cmd); - rc = snd_pcm_lib_ioctl(substream, cmd, arg); - break; - } - - if (!rc) - dev_dbg(rtd->dev, "%s: leave (%d)\n", - __func__, rc); - else - dev_err(rtd->dev, "%s: cmd 0x%x failed %d\n", - __func__, cmd, rc); - - return rc; -} - -static int msm_lsm_check_event_type(struct lsm_client *lsm_client, - unsigned int cmd) -{ - int err = 0; - uint32_t event_type = lsm_client->event_type; - - if (cmd == SNDRV_LSM_EVENT_STATUS && - event_type != LSM_DET_EVENT_TYPE_LEGACY) { - pr_err("%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_EVENT_STATUS"); - err = -EINVAL; - } else if (cmd == SNDRV_LSM_GENERIC_DET_EVENT && - event_type != LSM_DET_EVENT_TYPE_GENERIC) { - pr_err("%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_GENERIC_DET_EVENT"); - err = -EINVAL; - } - - return err; -} - -#ifdef CONFIG_COMPAT - -struct snd_lsm_event_status32 { - u16 status; - u16 payload_size; - u8 payload[0]; -}; - -struct snd_lsm_event_status_v3_32 { - u32 timestamp_lsw; - u32 timestamp_msw; - u16 status; - u16 payload_size; - u8 payload[0]; -}; - -struct snd_lsm_sound_model_v2_32 { - compat_uptr_t data; - compat_uptr_t confidence_level; - u32 data_size; - enum lsm_detection_mode detection_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct snd_lsm_detection_params_32 { - compat_uptr_t conf_level; - enum lsm_detection_mode detect_mode; - u8 num_confidence_levels; - bool detect_failure; -}; - -struct lsm_params_info_32 { - u32 module_id; - u32 param_id; - u32 param_size; - compat_uptr_t param_data; - uint32_t param_type; -}; - -struct lsm_params_info_v2_32 { - u32 module_id; - u32 param_id; - u32 param_size; - compat_uptr_t param_data; - uint32_t param_type; - u16 instance_id; - u16 stage_idx; -}; - -struct snd_lsm_module_params_32 { - compat_uptr_t params; - u32 num_params; - u32 data_size; -}; - -enum { - SNDRV_LSM_REG_SND_MODEL_V2_32 = - _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), - SNDRV_LSM_SET_PARAMS_32 = - _IOW('U', 0x0A, struct snd_lsm_detection_params_32), - SNDRV_LSM_SET_MODULE_PARAMS_32 = - _IOW('U', 0x0B, struct snd_lsm_module_params_32), - SNDRV_LSM_EVENT_STATUS_V3_32 = - _IOW('U', 0x0F, struct snd_lsm_event_status_v3_32), - SNDRV_LSM_SET_MODULE_PARAMS_V2_32 = - _IOW('U', 0x13, struct snd_lsm_module_params_32), -}; - -static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, - unsigned int cmd, void __user *arg) -{ - struct snd_pcm_runtime *runtime; - struct lsm_priv *prtd; - struct snd_soc_pcm_runtime *rtd; - int err = 0; - u32 size = 0; - - if (PCM_RUNTIME_CHECK(substream)) - return -ENXIO; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return -EINVAL; - } - runtime = substream->runtime; - rtd = substream->private_data; - prtd = runtime->private_data; - - mutex_lock(&prtd->lsm_api_lock); - - switch (cmd) { - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_GENERIC_DET_EVENT: { - struct snd_lsm_event_status userarg32, *user32 = NULL; - struct snd_lsm_event_status *user = NULL; - - dev_dbg(rtd->dev, - "%s: %s\n", __func__, - (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - - err = msm_lsm_check_event_type(prtd->lsm_client, cmd); - if (err) - goto done; - - if (copy_from_user(&userarg32, arg, sizeof(userarg32))) { - dev_err(rtd->dev, "%s: %s: Failed to copy from user\n", - __func__, (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - err = -EFAULT; - goto done; - } - - if (userarg32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(*user) + userarg32.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - err = -ENOMEM; - goto done; - } - - user->payload_size = userarg32.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - if (err) { - dev_err(rtd->dev, - "%s: msm_lsm_ioctl_shared() failed, err = %d", - __func__, err); - kfree(user); - goto done; - } - - /* Update size with actual payload size */ - size = sizeof(userarg32) + user->payload_size; - if (!access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: Failed to verify write, size = %d\n", - __func__, size); - err = -EFAULT; - kfree(user); - goto done; - } - - user32 = kzalloc(size, GFP_KERNEL); - if (!user32) { - err = -ENOMEM; - kfree(user); - goto done; - } - user32->status = user->status; - user32->payload_size = user->payload_size; - memcpy(user32->payload, user->payload, - user32->payload_size); - - if (copy_to_user(arg, user32, size)) { - dev_err(rtd->dev, - "%s: Failed to copy payload to user, size = %d", - __func__, size); - err = -EFAULT; - } - kfree(user); - kfree(user32); - break; - } - - case SNDRV_LSM_EVENT_STATUS_V3_32: { - struct snd_lsm_event_status_v3_32 userarg32, *user32 = NULL; - struct snd_lsm_event_status_v3 *user = NULL; - - if (prtd->lsm_client->event_type != - LSM_DET_EVENT_TYPE_LEGACY) { - dev_err(rtd->dev, - "%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_EVENT_STATUS_V3_32"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&userarg32, arg, sizeof(userarg32))) { - dev_err(rtd->dev, "%s: err copyuser ioctl %s\n", - __func__, "SNDRV_LSM_EVENT_STATUS_V3_32"); - err = -EFAULT; - goto done; - } - - if (userarg32.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - pr_err("%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg32.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(*user) + userarg32.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - dev_err(rtd->dev, - "%s: Allocation failed event status size %d\n", - __func__, size); - err = -ENOMEM; - goto done; - } - cmd = SNDRV_LSM_EVENT_STATUS_V3; - user->payload_size = userarg32.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - - /* Update size with actual payload size */ - size = sizeof(userarg32) + user->payload_size; - if (!err && !access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: write verify failed size %d\n", - __func__, size); - err = -EFAULT; - } - if (!err) { - user32 = kzalloc(size, GFP_KERNEL); - if (!user32) { - dev_err(rtd->dev, - "%s: Allocation event user status size %d\n", - __func__, size); - err = -EFAULT; - } else { - user32->timestamp_lsw = user->timestamp_lsw; - user32->timestamp_msw = user->timestamp_msw; - user32->status = user->status; - user32->payload_size = user->payload_size; - memcpy(user32->payload, - user->payload, user32->payload_size); - } - } - if (!err && (copy_to_user(arg, user32, size))) { - dev_err(rtd->dev, "%s: failed to copy payload %d", - __func__, size); - err = -EFAULT; - } - kfree(user); - kfree(user32); - if (err) - dev_err(rtd->dev, "%s: lsmevent failed %d", - __func__, err); - break; - } - - case SNDRV_LSM_REG_SND_MODEL_V2_32: { - struct snd_lsm_sound_model_v2_32 snd_modelv232; - struct snd_lsm_sound_model_v2 snd_modelv2; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "REG_SND_MODEL_V2"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&snd_modelv232, arg, - sizeof(snd_modelv232))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: copy user failed, size %zd %s\n", - __func__, - sizeof(struct snd_lsm_sound_model_v2_32), - "SNDRV_LSM_REG_SND_MODEL_V2_32"); - } else { - snd_modelv2.confidence_level = - compat_ptr(snd_modelv232.confidence_level); - snd_modelv2.data = compat_ptr(snd_modelv232.data); - snd_modelv2.data_size = snd_modelv232.data_size; - snd_modelv2.detect_failure = - snd_modelv232.detect_failure; - snd_modelv2.detection_mode = - snd_modelv232.detection_mode; - snd_modelv2.num_confidence_levels = - snd_modelv232.num_confidence_levels; - cmd = SNDRV_LSM_REG_SND_MODEL_V2; - err = msm_lsm_ioctl_shared(substream, cmd, - &snd_modelv2); - if (err) - dev_err(rtd->dev, - "%s: ioctl %s failed\n", __func__, - "SNDDRV_LSM_REG_SND_MODEL_V2_32"); - } - break; - } - - case SNDRV_LSM_SET_PARAMS_32:{ - struct snd_lsm_detection_params_32 det_params32; - struct snd_lsm_detection_params det_params; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SET_PARAMS_32"); - err = -EINVAL; - } - - if (copy_from_user(&det_params32, arg, - sizeof(det_params32))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS_32", - sizeof(det_params32)); - } else { - det_params.conf_level = - compat_ptr(det_params32.conf_level); - det_params.detect_mode = - det_params32.detect_mode; - det_params.num_confidence_levels = - det_params32.num_confidence_levels; - det_params.detect_failure = - det_params32.detect_failure; - cmd = SNDRV_LSM_SET_PARAMS; - err = msm_lsm_ioctl_shared(substream, cmd, - &det_params); - if (err) - dev_err(rtd->dev, - "%s: ioctl %s failed\n", __func__, - "SNDRV_LSM_SET_PARAMS"); - } - break; - } - - case SNDRV_LSM_SET_MODULE_PARAMS_32: - case SNDRV_LSM_SET_MODULE_PARAMS_V2_32: { - struct snd_lsm_module_params_32 p_data_32; - struct snd_lsm_module_params p_data; - u8 *params32; - size_t expected_size = 0, count; - struct lsm_params_info_32 *p_info_32 = NULL; - struct lsm_params_info_v2_32 *p_info_v2_32 = NULL; - struct lsm_params_info_v2 p_info; - - if (!prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS(_V2)_32"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data_32, arg, - sizeof(p_data_32))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "SET_MODULE_PARAMS(_V2)_32", - sizeof(p_data_32)); - err = -EFAULT; - goto done; - } - - p_data.params = compat_ptr(p_data_32.params); - p_data.num_params = p_data_32.num_params; - p_data.data_size = p_data_32.data_size; - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS(_V2)_32", - p_data.num_params); - err = -EINVAL; - goto done; - } - - expected_size = (cmd == SNDRV_LSM_SET_MODULE_PARAMS_32) ? - p_data.num_params * sizeof(struct lsm_params_info_32) : - p_data.num_params * sizeof(struct lsm_params_info_v2_32); - - if (p_data.data_size != expected_size) { - dev_err(rtd->dev, - "%s: %s: Invalid size %d\n", - __func__, "SET_MODULE_PARAMS(_V2)_32", - p_data.data_size); - err = -EINVAL; - goto done; - } - - params32 = kzalloc(p_data.data_size, GFP_KERNEL); - if (!params32) { - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params32, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "params32", p_data.data_size); - kfree(params32); - err = -EFAULT; - goto done; - } - - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS_32) - p_info_32 = (struct lsm_params_info_32 *) params32; - else - p_info_v2_32 = (struct lsm_params_info_v2_32 *) params32; - - for (count = 0; count < p_data.num_params; count++) { - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS_32) { - p_info.module_id = p_info_32->module_id; - p_info.param_id = p_info_32->param_id; - p_info.param_size = p_info_32->param_size; - p_info.param_data = compat_ptr(p_info_32->param_data); - p_info.param_type = p_info_32->param_type; - - p_info.instance_id = INSTANCE_ID_0; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - - p_info_32++; - } else { - p_info.module_id = p_info_v2_32->module_id; - p_info.param_id = p_info_v2_32->param_id; - p_info.param_size = p_info_v2_32->param_size; - p_info.param_data = compat_ptr(p_info_v2_32->param_data); - p_info.param_type = p_info_v2_32->param_type; - - p_info.instance_id = p_info_v2_32->instance_id; - p_info.stage_idx = p_info_v2_32->stage_idx; - - p_info_v2_32++; - } - - err = msm_lsm_process_params(substream, &p_info); - if (err) - dev_err(rtd->dev, - "%s: Failed to process param, type%d stage=%d err=%d\n", - __func__, p_info.param_type, p_info.stage_idx, err); - } - - kfree(params32); - break; - } - case SNDRV_LSM_REG_SND_MODEL_V2: - case SNDRV_LSM_SET_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS_V2: - /* - * In ideal cases, the compat_ioctl should never be called - * with the above unlocked ioctl commands. Print error - * and return error if it does. - */ - dev_err(rtd->dev, - "%s: Invalid cmd for compat_ioctl\n", - __func__); - err = -EINVAL; - break; - default: - err = msm_lsm_ioctl_shared(substream, cmd, arg); - break; - } -done: - mutex_unlock(&prtd->lsm_api_lock); - return err; -} -#else -#define msm_lsm_ioctl_compat NULL -#endif - -static int msm_lsm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void __user *arg) -{ - int err = 0; - u32 size = 0; - struct snd_pcm_runtime *runtime; - struct snd_soc_pcm_runtime *rtd; - struct lsm_priv *prtd; - - if (!substream || !substream->private_data) { - pr_err("%s: Invalid %s\n", __func__, - (!substream) ? "substream" : "private_data"); - return -EINVAL; - } - runtime = substream->runtime; - prtd = runtime->private_data; - rtd = substream->private_data; - - mutex_lock(&prtd->lsm_api_lock); - switch (cmd) { - case SNDRV_LSM_REG_SND_MODEL_V2: { - struct snd_lsm_sound_model_v2 snd_model_v2; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "REG_SND_MODEL_V2"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&snd_model_v2, arg, sizeof(snd_model_v2))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, - sizeof(struct snd_lsm_sound_model_v2)); - } - if (!err) - err = msm_lsm_ioctl_shared(substream, cmd, - &snd_model_v2); - if (err) - dev_err(rtd->dev, - "%s REG_SND_MODEL failed err %d\n", - __func__, err); - goto done; - } - break; - case SNDRV_LSM_SET_PARAMS: { - struct snd_lsm_detection_params det_params; - - if (prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if using topology\n", - __func__, "SET_PARAMS"); - err = -EINVAL; - goto done; - } - - pr_debug("%s: SNDRV_LSM_SET_PARAMS\n", __func__); - - if (copy_from_user(&det_params, arg, - sizeof(det_params))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size %zd\n", - __func__, "SNDRV_LSM_SET_PARAMS", - sizeof(det_params)); - err = -EFAULT; - } - - if (!err) - err = msm_lsm_ioctl_shared(substream, cmd, - &det_params); - else - dev_err(rtd->dev, - "%s: LSM_SET_PARAMS failed, err %d\n", - __func__, err); - - goto done; - } - - case SNDRV_LSM_SET_MODULE_PARAMS: - case SNDRV_LSM_SET_MODULE_PARAMS_V2: { - struct snd_lsm_module_params p_data; - struct lsm_params_info *temp_ptr_info = NULL; - struct lsm_params_info_v2 info_v2; - struct lsm_params_info_v2 *ptr_info_v2 = NULL, *temp_ptr_info_v2 = NULL; - size_t p_size = 0, count; - u8 *params; - - if (!prtd->lsm_client->use_topology) { - dev_err(rtd->dev, - "%s: %s: not supported if not using topology\n", - __func__, "SET_MODULE_PARAMS(_V2)"); - err = -EINVAL; - goto done; - } - - if (copy_from_user(&p_data, arg, - sizeof(p_data))) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %zd\n", - __func__, "p_data", sizeof(p_data)); - err = -EFAULT; - goto done; - } - - if (p_data.num_params > LSM_PARAMS_MAX) { - dev_err(rtd->dev, - "%s: %s: Invalid num_params %d\n", - __func__, "SET_MODULE_PARAMS(_V2)", - p_data.num_params); - err = -EINVAL; - goto done; - } - - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS) - p_size = p_data.num_params * sizeof(struct lsm_params_info); - else - p_size = p_data.num_params * sizeof(struct lsm_params_info_v2); - - if (p_data.data_size != p_size) { - dev_err(rtd->dev, - "%s: %s: Invalid data_size(%u) against expected(%zd)\n", - __func__, "SET_MODULE_PARAMS(_V2)", - p_data.data_size, p_size); - err = -EFAULT; - goto done; - } - - params = kzalloc(p_size, GFP_KERNEL); - if (!params) { - err = -ENOMEM; - goto done; - } - - if (copy_from_user(params, p_data.params, - p_data.data_size)) { - dev_err(rtd->dev, - "%s: %s: copy_from_user failed, size = %d\n", - __func__, "set module params", p_data.data_size); - kfree(params); - err = -EFAULT; - goto done; - } - - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS) - temp_ptr_info = (struct lsm_params_info *)params; - else - temp_ptr_info_v2 = (struct lsm_params_info_v2 *)params; - - for (count = 0; count < p_data.num_params; count++) { - if (cmd == SNDRV_LSM_SET_MODULE_PARAMS) { - /* convert to V2 param info struct from legacy param info */ - info_v2.module_id = temp_ptr_info->module_id; - info_v2.param_id = temp_ptr_info->param_id; - info_v2.param_size = temp_ptr_info->param_size; - info_v2.param_data = temp_ptr_info->param_data; - info_v2.param_type = temp_ptr_info->param_type; - - info_v2.instance_id = INSTANCE_ID_0; - info_v2.stage_idx = LSM_STAGE_INDEX_FIRST; - - ptr_info_v2 = &info_v2; - temp_ptr_info++; - } else { - /* Just copy the pointer as user already provided v2 params */ - ptr_info_v2 = temp_ptr_info_v2; - temp_ptr_info_v2++; - } - err = msm_lsm_process_params(substream, ptr_info_v2); - if (err) - dev_err(rtd->dev, - "%s: Failed to process param, type%d stage=%d err=%d\n", - __func__, ptr_info_v2->param_type, - ptr_info_v2->stage_idx, err); - } - kfree(params); - break; - } - - case SNDRV_LSM_EVENT_STATUS: - case SNDRV_LSM_GENERIC_DET_EVENT: { - struct snd_lsm_event_status *user = NULL; - struct snd_lsm_event_status userarg; - - dev_dbg(rtd->dev, - "%s: %s\n", __func__, - (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - - err = msm_lsm_check_event_type(prtd->lsm_client, cmd); - if (err) - goto done; - - if (copy_from_user(&userarg, arg, sizeof(userarg))) { - dev_err(rtd->dev, - "%s: %s: Copy from user failed\n", __func__, - (cmd == SNDRV_LSM_EVENT_STATUS) ? - "SNDRV_LSM_EVENT_STATUS" : - "SNDRV_LSM_GENERIC_DET_EVENT"); - err = -EFAULT; - goto done; - } - - if (userarg.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - dev_err(rtd->dev, - "%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(struct snd_lsm_event_status) + - userarg.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - err = -ENOMEM; - goto done; - } - - user->payload_size = userarg.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - if (err) { - dev_err(rtd->dev, - "%s: msm_lsm_ioctl_shared() failed, err = %d", - __func__, err); - kfree(user); - goto done; - } - - /* Update size with actual payload size */ - size = sizeof(*user) + user->payload_size; - if (!access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: Failed to verify write, size = %d\n", - __func__, size); - err = -EFAULT; - } - if (!err && copy_to_user(arg, user, size)) { - dev_err(rtd->dev, - "%s: Failed to copy payload to user, size = %d\n", - __func__, size); - err = -EFAULT; - } - - kfree(user); - break; - } - - case SNDRV_LSM_EVENT_STATUS_V3: { - struct snd_lsm_event_status_v3 *user = NULL; - struct snd_lsm_event_status_v3 userarg; - - dev_dbg(rtd->dev, - "%s: SNDRV_LSM_EVENT_STATUS_V3\n", __func__); - - if (prtd->lsm_client->event_type != - LSM_DET_EVENT_TYPE_LEGACY) { - dev_err(rtd->dev, - "%s: %s: Invalid event request\n", - __func__, "SNDRV_LSM_EVENT_STATUS_V3"); - err = -EINVAL; - goto done; - } - - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid params event_status_v3\n", - __func__); - err = -EINVAL; - goto done; - } - if (copy_from_user(&userarg, arg, sizeof(userarg))) { - dev_err(rtd->dev, - "%s: err copyuser event_status_v3\n", - __func__); - err = -EFAULT; - goto done; - } - - if (userarg.payload_size > - LISTEN_MAX_STATUS_PAYLOAD_SIZE) { - pr_err("%s: payload_size %d is invalid, max allowed = %d\n", - __func__, userarg.payload_size, - LISTEN_MAX_STATUS_PAYLOAD_SIZE); - err = -EINVAL; - goto done; - } - - size = sizeof(struct snd_lsm_event_status_v3) + - userarg.payload_size; - user = kzalloc(size, GFP_KERNEL); - if (!user) { - dev_err(rtd->dev, - "%s: Allocation failed event status size %d\n", - __func__, size); - err = -EFAULT; - goto done; - } - user->payload_size = userarg.payload_size; - err = msm_lsm_ioctl_shared(substream, cmd, user); - - /* Update size with actual payload size */ - size = sizeof(*user) + user->payload_size; - if (!err && !access_ok(VERIFY_WRITE, arg, size)) { - dev_err(rtd->dev, - "%s: write verify failed size %d\n", - __func__, size); - err = -EFAULT; - } - if (!err && (copy_to_user(arg, user, size))) { - dev_err(rtd->dev, - "%s: failed to copy payload %d", - __func__, size); - err = -EFAULT; - } - kfree(user); - if (err) - dev_err(rtd->dev, - "%s: lsm_event_v3 failed %d", __func__, err); - break; - } - - default: - err = msm_lsm_ioctl_shared(substream, cmd, arg); - break; - } -done: - mutex_unlock(&prtd->lsm_api_lock); - return err; -} - -static int msm_lsm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd; - int ret = 0; - - pr_debug("%s\n", __func__); - prtd = kzalloc(sizeof(struct lsm_priv), GFP_KERNEL); - if (!prtd) { - pr_err("%s: Failed to allocate memory for lsm_priv\n", - __func__); - return -ENOMEM; - } - mutex_init(&prtd->lsm_api_lock); - spin_lock_init(&prtd->event_lock); - spin_lock_init(&prtd->xrun_lock); - init_waitqueue_head(&prtd->event_wait); - init_waitqueue_head(&prtd->period_wait); - prtd->substream = substream; - runtime->private_data = prtd; - runtime->hw = msm_pcm_hardware_capture; - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_info("%s: snd_pcm_hw_constraint_list failed ret %d\n", - __func__, ret); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("%s: snd_pcm_hw_constraint_integer failed ret %d\n", - __func__, ret); - - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - CAPTURE_MIN_NUM_PERIODS * CAPTURE_MIN_PERIOD_SIZE, - CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE); - if (ret < 0) - pr_info("%s: constraint for buffer bytes min max ret = %d\n", - __func__, ret); - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32); - if (ret < 0) { - pr_info("%s: constraint for period bytes step ret = %d\n", - __func__, ret); - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32); - if (ret < 0) - pr_info("%s: constraint for buffer bytes step ret = %d\n", - __func__, ret); - prtd->lsm_client = q6lsm_client_alloc( - lsm_event_handler, prtd); - if (!prtd->lsm_client) { - pr_err("%s: Could not allocate memory\n", __func__); - kfree(prtd); - runtime->private_data = NULL; - return -ENOMEM; - } - prtd->lsm_client->opened = false; - prtd->lsm_client->session_state = IDLE; - prtd->lsm_client->poll_enable = true; - prtd->lsm_client->perf_mode = 0; - prtd->lsm_client->event_mode = LSM_EVENT_NON_TIME_STAMP_MODE; - prtd->lsm_client->event_type = LSM_DET_EVENT_TYPE_LEGACY; - - return 0; -} - -static int msm_lsm_send_ch_mix_config(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - struct lsm_hw_params *in_params; - int pp_ch_cnt; - int *ch_wght_coeff; - int ret = 0, i, idx; - - /* - * The output channels from channel mixer is the input to LSM (stream) - * side and is read from in_params->num_chs. - * - * The input channels to channel mixer are the output channels from - * the device side (routing) and is obtained by reading the - * pp_ch_cnt. - * - * For LSM to be functional, only unity channel mixing is allowed. - */ - - in_params = &prtd->lsm_client->in_hw_params; - rtd = prtd->substream->private_data; - pp_ch_cnt = msm_pcm_routing_get_pp_ch_cnt(rtd->dai_link->id, - SESSION_TYPE_TX); - if (pp_ch_cnt < 0 || - pp_ch_cnt > LSM_V3P0_MAX_NUM_CHANNELS || - in_params->num_chs > LSM_V3P0_MAX_NUM_CHANNELS) { - dev_err(rtd->dev, - "%s: invalid ch cnt, pp_ch_cnt %d in_ch_cnt %d\n", - __func__, pp_ch_cnt, in_params->num_chs); - return -EINVAL; - } - - if (!pp_ch_cnt || - (pp_ch_cnt == in_params->num_chs)) { - dev_dbg(rtd->dev, - "%s: Skip ch mixing, pp_ch_cnt %d in_ch_cnt %d\n", - __func__, pp_ch_cnt, in_params->num_chs); - return 0; - } - - ch_wght_coeff = kzalloc(in_params->num_chs * pp_ch_cnt * sizeof(int), - GFP_KERNEL); - if (!ch_wght_coeff) - return -ENOMEM; - - /* - * channel weight co-efficients is a m X n array, where - * m = number of input channels to ch mixer (pp_ch_cnt) - * n = number of output channels from ch mixer (in_params->num_chs) - */ - for (i = 0; i < in_params->num_chs; i++) { - idx = (i * pp_ch_cnt) + i; - ch_wght_coeff[idx] = 1; - } - - ret = msm_pcm_routing_send_chmix_cfg(rtd->dai_link->id, - pp_ch_cnt, in_params->num_chs, - ch_wght_coeff, - SESSION_TYPE_TX, STREAM_TYPE_LSM); - if (ret) - dev_err(rtd->dev, - "%s: Failed to configure channel mixer err %d\n", - __func__, ret); - - kfree(ch_wght_coeff); - - return ret; -} - -static int msm_lsm_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - - rtd = prtd->substream->private_data; - - if (!prtd->lsm_client) { - dev_err(rtd->dev, - "%s: LSM client data ptr is NULL\n", __func__); - return -EINVAL; - } - - if (q6lsm_set_media_fmt_v2_params(prtd->lsm_client)) - dev_dbg(rtd->dev, - "%s: failed to set lsm media fmt params\n", __func__); - - if (prtd->lsm_client->session_state == IDLE) { - ret = msm_pcm_routing_reg_phy_compr_stream( - rtd->dai_link->id, - prtd->lsm_client->perf_mode, - prtd->lsm_client->session, - SNDRV_PCM_STREAM_CAPTURE, - LISTEN); - if (ret) { - dev_err(rtd->dev, - "%s: register phy compr stream failed %d\n", - __func__, ret); - return ret; - } - - ret = msm_lsm_send_ch_mix_config(substream); - if (ret) { - msm_pcm_routing_dereg_phy_stream(rtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - return ret; - } - } - - prtd->lsm_client->session_state = RUNNING; - prtd->lsm_client->started = false; - runtime->private_data = prtd; - return ret; -} - -static int msm_lsm_close(struct snd_pcm_substream *substream) -{ - unsigned long flags; - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - if (!prtd || !prtd->lsm_client) { - pr_err("%s: No LSM session active\n", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - dev_dbg(rtd->dev, "%s\n", __func__); - if (prtd->lsm_client->started) { - ret = q6lsm_stop(prtd->lsm_client, true); - if (ret) - dev_err(rtd->dev, - "%s: session stop failed, err = %d\n", - __func__, ret); - else - dev_dbg(rtd->dev, - "%s: LSM client session stopped %d\n", - __func__, ret); - - /* - * Go Ahead and try de-register sound model, - * even if stop failed - */ - prtd->lsm_client->started = false; - - ret = q6lsm_deregister_sound_model(prtd->lsm_client); - if (ret) - dev_err(rtd->dev, - "%s: dereg_snd_model failed, err = %d\n", - __func__, ret); - else - dev_dbg(rtd->dev, "%s: dereg_snd_model successful\n", - __func__); - } - - msm_pcm_routing_dereg_phy_stream(rtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - - if (prtd->lsm_client->opened) { - q6lsm_close(prtd->lsm_client); - prtd->lsm_client->opened = false; - } - q6lsm_client_free(prtd->lsm_client); - - spin_lock_irqsave(&prtd->event_lock, flags); - kfree(prtd->event_status); - prtd->event_status = NULL; - kfree(prtd->det_event); - prtd->det_event = NULL; - spin_unlock_irqrestore(&prtd->event_lock, flags); - mutex_destroy(&prtd->lsm_api_lock); - kfree(prtd); - runtime->private_data = NULL; - - return 0; -} - -static int msm_lsm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct lsm_hw_params *out_hw_params = NULL; - struct lsm_hw_params *in_hw_params = NULL; - struct snd_soc_pcm_runtime *rtd; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - if (!prtd || !params) { - dev_err(rtd->dev, - "%s: invalid params prtd %pK params %pK", - __func__, prtd, params); - return -EINVAL; - } - in_hw_params = &prtd->lsm_client->in_hw_params; - out_hw_params = &prtd->lsm_client->out_hw_params; - out_hw_params->num_chs = params_channels(params); - out_hw_params->period_count = params_periods(params); - out_hw_params->sample_rate = params_rate(params); - if (((out_hw_params->sample_rate != 16000) && - (out_hw_params->sample_rate != 48000)) || - (out_hw_params->period_count == 0)) { - dev_err(rtd->dev, - "%s: Invalid Params sample rate %d period count %d\n", - __func__, out_hw_params->sample_rate, - out_hw_params->period_count); - return -EINVAL; - } - - if (params_format(params) == SNDRV_PCM_FORMAT_S16_LE) { - out_hw_params->sample_size = 16; - } else if (params_format(params) == SNDRV_PCM_FORMAT_S24_LE) { - out_hw_params->sample_size = 24; - } else { - dev_err(rtd->dev, "%s: Invalid Format 0x%x\n", - __func__, params_format(params)); - return -EINVAL; - } - - out_hw_params->buf_sz = params_buffer_bytes(params) / - out_hw_params->period_count; - dev_dbg(rtd->dev, - "%s: channels %d sample rate %d sample size %d buffer size %d period count %d\n", - __func__, out_hw_params->num_chs, out_hw_params->sample_rate, - out_hw_params->sample_size, out_hw_params->buf_sz, - out_hw_params->period_count); - - /* - * copy the out_hw_params to in_hw_params. in_hw_params will be - * over-written with LSM_SET_INPUT_HW_PARAMS ioctl from userspace. - * If this ioctl is not set, then it is assumed that input and - * output hw params for LSM are the same. - * Currently the period_count and buf_sz are unused for input params. - */ - memcpy(in_hw_params, out_hw_params, - sizeof(struct lsm_hw_params)); - return 0; -} - -static snd_pcm_uframes_t msm_lsm_pcm_pointer( - struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - if (!prtd) { - dev_err(rtd->dev, - "%s: Invalid param %pK\n", __func__, prtd); - return 0; - } - - if (prtd->dma_write >= snd_pcm_lib_buffer_bytes(substream)) - prtd->dma_write = 0; - dev_dbg(rtd->dev, - "%s: dma post = %d\n", __func__, prtd->dma_write); - return bytes_to_frames(runtime, prtd->dma_write); -} - -static int msm_lsm_pcm_copy(struct snd_pcm_substream *substream, int ch, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct lsm_priv *prtd = runtime->private_data; - char *pcm_buf = NULL; - int rc = 0, buf_index = 0; - unsigned long flags = 0; - struct snd_soc_pcm_runtime *rtd; - - if (!substream->private_data) { - pr_err("%s: Invalid private_data", __func__); - return -EINVAL; - } - rtd = substream->private_data; - - if (!prtd) { - dev_err(rtd->dev, - "%s: Invalid param %pK\n", __func__, prtd); - return -EINVAL; - } - - if (runtime->status->state == SNDRV_PCM_STATE_XRUN || - runtime->status->state == SNDRV_PCM_STATE_PREPARED) { - dev_err(rtd->dev, - "%s: runtime state incorrect %d", __func__, - runtime->status->state); - return 0; - } - rc = wait_event_timeout(prtd->period_wait, - (atomic_read(&prtd->buf_count) | - atomic_read(&prtd->read_abort)), (2 * HZ)); - if (!rc) { - dev_err(rtd->dev, - "%s: timeout for read retry\n", __func__); - return -EAGAIN; - } - if (atomic_read(&prtd->read_abort)) { - dev_err(rtd->dev, - "%s: Read abort received\n", __func__); - return -EIO; - } - prtd->appl_cnt = prtd->appl_cnt % - prtd->lsm_client->out_hw_params.period_count; - pcm_buf = prtd->lsm_client->lab_buffer[prtd->appl_cnt].data; - dev_dbg(rtd->dev, - "%s: copy the pcm data size %lu\n", - __func__, fbytes); - if (pcm_buf) { - if (copy_to_user(buf, pcm_buf, fbytes)) { - dev_err(rtd->dev, - "%s: failed to copy bytes %lu\n", - __func__, fbytes); - return -EINVAL; - } - } else { - dev_err(rtd->dev, - "%s: Invalid pcm buffer\n", __func__); - return -EINVAL; - } - prtd->appl_cnt = (prtd->appl_cnt + 1) % - prtd->lsm_client->out_hw_params.period_count; - - spin_lock_irqsave(&prtd->xrun_lock, flags); - /* Queue lab buffer here if in xrun */ - if (prtd->xrun_count > 0) { - (prtd->xrun_count)--; - buf_index = (prtd->xrun_index + 1) % - prtd->lsm_client->out_hw_params.period_count; - rc = msm_lsm_queue_lab_buffer(prtd, buf_index); - if (rc) - dev_err(rtd->dev, - "%s: error in queuing the lab buffer rc %d\n", - __func__, rc); - prtd->xrun_index = buf_index; - } - atomic_dec(&prtd->buf_count); - spin_unlock_irqrestore(&prtd->xrun_lock, flags); - - return 0; -} - -static int msm_lsm_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return 0; -} - -static int msm_lsm_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_lsm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *mixer_ctl_name = "Listen Stream"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - ctl_len = strlen(mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Listen app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: Listen app type cntrl add failed: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_lsm_app_type_cfg_ctl_put; - kctl->get = msm_lsm_app_type_cfg_ctl_get; - return 0; -} - -static int msm_lsm_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - - ret = msm_lsm_add_app_type_controls(rtd); - if (ret) - pr_err("%s, add app type controls failed:%d\n", __func__, ret); - - return ret; -} - -static const struct snd_pcm_ops msm_lsm_ops = { - .open = msm_lsm_open, - .close = msm_lsm_close, - .ioctl = msm_lsm_ioctl, - .prepare = msm_lsm_prepare, - .compat_ioctl = msm_lsm_ioctl_compat, - .hw_params = msm_lsm_hw_params, - .copy_user = msm_lsm_pcm_copy, - .pointer = msm_lsm_pcm_pointer, -}; - -static int msm_asoc_lsm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_lsm_add_controls(rtd); - if (ret) - pr_err("%s, kctl add failed:%d\n", __func__, ret); - - return ret; -} - -static int msm_asoc_lsm_probe(struct snd_soc_platform *platform) -{ - pr_debug("enter %s\n", __func__); - - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_lsm_ops, - .pcm_new = msm_asoc_lsm_new, - .probe = msm_asoc_lsm_probe, -}; - -static int msm_lsm_probe(struct platform_device *pdev) -{ - - return snd_soc_register_platform(&pdev->dev, &msm_soc_platform); -} - -static int msm_lsm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - - return 0; -} - -static const struct of_device_id msm_lsm_client_dt_match[] = { - {.compatible = "qcom,msm-lsm-client" }, - { } -}; - -static struct platform_driver msm_lsm_driver = { - .driver = { - .name = "msm-lsm-client", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(msm_lsm_client_dt_match), - }, - .probe = msm_lsm_probe, - .remove = msm_lsm_remove, -}; - -int __init msm_lsm_client_init(void) -{ - return platform_driver_register(&msm_lsm_driver); -} - -void msm_lsm_client_exit(void) -{ - platform_driver_unregister(&msm_lsm_driver); -} - -MODULE_DESCRIPTION("LSM client platform driver"); -MODULE_DEVICE_TABLE(of, msm_lsm_client_dt_match); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-afe-v2.c b/techpack/audio/asoc/msm-pcm-afe-v2.c deleted file mode 100644 index d54bde62ab9d..000000000000 --- a/techpack/audio/asoc/msm-pcm-afe-v2.c +++ /dev/null @@ -1,922 +0,0 @@ -/* Copyright (c) 2012-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-afe-v2.h" - -#define TIMEOUT_MS 1000 -#define MIN_PLAYBACK_PERIOD_SIZE (128 * 2) -#define MAX_PLAYBACK_PERIOD_SIZE (128 * 2 * 2 * 6) -#define MIN_PLAYBACK_NUM_PERIODS (4) -#define MAX_PLAYBACK_NUM_PERIODS (384) - -#define MIN_CAPTURE_PERIOD_SIZE (128 * 2) -#define MAX_CAPTURE_PERIOD_SIZE (192 * 2 * 2 * 8 * 4) -#define MIN_CAPTURE_NUM_PERIODS (4) -#define MAX_CAPTURE_NUM_PERIODS (384) - -static struct snd_pcm_hardware msm_afe_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE| - SNDRV_PCM_FMTBIT_S24_LE, - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 6, - .buffer_bytes_max = MAX_PLAYBACK_PERIOD_SIZE * - MAX_PLAYBACK_NUM_PERIODS, - .period_bytes_min = MIN_PLAYBACK_PERIOD_SIZE, - .period_bytes_max = MAX_PLAYBACK_PERIOD_SIZE, - .periods_min = MIN_PLAYBACK_NUM_PERIODS, - .periods_max = MAX_PLAYBACK_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_afe_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE| - SNDRV_PCM_FMTBIT_S24_LE, - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 6, - .buffer_bytes_max = MAX_CAPTURE_PERIOD_SIZE * - MAX_CAPTURE_NUM_PERIODS, - .period_bytes_min = MIN_CAPTURE_PERIOD_SIZE, - .period_bytes_max = MAX_CAPTURE_PERIOD_SIZE, - .periods_min = MIN_CAPTURE_NUM_PERIODS, - .periods_max = MAX_CAPTURE_NUM_PERIODS, - .fifo_size = 0, -}; - - -static enum hrtimer_restart afe_hrtimer_callback(struct hrtimer *hrt); -static enum hrtimer_restart afe_hrtimer_rec_callback(struct hrtimer *hrt); - -static enum hrtimer_restart afe_hrtimer_callback(struct hrtimer *hrt) -{ - struct pcm_afe_info *prtd = - container_of(hrt, struct pcm_afe_info, hrt); - struct snd_pcm_substream *substream = prtd->substream; - struct snd_pcm_runtime *runtime = substream->runtime; - u32 mem_map_handle = 0; - - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) - pr_err("%s: mem_map_handle is NULL\n", __func__); - - if (prtd->start) { - pr_debug("sending frame to DSP: poll_time: %d\n", - prtd->poll_time); - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - pr_debug("%s: mem_map_handle 0x%x\n", __func__, mem_map_handle); - afe_rt_proxy_port_write( - (prtd->dma_addr + - (prtd->dsp_cnt * - snd_pcm_lib_period_bytes(prtd->substream))), mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - prtd->dsp_cnt++; - hrtimer_forward_now(hrt, ns_to_ktime(prtd->poll_time - * 1000)); - - return HRTIMER_RESTART; - } else - return HRTIMER_NORESTART; -} -static enum hrtimer_restart afe_hrtimer_rec_callback(struct hrtimer *hrt) -{ - struct pcm_afe_info *prtd = - container_of(hrt, struct pcm_afe_info, hrt); - struct snd_pcm_substream *substream = prtd->substream; - struct snd_pcm_runtime *runtime = substream->runtime; - u32 mem_map_handle = 0; - int ret; - - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) - pr_err("%s: mem_map_handle is NULL\n", __func__); - - if (prtd->start) { - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - pr_debug("%s: mem_map_handle 0x%x\n", __func__, mem_map_handle); - ret = afe_rt_proxy_port_read( - (prtd->dma_addr + (prtd->dsp_cnt - * snd_pcm_lib_period_bytes(prtd->substream))), mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - if (ret < 0) { - pr_err("%s: AFE port read fails: %d\n", __func__, ret); - prtd->start = 0; - return HRTIMER_NORESTART; - } - prtd->dsp_cnt++; - pr_debug("sending frame rec to DSP: poll_time: %d\n", - prtd->poll_time); - hrtimer_forward_now(hrt, ns_to_ktime(prtd->poll_time - * 1000)); - - return HRTIMER_RESTART; - } else - return HRTIMER_NORESTART; -} -static void pcm_afe_process_tx_pkt(uint32_t opcode, - uint32_t token, uint32_t *payload, - void *priv) -{ - struct pcm_afe_info *prtd = priv; - unsigned long dsp_flags; - struct snd_pcm_substream *substream = NULL; - struct snd_pcm_runtime *runtime = NULL; - uint16_t event; - uint64_t period_bytes; - uint64_t bytes_one_sec; - - if (prtd == NULL) - return; - substream = prtd->substream; - runtime = substream->runtime; - pr_debug("%s\n", __func__); - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - switch (opcode) { - case AFE_EVENT_RT_PROXY_PORT_STATUS: { - event = (uint16_t)((0xFFFF0000 & payload[0]) >> 0x10); - switch (event) { - case AFE_EVENT_RTPORT_START: { - prtd->dsp_cnt = 0; - /* Calculate poll time. - * Split steps to avoid overflow. - * Poll time-time corresponding to one period - * in bytes. - * (Samplerate * channelcount * format) = - * bytes in 1 sec. - * Poll time = - * (period bytes / bytes in one sec) * - * 1000000 micro seconds. - * Multiplication by 1000000 is done in two - * steps to keep the accuracy of poll time. - */ - if (prtd->mmap_flag) { - period_bytes = ((uint64_t)( - (snd_pcm_lib_period_bytes( - prtd->substream)) * - 1000)); - bytes_one_sec = (runtime->rate - * runtime->channels * 2); - bytes_one_sec = - div_u64(bytes_one_sec, 1000); - prtd->poll_time = - div_u64(period_bytes, - bytes_one_sec); - pr_debug("prtd->poll_time: %d", - prtd->poll_time); - } - break; - } - case AFE_EVENT_RTPORT_STOP: - pr_debug("%s: event!=0\n", __func__); - prtd->start = 0; - snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); - break; - case AFE_EVENT_RTPORT_LOW_WM: - pr_debug("%s: Underrun\n", __func__); - break; - case AFE_EVENT_RTPORT_HI_WM: - pr_debug("%s: Overrun\n", __func__); - break; - default: - break; - } - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2: - pr_debug("write done\n"); - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - break; - } - case RESET_EVENTS: - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - prtd->reset_event = true; - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); -} - -static void pcm_afe_process_rx_pkt(uint32_t opcode, - uint32_t token, uint32_t *payload, - void *priv) -{ - struct pcm_afe_info *prtd = priv; - unsigned long dsp_flags; - struct snd_pcm_substream *substream = NULL; - struct snd_pcm_runtime *runtime = NULL; - uint16_t event; - uint64_t period_bytes; - uint64_t bytes_one_sec; - uint32_t mem_map_handle = 0; - - if (prtd == NULL) - return; - substream = prtd->substream; - runtime = substream->runtime; - pr_debug("%s\n", __func__); - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - switch (opcode) { - case AFE_EVENT_RT_PROXY_PORT_STATUS: { - event = (uint16_t)((0xFFFF0000 & payload[0]) >> 0x10); - switch (event) { - case AFE_EVENT_RTPORT_START: { - prtd->dsp_cnt = 0; - /* Calculate poll time. Split steps to avoid overflow. - * Poll time-time corresponding to one period in bytes. - * (Samplerate * channelcount * format)=bytes in 1 sec. - * Poll time = (period bytes / bytes in one sec) * - * 1000000 micro seconds. - * Multiplication by 1000000 is done in two steps to - * keep the accuracy of poll time. - */ - if (prtd->mmap_flag) { - period_bytes = ((uint64_t)( - (snd_pcm_lib_period_bytes( - prtd->substream)) * 1000)); - bytes_one_sec = (runtime->rate * - runtime->channels * 2); - bytes_one_sec = div_u64(bytes_one_sec, 1000); - prtd->poll_time = - div_u64(period_bytes, bytes_one_sec); - pr_debug("prtd->poll_time : %d\n", - prtd->poll_time); - } else { - mem_map_handle = - afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) - pr_err("%s:mem_map_handle is NULL\n", - __func__); - /* Do initial read to start transfer */ - afe_rt_proxy_port_read((prtd->dma_addr + - (prtd->dsp_cnt * - snd_pcm_lib_period_bytes( - prtd->substream))), - mem_map_handle, - snd_pcm_lib_period_bytes( - prtd->substream)); - prtd->dsp_cnt++; - } - break; - } - case AFE_EVENT_RTPORT_STOP: - pr_debug("%s: event!=0\n", __func__); - prtd->start = 0; - snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); - break; - case AFE_EVENT_RTPORT_LOW_WM: - pr_debug("%s: Underrun\n", __func__); - break; - case AFE_EVENT_RTPORT_HI_WM: - pr_debug("%s: Overrun\n", __func__); - break; - default: - break; - } - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2: - pr_debug("%s :Read done\n", __func__); - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - if (!prtd->mmap_flag) { - atomic_set(&prtd->rec_bytes_avail, 1); - wake_up(&prtd->read_wait); - } - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - break; - } - case RESET_EVENTS: - prtd->pcm_irq_pos += snd_pcm_lib_period_bytes - (prtd->substream); - prtd->reset_event = true; - if (!prtd->mmap_flag) { - atomic_set(&prtd->rec_bytes_avail, 1); - wake_up(&prtd->read_wait); - } - snd_pcm_period_elapsed(prtd->substream); - break; - default: - break; - } - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); -} - -static int msm_afe_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *dai = rtd->cpu_dai; - int ret = 0; - - pr_debug("%s: sample_rate=%d\n", __func__, runtime->rate); - - pr_debug("%s: dai->id =%x\n", __func__, dai->id); - ret = afe_register_get_events(dai->id, - pcm_afe_process_tx_pkt, prtd); - if (ret < 0) { - pr_err("afe-pcm:register for events failed\n"); - return ret; - } - pr_debug("%s:success\n", __func__); - prtd->prepared++; - return ret; -} - -static int msm_afe_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *dai = rtd->cpu_dai; - int ret = 0; - - pr_debug("%s\n", __func__); - - pr_debug("%s: dai->id =%x\n", __func__, dai->id); - ret = afe_register_get_events(dai->id, - pcm_afe_process_rx_pkt, prtd); - if (ret < 0) { - pr_err("afe-pcm:register for events failed\n"); - return ret; - } - pr_debug("%s:success\n", __func__); - prtd->prepared++; - return 0; -} - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 16000, 48000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int msm_afe_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = NULL; - int ret = 0; - - prtd = kzalloc(sizeof(struct pcm_afe_info), GFP_KERNEL); - if (prtd == NULL) - return -ENOMEM; - pr_debug("prtd %pK\n", prtd); - - mutex_init(&prtd->lock); - spin_lock_init(&prtd->dsp_lock); - prtd->dsp_cnt = 0; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - runtime->hw = msm_afe_hardware_playback; - else - runtime->hw = msm_afe_hardware_capture; - - prtd->substream = substream; - runtime->private_data = prtd; - prtd->audio_client = q6afe_audio_client_alloc(prtd); - if (!prtd->audio_client) { - pr_debug("%s: Could not allocate memory\n", __func__); - mutex_unlock(&prtd->lock); - kfree(prtd); - return -ENOMEM; - } - - atomic_set(&prtd->rec_bytes_avail, 0); - init_waitqueue_head(&prtd->read_wait); - - hrtimer_init(&prtd->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->hrt.function = afe_hrtimer_callback; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->hrt.function = afe_hrtimer_rec_callback; - - mutex_unlock(&prtd->lock); - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_err("snd_pcm_hw_constraint_list failed\n"); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_err("snd_pcm_hw_constraint_integer failed\n"); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - MIN_CAPTURE_NUM_PERIODS * MIN_CAPTURE_PERIOD_SIZE, - MAX_CAPTURE_NUM_PERIODS * MAX_CAPTURE_PERIOD_SIZE); - - if (ret < 0) { - pr_err("constraint for buffer bytes min max ret = %d\n", - ret); - } - } - - prtd->reset_event = false; - return 0; -} - -static int msm_afe_playback_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - char *hwbuf = runtime->dma_area + hwoff; - u32 mem_map_handle = 0; - - pr_debug("%s : appl_ptr 0x%lx hw_ptr 0x%lx dest_to_copy 0x%pK\n", - __func__, - runtime->control->appl_ptr, runtime->status->hw_ptr, hwbuf); - - if (copy_from_user(hwbuf, buf, fbytes)) { - pr_err("%s :Failed to copy audio from user buffer\n", - __func__); - - ret = -EFAULT; - goto fail; - } - - if (!prtd->mmap_flag) { - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - if (!mem_map_handle) { - pr_err("%s: mem_map_handle is NULL\n", __func__); - ret = -EFAULT; - goto fail; - } - - pr_debug("%s : prtd-> dma_addr 0x%lx dsp_cnt %d\n", __func__, - prtd->dma_addr, prtd->dsp_cnt); - - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - - ret = afe_rt_proxy_port_write( - (prtd->dma_addr + (prtd->dsp_cnt * - snd_pcm_lib_period_bytes(prtd->substream))), - mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - - if (ret) { - pr_err("%s: AFE proxy port write failed %d\n", - __func__, ret); - goto fail; - } - prtd->dsp_cnt++; - } -fail: - return ret; -} - -static int msm_afe_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - char *hwbuf = runtime->dma_area + hwoff; - u32 mem_map_handle = 0; - - if (!prtd->mmap_flag) { - mem_map_handle = afe_req_mmap_handle(prtd->audio_client); - - if (!mem_map_handle) { - pr_err("%s: mem_map_handle is NULL\n", __func__); - ret = -EFAULT; - goto fail; - } - - if (prtd->dsp_cnt == runtime->periods) - prtd->dsp_cnt = 0; - - ret = afe_rt_proxy_port_read((prtd->dma_addr + - (prtd->dsp_cnt * - snd_pcm_lib_period_bytes(prtd->substream))), - mem_map_handle, - snd_pcm_lib_period_bytes(prtd->substream)); - - if (ret) { - pr_err("%s: AFE proxy port read failed %d\n", - __func__, ret); - goto fail; - } - - prtd->dsp_cnt++; - ret = wait_event_timeout(prtd->read_wait, - atomic_read(&prtd->rec_bytes_avail), - msecs_to_jiffies(TIMEOUT_MS)); - if (ret < 0) { - pr_err("%s: wait_event_timeout failed\n", __func__); - - ret = -ETIMEDOUT; - goto fail; - } - atomic_set(&prtd->rec_bytes_avail, 0); - } - pr_debug("%s:appl_ptr 0x%lx hw_ptr 0x%lx src_to_copy 0x%pK\n", - __func__, runtime->control->appl_ptr, - runtime->status->hw_ptr, hwbuf); - - if (copy_to_user(buf, hwbuf, fbytes)) { - pr_err("%s: copy to user failed\n", __func__); - - goto fail; - ret = -EFAULT; - } - -fail: - return ret; -} - -static int msm_afe_copy(struct snd_pcm_substream *substream, int channel, - unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - int ret = 0; - - if (prtd->reset_event) { - pr_debug("%s: reset events received from ADSP, return error\n", - __func__); - return -ENETRESET; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_afe_playback_copy(substream, channel, hwoff, - buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_afe_capture_copy(substream, channel, hwoff, - buf, fbytes); - return ret; -} - -static int msm_afe_close(struct snd_pcm_substream *substream) -{ - int rc = 0; - struct snd_dma_buffer *dma_buf; - struct snd_pcm_runtime *runtime; - struct pcm_afe_info *prtd; - struct snd_soc_pcm_runtime *rtd = NULL; - struct snd_soc_dai *dai = NULL; - int dir = IN; - int ret = 0; - - pr_debug("%s\n", __func__); - if (substream == NULL) { - pr_err("substream is NULL\n"); - return -EINVAL; - } - rtd = substream->private_data; - dai = rtd->cpu_dai; - runtime = substream->runtime; - prtd = runtime->private_data; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - dir = IN; - ret = afe_unregister_get_events(dai->id); - if (ret < 0) - pr_err("AFE unregister for events failed\n"); - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - dir = OUT; - ret = afe_unregister_get_events(dai->id); - if (ret < 0) - pr_err("AFE unregister for events failed\n"); - } - if (prtd->mmap_flag) - hrtimer_cancel(&prtd->hrt); - - rc = afe_cmd_memory_unmap(afe_req_mmap_handle(prtd->audio_client)); - if (rc < 0) - pr_err("AFE memory unmap failed\n"); - - pr_debug("release all buffer\n"); - dma_buf = &substream->dma_buffer; - if (dma_buf == NULL) { - pr_debug("dma_buf is NULL\n"); - goto done; - } - - if (dma_buf->area) - dma_buf->area = NULL; - q6afe_audio_client_buf_free_contiguous(dir, prtd->audio_client); -done: - pr_debug("%s: dai->id =%x\n", __func__, dai->id); - q6afe_audio_client_free(prtd->audio_client); - mutex_unlock(&prtd->lock); - prtd->prepared--; - kfree(prtd); - runtime->private_data = NULL; - return 0; -} -static int msm_afe_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - prtd->pcm_irq_pos = 0; - if (prtd->prepared) - return 0; - mutex_lock(&prtd->lock); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_afe_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_afe_capture_prepare(substream); - mutex_unlock(&prtd->lock); - return ret; -} -static int msm_afe_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - struct afe_audio_client *ac = prtd->audio_client; - struct afe_audio_port_data *apd = ac->port; - struct afe_audio_buffer *ab; - int dir = -1; - - pr_debug("%s\n", __func__); - prtd->mmap_flag = 1; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ab = &(apd[dir].buf[0]); - - return msm_audio_ion_mmap((struct audio_buffer *)ab, vma); -} -static int msm_afe_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: SNDRV_PCM_TRIGGER_START\n", __func__); - prtd->start = 1; - if (prtd->mmap_flag) - hrtimer_start(&prtd->hrt, ns_to_ktime(0), - HRTIMER_MODE_REL); - break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("%s: SNDRV_PCM_TRIGGER_STOP\n", __func__); - prtd->start = 0; - break; - default: - ret = -EINVAL; - break; - } - return ret; -} -static int msm_afe_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct pcm_afe_info *prtd = runtime->private_data; - struct afe_audio_buffer *buf; - int dir, rc; - - pr_debug("%s:\n", __func__); - - mutex_lock(&prtd->lock); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - - rc = q6afe_audio_client_buf_alloc_contiguous(dir, - prtd->audio_client, - (params_buffer_bytes(params) / params_periods(params)), - params_periods(params)); - pr_debug("params_buffer_bytes(params) = %d\n", - (params_buffer_bytes(params))); - pr_debug("params_periods(params) = %d\n", - (params_periods(params))); - pr_debug("params_periodsize(params) = %d\n", - (params_buffer_bytes(params) / params_periods(params))); - - if (rc < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", rc); - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - buf = prtd->audio_client->port[dir].buf; - - if (buf == NULL || buf[0].data == NULL) { - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - - pr_debug("%s:buf = %pK\n", __func__, buf); - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf[0].data; - dma_buf->addr = buf[0].phys; - - dma_buf->bytes = params_buffer_bytes(params); - - if (!dma_buf->area) { - pr_err("%s:MSM AFE physical memory allocation failed\n", - __func__); - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - - memset(dma_buf->area, 0, params_buffer_bytes(params)); - - prtd->dma_addr = (phys_addr_t) dma_buf->addr; - - mutex_unlock(&prtd->lock); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - rc = afe_memory_map(dma_buf->addr, dma_buf->bytes, prtd->audio_client); - if (rc < 0) - pr_err("fail to map memory to DSP\n"); - - return rc; -} -static snd_pcm_uframes_t msm_afe_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct pcm_afe_info *prtd = runtime->private_data; - - if (prtd->pcm_irq_pos >= snd_pcm_lib_buffer_bytes(substream)) - prtd->pcm_irq_pos = 0; - - if (prtd->reset_event) { - pr_debug("%s: reset events received from ADSP, return XRUN\n", - __func__); - return SNDRV_PCM_POS_XRUN; - } - - pr_debug("pcm_irq_pos = %d\n", prtd->pcm_irq_pos); - return bytes_to_frames(runtime, (prtd->pcm_irq_pos)); -} - -static const struct snd_pcm_ops msm_afe_ops = { - .open = msm_afe_open, - .copy_user = msm_afe_copy, - .hw_params = msm_afe_hw_params, - .trigger = msm_afe_trigger, - .close = msm_afe_close, - .prepare = msm_afe_prepare, - .mmap = msm_afe_mmap, - .pointer = msm_afe_pointer, -}; - - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - pr_debug("%s\n", __func__); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static int msm_afe_afe_probe(struct snd_soc_platform *platform) -{ - pr_debug("%s\n", __func__); - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_afe_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_afe_afe_probe, -}; - -static int msm_afe_probe(struct platform_device *pdev) -{ - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_afe_remove(struct platform_device *pdev) -{ - pr_debug("%s\n", __func__); - snd_soc_unregister_platform(&pdev->dev); - return 0; -} -static const struct of_device_id msm_pcm_afe_dt_match[] = { - {.compatible = "qcom,msm-pcm-afe"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_afe_dt_match); - -static struct platform_driver msm_afe_driver = { - .driver = { - .name = "msm-pcm-afe", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_afe_dt_match, - }, - .probe = msm_afe_probe, - .remove = msm_afe_remove, -}; - -int __init msm_pcm_afe_init(void) -{ - pr_debug("%s\n", __func__); - return platform_driver_register(&msm_afe_driver); -} - -void msm_pcm_afe_exit(void) -{ - pr_debug("%s\n", __func__); - platform_driver_unregister(&msm_afe_driver); -} - -MODULE_DESCRIPTION("AFE PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-afe-v2.h b/techpack/audio/asoc/msm-pcm-afe-v2.h deleted file mode 100644 index 926b626de37d..000000000000 --- a/techpack/audio/asoc/msm-pcm-afe-v2.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 2012,2015-2016 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MSM_PCM_AFE_H -#define _MSM_PCM_AFE_H -#include -#include - - -struct pcm_afe_info { - unsigned long dma_addr; - struct snd_pcm_substream *substream; - unsigned int pcm_irq_pos; /* IRQ position */ - struct mutex lock; - spinlock_t dsp_lock; - uint32_t samp_rate; - uint32_t channel_mode; - uint8_t start; - uint32_t dsp_cnt; - uint32_t buf_phys; - int32_t mmap_flag; - int prepared; - struct hrtimer hrt; - int poll_time; - struct afe_audio_client *audio_client; - wait_queue_head_t read_wait; - atomic_t rec_bytes_avail; - bool reset_event; -}; - - -#define MSM_EXT(xname, fp_info, fp_get, fp_put, addr) \ - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ - .name = xname, \ - .info = fp_info,\ - .get = fp_get, .put = fp_put, \ - .private_value = addr, \ - } - -#endif /*_MSM_PCM_AFE_H*/ diff --git a/techpack/audio/asoc/msm-pcm-dtmf-v2.c b/techpack/audio/asoc/msm-pcm-dtmf-v2.c deleted file mode 100644 index 77dc81ce9c21..000000000000 --- a/techpack/audio/asoc/msm-pcm-dtmf-v2.c +++ /dev/null @@ -1,591 +0,0 @@ -/* Copyright (c) 2013-2014, 2017-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" - -enum { - DTMF_IN_RX, - DTMF_IN_TX, -}; - -enum format { - FORMAT_S16_LE = 2 -}; - -struct dtmf_det_info { - char session[MAX_SESSION_NAME_LEN]; - uint8_t dir; - uint16_t high_freq; - uint16_t low_freq; -}; - -struct dtmf_buf_node { - struct list_head list; - struct dtmf_det_info dtmf_det_pkt; -}; - -enum dtmf_state { - DTMF_GEN_RX_STOPPED, - DTMF_GEN_RX_STARTED, -}; - -#define DTMF_MAX_Q_LEN 10 -#define DTMF_PKT_SIZE sizeof(struct dtmf_det_info) - -struct dtmf_drv_info { - enum dtmf_state state; - struct snd_pcm_substream *capture_substream; - - struct list_head out_queue; - struct list_head free_out_queue; - - wait_queue_head_t out_wait; - - struct mutex lock; - spinlock_t dsp_lock; - - uint8_t capture_start; - uint8_t capture_instance; - - unsigned int pcm_capture_size; - unsigned int pcm_capture_count; - unsigned int pcm_capture_irq_pos; - unsigned int pcm_capture_buf_pos; -}; - -static struct snd_pcm_hardware msm_pcm_hardware = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = (sizeof(struct dtmf_buf_node) * DTMF_MAX_Q_LEN), - .period_bytes_min = DTMF_PKT_SIZE, - .period_bytes_max = DTMF_PKT_SIZE, - .periods_min = DTMF_MAX_Q_LEN, - .periods_max = DTMF_MAX_Q_LEN, - .fifo_size = 0, -}; - -static int msm_dtmf_rx_generate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint16_t low_freq = ucontrol->value.integer.value[0]; - uint16_t high_freq = ucontrol->value.integer.value[1]; - int64_t duration = ucontrol->value.integer.value[2]; - uint16_t gain = ucontrol->value.integer.value[3]; - - pr_debug("%s: low_freq=%d high_freq=%d duration=%d gain=%d\n", - __func__, low_freq, high_freq, (int)duration, gain); - afe_dtmf_generate_rx(duration, high_freq, low_freq, gain); - return 0; -} - -static int msm_dtmf_rx_generate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s:\n", __func__); - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int msm_dtmf_detect_voice_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int enable = ucontrol->value.integer.value[0]; - - pr_debug("%s: enable=%d\n", __func__, enable); - voc_enable_dtmf_rx_detection(voc_get_session_id(VOICE_SESSION_NAME), - enable); - - return 0; -} - -static int msm_dtmf_detect_voice_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int msm_dtmf_detect_volte_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int enable = ucontrol->value.integer.value[0]; - - pr_debug("%s: enable=%d\n", __func__, enable); - voc_enable_dtmf_rx_detection(voc_get_session_id(VOLTE_SESSION_NAME), - enable); - - return 0; -} - -static int msm_dtmf_detect_volte_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static struct snd_kcontrol_new msm_dtmf_controls[] = { - SOC_SINGLE_MULTI_EXT("DTMF_Generate Rx Low High Duration Gain", - SND_SOC_NOPM, 0, 5000, 0, 4, - msm_dtmf_rx_generate_get, - msm_dtmf_rx_generate_put), - SOC_SINGLE_EXT("DTMF_Detect Rx Voice enable", SND_SOC_NOPM, 0, 1, 0, - msm_dtmf_detect_voice_rx_get, - msm_dtmf_detect_voice_rx_put), - SOC_SINGLE_EXT("DTMF_Detect Rx VoLTE enable", SND_SOC_NOPM, 0, 1, 0, - msm_dtmf_detect_volte_rx_get, - msm_dtmf_detect_volte_rx_put), -}; - -static int msm_pcm_dtmf_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_dtmf_controls, - ARRAY_SIZE(msm_dtmf_controls)); - return 0; -} - -static void dtmf_rx_detected_cb(uint8_t *pkt, - char *session, - void *private_data) -{ - struct dtmf_buf_node *buf_node = NULL; - struct vss_istream_evt_rx_dtmf_detected *dtmf_det_pkt = - (struct vss_istream_evt_rx_dtmf_detected *)pkt; - struct dtmf_drv_info *prtd = private_data; - unsigned long dsp_flags; - - pr_debug("%s\n", __func__); - if (prtd->capture_substream == NULL) - return; - - /* Copy dtmf detected info into out_queue. */ - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - /* discarding dtmf detection info till start is received */ - if (!list_empty(&prtd->free_out_queue) && prtd->capture_start) { - buf_node = list_first_entry(&prtd->free_out_queue, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - buf_node->dtmf_det_pkt.high_freq = dtmf_det_pkt->high_freq; - buf_node->dtmf_det_pkt.low_freq = dtmf_det_pkt->low_freq; - if (session != NULL) - strlcpy(buf_node->dtmf_det_pkt.session, - session, MAX_SESSION_NAME_LEN); - - buf_node->dtmf_det_pkt.dir = DTMF_IN_RX; - pr_debug("high =%d, low=%d session=%s\n", - buf_node->dtmf_det_pkt.high_freq, - buf_node->dtmf_det_pkt.low_freq, - buf_node->dtmf_det_pkt.session); - list_add_tail(&buf_node->list, &prtd->out_queue); - prtd->pcm_capture_irq_pos += prtd->pcm_capture_count; - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(prtd->capture_substream); - } else { - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - pr_err("DTMF detection pkt in Rx dropped, no free node available\n"); - } - - wake_up(&prtd->out_wait); -} - -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct dtmf_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - - ret = wait_event_interruptible_timeout(prtd->out_wait, - (!list_empty(&prtd->out_queue)), - 1 * HZ); - - if (ret > 0) { - if (fbytes <= DTMF_PKT_SIZE) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - buf_node = list_first_entry(&prtd->out_queue, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - ret = copy_to_user(buf, - &buf_node->dtmf_det_pkt, - fbytes); - if (ret) { - pr_err("%s: Copy to user returned %d\n", - __func__, ret); - ret = -EFAULT; - } - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, - &prtd->free_out_queue); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - - } else { - pr_err("%s: Read count %lu > DTMF_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - } else if (ret == 0) { - pr_err("%s: No UL data available\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: Read was interrupted\n", __func__); - ret = -ERESTARTSYS; - } - return ret; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - - pr_debug("%s() DTMF\n", __func__); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, a, hwoff, buf, fbytes); - - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = NULL; - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - prtd = kzalloc(sizeof(struct dtmf_drv_info), GFP_KERNEL); - - if (prtd == NULL) { - ret = -ENOMEM; - goto done; - } - - mutex_init(&prtd->lock); - spin_lock_init(&prtd->dsp_lock); - init_waitqueue_head(&prtd->out_wait); - INIT_LIST_HEAD(&prtd->out_queue); - INIT_LIST_HEAD(&prtd->free_out_queue); - - runtime->hw = msm_pcm_hardware; - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - prtd->capture_substream = substream; - prtd->capture_instance++; - runtime->private_data = prtd; - } - -done: - return ret; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct dtmf_buf_node *buf_node = NULL; - struct snd_dma_buffer *c_dma_buf; - struct snd_pcm_substream *c_substream; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - - pr_debug("%s() DTMF\n", __func__); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - mutex_lock(&prtd->lock); - wake_up(&prtd->out_wait); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_instance--; - - if (!prtd->capture_instance) { - if (prtd->state == DTMF_GEN_RX_STARTED) { - prtd->state = DTMF_GEN_RX_STOPPED; - voc_disable_dtmf_det_on_active_sessions(); - voc_register_dtmf_rx_detection_cb(NULL, NULL); - } - /* release all buffer */ - /* release out_queue and free_out_queue */ - pr_debug("release all buffer\n"); - c_substream = prtd->capture_substream; - if (c_substream == NULL) { - pr_debug("c_substream is NULL\n"); - mutex_unlock(&prtd->lock); - return -EINVAL; - } - - c_dma_buf = &c_substream->dma_buffer; - if (c_dma_buf == NULL) { - pr_debug("c_dma_buf is NULL.\n"); - mutex_unlock(&prtd->lock); - return -EINVAL; - } - - if (c_dma_buf->area != NULL) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_for_each_safe(ptr, next, - &prtd->out_queue) { - buf_node = list_entry(ptr, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - } - - list_for_each_safe(ptr, next, - &prtd->free_out_queue) { - buf_node = list_entry(ptr, - struct dtmf_buf_node, list); - list_del(&buf_node->list); - } - - spin_unlock_irqrestore(&prtd->dsp_lock, - dsp_flags); - dma_free_coherent(c_substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - c_dma_buf->area, - c_dma_buf->addr); - c_dma_buf->area = NULL; - } - } - prtd->capture_substream = NULL; - mutex_unlock(&prtd->lock); - } - - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct dtmf_buf_node *buf_node = NULL; - int i = 0, offset = 0; - int ret = 0; - - pr_debug("%s: DTMF\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - mutex_lock(&prtd->lock); - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - - dma_buf->area = dma_alloc_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - &dma_buf->addr, GFP_KERNEL); - if (!dma_buf->area) { - pr_err("%s:MSM DTMF dma_alloc failed\n", __func__); - mutex_unlock(&prtd->lock); - return -ENOMEM; - } - - dma_buf->bytes = runtime->hw.buffer_bytes_max; - memset(dma_buf->area, 0, runtime->hw.buffer_bytes_max); - - for (i = 0; i < DTMF_MAX_Q_LEN; i++) { - pr_debug("node =%d\n", i); - buf_node = (void *) dma_buf->area + offset; - list_add_tail(&buf_node->list, - &prtd->free_out_queue); - offset = offset + sizeof(struct dtmf_buf_node); - } - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - mutex_unlock(&prtd->lock); - } - - return ret; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - pr_debug("%s: DTMF\n", __func__); - prtd->pcm_capture_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_capture_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_capture_irq_pos = 0; - prtd->pcm_capture_buf_pos = 0; - return 0; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - pr_debug("%s: DTMF\n", __func__); - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - mutex_lock(&prtd->lock); - - msm_pcm_capture_prepare(substream); - - if (runtime->format != FORMAT_S16_LE) { - pr_err("format:%u doesn't match %d\n", - (uint32_t)runtime->format, FORMAT_S16_LE); - mutex_unlock(&prtd->lock); - return -EINVAL; - } - - if (prtd->capture_instance && - (prtd->state != DTMF_GEN_RX_STARTED)) { - voc_register_dtmf_rx_detection_cb(dtmf_rx_detected_cb, - prtd); - prtd->state = DTMF_GEN_RX_STARTED; - } - mutex_unlock(&prtd->lock); - } - - return 0; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - pr_debug("%s: Trigger start\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_start = 1; - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_start = 0; - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - snd_pcm_uframes_t ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct dtmf_drv_info *prtd = runtime->private_data; - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (prtd->pcm_capture_irq_pos >= prtd->pcm_capture_size) - prtd->pcm_capture_irq_pos = 0; - ret = bytes_to_frames(runtime, (prtd->pcm_capture_irq_pos)); - } - - return ret; -} - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_dtmf_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_pcm_dtmf_dt_match[] = { - {.compatible = "qcom,msm-pcm-dtmf"}, - {} -}; - -MODULE_DEVICE_TABLE(of, msm_pcm_dtmf_dt_match); - - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-dtmf", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_dtmf_dt_match, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_dtmf_init(void) -{ - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_dtmf_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("DTMF platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-host-voice-v2.c b/techpack/audio/asoc/msm-pcm-host-voice-v2.c deleted file mode 100644 index 7486ad7dc80c..000000000000 --- a/techpack/audio/asoc/msm-pcm-host-voice-v2.c +++ /dev/null @@ -1,1533 +0,0 @@ -/* Copyright (c) 2013-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define HPCM_MAX_Q_LEN 2 -#define HPCM_MIN_VOC_PKT_SIZE 320 -#define HPCM_MAX_VOC_PKT_SIZE 640 -#define VHPCM_BLOCK_SIZE 4096 -#define CACHE_ALIGNMENT_SIZE 128 -#define CACHE_ALIGNMENT_MASK 0xFFFFFF80 - -#define VOICE_TX_CAPTURE_DAI_ID "CS-VOICE HOST TX CAPTURE" -#define VOICE_TX_PLAYBACK_DAI_ID "CS-VOICE HOST TX PLAYBACK" -#define VOICE_RX_CAPTURE_DAI_ID "CS-VOICE HOST RX CAPTURE" -#define VOICE_RX_PLAYBACK_DAI_ID "CS-VOICE HOST RX PLAYBACK" - -#define VOLTE_TX_CAPTURE_DAI_ID "VOLTE HOST TX CAPTURE" -#define VOLTE_TX_PLAYBACK_DAI_ID "VOLTE HOST TX PLAYBACK" -#define VOLTE_RX_CAPTURE_DAI_ID "VOLTE HOST RX CAPTURE" -#define VOLTE_RX_PLAYBACK_DAI_ID "VOLTE HOST RX PLAYBACK" - - -#define VoMMode1_TX_CAPTURE_DAI_ID "VoiceMMode1 HOST TX CAPTURE" -#define VoMMode1_TX_PLAYBACK_DAI_ID "VoiceMMode1 HOST TX PLAYBACK" -#define VoMMode1_RX_CAPTURE_DAI_ID "VoiceMMode1 HOST RX CAPTURE" -#define VoMMode1_RX_PLAYBACK_DAI_ID "VoiceMMode1 HOST RX PLAYBACK" - -#define VoMMode2_TX_CAPTURE_DAI_ID "VoiceMMode2 HOST TX CAPTURE" -#define VoMMode2_TX_PLAYBACK_DAI_ID "VoiceMMode2 HOST TX PLAYBACK" -#define VoMMode2_RX_CAPTURE_DAI_ID "VoiceMMode2 HOST RX CAPTURE" -#define VoMMode2_RX_PLAYBACK_DAI_ID "VoiceMMode2 HOST RX PLAYBACK" - -enum { - RX = 1, - TX, -}; - -enum { - VOICE_INDEX = 0, - VOLTE_INDEX, - VOMMODE1_INDEX, - VOMMODE2_INDEX, - MAX_SESSION -}; - -enum hpcm_state { - HPCM_STOPPED = 1, - HPCM_CLOSED, - HPCM_PREPARED, - HPCM_STARTED, -}; - -struct hpcm_frame { - uint32_t len; - uint8_t voc_pkt[HPCM_MAX_VOC_PKT_SIZE]; -}; - -struct hpcm_buf_node { - struct list_head list; - struct hpcm_frame frame; -}; - -struct vocpcm_ion_buffer { - /* Physical address */ - phys_addr_t paddr; - /* Kernel virtual address */ - void *kvaddr; -}; - -struct dai_data { - enum hpcm_state state; - struct snd_pcm_substream *substream; - struct list_head filled_queue; - struct list_head free_queue; - wait_queue_head_t queue_wait; - spinlock_t dsp_lock; - uint32_t pcm_size; - uint32_t pcm_count; - /* IRQ position */ - uint32_t pcm_irq_pos; - /* Position in buffer */ - uint32_t pcm_buf_pos; - struct vocpcm_ion_buffer vocpcm_ion_buffer; -}; - -struct tap_point { - struct dai_data playback_dai_data; - struct dai_data capture_dai_data; -}; - -struct session { - struct tap_point tx_tap_point; - struct tap_point rx_tap_point; - phys_addr_t sess_paddr; - void *sess_kvaddr; - struct dma_buf *dma_buf; - struct mem_map_table tp_mem_table; -}; - -struct tappnt_mxr_data { - bool enable; - uint16_t direction; - uint16_t sample_rate; -}; - -/* Values from mixer ctl are cached in this structure */ -struct mixer_conf { - int8_t sess_indx; - struct tappnt_mxr_data rx; - struct tappnt_mxr_data tx; -}; - -struct start_cmd { - struct vss_ivpcm_tap_point tap_pnt[2]; - uint32_t no_of_tapoints; -}; - -struct hpcm_drv { - struct mutex lock; - struct session session[MAX_SESSION]; - struct mixer_conf mixer_conf; - struct start_cmd start_cmd; -}; - -static struct hpcm_drv hpcm_drv; - -static struct snd_pcm_hardware msm_pcm_hardware = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .rate_min = 8000, - .rate_max = 16000, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = sizeof(struct hpcm_buf_node) * HPCM_MAX_Q_LEN, - .period_bytes_min = HPCM_MIN_VOC_PKT_SIZE, - .period_bytes_max = HPCM_MAX_VOC_PKT_SIZE, - .periods_min = HPCM_MAX_Q_LEN, - .periods_max = HPCM_MAX_Q_LEN, - .fifo_size = 0, -}; - -static char *hpcm_get_sess_name(int sess_indx) -{ - char *sess_name = NULL; - - if (sess_indx == VOICE_INDEX) - sess_name = VOICE_SESSION_NAME; - else if (sess_indx == VOLTE_INDEX) - sess_name = VOLTE_SESSION_NAME; - else if (sess_indx == VOMMODE1_INDEX) - sess_name = VOICEMMODE1_NAME; - else if (sess_indx == VOMMODE2_INDEX) - sess_name = VOICEMMODE2_NAME; - else - pr_err("%s:, Invalid sess_index\n", __func__); - - return sess_name; -} - -static void hpcm_reset_mixer_config(struct hpcm_drv *prtd) -{ - prtd->mixer_conf.sess_indx = -1; - prtd->mixer_conf.rx.enable = false; - prtd->mixer_conf.rx.direction = -1; - prtd->mixer_conf.rx.sample_rate = 0; - - prtd->mixer_conf.tx.enable = false; - prtd->mixer_conf.tx.direction = -1; - prtd->mixer_conf.tx.sample_rate = 0; -} - -/* Check for valid mixer control values */ -static bool hpcm_is_valid_config(int sess_indx, int tap_point, - uint16_t direction, uint16_t samplerate) -{ - if (sess_indx < VOICE_INDEX || sess_indx > VOMMODE2_INDEX) { - pr_err("%s: invalid sess_indx :%d\n", __func__, sess_indx); - goto error; - } - - if (samplerate != VSS_IVPCM_SAMPLING_RATE_8K && - samplerate != VSS_IVPCM_SAMPLING_RATE_16K) { - pr_err("%s: invalid sample rate :%d\n", __func__, samplerate); - goto error; - } - - if ((tap_point != RX) && (tap_point != TX)) { - pr_err("%s: invalid tappoint :%d\n", __func__, tap_point); - goto error; - } - - if ((direction != VSS_IVPCM_TAP_POINT_DIR_IN) && - (direction != VSS_IVPCM_TAP_POINT_DIR_OUT) && - (direction != VSS_IVPCM_TAP_POINT_DIR_OUT_IN)) { - pr_err("%s: invalid direction :%d\n", __func__, direction); - goto error; - } - - return true; - -error: - return false; -} - - -static struct dai_data *hpcm_get_dai_data(char *pcm_id, struct hpcm_drv *prtd) -{ - struct dai_data *dai_data = NULL; - size_t size = 0; - - if (pcm_id) { - size = strlen(pcm_id); - /* Check for Voice DAI */ - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VOICE_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOICE_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOICE_INDEX].rx_tap_point.playback_dai_data; - /* Check for VoLTE DAI */ - } else if (strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VOLTE_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VOLTE_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOLTE_INDEX].rx_tap_point.playback_dai_data; - /* check for VoiceMMode1 DAI */ - } else if (strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VoMMode1_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode1_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE1_INDEX].rx_tap_point.playback_dai_data; - /* check for VOiceMMode2 DAI */ - } else if (strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].tx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].tx_tap_point.playback_dai_data; - } else if (strnstr(pcm_id, VoMMode2_RX_CAPTURE_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].rx_tap_point.capture_dai_data; - } else if (strnstr(pcm_id, VoMMode2_RX_PLAYBACK_DAI_ID, size)) { - dai_data = - &prtd->session[VOMMODE2_INDEX].rx_tap_point.playback_dai_data; - - } else { - pr_err("%s: Wrong dai id\n", __func__); - } - } - - return dai_data; -} - -static struct tap_point *hpcm_get_tappoint_data(char *pcm_id, - struct hpcm_drv *prtd) -{ - struct tap_point *tp = NULL; - size_t size = 0; - - if (pcm_id) { - size = strlen(pcm_id); - /* Check for Voice DAI */ - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOICE_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VOICE_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOICE_INDEX].rx_tap_point; - /* Check for VoLTE DAI */ - } else if (strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VOLTE_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VOLTE_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOLTE_INDEX].rx_tap_point; - /* check for VoiceMMode1 */ - } else if (strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode1_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VoMMode1_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE1_INDEX].rx_tap_point; - /* check for VoiceMMode2 */ - } else if (strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].tx_tap_point; - } else if (strnstr(pcm_id, VoMMode2_RX_CAPTURE_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].rx_tap_point; - } else if (strnstr(pcm_id, VoMMode2_RX_PLAYBACK_DAI_ID, size)) { - tp = &prtd->session[VOMMODE2_INDEX].rx_tap_point; - } else { - pr_err("%s: wrong dai id\n", __func__); - } - } - - return tp; -} - -static struct tappnt_mxr_data *hpcm_get_tappnt_mixer_data(char *pcm_id, - struct hpcm_drv *prtd) -{ - - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, strlen(pcm_id))) { - return &prtd->mixer_conf.tx; - } else { - return &prtd->mixer_conf.rx; - } -} - -static int get_tappnt_value(char *pcm_id) -{ - - if (strnstr(pcm_id, VOICE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOICE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VOLTE_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode1_TX_PLAYBACK_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_CAPTURE_DAI_ID, strlen(pcm_id)) || - strnstr(pcm_id, VoMMode2_TX_PLAYBACK_DAI_ID, strlen(pcm_id))) { - return TX; - } else { - return RX; - } -} - -static bool hpcm_all_dais_are_ready(uint16_t direction, struct tap_point *tp, - enum hpcm_state state) -{ - bool dais_started = false; - - /* - * Based on the direction set per tap point in the mixer control, - * all the dais per tap point should meet the required state for the - * commands such as vpcm_map_memory/vpcm_start to be executed. - */ - switch (direction) { - case VSS_IVPCM_TAP_POINT_DIR_OUT_IN: - if ((tp->playback_dai_data.state >= state) && - (tp->capture_dai_data.state >= state)) { - dais_started = true; - } - break; - - case VSS_IVPCM_TAP_POINT_DIR_IN: - if (tp->playback_dai_data.state >= state) - dais_started = true; - break; - - case VSS_IVPCM_TAP_POINT_DIR_OUT: - if (tp->capture_dai_data.state >= state) - dais_started = true; - break; - - default: - pr_err("invalid direction\n"); - } - - return dais_started; -} - -static void hpcm_create_free_queue(struct snd_dma_buffer *dma_buf, - struct dai_data *dai_data) -{ - struct hpcm_buf_node *buf_node = NULL; - int i = 0, offset = 0; - - for (i = 0; i < HPCM_MAX_Q_LEN; i++) { - buf_node = (void *)dma_buf->area + offset; - list_add_tail(&buf_node->list, - &dai_data->free_queue); - offset = offset + sizeof(struct hpcm_buf_node); - } -} - -static void hpcm_free_allocated_mem(struct hpcm_drv *prtd) -{ - phys_addr_t paddr = 0; - struct tap_point *txtp = NULL; - struct tap_point *rxtp = NULL; - struct session *sess = NULL; - - sess = &prtd->session[prtd->mixer_conf.sess_indx]; - txtp = &sess->tx_tap_point; - rxtp = &sess->rx_tap_point; - paddr = sess->sess_paddr; - - if (paddr) { - msm_audio_ion_free(sess->dma_buf); - sess->dma_buf = NULL; - msm_audio_ion_free(sess->tp_mem_table.dma_buf); - sess->tp_mem_table.dma_buf = NULL; - sess->sess_paddr = 0; - sess->sess_kvaddr = 0; - - txtp->capture_dai_data.vocpcm_ion_buffer.paddr = 0; - txtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = 0; - - txtp->playback_dai_data.vocpcm_ion_buffer.paddr = 0; - txtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = 0; - - rxtp->capture_dai_data.vocpcm_ion_buffer.paddr = 0; - rxtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = 0; - - rxtp->playback_dai_data.vocpcm_ion_buffer.paddr = 0; - rxtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = 0; - } else { - pr_debug("%s, paddr = 0, nothing to free\n", __func__); - } -} - -static void hpcm_unmap_and_free_shared_memory(struct hpcm_drv *prtd) - -{ - phys_addr_t paddr = 0; - char *sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - - if (prtd->mixer_conf.sess_indx >= 0) - paddr = prtd->session[prtd->mixer_conf.sess_indx].sess_paddr; - else - paddr = 0; - - if (paddr) { - voc_send_cvp_unmap_vocpcm_memory(voc_get_session_id(sess_name)); - hpcm_free_allocated_mem(prtd); - } else { - pr_debug("%s, paddr = 0, nothing to unmap/free\n", __func__); - } -} - -static int hpcm_map_vocpcm_memory(struct hpcm_drv *prtd) -{ - int ret = 0; - char *sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - struct session *sess = NULL; - - sess = &prtd->session[prtd->mixer_conf.sess_indx]; - - ret = voc_send_cvp_map_vocpcm_memory(voc_get_session_id(sess_name), - &sess->tp_mem_table, - sess->sess_paddr, - VHPCM_BLOCK_SIZE); - - return ret; -} - -static int hpcm_allocate_shared_memory(struct hpcm_drv *prtd) -{ - int result; - int ret = 0; - size_t mem_len; - size_t len; - struct tap_point *txtp = NULL; - struct tap_point *rxtp = NULL; - struct session *sess = NULL; - - sess = &prtd->session[prtd->mixer_conf.sess_indx]; - txtp = &sess->tx_tap_point; - rxtp = &sess->rx_tap_point; - - result = msm_audio_ion_alloc(&sess->dma_buf, - VHPCM_BLOCK_SIZE, - &sess->sess_paddr, - &mem_len, - &sess->sess_kvaddr); - if (result) { - pr_err("%s: msm_audio_ion_alloc error, rc = %d\n", - __func__, result); - sess->sess_paddr = 0; - sess->sess_kvaddr = 0; - ret = -ENOMEM; - goto done; - } - pr_debug("%s: Host PCM memory block allocated\n", __func__); - - /* Allocate mem_map_table for tap point */ - result = msm_audio_ion_alloc(&sess->tp_mem_table.dma_buf, - sizeof(struct vss_imemory_table_t), - &sess->tp_mem_table.phys, - &len, - &sess->tp_mem_table.data); - - if (result) { - pr_err("%s: msm_audio_ion_alloc error, rc = %d\n", - __func__, result); - msm_audio_ion_free(sess->dma_buf); - sess->dma_buf = NULL; - sess->sess_paddr = 0; - sess->sess_kvaddr = 0; - ret = -ENOMEM; - goto done; - } - pr_debug("%s: Host PCM memory table allocated\n", __func__); - - memset(sess->tp_mem_table.data, 0, - sizeof(struct vss_imemory_table_t)); - - sess->tp_mem_table.size = sizeof(struct vss_imemory_table_t); - - pr_debug("%s: data %pK phys %pK\n", __func__, - sess->tp_mem_table.data, &sess->tp_mem_table.phys); - - /* Split 4096 block into four 1024 byte blocks for each dai */ - txtp->capture_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr; - txtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr; - - txtp->playback_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr + VHPCM_BLOCK_SIZE/4; - txtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr + VHPCM_BLOCK_SIZE/4; - - rxtp->capture_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr + (VHPCM_BLOCK_SIZE/4) * 2; - rxtp->capture_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr + (VHPCM_BLOCK_SIZE/4) * 2; - - rxtp->playback_dai_data.vocpcm_ion_buffer.paddr = - sess->sess_paddr + (VHPCM_BLOCK_SIZE/4) * 3; - rxtp->playback_dai_data.vocpcm_ion_buffer.kvaddr = - sess->sess_kvaddr + (VHPCM_BLOCK_SIZE/4) * 3; - -done: - return ret; -} - -static int hpcm_start_vocpcm(char *pcm_id, struct hpcm_drv *prtd, - struct tap_point *tp) -{ - int indx = prtd->mixer_conf.sess_indx; - uint32_t *no_of_tp = &prtd->start_cmd.no_of_tapoints; - struct vss_ivpcm_tap_point *tap_pnt = &prtd->start_cmd.tap_pnt[0]; - uint32_t no_of_tp_req = 0; - char *sess_name = hpcm_get_sess_name(indx); - - if (prtd->mixer_conf.rx.enable) - no_of_tp_req++; - if (prtd->mixer_conf.tx.enable) - no_of_tp_req++; - - if (prtd->mixer_conf.rx.enable && (get_tappnt_value(pcm_id) == RX)) { - if (hpcm_all_dais_are_ready(prtd->mixer_conf.rx.direction, - tp, HPCM_PREPARED)) { - pr_debug("%s: RX conditions met\n", __func__); - tap_pnt[*no_of_tp].tap_point = - VSS_IVPCM_TAP_POINT_RX_DEFAULT; - tap_pnt[*no_of_tp].direction = - prtd->mixer_conf.rx.direction; - tap_pnt[*no_of_tp].sampling_rate = - prtd->mixer_conf.rx.sample_rate; - (*no_of_tp)++; - } - } - - if (prtd->mixer_conf.tx.enable && (get_tappnt_value(pcm_id) == TX)) { - if (hpcm_all_dais_are_ready(prtd->mixer_conf.tx.direction, - tp, HPCM_PREPARED)) { - pr_debug("%s: TX conditions met\n", __func__); - tap_pnt[*no_of_tp].tap_point = - VSS_IVPCM_TAP_POINT_TX_DEFAULT; - tap_pnt[*no_of_tp].direction = - prtd->mixer_conf.tx.direction; - tap_pnt[*no_of_tp].sampling_rate = - prtd->mixer_conf.tx.sample_rate; - (*no_of_tp)++; - } - } - - if ((prtd->mixer_conf.tx.enable || prtd->mixer_conf.rx.enable) && - *no_of_tp == no_of_tp_req) { - voc_send_cvp_start_vocpcm(voc_get_session_id(sess_name), - tap_pnt, *no_of_tp); - /* Reset the start command so that it is not called twice */ - memset(&prtd->start_cmd, 0, sizeof(struct start_cmd)); - } else { - pr_debug("%s: required pcm handles not opened yet\n", __func__); - } - - return 0; -} - -/* Playback path*/ -static void hpcm_copy_playback_data_from_queue(struct dai_data *dai_data, - uint32_t *len) -{ - struct hpcm_buf_node *buf_node = NULL; - unsigned long dsp_flags; - - if (dai_data->substream == NULL) - return; - - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - - if (!list_empty(&dai_data->filled_queue)) { - buf_node = list_first_entry(&dai_data->filled_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - *len = buf_node->frame.len; - memcpy((u8 *)dai_data->vocpcm_ion_buffer.kvaddr, - &buf_node->frame.voc_pkt[0], - buf_node->frame.len); - - list_add_tail(&buf_node->list, &dai_data->free_queue); - dai_data->pcm_irq_pos += dai_data->pcm_count; - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(dai_data->substream); - } else { - *len = 0; - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - pr_err("IN data not available\n"); - } - - wake_up(&dai_data->queue_wait); -} - -/* Capture path*/ -static void hpcm_copy_capture_data_to_queue(struct dai_data *dai_data, - uint32_t len) -{ - struct hpcm_buf_node *buf_node = NULL; - unsigned long dsp_flags; - - if (dai_data->substream == NULL) - return; - - /* Copy out buffer packet into free_queue */ - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - - if (!list_empty(&dai_data->free_queue)) { - buf_node = list_first_entry(&dai_data->free_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - buf_node->frame.len = len; - memcpy(&buf_node->frame.voc_pkt[0], - (uint8_t *)dai_data->vocpcm_ion_buffer.kvaddr, - buf_node->frame.len); - list_add_tail(&buf_node->list, &dai_data->filled_queue); - dai_data->pcm_irq_pos += dai_data->pcm_count; - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(dai_data->substream); - } else { - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - pr_err("OUTPUT data dropped\n"); - } - - wake_up(&dai_data->queue_wait); -} - -void hpcm_notify_evt_processing(uint8_t *data, char *session, - void *private_data) -{ - struct hpcm_drv *prtd = (struct hpcm_drv *)private_data; - struct vss_ivpcm_evt_notify_v2_t *notify_evt = - (struct vss_ivpcm_evt_notify_v2_t *)data; - struct vss_ivpcm_evt_push_buffer_v2_t push_buff_event; - struct tap_point *tp = NULL; - int in_buf_len = 0; - struct tappnt_mxr_data *tmd = NULL; - char *sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - - /* If it's not a timetick, it's a error notification, drop the event */ - if ((notify_evt->notify_mask & VSS_IVPCM_NOTIFY_MASK_TIMETICK) == 0) { - pr_err("%s: Error notification. mask=%d\n", __func__, - notify_evt->notify_mask); - return; - } - - if (notify_evt->tap_point == VSS_IVPCM_TAP_POINT_TX_DEFAULT) { - tp = &prtd->session[prtd->mixer_conf.sess_indx].tx_tap_point; - tmd = &prtd->mixer_conf.tx; - } else if (notify_evt->tap_point == VSS_IVPCM_TAP_POINT_RX_DEFAULT) { - tp = &prtd->session[prtd->mixer_conf.sess_indx].rx_tap_point; - tmd = &prtd->mixer_conf.rx; - } - - if (tp == NULL || tmd == NULL) { - pr_err("%s: tp = %pK or tmd = %pK is null\n", __func__, - tp, tmd); - - return; - } - - if (notify_evt->notify_mask & VSS_IVPCM_NOTIFY_MASK_OUTPUT_BUFFER) { - hpcm_copy_capture_data_to_queue(&tp->capture_dai_data, - notify_evt->filled_out_size); - } - - if (notify_evt->notify_mask & VSS_IVPCM_NOTIFY_MASK_INPUT_BUFFER) { - hpcm_copy_playback_data_from_queue(&tp->playback_dai_data, - &in_buf_len); - } - - switch (tmd->direction) { - /* - * When the dir is OUT_IN, for the first notify mask, pushbuf mask - * should be set to VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER since we - * atleast need one buffer's worth data before we can send IN buffer. - * For the consecutive notify evts, the push buf mask will set for both - * VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER and - * VSS_IVPCM_PUSH_BUFFER_MASK_IN_BUFFER. - */ - case VSS_IVPCM_TAP_POINT_DIR_OUT_IN: - if (notify_evt->notify_mask == - VSS_IVPCM_NOTIFY_MASK_TIMETICK) { - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER; - } else { - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER | - VSS_IVPCM_PUSH_BUFFER_MASK_INPUT_BUFFER; - } - break; - - case VSS_IVPCM_TAP_POINT_DIR_IN: - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_INPUT_BUFFER; - break; - - case VSS_IVPCM_TAP_POINT_DIR_OUT: - push_buff_event.push_buf_mask = - VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER; - break; - } - - push_buff_event.tap_point = notify_evt->tap_point; - push_buff_event.out_buf_mem_address = - tp->capture_dai_data.vocpcm_ion_buffer.paddr; - push_buff_event.in_buf_mem_address = - tp->playback_dai_data.vocpcm_ion_buffer.paddr; - push_buff_event.sampling_rate = notify_evt->sampling_rate; - push_buff_event.num_in_channels = 1; - - /* - * ADSP must read and write from a cache aligned (128 byte) location, - * and in blocks of the cache alignment size. The 128 byte cache - * alignment requirement is guaranteed due to 4096 byte memory - * alignment requirement during memory allocation/mapping. The output - * buffer (ADSP write) size mask ensures that a 128 byte multiple - * worth of will be written. Internally, the input buffer (ADSP read) - * size will also be a multiple of 128 bytes. However it is the - * application's responsibility to ensure no other data is written in - * the specified length of memory. - */ - push_buff_event.out_buf_mem_size = ((notify_evt->request_buf_size) + - CACHE_ALIGNMENT_SIZE) & CACHE_ALIGNMENT_MASK; - push_buff_event.in_buf_mem_size = in_buf_len; - - voc_send_cvp_vocpcm_push_buf_evt(voc_get_session_id(sess_name), - &push_buff_event); -} - -static int msm_hpcm_configure_voice_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point = %d direction = %d sample_rate = %d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOICE_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control voice values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOICE_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; -} - -static int msm_hpcm_configure_vmmode1_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point = %d direction = %d sample_rate = %d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOMMODE1_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control voice values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOMMODE1_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; -} - -static int msm_hpcm_configure_vmmode2_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point = %d direction = %d sample_rate = %d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOMMODE2_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control voice values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOMMODE2_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; -} - -static int msm_hpcm_configure_volte_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - int tap_point = ucontrol->value.integer.value[0]; - uint16_t direction = ucontrol->value.integer.value[1]; - uint16_t sample_rate = ucontrol->value.integer.value[2]; - struct tappnt_mxr_data *tmd = NULL; - int ret = 0; - - mutex_lock(&hpcm_drv.lock); - pr_debug("%s: tap_point=%d direction=%d sample_rate=%d\n", - __func__, tap_point, direction, sample_rate); - - if (!hpcm_is_valid_config(VOLTE_INDEX, tap_point, direction, - sample_rate)) { - pr_err("Invalid vpcm mixer control volte values\n"); - ret = -EINVAL; - goto done; - } - - if (tap_point == RX) - tmd = &hpcm_drv.mixer_conf.rx; - else - tmd = &hpcm_drv.mixer_conf.tx; - - tmd->enable = true; - tmd->direction = direction; - tmd->sample_rate = sample_rate; - hpcm_drv.mixer_conf.sess_indx = VOLTE_INDEX; - -done: - mutex_unlock(&hpcm_drv.lock); - return ret; - -} - -static struct snd_kcontrol_new msm_hpcm_controls[] = { - SOC_SINGLE_MULTI_EXT("HPCM_Voice tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_voice_put), - SOC_SINGLE_MULTI_EXT("HPCM_VoLTE tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_volte_put), - SOC_SINGLE_MULTI_EXT("HPCM_VMMode1 tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_vmmode1_put), - SOC_SINGLE_MULTI_EXT("HPCM_VMMode2 tappoint direction samplerate", - SND_SOC_NOPM, 0, 16000, 0, 3, - NULL, msm_hpcm_configure_vmmode2_put), -}; - -/* Sample rates supported */ -static unsigned int supported_sample_rates[] = {8000, 16000}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct hpcm_buf_node *buf_node = NULL; - struct snd_dma_buffer *dma_buf; - struct snd_pcm_runtime *runtime; - struct hpcm_drv *prtd; - unsigned long dsp_flags; - struct dai_data *dai_data = NULL; - struct tap_point *tp = NULL; - struct tappnt_mxr_data *tmd = NULL; - char *sess_name = NULL; - - if (substream == NULL) { - pr_err("substream is NULL\n"); - return -EINVAL; - } - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - runtime = substream->runtime; - prtd = runtime->private_data; - sess_name = hpcm_get_sess_name(prtd->mixer_conf.sess_indx); - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - wake_up(&dai_data->queue_wait); - mutex_lock(&prtd->lock); - - tmd = hpcm_get_tappnt_mixer_data(substream->pcm->id, prtd); - - tp = hpcm_get_tappoint_data(substream->pcm->id, prtd); - /* Send stop command */ - voc_send_cvp_stop_vocpcm(voc_get_session_id(sess_name)); - /* Memory unmap/free takes place only when called the first time */ - hpcm_unmap_and_free_shared_memory(prtd); - /* Unregister host PCM event callback function */ - voc_deregister_hpcm_evt_cb(); - /* Reset the cached start cmd */ - memset(&prtd->start_cmd, 0, sizeof(struct start_cmd)); - /* Release all buffer */ - pr_debug("%s: Release all buffer\n", __func__); - substream = dai_data->substream; - if (substream == NULL) { - pr_debug("%s: substream is NULL\n", __func__); - goto done; - } - dma_buf = &substream->dma_buffer; - if (dma_buf == NULL) { - pr_debug("%s: dma_buf is NULL\n", __func__); - goto done; - } - if (dma_buf->area != NULL) { - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - list_for_each_safe(ptr, next, &dai_data->filled_queue) { - buf_node = list_entry(ptr, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - } - list_for_each_safe(ptr, next, &dai_data->free_queue) { - buf_node = list_entry(ptr, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - } - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - dma_free_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, dma_buf->area, - dma_buf->addr); - dma_buf->area = NULL; - } - dai_data->substream = NULL; - dai_data->pcm_buf_pos = 0; - dai_data->pcm_count = 0; - dai_data->pcm_irq_pos = 0; - dai_data->pcm_size = 0; - dai_data->state = HPCM_CLOSED; - hpcm_reset_mixer_config(prtd); - -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - struct hpcm_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - unsigned long dsp_flags; - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_interruptible_timeout(dai_data->queue_wait, - (!list_empty(&dai_data->free_queue) || - dai_data->state == HPCM_STOPPED), - 1 * HZ); - if (ret > 0) { - if (fbytes <= HPCM_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - buf_node = - list_first_entry(&dai_data->free_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - ret = copy_from_user(&buf_node->frame.voc_pkt, buf, - fbytes); - buf_node->frame.len = fbytes; - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, &dai_data->filled_queue); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - } else { - pr_err("%s: Write cnt %lu is > HPCM_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - } else if (ret == 0) { - pr_err("%s: No free Playback buffer\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: playback copy was interrupted\n", __func__); - } - -done: - return ret; -} - -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, - void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct hpcm_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - unsigned long dsp_flags; - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_interruptible_timeout(dai_data->queue_wait, - (!list_empty(&dai_data->filled_queue) || - dai_data->state == HPCM_STOPPED), - 1 * HZ); - - if (ret > 0) { - if (fbytes <= HPCM_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - buf_node = list_first_entry(&dai_data->filled_queue, - struct hpcm_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - ret = copy_to_user(buf, &buf_node->frame.voc_pkt, - buf_node->frame.len); - if (ret) { - pr_err("%s: Copy to user returned %d\n", - __func__, ret); - ret = -EFAULT; - } - spin_lock_irqsave(&dai_data->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, &dai_data->free_queue); - spin_unlock_irqrestore(&dai_data->dsp_lock, dsp_flags); - - } else { - pr_err("%s: Read count %lu > HPCM_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - - } else if (ret == 0) { - pr_err("%s: No Caputre data available\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: Read was interrupted\n", __func__); - ret = -ERESTARTSYS; - } - -done: - return ret; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int channel, - unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_copy(substream, channel, - hwoff, buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, channel, - hwoff, buf, fbytes); - - return ret; -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - struct dai_data *dai_data = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - snd_pcm_uframes_t ret; - - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = 0; - goto done; - } - - if (dai_data->pcm_irq_pos >= dai_data->pcm_size) - dai_data->pcm_irq_pos = 0; - - ret = bytes_to_frames(runtime, (dai_data->pcm_irq_pos)); - -done: - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = - hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - pr_debug("SNDRV_PCM_TRIGGER_START\n"); - dai_data->state = HPCM_STARTED; - break; - - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - dai_data->state = HPCM_STOPPED; - break; - - default: - ret = -EINVAL; - break; - } - -done: - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = runtime->private_data; - struct dai_data *dai_data = NULL; - struct tap_point *tp = NULL; - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - mutex_lock(&prtd->lock); - - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - dai_data->pcm_size = snd_pcm_lib_buffer_bytes(substream); - dai_data->pcm_count = snd_pcm_lib_period_bytes(substream); - dai_data->pcm_irq_pos = 0; - dai_data->pcm_buf_pos = 0; - dai_data->state = HPCM_PREPARED; - - /* Register event notify processing callback in prepare instead of - * init() as q6voice module's init() can be called at a later point - */ - voc_register_hpcm_evt_cb(hpcm_notify_evt_processing, &hpcm_drv); - - tp = hpcm_get_tappoint_data(substream->pcm->id, prtd); - if (tp != NULL) { - ret = hpcm_start_vocpcm(substream->pcm->id, prtd, tp); - if (ret) { - pr_err("error sending start cmd err=%d\n", ret); - goto done; - } - } else { - pr_err("%s tp is NULL\n", __func__); - } -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct hpcm_drv *prtd = (struct hpcm_drv *)runtime->private_data; - int ret = 0; - - pr_debug("%s: %s\n", __func__, substream->pcm->id); - mutex_lock(&prtd->lock); - - /* Allocate and map voice host PCM ion buffer */ - if (prtd->session[prtd->mixer_conf.sess_indx].sess_paddr == 0) { - ret = hpcm_allocate_shared_memory(prtd); - if (ret) { - pr_err("error creating shared memory err=%d\n", ret); - goto done; - } - - ret = hpcm_map_vocpcm_memory(prtd); - if (ret) { - pr_err("error mapping shared memory err=%d\n", ret); - hpcm_free_allocated_mem(prtd); - goto done; - } - } else { - pr_debug("%s, VHPCM memory allocation/mapping not performed\n" - , __func__); - } - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - - dma_buf->area = dma_alloc_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - &dma_buf->addr, GFP_KERNEL); - - if (!dma_buf->area) { - pr_err("%s:MSM dma_alloc failed\n", __func__); - ret = -ENOMEM; - goto done; - } - - dma_buf->bytes = runtime->hw.buffer_bytes_max; - memset(dma_buf->area, 0, runtime->hw.buffer_bytes_max); - - hpcm_create_free_queue(dma_buf, - hpcm_get_dai_data(substream->pcm->id, prtd)); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct hpcm_drv *prtd = &hpcm_drv; - struct tappnt_mxr_data *tmd = NULL; - struct dai_data *dai_data = NULL; - int ret = 0; - int tp_val = 0; - - pr_debug("%s, %s\n", __func__, substream->pcm->id); - mutex_lock(&prtd->lock); - - dai_data = hpcm_get_dai_data(substream->pcm->id, prtd); - - if (dai_data == NULL) { - pr_err("%s, dai_data is null\n", __func__); - - ret = -EINVAL; - goto done; - } - - runtime->hw = msm_pcm_hardware; - - ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_debug("snd_pcm_hw_constraint_list failed\n"); - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) { - pr_debug("snd_pcm_hw_constraint_integer failed\n"); - goto done; - } - - tp_val = get_tappnt_value(substream->pcm->id); - tmd = hpcm_get_tappnt_mixer_data(substream->pcm->id, prtd); - - /* Check wheather the kcontrol values set are valid */ - if (!tmd || - !(tmd->enable) || - !hpcm_is_valid_config(prtd->mixer_conf.sess_indx, - tp_val, tmd->direction, - tmd->sample_rate)) { - ret = -EINVAL; - goto done; - } - - dai_data->substream = substream; - runtime->private_data = prtd; - -done: - mutex_unlock(&prtd->lock); - return ret; -} - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .hw_params = msm_pcm_hw_params, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .copy_user = msm_pcm_copy, - .close = msm_pcm_close, -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - - pr_debug("%s:\n", __func__); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - return 0; -} - -static int msm_pcm_hpcm_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_hpcm_controls, - ARRAY_SIZE(msm_hpcm_controls)); - - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_hpcm_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - - pr_info("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_voice_host_pcm_dt_match[] = { - {.compatible = "qcom,msm-voice-host-pcm"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_voice_host_pcm_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-voice-host-pcm", - .owner = THIS_MODULE, - .of_match_table = msm_voice_host_pcm_dt_match, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_voice_host_init(void) -{ - int i = 0; - struct session *s = NULL; - - memset(&hpcm_drv, 0, sizeof(hpcm_drv)); - mutex_init(&hpcm_drv.lock); - - for (i = 0; i < MAX_SESSION; i++) { - s = &hpcm_drv.session[i]; - spin_lock_init(&s->rx_tap_point.capture_dai_data.dsp_lock); - spin_lock_init(&s->rx_tap_point.playback_dai_data.dsp_lock); - spin_lock_init(&s->tx_tap_point.capture_dai_data.dsp_lock); - spin_lock_init(&s->tx_tap_point.playback_dai_data.dsp_lock); - - init_waitqueue_head( - &s->rx_tap_point.capture_dai_data.queue_wait); - init_waitqueue_head( - &s->rx_tap_point.playback_dai_data.queue_wait); - init_waitqueue_head( - &s->tx_tap_point.capture_dai_data.queue_wait); - init_waitqueue_head( - &s->tx_tap_point.playback_dai_data.queue_wait); - - INIT_LIST_HEAD(&s->rx_tap_point.capture_dai_data.filled_queue); - INIT_LIST_HEAD(&s->rx_tap_point.capture_dai_data.free_queue); - INIT_LIST_HEAD(&s->rx_tap_point.playback_dai_data.filled_queue); - INIT_LIST_HEAD(&s->rx_tap_point.playback_dai_data.free_queue); - - INIT_LIST_HEAD(&s->tx_tap_point.capture_dai_data.filled_queue); - INIT_LIST_HEAD(&s->tx_tap_point.capture_dai_data.free_queue); - INIT_LIST_HEAD(&s->tx_tap_point.playback_dai_data.filled_queue); - INIT_LIST_HEAD(&s->tx_tap_point.playback_dai_data.free_queue); - } - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_voice_host_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-hostless.c b/techpack/audio/asoc/msm-pcm-hostless.c deleted file mode 100644 index e2850a421d67..000000000000 --- a/techpack/audio/asoc/msm-pcm-hostless.c +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2011-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - - -static int msm_pcm_hostless_prepare(struct snd_pcm_substream *substream) -{ - if (!substream) { - pr_err("%s: invalid params\n", __func__); - return -EINVAL; - } - pm_qos_remove_request(&substream->latency_pm_qos_req); - return 0; -} - -static const struct snd_pcm_ops msm_pcm_hostless_ops = { - .prepare = msm_pcm_hostless_prepare -}; - -static struct snd_soc_platform_driver msm_soc_hostless_platform = { - .ops = &msm_pcm_hostless_ops, -}; - -static int msm_pcm_hostless_probe(struct platform_device *pdev) -{ - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_hostless_platform); -} - -static int msm_pcm_hostless_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_pcm_hostless_dt_match[] = { - {.compatible = "qcom,msm-pcm-hostless"}, - {} -}; - -static struct platform_driver msm_pcm_hostless_driver = { - .driver = { - .name = "msm-pcm-hostless", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_hostless_dt_match, - }, - .probe = msm_pcm_hostless_probe, - .remove = msm_pcm_hostless_remove, -}; - -int __init msm_pcm_hostless_init(void) -{ - return platform_driver_register(&msm_pcm_hostless_driver); -} - -void msm_pcm_hostless_exit(void) -{ - platform_driver_unregister(&msm_pcm_hostless_driver); -} - -MODULE_DESCRIPTION("Hostless platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-loopback-v2.c b/techpack/audio/asoc/msm-pcm-loopback-v2.c deleted file mode 100644 index 7bb20bb4d11a..000000000000 --- a/techpack/audio/asoc/msm-pcm-loopback-v2.c +++ /dev/null @@ -1,808 +0,0 @@ -/* Copyright (c) 2013-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-routing-v2.h" - -#define LOOPBACK_VOL_MAX_STEPS 0x2000 -#define LOOPBACK_SESSION_MAX 4 - -static DEFINE_MUTEX(loopback_session_lock); -static const DECLARE_TLV_DB_LINEAR(loopback_rx_vol_gain, 0, - LOOPBACK_VOL_MAX_STEPS); - -struct msm_pcm_loopback { - struct snd_pcm_substream *playback_substream; - struct snd_pcm_substream *capture_substream; - - int instance; - - struct mutex lock; - - uint32_t samp_rate; - uint32_t channel_mode; - - int playback_start; - int capture_start; - int session_id; - struct audio_client *audio_client; - uint32_t volume; -}; - -struct fe_dai_session_map { - char stream_name[32]; - struct msm_pcm_loopback *loopback_priv; -}; - -static struct fe_dai_session_map session_map[LOOPBACK_SESSION_MAX] = { - { {}, NULL}, - { {}, NULL}, - { {}, NULL}, - { {}, NULL}, -}; - -static u32 hfp_tx_mute; - -struct msm_pcm_pdata { - int perf_mode; -}; - -static void stop_pcm(struct msm_pcm_loopback *pcm); -static int msm_pcm_loopback_get_session(struct snd_soc_pcm_runtime *rtd, - struct msm_pcm_loopback **pcm); - -static void msm_pcm_route_event_handler(enum msm_pcm_routing_event event, - void *priv_data) -{ - struct msm_pcm_loopback *pcm = priv_data; - - WARN_ON(!pcm); - - pr_debug("%s: event 0x%x\n", __func__, event); - - switch (event) { - case MSM_PCM_RT_EVT_DEVSWITCH: - q6asm_cmd(pcm->audio_client, CMD_PAUSE); - q6asm_cmd(pcm->audio_client, CMD_FLUSH); - q6asm_run(pcm->audio_client, 0, 0, 0); - /* fallthrough */ - default: - pr_err("%s: default event 0x%x\n", __func__, event); - break; - } -} - -static void msm_pcm_loopback_event_handler(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - pr_debug("%s:\n", __func__); - switch (opcode) { - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - break; - default: - break; - } - } - break; - default: - pr_err("%s: Not Supported Event opcode[0x%x]\n", - __func__, opcode); - break; - } -} - -static int msm_loopback_session_mute_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = hfp_tx_mute; - return 0; -} - -static int msm_loopback_session_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0, n = 0; - int mute = ucontrol->value.integer.value[0]; - struct msm_pcm_loopback *pcm = NULL; - - if ((mute < 0) || (mute > 1)) { - pr_err(" %s Invalid arguments", __func__); - ret = -EINVAL; - goto done; - } - mutex_lock(&loopback_session_lock); - pr_debug("%s: mute=%d\n", __func__, mute); - hfp_tx_mute = mute; - for (n = 0; n < LOOPBACK_SESSION_MAX; n++) { - if (!strcmp(session_map[n].stream_name, "MultiMedia6")) - pcm = session_map[n].loopback_priv; - } - if (pcm && pcm->audio_client) { - ret = q6asm_set_mute(pcm->audio_client, mute); - if (ret < 0) - pr_err("%s: Send mute command failed rc=%d\n", - __func__, ret); - } - mutex_unlock(&loopback_session_lock); -done: - return ret; -} - -static struct snd_kcontrol_new msm_loopback_controls[] = { - SOC_SINGLE_EXT("HFP TX Mute", SND_SOC_NOPM, 0, 1, 0, - msm_loopback_session_mute_get, - msm_loopback_session_mute_put), -}; - -static int msm_pcm_loopback_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_loopback_controls, - ARRAY_SIZE(msm_loopback_controls)); - - return 0; -} -static int pcm_loopback_set_volume(struct msm_pcm_loopback *prtd, - uint32_t volume) -{ - int rc = -EINVAL; - - pr_debug("%s: Setting volume 0x%x\n", __func__, volume); - - if (prtd && prtd->audio_client) { - rc = q6asm_set_volume(prtd->audio_client, volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc = %d\n", - __func__, rc); - return rc; - } - prtd->volume = volume; - } - return rc; -} - -static int msm_pcm_loopback_get_session(struct snd_soc_pcm_runtime *rtd, - struct msm_pcm_loopback **pcm) -{ - int ret = 0; - int n, index = -1; - - dev_dbg(rtd->platform->dev, "%s: stream %s\n", __func__, - rtd->dai_link->stream_name); - - mutex_lock(&loopback_session_lock); - for (n = 0; n < LOOPBACK_SESSION_MAX; n++) { - if (!strcmp(rtd->dai_link->stream_name, - session_map[n].stream_name)) { - *pcm = session_map[n].loopback_priv; - goto exit; - } - /* - * Store the min index value for allocating a new session. - * Here, if session stream name is not found in the - * existing entries after the loop iteration, then this - * index will be used to allocate the new session. - * This index variable is expected to point to the topmost - * available free session. - */ - if (!(session_map[n].stream_name[0]) && (index < 0)) - index = n; - } - - if (index < 0) { - dev_err(rtd->platform->dev, "%s: Max Sessions allocated\n", - __func__); - ret = -EAGAIN; - goto exit; - } - - session_map[index].loopback_priv = kzalloc( - sizeof(struct msm_pcm_loopback), GFP_KERNEL); - if (!session_map[index].loopback_priv) { - ret = -ENOMEM; - goto exit; - } - - strlcpy(session_map[index].stream_name, - rtd->dai_link->stream_name, - sizeof(session_map[index].stream_name)); - dev_dbg(rtd->platform->dev, "%s: stream %s index %d\n", - __func__, session_map[index].stream_name, index); - - mutex_init(&session_map[index].loopback_priv->lock); - *pcm = session_map[index].loopback_priv; -exit: - mutex_unlock(&loopback_session_lock); - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - struct msm_pcm_loopback *pcm = NULL; - int ret = 0; - uint16_t bits_per_sample = 16; - struct msm_pcm_routing_evt event; - struct asm_session_mtmx_strtr_param_window_v2_t asm_mtmx_strtr_window; - uint32_t param_id; - struct msm_pcm_pdata *pdata; - - ret = msm_pcm_loopback_get_session(rtd, &pcm); - if (ret) - return ret; - - mutex_lock(&pcm->lock); - - pcm->volume = 0x2000; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - pcm->playback_substream = substream; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - pcm->capture_substream = substream; - - pcm->instance++; - dev_dbg(rtd->platform->dev, "%s: pcm out open: %d,%d\n", __func__, - pcm->instance, substream->stream); - if (pcm->instance == 2) { - struct snd_soc_pcm_runtime *soc_pcm_rx = - pcm->playback_substream->private_data; - struct snd_soc_pcm_runtime *soc_pcm_tx = - pcm->capture_substream->private_data; - if (pcm->audio_client != NULL) - stop_pcm(pcm); - - pdata = (struct msm_pcm_pdata *) - dev_get_drvdata(rtd->platform->dev); - if (!pdata) { - dev_err(rtd->platform->dev, - "%s: platform data not populated\n", __func__); - mutex_unlock(&pcm->lock); - return -EINVAL; - } - - pcm->audio_client = q6asm_audio_client_alloc( - (app_cb)msm_pcm_loopback_event_handler, pcm); - if (!pcm->audio_client) { - dev_err(rtd->platform->dev, - "%s: Could not allocate memory\n", __func__); - mutex_unlock(&pcm->lock); - return -ENOMEM; - } - pcm->session_id = pcm->audio_client->session; - pcm->audio_client->perf_mode = pdata->perf_mode; - ret = q6asm_open_loopback_v2(pcm->audio_client, - bits_per_sample); - if (ret < 0) { - dev_err(rtd->platform->dev, - "%s: pcm out open failed\n", __func__); - q6asm_audio_client_free(pcm->audio_client); - mutex_unlock(&pcm->lock); - return -ENOMEM; - } - event.event_func = msm_pcm_route_event_handler; - event.priv_data = (void *) pcm; - msm_pcm_routing_reg_phy_stream(soc_pcm_tx->dai_link->id, - pcm->audio_client->perf_mode, - pcm->session_id, pcm->capture_substream->stream); - msm_pcm_routing_reg_phy_stream_v2(soc_pcm_rx->dai_link->id, - pcm->audio_client->perf_mode, - pcm->session_id, pcm->playback_substream->stream, - event); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - pcm->playback_substream = substream; - ret = pcm_loopback_set_volume(pcm, pcm->volume); - if (ret < 0) - dev_err(rtd->platform->dev, - "Error %d setting volume", ret); - } - /* Set to largest negative value */ - asm_mtmx_strtr_window.window_lsw = 0x00000000; - asm_mtmx_strtr_window.window_msw = 0x80000000; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2; - q6asm_send_mtmx_strtr_window(pcm->audio_client, - &asm_mtmx_strtr_window, - param_id); - /* Set to largest positive value */ - asm_mtmx_strtr_window.window_lsw = 0xffffffff; - asm_mtmx_strtr_window.window_msw = 0x7fffffff; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2; - q6asm_send_mtmx_strtr_window(pcm->audio_client, - &asm_mtmx_strtr_window, - param_id); - } - dev_info(rtd->platform->dev, "%s: Instance = %d, Stream ID = %s\n", - __func__, pcm->instance, substream->pcm->id); - runtime->private_data = pcm; - - mutex_unlock(&pcm->lock); - - return 0; -} - -static void stop_pcm(struct msm_pcm_loopback *pcm) -{ - struct snd_soc_pcm_runtime *soc_pcm_rx; - struct snd_soc_pcm_runtime *soc_pcm_tx; - - if (pcm->audio_client == NULL) - return; - - mutex_lock(&loopback_session_lock); - q6asm_cmd(pcm->audio_client, CMD_CLOSE); - - if (pcm->playback_substream != NULL) { - soc_pcm_rx = pcm->playback_substream->private_data; - msm_pcm_routing_dereg_phy_stream(soc_pcm_rx->dai_link->id, - SNDRV_PCM_STREAM_PLAYBACK); - } - if (pcm->capture_substream != NULL) { - soc_pcm_tx = pcm->capture_substream->private_data; - msm_pcm_routing_dereg_phy_stream(soc_pcm_tx->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - } - q6asm_audio_client_free(pcm->audio_client); - pcm->audio_client = NULL; - mutex_unlock(&loopback_session_lock); -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_pcm_loopback *pcm = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - int ret = 0, n; - bool found = false; - - mutex_lock(&pcm->lock); - - dev_dbg(rtd->platform->dev, "%s: end pcm call:%d\n", - __func__, substream->stream); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - pcm->playback_start = 0; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - pcm->capture_start = 0; - - pcm->instance--; - if (!pcm->playback_start || !pcm->capture_start) { - dev_dbg(rtd->platform->dev, "%s: end pcm call\n", __func__); - stop_pcm(pcm); - } - - if (!pcm->instance) { - mutex_lock(&loopback_session_lock); - for (n = 0; n < LOOPBACK_SESSION_MAX; n++) { - if (!strcmp(rtd->dai_link->stream_name, - session_map[n].stream_name)) { - found = true; - break; - } - } - if (found) { - memset(session_map[n].stream_name, 0, - sizeof(session_map[n].stream_name)); - mutex_unlock(&pcm->lock); - mutex_destroy(&session_map[n].loopback_priv->lock); - session_map[n].loopback_priv = NULL; - kfree(pcm); - dev_dbg(rtd->platform->dev, "%s: stream freed %s\n", - __func__, rtd->dai_link->stream_name); - mutex_unlock(&loopback_session_lock); - return 0; - } - mutex_unlock(&loopback_session_lock); - } - mutex_unlock(&pcm->lock); - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_pcm_loopback *pcm = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - - mutex_lock(&pcm->lock); - - dev_dbg(rtd->platform->dev, "%s: ASM loopback stream:%d\n", - __func__, substream->stream); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (!pcm->playback_start) - pcm->playback_start = 1; - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (!pcm->capture_start) - pcm->capture_start = 1; - } - mutex_unlock(&pcm->lock); - - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_pcm_loopback *pcm = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - dev_dbg(rtd->platform->dev, - "%s: playback_start:%d,capture_start:%d\n", __func__, - pcm->playback_start, pcm->capture_start); - if (pcm->playback_start && pcm->capture_start) - q6asm_run_nowait(pcm->audio_client, 0, 0, 0); - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - case SNDRV_PCM_TRIGGER_STOP: - dev_dbg(rtd->platform->dev, - "%s:Pause/Stop - playback_start:%d,capture_start:%d\n", - __func__, pcm->playback_start, pcm->capture_start); - if (pcm->playback_start && pcm->capture_start) - q6asm_cmd_nowait(pcm->audio_client, CMD_PAUSE); - break; - default: - pr_err("%s: default cmd %d\n", __func__, cmd); - break; - } - - return 0; -} - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, -}; - -static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = kcontrol->private_data; - struct snd_pcm_substream *substream = vol->pcm->streams[0].substream; - struct msm_pcm_loopback *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : 0x%x\n", __func__, volume); - if ((!substream) || (!substream->runtime)) { - pr_err("%s substream or runtime not found\n", __func__); - rc = -ENODEV; - goto exit; - } - mutex_lock(&loopback_session_lock); - prtd = substream->runtime->private_data; - if (!prtd) { - rc = -ENODEV; - mutex_unlock(&loopback_session_lock); - goto exit; - } - rc = pcm_loopback_set_volume(prtd, volume); - mutex_unlock(&loopback_session_lock); - -exit: - return rc; -} - -static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct msm_pcm_loopback *prtd; - - pr_debug("%s\n", __func__); - if ((!substream) || (!substream->runtime)) { - pr_debug("%s substream or runtime not found\n", __func__); - rc = -ENODEV; - goto exit; - } - mutex_lock(&loopback_session_lock); - prtd = substream->runtime->private_data; - if (!prtd) { - rc = -ENODEV; - mutex_unlock(&loopback_session_lock); - goto exit; - } - ucontrol->value.integer.value[0] = prtd->volume; - mutex_unlock(&loopback_session_lock); -exit: - return rc; -} - -static int msm_pcm_add_volume_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm->streams[0].pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - int ret = 0; - - dev_dbg(rtd->dev, "%s, Volume cntrl add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, - rtd->dai_link->id, - &volume_info); - if (ret < 0) - return ret; - kctl = volume_info->kctl; - kctl->put = msm_pcm_volume_ctl_put; - kctl->get = msm_pcm_volume_ctl_get; - kctl->tlv.p = loopback_rx_vol_gain; - return 0; -} - -static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm->streams[0].pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ctl_len = strlen(playback_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Playback app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) - return ret; - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_playback_app_type_cfg_ctl_put; - kctl->get = msm_pcm_playback_app_type_cfg_ctl_get; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ctl_len = strlen(capture_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Capture app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) - return ret; - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_capture_app_type_cfg_ctl_put; - kctl->get = msm_pcm_capture_app_type_cfg_ctl_get; - } - - return 0; -} - -static int msm_pcm_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - ret = msm_pcm_add_volume_controls(rtd); - if (ret) - pr_err("%s: pcm add volume controls failed:%d\n", - __func__, ret); - ret = msm_pcm_add_app_type_controls(rtd); - if (ret) - pr_err("%s: pcm add app type controls failed:%d\n", - __func__, ret); - return ret; -} - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_pcm_add_controls(rtd); - if (ret) - dev_err(rtd->dev, "%s, kctl add failed\n", __func__); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_loopback_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - struct msm_pcm_pdata *pdata; - - dev_dbg(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - - pdata = kzalloc(sizeof(struct msm_pcm_pdata), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - if (of_property_read_bool(pdev->dev.of_node, - "qcom,msm-pcm-loopback-low-latency")) - pdata->perf_mode = LOW_LATENCY_PCM_MODE; - else - pdata->perf_mode = LEGACY_PCM_MODE; - - dev_set_drvdata(&pdev->dev, pdata); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_pcm_loopback_dt_match[] = { - {.compatible = "qcom,msm-pcm-loopback"}, - {} -}; - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-loopback", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_loopback_dt_match, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_loopback_init(void) -{ - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_loopback_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM loopback platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-q6-noirq.c b/techpack/audio/asoc/msm-pcm-q6-noirq.c deleted file mode 100644 index f4561ead7e21..000000000000 --- a/techpack/audio/asoc/msm-pcm-q6-noirq.c +++ /dev/null @@ -1,1416 +0,0 @@ -/* Copyright (c) 2016-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" - -#define PCM_MASTER_VOL_MAX_STEPS 0x2000 -static const DECLARE_TLV_DB_LINEAR(msm_pcm_vol_gain, 0, - PCM_MASTER_VOL_MAX_STEPS); - -struct snd_msm { - struct snd_card *card; - struct snd_pcm *pcm; -}; - -#define CMD_EOS_MIN_TIMEOUT_LENGTH 50 -#define CMD_EOS_TIMEOUT_MULTIPLIER (HZ * 50) - -#define ATRACE_END() \ - trace_printk("tracing_mark_write: E\n") -#define ATRACE_BEGIN(name) \ - trace_printk("tracing_mark_write: B|%d|%s\n", current->tgid, name) -#define ATRACE_FUNC() ATRACE_BEGIN(__func__) -#define ATRACE_INT(name, value) \ - trace_printk("tracing_mark_write: C|%d|%s|%d\n", \ - current->tgid, name, (int)(value)) - -#define SIO_PLAYBACK_MAX_PERIOD_SIZE PLAYBACK_MAX_PERIOD_SIZE -#define SIO_PLAYBACK_MIN_PERIOD_SIZE 48 -#define SIO_PLAYBACK_MAX_NUM_PERIODS 512 -#define SIO_PLAYBACK_MIN_NUM_PERIODS PLAYBACK_MIN_NUM_PERIODS -#define SIO_PLAYBACK_MIN_BYTES (SIO_PLAYBACK_MIN_NUM_PERIODS * \ - SIO_PLAYBACK_MIN_PERIOD_SIZE) - -#define SIO_PLAYBACK_MAX_BYTES ((SIO_PLAYBACK_MAX_NUM_PERIODS) * \ - (SIO_PLAYBACK_MAX_PERIOD_SIZE)) - -#define SIO_CAPTURE_MAX_PERIOD_SIZE CAPTURE_MAX_PERIOD_SIZE -#define SIO_CAPTURE_MIN_PERIOD_SIZE 48 -#define SIO_CAPTURE_MAX_NUM_PERIODS 512 -#define SIO_CAPTURE_MIN_NUM_PERIODS CAPTURE_MIN_NUM_PERIODS - -#define SIO_CAPTURE_MIN_BYTES (SIO_CAPTURE_MIN_NUM_PERIODS * \ - SIO_CAPTURE_MIN_PERIOD_SIZE) - -#define SIO_CAPTURE_MAX_BYTES (SIO_CAPTURE_MAX_NUM_PERIODS * \ - SIO_CAPTURE_MAX_PERIOD_SIZE) - -static struct snd_pcm_hardware msm_pcm_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .rates = SNDRV_PCM_RATE_8000_192000, - .rate_min = 8000, - .rate_max = 192000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = SIO_PLAYBACK_MAX_NUM_PERIODS * - SIO_PLAYBACK_MAX_PERIOD_SIZE, - .period_bytes_min = SIO_PLAYBACK_MIN_PERIOD_SIZE, - .period_bytes_max = SIO_PLAYBACK_MAX_PERIOD_SIZE, - .periods_min = SIO_PLAYBACK_MIN_NUM_PERIODS, - .periods_max = SIO_PLAYBACK_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_pcm_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE), - .rates = SNDRV_PCM_RATE_8000_48000, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 4, - .buffer_bytes_max = SIO_CAPTURE_MAX_NUM_PERIODS * - SIO_CAPTURE_MAX_PERIOD_SIZE, - .period_bytes_min = SIO_CAPTURE_MIN_PERIOD_SIZE, - .period_bytes_max = SIO_CAPTURE_MAX_PERIOD_SIZE, - .periods_min = SIO_CAPTURE_MIN_NUM_PERIODS, - .periods_max = SIO_CAPTURE_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, - 88200, 96000, 176400, 192000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static unsigned long msm_pcm_fe_topology[MSM_FRONTEND_DAI_MAX]; - -/* default value is DTS (i.e read from device tree) */ -static char const *msm_pcm_fe_topology_text[] = { - "DTS", "ULL", "ULL_PP", "LL" }; - -static const struct soc_enum msm_pcm_fe_topology_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(msm_pcm_fe_topology_text), - msm_pcm_fe_topology_text), -}; - -static void event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - uint32_t *ptrmem = (uint32_t *)payload; - - switch (opcode) { - case ASM_DATA_EVENT_WATERMARK: - pr_debug("%s: Watermark level = 0x%08x\n", __func__, *ptrmem); - break; - case APR_BASIC_RSP_RESULT: - pr_debug("%s: Payload = [0x%x]stat[0x%x]\n", - __func__, payload[0], payload[1]); - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - case ASM_SESSION_CMD_PAUSE: - case ASM_STREAM_CMD_FLUSH: - break; - default: - break; - } - break; - default: - pr_debug("Not Supported Event opcode[0x%x]\n", opcode); - break; - } -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd; - int ret = 0; - enum apr_subsys_state q6_state; - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - prtd = kzalloc(sizeof(struct msm_audio), GFP_KERNEL); - - if (prtd == NULL) - return -ENOMEM; - - prtd->substream = substream; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - runtime->hw = msm_pcm_hardware_playback; - else - runtime->hw = msm_pcm_hardware_capture; - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret) - pr_info("snd_pcm_hw_constraint_list failed\n"); - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - SIO_PLAYBACK_MIN_BYTES, - SIO_PLAYBACK_MAX_BYTES); - if (ret) { - pr_info("%s: P buffer bytes minmax constraint ret %d\n", - __func__, ret); - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - SIO_CAPTURE_MIN_BYTES, - SIO_CAPTURE_MAX_BYTES); - if (ret) { - pr_info("%s: C buffer bytes minmax constraint ret %d\n", - __func__, ret); - } - } - - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32); - if (ret) { - pr_err("%s: Constraint for period bytes step ret = %d\n", - __func__, ret); - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32); - if (ret) { - pr_err("%s: Constraint for buffer bytes step ret = %d\n", - __func__, ret); - } - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)event_handler, prtd); - if (!prtd->audio_client) { - pr_err("%s: client alloc failed\n", __func__); - ret = -ENOMEM; - goto fail_cmd; - } - prtd->dsp_cnt = 0; - prtd->set_channel_map = false; - runtime->private_data = prtd; - return 0; - -fail_cmd: - kfree(prtd); - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) - -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct audio_buffer *buf; - struct shared_io_config config; - uint16_t sample_word_size; - uint16_t bits_per_sample; - int ret; - int dir = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? IN : OUT; - unsigned long topology; - int perf_mode; - bool use_default_chmap = true; - char *chmap = NULL; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - ret = -EINVAL; - pr_err("%s: platform data not populated ret: %d\n", __func__, - ret); - return ret; - } - - topology = msm_pcm_fe_topology[soc_prtd->dai_link->id]; - - if (!strcmp(msm_pcm_fe_topology_text[topology], "ULL_PP")) - perf_mode = ULL_POST_PROCESSING_PCM_MODE; - else if (!strcmp(msm_pcm_fe_topology_text[topology], "ULL")) - perf_mode = ULTRA_LOW_LATENCY_PCM_MODE; - else if (!strcmp(msm_pcm_fe_topology_text[topology], "LL")) - perf_mode = LOW_LATENCY_PCM_MODE; - else - /* use the default from the device tree */ - perf_mode = pdata->perf_mode; - - - /* need to set LOW_LATENCY_PCM_MODE for capture since - * push mode does not support ULL - */ - prtd->audio_client->perf_mode = (dir == IN) ? - perf_mode : - LOW_LATENCY_PCM_MODE; - - /* rate and channels are sent to audio driver */ - prtd->samp_rate = params_rate(params); - prtd->channel_mode = params_channels(params); - if (prtd->enabled) - return 0; - - if (pdata->ch_map[soc_prtd->dai_link->id]) { - use_default_chmap = - !(pdata->ch_map[soc_prtd->dai_link->id]->set_ch_map); - chmap = - pdata->ch_map[soc_prtd->dai_link->id]->channel_map; - } - - switch (runtime->format) { - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - break; - } - - config.format = FORMAT_LINEAR_PCM; - config.bits_per_sample = bits_per_sample; - config.rate = params_rate(params); - config.channels = params_channels(params); - config.sample_word_size = sample_word_size; - config.bufsz = params_buffer_bytes(params) / params_periods(params); - config.bufcnt = params_periods(params); - - ret = q6asm_open_shared_io(prtd->audio_client, &config, dir, - use_default_chmap, chmap); - if (ret) { - pr_err("%s: q6asm_open_write_shared_io failed ret: %d\n", - __func__, ret); - return ret; - } - - prtd->pcm_size = params_buffer_bytes(params); - prtd->pcm_count = params_buffer_bytes(params); - prtd->pcm_irq_pos = 0; - - buf = prtd->audio_client->port[dir].buf; - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf->data; - dma_buf->addr = buf->phys; - dma_buf->bytes = prtd->pcm_size; - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - pr_debug("%s: session ID %d, perf %d\n", __func__, - prtd->audio_client->session, - prtd->audio_client->perf_mode); - prtd->session_id = prtd->audio_client->session; - - pr_debug("msm_pcm_routing_reg_phy_stream w/ id %d\n", - soc_prtd->dai_link->id); - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream); - - if (ret) { - pr_err("%s: stream reg failed ret:%d\n", __func__, ret); - return ret; - } - - atomic_set(&prtd->out_count, runtime->periods); - prtd->enabled = 1; - prtd->cmd_pending = 0; - prtd->cmd_interrupt = 0; - - return 0; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - int dir = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? 0 : 1; - struct audio_buffer *buf; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: %s Trigger start\n", __func__, - dir == 0 ? "P" : "C"); - ret = q6asm_run(prtd->audio_client, 0, 0, 0); - if (ret) - break; - atomic_set(&prtd->start, 1); - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("%s: SNDRV_PCM_TRIGGER_STOP\n", __func__); - atomic_set(&prtd->start, 0); - q6asm_cmd(prtd->audio_client, CMD_PAUSE); - q6asm_cmd(prtd->audio_client, CMD_FLUSH); - buf = q6asm_shared_io_buf(prtd->audio_client, dir); - if (buf == NULL) { - pr_err("%s: shared IO buffer is null\n", __func__); - ret = -EINVAL; - break; - } - memset(buf->data, 0, buf->actual_size); - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("%s: SNDRV_PCM_TRIGGER_PAUSE\n", __func__); - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->start, 0); - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - - -static int msm_pcm_mmap_fd(struct snd_pcm_substream *substream, - struct snd_pcm_mmap_fd *mmap_fd) -{ - struct msm_audio *prtd; - struct audio_port_data *apd; - struct audio_buffer *ab; - int dir = -1; - struct dma_buf *buf = NULL; - int rc = 0; - - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return -EFAULT; - } - - prtd = substream->runtime->private_data; - if (!prtd || !prtd->audio_client || !prtd->mmap_flag) { - pr_err("%s no audio client or not an mmap session\n", __func__); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - - apd = prtd->audio_client->port; - ab = &(apd[dir].buf[0]); - /* - * Passing O_CLOEXEC as flag passed to fd, to be in sync with - * previous implimentation. - * This was the flag used by previous internal wrapper API, which - * used to call dma_buf_fd internally. - */ - mmap_fd->fd = dma_buf_fd(ab->dma_buf, O_CLOEXEC); - if (mmap_fd->fd < 0) { - pr_err("%s: dma_buf_fd failed, fd:%d\n", - __func__, mmap_fd->fd); - rc = -EFAULT; - goto buf_fd_fail; - } - mmap_fd->dir = dir; - mmap_fd->actual_size = ab->actual_size; - mmap_fd->size = ab->size; - - buf = dma_buf_get(mmap_fd->fd); - if (IS_ERR_OR_NULL(buf)) { - pr_err("%s: dma_buf_get failed, fd:%d\n", - __func__, mmap_fd->fd); - rc = -EINVAL; - } - -buf_fd_fail: - return rc; -} - -static int msm_pcm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - int dir = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? 0 : 1; - struct audio_buffer *buf; - - switch (cmd) { - case SNDRV_PCM_IOCTL1_RESET: - pr_debug("%s: %s SNDRV_PCM_IOCTL1_RESET\n", __func__, - dir == 0 ? "P" : "C"); - buf = q6asm_shared_io_buf(prtd->audio_client, dir); - - if (buf && buf->data) - memset(buf->data, 0, buf->actual_size); - break; - default: - break; - } - - return snd_pcm_lib_ioctl(substream, cmd, arg); -} - -#ifdef CONFIG_COMPAT -static int msm_pcm_compat_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - /* we only handle RESET which is common for both modes */ - return msm_pcm_ioctl(substream, cmd, arg); -} -#endif - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - uint32_t read_index, wall_clk_msw, wall_clk_lsw; - /*these are offsets, unlike ASoC's full values*/ - snd_pcm_sframes_t hw_ptr; - snd_pcm_sframes_t period_size; - int ret; - int retries = 10; - struct msm_audio *prtd = runtime->private_data; - - period_size = runtime->period_size; - - do { - ret = q6asm_get_shared_pos(prtd->audio_client, - &read_index, &wall_clk_msw, - &wall_clk_lsw); - } while (ret == -EAGAIN && --retries); - - if (ret || !period_size) { - pr_err("get_shared_pos error or zero period size\n"); - return 0; - } - - hw_ptr = bytes_to_frames(substream->runtime, - read_index); - - if (runtime->control->appl_ptr == 0) { - pr_debug("ptr(%s): appl(0), hw = %lu read_index = %u\n", - prtd->substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - "P" : "C", - hw_ptr, read_index); - } - return (hw_ptr/period_size) * period_size; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - return -EINVAL; -} - -static int msm_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - struct audio_port_data *apd = ac->port; - struct audio_buffer *ab; - int dir = -1; - int ret; - - pr_debug("%s: mmap begin\n", __func__); - prtd->mmap_flag = 1; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - - ab = &(apd[dir].buf[0]); - - ret = msm_audio_ion_mmap(ab, vma); - - if (ret) - prtd->mmap_flag = 0; - - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int rc = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - if (!prtd || !prtd->mmap_flag) - return -EIO; - - if (prtd->audio_client) { - rc = q6asm_set_softvolume_v2(prtd->audio_client, - &softvol, SOFT_VOLUME_INSTANCE_1); - if (rc < 0) - pr_err("%s: Send SoftVolume command failed rc=%d\n", - __func__, rc); - } - return rc; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - struct msm_plat_data *pdata = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - uint32_t timeout; - int dir = 0; - int ret = 0; - - if (!soc_prtd) { - pr_debug("%s private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - - mutex_lock(&pdata->lock); - if (ac) { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - dir = OUT; - - /* determine timeout length */ - if (runtime->frame_bits == 0 || runtime->rate == 0) { - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } else { - timeout = (runtime->period_size * - CMD_EOS_TIMEOUT_MULTIPLIER) / - ((runtime->frame_bits / 8) * - runtime->rate); - if (timeout < CMD_EOS_MIN_TIMEOUT_LENGTH) - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } - - q6asm_cmd(ac, CMD_CLOSE); - - ret = q6asm_shared_io_free(ac, dir); - - if (ret) { - pr_err("%s: Failed to close pull mode, ret %d\n", - __func__, ret); - } - q6asm_audio_client_free(ac); - } - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - dir == IN ? - SNDRV_PCM_STREAM_PLAYBACK : - SNDRV_PCM_STREAM_CAPTURE); - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_pcm_set_volume(struct msm_audio *prtd, uint32_t volume) -{ - int rc = 0; - - if (prtd && prtd->audio_client) { - pr_debug("%s: channels %d volume 0x%x\n", __func__, - prtd->channel_mode, volume); - rc = q6asm_set_volume(prtd->audio_client, volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - } - } - return rc; -} - -static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = NULL; - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_audio *prtd; - - pr_debug("%s\n", __func__); - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -ENODEV; - } - soc_prtd = substream->private_data; - if (!substream->runtime || !soc_prtd) { - pr_debug("%s substream runtime or private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->volume; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = NULL; - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_audio *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : 0x%x\n", __func__, volume); - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -ENODEV; - } - soc_prtd = substream->private_data; - if (!substream->runtime || !soc_prtd) { - pr_err("%s substream runtime or private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - rc = msm_pcm_set_volume(prtd, volume); - prtd->volume = volume; - } - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_pcm_add_volume_control(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - - dev_dbg(rtd->dev, "%s, Volume control add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, rtd->dai_link->id, - &volume_info); - if (ret < 0) { - pr_err("%s volume control failed ret %d\n", __func__, ret); - return ret; - } - kctl = volume_info->kctl; - kctl->put = msm_pcm_volume_ctl_put; - kctl->get = msm_pcm_volume_ctl_get; - kctl->tlv.p = msm_pcm_vol_gain; - return 0; -} - -static int msm_pcm_channel_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *pcm = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_plat_data *pdata = (struct msm_plat_data *) - snd_soc_component_get_drvdata(pcm); - int rc = 0, i = 0; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - - if (pdata->ch_map[fe_id]) { - pdata->ch_map[fe_id]->set_ch_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL; i++) - pdata->ch_map[fe_id]->channel_map[i] = - (char)(ucontrol->value.integer.value[i]); - } else { - pr_debug("%s: no memory for ch_map, default will be set\n", - __func__); - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_pcm_channel_map_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 8; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_pcm_channel_map_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *pcm = snd_kcontrol_chip(kcontrol); - u64 fe_id = kcontrol->private_value; - struct msm_plat_data *pdata = (struct msm_plat_data *) - snd_soc_component_get_drvdata(pcm); - int rc = 0, i = 0; - - pr_debug("%s: fe_id- %llu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s: Received out of bounds fe_id %llu\n", - __func__, fe_id); - rc = -EINVAL; - goto end; - } - if (pdata->ch_map[fe_id]) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL; i++) - ucontrol->value.integer.value[i] = - pdata->ch_map[fe_id]->channel_map[i]; - } -end: - pr_debug("%s: ret %d\n", __func__, rc); - return rc; -} - -static int msm_pcm_add_channel_map_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Channel Map"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - struct msm_plat_data *pdata = NULL; - int ctl_len = 0; - struct snd_kcontrol_new fe_channel_map_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_channel_map_info, - .get = msm_pcm_channel_map_get, - .put = msm_pcm_channel_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: NULL rtd\n", __func__); - return -EINVAL; - } - - pr_debug("%s: added new pcm FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s%d", mixer_ctl_name, rtd->pcm->device); - - fe_channel_map_control[0].name = mixer_str; - fe_channel_map_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_channel_map_control, - ARRAY_SIZE(fe_channel_map_control)); - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pdata->ch_map[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_pcm_ch_map), GFP_KERNEL); - if (!pdata->ch_map[rtd->dai_link->id]) { - pr_err("%s: Could not allocate memory for channel map\n", - __func__); - kfree(mixer_str); - return -ENOMEM; - } - kfree(mixer_str); - return 0; -} - -static int msm_pcm_fe_topology_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - const struct soc_enum *e = &msm_pcm_fe_topology_enum[0]; - - return snd_ctl_enum_info(uinfo, 1, e->items, e->texts); -} - -static int msm_pcm_fe_topology_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned long fe_id = kcontrol->private_value; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: %lu topology %s\n", __func__, fe_id, - msm_pcm_fe_topology_text[msm_pcm_fe_topology[fe_id]]); - ucontrol->value.enumerated.item[0] = msm_pcm_fe_topology[fe_id]; - return 0; -} - -static int msm_pcm_fe_topology_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned long fe_id = kcontrol->private_value; - unsigned int item; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - item = ucontrol->value.enumerated.item[0]; - if (item >= ARRAY_SIZE(msm_pcm_fe_topology_text)) { - pr_err("%s Received out of bound topology %lu\n", __func__, - fe_id); - return -EINVAL; - } - - pr_debug("%s: %lu new topology %s\n", __func__, fe_id, - msm_pcm_fe_topology_text[item]); - msm_pcm_fe_topology[fe_id] = item; - return 0; -} - -static int msm_pcm_add_fe_topology_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "PCM_Dev"; - const char *deviceNo = "NN"; - const char *topo_text = "Topology"; - char *mixer_str = NULL; - int ctl_len; - int ret; - struct snd_kcontrol_new topology_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "?", - .info = msm_pcm_fe_topology_info, - .get = msm_pcm_fe_topology_get, - .put = msm_pcm_fe_topology_put, - .private_value = 0, - }, - }; - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 + - strlen(topo_text) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name, - rtd->pcm->device, topo_text); - - topology_control[0].name = mixer_str; - topology_control[0].private_value = rtd->dai_link->id; - ret = snd_soc_add_platform_controls(rtd->platform, topology_control, - ARRAY_SIZE(topology_control)); - msm_pcm_fe_topology[rtd->dai_link->id] = 0; - kfree(mixer_str); - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ctl_len = strlen(playback_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + - strlen(suffix) + 1; - pr_debug("%s: Playback app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: playback app type cntrl add failed, err: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_playback_app_type_cfg_ctl_put; - kctl->get = msm_pcm_playback_app_type_cfg_ctl_get; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ctl_len = strlen(capture_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Capture app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: capture app type cntrl add failed, err: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_capture_app_type_cfg_ctl_put; - kctl->get = msm_pcm_capture_app_type_cfg_ctl_get; - } - - return 0; -} - -static int msm_pcm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - int ret = 0; - struct snd_pcm *pcm = hw->private_data; - struct snd_pcm_mmap_fd __user *_mmap_fd = NULL; - struct snd_pcm_mmap_fd mmap_fd; - struct snd_pcm_substream *substream = NULL; - int32_t dir = -1; - - switch (cmd) { - case SNDRV_PCM_IOCTL_MMAP_DATA_FD: - _mmap_fd = (struct snd_pcm_mmap_fd __user *)arg; - if (get_user(dir, (int32_t __user *)&(_mmap_fd->dir))) { - pr_err("%s: error copying mmap_fd from user\n", - __func__); - ret = -EFAULT; - break; - } - if (dir != OUT && dir != IN) { - pr_err("%s invalid stream dir\n", __func__); - ret = -EINVAL; - break; - } - substream = pcm->streams[dir].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - ret = -ENODEV; - break; - } - pr_debug("%s : %s MMAP Data fd\n", __func__, - dir == 0 ? "P" : "C"); - if (msm_pcm_mmap_fd(substream, &mmap_fd) < 0) { - pr_err("%s: error getting fd\n", - __func__); - ret = -EFAULT; - break; - } - if (put_user(mmap_fd.fd, &_mmap_fd->fd) || - put_user(mmap_fd.size, &_mmap_fd->size) || - put_user(mmap_fd.actual_size, &_mmap_fd->actual_size)) { - pr_err("%s: error copying fd\n", __func__); - return -EFAULT; - } - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - -#ifdef CONFIG_COMPAT -static int msm_pcm_hwdep_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - unsigned int cmd, - unsigned long arg) -{ - /* we only support mmap fd. Handling is common in both modes */ - return msm_pcm_hwdep_ioctl(hw, file, cmd, arg); -} -#else -static int msm_pcm_hwdep_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - unsigned int cmd, - unsigned long arg) -{ - return -EINVAL; -} -#endif - -static int msm_pcm_add_hwdep_dev(struct snd_soc_pcm_runtime *runtime) -{ - struct snd_hwdep *hwdep; - int rc; - char id[] = "NOIRQ_NN"; - - snprintf(id, sizeof(id), "NOIRQ_%d", runtime->pcm->device); - pr_debug("%s: pcm dev %d\n", __func__, runtime->pcm->device); - rc = snd_hwdep_new(runtime->card->snd_card, - &id[0], - HWDEP_FE_BASE + runtime->pcm->device, - &hwdep); - if (!hwdep || rc < 0) { - pr_err("%s: hwdep intf failed to create %s - hwdep\n", __func__, - id); - return rc; - } - - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_BE; /* for lack of a FE iface */ - hwdep->private_data = runtime->pcm; /* of type struct snd_pcm */ - hwdep->ops.ioctl = msm_pcm_hwdep_ioctl; - hwdep->ops.ioctl_compat = msm_pcm_hwdep_compat_ioctl; - return 0; -} - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - struct snd_pcm *pcm = rtd->pcm; - int ret; - - pr_debug("%s , register new control\n", __func__); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_pcm_add_channel_map_control(rtd); - if (ret) - pr_err("%s: Could not add pcm Channel Map Control\n", - __func__); - - ret = msm_pcm_add_volume_control(rtd); - if (ret) { - pr_err("%s: Could not add pcm Volume Control %d\n", - __func__, ret); - } - - ret = msm_pcm_add_fe_topology_control(rtd); - if (ret) { - pr_err("%s: Could not add pcm topology control %d\n", - __func__, ret); - } - - ret = msm_pcm_add_app_type_controls(rtd); - if (ret) { - pr_err("%s: Could not add app type controls failed %d\n", - __func__, ret); - } - ret = msm_pcm_add_hwdep_dev(rtd); - if (ret) - pr_err("%s: Could not add hw dep node\n", __func__); - pcm->nonatomic = true; - - return ret; -} - - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .prepare = msm_pcm_prepare, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .ioctl = msm_pcm_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = msm_pcm_compat_ioctl, -#endif - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .mmap = msm_pcm_mmap, - .close = msm_pcm_close, -}; - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - struct msm_plat_data *pdata; - const char *latency_level; - int perf_mode = LOW_LATENCY_PCM_MODE; - - dev_dbg(&pdev->dev, "Pull mode driver probe\n"); - - if (of_property_read_bool(pdev->dev.of_node, - "qcom,msm-pcm-low-latency")) { - - rc = of_property_read_string(pdev->dev.of_node, - "qcom,latency-level", &latency_level); - if (!rc) { - if (!strcmp(latency_level, "ultra")) - perf_mode = ULTRA_LOW_LATENCY_PCM_MODE; - else if (!strcmp(latency_level, "ull-pp")) - perf_mode = ULL_POST_PROCESSING_PCM_MODE; - } - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_plat_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - pdata->perf_mode = perf_mode; - - mutex_init(&pdata->lock); - - dev_set_drvdata(&pdev->dev, pdata); - - dev_dbg(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - dev_dbg(&pdev->dev, "Pull mode driver register\n"); - rc = snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); - - if (rc) - dev_err(&pdev->dev, "Failed to register pull mode driver\n"); - - return rc; -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - struct msm_plat_data *pdata; - - dev_dbg(&pdev->dev, "Pull mode remove\n"); - pdata = dev_get_drvdata(&pdev->dev); - mutex_destroy(&pdata->lock); - devm_kfree(&pdev->dev, pdata); - snd_soc_unregister_platform(&pdev->dev); - return 0; -} -static const struct of_device_id msm_pcm_noirq_dt_match[] = { - {.compatible = "qcom,msm-pcm-dsp-noirq"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_noirq_dt_match); - -static struct platform_driver msm_pcm_driver_noirq = { - .driver = { - .name = "msm-pcm-dsp-noirq", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_noirq_dt_match, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_noirq_init(void) -{ - return platform_driver_register(&msm_pcm_driver_noirq); -} - -void msm_pcm_noirq_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver_noirq); -} - -MODULE_DESCRIPTION("PCM NOIRQ module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-q6-v2.c b/techpack/audio/asoc/msm-pcm-q6-v2.c deleted file mode 100644 index 7210fa3a18a3..000000000000 --- a/techpack/audio/asoc/msm-pcm-q6-v2.c +++ /dev/null @@ -1,2259 +0,0 @@ -/* Copyright (c) 2012-2020 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" -#include "msm-qti-pp-config.h" - -#define TIMEOUT_MS 1000 - -enum stream_state { - IDLE = 0, - STOPPED, - RUNNING, -}; - -static struct audio_locks the_locks; - -#define PCM_MASTER_VOL_MAX_STEPS 0x2000 -static const DECLARE_TLV_DB_LINEAR(msm_pcm_vol_gain, 0, - PCM_MASTER_VOL_MAX_STEPS); - -struct snd_msm { - struct snd_card *card; - struct snd_pcm *pcm; -}; - -#define CMD_EOS_MIN_TIMEOUT_LENGTH 50 -#define CMD_EOS_TIMEOUT_MULTIPLIER (HZ * 50) -#define MAX_PB_COPY_RETRIES 3 - -static struct snd_pcm_hardware msm_pcm_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .rates = SNDRV_PCM_RATE_8000_384000, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 4, - .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * - CAPTURE_MAX_PERIOD_SIZE, - .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE, - .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE, - .periods_min = CAPTURE_MIN_NUM_PERIODS, - .periods_max = CAPTURE_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_pcm_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = (SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_S24_3LE | - SNDRV_PCM_FMTBIT_S32_LE), - .rates = SNDRV_PCM_RATE_8000_384000, - .rate_min = 8000, - .rate_max = 384000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = PLAYBACK_MAX_NUM_PERIODS * - PLAYBACK_MAX_PERIOD_SIZE, - .period_bytes_min = PLAYBACK_MIN_PERIOD_SIZE, - .period_bytes_max = PLAYBACK_MAX_PERIOD_SIZE, - .periods_min = PLAYBACK_MIN_NUM_PERIODS, - .periods_max = PLAYBACK_MAX_NUM_PERIODS, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, - 88200, 96000, 176400, 192000, 352800, 384000 -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static void msm_pcm_route_event_handler(enum msm_pcm_routing_event event, - void *priv_data) -{ - struct msm_audio *prtd = priv_data; - - WARN_ON(!prtd); - - pr_debug("%s: event %x\n", __func__, event); - - switch (event) { - case MSM_PCM_RT_EVT_BUF_RECFG: - q6asm_cmd(prtd->audio_client, CMD_PAUSE); - q6asm_cmd(prtd->audio_client, CMD_FLUSH); - q6asm_run(prtd->audio_client, 0, 0, 0); - /* fallthrough */ - default: - break; - } -} - -static void event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct msm_audio *prtd = priv; - struct snd_pcm_substream *substream = prtd->substream; - uint32_t *ptrmem = (uint32_t *)payload; - uint32_t idx = 0; - uint32_t size = 0; - uint8_t buf_index; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: { - pr_debug("ASM_DATA_EVENT_WRITE_DONE_V2\n"); - pr_debug("Buffer Consumed = 0x%08x\n", *ptrmem); - prtd->pcm_irq_pos += prtd->pcm_count; - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - atomic_inc(&prtd->out_count); - wake_up(&the_locks.write_wait); - if (!atomic_read(&prtd->start)) - break; - if (!prtd->mmap_flag || prtd->reset_event) - break; - if (q6asm_is_cpu_buf_avail_nolock(IN, - prtd->audio_client, - &size, &idx)) { - pr_debug("%s:writing %d bytes of buffer to dsp 2\n", - __func__, prtd->pcm_count); - q6asm_write_nolock(prtd->audio_client, - prtd->pcm_count, 0, 0, NO_TIMESTAMP); - } - break; - } - case ASM_DATA_EVENT_RENDERED_EOS: - pr_debug("ASM_DATA_EVENT_RENDERED_EOS\n"); - clear_bit(CMD_EOS, &prtd->cmd_pending); - wake_up(&the_locks.eos_wait); - break; - case ASM_DATA_EVENT_READ_DONE_V2: { - pr_debug("ASM_DATA_EVENT_READ_DONE_V2\n"); - buf_index = q6asm_get_buf_index_from_token(token); - if (buf_index >= CAPTURE_MAX_NUM_PERIODS) { - pr_err("%s: buffer index %u is out of range.\n", - __func__, buf_index); - return; - } - pr_debug("%s: token=0x%08x buf_index=0x%08x\n", - __func__, token, buf_index); - prtd->in_frame_info[buf_index].size = payload[4]; - prtd->in_frame_info[buf_index].offset = payload[5]; - /* assume data size = 0 during flushing */ - if (prtd->in_frame_info[buf_index].size) { - prtd->pcm_irq_pos += - prtd->in_frame_info[buf_index].size; - pr_debug("pcm_irq_pos=%d\n", prtd->pcm_irq_pos); - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - if (atomic_read(&prtd->in_count) <= prtd->periods) - atomic_inc(&prtd->in_count); - wake_up(&the_locks.read_wait); - if (prtd->mmap_flag && - q6asm_is_cpu_buf_avail_nolock(OUT, - prtd->audio_client, - &size, &idx) && - (substream->runtime->status->state == - SNDRV_PCM_STATE_RUNNING)) - q6asm_read_nolock(prtd->audio_client); - } else { - pr_debug("%s: reclaim flushed buf in_count %x\n", - __func__, atomic_read(&prtd->in_count)); - prtd->pcm_irq_pos += prtd->pcm_count; - if (prtd->mmap_flag) { - if (q6asm_is_cpu_buf_avail_nolock(OUT, - prtd->audio_client, - &size, &idx) && - (substream->runtime->status->state == - SNDRV_PCM_STATE_RUNNING)) - q6asm_read_nolock(prtd->audio_client); - } else { - atomic_inc(&prtd->in_count); - } - if (atomic_read(&prtd->in_count) == prtd->periods) { - pr_info("%s: reclaimed all bufs\n", __func__); - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - wake_up(&the_locks.read_wait); - } - } - break; - } - case ASM_STREAM_PP_EVENT: - case ASM_STREAM_CMD_ENCDEC_EVENTS: { - pr_debug("%s: ASM_STREAM_EVENT (0x%x)\n", __func__, opcode); - if (!substream) { - pr_err("%s: substream is NULL.\n", __func__); - return; - } - - rtd = substream->private_data; - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return; - } - - ret = msm_adsp_inform_mixer_ctl(rtd, payload); - if (ret) { - pr_err("%s: failed to inform mixer ctl. err = %d\n", - __func__, ret); - return; - } - - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - if (substream->stream - != SNDRV_PCM_STREAM_PLAYBACK) { - atomic_set(&prtd->start, 1); - break; - } - if (prtd->mmap_flag) { - pr_debug("%s:writing %d bytes of buffer to dsp\n", - __func__, - prtd->pcm_count); - q6asm_write_nolock(prtd->audio_client, - prtd->pcm_count, - 0, 0, NO_TIMESTAMP); - } else { - while (atomic_read(&prtd->out_needed)) { - pr_debug("%s:writing %d bytes of buffer to dsp\n", - __func__, - prtd->pcm_count); - q6asm_write_nolock(prtd->audio_client, - prtd->pcm_count, - 0, 0, NO_TIMESTAMP); - atomic_dec(&prtd->out_needed); - wake_up(&the_locks.write_wait); - }; - } - atomic_set(&prtd->start, 1); - break; - case ASM_STREAM_CMD_REGISTER_PP_EVENTS: - pr_debug("%s: ASM_STREAM_CMD_REGISTER_PP_EVENTS:", - __func__); - break; - default: - pr_debug("%s:Payload = [0x%x]stat[0x%x]\n", - __func__, payload[0], payload[1]); - break; - } - } - break; - case RESET_EVENTS: - pr_debug("%s RESET_EVENTS\n", __func__); - prtd->pcm_irq_pos += prtd->pcm_count; - atomic_inc(&prtd->out_count); - atomic_inc(&prtd->in_count); - prtd->reset_event = true; - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - wake_up(&the_locks.eos_wait); - wake_up(&the_locks.write_wait); - wake_up(&the_locks.read_wait); - break; - default: - pr_debug("Not Supported Event opcode[0x%x]\n", opcode); - break; - } -} - -static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - struct snd_pcm_hw_params *params; - int ret; - uint32_t fmt_type = FORMAT_LINEAR_PCM; - uint16_t bits_per_sample; - uint16_t sample_word_size; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - if (!prtd || !prtd->audio_client) { - pr_err("%s: private data null or audio client freed\n", - __func__); - return -EINVAL; - } - params = &soc_prtd->dpcm[substream->stream].hw_params; - - pr_debug("%s\n", __func__); - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - if (prtd->enabled) - return 0; - - prtd->audio_client->perf_mode = pdata->perf_mode; - pr_debug("%s: perf: %x\n", __func__, pdata->perf_mode); - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S32_LE: - bits_per_sample = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - break; - } - if (prtd->compress_enable) { - fmt_type = FORMAT_GEN_COMPR; - pr_debug("%s: Compressed enabled!\n", __func__); - ret = q6asm_open_write_compressed(prtd->audio_client, fmt_type, - COMPRESSED_PASSTHROUGH_GEN); - if (ret < 0) { - pr_err("%s: q6asm_open_write_compressed failed (%d)\n", - __func__, ret); - q6asm_audio_client_free(prtd->audio_client); - prtd->audio_client = NULL; - return -ENOMEM; - } - } else { - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) && - q6core_use_Q6_32ch_support()) - ret = q6asm_open_write_v5(prtd->audio_client, - fmt_type, bits_per_sample); - else - ret = q6asm_open_write_v4(prtd->audio_client, - fmt_type, bits_per_sample); - - if (ret < 0) { - pr_err("%s: q6asm_open_write failed (%d)\n", - __func__, ret); - q6asm_audio_client_free(prtd->audio_client); - prtd->audio_client = NULL; - return -ENOMEM; - } - - ret = q6asm_send_cal(prtd->audio_client); - if (ret < 0) - pr_debug("%s : Send cal failed : %d", __func__, ret); - } - pr_debug("%s: session ID %d\n", __func__, - prtd->audio_client->session); - prtd->session_id = prtd->audio_client->session; - - if (prtd->compress_enable) { - ret = msm_pcm_routing_reg_phy_compr_stream( - soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, - SNDRV_PCM_STREAM_PLAYBACK, - COMPRESSED_PASSTHROUGH_GEN); - } else { - ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream); - } - if (ret) { - pr_err("%s: stream reg failed ret:%d\n", __func__, ret); - return ret; - } - if (prtd->compress_enable) { - ret = q6asm_media_format_block_gen_compr( - prtd->audio_client, runtime->rate, - runtime->channels, !prtd->set_channel_map, - prtd->channel_map, bits_per_sample); - } else { - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) && - q6core_use_Q6_32ch_support()) { - - ret = q6asm_media_format_block_multi_ch_pcm_v5( - prtd->audio_client, runtime->rate, - runtime->channels, !prtd->set_channel_map, - prtd->channel_map, bits_per_sample, - sample_word_size, ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } else { - ret = q6asm_media_format_block_multi_ch_pcm_v4( - prtd->audio_client, runtime->rate, - runtime->channels, !prtd->set_channel_map, - prtd->channel_map, bits_per_sample, - sample_word_size, ASM_LITTLE_ENDIAN, - DEFAULT_QF); - } - } - if (ret < 0) - pr_info("%s: CMD Format block failed\n", __func__); - - atomic_set(&prtd->out_count, runtime->periods); - - prtd->enabled = 1; - prtd->cmd_pending = 0; - prtd->cmd_interrupt = 0; - - return 0; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_plat_data *pdata; - struct snd_pcm_hw_params *params; - struct msm_pcm_routing_evt event; - int ret = 0; - int i = 0; - uint16_t bits_per_sample = 16; - uint16_t sample_word_size; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - if (!prtd || !prtd->audio_client) { - pr_err("%s: private data null or audio client freed\n", - __func__); - return -EINVAL; - } - - if (prtd->enabled == IDLE) { - pr_debug("%s:perf_mode=%d periods=%d\n", __func__, - pdata->perf_mode, runtime->periods); - params = &soc_prtd->dpcm[substream->stream].hw_params; - if ((params_format(params) == SNDRV_PCM_FORMAT_S24_LE) || - (params_format(params) == SNDRV_PCM_FORMAT_S24_3LE)) - bits_per_sample = 24; - else if (params_format(params) == SNDRV_PCM_FORMAT_S32_LE) - bits_per_sample = 32; - - /* ULL mode is not supported in capture path */ - if (pdata->perf_mode == LEGACY_PCM_MODE) - prtd->audio_client->perf_mode = LEGACY_PCM_MODE; - else - prtd->audio_client->perf_mode = LOW_LATENCY_PCM_MODE; - - pr_debug("%s Opening %d-ch PCM read stream, perf_mode %d\n", - __func__, params_channels(params), - prtd->audio_client->perf_mode); - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) && - q6core_use_Q6_32ch_support()) - ret = q6asm_open_read_v5(prtd->audio_client, - FORMAT_LINEAR_PCM, - bits_per_sample, false, ENC_CFG_ID_NONE); - else - ret = q6asm_open_read_v4(prtd->audio_client, - FORMAT_LINEAR_PCM, - bits_per_sample, false, ENC_CFG_ID_NONE); - if (ret < 0) { - pr_err("%s: q6asm_open_read failed\n", __func__); - q6asm_audio_client_free(prtd->audio_client); - prtd->audio_client = NULL; - return -ENOMEM; - } - - ret = q6asm_send_cal(prtd->audio_client); - if (ret < 0) - pr_debug("%s : Send cal failed : %d", __func__, ret); - - pr_debug("%s: session ID %d\n", - __func__, prtd->audio_client->session); - prtd->session_id = prtd->audio_client->session; - event.event_func = msm_pcm_route_event_handler; - event.priv_data = (void *) prtd; - ret = msm_pcm_routing_reg_phy_stream_v2( - soc_prtd->dai_link->id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream, - event); - if (ret) { - pr_err("%s: stream reg failed ret:%d\n", __func__, ret); - return ret; - } - } - - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - - if (prtd->enabled == IDLE || prtd->enabled == STOPPED) { - for (i = 0; i < runtime->periods; i++) - q6asm_read(prtd->audio_client); - prtd->periods = runtime->periods; - } - - if (prtd->enabled != IDLE) - return 0; - - switch (runtime->format) { - case SNDRV_PCM_FORMAT_S32_LE: - bits_per_sample = 32; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bits_per_sample = 24; - sample_word_size = 32; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bits_per_sample = 24; - sample_word_size = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bits_per_sample = 16; - sample_word_size = 16; - break; - } - - pr_debug("%s: Samp_rate = %d Channel = %d bit width = %d, word size = %d\n", - __func__, prtd->samp_rate, prtd->channel_mode, - bits_per_sample, sample_word_size); - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >= - ADSP_ASM_API_VERSION_V2) && - q6core_use_Q6_32ch_support()) - ret = q6asm_enc_cfg_blk_pcm_format_support_v5( - prtd->audio_client, - prtd->samp_rate, - prtd->channel_mode, - bits_per_sample, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - else - ret = q6asm_enc_cfg_blk_pcm_format_support_v4( - prtd->audio_client, - prtd->samp_rate, - prtd->channel_mode, - bits_per_sample, - sample_word_size, - ASM_LITTLE_ENDIAN, - DEFAULT_QF); - - if (ret < 0) - pr_debug("%s: cmd cfg pcm was block failed", __func__); - - prtd->enabled = RUNNING; - - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - if (prtd->qtime_lsw) { - pr_debug("%s: Trigger start at msw: %u, lsw: %u msec", - __func__, prtd->qtime_msw, prtd->qtime_lsw); - ret = q6asm_run_nowait(prtd->audio_client, 1, - prtd->qtime_msw, prtd->qtime_lsw); - prtd->qtime_lsw = 0; - prtd->qtime_msw = 0; - } else { - pr_debug("%s: Trigger start\n", __func__); - ret = q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - } - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - atomic_set(&prtd->start, 0); - if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) { - prtd->enabled = STOPPED; - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - break; - } - /* pending CMD_EOS isn't expected */ - WARN_ON_ONCE(test_bit(CMD_EOS, &prtd->cmd_pending)); - set_bit(CMD_EOS, &prtd->cmd_pending); - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_EOS); - if (ret) - clear_bit(CMD_EOS, &prtd->cmd_pending); - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE\n"); - ret = q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->start, 0); - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd; - struct msm_plat_data *pdata; - enum apr_subsys_state q6_state; - int ret = 0; - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data not populated\n", __func__); - return -EINVAL; - } - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - prtd = kzalloc(sizeof(struct msm_audio), GFP_KERNEL); - if (prtd == NULL) - return -ENOMEM; - - prtd->substream = substream; - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)event_handler, prtd); - if (!prtd->audio_client) { - pr_info("%s: Could not allocate memory\n", __func__); - kfree(prtd); - return -ENOMEM; - } - - prtd->audio_client->dev = soc_prtd->platform->dev; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - runtime->hw = msm_pcm_hardware_playback; - - /* Capture path */ - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - runtime->hw = msm_pcm_hardware_capture; - else { - pr_err("Invalid Stream type %d\n", substream->stream); - return -EINVAL; - } - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_list failed\n"); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_SIZE, - PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE); - if (ret < 0) { - pr_err("constraint for buffer bytes min max ret = %d\n", - ret); - } - } - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_pcm_hw_constraint_minmax(runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - CAPTURE_MIN_NUM_PERIODS * CAPTURE_MIN_PERIOD_SIZE, - CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE); - if (ret < 0) { - pr_err("constraint for buffer bytes min max ret = %d\n", - ret); - } - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32); - if (ret < 0) { - pr_err("constraint for period bytes step ret = %d\n", - ret); - } - ret = snd_pcm_hw_constraint_step(runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32); - if (ret < 0) { - pr_err("constraint for buffer bytes step ret = %d\n", - ret); - } - - prtd->enabled = IDLE; - prtd->dsp_cnt = 0; - prtd->set_channel_map = false; - prtd->reset_event = false; - runtime->private_data = prtd; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - msm_adsp_init_mixer_ctl_pp_event_queue(soc_prtd); - - /* Vote to update the Rx thread priority to RT Thread for playback */ - if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) && - (pdata->perf_mode == LOW_LATENCY_PCM_MODE)) - apr_start_rx_rt(prtd->audio_client->apr); - - return 0; -} - -static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - int xfer = 0; - char *bufptr = NULL; - void *data = NULL; - uint32_t idx = 0; - uint32_t size = 0; - uint32_t retries = 0; - - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - - pr_debug("%s: prtd->out_count = %d\n", - __func__, atomic_read(&prtd->out_count)); - - while ((fbytes > 0) && (retries < MAX_PB_COPY_RETRIES)) { - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET before wait\n", - __func__); - return -ENETRESET; - } - - ret = wait_event_timeout(the_locks.write_wait, - (atomic_read(&prtd->out_count)), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event_timeout failed\n", __func__); - ret = -ETIMEDOUT; - goto fail; - } - ret = 0; - - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET after wait\n", - __func__); - return -ENETRESET; - } - - if (!atomic_read(&prtd->out_count)) { - pr_err("%s: pcm stopped out_count 0\n", __func__); - return 0; - } - - data = q6asm_is_cpu_buf_avail(IN, prtd->audio_client, &size, - &idx); - if (data == NULL) { - retries++; - continue; - } else { - retries = 0; - } - - if (fbytes > size) - xfer = size; - else - xfer = fbytes; - - bufptr = data; - if (bufptr) { - pr_debug("%s:fbytes =%lu: xfer=%d size=%d\n", - __func__, fbytes, xfer, size); - if (copy_from_user(bufptr, buf, xfer)) { - ret = -EFAULT; - pr_err("%s: copy_from_user failed\n", - __func__); - q6asm_cpu_buf_release(IN, prtd->audio_client); - goto fail; - } - buf += xfer; - fbytes -= xfer; - pr_debug("%s:fbytes = %lu: xfer=%d\n", __func__, - fbytes, xfer); - if (atomic_read(&prtd->start)) { - pr_debug("%s:writing %d bytes of buffer to dsp\n", - __func__, xfer); - ret = q6asm_write(prtd->audio_client, xfer, - 0, 0, NO_TIMESTAMP); - if (ret < 0) { - ret = -EFAULT; - q6asm_cpu_buf_release(IN, - prtd->audio_client); - goto fail; - } - } else - atomic_inc(&prtd->out_needed); - atomic_dec(&prtd->out_count); - } - } -fail: - if (retries >= MAX_PB_COPY_RETRIES) - ret = -ENOMEM; - - return ret; -} - -static int msm_pcm_playback_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - uint32_t timeout; - int dir = 0; - int ret = 0; - - pr_debug("%s: cmd_pending 0x%lx\n", __func__, prtd->cmd_pending); - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - if (prtd->audio_client) { - dir = IN; - - /* - * Unvote to downgrade the Rx thread priority from - * RT Thread for Low-Latency use case. - */ - if (pdata) { - if (pdata->perf_mode == LOW_LATENCY_PCM_MODE) - apr_end_rx_rt(prtd->audio_client->apr); - } - /* determine timeout length */ - if (runtime->frame_bits == 0 || runtime->rate == 0) { - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } else { - timeout = (runtime->period_size * - CMD_EOS_TIMEOUT_MULTIPLIER) / - ((runtime->frame_bits / 8) * - runtime->rate); - if (timeout < CMD_EOS_MIN_TIMEOUT_LENGTH) - timeout = CMD_EOS_MIN_TIMEOUT_LENGTH; - } - pr_debug("%s: CMD_EOS timeout is %d\n", __func__, timeout); - - ret = wait_event_timeout(the_locks.eos_wait, - !test_bit(CMD_EOS, &prtd->cmd_pending), - timeout); - if (!ret) - pr_err("%s: CMD_EOS failed, cmd_pending 0x%lx\n", - __func__, prtd->cmd_pending); - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - q6asm_audio_client_free(prtd->audio_client); - } - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_PLAYBACK); - msm_adsp_clean_mixer_ctl_pp_event_queue(soc_prtd); - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - int xfer; - char *bufptr; - void *data = NULL; - uint32_t idx = 0; - uint32_t size = 0; - uint32_t offset = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = substream->runtime->private_data; - - - pr_debug("%s\n", __func__); - - pr_debug("appl_ptr %d\n", (int)runtime->control->appl_ptr); - pr_debug("hw_ptr %d\n", (int)runtime->status->hw_ptr); - pr_debug("avail_min %d\n", (int)runtime->control->avail_min); - - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET before wait\n", __func__); - return -ENETRESET; - } - ret = wait_event_timeout(the_locks.read_wait, - (atomic_read(&prtd->in_count)), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_debug("%s: wait_event_timeout failed\n", __func__); - goto fail; - } - if (prtd->reset_event) { - pr_err("%s: In SSR return ENETRESET after wait\n", __func__); - return -ENETRESET; - } - if (!atomic_read(&prtd->in_count)) { - pr_debug("%s: pcm stopped in_count 0\n", __func__); - return 0; - } - pr_debug("Checking if valid buffer is available...%pK\n", - data); - data = q6asm_is_cpu_buf_avail(OUT, prtd->audio_client, &size, &idx); - bufptr = data; - pr_debug("Size = %d\n", size); - pr_debug("fbytes = %lu\n", fbytes); - pr_debug("idx = %d\n", idx); - if (bufptr) { - xfer = fbytes; - if (xfer > size) - xfer = size; - offset = prtd->in_frame_info[idx].offset; - pr_debug("Offset value = %d\n", offset); - if (copy_to_user(buf, bufptr+offset, xfer)) { - pr_err("Failed to copy buf to user\n"); - ret = -EFAULT; - q6asm_cpu_buf_release(OUT, prtd->audio_client); - goto fail; - } - fbytes -= xfer; - size -= xfer; - prtd->in_frame_info[idx].offset += xfer; - pr_debug("%s:fbytes = %lu: size=%d: xfer=%d\n", - __func__, fbytes, size, xfer); - pr_debug(" Sending next buffer to dsp\n"); - memset(&prtd->in_frame_info[idx], 0, - sizeof(struct msm_audio_in_frame_info)); - atomic_dec(&prtd->in_count); - ret = q6asm_read(prtd->audio_client); - if (ret < 0) { - pr_err("q6asm read failed\n"); - ret = -EFAULT; - q6asm_cpu_buf_release(OUT, prtd->audio_client); - goto fail; - } - } else - pr_err("No valid buffer\n"); - - pr_debug("Returning from capture_copy... %d\n", ret); -fail: - return ret; -} - -static int msm_pcm_capture_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = runtime->private_data; - struct msm_plat_data *pdata; - int dir = OUT; - - pr_debug("%s\n", __func__); - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - - if (prtd->audio_client) { - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - q6asm_audio_client_free(prtd->audio_client); - } - - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id, - SNDRV_PCM_STREAM_CAPTURE); - kfree(prtd); - runtime->private_data = NULL; - mutex_unlock(&pdata->lock); - - return 0; -} - -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_copy(substream, a, hwoff, buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, a, hwoff, buf, fbytes); - return ret; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_close(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_close(substream); - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - return ret; -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - - if (prtd->pcm_irq_pos >= prtd->pcm_size) - prtd->pcm_irq_pos = 0; - - pr_debug("pcm_irq_pos = %d\n", prtd->pcm_irq_pos); - return bytes_to_frames(runtime, (prtd->pcm_irq_pos)); -} - -static int msm_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - struct audio_port_data *apd = ac->port; - struct audio_buffer *ab; - int dir = -1; - - prtd->mmap_flag = 1; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ab = &(apd[dir].buf[0]); - - return msm_audio_ion_mmap(ab, vma); -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct audio_buffer *buf; - int dir, ret; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ret = q6asm_audio_client_buf_alloc_contiguous(dir, - prtd->audio_client, - (params_buffer_bytes(params) / params_periods(params)), - params_periods(params)); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", - ret); - return -ENOMEM; - } - buf = prtd->audio_client->port[dir].buf; - if (buf == NULL || buf[0].data == NULL) - return -ENOMEM; - - pr_debug("%s:buf = %pK\n", __func__, buf); - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf[0].data; - dma_buf->addr = buf[0].phys; - dma_buf->bytes = params_buffer_bytes(params); - if (!dma_buf->area) - return -ENOMEM; - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - return 0; -} - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .ioctl = snd_pcm_lib_ioctl, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .mmap = msm_pcm_mmap, -}; - -static int msm_pcm_adsp_stream_cmd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *pcm = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(pcm); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - int ret = 0; - struct msm_adsp_event_data *event_data = NULL; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - - mutex_lock(&pdata->lock); - substream = pdata->pcm[kcontrol->private_value]-> - streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - ret = -EINVAL; - goto done; - } - - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = substream->runtime->private_data; - if (prtd->audio_client == NULL) { - pr_err("%s prtd is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)ucontrol->value.bytes.data; - if ((event_data->event_type < ADSP_STREAM_PP_EVENT) || - (event_data->event_type >= ADSP_STREAM_EVENT_MAX)) { - pr_err("%s: invalid event_type=%d", - __func__, event_data->event_type); - ret = -EINVAL; - goto done; - } - - if (event_data->payload_len > sizeof(ucontrol->value.bytes.data) - - sizeof(struct msm_adsp_event_data)) { - pr_err("%s param length=%d exceeds limit", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_stream_cmd(prtd->audio_client, event_data); - if (ret < 0) - pr_err("%s: failed to send stream event cmd, err = %d\n", - __func__, ret); -done: - mutex_unlock(&pdata->lock); - return ret; -} - -static int msm_pcm_add_audio_adsp_stream_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CMD; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_audio_adsp_stream_cmd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_pcm_adsp_stream_cmd_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_stream_cmd_config_control[0].name = mixer_str; - fe_audio_adsp_stream_cmd_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s\n", mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_stream_cmd_config_control, - ARRAY_SIZE(fe_audio_adsp_stream_cmd_config_control)); - if (ret < 0) - pr_err("%s: failed add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_pcm_add_audio_adsp_stream_callback_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol *kctl; - - struct snd_kcontrol_new fe_audio_adsp_callback_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_callback_info, - .get = msm_adsp_stream_callback_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: added new pcm FE with name %s, id %d, cpu dai %s, device no %d\n", - __func__, rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_audio_adsp_callback_config_control[0].name = mixer_str; - fe_audio_adsp_callback_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_adsp_callback_config_control, - ARRAY_SIZE(fe_audio_adsp_callback_config_control)); - if (ret < 0) { - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl %s.\n", __func__, mixer_str); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl->private_data = NULL; - -free_mixer_str: - kfree(mixer_str); -done: - return ret; -} - -static int msm_pcm_set_volume(struct msm_audio *prtd, uint32_t volume) -{ - int rc = 0; - - if (prtd && prtd->audio_client) { - pr_debug("%s: channels %d volume 0x%x\n", __func__, - prtd->channel_mode, volume); - rc = q6asm_set_volume(prtd->audio_client, volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - } - } - return rc; -} - -static int msm_pcm_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct msm_plat_data *pdata = NULL; - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_audio *prtd; - - pr_debug("%s\n", __func__); - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -ENODEV; - } - soc_prtd = substream->private_data; - if (!substream->runtime || !soc_prtd) { - pr_debug("%s substream runtime or private_data not found\n", - __func__); - return 0; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: pdata not found\n", __func__); - return -ENODEV; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->volume; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_plat_data *pdata = NULL; - struct msm_audio *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : 0x%x\n", __func__, volume); - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -ENODEV; - } - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return 0; - } - - soc_prtd = substream->private_data; - if (!soc_prtd) { - pr_err("%s: soc_prtd is NULL\n", __func__); - return -ENODEV; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - rc = msm_pcm_set_volume(prtd, volume); - prtd->volume = volume; - } - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_pcm_add_volume_control(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - - dev_dbg(rtd->dev, "%s, Volume control add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, rtd->dai_link->id, - &volume_info); - if (ret < 0) { - pr_err("%s volume control failed ret %d\n", __func__, ret); - return ret; - } - kctl = volume_info->kctl; - kctl->put = msm_pcm_volume_ctl_put; - kctl->get = msm_pcm_volume_ctl_get; - kctl->tlv.p = msm_pcm_vol_gain; - return 0; -} - -static int msm_pcm_compress_ctl_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x2000; - return 0; -} - -static int msm_pcm_compress_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(comp); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - substream = pdata->pcm[kcontrol->private_value]-> - streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - if (!substream->runtime) { - pr_debug("%s substream runtime not found\n", __func__); - return 0; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->compress_enable; - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_compress_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(comp); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - int compress = ucontrol->value.integer.value[0]; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - substream = pdata->pcm[kcontrol->private_value]-> - streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - pr_debug("%s: compress : 0x%x\n", __func__, compress); - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return 0; - } - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - pr_debug("%s: setting compress flag to 0x%x\n", - __func__, compress); - prtd->compress_enable = compress; - } - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_pcm_add_compress_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback "; - const char *mixer_ctl_end_name = " Compress"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len; - int ret = 0; - struct msm_plat_data *pdata; - struct snd_kcontrol_new pcm_compress_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_compress_ctl_info, - .get = msm_pcm_compress_ctl_get, - .put = msm_pcm_compress_ctl_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: NULL rtd\n", __func__); - return -EINVAL; - } - - ctl_len = strlen(mixer_ctl_name) + strlen(deviceNo) + - strlen(mixer_ctl_end_name) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) - return -ENOMEM; - - snprintf(mixer_str, ctl_len, "%s%d%s", mixer_ctl_name, - rtd->pcm->device, mixer_ctl_end_name); - - pcm_compress_control[0].name = mixer_str; - pcm_compress_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - pdata = dev_get_drvdata(rtd->platform->dev); - if (pdata) { - pdata->pcm[rtd->dai_link->id] = rtd->pcm; - snd_soc_add_platform_controls(rtd->platform, - pcm_compress_control, - ARRAY_SIZE - (pcm_compress_control)); - pr_debug("%s: add control success plt = %pK\n", - __func__, rtd->platform); - } else { - pr_err("%s: NULL pdata\n", __func__); - ret = -EINVAL; - } - kfree(mixer_str); - return ret; -} - -static int msm_pcm_chmap_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); - unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); - struct snd_pcm_substream *substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_plat_data *pdata = NULL; - struct msm_audio *prtd; - - pr_debug("%s", __func__); - substream = snd_pcm_chmap_substream(info, idx); - if (!substream) - return -ENODEV; - - if (!substream->runtime) - return 0; - - soc_prtd = substream->private_data; - if (!soc_prtd) { - pr_err("%s: soc_prtd is NULL\n", __func__); - return -ENODEV; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - prtd->set_channel_map = true; - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - prtd->channel_map[i] = - (char)(ucontrol->value.integer.value[i]); - } - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); - unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); - struct snd_pcm_substream *substream; - struct snd_soc_pcm_runtime *soc_prtd = NULL; - struct msm_plat_data *pdata = NULL; - struct msm_audio *prtd; - - pr_debug("%s", __func__); - substream = snd_pcm_chmap_substream(info, idx); - if (!substream) - return -ENODEV; - - memset(ucontrol->value.integer.value, 0, - sizeof(ucontrol->value.integer.value)); - if (!substream->runtime) - return 0; /* no channels set */ - - soc_prtd = substream->private_data; - if (!soc_prtd) { - pr_err("%s: soc_prtd is NULL\n", __func__); - return -ENODEV; - } - - pdata = (struct msm_plat_data *) - dev_get_drvdata(soc_prtd->platform->dev); - if (!pdata) { - pr_err("%s: platform data is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - - if (prtd && prtd->set_channel_map == true) { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - (int)prtd->channel_map[i]; - } else { - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = 0; - } - - mutex_unlock(&pdata->lock); - return 0; -} - -static int msm_pcm_add_chmap_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_chmap *chmap_info; - struct snd_kcontrol *kctl; - char device_num[12]; - int i, ret = 0; - - pr_debug("%s, Channel map cntrl add\n", __func__); - ret = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - snd_pcm_std_chmaps, - PCM_FORMAT_MAX_NUM_CHANNEL_V8, 0, - &chmap_info); - if (ret < 0) { - pr_err("%s, channel map cntrl add failed\n", __func__); - return ret; - } - kctl = chmap_info->kctl; - for (i = 0; i < kctl->count; i++) - kctl->vd[i].access |= SNDRV_CTL_ELEM_ACCESS_WRITE; - snprintf(device_num, sizeof(device_num), "%d", pcm->device); - strlcat(kctl->id.name, device_num, sizeof(kctl->id.name)); - pr_debug("%s, Overwriting channel map control name to: %s\n", - __func__, kctl->id.name); - kctl->put = msm_pcm_chmap_ctl_put; - kctl->get = msm_pcm_chmap_ctl_get; - return 0; -} - -static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[0]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[1]; - if (ucontrol->value.integer.value[2] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[2]; - pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_TX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[0] = cfg_data.app_type; - ucontrol->value.integer.value[1] = cfg_data.acdb_dev_id; - ucontrol->value.integer.value[2] = cfg_data.sample_rate; - ucontrol->value.integer.value[3] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_pcm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_usr *app_type_info; - struct snd_kcontrol *kctl; - const char *playback_mixer_ctl_name = "Audio Stream"; - const char *capture_mixer_ctl_name = "Audio Stream Capture"; - const char *deviceNo = "NN"; - const char *suffix = "App Type Cfg"; - int ctl_len, ret = 0; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ctl_len = strlen(playback_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Playback app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: playback app type cntrl add failed: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - playback_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_playback_app_type_cfg_ctl_put; - kctl->get = msm_pcm_playback_app_type_cfg_ctl_get; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ctl_len = strlen(capture_mixer_ctl_name) + 1 + - strlen(deviceNo) + 1 + strlen(suffix) + 1; - pr_debug("%s: Capture app type cntrl add\n", __func__); - ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE, - NULL, 1, ctl_len, rtd->dai_link->id, - &app_type_info); - if (ret < 0) { - pr_err("%s: capture app type cntrl add failed: %d\n", - __func__, ret); - return ret; - } - kctl = app_type_info->kctl; - snprintf(kctl->id.name, ctl_len, "%s %d %s", - capture_mixer_ctl_name, rtd->pcm->device, suffix); - kctl->put = msm_pcm_capture_app_type_cfg_ctl_put; - kctl->get = msm_pcm_capture_app_type_cfg_ctl_get; - } - - return 0; -} - -static int msm_pcm_path_latency_ctl_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x80000; - return 0; -} - -static int msm_pcm_path_latency_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(comp); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - - substream = pdata->pcm[kcontrol->private_value]-> - streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return -EINVAL; - } - - mutex_lock(&pdata->lock); - prtd = substream->runtime->private_data; - if (prtd) { - rc = q6asm_get_path_delay(prtd->audio_client); - if (rc) { - pr_err("%s: get_path_delay failed, ret=%d\n", - __func__, rc); - mutex_unlock(&pdata->lock); - return -EINVAL; - } - ucontrol->value.integer.value[0] = - prtd->audio_client->path_delay; - } - - mutex_unlock(&pdata->lock); - return rc; -} - -static int msm_pcm_add_path_latency_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "ADSP Path Latency"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new path_latency_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_path_latency_ctl_info, - .get = msm_pcm_path_latency_ctl_get, - .private_value = 0, - } - }; - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - path_latency_control[0].name = mixer_str; - path_latency_control[0].private_value = rtd->dai_link->id; - ret = snd_soc_add_platform_controls(rtd->platform, - path_latency_control, - ARRAY_SIZE(path_latency_control)); - if (ret < 0) - pr_err("%s: failed add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_pcm_qtimer_ctl_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 2; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0x200000; - return 0; -} - -static int msm_pcm_qtimer_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - struct snd_soc_platform *platform = snd_soc_component_to_platform(comp); - struct msm_plat_data *pdata = dev_get_drvdata(platform->dev); - struct snd_pcm_substream *substream; - struct msm_audio *prtd; - - if (!pdata) { - pr_err("%s pdata is NULL\n", __func__); - return -ENODEV; - } - - substream = pdata->pcm[kcontrol->private_value]-> - streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s substream not found\n", __func__); - return -EINVAL; - } - - if (!substream->runtime) { - pr_err("%s substream runtime not found\n", __func__); - return 0; - } - - prtd = substream->runtime->private_data; - if (prtd) { - prtd->qtime_lsw = ucontrol->value.integer.value[0]; - prtd->qtime_msw = ucontrol->value.integer.value[1]; - } - - return 0; -} - -static int msm_pcm_add_qtimer_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "QTimer"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new qtimer_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_pcm_qtimer_ctl_info, - .put = msm_pcm_qtimer_ctl_put, - .private_value = 0, - } - }; - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - qtimer_control[0].name = mixer_str; - qtimer_control[0].private_value = rtd->dai_link->id; - ret = snd_soc_add_platform_controls(rtd->platform, - qtimer_control, - ARRAY_SIZE(qtimer_control)); - if (ret < 0) - pr_err("%s: failed add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_pcm_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - ret = msm_pcm_add_chmap_controls(rtd); - if (ret) - pr_err("%s: pcm add controls failed:%d\n", __func__, ret); - ret = msm_pcm_add_app_type_controls(rtd); - if (ret) - pr_err("%s: pcm add app type controls failed:%d\n", - __func__, ret); - - ret = msm_pcm_add_qtimer_control(rtd); - if (ret) - pr_err("%s: pcm add qtimer controls failed:%d\n", - __func__, ret); - - ret = msm_pcm_add_path_latency_control(rtd); - if (ret) - pr_err("%s: pcm add path latency control failed:%d\n", - __func__, ret); - - return ret; -} - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_pcm_add_controls(rtd); - if (ret) { - pr_err("%s, kctl add failed:%d\n", __func__, ret); - return ret; - } - - ret = msm_pcm_add_volume_control(rtd); - if (ret) - pr_err("%s: Could not add pcm Volume Control %d\n", - __func__, ret); - - ret = msm_pcm_add_compress_control(rtd); - if (ret) - pr_err("%s: Could not add pcm Compress Control %d\n", - __func__, ret); - - ret = msm_pcm_add_audio_adsp_stream_cmd_control(rtd); - if (ret) - pr_err("%s: Could not add pcm ADSP Stream Cmd Control\n", - __func__); - - ret = msm_pcm_add_audio_adsp_stream_callback_control(rtd); - if (ret) - pr_err("%s: Could not add pcm ADSP Stream Callback Control\n", - __func__); - - return ret; -} - -static snd_pcm_sframes_t msm_pcm_delay_blk(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - snd_pcm_sframes_t frames; - int ret; - - ret = q6asm_get_path_delay(prtd->audio_client); - if (ret) { - pr_err("%s: get_path_delay failed, ret=%d\n", __func__, ret); - return 0; - } - - /* convert microseconds to frames */ - frames = ac->path_delay / 1000 * runtime->rate / 1000; - - /* also convert the remainder from the initial division */ - frames += ac->path_delay % 1000 * runtime->rate / 1000000; - - /* overcompensate for the loss of precision (empirical) */ - frames += 2; - - return frames; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .delay_blk = msm_pcm_delay_blk, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - int id; - struct msm_plat_data *pdata; - const char *latency_level; - - rc = of_property_read_u32(pdev->dev.of_node, - "qcom,msm-pcm-dsp-id", &id); - if (rc) { - dev_err(&pdev->dev, "%s: qcom,msm-pcm-dsp-id missing in DT node\n", - __func__); - return rc; - } - - pdata = kzalloc(sizeof(struct msm_plat_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - if (of_property_read_bool(pdev->dev.of_node, - "qcom,msm-pcm-low-latency")) { - - pdata->perf_mode = LOW_LATENCY_PCM_MODE; - rc = of_property_read_string(pdev->dev.of_node, - "qcom,latency-level", &latency_level); - if (!rc) { - if (!strcmp(latency_level, "ultra")) - pdata->perf_mode = ULTRA_LOW_LATENCY_PCM_MODE; - else if (!strcmp(latency_level, "ull-pp")) - pdata->perf_mode = - ULL_POST_PROCESSING_PCM_MODE; - } - } else { - pdata->perf_mode = LEGACY_PCM_MODE; - } - mutex_init(&pdata->lock); - dev_set_drvdata(&pdev->dev, pdata); - - - dev_dbg(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - struct msm_plat_data *pdata; - - pdata = dev_get_drvdata(&pdev->dev); - mutex_destroy(&pdata->lock); - kfree(pdata); - snd_soc_unregister_platform(&pdev->dev); - return 0; -} -static const struct of_device_id msm_pcm_dt_match[] = { - {.compatible = "qcom,msm-pcm-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_dt_match, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_dsp_init(void) -{ - init_waitqueue_head(&the_locks.enable_wait); - init_waitqueue_head(&the_locks.eos_wait); - init_waitqueue_head(&the_locks.write_wait); - init_waitqueue_head(&the_locks.read_wait); - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_dsp_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-q6-v2.h b/techpack/audio/asoc/msm-pcm-q6-v2.h deleted file mode 100644 index e7ed3defd5d4..000000000000 --- a/techpack/audio/asoc/msm-pcm-q6-v2.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2012-2017,2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - */ - -#ifndef _MSM_PCM_H -#define _MSM_PCM_H -#include -#include -#include "msm-pcm-routing-v2.h" - - -/* Support unconventional sample rates 12000, 24000 as well */ -#define USE_RATE \ - (SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_KNOT) - -extern int copy_count; - -struct buffer { - void *data; - unsigned int size; - unsigned int used; - unsigned int addr; -}; - -struct buffer_rec { - void *data; - unsigned int size; - unsigned int read; - unsigned int addr; -}; - -struct audio_locks { - spinlock_t event_lock; - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - wait_queue_head_t eos_wait; - wait_queue_head_t enable_wait; - wait_queue_head_t flush_wait; -}; - -struct msm_audio_in_frame_info { - uint32_t size; - uint32_t offset; -}; - -#define PLAYBACK_MIN_NUM_PERIODS 2 -#define PLAYBACK_MAX_NUM_PERIODS 8 -#define PLAYBACK_MAX_PERIOD_SIZE 122880 -#define PLAYBACK_MIN_PERIOD_SIZE 128 -#define CAPTURE_MIN_NUM_PERIODS 2 -#define CAPTURE_MAX_NUM_PERIODS 8 -#define CAPTURE_MAX_PERIOD_SIZE 122880 -#define CAPTURE_MIN_PERIOD_SIZE 320 - -struct msm_audio { - struct snd_pcm_substream *substream; - unsigned int pcm_size; - unsigned int pcm_count; - unsigned int pcm_irq_pos; /* IRQ position */ - uint16_t source; /* Encoding source bit mask */ - - struct audio_client *audio_client; - - uint16_t session_id; - - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t dsp_cnt; - - int abort; /* set when error, like sample rate mismatch */ - - bool reset_event; - int enabled; - int close_ack; - int cmd_ack; - /* - * cmd_ack doesn't tell if paticular command has been sent so can't - * determine if it needs to wait for completion. - * Use cmd_pending instead when checking whether a command is been - * sent or not. - */ - unsigned long cmd_pending; - atomic_t start; - atomic_t stop; - atomic_t out_count; - atomic_t in_count; - atomic_t out_needed; - atomic_t eos; - int out_head; - int periods; - int mmap_flag; - atomic_t pending_buffer; - bool set_channel_map; - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - int cmd_interrupt; - bool meta_data_mode; - uint32_t volume; - bool compress_enable; - uint32_t qtime_lsw; - uint32_t qtime_msw; - /* array of frame info */ - struct msm_audio_in_frame_info in_frame_info[CAPTURE_MAX_NUM_PERIODS]; -}; - -struct output_meta_data_st { - uint32_t meta_data_length; - uint32_t frame_size; - uint32_t timestamp_lsw; - uint32_t timestamp_msw; - uint32_t reserved[12]; -}; - -struct msm_plat_data { - int perf_mode; - struct snd_pcm *pcm[MSM_FRONTEND_DAI_MAX]; - struct msm_pcm_ch_map *ch_map[MSM_FRONTEND_DAI_MAX]; - struct mutex lock; -}; - -struct msm_pcm_ch_map { - bool set_ch_map; - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL]; -}; - -#endif /*_MSM_PCM_H*/ diff --git a/techpack/audio/asoc/msm-pcm-routing-devdep.c b/techpack/audio/asoc/msm-pcm-routing-devdep.c deleted file mode 100644 index 7335951522b3..000000000000 --- a/techpack/audio/asoc/msm-pcm-routing-devdep.c +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (c) 2014, 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-devdep.h" -#include "msm-ds2-dap-config.h" - -#ifdef CONFIG_SND_HWDEP -static int msm_pcm_routing_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ - pr_debug("%s\n", __func__); - msm_ds2_dap_update_port_parameters(hw, file, true); - return 0; -} - -static int msm_pcm_routing_hwdep_release(struct snd_hwdep *hw, - struct file *file) -{ - pr_debug("%s\n", __func__); - msm_ds2_dap_update_port_parameters(hw, file, false); - return 0; -} - -static int msm_pcm_routing_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - int ret = 0; - void __user *argp = (void __user *)arg; - - pr_debug("%s:cmd %x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE: - msm_pcm_routing_acquire_lock(); - ret = msm_ds2_dap_ioctl(hw, file, cmd, argp); - msm_pcm_routing_release_lock(); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: - ret = msm_ds2_dap_ioctl(hw, file, cmd, argp); - break; - default: - pr_err("%s called with invalid control 0x%X\n", __func__, cmd); - ret = -EINVAL; - break; - } - return ret; -} - -void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm) -{ - pr_debug("%s\n", __func__); -} - -#ifdef CONFIG_COMPAT -static int msm_pcm_routing_hwdep_compat_ioctl(struct snd_hwdep *hw, - struct file *file, - unsigned int cmd, - unsigned long arg) -{ - int ret = 0; - void __user *argp = (void __user *)arg; - - pr_debug("%s:cmd %x\n", __func__, cmd); - switch (cmd) { - case SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM32: - case SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM32: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND32: - case SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE32: - msm_pcm_routing_acquire_lock(); - ret = msm_ds2_dap_compat_ioctl(hw, file, cmd, argp); - msm_pcm_routing_release_lock(); - break; - case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32: - ret = msm_ds2_dap_compat_ioctl(hw, file, cmd, argp); - break; - default: - pr_err("%s called with invalid control 0x%X\n", __func__, cmd); - ret = -EINVAL; - break; - } - return ret; -} -#endif - -int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, - struct msm_pcm_routing_bdai_data *msm_bedais) -{ - struct snd_hwdep *hwdep; - struct snd_soc_dai_link *dai_link = runtime->dai_link; - int rc; - - if (dai_link->id < 0 || - dai_link->id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s:BE id %d invalid index\n", - __func__, dai_link->id); - return -EINVAL; - } - pr_debug("%s BE id %d\n", __func__, dai_link->id); - rc = snd_hwdep_new(runtime->card->snd_card, - msm_bedais[dai_link->id].name, - dai_link->id, &hwdep); - if (hwdep == NULL) { - pr_err("%s: hwdep intf failed to create %s- hwdep NULL\n", - __func__, msm_bedais[dai_link->id].name); - return rc; - } - if (rc < 0) { - pr_err("%s: hwdep intf failed to create %s rc %d\n", __func__, - msm_bedais[dai_link->id].name, rc); - return rc; - } - - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_BE; - hwdep->private_data = &msm_bedais[dai_link->id]; - hwdep->ops.open = msm_pcm_routing_hwdep_open; - hwdep->ops.ioctl = msm_pcm_routing_hwdep_ioctl; - hwdep->ops.release = msm_pcm_routing_hwdep_release; -#ifdef CONFIG_COMPAT - hwdep->ops.ioctl_compat = msm_pcm_routing_hwdep_compat_ioctl; -#endif - return rc; -} -#endif diff --git a/techpack/audio/asoc/msm-pcm-routing-devdep.h b/techpack/audio/asoc/msm-pcm-routing-devdep.h deleted file mode 100644 index 8a0b96700329..000000000000 --- a/techpack/audio/asoc/msm-pcm-routing-devdep.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2014-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_PCM_ROUTING_DEVDEP_H_ -#define _MSM_PCM_ROUTING_DEVDEP_H_ - -#include -#include "msm-pcm-routing-v2.h" - -#ifdef CONFIG_SND_HWDEP -int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, - struct msm_pcm_routing_bdai_data *msm_bedais); -void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm); -#else -static inline int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, - struct msm_pcm_routing_bdai_data *msm_bedais) -{ - return 0; -} - -static inline void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm) -{ -} -#endif -#endif diff --git a/techpack/audio/asoc/msm-pcm-routing-v2.c b/techpack/audio/asoc/msm-pcm-routing-v2.c deleted file mode 100644 index 86dc2c73ab77..000000000000 --- a/techpack/audio/asoc/msm-pcm-routing-v2.c +++ /dev/null @@ -1,24246 +0,0 @@ -/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* for mius start */ -#ifdef CONFIG_US_PROXIMITY -#include -#include -#endif -/* for mius end */ - -#include "msm-pcm-routing-v2.h" -#include "msm-pcm-routing-devdep.h" -#include "msm-qti-pp-config.h" -#include "msm-dolby-dap-config.h" -#include "msm-ds2-dap-config.h" -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI -#include "codecs/tfa98xx/inc/tfa_platform_interface_definition.h" -#endif - -#ifdef CONFIG_MSM_CSPL -#include -#endif - -#ifndef CONFIG_DOLBY_DAP -#undef DOLBY_ADM_COPP_TOPOLOGY_ID -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFE -#endif - -#ifndef CONFIG_DOLBY_DS2 -#undef DS2_ADM_COPP_TOPOLOGY_ID -#define DS2_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFF -#endif - -static struct mutex routing_lock; - -static struct cal_type_data *cal_data[MAX_ROUTING_CAL_TYPES]; - -static int fm_switch_enable; -static int hfp_switch_enable; -static int a2dp_switch_enable; -static int int0_mi2s_switch_enable; -static int int4_mi2s_switch_enable; -static int pri_mi2s_switch_enable; -static int sec_mi2s_switch_enable; -static int tert_mi2s_switch_enable; -static int quat_mi2s_switch_enable; -static int quin_mi2s_switch_enable; -static int fm_pcmrx_switch_enable; -static int usb_switch_enable; -static int lsm_port_index; -static int slim0_rx_aanc_fb_port; -static int msm_route_ec_ref_rx; -static int msm_ec_ref_ch = 4; -static int msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S16_LE; -static int msm_ec_ref_sampling_rate = 48000; -static uint32_t voc_session_id = ALL_SESSION_VSID; -static int msm_route_ext_ec_ref; -static int wakeup_ext_ec_ref = 0; -static int voip_ext_ec_common_ref = 0; -static bool is_custom_stereo_on; -static bool is_ds2_on; -static bool swap_ch; -static bool hifi_filter_enabled; -static int aanc_level; -static int adsp_ssr_switch_status; - -#define WEIGHT_0_DB 0x4000 -/* all the FEs which can support channel mixer */ -static struct msm_pcm_channel_mixer channel_mixer[MSM_FRONTEND_DAI_MM_SIZE]; -/* input BE for each FE */ -static int channel_input[MSM_FRONTEND_DAI_MM_SIZE][ADM_MAX_CHANNELS]; - -enum { - MADNONE, - MADAUDIO, - MADBEACON, - MADULTRASOUND, - MADSWAUDIO, -}; - -#define ADM_LSM_PORT_INDEX 9 - -#define SLIMBUS_0_TX_TEXT "SLIMBUS_0_TX" -#define SLIMBUS_1_TX_TEXT "SLIMBUS_1_TX" -#define SLIMBUS_2_TX_TEXT "SLIMBUS_2_TX" -#define SLIMBUS_3_TX_TEXT "SLIMBUS_3_TX" -#define SLIMBUS_4_TX_TEXT "SLIMBUS_4_TX" -#define SLIMBUS_5_TX_TEXT "SLIMBUS_5_TX" -#define TERT_MI2S_TX_TEXT "TERT_MI2S_TX" -#define QUAT_MI2S_TX_TEXT "QUAT_MI2S_TX" -#define ADM_LSM_TX_TEXT "ADM_LSM_TX" -#define INT3_MI2S_TX_TEXT "INT3_MI2S_TX" -#define VA_CDC_DMA_TX_0_TEXT "VA_CDC_DMA_TX_0" -#define VA_CDC_DMA_TX_1_TEXT "VA_CDC_DMA_TX_1" -#define TX_CDC_DMA_TX_3_TEXT "TX_CDC_DMA_TX_3" -#define QUIN_TDM_TX_TEXT "QUIN_TDM_TX_0" - -#define LSM_FUNCTION_TEXT "LSM Function" -static const char * const lsm_port_text[] = { - "None", - SLIMBUS_0_TX_TEXT, SLIMBUS_1_TX_TEXT, SLIMBUS_2_TX_TEXT, - SLIMBUS_3_TX_TEXT, SLIMBUS_4_TX_TEXT, SLIMBUS_5_TX_TEXT, - TERT_MI2S_TX_TEXT, QUAT_MI2S_TX_TEXT, ADM_LSM_TX_TEXT, - INT3_MI2S_TX_TEXT, VA_CDC_DMA_TX_0_TEXT, VA_CDC_DMA_TX_1_TEXT, - TX_CDC_DMA_TX_3_TEXT, QUIN_TDM_TX_TEXT -}; - -struct msm_pcm_route_bdai_pp_params { - u16 port_id; /* AFE port ID */ - unsigned long pp_params_config; - bool mute_on; - int latency; -}; - -static struct msm_pcm_route_bdai_pp_params - msm_bedais_pp_params[MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX] = { - {HDMI_RX, 0, 0, 0}, - {DISPLAY_PORT_RX, 0, 0, 0}, -}; - -/* - * The be_dai_name_table is passed to HAL so that it can specify the - * BE ID for the BE it wants to enable based on the name. Thus there - * is a matching table and structure in HAL that need to be updated - * if any changes to these are made. - */ -struct msm_pcm_route_bdai_name { - unsigned int be_id; - char be_name[LPASS_BE_NAME_MAX_LENGTH]; -}; -static struct msm_pcm_route_bdai_name be_dai_name_table[MSM_BACKEND_DAI_MAX]; - -static int msm_routing_send_device_pp_params(int port_id, int copp_idx, - int fe_id); - -static void msm_routing_load_topology(size_t data_size, void *data); -static void msm_routing_unload_topology(uint32_t topology_id); - -static int msm_routing_get_bit_width(unsigned int format) -{ - int bit_width; - - switch (format) { - case SNDRV_PCM_FORMAT_S32_LE: - bit_width = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_width = 16; - } - return bit_width; -} - -static bool msm_is_resample_needed(int input_sr, int output_sr) -{ - bool rc = false; - - if (input_sr != output_sr) - rc = true; - - pr_debug("perform resampling (%s) for copp rate (%d)afe rate (%d)", - (rc ? "oh yes" : "not really"), - input_sr, output_sr); - - return rc; -} - -static void msm_pcm_routing_cfg_pp(int port_id, int copp_idx, int topology, - int channels) -{ - int rc = 0; - - switch (topology) { - case SRS_TRUMEDIA_TOPOLOGY_ID: - pr_debug("%s: SRS_TRUMEDIA_TOPOLOGY_ID\n", __func__); - msm_dts_srs_tm_init(port_id, copp_idx); - break; - case DS2_ADM_COPP_TOPOLOGY_ID: - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY %d\n", - __func__, DS2_ADM_COPP_TOPOLOGY_ID); - rc = msm_ds2_dap_init(port_id, copp_idx, channels, - is_custom_stereo_on); - if (rc < 0) - pr_err("%s: DS2 topo_id 0x%x, port %d, CS %d rc %d\n", - __func__, topology, port_id, - is_custom_stereo_on, rc); - break; - case DOLBY_ADM_COPP_TOPOLOGY_ID: - if (is_ds2_on) { - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY\n", __func__); - rc = msm_ds2_dap_init(port_id, copp_idx, channels, - is_custom_stereo_on); - if (rc < 0) - pr_err("%s:DS2 topo_id 0x%x, port %d, rc %d\n", - __func__, topology, port_id, rc); - } else { - pr_debug("%s: DOLBY_ADM_COPP_TOPOLOGY_ID\n", __func__); - rc = msm_dolby_dap_init(port_id, copp_idx, channels, - is_custom_stereo_on); - if (rc < 0) - pr_err("%s: DS1 topo_id 0x%x, port %d, rc %d\n", - __func__, topology, port_id, rc); - } - break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: - pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); - rc = msm_qti_pp_asphere_init(port_id, copp_idx); - if (rc < 0) - pr_err("%s: topo_id 0x%x, port %d, copp %d, rc %d\n", - __func__, topology, port_id, copp_idx, rc); - break; - default: - /* custom topology specific feature param handlers */ - break; - } -} - -static void msm_pcm_routing_deinit_pp(int port_id, int topology) -{ - switch (topology) { - case SRS_TRUMEDIA_TOPOLOGY_ID: - pr_debug("%s: SRS_TRUMEDIA_TOPOLOGY_ID\n", __func__); - msm_dts_srs_tm_deinit(port_id); - break; - case DS2_ADM_COPP_TOPOLOGY_ID: - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY_ID %d\n", - __func__, DS2_ADM_COPP_TOPOLOGY_ID); - msm_ds2_dap_deinit(port_id); - break; - case DOLBY_ADM_COPP_TOPOLOGY_ID: - if (is_ds2_on) { - pr_debug("%s: DS2_ADM_COPP_TOPOLOGY_ID\n", __func__); - msm_ds2_dap_deinit(port_id); - } else { - pr_debug("%s: DOLBY_ADM_COPP_TOPOLOGY_ID\n", __func__); - msm_dolby_dap_deinit(port_id); - } - break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: - pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); - msm_qti_pp_asphere_deinit(port_id); - break; - default: - /* custom topology specific feature deinit handlers */ - break; - } -} - -static void msm_pcm_routng_cfg_matrix_map_pp(struct route_payload payload, - int path_type, int perf_mode) -{ - int itr = 0, rc = 0; - - if ((path_type == ADM_PATH_PLAYBACK) && - (perf_mode == LEGACY_PCM_MODE) && - is_custom_stereo_on) { - for (itr = 0; itr < payload.num_copps; itr++) { - if ((payload.port_id[itr] != SLIMBUS_0_RX) && - (payload.port_id[itr] != RT_PROXY_PORT_001_RX)) { - continue; - } - - rc = msm_qti_pp_send_stereo_to_custom_stereo_cmd( - payload.port_id[itr], - payload.copp_idx[itr], - payload.session_id, - Q14_GAIN_ZERO_POINT_FIVE, - Q14_GAIN_ZERO_POINT_FIVE, - Q14_GAIN_ZERO_POINT_FIVE, - Q14_GAIN_ZERO_POINT_FIVE); - if (rc < 0) - pr_err("%s: err setting custom stereo\n", - __func__); - } - } -} - -#define SLIMBUS_EXTPROC_RX AFE_PORT_INVALID -struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = { - { PRIMARY_I2S_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PRI_I2S_RX}, - { PRIMARY_I2S_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PRI_I2S_TX}, - { SLIMBUS_0_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_0_RX}, - { SLIMBUS_0_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_0_TX}, - { HDMI_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_HDMI}, - { INT_BT_SCO_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_BT_SCO_RX}, - { INT_BT_SCO_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_BT_SCO_TX}, - { INT_FM_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_FM_RX}, - { INT_FM_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_INT_FM_TX}, - { RT_PROXY_PORT_001_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AFE_PCM_RX}, - { RT_PROXY_PORT_001_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AFE_PCM_TX}, - { AFE_PORT_ID_PRIMARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AUXPCM_RX}, - { AFE_PORT_ID_PRIMARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AUXPCM_TX}, - { VOICE_PLAYBACK_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VOICE_PLAYBACK_TX}, - { VOICE2_PLAYBACK_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VOICE2_PLAYBACK_TX}, - { VOICE_RECORD_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INCALL_RECORD_RX}, - { VOICE_RECORD_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INCALL_RECORD_TX}, - { MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_MI2S_RX}, - { MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_MI2S_TX}, - { SECONDARY_I2S_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SEC_I2S_RX}, - { SLIMBUS_1_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_1_RX}, - { SLIMBUS_1_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_1_TX}, - { SLIMBUS_2_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_2_RX}, - { SLIMBUS_2_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_2_TX}, - { SLIMBUS_3_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_3_RX}, - { SLIMBUS_3_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_3_TX}, - { SLIMBUS_4_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_4_RX}, - { SLIMBUS_4_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_4_TX}, - { SLIMBUS_5_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_5_RX}, - { SLIMBUS_5_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_5_TX}, - { SLIMBUS_6_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_6_RX}, - { SLIMBUS_6_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_6_TX}, - { SLIMBUS_7_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_7_RX}, - { SLIMBUS_7_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_7_TX}, - { SLIMBUS_8_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_8_RX}, - { SLIMBUS_8_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_8_TX}, - { SLIMBUS_EXTPROC_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_STUB_RX}, - { SLIMBUS_EXTPROC_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_STUB_TX}, - { SLIMBUS_EXTPROC_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_STUB_1_TX}, - { AFE_PORT_ID_QUATERNARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_MI2S_RX}, - { AFE_PORT_ID_QUATERNARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_MI2S_TX}, - { AFE_PORT_ID_SECONDARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_MI2S_RX}, - { AFE_PORT_ID_SECONDARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_MI2S_TX}, - { AFE_PORT_ID_PRIMARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_MI2S_RX}, - { AFE_PORT_ID_PRIMARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_MI2S_TX}, - { AFE_PORT_ID_TERTIARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_MI2S_RX}, - { AFE_PORT_ID_TERTIARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_MI2S_TX}, - { AUDIO_PORT_ID_I2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_AUDIO_I2S_RX}, - { AFE_PORT_ID_SECONDARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_AUXPCM_RX}, - { AFE_PORT_ID_SECONDARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_AUXPCM_TX}, - { AFE_PORT_ID_PRIMARY_SPDIF_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_SPDIF_RX}, - { AFE_PORT_ID_SECONDARY_MI2S_RX_SD1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_MI2S_RX_SD1}, - { AFE_PORT_ID_QUINARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_MI2S_RX}, - { AFE_PORT_ID_QUINARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_MI2S_TX}, - { AFE_PORT_ID_SENARY_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SENARY_MI2S_TX}, - { AFE_PORT_ID_PRIMARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_0}, - { AFE_PORT_ID_PRIMARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_0}, - { AFE_PORT_ID_PRIMARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_1}, - { AFE_PORT_ID_PRIMARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_1}, - { AFE_PORT_ID_PRIMARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_2}, - { AFE_PORT_ID_PRIMARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_2}, - { AFE_PORT_ID_PRIMARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_3}, - { AFE_PORT_ID_PRIMARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_3}, - { AFE_PORT_ID_PRIMARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_4}, - { AFE_PORT_ID_PRIMARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_4}, - { AFE_PORT_ID_PRIMARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_5}, - { AFE_PORT_ID_PRIMARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_5}, - { AFE_PORT_ID_PRIMARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_6}, - { AFE_PORT_ID_PRIMARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_6}, - { AFE_PORT_ID_PRIMARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_RX_7}, - { AFE_PORT_ID_PRIMARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_TDM_TX_7}, - { AFE_PORT_ID_SECONDARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_0}, - { AFE_PORT_ID_SECONDARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_0}, - { AFE_PORT_ID_SECONDARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_1}, - { AFE_PORT_ID_SECONDARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_1}, - { AFE_PORT_ID_SECONDARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_2}, - { AFE_PORT_ID_SECONDARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_2}, - { AFE_PORT_ID_SECONDARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_3}, - { AFE_PORT_ID_SECONDARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_3}, - { AFE_PORT_ID_SECONDARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_4}, - { AFE_PORT_ID_SECONDARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_4}, - { AFE_PORT_ID_SECONDARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_5}, - { AFE_PORT_ID_SECONDARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_5}, - { AFE_PORT_ID_SECONDARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_6}, - { AFE_PORT_ID_SECONDARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_6}, - { AFE_PORT_ID_SECONDARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_RX_7}, - { AFE_PORT_ID_SECONDARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_TDM_TX_7}, - { AFE_PORT_ID_TERTIARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_0}, - { AFE_PORT_ID_TERTIARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_0}, - { AFE_PORT_ID_TERTIARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_1}, - { AFE_PORT_ID_TERTIARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_1}, - { AFE_PORT_ID_TERTIARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_2}, - { AFE_PORT_ID_TERTIARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_2}, - { AFE_PORT_ID_TERTIARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_3}, - { AFE_PORT_ID_TERTIARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_3}, - { AFE_PORT_ID_TERTIARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_4}, - { AFE_PORT_ID_TERTIARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_4}, - { AFE_PORT_ID_TERTIARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_5}, - { AFE_PORT_ID_TERTIARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_5}, - { AFE_PORT_ID_TERTIARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_6}, - { AFE_PORT_ID_TERTIARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_6}, - { AFE_PORT_ID_TERTIARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_RX_7}, - { AFE_PORT_ID_TERTIARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_TDM_TX_7}, - { AFE_PORT_ID_QUATERNARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_0}, - { AFE_PORT_ID_QUATERNARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_0}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_1}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_1}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_2}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_2}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_3}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_3}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_4}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_4}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_5}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_5}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_6}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_6}, - { AFE_PORT_ID_QUATERNARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_RX_7}, - { AFE_PORT_ID_QUATERNARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_TDM_TX_7}, - { AFE_PORT_ID_QUINARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_0}, - { AFE_PORT_ID_QUINARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_0}, - { AFE_PORT_ID_QUINARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_1}, - { AFE_PORT_ID_QUINARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_1}, - { AFE_PORT_ID_QUINARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_2}, - { AFE_PORT_ID_QUINARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_2}, - { AFE_PORT_ID_QUINARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_3}, - { AFE_PORT_ID_QUINARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_3}, - { AFE_PORT_ID_QUINARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_4}, - { AFE_PORT_ID_QUINARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_4}, - { AFE_PORT_ID_QUINARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_5}, - { AFE_PORT_ID_QUINARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_5}, - { AFE_PORT_ID_QUINARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_6}, - { AFE_PORT_ID_QUINARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_6}, - { AFE_PORT_ID_QUINARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_RX_7}, - { AFE_PORT_ID_QUINARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_TDM_TX_7}, - { INT_BT_A2DP_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT_BT_A2DP_RX}, - { AFE_PORT_ID_USB_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_USB_AUDIO_RX}, - { AFE_PORT_ID_USB_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_USB_AUDIO_TX}, - { DISPLAY_PORT_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_DISPLAY_PORT}, - { DISPLAY_PORT_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_DISPLAY_PORT1}, - { AFE_PORT_ID_TERTIARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_AUXPCM_RX}, - { AFE_PORT_ID_TERTIARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TERT_AUXPCM_TX}, - { AFE_PORT_ID_QUATERNARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_AUXPCM_RX}, - { AFE_PORT_ID_QUATERNARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUAT_AUXPCM_TX}, - { AFE_PORT_ID_QUINARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_AUXPCM_RX}, - { AFE_PORT_ID_QUINARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_QUIN_AUXPCM_TX}, - { AFE_PORT_ID_INT0_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT0_MI2S_RX}, - { AFE_PORT_ID_INT0_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT0_MI2S_TX}, - { AFE_PORT_ID_INT1_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT1_MI2S_RX}, - { AFE_PORT_ID_INT1_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT1_MI2S_TX}, - { AFE_PORT_ID_INT2_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT2_MI2S_RX}, - { AFE_PORT_ID_INT2_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT2_MI2S_TX}, - { AFE_PORT_ID_INT3_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT3_MI2S_RX}, - { AFE_PORT_ID_INT3_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT3_MI2S_TX}, - { AFE_PORT_ID_INT4_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT4_MI2S_RX}, - { AFE_PORT_ID_INT4_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT4_MI2S_TX}, - { AFE_PORT_ID_INT5_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT5_MI2S_RX}, - { AFE_PORT_ID_INT5_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT5_MI2S_TX}, - { AFE_PORT_ID_INT6_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT6_MI2S_RX}, - { AFE_PORT_ID_INT6_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_INT6_MI2S_TX}, - { AFE_PORT_ID_SENARY_PCM_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_AUXPCM_RX}, - { AFE_PORT_ID_SENARY_PCM_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEN_AUXPCM_TX}, - { AFE_PORT_ID_SENARY_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SENARY_MI2S_RX}, - { AFE_PORT_ID_WSA_CODEC_DMA_RX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_RX_0}, - { AFE_PORT_ID_WSA_CODEC_DMA_TX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_TX_0}, - { AFE_PORT_ID_WSA_CODEC_DMA_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_RX_1}, - { AFE_PORT_ID_WSA_CODEC_DMA_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_TX_1}, - { AFE_PORT_ID_WSA_CODEC_DMA_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_WSA_CDC_DMA_TX_2}, - { AFE_PORT_ID_VA_CODEC_DMA_TX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VA_CDC_DMA_TX_0}, - { AFE_PORT_ID_VA_CODEC_DMA_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_VA_CDC_DMA_TX_1}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_0}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_0, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_0}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_1}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_1, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_1}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_2}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_2, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_2}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_3}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_3, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_3}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_4}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_4, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_4}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_5}, - { AFE_PORT_ID_TX_CODEC_DMA_TX_5, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_TX_CDC_DMA_TX_5}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_6, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_6}, - { AFE_PORT_ID_RX_CODEC_DMA_RX_7, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_RX_CDC_DMA_RX_7}, - { AFE_PORT_ID_PRIMARY_SPDIF_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_PRI_SPDIF_TX}, - { AFE_PORT_ID_SECONDARY_SPDIF_RX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_SPDIF_RX}, - { AFE_PORT_ID_SECONDARY_SPDIF_TX, 0, {0}, {0}, 0, 0, 0, 0, - LPASS_BE_SEC_SPDIF_TX}, - { SLIMBUS_9_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_9_RX}, - { SLIMBUS_9_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_9_TX}, - { RT_PROXY_PORT_002_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_RX}, - { RT_PROXY_PORT_002_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_TX}, -}; - -/* Track ASM playback & capture sessions of DAI - * Track LSM listen sessions - */ -static struct msm_pcm_routing_fdai_data - fe_dai_map[MSM_FRONTEND_DAI_MAX][2] = { - /* MULTIMEDIA1 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA2 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA3 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA4 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA5 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA6 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA7*/ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA8 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA9 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA10 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA11 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA12 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA13 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA14 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA15 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA16 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA17 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA18 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA19 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA20 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA21 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA26 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA27 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA28 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* MULTIMEDIA29 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOIP */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* AFE_RX */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* AFE_TX */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICE_STUB */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* DTMF_RX */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* QCHAT */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOLTE_STUB */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM1 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM2 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM3 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM4 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM5 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM6 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM7 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* LSM8 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICE2_STUB */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICEMMODE1 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, - /* VOICEMMODE2 */ - {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM}, - {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} }, -}; - -static unsigned long session_copp_map[MSM_FRONTEND_DAI_MAX][2] - [MSM_BACKEND_DAI_MAX]; -static struct msm_pcm_routing_app_type_data app_type_cfg[MAX_APP_TYPES]; -static struct msm_pcm_routing_app_type_data lsm_app_type_cfg[MAX_APP_TYPES]; -static struct msm_pcm_stream_app_type_cfg - fe_dai_app_type_cfg[MSM_FRONTEND_DAI_MAX][2][MSM_BACKEND_DAI_MAX]; - -static int last_be_id_configured[MSM_FRONTEND_DAI_MAX][MAX_SESSION_TYPES]; - -/* The caller of this should acquire routing lock */ -void msm_pcm_routing_get_bedai_info(int be_idx, - struct msm_pcm_routing_bdai_data *be_dai) -{ - if (be_idx >= 0 && be_idx < MSM_BACKEND_DAI_MAX) - memcpy(be_dai, &msm_bedais[be_idx], - sizeof(struct msm_pcm_routing_bdai_data)); -} - -/* The caller of this should acquire routing lock */ -void msm_pcm_routing_get_fedai_info(int fe_idx, int sess_type, - struct msm_pcm_routing_fdai_data *fe_dai) -{ - if ((sess_type == SESSION_TYPE_TX) || (sess_type == SESSION_TYPE_RX)) - memcpy(fe_dai, &fe_dai_map[fe_idx][sess_type], - sizeof(struct msm_pcm_routing_fdai_data)); -} - -void msm_pcm_routing_acquire_lock(void) -{ - mutex_lock(&routing_lock); -} - -void msm_pcm_routing_release_lock(void) -{ - mutex_unlock(&routing_lock); -} - -static int msm_pcm_routing_get_app_type_idx(int app_type) -{ - int idx; - - pr_debug("%s: app_type: %d\n", __func__, app_type); - for (idx = 0; idx < MAX_APP_TYPES; idx++) { - if (app_type_cfg[idx].app_type == app_type) - return idx; - } - pr_info("%s: App type not available, fallback to default\n", __func__); - return 0; -} - -static int msm_pcm_routing_get_lsm_app_type_idx(int app_type) -{ - int idx; - - pr_debug("%s: app_type: %d\n", __func__, app_type); - for (idx = 0; idx < MAX_APP_TYPES; idx++) { - if (lsm_app_type_cfg[idx].app_type == app_type) - return idx; - } - pr_debug("%s: App type not available, fallback to default\n", __func__); - return 0; -} - -static bool is_mm_lsm_fe_id(int fe_id) -{ - bool rc = true; - - if (fe_id > MSM_FRONTEND_DAI_MM_MAX_ID && - ((fe_id < MSM_FRONTEND_DAI_LSM1) || - (fe_id > MSM_FRONTEND_DAI_LSM8))) { - rc = false; - } - return rc; -} - -/* - * msm_pcm_routing_send_chmix_cfg: - * send the channel mixer command to mix the input channels - * into output channels. - * - * @fe_id: front end id - * @ip_channel_cnt: input channel count - * @op_channel_cnt: output channel count - * @ch_wght_coeff: channel weight co-efficients for channel mixing - * @session_type: indicates session is of type TX or RX - * @stream_type: indicates either Audio or Listen stream type - */ -int msm_pcm_routing_send_chmix_cfg(int fe_id, int ip_channel_cnt, - int op_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type) -{ - - int rc = 0, idx = 0; - int be_index = 0, port_id; - unsigned int session_id = 0; - - pr_debug("%s:fe_id[%d] ip_ch[%d] op_ch[%d] sess_type [%d], stream_type[%d]", - __func__, fe_id, ip_channel_cnt, op_channel_cnt, session_type, - stream_type); - if (!is_mm_lsm_fe_id(fe_id)) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID %d\n", __func__, fe_id); - return -EINVAL; - } - - if (ch_wght_coeff == NULL) { - pr_err("%s: Null channel weightage coefficients passed\n", - __func__); - return -EINVAL; - } - - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - port_id = msm_bedais[be_index].port_id; - if (!msm_bedais[be_index].active || - !test_bit(fe_id, &msm_bedais[be_index].fe_sessions[0])) - continue; - - session_id = fe_dai_map[fe_id][session_type].strm_id; - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - unsigned long copp = - session_copp_map[fe_id][session_type][be_index]; - if (!test_bit(idx, &copp)) - continue; - msm_qti_pp_send_chmix_cfg_cmd(port_id, idx, - session_id, ip_channel_cnt, - op_channel_cnt, ch_wght_coeff, - session_type, stream_type); - if (rc < 0) - pr_err("%s: err setting channel mix config\n", - __func__); - } - } - - return 0; -} -EXPORT_SYMBOL(msm_pcm_routing_send_chmix_cfg); - -int msm_pcm_routing_reg_stream_app_type_cfg( - int fedai_id, int session_type, int be_id, - struct msm_pcm_stream_app_type_cfg *cfg_data) -{ - int ret = 0; - - if (cfg_data == NULL) { - pr_err("%s: Received NULL pointer for cfg_data\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fedai_id, session_type, be_id, - cfg_data->app_type, cfg_data->acdb_dev_id, - cfg_data->sample_rate); - - if (!is_mm_lsm_fe_id(fedai_id)) { - pr_err("%s: Invalid machine driver ID %d\n", - __func__, fedai_id); - ret = -EINVAL; - goto done; - } - if (session_type != SESSION_TYPE_RX && - session_type != SESSION_TYPE_TX) { - pr_err("%s: Invalid session type %d\n", - __func__, session_type); - ret = -EINVAL; - goto done; - } - if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Received out of bounds be_id %d\n", - __func__, be_id); - ret = -EINVAL; - goto done; - } - - fe_dai_app_type_cfg[fedai_id][session_type][be_id] = *cfg_data; - - /* - * Store the BE ID of the configuration information set as the latest so - * the get mixer control knows what to return. - */ - last_be_id_configured[fedai_id][session_type] = be_id; - -done: - return ret; -} -EXPORT_SYMBOL(msm_pcm_routing_reg_stream_app_type_cfg); - -/** - * msm_pcm_routing_get_stream_app_type_cfg - * - * Receives fedai_id, session_type, be_id, and populates app_type, - * acdb_dev_id, & sample rate. Returns 0 on success. On failure returns - * -EINVAL and does not alter passed values. - * - * fedai_id - Passed value, front end ID for which app type config is wanted - * session_type - Passed value, session type for which app type config - * is wanted - * be_id - Returned value, back end device id the app type config data is for - * cfg_data - Returned value, configuration data used by app type config - */ -int msm_pcm_routing_get_stream_app_type_cfg( - int fedai_id, int session_type, int *bedai_id, - struct msm_pcm_stream_app_type_cfg *cfg_data) -{ - int be_id; - int ret = 0; - - if (bedai_id == NULL) { - pr_err("%s: Received NULL pointer for backend ID\n", __func__); - ret = -EINVAL; - goto done; - } else if (cfg_data == NULL) { - pr_err("%s: NULL pointer sent for cfg_data\n", __func__); - ret = -EINVAL; - goto done; - } else if (!is_mm_lsm_fe_id(fedai_id)) { - pr_err("%s: Invalid FE ID %d\n", __func__, fedai_id); - ret = -EINVAL; - goto done; - } else if (session_type != SESSION_TYPE_RX && - session_type != SESSION_TYPE_TX) { - pr_err("%s: Invalid session type %d\n", __func__, session_type); - ret = -EINVAL; - goto done; - } - - be_id = last_be_id_configured[fedai_id][session_type]; - if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Invalid BE ID %d\n", __func__, be_id); - ret = -EINVAL; - goto done; - } - - *bedai_id = be_id; - *cfg_data = fe_dai_app_type_cfg[fedai_id][session_type][be_id]; - pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fedai_id, session_type, *bedai_id, - cfg_data->app_type, cfg_data->acdb_dev_id, - cfg_data->sample_rate); -done: - return ret; -} -EXPORT_SYMBOL(msm_pcm_routing_get_stream_app_type_cfg); - -static struct cal_block_data *msm_routing_find_topology_by_path(int path, - int cal_index) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (((struct audio_cal_info_adm_top *)cal_block - ->cal_info)->path == path) { - return cal_block; - } - } - pr_debug("%s: Can't find topology for path %d\n", __func__, path); - return NULL; -} - -static struct cal_block_data *msm_routing_find_topology(int path, - int app_type, - int acdb_id, - int cal_index, - bool exact) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_adm_top *cal_info; - - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - cal_info = (struct audio_cal_info_adm_top *) - cal_block->cal_info; - if ((cal_info->path == path) && - (cal_info->app_type == app_type) && - (cal_info->acdb_id == acdb_id)) { - return cal_block; - } - } - pr_debug("%s: Can't find topology for path %d, app %d, " - "acdb_id %d %s\n", __func__, path, app_type, acdb_id, - exact ? "fail" : "defaulting to search by path"); - return exact ? NULL : msm_routing_find_topology_by_path(path, - cal_index); -} - -static int msm_routing_find_topology_on_index(int session_type, int app_type, - int acdb_dev_id, int idx, - bool exact) -{ - int topology = -EINVAL; - struct cal_block_data *cal_block = NULL; - - mutex_lock(&cal_data[idx]->lock); - cal_block = msm_routing_find_topology(session_type, app_type, - acdb_dev_id, idx, exact); - if (cal_block != NULL) { - topology = ((struct audio_cal_info_adm_top *) - cal_block->cal_info)->topology; - } - mutex_unlock(&cal_data[idx]->lock); - return topology; -} - -/* - * Retrieving cal_block will mark cal_block as stale. - * Hence it cannot be reused or resent unless the flag - * is reset. - */ -static int msm_routing_get_adm_topology(int fedai_id, int session_type, - int be_id) -{ - int topology = NULL_COPP_TOPOLOGY; - int app_type = 0, acdb_dev_id = 0; - - pr_debug("%s: fedai_id %d, session_type %d, be_id %d\n", - __func__, fedai_id, session_type, be_id); - - if (cal_data == NULL) - goto done; - - app_type = fe_dai_app_type_cfg[fedai_id][session_type][be_id].app_type; - acdb_dev_id = - fe_dai_app_type_cfg[fedai_id][session_type][be_id].acdb_dev_id; - - pr_debug("%s: Check for exact LSM topology\n", __func__); - topology = msm_routing_find_topology_on_index(session_type, - app_type, - acdb_dev_id, - ADM_LSM_TOPOLOGY_CAL_TYPE_IDX, - true /*exact*/); - if (topology < 0) { - pr_debug("%s: Check for compatible topology\n", __func__); - topology = msm_routing_find_topology_on_index(session_type, - app_type, - acdb_dev_id, - ADM_TOPOLOGY_CAL_TYPE_IDX, - false /*exact*/); - if (topology < 0) - topology = NULL_COPP_TOPOLOGY; - } -done: - pr_debug("%s: Using topology %d\n", __func__, topology); - return topology; -} - -static uint8_t is_be_dai_extproc(int be_dai) -{ - if (be_dai == MSM_BACKEND_DAI_EXTPROC_RX || - be_dai == MSM_BACKEND_DAI_EXTPROC_TX || - be_dai == MSM_BACKEND_DAI_EXTPROC_EC_TX) - return 1; - else - return 0; -} - -static void msm_pcm_routing_build_matrix(int fedai_id, int sess_type, - int path_type, int perf_mode, - uint32_t passthr_mode) -{ - int i, port_type, j, num_copps = 0; - struct route_payload payload; - - port_type = ((path_type == ADM_PATH_PLAYBACK || - path_type == ADM_PATH_COMPRESSED_RX) ? - MSM_AFE_PORT_TYPE_RX : MSM_AFE_PORT_TYPE_TX); - - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - unsigned long copp = - session_copp_map[fedai_id][sess_type][i]; - if (test_bit(j, &copp)) { - payload.port_id[num_copps] = - msm_bedais[i].port_id; - payload.copp_idx[num_copps] = j; - payload.app_type[num_copps] = - fe_dai_app_type_cfg - [fedai_id][sess_type][i] - .app_type; - payload.acdb_dev_id[num_copps] = - fe_dai_app_type_cfg - [fedai_id][sess_type][i] - .acdb_dev_id; - payload.sample_rate[num_copps] = - fe_dai_app_type_cfg - [fedai_id][sess_type][i] - .sample_rate; - num_copps++; - } - } - } - } - - if (num_copps) { - payload.num_copps = num_copps; - payload.session_id = fe_dai_map[fedai_id][sess_type].strm_id; - adm_matrix_map(path_type, payload, perf_mode, passthr_mode); - msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode); - } -} - -void msm_pcm_routing_reg_psthr_stream(int fedai_id, int dspst_id, - int stream_type) -{ - int i, session_type, path_type, port_type; - u32 mode = 0; - - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID\n", __func__); - return; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - session_type = SESSION_TYPE_RX; - path_type = ADM_PATH_PLAYBACK; - port_type = MSM_AFE_PORT_TYPE_RX; - } else { - session_type = SESSION_TYPE_TX; - path_type = ADM_PATH_LIVE_REC; - port_type = MSM_AFE_PORT_TYPE_TX; - } - - mutex_lock(&routing_lock); - - fe_dai_map[fedai_id][session_type].strm_id = dspst_id; - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - mode = afe_get_port_type(msm_bedais[i].port_id); - adm_connect_afe_port(mode, dspst_id, - msm_bedais[i].port_id); - break; - } - } - mutex_unlock(&routing_lock); -} - -static bool route_check_fe_id_adm_support(int fe_id) -{ - bool rc = true; - - if ((fe_id >= MSM_FRONTEND_DAI_LSM1) && - (fe_id <= MSM_FRONTEND_DAI_LSM8)) { - /* fe id is listen while port is set to afe */ - if (lsm_port_index != ADM_LSM_PORT_INDEX) { - pr_debug("%s: fe_id %d, lsm mux slim port %d\n", - __func__, fe_id, lsm_port_index); - rc = false; - } - } - - return rc; -} - -/* - * msm_pcm_routing_get_pp_ch_cnt: - * Read the processed channel count - * - * @fe_id: Front end ID - * @session_type: Inidicates RX or TX session type - */ -int msm_pcm_routing_get_pp_ch_cnt(int fe_id, int session_type) -{ - struct msm_pcm_stream_app_type_cfg cfg_data; - int be_id = 0, app_type_idx = 0, app_type = 0; - int ret = -EINVAL; - - memset(&cfg_data, 0, sizeof(cfg_data)); - - if (!is_mm_lsm_fe_id(fe_id)) { - pr_err("%s: bad MM ID\n", __func__); - return -EINVAL; - } - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret) { - pr_err("%s: cannot get stream app type cfg\n", __func__); - return ret; - } - - app_type = cfg_data.app_type; - app_type_idx = msm_pcm_routing_get_lsm_app_type_idx(app_type); - return lsm_app_type_cfg[app_type_idx].num_out_channels; -} -EXPORT_SYMBOL(msm_pcm_routing_get_pp_ch_cnt); - -int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode, - int dspst_id, int stream_type, - uint32_t passthr_mode) -{ - int i, j, session_type, path_type, port_type, topology; - int num_copps = 0; - struct route_payload payload; - u32 channels, sample_rate; - u16 bit_width = 16, be_bit_width; - bool is_lsm; - - pr_debug("%s:fe_id[%d] perf_mode[%d] id[%d] stream_type[%d] passt[%d]", - __func__, fe_id, perf_mode, dspst_id, - stream_type, passthr_mode); - if (!is_mm_lsm_fe_id(fe_id)) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID %d\n", __func__, fe_id); - return -EINVAL; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - session_type = SESSION_TYPE_RX; - if (passthr_mode != LEGACY_PCM) - path_type = ADM_PATH_COMPRESSED_RX; - else - path_type = ADM_PATH_PLAYBACK; - port_type = MSM_AFE_PORT_TYPE_RX; - } else if (stream_type == SNDRV_PCM_STREAM_CAPTURE) { - session_type = SESSION_TYPE_TX; - if ((passthr_mode != LEGACY_PCM) && (passthr_mode != LISTEN)) - path_type = ADM_PATH_COMPRESSED_TX; - else - path_type = ADM_PATH_LIVE_REC; - port_type = MSM_AFE_PORT_TYPE_TX; - } else { - pr_err("%s: invalid stream type %d\n", __func__, stream_type); - return -EINVAL; - } - - is_lsm = (fe_id >= MSM_FRONTEND_DAI_LSM1) && - (fe_id <= MSM_FRONTEND_DAI_LSM8); - mutex_lock(&routing_lock); - - fe_dai_map[fe_id][session_type].strm_id = dspst_id; - fe_dai_map[fe_id][session_type].perf_mode = perf_mode; - fe_dai_map[fe_id][session_type].passthr_mode = passthr_mode; - if (!route_check_fe_id_adm_support(fe_id)) { - /* ignore adm open if not supported for fe_id */ - pr_debug("%s: No ADM support for fe id %d\n", __func__, fe_id); - mutex_unlock(&routing_lock); - return 0; - } - - payload.num_copps = 0; /* only RX needs to use payload */ - /* re-enable EQ if active */ - msm_qti_pp_send_eq_values(fe_id); - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == - port_type) && - (msm_bedais[i].active) && - (test_bit(fe_id, &msm_bedais[i].fe_sessions[0]))) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!msm_bedais[i].adm_override_ch) - channels = msm_bedais[i].channel; - else - channels = msm_bedais[i].adm_override_ch; - - bit_width = msm_routing_get_bit_width( - msm_bedais[i].format); - app_type = - fe_dai_app_type_cfg[fe_id][session_type][i].app_type; - if (app_type && is_lsm) { - app_type_idx = - msm_pcm_routing_get_lsm_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[fe_id][session_type][i] - .sample_rate; - bit_width = - lsm_app_type_cfg[app_type_idx].bit_width; - } else if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx( - app_type); - sample_rate = - fe_dai_app_type_cfg[fe_id][session_type][i].sample_rate; - bit_width = - app_type_cfg[app_type_idx].bit_width; - } else { - sample_rate = msm_bedais[i].sample_rate; - } - acdb_dev_id = - fe_dai_app_type_cfg[fe_id][session_type][i].acdb_dev_id; - topology = msm_routing_get_adm_topology(fe_id, - session_type, - i); - if ((passthr_mode == COMPRESSED_PASSTHROUGH_DSD) - || (passthr_mode == - COMPRESSED_PASSTHROUGH_GEN) - || (passthr_mode == - COMPRESSED_PASSTHROUGH_IEC61937)) - topology = COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY; - pr_debug("%s: Before adm open topology %d\n", __func__, - topology); - - be_bit_width = msm_routing_get_bit_width( - msm_bedais[i].format); - if (hifi_filter_enabled && (msm_bedais[i].sample_rate - == 384000 || msm_bedais[i].sample_rate == - 352800) && be_bit_width == 32) - bit_width = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - - copp_idx = - adm_open(msm_bedais[i].port_id, - path_type, sample_rate, channels, - topology, perf_mode, bit_width, - app_type, acdb_dev_id); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s:adm open failed coppid:%d\n", - __func__, copp_idx); - mutex_unlock(&routing_lock); - return -EINVAL; - } - pr_debug("%s: set idx bit of fe:%d, type: %d, be:%d\n", - __func__, fe_id, session_type, i); - set_bit(copp_idx, - &session_copp_map[fe_id][session_type][i]); - - if (msm_is_resample_needed( - sample_rate, - msm_bedais[i].sample_rate)) - adm_copp_mfc_cfg( - msm_bedais[i].port_id, copp_idx, - msm_bedais[i].sample_rate); - - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - unsigned long copp = - session_copp_map[fe_id][session_type][i]; - if (test_bit(j, &copp)) { - payload.port_id[num_copps] = - msm_bedais[i].port_id; - payload.copp_idx[num_copps] = j; - payload.app_type[num_copps] = - fe_dai_app_type_cfg - [fe_id][session_type][i] - .app_type; - payload.acdb_dev_id[num_copps] = - fe_dai_app_type_cfg - [fe_id][session_type][i] - .acdb_dev_id; - payload.sample_rate[num_copps] = - fe_dai_app_type_cfg - [fe_id][session_type][i] - .sample_rate; - num_copps++; - } - } - if (passthr_mode != COMPRESSED_PASSTHROUGH_DSD - && passthr_mode != COMPRESSED_PASSTHROUGH_GEN - && passthr_mode != COMPRESSED_PASSTHROUGH_IEC61937) - msm_routing_send_device_pp_params( - msm_bedais[i].port_id, - copp_idx, fe_id); - } - } - if (num_copps) { - payload.num_copps = num_copps; - payload.session_id = fe_dai_map[fe_id][session_type].strm_id; - adm_matrix_map(path_type, payload, perf_mode, passthr_mode); - msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode); - } - mutex_unlock(&routing_lock); - return 0; -} - -static u32 msm_pcm_routing_get_voc_sessionid(u16 val) -{ - u32 session_id; - - switch (val) { - case MSM_FRONTEND_DAI_QCHAT: - session_id = voc_get_session_id(QCHAT_SESSION_NAME); - break; - case MSM_FRONTEND_DAI_VOIP: - session_id = voc_get_session_id(VOIP_SESSION_NAME); - break; - case MSM_FRONTEND_DAI_VOICEMMODE1: - session_id = voc_get_session_id(VOICEMMODE1_NAME); - break; - case MSM_FRONTEND_DAI_VOICEMMODE2: - session_id = voc_get_session_id(VOICEMMODE2_NAME); - break; - default: - session_id = 0; - } - - pr_debug("%s session_id 0x%x", __func__, session_id); - return session_id; -} - -static int msm_pcm_routing_channel_mixer(int fe_id, bool perf_mode, - int dspst_id, int stream_type) -{ - int copp_idx = 0; - int sess_type = 0; - int i = 0, j = 0, be_id; - int ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return 0; - } - - if (!(channel_mixer[fe_id].enable)) { - pr_debug("%s: channel mixer not enabled for FE %d\n", - __func__, fe_id); - return 0; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) - sess_type = SESSION_TYPE_RX; - else - sess_type = SESSION_TYPE_TX; - - for (i = 0; i < ADM_MAX_CHANNELS && channel_input[fe_id][i] > 0; - ++i) { - be_id = channel_input[fe_id][i] - 1; - channel_mixer[fe_id].input_channels[i] = - msm_bedais[be_id].channel; - - if ((msm_bedais[be_id].active) && - test_bit(fe_id, - &msm_bedais[be_id].fe_sessions[0])) { - unsigned long copp = - session_copp_map[fe_id][sess_type][be_id]; - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - if (test_bit(j, &copp)) { - copp_idx = j; - break; - } - } - - pr_debug("%s: fe %d, be %d, channel %d, copp %d\n", - __func__, - fe_id, be_id, msm_bedais[be_id].channel, - copp_idx); - ret = adm_programable_channel_mixer( - msm_bedais[be_id].port_id, - copp_idx, dspst_id, sess_type, - channel_mixer + fe_id, i); - } - } - - return ret; -} - -int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, - int dspst_id, int stream_type) -{ - int i, j, session_type, path_type, port_type, topology, num_copps = 0; - struct route_payload payload; - u32 channels, sample_rate; - uint16_t bits_per_sample = 16, be_bit_width; - uint32_t passthr_mode = LEGACY_PCM; - int ret = 0; - - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID %d\n", __func__, fedai_id); - return -EINVAL; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - session_type = SESSION_TYPE_RX; - path_type = ADM_PATH_PLAYBACK; - port_type = MSM_AFE_PORT_TYPE_RX; - } else { - session_type = SESSION_TYPE_TX; - path_type = ADM_PATH_LIVE_REC; - port_type = MSM_AFE_PORT_TYPE_TX; - } - - mutex_lock(&routing_lock); - - payload.num_copps = 0; /* only RX needs to use payload */ - fe_dai_map[fedai_id][session_type].strm_id = dspst_id; - fe_dai_map[fedai_id][session_type].perf_mode = perf_mode; - fe_dai_map[fedai_id][session_type].passthr_mode = LEGACY_PCM; - - /* re-enable EQ if active */ - msm_qti_pp_send_eq_values(fedai_id); - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!msm_bedais[i].adm_override_ch) - channels = msm_bedais[i].channel; - else - channels = msm_bedais[i].adm_override_ch; - - bits_per_sample = msm_routing_get_bit_width( - msm_bedais[i].format); - - app_type = - fe_dai_app_type_cfg[fedai_id][session_type][i].app_type; - if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[fedai_id][session_type][i] - .sample_rate; - bits_per_sample = - app_type_cfg[app_type_idx].bit_width; - } else - sample_rate = msm_bedais[i].sample_rate; - - acdb_dev_id = - fe_dai_app_type_cfg[fedai_id][session_type][i] - .acdb_dev_id; - topology = msm_routing_get_adm_topology(fedai_id, - session_type, - i); - be_bit_width = msm_routing_get_bit_width( - msm_bedais[i].format); - - if (hifi_filter_enabled && (msm_bedais[i].sample_rate == - 384000 ||msm_bedais[i].sample_rate == 352800) - && be_bit_width == 32) - bits_per_sample = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - copp_idx = adm_open(msm_bedais[i].port_id, path_type, - sample_rate, channels, topology, - perf_mode, bits_per_sample, - app_type, acdb_dev_id); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: adm open failed copp_idx:%d\n", - __func__, copp_idx); - mutex_unlock(&routing_lock); - return -EINVAL; - } - pr_debug("%s: setting idx bit of fe:%d, type: %d, be:%d\n", - __func__, fedai_id, session_type, i); - set_bit(copp_idx, - &session_copp_map[fedai_id][session_type][i]); - - if (msm_is_resample_needed( - sample_rate, - msm_bedais[i].sample_rate)) - adm_copp_mfc_cfg( - msm_bedais[i].port_id, copp_idx, - msm_bedais[i].sample_rate); - - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - unsigned long copp = - session_copp_map[fedai_id][session_type][i]; - if (test_bit(j, &copp)) { - payload.port_id[num_copps] = - msm_bedais[i].port_id; - payload.copp_idx[num_copps] = j; - payload.app_type[num_copps] = - fe_dai_app_type_cfg - [fedai_id][session_type] - [i].app_type; - payload.acdb_dev_id[num_copps] = - fe_dai_app_type_cfg - [fedai_id][session_type] - [i].acdb_dev_id; - payload.sample_rate[num_copps] = - fe_dai_app_type_cfg - [fedai_id][session_type] - [i].sample_rate; - num_copps++; - } - } - if (perf_mode == LEGACY_PCM_MODE) - msm_pcm_routing_cfg_pp(msm_bedais[i].port_id, - copp_idx, topology, channels); - } - } - if (num_copps) { - payload.num_copps = num_copps; - payload.session_id = fe_dai_map[fedai_id][session_type].strm_id; - adm_matrix_map(path_type, payload, perf_mode, passthr_mode); - msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode); - } - - ret = msm_pcm_routing_channel_mixer(fedai_id, perf_mode, - dspst_id, stream_type); - mutex_unlock(&routing_lock); - return ret; -} - -int msm_pcm_routing_reg_phy_stream_v2(int fedai_id, int perf_mode, - int dspst_id, int stream_type, - struct msm_pcm_routing_evt event_info) -{ - if (msm_pcm_routing_reg_phy_stream(fedai_id, perf_mode, dspst_id, - stream_type)) { - pr_err("%s: failed to reg phy stream\n", __func__); - return -EINVAL; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) - fe_dai_map[fedai_id][SESSION_TYPE_RX].event_info = event_info; - else - fe_dai_map[fedai_id][SESSION_TYPE_TX].event_info = event_info; - return 0; -} - -void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type) -{ - int i, port_type, session_type, path_type, topology; - struct msm_pcm_routing_fdai_data *fdai; - - if (!is_mm_lsm_fe_id(fedai_id)) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID\n", __func__); - return; - } - - if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) { - port_type = MSM_AFE_PORT_TYPE_RX; - session_type = SESSION_TYPE_RX; - path_type = ADM_PATH_PLAYBACK; - } else { - port_type = MSM_AFE_PORT_TYPE_TX; - session_type = SESSION_TYPE_TX; - path_type = ADM_PATH_LIVE_REC; - } - - mutex_lock(&routing_lock); - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (!is_be_dai_extproc(i) && - (afe_get_port_type(msm_bedais[i].port_id) == port_type) && - (msm_bedais[i].active) && - (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) { - int idx; - unsigned long copp = - session_copp_map[fedai_id][session_type][i]; - fdai = &fe_dai_map[fedai_id][session_type]; - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (test_bit(idx, &copp)) - break; - - if (idx >= MAX_COPPS_PER_PORT || idx < 0) { - pr_debug("%s: copp idx is invalid, exiting\n", - __func__); - continue; - } - topology = adm_get_topology_for_port_copp_idx( - msm_bedais[i].port_id, idx); - msm_routing_unload_topology(topology); - adm_close(msm_bedais[i].port_id, fdai->perf_mode, idx); - pr_debug("%s:copp:%ld,idx bit fe:%d,type:%d,be:%d\n", - __func__, copp, fedai_id, session_type, i); - clear_bit(idx, - &session_copp_map[fedai_id][session_type][i]); - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID || - topology == DS2_ADM_COPP_TOPOLOGY_ID) && - (fdai->perf_mode == LEGACY_PCM_MODE) && - (fdai->passthr_mode == LEGACY_PCM)) - msm_pcm_routing_deinit_pp(msm_bedais[i].port_id, - topology); - } - } - - fe_dai_map[fedai_id][session_type].strm_id = INVALID_SESSION; - fe_dai_map[fedai_id][session_type].be_srate = 0; - mutex_unlock(&routing_lock); -} - -/* Check if FE/BE route is set */ -static bool msm_pcm_routing_route_is_set(u16 be_id, u16 fe_id) -{ - bool rc = false; - - if (!is_mm_lsm_fe_id(fe_id)) { - /* recheck FE ID in the mixer control defined in this file */ - pr_err("%s: bad MM ID\n", __func__); - return rc; - } - - if (test_bit(fe_id, &msm_bedais[be_id].fe_sessions[0])) - rc = true; - - return rc; -} - -static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set) -{ - int session_type, path_type, topology; - u32 channels, sample_rate; - uint16_t bits_per_sample = 16, be_bit_width; - struct msm_pcm_routing_fdai_data *fdai; - uint32_t passthr_mode; - bool is_lsm; - - pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set); - - if (!is_mm_lsm_fe_id(val)) { - /* recheck FE ID in the mixer control defined in this file */ - pr_err("%s: bad MM ID\n", __func__); - return; - } - - if (!route_check_fe_id_adm_support(val)) { - /* ignore adm open if not supported for fe_id */ - pr_debug("%s: No ADM support for fe id %d\n", __func__, val); - return; - } - - session_type = - (afe_get_port_type(msm_bedais[reg].port_id) == MSM_AFE_PORT_TYPE_RX) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - fdai = &fe_dai_map[val][session_type]; - passthr_mode = fdai->passthr_mode; - if (session_type == SESSION_TYPE_RX) { - if (passthr_mode != LEGACY_PCM) - path_type = ADM_PATH_COMPRESSED_RX; - else - path_type = ADM_PATH_PLAYBACK; - } else { - if ((passthr_mode != LEGACY_PCM) && (passthr_mode != LISTEN)) - path_type = ADM_PATH_COMPRESSED_TX; - else - path_type = ADM_PATH_LIVE_REC; - } - is_lsm = (val >= MSM_FRONTEND_DAI_LSM1) && - (val <= MSM_FRONTEND_DAI_LSM8); - - mutex_lock(&routing_lock); - if (set) { - if (!test_bit(val, &msm_bedais[reg].fe_sessions[0]) && - ((msm_bedais[reg].port_id == VOICE_PLAYBACK_TX) || - (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX))) - voc_start_playback(set, msm_bedais[reg].port_id); - - set_bit(val, &msm_bedais[reg].fe_sessions[0]); - if (msm_bedais[reg].active && fdai->strm_id != - INVALID_SESSION) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!msm_bedais[reg].adm_override_ch) - channels = msm_bedais[reg].channel; - else - channels = msm_bedais[reg].adm_override_ch; - if (session_type == SESSION_TYPE_TX && - fdai->be_srate && - (fdai->be_srate != msm_bedais[reg].sample_rate)) { - pr_debug("%s: flush strm %d diff BE rates\n", - __func__, fdai->strm_id); - - if (fdai->event_info.event_func) - fdai->event_info.event_func( - MSM_PCM_RT_EVT_BUF_RECFG, - fdai->event_info.priv_data); - fdai->be_srate = 0; /* might not need it */ - } - - bits_per_sample = msm_routing_get_bit_width( - msm_bedais[reg].format); - - app_type = - fe_dai_app_type_cfg[val][session_type][reg].app_type; - if (app_type && is_lsm) { - app_type_idx = - msm_pcm_routing_get_lsm_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[val][session_type][reg] - .sample_rate; - bits_per_sample = - lsm_app_type_cfg[app_type_idx].bit_width; - } else if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[val][session_type][reg] - .sample_rate; - bits_per_sample = - app_type_cfg[app_type_idx].bit_width; - } else - sample_rate = msm_bedais[reg].sample_rate; - - topology = msm_routing_get_adm_topology(val, - session_type, - reg); - acdb_dev_id = - fe_dai_app_type_cfg[val][session_type][reg].acdb_dev_id; - - be_bit_width = msm_routing_get_bit_width( - msm_bedais[reg].format); - if (hifi_filter_enabled && (msm_bedais[reg].sample_rate - == 384000 ||msm_bedais[reg].sample_rate == - 352800) && be_bit_width == 32) - bits_per_sample = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - copp_idx = adm_open(msm_bedais[reg].port_id, path_type, - sample_rate, channels, topology, - fdai->perf_mode, bits_per_sample, - app_type, acdb_dev_id); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: adm open failed\n", __func__); - mutex_unlock(&routing_lock); - return; - } - pr_debug("%s: setting idx bit of fe:%d, type: %d, be:%d\n", - __func__, val, session_type, reg); - set_bit(copp_idx, - &session_copp_map[val][session_type][reg]); - - if (msm_is_resample_needed( - sample_rate, - msm_bedais[reg].sample_rate)) - adm_copp_mfc_cfg( - msm_bedais[reg].port_id, copp_idx, - msm_bedais[reg].sample_rate); - - if (session_type == SESSION_TYPE_RX && - fdai->event_info.event_func) - fdai->event_info.event_func( - MSM_PCM_RT_EVT_DEVSWITCH, - fdai->event_info.priv_data); - - msm_pcm_routing_build_matrix(val, session_type, - path_type, - fdai->perf_mode, - passthr_mode); - if ((fdai->perf_mode == LEGACY_PCM_MODE) && - (passthr_mode == LEGACY_PCM)) - msm_pcm_routing_cfg_pp(msm_bedais[reg].port_id, - copp_idx, topology, - channels); - } - } else { - if (test_bit(val, &msm_bedais[reg].fe_sessions[0]) && - ((msm_bedais[reg].port_id == VOICE_PLAYBACK_TX) || - (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX))) - voc_start_playback(set, msm_bedais[reg].port_id); - clear_bit(val, &msm_bedais[reg].fe_sessions[0]); - if (msm_bedais[reg].active && fdai->strm_id != - INVALID_SESSION) { - int idx; - int port_id; - unsigned long copp = - session_copp_map[val][session_type][reg]; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (test_bit(idx, &copp)) - break; - - if (idx >= MAX_COPPS_PER_PORT) { - pr_debug("%s: copp idx is invalid, exiting\n", - __func__); - mutex_unlock(&routing_lock); - return; - } - port_id = msm_bedais[reg].port_id; - topology = adm_get_topology_for_port_copp_idx(port_id, - idx); - msm_routing_unload_topology(topology); - adm_close(msm_bedais[reg].port_id, fdai->perf_mode, - idx); - pr_debug("%s: copp: %ld, reset idx bit fe:%d, type: %d, be:%d topology=0x%x\n", - __func__, copp, val, session_type, reg, - topology); - clear_bit(idx, - &session_copp_map[val][session_type][reg]); - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID || - topology == DS2_ADM_COPP_TOPOLOGY_ID) && - (fdai->perf_mode == LEGACY_PCM_MODE) && - (passthr_mode == LEGACY_PCM)) - msm_pcm_routing_deinit_pp( - msm_bedais[reg].port_id, - topology); - msm_pcm_routing_build_matrix(val, session_type, - path_type, - fdai->perf_mode, - passthr_mode); - } - } - if ((msm_bedais[reg].port_id == VOICE_RECORD_RX) - || (msm_bedais[reg].port_id == VOICE_RECORD_TX)) - voc_start_record(msm_bedais[reg].port_id, set, voc_session_id); - - mutex_unlock(&routing_lock); -} - -static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - if (ucontrol->value.integer.value[0] && - msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == false) { - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 1); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - } else if (!ucontrol->value.integer.value[0] && - msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == true) { - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 0); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - } - - return 1; -} - -static int msm_routing_get_listen_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_listen_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - if (ucontrol->value.integer.value[0]) { - if (msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == false) - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 1); - snd_soc_dapm_mixer_update_power(widget->dapm, - kcontrol, 1, update); - } else if (!ucontrol->value.integer.value[0]) { - if (msm_pcm_routing_route_is_set(mc->shift, mc->rshift) == true) - msm_pcm_routing_process_audio(mc->shift, mc->rshift, 0); - snd_soc_dapm_mixer_update_power(widget->dapm, - kcontrol, 0, update); - } - - return 1; -} - -static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set) -{ - u32 session_id = 0; - u16 path_type; - struct media_format_info voc_be_media_format; - - pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set); - - session_id = msm_pcm_routing_get_voc_sessionid(val); - - pr_debug("%s: FE DAI 0x%x session_id 0x%x\n", - __func__, val, session_id); - - mutex_lock(&routing_lock); - - if (set) - set_bit(val, &msm_bedais[reg].fe_sessions[0]); - else - clear_bit(val, &msm_bedais[reg].fe_sessions[0]); - - if (val == MSM_FRONTEND_DAI_DTMF_RX && - afe_get_port_type(msm_bedais[reg].port_id) == - MSM_AFE_PORT_TYPE_RX) { - pr_debug("%s(): set=%d port id=0x%x for dtmf generation\n", - __func__, set, msm_bedais[reg].port_id); - afe_set_dtmf_gen_rx_portid(msm_bedais[reg].port_id, set); - } - - if (afe_get_port_type(msm_bedais[reg].port_id) == - MSM_AFE_PORT_TYPE_RX) - path_type = RX_PATH; - else - path_type = TX_PATH; - - if (set) { - if (msm_bedais[reg].active) { - voc_set_route_flag(session_id, path_type, 1); - - memset(&voc_be_media_format, 0, - sizeof(struct media_format_info)); - - voc_be_media_format.port_id = msm_bedais[reg].port_id; - voc_be_media_format.num_channels = - msm_bedais[reg].channel; - voc_be_media_format.sample_rate = - msm_bedais[reg].sample_rate; - voc_be_media_format.bits_per_sample = - msm_bedais[reg].format; - /* Defaulting this to 1 for voice call usecases */ - voc_be_media_format.channel_mapping[0] = 1; - - voc_set_device_config(session_id, path_type, - &voc_be_media_format); - - if (voc_get_route_flag(session_id, TX_PATH) && - voc_get_route_flag(session_id, RX_PATH)) - voc_enable_device(session_id); - } else { - pr_debug("%s BE is not active\n", __func__); - } - } else { - voc_set_route_flag(session_id, path_type, 0); - voc_disable_device(session_id); - } - - mutex_unlock(&routing_lock); - -} - -static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - mutex_lock(&routing_lock); - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - mutex_unlock(&routing_lock); - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - if (ucontrol->value.integer.value[0]) { - msm_pcm_routing_process_voice(mc->shift, mc->rshift, 1); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - } else { - msm_pcm_routing_process_voice(mc->shift, mc->rshift, 0); - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - } - - return 1; -} - -static int msm_routing_get_voice_stub_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - mutex_lock(&routing_lock); - - if (test_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - mutex_unlock(&routing_lock); - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_voice_stub_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - - if (ucontrol->value.integer.value[0]) { - mutex_lock(&routing_lock); - set_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0]); - mutex_unlock(&routing_lock); - - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - } else { - mutex_lock(&routing_lock); - clear_bit(mc->rshift, &msm_bedais[mc->shift].fe_sessions[0]); - mutex_unlock(&routing_lock); - - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - } - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 1; -} - -/* - * Return the mapping between port ID and backend ID to enable the AFE callback - * to determine the acdb_dev_id from the port id - */ -int msm_pcm_get_be_id_from_port_id(int port_id) -{ - int i; - int be_id = -EINVAL; - - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (msm_bedais[i].port_id == port_id) { - be_id = i; - break; - } - } - - return be_id; -} - -/* - * Return the registered dev_acdb_id given a port ID to enable identifying the - * correct AFE calibration information by comparing the header information. - */ -static int msm_pcm_get_dev_acdb_id_by_port_id(int port_id) -{ - int acdb_id = -EINVAL; - int i = 0; - int session; - int port_type = afe_get_port_type(port_id); - int be_id = msm_pcm_get_be_id_from_port_id(port_id); - - pr_debug("%s:port_id %d be_id %d, port_type 0x%x\n", - __func__, port_id, be_id, port_type); - - if (port_type == MSM_AFE_PORT_TYPE_TX) { - session = SESSION_TYPE_TX; - } else if (port_type == MSM_AFE_PORT_TYPE_RX) { - session = SESSION_TYPE_RX; - } else { - pr_err("%s: Invalid port type %d\n", __func__, port_type); - acdb_id = -EINVAL; - goto exit; - } - - if (be_id < 0) { - pr_err("%s: Error getting backend id %d\n", __func__, be_id); - goto exit; - } - - mutex_lock(&routing_lock); - i = find_first_bit(&msm_bedais[be_id].fe_sessions[0], - MSM_FRONTEND_DAI_MAX); - if (i < MSM_FRONTEND_DAI_MAX) - acdb_id = fe_dai_app_type_cfg[i][session][be_id].acdb_dev_id; - - pr_debug("%s: FE[%d] session[%d] BE[%d] acdb_id(%d)\n", - __func__, i, session, be_id, acdb_id); - mutex_unlock(&routing_lock); -exit: - return acdb_id; -} - -static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = fm_switch_enable; - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - fm_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_hfp_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = hfp_switch_enable; - pr_debug("%s: HFP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_hfp_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: HFP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 1, update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 0, update); - hfp_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_a2dp_switch_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = a2dp_switch_enable; - pr_debug("%s: A2DP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_a2dp_switch_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: A2DP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - a2dp_switch_enable = ucontrol->value.integer.value[0]; - if (a2dp_switch_enable) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 1, update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 0, update); - return 1; -} - -static int msm_routing_get_int0_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = int0_mi2s_switch_enable; - pr_debug("%s: INT0 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_int0_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: INT0 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - int0_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_int4_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = int4_mi2s_switch_enable; - pr_debug("%s: INT4 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_int4_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: INT4 MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - int4_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_usb_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = usb_switch_enable; - pr_debug("%s: HFP Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_usb_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: USB Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 1, update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, - 0, update); - usb_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int adsp_ssr_trigger_status_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = adsp_ssr_switch_status; - pr_debug("%s: get value %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int adsp_ssr_trigger_status_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - - adsp_ssr_switch_status = ucontrol->value.integer.value[0]; - pr_debug("%s: put value %d\n", __func__, adsp_ssr_switch_status); - - if (adsp_ssr_switch_status > 0) { - ret = q6core_adsp_crash(); - pr_info("%s: trigger SSR ret %d\n", __func__, ret); - } - - adsp_ssr_switch_status = 0; - return ret; -} - -static int msm_routing_get_pri_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = pri_mi2s_switch_enable; - pr_debug("%s: PRI MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_pri_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: PRI MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - pri_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_sec_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = sec_mi2s_switch_enable; - pr_debug("%s: SEC MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_sec_mi2s_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: SEC MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - sec_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_tert_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = tert_mi2s_switch_enable; - pr_debug("%s: TERT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_tert_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: TERT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - tert_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_quat_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = quat_mi2s_switch_enable; - pr_debug("%s: QUAT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_quat_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: QUAT MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - quat_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_quin_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = quin_mi2s_switch_enable; - pr_debug("%s: QUIN MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_quin_mi2s_switch_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: QUIN MI2S Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - quin_mi2s_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_get_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = fm_pcmrx_switch_enable; - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_put_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct snd_soc_dapm_update *update = NULL; - - pr_debug("%s: FM Switch enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - if (ucontrol->value.integer.value[0]) - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, - update); - else - snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0, - update); - fm_pcmrx_switch_enable = ucontrol->value.integer.value[0]; - return 1; -} - -static int msm_routing_lsm_port_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = lsm_port_index; - return 0; -} - -static int msm_routing_lsm_port_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - int mux = ucontrol->value.enumerated.item[0]; - int lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; - - if (mux >= e->items) { - pr_err("%s: Invalid mux value %d\n", __func__, mux); - return -EINVAL; - } - - pr_debug("%s: LSM enable %ld\n", __func__, - ucontrol->value.integer.value[0]); - switch (ucontrol->value.integer.value[0]) { - case 1: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX; - break; - case 2: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX; - break; - case 3: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX; - break; - case 4: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX; - break; - case 5: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX; - break; - case 6: - lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; - break; - case 7: - lsm_port = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case 8: - lsm_port = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case 9: - lsm_port = ADM_LSM_PORT_ID; - break; - case 10: - lsm_port = AFE_PORT_ID_INT3_MI2S_TX; - break; - case 11: - lsm_port = AFE_PORT_ID_VA_CODEC_DMA_TX_0; - break; - case 12: - lsm_port = AFE_PORT_ID_VA_CODEC_DMA_TX_1; - break; - case 13: - lsm_port = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - break; - case 14: - lsm_port = AFE_PORT_ID_QUINARY_TDM_TX; - break; - default: - pr_err("Default lsm port"); - break; - } - set_lsm_port(lsm_port); - lsm_port_index = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_routing_lsm_func_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - u16 port_id; - enum afe_mad_type mad_type; - - pr_debug("%s: enter\n", __func__); - for (i = 0; i < ARRAY_SIZE(lsm_port_text); i++) - if (!strnstr(kcontrol->id.name, lsm_port_text[i], - strlen(lsm_port_text[i]))) - break; - - if (i-- == ARRAY_SIZE(lsm_port_text)) { - pr_warn("%s: Invalid id name %s\n", __func__, - kcontrol->id.name); - return -EINVAL; - } - - port_id = i * 2 + 1 + SLIMBUS_0_RX; - - /*Check for Tertiary/Quaternary/INT3 TX port*/ - if (strnstr(kcontrol->id.name, lsm_port_text[7], - strlen(lsm_port_text[7]))) - port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[8], - strlen(lsm_port_text[8]))) - port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[10], - strlen(lsm_port_text[10]))) - port_id = AFE_PORT_ID_INT3_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[13], - strlen(lsm_port_text[13]))) - port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - - if (strnstr(kcontrol->id.name, lsm_port_text[14], - strlen(lsm_port_text[14]))) - port_id = AFE_PORT_ID_QUINARY_TDM_TX; - - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - switch (mad_type) { - case MAD_HW_NONE: - ucontrol->value.integer.value[0] = MADNONE; - break; - case MAD_HW_AUDIO: - ucontrol->value.integer.value[0] = MADAUDIO; - break; - case MAD_HW_BEACON: - ucontrol->value.integer.value[0] = MADBEACON; - break; - case MAD_HW_ULTRASOUND: - ucontrol->value.integer.value[0] = MADULTRASOUND; - break; - case MAD_SW_AUDIO: - ucontrol->value.integer.value[0] = MADSWAUDIO; - break; - default: - pr_warn("%s: Unknown\n", __func__); - return -EINVAL; - } - return 0; -} - -static int msm_routing_lsm_func_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i; - u16 port_id; - enum afe_mad_type mad_type; - - pr_debug("%s: enter\n", __func__); - for (i = 0; i < ARRAY_SIZE(lsm_port_text); i++) - if (strnstr(kcontrol->id.name, lsm_port_text[i], - strlen(lsm_port_text[i]))) - break; - - if (i-- == ARRAY_SIZE(lsm_port_text)) { - pr_warn("%s: Invalid id name %s\n", __func__, - kcontrol->id.name); - return -EINVAL; - } - - port_id = i * 2 + 1 + SLIMBUS_0_RX; - switch (ucontrol->value.integer.value[0]) { - case MADNONE: - mad_type = MAD_HW_NONE; - break; - case MADAUDIO: - mad_type = MAD_HW_AUDIO; - break; - case MADBEACON: - mad_type = MAD_HW_BEACON; - break; - case MADULTRASOUND: - mad_type = MAD_HW_ULTRASOUND; - break; - case MADSWAUDIO: - mad_type = MAD_SW_AUDIO; - break; - default: - pr_warn("%s: Unknown\n", __func__); - return -EINVAL; - } - - /*Check for Tertiary/Quaternary/INT3 TX port*/ - if (strnstr(kcontrol->id.name, lsm_port_text[7], - strlen(lsm_port_text[7]))) - port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[8], - strlen(lsm_port_text[8]))) - port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[10], - strlen(lsm_port_text[10]))) - port_id = AFE_PORT_ID_INT3_MI2S_TX; - - if (strnstr(kcontrol->id.name, lsm_port_text[13], - strlen(lsm_port_text[13]))) - port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - - if (strnstr(kcontrol->id.name, lsm_port_text[14], - strlen(lsm_port_text[14]))) - port_id = AFE_PORT_ID_QUINARY_TDM_TX; - - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - return afe_port_set_mad_type(port_id, mad_type); -} - -static const char *const adm_override_chs_text[] = {"Zero", "One", "Two"}; - -static SOC_ENUM_SINGLE_EXT_DECL(slim_7_rx_adm_override_chs, - adm_override_chs_text); - -static int msm_routing_adm_get_backend_idx(struct snd_kcontrol *kcontrol) -{ - int backend_id; - - if (strnstr(kcontrol->id.name, "SLIM7_RX", sizeof("SLIM7_RX"))) { - backend_id = MSM_BACKEND_DAI_SLIMBUS_7_RX; - } else { - pr_err("%s: unsupported backend id: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return backend_id; -} -static int msm_routing_adm_channel_config_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int backend_id = msm_routing_adm_get_backend_idx(kcontrol); - - if (backend_id >= 0) { - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = - msm_bedais[backend_id].adm_override_ch; - pr_debug("%s: adm channel count %ld for BE:%d\n", __func__, - ucontrol->value.integer.value[0], backend_id); - mutex_unlock(&routing_lock); - } - - return 0; -} - -static int msm_routing_adm_channel_config_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int backend_id = msm_routing_adm_get_backend_idx(kcontrol); - - if (backend_id >= 0) { - mutex_lock(&routing_lock); - msm_bedais[backend_id].adm_override_ch = - ucontrol->value.integer.value[0]; - pr_debug("%s:updating BE :%d adm channels: %d\n", - __func__, backend_id, - msm_bedais[backend_id].adm_override_ch); - mutex_unlock(&routing_lock); - } - - return 0; -} - -static const struct snd_kcontrol_new adm_channel_config_controls[] = { - SOC_ENUM_EXT("SLIM7_RX ADM Channels", slim_7_rx_adm_override_chs, - msm_routing_adm_channel_config_get, - msm_routing_adm_channel_config_put), -}; - -static int msm_routing_slim_0_rx_aanc_mux_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = slim0_rx_aanc_fb_port; - mutex_unlock(&routing_lock); - pr_debug("%s: AANC Mux Port %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -}; - -static int msm_routing_slim_0_rx_aanc_mux_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct aanc_data aanc_info; - - mutex_lock(&routing_lock); - memset(&aanc_info, 0x00, sizeof(aanc_info)); - pr_debug("%s: AANC Mux Port %ld\n", __func__, - ucontrol->value.integer.value[0]); - slim0_rx_aanc_fb_port = ucontrol->value.integer.value[0]; - if (ucontrol->value.integer.value[0] == 0) { - aanc_info.aanc_active = false; - aanc_info.aanc_tx_port = 0; - aanc_info.aanc_rx_port = 0; - } else { - aanc_info.aanc_active = true; - aanc_info.aanc_rx_port = SLIMBUS_0_RX; - aanc_info.aanc_tx_port = - (SLIMBUS_0_RX - 1 + (slim0_rx_aanc_fb_port * 2)); - } - afe_set_aanc_info(&aanc_info); - mutex_unlock(&routing_lock); - return 0; -}; -static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = 0, shift = 0; - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - idx = mc->rshift/(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - shift = mc->rshift%(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - - if (idx >= BE_DAI_PORT_SESSIONS_IDX_MAX) { - pr_err("%s: Invalid idx = %d\n", __func__, idx); - return -EINVAL; - } - - if (test_bit(shift, - (unsigned long *)&msm_bedais[mc->shift].port_sessions[idx])) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - pr_debug("%s: shift %x rshift %x val %ld\n", __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int msm_routing_put_port_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = 0, shift = 0; - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - idx = mc->rshift/(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - shift = mc->rshift%(sizeof(msm_bedais[mc->shift].port_sessions[0]) * 8); - - if (idx >= BE_DAI_PORT_SESSIONS_IDX_MAX) { - pr_err("%s: Invalid idx = %d\n", __func__, idx); - return -EINVAL; - } - - pr_debug("%s: shift 0x%x rshift 0x%x val %ld idx %d reminder shift %d\n", - __func__, mc->shift, mc->rshift, - ucontrol->value.integer.value[0], idx, shift); - - if (ucontrol->value.integer.value[0]) { - afe_loopback(1, msm_bedais[mc->shift].port_id, - msm_bedais[mc->rshift].port_id); - set_bit(shift, - (unsigned long *)&msm_bedais[mc->shift].port_sessions[idx]); - } else { - afe_loopback(0, msm_bedais[mc->shift].port_id, - msm_bedais[mc->rshift].port_id); - clear_bit(shift, - (unsigned long *)&msm_bedais[mc->shift].port_sessions[idx]); - } - - return 1; -} - -static int msm_pcm_get_channel_rule_index(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = channel_mixer[fe_id].rule; - - return 0; -} - -static int msm_pcm_put_channel_rule_index(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - channel_mixer[fe_id].rule = ucontrol->value.integer.value[0]; - - return 1; -} - -static int msm_pcm_get_out_chs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - ucontrol->value.integer.value[0] = - channel_mixer[fe_id].output_channel; - return 0; -} - -static int msm_pcm_put_out_chs(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: fe_id is %d, output channels = %d\n", __func__, - fe_id, - (unsigned int)(ucontrol->value.integer.value[0])); - channel_mixer[fe_id].output_channel = - (unsigned int)(ucontrol->value.integer.value[0]); - - return 1; -} - -static const char *const ch_mixer[] = {"Disable", "Enable"}; - -/* If new backend is added, need update this array */ -static const char *const be_name[] = { -"ZERO", "PRI_I2S_RX", "PRI_I2S_TX", "SLIM_0_RX", -"SLIM_0_TX", "HDMI_RX", "INT_BT_SCO_RX", "INT_BT_SCO_TX", -"INT_FM_RX", "INT_FM_TX", "AFE_PCM_RX", "AFE_PCM_TX", -"AUXPCM_RX", "AUXPCM_TX", "VOICE_PLAYBACK_TX", "VOICE2_PLAYBACK_TX", -"INCALL_RECORD_RX", "INCALL_RECORD_TX", "MI2S_RX", "MI2S_TX", -"SEC_I2S_RX", "SLIM_1_RX", "SLIM_1_TX", "SLIM_2_RX", -"SLIM_2_TX", "SLIM_3_RX", "SLIM_3_TX", "SLIM_4_RX", -"SLIM_4_TX", "SLIM_5_RX", "SLIM_5_TX", "SLIM_6_RX", -"SLIM_6_TX", "SLIM_7_RX", "SLIM_7_TX", "SLIM_8_RX", -"SLIM_8_TX", "EXTPROC_RX", "EXTPROC_TX", "EXPROC_EC_TX", -"QUAT_MI2S_RX", "QUAT_MI2S_TX", "SECOND_MI2S_RX", "SECOND_MI2S_TX", -"PRI_MI2S_RX", "PRI_MI2S_TX", "TERT_MI2S_RX", "TERT_MI2S_TX", -"AUDIO_I2S_RX", "SEC_AUXPCM_RX", "SEC_AUXPCM_TX", "PRI_SPDIF_RX", -"SECOND_MI2S_RX_SD1", "QUIN_MI2S_RX", "QUIN_MI2S_TX", "SENARY_MI2S_TX", -"PRI_TDM_RX_0", "PRI_TDM_TX_0", "PRI_TDM_RX_1", "PRI_TDM_TX_1", -"PRI_TDM_RX_2", "PRI_TDM_TX_2", "PRI_TDM_RX_3", "PRI_TDM_TX_3", -"PRI_TDM_RX_4", "PRI_TDM_TX_4", "PRI_TDM_RX_5", "PRI_TDM_TX_5", -"PRI_TDM_RX_6", "PRI_TDM_TX_6", "PRI_TDM_RX_7", "PRI_TDM_TX_7", -"SEC_TDM_RX_0", "SEC_TDM_TX_0", "SEC_TDM_RX_1", "SEC_TDM_TX_1", -"SEC_TDM_RX_2", "SEC_TDM_TX_2", "SEC_TDM_RX_3", "SEC_TDM_TX_3", -"SEC_TDM_RX_4", "SEC_TDM_TX_4", "SEC_TDM_RX_5", "SEC_TDM_TX_5", -"SEC_TDM_RX_6", "SEC_TDM_TX_6", "SEC_TDM_RX_7", "SEC_TDM_TX_7", -"TERT_TDM_RX_0", "TERT_TDM_TX_0", "TERT_TDM_RX_1", "TERT_TDM_TX_1", -"TERT_TDM_RX_2", "TERT_TDM_TX_2", "TERT_TDM_RX_3", "TERT_TDM_TX_3", -"TERT_TDM_RX_4", "TERT_TDM_TX_4", "TERT_TDM_RX_5", "TERT_TDM_TX_5", -"TERT_TDM_RX_6", "TERT_TDM_TX_6", "TERT_TDM_RX_7", "TERT_TDM_TX_7", -"QUAT_TDM_RX_0", "QUAT_TDM_TX_0", "QUAT_TDM_RX_1", "QUAT_TDM_TX_1", -"QUAT_TDM_RX_2", "QUAT_TDM_TX_2", "QUAT_TDM_RX_3", "QUAT_TDM_TX_3", -"QUAT_TDM_RX_4", "QUAT_TDM_TX_4", "QUAT_TDM_RX_5", "QUAT_TDM_TX_5", -"QUAT_TDM_RX_6", "QUAT_TDM_TX_6", "QUAT_TDM_RX_7", "QUAT_TDM_TX_7", -"QUIN_TDM_RX_0", "QUIN_TDM_TX_0", "QUIN_TDM_RX_1", "QUIN_TDM_TX_1", -"QUIN_TDM_RX_2", "QUIN_TDM_TX_2", "QUIN_TDM_RX_3", "QUIN_TDM_TX_3", -"QUIN_TDM_RX_4", "QUIN_TDM_TX_4", "QUIN_TDM_RX_5", "QUIN_TDM_TX_5", -"QUIN_TDM_RX_6", "QUIN_TDM_TX_6", "QUIN_TDM_RX_7", "QUIN_TDM_TX_7", -"INT_BT_A2DP_RX", "USB_RX", "USB_TX", "DISPLAY_PORT_RX", "DISPLAY_PORT_RX1", -"TERT_AUXPCM_RX", "TERT_AUXPCM_TX", "QUAT_AUXPCM_RX", "QUAT_AUXPCM_TX", -"QUIN_AUXPCM_RX", "QUIN_AUXPCM_TX", -"INT0_MI2S_RX", "INT0_MI2S_TX", "INT1_MI2S_RX", "INT1_MI2S_TX", -"INT2_MI2S_RX", "INT2_MI2S_TX", "INT3_MI2S_RX", "INT3_MI2S_TX", -"INT4_MI2S_RX", "INT4_MI2S_TX", "INT5_MI2S_RX", "INT5_MI2S_TX", -"INT6_MI2S_RX", "INT6_MI2S_TX", "WSA_CDC_DMA_RX_0", -"WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_RX_1", "WSA_CDC_DMA_TX_1", -"WSA_CDC_DMA_TX_2", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_1", -"RX_CDC_DMA_RX_0", "TX_CDC_DMA_TX_0", "RX_CDC_DMA_RX_1", "TX_CDC_DMA_TX_1", -"RX_CDC_DMA_RX_2", "TX_CDC_DMA_TX_2", "RX_CDC_DMA_RX_3", "TX_CDC_DMA_TX_3", -"RX_CDC_DMA_RX_4", "TX_CDC_DMA_TX_4", "RX_CDC_DMA_RX_5", "TX_CDC_DMA_TX_5", -"RX_CDC_DMA_RX_6", "RX_CDC_DMA_RX_7", -"PRI_SPDIF_TX", "SEC_SPDIF_RX", "SEC_SPDIF_TX", "PROXY_RX", "PROXY_TX", -}; - -static SOC_ENUM_SINGLE_DECL(mm1_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm2_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA2, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm3_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA3, ch_mixer); -static SOC_ENUM_SINGLE_DECL(mm4_channel_mux, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA4, ch_mixer); - -static SOC_ENUM_DOUBLE_DECL(mm1_ch1_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 0, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch2_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 1, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch3_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 2, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch4_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 3, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch5_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 4, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch6_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 5, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch7_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 6, be_name); -static SOC_ENUM_DOUBLE_DECL(mm1_ch8_enum, - SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 7, be_name); - -static int msm_pcm_get_ctl_enum_info(struct snd_ctl_elem_info *uinfo, - unsigned int channels, - unsigned int items, const char *const names[]) -{ - if (uinfo->value.enumerated.item >= items) - uinfo->value.enumerated.item = items - 1; - - WARN(strlen(names[uinfo->value.enumerated.item]) >= - sizeof(uinfo->value.enumerated.name), - "ALSA: too long item name '%s'\n", - names[uinfo->value.enumerated.item]); - strlcpy(uinfo->value.enumerated.name, - names[uinfo->value.enumerated.item], - sizeof(uinfo->value.enumerated.name)); - return 0; -} - -static int msm_pcm_channel_mixer_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - - uinfo->value.enumerated.items = ARRAY_SIZE(ch_mixer); - msm_pcm_get_ctl_enum_info(uinfo, 1, e->items, e->texts); - - return 0; -} -static int msm_pcm_channel_mixer_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_enum *) - kcontrol->private_value)->shift_l; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: FE %d %s\n", __func__, - fe_id, - channel_mixer[fe_id].enable ? "Enabled" : "Disabled"); - ucontrol->value.enumerated.item[0] = channel_mixer[fe_id].enable; - return 0; -} - -static int msm_pcm_channel_mixer_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0; - - fe_id = ((struct soc_enum *) - kcontrol->private_value)->shift_l; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - - channel_mixer[fe_id].enable = ucontrol->value.enumerated.item[0]; - pr_debug("%s: %s FE %d\n", __func__, - channel_mixer[fe_id].enable ? "Enable" : "Disable", - fe_id); - return 0; -} - -static int msm_pcm_channel_input_be_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; - uinfo->count = 1; - - uinfo->value.enumerated.items = ARRAY_SIZE(be_name); - msm_pcm_get_ctl_enum_info(uinfo, 1, e->items, e->texts); - - return 0; -} - -static int msm_pcm_channel_input_be_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - u16 fe_id = 0, in_ch = 0; - - fe_id = e->shift_l; - in_ch = e->shift_r; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (in_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, in_ch); - return -EINVAL; - } - - channel_input[fe_id][in_ch] = ucontrol->value.enumerated.item[0]; - return 1; -} - -static int msm_pcm_channel_input_be_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - u16 fe_id = 0, in_ch = 0; - - fe_id = e->shift_l; - in_ch = e->shift_r; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (in_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, in_ch); - return -EINVAL; - } - - ucontrol->value.enumerated.item[0] = channel_input[fe_id][in_ch]; - return 1; -} - - -static int msm_pcm_channel_weight_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = ADM_MAX_CHANNELS; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = WEIGHT_0_DB; - - return 0; -} - -static int msm_pcm_channel_weight_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0, out_ch = 0; - int i, weight; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - out_ch = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->rshift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (out_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, out_ch); - return -EINVAL; - } - - pr_debug("%s: FE_ID: %d, channel weight %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld\n", - __func__, fe_id, - ucontrol->value.integer.value[0], - ucontrol->value.integer.value[1], - ucontrol->value.integer.value[2], - ucontrol->value.integer.value[3], - ucontrol->value.integer.value[4], - ucontrol->value.integer.value[5], - ucontrol->value.integer.value[6], - ucontrol->value.integer.value[7]); - - for (i = 0; i < ADM_MAX_CHANNELS; ++i) { - weight = ucontrol->value.integer.value[i]; - channel_mixer[fe_id].channel_weight[out_ch][i] = weight; - pr_debug("%s: FE_ID %d, output %d input %d weight %d\n", - __func__, fe_id, out_ch, i, - channel_mixer[fe_id].channel_weight[out_ch][i]); - } - - return 0; -} - -static int msm_pcm_channel_weight_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 fe_id = 0, out_ch = 0; - int i; - - fe_id = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - out_ch = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->rshift; - if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_err("%s: invalid FE %d\n", __func__, fe_id); - return -EINVAL; - } - if (out_ch >= ADM_MAX_CHANNELS) { - pr_err("%s: invalid input channel %d\n", __func__, out_ch); - return -EINVAL; - } - - for (i = 0; i < ADM_MAX_CHANNELS; ++i) - ucontrol->value.integer.value[i] = - channel_mixer[fe_id].channel_weight[out_ch][i]; - - pr_debug("%s: FE_ID: %d, weight %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld", - __func__, fe_id, - ucontrol->value.integer.value[0], - ucontrol->value.integer.value[1], - ucontrol->value.integer.value[2], - ucontrol->value.integer.value[3], - ucontrol->value.integer.value[4], - ucontrol->value.integer.value[5], - ucontrol->value.integer.value[6], - ucontrol->value.integer.value[7]); - - return 0; -} - -static const struct snd_kcontrol_new channel_mixer_controls[] = { - SOC_SINGLE_EXT("MultiMedia1 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia2 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia3 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia4 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA4, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia5 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA5, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - SOC_SINGLE_EXT("MultiMedia6 Channel Rule", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA6, 8, 0, - msm_pcm_get_channel_rule_index, - msm_pcm_put_channel_rule_index), - - SOC_SINGLE_EXT("MultiMedia1 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia2 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia3 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia4 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA4, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia5 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA5, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - SOC_SINGLE_EXT("MultiMedia6 Channels", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA6, 8, 0, - msm_pcm_get_out_chs, - msm_pcm_put_out_chs), - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm1_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm2_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia3 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm3_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia4 Channel Mixer", - .info = msm_pcm_channel_mixer_info, - .get = msm_pcm_channel_mixer_get, - .put = msm_pcm_channel_mixer_put, - .private_value = (unsigned long)&(mm4_channel_mux) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 1, } - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel4", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 3,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel5", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 4,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel6", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 5,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel7", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 6,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Output Channel8", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 7,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA2, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA2, .rshift = 1,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia2 Output Channel3", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA2, .rshift = 2,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia3 Output Channel1", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA3, .rshift = 0,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia3 Output Channel2", - .info = msm_pcm_channel_weight_info, - .get = msm_pcm_channel_weight_get, - .put = msm_pcm_channel_weight_put, - .private_value = (unsigned long)&(struct soc_multi_mixer_control) - {.shift = MSM_FRONTEND_DAI_MULTIMEDIA3, .rshift = 1,} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel1", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch1_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel2", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch2_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel3", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch3_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel4", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch4_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel5", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch5_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel6", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch6_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel7", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch7_enum) - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .name = "MultiMedia1 Channel8", - .info = msm_pcm_channel_input_be_info, - .get = msm_pcm_channel_input_be_get, - .put = msm_pcm_channel_input_be_put, - .private_value = (unsigned long)&(mm1_ch8_enum) - }, -}; -static int msm_ec_ref_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_ec_ref_ch; - pr_debug("%s: msm_ec_ref_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_ec_ref_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_ec_ref_ch = ucontrol->value.integer.value[0]; - pr_debug("%s: msm_ec_ref_ch = %d\n", __func__, msm_ec_ref_ch); - adm_num_ec_ref_rx_chans(msm_ec_ref_ch); - return 0; -} - -static const char *const ec_ref_ch_text[] = {"Zero", "One", "Two", "Three", - "Four", "Five", "Six", "Seven", "Eight"}; - -static int msm_ec_ref_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (msm_ec_ref_bit_format) { - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S16_LE: - ucontrol->value.integer.value[0] = 1; - break; - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: msm_ec_ref_bit_format = %ld\n", - __func__, ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_ec_ref_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u16 bit_width = 0; - - switch (ucontrol->value.integer.value[0]) { - case 2: - msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 1: - msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - default: - msm_ec_ref_bit_format = 0; - break; - } - - if (msm_ec_ref_bit_format == SNDRV_PCM_FORMAT_S16_LE) - bit_width = 16; - else if (msm_ec_ref_bit_format == SNDRV_PCM_FORMAT_S24_LE) - bit_width = 24; - - pr_debug("%s: msm_ec_ref_bit_format = %d\n", - __func__, msm_ec_ref_bit_format); - adm_ec_ref_rx_bit_width(bit_width); - return 0; -} - -static char const *ec_ref_bit_format_text[] = {"0", "S16_LE", "S24_LE"}; - -static int msm_ec_ref_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_ec_ref_sampling_rate; - pr_debug("%s: msm_ec_ref_sampling_rate = %ld\n", - __func__, ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_ec_ref_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 0: - msm_ec_ref_sampling_rate = 0; - break; - case 1: - msm_ec_ref_sampling_rate = 8000; - break; - case 2: - msm_ec_ref_sampling_rate = 16000; - break; - case 3: - msm_ec_ref_sampling_rate = 32000; - break; - case 4: - msm_ec_ref_sampling_rate = 44100; - break; - case 5: - msm_ec_ref_sampling_rate = 48000; - break; - case 6: - msm_ec_ref_sampling_rate = 96000; - break; - case 7: - msm_ec_ref_sampling_rate = 192000; - break; - case 8: - msm_ec_ref_sampling_rate = 384000; - break; - default: - msm_ec_ref_sampling_rate = 48000; - break; - } - pr_debug("%s: msm_ec_ref_sampling_rate = %d\n", - __func__, msm_ec_ref_sampling_rate); - adm_ec_ref_rx_sampling_rate(msm_ec_ref_sampling_rate); - return 0; -} - -static const char *const ec_ref_rate_text[] = {"0", "8000", "16000", - "32000", "44100", "48000", "96000", "192000", "384000"}; - -static const struct soc_enum msm_route_ec_ref_params_enum[] = { - SOC_ENUM_SINGLE_EXT(9, ec_ref_ch_text), - SOC_ENUM_SINGLE_EXT(3, ec_ref_bit_format_text), - SOC_ENUM_SINGLE_EXT(9, ec_ref_rate_text), -}; - -static const struct snd_kcontrol_new ec_ref_param_controls[] = { - SOC_ENUM_EXT("EC Reference Channels", msm_route_ec_ref_params_enum[0], - msm_ec_ref_ch_get, msm_ec_ref_ch_put), - SOC_ENUM_EXT("EC Reference Bit Format", msm_route_ec_ref_params_enum[1], - msm_ec_ref_bit_format_get, msm_ec_ref_bit_format_put), - SOC_ENUM_EXT("EC Reference SampleRate", msm_route_ec_ref_params_enum[2], - msm_ec_ref_rate_get, msm_ec_ref_rate_put), -}; - -static int msm_routing_ec_ref_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - - pr_debug("%s: wakeup_ext_ec_ref = %d, voip_ext_ec_common_ref = %d", - __func__, wakeup_ext_ec_ref, voip_ext_ec_common_ref); - mutex_lock(&routing_lock); - if (!strncmp(widget->name, "AUDIO_REF_EC_UL10 MUX", strlen("AUDIO_REF_EC_UL10 MUX"))) - ucontrol->value.integer.value[0] = voip_ext_ec_common_ref; - else - ucontrol->value.integer.value[0] = wakeup_ext_ec_ref; - mutex_unlock(&routing_lock); - return 0; -} - -static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ec_ref_port_id; - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update *update = NULL; - bool state = true; - - mutex_lock(&routing_lock); - switch (ucontrol->value.integer.value[0]) { - case 0: - msm_route_ec_ref_rx = 0; - ec_ref_port_id = AFE_PORT_INVALID; - state = false; - break; - case 1: - msm_route_ec_ref_rx = 1; - ec_ref_port_id = SLIMBUS_0_RX; - break; - case 2: - msm_route_ec_ref_rx = 2; - ec_ref_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case 3: - msm_route_ec_ref_rx = 3; - ec_ref_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case 4: - msm_route_ec_ref_rx = 4; - ec_ref_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case 5: - msm_route_ec_ref_rx = 5; - ec_ref_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case 6: - msm_route_ec_ref_rx = 6; - ec_ref_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case 7: - msm_route_ec_ref_rx = 7; - ec_ref_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case 9: - msm_route_ec_ref_rx = 9; - ec_ref_port_id = SLIMBUS_5_RX; - break; - case 10: - msm_route_ec_ref_rx = 10; - ec_ref_port_id = SLIMBUS_1_TX; - break; - case 11: - msm_route_ec_ref_rx = 11; - ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_TX_1; - break; - case 12: - msm_route_ec_ref_rx = 12; - ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_RX; - break; - case 13: - msm_route_ec_ref_rx = 13; - ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_1; - break; - case 14: - msm_route_ec_ref_rx = 14; - ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_2; - break; - case 15: - msm_route_ec_ref_rx = 15; - ec_ref_port_id = SLIMBUS_6_RX; - break; - case 16: - msm_route_ec_ref_rx = 16; - ec_ref_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case 17: - msm_route_ec_ref_rx = 17; - ec_ref_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case 18: - msm_route_ec_ref_rx = 18; - ec_ref_port_id = AFE_PORT_ID_TERTIARY_TDM_TX; - break; - case 19: - msm_route_ec_ref_rx = 19; - ec_ref_port_id = AFE_PORT_ID_USB_RX; - break; - case 20: - msm_route_ec_ref_rx = 20; - ec_ref_port_id = AFE_PORT_ID_INT0_MI2S_RX; - break; - case 21: - msm_route_ec_ref_rx = 21; - ec_ref_port_id = AFE_PORT_ID_INT4_MI2S_RX; - break; - case 22: - msm_route_ec_ref_rx = 22; - ec_ref_port_id = AFE_PORT_ID_INT3_MI2S_TX; - break; - case 23: - msm_route_ec_ref_rx = 23; - ec_ref_port_id = AFE_PORT_ID_HDMI_OVER_DP_RX; - break; - case 24: - msm_route_ec_ref_rx = 24; - ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - break; - case 25: - msm_route_ec_ref_rx = 25; - ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - break; - case 26: - msm_route_ec_ref_rx = 26; - ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - break; - case 27: - msm_route_ec_ref_rx = 27; - ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - break; - case 28: - msm_route_ec_ref_rx = 28; - ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - break; - case 29: - msm_route_ec_ref_rx = 29; - ec_ref_port_id = SLIMBUS_7_RX; - break; - case 30: - msm_route_ec_ref_rx = 30; - ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_0; - break; - case 31: - msm_route_ec_ref_rx = 31; - ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_1; - break; - case 32: - msm_route_ec_ref_rx = 32; - ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_2; - break; - case 33: - msm_route_ec_ref_rx = 33; - ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_3; - break; - case 34: - msm_route_ec_ref_rx = 34; - ec_ref_port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_0; - break; - case 35: - msm_route_ec_ref_rx = 35; - ec_ref_port_id = AFE_PORT_ID_TERTIARY_TDM_RX_2; - break; - case 36: - msm_route_ec_ref_rx = 36; - ec_ref_port_id = AFE_PORT_ID_SECONDARY_TDM_TX; - break; - default: - msm_route_ec_ref_rx = 0; /* NONE */ - pr_err("%s EC ref rx %ld not valid\n", - __func__, ucontrol->value.integer.value[0]); - ec_ref_port_id = AFE_PORT_INVALID; - state = false; - break; - } - - pr_debug("%s: msm_route_ec_ref_rx = %d\n", - __func__, msm_route_ec_ref_rx); - - if (!strncmp(widget->name, "AUDIO_REF_EC_UL10 MUX", strlen("AUDIO_REF_EC_UL10 MUX"))) - voip_ext_ec_common_ref = msm_route_ec_ref_rx; - else - wakeup_ext_ec_ref = msm_route_ec_ref_rx; - pr_debug("%s: state %d, wakeup_ext_ec_ref %d, voip_ext_ec_common_ref %d\n", __func__, - state, wakeup_ext_ec_ref, voip_ext_ec_common_ref); - - if (state || (!state && wakeup_ext_ec_ref == 0 && voip_ext_ec_common_ref == 0)) { - pr_info("%s: update state!\n", __func__); - adm_ec_ref_rx_id(ec_ref_port_id); - mutex_unlock(&routing_lock); - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, - msm_route_ec_ref_rx, e, update); - } else { - mutex_unlock(&routing_lock); - } - return 0; -} - -static const char *const ec_ref_rx[] = { "None", "SLIM_RX", "I2S_RX", - "PRI_MI2S_TX", "SEC_MI2S_TX", - "TERT_MI2S_TX", "QUAT_MI2S_TX", "SEC_I2S_RX", "PROXY_RX", - "SLIM_5_RX", "SLIM_1_TX", "QUAT_TDM_TX_1", - "QUAT_TDM_RX_0", "QUAT_TDM_RX_1", "QUAT_TDM_RX_2", "SLIM_6_RX", - "TERT_MI2S_RX", "QUAT_MI2S_RX", "TERT_TDM_TX_0", "USB_AUDIO_RX", - "INT0_MI2S_RX", "INT4_MI2S_RX", "INT3_MI2S_TX", "DISPLAY_PORT", - "WSA_CDC_DMA_RX_0", "WSA_CDC_DMA_RX_1", - "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_2", - "SLIM_7_RX", "RX_CDC_DMA_RX_0", "RX_CDC_DMA_RX_1", "RX_CDC_DMA_RX_2", - "RX_CDC_DMA_RX_3", "TX_CDC_DMA_TX_0", "TERT_TDM_RX_2", "SEC_TDM_TX_0", -}; - -static const struct soc_enum msm_route_ec_ref_rx_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ec_ref_rx), ec_ref_rx), -}; - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul1 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL1 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul2 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL2 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul3 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL3 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul4 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL4 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul5 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL5 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul6 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL6 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul8 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL8 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul9 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL9 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul16 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL16 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul10 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL10 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul17 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL17 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul18 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL18 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul19 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL19 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul28 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL28 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static const struct snd_kcontrol_new ext_ec_ref_mux_ul29 = - SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL29 MUX Mux", - msm_route_ec_ref_rx_enum[0], - msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put); - -static int msm_routing_ext_ec_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: ext_ec_ref_rx = %x\n", __func__, msm_route_ext_ec_ref); - - mutex_lock(&routing_lock); - ucontrol->value.integer.value[0] = msm_route_ext_ec_ref; - mutex_unlock(&routing_lock); - return 0; -} - -static int msm_routing_ext_ec_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_widget *widget = - snd_soc_dapm_kcontrol_widget(kcontrol); - int mux = ucontrol->value.enumerated.item[0]; - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - int ret = 1; - bool state = true; - uint16_t ext_ec_ref_port_id; - struct snd_soc_dapm_update *update = NULL; - - if (mux >= e->items) { - pr_err("%s: Invalid mux value %d\n", __func__, mux); - return -EINVAL; - } - - mutex_lock(&routing_lock); - msm_route_ext_ec_ref = ucontrol->value.integer.value[0]; - - switch (msm_route_ext_ec_ref) { - case EXT_EC_REF_PRI_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case EXT_EC_REF_SEC_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case EXT_EC_REF_TERT_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case EXT_EC_REF_QUAT_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case EXT_EC_REF_QUIN_MI2S_TX: - ext_ec_ref_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case EXT_EC_REF_SLIM_1_TX: - ext_ec_ref_port_id = SLIMBUS_1_TX; - break; - case EXT_EC_REF_SEC_TDM_TX: - ext_ec_ref_port_id = AFE_PORT_ID_SECONDARY_TDM_TX; - break; - case EXT_EC_REF_NONE: - default: - ext_ec_ref_port_id = AFE_PORT_INVALID; - state = false; - break; - } - - pr_debug("%s: val = %d ext_ec_ref_port_id = 0x%0x state = %d\n", - __func__, msm_route_ext_ec_ref, ext_ec_ref_port_id, state); - - if (!voc_set_ext_ec_ref_port_id(ext_ec_ref_port_id, state)) { - mutex_unlock(&routing_lock); - snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, mux, e, - update); - } else { - ret = -EINVAL; - mutex_unlock(&routing_lock); - } - return ret; -} - -static const char * const ext_ec_ref_rx[] = {"NONE", "PRI_MI2S_TX", - "SEC_MI2S_TX", "TERT_MI2S_TX", - "QUAT_MI2S_TX", "QUIN_MI2S_TX", - "SLIM_1_TX", "SEC_TDM_TX"}; - -static const struct soc_enum msm_route_ext_ec_ref_rx_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ext_ec_ref_rx), ext_ec_ref_rx), -}; - -static const struct snd_kcontrol_new voc_ext_ec_mux = - SOC_DAPM_ENUM_EXT("VOC_EXT_EC MUX Mux", msm_route_ext_ec_ref_rx_enum[0], - msm_routing_ext_ec_get, msm_routing_ext_ec_put); - - -static const struct snd_kcontrol_new pri_i2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_spdif_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_spdif_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -}; - -static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new secondary_mi2s_rx2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX_SD1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - -}; - -static const struct snd_kcontrol_new int0_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int4_mi2s_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new hdmi_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new display_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new display_port1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - - /* incall music delivery mixer */ -static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new incall_music2_delivery_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_4_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_5_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_6_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_7_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_7_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new slimbus_9_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; -static const struct snd_kcontrol_new usb_audio_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int_bt_a2dp_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_auxpcm_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; -static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul1_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul2_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul3_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul4_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul5_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul6_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul8_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul16_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul9_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul10_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT2_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; -static const struct snd_kcontrol_new mmul17_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul18_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul19_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul20_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul21_mixer_controls[] = { - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul27_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul28_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new mmul29_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, - msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sec_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_6_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new usb_audio_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx1_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new pri_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new int0_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new int4_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tert_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quat_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quin_mi2s_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new sec_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tert_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quat_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quin_aux_pcm_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_7_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, -MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_8_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_2_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_1_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_0_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_1_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_2_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_3_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_4_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_5_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_6_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_7_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new stub_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new proxy_rx_voice_mixer_controls[] = { - SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_RX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_RX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voicemmode1_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT_BT_SCO_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0_MMode1", SND_SOC_NOPM, -MSM_BACKEND_DAI_QUAT_TDM_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PROXY_TX_MMode1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_TX, MSM_FRONTEND_DAI_VOICEMMODE1, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voicemmode2_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT_BT_SCO_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, - 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PROXY_TX_MMode2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PROXY_TX, MSM_FRONTEND_DAI_VOICEMMODE2, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voip_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_Voip", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOIP, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new tx_voice_stub_mixer_controls[] = { - SOC_DOUBLE_EXT("STUB_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("STUB_1_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -}; - -static const struct snd_kcontrol_new tx_voice2_stub_mixer_controls[] = { - SOC_DOUBLE_EXT("STUB_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("STUB_1_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOICE2_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -}; - -static const struct snd_kcontrol_new tx_volte_stub_mixer_controls[] = { - SOC_DOUBLE_EXT("STUB_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("STUB_1_TX_HL", SND_SOC_NOPM, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_VOLTE_STUB, - 1, 0, msm_routing_get_voice_stub_mixer, - msm_routing_put_voice_stub_mixer), -}; - -static const struct snd_kcontrol_new tx_qchat_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, - msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUAT_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("USB_AUDIO_TX_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_TX, - MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer, - msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5_QCHAT", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, MSM_FRONTEND_DAI_QCHAT, - 1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer), -}; - -static const struct snd_kcontrol_new int0_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT3_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new int4_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT3_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new rx_cdc_dma_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_PRI_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new aux_pcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_auxpcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sbus_1_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_AUXPCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sbus_3_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_INT_BT_SCO_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_AFE_PCM_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_AUXPCM_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_RX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_SLIMBUS_0_RX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sbus_6_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new bt_sco_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new afe_pcm_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - - -static const struct snd_kcontrol_new hdmi_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_HDMI_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new display_port_rx1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_i2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_MI2S_RX, - MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new primary_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new usb_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_USB_RX, - MSM_BACKEND_DAI_USB_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_2_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new pri_tdm_rx_3_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("PRI_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_2_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_3_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_tdm_rx_7_port_mixer_controls[] = { - SOC_DOUBLE_EXT("TERT_TDM_TX_7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_RX_7, - MSM_BACKEND_DAI_TERT_TDM_TX_7, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_SLIMBUS_7_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_2_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_tdm_rx_3_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_2_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quat_tdm_rx_3_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_0_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_1_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_2_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_rx_3_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0, - msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new tert_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new sec_mi2s_rx_port_mixer_controls[] = { - SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - -static const struct snd_kcontrol_new lsm1_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new lsm2_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", - SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new lsm3_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new lsm4_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new lsm5_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new lsm6_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new lsm7_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new lsm8_mixer_controls[] = { - SOC_DOUBLE_EXT("SLIMBUS_0_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_1_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_3_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_4_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("SLIMBUS_5_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), - SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer, - msm_routing_put_listen_mixer), -}; - -static const struct snd_kcontrol_new slim_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim1_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim3_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim4_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new cdc_dma_wsa_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new cdc_dma_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new slim6_fm_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_switch_mixer, - msm_routing_put_switch_mixer); - -static const struct snd_kcontrol_new pcm_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_fm_pcmrx_switch_mixer, - msm_routing_put_fm_pcmrx_switch_mixer); - -static const struct snd_kcontrol_new int0_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_int0_mi2s_switch_mixer, - msm_routing_put_int0_mi2s_switch_mixer); - -static const struct snd_kcontrol_new int4_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_int4_mi2s_switch_mixer, - msm_routing_put_int4_mi2s_switch_mixer); - -static const struct snd_kcontrol_new pri_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_pri_mi2s_switch_mixer, - msm_routing_put_pri_mi2s_switch_mixer); - -static const struct snd_kcontrol_new sec_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_sec_mi2s_switch_mixer, - msm_routing_put_sec_mi2s_switch_mixer); - -static const struct snd_kcontrol_new tert_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_tert_mi2s_switch_mixer, - msm_routing_put_tert_mi2s_switch_mixer); - -static const struct snd_kcontrol_new quat_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_quat_mi2s_switch_mixer, - msm_routing_put_quat_mi2s_switch_mixer); - -static const struct snd_kcontrol_new quin_mi2s_rx_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_quin_mi2s_switch_mixer, - msm_routing_put_quin_mi2s_switch_mixer); - -static const struct snd_kcontrol_new hfp_pri_aux_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new hfp_aux_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new hfp_int_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new hfp_slim7_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_hfp_switch_mixer, - msm_routing_put_hfp_switch_mixer); - -static const struct snd_kcontrol_new usb_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_get_usb_switch_mixer, - msm_routing_put_usb_switch_mixer); - -static const struct snd_kcontrol_new a2dp_slim7_switch_mixer_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, msm_routing_a2dp_switch_mixer_get, - msm_routing_a2dp_switch_mixer_put); - -static const struct snd_kcontrol_new adsp_ssr_trigger_controls = - SOC_SINGLE_EXT("Switch", SND_SOC_NOPM, - 0, 1, 0, adsp_ssr_trigger_status_get, - adsp_ssr_trigger_status_put); - -static const struct soc_enum lsm_port_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lsm_port_text), lsm_port_text); - -static const char * const lsm_func_text[] = { - "None", "AUDIO", "BEACON", "ULTRASOUND", "SWAUDIO", -}; -static const struct soc_enum lsm_func_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lsm_func_text), lsm_func_text); - -static const struct snd_kcontrol_new lsm_controls[] = { - /* kcontrol of lsm_function */ - SOC_ENUM_EXT(SLIMBUS_0_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_1_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_2_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_3_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_4_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(SLIMBUS_5_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(TERT_MI2S_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(QUAT_MI2S_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(INT3_MI2S_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(TX_CDC_DMA_TX_3_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - SOC_ENUM_EXT(QUIN_TDM_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum, - msm_routing_lsm_func_get, msm_routing_lsm_func_put), - /* kcontrol of lsm_port */ - SOC_ENUM_EXT("LSM1 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM2 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM3 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM4 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM5 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM6 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM7 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), - SOC_ENUM_EXT("LSM8 Port", lsm_port_enum, - msm_routing_lsm_port_get, - msm_routing_lsm_port_put), -}; - -static const char * const aanc_slim_0_rx_text[] = { - "ZERO", "SLIMBUS_0_TX", "SLIMBUS_1_TX", "SLIMBUS_2_TX", "SLIMBUS_3_TX", - "SLIMBUS_4_TX", "SLIMBUS_5_TX", "SLIMBUS_6_TX" -}; - -static const struct soc_enum aanc_slim_0_rx_enum = - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(aanc_slim_0_rx_text), - aanc_slim_0_rx_text); - -static const struct snd_kcontrol_new aanc_slim_0_rx_mux[] = { - SOC_ENUM_EXT("AANC_SLIM_0_RX MUX", aanc_slim_0_rx_enum, - msm_routing_slim_0_rx_aanc_mux_get, - msm_routing_slim_0_rx_aanc_mux_put) -}; - -static int msm_routing_aanc_noise_level_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = aanc_level; - - return 0; -} - -static int msm_routing_aanc_noise_level_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - - mutex_lock(&routing_lock); - aanc_level = ucontrol->value.integer.value[0]; - pr_debug("%s: value: %ld\n", - __func__, ucontrol->value.integer.value[0]); - ret = afe_set_aanc_noise_level(aanc_level); - mutex_unlock(&routing_lock); - - return ret; -} - -static const struct snd_kcontrol_new aanc_noise_level[] = { - SOC_SINGLE_EXT("AANC Noise Level", SND_SOC_NOPM, 0, 255, - 0, msm_routing_aanc_noise_level_get, msm_routing_aanc_noise_level_put) -}; - -static int msm_routing_get_stereo_to_custom_stereo_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = is_custom_stereo_on; - return 0; -} - -static int msm_routing_put_stereo_to_custom_stereo_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int flag = 0, i = 0, rc = 0, idx = 0; - int be_index = 0, port_id, topo_id; - unsigned int session_id = 0; - uint16_t op_FL_ip_FL_weight = 0; - uint16_t op_FL_ip_FR_weight = 0; - uint16_t op_FR_ip_FL_weight = 0; - uint16_t op_FR_ip_FR_weight = 0; - - flag = ucontrol->value.integer.value[0]; - pr_debug("%s E flag %d\n", __func__, flag); - - if ((is_custom_stereo_on && flag) || (!is_custom_stereo_on && !flag)) { - pr_err("%s: is_custom_stereo_on %d, flag %d\n", - __func__, is_custom_stereo_on, flag); - return 0; - } - is_custom_stereo_on = flag ? true : false; - pr_debug("%s:is_custom_stereo_on %d\n", __func__, is_custom_stereo_on); - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - port_id = msm_bedais[be_index].port_id; - if (!msm_bedais[be_index].active) - continue; - if ((port_id != SLIMBUS_0_RX) && - (port_id != RT_PROXY_PORT_001_RX) && - (port_id != AFE_PORT_ID_PRIMARY_MI2S_RX) && - (port_id != AFE_PORT_ID_INT4_MI2S_RX)) - continue; - - for_each_set_bit(i, &msm_bedais[be_index].fe_sessions[0], - MSM_FRONTEND_DAI_MM_SIZE) { - if (fe_dai_map[i][SESSION_TYPE_RX].perf_mode != - LEGACY_PCM_MODE) - goto skip_send_custom_stereo; - session_id = - fe_dai_map[i][SESSION_TYPE_RX].strm_id; - if (is_custom_stereo_on) { - op_FL_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FL_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FL_weight = - Q14_GAIN_ZERO_POINT_FIVE; - op_FR_ip_FR_weight = - Q14_GAIN_ZERO_POINT_FIVE; - } else { - op_FL_ip_FL_weight = Q14_GAIN_UNITY; - op_FL_ip_FR_weight = 0; - op_FR_ip_FL_weight = 0; - op_FR_ip_FR_weight = Q14_GAIN_UNITY; - } - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - unsigned long copp = - session_copp_map[i] - [SESSION_TYPE_RX][be_index]; - if (!test_bit(idx, &copp)) - goto skip_send_custom_stereo; - topo_id = adm_get_topology_for_port_copp_idx( - msm_bedais[be_index].port_id, idx); - if (topo_id < 0) - pr_debug("%s:Err:custom stereo topo %d", - __func__, topo_id); - pr_debug("idx %d\n", idx); - if (topo_id == DS2_ADM_COPP_TOPOLOGY_ID) - rc = msm_ds2_dap_set_custom_stereo_onoff - (msm_bedais[be_index].port_id, - idx, is_custom_stereo_on); - else if (topo_id == DOLBY_ADM_COPP_TOPOLOGY_ID) - rc = dolby_dap_set_custom_stereo_onoff( - msm_bedais[be_index].port_id, - idx, is_custom_stereo_on); - else - rc = msm_qti_pp_send_stereo_to_custom_stereo_cmd - (msm_bedais[be_index].port_id, - idx, session_id, - op_FL_ip_FL_weight, - op_FL_ip_FR_weight, - op_FR_ip_FL_weight, - op_FR_ip_FR_weight); - if (rc < 0) -skip_send_custom_stereo: - pr_err("%s: err setting custom stereo\n", - __func__); - } - - } - } - return 0; -} - -static const struct snd_kcontrol_new stereo_to_custom_stereo_controls[] = { - SOC_SINGLE_EXT("Set Custom Stereo OnOff", SND_SOC_NOPM, 0, - 1, 0, msm_routing_get_stereo_to_custom_stereo_control, - msm_routing_put_stereo_to_custom_stereo_control), -}; - -static int msm_routing_get_app_type_cfg_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static int msm_routing_put_app_type_cfg_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i = 0, j; - int num_app_types = ucontrol->value.integer.value[i++]; - - pr_debug("%s\n", __func__); - - memset(app_type_cfg, 0, MAX_APP_TYPES* - sizeof(struct msm_pcm_routing_app_type_data)); - if (num_app_types > MAX_APP_TYPES) { - pr_err("%s: number of app types exceed the max supported\n", - __func__); - return -EINVAL; - } - for (j = 0; j < num_app_types; j++) { - app_type_cfg[j].app_type = - ucontrol->value.integer.value[i++]; - app_type_cfg[j].sample_rate = - ucontrol->value.integer.value[i++]; - app_type_cfg[j].bit_width = - ucontrol->value.integer.value[i++]; - } - - return 0; -} - -static int msm_routing_put_app_type_gain_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int j, fe_id, be_id, port_type; - int ret = 0; - unsigned long copp; - struct msm_pcm_routing_bdai_data *bedai; - int dir = ucontrol->value.integer.value[0] ? SESSION_TYPE_TX : - SESSION_TYPE_RX; - int app_type = ucontrol->value.integer.value[1]; - int gain = (ucontrol->value.integer.value[2] + - ucontrol->value.integer.value[3])/2; - - port_type = (dir == SESSION_TYPE_RX) ? MSM_AFE_PORT_TYPE_RX : - MSM_AFE_PORT_TYPE_TX; - - mutex_lock(&routing_lock); - for (be_id = 0; be_id < MSM_BACKEND_DAI_MAX; be_id++) { - if (is_be_dai_extproc(be_id)) - continue; - - bedai = &msm_bedais[be_id]; - if (afe_get_port_type(bedai->port_id) != port_type) - continue; - - if (!bedai->active) - continue; - - for (fe_id = 0; fe_id < MSM_FRONTEND_DAI_MAX; fe_id++) { - if (!test_bit(fe_id, &bedai->fe_sessions[0])) - continue; - - if (app_type != - fe_dai_app_type_cfg[fe_id][dir][be_id].app_type) - continue; - - copp = session_copp_map[fe_id][dir][be_id]; - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - if (!test_bit(j, &copp)) - continue; - ret |= adm_set_volume(bedai->port_id, j, gain); - } - } - } - mutex_unlock(&routing_lock); - return ret ? -EINVAL : 0; -} - -static const struct snd_kcontrol_new app_type_cfg_controls[] = { - SOC_SINGLE_MULTI_EXT("App Type Config", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, 128, msm_routing_get_app_type_cfg_control, - msm_routing_put_app_type_cfg_control), - SOC_SINGLE_MULTI_EXT("App Type Gain", SND_SOC_NOPM, 0, - 0x2000, 0, 4, NULL, msm_routing_put_app_type_gain_control) -}; - -static int msm_routing_put_module_cfg_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int copp_idx, fe_id, be_id, port_type; - int ret = 0; - unsigned long copp; - struct msm_pcm_routing_bdai_data *bedai; - u8 *packed_params = NULL; - struct param_hdr_v3 param_hdr; - u32 packed_param_size = (sizeof(struct param_hdr_v3) + - sizeof(uint32_t)); - - int dir = ucontrol->value.integer.value[0] ? SESSION_TYPE_TX : - SESSION_TYPE_RX; - int app_type = ucontrol->value.integer.value[1]; - int module_id = ucontrol->value.integer.value[2]; - int instance_id = ucontrol->value.integer.value[3]; - int param_id = ucontrol->value.integer.value[4]; - int param_value = ucontrol->value.integer.value[5]; - - port_type = (dir == SESSION_TYPE_RX) ? MSM_AFE_PORT_TYPE_RX : - MSM_AFE_PORT_TYPE_TX; - pr_debug("%s app_type:%d mod_id:%d instance_id:%d param_id:%d value:%d\n", - __func__, app_type, module_id, - instance_id, param_id, param_value); - - packed_params = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_params) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = module_id; - param_hdr.instance_id = instance_id; - param_hdr.param_id = param_id; - param_hdr.param_size = sizeof(uint32_t); - - packed_param_size = 0; - - mutex_lock(&routing_lock); - for (be_id = 0; be_id < MSM_BACKEND_DAI_MAX; be_id++) { - if (is_be_dai_extproc(be_id)) - continue; - - bedai = &msm_bedais[be_id]; - if (afe_get_port_type(bedai->port_id) != port_type) - continue; - - if (!bedai->active) - continue; - - for (fe_id = 0; fe_id < MSM_FRONTEND_DAI_MAX; fe_id++) { - if (!test_bit(fe_id, &bedai->fe_sessions[0])) - continue; - - if (app_type != - fe_dai_app_type_cfg[fe_id][dir][be_id].app_type) - continue; - - copp = session_copp_map[fe_id][dir][be_id]; - for (copp_idx = 0; copp_idx < MAX_COPPS_PER_PORT; - copp_idx++) { - if (!test_bit(copp_idx, &copp)) - continue; - - ret = q6common_pack_pp_params(packed_params, - ¶m_hdr, - (u8 *) ¶m_value, - &packed_param_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d\n", - __func__, ret); - goto done; - } - - ret = adm_set_pp_params(bedai->port_id, - copp_idx, NULL, - packed_params, - packed_param_size); - if (ret) { - pr_err("%s: Setting param failed with err=%d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - } - } - } -done: - mutex_unlock(&routing_lock); - kfree(packed_params); - return ret; -} - -static const struct snd_kcontrol_new module_cfg_controls[] = { - SOC_SINGLE_MULTI_EXT("Audio Effect", SND_SOC_NOPM, 0, - 0x2000, 0, 6, NULL, msm_routing_put_module_cfg_control) -}; - -static int msm_routing_get_lsm_app_type_cfg_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static int msm_routing_put_lsm_app_type_cfg_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int shift = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - int i = 0, j; - int num_app_types; - - if (ucontrol->value.integer.value[0] > MAX_APP_TYPES) { - pr_err("%s: number of app types exceed the max supported\n", - __func__); - return -EINVAL; - } - - num_app_types = ucontrol->value.integer.value[i++]; - memset(lsm_app_type_cfg, 0, MAX_APP_TYPES* - sizeof(struct msm_pcm_routing_app_type_data)); - - for (j = 0; j < num_app_types; j++) { - lsm_app_type_cfg[j].app_type = - ucontrol->value.integer.value[i++]; - lsm_app_type_cfg[j].sample_rate = - ucontrol->value.integer.value[i++]; - lsm_app_type_cfg[j].bit_width = - ucontrol->value.integer.value[i++]; - /* Shift of 1 indicates this is V2 mixer control */ - if (shift == 1) - lsm_app_type_cfg[j].num_out_channels = - ucontrol->value.integer.value[i++]; - } - - return 0; -} - -static const struct snd_kcontrol_new lsm_app_type_cfg_controls[] = { - SOC_SINGLE_MULTI_EXT("Listen App Type Config", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, 128, msm_routing_get_lsm_app_type_cfg_control, - msm_routing_put_lsm_app_type_cfg_control), - SOC_SINGLE_MULTI_EXT("Listen App Type Config V2", SND_SOC_NOPM, 1, - 0xFFFFFFFF, 0, 128, msm_routing_get_lsm_app_type_cfg_control, - msm_routing_put_lsm_app_type_cfg_control), -}; - -static int msm_routing_get_use_ds1_or_ds2_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = is_ds2_on; - return 0; -} - -static int msm_routing_put_use_ds1_or_ds2_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - is_ds2_on = ucontrol->value.integer.value[0]; - return 0; -} - -static const struct snd_kcontrol_new use_ds1_or_ds2_controls[] = { - SOC_SINGLE_EXT("DS2 OnOff", SND_SOC_NOPM, 0, - 1, 0, msm_routing_get_use_ds1_or_ds2_control, - msm_routing_put_use_ds1_or_ds2_control), -}; - -static int msm_routing_get_hifi_filter_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = hifi_filter_enabled; - return 0; -} - -static int msm_routing_put_hifi_filter_control( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - hifi_filter_enabled = ucontrol->value.integer.value[0]; - return 0; -} - -static const struct snd_kcontrol_new hifi_filter_controls[] = { - SOC_SINGLE_EXT("HiFi Filter", SND_SOC_NOPM, 0, - 1, 0, msm_routing_get_hifi_filter_control, - msm_routing_put_hifi_filter_control), -}; - -int msm_routing_get_rms_value_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) { - int rc = 0; - int be_idx = 0; - char *param_value; - int *update_param_value; - uint32_t param_size = (RMS_PAYLOAD_LEN + 1) * sizeof(uint32_t); - struct param_hdr_v3 param_hdr; - - param_value = kzalloc(param_size, GFP_KERNEL); - if (!param_value) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) - if (msm_bedais[be_idx].port_id == SLIMBUS_0_TX) - break; - if ((be_idx < MSM_BACKEND_DAI_MAX) && msm_bedais[be_idx].active) { - param_hdr.module_id = RMS_MODULEID_APPI_PASSTHRU; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = RMS_PARAM_FIRST_SAMPLE; - param_hdr.param_size = param_size; - rc = adm_get_pp_params(SLIMBUS_0_TX, 0, ADM_CLIENT_ID_DEFAULT, - NULL, ¶m_hdr, (u8 *) param_value); - if (rc) { - pr_err("%s: get parameters failed:%d\n", __func__, rc); - kfree(param_value); - return -EINVAL; - } - update_param_value = (int *)param_value; - ucontrol->value.integer.value[0] = update_param_value[0]; - - pr_debug("%s: FROM DSP value[0] 0x%x\n", - __func__, update_param_value[0]); - } - kfree(param_value); - return 0; -} - -static int msm_voc_session_id_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - voc_session_id = ucontrol->value.integer.value[0]; - - pr_debug("%s: voc_session_id=%u\n", __func__, voc_session_id); - - return 0; -} - -static int msm_voc_session_id_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = voc_session_id; - - return 0; -} - -static struct snd_kcontrol_new msm_voc_session_controls[] = { - SOC_SINGLE_MULTI_EXT("Voc VSID", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, 1, msm_voc_session_id_get, - msm_voc_session_id_put), -}; - -static int msm_sound_focus_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct sound_focus_param); - - return 0; -} - -static int msm_voice_sound_focus_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - - memcpy((void *)&soundFocusData, ucontrol->value.bytes.data, - sizeof(struct sound_focus_param)); - ret = voc_set_sound_focus(soundFocusData); - if (ret) { - pr_err("%s: Error setting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - } - - return ret; -} - -static int msm_voice_sound_focus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - - memset(&soundFocusData, 0, sizeof(struct sound_focus_param)); - - ret = voc_get_sound_focus(&soundFocusData); - if (ret) { - pr_debug("%s: Error getting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - memcpy(ucontrol->value.bytes.data, (void *)&soundFocusData, - sizeof(struct sound_focus_param)); - -done: - return ret; -} - -static int msm_source_tracking_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(struct source_tracking_param); - - return 0; -} - -static int msm_voice_source_tracking_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct source_tracking_param sourceTrackingData; - - memset(&sourceTrackingData, 0, sizeof(struct source_tracking_param)); - - ret = voc_get_source_tracking(&sourceTrackingData); - if (ret) { - pr_debug("%s: Error getting Source Tracking Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - memcpy(ucontrol->value.bytes.data, (void *)&sourceTrackingData, - sizeof(struct source_tracking_param)); - -done: - return ret; -} - -static int msm_audio_get_copp_idx_from_port_id(int port_id, int session_type, - int *copp_idx) -{ - int i, idx, be_idx; - int ret = 0; - unsigned long copp; - - pr_debug("%s: Enter, port_id=%d\n", __func__, port_id); - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port validation failed id 0x%x ret %d\n", - __func__, port_id, ret); - - ret = -EINVAL; - goto done; - } - - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - if (msm_bedais[be_idx].port_id == port_id) - break; - } - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Invalid be id %d\n", __func__, be_idx); - - ret = -EINVAL; - goto done; - } - - for_each_set_bit(i, &msm_bedais[be_idx].fe_sessions[0], - MSM_FRONTEND_DAI_MM_SIZE) { - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - copp = session_copp_map[i] - [session_type][be_idx]; - if (test_bit(idx, &copp)) - break; - } - if (idx >= MAX_COPPS_PER_PORT) - continue; - else - break; - } - if (i >= MSM_FRONTEND_DAI_MM_SIZE) { - pr_debug("%s: Invalid FE, exiting\n", __func__); - - ret = -EINVAL; - goto done; - } - *copp_idx = idx; - pr_debug("%s: copp_idx=%d\n", __func__, *copp_idx); - -done: - return ret; -} - -static int msm_audio_sound_focus_derive_port_id(struct snd_kcontrol *kcontrol, - const char *prefix, int *port_id) -{ - int ret = 0; - - pr_debug("%s: Enter, prefix:%s\n", __func__, prefix); - - /* - * Mixer control name will be like "Sound Focus Audio Tx SLIMBUS_0" - * where the prefix is "Sound Focus Audio Tx ". Skip the prefix - * and compare the string with the backend name to derive the port id. - */ - if (!strcmp(kcontrol->id.name + strlen(prefix), - "SLIMBUS_0")) { - *port_id = SLIMBUS_0_TX; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "TERT_MI2S")) { - *port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "INT3_MI2S")) { - *port_id = AFE_PORT_ID_INT3_MI2S_TX; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "VA_CDC_DMA_TX_0")) { - *port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "TX_CDC_DMA_TX_3")) { - *port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3; - } else if (!strcmp(kcontrol->id.name + strlen(prefix), - "QUIN_TDM_TX_0")) { - *port_id = AFE_PORT_ID_QUINARY_TDM_TX; - } else { - pr_err("%s: mixer ctl name=%s, could not derive valid port id\n", - __func__, kcontrol->id.name); - - ret = -EINVAL; - goto done; - } - pr_debug("%s: mixer ctl name=%s, derived port_id=%d\n", - __func__, kcontrol->id.name, *port_id); - -done: - return ret; -} - -static int msm_audio_sound_focus_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - int port_id, copp_idx; - - ret = msm_audio_sound_focus_derive_port_id(kcontrol, - "Sound Focus Audio Tx ", &port_id); - if (ret != 0) { - pr_err("%s: Error in deriving port id, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX, - &copp_idx); - if (ret) { - pr_err("%s: Could not get copp idx for port_id=%d\n", - __func__, port_id); - - ret = -EINVAL; - goto done; - } - - memcpy((void *)&soundFocusData, ucontrol->value.bytes.data, - sizeof(struct sound_focus_param)); - - ret = adm_set_sound_focus(port_id, copp_idx, soundFocusData); - if (ret) { - pr_err("%s: Error setting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - -done: - return ret; -} - -static int msm_audio_sound_focus_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct sound_focus_param soundFocusData; - int port_id, copp_idx; - - ret = msm_audio_sound_focus_derive_port_id(kcontrol, - "Sound Focus Audio Tx ", &port_id); - if (ret) { - pr_err("%s: Error in deriving port id, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX, - &copp_idx); - if (ret) { - pr_debug("%s: Could not get copp idx for port_id=%d\n", - __func__, port_id); - - ret = -EINVAL; - goto done; - } - - ret = adm_get_sound_focus(port_id, copp_idx, &soundFocusData); - if (ret) { - pr_err("%s: Error getting Sound Focus Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&soundFocusData, - sizeof(struct sound_focus_param)); - -done: - return ret; -} - -static int msm_audio_source_tracking_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - struct source_tracking_param sourceTrackingData; - int port_id, copp_idx; - - ret = msm_audio_sound_focus_derive_port_id(kcontrol, - "Source Tracking Audio Tx ", &port_id); - if (ret) { - pr_err("%s: Error in deriving port id, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX, - &copp_idx); - if (ret) { - pr_debug("%s: Could not get copp idx for port_id=%d\n", - __func__, port_id); - - ret = -EINVAL; - goto done; - } - - ret = adm_get_source_tracking(port_id, copp_idx, &sourceTrackingData); - if (ret) { - pr_err("%s: Error getting Source Tracking Params, err=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - memcpy(ucontrol->value.bytes.data, (void *)&sourceTrackingData, - sizeof(struct source_tracking_param)); - -done: - return ret; -} - -static const struct snd_kcontrol_new msm_source_tracking_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx SLIMBUS_0", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx SLIMBUS_0", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx SLIMBUS_0", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx SLIMBUS_0", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx TERT_MI2S", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx TERT_MI2S", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx TERT_MI2S", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx TERT_MI2S", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx INT3_MI2S", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx INT3_MI2S", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx INT3_MI2S", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx INT3_MI2S", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx VA_CDC_DMA_TX_0", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx VA_CDC_DMA_TX_0", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx VA_CDC_DMA_TX_0", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx VA_CDC_DMA_TX_0", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx TX_CDC_DMA_TX_3", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx TX_CDC_DMA_TX_3", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx TX_CDC_DMA_TX_3", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx TX_CDC_DMA_TX_3", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Voice Tx QUIN_TDM_TX_0", - .info = msm_sound_focus_info, - .get = msm_voice_sound_focus_get, - .put = msm_voice_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Voice Tx QUIN_TDM_TX_0", - .info = msm_source_tracking_info, - .get = msm_voice_source_tracking_get, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Sound Focus Audio Tx QUIN_TDM_TX_0", - .info = msm_sound_focus_info, - .get = msm_audio_sound_focus_get, - .put = msm_audio_sound_focus_put, - }, - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Source Tracking Audio Tx QUIN_TDM_TX_0", - .info = msm_source_tracking_info, - .get = msm_audio_source_tracking_get, - }, -}; - -static int spkr_prot_put_vi_lch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int item; - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - pr_debug("%s item is %d\n", __func__, - ucontrol->value.enumerated.item[0]); - mutex_lock(&routing_lock); - item = ucontrol->value.enumerated.item[0]; - if (item < e->items) { - pr_debug("%s RX DAI ID %d TX DAI id %d\n", - __func__, e->shift_l, e->values[item]); - if (e->shift_l < MSM_BACKEND_DAI_MAX && - e->values[item] < MSM_BACKEND_DAI_MAX) - /* Enable feedback TX path */ - ret = afe_spk_prot_feed_back_cfg( - msm_bedais[e->values[item]].port_id, - msm_bedais[e->shift_l].port_id, 1, 0, 1); - else { - pr_debug("%s values are out of range item %d\n", - __func__, e->values[item]); - /* Disable feedback TX path */ - if (e->values[item] == MSM_BACKEND_DAI_MAX) - ret = afe_spk_prot_feed_back_cfg(0, 0, 0, 0, 0); - else - ret = -EINVAL; - } - } else { - pr_err("%s item value is out of range item\n", __func__); - ret = -EINVAL; - } - mutex_unlock(&routing_lock); - return ret; -} - -static int spkr_prot_put_vi_rch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int item; - struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - - pr_debug("%s item is %d\n", __func__, - ucontrol->value.enumerated.item[0]); - mutex_lock(&routing_lock); - item = ucontrol->value.enumerated.item[0]; - if (item < e->items) { - pr_debug("%s RX DAI ID %d TX DAI id %d\n", - __func__, e->shift_l, e->values[item]); - if (e->shift_l < MSM_BACKEND_DAI_MAX && - e->values[item] < MSM_BACKEND_DAI_MAX) - /* Enable feedback TX path */ - ret = afe_spk_prot_feed_back_cfg( - msm_bedais[e->values[item]].port_id, - msm_bedais[e->shift_l].port_id, - 1, 1, 1); - else { - pr_debug("%s values are out of range item %d\n", - __func__, e->values[item]); - /* Disable feedback TX path */ - if (e->values[item] == MSM_BACKEND_DAI_MAX) - ret = afe_spk_prot_feed_back_cfg(0, - 0, 0, 0, 0); - else - ret = -EINVAL; - } - } else { - pr_err("%s item value is out of range item\n", __func__); - ret = -EINVAL; - } - mutex_unlock(&routing_lock); - return ret; -} - -static int spkr_prot_get_vi_lch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s\n", __func__); - return 0; -} - -static int spkr_prot_get_vi_rch_port(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s\n", __func__); - ucontrol->value.enumerated.item[0] = 0; - return 0; -} - -static const char * const slim0_rx_vi_fb_tx_lch_mux_text[] = { - "ZERO", "SLIM4_TX" -}; - -static const char * const slim0_rx_vi_fb_tx_rch_mux_text[] = { - "ZERO", "SLIM4_TX" -}; - -static const char * const wsa_rx_0_vi_fb_tx_lch_mux_text[] = { - "ZERO", "WSA_CDC_DMA_TX_0" -}; - -static const char * const wsa_rx_0_vi_fb_tx_rch_mux_text[] = { - "ZERO", "WSA_CDC_DMA_TX_0" -}; - -static const char * const mi2s_rx_vi_fb_tx_mux_text[] = { -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - "ZERO", PLATFORM_RX_VI_FB_TX_MUX_TEXT -#else - "ZERO", "SENARY_TX" -#endif -}; - -static const char * const int4_mi2s_rx_vi_fb_tx_mono_mux_text[] = { - "ZERO", "INT5_MI2S_TX" -}; - -static const char * const int4_mi2s_rx_vi_fb_tx_stereo_mux_text[] = { - "ZERO", "INT5_MI2S_TX" -}; - -static const int slim0_rx_vi_fb_tx_lch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX -}; - -static const int slim0_rx_vi_fb_tx_rch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX -}; - -static const int wsa_rx_0_vi_fb_tx_lch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0 -}; - -static const int wsa_rx_0_vi_fb_tx_rch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0 -}; - - -static const int mi2s_rx_vi_fb_tx_value[] = { -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - MSM_BACKEND_DAI_MAX, PLATFORM_RX_VI_FB_TX_VALUE -#else - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SENARY_MI2S_TX -#endif -}; - -static const int int4_mi2s_rx_vi_fb_tx_mono_ch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX -}; - -static const int int4_mi2s_rx_vi_fb_tx_stereo_ch_value[] = { - MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX -}; - -static const struct soc_enum slim0_rx_vi_fb_lch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_SLIMBUS_0_RX, 0, 0, - ARRAY_SIZE(slim0_rx_vi_fb_tx_lch_mux_text), - slim0_rx_vi_fb_tx_lch_mux_text, slim0_rx_vi_fb_tx_lch_value); - -static const struct soc_enum slim0_rx_vi_fb_rch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_SLIMBUS_0_RX, 0, 0, - ARRAY_SIZE(slim0_rx_vi_fb_tx_rch_mux_text), - slim0_rx_vi_fb_tx_rch_mux_text, slim0_rx_vi_fb_tx_rch_value); - -static const struct soc_enum wsa_rx_0_vi_fb_lch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, 0, 0, - ARRAY_SIZE(wsa_rx_0_vi_fb_tx_lch_mux_text), - wsa_rx_0_vi_fb_tx_lch_mux_text, wsa_rx_0_vi_fb_tx_lch_value); - -static const struct soc_enum wsa_rx_0_vi_fb_rch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, 0, 0, - ARRAY_SIZE(wsa_rx_0_vi_fb_tx_rch_mux_text), - wsa_rx_0_vi_fb_tx_rch_mux_text, wsa_rx_0_vi_fb_tx_rch_value); - -static const struct soc_enum mi2s_rx_vi_fb_mux_enum = -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - SOC_VALUE_ENUM_DOUBLE(0, PLATFORM_RX_VI_FB_MUX_ENUM, 0, 0, -#else - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_PRI_MI2S_RX, 0, 0, -#endif - ARRAY_SIZE(mi2s_rx_vi_fb_tx_mux_text), - mi2s_rx_vi_fb_tx_mux_text, mi2s_rx_vi_fb_tx_value); - -static const struct soc_enum int4_mi2s_rx_vi_fb_mono_ch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_INT4_MI2S_RX, 0, 0, - ARRAY_SIZE(int4_mi2s_rx_vi_fb_tx_mono_mux_text), - int4_mi2s_rx_vi_fb_tx_mono_mux_text, - int4_mi2s_rx_vi_fb_tx_mono_ch_value); - -static const struct soc_enum int4_mi2s_rx_vi_fb_stereo_ch_mux_enum = - SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_INT4_MI2S_RX, 0, 0, - ARRAY_SIZE(int4_mi2s_rx_vi_fb_tx_stereo_mux_text), - int4_mi2s_rx_vi_fb_tx_stereo_mux_text, - int4_mi2s_rx_vi_fb_tx_stereo_ch_value); - -static const struct snd_kcontrol_new slim0_rx_vi_fb_lch_mux = - SOC_DAPM_ENUM_EXT("SLIM0_RX_VI_FB_LCH_MUX", - slim0_rx_vi_fb_lch_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new slim0_rx_vi_fb_rch_mux = - SOC_DAPM_ENUM_EXT("SLIM0_RX_VI_FB_RCH_MUX", - slim0_rx_vi_fb_rch_mux_enum, spkr_prot_get_vi_rch_port, - spkr_prot_put_vi_rch_port); - -static const struct snd_kcontrol_new wsa_rx_0_vi_fb_lch_mux = - SOC_DAPM_ENUM_EXT("WSA_RX_0_VI_FB_LCH_MUX", - wsa_rx_0_vi_fb_lch_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new wsa_rx_0_vi_fb_rch_mux = - SOC_DAPM_ENUM_EXT("WSA_RX_0_VI_FB_RCH_MUX", - wsa_rx_0_vi_fb_rch_mux_enum, spkr_prot_get_vi_rch_port, - spkr_prot_put_vi_rch_port); - -static const struct snd_kcontrol_new mi2s_rx_vi_fb_mux = -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - SOC_DAPM_ENUM_EXT(PLATFORM_RX_VI_FB_MUX_NAME, -#else - SOC_DAPM_ENUM_EXT("PRI_MI2S_RX_VI_FB_MUX", -#endif - mi2s_rx_vi_fb_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new int4_mi2s_rx_vi_fb_mono_ch_mux = - SOC_DAPM_ENUM_EXT("INT4_MI2S_RX_VI_FB_MONO_CH_MUX", - int4_mi2s_rx_vi_fb_mono_ch_mux_enum, spkr_prot_get_vi_lch_port, - spkr_prot_put_vi_lch_port); - -static const struct snd_kcontrol_new int4_mi2s_rx_vi_fb_stereo_ch_mux = - SOC_DAPM_ENUM_EXT("INT4_MI2S_RX_VI_FB_STEREO_CH_MUX", - int4_mi2s_rx_vi_fb_stereo_ch_mux_enum, spkr_prot_get_vi_rch_port, - spkr_prot_put_vi_rch_port); - -static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { - /* Frontend AIF */ - /* Widget name equals to Front-End DAI name, - * Stream name must contains substring of front-end dai name - */ - SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL5", "MultiMedia5 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL6", "MultiMedia6 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL7", "MultiMedia7 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL8", "MultiMedia8 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL9", "MultiMedia9 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL10", "MultiMedia10 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL11", "MultiMedia11 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL12", "MultiMedia12 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL13", "MultiMedia13 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL14", "MultiMedia14 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL15", "MultiMedia15 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL16", "MultiMedia16 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL20", "MultiMedia20 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL21", "MultiMedia21 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL26", "MultiMedia26 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL30", "MultiMedia30 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MM_DL31", "MultiMedia31 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL3", "MultiMedia3 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL4", "MultiMedia4 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL5", "MultiMedia5 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL6", "MultiMedia6 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL8", "MultiMedia8 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL9", "MultiMedia9 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL10", "MultiMedia10 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL16", "MultiMedia16 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL17", "MultiMedia17 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL18", "MultiMedia18 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL19", "MultiMedia19 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL20", "MultiMedia20 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL21", "MultiMedia21 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL27", "MultiMedia27 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL28", "MultiMedia28 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MM_UL29", "MultiMedia29 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICEMMODE1_DL", - "VoiceMMode1 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICEMMODE1_UL", - "VoiceMMode1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICEMMODE2_DL", - "VoiceMMode2 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICEMMODE2_UL", - "VoiceMMode2 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("CDC_DMA_DL_HL", "CDC_DMA_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("CDC_DMA_UL_HL", "CDC_DMA_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TX3_CDC_DMA_UL_HL", - "TX3_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("CPE_LSM_UL_HL", "CPE LSM capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM1_DL_HL", "SLIMBUS1_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM1_UL_HL", "SLIMBUS1_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM3_DL_HL", "SLIMBUS3_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM3_UL_HL", "SLIMBUS3_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM4_DL_HL", "SLIMBUS4_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM4_UL_HL", "SLIMBUS4_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM6_DL_HL", "SLIMBUS6_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM6_UL_HL", "SLIMBUS6_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM7_DL_HL", "SLIMBUS7_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM7_UL_HL", "SLIMBUS7_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIM8_DL_HL", "SLIMBUS8_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIM8_UL_HL", "SLIMBUS8_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INTHFP_DL_HL", "INT_HFP_BT_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INTHFP_UL_HL", "INT_HFP_BT_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("USBAUDIO_DL_HL", "USBAUDIO_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("USBAUDIO_UL_HL", "USBAUDIO_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_I2S_DL_HL", "SEC_I2S_RX_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT0_MI2S_DL_HL", - "INT0 MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT4_MI2S_DL_HL", - "INT4 MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_MI2S_DL_HL", - "Primary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_MI2S_DL_HL", - "Secondary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_MI2S_DL_HL", - "Tertiary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_MI2S_DL_HL", - "Quaternary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_MI2S_DL_HL", - "Quinary MI2S_RX Hostless Playback", - 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_AUXPCM_DL_HL", "SEC_AUXPCM_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_AUXPCM_UL_HL", "SEC_AUXPCM_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MI2S_UL_HL", "MI2S_TX_HOSTLESS Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT3_MI2S_UL_HL", - "INT3 MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_MI2S_UL_HL", - "Tertiary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_UL_HL", - "Secondary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_MI2S_UL_HL", - "Primary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MI2S_DL_HL", "MI2S_RX_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("DTMF_DL_HL", "DTMF_RX_HOSTLESS Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_UL_HL", - "Quaternary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_UL_HL", - "Quinary MI2S_TX Hostless Capture", - 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_0_DL_HL", - "Primary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_0_UL_HL", - "Primary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_1_DL_HL", - "Primary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_1_UL_HL", - "Primary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_2_DL_HL", - "Primary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_2_UL_HL", - "Primary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_3_DL_HL", - "Primary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_3_UL_HL", - "Primary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_4_DL_HL", - "Primary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_4_UL_HL", - "Primary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_5_DL_HL", - "Primary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_5_UL_HL", - "Primary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_6_DL_HL", - "Primary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_6_UL_HL", - "Primary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_7_DL_HL", - "Primary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_TX_7_UL_HL", - "Primary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_0_DL_HL", - "Secondary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_0_UL_HL", - "Secondary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_1_DL_HL", - "Secondary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_1_UL_HL", - "Secondary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_2_DL_HL", - "Secondary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_2_UL_HL", - "Secondary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_3_DL_HL", - "Secondary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_3_UL_HL", - "Secondary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_4_DL_HL", - "Secondary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_4_UL_HL", - "Secondary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_5_DL_HL", - "Secondary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_5_UL_HL", - "Secondary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_6_DL_HL", - "Secondary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_6_UL_HL", - "Secondary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_7_DL_HL", - "Secondary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_7_UL_HL", - "Secondary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_0_DL_HL", - "Tertiary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_0_UL_HL", - "Tertiary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_1_DL_HL", - "Tertiary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_1_UL_HL", - "Tertiary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_2_DL_HL", - "Tertiary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_2_UL_HL", - "Tertiary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_3_DL_HL", - "Tertiary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_3_UL_HL", - "Tertiary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_4_DL_HL", - "Tertiary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_4_UL_HL", - "Tertiary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_5_DL_HL", - "Tertiary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_5_UL_HL", - "Tertiary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_6_DL_HL", - "Tertiary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_6_UL_HL", - "Tertiary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_7_DL_HL", - "Tertiary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_7_UL_HL", - "Tertiary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_0_DL_HL", - "Quaternary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_0_UL_HL", - "Quaternary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_1_DL_HL", - "Quaternary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_1_UL_HL", - "Quaternary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_2_DL_HL", - "Quaternary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_2_UL_HL", - "Quaternary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_3_DL_HL", - "Quaternary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_3_UL_HL", - "Quaternary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_4_DL_HL", - "Quaternary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_4_UL_HL", - "Quaternary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_5_DL_HL", - "Quaternary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_5_UL_HL", - "Quaternary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_6_DL_HL", - "Quaternary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_6_UL_HL", - "Quaternary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_7_DL_HL", - "Quaternary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_7_UL_HL", - "Quaternary TDM7 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_0_DL_HL", - "Quinary TDM0 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_0_UL_HL", - "Quinary TDM0 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_1_DL_HL", - "Quinary TDM1 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_1_UL_HL", - "Quinary TDM1 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_2_DL_HL", - "Quinary TDM2 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_2_UL_HL", - "Quinary TDM2 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_3_DL_HL", - "Quinary TDM3 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_3_UL_HL", - "Quinary TDM3 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_4_DL_HL", - "Quinary TDM4 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_4_UL_HL", - "Quinary TDM4 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_5_DL_HL", - "Quinary TDM5 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_5_UL_HL", - "Quinary TDM5 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_6_DL_HL", - "Quinary TDM6 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_6_UL_HL", - "Quinary TDM6 Hostless Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_7_DL_HL", - "Quinary TDM7 Hostless Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_7_UL_HL", - "Quinary TDM7 Hostless Capture", - 0, 0, 0, 0), - - /* LSM */ - SND_SOC_DAPM_AIF_OUT("LSM1_UL_HL", "Listen 1 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM2_UL_HL", "Listen 2 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM3_UL_HL", "Listen 3 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM4_UL_HL", "Listen 4 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM5_UL_HL", "Listen 5 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM6_UL_HL", "Listen 6 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM7_UL_HL", "Listen 7 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("LSM8_UL_HL", "Listen 8 Audio Service Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QCHAT_DL", "QCHAT Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QCHAT_UL", "QCHAT Capture", 0, 0, 0, 0), - /* Backend AIF */ - /* Stream name equals to backend dai link stream name */ - SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_SPDIF_RX", "Primary SPDIF Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_SPDIF_TX", "Primary SPDIF Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_SPDIF_RX", "Secondary SPDIF Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_SPDIF_TX", "Secondary SPDIF Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_RX", "Slimbus2 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_RX", "Slimbus5 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT", "Display Port Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT1", "Display Port1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX", "Quaternary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX", "Tertiary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX", "Secondary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_SD1", - "Secondary MI2S Playback SD1", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_MI2S_RX", "Primary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT0_MI2S_RX", "INT0 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT2_MI2S_RX", "INT2 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT3_MI2S_RX", "INT3 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT5_MI2S_RX", "INT5 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT4_MI2S_RX", "INT4 MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT4_MI2S_TX", "INT4 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_RX", "Quinary MI2S Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("MI2S_TX", "MI2S Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX", "Quaternary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_MI2S_TX", "Primary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX", "Tertiary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT0_MI2S_TX", "INT0 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT2_MI2S_TX", "INT2 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT3_MI2S_TX", "INT3 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX", "Secondary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_2_TX", "Slimbus2 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_MI2S_TX", "Quinary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SENARY_MI2S_TX", "Senary MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT_BT_A2DP_RX", "Internal BT-A2DP Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_0", "Primary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_0", "Primary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_1", "Primary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_1", "Primary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_2", "Primary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_2", "Primary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_3", "Primary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_3", "Primary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_4", "Primary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_4", "Primary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_5", "Primary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_5", "Primary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_6", "Primary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_6", "Primary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_7", "Primary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_7", "Primary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_0", "Secondary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_0", "Secondary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_1", "Secondary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_1", "Secondary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_2", "Secondary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_2", "Secondary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_3", "Secondary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_3", "Secondary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_4", "Secondary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_4", "Secondary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_5", "Secondary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_5", "Secondary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_6", "Secondary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_6", "Secondary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_7", "Secondary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_7", "Secondary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_0", "Tertiary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_0", "Tertiary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_1", "Tertiary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_1", "Tertiary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_2", "Tertiary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_2", "Tertiary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_3", "Tertiary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_3", "Tertiary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_4", "Tertiary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_4", "Tertiary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_5", "Tertiary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_5", "Tertiary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_6", "Tertiary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_6", "Tertiary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_7", "Tertiary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_7", "Tertiary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_0", "Quaternary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_0", "Quaternary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_1", "Quaternary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_1", "Quaternary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_2", "Quaternary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_2", "Quaternary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_3", "Quaternary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_3", "Quaternary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_4", "Quaternary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_4", "Quaternary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_5", "Quaternary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_5", "Quaternary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_6", "Quaternary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_6", "Quaternary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_7", "Quaternary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_7", "Quaternary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_0", "Quinary TDM0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_0", "Quinary TDM0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_1", "Quinary TDM1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_1", "Quinary TDM1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_2", "Quinary TDM2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_2", "Quinary TDM2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_3", "Quinary TDM3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_3", "Quinary TDM3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_4", "Quinary TDM4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_4", "Quinary TDM4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_5", "Quinary TDM5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_5", "Quinary TDM5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_6", "Quinary TDM6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_6", "Quinary TDM6 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_7", "Quinary TDM7 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_7", "Quinary TDM7 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("WSA_CDC_DMA_RX_0", "WSA CDC DMA0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_0", "WSA CDC DMA0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("WSA_CDC_DMA_RX_1", "WSA CDC DMA1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_1", "WSA CDC DMA1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_2", "WSA CDC DMA2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VA_CDC_DMA_TX_0", "VA CDC DMA0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VA_CDC_DMA_TX_1", "VA CDC DMA1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_0", "RX CDC DMA0 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_0", "TX CDC DMA0 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_1", "RX CDC DMA1 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_1", "TX CDC DMA1 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_2", "RX CDC DMA2 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_2", "TX CDC DMA2 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_3", "RX CDC DMA3 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_3", "TX CDC DMA3 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_4", "RX CDC DMA4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_4", "TX CDC DMA4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_5", "RX CDC DMA5 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TX_CDC_DMA_TX_5", "TX CDC DMA5 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_6", "RX CDC DMA6 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("RX_CDC_DMA_RX_7", "RX CDC DMA7 Playback", - 0, 0, 0, 0), - /* incall */ - SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICE2_PLAYBACK_TX", "Voice2 Farend Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SENARY_TX", "Senary_mi2s Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("INT5_MI2S_TX", "INT5 MI2S Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SEC_AUX_PCM_RX", "Sec AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SEC_AUX_PCM_TX", "Sec AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("TERT_AUX_PCM_RX", "Tert AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("TERT_AUX_PCM_TX", "Tert AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUAT_AUX_PCM_RX", "Quat AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUAT_AUX_PCM_TX", "Quat AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("QUIN_AUX_PCM_RX", "Quin AUX PCM Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("QUIN_AUX_PCM_TX", "Quin AUX PCM Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOICE2_STUB_DL", "VOICE2_STUB Playback", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOICE2_STUB_UL", "VOICE2_STUB Capture", - 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("VOLTE_STUB_DL", "VOLTE_STUB Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("VOLTE_STUB_UL", "VOLTE_STUB Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("STUB_1_TX", "Stub1 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_3_TX", "Slimbus3 Capture", 0, 0, 0, 0), - /* In- call recording */ - SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_RX", "Slimbus6 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_6_TX", "Slimbus6 Capture", 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_OUT("SLIMBUS_7_RX", "Slimbus7 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_7_TX", "Slimbus7 Capture", 0, 0, 0, 0), - - SND_SOC_DAPM_AIF_OUT("SLIMBUS_8_RX", "Slimbus8 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_8_TX", "Slimbus8 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("SLIMBUS_9_RX", "Slimbus9 Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("SLIMBUS_9_TX", "Slimbus9 Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("USB_AUDIO_RX", "USB Audio Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("USB_AUDIO_TX", "USB Audio Capture", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_OUT("PROXY_RX", "Proxy Playback", 0, 0, 0, 0), - SND_SOC_DAPM_AIF_IN("PROXY_TX", "Proxy Capture", 0, 0, 0, 0), - - /* Switch Definitions */ - SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0, - &slim_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS1_DL_HL", SND_SOC_NOPM, 0, 0, - &slim1_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS3_DL_HL", SND_SOC_NOPM, 0, 0, - &slim3_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS4_DL_HL", SND_SOC_NOPM, 0, 0, - &slim4_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SLIMBUS6_DL_HL", SND_SOC_NOPM, 0, 0, - &slim6_fm_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("PCM_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &pcm_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("INT0_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &int0_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("INT4_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &int4_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("PRI_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &pri_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("SEC_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &sec_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("TERT_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &tert_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("QUAT_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &quat_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("QUIN_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0, - &quin_mi2s_rx_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_PRI_AUX_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_pri_aux_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_AUX_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_aux_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_INT_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_int_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("HFP_SLIM7_UL_HL", SND_SOC_NOPM, 0, 0, - &hfp_slim7_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("USB_DL_HL", SND_SOC_NOPM, 0, 0, - &usb_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("A2DP_SLIM7_UL_HL", SND_SOC_NOPM, 0, 0, - &a2dp_slim7_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("WSA_CDC_DMA_RX_0_DL_HL", SND_SOC_NOPM, 0, 0, - &cdc_dma_wsa_switch_mixer_controls), - SND_SOC_DAPM_SWITCH("RX_CDC_DMA_RX_0_DL_HL", SND_SOC_NOPM, 0, 0, - &cdc_dma_rx_switch_mixer_controls), - - SND_SOC_DAPM_SWITCH("ADSP_SSR_TRIGGER", SND_SOC_NOPM, 0, 0, - &adsp_ssr_trigger_controls), - - /* Mixer definitions */ - SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_2_rx_mixer_controls, ARRAY_SIZE(slimbus_2_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_5_rx_mixer_controls, ARRAY_SIZE(slimbus_5_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_7_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_7_rx_mixer_controls, ARRAY_SIZE(slimbus_7_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_9_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_9_rx_mixer_controls, ARRAY_SIZE(slimbus_9_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0, - hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT Mixer", SND_SOC_NOPM, 0, 0, - display_port_mixer_controls, ARRAY_SIZE(display_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT1 Mixer", SND_SOC_NOPM, 0, 0, - display_port1_mixer_controls, ARRAY_SIZE(display_port1_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_SPDIF_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_spdif_rx_mixer_controls, ARRAY_SIZE(pri_spdif_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_SPDIF_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_spdif_rx_mixer_controls, ARRAY_SIZE(sec_spdif_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quaternary_mi2s_rx_mixer_controls, - ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - tertiary_mi2s_rx_mixer_controls, - ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - secondary_mi2s_rx_mixer_controls, - ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX_SD1 Audio Mixer", SND_SOC_NOPM, 0, 0, - secondary_mi2s_rx2_mixer_controls, - ARRAY_SIZE(secondary_mi2s_rx2_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - primary_mi2s_rx_mixer_controls, - ARRAY_SIZE(primary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INT0_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int0_mi2s_rx_mixer_controls, - ARRAY_SIZE(int0_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INT4_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int4_mi2s_rx_mixer_controls, - ARRAY_SIZE(int4_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quinary_mi2s_rx_mixer_controls, - ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_0_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_1_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_2_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_3_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_tx_0_mixer_controls, - ARRAY_SIZE(pri_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_0_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_1_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_2_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_3_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_tx_0_mixer_controls, - ARRAY_SIZE(sec_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_0_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_tx_0_mixer_controls, - ARRAY_SIZE(tert_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_1_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_2_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_3_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_4_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_0_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_tx_0_mixer_controls, - ARRAY_SIZE(quat_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_1_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_2_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_3_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_0_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_0_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_1_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_2_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_3_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_0_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_1_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_0_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_1_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_2_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_3_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_4_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_4_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_5_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_5_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_6_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_6_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_7_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_7_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0, - mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0, - mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0, - mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0, - mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0, - mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0, - mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0, - mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia9 Mixer", SND_SOC_NOPM, 0, 0, - mmul9_mixer_controls, ARRAY_SIZE(mmul9_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia10 Mixer", SND_SOC_NOPM, 0, 0, - mmul10_mixer_controls, ARRAY_SIZE(mmul10_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia16 Mixer", SND_SOC_NOPM, 0, 0, - mmul16_mixer_controls, ARRAY_SIZE(mmul16_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia17 Mixer", SND_SOC_NOPM, 0, 0, - mmul17_mixer_controls, ARRAY_SIZE(mmul17_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia18 Mixer", SND_SOC_NOPM, 0, 0, - mmul18_mixer_controls, ARRAY_SIZE(mmul18_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia19 Mixer", SND_SOC_NOPM, 0, 0, - mmul19_mixer_controls, ARRAY_SIZE(mmul19_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia20 Mixer", SND_SOC_NOPM, 0, 0, - mmul20_mixer_controls, ARRAY_SIZE(mmul20_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia21 Mixer", SND_SOC_NOPM, 0, 0, - mmul21_mixer_controls, ARRAY_SIZE(mmul21_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia27 Mixer", SND_SOC_NOPM, 0, 0, - mmul27_mixer_controls, ARRAY_SIZE(mmul27_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia28 Mixer", SND_SOC_NOPM, 0, 0, - mmul28_mixer_controls, ARRAY_SIZE(mmul28_mixer_controls)), - SND_SOC_DAPM_MIXER("MultiMedia29 Mixer", SND_SOC_NOPM, 0, 0, - mmul29_mixer_controls, ARRAY_SIZE(mmul29_mixer_controls)), - SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_auxpcm_rx_mixer_controls, ARRAY_SIZE(sec_auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_auxpcm_rx_mixer_controls, - ARRAY_SIZE(tert_auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_auxpcm_rx_mixer_controls, - ARRAY_SIZE(quat_auxpcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_auxpcm_rx_mixer_controls, - ARRAY_SIZE(quin_auxpcm_rx_mixer_controls)), - /* incall */ - SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0, - incall_music_delivery_mixer_controls, - ARRAY_SIZE(incall_music_delivery_mixer_controls)), - SND_SOC_DAPM_MIXER("Incall_Music_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - incall_music2_delivery_mixer_controls, - ARRAY_SIZE(incall_music2_delivery_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_4_rx_mixer_controls, - ARRAY_SIZE(slimbus_4_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - slimbus_6_rx_mixer_controls, - ARRAY_SIZE(slimbus_6_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("USB_AUDIO_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - usb_audio_rx_mixer_controls, - ARRAY_SIZE(usb_audio_rx_mixer_controls)), - /* Voice Mixer */ - SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls, - ARRAY_SIZE(pri_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sec_i2s_rx_voice_mixer_controls, - ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sec_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(sec_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - slimbus_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - bt_sco_rx_voice_mixer_controls, - ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - afe_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - sec_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(sec_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - tert_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(tert_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quat_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(quat_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_AUX_PCM_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quin_aux_pcm_rx_voice_mixer_controls, - ARRAY_SIZE(quin_aux_pcm_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - hdmi_rx_voice_mixer_controls, - ARRAY_SIZE(hdmi_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - pri_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(pri_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("INT0_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - int0_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(int0_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("INT4_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - int4_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(int4_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - tert_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(tert_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quat_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(quat_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_MI2S_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quin_mi2s_rx_voice_mixer_controls, - ARRAY_SIZE(quin_mi2s_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2_Voice Mixer", - SND_SOC_NOPM, 0, 0, - quat_tdm_rx_2_voice_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_2_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_0_Voice Mixer", - SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_0_voice_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_0_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("PROXY_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - proxy_rx_voice_mixer_controls, - ARRAY_SIZE(proxy_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0_Voice Mixer", - SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_0_voice_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_0_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("Voip_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls, - ARRAY_SIZE(tx_voip_mixer_controls)), - SND_SOC_DAPM_MIXER("VoiceMMode1_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_voicemmode1_mixer_controls, - ARRAY_SIZE(tx_voicemmode1_mixer_controls)), - SND_SOC_DAPM_MIXER("VoiceMMode2_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_voicemmode2_mixer_controls, - ARRAY_SIZE(tx_voicemmode2_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_A2DP_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int_bt_a2dp_rx_mixer_controls, - ARRAY_SIZE(int_bt_a2dp_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, - afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0, - tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)), - SND_SOC_DAPM_MIXER("Voice2 Stub Tx Mixer", SND_SOC_NOPM, 0, 0, - tx_voice2_stub_mixer_controls, - ARRAY_SIZE(tx_voice2_stub_mixer_controls)), - SND_SOC_DAPM_MIXER("VoLTE Stub Tx Mixer", SND_SOC_NOPM, 0, 0, - tx_volte_stub_mixer_controls, ARRAY_SIZE(tx_volte_stub_mixer_controls)), - SND_SOC_DAPM_MIXER("STUB_RX Mixer", SND_SOC_NOPM, 0, 0, - stub_rx_mixer_controls, ARRAY_SIZE(stub_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Mixer", SND_SOC_NOPM, 0, 0, - slimbus_1_rx_mixer_controls, ARRAY_SIZE(slimbus_1_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_3_RX_Voice Mixer", SND_SOC_NOPM, 0, 0, - slimbus_3_rx_mixer_controls, ARRAY_SIZE(slimbus_3_rx_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIM_6_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, - slimbus_6_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_6_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIM_7_RX_Voice Mixer", SND_SOC_NOPM, 0, 0, - slimbus_7_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_7_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIM_8_RX_Voice Mixer", SND_SOC_NOPM, 0, 0, - slimbus_8_rx_voice_mixer_controls, - ARRAY_SIZE(slimbus_8_rx_voice_mixer_controls)), - /* port mixer */ - SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls, - ARRAY_SIZE(sbus_0_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("AUX_PCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, aux_pcm_rx_port_mixer_controls, - ARRAY_SIZE(aux_pcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sec_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(sec_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, tert_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(tert_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, quat_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(quat_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_AUXPCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, quin_auxpcm_rx_port_mixer_controls, - ARRAY_SIZE(quin_auxpcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0, - sbus_1_rx_port_mixer_controls, - ARRAY_SIZE(sbus_1_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0, - bt_sco_rx_port_mixer_controls, - ARRAY_SIZE(bt_sco_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("AFE_PCM_RX Port Mixer", - SND_SOC_NOPM, 0, 0, afe_pcm_rx_port_mixer_controls, - ARRAY_SIZE(afe_pcm_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer", - SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls, - ARRAY_SIZE(hdmi_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Port Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx_port_mixer_controls, - ARRAY_SIZE(display_port_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX1 Port Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx1_port_mixer_controls, - ARRAY_SIZE(display_port_rx1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_I2S_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sec_i2s_rx_port_mixer_controls, - ARRAY_SIZE(sec_i2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sbus_3_rx_port_mixer_controls, - ARRAY_SIZE(sbus_3_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Port Mixer", - SND_SOC_NOPM, 0, 0, sbus_6_rx_port_mixer_controls, - ARRAY_SIZE(sbus_6_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - mi2s_rx_port_mixer_controls, ARRAY_SIZE(mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - primary_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(primary_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - sec_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(sec_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - tert_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(tert_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - quat_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(quat_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - quin_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(quin_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(pri_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_rx_7_port_mixer_controls, - ARRAY_SIZE(sec_tdm_rx_7_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(tert_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(quat_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_0_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_1_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_1_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_2_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_2_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_rx_3_port_mixer_controls, - ARRAY_SIZE(quin_tdm_rx_3_port_mixer_controls)), - SND_SOC_DAPM_MIXER("INT0_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - int0_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(int0_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("INT4_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - int4_mi2s_rx_port_mixer_controls, - ARRAY_SIZE(int4_mi2s_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - wsa_cdc_dma_rx_0_port_mixer_controls, - ARRAY_SIZE(wsa_cdc_dma_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, - rx_cdc_dma_rx_0_port_mixer_controls, - ARRAY_SIZE(rx_cdc_dma_rx_0_port_mixer_controls)), - SND_SOC_DAPM_MIXER("QCHAT_Tx Mixer", - SND_SOC_NOPM, 0, 0, tx_qchat_mixer_controls, - ARRAY_SIZE(tx_qchat_mixer_controls)), - SND_SOC_DAPM_MIXER("USB_AUDIO_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, usb_audio_rx_voice_mixer_controls, - ARRAY_SIZE(usb_audio_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("USB_AUDIO_RX Port Mixer", - SND_SOC_NOPM, 0, 0, usb_rx_port_mixer_controls, - ARRAY_SIZE(usb_rx_port_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX_Voice Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx_voice_mixer_controls, - ARRAY_SIZE(display_port_rx_voice_mixer_controls)), - SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX1_Voice Mixer", - SND_SOC_NOPM, 0, 0, display_port_rx1_voice_mixer_controls, - ARRAY_SIZE(display_port_rx1_voice_mixer_controls)), - /* lsm mixer definitions */ - SND_SOC_DAPM_MIXER("LSM1 Mixer", SND_SOC_NOPM, 0, 0, - lsm1_mixer_controls, ARRAY_SIZE(lsm1_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM2 Mixer", SND_SOC_NOPM, 0, 0, - lsm2_mixer_controls, ARRAY_SIZE(lsm2_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM3 Mixer", SND_SOC_NOPM, 0, 0, - lsm3_mixer_controls, ARRAY_SIZE(lsm3_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM4 Mixer", SND_SOC_NOPM, 0, 0, - lsm4_mixer_controls, ARRAY_SIZE(lsm4_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM5 Mixer", SND_SOC_NOPM, 0, 0, - lsm5_mixer_controls, ARRAY_SIZE(lsm5_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM6 Mixer", SND_SOC_NOPM, 0, 0, - lsm6_mixer_controls, ARRAY_SIZE(lsm6_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM7 Mixer", SND_SOC_NOPM, 0, 0, - lsm7_mixer_controls, ARRAY_SIZE(lsm7_mixer_controls)), - SND_SOC_DAPM_MIXER("LSM8 Mixer", SND_SOC_NOPM, 0, 0, - lsm8_mixer_controls, ARRAY_SIZE(lsm8_mixer_controls)), - /* Virtual Pins to force backends ON atm */ - SND_SOC_DAPM_OUTPUT("BE_OUT"), - SND_SOC_DAPM_INPUT("BE_IN"), - - SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0, - &slim0_rx_vi_fb_lch_mux), - SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0, - &slim0_rx_vi_fb_rch_mux), - SND_SOC_DAPM_MUX("WSA_RX_0_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0, - &wsa_rx_0_vi_fb_lch_mux), - SND_SOC_DAPM_MUX("WSA_RX_0_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0, - &wsa_rx_0_vi_fb_rch_mux), -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - SND_SOC_DAPM_MUX(PLATFORM_RX_VI_FB_MUX_NAME, SND_SOC_NOPM, 0, 0, -#else - SND_SOC_DAPM_MUX("PRI_MI2S_RX_VI_FB_MUX", SND_SOC_NOPM, 0, 0, -#endif - &mi2s_rx_vi_fb_mux), - SND_SOC_DAPM_MUX("INT4_MI2S_RX_VI_FB_MONO_CH_MUX", SND_SOC_NOPM, 0, 0, - &int4_mi2s_rx_vi_fb_mono_ch_mux), - SND_SOC_DAPM_MUX("INT4_MI2S_RX_VI_FB_STEREO_CH_MUX", SND_SOC_NOPM, 0, 0, - &int4_mi2s_rx_vi_fb_stereo_ch_mux), - - SND_SOC_DAPM_MUX("VOC_EXT_EC MUX", SND_SOC_NOPM, 0, 0, - &voc_ext_ec_mux), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL1 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul1), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL2 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul2), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL3 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul3), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL4 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul4), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL5 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul5), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL6 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul6), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL8 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul8), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL9 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul9), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL10 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul10), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL16 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul16), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL17 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul17), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL18 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul18), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL19 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul19), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL28 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul28), - SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL29 MUX", SND_SOC_NOPM, 0, 0, - &ext_ec_ref_mux_ul29), -}; - -static const struct snd_soc_dapm_route intercon[] = { - {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"}, - - {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"}, - - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_0_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"}, - - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_2_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_2_RX", NULL, "SLIMBUS_2_RX Audio Mixer"}, - - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_5_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_5_RX", NULL, "SLIMBUS_5_RX Audio Mixer"}, - - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0 Audio Mixer"}, - - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"WSA_CDC_DMA_RX_1", NULL, "WSA_CDC_DMA_RX_1 Audio Mixer"}, - - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0 Audio Mixer"}, - - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1 Audio Mixer"}, - - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_2", NULL, "RX_CDC_DMA_RX_2 Audio Mixer"}, - - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_3", NULL, "RX_CDC_DMA_RX_3 Audio Mixer"}, - - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_4", NULL, "RX_CDC_DMA_RX_4 Audio Mixer"}, - - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_5", NULL, "RX_CDC_DMA_RX_5 Audio Mixer"}, - - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_6", NULL, "RX_CDC_DMA_RX_6 Audio Mixer"}, - - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"RX_CDC_DMA_RX_7", NULL, "RX_CDC_DMA_RX_7 Audio Mixer"}, - - {"HDMI Mixer", "MultiMedia1", "MM_DL1"}, - {"HDMI Mixer", "MultiMedia2", "MM_DL2"}, - {"HDMI Mixer", "MultiMedia3", "MM_DL3"}, - {"HDMI Mixer", "MultiMedia4", "MM_DL4"}, - {"HDMI Mixer", "MultiMedia5", "MM_DL5"}, - {"HDMI Mixer", "MultiMedia6", "MM_DL6"}, - {"HDMI Mixer", "MultiMedia7", "MM_DL7"}, - {"HDMI Mixer", "MultiMedia8", "MM_DL8"}, - {"HDMI Mixer", "MultiMedia9", "MM_DL9"}, - {"HDMI Mixer", "MultiMedia10", "MM_DL10"}, - {"HDMI Mixer", "MultiMedia11", "MM_DL11"}, - {"HDMI Mixer", "MultiMedia12", "MM_DL12"}, - {"HDMI Mixer", "MultiMedia13", "MM_DL13"}, - {"HDMI Mixer", "MultiMedia14", "MM_DL14"}, - {"HDMI Mixer", "MultiMedia15", "MM_DL15"}, - {"HDMI Mixer", "MultiMedia16", "MM_DL16"}, - {"HDMI Mixer", "MultiMedia26", "MM_DL26"}, - {"HDMI", NULL, "HDMI Mixer"}, - - {"DISPLAY_PORT Mixer", "MultiMedia1", "MM_DL1"}, - {"DISPLAY_PORT Mixer", "MultiMedia2", "MM_DL2"}, - {"DISPLAY_PORT Mixer", "MultiMedia3", "MM_DL3"}, - {"DISPLAY_PORT Mixer", "MultiMedia4", "MM_DL4"}, - {"DISPLAY_PORT Mixer", "MultiMedia5", "MM_DL5"}, - {"DISPLAY_PORT Mixer", "MultiMedia6", "MM_DL6"}, - {"DISPLAY_PORT Mixer", "MultiMedia7", "MM_DL7"}, - {"DISPLAY_PORT Mixer", "MultiMedia8", "MM_DL8"}, - {"DISPLAY_PORT Mixer", "MultiMedia9", "MM_DL9"}, - {"DISPLAY_PORT Mixer", "MultiMedia10", "MM_DL10"}, - {"DISPLAY_PORT Mixer", "MultiMedia11", "MM_DL11"}, - {"DISPLAY_PORT Mixer", "MultiMedia12", "MM_DL12"}, - {"DISPLAY_PORT Mixer", "MultiMedia13", "MM_DL13"}, - {"DISPLAY_PORT Mixer", "MultiMedia14", "MM_DL14"}, - {"DISPLAY_PORT Mixer", "MultiMedia15", "MM_DL15"}, - {"DISPLAY_PORT Mixer", "MultiMedia16", "MM_DL16"}, - {"DISPLAY_PORT Mixer", "MultiMedia26", "MM_DL26"}, - {"DISPLAY_PORT", NULL, "DISPLAY_PORT Mixer"}, - - {"DISPLAY_PORT1 Mixer", "MultiMedia1", "MM_DL1"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia2", "MM_DL2"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia3", "MM_DL3"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia4", "MM_DL4"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia5", "MM_DL5"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia6", "MM_DL6"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia7", "MM_DL7"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia8", "MM_DL8"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia9", "MM_DL9"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia10", "MM_DL10"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia11", "MM_DL11"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia12", "MM_DL12"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia13", "MM_DL13"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia14", "MM_DL14"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia15", "MM_DL15"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia16", "MM_DL16"}, - {"DISPLAY_PORT1 Mixer", "MultiMedia26", "MM_DL26"}, - {"DISPLAY_PORT1", NULL, "DISPLAY_PORT1 Mixer"}, - - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_SPDIF_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"PRI_SPDIF_RX", NULL, "PRI_SPDIF_RX Audio Mixer"}, - - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_SPDIF_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SEC_SPDIF_RX", NULL, "SEC_SPDIF_RX Audio Mixer"}, - - /* incall */ - {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"Incall_Music Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"Incall_Music Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"Incall_Music_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"VOICE2_PLAYBACK_TX", NULL, "Incall_Music_2 Audio Mixer"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_4_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_4_RX", NULL, "SLIMBUS_4_RX Audio Mixer"}, - - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_6_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_6_RX", NULL, "SLIMBUS_6_RX Audio Mixer"}, - - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_7_RX Audio Mixer", "MultiMedia30", "MM_DL30"}, - {"SLIMBUS_7_RX", NULL, "SLIMBUS_7_RX Audio Mixer"}, - - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SLIMBUS_9_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SLIMBUS_9_RX", NULL, "SLIMBUS_9_RX Audio Mixer"}, - - {"USB_AUDIO_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"USB_AUDIO_RX Audio Mixer", "MultiMedia30", "MM_DL30"}, - {"USB_AUDIO_RX", NULL, "USB_AUDIO_RX Audio Mixer"}, - - {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia4 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia8 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia9 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"}, - {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia4 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia8 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia9 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"}, - {"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"}, - {"MultiMedia1 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia1 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia1 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"MultiMedia1 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia8 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia8 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia8 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia4 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia4 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia17 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia17 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia18 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia18 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia19 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia19 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia28 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia28 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia29 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia29 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia8 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia8 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia2 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia4 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia17 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia18 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia19 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia28 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia29 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia8 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia18 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia17 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia18 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia19 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia28 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia29 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia17 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia18 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia19 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia28 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia29 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia8 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia3 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia3 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia5 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia5 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia10 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia10 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia16 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia16 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia5 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia5 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"MultiMedia5 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia10 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia10 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia18 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia18 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"}, - - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX Audio Mixer"}, - - {"TERT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX Audio Mixer"}, - - {"SEC_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX Audio Mixer"}, - - {"SEC_MI2S_RX_SD1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_MI2S_RX_SD1", NULL, "SEC_MI2S_RX_SD1 Audio Mixer"}, - - {"SEC_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - - {"PRI_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX Audio Mixer"}, - - {"INT0_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INT0_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX Audio Mixer"}, - - {"INT4_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INT4_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX Audio Mixer"}, - - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX Audio Mixer"}, - - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0 Audio Mixer"}, - - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1 Audio Mixer"}, - - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2 Audio Mixer"}, - - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3 Audio Mixer"}, - - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_TX_0", NULL, "PRI_TDM_TX_0 Audio Mixer"}, - - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0 Audio Mixer"}, - - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_1", NULL, "SEC_TDM_RX_1 Audio Mixer"}, - - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_2", NULL, "SEC_TDM_RX_2 Audio Mixer"}, - - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3 Audio Mixer"}, - - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_TX_0", NULL, "SEC_TDM_TX_0 Audio Mixer"}, - - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0 Audio Mixer"}, - - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_TX_0", NULL, "TERT_TDM_TX_0 Audio Mixer"}, - - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_1", NULL, "TERT_TDM_RX_1 Audio Mixer"}, - - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_2", NULL, "TERT_TDM_RX_2 Audio Mixer"}, - - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_3", NULL, "TERT_TDM_RX_3 Audio Mixer"}, - - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_RX_4 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"TERT_TDM_RX_4", NULL, "TERT_TDM_RX_4 Audio Mixer"}, - - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia30", "MM_DL30"}, - {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Audio Mixer"}, - - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_TX_0", NULL, "QUAT_TDM_TX_0 Audio Mixer"}, - - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia30", "MM_DL30"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1 Audio Mixer"}, - - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia30", "MM_DL30"}, - {"QUAT_TDM_RX_2 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2 Audio Mixer"}, - - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia30", "MM_DL30"}, - {"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Audio Mixer"}, - - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Audio Mixer"}, - - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_TX_0", NULL, "QUIN_TDM_TX_0 Audio Mixer"}, - - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1 Audio Mixer"}, - - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2 Audio Mixer"}, - - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia20", "MM_DL20"}, - {"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Audio Mixer"}, - - {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"}, - {"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia3 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia5 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia10 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia16 Mixer", "MI2S_TX", "MI2S_TX"}, - {"MultiMedia1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia2 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia6 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia1 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia2 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia1 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia2 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia1 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia2 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia1 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia2 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia1 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia2 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia16 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"}, - {"MultiMedia16 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "TERT_AUX_PCM_TX", "TERT_AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia10 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia16 Mixer", "QUAT_AUX_PCM_TX", "QUAT_AUX_PCM_TX"}, - {"MultiMedia1 Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"MultiMedia3 Mixer", "QUIN_AUX_PCM_TX", "QUIN_AUX_PCM_TX"}, - {"MultiMedia5 Mixer", "QUIN_AUX_PCM_TX", "QUIN_AUX_PCM_TX"}, - {"MultiMedia2 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia2 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia2 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia2 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"MultiMedia1 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia1 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia2 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia6 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia6 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia6 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia3 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia5 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia10 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia6 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia3 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia5 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia10 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia16 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"}, - {"MultiMedia6 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia3 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia5 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia10 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia16 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia17 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia18 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia19 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia28 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia29 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"MultiMedia6 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia6 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia6 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia6 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia6 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - - {"MultiMedia1 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia1 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia1 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia1 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia1 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia1 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia1 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia1 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia1 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia1 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia1 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia1 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia1 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia2 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia2 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia2 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia2 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia2 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia2 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia2 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia2 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia2 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia2 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia2 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia2 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia2 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia3 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia3 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia3 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia3 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia3 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia3 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia3 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia3 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia3 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia3 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia3 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia3 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia3 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia4 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia4 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia4 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia4 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia4 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia4 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia4 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia4 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia4 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia4 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia4 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia4 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia4 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia5 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia5 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia5 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia5 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia5 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia5 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia5 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia5 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia5 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia5 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia5 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia5 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia5 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia6 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia6 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia6 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia6 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia6 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia6 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia6 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia6 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia6 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia6 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia6 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia6 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia6 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia8 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia8 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia8 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia8 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia8 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia8 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia8 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia8 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia8 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia8 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia8 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia8 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia8 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia9 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia9 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia9 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia9 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia9 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia9 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia9 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia9 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia9 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia10 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia10 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia10 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia10 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia10 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia10 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - - {"MultiMedia20 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia20 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia20 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia20 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia20 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia20 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia20 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia20 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia20 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia20 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia20 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia20 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia20 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia20 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia20 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia21 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"MultiMedia21 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"MultiMedia21 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia21 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia21 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia21 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia21 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia21 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia21 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"MultiMedia21 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia21 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia21 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia21 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia21 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia21 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia27 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"MultiMedia27 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MultiMedia27 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"}, - {"MultiMedia27 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"MultiMedia27 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"MultiMedia27 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"MultiMedia27 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"MultiMedia27 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"MultiMedia27 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"MultiMedia27 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"MultiMedia27 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia27 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia1 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia2 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia4 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia5 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia6 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia8 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia10 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - - {"MultiMedia16 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"MultiMedia16 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"MultiMedia16 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"MultiMedia16 Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"MultiMedia16 Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"MultiMedia16 Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"MultiMedia16 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"MultiMedia16 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"MultiMedia16 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"MultiMedia16 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"}, - {"MultiMedia16 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"}, - {"MultiMedia16 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"MultiMedia16 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia16 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - {"MultiMedia16 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"}, - {"MultiMedia16 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"}, - - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia17 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia18 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia19 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia28 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, - {"MultiMedia29 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"}, - - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia6", "MM_UL6"}, - {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"}, - - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia6", "MM_UL6"}, - {"INT_BT_A2DP_RX", NULL, "INTERNAL_A2DP_RX Audio Mixer"}, - - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"INTERNAL_FM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"}, - - {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"AFE_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"}, - - {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia3 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia4 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia10 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia17 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia18 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia19 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia28 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia29 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia5 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia8 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia16 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia4 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia16 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia17 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia18 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia19 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia28 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia29 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia5 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia6 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MultiMedia8 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - - {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia3 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia4 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia10 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia17 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia18 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia19 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia28 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia29 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia5 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia8 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MultiMedia16 Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"MM_UL1", NULL, "MultiMedia1 Mixer"}, - {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"MM_UL2", NULL, "MultiMedia2 Mixer"}, - {"MM_UL3", NULL, "MultiMedia3 Mixer"}, - {"MM_UL4", NULL, "MultiMedia4 Mixer"}, - {"MM_UL5", NULL, "MultiMedia5 Mixer"}, - {"MM_UL6", NULL, "MultiMedia6 Mixer"}, - {"MM_UL8", NULL, "MultiMedia8 Mixer"}, - {"MM_UL9", NULL, "MultiMedia9 Mixer"}, - {"MM_UL10", NULL, "MultiMedia10 Mixer"}, - {"MM_UL16", NULL, "MultiMedia16 Mixer"}, - {"MM_UL17", NULL, "MultiMedia17 Mixer"}, - {"MM_UL18", NULL, "MultiMedia18 Mixer"}, - {"MM_UL19", NULL, "MultiMedia19 Mixer"}, - {"MM_UL20", NULL, "MultiMedia20 Mixer"}, - {"MM_UL21", NULL, "MultiMedia21 Mixer"}, - {"MM_UL27", NULL, "MultiMedia27 Mixer"}, - {"MM_UL28", NULL, "MultiMedia28 Mixer"}, - {"MM_UL29", NULL, "MultiMedia29 Mixer"}, - - {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"AUX_PCM_RX Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"}, - - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia21", "MM_DL21"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUX_PCM_RX Audio Mixer"}, - - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_AUX_PCM_RX", NULL, "TERT_AUX_PCM_RX Audio Mixer"}, - - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_AUX_PCM_RX", NULL, "QUAT_AUX_PCM_RX Audio Mixer"}, - - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_AUX_PCM_RX", NULL, "QUIN_AUX_PCM_RX Audio Mixer"}, - - {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"}, - - {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEC_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SEC_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"}, - - {"SEC_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SEC_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SEC_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX_Voice Mixer"}, - - {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_0_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_0_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_0_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_0_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"}, - - {"SLIM_6_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_6_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_6_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_6_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_6_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_6_RX", NULL, "SLIM_6_RX_Voice Mixer"}, - - {"USB_AUDIO_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"USB_AUDIO_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"USB_AUDIO_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"USB_AUDIO_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"USB_AUDIO_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"USB_AUDIO_RX", NULL, "USB_AUDIO_RX_Voice Mixer"}, - - {"DISPLAY_PORT_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"DISPLAY_PORT_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"DISPLAY_PORT", NULL, "DISPLAY_PORT_RX_Voice Mixer"}, - - {"DISPLAY_PORT_RX1_Voice Mixer", "Voip", "VOIP_DL"}, - {"DISPLAY_PORT_RX1_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"DISPLAY_PORT_RX1_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"DISPLAY_PORT_RX1_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"DISPLAY_PORT_RX1_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"DISPLAY_PORT1", NULL, "DISPLAY_PORT_RX1_Voice Mixer"}, - - {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"}, - - {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"AFE_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"AFE_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"AFE_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"AFE_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"}, - - {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"}, - - {"SEC_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SEC_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUX_PCM_RX_Voice Mixer"}, - - {"TERT_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"TERT_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"TERT_AUX_PCM_RX", NULL, "TERT_AUX_PCM_RX_Voice Mixer"}, - - {"QUAT_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUAT_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUAT_AUX_PCM_RX", NULL, "QUAT_AUX_PCM_RX_Voice Mixer"}, - - {"QUIN_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUIN_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUIN_AUX_PCM_RX", NULL, "QUIN_AUX_PCM_RX_Voice Mixer"}, - - {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"HDMI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"HDMI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"HDMI_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"HDMI_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"HDMI", NULL, "HDMI_RX_Voice Mixer"}, - {"HDMI", NULL, "HDMI_DL_HL"}, - - {"MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"}, - - {"PRI_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"PRI_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PRI_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_Voice Mixer"}, - - {"INT0_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"INT0_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"INT0_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"INT0_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"INT0_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX_Voice Mixer"}, - - {"INT4_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"INT4_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"INT4_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"INT4_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"INT4_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_Voice Mixer"}, - - {"TERT_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"TERT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"TERT_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX_Voice Mixer"}, - - {"QUAT_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_Voice Mixer"}, - - {"QUIN_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUIN_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX_Voice Mixer"}, - - {"QUAT_TDM_RX_2_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2_Voice Mixer"}, - - {"WSA_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"WSA_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0_Voice Mixer"}, - - {"PROXY_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"PROXY_RX", NULL, "PROXY_RX_Voice Mixer"}, - - {"PROXY_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"PROXY_RX", NULL, "PROXY_RX_Voice Mixer"}, - - {"RX_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"RX_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0_Voice Mixer"}, - - {"VOC_EXT_EC MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"VOC_EXT_EC MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"VOC_EXT_EC MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"VOC_EXT_EC MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"VOC_EXT_EC MUX", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"VOC_EXT_EC MUX", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"VOC_EXT_EC MUX", "SEC_TDM_TX", "SEC_TDM_TX_0"}, - {"VOIP_UL", NULL, "VOC_EXT_EC MUX"}, - {"VOICEMMODE1_UL", NULL, "VOC_EXT_EC MUX"}, - {"VOICEMMODE2_UL", NULL, "VOC_EXT_EC MUX"}, - - {"AUDIO_REF_EC_UL1 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_0", "QUAT_TDM_RX_0"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_1", "QUAT_TDM_RX_1"}, - {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_2", "QUAT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL1 MUX", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"AUDIO_REF_EC_UL1 MUX", "TERT_TDM_RX_2", "TERT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL1 MUX", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - - {"AUDIO_REF_EC_UL2 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL2 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL2 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL2 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL3 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL3 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL3 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL3 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL4 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL4 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL4 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL4 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL5 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL5 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL5 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL5 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL6 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL6 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL6 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL6 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL8 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL8 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL8 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL8 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL9 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL9 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL9 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL9 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL10 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_0", "QUAT_TDM_RX_0"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_1", "QUAT_TDM_RX_1"}, - {"AUDIO_REF_EC_UL10 MUX", "QUAT_TDM_RX_2", "QUAT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL10 MUX", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"AUDIO_REF_EC_UL10 MUX", "TERT_TDM_RX_2", "TERT_TDM_RX_2"}, - {"AUDIO_REF_EC_UL10 MUX", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - - {"AUDIO_REF_EC_UL16 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL16 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL17 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL17 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL18 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL18 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL19 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL19 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL28 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL28 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"AUDIO_REF_EC_UL29 MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"AUDIO_REF_EC_UL29 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - - {"LSM1_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM2_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM3_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM4_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM5_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM6_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM7_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"LSM8_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"}, - - {"MM_UL1", NULL, "AUDIO_REF_EC_UL1 MUX"}, - {"MM_UL2", NULL, "AUDIO_REF_EC_UL2 MUX"}, - {"MM_UL3", NULL, "AUDIO_REF_EC_UL3 MUX"}, - {"MM_UL4", NULL, "AUDIO_REF_EC_UL4 MUX"}, - {"MM_UL5", NULL, "AUDIO_REF_EC_UL5 MUX"}, - {"MM_UL6", NULL, "AUDIO_REF_EC_UL6 MUX"}, - {"MM_UL8", NULL, "AUDIO_REF_EC_UL8 MUX"}, - {"MM_UL9", NULL, "AUDIO_REF_EC_UL9 MUX"}, - {"MM_UL10", NULL, "AUDIO_REF_EC_UL10 MUX"}, - {"MM_UL16", NULL, "AUDIO_REF_EC_UL16 MUX"}, - {"MM_UL17", NULL, "AUDIO_REF_EC_UL17 MUX"}, - {"MM_UL18", NULL, "AUDIO_REF_EC_UL18 MUX"}, - {"MM_UL19", NULL, "AUDIO_REF_EC_UL19 MUX"}, - {"MM_UL28", NULL, "AUDIO_REF_EC_UL28 MUX"}, - {"MM_UL29", NULL, "AUDIO_REF_EC_UL29 MUX"}, - - {"VoiceMMode1_Tx Mixer", "PRI_TX_MMode1", "PRI_I2S_TX"}, - {"VoiceMMode1_Tx Mixer", "PRI_MI2S_TX_MMode1", "PRI_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "MI2S_TX_MMode1", "MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "TERT_MI2S_TX_MMode1", "TERT_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "INT3_MI2S_TX_MMode1", "INT3_MI2S_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_0_TX_MMode1", "SLIMBUS_0_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_1_TX_MMode1", "SLIMBUS_1_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_7_TX_MMode1", "SLIMBUS_7_TX"}, - {"VoiceMMode1_Tx Mixer", "SLIM_8_TX_MMode1", "SLIMBUS_8_TX"}, - {"VoiceMMode1_Tx Mixer", "USB_AUDIO_TX_MMode1", "USB_AUDIO_TX"}, - {"VoiceMMode1_Tx Mixer", "INT_BT_SCO_TX_MMode1", "INT_BT_SCO_TX"}, - {"VoiceMMode1_Tx Mixer", "AFE_PCM_TX_MMode1", "PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "AUX_PCM_TX_MMode1", "AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "SEC_AUX_PCM_TX_MMode1", "SEC_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "TERT_AUX_PCM_TX_MMode1", "TERT_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUAT_AUX_PCM_TX_MMode1", "QUAT_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUIN_AUX_PCM_TX_MMode1", "QUIN_AUX_PCM_TX"}, - {"VoiceMMode1_Tx Mixer", "QUAT_TDM_TX_0_MMode1", "QUAT_TDM_TX_0"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_0_MMode1", "TX_CDC_DMA_TX_0"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_1_MMode1", "TX_CDC_DMA_TX_1"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_2_MMode1", "TX_CDC_DMA_TX_2"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_3_MMode1", "TX_CDC_DMA_TX_3"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_4_MMode1", "TX_CDC_DMA_TX_4"}, - {"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_5_MMode1", "TX_CDC_DMA_TX_5"}, - {"VoiceMMode1_Tx Mixer", "PROXY_TX_MMode1", "PROXY_TX"}, - {"VOICEMMODE1_UL", NULL, "VoiceMMode1_Tx Mixer"}, - - {"VoiceMMode2_Tx Mixer", "PRI_TX_MMode2", "PRI_I2S_TX"}, - {"VoiceMMode2_Tx Mixer", "PRI_MI2S_TX_MMode2", "PRI_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "MI2S_TX_MMode2", "MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "TERT_MI2S_TX_MMode2", "TERT_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "INT3_MI2S_TX_MMode2", "INT3_MI2S_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_0_TX_MMode2", "SLIMBUS_0_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_1_TX_MMode2", "SLIMBUS_1_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_7_TX_MMode2", "SLIMBUS_7_TX"}, - {"VoiceMMode2_Tx Mixer", "SLIM_8_TX_MMode2", "SLIMBUS_8_TX"}, - {"VoiceMMode2_Tx Mixer", "USB_AUDIO_TX_MMode2", "USB_AUDIO_TX"}, - {"VoiceMMode2_Tx Mixer", "INT_BT_SCO_TX_MMode2", "INT_BT_SCO_TX"}, - {"VoiceMMode2_Tx Mixer", "AFE_PCM_TX_MMode2", "PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "AUX_PCM_TX_MMode2", "AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "SEC_AUX_PCM_TX_MMode2", "SEC_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "TERT_AUX_PCM_TX_MMode2", "TERT_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "QUAT_AUX_PCM_TX_MMode2", "QUAT_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "QUIN_AUX_PCM_TX_MMode2", "QUIN_AUX_PCM_TX"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_0_MMode2", "TX_CDC_DMA_TX_0"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_1_MMode2", "TX_CDC_DMA_TX_1"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_2_MMode2", "TX_CDC_DMA_TX_2"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_3_MMode2", "TX_CDC_DMA_TX_3"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_4_MMode2", "TX_CDC_DMA_TX_4"}, - {"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_5_MMode2", "TX_CDC_DMA_TX_5"}, - {"VoiceMMode2_Tx Mixer", "PROXY_TX_MMode2", "PROXY_TX"}, - {"VOICEMMODE2_UL", NULL, "VoiceMMode2_Tx Mixer"}, - - {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"}, - {"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"}, - {"Voip_Tx Mixer", "TERT_MI2S_TX_Voip", "TERT_MI2S_TX"}, - {"Voip_Tx Mixer", "INT3_MI2S_TX_Voip", "INT3_MI2S_TX"}, - {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"}, - {"Voip_Tx Mixer", "SLIM_1_TX_Voip", "SLIMBUS_1_TX"}, - {"Voip_Tx Mixer", "SLIM_7_TX_Voip", "SLIMBUS_7_TX"}, - {"Voip_Tx Mixer", "SLIM_8_TX_Voip", "SLIMBUS_8_TX"}, - {"Voip_Tx Mixer", "USB_AUDIO_TX_Voip", "USB_AUDIO_TX"}, - {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"}, - {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"}, - {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"}, - {"Voip_Tx Mixer", "SEC_AUX_PCM_TX_Voip", "SEC_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "TERT_AUX_PCM_TX_Voip", "TERT_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "QUAT_AUX_PCM_TX_Voip", "QUAT_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "QUIN_AUX_PCM_TX_Voip", "QUIN_AUX_PCM_TX"}, - {"Voip_Tx Mixer", "PRI_MI2S_TX_Voip", "PRI_MI2S_TX"}, - {"VOIP_UL", NULL, "Voip_Tx Mixer"}, - - {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"}, - {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"}, - {"SLIMBUS1_DL_HL", "Switch", "SLIM1_DL_HL"}, - {"SLIMBUS_1_RX", NULL, "SLIMBUS1_DL_HL"}, - {"SLIMBUS3_DL_HL", "Switch", "SLIM3_DL_HL"}, - {"SLIMBUS_3_RX", NULL, "SLIMBUS3_DL_HL"}, - {"SLIMBUS4_DL_HL", "Switch", "SLIM4_DL_HL"}, - {"SLIMBUS_4_RX", NULL, "SLIMBUS4_DL_HL"}, - {"SLIMBUS6_DL_HL", "Switch", "SLIM0_DL_HL"}, - {"SLIMBUS_6_RX", NULL, "SLIMBUS6_DL_HL"}, - {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"}, - {"SLIM1_UL_HL", NULL, "SLIMBUS_1_TX"}, - {"SLIM3_UL_HL", NULL, "SLIMBUS_3_TX"}, - {"SLIM4_UL_HL", NULL, "SLIMBUS_4_TX"}, - {"SLIM8_UL_HL", NULL, "SLIMBUS_8_TX"}, - {"WSA_CDC_DMA_RX_0_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0_DL_HL"}, - {"CDC_DMA_UL_HL", NULL, "VA_CDC_DMA_TX_0"}, - {"RX_CDC_DMA_RX_0_DL_HL", "Switch", "CDC_DMA_DL_HL"}, - {"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0_DL_HL"}, - {"TX3_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_3"}, - {"LSM1 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM1 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM1 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM1 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM1 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM1 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM1 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM1 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM1 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM1 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM1_UL_HL", NULL, "LSM1 Mixer"}, - - {"LSM2 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM2 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM2 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM2 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM2 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM2 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM2 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM2 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM2 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM2 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM2 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM2 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM2_UL_HL", NULL, "LSM2 Mixer"}, - - - {"LSM3 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM3 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM3 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM3 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM3 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM3 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM3 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM3 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM3 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM3 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM3 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM3 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM3_UL_HL", NULL, "LSM3 Mixer"}, - - - {"LSM4 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM4 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM4 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM4 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM4 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM4 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM4 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM4 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM4 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM4 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM4 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM4 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM4_UL_HL", NULL, "LSM4 Mixer"}, - - {"LSM5 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM5 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM5 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM5 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM5 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM5 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"LSM5 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM5 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"LSM5 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM5 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM5 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM5 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM5_UL_HL", NULL, "LSM5 Mixer"}, - - {"LSM6 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM6 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM6 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM6 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM6 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM6 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM6 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM6 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM6 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM6 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM6_UL_HL", NULL, "LSM6 Mixer"}, - - {"LSM7 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM7 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM7 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM7 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM7 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM7 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM7 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM7 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM7 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM7 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM7_UL_HL", NULL, "LSM7 Mixer"}, - - {"LSM8 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, - {"LSM8 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, - {"LSM8 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, - {"LSM8 Mixer", "SLIMBUS_4_TX", "SLIMBUS_4_TX"}, - {"LSM8 Mixer", "SLIMBUS_5_TX", "SLIMBUS_5_TX"}, - {"LSM8 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"LSM8 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"LSM8 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"}, - {"LSM8 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"LSM8 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"LSM8_UL_HL", NULL, "LSM8 Mixer"}, - - - {"CPE_LSM_UL_HL", NULL, "BE_IN"}, - {"QCHAT_Tx Mixer", "PRI_TX_QCHAT", "PRI_I2S_TX"}, - {"QCHAT_Tx Mixer", "SLIM_0_TX_QCHAT", "SLIMBUS_0_TX"}, - {"QCHAT_Tx Mixer", "SLIM_7_TX_QCHAT", "SLIMBUS_7_TX"}, - {"QCHAT_Tx Mixer", "SLIM_8_TX_QCHAT", "SLIMBUS_8_TX"}, - {"QCHAT_Tx Mixer", "INTERNAL_BT_SCO_TX_QCHAT", "INT_BT_SCO_TX"}, - {"QCHAT_Tx Mixer", "AFE_PCM_TX_QCHAT", "PCM_TX"}, - {"QCHAT_Tx Mixer", "AUX_PCM_TX_QCHAT", "AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "SEC_AUX_PCM_TX_QCHAT", "SEC_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "TERT_AUX_PCM_TX_QCHAT", "TERT_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "QUAT_AUX_PCM_TX_QCHAT", "QUAT_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "QUIN_AUX_PCM_TX_QCHAT", "QUIN_AUX_PCM_TX"}, - {"QCHAT_Tx Mixer", "MI2S_TX_QCHAT", "MI2S_TX"}, - {"QCHAT_Tx Mixer", "PRI_MI2S_TX_QCHAT", "PRI_MI2S_TX"}, - {"QCHAT_Tx Mixer", "TERT_MI2S_TX_QCHAT", "TERT_MI2S_TX"}, - {"QCHAT_Tx Mixer", "INT3_MI2S_TX_QCHAT", "INT3_MI2S_TX"}, - {"QCHAT_Tx Mixer", "USB_AUDIO_TX_QCHAT", "USB_AUDIO_TX"}, - {"QCHAT_UL", NULL, "QCHAT_Tx Mixer"}, - - {"INT_FM_RX", NULL, "INTFM_DL_HL"}, - {"INTFM_UL_HL", NULL, "INT_FM_TX"}, - {"INTHFP_UL_HL", NULL, "HFP_PRI_AUX_UL_HL"}, - {"HFP_PRI_AUX_UL_HL", "Switch", "AUX_PCM_TX"}, - {"INTHFP_UL_HL", NULL, "HFP_AUX_UL_HL"}, - {"HFP_AUX_UL_HL", "Switch", "SEC_AUX_PCM_TX"}, - {"INTHFP_UL_HL", NULL, "HFP_INT_UL_HL"}, - {"HFP_INT_UL_HL", "Switch", "INT_BT_SCO_TX"}, - {"SLIM7_UL_HL", NULL, "HFP_SLIM7_UL_HL"}, - {"HFP_SLIM7_UL_HL", "Switch", "SLIMBUS_7_TX"}, - {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"}, - {"AUX_PCM_RX", NULL, "INTHFP_DL_HL"}, - {"SLIM7_UL_HL", NULL, "A2DP_SLIM7_UL_HL"}, - {"A2DP_SLIM7_UL_HL", "Switch", "SLIMBUS_7_TX"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUXPCM_DL_HL"}, - {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"}, - {"SEC_AUXPCM_UL_HL", NULL, "SEC_AUX_PCM_TX"}, - {"MI2S_RX", NULL, "MI2S_DL_HL"}, - {"MI2S_UL_HL", NULL, "MI2S_TX"}, - {"PCM_RX_DL_HL", "Switch", "SLIM0_DL_HL"}, - {"PCM_RX", NULL, "PCM_RX_DL_HL"}, - - /* connect to INT4_MI2S_DL_HL since same pcm_id */ - {"INT0_MI2S_RX_DL_HL", "Switch", "INT4_MI2S_DL_HL"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX_DL_HL"}, - {"INT4_MI2S_RX_DL_HL", "Switch", "INT4_MI2S_DL_HL"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_DL_HL"}, - {"PRI_MI2S_RX_DL_HL", "Switch", "PRI_MI2S_DL_HL"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_DL_HL"}, - {"SEC_MI2S_RX_DL_HL", "Switch", "SEC_MI2S_DL_HL"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX_DL_HL"}, - {"TERT_MI2S_RX_DL_HL", "Switch", "TERT_MI2S_DL_HL"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX_DL_HL"}, - - {"QUAT_MI2S_RX_DL_HL", "Switch", "QUAT_MI2S_DL_HL"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_DL_HL"}, - {"QUIN_MI2S_RX_DL_HL", "Switch", "QUIN_MI2S_DL_HL"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX_DL_HL"}, - {"MI2S_UL_HL", NULL, "TERT_MI2S_TX"}, - {"INT3_MI2S_UL_HL", NULL, "INT3_MI2S_TX"}, - {"TERT_MI2S_UL_HL", NULL, "TERT_MI2S_TX"}, - {"SEC_I2S_RX", NULL, "SEC_I2S_DL_HL"}, - {"PRI_MI2S_UL_HL", NULL, "PRI_MI2S_TX"}, - {"SEC_MI2S_UL_HL", NULL, "SEC_MI2S_TX"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_DL_HL"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_DL_HL"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_DL_HL"}, - {"QUAT_MI2S_UL_HL", NULL, "QUAT_MI2S_TX"}, - - {"PRI_TDM_TX_0_UL_HL", NULL, "PRI_TDM_TX_0"}, - {"PRI_TDM_TX_1_UL_HL", NULL, "PRI_TDM_TX_1"}, - {"PRI_TDM_TX_2_UL_HL", NULL, "PRI_TDM_TX_2"}, - {"PRI_TDM_TX_3_UL_HL", NULL, "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0_DL_HL"}, - {"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1_DL_HL"}, - {"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2_DL_HL"}, - {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3_DL_HL"}, - {"SEC_TDM_TX_0_UL_HL", NULL, "SEC_TDM_TX_0"}, - {"SEC_TDM_TX_1_UL_HL", NULL, "SEC_TDM_TX_1"}, - {"SEC_TDM_TX_2_UL_HL", NULL, "SEC_TDM_TX_2"}, - {"SEC_TDM_TX_3_UL_HL", NULL, "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0_DL_HL"}, - {"SEC_TDM_RX_1", NULL, "SEC_TDM_RX_1_DL_HL"}, - {"SEC_TDM_RX_2", NULL, "SEC_TDM_RX_2_DL_HL"}, - {"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3_DL_HL"}, - {"SEC_TDM_RX_7", NULL, "SEC_TDM_RX_7_DL_HL"}, - {"TERT_TDM_TX_0_UL_HL", NULL, "TERT_TDM_TX_0"}, - {"TERT_TDM_TX_1_UL_HL", NULL, "TERT_TDM_TX_1"}, - {"TERT_TDM_TX_2_UL_HL", NULL, "TERT_TDM_TX_2"}, - {"TERT_TDM_TX_3_UL_HL", NULL, "TERT_TDM_TX_3"}, - {"TERT_TDM_TX_7_UL_HL", NULL, "TERT_TDM_TX_7"}, - {"ADSP_SSR_TRIGGER", "Switch", "TERT_TDM_RX_0_DL_HL"}, - {"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0_DL_HL"}, - {"TERT_TDM_RX_1", NULL, "TERT_TDM_RX_1_DL_HL"}, - {"TERT_TDM_RX_2", NULL, "TERT_TDM_RX_2_DL_HL"}, - {"TERT_TDM_RX_3", NULL, "TERT_TDM_RX_3_DL_HL"}, - {"QUAT_TDM_TX_0_UL_HL", NULL, "QUAT_TDM_TX_0"}, - {"QUAT_TDM_TX_1_UL_HL", NULL, "QUAT_TDM_TX_1"}, - {"QUAT_TDM_TX_2_UL_HL", NULL, "QUAT_TDM_TX_2"}, - {"QUAT_TDM_TX_3_UL_HL", NULL, "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0_DL_HL"}, - {"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1_DL_HL"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2_DL_HL"}, - {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3_DL_HL"}, - {"QUIN_TDM_TX_0_UL_HL", NULL, "QUIN_TDM_TX_0"}, - {"QUIN_TDM_TX_1_UL_HL", NULL, "QUIN_TDM_TX_1"}, - {"QUIN_TDM_TX_2_UL_HL", NULL, "QUIN_TDM_TX_2"}, - {"QUIN_TDM_TX_3_UL_HL", NULL, "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0_DL_HL"}, - {"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1_DL_HL"}, - {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2_DL_HL"}, - {"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3_DL_HL"}, - - {"PRI_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_0 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0 Port Mixer"}, - - {"PRI_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_1 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1 Port Mixer"}, - - {"PRI_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_2 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2 Port Mixer"}, - - {"PRI_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, - {"PRI_TDM_RX_3 Port Mixer", "PRI_TDM_TX_3", "PRI_TDM_TX_3"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"PRI_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3 Port Mixer"}, - - {"SEC_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_0 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0 Port Mixer"}, - - {"SEC_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_1 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_1", NULL, "SEC_TDM_RX_1 Port Mixer"}, - - {"SEC_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_2 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_2", NULL, "SEC_TDM_RX_2 Port Mixer"}, - - {"SEC_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, - {"SEC_TDM_RX_3 Port Mixer", "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"SEC_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3 Port Mixer"}, - - {"SEC_TDM_RX_7 Port Mixer", "TERT_TDM_TX_7", "TERT_TDM_TX_7"}, - {"SEC_TDM_RX_7", NULL, "SEC_TDM_RX_7 Port Mixer"}, - - {"TERT_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_0 Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0 Port Mixer"}, - - {"TERT_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_1", NULL, "TERT_TDM_RX_1 Port Mixer"}, - - {"TERT_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_2", NULL, "TERT_TDM_RX_2 Port Mixer"}, - - {"TERT_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"TERT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"TERT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"TERT_TDM_RX_3", NULL, "TERT_TDM_RX_3 Port Mixer"}, - - {"QUAT_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Port Mixer"}, - - {"QUAT_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1 Port Mixer"}, - - {"QUAT_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2 Port Mixer"}, - - {"QUAT_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUAT_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Port Mixer"}, - - {"QUIN_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Port Mixer"}, - - {"QUIN_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1 Port Mixer"}, - - {"QUIN_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2 Port Mixer"}, - - {"QUIN_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, - {"QUIN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, - {"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, - {"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Port Mixer"}, - - {"INT0_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"INT0_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"INT0_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"INT0_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"INT0_MI2S_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"INT0_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"INT0_MI2S_RX", NULL, "INT0_MI2S_RX Port Mixer"}, - - {"INT4_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"INT4_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"INT4_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"INT4_MI2S_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"INT4_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"INT4_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX Port Mixer"}, - - {"WSA_CDC_DMA_RX_0 Port Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"}, - {"WSA_CDC_DMA_RX_0 Port Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"RX_CDC_DMA_RX_0 Port Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, - {"WSA_CDC_DMA_RX_0 Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"RX_CDC_DMA_RX_0 Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - - - {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"SLIMBUS_0_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"SLIMBUS_0_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"}, - {"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"AFE_PCM_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"PCM_RX", NULL, "AFE_PCM_RX Port Mixer"}, - {"USB_AUDIO_RX Port Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"}, - {"USB_AUDIO_RX", NULL, "USB_AUDIO_RX Port Mixer"}, - {"USB_DL_HL", "Switch", "USBAUDIO_DL_HL"}, - {"USB_AUDIO_RX", NULL, "USB_DL_HL"}, - {"USBAUDIO_UL_HL", NULL, "USB_AUDIO_TX"}, - - - {"AUX_PCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"AUX_PCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"AUX_PCM_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"AUX_PCM_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"AUX_PCM_RX Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, - {"AUX_PCM_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"AUX_PCM_RX", NULL, "AUX_PCM_RX Port Mixer"}, - - {"SEC_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_AUXPCM_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SEC_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SEC_AUXPCM_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_AUX_PCM_RX", NULL, "SEC_AUXPCM_RX Port Mixer"}, - - {"TERT_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"TERT_AUXPCM_RX Port Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"TERT_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"TERT_AUX_PCM_RX", NULL, "TERT_AUXPCM_RX Port Mixer"}, - - {"QUAT_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_AUXPCM_RX Port Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"QUAT_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUAT_AUX_PCM_RX", NULL, "QUAT_AUXPCM_RX Port Mixer"}, - - {"QUIN_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUIN_AUXPCM_RX Port Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"QUIN_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUIN_AUX_PCM_RX", NULL, "QUIN_AUXPCM_RX Port Mixer"}, - - {"Voice Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"}, - {"Voice Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"Voice Stub Tx Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"Voice Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"}, - {"Voice Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, - {"Voice Stub Tx Mixer", "MI2S_TX", "MI2S_TX"}, - {"Voice Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"Voice Stub Tx Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"Voice Stub Tx Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"}, - {"Voice Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"Voice Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"Voice Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"}, - {"Voice Stub Tx Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"Voice Stub Tx Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"Voice Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"VOICE_STUB_UL", NULL, "Voice Stub Tx Mixer"}, - - {"VoLTE Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"VoLTE Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"}, - {"VoLTE Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"VoLTE Stub Tx Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"VoLTE Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"VoLTE Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"VoLTE Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"VOLTE_STUB_UL", NULL, "VoLTE Stub Tx Mixer"}, - - {"Voice2 Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"Voice2 Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"}, - {"Voice2 Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"Voice2 Stub Tx Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"Voice2 Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"Voice2 Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"Voice2 Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"VOICE2_STUB_UL", NULL, "Voice2 Stub Tx Mixer"}, - - {"STUB_RX Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"STUB_RX Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"STUB_RX", NULL, "STUB_RX Mixer"}, - - {"SLIMBUS_1_RX Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIMBUS_1_RX Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"}, - - {"SLIMBUS_3_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIMBUS_3_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX_Voice Mixer"}, - - {"SLIM_7_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_7_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_7_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_7_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_7_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_7_RX", NULL, "SLIM_7_RX_Voice Mixer"}, - - {"SLIM_8_RX_Voice Mixer", "Voip", "VOIP_DL"}, - {"SLIM_8_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"}, - {"SLIM_8_RX_Voice Mixer", "QCHAT", "QCHAT_DL"}, - {"SLIM_8_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"}, - {"SLIM_8_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"}, - {"SLIMBUS_8_RX", NULL, "SLIM_8_RX_Voice Mixer"}, - - {"SLIMBUS_1_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SLIMBUS_1_RX Port Mixer", "AFE_PCM_TX", "PCM_TX"}, - {"SLIMBUS_1_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Port Mixer"}, - {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Port Mixer"}, - {"SLIMBUS_3_RX Port Mixer", "INTERNAL_BT_SCO_RX", "INT_BT_SCO_RX"}, - {"SLIMBUS_3_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SLIMBUS_3_RX Port Mixer", "AFE_PCM_RX", "PCM_RX"}, - {"SLIMBUS_3_RX Port Mixer", "AUX_PCM_RX", "AUX_PCM_RX"}, - {"SLIMBUS_3_RX Port Mixer", "SLIM_0_RX", "SLIMBUS_0_RX"}, - {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX Port Mixer"}, - - {"SLIMBUS_6_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, - {"SLIMBUS_6_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SLIMBUS_6_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"SLIMBUS_6_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SLIMBUS_6_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"SLIMBUS_6_RX", NULL, "SLIMBUS_6_RX Port Mixer"}, - - {"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"HDMI", NULL, "HDMI_RX Port Mixer"}, - - {"DISPLAY_PORT_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"DISPLAY_PORT", NULL, "DISPLAY_PORT_RX Port Mixer"}, - - {"DISPLAY_PORT_RX1 Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"DISPLAY_PORT1", NULL, "DISPLAY_PORT_RX1 Port Mixer"}, - - {"SEC_I2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"SEC_I2S_RX", NULL, "SEC_I2S_RX Port Mixer"}, - - {"MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, - {"MI2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"}, - {"MI2S_RX", NULL, "MI2S_RX Port Mixer"}, - - {"PRI_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"PRI_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"PRI_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, - {"PRI_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"PRI_MI2S_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX Port Mixer"}, - - {"SEC_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"SEC_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"SEC_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"SEC_MI2S_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX Port Mixer"}, - - {"TERT_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"TERT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"TERT_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX Port Mixer"}, - - {"QUAT_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"QUAT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUAT_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"QUAT_MI2S_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, - {"QUAT_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX Port Mixer"}, - - {"QUIN_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"}, - {"QUIN_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, - {"QUIN_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"}, - {"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX Port Mixer"}, - - /* Backend Enablement */ - - {"BE_OUT", NULL, "PRI_I2S_RX"}, - {"BE_OUT", NULL, "SEC_I2S_RX"}, - {"BE_OUT", NULL, "SLIMBUS_0_RX"}, - {"BE_OUT", NULL, "SLIMBUS_1_RX"}, - {"BE_OUT", NULL, "SLIMBUS_2_RX"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "SLIMBUS_4_RX"}, - {"BE_OUT", NULL, "SLIMBUS_5_RX"}, - {"BE_OUT", NULL, "SLIMBUS_6_RX"}, - {"BE_OUT", NULL, "SLIMBUS_7_RX"}, - {"BE_OUT", NULL, "SLIMBUS_8_RX"}, - {"BE_OUT", NULL, "SLIMBUS_9_RX"}, - {"BE_OUT", NULL, "USB_AUDIO_RX"}, - {"BE_OUT", NULL, "HDMI"}, - {"BE_OUT", NULL, "DISPLAY_PORT"}, - {"BE_OUT", NULL, "DISPLAY_PORT1"}, - {"BE_OUT", NULL, "PRI_SPDIF_RX"}, - {"BE_OUT", NULL, "SEC_SPDIF_RX"}, - {"BE_OUT", NULL, "MI2S_RX"}, - {"BE_OUT", NULL, "QUAT_MI2S_RX"}, - {"BE_OUT", NULL, "QUIN_MI2S_RX"}, - {"BE_OUT", NULL, "TERT_MI2S_RX"}, - {"BE_OUT", NULL, "SEC_MI2S_RX"}, - {"BE_OUT", NULL, "SEC_MI2S_RX_SD1"}, - {"BE_OUT", NULL, "PRI_MI2S_RX"}, - {"BE_OUT", NULL, "INT0_MI2S_RX"}, - {"BE_OUT", NULL, "INT4_MI2S_RX"}, - {"BE_OUT", NULL, "INT2_MI2S_RX"}, - {"BE_OUT", NULL, "INT3_MI2S_RX"}, - {"BE_OUT", NULL, "INT5_MI2S_RX"}, - {"BE_OUT", NULL, "INT_BT_SCO_RX"}, - {"BE_OUT", NULL, "INT_BT_A2DP_RX"}, - {"BE_OUT", NULL, "INT_FM_RX"}, - {"BE_OUT", NULL, "PCM_RX"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "AUX_PCM_RX"}, - {"BE_OUT", NULL, "SEC_AUX_PCM_RX"}, - {"BE_OUT", NULL, "TERT_AUX_PCM_RX"}, - {"BE_OUT", NULL, "QUAT_AUX_PCM_RX"}, - {"BE_OUT", NULL, "QUIN_AUX_PCM_RX"}, - {"BE_OUT", NULL, "INT_BT_SCO_RX"}, - {"BE_OUT", NULL, "INT_FM_RX"}, - {"BE_OUT", NULL, "PCM_RX"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "VOICE_PLAYBACK_TX"}, - {"BE_OUT", NULL, "VOICE2_PLAYBACK_TX"}, - {"BE_OUT", NULL, "PRI_TDM_RX_0"}, - {"BE_OUT", NULL, "PRI_TDM_RX_1"}, - {"BE_OUT", NULL, "PRI_TDM_RX_2"}, - {"BE_OUT", NULL, "PRI_TDM_RX_3"}, - {"BE_OUT", NULL, "SEC_TDM_RX_0"}, - {"BE_OUT", NULL, "SEC_TDM_RX_1"}, - {"BE_OUT", NULL, "SEC_TDM_RX_2"}, - {"BE_OUT", NULL, "SEC_TDM_RX_3"}, - {"BE_OUT", NULL, "SEC_TDM_RX_7"}, - {"BE_OUT", NULL, "TERT_TDM_RX_0"}, - {"BE_OUT", NULL, "TERT_TDM_RX_1"}, - {"BE_OUT", NULL, "TERT_TDM_RX_2"}, - {"BE_OUT", NULL, "TERT_TDM_RX_3"}, - {"BE_OUT", NULL, "TERT_TDM_RX_4"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_0"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_1"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_2"}, - {"BE_OUT", NULL, "QUAT_TDM_RX_3"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_0"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_1"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_2"}, - {"BE_OUT", NULL, "QUIN_TDM_RX_3"}, - {"BE_OUT", NULL, "WSA_CDC_DMA_RX_0"}, - {"BE_OUT", NULL, "WSA_CDC_DMA_RX_1"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_0"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_1"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_2"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_3"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_4"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_5"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_6"}, - {"BE_OUT", NULL, "RX_CDC_DMA_RX_7"}, - {"BE_OUT", NULL, "PROXY_RX"}, - - {"PRI_I2S_TX", NULL, "BE_IN"}, - {"MI2S_TX", NULL, "BE_IN"}, - {"QUAT_MI2S_TX", NULL, "BE_IN"}, - {"QUIN_MI2S_TX", NULL, "BE_IN"}, - {"PRI_MI2S_TX", NULL, "BE_IN"}, - {"TERT_MI2S_TX", NULL, "BE_IN"}, - {"INT0_MI2S_TX", NULL, "BE_IN"}, - {"INT2_MI2S_TX", NULL, "BE_IN"}, - {"INT3_MI2S_TX", NULL, "BE_IN"}, - {"INT4_MI2S_TX", NULL, "BE_IN"}, - {"INT5_MI2S_TX", NULL, "BE_IN"}, - {"SEC_MI2S_TX", NULL, "BE_IN"}, - {"SENARY_MI2S_TX", NULL, "BE_IN" }, - {"SLIMBUS_0_TX", NULL, "BE_IN" }, - {"SLIMBUS_1_TX", NULL, "BE_IN" }, - {"SLIMBUS_3_TX", NULL, "BE_IN" }, - {"SLIMBUS_4_TX", NULL, "BE_IN" }, - {"SLIMBUS_5_TX", NULL, "BE_IN" }, - {"SLIMBUS_6_TX", NULL, "BE_IN" }, - {"SLIMBUS_7_TX", NULL, "BE_IN" }, - {"SLIMBUS_8_TX", NULL, "BE_IN" }, - {"SLIMBUS_9_TX", NULL, "BE_IN" }, - {"USB_AUDIO_TX", NULL, "BE_IN" }, - {"INT_BT_SCO_TX", NULL, "BE_IN"}, - {"INT_FM_TX", NULL, "BE_IN"}, - {"PCM_TX", NULL, "BE_IN"}, - {"BE_OUT", NULL, "SLIMBUS_3_RX"}, - {"BE_OUT", NULL, "STUB_RX"}, - {"STUB_TX", NULL, "BE_IN"}, - {"STUB_1_TX", NULL, "BE_IN"}, - {"BE_OUT", NULL, "AUX_PCM_RX"}, - {"AUX_PCM_TX", NULL, "BE_IN"}, - {"SEC_AUX_PCM_TX", NULL, "BE_IN"}, - {"TERT_AUX_PCM_TX", NULL, "BE_IN"}, - {"QUAT_AUX_PCM_TX", NULL, "BE_IN"}, - {"QUIN_AUX_PCM_TX", NULL, "BE_IN"}, - {"INCALL_RECORD_TX", NULL, "BE_IN"}, - {"INCALL_RECORD_RX", NULL, "BE_IN"}, - {"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, - {"SLIM0_RX_VI_FB_RCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, - {"WSA_RX_0_VI_FB_LCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, - {"WSA_RX_0_VI_FB_RCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - {PLATFORM_RX_VI_FB_MUX_NAME, PLATFORM_RX_VI_FB_TX_MUX_TEXT, PLATFORM_RX_VI_FB_TX_MUX_TEXT}, -#else - {"PRI_MI2S_RX_VI_FB_MUX", "SENARY_TX", "SENARY_TX"}, -#endif - {"INT4_MI2S_RX_VI_FB_MONO_CH_MUX", "INT5_MI2S_TX", "INT5_MI2S_TX"}, - {"INT4_MI2S_RX_VI_FB_STEREO_CH_MUX", "INT5_MI2S_TX", "INT5_MI2S_TX"}, - {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"}, - {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_RCH_MUX"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_LCH_MUX"}, - {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_RCH_MUX"}, -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - {PLATFORM_RX_VI_FB_RX_MUX_TEXT, NULL, PLATFORM_RX_VI_FB_MUX_NAME}, -#else - {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_VI_FB_MUX"}, -#endif - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_VI_FB_MONO_CH_MUX"}, - {"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_VI_FB_STEREO_CH_MUX"}, - {"PRI_TDM_TX_0", NULL, "BE_IN"}, - {"PRI_TDM_TX_1", NULL, "BE_IN"}, - {"PRI_TDM_TX_2", NULL, "BE_IN"}, - {"PRI_TDM_TX_3", NULL, "BE_IN"}, - {"SEC_TDM_TX_0", NULL, "BE_IN"}, - {"SEC_TDM_TX_1", NULL, "BE_IN"}, - {"SEC_TDM_TX_2", NULL, "BE_IN"}, - {"SEC_TDM_TX_3", NULL, "BE_IN"}, - {"TERT_TDM_TX_0", NULL, "BE_IN"}, - {"TERT_TDM_TX_1", NULL, "BE_IN"}, - {"TERT_TDM_TX_2", NULL, "BE_IN"}, - {"TERT_TDM_TX_3", NULL, "BE_IN"}, - {"TERT_TDM_TX_7", NULL, "BE_IN"}, - {"QUAT_TDM_TX_0", NULL, "BE_IN"}, - {"QUAT_TDM_TX_1", NULL, "BE_IN"}, - {"QUAT_TDM_TX_2", NULL, "BE_IN"}, - {"QUAT_TDM_TX_3", NULL, "BE_IN"}, - {"QUIN_TDM_TX_0", NULL, "BE_IN"}, - {"QUIN_TDM_TX_1", NULL, "BE_IN"}, - {"QUIN_TDM_TX_2", NULL, "BE_IN"}, - {"QUIN_TDM_TX_3", NULL, "BE_IN"}, - {"WSA_CDC_DMA_TX_0", NULL, "BE_IN"}, - {"WSA_CDC_DMA_TX_1", NULL, "BE_IN"}, - {"WSA_CDC_DMA_TX_2", NULL, "BE_IN"}, - {"VA_CDC_DMA_TX_0", NULL, "BE_IN"}, - {"VA_CDC_DMA_TX_1", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_0", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_1", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_2", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_3", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_4", NULL, "BE_IN"}, - {"TX_CDC_DMA_TX_5", NULL, "BE_IN"}, - {"PRI_SPDIF_TX", NULL, "BE_IN"}, - {"SEC_SPDIF_TX", NULL, "BE_IN"}, - {"PROXY_TX", NULL, "BE_IN"}, -}; - -static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - unsigned int be_id = rtd->dai_link->id; - - if (be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: unexpected BE id %d\n", __func__, be_id); - return -EINVAL; - } - - mutex_lock(&routing_lock); - msm_bedais[be_id].sample_rate = params_rate(params); - msm_bedais[be_id].channel = params_channels(params); - msm_bedais[be_id].format = params_format(params); - pr_debug("%s: BE Sample Rate (%d) format (%d) BE id %d\n", - __func__, msm_bedais[be_id].sample_rate, - msm_bedais[be_id].format, be_id); - mutex_unlock(&routing_lock); - return 0; -} - -static int msm_pcm_routing_close(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - unsigned int be_id = rtd->dai_link->id; - int i, session_type, path_type, topology; - struct msm_pcm_routing_bdai_data *bedai; - struct msm_pcm_routing_fdai_data *fdai; - - pr_debug("%s: substream->pcm->id:%s\n", - __func__, substream->pcm->id); - - if (be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: unexpected BE id %d\n", __func__, be_id); - return -EINVAL; - } - - bedai = &msm_bedais[be_id]; - session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? - 0 : 1); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - path_type = ADM_PATH_PLAYBACK; - else - path_type = ADM_PATH_LIVE_REC; - - mutex_lock(&routing_lock); - for_each_set_bit(i, &bedai->fe_sessions[0], MSM_FRONTEND_DAI_MAX) { - if (!is_mm_lsm_fe_id(i)) - continue; - fdai = &fe_dai_map[i][session_type]; - if (fdai->strm_id != INVALID_SESSION) { - int idx; - int port_id; - unsigned long copp = - session_copp_map[i][session_type][be_id]; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (test_bit(idx, &copp)) - break; - - if (idx >= MAX_COPPS_PER_PORT) { - pr_debug("%s: copp idx is invalid, exiting\n", - __func__); - continue; - } - fdai->be_srate = bedai->sample_rate; - port_id = bedai->port_id; - topology = adm_get_topology_for_port_copp_idx(port_id, - idx); - msm_routing_unload_topology(topology); - adm_close(bedai->port_id, fdai->perf_mode, idx); - pr_debug("%s: copp:%ld,idx bit fe:%d, type:%d,be:%d topology=0x%x\n", - __func__, copp, i, session_type, be_id, - topology); - clear_bit(idx, - &session_copp_map[i][session_type][be_id]); - if ((fdai->perf_mode == LEGACY_PCM_MODE) && - (fdai->passthr_mode == LEGACY_PCM)) - msm_pcm_routing_deinit_pp(bedai->port_id, - topology); - } - } - - bedai->active = 0; - bedai->sample_rate = 0; - bedai->channel = 0; - mutex_unlock(&routing_lock); - - return 0; -} - -static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - unsigned int be_id = rtd->dai_link->id; - int i, path_type, topology; - int session_type = INVALID_SESSION; - struct msm_pcm_routing_bdai_data *bedai; - u32 channels, sample_rate; - uint16_t bits_per_sample = 16, voc_path_type, be_bit_width; - struct msm_pcm_routing_fdai_data *fdai; - u32 session_id; - struct media_format_info voc_be_media_format; - bool is_lsm; - - pr_debug("%s: substream->pcm->id:%s\n", - __func__, substream->pcm->id); - - if (be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: unexpected BE id %d\n", __func__, be_id); - return -EINVAL; - } - - bedai = &msm_bedais[be_id]; - - mutex_lock(&routing_lock); - if (bedai->active == 1) - goto done; /* Ignore prepare if back-end already active */ - - /* AFE port is not active at this point. However, still - * go ahead setting active flag under the notion that - * QDSP6 is able to handle ADM starting before AFE port - * is started. - */ - bedai->active = 1; - - for_each_set_bit(i, &bedai->fe_sessions[0], MSM_FRONTEND_DAI_MAX) { - if (!(is_mm_lsm_fe_id(i) && - route_check_fe_id_adm_support(i))) - continue; - - session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - fdai = &fe_dai_map[i][session_type]; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (fdai->passthr_mode != LEGACY_PCM) - path_type = ADM_PATH_COMPRESSED_RX; - else - path_type = ADM_PATH_PLAYBACK; - } else { - if ((fdai->passthr_mode != LEGACY_PCM) && - (fdai->passthr_mode != LISTEN)) - path_type = ADM_PATH_COMPRESSED_TX; - else - path_type = ADM_PATH_LIVE_REC; - } - - is_lsm = (i >= MSM_FRONTEND_DAI_LSM1) && - (i <= MSM_FRONTEND_DAI_LSM8); - if (fdai->strm_id != INVALID_SESSION) { - int app_type, app_type_idx, copp_idx, acdb_dev_id; - - if (session_type == SESSION_TYPE_TX && - fdai->be_srate && - (fdai->be_srate != bedai->sample_rate)) { - pr_debug("%s: flush strm %d diff BE rates\n", - __func__, - fdai->strm_id); - - if (fdai->event_info.event_func) - fdai->event_info.event_func( - MSM_PCM_RT_EVT_BUF_RECFG, - fdai->event_info.priv_data); - fdai->be_srate = 0; /* might not need it */ - } - bits_per_sample = msm_routing_get_bit_width( - bedai->format); - - app_type = - fe_dai_app_type_cfg[i][session_type][be_id].app_type; - if (app_type && is_lsm) { - app_type_idx = - msm_pcm_routing_get_lsm_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[i][session_type][be_id] - .sample_rate; - bits_per_sample = - lsm_app_type_cfg[app_type_idx].bit_width; - } else if (app_type) { - app_type_idx = - msm_pcm_routing_get_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[i][session_type] - [be_id].sample_rate; - bits_per_sample = - app_type_cfg[app_type_idx].bit_width; - } else - sample_rate = bedai->sample_rate; - /* - * check if ADM needs to be configured with different - * channel mapping than backend - */ - if (!bedai->adm_override_ch) - channels = bedai->channel; - else - channels = bedai->adm_override_ch; - acdb_dev_id = - fe_dai_app_type_cfg[i][session_type][be_id].acdb_dev_id; - topology = msm_routing_get_adm_topology(i, session_type, - be_id); - - if ((fdai->passthr_mode == COMPRESSED_PASSTHROUGH_DSD) - || (fdai->passthr_mode == COMPRESSED_PASSTHROUGH_GEN) - || (fdai->passthr_mode == COMPRESSED_PASSTHROUGH_IEC61937)) - topology = COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY; - - be_bit_width = msm_routing_get_bit_width( - bedai->format); - - if (hifi_filter_enabled && (bedai->sample_rate == 384000 - || bedai->sample_rate == 352800) && - be_bit_width == 32) - bits_per_sample = msm_routing_get_bit_width( - SNDRV_PCM_FORMAT_S32_LE); - copp_idx = adm_open(bedai->port_id, path_type, - sample_rate, channels, topology, - fdai->perf_mode, bits_per_sample, - app_type, acdb_dev_id); - if ((copp_idx < 0) || - (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: adm open failed\n", __func__); - mutex_unlock(&routing_lock); - return -EINVAL; - } - pr_debug("%s: setting idx bit of fe:%d, type: %d, be:%d\n", - __func__, i, session_type, be_id); - set_bit(copp_idx, - &session_copp_map[i][session_type][be_id]); - - if (msm_is_resample_needed( - sample_rate, - bedai->sample_rate)) - adm_copp_mfc_cfg( - bedai->port_id, copp_idx, - bedai->sample_rate); - - msm_pcm_routing_build_matrix(i, session_type, path_type, - fdai->perf_mode, fdai->passthr_mode); - if ((fdai->perf_mode == LEGACY_PCM_MODE) && - (fdai->passthr_mode == LEGACY_PCM)) - msm_pcm_routing_cfg_pp(bedai->port_id, copp_idx, - topology, channels); - } - } - - for_each_set_bit(i, &bedai->fe_sessions[0], MSM_FRONTEND_DAI_MAX) { - session_id = msm_pcm_routing_get_voc_sessionid(i); - if (session_id) { - pr_debug("%s voice session_id: 0x%x\n", __func__, - session_id); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - voc_path_type = RX_PATH; - else - voc_path_type = TX_PATH; - - voc_set_route_flag(session_id, voc_path_type, 1); - - memset(&voc_be_media_format, 0, - sizeof(struct media_format_info)); - - voc_be_media_format.port_id = bedai->port_id; - voc_be_media_format.num_channels = bedai->channel; - voc_be_media_format.sample_rate = bedai->sample_rate; - voc_be_media_format.bits_per_sample = bedai->format; - /* Defaulting this to 1 for voice call usecases */ - voc_be_media_format.channel_mapping[0] = 1; - - voc_set_device_config(session_id, voc_path_type, - &voc_be_media_format); - - if (voc_get_route_flag(session_id, RX_PATH) && - voc_get_route_flag(session_id, TX_PATH)) - voc_enable_device(session_id); - } - } - - /* Check if backend is an external ec ref port and set as needed */ - if (unlikely(bedai->port_id == voc_get_ext_ec_ref_port_id())) { - - memset(&voc_be_media_format, 0, - sizeof(struct media_format_info)); - - /* Get format info for ec ref port from msm_bedais[] */ - voc_be_media_format.port_id = bedai->port_id; - voc_be_media_format.num_channels = bedai->channel; - voc_be_media_format.bits_per_sample = bedai->format; - voc_be_media_format.sample_rate = bedai->sample_rate; - /* Defaulting this to 1 for voice call usecases */ - voc_be_media_format.channel_mapping[0] = 1; - voc_set_ext_ec_ref_media_fmt_info(&voc_be_media_format); - pr_debug("%s: EC Ref media format info set to port_id=%d, num_channels=%d, bits_per_sample=%d, sample_rate=%d\n", - __func__, voc_be_media_format.port_id, - voc_be_media_format.num_channels, - voc_be_media_format.bits_per_sample, - voc_be_media_format.sample_rate); - } - -done: - mutex_unlock(&routing_lock); - - return 0; -} - -static int msm_routing_send_device_pp_params(int port_id, int copp_idx, - int fe_id) -{ - int index, topo_id, be_idx; - unsigned long pp_config = 0; - bool mute_on; - int latency, session_type; - bool compr_passthr_mode = true; - - pr_debug("%s: port_id %d, copp_idx %d\n", __func__, port_id, copp_idx); - - if (port_id != HDMI_RX && port_id != DISPLAY_PORT_RX) { - pr_err("%s: Device pp params on invalid port %d\n", - __func__, port_id); - return -EINVAL; - } - - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - if (port_id == msm_bedais[be_idx].port_id) - break; - } - - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_debug("%s: Invalid be id %d\n", __func__, be_idx); - return -EINVAL; - } - - for (index = 0; index < MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX; index++) { - if (msm_bedais_pp_params[index].port_id == port_id) - break; - } - if (index >= MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX) { - pr_err("%s: Invalid backend pp params index %d\n", - __func__, index); - return -EINVAL; - } - - topo_id = adm_get_topology_for_port_copp_idx(port_id, copp_idx); - if (topo_id != COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY) { - pr_err("%s: Invalid passthrough topology 0x%x\n", - __func__, topo_id); - return -EINVAL; - } - - session_type = - (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - - if ((fe_dai_map[fe_id][session_type].passthr_mode == LEGACY_PCM) || - (fe_dai_map[fe_id][session_type].passthr_mode == LISTEN)) - compr_passthr_mode = false; - - pp_config = msm_bedais_pp_params[index].pp_params_config; - if (test_bit(ADM_PP_PARAM_MUTE_BIT, &pp_config)) { - pr_debug("%s: ADM_PP_PARAM_MUTE\n", __func__); - clear_bit(ADM_PP_PARAM_MUTE_BIT, &pp_config); - mute_on = msm_bedais_pp_params[index].mute_on; - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_mute(port_id, - copp_idx, - mute_on); - } - if (test_bit(ADM_PP_PARAM_LATENCY_BIT, &pp_config)) { - pr_debug("%s: ADM_PP_PARAM_LATENCY\n", __func__); - clear_bit(ADM_PP_PARAM_LATENCY_BIT, - &pp_config); - latency = msm_bedais_pp_params[index].latency; - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_latency(port_id, - copp_idx, - latency); - } - return 0; -} - -static uint32_t msm_routing_get_topology(size_t data_size, void *data) -{ - uint32_t topology = NULL_COPP_TOPOLOGY; - void *cal_info = NULL; - uint32_t size = 0; - - /* Retrieve cal_info size from cal data*/ - if (data_size < sizeof(struct audio_cal_type_basic) + - sizeof(struct audio_cal_info_adm_top)) { - pr_err("%s: Invalid data size: %zd\n", __func__, data_size); - goto done; - } - size = data_size - sizeof(struct audio_cal_type_basic); - cal_info = kzalloc(size, GFP_KERNEL); - - if (!cal_info) - goto done; - - memcpy(cal_info, - ((uint8_t *)data + sizeof(struct audio_cal_type_basic)), size); - - topology = ((struct audio_cal_info_adm_top *)cal_info)->topology; - kfree(cal_info); - cal_info = NULL; - -done: - pr_debug("%s: Using topology %d\n", __func__, topology); - - return topology; -} - -static void msm_routing_load_topology(size_t data_size, void *data) -{ - uint32_t topology_id; - int ret = -EINVAL; - - topology_id = msm_routing_get_topology(data_size, data); - if (topology_id != NULL_COPP_TOPOLOGY) - ret = q6core_load_unload_topo_modules(topology_id, - CORE_LOAD_TOPOLOGY); - if (ret < 0) - pr_debug("%s %d load topology failed\n", - __func__, topology_id); - -} - -static void msm_routing_unload_topology(uint32_t topology_id) -{ - int ret = -EINVAL; - - if (topology_id != NULL_COPP_TOPOLOGY) - ret = q6core_load_unload_topo_modules(topology_id, - CORE_UNLOAD_TOPOLOGY); - if (ret < 0) - pr_debug("%s %d unload topology failed\n", - __func__, topology_id); - -} - -static int msm_routing_put_device_pp_params_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int pp_id = ucontrol->value.integer.value[0]; - int port_id = 0; - int index, be_idx, i, topo_id, idx; - bool mute; - int latency, session_type; - bool compr_passthr_mode = true; - - pr_debug("%s: pp_id: 0x%x\n", __func__, pp_id); - - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - port_id = msm_bedais[be_idx].port_id; - if (port_id == HDMI_RX || port_id == DISPLAY_PORT_RX) - break; - } - - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_debug("%s: Invalid be id %d\n", __func__, be_idx); - return -EINVAL; - } - - for (index = 0; index < MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX; index++) { - if (msm_bedais_pp_params[index].port_id == port_id) - break; - } - if (index >= MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX) { - pr_err("%s: Invalid pp params backend index %d\n", - __func__, index); - return -EINVAL; - } - - session_type = - (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) ? - SESSION_TYPE_RX : SESSION_TYPE_TX; - - for_each_set_bit(i, &msm_bedais[be_idx].fe_sessions[0], - MSM_FRONTEND_DAI_MM_SIZE) { - if ((fe_dai_map[i][session_type].passthr_mode == LEGACY_PCM) || - (fe_dai_map[i][session_type].passthr_mode == LISTEN)) - compr_passthr_mode = false; - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - unsigned long copp = - session_copp_map[i] - [SESSION_TYPE_RX][be_idx]; - if (!test_bit(idx, &copp)) - continue; - topo_id = adm_get_topology_for_port_copp_idx(port_id, - idx); - if (topo_id != COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY) - continue; - pr_debug("%s: port: 0x%x, copp %ld, be active: %d, passt: %d\n", - __func__, port_id, copp, msm_bedais[be_idx].active, - fe_dai_map[i][session_type].passthr_mode); - switch (pp_id) { - case ADM_PP_PARAM_MUTE_ID: - pr_debug("%s: ADM_PP_PARAM_MUTE\n", __func__); - mute = ucontrol->value.integer.value[1] ? true : false; - msm_bedais_pp_params[index].mute_on = mute; - set_bit(ADM_PP_PARAM_MUTE_BIT, - &msm_bedais_pp_params[index].pp_params_config); - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_mute(port_id, - idx, mute); - break; - case ADM_PP_PARAM_LATENCY_ID: - pr_debug("%s: ADM_PP_PARAM_LATENCY\n", __func__); - msm_bedais_pp_params[index].latency = - ucontrol->value.integer.value[1]; - set_bit(ADM_PP_PARAM_LATENCY_BIT, - &msm_bedais_pp_params[index].pp_params_config); - latency = msm_bedais_pp_params[index].latency = - ucontrol->value.integer.value[1]; - if ((msm_bedais[be_idx].active) && compr_passthr_mode) - adm_send_compressed_device_latency(port_id, - idx, latency); - break; - default: - pr_info("%s, device pp param %d not supported\n", - __func__, pp_id); - break; - } - } - } - return 0; -} - -static int msm_routing_get_device_pp_params_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s:msm_routing_get_device_pp_params_mixer", __func__); - return 0; -} - -static const struct snd_kcontrol_new device_pp_params_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("Device PP Params", SND_SOC_NOPM, 0, 0xFFFFFFFF, - 0, 3, msm_routing_get_device_pp_params_mixer, - msm_routing_put_device_pp_params_mixer), -}; - -static int msm_aptx_dec_license_control_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = - core_get_license_status(ASM_MEDIA_FMT_APTX); - pr_debug("%s: status %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_aptx_dec_license_control_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t status = 0; - - status = core_set_license(ucontrol->value.integer.value[0], - APTX_CLASSIC_DEC_LICENSE_ID); - pr_debug("%s: status %d\n", __func__, status); - return status; -} - -static const struct snd_kcontrol_new aptx_dec_license_controls[] = { - SOC_SINGLE_EXT("APTX Dec License", SND_SOC_NOPM, 0, - 0xFFFF, 0, msm_aptx_dec_license_control_get, - msm_aptx_dec_license_control_put), -}; - -static int msm_routing_put_port_chmap_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint8_t channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - uint32_t be_idx = ucontrol->value.integer.value[0]; - int i; - - if (be_idx >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Invalid Backend index %d\n", __func__, be_idx); - return -EINVAL; - } - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) { - channel_map[i] = (char)(ucontrol->value.integer.value[i + 1]); - if (channel_map[i] > PCM_MAX_CHMAP_ID) { - pr_err("%s: Invalid channel map %d\n", - __func__, channel_map[i]); - return -EINVAL; - } - } - adm_set_port_multi_ch_map(channel_map, msm_bedais[be_idx].port_id); - - return 0; -} - -static const struct snd_kcontrol_new port_multi_channel_map_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("Backend Device Channel Map", SND_SOC_NOPM, 0, - MSM_BACKEND_DAI_MAX, 0, - PCM_FORMAT_MAX_NUM_CHANNEL_V8 + 1, NULL, - msm_routing_put_port_chmap_mixer), -}; - -static int msm_routing_be_dai_name_table_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = sizeof(be_dai_name_table); - return 0; -} - -static int msm_routing_be_dai_name_table_tlv_get(struct snd_kcontrol *kcontrol, - unsigned int __user *bytes, - unsigned int size) -{ - int i; - int ret = 0; - - if (size < sizeof(be_dai_name_table)) { - pr_err("%s: invalid size %d requested, returning\n", - __func__, size); - ret = -EINVAL; - goto done; - } - - /* - * Fill be_dai_name_table from msm_bedais table to reduce code changes - * needed when adding new backends - */ - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - be_dai_name_table[i].be_id = i; - strlcpy(be_dai_name_table[i].be_name, - msm_bedais[i].name, - LPASS_BE_NAME_MAX_LENGTH); - } - - ret = copy_to_user(bytes, &be_dai_name_table, - sizeof(be_dai_name_table)); - if (ret) { - pr_err("%s: failed to copy be_dai_name_table\n", __func__); - ret = -EFAULT; - } - -done: - return ret; -} - -static const struct snd_kcontrol_new - msm_routing_be_dai_name_table_mixer_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, - .info = msm_routing_be_dai_name_table_info, - .name = "Backend DAI Name Table", - .tlv.c = snd_soc_bytes_tlv_callback, - .private_value = (unsigned long) &(struct soc_bytes_ext) { - .max = sizeof(be_dai_name_table), - .get = msm_routing_be_dai_name_table_tlv_get, - } - }, -}; - -static int msm_routing_stereo_channel_reverse_control_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = swap_ch; - pr_debug("%s: Swap channel value: %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_routing_stereo_channel_reverse_control_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int i, idx, be_index, port_id; - int ret = 0; - unsigned long copp; - - pr_debug("%s Swap channel value:%ld\n", __func__, - ucontrol->value.integer.value[0]); - - swap_ch = ucontrol->value.integer.value[0]; - - mutex_lock(&routing_lock); - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - port_id = msm_bedais[be_index].port_id; - if (!msm_bedais[be_index].active) - continue; - - for_each_set_bit(i, &msm_bedais[be_index].fe_sessions[0], - MSM_FRONTEND_DAI_MM_SIZE) { - copp = session_copp_map[i][SESSION_TYPE_RX][be_index]; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - if (!test_bit(idx, &copp)) - continue; - - pr_debug("%s: swap channel control of portid:%d, coppid:%d\n", - __func__, port_id, idx); - ret = adm_swap_speaker_channels( - port_id, idx, - msm_bedais[be_index].sample_rate, - swap_ch); - if (ret) { - pr_err("%s:Swap_channel failed, err=%d\n", - __func__, ret); - goto done; - } - } - } - } -done: - mutex_unlock(&routing_lock); - return ret; -} - -static const struct snd_kcontrol_new stereo_channel_reverse_control[] = { - SOC_SINGLE_EXT("Swap channel", SND_SOC_NOPM, 0, - 1, 0, msm_routing_stereo_channel_reverse_control_get, - msm_routing_stereo_channel_reverse_control_put), -}; - -static int msm_routing_instance_id_support_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - uinfo->count = 1; - return 0; -} - -static int msm_routing_instance_id_support_put( - struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - bool supported = ucontrol->value.integer.value[0] ? true : false; - - q6common_update_instance_id_support(supported); - return 0; -} - -static int msm_routing_instance_id_support_get( - struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - bool supported = false; - - supported = q6common_is_instance_id_supported(); - ucontrol->value.integer.value[0] = supported ? 1 : 0; - - return 0; -} - -static const struct snd_kcontrol_new - msm_routing_feature_support_mixer_controls[] = { - { - .access = SNDRV_CTL_ELEM_ACCESS_READ | - SNDRV_CTL_ELEM_ACCESS_WRITE, - .info = msm_routing_instance_id_support_info, - .name = "Instance ID Support", - .put = msm_routing_instance_id_support_put, - .get = msm_routing_instance_id_support_get, - }, -}; - -static const struct snd_pcm_ops msm_routing_pcm_ops = { - .hw_params = msm_pcm_routing_hw_params, - .close = msm_pcm_routing_close, - .prepare = msm_pcm_routing_prepare, -}; - -#ifdef CONFIG_MSM_CSPL - //extern void msm_crus_pb_add_controls(struct snd_soc_platform *platform); -#endif - -/* Not used but frame seems to require it */ -static int msm_routing_probe(struct snd_soc_platform *platform) -{ - snd_soc_dapm_new_controls(&platform->component.dapm, msm_qdsp6_widgets, - ARRAY_SIZE(msm_qdsp6_widgets)); - snd_soc_dapm_add_routes(&platform->component.dapm, intercon, - ARRAY_SIZE(intercon)); - - snd_soc_dapm_new_widgets(platform->component.dapm.card); - - snd_soc_add_platform_controls(platform, lsm_controls, - ARRAY_SIZE(lsm_controls)); - - snd_soc_add_platform_controls(platform, aanc_slim_0_rx_mux, - ARRAY_SIZE(aanc_slim_0_rx_mux)); - - snd_soc_add_platform_controls(platform, aanc_noise_level, - ARRAY_SIZE(aanc_noise_level)); - - snd_soc_add_platform_controls(platform, msm_voc_session_controls, - ARRAY_SIZE(msm_voc_session_controls)); - - snd_soc_add_platform_controls(platform, app_type_cfg_controls, - ARRAY_SIZE(app_type_cfg_controls)); - - snd_soc_add_platform_controls(platform, lsm_app_type_cfg_controls, - ARRAY_SIZE(lsm_app_type_cfg_controls)); - - snd_soc_add_platform_controls(platform, module_cfg_controls, - ARRAY_SIZE(module_cfg_controls)); - - snd_soc_add_platform_controls(platform, - stereo_to_custom_stereo_controls, - ARRAY_SIZE(stereo_to_custom_stereo_controls)); - - snd_soc_add_platform_controls(platform, ec_ref_param_controls, - ARRAY_SIZE(ec_ref_param_controls)); - - snd_soc_add_platform_controls(platform, channel_mixer_controls, - ARRAY_SIZE(channel_mixer_controls)); - - msm_qti_pp_add_controls(platform); - - msm_dts_srs_tm_add_controls(platform); - - msm_dolby_dap_add_controls(platform); - - snd_soc_add_platform_controls(platform, - use_ds1_or_ds2_controls, - ARRAY_SIZE(use_ds1_or_ds2_controls)); - - snd_soc_add_platform_controls(platform, - hifi_filter_controls, - ARRAY_SIZE(hifi_filter_controls)); - - snd_soc_add_platform_controls(platform, - device_pp_params_mixer_controls, - ARRAY_SIZE(device_pp_params_mixer_controls)); - - snd_soc_add_platform_controls(platform, - msm_routing_be_dai_name_table_mixer_controls, - ARRAY_SIZE(msm_routing_be_dai_name_table_mixer_controls)); - -#ifdef CONFIG_MSM_CSPL - //msm_crus_pb_add_controls(platform); -#endif - - snd_soc_add_platform_controls(platform, msm_source_tracking_controls, - ARRAY_SIZE(msm_source_tracking_controls)); - snd_soc_add_platform_controls(platform, adm_channel_config_controls, - ARRAY_SIZE(adm_channel_config_controls)); - - snd_soc_add_platform_controls(platform, aptx_dec_license_controls, - ARRAY_SIZE(aptx_dec_license_controls)); - snd_soc_add_platform_controls(platform, stereo_channel_reverse_control, - ARRAY_SIZE(stereo_channel_reverse_control)); - snd_soc_add_platform_controls( - platform, msm_routing_feature_support_mixer_controls, - ARRAY_SIZE(msm_routing_feature_support_mixer_controls)); - elliptic_add_platform_controls(platform); - snd_soc_add_platform_controls(platform, - port_multi_channel_map_mixer_controls, - ARRAY_SIZE(port_multi_channel_map_mixer_controls)); - /* for mius start */ -#ifdef CONFIG_US_PROXIMITY - mius_add_platform_controls(platform); -#endif - /* for mius end */ - - return 0; -} - -int msm_routing_pcm_new(struct snd_soc_pcm_runtime *runtime) -{ - return msm_pcm_routing_hwdep_new(runtime, msm_bedais); -} - -void msm_routing_pcm_free(struct snd_pcm *pcm) -{ - msm_pcm_routing_hwdep_free(pcm); -} - -static struct snd_soc_platform_driver msm_soc_routing_platform = { - .ops = &msm_routing_pcm_ops, - .probe = msm_routing_probe, - .pcm_new = msm_routing_pcm_new, - .pcm_free = msm_routing_pcm_free, -}; - -static int msm_routing_pcm_probe(struct platform_device *pdev) -{ - - dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev)); - return snd_soc_register_platform(&pdev->dev, - &msm_soc_routing_platform); -} - -static int msm_routing_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_pcm_routing_dt_match[] = { - {.compatible = "qcom,msm-pcm-routing"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_pcm_routing_dt_match); - -static struct platform_driver msm_routing_pcm_driver = { - .driver = { - .name = "msm-pcm-routing", - .owner = THIS_MODULE, - .of_match_table = msm_pcm_routing_dt_match, - }, - .probe = msm_routing_pcm_probe, - .remove = msm_routing_pcm_remove, -}; - -int msm_routing_check_backend_enabled(int fedai_id) -{ - int i; - - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { - /* bad ID assigned in machine driver */ - pr_err("%s: bad MM ID\n", __func__); - return 0; - } - for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) { - if (test_bit(fedai_id, &msm_bedais[i].fe_sessions[0])) - return msm_bedais[i].active; - } - return 0; -} - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case ADM_TOPOLOGY_CAL_TYPE: - ret = ADM_TOPOLOGY_CAL_TYPE_IDX; - break; - case ADM_LSM_TOPOLOGY_CAL_TYPE: - ret = ADM_LSM_TOPOLOGY_CAL_TYPE_IDX; - break; - default: - pr_err("%s: Invalid cal type %d\n", __func__, cal_type); - } - return ret; -} - -static int msm_routing_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - pr_debug("%s\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - /* Pre-load if it is ADM topology */ - if ((cal_index == ADM_TOPOLOGY_CAL_TYPE_IDX) || - (cal_index == ADM_LSM_TOPOLOGY_CAL_TYPE_IDX)) { - msm_routing_load_topology(data_size, data); - } -done: - return ret; -} - -static void msm_routing_delete_cal_data(void) -{ - pr_debug("%s\n", __func__); - - cal_utils_destroy_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0]); -} - -static int msm_routing_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{ADM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - msm_routing_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ADM_LSM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - msm_routing_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - pr_debug("%s\n", __func__); - - ret = cal_utils_create_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0], - &cal_type_info[0]); - if (ret < 0) { - pr_err("%s: could not create cal type!\n", - __func__); - ret = -EINVAL; - goto err; - } - - return ret; -err: - msm_routing_delete_cal_data(); - return ret; -} - -int __init msm_soc_routing_platform_init(void) -{ - mutex_init(&routing_lock); - if (msm_routing_init_cal_data()) - pr_err("%s: could not init cal data!\n", __func__); - - afe_set_routing_callback( - (routing_cb)msm_pcm_get_dev_acdb_id_by_port_id); - - memset(&be_dai_name_table, 0, sizeof(be_dai_name_table)); - memset(&last_be_id_configured, 0, sizeof(last_be_id_configured)); - - return platform_driver_register(&msm_routing_pcm_driver); -} - -void msm_soc_routing_platform_exit(void) -{ - msm_routing_delete_cal_data(); - memset(&be_dai_name_table, 0, sizeof(be_dai_name_table)); - mutex_destroy(&routing_lock); - platform_driver_unregister(&msm_routing_pcm_driver); -} - -MODULE_DESCRIPTION("MSM routing platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-routing-v2.h b/techpack/audio/asoc/msm-pcm-routing-v2.h deleted file mode 100644 index 7807647e196e..000000000000 --- a/techpack/audio/asoc/msm-pcm-routing-v2.h +++ /dev/null @@ -1,607 +0,0 @@ -/* Copyright (c) 2012-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MSM_PCM_ROUTING_H -#define _MSM_PCM_ROUTING_H -#include - -/* - * These names are used by HAL to specify the BE. If any changes are - * made to the string names or the max name length corresponding - * changes need to be made in the HAL to ensure they still match. - */ -#define LPASS_BE_NAME_MAX_LENGTH 24 -#define LPASS_BE_PRI_I2S_RX "PRIMARY_I2S_RX" -#define LPASS_BE_PRI_I2S_TX "PRIMARY_I2S_TX" -#define LPASS_BE_SLIMBUS_0_RX "SLIMBUS_0_RX" -#define LPASS_BE_SLIMBUS_0_TX "SLIMBUS_0_TX" -#define LPASS_BE_HDMI "HDMI" -#define LPASS_BE_DISPLAY_PORT "DISPLAY_PORT" -#define LPASS_BE_DISPLAY_PORT1 "DISPLAY_PORT1" -#define LPASS_BE_INT_BT_SCO_RX "INT_BT_SCO_RX" -#define LPASS_BE_INT_BT_SCO_TX "INT_BT_SCO_TX" -#define LPASS_BE_INT_BT_A2DP_RX "INT_BT_A2DP_RX" -#define LPASS_BE_INT_FM_RX "INT_FM_RX" -#define LPASS_BE_INT_FM_TX "INT_FM_TX" -#define LPASS_BE_AFE_PCM_RX "RT_PROXY_DAI_001_RX" -#define LPASS_BE_AFE_PCM_TX "RT_PROXY_DAI_002_TX" -#define LPASS_BE_AUXPCM_RX "AUX_PCM_RX" -#define LPASS_BE_AUXPCM_TX "AUX_PCM_TX" -#define LPASS_BE_SEC_AUXPCM_RX "SEC_AUX_PCM_RX" -#define LPASS_BE_SEC_AUXPCM_TX "SEC_AUX_PCM_TX" -#define LPASS_BE_TERT_AUXPCM_RX "TERT_AUX_PCM_RX" -#define LPASS_BE_TERT_AUXPCM_TX "TERT_AUX_PCM_TX" -#define LPASS_BE_QUAT_AUXPCM_RX "QUAT_AUX_PCM_RX" -#define LPASS_BE_QUAT_AUXPCM_TX "QUAT_AUX_PCM_TX" -#define LPASS_BE_QUIN_AUXPCM_RX "QUIN_AUX_PCM_RX" -#define LPASS_BE_QUIN_AUXPCM_TX "QUIN_AUX_PCM_TX" -#define LPASS_BE_SEN_AUXPCM_RX "SEN_AUX_PCM_RX" -#define LPASS_BE_SEN_AUXPCM_TX "SEN_AUX_PCM_TX" -#define LPASS_BE_VOICE_PLAYBACK_TX "VOICE_PLAYBACK_TX" -#define LPASS_BE_VOICE2_PLAYBACK_TX "VOICE2_PLAYBACK_TX" -#define LPASS_BE_INCALL_RECORD_RX "INCALL_RECORD_RX" -#define LPASS_BE_INCALL_RECORD_TX "INCALL_RECORD_TX" -#define LPASS_BE_PROXY_RX "PROXY_RX" -#define LPASS_BE_PROXY_TX "PROXY_TX" -#define LPASS_BE_SEC_I2S_RX "SECONDARY_I2S_RX" -#define LPASS_BE_PRI_SPDIF_RX "PRI_SPDIF_RX" -#define LPASS_BE_PRI_SPDIF_TX "PRI_SPDIF_TX" -#define LPASS_BE_SEC_SPDIF_RX "SEC_SPDIF_RX" -#define LPASS_BE_SEC_SPDIF_TX "SEC_SPDIF_TX" - -#define LPASS_BE_MI2S_RX "MI2S_RX" -#define LPASS_BE_MI2S_TX "MI2S_TX" -#define LPASS_BE_QUAT_MI2S_RX "QUAT_MI2S_RX" -#define LPASS_BE_QUAT_MI2S_TX "QUAT_MI2S_TX" -#define LPASS_BE_SEC_MI2S_RX "SEC_MI2S_RX" -#define LPASS_BE_SEC_MI2S_RX_SD1 "SEC_MI2S_RX_SD1" -#define LPASS_BE_SEC_MI2S_TX "SEC_MI2S_TX" -#define LPASS_BE_PRI_MI2S_RX "PRI_MI2S_RX" -#define LPASS_BE_PRI_MI2S_TX "PRI_MI2S_TX" -#define LPASS_BE_TERT_MI2S_RX "TERT_MI2S_RX" -#define LPASS_BE_TERT_MI2S_TX "TERT_MI2S_TX" -#define LPASS_BE_AUDIO_I2S_RX "AUDIO_I2S_RX" -#define LPASS_BE_STUB_RX "STUB_RX" -#define LPASS_BE_STUB_TX "STUB_TX" -#define LPASS_BE_SLIMBUS_1_RX "SLIMBUS_1_RX" -#define LPASS_BE_SLIMBUS_1_TX "SLIMBUS_1_TX" -#define LPASS_BE_STUB_1_TX "STUB_1_TX" -#define LPASS_BE_SLIMBUS_2_RX "SLIMBUS_2_RX" -#define LPASS_BE_SLIMBUS_2_TX "SLIMBUS_2_TX" -#define LPASS_BE_SLIMBUS_3_RX "SLIMBUS_3_RX" -#define LPASS_BE_SLIMBUS_3_TX "SLIMBUS_3_TX" -#define LPASS_BE_SLIMBUS_4_RX "SLIMBUS_4_RX" -#define LPASS_BE_SLIMBUS_4_TX "SLIMBUS_4_TX" -#define LPASS_BE_SLIMBUS_TX_VI "SLIMBUS_TX_VI" -#define LPASS_BE_SLIMBUS_5_RX "SLIMBUS_5_RX" -#define LPASS_BE_SLIMBUS_5_TX "SLIMBUS_5_TX" -#define LPASS_BE_SLIMBUS_6_RX "SLIMBUS_6_RX" -#define LPASS_BE_SLIMBUS_6_TX "SLIMBUS_6_TX" -#define LPASS_BE_QUIN_MI2S_RX "QUIN_MI2S_RX" -#define LPASS_BE_QUIN_MI2S_TX "QUIN_MI2S_TX" -#define LPASS_BE_SENARY_MI2S_TX "SENARY_MI2S_TX" -#define LPASS_BE_SENARY_MI2S_RX "SENARY_MI2S_RX" - -#define LPASS_BE_PRI_TDM_RX_0 "PRI_TDM_RX_0" -#define LPASS_BE_PRI_TDM_TX_0 "PRI_TDM_TX_0" -#define LPASS_BE_PRI_TDM_RX_1 "PRI_TDM_RX_1" -#define LPASS_BE_PRI_TDM_TX_1 "PRI_TDM_TX_1" -#define LPASS_BE_PRI_TDM_RX_2 "PRI_TDM_RX_2" -#define LPASS_BE_PRI_TDM_TX_2 "PRI_TDM_TX_2" -#define LPASS_BE_PRI_TDM_RX_3 "PRI_TDM_RX_3" -#define LPASS_BE_PRI_TDM_TX_3 "PRI_TDM_TX_3" -#define LPASS_BE_PRI_TDM_RX_4 "PRI_TDM_RX_4" -#define LPASS_BE_PRI_TDM_TX_4 "PRI_TDM_TX_4" -#define LPASS_BE_PRI_TDM_RX_5 "PRI_TDM_RX_5" -#define LPASS_BE_PRI_TDM_TX_5 "PRI_TDM_TX_5" -#define LPASS_BE_PRI_TDM_RX_6 "PRI_TDM_RX_6" -#define LPASS_BE_PRI_TDM_TX_6 "PRI_TDM_TX_6" -#define LPASS_BE_PRI_TDM_RX_7 "PRI_TDM_RX_7" -#define LPASS_BE_PRI_TDM_TX_7 "PRI_TDM_TX_7" -#define LPASS_BE_SEC_TDM_RX_0 "SEC_TDM_RX_0" -#define LPASS_BE_SEC_TDM_TX_0 "SEC_TDM_TX_0" -#define LPASS_BE_SEC_TDM_RX_1 "SEC_TDM_RX_1" -#define LPASS_BE_SEC_TDM_TX_1 "SEC_TDM_TX_1" -#define LPASS_BE_SEC_TDM_RX_2 "SEC_TDM_RX_2" -#define LPASS_BE_SEC_TDM_TX_2 "SEC_TDM_TX_2" -#define LPASS_BE_SEC_TDM_RX_3 "SEC_TDM_RX_3" -#define LPASS_BE_SEC_TDM_TX_3 "SEC_TDM_TX_3" -#define LPASS_BE_SEC_TDM_RX_4 "SEC_TDM_RX_4" -#define LPASS_BE_SEC_TDM_TX_4 "SEC_TDM_TX_4" -#define LPASS_BE_SEC_TDM_RX_5 "SEC_TDM_RX_5" -#define LPASS_BE_SEC_TDM_TX_5 "SEC_TDM_TX_5" -#define LPASS_BE_SEC_TDM_RX_6 "SEC_TDM_RX_6" -#define LPASS_BE_SEC_TDM_TX_6 "SEC_TDM_TX_6" -#define LPASS_BE_SEC_TDM_RX_7 "SEC_TDM_RX_7" -#define LPASS_BE_SEC_TDM_TX_7 "SEC_TDM_TX_7" -#define LPASS_BE_TERT_TDM_RX_0 "TERT_TDM_RX_0" -#define LPASS_BE_TERT_TDM_TX_0 "TERT_TDM_TX_0" -#define LPASS_BE_TERT_TDM_RX_1 "TERT_TDM_RX_1" -#define LPASS_BE_TERT_TDM_TX_1 "TERT_TDM_TX_1" -#define LPASS_BE_TERT_TDM_RX_2 "TERT_TDM_RX_2" -#define LPASS_BE_TERT_TDM_TX_2 "TERT_TDM_TX_2" -#define LPASS_BE_TERT_TDM_RX_3 "TERT_TDM_RX_3" -#define LPASS_BE_TERT_TDM_TX_3 "TERT_TDM_TX_3" -#define LPASS_BE_TERT_TDM_RX_4 "TERT_TDM_RX_4" -#define LPASS_BE_TERT_TDM_TX_4 "TERT_TDM_TX_4" -#define LPASS_BE_TERT_TDM_RX_5 "TERT_TDM_RX_5" -#define LPASS_BE_TERT_TDM_TX_5 "TERT_TDM_TX_5" -#define LPASS_BE_TERT_TDM_RX_6 "TERT_TDM_RX_6" -#define LPASS_BE_TERT_TDM_TX_6 "TERT_TDM_TX_6" -#define LPASS_BE_TERT_TDM_RX_7 "TERT_TDM_RX_7" -#define LPASS_BE_TERT_TDM_TX_7 "TERT_TDM_TX_7" -#define LPASS_BE_QUAT_TDM_RX_0 "QUAT_TDM_RX_0" -#define LPASS_BE_QUAT_TDM_TX_0 "QUAT_TDM_TX_0" -#define LPASS_BE_QUAT_TDM_RX_1 "QUAT_TDM_RX_1" -#define LPASS_BE_QUAT_TDM_TX_1 "QUAT_TDM_TX_1" -#define LPASS_BE_QUAT_TDM_RX_2 "QUAT_TDM_RX_2" -#define LPASS_BE_QUAT_TDM_TX_2 "QUAT_TDM_TX_2" -#define LPASS_BE_QUAT_TDM_RX_3 "QUAT_TDM_RX_3" -#define LPASS_BE_QUAT_TDM_TX_3 "QUAT_TDM_TX_3" -#define LPASS_BE_QUAT_TDM_RX_4 "QUAT_TDM_RX_4" -#define LPASS_BE_QUAT_TDM_TX_4 "QUAT_TDM_TX_4" -#define LPASS_BE_QUAT_TDM_RX_5 "QUAT_TDM_RX_5" -#define LPASS_BE_QUAT_TDM_TX_5 "QUAT_TDM_TX_5" -#define LPASS_BE_QUAT_TDM_RX_6 "QUAT_TDM_RX_6" -#define LPASS_BE_QUAT_TDM_TX_6 "QUAT_TDM_TX_6" -#define LPASS_BE_QUAT_TDM_RX_7 "QUAT_TDM_RX_7" -#define LPASS_BE_QUAT_TDM_TX_7 "QUAT_TDM_TX_7" -#define LPASS_BE_QUIN_TDM_RX_0 "QUIN_TDM_RX_0" -#define LPASS_BE_QUIN_TDM_TX_0 "QUIN_TDM_TX_0" -#define LPASS_BE_QUIN_TDM_RX_1 "QUIN_TDM_RX_1" -#define LPASS_BE_QUIN_TDM_TX_1 "QUIN_TDM_TX_1" -#define LPASS_BE_QUIN_TDM_RX_2 "QUIN_TDM_RX_2" -#define LPASS_BE_QUIN_TDM_TX_2 "QUIN_TDM_TX_2" -#define LPASS_BE_QUIN_TDM_RX_3 "QUIN_TDM_RX_3" -#define LPASS_BE_QUIN_TDM_TX_3 "QUIN_TDM_TX_3" -#define LPASS_BE_QUIN_TDM_RX_4 "QUIN_TDM_RX_4" -#define LPASS_BE_QUIN_TDM_TX_4 "QUIN_TDM_TX_4" -#define LPASS_BE_QUIN_TDM_RX_5 "QUIN_TDM_RX_5" -#define LPASS_BE_QUIN_TDM_TX_5 "QUIN_TDM_TX_5" -#define LPASS_BE_QUIN_TDM_RX_6 "QUIN_TDM_RX_6" -#define LPASS_BE_QUIN_TDM_TX_6 "QUIN_TDM_TX_6" -#define LPASS_BE_QUIN_TDM_RX_7 "QUIN_TDM_RX_7" -#define LPASS_BE_QUIN_TDM_TX_7 "QUIN_TDM_TX_7" - -#define LPASS_BE_SLIMBUS_7_RX "SLIMBUS_7_RX" -#define LPASS_BE_SLIMBUS_7_TX "SLIMBUS_7_TX" -#define LPASS_BE_SLIMBUS_8_RX "SLIMBUS_8_RX" -#define LPASS_BE_SLIMBUS_8_TX "SLIMBUS_8_TX" -#define LPASS_BE_SLIMBUS_9_RX "SLIMBUS_9_RX" -#define LPASS_BE_SLIMBUS_9_TX "SLIMBUS_9_TX" - -#define LPASS_BE_USB_AUDIO_RX "USB_AUDIO_RX" -#define LPASS_BE_USB_AUDIO_TX "USB_AUDIO_TX" - -#define LPASS_BE_INT0_MI2S_RX "INT0_MI2S_RX" -#define LPASS_BE_INT0_MI2S_TX "INT0_MI2S_TX" -#define LPASS_BE_INT1_MI2S_RX "INT1_MI2S_RX" -#define LPASS_BE_INT1_MI2S_TX "INT1_MI2S_TX" -#define LPASS_BE_INT2_MI2S_RX "INT2_MI2S_RX" -#define LPASS_BE_INT2_MI2S_TX "INT2_MI2S_TX" -#define LPASS_BE_INT3_MI2S_RX "INT3_MI2S_RX" -#define LPASS_BE_INT3_MI2S_TX "INT3_MI2S_TX" -#define LPASS_BE_INT4_MI2S_RX "INT4_MI2S_RX" -#define LPASS_BE_INT4_MI2S_TX "INT4_MI2S_TX" -#define LPASS_BE_INT5_MI2S_RX "INT5_MI2S_RX" -#define LPASS_BE_INT5_MI2S_TX "INT5_MI2S_TX" -#define LPASS_BE_INT6_MI2S_RX "INT6_MI2S_RX" -#define LPASS_BE_INT6_MI2S_TX "INT6_MI2S_TX" - -#define LPASS_BE_WSA_CDC_DMA_RX_0 "WSA_CDC_DMA_RX_0" -#define LPASS_BE_WSA_CDC_DMA_TX_0 "WSA_CDC_DMA_TX_0" -#define LPASS_BE_WSA_CDC_DMA_RX_1 "WSA_CDC_DMA_RX_1" -#define LPASS_BE_WSA_CDC_DMA_TX_1 "WSA_CDC_DMA_TX_1" -#define LPASS_BE_WSA_CDC_DMA_TX_2 "WSA_CDC_DMA_TX_2" -#define LPASS_BE_VA_CDC_DMA_TX_0 "VA_CDC_DMA_TX_0" -#define LPASS_BE_VA_CDC_DMA_TX_1 "VA_CDC_DMA_TX_1" - -#define LPASS_BE_RX_CDC_DMA_RX_0 "RX_CDC_DMA_RX_0" -#define LPASS_BE_RX_CDC_DMA_RX_1 "RX_CDC_DMA_RX_1" -#define LPASS_BE_RX_CDC_DMA_RX_2 "RX_CDC_DMA_RX_2" -#define LPASS_BE_RX_CDC_DMA_RX_3 "RX_CDC_DMA_RX_3" -#define LPASS_BE_RX_CDC_DMA_RX_4 "RX_CDC_DMA_RX_4" -#define LPASS_BE_RX_CDC_DMA_RX_5 "RX_CDC_DMA_RX_5" -#define LPASS_BE_RX_CDC_DMA_RX_6 "RX_CDC_DMA_RX_6" -#define LPASS_BE_RX_CDC_DMA_RX_7 "RX_CDC_DMA_RX_7" -#define LPASS_BE_TX_CDC_DMA_TX_0 "TX_CDC_DMA_TX_0" -#define LPASS_BE_TX_CDC_DMA_TX_1 "TX_CDC_DMA_TX_1" -#define LPASS_BE_TX_CDC_DMA_TX_2 "TX_CDC_DMA_TX_2" -#define LPASS_BE_TX_CDC_DMA_TX_3 "TX_CDC_DMA_TX_3" -#define LPASS_BE_TX_CDC_DMA_TX_4 "TX_CDC_DMA_TX_4" -#define LPASS_BE_TX_CDC_DMA_TX_5 "TX_CDC_DMA_TX_5" - -/* For multimedia front-ends, asm session is allocated dynamically. - * Hence, asm session/multimedia front-end mapping has to be maintained. - * Due to this reason, additional multimedia front-end must be placed before - * non-multimedia front-ends. - */ - -enum { - MSM_FRONTEND_DAI_MULTIMEDIA1 = 0, - MSM_FRONTEND_DAI_MULTIMEDIA2, - MSM_FRONTEND_DAI_MULTIMEDIA3, - MSM_FRONTEND_DAI_MULTIMEDIA4, - MSM_FRONTEND_DAI_MULTIMEDIA5, - MSM_FRONTEND_DAI_MULTIMEDIA6, - MSM_FRONTEND_DAI_MULTIMEDIA7, - MSM_FRONTEND_DAI_MULTIMEDIA8, - MSM_FRONTEND_DAI_MULTIMEDIA9, - MSM_FRONTEND_DAI_MULTIMEDIA10, - MSM_FRONTEND_DAI_MULTIMEDIA11, - MSM_FRONTEND_DAI_MULTIMEDIA12, - MSM_FRONTEND_DAI_MULTIMEDIA13, - MSM_FRONTEND_DAI_MULTIMEDIA14, - MSM_FRONTEND_DAI_MULTIMEDIA15, - MSM_FRONTEND_DAI_MULTIMEDIA16, - MSM_FRONTEND_DAI_MULTIMEDIA17, - MSM_FRONTEND_DAI_MULTIMEDIA18, - MSM_FRONTEND_DAI_MULTIMEDIA19, - MSM_FRONTEND_DAI_MULTIMEDIA20, - MSM_FRONTEND_DAI_MULTIMEDIA21, - MSM_FRONTEND_DAI_MULTIMEDIA26, - MSM_FRONTEND_DAI_MULTIMEDIA27, - MSM_FRONTEND_DAI_MULTIMEDIA28, - MSM_FRONTEND_DAI_MULTIMEDIA29, - MSM_FRONTEND_DAI_MULTIMEDIA30, - MSM_FRONTEND_DAI_MULTIMEDIA31, - MSM_FRONTEND_DAI_VOIP, - MSM_FRONTEND_DAI_AFE_RX, - MSM_FRONTEND_DAI_AFE_TX, - MSM_FRONTEND_DAI_VOICE_STUB, - MSM_FRONTEND_DAI_DTMF_RX, - MSM_FRONTEND_DAI_QCHAT, - MSM_FRONTEND_DAI_VOLTE_STUB, - MSM_FRONTEND_DAI_LSM1, - MSM_FRONTEND_DAI_LSM2, - MSM_FRONTEND_DAI_LSM3, - MSM_FRONTEND_DAI_LSM4, - MSM_FRONTEND_DAI_LSM5, - MSM_FRONTEND_DAI_LSM6, - MSM_FRONTEND_DAI_LSM7, - MSM_FRONTEND_DAI_LSM8, - MSM_FRONTEND_DAI_VOICE2_STUB, - MSM_FRONTEND_DAI_VOICEMMODE1, - MSM_FRONTEND_DAI_VOICEMMODE2, - MSM_FRONTEND_DAI_MAX, -}; - -#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_MULTIMEDIA31 + 1) -#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_MULTIMEDIA31 - -enum { - MSM_BACKEND_DAI_PRI_I2S_RX = 0, - MSM_BACKEND_DAI_PRI_I2S_TX, - MSM_BACKEND_DAI_SLIMBUS_0_RX, - MSM_BACKEND_DAI_SLIMBUS_0_TX, - MSM_BACKEND_DAI_HDMI_RX, - MSM_BACKEND_DAI_INT_BT_SCO_RX, - MSM_BACKEND_DAI_INT_BT_SCO_TX, - MSM_BACKEND_DAI_INT_FM_RX, - MSM_BACKEND_DAI_INT_FM_TX, - MSM_BACKEND_DAI_AFE_PCM_RX, - MSM_BACKEND_DAI_AFE_PCM_TX, - MSM_BACKEND_DAI_AUXPCM_RX, - MSM_BACKEND_DAI_AUXPCM_TX, - MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - MSM_BACKEND_DAI_INCALL_RECORD_RX, - MSM_BACKEND_DAI_INCALL_RECORD_TX, - MSM_BACKEND_DAI_MI2S_RX, - MSM_BACKEND_DAI_MI2S_TX, - MSM_BACKEND_DAI_SEC_I2S_RX, - MSM_BACKEND_DAI_SLIMBUS_1_RX, - MSM_BACKEND_DAI_SLIMBUS_1_TX, - MSM_BACKEND_DAI_SLIMBUS_2_RX, - MSM_BACKEND_DAI_SLIMBUS_2_TX, - MSM_BACKEND_DAI_SLIMBUS_3_RX, - MSM_BACKEND_DAI_SLIMBUS_3_TX, - MSM_BACKEND_DAI_SLIMBUS_4_RX, - MSM_BACKEND_DAI_SLIMBUS_4_TX, - MSM_BACKEND_DAI_SLIMBUS_5_RX, - MSM_BACKEND_DAI_SLIMBUS_5_TX, - MSM_BACKEND_DAI_SLIMBUS_6_RX, - MSM_BACKEND_DAI_SLIMBUS_6_TX, - MSM_BACKEND_DAI_SLIMBUS_7_RX, - MSM_BACKEND_DAI_SLIMBUS_7_TX, - MSM_BACKEND_DAI_SLIMBUS_8_RX, - MSM_BACKEND_DAI_SLIMBUS_8_TX, - MSM_BACKEND_DAI_EXTPROC_RX, - MSM_BACKEND_DAI_EXTPROC_TX, - MSM_BACKEND_DAI_EXTPROC_EC_TX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - MSM_BACKEND_DAI_PRI_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, - MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - MSM_BACKEND_DAI_AUDIO_I2S_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_RX, - MSM_BACKEND_DAI_SEC_AUXPCM_TX, - MSM_BACKEND_DAI_PRI_SPDIF_RX, - MSM_BACKEND_DAI_SECONDARY_MI2S_RX_SD1, - MSM_BACKEND_DAI_QUINARY_MI2S_RX, - MSM_BACKEND_DAI_QUINARY_MI2S_TX, - MSM_BACKEND_DAI_SENARY_MI2S_TX, - MSM_BACKEND_DAI_PRI_TDM_RX_0, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_BACKEND_DAI_PRI_TDM_RX_1, - MSM_BACKEND_DAI_PRI_TDM_TX_1, - MSM_BACKEND_DAI_PRI_TDM_RX_2, - MSM_BACKEND_DAI_PRI_TDM_TX_2, - MSM_BACKEND_DAI_PRI_TDM_RX_3, - MSM_BACKEND_DAI_PRI_TDM_TX_3, - MSM_BACKEND_DAI_PRI_TDM_RX_4, - MSM_BACKEND_DAI_PRI_TDM_TX_4, - MSM_BACKEND_DAI_PRI_TDM_RX_5, - MSM_BACKEND_DAI_PRI_TDM_TX_5, - MSM_BACKEND_DAI_PRI_TDM_RX_6, - MSM_BACKEND_DAI_PRI_TDM_TX_6, - MSM_BACKEND_DAI_PRI_TDM_RX_7, - MSM_BACKEND_DAI_PRI_TDM_TX_7, - MSM_BACKEND_DAI_SEC_TDM_RX_0, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_BACKEND_DAI_SEC_TDM_RX_1, - MSM_BACKEND_DAI_SEC_TDM_TX_1, - MSM_BACKEND_DAI_SEC_TDM_RX_2, - MSM_BACKEND_DAI_SEC_TDM_TX_2, - MSM_BACKEND_DAI_SEC_TDM_RX_3, - MSM_BACKEND_DAI_SEC_TDM_TX_3, - MSM_BACKEND_DAI_SEC_TDM_RX_4, - MSM_BACKEND_DAI_SEC_TDM_TX_4, - MSM_BACKEND_DAI_SEC_TDM_RX_5, - MSM_BACKEND_DAI_SEC_TDM_TX_5, - MSM_BACKEND_DAI_SEC_TDM_RX_6, - MSM_BACKEND_DAI_SEC_TDM_TX_6, - MSM_BACKEND_DAI_SEC_TDM_RX_7, - MSM_BACKEND_DAI_SEC_TDM_TX_7, - MSM_BACKEND_DAI_TERT_TDM_RX_0, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_BACKEND_DAI_TERT_TDM_RX_1, - MSM_BACKEND_DAI_TERT_TDM_TX_1, - MSM_BACKEND_DAI_TERT_TDM_RX_2, - MSM_BACKEND_DAI_TERT_TDM_TX_2, - MSM_BACKEND_DAI_TERT_TDM_RX_3, - MSM_BACKEND_DAI_TERT_TDM_TX_3, - MSM_BACKEND_DAI_TERT_TDM_RX_4, - MSM_BACKEND_DAI_TERT_TDM_TX_4, - MSM_BACKEND_DAI_TERT_TDM_RX_5, - MSM_BACKEND_DAI_TERT_TDM_TX_5, - MSM_BACKEND_DAI_TERT_TDM_RX_6, - MSM_BACKEND_DAI_TERT_TDM_TX_6, - MSM_BACKEND_DAI_TERT_TDM_RX_7, - MSM_BACKEND_DAI_TERT_TDM_TX_7, - MSM_BACKEND_DAI_QUAT_TDM_RX_0, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_BACKEND_DAI_QUAT_TDM_RX_1, - MSM_BACKEND_DAI_QUAT_TDM_TX_1, - MSM_BACKEND_DAI_QUAT_TDM_RX_2, - MSM_BACKEND_DAI_QUAT_TDM_TX_2, - MSM_BACKEND_DAI_QUAT_TDM_RX_3, - MSM_BACKEND_DAI_QUAT_TDM_TX_3, - MSM_BACKEND_DAI_QUAT_TDM_RX_4, - MSM_BACKEND_DAI_QUAT_TDM_TX_4, - MSM_BACKEND_DAI_QUAT_TDM_RX_5, - MSM_BACKEND_DAI_QUAT_TDM_TX_5, - MSM_BACKEND_DAI_QUAT_TDM_RX_6, - MSM_BACKEND_DAI_QUAT_TDM_TX_6, - MSM_BACKEND_DAI_QUAT_TDM_RX_7, - MSM_BACKEND_DAI_QUAT_TDM_TX_7, - MSM_BACKEND_DAI_QUIN_TDM_RX_0, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_BACKEND_DAI_QUIN_TDM_RX_2, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_BACKEND_DAI_QUIN_TDM_RX_3, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_BACKEND_DAI_QUIN_TDM_RX_4, - MSM_BACKEND_DAI_QUIN_TDM_TX_4, - MSM_BACKEND_DAI_QUIN_TDM_RX_5, - MSM_BACKEND_DAI_QUIN_TDM_TX_5, - MSM_BACKEND_DAI_QUIN_TDM_RX_6, - MSM_BACKEND_DAI_QUIN_TDM_TX_6, - MSM_BACKEND_DAI_QUIN_TDM_RX_7, - MSM_BACKEND_DAI_QUIN_TDM_TX_7, - MSM_BACKEND_DAI_INT_BT_A2DP_RX, - MSM_BACKEND_DAI_USB_RX, - MSM_BACKEND_DAI_USB_TX, - MSM_BACKEND_DAI_DISPLAY_PORT_RX, - MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - MSM_BACKEND_DAI_TERT_AUXPCM_RX, - MSM_BACKEND_DAI_TERT_AUXPCM_TX, - MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - MSM_BACKEND_DAI_INT0_MI2S_RX, - MSM_BACKEND_DAI_INT0_MI2S_TX, - MSM_BACKEND_DAI_INT1_MI2S_RX, - MSM_BACKEND_DAI_INT1_MI2S_TX, - MSM_BACKEND_DAI_INT2_MI2S_RX, - MSM_BACKEND_DAI_INT2_MI2S_TX, - MSM_BACKEND_DAI_INT3_MI2S_RX, - MSM_BACKEND_DAI_INT3_MI2S_TX, - MSM_BACKEND_DAI_INT4_MI2S_RX, - MSM_BACKEND_DAI_INT4_MI2S_TX, - MSM_BACKEND_DAI_INT5_MI2S_RX, - MSM_BACKEND_DAI_INT5_MI2S_TX, - MSM_BACKEND_DAI_INT6_MI2S_RX, - MSM_BACKEND_DAI_INT6_MI2S_TX, - MSM_BACKEND_DAI_SEN_AUXPCM_RX, - MSM_BACKEND_DAI_SEN_AUXPCM_TX, - MSM_BACKEND_DAI_SENARY_MI2S_RX, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_1, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_2, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_4, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_5, - MSM_BACKEND_DAI_TX_CDC_DMA_TX_5, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_6, - MSM_BACKEND_DAI_RX_CDC_DMA_RX_7, - MSM_BACKEND_DAI_PRI_SPDIF_TX, - MSM_BACKEND_DAI_SEC_SPDIF_RX, - MSM_BACKEND_DAI_SEC_SPDIF_TX, - MSM_BACKEND_DAI_SLIMBUS_9_RX, - MSM_BACKEND_DAI_SLIMBUS_9_TX, - MSM_BACKEND_DAI_PROXY_RX, - MSM_BACKEND_DAI_PROXY_TX, - MSM_BACKEND_DAI_MAX, -}; - -enum msm_pcm_routing_event { - MSM_PCM_RT_EVT_BUF_RECFG, - MSM_PCM_RT_EVT_DEVSWITCH, - MSM_PCM_RT_EVT_MAX, -}; - -enum { - EXT_EC_REF_NONE = 0, - EXT_EC_REF_PRI_MI2S_TX, - EXT_EC_REF_SEC_MI2S_TX, - EXT_EC_REF_TERT_MI2S_TX, - EXT_EC_REF_QUAT_MI2S_TX, - EXT_EC_REF_QUIN_MI2S_TX, - EXT_EC_REF_SLIM_1_TX, - EXT_EC_REF_SEC_TDM_TX, -}; - -#define INVALID_SESSION -1 -#define SESSION_TYPE_RX 0 -#define SESSION_TYPE_TX 1 -#define MAX_SESSION_TYPES 2 -#define INT_RX_VOL_MAX_STEPS 0x2000 -#define INT_RX_VOL_GAIN 0x2000 - -#define RELEASE_LOCK 0 -#define ACQUIRE_LOCK 1 - -#define MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX 2 -#define HDMI_RX_ID 0x8001 -#define ADM_PP_PARAM_MUTE_ID 0 -#define ADM_PP_PARAM_MUTE_BIT 1 -#define ADM_PP_PARAM_LATENCY_ID 1 -#define ADM_PP_PARAM_LATENCY_BIT 2 -#define BE_DAI_PORT_SESSIONS_IDX_MAX 4 -#define BE_DAI_FE_SESSIONS_IDX_MAX 2 - -#define STREAM_TYPE_ASM 0 -#define STREAM_TYPE_LSM 1 - -enum { - ADM_TOPOLOGY_CAL_TYPE_IDX = 0, - ADM_LSM_TOPOLOGY_CAL_TYPE_IDX, - MAX_ROUTING_CAL_TYPES -}; - -struct msm_pcm_routing_evt { - void (*event_func)(enum msm_pcm_routing_event, void *); - void *priv_data; -}; - -struct msm_pcm_routing_bdai_data { - u16 port_id; /* AFE port ID */ - u8 active; /* track if this backend is enabled */ - - /* Front-end sessions */ - unsigned long fe_sessions[BE_DAI_FE_SESSIONS_IDX_MAX]; - /* - * Track Tx BE ports -> Rx BE ports. - * port_sessions[0] used to track BE 0 to BE 63. - * port_sessions[1] used to track BE 64 to BE 127. - * port_sessions[2] used to track BE 128 to BE 191. - * port_sessions[3] used to track BE 192 to BE 255. - */ - u64 port_sessions[BE_DAI_PORT_SESSIONS_IDX_MAX]; - - unsigned int sample_rate; - unsigned int channel; - unsigned int format; - unsigned int adm_override_ch; - char *name; -}; - -struct msm_pcm_routing_fdai_data { - u16 be_srate; /* track prior backend sample rate for flushing purpose */ - int strm_id; /* ASM stream ID */ - int perf_mode; - struct msm_pcm_routing_evt event_info; - u32 passthr_mode; -}; - -#define MAX_APP_TYPES 16 -struct msm_pcm_routing_app_type_data { - int app_type; - u32 sample_rate; - int bit_width; - u32 num_out_channels; -}; - -struct msm_pcm_stream_app_type_cfg { - int app_type; - int acdb_dev_id; - int sample_rate; -}; - -/* dai_id: front-end ID, - * dspst_id: DSP audio stream ID - * stream_type: playback or capture - */ -int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, int dspst_id, - int stream_type); -void msm_pcm_routing_reg_psthr_stream(int fedai_id, int dspst_id, - int stream_type); -int msm_pcm_routing_reg_phy_compr_stream(int fedai_id, int perf_mode, - int dspst_id, int stream_type, - uint32_t compr_passthr); - -int msm_pcm_routing_reg_phy_stream_v2(int fedai_id, int perf_mode, - int dspst_id, int stream_type, - struct msm_pcm_routing_evt event_info); - -void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type); - -int msm_routing_check_backend_enabled(int fedai_id); - - -void msm_pcm_routing_get_bedai_info(int be_idx, - struct msm_pcm_routing_bdai_data *bedai); -void msm_pcm_routing_get_fedai_info(int fe_idx, int sess_type, - struct msm_pcm_routing_fdai_data *fe_dai); -void msm_pcm_routing_acquire_lock(void); -void msm_pcm_routing_release_lock(void); - -int msm_pcm_routing_reg_stream_app_type_cfg( - int fedai_id, int session_type, int be_id, - struct msm_pcm_stream_app_type_cfg *cfg_data); -int msm_pcm_routing_get_stream_app_type_cfg( - int fedai_id, int session_type, int *be_id, - struct msm_pcm_stream_app_type_cfg *cfg_data); -int msm_pcm_routing_send_chmix_cfg(int fe_id, int ip_channel_cnt, - int op_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type); -int msm_pcm_routing_get_pp_ch_cnt(int fe_id, int session_type); -#endif /*_MSM_PCM_H*/ diff --git a/techpack/audio/asoc/msm-pcm-voice-v2.c b/techpack/audio/asoc/msm-pcm-voice-v2.c deleted file mode 100644 index c968adde1f48..000000000000 --- a/techpack/audio/asoc/msm-pcm-voice-v2.c +++ /dev/null @@ -1,842 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-voice-v2.h" - -#define NUM_CHANNELS_MONO 1 -#define NUM_CHANNELS_STEREO 2 - -static struct msm_voice voice_info[VOICE_SESSION_INDEX_MAX]; - -static struct snd_pcm_hardware msm_pcm_hardware = { - - .info = (SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | - SNDRV_PCM_INFO_RESUME), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000, - .rate_min = 8000, - .rate_max = 16000, - .channels_min = 1, - .channels_max = 1, - - .buffer_bytes_max = 4096 * 2, - .period_bytes_min = 2048, - .period_bytes_max = 4096, - .periods_min = 2, - .periods_max = 4, - - .fifo_size = 0, -}; -static bool is_volte(struct msm_voice *pvolte) -{ - if (pvolte == &voice_info[VOLTE_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_voice2(struct msm_voice *pvoice2) -{ - if (pvoice2 == &voice_info[VOICE2_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_qchat(struct msm_voice *pqchat) -{ - if (pqchat == &voice_info[QCHAT_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_vowlan(struct msm_voice *pvowlan) -{ - if (pvowlan == &voice_info[VOWLAN_SESSION_INDEX]) - return true; - else - return false; -} - -static bool is_voicemmode1(struct msm_voice *pvoicemmode1) -{ - if (pvoicemmode1 == &voice_info[VOICEMMODE1_INDEX]) - return true; - else - return false; -} - -static bool is_voicemmode2(struct msm_voice *pvoicemmode2) -{ - if (pvoicemmode2 == &voice_info[VOICEMMODE2_INDEX]) - return true; - else - return false; -} - -static uint32_t get_session_id(struct msm_voice *pvoc) -{ - uint32_t session_id = 0; - - if (is_volte(pvoc)) - session_id = voc_get_session_id(VOLTE_SESSION_NAME); - else if (is_voice2(pvoc)) - session_id = voc_get_session_id(VOICE2_SESSION_NAME); - else if (is_qchat(pvoc)) - session_id = voc_get_session_id(QCHAT_SESSION_NAME); - else if (is_vowlan(pvoc)) - session_id = voc_get_session_id(VOWLAN_SESSION_NAME); - else if (is_voicemmode1(pvoc)) - session_id = voc_get_session_id(VOICEMMODE1_NAME); - else if (is_voicemmode2(pvoc)) - session_id = voc_get_session_id(VOICEMMODE2_NAME); - else - session_id = voc_get_session_id(VOICE_SESSION_NAME); - - return session_id; -} - - -static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (!prtd->playback_start) - prtd->playback_start = 1; - - return 0; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (!prtd->capture_start) - prtd->capture_start = 1; - - return 0; -} -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *voice; - - if (!strncmp("VoLTE", substream->pcm->id, 5)) { - voice = &voice_info[VOLTE_SESSION_INDEX]; - pr_debug("%s: Open VoLTE Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("Voice2", substream->pcm->id, 6)) { - voice = &voice_info[VOICE2_SESSION_INDEX]; - pr_debug("%s: Open Voice2 Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("QCHAT", substream->pcm->id, 5)) { - voice = &voice_info[QCHAT_SESSION_INDEX]; - pr_debug("%s: Open QCHAT Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("VoWLAN", substream->pcm->id, 6)) { - voice = &voice_info[VOWLAN_SESSION_INDEX]; - pr_debug("%s: Open VoWLAN Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("VoiceMMode1", substream->pcm->id, 11)) { - voice = &voice_info[VOICEMMODE1_INDEX]; - pr_debug("%s: Open VoiceMMode1 Substream Id=%s\n", - __func__, substream->pcm->id); - } else if (!strncmp("VoiceMMode2", substream->pcm->id, 11)) { - voice = &voice_info[VOICEMMODE2_INDEX]; - pr_debug("%s: Open VoiceMMode2 Substream Id=%s\n", - __func__, substream->pcm->id); - } else { - voice = &voice_info[VOICE_SESSION_INDEX]; - pr_debug("%s: Open VOICE Substream Id=%s\n", - __func__, substream->pcm->id); - } - mutex_lock(&voice->lock); - - runtime->hw = msm_pcm_hardware; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - voice->playback_substream = substream; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - voice->capture_substream = substream; - - voice->instance++; - pr_debug("%s: Instance = %d, Stream ID = %s\n", - __func__, voice->instance, substream->pcm->id); - runtime->private_data = voice; - - mutex_unlock(&voice->lock); - - return 0; -} -static int msm_pcm_playback_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (prtd->playback_start) - prtd->playback_start = 0; - - prtd->playback_substream = NULL; - - return 0; -} -static int msm_pcm_capture_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - - if (prtd->capture_start) - prtd->capture_start = 0; - prtd->capture_substream = NULL; - - return 0; -} -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = 0; - int ret = 0; - - mutex_lock(&prtd->lock); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_close(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_close(substream); - - prtd->instance--; - if (!prtd->playback_start && !prtd->capture_start) { - pr_debug("end voice call\n"); - - session_id = get_session_id(prtd); - if (session_id) - voc_end_voice_call(session_id); - } - mutex_unlock(&prtd->lock); - - return ret; -} -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = 0; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - - if (prtd->playback_start && prtd->capture_start) { - session_id = get_session_id(prtd); - if (session_id) - voc_start_voice_call(session_id); - } - mutex_unlock(&prtd->lock); - - return ret; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - - pr_debug("%s: Voice\n", __func__); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - return 0; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = 0; - - pr_debug("%s: cmd = %d\n", __func__, cmd); - - session_id = get_session_id(prtd); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("Start & Stop Voice call not handled in Trigger.\n"); - break; - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: resume call session_id = %d\n", __func__, - session_id); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - if (prtd->playback_start && prtd->capture_start) { - if (session_id) - voc_resume_voice_call(session_id); - } - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("%s: pause call session_id=%d\n", - __func__, session_id); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (prtd->playback_start) - prtd->playback_start = 0; - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (prtd->capture_start) - prtd->capture_start = 0; - } - if (session_id) - voc_standby_voice_call(session_id); - break; - default: - ret = -EINVAL; - break; - } - return ret; -} - -static int msm_pcm_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_voice *prtd = runtime->private_data; - uint32_t session_id = get_session_id(prtd); - enum voice_lch_mode lch_mode; - int ret = 0; - - switch (cmd) { - case SNDRV_VOICE_IOCTL_LCH: - if (copy_from_user(&lch_mode, (void *)arg, - sizeof(enum voice_lch_mode))) { - pr_err("%s: Copy from user failed, size %zd\n", - __func__, sizeof(enum voice_lch_mode)); - - ret = -EFAULT; - break; - } - - pr_debug("%s: %s lch_mode:%d\n", - __func__, substream->pcm->id, lch_mode); - - switch (lch_mode) { - case VOICE_LCH_START: - case VOICE_LCH_STOP: - ret = voc_set_lch(session_id, lch_mode); - break; - - default: - pr_err("%s: Invalid LCH MODE %d\n", __func__, lch_mode); - - ret = -EFAULT; - } - - break; - default: - pr_debug("%s: Falling into default snd_lib_ioctl cmd 0x%x\n", - __func__, cmd); - - ret = snd_pcm_lib_ioctl(substream, cmd, arg); - break; - } - - if (!ret) - pr_debug("%s: ret %d\n", __func__, ret); - else - pr_err("%s: cmd 0x%x failed %d\n", __func__, cmd, ret); - - return ret; -} - -static int msm_voice_sidetone_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret; - long value = ucontrol->value.integer.value[0]; - bool sidetone_enable = value; - uint32_t session_id = ALL_SESSION_VSID; - - if (value < 0) { - pr_err("%s: Invalid arguments sidetone enable %ld\n", - __func__, value); - ret = -EINVAL; - return ret; - } - ret = voc_set_afe_sidetone(session_id, sidetone_enable); - pr_debug("%s: AFE Sidetone enable=%d session_id=0x%x ret=%d\n", - __func__, sidetone_enable, session_id, ret); - return ret; -} - -static int msm_voice_sidetone_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = voc_get_afe_sidetone(); - return 0; -} - -static int msm_voice_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int volume = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((volume < 0) || (ramp_duration < 0) - || (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: volume: %d session_id: %#x ramp_duration: %d\n", __func__, - volume, session_id, ramp_duration); - - voc_set_rx_vol_step(session_id, RX_PATH, volume, ramp_duration); - -done: - return ret; -} - -static int msm_voice_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0) - || (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d session_id=%#x ramp_duration=%d\n", __func__, - mute, session_id, ramp_duration); - - ret = voc_set_tx_mute(session_id, TX_PATH, mute, ramp_duration); - -done: - return ret; -} - -static int msm_voice_tx_device_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0) || - (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d session_id=%#x ramp_duration=%d\n", __func__, - mute, session_id, ramp_duration); - - ret = voc_set_device_mute(session_id, VSS_IVOLUME_DIRECTION_TX, - mute, ramp_duration); - -done: - return ret; -} - -static int msm_voice_rx_device_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - int ramp_duration = ucontrol->value.integer.value[2]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0) || - (ramp_duration > MAX_RAMP_DURATION)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d session_id=%#x ramp_duration=%d\n", __func__, - mute, session_id, ramp_duration); - - voc_set_device_mute(session_id, VSS_IVOLUME_DIRECTION_RX, - mute, ramp_duration); - -done: - return ret; -} - -static int msm_voice_mbd_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = voc_get_mbd_enable(); - return 0; -} - -static int msm_voice_mbd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - bool enable = ucontrol->value.integer.value[0]; - - voc_set_mbd_enable(enable); - - return 0; -} - - -static const char * const tty_mode[] = {"OFF", "HCO", "VCO", "FULL"}; -static const struct soc_enum msm_tty_mode_enum[] = { - SOC_ENUM_SINGLE_EXT(4, tty_mode), -}; - -static int msm_voice_tty_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = - voc_get_tty_mode(voc_get_session_id(VOICE_SESSION_NAME)); - return 0; -} - -static int msm_voice_tty_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int tty_mode = ucontrol->value.integer.value[0]; - - pr_debug("%s: tty_mode=%d\n", __func__, tty_mode); - - voc_set_tty_mode(voc_get_session_id(VOICE_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOICE2_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOLTE_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOWLAN_SESSION_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOICEMMODE1_NAME), tty_mode); - voc_set_tty_mode(voc_get_session_id(VOICEMMODE2_NAME), tty_mode); - - return 0; -} - -static int msm_voice_slowtalk_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int st_enable = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - struct module_instance_info mod_inst_info; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - pr_debug("%s: st enable=%d session_id=%#x\n", __func__, st_enable, - session_id); - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - voc_set_pp_enable(session_id, mod_inst_info, st_enable); - - return 0; -} - -static int msm_voice_hd_voice_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - uint32_t hd_enable = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - - pr_debug("%s: HD Voice enable=%d session_id=%#x\n", __func__, hd_enable, - session_id); - - ret = voc_set_hd_enable(session_id, hd_enable); - - return ret; -} - -static int msm_voice_topology_disable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int disable = ucontrol->value.integer.value[0]; - uint32_t session_id = ucontrol->value.integer.value[1]; - - if ((disable < 0) || (disable > 1)) { - pr_err(" %s Invalid arguments: %d\n", __func__, disable); - - ret = -EINVAL; - goto done; - } - pr_debug("%s: disable = %d, session_id = %d\n", __func__, disable, - session_id); - - ret = voc_disable_topology(session_id, disable); - -done: - return ret; -} - -static int msm_voice_rec_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int voc_rec_config_channels = ucontrol->value.integer.value[0]; - - if (voc_rec_config_channels < NUM_CHANNELS_MONO || - voc_rec_config_channels > NUM_CHANNELS_STEREO) { - pr_err("%s: Invalid channel config (%d)\n", __func__, - voc_rec_config_channels); - ret = -EINVAL; - goto done; - } - voc_set_incall_capture_channel_config(voc_rec_config_channels); - -done: - pr_debug("%s: voc_rec_config_channels = %d, ret = %d\n", __func__, - voc_rec_config_channels, ret); - return ret; -} - -static int msm_voice_rec_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - ucontrol->value.integer.value[0] = - voc_get_incall_capture_channel_config(); - pr_debug("%s: rec_config_channels = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_voice_cvd_version_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - int ret = 0; - - pr_debug("%s:\n", __func__); - - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = CVD_VERSION_STRING_MAX_SIZE; - - return ret; -} - -static int msm_voice_cvd_version_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char cvd_version[CVD_VERSION_STRING_MAX_SIZE] = CVD_VERSION_DEFAULT; - int ret; - - pr_debug("%s:\n", __func__); - - ret = voc_get_cvd_version(cvd_version); - - if (ret) - pr_err("%s: Error retrieving CVD version, error:%d\n", - __func__, ret); - - memcpy(ucontrol->value.bytes.data, cvd_version, sizeof(cvd_version)); - - return 0; -} -static struct snd_kcontrol_new msm_voice_controls[] = { - SOC_SINGLE_MULTI_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, - 0, 3, NULL, msm_voice_rx_device_mute_put), - SOC_SINGLE_MULTI_EXT("Voice Tx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, - 0, 3, NULL, msm_voice_tx_device_mute_put), - SOC_SINGLE_MULTI_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, VSID_MAX, - 0, 3, NULL, msm_voice_mute_put), - SOC_SINGLE_MULTI_EXT("Voice Rx Gain", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, - NULL, msm_voice_gain_put), - SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, - msm_voice_tty_mode_put), - SOC_SINGLE_MULTI_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, - NULL, msm_voice_slowtalk_put), - SOC_SINGLE_MULTI_EXT("Voice Topology Disable", SND_SOC_NOPM, 0, - VSID_MAX, 0, 2, NULL, - msm_voice_topology_disable_put), - SOC_SINGLE_MULTI_EXT("HD Voice Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, - NULL, msm_voice_hd_voice_put), - { - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "CVD Version", - .info = msm_voice_cvd_version_info, - .get = msm_voice_cvd_version_get, - }, - SOC_SINGLE_MULTI_EXT("Voice Sidetone Enable", SND_SOC_NOPM, 0, 1, 0, 1, - msm_voice_sidetone_get, msm_voice_sidetone_put), - SOC_SINGLE_BOOL_EXT("Voice Mic Break Enable", 0, msm_voice_mbd_get, - msm_voice_mbd_put), -}; - -static struct snd_kcontrol_new msm_voice_rec_config_controls[] = { - SOC_SINGLE_MULTI_EXT("Voc Rec Config", SND_SOC_NOPM, 0, - 2, 0, 1, msm_voice_rec_config_get, - msm_voice_rec_config_put), -}; - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .ioctl = msm_pcm_ioctl, - .compat_ioctl = msm_pcm_ioctl, -}; - - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static int msm_pcm_voice_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_voice_controls, - ARRAY_SIZE(msm_voice_controls)); - snd_soc_add_platform_controls(platform, msm_voice_rec_config_controls, - ARRAY_SIZE(msm_voice_rec_config_controls)); - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_voice_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - bool destroy_cvd = false; - const char *is_destroy_cvd = "qcom,destroy-cvd"; - - if (!is_voc_initialized()) { - pr_debug("%s: voice module not initialized yet, deferring probe()\n", - __func__); - - rc = -EPROBE_DEFER; - goto done; - } - - rc = voc_alloc_cal_shared_memory(); - if (rc == -EPROBE_DEFER) { - pr_debug("%s: memory allocation for calibration deferred %d\n", - __func__, rc); - - goto done; - } else if (rc < 0) { - pr_err("%s: memory allocation for calibration failed %d\n", - __func__, rc); - } - - pr_debug("%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - destroy_cvd = of_property_read_bool(pdev->dev.of_node, - is_destroy_cvd); - voc_set_destroy_cvd_flag(destroy_cvd); - - rc = snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); - -done: - return rc; -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_voice_dt_match[] = { - {.compatible = "qcom,msm-pcm-voice"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_voice_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-pcm-voice", - .owner = THIS_MODULE, - .of_match_table = msm_voice_dt_match, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_voice_init(void) -{ - int i = 0; - - memset(&voice_info, 0, sizeof(voice_info)); - - for (i = 0; i < VOICE_SESSION_INDEX_MAX; i++) - mutex_init(&voice_info[i].lock); - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_voice_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("Voice PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-pcm-voice-v2.h b/techpack/audio/asoc/msm-pcm-voice-v2.h deleted file mode 100644 index 60f5adcf5757..000000000000 --- a/techpack/audio/asoc/msm-pcm-voice-v2.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2012-2015, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MSM_PCM_VOICE_H -#define _MSM_PCM_VOICE_H -#include - -enum { - VOICE_SESSION_INDEX, - VOLTE_SESSION_INDEX, - VOICE2_SESSION_INDEX, - QCHAT_SESSION_INDEX, - VOWLAN_SESSION_INDEX, - VOICEMMODE1_INDEX, - VOICEMMODE2_INDEX, - VOICE_SESSION_INDEX_MAX, -}; - -struct msm_voice { - struct snd_pcm_substream *playback_substream; - struct snd_pcm_substream *capture_substream; - - int instance; - - struct mutex lock; - - uint32_t samp_rate; - uint32_t channel_mode; - - int playback_start; - int capture_start; -}; - -#endif /*_MSM_PCM_VOICE_H*/ diff --git a/techpack/audio/asoc/msm-pcm-voip-v2.c b/techpack/audio/asoc/msm-pcm-voip-v2.c deleted file mode 100644 index b8d7390bbb8a..000000000000 --- a/techpack/audio/asoc/msm-pcm-voip-v2.c +++ /dev/null @@ -1,1708 +0,0 @@ -/* Copyright (c) 2012-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" -#include "msm-pcm-routing-v2.h" - -#define SHARED_MEM_BUF 2 -#define VOIP_MAX_Q_LEN 10 -#define VOIP_MAX_VOC_PKT_SIZE 4096 -#define VOIP_MIN_VOC_PKT_SIZE 320 - -/* Length of the DSP frame info header added to the voc packet. */ -#define DSP_FRAME_HDR_LEN 1 - -#define MODE_IS127 0x2 -#define MODE_4GV_NB 0x3 -#define MODE_4GV_WB 0x4 -#define MODE_AMR 0x5 -#define MODE_AMR_WB 0xD -#define MODE_PCM 0xC -#define MODE_4GV_NW 0xE -#define MODE_G711 0xA -#define MODE_G711A 0xF - -enum msm_audio_g711a_frame_type { - MVS_G711A_SPEECH_GOOD, - MVS_G711A_SID, - MVS_G711A_NO_DATA, - MVS_G711A_ERASURE -}; - -enum msm_audio_g711a_mode { - MVS_G711A_MODE_MULAW, - MVS_G711A_MODE_ALAW -}; - -enum msm_audio_g711_mode { - MVS_G711_MODE_MULAW, - MVS_G711_MODE_ALAW -}; - -#define VOIP_MODE_MAX MODE_G711A -#define VOIP_RATE_MAX 23850 - -enum format { - FORMAT_S16_LE = 2, - FORMAT_SPECIAL = 31, -}; - - -enum amr_rate_type { - AMR_RATE_4750, /* AMR 4.75 kbps */ - AMR_RATE_5150, /* AMR 5.15 kbps */ - AMR_RATE_5900, /* AMR 5.90 kbps */ - AMR_RATE_6700, /* AMR 6.70 kbps */ - AMR_RATE_7400, /* AMR 7.40 kbps */ - AMR_RATE_7950, /* AMR 7.95 kbps */ - AMR_RATE_10200, /* AMR 10.20 kbps */ - AMR_RATE_12200, /* AMR 12.20 kbps */ - AMR_RATE_6600, /* AMR-WB 6.60 kbps */ - AMR_RATE_8850, /* AMR-WB 8.85 kbps */ - AMR_RATE_12650, /* AMR-WB 12.65 kbps */ - AMR_RATE_14250, /* AMR-WB 14.25 kbps */ - AMR_RATE_15850, /* AMR-WB 15.85 kbps */ - AMR_RATE_18250, /* AMR-WB 18.25 kbps */ - AMR_RATE_19850, /* AMR-WB 19.85 kbps */ - AMR_RATE_23050, /* AMR-WB 23.05 kbps */ - AMR_RATE_23850, /* AMR-WB 23.85 kbps */ - AMR_RATE_UNDEF -}; - -enum voip_state { - VOIP_STOPPED, - VOIP_STARTED, -}; - -struct voip_frame_hdr { - uint32_t timestamp; - union { - /* - * Bits 0-3: Frame type - * [optional] Bits 16-19: Frame rate - */ - uint32_t frame_type; - uint32_t packet_rate; - }; -}; -struct voip_frame { - struct voip_frame_hdr frm_hdr; - uint32_t pktlen; - uint8_t voc_pkt[VOIP_MAX_VOC_PKT_SIZE]; -}; - -struct voip_buf_node { - struct list_head list; - struct voip_frame frame; -}; - -struct voip_drv_info { - enum voip_state state; - - struct snd_pcm_substream *playback_substream; - struct snd_pcm_substream *capture_substream; - - struct list_head in_queue; - struct list_head free_in_queue; - - struct list_head out_queue; - struct list_head free_out_queue; - - wait_queue_head_t out_wait; - wait_queue_head_t in_wait; - - struct mutex lock; - - spinlock_t dsp_lock; - spinlock_t dsp_ul_lock; - - bool voip_reset; - uint32_t mode; - uint32_t rate_type; - uint32_t rate; - uint32_t dtx_mode; - - uint8_t capture_start; - uint8_t playback_start; - - uint8_t playback_prepare; - uint8_t capture_prepare; - - unsigned int play_samp_rate; - unsigned int cap_samp_rate; - - unsigned int pcm_size; - unsigned int pcm_count; - unsigned int pcm_playback_irq_pos; /* IRQ position */ - unsigned int pcm_playback_buf_pos; /* position in buffer */ - - unsigned int pcm_capture_size; - unsigned int pcm_capture_count; - unsigned int pcm_capture_irq_pos; /* IRQ position */ - unsigned int pcm_capture_buf_pos; /* position in buffer */ - - uint32_t evrc_min_rate; - uint32_t evrc_max_rate; -}; - -static int voip_get_media_type(uint32_t mode, uint32_t rate_type, - unsigned int samp_rate, - unsigned int *media_type); -static int voip_get_rate_type(uint32_t mode, - uint32_t rate, - uint32_t *rate_type); -static int voip_config_vocoder(struct snd_pcm_substream *substream); -static int msm_voip_mode_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_mode_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_evrc_min_max_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -static int msm_voip_evrc_min_max_rate_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - -static struct voip_drv_info voip_info; - -static struct snd_pcm_hardware msm_pcm_hardware = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED), - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_SPECIAL, - .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 1, - .buffer_bytes_max = sizeof(struct voip_buf_node) * VOIP_MAX_Q_LEN, - .period_bytes_min = VOIP_MIN_VOC_PKT_SIZE, - .period_bytes_max = VOIP_MAX_VOC_PKT_SIZE, - .periods_min = VOIP_MAX_Q_LEN, - .periods_max = VOIP_MAX_Q_LEN, - .fifo_size = 0, -}; - - -static int msm_voip_mute_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int mute = ucontrol->value.integer.value[0]; - int ramp_duration = ucontrol->value.integer.value[1]; - - if ((mute < 0) || (mute > 1) || (ramp_duration < 0)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mute=%d ramp_duration=%d\n", __func__, mute, - ramp_duration); - - voc_set_tx_mute(voc_get_session_id(VOIP_SESSION_NAME), TX_PATH, mute, - ramp_duration); - -done: - return ret; -} - -static int msm_voip_gain_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int volume = ucontrol->value.integer.value[0]; - int ramp_duration = ucontrol->value.integer.value[1]; - - if ((volume < 0) || (ramp_duration < 0)) { - pr_err(" %s Invalid arguments", __func__); - - ret = -EINVAL; - goto done; - } - - pr_debug("%s: volume: %d ramp_duration: %d\n", __func__, volume, - ramp_duration); - - voc_set_rx_vol_step(voc_get_session_id(VOIP_SESSION_NAME), - RX_PATH, - volume, - ramp_duration); - -done: - return ret; -} - -static int msm_voip_dtx_mode_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - voip_info.dtx_mode = ucontrol->value.integer.value[0]; - - pr_debug("%s: dtx: %d\n", __func__, voip_info.dtx_mode); - - mutex_unlock(&voip_info.lock); - - return 0; -} -static int msm_voip_dtx_mode_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - ucontrol->value.integer.value[0] = voip_info.dtx_mode; - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static struct snd_kcontrol_new msm_voip_controls[] = { - SOC_SINGLE_MULTI_EXT("Voip Tx Mute", SND_SOC_NOPM, 0, - MAX_RAMP_DURATION, - 0, 2, NULL, msm_voip_mute_put), - SOC_SINGLE_MULTI_EXT("Voip Rx Gain", SND_SOC_NOPM, 0, - MAX_RAMP_DURATION, - 0, 2, NULL, msm_voip_gain_put), - SOC_SINGLE_EXT("Voip Mode Config", SND_SOC_NOPM, 0, VOIP_MODE_MAX, 0, - msm_voip_mode_config_get, msm_voip_mode_config_put), - SOC_SINGLE_EXT("Voip Rate Config", SND_SOC_NOPM, 0, VOIP_RATE_MAX, 0, - NULL, msm_voip_rate_config_put), - SOC_SINGLE_MULTI_EXT("Voip Evrc Min Max Rate Config", SND_SOC_NOPM, - 0, VOC_1_RATE, 0, 2, - msm_voip_evrc_min_max_rate_config_get, - msm_voip_evrc_min_max_rate_config_put), - SOC_SINGLE_EXT("Voip Dtx Mode", SND_SOC_NOPM, 0, 1, 0, - msm_voip_dtx_mode_get, msm_voip_dtx_mode_put), -}; - -static int msm_pcm_voip_probe(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, msm_voip_controls, - ARRAY_SIZE(msm_voip_controls)); - - return 0; -} - -/* sample rate supported */ -static unsigned int supported_sample_rates[] = {8000, 16000, 32000, 48000}; - -static void voip_ssr_cb_fn(uint32_t opcode, void *private_data) -{ - - /* Notify ASoC to send next playback/Capture to unblock write/read */ - struct voip_drv_info *prtd = private_data; - - if (opcode == 0xFFFFFFFF) { - - prtd->voip_reset = true; - pr_debug("%s: Notify ASoC to send next playback/Capture\n", - __func__); - - prtd->pcm_playback_irq_pos += prtd->pcm_count; - if (prtd->state == VOIP_STARTED) - snd_pcm_period_elapsed(prtd->playback_substream); - wake_up(&prtd->out_wait); - - prtd->pcm_capture_irq_pos += prtd->pcm_capture_count; - if (prtd->state == VOIP_STARTED) - snd_pcm_period_elapsed(prtd->capture_substream); - wake_up(&prtd->in_wait); - - } else { - pr_err("%s: Invalid opcode during reset : %d\n", - __func__, opcode); - } -} - -/* capture path */ -static void voip_process_ul_pkt(uint8_t *voc_pkt, - uint32_t pkt_len, - uint32_t timestamp, - void *private_data) -{ - struct voip_buf_node *buf_node = NULL; - struct voip_drv_info *prtd = private_data; - unsigned long dsp_flags; - - if (prtd->capture_substream == NULL) - return; - - /* Copy up-link packet into out_queue. */ - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - - /* discarding UL packets till start is received */ - if (!list_empty(&prtd->free_out_queue) && prtd->capture_start) { - buf_node = list_first_entry(&prtd->free_out_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - switch (prtd->mode) { - case MODE_AMR_WB: - case MODE_AMR: { - /* Remove the DSP frame info header. Header format: - * Bits 0-3: Frame rate - * Bits 4-7: Frame type - */ - buf_node->frame.frm_hdr.timestamp = timestamp; - buf_node->frame.frm_hdr.frame_type = - ((*voc_pkt) & 0xF0) >> 4; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - buf_node->frame.pktlen = pkt_len - DSP_FRAME_HDR_LEN; - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, &prtd->out_queue); - break; - } - case MODE_IS127: - case MODE_4GV_NB: - case MODE_4GV_WB: - case MODE_4GV_NW: { - /* Remove the DSP frame info header. - * Header format: - * Bits 0-3: frame rate - */ - buf_node->frame.frm_hdr.timestamp = timestamp; - buf_node->frame.frm_hdr.packet_rate = (*voc_pkt) & 0x0F; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - buf_node->frame.pktlen = pkt_len - DSP_FRAME_HDR_LEN; - - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, &prtd->out_queue); - break; - } - case MODE_G711: - case MODE_G711A:{ - /* G711 frames are 10ms each, but the DSP works with - * 20ms frames and sends two 10ms frames per buffer. - * Extract the two frames and put them in separate - * buffers. - */ - /* Remove the first DSP frame info header. - * Header format: G711A - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - * - * Header format: G711 - * Bits 2-3: Frame rate - */ - if (prtd->mode == MODE_G711A) - buf_node->frame.frm_hdr.frame_type = - (*voc_pkt) & 0x03; - buf_node->frame.frm_hdr.timestamp = timestamp; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - /* There are two frames in the buffer. Length of the - * first frame: - */ - buf_node->frame.pktlen = (pkt_len - - 2 * DSP_FRAME_HDR_LEN) / 2; - - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - voc_pkt = voc_pkt + buf_node->frame.pktlen; - - list_add_tail(&buf_node->list, &prtd->out_queue); - - /* Get another buffer from the free Q and fill in the - * second frame. - */ - if (!list_empty(&prtd->free_out_queue)) { - buf_node = - list_first_entry(&prtd->free_out_queue, - struct voip_buf_node, - list); - list_del(&buf_node->list); - - /* Remove the second DSP frame info header. - * Header format: - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - */ - - if (prtd->mode == MODE_G711A) - buf_node->frame.frm_hdr.frame_type = - (*voc_pkt) & 0x03; - buf_node->frame.frm_hdr.timestamp = timestamp; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - /* There are two frames in the buffer. Length - * of the second frame: - */ - buf_node->frame.pktlen = (pkt_len - - 2 * DSP_FRAME_HDR_LEN) / 2; - - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, - &prtd->out_queue); - } else { - /* Drop the second frame */ - pr_err("%s: UL data dropped, read is slow\n", - __func__); - } - break; - } - default: { - buf_node->frame.frm_hdr.timestamp = timestamp; - buf_node->frame.pktlen = pkt_len; - memcpy(&buf_node->frame.voc_pkt[0], - voc_pkt, - buf_node->frame.pktlen); - list_add_tail(&buf_node->list, &prtd->out_queue); - } - } - pr_debug("%s: pkt_len =%d, frame.pktlen=%d, timestamp=%d\n", - __func__, pkt_len, buf_node->frame.pktlen, timestamp); - - if (prtd->mode == MODE_PCM) - prtd->pcm_capture_irq_pos += buf_node->frame.pktlen; - else - prtd->pcm_capture_irq_pos += prtd->pcm_capture_count; - - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - snd_pcm_period_elapsed(prtd->capture_substream); - } else { - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - pr_err("UL data dropped\n"); - } - - wake_up(&prtd->out_wait); -} - -/* playback path */ -static void voip_process_dl_pkt(uint8_t *voc_pkt, void *private_data) -{ - struct voip_buf_node *buf_node = NULL; - struct voip_drv_info *prtd = private_data; - unsigned long dsp_flags; - uint32_t rate_type; - uint32_t frame_rate; - u32 pkt_len; - u8 *voc_addr = NULL; - - if (prtd->playback_substream == NULL) - return; - - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - - if (!list_empty(&prtd->in_queue) && prtd->playback_start) { - buf_node = list_first_entry(&prtd->in_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - switch (prtd->mode) { - case MODE_AMR: - case MODE_AMR_WB: { - *((uint32_t *)voc_pkt) = buf_node->frame.pktlen + - DSP_FRAME_HDR_LEN; - /* Advance to the header of voip packet */ - voc_pkt = voc_pkt + sizeof(uint32_t); - /* - * Add the DSP frame info header. Header format: - * Bits 0-3: Frame rate - * Bits 4-7: Frame type - */ - *voc_pkt = ((buf_node->frame.frm_hdr.frame_type & - 0x0F) << 4); - frame_rate = (buf_node->frame.frm_hdr.frame_type & - 0xFFFF0000) >> 16; - if (frame_rate) { - if (voip_get_rate_type(prtd->mode, frame_rate, - &rate_type)) { - pr_err("%s(): fail at getting rate_type\n", - __func__); - } else - prtd->rate_type = rate_type; - } - *voc_pkt |= prtd->rate_type & 0x0F; - - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - list_add_tail(&buf_node->list, &prtd->free_in_queue); - break; - } - case MODE_IS127: - case MODE_4GV_NB: - case MODE_4GV_WB: - case MODE_4GV_NW: { - *((uint32_t *)voc_pkt) = buf_node->frame.pktlen + - DSP_FRAME_HDR_LEN; - /* Advance to the header of voip packet */ - voc_pkt = voc_pkt + sizeof(uint32_t); - /* - * Add the DSP frame info header. Header format: - * Bits 0-3 : Frame rate - */ - *voc_pkt = buf_node->frame.frm_hdr.packet_rate & 0x0F; - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, &prtd->free_in_queue); - break; - } - case MODE_G711: - case MODE_G711A:{ - /* G711 frames are 10ms each but the DSP expects 20ms - * worth of data, so send two 10ms frames per buffer. - */ - /* Add the first DSP frame info header. Header format: - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - */ - voc_addr = voc_pkt; - voc_pkt = voc_pkt + sizeof(uint32_t); - - *voc_pkt = ((prtd->rate_type & 0x0F) << 2) | - (buf_node->frame.frm_hdr.frame_type & 0x03); - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - pkt_len = buf_node->frame.pktlen + DSP_FRAME_HDR_LEN; - - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - voc_pkt = voc_pkt + buf_node->frame.pktlen; - - list_add_tail(&buf_node->list, &prtd->free_in_queue); - - if (!list_empty(&prtd->in_queue)) { - /* Get the second buffer. */ - buf_node = list_first_entry(&prtd->in_queue, - struct voip_buf_node, - list); - list_del(&buf_node->list); - - /* Add the second DSP frame info header. - * Header format: - * Bits 0-1: Frame type - * Bits 2-3: Frame rate - */ - *voc_pkt = ((prtd->rate_type & 0x0F) << 2) | - (buf_node->frame.frm_hdr.frame_type & 0x03); - voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN; - - pkt_len = pkt_len + buf_node->frame.pktlen + - DSP_FRAME_HDR_LEN; - - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - - list_add_tail(&buf_node->list, - &prtd->free_in_queue); - } else { - /* Only 10ms worth of data is available, signal - * erasure frame. - */ - *voc_pkt = ((prtd->rate_type & 0x0F) << 2) | - (MVS_G711A_ERASURE & 0x03); - - pkt_len = pkt_len + DSP_FRAME_HDR_LEN; - pr_debug("%s, Only 10ms read, erase 2nd frame\n", - __func__); - } - *((uint32_t *)voc_addr) = pkt_len; - break; - } - default: { - *((uint32_t *)voc_pkt) = buf_node->frame.pktlen; - voc_pkt = voc_pkt + sizeof(uint32_t); - memcpy(voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.pktlen); - list_add_tail(&buf_node->list, &prtd->free_in_queue); - } - } - pr_debug("%s: frame.pktlen=%d\n", __func__, - buf_node->frame.pktlen); - - if (prtd->mode == MODE_PCM) - prtd->pcm_playback_irq_pos += buf_node->frame.pktlen; - else - prtd->pcm_playback_irq_pos += prtd->pcm_count; - - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - snd_pcm_period_elapsed(prtd->playback_substream); - } else { - *((uint32_t *)voc_pkt) = 0; - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - pr_err_ratelimited("DL data not available\n"); - } - wake_up(&prtd->in_wait); -} - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - prtd->play_samp_rate = runtime->rate; - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_playback_irq_pos = 0; - prtd->pcm_playback_buf_pos = 0; - prtd->playback_prepare = 1; - - return 0; -} - -static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - int ret = 0; - - prtd->cap_samp_rate = runtime->rate; - prtd->pcm_capture_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_capture_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_capture_irq_pos = 0; - prtd->pcm_capture_buf_pos = 0; - prtd->capture_prepare = 1; - return ret; -} - -static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - pr_debug("%s: Trigger start\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_start = 1; - else - prtd->playback_start = 1; - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->playback_start = 0; - else - prtd->capture_start = 0; - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static int msm_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = &voip_info; - int ret = 0; - - pr_debug("%s, VoIP\n", __func__); - mutex_lock(&prtd->lock); - - runtime->hw = msm_pcm_hardware; - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_debug("snd_pcm_hw_constraint_list failed\n"); - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) { - pr_debug("snd_pcm_hw_constraint_integer failed\n"); - goto err; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->playback_substream = substream; - else - prtd->capture_substream = substream; - - runtime->private_data = prtd; -err: - mutex_unlock(&prtd->lock); - - return ret; -} - -static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - struct voip_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - - pr_debug("%s: fbytes=%lu\n", __func__, fbytes); - - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - ret = wait_event_interruptible_timeout(prtd->in_wait, - (!list_empty(&prtd->free_in_queue) || - prtd->state == VOIP_STOPPED), - 1 * HZ); - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - if (ret > 0) { - if (fbytes <= VOIP_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - buf_node = - list_first_entry(&prtd->free_in_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - if (prtd->mode == MODE_PCM) { - ret = copy_from_user(&buf_node->frame.voc_pkt, - buf, fbytes); - if (ret) { - pr_err("%s: copy from user failed %d\n", - __func__, ret); - return -EFAULT; - } - buf_node->frame.pktlen = fbytes; - } else { - ret = copy_from_user(&buf_node->frame, - buf, fbytes); - if (ret) { - pr_err("%s: copy from user failed %d\n", - __func__, ret); - return -EFAULT; - } - if (buf_node->frame.pktlen >= fbytes) - buf_node->frame.pktlen = fbytes - - (sizeof(buf_node->frame.frm_hdr) + - sizeof(buf_node->frame.pktlen)); - } - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_add_tail(&buf_node->list, &prtd->in_queue); - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - } else { - pr_err("%s: Write cnt %lu is > VOIP_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - - } else if (ret == 0) { - pr_err("%s: No free DL buffs\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: playback copy was interrupted %d\n", __func__, ret); - } - - return ret; -} -static int msm_pcm_capture_copy(struct snd_pcm_substream *substream, - int channel, unsigned long hwoff, void __user *buf, - unsigned long fbytes) -{ - int ret = 0; - struct voip_buf_node *buf_node = NULL; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - unsigned long dsp_flags; - int size; - - pr_debug("%s: fbytes = %lu\n", __func__, fbytes); - - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - ret = wait_event_interruptible_timeout(prtd->out_wait, - (!list_empty(&prtd->out_queue) || - prtd->state == VOIP_STOPPED), - 1 * HZ); - - if (prtd->voip_reset) { - pr_debug("%s: RESET event happened during VoIP\n", __func__); - return -ENETRESET; - } - - if (ret > 0) { - - if (fbytes <= VOIP_MAX_VOC_PKT_SIZE) { - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - buf_node = list_first_entry(&prtd->out_queue, - struct voip_buf_node, list); - list_del(&buf_node->list); - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - if (prtd->mode == MODE_PCM) { - ret = copy_to_user(buf, - &buf_node->frame.voc_pkt, - buf_node->frame.pktlen); - } else { - size = sizeof(buf_node->frame.frm_hdr) + - sizeof(buf_node->frame.pktlen) + - buf_node->frame.pktlen; - - ret = copy_to_user(buf, - &buf_node->frame, - size); - } - if (ret) { - pr_err("%s: Copy to user returned %d\n", - __func__, ret); - ret = -EFAULT; - } - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - list_add_tail(&buf_node->list, - &prtd->free_out_queue); - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - } else { - pr_err("%s: Read fbytes %lu > VOIP_MAX_VOC_PKT_SIZE\n", - __func__, fbytes); - ret = -ENOMEM; - } - - - } else if (ret == 0) { - pr_err_ratelimited("%s: No UL data available\n", __func__); - ret = -ETIMEDOUT; - } else { - pr_err("%s: Read was interrupted\n", __func__); - ret = -ERESTARTSYS; - } - return ret; -} -static int msm_pcm_copy(struct snd_pcm_substream *substream, int a, - unsigned long hwoff, void __user *buf, unsigned long fbytes) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_copy(substream, a, hwoff, buf, fbytes); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_copy(substream, a, hwoff, buf, fbytes); - - return ret; -} - -static int msm_pcm_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct voip_buf_node *buf_node = NULL; - struct snd_dma_buffer *p_dma_buf, *c_dma_buf; - struct snd_pcm_substream *p_substream, *c_substream; - struct snd_pcm_runtime *runtime; - struct voip_drv_info *prtd; - unsigned long dsp_flags; - - if (substream == NULL) { - pr_err("substream is NULL\n"); - return -EINVAL; - } - runtime = substream->runtime; - prtd = runtime->private_data; - - wake_up(&prtd->out_wait); - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - prtd->playback_prepare = 0; - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - prtd->capture_prepare = 0; - - if (!prtd->playback_prepare && !prtd->capture_prepare) { - if (prtd->state == VOIP_STARTED) { - prtd->voip_reset = false; - prtd->state = VOIP_STOPPED; - voc_end_voice_call( - voc_get_session_id(VOIP_SESSION_NAME)); - voc_register_mvs_cb(NULL, NULL, NULL, prtd); - } - /* release all buffer */ - /* release in_queue and free_in_queue */ - pr_debug("release all buffer\n"); - p_substream = prtd->playback_substream; - if (p_substream == NULL) { - pr_debug("p_substream is NULL\n"); - goto capt; - } - p_dma_buf = &p_substream->dma_buffer; - if (p_dma_buf == NULL) { - pr_debug("p_dma_buf is NULL\n"); - goto capt; - } - if (p_dma_buf->area != NULL) { - spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); - list_for_each_safe(ptr, next, &prtd->in_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - list_for_each_safe(ptr, next, &prtd->free_in_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); - dma_free_coherent(p_substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, p_dma_buf->area, - p_dma_buf->addr); - p_dma_buf->area = NULL; - } - /* release out_queue and free_out_queue */ -capt: c_substream = prtd->capture_substream; - if (c_substream == NULL) { - pr_debug("c_substream is NULL\n"); - goto done; - } - c_dma_buf = &c_substream->dma_buffer; - if (c_substream == NULL) { - pr_debug("c_dma_buf is NULL.\n"); - goto done; - } - if (c_dma_buf->area != NULL) { - spin_lock_irqsave(&prtd->dsp_ul_lock, dsp_flags); - list_for_each_safe(ptr, next, &prtd->out_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - list_for_each_safe(ptr, next, &prtd->free_out_queue) { - buf_node = list_entry(ptr, - struct voip_buf_node, list); - list_del(&buf_node->list); - } - spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags); - dma_free_coherent(c_substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, c_dma_buf->area, - c_dma_buf->addr); - c_dma_buf->area = NULL; - } -done: - prtd->capture_substream = NULL; - prtd->playback_substream = NULL; - } - mutex_unlock(&prtd->lock); - - return ret; -} - -static int voip_config_vocoder(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - uint32_t media_type = 0; - uint32_t rate_type = 0; - uint32_t evrc_min_rate_type = 0; - uint32_t evrc_max_rate_type = 0; - - pr_debug("%s(): mode=%d, playback rate=%d, capture rate=%d\n", - __func__, prtd->mode, prtd->play_samp_rate, - prtd->cap_samp_rate); - - if ((runtime->format != FORMAT_S16_LE && - runtime->format != FORMAT_SPECIAL) && - ((prtd->mode == MODE_AMR) || (prtd->mode == MODE_AMR_WB) || - (prtd->mode == MODE_IS127) || (prtd->mode == MODE_4GV_NB) || - (prtd->mode == MODE_4GV_WB) || (prtd->mode == MODE_4GV_NW) || - (prtd->mode == MODE_G711) || (prtd->mode == MODE_G711A))) { - pr_err("%s(): mode:%d and format:%u are not matched\n", - __func__, prtd->mode, (uint32_t)runtime->format); - - ret = -EINVAL; - goto done; - } - - if (runtime->format != FORMAT_S16_LE && (prtd->mode == MODE_PCM)) { - pr_err("%s(): mode:%d and format:%u are not matched\n", - __func__, prtd->mode, runtime->format); - - ret = -EINVAL; - goto done; - } - - if ((prtd->mode == MODE_PCM) || - (prtd->mode == MODE_AMR) || - (prtd->mode == MODE_AMR_WB) || - (prtd->mode == MODE_G711) || - (prtd->mode == MODE_G711A)) { - ret = voip_get_rate_type(prtd->mode, - prtd->rate, - &rate_type); - if (ret < 0) { - pr_err("%s(): fail at getting rate_type, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - prtd->rate_type = rate_type; - pr_debug("rate_type=%d\n", rate_type); - - } else if ((prtd->mode == MODE_IS127) || - (prtd->mode == MODE_4GV_NB) || - (prtd->mode == MODE_4GV_WB) || - (prtd->mode == MODE_4GV_NW)) { - ret = voip_get_rate_type(prtd->mode, - prtd->evrc_min_rate, - &evrc_min_rate_type); - if (ret < 0) { - pr_err("%s(): fail at getting min rate, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - if (evrc_min_rate_type == VOC_0_RATE) - evrc_min_rate_type = VOC_8_RATE; - - ret = voip_get_rate_type(prtd->mode, - prtd->evrc_max_rate, - &evrc_max_rate_type); - if (ret < 0) { - pr_err("%s(): fail at getting max rate, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - if (evrc_max_rate_type == VOC_0_RATE) - evrc_max_rate_type = VOC_1_RATE; - - if (evrc_max_rate_type < evrc_min_rate_type) { - pr_err("%s(): Invalid EVRC min max rates: %d, %d\n", - __func__, evrc_min_rate_type, - evrc_max_rate_type); - - ret = -EINVAL; - goto done; - } - pr_debug("%s(): min rate=%d, max rate=%d\n", - __func__, evrc_min_rate_type, evrc_max_rate_type); - } - ret = voip_get_media_type(prtd->mode, - prtd->rate_type, - prtd->play_samp_rate, - &media_type); - if (ret < 0) { - pr_err("%s(): fail at getting media_type, ret=%d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - pr_debug("%s(): media_type=%d\n", __func__, media_type); - - if ((prtd->play_samp_rate == 8000 && prtd->cap_samp_rate == 8000) || - (prtd->play_samp_rate == 16000 && prtd->cap_samp_rate == 16000) || - (prtd->play_samp_rate == 32000 && prtd->cap_samp_rate == 32000) || - (prtd->play_samp_rate == 48000 && prtd->cap_samp_rate == 48000)) { - voc_config_vocoder(media_type, rate_type, - VSS_NETWORK_ID_VOIP, - voip_info.dtx_mode, - evrc_min_rate_type, - evrc_max_rate_type); - } else { - pr_debug("%s: Invalid rate playback %d, capture %d\n", - __func__, prtd->play_samp_rate, - prtd->cap_samp_rate); - - ret = -EINVAL; - } -done: - - return ret; -} - -static int msm_pcm_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - mutex_lock(&prtd->lock); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_prepare(substream); - - if (prtd->playback_prepare && prtd->capture_prepare - && (prtd->state != VOIP_STARTED)) { - ret = voip_config_vocoder(substream); - if (ret < 0) { - pr_err("%s(): fail at configuring vocoder for voip, ret=%d\n", - __func__, ret); - - goto done; - } - - /* Initialaizing cb variables */ - voc_register_mvs_cb(voip_process_ul_pkt, - voip_process_dl_pkt, - voip_ssr_cb_fn, prtd); - - ret = voc_start_voice_call( - voc_get_session_id(VOIP_SESSION_NAME)); - - if (ret < 0) { - pr_err("%s: voc_start_voice_call() failed err %d", - __func__, ret); - - goto done; - } - prtd->state = VOIP_STARTED; - } -done: - mutex_unlock(&prtd->lock); - - return ret; -} - -static snd_pcm_uframes_t -msm_pcm_playback_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - pr_debug("%s\n", __func__); - if (prtd->pcm_playback_irq_pos >= prtd->pcm_size) - prtd->pcm_playback_irq_pos = 0; - return bytes_to_frames(runtime, (prtd->pcm_playback_irq_pos)); -} - -static snd_pcm_uframes_t -msm_pcm_capture_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct voip_drv_info *prtd = runtime->private_data; - - if (prtd->pcm_capture_irq_pos >= prtd->pcm_capture_size) - prtd->pcm_capture_irq_pos = 0; - return bytes_to_frames(runtime, (prtd->pcm_capture_irq_pos)); -} - -static snd_pcm_uframes_t msm_pcm_pointer(struct snd_pcm_substream *substream) -{ - snd_pcm_uframes_t ret = 0; - - pr_debug("%s\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_pcm_playback_pointer(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_pcm_capture_pointer(substream); - return ret; -} - -static int msm_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - - pr_debug("%s\n", __func__); - dma_mmap_coherent(substream->pcm->card->dev, vma, - runtime->dma_area, - runtime->dma_addr, - runtime->dma_bytes); - return 0; -} - -static int msm_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct voip_buf_node *buf_node = NULL; - int i = 0, offset = 0; - - pr_debug("%s: voip\n", __func__); - - mutex_lock(&voip_info.lock); - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - - dma_buf->area = dma_alloc_coherent(substream->pcm->card->dev, - runtime->hw.buffer_bytes_max, - &dma_buf->addr, GFP_KERNEL); - if (!dma_buf->area) { - pr_err("%s:MSM VOIP dma_alloc failed\n", __func__); - mutex_unlock(&voip_info.lock); - return -ENOMEM; - } - - dma_buf->bytes = runtime->hw.buffer_bytes_max; - memset(dma_buf->area, 0, runtime->hw.buffer_bytes_max); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - for (i = 0; i < VOIP_MAX_Q_LEN; i++) { - buf_node = (void *)dma_buf->area + offset; - - list_add_tail(&buf_node->list, - &voip_info.free_in_queue); - offset = offset + sizeof(struct voip_buf_node); - } - } else { - for (i = 0; i < VOIP_MAX_Q_LEN; i++) { - buf_node = (void *) dma_buf->area + offset; - list_add_tail(&buf_node->list, - &voip_info.free_out_queue); - offset = offset + sizeof(struct voip_buf_node); - } - } - - mutex_unlock(&voip_info.lock); - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - - return 0; -} - -static int msm_voip_mode_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - ucontrol->value.integer.value[0] = voip_info.mode; - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int msm_voip_mode_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - voip_info.mode = ucontrol->value.integer.value[0]; - - pr_debug("%s: mode=%d\n", __func__, voip_info.mode); - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int msm_voip_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int rate = ucontrol->value.integer.value[0]; - - mutex_lock(&voip_info.lock); - - if (voip_info.rate != rate) { - voip_info.rate = rate; - pr_debug("%s: rate=%d\n", __func__, voip_info.rate); - - if (voip_info.state == VOIP_STARTED && - (voip_info.mode == MODE_AMR || - voip_info.mode == MODE_AMR_WB)) { - ret = voip_config_vocoder( - voip_info.capture_substream); - if (ret) { - pr_err("%s:Failed to configure vocoder, ret=%d\n", - __func__, ret); - - goto done; - } - - ret = voc_update_amr_vocoder_rate( - voc_get_session_id(VOIP_SESSION_NAME)); - if (ret) { - pr_err("%s:Failed to update AMR rate, ret=%d\n", - __func__, ret); - } - } - } - -done: - mutex_unlock(&voip_info.lock); - - return ret; -} - -static int msm_voip_evrc_min_max_rate_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - ucontrol->value.integer.value[0] = voip_info.evrc_min_rate; - ucontrol->value.integer.value[1] = voip_info.evrc_max_rate; - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int msm_voip_evrc_min_max_rate_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - mutex_lock(&voip_info.lock); - - voip_info.evrc_min_rate = ucontrol->value.integer.value[0]; - voip_info.evrc_max_rate = ucontrol->value.integer.value[1]; - - pr_debug("%s(): evrc_min_rate=%d,evrc_max_rate=%d\n", __func__, - voip_info.evrc_min_rate, voip_info.evrc_max_rate); - - mutex_unlock(&voip_info.lock); - - return 0; -} - -static int voip_get_rate_type(uint32_t mode, uint32_t rate, - uint32_t *rate_type) -{ - int ret = 0; - - switch (mode) { - case MODE_AMR: { - switch (rate) { - case 4750: - *rate_type = AMR_RATE_4750; - break; - case 5150: - *rate_type = AMR_RATE_5150; - break; - case 5900: - *rate_type = AMR_RATE_5900; - break; - case 6700: - *rate_type = AMR_RATE_6700; - break; - case 7400: - *rate_type = AMR_RATE_7400; - break; - case 7950: - *rate_type = AMR_RATE_7950; - break; - case 10200: - *rate_type = AMR_RATE_10200; - break; - case 12200: - *rate_type = AMR_RATE_12200; - break; - default: - pr_err("wrong rate for AMR NB.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_AMR_WB: { - switch (rate) { - case 6600: - *rate_type = AMR_RATE_6600 - AMR_RATE_6600; - break; - case 8850: - *rate_type = AMR_RATE_8850 - AMR_RATE_6600; - break; - case 12650: - *rate_type = AMR_RATE_12650 - AMR_RATE_6600; - break; - case 14250: - *rate_type = AMR_RATE_14250 - AMR_RATE_6600; - break; - case 15850: - *rate_type = AMR_RATE_15850 - AMR_RATE_6600; - break; - case 18250: - *rate_type = AMR_RATE_18250 - AMR_RATE_6600; - break; - case 19850: - *rate_type = AMR_RATE_19850 - AMR_RATE_6600; - break; - case 23050: - *rate_type = AMR_RATE_23050 - AMR_RATE_6600; - break; - case 23850: - *rate_type = AMR_RATE_23850 - AMR_RATE_6600; - break; - default: - pr_err("wrong rate for AMR_WB.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_PCM: { - *rate_type = 0; - break; - } - case MODE_IS127: - case MODE_4GV_NB: - case MODE_4GV_WB: { - switch (rate) { - case VOC_0_RATE: - case VOC_8_RATE: - case VOC_4_RATE: - case VOC_2_RATE: - case VOC_1_RATE: - *rate_type = rate; - break; - default: - pr_err("wrong rate for IS127/4GV_NB/WB.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_4GV_NW: { - switch (rate) { - case VOC_0_RATE: - case VOC_8_RATE: - case VOC_4_RATE: - case VOC_2_RATE: - case VOC_1_RATE: - case VOC_8_RATE_NC: - *rate_type = rate; - break; - default: - pr_err("wrong rate for 4GV_NW.\n"); - ret = -EINVAL; - break; - } - break; - } - case MODE_G711: - case MODE_G711A: - *rate_type = rate; - break; - default: - pr_err("wrong mode type.\n"); - ret = -EINVAL; - } - pr_debug("%s, mode=%d, rate=%u, rate_type=%d\n", - __func__, mode, rate, *rate_type); - return ret; -} - -static int voip_get_media_type(uint32_t mode, uint32_t rate_type, - unsigned int samp_rate, - unsigned int *media_type) -{ - int ret = 0; - - pr_debug("%s: mode=%d, samp_rate=%d\n", __func__, - mode, samp_rate); - switch (mode) { - case MODE_AMR: - *media_type = VSS_MEDIA_ID_AMR_NB_MODEM; - break; - case MODE_AMR_WB: - *media_type = VSS_MEDIA_ID_AMR_WB_MODEM; - break; - case MODE_PCM: - if (samp_rate == 8000) - *media_type = VSS_MEDIA_ID_PCM_8_KHZ; - else if (samp_rate == 16000) - *media_type = VSS_MEDIA_ID_PCM_16_KHZ; - else if (samp_rate == 32000) - *media_type = VSS_MEDIA_ID_PCM_32_KHZ; - else - *media_type = VSS_MEDIA_ID_PCM_48_KHZ; - break; - case MODE_IS127: /* EVRC-A */ - *media_type = VSS_MEDIA_ID_EVRC_MODEM; - break; - case MODE_4GV_NB: /* EVRC-B */ - *media_type = VSS_MEDIA_ID_4GV_NB_MODEM; - break; - case MODE_4GV_WB: /* EVRC-WB */ - *media_type = VSS_MEDIA_ID_4GV_WB_MODEM; - break; - case MODE_4GV_NW: /* EVRC-NW */ - *media_type = VSS_MEDIA_ID_4GV_NW_MODEM; - break; - case MODE_G711: - case MODE_G711A: - if (rate_type == MVS_G711A_MODE_MULAW) - *media_type = VSS_MEDIA_ID_G711_MULAW; - else - *media_type = VSS_MEDIA_ID_G711_ALAW; - break; - default: - pr_debug(" input mode is not supported\n"); - ret = -EINVAL; - } - - pr_debug("%s: media_type is 0x%x\n", __func__, *media_type); - - return ret; -} - - -static const struct snd_pcm_ops msm_pcm_ops = { - .open = msm_pcm_open, - .copy_user = msm_pcm_copy, - .hw_params = msm_pcm_hw_params, - .close = msm_pcm_close, - .prepare = msm_pcm_prepare, - .trigger = msm_pcm_trigger, - .pointer = msm_pcm_pointer, - .mmap = msm_pcm_mmap, -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - pr_debug("msm_asoc_pcm_new\n"); - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_pcm_ops, - .pcm_new = msm_asoc_pcm_new, - .probe = msm_pcm_voip_probe, -}; - -static int msm_pcm_probe(struct platform_device *pdev) -{ - int rc; - - if (!is_voc_initialized()) { - pr_debug("%s: voice module not initialized yet, deferring probe()\n", - __func__); - - rc = -EPROBE_DEFER; - goto done; - } - - rc = voc_alloc_cal_shared_memory(); - if (rc == -EPROBE_DEFER) { - pr_debug("%s: memory allocation for calibration deferred %d\n", - __func__, rc); - - goto done; - } else if (rc < 0) { - pr_err("%s: memory allocation for calibration failed %d\n", - __func__, rc); - } - - rc = voc_alloc_voip_shared_memory(); - if (rc < 0) { - pr_err("%s: error allocating shared mem err %d\n", - __func__, rc); - } - - - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - rc = snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); - -done: - return rc; -} - -static int msm_pcm_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_voip_dt_match[] = { - {.compatible = "qcom,msm-voip-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_voip_dt_match); - -static struct platform_driver msm_pcm_driver = { - .driver = { - .name = "msm-voip-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_voip_dt_match, - }, - .probe = msm_pcm_probe, - .remove = msm_pcm_remove, -}; - -int __init msm_pcm_voip_init(void) -{ - memset(&voip_info, 0, sizeof(voip_info)); - voip_info.mode = MODE_PCM; - mutex_init(&voip_info.lock); - - spin_lock_init(&voip_info.dsp_lock); - spin_lock_init(&voip_info.dsp_ul_lock); - - init_waitqueue_head(&voip_info.out_wait); - init_waitqueue_head(&voip_info.in_wait); - - INIT_LIST_HEAD(&voip_info.in_queue); - INIT_LIST_HEAD(&voip_info.free_in_queue); - INIT_LIST_HEAD(&voip_info.out_queue); - INIT_LIST_HEAD(&voip_info.free_out_queue); - - return platform_driver_register(&msm_pcm_driver); -} - -void msm_pcm_voip_exit(void) -{ - platform_driver_unregister(&msm_pcm_driver); -} - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm-qti-pp-config.c b/techpack/audio/asoc/msm-qti-pp-config.c deleted file mode 100644 index 4b4b3e43c723..000000000000 --- a/techpack/audio/asoc/msm-qti-pp-config.c +++ /dev/null @@ -1,1686 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-qti-pp-config.h" -#include "msm-pcm-routing-v2.h" - -/* EQUALIZER */ -/* Equal to Frontend after last of the MULTIMEDIA SESSIONS */ -#define MAX_EQ_SESSIONS (MSM_FRONTEND_DAI_MAX + 1) -#define CHMIX_CFG_CONST_PARAM_SIZE 4 - -enum { - EQ_BAND1 = 0, - EQ_BAND2, - EQ_BAND3, - EQ_BAND4, - EQ_BAND5, - EQ_BAND6, - EQ_BAND7, - EQ_BAND8, - EQ_BAND9, - EQ_BAND10, - EQ_BAND11, - EQ_BAND12, - EQ_BAND_MAX, -}; - -/* Audio Sphere data structures */ -struct msm_audio_pp_asphere_state_s { - uint32_t enabled; - uint32_t strength; - uint32_t mode; - uint32_t version; - int port_id[AFE_MAX_PORTS]; - int copp_idx[AFE_MAX_PORTS]; - bool initialized; - uint32_t enabled_prev; - uint32_t strength_prev; -}; - -static struct msm_audio_pp_asphere_state_s asphere_state; - -struct msm_audio_eq_stream_config eq_data[MAX_EQ_SESSIONS]; - -static int msm_route_hfp_vol_control; -static const DECLARE_TLV_DB_LINEAR(hfp_rx_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_route_icc_vol_control; -static const DECLARE_TLV_DB_LINEAR(icc_rx_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_route_pri_auxpcm_lb_vol_ctrl; -static const DECLARE_TLV_DB_LINEAR(pri_auxpcm_lb_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_route_sec_auxpcm_lb_vol_ctrl; -static const DECLARE_TLV_DB_LINEAR(sec_auxpcm_lb_vol_gain, 0, - INT_RX_VOL_MAX_STEPS); - -static int msm_multichannel_ec_primary_mic_ch; -static int msm_ffecns_effect; - -static void msm_qti_pp_send_eq_values_(int eq_idx) -{ - int result; - struct msm_pcm_routing_fdai_data fe_dai; - struct audio_client *ac = NULL; - - msm_pcm_routing_get_fedai_info(eq_idx, SESSION_TYPE_RX, &fe_dai); - ac = q6asm_get_audio_client(fe_dai.strm_id); - - if (ac == NULL) { - pr_err("%s: Could not get audio client for session: %d\n", - __func__, fe_dai.strm_id); - goto done; - } - - result = q6asm_equalizer(ac, &eq_data[eq_idx]); - - if (result < 0) - pr_err("%s: Call to ASM equalizer failed, returned = %d\n", - __func__, result); -done: - return; -} - -static int msm_qti_pp_get_eq_enable_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - - ucontrol->value.integer.value[0] = eq_data[eq_idx].enable; - - pr_debug("%s: EQ #%d enable %d\n", __func__, - eq_idx, eq_data[eq_idx].enable); - return 0; -} - -static int msm_qti_pp_put_eq_enable_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int value = ucontrol->value.integer.value[0]; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - pr_debug("%s: EQ #%d enable %d\n", __func__, - eq_idx, value); - eq_data[eq_idx].enable = value; - msm_pcm_routing_acquire_lock(); - msm_qti_pp_send_eq_values_(eq_idx); - msm_pcm_routing_release_lock(); - return 0; -} - -static int msm_qti_pp_get_eq_band_count_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands; - - pr_debug("%s: EQ #%d bands %d\n", __func__, - eq_idx, eq_data[eq_idx].num_bands); - return eq_data[eq_idx].num_bands; -} - -static int msm_qti_pp_put_eq_band_count_audio_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int value = ucontrol->value.integer.value[0]; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS)) - return -EINVAL; - - pr_debug("%s: EQ #%d bands %d\n", __func__, - eq_idx, value); - eq_data[eq_idx].num_bands = value; - return 0; -} - -static int msm_qti_pp_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS) || - (band_idx < EQ_BAND1) || (band_idx >= EQ_BAND_MAX)) - return -EINVAL; - - ucontrol->value.integer.value[0] = - eq_data[eq_idx].eq_bands[band_idx].band_idx; - ucontrol->value.integer.value[1] = - eq_data[eq_idx].eq_bands[band_idx].filter_type; - ucontrol->value.integer.value[2] = - eq_data[eq_idx].eq_bands[band_idx].center_freq_hz; - ucontrol->value.integer.value[3] = - eq_data[eq_idx].eq_bands[band_idx].filter_gain; - ucontrol->value.integer.value[4] = - eq_data[eq_idx].eq_bands[band_idx].q_factor; - - pr_debug("%s: band_idx = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].band_idx); - pr_debug("%s: filter_type = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].filter_type); - pr_debug("%s: center_freq_hz = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].center_freq_hz); - pr_debug("%s: filter_gain = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].filter_gain); - pr_debug("%s: q_factor = %d\n", __func__, - eq_data[eq_idx].eq_bands[band_idx].q_factor); - return 0; -} - -static int msm_qti_pp_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int eq_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->reg; - int band_idx = ((struct soc_multi_mixer_control *) - kcontrol->private_value)->shift; - - if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS) || - (band_idx < EQ_BAND1) || (band_idx >= EQ_BAND_MAX)) - return -EINVAL; - - eq_data[eq_idx].eq_bands[band_idx].band_idx = - ucontrol->value.integer.value[0]; - eq_data[eq_idx].eq_bands[band_idx].filter_type = - ucontrol->value.integer.value[1]; - eq_data[eq_idx].eq_bands[band_idx].center_freq_hz = - ucontrol->value.integer.value[2]; - eq_data[eq_idx].eq_bands[band_idx].filter_gain = - ucontrol->value.integer.value[3]; - eq_data[eq_idx].eq_bands[band_idx].q_factor = - ucontrol->value.integer.value[4]; - return 0; -} - -#ifdef CONFIG_QTI_PP -void msm_qti_pp_send_eq_values(int fedai_id) -{ - if (eq_data[fedai_id].enable) - msm_qti_pp_send_eq_values_(fedai_id); -} - -/* CUSTOM MIXING */ -int msm_qti_pp_send_stereo_to_custom_stereo_cmd(int port_id, int copp_idx, - unsigned int session_id, - uint16_t op_FL_ip_FL_weight, - uint16_t op_FL_ip_FR_weight, - uint16_t op_FR_ip_FL_weight, - uint16_t op_FR_ip_FR_weight) -{ - char *params_value; - int *update_params_value32, rc = 0; - int16_t *update_params_value16 = 0; - uint32_t params_length = CUSTOM_STEREO_PAYLOAD_SIZE * sizeof(uint32_t); - uint32_t avail_length = params_length; - - pr_debug("%s: port_id - %d, session id - %d\n", __func__, port_id, - session_id); - params_value = kzalloc(params_length, GFP_KERNEL); - if (!params_value) { - pr_err("%s, params memory alloc failed\n", __func__); - return -ENOMEM; - } - update_params_value32 = (int *)params_value; - if (avail_length < 2 * sizeof(uint32_t)) - goto skip_send_cmd; - - /* - * This module is internal to ADSP and cannot be configured with - * an instance id - */ - *update_params_value32++ = MTMX_MODULE_ID_DEFAULT_CHMIXER; - *update_params_value32++ = DEFAULT_CHMIXER_PARAM_ID_COEFF; - avail_length = avail_length - (2 * sizeof(uint32_t)); - - update_params_value16 = (int16_t *)update_params_value32; - if (avail_length < 10 * sizeof(uint16_t)) - goto skip_send_cmd; - *update_params_value16++ = CUSTOM_STEREO_CMD_PARAM_SIZE; - /*for alignment only*/ - *update_params_value16++ = 0; - /*index is 32-bit param in little endian*/ - *update_params_value16++ = CUSTOM_STEREO_INDEX_PARAM; - *update_params_value16++ = 0; - /*for stereo mixing num out ch*/ - *update_params_value16++ = CUSTOM_STEREO_NUM_OUT_CH; - /*for stereo mixing num in ch*/ - *update_params_value16++ = CUSTOM_STEREO_NUM_IN_CH; - - /* Out ch map FL/FR*/ - *update_params_value16++ = PCM_CHANNEL_FL; - *update_params_value16++ = PCM_CHANNEL_FR; - - /* In ch map FL/FR*/ - *update_params_value16++ = PCM_CHANNEL_FL; - *update_params_value16++ = PCM_CHANNEL_FR; - avail_length = avail_length - (10 * sizeof(uint16_t)); - /* weighting coefficients as name suggests, - * mixing will be done according to these coefficients - */ - if (avail_length < 4 * sizeof(uint16_t)) - goto skip_send_cmd; - *update_params_value16++ = op_FL_ip_FL_weight; - *update_params_value16++ = op_FL_ip_FR_weight; - *update_params_value16++ = op_FR_ip_FL_weight; - *update_params_value16++ = op_FR_ip_FR_weight; - avail_length = avail_length - (4 * sizeof(uint16_t)); - if (params_length) { - rc = adm_set_stereo_to_custom_stereo(port_id, - copp_idx, - session_id, - params_value, - params_length); - if (rc) { - pr_err("%s: send params failed rc=%d\n", __func__, rc); - kfree(params_value); - return -EINVAL; - } - } - kfree(params_value); - return 0; -skip_send_cmd: - pr_err("%s: insufficient memory, send cmd failed\n", - __func__); - kfree(params_value); - return -ENOMEM; -} - -static int msm_qti_pp_arrange_mch_map(int16_t *update_params_value16, - int channel_count) -{ - int i; - int16_t ch_map[PCM_FORMAT_MAX_CHANNELS_9] = { - PCM_CHANNEL_FL, PCM_CHANNEL_FR, PCM_CHANNEL_FC, - PCM_CHANNEL_LS, PCM_CHANNEL_RS, PCM_CHANNEL_LFE, - PCM_CHANNEL_LB, PCM_CHANNEL_RB, PCM_CHANNEL_CS }; - - if (channel_count < 1 || - channel_count > PCM_FORMAT_MAX_CHANNELS_9) { - pr_err("%s: invalid ch_cnt %d\n", - __func__, channel_count); - return -EINVAL; - } - - switch (channel_count) { - /* Add special cases here */ - case 1: - *update_params_value16++ = PCM_CHANNEL_FC; - break; - case 4: - *update_params_value16++ = PCM_CHANNEL_FL; - *update_params_value16++ = PCM_CHANNEL_FR; - *update_params_value16++ = PCM_CHANNEL_LS; - *update_params_value16++ = PCM_CHANNEL_RS; - break; - - /* Add standard cases here */ - default: - for (i = 0; i < channel_count; i++) - *update_params_value16++ = ch_map[i]; - break; - } - - return 0; -} - -static uint32_t msm_qti_pp_get_chmix_param_size(int ip_ch_cnt, int op_ch_cnt) -{ - uint32_t param_size; - /* Assign constant part of param length initially - - * Index, Num out channels, Num in channels. - */ - param_size = CHMIX_CFG_CONST_PARAM_SIZE * sizeof(uint16_t); - - /* Calculate variable part of param length using ip and op channels */ - - /* channel map for input and output channels */ - param_size += op_ch_cnt * sizeof(uint16_t); - param_size += ip_ch_cnt * sizeof(uint16_t); - - /* weightage coeff for each op ch corresponding to each ip ch */ - param_size += (ip_ch_cnt * op_ch_cnt) * sizeof(uint16_t); - - /* Params length should be multiple of 4 bytes i.e 32bit aligned*/ - param_size = (param_size + 3) & 0xFFFFFFFC; - - return param_size; -} - -/* - * msm_qti_pp_send_chmix_cfg_cmd: - * Send the custom channel mixer configuration command. - * - * @port_id: Backend port id - * @copp_idx: ADM copp index - * @session_id: id for the session requesting channel mixer - * @ip_channel_cnt: Input channel count - * @op_channel_cnt: Output channel count - * @ch_wght_coeff: Channel weight co-efficients for mixing - * @session_type: Indicates TX or RX session - * @stream_type: Indicates Audio or Listen stream type - */ -int msm_qti_pp_send_chmix_cfg_cmd(int port_id, int copp_idx, - unsigned int session_id, int ip_channel_cnt, - int op_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type) -{ - char *params_value; - int rc = 0, i, direction; - u8 *param_ptr; - int16_t *update_params_value16 = 0; - uint32_t param_size = msm_qti_pp_get_chmix_param_size(ip_channel_cnt, - op_channel_cnt); - struct param_hdr_v3 *param_hdr; - - /* constant payload data size represents module_id, param_id, - * param size, reserved field. - */ - uint32_t params_length = param_size + sizeof(*param_hdr); - - pr_debug("%s: port_id - %d, session id - %d\n", __func__, port_id, - session_id); - - params_value = kzalloc(params_length, GFP_KERNEL); - if (!params_value) - return -ENOMEM; - - param_ptr = params_value; - - param_hdr = (struct param_hdr_v3 *) param_ptr; - param_hdr->module_id = MTMX_MODULE_ID_DEFAULT_CHMIXER; - param_hdr->instance_id = INSTANCE_ID_0; - param_hdr->param_id = DEFAULT_CHMIXER_PARAM_ID_COEFF; - param_hdr->param_size = param_size; - - param_ptr += sizeof(*param_hdr); - - update_params_value16 = (int16_t *) param_ptr; - /*for alignment only*/ - *update_params_value16++ = 0; - /*index is 32-bit param in little endian*/ - *update_params_value16++ = CUSTOM_STEREO_INDEX_PARAM; - *update_params_value16++ = 0; - /*number of out ch*/ - *update_params_value16++ = op_channel_cnt; - /*number of in ch*/ - *update_params_value16++ = ip_channel_cnt; - - /* Out ch map FL/FR*/ - msm_qti_pp_arrange_mch_map(update_params_value16, op_channel_cnt); - update_params_value16 += op_channel_cnt; - - /* In ch map FL/FR*/ - msm_qti_pp_arrange_mch_map(update_params_value16, ip_channel_cnt); - update_params_value16 += ip_channel_cnt; - - /* weighting coefficients as name suggests, - * mixing will be done according to these coefficients. - */ - for (i = 0; i < ip_channel_cnt * op_channel_cnt; i++) - *update_params_value16++ = - ch_wght_coeff[i] ? Q14_GAIN_UNITY : 0; - if (params_length) { - direction = (session_type == SESSION_TYPE_RX) ? - ADM_MATRIX_ID_AUDIO_RX : ADM_MATRIX_ID_AUDIO_TX; - rc = adm_set_custom_chmix_cfg(port_id, - copp_idx, - session_id, - params_value, - params_length, - direction, - stream_type); - if (rc) { - pr_err("%s: send params failed rc=%d\n", __func__, rc); - kfree(params_value); - return -EINVAL; - } - } - kfree(params_value); - return 0; -} -EXPORT_SYMBOL(msm_qti_pp_send_chmix_cfg_cmd); -#endif /* CONFIG_QTI_PP */ - -/* RMS */ -static int msm_qti_pp_get_rms_value_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int be_idx = 0, copp_idx; - char *param_value; - int *update_param_value; - uint32_t param_size = (RMS_PAYLOAD_LEN + 1) * sizeof(uint32_t); - struct msm_pcm_routing_bdai_data msm_bedai; - struct param_hdr_v3 param_hdr; - - param_value = kzalloc(param_size, GFP_KERNEL); - if (!param_value) - return -ENOMEM; - msm_pcm_routing_acquire_lock(); - for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) { - msm_pcm_routing_get_bedai_info(be_idx, &msm_bedai); - if (msm_bedai.port_id == SLIMBUS_0_TX) - break; - } - if ((be_idx >= MSM_BACKEND_DAI_MAX) || !msm_bedai.active) { - pr_err("%s, back not active to query rms be_idx:%d\n", - __func__, be_idx); - rc = -EINVAL; - goto get_rms_value_err; - } - copp_idx = adm_get_default_copp_idx(SLIMBUS_0_TX); - if ((copp_idx < 0) || (copp_idx > MAX_COPPS_PER_PORT)) { - pr_err("%s, no active copp to query rms copp_idx:%d\n", - __func__, copp_idx); - rc = -EINVAL; - goto get_rms_value_err; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = RMS_MODULEID_APPI_PASSTHRU; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = RMS_PARAM_FIRST_SAMPLE; - param_hdr.param_size = param_size; - rc = adm_get_pp_params(SLIMBUS_0_TX, copp_idx, ADM_CLIENT_ID_DEFAULT, - NULL, ¶m_hdr, param_value); - if (rc) { - pr_err("%s: get parameters failed rc=%d\n", __func__, rc); - rc = -EINVAL; - goto get_rms_value_err; - } - update_param_value = (int *)param_value; - ucontrol->value.integer.value[0] = update_param_value[0]; - - pr_debug("%s: FROM DSP value[0] 0x%x\n", - __func__, update_param_value[0]); -get_rms_value_err: - msm_pcm_routing_release_lock(); - kfree(param_value); - return rc; -} - -static int msm_qti_pp_put_rms_value_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* not used */ - return 0; -} - -/* VOLUME */ -static int msm_route_fm_vol_control; -static int msm_afe_lb_vol_ctrl; -static int msm_afe_sec_mi2s_lb_vol_ctrl; -static int msm_afe_tert_mi2s_lb_vol_ctrl; -static int msm_afe_quat_mi2s_lb_vol_ctrl; -static int msm_afe_slimbus_7_lb_vol_ctrl; -static int msm_afe_slimbus_8_lb_vol_ctrl; -static int msm_asm_bit_width; -static const DECLARE_TLV_DB_LINEAR(fm_rx_vol_gain, 0, INT_RX_VOL_MAX_STEPS); -static const DECLARE_TLV_DB_LINEAR(afe_lb_vol_gain, 0, INT_RX_VOL_MAX_STEPS); - -static int msm_qti_pp_get_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_fm_vol_control; - return 0; -} - -static int msm_qti_pp_set_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(INT_FM_TX, ucontrol->value.integer.value[0]); - - msm_route_fm_vol_control = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_asm_bit_width_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s get ASM bitwidth = %d\n", - __func__, msm_asm_bit_width); - - ucontrol->value.integer.value[0] = msm_asm_bit_width; - - return 0; -} - -static int msm_asm_bit_width_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 16: - msm_asm_bit_width = 16; - break; - case 24: - msm_asm_bit_width = 24; - break; - case 32: - msm_asm_bit_width = 32; - break; - default: - msm_asm_bit_width = 0; - break; - } - - return 0; -} - -static int msm_qti_pp_get_pri_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_pri_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_PRIMARY_MI2S_TX, - ucontrol->value.integer.value[0]); - - msm_afe_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_sec_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_sec_mi2s_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_sec_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_SECONDARY_MI2S_TX, - ucontrol->value.integer.value[0]); - msm_afe_sec_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_tert_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_tert_mi2s_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_tert_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_TERTIARY_MI2S_TX, - ucontrol->value.integer.value[0]); - msm_afe_tert_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0]; - return 0; -} - -static int msm_qti_pp_get_slimbus_7_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_slimbus_7_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_slimbus_7_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = afe_loopback_gain(SLIMBUS_7_TX, - ucontrol->value.integer.value[0]); - - if (ret) - pr_err("%s: failed to set LB vol for SLIMBUS_7_TX, err %d\n", - __func__, ret); - else - msm_afe_slimbus_7_lb_vol_ctrl = - ucontrol->value.integer.value[0]; - - return ret; -} - -static int msm_qti_pp_get_slimbus_8_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_slimbus_8_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_slimbus_8_lb_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - - ret = afe_loopback_gain(SLIMBUS_8_TX, - ucontrol->value.integer.value[0]); - - if (ret) - pr_err("%s: failed to set LB vol for SLIMBUS_8_TX", __func__); - else - msm_afe_slimbus_8_lb_vol_ctrl = - ucontrol->value.integer.value[0]; - - return ret; -} - -static int msm_qti_pp_get_icc_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_icc_vol_control; - return 0; -} - -static int msm_qti_pp_set_icc_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - adm_set_mic_gain(AFE_PORT_ID_QUATERNARY_TDM_TX, - adm_get_default_copp_idx(AFE_PORT_ID_QUATERNARY_TDM_TX), - ucontrol->value.integer.value[0]); - msm_route_icc_vol_control = ucontrol->value.integer.value[0]; - return 0; -} - -static int msm_qti_pp_get_quat_mi2s_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_afe_quat_mi2s_lb_vol_ctrl; - return 0; -} - -static int msm_qti_pp_set_quat_mi2s_fm_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(AFE_PORT_ID_QUATERNARY_MI2S_TX, - ucontrol->value.integer.value[0]); - - msm_afe_quat_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_hfp_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_hfp_vol_control; - return 0; -} - -static int msm_qti_pp_set_hfp_vol_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - afe_loopback_gain(INT_BT_SCO_TX, ucontrol->value.integer.value[0]); - - msm_route_hfp_vol_control = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_pri_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_pri_auxpcm_lb_vol_ctrl; - pr_debug("%s: Volume = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_qti_pp_set_pri_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - afe_loopback_gain(mc->reg, ucontrol->value.integer.value[0]); - - msm_route_pri_auxpcm_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_sec_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_route_sec_auxpcm_lb_vol_ctrl; - pr_debug("%s: Volume = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_qti_pp_set_sec_auxpcm_lb_vol_mixer( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - afe_loopback_gain(mc->reg, ucontrol->value.integer.value[0]); - - msm_route_sec_auxpcm_lb_vol_ctrl = ucontrol->value.integer.value[0]; - - return 0; -} - -static int msm_qti_pp_get_channel_map_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; - int i; - - adm_get_multi_ch_map(channel_map, ADM_PATH_PLAYBACK); - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - ucontrol->value.integer.value[i] = - (unsigned int) channel_map[i]; - return 0; -} - -static int msm_qti_pp_put_channel_map_mixer(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; - int i; - - for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - channel_map[i] = (char)(ucontrol->value.integer.value[i]); - adm_set_multi_ch_map(channel_map, ADM_PATH_PLAYBACK); - - return 0; -} - -/* Audio Sphere functions */ - -static void msm_qti_pp_asphere_init_state(void) -{ - int i; - - if (asphere_state.initialized) - return; - asphere_state.initialized = true; - for (i = 0; i < AFE_MAX_PORTS; i++) { - asphere_state.port_id[i] = -1; - asphere_state.copp_idx[i] = -1; - } - asphere_state.enabled = 0; - asphere_state.strength = 0; - asphere_state.mode = 0; - asphere_state.version = 0; - asphere_state.enabled_prev = 0; - asphere_state.strength_prev = 0; -} - -static int msm_qti_pp_asphere_send_params(int port_id, int copp_idx, bool force) -{ - u8 *packed_params = NULL; - u32 packed_params_size = 0; - u32 param_size = 0; - struct param_hdr_v3 param_hdr; - bool set_enable = force || - (asphere_state.enabled != asphere_state.enabled_prev); - bool set_strength = asphere_state.enabled == 1 && (set_enable || - (asphere_state.strength != asphere_state.strength_prev)); - int param_count = 0; - int ret = 0; - - if (set_enable) - param_count++; - if (set_strength) - param_count++; - - if (param_count == 0) { - pr_debug("%s: Nothing to send, exiting\n", __func__); - return 0; - } - - pr_debug("%s: port_id %d, copp_id %d, forced %d, param_count %d\n", - __func__, port_id, copp_idx, force, param_count); - pr_debug("%s: enable prev:%u cur:%u, strength prev:%u cur:%u\n", - __func__, asphere_state.enabled_prev, asphere_state.enabled, - asphere_state.strength_prev, asphere_state.strength); - - packed_params_size = - param_count * (sizeof(struct param_hdr_v3) + sizeof(uint32_t)); - packed_params = kzalloc(packed_params_size, GFP_KERNEL); - if (!packed_params) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - packed_params_size = 0; - param_hdr.module_id = AUDPROC_MODULE_ID_AUDIOSPHERE; - param_hdr.instance_id = INSTANCE_ID_0; - if (set_strength) { - /* add strength command */ - param_hdr.param_id = AUDPROC_PARAM_ID_AUDIOSPHERE_STRENGTH; - param_hdr.param_size = sizeof(asphere_state.strength); - ret = q6common_pack_pp_params(packed_params + - packed_params_size, - ¶m_hdr, - (u8 *) &asphere_state.strength, - ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params for audio sphere" - " strength, error %d\n", __func__, ret); - goto done; - } - packed_params_size += param_size; - } - if (set_enable) { - /* add enable command */ - param_hdr.param_id = AUDPROC_PARAM_ID_AUDIOSPHERE_ENABLE; - param_hdr.param_size = sizeof(asphere_state.enabled); - q6common_pack_pp_params(packed_params + packed_params_size, - ¶m_hdr, - (u8 *) &asphere_state.enabled, - ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params for audio sphere" - " enable, error %d\n", __func__, ret); - goto done; - } - packed_params_size += param_size; - } - - pr_debug("%s: packed data size: %d\n", __func__, packed_params_size); - ret = adm_set_pp_params(port_id, copp_idx, NULL, packed_params, - packed_params_size); - if (ret) - pr_err("%s: set param failed with err=%d\n", __func__, ret); - -done: - kfree(packed_params); - return 0; -} - -#if defined(CONFIG_QTI_PP) && defined(CONFIG_QTI_PP_AUDIOSPHERE) -int msm_qti_pp_asphere_init(int port_id, int copp_idx) -{ - int index = adm_validate_and_get_port_index(port_id); - - pr_debug("%s, port_id %d, copp_id %d\n", __func__, port_id, copp_idx); - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index, - port_id); - return -EINVAL; - } - msm_qti_pp_asphere_init_state(); - - asphere_state.port_id[index] = port_id; - asphere_state.copp_idx[index] = copp_idx; - - if (asphere_state.enabled) - msm_qti_pp_asphere_send_params(port_id, copp_idx, true); - - return 0; -} - -void msm_qti_pp_asphere_deinit(int port_id) -{ - int index = adm_validate_and_get_port_index(port_id); - - pr_debug("%s, port_id %d\n", __func__, port_id); - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index, - port_id); - return; - } - - if (asphere_state.port_id[index] == port_id) { - asphere_state.port_id[index] = -1; - asphere_state.copp_idx[index] = -1; - } -} -#endif - -static int msm_qti_pp_asphere_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - if (!asphere_state.initialized) - return -EAGAIN; - ucontrol->value.integer.value[0] = asphere_state.enabled; - ucontrol->value.integer.value[1] = asphere_state.strength; - pr_debug("%s, enable %u, strength %u\n", __func__, - asphere_state.enabled, asphere_state.strength); - return 0; -} - -static int msm_qti_pp_asphere_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t enable = ucontrol->value.integer.value[0]; - int32_t strength = ucontrol->value.integer.value[1]; - int i; - - pr_debug("%s, enable %u, strength %u\n", __func__, enable, strength); - - msm_qti_pp_asphere_init_state(); - - if (enable == 0 || enable == 1) { - asphere_state.enabled_prev = asphere_state.enabled; - asphere_state.enabled = enable; - } - - if (strength >= 0 && strength <= 1000) { - asphere_state.strength_prev = asphere_state.strength; - asphere_state.strength = strength; - } - - if (asphere_state.strength != asphere_state.strength_prev || - asphere_state.enabled != asphere_state.enabled_prev) { - for (i = 0; i < AFE_MAX_PORTS; i++) { - if (asphere_state.port_id[i] >= 0) - msm_qti_pp_asphere_send_params( - asphere_state.port_id[i], - asphere_state.copp_idx[i], - false); - } - } - return 0; -} - -int msm_adsp_init_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_kcontrol *kctl; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -EINVAL; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, - rtd->pcm->device); - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - kfree(mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl.\n", __func__); - ret = -EINVAL; - goto done; - } - - if (kctl->private_data != NULL) { - pr_err("%s: kctl_prtd is not NULL at initialization.\n", - __func__); - return -EINVAL; - } - - kctl_prtd = kzalloc(sizeof(struct dsp_stream_callback_prtd), - GFP_KERNEL); - if (!kctl_prtd) { - ret = -ENOMEM; - goto done; - } - - spin_lock_init(&kctl_prtd->prtd_spin_lock); - INIT_LIST_HEAD(&kctl_prtd->event_queue); - kctl_prtd->event_count = 0; - kctl->private_data = kctl_prtd; - -done: - return ret; -} - -int msm_adsp_clean_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_kcontrol *kctl; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct dsp_stream_callback_list *node, *n; - unsigned long spin_flags; - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -EINVAL; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, - rtd->pcm->device); - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - kfree(mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl.\n", __func__); - ret = -EINVAL; - goto done; - } - - kctl_prtd = (struct dsp_stream_callback_prtd *) - kctl->private_data; - if (kctl_prtd != NULL) { - spin_lock_irqsave(&kctl_prtd->prtd_spin_lock, spin_flags); - /* clean the queue */ - list_for_each_entry_safe(node, n, - &kctl_prtd->event_queue, list) { - list_del(&node->list); - kctl_prtd->event_count--; - pr_debug("%s: %d remaining events after del.\n", - __func__, kctl_prtd->event_count); - kfree(node); - } - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - } - - kfree(kctl_prtd); - kctl->private_data = NULL; - -done: - return ret; -} - -int msm_adsp_inform_mixer_ctl(struct snd_soc_pcm_runtime *rtd, - uint32_t *payload) -{ - /* adsp pp event notifier */ - struct snd_kcontrol *kctl; - struct snd_ctl_elem_value control; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct dsp_stream_callback_list *new_event; - struct dsp_stream_callback_list *oldest_event; - unsigned long spin_flags; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - struct msm_adsp_event_data *event_data = NULL; - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - struct snd_ctl_elem_info kctl_info; - - if (!rtd || !payload) { - pr_err("%s: %s is NULL\n", __func__, - (!rtd) ? "rtd" : "payload"); - ret = -EINVAL; - goto done; - } - - if (rtd->card->snd_card == NULL) { - pr_err("%s: snd_card is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_ATOMIC); - if (!mixer_str) { - ret = -EINVAL; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, - rtd->pcm->device); - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - kfree(mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl.\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)payload; - if (event_data->payload_len < sizeof(struct msm_adsp_event_data)) { - pr_err("%s: event_data size of %x is less than expected.\n", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - kctl->info(kctl, &kctl_info); - - if (event_data->payload_len > - kctl_info.count - sizeof(struct msm_adsp_event_data)) { - pr_err("%s: payload length exceeds limit of %u bytes.\n", - __func__, kctl_info.count); - ret = -EINVAL; - goto done; - } - - kctl_prtd = (struct dsp_stream_callback_prtd *) - kctl->private_data; - if (kctl_prtd == NULL) { - /* queue is not initialized */ - ret = -EINVAL; - pr_err("%s: event queue is not initialized.\n", __func__); - goto done; - } - - new_event = kzalloc(sizeof(struct dsp_stream_callback_list) - + event_data->payload_len, - GFP_ATOMIC); - if (new_event == NULL) { - ret = -ENOMEM; - goto done; - } - memcpy((void *)&new_event->event, (void *)payload, - event_data->payload_len - + sizeof(struct msm_adsp_event_data)); - - spin_lock_irqsave(&kctl_prtd->prtd_spin_lock, spin_flags); - while (kctl_prtd->event_count >= DSP_STREAM_CALLBACK_QUEUE_SIZE) { - pr_info("%s: queue of size %d is full. delete oldest one.\n", - __func__, DSP_STREAM_CALLBACK_QUEUE_SIZE); - oldest_event = list_first_entry(&kctl_prtd->event_queue, - struct dsp_stream_callback_list, list); - pr_info("%s: event deleted: type %d length %d\n", - __func__, oldest_event->event.event_type, - oldest_event->event.payload_len); - list_del(&oldest_event->list); - kctl_prtd->event_count--; - kfree(oldest_event); - } - - list_add_tail(&new_event->list, &kctl_prtd->event_queue); - kctl_prtd->event_count++; - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - - control.id = kctl->id; - snd_ctl_notify(rtd->card->snd_card, - SNDRV_CTL_EVENT_MASK_INFO, - &control.id); - -done: - return ret; -} - -int msm_adsp_stream_cmd_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = - sizeof(((struct snd_ctl_elem_value *)0)->value.bytes.data); - - return 0; -} - -int msm_adsp_stream_callback_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - uint32_t payload_size = 0; - struct dsp_stream_callback_list *oldest_event; - unsigned long spin_flags; - struct dsp_stream_callback_prtd *kctl_prtd = NULL; - int ret = 0; - - kctl_prtd = (struct dsp_stream_callback_prtd *) - kcontrol->private_data; - if (kctl_prtd == NULL) { - pr_debug("%s: ASM Stream PP event queue is not initialized.\n", - __func__); - ret = -EINVAL; - goto done; - } - - spin_lock_irqsave(&kctl_prtd->prtd_spin_lock, spin_flags); - pr_debug("%s: %d events in queue.\n", __func__, kctl_prtd->event_count); - if (list_empty(&kctl_prtd->event_queue)) { - pr_err("%s: ASM Stream PP event queue is empty.\n", __func__); - ret = -EINVAL; - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - goto done; - } - - oldest_event = list_first_entry(&kctl_prtd->event_queue, - struct dsp_stream_callback_list, list); - list_del(&oldest_event->list); - kctl_prtd->event_count--; - spin_unlock_irqrestore(&kctl_prtd->prtd_spin_lock, spin_flags); - - payload_size = oldest_event->event.payload_len; - pr_debug("%s: event fetched: type %d length %d\n", - __func__, oldest_event->event.event_type, - oldest_event->event.payload_len); - memcpy(ucontrol->value.bytes.data, &oldest_event->event, - sizeof(struct msm_adsp_event_data) + payload_size); - kfree(oldest_event); - -done: - return ret; -} - -int msm_adsp_stream_callback_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; - uinfo->count = - sizeof(((struct snd_ctl_elem_value *)0)->value.bytes.data); - - return 0; -} - -static int msm_multichannel_ec_primary_mic_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int copp_idx = 0; - int port_id = AFE_PORT_ID_QUATERNARY_TDM_TX; - - msm_multichannel_ec_primary_mic_ch = ucontrol->value.integer.value[0]; - pr_debug("%s: msm_multichannel_ec_primary_mic_ch = %u\n", - __func__, msm_multichannel_ec_primary_mic_ch); - copp_idx = adm_get_default_copp_idx(port_id); - if ((copp_idx < 0) || (copp_idx > MAX_COPPS_PER_PORT)) { - pr_err("%s : no active copp to query multichannel ec copp_idx: %u\n", - __func__, copp_idx); - return -EINVAL; - } - adm_send_set_multichannel_ec_primary_mic_ch(port_id, copp_idx, - msm_multichannel_ec_primary_mic_ch); - - return ret; -} - -static int msm_multichannel_ec_primary_mic_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_multichannel_ec_primary_mic_ch; - pr_debug("%s: msm_multichannel_ec_primary_mic_ch = %lu\n", - __func__, ucontrol->value.integer.value[0]); - return 0; -} - -static const struct snd_kcontrol_new msm_multichannel_ec_controls[] = { - SOC_SINGLE_EXT("Multichannel EC Primary Mic Ch", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, msm_multichannel_ec_primary_mic_ch_get, - msm_multichannel_ec_primary_mic_ch_put), -}; - -static char const *ffecns_effect_text[] = {"NO_EFFECT", "EC_ONLY", "NS_ONLY", "ECNS"}; - -static int msm_ffecns_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - - if (ucontrol->value.integer.value[0] < 0 || - ucontrol->value.integer.value[0] >= ARRAY_SIZE(ffecns_effect_text)) { - pr_err("%s: invalid ffecns effect value %ld\n", - __func__, ucontrol->value.integer.value[0]); - return -EINVAL; - } - - msm_ffecns_effect = ucontrol->value.integer.value[0]; - - pr_debug("%s: set %s for ffecns\n", __func__, - ffecns_effect_text[msm_ffecns_effect]); - - ret = adm_set_ffecns_effect(msm_ffecns_effect); - if (ret) - pr_err("%s: failed to set %s for ffecns\n", - __func__, ffecns_effect_text[msm_ffecns_effect]); - - return ret; -} - -static int msm_ffecns_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_ffecns_effect; - pr_debug("%s: ffecns effect = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - return 0; -} - -static SOC_ENUM_SINGLE_EXT_DECL(ffecns_effect_enum, ffecns_effect_text); - -static const struct snd_kcontrol_new ec_ffecns_controls[] = { - SOC_ENUM_EXT("FFECNS Effect", ffecns_effect_enum, - msm_ffecns_get, msm_ffecns_put), -}; - -static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_fm_vol_mixer, - msm_qti_pp_set_fm_vol_mixer, fm_rx_vol_gain), - SOC_SINGLE_EXT_TLV("Quat MI2S FM RX Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_quat_mi2s_fm_vol_mixer, - msm_qti_pp_set_quat_mi2s_fm_vol_mixer, fm_rx_vol_gain), -}; - -static const struct snd_kcontrol_new dsp_bit_width_controls[] = { - SOC_SINGLE_EXT(DSP_BIT_WIDTH_MIXER_CTL, SND_SOC_NOPM, 0, 0x20, - 0, msm_asm_bit_width_get, msm_asm_bit_width_put), -}; - -static const struct snd_kcontrol_new pri_mi2s_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("PRI MI2S LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_pri_mi2s_lb_vol_mixer, - msm_qti_pp_set_pri_mi2s_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new sec_mi2s_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SEC MI2S LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_sec_mi2s_lb_vol_mixer, - msm_qti_pp_set_sec_mi2s_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new tert_mi2s_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Tert MI2S LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_tert_mi2s_lb_vol_mixer, - msm_qti_pp_set_tert_mi2s_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new slimbus_7_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SLIMBUS_7 LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, - msm_qti_pp_get_slimbus_7_lb_vol_mixer, - msm_qti_pp_set_slimbus_7_lb_vol_mixer, - afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new slimbus_8_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SLIMBUS_8 LOOPBACK Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_slimbus_8_lb_vol_mixer, - msm_qti_pp_set_slimbus_8_lb_vol_mixer, afe_lb_vol_gain), -}; - -static const struct snd_kcontrol_new int_hfp_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Internal HFP RX Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_hfp_vol_mixer, - msm_qti_pp_set_hfp_vol_mixer, hfp_rx_vol_gain), -}; - -static const struct snd_kcontrol_new int_icc_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("Internal ICC Volume", SND_SOC_NOPM, 0, - INT_RX_VOL_GAIN, 0, msm_qti_pp_get_icc_vol_mixer, - msm_qti_pp_set_icc_vol_mixer, icc_rx_vol_gain), -}; - -static const struct snd_kcontrol_new pri_auxpcm_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("PRI AUXPCM LOOPBACK Volume", - AFE_PORT_ID_PRIMARY_PCM_TX, 0, INT_RX_VOL_GAIN, 0, - msm_qti_pp_get_pri_auxpcm_lb_vol_mixer, - msm_qti_pp_set_pri_auxpcm_lb_vol_mixer, - pri_auxpcm_lb_vol_gain), -}; - -static const struct snd_kcontrol_new sec_auxpcm_lb_vol_mixer_controls[] = { - SOC_SINGLE_EXT_TLV("SEC AUXPCM LOOPBACK Volume", - AFE_PORT_ID_SECONDARY_PCM_TX, 0, INT_RX_VOL_GAIN, 0, - msm_qti_pp_get_sec_auxpcm_lb_vol_mixer, - msm_qti_pp_set_sec_auxpcm_lb_vol_mixer, - sec_auxpcm_lb_vol_gain), -}; - -static const struct snd_kcontrol_new multi_ch_channel_map_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("Playback Device Channel Map", SND_SOC_NOPM, 0, 34, - 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, msm_qti_pp_get_channel_map_mixer, - msm_qti_pp_put_channel_map_mixer), -}; - - -static const struct snd_kcontrol_new get_rms_controls[] = { - SOC_SINGLE_EXT("Get RMS", SND_SOC_NOPM, 0, 0xFFFFFFFF, - 0, msm_qti_pp_get_rms_value_control, msm_qti_pp_put_rms_value_control), -}; - -static const struct snd_kcontrol_new eq_enable_mixer_controls[] = { - SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_qti_pp_get_eq_enable_mixer, - msm_qti_pp_put_eq_enable_mixer), - SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_qti_pp_get_eq_enable_mixer, - msm_qti_pp_put_eq_enable_mixer), - SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_qti_pp_get_eq_enable_mixer, - msm_qti_pp_put_eq_enable_mixer), -}; - -static const struct snd_kcontrol_new eq_band_mixer_controls[] = { - SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0, - msm_qti_pp_get_eq_band_count_audio_mixer, - msm_qti_pp_put_eq_band_count_audio_mixer), - SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0, - msm_qti_pp_get_eq_band_count_audio_mixer, - msm_qti_pp_put_eq_band_count_audio_mixer), - SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM, - MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0, - msm_qti_pp_get_eq_band_count_audio_mixer, - msm_qti_pp_put_eq_band_count_audio_mixer), -}; - -static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12, - MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12, - MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), - SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12, - MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5, - msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer), -}; - -static const struct snd_kcontrol_new asphere_mixer_controls[] = { - SOC_SINGLE_MULTI_EXT("MSM ASphere Set Param", SND_SOC_NOPM, 0, - 0xFFFFFFFF, 0, 2, msm_qti_pp_asphere_get, msm_qti_pp_asphere_set), -}; - -#ifdef CONFIG_QTI_PP -void msm_qti_pp_add_controls(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, int_fm_vol_mixer_controls, - ARRAY_SIZE(int_fm_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, pri_mi2s_lb_vol_mixer_controls, - ARRAY_SIZE(pri_mi2s_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, sec_mi2s_lb_vol_mixer_controls, - ARRAY_SIZE(sec_mi2s_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, tert_mi2s_lb_vol_mixer_controls, - ARRAY_SIZE(tert_mi2s_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, slimbus_7_lb_vol_mixer_controls, - ARRAY_SIZE(slimbus_7_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, slimbus_8_lb_vol_mixer_controls, - ARRAY_SIZE(slimbus_8_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, int_hfp_vol_mixer_controls, - ARRAY_SIZE(int_hfp_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, int_icc_vol_mixer_controls, - ARRAY_SIZE(int_icc_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, - pri_auxpcm_lb_vol_mixer_controls, - ARRAY_SIZE(pri_auxpcm_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, - sec_auxpcm_lb_vol_mixer_controls, - ARRAY_SIZE(sec_auxpcm_lb_vol_mixer_controls)); - - snd_soc_add_platform_controls(platform, - multi_ch_channel_map_mixer_controls, - ARRAY_SIZE(multi_ch_channel_map_mixer_controls)); - - snd_soc_add_platform_controls(platform, get_rms_controls, - ARRAY_SIZE(get_rms_controls)); - - snd_soc_add_platform_controls(platform, eq_enable_mixer_controls, - ARRAY_SIZE(eq_enable_mixer_controls)); - - snd_soc_add_platform_controls(platform, eq_band_mixer_controls, - ARRAY_SIZE(eq_band_mixer_controls)); - - snd_soc_add_platform_controls(platform, eq_coeff_mixer_controls, - ARRAY_SIZE(eq_coeff_mixer_controls)); - - snd_soc_add_platform_controls(platform, asphere_mixer_controls, - ARRAY_SIZE(asphere_mixer_controls)); - - snd_soc_add_platform_controls(platform, msm_multichannel_ec_controls, - ARRAY_SIZE(msm_multichannel_ec_controls)); - - snd_soc_add_platform_controls(platform, ec_ffecns_controls, - ARRAY_SIZE(ec_ffecns_controls)); - - snd_soc_add_platform_controls(platform, dsp_bit_width_controls, - ARRAY_SIZE(dsp_bit_width_controls)); -} -#endif /* CONFIG_QTI_PP */ diff --git a/techpack/audio/asoc/msm-qti-pp-config.h b/techpack/audio/asoc/msm-qti-pp-config.h deleted file mode 100644 index edbd603487c8..000000000000 --- a/techpack/audio/asoc/msm-qti-pp-config.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2012-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_QTI_PP_H_ -#define _MSM_QTI_PP_H_ - -#include -#define DSP_BIT_WIDTH_MIXER_CTL "ASM Bit Width" -#ifdef CONFIG_QTI_PP -int msm_adsp_inform_mixer_ctl(struct snd_soc_pcm_runtime *rtd, - uint32_t *payload); -int msm_adsp_init_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd); -int msm_adsp_clean_mixer_ctl_pp_event_queue(struct snd_soc_pcm_runtime *rtd); -int msm_adsp_stream_cmd_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo); -int msm_adsp_stream_callback_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -int msm_adsp_stream_callback_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo); -void msm_qti_pp_send_eq_values(int fedai_id); -int msm_qti_pp_send_stereo_to_custom_stereo_cmd(int port_id, int copp_idx, - unsigned int session_id, - uint16_t op_FL_ip_FL_weight, - uint16_t op_FL_ip_FR_weight, - uint16_t op_FR_ip_FL_weight, - uint16_t op_FR_ip_FR_weight); -void msm_qti_pp_add_controls(struct snd_soc_platform *platform); -int msm_qti_pp_send_chmix_cfg_cmd(int port_id, int copp_idx, - unsigned int session_id, int ip_channel_count, - int out_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type); -#else /* CONFIG_QTI_PP */ -static inline int msm_adsp_inform_mixer_ctl(struct snd_soc_pcm_runtime *rtd, - uint32_t *payload) -{ - return 0; -} - -static inline int msm_adsp_init_mixer_ctl_pp_event_queue( - struct snd_soc_pcm_runtime *rtd) -{ - return 0; -} - -static inline int msm_adsp_clean_mixer_ctl_pp_event_queue( - struct snd_soc_pcm_runtime *rtd) -{ - return 0; -} - -static inline int msm_adsp_stream_cmd_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - return 0; -} - -static inline int msm_adsp_stream_callback_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static inline int msm_adsp_stream_callback_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - return 0; -} - -int msm_qti_pp_send_chmix_cfg_cmd(int port_id, int copp_idx, - unsigned int session_id, int ip_channel_count, - int out_channel_cnt, int *ch_wght_coeff, - int session_type, int stream_type) -{ - return 0; -} -#define msm_qti_pp_send_eq_values(fedai_id) do {} while (0) -#define msm_qti_pp_send_stereo_to_custom_stereo_cmd(port_id, copp_idx, \ - session_id, op_FL_ip_FL_weight, op_FL_ip_FR_weight, \ - op_FR_ip_FL_weight, op_FR_ip_FR_weight) (0) -#define msm_qti_pp_add_controls(platform) do {} while (0) -#endif /* CONFIG_QTI_PP */ - - -#if defined(CONFIG_QTI_PP) && defined(CONFIG_QTI_PP_AUDIOSPHERE) -int msm_qti_pp_asphere_init(int port_id, int copp_idx); -void msm_qti_pp_asphere_deinit(int port_id); -#else -#define msm_qti_pp_asphere_init(port_id, copp_idx) (0) -#define msm_qti_pp_asphere_deinit(port_id) do {} while (0) -#endif - -#endif /* _MSM_QTI_PP_H_ */ diff --git a/techpack/audio/asoc/msm-slim-dma.h b/techpack/audio/asoc/msm-slim-dma.h deleted file mode 100644 index daf394bffaff..000000000000 --- a/techpack/audio/asoc/msm-slim-dma.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MSM_SLIMBUS_DMA_H -#define _MSM_SLIMBUS_DMA_H - -#include - -/* - * struct msm_slim_dma_data - DMA data for slimbus data transfer - * - * @sdev: Handle to the slim_device instance associated with the - * data transfer. - * @ph: Port handle for the slimbus ports. - * @dai_channel_ctl: callback function into the CPU dai driver - * to setup the data path. - * - * This structure is used to share the slimbus port handles and - * other data path setup related handles with other drivers. - */ -struct msm_slim_dma_data { - - /* Handle to slimbus device */ - struct slim_device *sdev; - - /* Port Handle */ - u32 ph; - - /* Callback for data channel control */ - int (*dai_channel_ctl)(struct msm_slim_dma_data *dma_data, - struct snd_soc_dai *dai, bool enable); -}; - -#endif diff --git a/techpack/audio/asoc/msm-transcode-loopback-q6-v2.c b/techpack/audio/asoc/msm-transcode-loopback-q6-v2.c deleted file mode 100644 index 7b1d641a9eba..000000000000 --- a/techpack/audio/asoc/msm-transcode-loopback-q6-v2.c +++ /dev/null @@ -1,1555 +0,0 @@ -/* Copyright (c) 2017-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-routing-v2.h" -#include "msm-qti-pp-config.h" - -#define LOOPBACK_SESSION_MAX_NUM_STREAMS 2 -/* Max volume corresponding to 24dB */ -#define TRANSCODE_LR_VOL_MAX_DB 0xFFFF - -#define APP_TYPE_CONFIG_IDX_APP_TYPE 0 -#define APP_TYPE_CONFIG_IDX_ACDB_ID 1 -#define APP_TYPE_CONFIG_IDX_SAMPLE_RATE 2 -#define APP_TYPE_CONFIG_IDX_BE_ID 3 - -static DEFINE_MUTEX(transcode_loopback_session_lock); - -struct msm_transcode_audio_effects { - struct bass_boost_params bass_boost; - struct pbe_params pbe; - struct virtualizer_params virtualizer; - struct reverb_params reverb; - struct eq_params equalizer; - struct soft_volume_params volume; -}; - -struct trans_loopback_pdata { - struct snd_compr_stream *cstream[MSM_FRONTEND_DAI_MAX]; - uint32_t master_gain; - int perf_mode; - struct msm_transcode_audio_effects *audio_effects[MSM_FRONTEND_DAI_MAX]; -}; - -struct loopback_stream { - struct snd_compr_stream *cstream; - uint32_t codec_format; - bool start; -}; - -enum loopback_session_state { - /* One or both streams not opened */ - LOOPBACK_SESSION_CLOSE = 0, - /* Loopback streams opened */ - LOOPBACK_SESSION_READY, - /* Loopback streams opened and formats configured */ - LOOPBACK_SESSION_START, - /* Trigger issued on either of streams when in START state */ - LOOPBACK_SESSION_RUN -}; - -struct msm_transcode_loopback { - struct loopback_stream source; - struct loopback_stream sink; - - struct snd_compr_caps source_compr_cap; - struct snd_compr_caps sink_compr_cap; - - uint32_t instance; - uint32_t num_streams; - int session_state; - - struct mutex lock; - - int session_id; - struct audio_client *audio_client; -}; - -/* Transcode loopback global info struct */ -static struct msm_transcode_loopback transcode_info; - -static void loopback_event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct msm_transcode_loopback *trans = - (struct msm_transcode_loopback *)priv; - struct snd_soc_pcm_runtime *rtd; - struct snd_compr_stream *cstream; - struct audio_client *ac; - int stream_id; - int ret; - - if (!trans || !payload) { - pr_err("%s: rtd or payload is NULL\n", __func__); - return; - } - - cstream = trans->sink.cstream; - ac = trans->audio_client; - - /* - * Token for rest of the compressed commands use to set - * session id, stream id, dir etc. - */ - stream_id = q6asm_get_stream_id_from_token(token); - - switch (opcode) { - case ASM_STREAM_CMD_ENCDEC_EVENTS: - case ASM_IEC_61937_MEDIA_FMT_EVENT: - pr_debug("%s: Handling stream event : 0X%x\n", - __func__, opcode); - rtd = cstream->private_data; - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - return; - } - - ret = msm_adsp_inform_mixer_ctl(rtd, payload); - if (ret) { - pr_err("%s: failed to inform mixer ctrl. err = %d\n", - __func__, ret); - return; - } - break; - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - pr_debug("%s: ASM_SESSION_CMD_RUN_V2:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - break; - case ASM_STREAM_CMD_CLOSE: - pr_debug("%s: ASM_DATA_CMD_CLOSE:", __func__); - pr_debug("token 0x%x, stream id %d\n", token, - stream_id); - break; - default: - break; - } - break; - } - default: - pr_debug("%s: Not Supported Event opcode[0x%x]\n", - __func__, opcode); - break; - } -} - -static void populate_codec_list(struct msm_transcode_loopback *trans, - struct snd_compr_stream *cstream) -{ - struct snd_compr_caps compr_cap; - - pr_debug("%s\n", __func__); - - memset(&compr_cap, 0, sizeof(struct snd_compr_caps)); - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - compr_cap.direction = SND_COMPRESS_CAPTURE; - compr_cap.num_codecs = 3; - compr_cap.codecs[0] = SND_AUDIOCODEC_PCM; - compr_cap.codecs[1] = SND_AUDIOCODEC_AC3; - compr_cap.codecs[2] = SND_AUDIOCODEC_EAC3; - memcpy(&trans->source_compr_cap, &compr_cap, - sizeof(struct snd_compr_caps)); - } - - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - compr_cap.direction = SND_COMPRESS_PLAYBACK; - compr_cap.num_codecs = 1; - compr_cap.codecs[0] = SND_AUDIOCODEC_PCM; - memcpy(&trans->sink_compr_cap, &compr_cap, - sizeof(struct snd_compr_caps)); - } -} - -static int msm_transcode_loopback_open(struct snd_compr_stream *cstream) -{ - int ret = 0; - struct snd_compr_runtime *runtime; - struct snd_soc_pcm_runtime *rtd; - struct msm_transcode_loopback *trans = &transcode_info; - struct trans_loopback_pdata *pdata; - - if (cstream == NULL) { - pr_err("%s: Invalid substream\n", __func__); - return -EINVAL; - } - runtime = cstream->runtime; - rtd = snd_pcm_substream_chip(cstream); - pdata = snd_soc_platform_get_drvdata(rtd->platform); - pdata->cstream[rtd->dai_link->id] = cstream; - pdata->audio_effects[rtd->dai_link->id] = - kzalloc(sizeof(struct msm_transcode_audio_effects), GFP_KERNEL); - - if (pdata->audio_effects[rtd->dai_link->id] == NULL) { - ret = -ENOMEM; - goto effect_error; - } - - mutex_lock(&trans->lock); - if (trans->num_streams > LOOPBACK_SESSION_MAX_NUM_STREAMS) { - pr_err("msm_transcode_open failed..invalid stream\n"); - ret = -EINVAL; - goto exit; - } - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - if (trans->source.cstream == NULL) { - trans->source.cstream = cstream; - trans->num_streams++; - } else { - pr_err("%s: capture stream already opened\n", - __func__); - ret = -EINVAL; - goto exit; - } - } else if (cstream->direction == SND_COMPRESS_PLAYBACK) { - if (trans->sink.cstream == NULL) { - trans->sink.cstream = cstream; - trans->num_streams++; - } else { - pr_debug("%s: playback stream already opened\n", - __func__); - ret = -EINVAL; - goto exit; - } - msm_adsp_init_mixer_ctl_pp_event_queue(rtd); - } - - pr_debug("%s: num stream%d, stream name %s\n", __func__, - trans->num_streams, cstream->name); - - populate_codec_list(trans, cstream); - - if (trans->num_streams == LOOPBACK_SESSION_MAX_NUM_STREAMS) { - pr_debug("%s: Moving loopback session to READY state %d\n", - __func__, trans->session_state); - trans->session_state = LOOPBACK_SESSION_READY; - } - - runtime->private_data = trans; - -exit: - mutex_unlock(&trans->lock); - if ((pdata->audio_effects[rtd->dai_link->id] != NULL) && (ret < 0)) { - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - } -effect_error: - return ret; -} - -static void stop_transcoding(struct msm_transcode_loopback *trans) -{ - struct snd_soc_pcm_runtime *soc_pcm_rx; - struct snd_soc_pcm_runtime *soc_pcm_tx; - - if (trans->audio_client != NULL) { - q6asm_cmd(trans->audio_client, CMD_CLOSE); - - if (trans->sink.cstream != NULL) { - soc_pcm_rx = trans->sink.cstream->private_data; - msm_pcm_routing_dereg_phy_stream( - soc_pcm_rx->dai_link->id, - SND_COMPRESS_PLAYBACK); - } - if (trans->source.cstream != NULL) { - soc_pcm_tx = trans->source.cstream->private_data; - msm_pcm_routing_dereg_phy_stream( - soc_pcm_tx->dai_link->id, - SND_COMPRESS_CAPTURE); - } - q6asm_audio_client_free(trans->audio_client); - trans->audio_client = NULL; - } -} - -static int msm_transcode_loopback_free(struct snd_compr_stream *cstream) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_transcode_loopback *trans = runtime->private_data; - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(cstream); - struct trans_loopback_pdata *pdata; - int ret = 0; - - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - mutex_lock(&trans->lock); - - if (pdata->audio_effects[rtd->dai_link->id] != NULL) { - kfree(pdata->audio_effects[rtd->dai_link->id]); - pdata->audio_effects[rtd->dai_link->id] = NULL; - } - - pr_debug("%s: Transcode loopback end:%d, streams %d\n", __func__, - cstream->direction, trans->num_streams); - trans->num_streams--; - stop_transcoding(trans); - - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - memset(&trans->sink, 0, sizeof(struct loopback_stream)); - msm_adsp_clean_mixer_ctl_pp_event_queue(rtd); - } else if (cstream->direction == SND_COMPRESS_CAPTURE) { - memset(&trans->source, 0, sizeof(struct loopback_stream)); - } - - trans->session_state = LOOPBACK_SESSION_CLOSE; - mutex_unlock(&trans->lock); - return ret; -} - -static int msm_transcode_loopback_trigger(struct snd_compr_stream *cstream, - int cmd) -{ - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_transcode_loopback *trans = runtime->private_data; - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - - if (trans->session_state == LOOPBACK_SESSION_START) { - pr_debug("%s: Issue Loopback session %d RUN\n", - __func__, trans->instance); - q6asm_run_nowait(trans->audio_client, 0, 0, 0); - trans->session_state = LOOPBACK_SESSION_RUN; - } - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("%s: Issue Loopback session %d STOP\n", __func__, - trans->instance); - if (trans->session_state == LOOPBACK_SESSION_RUN) - q6asm_cmd_nowait(trans->audio_client, CMD_PAUSE); - trans->session_state = LOOPBACK_SESSION_START; - break; - - default: - break; - } - return 0; -} - -static int msm_transcode_set_render_window(struct audio_client *ac, - uint32_t ws_lsw, uint32_t ws_msw, - uint32_t we_lsw, uint32_t we_msw) -{ - int ret = -EINVAL; - struct asm_session_mtmx_strtr_param_window_v2_t asm_mtmx_strtr_window; - uint32_t param_id; - - pr_debug("%s, ws_lsw 0x%x ws_msw 0x%x we_lsw 0x%x we_msw 0x%x\n", - __func__, ws_lsw, ws_msw, we_lsw, we_msw); - - memset(&asm_mtmx_strtr_window, 0, - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t)); - asm_mtmx_strtr_window.window_lsw = ws_lsw; - asm_mtmx_strtr_window.window_msw = ws_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, param_id); - if (ret) { - pr_err("%s, start window can't be set error %d\n", __func__, ret); - goto exit; - } - - asm_mtmx_strtr_window.window_lsw = we_lsw; - asm_mtmx_strtr_window.window_msw = we_msw; - param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2; - ret = q6asm_send_mtmx_strtr_window(ac, &asm_mtmx_strtr_window, param_id); - if (ret) - pr_err("%s, end window can't be set error %d\n", __func__, ret); - -exit: - return ret; -} - -static int msm_transcode_loopback_set_params(struct snd_compr_stream *cstream, - struct snd_compr_params *codec_param) -{ - - struct snd_compr_runtime *runtime = cstream->runtime; - struct msm_transcode_loopback *trans = runtime->private_data; - struct snd_soc_pcm_runtime *soc_pcm_rx; - struct snd_soc_pcm_runtime *soc_pcm_tx; - struct snd_soc_pcm_runtime *rtd; - struct trans_loopback_pdata *pdata; - uint32_t bit_width = 16; - int ret = 0; - enum apr_subsys_state q6_state; - - if (trans == NULL) { - pr_err("%s: Invalid param\n", __func__); - return -EINVAL; - } - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - pr_debug("%s: adsp is down\n", __func__); - return -ENETRESET; - } - mutex_lock(&trans->lock); - - rtd = snd_pcm_substream_chip(cstream); - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - if (cstream->direction == SND_COMPRESS_PLAYBACK) { - if (codec_param->codec.id == SND_AUDIOCODEC_PCM) { - trans->sink.codec_format = - FORMAT_LINEAR_PCM; - switch (codec_param->codec.format) { - case SNDRV_PCM_FORMAT_S32_LE: - bit_width = 32; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - bit_width = 24; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_width = 16; - break; - } - } else { - pr_debug("%s: unknown sink codec\n", __func__); - ret = -EINVAL; - goto exit; - } - trans->sink.start = true; - } - - if (cstream->direction == SND_COMPRESS_CAPTURE) { - switch (codec_param->codec.id) { - case SND_AUDIOCODEC_PCM: - pr_debug("Source SND_AUDIOCODEC_PCM\n"); - trans->source.codec_format = - FORMAT_LINEAR_PCM; - break; - case SND_AUDIOCODEC_AC3: - pr_debug("Source SND_AUDIOCODEC_AC3\n"); - trans->source.codec_format = - FORMAT_AC3; - break; - case SND_AUDIOCODEC_EAC3: - pr_debug("Source SND_AUDIOCODEC_EAC3\n"); - trans->source.codec_format = - FORMAT_EAC3; - break; - default: - pr_debug("%s: unknown source codec\n", __func__); - ret = -EINVAL; - goto exit; - } - trans->source.start = true; - } - - pr_debug("%s: trans->source.start %d trans->sink.start %d trans->source.cstream %pK trans->sink.cstream %pK trans->session_state %d\n", - __func__, trans->source.start, trans->sink.start, - trans->source.cstream, trans->sink.cstream, - trans->session_state); - - if ((trans->session_state == LOOPBACK_SESSION_READY) && - trans->source.start && trans->sink.start) { - pr_debug("%s: Moving loopback session to start state\n", - __func__); - trans->session_state = LOOPBACK_SESSION_START; - } - - if (trans->session_state == LOOPBACK_SESSION_START) { - if (trans->audio_client != NULL) { - pr_debug("%s: ASM client already opened, closing\n", - __func__); - stop_transcoding(trans); - } - - trans->audio_client = q6asm_audio_client_alloc( - (app_cb)loopback_event_handler, trans); - if (!trans->audio_client) { - pr_err("%s: Could not allocate memory\n", __func__); - ret = -EINVAL; - goto exit; - } - pr_debug("%s: ASM client allocated, callback %pK\n", __func__, - loopback_event_handler); - trans->session_id = trans->audio_client->session; - trans->audio_client->perf_mode = pdata->perf_mode; - ret = q6asm_open_transcode_loopback(trans->audio_client, - bit_width, - trans->source.codec_format, - trans->sink.codec_format); - if (ret < 0) { - pr_err("%s: Session transcode loopback open failed\n", - __func__); - q6asm_audio_client_free(trans->audio_client); - trans->audio_client = NULL; - goto exit; - } - - pr_debug("%s: Starting ADM open for loopback\n", __func__); - soc_pcm_rx = trans->sink.cstream->private_data; - soc_pcm_tx = trans->source.cstream->private_data; - if (trans->source.codec_format != FORMAT_LINEAR_PCM) - msm_pcm_routing_reg_phy_compr_stream( - soc_pcm_tx->dai_link->id, - LEGACY_PCM_MODE, - trans->session_id, - SNDRV_PCM_STREAM_CAPTURE, - COMPRESSED_PASSTHROUGH_GEN); - else - msm_pcm_routing_reg_phy_stream( - soc_pcm_tx->dai_link->id, - trans->audio_client->perf_mode, - trans->session_id, - SNDRV_PCM_STREAM_CAPTURE); - /* Opening Rx ADM in LOW_LATENCY mode by default */ - msm_pcm_routing_reg_phy_stream( - soc_pcm_rx->dai_link->id, - trans->audio_client->perf_mode, - trans->session_id, - SNDRV_PCM_STREAM_PLAYBACK); - pr_debug("%s: Successfully opened ADM sessions\n", __func__); - } -exit: - mutex_unlock(&trans->lock); - return ret; -} - -static int msm_transcode_loopback_get_caps(struct snd_compr_stream *cstream, - struct snd_compr_caps *arg) -{ - struct snd_compr_runtime *runtime; - struct msm_transcode_loopback *trans; - - if (!arg || !cstream) { - pr_err("%s: Invalid arguments\n", __func__); - return -EINVAL; - } - - runtime = cstream->runtime; - trans = runtime->private_data; - pr_debug("%s\n", __func__); - if (cstream->direction == SND_COMPRESS_CAPTURE) - memcpy(arg, &trans->source_compr_cap, - sizeof(struct snd_compr_caps)); - else - memcpy(arg, &trans->sink_compr_cap, - sizeof(struct snd_compr_caps)); - return 0; -} - -static int msm_transcode_loopback_set_metadata(struct snd_compr_stream *cstream, - struct snd_compr_metadata *metadata) -{ - struct snd_soc_pcm_runtime *rtd; - struct trans_loopback_pdata *pdata; - struct msm_transcode_loopback *prtd = NULL; - struct audio_client *ac = NULL; - - if (!metadata || !cstream) { - pr_err("%s: Invalid arguments\n", __func__); - return -EINVAL; - } - - rtd = snd_pcm_substream_chip(cstream); - pdata = snd_soc_platform_get_drvdata(rtd->platform); - - prtd = cstream->runtime->private_data; - - if (!prtd || !prtd->audio_client) { - pr_err("%s: prtd or audio client is NULL\n", __func__); - return -EINVAL; - } - - ac = prtd->audio_client; - - switch (metadata->key) { - case SNDRV_COMPRESS_LATENCY_MODE: - { - switch (metadata->value[0]) { - case SNDRV_COMPRESS_LEGACY_LATENCY_MODE: - pdata->perf_mode = LEGACY_PCM_MODE; - break; - case SNDRV_COMPRESS_LOW_LATENCY_MODE: - pdata->perf_mode = LOW_LATENCY_PCM_MODE; - break; - default: - pr_debug("%s: Unsupported latency mode %d, default to Legacy\n", - __func__, metadata->value[0]); - pdata->perf_mode = LEGACY_PCM_MODE; - break; - } - break; - } - case SNDRV_COMPRESS_RENDER_WINDOW: - { - return msm_transcode_set_render_window( - ac, - metadata->value[0], - metadata->value[1], - metadata->value[2], - metadata->value[3]); - } - default: - pr_debug("%s: Unsupported metadata %d\n", - __func__, metadata->key); - break; - } - return 0; -} - -static int msm_transcode_stream_cmd_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd; - int ret = 0; - struct msm_adsp_event_data *event_data = NULL; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto done; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null.\n", __func__); - ret = -EINVAL; - goto done; - } - - event_data = (struct msm_adsp_event_data *)ucontrol->value.bytes.data; - if ((event_data->event_type < ADSP_STREAM_PP_EVENT) || - (event_data->event_type >= ADSP_STREAM_EVENT_MAX)) { - pr_err("%s: invalid event_type=%d", - __func__, event_data->event_type); - ret = -EINVAL; - goto done; - } - - if (event_data->payload_len > sizeof(ucontrol->value.bytes.data) - - sizeof(struct msm_adsp_event_data)) { - pr_err("%s param length=%d exceeds limit", - __func__, event_data->payload_len); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_stream_cmd(prtd->audio_client, event_data); - if (ret < 0) - pr_err("%s: failed to send stream event cmd, err = %d\n", - __func__, ret); -done: - return ret; -} - -static int msm_transcode_ion_fd_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd; - int fd; - int ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds invalid fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto done; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(&fd, ucontrol->value.bytes.data, sizeof(fd)); - ret = q6asm_send_ion_fd(prtd->audio_client, fd); - if (ret < 0) - pr_err("%s: failed to register ion fd\n", __func__); -done: - return ret; -} - -static int msm_transcode_rtic_event_ack_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd; - int ret = 0; - int param_length = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received invalid fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto done; - } - - cstream = pdata->cstream[fe_id]; - if (cstream == NULL) { - pr_err("%s cstream is null\n", __func__); - ret = -EINVAL; - goto done; - } - - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: prtd is null\n", __func__); - ret = -EINVAL; - goto done; - } - - if (prtd->audio_client == NULL) { - pr_err("%s: audio_client is null\n", __func__); - ret = -EINVAL; - goto done; - } - - memcpy(¶m_length, ucontrol->value.bytes.data, - sizeof(param_length)); - if ((param_length + sizeof(param_length)) - >= sizeof(ucontrol->value.bytes.data)) { - pr_err("%s param length=%d exceeds limit", - __func__, param_length); - ret = -EINVAL; - goto done; - } - - ret = q6asm_send_rtic_event_ack(prtd->audio_client, - ucontrol->value.bytes.data + sizeof(param_length), - param_length); - if (ret < 0) - pr_err("%s: failed to send rtic event ack, err = %d\n", - __func__, ret); -done: - return ret; -} - -static int msm_transcode_playback_app_type_cfg_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000}; - int ret = 0; - - cfg_data.app_type = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_APP_TYPE]; - cfg_data.acdb_dev_id = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_ACDB_ID]; - if (ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] != 0) - cfg_data.sample_rate = ucontrol->value.integer.value[ - APP_TYPE_CONFIG_IDX_SAMPLE_RATE]; - pr_debug("%s: fe_id %llu session_type %d be_id %d app_type %d acdb_dev_id %d sample_rate- %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); - ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, - be_id, &cfg_data); - if (ret < 0) - pr_err("%s: msm_transcode_playback_stream_app_type_cfg set failed returned %d\n", - __func__, ret); - - return ret; -} - -static int msm_transcode_playback_app_type_cfg_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - u64 fe_id = kcontrol->private_value; - int session_type = SESSION_TYPE_RX; - int be_id = 0; - struct msm_pcm_stream_app_type_cfg cfg_data = {0}; - int ret = 0; - - ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type, - &be_id, &cfg_data); - if (ret < 0) { - pr_err("%s: msm_transcode_playback_stream_app_type_cfg get failed returned %d\n", - __func__, ret); - goto done; - } - - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_APP_TYPE] = - cfg_data.app_type; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_ACDB_ID] = - cfg_data.acdb_dev_id; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] = - cfg_data.sample_rate; - ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID] = be_id; - pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n", - __func__, fe_id, session_type, be_id, - cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate); -done: - return ret; -} - -static int msm_transcode_set_volume(struct snd_compr_stream *cstream, - uint32_t master_gain) -{ - int rc = 0; - struct msm_transcode_loopback *prtd; - struct snd_soc_pcm_runtime *rtd; - - pr_debug("%s: master_gain %d\n", __func__, master_gain); - if (!cstream || !cstream->runtime) { - pr_err("%s: session not active\n", __func__); - return -EINVAL; - } - rtd = cstream->private_data; - prtd = cstream->runtime->private_data; - - if (!rtd || !rtd->platform || !prtd || !prtd->audio_client) { - pr_err("%s: invalid rtd, prtd or audio client", __func__); - return -EINVAL; - } - - rc = q6asm_set_volume(prtd->audio_client, master_gain); - if (rc < 0) - pr_err("%s: Send vol gain command failed rc=%d\n", - __func__, rc); - - return rc; -} - -static int msm_transcode_volume_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct snd_compr_stream *cstream = NULL; - uint32_t ret = 0; - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - - cstream = pdata->cstream[fe_id]; - pdata->master_gain = ucontrol->value.integer.value[0]; - - pr_debug("%s: fe_id %lu master_gain %d\n", - __func__, fe_id, pdata->master_gain); - if (cstream) - ret = msm_transcode_set_volume(cstream, pdata->master_gain); - return ret; -} - -static int msm_transcode_volume_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id); - return -EINVAL; - } - - pr_debug("%s: fe_id %lu\n", __func__, fe_id); - ucontrol->value.integer.value[0] = pdata->master_gain; - - return 0; -} - -static int msm_transcode_audio_effects_config_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = MAX_PP_PARAMS_SZ; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_transcode_audio_effects_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_transcode_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - - pr_debug("%s: fe_id: %lu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - return -EINVAL; - } - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - return -EINVAL; - } - - return 0; -} - -static int msm_transcode_audio_effects_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol); - unsigned long fe_id = kcontrol->private_value; - struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *) - snd_soc_component_get_drvdata(comp); - struct msm_transcode_audio_effects *audio_effects = NULL; - struct snd_compr_stream *cstream = NULL; - struct msm_transcode_loopback *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); - int effects_module; - int ret = 0; - - pr_debug("%s: fe_id: %lu\n", __func__, fe_id); - if (fe_id >= MSM_FRONTEND_DAI_MAX) { - pr_err("%s Received out of bounds fe_id %lu\n", - __func__, fe_id); - ret = -EINVAL; - goto exit; - } - cstream = pdata->cstream[fe_id]; - audio_effects = pdata->audio_effects[fe_id]; - if (!cstream || !audio_effects) { - pr_err("%s: stream or effects inactive\n", __func__); - ret = -EINVAL; - goto exit; - } - prtd = cstream->runtime->private_data; - if (!prtd) { - pr_err("%s: cannot set audio effects\n", __func__); - ret = -EINVAL; - goto exit; - } - - effects_module = *values++; - switch (effects_module) { - case VIRTUALIZER_MODULE: - pr_debug("%s: VIRTUALIZER_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_virtualizer_handler( - prtd->audio_client, - &(audio_effects->virtualizer), - values); - break; - case REVERB_MODULE: - pr_debug("%s: REVERB_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_reverb_handler(prtd->audio_client, - &(audio_effects->reverb), - values); - break; - case BASS_BOOST_MODULE: - pr_debug("%s: BASS_BOOST_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_bass_boost_handler(prtd->audio_client, - &(audio_effects->bass_boost), - values); - break; - case PBE_MODULE: - pr_debug("%s: PBE_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_pbe_handler(prtd->audio_client, - &(audio_effects->pbe), - values); - break; - case EQ_MODULE: - pr_debug("%s: EQ_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_popless_eq_handler(prtd->audio_client, - &(audio_effects->equalizer), - values); - break; - case SOFT_VOLUME_MODULE: - pr_debug("%s: SOFT_VOLUME_MODULE\n", __func__); - break; - case SOFT_VOLUME2_MODULE: - pr_debug("%s: SOFT_VOLUME2_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - ret = msm_audio_effects_volume_handler_v2(prtd->audio_client, - &(audio_effects->volume), - values, SOFT_VOLUME_INSTANCE_2); - break; - default: - pr_err("%s Invalid effects config module\n", __func__); - ret = -EINVAL; - } - -exit: - return ret; -} - -static int msm_transcode_add_audio_effects_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Audio Effects Config"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0; - int ret = 0; - struct snd_kcontrol_new fe_audio_effects_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_transcode_audio_effects_config_info, - .get = msm_transcode_audio_effects_config_get, - .put = msm_transcode_audio_effects_config_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n", __func__, - rtd->dai_link->name, rtd->dai_link->id, - rtd->dai_link->cpu_dai_name, rtd->pcm->device); - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - - fe_audio_effects_config_control[0].name = mixer_str; - fe_audio_effects_config_control[0].private_value = rtd->dai_link->id; - ret = snd_soc_add_platform_controls(rtd->platform, - fe_audio_effects_config_control, - ARRAY_SIZE(fe_audio_effects_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s. err = %d\n", __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_stream_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CMD; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_loopback_stream_cmd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_transcode_stream_cmd_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_loopback_stream_cmd_config_control[0].name = mixer_str; - fe_loopback_stream_cmd_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_loopback_stream_cmd_config_control, - ARRAY_SIZE(fe_loopback_stream_cmd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_stream_callback_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = DSP_STREAM_CALLBACK; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol *kctl; - - struct snd_kcontrol_new fe_loopback_callback_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_callback_info, - .get = msm_adsp_stream_callback_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s: rtd is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_loopback_callback_config_control[0].name = mixer_str; - fe_loopback_callback_config_control[0].private_value = - rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_loopback_callback_config_control, - ARRAY_SIZE(fe_loopback_callback_config_control)); - if (ret < 0) { - pr_err("%s: failed to add ctl %s. err = %d\n", - __func__, mixer_str, ret); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str); - if (!kctl) { - pr_err("%s: failed to get kctl %s.\n", __func__, mixer_str); - ret = -EINVAL; - goto free_mixer_str; - } - - kctl->private_data = NULL; -free_mixer_str: - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_add_ion_fd_cmd_control(struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback ION FD"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_ion_fd_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_transcode_ion_fd_map_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_ion_fd_config_control[0].name = mixer_str; - fe_ion_fd_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_ion_fd_config_control, - ARRAY_SIZE(fe_ion_fd_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_add_event_ack_cmd_control( - struct snd_soc_pcm_runtime *rtd) -{ - const char *mixer_ctl_name = "Playback Event Ack"; - const char *deviceNo = "NN"; - char *mixer_str = NULL; - int ctl_len = 0, ret = 0; - struct snd_kcontrol_new fe_event_ack_config_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "?", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_adsp_stream_cmd_info, - .put = msm_transcode_rtic_event_ack_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - ret = -EINVAL; - goto done; - } - - ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1; - mixer_str = kzalloc(ctl_len, GFP_KERNEL); - if (!mixer_str) { - ret = -ENOMEM; - goto done; - } - - snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device); - fe_event_ack_config_control[0].name = mixer_str; - fe_event_ack_config_control[0].private_value = rtd->dai_link->id; - pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str); - ret = snd_soc_add_platform_controls(rtd->platform, - fe_event_ack_config_control, - ARRAY_SIZE(fe_event_ack_config_control)); - if (ret < 0) - pr_err("%s: failed to add ctl %s\n", __func__, mixer_str); - - kfree(mixer_str); -done: - return ret; -} - -static int msm_transcode_app_type_cfg_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 5; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 0xFFFFFFFF; - return 0; -} - -static int msm_transcode_add_app_type_cfg_control( - struct snd_soc_pcm_runtime *rtd) -{ - char mixer_str[32]; - struct snd_kcontrol_new fe_app_type_cfg_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_transcode_app_type_cfg_info, - .put = msm_transcode_playback_app_type_cfg_put, - .get = msm_transcode_playback_app_type_cfg_get, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) { - snprintf(mixer_str, sizeof(mixer_str), - "Audio Stream %d App Type Cfg", - rtd->pcm->device); - - fe_app_type_cfg_control[0].name = mixer_str; - fe_app_type_cfg_control[0].private_value = rtd->dai_link->id; - - fe_app_type_cfg_control[0].put = - msm_transcode_playback_app_type_cfg_put; - fe_app_type_cfg_control[0].get = - msm_transcode_playback_app_type_cfg_get; - - pr_debug("Registering new mixer ctl %s", mixer_str); - snd_soc_add_platform_controls(rtd->platform, - fe_app_type_cfg_control, - ARRAY_SIZE(fe_app_type_cfg_control)); - } - - return 0; -} -static int msm_transcode_volume_info(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_info *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = TRANSCODE_LR_VOL_MAX_DB; - return 0; -} - -static int msm_transcode_add_volume_control(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_kcontrol_new fe_volume_control[1] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Transcode Loopback Rx Volume", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = msm_transcode_volume_info, - .get = msm_transcode_volume_get, - .put = msm_transcode_volume_put, - .private_value = 0, - } - }; - - if (!rtd) { - pr_err("%s NULL rtd\n", __func__); - return -EINVAL; - } - if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) { - fe_volume_control[0].private_value = rtd->dai_link->id; - pr_debug("Registering new mixer ctl %s", - fe_volume_control[0].name); - snd_soc_add_platform_controls(rtd->platform, fe_volume_control, - ARRAY_SIZE(fe_volume_control)); - } - return 0; -} - -static int msm_transcode_loopback_new(struct snd_soc_pcm_runtime *rtd) -{ - int rc; - - rc = msm_transcode_add_audio_effects_control(rtd); - if (rc) - pr_err("%s: Could not add Compr Audio Effects Control\n", - __func__); - - rc = msm_transcode_stream_cmd_control(rtd); - if (rc) - pr_err("%s: ADSP Stream Cmd Control open failed\n", __func__); - - rc = msm_transcode_stream_callback_control(rtd); - if (rc) - pr_err("%s: ADSP Stream callback Control open failed\n", - __func__); - - rc = msm_transcode_add_ion_fd_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add transcode ion fd Control\n", - __func__); - - rc = msm_transcode_add_event_ack_cmd_control(rtd); - if (rc) - pr_err("%s: Could not add transcode event ack Control\n", - __func__); - - rc = msm_transcode_add_app_type_cfg_control(rtd); - if (rc) - pr_err("%s: Could not add Compr App Type Cfg Control\n", - __func__); - - rc = msm_transcode_add_volume_control(rtd); - if (rc) - pr_err("%s: Could not add transcode volume Control\n", - __func__); - - return 0; -} - -static struct snd_compr_ops msm_transcode_loopback_ops = { - .open = msm_transcode_loopback_open, - .free = msm_transcode_loopback_free, - .trigger = msm_transcode_loopback_trigger, - .set_params = msm_transcode_loopback_set_params, - .get_caps = msm_transcode_loopback_get_caps, - .set_metadata = msm_transcode_loopback_set_metadata, -}; - - -static int msm_transcode_loopback_probe(struct snd_soc_platform *platform) -{ - struct trans_loopback_pdata *pdata = NULL; - int i; - - pr_debug("%s\n", __func__); - pdata = (struct trans_loopback_pdata *) - kzalloc(sizeof(struct trans_loopback_pdata), - GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - pdata->perf_mode = LOW_LATENCY_PCM_MODE; - for (i = 0; i < MSM_FRONTEND_DAI_MAX; i++) - pdata->audio_effects[i] = NULL; - - snd_soc_platform_set_drvdata(platform, pdata); - return 0; -} - -static int msm_transcode_loopback_remove(struct snd_soc_platform *platform) -{ - struct trans_loopback_pdata *pdata = NULL; - - pdata = (struct trans_loopback_pdata *) - snd_soc_platform_get_drvdata(platform); - kfree(pdata); - return 0; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .probe = msm_transcode_loopback_probe, - .compr_ops = &msm_transcode_loopback_ops, - .pcm_new = msm_transcode_loopback_new, - .remove = msm_transcode_loopback_remove, -}; - -static int msm_transcode_dev_probe(struct platform_device *pdev) -{ - pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev)); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_transcode_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_transcode_loopback_dt_match[] = { - {.compatible = "qcom,msm-transcode-loopback"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_transcode_loopback_dt_match); - -static struct platform_driver msm_transcode_loopback_driver = { - .driver = { - .name = "msm-transcode-loopback", - .owner = THIS_MODULE, - .of_match_table = msm_transcode_loopback_dt_match, - }, - .probe = msm_transcode_dev_probe, - .remove = msm_transcode_remove, -}; - -int __init msm_transcode_loopback_init(void) -{ - memset(&transcode_info, 0, sizeof(struct msm_transcode_loopback)); - mutex_init(&transcode_info.lock); - return platform_driver_register(&msm_transcode_loopback_driver); -} - -void msm_transcode_loopback_exit(void) -{ - mutex_destroy(&transcode_info.lock); - platform_driver_unregister(&msm_transcode_loopback_driver); -} - -MODULE_DESCRIPTION("Transcode loopback platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/msm8998.c b/techpack/audio/asoc/msm8998.c deleted file mode 100644 index 1faa1930cc02..000000000000 --- a/techpack/audio/asoc/msm8998.c +++ /dev/null @@ -1,7483 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "codecs/msm-cdc-pinctrl.h" -#include "codecs/wcd9335.h" -#include "codecs/wcd934x/wcd934x.h" -#include "codecs/wcd934x/wcd934x-mbhc.h" -#include "codecs/wsa881x.h" - -#define DRV_NAME "msm8998-asoc-snd" - -#define __CHIPSET__ "MSM8998 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define WCD9XXX_MBHC_DEF_BUTTONS 8 -#define WCD9XXX_MBHC_DEF_RLOADS 5 -#define CODEC_EXT_CLK_RATE 9600000 -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define DEV_NAME_STR_LEN 32 - -#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 3 - -#define TDM_CHANNEL_MAX 8 -#define TDM_SLOT_OFFSET_MAX 8 - -#define MSM_HIFI_ON 1 - -enum { - SLIM_RX_0 = 0, - SLIM_RX_1, - SLIM_RX_2, - SLIM_RX_3, - SLIM_RX_4, - SLIM_RX_5, - SLIM_RX_6, - SLIM_RX_7, - SLIM_RX_MAX, -}; - -enum { - SLIM_TX_0 = 0, - SLIM_TX_1, - SLIM_TX_2, - SLIM_TX_3, - SLIM_TX_4, - SLIM_TX_5, - SLIM_TX_6, - SLIM_TX_7, - SLIM_TX_8, - SLIM_TX_MAX, -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - MI2S_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - AUX_PCM_MAX, -}; - -enum { - PCM_I2S_SEL_PRIM = 0, - PCM_I2S_SEL_SEC, - PCM_I2S_SEL_TERT, - PCM_I2S_SEL_QUAT, - PCM_I2S_SEL_MAX, -}; - -struct mi2s_aux_pcm_common_conf { - struct mutex lock; - void *pcm_i2s_sel_vt_addr; -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; -}; - -struct auxpcm_conf { - struct mutex lock; - u32 ref_cnt; -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -enum { - HDMI_RX_IDX = 0, - DP_RX_IDX, - EXT_DISP_RX_IDX_MAX, -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; - -enum pinctrl_pin_state { - STATE_DISABLE = 0, /* All pins are in sleep state */ - STATE_MI2S_ACTIVE, /* IS2 = active, TDM = sleep */ - STATE_TDM_ACTIVE, /* IS2 = sleep, TDM = active */ -}; - -struct msm_pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *mi2s_disable; - struct pinctrl_state *tdm_disable; - struct pinctrl_state *mi2s_active; - struct pinctrl_state *tdm_active; - enum pinctrl_pin_state curr_state; -}; - -struct msm_asoc_mach_data { - u32 mclk_freq; - int us_euro_gpio; /* used by gpio driver API */ - struct device_node *us_euro_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ - struct snd_info_entry *codec_root; - struct msm_pinctrl_info pinctrl_info; -}; - -struct msm_asoc_wcd93xx_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); - void (*mbhc_hs_detect_exit)(struct snd_soc_codec *codec); -}; - -static const char *const pin_states[] = {"sleep", "i2s-active", - "tdm-active"}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } -}; - -/*TDM default offset currently only supporting TDM_RX_0 and TDM_TX_0 */ -static unsigned int tdm_slot_offset[TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = { - {0, 4, 8, 12, 16, 20, 24, 28},/* TX_0 | RX_0 */ - {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_1 | RX_1 */ - {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_2 | RX_2 */ - {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_3 | RX_3 */ - {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_4 | RX_4 */ - {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_5 | RX_5 */ - {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_6 | RX_6 */ - {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_7 | RX_7 */ -}; - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [HDMI_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static int msm_vi_feed_tx_ch = 2; -static const char *const slim_rx_ch_text[] = {"One", "Two"}; -static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE"}; -static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_48"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_32", "KHZ_44P1", - "KHZ_88P2", "KHZ_176P4"}; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_44P1", "KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_96", "KHZ_192"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const hifi_text[] = {"Off", "On"}; - -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text); - -static struct platform_device *spdev; -static int msm_hifi_control; - -static bool is_initial_boot; -static bool codec_reg_done; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; -static struct msm_asoc_wcd93xx_codec msm_codec_fn; - -static void *def_tasha_mbhc_cal(void); -static void *def_tavil_mbhc_cal(void); -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm); -static int msm_wsa881x_init(struct snd_soc_component *component); - -/* - * Need to report LINEIN - * if R/L channel impedance is larger than 5K ohm - */ -static struct wcd_mbhc_config wcd_mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .detect_extn_cable = true, - .mono_stero_detection = false, - .swap_gnd_mic = NULL, - .hs_ext_micbias = true, - .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, - .key_code[4] = 0, - .key_code[5] = 0, - .key_code[6] = 0, - .key_code[7] = 0, - .linein_th = 5000, - .moisture_en = true, - .mbhc_micbias = MIC_BIAS_2, - .anc_micbias = MIC_BIAS_2, - .enable_anc_mic_detect = false, -}; - -static struct snd_soc_dapm_route wcd_audio_paths_tasha[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS2", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct snd_soc_dapm_route wcd_audio_paths[] = { - {"MIC BIAS1", NULL, "MCLK"}, - {"MIC BIAS2", NULL, "MCLK"}, - {"MIC BIAS3", NULL, "MCLK"}, - {"MIC BIAS4", NULL, "MCLK"}, -}; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } -}; - -static struct mi2s_aux_pcm_common_conf mi2s_auxpcm_conf[PCM_I2S_SEL_MAX]; -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; -static struct auxpcm_conf auxpcm_intf_conf[AUX_PCM_MAX]; - -static int slim_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 10; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int slim_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int slim_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - val = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int slim_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - bit_fmt = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int slim_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) - port_id = SLIM_RX_0; - else if (strnstr(kcontrol->id.name, "SLIM_2_RX", sizeof("SLIM_2_RX"))) - port_id = SLIM_RX_2; - else if (strnstr(kcontrol->id.name, "SLIM_5_RX", sizeof("SLIM_5_RX"))) - port_id = SLIM_RX_5; - else if (strnstr(kcontrol->id.name, "SLIM_6_RX", sizeof("SLIM_6_RX"))) - port_id = SLIM_RX_6; - else if (strnstr(kcontrol->id.name, "SLIM_0_TX", sizeof("SLIM_0_TX"))) - port_id = SLIM_TX_0; - else if (strnstr(kcontrol->id.name, "SLIM_1_TX", sizeof("SLIM_1_TX"))) - port_id = SLIM_TX_1; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].sample_rate = - slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate = 0; - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - if (sample_rate == SAMPLING_RATE_44P1KHZ) { - pr_err("%s: Unsupported sample rate %d: for Tx path\n", - __func__, sample_rate); - return -EINVAL; - } - slim_tx_cfg[ch_num].sample_rate = sample_rate; - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_slim_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1; - - return 0; -} - -static int msm_slim_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - - return 1; -} - -static int msm_slim_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1; - - return 0; -} - -static int msm_slim_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "HDMI_RX", sizeof("HDMI_RX"))) - idx = HDMI_RX_IDX; - else if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) - idx = DP_RX_IDX; - else { - pr_err("%s: unsupported BE: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 6; - break; - - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 4; - break; - - case SAMPLING_RATE_32KHZ: - sample_rate_val = 3; - break; - - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 6: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 8; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - port->mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUAT; - } else { - pr_err("%s: unsupported mode in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - port->channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - port->channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - port->channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - port->channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - port->channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - port->channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - port->channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - port->channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - } else - return -EINVAL; - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) - idx = PRIM_AUX_PCM; - else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) - idx = SEC_AUX_PCM; - else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) - idx = TERT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) - idx = QUAT_AUX_PCM; - else { - pr_err("%s: unsupported port: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) - idx = QUAT_MI2S; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 6; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_hifi_ctrl(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - pr_debug("%s: msm_hifi_control = %d", __func__, - msm_hifi_control); - - if (!pdata || !pdata->hph_en1_gpio_p) { - pr_err("%s: hph_en1_gpio is invalid\n", __func__); - return -EINVAL; - } - if (msm_hifi_control == MSM_HIFI_ON) { - msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p); - /* 5msec delay needed as per HW requirement */ - usleep_range(5000, 5010); - } else { - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p); - } - snd_soc_dapm_sync(dapm); - - return 0; -} - -static int msm_hifi_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - ucontrol->value.integer.value[0] = msm_hifi_control; - - return 0; -} - -static int msm_hifi_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - pr_debug("%s() ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - msm_hifi_control = ucontrol->value.integer.value[0]; - msm_hifi_ctrl(codec); - - return 0; -} - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs, - msm_slim_tx_ch_get, msm_slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs, - msm_slim_tx_ch_get, msm_slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("HDMI_RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format, - slim_tx_bit_format_get, slim_tx_bit_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("HDMI_RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate, - slim_tx_sample_rate_get, slim_tx_sample_rate_put), - SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("HDMI_RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, - msm_hifi_put), -}; - -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tasha_codec")) - ret = tasha_cdc_mclk_enable(codec, enable, dapm); - else if (!strcmp(dev_name(codec->dev), "tavil_codec")) - ret = tavil_cdc_mclk_enable(codec, enable); - else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tasha_codec")) - ret = tasha_cdc_mclk_tx_enable(codec, enable, dapm); - else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_tx_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_tx_clk(codec, 0, true); - } - return 0; -} - -static int msm_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_clk(codec, 0, true); - } - return 0; -} - -static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *k, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - pr_debug("%s: msm_hifi_control = %d", __func__, msm_hifi_control); - - if (!pdata || !pdata->hph_en0_gpio_p) { - pr_err("%s: hph_en0_gpio is invalid\n", __func__); - return -EINVAL; - } - - if (msm_hifi_control != MSM_HIFI_ON) { - pr_debug("%s: HiFi mixer control is not set\n", - __func__); - return 0; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p); - break; - case SND_SOC_DAPM_PRE_PMD: - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p); - break; - } - - return 0; -} - -static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, - msm_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0, - msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SPK("Lineout_1 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_3 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_4 amp", NULL), - SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event), - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL), - SND_SOC_DAPM_MIC("Analog Mic5", NULL), - SND_SOC_DAPM_MIC("Analog Mic6", NULL), - - SND_SOC_DAPM_MIC("Digital Mic0", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", NULL), - SND_SOC_DAPM_MIC("Digital Mic2", NULL), - SND_SOC_DAPM_MIC("Digital Mic3", NULL), - SND_SOC_DAPM_MIC("Digital Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic5", NULL), -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int msm_slim_get_ch_from_beid(int32_t be_id) -{ - int ch_id = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - ch_id = SLIM_RX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - ch_id = SLIM_RX_1; - break; - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - ch_id = SLIM_RX_2; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - ch_id = SLIM_RX_3; - break; - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - ch_id = SLIM_RX_4; - break; - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - ch_id = SLIM_RX_6; - break; - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - ch_id = SLIM_TX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - ch_id = SLIM_TX_3; - break; - default: - ch_id = SLIM_RX_0; - break; - } - - return ch_id; -} - -static int msm_ext_disp_get_idx_from_beid(int32_t be_id) -{ - int idx; - - switch (be_id) { - case MSM_BACKEND_DAI_HDMI_RX: - idx = HDMI_RX_IDX; - break; - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = DP_RX_IDX; - break; - default: - pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id); - idx = -EINVAL; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - void *config = NULL; - struct snd_soc_codec *codec = NULL; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[idx].bit_format); - rate->min = rate->max = slim_rx_cfg[idx].sample_rate; - channels->min = channels->max = slim_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[idx].bit_format); - rate->min = rate->max = slim_tx_cfg[idx].sample_rate; - channels->min = channels->max = slim_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_1_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[1].bit_format); - rate->min = rate->max = slim_tx_cfg[1].sample_rate; - channels->min = channels->max = slim_tx_cfg[1].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_4_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[5].bit_format); - rate->min = rate->max = slim_rx_cfg[5].sample_rate; - channels->min = channels->max = slim_rx_cfg[5].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_TX: - codec = rtd->codec; - rate->min = rate->max = SAMPLING_RATE_16KHZ; - channels->min = channels->max = 1; - - config = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_PORT_CONFIG); - if (config) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, - config, SLIMBUS_5_TX); - if (rc) - pr_err("%s: Failed to set slimbus slave port config %d\n", - __func__, rc); - } - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_HDMI_RX: - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - goto done; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - -done: - return rc; -} - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - int value = 0; - - if (pdata->us_euro_gpio_p) { - value = msm_cdc_pinctrl_get_state(pdata->us_euro_gpio_p); - if (value) - msm_cdc_pinctrl_select_sleep_state( - pdata->us_euro_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - pdata->us_euro_gpio_p); - } else if (pdata->us_euro_gpio >= 0) { - value = gpio_get_value_cansleep(pdata->us_euro_gpio); - gpio_set_value_cansleep(pdata->us_euro_gpio, !value); - } - pr_debug("%s: swap select switch %d to %d\n", __func__, value, !value); - return true; -} - -static int msm_afe_set_config(struct snd_soc_codec *codec) -{ - int ret = 0; - void *config_data = NULL; - - if (!msm_codec_fn.get_afe_config_fn) { - dev_err(codec->dev, "%s: codec get afe config not init'ed\n", - __func__); - return -EINVAL; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set codec registers config %d\n", - __func__, ret); - return ret; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (ret) - dev_err(codec->dev, - "%s: Failed to set cdc register page config\n", - __func__); - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set slimbus slave config %d\n", - __func__, ret); - return ret; - } - } - - return 0; -} - -static void msm_afe_clear_config(void) -{ - afe_clear_config(AFE_CDC_REGISTERS_CONFIG); - afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); -} - -static int msm_adsp_power_up_config(struct snd_soc_codec *codec) -{ - int ret = 0; - unsigned long timeout; - int adsp_ready = 0; - - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - - do { - if (q6core_is_adsp_ready()) { - pr_debug("%s: ADSP Audio is ready\n", __func__); - adsp_ready = 1; - break; - } - /* - * ADSP will be coming up after subsystem restart and - * it might not be fully up when the control reaches - * here. So, wait for 50msec before checking ADSP state - */ - msleep(50); - } while (time_after(timeout, jiffies)); - - if (!adsp_ready) { - pr_err("%s: timed out waiting for ADSP Audio\n", __func__); - ret = -ETIMEDOUT; - goto err_fail; - } - - ret = msm_afe_set_config(codec); - if (ret) - pr_err("%s: Failed to set AFE config. err %d\n", - __func__, ret); - - return 0; - -err_fail: - return ret; -} - -static int msm8998_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - int ret; - struct snd_soc_card *card = NULL; - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore initial boot notifications - * On initial boot msm_adsp_power_up_config is - * called on init. There is no need to clear - * and set the config again on initial boot. - */ - if (is_initial_boot) - break; - msm_afe_clear_config(); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (is_initial_boot) { - is_initial_boot = false; - break; - } - if (!spdev) - return -EINVAL; - - card = platform_get_drvdata(spdev); - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto done; - } - codec = rtd->codec; - - ret = msm_adsp_power_up_config(codec); - if (ret < 0) { - dev_err(card->dev, - "%s: msm_adsp_power_up_config failed ret = %d!\n", - __func__, ret); - goto done; - } - break; - default: - break; - } -done: - return NOTIFY_OK; -} - -static struct notifier_block service_nb = { - .notifier_call = msm8998_notifier_service_cb, - .priority = -INT_MAX, -}; - -static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156}; - unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - /* Tavil Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch_tavil[WCD934X_RX_MAX] = {144, 145, 146, 147, 148, - 149, 150, 151}; - unsigned int tx_ch_tavil[WCD934X_TX_MAX] = {128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, - 143}; - - pr_info("%s: dev_name%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets, - ARRAY_SIZE(msm_dapm_widgets)); - - if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) - snd_soc_dapm_add_routes(dapm, wcd_audio_paths_tasha, - ARRAY_SIZE(wcd_audio_paths_tasha)); - else - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic6"); - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - - if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) { - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT2"); - } - - snd_soc_dapm_sync(dapm); - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch_tavil), - tx_ch_tavil, ARRAY_SIZE(rx_ch_tavil), - rx_ch_tavil); - } else { - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), - rx_ch); - } - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - msm_codec_fn.get_afe_config_fn = tavil_get_afe_config; - } else { - msm_codec_fn.get_afe_config_fn = tasha_get_afe_config; - msm_codec_fn.mbhc_hs_detect_exit = tasha_mbhc_hs_detect_exit; - } - - ret = msm_adsp_power_up_config(codec); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err_afe_cfg; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err_afe_cfg; - } - } - - if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) { - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_CLIP_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_CLIP_REGISTERS_CONFIG, - config_data, 0); - if (ret) { - pr_err("%s: Failed to set clip registers %d\n", - __func__, ret); - goto err_afe_cfg; - } - } - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CLIP_BANK_SEL); - if (config_data) { - ret = afe_set_config(AFE_CLIP_BANK_SEL, config_data, 0); - if (ret) { - pr_err("%s: Failed to set AFE bank selection %d\n", - __func__, ret); - goto err_afe_cfg; - } - } - } - - /* - * Send speaker configuration only for WSA8810. - * Defalut configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, list_aux); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tavil_set_spkr_mode(rtd->codec, - WCD934X_SPKR_MODE_1); - tavil_set_spkr_gain_offset(rtd->codec, - WCD934X_RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - pdata->codec_root = NULL; - goto done; - } - pdata->codec_root = entry; - tavil_codec_info_create_codec_entry(pdata->codec_root, codec); - } else { - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, list_aux); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tasha_set_spkr_mode(rtd->codec, SPKR_MODE_1); - tasha_set_spkr_gain_offset(rtd->codec, - RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err_snd_module; - } - pdata->codec_root = entry; - tasha_codec_info_create_codec_entry(pdata->codec_root, codec); - } -done: - codec_reg_done = true; - return 0; - -err_snd_module: -err_afe_cfg: - return ret; -} - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static void *def_tasha_mbhc_cal(void) -{ - void *tasha_wcd_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - tasha_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!tasha_wcd_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tasha_wcd_cal)->X) = (Y)) - S(v_hs_max, 1600); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tasha_wcd_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tasha_wcd_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; - - return tasha_wcd_cal; -} - -static void *def_tavil_mbhc_cal(void) -{ - void *tavil_wcd_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - tavil_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!tavil_wcd_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tavil_wcd_cal)->X) = (Y)) - S(v_hs_max, 1600); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; - - return tavil_wcd_cal; -} - -static int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 rx_ch_count; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) { - pr_debug("%s: rx_5_ch=%d\n", __func__, - slim_rx_cfg[5].channels); - rx_ch_count = slim_rx_cfg[5].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) { - pr_debug("%s: rx_2_ch=%d\n", __func__, - slim_rx_cfg[2].channels); - rx_ch_count = slim_rx_cfg[2].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) { - pr_debug("%s: rx_6_ch=%d\n", __func__, - slim_rx_cfg[6].channels); - rx_ch_count = slim_rx_cfg[6].channels; - } else { - pr_debug("%s: rx_0_ch=%d\n", __func__, - slim_rx_cfg[0].channels); - rx_ch_count = slim_rx_cfg[0].channels; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - rx_ch_count, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - } else { - - pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__, - codec_dai->name, codec_dai->id, user_set_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map\n, err:%d\n", - __func__, ret); - goto err_ch_map; - } - /* For _tx1 case */ - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX) - user_set_tx_ch = slim_tx_cfg[0].channels; - /* For _tx3 case */ - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX) - user_set_tx_ch = slim_tx_cfg[1].channels; - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX) - user_set_tx_ch = msm_vi_feed_tx_ch; - else - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), BE id (%d)\n", - __func__, slim_tx_cfg[0].channels, user_set_tx_ch, - tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - } - -err_ch_map: - return ret; -} - -static int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 tx_ch[SLIM_MAX_TX_PORTS]; - u32 tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - - if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) { - pr_err("%s: Invalid stream type %d\n", - __func__, substream->stream); - ret = -EINVAL; - goto err_stream_type; - } - - pr_debug("%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, NULL, NULL); - if (ret < 0) { - pr_err("%s: failed to get codec chan map\n, err:%d\n", - __func__, ret); - goto err_ch_map; - } - - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); -err_ch_map: -err_stream_type: - return ret; -} - -static int msm_slimbus_2_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0; - unsigned int num_tx_ch = 0; - unsigned int num_rx_ch = 0; - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - num_rx_ch = params_channels(params); - pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_rx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - num_rx_ch, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - } else { - num_tx_ch = params_channels(params); - pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, - num_tx_ch, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - } - -err_ch_map: - return ret; -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto exit; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -exit: - return ret; -} - -static int msm_aux_pcm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id - 1; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_AUX_PCM || index > QUAT_AUX_PCM) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto done; - } - - mutex_lock(&auxpcm_intf_conf[index].lock); - if (++auxpcm_intf_conf[index].ref_cnt == 1) { - if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) { - mutex_lock(&mi2s_auxpcm_conf[index].lock); - iowrite32(1, - mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr); - mutex_unlock(&mi2s_auxpcm_conf[index].lock); - } else { - dev_err(rtd->card->dev, - "%s lpaif_tert_muxsel_virt_addr is NULL\n", - __func__); - ret = -EINVAL; - } - } - if (ret < 0) - auxpcm_intf_conf[index].ref_cnt--; - - mutex_unlock(&auxpcm_intf_conf[index].lock); - -done: - return ret; -} - -static void msm_aux_pcm_snd_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id - 1; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, - substream->name, substream->stream, - rtd->cpu_dai->name, rtd->cpu_dai->id); - - if (index < PRIM_AUX_PCM || index > QUAT_AUX_PCM) { - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, rtd->cpu_dai->id); - return; - } - - mutex_lock(&auxpcm_intf_conf[index].lock); - if (--auxpcm_intf_conf[index].ref_cnt == 0) { - if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) { - mutex_lock(&mi2s_auxpcm_conf[index].lock); - iowrite32(0, - mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr); - mutex_unlock(&mi2s_auxpcm_conf[index].lock); - } else { - dev_err(rtd->card->dev, - "%s lpaif_tert_muxsel_virt_addr is NULL\n", - __func__); - } - } - mutex_unlock(&auxpcm_intf_conf[index].lock); -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto done; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto done; - } - -done: - return ret; -} - -static int msm_set_pinctrl(struct msm_pinctrl_info *pinctrl_info, - enum pinctrl_pin_state new_state) -{ - int ret = 0; - int curr_state = 0; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - if (pinctrl_info->pinctrl == NULL) { - pr_err("%s: pinctrl_info->pinctrl is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - curr_state = pinctrl_info->curr_state; - pinctrl_info->curr_state = new_state; - pr_debug("%s: curr_state = %s new_state = %s\n", __func__, - pin_states[curr_state], pin_states[pinctrl_info->curr_state]); - - if (curr_state == pinctrl_info->curr_state) { - pr_debug("%s: Already in same state\n", __func__); - goto err; - } - - if (curr_state != STATE_DISABLE && - pinctrl_info->curr_state != STATE_DISABLE) { - pr_debug("%s: state already active cannot switch\n", __func__); - ret = -EIO; - goto err; - } - - switch (pinctrl_info->curr_state) { - case STATE_MI2S_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_active); - if (ret) { - pr_err("%s: MI2S state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_TDM_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_active); - if (ret) { - pr_err("%s: TDM state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_DISABLE: - if (curr_state == STATE_MI2S_ACTIVE) { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - } else { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_disable); - } - if (ret) { - pr_err("%s: state disable failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - default: - pr_err("%s: TLMM pin state is invalid\n", __func__); - return -EINVAL; - } - -err: - return ret; -} - -static void msm_release_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info->pinctrl) { - devm_pinctrl_put(pinctrl_info->pinctrl); - pinctrl_info->pinctrl = NULL; - } -} - -static int msm_get_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = NULL; - struct pinctrl *pinctrl; - int ret; - - pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(pinctrl)) { - pr_err("%s: Unable to get pinctrl handle\n", __func__); - return -EINVAL; - } - pinctrl_info->pinctrl = pinctrl; - - /* get all the states handles from Device Tree */ - pinctrl_info->mi2s_disable = pinctrl_lookup_state(pinctrl, - "quat-mi2s-sleep"); - if (IS_ERR(pinctrl_info->mi2s_disable)) { - pr_err("%s: could not get mi2s_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->mi2s_active = pinctrl_lookup_state(pinctrl, - "quat-mi2s-active"); - if (IS_ERR(pinctrl_info->mi2s_active)) { - pr_err("%s: could not get mi2s_active pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_disable = pinctrl_lookup_state(pinctrl, - "quat-tdm-sleep"); - if (IS_ERR(pinctrl_info->tdm_disable)) { - pr_err("%s: could not get tdm_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_active = pinctrl_lookup_state(pinctrl, - "quat-tdm-active"); - if (IS_ERR(pinctrl_info->tdm_active)) { - pr_err("%s: could not get tdm_active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - if (ret != 0) { - pr_err("%s: Disable TLMM pins failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - pinctrl_info->curr_state = STATE_DISABLE; - - return 0; - -err: - devm_pinctrl_put(pinctrl); - pinctrl_info->pinctrl = NULL; - return -EINVAL; -} - -static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - if (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - } else if (cpu_dai->id == AFE_PORT_ID_SECONDARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - } else { - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n", - __func__, cpu_dai->id, channels->max, rate->max, - params_format(params)); - - return 0; -} - -static int msm8998_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int channels, slot_width, slots; - unsigned int slot_mask; - unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28}; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - slot_width = 32; - channels = slots; - - pr_debug("%s: slot_width %d slots %d\n", __func__, slot_width, slots); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - pr_debug("%s: slot_width %d\n", __func__, slot_width); - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - } - -end: - return ret; -} - -static int msm8998_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - ret = msm_set_pinctrl(pinctrl_info, STATE_TDM_ACTIVE); - if (ret) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret); - - return ret; -} - -static void msm8998_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - ret = msm_set_pinctrl(pinctrl_info, STATE_DISABLE); - if (ret) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret); - -} - -static struct snd_soc_ops msm8998_tdm_be_ops = { - .hw_params = msm8998_tdm_snd_hw_params, - .startup = msm8998_tdm_snd_startup, - .shutdown = msm8998_tdm_snd_shutdown -}; - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_MI2S || index > QUAT_MI2S) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto done; - } - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, STATE_MI2S_ACTIVE); - if (ret_pinctrl) { - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } - } - - /* - * Muxtex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) { - mutex_lock(&mi2s_auxpcm_conf[index].lock); - iowrite32(0, - mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr); - mutex_unlock(&mi2s_auxpcm_conf[index].lock); - } else { - dev_err(rtd->card->dev, - "%s lpaif_muxsel_virt_addr is NULL for dai %d\n", - __func__, index); - ret = -EINVAL; - goto clk_off; - } - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) - fmt = SND_SOC_DAIFMT_CBM_CFM; - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - } -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -done: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (index < PRIM_MI2S || index > QUAT_MI2S) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - } - mutex_unlock(&mi2s_intf_conf[index].lock); - - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, STATE_DISABLE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } -} - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_aux_pcm_be_ops = { - .startup = msm_aux_pcm_snd_startup, - .shutdown = msm_aux_pcm_snd_shutdown, -}; - -static unsigned int tdm_param_set_slot_mask(u16 port_id, int slot_width, - int slots) -{ - unsigned int slot_mask = 0; - int i, j; - unsigned int *slot_offset; - - for (i = TDM_0; i < TDM_PORT_MAX; i++) { - slot_offset = tdm_slot_offset[i]; - - for (j = 0; j < TDM_SLOT_OFFSET_MAX; j++) { - if (slot_offset[j] != AFE_SLOT_MAPPING_OFFSET_INVALID) - slot_mask |= - (1 << ((slot_offset[j] * 8) / slot_width)); - else - break; - } - } - - return slot_mask; -} - -static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int channels, slot_width, slots; - unsigned int slot_mask; - unsigned int *slot_offset; - int offset_channels = 0; - int i; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - channels = params_channels(params); - switch (channels) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_LE: - case SNDRV_PCM_FORMAT_S16_LE: - /* - * up to 8 channels HW config should - * use 32 bit slot width for max support of - * stream bit width. (slot_width > bit_width) - */ - slot_width = 32; - break; - default: - pr_err("%s: invalid param format 0x%x\n", - __func__, params_format(params)); - return -EINVAL; - } - slots = 8; - slot_mask = tdm_param_set_slot_mask(cpu_dai->id, - slot_width, - slots); - if (!slot_mask) { - pr_err("%s: invalid slot_mask 0x%x\n", - __func__, slot_mask); - return -EINVAL; - } - break; - default: - pr_err("%s: invalid param channels %d\n", - __func__, channels); - return -EINVAL; - } - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - slot_offset = tdm_slot_offset[TDM_0]; - break; - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID) - offset_channels++; - else - break; - } - - if (offset_channels == 0) { - pr_err("%s: slot offset not supported, offset_channels %d\n", - __func__, offset_channels); - return -EINVAL; - } - - if (channels > offset_channels) { - pr_err("%s: channels %d exceed offset_channels %d\n", - __func__, channels, offset_channels); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL, - channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, channels, - slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set channel map, err:%d\n", - __func__, ret); - goto end; - } - } -end: - return ret; -} - -static struct snd_soc_ops msm_be_ops = { - .hw_params = msm_snd_hw_params, -}; - -static struct snd_soc_ops msm_cpe_ops = { - .hw_params = msm_snd_cpe_hw_params, -}; - -static struct snd_soc_ops msm_slimbus_2_be_ops = { - .hw_params = msm_slimbus_2_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - -static struct snd_soc_ops msm_tdm_be_ops = { - .hw_params = msm_tdm_snd_hw_params -}; - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - { - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - { - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - { - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - { - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - { - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - { - .name = "SLIMBUS_0 Hostless", - .stream_name = "SLIMBUS_0 Hostless", - .cpu_dai_name = "SLIMBUS0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - { - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - { - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - { - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_3 Hostless", - .stream_name = "SLIMBUS_3 Hostless", - .cpu_dai_name = "SLIMBUS3_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_4 Hostless", - .stream_name = "SLIMBUS_4 Hostless", - .cpu_dai_name = "SLIMBUS4_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - }, - { - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - { - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - { - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - }, - /* HDMI Hostless */ - { - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - { - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - { - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - { - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - { - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - { - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - { - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - { - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - { - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - { - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - { - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - { - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - { - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - { - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - { - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_tasha_fe_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* CPE LSM direct dai-link */ - { - .name = "CPE Listen service", - .stream_name = "CPE Listen Audio Service", - .cpu_dai_name = "msm-dai-slim", - .platform_name = "msm-cpe-lsm", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "tasha_mad1", - .codec_name = "tasha_codec", - .ops = &msm_cpe_ops, - }, - { - .name = "SLIMBUS_6 Hostless Playback", - .stream_name = "SLIMBUS_6 Hostless", - .cpu_dai_name = "SLIMBUS6_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* CPE LSM EC PP direct dai-link */ - { - .name = "CPE Listen service ECPP", - .stream_name = "CPE Listen Audio Service ECPP", - .cpu_dai_name = "CPE_LSM_NOHOST", - .platform_name = "msm-cpe-lsm.3", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "tasha_cpe", - .codec_name = "tasha_codec", - }, -}; - -static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { - { - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(Transcode Loopback Playback), - .stream_name = "Transcode Loopback Playback", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-transcode-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - { - .name = MSM_DAILINK_NAME(Transcode Loopback Capture), - .stream_name = "Transcode Loopback Capture", - .cpu_dai_name = "MultiMedia18", - .platform_name = "msm-transcode-loopback", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA18, - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm8998_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_tasha_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_vifeedback", - .be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - .ignore_pmdown_time = 1, - }, -}; - -static struct snd_soc_dai_link msm_tavil_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - .ignore_pmdown_time = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* HDMI BACK END DAI Link */ - { - .name = LPASS_BE_HDMI, - .stream_name = "HDMI Playback", - .cpu_dai_name = "msm-dai-q6-hdmi.8", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_hdmi_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_HDMI_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .ops = &msm_aux_pcm_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_tasha_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_tasha_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_tasha_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links)]; - -static struct snd_soc_dai_link msm_tavil_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_tavil_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_tavil_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links)]; - -static int msm_snd_card_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_tasha_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tasha_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - return ret; -} - -static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_tavil_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tavil_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - return ret; -} - -struct snd_soc_card snd_soc_card_tasha_msm = { - .name = "msm8998-tasha-snd-card", - .late_probe = msm_snd_card_late_probe, -}; - -struct snd_soc_card snd_soc_card_tavil_msm = { - .name = "msm8998-tavil-snd-card", - .late_probe = msm_snd_card_tavil_late_probe, -}; - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - pr_err("%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static int msm_prepare_us_euro(struct snd_soc_card *card) -{ - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - int ret = 0; - - if (pdata->us_euro_gpio >= 0) { - dev_dbg(card->dev, "%s: us_euro gpio request %d", __func__, - pdata->us_euro_gpio); - ret = gpio_request(pdata->us_euro_gpio, "TASHA_CODEC_US_EURO"); - if (ret) { - dev_err(card->dev, - "%s: Failed to request codec US/EURO gpio %d error %d\n", - __func__, pdata->us_euro_gpio, ret); - } - } - - return ret; -} - -static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, "%s: add_codec_controls failed, err%d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets, - ARRAY_SIZE(msm_dapm_widgets)); - - return 0; -} - -static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - - int ret = 0; - unsigned int rx_ch[] = {144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156}; - unsigned int tx_ch[] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - slim_rx_cfg[0].channels, - rx_ch); - if (ret < 0) - pr_err("%s: RX failed to set cpu chan map error %d\n", - __func__, ret); - } else { - ret = snd_soc_dai_set_channel_map(cpu_dai, - slim_tx_cfg[0].channels, - tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: TX failed to set cpu chan map error %d\n", - __func__, ret); - } - - return ret; -} - -static struct snd_soc_ops msm_stub_be_ops = { - .hw_params = msm_snd_stub_hw_params, -}; - -static struct snd_soc_dai_link msm_stub_fe_dai_links[] = { - - /* FrontEnd DAI Links */ - { - .name = "MSMSTUB Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, -}; - -static struct snd_soc_dai_link msm_stub_be_dai_links[] = { - - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_stub_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_stub_dai_links[ - ARRAY_SIZE(msm_stub_fe_dai_links) + - ARRAY_SIZE(msm_stub_be_dai_links)]; - -struct snd_soc_card snd_soc_card_stub_msm = { - .name = "msm8998-stub-snd-card", -}; - -static const struct of_device_id msm8998_asoc_machine_of_match[] = { - { .compatible = "qcom,msm8998-asoc-snd-tasha", - .data = "tasha_codec"}, - { .compatible = "qcom,msm8998-asoc-snd-tavil", - .data = "tavil_codec"}, - { .compatible = "qcom,msm8998-asoc-snd-stub", - .data = "stub_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int len_1, len_2, len_3, len_4; - int total_links; - const struct of_device_id *match; - - match = of_match_node(msm8998_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "tasha_codec")) { - card = &snd_soc_card_tasha_msm; - len_1 = ARRAY_SIZE(msm_common_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_tasha_fe_dai_links); - len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links); - len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links); - total_links = len_4 + ARRAY_SIZE(msm_tasha_be_dai_links); - memcpy(msm_tasha_dai_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - memcpy(msm_tasha_dai_links + len_1, - msm_tasha_fe_dai_links, - sizeof(msm_tasha_fe_dai_links)); - memcpy(msm_tasha_dai_links + len_2, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - memcpy(msm_tasha_dai_links + len_3, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - memcpy(msm_tasha_dai_links + len_4, - msm_tasha_be_dai_links, - sizeof(msm_tasha_be_dai_links)); - - if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(msm_tasha_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += ARRAY_SIZE(msm_wcn_be_dai_links); - } - - if (of_property_read_bool(dev->of_node, - "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): External display audio support present\n", - __func__); - memcpy(msm_tasha_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(msm_tasha_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(msm_tasha_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - dailink = msm_tasha_dai_links; - } else if (!strcmp(match->data, "tavil_codec")) { - card = &snd_soc_card_tavil_msm; - len_1 = ARRAY_SIZE(msm_common_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links); - len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links); - len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links); - total_links = len_4 + ARRAY_SIZE(msm_tavil_be_dai_links); - memcpy(msm_tavil_dai_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - memcpy(msm_tavil_dai_links + len_1, - msm_tavil_fe_dai_links, - sizeof(msm_tavil_fe_dai_links)); - memcpy(msm_tavil_dai_links + len_2, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - memcpy(msm_tavil_dai_links + len_3, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - memcpy(msm_tavil_dai_links + len_4, - msm_tavil_be_dai_links, - sizeof(msm_tavil_be_dai_links)); - - if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(msm_tavil_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += ARRAY_SIZE(msm_wcn_be_dai_links); - } - - if (of_property_read_bool(dev->of_node, - "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_tavil_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(msm_tavil_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(msm_tavil_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - dailink = msm_tavil_dai_links; - } else if (!strcmp(match->data, "stub_codec")) { - card = &snd_soc_card_stub_msm; - len_1 = ARRAY_SIZE(msm_stub_fe_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_stub_be_dai_links); - - memcpy(msm_stub_dai_links, - msm_stub_fe_dai_links, - sizeof(msm_stub_fe_dai_links)); - memcpy(msm_stub_dai_links + len_1, - msm_stub_be_dai_links, - sizeof(msm_stub_be_dai_links)); - - dailink = msm_stub_dai_links; - total_links = len_2; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -static int msm_wsa881x_init(struct snd_soc_component *component) -{ - u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {100, 101, 102, 106}; - u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {103, 104, 105, 107}; - unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200}; - unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm; - int ret = 0; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - dapm = snd_soc_codec_get_dapm(codec); - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - ret = -EINVAL; - goto err_codec; - } - pdata = snd_soc_card_get_drvdata(component->card); - if (pdata && pdata->codec_root) - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); - -err_codec: - return ret; -} - -static int msm_init_wsa_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - int i; - struct msm_wsa881x_dev_info *wsa881x_dev_info; - const char *wsa_auxdev_name_prefix[1]; - char *dev_name_str = NULL; - int found = 0; - int ret = 0; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_dbg(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - goto err_dt; - } - if (wsa_max_devs == 0) { - dev_warn(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - goto err_dt; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err_dt; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err_dt; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err_dt; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err_mem; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err_dev_node; - } - if (soc_find_component(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - - card->num_aux_devs = wsa_max_devs; - card->num_configs = wsa_max_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err_auxdev_mem; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err_codec_conf; - } - - for (i = 0; i < card->num_aux_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err_dev_str; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - wsa_auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err_dt_prop; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_init; - msm_codec_conf[i].dev_name = NULL; - msm_codec_conf[i].name_prefix = wsa_auxdev_name_prefix[0]; - msm_codec_conf[i].of_node = - wsa881x_dev_info[i].of_node; - } - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; - - return 0; - -err_dt_prop: - devm_kfree(&pdev->dev, dev_name_str); -err_dev_str: - devm_kfree(&pdev->dev, msm_codec_conf); -err_codec_conf: - devm_kfree(&pdev->dev, msm_aux_dev); -err_auxdev_mem: -err_dev_node: - devm_kfree(&pdev->dev, wsa881x_dev_info); -err_mem: -err_dt: - return ret; -} - -static void i2s_auxpcm_init(struct platform_device *pdev) -{ - struct resource *muxsel; - int count; - u32 mi2s_master_slave[MI2S_MAX]; - int ret; - char *str[PCM_I2S_SEL_MAX] = { - "lpaif_pri_mode_muxsel", - "lpaif_sec_mode_muxsel", - "lpaif_tert_mode_muxsel", - "lpaif_quat_mode_muxsel" - }; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - for (count = 0; count < AUX_PCM_MAX; count++) { - mutex_init(&auxpcm_intf_conf[count].lock); - auxpcm_intf_conf[count].ref_cnt = 0; - } - - for (count = 0; count < PCM_I2S_SEL_MAX; count++) { - mutex_init(&mi2s_auxpcm_conf[count].lock); - mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr = NULL; - } - - for (count = 0; count < PCM_I2S_SEL_MAX; count++) { - muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM, - str[count]); - if (muxsel) { - mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr - = ioremap(muxsel->start, resource_size(muxsel)); - } - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } -} - -static void i2s_auxpcm_deinit(void) -{ - int count; - - for (count = 0; count < PCM_I2S_SEL_MAX; count++) - if (mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr != - NULL) - iounmap( - mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr); -} - -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - const char *mbhc_audio_jack_type = NULL; - char *mclk_freq_prop_name; - const struct of_device_id *match; - int ret; - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "No platform supplied from device tree\n"); - return -EINVAL; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "parse card name failed, err:%d\n", - ret); - goto err; - } - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) { - dev_err(&pdev->dev, "parse audio routing failed, err:%d\n", - ret); - goto err; - } - - match = of_match_node(msm8998_asoc_machine_of_match, - pdev->dev.of_node); - if (!match) { - dev_err(&pdev->dev, "%s: no matched codec is found.\n", - __func__); - goto err; - } - - if (!strcmp(match->data, "tasha_codec")) - mclk_freq_prop_name = "qcom,tasha-mclk-clk-freq"; - else - mclk_freq_prop_name = "qcom,tavil-mclk-clk-freq"; - - ret = of_property_read_u32(pdev->dev.of_node, - mclk_freq_prop_name, &pdata->mclk_freq); - if (ret) { - dev_err(&pdev->dev, - "Looking up %s property in node %s failed, err%d\n", - mclk_freq_prop_name, - pdev->dev.of_node->full_name, ret); - goto err; - } - - if (pdata->mclk_freq != CODEC_EXT_CLK_RATE) { - dev_err(&pdev->dev, "unsupported mclk freq %u\n", - pdata->mclk_freq); - ret = -EINVAL; - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - ret = msm_init_wsa_dev(pdev, card); - if (ret) - goto err; - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) - ret = -EINVAL; - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - dev_info(&pdev->dev, "Sound card %s registered\n", card->name); - spdev = pdev; - - ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (ret) { - dev_dbg(&pdev->dev, "%s: failed to add child nodes, ret=%d\n", - __func__, ret); - } else { - pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!pdata->hph_en1_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en1-gpio", - pdev->dev.of_node->full_name); - } - - pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!pdata->hph_en0_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en0-gpio", - pdev->dev.of_node->full_name); - } - } - - ret = of_property_read_string(pdev->dev.of_node, - "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type); - if (ret) { - dev_dbg(&pdev->dev, "Looking up %s property in node %s failed", - "qcom,mbhc-audio-jack-type", - pdev->dev.of_node->full_name); - dev_dbg(&pdev->dev, "Jack type properties set to default"); - } else { - if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "This hardware has 4 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 5 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 6 pole jack"); - } else { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "Unknown value, set to default"); - } - } - /* - * Parse US-Euro gpio info from DT. Report no error if us-euro - * entry is not found in DT file as some targets do not support - * US-Euro detection - */ - pdata->us_euro_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!gpio_is_valid(pdata->us_euro_gpio)) - pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!gpio_is_valid(pdata->us_euro_gpio) && (!pdata->us_euro_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,us-euro-gpios", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "%s detected", - "qcom,us-euro-gpios"); - wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - } - - ret = msm_prepare_us_euro(card); - if (ret) - dev_dbg(&pdev->dev, "msm_prepare_us_euro failed (%d)\n", - ret); - - /* Parse pinctrl info from devicetree */ - ret = msm_get_pinctrl(pdev); - if (!ret) { - pr_debug("%s: pinctrl parsing successful\n", __func__); - } else { - dev_dbg(&pdev->dev, - "%s: Parsing pinctrl failed with %d. Cannot use Ports\n", - __func__, ret); - ret = 0; - } - - i2s_auxpcm_init(pdev); - - is_initial_boot = true; - ret = audio_notifier_register("msm8998", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - - return 0; -err: - if (pdata->us_euro_gpio > 0) { - dev_dbg(&pdev->dev, "%s free us_euro gpio %d\n", - __func__, pdata->us_euro_gpio); - gpio_free(pdata->us_euro_gpio); - pdata->us_euro_gpio = 0; - } - msm_release_pinctrl(pdev); - devm_kfree(&pdev->dev, pdata); - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - if (gpio_is_valid(pdata->us_euro_gpio)) - gpio_free(pdata->us_euro_gpio); - i2s_auxpcm_deinit(); - - snd_soc_unregister_card(card); - audio_notifier_deregister("msm8998"); - return 0; -} - -static struct platform_driver msm8998_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = msm8998_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; -module_platform_driver(msm8998_asoc_machine_driver); - -MODULE_DESCRIPTION("ALSA SoC msm"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, msm8998_asoc_machine_of_match); diff --git a/techpack/audio/asoc/platform_init.c b/techpack/audio/asoc/platform_init.c deleted file mode 100644 index 79d0e41998f5..000000000000 --- a/techpack/audio/asoc/platform_init.c +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright (c) 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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -* -*/ - -#include -#include -#include "platform_init.h" - -static int __init audio_platform_init(void) -{ - msm_compress_dsp_init(); - msm_fe_dai_init(); - msm_dai_q6_hdmi_init(); - msm_dai_q6_init(); - msm_dai_slim_init(); - msm_dai_stub_init(); - msm_lsm_client_init(); - msm_pcm_afe_init(); - msm_pcm_dtmf_init(); - msm_pcm_hostless_init(); - msm_voice_host_init(); - msm_pcm_loopback_init(); - msm_pcm_noirq_init(); - msm_pcm_dsp_init(); - msm_soc_routing_platform_init(); - msm_pcm_voice_init(); - msm_pcm_voip_init(); - msm_transcode_loopback_init(); - - return 0; -} - -static void audio_platform_exit(void) -{ - msm_transcode_loopback_exit(); - msm_pcm_voip_exit(); - msm_pcm_voice_exit(); - msm_soc_routing_platform_exit(); - msm_pcm_dsp_exit(); - msm_pcm_noirq_exit(); - msm_pcm_loopback_exit(); - msm_voice_host_exit(); - msm_pcm_hostless_exit(); - msm_pcm_dtmf_exit(); - msm_pcm_afe_exit(); - msm_lsm_client_exit(); - msm_dai_stub_exit(); - msm_dai_slim_exit(); - msm_dai_q6_exit(); - msm_dai_q6_hdmi_exit(); - msm_fe_dai_exit(); - msm_compress_dsp_exit(); -} - -module_init(audio_platform_init); -module_exit(audio_platform_exit); - -MODULE_DESCRIPTION("Audio Platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/asoc/platform_init.h b/techpack/audio/asoc/platform_init.h deleted file mode 100644 index db9b32d2ee5c..000000000000 --- a/techpack/audio/asoc/platform_init.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright (c) 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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -* -*/ - -#ifndef __PLATFORM_INIT_H__ -#define __PLATFORM_INIT_H__ -int msm_compress_dsp_init(void); -int msm_fe_dai_init(void); -int msm_dai_q6_hdmi_init(void); -int msm_dai_q6_init(void); -int msm_dai_slim_init(void); -int msm_dai_stub_init(void); -int msm_lsm_client_init(void); -int msm_pcm_afe_init(void); -int msm_pcm_dtmf_init(void); -int msm_pcm_hostless_init(void); -int msm_voice_host_init(void); -int msm_pcm_loopback_init(void); -int msm_pcm_noirq_init(void); -int msm_pcm_dsp_init(void); -int msm_soc_routing_platform_init(void); -int msm_pcm_voice_init(void); -int msm_pcm_voip_init(void); -int msm_transcode_loopback_init(void); -int msm_cpe_lsm_init(void); - -void msm_cpe_lsm_exit(void); -void msm_transcode_loopback_exit(void); -void msm_pcm_voip_exit(void); -void msm_pcm_voice_exit(void); -void msm_soc_routing_platform_exit(void); -void msm_pcm_dsp_exit(void); -void msm_pcm_noirq_exit(void); -void msm_pcm_loopback_exit(void); -void msm_voice_host_exit(void); -void msm_pcm_hostless_exit(void); -void msm_pcm_dtmf_exit(void); -void msm_pcm_afe_exit(void); -void msm_lsm_client_exit(void); -void msm_dai_stub_exit(void); -void msm_dai_slim_exit(void); -void msm_dai_q6_exit(void); -void msm_dai_q6_hdmi_exit(void); -void msm_fe_dai_exit(void); -void msm_compress_dsp_exit(void); - -#endif - diff --git a/techpack/audio/asoc/qcs405.c b/techpack/audio/asoc/qcs405.c deleted file mode 100644 index a0f54600e0bb..000000000000 --- a/techpack/audio/asoc/qcs405.c +++ /dev/null @@ -1,8645 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "device_event.h" -#include "msm-pcm-routing-v2.h" -#include "codecs/msm-cdc-pinctrl.h" -#include "codecs/wcd9335.h" -#include "codecs/wsa881x.h" -#include "codecs/csra66x0/csra66x0.h" -#include -#include "codecs/bolero/bolero-cdc.h" -#include "codecs/bolero/wsa-macro.h" - -#define DRV_NAME "qcs405-asoc-snd" - -#define __CHIPSET__ "QCS405 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define DEV_NAME_STR_LEN 32 - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define SPDIF_TX_CORE_CLK_163_P84_MHZ 163840000 -#define TLMM_EAST_SPARE 0x07BA0000 -#define TLMM_SPDIF_HDMI_ARC_CTL 0x07BA2000 - -#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 4 -#define TDM_CHANNEL_MAX 8 -#define BT_SLIM_TX SLIM_TX_9 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ - -enum { - SLIM_RX_0 = 0, - SLIM_RX_1, - SLIM_RX_2, - SLIM_RX_3, - SLIM_RX_4, - SLIM_RX_5, - SLIM_RX_6, - SLIM_RX_7, - SLIM_RX_MAX, -}; - -enum { - SLIM_TX_0 = 0, - SLIM_TX_1, - SLIM_TX_2, - SLIM_TX_3, - SLIM_TX_4, - SLIM_TX_5, - SLIM_TX_6, - SLIM_TX_7, - SLIM_TX_8, - SLIM_TX_9, - SLIM_TX_MAX, -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - QUIN_MI2S, - SEN_MI2S, - MI2S_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - QUIN_AUX_PCM, - SEN_AUX_PCM, - AUX_PCM_MAX, -}; - -enum { - WSA_CDC_DMA_RX_0 = 0, - WSA_CDC_DMA_RX_1, - CDC_DMA_RX_MAX, -}; - -enum { - WSA_CDC_DMA_TX_0 = 0, - WSA_CDC_DMA_TX_1, - WSA_CDC_DMA_TX_2, - VA_CDC_DMA_TX_0, - VA_CDC_DMA_TX_1, - CDC_DMA_TX_MAX, -}; - -enum { - PRIM_SPDIF_RX = 0, - SEC_SPDIF_RX, - SPDIF_RX_MAX, -}; - -enum { - PRIM_SPDIF_TX = 0, - SEC_SPDIF_TX, - SPDIF_TX_MAX, -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEN_MI2S_EBIT -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct msm_csra66x0_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct msm_asoc_mach_data { - struct snd_info_entry *codec_root; - struct device_node *dmic_01_gpio_p; /* used by pinctrl API */ - struct device_node *dmic_23_gpio_p; /* used by pinctrl API */ - struct device_node *dmic_45_gpio_p; /* used by pinctrl API */ - struct device_node *dmic_67_gpio_p; /* used by pinctrl API */ - struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */ - int dmic_01_gpio_cnt; - int dmic_23_gpio_cnt; - int dmic_45_gpio_cnt; - int dmic_67_gpio_cnt; - struct regulator *tdm_micb_supply; - u32 tdm_micb_voltage; - u32 tdm_micb_current; - bool codec_is_csra; -}; - -struct msm_asoc_wcd93xx_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); -}; - -static const char *const pin_states[] = {"sleep", "i2s-active", - "tdm-active"}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_QUIN, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } -}; - - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SLIM_TX_9] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -/* Default configuration of Codec DMA Interface Tx */ -static struct dev_config cdc_dma_rx_cfg[] = { - [WSA_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of Codec DMA Interface Rx */ -static struct dev_config cdc_dma_tx_cfg[] = { - [WSA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [VA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, - [VA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of SPDIF channels */ -static struct dev_config spdif_rx_cfg[] = { - [PRIM_SPDIF_RX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_SPDIF_RX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config spdif_tx_cfg[] = { - [PRIM_SPDIF_TX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_SPDIF_TX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static int msm_vi_feed_tx_ch = 2; -static const char *const slim_rx_ch_text[] = {"One", "Two"}; -static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_48", "KHZ_176P4", - "KHZ_352P8"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16", - "KHZ_22P05", "KHZ_32", "KHZ_44P1", - "KHZ_48", "KHZ_96", "KHZ_192", "KHZ_384"}; -static const char *const mi2s_ch_text[] = { - "One", "Two", "Three", "Four", "Five", "Six", "Seven", - "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", - "Fourteen", "Fifteen", "Sixteen" -}; -static const char *const qos_text[] = {"Disable", "Enable"}; - -static const char *const cdc_dma_rx_ch_text[] = {"One", "Two"}; -static const char *const cdc_dma_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *cdc_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; - -static const char *spdif_rate_text[] = {"KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192"}; -static const char *spdif_ch_text[] = {"One", "Two"}; -static const char *spdif_bit_format_text[] = {"S16_LE", "S24_LE"}; - -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_sink, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(spdif_rx_sample_rate, spdif_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(spdif_tx_sample_rate, spdif_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(spdif_rx_chs, spdif_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(spdif_tx_chs, spdif_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(spdif_rx_format, spdif_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(spdif_tx_format, spdif_bit_format_text); - -static struct platform_device *spdev; - -static bool is_initial_boot; -static bool codec_reg_done; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; -static struct msm_asoc_wcd93xx_codec msm_codec_fn; - -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm); -static int msm_wsa881x_init(struct snd_soc_component *component); -static int msm_snd_vad_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - -static struct snd_soc_dapm_route wcd_audio_paths[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS2", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } - -}; - -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; - -static int slim_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 10; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int slim_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int slim_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - val = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int slim_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - bit_fmt = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int slim_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) { - port_id = SLIM_RX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_2_RX", sizeof("SLIM_2_RX"))) { - port_id = SLIM_RX_2; - } else if (strnstr(kcontrol->id.name, - "SLIM_5_RX", sizeof("SLIM_5_RX"))) { - port_id = SLIM_RX_5; - } else if (strnstr(kcontrol->id.name, - "SLIM_6_RX", sizeof("SLIM_6_RX"))) { - port_id = SLIM_RX_6; - } else if (strnstr(kcontrol->id.name, - "SLIM_0_TX", sizeof("SLIM_0_TX"))) { - port_id = SLIM_TX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_1_TX", sizeof("SLIM_1_TX"))) { - port_id = SLIM_TX_1; - } else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].sample_rate = - slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate = 0; - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - if (sample_rate == SAMPLING_RATE_44P1KHZ) { - pr_err("%s: Unsupported sample rate %d: for Tx path\n", - __func__, sample_rate); - return -EINVAL; - } - slim_tx_cfg[ch_num].sample_rate = sample_rate; - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - - return 1; -} - -static int slim_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_bt_sample_rate_sink_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_tx_cfg[BT_SLIM_TX].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d", __func__, - slim_tx_cfg[BT_SLIM_TX].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_sink_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_tx_cfg[BT_SLIM_TX].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate = %d, value = %d\n", - __func__, - slim_tx_cfg[BT_SLIM_TX].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx = 0; - - if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_0", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_1", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_1; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_0", - sizeof("WSA_CDC_DMA_TX_0"))) - idx = WSA_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_1", - sizeof("WSA_CDC_DMA_TX_1"))) - idx = WSA_CDC_DMA_TX_1; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_2", - sizeof("WSA_CDC_DMA_TX_2"))) - idx = WSA_CDC_DMA_TX_2; - else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_0", - sizeof("VA_CDC_DMA_TX_0"))) - idx = VA_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_1", - sizeof("VA_CDC_DMA_TX_1"))) - idx = VA_CDC_DMA_TX_1; - else { - pr_err("%s: unsupported port: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return idx; -} - -static int cdc_dma_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels - 1); - ucontrol->value.integer.value[0] = cdc_dma_rx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - cdc_dma_rx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - switch (cdc_dma_rx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int cdc_dma_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int cdc_dma_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 11: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 12: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - - -static int cdc_dma_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - cdc_dma_get_sample_rate_val(cdc_dma_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: cdc_dma_rx_sample_rate = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - cdc_dma_rx_cfg[ch_num].sample_rate = - cdc_dma_get_sample_rate(ucontrol->value.enumerated.item[0]); - - - pr_debug("%s: control value = %d, cdc_dma_rx_sample_rate = %d\n", - __func__, ucontrol->value.enumerated.item[0], - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - ucontrol->value.integer.value[0] = cdc_dma_tx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - cdc_dma_tx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - switch (cdc_dma_tx_cfg[ch_num].sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: cdc_dma_tx_sample_rate = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - switch (ucontrol->value.integer.value[0]) { - case 12: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, cdc_dma_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - switch (cdc_dma_tx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 5; - break; - default: - sample_rate_val = 3; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - port->mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUAT; - } else if (strnstr(kcontrol->id.name, "QUIN", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUIN; - } else { - pr_err("%s: unsupported mode in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - port->channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - port->channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - port->channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - port->channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - port->channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - port->channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - port->channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - port->channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - } else - return -EINVAL; - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) - idx = PRIM_AUX_PCM; - else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) - idx = SEC_AUX_PCM; - else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) - idx = TERT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) - idx = QUAT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", - sizeof("QUIN_AUX_PCM"))) - idx = QUIN_AUX_PCM; - else if (strnstr(kcontrol->id.name, "SEN_AUX_PCM", - sizeof("SENN_AUX_PCM"))) - idx = SEN_AUX_PCM; - else { - pr_err("%s: unsupported port: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", - sizeof("QUIN_MI2S_RX"))) - idx = QUIN_MI2S; - else if (strnstr(kcontrol->id.name, "SEN_MI2S_RX", - sizeof("SEN_MI2S_RX"))) - idx = SEN_MI2S; - else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", - sizeof("QUIN_MI2S_TX"))) - idx = QUIN_MI2S; - else if (strnstr(kcontrol->id.name, "SEN_MI2S_TX", - sizeof("SEN_MI2S_TX"))) - idx = SEN_MI2S; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 9; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_auxpcm_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_auxpcm_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_component *component = NULL; - struct snd_soc_card *card = NULL; - int idx = mi2s_get_port_idx(kcontrol); - - component = snd_soc_kcontrol_component(kcontrol); - card = kcontrol->private_data; - pdata = snd_soc_card_get_drvdata(card); - - if (idx < 0) - return idx; - - /* check for PRIM_MI2S and CSRAx config to allow 24bit BE config only */ - if ((PRIM_MI2S == idx) && (true==pdata->codec_is_csra)) - { - mi2s_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - pr_debug("%s: Keeping default format idx[%d]_rx_format = %d, item = %d\n", - __func__, idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - } else { - mi2s_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - } - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int spdif_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_SPDIF_RX", - sizeof("PRIM_SPDIF_RX"))) - idx = PRIM_SPDIF_RX; - else if (strnstr(kcontrol->id.name, "SEC_SPDIF_RX", - sizeof("SEC_SPDIF_RX"))) - idx = SEC_SPDIF_RX; - else if (strnstr(kcontrol->id.name, "PRIM_SPDIF_TX", - sizeof("PRIM_SPDIF_TX"))) - idx = PRIM_SPDIF_TX; - else if (strnstr(kcontrol->id.name, "SEC_SPDIF_TX", - sizeof("SEC_SPDIF_TX"))) - idx = SEC_SPDIF_TX; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int spdif_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_32KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 6; - break; - default: - sample_rate_val = 2; - break; - } - return sample_rate_val; -} - -static int spdif_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int spdif_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int spdif_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - default: - value = 0; - break; - } - return value; -} - -static int msm_spdif_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - spdif_rx_cfg[idx].sample_rate = - spdif_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, spdif_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_spdif_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - spdif_get_sample_rate_val(spdif_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, spdif_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_spdif_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - spdif_tx_cfg[idx].sample_rate = - spdif_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, spdif_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_spdif_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - spdif_get_sample_rate_val(spdif_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, spdif_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_spdif_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_spdif_[%d]_rx_ch = %d\n", __func__, - idx, spdif_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = spdif_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_spdif_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - spdif_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_spdif_[%d]_rx_ch = %d\n", __func__, - idx, spdif_rx_cfg[idx].channels); - - return 1; -} - -static int msm_spdif_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_spdif_[%d]_tx_ch = %d\n", __func__, - idx, spdif_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = spdif_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_spdif_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - spdif_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_spdif_[%d]_tx_ch = %d\n", __func__, - idx, spdif_tx_cfg[idx].channels); - - return 1; -} - -static int msm_spdif_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - spdif_get_format_value(spdif_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, spdif_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_spdif_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - spdif_rx_cfg[idx].bit_format = - spdif_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, spdif_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_spdif_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - spdif_get_format_value(spdif_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, spdif_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_spdif_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = spdif_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - spdif_tx_cfg[idx].bit_format = - spdif_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, spdif_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static const struct snd_kcontrol_new msm_snd_sb_controls[] = { - SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format, - slim_tx_bit_format_get, slim_tx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate, - slim_tx_sample_rate_get, slim_tx_sample_rate_put), - SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_snd_va_controls[] = { - SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Channels", va_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Channels", va_cdc_dma_tx_1_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Format", va_cdc_dma_tx_0_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Format", va_cdc_dma_tx_1_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_0 SampleRate", - va_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("VA_CDC_DMA_TX_1 SampleRate", - va_cdc_dma_tx_1_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_snd_wsa_controls[] = { - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Channels", wsa_cdc_dma_rx_0_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Channels", wsa_cdc_dma_rx_1_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 Channels", wsa_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Channels", wsa_cdc_dma_tx_1_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Channels", wsa_cdc_dma_tx_2_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Format", wsa_cdc_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Format", wsa_cdc_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Format", wsa_cdc_dma_tx_1_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Format", wsa_cdc_dma_tx_2_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 SampleRate", - wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 SampleRate", - wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 SampleRate", - wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 SampleRate", - wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 SampleRate", - wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("BT_TX SampleRate", bt_sample_rate_sink, - msm_bt_sample_rate_sink_get, - msm_bt_sample_rate_sink_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("BT_RX SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEN_AUX_PCM_TX SampleRate", sen_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEN_MI2S_RX SampleRate", sen_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEN_MI2S_TX SampleRate", sen_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEN_MI2S_RX Channels", sen_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEN_MI2S_TX Channels", sen_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_SINGLE_MULTI_EXT("VAD CFG", SND_SOC_NOPM, 0, 1000, 0, 3, NULL, - msm_snd_vad_cfg_put), - SOC_ENUM_EXT("PRIM_SPDIF_RX SampleRate", spdif_rx_sample_rate, - msm_spdif_rx_sample_rate_get, - msm_spdif_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_SPDIF_TX SampleRate", spdif_tx_sample_rate, - msm_spdif_tx_sample_rate_get, - msm_spdif_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_SPDIF_RX SampleRate", spdif_rx_sample_rate, - msm_spdif_rx_sample_rate_get, - msm_spdif_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_SPDIF_TX SampleRate", spdif_tx_sample_rate, - msm_spdif_tx_sample_rate_get, - msm_spdif_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_SPDIF_RX Channels", spdif_rx_chs, - msm_spdif_rx_ch_get, msm_spdif_rx_ch_put), - SOC_ENUM_EXT("PRIM_SPDIF_TX Channels", spdif_tx_chs, - msm_spdif_tx_ch_get, msm_spdif_tx_ch_put), - SOC_ENUM_EXT("SEC_SPDIF_RX Channels", spdif_rx_chs, - msm_spdif_rx_ch_get, msm_spdif_rx_ch_put), - SOC_ENUM_EXT("SEC_SPDIF_TX Channels", spdif_tx_chs, - msm_spdif_tx_ch_get, msm_spdif_tx_ch_put), - SOC_ENUM_EXT("PRIM_SPDIF_RX Format", spdif_rx_format, - msm_spdif_rx_format_get, msm_spdif_rx_format_put), - SOC_ENUM_EXT("PRIM_SPDIF_TX Format", spdif_tx_format, - msm_spdif_tx_format_get, msm_spdif_tx_format_put), - SOC_ENUM_EXT("SEC_SPDIF_RX Format", spdif_rx_format, - msm_spdif_rx_format_get, msm_spdif_rx_format_put), - SOC_ENUM_EXT("SEC_SPDIF_TX Format", spdif_tx_format, - msm_spdif_tx_format_get, msm_spdif_tx_format_put), -}; - -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tasha_codec")) { - ret = tasha_cdc_mclk_enable(codec, enable, dapm); - } else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tasha_codec")) { - ret = tasha_cdc_mclk_tx_enable(codec, enable, dapm); - } else { - dev_err(codec->dev, "%s: unknown codec to enable TX ext clk\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_tx_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_tx_clk(codec, 0, true); - } - return 0; -} - -static int msm_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_clk(codec, 0, true); - } - return 0; -} - -static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, - msm_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0, - msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIC("Analog Mic3", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - -}; - -static int msm_dmic_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - uint32_t dmic_idx; - int *dmic_gpio_cnt; - struct device_node *dmic_gpio; - char *wname; - - wname = strpbrk(w->name, "01234567"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic_idx); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - pdata = snd_soc_card_get_drvdata(codec->component.card); - - switch (dmic_idx) { - case 0: - case 1: - dmic_gpio_cnt = &pdata->dmic_01_gpio_cnt; - dmic_gpio = pdata->dmic_01_gpio_p; - break; - case 2: - case 3: - dmic_gpio_cnt = &pdata->dmic_23_gpio_cnt; - dmic_gpio = pdata->dmic_23_gpio_p; - break; - case 4: - case 5: - dmic_gpio_cnt = &pdata->dmic_45_gpio_cnt; - dmic_gpio = pdata->dmic_45_gpio_p; - break; - case 6: - case 7: - dmic_gpio_cnt = &pdata->dmic_67_gpio_cnt; - dmic_gpio = pdata->dmic_67_gpio_p; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n", - __func__, event, dmic_idx, *dmic_gpio_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - (*dmic_gpio_cnt)++; - if (*dmic_gpio_cnt == 1) { - ret = msm_cdc_pinctrl_select_active_state( - dmic_gpio); - if (ret < 0) { - dev_err(codec->dev, "%s: gpio set cannot be activated %sd\n", - __func__, "dmic_gpio"); - return ret; - } - } - break; - case SND_SOC_DAPM_POST_PMD: - (*dmic_gpio_cnt)--; - if (*dmic_gpio_cnt == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - dmic_gpio); - if (ret < 0) { - dev_err(codec->dev, "%s: gpio set cannot be de-activated %sd\n", - __func__, "dmic_gpio"); - return ret; - } - } - break; - default: - dev_err(codec->dev, "%s: invalid DAPM event %d\n", - __func__, event); - return -EINVAL; - } - return 0; -} - - -static const struct snd_soc_dapm_widget msm_va_dapm_widgets[] = { - - SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic5", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic6", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic7", msm_dmic_event), -}; - -static const struct snd_soc_dapm_widget msm_wsa_dapm_widgets[] = { - -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, - unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int msm_slim_get_ch_from_beid(int32_t be_id) -{ - int ch_id = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - ch_id = SLIM_RX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - ch_id = SLIM_RX_1; - break; - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - ch_id = SLIM_RX_2; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - ch_id = SLIM_RX_3; - break; - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - ch_id = SLIM_RX_4; - break; - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - ch_id = SLIM_RX_6; - break; - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - ch_id = SLIM_TX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - ch_id = SLIM_TX_3; - break; - default: - ch_id = SLIM_RX_0; - break; - } - - return ch_id; -} - -static int msm_vad_get_portid_from_beid(int32_t be_id, int *port_id) -{ - *port_id = 0xFFFF; - - switch (be_id) { - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - *port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - *port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - *port_id = AFE_PORT_ID_QUINARY_TDM_TX; - break; - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - *port_id = AFE_PORT_ID_QUINARY_PCM_TX; - break; - default: - return -EINVAL; - } - return 0; -} - -static int msm_cdc_dma_get_idx_from_beid(int32_t be_id) -{ - int idx = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - idx = WSA_CDC_DMA_RX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - idx = WSA_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - idx = WSA_CDC_DMA_RX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - idx = WSA_CDC_DMA_TX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - idx = WSA_CDC_DMA_TX_2; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - idx = VA_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - idx = VA_CDC_DMA_TX_1; - break; - default: - idx = VA_CDC_DMA_TX_0; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - void *config = NULL; - struct snd_soc_codec *codec = NULL; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[idx].bit_format); - rate->min = rate->max = slim_rx_cfg[idx].sample_rate; - channels->min = channels->max = slim_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[idx].bit_format); - rate->min = rate->max = slim_tx_cfg[idx].sample_rate; - channels->min = channels->max = slim_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_1_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[1].bit_format); - rate->min = rate->max = slim_tx_cfg[1].sample_rate; - channels->min = channels->max = slim_tx_cfg[1].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_4_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[5].bit_format); - rate->min = rate->max = slim_rx_cfg[5].sample_rate; - channels->min = channels->max = slim_rx_cfg[5].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_TX: - codec = rtd->codec; - rate->min = rate->max = SAMPLING_RATE_16KHZ; - channels->min = channels->max = 1; - - config = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_PORT_CONFIG); - if (config) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, - config, SLIMBUS_5_TX); - if (rc) - pr_err("%s: Failed to set slimbus slave port config %d\n", - __func__, rc); - } - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_9_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[SLIM_TX_9].bit_format); - rate->min = rate->max = slim_tx_cfg[SLIM_TX_9].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_9].channels; - break; - - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SENARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SENARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEN_MI2S].channels; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_rx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_rx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_tx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_PRI_SPDIF_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - spdif_rx_cfg[PRIM_SPDIF_RX].bit_format); - rate->min = rate->max = - spdif_rx_cfg[PRIM_SPDIF_RX].sample_rate; - channels->min = channels->max = - spdif_rx_cfg[PRIM_SPDIF_RX].channels; - break; - - case MSM_BACKEND_DAI_PRI_SPDIF_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - spdif_tx_cfg[PRIM_SPDIF_TX].bit_format); - rate->min = rate->max = - spdif_tx_cfg[PRIM_SPDIF_TX].sample_rate; - channels->min = channels->max = - spdif_tx_cfg[PRIM_SPDIF_TX].channels; - break; - - case MSM_BACKEND_DAI_SEC_SPDIF_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - spdif_rx_cfg[SEC_SPDIF_RX].bit_format); - rate->min = rate->max = - spdif_rx_cfg[SEC_SPDIF_RX].sample_rate; - channels->min = channels->max = - spdif_rx_cfg[SEC_SPDIF_RX].channels; - break; - - case MSM_BACKEND_DAI_SEC_SPDIF_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - spdif_tx_cfg[SEC_SPDIF_TX].bit_format); - rate->min = rate->max = - spdif_tx_cfg[SEC_SPDIF_TX].sample_rate; - channels->min = channels->max = - spdif_tx_cfg[SEC_SPDIF_TX].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - - return rc; -} - -static int msm_afe_set_config(struct snd_soc_codec *codec) -{ - int ret = 0; - void *config_data = NULL; - - if (!msm_codec_fn.get_afe_config_fn) { - dev_err(codec->dev, "%s: codec get afe config not init'ed\n", - __func__); - return -EINVAL; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set codec registers config %d\n", - __func__, ret); - return ret; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (ret) - dev_err(codec->dev, - "%s: Failed to set cdc register page config\n", - __func__); - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set slimbus slave config %d\n", - __func__, ret); - return ret; - } - } - - return 0; -} - -static void msm_afe_clear_config(void) -{ - afe_clear_config(AFE_CDC_REGISTERS_CONFIG); - afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); -} - -static int msm_adsp_power_up_config(struct snd_soc_codec *codec, - struct snd_card *card) -{ - int ret = 0; - unsigned long timeout; - int adsp_ready = 0; - bool snd_card_online = 0; - - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - - do { - if (!snd_card_online) { - snd_card_online = snd_card_is_online_state(card); - pr_debug("%s: Sound card is %s\n", __func__, - snd_card_online ? "Online" : "Offline"); - } - if (!adsp_ready) { - adsp_ready = q6core_is_adsp_ready(); - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - } - if (snd_card_online && adsp_ready) - break; - - /* - * Sound card/ADSP will be coming up after subsystem restart and - * it might not be fully up when the control reaches - * here. So, wait for 50msec before checking ADSP state - */ - msleep(50); - } while (time_after(timeout, jiffies)); - - if (!snd_card_online || !adsp_ready) { - pr_err("%s: Timeout. Sound card is %s, ADSP Audio is %s\n", - __func__, - snd_card_online ? "Online" : "Offline", - adsp_ready ? "ready" : "not ready"); - ret = -ETIMEDOUT; - goto err; - } - - ret = msm_afe_set_config(codec); - if (ret) - pr_err("%s: Failed to set AFE config. err %d\n", - __func__, ret); - - return 0; - -err: - return ret; -} - -static int qcs405_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - int ret; - struct snd_soc_card *card = NULL; - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore initial boot notifications - * On initial boot msm_adsp_power_up_config is - * called on init. There is no need to clear - * and set the config again on initial boot. - */ - if (is_initial_boot) - break; - msm_afe_clear_config(); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (is_initial_boot) { - is_initial_boot = false; - break; - } - if (!spdev) - return -EINVAL; - - card = platform_get_drvdata(spdev); - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err; - } - codec = rtd->codec; - - ret = msm_adsp_power_up_config(codec, card->snd_card); - if (ret < 0) { - dev_err(card->dev, - "%s: msm_adsp_power_up_config failed ret = %d!\n", - __func__, ret); - goto err; - } - break; - default: - break; - } -err: - return NOTIFY_OK; -} - -static struct notifier_block service_nb = { - .notifier_call = qcs405_notifier_service_cb, - .priority = -INT_MAX, -}; - -static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_card *card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* - * Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156}; - unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - pr_info("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_snd_sb_controls, - ARRAY_SIZE(msm_snd_sb_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets, - ARRAY_SIZE(msm_dapm_widgets)); - - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - - snd_soc_dapm_sync(dapm); - - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); - - msm_codec_fn.get_afe_config_fn = tasha_get_afe_config; - - ret = msm_adsp_power_up_config(codec, rtd->card->snd_card); - if (ret) { - dev_err(codec->dev, "%s: Failed to set AFE config %d\n", - __func__, ret); - goto err; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - dev_err(codec->dev, "%s: Failed to set aanc version %d\n", - __func__, ret); - goto err; - } - } - - card = rtd->card->snd_card; - if (!pdata->codec_root) - pdata->codec_root = snd_info_create_subdir(card->module, - "codecs", card->proc_root); - if (!pdata->codec_root) { - dev_dbg(codec->dev, "%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - tasha_codec_info_create_codec_entry(pdata->codec_root, codec); - - codec_reg_done = true; - return 0; - -err: - return ret; -} - -static int msm_va_cdc_dma_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_card *card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - ret = snd_soc_add_codec_controls(codec, msm_snd_va_controls, - ARRAY_SIZE(msm_snd_va_controls)); - if (ret < 0) { - dev_err(codec->dev, "%s: add_codec_controls for va failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_va_dapm_widgets, - ARRAY_SIZE(msm_va_dapm_widgets)); - - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic7"); - - snd_soc_dapm_sync(dapm); - - card = rtd->card->snd_card; - if (!pdata->codec_root) - pdata->codec_root = snd_info_create_subdir(card->module, - "codecs", card->proc_root); - if (!pdata->codec_root) { - dev_dbg(codec->dev, "%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto done; - } - bolero_info_create_codec_entry(pdata->codec_root, codec); -done: - return ret; -} - -static int msm_wsa_cdc_dma_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - ret = snd_soc_add_codec_controls(codec, msm_snd_wsa_controls, - ARRAY_SIZE(msm_snd_wsa_controls)); - if (ret < 0) { - dev_err(codec->dev, "%s: add_codec_controls for wsa failed, err %d\n", - __func__, ret); - return ret; - } - snd_soc_dapm_new_controls(dapm, msm_wsa_dapm_widgets, - ARRAY_SIZE(msm_wsa_dapm_widgets)); - - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA AIF VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA"); - - snd_soc_dapm_sync(dapm); - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - dev_dbg(codec->dev, "%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->component_dev_list)) { - aux_comp = list_first_entry( - &rtd->card->component_dev_list, - struct snd_soc_component, - card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - wsa_macro_set_spkr_mode(rtd->codec, - WSA_MACRO_SPKR_MODE_1); - wsa_macro_set_spkr_gain_offset(rtd->codec, - WSA_MACRO_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - if (!pdata->codec_root) - pdata->codec_root = snd_info_create_subdir(card->module, - "codecs", card->proc_root); - if (!pdata->codec_root) { - dev_dbg(codec->dev, "%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto done; - } - bolero_info_create_codec_entry(pdata->codec_root, codec); -done: - return ret; -} - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161, 162}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 rx_ch_count; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) { - pr_debug("%s: rx_5_ch=%d\n", __func__, - slim_rx_cfg[5].channels); - rx_ch_count = slim_rx_cfg[5].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) { - pr_debug("%s: rx_2_ch=%d\n", __func__, - slim_rx_cfg[2].channels); - rx_ch_count = slim_rx_cfg[2].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) { - pr_debug("%s: rx_6_ch=%d\n", __func__, - slim_rx_cfg[6].channels); - rx_ch_count = slim_rx_cfg[6].channels; - } else { - pr_debug("%s: rx_0_ch=%d\n", __func__, - slim_rx_cfg[0].channels); - rx_ch_count = slim_rx_cfg[0].channels; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - rx_ch_count, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - - pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__, - codec_dai->name, codec_dai->id, user_set_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get tx codec chan map, err:%d\n", - __func__, ret); - goto err; - } - /* For _tx1 case */ - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX) - user_set_tx_ch = slim_tx_cfg[0].channels; - /* For _tx3 case */ - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX) - user_set_tx_ch = slim_tx_cfg[1].channels; - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX) - user_set_tx_ch = msm_vi_feed_tx_ch; - else - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), BE id (%d)\n", - __func__, slim_tx_cfg[0].channels, user_set_tx_ch, - tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set tx cpu chan map, err:%d\n", - __func__, ret); - } - -err: - return ret; -} - - -static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch_cdc_dma, tx_ch_cdc_dma; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 user_set_rx_ch = 0; - u32 ch_id; - - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, &tx_ch_cdc_dma, &rx_ch_cnt, - &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d rx_ch=%d\n", __func__, - ch_id, cdc_dma_rx_cfg[ch_id].channels); - user_set_rx_ch = cdc_dma_rx_cfg[ch_id].channels; - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - user_set_rx_ch, &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - - } - break; - } - } else { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - { - user_set_tx_ch = msm_vi_feed_tx_ch; - } - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d tx_ch=%d\n", __func__, - ch_id, cdc_dma_tx_cfg[ch_id].channels); - user_set_tx_ch = cdc_dma_tx_cfg[ch_id].channels; - } - break; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, user_set_tx_ch, - &tx_ch_cdc_dma, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -err: - return ret; -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SENARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SENARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SENARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SENARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - -err: - return ret; -} - - -static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - if (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - } else if (cpu_dai->id == AFE_PORT_ID_SECONDARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - } else if (cpu_dai->id == AFE_PORT_ID_QUINARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - } else { - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n", - __func__, cpu_dai->id, channels->max, rate->max, - params_format(params)); - - return 0; -} - -static int qcs405_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int slot_width = 32; - int channels, slots = 8; - unsigned int slot_mask, rate, clk_freq; - unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28}; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - channels = tdm_rx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - channels = tdm_rx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - channels = tdm_rx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - channels = tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - channels = tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - channels = tdm_tx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - channels = tdm_tx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - channels = tdm_tx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - channels = tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - break; - case AFE_PORT_ID_QUINARY_TDM_TX: - channels = tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - break; - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-channels); - - pr_debug("%s: tdm rx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm rx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set tdm rx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-channels); - - pr_debug("%s: tdm tx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm tx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - channels, slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set tdm tx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - -end: - return ret; -} - -static int msm_get_tdm_mode(u32 port_id) -{ - u32 tdm_mode; - - switch (port_id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - tdm_mode = TDM_PRI; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - tdm_mode = TDM_SEC; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - tdm_mode = TDM_TERT; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - tdm_mode = TDM_QUAT; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - tdm_mode = TDM_QUIN; - break; - default: - pr_err("%s: Invalid port id: %d\n", __func__, port_id); - tdm_mode = -EINVAL; - } - return tdm_mode; -} - -static int qcs405_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - u32 tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode >= TDM_INTERFACE_MAX) { - ret = -EINVAL; - pr_err("%s: Invalid TDM interface %d\n", - __func__, ret); - return ret; - } - - if (pdata->mi2s_gpio_p[tdm_mode]) { - ret = msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[tdm_mode]); - if (ret) - pr_err("%s: TDM GPIO pinctrl set active failed with %d\n", - __func__, ret); - } - - /* Enable Mic bias for TDM Mics */ - if (cpu_dai->id == AFE_PORT_ID_QUINARY_TDM_TX) { - if (pdata->tdm_micb_supply) { - ret = regulator_set_voltage(pdata->tdm_micb_supply, - pdata->tdm_micb_voltage, - pdata->tdm_micb_voltage); - if (ret) { - pr_err("%s: Setting voltage failed, err = %d\n", - __func__, ret); - return ret; - } - ret = regulator_set_load(pdata->tdm_micb_supply, - pdata->tdm_micb_current); - if (ret) { - pr_err("%s: Setting current failed, err = %d\n", - __func__, ret); - return ret; - } - ret = regulator_enable(pdata->tdm_micb_supply); - if (ret) { - pr_err("%s: regulator enable failed, err = %d\n", - __func__, ret); - return ret; - } - } - } - - return ret; -} - -static void qcs405_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - u32 tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (cpu_dai->id == AFE_PORT_ID_QUINARY_TDM_TX) { - if (pdata->tdm_micb_supply) { - ret = regulator_disable(pdata->tdm_micb_supply); - if (ret) - pr_err("%s: regulator disable failed, err = %d\n", - __func__, ret); - regulator_set_voltage(pdata->tdm_micb_supply, 0, - pdata->tdm_micb_voltage); - regulator_set_load(pdata->tdm_micb_supply, 0); - } - } - - if (pdata->mi2s_gpio_p[tdm_mode]) { - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[tdm_mode]); - if (ret) - pr_err("%s: TDM GPIO pinctrl set sleep failed with %d\n", - __func__, ret); - } -} - -static struct snd_soc_ops qcs405_tdm_be_ops = { - .hw_params = qcs405_tdm_snd_hw_params, - .startup = qcs405_tdm_snd_startup, - .shutdown = qcs405_tdm_snd_shutdown -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - - int index = cpu_dai->id; - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - /* - * Mutex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[index]); - } -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -err: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (index < PRIM_MI2S || index >= MI2S_MAX) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[index]); - - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - } - mutex_unlock(&mi2s_intf_conf[index].lock); -} - -static int msm_spdif_set_clk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = cpu_dai->id; - struct afe_clk_set clk_cfg; - - clk_cfg.clk_set_minor_version = Q6AFE_LPASS_CLK_CONFIG_API_VERSION; - clk_cfg.clk_attri = Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; - clk_cfg.clk_root = Q6AFE_LPASS_CLK_ROOT_DEFAULT; - clk_cfg.enable = enable; - - /* Set core clock (based on sample rate for RX, fixed for TX) */ - switch (port_id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - clk_cfg.clk_id = AFE_CLOCK_SET_CLOCK_ID_PRI_SPDIF_OUTPUT_CORE; - /* rate x 2ch x 2_for_biphase_coding x 32_bits_per_sample */ - clk_cfg.clk_freq_in_hz = - spdif_rx_cfg[PRIM_SPDIF_RX].sample_rate * 2 * 2 * 32; - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - clk_cfg.clk_id = AFE_CLOCK_SET_CLOCK_ID_SEC_SPDIF_OUTPUT_CORE; - clk_cfg.clk_freq_in_hz = - spdif_rx_cfg[SEC_SPDIF_RX].sample_rate * 2 * 2 * 32; - break; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - clk_cfg.clk_id = AFE_CLOCK_SET_CLOCK_ID_PRI_SPDIF_INPUT_CORE; - clk_cfg.clk_freq_in_hz = SPDIF_TX_CORE_CLK_163_P84_MHZ; - break; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - clk_cfg.clk_id = AFE_CLOCK_SET_CLOCK_ID_SEC_SPDIF_INPUT_CORE; - clk_cfg.clk_freq_in_hz = SPDIF_TX_CORE_CLK_163_P84_MHZ; - break; - } - - ret = afe_set_lpass_clock_v2(port_id, &clk_cfg); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - - /* Set NPL clock for RX in addition */ - switch (port_id) { - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - clk_cfg.clk_id = AFE_CLOCK_SET_CLOCK_ID_PRI_SPDIF_OUTPUT_NPL; - - ret = afe_set_lpass_clock_v2(port_id, &clk_cfg); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe NPL failed port 0x%x, err:%d\n", - __func__, port_id, ret); - goto err; - } - break; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - clk_cfg.clk_id = AFE_CLOCK_SET_CLOCK_ID_SEC_SPDIF_OUTPUT_NPL; - - ret = afe_set_lpass_clock_v2(port_id, &clk_cfg); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe NPL failed for port 0x%x, err:%d\n", - __func__, port_id, ret); - goto err; - } - break; - } - - if (enable) { - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - clk_cfg.clk_freq_in_hz); - } - -err: - return ret; -} - -static int msm_spdif_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = cpu_dai->id; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (port_id < AFE_PORT_ID_PRIMARY_SPDIF_RX || - port_id > AFE_PORT_ID_SECONDARY_SPDIF_TX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - - ret = msm_spdif_set_clk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable (%d), err:%d\n", - __func__, port_id, ret); - } -err: - return ret; -} - -static void msm_spdif_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int port_id = rtd->cpu_dai->id; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (port_id < AFE_PORT_ID_PRIMARY_SPDIF_RX || - port_id > AFE_PORT_ID_SECONDARY_SPDIF_TX) { - pr_err("%s:invalid SPDIF DAI(%d)\n", __func__, port_id); - return; - } - - ret = msm_spdif_set_clk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for SPDIF (%d); ret=%d\n", - __func__, port_id, ret); -} - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_cdc_dma_be_ops = { - .hw_params = msm_snd_cdc_dma_hw_params, -}; - -static struct snd_soc_ops msm_be_ops = { - .hw_params = msm_snd_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - -static struct snd_soc_ops msm_spdif_be_ops = { - .startup = msm_spdif_snd_startup, - .shutdown = msm_spdif_snd_shutdown, -}; - - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - { - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - { - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - { - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - { - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - { - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - { - .name = "SLIMBUS_0 Hostless", - .stream_name = "SLIMBUS_0 Hostless", - .cpu_dai_name = "SLIMBUS0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - { - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - { - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - { - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_3 Hostless", - .stream_name = "SLIMBUS_3 Hostless", - .cpu_dai_name = "SLIMBUS3_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_4 Hostless", - .stream_name = "SLIMBUS_4 Hostless", - .cpu_dai_name = "SLIMBUS4_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - { - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - { - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - { - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - /* HDMI Hostless */ - { - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - { - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - { - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - { - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - { - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - { - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - { - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - { - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - { - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - { - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - { - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - { - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - { - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - { - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - { - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* Hostless PCM purpose */ - { - .name = "CDC_DMA Hostless", - .stream_name = "CDC_DMA Hostless", - .cpu_dai_name = "CDC_DMA_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = { - { - .name = LPASS_BE_WSA_CDC_DMA_TX_0, - .stream_name = "WSA CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45057", - .platform_name = "msm-pcm-hostless", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_vifeedback", - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { - { - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_7 Hostless", - .stream_name = "SLIMBUS_7 Hostless", - .cpu_dai_name = "SLIMBUS7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(Compr Capture), - .stream_name = "Compr Capture", - .cpu_dai_name = "MultiMedia18", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA18, - }, - { - .name = MSM_DAILINK_NAME(Transcode Loopback Playback), - .stream_name = "Transcode Loopback Playback", - .cpu_dai_name = "MultiMedia26", - .platform_name = "msm-transcode-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dailink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA26, - }, - { - .name = MSM_DAILINK_NAME(Transcode Loopback Capture), - .stream_name = "Transcode Loopback Capture", - .cpu_dai_name = "MultiMedia27", - .platform_name = "msm-transcode-loopback", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA27, - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_RX_0, - .stream_name = "Quinary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36928", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_TX_0, - .stream_name = "Quinary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36929", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &qcs405_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_tasha_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - .ignore_pmdown_time = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_9_TX, - .stream_name = "Slimbus9 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16403", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_split_a2dp_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_9_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = { - /* WSA CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_WSA_CDC_DMA_RX_0, - .stream_name = "WSA CDC DMA0 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45056", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .init = &msm_wsa_cdc_dma_init, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_RX_1, - .stream_name = "WSA CDC DMA1 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45058", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx_mix", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_TX_1, - .stream_name = "WSA CDC DMA1 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45059", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_echo", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_va_cdc_dma_be_dai_links[] = { - { - .name = LPASS_BE_VA_CDC_DMA_TX_0, - .stream_name = "VA CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45089", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "va_macro_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .init = &msm_va_cdc_dma_init, - .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_VA_CDC_DMA_TX_1, - .stream_name = "VA CDC DMA1 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45091", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "va_macro_tx2", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_spdif_be_dai_links[] = { - { - .name = LPASS_BE_PRI_SPDIF_RX, - .stream_name = "Primary SPDIF Playback", - .cpu_dai_name = "msm-dai-q6-spdif.20480", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_SPDIF_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_spdif_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_SPDIF_TX, - .stream_name = "Primary SPDIF Capture", - .cpu_dai_name = "msm-dai-q6-spdif.20481", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_SPDIF_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_spdif_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_SPDIF_RX, - .stream_name = "Secondary SPDIF Playback", - .cpu_dai_name = "msm-dai-q6-spdif.20482", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_SPDIF_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_spdif_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_SPDIF_TX, - .stream_name = "Secondary SPDIF Capture", - .cpu_dai_name = "msm-dai-q6-spdif.20483", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_SPDIF_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_spdif_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_qcs405_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_tasha_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links) + - ARRAY_SIZE(msm_va_cdc_dma_be_dai_links) + - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) + - ARRAY_SIZE(msm_bolero_fe_dai_links) + - ARRAY_SIZE(msm_spdif_be_dai_links)]; - -static int msm_snd_card_tasha_late_probe(struct snd_soc_card *card) -{ - int ret = 0; - - ret = audio_notifier_register("qcs405", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - - return ret; -} - - -static int msm_snd_vad_cfg_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = 0; - int port_id; - uint32_t vad_enable = ucontrol->value.integer.value[0]; - uint32_t preroll_config = ucontrol->value.integer.value[1]; - uint32_t vad_intf = ucontrol->value.integer.value[2]; - - if ((preroll_config < 0) || (preroll_config > 1000) || - (vad_enable < 0) || (vad_enable > 1) || - (vad_intf > MSM_BACKEND_DAI_MAX)) { - pr_err("%s: Invalid arguments\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: vad_enable=%d preroll_config=%d vad_intf=%d\n", __func__, - vad_enable, preroll_config, vad_intf); - - ret = msm_vad_get_portid_from_beid(vad_intf, &port_id); - if (ret) { - pr_err("%s: Invalid vad interface\n", __func__); - goto done; - } - - afe_set_vad_cfg(vad_enable, preroll_config, port_id); - -done: - return ret; -} - -static int msm_snd_card_codec_late_probe(struct snd_soc_card *card) -{ - int ret = 0; - uint32_t tasha_codec = 0; - - ret = afe_cal_init_hwdep(card); - if (ret) { - dev_err(card->dev, "afe cal hwdep init failed (%d)\n", ret); - ret = 0; - } - - /* tasha late probe when it is present */ - ret = of_property_read_u32(card->dev->of_node, "qcom,tasha-codec", - &tasha_codec); - if (ret) { - dev_err(card->dev, "%s: No DT match tasha codec\n", __func__); - ret = 0; - } else { - if (tasha_codec) { - ret = msm_snd_card_tasha_late_probe(card); - if (ret) - dev_err(card->dev, "%s: tasha late probe err\n", - __func__); - } - } - return ret; -} - -struct snd_soc_card snd_soc_card_qcs405_msm = { - .name = "qcs405-snd-card", - .controls = msm_snd_controls, - .num_controls = ARRAY_SIZE(msm_snd_controls), - .late_probe = msm_snd_card_codec_late_probe, -}; - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - pr_err("%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static struct snd_soc_dai_link msm_stub_fe_dai_links[] = { - - /* FrontEnd DAI Links */ - { - .name = "MSMSTUB Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, -}; - -static struct snd_soc_dai_link msm_stub_be_dai_links[] = { - - /* Backend DAI Links */ - { - .name = LPASS_BE_VA_CDC_DMA_TX_0, - .stream_name = "VA CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45089", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "va_macro_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .init = &msm_va_cdc_dma_init, - .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_VA_CDC_DMA_TX_1, - .stream_name = "VA CDC DMA1 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45091", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "va_macro_tx2", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_stub_dai_links[ - ARRAY_SIZE(msm_stub_fe_dai_links) + - ARRAY_SIZE(msm_stub_be_dai_links)]; - -struct snd_soc_card snd_soc_card_stub_msm = { - .name = "qcs405-stub-snd-card", -}; - -static const struct of_device_id qcs405_asoc_machine_of_match[] = { - { .compatible = "qcom,qcs405-asoc-snd", - .data = "codec"}, - { .compatible = "qcom,qcs405-asoc-snd-stub", - .data = "stub_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int total_links = 0; - uint32_t tasha_codec = 0, auxpcm_audio_intf = 0; - uint32_t va_bolero_codec = 0, wsa_bolero_codec = 0, mi2s_audio_intf = 0; - uint32_t spdif_audio_intf = 0, wcn_audio_intf = 0; - const struct of_device_id *match; - char __iomem *spdif_cfg, *spdif_pin_ctl; - int rc = 0; - - match = of_match_node(qcs405_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "codec")) { - card = &snd_soc_card_qcs405_msm; - memcpy(msm_qcs405_dai_links + total_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - - total_links += ARRAY_SIZE(msm_common_dai_links); - - rc = of_property_read_u32(dev->of_node, "qcom,wsa-bolero-codec", - &wsa_bolero_codec); - if (rc) { - dev_dbg(dev, "%s: No DT match WSA Macro codec\n", - __func__); - } else { - if (wsa_bolero_codec) { - dev_dbg(dev, "%s(): WSA macro in bolero codec present\n", - __func__); - - memcpy(msm_qcs405_dai_links + total_links, - msm_bolero_fe_dai_links, - sizeof(msm_bolero_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_bolero_fe_dai_links); - } - } - - memcpy(msm_qcs405_dai_links + total_links, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - - total_links += ARRAY_SIZE(msm_common_misc_fe_dai_links); - - memcpy(msm_qcs405_dai_links + total_links, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - - total_links += ARRAY_SIZE(msm_common_be_dai_links); - - rc = of_property_read_u32(dev->of_node, "qcom,tasha-codec", - &tasha_codec); - if (rc) { - dev_dbg(dev, "%s: No DT match tasha codec\n", - __func__); - } else { - if (tasha_codec) { - memcpy(msm_qcs405_dai_links + total_links, - msm_tasha_be_dai_links, - sizeof(msm_tasha_be_dai_links)); - total_links += - ARRAY_SIZE(msm_tasha_be_dai_links); - } - } - - rc = of_property_read_u32(dev->of_node, "qcom,va-bolero-codec", - &va_bolero_codec); - if (rc) { - dev_dbg(dev, "%s: No DT match VA Macro codec\n", - __func__); - } else { - if (va_bolero_codec) { - dev_dbg(dev, "%s(): VA macro in bolero codec present\n", - __func__); - - memcpy(msm_qcs405_dai_links + total_links, - msm_va_cdc_dma_be_dai_links, - sizeof(msm_va_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_va_cdc_dma_be_dai_links); - } - } - - if (wsa_bolero_codec) { - dev_dbg(dev, "%s(): WSAmacro in bolero codec present\n", - __func__); - - memcpy(msm_qcs405_dai_links + total_links, - msm_wsa_cdc_dma_be_dai_links, - sizeof(msm_wsa_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links); - } - - rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf", - &mi2s_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match MI2S audio interface\n", - __func__); - } else { - if (mi2s_audio_intf) { - memcpy(msm_qcs405_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += - ARRAY_SIZE(msm_mi2s_be_dai_links); - } - } - rc = of_property_read_u32(dev->of_node, - "qcom,auxpcm-audio-intf", - &auxpcm_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match Aux PCM interface\n", - __func__); - } else { - if (auxpcm_audio_intf) { - memcpy(msm_qcs405_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += - ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - } - rc = of_property_read_u32(dev->of_node, "qcom,spdif-audio-intf", - &spdif_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match SPDIF audio interface\n", - __func__); - } else { - if (spdif_audio_intf) { - memcpy(msm_qcs405_dai_links + total_links, - msm_spdif_be_dai_links, - sizeof(msm_spdif_be_dai_links)); - total_links += - ARRAY_SIZE(msm_spdif_be_dai_links); - - /* enable spdif coax pins */ - spdif_cfg = ioremap(TLMM_EAST_SPARE, 0x4); - spdif_pin_ctl = - ioremap(TLMM_SPDIF_HDMI_ARC_CTL, 0x4); - iowrite32(0xc0, spdif_cfg); - iowrite32(0x2220, spdif_pin_ctl); - } - } - rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", - &wcn_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match WCN audio interface\n", - __func__); - } else { - if (wcn_audio_intf) { - memcpy(msm_qcs405_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wcn_be_dai_links); - } - } - dailink = msm_qcs405_dai_links; - } else if (!strcmp(match->data, "stub_codec")) { - card = &snd_soc_card_stub_msm; - - memcpy(msm_stub_dai_links + total_links, - msm_stub_fe_dai_links, - sizeof(msm_stub_fe_dai_links)); - total_links += ARRAY_SIZE(msm_stub_fe_dai_links); - - memcpy(msm_stub_dai_links + total_links, - msm_stub_be_dai_links, - sizeof(msm_stub_be_dai_links)); - total_links += ARRAY_SIZE(msm_stub_be_dai_links); - - dailink = msm_stub_dai_links; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -static int msm_wsa881x_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, - SPKR_L_BOOST, SPKR_L_VI}; - u8 spkright_port_types[WSA881X_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}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm; - int ret = 0; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - dapm = snd_soc_codec_get_dapm(codec); - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkleft_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkright_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - ret = -EINVAL; - goto err; - } - pdata = snd_soc_card_get_drvdata(component->card); - if (pdata && pdata->codec_root) - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); - -err: - return ret; -} - -static int msm_init_wsa_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - int i; - struct msm_wsa881x_dev_info *wsa881x_dev_info; - const char *wsa_auxdev_name_prefix[1]; - char *dev_name_str = NULL; - int found = 0; - int ret = 0; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_info(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - card->num_aux_devs = 0; - return 0; - } - if (wsa_max_devs == 0) { - dev_warn(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - card->num_aux_devs = 0; - return 0; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err_free_dev_info; - } - if (soc_find_component(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_err(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - - card->num_aux_devs = wsa_max_devs; - card->num_configs = wsa_max_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err_free_dev_info; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err_free_aux_dev; - } - - for (i = 0; i < card->num_aux_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err_free_cdc_conf; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - wsa_auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err_free_dev_name_str; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_init; - msm_codec_conf[i].dev_name = NULL; - msm_codec_conf[i].name_prefix = wsa_auxdev_name_prefix[0]; - msm_codec_conf[i].of_node = - wsa881x_dev_info[i].of_node; - } - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; - - return 0; - -err_free_dev_name_str: - devm_kfree(&pdev->dev, dev_name_str); -err_free_cdc_conf: - devm_kfree(&pdev->dev, msm_codec_conf); -err_free_aux_dev: - devm_kfree(&pdev->dev, msm_aux_dev); -err_free_dev_info: - devm_kfree(&pdev->dev, wsa881x_dev_info); -err: - return ret; -} - -static int msm_csra66x0_init(struct snd_soc_component *component) -{ - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - return 0; -} - -static int msm_init_csra_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *csra_of_node; - u32 csra_max_devs; - u32 csra_dev_cnt; - char *dev_name_str = NULL; - struct msm_csra66x0_dev_info *csra66x0_dev_info; - const char *csra_auxdev_name_prefix[1]; - int i; - int found = 0; - int ret = 0; - - /* Get maximum CSRA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,csra-max-devs", &csra_max_devs); - if (ret) { - dev_info(&pdev->dev, - "%s: csra-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - card->num_aux_devs = 0; - return 0; - } - if (csra_max_devs == 0) { - dev_warn(&pdev->dev, - "%s: Max CSRA devices is 0 for this target?\n", - __func__); - return 0; - } - - /* Get count of CSRA device phandles for this platform */ - csra_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,csra-devs", NULL); - if (csra_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No csra device defined in DT.\n", - __func__); - goto err; - } else if (csra_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading csra device from DT. csra_dev_cnt = %d\n", - __func__, csra_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * CSRA count. However, if it is less, then assign same value to - * max count as well. - */ - if (csra_dev_cnt < csra_max_devs) { - dev_dbg(&pdev->dev, - "%s: csra_max_devs = %d cannot exceed csra_dev_cnt = %d\n", - __func__, csra_max_devs, csra_dev_cnt); - csra_max_devs = csra_dev_cnt; - } - - /* Make sure prefix string passed for each CSRA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,csra-aux-dev-prefix"); - if (ret != csra_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d csra prefix. Defined only %d in DT\n", - __func__, csra_dev_cnt, ret); - ret = -EINVAL; - goto err; - } - - /* - * Alloc mem to store phandle and index info of CSRA device, if already - * registered with ALSA core - */ - csra66x0_dev_info = devm_kcalloc(&pdev->dev, csra_max_devs, - sizeof(struct msm_csra66x0_dev_info), - GFP_KERNEL); - if (!csra66x0_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all CSRA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < csra_dev_cnt; i++) { - csra_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,csra-devs", i); - if (unlikely(!csra_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: csra dev node is not present\n", - __func__); - ret = -EINVAL; - goto err_free_dev_info; - } - if (soc_find_component(csra_of_node, NULL)) { - /* CSRA device registered with ALSA core */ - csra66x0_dev_info[found].of_node = csra_of_node; - csra66x0_dev_info[found].index = i; - found++; - if (found == csra_max_devs) - break; - } - } - - if (found < csra_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, csra_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d csra66x0 devices registered with ALSA core\n", - __func__, found); - - card->num_aux_devs = csra_max_devs; - card->num_configs = csra_max_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err_free_dev_info; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_codec_conf), GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err_free_aux_dev; - } - - for (i = 0; i < card->num_aux_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err_free_cdc_conf; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,csra-aux-dev-prefix", - csra66x0_dev_info[i].index, - csra_auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read csra aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err_free_dev_name_str; - } - - snprintf(dev_name_str, strlen("csra66x0.%d"), "csra66x0.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - csra66x0_dev_info[i].of_node; - msm_aux_dev[i].init = msm_csra66x0_init; /* codec specific init */ - msm_codec_conf[i].dev_name = NULL; - msm_codec_conf[i].name_prefix = csra_auxdev_name_prefix[0]; - msm_codec_conf[i].of_node = csra66x0_dev_info[i].of_node; - } - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; - - return 0; - -err_free_dev_name_str: - devm_kfree(&pdev->dev, dev_name_str); -err_free_cdc_conf: - devm_kfree(&pdev->dev, msm_codec_conf); -err_free_aux_dev: - devm_kfree(&pdev->dev, msm_aux_dev); -err_free_dev_info: - devm_kfree(&pdev->dev, csra66x0_dev_info); -err: - return ret; -} - -static void msm_i2s_auxpcm_init(struct platform_device *pdev) -{ - int count; - u32 mi2s_master_slave[MI2S_MAX]; - int ret; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } -} - -static void msm_i2s_auxpcm_deinit(void) -{ - int count; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_destroy(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - mi2s_intf_conf[count].msm_is_mi2s_master = 0; - } -} - -static int msm_scan_i2c_addr(struct platform_device *pdev, - uint32_t busnum, uint32_t addr) -{ - struct i2c_adapter *adap; - u8 rbuf; - struct i2c_msg msg; - int status = 0; - - adap = i2c_get_adapter(busnum); - if (!adap) { - dev_err(&pdev->dev, "%s: Cannot get I2C adapter %d\n", - __func__, busnum); - return -EBUSY; - } - - /* to test presence, read one byte from device */ - msg.addr = addr; - msg.flags = I2C_M_RD; - msg.len = 1; - msg.buf = &rbuf; - - status = i2c_transfer(adap, &msg, 1); - - i2c_put_adapter(adap); - - if (status != 1) { - dev_dbg(&pdev->dev, "%s: I2C read from addr 0x%02x failed\n", - __func__, addr); - return -ENODEV; - } - - dev_dbg(&pdev->dev, "%s: I2C read from addr 0x%02x successful\n", - __func__, addr); - - return 0; -} - -static int msm_detect_ep92_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - int i; - uint32_t ep92_busnum = 0; - uint32_t ep92_reg = 0; - const char *ep92_name = NULL; - struct snd_soc_dai_link *dai; - int rc = 0; - - rc = of_property_read_u32(pdev->dev.of_node, "qcom,ep92-busnum", - &ep92_busnum); - if (rc) { - dev_info(&pdev->dev, "%s: No DT match ep92-reg\n", __func__); - return 0; - } - - rc = of_property_read_u32(pdev->dev.of_node, "qcom,ep92-reg", - &ep92_reg); - if (rc) { - dev_info(&pdev->dev, "%s: No DT match ep92-busnum\n", __func__); - return 0; - } - - rc = of_property_read_string(pdev->dev.of_node, "qcom,ep92-name", - &ep92_name); - if (rc) { - dev_info(&pdev->dev, "%s: No DT match ep92-name\n", __func__); - return 0; - } - - /* check I2C bus for connected ep92 chip */ - if (msm_scan_i2c_addr(pdev, ep92_busnum, ep92_reg) < 0) { - /* check a second time after a short delay */ - msleep(20); - if (msm_scan_i2c_addr(pdev, ep92_busnum, ep92_reg) < 0) { - dev_info(&pdev->dev, "%s: No ep92 device found\n", - __func__); - /* continue with snd_card registration without ep92 */ - return 0; - } - } - - dev_info(&pdev->dev, "%s: ep92 device found\n", __func__); - - /* update codec info in MI2S dai link */ - dai = &msm_mi2s_be_dai_links[0]; - for (i=0; iname, LPASS_BE_SEC_MI2S_TX) == 0) { - dev_dbg(&pdev->dev, - "%s: Set Sec MI2S dai to ep92 codec\n", - __func__); - dai->codec_name = ep92_name; - dai->codec_dai_name = "ep92-hdmi"; - break; - } - dai++; - } - - /* update codec info in SPDIF dai link */ - dai = &msm_spdif_be_dai_links[0]; - for (i=0; iname, LPASS_BE_SEC_SPDIF_TX) == 0) { - dev_dbg(&pdev->dev, - "%s: Set Sec SPDIF dai to ep92 codec\n", - __func__); - dai->codec_name = ep92_name; - dai->codec_dai_name = "ep92-arc"; - break; - } - dai++; - } - - return 0; -} - -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - int ret; - u32 val; - const char *micb_supply_str = "tdm-vdd-micb-supply"; - const char *micb_supply_str1 = "tdm-vdd-micb"; - const char *micb_voltage_str = "qcom,tdm-vdd-micb-voltage"; - const char *micb_current_str = "qcom,tdm-vdd-micb-current"; - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "No platform supplied from device tree\n"); - return -EINVAL; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - /* test for ep92 HDMI bridge and update dai links accordingly */ - ret = msm_detect_ep92_dev(pdev, card); - if (ret) - goto err; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "parse card name failed, err:%d\n", - ret); - goto err; - } - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) { - dev_err(&pdev->dev, "parse audio routing failed, err:%d\n", - ret); - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - - ret = of_property_read_u32(pdev->dev.of_node, "qcom,csra-codec", &val); - if (ret) { - dev_info(&pdev->dev, "no 'qcom,csra-codec' in DT\n"); - val = 0; - } - if (val) { - pdata->codec_is_csra = true; - mi2s_rx_cfg[PRIM_MI2S].bit_format = SNDRV_PCM_FORMAT_S24_LE; - ret = msm_init_csra_dev(pdev, card); - if (ret) - goto err; - } else { - pdata->codec_is_csra = false; - ret = msm_init_wsa_dev(pdev, card); - if (ret) - goto err; - } - - pdata->dmic_01_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic01-gpios", 0); - pdata->dmic_23_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic23-gpios", 0); - pdata->dmic_45_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic45-gpios", 0); - pdata->dmic_67_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic67-gpios", 0); - - pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,pri-mi2s-gpios", 0); - pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,sec-mi2s-gpios", 0); - pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,tert-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quat-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quin-mi2s-gpios", 0); - - if (of_parse_phandle(pdev->dev.of_node, micb_supply_str, 0)) { - pdata->tdm_micb_supply = devm_regulator_get(&pdev->dev, - micb_supply_str1); - if (IS_ERR(pdata->tdm_micb_supply)) { - ret = PTR_ERR(pdata->tdm_micb_supply); - dev_err(&pdev->dev, - "%s:Failed to get micbias supply for TDM Mic %d\n", - __func__, ret); - } - ret = of_property_read_u32(pdev->dev.of_node, - micb_voltage_str, - &pdata->tdm_micb_voltage); - if (ret) { - dev_err(&pdev->dev, - "%s:Looking up %s property in node %s failed\n", - __func__, micb_voltage_str, - pdev->dev.of_node->full_name); - } - ret = of_property_read_u32(pdev->dev.of_node, - micb_current_str, - &pdata->tdm_micb_current); - if (ret) { - dev_err(&pdev->dev, - "%s:Looking up %s property in node %s failed\n", - __func__, micb_current_str, - pdev->dev.of_node->full_name); - } - } - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) - ret = -EINVAL; - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - dev_info(&pdev->dev, "Sound card %s registered\n", card->name); - spdev = pdev; - - ret = msm_mdf_mem_init(); - if (ret) - dev_err(&pdev->dev, "msm_mdf_mem_init failed (%d)\n", - ret); - - msm_i2s_auxpcm_init(pdev); - - is_initial_boot = true; - return 0; -err: - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - audio_notifier_deregister("qcs405"); - msm_i2s_auxpcm_deinit(); - msm_mdf_mem_deinit(); - - return 0; -} - -static struct platform_driver qcs405_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = qcs405_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; -module_platform_driver(qcs405_asoc_machine_driver); - -MODULE_DESCRIPTION("ALSA SoC QCS405 Machine driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, qcs405_asoc_machine_of_match); diff --git a/techpack/audio/asoc/sa8155.c b/techpack/audio/asoc/sa8155.c deleted file mode 100644 index 1c67e9b5e5f3..000000000000 --- a/techpack/audio/asoc/sa8155.c +++ /dev/null @@ -1,7218 +0,0 @@ -/* Copyright (c) 2014-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* - * Copyright 2011, The Android Open Source Project - - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of The Android Open Source Project nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - * THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "device_event.h" -#include "msm-pcm-routing-v2.h" - -#define DRV_NAME "sa8155-asoc-snd" - -#define __CHIPSET__ "SA8155 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define DEV_NAME_STR_LEN 32 - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - QUIN_MI2S, - MI2S_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - QUIN_AUX_PCM, - AUX_PCM_MAX, -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -enum { - DP_RX_IDX = 0, - EXT_DISP_RX_IDX_MAX, -}; - -enum pinctrl_pin_state { - STATE_DISABLE = 0, /* All pins are in sleep state */ - STATE_MI2S_ACTIVE, /* IS2 = active, TDM = sleep */ - STATE_TDM_ACTIVE, /* IS2 = sleep, TDM = active */ -}; - -struct msm_pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *mi2s_disable; - struct pinctrl_state *tdm_disable; - struct pinctrl_state *mi2s_active; - struct pinctrl_state *tdm_active; - enum pinctrl_pin_state curr_state; -}; - -struct msm_asoc_mach_data { - struct msm_pinctrl_info pinctrl_info; -}; - -static const char *const pin_states[] = {"sleep", "i2s-active", - "tdm-active"}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_QUIN, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 6}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 6}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 4}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 6}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } -}; - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -/* TDM default slot config */ -struct tdm_slot_cfg { - u32 width; - u32 num; -}; - -static struct tdm_slot_cfg tdm_slot[TDM_INTERFACE_MAX] = { - /* PRI TDM */ - {32, 8}, - /* SEC TDM */ - {32, 8}, - /* TERT TDM */ - {32, 8}, - /* QUAT TDM */ - {32, 16}, - /* QUIN TDM */ - {32, 16} -}; - -/***************************************************************************** -* TO BE UPDATED: Codec/Platform specific tdm slot table -*****************************************************************************/ -static struct tdm_slot_cfg tdm_slot_custom[TDM_INTERFACE_MAX] = { - /* PRI TDM */ - {16, 16}, - /* SEC TDM */ - {16, 16}, - /* TERT TDM */ - {16, 16}, - /* QUAT TDM */ - {16, 16}, - /* QUIN TDM */ - {16, 16} -}; - - -/* TDM default slot offset config */ -#define TDM_SLOT_OFFSET_MAX 32 - -static unsigned int tdm_rx_slot_offset - [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = { - {/* PRI TDM */ - {0, 4, 0xFFFF}, - {8, 12, 0xFFFF}, - {16, 20, 0xFFFF}, - {24, 28, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* SEC TDM */ - {0, 4, 0xFFFF}, - {8, 12, 0xFFFF}, - {16, 20, 0xFFFF}, - {24, 28, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {28, 0xFFFF}, - }, - {/* TERT TDM */ - {0, 4, 8, 12, 16, 20, 0xFFFF}, - {24, 0xFFFF}, - {28, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUAT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, 0xFFFF},/*AMP OUT*/ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUIN TDM */ - {0, 4, 0xFFFF},/*STEREO SPKR1*/ - {8, 12, 0xFFFF},/*STEREO SPKR2*/ - {16, 20, 0xFFFF},/*STEREO SPKR3*/ - {24, 28, 0xFFFF},/*STEREO SPKR4*/ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - } -}; - -static unsigned int tdm_tx_slot_offset - [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = { - {/* PRI TDM */ - {0, 4, 0xFFFF}, - {8, 12, 0xFFFF}, - {16, 20, 0xFFFF}, - {24, 28, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* SEC TDM */ - {0, 4, 8, 12, 16, 20, 0xFFFF}, - {24, 0xFFFF}, - {28, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* TERT TDM */ - {0, 4, 8, 12, 0xFFFF}, - {16, 20, 0xFFFF}, - {24, 28, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {28, 0xFFFF}, - }, - {/* QUAT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},/*MIC ARR*/ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUIN TDM */ - {0, 4, 8, 12, 16, 20, 0xFFFF},/*EC/ANC REF*/ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - } -}; - -/***************************************************************************** -* TO BE UPDATED: Codec/Platform specific tdm slot offset table -* NOTE: -* Each entry represents the slot offset array of one backend tdm device -* valid offset represents the starting offset in byte for the channel -* use 0xFFFF for end or unused slot offset entry. -*****************************************************************************/ -static unsigned int tdm_rx_slot_offset_custom - [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = { - {/* PRI TDM */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* SEC TDM */ - {0, 2, 0xFFFF}, - {4, 0xFFFF}, - {6, 0xFFFF}, - {8, 0xFFFF}, - {10, 0xFFFF}, - {12, 14, 16, 18, 20, 22, 24, 26, 0xFFFF}, - {28, 30, 0xFFFF}, - {30, 0xFFFF}, - }, - {/* TERT TDM */ - {0, 2, 0xFFFF}, - {4, 6, 8, 10, 12, 14, 16, 18, 0xFFFF}, - {20, 22, 24, 26, 28, 30, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUAT TDM */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUIN TDM */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - } -}; - -static unsigned int tdm_tx_slot_offset_custom - [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = { - {/* PRI TDM */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* SEC TDM */ - {0, 2, 0xFFFF}, - {4, 6, 8, 10, 12, 14, 16, 18, 0xFFFF}, - {20, 22, 24, 26, 28, 30, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* TERT TDM */ - {0, 2, 4, 6, 8, 10, 12, 0xFFFF}, - {14, 16, 0xFFFF}, - {18, 20, 22, 24, 26, 28, 30, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {30, 0xFFFF}, - }, - {/* QUAT TDM */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUIN TDM */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - } -}; - - -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE", - "S24_3LE"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_32", "KHZ_44P1", - "KHZ_88P2", "KHZ_176P4" }; -static char const *tdm_ch_text[] = { - "One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight", - "Nine", "Ten", "Eleven", "Twelve", - "Thirteen", "Fourteen", "Fifteen", "Sixteen", - "Seventeen", "Eighteen", "Nineteen", "Twenty", - "TwentyOne", "TwentyTwo", "TwentyThree", "TwentyFour", - "TwentyFive", "TwentySix", "TwentySeven", "TwentyEight", - "TwentyNine", "Thirty", "ThirtyOne", "ThirtyTwo"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_48", "KHZ_176P4", - "KHZ_352P8"}; -static const char *const tdm_slot_num_text[] = {"One", "Two", "Four", - "Eight", "Sixteen", "ThirtyTwo"}; -static const char *const tdm_slot_width_text[] = {"16", "24", "32"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16", - "KHZ_22P05", "KHZ_32", "KHZ_44P1", - "KHZ_48", "KHZ_96", "KHZ_192"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const qos_text[] = {"Disable", "Enable"}; - -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_slot_num, tdm_slot_num_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_slot_width, tdm_slot_width_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); - -static bool is_initial_boot = true; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } - -}; - -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) { - idx = DP_RX_IDX; - } else { - pr_err("%s: unsupported BE: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 2: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 6; - break; - - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 4; - break; - - case SAMPLING_RATE_32KHZ: - sample_rate_val = 3; - break; - - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 6: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 5; - break; - default: - sample_rate_val = 3; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int tdm_get_mode(struct snd_kcontrol *kcontrol) -{ - int mode; - - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - mode = TDM_QUAT; - } else if (strnstr(kcontrol->id.name, "QUIN", - sizeof(kcontrol->id.name))) { - mode = TDM_QUIN; - } else { - pr_err("%s: unsupported mode in: %s", - __func__, kcontrol->id.name); - mode = -EINVAL; - } - - return mode; -} - -static int tdm_get_channel(struct snd_kcontrol *kcontrol) -{ - int channel; - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s", - __func__, kcontrol->id.name); - channel = -EINVAL; - } - - return channel; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - port->mode = tdm_get_mode(kcontrol); - if (port->mode < 0) - return port->mode; - - port->channel = tdm_get_channel(kcontrol); - if (port->channel < 0) - return port->channel; - } else - return -EINVAL; - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_get_slot_num_val(int slot_num) -{ - int slot_num_val; - - switch (slot_num) { - case 1: - slot_num_val = 0; - break; - case 2: - slot_num_val = 1; - break; - case 4: - slot_num_val = 2; - break; - case 8: - slot_num_val = 3; - break; - case 16: - slot_num_val = 4; - break; - case 32: - slot_num_val = 5; - break; - default: - slot_num_val = 5; - break; - } - return slot_num_val; -} - -static int tdm_slot_num_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - return mode; - } - - ucontrol->value.enumerated.item[0] = - tdm_get_slot_num_val(tdm_slot[mode].num); - - pr_debug("%s: mode = %d, tdm_slot_num = %d, item = %d\n", __func__, - mode, tdm_slot[mode].num, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_get_slot_num(int value) -{ - int slot_num; - - switch (value) { - case 0: - slot_num = 1; - break; - case 1: - slot_num = 2; - break; - case 2: - slot_num = 4; - break; - case 3: - slot_num = 8; - break; - case 4: - slot_num = 16; - break; - case 5: - slot_num = 32; - break; - default: - slot_num = 8; - break; - } - return slot_num; -} - -static int tdm_slot_num_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - return mode; - } - - tdm_slot[mode].num = - tdm_get_slot_num(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: mode = %d, tdm_slot_num = %d, item = %d\n", __func__, - mode, tdm_slot[mode].num, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_get_slot_width_val(int slot_width) -{ - int slot_width_val; - - switch (slot_width) { - case 16: - slot_width_val = 0; - break; - case 24: - slot_width_val = 1; - break; - case 32: - slot_width_val = 2; - break; - default: - slot_width_val = 2; - break; - } - return slot_width_val; -} - -static int tdm_slot_width_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - return mode; - } - - ucontrol->value.enumerated.item[0] = - tdm_get_slot_width_val(tdm_slot[mode].width); - - pr_debug("%s: mode = %d, tdm_slot_width = %d, item = %d\n", __func__, - mode, tdm_slot[mode].width, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_get_slot_width(int value) -{ - int slot_width; - - switch (value) { - case 0: - slot_width = 16; - break; - case 1: - slot_width = 24; - break; - case 2: - slot_width = 32; - break; - default: - slot_width = 32; - break; - } - return slot_width; -} - -static int tdm_slot_width_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - return mode; - } - - tdm_slot[mode].width = - tdm_get_slot_width(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: mode = %d, tdm_slot_width = %d, item = %d\n", __func__, - mode, tdm_slot[mode].width, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_rx_slot_mapping_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - slot_offset = tdm_rx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - ucontrol->value.integer.value[i] = slot_offset[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } - return ret; -} - -static int tdm_rx_slot_mapping_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - slot_offset = tdm_rx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - slot_offset[i] = ucontrol->value.integer.value[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } - return ret; -} - -static int tdm_tx_slot_mapping_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - slot_offset = tdm_tx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - ucontrol->value.integer.value[i] = slot_offset[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } - return ret; -} - -static int tdm_tx_slot_mapping_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - slot_offset = tdm_tx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - slot_offset[i] = ucontrol->value.integer.value[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } - return ret; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) - idx = PRIM_AUX_PCM; - else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) - idx = SEC_AUX_PCM; - else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) - idx = TERT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) - idx = QUAT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", - sizeof("QUIN_AUX_PCM"))) - idx = QUIN_AUX_PCM; - else { - pr_err("%s: unsupported port: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", - sizeof("QUIN_MI2S_RX"))) - idx = QUIN_MI2S; - else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", - sizeof("QUIN_MI2S_TX"))) - idx = QUIN_MI2S; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_auxpcm_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_auxpcm_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_RX_1 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_RX_2 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_RX_3 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_1 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_2 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_3 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_1 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_2 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_3 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_1 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_2 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_3 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_1 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_2 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_3 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_4 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_1 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_2 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_3 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_2 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_3 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_1 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_2 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_3 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_1 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_2 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_3 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_1 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_2 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_3 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRI_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("PRI_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("SEC_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("SEC_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("TERT_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("TERT_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("QUAT_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("QUAT_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("QUIN_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("QUIN_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, - unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int msm_ext_disp_get_idx_from_beid(int32_t be_id) -{ - int idx; - - switch (be_id) { - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = DP_RX_IDX; - break; - default: - pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id); - idx = -EINVAL; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - goto done; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - - case MSM_BACKEND_DAI_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUIN_MI2S].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - -done: - return rc; -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - -err: - return ret; -} - -#ifdef ENABLE_PINCTRL -static int msm_set_pinctrl(struct msm_pinctrl_info *pinctrl_info, - enum pinctrl_pin_state new_state) -{ - int ret = 0; - int curr_state = 0; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - if (pinctrl_info->pinctrl == NULL) { - pr_err("%s: pinctrl_info->pinctrl is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - curr_state = pinctrl_info->curr_state; - pinctrl_info->curr_state = new_state; - pr_debug("%s: curr_state = %s new_state = %s\n", __func__, - pin_states[curr_state], pin_states[pinctrl_info->curr_state]); - - if (curr_state == pinctrl_info->curr_state) { - pr_debug("%s: Already in same state\n", __func__); - goto err; - } - - if (curr_state != STATE_DISABLE && - pinctrl_info->curr_state != STATE_DISABLE) { - pr_debug("%s: state already active cannot switch\n", __func__); - ret = -EIO; - goto err; - } - - switch (pinctrl_info->curr_state) { - case STATE_MI2S_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_active); - if (ret) { - pr_err("%s: MI2S state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_TDM_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_active); - if (ret) { - pr_err("%s: TDM state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_DISABLE: - if (curr_state == STATE_MI2S_ACTIVE) { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - } else { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_disable); - } - if (ret) { - pr_err("%s: state disable failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - default: - pr_err("%s: TLMM pin state is invalid\n", __func__); - return -EINVAL; - } - -err: - return ret; -} - -static void msm_release_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info->pinctrl) { - devm_pinctrl_put(pinctrl_info->pinctrl); - pinctrl_info->pinctrl = NULL; - } -} - -static int msm_get_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = NULL; - struct pinctrl *pinctrl; - int ret; - - pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(pinctrl)) { - pr_err("%s: Unable to get pinctrl handle\n", __func__); - return -EINVAL; - } - pinctrl_info->pinctrl = pinctrl; - - /* get all the states handles from Device Tree */ - pinctrl_info->mi2s_disable = pinctrl_lookup_state(pinctrl, - "quat_mi2s_disable"); - if (IS_ERR(pinctrl_info->mi2s_disable)) { - pr_err("%s: could not get mi2s_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->mi2s_active = pinctrl_lookup_state(pinctrl, - "quat_mi2s_enable"); - if (IS_ERR(pinctrl_info->mi2s_active)) { - pr_err("%s: could not get mi2s_active pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_disable = pinctrl_lookup_state(pinctrl, - "quat_tdm_disable"); - if (IS_ERR(pinctrl_info->tdm_disable)) { - pr_err("%s: could not get tdm_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_active = pinctrl_lookup_state(pinctrl, - "quat_tdm_enable"); - if (IS_ERR(pinctrl_info->tdm_active)) { - pr_err("%s: could not get tdm_active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - if (ret != 0) { - pr_err("%s: Disable TLMM pins failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - pinctrl_info->curr_state = STATE_DISABLE; - - return 0; - -err: - devm_pinctrl_put(pinctrl); - pinctrl_info->pinctrl = NULL; - return -EINVAL; -} -#else -static int msm_set_pinctrl(struct msm_pinctrl_info *pinctrl_info, - enum pinctrl_pin_state new_state) -{ - return 0; -} - -static void msm_release_pinctrl(struct platform_device *pdev) -{ - return; -} - -static int msm_get_pinctrl(struct platform_device *pdev) -{ - return 0; -} -#endif - -static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_1].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_2].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_3].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_1].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_2].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_3].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_1].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_2].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_3].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_7].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_7].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_1].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_2].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_3].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_4].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_4].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_7].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_7].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_3].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_3].sample_rate; - break; - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n", - __func__, cpu_dai->id, channels->max, rate->max, - params_format(params)); - - return 0; -} - -static unsigned int tdm_param_set_slot_mask(int slots) -{ - unsigned int slot_mask = 0; - int i = 0; - - if ((slots <= 0) || (slots > 32)) { - pr_err("%s: invalid slot number %d\n", __func__, slots); - return -EINVAL; - } - - for (i = 0; i < slots ; i++) - slot_mask |= 1 << i; - return slot_mask; -} - -static int sa8155_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int channels, slot_width, slots, rate, format; - unsigned int slot_mask; - unsigned int *slot_offset; - int offset_channels = 0; - int i; - int clk_freq; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - channels = params_channels(params); - if (channels < 1 || channels > 32) { - pr_err("%s: invalid param channels %d\n", - __func__, channels); - return -EINVAL; - } - - format = params_format(params); - if (format != SNDRV_PCM_FORMAT_S32_LE && - format != SNDRV_PCM_FORMAT_S24_LE && - format != SNDRV_PCM_FORMAT_S16_LE) { - /* - * Up to 8 channel HW configuration should - * use 32 bit slot width for max support of - * stream bit width. (slot_width > bit_width) - */ - pr_err("%s: invalid param format 0x%x\n", - __func__, format); - return -EINVAL; - } - - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_0]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_1]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_2]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_3]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_0]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_1]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_2]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_3]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_0]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_1]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_2]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_3]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_7]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_0]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_1]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_2]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_3]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_0]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_1]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_2]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_3]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_4]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_0]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_1]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_2]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_3]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_7]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_0]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_1]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_2]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_3]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_0]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_1]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_2]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_3]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_0]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_1]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_2]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_3]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_0]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_1]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_2]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_3]; - break; - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID) - offset_channels++; - else - break; - } - - if (offset_channels == 0) { - pr_err("%s: invalid offset_channels %d\n", - __func__, offset_channels); - return -EINVAL; - } - - if (channels > offset_channels) { - pr_err("%s: channels %d exceed offset_channels %d\n", - __func__, channels, offset_channels); - return -EINVAL; - } - - slot_mask = tdm_param_set_slot_mask(slots); - if (!slot_mask) { - pr_err("%s: invalid slot_mask 0x%x\n", - __func__, slot_mask); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - channels, slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) { - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - } - -end: - return ret; -} - -static int sa8155_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX)) { - ret = msm_set_pinctrl(pinctrl_info, STATE_TDM_ACTIVE); - if (ret) - pr_err("%s: TDM TLMM pinctrl set failed with %d\n", - __func__, ret); - } - - return ret; -} - -static void sa8155_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX)) { - ret = msm_set_pinctrl(pinctrl_info, STATE_DISABLE); - if (ret) - pr_err("%s: TDM TLMM pinctrl set failed with %d\n", - __func__, ret); - } -} - -static struct snd_soc_ops sa8155_tdm_be_ops = { - .hw_params = sa8155_tdm_snd_hw_params, - .startup = sa8155_tdm_snd_startup, - .shutdown = sa8155_tdm_snd_shutdown -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - /* - * Mutex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_MI2S_ACTIVE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } - } -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -err: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (index < PRIM_MI2S || index >= MI2S_MAX) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_DISABLE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } - } - mutex_unlock(&mi2s_intf_conf[index].lock); -} - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - { - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - { - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - { - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - { - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - { - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* - SLIMBUS_0 Hostless */ - { - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - { - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - { - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - /* Hostless PCM purpose */ - { - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* - SLIMBUS_1 Hostless */ - /* - SLIMBUS_3 Hostless */ - /* - SLIMBUS_4 Hostless */ - { - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - { - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - { - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - { - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - /* HDMI Hostless */ - { - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - { - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - { - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - { - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - { - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - { - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - { - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - { - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - /* - Multimedia9 */ - { - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - { - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - { - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - { - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - { - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - /* - SLIMBUS_8 Hostless */ - /* - Slimbus4 Capture */ - /* - SLIMBUS_2 Hostless Playback */ - /* - SLIMBUS_2 Hostless Capture */ - /* HFP TX */ - { - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* - SLIMBUS_7 Hostless */ - { - .name = "Compress Capture", - .stream_name = "Compress9", - .cpu_dai_name = "MultiMedia17", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA17, - }, -}; - -static struct snd_soc_dai_link msm_auto_fe_dai_links[] = { - { - .name = "INT_HFP_BT Hostless", - .stream_name = "INT_HFP_BT Hostless", - .cpu_dai_name = "INT_HFP_BT_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* Low latency ASM loopback for ICC */ - { - .name = MSM_DAILINK_NAME(LowLatency Loopback), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-loopback.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - { - .name = "Tertiary MI2S TX_Hostless", - .stream_name = "Tertiary MI2S_TX Hostless Capture", - .cpu_dai_name = "TERT_MI2S_TX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(Media20), - .stream_name = "MultiMedia20", - .cpu_dai_name = "MultiMedia20", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA20, - }, - { - .name = MSM_DAILINK_NAME(HFP RX), - .stream_name = "MultiMedia21", - .cpu_dai_name = "MultiMedia21", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA21, - }, - /* TDM Hostless */ - { - .name = "Primary TDM RX 0 Hostless", - .stream_name = "Primary TDM RX 0 Hostless", - .cpu_dai_name = "PRI_TDM_RX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Primary TDM TX 0 Hostless", - .stream_name = "Primary TDM TX 0 Hostless", - .cpu_dai_name = "PRI_TDM_TX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Secondary TDM RX 0 Hostless", - .stream_name = "Secondary TDM RX 0 Hostless", - .cpu_dai_name = "SEC_TDM_RX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Secondary TDM TX 0 Hostless", - .stream_name = "Secondary TDM TX 0 Hostless", - .cpu_dai_name = "SEC_TDM_TX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Tertiary TDM RX 0 Hostless", - .stream_name = "Tertiary TDM RX 0 Hostless", - .cpu_dai_name = "TERT_TDM_RX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Tertiary TDM TX 0 Hostless", - .stream_name = "Tertiary TDM TX 0 Hostless", - .cpu_dai_name = "TERT_TDM_TX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Quaternary TDM RX 0 Hostless", - .stream_name = "Quaternary TDM RX 0 Hostless", - .cpu_dai_name = "QUAT_TDM_RX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Quaternary TDM TX 0 Hostless", - .stream_name = "Quaternary TDM TX 0 Hostless", - .cpu_dai_name = "QUAT_TDM_TX_0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Quaternary MI2S_RX Hostless Playback", - .stream_name = "Quaternary MI2S_RX Hostless Playback", - .cpu_dai_name = "QUAT_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Secondary MI2S_TX Hostless Capture", - .stream_name = "Secondary MI2S_TX Hostless Capture", - .cpu_dai_name = "SEC_MI2S_TX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "DTMF RX Hostless", - .stream_name = "DTMF RX Hostless", - .cpu_dai_name = "DTMF_RX_HOSTLESS", - .platform_name = "msm-pcm-dtmf", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_DTMF_RX, - }, - { - .name = "Secondary TDM RX 7 Hostless", - .stream_name = "Secondary TDM RX 7 Hostless", - .cpu_dai_name = "SEC_TDM_RX_7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Tertiary TDM TX 7 Hostless", - .stream_name = "Tertiary TDM TX 7 Hostless", - .cpu_dai_name = "TERT_TDM_TX_7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_custom_fe_dai_links[] = { - /* FrontEnd DAI Links */ - { - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1, - .ops = &msm_fe_qos_ops, - }, - { - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - .ops = &msm_fe_qos_ops, - }, - { - .name = MSM_DAILINK_NAME(Media3), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - .ops = &msm_fe_qos_ops, - }, - { - .name = MSM_DAILINK_NAME(Media5), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - { - .name = MSM_DAILINK_NAME(Media6), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - .ops = &msm_fe_qos_ops, - }, - { - .name = MSM_DAILINK_NAME(Media8), - .stream_name = "MultiMedia8", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - { - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - .ops = &msm_fe_qos_ops, - }, - { - .name = "INT_HFP_BT Hostless", - .stream_name = "INT_HFP_BT Hostless", - .cpu_dai_name = "INT_HFP_BT_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(Media20), - .stream_name = "MultiMedia20", - .cpu_dai_name = "MultiMedia20", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA20, - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auto_be_dai_links[] = { - /* Backend DAI Links */ - { - .name = LPASS_BE_PRI_TDM_RX_1, - .stream_name = "Primary TDM1 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36866", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_2, - .stream_name = "Primary TDM2 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36868", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_3, - .stream_name = "Primary TDM3 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36870", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_1, - .stream_name = "Primary TDM1 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36867", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_2, - .stream_name = "Primary TDM2 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36869", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_3, - .stream_name = "Primary TDM3 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36871", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_1, - .stream_name = "Secondary TDM1 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36882", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_2, - .stream_name = "Secondary TDM2 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36884", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_3, - .stream_name = "Secondary TDM3 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36886", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_7, - .stream_name = "Secondary TDM7 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36894", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_7, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_1, - .stream_name = "Secondary TDM1 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36883", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_2, - .stream_name = "Secondary TDM2 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36885", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_3, - .stream_name = "Secondary TDM3 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36887", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_1, - .stream_name = "Tertiary TDM1 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36898", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_2, - .stream_name = "Tertiary TDM2 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36900", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_3, - .stream_name = "Tertiary TDM3 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36902", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_4, - .stream_name = "Tertiary TDM4 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36904", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_4, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_1, - .stream_name = "Tertiary TDM1 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36899", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_2, - .stream_name = "Tertiary TDM2 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36901", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_3, - .stream_name = "Tertiary TDM3 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36903", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_7, - .stream_name = "Tertiary TDM7 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36911", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_7, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_1, - .stream_name = "Quaternary TDM1 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36914", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_2, - .stream_name = "Quaternary TDM2 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36916", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_3, - .stream_name = "Quaternary TDM3 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36918", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_1, - .stream_name = "Quaternary TDM1 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36915", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_1, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_2, - .stream_name = "Quaternary TDM2 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36917", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_2, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_3, - .stream_name = "Quaternary TDM3 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36919", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_3, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sa8155_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auto_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_auto_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_auto_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links)]; - -static struct snd_soc_dai_link msm_auto_custom_dai_links[ - ARRAY_SIZE(msm_custom_fe_dai_links) + - ARRAY_SIZE(msm_auto_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_auto_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links)]; - -struct snd_soc_card snd_soc_card_auto_msm = { - .name = "sa8155-adp-star-snd-card", -}; - -struct snd_soc_card snd_soc_card_auto_custom_msm = { - .name = "sa8155-custom-snd-card", -}; - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - pr_err("%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static const struct of_device_id sa8155_asoc_machine_of_match[] = { - { .compatible = "qcom,sa8155-asoc-snd-adp-star", - .data = "adp_star_codec"}, - { .compatible = "qcom,sa8155-asoc-snd-custom", - .data = "custom_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int len_1, len_2, len_3; - int total_links; - const struct of_device_id *match; - - match = of_match_node(sa8155_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "adp_star_codec")) { - card = &snd_soc_card_auto_msm; - len_1 = ARRAY_SIZE(msm_common_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_auto_fe_dai_links); - len_3 = len_2 + ARRAY_SIZE(msm_common_be_dai_links); - total_links = len_3 + ARRAY_SIZE(msm_auto_be_dai_links); - memcpy(msm_auto_dai_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - memcpy(msm_auto_dai_links + len_1, - msm_auto_fe_dai_links, - sizeof(msm_auto_fe_dai_links)); - memcpy(msm_auto_dai_links + len_2, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - memcpy(msm_auto_dai_links + len_3, - msm_auto_be_dai_links, - sizeof(msm_auto_be_dai_links)); - - if (of_property_read_bool(dev->of_node, - "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_auto_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(msm_auto_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(msm_auto_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - - dailink = msm_auto_dai_links; - } else if (!strcmp(match->data, "custom_codec")) { - card = &snd_soc_card_auto_custom_msm; - len_1 = ARRAY_SIZE(msm_custom_fe_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_auto_fe_dai_links); - len_3 = len_2 + ARRAY_SIZE(msm_common_be_dai_links); - total_links = len_3 + ARRAY_SIZE(msm_auto_be_dai_links); - memcpy(msm_auto_custom_dai_links, - msm_custom_fe_dai_links, - sizeof(msm_custom_fe_dai_links)); - memcpy(msm_auto_custom_dai_links + len_1, - msm_auto_fe_dai_links, - sizeof(msm_auto_fe_dai_links)); - memcpy(msm_auto_custom_dai_links + len_2, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - memcpy(msm_auto_custom_dai_links + len_3, - msm_auto_be_dai_links, - sizeof(msm_auto_be_dai_links)); - - if (of_property_read_bool(dev->of_node, - "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_auto_custom_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(msm_auto_custom_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(msm_auto_custom_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - dailink = msm_auto_custom_dai_links; - } else { - dev_err(dev, "%s: Codec not supported\n", - __func__); - return NULL; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -/***************************************************************************** -* TO BE UPDATED: Codec/Platform specific tdm slot and offset table selection -*****************************************************************************/ -static int msm_tdm_init(struct device *dev) -{ - const struct of_device_id *match; - - match = of_match_node(sa8155_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return -EINVAL; - } - - if (!strcmp(match->data, "custom_codec")) { - dev_dbg(dev, "%s: custom tdm configuration\n", __func__); - - memcpy(tdm_rx_slot_offset, - tdm_rx_slot_offset_custom, - sizeof(tdm_rx_slot_offset_custom)); - memcpy(tdm_tx_slot_offset, - tdm_tx_slot_offset_custom, - sizeof(tdm_tx_slot_offset_custom)); - memcpy(tdm_slot, - tdm_slot_custom, - sizeof(tdm_slot_custom)); - } else { - dev_dbg(dev, "%s: default tdm configuration\n", __func__); - } - - return 0; -} - -static void msm_i2s_auxpcm_init(struct platform_device *pdev) -{ - int count; - u32 mi2s_master_slave[MI2S_MAX]; - int ret; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } -} - -static void msm_i2s_auxpcm_deinit(void) -{ - int count; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_destroy(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - mi2s_intf_conf[count].msm_is_mi2s_master = 0; - } -} -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - int ret; - enum apr_subsys_state q6_state; - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "No platform supplied from device tree\n"); - return -EINVAL; - } - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - dev_dbg(&pdev->dev, "deferring %s, adsp_state %d\n", - __func__, q6_state); - return -EPROBE_DEFER; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "parse card name failed, err:%d\n", - ret); - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - - /* Populate controls of snd card */ - card->controls = msm_snd_controls; - card->num_controls = ARRAY_SIZE(msm_snd_controls); - - ret = msm_tdm_init(&pdev->dev); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - dev_info(&pdev->dev, "Sound card %s registered\n", card->name); - - /* Parse pinctrl info from devicetree */ - ret = msm_get_pinctrl(pdev); - if (!ret) { - pr_debug("%s: pinctrl parsing successful\n", __func__); - } else { - dev_dbg(&pdev->dev, - "%s: Parsing pinctrl failed with %d. Cannot use Ports\n", - __func__, ret); - ret = 0; - } - - msm_i2s_auxpcm_init(pdev); - - return 0; -err: - msm_release_pinctrl(pdev); - devm_kfree(&pdev->dev, pdata); - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - msm_i2s_auxpcm_deinit(); - - msm_release_pinctrl(pdev); - return 0; -} - -static struct platform_driver sa8155_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = sa8155_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; - -static int dummy_asoc_machine_probe(struct platform_device *pdev) -{ - return 0; -} - -static int dummy_asoc_machine_remove(struct platform_device *pdev) -{ - return 0; -} - -static struct platform_device sa8155_dummy_asoc_machine_device = { - .name = "sa8155-asoc-snd-dummy", -}; - -static struct platform_driver sa8155_dummy_asoc_machine_driver = { - .driver = { - .name = "sa8155-asoc-snd-dummy", - .owner = THIS_MODULE, - }, - .probe = dummy_asoc_machine_probe, - .remove = dummy_asoc_machine_remove, -}; - -static int sa8155_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (is_initial_boot) { - platform_driver_register(&sa8155_dummy_asoc_machine_driver); - platform_device_register(&sa8155_dummy_asoc_machine_device); - is_initial_boot = false; - } - break; - default: - break; - } - - return NOTIFY_OK; -} - -static struct notifier_block service_nb = { - .notifier_call = sa8155_notifier_service_cb, - .priority = -INT_MAX, -}; - -int __init sa8155_init(void) -{ - pr_debug("%s\n", __func__); - audio_notifier_register("sa8155", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - return platform_driver_register(&sa8155_asoc_machine_driver); -} - -void sa8155_exit(void) -{ - pr_debug("%s\n", __func__); - platform_driver_unregister(&sa8155_asoc_machine_driver); - audio_notifier_deregister("sa8155"); -} - -MODULE_DESCRIPTION("ALSA SoC msm"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, sa8155_asoc_machine_of_match); diff --git a/techpack/audio/asoc/sdm660-common.c b/techpack/audio/asoc/sdm660-common.c deleted file mode 100644 index c3c9b5a7dd00..000000000000 --- a/techpack/audio/asoc/sdm660-common.c +++ /dev/null @@ -1,5589 +0,0 @@ -/* Copyright (c) 2015-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "sdm660-common.h" -#include "sdm660-internal.h" -#include "sdm660-external.h" -#include "codecs/msm-cdc-pinctrl.h" -#include "codecs/sdm660_cdc/msm-analog-cdc.h" -#include "codecs/wsa881x.h" - -#define __CHIPSET__ "SDM660 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define DRV_NAME "sdm660-asoc-snd" - -#define MSM_INT_DIGITAL_CODEC "msm-dig-codec" -#define PMIC_INT_ANALOG_CODEC "analog-codec" - -#define DEV_NAME_STR_LEN 32 -#define DEFAULT_MCLK_RATE 9600000 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ - -enum { - DP_RX_IDX, - EXT_DISP_RX_IDX_MAX, -}; - -bool codec_reg_done; - -enum { - STATUS_PORT_STARTED, /* track if AFE port has started */ - /* track AFE Tx port status for bi-directional transfers */ - STATUS_TX_PORT, - /* track AFE Rx port status for bi-directional transfers */ - STATUS_RX_PORT, - STATUS_MAX -}; - -struct tdm_dai_data { - DECLARE_BITMAP(status_mask, STATUS_MAX); - u32 rate; - u32 channels; - u32 bitwidth; - u32 num_group_ports; - u32 is_island_dai; - struct afe_clk_set clk_set; /* hold LPASS clock config. */ - union afe_port_group_config group_cfg; /* hold tdm group config */ - struct afe_tdm_port_config port_cfg; /* hold tdm config */ -}; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } -}; - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - QUIN_AUX_PCM, - AUX_PCM_MAX, -}; - -enum { - PCM_I2S_SEL_PRIM = 0, - PCM_I2S_SEL_SEC, - PCM_I2S_SEL_TERT, - PCM_I2S_SEL_QUAT, - PCM_I2S_SEL_QUIN, - PCM_I2S_SEL_MAX, -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; - u32 msm_is_ext_mclk; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active); - -static struct wcd_mbhc_config mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .detect_extn_cable = true, - .mono_stero_detection = false, - .swap_gnd_mic = NULL, - .hs_ext_micbias = true, - .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, - .key_code[4] = 0, - .key_code[5] = 0, - .key_code[6] = 0, - .key_code[7] = 0, - .linein_th = 5000, - .moisture_en = false, - .mbhc_micbias = 0, - .anc_micbias = 0, - .enable_anc_mic_detect = false, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_96", "KHZ_192"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *mi2s_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight", - "Nine", "Ten", "Eleven", "Twelve", - "Thirteen", "Fourteen", "Fifteen", - "Sixteen"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_44P1", "KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static const char *const tdm_slot_num_text[] = {"One", "Two", "Four", - "Eight", "Sixteen", "ThirtyTwo"}; -static const char *const tdm_slot_width_text[] = {"16", "24", "32"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_96", "KHZ_192", "KHZ_384"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192"}; -static const char *const qos_text[] = {"Disable", "Enable"}; - -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_format, mi2s_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_slot_num, tdm_slot_num_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_slot_width, tdm_slot_width_text); -static SOC_ENUM_SINGLE_EXT_DECL(qos_vote, qos_text); - -static int qos_vote_status; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } -}; - -static struct afe_clk_set mi2s_mclk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_3, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_2, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_1, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_1, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } -}; - -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; - -/* TDM default slot config */ -struct tdm_slot_cfg { - u32 width; - u32 num; -}; - -static struct tdm_slot_cfg tdm_slot[TDM_INTERFACE_MAX] = { - /* PRI TDM */ - {32, 8}, - /* SEC TDM */ - {32, 8}, - /* TERT TDM */ - {32, 8}, - /* QUAT TDM */ - {32, 8}, - /* QUIN TDM */ - {32, 8} -}; - -static unsigned int tdm_rx_slot_offset - [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = { - {/* PRI TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* SEC TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* TERT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUAT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUIN TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - } -}; - -static unsigned int tdm_tx_slot_offset - [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = { - {/* PRI TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* SEC TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* TERT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUAT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},/*MIC ARR*/ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - }, - {/* QUIN TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - } -}; -static unsigned int tdm_param_set_slot_mask(int slots) -{ - unsigned int slot_mask = 0; - int i = 0; - - if ((slots <= 0) || (slots > 32)) { - pr_err("%s: invalid slot number %d\n", __func__, slots); - return -EINVAL; - } - - for (i = 0; i < slots ; i++) - slot_mask |= 1 << i; - - return slot_mask; -} - -int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int channels, slot_width, slots, rate, format; - unsigned int slot_mask; - unsigned int *slot_offset; - int offset_channels = 0; - int i; - int clk_freq; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - channels = params_channels(params); - if (channels < 1 || channels > 32) { - pr_err("%s: invalid param channels %d\n", - __func__, channels); - return -EINVAL; - } - - format = params_format(params); - if (format != SNDRV_PCM_FORMAT_S32_LE && - format != SNDRV_PCM_FORMAT_S24_LE && - format != SNDRV_PCM_FORMAT_S16_LE) { - /* - * up to 8 channels HW config should - * use 32 bit slot width for max support of - * stream bit width. (slot_width > bit_width) - */ - pr_err("%s: invalid param format 0x%x\n", - __func__, format); - return -EINVAL; - } - - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_0]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_1]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_2]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_3]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_4]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_5]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_6]; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_7]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_0]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_1]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_2]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_3]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_4]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_5]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_6]; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - slots = tdm_slot[TDM_PRI].num; - slot_width = tdm_slot[TDM_PRI].width; - slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_7]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_0]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_1]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_2]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_3]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_4]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_5]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_6]; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_7]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_0]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_1]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_2]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_3]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_4]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_5]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_6]; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - slots = tdm_slot[TDM_SEC].num; - slot_width = tdm_slot[TDM_SEC].width; - slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_7]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_0]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_1]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_2]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_3]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_4]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_5]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_6]; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_7]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_0]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_1]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_2]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_3]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_4]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_5]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_6]; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - slots = tdm_slot[TDM_TERT].num; - slot_width = tdm_slot[TDM_TERT].width; - slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_7]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_0]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_1]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_2]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_3]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_4]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_5]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_6]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_7]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_0]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_1]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_2]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_3]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_4]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_5]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_6]; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - slots = tdm_slot[TDM_QUAT].num; - slot_width = tdm_slot[TDM_QUAT].width; - slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_7]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_0]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_1]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_2]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_3]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_4]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_5]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_6]; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_7]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_0]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_1]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_2]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_3]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_4]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_5]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_6]; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - slots = tdm_slot[TDM_QUIN].num; - slot_width = tdm_slot[TDM_QUIN].width; - slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_7]; - break; - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID) - offset_channels++; - else - break; - } - - if (offset_channels == 0) { - pr_err("%s: slot offset not supported, offset_channels %d\n", - __func__, offset_channels); - return -EINVAL; - } - - if (channels > offset_channels) { - pr_err("%s: channels %d exceed offset_channels %d\n", - __func__, channels, offset_channels); - return -EINVAL; - } - - slot_mask = tdm_param_set_slot_mask(slots); - if (!slot_mask) { - pr_err("%s: invalid slot_mask 0x%x\n", - __func__, slot_mask); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - pr_debug("%s: slot_width %d\n", __func__, slot_width); - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL, - channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, channels, - slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) { - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - } - -end: - return ret; -} -EXPORT_SYMBOL(msm_tdm_snd_hw_params); - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 8; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int tdm_get_mode(struct snd_kcontrol *kcontrol) -{ - int mode; - - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - mode = TDM_QUAT; - } else if (strnstr(kcontrol->id.name, "QUIN", - sizeof(kcontrol->id.name))) { - mode = TDM_QUIN; - } else { - pr_err("%s: unsupported mode in: %s\n", - __func__, kcontrol->id.name); - mode = -EINVAL; - } - - return mode; -} - -static int tdm_get_channel(struct snd_kcontrol *kcontrol) -{ - int channel; - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s\n", - __func__, kcontrol->id.name); - channel = -EINVAL; - } - - return channel; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - port->mode = tdm_get_mode(kcontrol); - if (port->mode < 0) - return port->mode; - - port->channel = tdm_get_channel(kcontrol); - if (port->channel < 0) - return port->channel; - } else - return -EINVAL; - - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_get_format_value(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_get_slot_num_val(int slot_num) -{ - int slot_num_val; - - switch (slot_num) { - case 1: - slot_num_val = 0; - break; - case 2: - slot_num_val = 1; - break; - case 4: - slot_num_val = 2; - break; - case 8: - slot_num_val = 3; - break; - case 16: - slot_num_val = 4; - break; - case 32: - slot_num_val = 5; - break; - default: - slot_num_val = 5; - break; - } - return slot_num_val; -} - -static int tdm_slot_num_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - return mode; - } - - ucontrol->value.enumerated.item[0] = - tdm_get_slot_num_val(tdm_slot[mode].num); - - pr_debug("%s: mode = %d, tdm_slot_num = %d, item = %d\n", __func__, - mode, tdm_slot[mode].num, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_get_slot_num(int value) -{ - int slot_num; - - switch (value) { - case 0: - slot_num = 1; - break; - case 1: - slot_num = 2; - break; - case 2: - slot_num = 4; - break; - case 3: - slot_num = 8; - break; - case 4: - slot_num = 16; - break; - case 5: - slot_num = 32; - break; - default: - slot_num = 8; - break; - } - return slot_num; -} - -static int tdm_slot_num_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - return mode; - } - - tdm_slot[mode].num = - tdm_get_slot_num(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: mode = %d, tdm_slot_num = %d, item = %d\n", __func__, - mode, tdm_slot[mode].num, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_get_slot_width_val(int slot_width) -{ - int slot_width_val; - - switch (slot_width) { - case 16: - slot_width_val = 0; - break; - case 24: - slot_width_val = 1; - break; - case 32: - slot_width_val = 2; - break; - default: - slot_width_val = 2; - break; - } - return slot_width_val; -} - -static int tdm_slot_width_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - return mode; - } - - ucontrol->value.enumerated.item[0] = - tdm_get_slot_width_val(tdm_slot[mode].width); - - pr_debug("%s: mode = %d, tdm_slot_width = %d, item = %d\n", __func__, - mode, tdm_slot[mode].width, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_get_slot_width(int value) -{ - int slot_width; - - switch (value) { - case 0: - slot_width = 16; - break; - case 1: - slot_width = 24; - break; - case 2: - slot_width = 32; - break; - default: - slot_width = 32; - break; - } - return slot_width; -} - -static int tdm_slot_width_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int mode = tdm_get_mode(kcontrol); - - if (mode < 0) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - return mode; - } - - tdm_slot[mode].width = - tdm_get_slot_width(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: mode = %d, tdm_slot_width = %d, item = %d\n", __func__, - mode, tdm_slot[mode].width, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int tdm_rx_slot_mapping_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - if (port.mode < TDM_INTERFACE_MAX && - port.channel < TDM_PORT_MAX) { - slot_offset = - tdm_rx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - ucontrol->value.integer.value[i] = - slot_offset[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } else { - pr_err("%s: unsupported mode/channel\n", __func__); - } - } - return ret; -} - -static int tdm_rx_slot_mapping_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - if (port.mode < TDM_INTERFACE_MAX && - port.channel < TDM_PORT_MAX) { - slot_offset = - tdm_rx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - slot_offset[i] = - ucontrol->value.integer.value[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } else { - pr_err("%s: unsupported mode/channel\n", __func__); - } - } - return ret; -} - -static int tdm_tx_slot_mapping_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - if (port.mode < TDM_INTERFACE_MAX && - port.channel < TDM_PORT_MAX) { - slot_offset = - tdm_tx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - ucontrol->value.integer.value[i] = - slot_offset[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } else { - pr_err("%s: unsupported mode/channel\n", __func__); - } - } - return ret; -} - -static int tdm_tx_slot_mapping_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - unsigned int *slot_offset; - int i; - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - if (port.mode < TDM_INTERFACE_MAX && - port.channel < TDM_PORT_MAX) { - slot_offset = - tdm_tx_slot_offset[port.mode][port.channel]; - pr_debug("%s: mode = %d, channel = %d\n", - __func__, port.mode, port.channel); - for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) { - slot_offset[i] = - ucontrol->value.integer.value[i]; - pr_debug("%s: offset %d, value %d\n", - __func__, i, slot_offset[i]); - } - } else { - pr_err("%s: unsupported mode/channel\n", __func__); - } - } - return ret; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) - idx = PRIM_AUX_PCM; - else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) - idx = SEC_AUX_PCM; - else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) - idx = TERT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) - idx = QUAT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", - sizeof("QUIN_AUX_PCM"))) - idx = QUIN_AUX_PCM; - else { - pr_err("%s: unsupported port: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", - sizeof("QUIN_MI2S_RX"))) - idx = QUIN_MI2S; - else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", - sizeof("QUIN_MI2S_TX"))) - idx = QUIN_MI2S; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 6; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d] _tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d] _rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) - idx = DP_RX_IDX; - else { - pr_err("%s: unsupported BE: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int msm_qos_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.enumerated.item[0] = qos_vote_status; - - return 0; -} - -static int msm_qos_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_card *card = codec->component.card; - const char *fe_name = MSM_DAILINK_NAME(LowLatency); - struct snd_soc_pcm_runtime *rtd; - struct snd_pcm_substream *substream; - s32 usecs; - - rtd = snd_soc_get_pcm_runtime(card, fe_name); - if (!rtd) { - pr_err("%s: fail to get pcm runtime for %s\n", - __func__, fe_name); - return -EINVAL; - } - - substream = rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s: substream is null\n", __func__); - return -EINVAL; - } - - qos_vote_status = ucontrol->value.enumerated.item[0]; - if (qos_vote_status) { - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - if (!substream->runtime) { - pr_err("%s: runtime is null\n", __func__); - return -EINVAL; - } - usecs = MSM_LL_QOS_VALUE; - if (usecs >= 0) - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, usecs); - } else { - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - } - - return 0; -} - -const struct snd_kcontrol_new msm_common_snd_controls[] = { - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", prim_mi2s_rx_format, - mi2s_rx_format_get, - mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", sec_mi2s_rx_format, - mi2s_rx_format_get, - mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", tert_mi2s_rx_format, - mi2s_rx_format_get, - mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", quat_mi2s_rx_format, - mi2s_rx_format_get, - mi2s_rx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Format", quin_mi2s_rx_format, - mi2s_rx_format_get, - mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", prim_mi2s_tx_format, - mi2s_tx_format_get, - mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", sec_mi2s_tx_format, - mi2s_tx_format_get, - mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", tert_mi2s_tx_format, - mi2s_tx_format_get, - mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", quat_mi2s_tx_format, - mi2s_tx_format_get, - mi2s_tx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Format", quin_mi2s_tx_format, - mi2s_tx_format_get, - mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRI_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("PRI_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("SEC_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("SEC_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("TERT_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("TERT_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("QUAT_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("QUAT_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_ENUM_EXT("QUIN_TDM SlotNumber", tdm_slot_num, - tdm_slot_num_get, tdm_slot_num_put), - SOC_ENUM_EXT("QUIN_TDM SlotWidth", tdm_slot_width, - tdm_slot_width_get, tdm_slot_width_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_RX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_0 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_1 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_2 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_3 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_4 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_5 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_6 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_SINGLE_MULTI_EXT("QUIN_TDM_TX_7 SlotMapping", - SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX, - tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put), - SOC_ENUM_EXT("MultiMedia5_RX QOS Vote", qos_vote, msm_qos_ctl_get, - msm_qos_ctl_put), -}; - -/** - * msm_common_snd_controls_size - to return controls size - * - * Return: returns size of common controls array - */ -int msm_common_snd_controls_size(void) -{ - return ARRAY_SIZE(msm_common_snd_controls); -} -EXPORT_SYMBOL(msm_common_snd_controls_size); - -void msm_set_codec_reg_done(bool done) -{ - codec_reg_done = done; -} -EXPORT_SYMBOL(msm_set_codec_reg_done); - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_1].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_2].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_3].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_4].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_4].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_5].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_5].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_6].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_6].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_7].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_PRI][TDM_7].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_1].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_2].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_3].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_4].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_4].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_5].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_5].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_6].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_6].sample_rate; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_7].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_PRI][TDM_7].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_1].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_2].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_3].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_4].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_4].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_5].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_5].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_6].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_6].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_7].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_SEC][TDM_7].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_1].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_2].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_3].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_4].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_4].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_5].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_5].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_6].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_6].sample_rate; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_7].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_SEC][TDM_7].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_4].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_4].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_5].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_5].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_6].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_6].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_7].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_TERT][TDM_7].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_4].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_4].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_5].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_5].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_6].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_6].sample_rate; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_7].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_TERT][TDM_7].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_4].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_4].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_5].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_5].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_6].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_6].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_7].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_7].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_3].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_4].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_4].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_5].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_5].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_6].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_6].sample_rate; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_7].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUAT][TDM_7].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_2].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_3].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_3].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_4].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_4].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_5].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_5].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_6].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_6].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_7].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUIN][TDM_7].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_1].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_1].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_2].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_2].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_2].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_3].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_3].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_3].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_4].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_4].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_4].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_5].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_5].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_5].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_6].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_6].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_6].sample_rate; - break; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_7].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_7].bit_format); - rate->min = rate->max = - tdm_tx_cfg[TDM_QUIN][TDM_7].sample_rate; - break; - - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n", - __func__, cpu_dai->id, channels->max, rate->max, - params_format(params)); - - return 0; -} -EXPORT_SYMBOL(msm_tdm_be_hw_params_fixup); - -static int msm_ext_disp_get_idx_from_beid(int32_t id) -{ - int idx; - - switch (id) { - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = DP_RX_IDX; - break; - default: - pr_err("%s: Incorrect ext_disp id %d\n", __func__, id); - idx = -EINVAL; - break; - } - - return idx; -} - -/** - * msm_common_be_hw_params_fixup - updates settings of ALSA BE hw params. - * - * @rtd: runtime dailink instance - * @params: HW params of associated backend dailink. - * - * Returns 0. - */ -int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - break; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: - rate->min = rate->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - rate->min = rate->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUIN_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUIN_MI2S].bit_format); - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUIN_MI2S].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUIN_MI2S].bit_format); - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - return rc; -} -EXPORT_SYMBOL(msm_common_be_hw_params_fixup); - -/** - * msm_aux_pcm_snd_startup - startup ops of auxpcm. - * - * @substream: PCM stream pointer of associated backend dailink - * - * Returns 0 on success or -EINVAL on error. - */ -int msm_aux_pcm_snd_startup(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - rtd->cpu_dai->name, rtd->cpu_dai->id); - - return 0; -} -EXPORT_SYMBOL(msm_aux_pcm_snd_startup); - -/** - * msm_aux_pcm_snd_shutdown - shutdown ops of auxpcm. - * - * @substream: PCM stream pointer of associated backend dailink - */ -void msm_aux_pcm_snd_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, - substream->name, substream->stream, - rtd->cpu_dai->name, rtd->cpu_dai->id); -} -EXPORT_SYMBOL(msm_aux_pcm_snd_shutdown); - -static int msm_get_port_id(int id) -{ - int afe_port_id; - - switch (id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid id: %d\n", __func__, id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto done; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto done; - } - -done: - return ret; -} - -/** - * msm_mi2s_snd_startup - startup ops of mi2s. - * - * @substream: PCM stream pointer of associated backend dailink - * - * Returns 0 on success or -EINVAL on error. - */ -int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = msm_get_port_id(rtd->dai_link->id); - int index = cpu_dai->id; - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto done; - } - /* - * Muxtex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - if (mi2s_intf_conf[index].msm_is_ext_mclk) { - mi2s_mclk[index].enable = 1; - pr_debug("%s: Enabling mclk, clk_freq_in_hz = %u\n", - __func__, mi2s_mclk[index].clk_freq_in_hz); - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_mclk[index]); - if (ret < 0) { - pr_err("%s: afe lpass mclk failed, err:%d\n", - __func__, ret); - goto clk_off; - } - } - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[index]); - } - mutex_unlock(&mi2s_intf_conf[index].lock); - return 0; -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -done: - return ret; -} -EXPORT_SYMBOL(msm_mi2s_snd_startup); - -/** - * msm_mi2s_snd_shutdown - shutdown ops of mi2s. - * - * @substream: PCM stream pointer of associated backend dailink - */ -void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int port_id = msm_get_port_id(rtd->dai_link->id); - int index = rtd->cpu_dai->id; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (index < PRIM_MI2S || index >= MI2S_MAX) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[index]); - - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - - if (mi2s_intf_conf[index].msm_is_ext_mclk) { - mi2s_mclk[index].enable = 0; - pr_debug("%s: Disabling mclk, clk_freq_in_hz = %u\n", - __func__, mi2s_mclk[index].clk_freq_in_hz); - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_mclk[index]); - if (ret < 0) { - pr_err("%s: mclk disable failed for MCLK (%d); ret=%d\n", - __func__, index, ret); - } - } - } - mutex_unlock(&mi2s_intf_conf[index].lock); -} -EXPORT_SYMBOL(msm_mi2s_snd_shutdown); - -static int msm_get_tdm_mode(u32 port_id) -{ - int tdm_mode; - - switch (port_id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - tdm_mode = TDM_PRI; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - tdm_mode = TDM_SEC; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - tdm_mode = TDM_TERT; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - tdm_mode = TDM_QUAT; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - tdm_mode = TDM_QUIN; - break; - default: - pr_err("%s: Invalid port id: %d\n", __func__, port_id); - tdm_mode = -EINVAL; - } - return tdm_mode; -} - -int msm_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct tdm_dai_data *dai_data = dev_get_drvdata(cpu_dai->dev); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode < 0) { - dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__); - return tdm_mode; - } - dai_data->clk_set.enable = true; - ret = afe_set_lpass_clock_v2(cpu_dai->id, &dai_data->clk_set); - if (ret < 0) - pr_err("%s: afe lpass clock failed, err:%d\n", - __func__, ret); - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if (pdata->mi2s_gpio_p[tdm_mode]) - ret = msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[tdm_mode]); - return ret; -} -EXPORT_SYMBOL(msm_tdm_snd_startup); - -void msm_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct tdm_dai_data *dai_data = dev_get_drvdata(cpu_dai->dev); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - int ret; - - if (tdm_mode < 0) { - dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__); - return; - } - dai_data->clk_set.enable = false; - ret = afe_set_lpass_clock_v2(cpu_dai->id, &dai_data->clk_set); - if (ret < 0) - pr_err("%s: afe lpass clock failed, err:%d\n", __func__, ret); - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if (pdata->mi2s_gpio_p[tdm_mode]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[tdm_mode]); -} -EXPORT_SYMBOL(msm_tdm_snd_shutdown); - -/* Validate whether US EU switch is present or not */ -static int msm_prepare_us_euro(struct snd_soc_card *card) -{ - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - int ret = 0; - - if (pdata->us_euro_gpio >= 0) { - dev_dbg(card->dev, "%s: us_euro gpio request %d", __func__, - pdata->us_euro_gpio); - ret = gpio_request(pdata->us_euro_gpio, "TASHA_CODEC_US_EURO"); - if (ret) { - dev_err(card->dev, - "%s: Failed to request codec US/EURO gpio %d error %d\n", - __func__, pdata->us_euro_gpio, ret); - } - } - - return ret; -} - - -static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - int value = 0; - bool ret = false; - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct pinctrl_state *en2_pinctrl_active; - struct pinctrl_state *en2_pinctrl_sleep; - - if (!pdata->usbc_en2_gpio_p) { - if (active) { - /* if active and usbc_en2_gpio undefined, get pin */ - pdata->usbc_en2_gpio_p = devm_pinctrl_get(card->dev); - if (IS_ERR_OR_NULL(pdata->usbc_en2_gpio_p)) { - dev_err(card->dev, - "%s: Can't get EN2 gpio pinctrl:%ld\n", - __func__, - PTR_ERR(pdata->usbc_en2_gpio_p)); - pdata->usbc_en2_gpio_p = NULL; - return false; - } - } else { - /* if not active and usbc_en2_gpio undefined, return */ - return false; - } - } - - pdata->usbc_en2_gpio = of_get_named_gpio(card->dev->of_node, - "qcom,usbc-analog-en2-gpio", 0); - if (!gpio_is_valid(pdata->usbc_en2_gpio)) { - dev_err(card->dev, "%s, property %s not in node %s\n", - __func__, "qcom,usbc-analog-en2-gpio", - card->dev->of_node->full_name); - return false; - } - - en2_pinctrl_active = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_active"); - if (IS_ERR_OR_NULL(en2_pinctrl_active)) { - dev_err(card->dev, - "%s: Cannot get aud_active pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_active)); - ret = false; - goto err_lookup_state; - } - - en2_pinctrl_sleep = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_sleep"); - if (IS_ERR_OR_NULL(en2_pinctrl_sleep)) { - dev_err(card->dev, - "%s: Cannot get aud_sleep pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_sleep)); - ret = false; - goto err_lookup_state; - } - - /* if active and usbc_en2_gpio_p defined, swap using usbc_en2_gpio_p */ - if (active) { - dev_dbg(codec->dev, "%s: enter\n", __func__); - if (pdata->usbc_en2_gpio_p) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - if (value) - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - else - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_active); - } else if (pdata->usbc_en2_gpio >= 0) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - gpio_set_value_cansleep(pdata->usbc_en2_gpio, !value); - } - pr_debug("%s: swap select switch %d to %d\n", __func__, - value, !value); - ret = true; - } else { - /* if not active, release usbc_en2_gpio_p pin */ - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - } - -err_lookup_state: - devm_pinctrl_put(pdata->usbc_en2_gpio_p); - pdata->usbc_en2_gpio_p = NULL; - return ret; -} - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - int value = 0; - bool ret = 0; - - if (!mbhc_cfg.enable_usbc_analog) { - if (pdata->us_euro_gpio_p) { - value = msm_cdc_pinctrl_get_state( - pdata->us_euro_gpio_p); - if (value) - msm_cdc_pinctrl_select_sleep_state( - pdata->us_euro_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - pdata->us_euro_gpio_p); - } else if (pdata->us_euro_gpio >= 0) { - value = gpio_get_value_cansleep(pdata->us_euro_gpio); - gpio_set_value_cansleep(pdata->us_euro_gpio, !value); - } - pr_debug("%s: swap select switch %d to %d\n", - __func__, value, !value); - ret = true; - } else { - /* if usbc is defined, swap using usbc_en2 */ - ret = msm_usbc_swap_gnd_mic(codec, active); - } - return ret; -} - -static int msm_populate_dai_link_component_of_node( - struct msm_asoc_mach_data *pdata, - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *phandle; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto cpu_dai; - } - phandle = of_parse_phandle(cdev->of_node, - "asoc-platform", - index); - if (!phandle) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = phandle; - dai_link[i].platform_name = NULL; - } -cpu_dai: - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index < 0) - goto codec_dai; - phandle = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!phandle) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = phandle; - dai_link[i].cpu_dai_name = NULL; - } -codec_dai: - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - phandle = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!phandle) { - pr_err("%s: retrieving phandle for codec dai %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = phandle; - dai_link[i].codec_name = NULL; - } - if (pdata->snd_card_val == INT_SND_CARD) { - if ((dai_link[i].id == - MSM_BACKEND_DAI_INT0_MI2S_RX) || - (dai_link[i].id == - MSM_BACKEND_DAI_INT1_MI2S_RX) || - (dai_link[i].id == - MSM_BACKEND_DAI_INT2_MI2S_TX) || - (dai_link[i].id == - MSM_BACKEND_DAI_INT3_MI2S_TX)) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - MSM_INT_DIGITAL_CODEC); - phandle = of_parse_phandle(cdev->of_node, - "asoc-codec", - index); - dai_link[i].codecs[DIG_CDC].of_node = phandle; - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - PMIC_INT_ANALOG_CODEC); - phandle = of_parse_phandle(cdev->of_node, - "asoc-codec", - index); - dai_link[i].codecs[ANA_CDC].of_node = phandle; - } - } - } -err: - return ret; -} - -static int msm_wsa881x_init(struct snd_soc_component *component) -{ - u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {100, 101, 102, 106}; - u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {103, 104, 105, 107}; - unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200}; - unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm = - snd_soc_codec_get_dapm(codec); - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - return -EINVAL; - } - - - pdata = snd_soc_card_get_drvdata(component->card); - if (pdata && pdata->codec_root) - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); - return 0; -} - - -static int msm_init_wsa_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - char *dev_name_str = NULL; - struct msm_wsa881x_dev_info *wsa881x_dev_info; - const char *wsa_auxdev_name_prefix[1]; - int found = 0; - int i; - int ret; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_dbg(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - goto err_dt; - } - if (wsa_max_devs == 0) { - dev_warn(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - goto err_dt; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err_dt; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err_dt; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err_dt; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err_mem; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err_dev_node; - } - if (soc_find_component(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - - card->num_aux_devs = wsa_max_devs; - card->num_configs = wsa_max_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err_auxdev_mem; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err_codec_conf; - } - - for (i = 0; i < card->num_aux_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err_dev_str; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - wsa_auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err_dt_prop; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_init; - msm_codec_conf[i].dev_name = NULL; - msm_codec_conf[i].name_prefix = wsa_auxdev_name_prefix[0]; - msm_codec_conf[i].of_node = wsa881x_dev_info[i].of_node; - } - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; - return 0; - -err_dt_prop: - devm_kfree(&pdev->dev, dev_name_str); -err_dev_str: - devm_kfree(&pdev->dev, msm_codec_conf); -err_codec_conf: - devm_kfree(&pdev->dev, msm_aux_dev); -err_auxdev_mem: -err_dev_node: - devm_kfree(&pdev->dev, wsa881x_dev_info); -err_mem: -err_dt: - return ret; -} - -static void i2s_auxpcm_init(struct platform_device *pdev) -{ - int count; - u32 mi2s_master_slave[MI2S_MAX]; - u32 mi2s_ext_mclk[MI2S_MAX]; - int ret; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-ext-mclk", - mi2s_ext_mclk, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-ext-mclk in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) - mi2s_intf_conf[count].msm_is_ext_mclk = - mi2s_ext_mclk[count]; - } -} - -static const struct of_device_id sdm660_asoc_machine_of_match[] = { - { .compatible = "qcom,sdm660-asoc-snd", - .data = "internal_codec"}, - { .compatible = "qcom,sdm660-asoc-snd-tasha", - .data = "tasha_codec"}, - { .compatible = "qcom,sdm660-asoc-snd-tavil", - .data = "tavil_codec"}, - { .compatible = "qcom,sdm670-asoc-snd", - .data = "internal_codec"}, - { .compatible = "qcom,sdm670-asoc-snd-tasha", - .data = "tasha_codec"}, - { .compatible = "qcom,sdm670-asoc-snd-tavil", - .data = "tavil_codec"}, - {}, -}; - -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card = NULL; - struct msm_asoc_mach_data *pdata = NULL; - const char *mclk = "qcom,msm-mclk-freq"; - int ret = -EINVAL, id; - const struct of_device_id *match; - const char *usb_c_dt = "qcom,msm-mbhc-usbc-audio-supported"; - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), - GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - msm_set_codec_reg_done(false); - match = of_match_node(sdm660_asoc_machine_of_match, - pdev->dev.of_node); - if (!match) - goto err; - - ret = of_property_read_u32(pdev->dev.of_node, mclk, &id); - if (ret) { - dev_err(&pdev->dev, - "%s: missing %s in dt node\n", __func__, mclk); - id = DEFAULT_MCLK_RATE; - } - pdata->mclk_freq = id; - - if (!strcmp(match->data, "tasha_codec") || - !strcmp(match->data, "tavil_codec")) { - if (!strcmp(match->data, "tasha_codec")) - pdata->snd_card_val = EXT_SND_CARD_TASHA; - else - pdata->snd_card_val = EXT_SND_CARD_TAVIL; - ret = msm_ext_cdc_init(pdev, pdata, &card, &mbhc_cfg); - if (ret) - goto err; - } else if (!strcmp(match->data, "internal_codec")) { - pdata->snd_card_val = INT_SND_CARD; - ret = msm_int_cdc_init(pdev, pdata, &card, &mbhc_cfg); - if (ret) - goto err; - } else { - dev_err(&pdev->dev, - "%s: Not a matching DT sound node\n", __func__); - goto err; - } - if (!card) - goto err; - - if (pdata->snd_card_val == INT_SND_CARD) { - /*reading the gpio configurations from dtsi file*/ - pdata->pdm_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-pdm-gpios", 0); - pdata->comp_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-comp-gpios", 0); - pdata->dmic_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic-gpios", 0); - pdata->ext_spk_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-ext-spk-gpios", 0); - } - - pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,pri-mi2s-gpios", 0); - pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,sec-mi2s-gpios", 0); - pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,tert-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quat-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quin-mi2s-gpios", 0); - /* - * Parse US-Euro gpio info from DT. Report no error if us-euro - * entry is not found in DT file as some targets do not support - * US-Euro detection - */ - pdata->us_euro_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!gpio_is_valid(pdata->us_euro_gpio)) - pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!gpio_is_valid(pdata->us_euro_gpio) && (!pdata->us_euro_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,us-euro-gpios", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "%s detected", - "qcom,us-euro-gpios"); - mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - } - - if (of_find_property(pdev->dev.of_node, usb_c_dt, NULL)) - mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - - ret = msm_prepare_us_euro(card); - if (ret) - dev_dbg(&pdev->dev, "msm_prepare_us_euro failed (%d)\n", - ret); - - i2s_auxpcm_init(pdev); - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) - goto err; - ret = msm_populate_dai_link_component_of_node(pdata, card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - - if (!of_property_read_bool(pdev->dev.of_node, "qcom,wsa-disable")) { - ret = msm_init_wsa_dev(pdev, card); - if (ret) - goto err; - } - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) { - /* - * return failure as EINVAL since other codec - * registered sound card successfully. - * This avoids any further probe calls. - */ - ret = -EINVAL; - } - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - if (pdata->snd_card_val != INT_SND_CARD) - msm_ext_register_audio_notifier(pdev); - - return 0; -err: - if (pdata->us_euro_gpio > 0) { - dev_dbg(&pdev->dev, "%s free us_euro gpio %d\n", - __func__, pdata->us_euro_gpio); - pdata->us_euro_gpio = 0; - } - if (pdata->hph_en1_gpio > 0) { - dev_dbg(&pdev->dev, "%s free hph_en1_gpio %d\n", - __func__, pdata->hph_en1_gpio); - gpio_free(pdata->hph_en1_gpio); - pdata->hph_en1_gpio = 0; - } - if (pdata->hph_en0_gpio > 0) { - dev_dbg(&pdev->dev, "%s free hph_en0_gpio %d\n", - __func__, pdata->hph_en0_gpio); - gpio_free(pdata->hph_en0_gpio); - pdata->hph_en0_gpio = 0; - } - if (pdata->snd_card_val != INT_SND_CARD) - msm_ext_cdc_deinit(pdata); - devm_kfree(&pdev->dev, pdata); - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - if (pdata->snd_card_val == INT_SND_CARD) - mutex_destroy(&pdata->cdc_int_mclk0_mutex); - - if (gpio_is_valid(pdata->us_euro_gpio)) { - gpio_free(pdata->us_euro_gpio); - pdata->us_euro_gpio = 0; - } - if (gpio_is_valid(pdata->hph_en1_gpio)) { - gpio_free(pdata->hph_en1_gpio); - pdata->hph_en1_gpio = 0; - } - if (gpio_is_valid(pdata->hph_en0_gpio)) { - gpio_free(pdata->hph_en0_gpio); - pdata->hph_en0_gpio = 0; - } - - if (pdata->snd_card_val != INT_SND_CARD) { - audio_notifier_deregister("sdm660"); - msm_ext_cdc_deinit(pdata); - } - - snd_soc_unregister_card(card); - return 0; -} - -static struct platform_driver sdm660_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = sdm660_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; -module_platform_driver(sdm660_asoc_machine_driver); - -MODULE_DESCRIPTION("ALSA SoC msm"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, sdm660_asoc_machine_of_match); diff --git a/techpack/audio/asoc/sdm660-common.h b/techpack/audio/asoc/sdm660-common.h deleted file mode 100644 index 115a6204893e..000000000000 --- a/techpack/audio/asoc/sdm660-common.h +++ /dev/null @@ -1,154 +0,0 @@ -/* Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MSM_COMMON -#define __MSM_COMMON - -#include -#include -#include "codecs/wcd-mbhc-v2.h" - -#define DEFAULT_MCLK_RATE 9600000 -#define NATIVE_MCLK_RATE 11289600 - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define TDM_CHANNEL_MAX 16 -#define TDM_SLOT_OFFSET_MAX 32 - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_QUIN, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - QUIN_MI2S, - MI2S_MAX, -}; - -enum { - DIG_CDC, - ANA_CDC, - CODECS_MAX, -}; - -extern const struct snd_kcontrol_new msm_common_snd_controls[]; -extern bool codec_reg_done; -struct sdm660_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); -}; - -enum { - INT_SND_CARD, - EXT_SND_CARD_TASHA, - 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 usbc_en2_gpio; /* used by gpio driver API */ - int hph_en1_gpio; - int hph_en0_gpio; - struct device_node *us_euro_gpio_p; /* used by pinctrl API */ - struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ - struct device_node *pdm_gpio_p; /* used by pinctrl API */ - struct device_node *comp_gpio_p; /* used by pinctrl API */ - struct device_node *dmic_gpio_p; /* used by pinctrl API */ - struct device_node *ext_spk_gpio_p; /* used by pinctrl API */ - struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */ - struct snd_soc_codec *codec; - struct sdm660_codec sdm660_codec_fn; - struct snd_info_entry *codec_root; - int spk_ext_pa_gpio; - int mclk_freq; - bool native_clk_set; - int lb_mode; - int snd_card_val; - u8 micbias1_cap_mode; - u8 micbias2_cap_mode; - atomic_t int_mclk0_rsc_ref; - atomic_t int_mclk0_enabled; - 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, - struct snd_pcm_hw_params *params); -int msm_aux_pcm_snd_startup(struct snd_pcm_substream *substream); -void msm_aux_pcm_snd_shutdown(struct snd_pcm_substream *substream); -int msm_mi2s_snd_startup(struct snd_pcm_substream *substream); -void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream); -int msm_common_snd_controls_size(void); -void msm_set_codec_reg_done(bool done); -int msm_tdm_snd_startup(struct snd_pcm_substream *substream); -void msm_tdm_snd_shutdown(struct snd_pcm_substream *substream); -int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params); -int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params); -#endif diff --git a/techpack/audio/asoc/sdm660-ext-dai-links.c b/techpack/audio/asoc/sdm660-ext-dai-links.c deleted file mode 100644 index 4e9c2822c31e..000000000000 --- a/techpack/audio/asoc/sdm660-ext-dai-links.c +++ /dev/null @@ -1,1999 +0,0 @@ -/* Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "sdm660-common.h" -#include "sdm660-external.h" -#include "codecs/core.h" -#include "codecs/wcd9335.h" -#include - -#define DEV_NAME_STR_LEN 32 -#define __CHIPSET__ "SDM660 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define WCN_CDC_SLIM_RX_CH_MAX 2 -#define WCN_CDC_SLIM_TX_CH_MAX 3 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ - -static struct snd_soc_card snd_soc_card_msm_card_tavil = { - .name = "sdm670-tavil-snd-card", - .late_probe = msm_snd_card_tavil_late_probe, -}; - -static struct snd_soc_card snd_soc_card_msm_card_tasha = { - .name = "sdm670-tasha-snd-card", - .late_probe = msm_snd_card_tasha_late_probe, -}; - -static struct snd_soc_ops msm_ext_slimbus_be_ops = { - .hw_params = msm_snd_hw_params, -}; - -static struct snd_soc_ops msm_ext_cpe_ops = { - .hw_params = msm_snd_cpe_hw_params, -}; - -static struct snd_soc_ops msm_ext_slimbus_2_be_ops = { - .hw_params = msm_ext_slimbus_2_hw_params, -}; - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_aux_pcm_be_ops = { - .startup = msm_aux_pcm_snd_startup, - .shutdown = msm_aux_pcm_snd_shutdown, -}; - -static struct snd_soc_ops msm_tdm_be_ops = { - .startup = msm_tdm_snd_startup, - .shutdown = msm_tdm_snd_shutdown, - .hw_params = msm_tdm_snd_hw_params, -}; - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto exit; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -exit: - return ret; -} - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -static struct snd_soc_dai_link msm_ext_tasha_fe_dai[] = { - /* tasha_vifeedback for speaker protection */ - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx2", - .ignore_suspend = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_ext_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx2", - .ignore_suspend = 1, - .dpcm_capture = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_ext_slimbus_2_be_ops, - }, - /* CPE LSM direct dai-link */ - { - .name = "CPE Listen service", - .stream_name = "CPE Listen Audio Service", - .cpu_dai_name = "msm-dai-slim", - .platform_name = "msm-cpe-lsm", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .dpcm_capture = 1, - .codec_dai_name = "tasha_mad1", - .codec_name = "tasha_codec", - .ops = &msm_ext_cpe_ops, - }, - { - .name = "SLIMBUS_6 Hostless Playback", - .stream_name = "SLIMBUS_6 Hostless", - .cpu_dai_name = "SLIMBUS6_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* CPE LSM EC PP direct dai-link */ - { - .name = "CPE Listen service ECPP", - .stream_name = "CPE Listen Audio Service ECPP", - .cpu_dai_name = "CPE_LSM_NOHOST", - .platform_name = "msm-cpe-lsm.3", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "tasha_cpe", - .codec_name = "tasha_codec", - }, -}; - -static struct snd_soc_dai_link msm_ext_tavil_fe_dai[] = { - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_ext_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_ext_slimbus_2_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_ext_tasha_be_dai[] = { - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_ext_slimbus_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_ext_slimbus_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_ext_tavil_be_dai[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_ext_slimbus_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_ext_slimbus_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_ext_slimbus_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_ext_common_fe_dai[] = { - /* FrontEnd DAI Links */ - {/* hw:x,0 */ - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - {/* hw:x,1 */ - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - {/* hw:x,2 */ - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - {/* hw:x,3 */ - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - {/* hw:x,4 */ - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "ULL", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - {/* hw:x,5 */ - .name = "SLIMBUS_0 Hostless", - .stream_name = "SLIMBUS_0 Hostless", - .cpu_dai_name = "SLIMBUS0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* This dai link has MI2S support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,6 */ - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - }, - {/* hw:x,7 */ - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .ignore_suspend = 1, - }, - {/* hw:x,8 */ - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - {/* hw:x,9*/ - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,10 */ - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,11 */ - .name = "SLIMBUS_3 Hostless", - .stream_name = "SLIMBUS_3 Hostless", - .cpu_dai_name = "SLIMBUS3_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,12 */ - .name = "SLIMBUS_4 Hostless", - .stream_name = "SLIMBUS_4 Hostless", - .cpu_dai_name = "SLIMBUS4_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,13 */ - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - /* LSM FE */ - {/* hw:x,14 */ - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - {/* hw:x,15 */ - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - {/* hw:x,16 */ - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - {/* hw:x,17 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - {/* hw:x,18 */ - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,19 */ - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - {/* hw:x,20 */ - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - {/* hw:x,21 */ - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - {/* hw:x,22 */ - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - {/* hw:x,23 */ - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - {/* hw:x,24 */ - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6 - }, - {/* hw:x,25 */ - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - {/* hw:x,26 */ - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - {/* hw:x,27 */ - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - {/* hw:x,28 */ - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - {/* hw:x,29 */ - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - {/* hw:x,30 */ - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - {/* hw:x,31 */ - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - {/* hw:x,32 */ - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - {/* hw:x,33 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - {/* hw:x,34 */ - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,35 */ - .name = "SLIMBUS7 Hostless", - .stream_name = "SLIMBUS7 Hostless", - .cpu_dai_name = "SLIMBUS7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,36 */ - .name = "SDM660 HFP TX", - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, -}; - -static struct snd_soc_dai_link msm_ext_common_be_dai[] = { - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_RX_0, - .stream_name = "Quinary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36928", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_TX_0, - .stream_name = "Quinary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36929", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_ext_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_ext_tasha_dai_links[ -ARRAY_SIZE(msm_ext_common_fe_dai) + -ARRAY_SIZE(msm_ext_tasha_fe_dai) + -ARRAY_SIZE(msm_ext_common_be_dai) + -ARRAY_SIZE(msm_ext_tasha_be_dai) + -ARRAY_SIZE(msm_mi2s_be_dai_links) + -ARRAY_SIZE(msm_auxpcm_be_dai_links) + -ARRAY_SIZE(msm_wcn_be_dai_links) + -ARRAY_SIZE(ext_disp_be_dai_link)]; - -static struct snd_soc_dai_link msm_ext_tavil_dai_links[ -ARRAY_SIZE(msm_ext_common_fe_dai) + -ARRAY_SIZE(msm_ext_tavil_fe_dai) + -ARRAY_SIZE(msm_ext_common_be_dai) + -ARRAY_SIZE(msm_ext_tavil_be_dai) + -ARRAY_SIZE(msm_mi2s_be_dai_links) + -ARRAY_SIZE(msm_auxpcm_be_dai_links) + -ARRAY_SIZE(msm_wcn_be_dai_links) + -ARRAY_SIZE(ext_disp_be_dai_link)]; - -/** - * populate_snd_card_dailinks - prepares dailink array and initializes card. - * - * @dev: device handle - * - * Returns card on success or NULL on failure. - */ -struct snd_soc_card *populate_snd_card_dailinks(struct device *dev, - int snd_card_val) -{ - struct snd_soc_card *card; - struct snd_soc_dai_link *msm_ext_dai_links = NULL; - int ret, len1, len2, len3, len4; - enum codec_variant codec_ver = 0; - - if (snd_card_val == EXT_SND_CARD_TASHA) { - card = &snd_soc_card_msm_card_tasha; - } else if (snd_card_val == EXT_SND_CARD_TAVIL) { - card = &snd_soc_card_msm_card_tavil; - } else { - dev_err(dev, "%s: failing as no matching card name\n", - __func__); - return NULL; - } - - card->dev = dev; - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(dev, "%s: parse card name failed, err:%d\n", - __func__, ret); - return NULL; - } - - if (strnstr(card->name, "tasha", strlen(card->name))) { - codec_ver = tasha_codec_ver(); - if (codec_ver == WCD9326) { - card->name = "sdm670-tashalite-snd-card"; - } else if (codec_ver == WCD9XXX) { - dev_err(dev, "%s: Invalid codec version %d\n", - __func__, codec_ver); - return NULL; - } - - len1 = ARRAY_SIZE(msm_ext_common_fe_dai); - len2 = len1 + ARRAY_SIZE(msm_ext_tasha_fe_dai); - len3 = len2 + ARRAY_SIZE(msm_ext_common_be_dai); - memcpy(msm_ext_tasha_dai_links, msm_ext_common_fe_dai, - sizeof(msm_ext_common_fe_dai)); - memcpy(msm_ext_tasha_dai_links + len1, - msm_ext_tasha_fe_dai, sizeof(msm_ext_tasha_fe_dai)); - memcpy(msm_ext_tasha_dai_links + len2, - msm_ext_common_be_dai, sizeof(msm_ext_common_be_dai)); - memcpy(msm_ext_tasha_dai_links + len3, - msm_ext_tasha_be_dai, sizeof(msm_ext_tasha_be_dai)); - len4 = len3 + ARRAY_SIZE(msm_ext_tasha_be_dai); - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(msm_ext_tasha_dai_links + len4, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - len4 += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(msm_ext_tasha_dai_links + len4, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - len4 += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(msm_ext_tasha_dai_links + len4, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - len4 += ARRAY_SIZE(msm_wcn_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_ext_tasha_dai_links + len4, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - len4 += ARRAY_SIZE(ext_disp_be_dai_link); - } - msm_ext_dai_links = msm_ext_tasha_dai_links; - } else if (strnstr(card->name, "tavil", strlen(card->name))) { - len1 = ARRAY_SIZE(msm_ext_common_fe_dai); - len2 = len1 + ARRAY_SIZE(msm_ext_tavil_fe_dai); - len3 = len2 + ARRAY_SIZE(msm_ext_common_be_dai); - memcpy(msm_ext_tavil_dai_links, msm_ext_common_fe_dai, - sizeof(msm_ext_common_fe_dai)); - memcpy(msm_ext_tavil_dai_links + len1, - msm_ext_tavil_fe_dai, sizeof(msm_ext_tavil_fe_dai)); - memcpy(msm_ext_tavil_dai_links + len2, - msm_ext_common_be_dai, sizeof(msm_ext_common_be_dai)); - memcpy(msm_ext_tavil_dai_links + len3, - msm_ext_tavil_be_dai, sizeof(msm_ext_tavil_be_dai)); - len4 = len3 + ARRAY_SIZE(msm_ext_tavil_be_dai); - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(msm_ext_tavil_dai_links + len4, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - len4 += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(msm_ext_tavil_dai_links + len4, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - len4 += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(msm_ext_tavil_dai_links + len4, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - len4 += ARRAY_SIZE(msm_wcn_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_ext_tavil_dai_links + len4, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - len4 += ARRAY_SIZE(ext_disp_be_dai_link); - } - msm_ext_dai_links = msm_ext_tavil_dai_links; - } else { - dev_err(dev, "%s: failing as no matching card name\n", - __func__); - return NULL; - } - card->dai_link = msm_ext_dai_links; - card->num_links = len4; - - return card; -} -EXPORT_SYMBOL(populate_snd_card_dailinks); diff --git a/techpack/audio/asoc/sdm660-external.c b/techpack/audio/asoc/sdm660-external.c deleted file mode 100644 index 9c08779cd1db..000000000000 --- a/techpack/audio/asoc/sdm660-external.c +++ /dev/null @@ -1,1951 +0,0 @@ -/* Copyright (c) 2015-2018, 2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "sdm660-common.h" -#include "sdm660-external.h" -#include "codecs/wcd9335.h" -#include "codecs/wcd934x/wcd934x.h" -#include "codecs/wcd934x/wcd934x-mbhc.h" -#include - -#define SDM660_SPK_ON 1 -#define SDM660_SPK_OFF 0 - -#define WCD9XXX_MBHC_DEF_BUTTONS 8 -#define WCD9XXX_MBHC_DEF_RLOADS 5 -#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 0x179D1318 -#define LPI_GPIO22_INOUT_VAL 0x0020000 - - -#define WSA8810_NAME_1 "wsa881x.20170211" -#define WSA8810_NAME_2 "wsa881x.20170212" -#define SDM660_SOC_MSM_ID 0x13D -static int msm_ext_spk_control = 1; -static struct wcd_mbhc_config *wcd_mbhc_cfg_ptr; - -struct msm_asoc_wcd93xx_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); - void (*mbhc_hs_detect_exit)(struct snd_soc_codec *codec); -}; - -static struct msm_asoc_wcd93xx_codec msm_codec_fn; -static struct platform_device *spdev; - -static bool is_initial_boot; - -static void *def_ext_mbhc_cal(void); - -enum { - SLIM_RX_0 = 0, - SLIM_RX_1, - SLIM_RX_2, - SLIM_RX_3, - SLIM_RX_4, - SLIM_RX_5, - SLIM_RX_6, - SLIM_RX_7, - SLIM_RX_MAX, -}; - -enum { - SLIM_TX_0 = 0, - SLIM_TX_1, - SLIM_TX_2, - SLIM_TX_3, - SLIM_TX_4, - SLIM_TX_5, - SLIM_TX_6, - SLIM_TX_7, - SLIM_TX_8, - SLIM_TX_MAX, -}; - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static int msm_vi_feed_tx_ch = 2; -static const char *const slim_rx_ch_text[] = {"One", "Two"}; -static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static const char *const spk_function_text[] = {"Off", "On"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; - -static SOC_ENUM_SINGLE_EXT_DECL(spk_func_en, spk_function_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); - -static int slim_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 10; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int slim_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int slim_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - val = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int slim_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - bit_fmt = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int slim_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) - port_id = SLIM_RX_0; - else if (strnstr(kcontrol->id.name, "SLIM_2_RX", sizeof("SLIM_2_RX"))) - port_id = SLIM_RX_2; - else if (strnstr(kcontrol->id.name, "SLIM_5_RX", sizeof("SLIM_5_RX"))) - port_id = SLIM_RX_5; - else if (strnstr(kcontrol->id.name, "SLIM_6_RX", sizeof("SLIM_6_RX"))) - port_id = SLIM_RX_6; - else if (strnstr(kcontrol->id.name, "SLIM_0_TX", sizeof("SLIM_0_TX"))) - port_id = SLIM_TX_0; - else if (strnstr(kcontrol->id.name, "SLIM_1_TX", sizeof("SLIM_1_TX"))) - port_id = SLIM_TX_1; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].sample_rate = - slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate = 0; - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - if (sample_rate == SAMPLING_RATE_44P1KHZ) { - pr_err("%s: Unsupported sample rate %d: for Tx path\n", - __func__, sample_rate); - return -EINVAL; - } - slim_tx_cfg[ch_num].sample_rate = sample_rate; - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_slim_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1; - - return 0; -} - -static int msm_slim_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - - return 1; -} - -static int msm_slim_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1; - - return 0; -} - -static int msm_slim_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static void *def_ext_mbhc_cal(void) -{ - void *wcd_mbhc_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!wcd_mbhc_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->X) = (Y)) - S(v_hs_max, 1600); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; - - return wcd_mbhc_cal; -} - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - - -static void msm_ext_control(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = - snd_soc_codec_get_dapm(codec); - - pr_debug("%s: msm_ext_spk_control = %d", __func__, msm_ext_spk_control); - if (msm_ext_spk_control == SDM660_SPK_ON) { - snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp"); - } else { - snd_soc_dapm_disable_pin(dapm, "Lineout_1 amp"); - snd_soc_dapm_disable_pin(dapm, "Lineout_3 amp"); - } - snd_soc_dapm_sync(dapm); -} - -static int msm_ext_get_spk(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: msm_ext_spk_control = %d\n", - __func__, msm_ext_spk_control); - ucontrol->value.integer.value[0] = msm_ext_spk_control; - return 0; -} - -static int msm_ext_set_spk(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - pr_debug("%s()\n", __func__); - if (msm_ext_spk_control == ucontrol->value.integer.value[0]) - return 0; - - msm_ext_spk_control = ucontrol->value.integer.value[0]; - msm_ext_control(codec); - return 1; -} - - -int msm_ext_enable_codec_mclk(struct snd_soc_codec *codec, int enable, - bool dapm) -{ - int ret; - - pr_debug("%s: enable = %d\n", __func__, enable); - - if (!strcmp(dev_name(codec->dev), "tasha_codec")) - ret = tasha_cdc_mclk_enable(codec, enable, dapm); - else if (!strcmp(dev_name(codec->dev), "tavil_codec")) - ret = tavil_cdc_mclk_enable(codec, enable); - else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("Speaker Function", spk_func_en, msm_ext_get_spk, - msm_ext_set_spk), - SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs, - msm_slim_tx_ch_get, msm_slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs, - msm_slim_tx_ch_get, msm_slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), - SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format, - slim_tx_bit_format_get, slim_tx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate, - slim_tx_sample_rate_get, slim_tx_sample_rate_put), - SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), -}; - -static int msm_slim_get_ch_from_beid(int32_t id) -{ - int ch_id = 0; - - switch (id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - ch_id = SLIM_RX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - ch_id = SLIM_RX_1; - break; - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - ch_id = SLIM_RX_2; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - ch_id = SLIM_RX_3; - break; - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - ch_id = SLIM_RX_4; - break; - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - ch_id = SLIM_RX_6; - break; - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - ch_id = SLIM_TX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - ch_id = SLIM_TX_3; - break; - default: - ch_id = SLIM_RX_0; - break; - } - - return ch_id; -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -/** - * msm_ext_be_hw_params_fixup - updates settings of ALSA BE hw params. - * - * @rtd: runtime dailink instance - * @params: HW params of associated backend dailink. - * - * Returns 0 on success or rc on failure. - */ -int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - void *config = NULL; - struct snd_soc_codec *codec = rtd->codec; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[idx].bit_format); - rate->min = rate->max = slim_rx_cfg[idx].sample_rate; - channels->min = channels->max = slim_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[idx].bit_format); - rate->min = rate->max = slim_tx_cfg[idx].sample_rate; - channels->min = channels->max = slim_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_1_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[1].bit_format); - rate->min = rate->max = slim_tx_cfg[1].sample_rate; - channels->min = channels->max = slim_tx_cfg[1].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_4_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[5].bit_format); - rate->min = rate->max = slim_rx_cfg[5].sample_rate; - channels->min = channels->max = slim_rx_cfg[5].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_TX: - rate->min = rate->max = SAMPLING_RATE_16KHZ; - channels->min = channels->max = 1; - - config = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_PORT_CONFIG); - if (config) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, - config, SLIMBUS_5_TX); - if (rc) - pr_err("%s: Failed to set slimbus slave port config %d\n", - __func__, rc); - } - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - return rc; -} -EXPORT_SYMBOL(msm_ext_be_hw_params_fixup); - -/** - * msm_snd_hw_params - hw params ops of backend dailink. - * - * @substream: PCM stream of associated backend dailink. - * @params: HW params of associated backend dailink. - * - * Returns 0 on success or ret on failure. - */ -int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 rx_ch_count; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) { - pr_debug("%s: rx_5_ch=%d\n", __func__, - slim_rx_cfg[5].channels); - rx_ch_count = slim_rx_cfg[5].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) { - pr_debug("%s: rx_2_ch=%d\n", __func__, - slim_rx_cfg[2].channels); - rx_ch_count = slim_rx_cfg[2].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) { - pr_debug("%s: rx_6_ch=%d\n", __func__, - slim_rx_cfg[6].channels); - rx_ch_count = slim_rx_cfg[6].channels; - } else { - pr_debug("%s: rx_0_ch=%d\n", __func__, - slim_rx_cfg[0].channels); - rx_ch_count = slim_rx_cfg[0].channels; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - rx_ch_count, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err_ch_map; - } - } else { - pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__, - codec_dai->name, codec_dai->id, user_set_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map\n, err:%d\n", - __func__, ret); - goto err_ch_map; - } - /* For _tx1 case */ - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX) - user_set_tx_ch = slim_tx_cfg[0].channels; - /* For _tx3 case */ - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX) - user_set_tx_ch = slim_tx_cfg[1].channels; - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX) - user_set_tx_ch = msm_vi_feed_tx_ch; - else - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), id (%d)\n", - __func__, slim_tx_cfg[0].channels, user_set_tx_ch, - tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - } - -err_ch_map: - return ret; -} -EXPORT_SYMBOL(msm_snd_hw_params); - -/** - * msm_ext_slimbus_2_hw_params - hw params ops of slimbus_2 BE. - * - * @substream: PCM stream of associated backend dailink. - * @params: HW params of associated backend dailink. - * - * Returns 0 on success or ret on failure. - */ -int msm_ext_slimbus_2_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0; - unsigned int num_tx_ch = 0; - unsigned int num_rx_ch = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - num_rx_ch = params_channels(params); - pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_rx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto end; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - num_rx_ch, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto end; - } - } else { - num_tx_ch = params_channels(params); - pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto end; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, - num_tx_ch, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto end; - } - } -end: - return ret; -} -EXPORT_SYMBOL(msm_ext_slimbus_2_hw_params); - -/** - * msm_snd_cpe_hw_params - hw params ops of CPE backend. - * - * @substream: PCM stream of associated backend dailink. - * @params: HW params of associated backend dailink. - * - * Returns 0 on success or ret on failure. - */ -int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - int ret = 0; - u32 tx_ch[SLIM_MAX_TX_PORTS]; - u32 tx_ch_cnt = 0; - - if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) { - pr_err("%s: Invalid stream type %d\n", - __func__, substream->stream); - ret = -EINVAL; - goto end; - } - - pr_debug("%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, NULL, NULL); - if (ret < 0) { - pr_err("%s: failed to get codec chan map\n, err:%d\n", - __func__, ret); - goto end; - } - - pr_debug("%s: tx_ch_cnt(%d) id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto end; - } -end: - return ret; -} -EXPORT_SYMBOL(msm_snd_cpe_hw_params); - -static int msm_afe_set_config(struct snd_soc_codec *codec) -{ - int rc; - void *config_data; - - pr_debug("%s: enter\n", __func__); - - if (!msm_codec_fn.get_afe_config_fn) { - dev_err(codec->dev, "%s: codec get afe config not init'ed\n", - __func__); - return -EINVAL; - } - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTERS_CONFIG); - if (config_data) { - rc = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0); - if (rc) { - pr_err("%s: Failed to set codec registers config %d\n", - __func__, rc); - return rc; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - rc = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (rc) - pr_err("%s: Failed to set cdc register page config\n", - __func__); - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_CONFIG); - if (config_data) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0); - if (rc) { - pr_err("%s: Failed to set slimbus slave config %d\n", - __func__, rc); - return rc; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - rc = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (rc) { - pr_err("%s: Failed to set AANC version %d\n", - __func__, rc); - return rc; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_CLIP_REGISTERS_CONFIG); - if (config_data) { - rc = afe_set_config(AFE_CDC_CLIP_REGISTERS_CONFIG, - config_data, 0); - if (rc) { - pr_err("%s: Failed to set clip registers %d\n", - __func__, rc); - return rc; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CLIP_BANK_SEL); - if (config_data) { - rc = afe_set_config(AFE_CLIP_BANK_SEL, - config_data, 0); - if (rc) { - pr_err("%s: Failed to set AFE bank selection %d\n", - __func__, rc); - return rc; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - rc = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (rc) - pr_err("%s: Failed to set cdc register page config\n", - __func__); - } - - return 0; -} - -static void msm_afe_clear_config(void) -{ - afe_clear_config(AFE_CDC_REGISTERS_CONFIG); - afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); -} - -static void msm_snd_interrupt_config(struct msm_asoc_mach_data *pdata) -{ - int val; - - val = ioread32(pdata->msm_snd_intr_lpi.mpm_wakeup); - val |= LPI_GPIO_22_WAKEUP_VAL; - iowrite32(val, pdata->msm_snd_intr_lpi.mpm_wakeup); - - 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, pdata->msm_snd_intr_lpi.intr1_cfg_apps); - - iowrite32(LPI_GPIO_INTR_CFG1_VAL, - pdata->msm_snd_intr_lpi.lpi_gpio_intr_cfg); - iowrite32(LPI_GPIO22_CFG_VAL, - pdata->msm_snd_intr_lpi.lpi_gpio_cfg); - - val = ioread32(pdata->msm_snd_intr_lpi.lpi_gpio_inout); - val |= LPI_GPIO22_INOUT_VAL; - iowrite32(val, pdata->msm_snd_intr_lpi.lpi_gpio_inout); -} - -static int msm_adsp_power_up_config(struct snd_soc_codec *codec, - struct snd_card *card) -{ - int ret = 0; - unsigned long timeout; - int adsp_ready = 0; - bool snd_card_online = 0; - struct snd_soc_card *soc_card = codec->component.card; - struct msm_asoc_mach_data *pdata; - - pdata = snd_soc_card_get_drvdata(soc_card); - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - - do { - if (!snd_card_online) { - snd_card_online = snd_card_is_online_state(card); - pr_debug("%s: Sound card is %s\n", __func__, - snd_card_online ? "Online" : "Offline"); - } - if (!adsp_ready) { - adsp_ready = q6core_is_adsp_ready(); - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - } - if (snd_card_online && adsp_ready) - break; - - /* - * Sound card/ADSP will be coming up after subsystem restart and - * it might not be fully up when the control reaches - * here. So, wait for 50msec before checking ADSP state - */ - msleep(50); - } while (time_after(timeout, jiffies)); - - if (!snd_card_online || !adsp_ready) { - pr_err("%s: Timeout. Sound card is %s, ADSP Audio is %s\n", - __func__, - snd_card_online ? "Online" : "Offline", - adsp_ready ? "ready" : "not ready"); - ret = -ETIMEDOUT; - goto err_fail; - } - - if (socinfo_get_id() == SDM660_SOC_MSM_ID) { - msm_snd_interrupt_config(pdata); - } - - ret = msm_afe_set_config(codec); - if (ret) - pr_err("%s: Failed to set AFE config. err %d\n", - __func__, ret); - - return 0; - -err_fail: - return ret; -} - -static int sdm660_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - int ret; - struct snd_soc_card *card = NULL; - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore initial boot notifications - * On initial boot msm_adsp_power_up_config is - * called on init. There is no need to clear - * and set the config again on initial boot. - */ - if (is_initial_boot) - break; - msm_afe_clear_config(); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (is_initial_boot) { - is_initial_boot = false; - break; - } - if (!spdev) - return -EINVAL; - - card = platform_get_drvdata(spdev); - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto done; - } - codec = rtd->codec; - ret = msm_adsp_power_up_config(codec, card->snd_card); - if (ret < 0) { - dev_err(card->dev, - "%s: msm_adsp_power_up_config failed ret = %d!\n", - __func__, ret); - goto done; - } - break; - default: - break; - } -done: - return NOTIFY_OK; -} - -static struct notifier_block service_nb = { - .notifier_call = sdm660_notifier_service_cb, - .priority = -INT_MAX, -}; - -static int msm_config_hph_en0_gpio(struct snd_soc_codec *codec, bool high) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata; - int val; - - if (!card) - return 0; - - pdata = snd_soc_card_get_drvdata(card); - if (!pdata || !gpio_is_valid(pdata->hph_en0_gpio)) - return 0; - - val = gpio_get_value_cansleep(pdata->hph_en0_gpio); - if ((!!val) == high) - return 0; - - gpio_direction_output(pdata->hph_en0_gpio, (int)high); - - return 1; -} - -static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tasha_codec")) - ret = tasha_cdc_mclk_tx_enable(codec, enable, dapm); - else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_ext_mclk_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_tx_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_tx_clk(codec, 0, true); - } - return 0; -} - -static int msm_ext_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_ext_enable_codec_mclk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_ext_enable_codec_mclk(codec, 0, true); - } - return 0; -} - -static int msm_ext_prepare_hifi(struct msm_asoc_mach_data *pdata) -{ - int ret = 0; - - if (gpio_is_valid(pdata->hph_en1_gpio)) { - pr_debug("%s: hph_en1_gpio request %d\n", __func__, - pdata->hph_en1_gpio); - ret = gpio_request(pdata->hph_en1_gpio, "hph_en1_gpio"); - if (ret) { - pr_err("%s: hph_en1_gpio request failed, ret:%d\n", - __func__, ret); - goto err; - } - } - if (gpio_is_valid(pdata->hph_en0_gpio)) { - pr_debug("%s: hph_en0_gpio request %d\n", __func__, - pdata->hph_en0_gpio); - ret = gpio_request(pdata->hph_en0_gpio, "hph_en0_gpio"); - if (ret) - pr_err("%s: hph_en0_gpio request failed, ret:%d\n", - __func__, ret); - } - -err: - return ret; -} - -static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY_S("MCLK", -1, SND_SOC_NOPM, 0, 0, - msm_ext_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY_S("MCLK TX", -1, SND_SOC_NOPM, 0, 0, - msm_ext_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SPK("Lineout_1 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_3 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_4 amp", NULL), - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), - SND_SOC_DAPM_MIC("Secondary Mic", NULL), - SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - SND_SOC_DAPM_MIC("Analog Mic6", NULL), - SND_SOC_DAPM_MIC("Analog Mic7", NULL), - SND_SOC_DAPM_MIC("Analog Mic8", NULL), - - SND_SOC_DAPM_MIC("Digital Mic0", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", NULL), - SND_SOC_DAPM_MIC("Digital Mic2", NULL), - SND_SOC_DAPM_MIC("Digital Mic3", NULL), - SND_SOC_DAPM_MIC("Digital Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic5", NULL), - SND_SOC_DAPM_MIC("Digital Mic6", NULL), -}; - -static struct snd_soc_dapm_route wcd_audio_paths_tasha[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS2", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct snd_soc_dapm_route wcd_audio_paths[] = { - {"MIC BIAS1", NULL, "MCLK"}, - {"MIC BIAS2", NULL, "MCLK"}, - {"MIC BIAS3", NULL, "MCLK"}, - {"MIC BIAS4", NULL, "MCLK"}, -}; - -int msm_snd_card_tasha_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_ext_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg_ptr->calibration = mbhc_calibration; - ret = tasha_mbhc_hs_detect(rtd->codec, wcd_mbhc_cfg_ptr); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - return ret; -} - -int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err; - } - - mbhc_calibration = def_ext_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err; - } - wcd_mbhc_cfg_ptr->calibration = mbhc_calibration; - ret = tavil_mbhc_hs_detect(rtd->codec, wcd_mbhc_cfg_ptr); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_free_mbhc_cal; - } - return 0; - -err_free_mbhc_cal: - kfree(mbhc_calibration); -err: - return ret; -} - -/** - * msm_audrx_init - Audio init function of sound card instantiate. - * - * @rtd: runtime dailink instance - * - * Returns 0 on success or ret on failure. - */ -int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = - snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156}; - unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - /* Tavil Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch_tavil[WCD934X_RX_MAX] = {144, 145, 146, 147, 148, - 149, 150, 151}; - unsigned int tx_ch_tavil[WCD934X_TX_MAX] = {128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143}; - - pr_debug("%s: dev_name%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed: %d\n", - __func__, ret); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - msm_common_snd_controls_size()); - if (ret < 0) { - pr_err("%s: add_common_snd_controls failed: %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets, - ARRAY_SIZE(msm_dapm_widgets)); - - if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) - snd_soc_dapm_add_routes(dapm, wcd_audio_paths_tasha, - ARRAY_SIZE(wcd_audio_paths_tasha)); - else - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_2 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_4 amp"); - - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_1 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_3 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_2 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_4 amp"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic6"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic7"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic8"); - - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC0"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - - if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) { - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT2"); - } else { - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2"); - } - - snd_soc_dapm_sync(dapm); - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch_tavil), - tx_ch_tavil, ARRAY_SIZE(rx_ch_tavil), - rx_ch_tavil); - } else { - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), - rx_ch); - } - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - msm_codec_fn.get_afe_config_fn = tavil_get_afe_config; - } else { - msm_codec_fn.get_afe_config_fn = tasha_get_afe_config; - msm_codec_fn.mbhc_hs_detect_exit = tasha_mbhc_hs_detect_exit; - } - - ret = msm_adsp_power_up_config(codec, rtd->card->snd_card); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err_afe_cfg; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err_afe_cfg; - } - } - - if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) { - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_CLIP_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_CLIP_REGISTERS_CONFIG, - config_data, 0); - if (ret) { - pr_err("%s: Failed to set clip registers %d\n", - __func__, ret); - goto err_afe_cfg; - } - } - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CLIP_BANK_SEL); - if (config_data) { - ret = afe_set_config(AFE_CLIP_BANK_SEL, config_data, 0); - if (ret) { - pr_err("%s: Failed to set AFE bank selection %d\n", - __func__, ret); - goto err_afe_cfg; - } - } - } - - /* - * Send speaker configuration only for WSA8810. - * Defalut configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tavil_set_spkr_mode(rtd->codec, SPKR_MODE_1); - tavil_set_spkr_gain_offset(rtd->codec, - RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - goto done; - } - pdata->codec_root = entry; - tavil_codec_info_create_codec_entry(pdata->codec_root, codec); - } else { - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tasha_set_spkr_mode(rtd->codec, SPKR_MODE_1); - tasha_set_spkr_gain_offset(rtd->codec, - RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - goto done; - } - pdata->codec_root = entry; - tasha_codec_info_create_codec_entry(pdata->codec_root, codec); - tasha_mbhc_zdet_gpio_ctrl(msm_config_hph_en0_gpio, rtd->codec); - } -done: - msm_set_codec_reg_done(true); - return 0; - -err_afe_cfg: - return ret; -} -EXPORT_SYMBOL(msm_audrx_init); - -/** - * msm_ext_register_audio_notifier - register SSR notifier. - */ -void msm_ext_register_audio_notifier(struct platform_device *pdev) -{ - int ret; - - is_initial_boot = true; - spdev = pdev; - ret = audio_notifier_register("sdm660", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); -} -EXPORT_SYMBOL(msm_ext_register_audio_notifier); - -/** - * msm_ext_cdc_init - external codec machine specific init. - * - * @pdev: platform device handle - * @pdata: private data of machine driver - * @card: sound card pointer reference - * @mbhc_cfg: MBHC config reference - * - * Returns 0 on success or ret on failure. - */ -int msm_ext_cdc_init(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata, - struct snd_soc_card **card, - struct wcd_mbhc_config *wcd_mbhc_cfg_ptr1) -{ - int ret = 0; - - wcd_mbhc_cfg_ptr = wcd_mbhc_cfg_ptr1; - pdev->id = 0; - wcd_mbhc_cfg_ptr->moisture_en = true; - wcd_mbhc_cfg_ptr->mbhc_micbias = MIC_BIAS_2; - wcd_mbhc_cfg_ptr->anc_micbias = MIC_BIAS_2; - wcd_mbhc_cfg_ptr->enable_anc_mic_detect = false; - - *card = populate_snd_card_dailinks(&pdev->dev, pdata->snd_card_val); - if (!(*card)) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EPROBE_DEFER; - goto err; - } - platform_set_drvdata(pdev, *card); - snd_soc_card_set_drvdata(*card, pdata); - pdata->hph_en1_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!gpio_is_valid(pdata->hph_en1_gpio)) - pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!gpio_is_valid(pdata->hph_en1_gpio) && (!pdata->hph_en1_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en1-gpio", pdev->dev.of_node->full_name); - } - - pdata->hph_en0_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!gpio_is_valid(pdata->hph_en0_gpio)) - pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!gpio_is_valid(pdata->hph_en0_gpio) && (!pdata->hph_en0_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en0-gpio", pdev->dev.of_node->full_name); - } - - ret = msm_ext_prepare_hifi(pdata); - if (ret) { - dev_dbg(&pdev->dev, "msm_ext_prepare_hifi failed (%d)\n", - ret); - ret = 0; - } - pdata->msm_snd_intr_lpi.mpm_wakeup = - ioremap(TLMM_CENTER_MPM_WAKEUP_INT_EN_0, 4); - pdata->msm_snd_intr_lpi.intr1_cfg_apps = - ioremap(TLMM_LPI_DIR_CONN_INTR1_CFG_APPS, 4); - pdata->msm_snd_intr_lpi.lpi_gpio_intr_cfg = - ioremap(TLMM_LPI_GPIO_INTR_CFG1, 4); - pdata->msm_snd_intr_lpi.lpi_gpio_cfg = - ioremap(TLMM_LPI_GPIO22_CFG, 4); - pdata->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(struct msm_asoc_mach_data *pdata) -{ - 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); diff --git a/techpack/audio/asoc/sdm660-external.h b/techpack/audio/asoc/sdm660-external.h deleted file mode 100644 index c234df439e58..000000000000 --- a/techpack/audio/asoc/sdm660-external.h +++ /dev/null @@ -1,56 +0,0 @@ -/* 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __SDM660_EXTERNAL -#define __SDM660_EXTERNAL - -int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params); -int msm_ext_slimbus_2_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params); -int msm_btsco_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params); -int msm_proxy_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params); -int msm_proxy_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params); -int msm_audrx_init(struct snd_soc_pcm_runtime *rtd); -int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params); -struct snd_soc_card *populate_snd_card_dailinks(struct device *dev, - int snd_card_val); -int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params); -int msm_snd_card_tavil_late_probe(struct snd_soc_card *card); -int msm_snd_card_tasha_late_probe(struct snd_soc_card *card); -#if IS_ENABLED(CONFIG_SND_SOC_EXT_CODEC) -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(struct msm_asoc_mach_data *pdata); -#else -inline int msm_ext_cdc_init(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata, - struct snd_soc_card **card, - struct wcd_mbhc_config *wcd_mbhc_cfg_ptr1) -{ - return 0; -} - -inline void msm_ext_register_audio_notifier(struct platform_device *pdev) -{ -} -inline void msm_ext_cdc_deinit(void) -{ -} -#endif -#endif diff --git a/techpack/audio/asoc/sdm660-internal.c b/techpack/audio/asoc/sdm660-internal.c deleted file mode 100644 index 9ac7f692ee8a..000000000000 --- a/techpack/audio/asoc/sdm660-internal.c +++ /dev/null @@ -1,3185 +0,0 @@ -/* Copyright (c) 2015-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "sdm660-common.h" -#include "codecs/msm-cdc-pinctrl.h" -#include "codecs/sdm660_cdc/msm-digital-cdc.h" -#include "codecs/sdm660_cdc/msm-analog-cdc.h" -#include "codecs/msm_sdw/msm_sdw.h" -#include - -#define __CHIPSET__ "SDM660 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define WCD_MBHC_DEF_RLOADS 5 - -#define WCN_CDC_SLIM_RX_CH_MAX 2 -#define WCN_CDC_SLIM_TX_CH_MAX 3 - -#define WSA8810_NAME_1 "wsa881x.20170211" -#define WSA8810_NAME_2 "wsa881x.20170212" -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ -enum { - INT0_MI2S = 0, - INT1_MI2S, - INT2_MI2S, - INT3_MI2S, - INT4_MI2S, - INT5_MI2S, - INT6_MI2S, - INT_MI2S_MAX, -}; - -enum { - BT_SLIM7, - FM_SLIM8, - SLIM_MAX, -}; - -static struct afe_clk_set int_mi2s_clk[INT_MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_INT1_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_INT2_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_INT4_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_INT5_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_INT6_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config int_mi2s_cfg[] = { - [INT0_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [INT1_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [INT2_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [INT3_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [INT4_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [INT5_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [INT6_MI2S] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config bt_fm_cfg[] = { - [BT_SLIM7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [FM_SLIM8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static char const *int_mi2s_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_96", "KHZ_192"}; -static const char *const int_mi2s_ch_text[] = {"One", "Two"}; -static const char *const int_mi2s_tx_ch_text[] = {"One", "Two", - "Three", "Four"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"}; -static const char *const loopback_mclk_text[] = {"DISABLE", "ENABLE"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; - -static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_sample_rate, int_mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_chs, int_mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_sample_rate, int_mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_chs, int_mi2s_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_sample_rate, int_mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_chs, int_mi2s_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_sample_rate, int_mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_chs, int_mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(int5_mi2s_tx_chs, int_mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(loopback_mclk_en, loopback_mclk_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); - -static int msm_dmic_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event); -static int msm_int_enable_dig_cdc_clk(struct snd_soc_codec *codec, int enable, - bool dapm); -static int msm_int_mclk0_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event); -static int msm_int_mi2s_snd_startup(struct snd_pcm_substream *substream); -static void msm_int_mi2s_snd_shutdown(struct snd_pcm_substream *substream); - -static struct wcd_mbhc_config *mbhc_cfg_ptr; -static struct snd_info_entry *codec_root; - -static int int_mi2s_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int int_mi2s_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int int_mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "INT0_MI2S", sizeof("INT0_MI2S"))) - port_id = INT0_MI2S; - else if (strnstr(kcontrol->id.name, "INT2_MI2S", sizeof("INT2_MI2S"))) - port_id = INT2_MI2S; - else if (strnstr(kcontrol->id.name, "INT3_MI2S", sizeof("INT3_MI2S"))) - port_id = INT3_MI2S; - else if (strnstr(kcontrol->id.name, "INT4_MI2S", sizeof("INT4_MI2S"))) - port_id = INT4_MI2S; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int int_mi2s_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = int_mi2s_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - int_mi2s_get_bit_format_val(int_mi2s_cfg[ch_num].bit_format); - - pr_debug("%s: int_mi2s[%d]_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, int_mi2s_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int int_mi2s_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = int_mi2s_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - int_mi2s_cfg[ch_num].bit_format = - int_mi2s_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: int_mi2s[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, int_mi2s_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int int_mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 6; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int int_mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int int_mi2s_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = int_mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - int_mi2s_cfg[idx].sample_rate = - int_mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_sample_rate = %d, item = %d\n", __func__, - idx, int_mi2s_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int int_mi2s_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = int_mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - int_mi2s_get_sample_rate_val(int_mi2s_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_sample_rate = %d, item = %d\n", __func__, - idx, int_mi2s_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int int_mi2s_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = int_mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: int_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, int_mi2s_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = int_mi2s_cfg[idx].channels - 1; - - return 0; -} - -static int int_mi2s_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = int_mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - int_mi2s_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: int_mi2s_[%d]_ch = %d\n", __func__, - idx, int_mi2s_cfg[idx].channels); - - return 1; -} - -static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = { - SND_SOC_DAPM_SUPPLY_S("INT_MCLK0", -1, SND_SOC_NOPM, 0, 0, - msm_int_mclk0_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), - SND_SOC_DAPM_MIC("Secondary Mic", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event), -}; - -static int msm_config_hph_compander_gpio(bool enable, - struct snd_soc_codec *codec) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int ret = 0; - - pr_debug("%s: %s HPH Compander\n", __func__, - enable ? "Enable" : "Disable"); - - if (enable) { - ret = msm_cdc_pinctrl_select_active_state(pdata->comp_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be activated %s\n", - __func__, "comp_gpio"); - goto done; - } - } else { - ret = msm_cdc_pinctrl_select_sleep_state(pdata->comp_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be de-activated %s\n", - __func__, "comp_gpio"); - goto done; - } - } - -done: - return ret; -} - -static int is_ext_spk_gpio_support(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata) -{ - const char *spk_ext_pa = "qcom,msm-spk-ext-pa"; - - pr_debug("%s:Enter\n", __func__); - - pdata->spk_ext_pa_gpio = of_get_named_gpio(pdev->dev.of_node, - spk_ext_pa, 0); - - if (pdata->spk_ext_pa_gpio < 0) { - dev_dbg(&pdev->dev, - "%s: missing %s in dt node\n", __func__, spk_ext_pa); - } else { - if (!gpio_is_valid(pdata->spk_ext_pa_gpio)) { - pr_err("%s: Invalid external speaker gpio: %d", - __func__, pdata->spk_ext_pa_gpio); - return -EINVAL; - } - } - return 0; -} - -static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int ret; - - if (!gpio_is_valid(pdata->spk_ext_pa_gpio)) { - pr_err("%s: Invalid gpio: %d\n", __func__, - pdata->spk_ext_pa_gpio); - return false; - } - - pr_debug("%s: %s external speaker PA\n", __func__, - enable ? "Enable" : "Disable"); - - if (enable) { - ret = msm_cdc_pinctrl_select_active_state( - pdata->ext_spk_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be de-activated %s\n", - __func__, "ext_spk_gpio"); - return ret; - } - gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable); - } else { - gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable); - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->ext_spk_gpio_p); - if (ret) { - pr_err("%s: gpio set cannot be de-activated %s\n", - __func__, "ext_spk_gpio"); - return ret; - } - } - return 0; -} - -static int int_mi2s_get_idx_from_beid(int32_t id) -{ - int idx = 0; - - switch (id) { - case MSM_BACKEND_DAI_INT0_MI2S_RX: - idx = INT0_MI2S; - break; - case MSM_BACKEND_DAI_INT2_MI2S_TX: - idx = INT2_MI2S; - break; - case MSM_BACKEND_DAI_INT3_MI2S_TX: - idx = INT3_MI2S; - break; - case MSM_BACKEND_DAI_INT4_MI2S_RX: - idx = INT4_MI2S; - break; - case MSM_BACKEND_DAI_INT5_MI2S_TX: - idx = INT5_MI2S; - break; - default: - idx = INT0_MI2S; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - pr_debug("%s()\n", __func__); - rate->min = rate->max = 48000; - channels->min = channels->max = 2; - - return 0; -} - -static int int_mi2s_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int idx; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_INT0_MI2S_RX: - case MSM_BACKEND_DAI_INT2_MI2S_TX: - case MSM_BACKEND_DAI_INT3_MI2S_TX: - case MSM_BACKEND_DAI_INT4_MI2S_RX: - case MSM_BACKEND_DAI_INT5_MI2S_TX: - idx = int_mi2s_get_idx_from_beid(dai_link->id); - rate->min = rate->max = int_mi2s_cfg[idx].sample_rate; - channels->min = channels->max = - int_mi2s_cfg[idx].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - int_mi2s_cfg[idx].bit_format); - break; - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - return 0; -} - -static int msm_btfm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - bt_fm_cfg[BT_SLIM7].bit_format); - rate->min = rate->max = bt_fm_cfg[BT_SLIM7].sample_rate; - channels->min = channels->max = - bt_fm_cfg[BT_SLIM7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = bt_fm_cfg[FM_SLIM8].sample_rate; - channels->min = channels->max = - bt_fm_cfg[FM_SLIM8].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - return 0; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = - (int_mi2s_cfg[INT5_MI2S].channels/2 - 1); - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int_mi2s_cfg[INT5_MI2S].channels = - roundup_pow_of_two(ucontrol->value.integer.value[0] + 2); - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", - __func__, int_mi2s_cfg[INT5_MI2S].channels); - return 1; -} - -static int msm_int_enable_dig_cdc_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - struct msm_asoc_mach_data *pdata = NULL; - int clk_freq_in_hz; - bool int_mclk0_freq_chg = false; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - pr_debug("%s: enable %d mclk ref counter %d\n", - __func__, enable, - atomic_read(&pdata->int_mclk0_rsc_ref)); - if (enable) { - if (int_mi2s_cfg[INT0_MI2S].sample_rate == - SAMPLING_RATE_44P1KHZ) { - clk_freq_in_hz = NATIVE_MCLK_RATE; - pdata->native_clk_set = true; - } else { - clk_freq_in_hz = pdata->mclk_freq; - pdata->native_clk_set = false; - } - - if (pdata->digital_cdc_core_clk.clk_freq_in_hz - != clk_freq_in_hz) - int_mclk0_freq_chg = true; - if (!atomic_read(&pdata->int_mclk0_rsc_ref) || - int_mclk0_freq_chg) { - cancel_delayed_work_sync( - &pdata->disable_int_mclk0_work); - mutex_lock(&pdata->cdc_int_mclk0_mutex); - if (atomic_read(&pdata->int_mclk0_enabled) == false || - int_mclk0_freq_chg) { - if (atomic_read(&pdata->int_mclk0_enabled)) { - pdata->digital_cdc_core_clk.enable = 0; - afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - } - pdata->digital_cdc_core_clk.clk_freq_in_hz = - clk_freq_in_hz; - pdata->digital_cdc_core_clk.enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - if (ret < 0) { - pr_err("%s: failed to enable CCLK\n", - __func__); - mutex_unlock( - &pdata->cdc_int_mclk0_mutex); - return ret; - } - pr_debug("enabled digital codec core clk\n"); - atomic_set(&pdata->int_mclk0_enabled, true); - } - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - } - atomic_inc(&pdata->int_mclk0_rsc_ref); - } else { - cancel_delayed_work_sync(&pdata->disable_int_mclk0_work); - mutex_lock(&pdata->cdc_int_mclk0_mutex); - if (atomic_read(&pdata->int_mclk0_enabled) == true) { - pdata->digital_cdc_core_clk.clk_freq_in_hz = - DEFAULT_MCLK_RATE; - pdata->digital_cdc_core_clk.enable = 0; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - if (ret < 0) - pr_err("%s: failed to disable CCLK\n", - __func__); - atomic_set(&pdata->int_mclk0_enabled, false); - atomic_set(&pdata->int_mclk0_rsc_ref, 0); - } - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - } - return ret; -} - -static int loopback_mclk_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s\n", __func__); - return 0; -} - -static int loopback_mclk_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret = -EINVAL; - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - pdata = snd_soc_card_get_drvdata(codec->component.card); - pr_debug("%s: mclk_rsc_ref %d enable %ld\n", - __func__, atomic_read(&pdata->int_mclk0_rsc_ref), - ucontrol->value.integer.value[0]); - switch (ucontrol->value.integer.value[0]) { - case 1: - ret = msm_cdc_pinctrl_select_active_state(pdata->pdm_gpio_p); - if (ret) { - pr_err("%s: failed to enable the pri gpios: %d\n", - __func__, ret); - break; - } - mutex_lock(&pdata->cdc_int_mclk0_mutex); - if ((!atomic_read(&pdata->int_mclk0_rsc_ref)) && - (!atomic_read(&pdata->int_mclk0_enabled))) { - pdata->digital_cdc_core_clk.enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - if (ret < 0) { - pr_err("%s: failed to enable the MCLK: %d\n", - __func__, ret); - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - ret = msm_cdc_pinctrl_select_sleep_state( - pdata->pdm_gpio_p); - if (ret) - pr_err("%s: failed to disable the pri gpios: %d\n", - __func__, ret); - break; - } - atomic_set(&pdata->int_mclk0_enabled, true); - } - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - atomic_inc(&pdata->int_mclk0_rsc_ref); - msm_anlg_cdc_mclk_enable(codec, 1, true); - break; - case 0: - if (atomic_read(&pdata->int_mclk0_rsc_ref) <= 0) - break; - msm_anlg_cdc_mclk_enable(codec, 0, true); - mutex_lock(&pdata->cdc_int_mclk0_mutex); - if ((!atomic_dec_return(&pdata->int_mclk0_rsc_ref)) && - (atomic_read(&pdata->int_mclk0_enabled))) { - pdata->digital_cdc_core_clk.enable = 0; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - if (ret < 0) { - pr_err("%s: failed to disable the CCLK: %d\n", - __func__, ret); - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - break; - } - atomic_set(&pdata->int_mclk0_enabled, false); - } - mutex_unlock(&pdata->cdc_int_mclk0_mutex); - ret = msm_cdc_pinctrl_select_sleep_state(pdata->pdm_gpio_p); - if (ret) - pr_err("%s: failed to disable the pri gpios: %d\n", - __func__, ret); - break; - default: - pr_err("%s: Unexpected input value\n", __func__); - break; - } - return ret; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (bt_fm_cfg[BT_SLIM7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d", __func__, - bt_fm_cfg[BT_SLIM7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n", - __func__, - bt_fm_cfg[BT_SLIM7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("INT0_MI2S_RX Format", int0_mi2s_rx_format, - int_mi2s_bit_format_get, int_mi2s_bit_format_put), - SOC_ENUM_EXT("INT2_MI2S_TX Format", int2_mi2s_tx_format, - int_mi2s_bit_format_get, int_mi2s_bit_format_put), - SOC_ENUM_EXT("INT3_MI2S_TX Format", int3_mi2s_tx_format, - int_mi2s_bit_format_get, int_mi2s_bit_format_put), - SOC_ENUM_EXT("INT0_MI2S_RX SampleRate", int0_mi2s_rx_sample_rate, - int_mi2s_sample_rate_get, - int_mi2s_sample_rate_put), - SOC_ENUM_EXT("INT2_MI2S_TX SampleRate", int2_mi2s_tx_sample_rate, - int_mi2s_sample_rate_get, - int_mi2s_sample_rate_put), - SOC_ENUM_EXT("INT3_MI2S_TX SampleRate", int3_mi2s_tx_sample_rate, - int_mi2s_sample_rate_get, - int_mi2s_sample_rate_put), - SOC_ENUM_EXT("INT0_MI2S_RX Channels", int0_mi2s_rx_chs, - int_mi2s_ch_get, int_mi2s_ch_put), - SOC_ENUM_EXT("INT2_MI2S_TX Channels", int2_mi2s_tx_chs, - int_mi2s_ch_get, int_mi2s_ch_put), - SOC_ENUM_EXT("INT3_MI2S_TX Channels", int3_mi2s_tx_chs, - int_mi2s_ch_get, int_mi2s_ch_put), - SOC_ENUM_EXT("Loopback MCLK", loopback_mclk_en, - loopback_mclk_get, loopback_mclk_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_sdw_controls[] = { - SOC_ENUM_EXT("INT4_MI2S_RX Format", int4_mi2s_rx_format, - int_mi2s_bit_format_get, int_mi2s_bit_format_put), - SOC_ENUM_EXT("INT4_MI2S_RX SampleRate", int4_mi2s_rx_sample_rate, - int_mi2s_sample_rate_get, - int_mi2s_sample_rate_put), - SOC_ENUM_EXT("INT4_MI2S_RX Channels", int4_mi2s_rx_chs, - int_mi2s_ch_get, int_mi2s_ch_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", int5_mi2s_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), -}; - -static int msm_dmic_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - pr_debug("%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = msm_cdc_pinctrl_select_active_state(pdata->dmic_gpio_p); - if (ret < 0) { - pr_err("%s: gpio set cannot be activated %sd", - __func__, "dmic_gpio"); - return ret; - } - break; - case SND_SOC_DAPM_POST_PMD: - ret = msm_cdc_pinctrl_select_sleep_state(pdata->dmic_gpio_p); - if (ret < 0) { - pr_err("%s: gpio set cannot be de-activated %sd", - __func__, "dmic_gpio"); - return ret; - } - break; - default: - pr_err("%s: invalid DAPM event %d\n", __func__, event); - return -EINVAL; - } - return 0; -} - -static int msm_int_mclk0_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - pr_debug("%s: event = %d\n", __func__, event); - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - ret = msm_cdc_pinctrl_select_active_state(pdata->pdm_gpio_p); - if (ret < 0) { - pr_err("%s: gpio set cannot be activated %s\n", - __func__, "int_pdm"); - return ret; - } - msm_int_enable_dig_cdc_clk(codec, 1, true); - msm_anlg_cdc_mclk_enable(codec, 1, true); - break; - case SND_SOC_DAPM_POST_PMD: - pr_debug("%s: mclk_res_ref = %d\n", - __func__, atomic_read(&pdata->int_mclk0_rsc_ref)); - ret = msm_cdc_pinctrl_select_sleep_state(pdata->pdm_gpio_p); - if (ret < 0) { - pr_err("%s: gpio set cannot be de-activated %sd", - __func__, "int_pdm"); - return ret; - } - pr_debug("%s: disabling MCLK\n", __func__); - /* disable the codec mclk config*/ - msm_anlg_cdc_mclk_enable(codec, 0, true); - msm_int_enable_dig_cdc_clk(codec, 0, true); - break; - default: - pr_err("%s: invalid DAPM event %d\n", __func__, event); - return -EINVAL; - } - return 0; -} - -static int int_mi2s_get_port_id(int id) -{ - int afe_port_id; - - switch (id) { - case MSM_BACKEND_DAI_INT0_MI2S_RX: - afe_port_id = AFE_PORT_ID_INT0_MI2S_RX; - break; - case MSM_BACKEND_DAI_INT2_MI2S_TX: - afe_port_id = AFE_PORT_ID_INT2_MI2S_TX; - break; - case MSM_BACKEND_DAI_INT3_MI2S_TX: - afe_port_id = AFE_PORT_ID_INT3_MI2S_TX; - break; - case MSM_BACKEND_DAI_INT4_MI2S_RX: - afe_port_id = AFE_PORT_ID_INT4_MI2S_RX; - break; - case MSM_BACKEND_DAI_INT5_MI2S_TX: - afe_port_id = AFE_PORT_ID_INT5_MI2S_TX; - break; - default: - pr_err("%s: Invalid id: %d\n", __func__, id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static int int_mi2s_get_index(int port_id) -{ - int index; - - switch (port_id) { - case AFE_PORT_ID_INT0_MI2S_RX: - index = INT0_MI2S; - break; - case AFE_PORT_ID_INT2_MI2S_TX: - index = INT2_MI2S; - break; - case AFE_PORT_ID_INT3_MI2S_TX: - index = INT3_MI2S; - break; - case AFE_PORT_ID_INT4_MI2S_RX: - index = INT4_MI2S; - break; - case AFE_PORT_ID_INT5_MI2S_TX: - index = INT5_MI2S; - break; - default: - pr_err("%s: Invalid port_id: %d\n", __func__, port_id); - index = -EINVAL; - } - - return index; -} - -static u32 get_int_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_int_mi2s_clk_val(int idx, int stream) -{ - u32 bit_per_sample; - - bit_per_sample = - get_int_mi2s_bits_per_sample(int_mi2s_cfg[idx].bit_format); - int_mi2s_clk[idx].clk_freq_in_hz = - (int_mi2s_cfg[idx].sample_rate * 2 * bit_per_sample); -} - -static int int_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int port_id = 0; - int index; - - port_id = int_mi2s_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto done; - } - index = int_mi2s_get_index(port_id); - if (index < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto done; - } - if (enable) { - update_int_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - int_mi2s_clk[index].clk_freq_in_hz); - } - - int_mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &int_mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto done; - } - -done: - return ret; -} - -static int msm_sdw_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - ret = int_mi2s_set_sclk(substream, true); - if (ret < 0) { - pr_err("%s: failed to enable sclk %d\n", - __func__, ret); - return ret; - } - ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS); - if (ret < 0) - pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret); - - return ret; -} - -static void msm_sdw_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - ret = int_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed; ret=%d\n", __func__, - ret); -} - -static int msm_int_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_codec *codec = rtd->codec_dais[ANA_CDC]->codec; - int ret = 0; - struct msm_asoc_mach_data *pdata = NULL; - - pdata = snd_soc_card_get_drvdata(codec->component.card); - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - ret = int_mi2s_set_sclk(substream, true); - if (ret < 0) { - pr_err("%s: failed to enable sclk %d\n", - __func__, ret); - return ret; - } - ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS); - if (ret < 0) - pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret); - - return ret; -} - -static void msm_int_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - ret = int_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed; ret=%d\n", __func__, - ret); -} - -static void *def_msm_int_wcd_mbhc_cal(void) -{ - void *msm_int_wcd_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_low, *btn_high; - - msm_int_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!msm_int_wcd_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(msm_int_wcd_cal)->X) = (Y)) - S(v_hs_max, 1500); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal); - btn_low = btn_cfg->_v_btn_low; - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - /* - * In SW we are maintaining two sets of threshold register - * one for current source and another for Micbias. - * all btn_low corresponds to threshold for current source - * all bt_high corresponds to threshold for Micbias - * Below thresholds are based on following resistances - * 0-70 == Button 0 - * 110-180 == Button 1 - * 210-290 == Button 2 - * 360-680 == Button 3 - */ - btn_low[0] = 75; - btn_high[0] = 75; - btn_low[1] = 150; - btn_high[1] = 150; - btn_low[2] = 225; - btn_high[2] = 225; - btn_low[3] = 450; - btn_high[3] = 450; - btn_low[4] = 500; - btn_high[4] = 500; - - return msm_int_wcd_cal; -} - -static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_codec *dig_cdc = rtd->codec_dais[DIG_CDC]->codec; - struct snd_soc_codec *ana_cdc = rtd->codec_dais[ANA_CDC]->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(ana_cdc); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card); - struct snd_card *card; - int ret = -ENOMEM; - - pr_debug("%s(),dev_name%s\n", __func__, dev_name(cpu_dai->dev)); - - ret = snd_soc_add_codec_controls(ana_cdc, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed: %d\n", - __func__, ret); - return ret; - } - ret = snd_soc_add_codec_controls(ana_cdc, msm_common_snd_controls, - msm_common_snd_controls_size()); - if (ret < 0) { - pr_err("%s: add common snd controls failed: %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets, - ARRAY_SIZE(msm_int_dapm_widgets)); - - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "HEADPHONE"); - snd_soc_dapm_ignore_suspend(dapm, "SPK_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_sync(dapm); - - dapm = snd_soc_codec_get_dapm(dig_cdc); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4"); - - snd_soc_dapm_sync(dapm); - - msm_anlg_cdc_spk_ext_pa_cb(enable_spk_ext_pa, ana_cdc); - msm_dig_cdc_hph_comp_cb(msm_config_hph_compander_gpio, dig_cdc); - - card = rtd->card->snd_card; - if (!codec_root) - codec_root = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!codec_root) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - goto done; - } - pdata->codec_root = codec_root; - msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc); - msm_anlg_codec_info_create_codec_entry(codec_root, ana_cdc); -done: - msm_set_codec_reg_done(true); - return 0; -} - -static int msm_sdw_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = - snd_soc_codec_get_dapm(codec); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card); - struct snd_soc_component *aux_comp; - struct snd_card *card; - - snd_soc_add_codec_controls(codec, msm_sdw_controls, - ARRAY_SIZE(msm_sdw_controls)); - - snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW Playback"); - snd_soc_dapm_ignore_suspend(dapm, "VIfeed_SDW"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_SDW"); - - snd_soc_dapm_sync(dapm); - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - msm_sdw_set_spkr_mode(rtd->codec, SPKR_MODE_1); - msm_sdw_set_spkr_gain_offset(rtd->codec, - RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - if (!codec_root) - codec_root = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!codec_root) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - goto done; - } - pdata->codec_root = codec_root; - msm_sdw_codec_info_create_codec_entry(codec_root, codec); -done: - return 0; -} - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto exit; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -exit: - return ret; -} - -static int msm_snd_card_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_INT0_MI2S_RX; - struct snd_soc_codec *ana_cdc; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - return -EINVAL; - } - - ana_cdc = rtd->codec_dais[ANA_CDC]->codec; - mbhc_cfg_ptr->calibration = def_msm_int_wcd_mbhc_cal(); - if (!mbhc_cfg_ptr->calibration) - return -ENOMEM; - - ret = msm_anlg_cdc_hs_detect(ana_cdc, mbhc_cfg_ptr); - if (ret) { - dev_err(card->dev, - "%s: msm_anlg_cdc_hs_detect failed\n", __func__); - kfree(mbhc_cfg_ptr->calibration); - } - - return ret; -} - -static struct snd_soc_ops msm_tdm_be_ops = { - .startup = msm_tdm_snd_startup, - .shutdown = msm_tdm_snd_shutdown, - .hw_params = msm_tdm_snd_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_aux_pcm_be_ops = { - .startup = msm_aux_pcm_snd_startup, - .shutdown = msm_aux_pcm_snd_shutdown, -}; - -static struct snd_soc_ops msm_int_mi2s_be_ops = { - .startup = msm_int_mi2s_snd_startup, - .shutdown = msm_int_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_sdw_mi2s_be_ops = { - .startup = msm_sdw_mi2s_snd_startup, - .shutdown = msm_sdw_mi2s_snd_shutdown, -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -struct snd_soc_dai_link_component dlc_rx1[] = { - { - .of_node = NULL, - .dai_name = "msm_dig_cdc_dai_rx1", - }, - { - .of_node = NULL, - .dai_name = "msm_anlg_cdc_i2s_rx1", - }, -}; - -struct snd_soc_dai_link_component dlc_tx1[] = { - { - .of_node = NULL, - .dai_name = "msm_dig_cdc_dai_tx1", - }, - { - .of_node = NULL, - .dai_name = "msm_anlg_cdc_i2s_tx1", - }, -}; - -struct snd_soc_dai_link_component dlc_tx2[] = { - { - .of_node = NULL, - .dai_name = "msm_dig_cdc_dai_tx2", - }, - { - .of_node = NULL, - .dai_name = "msm_anlg_cdc_i2s_tx2", - }, -}; - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_int_dai[] = { - /* FrontEnd DAI Links */ - {/* hw:x,0 */ - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - {/* hw:x,1 */ - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - {/* hw:x,2 */ - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - {/* hw:x,3 */ - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - {/* hw:x,4 */ - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "ULL", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - {/* hw:x,5 */ - .name = "INT4 MI2S_RX Hostless", - .stream_name = "INT4 MI2S_RX Hostless", - .cpu_dai_name = "INT4_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - /* This dainlink has MI2S support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,6 */ - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - }, - {/* hw:x,7 */ - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .ignore_suspend = 1, - }, - {/* hw:x,8 */ - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - {/* hw:x,9*/ - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,10 */ - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,11 */ - .name = "INT3 MI2S_TX Hostless", - .stream_name = "INT3 MI2S_TX Hostless", - .cpu_dai_name = "INT3_MI2S_TX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,12 */ - .name = "SLIMBUS_7 Hostless", - .stream_name = "SLIMBUS_7 Hostless", - .cpu_dai_name = "SLIMBUS7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,13 */ - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dai link has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - /* LSM FE */ - {/* hw:x,14 */ - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - {/* hw:x,15 */ - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - {/* hw:x,16 */ - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - {/* hw:x,17 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - {/* hw:x,18 */ - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,19 */ - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - {/* hw:x,20 */ - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - {/* hw:x,21 */ - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - {/* hw:x,22 */ - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - {/* hw:x,23 */ - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - {/* hw:x,24 */ - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6 - }, - {/* hw:x,25 */ - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - {/* hw:x,26 */ - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - {/* hw:x,27 */ - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - {/* hw:x,28 */ - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - {/* hw:x,29 */ - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - {/* hw:x,30 */ - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - {/* hw:x,31 */ - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - {/* hw:x,32 */ - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - {/* hw:x,33 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dai link has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - {/* hw:x,34 */ - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,35 */ - .name = "Primary MI2S_RX Hostless", - .stream_name = "Primary MI2S_RX Hostless", - .cpu_dai_name = "PRI_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - /* This dainlink has MI2S support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,36 */ - .name = "Secondary MI2S_RX Hostless", - .stream_name = "Secondary MI2S_RX Hostless", - .cpu_dai_name = "SEC_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - /* This dainlink has MI2S support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,37 */ - .name = "Tertiary MI2S_RX Hostless", - .stream_name = "Tertiary MI2S_RX Hostless", - .cpu_dai_name = "TERT_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - /* This dainlink has MI2S support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,38 */ - .name = "INT0 MI2S_RX Hostless", - .stream_name = "INT0 MI2S_RX Hostless", - .cpu_dai_name = "INT0_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - /* This dainlink has MI2S support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,39 */ - .name = "SDM660 HFP TX", - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, -}; - - -static struct snd_soc_dai_link msm_int_wsa_dai[] = { - {/* hw:x,40 */ - .name = LPASS_BE_INT5_MI2S_TX, - .stream_name = "INT5_mi2s Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.12", - .platform_name = "msm-pcm-hostless", - .codec_name = "msm_sdw_codec", - .codec_dai_name = "msm_sdw_vifeedback", - .id = MSM_BACKEND_DAI_INT5_MI2S_TX, - .be_hw_params_fixup = int_mi2s_be_hw_params_fixup, - .ops = &msm_sdw_mi2s_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .dpcm_capture = 1, - }, -}; - -static struct snd_soc_dai_link msm_int_compress_capture_dai[] = { - {/* hw:x,41 */ - .name = "Compress9", - .stream_name = "Compress9", - .cpu_dai_name = "MultiMedia17", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA17, - }, - {/* hw:x,42 */ - .name = "Compress10", - .stream_name = "Compress10", - .cpu_dai_name = "MultiMedia18", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA18, - }, - {/* hw:x,43 */ - .name = "Compress11", - .stream_name = "Compress11", - .cpu_dai_name = "MultiMedia19", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA19, - }, - {/* hw:x,44 */ - .name = "Compress12", - .stream_name = "Compress12", - .cpu_dai_name = "MultiMedia28", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA28, - }, - {/* hw:x,45 */ - .name = "Compress13", - .stream_name = "Compress13", - .cpu_dai_name = "MultiMedia29", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA29, - }, -}; - -static struct snd_soc_dai_link msm_int_be_dai[] = { - /* Backend I2S DAI Links */ - { - .name = LPASS_BE_INT0_MI2S_RX, - .stream_name = "INT0 MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.7", - .platform_name = "msm-pcm-routing", - .codecs = dlc_rx1, - .num_codecs = CODECS_MAX, - .no_pcm = 1, - .dpcm_playback = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE | - ASYNC_DPCM_SND_SOC_HW_PARAMS, - .id = MSM_BACKEND_DAI_INT0_MI2S_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = int_mi2s_be_hw_params_fixup, - .ops = &msm_int_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_INT3_MI2S_TX, - .stream_name = "INT3 MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.10", - .platform_name = "msm-pcm-routing", - .codecs = dlc_tx1, - .num_codecs = CODECS_MAX, - .no_pcm = 1, - .dpcm_capture = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE | - ASYNC_DPCM_SND_SOC_HW_PARAMS, - .id = MSM_BACKEND_DAI_INT3_MI2S_TX, - .be_hw_params_fixup = int_mi2s_be_hw_params_fixup, - .ops = &msm_int_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_INT2_MI2S_TX, - .stream_name = "INT2 MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.9", - .platform_name = "msm-pcm-routing", - .codecs = dlc_tx2, - .num_codecs = CODECS_MAX, - .no_pcm = 1, - .dpcm_capture = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE | - ASYNC_DPCM_SND_SOC_HW_PARAMS, - .id = MSM_BACKEND_DAI_INT2_MI2S_TX, - .be_hw_params_fixup = int_mi2s_be_hw_params_fixup, - .ops = &msm_int_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_RX_0, - .stream_name = "Quinary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36928", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_TX_0, - .stream_name = "Quinary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36929", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, -}; - - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_btfm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_btfm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_btfm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wsa_be_dai_links[] = { - { - .name = LPASS_BE_INT4_MI2S_RX, - .stream_name = "INT4 MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.11", - .platform_name = "msm-pcm-routing", - .codec_name = "msm_sdw_codec", - .codec_dai_name = "msm_sdw_i2s_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_INT4_MI2S_RX, - .init = &msm_sdw_audrx_init, - .be_hw_params_fixup = int_mi2s_be_hw_params_fixup, - .ops = &msm_sdw_mi2s_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_common_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_int_dai_links[ -ARRAY_SIZE(msm_int_dai) + -ARRAY_SIZE(msm_int_wsa_dai) + -ARRAY_SIZE(msm_int_compress_capture_dai) + -ARRAY_SIZE(msm_int_be_dai) + -ARRAY_SIZE(msm_mi2s_be_dai_links) + -ARRAY_SIZE(msm_auxpcm_be_dai_links)+ -ARRAY_SIZE(msm_wcn_be_dai_links) + -ARRAY_SIZE(msm_wsa_be_dai_links) + -ARRAY_SIZE(ext_disp_be_dai_link)]; - -static struct snd_soc_card sdm660_card = { - /* snd_soc_card_sdm660 */ - .name = "sdm660-snd-card", - .dai_link = msm_int_dai, - .num_links = ARRAY_SIZE(msm_int_dai), - .late_probe = msm_snd_card_late_probe, -}; - -static void msm_disable_int_mclk0(struct work_struct *work) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct delayed_work *dwork; - int ret = 0; - - dwork = to_delayed_work(work); - pdata = container_of(dwork, struct msm_asoc_mach_data, - disable_int_mclk0_work); - mutex_lock(&pdata->cdc_int_mclk0_mutex); - pr_debug("%s: mclk_enabled %d mclk_rsc_ref %d\n", __func__, - atomic_read(&pdata->int_mclk0_enabled), - atomic_read(&pdata->int_mclk0_rsc_ref)); - - if (atomic_read(&pdata->int_mclk0_enabled) == true - && atomic_read(&pdata->int_mclk0_rsc_ref) == 0) { - pr_debug("Disable the mclk\n"); - pdata->digital_cdc_core_clk.enable = 0; - pdata->digital_cdc_core_clk.clk_freq_in_hz = - DEFAULT_MCLK_RATE; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_INT0_MI2S_RX, - &pdata->digital_cdc_core_clk); - if (ret < 0) - pr_err("%s failed to disable the CCLK\n", __func__); - atomic_set(&pdata->int_mclk0_enabled, false); - } - mutex_unlock(&pdata->cdc_int_mclk0_mutex); -} - -static void msm_int_dt_parse_cap_info(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata) -{ - const char *ext1_cap = "qcom,msm-micbias1-ext-cap"; - const char *ext2_cap = "qcom,msm-micbias2-ext-cap"; - - pdata->micbias1_cap_mode = - (of_property_read_bool(pdev->dev.of_node, ext1_cap) ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); - - pdata->micbias2_cap_mode = - (of_property_read_bool(pdev->dev.of_node, ext2_cap) ? - MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP); -} - -static struct snd_soc_card *msm_int_populate_sndcard_dailinks( - struct device *dev) -{ - struct snd_soc_card *card = &sdm660_card; - struct snd_soc_dai_link *dailink; - int len1; - - card->name = dev_name(dev); - len1 = ARRAY_SIZE(msm_int_dai); - memcpy(msm_int_dai_links, msm_int_dai, sizeof(msm_int_dai)); - dailink = msm_int_dai_links; - if (!of_property_read_bool(dev->of_node, - "qcom,wsa-disable")) { - memcpy(dailink + len1, - msm_int_wsa_dai, - sizeof(msm_int_wsa_dai)); - len1 += ARRAY_SIZE(msm_int_wsa_dai); - } - memcpy(dailink + len1, msm_int_compress_capture_dai, - sizeof(msm_int_compress_capture_dai)); - len1 += ARRAY_SIZE(msm_int_compress_capture_dai); - - memcpy(dailink + len1, msm_int_be_dai, sizeof(msm_int_be_dai)); - len1 += ARRAY_SIZE(msm_int_be_dai); - - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(dailink + len1, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - len1 += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(dailink + len1, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - len1 += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(dailink + len1, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - len1 += ARRAY_SIZE(msm_wcn_be_dai_links); - } - if (!of_property_read_bool(dev->of_node, "qcom,wsa-disable")) { - memcpy(dailink + len1, - msm_wsa_be_dai_links, - sizeof(msm_wsa_be_dai_links)); - len1 += ARRAY_SIZE(msm_wsa_be_dai_links); - } - if (of_property_read_bool(dev->of_node, "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(dailink + len1, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - len1 += ARRAY_SIZE(ext_disp_be_dai_link); - } - card->dai_link = dailink; - card->num_links = len1; - return card; -} - -static int msm_internal_init(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata, - struct snd_soc_card *card) -{ - const char *type = NULL; - const char *hs_micbias_type = "qcom,msm-hs-micbias-type"; - int ret; - - ret = is_ext_spk_gpio_support(pdev, pdata); - if (ret < 0) - dev_dbg(&pdev->dev, - "%s: doesn't support external speaker pa\n", - __func__); - - ret = of_property_read_string(pdev->dev.of_node, - hs_micbias_type, &type); - if (ret) { - dev_err(&pdev->dev, "%s: missing %s in dt node\n", - __func__, hs_micbias_type); - goto err; - } - if (!strcmp(type, "external")) { - dev_dbg(&pdev->dev, "Headset is using external micbias\n"); - mbhc_cfg_ptr->hs_ext_micbias = true; - } else { - dev_dbg(&pdev->dev, "Headset is using internal micbias\n"); - mbhc_cfg_ptr->hs_ext_micbias = false; - } - - /* initialize the int_mclk0 */ - pdata->digital_cdc_core_clk.clk_set_minor_version = - AFE_API_VERSION_I2S_CONFIG; - pdata->digital_cdc_core_clk.clk_id = - Q6AFE_LPASS_CLK_ID_INT_MCLK_0; - pdata->digital_cdc_core_clk.clk_freq_in_hz = pdata->mclk_freq; - pdata->digital_cdc_core_clk.clk_attri = - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO; - pdata->digital_cdc_core_clk.clk_root = - Q6AFE_LPASS_CLK_ROOT_DEFAULT; - pdata->digital_cdc_core_clk.enable = 1; - - /* Initialize loopback mode to false */ - pdata->lb_mode = false; - - msm_int_dt_parse_cap_info(pdev, pdata); - - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) - goto err; - /* initialize timer */ - INIT_DELAYED_WORK(&pdata->disable_int_mclk0_work, - msm_disable_int_mclk0); - mutex_init(&pdata->cdc_int_mclk0_mutex); - atomic_set(&pdata->int_mclk0_rsc_ref, 0); - atomic_set(&pdata->int_mclk0_enabled, false); - - dev_info(&pdev->dev, "%s: default codec configured\n", __func__); - - return 0; -err: - return ret; -} - -/** - * msm_int_cdc_init - internal codec machine specific init. - * - * @pdev: platform device handle - * @pdata: private data of machine driver - * @card: sound card pointer reference - * @mbhc_cfg: MBHC config reference - * - * Returns 0. - */ -int msm_int_cdc_init(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata, - struct snd_soc_card **card, - struct wcd_mbhc_config *mbhc_cfg) -{ - mbhc_cfg_ptr = mbhc_cfg; - - *card = msm_int_populate_sndcard_dailinks(&pdev->dev); - msm_internal_init(pdev, pdata, *card); - return 0; -} -EXPORT_SYMBOL(msm_int_cdc_init); diff --git a/techpack/audio/asoc/sdm660-internal.h b/techpack/audio/asoc/sdm660-internal.h deleted file mode 100644 index 6918231b8b74..000000000000 --- a/techpack/audio/asoc/sdm660-internal.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __SDM660_INTERNAL -#define __SDM660_INTERNAL - -#include - -#if IS_ENABLED(CONFIG_SND_SOC_INT_CODEC) -int msm_int_cdc_init(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata, - struct snd_soc_card **card, - struct wcd_mbhc_config *mbhc_cfg); -#else -int msm_int_cdc_init(struct platform_device *pdev, - struct msm_asoc_mach_data *pdata, - struct snd_soc_card **card, - struct wcd_mbhc_config *mbhc_cfg) -{ - return 0; -} -#endif -#endif diff --git a/techpack/audio/asoc/sdm845.c b/techpack/audio/asoc/sdm845.c deleted file mode 100644 index 392ac85b9d78..000000000000 --- a/techpack/audio/asoc/sdm845.c +++ /dev/null @@ -1,7124 +0,0 @@ -/* - * Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm-pcm-routing-v2.h" -#include "codecs/msm-cdc-pinctrl.h" -#include "codecs/wcd934x/wcd934x.h" -#include "codecs/wcd934x/wcd934x-mbhc.h" -#include "codecs/wsa881x.h" - -#define DRV_NAME "sdm845-asoc-snd" - -#define __CHIPSET__ "SDM845 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define WCD9XXX_MBHC_DEF_BUTTONS 8 -#define WCD9XXX_MBHC_DEF_RLOADS 5 -#define CODEC_EXT_CLK_RATE 9600000 -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define DEV_NAME_STR_LEN 32 - -#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 3 - -#define TDM_CHANNEL_MAX 8 - -#define MSM_HIFI_ON 1 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ - -enum { - SLIM_RX_0 = 0, - SLIM_RX_1, - SLIM_RX_2, - SLIM_RX_3, - SLIM_RX_4, - SLIM_RX_5, - SLIM_RX_6, - SLIM_RX_7, - SLIM_RX_MAX, -}; - -enum { - SLIM_TX_0 = 0, - SLIM_TX_1, - SLIM_TX_2, - SLIM_TX_3, - SLIM_TX_4, - SLIM_TX_5, - SLIM_TX_6, - SLIM_TX_7, - SLIM_TX_8, - SLIM_TX_MAX, -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - MI2S_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - AUX_PCM_MAX, -}; - -enum { - PCM_I2S_SEL_PRIM = 0, - PCM_I2S_SEL_SEC, - PCM_I2S_SEL_TERT, - PCM_I2S_SEL_QUAT, - PCM_I2S_SEL_MAX, -}; - -struct mi2s_aux_pcm_common_conf { - struct mutex lock; - void *pcm_i2s_sel_vt_addr; -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT -}; - -struct auxpcm_conf { - struct mutex lock; - u32 ref_cnt; -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -enum { - DP_RX_IDX = 0, - EXT_DISP_RX_IDX_MAX, -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; - -enum pinctrl_pin_state { - STATE_DISABLE = 0, /* All pins are in sleep state */ - STATE_MI2S_ACTIVE, /* IS2 = active, TDM = sleep */ - STATE_TDM_ACTIVE, /* IS2 = sleep, TDM = active */ -}; - -struct msm_pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *mi2s_disable; - struct pinctrl_state *tdm_disable; - struct pinctrl_state *mi2s_active; - struct pinctrl_state *tdm_active; - enum pinctrl_pin_state curr_state; -}; - -struct msm_asoc_mach_data { - u32 mclk_freq; - int us_euro_gpio; /* used by gpio driver API */ - int usbc_en2_gpio; /* used by gpio driver API */ - struct device_node *us_euro_gpio_p; /* used by pinctrl API */ - struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ - struct snd_info_entry *codec_root; - struct msm_pinctrl_info pinctrl_info; -}; - -struct msm_asoc_wcd93xx_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); - void (*mbhc_hs_detect_exit)(struct snd_soc_codec *codec); -}; - -static const char *const pin_states[] = {"sleep", "i2s-active", - "tdm-active"}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } -}; - - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static int msm_vi_feed_tx_ch = 2; -static const char *const slim_rx_ch_text[] = {"One", "Two"}; -static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE", - "S24_3LE"}; -static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_32", "KHZ_44P1", - "KHZ_88P2", "KHZ_176P4" }; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_48", "KHZ_176P4", - "KHZ_352P8"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16", - "KHZ_22P05", "KHZ_32", "KHZ_44P1", - "KHZ_48", "KHZ_96", "KHZ_192"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const hifi_text[] = {"Off", "On"}; -static const char *const qos_text[] = {"Disable", "Enable"}; - -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text); -static SOC_ENUM_SINGLE_EXT_DECL(qos_vote, qos_text); - -static struct platform_device *spdev; -static int msm_hifi_control; -static int qos_vote_status; - -static bool is_initial_boot; -static bool codec_reg_done; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; -static struct msm_asoc_wcd93xx_codec msm_codec_fn; - -static void *def_tavil_mbhc_cal(void); -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm); -static int msm_wsa881x_init(struct snd_soc_component *component); - -/* - * Need to report LINEIN - * if R/L channel impedance is larger than 5K ohm - */ -static struct wcd_mbhc_config wcd_mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .detect_extn_cable = true, - .mono_stero_detection = false, - .swap_gnd_mic = NULL, - .hs_ext_micbias = true, - .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, - .key_code[4] = 0, - .key_code[5] = 0, - .key_code[6] = 0, - .key_code[7] = 0, - .linein_th = 5000, - .moisture_en = true, - .mbhc_micbias = MIC_BIAS_2, - .anc_micbias = MIC_BIAS_2, - .enable_anc_mic_detect = false, -}; - -static struct snd_soc_dapm_route wcd_audio_paths[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS2", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } -}; - -static struct mi2s_aux_pcm_common_conf mi2s_auxpcm_conf[PCM_I2S_SEL_MAX]; -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; -static struct auxpcm_conf auxpcm_intf_conf[AUX_PCM_MAX]; - -static int slim_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 10; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int slim_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int slim_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - val = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int slim_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - bit_fmt = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int slim_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) - port_id = SLIM_RX_0; - else if (strnstr(kcontrol->id.name, "SLIM_2_RX", sizeof("SLIM_2_RX"))) - port_id = SLIM_RX_2; - else if (strnstr(kcontrol->id.name, "SLIM_5_RX", sizeof("SLIM_5_RX"))) - port_id = SLIM_RX_5; - else if (strnstr(kcontrol->id.name, "SLIM_6_RX", sizeof("SLIM_6_RX"))) - port_id = SLIM_RX_6; - else if (strnstr(kcontrol->id.name, "SLIM_0_TX", sizeof("SLIM_0_TX"))) - port_id = SLIM_TX_0; - else if (strnstr(kcontrol->id.name, "SLIM_1_TX", sizeof("SLIM_1_TX"))) - port_id = SLIM_TX_1; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].sample_rate = - slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate = 0; - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - if (sample_rate == SAMPLING_RATE_44P1KHZ) { - pr_err("%s: Unsupported sample rate %d: for Tx path\n", - __func__, sample_rate); - return -EINVAL; - } - slim_tx_cfg[ch_num].sample_rate = sample_rate; - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_slim_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1; - - return 0; -} - -static int msm_slim_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - - return 1; -} - -static int msm_slim_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1; - - return 0; -} - -static int msm_slim_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) { - idx = DP_RX_IDX; - } else { - pr_err("%s: unsupported BE: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 2: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 6; - break; - - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 4; - break; - - case SAMPLING_RATE_32KHZ: - sample_rate_val = 3; - break; - - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 6: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 5; - break; - default: - sample_rate_val = 3; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - port->mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUAT; - } else { - pr_err("%s: unsupported mode in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - port->channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - port->channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - port->channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - port->channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - port->channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - port->channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - port->channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - port->channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - } else - return -EINVAL; - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) - idx = PRIM_AUX_PCM; - else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) - idx = SEC_AUX_PCM; - else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) - idx = TERT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) - idx = QUAT_AUX_PCM; - else { - pr_err("%s: unsupported port: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) - idx = QUAT_MI2S; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_auxpcm_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_auxpcm_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_hifi_ctrl(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - pr_debug("%s: msm_hifi_control = %d", __func__, - msm_hifi_control); - - if (!pdata || !pdata->hph_en1_gpio_p) { - pr_err("%s: hph_en1_gpio is invalid\n", __func__); - return -EINVAL; - } - if (msm_hifi_control == MSM_HIFI_ON) { - msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p); - /* 5msec delay needed as per HW requirement */ - usleep_range(5000, 5010); - } else { - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p); - } - snd_soc_dapm_sync(dapm); - - return 0; -} - -static int msm_hifi_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - ucontrol->value.integer.value[0] = msm_hifi_control; - - return 0; -} - -static int msm_hifi_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - pr_debug("%s() ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - msm_hifi_control = ucontrol->value.integer.value[0]; - msm_hifi_ctrl(codec); - - return 0; -} - -static int msm_qos_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.enumerated.item[0] = qos_vote_status; - - return 0; -} - -static int msm_qos_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_card *card = codec->component.card; - const char *be_name = MSM_DAILINK_NAME(LowLatency); - struct snd_soc_pcm_runtime *rtd; - struct snd_pcm_substream *substream; - s32 usecs; - - rtd = snd_soc_get_pcm_runtime(card, be_name); - if (!rtd) { - pr_err("%s: fail to get pcm runtime for %s\n", - __func__, be_name); - return -EINVAL; - } - - substream = rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - if (!substream) { - pr_err("%s: substream is null\n", __func__); - return -EINVAL; - } - - qos_vote_status = ucontrol->value.enumerated.item[0]; - if (qos_vote_status) { - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - if (!substream->runtime) { - pr_err("%s: runtime is null\n", __func__); - return -EINVAL; - } - usecs = MSM_LL_QOS_VALUE; - if (usecs >= 0) - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, usecs); - } else { - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - } - - return 0; -} - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs, - msm_slim_tx_ch_get, msm_slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs, - msm_slim_tx_ch_get, msm_slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs, - msm_slim_rx_ch_get, msm_slim_rx_ch_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format, - slim_tx_bit_format_get, slim_tx_bit_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate, - slim_tx_sample_rate_get, slim_tx_sample_rate_put), - SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, - msm_hifi_put), - SOC_ENUM_EXT("MultiMedia5_RX QOS Vote", qos_vote, msm_qos_ctl_get, - msm_qos_ctl_put), -}; - -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_enable(codec, enable); - } else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_tx_enable(codec, enable); - } else { - dev_err(codec->dev, "%s: unknown codec to enable TX ext clk\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_tx_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_tx_clk(codec, 0, true); - } - return 0; -} - -static int msm_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_clk(codec, 0, true); - } - return 0; -} - -static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *k, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - pr_debug("%s: msm_hifi_control = %d", __func__, msm_hifi_control); - - if (!pdata || !pdata->hph_en0_gpio_p) { - pr_err("%s: hph_en0_gpio is invalid\n", __func__); - return -EINVAL; - } - - if (msm_hifi_control != MSM_HIFI_ON) { - pr_debug("%s: HiFi mixer control is not set\n", - __func__); - return 0; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p); - break; - case SND_SOC_DAPM_PRE_PMD: - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p); - break; - } - - return 0; -} - -static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, - msm_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0, - msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SPK("Lineout_1 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), - SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event), - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL), - SND_SOC_DAPM_MIC("Analog Mic5", NULL), - - SND_SOC_DAPM_MIC("Digital Mic0", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", NULL), - SND_SOC_DAPM_MIC("Digital Mic2", NULL), - SND_SOC_DAPM_MIC("Digital Mic3", NULL), - SND_SOC_DAPM_MIC("Digital Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic5", NULL), -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, - unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int msm_slim_get_ch_from_beid(int32_t be_id) -{ - int ch_id = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - ch_id = SLIM_RX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - ch_id = SLIM_RX_1; - break; - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - ch_id = SLIM_RX_2; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - ch_id = SLIM_RX_3; - break; - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - ch_id = SLIM_RX_4; - break; - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - ch_id = SLIM_RX_6; - break; - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - ch_id = SLIM_TX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - ch_id = SLIM_TX_3; - break; - default: - ch_id = SLIM_RX_0; - break; - } - - return ch_id; -} - -static int msm_ext_disp_get_idx_from_beid(int32_t be_id) -{ - int idx; - - switch (be_id) { - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = DP_RX_IDX; - break; - default: - pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id); - idx = -EINVAL; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - void *config = NULL; - struct snd_soc_codec *codec = NULL; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[idx].bit_format); - rate->min = rate->max = slim_rx_cfg[idx].sample_rate; - channels->min = channels->max = slim_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[idx].bit_format); - rate->min = rate->max = slim_tx_cfg[idx].sample_rate; - channels->min = channels->max = slim_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_1_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[1].bit_format); - rate->min = rate->max = slim_tx_cfg[1].sample_rate; - channels->min = channels->max = slim_tx_cfg[1].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_4_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[5].bit_format); - rate->min = rate->max = slim_rx_cfg[5].sample_rate; - channels->min = channels->max = slim_rx_cfg[5].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_TX: - codec = rtd->codec; - rate->min = rate->max = SAMPLING_RATE_16KHZ; - channels->min = channels->max = 1; - - config = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_PORT_CONFIG); - if (config) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, - config, SLIMBUS_5_TX); - if (rc) - pr_err("%s: Failed to set slimbus slave port config %d\n", - __func__, rc); - } - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - goto done; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - -done: - return rc; -} - -static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - int value = 0; - bool ret = 0; - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct pinctrl_state *en2_pinctrl_active; - struct pinctrl_state *en2_pinctrl_sleep; - - if (!pdata->usbc_en2_gpio_p) { - if (active) { - /* if active and usbc_en2_gpio undefined, get pin */ - pdata->usbc_en2_gpio_p = devm_pinctrl_get(card->dev); - if (IS_ERR_OR_NULL(pdata->usbc_en2_gpio_p)) { - dev_err(card->dev, - "%s: Can't get EN2 gpio pinctrl:%ld\n", - __func__, - PTR_ERR(pdata->usbc_en2_gpio_p)); - pdata->usbc_en2_gpio_p = NULL; - return false; - } - } else - /* if not active and usbc_en2_gpio undefined, return */ - return false; - } - - pdata->usbc_en2_gpio = of_get_named_gpio(card->dev->of_node, - "qcom,usbc-analog-en2-gpio", 0); - if (!gpio_is_valid(pdata->usbc_en2_gpio)) { - dev_err(card->dev, "%s, property %s not in node %s", - __func__, "qcom,usbc-analog-en2-gpio", - card->dev->of_node->full_name); - return false; - } - - en2_pinctrl_active = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_active"); - if (IS_ERR_OR_NULL(en2_pinctrl_active)) { - dev_err(card->dev, - "%s: Cannot get aud_active pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_active)); - ret = false; - goto err_lookup_state; - } - - en2_pinctrl_sleep = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_sleep"); - if (IS_ERR_OR_NULL(en2_pinctrl_sleep)) { - dev_err(card->dev, - "%s: Cannot get aud_sleep pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_sleep)); - ret = false; - goto err_lookup_state; - } - - /* if active and usbc_en2_gpio_p defined, swap using usbc_en2_gpio_p */ - if (active) { - dev_dbg(codec->dev, "%s: enter\n", __func__); - if (pdata->usbc_en2_gpio_p) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - if (value) - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - else - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_active); - } else if (pdata->usbc_en2_gpio >= 0) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - gpio_set_value_cansleep(pdata->usbc_en2_gpio, !value); - } - pr_debug("%s: swap select switch %d to %d\n", __func__, - value, !value); - ret = true; - } else { - /* if not active, release usbc_en2_gpio_p pin */ - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - } - -err_lookup_state: - devm_pinctrl_put(pdata->usbc_en2_gpio_p); - pdata->usbc_en2_gpio_p = NULL; - return ret; -} - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - int value = 0; - int ret = 0; - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - if (!pdata) - return false; - - if (!wcd_mbhc_cfg.enable_usbc_analog) { - /* if usbc is not defined, swap using us_euro_gpio_p */ - if (pdata->us_euro_gpio_p) { - value = msm_cdc_pinctrl_get_state( - pdata->us_euro_gpio_p); - if (value) - msm_cdc_pinctrl_select_sleep_state( - pdata->us_euro_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - pdata->us_euro_gpio_p); - } else if (pdata->us_euro_gpio >= 0) { - value = gpio_get_value_cansleep( - pdata->us_euro_gpio); - gpio_set_value_cansleep( - pdata->us_euro_gpio, !value); - } - pr_debug("%s: swap select switch %d to %d\n", __func__, - value, !value); - ret = true; - } else { - /* if usbc is defined, swap using usbc_en2 */ - ret = msm_usbc_swap_gnd_mic(codec, active); - } - return ret; -} - -static int msm_afe_set_config(struct snd_soc_codec *codec) -{ - int ret = 0; - void *config_data = NULL; - - if (!msm_codec_fn.get_afe_config_fn) { - dev_err(codec->dev, "%s: codec get afe config not init'ed\n", - __func__); - return -EINVAL; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set codec registers config %d\n", - __func__, ret); - return ret; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (ret) - dev_err(codec->dev, - "%s: Failed to set cdc register page config\n", - __func__); - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set slimbus slave config %d\n", - __func__, ret); - return ret; - } - } - - return 0; -} - -static void msm_afe_clear_config(void) -{ - afe_clear_config(AFE_CDC_REGISTERS_CONFIG); - afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); -} - -static int msm_adsp_power_up_config(struct snd_soc_codec *codec, - struct snd_card *card) -{ - int ret = 0; - unsigned long timeout; - int adsp_ready = 0; - bool snd_card_online = 0; - - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - - do { - if (!snd_card_online) { - snd_card_online = snd_card_is_online_state(card); - pr_debug("%s: Sound card is %s\n", __func__, - snd_card_online ? "Online" : "Offline"); - } - if (!adsp_ready) { - adsp_ready = q6core_is_adsp_ready(); - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - } - if (snd_card_online && adsp_ready) - break; - - /* - * Sound card/ADSP will be coming up after subsystem restart and - * it might not be fully up when the control reaches - * here. So, wait for 50msec before checking ADSP state - */ - msleep(50); - } while (time_after(timeout, jiffies)); - - if (!snd_card_online || !adsp_ready) { - pr_err("%s: Timeout. Sound card is %s, ADSP Audio is %s\n", - __func__, - snd_card_online ? "Online" : "Offline", - adsp_ready ? "ready" : "not ready"); - ret = -ETIMEDOUT; - goto err; - } - - ret = msm_afe_set_config(codec); - if (ret) - pr_err("%s: Failed to set AFE config. err %d\n", - __func__, ret); - - return 0; - -err: - return ret; -} - -static int sdm845_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - int ret; - struct snd_soc_card *card = NULL; - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore initial boot notifications - * On initial boot msm_adsp_power_up_config is - * called on init. There is no need to clear - * and set the config again on initial boot. - */ - if (is_initial_boot) - break; - msm_afe_clear_config(); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (is_initial_boot) { - is_initial_boot = false; - break; - } - if (!spdev) - return -EINVAL; - - card = platform_get_drvdata(spdev); - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err; - } - codec = rtd->codec; - - ret = msm_adsp_power_up_config(codec, card->snd_card); - if (ret < 0) { - dev_err(card->dev, - "%s: msm_adsp_power_up_config failed ret = %d!\n", - __func__, ret); - goto err; - } - break; - default: - break; - } -err: - return NOTIFY_OK; -} - -static struct notifier_block service_nb = { - .notifier_call = sdm845_notifier_service_cb, - .priority = -INT_MAX, -}; - -static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[WCD934X_RX_MAX] = {144, 145, 146, 147, 148, 149, - 150, 151}; - unsigned int tx_ch[WCD934X_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - pr_info("%s: dev_name%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets, - ARRAY_SIZE(msm_dapm_widgets)); - - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - - snd_soc_dapm_sync(dapm); - - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); - - msm_codec_fn.get_afe_config_fn = tavil_get_afe_config; - - ret = msm_adsp_power_up_config(codec, rtd->card->snd_card); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err; - } - } - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, list_aux); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tavil_set_spkr_mode(rtd->codec, WCD934X_SPKR_MODE_1); - tavil_set_spkr_gain_offset(rtd->codec, - WCD934X_RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - pdata->codec_root = NULL; - goto done; - } - pdata->codec_root = entry; - tavil_codec_info_create_codec_entry(pdata->codec_root, codec); - -done: - codec_reg_done = true; - return 0; - -err: - return ret; -} - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static void *def_tavil_mbhc_cal(void) -{ - void *tavil_wcd_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - tavil_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!tavil_wcd_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tavil_wcd_cal)->X) = (Y)) - S(v_hs_max, 1600); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; - - return tavil_wcd_cal; -} - -static int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 rx_ch_count; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) { - pr_debug("%s: rx_5_ch=%d\n", __func__, - slim_rx_cfg[5].channels); - rx_ch_count = slim_rx_cfg[5].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) { - pr_debug("%s: rx_2_ch=%d\n", __func__, - slim_rx_cfg[2].channels); - rx_ch_count = slim_rx_cfg[2].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) { - pr_debug("%s: rx_6_ch=%d\n", __func__, - slim_rx_cfg[6].channels); - rx_ch_count = slim_rx_cfg[6].channels; - } else { - pr_debug("%s: rx_0_ch=%d\n", __func__, - slim_rx_cfg[0].channels); - rx_ch_count = slim_rx_cfg[0].channels; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - rx_ch_count, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - - pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__, - codec_dai->name, codec_dai->id, user_set_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - /* For _tx1 case */ - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX) - user_set_tx_ch = slim_tx_cfg[0].channels; - /* For _tx3 case */ - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX) - user_set_tx_ch = slim_tx_cfg[1].channels; - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX) - user_set_tx_ch = msm_vi_feed_tx_ch; - else - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), BE id (%d)\n", - __func__, slim_tx_cfg[0].channels, user_set_tx_ch, - tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - } - -err: - return ret; -} - -static int msm_slimbus_2_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0; - unsigned int num_tx_ch = 0; - unsigned int num_rx_ch = 0; - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - num_rx_ch = params_channels(params); - pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_rx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - num_rx_ch, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - num_tx_ch = params_channels(params); - pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, - num_tx_ch, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -err: - return ret; -} - -static int msm_aux_pcm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id - 1; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_AUX_PCM || index > QUAT_AUX_PCM) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - - mutex_lock(&auxpcm_intf_conf[index].lock); - if (++auxpcm_intf_conf[index].ref_cnt == 1) { - if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) { - mutex_lock(&mi2s_auxpcm_conf[index].lock); - iowrite32(1, - mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr); - mutex_unlock(&mi2s_auxpcm_conf[index].lock); - } else { - dev_err(rtd->card->dev, - "%s lpaif_tert_muxsel_virt_addr is NULL\n", - __func__); - ret = -EINVAL; - } - } - if (ret < 0) - auxpcm_intf_conf[index].ref_cnt--; - - mutex_unlock(&auxpcm_intf_conf[index].lock); - -err: - return ret; -} - -static void msm_aux_pcm_snd_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id - 1; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, - substream->name, substream->stream, - rtd->cpu_dai->name, rtd->cpu_dai->id); - - if (index < PRIM_AUX_PCM || index > QUAT_AUX_PCM) { - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, rtd->cpu_dai->id); - return; - } - - mutex_lock(&auxpcm_intf_conf[index].lock); - if (--auxpcm_intf_conf[index].ref_cnt == 0) { - if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) { - mutex_lock(&mi2s_auxpcm_conf[index].lock); - iowrite32(0, - mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr); - mutex_unlock(&mi2s_auxpcm_conf[index].lock); - } else { - dev_err(rtd->card->dev, - "%s lpaif_tert_muxsel_virt_addr is NULL\n", - __func__); - } - } - mutex_unlock(&auxpcm_intf_conf[index].lock); -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - -err: - return ret; -} - -static int msm_set_pinctrl(struct msm_pinctrl_info *pinctrl_info, - enum pinctrl_pin_state new_state) -{ - int ret = 0; - int curr_state = 0; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - if (pinctrl_info->pinctrl == NULL) { - pr_err("%s: pinctrl_info->pinctrl is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - curr_state = pinctrl_info->curr_state; - pinctrl_info->curr_state = new_state; - pr_debug("%s: curr_state = %s new_state = %s\n", __func__, - pin_states[curr_state], pin_states[pinctrl_info->curr_state]); - - if (curr_state == pinctrl_info->curr_state) { - pr_debug("%s: Already in same state\n", __func__); - goto err; - } - - if (curr_state != STATE_DISABLE && - pinctrl_info->curr_state != STATE_DISABLE) { - pr_debug("%s: state already active cannot switch\n", __func__); - ret = -EIO; - goto err; - } - - switch (pinctrl_info->curr_state) { - case STATE_MI2S_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_active); - if (ret) { - pr_err("%s: MI2S state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_TDM_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_active); - if (ret) { - pr_err("%s: TDM state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_DISABLE: - if (curr_state == STATE_MI2S_ACTIVE) { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - } else { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_disable); - } - if (ret) { - pr_err("%s: state disable failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - default: - pr_err("%s: TLMM pin state is invalid\n", __func__); - return -EINVAL; - } - -err: - return ret; -} - -static void msm_release_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info->pinctrl) { - devm_pinctrl_put(pinctrl_info->pinctrl); - pinctrl_info->pinctrl = NULL; - } -} - -static int msm_get_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = NULL; - struct pinctrl *pinctrl; - int ret; - - pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(pinctrl)) { - pr_err("%s: Unable to get pinctrl handle\n", __func__); - return -EINVAL; - } - pinctrl_info->pinctrl = pinctrl; - - /* get all the states handles from Device Tree */ - pinctrl_info->mi2s_disable = pinctrl_lookup_state(pinctrl, - "quat-mi2s-sleep"); - if (IS_ERR(pinctrl_info->mi2s_disable)) { - pr_err("%s: could not get mi2s_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->mi2s_active = pinctrl_lookup_state(pinctrl, - "quat-mi2s-active"); - if (IS_ERR(pinctrl_info->mi2s_active)) { - pr_err("%s: could not get mi2s_active pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_disable = pinctrl_lookup_state(pinctrl, - "quat-tdm-sleep"); - if (IS_ERR(pinctrl_info->tdm_disable)) { - pr_err("%s: could not get tdm_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_active = pinctrl_lookup_state(pinctrl, - "quat-tdm-active"); - if (IS_ERR(pinctrl_info->tdm_active)) { - pr_err("%s: could not get tdm_active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - if (ret != 0) { - pr_err("%s: Disable TLMM pins failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - pinctrl_info->curr_state = STATE_DISABLE; - - return 0; - -err: - devm_pinctrl_put(pinctrl); - pinctrl_info->pinctrl = NULL; - return -EINVAL; -} - -static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - if (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - } else if (cpu_dai->id == AFE_PORT_ID_SECONDARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - } else { - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n", - __func__, cpu_dai->id, channels->max, rate->max, - params_format(params)); - - return 0; -} - -static int sdm845_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int slot_width = 32; - int channels, slots; - unsigned int slot_mask, rate, clk_freq; - unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28}; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - slots = tdm_rx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - slots = tdm_rx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - slots = tdm_rx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - slots = tdm_tx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - slots = tdm_tx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - slots = tdm_tx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - slots = tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - break; - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - channels = slots; - - pr_debug("%s: tdm rx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm rx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set tdm rx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - channels = slots; - - pr_debug("%s: tdm tx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm tx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - channels, slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set tdm tx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - -end: - return ret; -} - -static int sdm845_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX)) { - ret = msm_set_pinctrl(pinctrl_info, STATE_TDM_ACTIVE); - if (ret) - pr_err("%s: TDM TLMM pinctrl set failed with %d\n", - __func__, ret); - } - - return ret; -} - -static void sdm845_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX)) { - ret = msm_set_pinctrl(pinctrl_info, STATE_DISABLE); - if (ret) - pr_err("%s: TDM TLMM pinctrl set failed with %d\n", - __func__, ret); - } -} - -static struct snd_soc_ops sdm845_tdm_be_ops = { - .hw_params = sdm845_tdm_snd_hw_params, - .startup = sdm845_tdm_snd_startup, - .shutdown = sdm845_tdm_snd_shutdown -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_MI2S || index > QUAT_MI2S) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, STATE_MI2S_ACTIVE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } - /* - * Muxtex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) { - mutex_lock(&mi2s_auxpcm_conf[index].lock); - iowrite32(0, - mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr); - mutex_unlock(&mi2s_auxpcm_conf[index].lock); - } else { - dev_err(rtd->card->dev, - "%s lpaif_muxsel_virt_addr is NULL for dai %d\n", - __func__, index); - ret = -EINVAL; - goto clk_off; - } - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - } -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -err: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (index < PRIM_MI2S || index > QUAT_MI2S) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - } - mutex_unlock(&mi2s_intf_conf[index].lock); - - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, STATE_DISABLE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } -} - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_aux_pcm_be_ops = { - .startup = msm_aux_pcm_snd_startup, - .shutdown = msm_aux_pcm_snd_shutdown, -}; - -static struct snd_soc_ops msm_be_ops = { - .hw_params = msm_snd_hw_params, -}; - -static struct snd_soc_ops msm_slimbus_2_be_ops = { - .hw_params = msm_slimbus_2_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - { - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - { - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - { - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - { - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - { - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - { - .name = "SLIMBUS_0 Hostless", - .stream_name = "SLIMBUS_0 Hostless", - .cpu_dai_name = "SLIMBUS0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - { - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - { - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - { - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_3 Hostless", - .stream_name = "SLIMBUS_3 Hostless", - .cpu_dai_name = "SLIMBUS3_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_4 Hostless", - .stream_name = "SLIMBUS_4 Hostless", - .cpu_dai_name = "SLIMBUS4_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - { - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - { - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - { - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - /* HDMI Hostless */ - { - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - { - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - { - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - { - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - { - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - { - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - { - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - { - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - { - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - { - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - { - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - { - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - { - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - { - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - { - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { - { - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sdm845_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_tavil_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - .ignore_pmdown_time = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .ops = &msm_aux_pcm_be_ops, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_aux_pcm_be_ops, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .ops = &msm_aux_pcm_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_tavil_snd_card_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_tavil_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_tavil_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links)]; - -static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err; - } - - mbhc_calibration = def_tavil_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tavil_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_free_mbhc_cal; - } - return 0; - -err_free_mbhc_cal: - kfree(mbhc_calibration); -err: - return ret; -} - -struct snd_soc_card snd_soc_card_tavil_msm = { - .name = "sdm845-tavil-snd-card", - .late_probe = msm_snd_card_tavil_late_probe, -}; - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - pr_err("%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static int msm_prepare_us_euro(struct snd_soc_card *card) -{ - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - int ret = 0; - - if (pdata->us_euro_gpio >= 0) { - dev_dbg(card->dev, "%s: us_euro gpio request %d", __func__, - pdata->us_euro_gpio); - ret = gpio_request(pdata->us_euro_gpio, "TAVIL_CODEC_US_EURO"); - if (ret) { - dev_err(card->dev, - "%s: Failed to request codec US/EURO gpio %d error %d\n", - __func__, pdata->us_euro_gpio, ret); - } - } - - return ret; -} - -static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, - "%s: add_codec_controls failed, err = %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets, - ARRAY_SIZE(msm_dapm_widgets)); - - return 0; -} - -static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - - int ret = 0; - unsigned int rx_ch[] = {144, 145, 146, 147, 148, 149, 150, - 151}; - unsigned int tx_ch[] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - slim_rx_cfg[0].channels, - rx_ch); - if (ret < 0) - pr_err("%s: RX failed to set cpu chan map error %d\n", - __func__, ret); - } else { - ret = snd_soc_dai_set_channel_map(cpu_dai, - slim_tx_cfg[0].channels, - tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: TX failed to set cpu chan map error %d\n", - __func__, ret); - } - - return ret; -} - -static struct snd_soc_ops msm_stub_be_ops = { - .hw_params = msm_snd_stub_hw_params, -}; - -static struct snd_soc_dai_link msm_stub_fe_dai_links[] = { - - /* FrontEnd DAI Links */ - { - .name = "MSMSTUB Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, -}; - -static struct snd_soc_dai_link msm_stub_be_dai_links[] = { - - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_stub_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_stub_dai_links[ - ARRAY_SIZE(msm_stub_fe_dai_links) + - ARRAY_SIZE(msm_stub_be_dai_links)]; - -struct snd_soc_card snd_soc_card_stub_msm = { - .name = "sdm845-stub-snd-card", -}; - -static const struct of_device_id sdm845_asoc_machine_of_match[] = { - { .compatible = "qcom,sdm845-asoc-snd-tavil", - .data = "tavil_codec"}, - { .compatible = "qcom,sdm845-asoc-snd-stub", - .data = "stub_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int len_1, len_2, len_3, len_4; - int total_links; - const struct of_device_id *match; - - match = of_match_node(sdm845_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "tavil_codec")) { - card = &snd_soc_card_tavil_msm; - len_1 = ARRAY_SIZE(msm_common_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links); - len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links); - len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links); - total_links = len_4 + ARRAY_SIZE(msm_tavil_be_dai_links); - memcpy(msm_tavil_snd_card_dai_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - memcpy(msm_tavil_snd_card_dai_links + len_1, - msm_tavil_fe_dai_links, - sizeof(msm_tavil_fe_dai_links)); - memcpy(msm_tavil_snd_card_dai_links + len_2, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - memcpy(msm_tavil_snd_card_dai_links + len_3, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - memcpy(msm_tavil_snd_card_dai_links + len_4, - msm_tavil_be_dai_links, - sizeof(msm_tavil_be_dai_links)); - - if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(msm_tavil_snd_card_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += ARRAY_SIZE(msm_wcn_be_dai_links); - } - - if (of_property_read_bool(dev->of_node, - "qcom,ext-disp-audio-rx")) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_tavil_snd_card_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - if (of_property_read_bool(dev->of_node, - "qcom,mi2s-audio-intf")) { - memcpy(msm_tavil_snd_card_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - if (of_property_read_bool(dev->of_node, - "qcom,auxpcm-audio-intf")) { - memcpy(msm_tavil_snd_card_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - dailink = msm_tavil_snd_card_dai_links; - } else if (!strcmp(match->data, "stub_codec")) { - card = &snd_soc_card_stub_msm; - len_1 = ARRAY_SIZE(msm_stub_fe_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_stub_be_dai_links); - - memcpy(msm_stub_dai_links, - msm_stub_fe_dai_links, - sizeof(msm_stub_fe_dai_links)); - memcpy(msm_stub_dai_links + len_1, - msm_stub_be_dai_links, - sizeof(msm_stub_be_dai_links)); - - dailink = msm_stub_dai_links; - total_links = len_2; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -static int msm_wsa881x_init(struct snd_soc_component *component) -{ - u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {100, 101, 102, 106}; - u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {103, 104, 105, 107}; - unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200}; - unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm; - int ret = 0; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - dapm = snd_soc_codec_get_dapm(codec); - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - ret = -EINVAL; - goto err; - } - pdata = snd_soc_card_get_drvdata(component->card); - if (pdata && pdata->codec_root) - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); - -err: - return ret; -} - -static int msm_init_wsa_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - int i; - struct msm_wsa881x_dev_info *wsa881x_dev_info; - const char *wsa_auxdev_name_prefix[1]; - char *dev_name_str = NULL; - int found = 0; - int ret = 0; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_info(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - card->num_aux_devs = 0; - return 0; - } - if (wsa_max_devs == 0) { - dev_warn(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - card->num_aux_devs = 0; - return 0; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err_free_dev_info; - } - if (soc_find_component(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - - card->num_aux_devs = wsa_max_devs; - card->num_configs = wsa_max_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err_free_dev_info; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err_free_aux_dev; - } - - for (i = 0; i < card->num_aux_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err_free_cdc_conf; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - wsa_auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err_free_dev_name_str; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_init; - msm_codec_conf[i].dev_name = NULL; - msm_codec_conf[i].name_prefix = wsa_auxdev_name_prefix[0]; - msm_codec_conf[i].of_node = - wsa881x_dev_info[i].of_node; - } - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; - - return 0; - -err_free_dev_name_str: - devm_kfree(&pdev->dev, dev_name_str); -err_free_cdc_conf: - devm_kfree(&pdev->dev, msm_codec_conf); -err_free_aux_dev: - devm_kfree(&pdev->dev, msm_aux_dev); -err_free_dev_info: - devm_kfree(&pdev->dev, wsa881x_dev_info); -err: - return ret; -} - -static void msm_i2s_auxpcm_init(struct platform_device *pdev) -{ - struct resource *muxsel; - int count; - u32 mi2s_master_slave[MI2S_MAX]; - int ret; - char *str[PCM_I2S_SEL_MAX] = { - "lpaif_pri_mode_muxsel", - "lpaif_sec_mode_muxsel", - "lpaif_tert_mode_muxsel", - "lpaif_quat_mode_muxsel" - }; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - for (count = 0; count < AUX_PCM_MAX; count++) { - mutex_init(&auxpcm_intf_conf[count].lock); - auxpcm_intf_conf[count].ref_cnt = 0; - } - - for (count = 0; count < PCM_I2S_SEL_MAX; count++) { - mutex_init(&mi2s_auxpcm_conf[count].lock); - mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr = NULL; - } - - for (count = 0; count < PCM_I2S_SEL_MAX; count++) { - muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM, - str[count]); - if (muxsel) { - mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr - = ioremap(muxsel->start, resource_size(muxsel)); - } - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } -} - -static void msm_i2s_auxpcm_deinit(void) -{ - int count; - - for (count = 0; count < PCM_I2S_SEL_MAX; count++) { - if (mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr != - NULL) { - iounmap( - mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr); - mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr = NULL; - } - mutex_destroy(&mi2s_auxpcm_conf[count].lock); - } - - for (count = 0; count < AUX_PCM_MAX; count++) { - mutex_destroy(&auxpcm_intf_conf[count].lock); - auxpcm_intf_conf[count].ref_cnt = 0; - } - - for (count = 0; count < MI2S_MAX; count++) { - mutex_destroy(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - mi2s_intf_conf[count].msm_is_mi2s_master = 0; - } -} - -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - const char *mbhc_audio_jack_type = NULL; - char *mclk_freq_prop_name; - const struct of_device_id *match; - int ret; - const char *usb_c_dt = "qcom,msm-mbhc-usbc-audio-supported"; - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "No platform supplied from device tree\n"); - return -EINVAL; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "parse card name failed, err:%d\n", - ret); - goto err; - } - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) { - dev_err(&pdev->dev, "parse audio routing failed, err:%d\n", - ret); - goto err; - } - - match = of_match_node(sdm845_asoc_machine_of_match, - pdev->dev.of_node); - if (!match) { - dev_err(&pdev->dev, "%s: no matched codec is found.\n", - __func__); - goto err; - } - - mclk_freq_prop_name = "qcom,tavil-mclk-clk-freq"; - - ret = of_property_read_u32(pdev->dev.of_node, - mclk_freq_prop_name, &pdata->mclk_freq); - if (ret) { - dev_err(&pdev->dev, - "Looking up %s property in node %s failed, err%d\n", - mclk_freq_prop_name, - pdev->dev.of_node->full_name, ret); - goto err; - } - - if (pdata->mclk_freq != CODEC_EXT_CLK_RATE) { - dev_err(&pdev->dev, "unsupported mclk freq %u\n", - pdata->mclk_freq); - ret = -EINVAL; - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - ret = msm_init_wsa_dev(pdev, card); - if (ret) - goto err; - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) - ret = -EINVAL; - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - dev_info(&pdev->dev, "Sound card %s registered\n", card->name); - spdev = pdev; - - ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (ret) { - dev_dbg(&pdev->dev, "%s: failed to add child nodes, ret=%d\n", - __func__, ret); - } else { - pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!pdata->hph_en1_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en1-gpio", - pdev->dev.of_node->full_name); - } - - pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!pdata->hph_en0_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en0-gpio", - pdev->dev.of_node->full_name); - } - } - - ret = of_property_read_string(pdev->dev.of_node, - "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type); - if (ret) { - dev_dbg(&pdev->dev, "Looking up %s property in node %s failed", - "qcom,mbhc-audio-jack-type", - pdev->dev.of_node->full_name); - dev_dbg(&pdev->dev, "Jack type properties set to default"); - } else { - if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "This hardware has 4 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 5 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 6 pole jack"); - } else { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "Unknown value, set to default"); - } - } - /* - * Parse US-Euro gpio info from DT. Report no error if us-euro - * entry is not found in DT file as some targets do not support - * US-Euro detection - */ - pdata->us_euro_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!gpio_is_valid(pdata->us_euro_gpio)) - pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!gpio_is_valid(pdata->us_euro_gpio) && (!pdata->us_euro_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,us-euro-gpios", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "%s detected", - "qcom,us-euro-gpios"); - wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - } - - if (of_find_property(pdev->dev.of_node, usb_c_dt, NULL)) - wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - - ret = msm_prepare_us_euro(card); - if (ret) - dev_dbg(&pdev->dev, "msm_prepare_us_euro failed (%d)\n", - ret); - - /* Parse pinctrl info from devicetree */ - ret = msm_get_pinctrl(pdev); - if (!ret) { - pr_debug("%s: pinctrl parsing successful\n", __func__); - } else { - dev_dbg(&pdev->dev, - "%s: Parsing pinctrl failed with %d. Cannot use Ports\n", - __func__, ret); - ret = 0; - } - - msm_i2s_auxpcm_init(pdev); - - is_initial_boot = true; - ret = audio_notifier_register("sdm845", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - - return 0; -err: - msm_release_pinctrl(pdev); - devm_kfree(&pdev->dev, pdata); - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - audio_notifier_deregister("sdm845"); - if (pdata->us_euro_gpio > 0) { - gpio_free(pdata->us_euro_gpio); - pdata->us_euro_gpio = 0; - } - msm_i2s_auxpcm_deinit(); - - msm_release_pinctrl(pdev); - snd_soc_unregister_card(card); - return 0; -} - -static struct platform_driver sdm845_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = sdm845_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; -module_platform_driver(sdm845_asoc_machine_driver); - -MODULE_DESCRIPTION("ALSA SoC msm"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, sdm845_asoc_machine_of_match); diff --git a/techpack/audio/asoc/sm6150.c b/techpack/audio/asoc/sm6150.c deleted file mode 100644 index 7c146927b3ac..000000000000 --- a/techpack/audio/asoc/sm6150.c +++ /dev/null @@ -1,9281 +0,0 @@ -/* - * Copyright (c) 2018-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "device_event.h" -#include "msm-pcm-routing-v2.h" -#include "codecs/msm-cdc-pinctrl.h" -#include "codecs/wcd934x/wcd934x.h" -#include "codecs/wcd9335.h" -#include "codecs/wcd934x/wcd934x-mbhc.h" -#include "codecs/wcd937x/wcd937x-mbhc.h" -#include "codecs/wsa881x.h" -#include "codecs/bolero/bolero-cdc.h" -#include -#include "codecs/bolero/wsa-macro.h" -#include "codecs/wcd937x/wcd937x.h" - -#define DRV_NAME "sm6150-asoc-snd" - -#define __CHIPSET__ "SM6150 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define WCD9XXX_MBHC_DEF_BUTTONS 8 -#define WCD9XXX_MBHC_DEF_RLOADS 5 -#define CODEC_EXT_CLK_RATE 9600000 -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define DEV_NAME_STR_LEN 32 - -#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 3 -#define TDM_CHANNEL_MAX 8 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ -#define MSM_HIFI_ON 1 - -#define SM6150_SOC_VERSION_1_0 0x00010000 -#define SM6150_SOC_MSM_ID 0x163 - -enum { - SLIM_RX_0 = 0, - SLIM_RX_1, - SLIM_RX_2, - SLIM_RX_3, - SLIM_RX_4, - SLIM_RX_5, - SLIM_RX_6, - SLIM_RX_7, - SLIM_RX_MAX, -}; -enum { - SLIM_TX_0 = 0, - SLIM_TX_1, - SLIM_TX_2, - SLIM_TX_3, - SLIM_TX_4, - SLIM_TX_5, - SLIM_TX_6, - SLIM_TX_7, - SLIM_TX_8, - SLIM_TX_MAX, -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - QUIN_MI2S, - MI2S_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - QUIN_AUX_PCM, - AUX_PCM_MAX, -}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_QUIN, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -enum { - WSA_CDC_DMA_RX_0 = 0, - WSA_CDC_DMA_RX_1, - RX_CDC_DMA_RX_0, - RX_CDC_DMA_RX_1, - RX_CDC_DMA_RX_2, - RX_CDC_DMA_RX_3, - RX_CDC_DMA_RX_5, - CDC_DMA_RX_MAX, -}; - -enum { - WSA_CDC_DMA_TX_0 = 0, - WSA_CDC_DMA_TX_1, - WSA_CDC_DMA_TX_2, - TX_CDC_DMA_TX_0, - TX_CDC_DMA_TX_3, - TX_CDC_DMA_TX_4, - CDC_DMA_TX_MAX, -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; - u32 msm_is_ext_mclk; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -enum { - DP_RX_IDX = 0, - EXT_DISP_RX_IDX_MAX, -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct aux_codec_dev_info { - struct device_node *of_node; - u32 index; -}; - -struct msm_asoc_mach_data { - struct snd_info_entry *codec_root; - int usbc_en2_gpio; /* used by gpio driver API */ - int hph_en1_gpio; - int hph_en0_gpio; - struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */ - struct device_node *dmic01_gpio_p; /* used by pinctrl API */ - struct device_node *dmic23_gpio_p; /* used by pinctrl API */ - struct device_node *us_euro_gpio_p; /* used by pinctrl API */ - struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ - bool is_afe_config_done; - struct device_node *fsa_handle; -}; - -struct msm_asoc_wcd93xx_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); -}; - -static struct snd_soc_card snd_soc_card_sm6150_msm; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } - -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } -}; - - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of Codec DMA Interface Tx */ -static struct dev_config cdc_dma_rx_cfg[] = { - [WSA_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [RX_CDC_DMA_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of Codec DMA Interface Rx */ -static struct dev_config cdc_dma_tx_cfg[] = { - [WSA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [WSA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TX_CDC_DMA_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; -static int msm_vi_feed_tx_ch = 2; -static const char *const slim_rx_ch_text[] = {"One", "Two"}; -static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE", - "S24_3LE"}; -static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_32", "KHZ_44P1", - "KHZ_88P2", "KHZ_176P4" }; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_48", "KHZ_176P4", - "KHZ_352P8"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16", - "KHZ_22P05", "KHZ_32", "KHZ_44P1", - "KHZ_48", "KHZ_96", "KHZ_192"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const hifi_text[] = {"Off", "On"}; -static const char *const qos_text[] = {"Disable", "Enable"}; - -static const char *const cdc_dma_rx_ch_text[] = {"One", "Two"}; -static const char *const cdc_dma_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *cdc_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", - "KHZ_176P4", "KHZ_192", - "KHZ_352P8", "KHZ_384"}; - - -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_chs, cdc_dma_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_chs, cdc_dma_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_sample_rate, - cdc_dma_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_sample_rate, - cdc_dma_sample_rate_text); - -static int msm_hifi_control; -static bool codec_reg_done; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; -static struct msm_asoc_wcd93xx_codec msm_codec_fn; - -static int dmic_0_1_gpio_cnt; -static int dmic_2_3_gpio_cnt; - -static void *def_wcd_mbhc_cal(void); -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm); -static int msm_wsa881x_init(struct snd_soc_component *component); -static int msm_aux_codec_init(struct snd_soc_component *component); - -/* - * Need to report LINEIN - * if R/L channel impedance is larger than 5K ohm - */ -static struct wcd_mbhc_config wcd_mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .detect_extn_cable = true, - .mono_stero_detection = false, - .swap_gnd_mic = NULL, - .hs_ext_micbias = true, - .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, - .key_code[4] = 0, - .key_code[5] = 0, - .key_code[6] = 0, - .key_code[7] = 0, - .linein_th = 5000, - .moisture_en = true, - .mbhc_micbias = MIC_BIAS_2, - .anc_micbias = MIC_BIAS_2, - .enable_anc_mic_detect = false, -}; - -static struct snd_soc_dapm_route wcd_audio_paths[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS2", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } - -}; - -static struct afe_clk_set mi2s_mclk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_3, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_2, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_1, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_MCLK_1, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR, - Q6AFE_LPASS_OSR_CLK_9_P600_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } -}; - -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; - -static int slim_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 10; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int slim_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int slim_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - val = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int slim_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - bit_fmt = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int slim_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) { - port_id = SLIM_RX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_2_RX", sizeof("SLIM_2_RX"))) { - port_id = SLIM_RX_2; - } else if (strnstr(kcontrol->id.name, - "SLIM_5_RX", sizeof("SLIM_5_RX"))) { - port_id = SLIM_RX_5; - } else if (strnstr(kcontrol->id.name, - "SLIM_6_RX", sizeof("SLIM_6_RX"))) { - port_id = SLIM_RX_6; - } else if (strnstr(kcontrol->id.name, - "SLIM_0_TX", sizeof("SLIM_0_TX"))) { - port_id = SLIM_TX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_1_TX", sizeof("SLIM_1_TX"))) { - port_id = SLIM_TX_1; - } else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].sample_rate = - slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate = 0; - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - if (sample_rate == SAMPLING_RATE_44P1KHZ) { - pr_err("%s: Unsupported sample rate %d: for Tx path\n", - __func__, sample_rate); - return -EINVAL; - } - slim_tx_cfg[ch_num].sample_rate = sample_rate; - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - - return 1; -} - -static int slim_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d\n", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} -static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate rx = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_rx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_tx_cfg[SLIM_TX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate tx = %d", __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_tx = %d, value = %d\n", - __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} -static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx = 0; - - if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_0", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_1", - sizeof("WSA_CDC_DMA_RX_0"))) - idx = WSA_CDC_DMA_RX_1; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_0", - sizeof("RX_CDC_DMA_RX_0"))) - idx = RX_CDC_DMA_RX_0; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_1", - sizeof("RX_CDC_DMA_RX_1"))) - idx = RX_CDC_DMA_RX_1; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_2", - sizeof("RX_CDC_DMA_RX_2"))) - idx = RX_CDC_DMA_RX_2; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_3", - sizeof("RX_CDC_DMA_RX_3"))) - idx = RX_CDC_DMA_RX_3; - else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_5", - sizeof("RX_CDC_DMA_RX_5"))) - idx = RX_CDC_DMA_RX_5; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_0", - sizeof("WSA_CDC_DMA_TX_0"))) - idx = WSA_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_1", - sizeof("WSA_CDC_DMA_TX_1"))) - idx = WSA_CDC_DMA_TX_1; - else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_2", - sizeof("WSA_CDC_DMA_TX_2"))) - idx = WSA_CDC_DMA_TX_2; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_0", - sizeof("TX_CDC_DMA_TX_0"))) - idx = TX_CDC_DMA_TX_0; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_3", - sizeof("TX_CDC_DMA_TX_3"))) - idx = TX_CDC_DMA_TX_3; - else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_4", - sizeof("TX_CDC_DMA_TX_4"))) - idx = TX_CDC_DMA_TX_4; - else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return idx; -} - -static int cdc_dma_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels - 1); - ucontrol->value.integer.value[0] = cdc_dma_rx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_rx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_rx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_rx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - - -static int cdc_dma_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int cdc_dma_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 11: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 12: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int cdc_dma_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - ucontrol->value.enumerated.item[0] = - cdc_dma_get_sample_rate_val(cdc_dma_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: cdc_dma_rx_sample_rate = %d\n", __func__, - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_rx_cfg[ch_num].sample_rate = - cdc_dma_get_sample_rate(ucontrol->value.enumerated.item[0]); - - - pr_debug("%s: control value = %d, cdc_dma_rx_sample_rate = %d\n", - __func__, ucontrol->value.enumerated.item[0], - cdc_dma_rx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - ucontrol->value.integer.value[0] = cdc_dma_tx_cfg[ch_num].channels - 1; - return 0; -} - -static int cdc_dma_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - cdc_dma_tx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].channels); - return 1; -} - -static int cdc_dma_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_tx_cfg[ch_num].sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: cdc_dma_tx_sample_rate = %d\n", __func__, - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 12: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, cdc_dma_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - cdc_dma_tx_cfg[ch_num].sample_rate); - return 0; -} - -static int cdc_dma_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (cdc_dma_tx_cfg[ch_num].bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int cdc_dma_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - int ch_num = cdc_dma_get_port_idx(kcontrol); - - if (ch_num < 0) { - pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num); - return ch_num; - } - - switch (ucontrol->value.integer.value[0]) { - case 3: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n", - __func__, cdc_dma_tx_cfg[ch_num].bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) { - idx = DP_RX_IDX; - } else { - pr_err("%s: unsupported BE: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 2: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 6; - break; - - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 4; - break; - - case SAMPLING_RATE_32KHZ: - sample_rate_val = 3; - break; - - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 6: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 5; - break; - default: - sample_rate_val = 3; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - port->mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUAT; - } else if (strnstr(kcontrol->id.name, "QUIN", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUIN; - } else { - pr_err("%s: unsupported mode in: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - port->channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - port->channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - port->channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - port->channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - port->channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - port->channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - port->channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - port->channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s\n", - __func__, kcontrol->id.name); - return -EINVAL; - } - } else { - return -EINVAL; - } - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s\n", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) { - idx = PRIM_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) { - idx = SEC_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) { - idx = TERT_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) { - idx = QUAT_AUX_PCM; - } else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", - sizeof("QUIN_AUX_PCM"))) { - idx = QUIN_AUX_PCM; - } else { - pr_err("%s: unsupported port: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) { - idx = PRIM_MI2S; - } else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) { - idx = SEC_MI2S; - } else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) { - idx = TERT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) { - idx = QUAT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", - sizeof("QUIN_MI2S_RX"))) { - idx = QUIN_MI2S; - } else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) { - idx = PRIM_MI2S; - } else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) { - idx = SEC_MI2S; - } else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) { - idx = TERT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) { - idx = QUAT_MI2S; - } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", - sizeof("QUIN_MI2S_TX"))) { - idx = QUIN_MI2S; - } else { - pr_err("%s: unsupported channel: %s\n", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_auxpcm_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_auxpcm_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_hifi_ctrl(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - dev_dbg(codec->dev, "%s: msm_hifi_control = %d\n", __func__, - msm_hifi_control); - - if (!pdata || !pdata->hph_en1_gpio_p) { - dev_err(codec->dev, "%s: hph_en1_gpio is invalid\n", __func__); - return -EINVAL; - } - if (msm_hifi_control == MSM_HIFI_ON) { - msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p); - /* 5msec delay needed as per HW requirement */ - usleep_range(5000, 5010); - } else { - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p); - } - snd_soc_dapm_sync(dapm); - - return 0; -} - -static int msm_hifi_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - ucontrol->value.integer.value[0] = msm_hifi_control; - - return 0; -} - -static int msm_hifi_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - msm_hifi_control = ucontrol->value.integer.value[0]; - msm_hifi_ctrl(codec); - - return 0; -} - -static const struct snd_kcontrol_new msm_int_snd_controls[] = { - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Channels", wsa_cdc_dma_rx_0_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Channels", wsa_cdc_dma_rx_1_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Channels", rx_cdc_dma_rx_0_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Channels", rx_cdc_dma_rx_1_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Channels", rx_cdc_dma_rx_2_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Channels", rx_cdc_dma_rx_3_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Channels", rx_cdc_dma_rx_5_chs, - cdc_dma_rx_ch_get, cdc_dma_rx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 Channels", wsa_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Channels", wsa_cdc_dma_tx_1_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Channels", wsa_cdc_dma_tx_2_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Channels", tx_cdc_dma_tx_0_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Channels", tx_cdc_dma_tx_3_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Channels", tx_cdc_dma_tx_4_chs, - cdc_dma_tx_ch_get, cdc_dma_tx_ch_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Format", wsa_cdc_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Format", wsa_cdc_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc_dma_rx_0_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc_dma_rx_1_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc_dma_rx_2_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc_dma_rx_3_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc_dma_rx_5_format, - cdc_dma_rx_format_get, cdc_dma_rx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Format", wsa_cdc_dma_tx_1_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Format", wsa_cdc_dma_tx_2_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Format", tx_cdc_dma_tx_0_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Format", tx_cdc_dma_tx_3_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Format", tx_cdc_dma_tx_4_format, - cdc_dma_tx_format_get, cdc_dma_tx_format_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 SampleRate", - wsa_cdc_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 SampleRate", - wsa_cdc_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate", - rx_cdc_dma_rx_0_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate", - rx_cdc_dma_rx_1_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate", - rx_cdc_dma_rx_2_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate", - rx_cdc_dma_rx_3_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate", - rx_cdc_dma_rx_5_sample_rate, - cdc_dma_rx_sample_rate_get, - cdc_dma_rx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 SampleRate", - wsa_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 SampleRate", - wsa_cdc_dma_tx_1_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 SampleRate", - wsa_cdc_dma_tx_2_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_0 SampleRate", - tx_cdc_dma_tx_0_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_3 SampleRate", - tx_cdc_dma_tx_3_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), - SOC_ENUM_EXT("TX_CDC_DMA_TX_4 SampleRate", - tx_cdc_dma_tx_4_sample_rate, - cdc_dma_tx_sample_rate_get, - cdc_dma_tx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_ext_snd_controls[] = { - SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format, - slim_tx_bit_format_get, slim_tx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate, - slim_tx_sample_rate_get, slim_tx_sample_rate_put), - SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), -}; - -static const struct snd_kcontrol_new msm_common_snd_controls[] = { - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, - msm_hifi_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx, - msm_bt_sample_rate_rx_get, - msm_bt_sample_rate_rx_put), - SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, - msm_bt_sample_rate_tx_get, - msm_bt_sample_rate_tx_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), -}; - -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_enable(codec, enable); - } else if (!strcmp(dev_name(codec->dev), "tasha_codec")) { - ret = tasha_cdc_mclk_enable(codec, enable, dapm); - } else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_tx_enable(codec, enable); - } else if (!strcmp(dev_name(codec->dev), "tasha_codec")) { - ret = tasha_cdc_mclk_tx_enable(codec, enable, dapm); - } else { - dev_err(codec->dev, "%s: unknown codec to enable TX ext clk\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_tx_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_tx_clk(codec, 0, true); - } - return 0; -} - -static int msm_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_clk(codec, 0, true); - } - return 0; -} - -static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *k, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - dev_dbg(codec->dev, "%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - - if (!pdata || !pdata->hph_en0_gpio_p) { - dev_err(codec->dev, "%s: hph_en0_gpio is invalid\n", __func__); - return -EINVAL; - } - - if (msm_hifi_control != MSM_HIFI_ON) { - dev_dbg(codec->dev, "%s: HiFi mixer control is not set\n", - __func__); - return 0; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p); - break; - case SND_SOC_DAPM_PRE_PMD: - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p); - break; - } - - return 0; -} - -static const struct snd_soc_dapm_widget msm_ext_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, - msm_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0, - msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SPK("Lineout_1 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_3 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_4 amp", NULL), - SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event), - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), - SND_SOC_DAPM_MIC("Secondary Mic", NULL), - SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - SND_SOC_DAPM_MIC("Analog Mic5", NULL), - SND_SOC_DAPM_MIC("Analog Mic6", NULL), - SND_SOC_DAPM_MIC("Analog Mic7", NULL), - SND_SOC_DAPM_MIC("Analog Mic8", NULL), - - SND_SOC_DAPM_MIC("Digital Mic0", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", NULL), - SND_SOC_DAPM_MIC("Digital Mic2", NULL), - SND_SOC_DAPM_MIC("Digital Mic3", NULL), - SND_SOC_DAPM_MIC("Digital Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic5", NULL), - SND_SOC_DAPM_MIC("Digital Mic6", NULL), -}; - -static int msm_dmic_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct msm_asoc_mach_data *pdata = NULL; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - int ret = 0; - u32 dmic_idx; - int *dmic_gpio_cnt; - struct device_node *dmic_gpio; - char *wname; - - wname = strpbrk(w->name, "0123"); - if (!wname) { - dev_err(codec->dev, "%s: widget not found\n", __func__); - return -EINVAL; - } - - ret = kstrtouint(wname, 10, &dmic_idx); - if (ret < 0) { - dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n", - __func__); - return -EINVAL; - } - - pdata = snd_soc_card_get_drvdata(codec->component.card); - - switch (dmic_idx) { - case 0: - case 1: - dmic_gpio_cnt = &dmic_0_1_gpio_cnt; - dmic_gpio = pdata->dmic01_gpio_p; - break; - case 2: - case 3: - dmic_gpio_cnt = &dmic_2_3_gpio_cnt; - dmic_gpio = pdata->dmic23_gpio_p; - break; - default: - dev_err(codec->dev, "%s: Invalid DMIC Selection\n", - __func__); - return -EINVAL; - } - - dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n", - __func__, event, dmic_idx, *dmic_gpio_cnt); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - (*dmic_gpio_cnt)++; - if (*dmic_gpio_cnt == 1) { - ret = msm_cdc_pinctrl_select_active_state( - dmic_gpio); - if (ret < 0) { - pr_err("%s: gpio set cannot be activated %sd", - __func__, "dmic_gpio"); - return ret; - } - } - - break; - case SND_SOC_DAPM_POST_PMD: - (*dmic_gpio_cnt)--; - if (*dmic_gpio_cnt == 0) { - ret = msm_cdc_pinctrl_select_sleep_state( - dmic_gpio); - if (ret < 0) { - pr_err("%s: gpio set cannot be de-activated %sd", - __func__, "dmic_gpio"); - return ret; - } - } - break; - default: - pr_err("%s: invalid DAPM event %d\n", __func__, event); - return -EINVAL; - } - return 0; -} - -static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = { - SND_SOC_DAPM_MIC("Analog Mic1", NULL), - SND_SOC_DAPM_MIC("Analog Mic2", NULL), - SND_SOC_DAPM_MIC("Analog Mic3", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event), - SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event), -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, - unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int msm_slim_get_ch_from_beid(int32_t be_id) -{ - int ch_id = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - ch_id = SLIM_RX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - ch_id = SLIM_RX_1; - break; - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - ch_id = SLIM_RX_2; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - ch_id = SLIM_RX_3; - break; - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - ch_id = SLIM_RX_4; - break; - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - ch_id = SLIM_RX_6; - break; - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - ch_id = SLIM_TX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - ch_id = SLIM_TX_3; - break; - default: - ch_id = SLIM_RX_0; - break; - } - - return ch_id; -} - -static int msm_cdc_dma_get_idx_from_beid(int32_t be_id) -{ - int idx = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - idx = WSA_CDC_DMA_RX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - idx = WSA_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - idx = WSA_CDC_DMA_RX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - idx = WSA_CDC_DMA_TX_1; - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - idx = WSA_CDC_DMA_TX_2; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - idx = RX_CDC_DMA_RX_0; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - idx = RX_CDC_DMA_RX_1; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - idx = RX_CDC_DMA_RX_2; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3: - idx = RX_CDC_DMA_RX_3; - break; - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5: - idx = RX_CDC_DMA_RX_5; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - idx = TX_CDC_DMA_TX_0; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - idx = TX_CDC_DMA_TX_3; - break; - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - idx = TX_CDC_DMA_TX_4; - break; - default: - idx = RX_CDC_DMA_RX_0; - break; - } - - return idx; -} - -static int msm_ext_disp_get_idx_from_beid(int32_t be_id) -{ - int idx = -EINVAL; - - switch (be_id) { - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = DP_RX_IDX; - break; - default: - pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id); - idx = -EINVAL; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - void *config = NULL; - struct snd_soc_codec *codec = NULL; - - pr_debug("%s: format = %d, rate = %d\n", - __func__, params_format(params), params_rate(params)); - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[idx].bit_format); - rate->min = rate->max = slim_rx_cfg[idx].sample_rate; - channels->min = channels->max = slim_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[idx].bit_format); - rate->min = rate->max = slim_tx_cfg[idx].sample_rate; - channels->min = channels->max = slim_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_1_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[1].bit_format); - rate->min = rate->max = slim_tx_cfg[1].sample_rate; - channels->min = channels->max = slim_tx_cfg[1].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_4_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[5].bit_format); - rate->min = rate->max = slim_rx_cfg[5].sample_rate; - channels->min = channels->max = slim_rx_cfg[5].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_TX: - codec = rtd->codec; - rate->min = rate->max = SAMPLING_RATE_16KHZ; - channels->min = channels->max = 1; - - config = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_PORT_CONFIG); - if (config) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, - config, SLIMBUS_5_TX); - if (rc) - pr_err("%s: Failed to set slimbus slave port config %d\n", - __func__, rc); - } - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - goto done; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - - case MSM_BACKEND_DAI_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_rx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_rx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - idx = msm_cdc_dma_get_idx_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - cdc_dma_tx_cfg[idx].bit_format); - rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate; - channels->min = channels->max = cdc_dma_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - -done: - return rc; -} - -static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - if (!pdata->fsa_handle) - return false; - - return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP); -} - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - int value = 0; - bool ret = false; - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return false; - } - card = codec->component.card; - pdata = snd_soc_card_get_drvdata(card); - - if (!pdata) - return false; - - if (wcd_mbhc_cfg.enable_usbc_analog) - return msm_usbc_swap_gnd_mic(codec, active); - - /* if usbc is not defined, swap using us_euro_gpio_p */ - if (pdata->us_euro_gpio_p) { - value = msm_cdc_pinctrl_get_state( - pdata->us_euro_gpio_p); - if (value) - msm_cdc_pinctrl_select_sleep_state( - pdata->us_euro_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - pdata->us_euro_gpio_p); - dev_dbg(codec->dev, "%s: swap select switch %d to %d\n", - __func__, value, !value); - ret = true; - } - return ret; -} - -static int msm_afe_set_config(struct snd_soc_codec *codec) -{ - int ret = 0; - void *config_data = NULL; - - if (!msm_codec_fn.get_afe_config_fn) { - dev_err(codec->dev, "%s: codec get afe config not init'ed\n", - __func__); - return -EINVAL; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set codec registers config %d\n", - __func__, ret); - return ret; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (ret) - dev_err(codec->dev, - "%s: Failed to set cdc register page config\n", - __func__); - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set slimbus slave config %d\n", - __func__, ret); - return ret; - } - } - - return 0; -} - -static void msm_afe_clear_config(void) -{ - afe_clear_config(AFE_CDC_REGISTERS_CONFIG); - afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); -} - -static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* - * Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[WCD934X_RX_MAX] = {144, 145, 146, 147, 148, 149, - 150, 151}; - unsigned int tx_ch[WCD934X_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - pr_info("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_ext_snd_controls, - ARRAY_SIZE(msm_ext_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - ARRAY_SIZE(msm_common_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_ext_dapm_widgets, - ARRAY_SIZE(msm_ext_dapm_widgets)); - - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - - snd_soc_dapm_sync(dapm); - - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); - - msm_codec_fn.get_afe_config_fn = tavil_get_afe_config; - - ret = msm_afe_set_config(codec); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err; - } - pdata->is_afe_config_done = true; - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err; - } - } - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tavil_set_spkr_mode(rtd->codec, WCD934X_SPKR_MODE_1); - tavil_set_spkr_gain_offset(rtd->codec, - WCD934X_RX_GAIN_OFFSET_M1P5_DB); - } - } - - card = rtd->card->snd_card; - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - tavil_codec_info_create_codec_entry(pdata->codec_root, codec); - - codec_reg_done = true; - return 0; -err: - return ret; -} - -static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156}; - unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - pr_info("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_ext_snd_controls, - ARRAY_SIZE(msm_ext_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - ARRAY_SIZE(msm_common_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_ext_dapm_widgets, - ARRAY_SIZE(msm_ext_dapm_widgets)); - - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - - snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_2 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_4 amp"); - - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_1 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_2 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_3 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_4 amp"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic6"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic7"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic8"); - - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC0"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT2"); - - snd_soc_dapm_sync(dapm); - - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); - - msm_codec_fn.get_afe_config_fn = tasha_get_afe_config; - - ret = msm_afe_set_config(codec); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err; - } - pdata->is_afe_config_done = true; - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err; - } - } - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - aux_comp = list_first_entry(&rtd->card->aux_comp_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tasha_set_spkr_mode(rtd->codec, SPKR_MODE_1); - tasha_set_spkr_gain_offset(rtd->codec, - RX_GAIN_OFFSET_M1P5_DB); - } - } - - card = rtd->card->snd_card; - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - tasha_codec_info_create_codec_entry(pdata->codec_root, codec); - - codec_reg_done = true; - return 0; -err: - return ret; -} - -static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - 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); - - ret = snd_soc_add_codec_controls(codec, msm_int_snd_controls, - ARRAY_SIZE(msm_int_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed: %d\n", - __func__, ret); - return ret; - } - ret = snd_soc_add_codec_controls(codec, msm_common_snd_controls, - ARRAY_SIZE(msm_common_snd_controls)); - if (ret < 0) { - pr_err("%s: add common snd controls failed: %d\n", - __func__, ret); - return ret; - } - - snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets, - ARRAY_SIZE(msm_int_dapm_widgets)); - - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "WSA AIF VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA"); - - snd_soc_dapm_sync(dapm); - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - dev_dbg(codec->dev, "%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->aux_comp_list)) { - list_for_each_entry(aux_comp, &rtd->card->aux_comp_list, - card_aux_list) { - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - wsa_macro_set_spkr_mode(rtd->codec, - WSA_MACRO_SPKR_MODE_1); - wsa_macro_set_spkr_gain_offset(rtd->codec, - WSA_MACRO_GAIN_OFFSET_M1P5_DB); - break; - } - } - } - card = rtd->card->snd_card; - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - bolero_info_create_codec_entry(pdata->codec_root, codec); - /* - * SM6150 MSM 1.0 doesn't have hardware wake up interrupt line - * from AOSS to APSS. So, it uses SW workaround and listens to - * interrupt from AFE over IPC. - * Check for MSM version and MSM ID and register wake irq - * accordingly to provide compatibility to all chipsets. - */ - if (socinfo_get_id() == SM6150_SOC_MSM_ID && - socinfo_get_version() == SM6150_SOC_VERSION_1_0) - bolero_register_wake_irq(codec, true); - else - bolero_register_wake_irq(codec, false); - - codec_reg_done = true; - return 0; -err: - return ret; -} - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static void *def_wcd_mbhc_cal(void) -{ - void *wcd_mbhc_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!wcd_mbhc_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->X) = (Y)) - S(v_hs_max, 1600); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 150; - btn_high[2] = 237; - btn_high[3] = 500; - btn_high[4] = 500; - btn_high[5] = 500; - btn_high[6] = 500; - btn_high[7] = 500; - - return wcd_mbhc_cal; -} - -static int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 rx_ch_count; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) { - pr_debug("%s: rx_5_ch=%d\n", __func__, - slim_rx_cfg[5].channels); - rx_ch_count = slim_rx_cfg[5].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) { - pr_debug("%s: rx_2_ch=%d\n", __func__, - slim_rx_cfg[2].channels); - rx_ch_count = slim_rx_cfg[2].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) { - pr_debug("%s: rx_6_ch=%d\n", __func__, - slim_rx_cfg[6].channels); - rx_ch_count = slim_rx_cfg[6].channels; - } else { - pr_debug("%s: rx_0_ch=%d\n", __func__, - slim_rx_cfg[0].channels); - rx_ch_count = slim_rx_cfg[0].channels; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - rx_ch_count, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - - pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__, - codec_dai->name, codec_dai->id, user_set_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get tx codec chan map, err:%d\n", - __func__, ret); - goto err; - } - /* For _tx1 case */ - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX) - user_set_tx_ch = slim_tx_cfg[0].channels; - /* For _tx3 case */ - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX) - user_set_tx_ch = slim_tx_cfg[1].channels; - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX) - user_set_tx_ch = msm_vi_feed_tx_ch; - else - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), BE id (%d)\n", - __func__, slim_tx_cfg[0].channels, user_set_tx_ch, - tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set tx cpu chan map, err:%d\n", - __func__, ret); - } - -err: - return ret; -} - - -static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch_cdc_dma, tx_ch_cdc_dma; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 user_set_rx_ch = 0; - u32 ch_id; - - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, &tx_ch_cdc_dma, &rx_ch_cnt, - &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_4: - case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d rx_ch=%d\n", __func__, - ch_id, cdc_dma_rx_cfg[ch_id].channels); - user_set_rx_ch = cdc_dma_rx_cfg[ch_id].channels; - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - user_set_rx_ch, &rx_ch_cdc_dma); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - - } - break; - } - } else { - switch (dai_link->id) { - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0: - { - user_set_tx_ch = msm_vi_feed_tx_ch; - } - break; - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1: - case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3: - case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4: - { - ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id); - pr_debug("%s: id %d tx_ch=%d\n", __func__, - ch_id, cdc_dma_tx_cfg[ch_id].channels); - user_set_tx_ch = cdc_dma_tx_cfg[ch_id].channels; - } - break; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, user_set_tx_ch, - &tx_ch_cdc_dma, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_slimbus_2_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0; - unsigned int num_tx_ch = 0; - unsigned int num_rx_ch = 0; - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - num_rx_ch = params_channels(params); - pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_rx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - num_rx_ch, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - num_tx_ch = params_channels(params); - pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get tx codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, - num_tx_ch, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set tx cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -err: - return ret; -} - -int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - int ret = 0; - u32 tx_ch[SLIM_MAX_TX_PORTS]; - u32 tx_ch_cnt = 0; - - if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) { - pr_err("%s: Invalid stream type %d\n", - __func__, substream->stream); - ret = -EINVAL; - goto end; - } - - pr_debug("%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, NULL, NULL); - if (ret < 0) { - pr_err("%s: failed to get codec chan map\n, err:%d\n", - __func__, ret); - goto end; - } - - pr_debug("%s: tx_ch_cnt(%d) id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto end; - } -end: - return ret; -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - -err: - return ret; -} - -static int sm6150_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int slot_width = 32; - int channels, slots; - unsigned int slot_mask, rate, clk_freq; - unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28}; - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - switch (cpu_dai->id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - slots = tdm_rx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - slots = tdm_rx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - slots = tdm_rx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - slots = tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - break; - case AFE_PORT_ID_PRIMARY_TDM_TX: - slots = tdm_tx_cfg[TDM_PRI][TDM_0].channels; - break; - case AFE_PORT_ID_SECONDARY_TDM_TX: - slots = tdm_tx_cfg[TDM_SEC][TDM_0].channels; - break; - case AFE_PORT_ID_TERTIARY_TDM_TX: - slots = tdm_tx_cfg[TDM_TERT][TDM_0].channels; - break; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - slots = tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - break; - case AFE_PORT_ID_QUINARY_TDM_TX: - slots = tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - break; - - default: - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - channels = slots; - - pr_debug("%s: tdm rx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm rx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set tdm rx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - channels = slots; - - pr_debug("%s: tdm tx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm tx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - channels, slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set tdm tx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - -end: - return ret; -} - -static int msm_get_tdm_mode(u32 port_id) -{ - int tdm_mode; - - switch (port_id) { - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - tdm_mode = TDM_PRI; - break; - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - tdm_mode = TDM_SEC; - break; - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - tdm_mode = TDM_TERT; - break; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - tdm_mode = TDM_QUAT; - break; - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - tdm_mode = TDM_QUIN; - break; - default: - pr_err("%s: Invalid port id: %d\n", __func__, port_id); - tdm_mode = -EINVAL; - } - return tdm_mode; -} - -static int sm6150_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode < 0) { - dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__); - return tdm_mode; - } - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if (pdata->mi2s_gpio_p[tdm_mode]) - ret = msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[tdm_mode]); - - return ret; -} - -static void sm6150_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - int tdm_mode = msm_get_tdm_mode(cpu_dai->id); - - if (tdm_mode < 0) { - dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__); - return; - } - - /* currently only supporting TDM_RX_0 and TDM_TX_0 */ - if (pdata->mi2s_gpio_p[tdm_mode]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[tdm_mode]); -} - -static struct snd_soc_ops sm6150_tdm_be_ops = { - .hw_params = sm6150_tdm_snd_hw_params, - .startup = sm6150_tdm_snd_startup, - .shutdown = sm6150_tdm_snd_shutdown -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - int port_id = msm_get_port_id(rtd->dai_link->id); - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - /* - * Mutex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - if (mi2s_intf_conf[index].msm_is_ext_mclk) { - pr_debug("%s: Enabling mclk, clk_freq_in_hz = %u\n", - __func__, mi2s_mclk[index].clk_freq_in_hz); - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_mclk[index]); - if (ret < 0) { - pr_err("%s: afe lpass mclk failed, err:%d\n", - __func__, ret); - goto clk_off; - } - mi2s_mclk[index].enable = 1; - } - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_active_state( - pdata->mi2s_gpio_p[index]); - } -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -err: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - int port_id = msm_get_port_id(rtd->dai_link->id); - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - return; - } - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_sleep_state( - pdata->mi2s_gpio_p[index]); - - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - - if (mi2s_intf_conf[index].msm_is_ext_mclk) { - pr_debug("%s: Disabling mclk, clk_freq_in_hz = %u\n", - __func__, mi2s_mclk[index].clk_freq_in_hz); - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_mclk[index]); - if (ret < 0) - pr_err("%s: mclk disable failed for MCLK (%d); ret=%d\n", - __func__, index, ret); - mi2s_mclk[index].enable = 0; - } - } - mutex_unlock(&mi2s_intf_conf[index].lock); -} - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -static struct snd_soc_ops msm_cdc_dma_be_ops = { - .hw_params = msm_snd_cdc_dma_hw_params, -}; - -static struct snd_soc_ops msm_be_ops = { - .hw_params = msm_snd_hw_params, -}; - -static struct snd_soc_ops msm_slimbus_2_be_ops = { - .hw_params = msm_slimbus_2_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - -static struct snd_soc_ops msm_ext_cpe_ops = { - .hw_params = msm_snd_cpe_hw_params, -}; - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - {/* hw:x,0 */ - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - {/* hw:x,1 */ - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - {/* hw:x,2 */ - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - {/* hw:x,3 */ - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - {/* hw:x,4 */ - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - {/* hw:x,5 */ - .name = "SLIMBUS_0 Hostless", - .stream_name = "SLIMBUS_0 Hostless", - .cpu_dai_name = "SLIMBUS0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,6 */ - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - {/* hw:x,7 */ - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - {/* hw:x,8 */ - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - {/* hw:x,9 */ - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,10 */ - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,11 */ - .name = "SLIMBUS_3 Hostless", - .stream_name = "SLIMBUS_3 Hostless", - .cpu_dai_name = "SLIMBUS3_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,12 */ - .name = "SLIMBUS_7 Hostless", - .stream_name = "SLIMBUS_7 Hostless", - .cpu_dai_name = "SLIMBUS7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,13 */ - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - {/* hw:x,14 */ - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - {/* hw:x,15 */ - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - {/* hw:x,16 */ - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - {/* hw:x,17 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - /* HDMI Hostless */ - {/* hw:x,18 */ - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,19 */ - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - {/* hw:x,20 */ - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - {/* hw:x,21 */ - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - {/* hw:x,22 */ - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - {/* hw:x,23 */ - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - {/* hw:x,24 */ - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - {/* hw:x,25 */ - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - {/* hw:x,26 */ - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - {/* hw:x,27 */ - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - {/* hw:x,28 */ - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - {/* hw:x,29 */ - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - {/* hw:x,30 */ - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - {/* hw:x,31 */ - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - {/* hw:x,32 */ - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - {/* hw:x,33 */ - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - }, - {/* hw:x,34 */ - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,35 */ - .name = "CDC_DMA Hostless", - .stream_name = "CDC_DMA Hostless", - .cpu_dai_name = "CDC_DMA_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - {/* hw:x,36 */ - .name = "TX3_CDC_DMA Hostless", - .stream_name = "TX3_CDC_DMA Hostless", - .cpu_dai_name = "TX3_CDC_DMA_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = { - {/* hw:x,37 */ - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - {/* hw:x,38 */ - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - {/* hw:x,39 */ - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_int_compress_capture_dai[] = { - { - .name = "Compress9", - .stream_name = "Compress9", - .cpu_dai_name = "MultiMedia17", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA17, - }, - { - .name = "Compress10", - .stream_name = "Compress10", - .cpu_dai_name = "MultiMedia18", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA18, - }, - { - .name = "Compress11", - .stream_name = "Compress11", - .cpu_dai_name = "MultiMedia19", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA19, - }, - { - .name = "Compress12", - .stream_name = "Compress12", - .cpu_dai_name = "MultiMedia28", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA28, - }, - { - .name = "Compress13", - .stream_name = "Compress13", - .cpu_dai_name = "MultiMedia29", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA29, - }, -}; - -static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = { - {/* hw:x,37 */ - .name = LPASS_BE_WSA_CDC_DMA_TX_0, - .stream_name = "WSA CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45057", - .platform_name = "msm-pcm-hostless", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_vifeedback", - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_tasha_fe_dai_links[] = { - /* tasha_vifeedback for speaker protection */ - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx2", - .ignore_suspend = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx2", - .ignore_suspend = 1, - .dpcm_capture = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* CPE LSM direct dai-link */ - { - .name = "CPE Listen service", - .stream_name = "CPE Listen Audio Service", - .cpu_dai_name = "msm-dai-slim", - .platform_name = "msm-cpe-lsm", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .dpcm_capture = 1, - .codec_dai_name = "tasha_mad1", - .codec_name = "tasha_codec", - .ops = &msm_ext_cpe_ops, - }, - { - .name = "SLIMBUS_6 Hostless Playback", - .stream_name = "SLIMBUS_6 Hostless", - .cpu_dai_name = "SLIMBUS6_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - /* CPE LSM EC PP direct dai-link */ - { - .name = "CPE Listen service ECPP", - .stream_name = "CPE Listen Audio Service ECPP", - .cpu_dai_name = "CPE_LSM_NOHOST", - .platform_name = "msm-cpe-lsm.3", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "tasha_cpe", - .codec_name = "tasha_codec", - }, -}; - -static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { - { - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Proxy Tx BACK END DAI Link */ - { - .name = LPASS_BE_PROXY_TX, - .stream_name = "Proxy Capture", - .cpu_dai_name = "msm-dai-q6-dev.8195", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PROXY_TX, - .ignore_suspend = 1, - }, - /* Proxy Rx BACK END DAI Link */ - { - .name = LPASS_BE_PROXY_RX, - .stream_name = "Proxy Playback", - .cpu_dai_name = "msm-dai-q6-dev.8194", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PROXY_RX, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_RX_0, - .stream_name = "Quinary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36928", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_TDM_TX_0, - .stream_name = "Quinary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36929", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm6150_tdm_be_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_tavil_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_tavil_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - }, -}; - -static struct snd_soc_dai_link msm_tasha_be_dai_links[] = { - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_tasha_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mix_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tasha_codec", - .codec_dai_name = "tasha_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - -}; - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = { - /* WSA CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_WSA_CDC_DMA_RX_0, - .stream_name = "WSA CDC DMA0 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45056", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .init = &msm_int_audrx_init, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_RX_1, - .stream_name = "WSA CDC DMA1 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45058", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_rx_mix", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_WSA_CDC_DMA_TX_1, - .stream_name = "WSA CDC DMA1 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45059", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "wsa_macro_echo", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_rx_tx_cdc_dma_be_dai_links[] = { - /* RX CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_RX_CDC_DMA_RX_0, - .stream_name = "RX CDC DMA0 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45104", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_1, - .stream_name = "RX CDC DMA1 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45106", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_2, - .stream_name = "RX CDC DMA2 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45108", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_2, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_RX_CDC_DMA_RX_3, - .stream_name = "RX CDC DMA3 Playback", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45110", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_3, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - /* TX CDC DMA Backend DAI Links */ - { - .name = LPASS_BE_TX_CDC_DMA_TX_0, - .stream_name = "TX CDC DMA0 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45105", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "rx_macro_echo", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_TX_CDC_DMA_TX_3, - .stream_name = "TX CDC DMA3 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45111", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "tx_macro_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, - { - .name = LPASS_BE_TX_CDC_DMA_TX_4, - .stream_name = "TX CDC DMA4 Capture", - .cpu_dai_name = "msm-dai-cdc-dma-dev.45113", - .platform_name = "msm-pcm-routing", - .codec_name = "bolero_codec", - .codec_dai_name = "tx_macro_tx2", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_4, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_cdc_dma_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_sm6150_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_tavil_fe_dai_links) + - ARRAY_SIZE(msm_bolero_fe_dai_links) + - ARRAY_SIZE(msm_tasha_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_int_compress_capture_dai) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_tavil_be_dai_links) + - ARRAY_SIZE(msm_tasha_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links) + - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) + - ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links)]; - -static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tavil_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - return ret; -} - -static int msm_snd_card_tasha_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tasha_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - return ret; -} - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - pr_err("%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - - ret = snd_soc_add_codec_controls(codec, msm_ext_snd_controls, - ARRAY_SIZE(msm_ext_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, - "%s: add_codec_controls failed, err = %d\n", - __func__, ret); - return ret; - } - - return 0; -} - -static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - - int ret = 0; - unsigned int rx_ch[] = {144, 145, 146, 147, 148, 149, 150, - 151}; - unsigned int tx_ch[] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - slim_rx_cfg[SLIM_RX_0].channels, - rx_ch); - if (ret < 0) - pr_err("%s: RX failed to set cpu chan map error %d\n", - __func__, ret); - } else { - ret = snd_soc_dai_set_channel_map(cpu_dai, - slim_tx_cfg[SLIM_TX_0].channels, - tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: TX failed to set cpu chan map error %d\n", - __func__, ret); - } - - return ret; -} - -static struct snd_soc_ops msm_stub_be_ops = { - .hw_params = msm_snd_stub_hw_params, -}; - -static struct snd_soc_dai_link msm_stub_fe_dai_links[] = { - - /* FrontEnd DAI Links */ - { - .name = "MSMSTUB Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, -}; - -static struct snd_soc_dai_link msm_stub_be_dai_links[] = { - - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_stub_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_stub_dai_links[ - ARRAY_SIZE(msm_stub_fe_dai_links) + - ARRAY_SIZE(msm_stub_be_dai_links)]; - -struct snd_soc_card snd_soc_card_stub_msm = { - .name = "sm6150-stub-snd-card", -}; - -static const struct of_device_id sm6150_asoc_machine_of_match[] = { - { .compatible = "qcom,sm6150-asoc-snd", - .data = "codec"}, - { .compatible = "qcom,sm6150-asoc-snd-stub", - .data = "stub_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int total_links = 0, rc = 0; - u32 tavil_codec = 0, auxpcm_audio_intf = 0; - u32 mi2s_audio_intf = 0, ext_disp_audio_intf = 0; - u32 wcn_btfm_intf = 0; - const struct of_device_id *match; - u32 tasha_codec = 0; - - match = of_match_node(sm6150_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "codec")) { - card = &snd_soc_card_sm6150_msm; - memcpy(msm_sm6150_dai_links + total_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - - total_links += ARRAY_SIZE(msm_common_dai_links); - - memcpy(msm_sm6150_dai_links + total_links, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - - total_links += ARRAY_SIZE(msm_common_misc_fe_dai_links); - - rc = of_property_read_u32(dev->of_node, "qcom,tavil_codec", - &tavil_codec); - if (rc) - dev_dbg(dev, "%s: No DT match for tavil codec\n", - __func__); - - rc = of_property_read_u32(dev->of_node, "qcom,tasha_codec", - &tasha_codec); - if (rc) - dev_dbg(dev, "%s: No DT match for tasha codec\n", - __func__); - - if (tavil_codec) { - card->late_probe = - msm_snd_card_tavil_late_probe; - memcpy(msm_sm6150_dai_links + total_links, - msm_tavil_fe_dai_links, - sizeof(msm_tavil_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_tavil_fe_dai_links); - } else if (tasha_codec) { - card->late_probe = - msm_snd_card_tasha_late_probe; - memcpy(msm_sm6150_dai_links + total_links, - msm_tasha_fe_dai_links, - sizeof(msm_tasha_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_tasha_fe_dai_links); - } else { - memcpy(msm_sm6150_dai_links + total_links, - msm_bolero_fe_dai_links, - sizeof(msm_bolero_fe_dai_links)); - total_links += - ARRAY_SIZE(msm_bolero_fe_dai_links); - } - - memcpy(msm_sm6150_dai_links + total_links, - msm_int_compress_capture_dai, - sizeof(msm_int_compress_capture_dai)); - - total_links += ARRAY_SIZE(msm_int_compress_capture_dai); - - memcpy(msm_sm6150_dai_links + total_links, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - - total_links += ARRAY_SIZE(msm_common_be_dai_links); - - if (tavil_codec) { - memcpy(msm_sm6150_dai_links + total_links, - msm_tavil_be_dai_links, - sizeof(msm_tavil_be_dai_links)); - total_links += ARRAY_SIZE(msm_tavil_be_dai_links); - } else if (tasha_codec) { - memcpy(msm_sm6150_dai_links + total_links, - msm_tasha_be_dai_links, - sizeof(msm_tasha_be_dai_links)); - total_links += ARRAY_SIZE(msm_tasha_be_dai_links); - } else { - memcpy(msm_sm6150_dai_links + total_links, - msm_wsa_cdc_dma_be_dai_links, - sizeof(msm_wsa_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links); - - memcpy(msm_sm6150_dai_links + total_links, - msm_rx_tx_cdc_dma_be_dai_links, - sizeof(msm_rx_tx_cdc_dma_be_dai_links)); - total_links += - ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links); - } - - rc = of_property_read_u32(dev->of_node, - "qcom,ext-disp-audio-rx", - &ext_disp_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match Ext Disp interface\n", - __func__); - } else { - if (ext_disp_audio_intf) { - memcpy(msm_sm6150_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += - ARRAY_SIZE(ext_disp_be_dai_link); - } - } - - rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf", - &mi2s_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match MI2S audio interface\n", - __func__); - } else { - if (mi2s_audio_intf) { - memcpy(msm_sm6150_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += - ARRAY_SIZE(msm_mi2s_be_dai_links); - } - } - - - rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", - &wcn_btfm_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match wcn btfm interface\n", - __func__); - } else { - if (wcn_btfm_intf) { - memcpy(msm_sm6150_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += - ARRAY_SIZE(msm_wcn_be_dai_links); - } - } - - rc = of_property_read_u32(dev->of_node, - "qcom,auxpcm-audio-intf", - &auxpcm_audio_intf); - if (rc) { - dev_dbg(dev, "%s: No DT match Aux PCM interface\n", - __func__); - } else { - if (auxpcm_audio_intf) { - memcpy(msm_sm6150_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += - ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - } - - dailink = msm_sm6150_dai_links; - } else if (!strcmp(match->data, "stub_codec")) { - card = &snd_soc_card_stub_msm; - - memcpy(msm_stub_dai_links + total_links, - msm_stub_fe_dai_links, - sizeof(msm_stub_fe_dai_links)); - total_links += ARRAY_SIZE(msm_stub_fe_dai_links); - - memcpy(msm_stub_dai_links + total_links, - msm_stub_be_dai_links, - sizeof(msm_stub_be_dai_links)); - total_links += ARRAY_SIZE(msm_stub_be_dai_links); - - dailink = msm_stub_dai_links; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -static int msm_wsa881x_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, - SPKR_L_BOOST, SPKR_L_VI}; - u8 spkright_port_types[WSA881X_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}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm; - struct snd_card *card = component->card->snd_card; - struct snd_info_entry *entry; - int ret = 0; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - dapm = snd_soc_codec_get_dapm(codec); - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkleft_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], &spkright_port_types[0]); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - ret = -EINVAL; - goto err; - } - pdata = snd_soc_card_get_drvdata(component->card); - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_err("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto err; - } - pdata->codec_root = entry; - } - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); -err: - return ret; -} - -static int msm_aux_codec_init(struct snd_soc_component *component) -{ - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int ret = 0; - void *mbhc_calibration; - struct snd_info_entry *entry; - struct snd_card *card = component->card->snd_card; - struct msm_asoc_mach_data *pdata; - - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "AUX"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_sync(dapm); - - pdata = snd_soc_card_get_drvdata(component->card); - if (!pdata->codec_root) { - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_err("%s: Cannot create codecs module entry\n", - __func__); - ret = 0; - goto codec_root_err; - } - pdata->codec_root = entry; - } - wcd937x_info_create_codec_entry(pdata->codec_root, codec); -codec_root_err: - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) { - return -ENOMEM; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = wcd937x_mbhc_hs_detect(codec, &wcd_mbhc_cfg); - - return ret; -} - -static int msm_init_aux_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - struct device_node *aux_codec_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - u32 codec_max_aux_devs = 0; - u32 codec_aux_dev_cnt = 0; - int i; - struct msm_wsa881x_dev_info *wsa881x_dev_info = NULL; - struct aux_codec_dev_info *aux_cdc_dev_info = NULL; - const char *auxdev_name_prefix[1]; - char *dev_name_str = NULL; - int found = 0; - int codecs_found = 0; - int ret = 0; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_err(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - wsa_max_devs = 0; - goto codec_aux_dev; - } - if (wsa_max_devs == 0) { - dev_dbg(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - goto codec_aux_dev; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err; - } - if (soc_find_component_locked(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - -codec_aux_dev: - if (!strnstr(card->name, "tavil", strlen(card->name)) && - !strnstr(card->name, "tasha", strlen(card->name))) { - /* Get maximum aux codec device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,codec-max-aux-devs", - &codec_max_aux_devs); - if (ret) { - dev_err(&pdev->dev, - "%s: codec-max-aux-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - codec_max_aux_devs = 0; - goto aux_dev_register; - } - if (codec_max_aux_devs == 0) { - dev_dbg(&pdev->dev, - "%s: Max aux codec devices is 0 for this target?\n", - __func__); - goto aux_dev_register; - } - - /* Get count of aux codec device phandles for this platform */ - codec_aux_dev_cnt = of_count_phandle_with_args( - pdev->dev.of_node, - "qcom,codec-aux-devs", NULL); - if (codec_aux_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No aux codec defined in DT.\n", - __func__); - goto err; - } else if (codec_aux_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading aux codec device from DT, dev_cnt=%d\n", - __func__, codec_aux_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * AUX device count. However, if it is less, then assign same value to - * max count as well. - */ - if (codec_aux_dev_cnt < codec_max_aux_devs) { - dev_dbg(&pdev->dev, - "%s: codec_max_aux_devs = %d cannot exceed codec_aux_dev_cnt = %d\n", - __func__, codec_max_aux_devs, - codec_aux_dev_cnt); - codec_max_aux_devs = codec_aux_dev_cnt; - } - - /* - * Alloc mem to store phandle and index info of aux codec - * if already registered with ALSA core - */ - aux_cdc_dev_info = devm_kcalloc(&pdev->dev, codec_max_aux_devs, - sizeof(struct aux_codec_dev_info), - GFP_KERNEL); - if (!aux_cdc_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all aux codecs are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < codec_aux_dev_cnt; i++) { - aux_codec_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,codec-aux-devs", i); - if (unlikely(!aux_codec_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: aux codec dev node is not present\n", - __func__); - ret = -EINVAL; - goto err; - } - if (soc_find_component_locked(aux_codec_of_node, NULL)) { - /* AUX codec registered with ALSA core */ - aux_cdc_dev_info[codecs_found].of_node = - aux_codec_of_node; - aux_cdc_dev_info[codecs_found].index = i; - codecs_found++; - } - } - - if (codecs_found < codec_max_aux_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, codec_max_aux_devs, codecs_found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d AUX codecs registered with ALSA core\n", - __func__, codecs_found); - - } - -aux_dev_register: - card->num_aux_devs = wsa_max_devs + codec_max_aux_devs; - card->num_configs = wsa_max_devs + codec_max_aux_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_configs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err; - } - - for (i = 0; i < wsa_max_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_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; - } - - for (i = 0; i < codec_aux_dev_cnt; i++) { - msm_aux_dev[wsa_max_devs + i].name = "aux_codec"; - msm_aux_dev[wsa_max_devs + i].codec_name = NULL; - msm_aux_dev[wsa_max_devs + i].codec_of_node = - aux_cdc_dev_info[i].of_node; - msm_aux_dev[wsa_max_devs + i].init = msm_aux_codec_init; - msm_codec_conf[wsa_max_devs + i].dev_name = NULL; - msm_codec_conf[wsa_max_devs + i].name_prefix = - NULL; - msm_codec_conf[wsa_max_devs + i].of_node = - aux_cdc_dev_info[i].of_node; - } - - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; -err: - return ret; -} - -static void msm_i2s_auxpcm_init(struct platform_device *pdev) -{ - int count; - u32 mi2s_master_slave[MI2S_MAX]; - u32 mi2s_ext_mclk[MI2S_MAX]; - int ret; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-ext-mclk", - mi2s_ext_mclk, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-ext-mclk in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) - mi2s_intf_conf[count].msm_is_ext_mclk = - mi2s_ext_mclk[count]; - } -} - -static void msm_i2s_auxpcm_deinit(void) -{ - int count; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_destroy(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - mi2s_intf_conf[count].msm_is_mi2s_master = 0; - mi2s_intf_conf[count].msm_is_ext_mclk = 0; - } -} - -static int sm6150_ssr_enable(struct device *dev, void *data) -{ - struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata; - int ret = 0; - - if (!card) { - dev_err(dev, "%s: card is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - if (strnstr(card->name, "tavil", strlen(card->name)) || - strnstr(card->name, "tasha", strlen(card->name))) { - pdata = snd_soc_card_get_drvdata(card); - if (!pdata->is_afe_config_done) { - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err; - } - ret = msm_afe_set_config(rtd->codec); - if (ret) - dev_err(dev, "%s: Failed to set AFE config. err %d\n", - __func__, ret); - else - pdata->is_afe_config_done = true; - } - } - snd_soc_card_change_online_state(card, 1); - dev_dbg(dev, "%s: setting snd_card to ONLINE\n", __func__); - -err: - return ret; -} - -static void sm6150_ssr_disable(struct device *dev, void *data) -{ - struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata; - - if (!card) { - dev_err(dev, "%s: card is NULL\n", __func__); - return; - } - - dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__); - snd_soc_card_change_online_state(card, 0); - - if (strnstr(card->name, "tavil", strlen(card->name)) || - strnstr(card->name, "tasha", strlen(card->name))) { - pdata = snd_soc_card_get_drvdata(card); - msm_afe_clear_config(); - pdata->is_afe_config_done = false; - } -} - -static int msm_ext_prepare_hifi(struct msm_asoc_mach_data *pdata) -{ - int ret = 0; - - if (gpio_is_valid(pdata->hph_en1_gpio)) { - pr_debug("%s: hph_en1_gpio request %d\n", __func__, - pdata->hph_en1_gpio); - ret = gpio_request(pdata->hph_en1_gpio, "hph_en1_gpio"); - if (ret) { - pr_err("%s: hph_en1_gpio request failed, ret:%d\n", - __func__, ret); - goto err; - } - } - if (gpio_is_valid(pdata->hph_en0_gpio)) { - pr_debug("%s: hph_en0_gpio request %d\n", __func__, - pdata->hph_en0_gpio); - ret = gpio_request(pdata->hph_en0_gpio, "hph_en0_gpio"); - if (ret) - pr_err("%s: hph_en0_gpio request failed, ret:%d\n", - __func__, ret); - } - -err: - return ret; -} - -static const struct snd_event_ops sm6150_ssr_ops = { - .enable = sm6150_ssr_enable, - .disable = sm6150_ssr_disable, -}; - -static int msm_audio_ssr_compare(struct device *dev, void *data) -{ - struct device_node *node = data; - - dev_dbg(dev, "%s: dev->of_node = 0x%p, node = 0x%p\n", - __func__, dev->of_node, node); - return (dev->of_node && dev->of_node == node); -} - -static int msm_audio_ssr_register(struct device *dev) -{ - struct device_node *np = dev->of_node; - struct snd_event_clients *ssr_clients = NULL; - struct device_node *node; - int ret; - int i; - - for (i = 0; ; i++) { - node = of_parse_phandle(np, "qcom,msm_audio_ssr_devs", i); - if (!node) - break; - snd_event_mstr_add_client(&ssr_clients, - msm_audio_ssr_compare, node); - } - - ret = snd_event_master_register(dev, &sm6150_ssr_ops, - ssr_clients, NULL); - if (!ret) - snd_event_notify(dev, SND_EVENT_UP); - - return ret; -} - -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - const char *mbhc_audio_jack_type = NULL; - int ret; - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "No platform supplied from device tree\n"); - return -EINVAL; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "parse card name failed, err:%d\n", - ret); - goto err; - } - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) { - dev_err(&pdev->dev, "parse audio routing failed, err:%d\n", - ret); - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - ret = -EPROBE_DEFER; - goto err; - } - - ret = msm_init_aux_dev(pdev, card); - if (ret) - goto err; - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) - ret = -EINVAL; - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - dev_info(&pdev->dev, "Sound card %s registered\n", card->name); - - pdata->hph_en1_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!gpio_is_valid(pdata->hph_en1_gpio)) - pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!gpio_is_valid(pdata->hph_en1_gpio) && (!pdata->hph_en1_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en1-gpio", pdev->dev.of_node->full_name); - } - - pdata->hph_en0_gpio = of_get_named_gpio(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!gpio_is_valid(pdata->hph_en0_gpio)) - pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!gpio_is_valid(pdata->hph_en0_gpio) && (!pdata->hph_en0_gpio_p)) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,hph-en0-gpio", pdev->dev.of_node->full_name); - } - - ret = msm_ext_prepare_hifi(pdata); - if (ret) { - dev_dbg(&pdev->dev, "msm_ext_prepare_hifi failed (%d)\n", - ret); - ret = 0; - } - - ret = of_property_read_string(pdev->dev.of_node, - "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type); - if (ret) { - dev_dbg(&pdev->dev, "Looking up %s property in node %s failed\n", - "qcom,mbhc-audio-jack-type", - pdev->dev.of_node->full_name); - dev_dbg(&pdev->dev, "Jack type properties set to default\n"); - ret = 0; - } else { - if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "This hardware has 4 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 5 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 6 pole jack"); - } else { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "Unknown value, set to default\n"); - } - } - - pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,pri-mi2s-gpios", 0); - pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,sec-mi2s-gpios", 0); - pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,tert-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quat-mi2s-gpios", 0); - pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node, - "qcom,quin-mi2s-gpios", 0); - - /* - * Parse US-Euro gpio info from DT. Report no error if us-euro - * entry is not found in DT file as some targets do not support - * US-Euro detection - */ - pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!pdata->us_euro_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,us-euro-gpios", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "%s detected\n", - "qcom,us-euro-gpios"); - wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - } - - if (wcd_mbhc_cfg.enable_usbc_analog) { - wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic; - - pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node, - "fsa4480-i2c-handle", 0); - if (!pdata->fsa_handle) - dev_err(&pdev->dev, - "property %s not detected in node %s\n", - "fsa4480-i2c-handle", - pdev->dev.of_node->full_name); - } - - msm_i2s_auxpcm_init(pdev); - if (!strnstr(card->name, "tavil", strlen(card->name)) && - !strnstr(card->name, "tasha", strlen(card->name))) { - pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic01-gpios", - 0); - pdata->dmic23_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,cdc-dmic23-gpios", - 0); - } - - ret = msm_audio_ssr_register(&pdev->dev); - if (ret) - pr_err("%s: Registration with SND event FWK failed ret = %d\n", - __func__, ret); - -err: - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - snd_event_master_deregister(&pdev->dev); - msm_i2s_auxpcm_deinit(); - - return 0; -} - -static struct platform_driver sm6150_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = sm6150_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; -module_platform_driver(sm6150_asoc_machine_driver); - -MODULE_DESCRIPTION("ALSA SoC SM6150 Machine driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, sm6150_asoc_machine_of_match); diff --git a/techpack/audio/asoc/sm8150.c b/techpack/audio/asoc/sm8150.c deleted file mode 100644 index 84d8458f0301..000000000000 --- a/techpack/audio/asoc/sm8150.c +++ /dev/null @@ -1,8332 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "device_event.h" -#include "msm-pcm-routing-v2.h" -#include "codecs/msm-cdc-pinctrl.h" -#include "codecs/wcd934x/wcd934x.h" -#include "codecs/wcd934x/wcd934x-mbhc.h" -#include "codecs/wcd9360/wcd9360.h" -#include "codecs/wsa881x.h" -#include "codecs/wcd-mbhc-v2.h" -#include -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI -#include "codecs/tfa98xx/inc/tfa_platform_interface_definition.h" -#endif - -#define DRV_NAME "sm8150-asoc-snd" - -#define __CHIPSET__ "SM8150 " -#define MSM_DAILINK_NAME(name) (__CHIPSET__#name) - -#define DEV_NAME_STR_LEN 32 - -#define SAMPLING_RATE_8KHZ 8000 -#define SAMPLING_RATE_11P025KHZ 11025 -#define SAMPLING_RATE_16KHZ 16000 -#define SAMPLING_RATE_22P05KHZ 22050 -#define SAMPLING_RATE_32KHZ 32000 -#define SAMPLING_RATE_44P1KHZ 44100 -#define SAMPLING_RATE_48KHZ 48000 -#define SAMPLING_RATE_88P2KHZ 88200 -#define SAMPLING_RATE_96KHZ 96000 -#define SAMPLING_RATE_176P4KHZ 176400 -#define SAMPLING_RATE_192KHZ 192000 -#define SAMPLING_RATE_352P8KHZ 352800 -#define SAMPLING_RATE_384KHZ 384000 - -#define WCD9XXX_MBHC_DEF_RLOADS 5 - -#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 3 - -//#undef CONFIG_SND_SOC_TAS2557 -//#undef CONFIG_SND_SOC_CS35L41 -//#undef CONFIG_SND_SOC_TFA9874 - -#define CS35L41_CODEC_NAME "cs35l41.0-0040" -#if 0 -static atomic_t cs35l41_mclk_rsc_ref; -#endif - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 -#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */ -#define MSM_HIFI_ON 1 - -#define TDM_MAX_SLOTS 8 -#define TDM_SLOT_WIDTH_BITS 32 - -enum { - SLIM_RX_0 = 0, - SLIM_RX_1, - SLIM_RX_2, - SLIM_RX_3, - SLIM_RX_4, - SLIM_RX_5, - SLIM_RX_6, - SLIM_RX_7, - SLIM_RX_MAX, -}; -enum { - SLIM_TX_0 = 0, - SLIM_TX_1, - SLIM_TX_2, - SLIM_TX_3, - SLIM_TX_4, - SLIM_TX_5, - SLIM_TX_6, - SLIM_TX_7, - SLIM_TX_8, - SLIM_TX_MAX, -}; - -enum { - PRIM_MI2S = 0, - SEC_MI2S, - TERT_MI2S, - QUAT_MI2S, - QUIN_MI2S, - MI2S_MAX, -}; - -enum { - PRIM_AUX_PCM = 0, - SEC_AUX_PCM, - TERT_AUX_PCM, - QUAT_AUX_PCM, - QUIN_AUX_PCM, - AUX_PCM_MAX, -}; - -struct mi2s_conf { - struct mutex lock; - u32 ref_cnt; - u32 msm_is_mi2s_master; -}; - -static u32 mi2s_ebit_clk[MI2S_MAX] = { - Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT -}; - -struct dev_config { - u32 sample_rate; - u32 bit_format; - u32 channels; -}; - -struct tdm_dev_config { - unsigned int tdm_slot_offset[TDM_MAX_SLOTS]; -}; - -enum { - DP_RX_IDX = 0, - EXT_DISP_RX_IDX_MAX, -}; - -struct msm_wsa881x_dev_info { - struct device_node *of_node; - u32 index; -}; - -enum pinctrl_pin_state { - STATE_DISABLE = 0, /* All pins are in sleep state */ - STATE_MI2S_ACTIVE, /* IS2 = active, TDM = sleep */ - STATE_TDM_ACTIVE, /* IS2 = sleep, TDM = active */ -}; - -struct msm_pinctrl_info { - struct pinctrl *pinctrl; - struct pinctrl_state *mi2s_disable; - struct pinctrl_state *tdm_disable; - struct pinctrl_state *mi2s_active; - struct pinctrl_state *tdm_active; - enum pinctrl_pin_state curr_state; - atomic_t pinctrl_ref_count; -}; - -struct msm_asoc_mach_data { - struct snd_info_entry *codec_root; - struct msm_pinctrl_info pinctrl_info; - int usbc_en2_gpio; /* used by gpio driver API */ - struct device_node *us_euro_gpio_p; /* used by pinctrl API */ - struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ - struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ - struct device_node *fsa_handle; - struct device_node *adc2_sel_gpio_p; /* used by pinctrl API */ - struct snd_soc_codec *codec; - struct work_struct adsp_power_up_work; -}; - -struct msm_asoc_wcd93xx_codec { - void* (*get_afe_config_fn)(struct snd_soc_codec *codec, - enum afe_config_type config_type); -}; - -static const char *const pin_states[] = {"sleep", "i2s-active", - "tdm-active"}; - -enum { - TDM_0 = 0, - TDM_1, - TDM_2, - TDM_3, - TDM_4, - TDM_5, - TDM_6, - TDM_7, - TDM_PORT_MAX, -}; - -enum { - TDM_PRI = 0, - TDM_SEC, - TDM_TERT, - TDM_QUAT, - TDM_QUIN, - TDM_INTERFACE_MAX, -}; - -struct tdm_port { - u32 mode; - u32 channel; -}; - -/* TDM default config */ -static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */ - } - -}; - -/* TDM default config */ -static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { - { /* PRI TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* SEC TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* TERT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - }, - { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ - } - -}; - -/* Default configuration of slimbus channels */ -static struct dev_config slim_rx_cfg[] = { - [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config slim_tx_cfg[] = { - [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct tdm_dev_config tdm_cfg[TDM_INTERFACE_MAX * 2] - [TDM_PORT_MAX] = { - { /* PRI TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, - { /* SEC TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, - { /* TERT TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, - { /* QUAT TDM */ - { {0, 4, 0xFFFF} }, /* RX_0 */ - { {8, 12, 0xFFFF} }, /* RX_1 */ - { {16, 20, 0xFFFF} }, /* RX_2 */ - { {24, 28, 0xFFFF} }, /* RX_3 */ - { {0xFFFF} }, /* RX_4 */ - { {0xFFFF} }, /* RX_5 */ - { {0xFFFF} }, /* RX_6 */ - { {0xFFFF} }, /* RX_7 */ - }, - { - { {0, 4, 0xFFFF} }, /* TX_0 */ - { {8, 12, 0xFFFF} }, /* TX_1 */ - { {16, 20, 0xFFFF} }, /* TX_2 */ - { {24, 28, 0xFFFF} }, /* TX_3 */ - { {0xFFFF} }, /* TX_4 */ - { {0xFFFF} }, /* TX_5 */ - { {0xFFFF} }, /* TX_6 */ - { {0xFFFF} }, /* TX_7 */ - }, -}; - -/* Default configuration of external display BE */ -static struct dev_config ext_disp_rx_cfg[] = { - [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config usb_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -static struct dev_config usb_tx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 1, -}; - -static struct dev_config proxy_rx_cfg = { - .sample_rate = SAMPLING_RATE_48KHZ, - .bit_format = SNDRV_PCM_FORMAT_S16_LE, - .channels = 2, -}; - -/* Default configuration of MI2S channels */ -static struct dev_config mi2s_rx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -}; - -static struct dev_config mi2s_tx_cfg[] = { - [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, -#else - [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -#endif - [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_rx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; - -static struct dev_config aux_pcm_tx_cfg[] = { - [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, - [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, -}; -static int msm_vi_feed_tx_ch = 2; -static const char *const slim_rx_ch_text[] = {"One", "Two"}; -static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const vi_feed_ch_text[] = {"One", "Two"}; -static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", - "S32_LE"}; -static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE", - "S24_3LE"}; -static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", - "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96"}; -static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static char const *ch_text[] = {"Two", "Three", "Four", "Five", - "Six", "Seven", "Eight"}; -static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025", - "KHZ_16", "KHZ_22P05", - "KHZ_32", "KHZ_44P1", "KHZ_48", - "KHZ_88P2", "KHZ_96", "KHZ_176P4", - "KHZ_192", "KHZ_352P8", "KHZ_384"}; -static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96", - "KHZ_192", "KHZ_32", "KHZ_44P1", - "KHZ_88P2", "KHZ_176P4" }; -static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", "Eight"}; -static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"}; -static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", - "KHZ_48", "KHZ_176P4", - "KHZ_352P8"}; -static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"}; -static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16", - "KHZ_22P05", "KHZ_32", "KHZ_44P1", - "KHZ_48", "KHZ_96", "KHZ_192"}; -static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four", - "Five", "Six", "Seven", - "Eight"}; -static const char *const hifi_text[] = {"Off", "On"}; -static const char *const qos_text[] = {"Disable", "Enable"}; - -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); -static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate, - ext_disp_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); -static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text); - -static struct platform_device *spdev; - -static int msm_hifi_control; -static bool is_initial_boot; -static bool codec_reg_done; -static struct snd_soc_aux_dev *msm_aux_dev; -static struct snd_soc_codec_conf *msm_codec_conf; -static struct msm_asoc_wcd93xx_codec msm_codec_fn; - -static void *def_wcd_mbhc_cal(void); -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm); -static int msm_wsa881x_init(struct snd_soc_component *component); - -/* - * Need to report LINEIN - * if R/L channel impedance is larger than 5K ohm - */ -static struct wcd_mbhc_config wcd_mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .detect_extn_cable = true, - .mono_stero_detection = false, - .swap_gnd_mic = NULL, - .hs_ext_micbias = true, - .key_code[0] = KEY_MEDIA, - .key_code[1] = BTN_1, - .key_code[2] = BTN_2, - .key_code[3] = 0, - .key_code[4] = 0, - .key_code[5] = 0, - .key_code[6] = 0, - .key_code[7] = 0, - .linein_th = 5000, - .moisture_en = true, - .mbhc_micbias = MIC_BIAS_2, - .anc_micbias = MIC_BIAS_2, - .enable_anc_mic_detect = false, -}; - -static struct snd_soc_dapm_route wcd_audio_paths[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct snd_soc_dapm_route wcd_audio_paths_tavil[] = { - {"MIC BIAS1", NULL, "MCLK TX"}, - {"MIC BIAS2", NULL, "MCLK TX"}, - {"MIC BIAS3", NULL, "MCLK TX"}, - {"MIC BIAS4", NULL, "MCLK TX"}, -}; - -static struct afe_clk_set mi2s_clk[MI2S_MAX] = { - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - }, - { - AFE_API_VERSION_I2S_CONFIG, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, - Q6AFE_LPASS_CLK_ROOT_DEFAULT, - 0, - } - -}; - -static struct mi2s_conf mi2s_intf_conf[MI2S_MAX]; - -static int slim_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_384KHZ: - sample_rate_val = 10; - break; - default: - sample_rate_val = 4; - break; - } - return sample_rate_val; -} - -static int slim_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - sample_rate = SAMPLING_RATE_384KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int slim_get_bit_format_val(int bit_format) -{ - int val = 0; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - val = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - val = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - val = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - val = 0; - break; - } - return val; -} - -static int slim_get_bit_format(int val) -{ - int bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - - switch (val) { - case 0: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - bit_fmt = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - bit_fmt = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - bit_fmt = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - bit_fmt = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return bit_fmt; -} - -static int slim_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int port_id = 0; - - if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) { - port_id = SLIM_RX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_2_RX", sizeof("SLIM_2_RX"))) { - port_id = SLIM_RX_2; - } else if (strnstr(kcontrol->id.name, - "SLIM_5_RX", sizeof("SLIM_5_RX"))) { - port_id = SLIM_RX_5; - } else if (strnstr(kcontrol->id.name, - "SLIM_6_RX", sizeof("SLIM_6_RX"))) { - port_id = SLIM_RX_6; - } else if (strnstr(kcontrol->id.name, - "SLIM_0_TX", sizeof("SLIM_0_TX"))) { - port_id = SLIM_TX_0; - } else if (strnstr(kcontrol->id.name, - "SLIM_1_TX", sizeof("SLIM_1_TX"))) { - port_id = SLIM_TX_1; - } else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - return port_id; -} - -static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].sample_rate = - slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate); - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate = 0; - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]); - if (sample_rate == SAMPLING_RATE_44P1KHZ) { - pr_err("%s: Unsupported sample rate %d: for Tx path\n", - __func__, sample_rate); - return -EINVAL; - } - slim_tx_cfg[ch_num].sample_rate = sample_rate; - - pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_rx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - ucontrol->value.enumerated.item[0] = - slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].bit_format = - slim_get_bit_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n", - __func__, ch_num, slim_tx_cfg[ch_num].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int slim_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__, - ch_num, slim_rx_cfg[ch_num].channels); - - return 1; -} - -static int slim_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1; - - return 0; -} - -static int slim_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ch_num = slim_get_port_idx(kcontrol); - - if (ch_num < 0) - return ch_num; - - slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__, - ch_num, slim_tx_cfg[ch_num].channels); - - return 1; -} - -static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1; - pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__, - ucontrol->value.integer.value[0]); - return 0; -} - -static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch); - return 1; -} - -static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* - * Slimbus_7_Rx/Tx sample rate values should always be in sync (same) - * when used for BT_SCO use case. Return either Rx or Tx sample rate - * value. - */ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_rx_cfg[SLIM_RX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate rx = %d", __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_rx = %d, value = %d\n", - __func__, - slim_rx_cfg[SLIM_RX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (slim_tx_cfg[SLIM_TX_7].sample_rate) { - case SAMPLING_RATE_96KHZ: - ucontrol->value.integer.value[0] = 5; - break; - case SAMPLING_RATE_88P2KHZ: - ucontrol->value.integer.value[0] = 4; - break; - case SAMPLING_RATE_48KHZ: - ucontrol->value.integer.value[0] = 3; - break; - case SAMPLING_RATE_44P1KHZ: - ucontrol->value.integer.value[0] = 2; - break; - case SAMPLING_RATE_16KHZ: - ucontrol->value.integer.value[0] = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - pr_debug("%s: sample rate tx = %d", __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate); - - return 0; -} - -static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 1: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 5: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ; - break; - } - pr_debug("%s: sample rate: slim7_tx = %d, value = %d\n", - __func__, - slim_tx_cfg[SLIM_TX_7].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, - usb_rx_cfg.channels); - ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1; - return 0; -} - -static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels); - return 1; -} - -static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_rx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__, - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_rx_cfg.sample_rate); - return 0; -} - -static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_rx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n", - __func__, usb_rx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, - usb_tx_cfg.channels); - ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1; - return 0; -} - -static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1; - - pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels); - return 1; -} - -static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - - switch (usb_tx_cfg.sample_rate) { - case SAMPLING_RATE_384KHZ: - sample_rate_val = 12; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 11; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 10; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 9; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 8; - break; - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - default: - sample_rate_val = 6; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__, - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (ucontrol->value.integer.value[0]) { - case 12: - usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ; - break; - case 11: - usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ; - break; - case 10: - usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ; - break; - case 9: - usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 8: - usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ; - break; - case 7: - usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 6: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - case 5: - usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 4: - usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 2: - usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ; - break; - case 1: - usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 0: - usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ; - break; - default: - usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], - usb_tx_cfg.sample_rate); - return 0; -} - -static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - switch (usb_tx_cfg.bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - ucontrol->value.integer.value[0] = 3; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - - switch (ucontrol->value.integer.value[0]) { - case 3: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE; - break; - case 2: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n", - __func__, usb_tx_cfg.bit_format, - ucontrol->value.integer.value[0]); - - return rc; -} - -static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "Display Port RX", - sizeof("Display Port RX"))) { - idx = DP_RX_IDX; - } else { - pr_err("%s: unsupported BE: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].bit_format) { - case SNDRV_PCM_FORMAT_S24_3LE: - ucontrol->value.integer.value[0] = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - ucontrol->value.integer.value[0] = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - ucontrol->value.integer.value[0] = 0; - break; - } - - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - return 0; -} - -static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 2: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 1: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 0: - default: - ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n", - __func__, idx, ext_disp_rx_cfg[idx].bit_format, - ucontrol->value.integer.value[0]); - - return 0; -} - -static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.integer.value[0] = - ext_disp_rx_cfg[idx].channels - 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - - return 0; -} - -static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ext_disp_rx_cfg[idx].channels = - ucontrol->value.integer.value[0] + 2; - - pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].channels); - return 1; -} - -static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int sample_rate_val; - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ext_disp_rx_cfg[idx].sample_rate) { - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 6; - break; - - case SAMPLING_RATE_88P2KHZ: - sample_rate_val = 5; - break; - - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 4; - break; - - case SAMPLING_RATE_32KHZ: - sample_rate_val = 3; - break; - - case SAMPLING_RATE_192KHZ: - sample_rate_val = 2; - break; - - case SAMPLING_RATE_96KHZ: - sample_rate_val = 1; - break; - - case SAMPLING_RATE_48KHZ: - default: - sample_rate_val = 0; - break; - } - - ucontrol->value.integer.value[0] = sample_rate_val; - pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__, - idx, ext_disp_rx_cfg[idx].sample_rate); - - return 0; -} - -static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = ext_disp_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - switch (ucontrol->value.integer.value[0]) { - case 6: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ; - break; - case 4: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 3: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ; - break; - case 2: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ; - break; - case 1: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ; - break; - case 0: - default: - ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ; - break; - } - - pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n", - __func__, ucontrol->value.integer.value[0], idx, - ext_disp_rx_cfg[idx].sample_rate); - return 0; -} - -static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2; - - return 0; -} - -static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2; - pr_debug("%s: proxy_rx channels = %d\n", - __func__, proxy_rx_cfg.channels); - - return 1; -} - -static int tdm_get_sample_rate(int value) -{ - int sample_rate = 0; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_176P4KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_352P8KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int aux_pcm_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 1: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 0: - default: - sample_rate = SAMPLING_RATE_8KHZ; - break; - } - return sample_rate; -} - -static int tdm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val = 0; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_176P4KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_352P8KHZ: - sample_rate_val = 5; - break; - default: - sample_rate_val = 3; - break; - } - return sample_rate_val; -} - -static int aux_pcm_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_16KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_8KHZ: - default: - sample_rate_val = 0; - break; - } - return sample_rate_val; -} - -static int tdm_get_port_idx(struct snd_kcontrol *kcontrol, - struct tdm_port *port) -{ - if (port) { - if (strnstr(kcontrol->id.name, "PRI", - sizeof(kcontrol->id.name))) { - port->mode = TDM_PRI; - } else if (strnstr(kcontrol->id.name, "SEC", - sizeof(kcontrol->id.name))) { - port->mode = TDM_SEC; - } else if (strnstr(kcontrol->id.name, "TERT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_TERT; - } else if (strnstr(kcontrol->id.name, "QUAT", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUAT; - } else if (strnstr(kcontrol->id.name, "QUIN", - sizeof(kcontrol->id.name))) { - port->mode = TDM_QUIN; - } else { - pr_err("%s: unsupported mode in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - - if (strnstr(kcontrol->id.name, "RX_0", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_0", - sizeof(kcontrol->id.name))) { - port->channel = TDM_0; - } else if (strnstr(kcontrol->id.name, "RX_1", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_1", - sizeof(kcontrol->id.name))) { - port->channel = TDM_1; - } else if (strnstr(kcontrol->id.name, "RX_2", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_2", - sizeof(kcontrol->id.name))) { - port->channel = TDM_2; - } else if (strnstr(kcontrol->id.name, "RX_3", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_3", - sizeof(kcontrol->id.name))) { - port->channel = TDM_3; - } else if (strnstr(kcontrol->id.name, "RX_4", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_4", - sizeof(kcontrol->id.name))) { - port->channel = TDM_4; - } else if (strnstr(kcontrol->id.name, "RX_5", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_5", - sizeof(kcontrol->id.name))) { - port->channel = TDM_5; - } else if (strnstr(kcontrol->id.name, "RX_6", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_6", - sizeof(kcontrol->id.name))) { - port->channel = TDM_6; - } else if (strnstr(kcontrol->id.name, "RX_7", - sizeof(kcontrol->id.name)) || - strnstr(kcontrol->id.name, "TX_7", - sizeof(kcontrol->id.name))) { - port->channel = TDM_7; - } else { - pr_err("%s: unsupported channel in: %s", - __func__, kcontrol->id.name); - return -EINVAL; - } - } else - return -EINVAL; - return 0; -} - -static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_rx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val( - tdm_tx_cfg[port.mode][port.channel].sample_rate); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].sample_rate = - tdm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].sample_rate, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_get_format(int value) -{ - int format = 0; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int tdm_get_format_val(int format) -{ - int value = 0; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 2; - break; - default: - value = 0; - break; - } - return value; -} - -static int tdm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_rx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = tdm_get_format_val( - tdm_tx_cfg[port.mode][port.channel].bit_format); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].bit_format = - tdm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].bit_format, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - - ucontrol->value.enumerated.item[0] = - tdm_rx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_rx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__, - tdm_rx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - ucontrol->value.enumerated.item[0] = - tdm_tx_cfg[port.mode][port.channel].channels - 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels - 1, - ucontrol->value.enumerated.item[0]); - } - return ret; -} - -static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct tdm_port port; - int ret = tdm_get_port_idx(kcontrol, &port); - - if (ret) { - pr_err("%s: unsupported control: %s", - __func__, kcontrol->id.name); - } else { - tdm_tx_cfg[port.mode][port.channel].channels = - ucontrol->value.enumerated.item[0] + 1; - - pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__, - tdm_tx_cfg[port.mode][port.channel].channels, - ucontrol->value.enumerated.item[0] + 1); - } - return ret; -} - -static int tdm_slot_map_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int interface = ucontrol->value.integer.value[0]; - int channel = ucontrol->value.integer.value[1]; - unsigned int offset_val; - unsigned int *slot_offset; - - if (interface < 0 || interface >= (TDM_INTERFACE_MAX * 2)) { - pr_err("%s: incorrect interface = %d", __func__, interface); - return -EINVAL; - } - if (channel < 0 || channel >= TDM_PORT_MAX) { - pr_err("%s: incorrect channel = %d", __func__, channel); - return -EINVAL; - } - - pr_debug("%s: interface = %d, channel = %d", __func__, - interface, channel); - - slot_offset = tdm_cfg[interface][channel].tdm_slot_offset; - - /* Currenly can configure only two slots */ - offset_val = ucontrol->value.integer.value[2]; - /* Offset value can only be 0, 4, 8, ..28 */ - if (offset_val % 4 == 0 && offset_val <= 28) - slot_offset[0] = offset_val; - pr_debug("%s: slot offset[0] = %d\n", __func__, slot_offset[0]); - - offset_val = ucontrol->value.integer.value[3]; - if (offset_val % 4 == 0 && offset_val <= 28) - slot_offset[1] = offset_val; - pr_debug("%s: slot offset[1] = %d\n", __func__, slot_offset[1]); - - return 0; -} - -static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM", - sizeof("PRIM_AUX_PCM"))) - idx = PRIM_AUX_PCM; - else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM", - sizeof("SEC_AUX_PCM"))) - idx = SEC_AUX_PCM; - else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM", - sizeof("TERT_AUX_PCM"))) - idx = TERT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM", - sizeof("QUAT_AUX_PCM"))) - idx = QUAT_AUX_PCM; - else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM", - sizeof("QUIN_AUX_PCM"))) - idx = QUIN_AUX_PCM; - else { - pr_err("%s: unsupported port: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].sample_rate = - aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol) -{ - int idx; - - if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX", - sizeof("PRIM_MI2S_RX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX", - sizeof("SEC_MI2S_RX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX", - sizeof("TERT_MI2S_RX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX", - sizeof("QUAT_MI2S_RX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX", - sizeof("QUIN_MI2S_RX"))) - idx = QUIN_MI2S; - else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX", - sizeof("PRIM_MI2S_TX"))) - idx = PRIM_MI2S; - else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX", - sizeof("SEC_MI2S_TX"))) - idx = SEC_MI2S; - else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX", - sizeof("TERT_MI2S_TX"))) - idx = TERT_MI2S; - else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX", - sizeof("QUAT_MI2S_TX"))) - idx = QUAT_MI2S; - else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX", - sizeof("QUIN_MI2S_TX"))) - idx = QUIN_MI2S; - else { - pr_err("%s: unsupported channel: %s", - __func__, kcontrol->id.name); - idx = -EINVAL; - } - - return idx; -} - -static int mi2s_get_sample_rate_val(int sample_rate) -{ - int sample_rate_val; - - switch (sample_rate) { - case SAMPLING_RATE_8KHZ: - sample_rate_val = 0; - break; - case SAMPLING_RATE_11P025KHZ: - sample_rate_val = 1; - break; - case SAMPLING_RATE_16KHZ: - sample_rate_val = 2; - break; - case SAMPLING_RATE_22P05KHZ: - sample_rate_val = 3; - break; - case SAMPLING_RATE_32KHZ: - sample_rate_val = 4; - break; - case SAMPLING_RATE_44P1KHZ: - sample_rate_val = 5; - break; - case SAMPLING_RATE_48KHZ: - sample_rate_val = 6; - break; - case SAMPLING_RATE_96KHZ: - sample_rate_val = 7; - break; - case SAMPLING_RATE_192KHZ: - sample_rate_val = 8; - break; - default: - sample_rate_val = 6; - break; - } - return sample_rate_val; -} - -static int mi2s_get_sample_rate(int value) -{ - int sample_rate; - - switch (value) { - case 0: - sample_rate = SAMPLING_RATE_8KHZ; - break; - case 1: - sample_rate = SAMPLING_RATE_11P025KHZ; - break; - case 2: - sample_rate = SAMPLING_RATE_16KHZ; - break; - case 3: - sample_rate = SAMPLING_RATE_22P05KHZ; - break; - case 4: - sample_rate = SAMPLING_RATE_32KHZ; - break; - case 5: - sample_rate = SAMPLING_RATE_44P1KHZ; - break; - case 6: - sample_rate = SAMPLING_RATE_48KHZ; - break; - case 7: - sample_rate = SAMPLING_RATE_96KHZ; - break; - case 8: - sample_rate = SAMPLING_RATE_192KHZ; - break; - default: - sample_rate = SAMPLING_RATE_48KHZ; - break; - } - return sample_rate; -} - -static int mi2s_auxpcm_get_format(int value) -{ - int format; - - switch (value) { - case 0: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - case 1: - format = SNDRV_PCM_FORMAT_S24_LE; - break; - case 2: - format = SNDRV_PCM_FORMAT_S24_3LE; - break; - case 3: - format = SNDRV_PCM_FORMAT_S32_LE; - break; - default: - format = SNDRV_PCM_FORMAT_S16_LE; - break; - } - return format; -} - -static int mi2s_auxpcm_get_format_value(int format) -{ - int value; - - switch (format) { - case SNDRV_PCM_FORMAT_S16_LE: - value = 0; - break; - case SNDRV_PCM_FORMAT_S24_LE: - value = 1; - break; - case SNDRV_PCM_FORMAT_S24_3LE: - value = 2; - break; - case SNDRV_PCM_FORMAT_S32_LE: - value = 3; - break; - default: - value = 0; - break; - } - return value; -} - -static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].sample_rate = - mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate); - - pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].sample_rate, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__, - idx, mi2s_rx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1; - - return 0; -} - -static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1; - pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__, - idx, mi2s_tx_cfg[idx].channels); - - return 1; -} - -static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, mi2s_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = mi2s_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - mi2s_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, mi2s_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_rx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, - idx, aux_pcm_rx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - ucontrol->value.enumerated.item[0] = - mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = aux_pcm_get_port_idx(kcontrol); - - if (idx < 0) - return idx; - - aux_pcm_tx_cfg[idx].bit_format = - mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]); - - pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, - idx, aux_pcm_tx_cfg[idx].bit_format, - ucontrol->value.enumerated.item[0]); - - return 0; -} - -static int msm_hifi_ctrl(struct snd_soc_codec *codec) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - dev_dbg(codec->dev, "%s: msm_hifi_control = %d\n", __func__, - msm_hifi_control); - - if (!pdata || !pdata->hph_en1_gpio_p) { - dev_err(codec->dev, "%s: hph_en1_gpio is invalid\n", __func__); - return -EINVAL; - } - if (msm_hifi_control == MSM_HIFI_ON) { - msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p); - /* 5msec delay needed as per HW requirement */ - usleep_range(5000, 5010); - } else { - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p); - } - snd_soc_dapm_sync(dapm); - - return 0; -} - -static int msm_hifi_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - ucontrol->value.integer.value[0] = msm_hifi_control; - - return 0; -} - -static int msm_hifi_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - - dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n", - __func__, ucontrol->value.integer.value[0]); - - msm_hifi_control = ucontrol->value.integer.value[0]; - msm_hifi_ctrl(codec); - - return 0; -} - -static int usbhs_direction_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec = NULL; - struct snd_soc_card *card = NULL; - struct msm_asoc_mach_data *pdata = NULL; - - ucontrol->value.integer.value[0] = 0; - - codec = snd_soc_kcontrol_codec(kcontrol); - if (codec) { - card = codec->component.card; - if (card) { - pdata = snd_soc_card_get_drvdata(card); - if (pdata){ - if (pdata->usbc_en2_gpio_p) { - ucontrol->value.integer.value[0] = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - } else if (pdata->usbc_en2_gpio > 0) { - ucontrol->value.integer.value[0] = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - } - } - } - } - return 0; -} - -static const struct snd_kcontrol_new msm_snd_controls[] = { - SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs, - slim_tx_ch_get, slim_tx_ch_put), - SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs, - slim_rx_ch_get, slim_rx_ch_put), - SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs, - msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs, - usb_audio_rx_ch_get, usb_audio_rx_ch_put), - SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs, - usb_audio_tx_ch_get, usb_audio_tx_ch_put), - SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs, - ext_disp_rx_ch_get, ext_disp_rx_ch_put), - SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs, - proxy_rx_ch_get, proxy_rx_ch_put), - SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format, - slim_rx_bit_format_get, slim_rx_bit_format_put), - SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format, - slim_tx_bit_format_get, slim_tx_bit_format_put), - SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format, - usb_audio_rx_format_get, usb_audio_rx_format_put), - SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format, - usb_audio_tx_format_get, usb_audio_tx_format_put), - SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format, - ext_disp_rx_format_get, ext_disp_rx_format_put), - SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate, - slim_tx_sample_rate_get, slim_tx_sample_rate_put), - SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate, - slim_rx_sample_rate_get, slim_rx_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate", bt_sample_rate, - msm_bt_sample_rate_get, - msm_bt_sample_rate_put), - SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx, - msm_bt_sample_rate_rx_get, - msm_bt_sample_rate_rx_put), - SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, - msm_bt_sample_rate_tx_get, - msm_bt_sample_rate_tx_put), - SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate, - usb_audio_rx_sample_rate_get, - usb_audio_rx_sample_rate_put), - SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate, - usb_audio_tx_sample_rate_get, - usb_audio_tx_sample_rate_put), - SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate, - ext_disp_rx_sample_rate_get, - ext_disp_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_RX_1 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate, - tdm_rx_sample_rate_get, - tdm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate, - tdm_tx_sample_rate_get, - tdm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format, - tdm_rx_format_get, - tdm_rx_format_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format, - tdm_tx_format_get, - tdm_tx_format_put), - SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs, - tdm_rx_ch_get, - tdm_rx_ch_put), - SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs, - tdm_tx_ch_get, - tdm_tx_ch_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate, - aux_pcm_rx_sample_rate_get, - aux_pcm_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate, - aux_pcm_tx_sample_rate_get, - aux_pcm_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate, - mi2s_rx_sample_rate_get, - mi2s_rx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate, - mi2s_tx_sample_rate_get, - mi2s_tx_sample_rate_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs, - msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs, - msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), - SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format, - msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), - SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format, - msm_mi2s_tx_format_get, msm_mi2s_tx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format, - msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put), - SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format, - msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put), - SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, - msm_hifi_put), - SOC_SINGLE_EXT("USB Headset Direction", 0, 0, UINT_MAX, 0, - usbhs_direction_get, NULL), - SOC_SINGLE_MULTI_EXT("TDM Slot Map", SND_SOC_NOPM, 0, 255, 0, 4, - NULL, tdm_slot_map_put), - -}; - -static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "pahu_codec")) { - ret = pahu_cdc_mclk_enable(codec, enable); - } else if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_enable(codec, enable); - } else { - dev_err(codec->dev, "%s: unknown codec to enable ext clk\n", - __func__); - ret = -EINVAL; - } - return ret; -} - -static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec, - int enable, bool dapm) -{ - int ret = 0; - - if (!strcmp(dev_name(codec->dev), "pahu_codec")) { - ret = pahu_cdc_mclk_tx_enable(codec, enable); - } else if (!strcmp(dev_name(codec->dev), "tavil_codec")) { - ret = tavil_cdc_mclk_tx_enable(codec, enable); - } else { - dev_err(codec->dev, "%s: unknown codec to enable TX ext clk\n", - __func__); - ret = -EINVAL; - } - - return ret; -} - -static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_tx_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_tx_clk(codec, 0, true); - } - return 0; -} - -static int msm_mclk_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - - pr_debug("%s: event = %d\n", __func__, event); - - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - return msm_snd_enable_codec_ext_clk(codec, 1, true); - case SND_SOC_DAPM_POST_PMD: - return msm_snd_enable_codec_ext_clk(codec, 0, true); - } - return 0; -} - -static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *k, int event) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - dev_dbg(codec->dev, "%s: msm_hifi_control = %d\n", - __func__, msm_hifi_control); - - if (!pdata || !pdata->hph_en0_gpio_p) { - dev_err(codec->dev, "%s: hph_en0_gpio is invalid\n", __func__); - return -EINVAL; - } - - if (msm_hifi_control != MSM_HIFI_ON) { - dev_dbg(codec->dev, "%s: HiFi mixer control is not set\n", - __func__); - return 0; - } - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p); - break; - case SND_SOC_DAPM_PRE_PMD: - msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p); - break; - } - - return 0; -} - -/* -static int external_amic2_sel_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = amic2_sel_state; - return 0; -} -*/ - -static void external_enable_dual_adc_gpio(struct device_node *np, bool val) -{ - if (!np) { - pr_err("%s: device node is NULL!", __func__); - return; - } - - if (val == 1) { - msm_cdc_pinctrl_select_active_state(np); - pr_info("%s: enable Dual ADC \n", __func__); - } else { - msm_cdc_pinctrl_select_sleep_state(np); - pr_info("%s: disable Dual ADC \n", __func__); - } -} - -static int external_amic2_sel_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); - struct snd_soc_card *card = dapm->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - unsigned int val; - - val = ucontrol->value.enumerated.item[0]; - - if (!pdata || !pdata->adc2_sel_gpio_p) { - pr_err("%s: adc2_sel_gpio is invalid\n", __func__); - return -EINVAL; - } - - //TODO: need to fix adc2 amplitude less than 3db issue -// external_enable_dual_adc_gpio(pdata->adc2_sel_gpio_p, !!(val)); - pr_info("external_amic2_sel_put %u \n", val); - - return snd_soc_dapm_put_enum_double(kcontrol, ucontrol); -} - -static const char *const external_AMIC2_enum_text[] = {"default", "Dual_ADC"}; - -static SOC_ENUM_SINGLE_VIRT_DECL(external_AMIC2_enum, external_AMIC2_enum_text); - -static const struct snd_kcontrol_new ext_amc2_mux = - SOC_DAPM_ENUM_EXT("External AMIC2 sel", external_AMIC2_enum, - snd_soc_dapm_get_enum_double, external_amic2_sel_put); - - -static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { - - SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, - msm_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0, - msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Analog Mic3", NULL), - SND_SOC_DAPM_MIC("Analog Mic4", NULL), - - SND_SOC_DAPM_MIC("Digital Mic0", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", NULL), - SND_SOC_DAPM_MIC("Digital Mic2", NULL), - SND_SOC_DAPM_MIC("Digital Mic3", NULL), - SND_SOC_DAPM_MIC("Digital Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic5", NULL), - SND_SOC_DAPM_MIC("Digital Mic6", NULL), - SND_SOC_DAPM_MIC("Digital Mic7", NULL), -}; - -static const struct snd_soc_dapm_widget msm_dapm_widgets_tavil[] = { - - SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, - msm_mclk_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0, - msm_mclk_tx_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_SPK("Lineout_1 amp", NULL), - SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), - SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event), - SND_SOC_DAPM_MIC("Handset Mic", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL), - SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL), - SND_SOC_DAPM_MIC("Analog Mic5", NULL), - - SND_SOC_DAPM_MIC("Digital Mic0", NULL), - SND_SOC_DAPM_MIC("Digital Mic1", NULL), - SND_SOC_DAPM_MIC("Digital Mic2", NULL), - SND_SOC_DAPM_MIC("Digital Mic3", NULL), - SND_SOC_DAPM_MIC("Digital Mic4", NULL), - SND_SOC_DAPM_MIC("Digital Mic5", NULL), - SND_SOC_DAPM_MIC("Headset Mic2", NULL), -}; - -static const struct snd_soc_dapm_widget msm_dualadc_dapm_widgets[] = { - SND_SOC_DAPM_MUX("External AMIC2 Mux", SND_SOC_NOPM, 0, 0, &ext_amc2_mux), - SND_SOC_DAPM_INPUT("AMIC2_EXT_0"), - SND_SOC_DAPM_INPUT("AMIC2_EXT_1"), -}; - -static const struct snd_soc_dapm_route msm_dualadc_dapm_routes[] = { - {"AMIC2", NULL, "External AMIC2 Mux"}, - {"External AMIC2 Mux", "default", "AMIC2_EXT_0"}, - {"External AMIC2 Mux", "Dual_ADC", "AMIC2_EXT_1"}, -}; - -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, - int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, - unsigned int bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - -static int msm_slim_get_ch_from_beid(int32_t be_id) -{ - int ch_id = 0; - - switch (be_id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - ch_id = SLIM_RX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - ch_id = SLIM_RX_1; - break; - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - ch_id = SLIM_RX_2; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - ch_id = SLIM_RX_3; - break; - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - ch_id = SLIM_RX_4; - break; - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - ch_id = SLIM_RX_6; - break; - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - ch_id = SLIM_TX_0; - break; - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - ch_id = SLIM_TX_3; - break; - default: - ch_id = SLIM_RX_0; - break; - } - - return ch_id; -} - -static int msm_ext_disp_get_idx_from_beid(int32_t be_id) -{ - int idx; - - switch (be_id) { - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = DP_RX_IDX; - break; - default: - pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id); - idx = -EINVAL; - break; - } - - return idx; -} - -static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai_link *dai_link = rtd->dai_link; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - int rc = 0; - int idx; - void *config = NULL; - struct snd_soc_codec *codec = NULL; - - pr_debug("%s: dai_id= %d, format = %d, rate = %d\n", - __func__, dai_link->id, params_format(params), - params_rate(params)); - - - switch (dai_link->id) { - case MSM_BACKEND_DAI_SLIMBUS_0_RX: - case MSM_BACKEND_DAI_SLIMBUS_1_RX: - case MSM_BACKEND_DAI_SLIMBUS_2_RX: - case MSM_BACKEND_DAI_SLIMBUS_3_RX: - case MSM_BACKEND_DAI_SLIMBUS_4_RX: - case MSM_BACKEND_DAI_SLIMBUS_6_RX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[idx].bit_format); - rate->min = rate->max = slim_rx_cfg[idx].sample_rate; - channels->min = channels->max = slim_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_0_TX: - case MSM_BACKEND_DAI_SLIMBUS_3_TX: - idx = msm_slim_get_ch_from_beid(dai_link->id); - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[idx].bit_format); - rate->min = rate->max = slim_tx_cfg[idx].sample_rate; - channels->min = channels->max = slim_tx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_1_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_tx_cfg[1].bit_format); - rate->min = rate->max = slim_tx_cfg[1].sample_rate; - channels->min = channels->max = slim_tx_cfg[1].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_4_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S32_LE); - rate->min = rate->max = SAMPLING_RATE_8KHZ; - channels->min = channels->max = msm_vi_feed_tx_ch; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[5].bit_format); - rate->min = rate->max = slim_rx_cfg[5].sample_rate; - channels->min = channels->max = slim_rx_cfg[5].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_5_TX: - codec = rtd->codec; - rate->min = rate->max = SAMPLING_RATE_16KHZ; - channels->min = channels->max = 1; - - config = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_PORT_CONFIG); - if (config) { - rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, - config, SLIMBUS_5_TX); - if (rc) - pr_err("%s: Failed to set slimbus slave port config %d\n", - __func__, rc); - } - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - slim_rx_cfg[SLIM_RX_7].bit_format); - rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate; - channels->min = channels->max = - slim_rx_cfg[SLIM_RX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_7_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_7].channels; - break; - - case MSM_BACKEND_DAI_SLIMBUS_8_TX: - rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate; - channels->min = channels->max = - slim_tx_cfg[SLIM_TX_8].channels; - break; - - case MSM_BACKEND_DAI_USB_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_rx_cfg.bit_format); - rate->min = rate->max = usb_rx_cfg.sample_rate; - channels->min = channels->max = usb_rx_cfg.channels; - break; - - case MSM_BACKEND_DAI_USB_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - usb_tx_cfg.bit_format); - rate->min = rate->max = usb_tx_cfg.sample_rate; - channels->min = channels->max = usb_tx_cfg.channels; - break; - - case MSM_BACKEND_DAI_DISPLAY_PORT_RX: - idx = msm_ext_disp_get_idx_from_beid(dai_link->id); - if (idx < 0) { - pr_err("%s: Incorrect ext disp idx %d\n", - __func__, idx); - rc = idx; - goto done; - } - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - ext_disp_rx_cfg[idx].bit_format); - rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate; - channels->min = channels->max = ext_disp_rx_cfg[idx].channels; - break; - - case MSM_BACKEND_DAI_AFE_PCM_RX: - channels->min = channels->max = proxy_rx_cfg.channels; - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - - case MSM_BACKEND_DAI_PRI_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_PRI_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_PRI][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_PRI][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_SEC_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_TERT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_TERT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_TERT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUAT_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_RX_0: - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - case MSM_BACKEND_DAI_QUIN_TDM_TX_0: - channels->min = channels->max = - tdm_tx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate; - break; - - - case MSM_BACKEND_DAI_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[PRIM_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_SEC_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[SEC_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_TERT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[TERT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUAT_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUAT_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_rx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_QUIN_AUXPCM_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format); - rate->min = rate->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate; - channels->min = channels->max = - aux_pcm_tx_cfg[QUIN_AUX_PCM].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_PRI_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[PRIM_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[PRIM_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[SEC_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[SEC_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[TERT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[TERT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUAT_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUAT_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_rx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_rx_cfg[QUIN_MI2S].channels; - break; - - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - mi2s_tx_cfg[QUIN_MI2S].bit_format); - rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate; - channels->min = channels->max = - mi2s_tx_cfg[QUIN_MI2S].channels; - break; - - default: - rate->min = rate->max = SAMPLING_RATE_48KHZ; - break; - } - -done: - return rc; -} - -static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(card); - - struct pinctrl_state *en2_pinctrl_active; - struct pinctrl_state *en2_pinctrl_sleep; - int value = 0; - bool ret = 0; - int oldv; - - if (wcd_mbhc_cfg.use_fsa4476_gpio != 0) { - if (!pdata->usbc_en2_gpio_p) { - if (active) { - /* if active and usbc_en2_gpio undefined, get pin */ - pdata->usbc_en2_gpio_p = devm_pinctrl_get(card->dev); - if (IS_ERR_OR_NULL(pdata->usbc_en2_gpio_p)) { - dev_err(card->dev, - "%s: Can't get EN2 gpio pinctrl:%ld\n", - __func__, - PTR_ERR(pdata->usbc_en2_gpio_p)); - pdata->usbc_en2_gpio_p = NULL; - return false; - } - } else - /* if not active and usbc_en2_gpio undefined, return */ - return false; - } - - pdata->usbc_en2_gpio = of_get_named_gpio(card->dev->of_node, - "qcom,usbc-analog-en2-gpio", 0); - if (!gpio_is_valid(pdata->usbc_en2_gpio)) { - dev_err(card->dev, "%s, property %s not in node %s", - __func__, "qcom,usbc-analog-en2-gpio", - card->dev->of_node->full_name); - return false; - } - - en2_pinctrl_active = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_active"); - if (IS_ERR_OR_NULL(en2_pinctrl_active)) { - dev_err(card->dev, - "%s: Cannot get aud_active pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_active)); - ret = false; - goto err_lookup_state; - } - - en2_pinctrl_sleep = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_sleep"); - if (IS_ERR_OR_NULL(en2_pinctrl_sleep)) { - dev_err(card->dev, - "%s: Cannot get aud_sleep pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_sleep)); - ret = false; - goto err_lookup_state; - } - - /* if active and usbc_en2_gpio_p defined, swap using usbc_en2_gpio_p */ - if (active) { - dev_dbg(codec->dev, "%s: enter\n", __func__); - oldv = tavil_mb_pull_down(codec, true, 0); - if (wcd_mbhc_cfg.usbc_analog_cfg.euro_us_hw_switch_gpio_p) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - if (value) - msm_cdc_pinctrl_select_sleep_state( - wcd_mbhc_cfg.usbc_analog_cfg.euro_us_hw_switch_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - wcd_mbhc_cfg.usbc_analog_cfg.euro_us_hw_switch_gpio_p); - } - else if (pdata->usbc_en2_gpio_p) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - if (value) - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - else - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_active); - } else if (pdata->usbc_en2_gpio >= 0) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - gpio_set_value_cansleep(pdata->usbc_en2_gpio, !value); - } - tavil_mb_pull_down(codec, false, oldv); - pr_info("%s: swap select switch %d to %d\n", __func__, - value, !value); - ret = true; - } else { - /* if not active, release usbc_en2_gpio_p pin */ - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - } - } else { - if (!pdata->fsa_handle) - return false; - - return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP); - } - - -err_lookup_state: - if (wcd_mbhc_cfg.use_fsa4476_gpio != 0) { - devm_pinctrl_put(pdata->usbc_en2_gpio_p); - pdata->usbc_en2_gpio_p = NULL; - } - - return ret; -} - -static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) -{ - int value = 0; - bool ret = false; - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return false; - } - card = codec->component.card; - pdata = snd_soc_card_get_drvdata(card); - - if (!pdata) - return false; - - if (wcd_mbhc_cfg.enable_usbc_analog) - return msm_usbc_swap_gnd_mic(codec, active); - - /* if usbc is not defined, swap using us_euro_gpio_p */ - if (pdata->us_euro_gpio_p) { - value = msm_cdc_pinctrl_get_state( - pdata->us_euro_gpio_p); - if (value) - msm_cdc_pinctrl_select_sleep_state( - pdata->us_euro_gpio_p); - else - msm_cdc_pinctrl_select_active_state( - pdata->us_euro_gpio_p); - dev_dbg(codec->dev, "%s: swap select switch %d to %d\n", - __func__, value, !value); - ret = true; - } - - return ret; -} - -static int msm_afe_set_config(struct snd_soc_codec *codec) -{ - int ret = 0; - void *config_data = NULL; - - if (!msm_codec_fn.get_afe_config_fn) { - dev_err(codec->dev, "%s: codec get afe config not init'ed\n", - __func__); - return -EINVAL; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTERS_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set codec registers config %d\n", - __func__, ret); - return ret; - } - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_CDC_REGISTER_PAGE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data, - 0); - if (ret) - dev_err(codec->dev, - "%s: Failed to set cdc register page config\n", - __func__); - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_SLIMBUS_SLAVE_CONFIG); - if (config_data) { - ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0); - if (ret) { - dev_err(codec->dev, - "%s: Failed to set slimbus slave config %d\n", - __func__, ret); - return ret; - } - } - - return 0; -} - -static void msm_afe_clear_config(void) -{ - afe_clear_config(AFE_CDC_REGISTERS_CONFIG); - afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); -} - -static int msm_adsp_power_up_config(struct snd_soc_codec *codec, - struct snd_card *card) -{ - int ret = 0; - unsigned long timeout; - int adsp_ready = 0; - bool snd_card_online = 0; - - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - - /* sleep for 100ms before querying AVS up */ - msleep(100); - do { - if (!snd_card_online) { - snd_card_online = snd_card_is_online_state(card); - pr_debug("%s: Sound card is %s\n", __func__, - snd_card_online ? "Online" : "Offline"); - } - if (!adsp_ready) { - adsp_ready = q6core_is_adsp_ready(); - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - } - if (snd_card_online && adsp_ready) - break; - - /* - * Sound card/ADSP will be coming up after subsystem restart and - * it might not be fully up when the control reaches - * here. So, wait for 50msec before checking ADSP state - */ - msleep(50); - } while (time_after(timeout, jiffies)); - - if (!snd_card_online || !adsp_ready) { - pr_err("%s: Timeout. Sound card is %s, ADSP Audio is %s\n", - __func__, - snd_card_online ? "Online" : "Offline", - adsp_ready ? "ready" : "not ready"); - ret = -ETIMEDOUT; - goto err; - } - - ret = msm_afe_set_config(codec); - if (ret) - pr_err("%s: Failed to set AFE config. err %d\n", - __func__, ret); - - return 0; - -err: - return ret; -} - -static void msm_adsp_power_up_config_work(struct work_struct *work) -{ - struct msm_asoc_mach_data *pdata; - struct snd_soc_codec *codec; - struct snd_card *card; - - pdata = container_of(work, struct msm_asoc_mach_data, - adsp_power_up_work); - codec = pdata->codec; - card = codec->component.card->snd_card; - msm_adsp_power_up_config(codec, card); -} - -static int sm8150_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - int ret; - struct snd_soc_card *card = NULL; - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; - struct msm_asoc_mach_data *pdata; - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore initial boot notifications - * On initial boot msm_adsp_power_up_config is - * called on init. There is no need to clear - * and set the config again on initial boot. - */ - if (is_initial_boot) - break; - msm_afe_clear_config(); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (is_initial_boot) { - is_initial_boot = false; - break; - } - if (!spdev) - return -EINVAL; - - card = platform_get_drvdata(spdev); - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err; - } - codec = rtd->codec; - - pdata = snd_soc_card_get_drvdata(card); - pdata->codec = codec; - schedule_work(&pdata->adsp_power_up_work); - break; - default: - break; - } -err: - return NOTIFY_OK; -} - -static struct notifier_block service_nb = { - .notifier_call = sm8150_notifier_service_cb, - .priority = -INT_MAX, -}; - -static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - void *config_data; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_component *aux_comp; - struct snd_card *card; - struct snd_info_entry *entry; - struct msm_asoc_mach_data *pdata = - snd_soc_card_get_drvdata(rtd->card); - - /* - * Codec SLIMBUS configuration - * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8 - * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13 - * TX14, TX15, TX16 - */ - unsigned int rx_ch[WCD9360_RX_MAX] = {144, 145, 146, 147, 148, 149, - 150, 151}; - unsigned int tx_ch[WCD9360_TX_MAX] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - pr_debug("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - pr_err("%s: add_codec_controls failed, err %d\n", - __func__, ret); - return ret; - } - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets_tavil, - ARRAY_SIZE(msm_dapm_widgets_tavil)); - snd_soc_dapm_add_routes(dapm, wcd_audio_paths_tavil, - ARRAY_SIZE(wcd_audio_paths_tavil)); - } else { - snd_soc_dapm_new_controls(dapm, msm_dapm_widgets, - ARRAY_SIZE(msm_dapm_widgets)); - snd_soc_dapm_add_routes(dapm, wcd_audio_paths, - ARRAY_SIZE(wcd_audio_paths)); - } - - if (pdata->adc2_sel_gpio_p) { - pr_info("add the External AMIC2 Mux\n"); - snd_soc_dapm_new_controls(dapm, msm_dualadc_dapm_widgets, - ARRAY_SIZE(msm_dualadc_dapm_widgets)); - - snd_soc_dapm_add_routes(dapm, msm_dualadc_dapm_routes, - ARRAY_SIZE(msm_dualadc_dapm_routes)); - } - - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1"); - snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT"); - snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI"); - snd_soc_dapm_ignore_suspend(dapm, "VIINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "WDMA3_OUT"); - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - if (pdata->adc2_sel_gpio_p) { - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2_EXT_0"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2_EXT_1"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic2"); - } - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "HPHR"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR"); - } else { - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic7"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4"); - } - - snd_soc_dapm_sync(dapm); - - snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); - - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) - msm_codec_fn.get_afe_config_fn = tavil_get_afe_config; - else - msm_codec_fn.get_afe_config_fn = pahu_get_afe_config; - - ret = msm_adsp_power_up_config(codec, rtd->card->snd_card); - if (ret) { - pr_err("%s: Failed to set AFE config %d\n", __func__, ret); - goto err; - } - - config_data = msm_codec_fn.get_afe_config_fn(codec, - AFE_AANC_VERSION); - if (config_data) { - ret = afe_set_config(AFE_AANC_VERSION, config_data, 0); - if (ret) { - pr_err("%s: Failed to set aanc version %d\n", - __func__, ret); - goto err; - } - } - - /* - * Send speaker configuration only for WSA8810. - * Default configuration is for WSA8815. - */ - pr_debug("%s: Number of aux devices: %d\n", - __func__, rtd->card->num_aux_devs); - if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) { - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->component_dev_list)) { - aux_comp = list_first_entry( - &rtd->card->component_dev_list, - struct snd_soc_component, - card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - tavil_set_spkr_mode(rtd->codec, - WCD934X_SPKR_MODE_1); - tavil_set_spkr_gain_offset(rtd->codec, - WCD934X_RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - pdata->codec_root = NULL; - goto done; - } - pdata->codec_root = entry; - tavil_codec_info_create_codec_entry(pdata->codec_root, codec); - } else { - if (rtd->card->num_aux_devs && - !list_empty(&rtd->card->component_dev_list)) { - aux_comp = list_first_entry(&rtd->card->component_dev_list, - struct snd_soc_component, card_aux_list); - if (!strcmp(aux_comp->name, WSA8810_NAME_1) || - !strcmp(aux_comp->name, WSA8810_NAME_2)) { - pahu_set_spkr_mode(rtd->codec, WCD9360_SPKR_MODE_1); - pahu_set_spkr_gain_offset(rtd->codec, - WCD9360_RX_GAIN_OFFSET_M1P5_DB); - } - } - card = rtd->card->snd_card; - entry = snd_info_create_subdir(card->module, "codecs", - card->proc_root); - if (!entry) { - pr_debug("%s: Cannot create codecs module entry\n", - __func__); - pdata->codec_root = NULL; - goto done; - } - pdata->codec_root = entry; - pahu_codec_info_create_codec_entry(pdata->codec_root, codec); - } -done: - codec_reg_done = true; - return 0; - -err: - return ret; -} - -static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd) -{ - unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158}; - unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161}; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch), - tx_ch, ARRAY_SIZE(rx_ch), rx_ch); -} - -static void *def_wcd_mbhc_cal(void) -{ - void *wcd_mbhc_cal; - struct wcd_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_high; - - wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); - if (!wcd_mbhc_cal) - return NULL; - -#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->X) = (Y)) - S(v_hs_max, 1600); -#undef S -#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->X) = (Y)) - S(num_btn, WCD_MBHC_DEF_BUTTONS); -#undef S - - btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal); - btn_high = ((void *)&btn_cfg->_v_btn_low) + - (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); - - btn_high[0] = 75; - btn_high[1] = 260; - btn_high[2] = 750; - btn_high[3] = 750; - btn_high[4] = 750; - btn_high[5] = 750; - btn_high[6] = 750; - btn_high[7] = 750; - - return wcd_mbhc_cal; -} - -static int msm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - - int ret = 0; - u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - u32 user_set_tx_ch = 0; - u32 rx_ch_count; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) { - pr_debug("%s: rx_5_ch=%d\n", __func__, - slim_rx_cfg[5].channels); - rx_ch_count = slim_rx_cfg[5].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) { - pr_debug("%s: rx_2_ch=%d\n", __func__, - slim_rx_cfg[2].channels); - rx_ch_count = slim_rx_cfg[2].channels; - } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) { - pr_debug("%s: rx_6_ch=%d\n", __func__, - slim_rx_cfg[6].channels); - rx_ch_count = slim_rx_cfg[6].channels; - } else { - pr_debug("%s: rx_0_ch=%d\n", __func__, - slim_rx_cfg[0].channels); - rx_ch_count = slim_rx_cfg[0].channels; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - rx_ch_count, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - - pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__, - codec_dai->name, codec_dai->id, user_set_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get tx codec chan map, err:%d\n", - __func__, ret); - goto err; - } - /* For _tx1 case */ - if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX) - user_set_tx_ch = slim_tx_cfg[0].channels; - /* For _tx3 case */ - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX) - user_set_tx_ch = slim_tx_cfg[1].channels; - else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX) - user_set_tx_ch = msm_vi_feed_tx_ch; - else - user_set_tx_ch = tx_ch_cnt; - - pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), BE id (%d)\n", - __func__, slim_tx_cfg[0].channels, user_set_tx_ch, - tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - user_set_tx_ch, tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: failed to set tx cpu chan map, err:%d\n", - __func__, ret); - } - -err: - return ret; -} - -static int msm_slimbus_2_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS]; - unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0; - unsigned int num_tx_ch = 0; - unsigned int num_rx_ch = 0; - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - num_rx_ch = params_channels(params); - pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_rx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - num_rx_ch, rx_ch); - if (ret < 0) { - pr_err("%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } else { - num_tx_ch = params_channels(params); - pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__, - codec_dai->name, codec_dai->id, num_tx_ch); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret < 0) { - pr_err("%s: failed to get tx codec chan map, err:%d\n", - __func__, ret); - goto err; - } - ret = snd_soc_dai_set_channel_map(cpu_dai, - num_tx_ch, tx_ch, 0, 0); - if (ret < 0) { - pr_err("%s: failed to set tx cpu chan map, err:%d\n", - __func__, ret); - goto err; - } - } - -err: - return ret; -} - -static int msm_wcn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai_link *dai_link = rtd->dai_link; - u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX]; - u32 rx_ch_cnt = 0, tx_ch_cnt = 0; - int ret; - - dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__, - codec_dai->name, codec_dai->id); - ret = snd_soc_dai_get_channel_map(codec_dai, - &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch); - if (ret) { - dev_err(rtd->dev, - "%s: failed to get BTFM codec chan map\n, err:%d\n", - __func__, ret); - goto err; - } - - dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n", - __func__, tx_ch_cnt, dai_link->id); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch); - if (ret) - dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n", - __func__, ret); - -err: - return ret; -} - -static int msm_get_port_id(int be_id) -{ - int afe_port_id; - - switch (be_id) { - case MSM_BACKEND_DAI_PRI_MI2S_RX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_PRI_MI2S_TX: - afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_SECONDARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_TERTIARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_RX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX; - break; - case MSM_BACKEND_DAI_QUINARY_MI2S_TX: - afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX; - break; - default: - pr_err("%s: Invalid BE id: %d\n", __func__, be_id); - afe_port_id = -EINVAL; - } - - return afe_port_id; -} - -static u32 get_mi2s_bits_per_sample(u32 bit_format) -{ - u32 bit_per_sample; - - switch (bit_format) { - case SNDRV_PCM_FORMAT_S32_LE: - case SNDRV_PCM_FORMAT_S24_3LE: - case SNDRV_PCM_FORMAT_S24_LE: - bit_per_sample = 32; - break; - case SNDRV_PCM_FORMAT_S16_LE: - default: - bit_per_sample = 16; - break; - } - - return bit_per_sample; -} - -static void update_mi2s_clk_val(int dai_id, int stream) -{ - u32 bit_per_sample; - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } else { - bit_per_sample = - get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format); - mi2s_clk[dai_id].clk_freq_in_hz = - mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample; - } -} - -static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int port_id = 0; - int index = cpu_dai->id; - - port_id = msm_get_port_id(rtd->dai_link->id); - if (port_id < 0) { - dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__); - ret = port_id; - goto err; - } - - if (enable) { - update_mi2s_clk_val(index, substream->stream); - dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__, - mi2s_clk[index].clk_freq_in_hz); - } - - mi2s_clk[index].enable = enable; - ret = afe_set_lpass_clock_v2(port_id, - &mi2s_clk[index]); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed for port 0x%x , err:%d\n", - __func__, port_id, ret); - goto err; - } - -err: - return ret; -} - -static int msm_set_pinctrl(struct msm_pinctrl_info *pinctrl_info, - enum pinctrl_pin_state new_state) -{ - int ret = 0; - int curr_state = 0; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - if (pinctrl_info->pinctrl == NULL) { - pr_err("%s: pinctrl_info->pinctrl is NULL\n", __func__); - ret = -EINVAL; - goto err; - } - - curr_state = pinctrl_info->curr_state; - pinctrl_info->curr_state = new_state; - pr_debug("%s: curr_state = %s new_state = %s\n", __func__, - pin_states[curr_state], pin_states[pinctrl_info->curr_state]); - - if (curr_state == pinctrl_info->curr_state) { - pr_debug("%s: Already in same state\n", __func__); - goto err; - } - - if (curr_state != STATE_DISABLE && - pinctrl_info->curr_state != STATE_DISABLE) { - pr_debug("%s: state already active cannot switch\n", __func__); - ret = -EIO; - goto err; - } - - switch (pinctrl_info->curr_state) { - case STATE_MI2S_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_active); - if (ret) { - pr_err("%s: MI2S state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_TDM_ACTIVE: - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_active); - if (ret) { - pr_err("%s: TDM state select failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - case STATE_DISABLE: - if (curr_state == STATE_MI2S_ACTIVE) { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - } else { - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->tdm_disable); - } - if (ret) { - pr_err("%s: state disable failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - break; - default: - pr_err("%s: TLMM pin state is invalid\n", __func__); - return -EINVAL; - } - -err: - return ret; -} - -static void msm_release_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info->pinctrl) { - devm_pinctrl_put(pinctrl_info->pinctrl); - pinctrl_info->pinctrl = NULL; - } -} - -static int msm_get_pinctrl(struct platform_device *pdev) -{ - struct snd_soc_card *card = platform_get_drvdata(pdev); - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = NULL; - struct pinctrl *pinctrl; - int ret; - - pinctrl_info = &pdata->pinctrl_info; - - if (pinctrl_info == NULL) { - pr_err("%s: pinctrl_info is NULL\n", __func__); - return -EINVAL; - } - - pinctrl = devm_pinctrl_get(&pdev->dev); - if (IS_ERR_OR_NULL(pinctrl)) { - pr_err("%s: Unable to get pinctrl handle\n", __func__); - return -EINVAL; - } - pinctrl_info->pinctrl = pinctrl; - - /* get all the states handles from Device Tree */ - pinctrl_info->mi2s_disable = pinctrl_lookup_state(pinctrl, - "quat_mi2s_disable"); - if (IS_ERR(pinctrl_info->mi2s_disable)) { - pr_err("%s: could not get mi2s_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->mi2s_active = pinctrl_lookup_state(pinctrl, - "quat_mi2s_enable"); - if (IS_ERR(pinctrl_info->mi2s_active)) { - pr_err("%s: could not get mi2s_active pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_disable = pinctrl_lookup_state(pinctrl, - "quat_tdm_disable"); - if (IS_ERR(pinctrl_info->tdm_disable)) { - pr_err("%s: could not get tdm_disable pinstate\n", __func__); - goto err; - } - pinctrl_info->tdm_active = pinctrl_lookup_state(pinctrl, - "quat_tdm_enable"); - if (IS_ERR(pinctrl_info->tdm_active)) { - pr_err("%s: could not get tdm_active pinstate\n", - __func__); - goto err; - } - /* Reset the TLMM pins to a default state */ - ret = pinctrl_select_state(pinctrl_info->pinctrl, - pinctrl_info->mi2s_disable); - if (ret != 0) { - pr_err("%s: Disable TLMM pins failed with %d\n", - __func__, ret); - ret = -EIO; - goto err; - } - pinctrl_info->curr_state = STATE_DISABLE; - atomic_set(&(pinctrl_info->pinctrl_ref_count), 0); - - return 0; - -err: - devm_pinctrl_put(pinctrl); - pinctrl_info->pinctrl = NULL; - return -EINVAL; -} - -static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - if (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate; - } else if (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX_1) { - channels->min = channels->max = - tdm_rx_cfg[TDM_QUAT][TDM_1].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUAT][TDM_1].bit_format); - rate->min = rate->max = - tdm_rx_cfg[TDM_QUAT][TDM_1].sample_rate; - } else if (cpu_dai->id == AFE_PORT_ID_SECONDARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_SEC][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_SEC][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate; - } else if (cpu_dai->id == AFE_PORT_ID_QUINARY_TDM_RX) { - channels->min = channels->max = - tdm_rx_cfg[TDM_QUIN][TDM_0].channels; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format); - rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate; - } else { - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n", - __func__, cpu_dai->id, channels->max, rate->max, - params_format(params)); - - return 0; -} - -static int sm8150_tdm_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int ret = 0; - int slot_width = TDM_SLOT_WIDTH_BITS; - int channels, slots = TDM_MAX_SLOTS; - unsigned int slot_mask, rate, clk_freq; - unsigned int *slot_offset; - unsigned int path_dir = 0, interface = 0, channel_interface = 0; - - - pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id); - - if (cpu_dai->id < AFE_PORT_ID_TDM_PORT_RANGE_START) { - pr_err("%s: dai id 0x%x not supported\n", - __func__, cpu_dai->id); - return -EINVAL; - } - - /* RX or TX */ - path_dir = cpu_dai->id % 2; - - /* PRI, SEC, TERT, QUAT, QUIN */ - interface = (cpu_dai->id - AFE_PORT_ID_TDM_PORT_RANGE_START) - / (2 * TDM_PORT_MAX); - - /* 0, 1, 2, .. 7 */ - channel_interface = - ((cpu_dai->id - AFE_PORT_ID_TDM_PORT_RANGE_START) / 2) - % TDM_PORT_MAX; - - pr_debug("%s: interface %u, channel interface %u\n", __func__, - interface, channel_interface); - - slot_offset = tdm_cfg[(interface * 2) + path_dir][channel_interface] - .tdm_slot_offset; - - if (path_dir) - channels = tdm_tx_cfg[interface][channel_interface].channels; - else - channels = tdm_rx_cfg[interface][channel_interface].channels; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - - pr_debug("%s: tdm rx slot_width %d slots %d slot_mask %x\n", - __func__, slot_width, slots, slot_mask); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm rx slot, err:%d\n", - __func__, ret); - goto end; - } - - pr_debug("%s: tdm rx slot_offset[0]: %d, slot_offset[1]: %d\n", - __func__, slot_offset[0], slot_offset[1]); - - ret = snd_soc_dai_set_channel_map(cpu_dai, - 0, NULL, channels, slot_offset); - if (ret < 0) { - pr_err("%s: failed to set tdm rx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - /*2 slot config - bits 0 and 1 set for the first two slots */ - slot_mask = 0x0000FFFF >> (16-slots); - - pr_debug("%s: tdm tx slot_width %d slots %d\n", - __func__, slot_width, slots); - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0, - slots, slot_width); - if (ret < 0) { - pr_err("%s: failed to set tdm tx slot, err:%d\n", - __func__, ret); - goto end; - } - - ret = snd_soc_dai_set_channel_map(cpu_dai, - channels, slot_offset, 0, NULL); - if (ret < 0) { - pr_err("%s: failed to set tdm tx channel map, err:%d\n", - __func__, ret); - goto end; - } - } else { - ret = -EINVAL; - pr_err("%s: invalid use case, err:%d\n", - __func__, ret); - goto end; - } - - rate = params_rate(params); - clk_freq = rate * slot_width * slots; - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT); - if (ret < 0) - pr_err("%s: failed to set tdm clk, err:%d\n", - __func__, ret); - -end: - return ret; -} - -static int sm8150_tdm_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - /* currently only supporting TDM_RX_0/TDM_RX_1 and TDM_TX_0 */ - if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX_1)) { - if (atomic_read(&(pinctrl_info->pinctrl_ref_count)) == 0) { - ret = msm_set_pinctrl(pinctrl_info, STATE_TDM_ACTIVE); - if (ret) - pr_err("%s: TDM TLMM pinctrl set failed with %d\n", - __func__, ret); - } - atomic_inc(&(pinctrl_info->pinctrl_ref_count)); - } - - return ret; -} - -static void sm8150_tdm_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - - /* currently only supporting TDM_RX_0/TDM_RX_1 and TDM_TX_0 */ - if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX) || - (cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX_1)) { - atomic_dec(&(pinctrl_info->pinctrl_ref_count)); - if (atomic_read(&(pinctrl_info->pinctrl_ref_count)) == 0) { - ret = msm_set_pinctrl(pinctrl_info, STATE_DISABLE); - if (ret) - pr_err("%s: TDM TLMM pinctrl set failed with %d\n", - __func__, ret); - } - } -} - -static struct snd_soc_ops sm8150_tdm_be_ops = { - .hw_params = sm8150_tdm_snd_hw_params, - .startup = sm8150_tdm_snd_startup, - .shutdown = sm8150_tdm_snd_shutdown -}; - -static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) -{ - cpumask_t mask; - - if (pm_qos_request_active(&substream->latency_pm_qos_req)) - pm_qos_remove_request(&substream->latency_pm_qos_req); - - cpumask_clear(&mask); - cpumask_set_cpu(1, &mask); /* affine to core 1 */ - cpumask_set_cpu(2, &mask); /* affine to core 2 */ - cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask); - - substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES; - - pm_qos_add_request(&substream->latency_pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - MSM_LL_QOS_VALUE); - return 0; -} - -static struct snd_soc_ops msm_fe_qos_ops = { - .prepare = msm_fe_qos_prepare, -}; - -static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) -{ - int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - int index = cpu_dai->id; - unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - dev_dbg(rtd->card->dev, - "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", - __func__, substream->name, substream->stream, - cpu_dai->name, cpu_dai->id); - - if (index < PRIM_MI2S || index >= MI2S_MAX) { - ret = -EINVAL; - dev_err(rtd->card->dev, - "%s: CPU DAI id (%d) out of range\n", - __func__, cpu_dai->id); - goto err; - } - /* - * Mutex protection in case the same MI2S - * interface using for both TX and RX so - * that the same clock won't be enable twice. - */ - mutex_lock(&mi2s_intf_conf[index].lock); - if (++mi2s_intf_conf[index].ref_cnt == 1) { - /* Check if msm needs to provide the clock to the interface */ - if (!mi2s_intf_conf[index].msm_is_mi2s_master) { - mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; - fmt = SND_SOC_DAIFMT_CBM_CFM; - } - ret = msm_mi2s_set_sclk(substream, true); - if (ret < 0) { - dev_err(rtd->card->dev, - "%s: afe lpass clock failed to enable MI2S clock, err:%d\n", - __func__, ret); - goto clean_up; - } - - ret = snd_soc_dai_set_fmt(cpu_dai, fmt); - if (ret < 0) { - pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n", - __func__, index, ret); - goto clk_off; - } - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_MI2S_ACTIVE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } - } - - snd_soc_codec_set_sysclk(rtd->codec_dai->codec, 0, 0, - mi2s_clk[index].clk_freq_in_hz, - SND_SOC_CLOCK_IN); - -clk_off: - if (ret < 0) - msm_mi2s_set_sclk(substream, false); -clean_up: - if (ret < 0) - mi2s_intf_conf[index].ref_cnt--; - mutex_unlock(&mi2s_intf_conf[index].lock); -err: - return ret; -} - -static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) -{ - int ret; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int index = rtd->cpu_dai->id; - struct snd_soc_card *card = rtd->card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info; - int ret_pinctrl = 0; - - pr_debug("%s(): substream = %s stream = %d\n", __func__, - substream->name, substream->stream); - if (index < PRIM_MI2S || index >= MI2S_MAX) { - pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index); - return; - } - - mutex_lock(&mi2s_intf_conf[index].lock); - if (--mi2s_intf_conf[index].ref_cnt == 0) { - ret = msm_mi2s_set_sclk(substream, false); - if (ret < 0) - pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", - __func__, index, ret); - if (index == QUAT_MI2S) { - ret_pinctrl = msm_set_pinctrl(pinctrl_info, - STATE_DISABLE); - if (ret_pinctrl) - pr_err("%s: MI2S TLMM pinctrl set failed with %d\n", - __func__, ret_pinctrl); - } - } - mutex_unlock(&mi2s_intf_conf[index].lock); -} - -static struct snd_soc_ops msm_mi2s_be_ops = { - .startup = msm_mi2s_snd_startup, - .shutdown = msm_mi2s_snd_shutdown, -}; - -/* use qcom default be ops */ -#if 0 -static int msm_hw_params_cs35l41_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, SNDRV_PCM_FORMAT_S16_LE); - - pr_debug("%s()\n", __func__); - rate->min = rate->max = 48000; - channels->min = channels->max = 2; - - return 0; -} - -static int msm_mi2s_cs35l41_startup(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_card *card = rtd->card; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_codec *codec = codec_dai->codec; - int ret; - - if (atomic_inc_return(&cs35l41_mclk_rsc_ref) == 1) { - ret = msm_mi2s_snd_startup(substream); - if (ret) { - dev_err(card->dev, "%s: Failed to startup mi2s: %d\n", __func__, ret); - return ret; - } - - // Set cpu_dai as master - ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS); - if (ret < 0) { - dev_err(card->dev, "%s: Failed to set fmt cpu dai: %d\n", __func__, ret); - return ret; - } - - // Set codec_dai as slave - ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_I2S); - if (ret < 0) { - dev_err(card->dev, "%s: Failed to set fmt codec dai: %d\n", __func__, ret); - return ret; - } - - // Set mclk to 12.288MHz for codec - ret = snd_soc_codec_set_sysclk(codec, 0, 0, - Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ, - SND_SOC_CLOCK_IN); - if (ret < 0) { - dev_err(card->dev, "%s: Failed to set codec_sysclk: %d\n", __func__, ret); - return ret; - } - } - dev_info(card->dev, "------%s\n", __func__); - return 0; -} - -void msm_mi2s_cs35l41_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_card *card = rtd->card; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_codec *codec = codec_dai->codec; - struct msm_asoc_mach_data *pdata = pdata = snd_soc_card_get_drvdata(codec->component.card); - - dev_info(card->dev, "+++++%s, mclk refcount = %d \n", __func__, atomic_read(&cs35l41_mclk_rsc_ref)); - - if (atomic_dec_return(&cs35l41_mclk_rsc_ref) == 0) { - msm_mi2s_snd_shutdown(substream); - } - - dev_info(card->dev, "-----%s\n", __func__); - return; -} - -static struct snd_soc_ops msm_mi2s_cs35l41_be_ops = { - .startup = msm_mi2s_cs35l41_startup, - .shutdown = msm_mi2s_cs35l41_shutdown, -}; -#endif - -static struct snd_soc_ops msm_be_ops = { - .hw_params = msm_snd_hw_params, -}; - -static struct snd_soc_ops msm_slimbus_2_be_ops = { - .hw_params = msm_slimbus_2_hw_params, -}; - -static struct snd_soc_ops msm_wcn_ops = { - .hw_params = msm_wcn_hw_params, -}; - - -/* Digital audio interface glue - connects codec <---> CPU */ -static struct snd_soc_dai_link msm_common_dai_links[] = { - /* FrontEnd DAI Links */ - { - .name = MSM_DAILINK_NAME(Media1), - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - { - .name = MSM_DAILINK_NAME(Media2), - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - { - .name = "VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - { - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_VOIP, - }, - { - .name = MSM_DAILINK_NAME(ULL), - .stream_name = "MultiMedia3", - .cpu_dai_name = "MultiMedia3", - .platform_name = "msm-pcm-dsp.2", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA3, - }, - /* Hostless PCM purpose */ - { - .name = "SLIMBUS_0 Hostless", - .stream_name = "SLIMBUS_0 Hostless", - .cpu_dai_name = "SLIMBUS0_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .dpcm_playback = 1, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - { - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .dpcm_capture = 1, - .ignore_suspend = 1, - }, - { - .name = MSM_DAILINK_NAME(Compress1), - .stream_name = "Compress1", - .cpu_dai_name = "MultiMedia4", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA4, - }, - { - .name = "AUXPCM Hostless", - .stream_name = "AUXPCM Hostless", - .cpu_dai_name = "AUXPCM_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_1 Hostless", - .stream_name = "SLIMBUS_1 Hostless", - .cpu_dai_name = "SLIMBUS1_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_3 Hostless", - .stream_name = "SLIMBUS_3 Hostless", - .cpu_dai_name = "SLIMBUS3_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_4 Hostless", - .stream_name = "SLIMBUS_4 Hostless", - .cpu_dai_name = "SLIMBUS4_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = MSM_DAILINK_NAME(LowLatency), - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA5, - .ops = &msm_fe_qos_ops, - }, - { - .name = "Listen 1 Audio Service", - .stream_name = "Listen 1 Audio Service", - .cpu_dai_name = "LSM1", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM1, - }, - /* Multiple Tunnel instances */ - { - .name = MSM_DAILINK_NAME(Compress2), - .stream_name = "Compress2", - .cpu_dai_name = "MultiMedia7", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA7, - }, - { - .name = MSM_DAILINK_NAME(MultiMedia10), - .stream_name = "MultiMedia10", - .cpu_dai_name = "MultiMedia10", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA10, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ), - .stream_name = "MM_NOIRQ", - .cpu_dai_name = "MultiMedia8", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA8, - .ops = &msm_fe_qos_ops, - }, - /* HDMI Hostless */ - { - .name = "HDMI_RX_HOSTLESS", - .stream_name = "HDMI_RX_HOSTLESS", - .cpu_dai_name = "HDMI_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - /* LSM FE */ - { - .name = "Listen 2 Audio Service", - .stream_name = "Listen 2 Audio Service", - .cpu_dai_name = "LSM2", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM2, - }, - { - .name = "Listen 3 Audio Service", - .stream_name = "Listen 3 Audio Service", - .cpu_dai_name = "LSM3", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM3, - }, - { - .name = "Listen 4 Audio Service", - .stream_name = "Listen 4 Audio Service", - .cpu_dai_name = "LSM4", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM4, - }, - { - .name = "Listen 5 Audio Service", - .stream_name = "Listen 5 Audio Service", - .cpu_dai_name = "LSM5", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM5, - }, - { - .name = "Listen 6 Audio Service", - .stream_name = "Listen 6 Audio Service", - .cpu_dai_name = "LSM6", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM6, - }, - { - .name = "Listen 7 Audio Service", - .stream_name = "Listen 7 Audio Service", - .cpu_dai_name = "LSM7", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM7, - }, - { - .name = "Listen 8 Audio Service", - .stream_name = "Listen 8 Audio Service", - .cpu_dai_name = "LSM8", - .platform_name = "msm-lsm-client", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = { SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST }, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .id = MSM_FRONTEND_DAI_LSM8, - }, - { - .name = MSM_DAILINK_NAME(Media9), - .stream_name = "MultiMedia9", - .cpu_dai_name = "MultiMedia9", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA9, - }, - { - .name = MSM_DAILINK_NAME(Compress4), - .stream_name = "Compress4", - .cpu_dai_name = "MultiMedia11", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA11, - }, - { - .name = MSM_DAILINK_NAME(Compress5), - .stream_name = "Compress5", - .cpu_dai_name = "MultiMedia12", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA12, - }, - { - .name = MSM_DAILINK_NAME(Compress6), - .stream_name = "Compress6", - .cpu_dai_name = "MultiMedia13", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA13, - }, - { - .name = MSM_DAILINK_NAME(Compress7), - .stream_name = "Compress7", - .cpu_dai_name = "MultiMedia14", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA14, - }, - { - .name = MSM_DAILINK_NAME(Compress8), - .stream_name = "Compress8", - .cpu_dai_name = "MultiMedia15", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA15, - }, - { - .name = MSM_DAILINK_NAME(ULL_NOIRQ_2), - .stream_name = "MM_NOIRQ_2", - .cpu_dai_name = "MultiMedia16", - .platform_name = "msm-pcm-dsp-noirq", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .id = MSM_FRONTEND_DAI_MULTIMEDIA16, - .ops = &msm_fe_qos_ops, - }, - { - .name = "SLIMBUS_8 Hostless", - .stream_name = "SLIMBUS8_HOSTLESS Capture", - .cpu_dai_name = "SLIMBUS8_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -}; - -static struct snd_soc_dai_link msm_pahu_fe_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx2", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = { -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - { - .name = TFA_TX_HOSTLESS_CODEC_NAME, - .stream_name = TFA_TX_HOSTLESS_STREAM_NAME, - .cpu_dai_name = TFA_TX_HOSTLESS_CPU_DAI_NAME, - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dailink has playback support */ - .ignore_pmdown_time = 1, - /* This dainlink has MI2S support */ - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, -#else - { - .name = LPASS_BE_SLIMBUS_4_TX, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - }, -#endif - /* Ultrasound RX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Playback", - .stream_name = "SLIMBUS_2 Hostless Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, - /* Ultrasound TX DAI Link */ - { - .name = "SLIMBUS_2 Hostless Capture", - .stream_name = "SLIMBUS_2 Hostless Capture", - .cpu_dai_name = "msm-dai-q6-dev.16389", - .platform_name = "msm-pcm-hostless", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx2", - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ops = &msm_slimbus_2_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { - { - .name = MSM_DAILINK_NAME(ASM Loopback), - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "USB Audio Hostless", - .stream_name = "USB Audio Hostless", - .cpu_dai_name = "USBAUDIO_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "SLIMBUS_7 Hostless", - .stream_name = "SLIMBUS_7 Hostless", - .cpu_dai_name = "SLIMBUS7_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Compress Capture", - .stream_name = "Compress9", - .cpu_dai_name = "MultiMedia17", - .platform_name = "msm-compress-dsp", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA17, - }, - { - .name = "Quaternary MI2S_RX Hostless Playback", - .stream_name = "Quaternary MI2S_RX Hostless Playback", - .cpu_dai_name = "QUAT_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "Quaternary MI2S_TX Hostless Capture", - .stream_name = "Quaternary MI2S_TX Hostless Capture", - .cpu_dai_name = "QUAT_MI2S_TX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "MultiMedia30 Playback", - .stream_name = "MultiMedia30", - .cpu_dai_name = "MultiMedia30", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA30, - }, - { - .name = "MultiMedia31 Playback", - .stream_name = "MultiMedia31", - .cpu_dai_name = "MultiMedia31", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA31, - }, -}; - -static struct snd_soc_dai_link msm_common_be_dai_links[] = { - /* Backend AFE DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AFE_PCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Incall Music 2 BACK END DAI Link */ - { - .name = LPASS_BE_VOICE2_PLAYBACK_TX, - .stream_name = "Voice2 Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32770", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - /* Proxy Tx BACK END DAI Link */ - { - .name = LPASS_BE_PROXY_TX, - .stream_name = "Proxy Capture", - .cpu_dai_name = "msm-dai-q6-dev.8195", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PROXY_TX, - .ignore_suspend = 1, - }, - /* Proxy Rx BACK END DAI Link */ - { - .name = LPASS_BE_PROXY_RX, - .stream_name = "Proxy Playback", - .cpu_dai_name = "msm-dai-q6-dev.8194", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PROXY_RX, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_RX, - .stream_name = "USB Audio Playback", - .cpu_dai_name = "msm-dai-q6-dev.28672", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_USB_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_USB_AUDIO_TX, - .stream_name = "USB Audio Capture", - .cpu_dai_name = "msm-dai-q6-dev.28673", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_USB_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_TDM_RX_0, - .stream_name = "Primary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36864", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_TDM_TX_0, - .stream_name = "Primary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36865", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_TDM_RX_0, - .stream_name = "Secondary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36880", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_TDM_TX_0, - .stream_name = "Secondary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36881", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_TDM_RX_0, - .stream_name = "Tertiary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36896", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_RX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_TDM_TX_0, - .stream_name = "Tertiary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36897", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_0, - .stream_name = "Quaternary TDM0 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36912", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0, - .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_TX_0, - .stream_name = "Quaternary TDM0 Capture", - .cpu_dai_name = "msm-dai-q6-tdm.36913", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_TDM_RX_1, - .stream_name = "Quaternary TDM1 Playback", - .cpu_dai_name = "msm-dai-q6-tdm.36914", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_TDM_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &sm8150_tdm_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, -}; - -static struct snd_soc_dai_link msm_pahu_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "pahu_codec", - .codec_dai_name = "pahu_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - }, -}; - -static struct snd_soc_dai_link msm_tavil_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_1_RX, - .stream_name = "Slimbus1 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16386", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_1_TX, - .stream_name = "Slimbus1 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16387", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx3", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_1_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_2_RX, - .stream_name = "Slimbus2 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16388", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx2", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_2_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_RX, - .stream_name = "Slimbus3 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16390", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_3_TX, - .stream_name = "Slimbus3 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16391", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_3_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_4_RX, - .stream_name = "Slimbus4 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16392", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_4_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_5_RX, - .stream_name = "Slimbus5 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16394", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx3", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* MAD BE */ - { - .name = LPASS_BE_SLIMBUS_5_TX, - .stream_name = "Slimbus5 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16395", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_mad1", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_5_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_6_RX, - .stream_name = "Slimbus6 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16396", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_rx4", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_6_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* Slimbus VI Recording */ - { - .name = LPASS_BE_SLIMBUS_TX_VI, - .stream_name = "Slimbus4 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16393", - .platform_name = "msm-pcm-routing", - .codec_name = "tavil_codec", - .codec_dai_name = "tavil_vifeedback", - .id = MSM_BACKEND_DAI_SLIMBUS_4_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_be_ops, - .ignore_suspend = 1, - .no_pcm = 1, - .dpcm_capture = 1, - }, -}; - -static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { - { - .name = LPASS_BE_SLIMBUS_7_RX, - .stream_name = "Slimbus7 Playback", - .cpu_dai_name = "msm-dai-q6-dev.16398", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - /* BT codec driver determines capabilities based on - * dai name, bt codecdai name should always contains - * supported usecase information - */ - .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - /* dai link has playback support */ - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_7_TX, - .stream_name = "Slimbus7 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16399", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_bt_sco_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_7_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SLIMBUS_8_TX, - .stream_name = "Slimbus8 Capture", - .cpu_dai_name = "msm-dai-q6-dev.16401", - .platform_name = "msm-pcm-routing", - .codec_name = "btfmslim_slave", - .codec_dai_name = "btfm_fm_slim_tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_8_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .init = &msm_wcn_init, - .ops = &msm_wcn_ops, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link ext_disp_be_dai_link[] = { - /* DISP PORT BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT, - .stream_name = "Display Port Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - /* DISP PORT 1 BACK END DAI Link */ - { - .name = LPASS_BE_DISPLAY_PORT1, - .stream_name = "Display Port1 Playback", - .cpu_dai_name = "msm-dai-q6-dp.24608", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-ext-disp-audio-codec-rx", - .codec_dai_name = "msm_dp_audio_codec_rx1_dai", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX_1, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = { - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_RX, - .stream_name = "Tertiary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_TERT_MI2S_TX, - .stream_name = "Tertiary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, -// { -// .name = LPASS_BE_QUAT_MI2S_RX, -// .stream_name = "Quaternary MI2S Playback", -// .cpu_dai_name = "msm-dai-q6-mi2s.3", -// .platform_name = "msm-pcm-routing", -// .codec_name = "msm-stub-codec.1", -// .codec_dai_name = "msm-stub-rx", -// .no_pcm = 1, -// .dpcm_playback = 1, -// .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, -// .be_hw_params_fixup = msm_be_hw_params_fixup, -// .ops = &msm_mi2s_be_ops, -// .ignore_suspend = 1, -// .ignore_pmdown_time = 1, -// }, - { - .name = LPASS_BE_QUAT_MI2S_TX, - .stream_name = "Quaternary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_RX, - .stream_name = "Quinary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = LPASS_BE_QUIN_MI2S_TX, - .stream_name = "Quinary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - }, - -}; - -static struct snd_soc_dai_link quat_mi2s_rx_tas2557_dai_links[] = { - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "tas2557.1-004c", - .codec_dai_name = "tas2557 ASI1", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, -}; - -static struct snd_soc_dai_link quat_mi2s_rx_tfa9874_dai_links[] = { - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = "tfa98xx.1-0034", - .codec_dai_name = "tfa98xx-aif-1-34", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, -}; - -static struct snd_soc_dai_link quat_mi2s_rx_cs35l41_dai_links[] = { - { - .name = LPASS_BE_QUAT_MI2S_RX, - .stream_name = "Quaternary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.3", - .platform_name = "msm-pcm-routing", - .codec_name = CS35L41_CODEC_NAME, - .codec_dai_name = "cs35l41-pcm", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ops = &msm_mi2s_be_ops, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, -}; - - -static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = { - /* Primary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Secondary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Tertiary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_TERT_AUXPCM_RX, - .stream_name = "Tert AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_TERT_AUXPCM_TX, - .stream_name = "Tert AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.3", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quaternary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUAT_AUXPCM_RX, - .stream_name = "Quat AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUAT_AUXPCM_TX, - .stream_name = "Quat AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.4", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Quinary AUX PCM Backend DAI Links */ - { - .name = LPASS_BE_QUIN_AUXPCM_RX, - .stream_name = "Quin AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_QUIN_AUXPCM_TX, - .stream_name = "Quin AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.5", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - }, -}; - -static struct snd_soc_dai_link msm_pahu_snd_card_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_pahu_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_pahu_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links)]; - -static struct snd_soc_dai_link msm_tavil_dai_links[ - ARRAY_SIZE(msm_common_dai_links) + - ARRAY_SIZE(msm_tavil_fe_dai_links) + - ARRAY_SIZE(msm_common_misc_fe_dai_links) + - ARRAY_SIZE(msm_common_be_dai_links) + - ARRAY_SIZE(msm_tavil_be_dai_links) + - ARRAY_SIZE(msm_wcn_be_dai_links) + - ARRAY_SIZE(ext_disp_be_dai_link) + - ARRAY_SIZE(msm_mi2s_be_dai_links) + - ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links) + - ARRAY_SIZE(quat_mi2s_rx_tfa9874_dai_links) + - ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links) + - ARRAY_SIZE(msm_auxpcm_be_dai_links)]; - -static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) -{ - const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; - struct snd_soc_pcm_runtime *rtd; - int ret = 0; - void *mbhc_calibration; -#ifdef CONFIG_SND_SOC_CS35L41_FOR_CEPH - struct snd_soc_dai_link *dai_link; - struct snd_soc_codec *cs35l41_codec; - struct snd_soc_dapm_context * cs35l41_dapm; -#endif - - - printk("<%s><%d>: E.\n", __func__, __LINE__); - rtd = snd_soc_get_pcm_runtime(card, be_dl_name); - if (!rtd) { - dev_err(card->dev, - "%s: snd_soc_get_pcm_runtime for %s failed!\n", - __func__, be_dl_name); - ret = -EINVAL; - goto err_pcm_runtime; - } - - mbhc_calibration = def_wcd_mbhc_cal(); - if (!mbhc_calibration) { - ret = -ENOMEM; - goto err_mbhc_cal; - } - wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = tavil_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); - if (ret) { - dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", - __func__, ret); - goto err_hs_detect; - } -#ifdef CONFIG_SND_SOC_CS35L41_FOR_CEPH -#if 0 - atomic_set(&cs35l41_mclk_rsc_ref, 0); - dev_info(card->dev, "%s: set cs35l41_mclk_rsc_ref to 0 \n", __func__); -#endif - - dai_link = rtd->dai_link; - if (dai_link && dai_link->codec_name) { - if (!strcmp(dai_link->codec_name, CS35L41_CODEC_NAME)) { - dev_info(card->dev, "%s: found codec[%s]\n", __func__, CS35L41_CODEC_NAME); - cs35l41_codec = rtd->codec; - cs35l41_dapm = snd_soc_codec_get_dapm(cs35l41_codec); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "AMP Playback"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "AMP Capture"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "DSP1"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "Main AMP"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPRX1"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPRX2"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPTX1"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "ASPTX2"); - snd_soc_dapm_ignore_suspend(cs35l41_dapm, "SPK"); - snd_soc_dapm_sync(cs35l41_dapm); - } - } -#endif - - printk("<%s><%d>: X.\n", __func__, __LINE__); - return 0; - -err_hs_detect: - kfree(mbhc_calibration); -err_mbhc_cal: -err_pcm_runtime: - printk("<%s><%d>: X, failed.\n", __func__, __LINE__); - return ret; -} - -struct snd_soc_card snd_soc_card_pahu_msm = { - .name = "sm8150-pahu-snd-card", -}; - -struct snd_soc_card snd_soc_card_tavil_msm = { - .name = "sm8150-tavil-snd-card", - .late_probe = msm_snd_card_tavil_late_probe, -}; - -static int msm_populate_dai_link_component_of_node( - struct snd_soc_card *card) -{ - int i, index, ret = 0; - struct device *cdev = card->dev; - struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; - - if (!cdev) { - pr_err("%s: Sound card device memory NULL\n", __func__); - return -ENODEV; - } - - for (i = 0; i < card->num_links; i++) { - if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node) - continue; - - /* populate platform_of_node for snd card dai links */ - if (dai_link[i].platform_name && - !dai_link[i].platform_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-platform-names", - dai_link[i].platform_name); - if (index < 0) { - pr_err("%s: No match found for platform name: %s\n", - __func__, dai_link[i].platform_name); - ret = index; - goto err; - } - np = of_parse_phandle(cdev->of_node, "asoc-platform", - index); - if (!np) { - pr_err("%s: retrieving phandle for platform %s, index %d failed\n", - __func__, dai_link[i].platform_name, - index); - ret = -ENODEV; - goto err; - } - dai_link[i].platform_of_node = np; - dai_link[i].platform_name = NULL; - } - - /* populate cpu_of_node for snd card dai links */ - if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-cpu-names", - dai_link[i].cpu_dai_name); - if (index >= 0) { - np = of_parse_phandle(cdev->of_node, "asoc-cpu", - index); - if (!np) { - pr_err("%s: retrieving phandle for cpu dai %s failed\n", - __func__, - dai_link[i].cpu_dai_name); - ret = -ENODEV; - goto err; - } - dai_link[i].cpu_of_node = np; - dai_link[i].cpu_dai_name = NULL; - } - } - - /* populate codec_of_node for snd card dai links */ - if (dai_link[i].codec_name && !dai_link[i].codec_of_node) { - index = of_property_match_string(cdev->of_node, - "asoc-codec-names", - dai_link[i].codec_name); - if (index < 0) - continue; - np = of_parse_phandle(cdev->of_node, "asoc-codec", - index); - if (!np) { - pr_err("%s: retrieving phandle for codec %s failed\n", - __func__, dai_link[i].codec_name); - ret = -ENODEV; - goto err; - } - dai_link[i].codec_of_node = np; - dai_link[i].codec_name = NULL; - } - } - -err: - return ret; -} - -static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - - ret = snd_soc_add_codec_controls(codec, msm_snd_controls, - ARRAY_SIZE(msm_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, - "%s: add_codec_controls failed, err = %d\n", - __func__, ret); - return ret; - } - - return 0; -} - -static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - - int ret = 0; - unsigned int rx_ch[] = {144, 145, 146, 147, 148, 149, 150, - 151}; - unsigned int tx_ch[] = {128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143}; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0, - slim_rx_cfg[SLIM_RX_0].channels, - rx_ch); - if (ret < 0) - pr_err("%s: RX failed to set cpu chan map error %d\n", - __func__, ret); - } else { - ret = snd_soc_dai_set_channel_map(cpu_dai, - slim_tx_cfg[SLIM_TX_0].channels, - tx_ch, 0, 0); - if (ret < 0) - pr_err("%s: TX failed to set cpu chan map error %d\n", - __func__, ret); - } - - return ret; -} - -static struct snd_soc_ops msm_stub_be_ops = { - .hw_params = msm_snd_stub_hw_params, -}; - -static struct snd_soc_dai_link msm_stub_fe_dai_links[] = { - - /* FrontEnd DAI Links */ - { - .name = "MSMSTUB Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, -}; - -static struct snd_soc_dai_link msm_stub_be_dai_links[] = { - - /* Backend DAI Links */ - { - .name = LPASS_BE_SLIMBUS_0_RX, - .stream_name = "Slimbus Playback", - .cpu_dai_name = "msm-dai-q6-dev.16384", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_RX, - .init = &msm_audrx_stub_init, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_pmdown_time = 1, /* dai link has playback support */ - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, - { - .name = LPASS_BE_SLIMBUS_0_TX, - .stream_name = "Slimbus Capture", - .cpu_dai_name = "msm-dai-q6-dev.16385", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .id = MSM_BACKEND_DAI_SLIMBUS_0_TX, - .be_hw_params_fixup = msm_be_hw_params_fixup, - .ignore_suspend = 1, - .ops = &msm_stub_be_ops, - }, -}; - -static struct snd_soc_dai_link msm_stub_dai_links[ - ARRAY_SIZE(msm_stub_fe_dai_links) + - ARRAY_SIZE(msm_stub_be_dai_links)]; - -struct snd_soc_card snd_soc_card_stub_msm = { - .name = "sm8150-stub-snd-card", -}; - -static const struct of_device_id sm8150_asoc_machine_of_match[] = { - { .compatible = "qcom,sm8150-asoc-snd-pahu", - .data = "pahu_codec"}, - { .compatible = "qcom,sm8150-asoc-snd-tavil", - .data = "tavil_codec"}, - { .compatible = "qcom,sm8150-asoc-snd-stub", - .data = "stub_codec"}, - {}, -}; - -static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) -{ - struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int len_1, len_2, len_3, len_4; - int total_links; - const struct of_device_id *match; - int ret = 0; - u32 val = 0; - - match = of_match_node(sm8150_asoc_machine_of_match, dev->of_node); - if (!match) { - dev_err(dev, "%s: No DT match found for sound card\n", - __func__); - return NULL; - } - - if (!strcmp(match->data, "pahu_codec")) { - card = &snd_soc_card_pahu_msm; - len_1 = ARRAY_SIZE(msm_common_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_pahu_fe_dai_links); - len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links); - len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links); - total_links = len_4 + ARRAY_SIZE(msm_pahu_be_dai_links); - memcpy(msm_pahu_snd_card_dai_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - memcpy(msm_pahu_snd_card_dai_links + len_1, - msm_pahu_fe_dai_links, - sizeof(msm_pahu_fe_dai_links)); - memcpy(msm_pahu_snd_card_dai_links + len_2, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - memcpy(msm_pahu_snd_card_dai_links + len_3, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - memcpy(msm_pahu_snd_card_dai_links + len_4, - msm_pahu_be_dai_links, - sizeof(msm_pahu_be_dai_links)); - - ret = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", &val); - if (!ret && val) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(msm_pahu_snd_card_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += ARRAY_SIZE(msm_wcn_be_dai_links); - } - - ret = of_property_read_u32(dev->of_node, - "qcom,ext-disp-audio-rx", &val); - if (!ret && val) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_pahu_snd_card_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - - ret = of_property_read_u32(dev->of_node, - "qcom,mi2s-audio-intf", &val); - if (!ret && val) { - memcpy(msm_pahu_snd_card_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - } - - ret = of_property_read_u32(dev->of_node, - "qcom,auxpcm-audio-intf", &val); - if (!ret && val) { - memcpy(msm_pahu_snd_card_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - - dailink = msm_pahu_snd_card_dai_links; - } else if (!strcmp(match->data, "tavil_codec")) { - card = &snd_soc_card_tavil_msm; - len_1 = ARRAY_SIZE(msm_common_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links); - len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links); - len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links); - total_links = len_4 + ARRAY_SIZE(msm_tavil_be_dai_links); - memcpy(msm_tavil_dai_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - memcpy(msm_tavil_dai_links + len_1, - msm_tavil_fe_dai_links, - sizeof(msm_tavil_fe_dai_links)); - memcpy(msm_tavil_dai_links + len_2, - msm_common_misc_fe_dai_links, - sizeof(msm_common_misc_fe_dai_links)); - memcpy(msm_tavil_dai_links + len_3, - msm_common_be_dai_links, - sizeof(msm_common_be_dai_links)); - memcpy(msm_tavil_dai_links + len_4, - msm_tavil_be_dai_links, - sizeof(msm_tavil_be_dai_links)); - - ret = of_property_read_u32(dev->of_node, "qcom,wcn-btfm", &val); - if (!ret && val) { - dev_dbg(dev, "%s(): WCN BTFM support present\n", - __func__); - memcpy(msm_tavil_dai_links + total_links, - msm_wcn_be_dai_links, - sizeof(msm_wcn_be_dai_links)); - total_links += ARRAY_SIZE(msm_wcn_be_dai_links); - } - - ret = of_property_read_u32(dev->of_node, - "qcom,ext-disp-audio-rx", &val); - if (!ret && val) { - dev_dbg(dev, "%s(): ext disp audio support present\n", - __func__); - memcpy(msm_tavil_dai_links + total_links, - ext_disp_be_dai_link, - sizeof(ext_disp_be_dai_link)); - total_links += ARRAY_SIZE(ext_disp_be_dai_link); - } - - ret = of_property_read_u32(dev->of_node, - "qcom,mi2s-audio-intf", &val); - if (!ret && val) { - memcpy(msm_tavil_dai_links + total_links, - msm_mi2s_be_dai_links, - sizeof(msm_mi2s_be_dai_links)); - total_links += ARRAY_SIZE(msm_mi2s_be_dai_links); - - if (get_hw_version_platform() == HARDWARE_PLATFORM_ANDROMEDA) { - memcpy(msm_tavil_dai_links + total_links, - quat_mi2s_rx_tas2557_dai_links, - sizeof(quat_mi2s_rx_tas2557_dai_links)); - total_links += ARRAY_SIZE(quat_mi2s_rx_tas2557_dai_links); - } else if (get_hw_version_platform() == HARDWARE_PLATFORM_CEPHEUS || - get_hw_version_platform() == HARDWARE_PLATFORM_HERCULES) { - memcpy(msm_tavil_dai_links + total_links, - quat_mi2s_rx_cs35l41_dai_links, - sizeof(quat_mi2s_rx_cs35l41_dai_links)); - total_links += ARRAY_SIZE(quat_mi2s_rx_cs35l41_dai_links); - } else if (get_hw_version_platform() == HARDWARE_PLATFORM_DAVINCI || - get_hw_version_platform() == HARDWARE_PLATFORM_RAPHAEL) { - memcpy(msm_tavil_dai_links + total_links, - quat_mi2s_rx_tfa9874_dai_links, - sizeof(quat_mi2s_rx_tfa9874_dai_links)); - total_links += ARRAY_SIZE(quat_mi2s_rx_tfa9874_dai_links); - } - } - - ret = of_property_read_u32(dev->of_node, - "qcom,auxpcm-audio-intf", &val); - if (!ret && val) { - memcpy(msm_tavil_dai_links + total_links, - msm_auxpcm_be_dai_links, - sizeof(msm_auxpcm_be_dai_links)); - total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links); - } - dailink = msm_tavil_dai_links; - } else if (!strcmp(match->data, "stub_codec")) { - card = &snd_soc_card_stub_msm; - len_1 = ARRAY_SIZE(msm_stub_fe_dai_links); - len_2 = len_1 + ARRAY_SIZE(msm_stub_be_dai_links); - - memcpy(msm_stub_dai_links, - msm_stub_fe_dai_links, - sizeof(msm_stub_fe_dai_links)); - memcpy(msm_stub_dai_links + len_1, - msm_stub_be_dai_links, - sizeof(msm_stub_be_dai_links)); - - dailink = msm_stub_dai_links; - total_links = len_2; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } - - return card; -} - -static int msm_wsa881x_init(struct snd_soc_component *component) -{ - u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {100, 101, 102, 106}; - u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {103, 104, 105, 107}; - unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200}; - unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3}; - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - struct msm_asoc_mach_data *pdata; - struct snd_soc_dapm_context *dapm; - int ret = 0; - - if (!codec) { - pr_err("%s codec is NULL\n", __func__); - return -EINVAL; - } - - dapm = snd_soc_codec_get_dapm(codec); - - if (!strcmp(component->name_prefix, "SpkrLeft")) { - dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkleft_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); - } - } else if (!strcmp(component->name_prefix, "SpkrRight")) { - dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n", - __func__, codec->component.name); - wsa881x_set_channel_map(codec, &spkright_ports[0], - WSA881X_MAX_SWR_PORTS, &ch_mask[0], - &ch_rate[0], NULL); - if (dapm->component) { - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); - snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); - } - } else { - dev_err(codec->dev, "%s: wrong codec name %s\n", __func__, - codec->component.name); - ret = -EINVAL; - goto err; - } - pdata = snd_soc_card_get_drvdata(component->card); - if (pdata && pdata->codec_root) - wsa881x_codec_info_create_codec_entry(pdata->codec_root, - codec); - -err: - return ret; -} - -static int msm_init_wsa_dev(struct platform_device *pdev, - struct snd_soc_card *card) -{ - struct device_node *wsa_of_node; - u32 wsa_max_devs; - u32 wsa_dev_cnt; - int i; - struct msm_wsa881x_dev_info *wsa881x_dev_info; - const char *wsa_auxdev_name_prefix[1]; - char *dev_name_str = NULL; - int found = 0; - int ret = 0; - - /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &wsa_max_devs); - if (ret) { - dev_info(&pdev->dev, - "%s: wsa-max-devs property missing in DT %s, ret = %d\n", - __func__, pdev->dev.of_node->full_name, ret); - card->num_aux_devs = 0; - return 0; - } - if (wsa_max_devs == 0) { - dev_warn(&pdev->dev, - "%s: Max WSA devices is 0 for this target?\n", - __func__); - card->num_aux_devs = 0; - return 0; - } - - /* Get count of WSA device phandles for this platform */ - wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node, - "qcom,wsa-devs", NULL); - if (wsa_dev_cnt == -ENOENT) { - dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n", - __func__); - goto err; - } else if (wsa_dev_cnt <= 0) { - dev_err(&pdev->dev, - "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n", - __func__, wsa_dev_cnt); - ret = -EINVAL; - goto err; - } - - /* - * Expect total phandles count to be NOT less than maximum possible - * WSA count. However, if it is less, then assign same value to - * max count as well. - */ - if (wsa_dev_cnt < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n", - __func__, wsa_max_devs, wsa_dev_cnt); - wsa_max_devs = wsa_dev_cnt; - } - - /* Make sure prefix string passed for each WSA device */ - ret = of_property_count_strings(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix"); - if (ret != wsa_dev_cnt) { - dev_err(&pdev->dev, - "%s: expecting %d wsa prefix. Defined only %d in DT\n", - __func__, wsa_dev_cnt, ret); - ret = -EINVAL; - goto err; - } - - /* - * 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), - GFP_KERNEL); - if (!wsa881x_dev_info) { - ret = -ENOMEM; - goto err; - } - - /* - * search and check whether all WSA devices are already - * registered with ALSA core or not. If found a node, store - * the node and the index in a local array of struct for later - * use. - */ - for (i = 0; i < wsa_dev_cnt; i++) { - wsa_of_node = of_parse_phandle(pdev->dev.of_node, - "qcom,wsa-devs", i); - if (unlikely(!wsa_of_node)) { - /* we should not be here */ - dev_err(&pdev->dev, - "%s: wsa dev node is not present\n", - __func__); - ret = -EINVAL; - goto err_free_dev_info; - } - if (soc_find_component_locked(wsa_of_node, NULL)) { - /* WSA device registered with ALSA core */ - wsa881x_dev_info[found].of_node = wsa_of_node; - wsa881x_dev_info[found].index = i; - found++; - if (found == wsa_max_devs) - break; - } - } - - if (found < wsa_max_devs) { - dev_dbg(&pdev->dev, - "%s: failed to find %d components. Found only %d\n", - __func__, wsa_max_devs, found); - return -EPROBE_DEFER; - } - dev_info(&pdev->dev, - "%s: found %d wsa881x devices registered with ALSA core\n", - __func__, found); - - card->num_aux_devs = wsa_max_devs; - card->num_configs = wsa_max_devs; - - /* Alloc array of AUX devs struct */ - msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_aux_dev), - GFP_KERNEL); - if (!msm_aux_dev) { - ret = -ENOMEM; - goto err_free_dev_info; - } - - /* Alloc array of codec conf struct */ - msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs, - sizeof(struct snd_soc_codec_conf), - GFP_KERNEL); - if (!msm_codec_conf) { - ret = -ENOMEM; - goto err_free_aux_dev; - } - - for (i = 0; i < card->num_aux_devs; i++) { - dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN, - GFP_KERNEL); - if (!dev_name_str) { - ret = -ENOMEM; - goto err_free_cdc_conf; - } - - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wsa-aux-dev-prefix", - wsa881x_dev_info[i].index, - wsa_auxdev_name_prefix); - if (ret) { - dev_err(&pdev->dev, - "%s: failed to read wsa aux dev prefix, ret = %d\n", - __func__, ret); - ret = -EINVAL; - goto err_free_dev_name_str; - } - - snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i); - msm_aux_dev[i].name = dev_name_str; - msm_aux_dev[i].codec_name = NULL; - msm_aux_dev[i].codec_of_node = - wsa881x_dev_info[i].of_node; - msm_aux_dev[i].init = msm_wsa881x_init; - msm_codec_conf[i].dev_name = NULL; - msm_codec_conf[i].name_prefix = wsa_auxdev_name_prefix[0]; - msm_codec_conf[i].of_node = - wsa881x_dev_info[i].of_node; - } - card->codec_conf = msm_codec_conf; - card->aux_dev = msm_aux_dev; - - return 0; - -err_free_dev_name_str: - devm_kfree(&pdev->dev, dev_name_str); -err_free_cdc_conf: - devm_kfree(&pdev->dev, msm_codec_conf); -err_free_aux_dev: - devm_kfree(&pdev->dev, msm_aux_dev); -err_free_dev_info: - devm_kfree(&pdev->dev, wsa881x_dev_info); -err: - return ret; -} - -static void msm_i2s_auxpcm_init(struct platform_device *pdev) -{ - int count; - u32 mi2s_master_slave[MI2S_MAX]; - int ret; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_init(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,msm-mi2s-master", - mi2s_master_slave, MI2S_MAX); - if (ret) { - dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n", - __func__); - } else { - for (count = 0; count < MI2S_MAX; count++) { - mi2s_intf_conf[count].msm_is_mi2s_master = - mi2s_master_slave[count]; - } - } -} - -static void msm_i2s_auxpcm_deinit(void) -{ - int count; - - for (count = 0; count < MI2S_MAX; count++) { - mutex_destroy(&mi2s_intf_conf[count].lock); - mi2s_intf_conf[count].ref_cnt = 0; - mi2s_intf_conf[count].msm_is_mi2s_master = 0; - } -} -static int msm_asoc_machine_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card; - struct msm_asoc_mach_data *pdata; - const char *mbhc_audio_jack_type = NULL; - int ret; - - printk("<%s><%d>: E.\n", __func__, __LINE__); - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, "No platform supplied from device tree\n"); - return -EINVAL; - } - - pdata = devm_kzalloc(&pdev->dev, - sizeof(struct msm_asoc_mach_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - card = populate_snd_card_dailinks(&pdev->dev); - if (!card) { - dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__); - ret = -EINVAL; - goto err; - } - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - snd_soc_card_set_drvdata(card, pdata); - - pdata->adc2_sel_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,adc2-switch-gpio", 0); - if (!pdata->adc2_sel_gpio_p) { - dev_err(&pdev->dev, "property %s not detected in node %s", - "qcom,adc2-switch-gpio", - pdev->dev.of_node->full_name); - } - - wcd_mbhc_cfg.dual_adc_gpio_node = pdata->adc2_sel_gpio_p; - wcd_mbhc_cfg.enable_dual_adc_gpio = external_enable_dual_adc_gpio; - pr_info("pdata->adc2_sel_gpio_p = %lx\n", (unsigned long)pdata->adc2_sel_gpio_p); - - pdata->usbc_en2_gpio = of_get_named_gpio(card->dev->of_node, - "qcom,usbc-analog-en2-gpio", 0); - if (!gpio_is_valid(pdata->usbc_en2_gpio)) { - dev_err(card->dev, "%s, property %s not in node %s", - __func__, "qcom,usbc-analog-en2-gpio", - card->dev->of_node->full_name); - } - - ret = snd_soc_of_parse_card_name(card, "qcom,model"); - if (ret) { - dev_err(&pdev->dev, "parse card name failed, err:%d\n", - ret); - goto err; - } - - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) { - dev_err(&pdev->dev, "parse audio routing failed, err:%d\n", - ret); - goto err; - } - - ret = msm_populate_dai_link_component_of_node(card); - if (ret) { - printk("<%s><%d>: HERE.\n", __func__, __LINE__); - ret = -EPROBE_DEFER; - goto err; - } - ret = msm_init_wsa_dev(pdev, card); - if (ret) { - goto err; - } - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret == -EPROBE_DEFER) { - if (codec_reg_done) - ret = -EINVAL; - goto err; - } else if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", - ret); - goto err; - } - dev_info(&pdev->dev, "Sound card %s registered\n", card->name); - spdev = pdev; - - INIT_WORK(&pdata->adsp_power_up_work, msm_adsp_power_up_config_work); - - ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (ret) { - dev_dbg(&pdev->dev, "%s: failed to add child nodes, ret=%d\n", - __func__, ret); - } else { - pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en1-gpio", 0); - if (!pdata->hph_en1_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s\n", - "qcom,hph-en1-gpio", - pdev->dev.of_node->full_name); - } - - pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,hph-en0-gpio", 0); - if (!pdata->hph_en0_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s\n", - "qcom,hph-en0-gpio", - pdev->dev.of_node->full_name); - } - } - - ret = of_property_read_string(pdev->dev.of_node, - "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type); - if (ret) { - dev_dbg(&pdev->dev, "Looking up %s property in node %s failed\n", - "qcom,mbhc-audio-jack-type", - pdev->dev.of_node->full_name); - dev_dbg(&pdev->dev, "Jack type properties set to default\n"); - } else { - if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "This hardware has 4 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 5 pole jack"); - } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) { - wcd_mbhc_cfg.enable_anc_mic_detect = true; - dev_dbg(&pdev->dev, "This hardware has 6 pole jack"); - } else { - wcd_mbhc_cfg.enable_anc_mic_detect = false; - dev_dbg(&pdev->dev, "Unknown value, set to default\n"); - } - } - /* - * Parse US-Euro gpio info from DT. Report no error if us-euro - * entry is not found in DT file as some targets do not support - * US-Euro detection - */ - pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node, - "qcom,us-euro-gpios", 0); - if (!pdata->us_euro_gpio_p) { - dev_dbg(&pdev->dev, "property %s not detected in node %s", - "qcom,us-euro-gpios", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "%s detected\n", - "qcom,us-euro-gpios"); - wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; - } - - if (wcd_mbhc_cfg.enable_usbc_analog) - wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic; - - pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node, - "fsa4480-i2c-handle", 0); - if (!pdata->fsa_handle) { - dev_dbg(&pdev->dev, "property %s not detected in node %s\n", - "fsa4480-i2c-handle", pdev->dev.of_node->full_name); - } else { - dev_dbg(&pdev->dev, "property %s is detected in node %s\n", - "fsa4480-i2c-handle", pdev->dev.of_node->full_name); - } - - /* Parse pinctrl info from devicetree */ - ret = msm_get_pinctrl(pdev); - if (!ret) { - pr_debug("%s: pinctrl parsing successful\n", __func__); - } else { - dev_dbg(&pdev->dev, - "%s: Parsing pinctrl failed with %d. Cannot use Ports\n", - __func__, ret); - ret = 0; - } - - msm_i2s_auxpcm_init(pdev); - is_initial_boot = true; - ret = audio_notifier_register("sm8150", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - - printk("<%s><%d>: X.\n", __func__, __LINE__); - - return 0; -err: - msm_release_pinctrl(pdev); - devm_kfree(&pdev->dev, pdata); - printk("<%s><%d>: X, failed.\n", __func__, __LINE__); - return ret; -} - -static int msm_asoc_machine_remove(struct platform_device *pdev) -{ - audio_notifier_deregister("sm8150"); - msm_i2s_auxpcm_deinit(); - - msm_release_pinctrl(pdev); - return 0; -} - -static struct platform_driver sm8150_asoc_machine_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - .pm = &snd_soc_pm_ops, - .of_match_table = sm8150_asoc_machine_of_match, - }, - .probe = msm_asoc_machine_probe, - .remove = msm_asoc_machine_remove, -}; - -int __init sm8150_init(void) -{ - pr_debug("%s\n", __func__); - return platform_driver_register(&sm8150_asoc_machine_driver); -} - -void sm8150_exit(void) -{ - pr_debug("%s\n", __func__); - platform_driver_unregister(&sm8150_asoc_machine_driver); -} - -MODULE_DESCRIPTION("ALSA SoC msm"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:" DRV_NAME); -MODULE_DEVICE_TABLE(of, sm8150_asoc_machine_of_match); diff --git a/techpack/audio/config/qcs405auto.conf b/techpack/audio/config/qcs405auto.conf deleted file mode 100644 index afa8140b6e04..000000000000 --- a/techpack/audio/config/qcs405auto.conf +++ /dev/null @@ -1,39 +0,0 @@ -CONFIG_PINCTRL_LPI=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD9335=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_SND_SOC_CSRA66X0=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_QCS405=m -CONFIG_SND_SOC_BOLERO=m -CONFIG_WSA_MACRO=m -CONFIG_VA_MACRO=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_MSTR_CTRL=m -CONFIG_SND_SOC_WCD_MBHC_LEGACY=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_AFE_HWDEP=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_MSM_MDF=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_SND_SOC_EP92=m -CONFIG_USE_Q6_32CH_SUPPORT=m diff --git a/techpack/audio/config/qcs405autoconf.h b/techpack/audio/config/qcs405autoconf.h deleted file mode 100644 index fd9407bdbce3..000000000000 --- a/techpack/audio/config/qcs405autoconf.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD9335 1 -#define CONFIG_SND_SOC_CSRA66X0 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_QCS405 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_LEGACY 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_AFE_HWDEP 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_MDF 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_SND_SOC_EP92 1 -#define CONFIG_USE_Q6_32CH_SUPPORT 1 diff --git a/techpack/audio/config/sdm660auto.conf b/techpack/audio/config/sdm660auto.conf deleted file mode 100644 index 10ca63b843fd..000000000000 --- a/techpack/audio/config/sdm660auto.conf +++ /dev/null @@ -1,51 +0,0 @@ -CONFIG_PINCTRL_LPI=m -CONFIG_PINCTRL_WCD=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD_DSP_MGR=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD_CPE=m -CONFIG_SND_SOC_CPE=m -CONFIG_SND_SOC_WCD9335=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_SDM660=m -CONFIG_MSM_GLINK_SPI_XPRT=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_WCD_CTRL=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_SND_SOC_WCD_MBHC_LEGACY=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_SND_SOC_EXT_CODEC=m -CONFIG_SND_SOC_INT_CODEC=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_MSM_AVTIMER=m -CONFIG_AVTIMER_LEGACY=m -CONFIG_SND_SOC_SDM660_CDC=m -CONFIG_SND_SOC_ANALOG_CDC=m -CONFIG_SND_SOC_DIGITAL_CDC=m -CONFIG_SND_SOC_MSM_SDW=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m diff --git a/techpack/audio/config/sdm660autoconf.h b/techpack/audio/config/sdm660autoconf.h deleted file mode 100644 index 426990103fc3..000000000000 --- a/techpack/audio/config/sdm660autoconf.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2017-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD9335 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_SND_SOC_SDM660 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_WCD_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_WCD_MBHC_LEGACY 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_AVTIMER_LEGACY 1 -#define CONFIG_SND_SOC_EXT_CODEC 1 -#define CONFIG_SND_SOC_INT_CODEC 1 -#define CONFIG_SND_SOC_CPE 1 -#define CONFIG_SND_SOC_SDM660_CDC 1 -#define CONFIG_SND_SOC_ANALOG_CDC 1 -#define CONFIG_SND_SOC_DIGITAL_CDC 1 -#define CONFIG_SND_SOC_MSM_SDW 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 diff --git a/techpack/audio/config/sdm670auto.conf b/techpack/audio/config/sdm670auto.conf deleted file mode 100644 index 4c0b284c9c96..000000000000 --- a/techpack/audio/config/sdm670auto.conf +++ /dev/null @@ -1,50 +0,0 @@ -CONFIG_PINCTRL_LPI=m -CONFIG_PINCTRL_WCD=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD_DSP_MGR=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD_CPE=m -CONFIG_SND_SOC_CPE=m -CONFIG_SND_SOC_WCD9335=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_GLINK=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_SDM670=m -CONFIG_MSM_GLINK_SPI_XPRT=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_WCD_CTRL=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_SND_SOC_WCD_MBHC_LEGACY=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_SND_SOC_EXT_CODEC=m -CONFIG_SND_SOC_INT_CODEC=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_SDM660_CDC=m -CONFIG_SND_SOC_ANALOG_CDC=m -CONFIG_SND_SOC_DIGITAL_CDC=m -CONFIG_SND_SOC_MSM_SDW=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m diff --git a/techpack/audio/config/sdm670auto_static.conf b/techpack/audio/config/sdm670auto_static.conf deleted file mode 100644 index 91a84649da8f..000000000000 --- a/techpack/audio/config/sdm670auto_static.conf +++ /dev/null @@ -1,50 +0,0 @@ -CONFIG_PINCTRL_LPI=y -CONFIG_PINCTRL_WCD=y -CONFIG_AUDIO_EXT_CLK=y -CONFIG_SND_SOC_WCD9XXX_V2=y -CONFIG_SND_SOC_WCD_MBHC=y -CONFIG_SND_SOC_WSA881X=y -CONFIG_SND_SOC_WCD_DSP_MGR=y -CONFIG_SND_SOC_WCD_SPI=y -CONFIG_SND_SOC_WCD_CPE=y -CONFIG_SND_SOC_CPE=y -CONFIG_SND_SOC_WCD9335=y -CONFIG_SND_SOC_WCD934X=y -CONFIG_SND_SOC_WCD934X_MBHC=y -CONFIG_SND_SOC_WCD934X_DSD=y -CONFIG_MSM_QDSP6V2_CODECS=y -CONFIG_MSM_ULTRASOUND=y -CONFIG_MSM_QDSP6_APRV2_GLINK=y -CONFIG_MSM_ADSP_LOADER=y -CONFIG_REGMAP_SWR=y -CONFIG_MSM_QDSP6_SSR=y -CONFIG_MSM_QDSP6_PDR=y -CONFIG_MSM_QDSP6_NOTIFIER=y -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_SND_SOC_SDM670=y -CONFIG_MSM_GLINK_SPI_XPRT=y -CONFIG_SOUNDWIRE=y -CONFIG_SOUNDWIRE_WCD_CTRL=y -CONFIG_SND_SOC_QDSP6V2=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_WCD9XXX_CODEC_CORE=y -CONFIG_MSM_CDC_PINCTRL=y -CONFIG_SND_SOC_WCD_MBHC_ADC=y -CONFIG_SND_SOC_WCD_MBHC_LEGACY=y -CONFIG_QTI_PP=y -CONFIG_SND_HWDEP_ROUTING=y -CONFIG_DTS_EAGLE=y -CONFIG_DOLBY_DS2=y -CONFIG_DOLBY_LICENSE=y -CONFIG_DTS_SRS_TM=y -CONFIG_SND_SOC_EXT_CODEC=y -CONFIG_SND_SOC_INT_CODEC=y -CONFIG_SND_SOC_MSM_STUB=y -CONFIG_WCD_DSP_GLINK=y -CONFIG_MSM_AVTIMER=y -CONFIG_SND_SOC_SDM660_CDC=y -CONFIG_SND_SOC_ANALOG_CDC=y -CONFIG_SND_SOC_DIGITAL_CDC=y -CONFIG_SND_SOC_MSM_SDW=y -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y diff --git a/techpack/audio/config/sdm670autoconf.h b/techpack/audio/config/sdm670autoconf.h deleted file mode 100644 index 55f9548fc44a..000000000000 --- a/techpack/audio/config/sdm670autoconf.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2017-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD9335 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_GLINK 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_SND_SOC_SDM670 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_WCD_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_WCD_MBHC_LEGACY 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_EXT_CODEC 1 -#define CONFIG_SND_SOC_INT_CODEC 1 -#define CONFIG_SND_SOC_CPE 1 -#define CONFIG_SND_SOC_SDM660_CDC 1 -#define CONFIG_SND_SOC_ANALOG_CDC 1 -#define CONFIG_SND_SOC_DIGITAL_CDC 1 -#define CONFIG_SND_SOC_MSM_SDW 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 diff --git a/techpack/audio/config/sdm845auto.conf b/techpack/audio/config/sdm845auto.conf deleted file mode 100644 index 4c195b43ddc6..000000000000 --- a/techpack/audio/config/sdm845auto.conf +++ /dev/null @@ -1,37 +0,0 @@ -CONFIG_PINCTRL_WCD=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SOUNDWIRE_WCD_CTRL=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_SND_SOC_MACHINE_SDM845=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_MSM_QDSP6V2_CODECS=y -CONFIG_MSM_ULTRASOUND=y -CONFIG_MSM_QDSP6_APRV2_GLINK=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_MSM_ADSP_LOADER=y -CONFIG_REGMAP_SWR=y -CONFIG_MSM_QDSP6_SSR=y -CONFIG_MSM_QDSP6_PDR=y -CONFIG_MSM_QDSP6_NOTIFIER=y -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y -CONFIG_SND_SOC_SDM845=y -CONFIG_MSM_GLINK_SPI_XPRT=y -CONFIG_SOUNDWIRE=y -CONFIG_SND_SOC_QDSP6V2=y -CONFIG_SND_SOC_WCD_MBHC_ADC=y -CONFIG_QTI_PP=y -CONFIG_SND_HWDEP_ROUTING=y -CONFIG_DTS_EAGLE=y -CONFIG_DOLBY_DS2=y -CONFIG_DOLBY_LICENSE=y -CONFIG_DTS_SRS_TM=y -CONFIG_SND_SOC_MSM_STUB=y -CONFIG_MSM_AVTIMER=y -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y diff --git a/techpack/audio/config/sdm845autoconf.h b/techpack/audio/config/sdm845autoconf.h deleted file mode 100644 index 6ef465a61871..000000000000 --- a/techpack/audio/config/sdm845autoconf.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2017-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_GLINK 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_SDM845 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_WCD_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 diff --git a/techpack/audio/config/sdxpoorwillsauto.conf b/techpack/audio/config/sdxpoorwillsauto.conf deleted file mode 100644 index dee34a08be5d..000000000000 --- a/techpack/audio/config/sdxpoorwillsauto.conf +++ /dev/null @@ -1,29 +0,0 @@ -CONFIG_PINCTRL_WCD=y -CONFIG_SND_SOC_WCD934X=y -CONFIG_AUDIO_EXT_CLK=y -CONFIG_SND_SOC_WCD9XXX_V2=y -CONFIG_SND_SOC_WCD_MBHC=y -CONFIG_SND_SOC_WSA881X=y -CONFIG_SND_SOC_WCD_DSP_MGR=y -CONFIG_SND_SOC_WCD934X=y -CONFIG_SND_SOC_WCD934X_MBHC=y -CONFIG_SND_SOC_WCD934X_DSD=y -CONFIG_MSM_QDSP6V2_CODECS=y -CONFIG_MSM_QDSP6_APRV3_GLINK=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_MSM_ADSP_LOADER=y -CONFIG_REGMAP_SWR=y -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_SND_SOC_POORWILLS=y -CONFIG_SOUNDWIRE=y -CONFIG_SOUNDWIRE_WCD_CTRL=y -CONFIG_SND_SOC_QDSP6V2=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_MSM_CDC_PINCTRL=y -CONFIG_WCD9XXX_CODEC_CORE=y -CONFIG_SND_SOC_WCD_MBHC_ADC=y -CONFIG_QTI_PP=y -CONFIG_SND_HWDEP_ROUTING=y -CONFIG_SND_SOC_MACHINE_SDXPOORWILLS=y -CONFIG_SND_SOC_MSM_STUB=y diff --git a/techpack/audio/config/sdxpoorwillsautoconf.h b/techpack/audio/config/sdxpoorwillsautoconf.h deleted file mode 100644 index 7b7dac403b63..000000000000 --- a/techpack/audio/config/sdxpoorwillsautoconf.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2017-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_QDSP6_APRV3_GLINK 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_SND_SOC_POORWILLS 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_WCD_CTRL 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_SND_SOC_MACHINE_SDXPOORWILLS 1 -#define CONFIG_SND_SOC_MSM_STUB 1 diff --git a/techpack/audio/config/sm6150auto.conf b/techpack/audio/config/sm6150auto.conf deleted file mode 100644 index f6074abbac0b..000000000000 --- a/techpack/audio/config/sm6150auto.conf +++ /dev/null @@ -1,48 +0,0 @@ -CONFIG_PINCTRL_WCD=m -CONFIG_PINCTRL_LPI=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD_DSP_MGR=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_SM6150=m -CONFIG_MSM_GLINK_SPI_XPRT=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_MSTR_CTRL=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_SND_SOC_BOLERO=m -CONFIG_WSA_MACRO=m -CONFIG_VA_MACRO=m -CONFIG_RX_MACRO=m -CONFIG_TX_MACRO=m -CONFIG_SND_SOC_WCD_IRQ=m -CONFIG_SND_SOC_WCD937X=m -CONFIG_SND_SOC_WCD937X_SLAVE=m -CONFIG_SND_EVENT=m diff --git a/techpack/audio/config/sm6150autoconf.h b/techpack/audio/config/sm6150autoconf.h deleted file mode 100644 index d69a9dec0f2e..000000000000 --- a/techpack/audio/config/sm6150autoconf.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_PINCTRL_LPI 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_SM6150 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_RX_MACRO 1 -#define CONFIG_TX_MACRO 1 -#define CONFIG_SND_SOC_WCD_IRQ 1 -#define CONFIG_SND_SOC_WCD937X 1 -#define CONFIG_SND_SOC_WCD937X_SLAVE 1 -#define CONFIG_SND_EVENT 1 diff --git a/techpack/audio/config/sm8150auto.conf b/techpack/audio/config/sm8150auto.conf deleted file mode 100644 index c55ec60eb7d7..000000000000 --- a/techpack/audio/config/sm8150auto.conf +++ /dev/null @@ -1,48 +0,0 @@ -CONFIG_PINCTRL_WCD=y -CONFIG_AUDIO_EXT_CLK=y -CONFIG_SND_SOC_WCD9XXX_V2=y -CONFIG_SND_SOC_WCD_MBHC=y -CONFIG_SND_SOC_WSA881X=y -CONFIG_SND_SOC_WCD9360=y -CONFIG_SND_SOC_WCD_DSP_MGR=y -CONFIG_SND_SOC_WCD_SPI=y -CONFIG_SND_SOC_WCD934X=y -CONFIG_SND_SOC_WCD934X_MBHC=y -CONFIG_SND_SOC_WCD934X_DSD=y -CONFIG_SND_SOC_WCD_CPE=y -CONFIG_SOUNDWIRE_WCD_CTRL=y -CONFIG_WCD9XXX_CODEC_CORE=y -CONFIG_MSM_CDC_PINCTRL=y -CONFIG_MSM_QDSP6V2_CODECS=y -CONFIG_MSM_ULTRASOUND=y -CONFIG_MSM_QDSP6_APRV2_RPMSG=y -CONFIG_MSM_ADSP_LOADER=y -CONFIG_REGMAP_SWR=y -CONFIG_MSM_QDSP6_SSR=y -CONFIG_MSM_QDSP6_PDR=y -CONFIG_MSM_QDSP6_NOTIFIER=y -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y -CONFIG_SND_SOC_SM8150=y -CONFIG_MSM_GLINK_SPI_XPRT=y -CONFIG_WCD_DSP_GLINK=y -CONFIG_SOUNDWIRE=y -CONFIG_SND_SOC_QDSP6V2=y -CONFIG_SND_SOC_WCD_MBHC_ADC=y -CONFIG_QTI_PP=y -CONFIG_SND_HWDEP_ROUTING=y -CONFIG_DTS_EAGLE=y -CONFIG_DOLBY_DS2=y -CONFIG_DOLBY_LICENSE=y -CONFIG_DTS_SRS_TM=y -CONFIG_SND_SOC_MSM_STUB=y -CONFIG_MSM_AVTIMER=y -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y -CONFIG_VOICE_MHI=y -CONFIG_SND_SOC_TFA9874=y -# CONFIG_SND_SOC_TAS2557 is not set -# CONFIG_TAS2557_REGMAP is not set -# CONFIG_TAS2557_CODEC is not set -# CONFIG_TAS2557_MISC is not set -# CONFIG_SND_SOC_CS35L41 is not set -# CONFIG_MSM_CSPL is not set diff --git a/techpack/audio/config/sm8150autoconf.h b/techpack/audio/config/sm8150autoconf.h deleted file mode 100644 index 96aa37182290..000000000000 --- a/techpack/audio/config/sm8150autoconf.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. - * - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD9360 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_SM8150 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_WCD_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_VOICE_MHI 1 -#define CONFIG_SND_SOC_TFA9874 1 -#define CONFIG_SND_SOC_TAS2557 0 -#define CONFIG_TAS2557_REGMAP 0 -#define CONFIG_TAS2557_CODEC 0 -#define CONFIG_TAS2557_MISC 0 -#define CONFIG_SND_SOC_CS35L41 0 -#define CONFIG_MSM_CSPL 0 diff --git a/techpack/audio/config/trinketauto.conf b/techpack/audio/config/trinketauto.conf deleted file mode 100644 index 549b1b7fd758..000000000000 --- a/techpack/audio/config/trinketauto.conf +++ /dev/null @@ -1,52 +0,0 @@ -CONFIG_PINCTRL_WCD=m -CONFIG_AUDIO_EXT_CLK=m -CONFIG_SND_SOC_WCD9XXX_V2=m -CONFIG_SND_SOC_WCD_MBHC=m -CONFIG_SND_SOC_WSA881X=m -CONFIG_SND_SOC_WCD_DSP_MGR=m -CONFIG_SND_SOC_WCD_SPI=m -CONFIG_SND_SOC_WCD934X=m -CONFIG_SND_SOC_WCD934X_MBHC=m -CONFIG_SND_SOC_WCD934X_DSD=m -CONFIG_WCD9XXX_CODEC_CORE=m -CONFIG_SND_SOC_WCD_CPE=m -CONFIG_SND_SOC_CPE=m -CONFIG_SND_SOC_WCD9335=m -CONFIG_MSM_CDC_PINCTRL=m -CONFIG_MSM_QDSP6V2_CODECS=m -CONFIG_MSM_ULTRASOUND=m -CONFIG_MSM_QDSP6_APRV2_RPMSG=m -CONFIG_MSM_ADSP_LOADER=m -CONFIG_REGMAP_SWR=m -CONFIG_MSM_QDSP6_SSR=m -CONFIG_MSM_QDSP6_PDR=m -CONFIG_MSM_QDSP6_NOTIFIER=m -CONFIG_SND_SOC_MSM_HOSTLESS_PCM=m -CONFIG_SND_SOC_MSM_QDSP6V2_INTF=m -CONFIG_SND_SOC_SM6150=m -CONFIG_MSM_GLINK_SPI_XPRT=m -CONFIG_WCD_DSP_GLINK=m -CONFIG_SOUNDWIRE=m -CONFIG_SOUNDWIRE_MSTR_CTRL=m -CONFIG_SND_SOC_QDSP6V2=m -CONFIG_SND_SOC_WCD_MBHC_ADC=m -CONFIG_SND_SOC_WCD_MBHC_LEGACY=m -CONFIG_QTI_PP=m -CONFIG_SND_HWDEP_ROUTING=m -CONFIG_DTS_EAGLE=m -CONFIG_DOLBY_DS2=m -CONFIG_DOLBY_LICENSE=m -CONFIG_DTS_SRS_TM=m -CONFIG_SND_SOC_MSM_STUB=m -CONFIG_MSM_AVTIMER=m -CONFIG_AVTIMER_LEGACY=m -CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m -CONFIG_SND_SOC_BOLERO=m -CONFIG_WSA_MACRO=m -CONFIG_VA_MACRO=m -CONFIG_RX_MACRO=m -CONFIG_TX_MACRO=m -CONFIG_SND_SOC_WCD_IRQ=m -CONFIG_SND_SOC_WCD937X=m -CONFIG_SND_SOC_WCD937X_SLAVE=m -CONFIG_SND_EVENT=m diff --git a/techpack/audio/config/trinketautoconf.h b/techpack/audio/config/trinketautoconf.h deleted file mode 100644 index 8315efac7ada..000000000000 --- a/techpack/audio/config/trinketautoconf.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define CONFIG_PINCTRL_WCD 1 -#define CONFIG_AUDIO_EXT_CLK 1 -#define CONFIG_SND_SOC_WCD9XXX_V2 1 -#define CONFIG_SND_SOC_WCD_MBHC 1 -#define CONFIG_SND_SOC_WSA881X 1 -#define CONFIG_SND_SOC_WCD_DSP_MGR 1 -#define CONFIG_SND_SOC_WCD_SPI 1 -#define CONFIG_SND_SOC_WCD934X 1 -#define CONFIG_SND_SOC_WCD934X_MBHC 1 -#define CONFIG_SND_SOC_WCD934X_DSD 1 -#define CONFIG_SND_SOC_CPE 1 -#define CONFIG_SND_SOC_WCD_CPE 1 -#define CONFIG_SND_SOC_WCD9335 1 -#define CONFIG_WCD9XXX_CODEC_CORE 1 -#define CONFIG_MSM_CDC_PINCTRL 1 -#define CONFIG_MSM_QDSP6V2_CODECS 1 -#define CONFIG_MSM_ULTRASOUND 1 -#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 -#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 -#define CONFIG_MSM_ADSP_LOADER 1 -#define CONFIG_REGMAP_SWR 1 -#define CONFIG_MSM_QDSP6_SSR 1 -#define CONFIG_MSM_QDSP6_PDR 1 -#define CONFIG_MSM_QDSP6_NOTIFIER 1 -#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 -#define CONFIG_SND_SOC_SM6150 1 -#define CONFIG_MSM_GLINK_SPI_XPRT 1 -#define CONFIG_WCD_DSP_GLINK 1 -#define CONFIG_SOUNDWIRE 1 -#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 -#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 -#define CONFIG_SND_SOC_WCD_MBHC_LEGACY 1 -#define CONFIG_SND_SOC_QDSP6V2 1 -#define CONFIG_QTI_PP 1 -#define CONFIG_SND_HWDEP_ROUTING 1 -#define CONFIG_DTS_EAGLE 1 -#define CONFIG_DOLBY_DS2 1 -#define CONFIG_DOLBY_LICENSE 1 -#define CONFIG_DTS_SRS_TM 1 -#define CONFIG_SND_SOC_MSM_STUB 1 -#define CONFIG_MSM_AVTIMER 1 -#define CONFIG_AVTIMER_LEGACY 1 -#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 -#define CONFIG_SND_SOC_BOLERO 1 -#define CONFIG_WSA_MACRO 1 -#define CONFIG_VA_MACRO 1 -#define CONFIG_RX_MACRO 1 -#define CONFIG_TX_MACRO 1 -#define CONFIG_SND_SOC_WCD_IRQ 1 -#define CONFIG_SND_SOC_WCD937X 1 -#define CONFIG_SND_SOC_WCD937X_SLAVE 1 -#define CONFIG_SND_EVENT 1 diff --git a/techpack/audio/dsp/Android.mk b/techpack/audio/dsp/Android.mk deleted file mode 100644 index 54a355aab636..000000000000 --- a/techpack/audio/dsp/Android.mk +++ /dev/null @@ -1,98 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile atoll $(MSMSTEPPE) $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=q6_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6.ko -LOCAL_MODULE_KBUILD_NAME := q6_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_usf.ko -LOCAL_MODULE_KBUILD_NAME := usf_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_adsp_loader.ko -LOCAL_MODULE_KBUILD_NAME := adsp_loader_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_notifier.ko -LOCAL_MODULE_KBUILD_NAME := q6_notifier_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_q6_pdr.ko -LOCAL_MODULE_KBUILD_NAME := q6_pdr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/dsp/Kbuild b/techpack/audio/dsp/Kbuild deleted file mode 100644 index b142cee9c434..000000000000 --- a/techpack/audio/dsp/Kbuild +++ /dev/null @@ -1,241 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME), ) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - - - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ QDSP6V2 ############ - -ifdef CONFIG_SND_SOC_MSM_QDSP6V2_INTF - Q6_OBJS += msm-audio-event-notify.o - Q6_OBJS += audio_calibration.o - Q6_OBJS += audio_cal_utils.o - Q6_OBJS += q6adm.o - Q6_OBJS += q6afe.o - Q6_OBJS += q6asm.o - Q6_OBJS += q6audio-v2.o - Q6_OBJS += q6voice.o - Q6_OBJS += q6core.o - Q6_OBJS += q6common.o - Q6_OBJS += rtac.o - Q6_OBJS += q6lsm.o - Q6_OBJS += audio_slimslave.o - Q6_OBJS += adsp_err.o - Q6_OBJS += msm_audio_ion.o - Q6_OBJS += avtimer.o - Q6_OBJS += q6_init.o - Q6_OBJS += apr_elliptic.o - Q6_OBJS += elliptic/elliptic.o - Q6_OBJS += elliptic/elliptic_sysfs.o - Q6_OBJS += elliptic/elliptic_mixer_controls.o - Q6_OBJS += elliptic/io_modules/msm/elliptic_data_msm_io.o - Q6_OBJS += elliptic/io_modules/userspace/elliptic_data_userspace_io.o - Q6_OBJS += elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.o -# for mius start -ifdef CONFIG_US_PROXIMITY - Q6_OBJS += apr_mius.o - Q6_OBJS += mius/mius.o - Q6_OBJS += mius/mius_sysfs.o - Q6_OBJS += mius/mius_mixer_controls.o - Q6_OBJS += mius/io_modules/msm/mius_data_msm_io.o - Q6_OBJS += mius/io_modules/userspace/mius_data_userspace_io.o - Q6_OBJS += mius/io_modules/userspace/mius_data_userspace_ctrl.o -endif -# for mius end -endif - -ifdef CONFIG_XT_LOGGING - Q6_OBJS += sp_params.o -endif - -ifdef CONFIG_DTS_SRS_TM - Q6_OBJS += msm-dts-srs-tm-config.o -endif - -ifdef CONFIG_AFE_HWDEP - Q6_OBJS += q6afecal-hwdep.o -endif - -ifdef CONFIG_MSM_ADSP_LOADER -ADSP_LOADER_OBJS += adsp-loader.o -endif - -ifdef CONFIG_MSM_QDSP6_PDR -QDSP6_PDR_OBJS += audio_pdr.o -endif - -ifdef CONFIG_MSM_QDSP6_NOTIFIER -QDSP6_NOTIFIER_OBJS += audio_notifier.o audio_ssr.o -endif - -ifdef CONFIG_MSM_ULTRASOUND -USF_OBJS += usf.o usfcdev.o q6usm.o -endif - -ifdef CONFIG_MSM_MDF - Q6_OBJS += msm_mdf.o -endif - -ifdef CONFIG_MSM_CSPL - Q6_OBJS += msm-cirrus-playback.o -endif - -ifdef CONFIG_VOICE_MHI - Q6_OBJS += voice_mhi.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -D__linux__ \ - -DCONFIG_SND_SOC_TFA9874_FOR_DAVI - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -# If the module name is not "wlan", then the define MULTI_IF_NAME to be the -# same a the QCA CHIP name. The host driver will then append MULTI_IF_NAME to -# any string that must be unique for all instances of the driver on the system. -# This allows multiple instances of the driver with different module names. -# If the module name is wlan, leave MULTI_IF_NAME undefined and the code will -# treat the driver as the primary driver. -ifneq ($(MODNAME), qdsp6v2) -CHIP_NAME ?= $(MODNAME) -CDEFINES += -DMULTI_IF_NAME=\"$(CHIP_NAME)\" -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers -endif - -ifeq ($(KERNEL_BUILD), 1) - obj-y += codecs/ -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -obj-$(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) += q6_dlkm.o -q6_dlkm-y := $(Q6_OBJS) - -obj-$(CONFIG_MSM_ULTRASOUND) += usf_dlkm.o -usf_dlkm-y := $(USF_OBJS) - -obj-$(CONFIG_MSM_ADSP_LOADER) += adsp_loader_dlkm.o -adsp_loader_dlkm-y := $(ADSP_LOADER_OBJS) - -obj-$(CONFIG_MSM_QDSP6_PDR) += q6_pdr_dlkm.o -q6_pdr_dlkm-y := $(QDSP6_PDR_OBJS) - -obj-$(CONFIG_MSM_QDSP6_NOTIFIER) += q6_notifier_dlkm.o -q6_notifier_dlkm-y := $(QDSP6_NOTIFIER_OBJS) - -# inject some build related information diff --git a/techpack/audio/dsp/adsp-loader.c b/techpack/audio/dsp/adsp-loader.c deleted file mode 100644 index 5afd48cd8d63..000000000000 --- a/techpack/audio/dsp/adsp-loader.c +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (c) 2012-2014, 2017-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define Q6_PIL_GET_DELAY_MS 100 -#define BOOT_CMD 1 -#define SSR_RESET_CMD 1 -#define IMAGE_UNLOAD_CMD 0 - -static ssize_t adsp_boot_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, size_t count); - -static ssize_t adsp_ssr_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, size_t count); - -struct adsp_loader_private { - void *pil_h; - struct kobject *boot_adsp_obj; - struct attribute_group *attr_group; -}; - -static struct kobj_attribute adsp_boot_attribute = - __ATTR(boot, 0220, NULL, adsp_boot_store); - -static struct kobj_attribute adsp_ssr_attribute = - __ATTR(ssr, 0220, NULL, adsp_ssr_store); - -static struct attribute *attrs[] = { - &adsp_boot_attribute.attr, - &adsp_ssr_attribute.attr, - NULL, -}; - -static struct work_struct adsp_ldr_work; -static struct platform_device *adsp_private; -static void adsp_loader_unload(struct platform_device *pdev); - -static void adsp_load_fw(struct work_struct *adsp_ldr_work) -{ - struct platform_device *pdev = adsp_private; - struct adsp_loader_private *priv = NULL; - - const char *adsp_dt = "qcom,adsp-state"; - int rc = 0; - u32 adsp_state; - const char *img_name; - - if (!pdev) { - dev_err(&pdev->dev, "%s: Platform device null\n", __func__); - goto fail; - } - - if (!pdev->dev.of_node) { - dev_err(&pdev->dev, - "%s: Device tree information missing\n", __func__); - goto fail; - } - - rc = of_property_read_u32(pdev->dev.of_node, adsp_dt, &adsp_state); - if (rc) { - dev_err(&pdev->dev, - "%s: ADSP state = %x\n", __func__, adsp_state); - goto fail; - } - - rc = of_property_read_string(pdev->dev.of_node, - "qcom,proc-img-to-load", - &img_name); - - if (rc) { - dev_dbg(&pdev->dev, - "%s: loading default image ADSP\n", __func__); - goto load_adsp; - } - if (!strcmp(img_name, "modem")) { - /* adsp_state always returns "0". So load modem image based on - * apr_modem_state to prevent loading of image twice - */ - adsp_state = apr_get_modem_state(); - if (adsp_state == APR_SUBSYS_DOWN) { - priv = platform_get_drvdata(pdev); - if (!priv) { - dev_err(&pdev->dev, - " %s: Private data get failed\n", __func__); - goto fail; - } - - priv->pil_h = subsystem_get("modem"); - if (IS_ERR(priv->pil_h)) { - dev_err(&pdev->dev, "%s: pil get failed,\n", - __func__); - goto fail; - } - - /* Set the state of the ADSP in APR driver */ - apr_set_modem_state(APR_SUBSYS_LOADED); - } else if (adsp_state == APR_SUBSYS_LOADED) { - dev_dbg(&pdev->dev, - "%s: MDSP state = %x\n", __func__, adsp_state); - } - - dev_dbg(&pdev->dev, "%s: Q6/MDSP image is loaded\n", __func__); - return; - } -load_adsp: - { - adsp_state = apr_get_q6_state(); - if (adsp_state == APR_SUBSYS_DOWN) { - priv = platform_get_drvdata(pdev); - if (!priv) { - dev_err(&pdev->dev, - " %s: Private data get failed\n", __func__); - goto fail; - } - - priv->pil_h = subsystem_get("adsp"); - if (IS_ERR(priv->pil_h)) { - dev_err(&pdev->dev, "%s: pil get failed,\n", - __func__); - goto fail; - } - } else if (adsp_state == APR_SUBSYS_LOADED) { - dev_dbg(&pdev->dev, - "%s: ADSP state = %x\n", __func__, adsp_state); - } - - dev_dbg(&pdev->dev, "%s: Q6/ADSP image is loaded\n", __func__); - return; - } -fail: - dev_err(&pdev->dev, "%s: Q6 image loading failed\n", __func__); -} - -static void adsp_loader_do(struct platform_device *pdev) -{ - schedule_work(&adsp_ldr_work); -} - -static ssize_t adsp_ssr_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - int ssr_command = 0; - struct subsys_device *adsp_dev = NULL; - struct platform_device *pdev = adsp_private; - struct adsp_loader_private *priv = NULL; - int rc; - - dev_dbg(&pdev->dev, "%s: going to call adsp ssr\n ", __func__); - - if (kstrtoint(buf, 10, &ssr_command) < 0) - return -EINVAL; - - if (ssr_command != SSR_RESET_CMD) - return -EINVAL; - - priv = platform_get_drvdata(pdev); - if (!priv) - return -EINVAL; - - adsp_dev = (struct subsys_device *)priv->pil_h; - if (!adsp_dev) - return -EINVAL; - - dev_err(&pdev->dev, "requesting for ADSP restart\n"); - - /* subsystem_restart_dev has worker queue to handle */ - rc = subsystem_restart_dev(adsp_dev); - if (rc) { - dev_err(&pdev->dev, "subsystem_restart_dev failed\n"); - return rc; - } - - dev_dbg(&pdev->dev, "ADSP restarted\n"); - return count; -} - -static ssize_t adsp_boot_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - int boot = 0; - - if (sscanf(buf, "%du", &boot) != 1) { - pr_err("%s: failed to read boot info from string\n", __func__); - return -EINVAL; - } - - if (boot == BOOT_CMD) { - pr_debug("%s: going to call adsp_loader_do\n", __func__); - adsp_loader_do(adsp_private); - } else if (boot == IMAGE_UNLOAD_CMD) { - pr_debug("%s: going to call adsp_unloader\n", __func__); - adsp_loader_unload(adsp_private); - } - return count; -} - -static void adsp_loader_unload(struct platform_device *pdev) -{ - struct adsp_loader_private *priv = NULL; - - priv = platform_get_drvdata(pdev); - - if (!priv) - return; - - if (priv->pil_h) { - dev_dbg(&pdev->dev, "%s: calling subsystem put\n", __func__); - subsystem_put(priv->pil_h); - priv->pil_h = NULL; - } -} - -static int adsp_loader_init_sysfs(struct platform_device *pdev) -{ - int ret = -EINVAL; - struct adsp_loader_private *priv = NULL; - - adsp_private = NULL; - priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); - if (!priv) { - ret = -ENOMEM; - return ret; - } - - platform_set_drvdata(pdev, priv); - - priv->pil_h = NULL; - priv->boot_adsp_obj = NULL; - priv->attr_group = devm_kzalloc(&pdev->dev, - sizeof(*(priv->attr_group)), - GFP_KERNEL); - if (!priv->attr_group) { - ret = -ENOMEM; - goto error_return; - } - - priv->attr_group->attrs = attrs; - - priv->boot_adsp_obj = kobject_create_and_add("boot_adsp", kernel_kobj); - if (!priv->boot_adsp_obj) { - dev_err(&pdev->dev, "%s: sysfs create and add failed\n", - __func__); - ret = -ENOMEM; - goto error_return; - } - - ret = sysfs_create_group(priv->boot_adsp_obj, priv->attr_group); - if (ret) { - dev_err(&pdev->dev, "%s: sysfs create group failed %d\n", - __func__, ret); - goto error_return; - } - - adsp_private = pdev; - - return 0; - -error_return: - - if (priv->boot_adsp_obj) { - kobject_del(priv->boot_adsp_obj); - priv->boot_adsp_obj = NULL; - } - - return ret; -} - -static int adsp_loader_remove(struct platform_device *pdev) -{ - struct adsp_loader_private *priv = NULL; - - priv = platform_get_drvdata(pdev); - - if (!priv) - return 0; - - if (priv->pil_h) { - subsystem_put(priv->pil_h); - priv->pil_h = NULL; - } - - if (priv->boot_adsp_obj) { - sysfs_remove_group(priv->boot_adsp_obj, priv->attr_group); - kobject_del(priv->boot_adsp_obj); - priv->boot_adsp_obj = NULL; - } - - return 0; -} - -static int adsp_loader_probe(struct platform_device *pdev) -{ - int ret = adsp_loader_init_sysfs(pdev); - - if (ret != 0) { - dev_err(&pdev->dev, "%s: Error in initing sysfs\n", __func__); - return ret; - } - - INIT_WORK(&adsp_ldr_work, adsp_load_fw); - - return 0; -} - -static const struct of_device_id adsp_loader_dt_match[] = { - { .compatible = "qcom,adsp-loader" }, - { } -}; -MODULE_DEVICE_TABLE(of, adsp_loader_dt_match); - -static struct platform_driver adsp_loader_driver = { - .driver = { - .name = "adsp-loader", - .owner = THIS_MODULE, - .of_match_table = adsp_loader_dt_match, - }, - .probe = adsp_loader_probe, - .remove = adsp_loader_remove, -}; - -static int __init adsp_loader_init(void) -{ - return platform_driver_register(&adsp_loader_driver); -} -module_init(adsp_loader_init); - -static void __exit adsp_loader_exit(void) -{ - platform_driver_unregister(&adsp_loader_driver); -} -module_exit(adsp_loader_exit); - -MODULE_DESCRIPTION("ADSP Loader module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/adsp_err.c b/techpack/audio/dsp/adsp_err.c deleted file mode 100644 index e34d76b6aae6..000000000000 --- a/techpack/audio/dsp/adsp_err.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include - - -/* ERROR STRING */ -/* Success. The operation completed with no errors. */ -#define ADSP_EOK_STR "ADSP_EOK" -/* General failure. */ -#define ADSP_EFAILED_STR "ADSP_EFAILED" -/* Bad operation parameter. */ -#define ADSP_EBADPARAM_STR "ADSP_EBADPARAM" -/* Unsupported routine or operation. */ -#define ADSP_EUNSUPPORTED_STR "ADSP_EUNSUPPORTED" -/* Unsupported version. */ -#define ADSP_EVERSION_STR "ADSP_EVERSION" -/* Unexpected problem encountered. */ -#define ADSP_EUNEXPECTED_STR "ADSP_EUNEXPECTED" -/* Unhandled problem occurred. */ -#define ADSP_EPANIC_STR "ADSP_EPANIC" -/* Unable to allocate resource. */ -#define ADSP_ENORESOURCE_STR "ADSP_ENORESOURCE" -/* Invalid handle. */ -#define ADSP_EHANDLE_STR "ADSP_EHANDLE" -/* Operation is already processed. */ -#define ADSP_EALREADY_STR "ADSP_EALREADY" -/* Operation is not ready to be processed. */ -#define ADSP_ENOTREADY_STR "ADSP_ENOTREADY" -/* Operation is pending completion. */ -#define ADSP_EPENDING_STR "ADSP_EPENDING" -/* Operation could not be accepted or processed. */ -#define ADSP_EBUSY_STR "ADSP_EBUSY" -/* Operation aborted due to an error. */ -#define ADSP_EABORTED_STR "ADSP_EABORTED" -/* Operation preempted by a higher priority. */ -#define ADSP_EPREEMPTED_STR "ADSP_EPREEMPTED" -/* Operation requests intervention to complete. */ -#define ADSP_ECONTINUE_STR "ADSP_ECONTINUE" -/* Operation requests immediate intervention to complete. */ -#define ADSP_EIMMEDIATE_STR "ADSP_EIMMEDIATE" -/* Operation is not implemented. */ -#define ADSP_ENOTIMPL_STR "ADSP_ENOTIMPL" -/* Operation needs more data or resources. */ -#define ADSP_ENEEDMORE_STR "ADSP_ENEEDMORE" -/* Operation does not have memory. */ -#define ADSP_ENOMEMORY_STR "ADSP_ENOMEMORY" -/* Item does not exist. */ -#define ADSP_ENOTEXIST_STR "ADSP_ENOTEXIST" -/* Unexpected error code. */ -#define ADSP_ERR_MAX_STR "ADSP_ERR_MAX" - -#if IS_ENABLED(CONFIG_SND_SOC_QDSP_DEBUG) -static bool adsp_err_panic; - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_adsp_err; - -static ssize_t adsp_err_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char cmd; - - if (copy_from_user(&cmd, ubuf, 1)) - return -EFAULT; - - if (cmd == '0') - adsp_err_panic = false; - else - adsp_err_panic = true; - - return cnt; -} - -static const struct file_operations adsp_err_debug_ops = { - .write = adsp_err_debug_write, -}; -#endif -#endif - -struct adsp_err_code { - int lnx_err_code; - char *adsp_err_str; -}; - - -static struct adsp_err_code adsp_err_code_info[ADSP_ERR_MAX+1] = { - { 0, ADSP_EOK_STR}, - { -ENOTRECOVERABLE, ADSP_EFAILED_STR}, - { -EINVAL, ADSP_EBADPARAM_STR}, - { -EOPNOTSUPP, ADSP_EUNSUPPORTED_STR}, - { -ENOPROTOOPT, ADSP_EVERSION_STR}, - { -ENOTRECOVERABLE, ADSP_EUNEXPECTED_STR}, - { -ENOTRECOVERABLE, ADSP_EPANIC_STR}, - { -ENOSPC, ADSP_ENORESOURCE_STR}, - { -EBADR, ADSP_EHANDLE_STR}, - { -EALREADY, ADSP_EALREADY_STR}, - { -EPERM, ADSP_ENOTREADY_STR}, - { -EINPROGRESS, ADSP_EPENDING_STR}, - { -EBUSY, ADSP_EBUSY_STR}, - { -ECANCELED, ADSP_EABORTED_STR}, - { -EAGAIN, ADSP_EPREEMPTED_STR}, - { -EAGAIN, ADSP_ECONTINUE_STR}, - { -EAGAIN, ADSP_EIMMEDIATE_STR}, - { -EAGAIN, ADSP_ENOTIMPL_STR}, - { -ENODATA, ADSP_ENEEDMORE_STR}, - { -EADV, ADSP_ERR_MAX_STR}, - { -ENOMEM, ADSP_ENOMEMORY_STR}, - { -ENODEV, ADSP_ENOTEXIST_STR}, - { -EADV, ADSP_ERR_MAX_STR}, -}; - -#if IS_ENABLED(CONFIG_SND_SOC_QDSP_DEBUG) -static inline void adsp_err_check_panic(u32 adsp_error) -{ - if (adsp_err_panic && adsp_error != ADSP_EALREADY) - panic("%s: encounter adsp_err=0x%x\n", __func__, adsp_error); -} -#else -static inline void adsp_err_check_panic(u32 adsp_error) {} -#endif - -int adsp_err_get_lnx_err_code(u32 adsp_error) -{ - adsp_err_check_panic(adsp_error); - - if (adsp_error > ADSP_ERR_MAX) - return adsp_err_code_info[ADSP_ERR_MAX].lnx_err_code; - else - return adsp_err_code_info[adsp_error].lnx_err_code; -} - -char *adsp_err_get_err_str(u32 adsp_error) -{ - if (adsp_error > ADSP_ERR_MAX) - return adsp_err_code_info[ADSP_ERR_MAX].adsp_err_str; - else - return adsp_err_code_info[adsp_error].adsp_err_str; -} - -#if IS_ENABLED(CONFIG_SND_SOC_QDSP_DEBUG) && defined(CONFIG_DEBUG_FS) -int __init adsp_err_init(void) -{ - - - debugfs_adsp_err = debugfs_create_file("msm_adsp_audio_debug", - S_IFREG | 0444, NULL, NULL, - &adsp_err_debug_ops); - - return 0; -} -#else -int __init adsp_err_init(void) { return 0; } - -#endif - -void adsp_err_exit(void) -{ - return; -} diff --git a/techpack/audio/dsp/adsp_err.h b/techpack/audio/dsp/adsp_err.h deleted file mode 100644 index 43be91d6ba8f..000000000000 --- a/techpack/audio/dsp/adsp_err.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2015-2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ADSP_ERR__ -#define __ADSP_ERR__ - -int adsp_err_get_lnx_err_code(u32 adsp_error); - -char *adsp_err_get_err_str(u32 adsp_error); - -#endif diff --git a/techpack/audio/dsp/apr_elliptic.c b/techpack/audio/dsp/apr_elliptic.c deleted file mode 100755 index b3d67edfba09..000000000000 --- a/techpack/audio/dsp/apr_elliptic.c +++ /dev/null @@ -1,452 +0,0 @@ -/** - * Elliptic Labs - */ - -#include -#include -#include -#include -#include -#include -#include "../asoc/msm-pcm-routing-v2.h" -#include -#include -#include -#include -#include -#include - -#ifndef min -#define min(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -enum { - HALL_SLIDER_UP = 4, - HALL_SLIDER_DOWN = 5, - HALL_SLIDING = 6, -}; - -enum driver_sensor_type { - DRIVER_SENSOR_HALL = 35, -}; - -struct driver_sensor_event { - enum driver_sensor_type type; - union { - int32_t event; - int32_t reserved[2]; - }; -}; - - - -static int afe_set_parameter(int port, - int param_id, - int module_id, - struct afe_ultrasound_set_params_t *prot_config, - uint32_t length) -{ - struct afe_port_cmd_set_param_v2 *set_param_v2 = NULL; - uint32_t set_param_v2_size = sizeof(struct afe_port_cmd_set_param_v2); - struct afe_port_cmd_set_param_v3 *set_param_v3 = NULL; - uint32_t set_param_v3_size = sizeof(struct afe_port_cmd_set_param_v3); - struct param_hdr_v3 param_hdr = {0}; - u16 port_id = 0; - int index = 0; - u8 *packed_param_data = NULL; - int packed_data_size = sizeof(union param_hdrs) + length; - int ret = 0; - - pr_debug("[ELUS]: inside %s\n", __func__); - - port_id = q6audio_get_port_id(port); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - index = q6audio_get_port_index(port); - - param_hdr.module_id = module_id; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = param_id; - param_hdr.param_size = length; - pr_debug("[ELUS]: param_size %d\n", length); - - packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); - if (packed_param_data == NULL) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, (u8 *)prot_config, - &packed_data_size); - if (ret) { - pr_err("%s: Failed to pack param header and data, error %d\n", - __func__, ret); - goto fail_cmd; - } - - if (q6common_is_instance_id_supported()) { - set_param_v3_size += packed_data_size; - set_param_v3 = kzalloc(set_param_v3_size, GFP_KERNEL); - if (set_param_v3 == NULL) { - ret = -ENOMEM; - goto fail_cmd; - } - - set_param_v3->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param_v3->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v3) + - packed_data_size; - set_param_v3->apr_hdr.src_port = 0; - set_param_v3->apr_hdr.dest_port = 0; - set_param_v3->apr_hdr.token = index; - set_param_v3->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; - set_param_v3->port_id = port_id; - set_param_v3->payload_size = packed_data_size; - memcpy(&set_param_v3->param_data, packed_param_data, - packed_data_size); - - atomic_set(elus_afe.ptr_state, 1); - ret = apr_send_pkt(*elus_afe.ptr_apr, (uint32_t *) set_param_v3); - } else { - set_param_v2_size += packed_data_size; - set_param_v2 = kzalloc(set_param_v2_size, GFP_KERNEL); - if (set_param_v2 == NULL) { - ret = -ENOMEM; - goto fail_cmd; - } - - set_param_v2->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param_v2->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v2) + - packed_data_size; - set_param_v2->apr_hdr.src_port = 0; - set_param_v2->apr_hdr.dest_port = 0; - set_param_v2->apr_hdr.token = index; - set_param_v2->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; - set_param_v2->port_id = port_id; - set_param_v2->payload_size = packed_data_size; - memcpy(&set_param_v2->param_data, packed_param_data, - packed_data_size); - - atomic_set(elus_afe.ptr_state, 1); - ret = apr_send_pkt(*elus_afe.ptr_apr, (uint32_t *) set_param_v2); - } - if (ret < 0) { - pr_err("%s: Setting param for port %d param[0x%x]failed\n", - __func__, port, param_id); - goto fail_cmd; - } - ret = wait_event_timeout(elus_afe.ptr_wait[index], - (atomic_read(elus_afe.ptr_state) == 0), - msecs_to_jiffies(elus_afe.timeout_ms*10)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - if (atomic_read(elus_afe.ptr_status) != 0) { - pr_err("%s: set param cmd failed\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - ret = 0; -fail_cmd: - pr_debug("%s param_id %x status %d\n", __func__, param_id, ret); - kfree(set_param_v2); - kfree(set_param_v3); - kfree(packed_param_data); - return ret; -} - - -int32_t ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, - u8 *user_params, int32_t length) { - - int32_t ret = 0; - uint32_t module_id; - - if (port_id == ELLIPTIC_PORT_ID) - module_id = ELLIPTIC_ULTRASOUND_MODULE_TX; - else - module_id = ELLIPTIC_ULTRASOUND_MODULE_RX; - - ret = afe_set_parameter(port_id, - param_id, module_id, - (struct afe_ultrasound_set_params_t *)user_params, - length); - - return ret; -} - -static int32_t process_version_msg(uint32_t *payload, uint32_t payload_size) -{ - struct elliptic_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= ELLIPTIC_VERSION_INFO_SIZE) { - pr_debug("[ELUS]: elliptic_version copied to local AP cache"); - data_block = - elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_VERSION_INFO); - copy_size = min_t(size_t, data_block->size, - (size_t)ELLIPTIC_VERSION_INFO_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_branch_msg(uint32_t *payload, uint32_t payload_size) -{ - struct elliptic_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= ELLIPTIC_BRANCH_INFO_SIZE) { - pr_debug("[ELUS]: elliptic_branch copied to local AP cache"); - data_block = - elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_BRANCH_INFO); - copy_size = min_t(size_t, data_block->size, - (size_t)ELLIPTIC_BRANCH_INFO_MAX_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_tag_msg(uint32_t *payload, uint32_t payload_size) -{ - struct elliptic_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= ELLIPTIC_TAG_INFO_SIZE) { - pr_debug("[ELUS]: elliptic_tag copied to local AP cache"); - data_block = - elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_TAG_INFO); - copy_size = min_t(size_t, data_block->size, - (size_t)ELLIPTIC_TAG_INFO_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_calibration_msg(uint32_t *payload, uint32_t payload_size) -{ - struct elliptic_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= ELLIPTIC_CALIBRATION_DATA_SIZE) { - pr_debug("[ELUS]: calibration_data copied to local AP cache"); - - data_block = elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_CALIBRATION_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)ELLIPTIC_CALIBRATION_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - elliptic_set_calibration_data((u8 *)&payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_calibration_v2_msg(uint32_t *payload, uint32_t payload_size) -{ - struct elliptic_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { - pr_debug("[ELUS]: calibration_data copied to local AP cache"); - - data_block = elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)ELLIPTIC_CALIBRATION_V2_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - elliptic_set_calibration_data((u8 *)&payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_ml_msg(uint32_t *payload, uint32_t payload_size) -{ - struct elliptic_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= ELLIPTIC_ML_DATA_SIZE) { - pr_debug("[ELUS]: ml_data copied to local AP cache"); - - data_block = elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_ML_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)ELLIPTIC_ML_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_diagnostics_msg(uint32_t *payload, uint32_t payload_size) -{ - struct elliptic_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[ELUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= ELLIPTIC_DIAGNOSTICS_DATA_SIZE) { - pr_debug("[ELUS]: diagnostics_data copied to local AP cache"); - - data_block = elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)ELLIPTIC_DIAGNOSTICS_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_sensorhub_msg(uint32_t *payload, uint32_t payload_size) -{ - int32_t ret = 0; - - pr_err("[ELUS]: %s, paramId:%u, size:%d\n", - __func__, payload[1], payload_size); - - return ret; -} - -int32_t elliptic_process_apr_payload(uint32_t *payload) -{ - uint32_t payload_size = 0; - int32_t ret = -1; - - if (payload[0] == ELLIPTIC_ULTRASOUND_MODULE_TX) { - /* payload format - * payload[0] = Module ID - * payload[1] = Param ID - * payload[2] = LSB - payload size - * MSB - reserved(TBD) - * payload[3] = US data payload starts from here - */ - payload_size = payload[2] & 0xFFFF; - - switch (payload[1]) { - case ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_VERSION: - ret = process_version_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_BUILD_BRANCH: - ret = process_branch_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_TAG: - ret = process_tag_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_DATA: - ret = process_calibration_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA: - ret = process_calibration_v2_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_ML_DATA: - ret = process_ml_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA: - ret = process_diagnostics_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_SENSORHUB: - ret = process_sensorhub_msg(payload, payload_size); - break; - case ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_DATA: - ret = elliptic_data_push( - ELLIPTIC_ALL_DEVICES, - (const char *)&payload[3], - (size_t)payload_size, - ELLIPTIC_DATA_PUSH_FROM_KERNEL); - - if (ret != 0) { - pr_err("[ELUS] : failed to push apr payload to elliptic device"); - return ret; - } - ret = payload_size; - break; - default: - { - pr_err("[ELUS] : elliptic_process_apr_payload, Illegal paramId:%u", payload[1]); - } - break; - } - } else { - pr_debug("[ELUS]: Invalid Ultrasound Module ID %d\n", - payload[0]); - } - return ret; -} - -int elliptic_set_hall_state(int state) -{ - struct driver_sensor_event dse; - int ret = -1; - - dse.type = DRIVER_SENSOR_HALL; - - switch (state) { - case 0: - dse.event = HALL_SLIDER_UP; - break; - case 1: - dse.event = HALL_SLIDER_DOWN; - break; - case 2: - dse.event = HALL_SLIDING; - break; - default: - pr_err("%s Invalid HALL state:%d\n", __func__, state); - return ret; - } - - ret = afe_set_parameter(ELLIPTIC_PORT_ID, - 2, ELLIPTIC_ULTRASOUND_MODULE_TX, - (struct afe_ultrasound_set_params_t *)&dse, - sizeof(dse)); - return ret; -} -EXPORT_SYMBOL(elliptic_set_hall_state); diff --git a/techpack/audio/dsp/apr_mius.c b/techpack/audio/dsp/apr_mius.c deleted file mode 100644 index d5b3f41ae6d0..000000000000 --- a/techpack/audio/dsp/apr_mius.c +++ /dev/null @@ -1,467 +0,0 @@ -/** - * Mi - */ - -#include -#include -#include -#include -#include -#include -#include "../asoc/msm-pcm-routing-v2.h" -#include -#include -#include -#include -#include -#include - -#ifndef min -#define min(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -enum { - HALL_SLIDER_UP = 4, - HALL_SLIDER_DOWN = 5, - HALL_SLIDING = 6, -}; - -enum driver_sensor_type { - DRIVER_SENSOR_HALL = 35, -}; - -struct driver_sensor_event { - enum driver_sensor_type type; - union { - int32_t event; - int32_t reserved[2]; - }; -}; - - - -static int afe_set_parameter(int port, - int param_id, - int module_id, - struct afe_mi_ultrasound_set_params_t *prot_config, - uint32_t length) -{ - struct afe_port_cmd_set_param_v2 *set_param_v2 = NULL; - uint32_t set_param_v2_size = sizeof(struct afe_port_cmd_set_param_v2); - struct afe_port_cmd_set_param_v3 *set_param_v3 = NULL; - uint32_t set_param_v3_size = sizeof(struct afe_port_cmd_set_param_v3); - struct param_hdr_v3 param_hdr = {0}; - u16 port_id = 0; - int index = 0; - u8 *packed_param_data = NULL; - int packed_data_size = sizeof(union param_hdrs) + length; - int ret = 0; - - pr_debug("[MIUS]: inside %s\n", __func__); - - port_id = q6audio_get_port_id(port); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - index = q6audio_get_port_index(port); - - param_hdr.module_id = module_id; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = param_id; - param_hdr.param_size = length; - pr_debug("[MIUS]: param_size %d\n", length); - - packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); - if (packed_param_data == NULL) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, (u8 *)prot_config, - &packed_data_size); - if (ret) { - pr_err("%s: Failed to pack param header and data, error %d\n", - __func__, ret); - goto fail_cmd; - } - - if (q6common_is_instance_id_supported()) { - set_param_v3_size += packed_data_size; - set_param_v3 = kzalloc(set_param_v3_size, GFP_KERNEL); - if (set_param_v3 == NULL) { - ret = -ENOMEM; - goto fail_cmd; - } - - set_param_v3->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param_v3->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v3) + - packed_data_size; - set_param_v3->apr_hdr.src_port = 0; - set_param_v3->apr_hdr.dest_port = 0; - set_param_v3->apr_hdr.token = index; - set_param_v3->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; - set_param_v3->port_id = port_id; - set_param_v3->payload_size = packed_data_size; - memcpy(&set_param_v3->param_data, packed_param_data, - packed_data_size); - - atomic_set(mius_afe.ptr_state, 1); - ret = apr_send_pkt(*mius_afe.ptr_apr, (uint32_t *) set_param_v3); - } else { - set_param_v2_size += packed_data_size; - set_param_v2 = kzalloc(set_param_v2_size, GFP_KERNEL); - if (set_param_v2 == NULL) { - ret = -ENOMEM; - goto fail_cmd; - } - - set_param_v2->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param_v2->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v2) + - packed_data_size; - set_param_v2->apr_hdr.src_port = 0; - set_param_v2->apr_hdr.dest_port = 0; - set_param_v2->apr_hdr.token = index; - set_param_v2->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; - set_param_v2->port_id = port_id; - set_param_v2->payload_size = packed_data_size; - memcpy(&set_param_v2->param_data, packed_param_data, - packed_data_size); - - atomic_set(mius_afe.ptr_state, 1); - ret = apr_send_pkt(*mius_afe.ptr_apr, (uint32_t *) set_param_v2); - } - if (ret < 0) { - pr_err("%s: Setting param for port %d param[0x%x]failed\n", - __func__, port, param_id); - goto fail_cmd; - } - ret = wait_event_timeout(mius_afe.ptr_wait[index], - (atomic_read(mius_afe.ptr_state) == 0), - msecs_to_jiffies(mius_afe.timeout_ms*10)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - if (atomic_read(mius_afe.ptr_status) != 0) { - pr_err("%s: set param cmd failed\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - ret = 0; -fail_cmd: - pr_debug("%s param_id %x status %d\n", __func__, param_id, ret); - kfree(set_param_v2); - kfree(set_param_v3); - kfree(packed_param_data); - return ret; -} - - -int32_t mi_ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, - u8 *user_params, int32_t length) { - - int32_t ret = 0; - uint32_t module_id; - - if (port_id == MIUS_PORT_ID) - module_id = MIUS_ULTRASOUND_MODULE_TX; - else - module_id = MIUS_ULTRASOUND_MODULE_RX; - - ret = afe_set_parameter(port_id, - param_id, module_id, - (struct afe_mi_ultrasound_set_params_t *)user_params, - length); - - return ret; -} - -#if 0 -static int32_t process_version_msg(uint32_t *payload, uint32_t payload_size) -{ - struct mius_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= MIUS_VERSION_INFO_SIZE) { - pr_debug("[MIUS]: mius_version copied to local AP cache"); - data_block = - mius_get_shared_obj( - MIUS_OBJ_ID_VERSION_INFO); - copy_size = min_t(size_t, data_block->size, - (size_t)MIUS_VERSION_INFO_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_branch_msg(uint32_t *payload, uint32_t payload_size) -{ - struct mius_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= MIUS_BRANCH_INFO_SIZE) { - pr_debug("[MIUS]: mius_branch copied to local AP cache"); - data_block = - mius_get_shared_obj( - MIUS_OBJ_ID_BRANCH_INFO); - copy_size = min_t(size_t, data_block->size, - (size_t)MIUS_BRANCH_INFO_MAX_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_tag_msg(uint32_t *payload, uint32_t payload_size) -{ - struct mius_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= MIUS_TAG_INFO_SIZE) { - pr_debug("[MIUS]: mius_tag copied to local AP cache"); - data_block = - mius_get_shared_obj( - MIUS_OBJ_ID_TAG_INFO); - copy_size = min_t(size_t, data_block->size, - (size_t)MIUS_TAG_INFO_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_calibration_msg(uint32_t *payload, uint32_t payload_size) -{ - struct mius_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= MIUS_CALIBRATION_DATA_SIZE) { - pr_debug("[MIUS]: calibration_data copied to local AP cache"); - - data_block = mius_get_shared_obj( - MIUS_OBJ_ID_CALIBRATION_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)MIUS_CALIBRATION_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - mius_set_calibration_data((u8 *)&payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_calibration_v2_msg(uint32_t *payload, uint32_t payload_size) -{ - struct mius_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= MIUS_CALIBRATION_V2_DATA_SIZE) { - pr_debug("[MIUS]: calibration_data copied to local AP cache"); - - data_block = mius_get_shared_obj( - MIUS_OBJ_ID_CALIBRATION_V2_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)MIUS_CALIBRATION_V2_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - mius_set_calibration_data((u8 *)&payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_ml_msg(uint32_t *payload, uint32_t payload_size) -{ - struct mius_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= MIUS_ML_DATA_SIZE) { - pr_debug("[MIUS]: ml_data copied to local AP cache"); - - data_block = mius_get_shared_obj( - MIUS_OBJ_ID_ML_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)MIUS_ML_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_diagnostics_msg(uint32_t *payload, uint32_t payload_size) -{ - struct mius_shared_data_block *data_block = NULL; - size_t copy_size = 0; - int32_t ret = -1; - - pr_err("[MIUS]: %s() size:%d\n", __func__, payload_size); - - if (payload_size >= MIUS_DIAGNOSTICS_DATA_SIZE) { - pr_debug("[MIUS]: diagnostics_data copied to local AP cache"); - - data_block = mius_get_shared_obj( - MIUS_OBJ_ID_DIAGNOSTICS_DATA); - copy_size = min_t(size_t, data_block->size, - (size_t)MIUS_DIAGNOSTICS_DATA_SIZE); - - memcpy((u8 *)data_block->buffer, - &payload[3], copy_size); - ret = (int32_t)copy_size; - } - return ret; -} - -static int32_t process_sensorhub_msg(uint32_t *payload, uint32_t payload_size) -{ - int32_t ret = 0; - - pr_err("[MIUS]: %s, paramId:%u, size:%d\n", - __func__, payload[1], payload_size); - - return ret; -} - -#endif - -extern int us_afe_callback(int data); -static int ups_event = 0; - -int32_t mius_process_apr_payload(uint32_t *payload) -{ - uint32_t payload_size = 0; - int32_t ret = -1; - - //if (payload[0] == MIUS_ULTRASOUND_MODULE_TX) { - if (true) { - /* payload format - * payload[0] = Module ID - * payload[1] = Param ID - * payload[2] = LSB - payload size - * MSB - reserved(TBD) - * payload[3] = US data payload starts from here - */ - payload_size = payload[2] & 0xFFFF; -#if 0 - switch (payload[1]) { - case MIUS_ULTRASOUND_PARAM_ID_ENGINE_VERSION: - ret = process_version_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_BUILD_BRANCH: - ret = process_branch_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_TAG: - ret = process_tag_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_DATA: - ret = process_calibration_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA: - ret = process_calibration_v2_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_ML_DATA: - ret = process_ml_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA: - ret = process_diagnostics_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_SENSORHUB: - ret = process_sensorhub_msg(payload, payload_size); - break; - case MIUS_ULTRASOUND_PARAM_ID_ENGINE_DATA: -#endif - printk(KERN_DEBUG "[MIUS] mi us payload[3] = %d",(int)payload[3]); - if (payload[3] == 0 || payload[3] == 1) { - ups_event = payload[3]; - ret = (int32_t)us_afe_callback((const uint32_t)payload[3]); - } else { - - ups_event = ups_event ^ 1; - printk(KERN_DEBUG "[MIUS] >> change ups to %d", ups_event); - ret = (int32_t)us_afe_callback((uint32_t)ups_event); - } - - if (ret != 0) { - pr_err("[MIUS] : failed to push apr payload to mius device"); - return ret; - } - ret = payload_size; -#if 0 - break; - default: - { - pr_err("[MIUS] : mius_process_apr_payload, Illegal paramId:%u", payload[1]); - } - break; - } -#endif - } else { - pr_debug("[MIUS]: Invalid Ultrasound Module ID %d\n", - payload[0]); - } - return ret; -} - -int mius_set_hall_state(int state) -{ - struct driver_sensor_event dse; - int ret = -1; - - dse.type = DRIVER_SENSOR_HALL; - - switch (state) { - case 0: - dse.event = HALL_SLIDER_UP; - break; - case 1: - dse.event = HALL_SLIDER_DOWN; - break; - case 2: - dse.event = HALL_SLIDING; - break; - default: - pr_err("%s Invalid HALL state:%d\n", __func__, state); - return ret; - } - - ret = afe_set_parameter(MIUS_PORT_ID, - 2, MIUS_ULTRASOUND_MODULE_TX, - (struct afe_mi_ultrasound_set_params_t *)&dse, - sizeof(dse)); - return ret; -} -EXPORT_SYMBOL(mius_set_hall_state); diff --git a/techpack/audio/dsp/audio_cal_utils.c b/techpack/audio/dsp/audio_cal_utils.c deleted file mode 100644 index d8c4ea1670e0..000000000000 --- a/techpack/audio/dsp/audio_cal_utils.c +++ /dev/null @@ -1,1078 +0,0 @@ -/* Copyright (c) 2014-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include - -static int unmap_memory(struct cal_type_data *cal_type, - struct cal_block_data *cal_block); - -size_t get_cal_info_size(int32_t cal_type) -{ - size_t size = 0; - size_t size1 = 0, size2 = 0; - - switch (cal_type) { - case CVP_VOC_RX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_top); - break; - case CVP_VOC_TX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_top); - break; - case CVP_VOCPROC_STATIC_CAL_TYPE: - size = sizeof(struct audio_cal_info_vocproc); - break; - case CVP_VOCPROC_DYNAMIC_CAL_TYPE: - size = sizeof(struct audio_cal_info_vocvol); - break; - case CVS_VOCSTRM_STATIC_CAL_TYPE: - size = 0; - break; - case CVP_VOCDEV_CFG_CAL_TYPE: - size = sizeof(struct audio_cal_info_vocdev_cfg); - break; - case CVP_VOCPROC_STATIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_col); - break; - case CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_col); - break; - case CVS_VOCSTRM_STATIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_info_voc_col); - break; - case ADM_TOPOLOGY_CAL_TYPE: - case ADM_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_adm_top); - break; - case ADM_CUST_TOPOLOGY_CAL_TYPE: - case CORE_CUSTOM_TOPOLOGIES_CAL_TYPE: - size = 0; - break; - case ADM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: - size = sizeof(struct audio_cal_info_audproc); - break; - case ADM_AUDVOL_CAL_TYPE: - case ADM_RTAC_AUDVOL_CAL_TYPE: - size = sizeof(struct audio_cal_info_audvol); - break; - case ASM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_asm_top); - break; - case ASM_CUST_TOPOLOGY_CAL_TYPE: - size = 0; - break; - case ASM_AUDSTRM_CAL_TYPE: - size = sizeof(struct audio_cal_info_audstrm); - break; - case AFE_TOPOLOGY_CAL_TYPE: - case AFE_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe_top); - break; - case AFE_CUST_TOPOLOGY_CAL_TYPE: - size = 0; - break; - case AFE_COMMON_RX_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe); - break; - case AFE_COMMON_TX_CAL_TYPE: - case AFE_LSM_TX_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe); - break; - case AFE_FB_SPKR_PROT_CAL_TYPE: - size = sizeof(struct audio_cal_info_spk_prot_cfg); - break; - case AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size1 = max(sizeof(struct audio_cal_info_sp_th_vi_ftm_cfg), - sizeof(struct audio_cal_info_sp_th_vi_param)); - size2 = max(sizeof(struct audio_cal_info_sp_th_vi_v_vali_cfg), - sizeof(struct audio_cal_info_sp_th_vi_v_vali_param)); - size = max(size1, size2); - break; - case AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size = max(sizeof(struct audio_cal_info_sp_ex_vi_ftm_cfg), - sizeof(struct audio_cal_info_sp_ex_vi_param)); - break; - case AFE_ANC_CAL_TYPE: - size = 0; - break; - case AFE_AANC_CAL_TYPE: - size = sizeof(struct audio_cal_info_aanc); - break; - case AFE_HW_DELAY_CAL_TYPE: - size = sizeof(struct audio_cal_info_hw_delay); - break; - case AFE_SIDETONE_CAL_TYPE: - size = sizeof(struct audio_cal_info_sidetone); - break; - case AFE_SIDETONE_IIR_CAL_TYPE: - size = sizeof(struct audio_cal_info_sidetone_iir); - break; - case LSM_CUST_TOPOLOGY_CAL_TYPE: - size = 0; - break; - case LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm_top); - break; - case ULP_LSM_TOPOLOGY_ID_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm_top); - break; - case LSM_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm); - break; - case ADM_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case ADM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case ASM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_APR_CAL_TYPE: - size = 0; - break; - case MAD_CAL_TYPE: - size = 0; - break; - case ULP_AFE_CAL_TYPE: - size = sizeof(struct audio_cal_info_afe); - break; - case ULP_LSM_CAL_TYPE: - size = sizeof(struct audio_cal_info_lsm); - break; - case AUDIO_CORE_METAINFO_CAL_TYPE: - size = sizeof(struct audio_cal_info_metainfo); - break; - case SRS_TRUMEDIA_CAL_TYPE: - size = 0; - break; - default: - pr_err("%s:Invalid cal type %d!", - __func__, cal_type); - } - return size; -} - -size_t get_user_cal_type_size(int32_t cal_type) -{ - size_t size = 0; - - switch (cal_type) { - case CVP_VOC_RX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_voc_top); - break; - case CVP_VOC_TX_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_voc_top); - break; - case CVP_VOCPROC_STATIC_CAL_TYPE: - size = sizeof(struct audio_cal_type_vocproc); - break; - case CVP_VOCPROC_DYNAMIC_CAL_TYPE: - size = sizeof(struct audio_cal_type_vocvol); - break; - case CVS_VOCSTRM_STATIC_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case CVP_VOCDEV_CFG_CAL_TYPE: - size = sizeof(struct audio_cal_type_vocdev_cfg); - break; - case CVP_VOCPROC_STATIC_COL_CAL_TYPE: - case CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE: - case CVS_VOCSTRM_STATIC_COL_CAL_TYPE: - size = sizeof(struct audio_cal_type_voc_col); - break; - case ADM_TOPOLOGY_CAL_TYPE: - case ADM_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_adm_top); - break; - case ADM_CUST_TOPOLOGY_CAL_TYPE: - case CORE_CUSTOM_TOPOLOGIES_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case ADM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_CAL_TYPE: - case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: - size = sizeof(struct audio_cal_type_audproc); - break; - case ADM_AUDVOL_CAL_TYPE: - case ADM_RTAC_AUDVOL_CAL_TYPE: - size = sizeof(struct audio_cal_type_audvol); - break; - case ASM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_asm_top); - break; - case ASM_CUST_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case ASM_AUDSTRM_CAL_TYPE: - size = sizeof(struct audio_cal_type_audstrm); - break; - case AFE_TOPOLOGY_CAL_TYPE: - case AFE_LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe_top); - break; - case AFE_CUST_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case AFE_COMMON_RX_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe); - break; - case AFE_COMMON_TX_CAL_TYPE: - case AFE_LSM_TX_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe); - break; - case AFE_FB_SPKR_PROT_CAL_TYPE: - size = sizeof(struct audio_cal_type_fb_spk_prot_cfg); - break; - case AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size = max(sizeof(struct audio_cal_type_sp_th_vi_ftm_cfg), - sizeof(struct audio_cal_type_sp_th_vi_param)); - break; - case AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE: - /* - * Since get and set parameter structures are different in size - * use the maximum size of get and set parameter structure - */ - size = max(sizeof(struct audio_cal_type_sp_ex_vi_ftm_cfg), - sizeof(struct audio_cal_type_sp_ex_vi_param)); - break; - case AFE_ANC_CAL_TYPE: - size = 0; - break; - case AFE_AANC_CAL_TYPE: - size = sizeof(struct audio_cal_type_aanc); - break; - case AFE_HW_DELAY_CAL_TYPE: - size = sizeof(struct audio_cal_type_hw_delay); - break; - case AFE_SIDETONE_CAL_TYPE: - size = sizeof(struct audio_cal_type_sidetone); - break; - case AFE_SIDETONE_IIR_CAL_TYPE: - size = sizeof(struct audio_cal_type_sidetone_iir); - break; - case LSM_CUST_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_basic); - break; - case LSM_TOPOLOGY_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm_top); - break; - case ULP_LSM_TOPOLOGY_ID_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm_top); - break; - case LSM_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm); - break; - case ADM_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_INFO_CAL_TYPE: - size = 0; - break; - case ADM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case ASM_RTAC_APR_CAL_TYPE: - size = 0; - break; - case VOICE_RTAC_APR_CAL_TYPE: - size = 0; - break; - case MAD_CAL_TYPE: - size = 0; - break; - case ULP_AFE_CAL_TYPE: - size = sizeof(struct audio_cal_type_afe); - break; - case ULP_LSM_CAL_TYPE: - size = sizeof(struct audio_cal_type_lsm); - break; - case AUDIO_CORE_METAINFO_CAL_TYPE: - size = sizeof(struct audio_cal_type_metainfo); - break; - case SRS_TRUMEDIA_CAL_TYPE: - size = 0; - break; - default: - pr_err("%s:Invalid cal type %d!", - __func__, cal_type); - } - return size; -} - -int32_t cal_utils_get_cal_type_version(void *cal_type_data) -{ - struct audio_cal_type_basic *data = NULL; - - data = (struct audio_cal_type_basic *)cal_type_data; - - return data->cal_hdr.version; -} - -static struct cal_type_data *create_cal_type_data( - struct cal_type_info *info) -{ - struct cal_type_data *cal_type = NULL; - - if ((info->reg.cal_type < 0) || - (info->reg.cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d is Invalid!\n", - __func__, info->reg.cal_type); - goto done; - } - - if (info->cal_util_callbacks.match_block == NULL) { - pr_err("%s: cal type %d no method to match blocks!\n", - __func__, info->reg.cal_type); - goto done; - } - - cal_type = kmalloc(sizeof(*cal_type), GFP_KERNEL); - if (cal_type == NULL) - goto done; - - INIT_LIST_HEAD(&cal_type->cal_blocks); - mutex_init(&cal_type->lock); - memcpy(&cal_type->info, info, - sizeof(cal_type->info)); -done: - return cal_type; -} - -/** - * cal_utils_create_cal_types - * - * @num_cal_types: number of types - * @cal_type: pointer to the cal types pointer - * @info: pointer to info - * - * Returns 0 on success, EINVAL otherwise - */ -int cal_utils_create_cal_types(int num_cal_types, - struct cal_type_data **cal_type, - struct cal_type_info *info) -{ - int ret = 0; - int i; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if (info == NULL) { - pr_err("%s: info is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - ret = -EINVAL; - goto done; - } - - for (i = 0; i < num_cal_types; i++) { - if ((info[i].reg.cal_type < 0) || - (info[i].reg.cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d at index %d is Invalid!\n", - __func__, info[i].reg.cal_type, i); - ret = -EINVAL; - goto done; - } - - cal_type[i] = create_cal_type_data(&info[i]); - if (cal_type[i] == NULL) { - pr_err("%s: Could not allocate cal_type of index %d!\n", - __func__, i); - ret = -EINVAL; - goto done; - } - - ret = audio_cal_register(1, &info[i].reg); - if (ret < 0) { - pr_err("%s: audio_cal_register failed, ret = %d!\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - pr_debug("%s: cal type %d at index %d!\n", - __func__, info[i].reg.cal_type, i); - } -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_create_cal_types); - -static void delete_cal_block(struct cal_block_data *cal_block) -{ - pr_debug("%s\n", __func__); - - if (cal_block == NULL) - goto done; - - list_del(&cal_block->list); - kfree(cal_block->client_info); - cal_block->client_info = NULL; - kfree(cal_block->cal_info); - cal_block->cal_info = NULL; - if (cal_block->map_data.dma_buf != NULL) { - msm_audio_ion_free(cal_block->map_data.dma_buf); - cal_block->map_data.dma_buf = NULL; - } - kfree(cal_block); -done: - return; -} - -static void destroy_all_cal_blocks(struct cal_type_data *cal_type) -{ - int ret = 0; - struct list_head *ptr, *next; - struct cal_block_data *cal_block; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - ret = unmap_memory(cal_type, cal_block); - if (ret < 0) { - pr_err("%s: unmap_memory failed, cal type %d, ret = %d!\n", - __func__, - cal_type->info.reg.cal_type, - ret); - } - delete_cal_block(cal_block); - cal_block = NULL; - } -} - -static void destroy_cal_type_data(struct cal_type_data *cal_type) -{ - if (cal_type == NULL) - goto done; - - destroy_all_cal_blocks(cal_type); - list_del(&cal_type->cal_blocks); - kfree(cal_type); -done: - return; -} - -/** - * cal_utils_destroy_cal_types - - * Destroys cal types and deregister from cal info - * - * @num_cal_types: number of cal types - * @cal_type: cal type pointer with cal info - * - */ -void cal_utils_destroy_cal_types(int num_cal_types, - struct cal_type_data **cal_type) -{ - int i; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - goto done; - } - - for (i = 0; i < num_cal_types; i++) { - audio_cal_deregister(1, &cal_type[i]->info.reg); - destroy_cal_type_data(cal_type[i]); - cal_type[i] = NULL; - } -done: - return; -} -EXPORT_SYMBOL(cal_utils_destroy_cal_types); - -/** - * cal_utils_get_only_cal_block - * - * @cal_type: pointer to the cal type - * - * Returns cal_block structure - */ -struct cal_block_data *cal_utils_get_only_cal_block( - struct cal_type_data *cal_type) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - - if (cal_type == NULL) - goto done; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - break; - } -done: - return cal_block; -} -EXPORT_SYMBOL(cal_utils_get_only_cal_block); - -/** - * cal_utils_get_only_cal_block - * - * @cal_block: pointer to cal block struct - * @user_data: pointer to user data - * - * Returns true on match - */ -bool cal_utils_match_buf_num(struct cal_block_data *cal_block, - void *user_data) -{ - bool ret = false; - struct audio_cal_type_basic *data = user_data; - - if (cal_block->buffer_number == data->cal_hdr.buffer_number) - ret = true; - - return ret; -} -EXPORT_SYMBOL(cal_utils_match_buf_num); - -static struct cal_block_data *get_matching_cal_block( - struct cal_type_data *cal_type, - void *data) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_type->info.cal_util_callbacks. - match_block(cal_block, data)) - return cal_block; - } - - return NULL; -} - -static int cal_block_ion_alloc(struct cal_block_data *cal_block) -{ - int ret = 0; - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = msm_audio_ion_import(&cal_block->map_data.dma_buf, - cal_block->map_data.ion_map_handle, - NULL, 0, - &cal_block->cal_data.paddr, - &cal_block->map_data.map_size, - &cal_block->cal_data.kvaddr); - if (ret) { - pr_err("%s: audio ION import failed, rc = %d\n", - __func__, ret); - ret = -ENOMEM; - goto done; - } -done: - return ret; -} - -static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, - struct audio_cal_type_basic *basic_cal, - size_t client_info_size, void *client_info) -{ - struct cal_block_data *cal_block = NULL; - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - goto done; - } else if (basic_cal == NULL) { - pr_err("%s: basic_cal is NULL!\n", __func__); - goto done; - } - - cal_block = kzalloc(sizeof(*cal_block), - GFP_KERNEL); - if (cal_block == NULL) - goto done; - - INIT_LIST_HEAD(&cal_block->list); - - cal_block->map_data.ion_map_handle = basic_cal->cal_data.mem_handle; - if (basic_cal->cal_data.mem_handle > 0) { - if (cal_block_ion_alloc(cal_block)) { - pr_err("%s: cal_block_ion_alloc failed!\n", - __func__); - goto err; - } - } - if (client_info_size > 0) { - cal_block->client_info_size = client_info_size; - cal_block->client_info = kmalloc(client_info_size, GFP_KERNEL); - if (cal_block->client_info == NULL) { - pr_err("%s: could not allocats client_info!\n", - __func__); - goto err; - } - if (client_info != NULL) - memcpy(cal_block->client_info, client_info, - client_info_size); - } - - cal_block->cal_info = kzalloc( - get_cal_info_size(cal_type->info.reg.cal_type), - GFP_KERNEL); - if (cal_block->cal_info == NULL) { - pr_err("%s: could not allocats cal_info!\n", - __func__); - goto err; - } - cal_block->buffer_number = basic_cal->cal_hdr.buffer_number; - list_add_tail(&cal_block->list, &cal_type->cal_blocks); - pr_debug("%s: created block for cal type %d, buf num %d, map handle %d, map size %zd paddr 0x%pK!\n", - __func__, cal_type->info.reg.cal_type, - cal_block->buffer_number, - cal_block->map_data.ion_map_handle, - cal_block->map_data.map_size, - &cal_block->cal_data.paddr); -done: - return cal_block; -err: - kfree(cal_block->cal_info); - cal_block->cal_info = NULL; - kfree(cal_block->client_info); - cal_block->client_info = NULL; - kfree(cal_block); - cal_block = NULL; - return cal_block; -} - -void cal_utils_clear_cal_block_q6maps(int num_cal_types, - struct cal_type_data **cal_type) -{ - int i = 0; - struct list_head *ptr, *next; - struct cal_block_data *cal_block; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", __func__); - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - goto done; - } - - for (; i < num_cal_types; i++) { - if (cal_type[i] == NULL) - continue; - - mutex_lock(&cal_type[i]->lock); - list_for_each_safe(ptr, next, - &cal_type[i]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - cal_block->map_data.q6map_handle = 0; - } - mutex_unlock(&cal_type[i]->lock); - } -done: - return; -} - - - -static int realloc_memory(struct cal_block_data *cal_block) -{ - int ret = 0; - - msm_audio_ion_free(cal_block->map_data.dma_buf); - cal_block->map_data.dma_buf = NULL; - cal_block->cal_data.size = 0; - - ret = cal_block_ion_alloc(cal_block); - if (ret < 0) - pr_err("%s: realloc_memory failed!\n", - __func__); - return ret; -} - -static int map_memory(struct cal_type_data *cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - - - if (cal_type->info.cal_util_callbacks.map_cal != NULL) { - if ((cal_block->map_data.ion_map_handle < 0) || - (cal_block->map_data.map_size <= 0) || - (cal_block->map_data.q6map_handle != 0)) { - goto done; - } - - pr_debug("%s: cal type %d call map\n", - __func__, cal_type->info.reg.cal_type); - ret = cal_type->info.cal_util_callbacks. - map_cal(cal_type->info.reg.cal_type, cal_block); - if (ret < 0) { - pr_err("%s: map_cal failed, cal type %d, ret = %d!\n", - __func__, cal_type->info.reg.cal_type, - ret); - goto done; - } - } -done: - return ret; -} - -static int unmap_memory(struct cal_type_data *cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - - if (cal_type->info.cal_util_callbacks.unmap_cal != NULL) { - if ((cal_block->map_data.ion_map_handle < 0) || - (cal_block->map_data.map_size <= 0) || - (cal_block->map_data.q6map_handle == 0)) { - goto done; - } - pr_debug("%s: cal type %d call unmap\n", - __func__, cal_type->info.reg.cal_type); - ret = cal_type->info.cal_util_callbacks. - unmap_cal(cal_type->info.reg.cal_type, cal_block); - if (ret < 0) { - pr_err("%s: unmap_cal failed, cal type %d, ret = %d!\n", - __func__, cal_type->info.reg.cal_type, - ret); - goto done; - } - } -done: - return ret; -} - -/** - * cal_utils_alloc_cal - * - * @data_size: size of data to allocate - * @data: data pointer - * @cal_type: pointer to the cal type - * @client_info_size: client info size - * @client_info: pointer to client info - * - * Returns 0 on success, appropriate error code otherwise - */ -int cal_utils_alloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info) -{ - int ret = 0; - struct cal_block_data *cal_block; - struct audio_cal_type_alloc *alloc_data = data; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", - __func__); - ret = -EINVAL; - goto done; - } - if (data_size < sizeof(struct audio_cal_type_alloc)) { - pr_err("%s: data_size of %zd does not equal alloc struct size of %zd!\n", - __func__, data_size, - sizeof(struct audio_cal_type_alloc)); - ret = -EINVAL; - goto done; - } - if ((client_info_size > 0) && (client_info == NULL)) { - pr_err("%s: User info pointer is NULL but size is %zd!\n", - __func__, client_info_size); - ret = -EINVAL; - goto done; - } - - if (alloc_data->cal_data.mem_handle < 0) { - pr_err("%s: mem_handle %d invalid!\n", - __func__, alloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto done; - } - - mutex_lock(&cal_type->lock); - - cal_block = get_matching_cal_block(cal_type, - data); - if (cal_block != NULL) { - ret = unmap_memory(cal_type, cal_block); - if (ret < 0) - goto err; - ret = realloc_memory(cal_block); - if (ret < 0) - goto err; - } else { - cal_block = create_cal_block(cal_type, - (struct audio_cal_type_basic *)alloc_data, - client_info_size, client_info); - if (cal_block == NULL) { - pr_err("%s: create_cal_block failed for %d!\n", - __func__, alloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto err; - } - } - - ret = map_memory(cal_type, cal_block); - if (ret < 0) - goto err; -err: - mutex_unlock(&cal_type->lock); -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_alloc_cal); - -/** - * cal_utils_dealloc_cal - * - * @data_size: size of data to allocate - * @data: data pointer - * @cal_type: pointer to the cal type - * - * Returns 0 on success, appropriate error code otherwise - */ -int cal_utils_dealloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type) -{ - int ret = 0; - struct cal_block_data *cal_block; - struct audio_cal_type_dealloc *dealloc_data = data; - - pr_debug("%s\n", __func__); - - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", - __func__); - ret = -EINVAL; - goto done; - } - - if (data_size < sizeof(struct audio_cal_type_dealloc)) { - pr_err("%s: data_size of %zd does not equal struct size of %zd!\n", - __func__, data_size, - sizeof(struct audio_cal_type_dealloc)); - ret = -EINVAL; - goto done; - } - - if ((dealloc_data->cal_data.mem_handle == -1) && - (dealloc_data->cal_hdr.buffer_number == ALL_CAL_BLOCKS)) { - destroy_all_cal_blocks(cal_type); - goto done; - } - - if (dealloc_data->cal_data.mem_handle < 0) { - pr_err("%s: mem_handle %d invalid!\n", - __func__, dealloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto done; - } - - mutex_lock(&cal_type->lock); - cal_block = get_matching_cal_block( - cal_type, - data); - if (cal_block == NULL) { - pr_err("%s: allocation does not exist for %d!\n", - __func__, dealloc_data->cal_data.mem_handle); - ret = -EINVAL; - goto err; - } - - ret = unmap_memory(cal_type, cal_block); - if (ret < 0) - goto err; - - delete_cal_block(cal_block); -err: - mutex_unlock(&cal_type->lock); -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_dealloc_cal); - -/** - * cal_utils_set_cal - * - * @data_size: size of data to allocate - * @data: data pointer - * @cal_type: pointer to the cal type - * @client_info_size: client info size - * @client_info: pointer to client info - * - * Returns 0 on success, appropriate error code otherwise - */ -int cal_utils_set_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info) -{ - int ret = 0; - struct cal_block_data *cal_block; - struct audio_cal_type_basic *basic_data = data; - - pr_debug("%s\n", __func__); - - if (cal_type == NULL) { - pr_err("%s: cal_type is NULL!\n", - __func__); - ret = -EINVAL; - goto done; - } - - if ((client_info_size > 0) && (client_info == NULL)) { - pr_err("%s: User info pointer is NULL but size is %zd!\n", - __func__, client_info_size); - ret = -EINVAL; - goto done; - } - - if ((data_size > get_user_cal_type_size( - cal_type->info.reg.cal_type)) || (data_size < 0)) { - pr_err("%s: cal_type %d, data_size of %zd is invalid, expecting %zd!\n", - __func__, cal_type->info.reg.cal_type, data_size, - get_user_cal_type_size(cal_type->info.reg.cal_type)); - ret = -EINVAL; - goto done; - } - - mutex_lock(&cal_type->lock); - cal_block = get_matching_cal_block( - cal_type, - data); - if (cal_block == NULL) { - if (basic_data->cal_data.mem_handle > 0) { - pr_err("%s: allocation does not exist for %d!\n", - __func__, basic_data->cal_data.mem_handle); - ret = -EINVAL; - goto err; - } else { - cal_block = create_cal_block( - cal_type, - basic_data, - client_info_size, client_info); - if (cal_block == NULL) { - pr_err("%s: create_cal_block failed for cal type %d!\n", - __func__, - cal_type->info.reg.cal_type); - ret = -EINVAL; - goto err; - } - } - } - - ret = map_memory(cal_type, cal_block); - if (ret < 0) - goto err; - - cal_block->cal_data.size = basic_data->cal_data.cal_size; - - if (client_info_size > 0) { - memcpy(cal_block->client_info, - client_info, - client_info_size); - } - - memcpy(cal_block->cal_info, - ((uint8_t *)data + sizeof(struct audio_cal_type_basic)), - data_size - sizeof(struct audio_cal_type_basic)); - - /* reset buffer stale flag */ - cal_block->cal_stale = false; - -err: - mutex_unlock(&cal_type->lock); -done: - return ret; -} -EXPORT_SYMBOL(cal_utils_set_cal); - -/** - * cal_utils_mark_cal_used - * - * @cal_block: pointer to cal block - */ -void cal_utils_mark_cal_used(struct cal_block_data *cal_block) -{ - if (cal_block) - cal_block->cal_stale = true; -} -EXPORT_SYMBOL(cal_utils_mark_cal_used); - -/** - * cal_utils_is_cal_stale - * - * @cal_block: pointer to cal block - * - * Returns true if cal block is stale, false otherwise - */ -bool cal_utils_is_cal_stale(struct cal_block_data *cal_block) -{ - if ((cal_block) && (cal_block->cal_stale)) - return true; - - return false; -} -EXPORT_SYMBOL(cal_utils_is_cal_stale); diff --git a/techpack/audio/dsp/audio_calibration.c b/techpack/audio/dsp/audio_calibration.c deleted file mode 100644 index c895fa788315..000000000000 --- a/techpack/audio/dsp/audio_calibration.c +++ /dev/null @@ -1,635 +0,0 @@ -/* Copyright (c) 2014, 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct audio_cal_client_info { - struct list_head list; - struct audio_cal_callbacks *callbacks; -}; - -struct audio_cal_info { - struct mutex common_lock; - struct mutex cal_mutex[MAX_CAL_TYPES]; - struct list_head client_info[MAX_CAL_TYPES]; - int ref_count; -}; - -static struct audio_cal_info audio_cal; - - -static bool callbacks_are_equal(struct audio_cal_callbacks *callback1, - struct audio_cal_callbacks *callback2) -{ - bool ret = true; - struct audio_cal_callbacks *call1 = callback1; - struct audio_cal_callbacks *call2 = callback2; - - pr_debug("%s\n", __func__); - - if ((call1 == NULL) && (call2 == NULL)) - ret = true; - else if ((call1 == NULL) || (call2 == NULL)) - ret = false; - else if ((call1->alloc != call2->alloc) || - (call1->dealloc != call2->dealloc) || - (call1->pre_cal != call2->pre_cal) || - (call1->set_cal != call2->set_cal) || - (call1->get_cal != call2->get_cal) || - (call1->post_cal != call2->post_cal)) - ret = false; - return ret; -} - -int audio_cal_deregister(int num_cal_types, - struct audio_cal_reg *reg_data) -{ - int ret = 0; - int i = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s\n", __func__); - - if (reg_data == NULL) { - pr_err("%s: reg_data is NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - ret = -EINVAL; - goto done; - } - - for (; i < num_cal_types; i++) { - if ((reg_data[i].cal_type < 0) || - (reg_data[i].cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d at index %d is Invalid!\n", - __func__, reg_data[i].cal_type, i); - ret = -EINVAL; - continue; - } - - mutex_lock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - list_for_each_safe(ptr, next, - &audio_cal.client_info[reg_data[i].cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - if (callbacks_are_equal(client_info_node->callbacks, - ®_data[i].callbacks)) { - list_del(&client_info_node->list); - kfree(client_info_node->callbacks); - client_info_node->callbacks = NULL; - kfree(client_info_node); - client_info_node = NULL; - break; - } - } - mutex_unlock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - } -done: - return ret; -} - - -int audio_cal_register(int num_cal_types, - struct audio_cal_reg *reg_data) -{ - int ret = 0; - int i = 0; - struct audio_cal_client_info *client_info_node = NULL; - struct audio_cal_callbacks *callback_node = NULL; - - pr_debug("%s\n", __func__); - - if (reg_data == NULL) { - pr_err("%s: callbacks are NULL!\n", __func__); - ret = -EINVAL; - goto done; - } else if ((num_cal_types <= 0) || - (num_cal_types > MAX_CAL_TYPES)) { - pr_err("%s: num_cal_types of %d is Invalid!\n", - __func__, num_cal_types); - ret = -EINVAL; - goto done; - } - - for (; i < num_cal_types; i++) { - if ((reg_data[i].cal_type < 0) || - (reg_data[i].cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d at index %d is Invalid!\n", - __func__, reg_data[i].cal_type, i); - ret = -EINVAL; - goto err; - } - - client_info_node = kmalloc(sizeof(*client_info_node), - GFP_KERNEL); - if (client_info_node == NULL) { - ret = -ENOMEM; - goto err; - } - INIT_LIST_HEAD(&client_info_node->list); - - callback_node = kmalloc(sizeof(*callback_node), - GFP_KERNEL); - if (callback_node == NULL) { - ret = -ENOMEM; - goto err; - } - - memcpy(callback_node, ®_data[i].callbacks, - sizeof(*callback_node)); - client_info_node->callbacks = callback_node; - - mutex_lock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - list_add_tail(&client_info_node->list, - &audio_cal.client_info[reg_data[i].cal_type]); - mutex_unlock(&audio_cal.cal_mutex[reg_data[i].cal_type]); - } -done: - return ret; -err: - audio_cal_deregister(num_cal_types, reg_data); - return ret; -} - -static int call_allocs(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->alloc == NULL) - continue; - - ret2 = client_info_node->callbacks-> - alloc(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: alloc failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_deallocs(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->dealloc == NULL) - continue; - - ret2 = client_info_node->callbacks-> - dealloc(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: dealloc failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_pre_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->pre_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - pre_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: pre_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_post_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->post_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - post_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: post_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_set_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->set_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - set_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: set_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int call_get_cals(int32_t cal_type, - size_t cal_type_size, void *data) -{ - int ret = 0; - int ret2 = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node = NULL; - - pr_debug("%s cal type %d\n", __func__, cal_type); - - list_for_each_safe(ptr, next, - &audio_cal.client_info[cal_type]) { - - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - - if (client_info_node->callbacks->get_cal == NULL) - continue; - - ret2 = client_info_node->callbacks-> - get_cal(cal_type, cal_type_size, data); - if (ret2 < 0) { - pr_err("%s: get_cal failed!\n", __func__); - ret = ret2; - } - } - return ret; -} - -static int audio_cal_open(struct inode *inode, struct file *f) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&audio_cal.common_lock); - audio_cal.ref_count++; - mutex_unlock(&audio_cal.common_lock); - - return ret; -} - -static void dealloc_all_clients(void) -{ - int i = 0; - struct audio_cal_type_dealloc dealloc_data; - - pr_debug("%s\n", __func__); - - dealloc_data.cal_hdr.version = VERSION_0_0; - dealloc_data.cal_hdr.buffer_number = ALL_CAL_BLOCKS; - dealloc_data.cal_data.mem_handle = -1; - - for (; i < MAX_CAL_TYPES; i++) - call_deallocs(i, sizeof(dealloc_data), &dealloc_data); -} - -static int audio_cal_release(struct inode *inode, struct file *f) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&audio_cal.common_lock); - audio_cal.ref_count--; - if (audio_cal.ref_count <= 0) { - audio_cal.ref_count = 0; - dealloc_all_clients(); - } - mutex_unlock(&audio_cal.common_lock); - - return ret; -} - -static long audio_cal_shared_ioctl(struct file *file, unsigned int cmd, - void __user *arg) -{ - int ret = 0; - int32_t size; - struct audio_cal_basic *data = NULL; - - pr_debug("%s\n", __func__); - - switch (cmd) { - case AUDIO_ALLOCATE_CALIBRATION: - case AUDIO_DEALLOCATE_CALIBRATION: - case AUDIO_PREPARE_CALIBRATION: - case AUDIO_SET_CALIBRATION: - case AUDIO_GET_CALIBRATION: - case AUDIO_POST_CALIBRATION: - break; - default: - pr_err("%s: ioctl not found!\n", __func__); - ret = -EFAULT; - goto done; - } - - if (copy_from_user(&size, (void *)arg, sizeof(size))) { - pr_err("%s: Could not copy size value from user\n", __func__); - ret = -EFAULT; - goto done; - } else if ((size < sizeof(struct audio_cal_basic)) - || (size > MAX_IOCTL_CMD_SIZE)) { - pr_err("%s: Invalid size sent to driver: %d, max size is %d, min size is %zd\n", - __func__, size, MAX_IOCTL_CMD_SIZE, - sizeof(struct audio_cal_basic)); - ret = -EINVAL; - goto done; - } - - data = kmalloc(size, GFP_KERNEL); - if (data == NULL) { - ret = -ENOMEM; - goto done; - } else if (copy_from_user(data, (void *)arg, size)) { - pr_err("%s: Could not copy data from user\n", - __func__); - ret = -EFAULT; - goto done; - } else if ((data->hdr.cal_type < 0) || - (data->hdr.cal_type >= MAX_CAL_TYPES)) { - pr_err("%s: cal type %d is Invalid!\n", - __func__, data->hdr.cal_type); - ret = -EINVAL; - goto done; - } else if ((data->hdr.cal_type_size < - sizeof(struct audio_cal_type_basic)) || - (data->hdr.cal_type_size > - get_user_cal_type_size(data->hdr.cal_type))) { - pr_err("%s: cal type size %d is Invalid! Max is %zd!\n", - __func__, data->hdr.cal_type_size, - get_user_cal_type_size(data->hdr.cal_type)); - ret = -EINVAL; - goto done; - } else if (data->cal_type.cal_hdr.buffer_number < 0) { - pr_err("%s: cal type %d Invalid buffer number %d!\n", - __func__, data->hdr.cal_type, - data->cal_type.cal_hdr.buffer_number); - ret = -EINVAL; - goto done; - } else if ((data->hdr.cal_type_size + sizeof(data->hdr)) > size) { - pr_err("%s: cal type hdr size %zd + cal type size %d is greater than user buffer size %d\n", - __func__, sizeof(data->hdr), data->hdr.cal_type_size, - size); - ret = -EFAULT; - goto done; - } - - - mutex_lock(&audio_cal.cal_mutex[data->hdr.cal_type]); - - switch (cmd) { - case AUDIO_ALLOCATE_CALIBRATION: - ret = call_allocs(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_DEALLOCATE_CALIBRATION: - ret = call_deallocs(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_PREPARE_CALIBRATION: - ret = call_pre_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_SET_CALIBRATION: - ret = call_set_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_GET_CALIBRATION: - ret = call_get_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - case AUDIO_POST_CALIBRATION: - ret = call_post_cals(data->hdr.cal_type, - data->hdr.cal_type_size, &data->cal_type); - break; - } - - if (cmd == AUDIO_GET_CALIBRATION) { - if (data->hdr.cal_type_size == 0) - goto unlock; - if (data == NULL) - goto unlock; - if (copy_to_user(arg, data, - sizeof(data->hdr) + data->hdr.cal_type_size)) { - pr_err("%s: Could not copy cal type to user\n", - __func__); - ret = -EFAULT; - goto unlock; - } - } - -unlock: - mutex_unlock(&audio_cal.cal_mutex[data->hdr.cal_type]); -done: - kfree(data); - return ret; -} - -static long audio_cal_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - return audio_cal_shared_ioctl(f, cmd, (void __user *)arg); -} - -#ifdef CONFIG_COMPAT - -#define AUDIO_ALLOCATE_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 200, compat_uptr_t) -#define AUDIO_DEALLOCATE_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 201, compat_uptr_t) -#define AUDIO_PREPARE_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 202, compat_uptr_t) -#define AUDIO_SET_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 203, compat_uptr_t) -#define AUDIO_GET_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 204, compat_uptr_t) -#define AUDIO_POST_CALIBRATION32 _IOWR(CAL_IOCTL_MAGIC, \ - 205, compat_uptr_t) - -static long audio_cal_compat_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - unsigned int cmd64; - int ret = 0; - - switch (cmd) { - case AUDIO_ALLOCATE_CALIBRATION32: - cmd64 = AUDIO_ALLOCATE_CALIBRATION; - break; - case AUDIO_DEALLOCATE_CALIBRATION32: - cmd64 = AUDIO_DEALLOCATE_CALIBRATION; - break; - case AUDIO_PREPARE_CALIBRATION32: - cmd64 = AUDIO_PREPARE_CALIBRATION; - break; - case AUDIO_SET_CALIBRATION32: - cmd64 = AUDIO_SET_CALIBRATION; - break; - case AUDIO_GET_CALIBRATION32: - cmd64 = AUDIO_GET_CALIBRATION; - break; - case AUDIO_POST_CALIBRATION32: - cmd64 = AUDIO_POST_CALIBRATION; - break; - default: - pr_err("%s: ioctl not found!\n", __func__); - ret = -EFAULT; - goto done; - } - - ret = audio_cal_shared_ioctl(f, cmd64, compat_ptr(arg)); -done: - return ret; -} -#endif - -static const struct file_operations audio_cal_fops = { - .owner = THIS_MODULE, - .open = audio_cal_open, - .release = audio_cal_release, - .unlocked_ioctl = audio_cal_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_cal_compat_ioctl, -#endif -}; - -struct miscdevice audio_cal_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_audio_cal", - .fops = &audio_cal_fops, -}; - -int __init audio_cal_init(void) -{ - int i = 0; - - pr_debug("%s\n", __func__); - - memset(&audio_cal, 0, sizeof(audio_cal)); - mutex_init(&audio_cal.common_lock); - for (; i < MAX_CAL_TYPES; i++) { - INIT_LIST_HEAD(&audio_cal.client_info[i]); - mutex_init(&audio_cal.cal_mutex[i]); - } - - return misc_register(&audio_cal_misc); -} - -void audio_cal_exit(void) -{ - int i = 0; - struct list_head *ptr, *next; - struct audio_cal_client_info *client_info_node; - - for (; i < MAX_CAL_TYPES; i++) { - list_for_each_safe(ptr, next, - &audio_cal.client_info[i]) { - client_info_node = list_entry(ptr, - struct audio_cal_client_info, list); - list_del(&client_info_node->list); - kfree(client_info_node->callbacks); - client_info_node->callbacks = NULL; - kfree(client_info_node); - client_info_node = NULL; - } - } - misc_deregister(&audio_cal_misc); -} - - -MODULE_DESCRIPTION("SoC QDSP6v2 Audio Calibration driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/audio_notifier.c b/techpack/audio/dsp/audio_notifier.c deleted file mode 100644 index 485c703d25b1..000000000000 --- a/techpack/audio/dsp/audio_notifier.c +++ /dev/null @@ -1,643 +0,0 @@ -/* Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include "audio_ssr.h" -#include "audio_pdr.h" - -/* Audio states internal to notifier. Client */ -/* used states defined in audio_notifier.h */ -/* for AUDIO_NOTIFIER_SERVICE_DOWN & UP */ -#define NO_SERVICE -2 -#define UNINIT_SERVICE -1 - -/* - * Used for each client registered with audio notifier - */ -struct client_data { - struct list_head list; - /* Notifier block given by client */ - struct notifier_block *nb; - char client_name[20]; - int service; - int domain; -}; - -/* - * Used for each service and domain combination - * Tracks information specific to the underlying - * service. - */ -struct service_info { - const char name[20]; - int domain_id; - int state; - void *handle; - /* Notifier block registered to service */ - struct notifier_block *nb; - /* Used to determine when to register and deregister service */ - int num_of_clients; - /* List of all clients registered to the service and domain */ - struct srcu_notifier_head client_nb_list; -}; - -static int audio_notifer_ssr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data); -static int audio_notifer_ssr_modem_cb(struct notifier_block *this, - unsigned long opcode, void *data); -static int audio_notifer_pdr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data); - -static struct notifier_block notifier_ssr_adsp_nb = { - .notifier_call = audio_notifer_ssr_adsp_cb, - .priority = 0, -}; - -static struct notifier_block notifier_ssr_modem_nb = { - .notifier_call = audio_notifer_ssr_modem_cb, - .priority = 0, -}; - -static struct notifier_block notifier_pdr_adsp_nb = { - .notifier_call = audio_notifer_pdr_adsp_cb, - .priority = 0, -}; - -static struct service_info service_data[AUDIO_NOTIFIER_MAX_SERVICES] - [AUDIO_NOTIFIER_MAX_DOMAINS] = { - - {{ - .name = "SSR_ADSP", - .domain_id = AUDIO_SSR_DOMAIN_ADSP, - .state = AUDIO_NOTIFIER_SERVICE_DOWN, - .nb = ¬ifier_ssr_adsp_nb - }, - { - .name = "SSR_MODEM", - .domain_id = AUDIO_SSR_DOMAIN_MODEM, - .state = AUDIO_NOTIFIER_SERVICE_DOWN, - .nb = ¬ifier_ssr_modem_nb - } }, - - {{ - .name = "PDR_ADSP", - .domain_id = AUDIO_PDR_DOMAIN_ADSP, - .state = UNINIT_SERVICE, - .nb = ¬ifier_pdr_adsp_nb - }, - { /* PDR MODEM service not enabled */ - .name = "INVALID", - .state = NO_SERVICE, - .nb = NULL - } } -}; - -/* Master list of all audio notifier clients */ -struct list_head client_list; -struct mutex notifier_mutex; - -static int audio_notifer_get_default_service(int domain) -{ - int service = NO_SERVICE; - - /* initial service to connect per domain */ - switch (domain) { - case AUDIO_NOTIFIER_ADSP_DOMAIN: - service = AUDIO_NOTIFIER_PDR_SERVICE; - break; - case AUDIO_NOTIFIER_MODEM_DOMAIN: - service = AUDIO_NOTIFIER_SSR_SERVICE; - break; - } - - return service; -} - -static void audio_notifer_disable_service(int service) -{ - int i; - - for (i = 0; i < AUDIO_NOTIFIER_MAX_DOMAINS; i++) - service_data[service][i].state = NO_SERVICE; -} - -static bool audio_notifer_is_service_enabled(int service) -{ - int i; - - for (i = 0; i < AUDIO_NOTIFIER_MAX_DOMAINS; i++) - if (service_data[service][i].state != NO_SERVICE) - return true; - return false; -} - -static void audio_notifer_init_service(int service) -{ - int i; - - for (i = 0; i < AUDIO_NOTIFIER_MAX_DOMAINS; i++) { - if (service_data[service][i].state == UNINIT_SERVICE) - service_data[service][i].state = - AUDIO_NOTIFIER_SERVICE_DOWN; - } -} - -static int audio_notifer_reg_service(int service, int domain) -{ - void *handle; - int ret = 0; - int curr_state = AUDIO_NOTIFIER_SERVICE_DOWN; - - switch (service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - handle = audio_ssr_register( - service_data[service][domain].domain_id, - service_data[service][domain].nb); - break; - case AUDIO_NOTIFIER_PDR_SERVICE: - handle = audio_pdr_service_register( - service_data[service][domain].domain_id, - service_data[service][domain].nb, &curr_state); - - if (curr_state == SERVREG_NOTIF_SERVICE_STATE_UP_V01) - curr_state = AUDIO_NOTIFIER_SERVICE_UP; - else - curr_state = AUDIO_NOTIFIER_SERVICE_DOWN; - break; - default: - pr_err("%s: Invalid service %d\n", - __func__, service); - ret = -EINVAL; - goto done; - } - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: handle is incorrect for service %s\n", - __func__, service_data[service][domain].name); - ret = -EINVAL; - goto done; - } - service_data[service][domain].state = curr_state; - service_data[service][domain].handle = handle; - - pr_info("%s: service %s is in use\n", - __func__, service_data[service][domain].name); - pr_debug("%s: service %s has current state %d, handle 0x%pK\n", - __func__, service_data[service][domain].name, - service_data[service][domain].state, - service_data[service][domain].handle); -done: - return ret; -} - -static int audio_notifer_dereg_service(int service, int domain) -{ - int ret; - - switch (service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - ret = audio_ssr_deregister( - service_data[service][domain].handle, - service_data[service][domain].nb); - break; - case AUDIO_NOTIFIER_PDR_SERVICE: - ret = audio_pdr_service_deregister( - service_data[service][domain].handle, - service_data[service][domain].nb); - break; - default: - pr_err("%s: Invalid service %d\n", - __func__, service); - ret = -EINVAL; - goto done; - } - if (ret < 0) { - pr_err("%s: deregister failed for service %s, ret %d\n", - __func__, service_data[service][domain].name, ret); - goto done; - } - - pr_debug("%s: service %s with handle 0x%pK deregistered\n", - __func__, service_data[service][domain].name, - service_data[service][domain].handle); - - service_data[service][domain].state = AUDIO_NOTIFIER_SERVICE_DOWN; - service_data[service][domain].handle = NULL; -done: - return ret; -} - -static int audio_notifer_reg_client_service(struct client_data *client_data, - int service) -{ - int ret = 0; - int domain = client_data->domain; - struct audio_notifier_cb_data data; - - switch (service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - case AUDIO_NOTIFIER_PDR_SERVICE: - if (service_data[service][domain].num_of_clients == 0) - ret = audio_notifer_reg_service(service, domain); - break; - default: - pr_err("%s: Invalid service for client %s, service %d, domain %d\n", - __func__, client_data->client_name, service, domain); - ret = -EINVAL; - goto done; - } - - if (ret < 0) { - pr_err("%s: service registration failed on service %s for client %s\n", - __func__, service_data[service][domain].name, - client_data->client_name); - goto done; - } - - client_data->service = service; - srcu_notifier_chain_register( - &service_data[service][domain].client_nb_list, - client_data->nb); - service_data[service][domain].num_of_clients++; - - pr_debug("%s: registered client %s on service %s, current state 0x%x\n", - __func__, client_data->client_name, - service_data[service][domain].name, - service_data[service][domain].state); - - /* - * PDR registration returns current state - * Force callback of client with current state for PDR - */ - if (client_data->service == AUDIO_NOTIFIER_PDR_SERVICE) { - data.service = service; - data.domain = domain; - (void)client_data->nb->notifier_call(client_data->nb, - service_data[service][domain].state, &data); - } -done: - return ret; -} - -static int audio_notifer_reg_client(struct client_data *client_data) -{ - int ret = 0; - int service; - int domain = client_data->domain; - - service = audio_notifer_get_default_service(domain); - if (service < 0) { - pr_err("%s: service %d is incorrect\n", __func__, service); - ret = -EINVAL; - goto done; - } - - /* Search through services to find a valid one to register client on. */ - for (; service >= 0; service--) { - /* If a service is not initialized, wait for it to come up. */ - if (service_data[service][domain].state == UNINIT_SERVICE) - goto done; - /* Skip unsupported service and domain combinations. */ - if (service_data[service][domain].state < 0) - continue; - /* Only register clients who have not acquired a service. */ - if (client_data->service != NO_SERVICE) - continue; - - /* - * Only register clients, who have not acquired a service, on - * the best available service for their domain. Uninitialized - * services will try to register all of their clients after - * they initialize correctly or will disable their service and - * register clients on the next best avaialable service. - */ - pr_debug("%s: register client %s on service %s", - __func__, client_data->client_name, - service_data[service][domain].name); - - ret = audio_notifer_reg_client_service(client_data, service); - if (ret < 0) - pr_err("%s: client %s failed to register on service %s", - __func__, client_data->client_name, - service_data[service][domain].name); - } - -done: - return ret; -} - -static int audio_notifer_dereg_client(struct client_data *client_data) -{ - int ret = 0; - int service = client_data->service; - int domain = client_data->domain; - - switch (client_data->service) { - case AUDIO_NOTIFIER_SSR_SERVICE: - case AUDIO_NOTIFIER_PDR_SERVICE: - if (service_data[service][domain].num_of_clients == 1) - ret = audio_notifer_dereg_service(service, domain); - break; - case NO_SERVICE: - goto done; - default: - pr_err("%s: Invalid service for client %s, service %d\n", - __func__, client_data->client_name, - client_data->service); - ret = -EINVAL; - goto done; - } - - if (ret < 0) { - pr_err("%s: deregister failed for client %s on service %s, ret %d\n", - __func__, client_data->client_name, - service_data[service][domain].name, ret); - goto done; - } - - ret = srcu_notifier_chain_unregister(&service_data[service][domain]. - client_nb_list, client_data->nb); - if (ret < 0) { - pr_err("%s: srcu_notifier_chain_unregister failed, ret %d\n", - __func__, ret); - goto done; - } - - pr_debug("%s: deregistered client %s on service %s\n", - __func__, client_data->client_name, - service_data[service][domain].name); - - client_data->service = NO_SERVICE; - if (service_data[service][domain].num_of_clients > 0) - service_data[service][domain].num_of_clients--; -done: - return ret; -} - -static void audio_notifer_reg_all_clients(void) -{ - struct list_head *ptr, *next; - struct client_data *client_data; - int ret; - - list_for_each_safe(ptr, next, &client_list) { - client_data = list_entry(ptr, struct client_data, list); - - ret = audio_notifer_reg_client(client_data); - if (ret < 0) - pr_err("%s: audio_notifer_reg_client failed for client %s, ret %d\n", - __func__, client_data->client_name, - ret); - } -} - -static int audio_notifer_pdr_callback(struct notifier_block *this, - unsigned long opcode, void *data) -{ - pr_debug("%s: Audio PDR framework state 0x%lx\n", - __func__, opcode); - mutex_lock(¬ifier_mutex); - if (opcode == AUDIO_PDR_FRAMEWORK_DOWN) - audio_notifer_disable_service(AUDIO_NOTIFIER_PDR_SERVICE); - else - audio_notifer_init_service(AUDIO_NOTIFIER_PDR_SERVICE); - - audio_notifer_reg_all_clients(); - mutex_unlock(¬ifier_mutex); - return 0; -} - -static struct notifier_block pdr_nb = { - .notifier_call = audio_notifer_pdr_callback, - .priority = 0, -}; - -static int audio_notifer_convert_opcode(unsigned long opcode, - unsigned long *notifier_opcode) -{ - int ret = 0; - - switch (opcode) { - case SUBSYS_BEFORE_SHUTDOWN: - case SERVREG_NOTIF_SERVICE_STATE_DOWN_V01: - *notifier_opcode = AUDIO_NOTIFIER_SERVICE_DOWN; - break; - case SUBSYS_AFTER_POWERUP: - case SERVREG_NOTIF_SERVICE_STATE_UP_V01: - *notifier_opcode = AUDIO_NOTIFIER_SERVICE_UP; - break; - default: - pr_debug("%s: Unused opcode 0x%lx\n", __func__, opcode); - ret = -EINVAL; - } - - return ret; -} - -static int audio_notifer_service_cb(unsigned long opcode, - int service, int domain) -{ - int ret = 0; - unsigned long notifier_opcode; - struct audio_notifier_cb_data data; - - if (audio_notifer_convert_opcode(opcode, ¬ifier_opcode) < 0) - goto done; - - data.service = service; - data.domain = domain; - - pr_debug("%s: service %s, opcode 0x%lx\n", - __func__, service_data[service][domain].name, notifier_opcode); - - mutex_lock(¬ifier_mutex); - - service_data[service][domain].state = notifier_opcode; - ret = srcu_notifier_call_chain(&service_data[service][domain]. - client_nb_list, notifier_opcode, &data); - if (ret < 0) - pr_err("%s: srcu_notifier_call_chain returned %d, service %s, opcode 0x%lx\n", - __func__, ret, service_data[service][domain].name, - notifier_opcode); - - mutex_unlock(¬ifier_mutex); -done: - return NOTIFY_OK; -} - -static int audio_notifer_pdr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - return audio_notifer_service_cb(opcode, - AUDIO_NOTIFIER_PDR_SERVICE, - AUDIO_NOTIFIER_ADSP_DOMAIN); -} - -static int audio_notifer_ssr_adsp_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - return audio_notifer_service_cb(opcode, - AUDIO_NOTIFIER_SSR_SERVICE, - AUDIO_NOTIFIER_ADSP_DOMAIN); -} - -static int audio_notifer_ssr_modem_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - return audio_notifer_service_cb(opcode, - AUDIO_NOTIFIER_SSR_SERVICE, - AUDIO_NOTIFIER_MODEM_DOMAIN); -} - -int audio_notifier_deregister(char *client_name) -{ - int ret = 0; - int ret2; - struct list_head *ptr, *next; - struct client_data *client_data = NULL; - - if (client_name == NULL) { - pr_err("%s: client_name is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - mutex_lock(¬ifier_mutex); - list_for_each_safe(ptr, next, &client_list) { - client_data = list_entry(ptr, struct client_data, list); - if (!strcmp(client_name, client_data->client_name)) { - ret2 = audio_notifer_dereg_client(client_data); - if (ret2 < 0) { - pr_err("%s: audio_notifer_dereg_client failed, ret %d\n, service %d, domain %d", - __func__, ret2, client_data->service, - client_data->domain); - ret = ret2; - continue; - } - list_del(&client_data->list); - kfree(client_data); - } - } - mutex_unlock(¬ifier_mutex); -done: - return ret; -} -EXPORT_SYMBOL(audio_notifier_deregister); - -int audio_notifier_register(char *client_name, int domain, - struct notifier_block *nb) -{ - int ret; - struct client_data *client_data; - - if (client_name == NULL) { - pr_err("%s: client_name is NULL\n", __func__); - ret = -EINVAL; - goto done; - } else if (nb == NULL) { - pr_err("%s: Notifier block is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - client_data = kmalloc(sizeof(*client_data), GFP_KERNEL); - if (client_data == NULL) { - ret = -ENOMEM; - goto done; - } - INIT_LIST_HEAD(&client_data->list); - client_data->nb = nb; - strlcpy(client_data->client_name, client_name, - sizeof(client_data->client_name)); - client_data->service = NO_SERVICE; - client_data->domain = domain; - - mutex_lock(¬ifier_mutex); - ret = audio_notifer_reg_client(client_data); - if (ret < 0) { - mutex_unlock(¬ifier_mutex); - pr_err("%s: audio_notifer_reg_client for client %s failed ret = %d\n", - __func__, client_data->client_name, - ret); - kfree(client_data); - goto done; - } - list_add_tail(&client_data->list, &client_list); - mutex_unlock(¬ifier_mutex); -done: - return ret; -} -EXPORT_SYMBOL(audio_notifier_register); - -static int __init audio_notifier_subsys_init(void) -{ - int i, j; - - mutex_init(¬ifier_mutex); - INIT_LIST_HEAD(&client_list); - for (i = 0; i < AUDIO_NOTIFIER_MAX_SERVICES; i++) { - for (j = 0; j < AUDIO_NOTIFIER_MAX_DOMAINS; j++) { - if (service_data[i][j].state <= NO_SERVICE) - continue; - - srcu_init_notifier_head( - &service_data[i][j].client_nb_list); - } - } - - return 0; -} - -static int __init audio_notifier_late_init(void) -{ - /* - * If pdr registration failed, register clients on next service - * Do in late init to ensure that SSR subsystem is initialized - */ - mutex_lock(¬ifier_mutex); - if (!audio_notifer_is_service_enabled(AUDIO_NOTIFIER_PDR_SERVICE)) - audio_notifer_reg_all_clients(); - - mutex_unlock(¬ifier_mutex); - return 0; -} - -static int __init audio_notifier_init(void) -{ - int ret; - - audio_notifier_subsys_init(); - - ret = audio_pdr_register(&pdr_nb); - if (ret < 0) { - pr_err("%s: PDR register failed, ret = %d, disable service\n", - __func__, ret); - audio_notifer_disable_service(AUDIO_NOTIFIER_PDR_SERVICE); - } - - /* Do not return error since PDR enablement is not critical */ - audio_notifier_late_init(); - - return 0; -} -module_init(audio_notifier_init); - -static void __exit audio_notifier_exit(void) -{ - audio_pdr_deregister(&pdr_nb); -} -module_exit(audio_notifier_exit); - -MODULE_DESCRIPTION("Audio notifier driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/audio_pdr.c b/techpack/audio/dsp/audio_pdr.c deleted file mode 100644 index 9ef386ec4573..000000000000 --- a/techpack/audio/dsp/audio_pdr.c +++ /dev/null @@ -1,182 +0,0 @@ -/* Copyright (c) 2016-2017, 2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include "audio_pdr.h" - -static struct pd_qmi_client_data audio_pdr_services[AUDIO_PDR_DOMAIN_MAX] = { - { /* AUDIO_PDR_DOMAIN_ADSP */ - .client_name = "audio_pdr_adsp", - .service_name = "avs/audio" - } -}; - -struct srcu_notifier_head audio_pdr_cb_list; - -static int audio_pdr_locator_callback(struct notifier_block *this, - unsigned long opcode, void *data) -{ - unsigned long pdr_state = AUDIO_PDR_FRAMEWORK_DOWN; - - if (opcode == LOCATOR_DOWN) { - pr_debug("%s: Service %s is down!", __func__, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP]. - service_name); - goto done; - } - - memcpy(&audio_pdr_services, data, - sizeof(audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP])); - if (audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].total_domains > 0 ) { - pr_debug("%s: Service %s, returned total domains %d, ", - __func__, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].service_name, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP]. - total_domains); - pdr_state = AUDIO_PDR_FRAMEWORK_UP; - goto done; - } else - pr_err("%s: Service %s returned invalid total domains %d", - __func__, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].service_name, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP]. - total_domains); -done: - srcu_notifier_call_chain(&audio_pdr_cb_list, pdr_state, NULL); - return NOTIFY_OK; -} - -static struct notifier_block audio_pdr_locator_nb = { - .notifier_call = audio_pdr_locator_callback, - .priority = 0, -}; - -/** - * audio_pdr_register - - * register to PDR framework - * - * @nb: notifier block - * - * Returns 0 on success or error on failure - */ -int audio_pdr_register(struct notifier_block *nb) -{ - if (nb == NULL) { - pr_err("%s: Notifier block is NULL\n", __func__); - return -EINVAL; - } - return srcu_notifier_chain_register(&audio_pdr_cb_list, nb); -} -EXPORT_SYMBOL(audio_pdr_register); - -/** - * audio_pdr_deregister - - * Deregister from PDR framework - * - * @nb: notifier block - * - * Returns 0 on success or error on failure - */ -int audio_pdr_deregister(struct notifier_block *nb) -{ - if (nb == NULL) { - pr_err("%s: Notifier block is NULL\n", __func__); - return -EINVAL; - } - return srcu_notifier_chain_unregister(&audio_pdr_cb_list, nb); -} -EXPORT_SYMBOL(audio_pdr_deregister); - -void *audio_pdr_service_register(int domain_id, - struct notifier_block *nb, int *curr_state) -{ - void *handle; - - if ((domain_id < 0) || - (domain_id >= AUDIO_PDR_DOMAIN_MAX)) { - pr_err("%s: Invalid service ID %d\n", __func__, domain_id); - return ERR_PTR(-EINVAL); - } - - handle = service_notif_register_notifier( - audio_pdr_services[domain_id].domain_list[0].name, - audio_pdr_services[domain_id].domain_list[0].instance_id, - nb, curr_state); - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: Failed to register for service %s, instance %d\n", - __func__, - audio_pdr_services[domain_id].domain_list[0].name, - audio_pdr_services[domain_id].domain_list[0]. - instance_id); - } - return handle; -} -EXPORT_SYMBOL(audio_pdr_service_register); - -int audio_pdr_service_deregister(void *service_handle, - struct notifier_block *nb) -{ - int ret; - - if (service_handle == NULL) { - pr_err("%s: service handle is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = service_notif_unregister_notifier( - service_handle, nb); - if (ret < 0) - pr_err("%s: Failed to deregister service ret %d\n", - __func__, ret); -done: - return ret; -} -EXPORT_SYMBOL(audio_pdr_service_deregister); - -static int __init audio_pdr_subsys_init(void) -{ - srcu_init_notifier_head(&audio_pdr_cb_list); - return 0; -} - -static int __init audio_pdr_late_init(void) -{ - int ret; - - audio_pdr_subsys_init(); - - ret = get_service_location( - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].client_name, - audio_pdr_services[AUDIO_PDR_DOMAIN_ADSP].service_name, - &audio_pdr_locator_nb); - if (ret < 0) { - pr_err("%s get_service_location failed ret %d\n", - __func__, ret); - srcu_notifier_call_chain(&audio_pdr_cb_list, - AUDIO_PDR_FRAMEWORK_DOWN, NULL); - } - - return ret; -} -module_init(audio_pdr_late_init); - -static void __exit audio_pdr_late_exit(void) -{ -} -module_exit(audio_pdr_late_exit); - -MODULE_DESCRIPTION("PDR framework driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/audio_pdr.h b/techpack/audio/dsp/audio_pdr.h deleted file mode 100644 index d1235bcac39d..000000000000 --- a/techpack/audio/dsp/audio_pdr.h +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __AUDIO_PDR_H_ -#define __AUDIO_PDR_H_ - -enum { - AUDIO_PDR_DOMAIN_ADSP, - AUDIO_PDR_DOMAIN_MAX -}; - -enum { - AUDIO_PDR_FRAMEWORK_DOWN, - AUDIO_PDR_FRAMEWORK_UP -}; - -#ifdef CONFIG_MSM_QDSP6_PDR - -/* - * Use audio_pdr_register to register with the PDR subsystem this - * should be done before module late init otherwise notification - * of the AUDIO_PDR_FRAMEWORK_UP cannot be guaranteed. - * - * *nb - Pointer to a notifier block. Provide a callback function - * to be notified once the PDR framework has been initialized. - * Callback will receive either the AUDIO_PDR_FRAMEWORK_DOWN - * or AUDIO_PDR_FRAMEWORK_UP ioctl depending on the state of - * the PDR framework. - * - * Returns: Success: 0 - * Failure: Error code - */ -int audio_pdr_register(struct notifier_block *nb); -int audio_pdr_deregister(struct notifier_block *nb); - -/* - * Use audio_pdr_service_register to register with a PDR service - * Function should be called after nb callback registered with - * audio_pdr_register has been called back with the - * AUDIO_PDR_FRAMEWORK_UP ioctl. - * - * domain_id - Domain to use, example: AUDIO_PDR_ADSP - * *nb - Pointer to a notifier block. Provide a callback function - * that will be notified of the state of the domain - * requested. The ioctls received by the callback are - * defined in service-notifier.h. - * - * Returns: Success: Client handle - * Failure: Pointer error code - */ -void *audio_pdr_service_register(int domain_id, - struct notifier_block *nb, int *curr_state); - -/* - * Use audio_pdr_service_deregister to deregister with a PDR - * service that was registered using the audio_pdr_service_register - * API. - * - * *service_handle - Service handle returned by audio_pdr_service_register - * *nb - Pointer to the notifier block. Used in the call to - * audio_pdr_service_register. - * - * Returns: Success: Client handle - * Failure: Error code - */ -int audio_pdr_service_deregister(void *service_handle, - struct notifier_block *nb); - -#else - -static inline int audio_pdr_register(struct notifier_block *nb) -{ - return -ENODEV; -} - -static inline int audio_pdr_deregister(struct notifier_block *nb) -{ - return -ENODEV; -} - -static inline void *audio_pdr_service_register(int domain_id, - struct notifier_block *nb, - int *curr_state) -{ - return NULL; -} - -static inline int audio_pdr_service_deregister(void *service_handle, - struct notifier_block *nb) -{ - return 0; -} - -#endif /* CONFIG_MSM_QDSP6_PDR */ - -#endif diff --git a/techpack/audio/dsp/audio_slimslave.c b/techpack/audio/dsp/audio_slimslave.c deleted file mode 100644 index 55982f33474b..000000000000 --- a/techpack/audio/dsp/audio_slimslave.c +++ /dev/null @@ -1,175 +0,0 @@ -/* Copyright (c) 2013-2014, 2017-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static struct slim_device *slim; -static int vote_count; -struct mutex suspend_lock; -bool suspend; - -static int audio_slim_open(struct inode *inode, struct file *file) -{ - pr_debug("%s:\n", __func__); - - if (vote_count) { - pr_debug("%s: unvote: vote_count=%d\n", __func__, vote_count); - pm_runtime_mark_last_busy(slim->dev.parent); - pm_runtime_put(slim->dev.parent); - vote_count--; - } - return 0; -}; - -static int audio_slim_release(struct inode *inode, struct file *file) -{ - pr_debug("%s:\n", __func__); - - if (vote_count) { - pr_debug("%s: unvote: vote_count=%d\n", __func__, vote_count); - pm_runtime_mark_last_busy(slim->dev.parent); - pm_runtime_put(slim->dev.parent); - vote_count--; - } else { - pr_debug("%s: vote: vote_count=%d\n", __func__, vote_count); - pm_runtime_get_sync(slim->dev.parent); - vote_count++; - } - return 0; -}; - -static long audio_slim_ioctl(struct file *file, unsigned int cmd, - unsigned long u_arg) -{ - switch (cmd) { - case AUDIO_SLIMSLAVE_VOTE: - mutex_lock(&suspend_lock); - if (!vote_count && !suspend) { - pr_debug("%s:AUDIO_SLIMSLAVE_VOTE\n", __func__); - pm_runtime_get_sync(slim->dev.parent); - vote_count++; - } else { - pr_err("%s:Invalid vote: vote_count=%d suspend=%d\n", - __func__, vote_count, suspend); - } - mutex_unlock(&suspend_lock); - break; - case AUDIO_SLIMSLAVE_UNVOTE: - mutex_lock(&suspend_lock); - if (vote_count && !suspend) { - pr_debug("%s:AUDIO_SLIMSLAVE_UNVOTE\n", __func__); - pm_runtime_mark_last_busy(slim->dev.parent); - pm_runtime_put(slim->dev.parent); - vote_count--; - } else { - pr_err("%s:Invalid unvote: vote_count=%d suspend=%d\n", - __func__, vote_count, suspend); - } - mutex_unlock(&suspend_lock); - break; - default: - pr_debug("%s: Invalid ioctl cmd: %d\n", __func__, cmd); - break; - } - return 0; -} - -static const struct file_operations audio_slimslave_fops = { - .open = audio_slim_open, - .unlocked_ioctl = audio_slim_ioctl, - .release = audio_slim_release, -}; - -struct miscdevice audio_slimslave_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = AUDIO_SLIMSLAVE_IOCTL_NAME, - .fops = &audio_slimslave_fops, -}; - -static int audio_slimslave_probe(struct slim_device *audio_slim) -{ - pr_debug("%s:\n", __func__); - - mutex_init(&suspend_lock); - suspend = false; - slim = audio_slim; - misc_register(&audio_slimslave_misc); - return 0; -} - -static int audio_slimslave_remove(struct slim_device *audio_slim) -{ - pr_debug("%s:\n", __func__); - - misc_deregister(&audio_slimslave_misc); - return 0; -} - -static int audio_slimslave_resume(struct slim_device *audio_slim) -{ - pr_debug("%s:\n", __func__); - - mutex_lock(&suspend_lock); - suspend = false; - mutex_unlock(&suspend_lock); - return 0; -} - -static int audio_slimslave_suspend(struct slim_device *audio_slim, - pm_message_t pmesg) -{ - pr_debug("%s:\n", __func__); - - mutex_lock(&suspend_lock); - suspend = true; - mutex_unlock(&suspend_lock); - return 0; -} - -static const struct slim_device_id audio_slimslave_dt_match[] = { - {"audio-slimslave", 0}, - {} -}; - -static struct slim_driver audio_slimslave_driver = { - .driver = { - .name = "audio-slimslave", - .owner = THIS_MODULE, - }, - .probe = audio_slimslave_probe, - .remove = audio_slimslave_remove, - .id_table = audio_slimslave_dt_match, - .resume = audio_slimslave_resume, - .suspend = audio_slimslave_suspend, -}; - -int __init audio_slimslave_init(void) -{ - return slim_driver_register(&audio_slimslave_driver); -} - -void audio_slimslave_exit(void) -{ - slim_driver_unregister(&audio_slimslave_driver); -} - -/* Module information */ -MODULE_DESCRIPTION("Audio side Slimbus slave driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/audio_ssr.c b/techpack/audio/dsp/audio_ssr.c deleted file mode 100644 index b1acb918e0fc..000000000000 --- a/techpack/audio/dsp/audio_ssr.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (c) 2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include "audio_ssr.h" - -static char *audio_ssr_domains[] = { - "adsp", - "modem" -}; - -/** - * audio_ssr_register - - * register to SSR framework - * - * @domain_id: Domain ID to register with - * @nb: notifier block - * - * Returns handle pointer on success or error PTR on failure - */ -void *audio_ssr_register(int domain_id, struct notifier_block *nb) -{ - if ((domain_id < 0) || - (domain_id >= AUDIO_SSR_DOMAIN_MAX)) { - pr_err("%s: Invalid service ID %d\n", __func__, domain_id); - return ERR_PTR(-EINVAL); - } - - return subsys_notif_register_notifier( - audio_ssr_domains[domain_id], nb); -} -EXPORT_SYMBOL(audio_ssr_register); - -/** - * audio_ssr_deregister - - * Deregister handle from SSR framework - * - * @handle: SSR handle - * @nb: notifier block - * - * Returns 0 on success or error on failure - */ -int audio_ssr_deregister(void *handle, struct notifier_block *nb) -{ - return subsys_notif_unregister_notifier(handle, nb); -} -EXPORT_SYMBOL(audio_ssr_deregister); - diff --git a/techpack/audio/dsp/audio_ssr.h b/techpack/audio/dsp/audio_ssr.h deleted file mode 100644 index a807021ba7ca..000000000000 --- a/techpack/audio/dsp/audio_ssr.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __AUDIO_SSR_H_ -#define __AUDIO_SSR_H_ - -enum { - AUDIO_SSR_DOMAIN_ADSP, - AUDIO_SSR_DOMAIN_MODEM, - AUDIO_SSR_DOMAIN_MAX -}; - -#ifdef CONFIG_MSM_QDSP6_SSR - -/* - * Use audio_ssr_register to register with the SSR subsystem - * - * domain_id - Service to use, example: AUDIO_SSR_DOMAIN_ADSP - * *nb - Pointer to a notifier block. Provide a callback function - * to be notified of an event for that service. The ioctls - * used by the callback are defined in subsystem_notif.h. - * - * Returns: Success: Client handle - * Failure: Pointer error code - */ -void *audio_ssr_register(int domain_id, struct notifier_block *nb); - -/* - * Use audio_ssr_deregister to register with the SSR subsystem - * - * handle - Handle received from audio_ssr_register - * *nb - Pointer to a notifier block. Callback function - * Used from audio_ssr_register. - * - * Returns: Success: 0 - * Failure: Error code - */ -int audio_ssr_deregister(void *handle, struct notifier_block *nb); - - -/* - * Use audio_ssr_send_nmi to force a RAM dump on ADSP - * down event. - * - * *ssr_cb_data - *data received from notifier callback - */ -void audio_ssr_send_nmi(void *ssr_cb_data); - -#else - -static inline void *audio_ssr_register(int domain_id, - struct notifier_block *nb) -{ - return NULL; -} - -static inline int audio_ssr_deregister(void *handle, struct notifier_block *nb) -{ - return 0; -} - -static inline void audio_ssr_send_nmi(void *ssr_cb_data) -{ -} - -#endif /* CONFIG_MSM_QDSP6_SSR */ - -#endif diff --git a/techpack/audio/dsp/avtimer.c b/techpack/audio/dsp/avtimer.c deleted file mode 100644 index af787827325b..000000000000 --- a/techpack/audio/dsp/avtimer.c +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright (c) 2012-2015, 2017-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if IS_ENABLED(CONFIG_AVTIMER_LEGACY) -#include -#endif -#include -#include - -#define DEVICE_NAME "avtimer" -#define TIMEOUT_MS 1000 -#define CORE_CLIENT 1 -#define TEMP_PORT ((CORE_CLIENT << 8) | 0x0001) -#define SSR_WAKETIME 1000 -#define Q6_READY_RETRY 250 -#define Q6_READY_MAX_RETRIES 40 - -#define AVCS_CMD_REMOTE_AVTIMER_VOTE_REQUEST 0x00012914 -#define AVCS_CMD_RSP_REMOTE_AVTIMER_VOTE_REQUEST 0x00012915 -#define AVCS_CMD_REMOTE_AVTIMER_RELEASE_REQUEST 0x00012916 -#define AVTIMER_REG_CNT 2 - -struct adsp_avt_timer { - struct apr_hdr hdr; - union { - char client_name[8]; - u32 avtimer_handle; - }; -} __packed; - -static int major; - -struct avtimer_t { - struct apr_svc *core_handle_q; - struct cdev myc; - struct class *avtimer_class; - struct mutex avtimer_lock; - int avtimer_open_cnt; - struct delayed_work ssr_dwork; - wait_queue_head_t adsp_resp_wait; - int enable_timer_resp_received; - int timer_handle; - void __iomem *p_avtimer_msw; - void __iomem *p_avtimer_lsw; - uint32_t clk_div; - uint32_t clk_mult; - atomic_t adsp_ready; - int num_retries; -}; - -static struct avtimer_t avtimer; -static void avcs_set_isp_fptr(bool enable); - -static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv) -{ - uint32_t *payload1; - - if (!data) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - pr_debug("%s: core msg: payload len = %u, apr resp opcode = 0x%X\n", - __func__, data->payload_size, data->opcode); - - switch (data->opcode) { - - case APR_BASIC_RSP_RESULT:{ - - if (!data->payload_size) { - pr_err("%s: APR_BASIC_RSP_RESULT No Payload ", - __func__); - return 0; - } - - payload1 = data->payload; - - if (data->payload_size < 2 * sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - - switch (payload1[0]) { - case AVCS_CMD_REMOTE_AVTIMER_RELEASE_REQUEST: - pr_debug("%s: Cmd = TIMER RELEASE status[0x%x]\n", - __func__, payload1[1]); - break; - default: - pr_err("Invalid cmd rsp[0x%x][0x%x]\n", - payload1[0], payload1[1]); - break; - } - break; - } - - case RESET_EVENTS:{ - pr_debug("%s: Reset event received in AV timer\n", __func__); - apr_reset(avtimer.core_handle_q); - avtimer.core_handle_q = NULL; - avtimer.avtimer_open_cnt = 0; - atomic_set(&avtimer.adsp_ready, 0); - schedule_delayed_work(&avtimer.ssr_dwork, - msecs_to_jiffies(SSR_WAKETIME)); - break; - } - - case AVCS_CMD_RSP_REMOTE_AVTIMER_VOTE_REQUEST: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - pr_debug("%s: RSP_REMOTE_AVTIMER_VOTE_REQUEST handle %x\n", - __func__, payload1[0]); - avtimer.timer_handle = payload1[0]; - avtimer.enable_timer_resp_received = 1; - wake_up(&avtimer.adsp_resp_wait); - break; - default: - pr_err("%s: Message adspcore svc: %d\n", - __func__, data->opcode); - break; - } - - return 0; -} - -int avcs_core_open(void) -{ - if (!avtimer.core_handle_q) - avtimer.core_handle_q = apr_register("ADSP", "CORE", - aprv2_core_fn_q, TEMP_PORT, NULL); - pr_debug("%s: Open_q %p\n", __func__, avtimer.core_handle_q); - if (!avtimer.core_handle_q) { - pr_err("%s: Unable to register CORE\n", __func__); - return -EINVAL; - } - return 0; -} -EXPORT_SYMBOL(avcs_core_open); - -static int avcs_core_disable_avtimer(int timerhandle) -{ - int rc = -EINVAL; - struct adsp_avt_timer payload; - - if (!timerhandle) { - pr_err("%s: Invalid timer handle\n", __func__); - return -EINVAL; - } - memset(&payload, 0, sizeof(payload)); - rc = avcs_core_open(); - if (!rc && avtimer.core_handle_q) { - payload.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - payload.hdr.pkt_size = - sizeof(struct adsp_avt_timer); - payload.hdr.src_svc = avtimer.core_handle_q->id; - payload.hdr.src_domain = APR_DOMAIN_APPS; - payload.hdr.dest_domain = APR_DOMAIN_ADSP; - payload.hdr.dest_svc = APR_SVC_ADSP_CORE; - payload.hdr.src_port = TEMP_PORT; - payload.hdr.dest_port = TEMP_PORT; - payload.hdr.token = CORE_CLIENT; - payload.hdr.opcode = AVCS_CMD_REMOTE_AVTIMER_RELEASE_REQUEST; - payload.avtimer_handle = timerhandle; - pr_debug("%s: disable avtimer opcode %x handle %x\n", - __func__, payload.hdr.opcode, payload.avtimer_handle); - rc = apr_send_pkt(avtimer.core_handle_q, - (uint32_t *)&payload); - if (rc < 0) - pr_err("%s: Enable AVtimer failed op[0x%x]rc[%d]\n", - __func__, payload.hdr.opcode, rc); - else - rc = 0; - } - return rc; -} - -static int avcs_core_enable_avtimer(char *client_name) -{ - int rc = -EINVAL, ret = -EINVAL; - struct adsp_avt_timer payload; - - if (!client_name) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - memset(&payload, 0, sizeof(payload)); - rc = avcs_core_open(); - if (!rc && avtimer.core_handle_q) { - avtimer.enable_timer_resp_received = 0; - payload.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - payload.hdr.pkt_size = - sizeof(struct adsp_avt_timer); - payload.hdr.src_svc = avtimer.core_handle_q->id; - payload.hdr.src_domain = APR_DOMAIN_APPS; - payload.hdr.dest_domain = APR_DOMAIN_ADSP; - payload.hdr.dest_svc = APR_SVC_ADSP_CORE; - payload.hdr.src_port = TEMP_PORT; - payload.hdr.dest_port = TEMP_PORT; - payload.hdr.token = CORE_CLIENT; - payload.hdr.opcode = AVCS_CMD_REMOTE_AVTIMER_VOTE_REQUEST; - strlcpy(payload.client_name, client_name, - sizeof(payload.client_name)); - pr_debug("%s: enable avtimer opcode %x client name %s\n", - __func__, payload.hdr.opcode, payload.client_name); - rc = apr_send_pkt(avtimer.core_handle_q, - (uint32_t *)&payload); - if (rc < 0) { - pr_err("%s: Enable AVtimer failed op[0x%x]rc[%d]\n", - __func__, payload.hdr.opcode, rc); - goto bail; - } else - rc = 0; - ret = wait_event_timeout(avtimer.adsp_resp_wait, - (avtimer.enable_timer_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for Enable timer\n", - __func__); - rc = -ETIMEDOUT; - } - if (rc) - avtimer.timer_handle = 0; - } -bail: - return rc; -} - -int avcs_core_disable_power_collapse(int enable) -{ - int rc = 0; - - mutex_lock(&avtimer.avtimer_lock); - if (enable) { - if (avtimer.avtimer_open_cnt) { - avtimer.avtimer_open_cnt++; - pr_debug("%s: opened avtimer open count=%d\n", - __func__, avtimer.avtimer_open_cnt); - rc = 0; - goto done; - } - rc = avcs_core_enable_avtimer("timer"); - if (!rc) { - avtimer.avtimer_open_cnt++; - atomic_set(&avtimer.adsp_ready, 1); - } - } else { - if (avtimer.avtimer_open_cnt > 0) { - avtimer.avtimer_open_cnt--; - if (!avtimer.avtimer_open_cnt) { - rc = avcs_core_disable_avtimer( - avtimer.timer_handle); - avtimer.timer_handle = 0; - } - } - } -done: - mutex_unlock(&avtimer.avtimer_lock); - return rc; -} -EXPORT_SYMBOL(avcs_core_disable_power_collapse); - -static void reset_work(struct work_struct *work) -{ - if (q6core_is_adsp_ready()) { - avcs_core_disable_power_collapse(1); - avtimer.num_retries = Q6_READY_MAX_RETRIES; - return; - } - pr_debug("%s:Q6 not ready-retry after sometime\n", __func__); - if (--avtimer.num_retries > 0) { - schedule_delayed_work(&avtimer.ssr_dwork, - msecs_to_jiffies(Q6_READY_RETRY)); - } else { - pr_err("%s: Q6 failed responding after multiple retries\n", - __func__); - avtimer.num_retries = Q6_READY_MAX_RETRIES; - } -} - -int avcs_core_query_timer(uint64_t *avtimer_tick) -{ - uint32_t avtimer_msw = 0, avtimer_lsw = 0; - uint64_t avtimer_tick_temp; - - if (!atomic_read(&avtimer.adsp_ready)) { - pr_debug("%s:In SSR, return\n", __func__); - return -ENETRESET; - } - avtimer_lsw = ioread32(avtimer.p_avtimer_lsw); - avtimer_msw = ioread32(avtimer.p_avtimer_msw); - - avtimer_tick_temp = (uint64_t)((uint64_t)avtimer_msw << 32) - | avtimer_lsw; - *avtimer_tick = mul_u64_u32_div(avtimer_tick_temp, avtimer.clk_mult, - avtimer.clk_div); - pr_debug_ratelimited("%s:Avtimer: msw: %u, lsw: %u, tick: %llu\n", - __func__, - avtimer_msw, avtimer_lsw, *avtimer_tick); - return 0; -} -EXPORT_SYMBOL(avcs_core_query_timer); - -#if IS_ENABLED(CONFIG_AVTIMER_LEGACY) -static void avcs_set_isp_fptr(bool enable) -{ - struct avtimer_fptr_t av_fptr; - - if (enable) { - av_fptr.fptr_avtimer_open = avcs_core_open; - av_fptr.fptr_avtimer_enable = avcs_core_disable_power_collapse; - av_fptr.fptr_avtimer_get_time = avcs_core_query_timer; - msm_isp_set_avtimer_fptr(av_fptr); - } else { - av_fptr.fptr_avtimer_open = NULL; - av_fptr.fptr_avtimer_enable = NULL; - av_fptr.fptr_avtimer_get_time = NULL; - msm_isp_set_avtimer_fptr(av_fptr); - } -} -#else -static void avcs_set_isp_fptr(bool enable) -{ -} -#endif - -static int avtimer_open(struct inode *inode, struct file *file) -{ - return avcs_core_disable_power_collapse(1); -} - -static int avtimer_release(struct inode *inode, struct file *file) -{ - return avcs_core_disable_power_collapse(0); -} - -/* - * ioctl call provides GET_AVTIMER - */ -static long avtimer_ioctl(struct file *file, unsigned int ioctl_num, - unsigned long ioctl_param) -{ - switch (ioctl_num) { - case IOCTL_GET_AVTIMER_TICK: - { - uint64_t avtimer_tick = 0; - int rc; - - rc = avcs_core_query_timer(&avtimer_tick); - - if (rc) { - pr_err("%s: Error: Invalid AV Timer tick, rc = %d\n", - __func__, rc); - return rc; - } - - pr_debug_ratelimited("%s: AV Timer tick: time %llx\n", - __func__, avtimer_tick); - if (copy_to_user((void __user *)ioctl_param, &avtimer_tick, - sizeof(avtimer_tick))) { - pr_err("%s: copy_to_user failed\n", __func__); - return -EFAULT; - } - } - break; - - default: - pr_err("%s: invalid cmd\n", __func__); - return -EINVAL; - } - return 0; -} - -static const struct file_operations avtimer_fops = { - .unlocked_ioctl = avtimer_ioctl, - .compat_ioctl = avtimer_ioctl, - .open = avtimer_open, - .release = avtimer_release -}; - -static int dev_avtimer_probe(struct platform_device *pdev) -{ - int result = 0; - dev_t dev = MKDEV(major, 0); - struct device *device_handle; - struct resource *reg_lsb = NULL, *reg_msb = NULL; - uint32_t clk_div_val; - uint32_t clk_mult_val; - - if (!pdev) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - reg_lsb = platform_get_resource_byname(pdev, - IORESOURCE_MEM, "avtimer_lsb_addr"); - if (!reg_lsb) { - dev_err(&pdev->dev, "%s: Looking up %s property", - "avtimer_lsb_addr", __func__); - return -EINVAL; - } - reg_msb = platform_get_resource_byname(pdev, - IORESOURCE_MEM, "avtimer_msb_addr"); - if (!reg_msb) { - dev_err(&pdev->dev, "%s: Looking up %s property", - "avtimer_msb_addr", __func__); - return -EINVAL; - } - INIT_DELAYED_WORK(&avtimer.ssr_dwork, reset_work); - - avtimer.p_avtimer_lsw = devm_ioremap_nocache(&pdev->dev, - reg_lsb->start, resource_size(reg_lsb)); - if (!avtimer.p_avtimer_lsw) { - dev_err(&pdev->dev, "%s: ioremap failed for lsb avtimer register", - __func__); - return -ENOMEM; - } - - avtimer.p_avtimer_msw = devm_ioremap_nocache(&pdev->dev, - reg_msb->start, resource_size(reg_msb)); - if (!avtimer.p_avtimer_msw) { - dev_err(&pdev->dev, "%s: ioremap failed for msb avtimer register", - __func__); - goto unmap; - } - avtimer.num_retries = Q6_READY_MAX_RETRIES; - /* get the device number */ - if (major) - result = register_chrdev_region(dev, 1, DEVICE_NAME); - else { - result = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME); - major = MAJOR(dev); - } - - if (result < 0) { - dev_err(&pdev->dev, "%s: Registering avtimer device failed\n", - __func__); - goto unmap; - } - - avtimer.avtimer_class = class_create(THIS_MODULE, "avtimer"); - if (IS_ERR(avtimer.avtimer_class)) { - result = PTR_ERR(avtimer.avtimer_class); - dev_err(&pdev->dev, "%s: Error creating avtimer class: %d\n", - __func__, result); - goto unregister_chrdev_region; - } - - cdev_init(&avtimer.myc, &avtimer_fops); - result = cdev_add(&avtimer.myc, dev, 1); - - if (result < 0) { - dev_err(&pdev->dev, "%s: Registering file operations failed\n", - __func__); - goto class_destroy; - } - - device_handle = device_create(avtimer.avtimer_class, - NULL, avtimer.myc.dev, NULL, "avtimer"); - if (IS_ERR(device_handle)) { - result = PTR_ERR(device_handle); - pr_err("%s: device_create failed: %d\n", __func__, result); - goto class_destroy; - } - init_waitqueue_head(&avtimer.adsp_resp_wait); - mutex_init(&avtimer.avtimer_lock); - avtimer.avtimer_open_cnt = 0; - - pr_debug("%s: Device create done for avtimer major=%d\n", - __func__, major); - - if (of_property_read_u32(pdev->dev.of_node, - "qcom,clk-div", &clk_div_val)) - avtimer.clk_div = 1; - else - avtimer.clk_div = clk_div_val; - - if (of_property_read_u32(pdev->dev.of_node, - "qcom,clk-mult", &clk_mult_val)) - avtimer.clk_mult = 1; - else - avtimer.clk_mult = clk_mult_val; - - avcs_set_isp_fptr(true); - - pr_debug("%s: avtimer.clk_div = %d, avtimer.clk_mult = %d\n", - __func__, avtimer.clk_div, avtimer.clk_mult); - return 0; - -class_destroy: - class_destroy(avtimer.avtimer_class); -unregister_chrdev_region: - unregister_chrdev_region(MKDEV(major, 0), 1); -unmap: - if (avtimer.p_avtimer_lsw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_lsw); - if (avtimer.p_avtimer_msw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_msw); - avtimer.p_avtimer_lsw = NULL; - avtimer.p_avtimer_msw = NULL; - return result; - -} - -static int dev_avtimer_remove(struct platform_device *pdev) -{ - pr_debug("%s: dev_avtimer_remove\n", __func__); - - if (avtimer.p_avtimer_lsw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_lsw); - if (avtimer.p_avtimer_msw) - devm_iounmap(&pdev->dev, avtimer.p_avtimer_msw); - device_destroy(avtimer.avtimer_class, avtimer.myc.dev); - cdev_del(&avtimer.myc); - class_destroy(avtimer.avtimer_class); - unregister_chrdev_region(MKDEV(major, 0), 1); - avcs_set_isp_fptr(false); - - return 0; -} - -static const struct of_device_id avtimer_machine_of_match[] = { - { .compatible = "qcom,avtimer", }, - {}, -}; -static struct platform_driver dev_avtimer_driver = { - .probe = dev_avtimer_probe, - .remove = dev_avtimer_remove, - .driver = { - .name = "dev_avtimer", - .of_match_table = avtimer_machine_of_match, - }, -}; - -int __init avtimer_init(void) -{ - s32 rc; - - rc = platform_driver_register(&dev_avtimer_driver); - if (rc < 0) { - pr_err("%s: platform_driver_register failed\n", __func__); - goto error_platform_driver; - } - pr_debug("%s: dev_avtimer_init : done\n", __func__); - - return 0; -error_platform_driver: - - pr_err("%s: encounterd error\n", __func__); - return rc; -} - -void avtimer_exit(void) -{ - platform_driver_unregister(&dev_avtimer_driver); -} - -MODULE_DESCRIPTION("avtimer driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/codecs/Android.mk b/techpack/audio/dsp/codecs/Android.mk deleted file mode 100644 index 5adda956426f..000000000000 --- a/techpack/audio/dsp/codecs/Android.mk +++ /dev/null @@ -1,66 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) atoll $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=native_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_native.ko -LOCAL_MODULE_KBUILD_NAME := native_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/dsp/codecs/Kbuild b/techpack/audio/dsp/codecs/Kbuild deleted file mode 100644 index f551325915ad..000000000000 --- a/techpack/audio/dsp/codecs/Kbuild +++ /dev/null @@ -1,166 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME), ) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ Native Enc/Dec ############ - -ifdef CONFIG_MSM_QDSP6V2_CODECS - NATIVE_OBJS += q6audio_v2.o q6audio_v2_aio.o - NATIVE_OBJS += audio_utils_aio.o - NATIVE_OBJS += audio_utils.o - NATIVE_OBJS += audio_native.o - NATIVE_OBJS += aac_in.o - NATIVE_OBJS += amrnb_in.o - NATIVE_OBJS += amrwb_in.o - NATIVE_OBJS += audio_aac.o - NATIVE_OBJS += audio_alac.o - NATIVE_OBJS += audio_amrnb.o - NATIVE_OBJS += audio_amrwb.o - NATIVE_OBJS += audio_amrwbplus.o - NATIVE_OBJS += audio_ape.o - NATIVE_OBJS += audio_evrc.o - NATIVE_OBJS += audio_g711alaw.o - NATIVE_OBJS += audio_g711mlaw.o - NATIVE_OBJS += audio_hwacc_effects.o - NATIVE_OBJS += audio_mp3.o - NATIVE_OBJS += audio_multi_aac.o - NATIVE_OBJS += audio_qcelp.o - NATIVE_OBJS += audio_wma.o - NATIVE_OBJS += audio_wmapro.o - NATIVE_OBJS += evrc_in.o - NATIVE_OBJS += g711alaw_in.o - NATIVE_OBJS += g711mlaw_in.o - NATIVE_OBJS += qcelp_in.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_MSM_QDSP6V2_CODECS) += native_dlkm.o -native_dlkm-y := $(NATIVE_OBJS) - -# inject some build related information diff --git a/techpack/audio/dsp/codecs/aac_in.c b/techpack/audio/dsp/codecs/aac_in.c deleted file mode 100644 index e10fbee605f7..000000000000 --- a/techpack/audio/dsp/codecs/aac_in.c +++ /dev/null @@ -1,713 +0,0 @@ -/* - * Copyright (c) 2010-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 5 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((1536+sizeof(struct meta_out_dsp)) * 5)) - -#define AAC_FORMAT_ADTS 65535 - -#define MAX_SAMPLE_RATE_384K 384000 - -static long aac_in_ioctl_shared(struct file *file, unsigned int cmd, void *arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_aac_enc_config *enc_cfg; - struct msm_audio_aac_config *aac_config; - uint32_t aac_mode = AAC_ENC_MODE_AAC_LC; - - enc_cfg = audio->enc_cfg; - aac_config = audio->codec_cfg; - /* ENCODE CFG (after new set of API's are published )bharath*/ - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - - if (audio->opened) { - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - } else { - if (audio->feedback == NON_TUNNEL_MODE) { - pr_debug("%s: starting in non_tunnel mode", - __func__); - rc = q6asm_open_read_write(audio->ac, - FORMAT_MPEG4_AAC, FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:open read write failed\n", - __func__); - break; - } - } - if (audio->feedback == TUNNEL_MODE) { - pr_debug("%s: starting in tunnel mode", - __func__); - rc = q6asm_open_read(audio->ac, - FORMAT_MPEG4_AAC); - - if (rc < 0) { - pr_err("%s:open read failed\n", - __func__); - break; - } - } - audio->stopped = 0; - } - - pr_debug("%s:sbr_ps_flag = %d, sbr_flag = %d\n", __func__, - aac_config->sbr_ps_on_flag, aac_config->sbr_on_flag); - if (aac_config->sbr_ps_on_flag) - aac_mode = AAC_ENC_MODE_EAAC_P; - else if (aac_config->sbr_on_flag) - aac_mode = AAC_ENC_MODE_AAC_P; - else - aac_mode = AAC_ENC_MODE_AAC_LC; - - rc = q6asm_enc_cfg_blk_aac(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->sample_rate, - enc_cfg->channels, - enc_cfg->bit_rate, - aac_mode, - enc_cfg->stream_format); - if (rc < 0) { - pr_err("%s:session id %d: cmd media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: Rxed AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_GET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config *cfg; - struct msm_audio_aac_enc_config *enc_cfg; - - cfg = (struct msm_audio_aac_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, "AUDIO_GET_AAC_CONFIG"); - rc = -EINVAL; - break; - } - memset(cfg, 0, sizeof(*cfg)); - enc_cfg = audio->enc_cfg; - if (enc_cfg->channels == CH_MODE_MONO) - cfg->channels = 1; - else - cfg->channels = 2; - - cfg->sample_rate = enc_cfg->sample_rate; - cfg->bit_rate = enc_cfg->bit_rate; - switch (enc_cfg->stream_format) { - case 0x00: - cfg->stream_format = AUDIO_AAC_FORMAT_ADTS; - break; - case 0x01: - cfg->stream_format = AUDIO_AAC_FORMAT_LOAS; - break; - case 0x02: - cfg->stream_format = AUDIO_AAC_FORMAT_ADIF; - break; - default: - case 0x03: - cfg->stream_format = AUDIO_AAC_FORMAT_RAW; - } - pr_debug("%s:session id %d: Get-aac-cfg: format=%d sr=%d bitrate=%d\n", - __func__, audio->ac->session, - cfg->stream_format, cfg->sample_rate, cfg->bit_rate); - break; - } - case AUDIO_SET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config *cfg; - struct msm_audio_aac_enc_config *enc_cfg; - uint32_t min_bitrate, max_bitrate; - - cfg = (struct msm_audio_aac_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - "AUDIO_SET_AAC_ENC_CONFIG", __func__); - rc = -EINVAL; - break; - } - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: Set-aac-cfg: stream=%d\n", __func__, - audio->ac->session, cfg->stream_format); - - switch (cfg->stream_format) { - case AUDIO_AAC_FORMAT_ADTS: - enc_cfg->stream_format = 0x00; - break; - case AUDIO_AAC_FORMAT_LOAS: - enc_cfg->stream_format = 0x01; - break; - case AUDIO_AAC_FORMAT_ADIF: - enc_cfg->stream_format = 0x02; - break; - case AUDIO_AAC_FORMAT_RAW: - enc_cfg->stream_format = 0x03; - break; - default: - pr_err("%s:session id %d: unsupported AAC format %d\n", - __func__, audio->ac->session, - cfg->stream_format); - rc = -EINVAL; - break; - } - - if (cfg->channels == 1) { - cfg->channels = CH_MODE_MONO; - } else if (cfg->channels == 2) { - cfg->channels = CH_MODE_STEREO; - } else { - rc = -EINVAL; - break; - } - - if (cfg->sample_rate > MAX_SAMPLE_RATE_384K) { - pr_err("%s: ERROR: invalid sample rate = %u", - __func__, cfg->sample_rate); - rc = -EINVAL; - break; - } - - min_bitrate = ((cfg->sample_rate)*(cfg->channels))/2; - /* This calculation should be based on AAC mode. But we cannot - * get AAC mode in this setconfig. min_bitrate's logical max - * value is 24000. So if min_bitrate is higher than 24000, - * choose 24000. - */ - if (min_bitrate > 24000) - min_bitrate = 24000; - max_bitrate = 6*(cfg->sample_rate)*(cfg->channels); - if (max_bitrate > 192000) - max_bitrate = 192000; - if ((cfg->bit_rate < min_bitrate) || - (cfg->bit_rate > max_bitrate)) { - pr_err("%s: bitrate permissible: max=%d, min=%d\n", - __func__, max_bitrate, min_bitrate); - pr_err("%s: ERROR in setting bitrate = %d\n", - __func__, cfg->bit_rate); - rc = -EINVAL; - break; - } - enc_cfg->sample_rate = cfg->sample_rate; - enc_cfg->channels = cfg->channels; - enc_cfg->bit_rate = cfg->bit_rate; - pr_debug("%s:session id %d: Set-aac-cfg:SR= 0x%x ch=0x%x bitrate=0x%x, format(adts/raw) = %d\n", - __func__, audio->ac->session, enc_cfg->sample_rate, - enc_cfg->channels, enc_cfg->bit_rate, - enc_cfg->stream_format); - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config *aac_cfg; - struct msm_audio_aac_config *audio_aac_cfg; - struct msm_audio_aac_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - audio_aac_cfg = audio->codec_cfg; - aac_cfg = (struct msm_audio_aac_config *)arg; - - if (aac_cfg == NULL) { - pr_err("%s: NULL config pointer %s\n", - __func__, "AUDIO_SET_AAC_CONFIG"); - rc = -EINVAL; - break; - } - pr_debug("%s:session id %d: AUDIO_SET_AAC_CONFIG: sbr_flag = %d sbr_ps_flag = %d\n", - __func__, audio->ac->session, aac_cfg->sbr_on_flag, - aac_cfg->sbr_ps_on_flag); - audio_aac_cfg->sbr_on_flag = aac_cfg->sbr_on_flag; - audio_aac_cfg->sbr_ps_on_flag = aac_cfg->sbr_ps_on_flag; - if ((audio_aac_cfg->sbr_on_flag == 1) || - (audio_aac_cfg->sbr_ps_on_flag == 1)) { - if (enc_cfg->sample_rate < 24000) { - pr_err("%s: ERROR in setting samplerate = %d\n", - __func__, enc_cfg->sample_rate); - rc = -EINVAL; - break; - } - } - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long aac_in_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = aac_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) { - pr_err("%s:AUDIO_GET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - case AUDIO_GET_AAC_CONFIG: { - if (copy_to_user((void *)arg, &audio->codec_cfg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config aac_cfg; - - if (copy_from_user(&aac_cfg, (void *)arg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_SET_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = aac_in_ioctl_shared(file, cmd, &aac_cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd=%d\n", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_aac_enc_config32 { - u32 channels; - u32 sample_rate; - u32 bit_rate; - u32 stream_format; -}; - -struct msm_audio_aac_config32 { - s16 format; - u16 audio_object; - u16 ep_config; /* 0 ~ 3 useful only obj = ERLC */ - u16 aac_section_data_resilience_flag; - u16 aac_scalefactor_data_resilience_flag; - u16 aac_spectral_data_resilience_flag; - u16 sbr_on_flag; - u16 sbr_ps_on_flag; - u16 dual_mono_mode; - u16 channel_configuration; - u16 sample_rate; -}; - -enum { - AUDIO_SET_AAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config32), - AUDIO_GET_AAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config32), - AUDIO_SET_AAC_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_aac_enc_config32), - AUDIO_GET_AAC_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+4), struct msm_audio_aac_enc_config32) -}; - -static long aac_in_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = aac_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AAC_ENC_CONFIG_32: { - struct msm_audio_aac_enc_config cfg; - struct msm_audio_aac_enc_config32 cfg_32; - - memset(&cfg_32, 0, sizeof(cfg_32)); - - cmd = AUDIO_GET_AAC_ENC_CONFIG; - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) { - pr_err("%s:AUDIO_GET_AAC_ENC_CONFIG_32 failed. Rc= %d\n", - __func__, rc); - break; - } - cfg_32.channels = cfg.channels; - cfg_32.sample_rate = cfg.sample_rate; - cfg_32.bit_rate = cfg.bit_rate; - cfg_32.stream_format = cfg.stream_format; - if (copy_to_user((void *)arg, &cfg_32, sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AAC_ENC_CONFIG_32: { - struct msm_audio_aac_enc_config cfg; - struct msm_audio_aac_enc_config32 cfg_32; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_GET_AAC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.channels = cfg_32.channels; - cfg.sample_rate = cfg_32.sample_rate; - cfg.bit_rate = cfg_32.bit_rate; - cfg.stream_format = cfg_32.stream_format; - /* The command should be converted from 32 bit to normal - * before the shared ioctl is called as shared ioctl - * can process only normal commands - */ - cmd = AUDIO_SET_AAC_ENC_CONFIG; - rc = aac_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG_32 failed. rc=%d\n", - __func__, rc); - break; - } - case AUDIO_GET_AAC_CONFIG_32: { - struct msm_audio_aac_config *aac_config; - struct msm_audio_aac_config32 aac_config_32; - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - aac_config_32.format = aac_config->format; - aac_config_32.audio_object = aac_config->audio_object; - aac_config_32.ep_config = aac_config->ep_config; - aac_config_32.aac_section_data_resilience_flag = - aac_config->aac_section_data_resilience_flag; - aac_config_32.aac_scalefactor_data_resilience_flag = - aac_config->aac_scalefactor_data_resilience_flag; - aac_config_32.aac_spectral_data_resilience_flag = - aac_config->aac_spectral_data_resilience_flag; - aac_config_32.sbr_on_flag = aac_config->sbr_on_flag; - aac_config_32.sbr_ps_on_flag = aac_config->sbr_ps_on_flag; - aac_config_32.dual_mono_mode = aac_config->dual_mono_mode; - aac_config_32.channel_configuration = - aac_config->channel_configuration; - aac_config_32.sample_rate = aac_config->sample_rate; - - if (copy_to_user((void *)arg, &aac_config_32, - sizeof(aac_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG_32: { - struct msm_audio_aac_config aac_cfg; - struct msm_audio_aac_config32 aac_cfg_32; - - if (copy_from_user(&aac_cfg_32, (void *)arg, - sizeof(aac_cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - aac_cfg.format = aac_cfg_32.format; - aac_cfg.audio_object = aac_cfg_32.audio_object; - aac_cfg.ep_config = aac_cfg_32.ep_config; - aac_cfg.aac_section_data_resilience_flag = - aac_cfg_32.aac_section_data_resilience_flag; - aac_cfg.aac_scalefactor_data_resilience_flag = - aac_cfg_32.aac_scalefactor_data_resilience_flag; - aac_cfg.aac_spectral_data_resilience_flag = - aac_cfg_32.aac_spectral_data_resilience_flag; - aac_cfg.sbr_on_flag = aac_cfg_32.sbr_on_flag; - aac_cfg.sbr_ps_on_flag = aac_cfg_32.sbr_ps_on_flag; - aac_cfg.dual_mono_mode = aac_cfg_32.dual_mono_mode; - aac_cfg.channel_configuration = - aac_cfg_32.channel_configuration; - aac_cfg.sample_rate = aac_cfg_32.sample_rate; - - cmd = AUDIO_SET_AAC_CONFIG; - rc = aac_in_ioctl_shared(file, cmd, &aac_cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d\n", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define aac_in_compat_ioctl NULL -#endif - -static int aac_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_aac_enc_config *enc_cfg; - struct msm_audio_aac_config *aac_config; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_aac_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - aac_config = audio->codec_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 1536; - audio->max_frames_per_buf = 5; - enc_cfg->sample_rate = 8000; - enc_cfg->channels = 1; - enc_cfg->bit_rate = 16000; - enc_cfg->stream_format = 0x00;/* 0:ADTS, 3:RAW */ - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - aac_config->format = AUDIO_AAC_FORMAT_ADTS; - aac_config->audio_object = AUDIO_AAC_OBJECT_LC; - aac_config->sbr_on_flag = 0; - aac_config->sbr_ps_on_flag = 0; - aac_config->channel_configuration = 1; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - /* open aac encoder in tunnel mode */ - audio->buf_cfg.frames_per_buf = 0x01; - - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_MPEG4_AAC, - FORMAT_LINEAR_PCM); - - if (rc < 0) { - pr_err("%s:session id %d: NT Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - audio->buf_cfg.meta_info_enable = 0x01; - pr_info("%s:session id %d: NT mode encoder success\n", __func__, - audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_MPEG4_AAC); - - if (rc < 0) { - pr_err("%s:session id %d: Tunnel Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, - audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - audio->buf_cfg.meta_info_enable = 0x00; - pr_info("%s:session id %d: T mode encoder success\n", __func__, - audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = aac_in_compat_ioctl; - audio->enc_ioctl = aac_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = aac_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_aac_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac_in", - .fops = &audio_in_fops, -}; - -int __init aac_in_init(void) -{ - return misc_register(&audio_aac_in_misc); -} - -void aac_in_exit(void) -{ - misc_deregister(&audio_aac_in_misc); -} diff --git a/techpack/audio/dsp/codecs/amrnb_in.c b/techpack/audio/dsp/codecs/amrnb_in.c deleted file mode 100644 index 4e3586036702..000000000000 --- a/techpack/audio/dsp/codecs/amrnb_in.c +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Copyright (c) 2010-2012, 2014, 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((32+sizeof(struct meta_out_dsp)) * 10)) - -static long amrnb_in_ioctl_shared(struct file *file, - unsigned int cmd, void *arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_amrnb_enc_config_v2 *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - rc = q6asm_enc_cfg_blk_amrnb(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->band_mode, - enc_cfg->dtx_enable); - - if (rc < 0) { - pr_err("%s:session id %d: cmd amrnb media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", - __func__, audio->ac->session, - audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:AUDIO_STOP\n", __func__); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG_V2: { - struct msm_audio_amrnb_enc_config_v2 *cfg; - struct msm_audio_amrnb_enc_config_v2 *enc_cfg; - - cfg = (struct msm_audio_amrnb_enc_config_v2 *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, - "AUDIO_SET_AMRNB_ENC_CONFIG_V2"); - rc = -EINVAL; - break; - } - - enc_cfg = audio->enc_cfg; - if (cfg->band_mode > 8 || - cfg->band_mode < 1) { - pr_err("%s:session id %d: invalid band mode\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - /* AMR NB encoder accepts values between 0-7 - * while openmax provides value between 1-8 - * as per spec - */ - enc_cfg->band_mode = (cfg->band_mode - 1); - enc_cfg->dtx_enable = (cfg->dtx_enable ? 1 : 0); - enc_cfg->frame_format = 0; - pr_debug("%s:session id %d: band_mode = 0x%x dtx_enable=0x%x\n", - __func__, audio->ac->session, - enc_cfg->band_mode, enc_cfg->dtx_enable); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long amrnb_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrnb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRNB_ENC_CONFIG_V2: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_amrnb_enc_config_v2))) { - pr_err("%s: copy_to_user for AUDIO_GET_AMRNB_ENC_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG_V2: { - struct msm_audio_amrnb_enc_config_v2 cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRNB_ENC_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = amrnb_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s: AUDIO_SET_AMRNB_ENC_CONFIG_V2 failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd=%d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_amrnb_enc_config_v2_32 { - u32 band_mode; - u32 dtx_enable; - u32 frame_format; -}; - -enum { - AUDIO_GET_AMRNB_ENC_CONFIG_V2_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+2), - struct msm_audio_amrnb_enc_config_v2_32), - AUDIO_SET_AMRNB_ENC_CONFIG_V2_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), - struct msm_audio_amrnb_enc_config_v2_32) -}; - -static long amrnb_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrnb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRNB_ENC_CONFIG_V2_32: { - struct msm_audio_amrnb_enc_config_v2 *amrnb_config; - struct msm_audio_amrnb_enc_config_v2_32 amrnb_config_32; - - memset(&amrnb_config_32, 0, sizeof(amrnb_config_32)); - - amrnb_config = - (struct msm_audio_amrnb_enc_config_v2 *)audio->enc_cfg; - amrnb_config_32.band_mode = amrnb_config->band_mode; - amrnb_config_32.dtx_enable = amrnb_config->dtx_enable; - amrnb_config_32.frame_format = amrnb_config->frame_format; - - if (copy_to_user((void *)arg, &amrnb_config_32, - sizeof(amrnb_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AMRNB_ENC_CONFIG_V2_32 failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG_V2_32: { - struct msm_audio_amrnb_enc_config_v2_32 cfg_32; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRNB_ENC_CONFIG_V2_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cmd = AUDIO_SET_AMRNB_ENC_CONFIG_V2; - rc = amrnb_in_ioctl_shared(file, cmd, &cfg_32); - if (rc) - pr_err("%s:AUDIO_SET_AMRNB_ENC_CONFIG_V2 failed rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define amrnb_in_compat_ioctl NULL -#endif - -static int amrnb_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_amrnb_enc_config_v2 *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_amrnb_enc_config_v2), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 32; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->band_mode = 7; - enc_cfg->dtx_enable = 0; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open amrnb encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_AMRNB, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", - __func__, audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_AMRNB); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, - rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", - __func__, audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = amrnb_in_compat_ioctl; - audio->enc_ioctl = amrnb_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = amrnb_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_amrnb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb_in", - .fops = &audio_in_fops, -}; - -int __init amrnb_in_init(void) -{ - return misc_register(&audio_amrnb_in_misc); -} - -void amrnb_in_exit(void) -{ - misc_deregister(&audio_amrnb_in_misc); -} diff --git a/techpack/audio/dsp/codecs/amrwb_in.c b/techpack/audio/dsp/codecs/amrwb_in.c deleted file mode 100644 index ce9dc45c1d96..000000000000 --- a/techpack/audio/dsp/codecs/amrwb_in.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Copyright (c) 2011-2012, 2014, 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((61+sizeof(struct meta_out_dsp)) * 10)) - -static long amrwb_in_ioctl_shared(struct file *file, - unsigned int cmd, void *arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_amrwb_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - rc = q6asm_enc_cfg_blk_amrwb(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->band_mode, - enc_cfg->dtx_enable); - - if (rc < 0) { - pr_err("%s:session id %d: cmd amrwb media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", - __func__, audio->ac->session, - audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:AUDIO_STOP\n", __func__); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_SET_AMRWB_ENC_CONFIG: { - struct msm_audio_amrwb_enc_config *cfg; - struct msm_audio_amrwb_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - cfg = (struct msm_audio_amrwb_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, "AUDIO_SET_AMRWB_ENC_CONFIG"); - rc = -EINVAL; - break; - } - - if (cfg->band_mode > 8) { - pr_err("%s:session id %d: invalid band mode\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - /* ToDo: AMR WB encoder accepts values between 0-8 - * while openmax provides value between 9-17 - * as per spec - */ - enc_cfg->band_mode = cfg->band_mode; - enc_cfg->dtx_enable = (cfg->dtx_enable ? 1 : 0); - /* Currently DSP does not support different frameformat */ - enc_cfg->frame_format = 0; - pr_debug("%s:session id %d: band_mode = 0x%x dtx_enable=0x%x\n", - __func__, audio->ac->session, - enc_cfg->band_mode, enc_cfg->dtx_enable); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long amrwb_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrwb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRWB_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_amrwb_enc_config))) - pr_err("%s: copy_to_user for AUDIO_GET_AMRWB_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - case AUDIO_SET_AMRWB_ENC_CONFIG: { - struct msm_audio_amrwb_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRWB_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = amrwb_in_ioctl_shared(file, cmd, &cfg); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_amrwb_enc_config_32 { - u32 band_mode; - u32 dtx_enable; - u32 frame_format; -}; - -enum { - AUDIO_GET_AMRWB_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), - struct msm_audio_amrwb_enc_config_32), - AUDIO_SET_AMRWB_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), - struct msm_audio_amrwb_enc_config_32) -}; - -static long amrwb_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = amrwb_in_ioctl_shared(file, cmd, NULL); - break; - } - case AUDIO_GET_AMRWB_ENC_CONFIG_32: { - struct msm_audio_amrwb_enc_config *amrwb_config; - struct msm_audio_amrwb_enc_config_32 amrwb_config_32; - - memset(&amrwb_config_32, 0, sizeof(amrwb_config_32)); - - amrwb_config = - (struct msm_audio_amrwb_enc_config *)audio->enc_cfg; - amrwb_config_32.band_mode = amrwb_config->band_mode; - amrwb_config_32.dtx_enable = amrwb_config->dtx_enable; - amrwb_config_32.frame_format = amrwb_config->frame_format; - - if (copy_to_user((void *)arg, &amrwb_config_32, - sizeof(struct msm_audio_amrwb_enc_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AMRWB_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRWB_ENC_CONFIG_32: { - struct msm_audio_amrwb_enc_config cfg_32; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AMRWB_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cmd = AUDIO_SET_AMRWB_ENC_CONFIG; - rc = amrwb_in_ioctl_shared(file, cmd, &cfg_32); - if (rc) - pr_err("%s:AUDIO_SET_AAC_ENC_CONFIG failed. rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define amrwb_in_compat_ioctl NULL -#endif - -static int amrwb_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_amrwb_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_amrwb_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 32; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->band_mode = 8; - enc_cfg->dtx_enable = 0; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 16000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s:audio[%pK]: Could not allocate memory for audio client\n", - __func__, audio); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open amrwb encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_AMRWB, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", - __func__, audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_AMRWB); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, - rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", - __func__, audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = amrwb_in_compat_ioctl; - audio->enc_ioctl = amrwb_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = amrwb_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_amrwb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwb_in", - .fops = &audio_in_fops, -}; - -int __init amrwb_in_init(void) -{ - return misc_register(&audio_amrwb_in_misc); -} - -void amrwb_in_exit(void) -{ - misc_deregister(&audio_amrwb_in_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_aac.c b/techpack/audio/dsp/codecs/audio_aac.c deleted file mode 100644 index 14475dcb4d7a..000000000000 --- a/techpack/audio/dsp/codecs/audio_aac.c +++ /dev/null @@ -1,480 +0,0 @@ -/* aac audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2010-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include "audio_utils_aio.h" - -#define AUDIO_AAC_DUAL_MONO_INVALID -1 -#define PCM_BUFSZ_MIN_AAC ((8*1024) + sizeof(struct dec_meta_out)) - -static struct miscdevice audio_aac_misc; -static struct ws_mgr audio_aac_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_aac_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_aac_cfg aac_cfg; - struct msm_audio_aac_config *aac_config; - uint32_t sbr_ps = 0x00; - - pr_debug("%s: AUDIO_START session_id[%d]\n", __func__, - audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - /* turn on both sbr and ps */ - rc = q6asm_enable_sbrps(audio->ac, sbr_ps); - if (rc < 0) - pr_err("sbr-ps enable failed\n"); - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - if (aac_config->sbr_ps_on_flag) - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - else if (aac_config->sbr_on_flag) - aac_cfg.aot = AAC_ENC_MODE_AAC_P; - else - aac_cfg.aot = AAC_ENC_MODE_AAC_LC; - - switch (aac_config->format) { - case AUDIO_AAC_FORMAT_ADTS: - aac_cfg.format = 0x00; - break; - case AUDIO_AAC_FORMAT_LOAS: - aac_cfg.format = 0x01; - break; - case AUDIO_AAC_FORMAT_ADIF: - aac_cfg.format = 0x02; - break; - default: - case AUDIO_AAC_FORMAT_RAW: - aac_cfg.format = 0x03; - } - aac_cfg.ep_config = aac_config->ep_config; - aac_cfg.section_data_resilience = - aac_config->aac_section_data_resilience_flag; - aac_cfg.scalefactor_data_resilience = - aac_config->aac_scalefactor_data_resilience_flag; - aac_cfg.spectral_data_resilience = - aac_config->aac_spectral_data_resilience_flag; - aac_cfg.ch_cfg = audio->pcm_cfg.channel_count; - if (audio->feedback == TUNNEL_MODE) { - aac_cfg.sample_rate = aac_config->sample_rate; - aac_cfg.ch_cfg = aac_config->channel_configuration; - } else { - aac_cfg.sample_rate = audio->pcm_cfg.sample_rate; - aac_cfg.ch_cfg = audio->pcm_cfg.channel_count; - } - - pr_debug("%s:format=%x aot=%d ch=%d sr=%d\n", - __func__, aac_cfg.format, - aac_cfg.aot, aac_cfg.ch_cfg, - aac_cfg.sample_rate); - - /* Configure Media format block */ - rc = q6asm_media_format_block_aac(audio->ac, &aac_cfg); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - rc = enable_volume_ramp(audio); - if (rc < 0) { - pr_err("%s: Failed to enable volume ramp\n", - __func__); - } - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_info("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config *aac_config; - uint16_t sce_left = 1, sce_right = 2; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - aac_config = (struct msm_audio_aac_config *)arg; - if (aac_config == NULL) { - pr_err("%s: Invalid config pointer\n", __func__); - rc = -EINVAL; - break; - } - memcpy(audio->codec_cfg, aac_config, - sizeof(struct msm_audio_aac_config)); - /* PL_PR is 0 only need to check PL_SR */ - if (aac_config->dual_mono_mode > - AUDIO_AAC_DUAL_MONO_PL_SR) { - pr_err("%s:Invalid dual_mono mode =%d\n", __func__, - aac_config->dual_mono_mode); - } else { - /* convert the data from user into sce_left - * and sce_right based on the definitions - */ - pr_debug("%s: modify dual_mono mode =%d\n", __func__, - aac_config->dual_mono_mode); - switch (aac_config->dual_mono_mode) { - case AUDIO_AAC_DUAL_MONO_PL_PR: - sce_left = 1; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_SL_SR: - sce_left = 2; - sce_right = 2; - break; - case AUDIO_AAC_DUAL_MONO_SL_PR: - sce_left = 2; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_PL_SR: - default: - sce_left = 1; - sce_right = 2; - break; - } - rc = q6asm_cfg_dual_mono_aac(audio->ac, - sce_left, sce_right); - if (rc < 0) - pr_err("%s:asm cmd dualmono failed rc=%d\n", - __func__, rc); - } - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config aac_config; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - if (copy_from_user(&aac_config, (void *)arg, - sizeof(aac_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("%s[%pK]:Failed in utils_ioctl: %d\n", - __func__, audio, rc); - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_aac_config32 { - s16 format; - u16 audio_object; - u16 ep_config; /* 0 ~ 3 useful only obj = ERLC */ - u16 aac_section_data_resilience_flag; - u16 aac_scalefactor_data_resilience_flag; - u16 aac_spectral_data_resilience_flag; - u16 sbr_on_flag; - u16 sbr_ps_on_flag; - u16 dual_mono_mode; - u16 channel_configuration; - u16 sample_rate; -}; - -enum { - AUDIO_SET_AAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config32), - AUDIO_GET_AAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG_32: { - struct msm_audio_aac_config *aac_config; - struct msm_audio_aac_config32 aac_config_32; - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - aac_config_32.format = aac_config->format; - aac_config_32.audio_object = aac_config->audio_object; - aac_config_32.ep_config = aac_config->ep_config; - aac_config_32.aac_section_data_resilience_flag = - aac_config->aac_section_data_resilience_flag; - aac_config_32.aac_scalefactor_data_resilience_flag = - aac_config->aac_scalefactor_data_resilience_flag; - aac_config_32.aac_spectral_data_resilience_flag = - aac_config->aac_spectral_data_resilience_flag; - aac_config_32.sbr_on_flag = aac_config->sbr_on_flag; - aac_config_32.sbr_ps_on_flag = aac_config->sbr_ps_on_flag; - aac_config_32.dual_mono_mode = aac_config->dual_mono_mode; - aac_config_32.channel_configuration = - aac_config->channel_configuration; - aac_config_32.sample_rate = aac_config->sample_rate; - - if (copy_to_user((void *)arg, &aac_config_32, - sizeof(aac_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG_32: { - struct msm_audio_aac_config aac_config; - struct msm_audio_aac_config32 aac_config_32; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - if (copy_from_user(&aac_config_32, (void *)arg, - sizeof(aac_config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - aac_config.format = aac_config_32.format; - aac_config.audio_object = aac_config_32.audio_object; - aac_config.ep_config = aac_config_32.ep_config; - aac_config.aac_section_data_resilience_flag = - aac_config_32.aac_section_data_resilience_flag; - aac_config.aac_scalefactor_data_resilience_flag = - aac_config_32.aac_scalefactor_data_resilience_flag; - aac_config.aac_spectral_data_resilience_flag = - aac_config_32.aac_spectral_data_resilience_flag; - aac_config.sbr_on_flag = aac_config_32.sbr_on_flag; - aac_config.sbr_ps_on_flag = aac_config_32.sbr_ps_on_flag; - aac_config.dual_mono_mode = aac_config_32.dual_mono_mode; - aac_config.channel_configuration = - aac_config_32.channel_configuration; - aac_config.sample_rate = aac_config_32.sample_rate; - - cmd = AUDIO_SET_AAC_CONFIG; - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("%s[%pK]:Failed in utils_ioctl: %d\n", - __func__, audio, rc); - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - struct msm_audio_aac_config *aac_config = NULL; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_aac_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - aac_config = audio->codec_cfg; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN_AAC; - audio->miscdevice = &audio_aac_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_aac_ws_mgr; - aac_config->dual_mono_mode = AUDIO_AAC_DUAL_MONO_INVALID; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_MPEG4_AAC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open AAC decoder, expected frames is always 1 - * audio->buf_cfg.frames_per_buf = 0x01; - */ - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_MPEG4_AAC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_aac_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_aac_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:aacdec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_aac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_aac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac", - .fops = &audio_aac_fops, -}; - -int __init audio_aac_init(void) -{ - int ret = misc_register(&audio_aac_misc); - - if (ret == 0) - device_init_wakeup(audio_aac_misc.this_device, true); - audio_aac_ws_mgr.ref_cnt = 0; - mutex_init(&audio_aac_ws_mgr.ws_lock); - - return ret; -} - -void audio_aac_exit(void) -{ - mutex_destroy(&audio_aac_ws_mgr.ws_lock); - misc_deregister(&audio_aac_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_alac.c b/techpack/audio/dsp/codecs/audio_alac.c deleted file mode 100644 index 30dfaeaf8db8..000000000000 --- a/techpack/audio/dsp/codecs/audio_alac.c +++ /dev/null @@ -1,443 +0,0 @@ -/* Copyright (c) 2015-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_alac_misc; -static struct ws_mgr audio_alac_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_alac_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; - -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_alac_debug_fops); -} -#endif - -static int alac_channel_map(u8 *channel_mapping, uint32_t channels); - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_alac_cfg alac_cfg; - struct msm_audio_alac_config *alac_config; - u8 channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL]; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (alac_channel_map(channel_mapping, - audio->pcm_cfg.channel_count)) { - pr_err("%s: setting channel map failed %d\n", - __func__, audio->pcm_cfg.channel_count); - } - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /*bits per sample*/ - false, false, channel_mapping); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; - alac_cfg.frame_length = alac_config->frameLength; - alac_cfg.compatible_version = alac_config->compatVersion; - alac_cfg.bit_depth = alac_config->bitDepth; - alac_cfg.pb = alac_config->pb; - alac_cfg.mb = alac_config->mb; - alac_cfg.kb = alac_config->kb; - alac_cfg.num_channels = alac_config->channelCount; - alac_cfg.max_run = alac_config->maxRun; - alac_cfg.max_frame_bytes = alac_config->maxSize; - alac_cfg.avg_bit_rate = alac_config->averageBitRate; - alac_cfg.sample_rate = alac_config->sampleRate; - alac_cfg.channel_layout_tag = alac_config->channelLayout; - pr_debug("%s: frame_length %d compatible_version %d bit_depth %d pb %d mb %d kb %d num_channels %d max_run %d max_frame_bytes %d avg_bit_rate %d sample_rate %d channel_layout_tag %d\n", - __func__, alac_config->frameLength, - alac_config->compatVersion, - alac_config->bitDepth, alac_config->pb, - alac_config->mb, alac_config->kb, - alac_config->channelCount, alac_config->maxRun, - alac_config->maxSize, - alac_config->averageBitRate, - alac_config->sampleRate, - alac_config->channelLayout); - /* Configure Media format block */ - rc = q6asm_media_format_block_alac(audio->ac, &alac_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_ALAC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_alac_config))) { - pr_err("%s:copy_to_user for AUDIO_GET_ALAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_ALAC_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_alac_config))) { - pr_err("%s:copy_from_user for AUDIO_SET_ALAC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_alac_config_32 { - u32 frameLength; - u8 compatVersion; - u8 bitDepth; - u8 pb; - u8 mb; - u8 kb; - u8 channelCount; - u16 maxRun; - u32 maxSize; - u32 averageBitRate; - u32 sampleRate; - u32 channelLayout; -}; - -enum { - AUDIO_GET_ALAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_alac_config_32), - AUDIO_SET_ALAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_alac_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_ALAC_CONFIG_32: { - struct msm_audio_alac_config *alac_config; - struct msm_audio_alac_config_32 alac_config_32; - - memset(&alac_config_32, 0, sizeof(alac_config_32)); - - alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; - alac_config_32.frameLength = alac_config->frameLength; - alac_config_32.compatVersion = - alac_config->compatVersion; - alac_config_32.bitDepth = alac_config->bitDepth; - alac_config_32.pb = alac_config->pb; - alac_config_32.mb = alac_config->mb; - alac_config_32.kb = alac_config->kb; - alac_config_32.channelCount = alac_config->channelCount; - alac_config_32.maxRun = alac_config->maxRun; - alac_config_32.maxSize = alac_config->maxSize; - alac_config_32.averageBitRate = alac_config->averageBitRate; - alac_config_32.sampleRate = alac_config->sampleRate; - alac_config_32.channelLayout = alac_config->channelLayout; - - if (copy_to_user((void *)arg, &alac_config_32, - sizeof(alac_config_32))) { - pr_err("%s: copy_to_user for GET_ALAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_ALAC_CONFIG_32: { - struct msm_audio_alac_config *alac_config; - struct msm_audio_alac_config_32 alac_config_32; - - if (copy_from_user(&alac_config_32, (void *)arg, - sizeof(alac_config_32))) { - pr_err("%s: copy_from_user for SET_ALAC_CONFIG_32 failed\n" - , __func__); - rc = -EFAULT; - break; - } - alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; - alac_config->frameLength = alac_config_32.frameLength; - alac_config->compatVersion = - alac_config_32.compatVersion; - alac_config->bitDepth = alac_config_32.bitDepth; - alac_config->pb = alac_config_32.pb; - alac_config->mb = alac_config_32.mb; - alac_config->kb = alac_config_32.kb; - alac_config->channelCount = alac_config_32.channelCount; - alac_config->maxRun = alac_config_32.maxRun; - alac_config->maxSize = alac_config_32.maxSize; - alac_config->averageBitRate = alac_config_32.averageBitRate; - alac_config->sampleRate = alac_config_32.sampleRate; - alac_config->channelLayout = alac_config_32.channelLayout; - - break; - } - default: { - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_alac_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - if (!audio) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_alac_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_alac_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_alac_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_ALAC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open ALAC decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_ALAC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_alac_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_debug("%s:alacdec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static int alac_channel_map(u8 *channel_mapping, uint32_t channels) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_CS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_LFE; - } else if (channels == 7) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_CS; - lchannel_mapping[6] = PCM_CHANNEL_LFE; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FLC; - lchannel_mapping[2] = PCM_CHANNEL_FRC; - lchannel_mapping[3] = PCM_CHANNEL_FL; - lchannel_mapping[4] = PCM_CHANNEL_FR; - lchannel_mapping[5] = PCM_CHANNEL_LS; - lchannel_mapping[6] = PCM_CHANNEL_RS; - lchannel_mapping[7] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} - -static const struct file_operations audio_alac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_alac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_alac", - .fops = &audio_alac_fops, -}; - -int __init audio_alac_init(void) -{ - int ret = misc_register(&audio_alac_misc); - - if (ret == 0) - device_init_wakeup(audio_alac_misc.this_device, true); - audio_alac_ws_mgr.ref_cnt = 0; - mutex_init(&audio_alac_ws_mgr.ws_lock); - - return ret; -} - -void audio_alac_exit(void) -{ - mutex_destroy(&audio_alac_ws_mgr.ws_lock); - misc_deregister(&audio_alac_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_amrnb.c b/techpack/audio/dsp/codecs/audio_amrnb.c deleted file mode 100644 index e8f162f73980..000000000000 --- a/techpack/audio/dsp/codecs/audio_amrnb.c +++ /dev/null @@ -1,230 +0,0 @@ -/* amrnb audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_amrnb_misc; -static struct ws_mgr audio_amrnb_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_amrnb_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling compat ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - } - return rc; -} - - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrnb_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_amrnb_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_amrnb_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_AMRNB); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_AMRNB); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_amrnb_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_amrnb_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info_ratelimited("%s:amrnb decoder open success, session_id = %d\n", __func__, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrnb_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl, -}; - -static struct miscdevice audio_amrnb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb", - .fops = &audio_amrnb_fops, -}; - -int __init audio_amrnb_init(void) -{ - int ret = misc_register(&audio_amrnb_misc); - - if (ret == 0) - device_init_wakeup(audio_amrnb_misc.this_device, true); - audio_amrnb_ws_mgr.ref_cnt = 0; - mutex_init(&audio_amrnb_ws_mgr.ws_lock); - - return ret; -} - -void audio_amrnb_exit(void) -{ - mutex_destroy(&audio_amrnb_ws_mgr.ws_lock); - misc_deregister(&audio_amrnb_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_amrwb.c b/techpack/audio/dsp/codecs/audio_amrwb.c deleted file mode 100644 index 14087821481f..000000000000 --- a/techpack/audio/dsp/codecs/audio_amrwb.c +++ /dev/null @@ -1,235 +0,0 @@ -/* amrwb audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_amrwb_misc; -static struct ws_mgr audio_amrwb_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_amrwb_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling compat ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrwb_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_amrwb_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_amrwb_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_AMRWB); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_AMRWB); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_amrwb_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_amrwb_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s: AMRWB dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrwb_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl, -}; - -static struct miscdevice audio_amrwb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwb", - .fops = &audio_amrwb_fops, -}; - -int __init audio_amrwb_init(void) -{ - int ret = misc_register(&audio_amrwb_misc); - - if (ret == 0) - device_init_wakeup(audio_amrwb_misc.this_device, true); - audio_amrwb_ws_mgr.ref_cnt = 0; - mutex_init(&audio_amrwb_ws_mgr.ws_lock); - - return ret; -} - -void audio_amrwb_exit(void) -{ - mutex_destroy(&audio_amrwb_ws_mgr.ws_lock); - misc_deregister(&audio_amrwb_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_amrwbplus.c b/techpack/audio/dsp/codecs/audio_amrwbplus.c deleted file mode 100644 index 09a8b302ae1d..000000000000 --- a/techpack/audio/dsp/codecs/audio_amrwbplus.c +++ /dev/null @@ -1,401 +0,0 @@ -/* amr-wbplus audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2010-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_amrwbplus_misc; -static struct ws_mgr audio_amrwbplus_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_amrwbplus_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -static void config_debug_fs(struct q6audio_aio *audio) -{ - if (audio != NULL) { - char name[sizeof("msm_amrwbplus_") + 5]; - - snprintf(name, sizeof(name), "msm_amrwbplus_%04x", - audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_amrwbplus_debug_fops); - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); - } -} -#else -static void config_debug_fs(struct q6audio_aio *audio) -{ -} -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct asm_amrwbplus_cfg q6_amrwbplus_cfg; - struct msm_audio_amrwbplus_config_v2 *amrwbplus_drv_config; - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - pr_err("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - amrwbplus_drv_config = - (struct msm_audio_amrwbplus_config_v2 *)audio->codec_cfg; - - q6_amrwbplus_cfg.size_bytes = - amrwbplus_drv_config->size_bytes; - q6_amrwbplus_cfg.version = - amrwbplus_drv_config->version; - q6_amrwbplus_cfg.num_channels = - amrwbplus_drv_config->num_channels; - q6_amrwbplus_cfg.amr_band_mode = - amrwbplus_drv_config->amr_band_mode; - q6_amrwbplus_cfg.amr_dtx_mode = - amrwbplus_drv_config->amr_dtx_mode; - q6_amrwbplus_cfg.amr_frame_fmt = - amrwbplus_drv_config->amr_frame_fmt; - q6_amrwbplus_cfg.amr_lsf_idx = - amrwbplus_drv_config->amr_lsf_idx; - - rc = q6asm_media_format_block_amrwbplus(audio->ac, - &q6_amrwbplus_cfg); - if (rc < 0) { - pr_err("q6asm_media_format_block_amrwb+ failed...\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s:AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - - break; - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AMRWBPLUS_CONFIG_V2: { - if ((audio) && (arg) && (audio->codec_cfg)) { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_amrwbplus_config_v2))) { - rc = -EFAULT; - pr_err("%s: copy_to_user for AUDIO_GET_AMRWBPLUS_CONFIG_V2 failed\n", - __func__); - break; - } - } else { - pr_err("%s: wb+ config v2 invalid parameters\n" - , __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AMRWBPLUS_CONFIG_V2: { - if ((audio) && (arg) && (audio->codec_cfg)) { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_amrwbplus_config_v2))) { - rc = -EFAULT; - pr_err("%s: copy_from_user for AUDIO_SET_AMRWBPLUS_CONFIG_V2 failed\n", - __func__); - break; - } - } else { - pr_err("%s: wb+ config invalid parameters\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - break; - } - } - return rc; -} -#ifdef CONFIG_COMPAT -struct msm_audio_amrwbplus_config_v2_32 { - u32 size_bytes; - u32 version; - u32 num_channels; - u32 amr_band_mode; - u32 amr_dtx_mode; - u32 amr_frame_fmt; - u32 amr_lsf_idx; -}; - -enum { - AUDIO_GET_AMRWBPLUS_CONFIG_V2_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+2), - struct msm_audio_amrwbplus_config_v2_32), - AUDIO_SET_AMRWBPLUS_CONFIG_V2_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), - struct msm_audio_amrwbplus_config_v2_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AMRWBPLUS_CONFIG_V2_32: { - if (audio && arg && (audio->codec_cfg)) { - struct msm_audio_amrwbplus_config_v2 *amrwbplus_config; - struct msm_audio_amrwbplus_config_v2_32 - amrwbplus_config_32; - - memset(&amrwbplus_config_32, 0, - sizeof(amrwbplus_config_32)); - - amrwbplus_config = - (struct msm_audio_amrwbplus_config_v2 *) - audio->codec_cfg; - amrwbplus_config_32.size_bytes = - amrwbplus_config->size_bytes; - amrwbplus_config_32.version = - amrwbplus_config->version; - amrwbplus_config_32.num_channels = - amrwbplus_config->num_channels; - amrwbplus_config_32.amr_band_mode = - amrwbplus_config->amr_band_mode; - amrwbplus_config_32.amr_dtx_mode = - amrwbplus_config->amr_dtx_mode; - amrwbplus_config_32.amr_frame_fmt = - amrwbplus_config->amr_frame_fmt; - amrwbplus_config_32.amr_lsf_idx = - amrwbplus_config->amr_lsf_idx; - - if (copy_to_user((void *)arg, &amrwbplus_config_32, - sizeof(amrwbplus_config_32))) { - rc = -EFAULT; - pr_err("%s: copy_to_user for AUDIO_GET_AMRWBPLUS_CONFIG_V2_32 failed\n" - , __func__); - } - } else { - pr_err("%s: wb+ Get config v2 invalid parameters\n" - , __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_AMRWBPLUS_CONFIG_V2_32: { - if ((audio) && (arg) && (audio->codec_cfg)) { - struct msm_audio_amrwbplus_config_v2 *amrwbplus_config; - struct msm_audio_amrwbplus_config_v2_32 - amrwbplus_config_32; - - if (copy_from_user(&amrwbplus_config_32, (void *)arg, - sizeof(struct msm_audio_amrwbplus_config_v2_32))) { - rc = -EFAULT; - pr_err("%s: copy_from_user for AUDIO_SET_AMRWBPLUS_CONFIG_V2_32 failed\n" - , __func__); - break; - } - amrwbplus_config = - (struct msm_audio_amrwbplus_config_v2 *) - audio->codec_cfg; - amrwbplus_config->size_bytes = - amrwbplus_config_32.size_bytes; - amrwbplus_config->version = - amrwbplus_config_32.version; - amrwbplus_config->num_channels = - amrwbplus_config_32.num_channels; - amrwbplus_config->amr_band_mode = - amrwbplus_config_32.amr_band_mode; - amrwbplus_config->amr_dtx_mode = - amrwbplus_config_32.amr_dtx_mode; - amrwbplus_config->amr_frame_fmt = - amrwbplus_config_32.amr_frame_fmt; - amrwbplus_config->amr_lsf_idx = - amrwbplus_config_32.amr_lsf_idx; - } else { - pr_err("%s: wb+ config invalid parameters\n", - __func__); - rc = -EFAULT; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = - kzalloc(sizeof(struct msm_audio_amrwbplus_config_v2), GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_amrwbplus_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_amrwbplus_ws_mgr; - - audio->ac = - q6asm_audio_client_alloc((app_cb) q6_audio_cb, (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_AMR_WB_PLUS); - if (rc < 0) { - pr_err("amrwbplus NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_AMR_WB_PLUS); - if (rc < 0) { - pr_err("wb+ T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("audio_amrwbplus Not supported mode\n"); - rc = -EACCES; - goto fail; - } - - config_debug_fs(audio); - pr_debug("%s: AMRWBPLUS dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrwbplus_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_amrwbplus_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwbplus", - .fops = &audio_amrwbplus_fops, -}; - -int __init audio_amrwbplus_init(void) -{ - int ret = misc_register(&audio_amrwbplus_misc); - - if (ret == 0) - device_init_wakeup(audio_amrwbplus_misc.this_device, true); - audio_amrwbplus_ws_mgr.ref_cnt = 0; - mutex_init(&audio_amrwbplus_ws_mgr.ws_lock); - - return ret; -} - -void audio_amrwbplus_exit(void) -{ - mutex_destroy(&audio_amrwbplus_ws_mgr.ws_lock); - misc_deregister(&audio_amrwbplus_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_ape.c b/techpack/audio/dsp/codecs/audio_ape.c deleted file mode 100644 index 1bdd40dc9d20..000000000000 --- a/techpack/audio/dsp/codecs/audio_ape.c +++ /dev/null @@ -1,367 +0,0 @@ -/* Copyright (c) 2015-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_ape_misc; -static struct ws_mgr audio_ape_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_ape_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_ape_debug_fops); -} -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_ape_cfg ape_cfg; - struct msm_audio_ape_config *ape_config; - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; - ape_cfg.compatible_version = ape_config->compatibleVersion; - ape_cfg.compression_level = ape_config->compressionLevel; - ape_cfg.format_flags = ape_config->formatFlags; - ape_cfg.blocks_per_frame = ape_config->blocksPerFrame; - ape_cfg.final_frame_blocks = ape_config->finalFrameBlocks; - ape_cfg.total_frames = ape_config->totalFrames; - ape_cfg.bits_per_sample = ape_config->bitsPerSample; - ape_cfg.num_channels = ape_config->numChannels; - ape_cfg.sample_rate = ape_config->sampleRate; - ape_cfg.seek_table_present = ape_config->seekTablePresent; - pr_debug("%s: compatibleVersion %d compressionLevel %d formatFlags %d blocksPerFrame %d finalFrameBlocks %d totalFrames %d bitsPerSample %d numChannels %d sampleRate %d seekTablePresent %d\n", - __func__, ape_config->compatibleVersion, - ape_config->compressionLevel, - ape_config->formatFlags, - ape_config->blocksPerFrame, - ape_config->finalFrameBlocks, - ape_config->totalFrames, - ape_config->bitsPerSample, - ape_config->numChannels, - ape_config->sampleRate, - ape_config->seekTablePresent); - /* Configure Media format block */ - rc = q6asm_media_format_block_ape(audio->ac, &ape_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_APE_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_ape_config))) { - pr_err("%s:copy_to_user for AUDIO_GET_APE_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_APE_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_ape_config))) { - pr_err("%s:copy_from_user for AUDIO_SET_APE_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_ape_config_32 { - u16 compatibleVersion; - u16 compressionLevel; - u32 formatFlags; - u32 blocksPerFrame; - u32 finalFrameBlocks; - u32 totalFrames; - u16 bitsPerSample; - u16 numChannels; - u32 sampleRate; - u32 seekTablePresent; - -}; - -enum { - AUDIO_GET_APE_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_ape_config_32), - AUDIO_SET_APE_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_ape_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_APE_CONFIG_32: { - struct msm_audio_ape_config *ape_config; - struct msm_audio_ape_config_32 ape_config_32; - - memset(&ape_config_32, 0, sizeof(ape_config_32)); - - ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; - ape_config_32.compatibleVersion = ape_config->compatibleVersion; - ape_config_32.compressionLevel = - ape_config->compressionLevel; - ape_config_32.formatFlags = ape_config->formatFlags; - ape_config_32.blocksPerFrame = ape_config->blocksPerFrame; - ape_config_32.finalFrameBlocks = ape_config->finalFrameBlocks; - ape_config_32.totalFrames = ape_config->totalFrames; - ape_config_32.bitsPerSample = ape_config->bitsPerSample; - ape_config_32.numChannels = ape_config->numChannels; - ape_config_32.sampleRate = ape_config->sampleRate; - ape_config_32.seekTablePresent = ape_config->seekTablePresent; - - if (copy_to_user((void *)arg, &ape_config_32, - sizeof(ape_config_32))) { - pr_err("%s: copy_to_user for GET_APE_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_APE_CONFIG_32: { - struct msm_audio_ape_config *ape_config; - struct msm_audio_ape_config_32 ape_config_32; - - if (copy_from_user(&ape_config_32, (void *)arg, - sizeof(ape_config_32))) { - pr_err("%s: copy_from_user for SET_APE_CONFIG_32 failed\n" - , __func__); - rc = -EFAULT; - break; - } - ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; - ape_config->compatibleVersion = ape_config_32.compatibleVersion; - ape_config->compressionLevel = - ape_config_32.compressionLevel; - ape_config->formatFlags = ape_config_32.formatFlags; - ape_config->blocksPerFrame = ape_config_32.blocksPerFrame; - ape_config->finalFrameBlocks = ape_config_32.finalFrameBlocks; - ape_config->totalFrames = ape_config_32.totalFrames; - ape_config->bitsPerSample = ape_config_32.bitsPerSample; - ape_config->numChannels = ape_config_32.numChannels; - ape_config->sampleRate = ape_config_32.sampleRate; - ape_config->seekTablePresent = ape_config_32.seekTablePresent; - - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_ape_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - if (!audio) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_ape_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_ape_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_ape_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_APE); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open APE decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_APE); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_ape_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_debug("%s:apedec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_ape_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_ape_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_ape", - .fops = &audio_ape_fops, -}; - -int __init audio_ape_init(void) -{ - int ret = misc_register(&audio_ape_misc); - - if (ret == 0) - device_init_wakeup(audio_ape_misc.this_device, true); - audio_ape_ws_mgr.ref_cnt = 0; - mutex_init(&audio_ape_ws_mgr.ws_lock); - - return ret; -} - -void audio_ape_exit(void) -{ - mutex_destroy(&audio_ape_ws_mgr.ws_lock); - misc_deregister(&audio_ape_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_evrc.c b/techpack/audio/dsp/codecs/audio_evrc.c deleted file mode 100644 index a29e226b2042..000000000000 --- a/techpack/audio/dsp/codecs/audio_evrc.c +++ /dev/null @@ -1,188 +0,0 @@ -/* evrc audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "audio_utils_aio.h" - -static struct miscdevice audio_evrc_misc; -static struct ws_mgr audio_evrc_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_evrc_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_evrc_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_evrc_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_evrc_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_EVRC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_EVRC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_evrc_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_evrc_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_evrc_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_evrc_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc", - .fops = &audio_evrc_fops, -}; - -int __init audio_evrc_init(void) -{ - int ret = misc_register(&audio_evrc_misc); - - if (ret == 0) - device_init_wakeup(audio_evrc_misc.this_device, true); - audio_evrc_ws_mgr.ref_cnt = 0; - mutex_init(&audio_evrc_ws_mgr.ws_lock); - - return ret; -} - -void audio_evrc_exit(void) -{ - mutex_destroy(&audio_evrc_ws_mgr.ws_lock); - misc_deregister(&audio_evrc_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_g711alaw.c b/techpack/audio/dsp/codecs/audio_g711alaw.c deleted file mode 100644 index bc4b1b4a487a..000000000000 --- a/techpack/audio/dsp/codecs/audio_g711alaw.c +++ /dev/null @@ -1,398 +0,0 @@ -/* Copyright (c) 2016-2017, 2019-2020 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_g711alaw_misc; -static struct ws_mgr audio_g711_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_g711_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; - -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_g711_debug_fops); -} -#endif - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels); - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_g711_dec_cfg g711_dec_cfg; - struct msm_audio_g711_dec_config *g711_dec_config; - u8 channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL]; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - memset(&g711_dec_cfg, 0, sizeof(g711_dec_cfg)); - - if (g711_channel_map(channel_mapping, - audio->pcm_cfg.channel_count)) { - pr_err("%s: setting channel map failed %d\n", - __func__, audio->pcm_cfg.channel_count); - } - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /*bits per sample*/ - false, false, channel_mapping); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_cfg.sample_rate = g711_dec_config->sample_rate; - /* Configure Media format block */ - rc = q6asm_media_format_block_g711(audio->ac, &g711_dec_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("%s: cmd media format block failed rc=%d\n", - __func__, rc); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("%s: AUDIO_START success enable[%d]\n", - __func__, audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - default: { - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_dec_config_32 { - u32 sample_rate; -}; - -enum { - AUDIO_SET_G711_DEC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_dec_config_32), - AUDIO_GET_G711_DEC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_dec_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config_32.sample_rate = g711_dec_config->sample_rate; - - if (copy_to_user((void *)arg, &g711_dec_config_32, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_DEC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - if (copy_from_user(&g711_dec_config_32, (void *)arg, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_DEC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config->sample_rate = g711_dec_config_32.sample_rate; - - break; - } - default: { - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_compat_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_g711_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (!audio) - return -ENOMEM; - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_g711_dec_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_g711alaw_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_g711_ws_mgr; - - init_waitqueue_head(&audio->event_wait); - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ /*foramt:G711_ALAW*/ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_G711_ALAW_FS); - if (rc < 0) { - pr_err("%s: NT mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open G711 decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_G711_ALAW_FS); - if (rc < 0) { - pr_err("%s: T mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("%s: %d mode is not supported mode\n", - __func__, file->f_mode); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_g711_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("%s: debugfs_create_file failed\n", __func__); -#endif - pr_debug("%s: g711dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_CS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_LFE; - } else if (channels == 7) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_CS; - lchannel_mapping[6] = PCM_CHANNEL_LFE; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FLC; - lchannel_mapping[2] = PCM_CHANNEL_FRC; - lchannel_mapping[3] = PCM_CHANNEL_FL; - lchannel_mapping[4] = PCM_CHANNEL_FR; - lchannel_mapping[5] = PCM_CHANNEL_LS; - lchannel_mapping[6] = PCM_CHANNEL_RS; - lchannel_mapping[7] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} - -static const struct file_operations audio_g711_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .compat_ioctl = audio_compat_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_g711alaw_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711alaw", - .fops = &audio_g711_fops, -}; - -int __init audio_g711alaw_init(void) -{ - int ret = misc_register(&audio_g711alaw_misc); - - if (ret == 0) - device_init_wakeup(audio_g711alaw_misc.this_device, true); - audio_g711_ws_mgr.ref_cnt = 0; - mutex_init(&audio_g711_ws_mgr.ws_lock); - - return ret; -} - -void audio_g711alaw_exit(void) -{ - mutex_destroy(&audio_g711_ws_mgr.ws_lock); - misc_deregister(&audio_g711alaw_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_g711mlaw.c b/techpack/audio/dsp/codecs/audio_g711mlaw.c deleted file mode 100644 index b4eb7def1b12..000000000000 --- a/techpack/audio/dsp/codecs/audio_g711mlaw.c +++ /dev/null @@ -1,398 +0,0 @@ -/* Copyright (c) 2016-2017, 2019-2020 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_g711mlaw_misc; -static struct ws_mgr audio_g711_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_g711_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; - -static struct dentry *config_debugfs_create_file(const char *name, void *data) -{ - return debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)data, &audio_g711_debug_fops); -} -#endif - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels); - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_g711_dec_cfg g711_dec_cfg; - struct msm_audio_g711_dec_config *g711_dec_config; - u8 channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL]; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - memset(&g711_dec_cfg, 0, sizeof(g711_dec_cfg)); - - if (g711_channel_map(channel_mapping, - audio->pcm_cfg.channel_count)) { - pr_err("%s: setting channel map failed %d\n", - __func__, audio->pcm_cfg.channel_count); - } - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /*bits per sample*/ - false, false, channel_mapping); - if (rc < 0) { - pr_err("%s: pcm output block config failed rc=%d\n", - __func__, rc); - break; - } - } - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_cfg.sample_rate = g711_dec_config->sample_rate; - /* Configure Media format block */ - rc = q6asm_media_format_block_g711(audio->ac, &g711_dec_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("%s: cmd media format block failed rc=%d\n", - __func__, rc); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s: Audio Start procedure failed rc=%d\n", - __func__, rc); - break; - } - pr_debug("%s: AUDIO_START success enable[%d]\n", - __func__, audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: AUDIO_GET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_g711_dec_config))) { - pr_err("%s: AUDIO_SET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - default: { - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_dec_config_32 { - u32 sample_rate; -}; - -enum { - AUDIO_SET_G711_DEC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_dec_config_32), - AUDIO_GET_G711_DEC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_dec_config_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config_32.sample_rate = g711_dec_config->sample_rate; - - if (copy_to_user((void *)arg, &g711_dec_config_32, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_DEC_CONFIG_32: { - struct msm_audio_g711_dec_config *g711_dec_config; - struct msm_audio_g711_dec_config_32 g711_dec_config_32; - - memset(&g711_dec_config_32, 0, sizeof(g711_dec_config_32)); - - if (copy_from_user(&g711_dec_config_32, (void *)arg, - sizeof(g711_dec_config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_DEC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - g711_dec_config = - (struct msm_audio_g711_dec_config *)audio->codec_cfg; - g711_dec_config->sample_rate = g711_dec_config_32.sample_rate; - - break; - } - default: { - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err("%s: Failed in audio_aio_compat_ioctl: %d cmd=%d\n", - __func__, rc, cmd); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_g711_" + 5]; - - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (!audio) - return -ENOMEM; - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_g711_dec_config), - GFP_KERNEL); - if (!audio->codec_cfg) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_g711mlaw_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_g711_ws_mgr; - - init_waitqueue_head(&audio->event_wait); - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ /*foramt:G711_ALAW*/ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_G711_MLAW_FS); - if (rc < 0) { - pr_err("%s: NT mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open G711 decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_G711_MLAW_FS); - if (rc < 0) { - pr_err("%s: T mode Open failed rc=%d\n", __func__, rc); - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("%s: %d mode is not supported\n", __func__, - file->f_mode); - rc = -EACCES; - goto fail; - } - - snprintf(name, sizeof(name), "msm_g711_%04x", audio->ac->session); -#ifdef CONFIG_DEBUG_FS - audio->dentry = config_debugfs_create_file(name, (void *)audio); - - if (IS_ERR_OR_NULL(audio->dentry)) - pr_debug("%s: debugfs_create_file failed\n", __func__); -#endif - pr_debug("%s: g711dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static int g711_channel_map(u8 *channel_mapping, uint32_t channels) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_CS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_LFE; - } else if (channels == 7) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FL; - lchannel_mapping[2] = PCM_CHANNEL_FR; - lchannel_mapping[3] = PCM_CHANNEL_LS; - lchannel_mapping[4] = PCM_CHANNEL_RS; - lchannel_mapping[5] = PCM_CHANNEL_CS; - lchannel_mapping[6] = PCM_CHANNEL_LFE; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - lchannel_mapping[1] = PCM_CHANNEL_FLC; - lchannel_mapping[2] = PCM_CHANNEL_FRC; - lchannel_mapping[3] = PCM_CHANNEL_FL; - lchannel_mapping[4] = PCM_CHANNEL_FR; - lchannel_mapping[5] = PCM_CHANNEL_LS; - lchannel_mapping[6] = PCM_CHANNEL_RS; - lchannel_mapping[7] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} - -static const struct file_operations audio_g711_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .compat_ioctl = audio_compat_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_g711mlaw_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711mlaw", - .fops = &audio_g711_fops, -}; - -int __init audio_g711mlaw_init(void) -{ - int ret = misc_register(&audio_g711mlaw_misc); - - if (ret == 0) - device_init_wakeup(audio_g711mlaw_misc.this_device, true); - audio_g711_ws_mgr.ref_cnt = 0; - mutex_init(&audio_g711_ws_mgr.ws_lock); - - return ret; -} - -void audio_g711mlaw_exit(void) -{ - mutex_destroy(&audio_g711_ws_mgr.ws_lock); - misc_deregister(&audio_g711mlaw_misc); -} - diff --git a/techpack/audio/dsp/codecs/audio_hwacc_effects.c b/techpack/audio/dsp/codecs/audio_hwacc_effects.c deleted file mode 100644 index f66164bfc62f..000000000000 --- a/techpack/audio/dsp/codecs/audio_hwacc_effects.c +++ /dev/null @@ -1,781 +0,0 @@ -/* - * Copyright (c) 2014-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include "q6audio_common.h" -#include -#include "audio_utils_aio.h" - -#define MAX_CHANNELS_SUPPORTED 8 -#define WAIT_TIMEDOUT_DURATION_SECS 1 - -struct q6audio_effects { - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - - struct audio_client *ac; - struct msm_hwacc_effects_config config; - - struct mutex lock; - - atomic_t in_count; - atomic_t out_count; - - int opened; - int started; - int buf_alloc; - struct msm_nt_eff_all_config audio_effects; -}; - -static void audio_effects_init_pp(struct audio_client *ac) -{ - int ret = 0; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - if (!ac) { - pr_err("%s: audio client null to init pp\n", __func__); - return; - } - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); -} - -static void audio_effects_deinit_pp(struct audio_client *ac) -{ - if (!ac) { - pr_err("%s: audio client null to deinit pp\n", __func__); - return; - } -} - -static void audio_effects_event_handler(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_effects *effects; - - if (!payload || !priv) { - pr_err("%s: invalid data to handle events, payload: %pK, priv: %pK\n", - __func__, payload, priv); - return; - } - - effects = (struct q6audio_effects *)priv; - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: { - atomic_inc(&effects->out_count); - wake_up(&effects->write_wait); - break; - } - case ASM_DATA_EVENT_READ_DONE_V2: { - atomic_inc(&effects->in_count); - wake_up(&effects->read_wait); - break; - } - case APR_BASIC_RSP_RESULT: { - pr_debug("%s: APR_BASIC_RSP_RESULT Cmd[0x%x] Status[0x%x]\n", - __func__, payload[0], payload[1]); - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: - pr_debug("ASM_SESSION_CMD_RUN_V2\n"); - break; - default: - pr_debug("%s: Payload = [0x%x] stat[0x%x]\n", - __func__, payload[0], payload[1]); - break; - } - break; - } - default: - pr_debug("%s: Unhandled Event 0x%x token = 0x%x\n", - __func__, opcode, token); - break; - } -} - -static int audio_effects_shared_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s: AUDIO_START\n", __func__); - - mutex_lock(&effects->lock); - - rc = q6asm_open_read_write_v2(effects->ac, - FORMAT_LINEAR_PCM, - FORMAT_MULTI_CHANNEL_LINEAR_PCM, - effects->config.meta_mode_enabled, - effects->config.output.bits_per_sample, - true /*overwrite topology*/, - ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER); - if (rc < 0) { - pr_err("%s: Open failed for hw accelerated effects:rc=%d\n", - __func__, rc); - rc = -EINVAL; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - effects->opened = 1; - - pr_debug("%s: dec buf size: %d, num_buf: %d, enc buf size: %d, num_buf: %d\n", - __func__, effects->config.output.buf_size, - effects->config.output.num_buf, - effects->config.input.buf_size, - effects->config.input.num_buf); - rc = q6asm_audio_client_buf_alloc_contiguous(IN, effects->ac, - effects->config.output.buf_size, - effects->config.output.num_buf); - if (rc < 0) { - pr_err("%s: Write buffer Allocation failed rc = %d\n", - __func__, rc); - rc = -ENOMEM; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - atomic_set(&effects->in_count, effects->config.input.num_buf); - rc = q6asm_audio_client_buf_alloc_contiguous(OUT, effects->ac, - effects->config.input.buf_size, - effects->config.input.num_buf); - if (rc < 0) { - pr_err("%s: Read buffer Allocation failed rc = %d\n", - __func__, rc); - rc = -ENOMEM; - goto readbuf_fail; - } - atomic_set(&effects->out_count, effects->config.output.num_buf); - effects->buf_alloc = 1; - - pr_debug("%s: enc: sample_rate: %d, num_channels: %d\n", - __func__, effects->config.input.sample_rate, - effects->config.input.num_channels); - rc = q6asm_enc_cfg_blk_pcm(effects->ac, - effects->config.input.sample_rate, - effects->config.input.num_channels); - if (rc < 0) { - pr_err("%s: pcm read block config failed\n", __func__); - rc = -EINVAL; - goto cfg_fail; - } - pr_debug("%s: dec: sample_rate: %d, num_channels: %d, bit_width: %d\n", - __func__, effects->config.output.sample_rate, - effects->config.output.num_channels, - effects->config.output.bits_per_sample); - rc = q6asm_media_format_block_pcm_format_support( - effects->ac, effects->config.output.sample_rate, - effects->config.output.num_channels, - effects->config.output.bits_per_sample); - if (rc < 0) { - pr_err("%s: pcm write format block config failed\n", - __func__); - rc = -EINVAL; - goto cfg_fail; - } - - audio_effects_init_pp(effects->ac); - - rc = q6asm_run(effects->ac, 0x00, 0x00, 0x00); - if (!rc) - effects->started = 1; - else { - effects->started = 0; - pr_err("%s: ASM run state failed\n", __func__); - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_WRITE: { - char *bufptr = NULL; - uint32_t idx = 0; - uint32_t size = 0; - - mutex_lock(&effects->lock); - - if (!effects->started) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - rc = wait_event_timeout(effects->write_wait, - atomic_read(&effects->out_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) { - pr_err("%s: write wait_event_timeout\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - if (!atomic_read(&effects->out_count)) { - pr_err("%s: pcm stopped out_count 0\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - bufptr = q6asm_is_cpu_buf_avail(IN, effects->ac, &size, &idx); - if (bufptr) { - if ((effects->config.buf_cfg.output_len > size) || - copy_from_user(bufptr, (void *)arg, - effects->config.buf_cfg.output_len)) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - rc = q6asm_write(effects->ac, - effects->config.buf_cfg.output_len, - 0, 0, NO_TIMESTAMP); - if (rc < 0) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - atomic_dec(&effects->out_count); - } else { - pr_err("%s: AUDIO_EFFECTS_WRITE: Buffer dropped\n", - __func__); - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_READ: { - char *bufptr = NULL; - uint32_t idx = 0; - uint32_t size = 0; - - mutex_lock(&effects->lock); - - if (!effects->started) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - atomic_set(&effects->in_count, 0); - - q6asm_read_v2(effects->ac, effects->config.buf_cfg.input_len); - /* Read might fail initially, don't error out */ - if (rc < 0) - pr_err("%s: read failed\n", __func__); - - rc = wait_event_timeout(effects->read_wait, - atomic_read(&effects->in_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) { - pr_err("%s: read wait_event_timeout\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - if (!atomic_read(&effects->in_count)) { - pr_err("%s: pcm stopped in_count 0\n", __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - - bufptr = q6asm_is_cpu_buf_avail(OUT, effects->ac, &size, &idx); - if (bufptr) { - if (!((void *)arg)) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - if ((effects->config.buf_cfg.input_len > size) || - copy_to_user((void *)arg, bufptr, - effects->config.buf_cfg.input_len)) { - rc = -EFAULT; - mutex_unlock(&effects->lock); - goto ioctl_fail; - } - } - mutex_unlock(&effects->lock); - break; - } - default: - pr_err("%s: Invalid effects config module\n", __func__); - rc = -EINVAL; - break; - } -ioctl_fail: - return rc; -readbuf_fail: - q6asm_audio_client_buf_free_contiguous(IN, - effects->ac); - mutex_unlock(&effects->lock); - return rc; -cfg_fail: - q6asm_audio_client_buf_free_contiguous(IN, - effects->ac); - q6asm_audio_client_buf_free_contiguous(OUT, - effects->ac); - effects->buf_alloc = 0; - mutex_unlock(&effects->lock); - return rc; -} - -static long audio_effects_set_pp_param(struct q6audio_effects *effects, - long *values) -{ - int rc = 0; - int effects_module = values[0]; - - switch (effects_module) { - case VIRTUALIZER_MODULE: - pr_debug("%s: VIRTUALIZER_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_virtualizer_handler( - effects->ac, - &(effects->audio_effects.virtualizer), - (long *)&values[1]); - break; - case REVERB_MODULE: - pr_debug("%s: REVERB_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_reverb_handler(effects->ac, - &(effects->audio_effects.reverb), - (long *)&values[1]); - break; - case BASS_BOOST_MODULE: - pr_debug("%s: BASS_BOOST_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_bass_boost_handler( - effects->ac, - &(effects->audio_effects.bass_boost), - (long *)&values[1]); - break; - case PBE_MODULE: - pr_debug("%s: PBE_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_pbe_handler( - effects->ac, - &(effects->audio_effects.pbe), - (long *)&values[1]); - break; - case EQ_MODULE: - pr_debug("%s: EQ_MODULE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_popless_eq_handler( - effects->ac, - &(effects->audio_effects.equalizer), - (long *)&values[1]); - break; - case SOFT_VOLUME_MODULE: - pr_debug("%s: SA PLUS VOLUME_MODULE\n", __func__); - msm_audio_effects_volume_handler_v2(effects->ac, - &(effects->audio_effects.saplus_vol), - (long *)&values[1], SOFT_VOLUME_INSTANCE_1); - break; - case SOFT_VOLUME2_MODULE: - pr_debug("%s: TOPOLOGY SWITCH VOLUME MODULE\n", - __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) - msm_audio_effects_volume_handler_v2(effects->ac, - &(effects->audio_effects.topo_switch_vol), - (long *)&values[1], SOFT_VOLUME_INSTANCE_2); - break; - default: - pr_err("%s: Invalid effects config module\n", __func__); - rc = -EINVAL; - } - return rc; -} - -static long audio_effects_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0; - long argvalues[MAX_PP_PARAMS_SZ] = {0}; - - switch (cmd) { - case AUDIO_SET_EFFECTS_CONFIG: { - pr_debug("%s: AUDIO_SET_EFFECTS_CONFIG\n", __func__); - mutex_lock(&effects->lock); - memset(&effects->config, 0, sizeof(effects->config)); - if (copy_from_user(&effects->config, (void *)arg, - sizeof(effects->config))) { - pr_err("%s: copy from user for AUDIO_SET_EFFECTS_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - pr_debug("%s: write buf_size: %d, num_buf: %d, sample_rate: %d, channel: %d\n", - __func__, effects->config.output.buf_size, - effects->config.output.num_buf, - effects->config.output.sample_rate, - effects->config.output.num_channels); - pr_debug("%s: read buf_size: %d, num_buf: %d, sample_rate: %d, channel: %d\n", - __func__, effects->config.input.buf_size, - effects->config.input.num_buf, - effects->config.input.sample_rate, - effects->config.input.num_channels); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_BUF_LEN: { - mutex_lock(&effects->lock); - if (copy_from_user(&effects->config.buf_cfg, (void *)arg, - sizeof(effects->config.buf_cfg))) { - pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", - __func__); - rc = -EFAULT; - } - pr_debug("%s: write buf len: %d, read buf len: %d\n", - __func__, effects->config.buf_cfg.output_len, - effects->config.buf_cfg.input_len); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_GET_BUF_AVAIL: { - struct msm_hwacc_buf_avail buf_avail; - - buf_avail.input_num_avail = atomic_read(&effects->in_count); - buf_avail.output_num_avail = atomic_read(&effects->out_count); - mutex_lock(&effects->lock); - pr_debug("%s: write buf avail: %d, read buf avail: %d\n", - __func__, buf_avail.output_num_avail, - buf_avail.input_num_avail); - if (copy_to_user((void *)arg, &buf_avail, - sizeof(buf_avail))) { - pr_err("%s: copy to user for AUDIO_EFFECTS_GET_NUM_BUF_AVAIL failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_PP_PARAMS: { - mutex_lock(&effects->lock); - if (copy_from_user(argvalues, (void *)arg, - MAX_PP_PARAMS_SZ*sizeof(long))) { - pr_err("%s: copy from user for pp params failed\n", - __func__); - mutex_unlock(&effects->lock); - return -EFAULT; - } - rc = audio_effects_set_pp_param(effects, argvalues); - mutex_unlock(&effects->lock); - break; - } - default: - pr_debug("%s: Calling shared ioctl\n", __func__); - rc = audio_effects_shared_ioctl(file, cmd, arg); - break; - } - if (rc) - pr_err("%s: cmd 0x%x failed\n", __func__, cmd); - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_hwacc_data_config32 { - __u32 buf_size; - __u32 num_buf; - __u32 num_channels; - __u8 channel_map[MAX_CHANNELS_SUPPORTED]; - __u32 sample_rate; - __u32 bits_per_sample; -}; - -struct msm_hwacc_buf_cfg32 { - __u32 input_len; - __u32 output_len; -}; - -struct msm_hwacc_buf_avail32 { - __u32 input_num_avail; - __u32 output_num_avail; -}; - -struct msm_hwacc_effects_config32 { - struct msm_hwacc_data_config32 input; - struct msm_hwacc_data_config32 output; - struct msm_hwacc_buf_cfg32 buf_cfg; - __u32 meta_mode_enabled; - __u32 overwrite_topology; - __s32 topology; -}; - -enum { - AUDIO_SET_EFFECTS_CONFIG32 = _IOW(AUDIO_IOCTL_MAGIC, 99, - struct msm_hwacc_effects_config32), - AUDIO_EFFECTS_SET_BUF_LEN32 = _IOW(AUDIO_IOCTL_MAGIC, 100, - struct msm_hwacc_buf_cfg32), - AUDIO_EFFECTS_GET_BUF_AVAIL32 = _IOW(AUDIO_IOCTL_MAGIC, 101, - struct msm_hwacc_buf_avail32), - AUDIO_EFFECTS_WRITE32 = _IOW(AUDIO_IOCTL_MAGIC, 102, compat_uptr_t), - AUDIO_EFFECTS_READ32 = _IOWR(AUDIO_IOCTL_MAGIC, 103, compat_uptr_t), - AUDIO_EFFECTS_SET_PP_PARAMS32 = _IOW(AUDIO_IOCTL_MAGIC, 104, - compat_uptr_t), - AUDIO_START32 = _IOW(AUDIO_IOCTL_MAGIC, 0, unsigned int), -}; - -static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0, i; - - switch (cmd) { - case AUDIO_SET_EFFECTS_CONFIG32: { - struct msm_hwacc_effects_config32 config32; - struct msm_hwacc_effects_config *config = &effects->config; - - mutex_lock(&effects->lock); - memset(&effects->config, 0, sizeof(effects->config)); - if (copy_from_user(&config32, (void *)arg, - sizeof(config32))) { - pr_err("%s: copy to user for AUDIO_SET_EFFECTS_CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - break; - } - config->input.buf_size = config32.input.buf_size; - config->input.num_buf = config32.input.num_buf; - config->input.num_channels = config32.input.num_channels; - config->input.sample_rate = config32.input.sample_rate; - config->input.bits_per_sample = config32.input.bits_per_sample; - config->input.buf_size = config32.input.buf_size; - for (i = 0; i < MAX_CHANNELS_SUPPORTED; i++) - config->input.channel_map[i] = - config32.input.channel_map[i]; - config->output.buf_size = config32.output.buf_size; - config->output.num_buf = config32.output.num_buf; - config->output.num_channels = config32.output.num_channels; - config->output.sample_rate = config32.output.sample_rate; - config->output.bits_per_sample = - config32.output.bits_per_sample; - config->output.buf_size = config32.output.buf_size; - for (i = 0; i < MAX_CHANNELS_SUPPORTED; i++) - config->output.channel_map[i] = - config32.output.channel_map[i]; - config->buf_cfg.input_len = config32.buf_cfg.input_len; - config->buf_cfg.output_len = config32.buf_cfg.output_len; - config->meta_mode_enabled = config32.meta_mode_enabled; - config->overwrite_topology = config32.overwrite_topology; - config->topology = config32.topology; - pr_debug("%s: write buf_size: %d, num_buf: %d, sample_rate: %d, channels: %d\n", - __func__, effects->config.output.buf_size, - effects->config.output.num_buf, - effects->config.output.sample_rate, - effects->config.output.num_channels); - pr_debug("%s: read buf_size: %d, num_buf: %d, sample_rate: %d, channels: %d\n", - __func__, effects->config.input.buf_size, - effects->config.input.num_buf, - effects->config.input.sample_rate, - effects->config.input.num_channels); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_BUF_LEN32: { - struct msm_hwacc_buf_cfg32 buf_cfg32; - struct msm_hwacc_effects_config *config = &effects->config; - - mutex_lock(&effects->lock); - if (copy_from_user(&buf_cfg32, (void *)arg, - sizeof(buf_cfg32))) { - pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&effects->lock); - break; - } - config->buf_cfg.input_len = buf_cfg32.input_len; - config->buf_cfg.output_len = buf_cfg32.output_len; - pr_debug("%s: write buf len: %d, read buf len: %d\n", - __func__, effects->config.buf_cfg.output_len, - effects->config.buf_cfg.input_len); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_GET_BUF_AVAIL32: { - struct msm_hwacc_buf_avail32 buf_avail; - - memset(&buf_avail, 0, sizeof(buf_avail)); - - mutex_lock(&effects->lock); - buf_avail.input_num_avail = atomic_read(&effects->in_count); - buf_avail.output_num_avail = atomic_read(&effects->out_count); - pr_debug("%s: write buf avail: %d, read buf avail: %d\n", - __func__, buf_avail.output_num_avail, - buf_avail.input_num_avail); - if (copy_to_user((void *)arg, &buf_avail, - sizeof(buf_avail))) { - pr_err("%s: copy to user for AUDIO_EFFECTS_GET_NUM_BUF_AVAIL failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&effects->lock); - break; - } - case AUDIO_EFFECTS_SET_PP_PARAMS32: { - long argvalues[MAX_PP_PARAMS_SZ] = {0}; - int argvalues32[MAX_PP_PARAMS_SZ] = {0}; - - mutex_lock(&effects->lock); - if (copy_from_user(argvalues32, (void *)arg, - MAX_PP_PARAMS_SZ*sizeof(int))) { - pr_err("%s: copy from user failed for pp params\n", - __func__); - mutex_unlock(&effects->lock); - return -EFAULT; - } - for (i = 0; i < MAX_PP_PARAMS_SZ; i++) - argvalues[i] = argvalues32[i]; - - rc = audio_effects_set_pp_param(effects, argvalues); - mutex_unlock(&effects->lock); - break; - } - case AUDIO_START32: { - rc = audio_effects_shared_ioctl(file, AUDIO_START, arg); - break; - } - case AUDIO_EFFECTS_WRITE32: { - rc = audio_effects_shared_ioctl(file, AUDIO_EFFECTS_WRITE, arg); - break; - } - case AUDIO_EFFECTS_READ32: { - rc = audio_effects_shared_ioctl(file, AUDIO_EFFECTS_READ, arg); - break; - } - default: - pr_debug("%s: unhandled ioctl\n", __func__); - rc = -EINVAL; - break; - } - return rc; -} -#endif - -static int audio_effects_release(struct inode *inode, struct file *file) -{ - struct q6audio_effects *effects = file->private_data; - int rc = 0; - - if (!effects) { - pr_err("%s: effect is NULL\n", __func__); - return -EINVAL; - } - if (effects->opened) { - rc = wait_event_timeout(effects->write_wait, - atomic_read(&effects->out_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) - pr_err("%s: write wait_event_timeout failed\n", - __func__); - rc = wait_event_timeout(effects->read_wait, - atomic_read(&effects->in_count), - WAIT_TIMEDOUT_DURATION_SECS * HZ); - if (!rc) - pr_err("%s: read wait_event_timeout failed\n", - __func__); - rc = q6asm_cmd(effects->ac, CMD_CLOSE); - if (rc < 0) - pr_err("%s[%pK]:Failed to close the session rc=%d\n", - __func__, effects, rc); - effects->opened = 0; - effects->started = 0; - - audio_effects_deinit_pp(effects->ac); - } - - if (effects->buf_alloc) { - q6asm_audio_client_buf_free_contiguous(IN, effects->ac); - q6asm_audio_client_buf_free_contiguous(OUT, effects->ac); - } - q6asm_audio_client_free(effects->ac); - - mutex_destroy(&effects->lock); - kfree(effects); - - pr_debug("%s: close session success\n", __func__); - return rc; -} - -static int audio_effects_open(struct inode *inode, struct file *file) -{ - struct q6audio_effects *effects; - int rc = 0; - - effects = kzalloc(sizeof(struct q6audio_effects), GFP_KERNEL); - if (!effects) - return -ENOMEM; - - effects->ac = q6asm_audio_client_alloc( - (app_cb)audio_effects_event_handler, - (void *)effects); - if (!effects->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(effects); - return -ENOMEM; - } - - init_waitqueue_head(&effects->read_wait); - init_waitqueue_head(&effects->write_wait); - mutex_init(&effects->lock); - - effects->opened = 0; - effects->started = 0; - effects->buf_alloc = 0; - file->private_data = effects; - pr_debug("%s: open session success\n", __func__); - return rc; -} - -static const struct file_operations audio_effects_fops = { - .owner = THIS_MODULE, - .open = audio_effects_open, - .release = audio_effects_release, - .unlocked_ioctl = audio_effects_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_effects_compat_ioctl, -#endif -}; - -struct miscdevice audio_effects_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_hweffects", - .fops = &audio_effects_fops, -}; - -int __init audio_effects_init(void) -{ - return misc_register(&audio_effects_misc); -} - -void audio_effects_exit(void) -{ - misc_deregister(&audio_effects_misc); -} - -MODULE_DESCRIPTION("Audio hardware accelerated effects driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/codecs/audio_mp3.c b/techpack/audio/dsp/codecs/audio_mp3.c deleted file mode 100644 index b64b9922606a..000000000000 --- a/techpack/audio/dsp/codecs/audio_mp3.c +++ /dev/null @@ -1,192 +0,0 @@ -/* mp3 audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "audio_utils_aio.h" - -static struct miscdevice audio_mp3_misc; -static struct ws_mgr audio_mp3_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_mp3_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - rc = enable_volume_ramp(audio); - if (rc < 0) { - pr_err("%s: Failed to enable volume ramp\n", - __func__); - } - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_info("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_mp3_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_mp3_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_mp3_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_MP3); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open MP3 decoder, expected frames is always 1 - * audio->buf_cfg.frames_per_buf = 0x01; - */ - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_MP3); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_mp3_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_mp3_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:mp3dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_mp3_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_mp3_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mp3", - .fops = &audio_mp3_fops, -}; - -int __init audio_mp3_init(void) -{ - int ret = misc_register(&audio_mp3_misc); - - if (ret == 0) - device_init_wakeup(audio_mp3_misc.this_device, true); - audio_mp3_ws_mgr.ref_cnt = 0; - mutex_init(&audio_mp3_ws_mgr.ws_lock); - - return ret; -} - -void audio_mp3_exit(void) -{ - mutex_destroy(&audio_mp3_ws_mgr.ws_lock); - misc_deregister(&audio_mp3_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_multi_aac.c b/techpack/audio/dsp/codecs/audio_multi_aac.c deleted file mode 100644 index 0a15c83047c5..000000000000 --- a/techpack/audio/dsp/codecs/audio_multi_aac.c +++ /dev/null @@ -1,534 +0,0 @@ -/* aac audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -#define AUDIO_AAC_DUAL_MONO_INVALID -1 - - -/* Default number of pre-allocated event packets */ -#define PCM_BUFSZ_MIN_AACM ((8*1024) + sizeof(struct dec_meta_out)) -static struct miscdevice audio_multiaac_misc; -static struct ws_mgr audio_multiaac_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_aac_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_aac_cfg aac_cfg; - struct msm_audio_aac_config *aac_config; - uint32_t sbr_ps = 0x00; - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - if (audio->feedback == TUNNEL_MODE) { - aac_cfg.sample_rate = aac_config->sample_rate; - aac_cfg.ch_cfg = aac_config->channel_configuration; - } else { - aac_cfg.sample_rate = audio->pcm_cfg.sample_rate; - aac_cfg.ch_cfg = audio->pcm_cfg.channel_count; - } - pr_debug("%s: AUDIO_START session_id[%d]\n", __func__, - audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_native(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - /* turn on both sbr and ps */ - rc = q6asm_enable_sbrps(audio->ac, sbr_ps); - if (rc < 0) - pr_err("sbr-ps enable failed\n"); - if (aac_config->sbr_ps_on_flag) - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - else if (aac_config->sbr_on_flag) - aac_cfg.aot = AAC_ENC_MODE_AAC_P; - else - aac_cfg.aot = AAC_ENC_MODE_AAC_LC; - - switch (aac_config->format) { - case AUDIO_AAC_FORMAT_ADTS: - aac_cfg.format = 0x00; - break; - case AUDIO_AAC_FORMAT_LOAS: - aac_cfg.format = 0x01; - break; - case AUDIO_AAC_FORMAT_ADIF: - aac_cfg.format = 0x02; - break; - default: - case AUDIO_AAC_FORMAT_RAW: - aac_cfg.format = 0x03; - } - aac_cfg.ep_config = aac_config->ep_config; - aac_cfg.section_data_resilience = - aac_config->aac_section_data_resilience_flag; - aac_cfg.scalefactor_data_resilience = - aac_config->aac_scalefactor_data_resilience_flag; - aac_cfg.spectral_data_resilience = - aac_config->aac_spectral_data_resilience_flag; - - pr_debug("%s:format=%x aot=%d ch=%d sr=%d\n", - __func__, aac_cfg.format, - aac_cfg.aot, aac_cfg.ch_cfg, - aac_cfg.sample_rate); - - /* Configure Media format block */ - rc = q6asm_media_format_block_multi_aac(audio->ac, &aac_cfg); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - - /* Fall back to the default number of channels - * if aac_cfg.ch_cfg is not between 1-6 - */ - if ((aac_cfg.ch_cfg == 0) || (aac_cfg.ch_cfg > 6)) - aac_cfg.ch_cfg = 2; - - rc = q6asm_set_encdec_chan_map(audio->ac, aac_cfg.ch_cfg); - if (rc < 0) { - pr_err("%s: cmd set encdec_chan_map failed\n", - __func__); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_info("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config *aac_config; - uint16_t sce_left = 1, sce_right = 2; - - if (arg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - memcpy(audio->codec_cfg, arg, - sizeof(struct msm_audio_aac_config)); - aac_config = audio->codec_cfg; - if (aac_config->dual_mono_mode > - AUDIO_AAC_DUAL_MONO_PL_SR) { - pr_err("%s:AUDIO_SET_AAC_CONFIG: Invalid dual_mono mode =%d\n", - __func__, aac_config->dual_mono_mode); - } else { - /* convert the data from user into sce_left - * and sce_right based on the definitions - */ - pr_debug("%s: AUDIO_SET_AAC_CONFIG: modify dual_mono mode =%d\n", - __func__, aac_config->dual_mono_mode); - switch (aac_config->dual_mono_mode) { - case AUDIO_AAC_DUAL_MONO_PL_PR: - sce_left = 1; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_SL_SR: - sce_left = 2; - sce_right = 2; - break; - case AUDIO_AAC_DUAL_MONO_SL_PR: - sce_left = 2; - sce_right = 1; - break; - case AUDIO_AAC_DUAL_MONO_PL_SR: - default: - sce_left = 1; - sce_right = 2; - break; - } - rc = q6asm_cfg_dual_mono_aac(audio->ac, - sce_left, sce_right); - if (rc < 0) - pr_err("%s: asm cmd dualmono failed rc=%d\n", - __func__, rc); - } break; - break; - } - case AUDIO_SET_AAC_MIX_CONFIG: { - u32 *mix_coeff = (u32 *)arg; - - if (!arg) { - pr_err("%s: Invalid param for %s\n", - __func__, "AUDIO_SET_AAC_MIX_CONFIG"); - rc = -EINVAL; - break; - } - pr_debug("%s, AUDIO_SET_AAC_MIX_CONFIG", __func__); - pr_debug("%s, value of coeff = %d", - __func__, *mix_coeff); - q6asm_cfg_aac_sel_mix_coef(audio->ac, *mix_coeff); - if (rc < 0) - pr_err("%s asm aac_sel_mix_coef failed rc=%d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_aac_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG failed\n" - , __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG: { - struct msm_audio_aac_config aac_config; - - if (copy_from_user(&aac_config, (void *)arg, - sizeof(aac_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_CONFIG failed\n" - , __func__); - rc = -EFAULT; - } - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - case AUDIO_SET_AAC_MIX_CONFIG: { - u32 mix_config; - - pr_debug("%s, AUDIO_SET_AAC_MIX_CONFIG", __func__); - if (copy_from_user(&mix_config, (void *)arg, - sizeof(u32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_MIX_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = audio_ioctl_shared(file, cmd, &mix_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("Calling utils ioctl\n"); - rc = audio->codec_ioctl(file, cmd, arg); - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_aac_config32 { - s16 format; - u16 audio_object; - u16 ep_config; /* 0 ~ 3 useful only obj = ERLC */ - u16 aac_section_data_resilience_flag; - u16 aac_scalefactor_data_resilience_flag; - u16 aac_spectral_data_resilience_flag; - u16 sbr_on_flag; - u16 sbr_ps_on_flag; - u16 dual_mono_mode; - u16 channel_configuration; - u16 sample_rate; -}; - -enum { - AUDIO_SET_AAC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config32), - AUDIO_GET_AAC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config32), -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_AAC_CONFIG_32: { - struct msm_audio_aac_config *aac_config; - struct msm_audio_aac_config32 aac_config_32; - - memset(&aac_config_32, 0, sizeof(aac_config_32)); - - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; - aac_config_32.format = aac_config->format; - aac_config_32.audio_object = aac_config->audio_object; - aac_config_32.ep_config = aac_config->ep_config; - aac_config_32.aac_section_data_resilience_flag = - aac_config->aac_section_data_resilience_flag; - aac_config_32.aac_scalefactor_data_resilience_flag = - aac_config->aac_scalefactor_data_resilience_flag; - aac_config_32.aac_spectral_data_resilience_flag = - aac_config->aac_spectral_data_resilience_flag; - aac_config_32.sbr_on_flag = aac_config->sbr_on_flag; - aac_config_32.sbr_ps_on_flag = aac_config->sbr_ps_on_flag; - aac_config_32.dual_mono_mode = aac_config->dual_mono_mode; - aac_config_32.channel_configuration = - aac_config->channel_configuration; - aac_config_32.sample_rate = aac_config->sample_rate; - - if (copy_to_user((void *)arg, &aac_config_32, - sizeof(aac_config_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_AAC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_AAC_CONFIG_32: { - struct msm_audio_aac_config aac_config; - struct msm_audio_aac_config32 aac_config_32; - - pr_debug("%s: AUDIO_SET_AAC_CONFIG\n", __func__); - if (copy_from_user(&aac_config_32, (void *)arg, - sizeof(aac_config_32))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_AAC_CONFIG_32 failed", - __func__); - rc = -EFAULT; - break; - } - aac_config.format = aac_config_32.format; - aac_config.audio_object = aac_config_32.audio_object; - aac_config.ep_config = aac_config_32.ep_config; - aac_config.aac_section_data_resilience_flag = - aac_config_32.aac_section_data_resilience_flag; - aac_config.aac_scalefactor_data_resilience_flag = - aac_config_32.aac_scalefactor_data_resilience_flag; - aac_config.aac_spectral_data_resilience_flag = - aac_config_32.aac_spectral_data_resilience_flag; - aac_config.sbr_on_flag = aac_config_32.sbr_on_flag; - aac_config.sbr_ps_on_flag = aac_config_32.sbr_ps_on_flag; - aac_config.dual_mono_mode = aac_config_32.dual_mono_mode; - aac_config.channel_configuration = - aac_config_32.channel_configuration; - aac_config.sample_rate = aac_config_32.sample_rate; - - cmd = AUDIO_SET_AAC_CONFIG; - rc = audio_ioctl_shared(file, cmd, &aac_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - case AUDIO_SET_AAC_MIX_CONFIG: { - u32 mix_config; - - pr_debug("%s, AUDIO_SET_AAC_MIX_CONFIG\n", __func__); - if (copy_from_user(&mix_config, (void *)arg, - sizeof(u32))) { - pr_err("%s: copy_from_user for AUDIO_SET_AAC_MIX_CONFIG failed\n" - , __func__); - rc = -EFAULT; - break; - } - rc = audio_ioctl_shared(file, cmd, &mix_config); - if (rc) - pr_err("%s:AUDIO_SET_AAC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: { - pr_debug("Calling utils ioctl\n"); - rc = audio->codec_compat_ioctl(file, cmd, arg); - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - struct msm_audio_aac_config *aac_config = NULL; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_multi_aac_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - - aac_config = audio->codec_cfg; - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN_AACM; - audio->miscdevice = &audio_multiaac_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_multiaac_ws_mgr; - aac_config->dual_mono_mode = AUDIO_AAC_DUAL_MONO_INVALID; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_MPEG4_MULTI_AAC); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open AAC decoder, expected frames is always 1 - * audio->buf_cfg.frames_per_buf = 0x01; - */ - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_MPEG4_MULTI_AAC); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_multi_aac_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_aac_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:AAC 5.1 Decoder OPEN success mode[%d]session[%d]\n", - __func__, audio->feedback, audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_aac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_multiaac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_multi_aac", - .fops = &audio_aac_fops, -}; - -int __init audio_multiaac_init(void) -{ - int ret = misc_register(&audio_multiaac_misc); - - if (ret == 0) - device_init_wakeup(audio_multiaac_misc.this_device, true); - audio_multiaac_ws_mgr.ref_cnt = 0; - mutex_init(&audio_multiaac_ws_mgr.ws_lock); - - return ret; -} - -void audio_multiaac_exit(void) -{ - mutex_destroy(&audio_multiaac_ws_mgr.ws_lock); - misc_deregister(&audio_multiaac_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_native.c b/techpack/audio/dsp/codecs/audio_native.c deleted file mode 100644 index 8f21cc74f0d7..000000000000 --- a/techpack/audio/dsp/codecs/audio_native.c +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright (c) 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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -* -*/ - -#include -#include -#include "audio_utils.h" - -static int __init audio_native_init(void) -{ - aac_in_init(); - amrnb_in_init(); - amrwb_in_init(); - audio_aac_init(); - audio_alac_init(); - audio_amrnb_init(); - audio_amrwb_init(); - audio_amrwbplus_init(); - audio_ape_init(); - audio_evrc_init(); - audio_g711alaw_init(); - audio_g711mlaw_init(); - audio_effects_init(); - audio_mp3_init(); - audio_multiaac_init(); - audio_qcelp_init(); - audio_wma_init(); - audio_wmapro_init(); - evrc_in_init(); - g711alaw_in_init(); - g711mlaw_in_init(); - qcelp_in_init(); - return 0; -} - -static void __exit audio_native_exit(void) -{ - aac_in_exit(); - amrnb_in_exit(); - amrwb_in_exit(); - audio_aac_exit(); - audio_alac_exit(); - audio_amrnb_exit(); - audio_amrwb_exit(); - audio_amrwbplus_exit(); - audio_ape_exit(); - audio_evrc_exit(); - audio_g711alaw_exit(); - audio_g711mlaw_exit(); - audio_effects_exit(); - audio_mp3_exit(); - audio_multiaac_exit(); - audio_qcelp_exit(); - audio_wma_exit(); - audio_wmapro_exit(); - evrc_in_exit(); - g711alaw_in_exit(); - g711mlaw_in_exit(); - qcelp_in_exit(); -} - -module_init(audio_native_init); -module_exit(audio_native_exit); -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Native Encoder/Decoder module"); diff --git a/techpack/audio/dsp/codecs/audio_qcelp.c b/techpack/audio/dsp/codecs/audio_qcelp.c deleted file mode 100644 index f5e1a313e755..000000000000 --- a/techpack/audio/dsp/codecs/audio_qcelp.c +++ /dev/null @@ -1,195 +0,0 @@ -/* qcelp(v13k) audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "audio_utils_aio.h" - -#define FRAME_SIZE_DEC_QCELP ((32) + sizeof(struct dec_meta_in)) - -static struct miscdevice audio_qcelp_misc; -static struct ws_mgr audio_qcelp_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_qcelp_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("%s: AUDIO_START sessionid[%d]enable[%d]\n", __func__, - audio->ac->session, - audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - } - return rc; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_qcelp_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE_DEC_QCELP; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - audio->pcm_cfg.sample_rate = 8000; - audio->pcm_cfg.channel_count = 1; - audio->miscdevice = &audio_qcelp_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_qcelp_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_V13K); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_V13K); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_qcelp_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_qcelp_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:dec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio); - return rc; -} - -static const struct file_operations audio_qcelp_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, -}; - -static struct miscdevice audio_qcelp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp", - .fops = &audio_qcelp_fops, -}; - -int audio_qcelp_init(void) -{ - int ret = misc_register(&audio_qcelp_misc); - - if (ret == 0) - device_init_wakeup(audio_qcelp_misc.this_device, true); - audio_qcelp_ws_mgr.ref_cnt = 0; - mutex_init(&audio_qcelp_ws_mgr.ws_lock); - - return ret; -} - -void audio_qcelp_exit(void) -{ - mutex_destroy(&audio_qcelp_ws_mgr.ws_lock); - misc_deregister(&audio_qcelp_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_utils.c b/techpack/audio/dsp/codecs/audio_utils.c deleted file mode 100644 index 0565685b9e26..000000000000 --- a/techpack/audio/dsp/codecs/audio_utils.c +++ /dev/null @@ -1,959 +0,0 @@ -/* Copyright (c) 2010-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* - * Define maximum buffer size. Below values are chosen considering the higher - * values used among all native drivers. - */ -#define MAX_FRAME_SIZE 1536 -#define MAX_FRAMES 5 -#define META_SIZE (sizeof(struct meta_out_dsp)) -#define MAX_BUFFER_SIZE (1 + ((MAX_FRAME_SIZE + META_SIZE) * MAX_FRAMES)) - -static int audio_in_pause(struct q6audio_in *audio) -{ - int rc; - - rc = q6asm_cmd(audio->ac, CMD_PAUSE); - if (rc < 0) - pr_err("%s:session id %d: pause cmd failed rc=%d\n", __func__, - audio->ac->session, rc); - - return rc; -} - -static int audio_in_flush(struct q6audio_in *audio) -{ - int rc; - - pr_debug("%s:session id %d: flush\n", __func__, audio->ac->session); - /* Flush if session running */ - if (audio->enabled) { - /* Implicitly issue a pause to the encoder before flushing */ - rc = audio_in_pause(audio); - if (rc < 0) { - pr_err("%s:session id %d: pause cmd failed rc=%d\n", - __func__, audio->ac->session, rc); - return rc; - } - - rc = q6asm_cmd(audio->ac, CMD_FLUSH); - if (rc < 0) { - pr_err("%s:session id %d: flush cmd failed rc=%d\n", - __func__, audio->ac->session, rc); - return rc; - } - /* 2nd arg: 0 -> run immediately - * 3rd arg: 0 -> msw_ts, - * 4th arg: 0 ->lsw_ts - */ - q6asm_run(audio->ac, 0x00, 0x00, 0x00); - pr_debug("Rerun the session\n"); - } - audio->rflush = 1; - audio->wflush = 1; - memset(audio->out_frame_info, 0, sizeof(audio->out_frame_info)); - wake_up(&audio->read_wait); - /* get read_lock to ensure no more waiting read thread */ - mutex_lock(&audio->read_lock); - audio->rflush = 0; - mutex_unlock(&audio->read_lock); - wake_up(&audio->write_wait); - /* get write_lock to ensure no more waiting write thread */ - mutex_lock(&audio->write_lock); - audio->wflush = 0; - mutex_unlock(&audio->write_lock); - pr_debug("%s:session id %d: in_bytes %d\n", __func__, - audio->ac->session, atomic_read(&audio->in_bytes)); - pr_debug("%s:session id %d: in_samples %d\n", __func__, - audio->ac->session, atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); - atomic_set(&audio->out_count, 0); - return 0; -} - -/* must be called with audio->lock held */ -int audio_in_enable(struct q6audio_in *audio) -{ - if (audio->enabled) - return 0; - - /* 2nd arg: 0 -> run immediately - * 3rd arg: 0 -> msw_ts, - * 4th arg: 0 ->lsw_ts - */ - return q6asm_run(audio->ac, 0x00, 0x00, 0x00); -} - -/* must be called with audio->lock held */ -int audio_in_disable(struct q6audio_in *audio) -{ - int rc = 0; - - if (!audio->stopped) { - audio->enabled = 0; - audio->opened = 0; - pr_debug("%s:session id %d: inbytes[%d] insamples[%d]\n", - __func__, audio->ac->session, - atomic_read(&audio->in_bytes), - atomic_read(&audio->in_samples)); - - rc = q6asm_cmd(audio->ac, CMD_CLOSE); - if (rc < 0) - pr_err("%s:session id %d: Failed to close the session rc=%d\n", - __func__, audio->ac->session, - rc); - audio->stopped = 1; - memset(audio->out_frame_info, 0, - sizeof(audio->out_frame_info)); - wake_up(&audio->read_wait); - wake_up(&audio->write_wait); - } - pr_debug("%s:session id %d: enabled[%d]\n", __func__, - audio->ac->session, audio->enabled); - return rc; -} - -int audio_in_buf_alloc(struct q6audio_in *audio) -{ - int rc = 0; - - switch (audio->buf_alloc) { - case NO_BUF_ALLOC: - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_audio_client_buf_alloc(IN, - audio->ac, - ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size), - audio->pcm_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed\n", - __func__, - audio->ac->session); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_IN; - } - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_OUT; - break; - case BUF_ALLOC_IN: - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_OUT; - break; - case BUF_ALLOC_OUT: - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_audio_client_buf_alloc(IN, audio->ac, - ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size), - audio->pcm_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed\n", - __func__, - audio->ac->session); - rc = -ENOMEM; - break; - } - audio->buf_alloc |= BUF_ALLOC_IN; - } - break; - default: - pr_debug("%s:session id %d: buf[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - } - - return rc; -} - -int audio_in_set_config(struct file *file, - struct msm_audio_config *cfg) -{ - int rc = 0; - struct q6audio_in *audio = file->private_data; - - if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s:session id %d: Not sufficient permission to change the record mode\n", - __func__, audio->ac->session); - rc = -EACCES; - goto ret; - } - if ((cfg->buffer_count > PCM_BUF_COUNT) || - (cfg->buffer_count == 1)) - cfg->buffer_count = PCM_BUF_COUNT; - - audio->pcm_cfg.buffer_count = cfg->buffer_count; - audio->pcm_cfg.buffer_size = cfg->buffer_size; - audio->pcm_cfg.channel_count = cfg->channel_count; - audio->pcm_cfg.sample_rate = cfg->sample_rate; - if (audio->opened && audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_audio_client_buf_alloc(IN, audio->ac, - ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size), - audio->pcm_cfg.buffer_count); - if (rc < 0) { - pr_err("%s:session id %d: Buffer Alloc failed\n", - __func__, audio->ac->session); - rc = -ENOMEM; - goto ret; - } - } - audio->buf_alloc |= BUF_ALLOC_IN; - rc = 0; - pr_debug("%s:session id %d: AUDIO_SET_CONFIG %d %d\n", __func__, - audio->ac->session, audio->pcm_cfg.buffer_count, - audio->pcm_cfg.buffer_size); -ret: - return rc; -} -/* ------------------- device --------------------- */ -static long audio_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_FLUSH: { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the read_lock. - * While audio->stopped read threads will always - * exit immediately. - */ - rc = audio_in_flush(audio); - if (rc < 0) - pr_err("%s:session id %d: Flush Fail rc=%d\n", - __func__, audio->ac->session, rc); - else { /* Register back the flushed read buffer with DSP */ - int cnt = 0; - - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - pr_debug("register the read buffer\n"); - } - break; - } - case AUDIO_PAUSE: { - pr_debug("%s:session id %d: AUDIO_PAUSE\n", __func__, - audio->ac->session); - if (audio->enabled) - audio_in_pause(audio); - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->ac->session, - sizeof(u16))) { - pr_err("%s: copy_to_user for AUDIO_GET_SESSION_ID failed\n", - __func__); - rc = -EFAULT; - } - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -long audio_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_FLUSH: - case AUDIO_PAUSE: - case AUDIO_GET_SESSION_ID: - rc = audio_in_ioctl_shared(file, cmd, arg); - break; - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->str_cfg.buffer_size; - cfg.buffer_count = audio->str_cfg.buffer_count; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - pr_debug("%s:session id %d: AUDIO_GET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, cfg.buffer_size, - cfg.buffer_count); - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG failed\n" - , __func__); - rc = -EFAULT; - break; - } - /* Minimum single frame size, - * but with in maximum frames number - */ - if ((cfg.buffer_size < (audio->min_frame_size + - sizeof(struct meta_out_dsp))) || - (cfg.buffer_count < FRAME_NUM)) { - rc = -EINVAL; - break; - } - if (cfg.buffer_size > MAX_BUFFER_SIZE) { - rc = -EINVAL; - break; - } - audio->str_cfg.buffer_size = cfg.buffer_size; - audio->str_cfg.buffer_count = cfg.buffer_count; - if (audio->opened) { - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s: session id %d: Buffer Alloc failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENOMEM; - break; - } - } - audio->buf_alloc |= BUF_ALLOC_OUT; - rc = 0; - pr_debug("%s:session id %d: AUDIO_SET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, - audio->str_cfg.buffer_size, - audio->str_cfg.buffer_count); - break; - } - case AUDIO_SET_BUF_CFG: { - struct msm_audio_buf_cfg cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - break; - } - - /* Restrict the num of frames per buf to coincide with - * default buf size - */ - if (cfg.frames_per_buf > audio->max_frames_per_buf) { - rc = -EFAULT; - break; - } - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - audio->buf_cfg.frames_per_buf = cfg.frames_per_buf; - pr_debug("%s:session id %d: Set-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, - audio->ac->session, cfg.meta_info_enable, - cfg.frames_per_buf); - break; - } - case AUDIO_GET_BUF_CFG: { - pr_debug("%s:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - - if (copy_to_user((void *)arg, &audio->buf_cfg, - sizeof(struct msm_audio_buf_cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_CONFIG: { - if (copy_to_user((void *)arg, &audio->pcm_cfg, - sizeof(struct msm_audio_config))) - rc = -EFAULT; - break; - - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config cfg; - - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = audio_in_set_config(file, &cfg); - break; - } - default: - /* call codec specific ioctl */ - rc = audio->enc_ioctl(file, cmd, arg); - } - mutex_unlock(&audio->lock); - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_stats32 { - u32 byte_count; - u32 sample_count; - u32 unused[2]; -}; - -struct msm_audio_stream_config32 { - u32 buffer_size; - u32 buffer_count; -}; - -struct msm_audio_config32 { - u32 buffer_size; - u32 buffer_count; - u32 channel_count; - u32 sample_rate; - u32 type; - u32 meta_field; - u32 bits; - u32 unused[3]; -}; - -struct msm_audio_buf_cfg32 { - u32 meta_info_enable; - u32 frames_per_buf; -}; - -enum { - AUDIO_GET_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 3, - struct msm_audio_config32), - AUDIO_SET_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 4, - struct msm_audio_config32), - AUDIO_GET_STATS_32 = _IOR(AUDIO_IOCTL_MAGIC, 5, - struct msm_audio_stats32), - AUDIO_SET_STREAM_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 80, - struct msm_audio_stream_config32), - AUDIO_GET_STREAM_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 81, - struct msm_audio_stream_config32), - AUDIO_SET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 94, - struct msm_audio_buf_cfg32), - AUDIO_GET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 93, - struct msm_audio_buf_cfg32), -}; - -long audio_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS_32) { - struct msm_audio_stats32 stats_32; - - memset(&stats_32, 0, sizeof(stats_32)); - stats_32.byte_count = atomic_read(&audio->in_bytes); - stats_32.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats_32, sizeof(stats_32))) { - pr_err("%s: copy_to_user failed for AUDIO_GET_STATS_32\n", - __func__); - return -EFAULT; - } - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_FLUSH: - case AUDIO_PAUSE: - case AUDIO_GET_SESSION_ID: - rc = audio_in_ioctl_shared(file, cmd, arg); - break; - case AUDIO_GET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg_32; - - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.buffer_size = audio->str_cfg.buffer_size; - cfg_32.buffer_count = audio->str_cfg.buffer_count; - if (copy_to_user((void *)arg, &cfg_32, sizeof(cfg_32))) { - pr_err("%s: Copy to user failed\n", __func__); - rc = -EFAULT; - } - pr_debug("%s:session id %d: AUDIO_GET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, - cfg_32.buffer_size, - cfg_32.buffer_count); - break; - } - case AUDIO_SET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg_32; - struct msm_audio_stream_config cfg; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.buffer_size = cfg_32.buffer_size; - cfg.buffer_count = cfg_32.buffer_count; - /* Minimum single frame size, - * but with in maximum frames number - */ - if ((cfg.buffer_size < (audio->min_frame_size + - sizeof(struct meta_out_dsp))) || - (cfg.buffer_count < FRAME_NUM)) { - rc = -EINVAL; - break; - } - audio->str_cfg.buffer_size = cfg.buffer_size; - audio->str_cfg.buffer_count = cfg.buffer_count; - if (audio->opened) { - rc = q6asm_audio_client_buf_alloc(OUT, audio->ac, - ALIGN_BUF_SIZE(audio->str_cfg.buffer_size), - audio->str_cfg.buffer_count); - if (rc < 0) { - pr_err("%s: session id %d:\n", - __func__, audio->ac->session); - pr_err("Buffer Alloc failed rc=%d\n", rc); - rc = -ENOMEM; - break; - } - } - audio->buf_alloc |= BUF_ALLOC_OUT; - pr_debug("%s:session id %d: AUDIO_SET_STREAM_CONFIG %d %d\n", - __func__, audio->ac->session, - audio->str_cfg.buffer_size, - audio->str_cfg.buffer_count); - break; - } - case AUDIO_SET_BUF_CFG_32: { - struct msm_audio_buf_cfg32 cfg_32; - struct msm_audio_buf_cfg cfg; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_BUG_CFG_32 failed", - __func__); - rc = -EFAULT; - break; - } - cfg.meta_info_enable = cfg_32.meta_info_enable; - cfg.frames_per_buf = cfg_32.frames_per_buf; - - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - break; - } - - /* Restrict the num of frames per buf to coincide with - * default buf size - */ - if (cfg.frames_per_buf > audio->max_frames_per_buf) { - rc = -EFAULT; - break; - } - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - audio->buf_cfg.frames_per_buf = cfg.frames_per_buf; - pr_debug("%s:session id %d: Set-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, audio->ac->session, cfg.meta_info_enable, - cfg.frames_per_buf); - break; - } - case AUDIO_GET_BUF_CFG_32: { - struct msm_audio_buf_cfg32 cfg_32; - - pr_debug("%s:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - cfg_32.meta_info_enable = audio->buf_cfg.meta_info_enable; - cfg_32.frames_per_buf = audio->buf_cfg.frames_per_buf; - - if (copy_to_user((void *)arg, &cfg_32, - sizeof(struct msm_audio_buf_cfg32))) { - pr_err("%s: Copy to user failed\n", __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_GET_CONFIG_32: { - struct msm_audio_config32 cfg_32; - - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.buffer_size = audio->pcm_cfg.buffer_size; - cfg_32.buffer_count = audio->pcm_cfg.buffer_count; - cfg_32.channel_count = audio->pcm_cfg.channel_count; - cfg_32.sample_rate = audio->pcm_cfg.sample_rate; - cfg_32.type = audio->pcm_cfg.type; - cfg_32.meta_field = audio->pcm_cfg.meta_field; - cfg_32.bits = audio->pcm_cfg.bits; - - if (copy_to_user((void *)arg, &cfg_32, - sizeof(struct msm_audio_config32))) { - pr_err("%s: Copy to user failed\n", __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_CONFIG_32: { - struct msm_audio_config32 cfg_32; - struct msm_audio_config cfg; - - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.buffer_size = cfg_32.buffer_size; - cfg.buffer_count = cfg_32.buffer_count; - cfg.channel_count = cfg_32.channel_count; - cfg.sample_rate = cfg_32.sample_rate; - cfg.type = cfg_32.type; - cfg.meta_field = cfg_32.meta_field; - cfg.bits = cfg_32.bits; - rc = audio_in_set_config(file, &cfg); - break; - } - default: - /* call codec specific ioctl */ - rc = audio->enc_compat_ioctl(file, cmd, arg); - } - mutex_unlock(&audio->lock); - return rc; -} -#endif - -ssize_t audio_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct q6audio_in *audio = file->private_data; - const char __user *start = buf; - unsigned char *data; - uint32_t offset = 0; - uint32_t size = 0; - int rc = 0; - uint32_t idx; - struct meta_out_dsp meta; - uint32_t bytes_to_copy = 0; - uint32_t mfield_size = (audio->buf_cfg.meta_info_enable == 0) ? 0 : - (sizeof(unsigned char) + - (sizeof(struct meta_out_dsp)*(audio->buf_cfg.frames_per_buf))); - - memset(&meta, 0, sizeof(meta)); - pr_debug("%s:session id %d: read - %zd\n", __func__, audio->ac->session, - count); - if (audio->reset_event) - return -ENETRESET; - - if (!audio->enabled) - return -EFAULT; - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->read_wait, - ((atomic_read(&audio->out_count) > 0) || - (audio->stopped) || - audio->rflush || audio->eos_rsp || - audio->event_abort)); - - if (audio->event_abort) { - rc = -EIO; - break; - } - - - if (rc < 0) - break; - - if ((audio->stopped && !(atomic_read(&audio->out_count))) || - audio->rflush) { - pr_debug("%s:session id %d: driver in stop state or flush,No more buf to read", - __func__, - audio->ac->session); - rc = 0;/* End of File */ - break; - } - if (!(atomic_read(&audio->out_count)) && - (audio->eos_rsp == 1) && - (count >= (sizeof(unsigned char) + - sizeof(struct meta_out_dsp)))) { - unsigned char num_of_frames; - - pr_info("%s:session id %d: eos %d at output\n", - __func__, audio->ac->session, audio->eos_rsp); - if (buf != start) - break; - num_of_frames = 0xFF; - if (copy_to_user(buf, &num_of_frames, - sizeof(unsigned char))) { - rc = -EFAULT; - break; - } - buf += sizeof(unsigned char); - meta.frame_size = 0xFFFF; - meta.encoded_pcm_samples = 0xFFFF; - meta.msw_ts = 0x00; - meta.lsw_ts = 0x00; - meta.nflags = AUD_EOS_SET; - audio->eos_rsp = 0; - if (copy_to_user(buf, &meta, sizeof(meta))) { - rc = -EFAULT; - break; - } - buf += sizeof(meta); - break; - } - data = (unsigned char *)q6asm_is_cpu_buf_avail(OUT, audio->ac, - &size, &idx); - if ((count >= (size + mfield_size)) && data) { - if (audio->buf_cfg.meta_info_enable) { - if (copy_to_user(buf, - &audio->out_frame_info[idx][0], - sizeof(unsigned char))) { - rc = -EFAULT; - break; - } - bytes_to_copy = - (size + audio->out_frame_info[idx][1]); - if (bytes_to_copy == 0) { - rc = 0; - break; - } - /* Number of frames information copied */ - buf += sizeof(unsigned char); - count -= sizeof(unsigned char); - } else { - offset = audio->out_frame_info[idx][1]; - bytes_to_copy = size; - } - - pr_debug("%s:session id %d: offset=%d nr of frames= %d\n", - __func__, audio->ac->session, - audio->out_frame_info[idx][1], - audio->out_frame_info[idx][0]); - - if (copy_to_user(buf, &data[offset], bytes_to_copy)) { - rc = -EFAULT; - break; - } - count -= bytes_to_copy; - buf += bytes_to_copy; - } else { - pr_err("%s:session id %d: short read data[%pK] bytesavail[%d]bytesrequest[%zd]\n", - __func__, - audio->ac->session, - data, size, count); - } - atomic_dec(&audio->out_count); - q6asm_read(audio->ac); - break; - } - mutex_unlock(&audio->read_lock); - - pr_debug("%s:session id %d: read: %zd bytes\n", __func__, - audio->ac->session, (buf-start)); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int extract_meta_info(char *buf, unsigned long *msw_ts, - unsigned long *lsw_ts, unsigned int *flags) -{ - struct meta_in *meta = (struct meta_in *)buf; - *msw_ts = meta->ntimestamp.highpart; - *lsw_ts = meta->ntimestamp.lowpart; - *flags = meta->nflags; - return 0; -} - -ssize_t audio_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct q6audio_in *audio = file->private_data; - const char __user *start = buf; - size_t xfer = 0; - char *cpy_ptr; - int rc = 0; - unsigned char *data; - uint32_t size = 0; - uint32_t idx = 0; - uint32_t nflags = 0; - unsigned long msw_ts = 0; - unsigned long lsw_ts = 0; - uint32_t mfield_size = (audio->buf_cfg.meta_info_enable == 0) ? 0 : - sizeof(struct meta_in); - - pr_debug("%s:session id %d: to write[%zd]\n", __func__, - audio->ac->session, count); - if (audio->reset_event) - return -ENETRESET; - - if (!audio->enabled) - return -EFAULT; - mutex_lock(&audio->write_lock); - - while (count > 0) { - rc = wait_event_interruptible(audio->write_wait, - ((atomic_read(&audio->in_count) > 0) || - (audio->stopped) || - (audio->wflush) || (audio->event_abort))); - - if (audio->event_abort) { - rc = -EIO; - break; - } - - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - pr_debug("%s: session id %d: stop or flush\n", __func__, - audio->ac->session); - rc = -EBUSY; - break; - } - /* if no PCM data, might have only eos buffer - * such case do not hold cpu buffer - */ - if ((buf == start) && (count == mfield_size)) { - char eos_buf[sizeof(struct meta_in)]; - /* Processing beginning of user buffer */ - if (copy_from_user(eos_buf, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - extract_meta_info(eos_buf, &msw_ts, &lsw_ts, - &nflags); - buf += mfield_size; - /* send the EOS and return */ - pr_debug("%s:session id %d: send EOS 0x%8x\n", - __func__, - audio->ac->session, nflags); - break; - } - data = (unsigned char *)q6asm_is_cpu_buf_avail(IN, audio->ac, - &size, &idx); - if (!data) { - pr_debug("%s:session id %d: No buf available\n", - __func__, audio->ac->session); - continue; - } - cpy_ptr = data; - if (audio->buf_cfg.meta_info_enable) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - extract_meta_info(cpy_ptr, &msw_ts, &lsw_ts, - &nflags); - buf += mfield_size; - count -= mfield_size; - } else { - pr_debug("%s:session id %d: continuous buffer\n", - __func__, audio->ac->session); - } - } - - xfer = (count > size) ? size : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - rc = q6asm_write(audio->ac, xfer, msw_ts, lsw_ts, 0x00); - if (rc < 0) { - rc = -EFAULT; - break; - } - atomic_dec(&audio->in_count); - count -= xfer; - buf += xfer; - } - mutex_unlock(&audio->write_lock); - pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%pK] start[0x%pK]\n", - __func__, audio->ac->session, - nflags, buf, start); - if (nflags & AUD_EOS_SET) { - rc = q6asm_cmd(audio->ac, CMD_EOS); - pr_info("%s:session id %d: eos %d at input\n", __func__, - audio->ac->session, audio->eos_rsp); - } - pr_debug("%s:session id %d: Written %zd Avail Buf[%d]", __func__, - audio->ac->session, (buf - start - mfield_size), - atomic_read(&audio->in_count)); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -int audio_in_release(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = file->private_data; - - pr_info("%s: session id %d\n", __func__, audio->ac->session); - mutex_lock(&audio->lock); - audio_in_disable(audio); - q6asm_audio_client_free(audio->ac); - mutex_unlock(&audio->lock); - kfree(audio->enc_cfg); - kfree(audio->codec_cfg); - kfree(audio); - return 0; -} diff --git a/techpack/audio/dsp/codecs/audio_utils.h b/techpack/audio/dsp/codecs/audio_utils.h deleted file mode 100644 index 3ad6903b3365..000000000000 --- a/techpack/audio/dsp/codecs/audio_utils.h +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (c) 2010-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include "q6audio_common.h" - -#define FRAME_NUM (8) - -#define PCM_BUF_COUNT (2) - -#define AUD_EOS_SET 0x01 -#define TUNNEL_MODE 0x0000 -#define NON_TUNNEL_MODE 0x0001 - -#define NO_BUF_ALLOC 0x00 -#define BUF_ALLOC_IN 0x01 -#define BUF_ALLOC_OUT 0x02 -#define BUF_ALLOC_INOUT 0x03 -#define ALIGN_BUF_SIZE(size) ((size + 4095) & (~4095)) - -struct timestamp { - u32 lowpart; - u32 highpart; -} __packed; - -struct meta_in { - unsigned short offset; - struct timestamp ntimestamp; - unsigned int nflags; -} __packed; - -struct meta_out_dsp { - u32 offset_to_frame; - u32 frame_size; - u32 encoded_pcm_samples; - u32 msw_ts; - u32 lsw_ts; - u32 nflags; -} __packed; - -struct meta_out { - unsigned char num_of_frames; - struct meta_out_dsp meta_out_dsp[]; -} __packed; - -struct q6audio_in { - spinlock_t dsp_lock; - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - struct mutex write_lock; - wait_queue_head_t read_wait; - wait_queue_head_t write_wait; - - struct audio_client *ac; - struct msm_audio_stream_config str_cfg; - void *enc_cfg; - struct msm_audio_buf_cfg buf_cfg; - struct msm_audio_config pcm_cfg; - void *codec_cfg; - - /* number of buffers available to read/write */ - atomic_t in_count; - atomic_t out_count; - - /* first idx: num of frames per buf, second idx: offset to frame */ - uint32_t out_frame_info[FRAME_NUM][2]; - int eos_rsp; - int opened; - int enabled; - int stopped; - int event_abort; - int feedback; /* Flag indicates whether used - * in Non Tunnel mode - */ - int rflush; - int wflush; - int buf_alloc; - uint16_t min_frame_size; - uint16_t max_frames_per_buf; - bool reset_event; - long (*enc_ioctl)(struct file *, unsigned int, unsigned long); - long (*enc_compat_ioctl)(struct file *, unsigned int, unsigned long); -}; - -int audio_in_enable(struct q6audio_in *audio); -int audio_in_disable(struct q6audio_in *audio); -int audio_in_buf_alloc(struct q6audio_in *audio); -long audio_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg); -#ifdef CONFIG_COMPAT -long audio_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg); -#else -#define audio_in_compat_ioctl NULL -#endif -ssize_t audio_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos); -ssize_t audio_in_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos); -int audio_in_release(struct inode *inode, struct file *file); -int audio_in_set_config(struct file *file, struct msm_audio_config *cfg); -int aac_in_init(void); -int amrnb_in_init(void); -int amrwb_in_init(void); -int audio_aac_init(void); -int audio_alac_init(void); -int audio_amrnb_init(void); -int audio_amrwb_init(void); -int audio_amrwbplus_init(void); -int audio_ape_init(void); -int audio_evrc_init(void); -int audio_g711alaw_init(void); -int audio_g711mlaw_init(void); -int audio_effects_init(void); -int audio_mp3_init(void); -int audio_multiaac_init(void); -int audio_qcelp_init(void); -int audio_wma_init(void); -int audio_wmapro_init(void); -int evrc_in_init(void); -int g711alaw_in_init(void); -int g711mlaw_in_init(void); -int qcelp_in_init(void); -void aac_in_exit(void); -void amrnb_in_exit(void); -void amrwb_in_exit(void); -void audio_aac_exit(void); -void audio_alac_exit(void); -void audio_amrnb_exit(void); -void audio_amrwb_exit(void); -void audio_amrwbplus_exit(void); -void audio_ape_exit(void); -void audio_evrc_exit(void); -void audio_g711alaw_exit(void); -void audio_g711mlaw_exit(void); -void audio_effects_exit(void); -void audio_mp3_exit(void); -void audio_multiaac_exit(void); -void audio_qcelp_exit(void); -void audio_wma_exit(void); -void audio_wmapro_exit(void); -void evrc_in_exit(void); -void g711alaw_in_exit(void); -void g711mlaw_in_exit(void); -void qcelp_in_exit(void); diff --git a/techpack/audio/dsp/codecs/audio_utils_aio.c b/techpack/audio/dsp/codecs/audio_utils_aio.c deleted file mode 100644 index febbd2a62cdd..000000000000 --- a/techpack/audio/dsp/codecs/audio_utils_aio.c +++ /dev/null @@ -1,2150 +0,0 @@ -/* Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils_aio.h" -#ifdef CONFIG_USE_DEV_CTRL_VOLUME -#include -#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/ -static DEFINE_MUTEX(lock); -#ifdef CONFIG_DEBUG_FS - -int audio_aio_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -ssize_t audio_aio_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0; - struct q6audio_aio *audio; - - mutex_lock(&lock); - if (file->private_data != NULL) { - audio = file->private_data; - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", - audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "feedback %d\n", audio->feedback); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "inqueue empty %d\n", - list_empty(&audio->in_queue)); - n += scnprintf(buffer + n, debug_bufmax - n, - "outqueue empty %d\n", - list_empty(&audio->out_queue)); - } - mutex_unlock(&lock); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} -#endif - -static long audio_aio_ioctl(struct file *file, unsigned int cmd, - unsigned long arg); -#ifdef CONFIG_COMPAT -static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg); -#else -#define audio_aio_compat_ioctl NULL -#endif -int insert_eos_buf(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - struct dec_meta_out *eos_buf = buf_node->kvaddr; - - pr_debug("%s[%pK]:insert_eos_buf\n", __func__, audio); - eos_buf->num_of_frames = 0xFFFFFFFF; - eos_buf->meta_out_dsp[0].offset_to_frame = 0x0; - eos_buf->meta_out_dsp[0].nflags = AUDIO_DEC_EOS_SET; - return sizeof(struct dec_meta_out) + - sizeof(eos_buf->meta_out_dsp[0]); -} - -/* Routine which updates read buffers of driver/dsp, - * for flush operation as DSP output might not have proper - * value set - */ -static int insert_meta_data_flush(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - struct dec_meta_out *meta_data = buf_node->kvaddr; - - meta_data->num_of_frames = 0x0; - meta_data->meta_out_dsp[0].offset_to_frame = 0x0; - meta_data->meta_out_dsp[0].nflags = 0x0; - return sizeof(struct dec_meta_out) + - sizeof(meta_data->meta_out_dsp[0]); -} - -static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr, - unsigned long len, - struct audio_aio_ion_region **region) -{ - struct audio_aio_ion_region *region_elt; - - int match_count = 0; - - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len && - addr + len > addr) { - /* to avoid integer addition overflow */ - - /* offset since we could pass vaddr inside a registered - * ion buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - pr_err("%s[%pK]:multiple hits for vaddr %pK, len %ld\n", - __func__, audio, addr, len); - list_for_each_entry(region_elt, &audio->ion_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len && - addr + len > addr) - pr_err("\t%s[%pK]:%pK, %ld --> %pK\n", - __func__, audio, - region_elt->vaddr, - region_elt->len, - ®ion_elt->paddr); - } - } - - return *region ? 0 : -1; -} - -static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr, - unsigned long len, int ref_up, void **kvaddr) -{ - struct audio_aio_ion_region *region; - phys_addr_t paddr; - int ret; - - ret = audio_aio_ion_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - pr_err("%s[%pK]:lookup (%pK, %ld) failed\n", - __func__, audio, addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - pr_debug("%s[%pK]:found region %pK ref_cnt %d\n", - __func__, audio, region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - /* provide kernel virtual address for accessing meta information */ - if (kvaddr) - *kvaddr = (void *) (region->kvaddr + (addr - region->vaddr)); - return paddr; -} - -static int audio_aio_pause(struct q6audio_aio *audio) -{ - int rc = -EINVAL; - - pr_debug("%s[%pK], enabled = %d\n", __func__, audio, - audio->enabled); - if (audio->enabled) { - rc = q6asm_cmd(audio->ac, CMD_PAUSE); - if (rc < 0) - pr_err_ratelimited("%s[%pK]: pause cmd failed rc=%d\n", - __func__, audio, rc); - - if (rc == 0) { - /* Send suspend only if pause was successful */ - rc = q6asm_cmd(audio->ac, CMD_SUSPEND); - if (rc < 0) - pr_err_ratelimited("%s[%pK]: suspend cmd failed rc=%d\n", - __func__, audio, rc); - } else - pr_err_ratelimited("%s[%pK]: not sending suspend since pause failed\n", - __func__, audio); - - } else - pr_err("%s[%pK]: Driver not enabled\n", __func__, audio); - return rc; -} - -static int audio_aio_flush(struct q6audio_aio *audio) -{ - int rc = 0; - - if (audio->enabled) { - /* Implicitly issue a pause to the decoder before flushing if - * it is not in pause state - */ - if (!(audio->drv_status & ADRV_STATUS_PAUSE)) { - rc = audio_aio_pause(audio); - if (rc < 0) - pr_err_ratelimited("%s[%pK}: pause cmd failed rc=%d\n", - __func__, audio, - rc); - else - audio->drv_status |= ADRV_STATUS_PAUSE; - } - rc = q6asm_cmd(audio->ac, CMD_FLUSH); - if (rc < 0) - pr_err_ratelimited("%s[%pK]: flush cmd failed rc=%d\n", - __func__, audio, rc); - /* Not in stop state, reenable the stream */ - if (audio->stopped == 0) { - rc = audio_aio_enable(audio); - if (rc) - pr_err_ratelimited("%s[%pK]:audio re-enable failed\n", - __func__, audio); - else { - audio->enabled = 1; - if (audio->drv_status & ADRV_STATUS_PAUSE) - audio->drv_status &= ~ADRV_STATUS_PAUSE; - } - } - } - pr_debug("%s[%pK]:in_bytes %d\n", - __func__, audio, atomic_read(&audio->in_bytes)); - pr_debug("%s[%pK]:in_samples %d\n", - __func__, audio, atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); - return rc; -} - -static int audio_aio_outport_flush(struct q6audio_aio *audio) -{ - int rc; - - rc = q6asm_cmd(audio->ac, CMD_OUT_FLUSH); - if (rc < 0) - pr_err_ratelimited("%s[%pK}: output port flush cmd failed rc=%d\n", - __func__, audio, rc); - return rc; -} - -/* Write buffer to DSP / Handle Ack from DSP */ -void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audio_aio_buffer_node *used_buf; - - /* No active flush in progress */ - if (audio->wflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (list_empty(&audio->out_queue)) { - pr_warn("%s: ignore unexpected event from dsp\n", __func__); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return; - } - used_buf = list_first_entry(&audio->out_queue, - struct audio_aio_buffer_node, list); - if (token == used_buf->token) { - list_del(&used_buf->list); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - pr_debug("%s[%pK]:consumed buffer\n", __func__, audio); - event_payload.aio_buf = used_buf->buf; - audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, - event_payload); - kfree(used_buf); - if (list_empty(&audio->out_queue) && - (audio->drv_status & ADRV_STATUS_FSYNC)) { - pr_debug("%s[%pK]: list is empty, reached EOS in Tunnel\n", - __func__, audio); - wake_up(&audio->write_wait); - } - } else { - pr_err("%s[%pK]:expected=%x ret=%x\n", - __func__, audio, used_buf->token, token); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } -} - -/* ------------------- device --------------------- */ -void audio_aio_async_out_flush(struct q6audio_aio *audio) -{ - struct audio_aio_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - unsigned long flags; - - pr_debug("%s[%pK}\n", __func__, audio); - /* EOS followed by flush, EOS response not guranteed, free EOS i/p - * buffer - */ - spin_lock_irqsave(&audio->dsp_lock, flags); - - if (audio->eos_flag && (audio->eos_write_payload.aio_buf.buf_addr)) { - pr_debug("%s[%pK]: EOS followed by flush received,acknowledge eos i/p buffer immediately\n", - __func__, audio); - audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, - audio->eos_write_payload); - memset(&audio->eos_write_payload, 0, - sizeof(union msm_audio_event_payload)); - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audio_aio_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, payload); - kfree(buf_node); - pr_debug("%s[%pK]: Propagate WRITE_DONE during flush\n", - __func__, audio); - } -} - -void audio_aio_async_in_flush(struct q6audio_aio *audio) -{ - struct audio_aio_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - pr_debug("%s[%pK]\n", __func__, audio); - list_for_each_safe(ptr, next, &audio->in_queue) { - buf_node = list_entry(ptr, struct audio_aio_buffer_node, list); - list_del(&buf_node->list); - /* Forcefull send o/p eos buffer after flush, if no eos response - * received by dsp even after sending eos command - */ - if ((audio->eos_rsp != 1) && audio->eos_flag) { - pr_debug("%s[%pK]: send eos on o/p buffer during flush\n", - __func__, audio); - payload.aio_buf = buf_node->buf; - payload.aio_buf.data_len = - insert_eos_buf(audio, buf_node); - audio->eos_flag = 0; - } else { - payload.aio_buf = buf_node->buf; - payload.aio_buf.data_len = - insert_meta_data_flush(audio, buf_node); - } - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, payload); - kfree(buf_node); - pr_debug("%s[%pK]: Propagate READ_DONE during flush\n", - __func__, audio); - } -} - -int audio_aio_enable(struct q6audio_aio *audio) -{ - /* 2nd arg: 0 -> run immediately - * 3rd arg: 0 -> msw_ts, - * 4th arg: 0 ->lsw_ts - */ - return q6asm_run(audio->ac, 0x00, 0x00, 0x00); -} - -int audio_aio_disable(struct q6audio_aio *audio) -{ - int rc = 0; - - if (audio->opened) { - audio->enabled = 0; - audio->opened = 0; - pr_debug("%s[%pK]: inbytes[%d] insamples[%d]\n", __func__, - audio, atomic_read(&audio->in_bytes), - atomic_read(&audio->in_samples)); - /* Close the session */ - rc = q6asm_cmd(audio->ac, CMD_CLOSE); - if (rc < 0) - pr_err_ratelimited("%s[%pK]:Failed to close the session rc=%d\n", - __func__, audio, rc); - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->cmd_wait); - } - pr_debug("%s[%pK]:enabled[%d]\n", __func__, audio, audio->enabled); - return rc; -} - -void audio_aio_reset_ion_region(struct q6audio_aio *audio) -{ - struct audio_aio_ion_region *region; - struct list_head *ptr, *next; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audio_aio_ion_region, list); - list_del(®ion->list); - msm_audio_ion_free(region->dma_buf); - kfree(region); - } -} - -void audio_aio_reset_event_queue(struct q6audio_aio *audio) -{ - unsigned long flags; - struct audio_aio_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audio_aio_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audio_aio_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); -} - -static void audio_aio_unmap_ion_region(struct q6audio_aio *audio) -{ - struct audio_aio_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - pr_debug("%s[%pK]:\n", __func__, audio); - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audio_aio_ion_region, list); - if (region != NULL) { - pr_debug("%s[%pK]: phy_address = 0x%pK\n", - __func__, audio, ®ion->paddr); - rc = q6asm_memory_unmap(audio->ac, - region->paddr, IN); - if (rc < 0) - pr_err("%s[%pK]: memory unmap failed\n", - __func__, audio); - } - } -} - -#ifdef CONFIG_USE_DEV_CTRL_VOLUME - -static void audio_aio_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct q6audio_aio *audio = (struct q6audio_aio *) private_data; - int rc = 0; - - switch (evt_id) { - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->volume = evt_payload->session_vol; - pr_debug("%s[%pK]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n", - __func__, audio, audio->volume, audio->enabled); - if (audio->enabled == 1) { - if (audio->ac) { - rc = q6asm_set_volume(audio->ac, audio->volume); - if (rc < 0) { - pr_err("%s[%pK]: Send Volume command failed rc=%d\n", - __func__, audio, rc); - } - } - } - break; - default: - pr_err("%s[%pK]:ERROR:wrong event\n", __func__, audio); - break; - } -} - -int register_volume_listener(struct q6audio_aio *audio) -{ - int rc = 0; - - audio->device_events = AUDDEV_EVT_STREAM_VOL_CHG; - audio->drv_status &= ~ADRV_STATUS_PAUSE; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->ac->session, - audio_aio_listner, - (void *)audio); - if (rc < 0) { - pr_err("%s[%pK]: Event listener failed\n", __func__, audio); - rc = -EACCES; - } - return rc; -} -void unregister_volume_listener(struct q6audio_aio *audio) -{ - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->ac->session); -} - -int enable_volume_ramp(struct q6audio_aio *audio) -{ - int rc = 0; - struct asm_softpause_params softpause; - struct asm_softvolume_params softvol; - - if (audio->ac == NULL) - return -EINVAL; - pr_debug("%s[%pK]\n", __func__, audio); - softpause.enable = SOFT_PAUSE_ENABLE; - softpause.period = SOFT_PAUSE_PERIOD; - softpause.step = SOFT_PAUSE_STEP; - softpause.rampingcurve = SOFT_PAUSE_CURVE_LINEAR; - - softvol.period = SOFT_VOLUME_PERIOD; - softvol.step = SOFT_VOLUME_STEP; - softvol.rampingcurve = SOFT_VOLUME_CURVE_LINEAR; - - if (softpause.rampingcurve == SOFT_PAUSE_CURVE_LINEAR) - softpause.step = SOFT_PAUSE_STEP_LINEAR; - if (softvol.rampingcurve == SOFT_VOLUME_CURVE_LINEAR) - softvol.step = SOFT_VOLUME_STEP_LINEAR; - rc = q6asm_set_volume(audio->ac, audio->volume); - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - return rc; - } - rc = q6asm_set_softpause(audio->ac, &softpause); - if (rc < 0) { - pr_err("%s: Send SoftPause Param failed rc=%d\n", - __func__, rc); - return rc; - } - rc = q6asm_set_softvolume(audio->ac, &softvol); - if (rc < 0) { - pr_err("%s: Send SoftVolume Param failed rc=%d\n", - __func__, rc); - return rc; - } - /* disable mute by default */ - rc = q6asm_set_mute(audio->ac, 0); - if (rc < 0) { - pr_err("%s: Send mute command failed rc=%d\n", - __func__, rc); - return rc; - } - return rc; -} - -#else /*CONFIG_USE_DEV_CTRL_VOLUME*/ -int register_volume_listener(struct q6audio_aio *audio) -{ - return 0;/* do nothing */ -} -void unregister_volume_listener(struct q6audio_aio *audio) -{ - return;/* do nothing */ -} -int enable_volume_ramp(struct q6audio_aio *audio) -{ - return 0; /* do nothing */ -} -#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/ - -int audio_aio_release(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = file->private_data; - - pr_debug("%s[%pK]\n", __func__, audio); - mutex_lock(&lock); - mutex_lock(&audio->lock); - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - audio->wflush = 1; - if (audio->wakelock_voted && - (audio->audio_ws_mgr != NULL) && - (audio->miscdevice != NULL)) { - audio->wakelock_voted = false; - mutex_lock(&audio->audio_ws_mgr->ws_lock); - if ((audio->audio_ws_mgr->ref_cnt > 0) && - (--audio->audio_ws_mgr->ref_cnt == 0)) { - pm_relax(audio->miscdevice->this_device); - } - mutex_unlock(&audio->audio_ws_mgr->ws_lock); - } - if (audio->enabled) - audio_aio_flush(audio); - audio->wflush = 0; - audio->drv_ops.out_flush(audio); - audio->drv_ops.in_flush(audio); - audio_aio_disable(audio); - audio_aio_unmap_ion_region(audio); - audio_aio_reset_ion_region(audio); - audio->event_abort = 1; - wake_up(&audio->event_wait); - audio_aio_reset_event_queue(audio); - q6asm_audio_client_free(audio->ac); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - mutex_unlock(&audio->lock); - mutex_destroy(&audio->lock); - mutex_destroy(&audio->read_lock); - mutex_destroy(&audio->write_lock); - mutex_destroy(&audio->get_event_lock); - unregister_volume_listener(audio); - -#ifdef CONFIG_DEBUG_FS - debugfs_remove(audio->dentry); -#endif - kfree(audio->codec_cfg); - kfree(audio); - file->private_data = NULL; - mutex_unlock(&lock); - return 0; -} - -int audio_aio_fsync(struct file *file, loff_t start, loff_t end, int datasync) -{ - int rc = 0; - struct q6audio_aio *audio = file->private_data; - - if (!audio->enabled || audio->feedback) - return -EINVAL; - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - pr_debug("%s[%pK]:\n", __func__, audio); - - audio->eos_rsp = 0; - - pr_debug("%s[%pK]Wait for write done from DSP\n", __func__, audio); - rc = wait_event_interruptible(audio->write_wait, - (list_empty(&audio->out_queue)) || - audio->wflush || audio->stopped); - - if (audio->stopped || audio->wflush) { - pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" - , __func__, audio); - audio->wflush = 0; - rc = -EBUSY; - } - - if (rc < 0) { - pr_err("%s[%pK]: wait event for list_empty failed, rc = %d\n", - __func__, audio, rc); - goto done; - } - - rc = q6asm_cmd(audio->ac, CMD_EOS); - pr_debug("%s[%pK]: EOS cmd sent to DSP\n", __func__, audio); - - if (rc < 0) - pr_err_ratelimited("%s[%pK]: q6asm_cmd failed, rc = %d", - __func__, audio, rc); - - pr_debug("%s[%pK]: wait for RENDERED_EOS from DSP\n" - , __func__, audio); - rc = wait_event_interruptible(audio->write_wait, - (audio->eos_rsp || audio->wflush || - audio->stopped)); - - if (rc < 0) { - pr_err("%s[%pK]: wait event for eos_rsp failed, rc = %d\n", - __func__, audio, rc); - goto done; - } - - if (audio->stopped || audio->wflush) { - audio->wflush = 0; - pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" - , __func__, audio); - rc = -EBUSY; - } - - if (audio->eos_rsp == 1) - pr_debug("%s[%pK]: EOS\n", __func__, audio); - - -done: - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -static int audio_aio_events_pending(struct q6audio_aio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort || audio->reset_event; -} - -static long audio_aio_process_event_req_common(struct q6audio_aio *audio, - struct msm_audio_event *usr_evt) -{ - long rc; - struct audio_aio_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - timeout = usr_evt->timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout(audio->event_wait, - audio_aio_events_pending - (audio), - msecs_to_jiffies - (timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible(audio->event_wait, - audio_aio_events_pending(audio)); - } - if (rc < 0) - return rc; - - if (audio->reset_event) { - audio->reset_event = false; - pr_err("In SSR, post ENETRESET err\n"); - return -ENETRESET; - } - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audio_aio_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt->event_type = drv_evt->event_type; - usr_evt->event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else { - pr_err("%s[%pK]:Unexpected path\n", __func__, audio); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return -EPERM; - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) { - pr_debug("%s[%pK]:posted AUDIO_EVENT_WRITE_DONE to user\n", - __func__, audio); - mutex_lock(&audio->write_lock); - audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0, 0); - mutex_unlock(&audio->write_lock); - } else if (drv_evt->event_type == AUDIO_EVENT_READ_DONE) { - pr_debug("%s[%pK]:posted AUDIO_EVENT_READ_DONE to user\n", - __func__, audio); - mutex_lock(&audio->read_lock); - audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0, 0); - mutex_unlock(&audio->read_lock); - } - - /* Some read buffer might be held up in DSP,release all - * Once EOS indicated - */ - if (audio->eos_rsp && !list_empty(&audio->in_queue)) { - pr_debug("%s[%pK]:Send flush command to release read buffers held up in DSP\n", - __func__, audio); - mutex_lock(&audio->lock); - audio_aio_flush(audio); - mutex_unlock(&audio->lock); - } - - return rc; -} - -static long audio_aio_process_event_req(struct q6audio_aio *audio, - void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) { - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - - rc = audio_aio_process_event_req_common(audio, &usr_evt); - - if (copy_to_user(arg, &usr_evt, sizeof(usr_evt))) { - pr_err("%s: copy_to_user failed\n", __func__); - rc = -EFAULT; - } - return rc; -} - -#ifdef CONFIG_COMPAT - -struct msm_audio_aio_buf32 { - compat_uptr_t buf_addr; - u32 buf_len; - u32 data_len; - compat_uptr_t private_data; - u16 mfield_sz; /*only useful for data has meta field */ -}; - -struct msm_audio_bitstream_info32 { - u32 codec_type; - u32 chan_info; - u32 sample_rate; - u32 bit_stream_info; - u32 bit_rate; - u32 unused[3]; -}; - -struct msm_audio_bitstream_error_info32 { - u32 dec_id; - u32 err_msg_indicator; - u32 err_type; -}; - -union msm_audio_event_payload32 { - struct msm_audio_aio_buf32 aio_buf; - struct msm_audio_bitstream_info32 stream_info; - struct msm_audio_bitstream_error_info32 error_info; - s32 reserved; -}; - -struct msm_audio_event32 { - s32 event_type; - s32 timeout_ms; - union msm_audio_event_payload32 event_payload; -}; - -static long audio_aio_process_event_req_compat(struct q6audio_aio *audio, - void __user *arg) -{ - long rc; - struct msm_audio_event32 usr_evt_32; - struct msm_audio_event usr_evt; - memset(&usr_evt, 0, sizeof(struct msm_audio_event)); - - if (copy_from_user(&usr_evt_32, arg, - sizeof(struct msm_audio_event32))) { - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - usr_evt.timeout_ms = usr_evt_32.timeout_ms; - - rc = audio_aio_process_event_req_common(audio, &usr_evt); - if (rc < 0) { - pr_err("%s: audio process event failed, rc = %ld", - __func__, rc); - return rc; - } - - usr_evt_32.event_type = usr_evt.event_type; - switch (usr_evt_32.event_type) { - case AUDIO_EVENT_SUSPEND: - case AUDIO_EVENT_RESUME: - case AUDIO_EVENT_WRITE_DONE: - case AUDIO_EVENT_READ_DONE: - usr_evt_32.event_payload.aio_buf.buf_addr = - ptr_to_compat(usr_evt.event_payload.aio_buf.buf_addr); - usr_evt_32.event_payload.aio_buf.buf_len = - usr_evt.event_payload.aio_buf.buf_len; - usr_evt_32.event_payload.aio_buf.data_len = - usr_evt.event_payload.aio_buf.data_len; - usr_evt_32.event_payload.aio_buf.private_data = - ptr_to_compat(usr_evt.event_payload.aio_buf.private_data); - usr_evt_32.event_payload.aio_buf.mfield_sz = - usr_evt.event_payload.aio_buf.mfield_sz; - break; - case AUDIO_EVENT_STREAM_INFO: - usr_evt_32.event_payload.stream_info.codec_type = - usr_evt.event_payload.stream_info.codec_type; - usr_evt_32.event_payload.stream_info.chan_info = - usr_evt.event_payload.stream_info.chan_info; - usr_evt_32.event_payload.stream_info.sample_rate = - usr_evt.event_payload.stream_info.sample_rate; - usr_evt_32.event_payload.stream_info.bit_stream_info = - usr_evt.event_payload.stream_info.bit_stream_info; - usr_evt_32.event_payload.stream_info.bit_rate = - usr_evt.event_payload.stream_info.bit_rate; - break; - case AUDIO_EVENT_BITSTREAM_ERROR_INFO: - usr_evt_32.event_payload.error_info.dec_id = - usr_evt.event_payload.error_info.dec_id; - usr_evt_32.event_payload.error_info.err_msg_indicator = - usr_evt.event_payload.error_info.err_msg_indicator; - usr_evt_32.event_payload.error_info.err_type = - usr_evt.event_payload.error_info.err_type; - break; - default: - pr_debug("%s: unknown audio event type = %d rc = %ld", - __func__, usr_evt_32.event_type, rc); - return rc; - } - if (copy_to_user(arg, &usr_evt_32, sizeof(usr_evt_32))) { - pr_err("%s: copy_to_user failed\n", __func__); - rc = -EFAULT; - } - return rc; -} -#endif - -static int audio_aio_ion_check(struct q6audio_aio *audio, - void *vaddr, unsigned long len) -{ - struct audio_aio_ion_region *region_elt; - struct audio_aio_ion_region t = {.vaddr = vaddr, .len = len }; - - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || - OVERLAPS(region_elt, &t)) { - pr_err("%s[%pK]:region (vaddr %pK len %ld) clashes with registered region (vaddr %pK paddr %pK len %ld)\n", - __func__, audio, vaddr, len, - region_elt->vaddr, - ®ion_elt->paddr, region_elt->len); - return -EINVAL; - } - } - - return 0; -} - -static int audio_aio_ion_add(struct q6audio_aio *audio, - struct msm_audio_ion_info *info) -{ - dma_addr_t paddr = 0; - size_t len = 0; - struct audio_aio_ion_region *region; - int rc = -EINVAL; - struct dma_buf *dma_buf = NULL; - unsigned long ionflag; - void *kvaddr = NULL; - - pr_debug("%s[%pK]:\n", __func__, audio); - region = kmalloc(sizeof(*region), GFP_KERNEL); - - if (!region) { - rc = -ENOMEM; - goto end; - } - - rc = msm_audio_ion_import(&dma_buf, info->fd, &ionflag, - 0, &paddr, &len, &kvaddr); - if (rc) { - pr_err("%s: msm audio ion alloc failed\n", __func__); - goto import_error; - } - - rc = audio_aio_ion_check(audio, info->vaddr, len); - if (rc < 0) { - pr_err("%s: audio_aio_ion_check failed\n", __func__); - goto ion_error; - } - - region->dma_buf = dma_buf; - region->vaddr = info->vaddr; - region->fd = info->fd; - region->paddr = paddr; - region->kvaddr = kvaddr; - region->len = len; - region->ref_cnt = 0; - pr_debug("%s[%pK]:add region paddr %pK vaddr %pK, len %lu kvaddr %pK\n", - __func__, audio, - ®ion->paddr, region->vaddr, region->len, - region->kvaddr); - list_add_tail(®ion->list, &audio->ion_region_queue); - rc = q6asm_memory_map(audio->ac, paddr, IN, len, 1); - if (rc < 0) { - pr_err("%s[%pK]: memory map failed\n", __func__, audio); - goto mmap_error; - } else { - goto end; - } -mmap_error: - list_del(®ion->list); -ion_error: - msm_audio_ion_free(dma_buf); -import_error: - kfree(region); -end: - return rc; -} - -static int audio_aio_ion_remove(struct q6audio_aio *audio, - struct msm_audio_ion_info *info) -{ - struct audio_aio_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - pr_debug("%s[%pK]:info fd %d vaddr %pK\n", - __func__, audio, info->fd, info->vaddr); - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audio_aio_ion_region, list); - - if ((region->fd == info->fd) && - (region->vaddr == info->vaddr)) { - if (region->ref_cnt) { - pr_debug("%s[%pK]:region %pK in use ref_cnt %d\n", - __func__, audio, region, - region->ref_cnt); - break; - } - pr_debug("%s[%pK]:remove region fd %d vaddr %pK\n", - __func__, audio, info->fd, info->vaddr); - rc = q6asm_memory_unmap(audio->ac, - region->paddr, IN); - if (rc < 0) - pr_err("%s[%pK]: memory unmap failed\n", - __func__, audio); - - list_del(®ion->list); - msm_audio_ion_free(region->dma_buf); - kfree(region); - rc = 0; - break; - } - } - - return rc; -} - -static int audio_aio_async_write(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - int rc; - struct audio_client *ac; - struct audio_aio_write_param param; - - memset(¶m, 0, sizeof(param)); - - if (!audio || !buf_node) { - pr_err("%s NULL pointer audio=[0x%pK], buf_node=[0x%pK]\n", - __func__, audio, buf_node); - return -EINVAL; - } - pr_debug("%s[%pK]: Send write buff %pK phy %pK len %d meta_enable = %d\n", - __func__, audio, buf_node, &buf_node->paddr, - buf_node->buf.data_len, - audio->buf_cfg.meta_info_enable); - pr_debug("%s[%pK]: flags = 0x%x\n", __func__, audio, - buf_node->meta_info.meta_in.nflags); - - ac = audio->ac; - /* Offset with appropriate meta */ - if (audio->feedback) { - /* Non Tunnel mode */ - param.paddr = buf_node->paddr + sizeof(struct dec_meta_in); - param.len = buf_node->buf.data_len - sizeof(struct dec_meta_in); - } else { - /* Tunnel mode */ - param.paddr = buf_node->paddr; - param.len = buf_node->buf.data_len; - } - param.msw_ts = buf_node->meta_info.meta_in.ntimestamp.highpart; - param.lsw_ts = buf_node->meta_info.meta_in.ntimestamp.lowpart; - param.flags = buf_node->meta_info.meta_in.nflags; - /* If no meta_info enaled, indicate no time stamp valid */ - if (!audio->buf_cfg.meta_info_enable) - param.flags = 0xFF00; - - if (buf_node->meta_info.meta_in.nflags & AUDIO_DEC_EOF_SET) - param.flags |= AUDIO_DEC_EOF_SET; - - param.uid = ac->session; - /* Read command will populate session id as token */ - buf_node->token = ac->session; - rc = q6asm_async_write(ac, ¶m); - if (rc < 0) - pr_err_ratelimited("%s[%pK]:failed\n", __func__, audio); - return rc; -} - -void audio_aio_post_event(struct q6audio_aio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audio_aio_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audio_aio_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audio_aio_event), GFP_ATOMIC); - if (!e_node) { - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static int audio_aio_async_read(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node) -{ - struct audio_client *ac; - struct audio_aio_read_param param; - int rc; - - pr_debug("%s[%pK]: Send read buff %pK phy %pK len %d\n", - __func__, audio, buf_node, - &buf_node->paddr, buf_node->buf.buf_len); - ac = audio->ac; - /* Provide address so driver can append nr frames information */ - param.paddr = buf_node->paddr + - sizeof(struct dec_meta_out); - param.len = buf_node->buf.buf_len - - sizeof(struct dec_meta_out); - param.uid = ac->session; - /* Write command will populate session_id as token */ - buf_node->token = ac->session; - rc = q6asm_async_read(ac, ¶m); - if (rc < 0 && rc != -ENETRESET) - pr_err_ratelimited("%s[%pK]:failed\n", __func__, audio); - return rc; -} - -static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, - struct audio_aio_buffer_node *buf_node) -{ - unsigned long flags; - int ret = 0; - - pr_debug("%s[%pK]:node %pK dir %x buf_addr %pK buf_len %d data_len %d\n", - __func__, audio, buf_node, dir, buf_node->buf.buf_addr, - buf_node->buf.buf_len, buf_node->buf.data_len); - buf_node->paddr = audio_aio_ion_fixup(audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1, - &buf_node->kvaddr); - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (!audio->feedback && !buf_node->buf.data_len)) { - kfree(buf_node); - return -EINVAL; - } - ret = extract_meta_out_info(audio, buf_node, 1); - if (ret) { - pr_debug("%s: extract meta failed with %d\n", - __func__, ret); - kfree(buf_node); - return ret; - } - /* Not a EOS buffer */ - if (!(buf_node->meta_info.meta_in.nflags & AUDIO_DEC_EOS_SET)) { - spin_lock_irqsave(&audio->dsp_lock, flags); - ret = audio_aio_async_write(audio, buf_node); - /* EOS buffer handled in driver */ - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } else if (buf_node->meta_info.meta_in.nflags - & AUDIO_DEC_EOS_SET) { - if (!audio->wflush) { - pr_debug("%s[%pK]:Send EOS cmd at i/p\n", - __func__, audio); - /* Driver will forcefully post writedone event - * once eos ack recived from DSP - */ - audio->eos_write_payload.aio_buf = - buf_node->buf; - audio->eos_flag = 1; - audio->eos_rsp = 0; - q6asm_cmd(audio->ac, CMD_EOS); - kfree(buf_node); - } else { /* Flush in progress, send back i/p - * EOS buffer as is - */ - union msm_audio_event_payload event_payload; - - event_payload.aio_buf = buf_node->buf; - audio_aio_post_event(audio, - AUDIO_EVENT_WRITE_DONE, - event_payload); - kfree(buf_node); - } - } - } else { - /* read */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.buf_len < PCM_BUFSZ_MIN)) { - kfree(buf_node); - return -EINVAL; - } - /* No EOS reached */ - if (!audio->eos_rsp) { - spin_lock_irqsave(&audio->dsp_lock, flags); - ret = audio_aio_async_read(audio, buf_node); - /* EOS buffer handled in driver */ - list_add_tail(&buf_node->list, &audio->in_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } - /* EOS reached at input side fake all upcoming read buffer to - * indicate the same - */ - else { - union msm_audio_event_payload event_payload; - - event_payload.aio_buf = buf_node->buf; - event_payload.aio_buf.data_len = - insert_eos_buf(audio, buf_node); - pr_debug("%s[%pK]: propagate READ_DONE as EOS done\n", - __func__, audio); - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(buf_node); - } - } - return ret; -} -#ifdef CONFIG_COMPAT -static int audio_aio_buf_add_compat(struct q6audio_aio *audio, u32 dir, - void __user *arg) -{ - struct audio_aio_buffer_node *buf_node; - struct msm_audio_aio_buf32 aio_buf_32; - - buf_node = kzalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&aio_buf_32, arg, sizeof(aio_buf_32))) { - kfree(buf_node); - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - - buf_node->buf.buf_addr = compat_ptr(aio_buf_32.buf_addr); - buf_node->buf.buf_len = aio_buf_32.buf_len; - buf_node->buf.data_len = aio_buf_32.data_len; - buf_node->buf.private_data = compat_ptr(aio_buf_32.private_data); - buf_node->buf.mfield_sz = aio_buf_32.mfield_sz; - - return audio_aio_buf_add_shared(audio, dir, buf_node); -} -#endif - -static int audio_aio_buf_add(struct q6audio_aio *audio, u32 dir, - void __user *arg) -{ - struct audio_aio_buffer_node *buf_node; - - buf_node = kzalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - pr_err("%s: copy_from_user failed\n", __func__); - return -EFAULT; - } - - return audio_aio_buf_add_shared(audio, dir, buf_node); -} - -void audio_aio_ioport_reset(struct q6audio_aio *audio) -{ - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%pK]:fsync in progress\n", - __func__, audio); - audio->drv_ops.out_flush(audio); - } else - audio->drv_ops.out_flush(audio); - if (audio->feedback == NON_TUNNEL_MODE) - audio->drv_ops.in_flush(audio); - } -} - -int audio_aio_open(struct q6audio_aio *audio, struct file *file) -{ - int rc = 0; - int i; - struct audio_aio_event *e_node = NULL; - struct list_head *ptr, *next; - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - audio->pcm_cfg.sample_rate = 48000; - audio->pcm_cfg.channel_count = 2; - - /* Only AIO interface */ - if (file->f_flags & O_NONBLOCK) { - pr_debug("%s[%pK]:set to aio interface\n", __func__, audio); - audio->drv_status |= ADRV_STATUS_AIO_INTF; - audio->drv_ops.out_flush = audio_aio_async_out_flush; - audio->drv_ops.in_flush = audio_aio_async_in_flush; - q6asm_set_io_mode(audio->ac, ASYNC_IO_MODE); - } else { - pr_err_ratelimited("%s[%pK]:SIO interface not supported\n", - __func__, audio); - rc = -EACCES; - goto fail; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->cmd_wait); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->event_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->in_queue); - INIT_LIST_HEAD(&audio->ion_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - - audio->drv_ops.out_flush(audio); - audio->opened = 1; - audio->reset_event = false; - file->private_data = audio; - audio->codec_ioctl = audio_aio_ioctl; - audio->codec_compat_ioctl = audio_aio_compat_ioctl; - for (i = 0; i < AUDIO_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audio_aio_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - rc = -ENOMEM; - goto cleanup; - } - } - - rc = register_volume_listener(audio); - if (rc < 0) - goto cleanup; - - return 0; -cleanup: - list_for_each_safe(ptr, next, &audio->free_event_queue) { - e_node = list_first_entry(&audio->free_event_queue, - struct audio_aio_event, list); - list_del(&e_node->list); - kfree(e_node); - } -fail: - return rc; -} - -static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_ABORT_GET_EVENT: { - audio->event_abort = 1; - wake_up(&audio->event_wait); - break; - } - case AUDIO_OUTPORT_FLUSH: { - pr_debug("%s[%pK]:AUDIO_OUTPORT_FLUSH\n", __func__, audio); - mutex_lock(&audio->read_lock); - rc = audio_aio_outport_flush(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]: AUDIO_OUTPORT_FLUSH failed\n", - __func__, audio); - rc = -EINTR; - } - mutex_unlock(&audio->read_lock); - break; - } - case AUDIO_STOP: { - pr_debug("%s[%pK]: AUDIO_STOP session_id[%d]\n", __func__, - audio, audio->ac->session); - mutex_lock(&audio->lock); - audio->stopped = 1; - rc = audio_aio_flush(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]:Audio Stop procedure failed rc=%d\n", - __func__, audio, rc); - mutex_unlock(&audio->lock); - break; - } - audio->enabled = 0; - audio->drv_status &= ~ADRV_STATUS_PAUSE; - if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", - __func__, audio); - wake_up(&audio->write_wait); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_PAUSE: { - pr_debug("%s[%pK]:AUDIO_PAUSE %ld\n", __func__, audio, arg); - mutex_lock(&audio->lock); - if (arg == 1) { - rc = audio_aio_pause(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]: pause FAILED rc=%d\n", - __func__, audio, rc); - mutex_unlock(&audio->lock); - break; - } - audio->drv_status |= ADRV_STATUS_PAUSE; - } else if (arg == 0) { - if (audio->drv_status & ADRV_STATUS_PAUSE) { - rc = audio_aio_enable(audio); - if (rc) - pr_err_ratelimited("%s[%pK]: audio enable failed\n", - __func__, audio); - else { - audio->drv_status &= ~ADRV_STATUS_PAUSE; - audio->enabled = 1; - } - } - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_FLUSH: { - pr_debug("%s[%pK]: AUDIO_FLUSH sessionid[%d]\n", __func__, - audio, audio->ac->session); - mutex_lock(&audio->lock); - audio->rflush = 1; - audio->wflush = 1; - if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", - __func__, audio); - wake_up(&audio->write_wait); - } - /* Flush DSP */ - rc = audio_aio_flush(audio); - /* Flush input / Output buffer in software*/ - audio_aio_ioport_reset(audio); - if (rc < 0) { - pr_err_ratelimited("%s[%pK]:AUDIO_FLUSH interrupted\n", - __func__, audio); - rc = -EINTR; - } else { - audio->rflush = 0; - if (audio->drv_status & ADRV_STATUS_FSYNC) - wake_up(&audio->write_wait); - else - audio->wflush = 0; - - } - audio->eos_flag = 0; - audio->eos_rsp = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_SESSION_ID: { - mutex_lock(&audio->lock); - if (copy_to_user((void *)arg, &audio->ac->session, - sizeof(u16))) { - pr_err_ratelimited("%s: copy_to_user for AUDIO_GET_SESSION_ID failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_PM_AWAKE: { - if ((audio->audio_ws_mgr == NULL) || - (audio->miscdevice == NULL)) { - pr_err_ratelimited("%s[%pK]: invalid ws_mgr or miscdevice", - __func__, audio); - rc = -EACCES; - break; - } - pr_debug("%s[%pK]:AUDIO_PM_AWAKE\n", __func__, audio); - mutex_lock(&audio->lock); - if (!audio->wakelock_voted) { - audio->wakelock_voted = true; - mutex_lock(&audio->audio_ws_mgr->ws_lock); - if (audio->audio_ws_mgr->ref_cnt++ == 0) - pm_stay_awake(audio->miscdevice->this_device); - mutex_unlock(&audio->audio_ws_mgr->ws_lock); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_PM_RELAX: { - if ((audio->audio_ws_mgr == NULL) || - (audio->miscdevice == NULL)) { - pr_err_ratelimited("%s[%pK]: invalid ws_mgr or miscdevice", - __func__, audio); - rc = -EACCES; - break; - } - pr_debug("%s[%pK]:AUDIO_PM_RELAX\n", __func__, audio); - mutex_lock(&audio->lock); - if (audio->wakelock_voted) { - audio->wakelock_voted = false; - mutex_lock(&audio->audio_ws_mgr->ws_lock); - if ((audio->audio_ws_mgr->ref_cnt > 0) && - (--audio->audio_ws_mgr->ref_cnt == 0)) { - pm_relax(audio->miscdevice->this_device); - } - mutex_unlock(&audio->audio_ws_mgr->ws_lock); - } - mutex_unlock(&audio->lock); - break; - } - default: - pr_err_ratelimited("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; - - -} - -static long audio_aio_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_ABORT_GET_EVENT: - case AUDIO_OUTPORT_FLUSH: - case AUDIO_STOP: - case AUDIO_PAUSE: - case AUDIO_FLUSH: - case AUDIO_GET_SESSION_ID: - case AUDIO_PM_AWAKE: - case AUDIO_PM_RELAX: - rc = audio_aio_shared_ioctl(file, cmd, arg); - break; - case AUDIO_GET_STATS: { - struct msm_audio_stats stats; - uint64_t timestamp; - - memset(&stats, 0, sizeof(struct msm_audio_stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - rc = q6asm_get_session_time(audio->ac, ×tamp); - if (rc >= 0) - memcpy(&stats.unused[0], ×tamp, sizeof(timestamp)); - else - pr_debug("Error while getting timestamp\n"); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) { - pr_err("%s: copy_frm_user for AUDIO_GET_STATS failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_GET_EVENT: { - pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audio_aio_process_event_req(audio, - (void __user *)arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - break; - } - case AUDIO_ASYNC_WRITE: { - mutex_lock(&audio->write_lock); - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else { - if (audio->enabled) - rc = audio_aio_buf_add(audio, 1, - (void __user *)arg); - else - rc = -EPERM; - } - mutex_unlock(&audio->write_lock); - break; - } - case AUDIO_ASYNC_READ: { - mutex_lock(&audio->read_lock); - if (audio->feedback) - rc = audio_aio_buf_add(audio, 0, - (void __user *)arg); - else - rc = -EPERM; - mutex_unlock(&audio->read_lock); - break; - } - - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - mutex_lock(&audio->lock); - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->str_cfg.buffer_size; - cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", - __func__, audio, cfg.buffer_size, cfg.buffer_count); - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_STREAM_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - - pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_STREAM_CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - - mutex_lock(&audio->lock); - if (copy_to_user((void *)arg, &audio->pcm_cfg, sizeof(cfg))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - - pr_debug("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&config, (void *)arg, sizeof(config))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", - __func__, audio); - rc = -EACCES; - mutex_unlock(&audio->lock); - break; - } - if ((config.buffer_count > PCM_BUF_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - audio->pcm_cfg.buffer_count = config.buffer_count; - audio->pcm_cfg.buffer_size = config.buffer_size; - audio->pcm_cfg.channel_count = config.channel_count; - audio->pcm_cfg.sample_rate = config.sample_rate; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_BUF_CFG: { - struct msm_audio_buf_cfg cfg; - - mutex_lock(&audio->lock); - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_GET_BUF CONFIG failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", - __func__, audio, - audio->ac->session, cfg.meta_info_enable); - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_BUF_CFG: { - pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, audio, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - - mutex_lock(&audio->lock); - if (copy_to_user((void *)arg, &audio->buf_cfg, - sizeof(struct msm_audio_buf_cfg))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_BUF_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_REGISTER_ION: { - struct msm_audio_ion_info info; - - pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&info, (void *)arg, sizeof(info))) { - pr_err( - "%s: copy_from_user for AUDIO_REGISTER_ION failed\n", - __func__); - rc = -EFAULT; - } else { - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_add(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_DEREGISTER_ION: { - struct msm_audio_ion_info info; - - mutex_lock(&audio->lock); - pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); - if (copy_from_user(&info, (void *)arg, sizeof(info))) { - pr_err( - "%s: copy_from_user for AUDIO_DEREGISTER_ION failed\n", - __func__); - rc = -EFAULT; - } else { - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_remove(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_stream_config32 { - u32 buffer_size; - u32 buffer_count; -}; - -struct msm_audio_stats32 { - u32 byte_count; - u32 sample_count; - u32 unused[2]; -}; - -struct msm_audio_config32 { - u32 buffer_size; - u32 buffer_count; - u32 channel_count; - u32 sample_rate; - u32 type; - u32 meta_field; - u32 bits; - u32 unused[3]; -}; - -struct msm_audio_buf_cfg32 { - u32 meta_info_enable; - u32 frames_per_buf; -}; - -struct msm_audio_ion_info32 { - int fd; - compat_uptr_t vaddr; -}; - -enum { - AUDIO_GET_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 3, - struct msm_audio_config32), - AUDIO_SET_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 4, - struct msm_audio_config32), - AUDIO_GET_STATS_32 = _IOR(AUDIO_IOCTL_MAGIC, 5, - struct msm_audio_stats32), - AUDIO_GET_EVENT_32 = _IOR(AUDIO_IOCTL_MAGIC, 13, - struct msm_audio_event32), - AUDIO_ASYNC_WRITE_32 = _IOW(AUDIO_IOCTL_MAGIC, 17, - struct msm_audio_aio_buf32), - AUDIO_ASYNC_READ_32 = _IOW(AUDIO_IOCTL_MAGIC, 18, - struct msm_audio_aio_buf32), - AUDIO_SET_STREAM_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, 80, - struct msm_audio_stream_config32), - AUDIO_GET_STREAM_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, 81, - struct msm_audio_stream_config32), - AUDIO_GET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 93, - struct msm_audio_buf_cfg32), - AUDIO_SET_BUF_CFG_32 = _IOW(AUDIO_IOCTL_MAGIC, 94, - struct msm_audio_buf_cfg32), - AUDIO_REGISTER_ION_32 = _IOW(AUDIO_IOCTL_MAGIC, 97, - struct msm_audio_ion_info32), - AUDIO_DEREGISTER_ION_32 = _IOW(AUDIO_IOCTL_MAGIC, 98, - struct msm_audio_ion_info32), -}; - -static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_ABORT_GET_EVENT: - case AUDIO_OUTPORT_FLUSH: - case AUDIO_STOP: - case AUDIO_PAUSE: - case AUDIO_FLUSH: - case AUDIO_GET_SESSION_ID: - case AUDIO_PM_AWAKE: - case AUDIO_PM_RELAX: - rc = audio_aio_shared_ioctl(file, cmd, arg); - break; - case AUDIO_GET_STATS_32: { - struct msm_audio_stats32 stats; - uint64_t timestamp; - - memset(&stats, 0, sizeof(struct msm_audio_stats32)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - rc = q6asm_get_session_time(audio->ac, ×tamp); - if (rc >= 0) - memcpy(&stats.unused[0], ×tamp, sizeof(timestamp)); - else - pr_debug("Error while getting timestamp\n"); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_STATS_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_GET_EVENT_32: { - pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audio_aio_process_event_req_compat(audio, - (void __user *)arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - break; - } - case AUDIO_ASYNC_WRITE_32: { - mutex_lock(&audio->write_lock); - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else { - if (audio->enabled) - rc = audio_aio_buf_add_compat(audio, 1, - (void __user *)arg); - else - rc = -EPERM; - } - mutex_unlock(&audio->write_lock); - break; - } - case AUDIO_ASYNC_READ_32: { - mutex_lock(&audio->read_lock); - if (audio->feedback) - rc = audio_aio_buf_add_compat(audio, 0, - (void __user *)arg); - else - rc = -EPERM; - mutex_unlock(&audio->read_lock); - break; - } - - case AUDIO_GET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg; - - mutex_lock(&audio->lock); - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->str_cfg.buffer_size; - cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", - __func__, audio, cfg.buffer_size, cfg.buffer_count); - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { - pr_err("%s: copy_to_user for AUDIO_GET_STREAM_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_STREAM_CONFIG_32: { - struct msm_audio_stream_config32 cfg_32; - struct msm_audio_stream_config cfg; - - pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - cfg.buffer_size = cfg_32.buffer_size; - cfg.buffer_count = cfg_32.buffer_count; - - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_CONFIG_32: { - struct msm_audio_config32 cfg_32; - - mutex_lock(&audio->lock); - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.buffer_size = audio->pcm_cfg.buffer_size; - cfg_32.buffer_count = audio->pcm_cfg.buffer_count; - cfg_32.channel_count = audio->pcm_cfg.channel_count; - cfg_32.sample_rate = audio->pcm_cfg.sample_rate; - cfg_32.type = audio->pcm_cfg.type; - cfg_32.meta_field = audio->pcm_cfg.meta_field; - cfg_32.bits = audio->pcm_cfg.bits; - - if (copy_to_user((void *)arg, &cfg_32, sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_CONFIG_32: { - struct msm_audio_config config; - struct msm_audio_config32 config_32; - - mutex_lock(&audio->lock); - - if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", - __func__, audio); - rc = -EACCES; - mutex_unlock(&audio->lock); - break; - } - pr_debug("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); - if (copy_from_user(&config_32, (void *)arg, - sizeof(config_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - config.buffer_size = config_32.buffer_size; - config.buffer_count = config_32.buffer_count; - config.channel_count = config_32.channel_count; - config.sample_rate = config_32.sample_rate; - config.type = config_32.type; - config.meta_field = config_32.meta_field; - config.bits = config_32.bits; - - if ((config.buffer_count > PCM_BUF_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - audio->pcm_cfg.buffer_count = config.buffer_count; - audio->pcm_cfg.buffer_size = config.buffer_size; - audio->pcm_cfg.channel_count = config.channel_count; - audio->pcm_cfg.sample_rate = config.sample_rate; - rc = 0; - mutex_unlock(&audio->lock); - break; - } - case AUDIO_SET_BUF_CFG_32: { - struct msm_audio_buf_cfg cfg; - struct msm_audio_buf_cfg32 cfg_32; - - mutex_lock(&audio->lock); - if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - cfg.meta_info_enable = cfg_32.meta_info_enable; - cfg.frames_per_buf = cfg_32.frames_per_buf; - - if ((audio->feedback == NON_TUNNEL_MODE) && - !cfg.meta_info_enable) { - rc = -EFAULT; - mutex_unlock(&audio->lock); - break; - } - - audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", - __func__, audio, - audio->ac->session, cfg.meta_info_enable); - mutex_unlock(&audio->lock); - break; - } - case AUDIO_GET_BUF_CFG_32: { - struct msm_audio_buf_cfg32 cfg_32; - - pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", - __func__, audio, - audio->ac->session, audio->buf_cfg.meta_info_enable, - audio->buf_cfg.frames_per_buf); - mutex_lock(&audio->lock); - memset(&cfg_32, 0, sizeof(cfg_32)); - cfg_32.meta_info_enable = audio->buf_cfg.meta_info_enable; - cfg_32.frames_per_buf = audio->buf_cfg.frames_per_buf; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(struct msm_audio_buf_cfg32))) { - pr_err("%s: copy_to_user for AUDIO_GET_BUF_CFG_32 failed\n", - __func__); - rc = -EFAULT; - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_REGISTER_ION_32: { - struct msm_audio_ion_info32 info_32; - struct msm_audio_ion_info info; - - pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); - mutex_lock(&audio->lock); - if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { - pr_err("%s: copy_from_user for AUDIO_REGISTER_ION_32 failed\n", - __func__); - rc = -EFAULT; - } else { - info.fd = info_32.fd; - info.vaddr = compat_ptr(info_32.vaddr); - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_add(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - case AUDIO_DEREGISTER_ION_32: { - struct msm_audio_ion_info32 info_32; - struct msm_audio_ion_info info; - - mutex_lock(&audio->lock); - pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); - if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { - pr_err("%s: copy_from_user for AUDIO_DEREGISTER_ION_32 failed\n", - __func__); - rc = -EFAULT; - } else { - info.fd = info_32.fd; - info.vaddr = compat_ptr(info_32.vaddr); - mutex_lock(&audio->read_lock); - mutex_lock(&audio->write_lock); - rc = audio_aio_ion_remove(audio, &info); - mutex_unlock(&audio->write_lock); - mutex_unlock(&audio->read_lock); - } - mutex_unlock(&audio->lock); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#endif diff --git a/techpack/audio/dsp/codecs/audio_utils_aio.h b/techpack/audio/dsp/codecs/audio_utils_aio.h deleted file mode 100644 index bd99c3680697..000000000000 --- a/techpack/audio/dsp/codecs/audio_utils_aio.h +++ /dev/null @@ -1,230 +0,0 @@ -/* Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2018, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6audio_common.h" - -#define TUNNEL_MODE 0x0000 -#define NON_TUNNEL_MODE 0x0001 - -#define ADRV_STATUS_AIO_INTF 0x00000001 /* AIO interface */ -#define ADRV_STATUS_FSYNC 0x00000008 -#define ADRV_STATUS_PAUSE 0x00000010 -#define AUDIO_DEC_EOS_SET 0x00000001 -#define AUDIO_DEC_EOF_SET 0x00000010 -#define AUDIO_EVENT_NUM 10 - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -struct timestamp { - u32 lowpart; - u32 highpart; -} __packed; - -struct meta_out_dsp { - u32 offset_to_frame; - u32 frame_size; - u32 encoded_pcm_samples; - u32 msw_ts; - u32 lsw_ts; - u32 nflags; -} __packed; - -struct dec_meta_in { - unsigned char reserved[18]; - unsigned short offset; - struct timestamp ntimestamp; - unsigned int nflags; -} __packed; - -struct dec_meta_out { - unsigned int reserved[7]; - unsigned int num_of_frames; - struct meta_out_dsp meta_out_dsp[]; -} __packed; - -/* General meta field to store meta info locally */ -union meta_data { - struct dec_meta_out meta_out; - struct dec_meta_in meta_in; -} __packed; - -/* per device wakeup source manager */ -struct ws_mgr { - struct mutex ws_lock; - uint32_t ref_cnt; -}; - -#define PCM_BUF_COUNT (2) -/* Buffer with meta */ -#define PCM_BUFSZ_MIN ((4*1024) + sizeof(struct dec_meta_out)) - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (2) -#define FRAME_SIZE ((4*1536) + sizeof(struct dec_meta_in)) - -struct audio_aio_ion_region { - struct list_head list; - struct dma_buf *dma_buf; - int fd; - void *vaddr; - phys_addr_t paddr; - void *kvaddr; - unsigned long len; - unsigned int ref_cnt; -}; - -struct audio_aio_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio_aio_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; - uint32_t token; - void *kvaddr; - union meta_data meta_info; -}; - -struct q6audio_aio; -struct audio_aio_drv_operations { - void (*out_flush)(struct q6audio_aio *); - void (*in_flush)(struct q6audio_aio *); -}; - -struct q6audio_aio { - atomic_t in_bytes; - atomic_t in_samples; - - struct msm_audio_stream_config str_cfg; - struct msm_audio_buf_cfg buf_cfg; - struct msm_audio_config pcm_cfg; - void *codec_cfg; - - struct audio_client *ac; - - struct mutex lock; - struct mutex read_lock; - struct mutex write_lock; - struct mutex get_event_lock; - wait_queue_head_t cmd_wait; - wait_queue_head_t write_wait; - wait_queue_head_t event_wait; - spinlock_t dsp_lock; - spinlock_t event_queue_lock; - - struct miscdevice *miscdevice; - uint32_t wakelock_voted; - struct ws_mgr *audio_ws_mgr; - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - struct list_head out_queue; /* queue to retain output buffers */ - struct list_head in_queue; /* queue to retain input buffers */ - struct list_head free_event_queue; - struct list_head event_queue; - struct list_head ion_region_queue; /* protected by lock */ - struct audio_aio_drv_operations drv_ops; - union msm_audio_event_payload eos_write_payload; - uint32_t device_events; - uint16_t volume; - uint32_t drv_status; - int event_abort; - int eos_rsp; - int eos_flag; - int opened; - int enabled; - int stopped; - int feedback; - int rflush; /* Read flush */ - int wflush; /* Write flush */ - bool reset_event; - long (*codec_ioctl)(struct file *, unsigned int, unsigned long); - long (*codec_compat_ioctl)(struct file *, unsigned int, unsigned long); -}; - -void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload); - -void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload); - -int insert_eos_buf(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node); - -int extract_meta_out_info(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node, int dir); - -int audio_aio_open(struct q6audio_aio *audio, struct file *file); -int audio_aio_enable(struct q6audio_aio *audio); -void audio_aio_post_event(struct q6audio_aio *audio, int type, - union msm_audio_event_payload payload); -int audio_aio_release(struct inode *inode, struct file *file); -int audio_aio_fsync(struct file *file, loff_t start, loff_t end, int datasync); -void audio_aio_async_out_flush(struct q6audio_aio *audio); -void audio_aio_async_in_flush(struct q6audio_aio *audio); -void audio_aio_ioport_reset(struct q6audio_aio *audio); -int enable_volume_ramp(struct q6audio_aio *audio); -#ifdef CONFIG_DEBUG_FS -int audio_aio_debug_open(struct inode *inode, struct file *file); -ssize_t audio_aio_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos); -#endif diff --git a/techpack/audio/dsp/codecs/audio_wma.c b/techpack/audio/dsp/codecs/audio_wma.c deleted file mode 100644 index da757f31a4d6..000000000000 --- a/techpack/audio/dsp/codecs/audio_wma.c +++ /dev/null @@ -1,349 +0,0 @@ -/* wma audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_wma_misc; -static struct ws_mgr audio_wma_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_wma_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_wma_cfg wma_cfg; - struct msm_audio_wma_config_v2 *wma_config; - - pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, - audio, audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; - wma_cfg.format_tag = wma_config->format_tag; - wma_cfg.ch_cfg = wma_config->numchannels; - wma_cfg.sample_rate = wma_config->samplingrate; - wma_cfg.avg_bytes_per_sec = wma_config->avgbytespersecond; - wma_cfg.block_align = wma_config->block_align; - wma_cfg.valid_bits_per_sample = - wma_config->validbitspersample; - wma_cfg.ch_mask = wma_config->channelmask; - wma_cfg.encode_opt = wma_config->encodeopt; - /* Configure Media format block */ - rc = q6asm_media_format_block_wma(audio->ac, &wma_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_WMA_CONFIG_V2: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_wma_config_v2))) { - pr_err("%s:copy_to_user for AUDIO_SET_WMA_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_WMA_CONFIG_V2: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_wma_config_v2))) { - pr_err("%s:copy_from_user for AUDIO_SET_WMA_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_wma_config_v2_32 { - u16 format_tag; - u16 numchannels; - u32 samplingrate; - u32 avgbytespersecond; - u16 block_align; - u16 validbitspersample; - u32 channelmask; - u16 encodeopt; -}; - -enum { - AUDIO_GET_WMA_CONFIG_V2_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+2), struct msm_audio_wma_config_v2_32), - AUDIO_SET_WMA_CONFIG_V2_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_wma_config_v2_32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - case AUDIO_GET_WMA_CONFIG_V2_32: { - struct msm_audio_wma_config_v2 *wma_config; - struct msm_audio_wma_config_v2_32 wma_config_32; - - memset(&wma_config_32, 0, sizeof(wma_config_32)); - - wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; - wma_config_32.format_tag = wma_config->format_tag; - wma_config_32.numchannels = wma_config->numchannels; - wma_config_32.samplingrate = wma_config->samplingrate; - wma_config_32.avgbytespersecond = wma_config->avgbytespersecond; - wma_config_32.block_align = wma_config->block_align; - wma_config_32.validbitspersample = - wma_config->validbitspersample; - wma_config_32.channelmask = wma_config->channelmask; - wma_config_32.encodeopt = wma_config->encodeopt; - if (copy_to_user((void *)arg, &wma_config_32, - sizeof(wma_config_32))) { - pr_err("%s: copy_to_user for GET_WMA_CONFIG_V2_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_SET_WMA_CONFIG_V2_32: { - struct msm_audio_wma_config_v2 *wma_config; - struct msm_audio_wma_config_v2_32 wma_config_32; - - if (copy_from_user(&wma_config_32, (void *)arg, - sizeof(wma_config_32))) { - pr_err("%s: copy_from_user for SET_WMA_CONFIG_V2_32 failed\n" - , __func__); - rc = -EFAULT; - break; - } - wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; - wma_config->format_tag = wma_config_32.format_tag; - wma_config->numchannels = wma_config_32.numchannels; - wma_config->samplingrate = wma_config_32.samplingrate; - wma_config->avgbytespersecond = wma_config_32.avgbytespersecond; - wma_config->block_align = wma_config_32.block_align; - wma_config->validbitspersample = - wma_config_32.validbitspersample; - wma_config->channelmask = wma_config_32.channelmask; - wma_config->encodeopt = wma_config_32.encodeopt; - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wma_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_wma_config_v2), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_wma_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_wma_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_WMA_V9); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open WMA decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_WMA_V9); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_wma_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_wma_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:wmadec success mode[%d]session[%d]\n", __func__, - audio->feedback, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wma_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_wma_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wma", - .fops = &audio_wma_fops, -}; - -int __init audio_wma_init(void) -{ - int ret = misc_register(&audio_wma_misc); - - if (ret == 0) - device_init_wakeup(audio_wma_misc.this_device, true); - audio_wma_ws_mgr.ref_cnt = 0; - mutex_init(&audio_wma_ws_mgr.ws_lock); - - return ret; -} - -void audio_wma_exit(void) -{ - mutex_destroy(&audio_wma_ws_mgr.ws_lock); - misc_deregister(&audio_wma_misc); -} diff --git a/techpack/audio/dsp/codecs/audio_wmapro.c b/techpack/audio/dsp/codecs/audio_wmapro.c deleted file mode 100644 index 218216300bc6..000000000000 --- a/techpack/audio/dsp/codecs/audio_wmapro.c +++ /dev/null @@ -1,422 +0,0 @@ -/* wmapro audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2019, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include "audio_utils_aio.h" - -static struct miscdevice audio_wmapro_misc; -static struct ws_mgr audio_wmapro_ws_mgr; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations audio_wmapro_debug_fops = { - .read = audio_aio_debug_read, - .open = audio_aio_debug_open, -}; -#endif - -static long audio_ioctl_shared(struct file *file, unsigned int cmd, - void *arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: { - struct asm_wmapro_cfg wmapro_cfg; - struct msm_audio_wmapro_config *wmapro_config; - - pr_debug("%s: AUDIO_START session_id[%d]\n", __func__, - audio->ac->session); - if (audio->feedback == NON_TUNNEL_MODE) { - /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm_v2(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count, - 16, /* bits per sample */ - true, /* use default channel map */ - true, /* use back channel map flavor */ - NULL); - if (rc < 0) { - pr_err("pcm output block config failed\n"); - break; - } - } - wmapro_config = (struct msm_audio_wmapro_config *) - audio->codec_cfg; - if ((wmapro_config->formattag == 0x162) || - (wmapro_config->formattag == 0x163) || - (wmapro_config->formattag == 0x166) || - (wmapro_config->formattag == 0x167)) { - wmapro_cfg.format_tag = wmapro_config->formattag; - } else { - pr_err("%s:AUDIO_START failed: formattag = %d\n", - __func__, wmapro_config->formattag); - rc = -EINVAL; - break; - } - if (wmapro_config->numchannels > 0) { - wmapro_cfg.ch_cfg = wmapro_config->numchannels; - } else { - pr_err("%s:AUDIO_START failed: channels = %d\n", - __func__, wmapro_config->numchannels); - rc = -EINVAL; - break; - } - if (wmapro_config->samplingrate > 0) { - wmapro_cfg.sample_rate = wmapro_config->samplingrate; - } else { - pr_err("%s:AUDIO_START failed: sample_rate = %d\n", - __func__, wmapro_config->samplingrate); - rc = -EINVAL; - break; - } - wmapro_cfg.avg_bytes_per_sec = - wmapro_config->avgbytespersecond; - if ((wmapro_config->asfpacketlength <= 13376) || - (wmapro_config->asfpacketlength > 0)) { - wmapro_cfg.block_align = - wmapro_config->asfpacketlength; - } else { - pr_err("%s:AUDIO_START failed: block_align = %d\n", - __func__, wmapro_config->asfpacketlength); - rc = -EINVAL; - break; - } - if ((wmapro_config->validbitspersample == 16) || - (wmapro_config->validbitspersample == 24)) { - wmapro_cfg.valid_bits_per_sample = - wmapro_config->validbitspersample; - } else { - pr_err("%s:AUDIO_START failed: bitspersample = %d\n", - __func__, wmapro_config->validbitspersample); - rc = -EINVAL; - break; - } - wmapro_cfg.ch_mask = wmapro_config->channelmask; - wmapro_cfg.encode_opt = wmapro_config->encodeopt; - wmapro_cfg.adv_encode_opt = - wmapro_config->advancedencodeopt; - wmapro_cfg.adv_encode_opt2 = - wmapro_config->advancedencodeopt2; - /* Configure Media format block */ - rc = q6asm_media_format_block_wmapro(audio->ac, &wmapro_cfg, - audio->ac->stream_id); - if (rc < 0) { - pr_err("cmd media format block failed\n"); - break; - } - rc = audio_aio_enable(audio); - audio->eos_rsp = 0; - audio->eos_flag = 0; - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("Audio Start procedure failed rc=%d\n", rc); - break; - } - pr_debug("AUDIO_START success enable[%d]\n", audio->enabled); - if (audio->stopped == 1) - audio->stopped = 0; - break; - } - default: - pr_err("%s: Unknown ioctl cmd %d\n", __func__, cmd); - rc = -EINVAL; - break; - } - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_GET_WMAPRO_CONFIG: { - if (copy_to_user((void *)arg, audio->codec_cfg, - sizeof(struct msm_audio_wmapro_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_WMAPRO_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_WMAPRO_CONFIG: { - if (copy_from_user(audio->codec_cfg, (void *)arg, - sizeof(struct msm_audio_wmapro_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_WMAPRO_CONFIG_V2 failed\n", - __func__); - rc = -EFAULT; - break; - } - break; - } - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} - -#ifdef CONFIG_COMPAT - -struct msm_audio_wmapro_config32 { - u16 armdatareqthr; - u8 validbitspersample; - u8 numchannels; - u16 formattag; - u32 samplingrate; - u32 avgbytespersecond; - u16 asfpacketlength; - u32 channelmask; - u16 encodeopt; - u16 advancedencodeopt; - u32 advancedencodeopt2; -}; - -enum { - AUDIO_GET_WMAPRO_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_wmapro_config32), - AUDIO_SET_WMAPRO_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_wmapro_config32) -}; - -static long audio_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct q6audio_aio *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_GET_WMAPRO_CONFIG_32: { - struct msm_audio_wmapro_config *wmapro_config; - struct msm_audio_wmapro_config32 wmapro_config_32; - - memset(&wmapro_config_32, 0, sizeof(wmapro_config_32)); - - wmapro_config = - (struct msm_audio_wmapro_config *)audio->codec_cfg; - wmapro_config_32.armdatareqthr = wmapro_config->armdatareqthr; - wmapro_config_32.validbitspersample = - wmapro_config->validbitspersample; - wmapro_config_32.numchannels = wmapro_config->numchannels; - wmapro_config_32.formattag = wmapro_config->formattag; - wmapro_config_32.samplingrate = wmapro_config->samplingrate; - wmapro_config_32.avgbytespersecond = - wmapro_config->avgbytespersecond; - wmapro_config_32.asfpacketlength = - wmapro_config->asfpacketlength; - wmapro_config_32.channelmask = wmapro_config->channelmask; - wmapro_config_32.encodeopt = wmapro_config->encodeopt; - wmapro_config_32.advancedencodeopt = - wmapro_config->advancedencodeopt; - wmapro_config_32.advancedencodeopt2 = - wmapro_config->advancedencodeopt2; - - if (copy_to_user((void *)arg, &wmapro_config_32, - sizeof(struct msm_audio_wmapro_config32))) { - pr_err("%s: copy_to_user for AUDIO_GET_WMAPRO_CONFIG_V2_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_WMAPRO_CONFIG_32: { - struct msm_audio_wmapro_config *wmapro_config; - struct msm_audio_wmapro_config32 wmapro_config_32; - - if (copy_from_user(&wmapro_config_32, (void *)arg, - sizeof(struct msm_audio_wmapro_config32))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_WMAPRO_CONFG_V2_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - wmapro_config = - (struct msm_audio_wmapro_config *)audio->codec_cfg; - wmapro_config->armdatareqthr = wmapro_config_32.armdatareqthr; - wmapro_config->validbitspersample = - wmapro_config_32.validbitspersample; - wmapro_config->numchannels = wmapro_config_32.numchannels; - wmapro_config->formattag = wmapro_config_32.formattag; - wmapro_config->samplingrate = wmapro_config_32.samplingrate; - wmapro_config->avgbytespersecond = - wmapro_config_32.avgbytespersecond; - wmapro_config->asfpacketlength = - wmapro_config_32.asfpacketlength; - wmapro_config->channelmask = wmapro_config_32.channelmask; - wmapro_config->encodeopt = wmapro_config_32.encodeopt; - wmapro_config->advancedencodeopt = - wmapro_config_32.advancedencodeopt; - wmapro_config->advancedencodeopt2 = - wmapro_config_32.advancedencodeopt2; - break; - } - case AUDIO_START: { - rc = audio_ioctl_shared(file, cmd, (void *)arg); - break; - } - default: { - pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); - rc = audio->codec_compat_ioctl(file, cmd, arg); - if (rc) - pr_err_ratelimited("Failed in utils_ioctl: %d\n", rc); - break; - } - } - return rc; -} -#else -#define audio_compat_ioctl NULL -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct q6audio_aio *audio = NULL; - int rc = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wmapro_" + 5]; -#endif - audio = kzalloc(sizeof(struct q6audio_aio), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - audio->codec_cfg = kzalloc(sizeof(struct msm_audio_wmapro_config), - GFP_KERNEL); - if (audio->codec_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - - - audio->pcm_cfg.buffer_size = PCM_BUFSZ_MIN; - audio->miscdevice = &audio_wmapro_misc; - audio->wakelock_voted = false; - audio->audio_ws_mgr = &audio_wmapro_ws_mgr; - - audio->ac = q6asm_audio_client_alloc((app_cb) q6_audio_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("Could not allocate memory for audio client\n"); - kfree(audio->codec_cfg); - kfree(audio); - return -ENOMEM; - } - - rc = audio_aio_open(audio, file); - if (rc < 0) { - pr_err_ratelimited("%s: audio_aio_open rc=%d\n", - __func__, rc); - goto fail; - } - /* open in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { - rc = q6asm_open_read_write(audio->ac, FORMAT_LINEAR_PCM, - FORMAT_WMA_V10PRO); - if (rc < 0) { - pr_err("NT mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = NON_TUNNEL_MODE; - /* open WMA decoder, expected frames is always 1*/ - audio->buf_cfg.frames_per_buf = 0x01; - audio->buf_cfg.meta_info_enable = 0x01; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - rc = q6asm_open_write(audio->ac, FORMAT_WMA_V10PRO); - if (rc < 0) { - pr_err("T mode Open failed rc=%d\n", rc); - rc = -ENODEV; - goto fail; - } - audio->feedback = TUNNEL_MODE; - audio->buf_cfg.meta_info_enable = 0x00; - } else { - pr_err("Not supported mode\n"); - rc = -EACCES; - goto fail; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof(name), "msm_wmapro_%04x", audio->ac->session); - audio->dentry = debugfs_create_file(name, S_IFREG | 0444, - NULL, (void *)audio, - &audio_wmapro_debug_fops); - - if (IS_ERR(audio->dentry)) - pr_debug("debugfs_create_file failed\n"); -#endif - pr_info("%s:wmapro decoder open success, session_id = %d\n", __func__, - audio->ac->session); - return rc; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->codec_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wmapro_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_aio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_aio_fsync, - .compat_ioctl = audio_compat_ioctl -}; - -static struct miscdevice audio_wmapro_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wmapro", - .fops = &audio_wmapro_fops, -}; - -int __init audio_wmapro_init(void) -{ - int ret = misc_register(&audio_wmapro_misc); - - if (ret == 0) - device_init_wakeup(audio_wmapro_misc.this_device, true); - audio_wmapro_ws_mgr.ref_cnt = 0; - mutex_init(&audio_wmapro_ws_mgr.ws_lock); - - return ret; -} - -void audio_wmapro_exit(void) -{ - mutex_destroy(&audio_wmapro_ws_mgr.ws_lock); - misc_deregister(&audio_wmapro_misc); -} diff --git a/techpack/audio/dsp/codecs/evrc_in.c b/techpack/audio/dsp/codecs/evrc_in.c deleted file mode 100644 index 15f08e7450b8..000000000000 --- a/techpack/audio/dsp/codecs/evrc_in.c +++ /dev/null @@ -1,413 +0,0 @@ -/* Copyright (c) 2010-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((23+sizeof(struct meta_out_dsp)) * 10)) - -static long evrc_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_evrc_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - /* rate_modulation_cmd set to zero - * currently not configurable from user space - */ - rc = q6asm_enc_cfg_blk_evrc(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate, 0); - - if (rc < 0) { - pr_err("%s:session id %d: cmd evrc media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG: { - struct msm_audio_evrc_enc_config *cfg; - struct msm_audio_evrc_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - cfg = (struct msm_audio_evrc_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer for %s\n", - __func__, "AUDIO_SET_EVRC_ENC_CONFIG"); - rc = -EINVAL; - break; - } - if (cfg->min_bit_rate > 4 || - cfg->min_bit_rate < 1 || - (cfg->min_bit_rate == 2)) { - pr_err("%s:session id %d: invalid min bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - if (cfg->max_bit_rate > 4 || - cfg->max_bit_rate < 1 || - (cfg->max_bit_rate == 2)) { - pr_err("%s:session id %d: invalid max bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->min_bit_rate = cfg->min_bit_rate; - enc_cfg->max_bit_rate = cfg->max_bit_rate; - pr_debug("%s:session id %d: min_bit_rate= 0x%x max_bit_rate=0x%x\n", - __func__, - audio->ac->session, enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long evrc_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = evrc_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_EVRC_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_evrc_enc_config))) { - pr_err("%s: copy_to_user for AUDIO_GET_EVRC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG: { - struct msm_audio_evrc_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(struct msm_audio_evrc_enc_config))) { - pr_err("%s: copy_from_user for AUDIO_SET_EVRC_ENC_CONFIG failed\n", - __func__); - rc = -EFAULT; - break; - } - rc = evrc_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_EVRC_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_evrc_enc_config32 { - u32 cdma_rate; - u32 min_bit_rate; - u32 max_bit_rate; -}; - -enum { - AUDIO_SET_EVRC_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - 2, struct msm_audio_evrc_enc_config32), - AUDIO_GET_EVRC_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - 3, struct msm_audio_evrc_enc_config32) -}; - -static long evrc_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = evrc_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_EVRC_ENC_CONFIG_32: { - struct msm_audio_evrc_enc_config32 cfg_32; - struct msm_audio_evrc_enc_config *enc_cfg; - - memset(&cfg_32, 0, sizeof(cfg_32)); - - enc_cfg = audio->enc_cfg; - cfg_32.cdma_rate = enc_cfg->cdma_rate; - cfg_32.min_bit_rate = enc_cfg->min_bit_rate; - cfg_32.max_bit_rate = enc_cfg->max_bit_rate; - - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_EVRC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG_32: { - struct msm_audio_evrc_enc_config cfg; - struct msm_audio_evrc_enc_config32 cfg_32; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_EVRC_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.cdma_rate = cfg_32.cdma_rate; - cfg.min_bit_rate = cfg_32.min_bit_rate; - cfg.max_bit_rate = cfg_32.max_bit_rate; - cmd = AUDIO_SET_EVRC_ENC_CONFIG; - rc = evrc_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_EVRC_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define evrc_in_compat_ioctl NULL -#endif - -static int evrc_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_evrc_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_evrc_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 23; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->min_bit_rate = 4; - enc_cfg->max_bit_rate = 4; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open evrc encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_EVRC, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", - __func__, audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_EVRC); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, - audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", __func__, - audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = evrc_in_compat_ioctl; - audio->enc_ioctl = evrc_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = evrc_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_evrc_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc_in", - .fops = &audio_in_fops, -}; - -int __init evrc_in_init(void) -{ - return misc_register(&audio_evrc_in_misc); -} - -void evrc_in_exit(void) -{ - misc_deregister(&audio_evrc_in_misc); -} diff --git a/techpack/audio/dsp/codecs/g711alaw_in.c b/techpack/audio/dsp/codecs/g711alaw_in.c deleted file mode 100644 index c668b48b812d..000000000000 --- a/techpack/audio/dsp/codecs/g711alaw_in.c +++ /dev/null @@ -1,385 +0,0 @@ -/* Copyright (c) 2010-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((320+sizeof(struct meta_out_dsp)) * 10)) -static long g711_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - pr_debug("%s: sample rate %d", __func__, enc_cfg->sample_rate); - rc = q6asm_enc_cfg_blk_g711(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->sample_rate); - - if (rc < 0) { - pr_err("%s:session id %d: cmd g711 media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", __func__, - audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, - rc); - break; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config *cfg; - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - - cfg = (struct msm_audio_g711_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - if (cfg->sample_rate != 8000 && - cfg->sample_rate != 16000) { - pr_err("%s:session id %d: invalid sample rate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->sample_rate = cfg->sample_rate; - pr_debug("%s:session id %d: sample_rate= 0x%x", - __func__, - audio->ac->session, enc_cfg->sample_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -static long g711_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_g711_enc_config))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_g711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_GET_G711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - break; - } - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_GET_G711_ENC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_enc_config32 { - uint32_t sample_rate; -}; - -enum { - AUDIO_SET_G711_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_enc_config32), - AUDIO_GET_G711_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_enc_config32) -}; - -static long g711_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config32 *)audio->enc_cfg; - cfg_32.sample_rate = enc_cfg->sample_rate; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 cfg; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.sample_rate = cfg_32.sample_rate; - cmd = AUDIO_SET_G711_ENC_CONFIG; - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_G711_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} -#else -#define g711_in_compat_ioctl NULL -#endif - -static int g711_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_g711_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_g711_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* - * Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 320; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->sample_rate = 8000; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open g711 encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_G711_ALAW_FS, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_G711_ALAW_FS); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = g711_in_compat_ioctl; - audio->enc_ioctl = g711_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = g711_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_in_compat_ioctl, -#endif -}; - -struct miscdevice audio_g711alaw_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711alaw_in", - .fops = &audio_in_fops, -}; - -int __init g711alaw_in_init(void) -{ - return misc_register(&audio_g711alaw_in_misc); -} - -void g711alaw_in_exit(void) -{ - misc_deregister(&audio_g711alaw_in_misc); -} diff --git a/techpack/audio/dsp/codecs/g711mlaw_in.c b/techpack/audio/dsp/codecs/g711mlaw_in.c deleted file mode 100644 index 2f20c1335f6e..000000000000 --- a/techpack/audio/dsp/codecs/g711mlaw_in.c +++ /dev/null @@ -1,388 +0,0 @@ -/* Copyright (c) 2010-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -#ifdef CONFIG_COMPAT -#undef PROC_ADD -#endif -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((320+sizeof(struct meta_out_dsp)) * 10)) -static long g711_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - pr_debug("%s: sample rate %d", __func__, enc_cfg->sample_rate); - rc = q6asm_enc_cfg_blk_g711(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->sample_rate); - - if (rc < 0) { - pr_err("%s:session id %d: cmd g711 media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", __func__, - audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, - rc); - break; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config *cfg; - struct msm_audio_g711_enc_config *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config *)audio->enc_cfg; - - cfg = (struct msm_audio_g711_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - if (cfg->sample_rate != 8000 && - cfg->sample_rate != 16000) { - pr_err("%s:session id %d: invalid sample rate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->sample_rate = cfg->sample_rate; - pr_debug("%s:session id %d: sample_rate= 0x%x", - __func__, - audio->ac->session, enc_cfg->sample_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -static long g711_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_g711_enc_config))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_g711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG: { - struct msm_audio_g711_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_GET_G711_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - break; - } - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_GET_G711_ENC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_g711_enc_config32 { - uint32_t sample_rate; -}; - -enum { - AUDIO_SET_G711_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_enc_config32), - AUDIO_GET_G711_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_enc_config32) -}; - -static long g711_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = g711_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 *enc_cfg; - - enc_cfg = (struct msm_audio_g711_enc_config32 *)audio->enc_cfg; - cfg_32.sample_rate = enc_cfg->sample_rate; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_G711_ENC_CONFIG_32: { - struct msm_audio_g711_enc_config32 cfg_32; - struct msm_audio_g711_enc_config32 cfg; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_G711_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.sample_rate = cfg_32.sample_rate; - cmd = AUDIO_SET_G711_ENC_CONFIG; - rc = g711_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_G711_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -ENOIOCTLCMD; - } - return rc; -} -#else -#define g711_in_compat_ioctl NULL -#endif - -static int g711_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_g711_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_g711_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* - * Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 320; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->sample_rate = 8000; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open g711 encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_G711_MLAW_FS, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_G711_MLAW_FS); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = g711_in_compat_ioctl; - audio->enc_ioctl = g711_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = g711_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = audio_in_compat_ioctl, -#endif -}; - -struct miscdevice audio_g711mlaw_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_g711mlaw_in", - .fops = &audio_in_fops, -}; - -int __init g711mlaw_in_init(void) -{ - return misc_register(&audio_g711mlaw_in_misc); -} - -void g711mlaw_in_exit(void) -{ - misc_deregister(&audio_g711mlaw_in_misc); -} diff --git a/techpack/audio/dsp/codecs/q6audio_common.h b/techpack/audio/dsp/codecs/q6audio_common.h deleted file mode 100644 index 75f20e5ac2bd..000000000000 --- a/techpack/audio/dsp/codecs/q6audio_common.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2012-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - - -/* For Decoders */ -#ifndef __Q6_AUDIO_COMMON_H__ -#define __Q6_AUDIO_COMMON_H__ - -#include -#include - - -void q6_audio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv); - -void audio_aio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *audio); - - -/* For Encoders */ -void q6asm_in_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv); - -void audio_in_get_dsp_frames(void *audio, - uint32_t token, uint32_t *payload); - -#endif /*__Q6_AUDIO_COMMON_H__*/ diff --git a/techpack/audio/dsp/codecs/q6audio_v2.c b/techpack/audio/dsp/codecs/q6audio_v2.c deleted file mode 100644 index ea3113217281..000000000000 --- a/techpack/audio/dsp/codecs/q6audio_v2.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2012-2013, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -void q6asm_in_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_in *audio = (struct q6audio_in *)priv; - unsigned long flags; - - pr_debug("%s:session id %d: opcode[0x%x]\n", __func__, - audio->ac->session, opcode); - - spin_lock_irqsave(&audio->dsp_lock, flags); - switch (opcode) { - case ASM_DATA_EVENT_READ_DONE_V2: - audio_in_get_dsp_frames(audio, token, payload); - break; - case ASM_DATA_EVENT_WRITE_DONE_V2: - atomic_inc(&audio->in_count); - wake_up(&audio->write_wait); - break; - case ASM_DATA_EVENT_RENDERED_EOS: - audio->eos_rsp = 1; - wake_up(&audio->read_wait); - break; - case ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2: - break; - case ASM_SESSION_EVENTX_OVERFLOW: - pr_err("%s:session id %d: ASM_SESSION_EVENT_TX_OVERFLOW\n", - __func__, audio->ac->session); - break; - case RESET_EVENTS: - pr_debug("%s:received RESET EVENTS\n", __func__); - audio->enabled = 0; - audio->stopped = 1; - audio->event_abort = 1; - audio->reset_event = true; - wake_up(&audio->read_wait); - wake_up(&audio->write_wait); - break; - default: - pr_debug("%s:session id %d: Ignore opcode[0x%x]\n", __func__, - audio->ac->session, opcode); - break; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -void audio_in_get_dsp_frames(void *priv, - uint32_t token, uint32_t *payload) -{ - struct q6audio_in *audio = (struct q6audio_in *)priv; - uint32_t index; - - index = q6asm_get_buf_index_from_token(token); - pr_debug("%s:session id %d: index=%d nr frames=%d offset[%d]\n", - __func__, audio->ac->session, token, payload[9], - payload[5]); - pr_debug("%s:session id %d: timemsw=%d lsw=%d\n", __func__, - audio->ac->session, payload[7], payload[6]); - pr_debug("%s:session id %d: uflags=0x%8x uid=0x%8x\n", __func__, - audio->ac->session, payload[8], payload[10]); - pr_debug("%s:session id %d: enc_framesotal_size=0x%8x\n", __func__, - audio->ac->session, payload[4]); - - /* Ensure the index is within max array size: FRAME_NUM */ - if (index >= FRAME_NUM) { - pr_err("%s: Invalid index %d\n", - __func__, index); - return; - } - - audio->out_frame_info[index][0] = payload[9]; - audio->out_frame_info[index][1] = payload[5]; - - /* statistics of read */ - atomic_add(payload[4], &audio->in_bytes); - atomic_add(payload[9], &audio->in_samples); - - if (atomic_read(&audio->out_count) <= audio->str_cfg.buffer_count) { - atomic_inc(&audio->out_count); - wake_up(&audio->read_wait); - } -} diff --git a/techpack/audio/dsp/codecs/q6audio_v2_aio.c b/techpack/audio/dsp/codecs/q6audio_v2_aio.c deleted file mode 100644 index 973108de9d78..000000000000 --- a/techpack/audio/dsp/codecs/q6audio_v2_aio.c +++ /dev/null @@ -1,232 +0,0 @@ -/* Copyright (c) 2012-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils_aio.h" - -void q6_audio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_aio *audio = (struct q6audio_aio *)priv; - - pr_debug("%s:opcode = %x token = 0x%x\n", __func__, opcode, token); - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: - case ASM_DATA_EVENT_READ_DONE_V2: - case ASM_DATA_EVENT_RENDERED_EOS: - case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - case RESET_EVENTS: - audio_aio_cb(opcode, token, payload, audio); - break; - default: - pr_debug("%s:Unhandled event = 0x%8x\n", __func__, opcode); - break; - } -} - -void audio_aio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv/*struct q6audio_aio *audio*/) -{ - struct q6audio_aio *audio = (struct q6audio_aio *)priv; - union msm_audio_event_payload e_payload; - - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: - pr_debug("%s[%pK]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n", - __func__, audio, token); - audio_aio_async_write_ack(audio, token, payload); - break; - case ASM_DATA_EVENT_READ_DONE_V2: - pr_debug("%s[%pK]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n", - __func__, audio, token); - audio_aio_async_read_ack(audio, token, payload); - break; - case ASM_DATA_EVENT_RENDERED_EOS: - /* EOS Handle */ - pr_debug("%s[%pK]:ASM_DATA_CMDRSP_EOS\n", __func__, audio); - if (audio->feedback) { /* Non-Tunnel mode */ - audio->eos_rsp = 1; - /* propagate input EOS i/p buffer, - * after receiving DSP acknowledgment - */ - if (audio->eos_flag && - (audio->eos_write_payload.aio_buf.buf_addr)) { - audio_aio_post_event(audio, - AUDIO_EVENT_WRITE_DONE, - audio->eos_write_payload); - memset(&audio->eos_write_payload, 0, - sizeof(union msm_audio_event_payload)); - audio->eos_flag = 0; - } - } else { /* Tunnel mode */ - audio->eos_rsp = 1; - wake_up(&audio->write_wait); - wake_up(&audio->cmd_wait); - } - break; - case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - pr_debug("%s[%pK]:payload0[%x] payloa1d[%x]opcode= 0x%x\n", - __func__, audio, payload[0], payload[1], opcode); - break; - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n", - __func__, audio, payload[0], - payload[1], payload[2], payload[3]); - - pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", - __func__, audio, audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - audio->pcm_cfg.sample_rate = payload[0]; - audio->pcm_cfg.channel_count = payload[1] & 0xFFFF; - e_payload.stream_info.chan_info = audio->pcm_cfg.channel_count; - e_payload.stream_info.sample_rate = audio->pcm_cfg.sample_rate; - audio_aio_post_event(audio, AUDIO_EVENT_STREAM_INFO, e_payload); - break; - case RESET_EVENTS: - pr_err("%s: Received opcode:0x%x\n", __func__, opcode); - audio->stopped = 1; - audio->reset_event = true; - wake_up(&audio->event_wait); - break; - default: - break; - } -} - -int extract_meta_out_info(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node, int dir) -{ - struct dec_meta_out *meta_data = buf_node->kvaddr; - uint32_t temp; - - if (dir) { /* input buffer - Write */ - if (audio->buf_cfg.meta_info_enable) { - if (buf_node->buf.buf_len < - sizeof(struct dec_meta_in)) { - pr_debug("%s: invalid buf len %d\n", - __func__, buf_node->buf.buf_len); - return -EINVAL; - } - memcpy(&buf_node->meta_info.meta_in, - (char *)buf_node->kvaddr, sizeof(struct dec_meta_in)); - } else { - memset(&buf_node->meta_info.meta_in, - 0, sizeof(struct dec_meta_in)); - } - pr_debug("%s[%pK]:i/p: msw_ts %d lsw_ts %d nflags 0x%8x\n", - __func__, audio, - buf_node->meta_info.meta_in.ntimestamp.highpart, - buf_node->meta_info.meta_in.ntimestamp.lowpart, - buf_node->meta_info.meta_in.nflags); - } else { /* output buffer - Read */ - memcpy((char *)buf_node->kvaddr, - &buf_node->meta_info.meta_out, - sizeof(struct dec_meta_out)); - meta_data->meta_out_dsp[0].nflags = 0x00000000; - temp = meta_data->meta_out_dsp[0].msw_ts; - meta_data->meta_out_dsp[0].msw_ts = - meta_data->meta_out_dsp[0].lsw_ts; - meta_data->meta_out_dsp[0].lsw_ts = temp; - - pr_debug("%s[%pK]:o/p: msw_ts %d lsw_ts %d nflags 0x%8x, num_frames = %d\n", - __func__, audio, - ((struct dec_meta_out *)buf_node->kvaddr)-> - meta_out_dsp[0].msw_ts, - ((struct dec_meta_out *)buf_node->kvaddr)-> - meta_out_dsp[0].lsw_ts, - ((struct dec_meta_out *)buf_node->kvaddr)-> - meta_out_dsp[0].nflags, - ((struct dec_meta_out *)buf_node->kvaddr)->num_of_frames); - } - return 0; -} - -/* Read buffer from DSP / Handle Ack from DSP */ -void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audio_aio_buffer_node *filled_buf; - int ret; - - pr_debug("%s\n", __func__); - - /* No active flush in progress */ - if (audio->rflush) - return; - - /* Statistics of read */ - atomic_add(payload[4], &audio->in_bytes); - atomic_add(payload[9], &audio->in_samples); - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (list_empty(&audio->in_queue)) { - spin_unlock_irqrestore(&audio->dsp_lock, flags); - pr_warn("%s unexpected ack from dsp\n", __func__); - return; - } - filled_buf = list_first_entry(&audio->in_queue, - struct audio_aio_buffer_node, list); - - pr_debug("%s token: 0x[%x], filled_buf->token: 0x[%x]", - __func__, token, filled_buf->token); - if (token == (filled_buf->token)) { - list_del(&filled_buf->list); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - event_payload.aio_buf = filled_buf->buf; - /* Read done Buffer due to flush/normal condition - * after EOS event, so append EOS buffer - */ - if (audio->eos_rsp == 0x1) { - event_payload.aio_buf.data_len = - insert_eos_buf(audio, filled_buf); - /* Reset flag back to indicate eos intimated */ - audio->eos_rsp = 0; - } else { - filled_buf->meta_info.meta_out.num_of_frames - = payload[9]; - event_payload.aio_buf.data_len = payload[4] - + payload[5] + sizeof(struct dec_meta_out); - pr_debug("%s[%pK]:nr of frames 0x%8x len=%d\n", - __func__, audio, - filled_buf->meta_info.meta_out.num_of_frames, - event_payload.aio_buf.data_len); - ret = extract_meta_out_info(audio, filled_buf, 0); - audio->eos_rsp = 0; - } - pr_debug("%s, posting read done to the app here\n", __func__); - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(filled_buf); - } else { - pr_err("%s[%pK]:expected=%x ret=%x\n", - __func__, audio, filled_buf->token, token); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } -} diff --git a/techpack/audio/dsp/codecs/qcelp_in.c b/techpack/audio/dsp/codecs/qcelp_in.c deleted file mode 100644 index be09ea4a0508..000000000000 --- a/techpack/audio/dsp/codecs/qcelp_in.c +++ /dev/null @@ -1,413 +0,0 @@ -/* Copyright (c) 2010-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -/* Buffer with meta*/ -#define PCM_BUF_SIZE (4096 + sizeof(struct meta_in)) - -/* Maximum 10 frames in buffer with meta */ -#define FRAME_SIZE (1 + ((35+sizeof(struct meta_out_dsp)) * 10)) - -static long qcelp_in_ioctl_shared(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - int cnt = 0; - - switch (cmd) { - case AUDIO_START: { - struct msm_audio_qcelp_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, - audio->ac->session, audio->buf_alloc); - if (audio->enabled == 1) { - pr_info("%s:AUDIO_START already over\n", __func__); - rc = 0; - break; - } - rc = audio_in_buf_alloc(audio); - if (rc < 0) { - pr_err("%s:session id %d: buffer allocation failed\n", - __func__, audio->ac->session); - break; - } - - /* reduced_rate_level, rate_modulation_cmd set to zero - * currently not configurable from user space - */ - rc = q6asm_enc_cfg_blk_qcelp(audio->ac, - audio->buf_cfg.frames_per_buf, - enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate, 0, 0); - - if (rc < 0) { - pr_err("%s:session id %d: cmd qcelp media format block failed\n", - __func__, audio->ac->session); - break; - } - if (audio->feedback == NON_TUNNEL_MODE) { - rc = q6asm_media_format_block_pcm(audio->ac, - audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - - if (rc < 0) { - pr_err("%s:session id %d: media format block failed\n", - __func__, audio->ac->session); - break; - } - } - pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", __func__, - audio->ac->session, audio->enabled); - rc = audio_in_enable(audio); - if (!rc) { - audio->enabled = 1; - } else { - audio->enabled = 0; - pr_err("%s:session id %d: Audio Start procedure failed rc=%d\n", - __func__, audio->ac->session, rc); - break; - } - while (cnt++ < audio->str_cfg.buffer_count) - q6asm_read(audio->ac); /* Push buffer to DSP */ - rc = 0; - pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", - __func__, audio->ac->session, audio->enabled); - break; - } - case AUDIO_STOP: { - pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, - audio->ac->session); - rc = audio_in_disable(audio); - if (rc < 0) { - pr_err("%s:session id %d: Audio Stop procedure failed rc=%d\n", - __func__, audio->ac->session, - rc); - break; - } - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG: { - struct msm_audio_qcelp_enc_config *cfg; - struct msm_audio_qcelp_enc_config *enc_cfg; - - enc_cfg = audio->enc_cfg; - cfg = (struct msm_audio_qcelp_enc_config *)arg; - if (cfg == NULL) { - pr_err("%s: NULL config pointer\n", __func__); - rc = -EINVAL; - break; - } - if (cfg->min_bit_rate > 4 || - cfg->min_bit_rate < 1) { - pr_err("%s:session id %d: invalid min bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - if (cfg->max_bit_rate > 4 || - cfg->max_bit_rate < 1) { - pr_err("%s:session id %d: invalid max bitrate\n", - __func__, audio->ac->session); - rc = -EINVAL; - break; - } - enc_cfg->cdma_rate = cfg->cdma_rate; - enc_cfg->min_bit_rate = cfg->min_bit_rate; - enc_cfg->max_bit_rate = cfg->max_bit_rate; - pr_debug("%s:session id %d: min_bit_rate= 0x%x max_bit_rate=0x%x\n", - __func__, - audio->ac->session, enc_cfg->min_bit_rate, - enc_cfg->max_bit_rate); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -static long qcelp_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = qcelp_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_QCELP_ENC_CONFIG: { - if (copy_to_user((void *)arg, audio->enc_cfg, - sizeof(struct msm_audio_qcelp_enc_config))) { - pr_err( - "%s: copy_to_user for AUDIO_GET_QCELP_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - } - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG: { - struct msm_audio_qcelp_enc_config cfg; - - if (copy_from_user(&cfg, (void *) arg, - sizeof(cfg))) { - pr_err( - "%s: copy_from_user for AUDIO_SET_QCELP_ENC_CONFIG failed", - __func__); - rc = -EFAULT; - break; - } - rc = qcelp_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_QCELP_ENC_CONFIG failed. Rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} - -#ifdef CONFIG_COMPAT -struct msm_audio_qcelp_enc_config32 { - u32 cdma_rate; - u32 min_bit_rate; - u32 max_bit_rate; -}; - -enum { - AUDIO_SET_QCELP_ENC_CONFIG_32 = _IOW(AUDIO_IOCTL_MAGIC, - 0, struct msm_audio_qcelp_enc_config32), - AUDIO_GET_QCELP_ENC_CONFIG_32 = _IOR(AUDIO_IOCTL_MAGIC, - 1, struct msm_audio_qcelp_enc_config32) -}; - -static long qcelp_in_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6audio_in *audio = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_START: - case AUDIO_STOP: { - rc = qcelp_in_ioctl_shared(file, cmd, arg); - break; - } - case AUDIO_GET_QCELP_ENC_CONFIG_32: { - struct msm_audio_qcelp_enc_config32 cfg_32; - struct msm_audio_qcelp_enc_config *enc_cfg; - - memset(&cfg_32, 0, sizeof(cfg_32)); - - enc_cfg = (struct msm_audio_qcelp_enc_config *)audio->enc_cfg; - cfg_32.cdma_rate = enc_cfg->cdma_rate; - cfg_32.min_bit_rate = enc_cfg->min_bit_rate; - cfg_32.max_bit_rate = enc_cfg->max_bit_rate; - if (copy_to_user((void *)arg, &cfg_32, - sizeof(cfg_32))) { - pr_err("%s: copy_to_user for AUDIO_GET_QCELP_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; -} - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG_32: { - struct msm_audio_qcelp_enc_config32 cfg_32; - struct msm_audio_qcelp_enc_config cfg; - - if (copy_from_user(&cfg_32, (void *) arg, - sizeof(cfg_32))) { - pr_err("%s: copy_from_user for AUDIO_SET_QCELP_ENC_CONFIG_32 failed\n", - __func__); - rc = -EFAULT; - break; - } - cfg.cdma_rate = cfg_32.cdma_rate; - cfg.min_bit_rate = cfg_32.min_bit_rate; - cfg.max_bit_rate = cfg_32.max_bit_rate; - cmd = AUDIO_SET_QCELP_ENC_CONFIG; - rc = qcelp_in_ioctl_shared(file, cmd, (unsigned long)&cfg); - if (rc) - pr_err("%s:AUDIO_SET_QCELP_ENC_CONFIG failed. rc= %d\n", - __func__, rc); - break; - } - default: - pr_err("%s: Unknown ioctl cmd = %d", __func__, cmd); - rc = -EINVAL; - } - return rc; -} -#else -#define qcelp_in_compat_ioctl NULL -#endif - -static int qcelp_in_open(struct inode *inode, struct file *file) -{ - struct q6audio_in *audio = NULL; - struct msm_audio_qcelp_enc_config *enc_cfg; - int rc = 0; - - audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); - - if (audio == NULL) - return -ENOMEM; - - /* Allocate memory for encoder config param */ - audio->enc_cfg = kzalloc(sizeof(struct msm_audio_qcelp_enc_config), - GFP_KERNEL); - if (audio->enc_cfg == NULL) { - kfree(audio); - return -ENOMEM; - } - enc_cfg = audio->enc_cfg; - - mutex_init(&audio->lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->write_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->write_wait); - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->str_cfg.buffer_size = FRAME_SIZE; - audio->str_cfg.buffer_count = FRAME_NUM; - audio->min_frame_size = 35; - audio->max_frames_per_buf = 10; - audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; - audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; - enc_cfg->min_bit_rate = 4; - enc_cfg->max_bit_rate = 4; - audio->pcm_cfg.channel_count = 1; - audio->pcm_cfg.sample_rate = 8000; - audio->buf_cfg.meta_info_enable = 0x01; - audio->buf_cfg.frames_per_buf = 0x01; - audio->event_abort = 0; - - audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, - (void *)audio); - - if (!audio->ac) { - pr_err("%s: Could not allocate memory for audio client\n", - __func__); - kfree(audio->enc_cfg); - kfree(audio); - return -ENOMEM; - } - - /* open qcelp encoder in T/NT mode */ - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = NON_TUNNEL_MODE; - rc = q6asm_open_read_write(audio->ac, FORMAT_V13K, - FORMAT_LINEAR_PCM); - if (rc < 0) { - pr_err("%s:session id %d: NT mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: NT mode encoder success\n", __func__, - audio->ac->session); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->feedback = TUNNEL_MODE; - rc = q6asm_open_read(audio->ac, FORMAT_V13K); - if (rc < 0) { - pr_err("%s:session id %d: T mode Open failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - /* register for tx overflow (valid for tunnel mode only) */ - rc = q6asm_reg_tx_overflow(audio->ac, 0x01); - if (rc < 0) { - pr_err("%s:session id %d: TX Overflow registration failed rc=%d\n", - __func__, audio->ac->session, rc); - rc = -ENODEV; - goto fail; - } - pr_info("%s:session id %d: T mode encoder success\n", __func__, - audio->ac->session); - } else { - pr_err("%s:session id %d: Unexpected mode\n", __func__, - audio->ac->session); - rc = -EACCES; - goto fail; - } - - audio->opened = 1; - audio->reset_event = false; - atomic_set(&audio->in_count, PCM_BUF_COUNT); - atomic_set(&audio->out_count, 0x00); - audio->enc_compat_ioctl = qcelp_in_compat_ioctl; - audio->enc_ioctl = qcelp_in_ioctl; - file->private_data = audio; - - pr_info("%s:session id %d: success\n", __func__, audio->ac->session); - return 0; -fail: - q6asm_audio_client_free(audio->ac); - kfree(audio->enc_cfg); - kfree(audio); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = qcelp_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, - .compat_ioctl = audio_in_compat_ioctl -}; - -struct miscdevice audio_qcelp_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp_in", - .fops = &audio_in_fops, -}; - -int __init qcelp_in_init(void) -{ - return misc_register(&audio_qcelp_in_misc); -} - -void qcelp_in_exit(void) -{ - misc_deregister(&audio_qcelp_in_misc); -} diff --git a/techpack/audio/dsp/elliptic/Makefile b/techpack/audio/dsp/elliptic/Makefile deleted file mode 100644 index fa19751f5f0d..000000000000 --- a/techpack/audio/dsp/elliptic/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -ccflags-y := -I$(src) -Wall -Werror -IO_MODULE := msm - -# EXTRA_CFLAGS += -DDEBUG - -# Need to add include paths: -LINUXINCLUDE += \ - -I$(srctree)techpack/audio/include/dsp \ - -I$(srctree)techpack/audio/include/uapi \ - -I$(srctree)techpack/aduio/include - -obj-y += elliptic.o -obj-y += elliptic_mixer_controls.o -obj-y += io_modules/$(IO_MODULE)/elliptic_data_$(IO_MODULE)_io.o -obj-y += io_modules/userspace/elliptic_data_userspace_io.o -obj-y += io_modules/userspace/elliptic_data_userspace_ctrl.o -obj-y += elliptic_sysfs.o - -# elliptic_driver-y := elliptic.o -# elliptic_driver-y += io_modules/$(IO_MODULE)/elliptic_data_io.o -# elliptic_driver-y += mixer_controls/$(MIXER_MODULE)/elliptic_mixer_controls.o -# elliptic_driver-y += elliptic_sysfs.o - -# .PHONY: clean -# all: -# make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules -# clean: -# rm *.o *.ko diff --git a/techpack/audio/dsp/elliptic/elliptic.c b/techpack/audio/dsp/elliptic/elliptic.c deleted file mode 100755 index 4d018c1b8abc..000000000000 --- a/techpack/audio/dsp/elliptic/elliptic.c +++ /dev/null @@ -1,800 +0,0 @@ -/** -* Copyright Elliptic Labs -* Copyright (C) 2019 XiaoMi, Inc. -* -*/ -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - - -/* Alternative mechanism to load calibration data. -* Read calibration data during driver initialization -* and send message to the DSP -* -* #define ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM 1 -*/ -#ifdef ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM -#include -#include -#include -#endif - -static struct elliptic_device *elliptic_devices; - -/* Global variable for the device class*/ -struct class *elliptic_class; - -typedef uint32_t el_fifo_size_t; - -/* Major number provided by the kernel*/ -static dev_t elliptic_major; - -static struct wakeup_source *wake_source; - - -void elliptic_data_cancel(struct elliptic_data *elliptic_data) -{ - atomic_set(&elliptic_data->abort_io, 1); - wake_up_interruptible(&elliptic_data->fifo_isr_not_empty); -} - -void elliptic_data_reset_debug_counters(struct elliptic_data *elliptic_data) -{ - elliptic_data->isr_fifo_discard = 0; -} - -void elliptic_data_print_debug_counters(struct elliptic_data *elliptic_data) -{ - if (elliptic_data->isr_fifo_discard > 0) { - EL_PRINT_E("isr fifo discarded %u frames", - elliptic_data->isr_fifo_discard); - } - - if (elliptic_data->userspace_read_total != - elliptic_data->isr_write_total) { - EL_PRINT_I("user space reads / isr writes : %u / %u", - elliptic_data->userspace_read_total, - elliptic_data->isr_write_total); - } - - EL_PRINT_I("total isr fifo discarded frame count : %u", - elliptic_data->isr_fifo_discard_total); -} - -void elliptic_data_update_debug_counters(struct elliptic_data - *elliptic_data) -{ - elliptic_data->isr_fifo_discard_total += - elliptic_data->isr_fifo_discard; -} - - -/* spin lock for isr must be held prior to calling */ -static void elliptic_data_flush_isr_fifo(struct elliptic_data - *elliptic_data) -{ - kfifo_reset(&elliptic_data->fifo_isr); -} - -/* spin lock for isr must be held prior to calling */ -static void elliptic_data_isr_fifo_pop(struct elliptic_data - *elliptic_data, size_t size) -{ - unsigned int fifo_result; - static uint8_t temp_buffer[ELLIPTIC_MSG_BUF_SIZE]; - - if (size > ELLIPTIC_MSG_BUF_SIZE) - EL_PRINT_E("pop size %zu too large", size); - - fifo_result = kfifo_out(&elliptic_data->fifo_isr, - temp_buffer, size); - - if (size != fifo_result) - EL_PRINT_E("failed to pop element"); -} - - -int elliptic_notify_gain_change_msg(int component_id, int gaindb) -{ - int32_t msg[3] = {ESCPT_COMPONENT_GAIN_CHANGE, component_id, gaindb}; - - return elliptic_data_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -/* inode refers to the actual file on disk */ -static int device_open(struct inode *inode, struct file *filp) -{ - unsigned int major; - unsigned int minor; - struct elliptic_device *dev; - struct elliptic_data *elliptic_data; - - major = imajor(inode); - minor = iminor(inode); - - if (major != elliptic_major || minor < 0 - || minor >= ELLIPTIC_NUM_DEVICES) { - EL_PRINT_W("no device found with minor=%d and major=%d", - major, minor); - return -ENODEV; /* No such device */ - } - - dev = NULL; - dev = &elliptic_devices[minor]; - filp->private_data = dev; - - if (inode->i_cdev != &dev->cdev) { - EL_PRINT_W("dev pointer mismatch"); - return -ENODEV; /* No such device */ - } - - if (down_interruptible(&dev->sem) != 0) { - EL_PRINT_E("the device has been opened, unable to open lock"); - return -EINVAL; - } - - elliptic_data = &dev->el_data; - spin_lock(&elliptic_data->fifo_isr_spinlock); - elliptic_data_flush_isr_fifo(elliptic_data); - spin_unlock(&elliptic_data->fifo_isr_spinlock); - - atomic_set(&elliptic_data->abort_io, 0); - elliptic_data_reset_debug_counters(elliptic_data); - - EL_PRINT_I("Opened device elliptic%u", minor); - dev->opened = 1; - return 0; -} - - -int elliptic_data_initialize(struct elliptic_data - *elliptic_data, size_t queue_size, - unsigned int wakeup_timeout, int id) -{ - int is_power_of_two; - - is_power_of_two = (queue_size != 0) && !(queue_size & (queue_size - 1)); - - if (is_power_of_two != 1) { - EL_PRINT_E("non power of 2 fifo size"); - return -EINVAL; - } - - if (kfifo_alloc(&elliptic_data->fifo_isr, - queue_size, GFP_KERNEL) != 0) { - EL_PRINT_E("failed to allocate fifo isr"); - return -EINVAL; - } - - atomic_set(&elliptic_data->abort_io, 0); - spin_lock_init(&elliptic_data->fifo_isr_spinlock); - - elliptic_data->wakeup_timeout = wakeup_timeout; - - mutex_init(&elliptic_data->user_buffer_lock); - init_waitqueue_head(&elliptic_data->fifo_isr_not_empty); - - return 0; -} - -int elliptic_data_cleanup(struct elliptic_data *elliptic_data) -{ - spin_unlock(&elliptic_data->fifo_isr_spinlock); - kfifo_free(&elliptic_data->fifo_isr); - return 0; -} - -size_t elliptic_data_pop(struct elliptic_data - *elliptic_data, char __user *user_buffer, size_t buffer_size) -{ - int result; - unsigned long num_copied; - unsigned int fifo_result; - unsigned long flags; - - if (buffer_size < ELLIPTIC_MSG_BUF_SIZE) { - EL_PRINT_E("buffer_size : %lu smaller than %lu", - buffer_size, (size_t)ELLIPTIC_MSG_BUF_SIZE); - return 0; - } - - result = wait_event_interruptible(elliptic_data->fifo_isr_not_empty, - (kfifo_is_empty(&elliptic_data->fifo_isr) == 0) - || (atomic_read(&elliptic_data->abort_io) == 1)); - - if (atomic_read(&elliptic_data->abort_io) == 1) { - atomic_set(&elliptic_data->abort_io, 0); - EL_PRINT_D("pop cancelled"); - return 0; - } - - if (result == 0) { - spin_lock_irqsave(&elliptic_data->fifo_isr_spinlock, flags); - - fifo_result = kfifo_out(&elliptic_data->fifo_isr, - elliptic_data->isr_swap_buffer, ELLIPTIC_MSG_BUF_SIZE); - - spin_unlock_irqrestore(&elliptic_data->fifo_isr_spinlock, - flags); - - if (fifo_result == 0) { - EL_PRINT_E("failed to copy: fifo isr -> swap buffer %u", - fifo_result); - return 0; - } - - mutex_lock(&elliptic_data->user_buffer_lock); - - num_copied = copy_to_user(user_buffer, - elliptic_data->isr_swap_buffer, - ELLIPTIC_MSG_BUF_SIZE); - - mutex_unlock(&elliptic_data->user_buffer_lock); - - if (num_copied != 0) { - EL_PRINT_E("failed copy to user"); - return 0; - } - ++elliptic_data->userspace_read_total; - } else { - if (-ERESTARTSYS == result) - EL_PRINT_I("wait interrupted"); - else - EL_PRINT_E("wait error = %d", result); - - return 0; - } - - return (size_t)ELLIPTIC_MSG_BUF_SIZE; -} - - - -/* push data to specific device or all devices */ -int elliptic_data_push(int deviceid, - const char *buffer, - size_t buffer_size, - elliptic_data_push_t data_source) -{ - size_t available_space; - size_t space_required; - size_t zeros_to_pad; - unsigned int copied_from_user; - int copy_from_user_result; - int err; - int i; - int i_max; - - unsigned long flags; - struct elliptic_device *device; - struct elliptic_data *elliptic_data; - unsigned int fifo_result; - static uint8_t zero_pad_buffer[ELLIPTIC_MSG_BUF_SIZE]; - - err = 0; - fifo_result = 0; - copied_from_user = 0; - copy_from_user_result = 0; - if (buffer_size > ELLIPTIC_MSG_BUF_SIZE) - return -EINVAL; - - zeros_to_pad = ELLIPTIC_MSG_BUF_SIZE - buffer_size; - - i = 0; - i_max = ELLIPTIC_NUM_DEVICES; - - if (deviceid != ELLIPTIC_ALL_DEVICES) { - /* Copy to specific device */ - i = deviceid; - i_max = i + 1; - } - - for (; i < i_max; ++i) { - device = &elliptic_devices[i]; - elliptic_data = &device->el_data; - - if ((!device->opened)) - continue; - - available_space = kfifo_avail(&elliptic_data->fifo_isr); - space_required = ELLIPTIC_MSG_BUF_SIZE; - - spin_lock_irqsave(&elliptic_data->fifo_isr_spinlock, flags); - - if (available_space < space_required) { - - ++elliptic_data->isr_fifo_discard; - elliptic_data_isr_fifo_pop(elliptic_data, - ELLIPTIC_MSG_BUF_SIZE); - } - - if (data_source == ELLIPTIC_DATA_PUSH_FROM_KERNEL) { - fifo_result = kfifo_in(&elliptic_data->fifo_isr, - buffer, buffer_size); - - if (fifo_result == 0) { - spin_unlock_irqrestore( - &elliptic_data->fifo_isr_spinlock, - flags); - continue; - } - } else if (data_source == ELLIPTIC_DATA_PUSH_FROM_USERSPACE) { - copy_from_user_result = kfifo_from_user( - &elliptic_data->fifo_isr, buffer, - buffer_size, &copied_from_user); - - if (-EFAULT == copy_from_user_result) { - spin_unlock_irqrestore( - &elliptic_data->fifo_isr_spinlock, - flags); - continue; - } - } - - - if (zeros_to_pad > 0) { - fifo_result = kfifo_in( - &elliptic_data->fifo_isr, zero_pad_buffer, - zeros_to_pad); - - if (fifo_result == 0) { - elliptic_data_isr_fifo_pop(elliptic_data, - buffer_size); - - spin_unlock_irqrestore( - &elliptic_data->fifo_isr_spinlock, - flags); - - ++elliptic_data->isr_fifo_discard; - continue; - } - } - - - ++elliptic_data->isr_write_total; - spin_unlock_irqrestore( - &elliptic_data->fifo_isr_spinlock, flags); - wake_up_interruptible(&elliptic_data->fifo_isr_not_empty); - __pm_wakeup_event(wake_source, elliptic_data->wakeup_timeout); - } - - return err; -} - -int elliptic_open_port(int portid) -{ - return elliptic_io_open_port(portid); -} - -int elliptic_close_port(int portid) -{ - return elliptic_io_close_port(portid); -} - - -int32_t elliptic_data_write(uint32_t message_id, - const char *data, size_t data_size) -{ - int32_t err_dsp; - /* int32_t err_us; */ - - err_dsp = 0; - err_dsp = elliptic_data_io_write(message_id, data, data_size); - if (err_dsp) - EL_PRINT_E("Failed write to DSP"); - return err_dsp; - - /* - * err_us = 0; - * err_us = elliptic_userspace_ctrl_write(message_id, data, data_size); - * if(err_us){ - * EL_PRINT_E("Failed write to user space"); - *} - * - *return (err_dsp | err_us); - */ -} - - - -/** -* -* @return Number of bytes read. -*/ -static ssize_t device_read(struct file *fp, char __user *buff, - size_t length, loff_t *ppos) -{ - ssize_t bytes_read = 0; - struct elliptic_device *elliptic_device; - struct elliptic_data *elliptic_data; - - elliptic_device = (struct elliptic_device *)fp->private_data; - elliptic_data = (struct elliptic_data *)&elliptic_device->el_data; - - bytes_read = elliptic_data_pop(elliptic_data, buff, length); - - return bytes_read; -} - -/** -* -* @return number of bytes actually written -*/ -static ssize_t device_write(struct file *fp, const char *buff, - size_t length, loff_t *ppos) -{ - ssize_t ret_val; - - ret_val = 0; - if ((buff != NULL) && (length != 0)) - ret_val = elliptic_data_io_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - buff, length); - - return ret_val >= 0 ? (ssize_t)length : 0; -} - - -static long device_ioctl(struct file *fp, unsigned int number, - unsigned long param) -{ - struct elliptic_device *device; - struct elliptic_data *elliptic_data; - int err; - unsigned int mirror_tag, mirror_payload_size; - unsigned char *data_ptr; - - device = (struct elliptic_device *)(fp->private_data); - elliptic_data = &device->el_data; - - switch (number) { - case IOCTL_ELLIPTIC_DATA_IO_CANCEL: - EL_PRINT_D("IOCTL_ELLIPTIC_CANCEL_READ %ld", - param); - elliptic_data_cancel(elliptic_data); - break; - - case IOCTL_ELLIPTIC_DATA_IO_MIRROR: - data_ptr = (unsigned char *)param; - mirror_tag = *(unsigned int *)data_ptr; - mirror_payload_size = *((unsigned int *)data_ptr + 1); - - if ((mirror_tag == MIRROR_TAG) && - (mirror_payload_size != 0) && - (mirror_payload_size <= - (ELLIPTIC_SET_PARAMS_SIZE * 4))) { - - err = elliptic_data_io_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (data_ptr + 8), mirror_payload_size); - - if (err != 0) { - EL_PRINT_E("elliptic_data_io_write failed"); - return err; - } - - } else { - EL_PRINT_E("TAG or Length is not valid"); - } - - break; - - default: - EL_PRINT_W("UNKNOWN IOCTL number=%d", number); - break; - } - - return 0; -} - - -static unsigned int device_poll(struct file *file, - struct poll_table_struct *poll_table) -{ - unsigned int mask; - - struct elliptic_device *device; - struct elliptic_data *elliptic_data; - - mask = 0; - device = (struct elliptic_device *)file->private_data; - elliptic_data = (struct elliptic_data *)&device->el_data; - - poll_wait(file, &elliptic_data->fifo_isr_not_empty, poll_table); - - if (!kfifo_is_empty(&elliptic_data->fifo_isr)) - mask = POLLIN | POLLRDNORM; - - return mask; -} - - -static int device_close(struct inode *inode, struct file *filp) -{ - struct elliptic_device *device; - struct elliptic_data *elliptic_data; - unsigned int minor; - - device = filp->private_data; - elliptic_data = &device->el_data; - minor = iminor(inode); - if (device == NULL) { - EL_PRINT_E("device not found"); - return -ENODEV; - } - - device->opened = 0; - elliptic_data_update_debug_counters(elliptic_data); - elliptic_data_print_debug_counters(elliptic_data); - elliptic_data_cancel(elliptic_data); - up(&device->sem); - - EL_PRINT_I("Closed device elliptic%u", minor); - return 0; -} - -/* defines the file operations provided by the driver */ -static const struct file_operations elliptic_fops = { - .owner = THIS_MODULE, /* prevents unloading when operations are in use*/ - .open = device_open, /*to open the device*/ - .write = device_write, /*to write to the device*/ - .read = device_read, /*to read the device*/ - .poll = device_poll, - .unlocked_ioctl = device_ioctl, /* IOCTL calls */ - .release = device_close, /*to close the device*/ -}; - - -static int elliptic_device_initialize(struct elliptic_device - *elliptic_device, int minor, struct class *class) -{ - int err; - dev_t device_number; - struct device *device; - - BUG_ON(elliptic_device == NULL || class == NULL); - - err = 0; - device = NULL; - device_number = MKDEV(elliptic_major, minor); - /* Memory is to be allocated when the device is opened the first time */ - sema_init(&elliptic_device->sem, 1); - cdev_init(&elliptic_device->cdev, &elliptic_fops); - elliptic_device->cdev.owner = THIS_MODULE; - - err = cdev_add(&elliptic_device->cdev, device_number, 1); - - if (err) { - EL_PRINT_E("error %d while trying to add %s%d", - err, ELLIPTIC_DEVICENAME, minor); - return err; - } - - device = device_create(class, NULL, device_number, - NULL, ELLIPTIC_DEVICENAME "%d", minor); - - if (IS_ERR(device)) { - err = PTR_ERR(device); - EL_PRINT_E("error %d while trying to create %s%d", - err, ELLIPTIC_DEVICENAME, minor); - cdev_del(&elliptic_device->cdev); - return err; - } - - if (err) { - EL_PRINT_E("failed device initialize"); - return err; - } - - return 0; -} - -static void elliptic_device_cleanup(struct elliptic_device *dev, int minor, - struct class *class) - -{ - BUG_ON(dev == NULL || class == NULL); - device_destroy(class, MKDEV(elliptic_major, minor)); - cdev_del(&dev->cdev); - up(&dev->sem); -} - -static void elliptic_driver_cleanup(int devices_to_destroy) -{ - int i; - - if (elliptic_devices) { - elliptic_data_io_cleanup(); - - for (i = 0; i < devices_to_destroy; ++i) { - elliptic_data_cleanup(&elliptic_devices[i].el_data); - elliptic_device_cleanup( - &elliptic_devices[i], i, elliptic_class); - } - - kfree(elliptic_devices); - } - - if (elliptic_class) - class_destroy(elliptic_class); - - unregister_chrdev_region( - MKDEV(elliptic_major, 0), ELLIPTIC_NUM_DEVICES); -} - - - -#ifdef ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM - -#define ELLIPTIC_CALIBRATION_MAX_DATA_SIZE (ELLIPTIC_CALIBRATION_V2_DATA_SIZE + ELLIPTIC_CALIBRATION_DATA_SIZE) -static unsigned char calibration_data[ELLIPTIC_CALIBRATION_MAX_DATA_SIZE]; -static char *calibration_filename = "/persist/audio/elliptic_calibration"; - -/* function to load the calibration from a file (if possible) */ -static size_t load_calibration_data(char *filename) -{ - size_t ret = 0; - int fd; - - mm_segment_t old_fs = get_fs(); - - set_fs(KERNEL_DS); - - fd = sys_open(filename, O_RDONLY, 0); - if (fd >= 0) { - size_t bytes_read = sys_read(fd, calibration_data, ELLIPTIC_CALIBRATION_MAX_DATA_SIZE); - - if (bytes_read == ELLIPTIC_CALIBRATION_DATA_SIZE || - bytes_read == ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { - ret = bytes_read; - } - sys_close(fd); - } - set_fs(old_fs); - return ret; -} - -static int32_t elliptic_send_calibration_to_engine(size_t calib_data_size) -{ - elliptic_set_calibration_data(calibration_data, calib_data_size); - return elliptic_data_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)calibration_data, calib_data_size); -} - -#endif - - -int __init elliptic_driver_init(void) -{ - int err; - int i; - int devices_to_destroy; - dev_t device_number; - - err = alloc_chrdev_region(&device_number, 0, ELLIPTIC_NUM_DEVICES, - ELLIPTIC_DEVICENAME); - - devices_to_destroy = 0; - - if (err < 0) { - EL_PRINT_E("Failed to allocate cdev region"); - return err; - } - - elliptic_major = MAJOR(device_number); - elliptic_class = class_create(THIS_MODULE, "chardev"); - - if (elliptic_class == NULL) { - EL_PRINT_E("Class creation failed"); - goto fail; - } - - err = elliptic_initialize_sysfs(); - - if (err) - goto fail; - - elliptic_devices = (struct elliptic_device *) - kzalloc(sizeof(struct elliptic_device) * ELLIPTIC_NUM_DEVICES, - GFP_KERNEL); - - if (elliptic_devices == NULL) { - err = -ENOMEM; - goto fail; - } - - - for (i = 0; i < ELLIPTIC_NUM_DEVICES; ++i) { - if (elliptic_device_initialize(&elliptic_devices[i], i, - elliptic_class)) { - devices_to_destroy = i; - goto fail; - } - - if (elliptic_data_initialize(&elliptic_devices[i].el_data, - ELLIPTIC_DATA_FIFO_SIZE, ELLIPTIC_WAKEUP_TIMEOUT, i)) { - goto fail; - } - } - - if (elliptic_data_io_initialize()) - goto fail; - - if (elliptic_userspace_io_driver_init()) - goto fail; - - - if (elliptic_userspace_ctrl_driver_init()) - goto fail; - - wake_source = kmalloc(sizeof(struct wakeup_source), GFP_KERNEL); - - if (!wake_source) { - EL_PRINT_E("failed to allocate wake source"); - return -ENOMEM; - } - - wakeup_source_init(wake_source, "elliptic_wake_source"); - -#ifdef ELLIPTIC_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM - /* Code to send calibration to engine */ - { - size_t calib_data_size = load_calibration_data(calibration_filename); - if (calib_data_size > 0) - elliptic_send_calibration_to_engine(calib_data_size); - } -#endif - return 0; - -fail: - elliptic_driver_cleanup(devices_to_destroy); - return err; -} - -void elliptic_driver_exit(void) -{ - if (wake_source) { - wakeup_source_trash(wake_source); - kfree(wake_source); - } - - elliptic_cleanup_sysfs(); - elliptic_driver_cleanup(ELLIPTIC_NUM_DEVICES); - elliptic_userspace_io_driver_exit(); - elliptic_userspace_ctrl_driver_exit(); -} - -MODULE_AUTHOR("Elliptic Labs"); -MODULE_DESCRIPTION("Providing Interface to UPS data"); -MODULE_LICENSE("GPL"); diff --git a/techpack/audio/dsp/elliptic/elliptic_mixer_controls.c b/techpack/audio/dsp/elliptic/elliptic_mixer_controls.c deleted file mode 100755 index 5b4afd2b0560..000000000000 --- a/techpack/audio/dsp/elliptic/elliptic_mixer_controls.c +++ /dev/null @@ -1,1339 +0,0 @@ -/** - * Elliptic Labs - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -struct elliptic_system_configuration { - union { - uint8_t reserved[ELLIPTIC_SYSTEM_CONFIGURATION_SIZE]; - }; -}; - -struct elliptic_system_configuration elliptic_system_configuration; - - -struct elliptic_system_configuration_parameter { - enum elliptic_system_configuration_parameter_type type; - union { - int32_t speaker_scaling[2]; - int32_t sensitivity; - int32_t latency; - int32_t microphone_index; - int32_t operation_mode; - int32_t operation_mode_flags; - int32_t component_gain_change; - int32_t calibration_state; - int32_t engine_version; - int32_t calibration_profile; - int32_t ultrasound_gain; - int32_t log_level; - int32_t custom_setting; - int32_t engine_suspend; - int32_t input_enabled; - int32_t output_enabled; - int32_t external_event; - struct { - int32_t calibration_method; - int32_t calibration_timestamp; - }; - int32_t debug_mode; - int32_t context; - int32_t capture; - int32_t input_channels; - }; -}; - -struct elliptic_system_configuration_parameters_cache - elliptic_system_configuration_cache = { {0}, 0 }; - -static struct elliptic_engine_version_info - elliptic_engine_version_cache = { 0xde, 0xad, 0xbe, 0xef }; - -struct elliptic_engine_calibration_data { - union { - uint8_t reserved[ELLIPTIC_CALIBRATION_DATA_SIZE]; - }; -}; - -static struct elliptic_engine_calibration_data - elliptic_engine_calibration_data_cache = { .reserved = { - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef } }; - -struct elliptic_engine_calibration_v2_data { - union { - uint8_t reserved[ELLIPTIC_CALIBRATION_V2_DATA_SIZE]; - }; -}; - -static struct elliptic_engine_calibration_v2_data - elliptic_engine_calibration_v2_data_cache = { .reserved = { - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -} }; - -struct elliptic_engine_diagnostics_data { - union { - uint8_t reserved[ELLIPTIC_DIAGNOSTICS_DATA_SIZE]; - uint32_t values32[ELLIPTIC_DIAGNOSTICS_DATA_SIZE >> 2]; - }; -}; - -static struct elliptic_engine_diagnostics_data - elliptic_engine_diagnostics_data_cache = { .reserved = {0} }; - -struct elliptic_engine_ml_data { - union { - uint8_t reserved[ELLIPTIC_ML_DATA_SIZE]; - uint32_t u32[ELLIPTIC_ML_DATA_SIZE >> 2]; - }; -}; - -static struct elliptic_engine_ml_data - elliptic_engine_ml_data_cache - = { .reserved = {0} }; - -struct elliptic_engine_sensor_data { - union { - uint8_t reserved[ELLIPTIC_SENSOR_DATA_SIZE]; - uint32_t values32[ELLIPTIC_SENSOR_DATA_SIZE >> 2]; - }; -}; - -static struct elliptic_engine_sensor_data - elliptic_engine_sensor_data_cache = { .reserved = {0} }; - -struct elliptic_engine_branch_info { - char build_branch[ELLIPTIC_BRANCH_INFO_MAX_SIZE]; -}; - -static struct elliptic_engine_branch_info - elliptic_engine_branch_cache = { { 0 } }; - -struct elliptic_engine_tag_info { - char engine_tag[ELLIPTIC_TAG_INFO_SIZE]; -}; - -static struct elliptic_engine_tag_info - elliptic_engine_tag_cache = { { 0 } }; - -static struct elliptic_shared_data_block shared_data_blocks[] = { - { ELLIPTIC_OBJ_ID_CALIBRATION_DATA, ELLIPTIC_CALIBRATION_DATA_SIZE, - &elliptic_engine_calibration_data_cache }, - - { ELLIPTIC_OBJ_ID_VERSION_INFO, ELLIPTIC_VERSION_INFO_SIZE, - &elliptic_engine_version_cache }, - { ELLIPTIC_OBJ_ID_BRANCH_INFO, ELLIPTIC_BRANCH_INFO_MAX_SIZE, - &elliptic_engine_branch_cache }, - { ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA, - ELLIPTIC_CALIBRATION_V2_DATA_SIZE, - &elliptic_engine_calibration_v2_data_cache }, - { ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA, ELLIPTIC_DIAGNOSTICS_DATA_SIZE, - &elliptic_engine_diagnostics_data_cache }, - { ELLIPTIC_OBJ_ID_TAG_INFO, ELLIPTIC_TAG_INFO_SIZE, - &elliptic_engine_tag_cache }, - { ELLIPTIC_OBJ_ID_ML_DATA, - ELLIPTIC_ML_DATA_SIZE, - &elliptic_engine_ml_data_cache }, -}; - -void elliptic_set_calibration_data(uint8_t *calib_data, size_t size) -{ - struct elliptic_shared_data_block *calibration_obj = NULL; - - if (size == ELLIPTIC_CALIBRATION_DATA_SIZE) { - calibration_obj = elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_CALIBRATION_DATA); - memcpy((uint8_t *)&elliptic_engine_calibration_data_cache, - calib_data, size); - } - if (size == ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { - calibration_obj = elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); - memcpy((uint8_t *)&elliptic_engine_calibration_v2_data_cache, - calib_data, size); - } - if (calibration_obj == NULL) { - EL_PRINT_E( - "ell..set_calibration_data() calib=NULL (%zu)", size); - return; - } - memcpy((u8 *)calibration_obj->buffer, calib_data, size); -} - -void elliptic_set_diagnostics_data(uint8_t *diag_data, size_t size) -{ - struct elliptic_shared_data_block *diagnostics_obj = NULL; - - if (size <= ELLIPTIC_DIAGNOSTICS_DATA_SIZE) { - diagnostics_obj = - elliptic_get_shared_obj( - ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); - if (diagnostics_obj == NULL) { - EL_PRINT_E("el..set_diagnostics_data() NULL (%zu)", - size); - return; - } - memcpy((uint8_t *)&elliptic_engine_diagnostics_data_cache, - diag_data, size); - memcpy((u8 *)diagnostics_obj->buffer, diag_data, size); - } -} - -static const size_t NUM_SHARED_RW_OBJS = - sizeof(shared_data_blocks) / sizeof(struct elliptic_shared_data_block); - -struct elliptic_shared_data_block *elliptic_get_shared_obj(uint32_t - object_id) { - - size_t i; - - for (i = 0; i < NUM_SHARED_RW_OBJS; ++i) { - if (shared_data_blocks[i].object_id == object_id) - return &shared_data_blocks[i]; - } - - return NULL; -} - - -static const char * const ultrasound_enable_texts[] = {"Off", "On"}; - -static const struct soc_enum elliptic_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ultrasound_enable_texts), - ultrasound_enable_texts), -}; - -int get_elliptic_calibration_data(uint8_t *caldata, uint32_t max_size) -{ - uint32_t copied; - - copied = ELLIPTIC_CALIBRATION_DATA_SIZE; - if (max_size < ELLIPTIC_CALIBRATION_DATA_SIZE) { - copied = max_size; - EL_PRINT_D("size mismatch : %u vs %u", - (uint32_t)ELLIPTIC_CALIBRATION_DATA_SIZE, max_size); - } - - memcpy(caldata, (uint8_t *)&elliptic_engine_calibration_data_cache, - max_size); - return copied; -} - -int get_elliptic_calibration_v2_data(uint8_t *caldata, uint32_t max_size) -{ - uint32_t copied; - - copied = ELLIPTIC_CALIBRATION_V2_DATA_SIZE; - if (max_size < ELLIPTIC_CALIBRATION_V2_DATA_SIZE) { - copied = max_size; - EL_PRINT_D("size mismatch : %u vs %u", - (uint32_t)ELLIPTIC_CALIBRATION_V2_DATA_SIZE, max_size); - } - - memcpy(caldata, (uint8_t *)&elliptic_engine_calibration_v2_data_cache, - max_size); - return copied; -} - -int get_elliptic_diagnostics_data(uint8_t *diagdata, uint32_t max_size) -{ - uint32_t copied; - - copied = ELLIPTIC_DIAGNOSTICS_DATA_SIZE; - if (max_size < ELLIPTIC_DIAGNOSTICS_DATA_SIZE) { - copied = max_size; - EL_PRINT_D("size mismatch : %u vs %u", - (uint32_t)ELLIPTIC_DIAGNOSTICS_DATA_SIZE, max_size); - } - - memcpy(diagdata, (uint8_t *)&elliptic_engine_diagnostics_data_cache, - max_size); - return copied; -} - - -static uint32_t ultrasound_enable_cache; - -int elliptic_ultrasound_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = ultrasound_enable_cache; - return 0; -} - -int elliptic_ultrasound_enable_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - static bool triggered_engine_info; - int32_t msg[4] = {0, 0, 0, 0}; - - ultrasound_enable_cache = ucontrol->value.integer.value[0]; - - if (!triggered_engine_info && ultrasound_enable_cache) { - triggered_engine_info = true; - elliptic_trigger_version_msg(); - elliptic_trigger_branch_msg(); - elliptic_trigger_tag_msg(); - } - - msg[0] = ultrasound_enable_cache ? 1 : 0; - - return elliptic_data_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -static uint32_t ultrasound_tx_port_cache; - -int elliptic_ultrasound_tx_port_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = ultrasound_tx_port_cache; - return 0; -} - -int elliptic_ultrasound_tx_port_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret; - - if (ultrasound_tx_port_cache == ucontrol->value.integer.value[0]) { - EL_PRINT_E("ultrasound_tx_port_set: ignoring duplicate request"); - return 0; - } - - ultrasound_tx_port_cache = ucontrol->value.integer.value[0]; - if (ultrasound_tx_port_cache) - ret = elliptic_open_port(ULTRASOUND_TX_PORT_ID); - else - ret = elliptic_close_port(ULTRASOUND_TX_PORT_ID); - - EL_PRINT_E("ultrasound_tx_port: enable=%d ret=%d", - ultrasound_tx_port_cache, ret); - - return ret; -} - -static uint32_t ultrasound_rx_port_cache; - -int elliptic_ultrasound_rx_port_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = ultrasound_rx_port_cache; - return 0; -} - -int elliptic_ultrasound_rx_port_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret; - - if (ultrasound_rx_port_cache == ucontrol->value.integer.value[0]) { - EL_PRINT_E("ultrasound_rx_port_set: ignoring duplicate request"); - return 0; - } - - ultrasound_rx_port_cache = ucontrol->value.integer.value[0]; - if (ultrasound_rx_port_cache) - ret = elliptic_open_port(ULTRASOUND_RX_PORT_ID); - else - ret = elliptic_close_port(ULTRASOUND_RX_PORT_ID); - - EL_PRINT_E("ultrasound_rx_port: enable=%d ret=%d", - ultrasound_tx_port_cache, ret); - - return 0; -} - -int elliptic_ultrasound_rampdown_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* Rampdown is a strobe, so always return Off */ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -int elliptic_ultrasound_rampdown_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t msg[4] = {-1, 0, 0, 0}; - - if (ucontrol->value.integer.value[0] == 0) - return 0; - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int elliptic_ultrasound_diagnostics_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* Diagnostics is a strobe, so always return Off */ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -int elliptic_ultrasound_request_diagnostics(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t msg[3] = {ESCPT_ENGINE_DIAGNOSTICS, 0, 0}; - - if (ucontrol->value.integer.value[0] == 0) - return 0; - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int elliptic_system_configuration_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &elliptic_system_configuration, - ELLIPTIC_SYSTEM_CONFIGURATION_SIZE); - return 0; -} - -int elliptic_system_configuration_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&elliptic_system_configuration, ucontrol->value.bytes.data, - ELLIPTIC_SYSTEM_CONFIGURATION_SIZE); - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)&elliptic_system_configuration, - ELLIPTIC_SYSTEM_CONFIGURATION_SIZE); -} - -int elliptic_calibration_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, - &elliptic_engine_calibration_data_cache, - ELLIPTIC_CALIBRATION_DATA_SIZE); - return 0; -} - -int elliptic_calibration_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&elliptic_engine_calibration_data_cache, - ucontrol->value.bytes.data, ELLIPTIC_CALIBRATION_DATA_SIZE); - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)&elliptic_engine_calibration_data_cache, - ELLIPTIC_CALIBRATION_DATA_SIZE); -} - -int elliptic_calibration_v2_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct elliptic_shared_data_block *calibration_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); - - if (calibration_obj == NULL) { - EL_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - memcpy(ucontrol->value.bytes.data, - calibration_obj->buffer, - ELLIPTIC_CALIBRATION_V2_DATA_SIZE); - return 0; -} - -int elliptic_calibration_v2_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&elliptic_engine_calibration_v2_data_cache, - ucontrol->value.bytes.data, ELLIPTIC_CALIBRATION_V2_DATA_SIZE); - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)&elliptic_engine_calibration_v2_data_cache, - ELLIPTIC_CALIBRATION_V2_DATA_SIZE); -} - -int elliptic_diagnostics_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, - &elliptic_engine_diagnostics_data_cache, - ELLIPTIC_DIAGNOSTICS_DATA_SIZE); - return 0; -} - -int elliptic_diagnostics_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int elliptic_ml_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct elliptic_shared_data_block *ml_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_ML_DATA); - - if (ml_obj == NULL) { - EL_PRINT_E("ml_obj is NULL"); - return -EINVAL; - } - - memcpy(ucontrol->value.bytes.data, - ml_obj->buffer, - ELLIPTIC_ML_DATA_SIZE); - return 0; -} - -int elliptic_ml_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)ucontrol->value.bytes.data, - ELLIPTIC_ML_DATA_SIZE); -} - -int elliptic_sensor_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, - &elliptic_engine_sensor_data_cache, - ELLIPTIC_SENSOR_DATA_SIZE); - return 0; -} - -int elliptic_sensor_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&elliptic_engine_sensor_data_cache, - ucontrol->value.bytes.data, ELLIPTIC_SENSOR_DATA_SIZE); - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)&elliptic_engine_sensor_data_cache, - ELLIPTIC_SENSOR_DATA_SIZE); -} - -int elliptic_version_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &elliptic_engine_version_cache, - ELLIPTIC_VERSION_INFO_SIZE); - return 0; -} - -int elliptic_version_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int elliptic_branch_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &elliptic_engine_branch_cache, - ELLIPTIC_BRANCH_INFO_MAX_SIZE); - return 0; -} - -int elliptic_branch_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int elliptic_tag_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &elliptic_engine_tag_cache, - ELLIPTIC_TAG_INFO_SIZE); - return 0; -} - -int elliptic_tag_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int elliptic_calibration_param_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - if (mc->reg != ELLIPTIC_CALIBRATION) - return -EINVAL; - - switch (mc->shift) { - case ELLIPTIC_CALIBRATION_STATE: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.calibration_state; - break; - - case ELLIPTIC_CALIBRATION_PROFILE: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.calibration_profile; - break; - - case ELLIPTIC_ULTRASOUND_GAIN: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.ultrasound_gain; - break; - - default: - return -EINVAL; - } - - return 1; -} - -int elliptic_calibration_param_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct elliptic_system_configuration_parameter param; - - if (mc->reg != ELLIPTIC_CALIBRATION) - return -EINVAL; - - switch (mc->shift) { - case ELLIPTIC_CALIBRATION_STATE: - elliptic_system_configuration_cache.calibration_state = - ucontrol->value.integer.value[0]; - - param.type = ESCPT_CALIBRATION_STATE; - param.calibration_state = - elliptic_system_configuration_cache.calibration_state; - break; - - case ELLIPTIC_CALIBRATION_PROFILE: - elliptic_system_configuration_cache.calibration_profile = - ucontrol->value.integer.value[0]; - - param.type = ESCPT_CALIBRATION_PROFILE; - param.calibration_profile = - elliptic_system_configuration_cache.calibration_profile; - break; - - case ELLIPTIC_ULTRASOUND_GAIN: - elliptic_system_configuration_cache.ultrasound_gain = - ucontrol->value.integer.value[0]; - param.type = ESCPT_ULTRASOUND_GAIN; - param.ultrasound_gain = - elliptic_system_configuration_cache.ultrasound_gain; - break; - - default: - return -EINVAL; - } - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (u8 *)¶m, sizeof(param)); -} - -int elliptic_system_configuration_param_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - pr_err("%s: reg: %d shift: %d\n", __func__, mc->reg, mc->shift); - - if (mc->reg != ELLIPTIC_SYSTEM_CONFIGURATION) - return -EINVAL; - - if (mc->shift >= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && - mc->shift <= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ - EL_PRINT_E("get ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_%02d", - mc->shift - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0); - ucontrol->value.integer.value[0] = 0; - return 1; - } - - switch (mc->shift) { - case ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.latency; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.sensitivity; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.speaker_scaling[0]; - ucontrol->value.integer.value[1] = - elliptic_system_configuration_cache.speaker_scaling[1]; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.microphone_index; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.operation_mode; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.operation_mode_flags; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.log_level; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.engine_suspend; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.input_enabled; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.output_enabled; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.external_event; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.calibration_method; - case ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.debug_mode; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.context; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.capture; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS: - ucontrol->value.integer.value[0] = - elliptic_system_configuration_cache.input_channels; - break; - - default: - EL_PRINT_E("Invalid mixer control"); - return -EINVAL; - } - - return 1; -} - - - -int elliptic_system_configuration_param_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct elliptic_system_configuration_parameter param; - struct timeval tv; - - if (mc->reg != ELLIPTIC_SYSTEM_CONFIGURATION) - return -EINVAL; - - if (mc->shift >= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && - mc->shift <= ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ - const size_t csi = - mc->shift - - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0; - EL_PRINT_E("ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_XX csi:%zu", csi); - if (csi >= - ARRAY_SIZE(elliptic_system_configuration_cache.custom_settings)) - return -EINVAL; - EL_PRINT_E("ucontrol->value.integer.value[0]:%ld", ucontrol->value.integer.value[0]); - elliptic_system_configuration_cache.custom_settings[csi] = - ucontrol->value.integer.value[0]; - param.type = ESCPT_ENGINE_CUSTOM_SETTING_0 + csi; - param.custom_setting = ucontrol->value.integer.value[0]; - EL_PRINT_E("calling elliptic_data_write(custom_setting) csi:%zu", csi); - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)¶m, sizeof(param)); - } - - - switch (mc->shift) { - case ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY: - elliptic_system_configuration_cache.latency = - ucontrol->value.integer.value[0]; - param.type = ESCPT_LATENCY; - param.latency = elliptic_system_configuration_cache.latency; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY: - elliptic_system_configuration_cache.sensitivity = - ucontrol->value.integer.value[0]; - param.type = ESCPT_CHANNEL_SENSITIVITY; - param.sensitivity = - elliptic_system_configuration_cache.sensitivity; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING: - elliptic_system_configuration_cache.speaker_scaling[0] = - ucontrol->value.integer.value[0]; - elliptic_system_configuration_cache.speaker_scaling[1] = - ucontrol->value.integer.value[1]; - param.type = ESCPT_SPEAKER_SCALING; - param.speaker_scaling[0] = - elliptic_system_configuration_cache.speaker_scaling[0]; - param.speaker_scaling[1] = - elliptic_system_configuration_cache.speaker_scaling[1]; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: - elliptic_system_configuration_cache.microphone_index = - ucontrol->value.integer.value[0]; - param.type = ESCPT_MICROPHONE_INDEX; - param.microphone_index = - elliptic_system_configuration_cache.microphone_index; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE: - elliptic_system_configuration_cache.operation_mode = - ucontrol->value.integer.value[0]; - param.type = ESCPT_OPERATION_MODE; - param.operation_mode = - elliptic_system_configuration_cache.operation_mode; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: - elliptic_system_configuration_cache.operation_mode_flags = - ucontrol->value.integer.value[0]; - param.type = ESCPT_OPERATION_MODE_FLAGS; - param.operation_mode_flags = - elliptic_system_configuration_cache.operation_mode_flags; - break; - - case ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL: - elliptic_system_configuration_cache.log_level = - ucontrol->value.integer.value[0]; - param.type = ESCPT_LOG_LEVEL; - param.log_level = - elliptic_system_configuration_cache.log_level; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED: - elliptic_system_configuration_cache.input_enabled = - ucontrol->value.integer.value[0]; - param.type = ESCPT_INPUT_ENABLED; - param.input_enabled = - elliptic_system_configuration_cache.input_enabled; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: - elliptic_system_configuration_cache.output_enabled = - ucontrol->value.integer.value[0]; - param.type = ESCPT_OUTPUT_ENABLED; - param.output_enabled = - elliptic_system_configuration_cache.output_enabled; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND: - elliptic_system_configuration_cache.engine_suspend = - ucontrol->value.integer.value[0]; - param.type = ESCPT_SUSPEND; - param.engine_suspend = - elliptic_system_configuration_cache.engine_suspend; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: - elliptic_system_configuration_cache.external_event = - ucontrol->value.integer.value[0]; - param.type = ESCPT_EXTERNAL_EVENT; - param.external_event = - elliptic_system_configuration_cache.external_event; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: - elliptic_system_configuration_cache.calibration_method = - ucontrol->value.integer.value[0]; - param.type = ESCPT_CALIBRATION_METHOD; - param.calibration_method = - elliptic_system_configuration_cache.calibration_method; - do_gettimeofday(&tv); - param.calibration_timestamp = (int32_t)tv.tv_sec; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE: - elliptic_system_configuration_cache.debug_mode = - ucontrol->value.integer.value[0]; - param.type = ESCPT_DEBUG_MODE; - param.debug_mode = - elliptic_system_configuration_cache.debug_mode; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT: - elliptic_system_configuration_cache.context = - ucontrol->value.integer.value[0]; - param.type = ESCPT_CONTEXT; - param.context = - elliptic_system_configuration_cache.context; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE: - elliptic_system_configuration_cache.capture = - ucontrol->value.integer.value[0]; - param.type = ESCPT_CAPTURE; - param.context = - elliptic_system_configuration_cache.capture; - break; - case ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS: - elliptic_system_configuration_cache.input_channels = - ucontrol->value.integer.value[0]; - param.type = ESCPT_INPUT_CHANNELS; - param.context = - elliptic_system_configuration_cache.input_channels; - break; - - default: - return -EINVAL; - } - - return elliptic_data_write(ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)¶m, sizeof(param)); -} - - -static const struct snd_kcontrol_new ultrasound_filter_mixer_controls[] = { - SOC_ENUM_EXT("Ultrasound Enable", - elliptic_enum[0], - elliptic_ultrasound_enable_get, - elliptic_ultrasound_enable_set), - SOC_ENUM_EXT("Ultrasound RampDown", - elliptic_enum[0], - elliptic_ultrasound_rampdown_get, - elliptic_ultrasound_rampdown_set), - SOC_SINGLE_EXT("Ultrasound Latency", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY, - 10000, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Sensitivity", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY, - 1000000, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_DOUBLE_EXT("Ultrasound Speaker Scaling", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING, - 0, - 1000000, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Microphone Index", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX, - 20, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Mode", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE, - 255, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Mode Flags", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS, - 256, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Calibration Profile", - ELLIPTIC_CALIBRATION, - ELLIPTIC_CALIBRATION_PROFILE, - 256, - 0, - elliptic_calibration_param_get, - elliptic_calibration_param_put), - SOC_SINGLE_EXT("Ultrasound Gain", - ELLIPTIC_CALIBRATION, - ELLIPTIC_ULTRASOUND_GAIN, - 256, - 0, - elliptic_calibration_param_get, - elliptic_calibration_param_put), - - SOC_SINGLE_EXT("Ultrasound Calibration State", - ELLIPTIC_CALIBRATION, - ELLIPTIC_CALIBRATION_STATE, - 256, - 0, - elliptic_calibration_param_get, - elliptic_calibration_param_put), - - SND_SOC_BYTES_EXT("Ultrasound System Configuration", - ELLIPTIC_SYSTEM_CONFIGURATION_SIZE, - elliptic_system_configuration_get, - elliptic_system_configuration_put), - SND_SOC_BYTES_EXT("Ultrasound Calibration Data", - ELLIPTIC_CALIBRATION_DATA_SIZE, - elliptic_calibration_data_get, - elliptic_calibration_data_put), - SND_SOC_BYTES_EXT("Ultrasound Version", - ELLIPTIC_VERSION_INFO_SIZE, - elliptic_version_data_get, - elliptic_version_data_put), - SND_SOC_BYTES_EXT("Ultrasound Branch", - ELLIPTIC_BRANCH_INFO_MAX_SIZE, - elliptic_branch_data_get, - elliptic_branch_data_put), - SND_SOC_BYTES_EXT("Ultrasound Tag", - ELLIPTIC_TAG_INFO_SIZE, - elliptic_tag_data_get, - elliptic_tag_data_put), - SOC_SINGLE_EXT("Ultrasound Log Level", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL, - 7, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - - SND_SOC_BYTES_EXT("Ultrasound Calibration Ext Data", - ELLIPTIC_CALIBRATION_V2_DATA_SIZE, - elliptic_calibration_v2_data_get, - elliptic_calibration_v2_data_put), - - SND_SOC_BYTES_EXT("Ultrasound Diagnostics Data", - ELLIPTIC_DIAGNOSTICS_DATA_SIZE, - elliptic_diagnostics_data_get, - elliptic_diagnostics_data_put), - - SOC_ENUM_EXT("Ultrasound Diagnostics Request", - elliptic_enum[0], - elliptic_ultrasound_diagnostics_get, - elliptic_ultrasound_request_diagnostics), - - SOC_SINGLE_EXT("Ultrasound Custom Setting 0", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 1", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 2", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 3", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 4", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 5", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 6", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 7", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 8", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 9", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 10", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 11", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 12", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 13", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 14", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Custom Setting 15", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15, - ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_ENUM_EXT("Ultrasound Tx Port", - elliptic_enum[0], - elliptic_ultrasound_tx_port_get, - elliptic_ultrasound_tx_port_set), - SOC_ENUM_EXT("Ultrasound Rx Port", - elliptic_enum[0], - elliptic_ultrasound_rx_port_get, - elliptic_ultrasound_rx_port_set), - SOC_SINGLE_EXT("Ultrasound Suspend", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND, - 1, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Input", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED, - 1, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Output", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED, - 1, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Event", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT, - 256, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Calibration Method", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD, - 256, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - - SND_SOC_BYTES_EXT("Ultrasound ML", - ELLIPTIC_ML_DATA_SIZE, - elliptic_ml_data_get, - elliptic_ml_data_put), - - SOC_SINGLE_EXT("Ultrasound Debug Mode", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE, - 256, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SOC_SINGLE_EXT("Ultrasound Context", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT, - ELLIPTIC_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - SND_SOC_BYTES_EXT("Ultrasound Sensor Data", - ELLIPTIC_SENSOR_DATA_SIZE, - elliptic_sensor_data_get, - elliptic_sensor_data_put), - - SOC_SINGLE_EXT("Ultrasound Capture", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE, - 256, - -1, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - - SOC_SINGLE_EXT("Ultrasound Tx Channels", - ELLIPTIC_SYSTEM_CONFIGURATION, - ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS, - 16, - 0, - elliptic_system_configuration_param_get, - elliptic_system_configuration_param_put), - -}; - - - -unsigned int elliptic_add_platform_controls(void *platform) -{ - const unsigned int num_controls = - ARRAY_SIZE(ultrasound_filter_mixer_controls); - - if (platform != NULL) { - snd_soc_add_platform_controls( - (struct snd_soc_platform *)platform, - ultrasound_filter_mixer_controls, - num_controls); - } else { - EL_PRINT_E("pointer is NULL"); - } - - return num_controls; -} -EXPORT_SYMBOL(elliptic_add_platform_controls); - -int elliptic_trigger_version_msg(void) -{ - int32_t msg[3] = {ESCPT_ENGINE_VERSION, 0, 0}; - - return elliptic_data_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int elliptic_trigger_branch_msg(void) -{ - int32_t msg[3] = {ESCPT_BUILD_BRANCH, 0, 0}; - - return elliptic_data_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int elliptic_trigger_tag_msg(void) -{ - int32_t msg[3] = {ESCPT_ENGINE_TAG, 0, 0}; - - return elliptic_data_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int elliptic_trigger_diagnostics_msg(void) -{ - int32_t msg[3] = {ESCPT_ENGINE_DIAGNOSTICS, 0, 0}; - - return elliptic_data_write( - ELLIPTIC_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} diff --git a/techpack/audio/dsp/elliptic/elliptic_sysfs.c b/techpack/audio/dsp/elliptic/elliptic_sysfs.c deleted file mode 100755 index 882bda0c4b85..000000000000 --- a/techpack/audio/dsp/elliptic/elliptic_sysfs.c +++ /dev/null @@ -1,635 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "elliptic_version.h" -#include - - -#define ELLIPTIC_DIAGNOSTICS_DATA_SECTION_COUNT 16 -#define ELLIPTIC_CALIBRATION_MAX_DISPLAY_COUNT 96 -#define ELLIPTIC_ML_DISPLAY_COUNT 16 - -static int kobject_create_and_add_failed; -static int sysfs_create_group_failed; - -extern struct elliptic_system_configuration_parameters_cache - elliptic_system_configuration_cache; - -static ssize_t calibration_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct elliptic_shared_data_block *calibration_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_DATA); - - if (calibration_obj == NULL) { - EL_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (count > calibration_obj->size) { - EL_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(calibration_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t calibration_v2_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct elliptic_shared_data_block *calibration_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); - - if (calibration_obj == NULL) { - EL_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (count > calibration_obj->size) { - EL_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(calibration_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t diagnostics_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct elliptic_shared_data_block *diagnostics_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); - - if (diagnostics_obj == NULL) { - EL_PRINT_E("diagnostics_obj is NULL"); - return -EINVAL; - } - - if (count > diagnostics_obj->size) { - EL_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(diagnostics_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t ml_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct elliptic_shared_data_block *ml_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_ML_DATA); - - if (ml_obj == NULL) { - EL_PRINT_E("ml_obj is NULL"); - return -EINVAL; - } - - if (count > ml_obj->size) { - EL_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(ml_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t calibration_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - int i; - uint8_t *caldata; - - struct elliptic_shared_data_block *calibration_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_DATA); - - if (kobject_create_and_add_failed) - EL_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - EL_PRINT_E("sysfs_create_group_failed"); - - if (calibration_obj == NULL) { - EL_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (calibration_obj->size > PAGE_SIZE) { - EL_PRINT_E("calibration_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - caldata = (uint8_t *)calibration_obj->buffer; - length = 0; - if (pretty) { - if (caldata[0] == 0xDE && - caldata[1] == 0xAD) { - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Data: not loaded"); - } else { - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Data: "); - for (i = 0; i < calibration_obj->size; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - } - } else { - for (i = 0; i < calibration_obj->size; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t calibration_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return calibration_show_core(dev, attr, buf, 0); -} - -static ssize_t calibration_v2_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - int i; - uint8_t *caldata; - - struct elliptic_shared_data_block *calibration_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA); - - if (kobject_create_and_add_failed) - EL_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - EL_PRINT_E("sysfs_create_group_failed"); - - if (calibration_obj == NULL) { - EL_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (calibration_obj->size > PAGE_SIZE) { - EL_PRINT_E("calibration_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - caldata = (uint8_t *)calibration_obj->buffer; - length = 0; - if (pretty) { - if (caldata[0] == 0xDE && - caldata[1] == 0xAD) { - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Ext Data: not loaded"); - } else { - int j = (ELLIPTIC_CALIBRATION_V2_DATA_SIZE>>2) - 1; - - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Ext Data: "); - for (i = 0; i < ELLIPTIC_CALIBRATION_MAX_DISPLAY_COUNT; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - length += snprintf(buf + length, PAGE_SIZE - length, - "\nTruncated at %d", - ELLIPTIC_CALIBRATION_MAX_DISPLAY_COUNT); - length += snprintf(buf + length, PAGE_SIZE - length, - "\nmisc: %u %u %u %u %u %u %u %u\n", - caldata[j-7], caldata[j-6], caldata[j-5], - caldata[j-4], caldata[j-3], caldata[j-2], - caldata[j-1], caldata[j]); - } - } else { - for (i = 0; i < calibration_obj->size; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t calibration_v2_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return calibration_v2_show_core(dev, attr, buf, 0); -} - -static ssize_t diagnostics_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - uint32_t *data32; - int i; - - struct elliptic_shared_data_block *diagnostics_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA); - - if (kobject_create_and_add_failed) - EL_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - EL_PRINT_E("sysfs_create_group_failed"); - - if (diagnostics_obj == NULL) { - EL_PRINT_E("diagnostics_obj is NULL"); - return -EINVAL; - } - - if (diagnostics_obj->size > PAGE_SIZE) { - EL_PRINT_E("diagnostics_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - length = 0; - data32 = (uint32_t *)diagnostics_obj->buffer; - - if (pretty) { - length += snprintf(buf + length, PAGE_SIZE - length, - "Diagnostics:\n counters:\n"); - for (i = 0; i < ELLIPTIC_DIAGNOSTICS_DATA_SECTION_COUNT; i++) - length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", - data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); - } else { - for (i = 0; i < (diagnostics_obj->size >> 4); ++i) - length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", - data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t diagnostics_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return diagnostics_show_core(dev, attr, buf, 0); -} - -static ssize_t ml_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - int i; - uint32_t *mldata; - - struct elliptic_shared_data_block *ml_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_ML_DATA); - - if (kobject_create_and_add_failed) - EL_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - EL_PRINT_E("sysfs_create_group_failed"); - - if (ml_obj == NULL) { - EL_PRINT_E("ml_obj is NULL"); - return -EINVAL; - } - - if (ml_obj->size > PAGE_SIZE) { - EL_PRINT_E("ml_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - mldata = (uint32_t *)ml_obj->buffer; - length = 0; - if (pretty) { - if (mldata[0] == 0x0 && - mldata[1] == 0x0) { - length += snprintf(buf + length, PAGE_SIZE - length, - "ML Data: not loaded"); - } else { - length += snprintf(buf + length, PAGE_SIZE - length, - "ML Data: "); - for (i = 0; i < ELLIPTIC_ML_DISPLAY_COUNT; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%08x ", mldata[i]); - length += snprintf(buf + length, PAGE_SIZE - length, - "\nTruncated at %d", - ELLIPTIC_ML_DISPLAY_COUNT); - } - } else { - int values = ml_obj->size >> 2; - - for (i = 0; i < values; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%08x ", mldata[i]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t ml_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return ml_show_core(dev, attr, buf, 0); -} - - -static ssize_t version_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - struct elliptic_engine_version_info *version_info; - int length; - - struct elliptic_shared_data_block *version_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_VERSION_INFO); - - if (kobject_create_and_add_failed) - EL_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - EL_PRINT_E("sysfs_create_group_failed"); - - if (version_obj == NULL) { - EL_PRINT_E("version_obj is NULL"); - return -EINVAL; - } - - if (version_obj->size > PAGE_SIZE) { - EL_PRINT_E("version_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - version_info = (struct elliptic_engine_version_info *) - version_obj->buffer; - - if (pretty) { - if (version_info->major == 0xDE && - version_info->minor == 0xAD) { - length = snprintf(buf, PAGE_SIZE, "Version: unknown\n"); - } else { - length = snprintf(buf, PAGE_SIZE, "Version: %d.%d.%d.%d\n", - version_info->major, version_info->minor, - version_info->build, version_info->revision); - } - } else { - length = snprintf(buf, PAGE_SIZE, "%d.%d.%d.%d\n", - version_info->major, version_info->minor, - version_info->build, version_info->revision); - } - result = (ssize_t)length; - return result; -} - -static ssize_t version_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return version_show_core(dev, attr, buf, 0); -} - - -static ssize_t branch_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - int length; - - struct elliptic_shared_data_block *branch_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_BRANCH_INFO); - - if (branch_obj == NULL) { - EL_PRINT_E("branch_obj not found"); - return 0; - } - - if (branch_obj->size > PAGE_SIZE) { - EL_PRINT_E("branch_obj->size > PAGE_SIZE"); - return -EINVAL; - } - if (pretty) { - length = snprintf(buf, PAGE_SIZE - 1, "Branch: %s\n", - (const char *)(branch_obj->buffer)); - } else { - length = snprintf(buf, PAGE_SIZE - 1, "%s\n", - (const char *)(branch_obj->buffer)); - } - - return (ssize_t)length; -} - -static ssize_t branch_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return branch_show_core(dev, attr, buf, 0); -} - -static ssize_t tag_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - int length; - - struct elliptic_shared_data_block *tag_obj = - elliptic_get_shared_obj(ELLIPTIC_OBJ_ID_TAG_INFO); - - if (tag_obj == NULL) { - EL_PRINT_E("tag_obj not found"); - return 0; - } - - if (tag_obj->size > PAGE_SIZE) { - EL_PRINT_E("tag_obj->size > PAGE_SIZE"); - return -EINVAL; - } - if (pretty) { - length = snprintf(buf, PAGE_SIZE - 1, "Tag: %s\n", - (const char *)(tag_obj->buffer)); - } else { - length = snprintf(buf, PAGE_SIZE - 1, "%s\n", - (const char *)(tag_obj->buffer)); - } - - return (ssize_t)length; -} - -static ssize_t tag_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return tag_show_core(dev, attr, buf, 0); -} - -static ssize_t cache_show(char *buf, int pretty) -{ - struct elliptic_system_configuration_parameters_cache *cache = - &elliptic_system_configuration_cache; - - int length; - - length = snprintf(buf, PAGE_SIZE - 1, "Cache:\n"); - length += snprintf(buf + length, PAGE_SIZE - 1, " mi:%d\n", - cache->microphone_index); - length += snprintf(buf + length, PAGE_SIZE - 1, " om:%d\n", - cache->operation_mode); - length += snprintf(buf + length, PAGE_SIZE - 1, " omf:%d\n", - cache->operation_mode_flags); - length += snprintf(buf + length, PAGE_SIZE - 1, " cs:%d\n", - cache->calibration_state); - length += snprintf(buf + length, PAGE_SIZE - 1, " cp:%d\n", - cache->calibration_profile); - length += snprintf(buf + length, PAGE_SIZE - 1, " ug:%d\n", - cache->ultrasound_gain); - length += snprintf(buf + length, PAGE_SIZE - 1, " ll:%d\n", - cache->log_level); - length += snprintf(buf + length, PAGE_SIZE - 1, " es:%d\n", - cache->engine_suspend); - - return (ssize_t)length; -} - -static ssize_t opmode_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int length; - ssize_t result; - - struct elliptic_system_configuration_parameters_cache *cache = - &elliptic_system_configuration_cache; - - length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", - cache->operation_mode); - result = (ssize_t)length; - return result; -} - -static ssize_t opmode_flags_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int length; - ssize_t result; - struct elliptic_system_configuration_parameters_cache *cache = - &elliptic_system_configuration_cache; - - length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", - cache->operation_mode_flags); - result = (ssize_t)length; - return result; -} - -static ssize_t driver_version_show(char *buf) -{ - int length; - - length = snprintf(buf, PAGE_SIZE, "Driver version: %s-%s (%s)\n", - build_name, build_number, build_source_version); - - return (ssize_t)length; -} - -static ssize_t state_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int length = 0; - - length += driver_version_show(buf + length); - length += version_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += branch_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += tag_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += calibration_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += calibration_v2_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += diagnostics_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += ml_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += cache_show(buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - return (ssize_t)length; -} - -static struct device_attribute calibration_attr = __ATTR_RW(calibration); -static struct device_attribute version_attr = __ATTR_RO(version); -static struct device_attribute branch_attr = __ATTR_RO(branch); -static struct device_attribute calibration_v2_attr = __ATTR_RW(calibration_v2); -static struct device_attribute diagnostics_attr = __ATTR_RW(diagnostics); -static struct device_attribute state_attr = __ATTR_RO(state); -static struct device_attribute tag_attr = __ATTR_RO(tag); -static struct device_attribute ml_attr = __ATTR_RW(ml); -static struct device_attribute opmode_attr = __ATTR_RO(opmode); -static struct device_attribute opmode_flags_attr = __ATTR_RO(opmode_flags); - -static struct attribute *elliptic_attrs[] = { - &calibration_attr.attr, - &version_attr.attr, - &branch_attr.attr, - &calibration_v2_attr.attr, - &diagnostics_attr.attr, - &state_attr.attr, - &tag_attr.attr, - &ml_attr.attr, - &opmode_attr.attr, - &opmode_flags_attr.attr, - NULL, -}; - -static struct attribute_group elliptic_attr_group = { - .name = ELLIPTIC_SYSFS_ENGINE_FOLDER, - .attrs = elliptic_attrs, -}; - -static struct kobject *elliptic_sysfs_kobj; - -int elliptic_initialize_sysfs(void) -{ - int err; - - elliptic_sysfs_kobj = kobject_create_and_add(ELLIPTIC_SYSFS_ROOT_FOLDER, - kernel_kobj->parent); - - if (!elliptic_sysfs_kobj) { - kobject_create_and_add_failed = 1; - EL_PRINT_E("failed to create kobj"); - return -ENOMEM; - } - - err = sysfs_create_group(elliptic_sysfs_kobj, &elliptic_attr_group); - - if (err) { - sysfs_create_group_failed = 1; - EL_PRINT_E("failed to create sysfs group"); - kobject_put(elliptic_sysfs_kobj); - return -ENOMEM; - } - - return 0; -} - -void elliptic_cleanup_sysfs(void) -{ - kobject_put(elliptic_sysfs_kobj); -} diff --git a/techpack/audio/dsp/elliptic/elliptic_version.h b/techpack/audio/dsp/elliptic/elliptic_version.h deleted file mode 100755 index 1c8eb9af005d..000000000000 --- a/techpack/audio/dsp/elliptic/elliptic_version.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef ELLIPTIC_VERSION_H -#define ELLIPTIC_VERSION_H - -#define build_name "Elliptic.LinuxKernelDriver.VendorDLKM.master" -#define build_number "20181016.1" -#define build_source_version "e5e26691554bba9b1438ec3d7e0cc55dfb296bb8" - -#endif //ELLIPTIC_VERSION_H diff --git a/techpack/audio/dsp/elliptic/io_modules/Makefile b/techpack/audio/dsp/elliptic/io_modules/Makefile deleted file mode 100644 index 66ee789be57f..000000000000 --- a/techpack/audio/dsp/elliptic/io_modules/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: add config parameter for which io module to build -#obj-y += userspace/ diff --git a/techpack/audio/dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c b/techpack/audio/dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c deleted file mode 100755 index 3f77f968f0e1..000000000000 --- a/techpack/audio/dsp/elliptic/io_modules/msm/elliptic_data_msm_io.c +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright Elliptic Labs - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#define IO_PING_PONG_BUFFER_SIZE 512 -#define AFE_MSM_RX_PSEUDOPORT_ID 0x8001 -#define AFE_MSM_TX_PSEUDOPORT_ID 0x8002 - -struct elliptic_msm_io_device { -}; - -/* static struct elliptic_msm_io_device io_device;*/ - - -int elliptic_data_io_initialize(void) -{ - return 0; -} - -int elliptic_data_io_cleanup(void) -{ - return 0; -} -int elliptic_io_open_port(int portid) -{ - if (portid == ULTRASOUND_RX_PORT_ID) - return afe_start_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); - else - return afe_start_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); -} - -int elliptic_io_close_port(int portid) -{ - if (portid == ULTRASOUND_RX_PORT_ID) - return afe_stop_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); - else - return afe_stop_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); -} - -int32_t elliptic_data_io_write(uint32_t message_id, const char *data, - size_t data_size) -{ - int32_t result = 0; - - /* msm_pcm_routing_acquire_lock(); */ - - result = ultrasound_apr_set_parameter(ELLIPTIC_PORT_ID, - message_id, (u8 *)data, - (int32_t)data_size); - - /* msm_pcm_routing_release_lock();*/ - return result; -} - -int32_t elliptic_data_io_transact(uint32_t message_id, const char *data, - size_t data_size, char *output_data, size_t output_data_size) -{ - pr_err("%s : unimplemented\n", __func__); - return -EINVAL; -} diff --git a/techpack/audio/dsp/elliptic/io_modules/userspace/Makefile b/techpack/audio/dsp/elliptic/io_modules/userspace/Makefile deleted file mode 100644 index 907ddc20a1d9..000000000000 --- a/techpack/audio/dsp/elliptic/io_modules/userspace/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: add config parameter for which io module to build -#obj-y += elliptic_data_io.o diff --git a/techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c b/techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c deleted file mode 100644 index 76d332504757..000000000000 --- a/techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_ctrl.c +++ /dev/null @@ -1,272 +0,0 @@ -/** - * Copyright Elliptic Labs - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -static dev_t elliptic_userspace_ctrl_major; -#define USERSPACE_CTRL_IO_DEVICE_NAME "elliptic_us_ctrl_io" -struct elliptic_userspace_ctrl_device { - struct cdev cdev; - struct semaphore sem; - int ping_pong_idx; - size_t ping_pong_buffer_size[2]; - uint8_t ping_pong_buffer[2][ELLIPTIC_MSG_BUF_SIZE]; - wait_queue_head_t data_available; - struct mutex data_lock; - atomic_t data_state; -}; - - - -static struct elliptic_userspace_ctrl_device ctrl_device; - -static uint8_t *get_ping_buffer(struct elliptic_userspace_ctrl_device *dev, - /*out parameter*/ size_t *data_size) -{ - if (data_size != NULL) - *data_size = dev->ping_pong_buffer_size[dev->ping_pong_idx]; - - return dev->ping_pong_buffer[dev->ping_pong_idx]; -} - -static uint8_t *get_pong_buffer(struct elliptic_userspace_ctrl_device *dev, -/*out parameter*/ size_t *data_size) -{ - if (data_size != NULL) - *data_size = dev->ping_pong_buffer_size[1 - dev->ping_pong_idx]; - - return dev->ping_pong_buffer[1 - dev->ping_pong_idx]; -} - - -static void set_pong_buffer_size(struct elliptic_userspace_ctrl_device *dev, - size_t data_size) -{ - dev->ping_pong_buffer_size[1 - dev->ping_pong_idx] = data_size; -} - -static void swap_ping_pong(struct elliptic_userspace_ctrl_device *dev) -{ - dev->ping_pong_idx = 1 - dev->ping_pong_idx; -} - -static int device_open(struct inode *inode, struct file *filp) -{ - if (inode->i_cdev != &ctrl_device.cdev) { - pr_warn("elliptic : dev pointer mismatch\n"); - return -ENODEV; /* No such device */ - } - - if (down_interruptible(&ctrl_device.sem) != 0) - return -EEXIST; - EL_PRINT_I("Opened device %s", USERSPACE_CTRL_IO_DEVICE_NAME); - return 0; -} - -static ssize_t device_read(struct file *fp, char __user *buff, - size_t user_buf_length, loff_t *ppos) -{ - size_t bytes_read; - unsigned long copy_result; - uint8_t *ping_buffer; - int result; - - if (user_buf_length < ELLIPTIC_MSG_BUF_SIZE) - EL_PRINT_E("user space buffer user_buf_length too small : %zu", - user_buf_length); - - bytes_read = 0; - copy_result = 0; - ping_buffer = NULL; - - result = wait_event_interruptible(ctrl_device.data_available, - atomic_read(&ctrl_device.data_state) != 0); - if (result == 0) { - const int state = atomic_read(&ctrl_device.data_state); - - if (state > 0) { - result = mutex_lock_interruptible( - &ctrl_device.data_lock); - if (result == 0) { - swap_ping_pong(&ctrl_device); - - ping_buffer = get_ping_buffer( - &ctrl_device, &bytes_read); - - if (bytes_read > user_buf_length) { - EL_PRINT_E( - "ping buffer size %zu larger than user buffer", - bytes_read); - goto fail; - } - - copy_result = copy_to_user(buff, ping_buffer, - bytes_read); - if (copy_result > 0) { - EL_PRINT_E("Failed copy to user"); - goto fail; - } - - atomic_set(&ctrl_device.data_state, 0); - - mutex_unlock(&ctrl_device.data_lock); - } else if (result == -EINTR) { - EL_PRINT_E("lock interrupted"); - } else { - EL_PRINT_E("lock error = %d", result); - } - } else { - EL_PRINT_W("state = %d", state); - atomic_set(&ctrl_device.data_state, 0); - } - } else if (result == -ERESTARTSYS) { - EL_PRINT_E("interrupted"); - } else { - EL_PRINT_E("wait_event error = %d", result); - } - return bytes_read; -fail: - atomic_set(&ctrl_device.data_state, 0); - mutex_unlock(&ctrl_device.data_lock); - return 0; -} - -static int device_close(struct inode *inode, struct file *filp) -{ - up(&ctrl_device.sem); - EL_PRINT_I("Closed device %s", USERSPACE_CTRL_IO_DEVICE_NAME); - return 0; -} - -static const struct file_operations -elliptic_userspace_ctrl_fops = { - .owner = THIS_MODULE, - .open = device_open, - .read = device_read, - .release = device_close, -}; - -int elliptic_userspace_ctrl_driver_init(void) -{ - struct device *device; - dev_t device_number; - int err; - - err = alloc_chrdev_region( - &device_number, 0, 1, USERSPACE_CTRL_IO_DEVICE_NAME); - - if (err < 0) { - pr_err("failed to allocate chrdev region\n"); - return err; - } - - elliptic_userspace_ctrl_major = MAJOR(device_number); - - device_number = MKDEV(elliptic_userspace_ctrl_major, 0); - device = device_create( - elliptic_class, NULL, device_number, - NULL, USERSPACE_CTRL_IO_DEVICE_NAME); - - if (IS_ERR(device)) { - unregister_chrdev( - elliptic_userspace_ctrl_major, - USERSPACE_CTRL_IO_DEVICE_NAME); - EL_PRINT_E("Failed to create the device\n"); - return PTR_ERR(device); - } - - cdev_init(&ctrl_device.cdev, &elliptic_userspace_ctrl_fops); - ctrl_device.cdev.owner = THIS_MODULE; - err = cdev_add(&ctrl_device.cdev, device_number, 1); - if (err) { - EL_PRINT_W("error %d while trying to add %s%d", - err, ELLIPTIC_DEVICENAME, 0); - return err; - } - - sema_init(&ctrl_device.sem, 1); - mutex_init(&ctrl_device.data_lock); - init_waitqueue_head(&ctrl_device.data_available); - return 0; -} - -void elliptic_userspace_ctrl_driver_exit(void) -{ - BUG_ON(elliptic_class == NULL); - device_destroy(elliptic_class, MKDEV(elliptic_userspace_ctrl_major, 0)); - cdev_del(&ctrl_device.cdev); - unregister_chrdev(elliptic_userspace_ctrl_major, - USERSPACE_CTRL_IO_DEVICE_NAME); - up(&ctrl_device.sem); -} - -int32_t elliptic_userspace_ctrl_write(uint32_t message_id, - const char *data, size_t data_size){ - uint8_t *pong_buffer; - - if (data_size > ELLIPTIC_MSG_BUF_SIZE) { - EL_PRINT_E("data size : %zu larger than buf size : %zu", - data_size, (size_t)ELLIPTIC_MSG_BUF_SIZE); - - return -EINVAL; - } - mutex_lock(&ctrl_device.data_lock); - - pong_buffer = get_pong_buffer(&ctrl_device, NULL); - set_pong_buffer_size(&ctrl_device, data_size); - - memcpy(pong_buffer, data, data_size); - wake_up_interruptible(&ctrl_device.data_available); - atomic_set(&ctrl_device.data_state, 1); - mutex_unlock(&ctrl_device.data_lock); - - return 0; -} - - diff --git a/techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c b/techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c deleted file mode 100644 index 7897e6df0d1a..000000000000 --- a/techpack/audio/dsp/elliptic/io_modules/userspace/elliptic_data_userspace_io.c +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright Elliptic Labs - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -static dev_t elliptic_userspace_major; -#define USERSPACE_IO_DEVICE_NAME "elliptic_us_io" -struct elliptic_userspace_device { - struct cdev cdev; - struct semaphore sem; -}; - -static struct elliptic_userspace_device io_device; - -static int device_open(struct inode *inode, struct file *filp) -{ - if (inode->i_cdev != &io_device.cdev) { - pr_warn("elliptic : dev pointer mismatch\n"); - return -ENODEV; /* No such device */ - } - - if (down_interruptible(&io_device.sem) != 0) - return -EEXIST; - EL_PRINT_I("Opened device %s", USERSPACE_IO_DEVICE_NAME); - return 0; -} - -static ssize_t device_write(struct file *fp, const char __user *buff, - size_t length, loff_t *ppos) -{ - int push_result; - - push_result = elliptic_data_push( - ELLIPTIC_ALL_DEVICES, buff, length, ELLIPTIC_DATA_PUSH_FROM_USERSPACE); - - return push_result == 0 ? (ssize_t)length : (ssize_t)(-1); -} - -static int device_close(struct inode *inode, struct file *filp) -{ - up(&io_device.sem); - EL_PRINT_I("Closed device %s", USERSPACE_IO_DEVICE_NAME); - return 0; -} - -static const struct file_operations -elliptic_userspace_fops = { - .owner = THIS_MODULE, - .open = device_open, - .write = device_write, - .release = device_close, -}; - -int elliptic_userspace_io_driver_init(void) -{ - struct device *device; - dev_t device_number; - int err; - - err = alloc_chrdev_region( - &device_number, 0, 1, USERSPACE_IO_DEVICE_NAME); - - if (err < 0) { - pr_err("failed to allocate chrdev region\n"); - return err; - } - - elliptic_userspace_major = MAJOR(device_number); - - device_number = MKDEV(elliptic_userspace_major, 0); - device = device_create( - elliptic_class, NULL, device_number, - NULL, USERSPACE_IO_DEVICE_NAME); - - if (IS_ERR(device)) { - unregister_chrdev( - elliptic_userspace_major, USERSPACE_IO_DEVICE_NAME); - pr_err("Failed to create the device\n"); - return PTR_ERR(device); - } - - cdev_init(&io_device.cdev, &elliptic_userspace_fops); - io_device.cdev.owner = THIS_MODULE; - err = cdev_add(&io_device.cdev, device_number, 1); - if (err) { - EL_PRINT_W("error %d while trying to add %s%d", - err, ELLIPTIC_DEVICENAME, 0); - return err; - } - - sema_init(&io_device.sem, 1); - return 0; -} - -void elliptic_userspace_io_driver_exit(void) -{ - BUG_ON(elliptic_class == NULL); - device_destroy(elliptic_class, MKDEV(elliptic_userspace_major, 0)); - cdev_del(&io_device.cdev); - unregister_chrdev(elliptic_userspace_major, USERSPACE_IO_DEVICE_NAME); - up(&io_device.sem); -} - - diff --git a/techpack/audio/dsp/elliptic/io_modules/userspace_test/Makefile b/techpack/audio/dsp/elliptic/io_modules/userspace_test/Makefile deleted file mode 100644 index 907ddc20a1d9..000000000000 --- a/techpack/audio/dsp/elliptic/io_modules/userspace_test/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: add config parameter for which io module to build -#obj-y += elliptic_data_io.o diff --git a/techpack/audio/dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c b/techpack/audio/dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c deleted file mode 100755 index 378acd2b01b7..000000000000 --- a/techpack/audio/dsp/elliptic/io_modules/userspace_test/elliptic_data_io.c +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright Elliptic Labs - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - - -#define USE_IRQ 11 - -static struct task_struct *simulating_task; -static atomic_t cancel; - -struct elliptic_data_io_state { -}; -#define BUFFER_SIZE 128 - -static int32_t output_buffer[BUFFER_SIZE]; - -irqreturn_t irq_handler(int irq, void *dev_id) -{ - int result; - - result = elliptic_data_push(ELLIPTIC_ALL_DEVICES, - (const char *)output_buffer, BUFFER_SIZE * sizeof(int32_t)); - return 0; -} - - -static void fill_buffer(int32_t *buffer, size_t len, int32_t value) -{ - size_t i; - - for (i = 0; i < len; ++i) - buffer[i] = value; -} - - -int simulating_thread(void *context) -{ - static int32_t count; - int result; - - count = 0; - msleep(100); - - pr_debug("%s\n", __func__); - while (atomic_read(&cancel) == 0) { - if (kthread_should_stop()) - do_exit(0); - - fill_buffer(output_buffer, BUFFER_SIZE, count); - - ++count; - if (result != 0) { - pr_warn("failed to push data\n"); - } - asm("int $0x3B"); /* Corresponding to irq 11 */ - msleep(0); - } - return 0; -} - -int32_t elliptic_data_io_write(uint32_t message_id, const char *data, - size_t data_size) { - return 0; - } - -int32_t elliptic_data_io_transact(uint32_t message_id, const char *data, - size_t data_size, char *output_data, size_t output_data_size) { - return 0; -} - - -void elliptic_data_io_cancel(struct elliptic_data *elliptic_data) -{ - atomic_set(&elliptic_data->abort_io, 1); - wake_up_interruptible(&elliptic_data->fifo_isr_not_empty); -} - - -int elliptic_data_io_initialize(void) -{ - pr_debug("%s\n", __func__); - atomic_set(&cancel, 0); - simulating_task = kthread_run(&simulating_thread, NULL, - "el_simulating_thread"); - - - if (request_irq(USE_IRQ, irq_handler, IRQF_SHARED, "my_device", - (void *)(irq_handler))) { - pr_debug("my_device: cannot register IRQ "); - return -EPERM; - } - - return 0; -} - -int elliptic_data_io_cleanup(void) -{ - free_irq(USE_IRQ, (void *)(irq_handler)); - kthread_stop(simulating_task); - atomic_set(&cancel, 1); - msleep(200); - return 0; -} diff --git a/techpack/audio/dsp/mius/Makefile b/techpack/audio/dsp/mius/Makefile deleted file mode 100644 index 1a0cd5f4608b..000000000000 --- a/techpack/audio/dsp/mius/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -ccflags-y := -I$(src) -Wall -Werror -IO_MODULE := msm - -# EXTRA_CFLAGS += -DDEBUG - -# Need to add include paths: -LINUXINCLUDE += \ - -I$(srctree)techpack/audio/include/dsp - -I$(srctree)techpack/audio/include/uapi - -I$(srctree)techpack/aduio/include - -obj-y += mius.o -obj-y += mius_mixer_controls.o -obj-y += io_modules/$(IO_MODULE)/mius_data_$(IO_MODULE)_io.o -obj-y += io_modules/userspace/mius_data_userspace_io.o -obj-y += io_modules/userspace/mius_data_userspace_ctrl.o -obj-y += mius_sysfs.o - -# mius_driver-y := mius.o -# mius_driver-y += io_modules/$(IO_MODULE)/mius_data_io.o -# mius_driver-y += mixer_controls/$(MIXER_MODULE)/mius_mixer_controls.o -# mius_driver-y += mius_sysfs.o - -# .PHONY: clean -# all: -# make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules -# clean: -# rm *.o *.ko diff --git a/techpack/audio/dsp/mius/io_modules/Makefile b/techpack/audio/dsp/mius/io_modules/Makefile deleted file mode 100644 index 66ee789be57f..000000000000 --- a/techpack/audio/dsp/mius/io_modules/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: add config parameter for which io module to build -#obj-y += userspace/ diff --git a/techpack/audio/dsp/mius/io_modules/msm/mius_data_msm_io.c b/techpack/audio/dsp/mius/io_modules/msm/mius_data_msm_io.c deleted file mode 100644 index 0cf8f594ba27..000000000000 --- a/techpack/audio/dsp/mius/io_modules/msm/mius_data_msm_io.c +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright MI - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#define IO_PING_PONG_BUFFER_SIZE 512 -#define AFE_MSM_RX_PSEUDOPORT_ID 0x8001 -#define AFE_MSM_TX_PSEUDOPORT_ID 0x8002 - -struct mius_msm_io_device { -}; - -/* static struct mius_msm_io_device io_device;*/ - - -int mius_data_io_initialize(void) -{ - return 0; -} - -int mius_data_io_cleanup(void) -{ - return 0; -} -int mius_io_open_port(int portid) -{ - if (portid == ULTRASOUND_RX_PORT_ID) - return afe_start_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); - else - return afe_start_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); -} - -int mius_io_close_port(int portid) -{ - if (portid == ULTRASOUND_RX_PORT_ID) - return afe_stop_pseudo_port(AFE_MSM_RX_PSEUDOPORT_ID); - else - return afe_stop_pseudo_port(AFE_MSM_TX_PSEUDOPORT_ID); -} - -int32_t mius_data_io_write(uint32_t message_id, const char *data, - size_t data_size) -{ - int32_t result = 0; - - /* msm_pcm_routing_acquire_lock(); */ - - result = mi_ultrasound_apr_set_parameter(MIUS_PORT_ID, - message_id, (u8 *)data, - (int32_t)data_size); - - /* msm_pcm_routing_release_lock();*/ - return result; -} - -int32_t mius_data_io_transact(uint32_t message_id, const char *data, - size_t data_size, char *output_data, size_t output_data_size) -{ - pr_err("%s : unimplemented\n", __func__); - return -EINVAL; -} diff --git a/techpack/audio/dsp/mius/io_modules/userspace/Makefile b/techpack/audio/dsp/mius/io_modules/userspace/Makefile deleted file mode 100644 index 34d76dde1eb9..000000000000 --- a/techpack/audio/dsp/mius/io_modules/userspace/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: add config parameter for which io module to build -#obj-y += mius_data_io.o diff --git a/techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c b/techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c deleted file mode 100644 index 09142a091015..000000000000 --- a/techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_ctrl.c +++ /dev/null @@ -1,272 +0,0 @@ -/** - * Copyright MI - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -static dev_t mius_userspace_ctrl_major; -#define USERSPACE_CTRL_IO_DEVICE_NAME "mius_us_ctrl_io" -struct mius_userspace_ctrl_device { - struct cdev cdev; - struct semaphore sem; - int ping_pong_idx; - size_t ping_pong_buffer_size[2]; - uint8_t ping_pong_buffer[2][MIUS_MSG_BUF_SIZE]; - wait_queue_head_t data_available; - struct mutex data_lock; - atomic_t data_state; -}; - - - -static struct mius_userspace_ctrl_device ctrl_device; - -static uint8_t *get_ping_buffer(struct mius_userspace_ctrl_device *dev, - /*out parameter*/ size_t *data_size) -{ - if (data_size != NULL) - *data_size = dev->ping_pong_buffer_size[dev->ping_pong_idx]; - - return dev->ping_pong_buffer[dev->ping_pong_idx]; -} - -static uint8_t *get_pong_buffer(struct mius_userspace_ctrl_device *dev, -/*out parameter*/ size_t *data_size) -{ - if (data_size != NULL) - *data_size = dev->ping_pong_buffer_size[1 - dev->ping_pong_idx]; - - return dev->ping_pong_buffer[1 - dev->ping_pong_idx]; -} - - -static void set_pong_buffer_size(struct mius_userspace_ctrl_device *dev, - size_t data_size) -{ - dev->ping_pong_buffer_size[1 - dev->ping_pong_idx] = data_size; -} - -static void swap_ping_pong(struct mius_userspace_ctrl_device *dev) -{ - dev->ping_pong_idx = 1 - dev->ping_pong_idx; -} - -static int device_open(struct inode *inode, struct file *filp) -{ - if (inode->i_cdev != &ctrl_device.cdev) { - pr_warn("mius : dev pointer mismatch\n"); - return -ENODEV; /* No such device */ - } - - if (down_interruptible(&ctrl_device.sem) != 0) - return -EEXIST; - MI_PRINT_I("Opened device %s", USERSPACE_CTRL_IO_DEVICE_NAME); - return 0; -} - -static ssize_t device_read(struct file *fp, char __user *buff, - size_t user_buf_length, loff_t *ppos) -{ - size_t bytes_read; - unsigned long copy_result; - uint8_t *ping_buffer; - int result; - - if (user_buf_length < MIUS_MSG_BUF_SIZE) - MI_PRINT_E("user space buffer user_buf_length too small : %zu", - user_buf_length); - - bytes_read = 0; - copy_result = 0; - ping_buffer = NULL; - - result = wait_event_interruptible(ctrl_device.data_available, - atomic_read(&ctrl_device.data_state) != 0); - if (result == 0) { - const int state = atomic_read(&ctrl_device.data_state); - - if (state > 0) { - result = mutex_lock_interruptible( - &ctrl_device.data_lock); - if (result == 0) { - swap_ping_pong(&ctrl_device); - - ping_buffer = get_ping_buffer( - &ctrl_device, &bytes_read); - - if (bytes_read > user_buf_length) { - MI_PRINT_E( - "ping buffer size %zu larger than user buffer", - bytes_read); - goto fail; - } - - copy_result = copy_to_user(buff, ping_buffer, - bytes_read); - if (copy_result > 0) { - MI_PRINT_E("Failed copy to user"); - goto fail; - } - - atomic_set(&ctrl_device.data_state, 0); - - mutex_unlock(&ctrl_device.data_lock); - } else if (result == -EINTR) { - MI_PRINT_E("lock interrupted"); - } else { - MI_PRINT_E("lock error = %d", result); - } - } else { - MI_PRINT_W("state = %d", state); - atomic_set(&ctrl_device.data_state, 0); - } - } else if (result == -ERESTARTSYS) { - MI_PRINT_E("interrupted"); - } else { - MI_PRINT_E("wait_event error = %d", result); - } - return bytes_read; -fail: - atomic_set(&ctrl_device.data_state, 0); - mutex_unlock(&ctrl_device.data_lock); - return 0; -} - -static int device_close(struct inode *inode, struct file *filp) -{ - up(&ctrl_device.sem); - MI_PRINT_I("Closed device %s", USERSPACE_CTRL_IO_DEVICE_NAME); - return 0; -} - -static const struct file_operations -mius_userspace_ctrl_fops = { - .owner = THIS_MODULE, - .open = device_open, - .read = device_read, - .release = device_close, -}; - -int mius_userspace_ctrl_driver_init(void) -{ - struct device *device; - dev_t device_number; - int err; - - err = alloc_chrdev_region( - &device_number, 0, 1, USERSPACE_CTRL_IO_DEVICE_NAME); - - if (err < 0) { - pr_err("failed to allocate chrdev region\n"); - return err; - } - - mius_userspace_ctrl_major = MAJOR(device_number); - - device_number = MKDEV(mius_userspace_ctrl_major, 0); - device = device_create( - mius_class, NULL, device_number, - NULL, USERSPACE_CTRL_IO_DEVICE_NAME); - - if (IS_ERR(device)) { - unregister_chrdev( - mius_userspace_ctrl_major, - USERSPACE_CTRL_IO_DEVICE_NAME); - MI_PRINT_E("Failed to create the device\n"); - return PTR_ERR(device); - } - - cdev_init(&ctrl_device.cdev, &mius_userspace_ctrl_fops); - ctrl_device.cdev.owner = THIS_MODULE; - err = cdev_add(&ctrl_device.cdev, device_number, 1); - if (err) { - MI_PRINT_W("error %d while trying to add %s%d", - err, MIUS_DEVICENAME, 0); - return err; - } - - sema_init(&ctrl_device.sem, 1); - mutex_init(&ctrl_device.data_lock); - init_waitqueue_head(&ctrl_device.data_available); - return 0; -} - -void mius_userspace_ctrl_driver_exit(void) -{ - BUG_ON(mius_class == NULL); - device_destroy(mius_class, MKDEV(mius_userspace_ctrl_major, 0)); - cdev_del(&ctrl_device.cdev); - unregister_chrdev(mius_userspace_ctrl_major, - USERSPACE_CTRL_IO_DEVICE_NAME); - up(&ctrl_device.sem); -} - -int32_t mius_userspace_ctrl_write(uint32_t message_id, - const char *data, size_t data_size){ - uint8_t *pong_buffer; - - if (data_size > MIUS_MSG_BUF_SIZE) { - MI_PRINT_E("data size : %zu larger than buf size : %zu", - data_size, (size_t)MIUS_MSG_BUF_SIZE); - - return -EINVAL; - } - mutex_lock(&ctrl_device.data_lock); - - pong_buffer = get_pong_buffer(&ctrl_device, NULL); - set_pong_buffer_size(&ctrl_device, data_size); - - memcpy(pong_buffer, data, data_size); - wake_up_interruptible(&ctrl_device.data_available); - atomic_set(&ctrl_device.data_state, 1); - mutex_unlock(&ctrl_device.data_lock); - - return 0; -} - - diff --git a/techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_io.c b/techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_io.c deleted file mode 100644 index db03418b9539..000000000000 --- a/techpack/audio/dsp/mius/io_modules/userspace/mius_data_userspace_io.c +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright MI - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -static dev_t mius_userspace_major; -#define USERSPACE_IO_DEVICE_NAME "mius_us_io" -struct mius_userspace_device { - struct cdev cdev; - struct semaphore sem; -}; - -static struct mius_userspace_device io_device; - -static int device_open(struct inode *inode, struct file *filp) -{ - if (inode->i_cdev != &io_device.cdev) { - pr_warn("mius : dev pointer mismatch\n"); - return -ENODEV; /* No such device */ - } - - if (down_interruptible(&io_device.sem) != 0) - return -EEXIST; - MI_PRINT_I("Opened device %s", USERSPACE_IO_DEVICE_NAME); - return 0; -} - -static ssize_t device_write(struct file *fp, const char __user *buff, - size_t length, loff_t *ppos) -{ - int push_result; - - push_result = mius_data_push( - MIUS_ALL_DEVICES, buff, length, MIUS_DATA_PUSH_FROM_USERSPACE); - - return push_result == 0 ? (ssize_t)length : (ssize_t)(-1); -} - -static int device_close(struct inode *inode, struct file *filp) -{ - up(&io_device.sem); - MI_PRINT_I("Closed device %s", USERSPACE_IO_DEVICE_NAME); - return 0; -} - -static const struct file_operations -mius_userspace_fops = { - .owner = THIS_MODULE, - .open = device_open, - .write = device_write, - .release = device_close, -}; - -int mius_userspace_io_driver_init(void) -{ - struct device *device; - dev_t device_number; - int err; - - err = alloc_chrdev_region( - &device_number, 0, 1, USERSPACE_IO_DEVICE_NAME); - - if (err < 0) { - pr_err("failed to allocate chrdev region\n"); - return err; - } - - mius_userspace_major = MAJOR(device_number); - - device_number = MKDEV(mius_userspace_major, 0); - device = device_create( - mius_class, NULL, device_number, - NULL, USERSPACE_IO_DEVICE_NAME); - - if (IS_ERR(device)) { - unregister_chrdev( - mius_userspace_major, USERSPACE_IO_DEVICE_NAME); - pr_err("Failed to create the device\n"); - return PTR_ERR(device); - } - - cdev_init(&io_device.cdev, &mius_userspace_fops); - io_device.cdev.owner = THIS_MODULE; - err = cdev_add(&io_device.cdev, device_number, 1); - if (err) { - MI_PRINT_W("error %d while trying to add %s%d", - err, MIUS_DEVICENAME, 0); - return err; - } - - sema_init(&io_device.sem, 1); - return 0; -} - -void mius_userspace_io_driver_exit(void) -{ - BUG_ON(mius_class == NULL); - device_destroy(mius_class, MKDEV(mius_userspace_major, 0)); - cdev_del(&io_device.cdev); - unregister_chrdev(mius_userspace_major, USERSPACE_IO_DEVICE_NAME); - up(&io_device.sem); -} - - diff --git a/techpack/audio/dsp/mius/io_modules/userspace_test/Makefile b/techpack/audio/dsp/mius/io_modules/userspace_test/Makefile deleted file mode 100644 index 34d76dde1eb9..000000000000 --- a/techpack/audio/dsp/mius/io_modules/userspace_test/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: add config parameter for which io module to build -#obj-y += mius_data_io.o diff --git a/techpack/audio/dsp/mius/io_modules/userspace_test/mius_data_io.c b/techpack/audio/dsp/mius/io_modules/userspace_test/mius_data_io.c deleted file mode 100644 index 2d4e16242cf6..000000000000 --- a/techpack/audio/dsp/mius/io_modules/userspace_test/mius_data_io.c +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright MI - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - - -#define USE_IRQ 11 - -static struct task_struct *simulating_task; -static atomic_t cancel; - -struct mius_data_io_state { -}; -#define BUFFER_SIZE 128 - -static int32_t output_buffer[BUFFER_SIZE]; - -irqreturn_t irq_handler(int irq, void *dev_id) -{ - int result; - - result = mius_data_push(MIUS_ALL_DEVICES, - (const char *)output_buffer, BUFFER_SIZE * sizeof(int32_t)); - return 0; -} - - -static void fill_buffer(int32_t *buffer, size_t len, int32_t value) -{ - size_t i; - - for (i = 0; i < len; ++i) - buffer[i] = value; -} - - -int simulating_thread(void *context) -{ - static int32_t count; - int result; - - count = 0; - msleep(100); - - pr_debug("%s\n", __func__); - while (atomic_read(&cancel) == 0) { - if (kthread_should_stop()) - do_exit(0); - - fill_buffer(output_buffer, BUFFER_SIZE, count); - - ++count; - if (result != 0) { - pr_warn("failed to push data\n"); - } - asm("int $0x3B"); /* Corresponding to irq 11 */ - msleep(0); - } - return 0; -} - -int32_t mius_data_io_write(uint32_t message_id, const char *data, - size_t data_size) { - return 0; - } - -int32_t mius_data_io_transact(uint32_t message_id, const char *data, - size_t data_size, char *output_data, size_t output_data_size) { - return 0; -} - - -void mius_data_io_cancel(struct mius_data *mius_data) -{ - atomic_set(&mius_data->abort_io, 1); - wake_up_interruptible(&mius_data->fifo_isr_not_empty); -} - - -int mius_data_io_initialize(void) -{ - pr_debug("%s\n", __func__); - atomic_set(&cancel, 0); - simulating_task = kthread_run(&simulating_thread, NULL, - "el_simulating_thread"); - - - if (request_irq(USE_IRQ, irq_handler, IRQF_SHARED, "my_device", - (void *)(irq_handler))) { - pr_debug("my_device: cannot register IRQ "); - return -EPERM; - } - - return 0; -} - -int mius_data_io_cleanup(void) -{ - free_irq(USE_IRQ, (void *)(irq_handler)); - kthread_stop(simulating_task); - atomic_set(&cancel, 1); - msleep(200); - return 0; -} diff --git a/techpack/audio/dsp/mius/mius.c b/techpack/audio/dsp/mius/mius.c deleted file mode 100644 index 668be0216096..000000000000 --- a/techpack/audio/dsp/mius/mius.c +++ /dev/null @@ -1,801 +0,0 @@ -/** -* Copyright MI -* Copyright (C) 2019 XiaoMi, Inc. -* -*/ -/* #define DEBUG */ -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - - -/* Alternative mechanism to load calibration data. -* Read calibration data during driver initialization -* and send message to the DSP -* -* #define MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM 1 -*/ -#ifdef MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM -#include -#include -#include -#endif - -static struct mius_device *mius_devices; - -/* Global variable for the device class*/ -struct class *mius_class; - -typedef uint32_t el_fifo_size_t; - -/* Major number provided by the kernel*/ -static dev_t mius_major; - -static struct wakeup_source *wake_source; - - -void mius_data_cancel(struct mius_data *mius_data) -{ - atomic_set(&mius_data->abort_io, 1); - wake_up_interruptible(&mius_data->fifo_isr_not_empty); -} - -void mius_data_reset_debug_counters(struct mius_data *mius_data) -{ - mius_data->isr_fifo_discard = 0; -} - -void mius_data_print_debug_counters(struct mius_data *mius_data) -{ - if (mius_data->isr_fifo_discard > 0) { - MI_PRINT_E("isr fifo discarded %u frames", - mius_data->isr_fifo_discard); - } - - if (mius_data->userspace_read_total != - mius_data->isr_write_total) { - MI_PRINT_I("user space reads / isr writes : %u / %u", - mius_data->userspace_read_total, - mius_data->isr_write_total); - } - - MI_PRINT_I("total isr fifo discarded frame count : %u", - mius_data->isr_fifo_discard_total); -} - -void mius_data_update_debug_counters(struct mius_data - *mius_data) -{ - mius_data->isr_fifo_discard_total += - mius_data->isr_fifo_discard; -} - - -/* spin lock for isr must be held prior to calling */ -static void mius_data_flush_isr_fifo(struct mius_data - *mius_data) -{ - kfifo_reset(&mius_data->fifo_isr); -} - -/* spin lock for isr must be held prior to calling */ -static void mius_data_isr_fifo_pop(struct mius_data - *mius_data, size_t size) -{ - unsigned int fifo_result; - static uint8_t temp_buffer[MIUS_MSG_BUF_SIZE]; - - if (size > MIUS_MSG_BUF_SIZE) - MI_PRINT_E("pop size %zu too large", size); - - fifo_result = kfifo_out(&mius_data->fifo_isr, - temp_buffer, size); - - if (size != fifo_result) - MI_PRINT_E("failed to pop element"); -} - - -int mius_notify_gain_change_msg(int component_id, int gaindb) -{ - int32_t msg[3] = {MSC_COMPONENT_GAIN_CHANGE, component_id, gaindb}; - - return mius_data_write( - MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -/* inode refers to the actual file on disk */ -static int device_open(struct inode *inode, struct file *filp) -{ - unsigned int major; - unsigned int minor; - struct mius_device *dev; - struct mius_data *mius_data; - - major = imajor(inode); - minor = iminor(inode); - - if (major != mius_major || minor < 0 - || minor >= MIUS_NUM_DEVICES) { - MI_PRINT_W("no device found with minor=%d and major=%d", - major, minor); - return -ENODEV; /* No such device */ - } - - dev = NULL; - dev = &mius_devices[minor]; - filp->private_data = dev; - - if (inode->i_cdev != &dev->cdev) { - MI_PRINT_W("dev pointer mismatch"); - return -ENODEV; /* No such device */ - } - - if (down_interruptible(&dev->sem) != 0) { - MI_PRINT_E("the device has been opened, unable to open lock"); - return -EINVAL; - } - - mius_data = &dev->el_data; - spin_lock(&mius_data->fifo_isr_spinlock); - mius_data_flush_isr_fifo(mius_data); - spin_unlock(&mius_data->fifo_isr_spinlock); - - atomic_set(&mius_data->abort_io, 0); - mius_data_reset_debug_counters(mius_data); - - MI_PRINT_I("Opened device mius%u", minor); - dev->opened = 1; - return 0; -} - - -int mius_data_initialize(struct mius_data - *mius_data, size_t queue_size, - unsigned int wakeup_timeout, int id) -{ - int is_power_of_two; - - is_power_of_two = (queue_size != 0) && !(queue_size & (queue_size - 1)); - - if (is_power_of_two != 1) { - MI_PRINT_E("non power of 2 fifo size"); - return -EINVAL; - } - - if (kfifo_alloc(&mius_data->fifo_isr, - queue_size, GFP_KERNEL) != 0) { - MI_PRINT_E("failed to allocate fifo isr"); - return -EINVAL; - } - - atomic_set(&mius_data->abort_io, 0); - spin_lock_init(&mius_data->fifo_isr_spinlock); - - mius_data->wakeup_timeout = wakeup_timeout; - - mutex_init(&mius_data->user_buffer_lock); - init_waitqueue_head(&mius_data->fifo_isr_not_empty); - - return 0; -} - -int mius_data_cleanup(struct mius_data *mius_data) -{ - spin_unlock(&mius_data->fifo_isr_spinlock); - kfifo_free(&mius_data->fifo_isr); - return 0; -} - -size_t mius_data_pop(struct mius_data - *mius_data, char __user *user_buffer, size_t buffer_size) -{ - int result; - unsigned long num_copied; - unsigned int fifo_result; - unsigned long flags; - - if (buffer_size < MIUS_MSG_BUF_SIZE) { - MI_PRINT_E("buffer_size : %lu smaller than %lu", - buffer_size, (size_t)MIUS_MSG_BUF_SIZE); - return 0; - } - - result = wait_event_interruptible(mius_data->fifo_isr_not_empty, - (kfifo_is_empty(&mius_data->fifo_isr) == 0) - || (atomic_read(&mius_data->abort_io) == 1)); - - if (atomic_read(&mius_data->abort_io) == 1) { - atomic_set(&mius_data->abort_io, 0); - MI_PRINT_D("pop cancelled"); - return 0; - } - - if (result == 0) { - spin_lock_irqsave(&mius_data->fifo_isr_spinlock, flags); - - fifo_result = kfifo_out(&mius_data->fifo_isr, - mius_data->isr_swap_buffer, MIUS_MSG_BUF_SIZE); - - spin_unlock_irqrestore(&mius_data->fifo_isr_spinlock, - flags); - - if (fifo_result == 0) { - MI_PRINT_E("failed to copy: fifo isr -> swap buffer %u", - fifo_result); - return 0; - } - - mutex_lock(&mius_data->user_buffer_lock); - - num_copied = copy_to_user(user_buffer, - mius_data->isr_swap_buffer, - MIUS_MSG_BUF_SIZE); - - mutex_unlock(&mius_data->user_buffer_lock); - - if (num_copied != 0) { - MI_PRINT_E("failed copy to user"); - return 0; - } - ++mius_data->userspace_read_total; - } else { - if (-ERESTARTSYS == result) - MI_PRINT_I("wait interrupted"); - else - MI_PRINT_E("wait error = %d", result); - - return 0; - } - - return (size_t)MIUS_MSG_BUF_SIZE; -} - - - -/* push data to specific device or all devices */ -int mius_data_push(int deviceid, - const char *buffer, - size_t buffer_size, - mius_data_push_t data_source) -{ - size_t available_space; - size_t space_required; - size_t zeros_to_pad; - unsigned int copied_from_user; - int copy_from_user_result; - int err; - int i; - int i_max; - - unsigned long flags; - struct mius_device *device; - struct mius_data *mius_data; - unsigned int fifo_result; - static uint8_t zero_pad_buffer[MIUS_MSG_BUF_SIZE]; - - err = 0; - fifo_result = 0; - copied_from_user = 0; - copy_from_user_result = 0; - if (buffer_size > MIUS_MSG_BUF_SIZE) - return -EINVAL; - - zeros_to_pad = MIUS_MSG_BUF_SIZE - buffer_size; - - i = 0; - i_max = MIUS_NUM_DEVICES; - - if (deviceid != MIUS_ALL_DEVICES) { - /* Copy to specific device */ - i = deviceid; - i_max = i + 1; - } - - for (; i < i_max; ++i) { - device = &mius_devices[i]; - mius_data = &device->el_data; - - if ((!device->opened)) - continue; - - available_space = kfifo_avail(&mius_data->fifo_isr); - space_required = MIUS_MSG_BUF_SIZE; - - spin_lock_irqsave(&mius_data->fifo_isr_spinlock, flags); - - if (available_space < space_required) { - - ++mius_data->isr_fifo_discard; - mius_data_isr_fifo_pop(mius_data, - MIUS_MSG_BUF_SIZE); - } - - if (data_source == MIUS_DATA_PUSH_FROM_KERNEL) { - fifo_result = kfifo_in(&mius_data->fifo_isr, - buffer, buffer_size); - - if (fifo_result == 0) { - spin_unlock_irqrestore( - &mius_data->fifo_isr_spinlock, - flags); - continue; - } - } else if (data_source == MIUS_DATA_PUSH_FROM_USERSPACE) { - copy_from_user_result = kfifo_from_user( - &mius_data->fifo_isr, buffer, - buffer_size, &copied_from_user); - - if (-EFAULT == copy_from_user_result) { - spin_unlock_irqrestore( - &mius_data->fifo_isr_spinlock, - flags); - continue; - } - } - - - if (zeros_to_pad > 0) { - fifo_result = kfifo_in( - &mius_data->fifo_isr, zero_pad_buffer, - zeros_to_pad); - - if (fifo_result == 0) { - mius_data_isr_fifo_pop(mius_data, - buffer_size); - - spin_unlock_irqrestore( - &mius_data->fifo_isr_spinlock, - flags); - - ++mius_data->isr_fifo_discard; - continue; - } - } - - - ++mius_data->isr_write_total; - spin_unlock_irqrestore( - &mius_data->fifo_isr_spinlock, flags); - wake_up_interruptible(&mius_data->fifo_isr_not_empty); - __pm_wakeup_event(wake_source, mius_data->wakeup_timeout); - } - - return err; -} - -int mius_open_port(int portid) -{ - return mius_io_open_port(portid); -} - -int mius_close_port(int portid) -{ - return mius_io_close_port(portid); -} - - -int32_t mius_data_write(uint32_t message_id, - const char *data, size_t data_size) -{ - int32_t err_dsp; - /* int32_t err_us; */ - - err_dsp = 0; - err_dsp = mius_data_io_write(message_id, data, data_size); - if (err_dsp) - MI_PRINT_E("Failed write to DSP"); - return err_dsp; - - /* - * err_us = 0; - * err_us = mius_userspace_ctrl_write(message_id, data, data_size); - * if(err_us){ - * MI_PRINT_E("Failed write to user space"); - *} - * - *return (err_dsp | err_us); - */ -} - - - -/** -* -* @return Number of bytes read. -*/ -static ssize_t device_read(struct file *fp, char __user *buff, - size_t length, loff_t *ppos) -{ - ssize_t bytes_read = 0; - struct mius_device *mius_device; - struct mius_data *mius_data; - - mius_device = (struct mius_device *)fp->private_data; - mius_data = (struct mius_data *)&mius_device->el_data; - - bytes_read = mius_data_pop(mius_data, buff, length); - - return bytes_read; -} - -/** -* -* @return number of bytes actually written -*/ -static ssize_t device_write(struct file *fp, const char *buff, - size_t length, loff_t *ppos) -{ - ssize_t ret_val; - - ret_val = 0; - if ((buff != NULL) && (length != 0)) - ret_val = mius_data_io_write(MIUS_ULTRASOUND_SET_PARAMS, - buff, length); - - return ret_val >= 0 ? (ssize_t)length : 0; -} - - -static long device_ioctl(struct file *fp, unsigned int number, - unsigned long param) -{ - struct mius_device *device; - struct mius_data *mius_data; - int err; - unsigned int mirror_tag, mirror_payload_size; - unsigned char *data_ptr; - - device = (struct mius_device *)(fp->private_data); - mius_data = &device->el_data; - - switch (number) { - case IOCTL_MIUS_DATA_IO_CANCEL: - MI_PRINT_D("IOCTL_MIUS_CANCEL_READ %ld", - param); - mius_data_cancel(mius_data); - break; - - case IOCTL_MIUS_DATA_IO_MIRROR: - data_ptr = (unsigned char *)param; - mirror_tag = *(unsigned int *)data_ptr; - mirror_payload_size = *((unsigned int *)data_ptr + 1); - - if ((mirror_tag == MIRROR_TAG) && - (mirror_payload_size != 0) && - (mirror_payload_size <= - (MIUS_SET_PARAMS_SIZE * 4))) { - - err = mius_data_io_write( - MIUS_ULTRASOUND_SET_PARAMS, - (data_ptr + 8), mirror_payload_size); - - if (err != 0) { - MI_PRINT_E("mius_data_io_write failed"); - return err; - } - - } else { - MI_PRINT_E("TAG or Length is not valid"); - } - - break; - - default: - MI_PRINT_W("UNKNOWN IOCTL number=%d", number); - break; - } - - return 0; -} - - -static unsigned int device_poll(struct file *file, - struct poll_table_struct *poll_table) -{ - unsigned int mask; - - struct mius_device *device; - struct mius_data *mius_data; - - mask = 0; - device = (struct mius_device *)file->private_data; - mius_data = (struct mius_data *)&device->el_data; - - poll_wait(file, &mius_data->fifo_isr_not_empty, poll_table); - - if (!kfifo_is_empty(&mius_data->fifo_isr)) - mask = POLLIN | POLLRDNORM; - - return mask; -} - - -static int device_close(struct inode *inode, struct file *filp) -{ - struct mius_device *device; - struct mius_data *mius_data; - unsigned int minor; - - device = filp->private_data; - mius_data = &device->el_data; - minor = iminor(inode); - if (device == NULL) { - MI_PRINT_E("device not found"); - return -ENODEV; - } - - device->opened = 0; - mius_data_update_debug_counters(mius_data); - mius_data_print_debug_counters(mius_data); - mius_data_cancel(mius_data); - up(&device->sem); - - MI_PRINT_I("Closed device mius%u", minor); - return 0; -} - -/* defines the file operations provided by the driver */ -static const struct file_operations mius_fops = { - .owner = THIS_MODULE, /* prevents unloading when operations are in use*/ - .open = device_open, /*to open the device*/ - .write = device_write, /*to write to the device*/ - .read = device_read, /*to read the device*/ - .poll = device_poll, - .unlocked_ioctl = device_ioctl, /* IOCTL calls */ - .release = device_close, /*to close the device*/ -}; - - -static int mius_device_initialize(struct mius_device - *mius_device, int minor, struct class *class) -{ - int err; - dev_t device_number; - struct device *device; - - BUG_ON(mius_device == NULL || class == NULL); - - err = 0; - device = NULL; - device_number = MKDEV(mius_major, minor); - /* Memory is to be allocated when the device is opened the first time */ - sema_init(&mius_device->sem, 1); - cdev_init(&mius_device->cdev, &mius_fops); - mius_device->cdev.owner = THIS_MODULE; - - err = cdev_add(&mius_device->cdev, device_number, 1); - - if (err) { - MI_PRINT_E("error %d while trying to add %s%d", - err, MIUS_DEVICENAME, minor); - return err; - } - - device = device_create(class, NULL, device_number, - NULL, MIUS_DEVICENAME "%d", minor); - - if (IS_ERR(device)) { - err = PTR_ERR(device); - MI_PRINT_E("error %d while trying to create %s%d", - err, MIUS_DEVICENAME, minor); - cdev_del(&mius_device->cdev); - return err; - } - - if (err) { - MI_PRINT_E("failed device initialize"); - return err; - } - - return 0; -} - -static void mius_device_cleanup(struct mius_device *dev, int minor, - struct class *class) - -{ - BUG_ON(dev == NULL || class == NULL); - device_destroy(class, MKDEV(mius_major, minor)); - cdev_del(&dev->cdev); - up(&dev->sem); -} - -static void mius_driver_cleanup(int devices_to_destroy) -{ - int i; - - if (mius_devices) { - mius_data_io_cleanup(); - - for (i = 0; i < devices_to_destroy; ++i) { - mius_data_cleanup(&mius_devices[i].el_data); - mius_device_cleanup( - &mius_devices[i], i, mius_class); - } - - kfree(mius_devices); - } - - if (mius_class) - class_destroy(mius_class); - - unregister_chrdev_region( - MKDEV(mius_major, 0), MIUS_NUM_DEVICES); -} - - - -#ifdef MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM - -#define MIUS_CALIBRATION_MAX_DATA_SIZE (MIUS_CALIBRATION_V2_DATA_SIZE + MIUS_CALIBRATION_DATA_SIZE) -static unsigned char calibration_data[MIUS_CALIBRATION_MAX_DATA_SIZE]; -static char *calibration_filename = "/persist/audio/mius_calibration"; - -/* function to load the calibration from a file (if possible) */ -static size_t load_calibration_data(char *filename) -{ - size_t ret = 0; - int fd; - - mm_segment_t old_fs = get_fs(); - - set_fs(KERNEL_DS); - - fd = sys_open(filename, O_RDONLY, 0); - if (fd >= 0) { - size_t bytes_read = sys_read(fd, calibration_data, MIUS_CALIBRATION_MAX_DATA_SIZE); - - if (bytes_read == MIUS_CALIBRATION_DATA_SIZE || - bytes_read == MIUS_CALIBRATION_V2_DATA_SIZE) { - ret = bytes_read; - } - sys_close(fd); - } - set_fs(old_fs); - return ret; -} - -static int32_t mius_send_calibration_to_engine(size_t calib_data_size) -{ - mius_set_calibration_data(calibration_data, calib_data_size); - return mius_data_write( - MIUS_ULTRASOUND_SET_PARAMS, - (const char *)calibration_data, calib_data_size); -} - -#endif - - -int __init mius_driver_init(void) -{ - int err; - int i; - int devices_to_destroy; - dev_t device_number; - - err = alloc_chrdev_region(&device_number, 0, MIUS_NUM_DEVICES, - MIUS_DEVICENAME); - - devices_to_destroy = 0; - - if (err < 0) { - MI_PRINT_E("Failed to allocate cdev region"); - return err; - } - - mius_major = MAJOR(device_number); - mius_class = class_create(THIS_MODULE, "mius_chardev"); - - if (mius_class == NULL) { - MI_PRINT_E("Class creation failed"); - goto fail; - } - - err = mius_initialize_sysfs(); - - if (err) - goto fail; - - mius_devices = (struct mius_device *) - kzalloc(sizeof(struct mius_device) * MIUS_NUM_DEVICES, - GFP_KERNEL); - - if (mius_devices == NULL) { - err = -ENOMEM; - goto fail; - } - - - for (i = 0; i < MIUS_NUM_DEVICES; ++i) { - if (mius_device_initialize(&mius_devices[i], i, - mius_class)) { - devices_to_destroy = i; - goto fail; - } - - if (mius_data_initialize(&mius_devices[i].el_data, - MIUS_DATA_FIFO_SIZE, MIUS_WAKEUP_TIMEOUT, i)) { - goto fail; - } - } - - if (mius_data_io_initialize()) - goto fail; - - if (mius_userspace_io_driver_init()) - goto fail; - - - if (mius_userspace_ctrl_driver_init()) - goto fail; - - wake_source = kmalloc(sizeof(struct wakeup_source), GFP_KERNEL); - - if (!wake_source) { - MI_PRINT_E("failed to allocate wake source"); - return -ENOMEM; - } - - wakeup_source_init(wake_source, "mius_wake_source"); - -#ifdef MIUS_LOAD_CALIBRATION_DATA_FROM_FILESYSTEM - /* Code to send calibration to engine */ - { - size_t calib_data_size = load_calibration_data(calibration_filename); - if (calib_data_size > 0) - mius_send_calibration_to_engine(calib_data_size); - } -#endif - return 0; - -fail: - mius_driver_cleanup(devices_to_destroy); - return err; -} - -void mius_driver_exit(void) -{ - if (wake_source) { - wakeup_source_trash(wake_source); - kfree(wake_source); - } - - mius_cleanup_sysfs(); - mius_driver_cleanup(MIUS_NUM_DEVICES); - mius_userspace_io_driver_exit(); - mius_userspace_ctrl_driver_exit(); -} - -MODULE_AUTHOR("MI"); -MODULE_DESCRIPTION("Providing Interface to UPS data"); -MODULE_LICENSE("GPL"); diff --git a/techpack/audio/dsp/mius/mius_mixer_controls.c b/techpack/audio/dsp/mius/mius_mixer_controls.c deleted file mode 100644 index e1529eb544eb..000000000000 --- a/techpack/audio/dsp/mius/mius_mixer_controls.c +++ /dev/null @@ -1,1342 +0,0 @@ -/** - * MI - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -struct mius_system_configuration { - union { - uint8_t reserved[MIUS_SYSTEM_CONFIGURATION_SIZE]; - }; -}; - -struct mius_system_configuration mius_system_configuration; - - -struct mius_system_configuration_parameter { - enum mius_system_configuration_parameter_type type; - union { - int32_t speaker_scaling[2]; - int32_t sensitivity; - int32_t latency; - int32_t microphone_index; - int32_t operation_mode; - int32_t operation_mode_flags; - int32_t component_gain_change; - int32_t calibration_state; - int32_t engine_version; - int32_t calibration_profile; - int32_t ultrasound_gain; - int32_t log_level; - int32_t custom_setting; - int32_t engine_suspend; - int32_t input_enabled; - int32_t output_enabled; - int32_t external_event; - struct { - int32_t calibration_method; - int32_t calibration_timestamp; - }; - int32_t debug_mode; - int32_t context; - int32_t capture; - int32_t input_channels; - }; -}; - -struct mius_system_configuration_parameters_cache - mius_system_configuration_cache = { {0}, 0 }; - -static struct mius_engine_version_info - mius_engine_version_cache = { 0xde, 0xad, 0xbe, 0xef }; - -struct mius_engine_calibration_data { - union { - uint8_t reserved[MIUS_CALIBRATION_DATA_SIZE]; - }; -}; - -static struct mius_engine_calibration_data - mius_engine_calibration_data_cache = { .reserved = { - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef } }; - -struct mius_engine_calibration_v2_data { - union { - uint8_t reserved[MIUS_CALIBRATION_V2_DATA_SIZE]; - }; -}; - -static struct mius_engine_calibration_v2_data - mius_engine_calibration_v2_data_cache = { .reserved = { - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, - -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, -0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, -0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, -0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, -} }; - -struct mius_engine_diagnostics_data { - union { - uint8_t reserved[MIUS_DIAGNOSTICS_DATA_SIZE]; - uint32_t values32[MIUS_DIAGNOSTICS_DATA_SIZE >> 2]; - }; -}; - -static struct mius_engine_diagnostics_data - mius_engine_diagnostics_data_cache = { .reserved = {0} }; - -struct mius_engine_ml_data { - union { - uint8_t reserved[MIUS_ML_DATA_SIZE]; - uint32_t u32[MIUS_ML_DATA_SIZE >> 2]; - }; -}; - -static struct mius_engine_ml_data - mius_engine_ml_data_cache - = { .reserved = {0} }; - -struct mius_engine_sensor_data { - union { - uint8_t reserved[MIUS_SENSOR_DATA_SIZE]; - uint32_t values32[MIUS_SENSOR_DATA_SIZE >> 2]; - }; -}; - -static struct mius_engine_sensor_data - mius_engine_sensor_data_cache = { .reserved = {0} }; - -struct mius_engine_branch_info { - char build_branch[MIUS_BRANCH_INFO_MAX_SIZE]; -}; - -static struct mius_engine_branch_info - mius_engine_branch_cache = { { 0 } }; - -struct mius_engine_tag_info { - char engine_tag[MIUS_TAG_INFO_SIZE]; -}; - -static struct mius_engine_tag_info - mius_engine_tag_cache = { { 0 } }; - -static struct mius_shared_data_block shared_data_blocks[] = { - { MIUS_OBJ_ID_CALIBRATION_DATA, MIUS_CALIBRATION_DATA_SIZE, - &mius_engine_calibration_data_cache }, - - { MIUS_OBJ_ID_VERSION_INFO, MIUS_VERSION_INFO_SIZE, - &mius_engine_version_cache }, - { MIUS_OBJ_ID_BRANCH_INFO, MIUS_BRANCH_INFO_MAX_SIZE, - &mius_engine_branch_cache }, - { MIUS_OBJ_ID_CALIBRATION_V2_DATA, - MIUS_CALIBRATION_V2_DATA_SIZE, - &mius_engine_calibration_v2_data_cache }, - { MIUS_OBJ_ID_DIAGNOSTICS_DATA, MIUS_DIAGNOSTICS_DATA_SIZE, - &mius_engine_diagnostics_data_cache }, - { MIUS_OBJ_ID_TAG_INFO, MIUS_TAG_INFO_SIZE, - &mius_engine_tag_cache }, - { MIUS_OBJ_ID_ML_DATA, - MIUS_ML_DATA_SIZE, - &mius_engine_ml_data_cache }, -}; - -void mius_set_calibration_data(uint8_t *calib_data, size_t size) -{ - struct mius_shared_data_block *calibration_obj = NULL; - - if (size == MIUS_CALIBRATION_DATA_SIZE) { - calibration_obj = mius_get_shared_obj( - MIUS_OBJ_ID_CALIBRATION_DATA); - memcpy((uint8_t *)&mius_engine_calibration_data_cache, - calib_data, size); - } - if (size == MIUS_CALIBRATION_V2_DATA_SIZE) { - calibration_obj = mius_get_shared_obj( - MIUS_OBJ_ID_CALIBRATION_V2_DATA); - memcpy((uint8_t *)&mius_engine_calibration_v2_data_cache, - calib_data, size); - } - if (calibration_obj == NULL) { - MI_PRINT_E( - "ell..set_calibration_data() calib=NULL (%zu)", size); - return; - } - memcpy((u8 *)calibration_obj->buffer, calib_data, size); -} - -void mius_set_diagnostics_data(uint8_t *diag_data, size_t size) -{ - struct mius_shared_data_block *diagnostics_obj = NULL; - - if (size <= MIUS_DIAGNOSTICS_DATA_SIZE) { - diagnostics_obj = - mius_get_shared_obj( - MIUS_OBJ_ID_DIAGNOSTICS_DATA); - if (diagnostics_obj == NULL) { - MI_PRINT_E("el..set_diagnostics_data() NULL (%zu)", - size); - return; - } - memcpy((uint8_t *)&mius_engine_diagnostics_data_cache, - diag_data, size); - memcpy((u8 *)diagnostics_obj->buffer, diag_data, size); - } -} - -static const size_t NUM_SHARED_RW_OBJS = - sizeof(shared_data_blocks) / sizeof(struct mius_shared_data_block); - -struct mius_shared_data_block *mius_get_shared_obj(uint32_t - object_id) { - - size_t i; - - for (i = 0; i < NUM_SHARED_RW_OBJS; ++i) { - if (shared_data_blocks[i].object_id == object_id) - return &shared_data_blocks[i]; - } - - return NULL; -} - - -static const char * const ultrasound_enable_texts[] = {"Off", "On"}; - -static const struct soc_enum mius_enum[] = { - SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ultrasound_enable_texts), - ultrasound_enable_texts), -}; - -int get_mius_calibration_data(uint8_t *caldata, uint32_t max_size) -{ - uint32_t copied; - - copied = MIUS_CALIBRATION_DATA_SIZE; - if (max_size < MIUS_CALIBRATION_DATA_SIZE) { - copied = max_size; - MI_PRINT_D("size mismatch : %u vs %u", - (uint32_t)MIUS_CALIBRATION_DATA_SIZE, max_size); - } - - memcpy(caldata, (uint8_t *)&mius_engine_calibration_data_cache, - max_size); - return copied; -} - -int get_mius_calibration_v2_data(uint8_t *caldata, uint32_t max_size) -{ - uint32_t copied; - - copied = MIUS_CALIBRATION_V2_DATA_SIZE; - if (max_size < MIUS_CALIBRATION_V2_DATA_SIZE) { - copied = max_size; - MI_PRINT_D("size mismatch : %u vs %u", - (uint32_t)MIUS_CALIBRATION_V2_DATA_SIZE, max_size); - } - - memcpy(caldata, (uint8_t *)&mius_engine_calibration_v2_data_cache, - max_size); - return copied; -} - -int get_mius_diagnostics_data(uint8_t *diagdata, uint32_t max_size) -{ - uint32_t copied; - - copied = MIUS_DIAGNOSTICS_DATA_SIZE; - if (max_size < MIUS_DIAGNOSTICS_DATA_SIZE) { - copied = max_size; - MI_PRINT_D("size mismatch : %u vs %u", - (uint32_t)MIUS_DIAGNOSTICS_DATA_SIZE, max_size); - } - - memcpy(diagdata, (uint8_t *)&mius_engine_diagnostics_data_cache, - max_size); - return copied; -} - - -static uint32_t ultrasound_enable_cache; - -int mius_ultrasound_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = ultrasound_enable_cache; - return 0; -} - -int mius_ultrasound_enable_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - static bool triggered_engine_info; - int32_t msg[4] = {0, 0, 0, 0}; - - ultrasound_enable_cache = ucontrol->value.integer.value[0]; - - if (!triggered_engine_info && ultrasound_enable_cache) { - triggered_engine_info = true; - mius_trigger_version_msg(); - mius_trigger_branch_msg(); - mius_trigger_tag_msg(); - } - - msg[0] = ultrasound_enable_cache ? 1 : 0; - - return mius_data_write( - MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -static uint32_t ultrasound_tx_port_cache; - -int mius_ultrasound_tx_port_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = ultrasound_tx_port_cache; - return 0; -} - -int mius_ultrasound_tx_port_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret; - - if (ultrasound_tx_port_cache == ucontrol->value.integer.value[0]) { - MI_PRINT_E("ultrasound_tx_port_set: ignoring duplicate request"); - return 0; - } - - ultrasound_tx_port_cache = ucontrol->value.integer.value[0]; - printk(KERN_DEBUG "[MIUS] Via ULTRASOUND_TX_PORT_ID enable=%d", ultrasound_tx_port_cache); - if (ultrasound_tx_port_cache) - ret = mius_open_port(ULTRASOUND_TX_PORT_ID); - else - ret = mius_close_port(ULTRASOUND_TX_PORT_ID); - - MI_PRINT_E("ultrasound_tx_port: enable=%d ret=%d", - ultrasound_tx_port_cache, ret); - - return ret; -} - -static uint32_t ultrasound_rx_port_cache; - -int mius_ultrasound_rx_port_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = ultrasound_rx_port_cache; - return 0; -} - -int mius_ultrasound_rx_port_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret; - - if (ultrasound_rx_port_cache == ucontrol->value.integer.value[0]) { - MI_PRINT_E("mi ultrasound_rx_port_set: ignoring duplicate request"); - return 0; - } - - ultrasound_rx_port_cache = ucontrol->value.integer.value[0]; - printk(KERN_DEBUG "[MIUS] if we are here, it is wrong for mius, enable=%d", - ultrasound_rx_port_cache); - if (ultrasound_rx_port_cache) - ret = mius_open_port(ULTRASOUND_RX_PORT_ID); - else - ret = mius_close_port(ULTRASOUND_RX_PORT_ID); - - MI_PRINT_E("mi ultrasound_rx_port: enable=%d ret=%d", - ultrasound_rx_port_cache, ret); - - return 0; -} - -int mius_ultrasound_rampdown_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* Rampdown is a strobe, so always return Off */ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -int mius_ultrasound_rampdown_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t msg[4] = {-1, 0, 0, 0}; - - if (ucontrol->value.integer.value[0] == 0) - return 0; - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int mius_ultrasound_diagnostics_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - /* Diagnostics is a strobe, so always return Off */ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -int mius_ultrasound_request_diagnostics(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int32_t msg[3] = {MSC_ENGINE_DIAGNOSTICS, 0, 0}; - - if (ucontrol->value.integer.value[0] == 0) - return 0; - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int mius_system_configuration_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &mius_system_configuration, - MIUS_SYSTEM_CONFIGURATION_SIZE); - return 0; -} - -int mius_system_configuration_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&mius_system_configuration, ucontrol->value.bytes.data, - MIUS_SYSTEM_CONFIGURATION_SIZE); - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)&mius_system_configuration, - MIUS_SYSTEM_CONFIGURATION_SIZE); -} - -int mius_calibration_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, - &mius_engine_calibration_data_cache, - MIUS_CALIBRATION_DATA_SIZE); - return 0; -} - -int mius_calibration_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&mius_engine_calibration_data_cache, - ucontrol->value.bytes.data, MIUS_CALIBRATION_DATA_SIZE); - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)&mius_engine_calibration_data_cache, - MIUS_CALIBRATION_DATA_SIZE); -} - -int mius_calibration_v2_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct mius_shared_data_block *calibration_obj = - mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_V2_DATA); - - if (calibration_obj == NULL) { - MI_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - memcpy(ucontrol->value.bytes.data, - calibration_obj->buffer, - MIUS_CALIBRATION_V2_DATA_SIZE); - return 0; -} - -int mius_calibration_v2_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&mius_engine_calibration_v2_data_cache, - ucontrol->value.bytes.data, MIUS_CALIBRATION_V2_DATA_SIZE); - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)&mius_engine_calibration_v2_data_cache, - MIUS_CALIBRATION_V2_DATA_SIZE); -} - -int mius_diagnostics_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, - &mius_engine_diagnostics_data_cache, - MIUS_DIAGNOSTICS_DATA_SIZE); - return 0; -} - -int mius_diagnostics_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int mius_ml_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct mius_shared_data_block *ml_obj = - mius_get_shared_obj(MIUS_OBJ_ID_ML_DATA); - - if (ml_obj == NULL) { - MI_PRINT_E("ml_obj is NULL"); - return -EINVAL; - } - - memcpy(ucontrol->value.bytes.data, - ml_obj->buffer, - MIUS_ML_DATA_SIZE); - return 0; -} - -int mius_ml_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)ucontrol->value.bytes.data, - MIUS_ML_DATA_SIZE); -} - -int mius_sensor_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, - &mius_engine_sensor_data_cache, - MIUS_SENSOR_DATA_SIZE); - return 0; -} - -int mius_sensor_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(&mius_engine_sensor_data_cache, - ucontrol->value.bytes.data, MIUS_SENSOR_DATA_SIZE); - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)&mius_engine_sensor_data_cache, - MIUS_SENSOR_DATA_SIZE); -} - -int mius_version_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &mius_engine_version_cache, - MIUS_VERSION_INFO_SIZE); - return 0; -} - -int mius_version_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int mius_branch_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &mius_engine_branch_cache, - MIUS_BRANCH_INFO_MAX_SIZE); - return 0; -} - -int mius_branch_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int mius_tag_data_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - memcpy(ucontrol->value.bytes.data, &mius_engine_tag_cache, - MIUS_TAG_INFO_SIZE); - return 0; -} - -int mius_tag_data_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -int mius_calibration_param_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - if (mc->reg != MIUS_CALIBRATION) - return -EINVAL; - - switch (mc->shift) { - case MIUS_CALIBRATION_STATE: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.calibration_state; - break; - - case MIUS_CALIBRATION_PROFILE: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.calibration_profile; - break; - - case MIUS_ULTRASOUND_GAIN: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.ultrasound_gain; - break; - - default: - return -EINVAL; - } - - return 1; -} - -int mius_calibration_param_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct mius_system_configuration_parameter param; - - if (mc->reg != MIUS_CALIBRATION) - return -EINVAL; - - switch (mc->shift) { - case MIUS_CALIBRATION_STATE: - mius_system_configuration_cache.calibration_state = - ucontrol->value.integer.value[0]; - - param.type = MSC_CALIBRATION_STATE; - param.calibration_state = - mius_system_configuration_cache.calibration_state; - break; - - case MIUS_CALIBRATION_PROFILE: - mius_system_configuration_cache.calibration_profile = - ucontrol->value.integer.value[0]; - - param.type = MSC_CALIBRATION_PROFILE; - param.calibration_profile = - mius_system_configuration_cache.calibration_profile; - break; - - case MIUS_ULTRASOUND_GAIN: - mius_system_configuration_cache.ultrasound_gain = - ucontrol->value.integer.value[0]; - param.type = MSC_ULTRASOUND_GAIN; - param.ultrasound_gain = - mius_system_configuration_cache.ultrasound_gain; - break; - - default: - return -EINVAL; - } - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (u8 *)¶m, sizeof(param)); -} - -int mius_system_configuration_param_get( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - - pr_err("%s: reg: %d shift: %d\n", __func__, mc->reg, mc->shift); - - if (mc->reg != MIUS_SYSTEM_CONFIGURATION) - return -EINVAL; - - if (mc->shift >= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && - mc->shift <= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ - MI_PRINT_E("get MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_%02d", - mc->shift - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0); - ucontrol->value.integer.value[0] = 0; - return 1; - } - - switch (mc->shift) { - case MIUS_SYSTEM_CONFIGURATION_LATENCY: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.latency; - break; - - case MIUS_SYSTEM_CONFIGURATION_SENSITIVITY: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.sensitivity; - break; - - case MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.speaker_scaling[0]; - ucontrol->value.integer.value[1] = - mius_system_configuration_cache.speaker_scaling[1]; - break; - - case MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.microphone_index; - break; - - case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.operation_mode; - break; - - case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.operation_mode_flags; - break; - - case MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.log_level; - break; - case MIUS_SYSTEM_CONFIGURATION_SUSPEND: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.engine_suspend; - break; - case MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.input_enabled; - break; - case MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.output_enabled; - break; - case MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.external_event; - break; - case MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.calibration_method; - case MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.debug_mode; - break; - case MIUS_SYSTEM_CONFIGURATION_CONTEXT: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.context; - break; - case MIUS_SYSTEM_CONFIGURATION_CAPTURE: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.capture; - break; - case MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS: - ucontrol->value.integer.value[0] = - mius_system_configuration_cache.input_channels; - break; - - default: - MI_PRINT_E("Invalid mixer control"); - return -EINVAL; - } - - return 1; -} - - - -int mius_system_configuration_param_put( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kcontrol->private_value; - struct mius_system_configuration_parameter param; - struct timeval tv; - - if (mc->reg != MIUS_SYSTEM_CONFIGURATION) - return -EINVAL; - - if (mc->shift >= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 && - mc->shift <= MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15){ - const size_t csi = - mc->shift - - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0; - MI_PRINT_E("MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_XX csi:%zu", csi); - if (csi >= - ARRAY_SIZE(mius_system_configuration_cache.custom_settings)) - return -EINVAL; - MI_PRINT_E("ucontrol->value.integer.value[0]:%ld", ucontrol->value.integer.value[0]); - mius_system_configuration_cache.custom_settings[csi] = - ucontrol->value.integer.value[0]; - param.type = MSC_ENGINE_CUSTOM_SETTING_0 + csi; - param.custom_setting = ucontrol->value.integer.value[0]; - MI_PRINT_E("calling mius_data_write(custom_setting) csi:%zu", csi); - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)¶m, sizeof(param)); - } - - - switch (mc->shift) { - case MIUS_SYSTEM_CONFIGURATION_LATENCY: - mius_system_configuration_cache.latency = - ucontrol->value.integer.value[0]; - param.type = MSC_LATENCY; - param.latency = mius_system_configuration_cache.latency; - break; - - case MIUS_SYSTEM_CONFIGURATION_SENSITIVITY: - mius_system_configuration_cache.sensitivity = - ucontrol->value.integer.value[0]; - param.type = MSC_CHANNEL_SENSITIVITY; - param.sensitivity = - mius_system_configuration_cache.sensitivity; - break; - - case MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING: - mius_system_configuration_cache.speaker_scaling[0] = - ucontrol->value.integer.value[0]; - mius_system_configuration_cache.speaker_scaling[1] = - ucontrol->value.integer.value[1]; - param.type = MSC_SPEAKER_SCALING; - param.speaker_scaling[0] = - mius_system_configuration_cache.speaker_scaling[0]; - param.speaker_scaling[1] = - mius_system_configuration_cache.speaker_scaling[1]; - break; - - case MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX: - mius_system_configuration_cache.microphone_index = - ucontrol->value.integer.value[0]; - param.type = MSC_MICROPHONE_INDEX; - param.microphone_index = - mius_system_configuration_cache.microphone_index; - break; - - case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE: - mius_system_configuration_cache.operation_mode = - ucontrol->value.integer.value[0]; - param.type = MSC_OPERATION_MODE; - param.operation_mode = - mius_system_configuration_cache.operation_mode; - break; - - case MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS: - mius_system_configuration_cache.operation_mode_flags = - ucontrol->value.integer.value[0]; - param.type = MSC_OPERATION_MODE_FLAGS; - param.operation_mode_flags = - mius_system_configuration_cache.operation_mode_flags; - break; - - case MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL: - mius_system_configuration_cache.log_level = - ucontrol->value.integer.value[0]; - param.type = MSC_LOG_LEVEL; - param.log_level = - mius_system_configuration_cache.log_level; - break; - case MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED: - mius_system_configuration_cache.input_enabled = - ucontrol->value.integer.value[0]; - param.type = MSC_INPUT_ENABLED; - param.input_enabled = - mius_system_configuration_cache.input_enabled; - break; - case MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED: - mius_system_configuration_cache.output_enabled = - ucontrol->value.integer.value[0]; - param.type = MSC_OUTPUT_ENABLED; - param.output_enabled = - mius_system_configuration_cache.output_enabled; - break; - case MIUS_SYSTEM_CONFIGURATION_SUSPEND: - mius_system_configuration_cache.engine_suspend = - ucontrol->value.integer.value[0]; - param.type = MSC_SUSPEND; - param.engine_suspend = - mius_system_configuration_cache.engine_suspend; - break; - case MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT: - mius_system_configuration_cache.external_event = - ucontrol->value.integer.value[0]; - param.type = MSC_EXTERNAL_EVENT; - param.external_event = - mius_system_configuration_cache.external_event; - break; - case MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD: - mius_system_configuration_cache.calibration_method = - ucontrol->value.integer.value[0]; - param.type = MSC_CALIBRATION_METHOD; - param.calibration_method = - mius_system_configuration_cache.calibration_method; - do_gettimeofday(&tv); - param.calibration_timestamp = (int32_t)tv.tv_sec; - break; - case MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE: - mius_system_configuration_cache.debug_mode = - ucontrol->value.integer.value[0]; - param.type = MSC_DEBUG_MODE; - param.debug_mode = - mius_system_configuration_cache.debug_mode; - break; - case MIUS_SYSTEM_CONFIGURATION_CONTEXT: - mius_system_configuration_cache.context = - ucontrol->value.integer.value[0]; - param.type = MSC_CONTEXT; - param.context = - mius_system_configuration_cache.context; - break; - case MIUS_SYSTEM_CONFIGURATION_CAPTURE: - mius_system_configuration_cache.capture = - ucontrol->value.integer.value[0]; - param.type = MSC_CAPTURE; - param.context = - mius_system_configuration_cache.capture; - break; - case MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS: - mius_system_configuration_cache.input_channels = - ucontrol->value.integer.value[0]; - param.type = MSC_INPUT_CHANNELS; - param.context = - mius_system_configuration_cache.input_channels; - break; - - default: - return -EINVAL; - } - - return mius_data_write(MIUS_ULTRASOUND_SET_PARAMS, - (const char *)¶m, sizeof(param)); -} - - -static const struct snd_kcontrol_new ultrasound_filter_mixer_controls[] = { - SOC_ENUM_EXT("Mi_Ultrasound Enable", - mius_enum[0], - mius_ultrasound_enable_get, - mius_ultrasound_enable_set), - SOC_ENUM_EXT("Mi_Ultrasound RampDown", - mius_enum[0], - mius_ultrasound_rampdown_get, - mius_ultrasound_rampdown_set), - SOC_SINGLE_EXT("Mi_Ultrasound Latency", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_LATENCY, - 10000, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Sensitivity", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_SENSITIVITY, - 1000000, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_DOUBLE_EXT("Mi_Ultrasound Speaker Scaling", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING, - 0, - 1000000, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Microphone Index", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX, - 20, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Mode", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE, - 255, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Mode Flags", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS, - 256, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Calibration Profile", - MIUS_CALIBRATION, - MIUS_CALIBRATION_PROFILE, - 256, - 0, - mius_calibration_param_get, - mius_calibration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Gain", - MIUS_CALIBRATION, - MIUS_ULTRASOUND_GAIN, - 256, - 0, - mius_calibration_param_get, - mius_calibration_param_put), - - SOC_SINGLE_EXT("Mi_Ultrasound Calibration State", - MIUS_CALIBRATION, - MIUS_CALIBRATION_STATE, - 256, - 0, - mius_calibration_param_get, - mius_calibration_param_put), - - SND_SOC_BYTES_EXT("Mi_Ultrasound System Configuration", - MIUS_SYSTEM_CONFIGURATION_SIZE, - mius_system_configuration_get, - mius_system_configuration_put), - SND_SOC_BYTES_EXT("Mi_Ultrasound Calibration Data", - MIUS_CALIBRATION_DATA_SIZE, - mius_calibration_data_get, - mius_calibration_data_put), - SND_SOC_BYTES_EXT("Mi_Ultrasound Version", - MIUS_VERSION_INFO_SIZE, - mius_version_data_get, - mius_version_data_put), - SND_SOC_BYTES_EXT("Mi_Ultrasound Branch", - MIUS_BRANCH_INFO_MAX_SIZE, - mius_branch_data_get, - mius_branch_data_put), - SND_SOC_BYTES_EXT("Mi_Ultrasound Tag", - MIUS_TAG_INFO_SIZE, - mius_tag_data_get, - mius_tag_data_put), - SOC_SINGLE_EXT("Mi_Ultrasound Log Level", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL, - 7, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - - SND_SOC_BYTES_EXT("Mi_Ultrasound Calibration Ext Data", - MIUS_CALIBRATION_V2_DATA_SIZE, - mius_calibration_v2_data_get, - mius_calibration_v2_data_put), - - SND_SOC_BYTES_EXT("Mi_Ultrasound Diagnostics Data", - MIUS_DIAGNOSTICS_DATA_SIZE, - mius_diagnostics_data_get, - mius_diagnostics_data_put), - - SOC_ENUM_EXT("Mi_Ultrasound Diagnostics Request", - mius_enum[0], - mius_ultrasound_diagnostics_get, - mius_ultrasound_request_diagnostics), - - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 0", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 1", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 2", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 3", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 4", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 5", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 6", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 7", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 8", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 9", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 10", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 11", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 12", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 13", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 14", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Custom Setting 15", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15, - MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_ENUM_EXT("Mi_Ultrasound Tx Port", - mius_enum[0], - mius_ultrasound_tx_port_get, - mius_ultrasound_tx_port_set), - SOC_ENUM_EXT("Mi_Ultrasound Rx Port", - mius_enum[0], - mius_ultrasound_rx_port_get, - mius_ultrasound_rx_port_set), - SOC_SINGLE_EXT("Mi_Ultrasound Suspend", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_SUSPEND, - 1, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Input", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED, - 1, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Output", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED, - 1, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Event", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT, - 256, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Calibration Method", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD, - 256, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - - SND_SOC_BYTES_EXT("Mi_Ultrasound ML", - MIUS_ML_DATA_SIZE, - mius_ml_data_get, - mius_ml_data_put), - - SOC_SINGLE_EXT("Mi_Ultrasound Debug Mode", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE, - 256, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SOC_SINGLE_EXT("Mi_Ultrasound Context", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CONTEXT, - MIUS_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - SND_SOC_BYTES_EXT("Mi_Ultrasound Sensor Data", - MIUS_SENSOR_DATA_SIZE, - mius_sensor_data_get, - mius_sensor_data_put), - - SOC_SINGLE_EXT("Mi_Ultrasound Capture", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_CAPTURE, - 256, - -1, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - - SOC_SINGLE_EXT("Mi_Ultrasound Tx Channels", - MIUS_SYSTEM_CONFIGURATION, - MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS, - 16, - 0, - mius_system_configuration_param_get, - mius_system_configuration_param_put), - -}; - - - -unsigned int mius_add_platform_controls(void *platform) -{ - const unsigned int num_controls = - ARRAY_SIZE(ultrasound_filter_mixer_controls); - - if (platform != NULL) { - snd_soc_add_platform_controls( - (struct snd_soc_platform *)platform, - ultrasound_filter_mixer_controls, - num_controls); - } else { - MI_PRINT_E("pointer is NULL"); - } - - return num_controls; -} -EXPORT_SYMBOL(mius_add_platform_controls); - -int mius_trigger_version_msg(void) -{ - int32_t msg[3] = {MSC_ENGINE_VERSION, 0, 0}; - - return mius_data_write( - MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int mius_trigger_branch_msg(void) -{ - int32_t msg[3] = {MSC_BUILD_BRANCH, 0, 0}; - - return mius_data_write( - MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int mius_trigger_tag_msg(void) -{ - int32_t msg[3] = {MSC_ENGINE_TAG, 0, 0}; - - return mius_data_write( - MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} - -int mius_trigger_diagnostics_msg(void) -{ - int32_t msg[3] = {MSC_ENGINE_DIAGNOSTICS, 0, 0}; - - return mius_data_write( - MIUS_ULTRASOUND_SET_PARAMS, - (const char *)msg, sizeof(msg)); -} diff --git a/techpack/audio/dsp/mius/mius_sysfs.c b/techpack/audio/dsp/mius/mius_sysfs.c deleted file mode 100644 index 280fd13cae68..000000000000 --- a/techpack/audio/dsp/mius/mius_sysfs.c +++ /dev/null @@ -1,635 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "mius_version.h" -#include - - -#define MIUS_DIAGNOSTICS_DATA_SECTION_COUNT 16 -#define MIUS_CALIBRATION_MAX_DISPLAY_COUNT 96 -#define MIUS_ML_DISPLAY_COUNT 16 - -static int kobject_create_and_add_failed; -static int sysfs_create_group_failed; - -extern struct mius_system_configuration_parameters_cache - mius_system_configuration_cache; - -static ssize_t calibration_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct mius_shared_data_block *calibration_obj = - mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_DATA); - - if (calibration_obj == NULL) { - MI_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (count > calibration_obj->size) { - MI_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(calibration_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t calibration_v2_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct mius_shared_data_block *calibration_obj = - mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_V2_DATA); - - if (calibration_obj == NULL) { - MI_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (count > calibration_obj->size) { - MI_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(calibration_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t diagnostics_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct mius_shared_data_block *diagnostics_obj = - mius_get_shared_obj(MIUS_OBJ_ID_DIAGNOSTICS_DATA); - - if (diagnostics_obj == NULL) { - MI_PRINT_E("diagnostics_obj is NULL"); - return -EINVAL; - } - - if (count > diagnostics_obj->size) { - MI_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(diagnostics_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t ml_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) { - - ssize_t result; - - struct mius_shared_data_block *ml_obj = - mius_get_shared_obj(MIUS_OBJ_ID_ML_DATA); - - if (ml_obj == NULL) { - MI_PRINT_E("ml_obj is NULL"); - return -EINVAL; - } - - if (count > ml_obj->size) { - MI_PRINT_E("write length %zu larger than buffer", count); - return 0; - } - - memcpy(ml_obj->buffer, buf, count); - result = (ssize_t)count; - return result; -} - -static ssize_t calibration_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - int i; - uint8_t *caldata; - - struct mius_shared_data_block *calibration_obj = - mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_DATA); - - if (kobject_create_and_add_failed) - MI_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - MI_PRINT_E("sysfs_create_group_failed"); - - if (calibration_obj == NULL) { - MI_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (calibration_obj->size > PAGE_SIZE) { - MI_PRINT_E("calibration_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - caldata = (uint8_t *)calibration_obj->buffer; - length = 0; - if (pretty) { - if (caldata[0] == 0xDE && - caldata[1] == 0xAD) { - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Data: not loaded"); - } else { - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Data: "); - for (i = 0; i < calibration_obj->size; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - } - } else { - for (i = 0; i < calibration_obj->size; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t calibration_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return calibration_show_core(dev, attr, buf, 0); -} - -static ssize_t calibration_v2_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - int i; - uint8_t *caldata; - - struct mius_shared_data_block *calibration_obj = - mius_get_shared_obj(MIUS_OBJ_ID_CALIBRATION_V2_DATA); - - if (kobject_create_and_add_failed) - MI_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - MI_PRINT_E("sysfs_create_group_failed"); - - if (calibration_obj == NULL) { - MI_PRINT_E("calibration_obj is NULL"); - return -EINVAL; - } - - if (calibration_obj->size > PAGE_SIZE) { - MI_PRINT_E("calibration_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - caldata = (uint8_t *)calibration_obj->buffer; - length = 0; - if (pretty) { - if (caldata[0] == 0xDE && - caldata[1] == 0xAD) { - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Ext Data: not loaded"); - } else { - int j = (MIUS_CALIBRATION_V2_DATA_SIZE>>2) - 1; - - length += snprintf(buf + length, PAGE_SIZE - length, - "Calibration Ext Data: "); - for (i = 0; i < MIUS_CALIBRATION_MAX_DISPLAY_COUNT; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - length += snprintf(buf + length, PAGE_SIZE - length, - "\nTruncated at %d", - MIUS_CALIBRATION_MAX_DISPLAY_COUNT); - length += snprintf(buf + length, PAGE_SIZE - length, - "\nmisc: %u %u %u %u %u %u %u %u\n", - caldata[j-7], caldata[j-6], caldata[j-5], - caldata[j-4], caldata[j-3], caldata[j-2], - caldata[j-1], caldata[j]); - } - } else { - for (i = 0; i < calibration_obj->size; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%02x ", caldata[i]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t calibration_v2_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return calibration_v2_show_core(dev, attr, buf, 0); -} - -static ssize_t diagnostics_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - uint32_t *data32; - int i; - - struct mius_shared_data_block *diagnostics_obj = - mius_get_shared_obj(MIUS_OBJ_ID_DIAGNOSTICS_DATA); - - if (kobject_create_and_add_failed) - MI_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - MI_PRINT_E("sysfs_create_group_failed"); - - if (diagnostics_obj == NULL) { - MI_PRINT_E("diagnostics_obj is NULL"); - return -EINVAL; - } - - if (diagnostics_obj->size > PAGE_SIZE) { - MI_PRINT_E("diagnostics_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - length = 0; - data32 = (uint32_t *)diagnostics_obj->buffer; - - if (pretty) { - length += snprintf(buf + length, PAGE_SIZE - length, - "Diagnostics:\n counters:\n"); - for (i = 0; i < MIUS_DIAGNOSTICS_DATA_SECTION_COUNT; i++) - length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", - data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); - } else { - for (i = 0; i < (diagnostics_obj->size >> 4); ++i) - length += snprintf(buf + length, PAGE_SIZE - length, " %u %u %u %u\n", - data32[4*i], data32[4*i+1], data32[4*i+2], data32[4*i+3]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t diagnostics_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return diagnostics_show_core(dev, attr, buf, 0); -} - -static ssize_t ml_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - int length; - int i; - uint32_t *mldata; - - struct mius_shared_data_block *ml_obj = - mius_get_shared_obj(MIUS_OBJ_ID_ML_DATA); - - if (kobject_create_and_add_failed) - MI_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - MI_PRINT_E("sysfs_create_group_failed"); - - if (ml_obj == NULL) { - MI_PRINT_E("ml_obj is NULL"); - return -EINVAL; - } - - if (ml_obj->size > PAGE_SIZE) { - MI_PRINT_E("ml_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - mldata = (uint32_t *)ml_obj->buffer; - length = 0; - if (pretty) { - if (mldata[0] == 0x0 && - mldata[1] == 0x0) { - length += snprintf(buf + length, PAGE_SIZE - length, - "ML Data: not loaded"); - } else { - length += snprintf(buf + length, PAGE_SIZE - length, - "ML Data: "); - for (i = 0; i < MIUS_ML_DISPLAY_COUNT; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%08x ", mldata[i]); - length += snprintf(buf + length, PAGE_SIZE - length, - "\nTruncated at %d", - MIUS_ML_DISPLAY_COUNT); - } - } else { - int values = ml_obj->size >> 2; - - for (i = 0; i < values; ++i) - length += snprintf(buf + length, PAGE_SIZE - length, - "0x%08x ", mldata[i]); - } - length += snprintf(buf + length, PAGE_SIZE - length, "\n\n"); - result = (ssize_t)length; - return result; -} - -static ssize_t ml_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return ml_show_core(dev, attr, buf, 0); -} - - -static ssize_t version_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - ssize_t result; - struct mius_engine_version_info *version_info; - int length; - - struct mius_shared_data_block *version_obj = - mius_get_shared_obj(MIUS_OBJ_ID_VERSION_INFO); - - if (kobject_create_and_add_failed) - MI_PRINT_E("kobject_create_and_add_failed"); - - if (sysfs_create_group_failed) - MI_PRINT_E("sysfs_create_group_failed"); - - if (version_obj == NULL) { - MI_PRINT_E("version_obj is NULL"); - return -EINVAL; - } - - if (version_obj->size > PAGE_SIZE) { - MI_PRINT_E("version_obj->size > PAGE_SIZE"); - return -EINVAL; - } - - version_info = (struct mius_engine_version_info *) - version_obj->buffer; - - if (pretty) { - if (version_info->major == 0xDE && - version_info->minor == 0xAD) { - length = snprintf(buf, PAGE_SIZE, "Version: unknown\n"); - } else { - length = snprintf(buf, PAGE_SIZE, "Version: %d.%d.%d.%d\n", - version_info->major, version_info->minor, - version_info->build, version_info->revision); - } - } else { - length = snprintf(buf, PAGE_SIZE, "%d.%d.%d.%d\n", - version_info->major, version_info->minor, - version_info->build, version_info->revision); - } - result = (ssize_t)length; - return result; -} - -static ssize_t version_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return version_show_core(dev, attr, buf, 0); -} - - -static ssize_t branch_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - int length; - - struct mius_shared_data_block *branch_obj = - mius_get_shared_obj(MIUS_OBJ_ID_BRANCH_INFO); - - if (branch_obj == NULL) { - MI_PRINT_E("branch_obj not found"); - return 0; - } - - if (branch_obj->size > PAGE_SIZE) { - MI_PRINT_E("branch_obj->size > PAGE_SIZE"); - return -EINVAL; - } - if (pretty) { - length = snprintf(buf, PAGE_SIZE - 1, "Branch: %s\n", - (const char *)(branch_obj->buffer)); - } else { - length = snprintf(buf, PAGE_SIZE - 1, "%s\n", - (const char *)(branch_obj->buffer)); - } - - return (ssize_t)length; -} - -static ssize_t branch_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return branch_show_core(dev, attr, buf, 0); -} - -static ssize_t tag_show_core(struct device *dev, - struct device_attribute *attr, char *buf, int pretty) -{ - int length; - - struct mius_shared_data_block *tag_obj = - mius_get_shared_obj(MIUS_OBJ_ID_TAG_INFO); - - if (tag_obj == NULL) { - MI_PRINT_E("tag_obj not found"); - return 0; - } - - if (tag_obj->size > PAGE_SIZE) { - MI_PRINT_E("tag_obj->size > PAGE_SIZE"); - return -EINVAL; - } - if (pretty) { - length = snprintf(buf, PAGE_SIZE - 1, "Tag: %s\n", - (const char *)(tag_obj->buffer)); - } else { - length = snprintf(buf, PAGE_SIZE - 1, "%s\n", - (const char *)(tag_obj->buffer)); - } - - return (ssize_t)length; -} - -static ssize_t tag_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return tag_show_core(dev, attr, buf, 0); -} - -static ssize_t cache_show(char *buf, int pretty) -{ - struct mius_system_configuration_parameters_cache *cache = - &mius_system_configuration_cache; - - int length; - - length = snprintf(buf, PAGE_SIZE - 1, "Cache:\n"); - length += snprintf(buf + length, PAGE_SIZE - 1, " mi:%d\n", - cache->microphone_index); - length += snprintf(buf + length, PAGE_SIZE - 1, " om:%d\n", - cache->operation_mode); - length += snprintf(buf + length, PAGE_SIZE - 1, " omf:%d\n", - cache->operation_mode_flags); - length += snprintf(buf + length, PAGE_SIZE - 1, " cs:%d\n", - cache->calibration_state); - length += snprintf(buf + length, PAGE_SIZE - 1, " cp:%d\n", - cache->calibration_profile); - length += snprintf(buf + length, PAGE_SIZE - 1, " ug:%d\n", - cache->ultrasound_gain); - length += snprintf(buf + length, PAGE_SIZE - 1, " ll:%d\n", - cache->log_level); - length += snprintf(buf + length, PAGE_SIZE - 1, " es:%d\n", - cache->engine_suspend); - - return (ssize_t)length; -} - -static ssize_t opmode_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int length; - ssize_t result; - - struct mius_system_configuration_parameters_cache *cache = - &mius_system_configuration_cache; - - length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", - cache->operation_mode); - result = (ssize_t)length; - return result; -} - -static ssize_t opmode_flags_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int length; - ssize_t result; - struct mius_system_configuration_parameters_cache *cache = - &mius_system_configuration_cache; - - length += snprintf(buf + length, PAGE_SIZE - 1, "%d\n", - cache->operation_mode_flags); - result = (ssize_t)length; - return result; -} - -static ssize_t driver_version_show(char *buf) -{ - int length; - - length = snprintf(buf, PAGE_SIZE, "Driver version: %s-%s (%s)\n", - build_name, build_number, build_source_version); - - return (ssize_t)length; -} - -static ssize_t state_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int length = 0; - - length += driver_version_show(buf + length); - length += version_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += branch_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += tag_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += calibration_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += calibration_v2_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += diagnostics_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += ml_show_core(dev, attr, buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - length += cache_show(buf + length, 1); - if (length > PAGE_SIZE) - return (ssize_t)0; - return (ssize_t)length; -} - -static struct device_attribute calibration_attr = __ATTR_RW(calibration); -static struct device_attribute version_attr = __ATTR_RO(version); -static struct device_attribute branch_attr = __ATTR_RO(branch); -static struct device_attribute calibration_v2_attr = __ATTR_RW(calibration_v2); -static struct device_attribute diagnostics_attr = __ATTR_RW(diagnostics); -static struct device_attribute state_attr = __ATTR_RO(state); -static struct device_attribute tag_attr = __ATTR_RO(tag); -static struct device_attribute ml_attr = __ATTR_RW(ml); -static struct device_attribute opmode_attr = __ATTR_RO(opmode); -static struct device_attribute opmode_flags_attr = __ATTR_RO(opmode_flags); - -static struct attribute *mius_attrs[] = { - &calibration_attr.attr, - &version_attr.attr, - &branch_attr.attr, - &calibration_v2_attr.attr, - &diagnostics_attr.attr, - &state_attr.attr, - &tag_attr.attr, - &ml_attr.attr, - &opmode_attr.attr, - &opmode_flags_attr.attr, - NULL, -}; - -static struct attribute_group mius_attr_group = { - .name = MIUS_SYSFS_ENGINE_FOLDER, - .attrs = mius_attrs, -}; - -static struct kobject *mius_sysfs_kobj; - -int mius_initialize_sysfs(void) -{ - int err; - - mius_sysfs_kobj = kobject_create_and_add(MIUS_SYSFS_ROOT_FOLDER, - kernel_kobj->parent); - - if (!mius_sysfs_kobj) { - kobject_create_and_add_failed = 1; - MI_PRINT_E("failed to create kobj"); - return -ENOMEM; - } - - err = sysfs_create_group(mius_sysfs_kobj, &mius_attr_group); - - if (err) { - sysfs_create_group_failed = 1; - MI_PRINT_E("failed to create sysfs group"); - kobject_put(mius_sysfs_kobj); - return -ENOMEM; - } - - return 0; -} - -void mius_cleanup_sysfs(void) -{ - kobject_put(mius_sysfs_kobj); -} diff --git a/techpack/audio/dsp/mius/mius_version.h b/techpack/audio/dsp/mius/mius_version.h deleted file mode 100644 index ae6be14654ed..000000000000 --- a/techpack/audio/dsp/mius/mius_version.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef MIUS_VERSION_H -#define MIUS_VERSION_H - -#define build_name "Mi.LinuxKernelDriver.VendorDLKM.master" -#define build_number "20181016.1" -#define build_source_version "e5e26691554bba9b1438ec3d7e0cc55dfb296bb8" - -#endif //MIUS_VERSION_H diff --git a/techpack/audio/dsp/msm-audio-event-notify.c b/techpack/audio/dsp/msm-audio-event-notify.c deleted file mode 100644 index 3f02ebb6a7b2..000000000000 --- a/techpack/audio/dsp/msm-audio-event-notify.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include - -static ATOMIC_NOTIFIER_HEAD(msm_aud_evt_notifier_list); -static BLOCKING_NOTIFIER_HEAD(msm_aud_evt_blocking_notifier_list); - -/** - * msm_aud_evt_register_client - register a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_register_client(struct notifier_block *nb) -{ - return atomic_notifier_chain_register(&msm_aud_evt_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_register_client); - -/** - * msm_aud_evt_unregister_client - unregister a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_unregister_client(struct notifier_block *nb) -{ - return atomic_notifier_chain_unregister(&msm_aud_evt_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_unregister_client); - -/** - * msm_aud_evt_notifier_call_chain - notify clients of fb_events - * - */ -int msm_aud_evt_notifier_call_chain(unsigned long val, void *v) -{ - return atomic_notifier_call_chain(&msm_aud_evt_notifier_list, val, v); -} -EXPORT_SYMBOL_GPL(msm_aud_evt_notifier_call_chain); - -/** - * msm_aud_evt_blocking_register_client - register a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_blocking_register_client(struct notifier_block *nb) -{ - return blocking_notifier_chain_register( - &msm_aud_evt_blocking_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_blocking_register_client); - -/** - * msm_aud_evt_unregister_client - unregister a client notifier - * @nb: notifier block to callback on events - */ -int msm_aud_evt_blocking_unregister_client(struct notifier_block *nb) -{ - return blocking_notifier_chain_unregister( - &msm_aud_evt_blocking_notifier_list, nb); -} -EXPORT_SYMBOL(msm_aud_evt_blocking_unregister_client); - -/** - * msm_aud_evt_notifier_call_chain - notify clients of fb_events - * @val: event or enum maintained by caller - * @v: private data pointer - * - */ -int msm_aud_evt_blocking_notifier_call_chain(unsigned long val, void *v) -{ - return blocking_notifier_call_chain( - &msm_aud_evt_blocking_notifier_list, val, v); -} -EXPORT_SYMBOL_GPL(msm_aud_evt_blocking_notifier_call_chain); diff --git a/techpack/audio/dsp/msm-cirrus-playback.c b/techpack/audio/dsp/msm-cirrus-playback.c deleted file mode 100755 index 8add0c570a5c..000000000000 --- a/techpack/audio/dsp/msm-cirrus-playback.c +++ /dev/null @@ -1,1540 +0,0 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. - * Copyright (C) 2019 XiaoMi, Inc. -* 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 -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -/* includes the file structure, that is, file open read close */ -#include - -/* include the character device, makes cdev avilable */ -#include -#include - -/* includes copy_user vice versa */ -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "../asoc/msm-pcm-routing-v2.h" -#include -#include -#include -#include -#include - -#undef CONFIG_OF - -#undef pr_info -#undef pr_err -#undef pr_debug -#define pr_debug(fmt, args...) printk(KERN_INFO "[CSPL] " pr_fmt(fmt), ##args) -#define pr_info(fmt, args...) printk(KERN_INFO "[CSPL] " pr_fmt(fmt), ##args) -#define pr_err(fmt, args...) printk(KERN_ERR "[CSPL] " pr_fmt(fmt), ##args) - -#define CRUS_TX_CONFIG "crus_sp_tx%d.bin" -#define CRUS_RX_CONFIG "crus_sp_rx%d.bin" - -#define CIRRUS_RX_GET_IODATA 0x00A1AF09 -#define CIRRUS_TX_GET_IODATA 0x00A1BF09 - -static struct crus_sp_ioctl_header crus_sp_hdr; - -static struct crus_control_t this_ctrl = { - .fb_port_index = 3, - .fb_port = AFE_PORT_ID_QUATERNARY_MI2S_TX, - .ff_port = AFE_PORT_ID_QUATERNARY_MI2S_RX, - .usecase_dt_count = MAX_TUNING_CONFIGS, - .ch_sw_duration = 30, - .ch_sw = 0, - .vol_atten = 0, - .prot_en = false, - .q6afe_rev = 3, // V3 as default -}; - - -static void *crus_gen_afe_get_header(int length, int port, int module, - int param) -{ - struct afe_custom_crus_get_config_v2_t *config = NULL; - int size = sizeof(struct afe_custom_crus_get_config_v2_t); - int index = afe_get_port_index(port); - uint16_t payload_size = sizeof(struct param_hdr_v2) + - length; - - /* Allocate memory for the message */ - config = kzalloc(size, GFP_KERNEL); - if (!config) - return NULL; - - /* Set header section */ - config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - config->hdr.pkt_size = size; - config->hdr.src_svc = APR_SVC_AFE; - config->hdr.src_domain = APR_DOMAIN_APPS; - config->hdr.src_port = 0; - config->hdr.dest_svc = APR_SVC_AFE; - config->hdr.dest_domain = APR_DOMAIN_ADSP; - config->hdr.dest_port = 0; - config->hdr.token = index; - config->hdr.opcode = AFE_PORT_CMD_GET_PARAM_V2; - - /* Set param section */ - config->param.port_id = (uint16_t) port; - - config->param.mem_hdr.data_payload_addr_lsw = 0; - config->param.mem_hdr.data_payload_addr_msw = 0; - config->param.mem_hdr.mem_map_handle = 0; - config->param.module_id = (uint32_t) module; - config->param.param_id = (uint32_t) param; - /* max data size of the param_ID/module_ID combination */ - config->param.payload_size = payload_size; - - /* Set data section */ - config->data.module_id = (uint32_t) module; - config->data.param_id = (uint32_t) param; - - /*remove for 855*/ - //config->data.reserved = 0; /* Must be set to 0 */ - /* actual size of the data for the module_ID/param_ID pair */ - config->data.param_size = length; - - return (void *)config; -} - - -static void *crus_gen_afe_set_header(int length, int port, int module, - int param) -{ - struct afe_custom_crus_set_config_v2_t *config = NULL; - int size = sizeof(struct afe_custom_crus_set_config_v2_t) + length; - int index = afe_get_port_index(port); - uint16_t payload_size = sizeof(struct param_hdr_v2) + - length; - - /* Allocate memory for the message */ - config = kzalloc(size, GFP_KERNEL); - if (!config) - return NULL; - - /* Set header section */ - config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - config->hdr.pkt_size = size; - config->hdr.src_svc = APR_SVC_AFE; - config->hdr.src_domain = APR_DOMAIN_APPS; - config->hdr.src_port = 0; - config->hdr.dest_svc = APR_SVC_AFE; - config->hdr.dest_domain = APR_DOMAIN_ADSP; - config->hdr.dest_port = 0; - config->hdr.token = index; - config->hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; - - /* Set param section */ - config->param.port_id = (uint16_t) port; - config->param.mem_hdr.data_payload_addr_lsw = 0; - config->param.mem_hdr.data_payload_addr_msw = 0; - config->param.mem_hdr.mem_map_handle = 0; - /* max data size of the param_ID/module_ID combination */ - config->param.payload_size = payload_size; - - /* Set data section */ - config->data.module_id = (uint32_t) module; - config->data.param_id = (uint32_t) param; - - /*remove for 855*/ - //config->data.reserved = 0; /* Must be set to 0 */ - - /* actual size of the data for the module_ID/param_ID pair */ - config->data.param_size = length; - - return (void *)config; -} - -static int crus_afe_get_param(int port, int module, int param, int length, - void *data) -{ - struct afe_custom_crus_get_config_v2_t *config = NULL; - int index = afe_get_port_index(port); - int ret = 0, count = 0; - - pr_debug("CRUS_SP: (get_param) module = 0x%08x, port = 0x%08x, param = 0x%08x\n", - module, port, param); - - config = (struct afe_custom_crus_get_config_v2_t *) - crus_gen_afe_get_header(length, port, module, param); - if (config == NULL) { - pr_err("CRUS_SP: Memory allocation failed\n"); - return -ENOMEM; - } - - mutex_lock(&this_ctrl.param_lock); - atomic_set(&this_ctrl.callback_wait, 0); - - this_ctrl.user_buffer = kzalloc(config->param.payload_size + 16, - GFP_KERNEL); - - ret = afe_apr_send_pkt_crus(config, index, 0); - if (ret) - pr_err("CRUS_SP: (get_param) failed with code %d\n", ret); - - /* Wait for afe callback to populate data */ - while (!atomic_read(&this_ctrl.callback_wait)) { - usleep_range(800, 1200); - if (count++ >= 1000) { - pr_err("CRUS_SP: AFE callback timeout\n"); - atomic_set(&this_ctrl.callback_wait, 1); - ret = -EINVAL; - goto exit; - } - } - - /* Copy from dynamic buffer to return buffer */ - memcpy((u8 *)data, &this_ctrl.user_buffer[4], length); - -exit: - kfree(this_ctrl.user_buffer); - mutex_unlock(&this_ctrl.param_lock); - kfree(config); - return ret; -} - - - -static int crus_afe_set_param(int port, int module, int param, int length, - void *data_ptr) -{ - struct afe_custom_crus_set_config_v2_t *config = NULL; - int index = afe_get_port_index(port); - int ret = 0; - - pr_info("CRUS_SP: (set_param) module = 0x%08x, port = 0x%08x, param = 0x%08x\n", - module, port, param); - - config = crus_gen_afe_set_header(length, port, module, param); - if (config == NULL) { - pr_err("CRUS_SP: Memory allocation failed\n"); - return -ENOMEM; - } - - memcpy((u8 *)config + sizeof(struct afe_custom_crus_set_config_v2_t), - (u8 *) data_ptr, length); - - ret = afe_apr_send_pkt_crus(config, index, 1); - if (ret) - pr_err("CRUS_SP: (set_param) failed with code %d\n", ret); - - kfree(config); - return ret; -} - - - -static int crus_afe_get_param_v3(int port, int module_id, - int param_id, uint32_t length, void *data) -{ - struct afe_port_cmd_get_param_v3 afe_get_param; - struct param_hdr_v3 param_hdr; - u16 port_id = 0; - int index = 0; - int ret = 0; - - pr_info("%s: port=0x%x, module=0x%x, param_id=0x%x, size=%d\n", - __func__, port, module_id, param_id, length); - - param_hdr.module_id = module_id; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = param_id; - param_hdr.param_size = length; - - port_id = q6audio_get_port_id(port); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - index = q6audio_get_port_index(port); - - //q6afe_get_params_v3 - memset(&afe_get_param, 0, sizeof(afe_get_param)); - afe_get_param.apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - afe_get_param.apr_hdr.pkt_size = sizeof(afe_get_param); - afe_get_param.apr_hdr.src_port = 0; - afe_get_param.apr_hdr.dest_port = 0; - afe_get_param.apr_hdr.token = index; - afe_get_param.apr_hdr.opcode = AFE_PORT_CMD_GET_PARAM_V3; - afe_get_param.port_id = port_id; - //if (mem_hdr != NULL) - // afe_get_param.mem_hdr = *mem_hdr; - /* Set param header in command, no payload in V3 */ - afe_get_param.param_hdr = param_hdr; - //q6afe_get_params_v3 end - - mutex_lock(&this_ctrl.param_lock); - atomic_set(&this_ctrl.callback_wait, 0); - this_ctrl.user_buffer = kzalloc(length + 64, - GFP_KERNEL); - atomic_set(cspl_afe.status, 0); - ret = apr_send_pkt(*cspl_afe.apr, (uint32_t *) &afe_get_param); - if (ret < 0) { - pr_err("%s: Setting param for port %d param[0x%x]failed\n", - __func__, port, param_id); - goto fail_cmd; - } - /* Wait for afe callback to populate data */ - while(!atomic_read(&this_ctrl.callback_wait)) - msleep(1); - -#if 0 - for (index = 0; index < length; index ++) - pr_info("[%d]=%d\n", index, this_ctrl.user_buffer[index]); - - pr_info("[5]=%s\n", &this_ctrl.user_buffer[5]); -#endif - /* copy from dynamic buffer to return buffer */ - memcpy((u8*)data, &this_ctrl.user_buffer[5], length); - pr_info("%s: Copied %d bytes data \n", __func__, length); - - ret = 0; -fail_cmd: - pr_info("%s: param_id %x status %d\n", __func__, param_id, ret); - mutex_unlock(&this_ctrl.param_lock); - kfree(this_ctrl.user_buffer); - return ret; -} - -static int crus_afe_set_param_v3(int port, int module_id, - int param_id, uint32_t length, void *data) -{ - struct afe_port_cmd_set_param_v3 *set_param = NULL; - uint32_t set_param_size = sizeof(struct afe_port_cmd_set_param_v3); - struct param_hdr_v3 param_hdr; - u16 port_id = 0; - int index = 0; - u8 *packed_param_data = NULL; - int packed_data_size = sizeof(union param_hdrs) + length; - int ret = 0; - - pr_info("%s: port=0x%x, module=0x%x, param_id=0x%x, size=%d\n", - __func__, port, module_id, param_id, length); - - port_id = q6audio_get_port_id(port); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - index = q6audio_get_port_index(port); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = module_id; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = param_id; - param_hdr.param_size = length; - pr_debug("CRUS: param_size %d\n", length); - - packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); - if (packed_param_data == NULL) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, (u8 *)data, - &packed_data_size); - if (ret) { - pr_err("%s: Failed to pack param header and data, error %d\n", - __func__, ret); - goto fail_cmd; - } - - set_param_size += packed_data_size; - set_param = kzalloc(set_param_size, GFP_KERNEL); - if (set_param == NULL) { - ret = -ENOMEM; - goto fail_cmd; - } - - set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param->apr_hdr.pkt_size = sizeof(struct afe_port_cmd_set_param_v3) + - packed_data_size; - set_param->apr_hdr.src_port = 0; - set_param->apr_hdr.dest_port = 0; - set_param->apr_hdr.token = index; - set_param->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; - set_param->port_id = port_id; - set_param->payload_size = packed_data_size; - memcpy(&set_param->param_data, packed_param_data, - packed_data_size); - - atomic_set(cspl_afe.state, 1); - //atomic_set(&this_ctrl.callback_wait, 0); - ret = apr_send_pkt(*cspl_afe.apr, (uint32_t *) set_param); - if (ret < 0) { - pr_err("%s: Setting param for port %d param[0x%x]failed\n", - __func__, port, param_id); - goto fail_cmd; - } - - ret = wait_event_timeout(cspl_afe.wait[index], - (atomic_read(cspl_afe.state) == 0), - msecs_to_jiffies(cspl_afe.timeout_ms*10)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - - if (atomic_read(cspl_afe.status) != 0) { - pr_err("%s: set param cmd failed\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - - ret = 0; -fail_cmd: - pr_info("[CSPL]%s param_id %x status %d\n", __func__, param_id, ret); - kfree(set_param); - kfree(packed_param_data); - return ret; -} - -static int crus_afe_send_config(const char *data, int32_t length, - int32_t port, int32_t module) -{ - struct afe_custom_crus_set_config_v2_t *config = NULL; - struct crus_external_config_t *payload = NULL; - int size = sizeof(struct crus_external_config_t); - int chars_to_send, mem_size, sent = 0, ret = 0; - int index = afe_get_port_index(port); - uint32_t param = 0; - - pr_info("CRUS_SP: (send_config) module = 0x%08x, port = 0x%08x\n", - module, port); - - /* Destination settings for message */ - if (port == this_ctrl.ff_port) - param = CRUS_PARAM_RX_SET_EXT_CONFIG; - else if (port == this_ctrl.fb_port) - param = CRUS_PARAM_TX_SET_EXT_CONFIG; - else { - pr_err("CRUS_SP: Received invalid port parameter %d\n", port); - return -EINVAL; - } - - if (length > APR_CHUNK_SIZE) - mem_size = APR_CHUNK_SIZE; - else - mem_size = length; - - config = crus_gen_afe_set_header(size, port, module, param); - if (config == NULL) { - pr_err("CRUS_SP: Memory allocation failed\n"); - return -ENOMEM; - } - - payload = (struct crus_external_config_t *)((u8 *)config + - sizeof(struct afe_custom_crus_set_config_v2_t)); - payload->total_size = (uint32_t)length; - payload->reserved = 0; - payload->config = PAYLOAD_FOLLOWS_CONFIG; - /* ^ This tells the algorithm to expect array */ - /* immediately following the header */ - - /* Send config string in chunks of APR_CHUNK_SIZE bytes */ - while (sent < length) { - chars_to_send = length - sent; - if (chars_to_send > APR_CHUNK_SIZE) { - chars_to_send = APR_CHUNK_SIZE; - payload->done = 0; - } else { - payload->done = 1; - } - - /* Configure per message parameter settings */ - memcpy(payload->data, data + sent, chars_to_send); - payload->chunk_size = chars_to_send; - - /* Send the actual message */ - ret = afe_apr_send_pkt_crus(config, index, 1); - - if (ret) { - pr_err("CRUS_SP: (send_config) failure code %d\n", ret); - break; - } - - sent += chars_to_send; - } - - kfree(config); - return ret; -} - - -static int crus_afe_send_delta(const char *data, uint32_t length) -{ - struct afe_custom_crus_set_config_t *config = NULL; - struct crus_delta_config_t *payload = NULL; - int size = sizeof(struct crus_delta_config_t); - int port = this_ctrl.ff_port; - int param = CRUS_PARAM_RX_SET_DELTA_CONFIG; - int module = CIRRUS_SP; - int chars_to_send, mem_size, sent = 0, ret = 0; - int index = afe_get_port_index(port); - - pr_info("CRUS_SP: (send_delta) module = 0x%08x, port = 0x%08x\n", - module, port); - - if (length > APR_CHUNK_SIZE) - mem_size = APR_CHUNK_SIZE; - else - mem_size = length; - - config = crus_gen_afe_set_header(size, port, module, param); - if (config == NULL) { - pr_err("CRUS_SP: Memory allocation failed\n"); - return -ENOMEM; - } - - payload = (struct crus_delta_config_t *)((u8 *)config + - sizeof(struct afe_custom_crus_set_config_t)); - payload->total_size = length; - payload->index = 0; - payload->reserved = 0; - payload->config = PAYLOAD_FOLLOWS_CONFIG; - /* ^ This tells the algorithm to expect array */ - /* immediately following the header */ - - /* Send config string in chunks of APR_CHUNK_SIZE bytes */ - while (sent < length) { - chars_to_send = length - sent; - if (chars_to_send > APR_CHUNK_SIZE) { - chars_to_send = APR_CHUNK_SIZE; - payload->done = 0; - } else - payload->done = 1; - - /* Configure per message parameter settings */ - memcpy(payload->data, data + sent, chars_to_send); - payload->chunk_size = chars_to_send; - - /* Send the actual message */ - ret = afe_apr_send_pkt_crus(config, index, 1); - - if (ret) { - pr_err("CRUS_SP: (send_delta) failure code %d\n", ret); - break; - } - - sent += chars_to_send; - } - - kfree(config); - return ret; -} - -extern int crus_afe_callback(void* payload, int size) -{ - uint32_t* payload32 = payload; - - pr_debug("%s: module=0x%x size = %d\n", - __func__, (int)payload32[1], size); - - switch(payload32[1]) { - case CIRRUS_SP: - memcpy(this_ctrl.user_buffer, payload32, size); - atomic_set(&this_ctrl.callback_wait, 1); - break; - default: - return -EINVAL; - } - - return 0; -} - - - -int msm_routing_cirrus_fbport_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - this_ctrl.fb_port_index = ucontrol->value.integer.value[0]; - pr_info("%s: %d\n", __func__, this_ctrl.fb_port); - - switch (this_ctrl.fb_port_index) { - case 0: - this_ctrl.fb_port = AFE_PORT_ID_PRIMARY_MI2S_TX; - this_ctrl.ff_port = AFE_PORT_ID_PRIMARY_MI2S_RX; - break; - case 1: - this_ctrl.fb_port = AFE_PORT_ID_SECONDARY_MI2S_TX; - this_ctrl.ff_port = AFE_PORT_ID_SECONDARY_MI2S_RX; - break; - case 2: - this_ctrl.fb_port = AFE_PORT_ID_TERTIARY_MI2S_TX; - this_ctrl.ff_port = AFE_PORT_ID_TERTIARY_MI2S_RX; - break; - case 3: - this_ctrl.fb_port = AFE_PORT_ID_QUATERNARY_MI2S_TX; - this_ctrl.ff_port = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - default: - /* Default port to QUATERNARY */ - this_ctrl.fb_port = AFE_PORT_ID_QUATERNARY_MI2S_TX; - this_ctrl.ff_port = AFE_PORT_ID_QUATERNARY_MI2S_RX; - break; - } - return 0; -} - -int msm_routing_cirrus_fbport_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: this_ctrl.fb_port = %d", __func__, this_ctrl.fb_port); - ucontrol->value.integer.value[0] = this_ctrl.fb_port_index; - return 0; -} - -static int msm_routing_crus_sp_enable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - const int crus_set = ucontrol->value.integer.value[0]; - - - this_ctrl.enable = crus_set; - - return 0; -} - -static int msm_routing_crus_sp_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_info("%s: %d\n", __func__, this_ctrl.enable); - ucontrol->value.integer.value[0] = this_ctrl.enable; - - return 0; -} -static int msm_routing_crus_sp_prot_enable_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_err("CRUS_SP: Cirrus SP Protection Enable is set via DT\n"); - return 0; -} - -static int msm_routing_crus_sp_prot_enable_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = this_ctrl.prot_en ? 1 : 0; - return 0; -} - -static int msm_routing_crus_sp_usecase_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct crus_rx_run_case_ctrl_t case_ctrl; - struct crus_rx_temperature_t rx_temp; - const int crus_set = ucontrol->value.integer.value[0]; - //struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - //uint32_t max_index = e->items; - int buffer[CRUS_MAX_BUFFER_SIZE / 4]; - - if (crus_set >= 4) { - pr_err("CRUS_SP: Config index out of bounds (%d)\n", crus_set); - return -EINVAL; - } - - if(this_ctrl.q6afe_rev == 2) - crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, - CRUS_MAX_BUFFER_SIZE, buffer); - else - crus_afe_get_param_v3(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, - CRUS_MAX_BUFFER_SIZE, buffer); - - memcpy(&rx_temp, buffer, sizeof(rx_temp)); - - this_ctrl.usecase = crus_set; - - case_ctrl.status_l = 1; - case_ctrl.status_r = 1; - case_ctrl.z_l = rx_temp.z_l; - case_ctrl.z_r = rx_temp.z_r; - case_ctrl.checksum_l = rx_temp.z_l + 1; - case_ctrl.checksum_r = rx_temp.z_r + 1; - case_ctrl.atemp = rx_temp.amb_temp_l; - case_ctrl.value = this_ctrl.usecase; - - if (this_ctrl.prot_en) { - if(this_ctrl.q6afe_rev == 2) { - crus_afe_set_param(this_ctrl.fb_port, CIRRUS_SP, - CRUS_PARAM_TX_SET_USECASE, - sizeof(this_ctrl.usecase), - (void *)&this_ctrl.usecase); - } else { - crus_afe_set_param_v3(this_ctrl.fb_port, CIRRUS_SP, - CRUS_PARAM_TX_SET_USECASE, - sizeof(this_ctrl.usecase), - (void *)&this_ctrl.usecase); - } - } - - - - if(this_ctrl.q6afe_rev == 2) { - crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_SET_USECASE, sizeof(case_ctrl), - (void *)&case_ctrl); - } else { - crus_afe_set_param_v3(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_SET_USECASE, sizeof(case_ctrl), - (void *)&case_ctrl); - } - - return 0; -} - -static int msm_routing_crus_sp_usecase_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_info("%s: %d\n", __func__, this_ctrl.usecase); - ucontrol->value.integer.value[0] = this_ctrl.usecase; - - return 0; -} - -static int msm_routing_crus_load_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_platform *plat = snd_soc_kcontrol_platform(kcontrol); - const int crus_set = ucontrol->value.integer.value[0]; - char config[CONFIG_FILE_SIZE]; - const struct firmware *firmware; - - pr_debug("%s: %d\n", __func__, crus_set); - this_ctrl.conf_sel = crus_set; - - switch (crus_set) { - case 0: /* "None" */ - break; - case 1: /* Load RX Config */ - snprintf(config, CONFIG_FILE_SIZE, CRUS_RX_CONFIG, - this_ctrl.usecase); - - if (request_firmware(&firmware, config, plat->dev) != 0) { - pr_err("CRUS_SP: Request firmware failed\n"); - return -EINVAL; - } - - pr_info("CRUS_SP: Sending RX config...\n"); - - crus_afe_send_config(firmware->data, firmware->size, - this_ctrl.ff_port, CIRRUS_SP); - release_firmware(firmware); - break; - case 2: /* Load TX Config */ - if (this_ctrl.prot_en == false) - return -EINVAL; - - snprintf(config, CONFIG_FILE_SIZE, CRUS_TX_CONFIG, - this_ctrl.usecase); - - if (request_firmware(&firmware, config, plat->dev) != 0) { - pr_err("CRUS_SP: Request firmware failed\n"); - return -EINVAL; - } - - pr_info("CRUS_SP: Sending TX config...\n"); - - crus_afe_send_config(firmware->data, firmware->size, - this_ctrl.fb_port, CIRRUS_SP); - release_firmware(firmware); - break; - default: - return -EINVAL; - } - - this_ctrl.conf_sel = 0; - - return 0; -} - -static int msm_routing_crus_load_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: %d\n", __func__, this_ctrl.conf_sel); - ucontrol->value.integer.value[0] = this_ctrl.conf_sel; - return 0; -} - -static int msm_routing_crus_delta_config_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_platform *plat = snd_soc_kcontrol_platform(kcontrol); - struct crus_single_data_t data; - const int crus_set = ucontrol->value.integer.value[0]; - const struct firmware *firmware; - - switch (crus_set) { - case 0: - break; - case 1: /* Load delta config over AFE */ - this_ctrl.delta_sel = crus_set; - - if (request_firmware(&firmware, "crus_sp_delta_config.bin", - plat->dev) != 0) { - pr_err("CRUS_SP: Request firmware failed\n"); - this_ctrl.delta_sel = 0; - return -EINVAL; - } - - pr_info("CRUS_SP: Sending delta config...\n"); - - crus_afe_send_delta(firmware->data, firmware->size); - release_firmware(firmware); - break; - case 2: /* Run delta transition */ - this_ctrl.delta_sel = crus_set; - data.value = 0; - crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_RUN_DELTA_CONFIG, - sizeof(struct crus_single_data_t), &data); - break; - default: - return -EINVAL; - } - - this_ctrl.delta_sel = 0; - return 0; -} - -static int msm_routing_crus_delta_config_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = this_ctrl.delta_sel; - return 0; -} - -static int msm_routing_crus_vol_attn_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - const int crus_set = ucontrol->value.integer.value[0]; - struct crus_dual_data_t data; - - mutex_lock(&this_ctrl.sp_lock); - - this_ctrl.vol_atten = crus_set; - - switch (crus_set) { - case 0: /* 0dB */ - data.data1 = VOL_ATTN_MAX; - data.data2 = VOL_ATTN_MAX; - break; - case 1: /* -18dB */ - data.data1 = VOL_ATTN_18DB; - data.data2 = VOL_ATTN_18DB; - break; - case 2: /* -24dB */ - data.data1 = VOL_ATTN_24DB; - data.data2 = VOL_ATTN_24DB; - break; - default: - return -EINVAL; - } - - if(this_ctrl.q6afe_rev == 2) { - crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_SET_ATTENUATION, - sizeof(struct crus_dual_data_t), &data); - } else { - crus_afe_set_param_v3(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_SET_ATTENUATION, - sizeof(struct crus_dual_data_t), &data); - } - - mutex_unlock(&this_ctrl.sp_lock); - - return 0; -} - -static int msm_routing_crus_vol_attn_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("Starting Cirrus SP Volume Attenuation Get function call\n"); - ucontrol->value.integer.value[0] = this_ctrl.vol_atten; - - return 0; -} - - -static int msm_routing_crus_chan_swap_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct crus_dual_data_t data; - const int crus_set = ucontrol->value.integer.value[0]; - - switch (crus_set) { - case 0: /* L/R */ - data.data1 = 1; - break; - case 1: /* R/L */ - data.data1 = 2; - break; - default: - return -EINVAL; - } - - data.data2 = this_ctrl.ch_sw_duration; - - mutex_lock(&this_ctrl.sp_lock); - - this_ctrl.ch_sw = crus_set; - - if(this_ctrl.q6afe_rev == 2) - crus_afe_set_param(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_CHANNEL_SWAP, - sizeof(struct crus_dual_data_t), &data); - else - crus_afe_set_param_v3(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_CHANNEL_SWAP, - sizeof(struct crus_dual_data_t), &data); - - mutex_unlock(&this_ctrl.sp_lock); - - return 0; -} - -static int msm_routing_crus_chan_swap_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct crus_single_data_t data; - pr_debug("%s: %d\n", __func__, this_ctrl.ch_sw); - crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, - CRUS_PARAM_RX_GET_CHANNEL_SWAP, - sizeof(struct crus_single_data_t), &data); - - ucontrol->value.integer.value[0] = this_ctrl.ch_sw; - - return 0; -} - -static int msm_routing_crus_chan_swap_dur_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int crus_set = ucontrol->value.integer.value[0]; - - pr_debug("%s: %d\n", __func__, crus_set); - - if ((crus_set < 0) || (crus_set > MAX_CHAN_SWAP_SAMPLES)) { - pr_err("CRUS_SP: Value out of range (%d)\n", crus_set); - return -EINVAL; - } - - if (crus_set < MIN_CHAN_SWAP_SAMPLES) { - pr_info("CRUS_SP: Received %d, round up to min value %d\n", - crus_set, MIN_CHAN_SWAP_SAMPLES); - crus_set = MIN_CHAN_SWAP_SAMPLES; - } - - this_ctrl.ch_sw_duration = crus_set; - - return 0; -} - -static int msm_routing_crus_chan_swap_dur_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - pr_debug("%s: %d\n", __func__, this_ctrl.ch_sw_duration); - - ucontrol->value.integer.value[0] = this_ctrl.ch_sw_duration; - - return 0; -} -static int msm_routing_crus_fail_det(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static int msm_routing_crus_fail_det_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - return 0; -} - -static const char * const cirrus_fb_port_text[] = {"PRI_MI2S_RX", - "SEC_MI2S_RX", - "TERT_MI2S_RX", - "QUAT_MI2S_RX", - "QUAT_TDM_RX_0", - "SLIMBUS_0_RX"}; - -static const char * const crus_en_text[] = {"Config SP Disable", - "Config SP Enable"}; - -static const char * const crus_prot_en_text[] = {"Disable", "Enable"}; - -static const char * const crus_conf_load_text[] = {"Idle", "Load RX", - "Load TX"}; - -static const char * const crus_conf_load_no_prot_text[] = {"Idle", "Load"}; - -static const char * const crus_delta_text[] = {"Idle", "Load", "Run"}; - -static const char * const crus_chan_swap_text[] = {"LR", "RL"}; -static const char * crus_sp_usecase_dt_text[MAX_TUNING_CONFIGS] = {"Music", "Voice", "Headset", "Handsfree"}; - -static const char * const crus_vol_attn_text[] = {"0dB", "-18dB", "-24dB"}; - - -static const struct soc_enum cirrus_fb_controls_enum[] = { - SOC_ENUM_SINGLE_EXT(6, cirrus_fb_port_text), -}; - -static const struct soc_enum crus_en_enum[] = { - SOC_ENUM_SINGLE_EXT(2, crus_en_text), -}; - -static const struct soc_enum crus_prot_en_enum[] = { - SOC_ENUM_SINGLE_EXT(2, crus_prot_en_text), -}; - -static struct soc_enum crus_sp_usecase_enum[] = { - SOC_ENUM_SINGLE_EXT(MAX_TUNING_CONFIGS, crus_sp_usecase_dt_text), -}; - -static const struct soc_enum crus_conf_load_enum[] = { - SOC_ENUM_SINGLE_EXT(3, crus_conf_load_text), -}; - -static const struct soc_enum crus_conf_load_no_prot_enum[] = { - SOC_ENUM_SINGLE_EXT(2, crus_conf_load_no_prot_text), -}; - -static const struct soc_enum crus_delta_enum[] = { - SOC_ENUM_SINGLE_EXT(3, crus_delta_text), -}; - -static const struct soc_enum crus_chan_swap_enum[] = { - SOC_ENUM_SINGLE_EXT(2, crus_chan_swap_text), -}; - -static const struct soc_enum crus_vol_attn_enum[] = { - SOC_ENUM_SINGLE_EXT(3, crus_vol_attn_text), -}; -static const struct snd_kcontrol_new crus_protect_controls[] = { - SOC_ENUM_EXT("Cirrus SP FBPort", cirrus_fb_controls_enum[0], - msm_routing_cirrus_fbport_get, msm_routing_cirrus_fbport_put), - SOC_ENUM_EXT("Cirrus SP", crus_en_enum[0], - msm_routing_crus_sp_enable_get, msm_routing_crus_sp_enable_put), - SOC_ENUM_EXT("Cirrus SP Protection", crus_prot_en_enum[0], - msm_routing_crus_sp_prot_enable_get, msm_routing_crus_sp_prot_enable_put), - SOC_ENUM_EXT("Cirrus SP Usecase", crus_sp_usecase_enum[0], - msm_routing_crus_sp_usecase_get, msm_routing_crus_sp_usecase_put), - SOC_ENUM_EXT("Cirrus SP Load Config", crus_conf_load_enum[0], - msm_routing_crus_load_config_get, msm_routing_crus_load_config_put), - SOC_ENUM_EXT("Cirrus SP Delta Config", crus_delta_enum[0], - msm_routing_crus_delta_config_get, msm_routing_crus_delta_config_put), - SOC_ENUM_EXT("Cirrus SP Channel Swap", crus_chan_swap_enum[0], - msm_routing_crus_chan_swap_get, msm_routing_crus_chan_swap_put), - SOC_SINGLE_EXT("Cirrus SP Channel Swap Duration", SND_SOC_NOPM, 0, - MAX_CHAN_SWAP_SAMPLES, 0, msm_routing_crus_chan_swap_dur_get, - msm_routing_crus_chan_swap_dur_put), - SOC_SINGLE_BOOL_EXT("Cirrus SP Failure Detection", 0, - msm_routing_crus_fail_det_get, msm_routing_crus_fail_det), -}; -static const struct snd_kcontrol_new crus_no_protect_controls[] = { - SOC_ENUM_EXT("Cirrus SP FBPort", cirrus_fb_controls_enum[0], - msm_routing_cirrus_fbport_get, msm_routing_cirrus_fbport_put), - SOC_ENUM_EXT("Cirrus SP", crus_en_enum[0], - msm_routing_crus_sp_enable_get, msm_routing_crus_sp_enable_put), - SOC_ENUM_EXT("Cirrus SP Protection", crus_prot_en_enum[0], - msm_routing_crus_sp_prot_enable_get, msm_routing_crus_sp_prot_enable_put), - SOC_ENUM_EXT("Cirrus SP Usecase", crus_sp_usecase_enum[0], - msm_routing_crus_sp_usecase_get, msm_routing_crus_sp_usecase_put), - SOC_ENUM_EXT("Cirrus SP Load Config", crus_conf_load_no_prot_enum[0], - msm_routing_crus_load_config_get, msm_routing_crus_load_config_put), - SOC_ENUM_EXT("Cirrus SP Delta Config", crus_delta_enum[0], - msm_routing_crus_delta_config_get, msm_routing_crus_delta_config_put), - SOC_ENUM_EXT("Cirrus SP Channel Swap", crus_chan_swap_enum[0], - msm_routing_crus_chan_swap_get, msm_routing_crus_chan_swap_put), - SOC_SINGLE_EXT("Cirrus SP Channel Swap Duration", SND_SOC_NOPM, 0, - MAX_CHAN_SWAP_SAMPLES, 0, msm_routing_crus_chan_swap_dur_get, - msm_routing_crus_chan_swap_dur_put), - SOC_ENUM_EXT("Cirrus SP Volume Attenuation", crus_vol_attn_enum[0], - msm_routing_crus_vol_attn_get, msm_routing_crus_vol_attn_put), -}; - -void msm_crus_pb_add_controls(struct snd_soc_platform *platform) -{ - if (this_ctrl.usecase_dt_count == 0) - pr_info("CRUS_SP: Usecase config not specified\n"); - - crus_sp_usecase_enum[0].items = this_ctrl.usecase_dt_count; - crus_sp_usecase_enum[0].texts = crus_sp_usecase_dt_text; - - if (this_ctrl.prot_en) - snd_soc_add_platform_controls(platform, crus_protect_controls, - ARRAY_SIZE(crus_protect_controls)); - else - snd_soc_add_platform_controls(platform, - crus_no_protect_controls, - ARRAY_SIZE(crus_no_protect_controls)); -} - -EXPORT_SYMBOL(msm_crus_pb_add_controls); - -int crus_afe_port_start(u16 port_id) { - pr_info("%s: 0x%x\n", __func__, port_id); - -//CSPL do not be involved in AFE -#if 0 - struct snd_kcontrol kcontrol; - struct snd_ctl_elem_value ucontrol; - - if (port_id != this_ctrl.ff_port) - return 0; - - this_ctrl.afe_start = true; - pr_info("%s: 0x%x\n", __func__, port_id); - - mutex_lock(&this_ctrl.sp_lock); - msm_routing_crus_sp_usecase_get(&kcontrol, - &ucontrol); - msm_routing_crus_sp_usecase_put(&kcontrol, - &ucontrol); - mutex_unlock(&this_ctrl.sp_lock); -#endif - return 0; -} -EXPORT_SYMBOL(crus_afe_port_start); -int crus_afe_port_close(u16 port_id) -{ - pr_info("%s: 0x%x\n", __func__, port_id); - -//CSPL do not be involved in AFE -#if 0 - if (port_id != this_ctrl.ff_port) - return 0; - - this_ctrl.afe_start = false; - pr_info("%s: 0x%x\n", __func__, port_id); -#endif - return 0; -} -EXPORT_SYMBOL(crus_afe_port_close); -static long crus_sp_shared_ioctl(struct file *f, unsigned int cmd, - void __user *arg) -{ - int result = 0, port; - uint32_t bufsize = 0, size; - void *io_data = NULL; - - pr_info("%s\n", __func__); - - if (copy_from_user(&size, arg, sizeof(size))) { - pr_err("CRUS_SP: copy_from_user (size) failed\n"); - result = -EFAULT; - goto exit; - } - - /* Copy IOCTL header from usermode */ - if (copy_from_user(&crus_sp_hdr, arg, size)) { - pr_err("CRUS_SP: copy_from_user (struct) failed\n"); - result = -EFAULT; - goto exit; - } - - bufsize = crus_sp_hdr.data_length; - io_data = kzalloc(bufsize, GFP_KERNEL); - - switch (cmd) { - case CRUS_SP_IOCTL_GET: - switch (crus_sp_hdr.module_id) { - case CRUS_MODULE_ID_TX: - port = this_ctrl.fb_port; - break; - case CRUS_MODULE_ID_RX: - port = this_ctrl.ff_port; - break; - default: - pr_info("CRUS_SP: Unrecognized port ID (%d)\n", - crus_sp_hdr.module_id); - port = this_ctrl.ff_port; - } - if(this_ctrl.q6afe_rev == 2) - crus_afe_get_param(port, CIRRUS_SP, crus_sp_hdr.param_id, - bufsize, io_data); - else - crus_afe_get_param_v3(port, CIRRUS_SP, crus_sp_hdr.param_id, - bufsize, io_data); - result = copy_to_user(crus_sp_hdr.data, io_data, bufsize); - if (result) { - pr_err("CRUS_SP: copy_to_user failed (%d)\n", result); - result = -EFAULT; - } else - result = bufsize; - break; - case CRUS_SP_IOCTL_SET: - result = copy_from_user(io_data, (void *)crus_sp_hdr.data, - bufsize); - if (result) { - pr_err("CRUS_SP: copy_from_user failed (%d)\n", result); - result = -EFAULT; - goto exit_io; - } - - switch (crus_sp_hdr.module_id) { - case CRUS_MODULE_ID_TX: - port = this_ctrl.fb_port; - break; - case CRUS_MODULE_ID_RX: - port = this_ctrl.ff_port; - break; - default: - pr_info("%s: Unrecognized port ID (%d)\n", __func__, - crus_sp_hdr.module_id); - port = this_ctrl.ff_port; - } - - if(this_ctrl.q6afe_rev == 2) { - crus_afe_set_param(port, CIRRUS_SP, - crus_sp_hdr.param_id, bufsize, io_data); - } else { - crus_afe_set_param_v3(port, CIRRUS_SP, - crus_sp_hdr.param_id, bufsize, io_data); - } - break; - - default: - pr_err("CRUS_SP: Invalid IOCTL, command = %d\n", cmd); - result = -EINVAL; - break; - } - -exit_io: - kfree(io_data); -exit: - return result; -} - -static long crus_sp_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - pr_info("%s\n", __func__); - - return crus_sp_shared_ioctl(f, cmd, (void __user *)arg); -} - -static long crus_sp_compat_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - unsigned int cmd64; - - pr_info("%s\n", __func__); - - switch (cmd) { - case CRUS_SP_IOCTL_GET32: - cmd64 = CRUS_SP_IOCTL_GET; - break; - case CRUS_SP_IOCTL_SET32: - cmd64 = CRUS_SP_IOCTL_SET; - break; - default: - pr_err("CRUS_SP: Invalid IOCTL, command = %d\n", cmd); - return -EINVAL; - } - - return crus_sp_shared_ioctl(f, cmd64, compat_ptr(arg)); -} - -static int crus_sp_open(struct inode *inode, struct file *f) -{ - pr_debug("%s\n", __func__); - - atomic_inc(&this_ctrl.count_wait); - return 0; -} - -static int crus_sp_release(struct inode *inode, struct file *f) -{ - atomic_dec(&this_ctrl.count_wait); - return 0; -} - -static ssize_t temperature_left_show(struct device *dev, - struct device_attribute *a, char *buf) -{ - struct crus_rx_temperature_t rx_temp; - static const int material = 250; - static const int scale_factor = 100000; - int buffer[CRUS_MAX_BUFFER_SIZE / 4]; - int out_cal0; - int out_cal1; - int z, r, t; - int temp0; - - crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, - CRUS_MAX_BUFFER_SIZE, buffer); - - memcpy(&rx_temp, buffer, sizeof(rx_temp)); - - out_cal0 = rx_temp.hp_status_l; - out_cal1 = rx_temp.full_status_l; - - z = rx_temp.z_l; - - temp0 = rx_temp.amb_temp_l; - - if ((out_cal0 != 2) || (out_cal1 != 2)) - return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); - - r = rx_temp.temp_l; - t = (material * scale_factor * (r-z) / z) + (temp0 * scale_factor); - - return snprintf(buf, PAGE_SIZE, "%d.%05dc\n", t / scale_factor, - t % scale_factor); -} -static DEVICE_ATTR_RO(temperature_left); - -static ssize_t temperature_right_show(struct device *dev, - struct device_attribute *a, char *buf) -{ - struct crus_rx_temperature_t rx_temp; - static const int material = 250; - static const int scale_factor = 100000; - int buffer[CRUS_MAX_BUFFER_SIZE / 4]; - int out_cal0; - int out_cal1; - int z, r, t; - int temp0; - - crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, - CRUS_MAX_BUFFER_SIZE, buffer); - - memcpy(&rx_temp, buffer, sizeof(rx_temp)); - - out_cal0 = rx_temp.hp_status_r; - out_cal1 = rx_temp.full_status_r; - - z = rx_temp.z_r; - - temp0 = rx_temp.amb_temp_r; - - if ((out_cal0 != 2) || (out_cal1 != 2)) - return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); - - r = rx_temp.temp_r; - t = (material * scale_factor * (r-z) / z) + (temp0 * scale_factor); - - return snprintf(buf, PAGE_SIZE, "%d.%05dc\n", t / scale_factor, - t % scale_factor); -} -static DEVICE_ATTR_RO(temperature_right); - -static ssize_t resistance_left_show(struct device *dev, - struct device_attribute *a, char *buf) -{ - struct crus_rx_temperature_t rx_temp; - static const int scale_factor = 100000000; - static const int amp_factor = 71498; - int buffer[CRUS_MAX_BUFFER_SIZE / 4]; - int out_cal0; - int out_cal1; - int r; - - crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, - CRUS_MAX_BUFFER_SIZE, buffer); - - memcpy(&rx_temp, buffer, sizeof(rx_temp)); - - out_cal0 = rx_temp.hp_status_l; - out_cal1 = rx_temp.full_status_l; - - if ((out_cal0 != 2) || (out_cal1 != 2)) - return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); - - r = rx_temp.temp_l * amp_factor; - - return snprintf(buf, PAGE_SIZE, "%d.%08d ohms\n", r / scale_factor, - r % scale_factor); -} -static DEVICE_ATTR_RO(resistance_left); - -static ssize_t resistance_right_show(struct device *dev, - struct device_attribute *a, char *buf) -{ - struct crus_rx_temperature_t rx_temp; - static const int scale_factor = 100000000; - static const int amp_factor = 71498; - int buffer[CRUS_MAX_BUFFER_SIZE / 4]; - int out_cal0; - int out_cal1; - int r; - - crus_afe_get_param(this_ctrl.ff_port, CIRRUS_SP, CRUS_PARAM_RX_GET_TEMP, - CRUS_MAX_BUFFER_SIZE, buffer); - - memcpy(&rx_temp, buffer, sizeof(rx_temp)); - - out_cal0 = rx_temp.hp_status_r; - out_cal1 = rx_temp.full_status_r; - - if ((out_cal0 != 2) || (out_cal1 != 2)) - return snprintf(buf, PAGE_SIZE, "Calibration is not done\n"); - - r = rx_temp.temp_r * amp_factor; - - return snprintf(buf, PAGE_SIZE, "%d.%08d ohms\n", r / scale_factor, - r % scale_factor); -} -static DEVICE_ATTR_RO(resistance_right); - -static struct attribute *crus_sp_attrs[] = { - &dev_attr_temperature_left.attr, - &dev_attr_temperature_right.attr, - &dev_attr_resistance_left.attr, - &dev_attr_resistance_right.attr, - NULL, -}; - -static const struct attribute_group crus_sp_group = { - .attrs = crus_sp_attrs, -}; - -static const struct attribute_group *crus_sp_groups[] = { - &crus_sp_group, - NULL, -}; - -#ifdef CONFIG_OF -static int msm_cirrus_playback_probe(struct platform_device *pdev) -{ - int i; - - pr_info("CRUS_SP: Initializing platform device\n"); - - this_ctrl.usecase_dt_count = of_property_count_strings(pdev->dev.of_node, - "usecase-names"); - if (this_ctrl.usecase_dt_count <= 0) { - pr_debug("CRUS_SP: Usecase names not found\n"); - this_ctrl.usecase_dt_count = 0; - return 0; - } - - if ((this_ctrl.usecase_dt_count > 0) && - (this_ctrl.usecase_dt_count <= MAX_TUNING_CONFIGS)) - of_property_read_string_array(pdev->dev.of_node, - "usecase-names", - crus_sp_usecase_dt_text, - this_ctrl.usecase_dt_count); - else if (this_ctrl.usecase_dt_count > MAX_TUNING_CONFIGS) { - pr_err("CRUS_SP: Max of %d usecase configs allowed\n", - MAX_TUNING_CONFIGS); - return -EINVAL; - } - - for (i = 0; i < this_ctrl.usecase_dt_count; i++) - pr_info("CRUS_SP: Usecase[%d] = %s\n", i, - crus_sp_usecase_dt_text[i]); - - this_ctrl.prot_en = of_property_read_bool(pdev->dev.of_node, - "protect-en"); - - return 0; -} - -static const struct of_device_id msm_cirrus_playback_dt_match[] = { - {.compatible = "cirrus,msm-cirrus-playback"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_cirrus_playback_dt_match); - -static struct platform_driver msm_cirrus_playback_driver = { - .driver = { - .name = "msm-cirrus-playback", - .owner = THIS_MODULE, - .of_match_table = msm_cirrus_playback_dt_match, - }, - .probe = msm_cirrus_playback_probe, -}; -#endif - -static const struct file_operations crus_sp_fops = { - .owner = THIS_MODULE, - .open = crus_sp_open, - .release = crus_sp_release, - .unlocked_ioctl = crus_sp_ioctl, - .compat_ioctl = crus_sp_compat_ioctl, -}; - -struct miscdevice crus_sp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_cirrus_playback", - .fops = &crus_sp_fops, -}; - -int __init crus_sp_init(void) -{ - pr_info("Initializing misc device\n"); - atomic_set(&this_ctrl.callback_wait, 0); - atomic_set(&this_ctrl.count_wait, 0); - mutex_init(&this_ctrl.param_lock); - mutex_init(&this_ctrl.sp_lock); - - misc_register(&crus_sp_misc); - - if (sysfs_create_groups(&crus_sp_misc.this_device->kobj, - crus_sp_groups)) - pr_err("%s: Could not create sysfs groups\n", __func__); - -#ifdef CONFIG_OF - platform_driver_register(&msm_cirrus_playback_driver); -#endif - return 0; -} - -void __exit crus_sp_exit(void) -{ - pr_debug("%s\n", __func__); - mutex_destroy(&this_ctrl.param_lock); - -#ifdef CONFIG_OF - platform_driver_unregister(&msm_cirrus_playback_driver); -#endif -} - -MODULE_AUTHOR("Cirrus SP"); -MODULE_DESCRIPTION("Providing Interface to Cirrus SP"); -MODULE_LICENSE("GPL"); diff --git a/techpack/audio/dsp/msm-dts-srs-tm-config.c b/techpack/audio/dsp/msm-dts-srs-tm-config.c deleted file mode 100644 index fff98b57287c..000000000000 --- a/techpack/audio/dsp/msm-dts-srs-tm-config.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright (c) 2012-2014, 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int srs_port_id[AFE_MAX_PORTS] = {-1}; -static int srs_copp_idx[AFE_MAX_PORTS] = {-1}; -static union srs_trumedia_params_u msm_srs_trumedia_params; -struct dma_buf *dma_buf; -static struct param_outband po; -static atomic_t ref_cnt; -#define ION_MEM_SIZE (8 * 1024) - -static int set_port_id(int port_id, int copp_idx) -{ - int index = adm_validate_and_get_port_index(port_id); - - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index, - port_id); - return -EINVAL; - } - srs_port_id[index] = port_id; - srs_copp_idx[index] = copp_idx; - return 0; -} - -static void msm_dts_srs_tm_send_params(__s32 port_id, __u32 techs) -{ - __s32 index = adm_validate_and_get_port_index(port_id); - - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id 0x%x\n", - __func__, index, port_id); - return; - } - if ((srs_copp_idx[index] < 0) || - (srs_copp_idx[index] >= MAX_COPPS_PER_PORT)) { - pr_debug("%s: send params called before copp open. so, caching\n", - __func__); - return; - } - pr_debug("SRS %s: called, port_id = %d, techs flags = %u\n", - __func__, port_id, techs); - /* force all if techs is set to 1 */ - if (techs == 1) - techs = 0xFFFFFFFF; - - if (techs & (1 << SRS_ID_WOWHD)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_WOWHD, - (void *)&msm_srs_trumedia_params.srs_params.wowhd); - if (techs & (1 << SRS_ID_CSHP)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_CSHP, - (void *)&msm_srs_trumedia_params.srs_params.cshp); - if (techs & (1 << SRS_ID_HPF)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_HPF, - (void *)&msm_srs_trumedia_params.srs_params.hpf); - if (techs & (1 << SRS_ID_AEQ)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_AEQ, - (void *)&msm_srs_trumedia_params.srs_params.aeq); - if (techs & (1 << SRS_ID_HL)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_HL, - (void *)&msm_srs_trumedia_params.srs_params.hl); - if (techs & (1 << SRS_ID_GEQ)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_GEQ, - (void *)&msm_srs_trumedia_params.srs_params.geq); - if (techs & (1 << SRS_ID_GLOBAL)) - srs_trumedia_open(port_id, srs_copp_idx[index], SRS_ID_GLOBAL, - (void *)&msm_srs_trumedia_params.srs_params.global); -} - - -static int msm_dts_srs_trumedia_control_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = 0; - return 0; -} - -static int msm_dts_srs_trumedia_control_set_(int port_id, - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - - __u16 offset, value, max = sizeof(msm_srs_trumedia_params) >> 1; - - if (SRS_CMD_UPLOAD == - (ucontrol->value.integer.value[0] & SRS_CMD_UPLOAD)) { - __u32 techs = ucontrol->value.integer.value[0] & 0xFF; - __s32 index = adm_validate_and_get_port_index(port_id); - - if (index < 0) { - pr_err("%s: Invalid port idx %d port_id 0x%x\n", - __func__, index, port_id); - return -EINVAL; - } - pr_debug("SRS %s: send params request, flag = %u\n", - __func__, techs); - if (srs_port_id[index] >= 0 && techs) - msm_dts_srs_tm_send_params(port_id, techs); - return 0; - } - offset = (__u16)((ucontrol->value.integer.value[0] & - SRS_PARAM_OFFSET_MASK) >> 16); - value = (__u16)(ucontrol->value.integer.value[0] & - SRS_PARAM_VALUE_MASK); - if (offset < max) { - msm_srs_trumedia_params.raw_params[offset] = value; - pr_debug("SRS %s: index set... (max %d, requested %d, value 0x%X)\n", - __func__, max, offset, value); - } else { - pr_err("SRS %s: index out of bounds! (max %d, requested %d)\n", - __func__, max, offset); - } - return 0; -} - -static int msm_dts_srs_trumedia_control_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control normal called\n"); - msm_dts_srs_acquire_lock(); - port_id = SLIMBUS_0_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static int msm_dts_srs_trumedia_control_i2s_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control I2S called\n"); - msm_dts_srs_acquire_lock(); - port_id = PRIMARY_I2S_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static int msm_dts_srs_trumedia_control_mi2s_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control MI2S called\n"); - msm_dts_srs_acquire_lock(); - port_id = AFE_PORT_ID_PRIMARY_MI2S_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static int msm_dts_srs_trumedia_control_hdmi_set(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int ret, port_id; - - pr_debug("SRS control HDMI called\n"); - msm_dts_srs_acquire_lock(); - port_id = HDMI_RX; - ret = msm_dts_srs_trumedia_control_set_(port_id, kcontrol, ucontrol); - msm_dts_srs_release_lock(); - return ret; -} - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls[] = { - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - {.reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls_hdmi[] = { - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia HDMI", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_hdmi_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - {.reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls_i2s[] = { - {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia I2S", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_i2s_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - {.reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -static const struct snd_kcontrol_new lpa_srs_trumedia_controls_mi2s[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SRS TruMedia MI2S", - .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | - SNDRV_CTL_ELEM_ACCESS_READWRITE, - .info = snd_soc_info_volsw, - .get = msm_dts_srs_trumedia_control_get, - .put = msm_dts_srs_trumedia_control_mi2s_set, - .private_value = ((unsigned long)&(struct soc_mixer_control) - { - .reg = SND_SOC_NOPM, - .rreg = SND_SOC_NOPM, - .shift = 0, - .rshift = 0, - .max = 0xFFFFFFFF, - .platform_max = 0xFFFFFFFF, - .invert = 0 - }) - } -}; - -/** - * msm_dts_srs_tm_add_controls - - * Add DTS SRS module controls - * - * @platform: component to which controls can be registered - * - */ -void msm_dts_srs_tm_add_controls(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls, - ARRAY_SIZE(lpa_srs_trumedia_controls)); - - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls_hdmi, - ARRAY_SIZE(lpa_srs_trumedia_controls_hdmi)); - - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls_i2s, - ARRAY_SIZE(lpa_srs_trumedia_controls_i2s)); - snd_soc_add_platform_controls(platform, - lpa_srs_trumedia_controls_mi2s, - ARRAY_SIZE(lpa_srs_trumedia_controls_mi2s)); -} -EXPORT_SYMBOL(msm_dts_srs_tm_add_controls); - -static int reg_ion_mem(void) -{ - int rc; - - rc = msm_audio_ion_alloc(&dma_buf, ION_MEM_SIZE, - &po.paddr, (size_t *)&po.size, - &po.kvaddr); - if (rc != 0) - pr_err("%s: failed to allocate memory.\n", __func__); - pr_debug("%s: exited dma_buf = %pK, phys_addr = %lu, length = %d, vaddr = %pK, rc = 0x%x\n", - __func__, dma_buf, (long)po.paddr, - (unsigned int)po.size, po.kvaddr, rc); - return rc; -} - -void msm_dts_srs_tm_ion_memmap(struct param_outband *po_) -{ - if (po.kvaddr == NULL) { - pr_debug("%s: callingreg_ion_mem()\n", __func__); - reg_ion_mem(); - } - po_->size = ION_MEM_SIZE; - po_->kvaddr = po.kvaddr; - po_->paddr = po.paddr; -} - -static void unreg_ion_mem(void) -{ - msm_audio_ion_free(dma_buf); - dma_buf = NULL; - po.kvaddr = NULL; - po.paddr = 0; - po.size = 0; -} - -/** - * msm_dts_srs_tm_deinit - - * De-Initializes DTS SRS module - * - * @port_id: Port ID number - * - */ -void msm_dts_srs_tm_deinit(int port_id) -{ - set_port_id(port_id, -1); - atomic_dec(&ref_cnt); - if (po.kvaddr != NULL) { - if (!atomic_read(&ref_cnt)) { - pr_debug("%s: calling unreg_ion_mem()\n", __func__); - unreg_ion_mem(); - } - } -} -EXPORT_SYMBOL(msm_dts_srs_tm_deinit); - -/** - * msm_dts_srs_tm_init - - * Initializes DTS SRS module - * - * @port_id: Port ID number - * @copp_idx: COPP index - * - */ -void msm_dts_srs_tm_init(int port_id, int copp_idx) -{ - int cur_ref_cnt = 0; - - if (set_port_id(port_id, copp_idx) < 0) { - pr_err("%s: Invalid port_id: %d\n", __func__, port_id); - return; - } - - cur_ref_cnt = atomic_read(&ref_cnt); - atomic_inc(&ref_cnt); - if (!cur_ref_cnt && po.kvaddr == NULL) { - pr_debug("%s: calling reg_ion_mem()\n", __func__); - if (reg_ion_mem() != 0) { - atomic_dec(&ref_cnt); - po.kvaddr = NULL; - return; - } - } - msm_dts_srs_tm_send_params(port_id, 1); -} -EXPORT_SYMBOL(msm_dts_srs_tm_init); diff --git a/techpack/audio/dsp/msm_audio_ion.c b/techpack/audio/dsp/msm_audio_ion.c deleted file mode 100644 index 1dec33e33f13..000000000000 --- a/techpack/audio/dsp/msm_audio_ion.c +++ /dev/null @@ -1,879 +0,0 @@ -/* - * Copyright (c) 2013-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MSM_AUDIO_ION_PROBED (1 << 0) - -#define MSM_AUDIO_ION_PHYS_ADDR(alloc_data) \ - alloc_data->table->sgl->dma_address - -#define MSM_AUDIO_ION_VA_START 0x10000000 -#define MSM_AUDIO_ION_VA_LEN 0x0FFFFFFF - -#define MSM_AUDIO_SMMU_SID_OFFSET 32 - -struct msm_audio_ion_private { - bool smmu_enabled; - struct device *cb_dev; - struct dma_iommu_mapping *mapping; - u8 device_status; - struct list_head alloc_list; - struct mutex list_mutex; - u64 smmu_sid_bits; - u32 smmu_version; - u32 iova_start_addr; -}; - -struct msm_audio_alloc_data { - size_t len; - void *vaddr; - struct dma_buf *dma_buf; - struct dma_buf_attachment *attach; - struct sg_table *table; - struct list_head list; -}; - -static struct msm_audio_ion_private msm_audio_ion_data = {0,}; - -static void msm_audio_ion_add_allocation( - struct msm_audio_ion_private *msm_audio_ion_data, - struct msm_audio_alloc_data *alloc_data) -{ - /* - * Since these APIs can be invoked by multiple - * clients, there is need to make sure the list - * of allocations is always protected - */ - mutex_lock(&(msm_audio_ion_data->list_mutex)); - list_add_tail(&(alloc_data->list), - &(msm_audio_ion_data->alloc_list)); - mutex_unlock(&(msm_audio_ion_data->list_mutex)); -} - -static int msm_audio_dma_buf_map(struct dma_buf *dma_buf, - dma_addr_t *addr, size_t *len) -{ - - struct msm_audio_alloc_data *alloc_data; - struct device *cb_dev; - unsigned long ionflag = 0; - int rc = 0; - - cb_dev = msm_audio_ion_data.cb_dev; - - /* Data required per buffer mapping */ - alloc_data = kzalloc(sizeof(*alloc_data), GFP_KERNEL); - if (!alloc_data) - return -ENOMEM; - - alloc_data->dma_buf = dma_buf; - alloc_data->len = dma_buf->size; - *len = dma_buf->size; - - /* Attach the dma_buf to context bank device */ - alloc_data->attach = dma_buf_attach(alloc_data->dma_buf, - cb_dev); - if (IS_ERR(alloc_data->attach)) { - rc = PTR_ERR(alloc_data->attach); - dev_err(cb_dev, - "%s: Fail to attach dma_buf to CB, rc = %d\n", - __func__, rc); - goto free_alloc_data; - } - - /* For uncached buffers, avoid cache maintanance */ - rc = dma_buf_get_flags(alloc_data->dma_buf, &ionflag); - if (rc) { - dev_err(cb_dev, "%s: dma_buf_get_flags failed: %d\n", - __func__, rc); - goto detach_dma_buf; - } - - if (!(ionflag & ION_FLAG_CACHED)) - alloc_data->attach->dma_map_attrs |= DMA_ATTR_SKIP_CPU_SYNC; - - /* - * Get the scatter-gather list. - * There is no info as this is a write buffer or - * read buffer, hence the request is bi-directional - * to accommodate both read and write mappings. - */ - alloc_data->table = dma_buf_map_attachment(alloc_data->attach, - DMA_BIDIRECTIONAL); - if (IS_ERR(alloc_data->table)) { - rc = PTR_ERR(alloc_data->table); - dev_err(cb_dev, - "%s: Fail to map attachment, rc = %d\n", - __func__, rc); - goto detach_dma_buf; - } - - /* physical address from mapping */ - *addr = MSM_AUDIO_ION_PHYS_ADDR(alloc_data); - - msm_audio_ion_add_allocation(&msm_audio_ion_data, - alloc_data); - return rc; - -detach_dma_buf: - dma_buf_detach(alloc_data->dma_buf, - alloc_data->attach); -free_alloc_data: - kfree(alloc_data); - - return rc; -} - -static int msm_audio_dma_buf_unmap(struct dma_buf *dma_buf) -{ - int rc = 0; - struct msm_audio_alloc_data *alloc_data = NULL; - struct list_head *ptr, *next; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - bool found = false; - - /* - * Though list_for_each_safe is delete safe, lock - * should be explicitly acquired to avoid race condition - * on adding elements to the list. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_safe(ptr, next, - &(msm_audio_ion_data.alloc_list)) { - - alloc_data = list_entry(ptr, struct msm_audio_alloc_data, - list); - - if (alloc_data->dma_buf == dma_buf) { - found = true; - dma_buf_unmap_attachment(alloc_data->attach, - alloc_data->table, - DMA_BIDIRECTIONAL); - - dma_buf_detach(alloc_data->dma_buf, - alloc_data->attach); - - dma_buf_put(alloc_data->dma_buf); - - list_del(&(alloc_data->list)); - kfree(alloc_data); - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - dev_err(cb_dev, - "%s: cannot find allocation, dma_buf %pK", - __func__, dma_buf); - rc = -EINVAL; - } - - return rc; -} - -static int msm_audio_ion_get_phys(struct dma_buf *dma_buf, - dma_addr_t *addr, size_t *len) -{ - int rc = 0; - - rc = msm_audio_dma_buf_map(dma_buf, addr, len); - if (rc) { - pr_err("%s: failed to map DMA buf, err = %d\n", - __func__, rc); - goto err; - } - if (msm_audio_ion_data.smmu_enabled) { - /* Append the SMMU SID information to the IOVA address */ - *addr |= msm_audio_ion_data.smmu_sid_bits; - } - - pr_debug("phys=%pK, len=%zd, rc=%d\n", &(*addr), *len, rc); -err: - return rc; -} - -int msm_audio_ion_get_smmu_info(struct device **cb_dev, - u64 *smmu_sid) -{ - if (!cb_dev || !smmu_sid) { - pr_err("%s: Invalid params\n", - __func__); - return -EINVAL; - } - - if (!msm_audio_ion_data.cb_dev || - !msm_audio_ion_data.smmu_sid_bits) { - pr_err("%s: Params not initialized\n", - __func__); - return -EINVAL; - } - - *cb_dev = msm_audio_ion_data.cb_dev; - *smmu_sid = msm_audio_ion_data.smmu_sid_bits; - - return 0; -} - -static void *msm_audio_ion_map_kernel(struct dma_buf *dma_buf) -{ - int rc = 0; - void *addr = NULL; - struct msm_audio_alloc_data *alloc_data = NULL; - - rc = dma_buf_begin_cpu_access(dma_buf, DMA_BIDIRECTIONAL); - if (rc) { - pr_err("%s: kmap dma_buf_begin_cpu_access fail\n", __func__); - goto exit; - } - - addr = dma_buf_vmap(dma_buf); - if (!addr) { - pr_err("%s: kernel mapping of dma_buf failed\n", - __func__); - goto exit; - } - - /* - * TBD: remove the below section once new API - * for mapping kernel virtual address is available. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->dma_buf == dma_buf) { - alloc_data->vaddr = addr; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - -exit: - return addr; -} - -static int msm_audio_ion_unmap_kernel(struct dma_buf *dma_buf) -{ - int rc = 0; - void *vaddr = NULL; - struct msm_audio_alloc_data *alloc_data = NULL; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - /* - * TBD: remove the below section once new API - * for unmapping kernel virtual address is available. - */ - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->dma_buf == dma_buf) { - vaddr = alloc_data->vaddr; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!vaddr) { - dev_err(cb_dev, - "%s: cannot find allocation for dma_buf %pK", - __func__, dma_buf); - rc = -EINVAL; - goto err; - } - - dma_buf_vunmap(dma_buf, vaddr); - - rc = dma_buf_end_cpu_access(dma_buf, DMA_BIDIRECTIONAL); - if (rc) { - dev_err(cb_dev, "%s: kmap dma_buf_end_cpu_access fail\n", - __func__); - goto err; - } - -err: - return rc; -} - -static int msm_audio_ion_map_buf(struct dma_buf *dma_buf, dma_addr_t *paddr, - size_t *plen, void **vaddr) -{ - int rc = 0; - - rc = msm_audio_ion_get_phys(dma_buf, paddr, plen); - if (rc) { - pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", - __func__, rc); - dma_buf_put(dma_buf); - goto err; - } - - *vaddr = msm_audio_ion_map_kernel(dma_buf); - if (IS_ERR_OR_NULL(*vaddr)) { - pr_err("%s: ION memory mapping for AUDIO failed\n", __func__); - rc = -ENOMEM; - msm_audio_dma_buf_unmap(dma_buf); - goto err; - } - -err: - return rc; -} - -static u32 msm_audio_ion_get_smmu_sid_mode32(void) -{ - if (msm_audio_ion_data.smmu_enabled) - return upper_32_bits(msm_audio_ion_data.smmu_sid_bits); - else - return 0; -} - -/** - * msm_audio_ion_alloc - - * Allocs ION memory for given client name - * - * @dma_buf: dma_buf for the ION memory - * @bufsz: buffer size - * @paddr: Physical address to be assigned with allocated region - * @plen: length of allocated region to be assigned - * vaddr: virtual address to be assigned - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz, - dma_addr_t *paddr, size_t *plen, void **vaddr) -{ - int rc = -EINVAL; - unsigned long err_ion_ptr = 0; - - if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) { - pr_debug("%s:probe is not done, deferred\n", __func__); - return -EPROBE_DEFER; - } - if (!dma_buf || !paddr || !vaddr || !bufsz || !plen) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - if (msm_audio_ion_data.smmu_enabled == true) { - pr_debug("%s: system heap is used\n", __func__); - *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_SYSTEM_HEAP_ID), 0); - } else { - pr_debug("%s: audio heap is used\n", __func__); - *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - } - if (IS_ERR_OR_NULL((void *)(*dma_buf))) { - if (IS_ERR((void *)(*dma_buf))) - err_ion_ptr = PTR_ERR((int *)(*dma_buf)); - pr_err("%s: ION alloc fail err ptr=%ld, smmu_enabled=%d\n", - __func__, err_ion_ptr, msm_audio_ion_data.smmu_enabled); - rc = -ENOMEM; - goto err; - } - - rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr); - if (rc) { - pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); - goto err; - } - pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, - *vaddr, bufsz); - - memset(*vaddr, 0, bufsz); - -err: - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_alloc); - -/** - * msm_audio_ion_dma_map - - * Memory maps for a given DMA buffer - * - * @phys_addr: Physical address of DMA buffer to be mapped - * @iova_base: IOVA address of memory mapped DMA buffer - * @size: buffer size - * @dir: DMA direction - * Returns 0 on success or error on failure - */ -int msm_audio_ion_dma_map(dma_addr_t *phys_addr, dma_addr_t *iova_base, - u32 size, enum dma_data_direction dir) -{ - dma_addr_t iova; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - if (!phys_addr || !iova_base || !size) - return -EINVAL; - - iova = dma_map_resource(cb_dev, *phys_addr, size, - dir, 0); - if (dma_mapping_error(cb_dev, iova)) { - pr_err("%s: dma_mapping_error\n", __func__); - return -EIO; - } - pr_debug("%s: dma_mapping_success iova:0x%lx\n", __func__, - (unsigned long)iova); - if (msm_audio_ion_data.smmu_enabled) - /* Append the SMMU SID information to the IOVA address */ - iova |= msm_audio_ion_data.smmu_sid_bits; - - *iova_base = iova; - - return 0; -} -EXPORT_SYMBOL(msm_audio_ion_dma_map); - -/** - * msm_audio_ion_import- - * Import ION buffer with given file descriptor - * - * @dma_buf: dma_buf for the ION memory - * @fd: file descriptor for the ION memory - * @ionflag: flags associated with ION buffer - * @bufsz: buffer size - * @paddr: Physical address to be assigned with allocated region - * @plen: length of allocated region to be assigned - * vaddr: virtual address to be assigned - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_import(struct dma_buf **dma_buf, int fd, - unsigned long *ionflag, size_t bufsz, - dma_addr_t *paddr, size_t *plen, void **vaddr) -{ - int rc = 0; - - if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) { - pr_debug("%s: probe is not done, deferred\n", __func__); - return -EPROBE_DEFER; - } - - if (!dma_buf || !paddr || !vaddr || !plen) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - - /* bufsz should be 0 and fd shouldn't be 0 as of now */ - *dma_buf = dma_buf_get(fd); - pr_debug("%s: dma_buf =%pK, fd=%d\n", __func__, *dma_buf, fd); - if (IS_ERR_OR_NULL((void *)(*dma_buf))) { - pr_err("%s: dma_buf_get failed\n", __func__); - rc = -EINVAL; - goto err; - } - - if (ionflag != NULL) { - rc = dma_buf_get_flags(*dma_buf, ionflag); - if (rc) { - pr_err("%s: could not get flags for the dma_buf\n", - __func__); - goto err_ion_flag; - } - } - - rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr); - if (rc) { - pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); - goto err; - } - pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, - *vaddr, bufsz); - - return 0; - -err_ion_flag: - dma_buf_put(*dma_buf); -err: - *dma_buf = NULL; - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_import); - -/** - * msm_audio_ion_free - - * fress ION memory for given client and handle - * - * @dma_buf: dma_buf for the ION memory - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_free(struct dma_buf *dma_buf) -{ - int ret = 0; - - if (!dma_buf) { - pr_err("%s: dma_buf invalid\n", __func__); - return -EINVAL; - } - - ret = msm_audio_ion_unmap_kernel(dma_buf); - if (ret) - return ret; - - msm_audio_dma_buf_unmap(dma_buf); - - return 0; -} -EXPORT_SYMBOL(msm_audio_ion_free); - -/** - * msm_audio_ion_mmap - - * Audio ION memory map - * - * @abuff: audio buf pointer - * @vma: virtual mem area - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_mmap(struct audio_buffer *abuff, - struct vm_area_struct *vma) -{ - struct msm_audio_alloc_data *alloc_data = NULL; - struct sg_table *table; - unsigned long addr = vma->vm_start; - unsigned long offset = vma->vm_pgoff * PAGE_SIZE; - struct scatterlist *sg; - unsigned int i; - struct page *page; - int ret = 0; - bool found = false; - struct device *cb_dev = msm_audio_ion_data.cb_dev; - - mutex_lock(&(msm_audio_ion_data.list_mutex)); - list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list), - list) { - if (alloc_data->dma_buf == abuff->dma_buf) { - found = true; - table = alloc_data->table; - break; - } - } - mutex_unlock(&(msm_audio_ion_data.list_mutex)); - - if (!found) { - dev_err(cb_dev, - "%s: cannot find allocation, dma_buf %pK", - __func__, abuff->dma_buf); - return -EINVAL; - } - /* uncached */ - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - - /* We need to check if a page is associated with this sg list because: - * If the allocation came from a carveout we currently don't have - * pages associated with carved out memory. This might change in the - * future and we can remove this check and the else statement. - */ - page = sg_page(table->sgl); - if (page) { - pr_debug("%s: page is NOT null\n", __func__); - for_each_sg(table->sgl, sg, table->nents, i) { - unsigned long remainder = vma->vm_end - addr; - unsigned long len = sg->length; - - page = sg_page(sg); - - if (offset >= len) { - offset -= len; - continue; - } else if (offset) { - page += offset / PAGE_SIZE; - len -= offset; - offset = 0; - } - len = min(len, remainder); - pr_debug("vma=%pK, addr=%x len=%ld vm_start=%x vm_end=%x vm_page_prot=%lu\n", - vma, (unsigned int)addr, len, - (unsigned int)vma->vm_start, - (unsigned int)vma->vm_end, - (unsigned long)pgprot_val(vma->vm_page_prot)); - remap_pfn_range(vma, addr, page_to_pfn(page), len, - vma->vm_page_prot); - addr += len; - if (addr >= vma->vm_end) - return 0; - } - } else { - pr_debug("%s: page is NULL\n", __func__); - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(msm_audio_ion_mmap); - -/** - * msm_audio_ion_cache_operations- - * Cache operations on cached Audio ION buffers - * - * @abuff: audio buf pointer - * @cache_op: cache operation to be performed - * - * Returns 0 on success or error on failure - */ -int msm_audio_ion_cache_operations(struct audio_buffer *abuff, int cache_op) -{ - unsigned long ionflag = 0; - int rc = 0; - - if (!abuff) { - pr_err("%s: Invalid params: %pK\n", __func__, abuff); - return -EINVAL; - } - rc = dma_buf_get_flags(abuff->dma_buf, &ionflag); - if (rc) { - pr_err("%s: dma_buf_get_flags failed: %d\n", __func__, rc); - goto cache_op_failed; - } - - /* Has to be CACHED */ - if (ionflag & ION_FLAG_CACHED) { - /* MSM_AUDIO_ION_INV_CACHES or MSM_AUDIO_ION_CLEAN_CACHES */ - switch (cache_op) { - case MSM_AUDIO_ION_INV_CACHES: - case MSM_AUDIO_ION_CLEAN_CACHES: - dma_buf_begin_cpu_access(abuff->dma_buf, - DMA_BIDIRECTIONAL); - dma_buf_end_cpu_access(abuff->dma_buf, - DMA_BIDIRECTIONAL); - break; - default: - pr_err("%s: Invalid cache operation %d\n", - __func__, cache_op); - } - } else { - pr_err("%s: Cache ops called on uncached buffer: %pK\n", - __func__, abuff->dma_buf); - rc = -EINVAL; - } - -cache_op_failed: - return rc; -} -EXPORT_SYMBOL(msm_audio_ion_cache_operations); - -/** - * msm_audio_populate_upper_32_bits - - * retrieve upper 32bits of 64bit address - * - * @pa: 64bit physical address - * - */ -u32 msm_audio_populate_upper_32_bits(dma_addr_t pa) -{ - if (sizeof(dma_addr_t) == sizeof(u32)) - return msm_audio_ion_get_smmu_sid_mode32(); - else - return upper_32_bits(pa); -} -EXPORT_SYMBOL(msm_audio_populate_upper_32_bits); - -static int msm_audio_smmu_init(struct device *dev) -{ - struct dma_iommu_mapping *mapping; - int ret; - - mapping = arm_iommu_create_mapping(&platform_bus_type, - msm_audio_ion_data.iova_start_addr, - MSM_AUDIO_ION_VA_LEN); - if (IS_ERR(mapping)) - return PTR_ERR(mapping); - - ret = arm_iommu_attach_device(dev, mapping); - if (ret) { - dev_err(dev, "%s: Attach failed, err = %d\n", - __func__, ret); - goto fail_attach; - } - - msm_audio_ion_data.mapping = mapping; - INIT_LIST_HEAD(&msm_audio_ion_data.alloc_list); - mutex_init(&(msm_audio_ion_data.list_mutex)); - - return 0; - -fail_attach: - arm_iommu_release_mapping(mapping); - return ret; -} - -static const struct of_device_id msm_audio_ion_dt_match[] = { - { .compatible = "qcom,msm-audio-ion" }, - { } -}; -MODULE_DEVICE_TABLE(of, msm_audio_ion_dt_match); - -static int msm_audio_ion_probe(struct platform_device *pdev) -{ - int rc = 0; - u64 smmu_sid = 0; - u64 smmu_sid_mask = 0; - const char *msm_audio_ion_dt = "qcom,smmu-enabled"; - const char *msm_audio_ion_smmu = "qcom,smmu-version"; - const char *msm_audio_ion_iova_start_addr = "qcom,iova-start-addr"; - const char *msm_audio_ion_smmu_sid_mask = "qcom,smmu-sid-mask"; - bool smmu_enabled; - enum apr_subsys_state q6_state; - struct device *dev = &pdev->dev; - struct of_phandle_args iommuspec; - - - if (dev->of_node == NULL) { - dev_err(dev, - "%s: device tree is not found\n", - __func__); - msm_audio_ion_data.smmu_enabled = 0; - return 0; - } - - smmu_enabled = of_property_read_bool(dev->of_node, - msm_audio_ion_dt); - msm_audio_ion_data.smmu_enabled = smmu_enabled; - - if (!smmu_enabled) { - dev_dbg(dev, "%s: SMMU is Disabled\n", __func__); - goto exit; - } - - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - dev_dbg(dev, - "defering %s, adsp_state %d\n", - __func__, q6_state); - return -EPROBE_DEFER; - } - dev_dbg(dev, "%s: adsp is ready\n", __func__); - - rc = of_property_read_u32(dev->of_node, - msm_audio_ion_smmu, - &msm_audio_ion_data.smmu_version); - if (rc) { - dev_err(dev, - "%s: qcom,smmu_version missing in DT node\n", - __func__); - return rc; - } - dev_dbg(dev, "%s: SMMU is Enabled. SMMU version is (%d)", - __func__, msm_audio_ion_data.smmu_version); - - rc = of_property_read_u32(dev->of_node, - msm_audio_ion_iova_start_addr, - &msm_audio_ion_data.iova_start_addr); - if (rc) { - dev_dbg(dev, - "%s: qcom,iova_start_addr missing in DT node, initialize with default val\n", - __func__); - msm_audio_ion_data.iova_start_addr = MSM_AUDIO_ION_VA_START; - } else { - dev_dbg(dev, "%s:IOVA start addr: 0x%x\n", - __func__, msm_audio_ion_data.iova_start_addr); - } - /* Get SMMU SID information from Devicetree */ - rc = of_property_read_u64(dev->of_node, - msm_audio_ion_smmu_sid_mask, - &smmu_sid_mask); - if (rc) { - dev_err(dev, - "%s: qcom,smmu-sid-mask missing in DT node, using default\n", - __func__); - smmu_sid_mask = 0xFFFFFFFFFFFFFFFF; - } - - rc = of_parse_phandle_with_args(dev->of_node, "iommus", - "#iommu-cells", 0, &iommuspec); - if (rc) - dev_err(dev, "%s: could not get smmu SID, ret = %d\n", - __func__, rc); - else - smmu_sid = (iommuspec.args[0] & smmu_sid_mask); - - msm_audio_ion_data.smmu_sid_bits = - smmu_sid << MSM_AUDIO_SMMU_SID_OFFSET; - - if (msm_audio_ion_data.smmu_version == 0x2) { - rc = msm_audio_smmu_init(dev); - } else { - dev_err(dev, "%s: smmu version invalid %d\n", - __func__, msm_audio_ion_data.smmu_version); - rc = -EINVAL; - } - if (rc) - dev_err(dev, "%s: smmu init failed, err = %d\n", - __func__, rc); - -exit: - if (!rc) - msm_audio_ion_data.device_status |= MSM_AUDIO_ION_PROBED; - - msm_audio_ion_data.cb_dev = dev; - - return rc; -} - -static int msm_audio_ion_remove(struct platform_device *pdev) -{ - struct dma_iommu_mapping *mapping; - struct device *audio_cb_dev; - - mapping = msm_audio_ion_data.mapping; - audio_cb_dev = msm_audio_ion_data.cb_dev; - - if (audio_cb_dev && mapping) { - arm_iommu_detach_device(audio_cb_dev); - arm_iommu_release_mapping(mapping); - } - - msm_audio_ion_data.smmu_enabled = 0; - msm_audio_ion_data.device_status = 0; - return 0; -} - -static struct platform_driver msm_audio_ion_driver = { - .driver = { - .name = "msm-audio-ion", - .owner = THIS_MODULE, - .of_match_table = msm_audio_ion_dt_match, - }, - .probe = msm_audio_ion_probe, - .remove = msm_audio_ion_remove, -}; - -int __init msm_audio_ion_init(void) -{ - return platform_driver_register(&msm_audio_ion_driver); -} - -void msm_audio_ion_exit(void) -{ - platform_driver_unregister(&msm_audio_ion_driver); -} - -MODULE_DESCRIPTION("MSM Audio ION module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/msm_mdf.c b/techpack/audio/dsp/msm_mdf.c deleted file mode 100644 index 9c73e55f12dd..000000000000 --- a/techpack/audio/dsp/msm_mdf.c +++ /dev/null @@ -1,728 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define VMID_SSC_Q6 5 -#define VMID_LPASS 6 -#define VMID_MSS_MSA 15 -#define VMID_CDSP 30 - -#define MSM_MDF_PROBED (1 << 0) -#define MSM_MDF_INITIALIZED (1 << 1) -#define MSM_MDF_MEM_ALLOCATED (1 << 2) -#define MSM_MDF_MEM_MAPPED (1 << 3) -#define MSM_MDF_MEM_PERMISSION (1 << 4) /* 0 - HLOS, 1 - Subsys */ - -/* TODO: Update IOVA range for subsys SMMUs */ -#define MSM_MDF_IOVA_START 0x80000000 -#define MSM_MDF_IOVA_LEN 0x800000 - -#define MSM_MDF_SMMU_SID_OFFSET 32 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 - -/* mem protection defines */ -#define TZ_MPU_LOCK_NS_REGION 0x00000025 -#define MEM_PROTECT_AC_PERM_READ 0x4 -#define MEM_PROTECT_AC_PERM_WRITE 0x2 - -#define MSM_AUDIO_SMMU_SID_OFFSET 32 - -enum { - SUBSYS_ADSP, /* Audio DSP must have index 0 */ - SUBSYS_SCC, /* Sensor DSP */ - SUBSYS_MSS, /* Modem DSP */ - SUBSYS_CDSP, /* Compute DSP */ - SUBSYS_MAX, -}; - -struct msm_mdf_dest_vm_and_perm_info { - uint32_t dst_vm; - /* Destination VM defined by ACVirtualMachineId. */ - uint32_t dst_vm_perm; - /* Permissions of the IPA to be mapped to VM, bitwise OR of AC_PERM. */ - uint64_t ctx; - /* Destination of the VM-specific context information. */ - uint32_t ctx_size; - /* Size of context buffer in bytes. */ -}; - -struct msm_mdf_protect_mem { - uint64_t dma_start_address; - uint64_t dma_end_address; - struct msm_mdf_dest_vm_and_perm_info dest_info[SUBSYS_MAX]; - uint32_t dest_info_size; -}; - -struct msm_mdf_mem { - struct device *dev; - uint8_t device_status; - uint32_t map_handle; - struct dma_buf *dma_buf; - dma_addr_t dma_addr; - size_t size; - void *va; -}; - -static struct msm_mdf_mem mdf_mem_data = {NULL,}; - -struct msm_mdf_smmu { - bool enabled; - char *subsys; - int vmid; - uint32_t proc_id; - struct device *cb_dev; - uint8_t device_status; - uint64_t sid; - struct dma_iommu_mapping *mapping; - dma_addr_t pa; - size_t pa_len; -}; - -static struct msm_mdf_smmu mdf_smmu_data[SUBSYS_MAX] = { - { - .subsys = "adsp", - .vmid = VMID_LPASS, - }, - { - .subsys = "dsps", - .vmid = VMID_SSC_Q6, - .proc_id = AVS_MDF_SSC_PROC_ID, - }, - { - .subsys = "modem", - .vmid = VMID_MSS_MSA, - .proc_id = AVS_MDF_MDSP_PROC_ID, - }, - { - .subsys = "cdsp", - .vmid = VMID_CDSP, - .proc_id = AVS_MDF_CDSP_PROC_ID, - }, -}; - -static void *ssr_handle; - -static inline uint64_t buf_page_start(uint64_t buf) -{ - uint64_t start = (uint64_t) buf & PAGE_MASK; - return start; -} - -static inline uint64_t buf_page_offset(uint64_t buf) -{ - uint64_t offset = (uint64_t) buf & (PAGE_SIZE - 1); - return offset; -} - -static inline int buf_num_pages(uint64_t buf, ssize_t len) -{ - uint64_t start = buf_page_start(buf) >> PAGE_SHIFT; - uint64_t end = (((uint64_t) buf + len - 1) & PAGE_MASK) >> PAGE_SHIFT; - int nPages = end - start + 1; - return nPages; -} - -static inline uint64_t buf_page_size(uint32_t size) -{ - uint64_t sz = (size + (PAGE_SIZE - 1)) & PAGE_MASK; - - return sz > PAGE_SIZE ? sz : PAGE_SIZE; -} - -static inline void *uint64_to_ptr(uint64_t addr) -{ - void *ptr = (void *)((uintptr_t)addr); - return ptr; -} - -static inline uint64_t ptr_to_uint64(void *ptr) -{ - uint64_t addr = (uint64_t)((uintptr_t)ptr); - return addr; -} - -static int msm_mdf_dma_buf_map(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - int rc = 0; - - if (!smmu) - return -EINVAL; - if (smmu->device_status & MSM_MDF_MEM_MAPPED) - return 0; - if (smmu->enabled) { - if (smmu->cb_dev == NULL) { - pr_err("%s: cb device is not initialized\n", - __func__); - /* Retry if LPASS cb device is not ready - * from audio ION during probing. - */ - if (!strcmp("adsp", smmu->subsys)) { - rc = msm_audio_ion_get_smmu_info(&smmu->cb_dev, - &smmu->sid); - if (rc) { - pr_err("%s: msm_audio_ion_get_smmu_info failed, rc = %d\n", - __func__, rc); - goto err; - } - } else - return -ENODEV; - } - - smmu->pa = dma_map_single_attrs(smmu->cb_dev, mem->va, - mem->size, DMA_BIDIRECTIONAL, DMA_ATTR_SKIP_CPU_SYNC); - if (dma_mapping_error(smmu->cb_dev, smmu->pa)) { - rc = -ENOMEM; - pr_err("%s: failed to map single, rc = %d\n", - __func__, rc); - goto err; - } - smmu->pa_len = mem->size; - - /* Append the SMMU SID information to the IOVA address */ - if (smmu->sid) - smmu->pa |= smmu->sid; - } else { - smmu->pa = mem->dma_addr; - smmu->pa_len = mem->size; - } - pr_err("%s: pa=%pa, pa_len=%zd\n", __func__, - &smmu->pa, smmu->pa_len); - - smmu->device_status |= MSM_MDF_MEM_MAPPED; - - return 0; -err: - return rc; -} - -static int msm_mdf_alloc_dma_buf(struct msm_mdf_mem *mem) -{ - int rc = 0; - - if (!mem) - return -EINVAL; - - if (mem->device_status & MSM_MDF_MEM_ALLOCATED) - return 0; - - if (mem->dev == NULL) { - pr_err("%s: device is not initialized\n", - __func__); - return -ENODEV; - } - - mem->va = dma_alloc_attrs(mem->dev, mem->size, - &mem->dma_addr, GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); - if (IS_ERR_OR_NULL(mem->va)) { - pr_err("%s: failed to allocate dma memory, rc = %d\n", - __func__, rc); - return -ENOMEM; - } - mem->va = phys_to_virt(mem->dma_addr); - mem->device_status |= MSM_MDF_MEM_ALLOCATED; - return rc; -} - -static int msm_mdf_free_dma_buf(struct msm_mdf_mem *mem) -{ - if (!mem) - return -EINVAL; - - if (mem->dev == NULL) { - pr_err("%s: device is not initialized\n", - __func__); - return -ENODEV; - } - - //dma_free_coherent(mem->dev, mem->size, mem->va, - // mem->dma_addr); - - mem->device_status &= ~MSM_MDF_MEM_ALLOCATED; - return 0; -} - -static int msm_mdf_dma_buf_unmap(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - if (!smmu) - return -EINVAL; - - if (smmu->enabled) { - if (smmu->cb_dev == NULL) { - pr_err("%s: cb device is not initialized\n", - __func__); - return -ENODEV; - } - //if (smmu->pa && mem->size) - //dma_unmap_single(smmu->cb_dev, smmu->pa, - // mem->size, DMA_BIDIRECTIONAL); - } - - smmu->device_status &= ~MSM_MDF_MEM_MAPPED; - - return 0; -} - -static int msm_mdf_map_memory_to_subsys(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - int rc = 0; - - if (!mem || !smmu) - return -EINVAL; - - /* Map mdf shared memory to ADSP */ - if (!strcmp("adsp", smmu->subsys)) { - rc = q6core_map_memory_regions((phys_addr_t *)&smmu->pa, - ADSP_MEMORY_MAP_MDF_SHMEM_4K_POOL, - (uint32_t *)&smmu->pa_len, 1, &mem->map_handle); - if (rc) { - pr_err("%s: q6core_map_memory_regions failed, rc = %d\n", - __func__, rc); - } - } else { - if (mem->map_handle) { - /* Map mdf shared memory to remote DSPs */ - rc = q6core_map_mdf_shared_memory(mem->map_handle, - (phys_addr_t *)&smmu->pa, smmu->proc_id, - (uint32_t *)&smmu->pa_len, 1); - if (rc) { - pr_err("%s: q6core_map_mdf_shared_memory failed, rc = %d\n", - __func__, rc); - } - } - } - return rc; -} - -static void msm_mdf_unmap_memory_to_subsys(struct msm_mdf_mem *mem, - struct msm_mdf_smmu *smmu) -{ - if (!mem || !smmu) - return; - - if (!strcmp("adsp", smmu->subsys)) { - if (mem->map_handle) - q6core_memory_unmap_regions(mem->map_handle); - } -} - -static int msm_mdf_assign_memory_to_subsys(struct msm_mdf_mem *mem) -{ - int ret = 0, i; - struct scm_desc desc = {0}; - struct msm_mdf_protect_mem *scm_buffer; - uint32_t fnid; - - scm_buffer = kzalloc(sizeof(struct msm_mdf_protect_mem), GFP_KERNEL); - if (!scm_buffer) - return -ENOMEM; - - scm_buffer->dma_start_address = mem->dma_addr; - scm_buffer->dma_end_address = mem->dma_addr + buf_page_size(mem->size); - for (i = 0; i < SUBSYS_MAX; i++) { - scm_buffer->dest_info[i].dst_vm = mdf_smmu_data[i].vmid; - scm_buffer->dest_info[i].dst_vm_perm = - MEM_PROTECT_AC_PERM_READ | MEM_PROTECT_AC_PERM_WRITE; - scm_buffer->dest_info[i].ctx = 0; - scm_buffer->dest_info[i].ctx_size = 0; - } - scm_buffer->dest_info_size = - sizeof(struct msm_mdf_dest_vm_and_perm_info) * SUBSYS_MAX; - - /* flush cache required by scm_call2 */ - dmac_flush_range(scm_buffer, ((void *)scm_buffer) + - sizeof(struct msm_mdf_protect_mem)); - - desc.args[0] = scm_buffer->dma_start_address; - desc.args[1] = scm_buffer->dma_end_address; - desc.args[2] = virt_to_phys(&(scm_buffer->dest_info[0])); - desc.args[3] = scm_buffer->dest_info_size; - - desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_VAL, SCM_RO, SCM_VAL); - - fnid = SCM_SIP_FNID(SCM_SVC_MP, TZ_MPU_LOCK_NS_REGION); - ret = scm_call2(fnid, &desc); - if (ret < 0) { - pr_err("%s: SCM call2 failed, ret %d scm_resp %llu\n", - __func__, ret, desc.ret[0]); - } - /* No More need for scm_buffer, freeing the same */ - kfree(scm_buffer); - return ret; -} - -/** - * msm_mdf_mem_init - Initializes MDF memory pool and - * map memory to subsystem - * - * Returns 0 on success or ret on failure. - */ - -int msm_mdf_mem_init(void) -{ - int rc = 0, i, j; - struct msm_mdf_mem *mem = &mdf_mem_data; - struct msm_mdf_smmu *smmu; - unsigned long timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - int adsp_ready = 0; - - if (!(mdf_mem_data.device_status & MSM_MDF_PROBED)) - return -ENODEV; - - if (mdf_mem_data.device_status & MSM_MDF_INITIALIZED) - return 0; - - /* TODO: pulling may not be needed as Q6 Core state should be - * checked during machine driver probing. - */ - do { - if (!q6core_is_adsp_ready()) { - pr_err("%s: ADSP Audio NOT Ready\n", - __func__); - /* ADSP will be coming up after subsystem restart and - * it might not be fully up when the control reaches - * here. So, wait for 50msec before checking ADSP state - */ - msleep(50); - } else { - pr_debug("%s: ADSP Audio Ready\n", - __func__); - adsp_ready = 1; - break; - } - } while (time_after(timeout, jiffies)); - - if (!adsp_ready) { - pr_err("%s: timed out waiting for ADSP Audio\n", - __func__); - return -ETIMEDOUT; - } - - if (mem->device_status & MSM_MDF_MEM_ALLOCATED) { - for (i = 0; i < SUBSYS_MAX; i++) { - smmu = &mdf_smmu_data[i]; - rc = msm_mdf_dma_buf_map(mem, smmu); - if (rc) { - pr_err("%s: msm_mdf_dma_buf_map failed, rc = %d\n", - __func__, rc); - goto err; - } - } - - rc = msm_mdf_assign_memory_to_subsys(mem); - if (rc) { - pr_err("%s: msm_mdf_assign_memory_to_subsys failed\n", - __func__); - goto err; - } - - for (j = 0; j < SUBSYS_MAX; j++) { - smmu = &mdf_smmu_data[j]; - rc = msm_mdf_map_memory_to_subsys(mem, smmu); - if (rc) { - pr_err("%s: msm_mdf_map_memory_to_subsys failed\n", - __func__); - goto err; - } - } - - mdf_mem_data.device_status |= MSM_MDF_INITIALIZED; - } - return 0; -err: - return rc; -} -EXPORT_SYMBOL(msm_mdf_mem_init); - -int msm_mdf_mem_deinit(void) -{ - int rc = 0, i; - struct msm_mdf_mem *mem = &mdf_mem_data; - struct msm_mdf_smmu *smmu; - - if (!(mdf_mem_data.device_status & MSM_MDF_INITIALIZED)) - return -ENODEV; - - for (i = SUBSYS_MAX - 1; i >= 0; i--) { - smmu = &mdf_smmu_data[i]; - msm_mdf_unmap_memory_to_subsys(mem, smmu); - } - - if (!rc) { - for (i = SUBSYS_MAX - 1; i >= 0; i--) { - smmu = &mdf_smmu_data[i]; - msm_mdf_dma_buf_unmap(mem, smmu); - } - - msm_mdf_free_dma_buf(mem); - mem->device_status &= ~MSM_MDF_MEM_ALLOCATED; - } - - mdf_mem_data.device_status &= ~MSM_MDF_INITIALIZED; - - return 0; -} -EXPORT_SYMBOL(msm_mdf_mem_deinit); - -static int msm_mdf_restart_notifier_cb(struct notifier_block *this, - unsigned long code, - void *_cmd) -{ - static int boot_count = 3; - - /* During LPASS boot, HLOS receives events: - * SUBSYS_BEFORE_POWERUP - * SUBSYS_PROXY_VOTE - * SUBSYS_AFTER_POWERUP - need skip - * SUBSYS_PROXY_UNVOTE - */ - if (boot_count) { - boot_count--; - return NOTIFY_OK; - } - - switch (code) { - case SUBSYS_BEFORE_SHUTDOWN: - pr_debug("Subsys Notify: Shutdown Started\n"); - /* Unmap and free memory upon restart event. */ - msm_mdf_mem_deinit(); - break; - case SUBSYS_AFTER_SHUTDOWN: - pr_debug("Subsys Notify: Shutdown Completed\n"); - break; - case SUBSYS_BEFORE_POWERUP: - pr_debug("Subsys Notify: Bootup Started\n"); - break; - case SUBSYS_AFTER_POWERUP: - pr_debug("Subsys Notify: Bootup Completed\n"); - /* Allocate and map memory after restart complete. */ - if (msm_mdf_mem_init()) - pr_err("msm_mdf_mem_init failed\n"); - break; - default: - pr_err("Subsys Notify: Generel: %lu\n", code); - break; - } - return NOTIFY_DONE; -} - -static const struct of_device_id msm_mdf_match_table[] = { - { .compatible = "qcom,msm-mdf", }, - { .compatible = "qcom,msm-mdf-mem-region", }, - { .compatible = "qcom,msm-mdf-cb", }, - {} -}; -MODULE_DEVICE_TABLE(of, msm_mdf_match_table); - -static int msm_mdf_cb_probe(struct device *dev) -{ - struct msm_mdf_smmu *smmu; - u64 smmu_sid = 0; - u64 smmu_sid_mask = 0; - struct of_phandle_args iommuspec; - const char *subsys; - int rc = 0, i; - - subsys = of_get_property(dev->of_node, "label", NULL); - if (!subsys) { - dev_err(dev, "%s: could not get label\n", - __func__); - return -EINVAL; - } - - for (i = 0; i < SUBSYS_MAX; i++) { - if (!mdf_smmu_data[i].subsys) - continue; - if (!strcmp(subsys, mdf_smmu_data[i].subsys)) - break; - } - if (i >= SUBSYS_MAX) { - dev_err(dev, "%s: subsys %s not supported\n", - __func__, subsys); - return -EINVAL; - } - - smmu = &mdf_smmu_data[i]; - - smmu->enabled = of_property_read_bool(dev->of_node, - "qcom,smmu-enabled"); - - dev_info(dev, "%s: SMMU is %s for %s\n", __func__, - (smmu->enabled) ? "enabled" : "disabled", - smmu->subsys); - - if (smmu->enabled) { - /* Get SMMU SID information from Devicetree */ - rc = of_property_read_u64(dev->of_node, - "qcom,smmu-sid-mask", - &smmu_sid_mask); - if (rc) { - dev_err(dev, - "%s: qcom,smmu-sid-mask missing in DT node, using default\n", - __func__); - smmu_sid_mask = 0xFFFFFFFFFFFFFFFF; - } - - rc = of_parse_phandle_with_args(dev->of_node, "iommus", - "#iommu-cells", 0, &iommuspec); - if (rc) - dev_err(dev, "%s: could not get smmu SID, ret = %d\n", - __func__, rc); - else - smmu_sid = (iommuspec.args[0] & smmu_sid_mask); - - smmu->sid = - smmu_sid << MSM_AUDIO_SMMU_SID_OFFSET; - - smmu->cb_dev = dev; - } - return 0; -} - -static int msm_mdf_remove(struct platform_device *pdev) -{ - int rc = 0, i; - - for (i = 0; i < SUBSYS_MAX; i++) { - if (!IS_ERR_OR_NULL(mdf_smmu_data[i].cb_dev)) - arm_iommu_detach_device(mdf_smmu_data[i].cb_dev); - if (!IS_ERR_OR_NULL(mdf_smmu_data[i].mapping)) - arm_iommu_release_mapping(mdf_smmu_data[i].mapping); - mdf_smmu_data[i].enabled = 0; - } - mdf_mem_data.device_status = 0; - - return rc; -} - -static int msm_mdf_probe(struct platform_device *pdev) -{ - int rc = 0; - enum apr_subsys_state q6_state; - struct device *dev = &pdev->dev; - uint32_t mdf_mem_data_size = 0; - - /* TODO: MDF probing should have no dependency - * on ADSP Q6 state. - */ - q6_state = apr_get_q6_state(); - if (q6_state == APR_SUBSYS_DOWN) { - dev_dbg(dev, "defering %s, adsp_state %d\n", - __func__, q6_state); - rc = -EPROBE_DEFER; - goto err; - } else - dev_dbg(dev, "%s: adsp is ready\n", __func__); - - if (of_device_is_compatible(dev->of_node, - "qcom,msm-mdf-cb")) - return msm_mdf_cb_probe(dev); - - if (of_device_is_compatible(dev->of_node, - "qcom,msm-mdf-mem-region")) { - mdf_mem_data.dev = dev; - - rc = of_property_read_u32(dev->of_node, - "qcom,msm-mdf-mem-data-size", - &mdf_mem_data_size); - if (rc) { - dev_dbg(&pdev->dev, "MDF mem data size entry not found\n"); - goto err; - } - - mdf_mem_data.size = mdf_mem_data_size; - dev_info(dev, "%s: mem region size %zd\n", - __func__, mdf_mem_data.size); - msm_mdf_alloc_dma_buf(&mdf_mem_data); - return 0; - } - - rc = of_platform_populate(pdev->dev.of_node, - msm_mdf_match_table, - NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to populate child nodes", - __func__); - goto err; - } - mdf_mem_data.device_status |= MSM_MDF_PROBED; - -err: - return rc; -} - -static struct platform_driver msm_mdf_driver = { - .probe = msm_mdf_probe, - .remove = msm_mdf_remove, - .driver = { - .name = "msm-mdf", - .owner = THIS_MODULE, - .of_match_table = msm_mdf_match_table, - }, -}; - -static struct notifier_block nb = { - .priority = 0, - .notifier_call = msm_mdf_restart_notifier_cb, -}; - -int __init msm_mdf_init(void) -{ - /* Only need to monitor SSR from ADSP, which - * is the master DSP managing MDF memory. - */ - ssr_handle = subsys_notif_register_notifier("adsp", &nb); - return platform_driver_register(&msm_mdf_driver); -} - -void __exit msm_mdf_exit(void) -{ - platform_driver_unregister(&msm_mdf_driver); - - if (ssr_handle) - subsys_notif_unregister_notifier(ssr_handle, &nb); -} - -MODULE_DESCRIPTION("MSM MDF Module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/q6_init.c b/techpack/audio/dsp/q6_init.c deleted file mode 100644 index b2cb5a17a9d9..000000000000 --- a/techpack/audio/dsp/q6_init.c +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright (c) 2017, 2019 The Linux Foundation. All rights reserved. -Copyright (C) 2019 XiaoMi, Inc. - -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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -* -*/ - -#include -#include -#include "q6_init.h" - -static int __init audio_q6_init(void) -{ - adsp_err_init(); - audio_cal_init(); - rtac_init(); - adm_init(); - afe_init(); - spk_params_init(); - q6asm_init(); - q6lsm_init(); - voice_init(); - core_init(); - msm_audio_ion_init(); - audio_slimslave_init(); - avtimer_init(); -#ifdef CONFIG_MSM_CSPL - crus_sp_init(); -#endif - msm_mdf_init(); - voice_mhi_init(); - elliptic_driver_init(); -/* for mius start */ -#ifdef CONFIG_US_PROXIMITY - mius_driver_init(); -#endif -/* for mius end */ - return 0; -} - -static void __exit audio_q6_exit(void) -{ - msm_mdf_exit(); -#ifdef CONFIG_MSM_CSPL - crus_sp_exit(); -#endif - avtimer_exit(); - audio_slimslave_exit(); - msm_audio_ion_exit(); - core_exit(); - voice_exit(); - q6lsm_exit(); - q6asm_exit(); - afe_exit(); - spk_params_exit(); - adm_exit(); - rtac_exit(); - audio_cal_exit(); - adsp_err_exit(); - voice_mhi_exit(); - elliptic_driver_exit(); -/* for mius start */ -#ifdef CONFIG_US_PROXIMITY - mius_driver_exit(); -#endif -/* for mius end */ -} - -module_init(audio_q6_init); -module_exit(audio_q6_exit); -MODULE_DESCRIPTION("Q6 module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/q6_init.h b/techpack/audio/dsp/q6_init.h deleted file mode 100644 index 8595a7f457a3..000000000000 --- a/techpack/audio/dsp/q6_init.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -Copyright (c) 2017, 2019 The Linux Foundation. All rights reserved. -Copyright (C) 2019 XiaoMi, Inc. - -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 -only version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -* -*/ - -#ifndef __Q6_INIT_H__ -#define __Q6_INIT_H__ -int adsp_err_init(void); -int adm_init(void); -int afe_init(void); -int q6asm_init(void); -int q6lsm_init(void); -int voice_init(void); -int audio_cal_init(void); -int core_init(void); -int rtac_init(void); -int msm_audio_ion_init(void); -int audio_slimslave_init(void); -int avtimer_init(void); - -#ifdef CONFIG_MSM_CSPL -int crus_sp_init(void); -#endif - -#ifdef CONFIG_MSM_MDF -int msm_mdf_init(void); -void msm_mdf_exit(void); -#else -int elliptic_driver_init(void); -/* for mius start */ -#ifdef CONFIG_US_PROXIMITY -int mius_driver_init(void); -#endif -/* for mius end */ -static inline int msm_mdf_init(void) -{ - return 0; -} - -static inline void msm_mdf_exit(void) -{ - return; -} -#endif -#ifdef CONFIG_XT_LOGGING -int spk_params_init(void); -void spk_params_exit(void); -#else -static inline int spk_params_init(void) -{ - return 0; -} -static inline void spk_params_exit(void) -{ -} -#endif - -#ifdef CONFIG_MSM_CSPL -void crus_sp_exit(void); -#endif - -void avtimer_exit(void); -void audio_slimslave_exit(void); -void msm_audio_ion_exit(void); -void rtac_exit(void); -void core_exit(void); -void audio_cal_exit(void); -void voice_exit(void); -void q6lsm_exit(void); -void q6asm_exit(void); -void afe_exit(void); -void adm_exit(void); -void adsp_err_exit(void); -int elliptic_driver_exit(void); -/* for mius start */ -#ifdef CONFIG_US_PROXIMITY -int mius_driver_exit(void); -#endif -/* for mius end */ - -#ifdef CONFIG_VOICE_MHI -int voice_mhi_init(void); -void voice_mhi_exit(void); -#else -static inline int voice_mhi_init(void) -{ - return 0; -} - -static inline void voice_mhi_exit(void) -{ - return; -} -#endif -#endif - diff --git a/techpack/audio/dsp/q6adm.c b/techpack/audio/dsp/q6adm.c deleted file mode 100644 index 9db17e37dba8..000000000000 --- a/techpack/audio/dsp/q6adm.c +++ /dev/null @@ -1,5201 +0,0 @@ -/* Copyright (c) 2012-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define TIMEOUT_MS 1000 - -#define RESET_COPP_ID 99 -#define INVALID_COPP_ID 0xFF -/* Used for inband payload copy, max size is 4k */ -/* 3 is to account for module, instance & param ID in payload */ -#define ADM_GET_PARAMETER_LENGTH (4096 - APR_HDR_SIZE - 3 * sizeof(uint32_t)) - -#define ULL_SUPPORTED_BITS_PER_SAMPLE 16 -#define ULL_SUPPORTED_SAMPLE_RATE 48000 - -#ifndef CONFIG_DOLBY_DAP -#undef DOLBY_ADM_COPP_TOPOLOGY_ID -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFE -#endif - -#ifndef CONFIG_DOLBY_DS2 -#undef DS2_ADM_COPP_TOPOLOGY_ID -#define DS2_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFF -#endif - -/* ENUM for adm_status */ -enum adm_cal_status { - ADM_STATUS_CALIBRATION_REQUIRED = 0, - ADM_STATUS_MAX, -}; - -struct adm_copp { - - atomic_t id[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t cnt[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t topology[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t mode[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t stat[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t rate[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t bit_width[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t channels[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t app_type[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t acdb_id[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - wait_queue_head_t wait[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - wait_queue_head_t adm_delay_wait[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - atomic_t adm_delay_stat[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - uint32_t adm_delay[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; - unsigned long adm_status[AFE_MAX_PORTS][MAX_COPPS_PER_PORT]; -}; - -struct source_tracking_data { - struct dma_buf *dma_buf; - struct param_outband memmap; - int apr_cmd_status; -}; - -struct adm_ctl { - void *apr; - - struct adm_copp copp; - - atomic_t matrix_map_stat; - wait_queue_head_t matrix_map_wait; - - atomic_t adm_stat; - wait_queue_head_t adm_wait; - - struct cal_type_data *cal_data[ADM_MAX_CAL_TYPES]; - - atomic_t mem_map_handles[ADM_MEM_MAP_INDEX_MAX]; - atomic_t mem_map_index; - - struct param_outband outband_memmap; - struct source_tracking_data sourceTrackingData; - - struct mutex adm_apr_lock; - int set_custom_topology; - int ec_ref_rx; - int num_ec_ref_rx_chans; - int ec_ref_rx_bit_width; - int ec_ref_rx_sampling_rate; - int ffecns_port_id; - int native_mode; -}; - -static struct adm_ctl this_adm; - -struct adm_multi_ch_map { - bool set_channel_map; - char channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; -}; - -#define ADM_MCH_MAP_IDX_PLAYBACK 0 -#define ADM_MCH_MAP_IDX_REC 1 -static struct adm_multi_ch_map multi_ch_maps[2] = { - { false, - {0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0} - }, - { false, - {0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0} - } -}; - -static struct adm_multi_ch_map port_channel_map[AFE_MAX_PORTS]; - -static int adm_get_parameters[MAX_COPPS_PER_PORT * ADM_GET_PARAMETER_LENGTH]; -static int adm_module_topo_list[MAX_COPPS_PER_PORT * - ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH]; -static struct mutex dts_srs_lock; - -void msm_dts_srs_acquire_lock(void) -{ - mutex_lock(&dts_srs_lock); -} - -void msm_dts_srs_release_lock(void) -{ - mutex_unlock(&dts_srs_lock); -} - -/** - * adm_validate_and_get_port_index - - * validate given port id - * - * @port_id: Port ID number - * - * Returns valid index on success or error on failure - */ -int adm_validate_and_get_port_index(int port_id) -{ - int index; - int ret; - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port validation failed id 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - - index = afe_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port idx %d port_id 0x%x\n", - __func__, index, - port_id); - return -EINVAL; - } - pr_debug("%s: port_idx- %d\n", __func__, index); - return index; -} -EXPORT_SYMBOL(adm_validate_and_get_port_index); - -/** - * adm_get_default_copp_idx - - * retrieve default copp_idx for given port - * - * @port_id: Port ID number - * - * Returns valid value on success or error on failure - */ -int adm_get_default_copp_idx(int port_id) -{ - int port_idx = adm_validate_and_get_port_index(port_id), idx; - - if (port_idx < 0) { - pr_err("%s: Invalid port id: 0x%x", __func__, port_id); - return -EINVAL; - } - pr_debug("%s: port_idx:%d\n", __func__, port_idx); - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - if (atomic_read(&this_adm.copp.id[port_idx][idx]) != - RESET_COPP_ID) - return idx; - } - return -EINVAL; -} -EXPORT_SYMBOL(adm_get_default_copp_idx); - -int adm_get_topology_for_port_from_copp_id(int port_id, int copp_id) -{ - int port_idx = adm_validate_and_get_port_index(port_id), idx; - - if (port_idx < 0) { - pr_err("%s: Invalid port id: 0x%x", __func__, port_id); - return 0; - } - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if (atomic_read(&this_adm.copp.id[port_idx][idx]) == copp_id) - return atomic_read(&this_adm.copp.topology[port_idx] - [idx]); - pr_err("%s: Invalid copp_id %d port_id 0x%x\n", - __func__, copp_id, port_id); - return 0; -} - -/** - * adm_get_topology_for_port_copp_idx - - * retrieve topology of given port/copp_idx - * - * @port_id: Port ID number - * @copp_idx: copp index of ADM copp - * - * Returns valid value on success or 0 on failure - */ -int adm_get_topology_for_port_copp_idx(int port_id, int copp_idx) -{ - int port_idx = adm_validate_and_get_port_index(port_id); - - if (port_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid port: 0x%x copp id: 0x%x", - __func__, port_id, copp_idx); - return 0; - } - return atomic_read(&this_adm.copp.topology[port_idx][copp_idx]); -} -EXPORT_SYMBOL(adm_get_topology_for_port_copp_idx); - -int adm_get_indexes_from_copp_id(int copp_id, int *copp_idx, int *port_idx) -{ - int p_idx, c_idx; - - for (p_idx = 0; p_idx < AFE_MAX_PORTS; p_idx++) { - for (c_idx = 0; c_idx < MAX_COPPS_PER_PORT; c_idx++) { - if (atomic_read(&this_adm.copp.id[p_idx][c_idx]) - == copp_id) { - if (copp_idx != NULL) - *copp_idx = c_idx; - if (port_idx != NULL) - *port_idx = p_idx; - return 0; - } - } - } - return -EINVAL; -} - -static int adm_get_copp_id(int port_idx, int copp_idx) -{ - pr_debug("%s: port_idx:%d copp_idx:%d\n", __func__, port_idx, copp_idx); - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - return atomic_read(&this_adm.copp.id[port_idx][copp_idx]); -} - -static int adm_get_idx_if_copp_exists(int port_idx, int topology, int mode, - int rate, int bit_width, int app_type) -{ - int idx; - - pr_debug("%s: port_idx-%d, topology-0x%x, mode-%d, rate-%d, bit_width-%d\n", - __func__, port_idx, topology, mode, rate, bit_width); - - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) - if ((topology == - atomic_read(&this_adm.copp.topology[port_idx][idx])) && - (mode == atomic_read(&this_adm.copp.mode[port_idx][idx])) && - (rate == atomic_read(&this_adm.copp.rate[port_idx][idx])) && - (bit_width == - atomic_read(&this_adm.copp.bit_width[port_idx][idx])) && - (app_type == - atomic_read(&this_adm.copp.app_type[port_idx][idx]))) - return idx; - return -EINVAL; -} - -static int adm_get_next_available_copp(int port_idx) -{ - int idx; - - pr_debug("%s:\n", __func__); - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - pr_debug("%s: copp_id:0x%x port_idx:%d idx:%d\n", __func__, - atomic_read(&this_adm.copp.id[port_idx][idx]), - port_idx, idx); - if (atomic_read(&this_adm.copp.id[port_idx][idx]) == - RESET_COPP_ID) - break; - } - return idx; -} - -/** - * srs_trumedia_open - - * command to set SRS trumedia open - * - * @port_id: Port ID number - * @copp_idx: copp index of ADM copp - * @srs_tech_id: SRS tech index - * @srs_params: params pointer - * - * Returns 0 on success or error on failure - */ -int srs_trumedia_open(int port_id, int copp_idx, __s32 srs_tech_id, - void *srs_params) -{ - struct param_hdr_v3 param_hdr; - struct mem_mapping_hdr mem_hdr; - u32 total_param_size = 0; - bool outband = false; - int port_idx; - int ret = 0; - - pr_debug("SRS - %s", __func__); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&mem_hdr, 0, sizeof(mem_hdr)); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - return -EINVAL; - } - - param_hdr.module_id = SRS_TRUMEDIA_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - - switch (srs_tech_id) { - case SRS_ID_GLOBAL: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS; - param_hdr.param_size = - sizeof(struct srs_trumedia_params_GLOBAL); - break; - } - case SRS_ID_WOWHD: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_WOWHD; - param_hdr.param_size = sizeof(struct srs_trumedia_params_WOWHD); - break; - } - case SRS_ID_CSHP: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_CSHP; - param_hdr.param_size = sizeof(struct srs_trumedia_params_CSHP); - break; - } - case SRS_ID_HPF: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_HPF; - param_hdr.param_size = sizeof(struct srs_trumedia_params_HPF); - break; - } - case SRS_ID_AEQ: { - u8 *update_params_ptr = (u8 *) this_adm.outband_memmap.kvaddr; - - outband = true; - - if (update_params_ptr == NULL) { - pr_err("ADM_SRS_TRUMEDIA - %s: null memmap for AEQ params\n", - __func__); - ret = -EINVAL; - goto fail_cmd; - } - - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_AEQ; - param_hdr.param_size = sizeof(struct srs_trumedia_params_AEQ); - - ret = q6common_pack_pp_params(update_params_ptr, ¶m_hdr, - srs_params, &total_param_size); - if (ret) { - pr_err("%s: Failed to pack param header and data, error %d\n", - __func__, ret); - goto fail_cmd; - } - break; - } - case SRS_ID_HL: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_HL; - param_hdr.param_size = sizeof(struct srs_trumedia_params_HL); - break; - } - case SRS_ID_GEQ: { - param_hdr.param_id = SRS_TRUMEDIA_PARAMS_GEQ; - param_hdr.param_size = sizeof(struct srs_trumedia_params_GEQ); - break; - } - default: - goto fail_cmd; - } - - if (outband && this_adm.outband_memmap.paddr) { - mem_hdr.data_payload_addr_lsw = - lower_32_bits(this_adm.outband_memmap.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - this_adm.outband_memmap.paddr); - mem_hdr.mem_map_handle = atomic_read( - &this_adm.mem_map_handles[ADM_SRS_TRUMEDIA]); - - ret = adm_set_pp_params(port_id, copp_idx, &mem_hdr, NULL, - total_param_size); - } else { - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, - param_hdr, - (u8 *) srs_params); - } - - if (ret < 0) - pr_err("SRS - %s: ADM enable for port %d failed\n", __func__, - port_id); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(srs_trumedia_open); - -static int adm_populate_channel_weight(u16 *ptr, - struct msm_pcm_channel_mixer *ch_mixer, - int channel_index) -{ - u16 i, j, start_index = 0; - - if (channel_index > ch_mixer->output_channel) { - pr_err("%s: channel index %d is larger than output_channel %d\n", - __func__, channel_index, ch_mixer->output_channel); - return -EINVAL; - } - - for (i = 0; i < ch_mixer->output_channel; i++) { - pr_debug("%s: weight for output %d:", __func__, i); - for (j = 0; j < ADM_MAX_CHANNELS; j++) - pr_debug(" %d", - ch_mixer->channel_weight[i][j]); - pr_debug("\n"); - } - - for (i = 0; i < channel_index; ++i) - start_index += ch_mixer->input_channels[i]; - - for (i = 0; i < ch_mixer->output_channel; ++i) { - for (j = start_index; - j < start_index + - ch_mixer->input_channels[channel_index]; j++) { - *ptr = ch_mixer->channel_weight[i][j]; - pr_debug("%s: ptr[%d][%d] = %d\n", - __func__, i, j, *ptr); - ptr++; - } - } - - return 0; -} - -/* - * adm_programable_channel_mixer - * - * Receives port_id, copp_idx, session_id, session_type, ch_mixer - * and channel_index to send ADM command to mix COPP data. - * - * port_id - Passed value, port_id for which backend is wanted - * copp_idx - Passed value, copp_idx for which COPP is wanted - * session_id - Passed value, session_id for which session is needed - * session_type - Passed value, session_type for RX or TX - * ch_mixer - Passed value, ch_mixer for which channel mixer config is needed - * channel_index - Passed value, channel_index for which channel is needed - */ -int adm_programable_channel_mixer(int port_id, int copp_idx, int session_id, - int session_type, - struct msm_pcm_channel_mixer *ch_mixer, - int channel_index) -{ - struct adm_cmd_set_pspd_mtmx_strtr_params_v5 *adm_params = NULL; - struct param_hdr_v1 data_v5; - int ret = 0, port_idx, sz = 0, param_size = 0; - u16 *adm_pspd_params; - u16 *ptr; - int index = 0; - - pr_debug("%s: port_id = %d\n", __func__, port_id); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - return -EINVAL; - } - /* - * First 8 bytes are 4 bytes as rule number, 2 bytes as output - * channel and 2 bytes as input channel. - * 2 * ch_mixer->output_channel means output channel mapping. - * 2 * ch_mixer->input_channels[channel_index]) means input - * channel mapping. - * 2 * ch_mixer->input_channels[channel_index] * - * ch_mixer->output_channel) means the channel mixer weighting - * coefficients. - * param_size needs to be a multiple of 4 bytes. - */ - - param_size = 2 * (4 + ch_mixer->output_channel + - ch_mixer->input_channels[channel_index] + - ch_mixer->input_channels[channel_index] * - ch_mixer->output_channel); - param_size = roundup(param_size, 4); - - sz = sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5) + - sizeof(struct default_chmixer_param_id_coeff) + - sizeof(struct param_hdr_v1) + param_size; - pr_debug("%s: sz = %d\n", __func__, sz); - adm_params = kzalloc(sz, GFP_KERNEL); - if (!adm_params) - return -ENOMEM; - - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->direction = session_type; - adm_params->sessionid = session_id; - pr_debug("%s: copp_id = %d, session id %d\n", __func__, - atomic_read(&this_adm.copp.id[port_idx][copp_idx]), - session_id); - adm_params->deviceid = atomic_read( - &this_adm.copp.id[port_idx][copp_idx]); - adm_params->reserved = 0; - - /* - * This module is internal to ADSP and cannot be configured with - * an instance id - */ - data_v5.module_id = MTMX_MODULE_ID_DEFAULT_CHMIXER; - data_v5.param_id = DEFAULT_CHMIXER_PARAM_ID_COEFF; - data_v5.reserved = 0; - data_v5.param_size = param_size; - adm_params->payload_size = - sizeof(struct default_chmixer_param_id_coeff) + - sizeof(struct param_hdr_v1) + data_v5.param_size; - adm_pspd_params = (u16 *)((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5)); - memcpy(adm_pspd_params, &data_v5, sizeof(data_v5)); - - adm_pspd_params = (u16 *)((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5) - + sizeof(data_v5)); - - adm_pspd_params[0] = ch_mixer->rule; - adm_pspd_params[2] = ch_mixer->output_channel; - adm_pspd_params[3] = ch_mixer->input_channels[channel_index]; - index = 4; - - if (ch_mixer->output_channel == 1) { - adm_pspd_params[index] = PCM_CHANNEL_FC; - } else if (ch_mixer->output_channel == 2) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - } else if (ch_mixer->output_channel == 3) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_FC; - } else if (ch_mixer->output_channel == 4) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_LS; - adm_pspd_params[index + 3] = PCM_CHANNEL_RS; - } else if (ch_mixer->output_channel == 5) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_FC; - adm_pspd_params[index + 3] = PCM_CHANNEL_LS; - adm_pspd_params[index + 4] = PCM_CHANNEL_RS; - } else if (ch_mixer->output_channel == 6) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_LFE; - adm_pspd_params[index + 3] = PCM_CHANNEL_FC; - adm_pspd_params[index + 4] = PCM_CHANNEL_LS; - adm_pspd_params[index + 5] = PCM_CHANNEL_RS; - } else if (ch_mixer->output_channel == 8) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_LFE; - adm_pspd_params[index + 3] = PCM_CHANNEL_FC; - adm_pspd_params[index + 4] = PCM_CHANNEL_LS; - adm_pspd_params[index + 5] = PCM_CHANNEL_RS; - adm_pspd_params[index + 6] = PCM_CHANNEL_LB; - adm_pspd_params[index + 7] = PCM_CHANNEL_RB; - } - - index = index + ch_mixer->output_channel; - if (ch_mixer->input_channels[channel_index] == 1) { - adm_pspd_params[index] = PCM_CHANNEL_FC; - } else if (ch_mixer->input_channels[channel_index] == 2) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - } else if (ch_mixer->input_channels[channel_index] == 3) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_FC; - } else if (ch_mixer->input_channels[channel_index] == 4) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_LS; - adm_pspd_params[index + 3] = PCM_CHANNEL_RS; - } else if (ch_mixer->input_channels[channel_index] == 5) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_FC; - adm_pspd_params[index + 3] = PCM_CHANNEL_LS; - adm_pspd_params[index + 4] = PCM_CHANNEL_RS; - } else if (ch_mixer->input_channels[channel_index] == 6) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_LFE; - adm_pspd_params[index + 3] = PCM_CHANNEL_FC; - adm_pspd_params[index + 4] = PCM_CHANNEL_LS; - adm_pspd_params[index + 5] = PCM_CHANNEL_RS; - } else if (ch_mixer->input_channels[channel_index] == 8) { - adm_pspd_params[index] = PCM_CHANNEL_FL; - adm_pspd_params[index + 1] = PCM_CHANNEL_FR; - adm_pspd_params[index + 2] = PCM_CHANNEL_LFE; - adm_pspd_params[index + 3] = PCM_CHANNEL_FC; - adm_pspd_params[index + 4] = PCM_CHANNEL_LS; - adm_pspd_params[index + 5] = PCM_CHANNEL_RS; - adm_pspd_params[index + 6] = PCM_CHANNEL_LB; - adm_pspd_params[index + 7] = PCM_CHANNEL_RB; - } - - index = index + ch_mixer->input_channels[channel_index]; - ret = adm_populate_channel_weight(&adm_pspd_params[index], - ch_mixer, channel_index); - if (ret) { - pr_err("%s: fail to get channel weight with error %d\n", - __func__, ret); - goto fail_cmd; - } - - adm_params->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - adm_params->hdr.src_svc = APR_SVC_ADM; - adm_params->hdr.src_domain = APR_DOMAIN_APPS; - adm_params->hdr.src_port = port_id; - adm_params->hdr.dest_svc = APR_SVC_ADM; - adm_params->hdr.dest_domain = APR_DOMAIN_ADSP; - adm_params->hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_params->hdr.token = port_idx << 16 | copp_idx; - adm_params->hdr.opcode = ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5; - adm_params->hdr.pkt_size = sz; - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->reserved = 0; - - ptr = (u16 *)adm_params; - for (index = 0; index < (sz / 2); index++) - pr_debug("%s: adm_params[%d] = 0x%x\n", - __func__, index, (unsigned int)ptr[index]); - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], 0); - ret = apr_send_pkt(this_adm.apr, (uint32_t *)adm_params); - if (ret < 0) { - pr_err("%s: Set params failed port %d rc %d\n", __func__, - port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read( - &this_adm.copp.stat[port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: set params timed out port = %d\n", - __func__, port_id); - ret = -ETIMEDOUT; - goto fail_cmd; - } - ret = 0; -fail_cmd: - kfree(adm_params); - - return ret; -} -EXPORT_SYMBOL(adm_programable_channel_mixer); - -/** - * adm_set_stereo_to_custom_stereo - - * command to update custom stereo - * - * @port_id: Port ID number - * @copp_idx: copp index of ADM copp - * @session_id: session id to be updated - * @params: params pointer - * @param_length: length of params - * - * Returns 0 on success or error on failure - */ -int adm_set_stereo_to_custom_stereo(int port_id, int copp_idx, - unsigned int session_id, char *params, - uint32_t params_length) -{ - struct adm_cmd_set_pspd_mtmx_strtr_params_v5 *adm_params = NULL; - int sz, rc = 0, port_idx; - - pr_debug("%s:\n", __func__); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - sz = sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5) + - params_length; - adm_params = kzalloc(sz, GFP_KERNEL); - if (!adm_params) { - pr_err("%s, adm params memory alloc failed\n", __func__); - return -ENOMEM; - } - - memcpy(((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v5)), - params, params_length); - adm_params->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - adm_params->hdr.pkt_size = sz; - adm_params->hdr.src_svc = APR_SVC_ADM; - adm_params->hdr.src_domain = APR_DOMAIN_APPS; - adm_params->hdr.src_port = port_id; - adm_params->hdr.dest_svc = APR_SVC_ADM; - adm_params->hdr.dest_domain = APR_DOMAIN_ADSP; - adm_params->hdr.dest_port = 0; /* Ignored */; - adm_params->hdr.token = port_idx << 16 | copp_idx; - adm_params->hdr.opcode = ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5; - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->payload_size = params_length; - /* direction RX as 0 */ - adm_params->direction = ADM_MATRIX_ID_AUDIO_RX; - /* session id for this cmd to be applied on */ - adm_params->sessionid = session_id; - adm_params->deviceid = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_params->reserved = 0; - pr_debug("%s: deviceid %d, session_id %d, src_port %d, dest_port %d\n", - __func__, adm_params->deviceid, adm_params->sessionid, - adm_params->hdr.src_port, adm_params->hdr.dest_port); - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - rc = apr_send_pkt(this_adm.apr, (uint32_t *)adm_params); - if (rc < 0) { - pr_err("%s: Set params failed port = 0x%x rc %d\n", - __func__, port_id, rc); - rc = -EINVAL; - goto set_stereo_to_custom_stereo_return; - } - /* Wait for the callback */ - rc = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: Set params timed out port = 0x%x\n", __func__, - port_id); - rc = -EINVAL; - goto set_stereo_to_custom_stereo_return; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_adm.copp.stat - [port_idx][copp_idx]))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - goto set_stereo_to_custom_stereo_return; - } - rc = 0; -set_stereo_to_custom_stereo_return: - kfree(adm_params); - return rc; -} -EXPORT_SYMBOL(adm_set_stereo_to_custom_stereo); - -/* - * adm_set_custom_chmix_cfg: - * Set the custom channel mixer configuration for ADM - * - * @port_id: Backend port id - * @copp_idx: ADM copp index - * @session_id: ID of the requesting session - * @params: Expected packaged params for channel mixer - * @params_length: Length of the params to be set - * @direction: RX or TX direction - * @stream_type: Audio or Listen stream type - */ -int adm_set_custom_chmix_cfg(int port_id, int copp_idx, - unsigned int session_id, char *params, - uint32_t params_length, int direction, - int stream_type) -{ - struct adm_cmd_set_pspd_mtmx_strtr_params_v6 *adm_params = NULL; - int sz, rc = 0, port_idx; - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - sz = sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v6) + - params_length; - adm_params = kzalloc(sz, GFP_KERNEL); - if (!adm_params) { - pr_err("%s, adm params memory alloc failed\n", __func__); - return -ENOMEM; - } - - memcpy(((u8 *)adm_params + - sizeof(struct adm_cmd_set_pspd_mtmx_strtr_params_v6)), - params, params_length); - adm_params->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - adm_params->hdr.pkt_size = sz; - adm_params->hdr.src_svc = APR_SVC_ADM; - adm_params->hdr.src_domain = APR_DOMAIN_APPS; - adm_params->hdr.src_port = port_id; - adm_params->hdr.dest_svc = APR_SVC_ADM; - adm_params->hdr.dest_domain = APR_DOMAIN_ADSP; - adm_params->hdr.dest_port = 0; /* Ignored */; - adm_params->hdr.token = port_idx << 16 | copp_idx; - adm_params->hdr.opcode = ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V6; - adm_params->payload_addr_lsw = 0; - adm_params->payload_addr_msw = 0; - adm_params->mem_map_handle = 0; - adm_params->payload_size = params_length; - adm_params->direction = direction; - /* session id for this cmd to be applied on */ - adm_params->sessionid = session_id; - adm_params->deviceid = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - /* connecting stream type i.e. lsm or asm */ - adm_params->stream_type = stream_type; - pr_debug("%s: deviceid %d, session_id %d, src_port %d, dest_port %d\n", - __func__, adm_params->deviceid, adm_params->sessionid, - adm_params->hdr.src_port, adm_params->hdr.dest_port); - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - rc = apr_send_pkt(this_adm.apr, (uint32_t *)adm_params); - if (rc < 0) { - pr_err("%s: Set params failed port = 0x%x rc %d\n", - __func__, port_id, rc); - rc = -EINVAL; - goto exit; - } - /* Wait for the callback */ - rc = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: Set params timed out port = 0x%x\n", __func__, - port_id); - rc = -EINVAL; - goto exit; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_adm.copp.stat - [port_idx][copp_idx]))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - goto exit; - } - - rc = 0; -exit: - kfree(adm_params); - return rc; -} -EXPORT_SYMBOL(adm_set_custom_chmix_cfg); - -/* - * adm_apr_send_pkt : returns 0 on success, negative otherwise. - */ -int adm_apr_send_pkt(void *data, int port_idx, int copp_idx) -{ - int ret = 0; - atomic_t *copp_stat = NULL; - wait_queue_head_t *wait = NULL; - - mutex_lock(&this_adm.adm_apr_lock); - - wait = &this_adm.copp.wait[port_idx][copp_idx]; - copp_stat = &this_adm.copp.stat[port_idx][copp_idx]; - atomic_set(copp_stat, -1); - - ret = apr_send_pkt(this_adm.apr, data); - if (ret > 0) { - ret = wait_event_timeout(*wait, - atomic_read(copp_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (atomic_read(copp_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(copp_stat))); - ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat)); - } else if (!ret) { - pr_err_ratelimited("%s: request timedout\n", - __func__); - ret = -ETIMEDOUT; - } else { - ret = 0; - } - } else if (ret == 0) { - pr_err("%s: packet not transmitted\n", __func__); - /* apr_send_pkt can return 0 when nothing is transmitted */ - ret = -EINVAL; - } - - mutex_unlock(&this_adm.adm_apr_lock); - return ret; -} - -/* - * With pre-packed data, only the opcode differes from V5 and V6. - * Use q6common_pack_pp_params to pack the data correctly. - */ -int adm_set_pp_params(int port_id, int copp_idx, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 param_size) -{ - struct adm_cmd_set_pp_params *adm_set_params = NULL; - int size = 0; - int port_idx = 0; - int ret = 0; - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_idx 0x%x\n", __func__, port_idx); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - if (atomic_read(&this_adm.copp.cnt[port_idx][copp_idx]) == 0) { - pr_err("%s:: port[0x%x] coppid[0x%x] is not active, ERROR\n", - __func__, port_id, copp_idx); - return -EINVAL; - } - - /* Only add params_size in inband case */ - size = sizeof(struct adm_cmd_set_pp_params); - if (param_data != NULL) - size += param_size; - adm_set_params = kzalloc(size, GFP_KERNEL); - if (!adm_set_params) - return -ENOMEM; - - adm_set_params->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - adm_set_params->apr_hdr.pkt_size = size; - adm_set_params->apr_hdr.src_svc = APR_SVC_ADM; - adm_set_params->apr_hdr.src_domain = APR_DOMAIN_APPS; - adm_set_params->apr_hdr.src_port = port_id; - adm_set_params->apr_hdr.dest_svc = APR_SVC_ADM; - adm_set_params->apr_hdr.dest_domain = APR_DOMAIN_ADSP; - adm_set_params->apr_hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_set_params->apr_hdr.token = port_idx << 16 | copp_idx; - - if (q6common_is_instance_id_supported()) - adm_set_params->apr_hdr.opcode = ADM_CMD_SET_PP_PARAMS_V6; - else - adm_set_params->apr_hdr.opcode = ADM_CMD_SET_PP_PARAMS_V5; - - adm_set_params->payload_size = param_size; - - if (mem_hdr != NULL) { - /* Out of Band Case */ - adm_set_params->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - /* - * In band case. Parameter data must be pre-packed with its - * header before calling this function. Use - * q6common_pack_pp_params to pack parameter data and header - * correctly. - */ - memcpy(&adm_set_params->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both memory header and param data\n", - __func__); - ret = -EINVAL; - goto done; - } - - ret = adm_apr_send_pkt((uint32_t *) adm_set_params, - port_idx, copp_idx); -done: - kfree(adm_set_params); - return ret; -} -EXPORT_SYMBOL(adm_set_pp_params); - -int adm_pack_and_set_one_pp_param(int port_id, int copp_idx, - struct param_hdr_v3 param_hdr, u8 *param_data) -{ - u8 *packed_data = NULL; - u32 total_size = 0; - int ret = 0; - - total_size = sizeof(union param_hdrs) + param_hdr.param_size; - packed_data = kzalloc(total_size, GFP_KERNEL); - if (!packed_data) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_data, ¶m_hdr, param_data, - &total_size); - if (ret) { - pr_err("%s: Failed to pack parameter data, error %d\n", - __func__, ret); - goto done; - } - - ret = adm_set_pp_params(port_id, copp_idx, NULL, packed_data, - total_size); - if (ret) - pr_err("%s: Failed to set parameter data, error %d\n", __func__, - ret); -done: - kfree(packed_data); - return ret; -} -EXPORT_SYMBOL(adm_pack_and_set_one_pp_param); - -/* - * Only one parameter can be requested at a time. Therefore, packing and sending - * the request can be handled locally. - */ -int adm_get_pp_params(int port_id, int copp_idx, uint32_t client_id, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr, u8 *returned_param_data) -{ - struct adm_cmd_get_pp_params adm_get_params; - int total_size = 0; - int get_param_array_sz = ARRAY_SIZE(adm_get_parameters); - int returned_param_size = 0; - int returned_param_size_in_bytes = 0; - int port_idx = 0; - int idx = 0; - atomic_t *copp_stat = NULL; - int ret = 0; - - if (param_hdr == NULL) { - pr_err("%s: Received NULL pointer for parameter header\n", - __func__); - return -EINVAL; - } - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_idx 0x%x\n", __func__, port_idx); - return -EINVAL; - } - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - memset(&adm_get_params, 0, sizeof(adm_get_params)); - - if (mem_hdr != NULL) - adm_get_params.mem_hdr = *mem_hdr; - - q6common_pack_pp_params((u8 *) &adm_get_params.param_hdr, param_hdr, - NULL, &total_size); - - /* Pack APR header after filling body so total_size has correct value */ - adm_get_params.apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - adm_get_params.apr_hdr.pkt_size = sizeof(adm_get_params); - adm_get_params.apr_hdr.src_svc = APR_SVC_ADM; - adm_get_params.apr_hdr.src_domain = APR_DOMAIN_APPS; - adm_get_params.apr_hdr.src_port = port_id; - adm_get_params.apr_hdr.dest_svc = APR_SVC_ADM; - adm_get_params.apr_hdr.dest_domain = APR_DOMAIN_ADSP; - adm_get_params.apr_hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_get_params.apr_hdr.token = - port_idx << 16 | client_id << 8 | copp_idx; - - if (q6common_is_instance_id_supported()) - adm_get_params.apr_hdr.opcode = ADM_CMD_GET_PP_PARAMS_V6; - else - adm_get_params.apr_hdr.opcode = ADM_CMD_GET_PP_PARAMS_V5; - - copp_stat = &this_adm.copp.stat[port_idx][copp_idx]; - atomic_set(copp_stat, -1); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *) &adm_get_params); - if (ret < 0) { - pr_err("%s: Get params APR send failed port = 0x%x ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(copp_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Get params timed out port = 0x%x\n", __func__, - port_id); - ret = -ETIMEDOUT; - goto done; - } - if (atomic_read(copp_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(copp_stat))); - ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat)); - goto done; - } - - ret = 0; - - /* Copy data to caller if sent in band */ - if (!returned_param_data) { - pr_debug("%s: Received NULL pointer for param destination, not copying payload\n", - __func__); - return 0; - } - - idx = ADM_GET_PARAMETER_LENGTH * copp_idx; - returned_param_size = adm_get_parameters[idx]; - if (returned_param_size < 0 || - returned_param_size + idx + 1 > get_param_array_sz) { - pr_err("%s: Invalid parameter size %d\n", __func__, - returned_param_size); - return -EINVAL; - } - - returned_param_size_in_bytes = returned_param_size * sizeof(uint32_t); - if (param_hdr->param_size < returned_param_size_in_bytes) { - pr_err("%s: Provided buffer is not big enough, provided buffer size(%d) size needed(%d)\n", - __func__, param_hdr->param_size, - returned_param_size_in_bytes); - return -EINVAL; - } - - memcpy(returned_param_data, &adm_get_parameters[idx + 1], - returned_param_size_in_bytes); -done: - return ret; -} -EXPORT_SYMBOL(adm_get_pp_params); - -int adm_get_pp_topo_module_list_v2(int port_id, int copp_idx, - int32_t param_length, - int32_t *returned_params) -{ - struct adm_cmd_get_pp_topo_module_list adm_get_module_list; - bool iid_supported = q6common_is_instance_id_supported(); - int *topo_list; - int num_modules = 0; - int list_size = 0; - int port_idx, idx; - int i = 0; - atomic_t *copp_stat = NULL; - int ret = 0; - - pr_debug("%s : port_id %x", __func__, port_id); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - memset(&adm_get_module_list, 0, sizeof(adm_get_module_list)); - - adm_get_module_list.apr_hdr.pkt_size = sizeof(adm_get_module_list); - adm_get_module_list.apr_hdr.src_svc = APR_SVC_ADM; - adm_get_module_list.apr_hdr.src_domain = APR_DOMAIN_APPS; - adm_get_module_list.apr_hdr.src_port = port_id; - adm_get_module_list.apr_hdr.dest_svc = APR_SVC_ADM; - adm_get_module_list.apr_hdr.dest_domain = APR_DOMAIN_ADSP; - adm_get_module_list.apr_hdr.dest_port = - atomic_read(&this_adm.copp.id[port_idx][copp_idx]); - adm_get_module_list.apr_hdr.token = port_idx << 16 | copp_idx; - /* - * Out of band functionality is not currently utilized. - * Assume in band. - */ - if (iid_supported) { - adm_get_module_list.apr_hdr.opcode = - ADM_CMD_GET_PP_TOPO_MODULE_LIST_V2; - adm_get_module_list.param_max_size = param_length; - } else { - adm_get_module_list.apr_hdr.opcode = - ADM_CMD_GET_PP_TOPO_MODULE_LIST; - - if (param_length > U16_MAX) { - pr_err("%s: Invalid param length for V1 %d\n", __func__, - param_length); - return -EINVAL; - } - adm_get_module_list.param_max_size = param_length << 16; - } - - copp_stat = &this_adm.copp.stat[port_idx][copp_idx]; - atomic_set(copp_stat, -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *) &adm_get_module_list); - if (ret < 0) { - pr_err("%s: APR send pkt failed for port_id: 0x%x failed ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(copp_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Timeout for port_id: 0x%x\n", __func__, port_id); - ret = -ETIMEDOUT; - goto done; - } - if (atomic_read(copp_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(copp_stat))); - ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat)); - goto done; - } - - ret = 0; - - if (returned_params) { - /* - * When processing ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST IID is - * added since it is not present. Therefore, there is no need to - * do anything different if IID is not supported here as it is - * already taken care of. - */ - idx = ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH * copp_idx; - num_modules = adm_module_topo_list[idx]; - if (num_modules < 0 || num_modules > MAX_MODULES_IN_TOPO) { - pr_err("%s: Invalid number of modules returned %d\n", - __func__, num_modules); - return -EINVAL; - } - - list_size = num_modules * sizeof(struct module_instance_info); - if (param_length < list_size) { - pr_err("%s: Provided buffer not big enough to hold module-instance list, provided size %d, needed size %d\n", - __func__, param_length, list_size); - return -EINVAL; - } - - topo_list = (int32_t *) (&adm_module_topo_list[idx]); - memcpy(returned_params, topo_list, list_size); - for (i = 1; i <= num_modules; i += 2) { - pr_debug("module = 0x%x instance = 0x%x\n", - returned_params[i], returned_params[i + 1]); - } - } -done: - return ret; -} -EXPORT_SYMBOL(adm_get_pp_topo_module_list_v2); - -static void adm_callback_debug_print(struct apr_client_data *data) -{ - uint32_t *payload; - - payload = data->payload; - - if (data->payload_size >= 8) - pr_debug("%s: code = 0x%x PL#0[0x%x], PL#1[0x%x], size = %d\n", - __func__, data->opcode, payload[0], payload[1], - data->payload_size); - else if (data->payload_size >= 4) - pr_debug("%s: code = 0x%x PL#0[0x%x], size = %d\n", - __func__, data->opcode, payload[0], - data->payload_size); - else - pr_debug("%s: code = 0x%x, size = %d\n", - __func__, data->opcode, data->payload_size); -} - -/** - * adm_set_multi_ch_map - - * Update multi channel map info - * - * @channel_map: pointer with channel map info - * @path: direction or ADM path type - * - * Returns 0 on success or error on failure - */ -int adm_set_multi_ch_map(char *channel_map, int path) -{ - int idx; - - if (path == ADM_PATH_PLAYBACK) { - idx = ADM_MCH_MAP_IDX_PLAYBACK; - } else if (path == ADM_PATH_LIVE_REC) { - idx = ADM_MCH_MAP_IDX_REC; - } else { - pr_err("%s: invalid attempt to set path %d\n", __func__, path); - return -EINVAL; - } - - memcpy(multi_ch_maps[idx].channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - multi_ch_maps[idx].set_channel_map = true; - - return 0; -} -EXPORT_SYMBOL(adm_set_multi_ch_map); - -/** - * adm_get_multi_ch_map - - * Retrieves multi channel map info - * - * @channel_map: pointer to be updated with channel map - * @path: direction or ADM path type - * - * Returns 0 on success or error on failure - */ -int adm_get_multi_ch_map(char *channel_map, int path) -{ - int idx; - - if (path == ADM_PATH_PLAYBACK) { - idx = ADM_MCH_MAP_IDX_PLAYBACK; - } else if (path == ADM_PATH_LIVE_REC) { - idx = ADM_MCH_MAP_IDX_REC; - } else { - pr_err("%s: invalid attempt to get path %d\n", __func__, path); - return -EINVAL; - } - - if (multi_ch_maps[idx].set_channel_map) { - memcpy(channel_map, multi_ch_maps[idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - return 0; -} -EXPORT_SYMBOL(adm_get_multi_ch_map); - -/** - * adm_set_port_multi_ch_map - - * Update port specific channel map info - * - * @channel_map: pointer with channel map info - * @port_id: port for which chmap is set - */ -void adm_set_port_multi_ch_map(char *channel_map, int port_id) -{ - int port_idx; - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return; - } - - memcpy(port_channel_map[port_idx].channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - port_channel_map[port_idx].set_channel_map = true; -} -EXPORT_SYMBOL(adm_set_port_multi_ch_map); - -static int adm_process_get_param_response(u32 opcode, u32 idx, u32 *payload, - u32 payload_size) -{ - struct adm_cmd_rsp_get_pp_params_v5 *v5_rsp = NULL; - struct adm_cmd_rsp_get_pp_params_v6 *v6_rsp = NULL; - u32 *param_data = NULL; - int data_size = 0; - int struct_size = 0; - - if (payload == NULL) { - pr_err("%s: Payload is NULL\n", __func__); - return -EINVAL; - } - - switch (opcode) { - case ADM_CMDRSP_GET_PP_PARAMS_V5: - struct_size = sizeof(struct adm_cmd_rsp_get_pp_params_v5); - if (payload_size < struct_size) { - pr_err("%s: payload size %d < expected size %d\n", - __func__, payload_size, struct_size); - break; - } - v5_rsp = (struct adm_cmd_rsp_get_pp_params_v5 *) payload; - data_size = v5_rsp->param_hdr.param_size; - param_data = v5_rsp->param_data; - break; - case ADM_CMDRSP_GET_PP_PARAMS_V6: - struct_size = sizeof(struct adm_cmd_rsp_get_pp_params_v6); - if (payload_size < struct_size) { - pr_err("%s: payload size %d < expected size %d\n", - __func__, payload_size, struct_size); - break; - } - v6_rsp = (struct adm_cmd_rsp_get_pp_params_v6 *) payload; - data_size = v6_rsp->param_hdr.param_size; - param_data = v6_rsp->param_data; - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - return -EINVAL; - } - - /* - * Just store the returned parameter data, not the header. The calling - * function is expected to know what it asked for. Therefore, there is - * no difference between V5 and V6. - */ - if ((payload_size >= struct_size + data_size) && - (ARRAY_SIZE(adm_get_parameters) > idx) && - (ARRAY_SIZE(adm_get_parameters) > idx + 1 + data_size)) { - pr_debug("%s: Received parameter data in band\n", - __func__); - /* - * data_size is expressed in number of bytes, store in number of - * ints - */ - adm_get_parameters[idx] = - data_size / sizeof(*adm_get_parameters); - pr_debug("%s: GET_PP PARAM: received parameter length: 0x%x\n", - __func__, adm_get_parameters[idx]); - /* store params after param_size */ - memcpy(&adm_get_parameters[idx + 1], param_data, data_size); - } else if (payload_size == sizeof(uint32_t)) { - adm_get_parameters[idx] = -1; - pr_debug("%s: Out of band case, setting size to %d\n", - __func__, adm_get_parameters[idx]); - } else { - pr_err("%s: Invalid parameter combination, payload_size %d, idx %d\n", - __func__, payload_size, idx); - return -EINVAL; - } - return 0; -} - -static int adm_process_get_topo_list_response(u32 opcode, int copp_idx, - u32 num_modules, u32 *payload, - u32 payload_size) -{ - u32 *fill_list = NULL; - int idx = 0; - int i = 0; - int j = 0; - - if (payload == NULL) { - pr_err("%s: Payload is NULL\n", __func__); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid COPP index %d\n", __func__, copp_idx); - return -EINVAL; - } - - idx = ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH * copp_idx; - fill_list = adm_module_topo_list + idx; - *fill_list++ = num_modules; - for (i = 0; i < num_modules; i++) { - if (j > payload_size / sizeof(u32)) { - pr_err("%s: Invalid number of modules specified %d\n", - __func__, num_modules); - return -EINVAL; - } - - /* store module ID */ - *fill_list++ = payload[j]; - j++; - - switch (opcode) { - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST_V2: - /* store instance ID */ - *fill_list++ = payload[j]; - j++; - break; - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST: - /* Insert IID 0 when repacking */ - *fill_list++ = INSTANCE_ID_0; - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - return -EINVAL; - } - } - - return 0; -} - -static void adm_reset_data(void) -{ - int i, j; - - apr_reset(this_adm.apr); - for (i = 0; i < AFE_MAX_PORTS; i++) { - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - atomic_set(&this_adm.copp.id[i][j], - RESET_COPP_ID); - atomic_set(&this_adm.copp.cnt[i][j], 0); - atomic_set( - &this_adm.copp.topology[i][j], 0); - atomic_set(&this_adm.copp.mode[i][j], - 0); - atomic_set(&this_adm.copp.stat[i][j], - 0); - atomic_set(&this_adm.copp.rate[i][j], - 0); - atomic_set( - &this_adm.copp.channels[i][j], - 0); - atomic_set( - &this_adm.copp.bit_width[i][j], 0); - atomic_set( - &this_adm.copp.app_type[i][j], 0); - atomic_set( - &this_adm.copp.acdb_id[i][j], 0); - this_adm.copp.adm_status[i][j] = - ADM_STATUS_CALIBRATION_REQUIRED; - } - } - this_adm.apr = NULL; - cal_utils_clear_cal_block_q6maps(ADM_MAX_CAL_TYPES, - this_adm.cal_data); - mutex_lock(&this_adm.cal_data - [ADM_CUSTOM_TOP_CAL]->lock); - this_adm.set_custom_topology = 1; - mutex_unlock(&this_adm.cal_data[ - ADM_CUSTOM_TOP_CAL]->lock); - rtac_clear_mapping(ADM_RTAC_CAL); - /* - * Free the ION memory and clear the map handles - * for Source Tracking - */ - if (this_adm.sourceTrackingData.memmap.paddr != 0) { - msm_audio_ion_free( - this_adm.sourceTrackingData.dma_buf); - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = - NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - atomic_set(&this_adm.mem_map_handles[ - ADM_MEM_MAP_INDEX_SOURCE_TRACKING], 0); - } -} - -static int32_t adm_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *payload; - int port_idx, copp_idx, idx, client_id; - int num_modules; - int ret; - - if (data == NULL) { - pr_err("%s: data parameter is null\n", __func__); - return -EINVAL; - } - - payload = data->payload; - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event is received: %d %d apr[%pK]\n", - __func__, - data->reset_event, data->reset_proc, this_adm.apr); - if (this_adm.apr) - adm_reset_data(); - return 0; - } - - adm_callback_debug_print(data); - if (data->payload_size >= sizeof(uint32_t)) { - copp_idx = (data->token) & 0XFF; - port_idx = ((data->token) >> 16) & 0xFF; - client_id = ((data->token) >> 8) & 0xFF; - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port idx %d token %d\n", - __func__, port_idx, data->token); - return 0; - } - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp idx %d token %d\n", - __func__, copp_idx, data->token); - return 0; - } - if (client_id < 0 || client_id >= ADM_CLIENT_ID_MAX) { - pr_err("%s: Invalid client id %d\n", __func__, - client_id); - return 0; - } - if (data->opcode == APR_BASIC_RSP_RESULT) { - pr_debug("%s: APR_BASIC_RSP_RESULT id 0x%x\n", - __func__, payload[0]); - - if (!((client_id != ADM_CLIENT_ID_SOURCE_TRACKING) && - ((payload[0] == ADM_CMD_SET_PP_PARAMS_V5) || - (payload[0] == ADM_CMD_SET_PP_PARAMS_V6)))) { - if (data->payload_size < - (2 * sizeof(uint32_t))) { - pr_err("%s: Invalid payload size %d\n", - __func__, data->payload_size); - return 0; - } - } - - if (payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - } - switch (payload[0]) { - case ADM_CMD_SET_PP_PARAMS_V5: - case ADM_CMD_SET_PP_PARAMS_V6: - pr_debug("%s: ADM_CMD_SET_PP_PARAMS\n", - __func__); - if (client_id == ADM_CLIENT_ID_SOURCE_TRACKING) - this_adm.sourceTrackingData. - apr_cmd_status = payload[1]; - else { - rtac_make_adm_callback(payload, - data->payload_size); - } - atomic_set(&this_adm.copp.stat[port_idx] - [copp_idx], payload[1]); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - - /* - * if soft volume is called and already - * interrupted break out of the sequence here - */ - case ADM_CMD_DEVICE_OPEN_V5: - case ADM_CMD_DEVICE_CLOSE_V5: - case ADM_CMD_DEVICE_OPEN_V6: - case ADM_CMD_DEVICE_OPEN_V8: - pr_debug("%s: Basic callback received, wake up.\n", - __func__); - atomic_set(&this_adm.copp.stat[port_idx] - [copp_idx], payload[1]); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMD_ADD_TOPOLOGIES: - pr_debug("%s: callback received, ADM_CMD_ADD_TOPOLOGIES.\n", - __func__); - atomic_set(&this_adm.adm_stat, payload[1]); - wake_up(&this_adm.adm_wait); - break; - case ADM_CMD_MATRIX_MAP_ROUTINGS_V5: - case ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5: - pr_debug("%s: Basic callback received, wake up.\n", - __func__); - atomic_set(&this_adm.matrix_map_stat, - payload[1]); - wake_up(&this_adm.matrix_map_wait); - break; - case ADM_CMD_SHARED_MEM_UNMAP_REGIONS: - pr_debug("%s: ADM_CMD_SHARED_MEM_UNMAP_REGIONS\n", - __func__); - atomic_set(&this_adm.adm_stat, payload[1]); - wake_up(&this_adm.adm_wait); - break; - case ADM_CMD_SHARED_MEM_MAP_REGIONS: - pr_debug("%s: ADM_CMD_SHARED_MEM_MAP_REGIONS\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - if (payload[1] != 0) { - pr_err("%s: ADM map error, resuming\n", - __func__); - atomic_set(&this_adm.adm_stat, - payload[1]); - wake_up(&this_adm.adm_wait); - } - break; - case ADM_CMD_GET_PP_PARAMS_V5: - case ADM_CMD_GET_PP_PARAMS_V6: - pr_debug("%s: ADM_CMD_GET_PP_PARAMS\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* ADM_CMDRSP_GET_PP_PARAMS_V5 */ - if (client_id == - ADM_CLIENT_ID_SOURCE_TRACKING) { - this_adm.sourceTrackingData. - apr_cmd_status = payload[1]; - if (payload[1] != 0) - pr_err("%s: ADM get param error = %d\n", - __func__, payload[1]); - - atomic_set(&this_adm.copp.stat - [port_idx][copp_idx], - payload[1]); - wake_up(&this_adm.copp.wait - [port_idx][copp_idx]); - } else { - if (payload[1] != 0) { - pr_err("%s: ADM get param error = %d, resuming\n", - __func__, payload[1]); - - rtac_make_adm_callback(payload, - data->payload_size); - } - } - break; - case ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5: - case ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V6: - pr_debug("%s:callback received PSPD MTMX, wake up\n", - __func__); - atomic_set(&this_adm.copp.stat[port_idx] - [copp_idx], payload[1]); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMD_GET_PP_TOPO_MODULE_LIST: - case ADM_CMD_GET_PP_TOPO_MODULE_LIST_V2: - pr_debug("%s:ADM_CMD_GET_PP_TOPO_MODULE_LIST\n", - __func__); - if (payload[1] != 0) - pr_err("%s: ADM get topo list error = %d\n", - __func__, payload[1]); - break; - default: - pr_err("%s: Unknown Cmd: 0x%x\n", __func__, - payload[0]); - break; - } - return 0; - } - - switch (data->opcode) { - case ADM_CMDRSP_DEVICE_OPEN_V5: - case ADM_CMDRSP_DEVICE_OPEN_V6: - case ADM_CMDRSP_DEVICE_OPEN_V8: { - struct adm_cmd_rsp_device_open_v5 *open = NULL; - if (data->payload_size < - sizeof(struct adm_cmd_rsp_device_open_v5)) { - pr_err("%s: Invalid payload size %d\n", __func__, - data->payload_size); - return 0; - } - open = (struct adm_cmd_rsp_device_open_v5 *)data->payload; - if (open->copp_id == INVALID_COPP_ID) { - pr_err("%s: invalid coppid rxed %d\n", - __func__, open->copp_id); - atomic_set(&this_adm.copp.stat[port_idx] - [copp_idx], ADSP_EBADPARAM); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - } - atomic_set(&this_adm.copp.stat - [port_idx][copp_idx], payload[0]); - atomic_set(&this_adm.copp.id[port_idx][copp_idx], - open->copp_id); - pr_debug("%s: coppid rxed=%d\n", __func__, - open->copp_id); - wake_up(&this_adm.copp.wait[port_idx][copp_idx]); - } - break; - case ADM_CMDRSP_GET_PP_PARAMS_V5: - case ADM_CMDRSP_GET_PP_PARAMS_V6: - pr_debug("%s: ADM_CMDRSP_GET_PP_PARAMS\n", __func__); - if (client_id == ADM_CLIENT_ID_SOURCE_TRACKING) - this_adm.sourceTrackingData.apr_cmd_status = - payload[0]; - else if (rtac_make_adm_callback(payload, - data->payload_size)) { - atomic_set( - &this_adm.copp.stat[port_idx][copp_idx], - payload[0]); - wake_up( - &this_adm.copp.wait[port_idx][copp_idx]); - break; - } - - idx = ADM_GET_PARAMETER_LENGTH * copp_idx; - if (payload[0] == 0 && data->payload_size > 0) { - ret = adm_process_get_param_response( - data->opcode, idx, payload, - data->payload_size); - if (ret) - pr_err("%s: Failed to process get param response, error %d\n", - __func__, ret); - } else { - adm_get_parameters[idx] = -1; - pr_err("%s: ADM_CMDRSP_GET_PP_PARAMS returned error 0x%x\n", - __func__, payload[0]); - } - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], - payload[0]); - wake_up(&this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST: - case ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST_V2: - pr_debug("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST\n", - __func__); - if (data->payload_size >= (2 * sizeof(uint32_t))) { - num_modules = payload[1]; - pr_debug("%s: Num modules %d\n", __func__, - num_modules); - if (payload[0]) { - pr_err("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST, error = %d\n", - __func__, payload[0]); - } else if (num_modules > MAX_MODULES_IN_TOPO) { - pr_err("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST invalid num modules received, num modules = %d\n", - __func__, num_modules); - } else { - ret = adm_process_get_topo_list_response( - data->opcode, copp_idx, - num_modules, payload, - data->payload_size); - if (ret) - pr_err("%s: Failed to process get topo modules list response, error %d\n", - __func__, ret); - } - } else { - pr_err("%s: Invalid payload size %d\n", - __func__, data->payload_size); - } - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], - payload[0]); - wake_up(&this_adm.copp.wait[port_idx][copp_idx]); - break; - case ADM_CMDRSP_SHARED_MEM_MAP_REGIONS: - pr_debug("%s: ADM_CMDRSP_SHARED_MEM_MAP_REGIONS\n", - __func__); - atomic_set(&this_adm.mem_map_handles[ - atomic_read(&this_adm.mem_map_index)], - *payload); - atomic_set(&this_adm.adm_stat, 0); - wake_up(&this_adm.adm_wait); - break; - default: - pr_err("%s: Unknown cmd:0x%x\n", __func__, - data->opcode); - break; - } - } - return 0; -} - -static int adm_memory_map_regions(phys_addr_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int ret = 0; - int i = 0; - int cmd_size = 0; - - pr_debug("%s:\n", __func__); - if (this_adm.apr == NULL) { - this_adm.apr = apr_register("ADSP", "ADM", adm_callback, - 0xFFFFFFFF, &this_adm); - if (this_adm.apr == NULL) { - pr_err("%s: Unable to register ADM\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_adm_handle(this_adm.apr); - } - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + sizeof(struct avs_shared_map_region_payload) - * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_shared_mem_map_regions *)mmap_region_cmd; - mmap_regions->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mmap_regions->hdr.pkt_size = cmd_size; - mmap_regions->hdr.src_port = 0; - - mmap_regions->hdr.dest_port = 0; - mmap_regions->hdr.token = 0; - mmap_regions->hdr.opcode = ADM_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL & 0x00ff; - mmap_regions->num_regions = bufcnt & 0x00ff; - mmap_regions->property_flag = 0x00; - - pr_debug("%s: map_regions->num_regions = %d\n", __func__, - mmap_regions->num_regions); - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - for (i = 0; i < bufcnt; i++) { - mregions->shm_addr_lsw = lower_32_bits(buf_add[i]); - mregions->shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_add[i]); - mregions->mem_size_bytes = bufsz[i]; - ++mregions; - } - - atomic_set(&this_adm.adm_stat, -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *) mmap_region_cmd); - if (ret < 0) { - pr_err("%s: mmap_regions op[0x%x]rc[%d]\n", __func__, - mmap_regions->hdr.opcode, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(this_adm.adm_wait, - atomic_read(&this_adm.adm_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory_map\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.adm_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.adm_stat))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.adm_stat)); - goto fail_cmd; - } -fail_cmd: - kfree(mmap_region_cmd); - return ret; -} - -static int adm_memory_unmap_regions(void) -{ - struct avs_cmd_shared_mem_unmap_regions unmap_regions; - int ret = 0; - - pr_debug("%s:\n", __func__); - if (this_adm.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - unmap_regions.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - unmap_regions.hdr.pkt_size = sizeof(unmap_regions); - unmap_regions.hdr.src_port = 0; - unmap_regions.hdr.dest_port = 0; - unmap_regions.hdr.token = 0; - unmap_regions.hdr.opcode = ADM_CMD_SHARED_MEM_UNMAP_REGIONS; - unmap_regions.mem_map_handle = atomic_read(&this_adm. - mem_map_handles[atomic_read(&this_adm.mem_map_index)]); - atomic_set(&this_adm.adm_stat, -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *) &unmap_regions); - if (ret < 0) { - pr_err("%s: mmap_regions op[0x%x]rc[%d]\n", __func__, - unmap_regions.hdr.opcode, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(this_adm.adm_wait, - atomic_read(&this_adm.adm_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory_unmap\n", - __func__); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.adm_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.adm_stat))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.adm_stat)); - goto fail_cmd; - } else { - pr_debug("%s: Unmap handle 0x%x succeeded\n", __func__, - unmap_regions.mem_map_handle); - } -fail_cmd: - return ret; -} - -static int remap_cal_data(struct cal_block_data *cal_block, int cal_index) -{ - int ret = 0; - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - atomic_set(&this_adm.mem_map_index, cal_index); - ret = adm_memory_map_regions(&cal_block->cal_data.paddr, 0, - (uint32_t *)&cal_block->map_data.map_size, 1); - if (ret < 0) { - pr_err("%s: ADM mmap did not work! size = %zd ret %d\n", - __func__, - cal_block->map_data.map_size, ret); - pr_debug("%s: ADM mmap did not work! addr = 0x%pK, size = %zd ret %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size, ret); - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_adm. - mem_map_handles[cal_index]); - } -done: - return ret; -} - -static void send_adm_custom_topology(void) -{ - struct cal_block_data *cal_block = NULL; - struct cmd_set_topologies adm_top; - int cal_index = ADM_CUSTOM_TOP_CAL; - int result; - - if (this_adm.cal_data[cal_index] == NULL) - goto done; - - mutex_lock(&this_adm.cal_data[cal_index]->lock); - if (!this_adm.set_custom_topology) - goto unlock; - this_adm.set_custom_topology = 0; - - cal_block = cal_utils_get_only_cal_block(this_adm.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) - goto unlock; - - pr_debug("%s: Sending cal_index %d\n", __func__, cal_index); - - result = remap_cal_data(cal_block, cal_index); - if (result) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - goto unlock; - } - atomic_set(&this_adm.mem_map_index, cal_index); - atomic_set(&this_adm.mem_map_handles[cal_index], - cal_block->map_data.q6map_handle); - - if (cal_block->cal_data.size == 0) { - pr_debug("%s: No ADM cal to send\n", __func__); - goto unlock; - } - - adm_top.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - adm_top.hdr.pkt_size = sizeof(adm_top); - adm_top.hdr.src_svc = APR_SVC_ADM; - adm_top.hdr.src_domain = APR_DOMAIN_APPS; - adm_top.hdr.src_port = 0; - adm_top.hdr.dest_svc = APR_SVC_ADM; - adm_top.hdr.dest_domain = APR_DOMAIN_ADSP; - adm_top.hdr.dest_port = 0; - adm_top.hdr.token = 0; - adm_top.hdr.opcode = ADM_CMD_ADD_TOPOLOGIES; - adm_top.payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr); - adm_top.payload_addr_msw = msm_audio_populate_upper_32_bits( - cal_block->cal_data.paddr); - adm_top.mem_map_handle = cal_block->map_data.q6map_handle; - adm_top.payload_size = cal_block->cal_data.size; - - atomic_set(&this_adm.adm_stat, -1); - pr_debug("%s: Sending ADM_CMD_ADD_TOPOLOGIES payload = 0x%pK, size = %d\n", - __func__, &cal_block->cal_data.paddr, - adm_top.payload_size); - result = apr_send_pkt(this_adm.apr, (uint32_t *)&adm_top); - if (result < 0) { - pr_err("%s: Set topologies failed payload size = %zd result %d\n", - __func__, cal_block->cal_data.size, result); - goto unlock; - } - /* Wait for the callback */ - result = wait_event_timeout(this_adm.adm_wait, - atomic_read(&this_adm.adm_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set topologies timed out payload size = %zd\n", - __func__, cal_block->cal_data.size); - goto unlock; - } else if (atomic_read(&this_adm.adm_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.adm_stat))); - result = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.adm_stat)); - goto unlock; - } -unlock: - mutex_unlock(&this_adm.cal_data[cal_index]->lock); -done: - return; -} - -static int send_adm_cal_block(int port_id, int copp_idx, - struct cal_block_data *cal_block, int perf_mode) -{ - struct mem_mapping_hdr mem_hdr; - int payload_size = 0; - int port_idx = 0; - int topology = 0; - int result = 0; - - pr_debug("%s: Port id 0x%x,\n", __func__, port_id); - - if (!cal_block) { - pr_debug("%s: No ADM cal to send for port_id = 0x%x!\n", - __func__, port_id); - result = -EINVAL; - goto done; - } - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: No ADM cal sent for port_id = 0x%x!\n", __func__, - port_id); - result = -EINVAL; - goto done; - } - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - topology = atomic_read(&this_adm.copp.topology[port_idx][copp_idx]); - if (perf_mode == LEGACY_PCM_MODE && - topology == DS2_ADM_COPP_TOPOLOGY_ID) { - pr_err("%s: perf_mode %d, topology 0x%x\n", __func__, perf_mode, - topology); - goto done; - } - - mem_hdr.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - mem_hdr.mem_map_handle = cal_block->map_data.q6map_handle; - payload_size = cal_block->cal_data.size; - - adm_set_pp_params(port_id, copp_idx, &mem_hdr, NULL, payload_size); - -done: - return result; -} - -static struct cal_block_data *adm_find_cal_by_path(int cal_index, int path) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audproc *audproc_cal_info = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - - pr_debug("%s:\n", __func__); - - list_for_each_safe(ptr, next, - &this_adm.cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - audproc_cal_info = cal_block->cal_info; - if ((audproc_cal_info->path == path) && - (cal_block->cal_data.size > 0)) - return cal_block; - } else if (cal_index == ADM_AUDVOL_CAL) { - audvol_cal_info = cal_block->cal_info; - if ((audvol_cal_info->path == path) && - (cal_block->cal_data.size > 0)) - return cal_block; - } - } - pr_debug("%s: Can't find ADM cal for cal_index %d, path %d\n", - __func__, cal_index, path); - return NULL; -} - -static struct cal_block_data *adm_find_cal_by_app_type(int cal_index, int path, - int app_type) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audproc *audproc_cal_info = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - - pr_debug("%s\n", __func__); - - list_for_each_safe(ptr, next, - &this_adm.cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - audproc_cal_info = cal_block->cal_info; - if ((audproc_cal_info->path == path) && - (audproc_cal_info->app_type == app_type) && - (cal_block->cal_data.size > 0)) - return cal_block; - } else if (cal_index == ADM_AUDVOL_CAL) { - audvol_cal_info = cal_block->cal_info; - if ((audvol_cal_info->path == path) && - (audvol_cal_info->app_type == app_type) && - (cal_block->cal_data.size > 0)) - return cal_block; - } - } - pr_debug("%s: Can't find ADM cali for cal_index %d, path %d, app %d, defaulting to search by path\n", - __func__, cal_index, path, app_type); - return adm_find_cal_by_path(cal_index, path); -} - - -static struct cal_block_data *adm_find_cal(int cal_index, int path, - int app_type, int acdb_id, - int sample_rate) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audproc *audproc_cal_info = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - - pr_debug("%s:\n", __func__); - - list_for_each_safe(ptr, next, - &this_adm.cal_data[cal_index]->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - audproc_cal_info = cal_block->cal_info; - if ((audproc_cal_info->path == path) && - (audproc_cal_info->app_type == app_type) && - (audproc_cal_info->acdb_id == acdb_id) && - (audproc_cal_info->sample_rate == sample_rate) && - (cal_block->cal_data.size > 0)) - return cal_block; - } else if (cal_index == ADM_AUDVOL_CAL) { - audvol_cal_info = cal_block->cal_info; - if ((audvol_cal_info->path == path) && - (audvol_cal_info->app_type == app_type) && - (audvol_cal_info->acdb_id == acdb_id) && - (cal_block->cal_data.size > 0)) - return cal_block; - } - } - pr_debug("%s: Can't find ADM cal for cal_index %d, path %d, app %d, acdb_id %d sample_rate %d defaulting to search by app type\n", - __func__, cal_index, path, app_type, acdb_id, sample_rate); - return adm_find_cal_by_app_type(cal_index, path, app_type); -} - -static int adm_remap_and_send_cal_block(int cal_index, int port_id, - int copp_idx, struct cal_block_data *cal_block, int perf_mode, - int app_type, int acdb_id, int sample_rate) -{ - int ret = 0; - - pr_debug("%s: Sending cal_index cal %d\n", __func__, cal_index); - ret = remap_cal_data(cal_block, cal_index); - if (ret) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - goto done; - } - ret = send_adm_cal_block(port_id, copp_idx, cal_block, perf_mode); - if (ret < 0) - pr_debug("%s: No cal sent for cal_index %d, port_id = 0x%x! ret %d sample_rate %d\n", - __func__, cal_index, port_id, ret, sample_rate); -done: - return ret; -} - -static void send_adm_cal_type(int cal_index, int path, int port_id, - int copp_idx, int perf_mode, int app_type, - int acdb_id, int sample_rate) -{ - struct cal_block_data *cal_block = NULL; - int ret; - - pr_debug("%s: cal index %d\n", __func__, cal_index); - - if (this_adm.cal_data[cal_index] == NULL) { - pr_debug("%s: cal_index %d not allocated!\n", - __func__, cal_index); - goto done; - } - - mutex_lock(&this_adm.cal_data[cal_index]->lock); - cal_block = adm_find_cal(cal_index, path, app_type, acdb_id, - sample_rate); - if (cal_block == NULL) - goto unlock; - - ret = adm_remap_and_send_cal_block(cal_index, port_id, copp_idx, - cal_block, perf_mode, app_type, acdb_id, sample_rate); - - cal_utils_mark_cal_used(cal_block); -unlock: - mutex_unlock(&this_adm.cal_data[cal_index]->lock); -done: - return; -} - -static int get_cal_path(int path) -{ - if (path == 0x1) - return RX_DEVICE; - else - return TX_DEVICE; -} - -static void send_adm_cal(int port_id, int copp_idx, int path, int perf_mode, - int app_type, int acdb_id, int sample_rate, - int passthr_mode) -{ - pr_debug("%s: port id 0x%x copp_idx %d\n", __func__, port_id, copp_idx); - - if (passthr_mode != LISTEN) { - send_adm_cal_type(ADM_AUDPROC_CAL, path, port_id, copp_idx, - perf_mode, app_type, acdb_id, sample_rate); - } else { - send_adm_cal_type(ADM_LSM_AUDPROC_CAL, path, port_id, copp_idx, - perf_mode, app_type, acdb_id, sample_rate); - - send_adm_cal_type(ADM_LSM_AUDPROC_PERSISTENT_CAL, path, - port_id, copp_idx, perf_mode, app_type, - acdb_id, sample_rate); - } - - send_adm_cal_type(ADM_AUDVOL_CAL, path, port_id, copp_idx, perf_mode, - app_type, acdb_id, sample_rate); -} - -/** - * adm_connect_afe_port - - * command to send ADM connect AFE port - * - * @mode: value of mode for ADM connect AFE - * @session_id: session active to connect - * @port_id: Port ID number - * - * Returns 0 on success or error on failure - */ -int adm_connect_afe_port(int mode, int session_id, int port_id) -{ - struct adm_cmd_connect_afe_port_v5 cmd; - int ret = 0; - int port_idx, copp_idx = 0; - - pr_debug("%s: port_id: 0x%x session id:%d mode:%d\n", __func__, - port_id, session_id, mode); - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - if (this_adm.apr == NULL) { - this_adm.apr = apr_register("ADSP", "ADM", adm_callback, - 0xFFFFFFFF, &this_adm); - if (this_adm.apr == NULL) { - pr_err("%s: Unable to register ADM\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_adm_handle(this_adm.apr); - } - pr_debug("%s: Port ID 0x%x, index %d\n", __func__, port_id, port_idx); - - cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cmd.hdr.pkt_size = sizeof(cmd); - cmd.hdr.src_svc = APR_SVC_ADM; - cmd.hdr.src_domain = APR_DOMAIN_APPS; - cmd.hdr.src_port = port_id; - cmd.hdr.dest_svc = APR_SVC_ADM; - cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cmd.hdr.dest_port = 0; /* Ignored */ - cmd.hdr.token = port_idx << 16 | copp_idx; - cmd.hdr.opcode = ADM_CMD_CONNECT_AFE_PORT_V5; - - cmd.mode = mode; - cmd.session_id = session_id; - cmd.afe_port_id = port_id; - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&cmd); - if (ret < 0) { - pr_err("%s: ADM enable for port_id: 0x%x failed ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - /* Wait for the callback with copp id */ - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat[port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: ADM connect timedout for port_id: 0x%x\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - goto fail_cmd; - } - atomic_inc(&this_adm.copp.cnt[port_idx][copp_idx]); - return 0; - -fail_cmd: - - return ret; -} -EXPORT_SYMBOL(adm_connect_afe_port); - -int adm_arrange_mch_map(struct adm_cmd_device_open_v5 *open, int path, - int channel_mode, int port_idx) -{ - int rc = 0, idx; - - pr_debug("%s: channel mode %d", __func__, channel_mode); - - memset(open->dev_channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - switch (path) { - case ADM_PATH_PLAYBACK: - idx = ADM_MCH_MAP_IDX_PLAYBACK; - break; - case ADM_PATH_LIVE_REC: - case ADM_PATH_NONLIVE_REC: - idx = ADM_MCH_MAP_IDX_REC; - break; - default: - goto non_mch_path; - }; - - if ((open->dev_num_channel > 2) && - (port_channel_map[port_idx].set_channel_map || - multi_ch_maps[idx].set_channel_map)) { - if (port_channel_map[port_idx].set_channel_map) - memcpy(open->dev_channel_mapping, - port_channel_map[port_idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL); - else - memcpy(open->dev_channel_mapping, - multi_ch_maps[idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL); - } else { - if (channel_mode == 1) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_LS; - open->dev_channel_mapping[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_FC; - open->dev_channel_mapping[3] = PCM_CHANNEL_LS; - open->dev_channel_mapping[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - open->dev_channel_mapping[3] = PCM_CHANNEL_FC; - open->dev_channel_mapping[4] = PCM_CHANNEL_LS; - open->dev_channel_mapping[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 7) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_FC; - open->dev_channel_mapping[3] = PCM_CHANNEL_LFE; - open->dev_channel_mapping[4] = PCM_CHANNEL_LB; - open->dev_channel_mapping[5] = PCM_CHANNEL_RB; - open->dev_channel_mapping[6] = PCM_CHANNEL_CS; - } else if (channel_mode == 8) { - open->dev_channel_mapping[0] = PCM_CHANNEL_FL; - open->dev_channel_mapping[1] = PCM_CHANNEL_FR; - open->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - open->dev_channel_mapping[3] = PCM_CHANNEL_FC; - open->dev_channel_mapping[4] = PCM_CHANNEL_LS; - open->dev_channel_mapping[5] = PCM_CHANNEL_RS; - open->dev_channel_mapping[6] = PCM_CHANNEL_LB; - open->dev_channel_mapping[7] = PCM_CHANNEL_RB; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - goto inval_ch_mod; - } - } - -non_mch_path: -inval_ch_mod: - return rc; -} - -int adm_arrange_mch_ep2_map(struct adm_cmd_device_open_v6 *open_v6, - int channel_mode) -{ - int rc = 0; - - memset(open_v6->dev_channel_mapping_eid2, 0, - PCM_FORMAT_MAX_NUM_CHANNEL); - - if (channel_mode == 1) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_FC; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_LFE; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_FC; - open_v6->dev_channel_mapping_eid2[4] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 8) { - open_v6->dev_channel_mapping_eid2[0] = PCM_CHANNEL_FL; - open_v6->dev_channel_mapping_eid2[1] = PCM_CHANNEL_FR; - open_v6->dev_channel_mapping_eid2[2] = PCM_CHANNEL_LFE; - open_v6->dev_channel_mapping_eid2[3] = PCM_CHANNEL_FC; - open_v6->dev_channel_mapping_eid2[4] = PCM_CHANNEL_LS; - open_v6->dev_channel_mapping_eid2[5] = PCM_CHANNEL_RS; - open_v6->dev_channel_mapping_eid2[6] = PCM_CHANNEL_LB; - open_v6->dev_channel_mapping_eid2[7] = PCM_CHANNEL_RB; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - } - - return rc; -} - -static int adm_arrange_mch_map_v8( - struct adm_device_endpoint_payload *ep_payload, - int path, int channel_mode, int port_idx) -{ - int rc = 0, idx; - - memset(ep_payload->dev_channel_mapping, - 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - switch (path) { - case ADM_PATH_PLAYBACK: - idx = ADM_MCH_MAP_IDX_PLAYBACK; - break; - case ADM_PATH_LIVE_REC: - case ADM_PATH_NONLIVE_REC: - idx = ADM_MCH_MAP_IDX_REC; - break; - default: - goto non_mch_path; - }; - - if ((ep_payload->dev_num_channel > 2) && - (port_channel_map[port_idx].set_channel_map || - multi_ch_maps[idx].set_channel_map)) { - if (port_channel_map[port_idx].set_channel_map) - memcpy(ep_payload->dev_channel_mapping, - port_channel_map[port_idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - else - memcpy(ep_payload->dev_channel_mapping, - multi_ch_maps[idx].channel_mapping, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } else { - if (channel_mode == 1) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 7) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_CS; - } else if (channel_mode == 8) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - } else if (channel_mode == 10) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - } else if (channel_mode == 12) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_TSR; - } else if (channel_mode == 16) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_TSR; - ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; - ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; - ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; - ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - goto inval_ch_mod; - } - } - -non_mch_path: -inval_ch_mod: - return rc; -} - -static int adm_arrange_mch_ep2_map_v8( - struct adm_device_endpoint_payload *ep_payload, - int channel_mode) -{ - int rc = 0; - - memset(ep_payload->dev_channel_mapping, 0, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (channel_mode == 1) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FC; - } else if (channel_mode == 2) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channel_mode == 3) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - } else if (channel_mode == 4) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_RS; - } else if (channel_mode == 5) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_RS; - } else if (channel_mode == 6) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - } else if (channel_mode == 8) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - } else if (channel_mode == 10) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; - ep_payload->dev_channel_mapping[9] = PCM_CHANNELS; - } else if (channel_mode == 12) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_TFL; - ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TFR; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_TSL; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_TSR; - } else if (channel_mode == 16) { - ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; - ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; - ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; - ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; - ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; - ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; - ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; - ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; - ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; - ep_payload->dev_channel_mapping[9] = PCM_CHANNELS; - ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; - ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; - ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; - ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; - ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; - ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; - } else { - pr_err("%s: invalid num_chan %d\n", __func__, - channel_mode); - rc = -EINVAL; - } - - return rc; -} -/** - * adm_open - - * command to send ADM open - * - * @port_id: port id number - * @path: direction or ADM path type - * @rate: sample rate of session - * @channel_mode: number of channels set - * @topology: topology active for this session - * @perf_mode: performance mode like LL/ULL/.. - * @bit_width: bit width to set for copp - * @app_type: App type used for this session - * @acdb_id: ACDB ID of this device - * - * Returns 0 on success or error on failure - */ -int adm_open(int port_id, int path, int rate, int channel_mode, int topology, - int perf_mode, uint16_t bit_width, int app_type, int acdb_id) -{ - struct adm_cmd_device_open_v5 open; - struct adm_cmd_device_open_v6 open_v6; - struct adm_cmd_device_open_v8 open_v8; - struct adm_device_endpoint_payload ep1_payload; - struct adm_device_endpoint_payload ep2_payload; - int ep1_payload_size = 0; - int ep2_payload_size = 0; - int ret = 0; - int port_idx, flags; - int copp_idx = -1; - int tmp_port = q6audio_get_port_id(port_id); - void *adm_params = NULL; - int param_size; - - pr_err("%s:port %#x path:%d rate:%d mode:%d perf_mode:%d,topo_id 0x%x bit_width %d app_type %d acdb_id %d\n", - __func__, port_id, path, rate, channel_mode, perf_mode, - topology, bit_width, app_type, acdb_id); - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - if (channel_mode < 0 || channel_mode > 32) { - pr_err("%s: Invalid channel number 0x%x\n", - __func__, channel_mode); - return -EINVAL; - } - - if (this_adm.apr == NULL) { - this_adm.apr = apr_register("ADSP", "ADM", adm_callback, - 0xFFFFFFFF, &this_adm); - if (this_adm.apr == NULL) { - pr_err("%s: Unable to register ADM\n", __func__); - return -ENODEV; - } - rtac_set_adm_handle(this_adm.apr); - } - - if (perf_mode == ULL_POST_PROCESSING_PCM_MODE) { - flags = ADM_ULL_POST_PROCESSING_DEVICE_SESSION; - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || - (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) - topology = DEFAULT_COPP_TOPOLOGY; - } else if (perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) { - flags = ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION; - topology = NULL_COPP_TOPOLOGY; - rate = ULL_SUPPORTED_SAMPLE_RATE; - bit_width = ULL_SUPPORTED_BITS_PER_SAMPLE; - } else if (perf_mode == LOW_LATENCY_PCM_MODE) { - flags = ADM_LOW_LATENCY_DEVICE_SESSION; - if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || - (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) - topology = DEFAULT_COPP_TOPOLOGY; - } else { - if ((path == ADM_PATH_COMPRESSED_RX) || - (path == ADM_PATH_COMPRESSED_TX)) - flags = 0; - else - flags = ADM_LEGACY_DEVICE_SESSION; - } - - if ((topology == VPM_TX_SM_ECNS_V2_COPP_TOPOLOGY) || - (topology == VPM_TX_DM_FLUENCE_EF_COPP_TOPOLOGY)) { - if ((rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_8K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_16K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_32K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_48K)) - rate = 16000; - } - if ((topology == VPM_TX_DM_FLUENCE_COPP_TOPOLOGY) || - (topology == VPM_TX_DM_RFECNS_COPP_TOPOLOGY)) { - if ((rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_8K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_16K) && - (rate != ADM_CMD_COPP_OPEN_SAMPLE_RATE_32K)) - rate = 16000; - } - - if (topology == FFECNS_TOPOLOGY) { - this_adm.ffecns_port_id = port_id; - pr_debug("%s: ffecns port id =%x\n", __func__, - this_adm.ffecns_port_id); - } - - if (topology == VPM_TX_VOICE_SMECNS_V2_COPP_TOPOLOGY || - topology == ADM_TOPOLOGY_ID_AUDIO_RX_FVSAM) { - pr_debug("%s: set channel_mode as 1 for topology=%d\n", __func__, topology); - channel_mode = 1; - } - - /* - * Routing driver reuses the same adm for streams with the same - * app_type, sample_rate etc. - * This isn't allowed for ULL streams as per the DSP interface - */ - if (perf_mode != ULTRA_LOW_LATENCY_PCM_MODE) - copp_idx = adm_get_idx_if_copp_exists(port_idx, topology, - perf_mode, - rate, bit_width, - app_type); - - if (copp_idx < 0) { - copp_idx = adm_get_next_available_copp(port_idx); - if (copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: exceeded copp id %d\n", - __func__, copp_idx); - return -EINVAL; - } - atomic_set(&this_adm.copp.cnt[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.topology[port_idx][copp_idx], - topology); - atomic_set(&this_adm.copp.mode[port_idx][copp_idx], - perf_mode); - atomic_set(&this_adm.copp.rate[port_idx][copp_idx], - rate); - atomic_set(&this_adm.copp.channels[port_idx][copp_idx], - channel_mode); - atomic_set(&this_adm.copp.bit_width[port_idx][copp_idx], - bit_width); - atomic_set(&this_adm.copp.app_type[port_idx][copp_idx], - app_type); - atomic_set(&this_adm.copp.acdb_id[port_idx][copp_idx], - acdb_id); - set_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp.adm_status[port_idx][copp_idx]); - if ((path != ADM_PATH_COMPRESSED_RX) && - (path != ADM_PATH_COMPRESSED_TX)) - send_adm_custom_topology(); - } - - if (this_adm.copp.adm_delay[port_idx][copp_idx] && - perf_mode == LEGACY_PCM_MODE) { - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], - 1); - this_adm.copp.adm_delay[port_idx][copp_idx] = 0; - wake_up(&this_adm.copp.adm_delay_wait[port_idx][copp_idx]); - } - - /* Create a COPP if port id are not enabled */ - if (atomic_read(&this_adm.copp.cnt[port_idx][copp_idx]) == 0) { - pr_debug("%s: open ADM: port_idx: %d, copp_idx: %d\n", __func__, - port_idx, copp_idx); - if ((topology == SRS_TRUMEDIA_TOPOLOGY_ID) && - perf_mode == LEGACY_PCM_MODE) { - int res; - - atomic_set(&this_adm.mem_map_index, ADM_SRS_TRUMEDIA); - msm_dts_srs_tm_ion_memmap(&this_adm.outband_memmap); - res = adm_memory_map_regions( - &this_adm.outband_memmap.paddr, 0, - (uint32_t *)&this_adm.outband_memmap.size, 1); - if (res < 0) { - pr_err("%s: SRS adm_memory_map_regions failed! addr = 0x%pK, size = %d\n", - __func__, - (void *)this_adm.outband_memmap.paddr, - (uint32_t)this_adm.outband_memmap.size); - } - } - - - if ((q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_ADM_V) >= - ADSP_ADM_API_VERSION_V3) && - q6core_use_Q6_32ch_support()) { - memset(&open_v8, 0, sizeof(open_v8)); - memset(&ep1_payload, 0, sizeof(ep1_payload)); - memset(&ep2_payload, 0, sizeof(ep2_payload)); - - open_v8.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - open_v8.hdr.src_svc = APR_SVC_ADM; - open_v8.hdr.src_domain = APR_DOMAIN_APPS; - open_v8.hdr.src_port = tmp_port; - open_v8.hdr.dest_svc = APR_SVC_ADM; - open_v8.hdr.dest_domain = APR_DOMAIN_ADSP; - open_v8.hdr.dest_port = tmp_port; - open_v8.hdr.token = port_idx << 16 | copp_idx; - open_v8.hdr.opcode = ADM_CMD_DEVICE_OPEN_V8; - - if (this_adm.native_mode != 0) { - open_v8.flags = flags | - (this_adm.native_mode << 11); - this_adm.native_mode = 0; - } else { - open_v8.flags = flags; - } - open_v8.mode_of_operation = path; - open_v8.endpoint_id_1 = tmp_port; - open_v8.endpoint_id_2 = 0xFFFF; - open_v8.endpoint_id_3 = 0xFFFF; - open_v8.topology_id = topology; - open_v8.reserved = 0; - - /* variable endpoint payload */ - ep1_payload.dev_num_channel = channel_mode & 0x00FF; - ep1_payload.bit_width = bit_width; - ep1_payload.sample_rate = rate; - ret = adm_arrange_mch_map_v8(&ep1_payload, path, - channel_mode, port_idx); - if (ret) - return ret; - - pr_debug("%s: port_id=0x%x %x %x topology_id=0x%X flags %x ref_ch %x\n", - __func__, open_v8.endpoint_id_1, - open_v8.endpoint_id_2, - open_v8.endpoint_id_3, - open_v8.topology_id, - open_v8.flags, - this_adm.num_ec_ref_rx_chans); - - ep1_payload_size = 8 + - roundup(ep1_payload.dev_num_channel, 4); - param_size = sizeof(struct adm_cmd_device_open_v8) - + ep1_payload_size; - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - - if ((this_adm.num_ec_ref_rx_chans != 0) - && (path != ADM_PATH_PLAYBACK) - && (open_v8.endpoint_id_2 != 0xFFFF)) { - open_v8.endpoint_id_2 = this_adm.ec_ref_rx; - this_adm.ec_ref_rx = -1; - ep2_payload.dev_num_channel = - this_adm.num_ec_ref_rx_chans; - this_adm.num_ec_ref_rx_chans = 0; - - if (this_adm.ec_ref_rx_bit_width != 0) { - ep2_payload.bit_width = - this_adm.ec_ref_rx_bit_width; - } else { - ep2_payload.bit_width = bit_width; - } - - if (this_adm.ec_ref_rx_sampling_rate != 0) { - ep2_payload.sample_rate = - this_adm.ec_ref_rx_sampling_rate; - } else { - ep2_payload.sample_rate = rate; - } - - pr_debug("%s: adm open_v8 eid2_channels=%d eid2_bit_width=%d eid2_rate=%d\n", - __func__, - ep2_payload.dev_num_channel, - ep2_payload.bit_width, - ep2_payload.sample_rate); - - ret = adm_arrange_mch_ep2_map_v8(&ep2_payload, - ep2_payload.dev_num_channel); - - if (ret) - return ret; - ep2_payload_size = 8 + - roundup(ep2_payload.dev_num_channel, 4); - param_size += ep2_payload_size; - } - - open_v8.hdr.pkt_size = param_size; - adm_params = kzalloc(param_size, GFP_KERNEL); - if (!adm_params) - return -ENOMEM; - memcpy(adm_params, &open_v8, sizeof(open_v8)); - memcpy(adm_params + sizeof(open_v8), - (void *)&ep1_payload, - ep1_payload_size); - - if ((this_adm.num_ec_ref_rx_chans != 0) - && (path != ADM_PATH_PLAYBACK) - && (open_v8.endpoint_id_2 != 0xFFFF)) { - memcpy(adm_params + sizeof(open_v8) - + ep1_payload_size, - (void *)&ep2_payload, - ep2_payload_size); - } - - ret = apr_send_pkt(this_adm.apr, - (uint32_t *)adm_params); - if (ret < 0) { - pr_err("%s: port_id: 0x%x for[0x%x] failed %d for open_v8\n", - __func__, tmp_port, port_id, ret); - return -EINVAL; - } - kfree(adm_params); - } else { - - open.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - open.hdr.pkt_size = sizeof(open); - open.hdr.src_svc = APR_SVC_ADM; - open.hdr.src_domain = APR_DOMAIN_APPS; - open.hdr.src_port = tmp_port; - open.hdr.dest_svc = APR_SVC_ADM; - open.hdr.dest_domain = APR_DOMAIN_ADSP; - open.hdr.dest_port = tmp_port; - open.hdr.token = port_idx << 16 | copp_idx; - open.hdr.opcode = ADM_CMD_DEVICE_OPEN_V5; - open.flags = flags; - open.mode_of_operation = path; - open.endpoint_id_1 = tmp_port; - open.endpoint_id_2 = 0xFFFF; - - if (this_adm.ec_ref_rx && (path != 1)) { - open.endpoint_id_2 = this_adm.ec_ref_rx; - } - - open.topology_id = topology; - - open.dev_num_channel = channel_mode & 0x00FF; - open.bit_width = bit_width; - WARN_ON((perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) && - (rate != ULL_SUPPORTED_SAMPLE_RATE)); - open.sample_rate = rate; - - ret = adm_arrange_mch_map(&open, path, channel_mode, - port_idx); - if (ret) - return ret; - - pr_debug("%s: port_id=0x%x rate=%d topology_id=0x%X\n", - __func__, open.endpoint_id_1, open.sample_rate, - open.topology_id); - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - - if ((this_adm.num_ec_ref_rx_chans != 0) && - (path != 1) && (open.endpoint_id_2 != 0xFFFF)) { - memset(&open_v6, 0, - sizeof(struct adm_cmd_device_open_v6)); - memcpy(&open_v6, &open, - sizeof(struct adm_cmd_device_open_v5)); - open_v6.hdr.opcode = ADM_CMD_DEVICE_OPEN_V6; - open_v6.hdr.pkt_size = sizeof(open_v6); - open_v6.dev_num_channel_eid2 = - this_adm.num_ec_ref_rx_chans; - - if (this_adm.ec_ref_rx_bit_width != 0) { - open_v6.bit_width_eid2 = - this_adm.ec_ref_rx_bit_width; - } else { - open_v6.bit_width_eid2 = bit_width; - } - - if (this_adm.ec_ref_rx_sampling_rate != 0) { - open_v6.sample_rate_eid2 = - this_adm.ec_ref_rx_sampling_rate; - } else { - open_v6.sample_rate_eid2 = rate; - } - - pr_debug("%s: eid2_channels=%d eid2_bit_width=%d eid2_rate=%d\n", - __func__, open_v6.dev_num_channel_eid2, - open_v6.bit_width_eid2, - open_v6.sample_rate_eid2); - - ret = adm_arrange_mch_ep2_map(&open_v6, - open_v6.dev_num_channel_eid2); - - if (ret) - return ret; - - ret = apr_send_pkt(this_adm.apr, - (uint32_t *)&open_v6); - } else { - ret = apr_send_pkt(this_adm.apr, - (uint32_t *)&open); - } - if (ret < 0) { - pr_err("%s: port_id: 0x%x for[0x%x] failed %d\n", - __func__, tmp_port, port_id, ret); - return -EINVAL; - } - } - - /* Wait for the callback with copp id */ - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: ADM open timedout for port_id: 0x%x for [0x%x]\n", - __func__, tmp_port, port_id); - return -EINVAL; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]))); - return adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - } - } - atomic_inc(&this_adm.copp.cnt[port_idx][copp_idx]); - return copp_idx; -} -EXPORT_SYMBOL(adm_open); - -/** - * adm_copp_mfc_cfg - - * command to send ADM MFC config - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @dst_sample_rate: sink sample rate - * - */ -void adm_copp_mfc_cfg(int port_id, int copp_idx, int dst_sample_rate) -{ - struct audproc_mfc_param_media_fmt mfc_cfg; - struct adm_cmd_device_open_v5 open; - struct param_hdr_v3 param_hdr; - int port_idx; - int rc = 0; - int i = 0; - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - goto fail_cmd; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - goto fail_cmd; - } - - memset(&mfc_cfg, 0, sizeof(mfc_cfg)); - memset(&open, 0, sizeof(open)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AUDPROC_MODULE_ID_MFC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT; - param_hdr.param_size = sizeof(mfc_cfg); - - mfc_cfg.sampling_rate = dst_sample_rate; - mfc_cfg.bits_per_sample = - atomic_read(&this_adm.copp.bit_width[port_idx][copp_idx]); - open.dev_num_channel = mfc_cfg.num_channels = - atomic_read(&this_adm.copp.channels[port_idx][copp_idx]); - - rc = adm_arrange_mch_map(&open, ADM_PATH_PLAYBACK, - mfc_cfg.num_channels, port_idx); - if (rc < 0) { - pr_err("%s: unable to get channal map\n", __func__); - goto fail_cmd; - } - - for (i = 0; i < mfc_cfg.num_channels; i++) - mfc_cfg.channel_type[i] = - (uint16_t) open.dev_channel_mapping[i]; - - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - - pr_debug("%s: mfc config: port_idx %d copp_idx %d copp SR %d copp BW %d copp chan %d o/p SR %d\n", - __func__, port_idx, copp_idx, - atomic_read(&this_adm.copp.rate[port_idx][copp_idx]), - mfc_cfg.bits_per_sample, mfc_cfg.num_channels, - mfc_cfg.sampling_rate); - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &mfc_cfg); - if (rc) - pr_err("%s: Failed to set media format configuration data, err %d\n", - __func__, rc); - -fail_cmd: - return; -} -EXPORT_SYMBOL(adm_copp_mfc_cfg); - -static void route_set_opcode_matrix_id( - struct adm_cmd_matrix_map_routings_v5 **route_addr, - int path, uint32_t passthr_mode) -{ - struct adm_cmd_matrix_map_routings_v5 *route = *route_addr; - - switch (path) { - case ADM_PATH_PLAYBACK: - route->hdr.opcode = ADM_CMD_MATRIX_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_AUDIO_RX; - break; - case ADM_PATH_LIVE_REC: - if (passthr_mode == LISTEN) { - route->hdr.opcode = - ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_LISTEN_TX; - break; - } - /* fall through to set matrix id for non-listen case */ - case ADM_PATH_NONLIVE_REC: - route->hdr.opcode = ADM_CMD_MATRIX_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_AUDIO_TX; - break; - case ADM_PATH_COMPRESSED_RX: - route->hdr.opcode = ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_COMPRESSED_AUDIO_RX; - break; - case ADM_PATH_COMPRESSED_TX: - route->hdr.opcode = ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5; - route->matrix_id = ADM_MATRIX_ID_COMPRESSED_AUDIO_TX; - break; - default: - pr_err("%s: Wrong path set[%d]\n", __func__, path); - break; - } - pr_debug("%s: opcode 0x%x, matrix id %d\n", - __func__, route->hdr.opcode, route->matrix_id); -} - -/** - * adm_matrix_map - - * command to send ADM matrix map for ADM copp list - * - * @path: direction or ADM path type - * @payload_map: have info of session id and associated copp_idx/num_copps - * @perf_mode: performance mode like LL/ULL/.. - * @passthr_mode: flag to indicate passthrough mode - * - * Returns 0 on success or error on failure - */ -int adm_matrix_map(int path, struct route_payload payload_map, int perf_mode, - uint32_t passthr_mode) -{ - struct adm_cmd_matrix_map_routings_v5 *route; - struct adm_session_map_node_v5 *node; - uint16_t *copps_list; - int cmd_size = 0; - int ret = 0, i = 0; - void *payload = NULL; - void *matrix_map = NULL; - int port_idx, copp_idx; - - /* Assumes port_ids have already been validated during adm_open */ - cmd_size = (sizeof(struct adm_cmd_matrix_map_routings_v5) + - sizeof(struct adm_session_map_node_v5) + - (sizeof(uint32_t) * payload_map.num_copps)); - matrix_map = kzalloc(cmd_size, GFP_KERNEL); - if (matrix_map == NULL) { - pr_err("%s: Mem alloc failed\n", __func__); - ret = -EINVAL; - return ret; - } - route = (struct adm_cmd_matrix_map_routings_v5 *)matrix_map; - - route->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - route->hdr.pkt_size = cmd_size; - route->hdr.src_svc = 0; - route->hdr.src_domain = APR_DOMAIN_APPS; - route->hdr.src_port = 0; /* Ignored */; - route->hdr.dest_svc = APR_SVC_ADM; - route->hdr.dest_domain = APR_DOMAIN_ADSP; - route->hdr.dest_port = 0; /* Ignored */; - route->hdr.token = 0; - route->num_sessions = 1; - route_set_opcode_matrix_id(&route, path, passthr_mode); - - payload = ((u8 *)matrix_map + - sizeof(struct adm_cmd_matrix_map_routings_v5)); - node = (struct adm_session_map_node_v5 *)payload; - - node->session_id = payload_map.session_id; - node->num_copps = payload_map.num_copps; - payload = (u8 *)node + sizeof(struct adm_session_map_node_v5); - copps_list = (uint16_t *)payload; - for (i = 0; i < payload_map.num_copps; i++) { - port_idx = - adm_validate_and_get_port_index(payload_map.port_id[i]); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, - payload_map.port_id[i]); - ret = -EINVAL; - goto fail_cmd; - } - copp_idx = payload_map.copp_idx[i]; - copps_list[i] = atomic_read(&this_adm.copp.id[port_idx] - [copp_idx]); - } - atomic_set(&this_adm.matrix_map_stat, -1); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *)matrix_map); - if (ret < 0) { - pr_err("%s: routing for syream %d failed ret %d\n", - __func__, payload_map.session_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - ret = wait_event_timeout(this_adm.matrix_map_wait, - atomic_read(&this_adm.matrix_map_stat) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: routing for syream %d failed\n", __func__, - payload_map.session_id); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.matrix_map_stat) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_adm.matrix_map_stat))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.matrix_map_stat)); - goto fail_cmd; - } - - if ((perf_mode != ULTRA_LOW_LATENCY_PCM_MODE) && - (path != ADM_PATH_COMPRESSED_RX)) { - for (i = 0; i < payload_map.num_copps; i++) { - port_idx = afe_get_port_index(payload_map.port_id[i]); - copp_idx = payload_map.copp_idx[i]; - if (port_idx < 0 || copp_idx < 0 || - (copp_idx > MAX_COPPS_PER_PORT - 1)) { - pr_err("%s: Invalid idx port_idx %d copp_idx %d\n", - __func__, port_idx, copp_idx); - continue; - } - rtac_add_adm_device(payload_map.port_id[i], - atomic_read(&this_adm.copp.id - [port_idx][copp_idx]), - get_cal_path(path), - payload_map.session_id, - payload_map.app_type[i], - payload_map.acdb_dev_id[i]); - - if (!test_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp.adm_status[port_idx] - [copp_idx])) { - pr_debug("%s: adm copp[0x%x][%d] already sent", - __func__, port_idx, copp_idx); - continue; - } - send_adm_cal(payload_map.port_id[i], copp_idx, - get_cal_path(path), perf_mode, - payload_map.app_type[i], - payload_map.acdb_dev_id[i], - payload_map.sample_rate[i], - passthr_mode); - /* ADM COPP calibration is already sent */ - clear_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp. - adm_status[port_idx][copp_idx]); - pr_debug("%s: copp_id: %d\n", __func__, - atomic_read(&this_adm.copp.id[port_idx] - [copp_idx])); - } - } - -fail_cmd: - kfree(matrix_map); - return ret; -} -EXPORT_SYMBOL(adm_matrix_map); - -/** - * adm_ec_ref_rx_id - - * Update EC ref port ID - * - */ -void adm_ec_ref_rx_id(int port_id) -{ - this_adm.ec_ref_rx = port_id; - pr_debug("%s: ec_ref_rx:%d\n", __func__, this_adm.ec_ref_rx); -} -EXPORT_SYMBOL(adm_ec_ref_rx_id); - -/** - * adm_num_ec_ref_rx_chans - - * Update EC ref number of channels - * - */ -void adm_num_ec_ref_rx_chans(int num_chans) -{ - this_adm.num_ec_ref_rx_chans = num_chans; - pr_debug("%s: num_ec_ref_rx_chans:%d\n", - __func__, this_adm.num_ec_ref_rx_chans); -} -EXPORT_SYMBOL(adm_num_ec_ref_rx_chans); - -/** - * adm_ec_ref_rx_bit_width - - * Update EC ref bit_width - * - */ -void adm_ec_ref_rx_bit_width(int bit_width) -{ - this_adm.ec_ref_rx_bit_width = bit_width; - pr_debug("%s: ec_ref_rx_bit_width:%d\n", - __func__, this_adm.ec_ref_rx_bit_width); -} -EXPORT_SYMBOL(adm_ec_ref_rx_bit_width); - -/** - * adm_ec_ref_rx_sampling_rate - - * Update EC ref sample rate - * - */ -void adm_ec_ref_rx_sampling_rate(int sampling_rate) -{ - this_adm.ec_ref_rx_sampling_rate = sampling_rate; - pr_debug("%s: ec_ref_rx_sampling_rate:%d\n", - __func__, this_adm.ec_ref_rx_sampling_rate); -} -EXPORT_SYMBOL(adm_ec_ref_rx_sampling_rate); - -/** - * adm_set_native_mode - - * Set adm channel native mode. - * If enabled matrix mixer will be - * running in native mode for channel - * configuration for this device session. - * - */ -void adm_set_native_mode(int mode) -{ - this_adm.native_mode = mode; - pr_debug("%s: enable native_mode :%d\n", - __func__, this_adm.native_mode); -} -EXPORT_SYMBOL(adm_set_native_mode); - -/** - * adm_close - - * command to close ADM copp - * - * @port_id: Port ID number - * @perf_mode: performance mode like LL/ULL/.. - * @copp_idx: copp index assigned - * - * Returns 0 on success or error on failure - */ -int adm_close(int port_id, int perf_mode, int copp_idx) -{ - struct apr_hdr close; - - int ret = 0, port_idx; - int copp_id = RESET_COPP_ID; - - pr_debug("%s: port_id=0x%x perf_mode: %d copp_idx: %d\n", __func__, - port_id, perf_mode, copp_idx); - - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", - __func__, port_id); - return -EINVAL; - } - - if ((copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s: Invalid copp idx: %d\n", __func__, copp_idx); - return -EINVAL; - } - - port_channel_map[port_idx].set_channel_map = false; - if (this_adm.copp.adm_delay[port_idx][copp_idx] && perf_mode - == LEGACY_PCM_MODE) { - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], - 1); - this_adm.copp.adm_delay[port_idx][copp_idx] = 0; - wake_up(&this_adm.copp.adm_delay_wait[port_idx][copp_idx]); - } - - atomic_dec(&this_adm.copp.cnt[port_idx][copp_idx]); - if (!(atomic_read(&this_adm.copp.cnt[port_idx][copp_idx]))) { - copp_id = adm_get_copp_id(port_idx, copp_idx); - pr_debug("%s: Closing ADM port_idx:%d copp_idx:%d copp_id:0x%x\n", - __func__, port_idx, copp_idx, copp_id); - if ((!perf_mode) && (this_adm.outband_memmap.paddr != 0) && - (atomic_read(&this_adm.copp.topology[port_idx][copp_idx]) == - SRS_TRUMEDIA_TOPOLOGY_ID)) { - atomic_set(&this_adm.mem_map_index, - ADM_SRS_TRUMEDIA); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: adm mem unmmap err %d", - __func__, ret); - } else { - atomic_set(&this_adm.mem_map_handles - [ADM_SRS_TRUMEDIA], 0); - } - } - - - if ((afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) && - this_adm.sourceTrackingData.memmap.paddr) { - atomic_set(&this_adm.mem_map_index, - ADM_MEM_MAP_INDEX_SOURCE_TRACKING); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: adm mem unmmap err %d", - __func__, ret); - } - msm_audio_ion_free( - this_adm.sourceTrackingData.dma_buf); - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - atomic_set(&this_adm.mem_map_handles[ - ADM_MEM_MAP_INDEX_SOURCE_TRACKING], 0); - } - - close.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - close.pkt_size = sizeof(close); - close.src_svc = APR_SVC_ADM; - close.src_domain = APR_DOMAIN_APPS; - close.src_port = port_id; - close.dest_svc = APR_SVC_ADM; - close.dest_domain = APR_DOMAIN_ADSP; - close.dest_port = copp_id; - close.token = port_idx << 16 | copp_idx; - close.opcode = ADM_CMD_DEVICE_CLOSE_V5; - - atomic_set(&this_adm.copp.id[port_idx][copp_idx], - RESET_COPP_ID); - atomic_set(&this_adm.copp.cnt[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.topology[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.mode[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - atomic_set(&this_adm.copp.rate[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.channels[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.bit_width[port_idx][copp_idx], 0); - atomic_set(&this_adm.copp.app_type[port_idx][copp_idx], 0); - - clear_bit(ADM_STATUS_CALIBRATION_REQUIRED, - (void *)&this_adm.copp.adm_status[port_idx][copp_idx]); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&close); - if (ret < 0) { - pr_err("%s: ADM close failed %d\n", __func__, ret); - return -EINVAL; - } - - ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: ADM cmd Route timedout for port 0x%x\n", - __func__, port_id); - return -EINVAL; - } else if (atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx]))); - return adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [port_idx][copp_idx])); - } - } - - if (perf_mode != ULTRA_LOW_LATENCY_PCM_MODE) { - pr_debug("%s: remove adm device from rtac\n", __func__); - rtac_remove_adm_device(port_id, copp_id); - } - - if (port_id == this_adm.ffecns_port_id) - this_adm.ffecns_port_id = -1; - - return 0; -} -EXPORT_SYMBOL(adm_close); - -int send_rtac_audvol_cal(void) -{ - int ret = 0; - int ret2 = 0; - int i = 0; - int copp_idx, port_idx, acdb_id, app_id, path; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_audvol *audvol_cal_info = NULL; - struct rtac_adm rtac_adm_data; - - mutex_lock(&this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]->lock); - - cal_block = cal_utils_get_only_cal_block( - this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s: can't find cal block!\n", __func__); - goto unlock; - } - - audvol_cal_info = cal_block->cal_info; - if (audvol_cal_info == NULL) { - pr_err("%s: audvol_cal_info is NULL!\n", __func__); - goto unlock; - } - - get_rtac_adm_data(&rtac_adm_data); - for (; i < rtac_adm_data.num_of_dev; i++) { - - acdb_id = rtac_adm_data.device[i].acdb_dev_id; - if (acdb_id == 0) - acdb_id = audvol_cal_info->acdb_id; - - app_id = rtac_adm_data.device[i].app_type; - if (app_id == 0) - app_id = audvol_cal_info->app_type; - - path = afe_get_port_type(rtac_adm_data.device[i].afe_port); - if ((acdb_id == audvol_cal_info->acdb_id) && - (app_id == audvol_cal_info->app_type) && - (path == audvol_cal_info->path)) { - - if (adm_get_indexes_from_copp_id(rtac_adm_data. - device[i].copp, &copp_idx, &port_idx) != 0) { - pr_debug("%s: Copp Id %d is not active\n", - __func__, - rtac_adm_data.device[i].copp); - continue; - } - - ret2 = adm_remap_and_send_cal_block(ADM_RTAC_AUDVOL_CAL, - rtac_adm_data.device[i].afe_port, - copp_idx, cal_block, - atomic_read(&this_adm.copp. - mode[port_idx][copp_idx]), - audvol_cal_info->app_type, - audvol_cal_info->acdb_id, - atomic_read(&this_adm.copp. - rate[port_idx][copp_idx])); - if (ret2 < 0) { - pr_debug("%s: remap and send failed for copp Id %d, acdb id %d, app type %d, path %d\n", - __func__, rtac_adm_data.device[i].copp, - audvol_cal_info->acdb_id, - audvol_cal_info->app_type, - audvol_cal_info->path); - ret = ret2; - } - } - } -unlock: - mutex_unlock(&this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]->lock); - return ret; -} - -int adm_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - result = -EINVAL; - goto done; - } - - /* valid port ID needed for callback use primary I2S */ - atomic_set(&this_adm.mem_map_index, ADM_RTAC_APR_CAL); - result = adm_memory_map_regions(&cal_block->cal_data.paddr, 0, - &cal_block->map_data.map_size, 1); - if (result < 0) { - pr_err("%s: RTAC mmap did not work! size = %d result %d\n", - __func__, - cal_block->map_data.map_size, result); - pr_debug("%s: RTAC mmap did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - - cal_block->map_data.map_handle = atomic_read( - &this_adm.mem_map_handles[ADM_RTAC_APR_CAL]); -done: - return result; -} - -int adm_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (mem_map_handle == NULL) { - pr_debug("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle != atomic_read( - &this_adm.mem_map_handles[ADM_RTAC_APR_CAL])) { - pr_err("%s: Map handles do not match! Unmapping RTAC, RTAC map 0x%x, ADM map 0x%x\n", - __func__, *mem_map_handle, atomic_read( - &this_adm.mem_map_handles[ADM_RTAC_APR_CAL])); - - /* if mismatch use handle passed in to unmap */ - atomic_set(&this_adm.mem_map_handles[ADM_RTAC_APR_CAL], - *mem_map_handle); - } - - /* valid port ID needed for callback use primary I2S */ - atomic_set(&this_adm.mem_map_index, ADM_RTAC_APR_CAL); - result = adm_memory_unmap_regions(); - if (result < 0) { - pr_debug("%s: adm_memory_unmap_regions failed, error %d\n", - __func__, result); - } else { - atomic_set(&this_adm.mem_map_handles[ADM_RTAC_APR_CAL], 0); - *mem_map_handle = 0; - } -done: - return result; -} - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case ADM_AUDPROC_CAL_TYPE: - ret = ADM_AUDPROC_CAL; - break; - case ADM_LSM_AUDPROC_CAL_TYPE: - ret = ADM_LSM_AUDPROC_CAL; - break; - case ADM_AUDVOL_CAL_TYPE: - ret = ADM_AUDVOL_CAL; - break; - case ADM_CUST_TOPOLOGY_CAL_TYPE: - ret = ADM_CUSTOM_TOP_CAL; - break; - case ADM_RTAC_INFO_CAL_TYPE: - ret = ADM_RTAC_INFO_CAL; - break; - case ADM_RTAC_APR_CAL_TYPE: - ret = ADM_RTAC_APR_CAL; - break; - case ADM_RTAC_AUDVOL_CAL_TYPE: - ret = ADM_RTAC_AUDVOL_CAL; - break; - case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: - ret = ADM_LSM_AUDPROC_PERSISTENT_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int adm_alloc_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - this_adm.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int adm_dealloc_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - this_adm.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int adm_set_cal(int32_t cal_type, size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - this_adm.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == ADM_CUSTOM_TOP_CAL) { - mutex_lock(&this_adm.cal_data[ADM_CUSTOM_TOP_CAL]->lock); - this_adm.set_custom_topology = 1; - mutex_unlock(&this_adm.cal_data[ADM_CUSTOM_TOP_CAL]->lock); - } else if (cal_index == ADM_RTAC_AUDVOL_CAL) { - send_rtac_audvol_cal(); - } -done: - return ret; -} - -static int adm_map_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - atomic_set(&this_adm.mem_map_index, cal_index); - ret = adm_memory_map_regions(&cal_block->cal_data.paddr, 0, - (uint32_t *)&cal_block->map_data.map_size, 1); - if (ret < 0) { - pr_err("%s: map did not work! cal_type %i ret %d\n", - __func__, cal_index, ret); - ret = -ENODEV; - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_adm. - mem_map_handles[cal_index]); -done: - return ret; -} - -static int adm_unmap_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", - __func__); - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_err("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - atomic_set(&this_adm.mem_map_handles[cal_index], - cal_block->map_data.q6map_handle); - atomic_set(&this_adm.mem_map_index, cal_index); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: unmap did not work! cal_type %i ret %d\n", - __func__, cal_index, ret); - ret = -ENODEV; - goto done; - } - cal_block->map_data.q6map_handle = 0; -done: - return ret; -} - -static void adm_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(ADM_MAX_CAL_TYPES, this_adm.cal_data); -} - -static int adm_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{ADM_CUST_TOPOLOGY_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_AUDPROC_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_LSM_AUDPROC_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_AUDVOL_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_RTAC_INFO_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ADM_RTAC_APR_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{SRS_TRUMEDIA_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ADM_RTAC_AUDVOL_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, - {adm_alloc_cal, adm_dealloc_cal, NULL, - adm_set_cal, NULL, NULL} }, - {adm_map_cal_data, adm_unmap_cal_data, - cal_utils_match_buf_num} }, - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(ADM_MAX_CAL_TYPES, this_adm.cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type! ret %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - return ret; -err: - adm_delete_cal_data(); - return ret; -} - -/** - * adm_set_volume - - * command to set volume on ADM copp - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @volume: gain value to set - * - * Returns 0 on success or error on failure - */ -int adm_set_volume(int port_id, int copp_idx, int volume) -{ - struct audproc_volume_ctrl_master_gain audproc_vol; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s: port_id %d, volume %d\n", __func__, port_id, volume); - - memset(&audproc_vol, 0, sizeof(audproc_vol)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOL_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_VOL_CTRL_MASTER_GAIN; - param_hdr.param_size = sizeof(audproc_vol); - - audproc_vol.master_gain = volume; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &audproc_vol); - if (rc) - pr_err("%s: Failed to set volume, err %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_volume); - -/** - * adm_set_softvolume - - * command to set softvolume - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @softvol_param: Params to set for softvolume - * - * Returns 0 on success or error on failure - */ -int adm_set_softvolume(int port_id, int copp_idx, - struct audproc_softvolume_params *softvol_param) -{ - struct audproc_soft_step_volume_params audproc_softvol; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s: period %d step %d curve %d\n", __func__, - softvol_param->period, softvol_param->step, - softvol_param->rampingcurve); - - memset(&audproc_softvol, 0, sizeof(audproc_softvol)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOL_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS; - param_hdr.param_size = sizeof(audproc_softvol); - - audproc_softvol.period = softvol_param->period; - audproc_softvol.step = softvol_param->step; - audproc_softvol.ramping_curve = softvol_param->rampingcurve; - - pr_debug("%s: period %d, step %d, curve %d\n", __func__, - audproc_softvol.period, audproc_softvol.step, - audproc_softvol.ramping_curve); - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &audproc_softvol); - if (rc) - pr_err("%s: Failed to set soft volume, err %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_softvolume); - -/** - * adm_set_mic_gain - - * command to set MIC gain - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @volume: gain value to set - * - * Returns 0 on success or error on failure - */ -int adm_set_mic_gain(int port_id, int copp_idx, int volume) -{ - struct admx_mic_gain mic_gain_params; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s: Setting mic gain to %d at port_id 0x%x\n", __func__, - volume, port_id); - - memset(&mic_gain_params, 0, sizeof(mic_gain_params)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = ADM_MODULE_IDX_MIC_GAIN_CTRL; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = ADM_PARAM_IDX_MIC_GAIN; - param_hdr.param_size = sizeof(mic_gain_params); - - mic_gain_params.tx_mic_gain = volume; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &mic_gain_params); - if (rc) - pr_err("%s: Failed to set mic gain, err %d\n", __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_mic_gain); - -/** - * adm_send_set_multichannel_ec_primary_mic_ch - - * command to set multi-ch EC primary mic - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @primary_mic_ch: channel number of primary mic - * - * Returns 0 on success or error on failure - */ -int adm_send_set_multichannel_ec_primary_mic_ch(int port_id, int copp_idx, - int primary_mic_ch) -{ - struct admx_sec_primary_mic_ch sec_primary_ch_params; - struct param_hdr_v3 param_hdr; - int rc = 0; - - pr_debug("%s port_id 0x%x, copp_idx 0x%x, primary_mic_ch %d\n", - __func__, port_id, copp_idx, primary_mic_ch); - - memset(&sec_primary_ch_params, 0, sizeof(sec_primary_ch_params)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_VOICE_TX_SECNS; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_IDX_SEC_PRIMARY_MIC_CH; - param_hdr.param_size = sizeof(sec_primary_ch_params); - - sec_primary_ch_params.version = 0; - sec_primary_ch_params.sec_primary_mic_ch = primary_mic_ch; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &sec_primary_ch_params); - if (rc) - pr_err("%s: Failed to set primary mic chanel, err %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_send_set_multichannel_ec_primary_mic_ch); - -/** - * adm_set_ffecns_effect - - * command to set effect for ffecns module - * - * @effect: effect payload - * - * Returns 0 on success or error on failure - */ -int adm_set_ffecns_effect(int effect) -{ - struct ffecns_effect ffecns_params; - struct param_hdr_v3 param_hdr; - int rc = 0; - int copp_idx = 0; - - copp_idx = adm_get_default_copp_idx(this_adm.ffecns_port_id); - if ((copp_idx < 0) || (copp_idx >= MAX_COPPS_PER_PORT)) { - pr_err("%s, no active copp to query rms copp_idx:%d\n", - __func__, copp_idx); - return -EINVAL; - } - - memset(&ffecns_params, 0, sizeof(ffecns_params)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = FFECNS_MODULE_ID; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = FLUENCE_CMN_GLOBAL_EFFECT_PARAM_ID; - param_hdr.param_size = sizeof(ffecns_params); - - ffecns_params.payload = effect; - - rc = adm_pack_and_set_one_pp_param(this_adm.ffecns_port_id, copp_idx, - param_hdr, (uint8_t *) &ffecns_params); - if (rc) - pr_err("%s: Failed to set ffecns effect, err %d\n", - __func__, rc); - - return rc; -} -EXPORT_SYMBOL(adm_set_ffecns_effect); - -/** - * adm_param_enable - - * command to send params to ADM for given module - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @module_id: ADM module - * @enable: flag to enable or disable module - * - * Returns 0 on success or error on failure - */ -int adm_param_enable(int port_id, int copp_idx, int module_id, int enable) -{ - struct module_instance_info mod_inst_info; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - mod_inst_info.module_id = module_id; - mod_inst_info.instance_id = INSTANCE_ID_0; - - return adm_param_enable_v2(port_id, copp_idx, mod_inst_info, enable); -} -EXPORT_SYMBOL(adm_param_enable); - -/** - * adm_param_enable_v2 - - * command to send params to ADM for given module - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @mod_inst_info: module and instance ID info - * @enable: flag to enable or disable module - * - * Returns 0 on success or error on failure - */ -int adm_param_enable_v2(int port_id, int copp_idx, - struct module_instance_info mod_inst_info, int enable) -{ - uint32_t enable_param; - struct param_hdr_v3 param_hdr; - int rc = 0; - - if (enable < 0 || enable > 1) { - pr_err("%s: Invalid value for enable %d\n", __func__, enable); - return -EINVAL; - } - - pr_debug("%s port_id %d, module_id 0x%x, instance_id 0x%x, enable %d\n", - __func__, port_id, mod_inst_info.module_id, - mod_inst_info.instance_id, enable); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = mod_inst_info.module_id; - param_hdr.instance_id = mod_inst_info.instance_id; - param_hdr.param_id = AUDPROC_PARAM_ID_ENABLE; - param_hdr.param_size = sizeof(enable_param); - - enable_param = enable; - - rc = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &enable_param); - if (rc) - pr_err("%s: Failed to set enable of module(%d) instance(%d) to %d, err %d\n", - __func__, mod_inst_info.module_id, - mod_inst_info.instance_id, enable, rc); - - return rc; - -} -EXPORT_SYMBOL(adm_param_enable_v2); - -/** - * adm_send_calibration - - * send ADM calibration to DSP - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @path: direction or ADM path type - * @perf_mode: performance mode like LL/ULL/.. - * @cal_type: calibration type to use - * @params: pointer with cal data - * @size: cal size - * - * Returns 0 on success or error on failure - */ -int adm_send_calibration(int port_id, int copp_idx, int path, int perf_mode, - int cal_type, char *params, int size) -{ - - int rc = 0; - - pr_debug("%s:port_id %d, path %d, perf_mode %d, cal_type %d, size %d\n", - __func__, port_id, path, perf_mode, cal_type, size); - - /* Maps audio_dev_ctrl path definition to ACDB definition */ - if (get_cal_path(path) != RX_DEVICE) { - pr_err("%s: acdb_path %d\n", __func__, path); - rc = -EINVAL; - goto end; - } - - rc = adm_set_pp_params(port_id, copp_idx, NULL, (u8 *) params, size); - -end: - return rc; -} -EXPORT_SYMBOL(adm_send_calibration); - -/* - * adm_update_wait_parameters must be called with routing driver locks. - * adm_reset_wait_parameters must be called with routing driver locks. - * set and reset parmeters are separated to make sure it is always called - * under routing driver lock. - * adm_wait_timeout is to block until timeout or interrupted. Timeout is - * not a an error. - */ -int adm_set_wait_parameters(int port_id, int copp_idx) -{ - - int ret = 0, port_idx; - - pr_debug("%s: port_id 0x%x, copp_idx %d\n", __func__, port_id, - copp_idx); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - this_adm.copp.adm_delay[port_idx][copp_idx] = 1; - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], 0); - -end: - return ret; - -} -EXPORT_SYMBOL(adm_set_wait_parameters); - -/** - * adm_reset_wait_parameters - - * reset wait parameters or ADM delay value - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * - * Returns 0 on success or error on failure - */ -int adm_reset_wait_parameters(int port_id, int copp_idx) -{ - int ret = 0, port_idx; - - pr_debug("%s: port_id 0x%x copp_idx %d\n", __func__, port_id, - copp_idx); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx], 1); - this_adm.copp.adm_delay[port_idx][copp_idx] = 0; - -end: - return ret; -} -EXPORT_SYMBOL(adm_reset_wait_parameters); - -/** - * adm_wait_timeout - - * ADM wait command after command send to DSP - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @wait_time: value in ms for command timeout - * - * Returns 0 on success or error on failure - */ -int adm_wait_timeout(int port_id, int copp_idx, int wait_time) -{ - int ret = 0, port_idx; - - pr_debug("%s: port_id 0x%x, copp_idx %d, wait_time %d\n", __func__, - port_id, copp_idx, wait_time); - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - ret = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - ret = wait_event_timeout( - this_adm.copp.adm_delay_wait[port_idx][copp_idx], - atomic_read(&this_adm.copp.adm_delay_stat[port_idx][copp_idx]), - msecs_to_jiffies(wait_time)); - pr_debug("%s: return %d\n", __func__, ret); - if (ret != 0) - ret = -EINTR; -end: - pr_debug("%s: return %d--\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(adm_wait_timeout); - -/** - * adm_store_cal_data - - * Retrieve calibration data for ADM copp device - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @path: direction or copp type - * @perf_mode: performance mode like LL/ULL/.. - * @cal_index: calibration index to use - * @params: pointer to store cal data - * @size: pointer to fill with cal size - * - * Returns 0 on success or error on failure - */ -int adm_store_cal_data(int port_id, int copp_idx, int path, int perf_mode, - int cal_index, char *params, int *size) -{ - int rc = 0; - struct cal_block_data *cal_block = NULL; - int app_type, acdb_id, port_idx, sample_rate; - - if (this_adm.cal_data[cal_index] == NULL) { - pr_debug("%s: cal_index %d not allocated!\n", - __func__, cal_index); - goto end; - } - - if (get_cal_path(path) != RX_DEVICE) { - pr_debug("%s: Invalid path to store calibration %d\n", - __func__, path); - rc = -EINVAL; - goto end; - } - - port_id = afe_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - rc = -EINVAL; - goto end; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_num: %d\n", __func__, copp_idx); - return -EINVAL; - } - - acdb_id = atomic_read(&this_adm.copp.acdb_id[port_idx][copp_idx]); - app_type = atomic_read(&this_adm.copp.app_type[port_idx][copp_idx]); - sample_rate = atomic_read(&this_adm.copp.rate[port_idx][copp_idx]); - - mutex_lock(&this_adm.cal_data[cal_index]->lock); - cal_block = adm_find_cal(cal_index, get_cal_path(path), app_type, - acdb_id, sample_rate); - if (cal_block == NULL) - goto unlock; - - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: No ADM cal send for port_id = 0x%x!\n", - __func__, port_id); - rc = -EINVAL; - goto unlock; - } - - if (cal_index == ADM_AUDPROC_CAL || cal_index == ADM_LSM_AUDPROC_CAL) { - if (cal_block->cal_data.size > AUD_PROC_BLOCK_SIZE) { - pr_err("%s:audproc:invalid size exp/actual[%zd, %d]\n", - __func__, cal_block->cal_data.size, *size); - rc = -ENOMEM; - goto unlock; - } - } else if (cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { - if (cal_block->cal_data.size > AUD_PROC_PERSIST_BLOCK_SIZE) { - pr_err("%s:persist invalid size exp/actual[%zd, %d]\n", - __func__, cal_block->cal_data.size, *size); - rc = -ENOMEM; - goto unlock; - } - } else if (cal_index == ADM_AUDVOL_CAL) { - if (cal_block->cal_data.size > AUD_VOL_BLOCK_SIZE) { - pr_err("%s:aud_vol:invalid size exp/actual[%zd, %d]\n", - __func__, cal_block->cal_data.size, *size); - rc = -ENOMEM; - goto unlock; - } - } else { - pr_debug("%s: Not valid calibration for dolby topolgy\n", - __func__); - rc = -EINVAL; - goto unlock; - } - memcpy(params, cal_block->cal_data.kvaddr, cal_block->cal_data.size); - *size = cal_block->cal_data.size; - - pr_debug("%s:port_id %d, copp_idx %d, path %d", - __func__, port_id, copp_idx, path); - pr_debug("perf_mode %d, cal_type %d, size %d\n", - perf_mode, cal_index, *size); - -unlock: - mutex_unlock(&this_adm.cal_data[cal_index]->lock); -end: - return rc; -} -EXPORT_SYMBOL(adm_store_cal_data); - -/** - * adm_send_compressed_device_mute - - * command to send mute for compressed device - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @mute_on: flag to indicate mute or unmute - * - * Returns 0 on success or error on failure - */ -int adm_send_compressed_device_mute(int port_id, int copp_idx, bool mute_on) -{ - u32 mute_param = mute_on ? 1 : 0; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s port_id: 0x%x, copp_idx %d, mute_on: %d\n", - __func__, port_id, copp_idx, mute_on); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_COMPRESSED_MUTE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_COMPRESSED_MUTE; - param_hdr.param_size = sizeof(mute_param); - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &mute_param); - if (ret) - pr_err("%s: Failed to set mute, err %d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_send_compressed_device_mute); - -/** - * adm_send_compressed_device_latency - - * command to send latency for compressed device - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @latency: latency value to pass - * - * Returns 0 on success or error on failure - */ -int adm_send_compressed_device_latency(int port_id, int copp_idx, int latency) -{ - u32 latency_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s port_id: 0x%x, copp_idx %d latency: %d\n", __func__, - port_id, copp_idx, latency); - - if (latency < 0) { - pr_err("%s: Invalid value for latency %d", __func__, latency); - return -EINVAL; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AUDPROC_MODULE_ID_COMPRESSED_LATENCY; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_COMPRESSED_LATENCY; - param_hdr.param_size = sizeof(latency_param); - - latency_param = latency; - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &latency_param); - if (ret) - pr_err("%s: Failed to set latency, err %d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_send_compressed_device_latency); - -/** - * adm_swap_speaker_channels - * - * Receives port_id, copp_idx, sample rate, spk_swap and - * send MFC command to swap speaker channel. - * Return zero on success. On failure returns nonzero. - * - * port_id - Passed value, port_id for which channels swap is wanted - * copp_idx - Passed value, copp_idx for which channels swap is wanted - * sample_rate - Passed value, sample rate used by app type config - * spk_swap - Passed value, spk_swap for check if swap flag is set - */ -int adm_swap_speaker_channels(int port_id, int copp_idx, - int sample_rate, bool spk_swap) -{ - struct audproc_mfc_param_media_fmt mfc_cfg; - struct param_hdr_v3 param_hdr; - uint16_t num_channels; - int port_idx = 0; - int ret = 0; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - port_id = q6audio_convert_virtual_to_portid(port_id); - port_idx = adm_validate_and_get_port_index(port_id); - if (port_idx < 0 || port_idx >= AFE_MAX_PORTS) { - pr_err("%s: Invalid port_id %#x\n", __func__, port_id); - return -EINVAL; - } else if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("%s: Invalid copp_idx 0x%x\n", __func__, copp_idx); - return -EINVAL; - } - - num_channels = atomic_read(&this_adm.copp.channels[port_idx][copp_idx]); - if (num_channels != 2) { - pr_debug("%s: Invalid number of channels: %d\n", - __func__, num_channels); - return -EINVAL; - } - - memset(&mfc_cfg, 0, sizeof(mfc_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AUDPROC_MODULE_ID_MFC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT; - param_hdr.param_size = sizeof(mfc_cfg); - - mfc_cfg.sampling_rate = sample_rate; - mfc_cfg.bits_per_sample = - atomic_read(&this_adm.copp.bit_width[port_idx][copp_idx]); - mfc_cfg.num_channels = num_channels; - - /* Currently applying speaker swap for only 2 channel use case */ - if (spk_swap) { - mfc_cfg.channel_type[0] = - (uint16_t) PCM_CHANNEL_FR; - mfc_cfg.channel_type[1] = - (uint16_t) PCM_CHANNEL_FL; - } else { - mfc_cfg.channel_type[0] = - (uint16_t) PCM_CHANNEL_FL; - mfc_cfg.channel_type[1] = - (uint16_t) PCM_CHANNEL_FR; - } - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (u8 *) &mfc_cfg); - if (ret < 0) { - pr_err("%s: Failed to set swap speaker channels on port[0x%x] failed %d\n", - __func__, port_id, ret); - return ret; - } - - pr_debug("%s: mfc_cfg Set params returned success", __func__); - return 0; -} -EXPORT_SYMBOL(adm_swap_speaker_channels); - -/** - * adm_set_sound_focus - - * Update sound focus info - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @soundFocusData: sound focus data to pass - * - * Returns 0 on success or error on failure - */ -int adm_set_sound_focus(int port_id, int copp_idx, - struct sound_focus_param soundFocusData) -{ - struct adm_param_fluence_soundfocus_t soundfocus_params; - struct param_hdr_v3 param_hdr; - int ret = 0; - int i; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = VOICEPROC_PARAM_ID_FLUENCE_SOUNDFOCUS; - param_hdr.param_size = sizeof(soundfocus_params); - - memset(&(soundfocus_params), 0xFF, sizeof(soundfocus_params)); - for (i = 0; i < MAX_SECTORS; i++) { - soundfocus_params.start_angles[i] = - soundFocusData.start_angle[i]; - soundfocus_params.enables[i] = soundFocusData.enable[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData.start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData.enable[i]); - } - soundfocus_params.gain_step = soundFocusData.gain_step; - pr_debug("%s: gain_step = %d\n", __func__, soundFocusData.gain_step); - - soundfocus_params.reserved = 0; - - ret = adm_pack_and_set_one_pp_param(port_id, copp_idx, param_hdr, - (uint8_t *) &soundfocus_params); - if (ret) - pr_err("%s: Failed to set sound focus params, err %d\n", - __func__, ret); - - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_set_sound_focus); - -/** - * adm_get_sound_focus - - * Retrieve sound focus info - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @soundFocusData: pointer for sound focus data to be updated with - * - * Returns 0 on success or error on failure - */ -int adm_get_sound_focus(int port_id, int copp_idx, - struct sound_focus_param *soundFocusData) -{ - int ret = 0, i; - char *params_value; - uint32_t max_param_size = 0; - struct adm_param_fluence_soundfocus_t *soundfocus_params = NULL; - struct param_hdr_v3 param_hdr; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - - max_param_size = sizeof(struct adm_param_fluence_soundfocus_t) + - sizeof(union param_hdrs); - params_value = kzalloc(max_param_size, GFP_KERNEL); - if (!params_value) - return -ENOMEM; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = VOICEPROC_PARAM_ID_FLUENCE_SOUNDFOCUS; - param_hdr.param_size = max_param_size; - ret = adm_get_pp_params(port_id, copp_idx, - ADM_CLIENT_ID_SOURCE_TRACKING, NULL, ¶m_hdr, - params_value); - if (ret) { - pr_err("%s: get parameters failed ret:%d\n", __func__, ret); - ret = -EINVAL; - goto done; - } - - if (this_adm.sourceTrackingData.apr_cmd_status != 0) { - pr_err("%s - get params returned error [%s]\n", - __func__, adsp_err_get_err_str( - this_adm.sourceTrackingData.apr_cmd_status)); - ret = adsp_err_get_lnx_err_code( - this_adm.sourceTrackingData.apr_cmd_status); - goto done; - } - - soundfocus_params = (struct adm_param_fluence_soundfocus_t *) - params_value; - for (i = 0; i < MAX_SECTORS; i++) { - soundFocusData->start_angle[i] = - soundfocus_params->start_angles[i]; - soundFocusData->enable[i] = soundfocus_params->enables[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData->start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData->enable[i]); - } - soundFocusData->gain_step = soundfocus_params->gain_step; - pr_debug("%s: gain_step = %d\n", __func__, soundFocusData->gain_step); - -done: - pr_debug("%s: Exit, ret = %d\n", __func__, ret); - - kfree(params_value); - return ret; -} -EXPORT_SYMBOL(adm_get_sound_focus); - -static int adm_source_tracking_alloc_map_memory(void) -{ - int ret; - - pr_debug("%s: Enter\n", __func__); - - ret = msm_audio_ion_alloc(&this_adm.sourceTrackingData.dma_buf, - AUD_PROC_BLOCK_SIZE, - &this_adm.sourceTrackingData.memmap.paddr, - &this_adm.sourceTrackingData.memmap.size, - &this_adm.sourceTrackingData.memmap.kvaddr); - if (ret) { - pr_err("%s: failed to allocate memory\n", __func__); - - ret = -EINVAL; - goto done; - } - - atomic_set(&this_adm.mem_map_index, ADM_MEM_MAP_INDEX_SOURCE_TRACKING); - ret = adm_memory_map_regions(&this_adm.sourceTrackingData.memmap.paddr, - 0, - (uint32_t *)&this_adm.sourceTrackingData.memmap.size, - 1); - if (ret < 0) { - pr_err("%s: failed to map memory, paddr = 0x%pK, size = %d\n", - __func__, - (void *)this_adm.sourceTrackingData.memmap.paddr, - (uint32_t)this_adm.sourceTrackingData.memmap.size); - - msm_audio_ion_free(this_adm.sourceTrackingData.dma_buf); - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - atomic_set(&this_adm.mem_map_handles - [ADM_MEM_MAP_INDEX_SOURCE_TRACKING], 0); - - ret = -EINVAL; - goto done; - } - ret = 0; - pr_debug("%s: paddr = 0x%pK, size = %d, mem_map_handle = 0x%x\n", - __func__, (void *)this_adm.sourceTrackingData.memmap.paddr, - (uint32_t)this_adm.sourceTrackingData.memmap.size, - atomic_read(&this_adm.mem_map_handles - [ADM_MEM_MAP_INDEX_SOURCE_TRACKING])); - -done: - pr_debug("%s: Exit, ret = %d\n", __func__, ret); - - return ret; -} - -/** - * adm_get_source_tracking - - * Retrieve source tracking info - * - * @port_id: Port ID number - * @copp_idx: copp index assigned - * @sourceTrackingData: pointer for source track data to be updated with - * - * Returns 0 on success or error on failure - */ -int adm_get_source_tracking(int port_id, int copp_idx, - struct source_tracking_param *sourceTrackingData) -{ - struct adm_param_fluence_sourcetracking_t *source_tracking_params = - NULL; - struct mem_mapping_hdr mem_hdr; - struct param_hdr_v3 param_hdr; - int i = 0; - int ret = 0; - - pr_debug("%s: Enter, port_id %d, copp_idx %d\n", - __func__, port_id, copp_idx); - - if (!this_adm.sourceTrackingData.memmap.paddr) { - /* Allocate and map shared memory for out of band usage */ - ret = adm_source_tracking_alloc_map_memory(); - if (ret != 0) { - ret = -EINVAL; - goto done; - } - } - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - mem_hdr.data_payload_addr_lsw = - lower_32_bits(this_adm.sourceTrackingData.memmap.paddr); - mem_hdr.data_payload_addr_msw = msm_audio_populate_upper_32_bits( - this_adm.sourceTrackingData.memmap.paddr); - mem_hdr.mem_map_handle = atomic_read( - &this_adm.mem_map_handles[ADM_MEM_MAP_INDEX_SOURCE_TRACKING]); - - param_hdr.module_id = VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = VOICEPROC_PARAM_ID_FLUENCE_SOURCETRACKING; - /* - * This size should be the max size of the calibration data + header. - * Use the union size to ensure max size is used. - */ - param_hdr.param_size = - sizeof(struct adm_param_fluence_sourcetracking_t) + - sizeof(struct param_hdr_v3); - - /* - * Retrieving parameters out of band, so no need to provide a buffer for - * the returned parameter data as it will be at the memory location - * provided. - */ - ret = adm_get_pp_params(port_id, copp_idx, - ADM_CLIENT_ID_SOURCE_TRACKING, &mem_hdr, - ¶m_hdr, NULL); - if (ret) { - pr_err("%s: Failed to get params, error %d\n", __func__, ret); - goto done; - } - - if (this_adm.sourceTrackingData.apr_cmd_status != 0) { - pr_err("%s - get params returned error [%s]\n", - __func__, adsp_err_get_err_str( - this_adm.sourceTrackingData.apr_cmd_status)); - - ret = adsp_err_get_lnx_err_code( - this_adm.sourceTrackingData.apr_cmd_status); - goto done; - } - - /* How do we know what the param data was retrieved with for hdr size */ - source_tracking_params = - (struct adm_param_fluence_sourcetracking_t - *) (this_adm.sourceTrackingData.memmap.kvaddr + - sizeof(struct param_hdr_v3)); - for (i = 0; i < MAX_SECTORS; i++) { - sourceTrackingData->vad[i] = source_tracking_params->vad[i]; - pr_debug("%s: vad[%d] = %d\n", - __func__, i, sourceTrackingData->vad[i]); - } - sourceTrackingData->doa_speech = source_tracking_params->doa_speech; - pr_debug("%s: doa_speech = %d\n", - __func__, sourceTrackingData->doa_speech); - - for (i = 0; i < MAX_NOISE_SOURCE_INDICATORS; i++) { - sourceTrackingData->doa_noise[i] = - source_tracking_params->doa_noise[i]; - pr_debug("%s: doa_noise[%d] = %d\n", - __func__, i, sourceTrackingData->doa_noise[i]); - } - for (i = 0; i < MAX_POLAR_ACTIVITY_INDICATORS; i++) { - sourceTrackingData->polar_activity[i] = - source_tracking_params->polar_activity[i]; - pr_debug("%s: polar_activity[%d] = %d\n", - __func__, i, sourceTrackingData->polar_activity[i]); - } - - ret = 0; - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(adm_get_source_tracking); - -int __init adm_init(void) -{ - int i = 0, j; - - this_adm.ec_ref_rx = -1; - this_adm.ffecns_port_id = -1; - init_waitqueue_head(&this_adm.matrix_map_wait); - init_waitqueue_head(&this_adm.adm_wait); - mutex_init(&this_adm.adm_apr_lock); - - for (i = 0; i < AFE_MAX_PORTS; i++) { - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - atomic_set(&this_adm.copp.id[i][j], RESET_COPP_ID); - init_waitqueue_head(&this_adm.copp.wait[i][j]); - init_waitqueue_head( - &this_adm.copp.adm_delay_wait[i][j]); - } - } - - if (adm_init_cal_data()) - pr_err("%s: could not init cal data!\n", __func__); - - this_adm.sourceTrackingData.dma_buf = NULL; - this_adm.sourceTrackingData.memmap.size = 0; - this_adm.sourceTrackingData.memmap.kvaddr = NULL; - this_adm.sourceTrackingData.memmap.paddr = 0; - this_adm.sourceTrackingData.apr_cmd_status = -1; - - return 0; -} - -void adm_exit(void) -{ - mutex_destroy(&this_adm.adm_apr_lock); - if (this_adm.apr) - adm_reset_data(); - adm_delete_cal_data(); -} diff --git a/techpack/audio/dsp/q6afe.c b/techpack/audio/dsp/q6afe.c deleted file mode 100644 index 98c182e075e5..000000000000 --- a/techpack/audio/dsp/q6afe.c +++ /dev/null @@ -1,9077 +0,0 @@ -/* Copyright (c) 2012-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* for mius start */ -#ifdef CONFIG_US_PROXIMITY -#include -#endif -/* for mius end */ -#include -#include "adsp_err.h" -#include "q6afecal-hwdep.h" -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI -#include "../asoc/codecs/tfa98xx/inc/tfa_platform_interface_definition.h" -#endif - -#ifdef CONFIG_MSM_CSPL -#include -#endif - -#define WAKELOCK_TIMEOUT 5000 -enum { - AFE_COMMON_RX_CAL = 0, - AFE_COMMON_TX_CAL, - AFE_LSM_TX_CAL, - AFE_AANC_CAL, - AFE_FB_SPKR_PROT_CAL, - AFE_HW_DELAY_CAL, - AFE_SIDETONE_CAL, - AFE_SIDETONE_IIR_CAL, - AFE_TOPOLOGY_CAL, - AFE_LSM_TOPOLOGY_CAL, - AFE_CUST_TOPOLOGY_CAL, - AFE_FB_SPKR_PROT_TH_VI_CAL, - AFE_FB_SPKR_PROT_EX_VI_CAL, - MAX_AFE_CAL_TYPES -}; - -enum fbsp_state { - FBSP_INCORRECT_OP_MODE, - FBSP_INACTIVE, - FBSP_WARMUP, - FBSP_IN_PROGRESS, - FBSP_SUCCESS, - FBSP_FAILED, - MAX_FBSP_STATE -}; - -static char fbsp_state[MAX_FBSP_STATE][50] = { - [FBSP_INCORRECT_OP_MODE] = "incorrect operation mode", - [FBSP_INACTIVE] = "port not started", - [FBSP_WARMUP] = "waiting for warmup", - [FBSP_IN_PROGRESS] = "in progress state", - [FBSP_SUCCESS] = "success", - [FBSP_FAILED] = "failed" -}; - -enum v_vali_state { - V_VALI_FAILED, - V_VALI_SUCCESS, - V_VALI_INCORRECT_OP_MODE, - V_VALI_INACTIVE, - V_VALI_WARMUP, - V_VALI_IN_PROGRESS, - MAX_V_VALI_STATE -}; - -enum { - USE_CALIBRATED_R0TO, - USE_SAFE_R0TO -}; - -enum { - QUICK_CALIB_DISABLE, - QUICK_CALIB_ENABLE -}; - -enum { - Q6AFE_MSM_SPKR_PROCESSING = 0, - Q6AFE_MSM_SPKR_CALIBRATION, - Q6AFE_MSM_SPKR_FTM_MODE, - Q6AFE_MSM_SPKR_V_VALI_MODE -}; - -struct wlock { - struct wakeup_source ws; -}; - -static struct wlock wl; - -struct afe_ctl { - void *apr; - atomic_t state; - atomic_t status; - wait_queue_head_t wait[AFE_MAX_PORTS]; - wait_queue_head_t wait_wakeup; - wait_queue_head_t lpass_core_hw_wait; - uint32_t lpass_hw_core_client_hdl; - void (*tx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void (*rx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void *tx_private_data; - void *rx_private_data; - uint32_t mmap_handle; - - void (*pri_spdif_tx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void (*sec_spdif_tx_cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv); - void *pri_spdif_tx_private_data; - void *sec_spdif_tx_private_data; - int pri_spdif_config_change; - int sec_spdif_config_change; - struct work_struct afe_spdif_work; - - int topology[AFE_MAX_PORTS]; - struct cal_type_data *cal_data[MAX_AFE_CAL_TYPES]; - - atomic_t mem_map_cal_handles[MAX_AFE_CAL_TYPES]; - atomic_t mem_map_cal_index; - u32 afe_cal_mode[AFE_MAX_PORTS]; - - u16 dtmf_gen_rx_portid; - struct audio_cal_info_spk_prot_cfg prot_cfg; - struct afe_spkr_prot_calib_get_resp calib_data; - struct audio_cal_info_sp_th_vi_ftm_cfg th_ftm_cfg; - struct audio_cal_info_sp_th_vi_v_vali_cfg v_vali_cfg; - struct audio_cal_info_sp_ex_vi_ftm_cfg ex_ftm_cfg; - struct afe_sp_th_vi_get_param_resp th_vi_resp; - struct afe_sp_th_vi_v_vali_get_param_resp th_vi_v_vali_resp; - struct afe_sp_ex_vi_get_param_resp ex_vi_resp; - struct afe_sp_rx_tmax_xmax_logging_resp xt_logging_resp; - struct afe_av_dev_drift_get_param_resp av_dev_drift_resp; - int vi_tx_port; - int vi_rx_port; - uint32_t afe_sample_rates[AFE_MAX_PORTS]; - struct aanc_data aanc_info; - struct mutex afe_cmd_lock; - struct mutex afe_apr_lock; - int set_custom_topology; - int dev_acdb_id[AFE_MAX_PORTS]; - routing_cb rt_cb; - struct audio_uevent_data *uevent_data; - /* cal info for AFE */ - struct afe_fw_info *fw_data; - u32 island_mode[AFE_MAX_PORTS]; - struct vad_config vad_cfg[AFE_MAX_PORTS]; - struct work_struct afe_dc_work; -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - struct rtac_cal_block_data tfa_cal; - atomic_t tfa_state; -#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ - struct notifier_block event_notifier; - /* FTM spk params */ - uint32_t initial_cal; - uint32_t v_vali_flag; -}; - -static atomic_t afe_ports_mad_type[SLIMBUS_PORT_LAST - SLIMBUS_0_RX]; -static unsigned long afe_configured_cmd; - -static struct afe_ctl this_afe; - -#define TIMEOUT_MS 1000 -#define Q6AFE_MAX_VOLUME 0x3FFF - -static int pcm_afe_instance[2]; -static int proxy_afe_instance[2]; -bool afe_close_done[2] = {true, true}; - -#define SIZEOF_CFG_CMD(y) \ - (sizeof(struct apr_hdr) + sizeof(u16) + (sizeof(struct y))) - -static int afe_get_cal_hw_delay(int32_t path, - struct audio_cal_hw_delay_entry *entry); -static int remap_cal_data(struct cal_block_data *cal_block, int cal_index); - -#ifdef CONFIG_MSM_CSPL -struct afe_cspl_state cspl_afe = { - .apr= &this_afe.apr, - .status= &this_afe.status, - .state= &this_afe.state, - .wait= this_afe.wait, - .timeout_ms= TIMEOUT_MS, -}; -EXPORT_SYMBOL(cspl_afe); -#endif - -int afe_get_spk_initial_cal(void) -{ - return this_afe.initial_cal; -} - -void afe_get_spk_r0(int *spk_r0) -{ - uint16_t i = 0; - - for (; i < SP_V2_NUM_MAX_SPKRS; i++) - spk_r0[i] = this_afe.prot_cfg.r0[i]; -} - -void afe_get_spk_t0(int *spk_t0) -{ - uint16_t i = 0; - - for (; i < SP_V2_NUM_MAX_SPKRS; i++) - spk_t0[i] = this_afe.prot_cfg.t0[i]; -} - -int afe_get_spk_v_vali_flag(void) -{ - return this_afe.v_vali_flag; -} - -void afe_get_spk_v_vali_sts(int *spk_v_vali_sts) -{ - uint16_t i = 0; - - for (; i < SP_V2_NUM_MAX_SPKRS; i++) - spk_v_vali_sts[i] = - this_afe.th_vi_v_vali_resp.param.status[i]; -} - -void afe_set_spk_initial_cal(int initial_cal) -{ - this_afe.initial_cal = initial_cal; -} - -void afe_set_spk_v_vali_flag(int v_vali_flag) -{ - this_afe.v_vali_flag = v_vali_flag; -} - -int afe_get_topology(int port_id) -{ - int topology; - int port_index = afe_get_port_index(port_id); - - if ((port_index < 0) || (port_index >= AFE_MAX_PORTS)) { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - topology = -EINVAL; - goto done; - } - - topology = this_afe.topology[port_index]; -done: - return topology; -} - -/** - * afe_set_aanc_info - - * Update AFE AANC info - * - * @q6_aanc_info: AFE AANC info params - * - */ -void afe_set_aanc_info(struct aanc_data *q6_aanc_info) -{ - this_afe.aanc_info.aanc_active = q6_aanc_info->aanc_active; - this_afe.aanc_info.aanc_rx_port = q6_aanc_info->aanc_rx_port; - this_afe.aanc_info.aanc_tx_port = q6_aanc_info->aanc_tx_port; - - pr_debug("%s: aanc active is %d rx port is 0x%x, tx port is 0x%x\n", - __func__, - this_afe.aanc_info.aanc_active, - this_afe.aanc_info.aanc_rx_port, - this_afe.aanc_info.aanc_tx_port); -} -EXPORT_SYMBOL(afe_set_aanc_info); - -static void afe_callback_debug_print(struct apr_client_data *data) -{ - uint32_t *payload; - - payload = data->payload; - - if (data->payload_size >= 8) - pr_debug("%s: code = 0x%x PL#0[0x%x], PL#1[0x%x], size = %d\n", - __func__, data->opcode, payload[0], payload[1], - data->payload_size); - else if (data->payload_size >= 4) - pr_debug("%s: code = 0x%x PL#0[0x%x], size = %d\n", - __func__, data->opcode, payload[0], - data->payload_size); - else - pr_debug("%s: code = 0x%x, size = %d\n", - __func__, data->opcode, data->payload_size); -} - -static void av_dev_drift_afe_cb_handler(uint32_t opcode, uint32_t *payload, - uint32_t payload_size) -{ - u32 param_id; - size_t expected_size = - sizeof(u32) + sizeof(struct afe_param_id_dev_timing_stats); - - /* Get param ID depending on command type */ - param_id = (opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) ? payload[3] : - payload[2]; - if (param_id != AFE_PARAM_ID_DEV_TIMING_STATS) { - pr_err("%s: Unrecognized param ID %d\n", __func__, param_id); - return; - } - - switch (opcode) { - case AFE_PORT_CMDRSP_GET_PARAM_V2: - expected_size += sizeof(struct param_hdr_v1); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } - /* Repack response to add IID */ - this_afe.av_dev_drift_resp.status = payload[0]; - this_afe.av_dev_drift_resp.pdata.module_id = payload[1]; - this_afe.av_dev_drift_resp.pdata.instance_id = INSTANCE_ID_0; - this_afe.av_dev_drift_resp.pdata.param_id = payload[2]; - this_afe.av_dev_drift_resp.pdata.param_size = payload[3]; - memcpy(&this_afe.av_dev_drift_resp.timing_stats, &payload[4], - sizeof(struct afe_param_id_dev_timing_stats)); - break; - case AFE_PORT_CMDRSP_GET_PARAM_V3: - expected_size += sizeof(struct param_hdr_v3); - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu\n", - __func__, payload_size, expected_size); - return; - } - memcpy(&this_afe.av_dev_drift_resp, payload, - sizeof(this_afe.av_dev_drift_resp)); - break; - default: - pr_err("%s: Unrecognized command %d\n", __func__, opcode); - return; - } - - if (!this_afe.av_dev_drift_resp.status) { - atomic_set(&this_afe.state, 0); - } else { - pr_debug("%s: av_dev_drift_resp status: %d", __func__, - this_afe.av_dev_drift_resp.status); - atomic_set(&this_afe.state, -1); - } -} - -static int32_t sp_make_afe_callback(uint32_t opcode, uint32_t *payload, - uint32_t payload_size) -{ - struct param_hdr_v3 param_hdr; - u32 *data_dest = NULL; - u32 *data_start = NULL; - size_t expected_size = sizeof(u32); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* Set command specific details */ - switch (opcode) { - case AFE_PORT_CMDRSP_GET_PARAM_V2: - expected_size += sizeof(struct param_hdr_v1); - param_hdr.module_id = payload[1]; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = payload[2]; - param_hdr.param_size = payload[3]; - data_start = &payload[4]; - break; - case AFE_PORT_CMDRSP_GET_PARAM_V3: - expected_size += sizeof(struct param_hdr_v3); - memcpy(¶m_hdr, &payload[1], sizeof(struct param_hdr_v3)); - data_start = &payload[5]; - break; - default: - pr_err("%s: Unrecognized command %d\n", __func__, opcode); - return -EINVAL; - } - - switch (param_hdr.param_id) { - case AFE_PARAM_ID_CALIB_RES_CFG_V2: - expected_size += sizeof(struct asm_calib_res_cfg); - data_dest = (u32 *) &this_afe.calib_data; - break; - case AFE_PARAM_ID_SP_V2_TH_VI_FTM_PARAMS: - expected_size += sizeof(struct afe_sp_th_vi_ftm_params); - data_dest = (u32 *) &this_afe.th_vi_resp; - break; - case AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_PARAMS: - expected_size += sizeof(struct afe_sp_th_vi_v_vali_params); - data_dest = (u32 *) &this_afe.th_vi_v_vali_resp; - break; - case AFE_PARAM_ID_SP_V2_EX_VI_FTM_PARAMS: - expected_size += sizeof(struct afe_sp_ex_vi_ftm_params); - data_dest = (u32 *) &this_afe.ex_vi_resp; - break; - case AFE_PARAM_ID_SP_RX_TMAX_XMAX_LOGGING: - expected_size += sizeof( - struct afe_sp_rx_tmax_xmax_logging_param); - data_dest = (u32 *) &this_afe.xt_logging_resp; - break; - default: - pr_err("%s: Unrecognized param ID %d\n", __func__, - param_hdr.param_id); - return -EINVAL; - } - - if (payload_size < expected_size) { - pr_err("%s: Error: received size %d, expected size %zu for param %d\n", - __func__, payload_size, expected_size, - param_hdr.param_id); - return -EINVAL; - } - - data_dest[0] = payload[0]; - memcpy(&data_dest[1], ¶m_hdr, sizeof(struct param_hdr_v3)); - memcpy(&data_dest[5], data_start, param_hdr.param_size); - - if (!data_dest[0]) { - atomic_set(&this_afe.state, 0); - } else { - pr_debug("%s: status: %d", __func__, data_dest[0]); - atomic_set(&this_afe.state, -1); - } - - return 0; -} - -static void afe_notify_dc_presence(void) -{ - pr_debug("%s: DC detected\n", __func__); - msm_aud_evt_notifier_call_chain(MSM_AUD_DC_EVENT, NULL); - - schedule_work(&this_afe.afe_dc_work); -} - -static void afe_notify_dc_presence_work_fn(struct work_struct *work) -{ - int ret = 0; - char event[] = "DC_PRESENCE=TRUE"; - - ret = q6core_send_uevent(this_afe.uevent_data, event); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", - __func__, event, ret); -} - -static int afe_aud_event_notify(struct notifier_block *self, - unsigned long action, void *data) -{ - switch (action) { - case SWR_WAKE_IRQ_REGISTER: - afe_send_cmd_wakeup_register(data, true); - break; - case SWR_WAKE_IRQ_DEREGISTER: - afe_send_cmd_wakeup_register(data, false); - break; - default: - pr_err("%s: invalid event type: %lu\n", __func__, action); - return -EINVAL; - } - - return 0; -} - -static void afe_notify_spdif_fmt_update_work_fn(struct work_struct *work) -{ - int ret = 0; - char event_pri[] = "PRI_SPDIF_TX=MEDIA_CONFIG_CHANGE"; - char event_sec[] = "SEC_SPDIF_TX=MEDIA_CONFIG_CHANGE"; - - if (this_afe.pri_spdif_config_change) { - this_afe.pri_spdif_config_change = 0; - ret = q6core_send_uevent(this_afe.uevent_data, event_pri); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", - __func__, event_pri, ret); - } - if (this_afe.sec_spdif_config_change) { - this_afe.sec_spdif_config_change = 0; - ret = q6core_send_uevent(this_afe.uevent_data, event_sec); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", - __func__, event_sec, ret); - } -} - -static void afe_notify_spdif_fmt_update(void *payload) -{ - struct afe_port_mod_evt_rsp_hdr *evt_pl; - - evt_pl = (struct afe_port_mod_evt_rsp_hdr *)payload; - if (evt_pl->port_id == AFE_PORT_ID_PRIMARY_SPDIF_TX) - this_afe.pri_spdif_config_change = 1; - else - this_afe.sec_spdif_config_change = 1; - - schedule_work(&this_afe.afe_spdif_work); -} - -static bool afe_token_is_valid(uint32_t token) -{ - if (token >= AFE_MAX_PORTS) { - pr_err("%s: token %d is invalid.\n", __func__, token); - return false; - } - return true; -} - -static int32_t afe_callback(struct apr_client_data *data, void *priv) -{ - if (!data) { - pr_err("%s: Invalid param data\n", __func__); - return -EINVAL; - } - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: reset event = %d %d apr[%pK]\n", - __func__, - data->reset_event, data->reset_proc, this_afe.apr); - - cal_utils_clear_cal_block_q6maps(MAX_AFE_CAL_TYPES, - this_afe.cal_data); - - /* Reset the custom topology mode: to resend again to AFE. */ - mutex_lock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - this_afe.set_custom_topology = 1; - mutex_unlock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - rtac_clear_mapping(AFE_RTAC_CAL); - - if (this_afe.apr) { - apr_reset(this_afe.apr); - atomic_set(&this_afe.state, 0); - this_afe.apr = NULL; - rtac_set_afe_handle(this_afe.apr); - } - - /* - * Pass reset events to proxy driver, if cb is registered - */ - if (this_afe.tx_cb) { - this_afe.tx_cb(data->opcode, data->token, - data->payload, - this_afe.tx_private_data); - this_afe.tx_cb = NULL; - } - if (this_afe.rx_cb) { - this_afe.rx_cb(data->opcode, data->token, - data->payload, - this_afe.rx_private_data); - this_afe.rx_cb = NULL; - } - - return 0; - } - afe_callback_debug_print(data); - if (data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V2 || - data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) { - uint32_t *payload = data->payload; - uint32_t param_id; - -#ifdef CONFIG_MSM_CSPL - if (crus_afe_callback(data->payload, data->payload_size) == 0) - return 0; -#endif - if (!payload || (data->token >= AFE_MAX_PORTS)) { - pr_err("%s: Error: size %d payload %pK token %d\n", - __func__, data->payload_size, - payload, data->token); - return -EINVAL; - } - - if (rtac_make_afe_callback(data->payload, - data->payload_size)) - return 0; - - param_id = (data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3) ? - payload[3] : - payload[2]; - - if (param_id == AFE_PARAM_ID_DEV_TIMING_STATS) { - av_dev_drift_afe_cb_handler(data->opcode, data->payload, - data->payload_size); - } else { - -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - if (atomic_read(&this_afe.tfa_state) == 1 && - data->payload_size == sizeof(uint32_t)) { - - atomic_set(&this_afe.status, payload[0]); - if (payload[0]) - atomic_set(&this_afe.state, -1); - else - atomic_set(&this_afe.state, 0); - - atomic_set(&this_afe.tfa_state, 0); - wake_up(&this_afe.wait[data->token]); - - return 0; - } -#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ - - if (sp_make_afe_callback(data->opcode, data->payload, - data->payload_size)) - return -EINVAL; - } - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - } else if (data->opcode == AFE_EVENT_MBHC_DETECTION_SW_WA) { - msm_aud_evt_notifier_call_chain(SWR_WAKE_IRQ_EVENT, NULL); - } else if (data->opcode == - AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST) { - uint32_t *payload = data->payload; - - pr_debug("%s: LPASS_CORE_HW_VOTE_REQUEST handle %d\n", - __func__, payload[0]); - this_afe.lpass_hw_core_client_hdl = payload[0]; - atomic_set(&this_afe.state, 0); - atomic_set(&this_afe.status, 0); - wake_up(&this_afe.lpass_core_hw_wait); - } else if (data->opcode == ULTRASOUND_OPCODE) { - if (NULL != data->payload) - elliptic_process_apr_payload(data->payload); - else - pr_err("[EXPORT_SYMBOLLUS]: payload ptr is Invalid"); - /* for mius start */ -#ifdef CONFIG_US_PROXIMITY - } else if (data->opcode == MI_ULTRASOUND_OPCODE) { - if (NULL != data->payload) - { - printk(KERN_DEBUG "[MIUS] mi ultrasound afe afe cb"); - mius_process_apr_payload(data->payload); - } - else - pr_err("[EXPORT_SYMBOLLUS]: payload ptr is Invalid"); -#endif - /* for mius end */ - } else if (data->payload_size) { - uint32_t *payload; - uint16_t port_id = 0; - - payload = data->payload; - if (data->opcode == APR_BASIC_RSP_RESULT) { - pr_debug("%s:opcode = 0x%x cmd = 0x%x status = 0x%x token=%d\n", - __func__, data->opcode, - payload[0], payload[1], data->token); - /* payload[1] contains the error status for response */ - if (payload[1] != 0) { - atomic_set(&this_afe.status, payload[1]); - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - } - switch (payload[0]) { - case AFE_PORT_CMD_SET_PARAM_V2: - case AFE_PORT_CMD_SET_PARAM_V3: - if (rtac_make_afe_callback(payload, - data->payload_size)) - return 0; - case AFE_PORT_CMD_DEVICE_STOP: - case AFE_PORT_CMD_DEVICE_START: - case AFE_PSEUDOPORT_CMD_START: - case AFE_PSEUDOPORT_CMD_STOP: - case AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS: - case AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS: - case AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER: - case AFE_PORTS_CMD_DTMF_CTL: - case AFE_SVC_CMD_SET_PARAM: - case AFE_SVC_CMD_SET_PARAM_V2: - case AFE_PORT_CMD_MOD_EVENT_CFG: - atomic_set(&this_afe.state, 0); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - break; - case AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER: - break; - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2: - port_id = RT_PROXY_PORT_001_TX; - break; - case AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2: - port_id = RT_PROXY_PORT_001_RX; - break; - case AFE_CMD_ADD_TOPOLOGIES: - atomic_set(&this_afe.state, 0); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - pr_debug("%s: AFE_CMD_ADD_TOPOLOGIES cmd 0x%x\n", - __func__, payload[1]); - break; - case AFE_PORT_CMD_GET_PARAM_V2: - case AFE_PORT_CMD_GET_PARAM_V3: - /* - * Should only come here if there is an APR - * error or malformed APR packet. Otherwise - * response will be returned as - * AFE_PORT_CMDRSP_GET_PARAM_V2/3 - */ - pr_debug("%s: AFE Get Param opcode 0x%x token 0x%x src %d dest %d\n", - __func__, data->opcode, data->token, - data->src_port, data->dest_port); - if (payload[1] != 0) { - pr_err("%s: AFE Get Param failed with error %d\n", - __func__, payload[1]); - if (rtac_make_afe_callback( - payload, - data->payload_size)) - return 0; - } - atomic_set(&this_afe.state, payload[1]); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - break; - case AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST: - case AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST: - atomic_set(&this_afe.state, 0); - wake_up(&this_afe.lpass_core_hw_wait); - break; - case AFE_SVC_CMD_EVENT_CFG: - atomic_set(&this_afe.state, payload[1]); - wake_up(&this_afe.wait_wakeup); - break; - default: - pr_err("%s: Unknown cmd 0x%x\n", __func__, - payload[0]); - break; - } - } else if (data->opcode == - AFE_SERVICE_CMDRSP_SHARED_MEM_MAP_REGIONS) { - pr_debug("%s: mmap_handle: 0x%x, cal index %d\n", - __func__, payload[0], - atomic_read(&this_afe.mem_map_cal_index)); - if (atomic_read(&this_afe.mem_map_cal_index) != -1) - atomic_set(&this_afe.mem_map_cal_handles[ - atomic_read( - &this_afe.mem_map_cal_index)], - (uint32_t)payload[0]); - else - this_afe.mmap_handle = payload[0]; - atomic_set(&this_afe.state, 0); - if (afe_token_is_valid(data->token)) - wake_up(&this_afe.wait[data->token]); - else - return -EINVAL; - } else if (data->opcode == AFE_EVENT_RT_PROXY_PORT_STATUS) { - port_id = (uint16_t)(0x0000FFFF & payload[0]); - } else if (data->opcode == AFE_PORT_MOD_EVENT) { - u32 flag_dc_presence[2]; - uint32_t *payload = data->payload; - struct afe_port_mod_evt_rsp_hdr *evt_pl = - (struct afe_port_mod_evt_rsp_hdr *)payload; - - if (!payload || (data->token >= AFE_MAX_PORTS)) { - pr_err("%s: Error: size %d payload %pK token %d\n", - __func__, data->payload_size, - payload, data->token); - return -EINVAL; - } - if ((evt_pl->module_id == AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI) && - (evt_pl->event_id == AFE_PORT_SP_DC_DETECTION_EVENT) && - (evt_pl->payload_size == sizeof(flag_dc_presence))) { - - memcpy(&flag_dc_presence, - (uint8_t *)payload + - sizeof(struct afe_port_mod_evt_rsp_hdr), - evt_pl->payload_size); - if (flag_dc_presence[0] == 1 || - flag_dc_presence[1] == 1) { - afe_notify_dc_presence(); - } - } else if (evt_pl->port_id == AFE_PORT_ID_PRIMARY_SPDIF_TX) { - if (this_afe.pri_spdif_tx_cb) { - this_afe.pri_spdif_tx_cb(data->opcode, - data->token, data->payload, - this_afe.pri_spdif_tx_private_data); - } - afe_notify_spdif_fmt_update(data->payload); - } else if (evt_pl->port_id == AFE_PORT_ID_SECONDARY_SPDIF_TX) { - if (this_afe.sec_spdif_tx_cb) { - this_afe.sec_spdif_tx_cb(data->opcode, - data->token, data->payload, - this_afe.sec_spdif_tx_private_data); - } - afe_notify_spdif_fmt_update(data->payload); - } else { - pr_debug("%s: mod ID = 0x%x event_id = 0x%x\n", - __func__, evt_pl->module_id, - evt_pl->event_id); - } - } - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - switch (port_id) { - case RT_PROXY_PORT_001_TX: { - if (this_afe.tx_cb) { - this_afe.tx_cb(data->opcode, data->token, - data->payload, - this_afe.tx_private_data); - } - break; - } - case RT_PROXY_PORT_001_RX: { - if (this_afe.rx_cb) { - this_afe.rx_cb(data->opcode, data->token, - data->payload, - this_afe.rx_private_data); - } - break; - } - default: - pr_debug("%s: default case 0x%x\n", __func__, port_id); - break; - } - } - return 0; -} - -/** - * afe_get_port_type - - * Retrieve AFE port type whether RX or TX - * - * @port_id: AFE Port ID number - * - * Returns RX/TX type. - */ -int afe_get_port_type(u16 port_id) -{ - int ret = MSM_AFE_PORT_TYPE_RX; - - switch (port_id) { - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - ret = MSM_AFE_PORT_TYPE_TX; - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - ret = MSM_AFE_PORT_TYPE_RX; - break; - default: - /* Odd numbered ports are TX and Rx are Even numbered */ - if (port_id & 0x1) - ret = MSM_AFE_PORT_TYPE_TX; - else - ret = MSM_AFE_PORT_TYPE_RX; - break; - } - - return ret; -} -EXPORT_SYMBOL(afe_get_port_type); - -int afe_sizeof_cfg_cmd(u16 port_id) -{ - int ret_size; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_i2s_cfg); - break; - case HDMI_RX: - case DISPLAY_PORT_RX: - ret_size = - SIZEOF_CFG_CMD(afe_param_id_hdmi_multi_chan_audio_cfg); - break; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - ret_size = - SIZEOF_CFG_CMD(afe_param_id_spdif_cfg_v2); - break; - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_5_TX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_slimbus_cfg); - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_pseudo_port_cfg); - break; - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_rt_proxy_port_cfg); - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - ret_size = SIZEOF_CFG_CMD(afe_param_id_usb_audio_cfg); - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - ret_size = SIZEOF_CFG_CMD(afe_param_id_cdc_dma_cfg_t); - break; - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - default: - pr_debug("%s: default case 0x%x\n", __func__, port_id); - ret_size = SIZEOF_CFG_CMD(afe_param_id_pcm_cfg); - break; - } - return ret_size; -} - -/** - * afe_q6_interface_prepare - - * wrapper API to check Q6 AFE registered to APR otherwise registers - * - * Returns 0 on success or error on failure. - */ -int afe_q6_interface_prepare(void) -{ - int ret = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENETRESET; - } - rtac_set_afe_handle(this_afe.apr); - } - return ret; -} -EXPORT_SYMBOL(afe_q6_interface_prepare); - -/* - * afe_apr_send_pkt : returns 0 on success, negative otherwise. - */ -static int afe_apr_send_pkt(void *data, wait_queue_head_t *wait) -{ - int ret; - - mutex_lock(&this_afe.afe_apr_lock); - if (wait) - atomic_set(&this_afe.state, 1); - atomic_set(&this_afe.status, 0); - ret = apr_send_pkt(this_afe.apr, data); - if (ret > 0) { - if (wait) { - ret = wait_event_timeout(*wait, - (atomic_read(&this_afe.state) == 0), - msecs_to_jiffies(2 * TIMEOUT_MS)); - if (!ret) { - pr_err_ratelimited("%s: request timedout\n", - __func__); - ret = -ETIMEDOUT; - } else if (atomic_read(&this_afe.status) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read( - &this_afe.status))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_afe.status)); - } else { - ret = 0; - } - } else { - ret = 0; - } - } else if (ret == 0) { - pr_err("%s: packet not transmitted\n", __func__); - /* apr_send_pkt can return 0 when nothing is transmitted */ - ret = -EINVAL; - } - - pr_debug("%s: leave %d\n", __func__, ret); - mutex_unlock(&this_afe.afe_apr_lock); - return ret; -} - -#ifdef CONFIG_MSM_CSPL -int afe_apr_send_pkt_crus(void *data, int index, int set) -{ - pr_info("[CSPL] %s: index = %d, set=%d, data = %p\n", - __func__, index, set, data); - - if (set) - return afe_apr_send_pkt(data, &this_afe.wait[index]); - else /* get */ - return afe_apr_send_pkt(data, 0); -} - -EXPORT_SYMBOL(afe_apr_send_pkt_crus); -#endif - -/* This function shouldn't be called directly. Instead call q6afe_set_params. */ -static int q6afe_set_params_v2(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_port_cmd_set_param_v2 *set_param = NULL; - uint32_t size = sizeof(struct afe_port_cmd_set_param_v2); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - set_param = kzalloc(size, GFP_KERNEL); - if (set_param == NULL) - return -ENOMEM; - - set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param->apr_hdr.pkt_size = size; - set_param->apr_hdr.src_port = 0; - set_param->apr_hdr.dest_port = 0; - set_param->apr_hdr.token = index; - set_param->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; - set_param->port_id = port_id; - if (packed_data_size > U16_MAX) { - pr_err("%s: Invalid data size for set params V2 %d\n", __func__, - packed_data_size); - rc = -EINVAL; - goto done; - } - set_param->payload_size = packed_data_size; - if (mem_hdr != NULL) { - set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - memcpy(&set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(set_param, &this_afe.wait[index]); -done: - kfree(set_param); - return rc; -} - -/* This function shouldn't be called directly. Instead call q6afe_set_params. */ -static int q6afe_set_params_v3(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_port_cmd_set_param_v3 *set_param = NULL; - uint32_t size = sizeof(struct afe_port_cmd_set_param_v3); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - set_param = kzalloc(size, GFP_KERNEL); - if (set_param == NULL) - return -ENOMEM; - - set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param->apr_hdr.pkt_size = size; - set_param->apr_hdr.src_port = 0; - set_param->apr_hdr.dest_port = 0; - set_param->apr_hdr.token = index; - set_param->apr_hdr.opcode = AFE_PORT_CMD_SET_PARAM_V3; - set_param->port_id = port_id; - set_param->payload_size = packed_data_size; - if (mem_hdr != NULL) { - set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - memcpy(&set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(set_param, &this_afe.wait[index]); -done: - kfree(set_param); - return rc; -} - -static int q6afe_set_params(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - int ret = 0; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - port_id = q6audio_get_port_id(port_id); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid\n", __func__, index); - return -EINVAL; - } - - if (q6common_is_instance_id_supported()) - return q6afe_set_params_v3(port_id, index, mem_hdr, - packed_param_data, packed_data_size); - else - return q6afe_set_params_v2(port_id, index, mem_hdr, - packed_param_data, packed_data_size); -} - -static int q6afe_pack_and_set_param_in_band(u16 port_id, int index, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_param_data = NULL; - int packed_data_size = sizeof(union param_hdrs) + param_hdr.param_size; - int ret; - - packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); - if (packed_param_data == NULL) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, param_data, - &packed_data_size); - if (ret) { - pr_err("%s: Failed to pack param header and data, error %d\n", - __func__, ret); - goto fail_cmd; - } - - ret = q6afe_set_params(port_id, index, NULL, packed_param_data, - packed_data_size); - -fail_cmd: - kfree(packed_param_data); - return ret; -} - -static int q6afe_set_aanc_level(void) -{ - struct param_hdr_v3 param_hdr; - struct afe_param_id_aanc_noise_reduction aanc_noise_level; - int ret = 0; - uint16_t tx_port = 0; - - if (!this_afe.aanc_info.aanc_active) - return -EINVAL; - - pr_debug("%s: level: %d\n", __func__, this_afe.aanc_info.level); - memset(&aanc_noise_level, 0, sizeof(aanc_noise_level)); - aanc_noise_level.minor_version = 1; - aanc_noise_level.ad_beta = this_afe.aanc_info.level; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AANC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_AANC_NOISE_REDUCTION; - param_hdr.param_size = sizeof(struct afe_param_id_aanc_noise_reduction); - - tx_port = this_afe.aanc_info.aanc_tx_port; - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, - (u8 *) &aanc_noise_level); - if (ret) - pr_err("%s: AANC noise level enable failed for tx_port 0x%x ret %d\n", - __func__, tx_port, ret); - return ret; -} - -/** - * afe_set_aanc_noise_level - controls aanc noise reduction strength - * - * @level: Noise level to be controlled - * - * Returns 0 on success or error on failure. - */ -int afe_set_aanc_noise_level(int level) -{ - int ret = 0; - - if (this_afe.aanc_info.level == level) - return ret; - - mutex_lock(&this_afe.afe_cmd_lock); - this_afe.aanc_info.level = level; - ret = q6afe_set_aanc_level(); - mutex_unlock(&this_afe.afe_cmd_lock); - - return ret; -} -EXPORT_SYMBOL(afe_set_aanc_noise_level); - -/* This function shouldn't be called directly. Instead call q6afe_get_param. */ -static int q6afe_get_params_v2(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr) -{ - struct afe_port_cmd_get_param_v2 afe_get_param; - u32 param_size = param_hdr->param_size; - - memset(&afe_get_param, 0, sizeof(afe_get_param)); - afe_get_param.apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - afe_get_param.apr_hdr.pkt_size = sizeof(afe_get_param); - afe_get_param.apr_hdr.src_port = 0; - afe_get_param.apr_hdr.dest_port = 0; - afe_get_param.apr_hdr.token = index; - afe_get_param.apr_hdr.opcode = AFE_PORT_CMD_GET_PARAM_V2; - afe_get_param.port_id = port_id; - afe_get_param.payload_size = sizeof(struct param_hdr_v1) + param_size; - if (mem_hdr != NULL) - afe_get_param.mem_hdr = *mem_hdr; - /* Set MID and PID in command */ - afe_get_param.module_id = param_hdr->module_id; - afe_get_param.param_id = param_hdr->param_id; - /* Set param header in payload */ - afe_get_param.param_hdr.module_id = param_hdr->module_id; - afe_get_param.param_hdr.param_id = param_hdr->param_id; - afe_get_param.param_hdr.param_size = param_size; - - return afe_apr_send_pkt(&afe_get_param, &this_afe.wait[index]); -} - -/* This function shouldn't be called directly. Instead call q6afe_get_param. */ -static int q6afe_get_params_v3(u16 port_id, int index, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr) -{ - struct afe_port_cmd_get_param_v3 afe_get_param; - - memset(&afe_get_param, 0, sizeof(afe_get_param)); - afe_get_param.apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - afe_get_param.apr_hdr.pkt_size = sizeof(afe_get_param); - afe_get_param.apr_hdr.src_port = 0; - afe_get_param.apr_hdr.dest_port = 0; - afe_get_param.apr_hdr.token = index; - afe_get_param.apr_hdr.opcode = AFE_PORT_CMD_GET_PARAM_V3; - afe_get_param.port_id = port_id; - if (mem_hdr != NULL) - afe_get_param.mem_hdr = *mem_hdr; - /* Set param header in command, no payload in V3 */ - afe_get_param.param_hdr = *param_hdr; - - return afe_apr_send_pkt(&afe_get_param, &this_afe.wait[index]); -} - -/* - * Calling functions copy param data directly from this_afe. Do not copy data - * back to caller here. - */ -static int q6afe_get_params(u16 port_id, struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr) -{ - int index; - int ret; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - port_id = q6audio_get_port_id(port_id); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Not a valid port id = 0x%x ret %d\n", __func__, - port_id, ret); - return -EINVAL; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid\n", __func__, index); - return -EINVAL; - } - - if (q6common_is_instance_id_supported()) - return q6afe_get_params_v3(port_id, index, NULL, param_hdr); - else - return q6afe_get_params_v2(port_id, index, NULL, param_hdr); -} - -/* - * This function shouldn't be called directly. Instead call - * q6afe_svc_set_params. - */ -static int q6afe_svc_set_params_v1(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_svc_cmd_set_param_v1 *svc_set_param = NULL; - uint32_t size = sizeof(struct afe_svc_cmd_set_param_v1); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - svc_set_param = kzalloc(size, GFP_KERNEL); - if (svc_set_param == NULL) - return -ENOMEM; - - svc_set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - svc_set_param->apr_hdr.pkt_size = size; - svc_set_param->apr_hdr.src_port = 0; - svc_set_param->apr_hdr.dest_port = 0; - svc_set_param->apr_hdr.token = index; - svc_set_param->apr_hdr.opcode = AFE_SVC_CMD_SET_PARAM; - svc_set_param->payload_size = packed_data_size; - - if (mem_hdr != NULL) { - /* Out of band case. */ - svc_set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - /* In band case. */ - memcpy(&svc_set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(svc_set_param, &this_afe.wait[index]); -done: - kfree(svc_set_param); - return rc; -} - -/* - * This function shouldn't be called directly. Instead call - * q6afe_svc_set_params. - */ -static int q6afe_svc_set_params_v2(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size) -{ - struct afe_svc_cmd_set_param_v2 *svc_set_param = NULL; - uint16_t size = sizeof(struct afe_svc_cmd_set_param_v2); - int rc = 0; - - if (packed_param_data != NULL) - size += packed_data_size; - svc_set_param = kzalloc(size, GFP_KERNEL); - if (svc_set_param == NULL) - return -ENOMEM; - - svc_set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - svc_set_param->apr_hdr.pkt_size = size; - svc_set_param->apr_hdr.src_port = 0; - svc_set_param->apr_hdr.dest_port = 0; - svc_set_param->apr_hdr.token = index; - svc_set_param->apr_hdr.opcode = AFE_SVC_CMD_SET_PARAM_V2; - svc_set_param->payload_size = packed_data_size; - - if (mem_hdr != NULL) { - /* Out of band case. */ - svc_set_param->mem_hdr = *mem_hdr; - } else if (packed_param_data != NULL) { - /* In band case. */ - memcpy(&svc_set_param->param_data, packed_param_data, - packed_data_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - rc = -EINVAL; - goto done; - } - - rc = afe_apr_send_pkt(svc_set_param, &this_afe.wait[index]); -done: - kfree(svc_set_param); - return rc; -} - -static int q6afe_svc_set_params(int index, struct mem_mapping_hdr *mem_hdr, - u8 *packed_param_data, u32 packed_data_size, - bool is_iid_supported) -{ - int ret; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if (is_iid_supported) - return q6afe_svc_set_params_v2(index, mem_hdr, - packed_param_data, - packed_data_size); - else - return q6afe_svc_set_params_v1(index, mem_hdr, - packed_param_data, - packed_data_size); -} - -static int q6afe_svc_pack_and_set_param_in_band(int index, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_param_data = NULL; - u32 packed_data_size = - sizeof(struct param_hdr_v3) + param_hdr.param_size; - int ret = 0; - bool is_iid_supported = q6common_is_instance_id_supported(); - - packed_param_data = kzalloc(packed_data_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - - ret = q6common_pack_pp_params_v2(packed_param_data, ¶m_hdr, - param_data, &packed_data_size, - is_iid_supported); - if (ret) { - pr_err("%s: Failed to pack parameter header and data, error %d\n", - __func__, ret); - goto done; - } - - ret = q6afe_svc_set_params(index, NULL, packed_param_data, - packed_data_size, is_iid_supported); - -done: - kfree(packed_param_data); - return ret; -} - -static int afe_send_cal_block(u16 port_id, struct cal_block_data *cal_block) -{ - struct mem_mapping_hdr mem_hdr; - int payload_size = 0; - int result = 0; - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - - if (!cal_block) { - pr_debug("%s: No AFE cal to send!\n", __func__); - result = -EINVAL; - goto done; - } - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: AFE cal has invalid size!\n", __func__); - result = -EINVAL; - goto done; - } - - payload_size = cal_block->cal_data.size; - mem_hdr.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - mem_hdr.mem_map_handle = cal_block->map_data.q6map_handle; - - pr_debug("%s: AFE cal sent for device port = 0x%x, cal size = %zd, cal addr = 0x%pK\n", - __func__, port_id, - cal_block->cal_data.size, &cal_block->cal_data.paddr); - - result = q6afe_set_params(port_id, q6audio_get_port_index(port_id), - &mem_hdr, NULL, payload_size); - if (result) - pr_err("%s: AFE cal for port 0x%x failed %d\n", - __func__, port_id, result); - -done: - return result; -} - - -static int afe_send_custom_topology_block(struct cal_block_data *cal_block) -{ - int result = 0; - int index = 0; - struct cmd_set_topologies afe_cal; - - if (!cal_block) { - pr_err("%s: No AFE SVC cal to send!\n", __func__); - return -EINVAL; - } - if (cal_block->cal_data.size <= 0) { - pr_err("%s: AFE SVC cal has invalid size: %zd!\n", - __func__, cal_block->cal_data.size); - return -EINVAL; - } - - afe_cal.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - afe_cal.hdr.pkt_size = sizeof(afe_cal); - afe_cal.hdr.src_port = 0; - afe_cal.hdr.dest_port = 0; - afe_cal.hdr.token = index; - afe_cal.hdr.opcode = AFE_CMD_ADD_TOPOLOGIES; - - afe_cal.payload_size = cal_block->cal_data.size; - afe_cal.payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - afe_cal.payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - afe_cal.mem_map_handle = cal_block->map_data.q6map_handle; - - pr_debug("%s:cmd_id:0x%x calsize:%zd memmap_hdl:0x%x caladdr:0x%pK", - __func__, AFE_CMD_ADD_TOPOLOGIES, cal_block->cal_data.size, - afe_cal.mem_map_handle, &cal_block->cal_data.paddr); - - result = afe_apr_send_pkt(&afe_cal, &this_afe.wait[index]); - if (result) - pr_err("%s: AFE send topology for command 0x%x failed %d\n", - __func__, AFE_CMD_ADD_TOPOLOGIES, result); - - return result; -} - -static void afe_send_custom_topology(void) -{ - struct cal_block_data *cal_block = NULL; - int cal_index = AFE_CUST_TOPOLOGY_CAL; - int ret; - - if (this_afe.cal_data[cal_index] == NULL) { - pr_err("%s: cal_index %d not allocated!\n", - __func__, cal_index); - return; - } - mutex_lock(&this_afe.cal_data[cal_index]->lock); - - if (!this_afe.set_custom_topology) - goto unlock; - this_afe.set_custom_topology = 0; - cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s cal_block not found!!\n", __func__); - goto unlock; - } - - pr_debug("%s: Sending cal_index cal %d\n", __func__, cal_index); - - ret = remap_cal_data(cal_block, cal_index); - if (ret) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - goto unlock; - } - ret = afe_send_custom_topology_block(cal_block); - if (ret < 0) { - pr_err("%s: No cal sent for cal_index %d! ret %d\n", - __func__, cal_index, ret); - goto unlock; - } - pr_debug("%s:sent custom topology for AFE\n", __func__); -unlock: - mutex_unlock(&this_afe.cal_data[cal_index]->lock); -} - -static int afe_spk_ramp_dn_cfg(int port) -{ - struct param_hdr_v3 param_info; - int ret = -EINVAL; - - memset(¶m_info, 0, sizeof(param_info)); - - if (afe_get_port_type(port) != MSM_AFE_PORT_TYPE_RX) { - pr_debug("%s: port doesn't match 0x%x\n", __func__, port); - return 0; - } - if (this_afe.prot_cfg.mode == MSM_SPKR_PROT_DISABLED || - (this_afe.vi_rx_port != port)) { - pr_debug("%s: spkr protection disabled port 0x%x %d 0x%x\n", - __func__, port, ret, this_afe.vi_rx_port); - return 0; - } - param_info.module_id = AFE_MODULE_FB_SPKR_PROT_V2_RX; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_FBSP_PTONE_RAMP_CFG; - param_info.param_size = 0; - - ret = q6afe_pack_and_set_param_in_band(port, - q6audio_get_port_index(port), - param_info, NULL); - if (ret) { - pr_err("%s: Failed to set speaker ramp duration param, err %d\n", - __func__, ret); - goto fail_cmd; - } - - /* dsp needs atleast 15ms to ramp down pilot tone*/ - usleep_range(15000, 15010); - ret = 0; -fail_cmd: - pr_debug("%s: config.pdata.param_id 0x%x status %d\n", __func__, - param_info.param_id, ret); - return ret; -} - -static int afe_spk_prot_prepare(int src_port, int dst_port, int param_id, - union afe_spkr_prot_config *prot_config) -{ - struct param_hdr_v3 param_info; - int ret = -EINVAL; - - memset(¶m_info, 0, sizeof(param_info)); - - ret = q6audio_validate_port(src_port); - if (ret < 0) { - pr_err("%s: Invalid src port 0x%x ret %d", __func__, src_port, - ret); - ret = -EINVAL; - goto fail_cmd; - } - ret = q6audio_validate_port(dst_port); - if (ret < 0) { - pr_err("%s: Invalid dst port 0x%x ret %d", __func__, - dst_port, ret); - ret = -EINVAL; - goto fail_cmd; - } - - switch (param_id) { - case AFE_PARAM_ID_FBSP_MODE_RX_CFG: - case AFE_PARAM_ID_SP_RX_LIMITER_TH: - param_info.module_id = AFE_MODULE_FB_SPKR_PROT_V2_RX; - break; - case AFE_PARAM_ID_FEEDBACK_PATH_CFG: - this_afe.vi_tx_port = src_port; - this_afe.vi_rx_port = dst_port; - param_info.module_id = AFE_MODULE_FEEDBACK; - break; - /* - * AFE_PARAM_ID_SPKR_CALIB_VI_PROC_CFG_V2 is same as - * AFE_PARAM_ID_SP_V2_TH_VI_MODE_CFG. V_VALI_CFG uses - * same module TH_VI. - */ - case AFE_PARAM_ID_SPKR_CALIB_VI_PROC_CFG_V2: - case AFE_PARAM_ID_SP_V2_TH_VI_FTM_CFG: - case AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_CFG: - param_info.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_TH_VI; - break; - case AFE_PARAM_ID_SP_V2_EX_VI_MODE_CFG: - case AFE_PARAM_ID_SP_V2_EX_VI_FTM_CFG: - param_info.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI; - break; -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - case AFE_PARAM_ID_TFADSP_RX_CFG: - case AFE_PARAM_ID_TFADSP_RX_SET_BYPASS: - param_info.module_id = AFE_MODULE_ID_TFADSP_RX; - break; - case AFE_PARAM_ID_TFADSP_TX_SET_ENABLE: - param_info.module_id = AFE_MODULE_ID_TFADSP_TX; - break; -#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ - default: - pr_err("%s: default case 0x%x\n", __func__, param_id); - goto fail_cmd; - } - - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = param_id; - param_info.param_size = sizeof(union afe_spkr_prot_config); - - ret = q6afe_pack_and_set_param_in_band(src_port, - q6audio_get_port_index(src_port), - param_info, (u8 *) prot_config); - if (ret) - pr_err("%s: port = 0x%x param = 0x%x failed %d\n", __func__, - src_port, param_id, ret); - -fail_cmd: - pr_debug("%s: config.pdata.param_id 0x%x status %d 0x%x\n", __func__, - param_info.param_id, ret, src_port); - return ret; -} - -static int afe_spkr_prot_reg_event_cfg(u16 port_id) -{ - struct afe_port_cmd_event_cfg *config; - struct afe_port_cmd_mod_evt_cfg_payload pl; - int index; - int ret; - int num_events = 1; - int cmd_size = sizeof(struct afe_port_cmd_event_cfg) + - (num_events * sizeof(struct afe_port_cmd_mod_evt_cfg_payload)); - - config = kzalloc(cmd_size, GFP_KERNEL); - if (!config) - return -ENOMEM; - - index = q6audio_get_port_index(port_id); - if (index < 0) { - pr_err("%s: Invalid index number: %d\n", __func__, index); - ret = -EINVAL; - goto fail_idx; - } - - memset(&pl, 0, sizeof(pl)); - pl.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI; - pl.event_id = AFE_PORT_SP_DC_DETECTION_EVENT; - pl.reg_flag = AFE_MODULE_REGISTER_EVENT_FLAG; - - - config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - config->hdr.pkt_size = cmd_size; - config->hdr.src_port = 0; - config->hdr.dest_port = 0; - config->hdr.token = index; - - config->hdr.opcode = AFE_PORT_CMD_MOD_EVENT_CFG; - config->port_id = q6audio_get_port_id(port_id); - config->num_events = num_events; - config->version = 1; - memcpy(config->payload, &pl, sizeof(pl)); - ret = afe_apr_send_pkt((uint32_t *) config, &this_afe.wait[index]); - -fail_idx: - kfree(config); - return ret; -} - -afe_ultrasound_state_t elus_afe = { - .ptr_apr= &this_afe.apr, - .ptr_status= &this_afe.status, - .ptr_state= &this_afe.state, - .ptr_wait= this_afe.wait, - .timeout_ms= TIMEOUT_MS, -}; -EXPORT_SYMBOL(elus_afe); - -/* for mius start */ -#ifdef CONFIG_US_PROXIMITY -afe_mi_ultrasound_state_t mius_afe = { - .ptr_apr= &this_afe.apr, - .ptr_status= &this_afe.status, - .ptr_state= &this_afe.state, - .ptr_wait= this_afe.wait, - .timeout_ms= TIMEOUT_MS, -}; -EXPORT_SYMBOL(mius_afe); -#endif -/* for mius end */ - -static void afe_send_cal_spkr_prot_tx(int port_id) -{ - union afe_spkr_prot_config afe_spk_config; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL || - this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL || - this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL] == NULL) - return; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - if ((this_afe.prot_cfg.mode != MSM_SPKR_PROT_DISABLED) && - (this_afe.vi_tx_port == port_id)) { - if (this_afe.prot_cfg.mode == - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) { - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_CALIBRATION; - afe_spk_config.vi_proc_cfg.quick_calib_flag = - this_afe.prot_cfg.quick_calib_flag; - } else { - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_PROCESSING; - } - - if (this_afe.th_ftm_cfg.mode == MSM_SPKR_PROT_IN_FTM_MODE) - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_FTM_MODE; - else if (this_afe.v_vali_cfg.mode == - MSM_SPKR_PROT_IN_V_VALI_MODE) - afe_spk_config.vi_proc_cfg.operation_mode = - Q6AFE_MSM_SPKR_V_VALI_MODE; - afe_spk_config.vi_proc_cfg.minor_version = 1; - afe_spk_config.vi_proc_cfg.r0_cali_q24[SP_V2_SPKR_1] = - (uint32_t) this_afe.prot_cfg.r0[SP_V2_SPKR_1]; - afe_spk_config.vi_proc_cfg.r0_cali_q24[SP_V2_SPKR_2] = - (uint32_t) this_afe.prot_cfg.r0[SP_V2_SPKR_2]; - afe_spk_config.vi_proc_cfg.t0_cali_q6[SP_V2_SPKR_1] = - (uint32_t) this_afe.prot_cfg.t0[SP_V2_SPKR_1]; - afe_spk_config.vi_proc_cfg.t0_cali_q6[SP_V2_SPKR_2] = - (uint32_t) this_afe.prot_cfg.t0[SP_V2_SPKR_2]; - if (this_afe.prot_cfg.mode != MSM_SPKR_PROT_NOT_CALIBRATED) { - struct asm_spkr_calib_vi_proc_cfg *vi_proc_cfg; - - vi_proc_cfg = &afe_spk_config.vi_proc_cfg; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_1] = - USE_CALIBRATED_R0TO; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_2] = - USE_CALIBRATED_R0TO; - } else { - struct asm_spkr_calib_vi_proc_cfg *vi_proc_cfg; - - vi_proc_cfg = &afe_spk_config.vi_proc_cfg; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_1] = - USE_SAFE_R0TO; - vi_proc_cfg->r0_t0_selection_flag[SP_V2_SPKR_2] = - USE_SAFE_R0TO; - } - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SPKR_CALIB_VI_PROC_CFG_V2, - &afe_spk_config)) - pr_err("%s: SPKR_CALIB_VI_PROC_CFG failed\n", - __func__); - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - if ((this_afe.th_ftm_cfg.mode == MSM_SPKR_PROT_IN_FTM_MODE) && - (this_afe.vi_tx_port == port_id)) { - afe_spk_config.th_vi_ftm_cfg.minor_version = 1; - afe_spk_config.th_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_1] = - this_afe.th_ftm_cfg.wait_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_2] = - this_afe.th_ftm_cfg.wait_time[SP_V2_SPKR_2]; - afe_spk_config.th_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_1] = - this_afe.th_ftm_cfg.ftm_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_2] = - this_afe.th_ftm_cfg.ftm_time[SP_V2_SPKR_2]; - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_TH_VI_FTM_CFG, - &afe_spk_config)) - pr_err("%s: th vi ftm cfg failed\n", __func__); - this_afe.th_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - } else if ((this_afe.v_vali_cfg.mode == - MSM_SPKR_PROT_IN_V_VALI_MODE) && - (this_afe.vi_tx_port == port_id)) { - afe_spk_config.th_vi_v_vali_cfg.minor_version = 1; - afe_spk_config.th_vi_v_vali_cfg.wait_time_ms[SP_V2_SPKR_1] = - this_afe.v_vali_cfg.wait_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_v_vali_cfg.wait_time_ms[SP_V2_SPKR_2] = - this_afe.v_vali_cfg.wait_time[SP_V2_SPKR_2]; - afe_spk_config.th_vi_v_vali_cfg.vali_time_ms[SP_V2_SPKR_1] = - this_afe.v_vali_cfg.vali_time[SP_V2_SPKR_1]; - afe_spk_config.th_vi_v_vali_cfg.vali_time_ms[SP_V2_SPKR_2] = - this_afe.v_vali_cfg.vali_time[SP_V2_SPKR_2]; - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_CFG, - &afe_spk_config)) - pr_err("%s: th vi v-vali cfg failed\n", __func__); - - this_afe.v_vali_cfg.mode = MSM_SPKR_PROT_DISABLED; - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - if ((this_afe.ex_ftm_cfg.mode == MSM_SPKR_PROT_IN_FTM_MODE) && - (this_afe.vi_tx_port == port_id)) { - afe_spk_config.ex_vi_mode_cfg.minor_version = 1; - afe_spk_config.ex_vi_mode_cfg.operation_mode = - Q6AFE_MSM_SPKR_FTM_MODE; - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_EX_VI_MODE_CFG, - &afe_spk_config)) - pr_err("%s: ex vi mode cfg failed\n", __func__); - - afe_spk_config.ex_vi_ftm_cfg.minor_version = 1; - afe_spk_config.ex_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_1] = - this_afe.ex_ftm_cfg.wait_time[SP_V2_SPKR_1]; - afe_spk_config.ex_vi_ftm_cfg.wait_time_ms[SP_V2_SPKR_2] = - this_afe.ex_ftm_cfg.wait_time[SP_V2_SPKR_2]; - afe_spk_config.ex_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_1] = - this_afe.ex_ftm_cfg.ftm_time[SP_V2_SPKR_1]; - afe_spk_config.ex_vi_ftm_cfg.ftm_time_ms[SP_V2_SPKR_2] = - this_afe.ex_ftm_cfg.ftm_time[SP_V2_SPKR_2]; - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_V2_EX_VI_FTM_CFG, - &afe_spk_config)) - pr_err("%s: ex vi ftm cfg failed\n", __func__); - this_afe.ex_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - - /* Register for DC detection event if speaker protection is enabled */ - if (this_afe.prot_cfg.mode != MSM_SPKR_PROT_DISABLED && - (this_afe.vi_tx_port == port_id)) { - afe_spkr_prot_reg_event_cfg(port_id); - } -} - -static void afe_send_cal_spkr_prot_rx(int port_id) -{ - union afe_spkr_prot_config afe_spk_config; - union afe_spkr_prot_config afe_spk_limiter_config; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - - if (this_afe.prot_cfg.mode != MSM_SPKR_PROT_DISABLED && - (this_afe.vi_rx_port == port_id)) { - if (this_afe.prot_cfg.mode == - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) - afe_spk_config.mode_rx_cfg.mode = - Q6AFE_MSM_SPKR_CALIBRATION; - else - afe_spk_config.mode_rx_cfg.mode = - Q6AFE_MSM_SPKR_PROCESSING; - afe_spk_config.mode_rx_cfg.minor_version = 1; - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_FBSP_MODE_RX_CFG, - &afe_spk_config)) - pr_err("%s: RX MODE_VI_PROC_CFG failed\n", - __func__); - - if (afe_spk_config.mode_rx_cfg.mode == - Q6AFE_MSM_SPKR_PROCESSING) { - if (this_afe.prot_cfg.sp_version >= - AFE_API_VERSION_SUPPORT_SPV3) { - afe_spk_limiter_config.limiter_th_cfg. - minor_version = 1; - afe_spk_limiter_config.limiter_th_cfg. - lim_thr_per_calib_q27[SP_V2_SPKR_1] = - this_afe.prot_cfg.limiter_th[SP_V2_SPKR_1]; - afe_spk_limiter_config.limiter_th_cfg. - lim_thr_per_calib_q27[SP_V2_SPKR_2] = - this_afe.prot_cfg.limiter_th[SP_V2_SPKR_2]; - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_SP_RX_LIMITER_TH, - &afe_spk_limiter_config)) - pr_err("%s: SP_RX_LIMITER_TH failed.\n", - __func__); - } else { - pr_debug("%s: SPv3 failed to apply on AFE API version=%d.\n", - __func__, - this_afe.prot_cfg.sp_version); - } - } - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); -done: - return; -} - -static int afe_send_hw_delay(u16 port_id, u32 rate) -{ - struct audio_cal_hw_delay_entry delay_entry; - struct afe_param_id_device_hw_delay_cfg hw_delay; - struct param_hdr_v3 param_info; - int ret = -EINVAL; - - pr_debug("%s:\n", __func__); - - memset(&delay_entry, 0, sizeof(delay_entry)); - memset(¶m_info, 0, sizeof(param_info)); - - delay_entry.sample_rate = rate; - if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) - ret = afe_get_cal_hw_delay(TX_DEVICE, &delay_entry); - else if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) - ret = afe_get_cal_hw_delay(RX_DEVICE, &delay_entry); - - /* - * HW delay is only used for IMS calls to sync audio with video - * It is only needed for devices & sample rates used for IMS video - * calls. Values are received from ACDB calbration files - */ - if (ret != 0) { - pr_debug("%s: debug: HW delay info not available %d\n", - __func__, ret); - goto fail_cmd; - } - - param_info.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_DEVICE_HW_DELAY; - param_info.param_size = sizeof(hw_delay); - - hw_delay.delay_in_us = delay_entry.delay_usec; - hw_delay.device_hw_delay_minor_version = - AFE_API_VERSION_DEVICE_HW_DELAY; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &hw_delay); - if (ret) - pr_err("%s: AFE hw delay for port 0x%x failed %d\n", - __func__, port_id, ret); - -fail_cmd: - pr_debug("%s: port_id 0x%x rate %u delay_usec %d status %d\n", - __func__, port_id, rate, delay_entry.delay_usec, ret); - return ret; -} - -static struct cal_block_data *afe_find_cal_topo_id_by_port( - struct cal_type_data *cal_type, u16 port_id) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - int32_t path; - struct audio_cal_info_afe_top *afe_top; - int afe_port_index = q6audio_get_port_index(port_id); - - if (afe_port_index < 0) - goto err_exit; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - cal_block = list_entry(ptr, - struct cal_block_data, list); - /* Skip cal_block if it is already marked stale */ - if (cal_utils_is_cal_stale(cal_block)) - continue; - path = ((afe_get_port_type(port_id) == - MSM_AFE_PORT_TYPE_TX)?(TX_DEVICE):(RX_DEVICE)); - afe_top = - (struct audio_cal_info_afe_top *)cal_block->cal_info; - if (afe_top->path == path) { - if (this_afe.dev_acdb_id[afe_port_index] > 0) { - if (afe_top->acdb_id == - this_afe.dev_acdb_id[afe_port_index]) { - pr_debug("%s: top_id:%x acdb_id:%d afe_port_id:%d\n", - __func__, afe_top->topology, - afe_top->acdb_id, - q6audio_get_port_id(port_id)); - return cal_block; - } - } else { - pr_debug("%s: top_id:%x acdb_id:%d afe_port:%d\n", - __func__, afe_top->topology, afe_top->acdb_id, - q6audio_get_port_id(port_id)); - return cal_block; - } - } - } - -err_exit: - return NULL; -} - -/* - * Retrieving cal_block will mark cal_block as stale. - * Hence it cannot be reused or resent unless the flag - * is reset. - */ -static int afe_get_cal_topology_id(u16 port_id, u32 *topology_id, - int cal_type_index) -{ - int ret = 0; - - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_afe_top *afe_top_info = NULL; - - if (this_afe.cal_data[cal_type_index] == NULL) { - pr_err("%s: cal_type %d not initialized\n", __func__, - cal_type_index); - return -EINVAL; - } - if (topology_id == NULL) { - pr_err("%s: topology_id is NULL\n", __func__); - return -EINVAL; - } - *topology_id = 0; - - mutex_lock(&this_afe.cal_data[cal_type_index]->lock); - cal_block = afe_find_cal_topo_id_by_port( - this_afe.cal_data[cal_type_index], port_id); - if (cal_block == NULL) { - pr_err("%s: cal_type %d not initialized for this port %d\n", - __func__, cal_type_index, port_id); - ret = -EINVAL; - goto unlock; - } - - afe_top_info = ((struct audio_cal_info_afe_top *) - cal_block->cal_info); - if (!afe_top_info->topology) { - pr_err("%s: invalid topology id : [%d, %d]\n", - __func__, afe_top_info->acdb_id, afe_top_info->topology); - ret = -EINVAL; - goto unlock; - } - *topology_id = (u32)afe_top_info->topology; - cal_utils_mark_cal_used(cal_block); - - pr_debug("%s: port_id = %u acdb_id = %d topology_id = %u ret=%d\n", - __func__, port_id, afe_top_info->acdb_id, - afe_top_info->topology, ret); -unlock: - mutex_unlock(&this_afe.cal_data[cal_type_index]->lock); - return ret; -} - -static int afe_send_port_topology_id(u16 port_id) -{ - struct afe_param_id_set_topology_cfg topology; - struct param_hdr_v3 param_info; - u32 topology_id = 0; - int index = 0; - int ret = 0; - - memset(&topology, 0, sizeof(topology)); - memset(¶m_info, 0, sizeof(param_info)); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - - ret = afe_get_cal_topology_id(port_id, &topology_id, AFE_TOPOLOGY_CAL); - if (ret < 0) { - pr_debug("%s: Check for LSM topology\n", __func__); - ret = afe_get_cal_topology_id(port_id, &topology_id, - AFE_LSM_TOPOLOGY_CAL); - } - if (ret || !topology_id) { - pr_debug("%s: AFE port[%d] get_cal_topology[%d] invalid!\n", - __func__, port_id, topology_id); - goto done; - } - - param_info.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_SET_TOPOLOGY; - param_info.param_size = sizeof(topology); - - topology.minor_version = AFE_API_VERSION_TOPOLOGY_V1; - topology.topology_id = topology_id; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &topology); - if (ret) { - pr_err("%s: AFE set topology id enable for port 0x%x failed %d\n", - __func__, port_id, ret); - goto done; - } - - this_afe.topology[index] = topology_id; - rtac_update_afe_topology(port_id); -done: - pr_debug("%s: AFE set topology id 0x%x enable for port 0x%x ret %d\n", - __func__, topology_id, port_id, ret); - return ret; - -} - - -static int afe_get_island_mode(u16 port_id, u32 *island_mode) -{ - int ret = 0; - int index = 0; - *island_mode = 0; - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - - *island_mode = this_afe.island_mode[index]; - return ret; -} - -/* - * afe_send_port_island_mode - - * for sending island mode to AFE - * - * @port_id: AFE port id number - * - * Returns 0 on success or error on failure. - */ -int afe_send_port_island_mode(u16 port_id) -{ - struct afe_param_id_island_cfg_t island_cfg; - struct param_hdr_v3 param_info; - u32 island_mode = 0; - int ret = 0; - - memset(&island_cfg, 0, sizeof(island_cfg)); - memset(¶m_info, 0, sizeof(param_info)); - - ret = afe_get_island_mode(port_id, &island_mode); - if (ret) { - pr_err("%s: AFE port[%d] get island mode is invalid!\n", - __func__, port_id); - return ret; - } - param_info.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_ISLAND_CONFIG; - param_info.param_size = sizeof(island_cfg); - - island_cfg.island_cfg_minor_version = AFE_API_VERSION_ISLAND_CONFIG; - island_cfg.island_enable = island_mode; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &island_cfg); - if (ret) { - pr_err("%s: AFE set island mode enable for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - pr_debug("%s: AFE set island mode 0x%x enable for port 0x%x ret %d\n", - __func__, island_mode, port_id, ret); - return ret; -} -EXPORT_SYMBOL(afe_send_port_island_mode); - -static int afe_get_vad_preroll_cfg(u16 port_id, u32 *preroll_cfg) -{ - int ret = 0; - int index = 0; - *preroll_cfg = 0; - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - - *preroll_cfg = this_afe.vad_cfg[index].pre_roll; - return ret; -} - -static int afe_send_port_vad_cfg_params(u16 port_id) -{ - struct afe_param_id_vad_cfg_t vad_cfg; - struct param_hdr_v3 param_info; - u32 pre_roll_cfg = 0; - struct firmware_cal *hwdep_cal = NULL; - int ret = 0; - - memset(&vad_cfg, 0, sizeof(vad_cfg)); - memset(¶m_info, 0, sizeof(param_info)); - - ret = afe_get_vad_preroll_cfg(port_id, &pre_roll_cfg); - if (ret) { - pr_err("%s: AFE port[%d] get preroll cfg is invalid!\n", - __func__, port_id); - return ret; - } - param_info.module_id = AFE_MODULE_VAD; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_VAD_CFG; - param_info.param_size = sizeof(vad_cfg); - - vad_cfg.vad_cfg_minor_version = AFE_API_VERSION_VAD_CFG; - vad_cfg.pre_roll_in_ms = pre_roll_cfg; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) &vad_cfg); - if (ret) { - pr_err("%s: AFE set vad cfg for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - - memset(¶m_info, 0, sizeof(param_info)); - - hwdep_cal = q6afecal_get_fw_cal(this_afe.fw_data, Q6AFE_VAD_CORE_CAL); - if (!hwdep_cal) { - pr_err("%s: error in retrieving vad core calibration", - __func__); - return -EINVAL; - } - - param_info.module_id = AFE_MODULE_VAD; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_VAD_CORE_CFG; - param_info.param_size = hwdep_cal->size; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, (u8 *) hwdep_cal->data); - if (ret) { - pr_err("%s: AFE set vad cfg for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - pr_debug("%s: AFE set preroll cfg %d vad core cfg port 0x%x ret %d\n", - __func__, pre_roll_cfg, port_id, ret); - return ret; -} - -static int remap_cal_data(struct cal_block_data *cal_block, int cal_index) -{ - int ret = 0; - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - atomic_set(&this_afe.mem_map_cal_index, cal_index); - ret = afe_cmd_memory_map(cal_block->cal_data.paddr, - cal_block->map_data.map_size); - atomic_set(&this_afe.mem_map_cal_index, -1); - if (ret < 0) { - pr_err("%s: mmap did not work! size = %zd ret %d\n", - __func__, - cal_block->map_data.map_size, ret); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_afe. - mem_map_cal_handles[cal_index]); - } -done: - return ret; -} - -static struct cal_block_data *afe_find_cal(int cal_index, int port_id) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_afe *afe_cal_info = NULL; - int afe_port_index = q6audio_get_port_index(port_id); - - pr_debug("%s: cal_index %d port_id %d port_index %d\n", __func__, - cal_index, port_id, afe_port_index); - if (afe_port_index < 0) { - pr_err("%s: Error getting AFE port index %d\n", - __func__, afe_port_index); - goto exit; - } - - list_for_each_safe(ptr, next, - &this_afe.cal_data[cal_index]->cal_blocks) { - cal_block = list_entry(ptr, struct cal_block_data, list); - afe_cal_info = cal_block->cal_info; - if ((afe_cal_info->acdb_id == - this_afe.dev_acdb_id[afe_port_index]) && - (afe_cal_info->sample_rate == - this_afe.afe_sample_rates[afe_port_index])) { - pr_debug("%s: cal block is a match, size is %zd\n", - __func__, cal_block->cal_data.size); - goto exit; - } - } - pr_debug("%s: no matching cal_block found\n", __func__); - cal_block = NULL; - -exit: - return cal_block; -} - -static int send_afe_cal_type(int cal_index, int port_id) -{ - struct cal_block_data *cal_block = NULL; - int ret; - int afe_port_index = q6audio_get_port_index(port_id); - - pr_debug("%s:\n", __func__); - - if (this_afe.cal_data[cal_index] == NULL) { - pr_warn("%s: cal_index %d not allocated!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if (afe_port_index < 0) { - pr_err("%s: Error getting AFE port index %d\n", - __func__, afe_port_index); - ret = -EINVAL; - goto done; - } - - mutex_lock(&this_afe.cal_data[cal_index]->lock); - - if (((cal_index == AFE_COMMON_RX_CAL) || - (cal_index == AFE_COMMON_TX_CAL) || - (cal_index == AFE_LSM_TX_CAL)) && - (this_afe.dev_acdb_id[afe_port_index] > 0)) - cal_block = afe_find_cal(cal_index, port_id); - else - cal_block = cal_utils_get_only_cal_block( - this_afe.cal_data[cal_index]); - - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s cal_block not found!!\n", __func__); - ret = -EINVAL; - goto unlock; - } - - pr_debug("%s: Sending cal_index cal %d\n", __func__, cal_index); - - ret = remap_cal_data(cal_block, cal_index); - if (ret) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto unlock; - } - ret = afe_send_cal_block(port_id, cal_block); - if (ret < 0) - pr_debug("%s: No cal sent for cal_index %d, port_id = 0x%x! ret %d\n", - __func__, cal_index, port_id, ret); - - cal_utils_mark_cal_used(cal_block); - -unlock: - mutex_unlock(&this_afe.cal_data[cal_index]->lock); -done: - return ret; -} - -void afe_send_cal(u16 port_id) -{ - int ret; - - pr_debug("%s: port_id=0x%x\n", __func__, port_id); - - if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) { - afe_send_cal_spkr_prot_tx(port_id); - ret = send_afe_cal_type(AFE_COMMON_TX_CAL, port_id); - if (ret < 0) - send_afe_cal_type(AFE_LSM_TX_CAL, port_id); - } else if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) { - send_afe_cal_type(AFE_COMMON_RX_CAL, port_id); - afe_send_cal_spkr_prot_rx(port_id); - } -} - -int afe_turn_onoff_hw_mad(u16 mad_type, u16 enable) -{ - struct afe_param_hw_mad_ctrl mad_enable_param; - struct param_hdr_v3 param_info; - int ret; - - pr_debug("%s: enter\n", __func__); - - memset(&mad_enable_param, 0, sizeof(mad_enable_param)); - memset(¶m_info, 0, sizeof(param_info)); - param_info.module_id = AFE_MODULE_HW_MAD; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = AFE_PARAM_ID_HW_MAD_CTRL; - param_info.param_size = sizeof(mad_enable_param); - - mad_enable_param.minor_version = 1; - mad_enable_param.mad_type = mad_type; - mad_enable_param.mad_enable = enable; - - ret = q6afe_pack_and_set_param_in_band(SLIMBUS_5_TX, IDX_GLOBAL_CFG, - param_info, - (u8 *) &mad_enable_param); - if (ret) - pr_err("%s: AFE_PARAM_ID_HW_MAD_CTRL failed %d\n", __func__, - ret); - return ret; -} - -static int afe_send_slimbus_slave_cfg( - struct afe_param_cdc_slimbus_slave_cfg *sb_slave_cfg) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter\n", __func__); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_SLIMBUS_SLAVE_CFG; - param_hdr.param_size = sizeof(struct afe_param_cdc_slimbus_slave_cfg); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) sb_slave_cfg); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_SLIMBUS_SLAVE_CFG failed %d\n", - __func__, ret); - - pr_debug("%s: leave %d\n", __func__, ret); - return ret; -} - -static int afe_send_codec_reg_page_config( - struct afe_param_cdc_reg_page_cfg *cdc_reg_page_cfg) -{ - struct param_hdr_v3 param_hdr; - int ret; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_REG_PAGE_CFG; - param_hdr.param_size = sizeof(struct afe_param_cdc_reg_page_cfg); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) cdc_reg_page_cfg); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_REG_PAGE_CFG failed %d\n", - __func__, ret); - - return ret; -} - -static int afe_send_codec_reg_config( - struct afe_param_cdc_reg_cfg_data *cdc_reg_cfg) -{ - u8 *packed_param_data = NULL; - u32 packed_data_size = 0; - u32 single_param_size = 0; - u32 max_data_size = 0; - u32 max_single_param = 0; - struct param_hdr_v3 param_hdr; - int idx = 0; - int ret = -EINVAL; - bool is_iid_supported = q6common_is_instance_id_supported(); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - max_single_param = sizeof(struct param_hdr_v3) + - sizeof(struct afe_param_cdc_reg_cfg); - max_data_size = APR_MAX_BUF - sizeof(struct afe_svc_cmd_set_param_v2); - packed_param_data = kzalloc(max_data_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - - /* param_hdr is the same for all params sent, set once at top */ - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_REG_CFG; - param_hdr.param_size = sizeof(struct afe_param_cdc_reg_cfg); - - while (idx < cdc_reg_cfg->num_registers) { - memset(packed_param_data, 0, max_data_size); - packed_data_size = 0; - single_param_size = 0; - - while (packed_data_size + max_single_param < max_data_size && - idx < cdc_reg_cfg->num_registers) { - ret = q6common_pack_pp_params_v2( - packed_param_data + packed_data_size, - ¶m_hdr, (u8 *) &cdc_reg_cfg->reg_data[idx], - &single_param_size, is_iid_supported); - if (ret) { - pr_err("%s: Failed to pack parameters with error %d\n", - __func__, ret); - goto done; - } - packed_data_size += single_param_size; - idx++; - } - - ret = q6afe_svc_set_params(IDX_GLOBAL_CFG, NULL, - packed_param_data, packed_data_size, - is_iid_supported); - if (ret) { - pr_err("%s: AFE_PARAM_ID_CDC_REG_CFG failed %d\n", - __func__, ret); - break; - } - } -done: - kfree(packed_param_data); - return ret; -} - -static int afe_init_cdc_reg_config(void) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter\n", __func__); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_REG_CFG_INIT; - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - NULL); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_INIT_REG_CFG failed %d\n", - __func__, ret); - - return ret; -} - -static int afe_send_slimbus_slave_port_cfg( - struct afe_param_slimbus_slave_port_cfg *slim_slave_config, u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter, port_id = 0x%x\n", __func__, port_id); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_HW_MAD; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.reserved = 0; - param_hdr.param_id = AFE_PARAM_ID_SLIMBUS_SLAVE_PORT_CFG; - param_hdr.param_size = sizeof(struct afe_param_slimbus_slave_port_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) slim_slave_config); - if (ret) - pr_err("%s: AFE_PARAM_ID_SLIMBUS_SLAVE_PORT_CFG failed %d\n", - __func__, ret); - - pr_debug("%s: leave %d\n", __func__, ret); - return ret; -} -static int afe_aanc_port_cfg(void *apr, uint16_t tx_port, uint16_t rx_port) -{ - struct afe_param_aanc_port_cfg aanc_port_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s: tx_port 0x%x, rx_port 0x%x\n", - __func__, tx_port, rx_port); - - pr_debug("%s: AANC sample rate tx rate: %d rx rate %d\n", __func__, - this_afe.aanc_info.aanc_tx_port_sample_rate, - this_afe.aanc_info.aanc_rx_port_sample_rate); - - memset(&aanc_port_cfg, 0, sizeof(aanc_port_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /* - * If aanc tx sample rate or rx sample rate is zero, skip aanc - * configuration as AFE resampler will fail for invalid sample - * rates. - */ - if (!this_afe.aanc_info.aanc_tx_port_sample_rate || - !this_afe.aanc_info.aanc_rx_port_sample_rate) { - return -EINVAL; - } - - param_hdr.module_id = AFE_MODULE_AANC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_AANC_PORT_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_aanc_port_cfg); - - aanc_port_cfg.aanc_port_cfg_minor_version = - AFE_API_VERSION_AANC_PORT_CONFIG; - aanc_port_cfg.tx_port_sample_rate = - this_afe.aanc_info.aanc_tx_port_sample_rate; - aanc_port_cfg.tx_port_channel_map[0] = AANC_TX_VOICE_MIC; - aanc_port_cfg.tx_port_channel_map[1] = AANC_TX_NOISE_MIC; - aanc_port_cfg.tx_port_channel_map[2] = AANC_TX_ERROR_MIC; - aanc_port_cfg.tx_port_channel_map[3] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[4] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[5] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[6] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_channel_map[7] = AANC_TX_MIC_UNUSED; - aanc_port_cfg.tx_port_num_channels = 3; - aanc_port_cfg.rx_path_ref_port_id = rx_port; - aanc_port_cfg.ref_port_sample_rate = - this_afe.aanc_info.aanc_rx_port_sample_rate; - - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, - (u8 *) &aanc_port_cfg); - if (ret) - pr_err("%s: AFE AANC port config failed for tx_port 0x%x, rx_port 0x%x ret %d\n", - __func__, tx_port, rx_port, ret); - else - q6afe_set_aanc_level(); - - return ret; -} - -static int afe_aanc_mod_enable(void *apr, uint16_t tx_port, uint16_t enable) -{ - struct afe_mod_enable_param mod_enable; - struct param_hdr_v3 param_hdr; - int ret = 0; - - pr_debug("%s: tx_port 0x%x\n", __func__, tx_port); - - memset(&mod_enable, 0, sizeof(mod_enable)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AANC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_ENABLE; - param_hdr.param_size = sizeof(struct afe_mod_enable_param); - - mod_enable.enable = enable; - mod_enable.reserved = 0; - - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, (u8 *) &mod_enable); - if (ret) - pr_err("%s: AFE AANC enable failed for tx_port 0x%x ret %d\n", - __func__, tx_port, ret); - return ret; -} - -static int afe_send_bank_selection_clip( - struct afe_param_id_clip_bank_sel *param) -{ - struct param_hdr_v3 param_hdr; - int ret; - - if (!param) { - pr_err("%s: Invalid params", __func__); - return -EINVAL; - } - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CLIP_BANK_SEL_CFG; - param_hdr.param_size = sizeof(struct afe_param_id_clip_bank_sel); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) param); - if (ret) - pr_err("%s: AFE_PARAM_ID_CLIP_BANK_SEL_CFG failed %d\n", - __func__, ret); - return ret; -} -int afe_send_aanc_version( - struct afe_param_id_cdc_aanc_version *version_cfg) -{ - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: enter\n", __func__); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_CDC_DEV_CFG; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CDC_AANC_VERSION; - param_hdr.param_size = sizeof(struct afe_param_id_cdc_aanc_version); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) version_cfg); - if (ret) - pr_err("%s: AFE_PARAM_ID_CDC_AANC_VERSION failed %d\n", - __func__, ret); - return ret; -} - -/** - * afe_port_set_mad_type - - * to update mad type - * - * @port_id: AFE port id number - * @mad_type: MAD type enum value - * - * Returns 0 on success or error on failure. - */ -int afe_port_set_mad_type(u16 port_id, enum afe_mad_type mad_type) -{ - int i; - - if (port_id == AFE_PORT_ID_TERTIARY_MI2S_TX || - port_id == AFE_PORT_ID_INT3_MI2S_TX || - port_id == AFE_PORT_ID_TX_CODEC_DMA_TX_3) { - mad_type = MAD_SW_AUDIO; - return 0; - } - - i = port_id - SLIMBUS_0_RX; - if (i < 0 || i >= ARRAY_SIZE(afe_ports_mad_type)) { - pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id); - return -EINVAL; - } - atomic_set(&afe_ports_mad_type[i], mad_type); - return 0; -} -EXPORT_SYMBOL(afe_port_set_mad_type); - -/** - * afe_port_get_mad_type - - * to retrieve mad type - * - * @port_id: AFE port id number - * - * Returns valid enum value on success or MAD_HW_NONE on failure. - */ -enum afe_mad_type afe_port_get_mad_type(u16 port_id) -{ - int i; - - if (port_id == AFE_PORT_ID_TERTIARY_MI2S_TX || - port_id == AFE_PORT_ID_INT3_MI2S_TX || - port_id == AFE_PORT_ID_TX_CODEC_DMA_TX_3) - return MAD_SW_AUDIO; - - i = port_id - SLIMBUS_0_RX; - if (i < 0 || i >= ARRAY_SIZE(afe_ports_mad_type)) { - pr_debug("%s: Non Slimbus port_id 0x%x\n", __func__, port_id); - return MAD_HW_NONE; - } - return (enum afe_mad_type) atomic_read(&afe_ports_mad_type[i]); -} -EXPORT_SYMBOL(afe_port_get_mad_type); - -/** - * afe_set_config - - * to configure AFE session with - * specified configuration for given config type - * - * @config_type: config type - * @config_data: configuration to pass to AFE session - * @arg: argument used in specific config types - * - * Returns 0 on success or error value on port start failure. - */ -int afe_set_config(enum afe_config_type config_type, void *config_data, int arg) -{ - int ret; - - pr_debug("%s: enter config_type %d\n", __func__, config_type); - ret = afe_q6_interface_prepare(); - if (ret) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - switch (config_type) { - case AFE_SLIMBUS_SLAVE_CONFIG: - ret = afe_send_slimbus_slave_cfg(config_data); - if (!ret) - ret = afe_init_cdc_reg_config(); - else - pr_err("%s: Sending slimbus slave config failed %d\n", - __func__, ret); - break; - case AFE_CDC_REGISTERS_CONFIG: - ret = afe_send_codec_reg_config(config_data); - break; - case AFE_SLIMBUS_SLAVE_PORT_CONFIG: - ret = afe_send_slimbus_slave_port_cfg(config_data, arg); - break; - case AFE_AANC_VERSION: - ret = afe_send_aanc_version(config_data); - break; - case AFE_CLIP_BANK_SEL: - ret = afe_send_bank_selection_clip(config_data); - break; - case AFE_CDC_CLIP_REGISTERS_CONFIG: - ret = afe_send_codec_reg_config(config_data); - break; - case AFE_CDC_REGISTER_PAGE_CONFIG: - ret = afe_send_codec_reg_page_config(config_data); - break; - default: - pr_err("%s: unknown configuration type %d", - __func__, config_type); - ret = -EINVAL; - } - - if (!ret) - set_bit(config_type, &afe_configured_cmd); - - return ret; -} -EXPORT_SYMBOL(afe_set_config); - -/* - * afe_clear_config - If SSR happens ADSP loses AFE configs, let AFE driver know - * about the state so client driver can wait until AFE is - * reconfigured. - */ -void afe_clear_config(enum afe_config_type config) -{ - clear_bit(config, &afe_configured_cmd); -} -EXPORT_SYMBOL(afe_clear_config); - -bool afe_has_config(enum afe_config_type config) -{ - return !!test_bit(config, &afe_configured_cmd); -} - -int afe_send_spdif_clk_cfg(struct afe_param_id_spdif_clk_cfg *cfg, - u16 port_id) -{ - struct afe_param_id_spdif_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SPDIF_CLK_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_spdif_clk_cfg); - - pr_debug("%s: Minor version = 0x%x clk val = %d clk root = 0x%x port id = 0x%x\n", - __func__, clk_cfg.clk_cfg_minor_version, clk_cfg.clk_value, - clk_cfg.clk_root, q6audio_get_port_id(port_id)); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE send clock config for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} - -/** - * afe_send_spdif_ch_status_cfg - - * to configure AFE session with - * specified channel status configuration - * - * @ch_status_cfg: channel status configutation - * @port_id: AFE port id number - * - * Returns 0 on success or error value on port start failure. - */ -int afe_send_spdif_ch_status_cfg(struct afe_param_id_spdif_ch_status_cfg - *ch_status_cfg, u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!ch_status_cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SPDIF_CLK_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_spdif_ch_status_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) ch_status_cfg); - if (ret < 0) - pr_err("%s: AFE send channel status for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} -EXPORT_SYMBOL(afe_send_spdif_ch_status_cfg); - -int afe_send_cmd_wakeup_register(void *handle, bool enable) -{ - struct afe_svc_cmd_evt_cfg_payload wakeup_irq; - int ret = 0; - - pr_debug("%s: enter\n", __func__); - - wakeup_irq.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - wakeup_irq.hdr.pkt_size = sizeof(wakeup_irq); - wakeup_irq.hdr.src_port = 0; - wakeup_irq.hdr.dest_port = 0; - wakeup_irq.hdr.token = 0x0; - wakeup_irq.hdr.opcode = AFE_SVC_CMD_EVENT_CFG; - wakeup_irq.event_id = AFE_EVENT_ID_MBHC_DETECTION_SW_WA; - wakeup_irq.reg_flag = enable; - pr_debug("%s: cmd wakeup register opcode[0x%x] register:%d\n", - __func__, wakeup_irq.hdr.opcode, wakeup_irq.reg_flag); - - ret = afe_apr_send_pkt(&wakeup_irq, &this_afe.wait_wakeup); - if (ret) - pr_err("%s: AFE wakeup command register %d failed %d\n", - __func__, enable, ret); - - return ret; -} -EXPORT_SYMBOL(afe_send_cmd_wakeup_register); - -static int afe_send_cmd_port_start(u16 port_id) -{ - struct afe_port_cmd_device_start start; - int ret, index; - - pr_debug("%s: enter\n", __func__); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = index; - start.hdr.opcode = AFE_PORT_CMD_DEVICE_START; - start.port_id = q6audio_get_port_id(port_id); - pr_debug("%s: cmd device start opcode[0x%x] port id[0x%x]\n", - __func__, start.hdr.opcode, start.port_id); - - ret = afe_apr_send_pkt(&start, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE enable for port 0x%x failed %d\n", __func__, - port_id, ret); - - return ret; -} - -static int afe_aanc_start(uint16_t tx_port_id, uint16_t rx_port_id) -{ - int ret; - - pr_debug("%s: Tx port is 0x%x, Rx port is 0x%x\n", - __func__, tx_port_id, rx_port_id); - ret = afe_aanc_port_cfg(this_afe.apr, tx_port_id, rx_port_id); - if (ret) { - pr_err("%s: Send AANC Port Config failed %d\n", - __func__, ret); - goto fail_cmd; - } - send_afe_cal_type(AFE_AANC_CAL, tx_port_id); - -fail_cmd: - return ret; -} - -/** - * afe_spdif_port_start - to configure AFE session with - * specified port configuration - * - * @port_id: AFE port id number - * @spdif_port: spdif port configutation - * @rate: sampling rate of port - * - * Returns 0 on success or error value on port start failure. - */ -int afe_spdif_port_start(u16 port_id, struct afe_spdif_port_config *spdif_port, - u32 rate) -{ - struct param_hdr_v3 param_hdr; - uint16_t port_index; - int ret = 0; - - if (!spdif_port) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - return ret; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - afe_send_cal(port_id); - afe_send_hw_delay(port_id, rate); - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SPDIF_CONFIG; - param_hdr.param_size = sizeof(struct afe_spdif_port_config); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) spdif_port); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[port_index] = rate; - } else { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - - if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) { - ret = afe_send_spdif_ch_status_cfg(&spdif_port->ch_status, - port_id); - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - goto fail_cmd; - } - } - - return afe_send_cmd_port_start(port_id); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_spdif_port_start); - -/** - * afe_spdif_reg_event_cfg - - * register for event from AFE spdif port - * - * @port_id: Port ID to register event - * @reg_flag: register or unregister - * @cb: callback function to invoke for events from module - * @private_data: private data to sent back in callback fn - * - * Returns 0 on success or error on failure - */ -int afe_spdif_reg_event_cfg(u16 port_id, u16 reg_flag, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data) -{ - struct afe_port_cmd_event_cfg *config; - struct afe_port_cmd_mod_evt_cfg_payload pl; - int index; - int ret; - int num_events = 1; - int cmd_size = sizeof(struct afe_port_cmd_event_cfg) + - (num_events * sizeof(struct afe_port_cmd_mod_evt_cfg_payload)); - - config = kzalloc(cmd_size, GFP_KERNEL); - if (!config) - return -ENOMEM; - - if (port_id == AFE_PORT_ID_PRIMARY_SPDIF_TX) { - this_afe.pri_spdif_tx_cb = cb; - this_afe.pri_spdif_tx_private_data = private_data; - } else if (port_id == AFE_PORT_ID_SECONDARY_SPDIF_TX) { - this_afe.sec_spdif_tx_cb = cb; - this_afe.sec_spdif_tx_private_data = private_data; - } else { - pr_err("%s: wrong port id 0x%x\n", __func__, port_id); - ret = -EINVAL; - goto fail_idx; - } - - index = q6audio_get_port_index(port_id); - if (index < 0) { - pr_err("%s: Invalid index number: %d\n", __func__, index); - ret = -EINVAL; - goto fail_idx; - } - - memset(&pl, 0, sizeof(pl)); - pl.module_id = AFE_MODULE_CUSTOM_EVENTS; - pl.event_id = AFE_PORT_FMT_UPDATE_EVENT; - pl.reg_flag = reg_flag; - - config->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - config->hdr.pkt_size = cmd_size; - config->hdr.src_port = 1; - config->hdr.dest_port = 1; - config->hdr.token = index; - - config->hdr.opcode = AFE_PORT_CMD_MOD_EVENT_CFG; - config->port_id = q6audio_get_port_id(port_id); - config->num_events = num_events; - config->version = 1; - memcpy(config->payload, &pl, sizeof(pl)); - ret = afe_apr_send_pkt((uint32_t *) config, &this_afe.wait[index]); - -fail_idx: - kfree(config); - return ret; -} -EXPORT_SYMBOL(afe_spdif_reg_event_cfg); - -int afe_send_slot_mapping_cfg( - struct afe_param_id_slot_mapping_cfg *slot_mapping_cfg, - u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!slot_mapping_cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_TDM; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_slot_mapping_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) slot_mapping_cfg); - if (ret < 0) - pr_err("%s: AFE send slot mapping for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} - -int afe_send_custom_tdm_header_cfg( - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg, - u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!custom_tdm_header_cfg) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_TDM; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CUSTOM_TDM_HEADER_CONFIG; - param_hdr.param_size = - sizeof(struct afe_param_id_custom_tdm_header_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) custom_tdm_header_cfg); - if (ret < 0) - pr_err("%s: AFE send custom tdm header for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - return ret; -} - -/** - * afe_tdm_port_start - to configure AFE session with - * specified port configuration - * - * @port_id: AFE port id number - * @tdm_port: TDM port configutation - * @rate: sampling rate of port - * @num_groups: number of TDM groups - * - * Returns 0 on success or error value on port start failure. - */ -int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port, - u32 rate, u16 num_groups) -{ - struct param_hdr_v3 param_hdr; - int index = 0; - uint16_t port_index = 0; - enum afe_mad_type mad_type = MAD_HW_NONE; - int ret = 0; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_afe_top *afe_top; - - if (!tdm_port) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if ((index >= 0) && (index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[index] = rate; - - if (this_afe.rt_cb) - this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id); - } - - port_index = afe_get_port_index(port_id); - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4) { - /* send VAD configuration if enabled */ - if (this_afe.vad_cfg[port_index].is_enable) { - ret = afe_send_port_vad_cfg_params(port_id); - if (ret) { - pr_err("%s: afe send VAD config failed %d\n", - __func__, ret); - goto fail_cmd; - } - } - } - - /* Obtain the calibration block for debug log - * Note that afe_find_cal_topo_id_by_port needs to be called before - * afe_send_cal because afe_find_cal_topo_id_by_port only finds blocks - * that have not been used and afe_send_cal marks the cal_block as used - * after executed. - * - * References: - * afe_send_cal --> send_afe_cal_type --> cal_utils_mark_cal_used - */ - cal_block = afe_find_cal_topo_id_by_port( - this_afe.cal_data[AFE_TOPOLOGY_CAL], port_id); - - /* Also send the topology id here: */ - if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) { - /* One time call: only for first time */ - afe_send_custom_topology(); - afe_send_port_topology_id(port_id); - afe_send_cal(port_id); - afe_send_hw_delay(port_id, rate); - } - - /* Start SW MAD module */ - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - if (mad_type != MAD_HW_NONE && mad_type != MAD_SW_AUDIO) { - if (!afe_has_config(AFE_CDC_REGISTERS_CONFIG) || - !afe_has_config(AFE_SLIMBUS_SLAVE_CONFIG)) { - pr_err("%s: AFE isn't configured yet for\n" - "HW MAD try Again\n", __func__); - ret = -EAGAIN; - goto fail_cmd; - } - ret = afe_turn_onoff_hw_mad(mad_type, true); - if (ret) { - pr_err("%s: afe_turn_onoff_hw_mad failed %d\n", - __func__, ret); - goto fail_cmd; - } - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_TDM_CONFIG; - param_hdr.param_size = sizeof(struct afe_param_id_tdm_cfg); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &tdm_port->tdm); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed ret = %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[port_index] = rate; - } else { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - - ret = afe_send_slot_mapping_cfg(&tdm_port->slot_mapping, - port_id); - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - goto fail_cmd; - } - - if (tdm_port->custom_tdm_header.header_type) { - ret = afe_send_custom_tdm_header_cfg( - &tdm_port->custom_tdm_header, port_id); - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - goto fail_cmd; - } - } - - if (cal_block != NULL) { - afe_top = (struct audio_cal_info_afe_top *)cal_block->cal_info; - pr_info("%s: top_id:%x acdb_id:%d port_id:0x%x\n", - __func__, afe_top->topology, afe_top->acdb_id, port_id); - } else { - pr_info("%s: port_id:0x%x\n", __func__, port_id); - } - - ret = afe_send_cmd_port_start(port_id); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_tdm_port_start); - -/** - * afe_set_cal_mode - - * set cal mode for AFE calibration - * - * @port_id: AFE port id number - * @afe_cal_mode: AFE calib mode - * - */ -void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode) -{ - uint16_t port_index; - - port_index = afe_get_port_index(port_id); - this_afe.afe_cal_mode[port_index] = afe_cal_mode; -} -EXPORT_SYMBOL(afe_set_cal_mode); - -/** - * afe_set_vad_cfg - - * set configuration for VAD - * - * @port_id: AFE port id number - * @vad_enable: enable/disable vad - * @preroll_config: Preroll configuration - * - */ -void afe_set_vad_cfg(u32 vad_enable, u32 preroll_config, - u32 port_id) -{ - uint16_t port_index; - - port_index = afe_get_port_index(port_id); - this_afe.vad_cfg[port_index].is_enable = vad_enable; - this_afe.vad_cfg[port_index].pre_roll = preroll_config; -} -EXPORT_SYMBOL(afe_set_vad_cfg); - -/** - * afe_get_island_mode_cfg - - * get island mode configuration - * - * @port_id: AFE port id number - * @enable_flag: Enable or Disable - * - */ -void afe_get_island_mode_cfg(u16 port_id, u32 *enable_flag) -{ - uint16_t port_index; - - if (enable_flag) { - port_index = afe_get_port_index(port_id); - *enable_flag = this_afe.island_mode[port_index]; - } -} -EXPORT_SYMBOL(afe_get_island_mode_cfg); - -/** - * afe_set_island_mode_cfg - - * set island mode configuration - * - * @port_id: AFE port id number - * @enable_flag: Enable or Disable - * - */ -void afe_set_island_mode_cfg(u16 port_id, u32 enable_flag) -{ - uint16_t port_index; - - port_index = afe_get_port_index(port_id); - this_afe.island_mode[port_index] = enable_flag; - -} -EXPORT_SYMBOL(afe_set_island_mode_cfg); - -/** - * afe_set_routing_callback - - * Update callback function for routing - * - * @cb: callback function to update with - * - */ -void afe_set_routing_callback(routing_cb cb) -{ - this_afe.rt_cb = cb; -} -EXPORT_SYMBOL(afe_set_routing_callback); - -int afe_port_send_usb_dev_param(u16 port_id, union afe_port_config *afe_config) -{ - struct afe_param_id_usb_audio_dev_params usb_dev; - struct afe_param_id_usb_audio_dev_lpcm_fmt lpcm_fmt; - struct afe_param_id_usb_audio_svc_interval svc_int; - struct param_hdr_v3 param_hdr; - int ret = 0, index = 0; - - if (!afe_config) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - goto exit; - } - - index = q6audio_get_port_index(port_id); - - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - memset(&usb_dev, 0, sizeof(usb_dev)); - memset(&lpcm_fmt, 0, sizeof(lpcm_fmt)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - - param_hdr.param_id = AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS; - param_hdr.param_size = sizeof(usb_dev); - usb_dev.cfg_minor_version = AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - usb_dev.dev_token = afe_config->usb_audio.dev_token; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &usb_dev); - if (ret) { - pr_err("%s: AFE device param cmd failed %d\n", - __func__, ret); - goto exit; - } - - param_hdr.param_id = AFE_PARAM_ID_USB_AUDIO_DEV_LPCM_FMT; - param_hdr.param_size = sizeof(lpcm_fmt); - lpcm_fmt.cfg_minor_version = AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - lpcm_fmt.endian = afe_config->usb_audio.endian; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &lpcm_fmt); - if (ret) { - pr_err("%s: AFE device param cmd LPCM_FMT failed %d\n", - __func__, ret); - goto exit; - } - param_hdr.param_id = AFE_PARAM_ID_USB_AUDIO_SVC_INTERVAL; - param_hdr.param_size = sizeof(svc_int); - svc_int.cfg_minor_version = - AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG; - svc_int.svc_interval = afe_config->usb_audio.service_interval; - - pr_debug("%s: AFE device param cmd sending SVC_INTERVAL %d\n", - __func__, svc_int.svc_interval); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &svc_int); - - if (ret) { - pr_err("%s: AFE device param cmd svc_interval failed %d\n", - __func__, ret); - ret = -EINVAL; - goto exit; - } -exit: - return ret; -} - -static int q6afe_send_dec_config(u16 port_id, - union afe_port_config afe_config, - struct afe_dec_config *cfg, - u32 format, - u16 afe_in_channels, u16 afe_in_bit_width) -{ - struct afe_dec_media_fmt_t dec_media_fmt; - struct avs_dec_depacketizer_id_param_t dec_depkt_id_param; - struct avs_dec_congestion_buffer_param_t dec_buffer_id_param; - struct afe_enc_dec_imc_info_param_t imc_info_param; - struct afe_port_media_type_t media_type; - struct param_hdr_v3 param_hdr; - int ret; - u32 dec_fmt; - - memset(&dec_depkt_id_param, 0, sizeof(dec_depkt_id_param)); - memset(&dec_media_fmt, 0, sizeof(dec_media_fmt)); - memset(&imc_info_param, 0, sizeof(imc_info_param)); - memset(&media_type, 0, sizeof(media_type)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_ID_DECODER; - param_hdr.instance_id = INSTANCE_ID_0; - - pr_debug("%s: sending AFE_DECODER_PARAM_ID_DEPACKETIZER to DSP payload\n", - __func__); - param_hdr.param_id = AFE_DECODER_PARAM_ID_DEPACKETIZER_ID; - param_hdr.param_size = sizeof(struct avs_dec_depacketizer_id_param_t); - dec_depkt_id_param.dec_depacketizer_id = - AFE_MODULE_ID_DEPACKETIZER_COP_V1; - if (cfg->format == ENC_CODEC_TYPE_LDAC) - dec_depkt_id_param.dec_depacketizer_id = - AFE_MODULE_ID_DEPACKETIZER_COP; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &dec_depkt_id_param); - if (ret) { - pr_err("%s: AFE_DECODER_PARAM_ID_DEPACKETIZER for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - switch (cfg->format) { - case ASM_MEDIA_FMT_SBC: - case ASM_MEDIA_FMT_AAC_V2: - case ASM_MEDIA_FMT_MP3: - if (port_id == SLIMBUS_9_TX) { - dec_buffer_id_param.max_nr_buffers = 200; - dec_buffer_id_param.pre_buffer_size = 200; - } else { - dec_buffer_id_param.max_nr_buffers = 0; - dec_buffer_id_param.pre_buffer_size = 0; - } - pr_debug("%s: sending AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE to DSP payload\n", - __func__); - param_hdr.param_id = - AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE; - param_hdr.param_size = - sizeof(struct avs_dec_congestion_buffer_param_t); - dec_buffer_id_param.version = 0; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &dec_buffer_id_param); - if (ret) { - pr_err("%s: AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - default: - pr_debug("%s:sending AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION to DSP payload\n", - __func__); - param_hdr.param_id = - AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION; - param_hdr.param_size = - sizeof(struct afe_enc_dec_imc_info_param_t); - imc_info_param.imc_info = cfg->abr_dec_cfg.imc_info; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &imc_info_param); - if (ret) { - pr_err("%s: AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - } - - pr_debug("%s:Sending AFE_API_VERSION_PORT_MEDIA_TYPE to DSP", __func__); - param_hdr.module_id = AFE_MODULE_PORT; - param_hdr.param_id = AFE_PARAM_ID_PORT_MEDIA_TYPE; - param_hdr.param_size = sizeof(struct afe_port_media_type_t); - media_type.minor_version = AFE_API_VERSION_PORT_MEDIA_TYPE; - switch (cfg->format) { - case ASM_MEDIA_FMT_AAC_V2: - media_type.sample_rate = - cfg->data.aac_config.sample_rate; - break; - default: - media_type.sample_rate = - afe_config.slim_sch.sample_rate; - } - if (afe_in_bit_width) - media_type.bit_width = afe_in_bit_width; - else - media_type.bit_width = afe_config.slim_sch.bit_width; - - if (afe_in_channels) - media_type.num_channels = afe_in_channels; - else - media_type.num_channels = afe_config.slim_sch.num_channels; - media_type.data_format = AFE_PORT_DATA_FORMAT_PCM; - media_type.reserved = 0; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &media_type); - if (ret) { - pr_err("%s: AFE_API_VERSION_PORT_MEDIA_TYPE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2) { - pr_debug("%s:Unsuppported dec format. Ignore AFE config %u\n", - __func__, format); - goto exit; - } - pr_debug("%s: sending AFE_DECODER_PARAM_ID_DEC_MEDIA_FMT to DSP payload\n", - __func__); - param_hdr.module_id = AFE_MODULE_ID_DECODER; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_DECODER_PARAM_ID_DEC_FMT_ID; - param_hdr.param_size = sizeof(dec_fmt); - dec_fmt = format; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &dec_fmt); - if (ret) { - pr_err("%s: AFE_DECODER_PARAM_ID_DEC_MEDIA_FMT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - switch (cfg->format) { - case ASM_MEDIA_FMT_AAC_V2: - param_hdr.param_size = sizeof(struct afe_dec_media_fmt_t); - - pr_debug("%s:send AFE_DECODER_PARAM_ID DEC_MEDIA_FMT to DSP payload\n", - __func__); - param_hdr.param_id = AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT; - dec_media_fmt.dec_media_config = cfg->data; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &dec_media_fmt); - if (ret) { - pr_err("%s: AFE_DECODER_PARAM_ID DEC_MEDIA_FMT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - break; - default: - pr_debug("%s:No need to send DEC_MEDIA_FMT to DSP payload\n", - __func__); - } - -exit: - return ret; -} - -static int q6afe_send_enc_config(u16 port_id, - union afe_enc_config_data *cfg, u32 format, - union afe_port_config afe_config, - u16 afe_in_channels, u16 afe_in_bit_width, - u32 scrambler_mode, u32 mono_mode) -{ - u32 enc_fmt; - struct afe_enc_cfg_blk_param_t enc_blk_param; - struct afe_param_id_aptx_sync_mode sync_mode_param; - struct afe_id_aptx_adaptive_enc_init aptx_adaptive_enc_init; - struct avs_enc_packetizer_id_param_t enc_pkt_id_param; - struct avs_enc_set_scrambler_param_t enc_set_scrambler_param; - struct afe_enc_level_to_bitrate_map_param_t map_param; - struct afe_enc_dec_imc_info_param_t imc_info_param; - struct asm_aac_frame_size_control_t frame_ctl_param; - struct afe_port_media_type_t media_type; - struct aptx_channel_mode_param_t channel_mode_param; - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s:update DSP for enc format = %d\n", __func__, format); - - memset(&enc_blk_param, 0, sizeof(enc_blk_param)); - memset(&sync_mode_param, 0, sizeof(sync_mode_param)); - memset(&aptx_adaptive_enc_init, 0, sizeof(aptx_adaptive_enc_init)); - memset(&enc_pkt_id_param, 0, sizeof(enc_pkt_id_param)); - memset(&enc_set_scrambler_param, 0, sizeof(enc_set_scrambler_param)); - memset(&map_param, 0, sizeof(map_param)); - memset(&imc_info_param, 0, sizeof(imc_info_param)); - memset(&frame_ctl_param, 0, sizeof(frame_ctl_param)); - memset(&media_type, 0, sizeof(media_type)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2 && - format != ASM_MEDIA_FMT_APTX && format != ASM_MEDIA_FMT_APTX_HD && - format != ASM_MEDIA_FMT_CELT && format != ASM_MEDIA_FMT_LDAC && - format != ASM_MEDIA_FMT_APTX_ADAPTIVE) { - pr_err("%s:Unsuppported enc format. Ignore AFE config\n", - __func__); - return 0; - } - - param_hdr.module_id = AFE_MODULE_ID_ENCODER; - param_hdr.instance_id = INSTANCE_ID_0; - - param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENC_FMT_ID; - param_hdr.param_size = sizeof(enc_fmt); - enc_fmt = format; - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_ENC_FMT_ID payload\n", - __func__); - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &enc_fmt); - if (ret) { - pr_err("%s:unable to send AFE_ENCODER_PARAM_ID_ENC_FMT_ID", - __func__); - goto exit; - } - - if (format == ASM_MEDIA_FMT_LDAC) { - param_hdr.param_size = sizeof(struct afe_enc_cfg_blk_param_t) - - sizeof(struct afe_abr_enc_cfg_t); - enc_blk_param.enc_cfg_blk_size = - sizeof(union afe_enc_config_data) - - sizeof(struct afe_abr_enc_cfg_t); - } else if (format == ASM_MEDIA_FMT_AAC_V2) { - param_hdr.param_size = sizeof(enc_blk_param) - - sizeof(struct asm_aac_frame_size_control_t); - enc_blk_param.enc_cfg_blk_size = - sizeof(enc_blk_param.enc_blk_config) - - sizeof(struct asm_aac_frame_size_control_t); - } else { - param_hdr.param_size = sizeof(struct afe_enc_cfg_blk_param_t); - enc_blk_param.enc_cfg_blk_size = - sizeof(union afe_enc_config_data); - } - pr_debug("%s:send AFE_ENCODER_PARAM_ID_ENC_CFG_BLK to DSP payload\n", - __func__); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENC_CFG_BLK; - enc_blk_param.enc_blk_config = *cfg; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_blk_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_ENC_CFG_BLK for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - if (format == ASM_MEDIA_FMT_AAC_V2) { - uint32_t frame_size_ctl_value = enc_blk_param.enc_blk_config. - aac_config.frame_ctl.ctl_value; - if (frame_size_ctl_value > 0) { - param_hdr.param_id = - AFE_PARAM_ID_AAC_FRM_SIZE_CONTROL; - param_hdr.param_size = sizeof(frame_ctl_param); - frame_ctl_param.ctl_type = enc_blk_param. - enc_blk_config.aac_config.frame_ctl.ctl_type; - frame_ctl_param.ctl_value = frame_size_ctl_value; - pr_debug("%s: send AFE_PARAM_ID_AAC_FRM_SIZE_CONTROL\n", - __func__); - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &frame_ctl_param); - if (ret) { - pr_err("%s: AAC_FRM_SIZE_CONTROL failed %d\n", - __func__, ret); - goto exit; - } - } - } - - if (format == ASM_MEDIA_FMT_APTX) { - pr_debug("%s: sending AFE_PARAM_ID_APTX_SYNC_MODE to DSP", - __func__); - param_hdr.param_id = AFE_PARAM_ID_APTX_SYNC_MODE; - param_hdr.param_size = - sizeof(struct afe_param_id_aptx_sync_mode); - sync_mode_param.sync_mode = - enc_blk_param.enc_blk_config.aptx_config. - aptx_v2_cfg.sync_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &sync_mode_param); - if (ret) { - pr_err("%s: AFE_PARAM_ID_APTX_SYNC_MODE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE) { - pr_debug("%s: sending AFE_ID_APTX_ADAPTIVE_ENC_INIT to DSP\n", - __func__); - param_hdr.param_id = AFE_ID_APTX_ADAPTIVE_ENC_INIT; - param_hdr.param_size = - sizeof(struct afe_id_aptx_adaptive_enc_init); - aptx_adaptive_enc_init = - enc_blk_param.enc_blk_config.aptx_ad_config. - aptx_ad_cfg; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &aptx_adaptive_enc_init); - if (ret) { - pr_err("%s: AFE_ID_APTX_ADAPTIVE_ENC_INIT for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_PACKETIZER to DSP\n", - __func__); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_PACKETIZER_ID; - param_hdr.param_size = sizeof(struct avs_enc_packetizer_id_param_t); - enc_pkt_id_param.enc_packetizer_id = AFE_MODULE_ID_PACKETIZER_COP; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_pkt_id_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_PACKETIZER for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING mode= %d to DSP payload\n", - __func__, scrambler_mode); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING; - param_hdr.param_size = sizeof(struct avs_enc_set_scrambler_param_t); - enc_set_scrambler_param.enable_scrambler = scrambler_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_set_scrambler_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING for port 0x%x failed %d\n", - __func__, port_id, ret); - //goto exit; - } - - if (format == ASM_MEDIA_FMT_APTX) { - pr_debug("%s:sending CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO mode= %d to DSP payload\n", - __func__, mono_mode); - param_hdr.param_id = CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO; - param_hdr.param_size = sizeof(channel_mode_param); - channel_mode_param.channel_mode = mono_mode; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &channel_mode_param); - - if (ret) { - pr_err("%s: CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO for port 0x%x failed %d\n", - __func__, port_id, ret); - } - } - - if ((format == ASM_MEDIA_FMT_LDAC && - cfg->ldac_config.abr_config.is_abr_enabled) || - format == ASM_MEDIA_FMT_APTX_ADAPTIVE) { - pr_debug("%s:sending AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP to DSP payload", - __func__); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP; - param_hdr.param_size = - sizeof(struct afe_enc_level_to_bitrate_map_param_t); - map_param.mapping_table = - cfg->ldac_config.abr_config.mapping_info; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &map_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - - pr_debug("%s: sending AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION to DSP payload", - __func__); - param_hdr.param_id = - AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION; - param_hdr.param_size = - sizeof(struct afe_enc_dec_imc_info_param_t); - if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE) - imc_info_param.imc_info = - cfg->aptx_ad_config.abr_cfg.imc_info; - else - imc_info_param.imc_info = - cfg->ldac_config.abr_config.imc_info; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &imc_info_param); - if (ret) { - pr_err("%s: AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - } - - pr_debug("%s:Sending AFE_API_VERSION_PORT_MEDIA_TYPE to DSP", __func__); - param_hdr.module_id = AFE_MODULE_PORT; - param_hdr.param_id = AFE_PARAM_ID_PORT_MEDIA_TYPE; - param_hdr.param_size = sizeof(struct afe_port_media_type_t); - media_type.minor_version = AFE_API_VERSION_PORT_MEDIA_TYPE; - if (format == ASM_MEDIA_FMT_LDAC) - media_type.sample_rate = - cfg->ldac_config.custom_config.sample_rate; - else if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE) - media_type.sample_rate = - cfg->aptx_ad_config.custom_cfg.sample_rate; - else - media_type.sample_rate = - afe_config.slim_sch.sample_rate; - - if (afe_in_bit_width) - media_type.bit_width = afe_in_bit_width; - else - media_type.bit_width = afe_config.slim_sch.bit_width; - - if (afe_in_channels) - media_type.num_channels = afe_in_channels; - else - media_type.num_channels = afe_config.slim_sch.num_channels; - media_type.data_format = AFE_PORT_DATA_FORMAT_PCM; - media_type.reserved = 0; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &media_type); - if (ret) { - pr_err("%s: AFE_API_VERSION_PORT_MEDIA_TYPE for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; - } - -exit: - return ret; -} - -int afe_set_tws_channel_mode(u16 port_id, u32 channel_mode) -{ - struct aptx_channel_mode_param_t channel_mode_param; - struct param_hdr_v3 param_info; - int ret = 0; - - memset(¶m_info, 0, sizeof(param_info)); - memset(&channel_mode_param, 0, sizeof(channel_mode_param)); - - param_info.module_id = AFE_MODULE_ID_ENCODER; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO; - param_info.param_size = sizeof(channel_mode_param); - - channel_mode_param.channel_mode = channel_mode; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_info, - (u8 *) &channel_mode_param); - if (ret) - pr_err("%s: AFE set channel mode cfg for port 0x%x failed %d\n", - __func__, port_id, ret); - - return ret; -} -EXPORT_SYMBOL(afe_set_tws_channel_mode); - -static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, - u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, - union afe_enc_config_data *enc_cfg, - u32 codec_format, u32 scrambler_mode, u32 mono_mode, - struct afe_dec_config *dec_cfg) -{ - union afe_port_config port_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - int cfg_type; - int index = 0; - enum afe_mad_type mad_type; - uint16_t port_index; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_afe_top *afe_top; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&port_cfg, 0, sizeof(port_cfg)); - - if (!afe_config) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - return ret; - } - - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { - pr_debug("%s: before incrementing pcm_afe_instance %d port_id 0x%x\n", - __func__, - pcm_afe_instance[port_id & 0x1], port_id); - port_id = VIRTUAL_ID_TO_PORTID(port_id); - pcm_afe_instance[port_id & 0x1]++; - return 0; - } - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - pr_debug("%s: before incrementing proxy_afe_instance %d port_id 0x%x\n", - __func__, - proxy_afe_instance[port_id & 0x1], port_id); - - if (!afe_close_done[port_id & 0x1]) { - /*close pcm dai corresponding to the proxy dai*/ - afe_close(port_id - 0x10); - pcm_afe_instance[port_id & 0x1]++; - pr_debug("%s: reconfigure afe port again\n", __func__); - } - proxy_afe_instance[port_id & 0x1]++; - afe_close_done[port_id & 0x1] = false; - port_id = VIRTUAL_ID_TO_PORTID(port_id); - } - - pr_debug("%s: port id: 0x%x\n", __func__, port_id); - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret); - return -EINVAL; - } - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if ((index >= 0) && (index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[index] = rate; - - if (this_afe.rt_cb) - this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id); - } - - mutex_lock(&this_afe.afe_cmd_lock); - port_index = afe_get_port_index(port_id); - - if (q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V4) { - /* send VAD configuration if is enabled */ - if (this_afe.vad_cfg[port_index].is_enable) { - ret = afe_send_port_vad_cfg_params(port_id); - if (ret) { - pr_err("%s: afe send VAD config failed %d\n", - __func__, ret); - goto fail_cmd; - } - } - } - - /* Obtain the calibration block for debug log */ - cal_block = afe_find_cal_topo_id_by_port( - this_afe.cal_data[AFE_TOPOLOGY_CAL], port_id); - - /* Also send the topology id here: */ - if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) { - /* One time call: only for first time */ - afe_send_custom_topology(); - afe_send_port_topology_id(port_id); - afe_send_cal(port_id); - afe_send_hw_delay(port_id, rate); - } - - /* Start SW MAD module */ - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - if (mad_type != MAD_HW_NONE && mad_type != MAD_SW_AUDIO) { - if (!afe_has_config(AFE_CDC_REGISTERS_CONFIG) || - !afe_has_config(AFE_SLIMBUS_SLAVE_CONFIG)) { - pr_err("%s: AFE isn't configured yet for\n" - "HW MAD try Again\n", __func__); - ret = -EAGAIN; - goto fail_cmd; - } - ret = afe_turn_onoff_hw_mad(mad_type, true); - if (ret) { - pr_err("%s: afe_turn_onoff_hw_mad failed %d\n", - __func__, ret); - goto fail_cmd; - } - } - - if ((this_afe.aanc_info.aanc_active) && - (this_afe.aanc_info.aanc_tx_port == port_id)) { - this_afe.aanc_info.aanc_tx_port_sample_rate = rate; - port_index = - afe_get_port_index(this_afe.aanc_info.aanc_rx_port); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.aanc_info.aanc_rx_port_sample_rate = - this_afe.afe_sample_rates[port_index]; - } else { - pr_err("%s: Invalid port index %d\n", - __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - ret = afe_aanc_start(this_afe.aanc_info.aanc_tx_port, - this_afe.aanc_info.aanc_rx_port); - pr_debug("%s: afe_aanc_start ret %d\n", __func__, ret); - } - - if ((port_id == AFE_PORT_ID_USB_RX) || - (port_id == AFE_PORT_ID_USB_TX)) { - ret = afe_port_send_usb_dev_param(port_id, afe_config); - if (ret) { - pr_err("%s: AFE device param for port 0x%x failed %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - } - - switch (port_id) { - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - cfg_type = AFE_PARAM_ID_PCM_CONFIG; - break; - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_TX: - cfg_type = AFE_PARAM_ID_I2S_CONFIG; - break; - case HDMI_RX: - case DISPLAY_PORT_RX: - cfg_type = AFE_PARAM_ID_HDMI_CONFIG; - break; - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - cfg_type = AFE_PARAM_ID_PSEUDO_PORT_CONFIG; - break; - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_5_TX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG; - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - cfg_type = AFE_PARAM_ID_USB_AUDIO_CONFIG; - break; - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - cfg_type = AFE_PARAM_ID_RT_PROXY_CONFIG; - break; - case INT_BT_SCO_RX: - case INT_BT_A2DP_RX: - case INT_BT_SCO_TX: - case INT_FM_RX: - case INT_FM_TX: - cfg_type = AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG; - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - cfg_type = AFE_PARAM_ID_CODEC_DMA_CONFIG; - break; - default: - pr_err("%s: Invalid port id 0x%x\n", __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = cfg_type; - param_hdr.param_size = sizeof(union afe_port_config); - - port_cfg = *afe_config; - if (((enc_cfg != NULL) || (dec_cfg != NULL)) && - (codec_format != ASM_MEDIA_FMT_NONE) && - (cfg_type == AFE_PARAM_ID_SLIMBUS_CONFIG)) { - port_cfg.slim_sch.data_format = - AFE_SB_DATA_FORMAT_GENERIC_COMPRESSED; - } - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &port_cfg); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - - if ((codec_format != ASM_MEDIA_FMT_NONE) && - (cfg_type == AFE_PARAM_ID_SLIMBUS_CONFIG)) { - if (enc_cfg != NULL) { - pr_debug("%s: Found AFE encoder support for SLIMBUS format = %d\n", - __func__, codec_format); - ret = q6afe_send_enc_config(port_id, enc_cfg, - codec_format, *afe_config, - afe_in_channels, - afe_in_bit_width, - scrambler_mode, mono_mode); - if (ret) { - pr_err("%s: AFE encoder config for port 0x%x failed %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - } - if (dec_cfg != NULL) { - pr_debug("%s: Found AFE decoder support for SLIMBUS format = %d\n", - __func__, codec_format); - ret = q6afe_send_dec_config(port_id, *afe_config, - dec_cfg, codec_format, - afe_in_channels, - afe_in_bit_width); - if (ret) { - pr_err("%s: AFE decoder config for port 0x%x failed %d\n", - __func__, port_id, ret); - goto fail_cmd; - } - } - } - - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - /* - * If afe_port_start() for tx port called before - * rx port, then aanc rx sample rate is zero. So, - * AANC state machine in AFE will not get triggered. - * Make sure to check whether aanc is active during - * afe_port_start() for rx port and if aanc rx - * sample rate is zero, call afe_aanc_start to configure - * aanc with valid sample rates. - */ - if (this_afe.aanc_info.aanc_active && - !this_afe.aanc_info.aanc_rx_port_sample_rate) { - this_afe.aanc_info.aanc_rx_port_sample_rate = - this_afe.afe_sample_rates[port_index]; - ret = afe_aanc_start(this_afe.aanc_info.aanc_tx_port, - this_afe.aanc_info.aanc_rx_port); - pr_debug("%s: afe_aanc_start ret %d\n", __func__, ret); - } - } else { - pr_err("%s: Invalid port index %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - - if (cal_block != NULL) { - afe_top = (struct audio_cal_info_afe_top *)cal_block->cal_info; - pr_info("%s: top_id:%x acdb_id:%d port_id:0x%x\n", - __func__, afe_top->topology, afe_top->acdb_id, port_id); - } else { - pr_info("%s: port_id:0x%x\n", __func__, port_id); - } - - ret = afe_send_cmd_port_start(port_id); -#if CONFIG_MSM_CSPL - if (ret == 0) - crus_afe_port_start(port_id); -#endif - - -fail_cmd: - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} - -/** - * afe_port_start - to configure AFE session with - * specified port configuration - * - * @port_id: AFE port id number - * @afe_config: port configutation - * @rate: sampling rate of port - * - * Returns 0 on success or error value on port start failure. - */ -int afe_port_start(u16 port_id, union afe_port_config *afe_config, - u32 rate) -{ - return __afe_port_start(port_id, afe_config, rate, - 0, 0, NULL, ASM_MEDIA_FMT_NONE, 0, 0, NULL); -} -EXPORT_SYMBOL(afe_port_start); - -/** - * afe_port_start_v2 - to configure AFE session with - * specified port configuration and encoder /decoder params - * - * @port_id: AFE port id number - * @afe_config: port configutation - * @rate: sampling rate of port - * @enc_cfg: AFE enc configuration information to setup encoder - * @afe_in_channels: AFE input channel configuration, this needs - * update only if input channel is differ from AFE output - * @dec_cfg: AFE dec configuration information to set up decoder - * - * Returns 0 on success or error value on port start failure. - */ -int afe_port_start_v2(u16 port_id, union afe_port_config *afe_config, - u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, - struct afe_enc_config *enc_cfg, - struct afe_dec_config *dec_cfg) -{ - int ret = 0; - - if (enc_cfg != NULL) - ret = __afe_port_start(port_id, afe_config, rate, - afe_in_channels, afe_in_bit_width, - &enc_cfg->data, enc_cfg->format, - enc_cfg->scrambler_mode, - enc_cfg->mono_mode, dec_cfg); - else if (dec_cfg != NULL) - ret = __afe_port_start(port_id, afe_config, rate, - afe_in_channels, afe_in_bit_width, - NULL, dec_cfg->format, 0, 0, dec_cfg); - - return ret; -} -EXPORT_SYMBOL(afe_port_start_v2); - -int afe_get_port_index(u16 port_id) -{ - switch (port_id) { - case PRIMARY_I2S_RX: return IDX_PRIMARY_I2S_RX; - case PRIMARY_I2S_TX: return IDX_PRIMARY_I2S_TX; - case AFE_PORT_ID_PRIMARY_PCM_RX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_RX; - case AFE_PORT_ID_PRIMARY_PCM_TX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_TX; - case AFE_PORT_ID_SECONDARY_PCM_RX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_RX; - case AFE_PORT_ID_SECONDARY_PCM_TX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_TX; - case AFE_PORT_ID_TERTIARY_PCM_RX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_RX; - case AFE_PORT_ID_TERTIARY_PCM_TX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_TX; - case AFE_PORT_ID_QUATERNARY_PCM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_RX; - case AFE_PORT_ID_QUATERNARY_PCM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_TX; - case AFE_PORT_ID_QUINARY_PCM_RX: - return IDX_AFE_PORT_ID_QUINARY_PCM_RX; - case AFE_PORT_ID_QUINARY_PCM_TX: - return IDX_AFE_PORT_ID_QUINARY_PCM_TX; - case AFE_PORT_ID_SENARY_PCM_RX: - return IDX_AFE_PORT_ID_SENARY_PCM_RX; - case AFE_PORT_ID_SENARY_PCM_TX: - return IDX_AFE_PORT_ID_SENARY_PCM_TX; - case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX; - case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX; - case MI2S_RX: return IDX_MI2S_RX; - case MI2S_TX: return IDX_MI2S_TX; - case HDMI_RX: return IDX_HDMI_RX; - case DISPLAY_PORT_RX: return IDX_DISPLAY_PORT_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: return IDX_PRIMARY_SPDIF_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: return IDX_PRIMARY_SPDIF_TX; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: return IDX_SECONDARY_SPDIF_RX; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: return IDX_SECONDARY_SPDIF_TX; - case RSVD_2: return IDX_RSVD_2; - case RSVD_3: return IDX_RSVD_3; - case DIGI_MIC_TX: return IDX_DIGI_MIC_TX; - case VOICE_RECORD_RX: return IDX_VOICE_RECORD_RX; - case VOICE_RECORD_TX: return IDX_VOICE_RECORD_TX; - case VOICE_PLAYBACK_TX: return IDX_VOICE_PLAYBACK_TX; - case VOICE2_PLAYBACK_TX: return IDX_VOICE2_PLAYBACK_TX; - case SLIMBUS_0_RX: return IDX_SLIMBUS_0_RX; - case SLIMBUS_0_TX: return IDX_SLIMBUS_0_TX; - case SLIMBUS_1_RX: return IDX_SLIMBUS_1_RX; - case SLIMBUS_1_TX: return IDX_SLIMBUS_1_TX; - case SLIMBUS_2_RX: return IDX_SLIMBUS_2_RX; - case SLIMBUS_2_TX: return IDX_SLIMBUS_2_TX; - case SLIMBUS_3_RX: return IDX_SLIMBUS_3_RX; - case SLIMBUS_3_TX: return IDX_SLIMBUS_3_TX; - case INT_BT_SCO_RX: return IDX_INT_BT_SCO_RX; - case INT_BT_SCO_TX: return IDX_INT_BT_SCO_TX; - case INT_BT_A2DP_RX: return IDX_INT_BT_A2DP_RX; - case INT_FM_RX: return IDX_INT_FM_RX; - case INT_FM_TX: return IDX_INT_FM_TX; - case RT_PROXY_PORT_001_RX: return IDX_RT_PROXY_PORT_001_RX; - case RT_PROXY_PORT_001_TX: return IDX_RT_PROXY_PORT_001_TX; - case SLIMBUS_4_RX: return IDX_SLIMBUS_4_RX; - case SLIMBUS_4_TX: return IDX_SLIMBUS_4_TX; - case SLIMBUS_5_RX: return IDX_SLIMBUS_5_RX; - case SLIMBUS_5_TX: return IDX_SLIMBUS_5_TX; - case SLIMBUS_6_RX: return IDX_SLIMBUS_6_RX; - case SLIMBUS_6_TX: return IDX_SLIMBUS_6_TX; - case SLIMBUS_7_RX: return IDX_SLIMBUS_7_RX; - case SLIMBUS_7_TX: return IDX_SLIMBUS_7_TX; - case SLIMBUS_8_RX: return IDX_SLIMBUS_8_RX; - case SLIMBUS_8_TX: return IDX_SLIMBUS_8_TX; - case SLIMBUS_9_RX: return IDX_SLIMBUS_9_RX; - case SLIMBUS_9_TX: return IDX_SLIMBUS_9_TX; - case AFE_PORT_ID_USB_RX: return IDX_AFE_PORT_ID_USB_RX; - case AFE_PORT_ID_USB_TX: return IDX_AFE_PORT_ID_USB_TX; - case AFE_PORT_ID_PRIMARY_MI2S_RX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_RX; - case AFE_PORT_ID_PRIMARY_MI2S_TX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_TX; - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX; - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_TX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX; - case AFE_PORT_ID_TERTIARY_MI2S_RX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX; - case AFE_PORT_ID_TERTIARY_MI2S_TX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - case AFE_PORT_ID_QUINARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_RX; - case AFE_PORT_ID_QUINARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_TX; - case AFE_PORT_ID_SENARY_MI2S_TX: - return IDX_AFE_PORT_ID_SENARY_MI2S_TX; - case AFE_PORT_ID_PRIMARY_TDM_RX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_0; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_0; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_0; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_0; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_0; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_0; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_0; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_0; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_0; - case AFE_PORT_ID_QUINARY_TDM_TX: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_0; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7; - case AFE_PORT_ID_INT0_MI2S_RX: - return IDX_AFE_PORT_ID_INT0_MI2S_RX; - case AFE_PORT_ID_INT0_MI2S_TX: - return IDX_AFE_PORT_ID_INT0_MI2S_TX; - case AFE_PORT_ID_INT1_MI2S_RX: - return IDX_AFE_PORT_ID_INT1_MI2S_RX; - case AFE_PORT_ID_INT1_MI2S_TX: - return IDX_AFE_PORT_ID_INT1_MI2S_TX; - case AFE_PORT_ID_INT2_MI2S_RX: - return IDX_AFE_PORT_ID_INT2_MI2S_RX; - case AFE_PORT_ID_INT2_MI2S_TX: - return IDX_AFE_PORT_ID_INT2_MI2S_TX; - case AFE_PORT_ID_INT3_MI2S_RX: - return IDX_AFE_PORT_ID_INT3_MI2S_RX; - case AFE_PORT_ID_INT3_MI2S_TX: - return IDX_AFE_PORT_ID_INT3_MI2S_TX; - case AFE_PORT_ID_INT4_MI2S_RX: - return IDX_AFE_PORT_ID_INT4_MI2S_RX; - case AFE_PORT_ID_INT4_MI2S_TX: - return IDX_AFE_PORT_ID_INT4_MI2S_TX; - case AFE_PORT_ID_INT5_MI2S_RX: - return IDX_AFE_PORT_ID_INT5_MI2S_RX; - case AFE_PORT_ID_INT5_MI2S_TX: - return IDX_AFE_PORT_ID_INT5_MI2S_TX; - case AFE_PORT_ID_INT6_MI2S_RX: - return IDX_AFE_PORT_ID_INT6_MI2S_RX; - case AFE_PORT_ID_INT6_MI2S_TX: - return IDX_AFE_PORT_ID_INT6_MI2S_TX; - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_0; - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_0; - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_0; - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_1; - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_2; - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_3; - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_3; - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_4; - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_4; - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_5; - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5; - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6; - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7; - case RT_PROXY_PORT_002_RX: - return IDX_RT_PROXY_PORT_002_RX; - case RT_PROXY_PORT_002_TX: - return IDX_RT_PROXY_PORT_002_TX; - default: - pr_err("%s: port 0x%x\n", __func__, port_id); - return -EINVAL; - } -} - -/** - * afe_open - - * command to open AFE port - * - * @port_id: AFE port id - * @afe_config: AFE port config to pass - * @rate: sample rate - * - * Returns 0 on success or error on failure - */ -int afe_open(u16 port_id, - union afe_port_config *afe_config, int rate) -{ - struct afe_port_cmd_device_start start; - union afe_port_config port_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - int cfg_type; - int index = 0; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&start, 0, sizeof(start)); - memset(&port_cfg, 0, sizeof(port_cfg)); - - if (!afe_config) { - pr_err("%s: Error, no configuration data\n", __func__); - ret = -EINVAL; - return ret; - } - - pr_err("%s: port_id 0x%x rate %d\n", __func__, port_id, rate); - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", __func__, port_id, ret); - return -EINVAL; - } - - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { - pr_err("%s: wrong port 0x%x\n", __func__, port_id); - return -EINVAL; - } - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) - port_id = VIRTUAL_ID_TO_PORTID(port_id); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return -EINVAL; - } - - if ((index >= 0) && (index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[index] = rate; - - if (this_afe.rt_cb) - this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id); - } - - /* Also send the topology id here: */ - afe_send_custom_topology(); /* One time call: only for first time */ - afe_send_port_topology_id(port_id); - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Failed : Invalid Port id = 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - mutex_lock(&this_afe.afe_cmd_lock); - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - cfg_type = AFE_PARAM_ID_I2S_CONFIG; - break; - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - cfg_type = AFE_PARAM_ID_PCM_CONFIG; - break; - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SENARY_MI2S_TX: - cfg_type = AFE_PARAM_ID_I2S_CONFIG; - break; - case HDMI_RX: - case DISPLAY_PORT_RX: - cfg_type = AFE_PARAM_ID_HDMI_CONFIG; - break; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - cfg_type = AFE_PARAM_ID_SPDIF_CONFIG; - break; - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG; - break; - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - cfg_type = AFE_PARAM_ID_USB_AUDIO_CONFIG; - break; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - cfg_type = AFE_PARAM_ID_CODEC_DMA_CONFIG; - break; - default: - pr_err("%s: Invalid port id 0x%x\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = cfg_type; - param_hdr.param_size = sizeof(union afe_port_config); - port_cfg = *afe_config; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &port_cfg); - if (ret) { - pr_err("%s: AFE enable for port 0x%x opcode[0x%x]failed %d\n", - __func__, port_id, cfg_type, ret); - goto fail_cmd; - } - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = index; - start.hdr.opcode = AFE_PORT_CMD_DEVICE_START; - start.port_id = q6audio_get_port_id(port_id); - pr_debug("%s: cmd device start opcode[0x%x] port id[0x%x]\n", - __func__, start.hdr.opcode, start.port_id); - - ret = afe_apr_send_pkt(&start, &this_afe.wait[index]); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed %d\n", __func__, - port_id, ret); - goto fail_cmd; - } - -fail_cmd: - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_open); - -/** - * afe_loopback - - * command to set loopback between AFE ports - * - * @enable: enable or disable loopback - * @rx_port: AFE RX port ID - * @tx_port: AFE TX port ID - * - * Returns 0 on success or error on failure - */ -int afe_loopback(u16 enable, u16 rx_port, u16 tx_port) -{ - struct afe_loopback_cfg_v1 lb_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&lb_param, 0, sizeof(lb_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (rx_port == MI2S_RX) - rx_port = AFE_PORT_ID_PRIMARY_MI2S_RX; - if (tx_port == MI2S_TX) - tx_port = AFE_PORT_ID_PRIMARY_MI2S_TX; - - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_CONFIG; - param_hdr.param_size = sizeof(struct afe_loopback_cfg_v1); - - lb_param.dst_port_id = rx_port; - lb_param.routing_mode = LB_MODE_DEFAULT; - lb_param.enable = (enable ? 1 : 0); - lb_param.loopback_cfg_minor_version = AFE_API_VERSION_LOOPBACK_CONFIG; - - ret = q6afe_pack_and_set_param_in_band(tx_port, - q6audio_get_port_index(tx_port), - param_hdr, (u8 *) &lb_param); - if (ret) - pr_err("%s: AFE loopback failed %d\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_loopback); - -/** - * afe_loopback_gain - - * command to set gain for AFE loopback - * - * @port_id: AFE port id - * @volume: gain value to set - * - * Returns 0 on success or error on failure - */ -int afe_loopback_gain(u16 port_id, u16 volume) -{ - struct afe_loopback_gain_per_path_param set_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&set_param, 0, sizeof(set_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Failed : Invalid Port id = 0x%x ret %d\n", - __func__, port_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - - /* RX ports numbers are even .TX ports numbers are odd. */ - if (port_id % 2 == 0) { - pr_err("%s: Failed : afe loopback gain only for TX ports. port_id %d\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: port 0x%x volume %d\n", __func__, port_id, volume); - - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH; - param_hdr.param_size = sizeof(struct afe_loopback_gain_per_path_param); - set_param.rx_port_id = port_id; - set_param.gain = volume; - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &set_param); - if (ret) - pr_err("%s: AFE param set failed for port 0x%x ret %d\n", - __func__, port_id, ret); - -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_loopback_gain); - -int afe_pseudo_port_start_nowait(u16 port_id) -{ - struct afe_pseudoport_start_command start; - int ret = 0; - - pr_debug("%s: port_id=0x%x\n", __func__, port_id); - if (this_afe.apr == NULL) { - pr_err("%s: AFE APR is not registered\n", __func__); - return -ENODEV; - } - - - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = 0; - start.hdr.opcode = AFE_PSEUDOPORT_CMD_START; - start.port_id = port_id; - start.timing = 1; - - ret = afe_apr_send_pkt(&start, NULL); - if (ret) { - pr_err("%s: AFE enable for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; - } - return 0; -} - -int afe_start_pseudo_port(u16 port_id) -{ - int ret = 0; - struct afe_pseudoport_start_command start; - int index = 0; - - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", - __func__, port_id, ret); - return -EINVAL; - } - - start.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - start.hdr.pkt_size = sizeof(start); - start.hdr.src_port = 0; - start.hdr.dest_port = 0; - start.hdr.token = 0; - start.hdr.opcode = AFE_PSEUDOPORT_CMD_START; - start.port_id = port_id; - start.timing = 1; - start.hdr.token = index; - - ret = afe_apr_send_pkt(&start, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE enable for port 0x%x failed %d\n", - __func__, port_id, ret); - return ret; -} - -int afe_pseudo_port_stop_nowait(u16 port_id) -{ - int ret = 0; - struct afe_pseudoport_stop_command stop; - int index = 0; - - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - return -EINVAL; - } - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", - __func__, port_id, ret); - return -EINVAL; - } - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = 0; - stop.hdr.opcode = AFE_PSEUDOPORT_CMD_STOP; - stop.port_id = port_id; - stop.reserved = 0; - stop.hdr.token = index; - - ret = afe_apr_send_pkt(&stop, NULL); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - - return ret; -} - -int afe_port_group_set_param(u16 group_id, - union afe_port_group_config *afe_group_config) -{ - struct param_hdr_v3 param_hdr; - int cfg_type; - int ret; - - if (!afe_group_config) { - pr_err("%s: Error, no configuration data\n", __func__); - return -EINVAL; - } - - pr_debug("%s: group id: 0x%x\n", __func__, group_id); - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - switch (group_id) { - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX: - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX: - case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX: - cfg_type = AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG; - break; - default: - pr_err("%s: Invalid group id 0x%x\n", __func__, group_id); - return -EINVAL; - } - - param_hdr.module_id = AFE_MODULE_GROUP_DEVICE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = cfg_type; - param_hdr.param_size = sizeof(union afe_port_group_config); - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) afe_group_config); - if (ret) - pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_CFG failed %d\n", - __func__, ret); - - return ret; -} - -/** - * afe_port_group_enable - - * command to enable AFE port group - * - * @group_id: group ID for AFE port group - * @afe_group_config: config for AFE group - * @enable: flag to indicate enable or disable - * - * Returns 0 on success or error on failure - */ -int afe_port_group_enable(u16 group_id, - union afe_port_group_config *afe_group_config, - u16 enable) -{ - struct afe_group_device_enable group_enable; - struct param_hdr_v3 param_hdr; - int ret; - - pr_debug("%s: group id: 0x%x enable: %d\n", __func__, - group_id, enable); - - memset(&group_enable, 0, sizeof(group_enable)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - if (enable) { - ret = afe_port_group_set_param(group_id, afe_group_config); - if (ret < 0) { - pr_err("%s: afe send failed %d\n", __func__, ret); - return ret; - } - } - - param_hdr.module_id = AFE_MODULE_GROUP_DEVICE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_GROUP_DEVICE_ENABLE; - param_hdr.param_size = sizeof(struct afe_group_device_enable); - group_enable.group_id = group_id; - group_enable.enable = enable; - - ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr, - (u8 *) &group_enable); - if (ret) - pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_ENABLE failed %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(afe_port_group_enable); - -int afe_stop_pseudo_port(u16 port_id) -{ - int ret = 0; - struct afe_pseudoport_stop_command stop; - int index = 0; - - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - return -EINVAL; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = 0; - stop.hdr.opcode = AFE_PSEUDOPORT_CMD_STOP; - stop.port_id = port_id; - stop.reserved = 0; - stop.hdr.token = index; - - ret = afe_apr_send_pkt(&stop, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - - return ret; -} - -/** - * afe_req_mmap_handle - - * Retrieve AFE memory map handle - * - * @ac: AFE audio client - * - * Returns memory map handle - */ -uint32_t afe_req_mmap_handle(struct afe_audio_client *ac) -{ - return ac->mem_map_handle; -} -EXPORT_SYMBOL(afe_req_mmap_handle); - -/** - * q6afe_audio_client_alloc - - * Assign new AFE audio client - * - * @priv: privata data to hold for audio client - * - * Returns ac pointer on success or NULL on failure - */ -struct afe_audio_client *q6afe_audio_client_alloc(void *priv) -{ - struct afe_audio_client *ac; - int lcnt = 0; - - ac = kzalloc(sizeof(struct afe_audio_client), GFP_KERNEL); - if (!ac) - return NULL; - - ac->priv = priv; - - init_waitqueue_head(&ac->cmd_wait); - INIT_LIST_HEAD(&ac->port[0].mem_map_handle); - INIT_LIST_HEAD(&ac->port[1].mem_map_handle); - pr_debug("%s: mem_map_handle list init'ed\n", __func__); - mutex_init(&ac->cmd_lock); - for (lcnt = 0; lcnt <= OUT; lcnt++) { - mutex_init(&ac->port[lcnt].lock); - spin_lock_init(&ac->port[lcnt].dsp_lock); - } - atomic_set(&ac->cmd_state, 0); - - return ac; -} -EXPORT_SYMBOL(q6afe_audio_client_alloc); - -/** - * q6afe_audio_client_buf_alloc_contiguous - - * Allocate contiguous shared buffers - * - * @dir: RX or TX direction of AFE port - * @ac: AFE audio client handle - * @bufsz: size of each shared buffer - * @bufcnt: number of buffers - * - * Returns 0 on success or error on failure - */ -int q6afe_audio_client_buf_alloc_contiguous(unsigned int dir, - struct afe_audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt) -{ - int cnt = 0; - int rc = 0; - struct afe_audio_buffer *buf; - size_t len; - - if (!(ac) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return -EINVAL; - } - - pr_debug("%s: bufsz[%d]bufcnt[%d]\n", - __func__, - bufsz, bufcnt); - - if (ac->port[dir].buf) { - pr_debug("%s: buffer already allocated\n", __func__); - return 0; - } - mutex_lock(&ac->cmd_lock); - buf = kzalloc(((sizeof(struct afe_audio_buffer))*bufcnt), - GFP_KERNEL); - - if (!buf) { - pr_err("%s: null buf\n", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - ac->port[dir].buf = buf; - - rc = msm_audio_ion_alloc(&buf[0].dma_buf, - bufsz * bufcnt, - &buf[0].phys, &len, - &buf[0].data); - if (rc) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, rc); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - buf[0].used = dir ^ 1; - buf[0].size = bufsz; - buf[0].actual_size = bufsz; - cnt = 1; - while (cnt < bufcnt) { - if (bufsz > 0) { - buf[cnt].data = buf[0].data + (cnt * bufsz); - buf[cnt].phys = buf[0].phys + (cnt * bufsz); - if (!buf[cnt].data) { - pr_err("%s: Buf alloc failed\n", - __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - buf[cnt].used = dir ^ 1; - buf[cnt].size = bufsz; - buf[cnt].actual_size = bufsz; - pr_debug("%s: data[%pK]phys[%pK][%pK]\n", __func__, - buf[cnt].data, - &buf[cnt].phys, - &buf[cnt].phys); - } - cnt++; - } - ac->port[dir].max_buf_cnt = cnt; - mutex_unlock(&ac->cmd_lock); - return 0; -fail: - pr_err("%s: jump fail\n", __func__); - q6afe_audio_client_buf_free_contiguous(dir, ac); - return -EINVAL; -} -EXPORT_SYMBOL(q6afe_audio_client_buf_alloc_contiguous); - -/** - * afe_memory_map - - * command to map shared buffers to AFE - * - * @dma_addr_p: DMA physical address - * @dma_buf_sz: shared DMA buffer size - * @ac: AFE audio client handle - * - * Returns 0 on success or error on failure - */ -int afe_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz, - struct afe_audio_client *ac) -{ - int ret = 0; - - mutex_lock(&this_afe.afe_cmd_lock); - ac->mem_map_handle = 0; - ret = afe_cmd_memory_map(dma_addr_p, dma_buf_sz); - if (ret < 0) { - pr_err("%s: afe_cmd_memory_map failed %d\n", - __func__, ret); - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; - } - ac->mem_map_handle = this_afe.mmap_handle; - mutex_unlock(&this_afe.afe_cmd_lock); - - return ret; -} -EXPORT_SYMBOL(afe_memory_map); - -int afe_cmd_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz) -{ - int ret = 0; - int cmd_size = 0; - void *payload = NULL; - void *mmap_region_cmd = NULL; - struct afe_service_cmd_shared_mem_map_regions *mregion = NULL; - struct afe_service_shared_map_region_payload *mregion_pl = NULL; - int index = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - if (dma_buf_sz % SZ_4K != 0) { - /* - * The memory allocated by msm_audio_ion_alloc is always 4kB - * aligned, ADSP expects the size to be 4kB aligned as well - * so re-adjusts the buffer size before passing to ADSP. - */ - dma_buf_sz = PAGE_ALIGN(dma_buf_sz); - } - - cmd_size = sizeof(struct afe_service_cmd_shared_mem_map_regions) - + sizeof(struct afe_service_shared_map_region_payload); - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mregion = (struct afe_service_cmd_shared_mem_map_regions *) - mmap_region_cmd; - mregion->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion->hdr.pkt_size = cmd_size; - mregion->hdr.src_port = 0; - mregion->hdr.dest_port = 0; - mregion->hdr.token = 0; - mregion->hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS; - mregion->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mregion->num_regions = 1; - mregion->property_flag = 0x00; - /* Todo */ - index = mregion->hdr.token = IDX_RSVD_2; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct afe_service_cmd_shared_mem_map_regions)); - - mregion_pl = (struct afe_service_shared_map_region_payload *)payload; - - mregion_pl->shm_addr_lsw = lower_32_bits(dma_addr_p); - mregion_pl->shm_addr_msw = msm_audio_populate_upper_32_bits(dma_addr_p); - mregion_pl->mem_size_bytes = dma_buf_sz; - - pr_debug("%s: dma_addr_p 0x%pK , size %d\n", __func__, - &dma_addr_p, dma_buf_sz); - this_afe.mmap_handle = 0; - ret = afe_apr_send_pkt((uint32_t *) mmap_region_cmd, - &this_afe.wait[index]); - kfree(mmap_region_cmd); - return ret; -} - -int afe_cmd_memory_map_nowait(int port_id, phys_addr_t dma_addr_p, - u32 dma_buf_sz) -{ - int ret = 0; - int cmd_size = 0; - void *payload = NULL; - void *mmap_region_cmd = NULL; - struct afe_service_cmd_shared_mem_map_regions *mregion = NULL; - struct afe_service_shared_map_region_payload *mregion_pl = NULL; - int index = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", - __func__, port_id, ret); - return -EINVAL; - } - - cmd_size = sizeof(struct afe_service_cmd_shared_mem_map_regions) - + sizeof(struct afe_service_shared_map_region_payload); - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mregion = (struct afe_service_cmd_shared_mem_map_regions *) - mmap_region_cmd; - mregion->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion->hdr.pkt_size = sizeof(mregion); - mregion->hdr.src_port = 0; - mregion->hdr.dest_port = 0; - mregion->hdr.token = 0; - mregion->hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS; - mregion->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mregion->num_regions = 1; - mregion->property_flag = 0x00; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct afe_service_cmd_shared_mem_map_regions)); - mregion_pl = (struct afe_service_shared_map_region_payload *)payload; - - mregion_pl->shm_addr_lsw = lower_32_bits(dma_addr_p); - mregion_pl->shm_addr_msw = msm_audio_populate_upper_32_bits(dma_addr_p); - mregion_pl->mem_size_bytes = dma_buf_sz; - - ret = afe_apr_send_pkt(mmap_region_cmd, NULL); - if (ret) - pr_err("%s: AFE memory map cmd failed %d\n", - __func__, ret); - kfree(mmap_region_cmd); - return ret; -} - -/** - * q6afe_audio_client_buf_free_contiguous - - * frees the shared contiguous memory - * - * @dir: RX or TX direction of port - * @ac: AFE audio client handle - * - */ -int q6afe_audio_client_buf_free_contiguous(unsigned int dir, - struct afe_audio_client *ac) -{ - struct afe_audio_port_data *port; - int cnt = 0; - - mutex_lock(&ac->cmd_lock); - port = &ac->port[dir]; - if (!port->buf) { - pr_err("%s: buf is null\n", __func__); - mutex_unlock(&ac->cmd_lock); - return 0; - } - cnt = port->max_buf_cnt - 1; - - if (port->buf[0].data) { - pr_debug("%s: data[%pK], phys[%pK], dma_buf[%pK]\n", - __func__, - port->buf[0].data, - &port->buf[0].phys, - port->buf[0].dma_buf); - msm_audio_ion_free(port->buf[0].dma_buf); - port->buf[0].dma_buf = NULL; - } - - while (cnt >= 0) { - port->buf[cnt].data = NULL; - port->buf[cnt].phys = 0; - cnt--; - } - port->max_buf_cnt = 0; - kfree(port->buf); - port->buf = NULL; - mutex_unlock(&ac->cmd_lock); - return 0; -} -EXPORT_SYMBOL(q6afe_audio_client_buf_free_contiguous); - -/** - * q6afe_audio_client_free - - * frees the audio client from AFE - * - * @ac: AFE audio client handle - * - */ -void q6afe_audio_client_free(struct afe_audio_client *ac) -{ - int loopcnt; - struct afe_audio_port_data *port; - - if (!ac) { - pr_err("%s: audio client is NULL\n", __func__); - return; - } - for (loopcnt = 0; loopcnt <= OUT; loopcnt++) { - port = &ac->port[loopcnt]; - if (!port->buf) - continue; - pr_debug("%s: loopcnt = %d\n", __func__, loopcnt); - q6afe_audio_client_buf_free_contiguous(loopcnt, ac); - } - kfree(ac); -} -EXPORT_SYMBOL(q6afe_audio_client_free); - -/** - * afe_cmd_memory_unmap - - * command to unmap memory for AFE shared buffer - * - * @mem_map_handle: memory map handle to be unmapped - * - * Returns 0 on success or error on failure - */ -int afe_cmd_memory_unmap(u32 mem_map_handle) -{ - int ret = 0; - struct afe_service_cmd_shared_mem_unmap_regions mregion; - int index = 0; - - pr_debug("%s: handle 0x%x\n", __func__, mem_map_handle); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - mregion.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion.hdr.pkt_size = sizeof(mregion); - mregion.hdr.src_port = 0; - mregion.hdr.dest_port = 0; - mregion.hdr.token = 0; - mregion.hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS; - mregion.mem_map_handle = mem_map_handle; - - /* Todo */ - index = mregion.hdr.token = IDX_RSVD_2; - - atomic_set(&this_afe.status, 0); - ret = afe_apr_send_pkt(&mregion, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE memory unmap cmd failed %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(afe_cmd_memory_unmap); - -int afe_cmd_memory_unmap_nowait(u32 mem_map_handle) -{ - int ret = 0; - struct afe_service_cmd_shared_mem_unmap_regions mregion; - - pr_debug("%s: handle 0x%x\n", __func__, mem_map_handle); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - mregion.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mregion.hdr.pkt_size = sizeof(mregion); - mregion.hdr.src_port = 0; - mregion.hdr.dest_port = 0; - mregion.hdr.token = 0; - mregion.hdr.opcode = AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS; - mregion.mem_map_handle = mem_map_handle; - - ret = afe_apr_send_pkt(&mregion, NULL); - if (ret) - pr_err("%s: AFE memory unmap cmd failed %d\n", - __func__, ret); - return ret; -} - -/** - * afe_register_get_events - - * register for events from proxy port - * - * @port_id: Port ID to register events - * @cb: callback function to invoke for events from proxy port - * @private_data: private data to sent back in callback fn - * - * Returns 0 on success or error on failure - */ -int afe_register_get_events(u16 port_id, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data) -{ - int ret = 0; - struct afe_service_cmd_register_rt_port_driver rtproxy; - - pr_debug("%s: port_id: 0x%x\n", __func__, port_id); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - port_id = VIRTUAL_ID_TO_PORTID(port_id); - } else { - pr_err("%s: wrong port id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - if (port_id == RT_PROXY_PORT_001_TX) { - this_afe.tx_cb = cb; - this_afe.tx_private_data = private_data; - } else if (port_id == RT_PROXY_PORT_001_RX) { - this_afe.rx_cb = cb; - this_afe.rx_private_data = private_data; - } - - rtproxy.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - rtproxy.hdr.pkt_size = sizeof(rtproxy); - rtproxy.hdr.src_port = 1; - rtproxy.hdr.dest_port = 1; - rtproxy.hdr.opcode = AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER; - rtproxy.port_id = port_id; - rtproxy.reserved = 0; - - ret = afe_apr_send_pkt(&rtproxy, NULL); - if (ret) - pr_err("%s: AFE reg. rtproxy_event failed %d\n", - __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_register_get_events); - -/** - * afe_unregister_get_events - - * unregister for events from proxy port - * - * @port_id: Port ID to unregister events - * - * Returns 0 on success or error on failure - */ -int afe_unregister_get_events(u16 port_id) -{ - int ret = 0; - struct afe_service_cmd_unregister_rt_port_driver rtproxy; - int index = 0; - - pr_debug("%s:\n", __func__); - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - port_id = VIRTUAL_ID_TO_PORTID(port_id); - } else { - pr_err("%s: wrong port id 0x%x\n", __func__, port_id); - return -EINVAL; - } - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_err("%s: Invalid port 0x%x ret %d", __func__, port_id, ret); - return -EINVAL; - } - - rtproxy.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - rtproxy.hdr.pkt_size = sizeof(rtproxy); - rtproxy.hdr.src_port = 0; - rtproxy.hdr.dest_port = 0; - rtproxy.hdr.token = 0; - rtproxy.hdr.opcode = AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER; - rtproxy.port_id = port_id; - rtproxy.reserved = 0; - - rtproxy.hdr.token = index; - - if (port_id == RT_PROXY_PORT_001_TX) { - this_afe.tx_cb = NULL; - this_afe.tx_private_data = NULL; - } else if (port_id == RT_PROXY_PORT_001_RX) { - this_afe.rx_cb = NULL; - this_afe.rx_private_data = NULL; - } - - ret = afe_apr_send_pkt(&rtproxy, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE enable Unreg. rtproxy_event failed %d\n", - __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_unregister_get_events); - -/** - * afe_rt_proxy_port_write - - * command for AFE RT proxy port write - * - * @buf_addr_p: Physical buffer address with - * playback data to proxy port - * @mem_map_handle: memory map handle of write buffer - * @bytes: number of bytes to write - * - * Returns 0 on success or error on failure - */ -int afe_rt_proxy_port_write(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes) -{ - int ret = 0; - struct afe_port_data_cmd_rt_proxy_port_write_v2 afecmd_wr; - - if (this_afe.apr == NULL) { - pr_err("%s: register to AFE is not done\n", __func__); - ret = -ENODEV; - return ret; - } - pr_debug("%s: buf_addr_p = 0x%pK bytes = %d\n", __func__, - &buf_addr_p, bytes); - - afecmd_wr.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - afecmd_wr.hdr.pkt_size = sizeof(afecmd_wr); - afecmd_wr.hdr.src_port = 0; - afecmd_wr.hdr.dest_port = 0; - afecmd_wr.hdr.token = 0; - afecmd_wr.hdr.opcode = AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2; - afecmd_wr.port_id = RT_PROXY_PORT_001_TX; - afecmd_wr.buffer_address_lsw = lower_32_bits(buf_addr_p); - afecmd_wr.buffer_address_msw = - msm_audio_populate_upper_32_bits(buf_addr_p); - afecmd_wr.mem_map_handle = mem_map_handle; - afecmd_wr.available_bytes = bytes; - afecmd_wr.reserved = 0; - - /* - * Do not call afe_apr_send_pkt() here as it acquires - * a mutex lock inside and this function gets called in - * interrupt context leading to scheduler crash - */ - atomic_set(&this_afe.status, 0); - ret = apr_send_pkt(this_afe.apr, (uint32_t *) &afecmd_wr); - if (ret < 0) { - pr_err("%s: AFE rtproxy write to port 0x%x failed %d\n", - __func__, afecmd_wr.port_id, ret); - ret = -EINVAL; - } - - return ret; - -} -EXPORT_SYMBOL(afe_rt_proxy_port_write); - -/** - * afe_rt_proxy_port_read - - * command for AFE RT proxy port read - * - * @buf_addr_p: Physical buffer address to fill read data - * @mem_map_handle: memory map handle for buffer read - * @bytes: number of bytes to read - * - * Returns 0 on success or error on failure - */ -int afe_rt_proxy_port_read(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes) -{ - int ret = 0; - struct afe_port_data_cmd_rt_proxy_port_read_v2 afecmd_rd; - - if (this_afe.apr == NULL) { - pr_err("%s: register to AFE is not done\n", __func__); - ret = -ENODEV; - return ret; - } - pr_debug("%s: buf_addr_p = 0x%pK bytes = %d\n", __func__, - &buf_addr_p, bytes); - - afecmd_rd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - afecmd_rd.hdr.pkt_size = sizeof(afecmd_rd); - afecmd_rd.hdr.src_port = 0; - afecmd_rd.hdr.dest_port = 0; - afecmd_rd.hdr.token = 0; - afecmd_rd.hdr.opcode = AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2; - afecmd_rd.port_id = RT_PROXY_PORT_001_RX; - afecmd_rd.buffer_address_lsw = lower_32_bits(buf_addr_p); - afecmd_rd.buffer_address_msw = - msm_audio_populate_upper_32_bits(buf_addr_p); - afecmd_rd.available_bytes = bytes; - afecmd_rd.mem_map_handle = mem_map_handle; - - /* - * Do not call afe_apr_send_pkt() here as it acquires - * a mutex lock inside and this function gets called in - * interrupt context leading to scheduler crash - */ - atomic_set(&this_afe.status, 0); - ret = apr_send_pkt(this_afe.apr, (uint32_t *) &afecmd_rd); - if (ret < 0) { - pr_err("%s: AFE rtproxy read cmd to port 0x%x failed %d\n", - __func__, afecmd_rd.port_id, ret); - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(afe_rt_proxy_port_read); - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_afelb; -static struct dentry *debugfs_afelb_gain; - -static int afe_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - pr_info("%s: debug intf %s\n", __func__, (char *) file->private_data); - return 0; -} - -static int afe_get_parameters(char *buf, long int *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token != NULL) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtoul(token, base, ¶m1[cnt]) != 0) { - pr_err("%s: kstrtoul failed\n", - __func__); - return -EINVAL; - } - - token = strsep(&buf, " "); - } else { - pr_err("%s: token NULL\n", __func__); - return -EINVAL; - } - } - return 0; -} -#define AFE_LOOPBACK_ON (1) -#define AFE_LOOPBACK_OFF (0) -static ssize_t afe_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *lb_str = filp->private_data; - char lbuf[32]; - int rc; - unsigned long param[5]; - - if (cnt > sizeof(lbuf) - 1) { - pr_err("%s: cnt %zd size %zd\n", __func__, cnt, sizeof(lbuf)-1); - return -EINVAL; - } - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) { - pr_err("%s: copy from user failed %d\n", __func__, rc); - return -EFAULT; - } - - lbuf[cnt] = '\0'; - - if (!strcmp(lb_str, "afe_loopback")) { - rc = afe_get_parameters(lbuf, param, 3); - if (!rc) { - pr_info("%s: %lu %lu %lu\n", lb_str, param[0], param[1], - param[2]); - - if ((param[0] != AFE_LOOPBACK_ON) && (param[0] != - AFE_LOOPBACK_OFF)) { - pr_err("%s: Error, parameter 0 incorrect\n", - __func__); - rc = -EINVAL; - goto afe_error; - } - if ((q6audio_validate_port(param[1]) < 0) || - (q6audio_validate_port(param[2])) < 0) { - pr_err("%s: Error, invalid afe port\n", - __func__); - } - if (this_afe.apr == NULL) { - pr_err("%s: Error, AFE not opened\n", __func__); - rc = -EINVAL; - } else { - rc = afe_loopback(param[0], param[1], param[2]); - } - } else { - pr_err("%s: Error, invalid parameters\n", __func__); - rc = -EINVAL; - } - - } else if (!strcmp(lb_str, "afe_loopback_gain")) { - rc = afe_get_parameters(lbuf, param, 2); - if (!rc) { - pr_info("%s: %s %lu %lu\n", - __func__, lb_str, param[0], param[1]); - - rc = q6audio_validate_port(param[0]); - if (rc < 0) { - pr_err("%s: Error, invalid afe port %d %lu\n", - __func__, rc, param[0]); - rc = -EINVAL; - goto afe_error; - } - - if (param[1] > 100) { - pr_err("%s: Error, volume should be 0 to 100 percentage param = %lu\n", - __func__, param[1]); - rc = -EINVAL; - goto afe_error; - } - - param[1] = (Q6AFE_MAX_VOLUME * param[1]) / 100; - - if (this_afe.apr == NULL) { - pr_err("%s: Error, AFE not opened\n", __func__); - rc = -EINVAL; - } else { - rc = afe_loopback_gain(param[0], param[1]); - } - } else { - pr_err("%s: Error, invalid parameters\n", __func__); - rc = -EINVAL; - } - } - -afe_error: - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations afe_debug_fops = { - .open = afe_debug_open, - .write = afe_debug_write -}; - -static void config_debug_fs_init(void) -{ - debugfs_afelb = debugfs_create_file("afe_loopback", - 0664, NULL, (void *) "afe_loopback", - &afe_debug_fops); - - debugfs_afelb_gain = debugfs_create_file("afe_loopback_gain", - 0664, NULL, (void *) "afe_loopback_gain", - &afe_debug_fops); -} -static void config_debug_fs_exit(void) -{ - debugfs_remove(debugfs_afelb); - debugfs_remove(debugfs_afelb_gain); -} -#else -static void config_debug_fs_init(void) -{ -} -static void config_debug_fs_exit(void) -{ -} -#endif - -/** - * afe_set_dtmf_gen_rx_portid - - * Set port_id for DTMF tone generation - * - * @port_id: AFE port id - * @set: set or reset port id value for dtmf gen - * - */ -void afe_set_dtmf_gen_rx_portid(u16 port_id, int set) -{ - if (set) - this_afe.dtmf_gen_rx_portid = port_id; - else if (this_afe.dtmf_gen_rx_portid == port_id) - this_afe.dtmf_gen_rx_portid = -1; -} -EXPORT_SYMBOL(afe_set_dtmf_gen_rx_portid); - -/** - * afe_dtmf_generate_rx - command to generate AFE DTMF RX - * - * @duration_in_ms: Duration in ms for dtmf tone - * @high_freq: Higher frequency for dtmf - * @low_freq: lower frequency for dtmf - * @gain: Gain value for DTMF tone - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_dtmf_generate_rx(int64_t duration_in_ms, - uint16_t high_freq, - uint16_t low_freq, uint16_t gain) -{ - int ret = 0; - int index = 0; - struct afe_dtmf_generation_command cmd_dtmf; - - pr_debug("%s: DTMF AFE Gen\n", __func__); - - if (afe_validate_port(this_afe.dtmf_gen_rx_portid) < 0) { - pr_err("%s: Failed : Invalid Port id = 0x%x\n", - __func__, this_afe.dtmf_gen_rx_portid); - ret = -EINVAL; - goto fail_cmd; - } - - if (this_afe.apr == NULL) { - this_afe.apr = apr_register("ADSP", "AFE", afe_callback, - 0xFFFFFFFF, &this_afe); - pr_debug("%s: Register AFE\n", __func__); - if (this_afe.apr == NULL) { - pr_err("%s: Unable to register AFE\n", __func__); - ret = -ENODEV; - return ret; - } - rtac_set_afe_handle(this_afe.apr); - } - - pr_debug("%s: dur=%lld: hfreq=%d lfreq=%d gain=%d portid=0x%x\n", - __func__, - duration_in_ms, high_freq, low_freq, gain, - this_afe.dtmf_gen_rx_portid); - - cmd_dtmf.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cmd_dtmf.hdr.pkt_size = sizeof(cmd_dtmf); - cmd_dtmf.hdr.src_port = 0; - cmd_dtmf.hdr.dest_port = 0; - cmd_dtmf.hdr.token = 0; - cmd_dtmf.hdr.opcode = AFE_PORTS_CMD_DTMF_CTL; - cmd_dtmf.duration_in_ms = duration_in_ms; - cmd_dtmf.high_freq = high_freq; - cmd_dtmf.low_freq = low_freq; - cmd_dtmf.gain = gain; - cmd_dtmf.num_ports = 1; - cmd_dtmf.port_ids = q6audio_get_port_id(this_afe.dtmf_gen_rx_portid); - - index = q6audio_get_port_index(this_afe.dtmf_gen_rx_portid); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - ret = -EINVAL; - goto fail_cmd; - } - ret = afe_apr_send_pkt((uint32_t *) &cmd_dtmf, - &this_afe.wait[index]); - return ret; -fail_cmd: - pr_err("%s: failed %d\n", __func__, ret); - return ret; -} -EXPORT_SYMBOL(afe_dtmf_generate_rx); - -static int afe_sidetone_iir(u16 tx_port_id) -{ - int ret; - uint16_t size = 0; - int cal_index = AFE_SIDETONE_IIR_CAL; - int iir_pregain = 0; - int iir_num_biquad_stages = 0; - int iir_enable; - struct cal_block_data *cal_block; - int mid; - struct afe_mod_enable_param enable; - struct afe_sidetone_iir_filter_config_params filter_data; - struct param_hdr_v3 param_hdr; - u8 *packed_param_data = NULL; - u32 packed_param_size = 0; - u32 single_param_size = 0; - struct audio_cal_info_sidetone_iir *st_iir_cal_info = NULL; - - memset(&enable, 0, sizeof(enable)); - memset(&filter_data, 0, sizeof(filter_data)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (this_afe.cal_data[cal_index] == NULL) { - pr_err("%s: cal data is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - mutex_lock(&this_afe.cal_data[cal_index]->lock); - cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s: cal_block not found\n ", __func__); - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - ret = -EINVAL; - goto done; - } - - /* Cache data from cal block while inside lock to reduce locked time */ - st_iir_cal_info = - (struct audio_cal_info_sidetone_iir *) cal_block->cal_info; - iir_pregain = st_iir_cal_info->pregain; - iir_enable = st_iir_cal_info->iir_enable; - iir_num_biquad_stages = st_iir_cal_info->num_biquad_stages; - mid = st_iir_cal_info->mid; - - /* - * calculate the actual size of payload based on no of stages - * enabled in calibration - */ - size = (MAX_SIDETONE_IIR_DATA_SIZE / MAX_NO_IIR_FILTER_STAGE) * - iir_num_biquad_stages; - /* - * For an odd number of stages, 2 bytes of padding are - * required at the end of the payload. - */ - if (iir_num_biquad_stages % 2) { - pr_debug("%s: adding 2 to size:%d\n", __func__, size); - size = size + 2; - } - memcpy(&filter_data.iir_config, &st_iir_cal_info->iir_config, size); - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - - packed_param_size = - sizeof(param_hdr) * 2 + sizeof(enable) + sizeof(filter_data); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - packed_param_size = 0; - - /* - * Set IIR enable params - */ - param_hdr.module_id = mid; - param_hdr.param_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_ENABLE; - param_hdr.param_size = sizeof(enable); - enable.enable = iir_enable; - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, - (u8 *) &enable, &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - /* - * Set IIR filter config params - */ - param_hdr.module_id = mid; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SIDETONE_IIR_FILTER_CONFIG; - param_hdr.param_size = sizeof(filter_data.num_biquad_stages) + - sizeof(filter_data.pregain) + size; - filter_data.num_biquad_stages = iir_num_biquad_stages; - filter_data.pregain = iir_pregain; - ret = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, (u8 *) &filter_data, - &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - pr_debug("%s: tx(0x%x)mid(0x%x)iir_en(%d)stg(%d)gain(0x%x)size(%d)\n", - __func__, tx_port_id, mid, enable.enable, - filter_data.num_biquad_stages, filter_data.pregain, - param_hdr.param_size); - - ret = q6afe_set_params(tx_port_id, q6audio_get_port_index(tx_port_id), - NULL, packed_param_data, packed_param_size); - if (ret) - pr_err("%s: AFE sidetone failed for tx_port(0x%x)\n", - __func__, tx_port_id); - -done: - kfree(packed_param_data); - return ret; -} - -static int afe_sidetone(u16 tx_port_id, u16 rx_port_id, bool enable) -{ - int ret; - int cal_index = AFE_SIDETONE_CAL; - int sidetone_gain; - int sidetone_enable; - struct cal_block_data *cal_block; - int mid = 0; - struct afe_loopback_sidetone_gain gain_data; - struct loopback_cfg_data cfg_data; - struct param_hdr_v3 param_hdr; - u8 *packed_param_data = NULL; - u32 packed_param_size = 0; - u32 single_param_size = 0; - struct audio_cal_info_sidetone *st_cal_info = NULL; - - if (this_afe.cal_data[cal_index] == NULL) { - pr_err("%s: cal data is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - memset(&gain_data, 0, sizeof(gain_data)); - memset(&cfg_data, 0, sizeof(cfg_data)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - packed_param_size = - sizeof(param_hdr) * 2 + sizeof(gain_data) + sizeof(cfg_data); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - packed_param_size = 0; - - mutex_lock(&this_afe.cal_data[cal_index]->lock); - cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { - pr_err("%s: cal_block not found\n", __func__); - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - ret = -EINVAL; - goto done; - } - - /* Cache data from cal block while inside lock to reduce locked time */ - st_cal_info = (struct audio_cal_info_sidetone *) cal_block->cal_info; - sidetone_gain = st_cal_info->gain; - sidetone_enable = st_cal_info->enable; - mid = st_cal_info->mid; - mutex_unlock(&this_afe.cal_data[cal_index]->lock); - - /* Set gain data. */ - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH; - param_hdr.param_size = sizeof(struct afe_loopback_sidetone_gain); - gain_data.rx_port_id = rx_port_id; - gain_data.gain = sidetone_gain; - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, - (u8 *) &gain_data, &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - /* Set configuration data. */ - param_hdr.module_id = AFE_MODULE_LOOPBACK; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LOOPBACK_CONFIG; - param_hdr.param_size = sizeof(struct loopback_cfg_data); - cfg_data.loopback_cfg_minor_version = AFE_API_VERSION_LOOPBACK_CONFIG; - cfg_data.dst_port_id = rx_port_id; - cfg_data.routing_mode = LB_MODE_SIDETONE; - cfg_data.enable = enable; - ret = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, (u8 *) &cfg_data, - &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - pr_debug("%s rx(0x%x) tx(0x%x) enable(%d) mid(0x%x) gain(%d) sidetone_enable(%d)\n", - __func__, rx_port_id, tx_port_id, - enable, mid, sidetone_gain, sidetone_enable); - - ret = q6afe_set_params(tx_port_id, q6audio_get_port_index(tx_port_id), - NULL, packed_param_data, packed_param_size); - if (ret) - pr_err("%s: AFE sidetone send failed for tx_port:%d rx_port:%d ret:%d\n", - __func__, tx_port_id, rx_port_id, ret); - -done: - kfree(packed_param_data); - return ret; -} - -int afe_sidetone_enable(u16 tx_port_id, u16 rx_port_id, bool enable) -{ - int ret; - int index; - - index = q6audio_get_port_index(rx_port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - ret = -EINVAL; - goto done; - } - if (q6audio_validate_port(rx_port_id) < 0) { - pr_err("%s: Invalid port 0x%x\n", - __func__, rx_port_id); - ret = -EINVAL; - goto done; - } - index = q6audio_get_port_index(tx_port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - ret = -EINVAL; - goto done; - } - if (q6audio_validate_port(tx_port_id) < 0) { - pr_err("%s: Invalid port 0x%x\n", - __func__, tx_port_id); - ret = -EINVAL; - goto done; - } - if (enable) { - ret = afe_sidetone_iir(tx_port_id); - if (ret) - goto done; - } - - ret = afe_sidetone(tx_port_id, rx_port_id, enable); - -done: - return ret; -} - -/** - * afe_set_display_stream - command to update AFE dp port params - * - * @rx_port_id: AFE port id - * @stream_idx: dp controller stream index - * @ctl_idx: dp controller index - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_display_stream(u16 rx_port_id, u32 stream_idx, u32 ctl_idx) -{ - int ret; - struct param_hdr_v3 param_hdr; - u32 packed_param_size = 0; - u8 *packed_param_data = NULL; - struct afe_display_stream_idx stream_data; - struct afe_display_ctl_idx ctl_data; - u32 single_param_size = 0; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - memset(&stream_data, 0, sizeof(stream_data)); - memset(&ctl_data, 0, sizeof(ctl_data)); - - packed_param_size = - sizeof(param_hdr) * 2 + sizeof(stream_data) + sizeof(ctl_data); - packed_param_data = kzalloc(packed_param_size, GFP_KERNEL); - if (!packed_param_data) - return -ENOMEM; - packed_param_size = 0; - - /* Set stream index */ - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_HDMI_DP_MST_VID_IDX_CFG; - param_hdr.param_size = sizeof(struct afe_display_stream_idx); - stream_data.minor_version = 1; - stream_data.stream_idx = stream_idx; - ret = q6common_pack_pp_params(packed_param_data, ¶m_hdr, - (u8 *) &stream_data, &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - /* Set controller dptx index */ - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_HDMI_DPTX_IDX_CFG; - param_hdr.param_size = sizeof(struct afe_display_ctl_idx); - ctl_data.minor_version = 1; - ctl_data.ctl_idx = ctl_idx; - ret = q6common_pack_pp_params(packed_param_data + packed_param_size, - ¶m_hdr, (u8 *) &ctl_data, - &single_param_size); - if (ret) { - pr_err("%s: Failed to pack param data, error %d\n", __func__, - ret); - goto done; - } - packed_param_size += single_param_size; - - pr_debug("%s: rx(0x%x) stream(%d) controller(%d)\n", - __func__, rx_port_id, stream_idx, ctl_idx); - - ret = q6afe_set_params(rx_port_id, q6audio_get_port_index(rx_port_id), - NULL, packed_param_data, packed_param_size); - if (ret) - pr_err("%s: AFE display stream send failed for rx_port:%d ret:%d\n", - __func__, rx_port_id, ret); - -done: - kfree(packed_param_data); - return ret; - -} -EXPORT_SYMBOL(afe_set_display_stream); - -int afe_validate_port(u16 port_id) -{ - int ret; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case HDMI_RX: - case DISPLAY_PORT_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - case RSVD_2: - case RSVD_3: - case DIGI_MIC_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case INT_BT_SCO_RX: - case INT_BT_SCO_TX: - case INT_BT_A2DP_RX: - case INT_FM_RX: - case INT_FM_TX: - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_TX: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - { - ret = 0; - break; - } - - default: - pr_err("%s: default ret 0x%x\n", __func__, port_id); - ret = -EINVAL; - } - - return ret; -} - -int afe_convert_virtual_to_portid(u16 port_id) -{ - int ret; - - /* - * if port_id is virtual, convert to physical.. - * if port_id is already physical, return physical - */ - if (afe_validate_port(port_id) < 0) { - if (port_id == RT_PROXY_DAI_001_RX || - port_id == RT_PROXY_DAI_001_TX || - port_id == RT_PROXY_DAI_002_RX || - port_id == RT_PROXY_DAI_002_TX) { - ret = VIRTUAL_ID_TO_PORTID(port_id); - } else { - pr_err("%s: wrong port 0x%x\n", - __func__, port_id); - ret = -EINVAL; - } - } else - ret = port_id; - - return ret; -} -int afe_port_stop_nowait(int port_id) -{ - struct afe_port_cmd_device_stop stop; - int ret = 0; - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: port_id = 0x%x\n", __func__, port_id); - port_id = q6audio_convert_virtual_to_portid(port_id); - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = 0; - stop.hdr.opcode = AFE_PORT_CMD_DEVICE_STOP; - stop.port_id = port_id; - stop.reserved = 0; - - ret = afe_apr_send_pkt(&stop, NULL); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - -fail_cmd: - return ret; - -} - -/** - * afe_close - command to close AFE port - * - * @port_id: AFE port id - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_close(int port_id) -{ - struct afe_port_cmd_device_stop stop; - enum afe_mad_type mad_type; - int ret = 0; - int index = 0; - uint16_t port_index; - - if (this_afe.apr == NULL) { - pr_err("%s: AFE is already closed\n", __func__); - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) - pcm_afe_instance[port_id & 0x1] = 0; - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) - proxy_afe_instance[port_id & 0x1] = 0; - afe_close_done[port_id & 0x1] = true; - ret = -EINVAL; - goto fail_cmd; - } - pr_info("%s: port_id = 0x%x\n", __func__, port_id); - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { - pr_debug("%s: before decrementing pcm_afe_instance %d\n", - __func__, pcm_afe_instance[port_id & 0x1]); - port_id = VIRTUAL_ID_TO_PORTID(port_id); - pcm_afe_instance[port_id & 0x1]--; - if ((!(pcm_afe_instance[port_id & 0x1] == 0 && - proxy_afe_instance[port_id & 0x1] == 0)) || - afe_close_done[port_id & 0x1] == true) - return 0; - - afe_close_done[port_id & 0x1] = true; - } - - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { - pr_debug("%s: before decrementing proxy_afe_instance %d\n", - __func__, proxy_afe_instance[port_id & 0x1]); - port_id = VIRTUAL_ID_TO_PORTID(port_id); - proxy_afe_instance[port_id & 0x1]--; - if ((!(pcm_afe_instance[port_id & 0x1] == 0 && - proxy_afe_instance[port_id & 0x1] == 0)) || - afe_close_done[port_id & 0x1] == true) - return 0; - - afe_close_done[port_id & 0x1] = true; - } - - port_id = q6audio_convert_virtual_to_portid(port_id); - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_validate_port(port_id); - if (ret < 0) { - pr_warn("%s: Not a valid port id 0x%x ret %d\n", - __func__, port_id, ret); - return -EINVAL; - } - - mad_type = afe_port_get_mad_type(port_id); - pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, - mad_type); - if (mad_type != MAD_HW_NONE && mad_type != MAD_SW_AUDIO) { - pr_debug("%s: Turn off MAD\n", __func__); - ret = afe_turn_onoff_hw_mad(mad_type, false); - if (ret) { - pr_err("%s: afe_turn_onoff_hw_mad failed %d\n", - __func__, ret); - return ret; - } - } else { - pr_debug("%s: Not a MAD port\n", __func__); - } - - mutex_lock(&this_afe.afe_cmd_lock); - port_index = afe_get_port_index(port_id); - if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) { - this_afe.afe_sample_rates[port_index] = 0; - this_afe.topology[port_index] = 0; - this_afe.dev_acdb_id[port_index] = 0; - } else { - pr_err("%s: port %d\n", __func__, port_index); - ret = -EINVAL; - goto fail_cmd; - } - - if ((port_id == this_afe.aanc_info.aanc_tx_port) && - (this_afe.aanc_info.aanc_active)) { - memset(&this_afe.aanc_info, 0x00, sizeof(this_afe.aanc_info)); - ret = afe_aanc_mod_enable(this_afe.apr, port_id, 0); - if (ret) - pr_err("%s: AFE mod disable failed %d\n", - __func__, ret); - } - - /* - * even if ramp down configuration failed it is not serious enough to - * warrant bailaing out. - */ - if (afe_spk_ramp_dn_cfg(port_id) < 0) - pr_err("%s: ramp down configuration failed\n", __func__); - - stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - stop.hdr.pkt_size = sizeof(stop); - stop.hdr.src_port = 0; - stop.hdr.dest_port = 0; - stop.hdr.token = index; - stop.hdr.opcode = AFE_PORT_CMD_DEVICE_STOP; - stop.port_id = q6audio_get_port_id(port_id); - stop.reserved = 0; - - ret = afe_apr_send_pkt(&stop, &this_afe.wait[index]); - if (ret) - pr_err("%s: AFE close failed %d\n", __func__, ret); - -#if CONFIG_MSM_CSPL - crus_afe_port_close(port_id); -#endif - -fail_cmd: - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_close); - -int afe_set_digital_codec_core_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg) -{ - struct afe_digital_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - /*default rx port is taken to enable the codec digital clock*/ - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_INTERNAL_DIGIATL_CDC_CLK_CONFIG; - param_hdr.param_size = sizeof(struct afe_digital_clk_cfg); - clk_cfg = *cfg; - - pr_debug("%s: Minor version =0x%x clk val = %d\n" - "clk root = 0x%x resrv = 0x%x\n", - __func__, cfg->i2s_cfg_minor_version, cfg->clk_val, - cfg->clk_root, cfg->reserved); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x%x ret %d\n", __func__, - port_id, ret); - return ret; -} - -/** - * afe_set_lpass_clock - Enable AFE lpass clock - * - * @port_id: AFE port id - * @cfg: pointer to clk set struct - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_lpass_clock(u16 port_id, struct afe_clk_cfg *cfg) -{ - struct afe_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - mutex_lock(&this_afe.afe_cmd_lock); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LPAIF_CLK_CONFIG; - param_hdr.param_size = sizeof(clk_cfg); - clk_cfg = *cfg; - - pr_debug("%s: Minor version =0x%x clk val1 = %d\n" - "clk val2 = %d, clk src = 0x%x\n" - "clk root = 0x%x clk mode = 0x%x resrv = 0x%x\n" - "port id = 0x%x\n", - __func__, cfg->i2s_cfg_minor_version, - cfg->clk_val1, cfg->clk_val2, cfg->clk_src, - cfg->clk_root, cfg->clk_set_mode, - cfg->reserved, q6audio_get_port_id(port_id)); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x%x ret %d\n", - __func__, port_id, ret); - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_set_lpass_clock); - -/** - * afe_set_lpass_clk_cfg - Set AFE clk config - * - * @index: port index - * @cfg: pointer to clk set struct - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) -{ - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - ret = -EINVAL; - return ret; - } - - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: index[%d] invalid!\n", __func__, index); - return -EINVAL; - } - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err_ratelimited("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - mutex_lock(&this_afe.afe_cmd_lock); - param_hdr.module_id = AFE_MODULE_CLOCK_SET; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CLOCK_SET; - param_hdr.param_size = sizeof(struct afe_clk_set); - - - pr_debug("%s: Minor version =0x%x clk id = %d\n" - "clk freq (Hz) = %d, clk attri = 0x%x\n" - "clk root = 0x%x clk enable = 0x%x\n", - __func__, cfg->clk_set_minor_version, - cfg->clk_id, cfg->clk_freq_in_hz, cfg->clk_attri, - cfg->clk_root, cfg->enable); - - ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr, - (u8 *) cfg); - if (ret < 0) - pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", - __func__, ret); - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_set_lpass_clk_cfg); - -/** - * afe_set_lpass_clock_v2 - Enable AFE lpass clock - * - * @port_id: AFE port id - * @cfg: pointer to clk set struct - * - * Returns 0 on success, appropriate error code otherwise - */ -int afe_set_lpass_clock_v2(u16 port_id, struct afe_clk_set *cfg) -{ - int index = 0; - int ret = 0; - - index = q6audio_get_port_index(port_id); - if (index < 0 || index >= AFE_MAX_PORTS) { - pr_err("%s: AFE port index[%d] invalid!\n", - __func__, index); - return -EINVAL; - } - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - ret = afe_set_lpass_clk_cfg(index, cfg); - if (ret) - pr_err("%s: afe_set_lpass_clk_cfg_v2 failed %d\n", - __func__, ret); - - return ret; -} -EXPORT_SYMBOL(afe_set_lpass_clock_v2); - -int afe_set_lpass_internal_digital_codec_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg) -{ - struct afe_digital_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - if (!cfg) { - pr_err("%s: clock cfg is NULL\n", __func__); - return -EINVAL; - } - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_INTERNAL_DIGIATL_CDC_CLK_CONFIG; - param_hdr.param_size = sizeof(clk_cfg); - clk_cfg = *cfg; - - pr_debug("%s: Minor version =0x%x clk val = %d\n" - "clk root = 0x%x resrv = 0x%x port id = 0x%x\n", - __func__, cfg->i2s_cfg_minor_version, - cfg->clk_val, cfg->clk_root, cfg->reserved, - q6audio_get_port_id(port_id)); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x0x%x ret %d\n", - __func__, port_id, ret); - - return ret; -} - -int afe_enable_lpass_core_shared_clock(u16 port_id, u32 enable) -{ - struct afe_param_id_lpass_core_shared_clk_cfg clk_cfg; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&clk_cfg, 0, sizeof(clk_cfg)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - ret = q6audio_is_digital_pcm_interface(port_id); - if (ret < 0) { - pr_err("%s: q6audio_is_digital_pcm_interface fail %d\n", - __func__, ret); - return -EINVAL; - } - - mutex_lock(&this_afe.afe_cmd_lock); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_LPASS_CORE_SHARED_CLOCK_CONFIG; - param_hdr.param_size = sizeof(clk_cfg); - clk_cfg.lpass_core_shared_clk_cfg_minor_version = - AFE_API_VERSION_LPASS_CORE_SHARED_CLK_CONFIG; - clk_cfg.enable = enable; - - pr_debug("%s: port id = %d, enable = %d\n", - __func__, q6audio_get_port_id(port_id), enable); - - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, (u8 *) &clk_cfg); - if (ret < 0) - pr_err("%s: AFE enable for port 0x%x ret %d\n", - __func__, port_id, ret); - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} - -int q6afe_check_osr_clk_freq(u32 freq) -{ - int ret = 0; - - switch (freq) { - case Q6AFE_LPASS_OSR_CLK_12_P288_MHZ: - case Q6AFE_LPASS_OSR_CLK_9_P600_MHZ: - case Q6AFE_LPASS_OSR_CLK_8_P192_MHZ: - case Q6AFE_LPASS_OSR_CLK_6_P144_MHZ: - case Q6AFE_LPASS_OSR_CLK_4_P096_MHZ: - case Q6AFE_LPASS_OSR_CLK_3_P072_MHZ: - case Q6AFE_LPASS_OSR_CLK_2_P048_MHZ: - case Q6AFE_LPASS_OSR_CLK_1_P536_MHZ: - case Q6AFE_LPASS_OSR_CLK_1_P024_MHZ: - case Q6AFE_LPASS_OSR_CLK_768_kHZ: - case Q6AFE_LPASS_OSR_CLK_512_kHZ: - break; - default: - pr_err("%s: default freq 0x%x\n", - __func__, freq); - ret = -EINVAL; - } - return ret; -} - -static int afe_get_sp_th_vi_v_vali_data( - struct afe_sp_th_vi_v_vali_get_param *th_vi_v_vali) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!th_vi_v_vali) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_TH_VI; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_V2_TH_VI_V_VALI_PARAMS; - param_hdr.param_size = sizeof(struct afe_sp_th_vi_v_vali_params); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret) { - pr_err("%s: Failed to get TH VI V-Vali data\n", __func__); - goto get_params_fail; - } - - th_vi_v_vali->pdata = param_hdr; - memcpy(&th_vi_v_vali->param, &this_afe.th_vi_v_vali_resp.param, - sizeof(this_afe.th_vi_v_vali_resp.param)); - pr_debug("%s: Vrms %d %d status %d %d\n", __func__, - th_vi_v_vali->param.vrms_q24[SP_V2_SPKR_1], - th_vi_v_vali->param.vrms_q24[SP_V2_SPKR_2], - th_vi_v_vali->param.status[SP_V2_SPKR_1], - th_vi_v_vali->param.status[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -int afe_get_sp_th_vi_ftm_data(struct afe_sp_th_vi_get_param *th_vi) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!th_vi) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_TH_VI; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_V2_TH_VI_FTM_PARAMS; - param_hdr.param_size = sizeof(struct afe_sp_th_vi_ftm_params); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret) { - pr_err("%s: Failed to get TH VI FTM data\n", __func__); - goto get_params_fail; - } - - th_vi->pdata = param_hdr; - memcpy(&th_vi->param, &this_afe.th_vi_resp.param, - sizeof(this_afe.th_vi_resp.param)); - pr_debug("%s: DC resistance %d %d temp %d %d status %d %d\n", - __func__, th_vi->param.dc_res_q24[SP_V2_SPKR_1], - th_vi->param.dc_res_q24[SP_V2_SPKR_2], - th_vi->param.temp_q22[SP_V2_SPKR_1], - th_vi->param.temp_q22[SP_V2_SPKR_2], - th_vi->param.status[SP_V2_SPKR_1], - th_vi->param.status[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -int afe_get_sp_ex_vi_ftm_data(struct afe_sp_ex_vi_get_param *ex_vi) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!ex_vi) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_SPEAKER_PROTECTION_V2_EX_VI; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_V2_EX_VI_FTM_PARAMS; - param_hdr.param_size = sizeof(struct afe_sp_ex_vi_ftm_params); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x]failed %d\n", - __func__, port, param_hdr.param_id, ret); - goto get_params_fail; - } - - ex_vi->pdata = param_hdr; - memcpy(&ex_vi->param, &this_afe.ex_vi_resp.param, - sizeof(this_afe.ex_vi_resp.param)); - pr_debug("%s: freq %d %d resistance %d %d qfactor %d %d state %d %d\n", - __func__, ex_vi->param.freq_q20[SP_V2_SPKR_1], - ex_vi->param.freq_q20[SP_V2_SPKR_2], - ex_vi->param.resis_q24[SP_V2_SPKR_1], - ex_vi->param.resis_q24[SP_V2_SPKR_2], - ex_vi->param.qmct_q24[SP_V2_SPKR_1], - ex_vi->param.qmct_q24[SP_V2_SPKR_2], - ex_vi->param.status[SP_V2_SPKR_1], - ex_vi->param.status[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -/** - * afe_get_sp_rx_tmax_xmax_logging_data - - * command to get excursion logging data from DSP - * - * @xt_logging: excursion logging params - * @port: AFE port ID - * - * Returns 0 on success or error on failure - */ -int afe_get_sp_rx_tmax_xmax_logging_data( - struct afe_sp_rx_tmax_xmax_logging_param *xt_logging, - u16 port_id) -{ - struct param_hdr_v3 param_hdr; - int ret = -EINVAL; - - if (!xt_logging) { - pr_err("%s: Invalid params\n", __func__); - goto done; - } - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = AFE_MODULE_FB_SPKR_PROT_V2_RX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_SP_RX_TMAX_XMAX_LOGGING; - param_hdr.param_size = sizeof(struct afe_sp_rx_tmax_xmax_logging_param); - - ret = q6afe_get_params(port_id, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x]failed %d\n", - __func__, port_id, param_hdr.param_id, ret); - goto get_params_fail; - } - - memcpy(xt_logging, &this_afe.xt_logging_resp.param, - sizeof(this_afe.xt_logging_resp.param)); - pr_debug("%s: max_excursion %d %d count_exceeded_excursion %d %d max_temperature %d %d count_exceeded_temperature %d %d\n", - __func__, xt_logging->max_excursion[SP_V2_SPKR_1], - xt_logging->max_excursion[SP_V2_SPKR_2], - xt_logging->count_exceeded_excursion[SP_V2_SPKR_1], - xt_logging->count_exceeded_excursion[SP_V2_SPKR_2], - xt_logging->max_temperature[SP_V2_SPKR_1], - xt_logging->max_temperature[SP_V2_SPKR_2], - xt_logging->count_exceeded_temperature[SP_V2_SPKR_1], - xt_logging->count_exceeded_temperature[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} -EXPORT_SYMBOL(afe_get_sp_rx_tmax_xmax_logging_data); - -/** - * afe_get_av_dev_drift - - * command to retrieve AV drift - * - * @timing_stats: timing stats to be updated with AV drift values - * @port: AFE port ID - * - * Returns 0 on success or error on failure - */ -int afe_get_av_dev_drift(struct afe_param_id_dev_timing_stats *timing_stats, - u16 port) -{ - struct param_hdr_v3 param_hdr; - int ret = -EINVAL; - - if (!timing_stats) { - pr_err("%s: Invalid params\n", __func__); - goto exit; - } - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_DEV_TIMING_STATS; - param_hdr.param_size = sizeof(struct afe_param_id_dev_timing_stats); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x] failed %d\n", - __func__, port, param_hdr.param_id, ret); - goto get_params_fail; - } - - memcpy(timing_stats, &this_afe.av_dev_drift_resp.timing_stats, - param_hdr.param_size); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -exit: - return ret; -} -EXPORT_SYMBOL(afe_get_av_dev_drift); - -int afe_spk_prot_get_calib_data(struct afe_spkr_prot_get_vi_calib *calib_resp) -{ - struct param_hdr_v3 param_hdr; - int port = SLIMBUS_4_TX; - int ret = -EINVAL; - - if (!calib_resp) { - pr_err("%s: Invalid params\n", __func__); - goto fail_cmd; - } - if (this_afe.vi_tx_port != -1) - port = this_afe.vi_tx_port; - - mutex_lock(&this_afe.afe_cmd_lock); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = AFE_MODULE_FB_SPKR_PROT_VI_PROC_V2; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = AFE_PARAM_ID_CALIB_RES_CFG_V2; - param_hdr.param_size = sizeof(struct afe_spkr_prot_get_vi_calib); - - ret = q6afe_get_params(port, NULL, ¶m_hdr); - if (ret < 0) { - pr_err("%s: get param port 0x%x param id[0x%x]failed %d\n", - __func__, port, param_hdr.param_id, ret); - goto get_params_fail; - } - memcpy(&calib_resp->res_cfg, &this_afe.calib_data.res_cfg, - sizeof(this_afe.calib_data.res_cfg)); - pr_info("%s: state %s resistance %d %d\n", __func__, - fbsp_state[calib_resp->res_cfg.th_vi_ca_state], - calib_resp->res_cfg.r0_cali_q24[SP_V2_SPKR_1], - calib_resp->res_cfg.r0_cali_q24[SP_V2_SPKR_2]); - ret = 0; -get_params_fail: - mutex_unlock(&this_afe.afe_cmd_lock); -fail_cmd: - return ret; -} - -/** - * afe_spk_prot_feed_back_cfg - - * command to setup spk protection feedback config - * - * @src_port: source port id - * @dst_port: destination port id - * @l_ch: left speaker active or not - * @r_ch: right speaker active or not - * @enable: flag to enable or disable - * - * Returns 0 on success or error on failure - */ -int afe_spk_prot_feed_back_cfg(int src_port, int dst_port, - int l_ch, int r_ch, u32 enable) -{ - int ret = -EINVAL; - union afe_spkr_prot_config prot_config; - int index = 0; - - if (!enable) { - pr_debug("%s: Disable Feedback tx path", __func__); - this_afe.vi_tx_port = -1; - this_afe.vi_rx_port = -1; - return 0; - } - - if ((q6audio_validate_port(src_port) < 0) || - (q6audio_validate_port(dst_port) < 0)) { - pr_err("%s: invalid ports src 0x%x dst 0x%x", - __func__, src_port, dst_port); - goto fail_cmd; - } - if (!l_ch && !r_ch) { - pr_err("%s: error ch values zero\n", __func__); - goto fail_cmd; - } - pr_debug("%s: src_port 0x%x dst_port 0x%x l_ch %d r_ch %d\n", - __func__, src_port, dst_port, l_ch, r_ch); - memset(&prot_config, 0, sizeof(prot_config)); - prot_config.feedback_path_cfg.dst_portid = - q6audio_get_port_id(dst_port); - if (l_ch) { - prot_config.feedback_path_cfg.chan_info[index++] = 1; - prot_config.feedback_path_cfg.chan_info[index++] = 2; - } - if (r_ch) { - prot_config.feedback_path_cfg.chan_info[index++] = 3; - prot_config.feedback_path_cfg.chan_info[index++] = 4; - } - prot_config.feedback_path_cfg.num_channels = index; - pr_debug("%s no of channels: %d\n", __func__, index); - prot_config.feedback_path_cfg.minor_version = 1; - ret = afe_spk_prot_prepare(src_port, dst_port, - AFE_PARAM_ID_FEEDBACK_PATH_CFG, &prot_config); -fail_cmd: - return ret; -} -EXPORT_SYMBOL(afe_spk_prot_feed_back_cfg); - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case AFE_COMMON_RX_CAL_TYPE: - ret = AFE_COMMON_RX_CAL; - break; - case AFE_COMMON_TX_CAL_TYPE: - ret = AFE_COMMON_TX_CAL; - break; - case AFE_LSM_TX_CAL_TYPE: - ret = AFE_LSM_TX_CAL; - break; - case AFE_AANC_CAL_TYPE: - ret = AFE_AANC_CAL; - break; - case AFE_HW_DELAY_CAL_TYPE: - ret = AFE_HW_DELAY_CAL; - break; - case AFE_FB_SPKR_PROT_CAL_TYPE: - ret = AFE_FB_SPKR_PROT_CAL; - break; - case AFE_SIDETONE_CAL_TYPE: - ret = AFE_SIDETONE_CAL; - break; - case AFE_SIDETONE_IIR_CAL_TYPE: - ret = AFE_SIDETONE_IIR_CAL; - break; - case AFE_TOPOLOGY_CAL_TYPE: - ret = AFE_TOPOLOGY_CAL; - break; - case AFE_LSM_TOPOLOGY_CAL_TYPE: - ret = AFE_LSM_TOPOLOGY_CAL; - break; - case AFE_CUST_TOPOLOGY_CAL_TYPE: - ret = AFE_CUST_TOPOLOGY_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -int afe_alloc_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - pr_debug("%s: cal_type = %d cal_index = %d\n", - __func__, cal_type, cal_index); - - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - mutex_lock(&this_afe.afe_cmd_lock); - ret = cal_utils_alloc_cal(data_size, data, - this_afe.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - mutex_unlock(&this_afe.afe_cmd_lock); - goto done; - } - mutex_unlock(&this_afe.afe_cmd_lock); -done: - return ret; -} - -static int afe_dealloc_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - this_afe.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int afe_set_cal(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - this_afe.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == AFE_CUST_TOPOLOGY_CAL) { - mutex_lock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - this_afe.set_custom_topology = 1; - pr_debug("%s:[AFE_CUSTOM_TOPOLOGY] ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - mutex_unlock(&this_afe.cal_data[AFE_CUST_TOPOLOGY_CAL]->lock); - } - -done: - return ret; -} - -static struct cal_block_data *afe_find_hw_delay_by_path( - struct cal_type_data *cal_type, int path) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - - pr_debug("%s:\n", __func__); - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - - if (cal_utils_is_cal_stale(cal_block)) - continue; - - if (((struct audio_cal_info_hw_delay *)cal_block->cal_info) - ->path == path) { - return cal_block; - } - } - return NULL; -} - -static int afe_get_cal_hw_delay(int32_t path, - struct audio_cal_hw_delay_entry *entry) -{ - int ret = 0; - int i; - struct cal_block_data *cal_block = NULL; - struct audio_cal_hw_delay_data *hw_delay_info = NULL; - - pr_debug("%s:\n", __func__); - - if (this_afe.cal_data[AFE_HW_DELAY_CAL] == NULL) { - pr_err("%s: AFE_HW_DELAY_CAL not initialized\n", __func__); - ret = -EINVAL; - goto done; - } - if (entry == NULL) { - pr_err("%s: entry is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - if ((path >= MAX_PATH_TYPE) || (path < 0)) { - pr_err("%s: bad path: %d\n", - __func__, path); - ret = -EINVAL; - goto done; - } - - mutex_lock(&this_afe.cal_data[AFE_HW_DELAY_CAL]->lock); - cal_block = afe_find_hw_delay_by_path( - this_afe.cal_data[AFE_HW_DELAY_CAL], path); - if (cal_block == NULL) - goto unlock; - - hw_delay_info = &((struct audio_cal_info_hw_delay *) - cal_block->cal_info)->data; - if (hw_delay_info->num_entries > MAX_HW_DELAY_ENTRIES) { - pr_err("%s: invalid num entries: %d\n", - __func__, hw_delay_info->num_entries); - ret = -EINVAL; - goto unlock; - } - - for (i = 0; i < hw_delay_info->num_entries; i++) { - if (hw_delay_info->entry[i].sample_rate == - entry->sample_rate) { - entry->delay_usec = hw_delay_info->entry[i].delay_usec; - break; - } - } - if (i == hw_delay_info->num_entries) { - pr_err("%s: Unable to find delay for sample rate %d\n", - __func__, entry->sample_rate); - ret = -EFAULT; - goto unlock; - } - - cal_utils_mark_cal_used(cal_block); - pr_debug("%s: Path = %d samplerate = %u usec = %u status %d\n", - __func__, path, entry->sample_rate, entry->delay_usec, ret); -unlock: - mutex_unlock(&this_afe.cal_data[AFE_HW_DELAY_CAL]->lock); -done: - return ret; -} - -static int afe_set_cal_sp_th_vi_v_vali_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_th_vi_v_vali_cfg *cal_data = data; - - if (cal_data == NULL || data_size != sizeof(*cal_data)) - goto done; - - memcpy(&this_afe.v_vali_cfg, &cal_data->cal_info, - sizeof(this_afe.v_vali_cfg)); -done: - return ret; -} - -static int afe_set_cal_sp_th_vi_ftm_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_th_vi_ftm_cfg *cal_data = data; - - if (cal_data == NULL || data_size != sizeof(*cal_data)) - goto done; - - memcpy(&this_afe.th_ftm_cfg, &cal_data->cal_info, - sizeof(this_afe.th_ftm_cfg)); -done: - return ret; -} - -static int afe_set_cal_sp_th_vi_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_th_vi_ftm_cfg *cal_data = data; - uint32_t mode; - - if (cal_data == NULL || - data_size > sizeof(*cal_data) || - this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - mode = cal_data->cal_info.mode; - pr_debug("%s: cal_type = %d, mode = %d\n", __func__, cal_type, mode); - if (mode == MSM_SPKR_PROT_IN_FTM_MODE) { - ret = afe_set_cal_sp_th_vi_ftm_cfg(cal_type, - data_size, data); - } else if (mode == MSM_SPKR_PROT_IN_V_VALI_MODE) { - ret = afe_set_cal_sp_th_vi_v_vali_cfg(cal_type, - data_size, data); - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); -done: - return ret; -} - -static int afe_set_cal_sp_ex_vi_ftm_cfg(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_sp_ex_vi_ftm_cfg *cal_data = data; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - pr_debug("%s: cal_type = %d\n", __func__, cal_type); - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - memcpy(&this_afe.ex_ftm_cfg, &cal_data->cal_info, - sizeof(this_afe.ex_ftm_cfg)); - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); -done: - return ret; -} - -static int afe_set_cal_fb_spkr_prot(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_fb_spk_prot_cfg *cal_data = data; - - pr_debug("%s:\n", __func__); - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL) - goto done; - if (cal_data == NULL) - goto done; - if (data_size != sizeof(*cal_data)) - goto done; - - if (cal_data->cal_info.mode == MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) - __pm_wakeup_event(&wl.ws, jiffies_to_msecs(WAKELOCK_TIMEOUT)); - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - memcpy(&this_afe.prot_cfg, &cal_data->cal_info, - sizeof(this_afe.prot_cfg)); - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); -done: - return ret; -} - -static int afe_get_cal_sp_th_vi_v_vali_param(int32_t cal_type, size_t data_size, - void *data) -{ - int i, ret = 0; - struct audio_cal_type_sp_th_vi_v_vali_param *cal_data = data; - struct afe_sp_th_vi_v_vali_get_param th_vi_v_vali; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - cal_data->cal_info.status[i] = -EINVAL; - cal_data->cal_info.vrms_q24[i] = -1; - } - if (!afe_get_sp_th_vi_v_vali_data(&th_vi_v_vali)) { - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - pr_debug("%s: v-vali param status = %d\n", - __func__, th_vi_v_vali.param.status[i]); - if (th_vi_v_vali.param.status[i] == - V_VALI_IN_PROGRESS) { - cal_data->cal_info.status[i] = -EAGAIN; - } else if (th_vi_v_vali.param.status[i] == - V_VALI_SUCCESS) { - cal_data->cal_info.status[i] = V_VALI_SUCCESS; - cal_data->cal_info.vrms_q24[i] = - th_vi_v_vali.param.vrms_q24[i]; - } - } - } - this_afe.v_vali_flag = 0; -done: - return ret; -} - -static int afe_get_cal_sp_th_vi_ftm_param(int32_t cal_type, size_t data_size, - void *data) -{ - int i, ret = 0; - struct audio_cal_type_sp_th_vi_param *cal_data = data; - struct afe_sp_th_vi_get_param th_vi; - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - cal_data->cal_info.status[i] = -EINVAL; - cal_data->cal_info.r_dc_q24[i] = -1; - cal_data->cal_info.temp_q22[i] = -1; - } - if (!afe_get_sp_th_vi_ftm_data(&th_vi)) { - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - pr_debug("%s: ftm param status = %d\n", - __func__, th_vi.param.status[i]); - if (th_vi.param.status[i] == FBSP_IN_PROGRESS) { - cal_data->cal_info.status[i] = -EAGAIN; - } else if (th_vi.param.status[i] == FBSP_SUCCESS) { - cal_data->cal_info.status[i] = 0; - cal_data->cal_info.r_dc_q24[i] = - th_vi.param.dc_res_q24[i]; - cal_data->cal_info.temp_q22[i] = - th_vi.param.temp_q22[i]; - } - } - } -done: - return ret; -} - -static int afe_get_cal_sp_th_vi_param(int32_t cal_type, size_t data_size, - void *data) -{ - struct audio_cal_type_sp_th_vi_param *cal_data = data; - uint32_t mode; - int ret = 0; - - if (cal_data == NULL || - data_size > sizeof(*cal_data) || - this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL] == NULL) - return 0; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - mode = cal_data->cal_info.mode; - pr_debug("%s: cal_type = %d,mode = %d\n", __func__, cal_type, mode); - if (mode == MSM_SPKR_PROT_IN_V_VALI_MODE) - ret = afe_get_cal_sp_th_vi_v_vali_param(cal_type, - data_size, data); - else - ret = afe_get_cal_sp_th_vi_ftm_param(cal_type, - data_size, data); - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_TH_VI_CAL]->lock); - return ret; -} - -static int afe_get_cal_sp_ex_vi_ftm_param(int32_t cal_type, size_t data_size, - void *data) -{ - int i, ret = 0; - struct audio_cal_type_sp_ex_vi_param *cal_data = data; - struct afe_sp_ex_vi_get_param ex_vi; - - pr_debug("%s: cal_type = %d\n", __func__, cal_type); - if (this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL] == NULL || - cal_data == NULL || - data_size != sizeof(*cal_data)) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - cal_data->cal_info.status[i] = -EINVAL; - cal_data->cal_info.freq_q20[i] = -1; - cal_data->cal_info.resis_q24[i] = -1; - cal_data->cal_info.qmct_q24[i] = -1; - } - if (!afe_get_sp_ex_vi_ftm_data(&ex_vi)) { - for (i = 0; i < SP_V2_NUM_MAX_SPKRS; i++) { - pr_debug("%s: ftm param status = %d\n", - __func__, ex_vi.param.status[i]); - if (ex_vi.param.status[i] == FBSP_IN_PROGRESS) { - cal_data->cal_info.status[i] = -EAGAIN; - } else if (ex_vi.param.status[i] == FBSP_SUCCESS) { - cal_data->cal_info.status[i] = 0; - cal_data->cal_info.freq_q20[i] = - ex_vi.param.freq_q20[i]; - cal_data->cal_info.resis_q24[i] = - ex_vi.param.resis_q24[i]; - cal_data->cal_info.qmct_q24[i] = - ex_vi.param.qmct_q24[i]; - } - } - } - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_EX_VI_CAL]->lock); -done: - return ret; -} - -static int afe_get_cal_fb_spkr_prot(int32_t cal_type, size_t data_size, - void *data) -{ - int ret = 0; - struct audio_cal_type_fb_spk_prot_status *cal_data = data; - struct afe_spkr_prot_get_vi_calib calib_resp; - - pr_debug("%s:\n", __func__); - - if (this_afe.cal_data[AFE_FB_SPKR_PROT_CAL] == NULL) - goto done; - if (cal_data == NULL) - goto done; - if (data_size != sizeof(*cal_data)) - goto done; - - mutex_lock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - if (this_afe.prot_cfg.mode == MSM_SPKR_PROT_CALIBRATED) { - cal_data->cal_info.r0[SP_V2_SPKR_1] = - this_afe.prot_cfg.r0[SP_V2_SPKR_1]; - cal_data->cal_info.r0[SP_V2_SPKR_2] = - this_afe.prot_cfg.r0[SP_V2_SPKR_2]; - cal_data->cal_info.status = 0; - } else if (this_afe.prot_cfg.mode == - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS) { - /*Call AFE to query the status*/ - cal_data->cal_info.status = -EINVAL; - cal_data->cal_info.r0[SP_V2_SPKR_1] = -1; - cal_data->cal_info.r0[SP_V2_SPKR_2] = -1; - if (!afe_spk_prot_get_calib_data(&calib_resp)) { - if (calib_resp.res_cfg.th_vi_ca_state == - FBSP_IN_PROGRESS) - cal_data->cal_info.status = -EAGAIN; - else if (calib_resp.res_cfg.th_vi_ca_state == - FBSP_SUCCESS) { - cal_data->cal_info.status = 0; - cal_data->cal_info.r0[SP_V2_SPKR_1] = - calib_resp.res_cfg.r0_cali_q24[SP_V2_SPKR_1]; - cal_data->cal_info.r0[SP_V2_SPKR_2] = - calib_resp.res_cfg.r0_cali_q24[SP_V2_SPKR_2]; - } - } - if (!cal_data->cal_info.status) { - this_afe.prot_cfg.mode = - MSM_SPKR_PROT_CALIBRATED; - this_afe.prot_cfg.r0[SP_V2_SPKR_1] = - cal_data->cal_info.r0[SP_V2_SPKR_1]; - this_afe.prot_cfg.r0[SP_V2_SPKR_2] = - cal_data->cal_info.r0[SP_V2_SPKR_2]; - } - } else { - /*Indicates calibration data is invalid*/ - cal_data->cal_info.status = -EINVAL; - cal_data->cal_info.r0[SP_V2_SPKR_1] = -1; - cal_data->cal_info.r0[SP_V2_SPKR_2] = -1; - } - this_afe.initial_cal = 0; - mutex_unlock(&this_afe.cal_data[AFE_FB_SPKR_PROT_CAL]->lock); - __pm_relax(&wl.ws); -done: - return ret; -} - -static int afe_map_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - atomic_set(&this_afe.mem_map_cal_index, cal_index); - ret = afe_cmd_memory_map(cal_block->cal_data.paddr, - cal_block->map_data.map_size); - atomic_set(&this_afe.mem_map_cal_index, -1); - if (ret < 0) { - pr_err("%s: mmap did not work! size = %zd ret %d\n", - __func__, - cal_block->map_data.map_size, ret); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - cal_block->map_data.q6map_handle = atomic_read(&this_afe. - mem_map_cal_handles[cal_index]); -done: - return ret; -} - -static int afe_unmap_cal_data(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", - __func__); - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_err("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - atomic_set(&this_afe.mem_map_cal_handles[cal_index], - cal_block->map_data.q6map_handle); - atomic_set(&this_afe.mem_map_cal_index, cal_index); - ret = afe_cmd_memory_unmap_nowait( - cal_block->map_data.q6map_handle); - atomic_set(&this_afe.mem_map_cal_index, -1); - if (ret < 0) { - pr_err("%s: unmap did not work! cal_type %i ret %d\n", - __func__, cal_index, ret); - } - cal_block->map_data.q6map_handle = 0; -done: - return ret; -} - -static void afe_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(MAX_AFE_CAL_TYPES, this_afe.cal_data); -} - -static int afe_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{AFE_COMMON_RX_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_COMMON_TX_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_LSM_TX_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_AANC_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_FB_SPKR_PROT_CAL_TYPE, - {NULL, NULL, NULL, afe_set_cal_fb_spkr_prot, - afe_get_cal_fb_spkr_prot, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_HW_DELAY_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_SIDETONE_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_SIDETONE_IIR_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, - cal_utils_match_buf_num} }, - - {{AFE_LSM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - afe_set_cal, NULL, NULL} }, - {NULL, NULL, - cal_utils_match_buf_num} }, - - {{AFE_CUST_TOPOLOGY_CAL_TYPE, - {afe_alloc_cal, afe_dealloc_cal, NULL, - afe_set_cal, NULL, NULL} }, - {afe_map_cal_data, afe_unmap_cal_data, - cal_utils_match_buf_num} }, - - {{AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE, - {NULL, NULL, NULL, afe_set_cal_sp_th_vi_cfg, - afe_get_cal_sp_th_vi_param, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE, - {NULL, NULL, NULL, afe_set_cal_sp_ex_vi_ftm_cfg, - afe_get_cal_sp_ex_vi_ftm_param, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(MAX_AFE_CAL_TYPES, this_afe.cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type! %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - return ret; -err: - afe_delete_cal_data(); - return ret; -} - -int afe_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - result = -EINVAL; - goto done; - } - - result = afe_cmd_memory_map(cal_block->cal_data.paddr, - cal_block->map_data.map_size); - if (result < 0) { - pr_err("%s: afe_cmd_memory_map failed for addr = 0x%pK, size = %d, err %d\n", - __func__, &cal_block->cal_data.paddr, - cal_block->map_data.map_size, result); - return result; - } - cal_block->map_data.map_handle = this_afe.mmap_handle; - -done: - return result; -} - -int afe_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - - pr_debug("%s:\n", __func__); - - if (mem_map_handle == NULL) { - pr_err("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - goto done; - } - - result = afe_cmd_memory_unmap(*mem_map_handle); - if (result) { - pr_err("%s: AFE memory unmap failed %d, handle 0x%x\n", - __func__, result, *mem_map_handle); - goto done; - } else { - *mem_map_handle = 0; - } - -done: - return result; -} - -static void afe_release_uevent_data(struct kobject *kobj) -{ - struct audio_uevent_data *data = container_of(kobj, - struct audio_uevent_data, kobj); - - kfree(data); -} - -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - -int send_tfa_cal_apr(void *buf, int cmd_size, bool bRead) -{ - int32_t result, port_id = AFE_PORT_ID_TFADSP_RX; - uint32_t port_index = 0, payload_size = 0; - size_t len; - struct rtac_cal_block_data *tfa_cal = &(this_afe.tfa_cal); - struct mem_mapping_hdr mem_hdr; - struct param_hdr_v3 param_hdr; - - pr_debug("%s\n", __func__); - - memset(&mem_hdr, 0x00, sizeof(mem_hdr)); - memset(¶m_hdr, 0x00, sizeof(param_hdr)); - - if (0 == tfa_cal->map_data.dma_buf ) { - /*Minimal chunk size is 4K*/ - tfa_cal->map_data.map_size = SZ_4K; - result = msm_audio_ion_alloc(&(tfa_cal->map_data.dma_buf), - tfa_cal->map_data.map_size, - &(tfa_cal->cal_data.paddr), - &len, - &(tfa_cal->cal_data.kvaddr)); - if (result < 0) { - pr_err("%s: allocate buffer failed! ret = %d\n", - __func__, result); - goto err; - } - pr_debug("%s: paddr 0x%pK, kvaddr 0x%pK, map_size 0x%x\n", - __func__, - &tfa_cal->cal_data.paddr, - tfa_cal->cal_data.kvaddr, - tfa_cal->map_data.map_size); - } - - if (0 == tfa_cal->map_data.map_handle ) { - result = afe_map_rtac_block(tfa_cal); - if (result < 0) { - pr_err("%s: map buffer failed! ret = %d\n", - __func__, result); - goto err; - } - } - - port_index = q6audio_get_port_index(port_id); - if (port_index >= AFE_MAX_PORTS) { - pr_err("%s: Invalid AFE port = 0x%x\n", __func__, port_id); - goto err; - } - - if (cmd_size > (SZ_4K - sizeof(struct param_hdr_v3))) { - pr_err("%s: Invalid payload size = %d\n", __func__, cmd_size); - result = -EINVAL; - goto err; - } - - /* Pack message header with data */ - param_hdr.module_id = AFE_MODULE_ID_TFADSP_RX; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_size = cmd_size; - - if (!bRead) { - param_hdr.param_id = AFE_PARAM_ID_TFADSP_RX_CFG; - - q6common_pack_pp_params(tfa_cal->cal_data.kvaddr, - ¶m_hdr, - buf, - &payload_size); - tfa_cal->cal_data.size = payload_size; - } - else { - param_hdr.param_id = AFE_PARAM_ID_TFADSP_RX_GET_RESULT; - tfa_cal->cal_data.size = cmd_size + sizeof(struct param_hdr_v3) ; - } - - /*Send/Get package to/from ADSP*/ - mem_hdr.data_payload_addr_lsw = - lower_32_bits(tfa_cal->cal_data.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(tfa_cal->cal_data.paddr); - mem_hdr.mem_map_handle = - tfa_cal->map_data.map_handle; - - pr_debug("%s: Sending tfa_cal port = 0x%x, cal size = %zd, cal addr = 0x%pK\n", - __func__, port_id, tfa_cal->cal_data.size, &tfa_cal->cal_data.paddr); - - result = afe_q6_interface_prepare(); - if (result != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, result); - goto err; - } - - if (!bRead) { - if (q6common_is_instance_id_supported()) - result = q6afe_set_params_v3(port_id, port_index, &mem_hdr, NULL, payload_size); - else - result = q6afe_set_params_v2(port_id, port_index, &mem_hdr, NULL, payload_size); - } else { - int8_t *resp = (int8_t *)tfa_cal->cal_data.kvaddr; - - atomic_set(&this_afe.tfa_state, 1); - if (q6common_is_instance_id_supported()){ - result = q6afe_get_params_v3(port_id, port_index, &mem_hdr, ¶m_hdr); - resp += sizeof(struct param_hdr_v3); - } - else { - result = q6afe_get_params_v2(port_id, port_index, &mem_hdr, ¶m_hdr); - resp += sizeof(struct param_hdr_v1); - } - - if (result) { - pr_err("%s: get response from port 0x%x failed %d\n", __func__, port_id, result); - goto err; - } - else { - /*Copy response data to command buffer*/ - memcpy(buf, resp, cmd_size); - } - } - -err: - return result; -} -EXPORT_SYMBOL(send_tfa_cal_apr); - -void send_tfa_cal_unmap_memory(void) -{ - int result = 0; - - if (this_afe.tfa_cal.map_data.map_handle) { - result = afe_unmap_rtac_block(&this_afe.tfa_cal.map_data.map_handle); - - /*Force to remap after unmap failed*/ - if (result) - this_afe.tfa_cal.map_data.map_handle = 0; - } -} -EXPORT_SYMBOL(send_tfa_cal_unmap_memory); - -int send_tfa_cal_in_band(void *buf, int cmd_size) -{ - union afe_spkr_prot_config afe_spk_config; - int32_t port_id = AFE_PORT_ID_TFADSP_RX; - - if (cmd_size > sizeof(afe_spk_config)) - return -EINVAL; - - memcpy(&afe_spk_config, buf, cmd_size); - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_TFADSP_RX_CFG, - &afe_spk_config)) { - pr_err("%s: AFE_PARAM_ID_TFADSP_RX_CFG failed\n", - __func__); - } - - return 0; -} -EXPORT_SYMBOL(send_tfa_cal_in_band); - -int send_tfa_cal_set_bypass(void *buf, int cmd_size) -{ - union afe_spkr_prot_config afe_spk_config; - int32_t port_id = AFE_PORT_ID_TFADSP_RX; - - if (cmd_size > sizeof(afe_spk_config)) - return -EINVAL; - - memcpy(&afe_spk_config, buf, cmd_size); - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_TFADSP_RX_SET_BYPASS, - &afe_spk_config)) { - pr_err("%s: AFE_PARAM_ID_TFADSP_RX_SET_BYPASS failed\n", - __func__); - } - - return 0; -} -EXPORT_SYMBOL(send_tfa_cal_set_bypass); - -int send_tfa_cal_set_tx_enable(void *buf, int cmd_size) -{ - union afe_spkr_prot_config afe_spk_config; - int32_t port_id = AFE_PORT_ID_TFADSP_TX; - - if (cmd_size > sizeof(afe_spk_config)) - return -EINVAL; - - memcpy(&afe_spk_config, buf, cmd_size); - - if (afe_spk_prot_prepare(port_id, 0, - AFE_PARAM_ID_TFADSP_TX_SET_ENABLE, - &afe_spk_config)) { - pr_err("%s: AFE_PARAM_ID_TFADSP_TX_SET_ENABLE failed\n", - __func__); - } - - return 0; -} -EXPORT_SYMBOL(send_tfa_cal_set_tx_enable); - -#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ - -int __init afe_init(void) -{ - int i = 0, ret; - - atomic_set(&this_afe.state, 0); - atomic_set(&this_afe.status, 0); - atomic_set(&this_afe.mem_map_cal_index, -1); - this_afe.apr = NULL; - this_afe.dtmf_gen_rx_portid = -1; - this_afe.mmap_handle = 0; - this_afe.vi_tx_port = -1; - this_afe.vi_rx_port = -1; - this_afe.prot_cfg.mode = MSM_SPKR_PROT_DISABLED; - this_afe.th_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - this_afe.ex_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED; - mutex_init(&this_afe.afe_cmd_lock); - mutex_init(&this_afe.afe_apr_lock); - for (i = 0; i < AFE_MAX_PORTS; i++) { - this_afe.afe_cal_mode[i] = AFE_CAL_MODE_DEFAULT; - this_afe.afe_sample_rates[i] = 0; - this_afe.dev_acdb_id[i] = 0; - this_afe.island_mode[i] = 0; - this_afe.vad_cfg[i].is_enable = 0; - this_afe.vad_cfg[i].pre_roll = 0; - init_waitqueue_head(&this_afe.wait[i]); - } - init_waitqueue_head(&this_afe.wait_wakeup); - init_waitqueue_head(&this_afe.lpass_core_hw_wait); - wakeup_source_init(&wl.ws, "spkr-prot"); - ret = afe_init_cal_data(); - if (ret) - pr_err("%s: could not init cal data! %d\n", __func__, ret); - - config_debug_fs_init(); - - this_afe.uevent_data = kzalloc(sizeof(*(this_afe.uevent_data)), GFP_KERNEL); - if (!this_afe.uevent_data) - return -ENOMEM; - - /* - * Set release function to cleanup memory related to kobject - * before initializing the kobject. - */ - this_afe.uevent_data->ktype.release = afe_release_uevent_data; - q6core_init_uevent_data(this_afe.uevent_data, "q6afe_uevent"); - - INIT_WORK(&this_afe.afe_dc_work, afe_notify_dc_presence_work_fn); - INIT_WORK(&this_afe.afe_spdif_work, - afe_notify_spdif_fmt_update_work_fn); - - this_afe.event_notifier.notifier_call = afe_aud_event_notify; - msm_aud_evt_blocking_register_client(&this_afe.event_notifier); - - return 0; -} - -void afe_exit(void) -{ -#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI - afe_unmap_rtac_block(&this_afe.tfa_cal.map_data.map_handle); -#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/ - - if (this_afe.apr) { - apr_reset(this_afe.apr); - atomic_set(&this_afe.state, 0); - this_afe.apr = NULL; - rtac_set_afe_handle(this_afe.apr); - } - - q6core_destroy_uevent_data(this_afe.uevent_data); - - afe_delete_cal_data(); - - config_debug_fs_exit(); - mutex_destroy(&this_afe.afe_cmd_lock); - mutex_destroy(&this_afe.afe_apr_lock); - wakeup_source_trash(&wl.ws); -} - -/* - * afe_cal_init_hwdep - - * Initiliaze AFE HW dependent Node - * - * @card: pointer to sound card - * - */ -int afe_cal_init_hwdep(void *card) -{ - int ret = 0; - - this_afe.fw_data = kzalloc(sizeof(*(this_afe.fw_data)), - GFP_KERNEL); - if (!this_afe.fw_data) - return -ENOMEM; - - set_bit(Q6AFE_VAD_CORE_CAL, this_afe.fw_data->cal_bit); - ret = q6afe_cal_create_hwdep(this_afe.fw_data, Q6AFE_HWDEP_NODE, card); - if (ret < 0) { - pr_err("%s: couldn't create hwdep for AFE %d\n", __func__, ret); - return ret; - } - return ret; -} -EXPORT_SYMBOL(afe_cal_init_hwdep); - -/* - * afe_vote_lpass_core_hw - - * Voting for lpass core hardware - * - * @hw_block_id: ID of hw block to vote for - * @client_name: Name of the client - * @client_handle: Handle for the client - * - */ -int afe_vote_lpass_core_hw(uint32_t hw_block_id, char *client_name, - uint32_t *client_handle) -{ - struct afe_cmd_remote_lpass_core_hw_vote_request hw_vote_cfg; - struct afe_cmd_remote_lpass_core_hw_vote_request *cmd_ptr = - &hw_vote_cfg; - int ret = 0; - - if (!client_handle) { - pr_err("%s: Invalid client_handle\n", __func__); - return -EINVAL; - } - - if (!client_name) { - pr_err("%s: Invalid client_name\n", __func__); - *client_handle = 0; - return -EINVAL; - } - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - mutex_lock(&this_afe.afe_cmd_lock); - - memset(cmd_ptr, 0, sizeof(hw_vote_cfg)); - - cmd_ptr->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cmd_ptr->hdr.pkt_size = sizeof(hw_vote_cfg); - cmd_ptr->hdr.src_port = 0; - cmd_ptr->hdr.dest_port = 0; - cmd_ptr->hdr.token = 0; - cmd_ptr->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST; - cmd_ptr->hw_block_id = hw_block_id; - strlcpy(cmd_ptr->client_name, client_name, - sizeof(cmd_ptr->client_name)); - - pr_debug("%s: lpass core hw vote opcode[0x%x] hw id[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id); - - *client_handle = 0; - ret = afe_apr_send_pkt((uint32_t *) cmd_ptr, - &this_afe.lpass_core_hw_wait); - if (ret == 0) { - *client_handle = this_afe.lpass_hw_core_client_hdl; - pr_debug("%s: lpass_hw_core_client_hdl %d\n", __func__, - this_afe.lpass_hw_core_client_hdl); - } - - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_vote_lpass_core_hw); - -/* - * afe_unvote_lpass_core_hw - - * unvoting for lpass core hardware - * - * @hw_block_id: ID of hw block to vote for - * @client_handle: Handle for the client - * - */ -int afe_unvote_lpass_core_hw(uint32_t hw_block_id, uint32_t client_handle) -{ - struct afe_cmd_remote_lpass_core_hw_devote_request hw_vote_cfg; - struct afe_cmd_remote_lpass_core_hw_devote_request *cmd_ptr = - &hw_vote_cfg; - int ret = 0; - - ret = afe_q6_interface_prepare(); - if (ret != 0) { - pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret); - return ret; - } - - mutex_lock(&this_afe.afe_cmd_lock); - - memset(cmd_ptr, 0, sizeof(hw_vote_cfg)); - - cmd_ptr->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cmd_ptr->hdr.pkt_size = sizeof(hw_vote_cfg); - cmd_ptr->hdr.src_port = 0; - cmd_ptr->hdr.dest_port = 0; - cmd_ptr->hdr.token = 0; - cmd_ptr->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST; - cmd_ptr->hw_block_id = hw_block_id; - cmd_ptr->client_handle = client_handle; - - pr_debug("%s: lpass core hw devote opcode[0x%x] hw id[0x%x]\n", - __func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id); - - if (cmd_ptr->client_handle <= 0) { - pr_err("%s: invalid client handle\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = afe_apr_send_pkt((uint32_t *) cmd_ptr, - &this_afe.lpass_core_hw_wait); -done: - mutex_unlock(&this_afe.afe_cmd_lock); - return ret; -} -EXPORT_SYMBOL(afe_unvote_lpass_core_hw); - diff --git a/techpack/audio/dsp/q6afecal-hwdep.c b/techpack/audio/dsp/q6afecal-hwdep.c deleted file mode 100644 index 5fea2d27a40f..000000000000 --- a/techpack/audio/dsp/q6afecal-hwdep.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2015, 2017 - 2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include "q6afecal-hwdep.h" - -const int cal_size_info[Q6AFE_MAX_CAL] = { - [Q6AFE_VAD_CORE_CAL] = 132, -}; - -const char *cal_name_info[Q6AFE_MAX_CAL] = { - [Q6AFE_VAD_CORE_CAL] = "vad_core", -}; - -#define AFE_HW_NAME_LENGTH 40 - -/* - * q6afecal_get_fw_cal - - * To get calibration from AFE HW dependent node - * - * @fw_data: pointer to firmware data - * type: AFE calibration type - * - */ -struct firmware_cal *q6afecal_get_fw_cal(struct afe_fw_info *fw_data, - enum q6afe_cal_type type) -{ - if (!fw_data) { - pr_err("%s: fw_data is NULL\n", __func__); - return NULL; - } - if (type >= Q6AFE_MAX_CAL || - type < Q6AFE_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", __func__, type); - return NULL; - } - mutex_lock(&fw_data->lock); - if (!test_bit(Q6AFECAL_RECEIVED, - &fw_data->q6afecal_state[type])) { - pr_err("%s: cal not sent by userspace %d\n", - __func__, type); - mutex_unlock(&fw_data->lock); - return NULL; - } - set_bit(Q6AFECAL_INITIALISED, &fw_data->q6afecal_state[type]); - mutex_unlock(&fw_data->lock); - return fw_data->fw[type]; -} -EXPORT_SYMBOL(q6afecal_get_fw_cal); - -static int q6afecal_hwdep_ioctl_shared(struct snd_hwdep *hw, - struct q6afecal_ioctl_buffer fw_user) -{ - struct afe_fw_info *fw_data = hw->private_data; - struct firmware_cal **fw = fw_data->fw; - void *data; - - if (!test_bit(fw_user.cal_type, fw_data->cal_bit)) { - pr_err("%s: q6afe didn't set this %d!!\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.cal_type >= Q6AFE_MAX_CAL || - fw_user.cal_type < Q6AFE_MIN_CAL) { - pr_err("%s: wrong cal type sent %d\n", - __func__, fw_user.cal_type); - return -EFAULT; - } - if (fw_user.size > cal_size_info[fw_user.cal_type] || - fw_user.size <= 0) { - pr_err("%s: incorrect firmware size %d for %s\n", - __func__, fw_user.size, - cal_name_info[fw_user.cal_type]); - return -EFAULT; - } - data = fw[fw_user.cal_type]->data; - if (copy_from_user(data, fw_user.buffer, fw_user.size)) - return -EFAULT; - fw[fw_user.cal_type]->size = fw_user.size; - mutex_lock(&fw_data->lock); - set_bit(Q6AFECAL_RECEIVED, &fw_data->q6afecal_state[fw_user.cal_type]); - mutex_unlock(&fw_data->lock); - return 0; -} - -#ifdef CONFIG_COMPAT -struct q6afecal_ioctl_buffer32 { - u32 size; - compat_uptr_t buffer; - enum q6afe_cal_type cal_type; -}; - -enum { - SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32 = - _IOW('U', 0x1, struct q6afecal_ioctl_buffer32), -}; - -static int q6afecal_hwdep_ioctl_compat(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6afecal_ioctl_buffer __user *argp = (void __user *)arg; - struct q6afecal_ioctl_buffer32 fw_user32; - struct q6afecal_ioctl_buffer fw_user_compat; - - if (cmd != SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE32) { - pr_err("%s: wrong ioctl command sent %u!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user32, argp, sizeof(fw_user32))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - fw_user_compat.size = fw_user32.size; - fw_user_compat.buffer = compat_ptr(fw_user32.buffer); - fw_user_compat.cal_type = fw_user32.cal_type; - return q6afecal_hwdep_ioctl_shared(hw, fw_user_compat); -} -#else -#define q6afecal_hwdep_ioctl_compat NULL -#endif - -static int q6afecal_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct q6afecal_ioctl_buffer __user *argp = (void __user *)arg; - struct q6afecal_ioctl_buffer fw_user; - - if (cmd != SNDRV_IOCTL_HWDEP_VAD_CAL_TYPE) { - pr_err("%s: wrong ioctl command sent %d!\n", __func__, cmd); - return -ENOIOCTLCMD; - } - if (copy_from_user(&fw_user, argp, sizeof(fw_user))) { - pr_err("%s: failed to copy\n", __func__); - return -EFAULT; - } - return q6afecal_hwdep_ioctl_shared(hw, fw_user); -} - -static int q6afecal_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ - struct afe_fw_info *fw_data = hw->private_data; - - mutex_lock(&fw_data->lock); - /* clear all the calibrations */ - memset(fw_data->q6afecal_state, 0, - sizeof(fw_data->q6afecal_state)); - mutex_unlock(&fw_data->lock); - return 0; -} - -/** - * q6afe_cal_create_hwdep - - * for creating HW dependent node for AFE - * - * @data: Pointer to hold fw data - * @node: node type - * @card: Pointer to sound card - * - */ -int q6afe_cal_create_hwdep(void *data, int node, void *card) -{ - char hwname[AFE_HW_NAME_LENGTH]; - struct snd_hwdep *hwdep; - struct firmware_cal **fw; - struct afe_fw_info *fw_data = data; - int err, cal_bit; - - if (!fw_data || !card) { - pr_err("%s: Invalid parameters\n", __func__); - return -EINVAL; - } - - fw = fw_data->fw; - snprintf(hwname, strlen("Q6AFE"), "Q6AFE"); - err = snd_hwdep_new(((struct snd_soc_card *)card)->snd_card, - hwname, node, &hwdep); - if (err < 0) { - pr_err("%s: new hwdep for q6afe failed %d\n", __func__, err); - return err; - } - snprintf(hwdep->name, strlen("Q6AFECAL"), "Q6AFECAL"); - hwdep->iface = SNDRV_HWDEP_IFACE_AUDIO_BE; - hwdep->private_data = fw_data; - hwdep->ops.ioctl_compat = q6afecal_hwdep_ioctl_compat; - hwdep->ops.ioctl = q6afecal_hwdep_ioctl; - hwdep->ops.release = q6afecal_hwdep_release; - mutex_init(&fw_data->lock); - - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - set_bit(Q6AFECAL_UNINITIALISED, - &fw_data->q6afecal_state[cal_bit]); - fw[cal_bit] = kzalloc(sizeof *(fw[cal_bit]), GFP_KERNEL); - if (!fw[cal_bit]) { - pr_err("%s: no memory for %s cal\n", - __func__, cal_name_info[cal_bit]); - goto end; - } - } - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - fw[cal_bit]->data = kzalloc(cal_size_info[cal_bit], - GFP_KERNEL); - if (!fw[cal_bit]->data) - goto exit; - set_bit(Q6AFECAL_INITIALISED, - &fw_data->q6afecal_state[cal_bit]); - } - return 0; -exit: - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - kfree(fw[cal_bit]->data); - fw[cal_bit]->data = NULL; - } -end: - for_each_set_bit(cal_bit, fw_data->cal_bit, Q6AFE_MAX_CAL) { - kfree(fw[cal_bit]); - fw[cal_bit] = NULL; - } - return -ENOMEM; -} -EXPORT_SYMBOL(q6afe_cal_create_hwdep); diff --git a/techpack/audio/dsp/q6afecal-hwdep.h b/techpack/audio/dsp/q6afecal-hwdep.h deleted file mode 100644 index 7e6efdac57f4..000000000000 --- a/techpack/audio/dsp/q6afecal-hwdep.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2014,2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __Q6AFECAL_HWDEP_H__ -#define __Q6AFECAL_HWDEP_H__ -#include - -enum q6afe_cal_states { - Q6AFECAL_UNINITIALISED, - Q6AFECAL_INITIALISED, - Q6AFECAL_RECEIVED -}; - -struct afe_fw_info { - struct firmware_cal *fw[Q6AFE_MAX_CAL]; - DECLARE_BITMAP(cal_bit, Q6AFE_MAX_CAL); - /* for calibration tracking */ - unsigned long q6afecal_state[Q6AFE_MAX_CAL]; - struct mutex lock; -}; - -struct firmware_cal { - u8 *data; - size_t size; -}; - -#if IS_ENABLED(CONFIG_AFE_HWDEP) -int q6afe_cal_create_hwdep(void *fw, int node, void *card); -struct firmware_cal *q6afecal_get_fw_cal(struct afe_fw_info *fw_data, - enum q6afe_cal_type type); -#else /* CONFIG_AFE_HWDEP */ -static inline int q6afe_cal_create_hwdep(void *fw, int node, void *card) -{ - return 0; -} - -static inline struct firmware_cal *q6afecal_get_fw_cal( - struct afe_fw_info *fw_data, - enum q6afe_cal_type type) -{ - return NULL; -} -#endif /* CONFIG_AFE_HWDEP */ -#endif /* __Q6AFECAL_HWDEP_H__ */ diff --git a/techpack/audio/dsp/q6asm.c b/techpack/audio/dsp/q6asm.c deleted file mode 100644 index f89b01565870..000000000000 --- a/techpack/audio/dsp/q6asm.c +++ /dev/null @@ -1,11137 +0,0 @@ -/* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define TIMEOUT_MS 1000 -#define TRUE 0x01 -#define FALSE 0x00 -#define SESSION_MAX 8 - -#define ENC_FRAMES_PER_BUFFER 0x01 - -enum { - ASM_TOPOLOGY_CAL = 0, - ASM_CUSTOM_TOP_CAL, - ASM_AUDSTRM_CAL, - ASM_RTAC_APR_CAL, - ASM_MAX_CAL_TYPES -}; - -union asm_token_struct { - struct { - u8 stream_id; - u8 session_id; - u8 buf_index; - u8 flags; - } _token; - u32 token; -} __packed; - - -enum { - ASM_DIRECTION_OFFSET, - ASM_CMD_NO_WAIT_OFFSET, - /* - * Offset is limited to 7 because flags is stored in u8 - * field in asm_token_structure defined above. The offset - * starts from 0. - */ - ASM_MAX_OFFSET = 7, -}; - -enum { - WAIT_CMD, - NO_WAIT_CMD -}; - -#define ASM_SET_BIT(n, x) (n |= 1 << x) -#define ASM_TEST_BIT(n, x) ((n >> x) & 1) - -/* TODO, combine them together */ -static DEFINE_MUTEX(session_lock); -struct asm_mmap { - atomic_t ref_cnt; - void *apr; -}; - -static struct asm_mmap this_mmap; - -struct audio_session { - struct audio_client *ac; - spinlock_t session_lock; - struct mutex mutex_lock_per_session; -}; -/* session id: 0 reserved */ -static struct audio_session session[ASM_ACTIVE_STREAMS_ALLOWED + 1]; - -struct asm_buffer_node { - struct list_head list; - phys_addr_t buf_phys_addr; - uint32_t mmap_hdl; -}; -static int32_t q6asm_srvc_callback(struct apr_client_data *data, void *priv); -static int32_t q6asm_callback(struct apr_client_data *data, void *priv); -static void q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg); -static void q6asm_add_hdr_custom_topology(struct audio_client *ac, - struct apr_hdr *hdr, - uint32_t pkt_size); -static void q6asm_add_hdr_async(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg); -static int q6asm_memory_map_regions(struct audio_client *ac, int dir, - uint32_t bufsz, uint32_t bufcnt, - bool is_contiguous); -static int q6asm_memory_unmap_regions(struct audio_client *ac, int dir); -static void q6asm_reset_buf_state(struct audio_client *ac); - -static int q6asm_map_channels(u8 *channel_mapping, uint32_t channels, - bool use_back_flavor); -void *q6asm_mmap_apr_reg(void); - -static int q6asm_is_valid_session(struct apr_client_data *data, void *priv); -static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info); - -/* for ASM custom topology */ -static struct cal_type_data *cal_data[ASM_MAX_CAL_TYPES]; -static struct audio_buffer common_buf[2]; -static struct audio_client common_client; -static int set_custom_topology; -static int topology_map_handle; - -struct generic_get_data_ { - int valid; - int is_inband; - int size_in_ints; - int ints[]; -}; -static struct generic_get_data_ *generic_get_data; - -static inline void q6asm_set_flag_in_token(union asm_token_struct *asm_token, - int flag, int flag_offset) -{ - if (flag) - ASM_SET_BIT(asm_token->_token.flags, flag_offset); -} - -static inline int q6asm_get_flag_from_token(union asm_token_struct *asm_token, - int flag_offset) -{ - return ASM_TEST_BIT(asm_token->_token.flags, flag_offset); -} - -static inline void q6asm_update_token(u32 *token, u8 session_id, u8 stream_id, - u8 buf_index, u8 dir, u8 nowait_flag) -{ - union asm_token_struct asm_token; - - asm_token.token = 0; - asm_token._token.session_id = session_id; - asm_token._token.stream_id = stream_id; - asm_token._token.buf_index = buf_index; - q6asm_set_flag_in_token(&asm_token, dir, ASM_DIRECTION_OFFSET); - q6asm_set_flag_in_token(&asm_token, nowait_flag, - ASM_CMD_NO_WAIT_OFFSET); - *token = asm_token.token; -} - -static inline uint32_t q6asm_get_pcm_format_id(uint32_t media_format_block_ver) -{ - uint32_t pcm_format_id; - - switch (media_format_block_ver) { - case PCM_MEDIA_FORMAT_V5: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5; - break; - case PCM_MEDIA_FORMAT_V4: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4; - break; - case PCM_MEDIA_FORMAT_V3: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - break; - case PCM_MEDIA_FORMAT_V2: - default: - pcm_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - break; - } - return pcm_format_id; -} - -/* - * q6asm_get_buf_index_from_token: - * Retrieve buffer index from token. - * - * @token: token value sent to ASM service on q6. - * Returns buffer index in the read/write commands. - */ -uint8_t q6asm_get_buf_index_from_token(uint32_t token) -{ - union asm_token_struct asm_token; - - asm_token.token = token; - return asm_token._token.buf_index; -} -EXPORT_SYMBOL(q6asm_get_buf_index_from_token); - -/* - * q6asm_get_stream_id_from_token: - * Retrieve stream id from token. - * - * @token: token value sent to ASM service on q6. - * Returns stream id. - */ -uint8_t q6asm_get_stream_id_from_token(uint32_t token) -{ - union asm_token_struct asm_token; - - asm_token.token = token; - return asm_token._token.stream_id; -} -EXPORT_SYMBOL(q6asm_get_stream_id_from_token); - -static uint32_t adsp_reg_event_opcode[] = { - ASM_STREAM_CMD_REGISTER_PP_EVENTS, - ASM_STREAM_CMD_REGISTER_ENCDEC_EVENTS, - ASM_STREAM_CMD_REGISTER_IEC_61937_FMT_UPDATE }; - -static int is_adsp_reg_event(uint32_t cmd) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(adsp_reg_event_opcode); i++) { - if (cmd == adsp_reg_event_opcode[i]) - return i; - } - return -EINVAL; -} - -static uint32_t adsp_raise_event_opcode[] = { - ASM_STREAM_PP_EVENT, - ASM_STREAM_CMD_ENCDEC_EVENTS, - ASM_IEC_61937_MEDIA_FMT_EVENT }; - -static int is_adsp_raise_event(uint32_t cmd) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(adsp_raise_event_opcode); i++) { - if (cmd == adsp_raise_event_opcode[i]) - return i; - } - return -EINVAL; -} - -#ifdef CONFIG_DEBUG_FS -#define OUT_BUFFER_SIZE 56 -#define IN_BUFFER_SIZE 24 - -static struct timeval out_cold_tv; -static struct timeval out_warm_tv; -static struct timeval out_cont_tv; -static struct timeval in_cont_tv; -static long out_enable_flag; -static long in_enable_flag; -static struct dentry *out_dentry; -static struct dentry *in_dentry; -static int in_cont_index; -/*This var is used to keep track of first write done for cold output latency */ -static int out_cold_index; -static char *out_buffer; -static char *in_buffer; - -static int audio_output_latency_dbgfs_open(struct inode *inode, - struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} -static ssize_t audio_output_latency_dbgfs_read(struct file *file, - char __user *buf, size_t count, loff_t *ppos) -{ - if (out_buffer == NULL) { - pr_err("%s: out_buffer is null\n", __func__); - return 0; - } - if (count < OUT_BUFFER_SIZE) { - pr_err("%s: read size %d exceeds buf size %zd\n", __func__, - OUT_BUFFER_SIZE, count); - return 0; - } - snprintf(out_buffer, OUT_BUFFER_SIZE, "%ld,%ld,%ld,%ld,%ld,%ld,", - out_cold_tv.tv_sec, out_cold_tv.tv_usec, out_warm_tv.tv_sec, - out_warm_tv.tv_usec, out_cont_tv.tv_sec, out_cont_tv.tv_usec); - return simple_read_from_buffer(buf, OUT_BUFFER_SIZE, ppos, - out_buffer, OUT_BUFFER_SIZE); -} -static ssize_t audio_output_latency_dbgfs_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - char *temp; - - if (count > 2*sizeof(char)) { - pr_err("%s: err count is more %zd\n", __func__, count); - return -EINVAL; - } - temp = kmalloc(2*sizeof(char), GFP_KERNEL); - - out_cold_index = 0; - - if (temp) { - if (copy_from_user(temp, buf, 2*sizeof(char))) { - pr_err("%s: copy from user failed for size %zd\n", - __func__, 2*sizeof(char)); - kfree(temp); - return -EFAULT; - } - if (!kstrtol(temp, 10, &out_enable_flag)) { - kfree(temp); - return count; - } - kfree(temp); - } - return -EINVAL; -} -static const struct file_operations audio_output_latency_debug_fops = { - .open = audio_output_latency_dbgfs_open, - .read = audio_output_latency_dbgfs_read, - .write = audio_output_latency_dbgfs_write -}; -static int audio_input_latency_dbgfs_open(struct inode *inode, - struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} -static ssize_t audio_input_latency_dbgfs_read(struct file *file, - char __user *buf, size_t count, loff_t *ppos) -{ - if (in_buffer == NULL) { - pr_err("%s: in_buffer is null\n", __func__); - return 0; - } - if (count < IN_BUFFER_SIZE) { - pr_err("%s: read size %d exceeds buf size %zd\n", __func__, - IN_BUFFER_SIZE, count); - return 0; - } - snprintf(in_buffer, IN_BUFFER_SIZE, "%ld,%ld,", - in_cont_tv.tv_sec, in_cont_tv.tv_usec); - return simple_read_from_buffer(buf, IN_BUFFER_SIZE, ppos, - in_buffer, IN_BUFFER_SIZE); -} -static ssize_t audio_input_latency_dbgfs_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - char *temp; - - if (count > 2*sizeof(char)) { - pr_err("%s: err count is more %zd\n", __func__, count); - return -EINVAL; - } - temp = kmalloc(2*sizeof(char), GFP_KERNEL); - - if (temp) { - if (copy_from_user(temp, buf, 2*sizeof(char))) { - pr_err("%s: copy from user failed for size %zd\n", - __func__, 2*sizeof(char)); - kfree(temp); - return -EFAULT; - } - if (!kstrtol(temp, 10, &in_enable_flag)) { - kfree(temp); - return count; - } - kfree(temp); - } - return -EINVAL; -} -static const struct file_operations audio_input_latency_debug_fops = { - .open = audio_input_latency_dbgfs_open, - .read = audio_input_latency_dbgfs_read, - .write = audio_input_latency_dbgfs_write -}; - -static void config_debug_fs_write_cb(void) -{ - if (out_enable_flag) { - /* For first Write done log the time and reset - * out_cold_index - */ - if (out_cold_index != 1) { - do_gettimeofday(&out_cold_tv); - pr_debug("COLD: apr_send_pkt at %ld sec %ld microsec\n", - out_cold_tv.tv_sec, - out_cold_tv.tv_usec); - out_cold_index = 1; - } - pr_debug("%s: out_enable_flag %ld\n", - __func__, out_enable_flag); - } -} -static void config_debug_fs_read_cb(void) -{ - if (in_enable_flag) { - /* when in_cont_index == 7, DSP would be - * writing into the 8th 512 byte buffer and this - * timestamp is tapped here.Once done it then writes - * to 9th 512 byte buffer.These two buffers(8th, 9th) - * reach the test application in 5th iteration and that - * timestamp is tapped at user level. The difference - * of these two timestamps gives us the time between - * the time at which dsp started filling the sample - * required and when it reached the test application. - * Hence continuous input latency - */ - if (in_cont_index == 7) { - do_gettimeofday(&in_cont_tv); - pr_info("%s: read buffer at %ld sec %ld microsec\n", - __func__, - in_cont_tv.tv_sec, in_cont_tv.tv_usec); - } - in_cont_index++; - } -} - -static void config_debug_fs_reset_index(void) -{ - in_cont_index = 0; -} - -static void config_debug_fs_run(void) -{ - if (out_enable_flag) { - do_gettimeofday(&out_cold_tv); - pr_debug("%s: COLD apr_send_pkt at %ld sec %ld microsec\n", - __func__, out_cold_tv.tv_sec, out_cold_tv.tv_usec); - } -} - -static void config_debug_fs_write(struct audio_buffer *ab) -{ - if (out_enable_flag) { - char zero_pattern[2] = {0x00, 0x00}; - /* If First two byte is non zero and last two byte - * is zero then it is warm output pattern - */ - if ((strcmp(((char *)ab->data), zero_pattern)) && - (!strcmp(((char *)ab->data + 2), zero_pattern))) { - do_gettimeofday(&out_warm_tv); - pr_debug("%s: WARM:apr_send_pkt at %ld sec %ld microsec\n", - __func__, - out_warm_tv.tv_sec, - out_warm_tv.tv_usec); - pr_debug("%s: Warm Pattern Matched\n", __func__); - } - /* If First two byte is zero and last two byte is - * non zero then it is cont output pattern - */ - else if ((!strcmp(((char *)ab->data), zero_pattern)) - && (strcmp(((char *)ab->data + 2), zero_pattern))) { - do_gettimeofday(&out_cont_tv); - pr_debug("%s: CONT:apr_send_pkt at %ld sec %ld microsec\n", - __func__, - out_cont_tv.tv_sec, - out_cont_tv.tv_usec); - pr_debug("%s: Cont Pattern Matched\n", __func__); - } - } -} -static void config_debug_fs_init(void) -{ - out_buffer = kzalloc(OUT_BUFFER_SIZE, GFP_KERNEL); - if (out_buffer == NULL) - goto outbuf_fail; - - in_buffer = kzalloc(IN_BUFFER_SIZE, GFP_KERNEL); - if (in_buffer == NULL) - goto inbuf_fail; - - out_dentry = debugfs_create_file("audio_out_latency_measurement_node", - 0664, - NULL, NULL, &audio_output_latency_debug_fops); - if (IS_ERR(out_dentry)) { - pr_err("%s: debugfs_create_file failed\n", __func__); - goto file_fail; - } - in_dentry = debugfs_create_file("audio_in_latency_measurement_node", - 0664, - NULL, NULL, &audio_input_latency_debug_fops); - if (IS_ERR(in_dentry)) { - pr_err("%s: debugfs_create_file failed\n", __func__); - goto file_fail; - } - return; -file_fail: - kfree(in_buffer); -inbuf_fail: - kfree(out_buffer); -outbuf_fail: - in_buffer = NULL; - out_buffer = NULL; -} -#else -static void config_debug_fs_write(struct audio_buffer *ab) -{ -} -static void config_debug_fs_run(void) -{ -} -static void config_debug_fs_reset_index(void) -{ -} -static void config_debug_fs_read_cb(void) -{ -} -static void config_debug_fs_write_cb(void) -{ -} -static void config_debug_fs_init(void) -{ -} -#endif - -int q6asm_mmap_apr_dereg(void) -{ - int c; - - c = atomic_sub_return(1, &this_mmap.ref_cnt); - if (c == 0) { - apr_deregister(this_mmap.apr); - common_client.mmap_apr = NULL; - pr_debug("%s: APR De-Register common port\n", __func__); - } else if (c < 0) { - pr_err("%s: APR Common Port Already Closed %d\n", - __func__, c); - atomic_set(&this_mmap.ref_cnt, 0); - } - - return 0; -} - -static int q6asm_session_alloc(struct audio_client *ac) -{ - int n; - - for (n = 1; n <= ASM_ACTIVE_STREAMS_ALLOWED; n++) { - if (!(session[n].ac)) { - session[n].ac = ac; - return n; - } - } - pr_err("%s: session not available\n", __func__); - return -ENOMEM; -} - -static int q6asm_get_session_id_from_audio_client(struct audio_client *ac) -{ - int n; - - for (n = 1; n <= ASM_ACTIVE_STREAMS_ALLOWED; n++) { - if (session[n].ac == ac) - return n; - } - - pr_debug("%s: cannot find matching audio client. ac = %pK\n", - __func__, ac); - - return 0; -} - -static bool q6asm_is_valid_audio_client(struct audio_client *ac) -{ - return q6asm_get_session_id_from_audio_client(ac) ? 1 : 0; -} - -static void q6asm_session_free(struct audio_client *ac) -{ - int session_id; - unsigned long flags = 0; - - pr_debug("%s: sessionid[%d]\n", __func__, ac->session); - session_id = ac->session; - mutex_lock(&session[session_id].mutex_lock_per_session); - rtac_remove_popp_from_adm_devices(ac->session); - spin_lock_irqsave(&(session[session_id].session_lock), flags); - session[ac->session].ac = NULL; - ac->session = 0; - ac->perf_mode = LEGACY_PCM_MODE; - ac->fptr_cache_ops = NULL; - ac->cb = NULL; - ac->priv = NULL; - kfree(ac); - ac = NULL; - spin_unlock_irqrestore(&(session[session_id].session_lock), flags); - mutex_unlock(&session[session_id].mutex_lock_per_session); -} - -static uint32_t q6asm_get_next_buf(struct audio_client *ac, - uint32_t curr_buf, uint32_t max_buf_cnt) -{ - dev_vdbg(ac->dev, "%s: curr_buf = %d, max_buf_cnt = %d\n", - __func__, curr_buf, max_buf_cnt); - curr_buf += 1; - return (curr_buf >= max_buf_cnt) ? 0 : curr_buf; -} - -static int q6asm_map_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int result = 0; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - goto done; - } - - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - common_client.apr = common_client.mmap_apr; - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - goto done; - } - - /* Use second asm buf to map memory */ - if (common_client.port[IN].buf == NULL) { - pr_err("%s: common buf is NULL\n", - __func__); - result = -EINVAL; - goto done; - } - - common_client.port[IN].buf->phys = cal_block->cal_data.paddr; - - result = q6asm_memory_map_regions(&common_client, - IN, cal_block->map_data.map_size, 1, 1); - if (result < 0) { - pr_err("%s: mmap did not work! size = %zd result %d\n", - __func__, - cal_block->map_data.map_size, result); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - - list_for_each_safe(ptr, next, - &common_client.port[IN].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == cal_block->cal_data.paddr) { - cal_block->map_data.q6map_handle = buf_node->mmap_hdl; - break; - } - } -done: - return result; -} - -static int remap_cal_data(int32_t cal_type, struct cal_block_data *cal_block) -{ - int ret = 0; - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for cal type %d!\n", - __func__, cal_type); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - - ret = q6asm_map_cal_memory(cal_type, cal_block); - if (ret < 0) { - pr_err("%s: mmap did not work! size = %zd ret %d\n", - __func__, cal_block->map_data.map_size, ret); - goto done; - } - } -done: - return ret; -} - -static int q6asm_unmap_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int result = 0; - int result2 = 0; - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_debug("%s: No address to unmap!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (common_client.mmap_apr == NULL) { - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - } - - result2 = q6asm_memory_unmap_regions(&common_client, IN); - if (result2 < 0) { - pr_err("%s: unmap failed, err %d\n", - __func__, result2); - result = result2; - } - - cal_block->map_data.q6map_handle = 0; -done: - return result; -} - -int q6asm_unmap_cal_data(int cal_type, struct cal_block_data *cal_block) -{ - int ret = 0; - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle != 0)) { - - ret = q6asm_unmap_cal_memory(cal_type, cal_block); - if (ret < 0) { - pr_err("%s: unmap did not work! size = %zd ret %d\n", - __func__, cal_block->map_data.map_size, ret); - goto done; - } - } -done: - return ret; -} - -int send_asm_custom_topology(struct audio_client *ac) -{ - struct cal_block_data *cal_block = NULL; - struct cmd_set_topologies asm_top; - int result = 0; - int result1 = 0; - - if (cal_data[ASM_CUSTOM_TOP_CAL] == NULL) - goto done; - - mutex_lock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - if (!set_custom_topology) - goto unlock; - set_custom_topology = 0; - - cal_block = cal_utils_get_only_cal_block(cal_data[ASM_CUSTOM_TOP_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) - goto unlock; - - if (cal_block->cal_data.size == 0) { - pr_debug("%s: No cal to send!\n", __func__); - goto unlock; - } - - pr_debug("%s: Sending cal_index %d\n", __func__, ASM_CUSTOM_TOP_CAL); - - result = remap_cal_data(ASM_CUST_TOPOLOGY_CAL_TYPE, cal_block); - if (result) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, ASM_CUSTOM_TOP_CAL); - goto unlock; - } - - q6asm_add_hdr_custom_topology(ac, &asm_top.hdr, sizeof(asm_top)); - atomic_set(&ac->mem_state, -1); - asm_top.hdr.opcode = ASM_CMD_ADD_TOPOLOGIES; - asm_top.payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr); - asm_top.payload_addr_msw = msm_audio_populate_upper_32_bits( - cal_block->cal_data.paddr); - asm_top.mem_map_handle = cal_block->map_data.q6map_handle; - asm_top.payload_size = cal_block->cal_data.size; - - pr_debug("%s: Sending ASM_CMD_ADD_TOPOLOGIES payload = %pK, size = %d, map handle = 0x%x\n", - __func__, &cal_block->cal_data.paddr, - asm_top.payload_size, asm_top.mem_map_handle); - - result = apr_send_pkt(ac->apr, (uint32_t *) &asm_top); - if (result < 0) { - pr_err("%s: Set topologies failed result %d\n", - __func__, result); - pr_debug("%s: Set topologies failed payload = 0x%pK\n", - __func__, &cal_block->cal_data.paddr); - goto unmap; - - } - - result = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set topologies failed timeout\n", __func__); - pr_debug("%s: Set topologies failed after timedout payload = 0x%pK\n", - __func__, &cal_block->cal_data.paddr); - result = -ETIMEDOUT; - goto unmap; - } - if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - result = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - goto unmap; - } - -unmap: - result1 = q6asm_unmap_cal_memory(ASM_CUST_TOPOLOGY_CAL_TYPE, - cal_block); - if (result1 < 0) { - result = result1; - pr_debug("%s: unmap cal failed! %d\n", __func__, result); - } -unlock: - mutex_unlock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); -done: - return result; -} - -int q6asm_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - - pr_debug("%s:\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - result = -EINVAL; - goto done; - } - - if (common_client.mmap_apr == NULL) { - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - result = -EINVAL; - goto done; - } - - /* Use second asm buf to map memory */ - if (common_client.port[OUT].buf == NULL) { - pr_err("%s: common buf is NULL\n", - __func__); - result = -EINVAL; - goto done; - } - - common_client.port[OUT].buf->phys = cal_block->cal_data.paddr; - - result = q6asm_memory_map_regions(&common_client, - OUT, cal_block->map_data.map_size, 1, 1); - if (result < 0) { - pr_err("%s: mmap did not work! size = %d result %d\n", - __func__, - cal_block->map_data.map_size, result); - pr_debug("%s: mmap did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - goto done; - } - - list_for_each_safe(ptr, next, - &common_client.port[OUT].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == cal_block->cal_data.paddr) { - cal_block->map_data.map_handle = buf_node->mmap_hdl; - break; - } - } -done: - return result; -} - -int q6asm_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - int result2 = 0; - - pr_debug("%s:\n", __func__); - - if (mem_map_handle == NULL) { - pr_debug("%s: Map handle is NULL, nothing to unmap\n", - __func__); - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - goto done; - } - - if (common_client.mmap_apr == NULL) { - common_client.mmap_apr = q6asm_mmap_apr_reg(); - if (common_client.mmap_apr == NULL) { - pr_err("%s: q6asm_mmap_apr_reg failed\n", - __func__); - result = -EPERM; - goto done; - } - } - - - result2 = q6asm_memory_unmap_regions(&common_client, OUT); - if (result2 < 0) { - pr_err("%s: unmap failed, err %d\n", - __func__, result2); - result = result2; - } else { - *mem_map_handle = 0; - } - - result2 = q6asm_mmap_apr_dereg(); - if (result2 < 0) { - pr_err("%s: q6asm_mmap_apr_dereg failed, err %d\n", - __func__, result2); - result = result2; - } -done: - return result; -} - -int q6asm_audio_client_buf_free(unsigned int dir, - struct audio_client *ac) -{ - struct audio_port_data *port; - int cnt = 0; - int rc = 0; - - pr_debug("%s: Session id %d\n", __func__, ac->session); - mutex_lock(&ac->cmd_lock); - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - if (!port->buf) { - pr_err("%s: buf NULL\n", __func__); - mutex_unlock(&ac->cmd_lock); - return 0; - } - cnt = port->max_buf_cnt - 1; - - if (cnt >= 0) { - rc = q6asm_memory_unmap_regions(ac, dir); - if (rc < 0) - pr_err("%s: Memory_unmap_regions failed %d\n", - __func__, rc); - } - - while (cnt >= 0) { - if (port->buf[cnt].data) { - if (!rc || atomic_read(&ac->reset)) - msm_audio_ion_free( - port->buf[cnt].dma_buf); - - port->buf[cnt].dma_buf = NULL; - port->buf[cnt].data = NULL; - port->buf[cnt].phys = 0; - --(port->max_buf_cnt); - } - --cnt; - } - kfree(port->buf); - port->buf = NULL; - } - mutex_unlock(&ac->cmd_lock); - return 0; -} - -/** - * q6asm_audio_client_buf_free_contiguous - - * frees the memory buffers for ASM - * - * @dir: RX or TX direction - * @ac: audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_audio_client_buf_free_contiguous(unsigned int dir, - struct audio_client *ac) -{ - struct audio_port_data *port; - int cnt = 0; - int rc = 0; - - pr_debug("%s: Session id %d\n", __func__, ac->session); - mutex_lock(&ac->cmd_lock); - port = &ac->port[dir]; - if (!port->buf) { - mutex_unlock(&ac->cmd_lock); - return 0; - } - cnt = port->max_buf_cnt - 1; - - if (cnt >= 0) { - rc = q6asm_memory_unmap(ac, port->buf[0].phys, dir); - if (rc < 0) - pr_err("%s: Memory_unmap_regions failed %d\n", - __func__, rc); - } - - if (port->buf[0].data) { - pr_debug("%s: data[%pK], phys[%pK], dma_buf[%pK]\n", - __func__, - port->buf[0].data, - &port->buf[0].phys, - port->buf[0].dma_buf); - if (!rc || atomic_read(&ac->reset)) - msm_audio_ion_free(port->buf[0].dma_buf); - port->buf[0].dma_buf = NULL; - } - - while (cnt >= 0) { - port->buf[cnt].data = NULL; - port->buf[cnt].phys = 0; - cnt--; - } - port->max_buf_cnt = 0; - kfree(port->buf); - port->buf = NULL; - mutex_unlock(&ac->cmd_lock); - return 0; -} -EXPORT_SYMBOL(q6asm_audio_client_buf_free_contiguous); - -/** - * q6asm_audio_client_free - - * frees the audio client for ASM - * - * @ac: audio client handle - * - */ -void q6asm_audio_client_free(struct audio_client *ac) -{ - int loopcnt; - struct audio_port_data *port; - - if (!ac) { - pr_err("%s: ac %pK\n", __func__, ac); - return; - } - if (!ac->session) { - pr_err("%s: ac session invalid\n", __func__); - return; - } - - mutex_lock(&session_lock); - - pr_debug("%s: Session id %d\n", __func__, ac->session); - if (ac->io_mode & SYNC_IO_MODE) { - for (loopcnt = 0; loopcnt <= OUT; loopcnt++) { - port = &ac->port[loopcnt]; - if (!port->buf) - continue; - pr_debug("%s: loopcnt = %d\n", - __func__, loopcnt); - q6asm_audio_client_buf_free(loopcnt, ac); - } - } - - rtac_set_asm_handle(ac->session, NULL); - apr_deregister(ac->apr2); - apr_deregister(ac->apr); - q6asm_mmap_apr_dereg(); - ac->apr2 = NULL; - ac->apr = NULL; - ac->mmap_apr = NULL; - q6asm_session_free(ac); - - pr_debug("%s: APR De-Register\n", __func__); - -/*done:*/ - mutex_unlock(&session_lock); -} -EXPORT_SYMBOL(q6asm_audio_client_free); - -/** - * q6asm_set_io_mode - - * Update IO mode for ASM - * - * @ac: audio client handle - * @mode1: IO mode to update - * - * Returns 0 on success or error on failure - */ -int q6asm_set_io_mode(struct audio_client *ac, uint32_t mode1) -{ - uint32_t mode; - int ret = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - ac->io_mode &= 0xFF00; - mode = (mode1 & 0xF); - - pr_debug("%s: ac->mode after anding with FF00:0x%x,\n", - __func__, ac->io_mode); - - if ((mode == ASYNC_IO_MODE) || (mode == SYNC_IO_MODE)) { - ac->io_mode |= mode1; - pr_debug("%s: Set Mode to 0x%x\n", __func__, ac->io_mode); - } else { - pr_err("%s: Not an valid IO Mode:%d\n", __func__, ac->io_mode); - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(q6asm_set_io_mode); - -void *q6asm_mmap_apr_reg(void) -{ - if ((atomic_read(&this_mmap.ref_cnt) == 0) || - (this_mmap.apr == NULL)) { - this_mmap.apr = apr_register("ADSP", "ASM", - (apr_fn)q6asm_srvc_callback, - 0x0FFFFFFFF, &this_mmap); - if (this_mmap.apr == NULL) { - pr_debug("%s: Unable to register APR ASM common port\n", - __func__); - goto fail; - } - } - atomic_inc(&this_mmap.ref_cnt); - - return this_mmap.apr; -fail: - return NULL; -} - -/** - * q6asm_send_stream_cmd - - * command to send for ASM stream - * - * @ac: audio client handle - * @data: event data - * - * Returns 0 on success or error on failure - */ -int q6asm_send_stream_cmd(struct audio_client *ac, - struct msm_adsp_event_data *data) -{ - char *asm_params = NULL; - struct apr_hdr hdr; - int rc; - uint32_t sz = 0; - uint64_t actual_sz = 0; - int session_id = 0; - - if (!data || !ac) { - pr_err("%s: %s is NULL\n", __func__, - (!data) ? "data" : "ac"); - rc = -EINVAL; - goto done; - } - - session_id = q6asm_get_session_id_from_audio_client(ac); - if (!session_id) { - rc = -EINVAL; - goto done; - } - - if (data->event_type >= ARRAY_SIZE(adsp_reg_event_opcode)) { - pr_err("%s: event %u out of boundary of array size of (%lu)\n", - __func__, data->event_type, - (long)ARRAY_SIZE(adsp_reg_event_opcode)); - rc = -EINVAL; - goto done; - } - - actual_sz = sizeof(struct apr_hdr) + data->payload_len; - if (actual_sz > U32_MAX) { - pr_err("%s: payload size 0x%X exceeds limit\n", - __func__, data->payload_len); - rc = -EINVAL; - goto done; - } - - sz = (uint32_t)actual_sz; - asm_params = kzalloc(sz, GFP_KERNEL); - if (!asm_params) { - rc = -ENOMEM; - goto done; - } - - mutex_lock(&session[session_id].mutex_lock_per_session); - if (!q6asm_is_valid_audio_client(ac)) { - rc = -EINVAL; - goto fail_send_param; - } - - q6asm_add_hdr_async(ac, &hdr, sz, TRUE); - atomic_set(&ac->cmd_state_pp, -1); - hdr.opcode = adsp_reg_event_opcode[data->event_type]; - memcpy(asm_params, &hdr, sizeof(struct apr_hdr)); - memcpy(asm_params + sizeof(struct apr_hdr), - data->payload, data->payload_len); - rc = apr_send_pkt(ac->apr, (uint32_t *) asm_params); - if (rc < 0) { - pr_err("%s: stream event cmd apr pkt failed\n", __func__); - rc = -EINVAL; - goto fail_send_param; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state_pp) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout for stream event cmd resp\n", __func__); - rc = -ETIMEDOUT; - goto fail_send_param; - } - - if (atomic_read(&ac->cmd_state_pp) > 0) { - pr_err("%s: DSP returned error[%s] for stream event cmd\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state_pp))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state_pp)); - goto fail_send_param; - } - - rc = 0; -fail_send_param: - mutex_unlock(&session[session_id].mutex_lock_per_session); - kfree(asm_params); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_send_stream_cmd); - -/** - * q6asm_audio_client_alloc - - * Alloc audio client for ASM - * - * @cb: callback fn - * @priv: private data - * - * Returns ac pointer on success or NULL on failure - */ -struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv) -{ - struct audio_client *ac; - int n; - int lcnt = 0; - int rc = 0; - - ac = kzalloc(sizeof(struct audio_client), GFP_KERNEL); - if (!ac) - return NULL; - - mutex_lock(&session_lock); - n = q6asm_session_alloc(ac); - if (n <= 0) { - pr_err("%s: ASM Session alloc fail n=%d\n", __func__, n); - mutex_unlock(&session_lock); - kfree(ac); - goto fail_session; - } - ac->session = n; - ac->cb = cb; - ac->path_delay = UINT_MAX; - ac->priv = priv; - ac->io_mode = SYNC_IO_MODE; - ac->perf_mode = LEGACY_PCM_MODE; - ac->fptr_cache_ops = NULL; - /* DSP expects stream id from 1 */ - ac->stream_id = 1; - ac->apr = apr_register("ADSP", "ASM", - (apr_fn)q6asm_callback, - ((ac->session) << 8 | 0x0001), - ac); - - if (ac->apr == NULL) { - pr_err("%s: Registration with APR failed\n", __func__); - mutex_unlock(&session_lock); - goto fail_apr1; - } - ac->apr2 = apr_register("ADSP", "ASM", - (apr_fn)q6asm_callback, - ((ac->session) << 8 | 0x0002), - ac); - - if (ac->apr2 == NULL) { - pr_err("%s: Registration with APR-2 failed\n", __func__); - mutex_unlock(&session_lock); - goto fail_apr2; - } - - rtac_set_asm_handle(n, ac->apr); - - pr_debug("%s: Registering the common port with APR\n", __func__); - ac->mmap_apr = q6asm_mmap_apr_reg(); - if (ac->mmap_apr == NULL) { - mutex_unlock(&session_lock); - goto fail_mmap; - } - - init_waitqueue_head(&ac->cmd_wait); - init_waitqueue_head(&ac->time_wait); - init_waitqueue_head(&ac->mem_wait); - atomic_set(&ac->time_flag, 1); - atomic_set(&ac->reset, 0); - INIT_LIST_HEAD(&ac->port[0].mem_map_handle); - INIT_LIST_HEAD(&ac->port[1].mem_map_handle); - pr_debug("%s: mem_map_handle list init'ed\n", __func__); - mutex_init(&ac->cmd_lock); - for (lcnt = 0; lcnt <= OUT; lcnt++) { - mutex_init(&ac->port[lcnt].lock); - spin_lock_init(&ac->port[lcnt].dsp_lock); - } - atomic_set(&ac->cmd_state, 0); - atomic_set(&ac->cmd_state_pp, 0); - atomic_set(&ac->mem_state, 0); - - rc = send_asm_custom_topology(ac); - if (rc < 0) { - mutex_unlock(&session_lock); - goto fail_mmap; - } - - pr_debug("%s: session[%d]\n", __func__, ac->session); - - mutex_unlock(&session_lock); - - return ac; -fail_mmap: - apr_deregister(ac->apr2); -fail_apr2: - apr_deregister(ac->apr); -fail_apr1: - q6asm_session_free(ac); -fail_session: - return NULL; -} -EXPORT_SYMBOL(q6asm_audio_client_alloc); - -/** - * q6asm_get_audio_client - - * Retrieve audio client for ASM - * - * @session_id: ASM session id - * - * Returns valid pointer on success or NULL on failure - */ -struct audio_client *q6asm_get_audio_client(int session_id) -{ - if (session_id == ASM_CONTROL_SESSION) - return &common_client; - - if ((session_id <= 0) || (session_id > ASM_ACTIVE_STREAMS_ALLOWED)) { - pr_err("%s: invalid session: %d\n", __func__, session_id); - goto err; - } - - if (!(session[session_id].ac)) { - pr_err("%s: session not active: %d\n", __func__, session_id); - goto err; - } - return session[session_id].ac; -err: - return NULL; -} -EXPORT_SYMBOL(q6asm_get_audio_client); - -/** - * q6asm_audio_client_buf_alloc - - * Allocs memory from ION for ASM - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @bufsz: size of each buffer - * @bufcnt: number of buffers to alloc - * - * Returns 0 on success or error on failure - */ -int q6asm_audio_client_buf_alloc(unsigned int dir, - struct audio_client *ac, - unsigned int bufsz, - uint32_t bufcnt) -{ - int cnt = 0; - int rc = 0; - struct audio_buffer *buf; - size_t len; - - if (!(ac) || !(bufsz) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK bufsz %d dir %d\n", __func__, ac, bufsz, - dir); - return -EINVAL; - } - - pr_debug("%s: session[%d]bufsz[%d]bufcnt[%d]\n", __func__, ac->session, - bufsz, bufcnt); - - if (ac->session <= 0 || ac->session > 8) { - pr_err("%s: Session ID is invalid, session = %d\n", __func__, - ac->session); - goto fail; - } - - if (ac->io_mode & SYNC_IO_MODE) { - if (ac->port[dir].buf) { - pr_debug("%s: buffer already allocated\n", __func__); - return 0; - } - mutex_lock(&ac->cmd_lock); - if (bufcnt > (U32_MAX/sizeof(struct audio_buffer))) { - pr_err("%s: Buffer size overflows", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - buf = kzalloc(((sizeof(struct audio_buffer))*bufcnt), - GFP_KERNEL); - - if (!buf) { - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - ac->port[dir].buf = buf; - - while (cnt < bufcnt) { - if (bufsz > 0) { - if (!buf[cnt].data) { - rc = msm_audio_ion_alloc( - &buf[cnt].dma_buf, - bufsz, - &buf[cnt].phys, - &len, - &buf[cnt].data); - if (rc) { - pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", - __func__, rc); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - buf[cnt].used = 1; - buf[cnt].size = bufsz; - buf[cnt].actual_size = bufsz; - pr_debug("%s: data[%pK]phys[%pK][%pK]\n", - __func__, - buf[cnt].data, - &buf[cnt].phys, - &buf[cnt].phys); - cnt++; - } - } - } - ac->port[dir].max_buf_cnt = cnt; - - mutex_unlock(&ac->cmd_lock); - rc = q6asm_memory_map_regions(ac, dir, bufsz, cnt, 0); - if (rc < 0) { - pr_err("%s: CMD Memory_map_regions failed %d for size %d\n", - __func__, rc, bufsz); - goto fail; - } - } - return 0; -fail: - q6asm_audio_client_buf_free(dir, ac); - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_audio_client_buf_alloc); - -/** - * q6asm_audio_client_buf_alloc_contiguous - - * Alloc contiguous memory from ION for ASM - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @bufsz: size of each buffer - * @bufcnt: number of buffers to alloc - * - * Returns 0 on success or error on failure - */ -int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir, - struct audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt) -{ - int cnt = 0; - int rc = 0; - struct audio_buffer *buf; - size_t len; - int bytes_to_alloc; - - if (!(ac) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return -EINVAL; - } - - pr_debug("%s: session[%d]bufsz[%d]bufcnt[%d]\n", - __func__, ac->session, - bufsz, bufcnt); - - if (ac->session <= 0 || ac->session > 8) { - pr_err("%s: Session ID is invalid, session = %d\n", __func__, - ac->session); - goto fail; - } - - if (ac->port[dir].buf) { - pr_err("%s: buffer already allocated\n", __func__); - return 0; - } - mutex_lock(&ac->cmd_lock); - buf = kzalloc(((sizeof(struct audio_buffer))*bufcnt), - GFP_KERNEL); - - if (!buf) { - pr_err("%s: buffer allocation failed\n", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - ac->port[dir].buf = buf; - - /* check for integer overflow */ - if ((bufcnt > 0) && ((INT_MAX / bufcnt) < bufsz)) { - pr_err("%s: integer overflow\n", __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - bytes_to_alloc = bufsz * bufcnt; - - /* The size to allocate should be multiple of 4K bytes */ - bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); - - rc = msm_audio_ion_alloc(&buf[0].dma_buf, - bytes_to_alloc, - &buf[0].phys, &len, - &buf[0].data); - if (rc) { - pr_err("%s: Audio ION alloc is failed, rc = %d\n", - __func__, rc); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - - buf[0].used = dir ^ 1; - buf[0].size = bufsz; - buf[0].actual_size = bufsz; - cnt = 1; - while (cnt < bufcnt) { - if (bufsz > 0) { - buf[cnt].data = buf[0].data + (cnt * bufsz); - buf[cnt].phys = buf[0].phys + (cnt * bufsz); - if (!buf[cnt].data) { - pr_err("%s: Buf alloc failed\n", - __func__); - mutex_unlock(&ac->cmd_lock); - goto fail; - } - buf[cnt].used = dir ^ 1; - buf[cnt].size = bufsz; - buf[cnt].actual_size = bufsz; - pr_debug("%s: data[%pK]phys[%pK][%pK]\n", - __func__, - buf[cnt].data, - &buf[cnt].phys, - &buf[cnt].phys); - } - cnt++; - } - ac->port[dir].max_buf_cnt = cnt; - mutex_unlock(&ac->cmd_lock); - rc = q6asm_memory_map_regions(ac, dir, bufsz, cnt, 1); - if (rc < 0) { - pr_err("%s: CMD Memory_map_regions failed %d for size %d\n", - __func__, rc, bufsz); - goto fail; - } - return 0; -fail: - q6asm_audio_client_buf_free_contiguous(dir, ac); - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_audio_client_buf_alloc_contiguous); - -static int32_t q6asm_srvc_callback(struct apr_client_data *data, void *priv) -{ - uint32_t dir = 0; - uint32_t i = IN; - uint32_t *payload; - unsigned long dsp_flags = 0; - unsigned long flags = 0; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - union asm_token_struct asm_token; - - struct audio_client *ac = NULL; - struct audio_port_data *port; - - int session_id; - - if (!data) { - pr_err("%s: Invalid CB\n", __func__); - return 0; - } - - payload = data->payload; - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event is received: %d %d apr[%pK]\n", - __func__, - data->reset_event, - data->reset_proc, - this_mmap.apr); - atomic_set(&this_mmap.ref_cnt, 0); - apr_reset(this_mmap.apr); - this_mmap.apr = NULL; - for (; i <= OUT; i++) { - list_for_each_safe(ptr, next, - &common_client.port[i].mem_map_handle) { - buf_node = list_entry(ptr, - struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == - common_client.port[i].buf->phys) { - list_del(&buf_node->list); - kfree(buf_node); - } - } - pr_debug("%s: Clearing custom topology\n", __func__); - } - - cal_utils_clear_cal_block_q6maps(ASM_MAX_CAL_TYPES, cal_data); - common_client.mmap_apr = NULL; - mutex_lock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - set_custom_topology = 1; - mutex_unlock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - topology_map_handle = 0; - rtac_clear_mapping(ASM_RTAC_CAL); - return 0; - } - asm_token.token = data->token; - session_id = asm_token._token.session_id; - - if ((session_id > 0 && session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_lock_irqsave(&(session[session_id].session_lock), flags); - - ac = q6asm_get_audio_client(session_id); - dir = q6asm_get_flag_from_token(&asm_token, ASM_DIRECTION_OFFSET); - - if (!ac) { - pr_debug("%s: session[%d] already freed\n", - __func__, session_id); - if ((session_id > 0 && - session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - if (data->payload_size >= 2 * sizeof(uint32_t)) { - pr_debug("%s:ptr0[0x%x]ptr1[0x%x]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]sid[%d]dir[%d]\n", - __func__, payload[0], payload[1], data->opcode, - data->token, data->payload_size, data->src_port, - data->dest_port, asm_token._token.session_id, dir); - pr_debug("%s:Payload = [0x%x] status[0x%x]\n", - __func__, payload[0], payload[1]); - } else if (data->payload_size == sizeof(uint32_t)) { - pr_debug("%s:ptr0[0x%x]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]sid[%d]dir[%d]\n", - __func__, payload[0], data->opcode, - data->token, data->payload_size, data->src_port, - data->dest_port, asm_token._token.session_id, dir); - pr_debug("%s:Payload = [0x%x]\n", - __func__, payload[0]); - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - switch (payload[0]) { - case ASM_CMD_SHARED_MEM_MAP_REGIONS: - case ASM_CMD_SHARED_MEM_UNMAP_REGIONS: - case ASM_CMD_ADD_TOPOLOGIES: - if (data->payload_size >= 2 * sizeof(uint32_t) && payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x sid:%d\n", - __func__, payload[0], payload[1], - asm_token._token.session_id); - if (payload[0] == - ASM_CMD_SHARED_MEM_UNMAP_REGIONS) - atomic_set(&ac->unmap_cb_success, 0); - - atomic_set(&ac->mem_state, payload[1]); - wake_up(&ac->mem_wait); - } else { - if (payload[0] == - ASM_CMD_SHARED_MEM_UNMAP_REGIONS) - atomic_set(&ac->unmap_cb_success, 1); - } - - if (atomic_cmpxchg(&ac->mem_state, -1, 0) == -1) - wake_up(&ac->mem_wait); - if (data->payload_size >= 2 * sizeof(uint32_t)) - dev_vdbg(ac->dev, "%s: Payload = [0x%x] status[0x%x]\n", - __func__, payload[0], payload[1]); - else - dev_vdbg(ac->dev, "%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - break; - default: - pr_debug("%s: command[0x%x] not expecting rsp\n", - __func__, payload[0]); - break; - } - if ((session_id > 0 && - session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - port = &ac->port[dir]; - - switch (data->opcode) { - case ASM_CMDRSP_SHARED_MEM_MAP_REGIONS:{ - pr_debug("%s:PL#0[0x%x] dir=0x%x s_id=0x%x\n", - __func__, payload[0], dir, asm_token._token.session_id); - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - if (atomic_cmpxchg(&ac->mem_state, -1, 0) == -1) { - ac->port[dir].tmp_hdl = payload[0]; - wake_up(&ac->mem_wait); - } - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - break; - } - case ASM_CMD_SHARED_MEM_UNMAP_REGIONS:{ - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: PL#0[0x%x]PL#1 [0x%x]\n", - __func__, payload[0], payload[1]); - else - pr_debug("%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - if (atomic_cmpxchg(&ac->mem_state, -1, 0) == -1) - wake_up(&ac->mem_wait); - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - - break; - } - default: - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: command[0x%x]success [0x%x]\n", - __func__, payload[0], payload[1]); - else - pr_debug("%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - } - if (ac->cb) - ac->cb(data->opcode, data->token, - data->payload, ac->priv); - if ((session_id > 0 && session_id <= ASM_ACTIVE_STREAMS_ALLOWED)) - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - - return 0; -} - -static void q6asm_process_mtmx_get_param_rsp(struct audio_client *ac, - struct asm_mtmx_strtr_get_params_cmdrsp *cmdrsp) -{ - struct asm_session_mtmx_strtr_param_session_time_v3_t *time; - - if (cmdrsp->err_code) { - dev_err_ratelimited(ac->dev, - "%s: err=%x, mod_id=%x, param_id=%x\n", - __func__, cmdrsp->err_code, - cmdrsp->param_info.module_id, - cmdrsp->param_info.param_id); - return; - } - dev_dbg_ratelimited(ac->dev, - "%s: mod_id=%x, param_id=%x\n", __func__, - cmdrsp->param_info.module_id, - cmdrsp->param_info.param_id); - - switch (cmdrsp->param_info.module_id) { - case ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC: - switch (cmdrsp->param_info.param_id) { - case ASM_SESSION_MTMX_STRTR_PARAM_SESSION_TIME_V3: - time = &cmdrsp->param_data.session_time; - dev_vdbg(ac->dev, "%s: GET_TIME_V3, time_lsw=%x, time_msw=%x\n", - __func__, time->session_time_lsw, - time->session_time_msw); - ac->time_stamp = (uint64_t)(((uint64_t) - time->session_time_msw << 32) | - time->session_time_lsw); - if (time->flags & - ASM_SESSION_MTMX_STRTR_PARAM_STIME_TSTMP_FLG_BMASK) - dev_warn_ratelimited(ac->dev, - "%s: recv inval tstmp\n", - __func__); - if (atomic_cmpxchg(&ac->time_flag, 1, 0)) - wake_up(&ac->time_wait); - - break; - default: - dev_err(ac->dev, "%s: unexpected param_id %x\n", - __func__, cmdrsp->param_info.param_id); - break; - } - break; - default: - dev_err(ac->dev, "%s: unexpected mod_id %x\n", __func__, - cmdrsp->param_info.module_id); - break; - } -} - -static int32_t q6asm_callback(struct apr_client_data *data, void *priv) -{ - int i = 0; - struct audio_client *ac = (struct audio_client *)priv; - unsigned long dsp_flags = 0; - uint32_t *payload; - uint32_t wakeup_flag = 1; - int32_t ret = 0; - union asm_token_struct asm_token; - uint8_t buf_index; - struct msm_adsp_event_data *pp_event_package = NULL; - uint32_t payload_size = 0; - unsigned long flags = 0; - int session_id; - - if (ac == NULL) { - pr_err("%s: ac NULL\n", __func__); - return -EINVAL; - } - if (data == NULL) { - pr_err("%s: data NULL\n", __func__); - return -EINVAL; - } - - session_id = q6asm_get_session_id_from_audio_client(ac); - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: Session ID is invalid, session = %d\n", __func__, - session_id); - return -EINVAL; - } - spin_lock_irqsave(&(session[session_id].session_lock), flags); - - if (!q6asm_is_valid_audio_client(ac)) { - pr_err("%s: audio client pointer is invalid, ac = %pK\n", - __func__, ac); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return -EINVAL; - } - - payload = data->payload; - asm_token.token = data->token; - if (q6asm_get_flag_from_token(&asm_token, ASM_CMD_NO_WAIT_OFFSET)) { - pr_debug("%s: No wait command opcode[0x%x] cmd_opcode:%x\n", - __func__, data->opcode, payload ? payload[0] : 0); - wakeup_flag = 0; - } - - if (data->opcode == RESET_EVENTS) { - atomic_set(&ac->reset, 1); - if (ac->apr == NULL) { - ac->apr = ac->apr2; - ac->apr2 = NULL; - } - pr_debug("%s: Reset event is received: %d %d apr[%pK]\n", - __func__, - data->reset_event, data->reset_proc, ac->apr); - if (ac->cb) - ac->cb(data->opcode, data->token, - (uint32_t *)data->payload, ac->priv); - apr_reset(ac->apr); - ac->apr = NULL; - atomic_set(&ac->time_flag, 0); - atomic_set(&ac->cmd_state, 0); - atomic_set(&ac->mem_state, 0); - atomic_set(&ac->cmd_state_pp, 0); - wake_up(&ac->time_wait); - wake_up(&ac->cmd_wait); - wake_up(&ac->mem_wait); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - dev_vdbg(ac->dev, "%s: session[%d]opcode[0x%x] token[0x%x]payload_size[%d] src[%d] dest[%d]\n", - __func__, - ac->session, data->opcode, - data->token, data->payload_size, data->src_port, - data->dest_port); - if ((data->opcode != ASM_DATA_EVENT_RENDERED_EOS) && - (data->opcode != ASM_DATA_EVENT_EOS) && - (data->opcode != ASM_SESSION_EVENTX_OVERFLOW) && - (data->opcode != ASM_SESSION_EVENT_RX_UNDERFLOW)) { - if (payload == NULL) { - pr_err("%s: payload is null\n", __func__); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return -EINVAL; - } - if(data->payload_size >= 2 * sizeof(uint32_t)) - dev_vdbg(ac->dev, "%s: Payload = [0x%x] status[0x%x] opcode 0x%x\n", - __func__, payload[0], payload[1], data->opcode); - else - dev_vdbg(ac->dev, "%s: Payload size of %d is less than expected.\n", - __func__, data->payload_size); - } - if (data->opcode == APR_BASIC_RSP_RESULT) { - switch (payload[0]) { - case ASM_STREAM_CMD_SET_PP_PARAMS_V2: - case ASM_STREAM_CMD_SET_PP_PARAMS_V3: - if (rtac_make_asm_callback(ac->session, payload, - data->payload_size)) - break; - case ASM_SESSION_CMD_PAUSE: - case ASM_SESSION_CMD_SUSPEND: - case ASM_DATA_CMD_EOS: - case ASM_STREAM_CMD_CLOSE: - case ASM_STREAM_CMD_FLUSH: - case ASM_SESSION_CMD_RUN_V2: - case ASM_SESSION_CMD_REGISTER_FORX_OVERFLOW_EVENTS: - case ASM_STREAM_CMD_FLUSH_READBUFS: - pr_debug("%s: session %d opcode 0x%x token 0x%x Payload = [0x%x] src %d dest %d\n", - __func__, ac->session, data->opcode, data->token, - payload[0], data->src_port, data->dest_port); - ret = q6asm_is_valid_session(data, priv); - if (ret != 0) { - pr_err("%s: session invalid %d\n", __func__, ret); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return ret; - } - case ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2: - case ASM_STREAM_CMD_OPEN_READ_V3: - case ASM_STREAM_CMD_OPEN_WRITE_V3: - case ASM_STREAM_CMD_OPEN_PULL_MODE_WRITE: - case ASM_STREAM_CMD_OPEN_PUSH_MODE_READ: - case ASM_STREAM_CMD_OPEN_READWRITE_V2: - case ASM_STREAM_CMD_OPEN_LOOPBACK_V2: - case ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK: - case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: - case ASM_DATA_CMD_IEC_60958_MEDIA_FMT: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2: - case ASM_STREAM_CMD_REGISTER_ENCDEC_EVENTS: - case ASM_STREAM_CMD_REGISTER_IEC_61937_FMT_UPDATE: - case ASM_DATA_CMD_REMOVE_INITIAL_SILENCE: - case ASM_DATA_CMD_REMOVE_TRAILING_SILENCE: - case ASM_SESSION_CMD_REGISTER_FOR_RX_UNDERFLOW_EVENTS: - case ASM_STREAM_CMD_OPEN_READ_COMPRESSED: - case ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED: - if (data->payload_size >= 2 * sizeof(uint32_t)) { - pr_debug("%s: session %d opcode 0x%x token 0x%x Payload = [0x%x] stat 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - payload[0], payload[1], - data->src_port, data->dest_port); - if (payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - if (wakeup_flag) { - if ((is_adsp_reg_event(payload[0]) >= - 0) || - (payload[0] == - ASM_STREAM_CMD_SET_PP_PARAMS_V2) || - (payload[0] == - ASM_STREAM_CMD_SET_PP_PARAMS_V3)) - atomic_set(&ac->cmd_state_pp, - payload[1]); - else - atomic_set(&ac->cmd_state, - payload[1]); - wake_up(&ac->cmd_wait); - } - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return 0; - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - if ((is_adsp_reg_event(payload[0]) >= 0) || - (payload[0] == ASM_STREAM_CMD_SET_PP_PARAMS_V2) || - (payload[0] == ASM_STREAM_CMD_SET_PP_PARAMS_V3)) { - if (atomic_read(&ac->cmd_state_pp) && - wakeup_flag) { - atomic_set(&ac->cmd_state_pp, 0); - wake_up(&ac->cmd_wait); - } - } else { - if (atomic_read(&ac->cmd_state) && - wakeup_flag) { - atomic_set(&ac->cmd_state, 0); - wake_up(&ac->cmd_wait); - } - } - if (ac->cb) - ac->cb(data->opcode, data->token, - (uint32_t *)data->payload, ac->priv); - break; - case ASM_CMD_ADD_TOPOLOGIES: - if (data->payload_size >= 2 * sizeof(uint32_t)) { - pr_debug("%s:Payload = [0x%x]stat[0x%x]\n", - __func__, payload[0], payload[1]); - if (payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); - if (wakeup_flag) { - atomic_set(&ac->mem_state, payload[1]); - wake_up(&ac->mem_wait); - } - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return 0; - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - if (atomic_read(&ac->mem_state) && wakeup_flag) { - atomic_set(&ac->mem_state, 0); - wake_up(&ac->mem_wait); - } - if (ac->cb) - ac->cb(data->opcode, data->token, - (uint32_t *)data->payload, ac->priv); - break; - case ASM_DATA_EVENT_WATERMARK: { - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: Watermark opcode[0x%x] status[0x%x]", - __func__, payload[0], payload[1]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - break; - } - case ASM_STREAM_CMD_GET_PP_PARAMS_V2: - case ASM_STREAM_CMD_GET_PP_PARAMS_V3: - pr_debug("%s: ASM_STREAM_CMD_GET_PP_PARAMS session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, data->opcode, - data->token, data->src_port, data->dest_port); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2 */ - if (data->payload_size >= 2 * sizeof(uint32_t)) { - if (payload[1] != 0) { - pr_err("%s: ASM get param error = %d, resuming\n", - __func__, payload[1]); - rtac_make_asm_callback(ac->session, payload, - data->payload_size); - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - break; - case ASM_STREAM_CMD_REGISTER_PP_EVENTS: - pr_debug("%s: ASM_STREAM_CMD_REGISTER_PP_EVENTS session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - if (data->payload_size >= 2 * sizeof(uint32_t)) { - if (payload[1] != 0) - pr_err("%s: ASM get param error = %d, resuming\n", - __func__, payload[1]); - atomic_set(&ac->cmd_state_pp, payload[1]); - wake_up(&ac->cmd_wait); - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - break; - default: - pr_debug("%s: command[0x%x] not expecting rsp\n", - __func__, payload[0]); - break; - } - - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - switch (data->opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2:{ - struct audio_port_data *port = &ac->port[IN]; - if (data->payload_size >= 2 * sizeof(uint32_t)) - dev_vdbg(ac->dev, "%s: Rxed opcode[0x%x] status[0x%x] token[%d]", - __func__, payload[0], payload[1], - data->token); - else - dev_err(ac->dev, "%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - if (ac->io_mode & SYNC_IO_MODE) { - if (port->buf == NULL) { - pr_err("%s: Unexpected Write Done\n", - __func__); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - buf_index = asm_token._token.buf_index; - if (buf_index < 0 || buf_index >= port->max_buf_cnt) { - pr_debug("%s: Invalid buffer index %u\n", - __func__, buf_index); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - if (data->payload_size >= 2 * sizeof(uint32_t) && - (lower_32_bits(port->buf[buf_index].phys) != - payload[0] || - msm_audio_populate_upper_32_bits( - port->buf[buf_index].phys) != payload[1])) { - pr_debug("%s: Expected addr %pK\n", - __func__, &port->buf[buf_index].phys); - pr_err("%s: rxedl[0x%x] rxedu [0x%x]\n", - __func__, payload[0], payload[1]); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - port->buf[buf_index].used = 1; - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - - config_debug_fs_write_cb(); - - for (i = 0; i < port->max_buf_cnt; i++) - dev_vdbg(ac->dev, "%s %d\n", - __func__, port->buf[i].used); - - } - break; - } - case ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2: - case ASM_STREAM_CMDRSP_GET_PP_PARAMS_V3: - pr_debug("%s: ASM_STREAM_CMDRSP_GET_PP_PARAMS session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, data->opcode, data->token, - data->src_port, data->dest_port); - if (payload[0] != 0) { - pr_err("%s: ASM_STREAM_CMDRSP_GET_PP_PARAMS returned error = 0x%x\n", - __func__, payload[0]); - } else if (generic_get_data) { - generic_get_data->valid = 1; - if (generic_get_data->is_inband) { - if (data->payload_size >= 4 * sizeof(uint32_t)) - pr_debug("%s: payload[1] = 0x%x, payload[2]=0x%x, payload[3]=0x%x\n", - __func__, payload[1], payload[2], payload[3]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, - data->payload_size); - - if (data->payload_size >= (4 + (payload[3]>>2)) * sizeof(uint32_t)) { - generic_get_data->size_in_ints = payload[3]>>2; - for (i = 0; i < payload[3]>>2; i++) { - generic_get_data->ints[i] = - payload[4+i]; - pr_debug("%s: ASM callback val %i = %i\n", - __func__, i, payload[4+i]); - } - } else { - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - } - pr_debug("%s: callback size in ints = %i\n", - __func__, - generic_get_data->size_in_ints); - } - if (atomic_read(&ac->cmd_state) && wakeup_flag) { - atomic_set(&ac->cmd_state, 0); - wake_up(&ac->cmd_wait); - } - break; - } - rtac_make_asm_callback(ac->session, payload, - data->payload_size); - break; - case ASM_DATA_EVENT_READ_DONE_V2:{ - - struct audio_port_data *port = &ac->port[OUT]; - - config_debug_fs_read_cb(); - - dev_vdbg(ac->dev, "%s: ReadDone: status=%d buff_add=0x%x act_size=%d offset=%d\n", - __func__, payload[READDONE_IDX_STATUS], - payload[READDONE_IDX_BUFADD_LSW], - payload[READDONE_IDX_SIZE], - payload[READDONE_IDX_OFFSET]); - - dev_vdbg(ac->dev, "%s: ReadDone:msw_ts=%d lsw_ts=%d memmap_hdl=0x%x flags=%d id=%d num=%d\n", - __func__, payload[READDONE_IDX_MSW_TS], - payload[READDONE_IDX_LSW_TS], - payload[READDONE_IDX_MEMMAP_HDL], - payload[READDONE_IDX_FLAGS], - payload[READDONE_IDX_SEQ_ID], - payload[READDONE_IDX_NUMFRAMES]); - - if (ac->io_mode & SYNC_IO_MODE) { - if (port->buf == NULL) { - pr_err("%s: Unexpected Read Done\n", __func__); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - buf_index = asm_token._token.buf_index; - if (buf_index < 0 || buf_index >= port->max_buf_cnt) { - pr_debug("%s: Invalid buffer index %u\n", - __func__, buf_index); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - spin_unlock_irqrestore( - &(session[session_id].session_lock), - flags); - return -EINVAL; - } - port->buf[buf_index].used = 0; - if (lower_32_bits(port->buf[buf_index].phys) != - payload[READDONE_IDX_BUFADD_LSW] || - msm_audio_populate_upper_32_bits( - port->buf[buf_index].phys) != - payload[READDONE_IDX_BUFADD_MSW]) { - dev_vdbg(ac->dev, "%s: Expected addr %pK\n", - __func__, &port->buf[buf_index].phys); - pr_err("%s: rxedl[0x%x] rxedu[0x%x]\n", - __func__, - payload[READDONE_IDX_BUFADD_LSW], - payload[READDONE_IDX_BUFADD_MSW]); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } - port->buf[buf_index].actual_size = - payload[READDONE_IDX_SIZE]; - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - } - break; - } - case ASM_DATA_EVENT_EOS: - case ASM_DATA_EVENT_RENDERED_EOS: - pr_debug("%s: EOS ACK received: rxed session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - break; - case ASM_SESSION_EVENTX_OVERFLOW: - pr_debug("%s: ASM_SESSION_EVENTX_OVERFLOW session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - break; - case ASM_SESSION_EVENT_RX_UNDERFLOW: - pr_debug("%s: ASM_SESSION_EVENT_RX_UNDERFLOW session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - break; - case ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3: - if (data->payload_size >= 3 * sizeof(uint32_t)) { - dev_vdbg(ac->dev, "%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3, payload[0] = %d, payload[1] = %d, payload[2] = %d\n", - __func__, - payload[0], payload[1], payload[2]); - ac->time_stamp = (uint64_t)(((uint64_t)payload[2] << 32) | - payload[1]); - } else { - dev_err(ac->dev, "%s: payload size of %x is less than expected.n", - __func__, data->payload_size); - } - if (atomic_cmpxchg(&ac->time_flag, 1, 0)) - wake_up(&ac->time_wait); - break; - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY session %d opcode 0x%x token 0x%x src %d dest %d\n", - __func__, ac->session, - data->opcode, data->token, - data->src_port, data->dest_port); - if (data->payload_size >= 4 * sizeof(uint32_t)) - pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0] = %d, payload[1] = %d, payload[2] = %d, payload[3] = %d\n", - __func__, - payload[0], payload[1], payload[2], - payload[3]); - else - pr_debug("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - break; - case ASM_SESSION_CMDRSP_GET_MTMX_STRTR_PARAMS_V2: - q6asm_process_mtmx_get_param_rsp(ac, (void *) payload); - break; - case ASM_STREAM_PP_EVENT: - case ASM_STREAM_CMD_ENCDEC_EVENTS: - case ASM_STREAM_CMD_REGISTER_IEC_61937_FMT_UPDATE: - if (data->payload_size >= 2 * sizeof(uint32_t)) - pr_debug("%s: ASM_STREAM_EVENT payload[0][0x%x] payload[1][0x%x]", - __func__, payload[0], payload[1]); - else - pr_debug("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - i = is_adsp_raise_event(data->opcode); - if (i < 0) { - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - } - - /* repack payload for asm_stream_pp_event - * package is composed of event type + size + actual payload - */ - payload_size = data->payload_size; - if (payload_size > UINT_MAX - sizeof(struct msm_adsp_event_data)) { - pr_err("%s: payload size = %d exceeds limit.\n", - __func__, payload_size); - spin_unlock(&(session[session_id].session_lock)); - return -EINVAL; - } - - pp_event_package = kzalloc(payload_size - + sizeof(struct msm_adsp_event_data), - GFP_ATOMIC); - if (!pp_event_package) { - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return -ENOMEM; - } - - pp_event_package->event_type = i; - pp_event_package->payload_len = payload_size; - memcpy((void *)pp_event_package->payload, - data->payload, payload_size); - ac->cb(data->opcode, data->token, - (void *)pp_event_package, ac->priv); - kfree(pp_event_package); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; - case ASM_SESSION_CMDRSP_ADJUST_SESSION_CLOCK_V2: - if (data->payload_size >= 3 * sizeof(uint32_t)) - pr_debug("%s: ASM_SESSION_CMDRSP_ADJUST_SESSION_CLOCK_V2 sesion %d status 0x%x msw %u lsw %u\n", - __func__, ac->session, payload[0], payload[2], - payload[1]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - wake_up(&ac->cmd_wait); - break; - case ASM_SESSION_CMDRSP_GET_PATH_DELAY_V2: - if (data->payload_size >= 3 * sizeof(uint32_t)) - pr_debug("%s: ASM_SESSION_CMDRSP_GET_PATH_DELAY_V2 session %d status 0x%x msw %u lsw %u\n", - __func__, ac->session, payload[0], payload[2], - payload[1]); - else - pr_err("%s: payload size of %x is less than expected.\n", - __func__, data->payload_size); - if (payload[0] == 0 && data->payload_size >= 2 * sizeof(uint32_t)) { - atomic_set(&ac->cmd_state, 0); - /* ignore msw, as a delay that large shouldn't happen */ - ac->path_delay = payload[1]; - } else { - atomic_set(&ac->cmd_state, payload[0]); - ac->path_delay = UINT_MAX; - } - wake_up(&ac->cmd_wait); - break; - } - if (ac->cb) - ac->cb(data->opcode, data->token, - data->payload, ac->priv); - spin_unlock_irqrestore( - &(session[session_id].session_lock), flags); - return 0; -} - -/** - * q6asm_is_cpu_buf_avail - - * retrieve next CPU buf avail - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @size: size pointer to be updated with size of buffer - * @index: index pointer to be updated with - * CPU buffer index available - * - * Returns buffer pointer on success or NULL on failure - */ -void *q6asm_is_cpu_buf_avail(int dir, struct audio_client *ac, uint32_t *size, - uint32_t *index) -{ - void *data; - unsigned char idx; - struct audio_port_data *port; - - if (!ac || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return NULL; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - - mutex_lock(&port->lock); - idx = port->cpu_buf; - if (port->buf == NULL) { - pr_err("%s: Buffer pointer null\n", __func__); - mutex_unlock(&port->lock); - return NULL; - } - /* dir 0: used = 0 means buf in use - * dir 1: used = 1 means buf in use - */ - if (port->buf[idx].used == dir) { - /* To make it more robust, we could loop and get the - * next avail buf, its risky though - */ - pr_err_ratelimited("%s: Next buf idx[0x%x] not available, dir[%d]\n", - __func__, idx, dir); - mutex_unlock(&port->lock); - return NULL; - } - *size = port->buf[idx].actual_size; - *index = port->cpu_buf; - data = port->buf[idx].data; - dev_vdbg(ac->dev, "%s: session[%d]index[%d] data[%pK]size[%d]\n", - __func__, - ac->session, - port->cpu_buf, - data, *size); - /* By default increase the cpu_buf cnt - * user accesses this function,increase cpu - * buf(to avoid another api) - */ - port->buf[idx].used = dir; - port->cpu_buf = q6asm_get_next_buf(ac, port->cpu_buf, - port->max_buf_cnt); - mutex_unlock(&port->lock); - return data; - } - return NULL; -} -EXPORT_SYMBOL(q6asm_is_cpu_buf_avail); - -/** - * q6asm_cpu_buf_release - - * releases cpu buffer for ASM - * - * @dir: RX or TX direction - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_cpu_buf_release(int dir, struct audio_client *ac) -{ - struct audio_port_data *port; - int ret = 0; - int idx; - - if (!ac || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - ret = -EINVAL; - goto exit; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - mutex_lock(&port->lock); - idx = port->cpu_buf; - if (port->cpu_buf == 0) { - port->cpu_buf = port->max_buf_cnt - 1; - } else if (port->cpu_buf < port->max_buf_cnt) { - port->cpu_buf = port->cpu_buf - 1; - } else { - pr_err("%s: buffer index(%d) out of range\n", - __func__, port->cpu_buf); - ret = -EINVAL; - mutex_unlock(&port->lock); - goto exit; - } - port->buf[port->cpu_buf].used = dir ^ 1; - mutex_unlock(&port->lock); - } -exit: - return ret; -} -EXPORT_SYMBOL(q6asm_cpu_buf_release); - -/** - * q6asm_is_cpu_buf_avail_nolock - - * retrieve next CPU buf avail without lock acquire - * - * @dir: RX or TX direction - * @ac: Audio client handle - * @size: size pointer to be updated with size of buffer - * @index: index pointer to be updated with - * CPU buffer index available - * - * Returns buffer pointer on success or NULL on failure - */ -void *q6asm_is_cpu_buf_avail_nolock(int dir, struct audio_client *ac, - uint32_t *size, uint32_t *index) -{ - void *data; - unsigned char idx; - struct audio_port_data *port; - - if (!ac || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return NULL; - } - - port = &ac->port[dir]; - - idx = port->cpu_buf; - if (port->buf == NULL) { - pr_err("%s: Buffer pointer null\n", __func__); - return NULL; - } - /* - * dir 0: used = 0 means buf in use - * dir 1: used = 1 means buf in use - */ - if (port->buf[idx].used == dir) { - /* - * To make it more robust, we could loop and get the - * next avail buf, its risky though - */ - pr_err_ratelimited("%s: Next buf idx[0x%x] not available, dir[%d]\n", - __func__, idx, dir); - return NULL; - } - *size = port->buf[idx].actual_size; - *index = port->cpu_buf; - data = port->buf[idx].data; - dev_vdbg(ac->dev, "%s: session[%d]index[%d] data[%pK]size[%d]\n", - __func__, ac->session, port->cpu_buf, - data, *size); - /* - * By default increase the cpu_buf cnt - * user accesses this function,increase cpu - * buf(to avoid another api) - */ - port->buf[idx].used = dir; - port->cpu_buf = q6asm_get_next_buf(ac, port->cpu_buf, - port->max_buf_cnt); - return data; -} -EXPORT_SYMBOL(q6asm_is_cpu_buf_avail_nolock); - -int q6asm_is_dsp_buf_avail(int dir, struct audio_client *ac) -{ - int ret = -1; - struct audio_port_data *port; - uint32_t idx; - - if (!ac || (dir != OUT)) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); - return ret; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[dir]; - - mutex_lock(&port->lock); - idx = port->dsp_buf; - - if (port->buf[idx].used == (dir ^ 1)) { - /* To make it more robust, we could loop and get the - * next avail buf, its risky though - */ - pr_err_ratelimited("%s: Next buf idx[0x%x] not available, dir[%d]\n", - __func__, idx, dir); - mutex_unlock(&port->lock); - return ret; - } - dev_vdbg(ac->dev, "%s: session[%d]dsp_buf=%d cpu_buf=%d\n", - __func__, - ac->session, port->dsp_buf, port->cpu_buf); - ret = ((port->dsp_buf != port->cpu_buf) ? 0 : -1); - mutex_unlock(&port->lock); - } - return ret; -} - -static void __q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg, uint32_t stream_id) -{ - unsigned long flags = 0; - - dev_vdbg(ac->dev, "%s: pkt_size=%d cmd_flg=%d session=%d stream_id=%d\n", - __func__, pkt_size, cmd_flg, ac->session, stream_id); - mutex_lock(&ac->cmd_lock); - spin_lock_irqsave(&(session[ac->session].session_lock), flags); - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL", __func__); - spin_unlock_irqrestore( - &(session[ac->session].session_lock), flags); - mutex_unlock(&ac->cmd_lock); - return; - } - - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = ((struct apr_svc *)ac->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_ASM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id); - hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id); - if (cmd_flg) - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - hdr->pkt_size = pkt_size; - spin_unlock_irqrestore( - &(session[ac->session].session_lock), flags); - mutex_unlock(&ac->cmd_lock); -} - -static void q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg) -{ - __q6asm_add_hdr(ac, hdr, pkt_size, cmd_flg, ac->stream_id); -} - -static void q6asm_stream_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg, int32_t stream_id) -{ - __q6asm_add_hdr(ac, hdr, pkt_size, cmd_flg, stream_id); -} - -static void __q6asm_add_hdr_async(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg, - uint32_t stream_id, u8 no_wait_flag) -{ - dev_vdbg(ac->dev, "%s: pkt_size = %d, cmd_flg = %d, session = %d stream_id=%d\n", - __func__, pkt_size, cmd_flg, ac->session, stream_id); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - if (ac->apr == NULL) { - pr_err("%s: AC APR is NULL", __func__); - return; - } - hdr->src_svc = ((struct apr_svc *)ac->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_ASM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id); - hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id); - if (cmd_flg) { - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - no_wait_flag); - - } - hdr->pkt_size = pkt_size; -} - -static void q6asm_add_hdr_async(struct audio_client *ac, struct apr_hdr *hdr, - uint32_t pkt_size, uint32_t cmd_flg) -{ - __q6asm_add_hdr_async(ac, hdr, pkt_size, cmd_flg, - ac->stream_id, WAIT_CMD); -} - -static void q6asm_stream_add_hdr_async(struct audio_client *ac, - struct apr_hdr *hdr, uint32_t pkt_size, - uint32_t cmd_flg, int32_t stream_id) -{ - __q6asm_add_hdr_async(ac, hdr, pkt_size, cmd_flg, - stream_id, NO_WAIT_CMD); -} - -static void q6asm_add_hdr_custom_topology(struct audio_client *ac, - struct apr_hdr *hdr, - uint32_t pkt_size) -{ - pr_debug("%s: pkt_size=%d session=%d\n", - __func__, pkt_size, ac->session); - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return; - } - - mutex_lock(&ac->cmd_lock); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = ((struct apr_svc *)ac->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_ASM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((ac->session << 8) & 0xFF00) | 0x01; - hdr->dest_port = 0; - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - hdr->pkt_size = pkt_size; - mutex_unlock(&ac->cmd_lock); -} - -static void q6asm_add_mmaphdr(struct audio_client *ac, struct apr_hdr *hdr, - u32 pkt_size, int dir) -{ - pr_debug("%s: pkt size=%d\n", - __func__, pkt_size); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->src_port = 0; - hdr->dest_port = 0; - q6asm_update_token(&hdr->token, - ac->session, - 0, /* Stream ID is NA */ - 0, /* Buffer index is NA */ - dir, - WAIT_CMD); - hdr->pkt_size = pkt_size; -} - -/** - * q6asm_set_pp_params - * command to set ASM parameter data - * send memory mapping header for out of band case - * send pre-packed parameter data for in band case - * - * @ac: audio client handle - * @mem_hdr: memory mapping header - * @param_data: pre-packed parameter payload - * @param_size: size of pre-packed parameter data - * - * Returns 0 on success or error on failure - */ -int q6asm_set_pp_params(struct audio_client *ac, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 param_size) -{ - struct asm_stream_cmd_set_pp_params *asm_set_param = NULL; - int pkt_size = 0; - int ret = 0; - int session_id = 0; - - if (ac == NULL) { - pr_err("%s: Audio Client is NULL\n", __func__); - return -EINVAL; - } else if (ac->apr == NULL) { - pr_err("%s: APR pointer is NULL\n", __func__); - return -EINVAL; - } - - session_id = q6asm_get_session_id_from_audio_client(ac); - if (!session_id) - return -EINVAL; - - pkt_size = sizeof(struct asm_stream_cmd_set_pp_params); - /* Add param size to packet size when sending in-band only */ - if (param_data != NULL) - pkt_size += param_size; - asm_set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!asm_set_param) - return -ENOMEM; - - mutex_lock(&session[session_id].mutex_lock_per_session); - if (!q6asm_is_valid_audio_client(ac)) { - ret = -EINVAL; - goto done; - } - - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - q6asm_add_hdr_async(ac, &asm_set_param->apr_hdr, pkt_size, TRUE); - - /* With pre-packed data, only the opcode differs from V2 and V3. */ - if (q6common_is_instance_id_supported()) - asm_set_param->apr_hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V3; - else - asm_set_param->apr_hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; - - asm_set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - /* Out of band case */ - asm_set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - /* - * In band case. Parameter data must be pre-packed with its - * header before calling this function. Use - * q6common_pack_pp_params to pack parameter data and header - * correctly. - */ - memcpy(&asm_set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both mem header and param data\n", - __func__); - ret = -EINVAL; - goto done; - } - - atomic_set(&ac->cmd_state_pp, -1); - ret = apr_send_pkt(ac->apr, (uint32_t *)asm_set_param); - if (ret < 0) { - pr_err("%s: apr send failed rc %d\n", __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(ac->cmd_wait, - atomic_read(&ac->cmd_state_pp) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout sending apr pkt\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (atomic_read(&ac->cmd_state_pp) > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(atomic_read(&ac->cmd_state_pp))); - ret = adsp_err_get_lnx_err_code(atomic_read(&ac->cmd_state_pp)); - goto done; - } - ret = 0; -done: - mutex_unlock(&session[session_id].mutex_lock_per_session); - kfree(asm_set_param); - return ret; -} -EXPORT_SYMBOL(q6asm_set_pp_params); - -/** - * q6asm_pack_and_set_pp_param_in_band - * command to pack and set parameter data for in band case - * - * @ac: audio client handle - * @param_hdr: parameter header - * @param_data: parameter data - * - * Returns 0 on success or error on failure - */ -int q6asm_pack_and_set_pp_param_in_band(struct audio_client *ac, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_data = NULL; - u32 packed_size = sizeof(union param_hdrs) + param_hdr.param_size; - int ret = 0; - - if (ac == NULL) { - pr_err("%s: Audio Client is NULL\n", __func__); - return -EINVAL; - } - - packed_data = kzalloc(packed_size, GFP_KERNEL); - if (packed_data == NULL) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_data, ¶m_hdr, param_data, - &packed_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d\n", __func__, ret); - goto done; - } - - ret = q6asm_set_pp_params(ac, NULL, packed_data, packed_size); -done: - kfree(packed_data); - return ret; -} -EXPORT_SYMBOL(q6asm_pack_and_set_pp_param_in_band); - -/** - * q6asm_set_soft_volume_module_instance_ids - * command to set module and instance ids for soft volume - * - * @instance: soft volume instance - * @param_hdr: parameter header - * - * Returns 0 on success or error on failure - */ -int q6asm_set_soft_volume_module_instance_ids(int instance, - struct param_hdr_v3 *param_hdr) -{ - if (param_hdr == NULL) { - pr_err("%s: Param header is NULL\n", __func__); - return -EINVAL; - } - - switch (instance) { - case SOFT_VOLUME_INSTANCE_2: - param_hdr->module_id = ASM_MODULE_ID_VOL_CTRL2; - param_hdr->instance_id = INSTANCE_ID_0; - return 0; - case SOFT_VOLUME_INSTANCE_1: - param_hdr->module_id = ASM_MODULE_ID_VOL_CTRL; - param_hdr->instance_id = INSTANCE_ID_0; - return 0; - default: - pr_err("%s: Invalid instance %d\n", __func__, instance); - return -EINVAL; - } -} -EXPORT_SYMBOL(q6asm_set_soft_volume_module_instance_ids); - -/** - * q6asm_open_read_compressed - - * command to open ASM in compressed read mode - * - * @ac: Audio client handle - * @format: capture format for ASM - * @passthrough_flag: flag to indicate passthrough option - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag) -{ - int rc = 0; - struct asm_stream_cmd_open_read_compressed open; - - if (ac == NULL) { - pr_err("%s: ac[%pK] NULL\n", __func__, ac); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: APR handle[%pK] NULL\n", __func__, ac->apr); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: session[%d] wr_format[0x%x]\n", __func__, ac->session, - format); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_READ_COMPRESSED; - atomic_set(&ac->cmd_state, -1); - - /* - * Below flag indicates whether DSP shall keep IEC61937 packing or - * unpack to raw compressed format - */ - if (format == FORMAT_IEC61937) { - open.mode_flags = 0x1; - pr_debug("%s: Flag 1 IEC61937 output\n", __func__); - } else { - open.mode_flags = 0; - open.frames_per_buf = 1; - pr_debug("%s: Flag 0 RAW_COMPR output\n", __func__); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for OPEN_READ_COMPR rc[%d]\n", - __func__, rc); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; - -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_read_compressed); - -static int __q6asm_open_read(struct audio_client *ac, - uint32_t format, uint16_t bits_per_sample, - uint32_t pcm_format_block_ver, - bool ts_mode, uint32_t enc_cfg_id) -{ - int rc = 0x00; - struct asm_stream_cmd_open_read_v3 open; - struct q6asm_cal_info cal_info; - - config_debug_fs_reset_index(); - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_READ_V3; - /* Stream prio : High, provide meta info with encoded frames */ - open.src_endpointype = ASM_END_POINT_DEVICE_MATRIX; - - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.preprocopo_id = cal_info.topology_id; - - - open.bits_per_sample = bits_per_sample; - open.mode_flags = 0x0; - - ac->topology = open.preprocopo_id; - ac->app_type = cal_info.app_type; - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) { - open.mode_flags |= ASM_LOW_LATENCY_TX_STREAM_SESSION << - ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ; - } else { - open.mode_flags |= ASM_LEGACY_STREAM_SESSION << - ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ; - } - - switch (format) { - case FORMAT_LINEAR_PCM: - open.mode_flags |= 0x00; - open.enc_cfg_id = q6asm_get_pcm_format_id(pcm_format_block_ver); - if (ts_mode) - open.mode_flags |= ABSOLUTE_TIMESTAMP_ENABLE; - break; - case FORMAT_MPEG4_AAC: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_G711_ALAW_FS: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_G711_ALAW_FS; - break; - case FORMAT_G711_MLAW_FS: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_G711_MLAW_FS; - break; - case FORMAT_V13K: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_V13K_FS; - break; - case FORMAT_EVRC: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_EVRC_FS; - break; - case FORMAT_AMRNB: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_AMRNB_FS; - break; - case FORMAT_AMRWB: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = ASM_MEDIA_FMT_AMRWB_FS; - break; - case FORMAT_BESPOKE: - open.mode_flags |= BUFFER_META_ENABLE; - open.enc_cfg_id = enc_cfg_id; - if (ts_mode) - open.mode_flags |= ABSOLUTE_TIMESTAMP_ENABLE; - break; - default: - pr_err("%s: Invalid format 0x%x\n", - __func__, format); - rc = -EINVAL; - goto fail_cmd; - } - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open read\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - ac->io_mode |= TUN_READ_IO_MODE; - - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_open_read - - * command to open ASM in read mode - * - * @ac: Audio client handle - * @format: capture format for ASM - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read(struct audio_client *ac, - uint32_t format) -{ - return __q6asm_open_read(ac, format, 16, - PCM_MEDIA_FORMAT_V2 /*media fmt block ver*/, - false/*ts_mode*/, ENC_CFG_ID_NONE); -} -EXPORT_SYMBOL(q6asm_open_read); - -int q6asm_open_read_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V2 /*media fmt block ver*/, - false/*ts_mode*/, ENC_CFG_ID_NONE); -} - -/* - * asm_open_read_v3 - Opens audio capture session - * - * @ac: Client session handle - * @format: encoder format - * @bits_per_sample: bit width of capture session - */ -int q6asm_open_read_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V3/*media fmt block ver*/, - false/*ts_mode*/, ENC_CFG_ID_NONE); -} -EXPORT_SYMBOL(q6asm_open_read_v3); - -/* - * asm_open_read_v4 - Opens audio capture session - * - * @ac: Client session handle - * @format: encoder format - * @bits_per_sample: bit width of capture session - * @ts_mode: timestamp mode - */ -int q6asm_open_read_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, - uint32_t enc_cfg_id) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V4 /*media fmt block ver*/, - ts_mode, enc_cfg_id); -} -EXPORT_SYMBOL(q6asm_open_read_v4); - - -/* - * asm_open_read_v5 - Opens audio capture session - * - * @ac: Client session handle - * @format: encoder format - * @bits_per_sample: bit width of capture session - * @ts_mode: timestamp mode - */ -int q6asm_open_read_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, uint32_t enc_cfg_id) -{ - return __q6asm_open_read(ac, format, bits_per_sample, - PCM_MEDIA_FORMAT_V5 /*media fmt block ver*/, - ts_mode, enc_cfg_id); -} -EXPORT_SYMBOL(q6asm_open_read_v5); - - -/** - * q6asm_open_write_compressed - - * command to open ASM in compressed write mode - * - * @ac: Audio client handle - * @format: playback format for ASM - * @passthrough_flag: flag to indicate passthrough option - * - * Returns 0 on success or error on failure - */ -int q6asm_open_write_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag) -{ - int rc = 0; - struct asm_stream_cmd_open_write_compressed open; - - if (ac == NULL) { - pr_err("%s: ac[%pK] NULL\n", __func__, ac); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: APR handle[%pK] NULL\n", __func__, ac->apr); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: session[%d] wr_format[0x%x]", __func__, ac->session, - format); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED; - atomic_set(&ac->cmd_state, -1); - - switch (format) { - case FORMAT_AC3: - open.fmt_id = ASM_MEDIA_FMT_AC3; - break; - case FORMAT_EAC3: - open.fmt_id = ASM_MEDIA_FMT_EAC3; - break; - case FORMAT_DTS: - open.fmt_id = ASM_MEDIA_FMT_DTS; - break; - case FORMAT_DSD: - open.fmt_id = ASM_MEDIA_FMT_DSD; - break; - case FORMAT_GEN_COMPR: - open.fmt_id = ASM_MEDIA_FMT_GENERIC_COMPRESSED; - break; - case FORMAT_TRUEHD: - open.fmt_id = ASM_MEDIA_FMT_TRUEHD; - break; - case FORMAT_IEC61937: - open.fmt_id = ASM_MEDIA_FMT_IEC; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, format); - rc = -EINVAL; - goto fail_cmd; - } - /* Below flag indicates the DSP that Compressed audio input - * stream is not IEC 61937 or IEC 60958 packetizied - */ - if (passthrough_flag == COMPRESSED_PASSTHROUGH || - passthrough_flag == COMPRESSED_PASSTHROUGH_DSD || - passthrough_flag == COMPRESSED_PASSTHROUGH_GEN) { - open.flags = 0x0; - pr_debug("%s: Flag 0 COMPRESSED_PASSTHROUGH\n", __func__); - } else if (passthrough_flag == COMPRESSED_PASSTHROUGH_CONVERT) { - open.flags = 0x8; - pr_debug("%s: Flag 8 - COMPRESSED_PASSTHROUGH_CONVERT\n", - __func__); - } else if (passthrough_flag == COMPRESSED_PASSTHROUGH_IEC61937) { - open.flags = 0x1; - pr_debug("%s: Flag 1 - COMPRESSED_PASSTHROUGH_IEC61937\n", - __func__); - } else { - pr_err("%s: Invalid passthrough type[%d]\n", - __func__, passthrough_flag); - rc = -EINVAL; - goto fail_cmd; - } - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for OPEN_WRITE_COMPR rc[%d]\n", - __func__, rc); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; - -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_write_compressed); - -static int __q6asm_open_write(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, uint32_t stream_id, - bool is_gapless_mode, - uint32_t pcm_format_block_ver) -{ - int rc = 0x00; - struct asm_stream_cmd_open_write_v3 open; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - dev_vdbg(ac->dev, "%s: session[%d] wr_format[0x%x]\n", - __func__, ac->session, format); - - q6asm_stream_add_hdr(ac, &open.hdr, sizeof(open), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&open.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - dev_vdbg(ac->dev, "%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, open.hdr.token, stream_id, ac->session); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_WRITE_V3; - open.mode_flags = 0x00; - if (ac->perf_mode == ULL_POST_PROCESSING_PCM_MODE) - open.mode_flags |= ASM_ULL_POST_PROCESSING_STREAM_SESSION; - else if (ac->perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_ULTRA_LOW_LATENCY_STREAM_SESSION; - else if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION; - else { - open.mode_flags |= ASM_LEGACY_STREAM_SESSION; - if (is_gapless_mode) - open.mode_flags |= 1 << ASM_SHIFT_GAPLESS_MODE_FLAG; - } - - /* source endpoint : matrix */ - open.sink_endpointype = ASM_END_POINT_DEVICE_MATRIX; - open.bits_per_sample = bits_per_sample; - - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.postprocopo_id = cal_info.topology_id; - - if (ac->perf_mode != LEGACY_PCM_MODE) - open.postprocopo_id = ASM_STREAM_POSTPROCOPO_ID_NONE; - - pr_debug("%s: perf_mode %d asm_topology 0x%x bps %d\n", __func__, - ac->perf_mode, open.postprocopo_id, open.bits_per_sample); - - /* - * For Gapless playback it will use the same session for next stream, - * So use the same topology - */ - if (!ac->topology) { - ac->topology = open.postprocopo_id; - ac->app_type = cal_info.app_type; - } - switch (format) { - case FORMAT_LINEAR_PCM: - open.dec_fmt_id = q6asm_get_pcm_format_id(pcm_format_block_ver); - break; - case FORMAT_MPEG4_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_MPEG4_MULTI_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_WMA_V9: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V9_V2; - break; - case FORMAT_WMA_V10PRO: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V10PRO_V2; - break; - case FORMAT_MP3: - open.dec_fmt_id = ASM_MEDIA_FMT_MP3; - break; - case FORMAT_AC3: - open.dec_fmt_id = ASM_MEDIA_FMT_AC3; - break; - case FORMAT_EAC3: - open.dec_fmt_id = ASM_MEDIA_FMT_EAC3; - break; - case FORMAT_MP2: - open.dec_fmt_id = ASM_MEDIA_FMT_MP2; - break; - case FORMAT_FLAC: - open.dec_fmt_id = ASM_MEDIA_FMT_FLAC; - break; - case FORMAT_ALAC: - open.dec_fmt_id = ASM_MEDIA_FMT_ALAC; - break; - case FORMAT_VORBIS: - open.dec_fmt_id = ASM_MEDIA_FMT_VORBIS; - break; - case FORMAT_APE: - open.dec_fmt_id = ASM_MEDIA_FMT_APE; - break; - case FORMAT_DSD: - open.dec_fmt_id = ASM_MEDIA_FMT_DSD; - break; - case FORMAT_APTX: - open.dec_fmt_id = ASM_MEDIA_FMT_APTX; - break; - case FORMAT_GEN_COMPR: - open.dec_fmt_id = ASM_MEDIA_FMT_GENERIC_COMPRESSED; - break; - default: - pr_err("%s: Invalid format 0x%x\n", __func__, format); - rc = -EINVAL; - goto fail_cmd; - } - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open write\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - ac->io_mode |= TUN_WRITE_IO_MODE; - - return 0; -fail_cmd: - return rc; -} - -int q6asm_open_write(struct audio_client *ac, uint32_t format) -{ - return __q6asm_open_write(ac, format, 16, ac->stream_id, - false /*gapless*/, - PCM_MEDIA_FORMAT_V2 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write); - -int q6asm_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V2 /*pcm_format_block_ver*/); -} - -/* - * q6asm_open_write_v3 - Opens audio playback session - * - * @ac: Client session handle - * @format: decoder format - * @bits_per_sample: bit width of playback session - */ -int q6asm_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V3 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write_v3); - -/* - * q6asm_open_write_v4 - Opens audio playback session - * - * @ac: Client session handle - * @format: decoder format - * @bits_per_sample: bit width of playback session - */ -int q6asm_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V4 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write_v4); - -int q6asm_stream_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V2 /*pcm_format_block_ver*/); -} - -/* - * q6asm_stream_open_write_v3 - Creates audio stream for playback - * - * @ac: Client session handle - * @format: asm playback format - * @bits_per_sample: bit width of requested stream - * @stream_id: stream id of stream to be associated with this session - * @is_gapless_mode: true if gapless mode needs to be enabled - */ -int q6asm_stream_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V3 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_stream_open_write_v3); - -/* - * q6asm_open_write_v5 - Opens audio playback session - * - * @ac: Client session handle - * @format: decoder format - * @bits_per_sample: bit width of playback session - */ -int q6asm_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - ac->stream_id, false /*gapless*/, - PCM_MEDIA_FORMAT_V5 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_open_write_v5); - - -/* - * q6asm_stream_open_write_v4 - Creates audio stream for playback - * - * @ac: Client session handle - * @format: asm playback format - * @bits_per_sample: bit width of requested stream - * @stream_id: stream id of stream to be associated with this session - * @is_gapless_mode: true if gapless mode needs to be enabled - */ -int q6asm_stream_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V4 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_stream_open_write_v4); - -/* - * q6asm_stream_open_write_v5 - Creates audio stream for playback - * - * @ac: Client session handle - * @format: asm playback format - * @bits_per_sample: bit width of requested stream - * @stream_id: stream id of stream to be associated with this session - * @is_gapless_mode: true if gapless mode needs to be enabled - */ -int q6asm_stream_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode) -{ - return __q6asm_open_write(ac, format, bits_per_sample, - stream_id, is_gapless_mode, - PCM_MEDIA_FORMAT_V5 /*pcm_format_block_ver*/); -} -EXPORT_SYMBOL(q6asm_stream_open_write_v5); - - -static int __q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format, bool is_meta_data_mode, - uint32_t bits_per_sample, - bool overwrite_topology, int topology) -{ - int rc = 0x00; - struct asm_stream_cmd_open_readwrite_v2 open; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - pr_debug("%s: wr_format[0x%x]rd_format[0x%x]\n", - __func__, wr_format, rd_format); - - ac->io_mode |= NT_MODE; - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_READWRITE_V2; - - open.mode_flags = is_meta_data_mode ? BUFFER_META_ENABLE : 0; - open.bits_per_sample = bits_per_sample; - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.postprocopo_id = cal_info.topology_id; - - open.postprocopo_id = overwrite_topology ? - topology : open.postprocopo_id; - ac->topology = open.postprocopo_id; - ac->app_type = cal_info.app_type; - - - switch (wr_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.dec_fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - break; - case FORMAT_MPEG4_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_MPEG4_MULTI_AAC: - open.dec_fmt_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_WMA_V9: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V9_V2; - break; - case FORMAT_WMA_V10PRO: - open.dec_fmt_id = ASM_MEDIA_FMT_WMA_V10PRO_V2; - break; - case FORMAT_AMRNB: - open.dec_fmt_id = ASM_MEDIA_FMT_AMRNB_FS; - break; - case FORMAT_AMRWB: - open.dec_fmt_id = ASM_MEDIA_FMT_AMRWB_FS; - break; - case FORMAT_AMR_WB_PLUS: - open.dec_fmt_id = ASM_MEDIA_FMT_AMR_WB_PLUS_V2; - break; - case FORMAT_V13K: - open.dec_fmt_id = ASM_MEDIA_FMT_V13K_FS; - break; - case FORMAT_EVRC: - open.dec_fmt_id = ASM_MEDIA_FMT_EVRC_FS; - break; - case FORMAT_EVRCB: - open.dec_fmt_id = ASM_MEDIA_FMT_EVRCB_FS; - break; - case FORMAT_EVRCWB: - open.dec_fmt_id = ASM_MEDIA_FMT_EVRCWB_FS; - break; - case FORMAT_MP3: - open.dec_fmt_id = ASM_MEDIA_FMT_MP3; - break; - case FORMAT_ALAC: - open.dec_fmt_id = ASM_MEDIA_FMT_ALAC; - break; - case FORMAT_APE: - open.dec_fmt_id = ASM_MEDIA_FMT_APE; - break; - case FORMAT_DSD: - open.dec_fmt_id = ASM_MEDIA_FMT_DSD; - break; - case FORMAT_G711_ALAW_FS: - open.dec_fmt_id = ASM_MEDIA_FMT_G711_ALAW_FS; - break; - case FORMAT_G711_MLAW_FS: - open.dec_fmt_id = ASM_MEDIA_FMT_G711_MLAW_FS; - break; - default: - pr_err("%s: Invalid format 0x%x\n", - __func__, wr_format); - rc = -EINVAL; - goto fail_cmd; - } - - switch (rd_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.enc_cfg_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - break; - case FORMAT_MPEG4_AAC: - open.enc_cfg_id = ASM_MEDIA_FMT_AAC_V2; - break; - case FORMAT_G711_ALAW_FS: - open.enc_cfg_id = ASM_MEDIA_FMT_G711_ALAW_FS; - break; - case FORMAT_G711_MLAW_FS: - open.enc_cfg_id = ASM_MEDIA_FMT_G711_MLAW_FS; - break; - case FORMAT_V13K: - open.enc_cfg_id = ASM_MEDIA_FMT_V13K_FS; - break; - case FORMAT_EVRC: - open.enc_cfg_id = ASM_MEDIA_FMT_EVRC_FS; - break; - case FORMAT_AMRNB: - open.enc_cfg_id = ASM_MEDIA_FMT_AMRNB_FS; - break; - case FORMAT_AMRWB: - open.enc_cfg_id = ASM_MEDIA_FMT_AMRWB_FS; - break; - case FORMAT_ALAC: - open.enc_cfg_id = ASM_MEDIA_FMT_ALAC; - break; - case FORMAT_APE: - open.enc_cfg_id = ASM_MEDIA_FMT_APE; - break; - default: - pr_err("%s: Invalid format 0x%x\n", - __func__, rd_format); - rc = -EINVAL; - goto fail_cmd; - } - dev_vdbg(ac->dev, "%s: rdformat[0x%x]wrformat[0x%x]\n", __func__, - open.enc_cfg_id, open.dec_fmt_id); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open read-write\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_open_read_write - - * command to open ASM in read/write mode - * - * @ac: Audio client handle - * @rd_format: capture format for ASM - * @wr_format: playback format for ASM - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format) -{ - return __q6asm_open_read_write(ac, rd_format, wr_format, - true/*meta data mode*/, - 16 /*bits_per_sample*/, - false /*overwrite_topology*/, 0); -} -EXPORT_SYMBOL(q6asm_open_read_write); - -/** - * q6asm_open_read_write_v2 - - * command to open ASM in bi-directional read/write mode - * - * @ac: Audio client handle - * @rd_format: capture format for ASM - * @wr_format: playback format for ASM - * @is_meta_data_mode: mode to indicate if meta data present - * @bits_per_sample: number of bits per sample - * @overwrite_topology: topology to be overwritten flag - * @topology: Topology for ASM - * - * Returns 0 on success or error on failure - */ -int q6asm_open_read_write_v2(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format, bool is_meta_data_mode, - uint32_t bits_per_sample, bool overwrite_topology, - int topology) -{ - return __q6asm_open_read_write(ac, rd_format, wr_format, - is_meta_data_mode, bits_per_sample, - overwrite_topology, topology); -} -EXPORT_SYMBOL(q6asm_open_read_write_v2); - -/** - * q6asm_open_loopback_v2 - - * command to open ASM in loopback mode - * - * @ac: Audio client handle - * @bits_per_sample: number of bits per sample - * - * Returns 0 on success or error on failure - */ -int q6asm_open_loopback_v2(struct audio_client *ac, uint16_t bits_per_sample) -{ - int rc = 0x00; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) { - struct asm_stream_cmd_open_transcode_loopback_t open; - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK; - - open.mode_flags = 0; - open.src_endpoint_type = 0; - open.sink_endpoint_type = 0; - open.src_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - open.sink_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.audproc_topo_id = cal_info.topology_id; - - ac->app_type = cal_info.app_type; - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION; - else - open.mode_flags |= ASM_LEGACY_STREAM_SESSION; - ac->topology = open.audproc_topo_id; - open.bits_per_sample = bits_per_sample; - open.reserved = 0; - pr_debug("%s: opening a transcode_loopback with mode_flags =[%d] session[%d]\n", - __func__, open.mode_flags, ac->session); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - } else {/*if(ac->perf_mode == LEGACY_PCM_MODE)*/ - struct asm_stream_cmd_open_loopback_v2 open; - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_LOOPBACK_V2; - - open.mode_flags = 0; - open.src_endpointype = 0; - open.sink_endpointype = 0; - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.postprocopo_id = cal_info.topology_id; - - ac->app_type = cal_info.app_type; - ac->topology = open.postprocopo_id; - open.bits_per_sample = bits_per_sample; - open.reserved = 0; - pr_debug("%s: opening a loopback_v2 with mode_flags =[%d] session[%d]\n", - __func__, open.mode_flags, ac->session); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open_loopback\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_loopback_v2); - -/** - * q6asm_open_transcode_loopback - - * command to open ASM in transcode loopback mode - * - * @ac: Audio client handle - * @bits_per_sample: number of bits per sample - * @source_format: Format of clip - * @sink_format: end device supported format - * - * Returns 0 on success or error on failure - */ -int q6asm_open_transcode_loopback(struct audio_client *ac, - uint16_t bits_per_sample, - uint32_t source_format, uint32_t sink_format) -{ - int rc = 0x00; - struct asm_stream_cmd_open_transcode_loopback_t open; - struct q6asm_cal_info cal_info; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); - atomic_set(&ac->cmd_state, -1); - open.hdr.opcode = ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK; - - open.mode_flags = 0; - open.src_endpoint_type = 0; - open.sink_endpoint_type = 0; - switch (source_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.src_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - break; - case FORMAT_AC3: - open.src_format_id = ASM_MEDIA_FMT_AC3; - break; - case FORMAT_EAC3: - open.src_format_id = ASM_MEDIA_FMT_EAC3; - break; - default: - pr_err("%s: Unsupported src fmt [%d]\n", - __func__, source_format); - return -EINVAL; - } - switch (sink_format) { - case FORMAT_LINEAR_PCM: - case FORMAT_MULTI_CHANNEL_LINEAR_PCM: - open.sink_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - break; - default: - pr_err("%s: Unsupported sink fmt [%d]\n", - __func__, sink_format); - return -EINVAL; - } - - /* source endpoint : matrix */ - rc = q6asm_get_asm_topology_apptype(&cal_info); - open.audproc_topo_id = cal_info.topology_id; - - - ac->app_type = cal_info.app_type; - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION; - else - open.mode_flags |= ASM_LEGACY_STREAM_SESSION; - ac->topology = open.audproc_topo_id; - open.bits_per_sample = bits_per_sample; - open.reserved = 0; - pr_debug("%s: opening a transcode_loopback with mode_flags =[%d] session[%d]\n", - __func__, open.mode_flags, ac->session); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for open_transcode_loopback\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_open_transcode_loopback); - -static -int q6asm_set_shared_circ_buff(struct audio_client *ac, - struct asm_stream_cmd_open_shared_io *open, - int bufsz, int bufcnt, - int dir) -{ - struct audio_buffer *buf_circ; - int bytes_to_alloc, rc; - size_t len; - - mutex_lock(&ac->cmd_lock); - - if (ac->port[dir].buf) { - pr_err("%s: Buffer already allocated\n", __func__); - rc = -EINVAL; - goto done; - } - - buf_circ = kzalloc(sizeof(struct audio_buffer), GFP_KERNEL); - - if (!buf_circ) { - rc = -ENOMEM; - goto done; - } - - bytes_to_alloc = bufsz * bufcnt; - bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); - - rc = msm_audio_ion_alloc(&buf_circ->dma_buf, - bytes_to_alloc, - &buf_circ->phys, - &len, &buf_circ->data); - - if (rc) { - pr_err("%s: Audio ION alloc is failed, rc = %d\n", __func__, - rc); - kfree(buf_circ); - goto done; - } - - ac->port[dir].buf = buf_circ; - buf_circ->used = dir ^ 1; - buf_circ->size = bytes_to_alloc; - buf_circ->actual_size = bytes_to_alloc; - memset(buf_circ->data, 0, buf_circ->actual_size); - - ac->port[dir].max_buf_cnt = 1; - - open->shared_circ_buf_mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - open->shared_circ_buf_num_regions = 1; - open->shared_circ_buf_property_flag = 0x00; - open->shared_circ_buf_start_phy_addr_lsw = - lower_32_bits(buf_circ->phys); - open->shared_circ_buf_start_phy_addr_msw = - msm_audio_populate_upper_32_bits(buf_circ->phys); - open->shared_circ_buf_size = bufsz * bufcnt; - - open->map_region_circ_buf.shm_addr_lsw = lower_32_bits(buf_circ->phys); - open->map_region_circ_buf.shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_circ->phys); - open->map_region_circ_buf.mem_size_bytes = bytes_to_alloc; - -done: - mutex_unlock(&ac->cmd_lock); - return rc; -} - - -static -int q6asm_set_shared_pos_buff(struct audio_client *ac, - struct asm_stream_cmd_open_shared_io *open, - int dir) -{ - struct audio_buffer *buf_pos = &ac->shared_pos_buf; - int rc; - size_t len; - int bytes_to_alloc = sizeof(struct asm_shared_position_buffer); - - mutex_lock(&ac->cmd_lock); - - bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); - - rc = msm_audio_ion_alloc(&buf_pos->dma_buf, - bytes_to_alloc, - &buf_pos->phys, &len, - &buf_pos->data); - - if (rc) { - pr_err("%s: Audio pos buf ION alloc is failed, rc = %d\n", - __func__, rc); - goto done; - } - - buf_pos->used = dir ^ 1; - buf_pos->size = bytes_to_alloc; - buf_pos->actual_size = bytes_to_alloc; - - open->shared_pos_buf_mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - open->shared_pos_buf_num_regions = 1; - open->shared_pos_buf_property_flag = 0x00; - open->shared_pos_buf_phy_addr_lsw = lower_32_bits(buf_pos->phys); - open->shared_pos_buf_phy_addr_msw = - msm_audio_populate_upper_32_bits(buf_pos->phys); - - open->map_region_pos_buf.shm_addr_lsw = lower_32_bits(buf_pos->phys); - open->map_region_pos_buf.shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_pos->phys); - open->map_region_pos_buf.mem_size_bytes = bytes_to_alloc; - -done: - mutex_unlock(&ac->cmd_lock); - return rc; -} - -/* - * q6asm_open_shared_io: Open an ASM session for pull mode (playback) - * or push mode (capture). - * parameters - * config - session parameters (channels, bits_per_sample, sr) - * dir - stream direction (IN for playback, OUT for capture) - * use_default_chmap: true if default channel map to be used - * channel_map: input channel map - * returns 0 if successful, error code otherwise - */ -int q6asm_open_shared_io(struct audio_client *ac, - struct shared_io_config *config, - int dir, bool use_default_chmap, u8 *channel_map) -{ - struct asm_stream_cmd_open_shared_io *open; - u8 *channel_mapping; - int i, size_of_open, num_watermarks, bufsz, bufcnt, rc, flags = 0; - struct q6asm_cal_info cal_info; - - if (!ac || !config) - return -EINVAL; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - - if (config->channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, - config->channels); - return -EINVAL; - } - - bufsz = config->bufsz; - bufcnt = config->bufcnt; - num_watermarks = 0; - - ac->config = *config; - - if (ac->session <= 0 || ac->session > SESSION_MAX) { - pr_err("%s: Session %d is out of bounds\n", - __func__, ac->session); - return -EINVAL; - } - - size_of_open = sizeof(struct asm_stream_cmd_open_shared_io) + - (sizeof(struct asm_shared_watermark_level) * num_watermarks); - - open = kzalloc(PAGE_ALIGN(size_of_open), GFP_KERNEL); - if (!open) - return -ENOMEM; - - q6asm_stream_add_hdr(ac, &open->hdr, size_of_open, TRUE, - ac->stream_id); - - atomic_set(&ac->cmd_state, 1); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x, perf %d\n", - __func__, open->hdr.token, ac->stream_id, ac->session, - ac->perf_mode); - - open->hdr.opcode = - dir == IN ? ASM_STREAM_CMD_OPEN_PULL_MODE_WRITE : - ASM_STREAM_CMD_OPEN_PUSH_MODE_READ; - - pr_debug("%s perf_mode %d\n", __func__, ac->perf_mode); - if (dir == IN) - if (ac->perf_mode == ULL_POST_PROCESSING_PCM_MODE) - flags = 4 << ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE; - else if (ac->perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) - flags = 2 << ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE; - else if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - flags = 1 << ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE; - else - pr_err("Invalid perf mode for pull write\n"); - else - if (ac->perf_mode == LOW_LATENCY_PCM_MODE) - flags = ASM_LOW_LATENCY_TX_STREAM_SESSION << - ASM_SHIFT_STREAM_PERF_FLAG_PUSH_MODE_READ; - else - pr_err("Invalid perf mode for push read\n"); - - if (flags == 0) { - pr_err("%s: Invalid mode[%d]\n", __func__, - ac->perf_mode); - kfree(open); - return -EINVAL; - - } - - pr_debug("open.mode_flags = 0x%x\n", flags); - open->mode_flags = flags; - open->endpoint_type = ASM_END_POINT_DEVICE_MATRIX; - open->topo_bits_per_sample = config->bits_per_sample; - - rc = q6asm_get_asm_topology_apptype(&cal_info); - open->topo_id = cal_info.topology_id; - - if (config->format == FORMAT_LINEAR_PCM) - open->fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3; - else { - pr_err("%s: Invalid format[%d]\n", __func__, config->format); - rc = -EINVAL; - goto done; - } - - rc = q6asm_set_shared_circ_buff(ac, open, bufsz, bufcnt, dir); - - if (rc) - goto done; - - ac->port[dir].tmp_hdl = 0; - - rc = q6asm_set_shared_pos_buff(ac, open, dir); - - if (rc) - goto done; - - /* asm_multi_channel_pcm_fmt_blk_v3 */ - open->fmt.num_channels = config->channels; - open->fmt.bits_per_sample = config->bits_per_sample; - open->fmt.sample_rate = config->rate; - open->fmt.is_signed = 1; - open->fmt.sample_word_size = config->sample_word_size; - - channel_mapping = open->fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - rc = q6asm_map_channels(channel_mapping, config->channels, - false); - if (rc) { - pr_err("%s: Map channels failed, ret: %d\n", - __func__, rc); - goto done; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - open->num_watermark_levels = num_watermarks; - for (i = 0; i < num_watermarks; i++) { - open->watermark[i].watermark_level_bytes = i * - ((bufsz * bufcnt) / num_watermarks); - pr_debug("%s: Watermark level set for %i\n", - __func__, - open->watermark[i].watermark_level_bytes); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) open); - if (rc < 0) { - pr_err("%s: Open failed op[0x%x]rc[%d]\n", - __func__, open->hdr.opcode, rc); - goto done; - } - - pr_debug("%s: sent open apr pkt\n", __func__); - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) <= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: Timeout. Waited for open write apr pkt rc[%d]\n", - __func__, rc); - rc = -ETIMEDOUT; - goto done; - } - - if (atomic_read(&ac->cmd_state) < 0) { - pr_err("%s: DSP returned error [%d]\n", __func__, - atomic_read(&ac->cmd_state)); - rc = -EINVAL; - goto done; - } - - ac->io_mode |= TUN_WRITE_IO_MODE; - rc = 0; -done: - kfree(open); - return rc; -} -EXPORT_SYMBOL(q6asm_open_shared_io); - -/* - * q6asm_shared_io_buf: Returns handle to the shared circular buffer being - * used for pull/push mode. - * parameters - * dir - used to identify input/output port - * returns buffer handle - */ -struct audio_buffer *q6asm_shared_io_buf(struct audio_client *ac, - int dir) -{ - struct audio_port_data *port; - - if (!ac) { - pr_err("%s: ac is null\n", __func__); - return NULL; - } - port = &ac->port[dir]; - return port->buf; -} -EXPORT_SYMBOL(q6asm_shared_io_buf); - -/* - * q6asm_shared_io_free: Frees memory allocated for a pull/push session - * parameters - * dir - port direction - * returns 0 if successful, error otherwise - */ -int q6asm_shared_io_free(struct audio_client *ac, int dir) -{ - struct audio_port_data *port; - - if (!ac) { - pr_err("%s: audio client is null\n", __func__); - return -EINVAL; - } - port = &ac->port[dir]; - mutex_lock(&ac->cmd_lock); - if (port->buf && port->buf->data) { - msm_audio_ion_free(port->buf->dma_buf); - port->buf->dma_buf = NULL; - port->max_buf_cnt = 0; - kfree(port->buf); - port->buf = NULL; - } - if (ac->shared_pos_buf.data) { - msm_audio_ion_free(ac->shared_pos_buf.dma_buf); - ac->shared_pos_buf.dma_buf = NULL; - } - mutex_unlock(&ac->cmd_lock); - return 0; -} -EXPORT_SYMBOL(q6asm_shared_io_free); - -/* - * q6asm_get_shared_pos: Returns current read index/write index as observed - * by the DSP. Note that this is an offset and iterates from [0,BUF_SIZE - 1] - * parameters - (all output) - * read_index - offset - * wall_clk_msw1 - ADSP wallclock msw - * wall_clk_lsw1 - ADSP wallclock lsw - * returns 0 if successful, -EAGAIN if DSP failed to update after some - * retries - */ -int q6asm_get_shared_pos(struct audio_client *ac, uint32_t *read_index, - uint32_t *wall_clk_msw1, uint32_t *wall_clk_lsw1) -{ - struct asm_shared_position_buffer *pos_buf; - uint32_t frame_cnt1, frame_cnt2; - int i, j; - - if (!ac) { - pr_err("%s: audio client is null\n", __func__); - return -EINVAL; - } - - pos_buf = ac->shared_pos_buf.data; - - /* always try to get the latest update in the shared pos buffer */ - for (i = 0; i < 2; i++) { - /* retry until there is an update from DSP */ - for (j = 0; j < 5; j++) { - frame_cnt1 = pos_buf->frame_counter; - if (frame_cnt1 != 0) - break; - } - - *wall_clk_msw1 = pos_buf->wall_clock_us_msw; - *wall_clk_lsw1 = pos_buf->wall_clock_us_lsw; - *read_index = pos_buf->index; - frame_cnt2 = pos_buf->frame_counter; - - if (frame_cnt1 != frame_cnt2) - continue; - return 0; - } - pr_err("%s out of tries trying to get a good read, try again\n", - __func__); - return -EAGAIN; -} -EXPORT_SYMBOL(q6asm_get_shared_pos); - -/** - * q6asm_run - - * command to set ASM to run state - * - * @ac: Audio client handle - * @flags: Flags for session - * @msw_ts: upper 32bits timestamp - * @lsw_ts: lower 32bits timestamp - * - * Returns 0 on success or error on failure - */ -int q6asm_run(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts) -{ - struct asm_session_cmd_run_v2 run; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_add_hdr(ac, &run.hdr, sizeof(run), TRUE); - atomic_set(&ac->cmd_state, -1); - - run.hdr.opcode = ASM_SESSION_CMD_RUN_V2; - run.flags = flags; - run.time_lsw = lsw_ts; - run.time_msw = msw_ts; - - config_debug_fs_run(); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &run); - if (rc < 0) { - pr_err("%s: Commmand run failed[%d]", - __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for run success", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_run); - -static int __q6asm_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts, uint32_t stream_id) -{ - struct asm_session_cmd_run_v2 run; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - - q6asm_stream_add_hdr_async(ac, &run.hdr, sizeof(run), TRUE, stream_id); - atomic_set(&ac->cmd_state, 1); - run.hdr.opcode = ASM_SESSION_CMD_RUN_V2; - run.flags = flags; - run.time_lsw = lsw_ts; - run.time_msw = msw_ts; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &run); - if (rc < 0) { - pr_err("%s: Commmand run failed[%d]", __func__, rc); - return -EINVAL; - } - return 0; -} - -/** - * q6asm_run_nowait - - * command to set ASM to run state with no wait for ack - * - * @ac: Audio client handle - * @flags: Flags for session - * @msw_ts: upper 32bits timestamp - * @lsw_ts: lower 32bits timestamp - * - * Returns 0 on success or error on failure - */ -int q6asm_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts) -{ - return __q6asm_run_nowait(ac, flags, msw_ts, lsw_ts, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_run_nowait); - -int q6asm_stream_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts, uint32_t stream_id) -{ - return __q6asm_run_nowait(ac, flags, msw_ts, lsw_ts, stream_id); -} - -/** - * q6asm_enc_cfg_blk_custom - - * command to set encode cfg block for custom - * - * @ac: Audio client handle - * @sample_rate: Sample rate - * @channels: number of ASM channels - * @format: custom format flag - * @cfg: generic encoder config - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_custom(struct audio_client *ac, - uint32_t sample_rate, uint32_t channels, - uint32_t format, void *cfg) -{ - struct asm_custom_enc_cfg_t_v2 enc_cfg; - int rc = 0; - uint32_t custom_size; - struct snd_enc_generic *enc_generic = (struct snd_enc_generic *) cfg; - - custom_size = enc_generic->reserved[1]; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d] size[%d] res[2]=[%d] res[3]=[%d]\n", - __func__, ac->session, custom_size, enc_generic->reserved[2], - enc_generic->reserved[3]); - - pr_debug("%s: res[4]=[%d] sr[%d] ch[%d] format[%d]\n", - __func__, enc_generic->reserved[4], sample_rate, - channels, format); - - memset(&enc_cfg, 0, sizeof(struct asm_custom_enc_cfg_t_v2)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_custom_enc_cfg_t_v2) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = ENC_FRAMES_PER_BUFFER; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.num_channels = channels; - enc_cfg.sample_rate = sample_rate; - - if (q6asm_map_channels(enc_cfg.channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - if (format == FORMAT_BESPOKE && custom_size && - custom_size <= sizeof(enc_cfg.custom_data)) { - memcpy(enc_cfg.custom_data, &enc_generic->reserved[2], - custom_size); - enc_cfg.custom_size = custom_size; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_custom); - -/** - * q6asm_enc_cfg_blk_aac - - * command to set encode cfg block for aac - * - * @ac: Audio client handle - * @frames_per_buf: number of frames per buffer - * @sample_rate: Sample rate - * @channels: number of ASM channels - * @bit_rate: Bit rate info - * @mode: mode of AAC stream encode - * @format: aac format flag - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_aac(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate, uint32_t channels, - uint32_t bit_rate, uint32_t mode, uint32_t format) -{ - struct asm_aac_enc_cfg_v2 enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]SR[%d]ch[%d]bitrate[%d]mode[%d] format[%d]\n", - __func__, ac->session, frames_per_buf, - sample_rate, channels, bit_rate, mode, format); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_aac_enc_cfg_v2) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - enc_cfg.bit_rate = bit_rate; - enc_cfg.enc_mode = mode; - enc_cfg.aac_fmt_flag = format; - enc_cfg.channel_cfg = channels; - enc_cfg.sample_rate = sample_rate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_aac); - -/** - * q6asm_enc_cfg_blk_g711 - - * command to set encode cfg block for g711 - * - * @ac: Audio client handle - * @frames_per_buf: number of frames per buffer - * @sample_rate: Sample rate - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_g711(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate) -{ - struct asm_g711_enc_cfg_v2 enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]SR[%d]\n", - __func__, ac->session, frames_per_buf, - sample_rate); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_g711_enc_cfg_v2) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - enc_cfg.sample_rate = sample_rate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_g711); - -/** - * q6asm_set_encdec_chan_map - - * command to set encdec channel map - * - * @ac: Audio client handle - * @channels: number of channels - * - * Returns 0 on success or error on failure - */ -int q6asm_set_encdec_chan_map(struct audio_client *ac, - uint32_t num_channels) -{ - struct asm_dec_out_chan_map_param chan_map; - u8 *channel_mapping; - int rc = 0; - - if (num_channels > MAX_CHAN_MAP_CHANNELS) { - pr_err("%s: Invalid channel count %d\n", __func__, - num_channels); - return -EINVAL; - } - - pr_debug("%s: Session %d, num_channels = %d\n", - __func__, ac->session, num_channels); - q6asm_add_hdr(ac, &chan_map.hdr, sizeof(chan_map), TRUE); - atomic_set(&ac->cmd_state, -1); - chan_map.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - chan_map.encdec.param_id = ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP; - chan_map.encdec.param_size = sizeof(struct asm_dec_out_chan_map_param) - - (sizeof(struct apr_hdr) + - sizeof(struct asm_stream_cmd_set_encdec_param)); - chan_map.num_channels = num_channels; - channel_mapping = chan_map.channel_mapping; - memset(channel_mapping, PCM_CHANNEL_NULL, MAX_CHAN_MAP_CHANNELS); - - if (q6asm_map_channels(channel_mapping, num_channels, false)) { - pr_err("%s: map channels failed %d\n", __func__, num_channels); - return -EINVAL; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &chan_map); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", __func__, - chan_map.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_set_encdec_chan_map); - -/* - * q6asm_enc_cfg_blk_pcm_v5 - sends encoder configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @use_back_flavor: to configure back left and right channel - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -static int q6asm_enc_cfg_blk_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size, uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_enc_cfg_v5 enc_cfg; - struct asm_enc_cfg_blk_param_v2 enc_fg_blk; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&enc_cfg, 0, sizeof(enc_cfg)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(enc_fg_blk); - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - enc_cfg.sample_word_size = sample_word_size; - enc_cfg.endianness = endianness; - enc_cfg.mode = mode; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Command open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v5); - -/* - * q6asm_enc_cfg_blk_pcm_v4 - sends encoder configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @use_back_flavor: to configure back left and right channel - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_enc_cfg_blk_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size, uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_enc_cfg_v4 enc_cfg; - struct asm_enc_cfg_blk_param_v2 enc_fg_blk; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&enc_cfg, 0, sizeof(enc_cfg)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(enc_fg_blk); - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - enc_cfg.sample_word_size = sample_word_size; - enc_cfg.endianness = endianness; - enc_cfg.mode = mode; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Command open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v4); - -/* - * q6asm_enc_cfg_blk_pcm_v3 - sends encoder configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @use_back_flavor: to configure back left and right channel - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_enc_cfg_blk_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size) -{ - struct asm_multi_channel_pcm_enc_cfg_v3 enc_cfg; - struct asm_enc_cfg_blk_param_v2 enc_fg_blk; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&enc_cfg, 0, sizeof(enc_cfg)); - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(enc_fg_blk); - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - enc_cfg.sample_word_size = sample_word_size; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v3); - -/** - * q6asm_enc_cfg_blk_pcm_v2 - - * command to set encode config block for pcm_v2 - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: number of bits per sample - * @use_default_chmap: Flag indicating to use default ch_map or not - * @use_back_flavor: back flavor flag - * @channel_map: Custom channel map settings - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_pcm_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, uint16_t bits_per_sample, - bool use_default_chmap, bool use_back_flavor, u8 *channel_map) -{ - struct asm_multi_channel_pcm_enc_cfg_v2 enc_cfg; - u8 *channel_mapping; - u32 frames_per_buf = 0; - - int rc = 0; - - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: Session %d, rate = %d, channels = %d\n", __func__, - ac->session, rate, channels); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.num_channels = channels; - enc_cfg.bits_per_sample = bits_per_sample; - enc_cfg.sample_rate = rate; - enc_cfg.is_signed = 1; - channel_mapping = enc_cfg.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - pr_debug("%s: setting default channel map for %d channels", - __func__, channels); - if (q6asm_map_channels(channel_mapping, channels, - use_back_flavor)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - pr_debug("%s: Using pre-defined channel map", __func__); - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_v2); - -static int __q6asm_enc_cfg_blk_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return q6asm_enc_cfg_blk_pcm_v5(ac, rate, channels, - bits_per_sample, true, false, NULL, - sample_word_size, endianness, mode); -} - -static int __q6asm_enc_cfg_blk_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return q6asm_enc_cfg_blk_pcm_v4(ac, rate, channels, - bits_per_sample, true, false, NULL, - sample_word_size, endianness, mode); -} - -static int __q6asm_enc_cfg_blk_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - return q6asm_enc_cfg_blk_pcm_v3(ac, rate, channels, - bits_per_sample, true, false, NULL, - sample_word_size); -} - -static int __q6asm_enc_cfg_blk_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, uint16_t bits_per_sample) -{ - return q6asm_enc_cfg_blk_pcm_v2(ac, rate, channels, - bits_per_sample, true, false, NULL); -} - -/** - * q6asm_enc_cfg_blk_pcm - - * command to set encode config block for pcm - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of channels - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - return __q6asm_enc_cfg_blk_pcm(ac, rate, channels, 16); -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm); - -int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, uint16_t bits_per_sample) -{ - return __q6asm_enc_cfg_blk_pcm(ac, rate, channels, bits_per_sample); -} - -/* - * q6asm_enc_cfg_blk_pcm_format_support_v3 - sends encoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_enc_cfg_blk_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - return __q6asm_enc_cfg_blk_pcm_v3(ac, rate, channels, - bits_per_sample, sample_word_size); -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_format_support_v3); - -/* - * q6asm_enc_cfg_blk_pcm_format_support_v4 - sends encoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_enc_cfg_blk_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_enc_cfg_blk_pcm_v4(ac, rate, channels, - bits_per_sample, sample_word_size, - endianness, mode); -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_format_support_v4); - -/* - * q6asm_enc_cfg_blk_pcm_format_support_v5 - sends encoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_enc_cfg_blk_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_enc_cfg_blk_pcm_v5(ac, rate, channels, - bits_per_sample, sample_word_size, - endianness, mode); -} - -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_format_support_v5); -/** - * q6asm_enc_cfg_blk_pcm_native - - * command to set encode config block for pcm_native - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of channels - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - struct asm_multi_channel_pcm_enc_cfg_v2 enc_cfg; - u8 *channel_mapping; - u32 frames_per_buf = 0; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: Session %d, rate = %d, channels = %d\n", __func__, - ac->session, rate, channels); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - - sizeof(enc_cfg.encdec); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.num_channels = 0;/*channels;*/ - enc_cfg.bits_per_sample = 16; - enc_cfg.sample_rate = 0;/*rate;*/ - enc_cfg.is_signed = 1; - channel_mapping = enc_cfg.channel_mapping; - - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", __func__, channels); - return -EINVAL; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_pcm_native); - -static int q6asm_map_channels(u8 *channel_mapping, uint32_t channels, - bool use_back_flavor) -{ - u8 *lchannel_mapping; - - lchannel_mapping = channel_mapping; - pr_debug("%s: channels passed: %d\n", __func__, channels); - if (channels == 1) { - lchannel_mapping[0] = PCM_CHANNEL_FC; - } else if (channels == 2) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 3) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - } else if (channels == 4) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[3] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - } else if (channels == 5) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[4] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - } else if (channels == 6) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[5] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - } else if (channels == 7) { - /* - * Configured for 5.1 channel mapping + 1 channel for debug - * Can be customized based on DSP. - */ - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = use_back_flavor ? - PCM_CHANNEL_LB : PCM_CHANNEL_LS; - lchannel_mapping[5] = use_back_flavor ? - PCM_CHANNEL_RB : PCM_CHANNEL_RS; - lchannel_mapping[6] = PCM_CHANNEL_CS; - } else if (channels == 8) { - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - } else if (channels == 12) { - /* - * Configured for 7.1.4 channel mapping - * Todo: Needs to be checked - */ - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - lchannel_mapping[8] = PCM_CHANNEL_TFL; - lchannel_mapping[9] = PCM_CHANNEL_TFR; - lchannel_mapping[10] = PCM_CHANNEL_TSL; - lchannel_mapping[11] = PCM_CHANNEL_TSR; - } else if (channels == 16) { - /* - * Configured for 7.1.8 channel mapping - * Todo: Needs to be checked - */ - lchannel_mapping[0] = PCM_CHANNEL_FL; - lchannel_mapping[1] = PCM_CHANNEL_FR; - lchannel_mapping[2] = PCM_CHANNEL_FC; - lchannel_mapping[3] = PCM_CHANNEL_LFE; - lchannel_mapping[4] = PCM_CHANNEL_LB; - lchannel_mapping[5] = PCM_CHANNEL_RB; - lchannel_mapping[6] = PCM_CHANNEL_LS; - lchannel_mapping[7] = PCM_CHANNEL_RS; - lchannel_mapping[8] = PCM_CHANNEL_TFL; - lchannel_mapping[9] = PCM_CHANNEL_TFR; - lchannel_mapping[10] = PCM_CHANNEL_TSL; - lchannel_mapping[11] = PCM_CHANNEL_TSR; - lchannel_mapping[12] = PCM_CHANNEL_FLC; - lchannel_mapping[13] = PCM_CHANNEL_FRC; - lchannel_mapping[14] = PCM_CHANNEL_RLC; - lchannel_mapping[15] = PCM_CHANNEL_RRC; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", - __func__, channels); - return -EINVAL; - } - return 0; -} - -/** - * q6asm_enable_sbrps - - * command to enable sbrps for ASM - * - * @ac: Audio client handle - * @sbr_ps_enable: flag for sbr_ps enable or disable - * - * Returns 0 on success or error on failure - */ -int q6asm_enable_sbrps(struct audio_client *ac, - uint32_t sbr_ps_enable) -{ - struct asm_aac_sbr_ps_flag_param sbrps; - u32 frames_per_buf = 0; - - int rc = 0; - - pr_debug("%s: Session %d\n", __func__, ac->session); - - q6asm_add_hdr(ac, &sbrps.hdr, sizeof(sbrps), TRUE); - atomic_set(&ac->cmd_state, -1); - - sbrps.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - sbrps.encdec.param_id = ASM_PARAM_ID_AAC_SBR_PS_FLAG; - sbrps.encdec.param_size = sizeof(struct asm_aac_sbr_ps_flag_param) - - sizeof(struct asm_stream_cmd_set_encdec_param); - sbrps.encblk.frames_per_buf = frames_per_buf; - sbrps.encblk.enc_cfg_blk_size = sbrps.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - sbrps.sbr_ps_flag = sbr_ps_enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &sbrps); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, - ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_AAC_SBR_PS_FLAG, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x] ", __func__, sbrps.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enable_sbrps); - -/** - * q6asm_cfg_dual_mono_aac - - * command to set config for dual mono aac - * - * @ac: Audio client handle - * @sce_left: left sce val - * @sce_right: right sce val - * - * Returns 0 on success or error on failure - */ -int q6asm_cfg_dual_mono_aac(struct audio_client *ac, - uint16_t sce_left, uint16_t sce_right) -{ - struct asm_aac_dual_mono_mapping_param dual_mono; - - int rc = 0; - - pr_debug("%s: Session %d, sce_left = %d, sce_right = %d\n", - __func__, ac->session, sce_left, sce_right); - - q6asm_add_hdr(ac, &dual_mono.hdr, sizeof(dual_mono), TRUE); - atomic_set(&ac->cmd_state, -1); - - dual_mono.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - dual_mono.encdec.param_id = ASM_PARAM_ID_AAC_DUAL_MONO_MAPPING; - dual_mono.encdec.param_size = sizeof(dual_mono.left_channel_sce) + - sizeof(dual_mono.right_channel_sce); - dual_mono.left_channel_sce = sce_left; - dual_mono.right_channel_sce = sce_right; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &dual_mono); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_AAC_DUAL_MONO_MAPPING, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", __func__, - dual_mono.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_cfg_dual_mono_aac); - -/* Support for selecting stereo mixing coefficients for B family not done */ -int q6asm_cfg_aac_sel_mix_coef(struct audio_client *ac, uint32_t mix_coeff) -{ - struct asm_aac_stereo_mix_coeff_selection_param_v2 aac_mix_coeff; - int rc = 0; - - q6asm_add_hdr(ac, &aac_mix_coeff.hdr, sizeof(aac_mix_coeff), TRUE); - atomic_set(&ac->cmd_state, -1); - aac_mix_coeff.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - aac_mix_coeff.param_id = - ASM_PARAM_ID_AAC_STEREO_MIX_COEFF_SELECTION_FLAG_V2; - aac_mix_coeff.param_size = - sizeof(struct asm_aac_stereo_mix_coeff_selection_param_v2); - aac_mix_coeff.aac_stereo_mix_coeff_flag = mix_coeff; - pr_debug("%s: mix_coeff = %u\n", __func__, mix_coeff); - rc = apr_send_pkt(ac->apr, (uint32_t *) &aac_mix_coeff); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x]paramid[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, - ASM_PARAM_ID_AAC_STEREO_MIX_COEFF_SELECTION_FLAG_V2, - rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", - __func__, aac_mix_coeff.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_cfg_aac_sel_mix_coef); - -/** - * q6asm_enc_cfg_blk_qcelp - - * command to set encode config block for QCELP - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @min_rate: Minimum Enc rate - * @max_rate: Maximum Enc rate - * reduced_rate_level: Reduced rate level - * @rate_modulation_cmd: rate modulation command - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_qcelp(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t reduced_rate_level, uint16_t rate_modulation_cmd) -{ - struct asm_v13k_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] reduced_rate_level[0x%4x]rate_modulation_cmd[0x%4x]\n", - __func__, - ac->session, frames_per_buf, min_rate, max_rate, - reduced_rate_level, rate_modulation_cmd); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_v13k_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.min_rate = min_rate; - enc_cfg.max_rate = max_rate; - enc_cfg.reduced_rate_cmd = reduced_rate_level; - enc_cfg.rate_mod_cmd = rate_modulation_cmd; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for setencdec v13k resp\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_qcelp); - -/** - * q6asm_enc_cfg_blk_evrc - - * command to set encode config block for EVRC - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @min_rate: Minimum Enc rate - * @max_rate: Maximum Enc rate - * @rate_modulation_cmd: rate modulation command - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_evrc(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t rate_modulation_cmd) -{ - struct asm_evrc_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] rate_modulation_cmd[0x%4x]\n", - __func__, ac->session, - frames_per_buf, min_rate, max_rate, rate_modulation_cmd); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_evrc_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.min_rate = min_rate; - enc_cfg.max_rate = max_rate; - enc_cfg.rate_mod_cmd = rate_modulation_cmd; - enc_cfg.reserved = 0; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for encdec evrc\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_evrc); - -/** - * q6asm_enc_cfg_blk_amrnb - - * command to set encode config block for AMRNB - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @band_mode: Band mode used - * @dtx_enable: DTX en flag - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_amrnb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable) -{ - struct asm_amrnb_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]band_mode[0x%4x]dtx_enable[0x%4x]\n", - __func__, ac->session, frames_per_buf, band_mode, dtx_enable); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_amrnb_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.enc_mode = band_mode; - enc_cfg.dtx_mode = dtx_enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for set encdec amrnb\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_amrnb); - -/** - * q6asm_enc_cfg_blk_amrwb - - * command to set encode config block for AMRWB - * - * @ac: Audio client handle - * @frames_per_buf: Number of frames per buffer - * @band_mode: Band mode used - * @dtx_enable: DTX en flag - * - * Returns 0 on success or error on failure - */ -int q6asm_enc_cfg_blk_amrwb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable) -{ - struct asm_amrwb_enc_cfg enc_cfg; - int rc = 0; - - pr_debug("%s: session[%d]frames[%d]band_mode[0x%4x]dtx_enable[0x%4x]\n", - __func__, ac->session, frames_per_buf, band_mode, dtx_enable); - - q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); - atomic_set(&ac->cmd_state, -1); - enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; - enc_cfg.encdec.param_size = sizeof(struct asm_amrwb_enc_cfg) - - sizeof(struct asm_stream_cmd_set_encdec_param); - enc_cfg.encblk.frames_per_buf = frames_per_buf; - enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - - sizeof(struct asm_enc_cfg_blk_param_v2); - - enc_cfg.enc_mode = band_mode; - enc_cfg.dtx_mode = dtx_enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); - if (rc < 0) { - pr_err("%s: Comamnd %d failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_enc_cfg_blk_amrwb); - - -static int __q6asm_media_format_block_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, int stream_id, - bool use_default_chmap, char *channel_map) -{ - struct asm_multi_channel_pcm_fmt_blk_v2 fmt; - u8 *channel_mapping; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", __func__, ac->session, rate, - channels); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&fmt.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.num_channels = channels; - fmt.bits_per_sample = bits_per_sample; - fmt.sample_rate = rate; - fmt.is_signed = 1; - - channel_mapping = fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v3 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - fmt.hdr.token = ((ac->session << 8) & 0xFFFF00) | - (stream_id & 0xFF); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v4 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - fmt.hdr.token = ((ac->session << 8) & 0xFFFF00) | - (stream_id & 0xFF); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - - -static int __q6asm_media_format_block_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v5 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - fmt.hdr.token = ((ac->session << 8) & 0xFFFF00) | - (stream_id & 0xFF); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = (uint16_t) channels & 0xFFFF; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, fmt.param.num_channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_media_format_block_pcm - - * command to set mediafmt block for PCM on ASM stream - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of ASM channels - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - return __q6asm_media_format_block_pcm(ac, rate, - channels, 16, ac->stream_id, - true, NULL); -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm); - -/** - * q6asm_media_format_block_pcm_format_support - - * command to set mediafmt block for PCM format support - * - * @ac: Audio client handle - * @rate: sample rate - * @channels: number of ASM channels - * @bits_per_sample: number of bits per sample - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample) -{ - return __q6asm_media_format_block_pcm(ac, rate, - channels, bits_per_sample, ac->stream_id, - true, NULL); -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support); - -int q6asm_media_format_block_pcm_format_support_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, int stream_id, - bool use_default_chmap, char *channel_map) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map); -} - -/* - * q6asm_media_format_block_pcm_format_support_v3- sends pcm decoder - * configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @stream_id: stream id of stream to be associated with this session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_media_format_block_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm_v3(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map, - sample_word_size); - -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support_v3); - -/* - * q6asm_media_format_block_pcm_format_support_v4- sends pcm decoder - * configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @stream_id: stream id of stream to be associated with this session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm_v4(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map, - sample_word_size, endianness, - mode); - -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support_v4); - - -/* - * q6asm_media_format_block_pcm_format_support_v5- sends pcm decoder - * configuration parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @stream_id: stream id of stream to be associated with this session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - if (!use_default_chmap && (channel_map == NULL)) { - pr_err("%s: No valid chan map and can't use default\n", - __func__); - return -EINVAL; - } - return __q6asm_media_format_block_pcm_v5(ac, rate, - channels, bits_per_sample, stream_id, - use_default_chmap, channel_map, - sample_word_size, endianness, - mode); - -} -EXPORT_SYMBOL(q6asm_media_format_block_pcm_format_support_v5); - - -static int __q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample) -{ - struct asm_multi_channel_pcm_fmt_blk_v2 fmt; - u8 *channel_mapping; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", __func__, ac->session, rate, - channels); - - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.num_channels = channels; - fmt.bits_per_sample = bits_per_sample; - fmt.sample_rate = rate; - fmt.is_signed = 1; - - channel_mapping = fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_multi_ch_pcm_v3(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v3 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_multi_ch_pcm_v4(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v4 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -static int __q6asm_media_format_block_multi_ch_pcm_v5(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - struct asm_multi_channel_pcm_fmt_blk_param_v5 fmt; - u8 *channel_mapping; - int rc; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL_V8) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]wordsize[%d]\n", __func__, - ac->session, rate, channels, - bits_per_sample, sample_word_size); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.param.num_channels = channels; - fmt.param.bits_per_sample = bits_per_sample; - fmt.param.sample_rate = rate; - fmt.param.is_signed = 1; - fmt.param.sample_word_size = sample_word_size; - fmt.param.endianness = endianness; - fmt.param.mode = mode; - channel_mapping = fmt.param.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - rc = -EINVAL; - goto fail_cmd; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL_V8); - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map) -{ - return __q6asm_media_format_block_multi_ch_pcm(ac, rate, - channels, use_default_chmap, channel_map, 16); -} - -int q6asm_media_format_block_multi_ch_pcm_v2( - struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample) -{ - return __q6asm_media_format_block_multi_ch_pcm(ac, rate, - channels, use_default_chmap, channel_map, - bits_per_sample); -} - -/* - * q6asm_media_format_block_multi_ch_pcm_v3 - sends pcm decoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - */ -int q6asm_media_format_block_multi_ch_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size) -{ - return __q6asm_media_format_block_multi_ch_pcm_v3(ac, rate, channels, - use_default_chmap, - channel_map, - bits_per_sample, - sample_word_size); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_ch_pcm_v3); - -/* - * q6asm_media_format_block_multi_ch_pcm_v4 - sends pcm decoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_multi_ch_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_media_format_block_multi_ch_pcm_v4(ac, rate, channels, - use_default_chmap, - channel_map, - bits_per_sample, - sample_word_size, - endianness, - mode); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_ch_pcm_v4); - - -/* - * q6asm_media_format_block_multi_ch_pcm_v5 - sends pcm decoder configuration - * parameters - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @bits_per_sample: bit width of encoder session - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @sample_word_size: Size in bits of the word that holds a sample of a channel - * @endianness: endianness of the pcm data - * @mode: Mode to provide additional info about the pcm input data - */ -int q6asm_media_format_block_multi_ch_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode) -{ - return __q6asm_media_format_block_multi_ch_pcm_v5(ac, rate, channels, - use_default_chmap, - channel_map, - bits_per_sample, - sample_word_size, - endianness, - mode); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_ch_pcm_v5); - - -/* - * q6asm_media_format_block_gen_compr - set up generic compress format params - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - * @use_default_chmap: true if default channel map to be used - * @channel_map: input channel map - * @bits_per_sample: bit width of gen compress stream - */ -int q6asm_media_format_block_gen_compr(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample) -{ - struct asm_generic_compressed_fmt_blk_t fmt; - u8 *channel_mapping; - int rc = 0; - - if (channels > PCM_FORMAT_MAX_NUM_CHANNEL) { - pr_err("%s: Invalid channel count %d\n", __func__, channels); - return -EINVAL; - } - - pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]\n", - __func__, ac->session, rate, - channels, bits_per_sample); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.num_channels = channels; - fmt.bits_per_sample = bits_per_sample; - fmt.sampling_rate = rate; - - channel_mapping = fmt.channel_mapping; - - memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - - if (use_default_chmap) { - if (q6asm_map_channels(channel_mapping, channels, false)) { - pr_err("%s: map channels failed %d\n", - __func__, channels); - return -EINVAL; - } - } else { - memcpy(channel_mapping, channel_map, - PCM_FORMAT_MAX_NUM_CHANNEL); - } - - atomic_set(&ac->cmd_state, -1); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_gen_compr); - - -/* - * q6asm_media_format_block_iec - set up IEC61937 (compressed) or IEC60958 - * (pcm) format params. Both audio standards - * use the same format and are used for - * HDMI or SPDIF. - * - * @ac: Client session handle - * @rate: sample rate - * @channels: number of channels - */ -int q6asm_media_format_block_iec(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - struct asm_iec_compressed_fmt_blk_t fmt; - int rc = 0; - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", - __func__, ac->session, rate, - channels); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - - fmt.hdr.opcode = ASM_DATA_CMD_IEC_60958_MEDIA_FMT; - fmt.num_channels = channels; - fmt.sampling_rate = rate; - - atomic_set(&ac->cmd_state, -1); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for format update\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_iec); - -static int __q6asm_media_format_block_multi_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg, int stream_id) -{ - struct asm_aac_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s: session[%d]rate[%d]ch[%d]\n", __func__, ac->session, - cfg->sample_rate, cfg->ch_cfg); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&fmt.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, fmt.hdr.token, stream_id, ac->session); - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmt_blk); - fmt.aac_fmt_flag = cfg->format; - fmt.audio_objype = cfg->aot; - /* If zero, PCE is assumed to be available in bitstream*/ - fmt.total_size_of_PCE_bits = 0; - fmt.channel_config = cfg->ch_cfg; - fmt.sample_rate = cfg->sample_rate; - - pr_debug("%s: format=0x%x cfg_size=%d aac-cfg=0x%x aot=%d ch=%d sr=%d\n", - __func__, fmt.aac_fmt_flag, fmt.fmt_blk.fmt_blk_size, - fmt.aac_fmt_flag, - fmt.audio_objype, - fmt.channel_config, - fmt.sample_rate); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_media_format_block_multi_aac - - * command to set mediafmt block for multi_aac on ASM stream - * - * @ac: Audio client handle - * @cfg: multi_aac config - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_multi_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg) -{ - return __q6asm_media_format_block_multi_aac(ac, cfg, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_media_format_block_multi_aac); - -/** - * q6asm_media_format_block_aac - - * command to set mediafmt block for aac on ASM - * - * @ac: Audio client handle - * @cfg: aac config - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg) -{ - return __q6asm_media_format_block_multi_aac(ac, cfg, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_media_format_block_aac); - -/** - * q6asm_stream_media_format_block_aac - - * command to set mediafmt block for aac on ASM stream - * - * @ac: Audio client handle - * @cfg: aac config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg, int stream_id) -{ - return __q6asm_media_format_block_multi_aac(ac, cfg, stream_id); -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_aac); - -/** - * q6asm_media_format_block_wma - - * command to set mediafmt block for wma on ASM stream - * - * @ac: Audio client handle - * @cfg: wma config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_wma(struct audio_client *ac, - void *cfg, int stream_id) -{ - struct asm_wmastdv9_fmt_blk_v2 fmt; - struct asm_wma_cfg *wma_cfg = (struct asm_wma_cfg *)cfg; - int rc = 0; - - pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x]\n", - ac->session, wma_cfg->format_tag, wma_cfg->sample_rate, - wma_cfg->ch_cfg, wma_cfg->avg_bytes_per_sec, - wma_cfg->block_align, wma_cfg->valid_bits_per_sample, - wma_cfg->ch_mask, wma_cfg->encode_opt); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - fmt.fmtag = wma_cfg->format_tag; - fmt.num_channels = wma_cfg->ch_cfg; - fmt.sample_rate = wma_cfg->sample_rate; - fmt.avg_bytes_per_sec = wma_cfg->avg_bytes_per_sec; - fmt.blk_align = wma_cfg->block_align; - fmt.bits_per_sample = - wma_cfg->valid_bits_per_sample; - fmt.channel_mask = wma_cfg->ch_mask; - fmt.enc_options = wma_cfg->encode_opt; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_wma); - -/** - * q6asm_media_format_block_wmapro - - * command to set mediafmt block for wmapro on ASM stream - * - * @ac: Audio client handle - * @cfg: wmapro config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_wmapro(struct audio_client *ac, - void *cfg, int stream_id) -{ - struct asm_wmaprov10_fmt_blk_v2 fmt; - struct asm_wmapro_cfg *wmapro_cfg = (struct asm_wmapro_cfg *)cfg; - int rc = 0; - - pr_debug("%s: session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x], adv_enc_opt[0x%4x], adv_enc_opt2[0x%8x]\n", - __func__, - ac->session, wmapro_cfg->format_tag, wmapro_cfg->sample_rate, - wmapro_cfg->ch_cfg, wmapro_cfg->avg_bytes_per_sec, - wmapro_cfg->block_align, wmapro_cfg->valid_bits_per_sample, - wmapro_cfg->ch_mask, wmapro_cfg->encode_opt, - wmapro_cfg->adv_encode_opt, wmapro_cfg->adv_encode_opt2); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.fmtag = wmapro_cfg->format_tag; - fmt.num_channels = wmapro_cfg->ch_cfg; - fmt.sample_rate = wmapro_cfg->sample_rate; - fmt.avg_bytes_per_sec = - wmapro_cfg->avg_bytes_per_sec; - fmt.blk_align = wmapro_cfg->block_align; - fmt.bits_per_sample = wmapro_cfg->valid_bits_per_sample; - fmt.channel_mask = wmapro_cfg->ch_mask; - fmt.enc_options = wmapro_cfg->encode_opt; - fmt.usAdvancedEncodeOpt = wmapro_cfg->adv_encode_opt; - fmt.advanced_enc_options2 = wmapro_cfg->adv_encode_opt2; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd open failed %d\n", __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_wmapro); - -/** - * q6asm_media_format_block_amrwbplus - - * command to set mediafmt block for amrwbplus on ASM stream - * - * @ac: Audio client handle - * @cfg: amrwbplus config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_amrwbplus(struct audio_client *ac, - struct asm_amrwbplus_cfg *cfg) -{ - struct asm_amrwbplus_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s: session[%d]band-mode[%d]frame-fmt[%d]ch[%d]\n", - __func__, - ac->session, - cfg->amr_band_mode, - cfg->amr_frame_fmt, - cfg->num_channels); - - q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - fmt.amr_frame_fmt = cfg->amr_frame_fmt; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Comamnd media format update failed.. %d\n", - __func__, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_amrwbplus); - -/** - * q6asm_stream_media_format_block_flac - - * command to set mediafmt block for flac on ASM stream - * - * @ac: Audio client handle - * @cfg: FLAC config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_flac(struct audio_client *ac, - struct asm_flac_cfg *cfg, int stream_id) -{ - struct asm_flac_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d] rate[%d] ch[%d] size[%d] stream_id[%d]\n", - __func__, ac->session, cfg->sample_rate, cfg->ch_cfg, - cfg->sample_size, stream_id); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.is_stream_info_present = cfg->stream_info_present; - fmt.num_channels = cfg->ch_cfg; - fmt.min_blk_size = cfg->min_blk_size; - fmt.max_blk_size = cfg->max_blk_size; - fmt.sample_rate = cfg->sample_rate; - fmt.min_frame_size = cfg->min_frame_size; - fmt.max_frame_size = cfg->max_frame_size; - fmt.sample_size = cfg->sample_size; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_flac); - -/** - * q6asm_media_format_block_alac - - * command to set mediafmt block for alac on ASM stream - * - * @ac: Audio client handle - * @cfg: ALAC config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_alac(struct audio_client *ac, - struct asm_alac_cfg *cfg, int stream_id) -{ - struct asm_alac_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d]rate[%d]ch[%d]\n", __func__, - ac->session, cfg->sample_rate, cfg->num_channels); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.frame_length = cfg->frame_length; - fmt.compatible_version = cfg->compatible_version; - fmt.bit_depth = cfg->bit_depth; - fmt.pb = cfg->pb; - fmt.mb = cfg->mb; - fmt.kb = cfg->kb; - fmt.num_channels = cfg->num_channels; - fmt.max_run = cfg->max_run; - fmt.max_frame_bytes = cfg->max_frame_bytes; - fmt.avg_bit_rate = cfg->avg_bit_rate; - fmt.sample_rate = cfg->sample_rate; - fmt.channel_layout_tag = cfg->channel_layout_tag; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_alac); - -/* - * q6asm_media_format_block_g711 - sends g711 decoder configuration - * parameters - * @ac: Client session handle - * @cfg: Audio stream manager configuration parameters - * @stream_id: Stream id - */ -int q6asm_media_format_block_g711(struct audio_client *ac, - struct asm_g711_dec_cfg *cfg, int stream_id) -{ - struct asm_g711_dec_fmt_blk_v2 fmt; - int rc = 0; - - if (!ac) { - pr_err("%s: audio client is null\n", __func__); - return -EINVAL; - } - if (!cfg) { - pr_err("%s: Invalid ASM config\n", __func__); - return -EINVAL; - } - - if (stream_id <= 0) { - pr_err("%s: Invalid stream id\n", __func__); - return -EINVAL; - } - - pr_debug("%s :session[%d]rate[%d]\n", __func__, - ac->session, cfg->sample_rate); - - memset(&fmt, 0, sizeof(struct asm_g711_dec_fmt_blk_v2)); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.sample_rate = cfg->sample_rate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Command media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_g711); - -/** - * q6asm_stream_media_format_block_vorbis - - * command to set mediafmt block for vorbis on ASM stream - * - * @ac: Audio client handle - * @cfg: vorbis config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_vorbis(struct audio_client *ac, - struct asm_vorbis_cfg *cfg, int stream_id) -{ - struct asm_vorbis_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d] bit_stream_fmt[%d] stream_id[%d]\n", - __func__, ac->session, cfg->bit_stream_fmt, stream_id); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.bit_stream_fmt = cfg->bit_stream_fmt; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_vorbis); - -/** - * q6asm_media_format_block_ape - - * command to set mediafmt block for APE on ASM stream - * - * @ac: Audio client handle - * @cfg: APE config - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_media_format_block_ape(struct audio_client *ac, - struct asm_ape_cfg *cfg, int stream_id) -{ - struct asm_ape_fmt_blk_v2 fmt; - int rc = 0; - - pr_debug("%s :session[%d]rate[%d]ch[%d]\n", __func__, - ac->session, cfg->sample_rate, cfg->num_channels); - - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.compatible_version = cfg->compatible_version; - fmt.compression_level = cfg->compression_level; - fmt.format_flags = cfg->format_flags; - fmt.blocks_per_frame = cfg->blocks_per_frame; - fmt.final_frame_blocks = cfg->final_frame_blocks; - fmt.total_frames = cfg->total_frames; - fmt.bits_per_sample = cfg->bits_per_sample; - fmt.num_channels = cfg->num_channels; - fmt.sample_rate = cfg->sample_rate; - fmt.seek_table_present = cfg->seek_table_present; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_ape); - -/* - * q6asm_media_format_block_dsd- Sends DSD Decoder - * configuration parameters - * - * @ac: Client session handle - * @cfg: DSD Media Format Configuration. - * @stream_id: stream id of stream to be associated with this session - * - * Return 0 on success or negative error code on failure - */ -int q6asm_media_format_block_dsd(struct audio_client *ac, - struct asm_dsd_cfg *cfg, int stream_id) -{ - struct asm_dsd_fmt_blk_v2 fmt; - int rc; - - pr_debug("%s: session[%d] data_rate[%d] ch[%d]\n", __func__, - ac->session, cfg->dsd_data_rate, cfg->num_channels); - - memset(&fmt, 0, sizeof(fmt)); - q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id); - - fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - - sizeof(fmt.fmtblk); - - fmt.num_version = cfg->num_version; - fmt.is_bitwise_big_endian = cfg->is_bitwise_big_endian; - fmt.dsd_channel_block_size = cfg->dsd_channel_block_size; - fmt.num_channels = cfg->num_channels; - fmt.dsd_data_rate = cfg->dsd_data_rate; - atomic_set(&ac->cmd_state, -1); - rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); - if (rc < 0) { - pr_err("%s: Command DSD media format update failed, err: %d\n", - __func__, rc); - goto done; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for DSD FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto done; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto done; - } - return 0; -done: - return rc; -} -EXPORT_SYMBOL(q6asm_media_format_block_dsd); - -/** - * q6asm_stream_media_format_block_aptx_dec - - * command to set mediafmt block for APTX dec on ASM stream - * - * @ac: Audio client handle - * @srate: sample rate - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_media_format_block_aptx_dec(struct audio_client *ac, - uint32_t srate, int stream_id) -{ - struct asm_aptx_dec_fmt_blk_v2 aptx_fmt; - int rc = 0; - - if (!ac->session) { - pr_err("%s: ac session invalid\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s :session[%d] rate[%d] stream_id[%d]\n", - __func__, ac->session, srate, stream_id); - - q6asm_stream_add_hdr(ac, &aptx_fmt.hdr, sizeof(aptx_fmt), TRUE, - stream_id); - atomic_set(&ac->cmd_state, -1); - - aptx_fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; - aptx_fmt.fmtblk.fmt_blk_size = sizeof(aptx_fmt) - sizeof(aptx_fmt.hdr) - - sizeof(aptx_fmt.fmtblk); - - aptx_fmt.sample_rate = srate; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &aptx_fmt); - if (rc < 0) { - pr_err("%s :Comamnd media format update failed %d\n", - __func__, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_stream_media_format_block_aptx_dec); - -static int __q6asm_ds1_set_endp_params(struct audio_client *ac, int param_id, - int param_value, int stream_id) -{ - struct asm_dec_ddp_endp_param_v2 ddp_cfg; - int rc = 0; - - pr_debug("%s: session[%d] stream[%d],param_id[%d]param_value[%d]", - __func__, ac->session, stream_id, param_id, param_value); - - q6asm_stream_add_hdr(ac, &ddp_cfg.hdr, sizeof(ddp_cfg), TRUE, - stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&ddp_cfg.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - ddp_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - ddp_cfg.encdec.param_id = param_id; - ddp_cfg.encdec.param_size = sizeof(struct asm_dec_ddp_endp_param_v2) - - (sizeof(struct apr_hdr) + - sizeof(struct asm_stream_cmd_set_encdec_param)); - ddp_cfg.endp_param_value = param_value; - rc = apr_send_pkt(ac->apr, (uint32_t *) &ddp_cfg); - if (rc < 0) { - pr_err("%s: Command opcode[0x%x] failed %d\n", - __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout opcode[0x%x]\n", __func__, - ddp_cfg.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_ds1_set_endp_params - - * command to set DS1 params for ASM - * - * @ac: Audio client handle - * @param_id: param id - * @param_value: value of param - * - * Returns 0 on success or error on failure - */ -int q6asm_ds1_set_endp_params(struct audio_client *ac, - int param_id, int param_value) -{ - return __q6asm_ds1_set_endp_params(ac, param_id, param_value, - ac->stream_id); -} - -/** - * q6asm_ds1_set_stream_endp_params - - * command to set DS1 params for ASM stream - * - * @ac: Audio client handle - * @param_id: param id - * @param_value: value of param - * @stream_id: stream ID info - * - * Returns 0 on success or error on failure - */ -int q6asm_ds1_set_stream_endp_params(struct audio_client *ac, - int param_id, int param_value, - int stream_id) -{ - return __q6asm_ds1_set_endp_params(ac, param_id, param_value, - stream_id); -} -EXPORT_SYMBOL(q6asm_ds1_set_stream_endp_params); - -/** - * q6asm_memory_map - - * command to send memory map for ASM - * - * @ac: Audio client handle - * @buf_add: buffer address to map - * @dir: RX or TX session - * @bufsz: size of each buffer - * @bufcnt: buffer count - * - * Returns 0 on success or error on failure - */ -int q6asm_memory_map(struct audio_client *ac, phys_addr_t buf_add, int dir, - uint32_t bufsz, uint32_t bufcnt) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - struct audio_port_data *port = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - struct asm_buffer_node *buffer_node = NULL; - int rc = 0; - int cmd_size = 0; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->mmap_apr == NULL) { - pr_err("%s: mmap APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - buffer_node = kmalloc(sizeof(struct asm_buffer_node), GFP_KERNEL); - if (!buffer_node) - return -ENOMEM; - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + sizeof(struct avs_shared_map_region_payload) * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) { - rc = -EINVAL; - kfree(buffer_node); - return rc; - } - mmap_regions = (struct avs_cmd_shared_mem_map_regions *) - mmap_region_cmd; - q6asm_add_mmaphdr(ac, &mmap_regions->hdr, cmd_size, dir); - atomic_set(&ac->mem_state, -1); - mmap_regions->hdr.opcode = ASM_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mmap_regions->num_regions = bufcnt & 0x00ff; - mmap_regions->property_flag = 0x00; - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - ac->port[dir].tmp_hdl = 0; - port = &ac->port[dir]; - pr_debug("%s: buf_add 0x%pK, bufsz: %d\n", __func__, - &buf_add, bufsz); - mregions->shm_addr_lsw = lower_32_bits(buf_add); - mregions->shm_addr_msw = msm_audio_populate_upper_32_bits(buf_add); - mregions->mem_size_bytes = bufsz; - ++mregions; - - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) mmap_region_cmd); - if (rc < 0) { - pr_err("%s: mmap op[0x%x]rc[%d]\n", __func__, - mmap_regions->hdr.opcode, rc); - rc = -EINVAL; - kfree(buffer_node); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0 && - ac->port[dir].tmp_hdl), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_map\n", __func__); - rc = -ETIMEDOUT; - kfree(buffer_node); - goto fail_cmd; - } - if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s: DSP returned error[%s] for memory_map\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - kfree(buffer_node); - goto fail_cmd; - } - buffer_node->buf_phys_addr = buf_add; - buffer_node->mmap_hdl = ac->port[dir].tmp_hdl; - list_add_tail(&buffer_node->list, &ac->port[dir].mem_map_handle); - ac->port[dir].tmp_hdl = 0; - rc = 0; - -fail_cmd: - kfree(mmap_region_cmd); - return rc; -} -EXPORT_SYMBOL(q6asm_memory_map); - -/** - * q6asm_memory_unmap - - * command to send memory unmap for ASM - * - * @ac: Audio client handle - * @buf_add: buffer address to unmap - * @dir: RX or TX session - * - * Returns 0 on success or error on failure - */ -int q6asm_memory_unmap(struct audio_client *ac, phys_addr_t buf_add, int dir) -{ - struct avs_cmd_shared_mem_unmap_regions mem_unmap; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - - int rc = 0; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (this_mmap.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - q6asm_add_mmaphdr(ac, &mem_unmap.hdr, - sizeof(struct avs_cmd_shared_mem_unmap_regions), - dir); - atomic_set(&ac->mem_state, -1); - mem_unmap.hdr.opcode = ASM_CMD_SHARED_MEM_UNMAP_REGIONS; - mem_unmap.mem_map_handle = 0; - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - pr_debug("%s: Found the element\n", __func__); - mem_unmap.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - pr_debug("%s: mem_unmap-mem_map_handle: 0x%x\n", - __func__, mem_unmap.mem_map_handle); - - if (mem_unmap.mem_map_handle == 0) { - pr_err("%s: Do not send null mem handle to DSP\n", __func__); - rc = 0; - goto fail_cmd; - } - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) &mem_unmap); - if (rc < 0) { - pr_err("%s: mem_unmap op[0x%x]rc[%d]\n", __func__, - mem_unmap.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_unmap of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -ETIMEDOUT; - goto fail_cmd; - } else if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s DSP returned error [%s] map handle 0x%x\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state)), - mem_unmap.mem_map_handle); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - goto fail_cmd; - } else if (atomic_read(&ac->unmap_cb_success) == 0) { - pr_err("%s: Error in mem unmap callback of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -EINVAL; - goto fail_cmd; - } - - rc = 0; -fail_cmd: - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - list_del(&buf_node->list); - kfree(buf_node); - break; - } - } - return rc; -} -EXPORT_SYMBOL(q6asm_memory_unmap); - -/** - * q6asm_memory_map_regions - - * command to send memory map regions for ASM - * - * @ac: Audio client handle - * @dir: RX or TX session - * @bufsz: size of each buffer - * @bufcnt: buffer count - * @is_contiguous: alloc contiguous mem or not - * - * Returns 0 on success or error on failure - */ -static int q6asm_memory_map_regions(struct audio_client *ac, int dir, - uint32_t bufsz, uint32_t bufcnt, - bool is_contiguous) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - struct audio_port_data *port = NULL; - struct audio_buffer *ab = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - struct asm_buffer_node *buffer_node = NULL; - int rc = 0; - int i = 0; - uint32_t cmd_size = 0; - uint32_t bufcnt_t; - uint32_t bufsz_t; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->mmap_apr == NULL) { - pr_err("%s: mmap APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - bufcnt_t = (is_contiguous) ? 1 : bufcnt; - bufsz_t = (is_contiguous) ? (bufsz * bufcnt) : bufsz; - - if (is_contiguous) { - /* The size to memory map should be multiple of 4K bytes */ - bufsz_t = PAGE_ALIGN(bufsz_t); - } - - if (bufcnt_t > (UINT_MAX - - sizeof(struct avs_cmd_shared_mem_map_regions)) - / sizeof(struct avs_shared_map_region_payload)) { - pr_err("%s: Unsigned Integer Overflow. bufcnt_t = %u\n", - __func__, bufcnt_t); - return -EINVAL; - } - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + (sizeof(struct avs_shared_map_region_payload) - * bufcnt_t); - - - if (bufcnt > (UINT_MAX / sizeof(struct asm_buffer_node))) { - pr_err("%s: Unsigned Integer Overflow. bufcnt = %u\n", - __func__, bufcnt); - return -EINVAL; - } - - buffer_node = kzalloc(sizeof(struct asm_buffer_node) * bufcnt, - GFP_KERNEL); - if (!buffer_node) - return -ENOMEM; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) { - rc = -EINVAL; - kfree(buffer_node); - return rc; - } - mmap_regions = (struct avs_cmd_shared_mem_map_regions *) - mmap_region_cmd; - q6asm_add_mmaphdr(ac, &mmap_regions->hdr, cmd_size, dir); - atomic_set(&ac->mem_state, -1); - pr_debug("%s: mmap_region=0x%pK token=0x%x\n", __func__, - mmap_regions, ((ac->session << 8) | dir)); - - mmap_regions->hdr.opcode = ASM_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mmap_regions->num_regions = bufcnt_t; /*bufcnt & 0x00ff; */ - mmap_regions->property_flag = 0x00; - pr_debug("%s: map_regions->nregions = %d\n", __func__, - mmap_regions->num_regions); - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - ac->port[dir].tmp_hdl = 0; - port = &ac->port[dir]; - for (i = 0; i < bufcnt_t; i++) { - ab = &port->buf[i]; - mregions->shm_addr_lsw = lower_32_bits(ab->phys); - mregions->shm_addr_msw = - msm_audio_populate_upper_32_bits(ab->phys); - mregions->mem_size_bytes = bufsz_t; - ++mregions; - } - - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) mmap_region_cmd); - if (rc < 0) { - pr_err("%s: mmap_regions op[0x%x]rc[%d]\n", __func__, - mmap_regions->hdr.opcode, rc); - rc = -EINVAL; - kfree(buffer_node); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0 && - ac->port[dir].tmp_hdl), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_map\n", __func__); - rc = -ETIMEDOUT; - kfree(buffer_node); - goto fail_cmd; - } - if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s DSP returned error for memory_map [%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - kfree(buffer_node); - goto fail_cmd; - } - mutex_lock(&ac->cmd_lock); - - for (i = 0; i < bufcnt; i++) { - ab = &port->buf[i]; - buffer_node[i].buf_phys_addr = ab->phys; - buffer_node[i].mmap_hdl = ac->port[dir].tmp_hdl; - list_add_tail(&buffer_node[i].list, - &ac->port[dir].mem_map_handle); - pr_debug("%s: i=%d, bufadd[i] = 0x%pK, maphdl[i] = 0x%x\n", - __func__, i, &buffer_node[i].buf_phys_addr, - buffer_node[i].mmap_hdl); - } - ac->port[dir].tmp_hdl = 0; - mutex_unlock(&ac->cmd_lock); - rc = 0; -fail_cmd: - kfree(mmap_region_cmd); - return rc; -} -EXPORT_SYMBOL(q6asm_memory_map_regions); - -/** - * q6asm_memory_unmap_regions - - * command to send memory unmap regions for ASM - * - * @ac: Audio client handle - * @dir: RX or TX session - * - * Returns 0 on success or error on failure - */ -static int q6asm_memory_unmap_regions(struct audio_client *ac, int dir) -{ - struct avs_cmd_shared_mem_unmap_regions mem_unmap; - struct audio_port_data *port = NULL; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - phys_addr_t buf_add; - int rc = 0; - int cmd_size = 0; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->mmap_apr == NULL) { - pr_err("%s: mmap APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: Session[%d]\n", __func__, ac->session); - - cmd_size = sizeof(struct avs_cmd_shared_mem_unmap_regions); - q6asm_add_mmaphdr(ac, &mem_unmap.hdr, cmd_size, dir); - atomic_set(&ac->mem_state, -1); - port = &ac->port[dir]; - buf_add = port->buf->phys; - mem_unmap.hdr.opcode = ASM_CMD_SHARED_MEM_UNMAP_REGIONS; - mem_unmap.mem_map_handle = 0; - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - pr_debug("%s: Found the element\n", __func__); - mem_unmap.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - pr_debug("%s: mem_unmap-mem_map_handle: 0x%x\n", - __func__, mem_unmap.mem_map_handle); - - if (mem_unmap.mem_map_handle == 0) { - pr_err("%s: Do not send null mem handle to DSP\n", __func__); - rc = 0; - goto fail_cmd; - } - rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) &mem_unmap); - if (rc < 0) { - pr_err("mmap_regions op[0x%x]rc[%d]\n", - mem_unmap.hdr.opcode, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->mem_wait, - (atomic_read(&ac->mem_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for memory_unmap of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -ETIMEDOUT; - goto fail_cmd; - } else if (atomic_read(&ac->mem_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->mem_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->mem_state)); - goto fail_cmd; - } else if (atomic_read(&ac->unmap_cb_success) == 0) { - pr_err("%s: Error in mem unmap callback of handle 0x%x\n", - __func__, mem_unmap.mem_map_handle); - rc = -EINVAL; - goto fail_cmd; - } - rc = 0; - -fail_cmd: - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == buf_add) { - list_del(&buf_node->list); - kfree(buf_node); - break; - } - } - return rc; -} -EXPORT_SYMBOL(q6asm_memory_unmap_regions); - -int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain) -{ - struct asm_volume_ctrl_multichannel_gain multi_ch_gain; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(¶m_info, 0, sizeof(param_info)); - memset(&multi_ch_gain, 0, sizeof(multi_ch_gain)); - - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_MULTICHANNEL_GAIN; - param_info.param_size = sizeof(multi_ch_gain); - - multi_ch_gain.gain_data[0].channeltype = PCM_CHANNEL_FL; - multi_ch_gain.gain_data[0].gain = left_gain << 15; - multi_ch_gain.gain_data[1].channeltype = PCM_CHANNEL_FR; - multi_ch_gain.gain_data[1].gain = right_gain << 15; - multi_ch_gain.num_channels = 2; - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &multi_ch_gain); - if (rc < 0) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} - -/* - * q6asm_set_multich_gain: set multiple channel gains on an ASM session - * @ac: audio client handle - * @channels: number of channels caller intends to set gains - * @gains: list of gains of audio channels - * @ch_map: list of channel mapping. Only valid if use_default is false - * @use_default: flag to indicate whether to use default mapping - */ -int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, - uint32_t *gains, uint8_t *ch_map, bool use_default) -{ - struct asm_volume_ctrl_multichannel_gain multich_gain; - struct param_hdr_v3 param_info; - int rc = 0; - int i; - u8 default_chmap[VOLUME_CONTROL_MAX_CHANNELS]; - - if (ac == NULL) { - pr_err("%s: Audio client is NULL\n", __func__); - return -EINVAL; - } - if (gains == NULL) { - dev_err(ac->dev, "%s: gain_list is NULL\n", __func__); - rc = -EINVAL; - goto done; - } - if (channels > VOLUME_CONTROL_MAX_CHANNELS) { - dev_err(ac->dev, "%s: Invalid channel count %d\n", - __func__, channels); - rc = -EINVAL; - goto done; - } - if (!use_default && ch_map == NULL) { - dev_err(ac->dev, "%s: NULL channel map\n", __func__); - rc = -EINVAL; - goto done; - } - - memset(¶m_info, 0, sizeof(param_info)); - memset(&multich_gain, 0, sizeof(multich_gain)); - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_MULTICHANNEL_GAIN; - param_info.param_size = sizeof(multich_gain); - - if (use_default) { - rc = q6asm_map_channels(default_chmap, channels, false); - if (rc < 0) - goto done; - for (i = 0; i < channels; i++) { - multich_gain.gain_data[i].channeltype = - default_chmap[i]; - multich_gain.gain_data[i].gain = gains[i] << 15; - } - } else { - for (i = 0; i < channels; i++) { - multich_gain.gain_data[i].channeltype = ch_map[i]; - multich_gain.gain_data[i].gain = gains[i] << 15; - } - } - multich_gain.num_channels = channels; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &multich_gain); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_set_multich_gain); - -/** - * q6asm_set_mute - - * command to set mute for ASM - * - * @ac: Audio client handle - * @muteflag: mute value - * - * Returns 0 on success or error on failure - */ -int q6asm_set_mute(struct audio_client *ac, int muteflag) -{ - struct asm_volume_ctrl_mute_config mute; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&mute, 0, sizeof(mute)); - memset(¶m_info, 0, sizeof(param_info)); - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_VOL_CTRL_MUTE_CONFIG; - param_info.param_size = sizeof(mute); - mute.mute_flag = muteflag; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, (u8 *) &mute); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - return rc; -} -EXPORT_SYMBOL(q6asm_set_mute); - -static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) -{ - struct asm_volume_ctrl_master_gain vol; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&vol, 0, sizeof(vol)); - memset(¶m_info, 0, sizeof(param_info)); - - rc = q6asm_set_soft_volume_module_instance_ids(instance, ¶m_info); - if (rc) { - pr_err("%s: Failed to pack soft volume module and instance IDs, error %d\n", - __func__, rc); - return rc; - } - - param_info.param_id = ASM_PARAM_ID_VOL_CTRL_MASTER_GAIN; - param_info.param_size = sizeof(vol); - vol.master_gain = volume; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, (u8 *) &vol); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} - -/** - * q6asm_set_volume - - * command to set volume for ASM - * - * @ac: Audio client handle - * @volume: volume level - * - * Returns 0 on success or error on failure - */ -int q6asm_set_volume(struct audio_client *ac, int volume) -{ - return __q6asm_set_volume(ac, volume, SOFT_VOLUME_INSTANCE_1); -} -EXPORT_SYMBOL(q6asm_set_volume); - -int q6asm_set_volume_v2(struct audio_client *ac, int volume, int instance) -{ - return __q6asm_set_volume(ac, volume, instance); -} - -/** - * q6asm_set_aptx_dec_bt_addr - - * command to aptx decoder BT addr for ASM - * - * @ac: Audio client handle - * @cfg: APTX decoder bt addr config - * - * Returns 0 on success or error on failure - */ -int q6asm_set_aptx_dec_bt_addr(struct audio_client *ac, - struct aptx_dec_bt_addr_cfg *cfg) -{ - struct aptx_dec_bt_dev_addr paylod; - int sz = 0; - int rc = 0; - - pr_debug("%s: BT addr nap %d, uap %d, lap %d\n", __func__, cfg->nap, - cfg->uap, cfg->lap); - - if (ac == NULL) { - pr_err("%s: AC handle NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - sz = sizeof(struct aptx_dec_bt_dev_addr); - q6asm_add_hdr_async(ac, &paylod.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - paylod.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; - paylod.encdec.param_id = APTX_DECODER_BT_ADDRESS; - paylod.encdec.param_size = sz - sizeof(paylod.hdr) - - sizeof(paylod.encdec); - paylod.bt_addr_cfg.lap = cfg->lap; - paylod.bt_addr_cfg.uap = cfg->uap; - paylod.bt_addr_cfg.nap = cfg->nap; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &paylod); - if (rc < 0) { - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, paylod.encdec.param_id, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, - paylod.encdec.param_id); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), - paylod.encdec.param_id); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - pr_debug("%s: set BT addr is success\n", __func__); - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_set_aptx_dec_bt_addr); - -/** - * q6asm_send_ion_fd - - * command to send ION memory map for ASM - * - * @ac: Audio client handle - * @fd: ION file desc - * - * Returns 0 on success or error on failure - */ -int q6asm_send_ion_fd(struct audio_client *ac, int fd) -{ - struct dma_buf *dma_buf; - dma_addr_t paddr; - size_t pa_len = 0; - void *vaddr; - int ret; - int sz = 0; - struct avs_rtic_shared_mem_addr shm; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - ret = -EINVAL; - goto fail_cmd; - } - - ret = msm_audio_ion_import(&dma_buf, - fd, - NULL, - 0, - &paddr, - &pa_len, - &vaddr); - if (ret) { - pr_err("%s: audio ION import failed, rc = %d\n", - __func__, ret); - ret = -ENOMEM; - goto fail_cmd; - } - /* get payload length */ - sz = sizeof(struct avs_rtic_shared_mem_addr); - q6asm_add_hdr_async(ac, &shm.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - shm.shm_buf_addr_lsw = lower_32_bits(paddr); - shm.shm_buf_addr_msw = msm_audio_populate_upper_32_bits(paddr); - shm.buf_size = pa_len; - shm.shm_buf_num_regions = 1; - shm.shm_buf_mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - shm.shm_buf_flag = 0x00; - shm.encdec.param_id = AVS_PARAM_ID_RTIC_SHARED_MEMORY_ADDR; - shm.encdec.param_size = sizeof(struct avs_rtic_shared_mem_addr) - - sizeof(struct apr_hdr) - - sizeof(struct asm_stream_cmd_set_encdec_param_v2); - shm.encdec.service_id = OUT; - shm.encdec.reserved = 0; - shm.map_region.shm_addr_lsw = shm.shm_buf_addr_lsw; - shm.map_region.shm_addr_msw = shm.shm_buf_addr_msw; - shm.map_region.mem_size_bytes = pa_len; - shm.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2; - ret = apr_send_pkt(ac->apr, (uint32_t *) &shm); - if (ret < 0) { - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, shm.encdec.param_id, ret); - ret = -EINVAL; - goto fail_cmd; - } - - ret = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout, shm.encdec paramid[0x%x]\n", __func__, - shm.encdec.param_id); - ret = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s] shm.encdec paramid[0x%x]\n", - __func__, - adsp_err_get_err_str(atomic_read(&ac->cmd_state)), - shm.encdec.param_id); - ret = adsp_err_get_lnx_err_code(atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - ret = 0; -fail_cmd: - return ret; -} -EXPORT_SYMBOL(q6asm_send_ion_fd); - -/** - * q6asm_send_rtic_event_ack - - * command to send RTIC event ack - * - * @ac: Audio client handle - * @param: params for event ack - * @params_length: length of params - * - * Returns 0 on success or error on failure - */ -int q6asm_send_rtic_event_ack(struct audio_client *ac, - void *param, uint32_t params_length) -{ - char *asm_params = NULL; - int sz, rc; - struct avs_param_rtic_event_ack ack; - - if (!param || !ac) { - pr_err("%s: %s is NULL\n", __func__, - (!param) ? "param" : "ac"); - rc = -EINVAL; - goto done; - } - - sz = sizeof(struct avs_param_rtic_event_ack) + params_length; - asm_params = kzalloc(sz, GFP_KERNEL); - if (!asm_params) { - rc = -ENOMEM; - goto done; - } - - q6asm_add_hdr_async(ac, &ack.hdr, - sizeof(struct avs_param_rtic_event_ack) + - params_length, TRUE); - atomic_set(&ac->cmd_state, -1); - ack.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2; - ack.encdec.param_id = AVS_PARAM_ID_RTIC_EVENT_ACK; - ack.encdec.param_size = params_length; - ack.encdec.reserved = 0; - ack.encdec.service_id = OUT; - memcpy(asm_params, &ack, sizeof(struct avs_param_rtic_event_ack)); - memcpy(asm_params + sizeof(struct avs_param_rtic_event_ack), - param, params_length); - rc = apr_send_pkt(ac->apr, (uint32_t *) asm_params); - if (rc < 0) { - pr_err("%s: apr pkt failed for rtic event ack\n", __func__); - rc = -EINVAL; - goto fail_send_param; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout for rtic event ack cmd\n", __func__); - rc = -ETIMEDOUT; - goto fail_send_param; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s] for rtic event ack cmd\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_send_param; - } - rc = 0; - -fail_send_param: - kfree(asm_params); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_send_rtic_event_ack); - -/** - * q6asm_set_softpause - - * command to set pause for ASM - * - * @ac: Audio client handle - * @pause_param: params for pause - * - * Returns 0 on success or error on failure - */ -int q6asm_set_softpause(struct audio_client *ac, - struct asm_softpause_params *pause_param) -{ - struct asm_soft_pause_params softpause; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&softpause, 0, sizeof(softpause)); - memset(¶m_info, 0, sizeof(param_info)); - param_info.module_id = ASM_MODULE_ID_VOL_CTRL; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_SOFT_PAUSE_PARAMETERS; - param_info.param_size = sizeof(softpause); - - softpause.enable_flag = pause_param->enable; - softpause.period = pause_param->period; - softpause.step = pause_param->step; - softpause.ramping_curve = pause_param->rampingcurve; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &softpause); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} -EXPORT_SYMBOL(q6asm_set_softpause); - -static int __q6asm_set_softvolume(struct audio_client *ac, - struct asm_softvolume_params *softvol_param, - int instance) -{ - struct asm_soft_step_volume_params softvol; - struct param_hdr_v3 param_info; - int rc = 0; - - memset(&softvol, 0, sizeof(softvol)); - memset(¶m_info, 0, sizeof(param_info)); - - rc = q6asm_set_soft_volume_module_instance_ids(instance, ¶m_info); - if (rc) { - pr_err("%s: Failed to pack soft volume module and instance IDs, error %d\n", - __func__, rc); - return rc; - } - - param_info.param_id = ASM_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS; - param_info.param_size = sizeof(softvol); - - softvol.period = softvol_param->period; - softvol.step = softvol_param->step; - softvol.ramping_curve = softvol_param->rampingcurve; - - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, - (u8 *) &softvol); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - - return rc; -} - -/** - * q6asm_set_softvolume - - * command to set softvolume for ASM - * - * @ac: Audio client handle - * @softvol_param: params for softvol - * - * Returns 0 on success or error on failure - */ -int q6asm_set_softvolume(struct audio_client *ac, - struct asm_softvolume_params *softvol_param) -{ - return __q6asm_set_softvolume(ac, softvol_param, - SOFT_VOLUME_INSTANCE_1); -} -EXPORT_SYMBOL(q6asm_set_softvolume); - -/** - * q6asm_set_softvolume_v2 - - * command to set softvolume V2 for ASM - * - * @ac: Audio client handle - * @softvol_param: params for softvol - * @instance: instance to apply softvol - * - * Returns 0 on success or error on failure - */ -int q6asm_set_softvolume_v2(struct audio_client *ac, - struct asm_softvolume_params *softvol_param, - int instance) -{ - return __q6asm_set_softvolume(ac, softvol_param, instance); -} -EXPORT_SYMBOL(q6asm_set_softvolume_v2); - -/** - * q6asm_equalizer - - * command to set equalizer for ASM - * - * @ac: Audio client handle - * @eq_p: Equalizer params - * - * Returns 0 on success or error on failure - */ -int q6asm_equalizer(struct audio_client *ac, void *eq_p) -{ - struct asm_eq_params eq; - struct msm_audio_eq_stream_config *eq_params = NULL; - struct param_hdr_v3 param_info; - int i = 0; - int rc = 0; - - if (ac == NULL) { - pr_err("%s: Audio client is NULL\n", __func__); - return -EINVAL; - } - if (eq_p == NULL) { - pr_err("%s: [%d]: Invalid Eq param\n", __func__, ac->session); - rc = -EINVAL; - goto fail_cmd; - } - - memset(&eq, 0, sizeof(eq)); - memset(¶m_info, 0, sizeof(param_info)); - eq_params = (struct msm_audio_eq_stream_config *) eq_p; - param_info.module_id = ASM_MODULE_ID_EQUALIZER; - param_info.instance_id = INSTANCE_ID_0; - param_info.param_id = ASM_PARAM_ID_EQUALIZER_PARAMETERS; - param_info.param_size = sizeof(eq); - eq.enable_flag = eq_params->enable; - eq.num_bands = eq_params->num_bands; - - pr_debug("%s: enable:%d numbands:%d\n", __func__, eq_params->enable, - eq_params->num_bands); - for (i = 0; i < eq_params->num_bands; i++) { - eq.eq_bands[i].band_idx = - eq_params->eq_bands[i].band_idx; - eq.eq_bands[i].filterype = - eq_params->eq_bands[i].filter_type; - eq.eq_bands[i].center_freq_hz = - eq_params->eq_bands[i].center_freq_hz; - eq.eq_bands[i].filter_gain = - eq_params->eq_bands[i].filter_gain; - eq.eq_bands[i].q_factor = - eq_params->eq_bands[i].q_factor; - pr_debug("%s: filter_type:%u bandnum:%d\n", __func__, - eq_params->eq_bands[i].filter_type, i); - pr_debug("%s: center_freq_hz:%u bandnum:%d\n", __func__, - eq_params->eq_bands[i].center_freq_hz, i); - pr_debug("%s: filter_gain:%d bandnum:%d\n", __func__, - eq_params->eq_bands[i].filter_gain, i); - pr_debug("%s: q_factor:%d bandnum:%d\n", __func__, - eq_params->eq_bands[i].q_factor, i); - } - rc = q6asm_pack_and_set_pp_param_in_band(ac, param_info, (u8 *) &eq); - if (rc) - pr_err("%s: set-params send failed paramid[0x%x] rc %d\n", - __func__, param_info.param_id, rc); - -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_equalizer); - -static int __q6asm_read(struct audio_client *ac, bool is_custom_len_reqd, - int len) -{ - struct asm_data_cmd_read_v2 read; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - struct audio_buffer *ab; - int dsp_buf; - struct audio_port_data *port; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[OUT]; - - q6asm_add_hdr(ac, &read.hdr, sizeof(read), FALSE); - - mutex_lock(&port->lock); - - dsp_buf = port->dsp_buf; - if (port->buf == NULL) { - pr_err("%s: buf is NULL\n", __func__); - mutex_unlock(&port->lock); - return -EINVAL; - } - ab = &port->buf[dsp_buf]; - - dev_vdbg(ac->dev, "%s: session[%d]dsp-buf[%d][%pK]cpu_buf[%d][%pK]\n", - __func__, - ac->session, - dsp_buf, - port->buf[dsp_buf].data, - port->cpu_buf, - &port->buf[port->cpu_buf].phys); - - read.hdr.opcode = ASM_DATA_CMD_READ_V2; - read.buf_addr_lsw = lower_32_bits(ab->phys); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - - list_for_each_safe(ptr, next, &ac->port[OUT].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == ab->phys) { - read.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - dev_vdbg(ac->dev, "memory_map handle in q6asm_read: [%0x]:", - read.mem_map_handle); - read.buf_size = is_custom_len_reqd ? len : ab->size; - read.seq_id = port->dsp_buf; - q6asm_update_token(&read.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - WAIT_CMD); - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - mutex_unlock(&port->lock); - dev_vdbg(ac->dev, "%s: buf add[%pK] token[0x%x] uid[%d]\n", - __func__, &ab->phys, read.hdr.token, - read.seq_id); - rc = apr_send_pkt(ac->apr, (uint32_t *) &read); - if (rc < 0) { - pr_err("%s: read op[0x%x]rc[%d]\n", - __func__, read.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} - -/** - * q6asm_read - - * command to read buffer data from DSP - * - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_read(struct audio_client *ac) -{ - return __q6asm_read(ac, false/*is_custom_len_reqd*/, 0); -} -EXPORT_SYMBOL(q6asm_read); - - -/** - * q6asm_read_v2 - - * command to read buffer data from DSP - * - * @ac: Audio client handle - * @len: buffer size to read - * - * Returns 0 on success or error on failure - */ -int q6asm_read_v2(struct audio_client *ac, uint32_t len) -{ - return __q6asm_read(ac, true /*is_custom_len_reqd*/, len); -} -EXPORT_SYMBOL(q6asm_read_v2); - -/** - * q6asm_read_nolock - - * command to read buffer data from DSP - * with no wait for ack. - * - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_read_nolock(struct audio_client *ac) -{ - struct asm_data_cmd_read_v2 read; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - struct audio_buffer *ab; - int dsp_buf; - struct audio_port_data *port; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[OUT]; - - q6asm_add_hdr_async(ac, &read.hdr, sizeof(read), FALSE); - - - dsp_buf = port->dsp_buf; - ab = &port->buf[dsp_buf]; - - dev_vdbg(ac->dev, "%s: session[%d]dsp-buf[%d][%pK]cpu_buf[%d][%pK]\n", - __func__, - ac->session, - dsp_buf, - port->buf[dsp_buf].data, - port->cpu_buf, - &port->buf[port->cpu_buf].phys); - - read.hdr.opcode = ASM_DATA_CMD_READ_V2; - read.buf_addr_lsw = lower_32_bits(ab->phys); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - read.buf_size = ab->size; - read.seq_id = port->dsp_buf; - q6asm_update_token(&read.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - WAIT_CMD); - - list_for_each_safe(ptr, next, &ac->port[OUT].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == ab->phys) { - read.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - dev_vdbg(ac->dev, "%s: buf add[%pK] token[0x%x] uid[%d]\n", - __func__, &ab->phys, read.hdr.token, - read.seq_id); - rc = apr_send_pkt(ac->apr, (uint32_t *) &read); - if (rc < 0) { - pr_err("%s: read op[0x%x]rc[%d]\n", - __func__, read.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_read_nolock); - -/** - * q6asm_async_write - - * command to write DSP buffer - * - * @ac: Audio client handle - * @param: params for async write - * - * Returns 0 on success or error on failure - */ -int q6asm_async_write(struct audio_client *ac, - struct audio_aio_write_param *param) -{ - int rc = 0; - struct asm_data_cmd_write_v2 write; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - struct audio_buffer *ab; - struct audio_port_data *port; - phys_addr_t lbuf_phys_addr; - u32 liomode; - u32 io_compressed; - u32 io_compressed_stream; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - q6asm_stream_add_hdr_async( - ac, &write.hdr, sizeof(write), TRUE, ac->stream_id); - port = &ac->port[IN]; - ab = &port->buf[port->dsp_buf]; - - /* Pass session id as token for AIO scheme */ - write.hdr.token = param->uid; - write.hdr.opcode = ASM_DATA_CMD_WRITE_V2; - write.buf_addr_lsw = lower_32_bits(param->paddr); - write.buf_addr_msw = msm_audio_populate_upper_32_bits(param->paddr); - write.buf_size = param->len; - write.timestamp_msw = param->msw_ts; - write.timestamp_lsw = param->lsw_ts; - liomode = (ASYNC_IO_MODE | NT_MODE); - io_compressed = (ASYNC_IO_MODE | COMPRESSED_IO); - io_compressed_stream = (ASYNC_IO_MODE | COMPRESSED_STREAM_IO); - - if (ac->io_mode == liomode) - lbuf_phys_addr = (param->paddr - 32); - else if (ac->io_mode == io_compressed || - ac->io_mode == io_compressed_stream) - lbuf_phys_addr = (param->paddr - param->metadata_len); - else { - if (param->flags & SET_TIMESTAMP) - lbuf_phys_addr = param->paddr - - sizeof(struct snd_codec_metadata); - else - lbuf_phys_addr = param->paddr; - } - dev_vdbg(ac->dev, "%s: token[0x%x], buf_addr[%pK], buf_size[0x%x], ts_msw[0x%x], ts_lsw[0x%x], lbuf_phys_addr: 0x[%pK]\n", - __func__, - write.hdr.token, ¶m->paddr, - write.buf_size, write.timestamp_msw, - write.timestamp_lsw, &lbuf_phys_addr); - - /* Use 0xFF00 for disabling timestamps */ - if (param->flags == 0xFF00) - write.flags = (0x00000000 | (param->flags & 0x800000FF)); - else - write.flags = (0x80000000 | param->flags); - write.flags |= param->last_buffer << ASM_SHIFT_LAST_BUFFER_FLAG; - write.seq_id = param->uid; - list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == lbuf_phys_addr) { - write.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &write); - if (rc < 0) { - pr_err("%s: write op[0x%x]rc[%d]\n", __func__, - write.hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_async_write); - -/** - * q6asm_async_read - - * command to read DSP buffer - * - * @ac: Audio client handle - * @param: params for async read - * - * Returns 0 on success or error on failure - */ -int q6asm_async_read(struct audio_client *ac, - struct audio_aio_read_param *param) -{ - int rc = 0; - struct asm_data_cmd_read_v2 read; - struct asm_buffer_node *buf_node = NULL; - struct list_head *ptr, *next; - phys_addr_t lbuf_phys_addr; - u32 liomode; - u32 io_compressed; - int dir = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - q6asm_add_hdr_async(ac, &read.hdr, sizeof(read), FALSE); - - /* Pass session id as token for AIO scheme */ - read.hdr.token = param->uid; - read.hdr.opcode = ASM_DATA_CMD_READ_V2; - read.buf_addr_lsw = lower_32_bits(param->paddr); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(param->paddr); - read.buf_size = param->len; - read.seq_id = param->uid; - liomode = (NT_MODE | ASYNC_IO_MODE); - io_compressed = (ASYNC_IO_MODE | COMPRESSED_IO); - if (ac->io_mode == liomode) { - lbuf_phys_addr = (param->paddr - 32); - /*legacy wma driver case*/ - dir = IN; - } else if (ac->io_mode == io_compressed) { - lbuf_phys_addr = (param->paddr - 64); - dir = OUT; - } else { - if (param->flags & COMPRESSED_TIMESTAMP_FLAG) - lbuf_phys_addr = param->paddr - - sizeof(struct snd_codec_metadata); - else - lbuf_phys_addr = param->paddr; - dir = OUT; - } - - list_for_each_safe(ptr, next, &ac->port[dir].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_phys_addr == lbuf_phys_addr) { - read.mem_map_handle = buf_node->mmap_hdl; - break; - } - } - - rc = apr_send_pkt(ac->apr, (uint32_t *) &read); - if (rc < 0 && rc != -ENETRESET) { - pr_err_ratelimited("%s: read op[0x%x]rc[%d]\n", __func__, - read.hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_async_read); - -/** - * q6asm_write - - * command to write buffer data to DSP - * - * @ac: Audio client handle - * @len: buffer size - * @msw_ts: upper 32bits of timestamp - * @lsw_ts: lower 32bits of timestamp - * @flags: Flags for timestamp mode - * - * Returns 0 on success or error on failure - */ -int q6asm_write(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags) -{ - int rc = 0; - struct asm_data_cmd_write_v2 write; - struct asm_buffer_node *buf_node = NULL; - struct audio_port_data *port; - struct audio_buffer *ab; - int dsp_buf = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - dev_vdbg(ac->dev, "%s: session[%d] len=%d\n", - __func__, ac->session, len); - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[IN]; - - q6asm_add_hdr(ac, &write.hdr, sizeof(write), - FALSE); - mutex_lock(&port->lock); - - dsp_buf = port->dsp_buf; - ab = &port->buf[dsp_buf]; - - q6asm_update_token(&write.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - write.hdr.opcode = ASM_DATA_CMD_WRITE_V2; - write.buf_addr_lsw = lower_32_bits(ab->phys); - write.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - write.buf_size = len; - write.seq_id = port->dsp_buf; - write.timestamp_lsw = lsw_ts; - write.timestamp_msw = msw_ts; - /* Use 0xFF00 for disabling timestamps */ - if (flags == 0xFF00) - write.flags = (0x00000000 | (flags & 0x800000FF)); - else - write.flags = (0x80000000 | flags); - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - buf_node = list_first_entry(&ac->port[IN].mem_map_handle, - struct asm_buffer_node, - list); - write.mem_map_handle = buf_node->mmap_hdl; - - dev_vdbg(ac->dev, "%s: ab->phys[%pK]bufadd[0x%x] token[0x%x]buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" - , __func__, - &ab->phys, - write.buf_addr_lsw, - write.hdr.token, - write.seq_id, - write.buf_size, - write.mem_map_handle); - mutex_unlock(&port->lock); - - config_debug_fs_write(ab); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &write); - if (rc < 0) { - pr_err("%s: write op[0x%x]rc[%d]\n", - __func__, write.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_write); - -/** - * q6asm_write_nolock - - * command to write buffer data to DSP - * with no wait for ack. - * - * @ac: Audio client handle - * @len: buffer size - * @msw_ts: upper 32bits of timestamp - * @lsw_ts: lower 32bits of timestamp - * @flags: Flags for timestamp mode - * - * Returns 0 on success or error on failure - */ -int q6asm_write_nolock(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags) -{ - int rc = 0; - struct asm_data_cmd_write_v2 write; - struct asm_buffer_node *buf_node = NULL; - struct audio_port_data *port; - struct audio_buffer *ab; - int dsp_buf = 0; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - - dev_vdbg(ac->dev, "%s: session[%d] len=%d\n", - __func__, ac->session, len); - if (ac->io_mode & SYNC_IO_MODE) { - port = &ac->port[IN]; - - q6asm_add_hdr_async(ac, &write.hdr, sizeof(write), - FALSE); - - dsp_buf = port->dsp_buf; - ab = &port->buf[dsp_buf]; - - q6asm_update_token(&write.hdr.token, - 0, /* Session ID is NA */ - 0, /* Stream ID is NA */ - port->dsp_buf, - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - - write.hdr.opcode = ASM_DATA_CMD_WRITE_V2; - write.buf_addr_lsw = lower_32_bits(ab->phys); - write.buf_addr_msw = msm_audio_populate_upper_32_bits(ab->phys); - write.buf_size = len; - write.seq_id = port->dsp_buf; - write.timestamp_lsw = lsw_ts; - write.timestamp_msw = msw_ts; - buf_node = list_first_entry(&ac->port[IN].mem_map_handle, - struct asm_buffer_node, - list); - write.mem_map_handle = buf_node->mmap_hdl; - /* Use 0xFF00 for disabling timestamps */ - if (flags == 0xFF00) - write.flags = (0x00000000 | (flags & 0x800000FF)); - else - write.flags = (0x80000000 | flags); - port->dsp_buf = q6asm_get_next_buf(ac, port->dsp_buf, - port->max_buf_cnt); - - dev_vdbg(ac->dev, "%s: ab->phys[%pK]bufadd[0x%x]token[0x%x] buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" - , __func__, - &ab->phys, - write.buf_addr_lsw, - write.hdr.token, - write.seq_id, - write.buf_size, - write.mem_map_handle); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &write); - if (rc < 0) { - pr_err("%s: write op[0x%x]rc[%d]\n", - __func__, write.hdr.opcode, rc); - goto fail_cmd; - } - return 0; - } -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_write_nolock); - -/** - * q6asm_get_session_time - - * command to retrieve timestamp info - * - * @ac: Audio client handle - * @tstamp: pointer to fill with timestamp info - * - * Returns 0 on success or error on failure - */ -int q6asm_get_session_time(struct audio_client *ac, uint64_t *tstamp) -{ - struct asm_mtmx_strtr_get_params mtmx_params; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - if (tstamp == NULL) { - pr_err("%s: tstamp NULL\n", __func__); - return -EINVAL; - } - - q6asm_add_hdr(ac, &mtmx_params.hdr, sizeof(mtmx_params), TRUE); - mtmx_params.hdr.opcode = ASM_SESSION_CMD_GET_MTMX_STRTR_PARAMS_V2; - mtmx_params.param_info.data_payload_addr_lsw = 0; - mtmx_params.param_info.data_payload_addr_msw = 0; - mtmx_params.param_info.mem_map_handle = 0; - mtmx_params.param_info.direction = (ac->io_mode & TUN_READ_IO_MODE - ? 1 : 0); - mtmx_params.param_info.module_id = - ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - mtmx_params.param_info.param_id = - ASM_SESSION_MTMX_STRTR_PARAM_SESSION_TIME_V3; - mtmx_params.param_info.param_max_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_session_time_v3_t); - atomic_set(&ac->time_flag, 1); - - dev_vdbg(ac->dev, "%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, mtmx_params.hdr.opcode); - rc = apr_send_pkt(ac->apr, (uint32_t *) &mtmx_params); - if (rc < 0) { - dev_err_ratelimited(ac->dev, "%s: Get Session Time failed %d\n", - __func__, rc); - return rc; - } - - rc = wait_event_timeout(ac->time_wait, - (atomic_read(&ac->time_flag) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout in getting session time from DSP\n", - __func__); - goto fail_cmd; - } - - *tstamp = ac->time_stamp; - return 0; - -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_get_session_time); - -/** - * q6asm_get_session_time_legacy - - * command to retrieve timestamp info - * - * @ac: Audio client handle - * @tstamp: pointer to fill with timestamp info - * - * Returns 0 on success or error on failure - */ -int q6asm_get_session_time_legacy(struct audio_client *ac, uint64_t *tstamp) -{ - struct apr_hdr hdr; - int rc; - - if (ac == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - if (tstamp == NULL) { - pr_err("%s: tstamp NULL\n", __func__); - return -EINVAL; - } - - q6asm_add_hdr(ac, &hdr, sizeof(hdr), TRUE); - hdr.opcode = ASM_SESSION_CMD_GET_SESSIONTIME_V3; - atomic_set(&ac->time_flag, 1); - - dev_vdbg(ac->dev, "%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, - hdr.opcode); - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", - __func__, hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(ac->time_wait, - (atomic_read(&ac->time_flag) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout in getting session time from DSP\n", - __func__); - goto fail_cmd; - } - - *tstamp = ac->time_stamp; - return 0; - -fail_cmd: - return -EINVAL; -} -EXPORT_SYMBOL(q6asm_get_session_time_legacy); - -/** - * q6asm_send_mtmx_strtr_window - - * command to send matrix for window params - * - * @ac: Audio client handle - * @window_param: window params - * @param_id: param id for window - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_window(struct audio_client *ac, - struct asm_session_mtmx_strtr_param_window_v2_t *window_param, - uint32_t param_id) -{ - struct asm_mtmx_strtr_params matrix; - int sz = 0; - int rc = 0; - - pr_debug("%s: Window lsw is %d, window msw is %d\n", __func__, - window_param->window_lsw, window_param->window_msw); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = param_id; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t); - matrix.data.reserved = 0; - memcpy(&(matrix.config.window_param), - window_param, - sizeof(struct asm_session_mtmx_strtr_param_window_v2_t)); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: Render window start send failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, Render window start paramid[0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_window); - -/** - * q6asm_send_mtmx_strtr_render_mode - - * command to send matrix for render mode - * - * @ac: Audio client handle - * @render_mode: rendering mode - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_render_mode(struct audio_client *ac, - uint32_t render_mode) -{ - struct asm_mtmx_strtr_params matrix; - struct asm_session_mtmx_strtr_param_render_mode_t render_param; - int sz = 0; - int rc = 0; - - pr_debug("%s: render mode is %d\n", __func__, render_mode); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if ((render_mode != ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT) && - (render_mode != ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC)) { - pr_err("%s: Invalid render mode %d\n", __func__, render_mode); - rc = -EINVAL; - goto exit; - } - - memset(&render_param, 0, - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t)); - render_param.flags = render_mode; - - memset(&matrix, 0, sizeof(struct asm_mtmx_strtr_params)); - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = ASM_SESSION_MTMX_STRTR_PARAM_RENDER_MODE_CMD; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t); - matrix.data.reserved = 0; - memcpy(&(matrix.config.render_param), - &render_param, - sizeof(struct asm_session_mtmx_strtr_param_render_mode_t)); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: Render mode send failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto exit; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, Render mode send paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto exit; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto exit; - } - rc = 0; -exit: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_render_mode); - -/** - * q6asm_send_mtmx_strtr_clk_rec_mode - - * command to send matrix for clock rec - * - * @ac: Audio client handle - * @clk_rec_mode: mode for clock rec - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_clk_rec_mode(struct audio_client *ac, - uint32_t clk_rec_mode) -{ - struct asm_mtmx_strtr_params matrix; - struct asm_session_mtmx_strtr_param_clk_rec_t clk_rec_param; - int sz = 0; - int rc = 0; - - pr_debug("%s: clk rec mode is %d\n", __func__, clk_rec_mode); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if ((clk_rec_mode != ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_NONE) && - (clk_rec_mode != ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_AUTO)) { - pr_err("%s: Invalid clk rec mode %d\n", __func__, clk_rec_mode); - rc = -EINVAL; - goto exit; - } - - memset(&clk_rec_param, 0, - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t)); - clk_rec_param.flags = clk_rec_mode; - - memset(&matrix, 0, sizeof(struct asm_mtmx_strtr_params)); - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_CMD; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t); - matrix.data.reserved = 0; - memcpy(&(matrix.config.clk_rec_param), - &clk_rec_param, - sizeof(struct asm_session_mtmx_strtr_param_clk_rec_t)); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: clk rec mode send failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto exit; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, clk rec mode send paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto exit; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto exit; - } - rc = 0; -exit: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_clk_rec_mode); - -/** - * q6asm_send_mtmx_strtr_enable_adjust_session_clock - - * command to send matrix for adjust time - * - * @ac: Audio client handle - * @enable: flag to adjust time or not - * - * Returns 0 on success or error on failure - */ -int q6asm_send_mtmx_strtr_enable_adjust_session_clock(struct audio_client *ac, - bool enable) -{ - struct asm_mtmx_strtr_params matrix; - struct asm_session_mtmx_param_adjust_session_time_ctl_t adjust_time; - int sz = 0; - int rc = 0; - - pr_debug("%s: adjust session enable %d\n", __func__, enable); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - adjust_time.enable = enable; - memset(&matrix, 0, sizeof(struct asm_mtmx_strtr_params)); - sz = sizeof(struct asm_mtmx_strtr_params); - q6asm_add_hdr(ac, &matrix.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - matrix.hdr.opcode = ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2; - - matrix.param.data_payload_addr_lsw = 0; - matrix.param.data_payload_addr_msw = 0; - matrix.param.mem_map_handle = 0; - matrix.param.data_payload_size = - sizeof(struct param_hdr_v1) + - sizeof(struct asm_session_mtmx_param_adjust_session_time_ctl_t); - matrix.param.direction = 0; /* RX */ - matrix.data.module_id = ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC; - matrix.data.param_id = ASM_SESSION_MTMX_PARAM_ADJUST_SESSION_TIME_CTL; - matrix.data.param_size = - sizeof(struct asm_session_mtmx_param_adjust_session_time_ctl_t); - matrix.data.reserved = 0; - matrix.config.adj_time_param.enable = adjust_time.enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &matrix); - if (rc < 0) { - pr_err("%s: enable adjust session failed failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -EINVAL; - goto exit; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: enable adjust session failed failed paramid [0x%x]\n", - __func__, matrix.data.param_id); - rc = -ETIMEDOUT; - goto exit; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto exit; - } - rc = 0; -exit: - return rc; -} -EXPORT_SYMBOL(q6asm_send_mtmx_strtr_enable_adjust_session_clock); - - -static int __q6asm_cmd(struct audio_client *ac, int cmd, uint32_t stream_id) -{ - struct apr_hdr hdr; - int rc; - atomic_t *state; - int cnt = 0; - - if (!ac) { - pr_err_ratelimited("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - q6asm_stream_add_hdr(ac, &hdr, sizeof(hdr), TRUE, stream_id); - atomic_set(&ac->cmd_state, -1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - WAIT_CMD); - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, hdr.token, stream_id, ac->session); - switch (cmd) { - case CMD_PAUSE: - pr_debug("%s: CMD_PAUSE\n", __func__); - hdr.opcode = ASM_SESSION_CMD_PAUSE; - state = &ac->cmd_state; - break; - case CMD_SUSPEND: - pr_debug("%s: CMD_SUSPEND\n", __func__); - hdr.opcode = ASM_SESSION_CMD_SUSPEND; - state = &ac->cmd_state; - break; - case CMD_FLUSH: - pr_debug("%s: CMD_FLUSH\n", __func__); - hdr.opcode = ASM_STREAM_CMD_FLUSH; - state = &ac->cmd_state; - break; - case CMD_OUT_FLUSH: - pr_debug("%s: CMD_OUT_FLUSH\n", __func__); - hdr.opcode = ASM_STREAM_CMD_FLUSH_READBUFS; - state = &ac->cmd_state; - break; - case CMD_EOS: - pr_debug("%s: CMD_EOS\n", __func__); - hdr.opcode = ASM_DATA_CMD_EOS; - atomic_set(&ac->cmd_state, 0); - state = &ac->cmd_state; - break; - case CMD_CLOSE: - pr_debug("%s: CMD_CLOSE\n", __func__); - hdr.opcode = ASM_STREAM_CMD_CLOSE; - state = &ac->cmd_state; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, cmd); - rc = -EINVAL; - goto fail_cmd; - } - pr_debug("%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, - hdr.opcode); - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", - __func__, hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, (atomic_read(state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for response opcode[0x%x]\n", - __func__, hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(state) > 0) { - pr_err("%s: DSP returned error[%s] opcode %d\n", - __func__, adsp_err_get_err_str( - atomic_read(state)), - hdr.opcode); - rc = adsp_err_get_lnx_err_code(atomic_read(state)); - goto fail_cmd; - } - - if (cmd == CMD_FLUSH) - q6asm_reset_buf_state(ac); - if (cmd == CMD_CLOSE) { - /* check if DSP return all buffers */ - if (ac->port[IN].buf) { - for (cnt = 0; cnt < ac->port[IN].max_buf_cnt; - cnt++) { - if (ac->port[IN].buf[cnt].used == IN) { - dev_vdbg(ac->dev, "Write Buf[%d] not returned\n", - cnt); - } - } - } - if (ac->port[OUT].buf) { - for (cnt = 0; cnt < ac->port[OUT].max_buf_cnt; cnt++) { - if (ac->port[OUT].buf[cnt].used == OUT) { - dev_vdbg(ac->dev, "Read Buf[%d] not returned\n", - cnt); - } - } - } - } - return 0; -fail_cmd: - return rc; -} - -/** - * q6asm_cmd - - * Function used to send commands for - * ASM with wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * - * Returns 0 on success or error on failure - */ -int q6asm_cmd(struct audio_client *ac, int cmd) -{ - return __q6asm_cmd(ac, cmd, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_cmd); - -/** - * q6asm_stream_cmd - - * Function used to send commands for - * ASM stream with wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * @stream_id: Stream ID - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_cmd(struct audio_client *ac, int cmd, uint32_t stream_id) -{ - return __q6asm_cmd(ac, cmd, stream_id); -} -EXPORT_SYMBOL(q6asm_stream_cmd); - -/** - * q6asm_cmd_nowait - - * Function used to send commands for - * ASM stream without wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * @stream_id: Stream ID - * - * Returns 0 on success or error on failure - */ -static int __q6asm_cmd_nowait(struct audio_client *ac, int cmd, - uint32_t stream_id) -{ - struct apr_hdr hdr; - int rc; - - if (!ac) { - pr_err_ratelimited("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - q6asm_stream_add_hdr_async(ac, &hdr, sizeof(hdr), TRUE, stream_id); - atomic_set(&ac->cmd_state, 1); - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, hdr.token, stream_id, ac->session); - switch (cmd) { - case CMD_PAUSE: - pr_debug("%s: CMD_PAUSE\n", __func__); - hdr.opcode = ASM_SESSION_CMD_PAUSE; - break; - case CMD_EOS: - pr_debug("%s: CMD_EOS\n", __func__); - hdr.opcode = ASM_DATA_CMD_EOS; - break; - case CMD_CLOSE: - pr_debug("%s: CMD_CLOSE\n", __func__); - hdr.opcode = ASM_STREAM_CMD_CLOSE; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, cmd); - goto fail_cmd; - } - pr_debug("%s: session[%d]opcode[0x%x]\n", __func__, - ac->session, - hdr.opcode); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", - __func__, hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} - -int q6asm_cmd_nowait(struct audio_client *ac, int cmd) -{ - pr_debug("%s: stream_id: %d\n", __func__, ac->stream_id); - return __q6asm_cmd_nowait(ac, cmd, ac->stream_id); -} -EXPORT_SYMBOL(q6asm_cmd_nowait); - -/** - * q6asm_stream_cmd_nowait - - * Function used to send commands for - * ASM stream without wait for ack. - * - * @ac: Audio client handle - * @cmd: command to send - * @stream_id: Stream ID - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_cmd_nowait(struct audio_client *ac, int cmd, - uint32_t stream_id) -{ - pr_debug("%s: stream_id: %d\n", __func__, stream_id); - return __q6asm_cmd_nowait(ac, cmd, stream_id); -} -EXPORT_SYMBOL(q6asm_stream_cmd_nowait); - -int __q6asm_send_meta_data(struct audio_client *ac, uint32_t stream_id, - uint32_t initial_samples, uint32_t trailing_samples) -{ - struct asm_data_cmd_remove_silence silence; - int rc = 0; - - if (!ac) { - pr_err_ratelimited("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err_ratelimited("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]\n", __func__, ac->session); - q6asm_stream_add_hdr_async(ac, &silence.hdr, sizeof(silence), TRUE, - stream_id); - - /* - * Updated the token field with stream/session for compressed playback - * Platform driver must know the the stream with which the command is - * associated - */ - if (ac->io_mode & COMPRESSED_STREAM_IO) - q6asm_update_token(&silence.hdr.token, - ac->session, - stream_id, - 0, /* Buffer index is NA */ - 0, /* Direction flag is NA */ - NO_WAIT_CMD); - pr_debug("%s: token = 0x%x, stream_id %d, session 0x%x\n", - __func__, silence.hdr.token, stream_id, ac->session); - - silence.hdr.opcode = ASM_DATA_CMD_REMOVE_INITIAL_SILENCE; - silence.num_samples_to_remove = initial_samples; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &silence); - if (rc < 0) { - pr_err("%s: Commmand silence failed[%d]", __func__, rc); - - goto fail_cmd; - } - - silence.hdr.opcode = ASM_DATA_CMD_REMOVE_TRAILING_SILENCE; - silence.num_samples_to_remove = trailing_samples; - - - rc = apr_send_pkt(ac->apr, (uint32_t *) &silence); - if (rc < 0) { - pr_err("%s: Commmand silence failed[%d]", __func__, rc); - goto fail_cmd; - } - - return 0; -fail_cmd: - return -EINVAL; -} - -/** - * q6asm_stream_send_meta_data - - * command to send meta data for stream - * - * @ac: Audio client handle - * @stream_id: Stream ID - * @initial_samples: Initial samples of stream - * @trailing_samples: Trailing samples of stream - * - * Returns 0 on success or error on failure - */ -int q6asm_stream_send_meta_data(struct audio_client *ac, uint32_t stream_id, - uint32_t initial_samples, uint32_t trailing_samples) -{ - return __q6asm_send_meta_data(ac, stream_id, initial_samples, - trailing_samples); -} -EXPORT_SYMBOL(q6asm_stream_send_meta_data); - -int q6asm_send_meta_data(struct audio_client *ac, uint32_t initial_samples, - uint32_t trailing_samples) -{ - return __q6asm_send_meta_data(ac, ac->stream_id, initial_samples, - trailing_samples); -} - -static void q6asm_reset_buf_state(struct audio_client *ac) -{ - int cnt = 0; - int loopcnt = 0; - int used; - struct audio_port_data *port = NULL; - - if (ac->io_mode & SYNC_IO_MODE) { - used = (ac->io_mode & TUN_WRITE_IO_MODE ? 1 : 0); - mutex_lock(&ac->cmd_lock); - for (loopcnt = 0; loopcnt <= OUT; loopcnt++) { - port = &ac->port[loopcnt]; - cnt = port->max_buf_cnt - 1; - port->dsp_buf = 0; - port->cpu_buf = 0; - while (cnt >= 0) { - if (!port->buf) - continue; - port->buf[cnt].used = used; - cnt--; - } - } - mutex_unlock(&ac->cmd_lock); - } -} - -/** - * q6asm_reg_tx_overflow - - * command to register for TX overflow events - * - * @ac: Audio client handle - * @enable: flag to enable or disable events - * - * Returns 0 on success or error on failure - */ -int q6asm_reg_tx_overflow(struct audio_client *ac, uint16_t enable) -{ - struct asm_session_cmd_regx_overflow tx_overflow; - int rc; - - if (!ac) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]enable[%d]\n", __func__, - ac->session, enable); - q6asm_add_hdr(ac, &tx_overflow.hdr, sizeof(tx_overflow), TRUE); - atomic_set(&ac->cmd_state, -1); - - tx_overflow.hdr.opcode = - ASM_SESSION_CMD_REGISTER_FORX_OVERFLOW_EVENTS; - /* tx overflow event: enable */ - tx_overflow.enable_flag = enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &tx_overflow); - if (rc < 0) { - pr_err("%s: tx overflow op[0x%x]rc[%d]\n", - __func__, tx_overflow.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for tx overflow\n", __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - return 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_reg_tx_overflow); - -int q6asm_reg_rx_underflow(struct audio_client *ac, uint16_t enable) -{ - struct asm_session_cmd_rgstr_rx_underflow rx_underflow; - int rc; - - if (!ac) { - pr_err("%s: AC APR handle NULL\n", __func__); - return -EINVAL; - } - if (ac->apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: session[%d]enable[%d]\n", __func__, - ac->session, enable); - q6asm_add_hdr_async(ac, &rx_underflow.hdr, sizeof(rx_underflow), FALSE); - - rx_underflow.hdr.opcode = - ASM_SESSION_CMD_REGISTER_FOR_RX_UNDERFLOW_EVENTS; - /* tx overflow event: enable */ - rx_underflow.enable_flag = enable; - - rc = apr_send_pkt(ac->apr, (uint32_t *) &rx_underflow); - if (rc < 0) { - pr_err("%s: tx overflow op[0x%x]rc[%d]\n", - __func__, rx_underflow.hdr.opcode, rc); - goto fail_cmd; - } - return 0; -fail_cmd: - return -EINVAL; -} - -/** - * q6asm_adjust_session_clock - - * command to adjust session clock - * - * @ac: Audio client handle - * @adjust_time_lsw: lower 32bits - * @adjust_time_msw: upper 32bits - * - * Returns 0 on success or error on failure - */ -int q6asm_adjust_session_clock(struct audio_client *ac, - uint32_t adjust_time_lsw, - uint32_t adjust_time_msw) -{ - int rc = 0; - int sz = 0; - struct asm_session_cmd_adjust_session_clock_v2 adjust_clock; - - pr_debug("%s: adjust_time_lsw is %x, adjust_time_msw is %x\n", __func__, - adjust_time_lsw, adjust_time_msw); - - if (!ac) { - pr_err("%s: audio client handle is NULL\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - if (ac->apr == NULL) { - pr_err("%s: ac->apr is NULL", __func__); - rc = -EINVAL; - goto fail_cmd; - } - - sz = sizeof(struct asm_session_cmd_adjust_session_clock_v2); - q6asm_add_hdr(ac, &adjust_clock.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); - adjust_clock.hdr.opcode = ASM_SESSION_CMD_ADJUST_SESSION_CLOCK_V2; - - adjust_clock.adjustime_lsw = adjust_time_lsw; - adjust_clock.adjustime_msw = adjust_time_msw; - - - rc = apr_send_pkt(ac->apr, (uint32_t *) &adjust_clock); - if (rc < 0) { - pr_err("%s: adjust_clock send failed paramid [0x%x]\n", - __func__, adjust_clock.hdr.opcode); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout, adjust_clock paramid[0x%x]\n", - __func__, adjust_clock.hdr.opcode); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - return rc; -} -EXPORT_SYMBOL(q6asm_adjust_session_clock); - -/* - * q6asm_get_path_delay() - get the path delay for an audio session - * @ac: audio client handle - * - * Retrieves the current audio DSP path delay for the given audio session. - * - * Return: 0 on success, error code otherwise - */ -int q6asm_get_path_delay(struct audio_client *ac) -{ - int rc = 0; - struct apr_hdr hdr; - - if (!ac || ac->apr == NULL) { - pr_err("%s: invalid audio client\n", __func__); - return -EINVAL; - } - - hdr.opcode = ASM_SESSION_CMD_GET_PATH_DELAY_V2; - q6asm_add_hdr(ac, &hdr, sizeof(hdr), TRUE); - atomic_set(&ac->cmd_state, -1); - - rc = apr_send_pkt(ac->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Commmand 0x%x failed %d\n", __func__, - hdr.opcode, rc); - return rc; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("%s: timeout. waited for response opcode[0x%x]\n", - __func__, hdr.opcode); - return -ETIMEDOUT; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - return rc; - } - - return 0; -} -EXPORT_SYMBOL(q6asm_get_path_delay); - -int q6asm_get_apr_service_id(int session_id) -{ - pr_debug("%s:\n", __func__); - - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: invalid session_id = %d\n", __func__, session_id); - return -EINVAL; - } - - return ((struct apr_svc *)(session[session_id].ac)->apr)->id; -} - -int q6asm_get_asm_topology(int session_id) -{ - int topology = -EINVAL; - - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: invalid session_id = %d\n", __func__, session_id); - goto done; - } - if (session[session_id].ac == NULL) { - pr_err("%s: session not created for session id = %d\n", - __func__, session_id); - goto done; - } - topology = (session[session_id].ac)->topology; -done: - return topology; -} - -int q6asm_get_asm_app_type(int session_id) -{ - int app_type = -EINVAL; - - if (session_id <= 0 || session_id > ASM_ACTIVE_STREAMS_ALLOWED) { - pr_err("%s: invalid session_id = %d\n", __func__, session_id); - goto done; - } - if (session[session_id].ac == NULL) { - pr_err("%s: session not created for session id = %d\n", - __func__, session_id); - goto done; - } - app_type = (session[session_id].ac)->app_type; -done: - return app_type; -} - -/* - * Retrieving cal_block will mark cal_block as stale. - * Hence it cannot be reused or resent unless the flag - * is reset. - */ -static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info) -{ - struct cal_block_data *cal_block = NULL; - - cal_info->topology_id = DEFAULT_POPP_TOPOLOGY; - cal_info->app_type = DEFAULT_APP_TYPE; - - if (cal_data[ASM_TOPOLOGY_CAL] == NULL) - goto done; - - mutex_lock(&cal_data[ASM_TOPOLOGY_CAL]->lock); - cal_block = cal_utils_get_only_cal_block(cal_data[ASM_TOPOLOGY_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) - goto unlock; - cal_info->topology_id = ((struct audio_cal_info_asm_top *) - cal_block->cal_info)->topology; - cal_info->app_type = ((struct audio_cal_info_asm_top *) - cal_block->cal_info)->app_type; - - cal_utils_mark_cal_used(cal_block); - -unlock: - mutex_unlock(&cal_data[ASM_TOPOLOGY_CAL]->lock); -done: - pr_debug("%s: Using topology %d app_type %d\n", __func__, - cal_info->topology_id, cal_info->app_type); - - return 0; -} - -/** - * q6asm_send_cal - - * command to send ASM calibration - * - * @ac: Audio client handle - * - * Returns 0 on success or error on failure - */ -int q6asm_send_cal(struct audio_client *ac) -{ - struct cal_block_data *cal_block = NULL; - struct mem_mapping_hdr mem_hdr; - u32 payload_size = 0; - int rc = -EINVAL; - pr_debug("%s:\n", __func__); - - if (!ac) { - pr_err("%s: Audio client is NULL\n", __func__); - return -EINVAL; - } - if (ac->io_mode & NT_MODE) { - pr_debug("%s: called for NT MODE, exiting\n", __func__); - goto done; - } - - if (cal_data[ASM_AUDSTRM_CAL] == NULL) - goto done; - - if (ac->perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) { - rc = 0; /* no cal is required, not error case */ - goto done; - } - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - mutex_lock(&cal_data[ASM_AUDSTRM_CAL]->lock); - cal_block = cal_utils_get_only_cal_block(cal_data[ASM_AUDSTRM_CAL]); - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL\n", - __func__); - goto unlock; - } - - if (cal_utils_is_cal_stale(cal_block)) { - rc = 0; /* not error case */ - pr_debug("%s: cal_block is stale\n", - __func__); - goto unlock; - } - - if (cal_block->cal_data.size == 0) { - rc = 0; /* not error case */ - pr_debug("%s: cal_data.size is 0, don't send cal data\n", - __func__); - goto unlock; - } - - rc = remap_cal_data(ASM_AUDSTRM_CAL_TYPE, cal_block); - if (rc) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, ASM_AUDSTRM_CAL); - goto unlock; - } - - mem_hdr.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - mem_hdr.mem_map_handle = cal_block->map_data.q6map_handle; - payload_size = cal_block->cal_data.size; - - pr_debug("%s: phyaddr lsw = %x msw = %x, maphdl = %x calsize = %d\n", - __func__, mem_hdr.data_payload_addr_lsw, - mem_hdr.data_payload_addr_msw, mem_hdr.mem_map_handle, - payload_size); - - rc = q6asm_set_pp_params(ac, &mem_hdr, NULL, payload_size); - if (rc) { - pr_err("%s: audio audstrm cal send failed\n", __func__); - goto unlock; - } - - if (cal_block) - cal_utils_mark_cal_used(cal_block); - rc = 0; - -unlock: - mutex_unlock(&cal_data[ASM_AUDSTRM_CAL]->lock); -done: - return rc; -} -EXPORT_SYMBOL(q6asm_send_cal); - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case ASM_TOPOLOGY_CAL_TYPE: - ret = ASM_TOPOLOGY_CAL; - break; - case ASM_CUST_TOPOLOGY_CAL_TYPE: - ret = ASM_CUSTOM_TOP_CAL; - break; - case ASM_AUDSTRM_CAL_TYPE: - ret = ASM_AUDSTRM_CAL; - break; - case ASM_RTAC_APR_CAL_TYPE: - ret = ASM_RTAC_APR_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int q6asm_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6asm_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6asm_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == ASM_CUSTOM_TOP_CAL) { - mutex_lock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - set_custom_topology = 1; - mutex_unlock(&cal_data[ASM_CUSTOM_TOP_CAL]->lock); - } -done: - return ret; -} - -static void q6asm_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - cal_utils_destroy_cal_types(ASM_MAX_CAL_TYPES, cal_data); -} - -static int q6asm_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{ASM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - q6asm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{ASM_CUST_TOPOLOGY_CAL_TYPE, - {q6asm_alloc_cal, q6asm_dealloc_cal, NULL, - q6asm_set_cal, NULL, NULL} }, - {NULL, q6asm_unmap_cal_memory, cal_utils_match_buf_num} }, - - {{ASM_AUDSTRM_CAL_TYPE, - {q6asm_alloc_cal, q6asm_dealloc_cal, NULL, - q6asm_set_cal, NULL, NULL} }, - {NULL, q6asm_unmap_cal_memory, cal_utils_match_buf_num} }, - - {{ASM_RTAC_APR_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} } - }; - pr_debug("%s\n", __func__); - - ret = cal_utils_create_cal_types(ASM_MAX_CAL_TYPES, cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type! %d\n", - __func__, ret); - ret = -EINVAL; - goto err; - } - - return ret; -err: - q6asm_delete_cal_data(); - return ret; -} - -static int q6asm_is_valid_session(struct apr_client_data *data, void *priv) -{ - struct audio_client *ac = (struct audio_client *)priv; - union asm_token_struct asm_token; - - asm_token.token = data->token; - if (asm_token._token.session_id != ac->session) { - pr_err("%s: Invalid session[%d] rxed expected[%d]", - __func__, asm_token._token.session_id, ac->session); - return -EINVAL; - } - return 0; -} - -int __init q6asm_init(void) -{ - int lcnt, ret; - - pr_debug("%s:\n", __func__); - - memset(session, 0, sizeof(struct audio_session) * - (ASM_ACTIVE_STREAMS_ALLOWED + 1)); - for (lcnt = 0; lcnt <= ASM_ACTIVE_STREAMS_ALLOWED; lcnt++) { - spin_lock_init(&(session[lcnt].session_lock)); - mutex_init(&(session[lcnt].mutex_lock_per_session)); - } - set_custom_topology = 1; - - /*setup common client used for cal mem map */ - common_client.session = ASM_CONTROL_SESSION; - common_client.port[0].buf = &common_buf[0]; - common_client.port[1].buf = &common_buf[1]; - init_waitqueue_head(&common_client.cmd_wait); - init_waitqueue_head(&common_client.time_wait); - init_waitqueue_head(&common_client.mem_wait); - atomic_set(&common_client.time_flag, 1); - INIT_LIST_HEAD(&common_client.port[0].mem_map_handle); - INIT_LIST_HEAD(&common_client.port[1].mem_map_handle); - mutex_init(&common_client.cmd_lock); - for (lcnt = 0; lcnt <= OUT; lcnt++) { - mutex_init(&common_client.port[lcnt].lock); - spin_lock_init(&common_client.port[lcnt].dsp_lock); - } - atomic_set(&common_client.cmd_state, 0); - atomic_set(&common_client.mem_state, 0); - - ret = q6asm_init_cal_data(); - if (ret) - pr_err("%s: could not init cal data! ret %d\n", - __func__, ret); - - config_debug_fs_init(); - - return 0; -} - -void q6asm_exit(void) -{ - q6asm_delete_cal_data(); -} diff --git a/techpack/audio/dsp/q6audio-v2.c b/techpack/audio/dsp/q6audio-v2.c deleted file mode 100644 index cc2bfeca6c63..000000000000 --- a/techpack/audio/dsp/q6audio-v2.c +++ /dev/null @@ -1,1110 +0,0 @@ -/* Copyright (c) 2012-2018, 2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -int q6audio_get_port_index(u16 port_id) -{ - switch (port_id) { - case PRIMARY_I2S_RX: return IDX_PRIMARY_I2S_RX; - case PRIMARY_I2S_TX: return IDX_PRIMARY_I2S_TX; - case AFE_PORT_ID_PRIMARY_PCM_RX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_RX; - case AFE_PORT_ID_PRIMARY_PCM_TX: - return IDX_AFE_PORT_ID_PRIMARY_PCM_TX; - case AFE_PORT_ID_SECONDARY_PCM_RX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_RX; - case AFE_PORT_ID_SECONDARY_PCM_TX: - return IDX_AFE_PORT_ID_SECONDARY_PCM_TX; - case AFE_PORT_ID_TERTIARY_PCM_RX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_RX; - case AFE_PORT_ID_TERTIARY_PCM_TX: - return IDX_AFE_PORT_ID_TERTIARY_PCM_TX; - case AFE_PORT_ID_QUATERNARY_PCM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_RX; - case AFE_PORT_ID_QUATERNARY_PCM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_PCM_TX; - case AFE_PORT_ID_QUINARY_PCM_RX: - return IDX_AFE_PORT_ID_QUINARY_PCM_RX; - case AFE_PORT_ID_QUINARY_PCM_TX: - return IDX_AFE_PORT_ID_QUINARY_PCM_TX; - case AFE_PORT_ID_SENARY_PCM_RX: - return IDX_AFE_PORT_ID_SENARY_PCM_RX; - case AFE_PORT_ID_SENARY_PCM_TX: - return IDX_AFE_PORT_ID_SENARY_PCM_TX; - case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX; - case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX; - case MI2S_RX: return IDX_MI2S_RX; - case MI2S_TX: return IDX_MI2S_TX; - case HDMI_RX: return IDX_HDMI_RX; - case DISPLAY_PORT_RX: return IDX_DISPLAY_PORT_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: return IDX_PRIMARY_SPDIF_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: return IDX_PRIMARY_SPDIF_TX; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: return IDX_SECONDARY_SPDIF_RX; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: return IDX_SECONDARY_SPDIF_TX; - case RSVD_2: return IDX_RSVD_2; - case RSVD_3: return IDX_RSVD_3; - case DIGI_MIC_TX: return IDX_DIGI_MIC_TX; - case VOICE_RECORD_RX: return IDX_VOICE_RECORD_RX; - case VOICE_RECORD_TX: return IDX_VOICE_RECORD_TX; - case VOICE_PLAYBACK_TX: return IDX_VOICE_PLAYBACK_TX; - case VOICE2_PLAYBACK_TX: return IDX_VOICE2_PLAYBACK_TX; - case SLIMBUS_0_RX: return IDX_SLIMBUS_0_RX; - case SLIMBUS_0_TX: return IDX_SLIMBUS_0_TX; - case SLIMBUS_1_RX: return IDX_SLIMBUS_1_RX; - case SLIMBUS_1_TX: return IDX_SLIMBUS_1_TX; - case SLIMBUS_2_RX: return IDX_SLIMBUS_2_RX; - case SLIMBUS_2_TX: return IDX_SLIMBUS_2_TX; - case SLIMBUS_3_RX: return IDX_SLIMBUS_3_RX; - case SLIMBUS_3_TX: return IDX_SLIMBUS_3_TX; - case SLIMBUS_4_RX: return IDX_SLIMBUS_4_RX; - case SLIMBUS_4_TX: return IDX_SLIMBUS_4_TX; - case SLIMBUS_5_RX: return IDX_SLIMBUS_5_RX; - case SLIMBUS_5_TX: return IDX_SLIMBUS_5_TX; - case SLIMBUS_6_RX: return IDX_SLIMBUS_6_RX; - case SLIMBUS_6_TX: return IDX_SLIMBUS_6_TX; - case SLIMBUS_7_RX: return IDX_SLIMBUS_7_RX; - case SLIMBUS_7_TX: return IDX_SLIMBUS_7_TX; - case SLIMBUS_8_RX: return IDX_SLIMBUS_8_RX; - case SLIMBUS_8_TX: return IDX_SLIMBUS_8_TX; - case SLIMBUS_9_RX: return IDX_SLIMBUS_9_RX; - case SLIMBUS_9_TX: return IDX_SLIMBUS_9_TX; - case INT_BT_SCO_RX: return IDX_INT_BT_SCO_RX; - case INT_BT_SCO_TX: return IDX_INT_BT_SCO_TX; - case INT_BT_A2DP_RX: return IDX_INT_BT_A2DP_RX; - case INT_FM_RX: return IDX_INT_FM_RX; - case INT_FM_TX: return IDX_INT_FM_TX; - case RT_PROXY_PORT_001_RX: return IDX_RT_PROXY_PORT_001_RX; - case RT_PROXY_PORT_001_TX: return IDX_RT_PROXY_PORT_001_TX; - case AFE_PORT_ID_PRIMARY_MI2S_RX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_RX; - case AFE_PORT_ID_PRIMARY_MI2S_TX: - return IDX_AFE_PORT_ID_PRIMARY_MI2S_TX; - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX; - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_TX: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX; - case AFE_PORT_ID_TERTIARY_MI2S_RX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX; - case AFE_PORT_ID_TERTIARY_MI2S_TX: - return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX; - case AFE_PORT_ID_QUINARY_MI2S_RX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_RX; - case AFE_PORT_ID_QUINARY_MI2S_TX: - return IDX_AFE_PORT_ID_QUINARY_MI2S_TX; - case AUDIO_PORT_ID_I2S_RX: - return IDX_AUDIO_PORT_ID_I2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - case AFE_PORT_ID_PRIMARY_TDM_RX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_0; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_0; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return IDX_AFE_PORT_ID_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_0; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_0; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return IDX_AFE_PORT_ID_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_0; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_0; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return IDX_AFE_PORT_ID_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_0; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_0; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_0; - case AFE_PORT_ID_QUINARY_TDM_TX: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_0; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_MI2S_TX: - return IDX_AFE_PORT_ID_SENARY_MI2S_TX; - case AFE_PORT_ID_USB_RX: - return IDX_AFE_PORT_ID_USB_RX; - case AFE_PORT_ID_USB_TX: - return IDX_AFE_PORT_ID_USB_TX; - case AFE_PORT_ID_INT0_MI2S_RX: - return IDX_AFE_PORT_ID_INT0_MI2S_RX; - case AFE_PORT_ID_INT0_MI2S_TX: - return IDX_AFE_PORT_ID_INT0_MI2S_TX; - case AFE_PORT_ID_INT1_MI2S_RX: - return IDX_AFE_PORT_ID_INT1_MI2S_RX; - case AFE_PORT_ID_INT1_MI2S_TX: - return IDX_AFE_PORT_ID_INT1_MI2S_TX; - case AFE_PORT_ID_INT2_MI2S_RX: - return IDX_AFE_PORT_ID_INT2_MI2S_RX; - case AFE_PORT_ID_INT2_MI2S_TX: - return IDX_AFE_PORT_ID_INT2_MI2S_TX; - case AFE_PORT_ID_INT3_MI2S_RX: - return IDX_AFE_PORT_ID_INT3_MI2S_RX; - case AFE_PORT_ID_INT3_MI2S_TX: - return IDX_AFE_PORT_ID_INT3_MI2S_TX; - case AFE_PORT_ID_INT4_MI2S_RX: - return IDX_AFE_PORT_ID_INT4_MI2S_RX; - case AFE_PORT_ID_INT4_MI2S_TX: - return IDX_AFE_PORT_ID_INT4_MI2S_TX; - case AFE_PORT_ID_INT5_MI2S_RX: - return IDX_AFE_PORT_ID_INT5_MI2S_RX; - case AFE_PORT_ID_INT5_MI2S_TX: - return IDX_AFE_PORT_ID_INT5_MI2S_TX; - case AFE_PORT_ID_INT6_MI2S_RX: - return IDX_AFE_PORT_ID_INT6_MI2S_RX; - case AFE_PORT_ID_INT6_MI2S_TX: - return IDX_AFE_PORT_ID_INT6_MI2S_TX; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_0; - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_0; - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_0; - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_1; - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_2; - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_3; - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_3; - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_4; - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_4; - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_5; - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - return IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5; - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6; - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7; - case AFE_PORT_ID_PSEUDOPORT_01: - return IDX_AFE_PORT_ID_PSEUDOPORT_01; - case RT_PROXY_PORT_002_RX: - return IDX_RT_PROXY_PORT_002_RX; - case RT_PROXY_PORT_002_TX: - return IDX_RT_PROXY_PORT_002_TX; - default: return -EINVAL; - } -} - -int q6audio_get_port_id(u16 port_id) -{ - switch (port_id) { - case PRIMARY_I2S_RX: return PRIMARY_I2S_RX; - case PRIMARY_I2S_TX: return PRIMARY_I2S_TX; - case AFE_PORT_ID_PRIMARY_PCM_RX: - return AFE_PORT_ID_PRIMARY_PCM_RX; - case AFE_PORT_ID_PRIMARY_PCM_TX: - return AFE_PORT_ID_PRIMARY_PCM_TX; - case AFE_PORT_ID_SECONDARY_PCM_RX: - return AFE_PORT_ID_SECONDARY_PCM_RX; - case AFE_PORT_ID_SECONDARY_PCM_TX: - return AFE_PORT_ID_SECONDARY_PCM_TX; - case AFE_PORT_ID_TERTIARY_PCM_RX: - return AFE_PORT_ID_TERTIARY_PCM_RX; - case AFE_PORT_ID_TERTIARY_PCM_TX: - return AFE_PORT_ID_TERTIARY_PCM_TX; - case AFE_PORT_ID_QUATERNARY_PCM_RX: - return AFE_PORT_ID_QUATERNARY_PCM_RX; - case AFE_PORT_ID_QUATERNARY_PCM_TX: - return AFE_PORT_ID_QUATERNARY_PCM_TX; - case AFE_PORT_ID_QUINARY_PCM_RX: - return AFE_PORT_ID_QUINARY_PCM_RX; - case AFE_PORT_ID_QUINARY_PCM_TX: - return AFE_PORT_ID_QUINARY_PCM_TX; - case AFE_PORT_ID_SENARY_PCM_RX: - return AFE_PORT_ID_SENARY_PCM_RX; - case AFE_PORT_ID_SENARY_PCM_TX: - return AFE_PORT_ID_SENARY_PCM_TX; - case SECONDARY_I2S_RX: return AFE_PORT_ID_SECONDARY_MI2S_RX; - case SECONDARY_I2S_TX: return AFE_PORT_ID_SECONDARY_MI2S_TX; - case MI2S_RX: return AFE_PORT_ID_PRIMARY_MI2S_RX; - case MI2S_TX: return AFE_PORT_ID_PRIMARY_MI2S_TX; - case HDMI_RX: return AFE_PORT_ID_MULTICHAN_HDMI_RX; - case DISPLAY_PORT_RX: - return AFE_PORT_ID_HDMI_OVER_DP_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - return AFE_PORT_ID_PRIMARY_SPDIF_RX; - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - return AFE_PORT_ID_PRIMARY_SPDIF_TX; - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - return AFE_PORT_ID_SECONDARY_SPDIF_RX; - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - return AFE_PORT_ID_SECONDARY_SPDIF_TX; - case RSVD_2: return IDX_RSVD_2; - case RSVD_3: return IDX_RSVD_3; - case DIGI_MIC_TX: return AFE_PORT_ID_DIGITAL_MIC_TX; - case VOICE_RECORD_RX: return AFE_PORT_ID_VOICE_RECORD_RX; - case VOICE_RECORD_TX: return AFE_PORT_ID_VOICE_RECORD_TX; - case VOICE_PLAYBACK_TX: return AFE_PORT_ID_VOICE_PLAYBACK_TX; - case VOICE2_PLAYBACK_TX: return AFE_PORT_ID_VOICE2_PLAYBACK_TX; - case SLIMBUS_0_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX; - case SLIMBUS_0_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX; - case SLIMBUS_1_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX; - case SLIMBUS_1_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX; - case SLIMBUS_2_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX; - case SLIMBUS_2_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX; - case SLIMBUS_3_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX; - case SLIMBUS_3_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX; - case SLIMBUS_4_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX; - case SLIMBUS_4_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX; - case SLIMBUS_5_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX; - case SLIMBUS_5_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; - case SLIMBUS_6_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX; - case SLIMBUS_6_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX; - case SLIMBUS_7_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_RX; - case SLIMBUS_7_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_TX; - case SLIMBUS_8_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_RX; - case SLIMBUS_8_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_TX; - case SLIMBUS_9_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_RX; - case SLIMBUS_9_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_TX; - case INT_BT_SCO_RX: return AFE_PORT_ID_INTERNAL_BT_SCO_RX; - case INT_BT_SCO_TX: return AFE_PORT_ID_INTERNAL_BT_SCO_TX; - case INT_BT_A2DP_RX: return AFE_PORT_ID_INTERNAL_BT_A2DP_RX; - case INT_FM_RX: return AFE_PORT_ID_INTERNAL_FM_RX; - case INT_FM_TX: return AFE_PORT_ID_INTERNAL_FM_TX; - case RT_PROXY_PORT_001_RX: return AFE_PORT_ID_RT_PROXY_PORT_001_RX; - case RT_PROXY_PORT_001_TX: return AFE_PORT_ID_RT_PROXY_PORT_001_TX; - case AFE_PORT_ID_PRIMARY_MI2S_RX: - return AFE_PORT_ID_PRIMARY_MI2S_RX; - case AFE_PORT_ID_PRIMARY_MI2S_TX: - return AFE_PORT_ID_PRIMARY_MI2S_TX; - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - return AFE_PORT_ID_QUATERNARY_MI2S_RX; - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - return AFE_PORT_ID_QUATERNARY_MI2S_TX; - case AFE_PORT_ID_SECONDARY_MI2S_RX: - return AFE_PORT_ID_SECONDARY_MI2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_TX: - return AFE_PORT_ID_SECONDARY_MI2S_TX; - case AFE_PORT_ID_TERTIARY_MI2S_RX: - return AFE_PORT_ID_TERTIARY_MI2S_RX; - case AFE_PORT_ID_TERTIARY_MI2S_TX: - return AFE_PORT_ID_TERTIARY_MI2S_TX; - case AFE_PORT_ID_QUINARY_MI2S_RX: - return AFE_PORT_ID_QUINARY_MI2S_RX; - case AFE_PORT_ID_QUINARY_MI2S_TX: - return AFE_PORT_ID_QUINARY_MI2S_TX; - case AUDIO_PORT_ID_I2S_RX: - return AUDIO_PORT_ID_I2S_RX; - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - return AFE_PORT_ID_SECONDARY_MI2S_RX_SD1; - case AFE_PORT_ID_PRIMARY_TDM_RX: - return AFE_PORT_ID_PRIMARY_TDM_RX; - case AFE_PORT_ID_PRIMARY_TDM_TX: - return AFE_PORT_ID_PRIMARY_TDM_TX; - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - return AFE_PORT_ID_PRIMARY_TDM_RX_1; - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - return AFE_PORT_ID_PRIMARY_TDM_TX_1; - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - return AFE_PORT_ID_PRIMARY_TDM_RX_2; - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - return AFE_PORT_ID_PRIMARY_TDM_TX_2; - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - return AFE_PORT_ID_PRIMARY_TDM_RX_3; - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - return AFE_PORT_ID_PRIMARY_TDM_TX_3; - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - return AFE_PORT_ID_PRIMARY_TDM_RX_4; - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - return AFE_PORT_ID_PRIMARY_TDM_TX_4; - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - return AFE_PORT_ID_PRIMARY_TDM_RX_5; - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - return AFE_PORT_ID_PRIMARY_TDM_TX_5; - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - return AFE_PORT_ID_PRIMARY_TDM_RX_6; - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - return AFE_PORT_ID_PRIMARY_TDM_TX_6; - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - return AFE_PORT_ID_PRIMARY_TDM_RX_7; - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - return AFE_PORT_ID_PRIMARY_TDM_TX_7; - case AFE_PORT_ID_SECONDARY_TDM_RX: - return AFE_PORT_ID_SECONDARY_TDM_RX; - case AFE_PORT_ID_SECONDARY_TDM_TX: - return AFE_PORT_ID_SECONDARY_TDM_TX; - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - return AFE_PORT_ID_SECONDARY_TDM_RX_1; - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - return AFE_PORT_ID_SECONDARY_TDM_TX_1; - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - return AFE_PORT_ID_SECONDARY_TDM_RX_2; - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - return AFE_PORT_ID_SECONDARY_TDM_TX_2; - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - return AFE_PORT_ID_SECONDARY_TDM_RX_3; - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - return AFE_PORT_ID_SECONDARY_TDM_TX_3; - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - return AFE_PORT_ID_SECONDARY_TDM_RX_4; - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - return AFE_PORT_ID_SECONDARY_TDM_TX_4; - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - return AFE_PORT_ID_SECONDARY_TDM_RX_5; - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - return AFE_PORT_ID_SECONDARY_TDM_TX_5; - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - return AFE_PORT_ID_SECONDARY_TDM_RX_6; - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - return AFE_PORT_ID_SECONDARY_TDM_TX_6; - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - return AFE_PORT_ID_SECONDARY_TDM_RX_7; - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - return AFE_PORT_ID_SECONDARY_TDM_TX_7; - case AFE_PORT_ID_TERTIARY_TDM_RX: - return AFE_PORT_ID_TERTIARY_TDM_RX; - case AFE_PORT_ID_TERTIARY_TDM_TX: - return AFE_PORT_ID_TERTIARY_TDM_TX; - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - return AFE_PORT_ID_TERTIARY_TDM_RX_1; - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - return AFE_PORT_ID_TERTIARY_TDM_TX_1; - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - return AFE_PORT_ID_TERTIARY_TDM_RX_2; - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - return AFE_PORT_ID_TERTIARY_TDM_TX_2; - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - return AFE_PORT_ID_TERTIARY_TDM_RX_3; - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - return AFE_PORT_ID_TERTIARY_TDM_TX_3; - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - return AFE_PORT_ID_TERTIARY_TDM_RX_4; - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - return AFE_PORT_ID_TERTIARY_TDM_TX_4; - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - return AFE_PORT_ID_TERTIARY_TDM_RX_5; - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - return AFE_PORT_ID_TERTIARY_TDM_TX_5; - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - return AFE_PORT_ID_TERTIARY_TDM_RX_6; - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - return AFE_PORT_ID_TERTIARY_TDM_TX_6; - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - return AFE_PORT_ID_TERTIARY_TDM_RX_7; - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - return AFE_PORT_ID_TERTIARY_TDM_TX_7; - case AFE_PORT_ID_QUATERNARY_TDM_RX: - return AFE_PORT_ID_QUATERNARY_TDM_RX; - case AFE_PORT_ID_QUATERNARY_TDM_TX: - return AFE_PORT_ID_QUATERNARY_TDM_TX; - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - return AFE_PORT_ID_QUATERNARY_TDM_RX_1; - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - return AFE_PORT_ID_QUATERNARY_TDM_TX_1; - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - return AFE_PORT_ID_QUATERNARY_TDM_RX_2; - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - return AFE_PORT_ID_QUATERNARY_TDM_TX_2; - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - return AFE_PORT_ID_QUATERNARY_TDM_RX_3; - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - return AFE_PORT_ID_QUATERNARY_TDM_TX_3; - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - return AFE_PORT_ID_QUATERNARY_TDM_RX_4; - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - return AFE_PORT_ID_QUATERNARY_TDM_TX_4; - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - return AFE_PORT_ID_QUATERNARY_TDM_RX_5; - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - return AFE_PORT_ID_QUATERNARY_TDM_TX_5; - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - return AFE_PORT_ID_QUATERNARY_TDM_RX_6; - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - return AFE_PORT_ID_QUATERNARY_TDM_TX_6; - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - return AFE_PORT_ID_QUATERNARY_TDM_RX_7; - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - return AFE_PORT_ID_QUATERNARY_TDM_TX_7; - case AFE_PORT_ID_QUINARY_TDM_RX: - return AFE_PORT_ID_QUINARY_TDM_RX; - case AFE_PORT_ID_QUINARY_TDM_TX: - return AFE_PORT_ID_QUINARY_TDM_TX; - case AFE_PORT_ID_QUINARY_TDM_RX_1: - return AFE_PORT_ID_QUINARY_TDM_RX_1; - case AFE_PORT_ID_QUINARY_TDM_TX_1: - return AFE_PORT_ID_QUINARY_TDM_TX_1; - case AFE_PORT_ID_QUINARY_TDM_RX_2: - return AFE_PORT_ID_QUINARY_TDM_RX_2; - case AFE_PORT_ID_QUINARY_TDM_TX_2: - return AFE_PORT_ID_QUINARY_TDM_TX_2; - case AFE_PORT_ID_QUINARY_TDM_RX_3: - return AFE_PORT_ID_QUINARY_TDM_RX_3; - case AFE_PORT_ID_QUINARY_TDM_TX_3: - return AFE_PORT_ID_QUINARY_TDM_TX_3; - case AFE_PORT_ID_QUINARY_TDM_RX_4: - return AFE_PORT_ID_QUINARY_TDM_RX_4; - case AFE_PORT_ID_QUINARY_TDM_TX_4: - return AFE_PORT_ID_QUINARY_TDM_TX_4; - case AFE_PORT_ID_QUINARY_TDM_RX_5: - return AFE_PORT_ID_QUINARY_TDM_RX_5; - case AFE_PORT_ID_QUINARY_TDM_TX_5: - return AFE_PORT_ID_QUINARY_TDM_TX_5; - case AFE_PORT_ID_QUINARY_TDM_RX_6: - return AFE_PORT_ID_QUINARY_TDM_RX_6; - case AFE_PORT_ID_QUINARY_TDM_TX_6: - return AFE_PORT_ID_QUINARY_TDM_TX_6; - case AFE_PORT_ID_QUINARY_TDM_RX_7: - return AFE_PORT_ID_QUINARY_TDM_RX_7; - case AFE_PORT_ID_QUINARY_TDM_TX_7: - return AFE_PORT_ID_QUINARY_TDM_TX_7; - case AFE_PORT_ID_SENARY_MI2S_TX: - return AFE_PORT_ID_SENARY_MI2S_TX; - case AFE_PORT_ID_USB_RX: - return AFE_PORT_ID_USB_RX; - case AFE_PORT_ID_USB_TX: - return AFE_PORT_ID_USB_TX; - case AFE_PORT_ID_INT0_MI2S_RX: - return AFE_PORT_ID_INT0_MI2S_RX; - case AFE_PORT_ID_INT0_MI2S_TX: - return AFE_PORT_ID_INT0_MI2S_TX; - case AFE_PORT_ID_INT1_MI2S_RX: - return AFE_PORT_ID_INT1_MI2S_RX; - case AFE_PORT_ID_INT1_MI2S_TX: - return AFE_PORT_ID_INT1_MI2S_TX; - case AFE_PORT_ID_INT2_MI2S_RX: - return AFE_PORT_ID_INT2_MI2S_RX; - case AFE_PORT_ID_INT2_MI2S_TX: - return AFE_PORT_ID_INT2_MI2S_TX; - case AFE_PORT_ID_INT3_MI2S_RX: - return AFE_PORT_ID_INT3_MI2S_RX; - case AFE_PORT_ID_INT3_MI2S_TX: - return AFE_PORT_ID_INT3_MI2S_TX; - case AFE_PORT_ID_INT4_MI2S_RX: - return AFE_PORT_ID_INT4_MI2S_RX; - case AFE_PORT_ID_INT4_MI2S_TX: - return AFE_PORT_ID_INT4_MI2S_TX; - case AFE_PORT_ID_INT5_MI2S_RX: - return AFE_PORT_ID_INT5_MI2S_RX; - case AFE_PORT_ID_INT5_MI2S_TX: - return AFE_PORT_ID_INT5_MI2S_TX; - case AFE_PORT_ID_INT6_MI2S_RX: - return AFE_PORT_ID_INT6_MI2S_RX; - case AFE_PORT_ID_INT6_MI2S_TX: - return AFE_PORT_ID_INT6_MI2S_TX; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - return AFE_PORT_ID_WSA_CODEC_DMA_RX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - return AFE_PORT_ID_WSA_CODEC_DMA_TX_0; - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - return AFE_PORT_ID_WSA_CODEC_DMA_RX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - return AFE_PORT_ID_WSA_CODEC_DMA_TX_1; - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - return AFE_PORT_ID_WSA_CODEC_DMA_TX_2; - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - return AFE_PORT_ID_VA_CODEC_DMA_TX_0; - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - return AFE_PORT_ID_VA_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - return AFE_PORT_ID_RX_CODEC_DMA_RX_0; - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - return AFE_PORT_ID_TX_CODEC_DMA_TX_0; - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - return AFE_PORT_ID_RX_CODEC_DMA_RX_1; - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - return AFE_PORT_ID_TX_CODEC_DMA_TX_1; - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - return AFE_PORT_ID_RX_CODEC_DMA_RX_2; - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - return AFE_PORT_ID_TX_CODEC_DMA_TX_2; - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - return AFE_PORT_ID_RX_CODEC_DMA_RX_3; - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - return AFE_PORT_ID_TX_CODEC_DMA_TX_3; - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - return AFE_PORT_ID_RX_CODEC_DMA_RX_4; - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - return AFE_PORT_ID_TX_CODEC_DMA_TX_4; - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - return AFE_PORT_ID_RX_CODEC_DMA_RX_5; - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - return AFE_PORT_ID_TX_CODEC_DMA_TX_5; - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - return AFE_PORT_ID_RX_CODEC_DMA_RX_6; - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - return AFE_PORT_ID_RX_CODEC_DMA_RX_7; - case RT_PROXY_PORT_002_RX: - return RT_PROXY_PORT_002_RX; - case RT_PROXY_PORT_002_TX: - return RT_PROXY_PORT_002_TX; - default: - pr_warn("%s: Invalid port_id %d\n", __func__, port_id); - return -EINVAL; - } -} -int q6audio_convert_virtual_to_portid(u16 port_id) -{ - int ret; - - /* if port_id is virtual, convert to physical.. - * if port_id is already physical, return physical - */ - if (q6audio_validate_port(port_id) < 0) { - if (port_id == RT_PROXY_DAI_001_RX || - port_id == RT_PROXY_DAI_001_TX || - port_id == RT_PROXY_DAI_002_RX || - port_id == RT_PROXY_DAI_002_TX) - ret = VIRTUAL_ID_TO_PORTID(port_id); - else - ret = -EINVAL; - } else - ret = port_id; - - return ret; -} - -int q6audio_is_digital_pcm_interface(u16 port_id) -{ - int ret = 0; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AUDIO_PORT_ID_I2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_TX: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - break; - default: - ret = -EINVAL; - } - - return ret; -} - -/** - * q6audio_validate_port - - * validates port id - * - * @port_id: port id to validate - * - * Returns 0 on success or error on invalid port - */ -int q6audio_validate_port(u16 port_id) -{ - int ret; - - switch (port_id) { - case PRIMARY_I2S_RX: - case PRIMARY_I2S_TX: - case AFE_PORT_ID_PRIMARY_PCM_RX: - case AFE_PORT_ID_PRIMARY_PCM_TX: - case AFE_PORT_ID_SECONDARY_PCM_RX: - case AFE_PORT_ID_SECONDARY_PCM_TX: - case AFE_PORT_ID_TERTIARY_PCM_RX: - case AFE_PORT_ID_TERTIARY_PCM_TX: - case AFE_PORT_ID_QUATERNARY_PCM_RX: - case AFE_PORT_ID_QUATERNARY_PCM_TX: - case AFE_PORT_ID_QUINARY_PCM_RX: - case AFE_PORT_ID_QUINARY_PCM_TX: - case AFE_PORT_ID_SENARY_PCM_RX: - case AFE_PORT_ID_SENARY_PCM_TX: - case SECONDARY_I2S_RX: - case SECONDARY_I2S_TX: - case MI2S_RX: - case MI2S_TX: - case HDMI_RX: - case DISPLAY_PORT_RX: - case RSVD_2: - case RSVD_3: - case DIGI_MIC_TX: - case VOICE_RECORD_RX: - case VOICE_RECORD_TX: - case VOICE_PLAYBACK_TX: - case VOICE2_PLAYBACK_TX: - case SLIMBUS_0_RX: - case SLIMBUS_0_TX: - case SLIMBUS_1_RX: - case SLIMBUS_1_TX: - case SLIMBUS_2_RX: - case SLIMBUS_2_TX: - case SLIMBUS_3_RX: - case SLIMBUS_3_TX: - case SLIMBUS_4_RX: - case SLIMBUS_4_TX: - case SLIMBUS_5_RX: - case SLIMBUS_5_TX: - case SLIMBUS_6_RX: - case SLIMBUS_6_TX: - case SLIMBUS_7_RX: - case SLIMBUS_7_TX: - case SLIMBUS_8_RX: - case SLIMBUS_8_TX: - case SLIMBUS_9_RX: - case SLIMBUS_9_TX: - case INT_BT_SCO_RX: - case INT_BT_SCO_TX: - case INT_BT_A2DP_RX: - case INT_FM_RX: - case INT_FM_TX: - case RT_PROXY_PORT_001_RX: - case RT_PROXY_PORT_001_TX: - case AFE_PORT_ID_PRIMARY_MI2S_RX: - case AFE_PORT_ID_PRIMARY_MI2S_TX: - case AFE_PORT_ID_QUATERNARY_MI2S_RX: - case AFE_PORT_ID_QUATERNARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX: - case AFE_PORT_ID_SECONDARY_MI2S_TX: - case AFE_PORT_ID_PRIMARY_SPDIF_RX: - case AFE_PORT_ID_PRIMARY_SPDIF_TX: - case AFE_PORT_ID_SECONDARY_SPDIF_RX: - case AFE_PORT_ID_SECONDARY_SPDIF_TX: - case AFE_PORT_ID_TERTIARY_MI2S_RX: - case AFE_PORT_ID_TERTIARY_MI2S_TX: - case AFE_PORT_ID_QUINARY_MI2S_RX: - case AFE_PORT_ID_QUINARY_MI2S_TX: - case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1: - case AFE_PORT_ID_PRIMARY_TDM_RX: - case AFE_PORT_ID_PRIMARY_TDM_TX: - case AFE_PORT_ID_PRIMARY_TDM_RX_1: - case AFE_PORT_ID_PRIMARY_TDM_TX_1: - case AFE_PORT_ID_PRIMARY_TDM_RX_2: - case AFE_PORT_ID_PRIMARY_TDM_TX_2: - case AFE_PORT_ID_PRIMARY_TDM_RX_3: - case AFE_PORT_ID_PRIMARY_TDM_TX_3: - case AFE_PORT_ID_PRIMARY_TDM_RX_4: - case AFE_PORT_ID_PRIMARY_TDM_TX_4: - case AFE_PORT_ID_PRIMARY_TDM_RX_5: - case AFE_PORT_ID_PRIMARY_TDM_TX_5: - case AFE_PORT_ID_PRIMARY_TDM_RX_6: - case AFE_PORT_ID_PRIMARY_TDM_TX_6: - case AFE_PORT_ID_PRIMARY_TDM_RX_7: - case AFE_PORT_ID_PRIMARY_TDM_TX_7: - case AFE_PORT_ID_SECONDARY_TDM_RX: - case AFE_PORT_ID_SECONDARY_TDM_TX: - case AFE_PORT_ID_SECONDARY_TDM_RX_1: - case AFE_PORT_ID_SECONDARY_TDM_TX_1: - case AFE_PORT_ID_SECONDARY_TDM_RX_2: - case AFE_PORT_ID_SECONDARY_TDM_TX_2: - case AFE_PORT_ID_SECONDARY_TDM_RX_3: - case AFE_PORT_ID_SECONDARY_TDM_TX_3: - case AFE_PORT_ID_SECONDARY_TDM_RX_4: - case AFE_PORT_ID_SECONDARY_TDM_TX_4: - case AFE_PORT_ID_SECONDARY_TDM_RX_5: - case AFE_PORT_ID_SECONDARY_TDM_TX_5: - case AFE_PORT_ID_SECONDARY_TDM_RX_6: - case AFE_PORT_ID_SECONDARY_TDM_TX_6: - case AFE_PORT_ID_SECONDARY_TDM_RX_7: - case AFE_PORT_ID_SECONDARY_TDM_TX_7: - case AFE_PORT_ID_TERTIARY_TDM_RX: - case AFE_PORT_ID_TERTIARY_TDM_TX: - case AFE_PORT_ID_TERTIARY_TDM_RX_1: - case AFE_PORT_ID_TERTIARY_TDM_TX_1: - case AFE_PORT_ID_TERTIARY_TDM_RX_2: - case AFE_PORT_ID_TERTIARY_TDM_TX_2: - case AFE_PORT_ID_TERTIARY_TDM_RX_3: - case AFE_PORT_ID_TERTIARY_TDM_TX_3: - case AFE_PORT_ID_TERTIARY_TDM_RX_4: - case AFE_PORT_ID_TERTIARY_TDM_TX_4: - case AFE_PORT_ID_TERTIARY_TDM_RX_5: - case AFE_PORT_ID_TERTIARY_TDM_TX_5: - case AFE_PORT_ID_TERTIARY_TDM_RX_6: - case AFE_PORT_ID_TERTIARY_TDM_TX_6: - case AFE_PORT_ID_TERTIARY_TDM_RX_7: - case AFE_PORT_ID_TERTIARY_TDM_TX_7: - case AFE_PORT_ID_QUATERNARY_TDM_RX: - case AFE_PORT_ID_QUATERNARY_TDM_TX: - case AFE_PORT_ID_QUATERNARY_TDM_RX_1: - case AFE_PORT_ID_QUATERNARY_TDM_TX_1: - case AFE_PORT_ID_QUATERNARY_TDM_RX_2: - case AFE_PORT_ID_QUATERNARY_TDM_TX_2: - case AFE_PORT_ID_QUATERNARY_TDM_RX_3: - case AFE_PORT_ID_QUATERNARY_TDM_TX_3: - case AFE_PORT_ID_QUATERNARY_TDM_RX_4: - case AFE_PORT_ID_QUATERNARY_TDM_TX_4: - case AFE_PORT_ID_QUATERNARY_TDM_RX_5: - case AFE_PORT_ID_QUATERNARY_TDM_TX_5: - case AFE_PORT_ID_QUATERNARY_TDM_RX_6: - case AFE_PORT_ID_QUATERNARY_TDM_TX_6: - case AFE_PORT_ID_QUATERNARY_TDM_RX_7: - case AFE_PORT_ID_QUATERNARY_TDM_TX_7: - case AFE_PORT_ID_QUINARY_TDM_RX: - case AFE_PORT_ID_QUINARY_TDM_TX: - case AFE_PORT_ID_QUINARY_TDM_RX_1: - case AFE_PORT_ID_QUINARY_TDM_TX_1: - case AFE_PORT_ID_QUINARY_TDM_RX_2: - case AFE_PORT_ID_QUINARY_TDM_TX_2: - case AFE_PORT_ID_QUINARY_TDM_RX_3: - case AFE_PORT_ID_QUINARY_TDM_TX_3: - case AFE_PORT_ID_QUINARY_TDM_RX_4: - case AFE_PORT_ID_QUINARY_TDM_TX_4: - case AFE_PORT_ID_QUINARY_TDM_RX_5: - case AFE_PORT_ID_QUINARY_TDM_TX_5: - case AFE_PORT_ID_QUINARY_TDM_RX_6: - case AFE_PORT_ID_QUINARY_TDM_TX_6: - case AFE_PORT_ID_QUINARY_TDM_RX_7: - case AFE_PORT_ID_QUINARY_TDM_TX_7: - case AFE_PORT_ID_SENARY_MI2S_TX: - case AFE_PORT_ID_USB_RX: - case AFE_PORT_ID_USB_TX: - case AFE_PORT_ID_INT0_MI2S_RX: - case AFE_PORT_ID_INT0_MI2S_TX: - case AFE_PORT_ID_INT1_MI2S_RX: - case AFE_PORT_ID_INT1_MI2S_TX: - case AFE_PORT_ID_INT2_MI2S_RX: - case AFE_PORT_ID_INT2_MI2S_TX: - case AFE_PORT_ID_INT3_MI2S_RX: - case AFE_PORT_ID_INT3_MI2S_TX: - case AFE_PORT_ID_INT4_MI2S_RX: - case AFE_PORT_ID_INT4_MI2S_TX: - case AFE_PORT_ID_INT5_MI2S_RX: - case AFE_PORT_ID_INT5_MI2S_TX: - case AFE_PORT_ID_INT6_MI2S_RX: - case AFE_PORT_ID_INT6_MI2S_TX: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_0: - case AFE_PORT_ID_WSA_CODEC_DMA_RX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_1: - case AFE_PORT_ID_WSA_CODEC_DMA_TX_2: - case AFE_PORT_ID_VA_CODEC_DMA_TX_0: - case AFE_PORT_ID_VA_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_0: - case AFE_PORT_ID_TX_CODEC_DMA_TX_0: - case AFE_PORT_ID_RX_CODEC_DMA_RX_1: - case AFE_PORT_ID_TX_CODEC_DMA_TX_1: - case AFE_PORT_ID_RX_CODEC_DMA_RX_2: - case AFE_PORT_ID_TX_CODEC_DMA_TX_2: - case AFE_PORT_ID_RX_CODEC_DMA_RX_3: - case AFE_PORT_ID_TX_CODEC_DMA_TX_3: - case AFE_PORT_ID_RX_CODEC_DMA_RX_4: - case AFE_PORT_ID_TX_CODEC_DMA_TX_4: - case AFE_PORT_ID_RX_CODEC_DMA_RX_5: - case AFE_PORT_ID_TX_CODEC_DMA_TX_5: - case AFE_PORT_ID_RX_CODEC_DMA_RX_6: - case AFE_PORT_ID_RX_CODEC_DMA_RX_7: - case AFE_PORT_ID_PSEUDOPORT_01: - case RT_PROXY_PORT_002_RX: - case RT_PROXY_PORT_002_TX: - { - ret = 0; - break; - } - - default: - ret = -EINVAL; - } - - return ret; -} -EXPORT_SYMBOL(q6audio_validate_port); diff --git a/techpack/audio/dsp/q6common.c b/techpack/audio/dsp/q6common.c deleted file mode 100644 index 6e50196b6b6b..000000000000 --- a/techpack/audio/dsp/q6common.c +++ /dev/null @@ -1,184 +0,0 @@ -/* Copyright (c) 2017-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -struct q6common_ctl { - bool instance_id_supported; -}; - -static struct q6common_ctl common; - -/** - * q6common_update_instance_id_support - * - * Update instance ID support flag to true/false - * - * @supported: enable/disable for instance ID support - */ -void q6common_update_instance_id_support(bool supported) -{ - common.instance_id_supported = supported; -} -EXPORT_SYMBOL(q6common_update_instance_id_support); - -/** - * q6common_is_instance_id_supported - * - * Returns true/false for instance ID support - */ -bool q6common_is_instance_id_supported(void) -{ - return common.instance_id_supported; -} -EXPORT_SYMBOL(q6common_is_instance_id_supported); - -/** - * q6common_pack_pp_params - * - * Populate params header based on instance ID support and pack - * it with payload. - * Instance ID support - - * yes - param_hdr_v3 + payload - * no - param_hdr_v1 + payload - * - * @dest: destination data pointer to be packed into - * @v3_hdr: param header v3 - * @param_data: param payload - * @total_size: total size of packed data (hdr + payload) - * - * Returns 0 on success or error on failure - */ -int q6common_pack_pp_params(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size) -{ - struct param_hdr_v1 *v1_hdr = NULL; - u32 packed_size = 0; - u32 param_size = 0; - bool iid_supported = q6common_is_instance_id_supported(); - - if (dest == NULL) { - pr_err("%s: Received NULL pointer for destination\n", __func__); - return -EINVAL; - } else if (v3_hdr == NULL) { - pr_err("%s: Received NULL pointer for header\n", __func__); - return -EINVAL; - } else if (total_size == NULL) { - pr_err("%s: Received NULL pointer for total size\n", __func__); - return -EINVAL; - } - - param_size = v3_hdr->param_size; - packed_size = iid_supported ? sizeof(struct param_hdr_v3) : - sizeof(struct param_hdr_v1); - - if (iid_supported) { - memcpy(dest, v3_hdr, packed_size); - } else { - v1_hdr = (struct param_hdr_v1 *) dest; - v1_hdr->module_id = v3_hdr->module_id; - v1_hdr->param_id = v3_hdr->param_id; - - if (param_size > U16_MAX) { - pr_err("%s: Invalid param size for V1 %d\n", __func__, - param_size); - return -EINVAL; - } - v1_hdr->param_size = param_size; - v1_hdr->reserved = 0; - } - - /* - * Make param_data optional for cases when there is no data - * present as in some set cases and all get cases. - */ - if (param_data != NULL) { - memcpy(dest + packed_size, param_data, param_size); - packed_size += param_size; - } - - *total_size = packed_size; - - return 0; -} -EXPORT_SYMBOL(q6common_pack_pp_params); - -/** - * q6common_pack_pp_params_v2 - * - * Populate params header based on instance ID support and pack - * it with payload. - * Instance ID support - - * yes - param_hdr_v3 + payload - * no - param_hdr_v1 + payload - * - * @dest: destination data pointer to be packed into - * @v3_hdr: param header v3 - * @param_data: param payload - * @total_size: total size of packed data (hdr + payload) - * @iid_supported: Instance ID supported or not - * - * Returns 0 on success or error on failure - */ -int q6common_pack_pp_params_v2(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size, - bool iid_supported) -{ - struct param_hdr_v1 *v1_hdr = NULL; - u32 packed_size = 0; - u32 param_size = 0; - - if (dest == NULL) { - pr_err("%s: Received NULL pointer for destination\n", __func__); - return -EINVAL; - } else if (v3_hdr == NULL) { - pr_err("%s: Received NULL pointer for header\n", __func__); - return -EINVAL; - } else if (total_size == NULL) { - pr_err("%s: Received NULL pointer for total size\n", __func__); - return -EINVAL; - } - - param_size = v3_hdr->param_size; - packed_size = iid_supported ? sizeof(struct param_hdr_v3) : - sizeof(struct param_hdr_v1); - - if (iid_supported) { - memcpy(dest, v3_hdr, packed_size); - } else { - v1_hdr = (struct param_hdr_v1 *) dest; - v1_hdr->module_id = v3_hdr->module_id; - v1_hdr->param_id = v3_hdr->param_id; - - if (param_size > U16_MAX) { - pr_err("%s: Invalid param size for V1 %d\n", __func__, - param_size); - return -EINVAL; - } - v1_hdr->param_size = param_size; - v1_hdr->reserved = 0; - } - - /* - * Make param_data optional for cases when there is no data - * present as in some set cases and all get cases. - */ - if (param_data != NULL) { - memcpy(dest + packed_size, param_data, param_size); - packed_size += param_size; - } - - *total_size = packed_size; - - return 0; -} -EXPORT_SYMBOL(q6common_pack_pp_params_v2); diff --git a/techpack/audio/dsp/q6core.c b/techpack/audio/dsp/q6core.c deleted file mode 100644 index 56e93dcb721b..000000000000 --- a/techpack/audio/dsp/q6core.c +++ /dev/null @@ -1,1662 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define TIMEOUT_MS 1000 -/* - * AVS bring up in the modem is optimitized for the new - * Sub System Restart design and 100 milliseconds timeout - * is sufficient to make sure the Q6 will be ready. - */ -#define Q6_READY_TIMEOUT_MS 100 - -#define ADSP_STATE_READY_TIMEOUT_MS 3000 - -#define APR_ENOTREADY 10 - -enum { - META_CAL, - CUST_TOP_CAL, - CORE_MAX_CAL -}; - -enum ver_query_status { - VER_QUERY_UNATTEMPTED, - VER_QUERY_UNSUPPORTED, - VER_QUERY_SUPPORTED -}; - -struct q6core_avcs_ver_info { - enum ver_query_status status; - struct avcs_fwk_ver_info *ver_info; -}; - -struct q6core_str { - struct apr_svc *core_handle_q; - wait_queue_head_t bus_bw_req_wait; - wait_queue_head_t cmd_req_wait; - wait_queue_head_t avcs_fwk_ver_req_wait; - u32 bus_bw_resp_received; - enum cmd_flags { - FLAG_NONE, - FLAG_CMDRSP_LICENSE_RESULT - } cmd_resp_received_flag; - u32 avcs_fwk_ver_resp_received; - struct mutex cmd_lock; - struct mutex ver_lock; - union { - struct avcs_cmdrsp_get_license_validation_result - cmdrsp_license_result; - } cmd_resp_payload; - u32 param; - struct cal_type_data *cal_data[CORE_MAX_CAL]; - uint32_t mem_map_cal_handle; - int32_t adsp_status; - int32_t avs_state; - struct q6core_avcs_ver_info q6core_avcs_ver_info; -}; - -static struct q6core_str q6core_lcl; - -struct generic_get_data_ { - int valid; - int size_in_ints; - int ints[]; -}; -static struct generic_get_data_ *generic_get_data; - -static DEFINE_MUTEX(kset_lock); -static struct kset *audio_uevent_kset; - -static int q6core_init_uevent_kset(void) -{ - int ret = 0; - - mutex_lock(&kset_lock); - if (audio_uevent_kset) - goto done; - - /* Create a kset under /sys/kernel/ */ - audio_uevent_kset = kset_create_and_add("q6audio", NULL, kernel_kobj); - if (!audio_uevent_kset) { - pr_err("%s: error creating uevent kernel set", __func__); - ret = -EINVAL; - } -done: - mutex_unlock(&kset_lock); - return ret; -} - -static void q6core_destroy_uevent_kset(void) -{ - if (audio_uevent_kset) { - kset_unregister(audio_uevent_kset); - audio_uevent_kset = NULL; - } -} - -/** - * q6core_init_uevent_data - initialize kernel object required to send uevents. - * - * @uevent_data: uevent data (dynamically allocated memory). - * @name: name of the kernel object. - * - * Returns 0 on success or error otherwise. - */ -int q6core_init_uevent_data(struct audio_uevent_data *uevent_data, char *name) -{ - int ret = -EINVAL; - - if (!uevent_data || !name) - return ret; - - ret = q6core_init_uevent_kset(); - if (ret) - return ret; - - /* Set kset for kobject before initializing the kobject */ - uevent_data->kobj.kset = audio_uevent_kset; - - /* Initialize kobject and add it to kernel */ - ret = kobject_init_and_add(&uevent_data->kobj, &uevent_data->ktype, - NULL, "%s", name); - if (ret) { - pr_err("%s: error initializing uevent kernel object: %d", - __func__, ret); - kobject_put(&uevent_data->kobj); - return ret; - } - - /* Send kobject add event to the system */ - kobject_uevent(&uevent_data->kobj, KOBJ_ADD); - - return ret; -} -EXPORT_SYMBOL(q6core_init_uevent_data); - -/** - * q6core_destroy_uevent_data - destroy kernel object. - * - * @uevent_data: uevent data. - */ -void q6core_destroy_uevent_data(struct audio_uevent_data *uevent_data) -{ - if (uevent_data) - kobject_put(&uevent_data->kobj); -} -EXPORT_SYMBOL(q6core_destroy_uevent_data); - -/** - * q6core_send_uevent - send uevent to userspace. - * - * @uevent_data: uevent data. - * @event: event to send. - * - * Returns 0 on success or error otherwise. - */ -int q6core_send_uevent(struct audio_uevent_data *uevent_data, char *event) -{ - char *env[] = { event, NULL }; - - if (!event || !uevent_data) - return -EINVAL; - - return kobject_uevent_env(&uevent_data->kobj, KOBJ_CHANGE, env); -} -EXPORT_SYMBOL(q6core_send_uevent); - -static int parse_fwk_version_info(uint32_t *payload, uint16_t payload_size) -{ - size_t ver_size; - int num_services; - - pr_debug("%s: Payload info num services %d\n", - __func__, payload[4]); - - /* - * payload1[4] is the number of services running on DSP - * Based on this info, we copy the payload into core - * avcs version info structure. - */ - if (payload_size < 5 * sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, payload_size); - return -EINVAL; - } - num_services = payload[4]; - if (num_services > VSS_MAX_AVCS_NUM_SERVICES) { - pr_err("%s: num_services: %d greater than max services: %d\n", - __func__, num_services, VSS_MAX_AVCS_NUM_SERVICES); - return -EINVAL; - } - - /* - * Dynamically allocate memory for all - * the services based on num_services - */ - ver_size = sizeof(struct avcs_get_fwk_version) + - num_services * sizeof(struct avs_svc_api_info); - - if (payload_size < ver_size) { - pr_err("%s: payload has invalid size %d, expected size %zu\n", - __func__, payload_size, ver_size); - return -EINVAL; - } - - q6core_lcl.q6core_avcs_ver_info.ver_info = - kzalloc(ver_size, GFP_ATOMIC); - if (q6core_lcl.q6core_avcs_ver_info.ver_info == NULL) - return -ENOMEM; - - memcpy(q6core_lcl.q6core_avcs_ver_info.ver_info, (uint8_t *) payload, - ver_size); - return 0; -} - -static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv) -{ - uint32_t *payload1; - int ret = 0; - - if (data == NULL) { - pr_err("%s: data argument is null\n", __func__); - return -EINVAL; - } - - pr_debug("%s: core msg: payload len = %u, apr resp opcode = 0x%x\n", - __func__, - data->payload_size, data->opcode); - - switch (data->opcode) { - - case APR_BASIC_RSP_RESULT:{ - - if (data->payload_size == 0) { - pr_err("%s: APR_BASIC_RSP_RESULT No Payload ", - __func__); - return 0; - } - - payload1 = data->payload; - - if (data->payload_size < 2 * sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - - switch (payload1[0]) { - - case AVCS_CMD_SHARED_MEM_UNMAP_REGIONS: - pr_debug("%s: Cmd = AVCS_CMD_SHARED_MEM_UNMAP_REGIONS status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_SHARED_MEM_MAP_REGIONS: - pr_debug("%s: Cmd = AVCS_CMD_SHARED_MEM_MAP_REGIONS status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_MAP_MDF_SHARED_MEMORY: - pr_debug("%s: Cmd = AVCS_CMD_MAP_MDF_SHARED_MEMORY status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_REGISTER_TOPOLOGIES: - pr_debug("%s: Cmd = AVCS_CMD_REGISTER_TOPOLOGIES status[0x%x]\n", - __func__, payload1[1]); - /* -ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_DEREGISTER_TOPOLOGIES: - pr_debug("%s: Cmd = AVCS_CMD_DEREGISTER_TOPOLOGIES status[0x%x]\n", - __func__, payload1[1]); - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMD_GET_FWK_VERSION: - pr_debug("%s: Cmd = AVCS_CMD_GET_FWK_VERSION status[%s]\n", - __func__, adsp_err_get_err_str(payload1[1])); - /* ADSP status to match Linux error standard */ - q6core_lcl.adsp_status = -payload1[1]; - if (payload1[1] == ADSP_EUNSUPPORTED) - q6core_lcl.q6core_avcs_ver_info.status = - VER_QUERY_UNSUPPORTED; - q6core_lcl.avcs_fwk_ver_resp_received = 1; - wake_up(&q6core_lcl.avcs_fwk_ver_req_wait); - break; - case AVCS_CMD_LOAD_TOPO_MODULES: - case AVCS_CMD_UNLOAD_TOPO_MODULES: - pr_debug("%s: Cmd = %s status[%s]\n", - __func__, - (payload1[0] == AVCS_CMD_LOAD_TOPO_MODULES) ? - "AVCS_CMD_LOAD_TOPO_MODULES" : - "AVCS_CMD_UNLOAD_TOPO_MODULES", - adsp_err_get_err_str(payload1[1])); - break; - default: - pr_err("%s: Invalid cmd rsp[0x%x][0x%x] opcode %d\n", - __func__, - payload1[0], payload1[1], data->opcode); - break; - } - break; - } - - case RESET_EVENTS:{ - pr_debug("%s: Reset event received in Core service\n", - __func__); - /* - * no reset for q6core_avcs_ver_info done as - * the data will not change after SSR - */ - apr_reset(q6core_lcl.core_handle_q); - q6core_lcl.core_handle_q = NULL; - break; - } - case AVCS_CMDRSP_SHARED_MEM_MAP_REGIONS: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - pr_debug("%s: AVCS_CMDRSP_SHARED_MEM_MAP_REGIONS handle %d\n", - __func__, payload1[0]); - q6core_lcl.mem_map_cal_handle = payload1[0]; - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMDRSP_ADSP_EVENT_GET_STATE: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - q6core_lcl.param = payload1[0]; - pr_debug("%s: Received ADSP get state response 0x%x\n", - __func__, q6core_lcl.param); - /* ensure .param is updated prior to .bus_bw_resp_received */ - wmb(); - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - case AVCS_CMDRSP_GET_LICENSE_VALIDATION_RESULT: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: payload has invalid size %d\n", - __func__, data->payload_size); - return -EINVAL; - } - payload1 = data->payload; - pr_debug("%s: cmd = LICENSE_VALIDATION_RESULT, result = 0x%x\n", - __func__, payload1[0]); - q6core_lcl.cmd_resp_payload.cmdrsp_license_result.result - = payload1[0]; - q6core_lcl.cmd_resp_received_flag = FLAG_CMDRSP_LICENSE_RESULT; - wake_up(&q6core_lcl.cmd_req_wait); - break; - case AVCS_CMDRSP_GET_FWK_VERSION: - pr_debug("%s: Received AVCS_CMDRSP_GET_FWK_VERSION\n", - __func__); - payload1 = data->payload; - ret = parse_fwk_version_info(payload1, data->payload_size); - if (ret < 0) { - q6core_lcl.adsp_status = ret; - pr_err("%s: Failed to parse payload:%d\n", - __func__, ret); - } else { - q6core_lcl.q6core_avcs_ver_info.status = - VER_QUERY_SUPPORTED; - } - q6core_lcl.avcs_fwk_ver_resp_received = 1; - wake_up(&q6core_lcl.avcs_fwk_ver_req_wait); - break; - default: - pr_err("%s: Message id from adsp core svc: 0x%x\n", - __func__, data->opcode); - if (generic_get_data) { - generic_get_data->valid = 1; - generic_get_data->size_in_ints = - data->payload_size/sizeof(int); - pr_debug("callback size = %i\n", - data->payload_size); - memcpy(generic_get_data->ints, data->payload, - data->payload_size); - q6core_lcl.bus_bw_resp_received = 1; - wake_up(&q6core_lcl.bus_bw_req_wait); - break; - } - break; - } - - return 0; -} - -void ocm_core_open(void) -{ - if (q6core_lcl.core_handle_q == NULL) - q6core_lcl.core_handle_q = apr_register("ADSP", "CORE", - aprv2_core_fn_q, 0xFFFFFFFF, NULL); - pr_debug("%s: Open_q %pK\n", __func__, q6core_lcl.core_handle_q); - if (q6core_lcl.core_handle_q == NULL) - pr_err_ratelimited("%s: Unable to register CORE\n", __func__); -} - -struct cal_block_data *cal_utils_get_cal_block_by_key( - struct cal_type_data *cal_type, uint32_t key) -{ - struct list_head *ptr, *next; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_metainfo *metainfo; - - list_for_each_safe(ptr, next, - &cal_type->cal_blocks) { - - cal_block = list_entry(ptr, - struct cal_block_data, list); - metainfo = (struct audio_cal_info_metainfo *) - cal_block->cal_info; - if (metainfo->nKey != key) { - pr_debug("%s: metainfo key mismatch!!! found:%x, needed:%x\n", - __func__, metainfo->nKey, key); - } else { - pr_debug("%s: metainfo key match found", __func__); - return cal_block; - } - } - return NULL; -} - -static int q6core_send_get_avcs_fwk_ver_cmd(void) -{ - struct apr_hdr avcs_ver_cmd; - int ret; - - avcs_ver_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - avcs_ver_cmd.pkt_size = sizeof(struct apr_hdr); - avcs_ver_cmd.src_port = 0; - avcs_ver_cmd.dest_port = 0; - avcs_ver_cmd.token = 0; - avcs_ver_cmd.opcode = AVCS_CMD_GET_FWK_VERSION; - - q6core_lcl.adsp_status = 0; - q6core_lcl.avcs_fwk_ver_resp_received = 0; - - ret = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *) &avcs_ver_cmd); - if (ret < 0) { - pr_err("%s: failed to send apr packet, ret=%d\n", __func__, - ret); - goto done; - } - - ret = wait_event_timeout(q6core_lcl.avcs_fwk_ver_req_wait, - (q6core_lcl.avcs_fwk_ver_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for AVCS fwk version info\n", - __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (q6core_lcl.adsp_status < 0) { - /* - * adsp_err_get_err_str expects a positive value but we store - * the DSP error as negative to match the Linux error standard. - * Pass in the negated value so adsp_err_get_err_str returns - * the correct string. - */ - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(-q6core_lcl.adsp_status)); - ret = adsp_err_get_lnx_err_code(q6core_lcl.adsp_status); - goto done; - } - - ret = 0; - -done: - return ret; -} - -int q6core_get_service_version(uint32_t service_id, - struct avcs_fwk_ver_info *ver_info, - size_t size) -{ - struct avcs_fwk_ver_info *cached_ver_info = NULL; - int i; - uint32_t num_services; - size_t ver_size; - int ret; - - if (ver_info == NULL) { - pr_err("%s: ver_info is NULL\n", __func__); - return -EINVAL; - } - - ret = q6core_get_fwk_version_size(service_id); - if (ret < 0) { - pr_err("%s: Failed to get service size for service id %d with error %d\n", - __func__, service_id, ret); - return ret; - } - - ver_size = ret; - if (ver_size != size) { - pr_err("%s: Expected size %zu and provided size %zu do not match\n", - __func__, ver_size, size); - return -EINVAL; - } - - cached_ver_info = q6core_lcl.q6core_avcs_ver_info.ver_info; - num_services = cached_ver_info->avcs_fwk_version.num_services; - - if (service_id == AVCS_SERVICE_ID_ALL) { - memcpy(ver_info, cached_ver_info, ver_size); - return 0; - } - - ver_info->avcs_fwk_version = cached_ver_info->avcs_fwk_version; - for (i = 0; i < num_services; i++) { - if (cached_ver_info->services[i].service_id == service_id) { - ver_info->services[0] = cached_ver_info->services[i]; - return 0; - } - } - pr_err("%s: No service matching service ID %d\n", __func__, service_id); - return -EINVAL; -} -EXPORT_SYMBOL(q6core_get_service_version); - -static int q6core_get_avcs_fwk_version(void) -{ - int ret = 0; - - mutex_lock(&(q6core_lcl.ver_lock)); - pr_debug("%s: q6core_avcs_ver_info.status(%d)\n", __func__, - q6core_lcl.q6core_avcs_ver_info.status); - - switch (q6core_lcl.q6core_avcs_ver_info.status) { - case VER_QUERY_SUPPORTED: - pr_debug("%s: AVCS FWK version query already attempted\n", - __func__); - break; - case VER_QUERY_UNSUPPORTED: - ret = -EOPNOTSUPP; - break; - case VER_QUERY_UNATTEMPTED: - pr_debug("%s: Attempting AVCS FWK version query\n", __func__); - if (q6core_is_adsp_ready()) { - ret = q6core_send_get_avcs_fwk_ver_cmd(); - } else { - pr_err("%s: ADSP is not ready to query version\n", - __func__); - ret = -ENODEV; - } - break; - default: - pr_err("%s: Invalid version query status %d\n", __func__, - q6core_lcl.q6core_avcs_ver_info.status); - ret = -EINVAL; - break; - } - mutex_unlock(&(q6core_lcl.ver_lock)); - return ret; -} - -size_t q6core_get_fwk_version_size(uint32_t service_id) -{ - int ret = 0; - uint32_t num_services; - - ret = q6core_get_avcs_fwk_version(); - if (ret) - goto done; - - if (q6core_lcl.q6core_avcs_ver_info.ver_info != NULL) { - num_services = q6core_lcl.q6core_avcs_ver_info.ver_info - ->avcs_fwk_version.num_services; - } else { - pr_err("%s: ver_info is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - ret = sizeof(struct avcs_get_fwk_version); - if (service_id == AVCS_SERVICE_ID_ALL) - ret += num_services * sizeof(struct avs_svc_api_info); - else - ret += sizeof(struct avs_svc_api_info); -done: - return ret; -} -EXPORT_SYMBOL(q6core_get_fwk_version_size); - -/** - * q6core_get_avcs_version_per_service - - * to get api version of a particular service - * - * @service_id: id of the service - * - * Returns valid version on success or error (negative value) on failure - */ -int q6core_get_avcs_api_version_per_service(uint32_t service_id) -{ - struct avcs_fwk_ver_info *cached_ver_info = NULL; - int i; - uint32_t num_services; - int ret = 0; - - if (service_id == AVCS_SERVICE_ID_ALL) - return -EINVAL; - - ret = q6core_get_avcs_fwk_version(); - if (ret < 0) { - pr_err("%s: failure in getting AVCS version\n", __func__); - return ret; - } - - cached_ver_info = q6core_lcl.q6core_avcs_ver_info.ver_info; - num_services = cached_ver_info->avcs_fwk_version.num_services; - - for (i = 0; i < num_services; i++) { - if (cached_ver_info->services[i].service_id == service_id) - return cached_ver_info->services[i].api_version; - } - pr_err("%s: No service matching service ID %d\n", __func__, service_id); - return -EINVAL; -} -EXPORT_SYMBOL(q6core_get_avcs_api_version_per_service); - -/** - * core_set_license - - * command to set license for module - * - * @key: license key hash - * @module_id: DSP Module ID - * - * Returns 0 on success or error on failure - */ -int32_t core_set_license(uint32_t key, uint32_t module_id) -{ - struct avcs_cmd_set_license *cmd_setl = NULL; - struct cal_block_data *cal_block = NULL; - int rc = 0, packet_size = 0; - - pr_debug("%s: key:0x%x, id:0x%x\n", __func__, key, module_id); - - mutex_lock(&(q6core_lcl.cmd_lock)); - if (q6core_lcl.cal_data[META_CAL] == NULL) { - pr_err("%s: cal_data not initialized yet!!\n", __func__); - rc = -EINVAL; - goto cmd_unlock; - } - - mutex_lock(&((q6core_lcl.cal_data[META_CAL])->lock)); - cal_block = cal_utils_get_cal_block_by_key( - q6core_lcl.cal_data[META_CAL], key); - if (cal_block == NULL || - cal_block->cal_data.kvaddr == NULL || - cal_block->cal_data.size <= 0) { - pr_err("%s: Invalid cal block to send", __func__); - rc = -EINVAL; - goto cal_data_unlock; - } - - packet_size = sizeof(struct avcs_cmd_set_license) + - cal_block->cal_data.size; - /*round up total packet_size to next 4 byte boundary*/ - packet_size = ((packet_size + 0x3)>>2)<<2; - - cmd_setl = kzalloc(packet_size, GFP_KERNEL); - if (cmd_setl == NULL) { - rc = -ENOMEM; - goto cal_data_unlock; - } - - ocm_core_open(); - if (q6core_lcl.core_handle_q == NULL) { - pr_err("%s: apr registration for CORE failed\n", __func__); - rc = -ENODEV; - goto fail_cmd; - } - - cmd_setl->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cmd_setl->hdr.pkt_size = packet_size; - cmd_setl->hdr.src_port = 0; - cmd_setl->hdr.dest_port = 0; - cmd_setl->hdr.token = 0; - cmd_setl->hdr.opcode = AVCS_CMD_SET_LICENSE; - cmd_setl->id = module_id; - cmd_setl->overwrite = 1; - cmd_setl->size = cal_block->cal_data.size; - memcpy((uint8_t *)cmd_setl + sizeof(struct avcs_cmd_set_license), - cal_block->cal_data.kvaddr, - cal_block->cal_data.size); - pr_info("%s: Set license opcode=0x%x, id =0x%x, size = %d\n", - __func__, cmd_setl->hdr.opcode, - cmd_setl->id, cmd_setl->size); - rc = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *)cmd_setl); - if (rc < 0) - pr_err("%s: SET_LICENSE failed op[0x%x]rc[%d]\n", - __func__, cmd_setl->hdr.opcode, rc); - -fail_cmd: - kfree(cmd_setl); -cal_data_unlock: - mutex_unlock(&((q6core_lcl.cal_data[META_CAL])->lock)); -cmd_unlock: - mutex_unlock(&(q6core_lcl.cmd_lock)); - - return rc; -} -EXPORT_SYMBOL(core_set_license); - -/** - * core_get_license_status - - * command to retrieve license status for module - * - * @module_id: DSP Module ID - * - * Returns 0 on success or error on failure - */ -int32_t core_get_license_status(uint32_t module_id) -{ - struct avcs_cmd_get_license_validation_result get_lvr_cmd; - int ret = 0; - - pr_debug("%s: module_id 0x%x", __func__, module_id); - - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q == NULL) { - pr_err("%s: apr registration for CORE failed\n", __func__); - ret = -ENODEV; - goto fail_cmd; - } - - get_lvr_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - get_lvr_cmd.hdr.pkt_size = - sizeof(struct avcs_cmd_get_license_validation_result); - - get_lvr_cmd.hdr.src_port = 0; - get_lvr_cmd.hdr.dest_port = 0; - get_lvr_cmd.hdr.token = 0; - get_lvr_cmd.hdr.opcode = AVCS_CMD_GET_LICENSE_VALIDATION_RESULT; - get_lvr_cmd.id = module_id; - - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) &get_lvr_cmd); - if (ret < 0) { - pr_err("%s: license_validation request failed, err %d\n", - __func__, ret); - ret = -EREMOTE; - goto fail_cmd; - } - - q6core_lcl.cmd_resp_received_flag &= ~(FLAG_CMDRSP_LICENSE_RESULT); - mutex_unlock(&(q6core_lcl.cmd_lock)); - ret = wait_event_timeout(q6core_lcl.cmd_req_wait, - (q6core_lcl.cmd_resp_received_flag == - FLAG_CMDRSP_LICENSE_RESULT), - msecs_to_jiffies(TIMEOUT_MS)); - mutex_lock(&(q6core_lcl.cmd_lock)); - if (!ret) { - pr_err("%s: wait_event timeout for CMDRSP_LICENSE_RESULT\n", - __func__); - ret = -ETIME; - goto fail_cmd; - } - q6core_lcl.cmd_resp_received_flag &= ~(FLAG_CMDRSP_LICENSE_RESULT); - ret = q6core_lcl.cmd_resp_payload.cmdrsp_license_result.result; - -fail_cmd: - mutex_unlock(&(q6core_lcl.cmd_lock)); - pr_info("%s: cmdrsp_license_result.result = 0x%x for module 0x%x\n", - __func__, ret, module_id); - return ret; -} -EXPORT_SYMBOL(core_get_license_status); - -/** - * core_set_dolby_manufacturer_id - - * command to set dolby manufacturer id - * - * @manufacturer_id: Dolby manufacturer id - * - * Returns 0 on success or error on failure - */ -uint32_t core_set_dolby_manufacturer_id(int manufacturer_id) -{ - struct adsp_dolby_manufacturer_id payload; - int rc = 0; - - pr_debug("%s: manufacturer_id :%d\n", __func__, manufacturer_id); - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - payload.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - payload.hdr.pkt_size = - sizeof(struct adsp_dolby_manufacturer_id); - payload.hdr.src_port = 0; - payload.hdr.dest_port = 0; - payload.hdr.token = 0; - payload.hdr.opcode = ADSP_CMD_SET_DOLBY_MANUFACTURER_ID; - payload.manufacturer_id = manufacturer_id; - pr_debug("%s: Send Dolby security opcode=0x%x manufacturer ID = %d\n", - __func__, - payload.hdr.opcode, payload.manufacturer_id); - rc = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *)&payload); - if (rc < 0) - pr_err("%s: SET_DOLBY_MANUFACTURER_ID failed op[0x%x]rc[%d]\n", - __func__, payload.hdr.opcode, rc); - } - mutex_unlock(&(q6core_lcl.cmd_lock)); - return rc; -} -EXPORT_SYMBOL(core_set_dolby_manufacturer_id); - -int32_t q6core_load_unload_topo_modules(uint32_t topo_id, - bool preload_type) -{ - struct avcs_cmd_load_unload_topo_modules load_unload_topo_modules; - int ret = 0; - - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q == NULL) { - pr_err("%s: apr registration for CORE failed\n", __func__); - ret = -ENODEV; - goto done; - } - - memset(&load_unload_topo_modules, 0, sizeof(load_unload_topo_modules)); - load_unload_topo_modules.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - load_unload_topo_modules.hdr.pkt_size = - sizeof(struct avcs_cmd_load_unload_topo_modules); - load_unload_topo_modules.hdr.src_port = 0; - load_unload_topo_modules.hdr.dest_port = 0; - load_unload_topo_modules.hdr.token = 0; - - if (preload_type == CORE_LOAD_TOPOLOGY) - load_unload_topo_modules.hdr.opcode = - AVCS_CMD_LOAD_TOPO_MODULES; - else - load_unload_topo_modules.hdr.opcode = - AVCS_CMD_UNLOAD_TOPO_MODULES; - - load_unload_topo_modules.topology_id = topo_id; - ret = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *) &load_unload_topo_modules); - if (ret < 0) { - pr_err_ratelimited("%s: Load/unload topo modules failed for topology = %d ret = %d\n", - __func__, topo_id, ret); - ret = -EINVAL; - } - -done: - mutex_unlock(&(q6core_lcl.cmd_lock)); - - return ret; -} -EXPORT_SYMBOL(q6core_load_unload_topo_modules); - -/** - * q6core_is_adsp_ready - check adsp ready status - * - * Returns true if adsp is ready otherwise returns false - */ -bool q6core_is_adsp_ready(void) -{ - int rc = 0; - bool ret = false; - struct apr_hdr hdr; - - pr_debug("%s: enter\n", __func__); - memset(&hdr, 0, sizeof(hdr)); - hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, 0); - hdr.opcode = AVCS_CMD_ADSP_EVENT_GET_STATE; - - mutex_lock(&(q6core_lcl.cmd_lock)); - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - q6core_lcl.bus_bw_resp_received = 0; - rc = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *)&hdr); - if (rc < 0) { - pr_err_ratelimited("%s: Get ADSP state APR packet send event %d\n", - __func__, rc); - goto bail; - } - - rc = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(Q6_READY_TIMEOUT_MS)); - if (rc > 0 && q6core_lcl.bus_bw_resp_received) { - /* ensure to read updated param by callback thread */ - rmb(); - ret = !!q6core_lcl.param; - } - } -bail: - pr_debug("%s: leave, rc %d, adsp ready %d\n", __func__, rc, ret); - mutex_unlock(&(q6core_lcl.cmd_lock)); - return ret; -} -EXPORT_SYMBOL(q6core_is_adsp_ready); - -int q6core_map_memory_regions(phys_addr_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt, uint32_t *map_handle) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int ret = 0; - int i = 0; - int cmd_size = 0; - - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) - + sizeof(struct avs_shared_map_region_payload) - * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_shared_mem_map_regions *)mmap_region_cmd; - mmap_regions->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mmap_regions->hdr.pkt_size = cmd_size; - mmap_regions->hdr.src_port = 0; - mmap_regions->hdr.dest_port = 0; - mmap_regions->hdr.token = 0; - mmap_regions->hdr.opcode = AVCS_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = mempool_id & 0x00ff; - mmap_regions->num_regions = bufcnt & 0x00ff; - mmap_regions->property_flag = 0x00; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - for (i = 0; i < bufcnt; i++) { - mregions->shm_addr_lsw = lower_32_bits(buf_add[i]); - mregions->shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_add[i]); - mregions->mem_size_bytes = bufsz[i]; - ++mregions; - } - - pr_debug("%s: sending memory map, addr %pK, size %d, bufcnt = %d\n", - __func__, buf_add, bufsz[0], mmap_regions->num_regions); - - *map_handle = 0; - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) - mmap_regions); - if (ret < 0) { - pr_err("%s: mmap regions failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory map\n", __func__); - ret = -ETIME; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } - - *map_handle = q6core_lcl.mem_map_cal_handle; -done: - kfree(mmap_region_cmd); - return ret; -} - -int q6core_memory_unmap_regions(uint32_t mem_map_handle) -{ - struct avs_cmd_shared_mem_unmap_regions unmap_regions; - int ret = 0; - - memset(&unmap_regions, 0, sizeof(unmap_regions)); - unmap_regions.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - unmap_regions.hdr.pkt_size = sizeof(unmap_regions); - unmap_regions.hdr.src_svc = APR_SVC_ADSP_CORE; - unmap_regions.hdr.src_domain = APR_DOMAIN_APPS; - unmap_regions.hdr.src_port = 0; - unmap_regions.hdr.dest_svc = APR_SVC_ADSP_CORE; - unmap_regions.hdr.dest_domain = APR_DOMAIN_ADSP; - unmap_regions.hdr.dest_port = 0; - unmap_regions.hdr.token = 0; - unmap_regions.hdr.opcode = AVCS_CMD_SHARED_MEM_UNMAP_REGIONS; - unmap_regions.mem_map_handle = mem_map_handle; - - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - - pr_debug("%s: unmap regions map handle %d\n", - __func__, mem_map_handle); - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) - &unmap_regions); - if (ret < 0) { - pr_err("%s: unmap regions failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for memory_unmap\n", - __func__); - ret = -ETIME; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - if (q6core_lcl.adsp_status < 0) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } -done: - return ret; -} - - -int q6core_map_mdf_shared_memory(uint32_t map_handle, phys_addr_t *buf_add, - uint32_t proc_id, uint32_t *bufsz, uint32_t bufcnt) -{ - struct avs_cmd_map_mdf_shared_memory *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int ret = 0; - int i = 0; - int cmd_size = 0; - - cmd_size = sizeof(struct avs_cmd_map_mdf_shared_memory) - + sizeof(struct avs_shared_map_region_payload) - * bufcnt; - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (mmap_region_cmd == NULL) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_map_mdf_shared_memory *)mmap_region_cmd; - mmap_regions->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mmap_regions->hdr.pkt_size = cmd_size; - mmap_regions->hdr.src_port = 0; - mmap_regions->hdr.dest_port = 0; - mmap_regions->hdr.token = 0; - mmap_regions->hdr.opcode = AVCS_CMD_MAP_MDF_SHARED_MEMORY; - mmap_regions->mem_map_handle = map_handle; - mmap_regions->proc_id = proc_id & 0x00ff; - mmap_regions->num_regions = bufcnt & 0x00ff; - - payload = ((u8 *) mmap_region_cmd + - sizeof(struct avs_cmd_map_mdf_shared_memory)); - mregions = (struct avs_shared_map_region_payload *)payload; - - for (i = 0; i < bufcnt; i++) { - mregions->shm_addr_lsw = lower_32_bits(buf_add[i]); - mregions->shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_add[i]); - mregions->mem_size_bytes = bufsz[i]; - ++mregions; - } - - pr_debug("%s: sending mdf memory map, addr %pa, size %d, bufcnt = %d\n", - __func__, buf_add, bufsz[0], mmap_regions->num_regions); - - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) - mmap_regions); - if (ret < 0) { - pr_err("%s: mdf memory map failed %d\n", - __func__, ret); - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: timeout. waited for mdf memory map\n", - __func__); - ret = -ETIME; - goto done; - } else { - /* set ret to 0 as no timeout happened */ - ret = 0; - } - - /* - * When the remote DSP is not ready, the ADSP will validate and store - * the memory information and return APR_ENOTREADY to HLOS. The ADSP - * will map the memory with remote DSP when it is ready. HLOS should - * not treat APR_ENOTREADY as an error. - */ - if (q6core_lcl.adsp_status != -APR_ENOTREADY) { - pr_err("%s: DSP returned error %d\n", - __func__, q6core_lcl.adsp_status); - ret = q6core_lcl.adsp_status; - goto done; - } - -done: - kfree(mmap_region_cmd); - return ret; -} - -static int q6core_dereg_all_custom_topologies(void) -{ - int ret = 0; - struct avcs_cmd_deregister_topologies dereg_top; - - memset(&dereg_top, 0, sizeof(dereg_top)); - dereg_top.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - dereg_top.hdr.pkt_size = sizeof(dereg_top); - dereg_top.hdr.src_svc = APR_SVC_ADSP_CORE; - dereg_top.hdr.src_domain = APR_DOMAIN_APPS; - dereg_top.hdr.src_port = 0; - dereg_top.hdr.dest_svc = APR_SVC_ADSP_CORE; - dereg_top.hdr.dest_domain = APR_DOMAIN_ADSP; - dereg_top.hdr.dest_port = 0; - dereg_top.hdr.token = 0; - dereg_top.hdr.opcode = AVCS_CMD_DEREGISTER_TOPOLOGIES; - dereg_top.payload_addr_lsw = 0; - dereg_top.payload_addr_msw = 0; - dereg_top.mem_map_handle = 0; - dereg_top.payload_size = 0; - dereg_top.mode = AVCS_MODE_DEREGISTER_ALL_CUSTOM_TOPOLOGIES; - - q6core_lcl.bus_bw_resp_received = 0; - - pr_debug("%s: Deregister topologies mode %d\n", - __func__, dereg_top.mode); - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) &dereg_top); - if (ret < 0) { - pr_err("%s: Deregister topologies failed %d\n", - __func__, ret); - goto done; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for Deregister topologies\n", - __func__); - goto done; - } -done: - return ret; -} - -static int q6core_send_custom_topologies(void) -{ - int ret = 0; - int ret2 = 0; - struct cal_block_data *cal_block = NULL; - struct avcs_cmd_register_topologies reg_top; - - if (!q6core_is_adsp_ready()) { - pr_err("%s: ADSP is not ready!\n", __func__); - return -ENODEV; - } - - memset(®_top, 0, sizeof(reg_top)); - mutex_lock(&q6core_lcl.cal_data[CUST_TOP_CAL]->lock); - mutex_lock(&q6core_lcl.cmd_lock); - - cal_block = cal_utils_get_only_cal_block( - q6core_lcl.cal_data[CUST_TOP_CAL]); - if (cal_block == NULL) { - pr_debug("%s: cal block is NULL!\n", __func__); - goto unlock; - } - if (cal_block->cal_data.size <= 0) { - pr_debug("%s: cal size is %zd not sending\n", - __func__, cal_block->cal_data.size); - goto unlock; - } - - q6core_dereg_all_custom_topologies(); - - ret = q6core_map_memory_regions(&cal_block->cal_data.paddr, - ADSP_MEMORY_MAP_SHMEM8_4K_POOL, - (uint32_t *)&cal_block->map_data.map_size, 1, - &cal_block->map_data.q6map_handle); - if (ret) { - pr_err("%s: q6core_map_memory_regions failed\n", __func__); - goto unlock; - } - - reg_top.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - reg_top.hdr.pkt_size = sizeof(reg_top); - reg_top.hdr.src_svc = APR_SVC_ADSP_CORE; - reg_top.hdr.src_domain = APR_DOMAIN_APPS; - reg_top.hdr.src_port = 0; - reg_top.hdr.dest_svc = APR_SVC_ADSP_CORE; - reg_top.hdr.dest_domain = APR_DOMAIN_ADSP; - reg_top.hdr.dest_port = 0; - reg_top.hdr.token = 0; - reg_top.hdr.opcode = AVCS_CMD_REGISTER_TOPOLOGIES; - reg_top.payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - reg_top.payload_addr_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - reg_top.mem_map_handle = cal_block->map_data.q6map_handle; - reg_top.payload_size = cal_block->cal_data.size; - - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - - pr_debug("%s: Register topologies addr %pK, size %zd, map handle %d\n", - __func__, &cal_block->cal_data.paddr, cal_block->cal_data.size, - cal_block->map_data.q6map_handle); - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) ®_top); - if (ret < 0) { - pr_err("%s: Register topologies failed %d\n", - __func__, ret); - goto unmap; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout for Register topologies\n", - __func__); - goto unmap; - } - - if (q6core_lcl.adsp_status < 0) - ret = q6core_lcl.adsp_status; -unmap: - ret2 = q6core_memory_unmap_regions(cal_block->map_data.q6map_handle); - if (ret2) { - pr_err("%s: q6core_memory_unmap_regions failed for map handle %d\n", - __func__, cal_block->map_data.q6map_handle); - ret = ret2; - goto unlock; - } - -unlock: - mutex_unlock(&q6core_lcl.cmd_lock); - mutex_unlock(&q6core_lcl.cal_data[CUST_TOP_CAL]->lock); - - return ret; -} - -int q6core_adsp_crash(void) -{ - int ret = 0; - struct avcs_cmd_adsp_crash adsp_crash; - - if (!q6core_is_adsp_ready()) { - pr_err("%s: ADSP is not ready!\n", __func__); - return -ENODEV; - } - - memset(&adsp_crash, 0, sizeof(adsp_crash)); - mutex_lock(&q6core_lcl.cmd_lock); - - adsp_crash.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - adsp_crash.hdr.pkt_size = sizeof(adsp_crash); - adsp_crash.hdr.src_svc = APR_SVC_ADSP_CORE; - adsp_crash.hdr.src_domain = APR_DOMAIN_APPS; - adsp_crash.hdr.dest_svc = APR_SVC_ADSP_CORE; - adsp_crash.hdr.dest_domain = APR_DOMAIN_ADSP; - adsp_crash.hdr.opcode = AVCS_CMD_ADSP_CRASH; - - q6core_lcl.adsp_status = 0; - q6core_lcl.bus_bw_resp_received = 0; - - ret = apr_send_pkt(q6core_lcl.core_handle_q, (uint32_t *) &adsp_crash); - if (ret < 0) { - pr_err("%s: crash ADSP failed %d\n", __func__, ret); - goto unlock; - } - - ret = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS * 5)); - -unlock: - mutex_unlock(&q6core_lcl.cmd_lock); - - return ret; -} -EXPORT_SYMBOL(q6core_adsp_crash); - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case AUDIO_CORE_METAINFO_CAL_TYPE: - ret = META_CAL; - break; - case CORE_CUSTOM_TOPOLOGIES_CAL_TYPE: - ret = CUST_TOP_CAL; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int q6core_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - - ret = cal_utils_alloc_cal(data_size, data, - q6core_lcl.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - goto done; - } -done: - return ret; -} - -static int q6core_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - - ret = cal_utils_dealloc_cal(data_size, data, - q6core_lcl.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - goto done; - } -done: - return ret; -} - -static int q6core_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - - ret = cal_utils_set_cal(data_size, data, - q6core_lcl.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - goto done; - } - - if (cal_index == CUST_TOP_CAL) - ret = q6core_send_custom_topologies(); -done: - return ret; -} - -static void q6core_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(CORE_MAX_CAL, q6core_lcl.cal_data); -} - - -static int q6core_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{AUDIO_CORE_METAINFO_CAL_TYPE, - {q6core_alloc_cal, q6core_dealloc_cal, NULL, - q6core_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CORE_CUSTOM_TOPOLOGIES_CAL_TYPE, - {q6core_alloc_cal, q6core_dealloc_cal, NULL, - q6core_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} } - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(CORE_MAX_CAL, - q6core_lcl.cal_data, cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type!\n", - __func__); - goto err; - } - - return ret; -err: - q6core_delete_cal_data(); - return ret; -} - -int q6core_is_avs_up(int32_t *avs_state) -{ - unsigned long timeout; - int32_t adsp_ready = 0; - int ret = 0; - - timeout = jiffies + - msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); - - /* sleep for 100ms before querying AVS up */ - msleep(100); - do { - adsp_ready = q6core_is_adsp_ready(); - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - if (adsp_ready) - break; - - /* - * ADSP will be coming up after boot up and AVS might - * not be fully up when the control reaches here. - * So, wait for 50msec before checking ADSP state again. - */ - msleep(50); - } while (time_after(timeout, jiffies)); - - *avs_state = adsp_ready; - pr_debug("%s: ADSP Audio is %s\n", __func__, - adsp_ready ? "ready" : "not ready"); - - if (!adsp_ready) { - pr_err_ratelimited("%s: Timeout. ADSP Audio is not ready\n", - __func__); - ret = -ETIMEDOUT; - } - - return ret; -} -EXPORT_SYMBOL(q6core_is_avs_up); - -static int q6core_ssr_enable(struct device *dev, void *data) -{ - int32_t avs_state = 0; - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - if (!q6core_lcl.avs_state) { - ret = q6core_is_avs_up(&avs_state); - if (ret < 0) - goto err; - q6core_lcl.avs_state = avs_state; - } - -err: - return ret; -} - -static void q6core_ssr_disable(struct device *dev, void *data) -{ - /* Reset AVS state to 0 */ - q6core_lcl.avs_state = 0; -} - -static const struct snd_event_ops q6core_ssr_ops = { - .enable = q6core_ssr_enable, - .disable = q6core_ssr_disable, -}; - -static int q6core_probe(struct platform_device *pdev) -{ - int32_t avs_state = 0; - int rc = 0; - - rc = q6core_is_avs_up(&avs_state); - if (rc < 0) - goto err; - q6core_lcl.avs_state = avs_state; - - rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); - if (rc) { - dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n", - __func__, rc); - rc = -EINVAL; - goto err; - } - dev_dbg(&pdev->dev, "%s: added child node\n", __func__); - - rc = snd_event_client_register(&pdev->dev, &q6core_ssr_ops, NULL); - if (!rc) { - snd_event_notify(&pdev->dev, SND_EVENT_UP); - } else { - dev_err(&pdev->dev, - "%s: Registration with SND event fwk failed rc = %d\n", - __func__, rc); - rc = 0; - } - -err: - return rc; -} - -static int q6core_remove(struct platform_device *pdev) -{ - snd_event_client_deregister(&pdev->dev); - of_platform_depopulate(&pdev->dev); - return 0; -} - -static const struct of_device_id q6core_of_match[] = { - { .compatible = "qcom,q6core-audio", }, - {}, -}; - -static struct platform_driver q6core_driver = { - .probe = q6core_probe, - .remove = q6core_remove, - .driver = { - .name = "q6core_audio", - .owner = THIS_MODULE, - .of_match_table = q6core_of_match, - } -}; - -int __init core_init(void) -{ - memset(&q6core_lcl, 0, sizeof(struct q6core_str)); - init_waitqueue_head(&q6core_lcl.bus_bw_req_wait); - init_waitqueue_head(&q6core_lcl.cmd_req_wait); - init_waitqueue_head(&q6core_lcl.avcs_fwk_ver_req_wait); - q6core_lcl.cmd_resp_received_flag = FLAG_NONE; - mutex_init(&q6core_lcl.cmd_lock); - mutex_init(&q6core_lcl.ver_lock); - - q6core_init_cal_data(); - q6core_init_uevent_kset(); - - return platform_driver_register(&q6core_driver); -} - -void core_exit(void) -{ - mutex_destroy(&q6core_lcl.cmd_lock); - mutex_destroy(&q6core_lcl.ver_lock); - q6core_delete_cal_data(); - q6core_destroy_uevent_kset(); - platform_driver_unregister(&q6core_driver); -} -MODULE_DESCRIPTION("ADSP core driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/q6lsm.c b/techpack/audio/dsp/q6lsm.c deleted file mode 100644 index aa864ddbee7b..000000000000 --- a/techpack/audio/dsp/q6lsm.c +++ /dev/null @@ -1,2726 +0,0 @@ -/* - * Copyright (c) 2013-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define APR_TIMEOUT (HZ) -#define LSM_ALIGN_BOUNDARY 512 -#define LSM_SAMPLE_RATE 16000 -#define QLSM_PARAM_ID_MINOR_VERSION 1 -#define QLSM_PARAM_ID_MINOR_VERSION_2 2 - -static int lsm_afe_port; - -enum { - LSM_CUSTOM_TOP_IDX, - LSM_TOP_IDX, - LSM_CAL_IDX, - LSM_MAX_CAL_IDX -}; - -enum { - CMD_STATE_CLEARED = 0, - CMD_STATE_WAIT_RESP = 1, -}; - -enum { - LSM_INVALID_SESSION_ID = 0, - LSM_MIN_SESSION_ID = 1, - LSM_MAX_SESSION_ID = 8, - LSM_CONTROL_SESSION = 0x0F, -}; - -#define CHECK_SESSION(x) (x < LSM_MIN_SESSION_ID || x > LSM_MAX_SESSION_ID) -struct lsm_common { - void *apr; - atomic_t apr_users; - struct lsm_client common_client[LSM_MAX_SESSION_ID + 1]; - - int set_custom_topology; - struct cal_type_data *cal_data[LSM_MAX_CAL_IDX]; - - struct mutex apr_lock; -}; - -static struct lsm_common lsm_common; -static DEFINE_MUTEX(session_lock); - -/* - * mmap_handle_p can point either client->sound_model.mem_map_handle or - * lsm_common.mmap_handle_for_cal. - * mmap_lock must be held while accessing this. - */ -static spinlock_t mmap_lock; -static uint32_t *mmap_handle_p; - -static spinlock_t lsm_session_lock; -static struct lsm_client *lsm_session[LSM_MAX_SESSION_ID + 1]; - -static int q6lsm_mmapcallback(struct apr_client_data *data, void *priv); -static int q6lsm_send_cal(struct lsm_client *client, - u32 set_params_opcode, struct lsm_params_info_v2 *p_info); -static int q6lsm_memory_map_regions(struct lsm_client *client, - dma_addr_t dma_addr_p, uint32_t dma_buf_sz, - uint32_t *mmap_p); -static int q6lsm_memory_unmap_regions(struct lsm_client *client, - uint32_t handle); - -static int q6lsm_get_session_id_from_lsm_client(struct lsm_client *client) -{ - int n; - - for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) { - if (lsm_session[n] == client) - return n; - } - pr_err("%s: cannot find matching lsm client. client = %pa\n", - __func__, client); - return LSM_INVALID_SESSION_ID; -} - -static bool q6lsm_is_valid_lsm_client(struct lsm_client *client) -{ - return q6lsm_get_session_id_from_lsm_client(client) ? 1 : 0; -} - -static int q6lsm_callback(struct apr_client_data *data, void *priv) -{ - struct lsm_client *client = (struct lsm_client *)priv; - uint32_t token; - uint32_t *payload; - - if (!client || !data) { - pr_err("%s: client %pK data %pK\n", - __func__, client, data); - WARN_ON(1); - return -EINVAL; - } - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: SSR event received 0x%x, event 0x%x, proc 0x%x\n", - __func__, data->opcode, data->reset_event, - data->reset_proc); - - mutex_lock(&session_lock); - if (!client || !q6lsm_is_valid_lsm_client(client)) { - pr_err("%s: client already freed/invalid, return\n", - __func__); - mutex_unlock(&session_lock); - return 0; - } - apr_reset(client->apr); - client->apr = NULL; - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - cal_utils_clear_cal_block_q6maps(LSM_MAX_CAL_IDX, - lsm_common.cal_data); - mutex_lock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - lsm_common.set_custom_topology = 1; - mutex_unlock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - mutex_unlock(&session_lock); - return 0; - } - - payload = data->payload; - pr_debug("%s: Session %d opcode 0x%x token 0x%x payload size %d\n" - "payload [0] = 0x%x\n", __func__, client->session, - data->opcode, data->token, data->payload_size, payload[0]); - if (data->opcode == LSM_DATA_EVENT_READ_DONE) { - struct lsm_cmd_read_done read_done; - - token = data->token; - if (data->payload_size > sizeof(read_done) || - data->payload_size < 6 * sizeof(payload[0])) { - pr_err("%s: read done error payload size %d expected size %zd\n", - __func__, data->payload_size, - sizeof(read_done)); - return -EINVAL; - } - pr_debug("%s: opcode %x status %x lsw %x msw %x mem_map handle %x\n", - __func__, data->opcode, payload[0], payload[1], - payload[2], payload[3]); - read_done.status = payload[0]; - read_done.buf_addr_lsw = payload[1]; - read_done.buf_addr_msw = payload[2]; - read_done.mem_map_handle = payload[3]; - read_done.total_size = payload[4]; - read_done.offset = payload[5]; - if (client->cb) - client->cb(data->opcode, data->token, - (void *)&read_done, - sizeof(read_done), - client->priv); - return 0; - } else if (data->opcode == APR_BASIC_RSP_RESULT) { - token = data->token; - switch (payload[0]) { - case LSM_SESSION_CMD_START: - case LSM_SESSION_CMD_STOP: - case LSM_SESSION_CMD_SET_PARAMS: - case LSM_SESSION_CMD_OPEN_TX: - case LSM_SESSION_CMD_CLOSE_TX: - case LSM_SESSION_CMD_REGISTER_SOUND_MODEL: - case LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL: - case LSM_SESSION_CMD_SHARED_MEM_UNMAP_REGIONS: - case LSM_SESSION_CMD_EOB: - case LSM_SESSION_CMD_READ: - case LSM_SESSION_CMD_OPEN_TX_V2: - case LSM_SESSION_CMD_OPEN_TX_V3: - case LSM_CMD_ADD_TOPOLOGIES: - case LSM_SESSION_CMD_SET_PARAMS_V2: - case LSM_SESSION_CMD_SET_PARAMS_V3: - if (token != client->session && - payload[0] != - LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL) { - pr_err("%s: Invalid session %d receivced expected %d\n", - __func__, token, client->session); - return -EINVAL; - } - if (data->payload_size < 2 * sizeof(payload[0])) { - pr_err("%s: payload has invalid size[%d]\n", - __func__, data->payload_size); - return -EINVAL; - } - client->cmd_err_code = payload[1]; - if (client->cmd_err_code) - pr_err("%s: cmd 0x%x failed status %d\n", - __func__, payload[0], client->cmd_err_code); - if (atomic_cmpxchg(&client->cmd_state, - CMD_STATE_WAIT_RESP, - CMD_STATE_CLEARED) == - CMD_STATE_WAIT_RESP) - wake_up(&client->cmd_wait); - break; - default: - pr_debug("%s: Unknown command 0x%x\n", - __func__, payload[0]); - break; - } - return 0; - } - - if (client->cb) - client->cb(data->opcode, data->token, data->payload, - data->payload_size, client->priv); - - return 0; -} - -static int q6lsm_session_alloc(struct lsm_client *client) -{ - unsigned long flags; - int n, ret = -ENOMEM; - - spin_lock_irqsave(&lsm_session_lock, flags); - for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) { - if (!lsm_session[n]) { - lsm_session[n] = client; - ret = n; - break; - } - } - spin_unlock_irqrestore(&lsm_session_lock, flags); - pr_debug("%s: Alloc Session %d", __func__, n); - return ret; -} - -static void q6lsm_session_free(struct lsm_client *client) -{ - unsigned long flags; - - pr_debug("%s: Freeing session ID %d\n", __func__, client->session); - spin_lock_irqsave(&lsm_session_lock, flags); - lsm_session[client->session] = NULL; - spin_unlock_irqrestore(&lsm_session_lock, flags); - client->session = LSM_INVALID_SESSION_ID; -} - -static void *q6lsm_mmap_apr_reg(void) -{ - if (atomic_inc_return(&lsm_common.apr_users) == 1) { - lsm_common.apr = - apr_register("ADSP", "LSM", q6lsm_mmapcallback, - 0x0FFFFFFFF, &lsm_common); - if (!lsm_common.apr) { - pr_debug("%s: Unable to register APR LSM common port\n", - __func__); - atomic_dec(&lsm_common.apr_users); - } - } - return lsm_common.apr; -} - -static int q6lsm_mmap_apr_dereg(void) -{ - if (atomic_read(&lsm_common.apr_users) <= 0) { - WARN("%s: APR common port already closed\n", __func__); - } else { - if (atomic_dec_return(&lsm_common.apr_users) == 0) { - apr_deregister(lsm_common.apr); - pr_debug("%s: APR De-Register common port\n", __func__); - } - } - return 0; -} - -/** - * q6lsm_client_alloc - - * Allocate session for LSM client - * - * @cb: callback fn - * @priv: private data - * - * Returns LSM client handle on success or NULL on failure - */ -struct lsm_client *q6lsm_client_alloc(lsm_app_cb cb, void *priv) -{ - struct lsm_client *client; - int n; - - client = kzalloc(sizeof(struct lsm_client), GFP_KERNEL); - if (!client) - return NULL; - n = q6lsm_session_alloc(client); - if (n <= 0) { - kfree(client); - return NULL; - } - client->session = n; - client->cb = cb; - client->priv = priv; - if (CHECK_SESSION(client->session)) { - pr_err("%s: Client session %d\n", - __func__, client->session); - kfree(client); - return NULL; - } - pr_debug("%s: Client Session %d\n", __func__, client->session); - client->apr = apr_register("ADSP", "LSM", q6lsm_callback, - ((client->session) << 8 | client->session), - client); - - if (client->apr == NULL) { - pr_err("%s: Registration with APR failed\n", __func__); - goto fail; - } - - pr_debug("%s: Registering the common port with APR\n", __func__); - client->mmap_apr = q6lsm_mmap_apr_reg(); - if (!client->mmap_apr) { - pr_err("%s: APR registration failed\n", __func__); - goto fail; - } - - init_waitqueue_head(&client->cmd_wait); - mutex_init(&client->cmd_lock); - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - pr_debug("%s: New client allocated\n", __func__); - return client; -fail: - q6lsm_client_free(client); - return NULL; -} -EXPORT_SYMBOL(q6lsm_client_alloc); - -/** - * q6lsm_client_free - - * Performs LSM client free - * - * @client: LSM client handle - * - */ -void q6lsm_client_free(struct lsm_client *client) -{ - if (!client) - return; - if (CHECK_SESSION(client->session)) { - pr_err("%s: Invalid Session %d\n", __func__, client->session); - return; - } - apr_deregister(client->apr); - client->mmap_apr = NULL; - mutex_lock(&session_lock); - q6lsm_session_free(client); - q6lsm_mmap_apr_dereg(); - mutex_destroy(&client->cmd_lock); - kfree(client); - client = NULL; - mutex_unlock(&session_lock); -} -EXPORT_SYMBOL(q6lsm_client_free); - -/* - * q6lsm_apr_send_pkt : If wait == true, hold mutex to prevent from preempting - * other thread's wait. - * If mmap_handle_p != NULL, disable irq and spin lock to - * protect mmap_handle_p - */ -static int q6lsm_apr_send_pkt(struct lsm_client *client, void *handle, - void *data, bool wait, uint32_t *mmap_p) -{ - int ret; - unsigned long flags = 0; - struct apr_hdr *msg_hdr = (struct apr_hdr *) data; - - if (!handle) { - pr_err("%s: handle is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: enter wait %d\n", __func__, wait); - if (wait) - mutex_lock(&lsm_common.apr_lock); - if (mmap_p) { - WARN_ON(!wait); - spin_lock_irqsave(&mmap_lock, flags); - mmap_handle_p = mmap_p; - } - atomic_set(&client->cmd_state, CMD_STATE_WAIT_RESP); - client->cmd_err_code = 0; - ret = apr_send_pkt(handle, data); - if (mmap_p) - spin_unlock_irqrestore(&mmap_lock, flags); - - if (ret < 0) { - pr_err("%s: apr_send_pkt failed %d\n", __func__, ret); - } else if (wait) { - ret = wait_event_timeout(client->cmd_wait, - (atomic_read(&client->cmd_state) == - CMD_STATE_CLEARED), - APR_TIMEOUT); - if (likely(ret)) { - /* q6 returned error */ - if (client->cmd_err_code) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - client->cmd_err_code)); - ret = adsp_err_get_lnx_err_code( - client->cmd_err_code); - } else { - ret = 0; - } - } else { - pr_err("%s: wait timedout, apr_opcode = 0x%x, size = %d\n", - __func__, msg_hdr->opcode, msg_hdr->pkt_size); - /* ret = 0 means wait timed out */ - ret = -ETIMEDOUT; - } - } else { - ret = 0; - } - if (wait) - mutex_unlock(&lsm_common.apr_lock); - - pr_debug("%s: leave ret %d\n", __func__, ret); - return ret; -} - -static void q6lsm_add_hdr(struct lsm_client *client, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg) -{ - pr_debug("%s: pkt_size %d cmd_flg %d session %d\n", __func__, - pkt_size, cmd_flg, client->session); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = APR_SVC_LSM; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_LSM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = ((client->session << 8) & 0xFF00) | client->session; - hdr->dest_port = ((client->session << 8) & 0xFF00) | client->session; - hdr->pkt_size = pkt_size; - if (cmd_flg) - hdr->token = client->session; -} - -static int q6lsm_pack_params(u8 *dest, struct param_hdr_v3 *param_info, - u8 *param_data, size_t *final_length, - u32 set_param_opcode) -{ - bool iid_supported = q6common_is_instance_id_supported(); - union param_hdrs *param_hdr = NULL; - u32 param_size = param_info->param_size; - size_t hdr_size; - size_t provided_size = *final_length; - - hdr_size = iid_supported ? sizeof(struct param_hdr_v3) : - sizeof(struct param_hdr_v2); - if (provided_size < hdr_size) { - pr_err("%s: Provided size %zu is not large enough, need %zu\n", - __func__, provided_size, hdr_size); - return -EINVAL; - } - - if (iid_supported) { - memcpy(dest, param_info, hdr_size); - } else { - /* MID, PID and structure size are the same in V1 and V2 */ - param_hdr = (union param_hdrs *) dest; - param_hdr->v2.module_id = param_info->module_id; - param_hdr->v2.param_id = param_info->param_id; - - switch (set_param_opcode) { - case LSM_SESSION_CMD_SET_PARAMS_V2: - param_hdr->v2.param_size = param_size; - break; - case LSM_SESSION_CMD_SET_PARAMS: - default: - if (param_size > U16_MAX) { - pr_err("%s: Invalid param size %d\n", __func__, - param_size); - return -EINVAL; - } - - param_hdr->v1.param_size = param_size; - param_hdr->v1.reserved = 0; - break; - } - } - - *final_length = hdr_size; - - if (param_data != NULL) { - if (provided_size < hdr_size + param_size) { - pr_err("%s: Provided size %zu is not large enough, need %zu\n", - __func__, provided_size, hdr_size + param_size); - return -EINVAL; - } - memcpy(dest + hdr_size, param_data, param_size); - *final_length += param_size; - } - return 0; -} - -static int q6lsm_set_params_v2(struct lsm_client *client, - struct mem_mapping_hdr *mem_hdr, - uint8_t *param_data, uint32_t param_size, - uint32_t set_param_opcode) -{ - struct lsm_session_cmd_set_params_v2 *lsm_set_param = NULL; - uint32_t pkt_size = 0; - int ret; - - pkt_size = sizeof(struct lsm_session_cmd_set_params_v2); - /* Only include param size in packet size when inband */ - if (param_data != NULL) - pkt_size += param_size; - - lsm_set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!lsm_set_param) - return -ENOMEM; - - q6lsm_add_hdr(client, &lsm_set_param->apr_hdr, pkt_size, true); - lsm_set_param->apr_hdr.opcode = set_param_opcode; - lsm_set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - lsm_set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - memcpy(lsm_set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both memory header and data\n", - __func__); - ret = -EINVAL; - goto done; - } - - ret = q6lsm_apr_send_pkt(client, client->apr, lsm_set_param, true, - NULL); -done: - kfree(lsm_set_param); - return ret; -} - -static int q6lsm_set_params_v3(struct lsm_client *client, - struct mem_mapping_hdr *mem_hdr, - uint8_t *param_data, uint32_t param_size) -{ - struct lsm_session_cmd_set_params_v3 *lsm_set_param = NULL; - uint16_t pkt_size = 0; - int ret = 0; - - pkt_size = sizeof(struct lsm_session_cmd_set_params_v3); - /* Only include param size in packet size when inband */ - if (param_data != NULL) - pkt_size += param_size; - - lsm_set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!lsm_set_param) - return -ENOMEM; - - q6lsm_add_hdr(client, &lsm_set_param->apr_hdr, pkt_size, true); - lsm_set_param->apr_hdr.opcode = LSM_SESSION_CMD_SET_PARAMS_V3; - lsm_set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - lsm_set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - memcpy(lsm_set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Received NULL pointers for both memory header and data\n", - __func__); - ret = -EINVAL; - goto done; - } - - ret = q6lsm_apr_send_pkt(client, client->apr, lsm_set_param, true, - NULL); -done: - kfree(lsm_set_param); - return ret; -} - -static int q6lsm_set_params(struct lsm_client *client, - struct mem_mapping_hdr *mem_hdr, - uint8_t *param_data, uint32_t param_size, - uint32_t set_param_opcode) - -{ - if (q6common_is_instance_id_supported()) - return q6lsm_set_params_v3(client, mem_hdr, param_data, - param_size); - else - return q6lsm_set_params_v2(client, mem_hdr, param_data, - param_size, set_param_opcode); -} - -static int q6lsm_pack_and_set_params(struct lsm_client *client, - struct param_hdr_v3 *param_info, - uint8_t *param_data, - uint32_t set_param_opcode) - -{ - u8 *packed_data = NULL; - size_t total_size = 0; - int ret = 0; - - total_size = sizeof(union param_hdrs) + param_info->param_size; - packed_data = kzalloc(total_size, GFP_KERNEL); - if (!packed_data) - return -ENOMEM; - - ret = q6lsm_pack_params(packed_data, param_info, param_data, - &total_size, set_param_opcode); - if (ret) - goto done; - - ret = q6lsm_set_params(client, NULL, packed_data, total_size, - set_param_opcode); - -done: - kfree(packed_data); - return ret; -} - -static int q6lsm_send_custom_topologies(struct lsm_client *client) -{ - int rc; - struct cal_block_data *cal_block = NULL; - struct lsm_custom_topologies cstm_top; - - if (lsm_common.cal_data[LSM_CUSTOM_TOP_IDX] == NULL) { - pr_err("%s: LSM_CUSTOM_TOP_IDX invalid\n", __func__); - rc = -EINVAL; - goto done; - } - - lsm_common.set_custom_topology = 0; - - mutex_lock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - cal_block = cal_utils_get_only_cal_block( - lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]); - if (!cal_block) { - pr_err("%s: Cal block for LSM_CUSTOM_TOP_IDX not found\n", - __func__); - rc = -EINVAL; - goto unlock; - } - - if (cal_block->cal_data.size <= 0) { - pr_err("%s: Invalid size for LSM_CUSTOM_TOP %zd\n", - __func__, cal_block->cal_data.size); - rc = -EINVAL; - goto unlock; - } - - memset(&cstm_top, 0, sizeof(cstm_top)); - /* Map the memory for out-of-band data */ - rc = q6lsm_memory_map_regions(client, cal_block->cal_data.paddr, - cal_block->map_data.map_size, - &cal_block->map_data.q6map_handle); - if (rc < 0) { - pr_err("%s: Failed to map custom topologied, err = %d\n", - __func__, rc); - goto unlock; - } - - q6lsm_add_hdr(client, &cstm_top.hdr, - sizeof(cstm_top), true); - cstm_top.hdr.opcode = LSM_CMD_ADD_TOPOLOGIES; - - /* - * For ADD_TOPOLOGIES, the dest_port should be 0 - * Note that source port cannot be zero as it is used - * to route the response to a specific client registered - * on APR - */ - cstm_top.hdr.dest_port = 0; - - cstm_top.data_payload_addr_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cstm_top.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - cal_block->cal_data.paddr); - cstm_top.mem_map_handle = cal_block->map_data.q6map_handle; - cstm_top.buffer_size = cal_block->cal_data.size; - - rc = q6lsm_apr_send_pkt(client, client->apr, - &cstm_top, true, NULL); - if (rc) - pr_err("%s: Failed to add custom top, err = %d\n", - __func__, rc); - /* go ahead and unmap even if custom top failed */ - rc = q6lsm_memory_unmap_regions(client, - cal_block->map_data.q6map_handle); - if (rc) { - pr_err("%s: Failed to unmap, err = %d\n", - __func__, rc); - /* Even if mem unmap failed, treat the cmd as success */ - rc = 0; - } - -unlock: - mutex_unlock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); -done: - return rc; -} - -static int q6lsm_get_topology_for_app_type(struct lsm_client *client, - int app_type, uint32_t *topology) -{ - int rc = -EINVAL; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_lsm_top *lsm_top; - struct list_head *ptr; - - if (lsm_common.cal_data[LSM_TOP_IDX] == NULL) { - pr_err("%s: LSM_TOP_IDX invalid\n", __func__); - return rc; - } - - mutex_lock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); - list_for_each(ptr, &lsm_common.cal_data[LSM_TOP_IDX]->cal_blocks) { - cal_block = list_entry(ptr, struct cal_block_data, list); - if (!cal_block) { - pr_err("%s: Cal block for LSM_TOP_IDX not found\n", - __func__); - break; - } - - lsm_top = (struct audio_cal_info_lsm_top *) cal_block->cal_info; - if (!lsm_top) { - pr_err("%s: cal_info for LSM_TOP_IDX not found\n", - __func__); - break; - } - - pr_debug("%s: checking topology 0x%x, app_type 0x%x\n", - __func__, lsm_top->topology, lsm_top->app_type); - - if (app_type == 0 || lsm_top->app_type == app_type) { - *topology = lsm_top->topology; - rc = 0; - break; - } - } - mutex_unlock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); - - pr_debug("%s: found topology_id = 0x%x, app_type = 0x%x\n", - __func__, *topology, app_type); - - return rc; -} - -static int q6lsm_do_open_v3(struct lsm_client *client) -{ - int rc, app_type; - struct lsm_stream_cmd_open_tx_v3 *open_v3; - size_t cmd_size = 0; - int stage_idx = LSM_STAGE_INDEX_FIRST; - uint32_t topology_id = 0, *uint32_ptr = NULL; - - cmd_size = sizeof(struct lsm_stream_cmd_open_tx_v3); - cmd_size += client->num_stages * sizeof(struct lsm_stream_stage_info); - open_v3 = kzalloc(cmd_size, GFP_KERNEL); - if (!open_v3) - return -ENOMEM; - - q6lsm_add_hdr(client, &open_v3->hdr, cmd_size, true); - open_v3->hdr.opcode = LSM_SESSION_CMD_OPEN_TX_V3; - open_v3->num_stages = client->num_stages; - uint32_ptr = &open_v3->num_stages; - uint32_ptr++; - - for (; stage_idx < client->num_stages; stage_idx++) { - app_type = client->stage_cfg[stage_idx].app_type; - rc = q6lsm_get_topology_for_app_type(client, app_type, &topology_id); - if (rc) { - pr_err("%s: failed to get topology for stage %d\n", - __func__, stage_idx); - return -EINVAL; - } - *uint32_ptr++ = topology_id; - *uint32_ptr++ = client->stage_cfg[stage_idx].lpi_enable; - } - - rc = q6lsm_apr_send_pkt(client, client->apr, open_v3, true, NULL); - if (rc) - pr_err("%s: open_v3 failed, err = %d\n", __func__, rc); - else - client->use_topology = true; - - kfree(open_v3); - return rc; - -} - -static int q6lsm_do_open_v2(struct lsm_client *client, - uint16_t app_id) -{ - int rc; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_lsm_top *lsm_top; - struct lsm_stream_cmd_open_tx_v2 open_v2; - - if (lsm_common.cal_data[LSM_TOP_IDX] == NULL) { - pr_err("%s: LSM_TOP_IDX invalid\n", __func__); - rc = -EINVAL; - goto done; - } - - mutex_lock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); - cal_block = cal_utils_get_only_cal_block( - lsm_common.cal_data[LSM_TOP_IDX]); - if (!cal_block) { - pr_err("%s: Cal block for LSM_TOP_IDX not found\n", - __func__); - rc = -EINVAL; - goto unlock; - } - - lsm_top = (struct audio_cal_info_lsm_top *) - cal_block->cal_info; - if (!lsm_top) { - pr_err("%s: cal_info for LSM_TOP_IDX not found\n", - __func__); - rc = -EINVAL; - goto unlock; - } - - pr_debug("%s: topology_id = 0x%x, app_type = 0x%x\n", - __func__, lsm_top->topology, lsm_top->app_type); - - if (lsm_top->topology == 0) { - pr_err("%s: toplogy id not sent for app_type 0x%x\n", - __func__, lsm_top->app_type); - rc = -EINVAL; - goto unlock; - } - - client->app_id = lsm_top->app_type; - memset(&open_v2, 0, sizeof(open_v2)); - q6lsm_add_hdr(client, &open_v2.hdr, - sizeof(open_v2), true); - open_v2.topology_id = lsm_top->topology; - open_v2.hdr.opcode = LSM_SESSION_CMD_OPEN_TX_V2; - - rc = q6lsm_apr_send_pkt(client, client->apr, - &open_v2, true, NULL); - if (rc) - pr_err("%s: open_v2 failed, err = %d\n", - __func__, rc); - else - client->use_topology = true; -unlock: - mutex_unlock(&lsm_common.cal_data[LSM_TOP_IDX]->lock); -done: - return rc; - -} - -/** - * q6lsm_sm_set_param_data - - * Update sound model param data - * - * @client: LSM client handle - * @p_info: param info - * @offset: pointer to retrieve size - * - */ -void q6lsm_sm_set_param_data(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, - size_t *offset) -{ - struct param_hdr_v3 param_hdr; - int ret; - struct lsm_sound_model *sm; - - sm = &client->stage_cfg[p_info->stage_idx].sound_model; - memset(¶m_hdr, 0, sizeof(param_hdr)); - - param_hdr.module_id = p_info->module_id; - param_hdr.instance_id = p_info->instance_id; - param_hdr.param_id = p_info->param_id; - param_hdr.param_size = p_info->param_size; - - ret = q6lsm_pack_params(sm->data, ¶m_hdr, - NULL, offset, LSM_SESSION_CMD_SET_PARAMS_V2); - if (ret) - pr_err("%s: Failed to pack params, error %d\n", __func__, ret); -} -EXPORT_SYMBOL(q6lsm_sm_set_param_data); - -/** - * q6lsm_support_multi_stage_detection - - * check for multi-stage support in adsp lsm framework service - * - * Returns true if multi-stage support available, else false - */ -bool q6lsm_adsp_supports_multi_stage_detection(void) -{ - return q6core_get_avcs_api_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_LSM_V) >= LSM_API_VERSION_V3; -} -EXPORT_SYMBOL(q6lsm_adsp_supports_multi_stage_detection); - -/** - * q6lsm_open - - * command to open LSM session - * - * @client: LSM client handle - * @app_id: App ID for LSM - * - * Returns 0 on success or error on failure - */ -int q6lsm_open(struct lsm_client *client, uint16_t app_id) -{ - int rc = 0; - struct lsm_stream_cmd_open_tx open; - - /* Add Custom topologies if needed */ - if (lsm_common.set_custom_topology) { - rc = q6lsm_send_custom_topologies(client); - if (rc) - pr_err("%s: Failed to send cust_top, err = %d\n", - __func__, rc); - } - - /* Try to open with topology first */ - if ((client->stage_cfg[LSM_STAGE_INDEX_FIRST].app_type != 0) && - q6lsm_adsp_supports_multi_stage_detection()) - rc = q6lsm_do_open_v3(client); - else - rc = q6lsm_do_open_v2(client, app_id); - if (!rc) - /* open_v2/v3 was successful */ - goto done; - - pr_debug("%s: try without topology\n", - __func__); - - memset(&open, 0, sizeof(open)); - q6lsm_add_hdr(client, &open.hdr, sizeof(open), true); - switch (client->app_id) { - case LSM_VOICE_WAKEUP_APP_ID_V2: - open.app_id = client->app_id; - break; - default: - pr_err("%s: default err 0x%x\n", __func__, client->app_id); - rc = -EINVAL; - break; - } - - open.sampling_rate = LSM_SAMPLE_RATE; - open.hdr.opcode = LSM_SESSION_CMD_OPEN_TX; - rc = q6lsm_apr_send_pkt(client, client->apr, - &open, true, NULL); - if (rc) - pr_err("%s: Open failed opcode 0x%x, rc %d\n", - __func__, open.hdr.opcode, rc); - else - client->use_topology = false; -done: - pr_debug("%s: leave %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_open); - -static int q6lsm_send_confidence_levels(struct lsm_client *client, - struct param_hdr_v3 *param_info, - uint32_t set_param_opcode) -{ - struct lsm_param_confidence_levels *conf_levels = NULL; - uint32_t num_conf_levels = client->num_confidence_levels; - uint8_t i = 0; - uint8_t padd_size = 0; - uint32_t param_size = 0; - int rc = 0; - - /* Data must be 4 byte aligned so add any necessary padding. */ - padd_size = (4 - (num_conf_levels % 4)) - 1; - param_size = (sizeof(uint8_t) + num_conf_levels + padd_size) * - sizeof(uint8_t); - param_info->param_size = param_size; - pr_debug("%s: Set Conf Levels PARAM SIZE = %d\n", __func__, param_size); - - conf_levels = kzalloc(param_size, GFP_KERNEL); - if (!conf_levels) - return -ENOMEM; - - conf_levels->num_confidence_levels = num_conf_levels; - pr_debug("%s: Num conf_level = %d\n", __func__, num_conf_levels); - - memcpy(conf_levels->confidence_levels, client->confidence_levels, - num_conf_levels); - for (i = 0; i < num_conf_levels; i++) - pr_debug("%s: Confidence_level[%d] = %d\n", __func__, i, - conf_levels->confidence_levels[i]); - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) conf_levels, - set_param_opcode); - if (rc) - pr_err("%s: Send confidence_levels cmd failed, err = %d\n", - __func__, rc); - kfree(conf_levels); - return rc; -} - -static int q6lsm_send_param_opmode(struct lsm_client *client, - struct param_hdr_v3 *param_info, - u32 set_param_opcode) -{ - struct lsm_param_op_mode op_mode; - int rc = 0; - - memset(&op_mode, 0, sizeof(op_mode)); - param_info->param_size = sizeof(op_mode); - - op_mode.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - op_mode.mode = client->mode; - pr_debug("%s: mode = 0x%x", __func__, op_mode.mode); - - rc = q6lsm_pack_and_set_params(client, param_info, (uint8_t *) &op_mode, - set_param_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - - pr_debug("%s: leave %d\n", __func__, rc); - return rc; -} - -/** - * set_lsm_port - - * Update LSM AFE port - * - */ -void set_lsm_port(int lsm_port) -{ - lsm_afe_port = lsm_port; -} -EXPORT_SYMBOL(set_lsm_port); - -int get_lsm_port(void) -{ - return lsm_afe_port; -} - -/** - * q6lsm_set_port_connected - - * command to set LSM port connected - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_port_connected(struct lsm_client *client) -{ - struct lsm_param_connect_to_port connect_port; - struct param_hdr_v3 connectport_hdr; - u32 set_param_opcode = 0; - int rc = 0; - - memset(&connect_port, 0, sizeof(connect_port)); - memset(&connectport_hdr, 0, sizeof(connectport_hdr)); - - if (client->use_topology) { - set_param_opcode = LSM_SESSION_CMD_SET_PARAMS_V2; - connectport_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - } else { - set_param_opcode = LSM_SESSION_CMD_SET_PARAMS; - connectport_hdr.module_id = LSM_MODULE_ID_VOICE_WAKEUP; - } - connectport_hdr.instance_id = INSTANCE_ID_0; - connectport_hdr.param_id = LSM_PARAM_ID_CONNECT_TO_PORT; - connectport_hdr.param_size = sizeof(connect_port); - - client->connect_to_port = get_lsm_port(); - connect_port.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - connect_port.port_id = client->connect_to_port; - - rc = q6lsm_pack_and_set_params(client, &connectport_hdr, - (uint8_t *) &connect_port, - set_param_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_set_port_connected); - -static int q6lsm_send_param_polling_enable(struct lsm_client *client, - bool poll_en, - struct param_hdr_v3 *param_info, - u32 set_param_opcode) -{ - struct lsm_param_poll_enable polling_enable; - int rc = 0; - - memset(&polling_enable, 0, sizeof(polling_enable)); - param_info->param_size = sizeof(polling_enable); - - polling_enable.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - polling_enable.polling_enable = (poll_en) ? 1 : 0; - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) &polling_enable, - set_param_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - return rc; -} - -/** - * q6lsm_set_fwk_mode_cfg - - * command to set LSM fwk mode cfg - * - * @client: LSM client handle - * @event_mode: mode for fwk cfg - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_fwk_mode_cfg(struct lsm_client *client, - uint32_t event_mode) -{ - struct lsm_param_fwk_mode_cfg fwk_mode_cfg; - struct param_hdr_v3 fwk_mode_cfg_hdr; - int rc = 0; - - memset(&fwk_mode_cfg, 0, sizeof(fwk_mode_cfg)); - memset(&fwk_mode_cfg_hdr, 0, sizeof(fwk_mode_cfg_hdr)); - - if (!client->use_topology) { - pr_debug("%s: Ignore sending event mode\n", __func__); - return rc; - } - - fwk_mode_cfg_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - fwk_mode_cfg_hdr.instance_id = INSTANCE_ID_0; - fwk_mode_cfg_hdr.param_id = LSM_PARAM_ID_FWK_MODE_CONFIG; - fwk_mode_cfg_hdr.param_size = sizeof(fwk_mode_cfg); - - fwk_mode_cfg.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - fwk_mode_cfg.mode = event_mode; - pr_debug("%s: mode = %d\n", __func__, fwk_mode_cfg.mode); - - rc = q6lsm_pack_and_set_params(client, &fwk_mode_cfg_hdr, - (uint8_t *) &fwk_mode_cfg, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_set_fwk_mode_cfg); - -static int q6lsm_arrange_mch_map(uint8_t *ch_map, int ch_cnt) -{ - int ch_idx; - u8 mch_map[LSM_V3P0_MAX_NUM_CHANNELS] = { - PCM_CHANNEL_FL, PCM_CHANNEL_FR, PCM_CHANNEL_FC, - PCM_CHANNEL_LS, PCM_CHANNEL_RS, PCM_CHANNEL_LFE, - PCM_CHANNEL_LB, PCM_CHANNEL_RB, PCM_CHANNEL_CS}; - - - if (ch_cnt > LSM_V3P0_MAX_NUM_CHANNELS) { - pr_err("%s: invalid num_chan %d\n", __func__, ch_cnt); - return -EINVAL; - } - - if (ch_cnt == 1) { - ch_map[0] = PCM_CHANNEL_FC; - } else if (ch_cnt == 4) { - ch_map[0] = PCM_CHANNEL_FL; - ch_map[1] = PCM_CHANNEL_FR; - ch_map[2] = PCM_CHANNEL_LS; - ch_map[3] = PCM_CHANNEL_RS; - } else { - for (ch_idx = 0; ch_idx < ch_cnt; ch_idx++) - ch_map[ch_idx] = mch_map[ch_idx]; - } - - return 0; -} - -/** - * q6lsm_set_media_fmt_params - - * command to set LSM media fmt params - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_media_fmt_params(struct lsm_client *client) -{ - struct lsm_param_media_fmt media_fmt; - struct lsm_hw_params in_param = client->in_hw_params; - struct param_hdr_v3 media_fmt_hdr; - int rc = 0; - - memset(&media_fmt, 0, sizeof(media_fmt)); - memset(&media_fmt_hdr, 0, sizeof(media_fmt_hdr)); - - if (!client->use_topology) { - pr_debug("%s: Ignore sending media format\n", __func__); - goto err_ret; - } - - media_fmt_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - media_fmt_hdr.instance_id = INSTANCE_ID_0; - media_fmt_hdr.param_id = LSM_PARAM_ID_MEDIA_FMT; - media_fmt_hdr.param_size = sizeof(media_fmt); - - media_fmt.minor_version = QLSM_PARAM_ID_MINOR_VERSION_2; - media_fmt.sample_rate = in_param.sample_rate; - media_fmt.num_channels = in_param.num_chs; - media_fmt.bit_width = in_param.sample_size; - rc = q6lsm_arrange_mch_map(media_fmt.channel_mapping, - media_fmt.num_channels); - if (rc) - goto err_ret; - - pr_debug("%s: sample rate= %d, channels %d bit width %d\n", __func__, - media_fmt.sample_rate, media_fmt.num_channels, - media_fmt.bit_width); - - rc = q6lsm_pack_and_set_params(client, &media_fmt_hdr, - (uint8_t *) &media_fmt, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); -err_ret: - return rc; -} -EXPORT_SYMBOL(q6lsm_set_media_fmt_params); - -/* - * q6lsm_set_media_fmt_v2_params - - * command to set LSM media fmt (version2) params - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_media_fmt_v2_params(struct lsm_client *client) -{ - u8 *param_buf; - struct lsm_param_media_fmt_v2 *media_fmt_v2; - struct lsm_hw_params *in_param = &client->in_hw_params; - struct param_hdr_v3 media_fmt_v2_hdr; - int param_len = 0, rc = 0; - - memset(&media_fmt_v2_hdr, 0, sizeof(media_fmt_v2_hdr)); - - param_len = sizeof(*media_fmt_v2) + - (sizeof(uint8_t) * in_param->num_chs); - - /* Add padding to make sure total length is 4-byte aligned */ - if (param_len % 4) - param_len += (4 - (param_len % 4)); - - param_buf = kzalloc(param_len, GFP_KERNEL); - if (!param_buf) - return -ENOMEM; - media_fmt_v2 = (struct lsm_param_media_fmt_v2 *) param_buf; - media_fmt_v2->minor_version = QLSM_PARAM_ID_MINOR_VERSION; - media_fmt_v2->sample_rate = in_param->sample_rate; - media_fmt_v2->num_channels = in_param->num_chs; - media_fmt_v2->bit_width = in_param->sample_size; - rc = q6lsm_arrange_mch_map(media_fmt_v2->channel_mapping, - in_param->num_chs); - if (rc) - goto err_mch_map; - - media_fmt_v2_hdr.module_id = LSM_MODULE_ID_FRAMEWORK; - media_fmt_v2_hdr.instance_id = INSTANCE_ID_0; - media_fmt_v2_hdr.param_id = LSM_PARAM_ID_MEDIA_FMT_V2; - media_fmt_v2_hdr.param_size = param_len; - - pr_debug("%s: sample rate= %d, channels %d bit width %d\n", __func__, - media_fmt_v2->sample_rate, media_fmt_v2->num_channels, - media_fmt_v2->bit_width); - - rc = q6lsm_pack_and_set_params(client, &media_fmt_v2_hdr, - param_buf, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - -err_mch_map: - kfree(param_buf); - return rc; -} -EXPORT_SYMBOL(q6lsm_set_media_fmt_v2_params); - -/** - * q6lsm_set_data - - * Command to set LSM data - * - * @client: LSM client handle - * @mode: LSM detection mode value - * @detectfailure: flag for detect failure - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_data(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure) -{ - struct param_hdr_v3 param_hdr; - int rc = 0; - struct lsm_params_info_v2 p_info = {0}; - - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (!client->confidence_levels) { - /* - * It is possible that confidence levels are - * not provided. This is not a error condition. - * Return gracefully without any error - */ - pr_debug("%s: no conf levels to set\n", - __func__); - return rc; - } - - if (mode == LSM_MODE_KEYWORD_ONLY_DETECTION) { - client->mode = 0x01; - } else if (mode == LSM_MODE_USER_KEYWORD_DETECTION) { - client->mode = 0x03; - } else { - pr_err("%s: Incorrect detection mode %d\n", __func__, mode); - rc = -EINVAL; - goto err_ret; - } - client->mode |= detectfailure << 2; - - param_hdr.module_id = LSM_MODULE_ID_VOICE_WAKEUP; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_id = LSM_PARAM_ID_OPERATION_MODE; - rc = q6lsm_send_param_opmode(client, ¶m_hdr, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Failed to set lsm config params %d\n", - __func__, rc); - goto err_ret; - } - - param_hdr.param_id = LSM_PARAM_ID_MIN_CONFIDENCE_LEVELS; - rc = q6lsm_send_confidence_levels(client, ¶m_hdr, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Failed to send conf_levels, err = %d\n", - __func__, rc); - goto err_ret; - } - - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - rc = q6lsm_send_cal(client, LSM_SESSION_CMD_SET_PARAMS, &p_info); - if (rc) { - pr_err("%s: Failed to send calibration data %d\n", - __func__, rc); - goto err_ret; - } - -err_ret: - return rc; -} -EXPORT_SYMBOL(q6lsm_set_data); - -/** - * q6lsm_register_sound_model - - * Register LSM snd model - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_register_sound_model(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure) -{ - int rc; - struct lsm_cmd_reg_snd_model cmd; - struct lsm_sound_model *sm; - - memset(&cmd, 0, sizeof(cmd)); - rc = q6lsm_set_data(client, mode, detectfailure); - if (rc) { - pr_err("%s: Failed to set lsm data, err = %d\n", - __func__, rc); - return rc; - } - - sm = &client->stage_cfg[LSM_STAGE_INDEX_FIRST].sound_model; - - q6lsm_add_hdr(client, &cmd.hdr, sizeof(cmd), true); - cmd.hdr.opcode = LSM_SESSION_CMD_REGISTER_SOUND_MODEL; - cmd.model_addr_lsw = lower_32_bits(sm->phys); - cmd.model_addr_msw = msm_audio_populate_upper_32_bits(sm->phys); - cmd.model_size = sm->size; - /* read updated mem_map_handle by q6lsm_mmapcallback */ - rmb(); - cmd.mem_map_handle = sm->mem_map_handle; - - pr_debug("%s: addr %pK, size %d, handle 0x%x\n", __func__, - &sm->phys, cmd.model_size, cmd.mem_map_handle); - rc = q6lsm_apr_send_pkt(client, client->apr, &cmd, true, NULL); - if (rc) - pr_err("%s: Failed cmd op[0x%x]rc[%d]\n", __func__, - cmd.hdr.opcode, rc); - else - pr_debug("%s: Register sound model succeeded\n", __func__); - - return rc; -} -EXPORT_SYMBOL(q6lsm_register_sound_model); - -/** - * q6lsm_deregister_sound_model - - * De-register LSM snd model - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_deregister_sound_model(struct lsm_client *client) -{ - int rc; - struct lsm_cmd_reg_snd_model cmd; - /* - * With multi-stage support sm buff allocation/free usage param info - * to check stage index for which this sound model is being set, and - * to check whether sm data is sent using set param command or not. - * Hence, set param ids to '0' to indicate allocation is for legacy - * reg_sm cmd, where buffer for param header need not be allocated, - * also set stage index to LSM_STAGE_INDEX_FIRST. - */ - struct lsm_params_info_v2 p_info = {0}; - p_info.stage_idx = LSM_STAGE_INDEX_FIRST; - - if (!client) { - pr_err("APR handle NULL\n"); - return -EINVAL; - } - if (!client->apr) { - pr_err("APR client handle NULL\n"); - return -EINVAL; - } - - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - - memset(&cmd, 0, sizeof(cmd)); - q6lsm_add_hdr(client, &cmd.hdr, sizeof(cmd.hdr), false); - cmd.hdr.opcode = LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL; - - rc = q6lsm_apr_send_pkt(client, client->apr, &cmd.hdr, true, NULL); - if (rc) { - pr_err("%s: Failed cmd opcode 0x%x, rc %d\n", __func__, - cmd.hdr.opcode, rc); - } else { - pr_debug("%s: Deregister sound model succeeded\n", __func__); - } - - q6lsm_snd_model_buf_free(client, &p_info); - - return rc; -} -EXPORT_SYMBOL(q6lsm_deregister_sound_model); - -static void q6lsm_add_mmaphdr(struct lsm_client *client, struct apr_hdr *hdr, - u32 pkt_size, u32 cmd_flg, u32 token) -{ - pr_debug("%s: pkt size=%d cmd_flg=%d session=%d\n", __func__, pkt_size, - cmd_flg, client->session); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->src_port = 0x00; - hdr->dest_port = client->session; - if (cmd_flg) - hdr->token = token; - hdr->pkt_size = pkt_size; -} - -static int q6lsm_memory_map_regions(struct lsm_client *client, - dma_addr_t dma_addr_p, uint32_t dma_buf_sz, - uint32_t *mmap_p) -{ - struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; - struct avs_shared_map_region_payload *mregions = NULL; - void *mmap_region_cmd = NULL; - void *payload = NULL; - int rc; - int cmd_size = 0; - - pr_debug("%s: dma_addr_p 0x%pK, dma_buf_sz %d, mmap_p 0x%pK, session %d\n", - __func__, &dma_addr_p, dma_buf_sz, mmap_p, - client->session); - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) + - sizeof(struct avs_shared_map_region_payload); - - mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL); - if (!mmap_region_cmd) - return -ENOMEM; - - mmap_regions = (struct avs_cmd_shared_mem_map_regions *)mmap_region_cmd; - q6lsm_add_mmaphdr(client, &mmap_regions->hdr, cmd_size, true, - (client->session << 8)); - - mmap_regions->hdr.opcode = LSM_SESSION_CMD_SHARED_MEM_MAP_REGIONS; - mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - mmap_regions->num_regions = 1; - mmap_regions->property_flag = 0x00; - payload = ((u8 *)mmap_region_cmd + - sizeof(struct avs_cmd_shared_mem_map_regions)); - mregions = (struct avs_shared_map_region_payload *)payload; - - mregions->shm_addr_lsw = lower_32_bits(dma_addr_p); - mregions->shm_addr_msw = msm_audio_populate_upper_32_bits(dma_addr_p); - mregions->mem_size_bytes = dma_buf_sz; - - rc = q6lsm_apr_send_pkt(client, client->mmap_apr, mmap_region_cmd, - true, mmap_p); - if (rc) - pr_err("%s: Failed mmap_regions opcode 0x%x, rc %d\n", - __func__, mmap_regions->hdr.opcode, rc); - - pr_debug("%s: leave %d\n", __func__, rc); - kfree(mmap_region_cmd); - return rc; -} - -static int q6lsm_memory_unmap_regions(struct lsm_client *client, - uint32_t handle) -{ - struct avs_cmd_shared_mem_unmap_regions unmap; - int rc = 0; - int cmd_size = 0; - - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - cmd_size = sizeof(struct avs_cmd_shared_mem_unmap_regions); - q6lsm_add_mmaphdr(client, &unmap.hdr, cmd_size, - true, (client->session << 8)); - unmap.hdr.opcode = LSM_SESSION_CMD_SHARED_MEM_UNMAP_REGIONS; - unmap.mem_map_handle = handle; - - pr_debug("%s: unmap handle 0x%x\n", __func__, unmap.mem_map_handle); - rc = q6lsm_apr_send_pkt(client, client->mmap_apr, &unmap, true, - NULL); - if (rc) - pr_err("%s: Failed mmap_regions opcode 0x%x rc %d\n", - __func__, unmap.hdr.opcode, rc); - - return rc; -} - -static int q6lsm_send_cal(struct lsm_client *client, - u32 set_params_opcode, struct lsm_params_info_v2 *p_info) -{ - int rc = 0, stage_idx = p_info->stage_idx; - struct mem_mapping_hdr mem_hdr; - dma_addr_t lsm_cal_phy_addr; - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - - pr_debug("%s: Session id %d\n", __func__, client->session); - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - - lsm_cal_phy_addr = client->stage_cfg[stage_idx].cal_info.phys; - if (lsm_cal_phy_addr != 0) { - lsm_common.common_client[client->session].session = client->session; - mem_hdr.data_payload_addr_lsw = lower_32_bits(lsm_cal_phy_addr); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(lsm_cal_phy_addr); - mem_hdr.mem_map_handle = - client->stage_cfg[stage_idx].cal_info.mem_map_handle; - - rc = q6lsm_set_params(client, &mem_hdr, NULL, - client->stage_cfg[stage_idx].cal_info.size, set_params_opcode); - if (rc) - pr_err("%s: Failed set_params, rc %d\n", __func__, rc); - } - - return rc; -} - -static int q6lsm_snd_cal_free(struct lsm_client *client, - struct lsm_params_info_v2 *p_info) -{ - int rc = 0, stage_idx = p_info->stage_idx; - struct lsm_cal_data_info *cal = NULL; - - if (!client->stage_cfg[stage_idx].cal_info.data) - return 0; - - mutex_lock(&client->cmd_lock); - cal = &client->stage_cfg[stage_idx].cal_info; - if (cal->mem_map_handle != 0) { - rc = q6lsm_memory_unmap_regions(client, cal->mem_map_handle); - if (rc) - pr_err("%s: CMD Memory_unmap_regions failed %d\n", - __func__, rc); - cal->mem_map_handle = 0; - } - msm_audio_ion_free(cal->dma_buf); - cal->dma_buf = NULL; - cal->data = NULL; - cal->phys = 0; - mutex_unlock(&client->cmd_lock); - - return rc; -} - -static int q6lsm_snd_cal_alloc(struct lsm_client *client, - struct lsm_params_info_v2 *p_info) -{ - int rc = 0; - size_t len = 0, total_mem = 0; - struct lsm_cal_data_info *cal = NULL; - struct cal_block_data *cal_block = NULL; - struct audio_cal_info_lsm *lsm_cal_info = NULL; - struct list_head *ptr = NULL; - int app_type, stage_idx = p_info->stage_idx; - bool cal_block_found = false; - - app_type = client->stage_cfg[stage_idx].app_type; - pr_debug("%s: app_type %d, stage_idx %d\n", - __func__, app_type, stage_idx); - - mutex_lock(&client->cmd_lock); - mutex_lock(&lsm_common.cal_data[LSM_CAL_IDX]->lock); - list_for_each(ptr, &lsm_common.cal_data[LSM_CAL_IDX]->cal_blocks) { - cal_block = list_entry(ptr, struct cal_block_data, list); - lsm_cal_info = (struct audio_cal_info_lsm *) - (cal_block) ? cal_block->cal_info : NULL; - if ((cal_block && cal_block->cal_data.paddr) && - (lsm_cal_info != NULL) && - (app_type == 0 || app_type == lsm_cal_info->app_type)) { - cal_block_found = true; - len = cal_block->cal_data.size; - break; - } - } - - if (!cal_block_found) { - pr_info("%s: cal not found for stage_idx %d\n", __func__, stage_idx); - goto exit; - } - - if (!len) { - pr_debug("%s: cal size is 0, for stage_idx %d\n", __func__, stage_idx); - goto exit; - } - - cal = &client->stage_cfg[stage_idx].cal_info; - if (cal->data) { - pr_debug("%s: cal data for stage_idx(%d) is already set \n", - __func__, stage_idx); - goto exit; - } - - cal->size = len; - total_mem = PAGE_ALIGN(len); - pr_debug("%s: cal info data size %zd Total mem %zd, stage_idx %d\n", - __func__, len, total_mem, stage_idx); - - rc = msm_audio_ion_alloc(&cal->dma_buf, total_mem, - &cal->phys, &len, &cal->data); - if (rc) { - pr_err("%s: Audio ION alloc is failed for stage_idx %d, rc = %d\n", - __func__, stage_idx, rc); - cal->dma_buf = NULL; - cal->data = NULL; - goto exit; - } - - memcpy(cal->data, (uint32_t *)cal_block->cal_data.kvaddr, cal->size); - mutex_unlock(&lsm_common.cal_data[LSM_CAL_IDX]->lock); - mutex_unlock(&client->cmd_lock); - rc = q6lsm_memory_map_regions(client, cal->phys, len, &cal->mem_map_handle); - if (rc) { - pr_err("%s: CMD Memory_map_regions failed for stage_idx %d, rc = %d\n", - __func__, stage_idx, rc); - cal->mem_map_handle = 0; - goto fail; - } - - return 0; - -exit: - mutex_unlock(&client->cmd_lock); - mutex_unlock(&lsm_common.cal_data[LSM_CAL_IDX]->lock); -fail: - q6lsm_snd_cal_free(client, p_info); - return rc; -} - -/** - * q6lsm_snd_model_buf_free - - * Free memory for LSM snd model - * - * @client: LSM client handle - * @p_info: sound model param info - * - * Returns 0 on success or error on failure - */ -int q6lsm_snd_model_buf_free(struct lsm_client *client, - struct lsm_params_info_v2 *p_info) -{ - int rc = 0, stage_idx = p_info->stage_idx; - struct lsm_sound_model *sm = NULL; - - pr_debug("%s: Session id %d\n", __func__, client->session); - if (CHECK_SESSION(client->session)) { - pr_err("%s: session[%d]", __func__, client->session); - return -EINVAL; - } - - if (!client->stage_cfg[stage_idx].sound_model.data) - return 0; - - mutex_lock(&client->cmd_lock); - sm = &client->stage_cfg[stage_idx].sound_model; - if (sm->mem_map_handle != 0) { - rc = q6lsm_memory_unmap_regions(client, sm->mem_map_handle); - if (rc) - pr_err("%s: CMD Memory_unmap_regions failed %d\n", - __func__, rc); - sm->mem_map_handle = 0; - } - msm_audio_ion_free(sm->dma_buf); - sm->dma_buf = NULL; - sm->data = NULL; - sm->phys = 0; - mutex_unlock(&client->cmd_lock); - - rc = q6lsm_snd_cal_free(client, p_info); - return rc; -} -EXPORT_SYMBOL(q6lsm_snd_model_buf_free); - -static struct lsm_client *q6lsm_get_lsm_client(int session_id) -{ - unsigned long flags; - struct lsm_client *client = NULL; - - spin_lock_irqsave(&lsm_session_lock, flags); - if (session_id < LSM_MIN_SESSION_ID || session_id > LSM_MAX_SESSION_ID) - pr_err("%s: Invalid session %d\n", __func__, session_id); - else if (!lsm_session[session_id]) - pr_err("%s: Not an active session %d\n", __func__, session_id); - else - client = lsm_session[session_id]; - spin_unlock_irqrestore(&lsm_session_lock, flags); - return client; -} - -/* - * q6lsm_mmapcallback : atomic context - */ -static int q6lsm_mmapcallback(struct apr_client_data *data, void *priv) -{ - unsigned long flags; - uint32_t command; - uint32_t retcode; - uint32_t sid; - const uint32_t *payload = data->payload; - struct lsm_client *client = NULL; - - if (data->opcode == RESET_EVENTS) { - sid = (data->token >> 8) & 0x0F; - pr_debug("%s: SSR event received 0x%x, event 0x%x,\n" - "proc 0x%x SID 0x%x\n", __func__, data->opcode, - data->reset_event, data->reset_proc, sid); - - if (sid < LSM_MIN_SESSION_ID || sid > LSM_MAX_SESSION_ID) - pr_err("%s: Invalid session %d\n", __func__, sid); - apr_reset(lsm_common.apr); - lsm_common.apr = NULL; - atomic_set(&lsm_common.apr_users, 0); - cal_utils_clear_cal_block_q6maps(LSM_MAX_CAL_IDX, - lsm_common.cal_data); - lsm_common.set_custom_topology = 1; - return 0; - } - - command = payload[0]; - retcode = payload[1]; - sid = (data->token >> 8) & 0x0F; - pr_debug("%s: opcode 0x%x command 0x%x return code 0x%x SID 0x%x\n", - __func__, data->opcode, command, retcode, sid); - client = q6lsm_get_lsm_client(sid); - if (!client) { - pr_debug("%s: Session %d already freed\n", __func__, sid); - return 0; - } - - switch (data->opcode) { - case LSM_SESSION_CMDRSP_SHARED_MEM_MAP_REGIONS: - if (atomic_read(&client->cmd_state) == CMD_STATE_WAIT_RESP) { - spin_lock_irqsave(&mmap_lock, flags); - *mmap_handle_p = command; - /* spin_unlock_irqrestore implies barrier */ - spin_unlock_irqrestore(&mmap_lock, flags); - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - } - break; - case APR_BASIC_RSP_RESULT: - switch (command) { - case LSM_SESSION_CMD_SHARED_MEM_UNMAP_REGIONS: - atomic_set(&client->cmd_state, CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - break; - case LSM_SESSION_CMD_SHARED_MEM_MAP_REGIONS: - if (retcode != 0) { - /* error state, signal to stop waiting */ - if (atomic_read(&client->cmd_state) == - CMD_STATE_WAIT_RESP) { - spin_lock_irqsave(&mmap_lock, flags); - /* implies barrier */ - spin_unlock_irqrestore(&mmap_lock, - flags); - atomic_set(&client->cmd_state, - CMD_STATE_CLEARED); - wake_up(&client->cmd_wait); - } - } - break; - default: - pr_warn("%s: Unexpected command 0x%x\n", __func__, - command); - } - /* fallthrough */ - default: - pr_debug("%s: command 0x%x return code 0x%x opcode 0x%x\n", - __func__, command, retcode, data->opcode); - break; - } - if (client->cb) - client->cb(data->opcode, data->token, - data->payload, data->payload_size, - client->priv); - return 0; -} - -/** - * q6lsm_snd_model_buf_alloc - - * Allocate memory for LSM snd model - * - * @client: LSM client handle - * @len: size of sound model - * @p_info: sound model param info - * p_info->param_id != 0 when using set param to register sound model - * - * Returns 0 on success or error on failure - */ -int q6lsm_snd_model_buf_alloc(struct lsm_client *client, size_t len, - struct lsm_params_info_v2 *p_info) -{ - int rc = -EINVAL, stage_idx = p_info->stage_idx; - size_t total_mem = 0; - struct lsm_sound_model *sm = NULL; - - if (!client || len <= LSM_ALIGN_BOUNDARY) - return rc; - - pr_debug("%s:Snd Model len = %zd, stage idx %d\n", - __func__, len, stage_idx); - - mutex_lock(&client->cmd_lock); - sm = &client->stage_cfg[stage_idx].sound_model; - if (!sm->data) { - /* - * If sound model is sent as set_param, i.e. param_id != 0, - * Then memory needs to be allocated for - * set_param payload as well. - */ - if (p_info->param_id != 0) - len += sizeof(union param_hdrs); - - sm->size = len; - total_mem = PAGE_ALIGN(len); - pr_debug("%s: sm param size %zd Total mem %zd, stage_idx %d\n", - __func__, len, total_mem, stage_idx); - rc = msm_audio_ion_alloc(&sm->dma_buf, total_mem, - &sm->phys, &len, &sm->data); - if (rc) { - pr_err("%s: Audio ION alloc is failed, rc = %d, stage_idx = %d\n", - __func__, rc, stage_idx); - goto fail; - } - } else { - pr_err("%s: sound model busy, stage_idx %d\n", __func__, stage_idx); - rc = -EBUSY; - goto fail; - } - - rc = q6lsm_memory_map_regions(client, sm->phys, len, &sm->mem_map_handle); - if (rc) { - pr_err("%s: CMD Memory_map_regions failed %d, stage_idx %d\n", - __func__, rc, stage_idx); - sm->mem_map_handle = 0; - goto fail; - } - mutex_unlock(&client->cmd_lock); - - rc = q6lsm_snd_cal_alloc(client, p_info); - if (rc) { - pr_err("%s: cal alloc failed %d, stage_idx %d\n", - __func__, rc, stage_idx); - goto fail_1; - } - return rc; - -fail: - mutex_unlock(&client->cmd_lock); -fail_1: - q6lsm_snd_model_buf_free(client, p_info); - return rc; -} -EXPORT_SYMBOL(q6lsm_snd_model_buf_alloc); - -static int q6lsm_cmd(struct lsm_client *client, int opcode, bool wait) -{ - struct apr_hdr hdr; - int rc; - - pr_debug("%s: enter opcode %x wait %d\n", __func__, opcode, wait); - q6lsm_add_hdr(client, &hdr, sizeof(hdr), true); - switch (opcode) { - case LSM_SESSION_CMD_START: - case LSM_SESSION_CMD_STOP: - case LSM_SESSION_CMD_CLOSE_TX: - case LSM_SESSION_CMD_EOB: - hdr.opcode = opcode; - break; - default: - pr_err("%s: Invalid opcode 0x%x\n", __func__, opcode); - return -EINVAL; - } - rc = q6lsm_apr_send_pkt(client, client->apr, &hdr, wait, NULL); - if (rc) - pr_err("%s: Failed commmand 0x%x\n", __func__, hdr.opcode); - - pr_debug("%s: leave %d\n", __func__, rc); - return rc; -} - -static int q6lsm_send_param_epd_thres(struct lsm_client *client, void *data, - struct param_hdr_v3 *param_info) -{ - struct snd_lsm_ep_det_thres *ep_det_data = NULL; - struct lsm_param_epd_thres epd_thres; - int rc = 0; - - memset(&epd_thres, 0, sizeof(epd_thres)); - param_info->param_size = sizeof(epd_thres); - - ep_det_data = (struct snd_lsm_ep_det_thres *) data; - epd_thres.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - epd_thres.epd_begin = ep_det_data->epd_begin; - epd_thres.epd_end = ep_det_data->epd_end; - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) &epd_thres, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (unlikely(rc)) - pr_err("%s: EPD_THRESHOLD failed, rc %d\n", __func__, rc); - return rc; -} - -static int q6lsm_send_param_gain(struct lsm_client *client, u16 gain, - struct param_hdr_v3 *param_info) -{ - struct lsm_param_gain lsm_gain; - int rc = 0; - - memset(&lsm_gain, 0, sizeof(lsm_gain)); - param_info->param_size = sizeof(lsm_gain); - - lsm_gain.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - lsm_gain.gain = gain; - - rc = q6lsm_pack_and_set_params(client, param_info, - (uint8_t *) &lsm_gain, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (unlikely(rc)) - pr_err("%s: LSM_GAIN CMD send failed, rc %d\n", __func__, rc); - return rc; -} - -/** - * q6lsm_set_one_param - - * command for LSM set params - * - * @client: LSM client handle - * p_info: Params info - * data: payload based on param type - * param_type: LSM param type - * - * Returns 0 on success or error on failure - */ -int q6lsm_set_one_param(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, void *data, - uint32_t param_type) -{ - struct param_hdr_v3 param_info; - int rc = 0; - - memset(¶m_info, 0, sizeof(param_info)); - - switch (param_type) { - case LSM_ENDPOINT_DETECT_THRESHOLD: { - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_param_epd_thres(client, data, ¶m_info); - if (rc) - pr_err("%s: LSM_ENDPOINT_DETECT_THRESHOLD failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_OPERATION_MODE: { - struct snd_lsm_detect_mode *det_mode = data; - - if (det_mode->mode == LSM_MODE_KEYWORD_ONLY_DETECTION) { - client->mode = 0x01; - } else if (det_mode->mode == LSM_MODE_USER_KEYWORD_DETECTION) { - client->mode = 0x03; - } else { - pr_err("%s: Incorrect detection mode %d\n", - __func__, det_mode->mode); - return -EINVAL; - } - - client->mode |= det_mode->detect_failure << 2; - - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - - rc = q6lsm_send_param_opmode(client, ¶m_info, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: OPERATION_MODE failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_GAIN: { - struct snd_lsm_gain *lsm_gain = (struct snd_lsm_gain *) data; - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_param_gain(client, lsm_gain->gain, ¶m_info); - if (rc) - pr_err("%s: LSM_GAIN command failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_MIN_CONFIDENCE_LEVELS: - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_confidence_levels( - client, ¶m_info, LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: CONFIDENCE_LEVELS cmd failed, rc %d\n", - __func__, rc); - break; - case LSM_POLLING_ENABLE: { - struct snd_lsm_poll_enable *lsm_poll_enable = - (struct snd_lsm_poll_enable *) data; - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - rc = q6lsm_send_param_polling_enable( - client, lsm_poll_enable->poll_en, ¶m_info, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: POLLING ENABLE cmd failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_REG_SND_MODEL: { - struct mem_mapping_hdr mem_hdr; - u32 payload_size; - struct lsm_sound_model *sm = NULL; - - memset(&mem_hdr, 0, sizeof(mem_hdr)); - - if (q6common_is_instance_id_supported()) - payload_size = p_info->param_size + - sizeof(struct param_hdr_v3); - else - payload_size = p_info->param_size + - sizeof(struct param_hdr_v2); - - sm = &client->stage_cfg[p_info->stage_idx].sound_model; - - mem_hdr.data_payload_addr_lsw = - lower_32_bits(sm->phys); - mem_hdr.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - sm->phys), - mem_hdr.mem_map_handle = sm->mem_map_handle; - - rc = q6lsm_set_params(client, &mem_hdr, NULL, payload_size, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) { - pr_err("%s: REG_SND_MODEL failed, rc %d\n", - __func__, rc); - return rc; - } - - rc = q6lsm_send_cal(client, LSM_SESSION_CMD_SET_PARAMS, p_info); - if (rc) - pr_err("%s: Failed to send lsm cal, err = %d\n", - __func__, rc); - break; - } - - case LSM_DEREG_SND_MODEL: { - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - param_info.param_size = 0; - rc = q6lsm_pack_and_set_params(client, ¶m_info, NULL, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: DEREG_SND_MODEL failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_CUSTOM_PARAMS: { - u32 param_size = p_info->param_size; - - /* Check minimum size, V2 structure is smaller than V3 */ - if (param_size < sizeof(struct param_hdr_v2)) { - pr_err("%s: Invalid param_size %d\n", __func__, - param_size); - return -EINVAL; - } - - rc = q6lsm_set_params(client, NULL, data, param_size, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: CUSTOM_PARAMS failed, rc %d\n", - __func__, rc); - break; - } - - case LSM_DET_EVENT_TYPE: { - struct lsm_param_det_event_type det_event_type; - struct snd_lsm_det_event_type *det_event_data = - (struct snd_lsm_det_event_type *)data; - - param_info.module_id = p_info->module_id; - param_info.instance_id = p_info->instance_id; - param_info.param_id = p_info->param_id; - param_info.param_size = sizeof(det_event_type); - - memset(&det_event_type, 0, sizeof(det_event_type)); - - det_event_type.minor_version = QLSM_PARAM_ID_MINOR_VERSION; - det_event_type.event_type = det_event_data->event_type; - det_event_type.mode = det_event_data->mode; - - rc = q6lsm_pack_and_set_params(client, ¶m_info, - (uint8_t *)&det_event_type, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: DET_EVENT_TYPE cmd failed, rc %d\n", - __func__, rc); - break; - } - - default: - pr_err("%s: wrong param_type 0x%x\n", - __func__, p_info->param_type); - } - - return rc; -} -EXPORT_SYMBOL(q6lsm_set_one_param); - - -/** - * q6lsm_start - - * command for LSM start - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_start(struct lsm_client *client, bool wait) -{ - return q6lsm_cmd(client, LSM_SESSION_CMD_START, wait); -} -EXPORT_SYMBOL(q6lsm_start); - -/** - * q6lsm_stop - - * command for LSM stop - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_stop(struct lsm_client *client, bool wait) -{ - return q6lsm_cmd(client, LSM_SESSION_CMD_STOP, wait); -} -EXPORT_SYMBOL(q6lsm_stop); - -/** - * q6lsm_close - - * command for LSM close - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_close(struct lsm_client *client) -{ - return q6lsm_cmd(client, LSM_SESSION_CMD_CLOSE_TX, true); -} -EXPORT_SYMBOL(q6lsm_close); - -/** - * q6lsm_lab_control - - * command to set LSM LAB control params - * - * @client: LSM client handle - * @enable: bool flag to enable or disable LAB on DSP - * @p_info: param info to be used for sending lab control param - * - * Returns 0 on success or error on failure - */ -int q6lsm_lab_control(struct lsm_client *client, u32 enable, - struct lsm_params_info_v2 *p_info) -{ - struct lsm_param_lab_enable lab_enable; - struct param_hdr_v3 lab_enable_hdr; - struct lsm_param_lab_config lab_config; - struct param_hdr_v3 lab_config_hdr; - int rc = 0; - - memset(&lab_enable, 0, sizeof(lab_enable)); - memset(&lab_enable_hdr, 0, sizeof(lab_enable_hdr)); - memset(&lab_config, 0, sizeof(lab_config)); - memset(&lab_config_hdr, 0, sizeof(lab_config_hdr)); - - if (!client) { - pr_err("%s: invalid param client %pK\n", __func__, client); - return -EINVAL; - } - - /* enable/disable lab on dsp */ - lab_enable_hdr.module_id = p_info->module_id; - lab_enable_hdr.instance_id = p_info->instance_id; - lab_enable_hdr.param_id = LSM_PARAM_ID_LAB_ENABLE; - lab_enable_hdr.param_size = sizeof(lab_enable); - lab_enable.enable = (enable) ? 1 : 0; - rc = q6lsm_pack_and_set_params(client, &lab_enable_hdr, - (uint8_t *) &lab_enable, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Lab enable failed rc %d\n", __func__, rc); - return rc; - } - if (!enable) - goto exit; - - /* lab session is being enabled set the config values */ - lab_config_hdr.module_id = p_info->module_id; - lab_config_hdr.instance_id = p_info->instance_id; - lab_config_hdr.param_id = LSM_PARAM_ID_LAB_CONFIG; - lab_config_hdr.param_size = sizeof(lab_config); - lab_config.minor_version = 1; - lab_config.wake_up_latency_ms = 250; - rc = q6lsm_pack_and_set_params(client, &lab_config_hdr, - (uint8_t *) &lab_config, - LSM_SESSION_CMD_SET_PARAMS); - if (rc) { - pr_err("%s: Lab config failed rc %d disable lab\n", - __func__, rc); - /* Lab config failed disable lab */ - lab_enable.enable = 0; - if (q6lsm_pack_and_set_params(client, &lab_enable_hdr, - (uint8_t *) &lab_enable, - LSM_SESSION_CMD_SET_PARAMS)) - pr_err("%s: Lab disable failed\n", __func__); - } -exit: - return rc; -} -EXPORT_SYMBOL(q6lsm_lab_control); - -/* - * q6lsm_lab_out_ch_cfg - - * Command to set the channel configuration - * for look-ahead buffer. - * - * @client: LSM client handle - * @ch_map: Channel map indicating the order - * of channels to be configured. - * @p_info: param info to be used for sending lab config param - * - * Returns 0 on success or error on failure - */ -int q6lsm_lab_out_ch_cfg(struct lsm_client *client, - u8 *ch_map, struct lsm_params_info_v2 *p_info) -{ - u8 *param_buf; - struct lsm_param_lab_out_ch_cfg *lab_out_cfg; - struct param_hdr_v3 lab_out_cfg_hdr; - struct lsm_hw_params *out_params = &client->out_hw_params; - int i, rc = 0, param_len = 0; - - param_len = sizeof(*lab_out_cfg) + - sizeof(u8) * out_params->num_chs; - - if (param_len % 4) - param_len += (4 - (param_len % 4)); - - param_buf = kzalloc(param_len, GFP_KERNEL); - if (!param_buf) - return -ENOMEM; - - lab_out_cfg = (struct lsm_param_lab_out_ch_cfg *) param_buf; - lab_out_cfg->minor_version = QLSM_PARAM_ID_MINOR_VERSION; - lab_out_cfg->num_channels = out_params->num_chs; - - for (i = 0; i < out_params->num_chs; i++) - lab_out_cfg->channel_indices[i] = ch_map[i]; - - memset(&lab_out_cfg_hdr, 0, sizeof(lab_out_cfg_hdr)); - lab_out_cfg_hdr.module_id = p_info->module_id; - lab_out_cfg_hdr.instance_id = p_info->instance_id; - lab_out_cfg_hdr.param_id = LSM_PARAM_ID_LAB_OUTPUT_CHANNEL_CONFIG; - lab_out_cfg_hdr.param_size = param_len; - - rc = q6lsm_pack_and_set_params(client, &lab_out_cfg_hdr, - param_buf, - LSM_SESSION_CMD_SET_PARAMS_V2); - if (rc) - pr_err("%s: Lab out channel config failed %d\n", - __func__, rc); - - kfree(param_buf); - - return rc; -} -EXPORT_SYMBOL(q6lsm_lab_out_ch_cfg); - -/** - * q6lsm_stop_lab - - * command to stop LSM LAB - * - * @client: LSM client handle - * - * Returns 0 on success or error on failure - */ -int q6lsm_stop_lab(struct lsm_client *client) -{ - int rc = 0; - - if (!client) { - pr_err("%s: invalid param client %pK\n", __func__, client); - return -EINVAL; - } - rc = q6lsm_cmd(client, LSM_SESSION_CMD_EOB, true); - if (rc) - pr_err("%s: Lab stop failed %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_stop_lab); - -/** - * q6lsm_read - - * command for LSM read - * - * @client: LSM client handle - * @lsm_cmd_read: LSM read command - * - * Returns 0 on success or error on failure - */ -int q6lsm_read(struct lsm_client *client, struct lsm_cmd_read *read) -{ - int rc = 0; - - if (!client || !read) { - pr_err("%s: Invalid params client %pK read %pK\n", __func__, - client, read); - return -EINVAL; - } - pr_debug("%s: read call memmap handle %x address %x%x size %d\n", - __func__, read->mem_map_handle, read->buf_addr_msw, - read->buf_addr_lsw, read->buf_size); - q6lsm_add_hdr(client, &read->hdr, sizeof(struct lsm_cmd_read), true); - read->hdr.opcode = LSM_SESSION_CMD_READ; - rc = q6lsm_apr_send_pkt(client, client->apr, read, false, NULL); - if (rc) - pr_err("%s: read buffer call failed rc %d\n", __func__, rc); - return rc; -} -EXPORT_SYMBOL(q6lsm_read); - -/** - * q6lsm_lab_buffer_alloc - - * Lab buffer allocation or de-alloc - * - * @client: LSM client handle - * @alloc: Allocate or free ion memory - * - * Returns 0 on success or error on failure - */ -int q6lsm_lab_buffer_alloc(struct lsm_client *client, bool alloc) -{ - int ret = 0, i = 0; - size_t allocate_size = 0, len = 0; - struct lsm_hw_params *out_params = &client->out_hw_params; - - if (!client) { - pr_err("%s: invalid client\n", __func__); - return -EINVAL; - } - if (alloc) { - if (client->lab_buffer) { - pr_err("%s: buffers are allocated period count %d period size %d\n", - __func__, - out_params->period_count, - out_params->buf_sz); - return -EINVAL; - } - allocate_size = out_params->period_count * - out_params->buf_sz; - allocate_size = PAGE_ALIGN(allocate_size); - client->lab_buffer = - kzalloc(sizeof(struct lsm_lab_buffer) * - out_params->period_count, GFP_KERNEL); - if (!client->lab_buffer) { - pr_err("%s: memory allocation for lab buffer failed count %d\n" - , __func__, - out_params->period_count); - return -ENOMEM; - } - ret = msm_audio_ion_alloc(&client->lab_buffer[0].dma_buf, - allocate_size, &client->lab_buffer[0].phys, - &len, - &client->lab_buffer[0].data); - if (ret) - pr_err("%s: ion alloc failed ret %d size %zd\n", - __func__, ret, allocate_size); - else { - ret = q6lsm_memory_map_regions(client, - client->lab_buffer[0].phys, len, - &client->lab_buffer[0].mem_map_handle); - if (ret) { - pr_err("%s: memory map filed ret %d size %zd\n", - __func__, ret, len); - msm_audio_ion_free( - client->lab_buffer[0].dma_buf); - } - } - if (ret) { - pr_err("%s: alloc lab buffer failed ret %d\n", - __func__, ret); - kfree(client->lab_buffer); - client->lab_buffer = NULL; - } else { - pr_debug("%s: Memory map handle %x phys %pK size %d\n", - __func__, - client->lab_buffer[0].mem_map_handle, - &client->lab_buffer[0].phys, - out_params->buf_sz); - - for (i = 0; i < out_params->period_count; i++) { - client->lab_buffer[i].phys = - client->lab_buffer[0].phys + - (i * out_params->buf_sz); - client->lab_buffer[i].size = - out_params->buf_sz; - client->lab_buffer[i].data = - (u8 *)(client->lab_buffer[0].data) + - (i * out_params->buf_sz); - client->lab_buffer[i].mem_map_handle = - client->lab_buffer[0].mem_map_handle; - } - } - } else { - ret = q6lsm_memory_unmap_regions(client, - client->lab_buffer[0].mem_map_handle); - if (!ret) - msm_audio_ion_free(client->lab_buffer[0].dma_buf); - else - pr_err("%s: unmap failed not freeing memory\n", - __func__); - kfree(client->lab_buffer); - client->lab_buffer = NULL; - } - return ret; -} -EXPORT_SYMBOL(q6lsm_lab_buffer_alloc); - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case LSM_CUST_TOPOLOGY_CAL_TYPE: - ret = LSM_CUSTOM_TOP_IDX; - break; - case LSM_TOPOLOGY_CAL_TYPE: - ret = LSM_TOP_IDX; - break; - case LSM_CAL_TYPE: - ret = LSM_CAL_IDX; - break; - default: - pr_err("%s: invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int q6lsm_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - lsm_common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6lsm_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - lsm_common.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int q6lsm_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s:\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - lsm_common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } - - if (cal_index == LSM_CUSTOM_TOP_IDX) { - mutex_lock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - lsm_common.set_custom_topology = 1; - mutex_unlock(&lsm_common.cal_data[LSM_CUSTOM_TOP_IDX]->lock); - } - -done: - return ret; -} - -static void lsm_delete_cal_data(void) -{ - pr_debug("%s:\n", __func__); - - cal_utils_destroy_cal_types(LSM_MAX_CAL_IDX, lsm_common.cal_data); -} - -static int q6lsm_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{LSM_CUST_TOPOLOGY_CAL_TYPE, - {q6lsm_alloc_cal, q6lsm_dealloc_cal, NULL, - q6lsm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{LSM_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, - q6lsm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{LSM_CAL_TYPE, - {q6lsm_alloc_cal, q6lsm_dealloc_cal, NULL, - q6lsm_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} } - }; - pr_debug("%s:\n", __func__); - - ret = cal_utils_create_cal_types(LSM_MAX_CAL_IDX, - lsm_common.cal_data, cal_type_info); - if (ret < 0) { - pr_err("%s: could not create cal type!\n", - __func__); - ret = -EINVAL; - goto err; - } - - return ret; -err: - lsm_delete_cal_data(); - return ret; -} - -int __init q6lsm_init(void) -{ - int i = 0; - - pr_debug("%s:\n", __func__); - - memset(&lsm_common, 0, sizeof(lsm_common)); - spin_lock_init(&lsm_session_lock); - spin_lock_init(&mmap_lock); - mutex_init(&lsm_common.apr_lock); - for (; i <= LSM_MAX_SESSION_ID; i++) { - lsm_common.common_client[i].session = LSM_CONTROL_SESSION; - init_waitqueue_head(&lsm_common.common_client[i].cmd_wait); - mutex_init(&lsm_common.common_client[i].cmd_lock); - atomic_set(&lsm_common.common_client[i].cmd_state, - CMD_STATE_CLEARED); - } - - if (q6lsm_init_cal_data()) - pr_err("%s: could not init cal data!\n", __func__); - - return 0; -} - -void q6lsm_exit(void) -{ - lsm_delete_cal_data(); -} diff --git a/techpack/audio/dsp/q6usm.c b/techpack/audio/dsp/q6usm.c deleted file mode 100644 index 61e3bb96596b..000000000000 --- a/techpack/audio/dsp/q6usm.c +++ /dev/null @@ -1,1483 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6usm.h" - -#define ADSP_MEMORY_MAP_SHMEM8_4K_POOL 3 - -#define MEM_4K_OFFSET 4095 -#define MEM_4K_MASK 0xfffff000 - -#define USM_SESSION_MAX 0x02 /* aDSP:USM limit */ - -#define READDONE_IDX_STATUS 0 - -#define WRITEDONE_IDX_STATUS 0 - -/* Standard timeout in the asynchronous ops */ -#define Q6USM_TIMEOUT_JIFFIES (1*HZ) /* 1 sec */ - -static DEFINE_MUTEX(session_lock); - -static struct us_client *session[USM_SESSION_MAX]; -static int32_t q6usm_mmapcallback(struct apr_client_data *data, void *priv); -static int32_t q6usm_callback(struct apr_client_data *data, void *priv); -static void q6usm_add_hdr(struct us_client *usc, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg); - -struct usm_mmap { - atomic_t ref_cnt; - atomic_t cmd_state; - wait_queue_head_t cmd_wait; - void *apr; - int mem_handle; -}; - -static struct usm_mmap this_mmap; - -static void q6usm_add_mmaphdr(struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg, u32 token) -{ - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->src_port = 0; - hdr->dest_port = 0; - if (cmd_flg) { - hdr->token = token; - atomic_set(&this_mmap.cmd_state, 1); - } - hdr->pkt_size = pkt_size; -} - -static int q6usm_memory_map(phys_addr_t buf_add, int dir, uint32_t bufsz, - uint32_t bufcnt, uint32_t session, uint32_t *mem_handle) -{ - struct usm_cmd_memory_map_region mem_region_map; - int rc = 0; - - if (this_mmap.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_mmaphdr(&mem_region_map.hdr, - sizeof(struct usm_cmd_memory_map_region), true, - ((session << 8) | dir)); - - mem_region_map.hdr.opcode = USM_CMD_SHARED_MEM_MAP_REGION; - mem_region_map.mempool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; - - mem_region_map.num_regions = 1; - mem_region_map.flags = 0; - - mem_region_map.shm_addr_lsw = lower_32_bits(buf_add); - mem_region_map.shm_addr_msw = - msm_audio_populate_upper_32_bits(buf_add); - mem_region_map.mem_size_bytes = bufsz * bufcnt; - - rc = apr_send_pkt(this_mmap.apr, (uint32_t *) &mem_region_map); - if (rc < 0) { - pr_err("%s: mem_map op[0x%x]rc[%d]\n", - __func__, mem_region_map.hdr.opcode, rc); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(this_mmap.cmd_wait, - (atomic_read(&this_mmap.cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for memory_map\n", __func__); - } else { - *mem_handle = this_mmap.mem_handle; - rc = 0; - } -fail_cmd: - return rc; -} - -int q6usm_memory_unmap(phys_addr_t buf_add, int dir, uint32_t session, - uint32_t mem_handle) -{ - struct usm_cmd_memory_unmap_region mem_unmap; - int rc = 0; - - if (this_mmap.apr == NULL) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_mmaphdr(&mem_unmap.hdr, - sizeof(struct usm_cmd_memory_unmap_region), true, - ((session << 8) | dir)); - mem_unmap.hdr.opcode = USM_CMD_SHARED_MEM_UNMAP_REGION; - mem_unmap.mem_map_handle = mem_handle; - - rc = apr_send_pkt(this_mmap.apr, (uint32_t *) &mem_unmap); - if (rc < 0) { - pr_err("%s: mem_unmap op[0x%x] rc[%d]\n", - __func__, mem_unmap.hdr.opcode, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(this_mmap.cmd_wait, - (atomic_read(&this_mmap.cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for memory_unmap\n", __func__); - } else - rc = 0; -fail_cmd: - return rc; -} - -static int q6usm_session_alloc(struct us_client *usc) -{ - int ind = 0; - - mutex_lock(&session_lock); - for (ind = 0; ind < USM_SESSION_MAX; ++ind) { - if (!session[ind]) { - session[ind] = usc; - mutex_unlock(&session_lock); - ++ind; /* session id: 0 reserved */ - pr_debug("%s: session[%d] was allocated\n", - __func__, ind); - return ind; - } - } - mutex_unlock(&session_lock); - return -ENOMEM; -} - -static void q6usm_session_free(struct us_client *usc) -{ - /* Session index was incremented during allocation */ - uint16_t ind = (uint16_t)usc->session - 1; - - pr_debug("%s: to free session[%d]\n", __func__, ind); - if (ind < USM_SESSION_MAX) { - mutex_lock(&session_lock); - session[ind] = NULL; - mutex_unlock(&session_lock); - } -} - -static int q6usm_us_client_buf_free(unsigned int dir, - struct us_client *usc) -{ - struct us_port_data *port; - int rc = 0; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT))) - return -EINVAL; - - mutex_lock(&usc->cmd_lock); - port = &usc->port[dir]; - if (port == NULL) { - mutex_unlock(&usc->cmd_lock); - return -EINVAL; - } - - if (port->data == NULL) { - mutex_unlock(&usc->cmd_lock); - return 0; - } - - rc = q6usm_memory_unmap(port->phys, dir, usc->session, - *((uint32_t *)port->ext)); - pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, - (void *)port->data, (u64)port->phys, (void *)&port->phys); - - msm_audio_ion_free(port->dma_buf); - - port->data = NULL; - port->phys = 0; - port->buf_size = 0; - port->buf_cnt = 0; - port->dma_buf = NULL; - - mutex_unlock(&usc->cmd_lock); - return rc; -} - -int q6usm_us_param_buf_free(unsigned int dir, - struct us_client *usc) -{ - struct us_port_data *port; - int rc = 0; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT))) - return -EINVAL; - - mutex_lock(&usc->cmd_lock); - port = &usc->port[dir]; - if (port == NULL) { - mutex_unlock(&usc->cmd_lock); - return -EINVAL; - } - - if (port->param_buf == NULL) { - mutex_unlock(&usc->cmd_lock); - return 0; - } - - rc = q6usm_memory_unmap(port->param_phys, dir, usc->session, - *((uint32_t *)port->param_buf_mem_handle)); - pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, - (void *)port->param_buf, (u64)port->param_phys, - (void *)&port->param_phys); - - msm_audio_ion_free(port->param_dma_buf); - - port->param_buf = NULL; - port->param_phys = 0; - port->param_buf_size = 0; - port->param_dma_buf = NULL; - - mutex_unlock(&usc->cmd_lock); - return rc; -} - -void q6usm_us_client_free(struct us_client *usc) -{ - int loopcnt = 0; - struct us_port_data *port; - uint32_t *p_mem_handle = NULL; - - if ((usc == NULL) || - !(usc->session)) - return; - - for (loopcnt = 0; loopcnt <= OUT; ++loopcnt) { - port = &usc->port[loopcnt]; - if (port->data == NULL) - continue; - pr_debug("%s: loopcnt = %d\n", __func__, loopcnt); - q6usm_us_client_buf_free(loopcnt, usc); - q6usm_us_param_buf_free(loopcnt, usc); - } - q6usm_session_free(usc); - apr_deregister(usc->apr); - - pr_debug("%s: APR De-Register\n", __func__); - - if (atomic_read(&this_mmap.ref_cnt) <= 0) { - pr_err("%s: APR Common Port Already Closed\n", __func__); - goto done; - } - - atomic_dec(&this_mmap.ref_cnt); - if (atomic_read(&this_mmap.ref_cnt) == 0) { - apr_deregister(this_mmap.apr); - pr_debug("%s: APR De-Register common port\n", __func__); - } - -done: - p_mem_handle = (uint32_t *)usc->port[IN].ext; - kfree(p_mem_handle); - kfree(usc); - pr_debug("%s:\n", __func__); -} - -struct us_client *q6usm_us_client_alloc( - void (*cb)(uint32_t, uint32_t, uint32_t *, void *), - void *priv) -{ - struct us_client *usc; - uint32_t *p_mem_handle = NULL; - int n; - int lcnt = 0; - - usc = kzalloc(sizeof(struct us_client), GFP_KERNEL); - if (usc == NULL) - return NULL; - - p_mem_handle = kzalloc(sizeof(uint32_t) * 4, GFP_KERNEL); - if (p_mem_handle == NULL) { - kfree(usc); - return NULL; - } - - n = q6usm_session_alloc(usc); - if (n <= 0) - goto fail_session; - usc->session = n; - usc->cb = cb; - usc->priv = priv; - usc->apr = apr_register("ADSP", "USM", - (apr_fn)q6usm_callback, - ((usc->session) << 8 | 0x0001), - usc); - - if (usc->apr == NULL) { - pr_err("%s: Registration with APR failed\n", __func__); - goto fail; - } - pr_debug("%s: Registering the common port with APR\n", __func__); - if (atomic_read(&this_mmap.ref_cnt) == 0) { - this_mmap.apr = apr_register("ADSP", "USM", - (apr_fn)q6usm_mmapcallback, - 0x0FFFFFFFF, &this_mmap); - if (this_mmap.apr == NULL) { - pr_err("%s: USM port registration failed\n", - __func__); - goto fail; - } - } - - atomic_inc(&this_mmap.ref_cnt); - init_waitqueue_head(&usc->cmd_wait); - mutex_init(&usc->cmd_lock); - for (lcnt = 0; lcnt <= OUT; ++lcnt) { - mutex_init(&usc->port[lcnt].lock); - spin_lock_init(&usc->port[lcnt].dsp_lock); - usc->port[lcnt].ext = (void *)p_mem_handle++; - usc->port[lcnt].param_buf_mem_handle = (void *)p_mem_handle++; - pr_err("%s: usc->port[%d].ext=%pK;\n", - __func__, lcnt, usc->port[lcnt].ext); - } - atomic_set(&usc->cmd_state, 0); - - return usc; -fail: - kfree(p_mem_handle); - q6usm_us_client_free(usc); - return NULL; -fail_session: - kfree(p_mem_handle); - kfree(usc); - return NULL; -} - -int q6usm_us_client_buf_alloc(unsigned int dir, - struct us_client *usc, - unsigned int bufsz, - unsigned int bufcnt) -{ - int rc = 0; - struct us_port_data *port = NULL; - unsigned int size = bufsz*bufcnt; - size_t len; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT)) || (size == 0) || - (usc->session <= 0 || usc->session > USM_SESSION_MAX)) { - pr_err("%s: wrong parameters: size=%d; bufcnt=%d\n", - __func__, size, bufcnt); - return -EINVAL; - } - - mutex_lock(&usc->cmd_lock); - - port = &usc->port[dir]; - - /* The size to allocate should be multiple of 4K bytes */ - size = PAGE_ALIGN(size); - - rc = msm_audio_ion_alloc(&port->dma_buf, - size, &port->phys, - &len, &port->data); - - if (rc) { - pr_err("%s: US ION allocation failed, rc = %d\n", - __func__, rc); - mutex_unlock(&usc->cmd_lock); - return -ENOMEM; - } - - port->buf_cnt = bufcnt; - port->buf_size = bufsz; - pr_debug("%s: data[%pK]; phys[%llx]; [%pK]\n", __func__, - (void *)port->data, - (u64)port->phys, - (void *)&port->phys); - - rc = q6usm_memory_map(port->phys, dir, size, 1, usc->session, - (uint32_t *)port->ext); - if (rc < 0) { - pr_err("%s: CMD Memory_map failed\n", __func__); - mutex_unlock(&usc->cmd_lock); - q6usm_us_client_buf_free(dir, usc); - q6usm_us_param_buf_free(dir, usc); - } else { - mutex_unlock(&usc->cmd_lock); - rc = 0; - } - - return rc; -} - -int q6usm_us_param_buf_alloc(unsigned int dir, - struct us_client *usc, - unsigned int bufsz) -{ - int rc = 0; - struct us_port_data *port = NULL; - unsigned int size = bufsz; - size_t len; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT)) || - (usc->session <= 0 || usc->session > USM_SESSION_MAX)) { - pr_err("%s: wrong parameters: direction=%d, bufsz=%d\n", - __func__, dir, bufsz); - return -EINVAL; - } - - mutex_lock(&usc->cmd_lock); - - port = &usc->port[dir]; - - if (bufsz == 0) { - pr_debug("%s: bufsz=0, get/set param commands are forbidden\n", - __func__); - port->param_buf = NULL; - mutex_unlock(&usc->cmd_lock); - return rc; - } - - /* The size to allocate should be multiple of 4K bytes */ - size = PAGE_ALIGN(size); - - rc = msm_audio_ion_alloc(&port->param_dma_buf, - size, &port->param_phys, - &len, &port->param_buf); - - if (rc) { - pr_err("%s: US ION allocation failed, rc = %d\n", - __func__, rc); - mutex_unlock(&usc->cmd_lock); - return -ENOMEM; - } - - port->param_buf_size = bufsz; - pr_debug("%s: param_buf[%pK]; param_phys[%llx]; [%pK]\n", __func__, - (void *)port->param_buf, - (u64)port->param_phys, - (void *)&port->param_phys); - - rc = q6usm_memory_map(port->param_phys, (IN | OUT), size, 1, - usc->session, (uint32_t *)port->param_buf_mem_handle); - if (rc < 0) { - pr_err("%s: CMD Memory_map failed\n", __func__); - mutex_unlock(&usc->cmd_lock); - q6usm_us_client_buf_free(dir, usc); - q6usm_us_param_buf_free(dir, usc); - } else { - mutex_unlock(&usc->cmd_lock); - rc = 0; - } - - return rc; -} - -static int32_t q6usm_mmapcallback(struct apr_client_data *data, void *priv) -{ - uint32_t token; - uint32_t *payload = data->payload; - - if (data->payload_size < (2 * sizeof(uint32_t))) { - pr_err("%s: payload has invalid size[%d]\n", __func__, - data->payload_size); - return -EINVAL; - } - pr_debug("%s: ptr0[0x%x]; ptr1[0x%x]; opcode[0x%x]\n", - __func__, payload[0], payload[1], data->opcode); - pr_debug("%s: token[0x%x]; payload_size[%d]; src[%d]; dest[%d];\n", - __func__, data->token, data->payload_size, - data->src_port, data->dest_port); - - if (data->opcode == APR_BASIC_RSP_RESULT) { - /* status field check */ - if (payload[1]) { - pr_err("%s: wrong response[%d] on cmd [%d]\n", - __func__, payload[1], payload[0]); - } else { - token = data->token; - switch (payload[0]) { - case USM_CMD_SHARED_MEM_UNMAP_REGION: - if (atomic_read(&this_mmap.cmd_state)) { - atomic_set(&this_mmap.cmd_state, 0); - wake_up(&this_mmap.cmd_wait); - } - /* fallthrough */ - case USM_CMD_SHARED_MEM_MAP_REGION: - /* For MEM_MAP, additional answer is waited, */ - /* therfore, no wake-up here */ - pr_debug("%s: cmd[0x%x]; result[0x%x]\n", - __func__, payload[0], payload[1]); - break; - default: - pr_debug("%s: wrong command[0x%x]\n", - __func__, payload[0]); - break; - } - } - } else { - if (data->opcode == USM_CMDRSP_SHARED_MEM_MAP_REGION) { - this_mmap.mem_handle = payload[0]; - pr_debug("%s: memory map handle = 0x%x", - __func__, payload[0]); - if (atomic_read(&this_mmap.cmd_state)) { - atomic_set(&this_mmap.cmd_state, 0); - wake_up(&this_mmap.cmd_wait); - } - } - } - return 0; -} - - -static int32_t q6usm_callback(struct apr_client_data *data, void *priv) -{ - struct us_client *usc = (struct us_client *)priv; - unsigned long dsp_flags; - uint32_t *payload = data->payload; - uint32_t token = data->token; - uint32_t opcode = Q6USM_EVENT_UNDEF; - - if (usc == NULL) { - pr_err("%s: client info is NULL\n", __func__); - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size < (2 * sizeof(uint32_t))) { - pr_err("%s: payload has invalid size[%d]\n", __func__, - data->payload_size); - return -EINVAL; - } - /* status field check */ - if (payload[1]) { - pr_err("%s: wrong response[%d] on cmd [%d]\n", - __func__, payload[1], payload[0]); - if (usc->cb) - usc->cb(data->opcode, token, - (uint32_t *)data->payload, usc->priv); - } else { - switch (payload[0]) { - case USM_SESSION_CMD_RUN: - case USM_STREAM_CMD_CLOSE: - if (token != usc->session) { - pr_err("%s: wrong token[%d]", - __func__, token); - break; - } - case USM_STREAM_CMD_OPEN_READ: - case USM_STREAM_CMD_OPEN_WRITE: - case USM_STREAM_CMD_SET_ENC_PARAM: - case USM_DATA_CMD_MEDIA_FORMAT_UPDATE: - case USM_SESSION_CMD_SIGNAL_DETECT_MODE: - case USM_STREAM_CMD_SET_PARAM: - case USM_STREAM_CMD_GET_PARAM: - if (atomic_read(&usc->cmd_state)) { - atomic_set(&usc->cmd_state, 0); - wake_up(&usc->cmd_wait); - } - if (usc->cb) - usc->cb(data->opcode, token, - (uint32_t *)data->payload, - usc->priv); - break; - default: - break; - } - } - return 0; - } - - switch (data->opcode) { - case RESET_EVENTS: { - pr_err("%s: Reset event is received: %d %d\n", - __func__, - data->reset_event, - data->reset_proc); - - opcode = RESET_EVENTS; - - apr_reset(this_mmap.apr); - this_mmap.apr = NULL; - - apr_reset(usc->apr); - usc->apr = NULL; - - break; - } - - - case USM_DATA_EVENT_READ_DONE: { - struct us_port_data *port = &usc->port[OUT]; - - opcode = Q6USM_EVENT_READ_DONE; - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - if (data->payload_size < - (sizeof(uint32_t)*(READDONE_IDX_STATUS + 1))) { - pr_err("%s: Invalid payload size for READDONE[%d]\n", - __func__, data->payload_size); - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - return -EINVAL; - } - if (payload[READDONE_IDX_STATUS]) { - pr_err("%s: wrong READDONE[%d]; token[%d]\n", - __func__, - payload[READDONE_IDX_STATUS], - token); - token = USM_WRONG_TOKEN; - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } - - if (port->expected_token != token) { - u32 cpu_buf = port->cpu_buf; - - pr_err("%s: expected[%d] != token[%d]\n", - __func__, port->expected_token, token); - pr_debug("%s: dsp_buf=%d; cpu_buf=%d;\n", - __func__, port->dsp_buf, cpu_buf); - - token = USM_WRONG_TOKEN; - /* To prevent data handle continiue */ - port->expected_token = USM_WRONG_TOKEN; - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } /* port->expected_token != data->token */ - - port->expected_token = token + 1; - if (port->expected_token == port->buf_cnt) - port->expected_token = 0; - - /* gap support */ - if (port->expected_token != port->cpu_buf) { - port->dsp_buf = port->expected_token; - token = port->dsp_buf; /* for callback */ - } else - port->dsp_buf = token; - - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - break; - } /* case USM_DATA_EVENT_READ_DONE */ - - case USM_DATA_EVENT_WRITE_DONE: { - struct us_port_data *port = &usc->port[IN]; - - opcode = Q6USM_EVENT_WRITE_DONE; - if (data->payload_size < - (sizeof(uint32_t)*(WRITEDONE_IDX_STATUS + 1))) { - pr_err("%s: Invalid payload size for WRITEDONE[%d]\n", - __func__, data->payload_size); - return -EINVAL; - } - if (payload[WRITEDONE_IDX_STATUS]) { - pr_err("%s: wrong WRITEDONE_IDX_STATUS[%d]\n", - __func__, - payload[WRITEDONE_IDX_STATUS]); - break; - } - - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - port->dsp_buf = token + 1; - if (port->dsp_buf == port->buf_cnt) - port->dsp_buf = 0; - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - - break; - } /* case USM_DATA_EVENT_WRITE_DONE */ - - case USM_SESSION_EVENT_SIGNAL_DETECT_RESULT: { - pr_debug("%s: US detect result: result=%d", - __func__, - payload[0]); - opcode = Q6USM_EVENT_SIGNAL_DETECT_RESULT; - - break; - } /* case USM_SESSION_EVENT_SIGNAL_DETECT_RESULT */ - - default: - return 0; - - } /* switch */ - - if (usc->cb) - usc->cb(opcode, token, - data->payload, usc->priv); - - return 0; -} - -uint32_t q6usm_get_virtual_address(int dir, - struct us_client *usc, - struct vm_area_struct *vms) -{ - uint32_t ret = 0xffffffff; - - if (vms && (usc != NULL) && ((dir == IN) || (dir == OUT))) { - struct us_port_data *port = &usc->port[dir]; - int size = PAGE_ALIGN(port->buf_size * port->buf_cnt); - struct audio_buffer ab; - - ab.phys = port->phys; - ab.data = port->data; - ab.used = 1; - ab.size = size; - ab.actual_size = size; - ab.dma_buf = port->dma_buf; - - ret = msm_audio_ion_mmap(&ab, vms); - - } - return ret; -} - -static void q6usm_add_hdr(struct us_client *usc, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg) -{ - mutex_lock(&usc->cmd_lock); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(sizeof(struct apr_hdr)), - APR_PKT_VER); - hdr->src_svc = ((struct apr_svc *)usc->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_USM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = (usc->session << 8) | 0x0001; - hdr->dest_port = (usc->session << 8) | 0x0001; - if (cmd_flg) { - hdr->token = usc->session; - atomic_set(&usc->cmd_state, 1); - } - hdr->pkt_size = pkt_size; - mutex_unlock(&usc->cmd_lock); -} - -static uint32_t q6usm_ext2int_format(uint32_t ext_format) -{ - uint32_t int_format = INVALID_FORMAT; - - switch (ext_format) { - case FORMAT_USPS_EPOS: - int_format = US_POINT_EPOS_FORMAT_V2; - break; - case FORMAT_USRAW: - int_format = US_RAW_FORMAT_V2; - break; - case FORMAT_USPROX: - int_format = US_PROX_FORMAT_V4; - break; - case FORMAT_USGES_SYNC: - int_format = US_GES_SYNC_FORMAT; - break; - case FORMAT_USRAW_SYNC: - int_format = US_RAW_SYNC_FORMAT; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, ext_format); - break; - } - - return int_format; -} - -int q6usm_open_read(struct us_client *usc, - uint32_t format) -{ - uint32_t int_format = INVALID_FORMAT; - int rc = 0x00; - struct usm_stream_cmd_open_read open; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: client or its apr is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: session[%d]", __func__, usc->session); - - q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); - open.hdr.opcode = USM_STREAM_CMD_OPEN_READ; - open.src_endpoint = 0; /* AFE */ - open.pre_proc_top = 0; /* No preprocessing required */ - - int_format = q6usm_ext2int_format(format); - if (int_format == INVALID_FORMAT) - return -EINVAL; - - open.uMode = STREAM_PRIORITY_NORMAL; - open.format = int_format; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout, waited for OPEN_READ rc[%d]\n", - __func__, rc); - goto fail_cmd; - } else - rc = 0; -fail_cmd: - return rc; -} - - -int q6usm_enc_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg) -{ - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_cmd_encdec_cfg_blk enc_cfg_obj; - struct usm_stream_cmd_encdec_cfg_blk *enc_cfg = &enc_cfg_obj; - int rc = 0; - uint32_t total_cfg_size = - sizeof(struct usm_stream_cmd_encdec_cfg_blk); - uint32_t round_params_size = 0; - uint8_t is_allocated = 0; - - - if ((usc == NULL) || (us_cfg == NULL)) { - pr_err("%s: wrong input", __func__); - return -EINVAL; - } - - int_format = q6usm_ext2int_format(us_cfg->format_id); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong input format[%d]", - __func__, us_cfg->format_id); - return -EINVAL; - } - - /* Transparent configuration data is after enc_cfg */ - /* Integer number of u32s is required */ - round_params_size = ((us_cfg->params_size + 3)/4) * 4; - if (round_params_size > USM_MAX_CFG_DATA_SIZE) { - /* Dynamic allocated encdec_cfg_blk is required */ - /* static part use */ - round_params_size -= USM_MAX_CFG_DATA_SIZE; - total_cfg_size += round_params_size; - enc_cfg = kzalloc(total_cfg_size, GFP_KERNEL); - if (enc_cfg == NULL) { - pr_err("%s: enc_cfg[%d] allocation failed\n", - __func__, total_cfg_size); - return -ENOMEM; - } - is_allocated = 1; - } else - round_params_size = 0; - - q6usm_add_hdr(usc, &enc_cfg->hdr, total_cfg_size, true); - - enc_cfg->hdr.opcode = USM_STREAM_CMD_SET_ENC_PARAM; - enc_cfg->param_id = USM_PARAM_ID_ENCDEC_ENC_CFG_BLK; - enc_cfg->param_size = sizeof(struct usm_encode_cfg_blk)+ - round_params_size; - enc_cfg->enc_blk.frames_per_buf = 1; - enc_cfg->enc_blk.format_id = int_format; - enc_cfg->enc_blk.cfg_size = sizeof(struct usm_cfg_common)+ - USM_MAX_CFG_DATA_SIZE + - round_params_size; - memcpy(&(enc_cfg->enc_blk.cfg_common), &(us_cfg->cfg_common), - sizeof(struct usm_cfg_common)); - - /* Transparent data copy */ - memcpy(enc_cfg->enc_blk.transp_data, us_cfg->params, - us_cfg->params_size); - pr_debug("%s: cfg_size[%d], params_size[%d]\n", - __func__, - enc_cfg->enc_blk.cfg_size, - us_cfg->params_size); - pr_debug("%s: params[%d,%d,%d,%d, %d,%d,%d,%d]\n", - __func__, - enc_cfg->enc_blk.transp_data[0], - enc_cfg->enc_blk.transp_data[1], - enc_cfg->enc_blk.transp_data[2], - enc_cfg->enc_blk.transp_data[3], - enc_cfg->enc_blk.transp_data[4], - enc_cfg->enc_blk.transp_data[5], - enc_cfg->enc_blk.transp_data[6], - enc_cfg->enc_blk.transp_data[7] - ); - pr_debug("%s: srate:%d, ch=%d, bps= %d;\n", - __func__, enc_cfg->enc_blk.cfg_common.sample_rate, - enc_cfg->enc_blk.cfg_common.ch_cfg, - enc_cfg->enc_blk.cfg_common.bits_per_sample); - pr_debug("dmap:[0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x]; dev_id=0x%x\n", - enc_cfg->enc_blk.cfg_common.data_map[0], - enc_cfg->enc_blk.cfg_common.data_map[1], - enc_cfg->enc_blk.cfg_common.data_map[2], - enc_cfg->enc_blk.cfg_common.data_map[3], - enc_cfg->enc_blk.cfg_common.data_map[4], - enc_cfg->enc_blk.cfg_common.data_map[5], - enc_cfg->enc_blk.cfg_common.data_map[6], - enc_cfg->enc_blk.cfg_common.data_map[7], - enc_cfg->enc_blk.cfg_common.dev_id); - - rc = apr_send_pkt(usc->apr, (uint32_t *) enc_cfg); - if (rc < 0) { - pr_err("%s:Comamnd open failed\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg->hdr.opcode); - } else - rc = 0; - -fail_cmd: - if (is_allocated == 1) - kfree(enc_cfg); - - return rc; -} - -int q6usm_dec_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg) -{ - - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_media_format_update dec_cfg_obj; - struct usm_stream_media_format_update *dec_cfg = &dec_cfg_obj; - - int rc = 0; - uint32_t total_cfg_size = sizeof(struct usm_stream_media_format_update); - uint32_t round_params_size = 0; - uint8_t is_allocated = 0; - - - if ((usc == NULL) || (us_cfg == NULL)) { - pr_err("%s: wrong input", __func__); - return -EINVAL; - } - - int_format = q6usm_ext2int_format(us_cfg->format_id); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong input format[%d]", - __func__, us_cfg->format_id); - return -EINVAL; - } - - /* Transparent configuration data is after enc_cfg */ - /* Integer number of u32s is required */ - round_params_size = ((us_cfg->params_size + 3)/4) * 4; - if (round_params_size > USM_MAX_CFG_DATA_SIZE) { - /* Dynamic allocated encdec_cfg_blk is required */ - /* static part use */ - round_params_size -= USM_MAX_CFG_DATA_SIZE; - total_cfg_size += round_params_size; - dec_cfg = kzalloc(total_cfg_size, GFP_KERNEL); - if (dec_cfg == NULL) { - pr_err("%s:dec_cfg[%d] allocation failed\n", - __func__, total_cfg_size); - return -ENOMEM; - } - is_allocated = 1; - } else { /* static transp_data is enough */ - round_params_size = 0; - } - - q6usm_add_hdr(usc, &dec_cfg->hdr, total_cfg_size, true); - - dec_cfg->hdr.opcode = USM_DATA_CMD_MEDIA_FORMAT_UPDATE; - dec_cfg->format_id = int_format; - dec_cfg->cfg_size = sizeof(struct usm_cfg_common) + - USM_MAX_CFG_DATA_SIZE + - round_params_size; - memcpy(&(dec_cfg->cfg_common), &(us_cfg->cfg_common), - sizeof(struct usm_cfg_common)); - /* Transparent data copy */ - memcpy(dec_cfg->transp_data, us_cfg->params, us_cfg->params_size); - pr_debug("%s: cfg_size[%d], params_size[%d]; parambytes[%d,%d,%d,%d]\n", - __func__, - dec_cfg->cfg_size, - us_cfg->params_size, - dec_cfg->transp_data[0], - dec_cfg->transp_data[1], - dec_cfg->transp_data[2], - dec_cfg->transp_data[3] - ); - - rc = apr_send_pkt(usc->apr, (uint32_t *) dec_cfg); - if (rc < 0) { - pr_err("%s:Comamnd open failed\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout opcode[0x%x]\n", - __func__, dec_cfg->hdr.opcode); - } else - rc = 0; - -fail_cmd: - if (is_allocated == 1) - kfree(dec_cfg); - - return rc; -} - -int q6usm_open_write(struct us_client *usc, - uint32_t format) -{ - int rc = 0; - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_cmd_open_write open; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: session[%d]", __func__, usc->session); - - q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); - open.hdr.opcode = USM_STREAM_CMD_OPEN_WRITE; - - int_format = q6usm_ext2int_format(format); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong format[%d]", __func__, format); - return -EINVAL; - } - - open.format = int_format; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s:open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. waited for OPEN_WRITR rc[%d]\n", - __func__, rc); - goto fail_cmd; - } else - rc = 0; - -fail_cmd: - return rc; -} - -int q6usm_run(struct us_client *usc, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts) -{ - struct usm_stream_cmd_run run; - int rc = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - q6usm_add_hdr(usc, &run.hdr, sizeof(run), true); - - run.hdr.opcode = USM_SESSION_CMD_RUN; - run.flags = flags; - run.msw_ts = msw_ts; - run.lsw_ts = lsw_ts; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &run); - if (rc < 0) { - pr_err("%s: Commmand run failed[%d]\n", __func__, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for run success rc[%d]\n", - __func__, rc); - } else - rc = 0; - -fail_cmd: - return rc; -} - - - -int q6usm_read(struct us_client *usc, uint32_t read_ind) -{ - struct usm_stream_cmd_read read; - struct us_port_data *port = NULL; - int rc = 0; - u32 read_counter = 0; - u32 loop_ind = 0; - u64 buf_addr = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[OUT]; - - if (read_ind > port->buf_cnt) { - pr_err("%s: wrong read_ind[%d]\n", - __func__, read_ind); - return -EINVAL; - } - if (read_ind == port->cpu_buf) { - pr_err("%s: no free region\n", __func__); - return 0; - } - - if (read_ind > port->cpu_buf) { /* 1 range */ - read_counter = read_ind - port->cpu_buf; - } else { /* 2 ranges */ - read_counter = (port->buf_cnt - port->cpu_buf) + read_ind; - } - - q6usm_add_hdr(usc, &read.hdr, sizeof(read), false); - - read.hdr.opcode = USM_DATA_CMD_READ; - read.buf_size = port->buf_size; - buf_addr = (u64)(port->phys) + port->buf_size * (port->cpu_buf); - read.buf_addr_lsw = lower_32_bits(buf_addr); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(buf_addr); - read.mem_map_handle = *((uint32_t *)(port->ext)); - - for (loop_ind = 0; loop_ind < read_counter; ++loop_ind) { - u32 temp_cpu_buf = port->cpu_buf; - - buf_addr = (u64)(port->phys) + - port->buf_size * (port->cpu_buf); - read.buf_addr_lsw = lower_32_bits(buf_addr); - read.buf_addr_msw = msm_audio_populate_upper_32_bits(buf_addr); - read.seq_id = port->cpu_buf; - read.hdr.token = port->cpu_buf; - read.counter = 1; - - ++(port->cpu_buf); - if (port->cpu_buf == port->buf_cnt) - port->cpu_buf = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &read); - - if (rc < 0) { - port->cpu_buf = temp_cpu_buf; - - pr_err("%s:read op[0x%x]rc[%d]\n", - __func__, read.hdr.opcode, rc); - break; - } - - rc = 0; - } /* bufs loop */ - - return rc; -} - -int q6usm_write(struct us_client *usc, uint32_t write_ind) -{ - int rc = 0; - struct usm_stream_cmd_write cmd_write; - struct us_port_data *port = NULL; - u32 current_dsp_buf = 0; - u64 buf_addr = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[IN]; - - current_dsp_buf = port->dsp_buf; - /* free region, caused by new dsp_buf report from DSP, */ - /* can be only extended */ - if (port->cpu_buf >= current_dsp_buf) { - /* 2 -part free region, including empty buffer */ - if ((write_ind <= port->cpu_buf) && - (write_ind > current_dsp_buf)) { - pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", - __func__, write_ind, - current_dsp_buf, port->cpu_buf); - return -EINVAL; - } - } else { - /* 1 -part free region */ - if ((write_ind <= port->cpu_buf) || - (write_ind > current_dsp_buf)) { - pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", - __func__, write_ind, - current_dsp_buf, port->cpu_buf); - return -EINVAL; - } - } - - q6usm_add_hdr(usc, &cmd_write.hdr, sizeof(cmd_write), false); - - cmd_write.hdr.opcode = USM_DATA_CMD_WRITE; - cmd_write.buf_size = port->buf_size; - buf_addr = (u64)(port->phys) + port->buf_size * (port->cpu_buf); - cmd_write.buf_addr_lsw = lower_32_bits(buf_addr); - cmd_write.buf_addr_msw = msm_audio_populate_upper_32_bits(buf_addr); - cmd_write.mem_map_handle = *((uint32_t *)(port->ext)); - cmd_write.res0 = 0; - cmd_write.res1 = 0; - cmd_write.res2 = 0; - - while (port->cpu_buf != write_ind) { - u32 temp_cpu_buf = port->cpu_buf; - - buf_addr = (u64)(port->phys) + - port->buf_size * (port->cpu_buf); - cmd_write.buf_addr_lsw = lower_32_bits(buf_addr); - cmd_write.buf_addr_msw = - msm_audio_populate_upper_32_bits(buf_addr); - cmd_write.seq_id = port->cpu_buf; - cmd_write.hdr.token = port->cpu_buf; - - ++(port->cpu_buf); - if (port->cpu_buf == port->buf_cnt) - port->cpu_buf = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_write); - - if (rc < 0) { - port->cpu_buf = temp_cpu_buf; - pr_err("%s:write op[0x%x];rc[%d];cpu_buf[%d]\n", - __func__, cmd_write.hdr.opcode, - rc, port->cpu_buf); - break; - } - - rc = 0; - } - - return rc; -} - -bool q6usm_is_write_buf_full(struct us_client *usc, uint32_t *free_region) -{ - struct us_port_data *port = NULL; - u32 cpu_buf = 0; - - if ((usc == NULL) || !free_region) { - pr_err("%s: input data wrong\n", __func__); - return false; - } - port = &usc->port[IN]; - cpu_buf = port->cpu_buf + 1; - if (cpu_buf == port->buf_cnt) - cpu_buf = 0; - - *free_region = port->dsp_buf; - - return cpu_buf == *free_region; -} - -int q6usm_cmd(struct us_client *usc, int cmd) -{ - struct apr_hdr hdr; - int rc = 0; - atomic_t *state; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - q6usm_add_hdr(usc, &hdr, sizeof(hdr), true); - switch (cmd) { - case CMD_CLOSE: - hdr.opcode = USM_STREAM_CMD_CLOSE; - state = &usc->cmd_state; - break; - - default: - pr_err("%s:Invalid format[%d]\n", __func__, cmd); - goto fail_cmd; - } - - rc = apr_send_pkt(usc->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Command 0x%x failed\n", __func__, hdr.opcode); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, (atomic_read(state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. waited for response opcode[0x%x]\n", - __func__, hdr.opcode); - } else - rc = 0; -fail_cmd: - return rc; -} - -int q6usm_set_us_detection(struct us_client *usc, - struct usm_session_cmd_detect_info *detect_info, - uint16_t detect_info_size) -{ - int rc = 0; - - if ((usc == NULL) || - (detect_info_size == 0) || - (detect_info == NULL)) { - pr_err("%s: wrong input: usc=0x%pK, inf_size=%d; info=0x%pK", - __func__, - usc, - detect_info_size, - detect_info); - return -EINVAL; - } - - q6usm_add_hdr(usc, &detect_info->hdr, detect_info_size, true); - - detect_info->hdr.opcode = USM_SESSION_CMD_SIGNAL_DETECT_MODE; - - rc = apr_send_pkt(usc->apr, (uint32_t *)detect_info); - if (rc < 0) { - pr_err("%s:Comamnd signal detect failed\n", __func__); - return -EINVAL; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: CMD_SIGNAL_DETECT_MODE: timeout=%d\n", - __func__, Q6USM_TIMEOUT_JIFFIES); - } else - rc = 0; - - return rc; -} - -int q6usm_set_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size) -{ - int rc = 0; - struct usm_stream_cmd_set_param cmd_set_param; - struct us_port_data *port = NULL; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[dir]; - - q6usm_add_hdr(usc, &cmd_set_param.hdr, sizeof(cmd_set_param), true); - - cmd_set_param.hdr.opcode = USM_STREAM_CMD_SET_PARAM; - cmd_set_param.buf_size = buf_size; - cmd_set_param.buf_addr_msw = - msm_audio_populate_upper_32_bits(port->param_phys); - cmd_set_param.buf_addr_lsw = lower_32_bits(port->param_phys); - cmd_set_param.mem_map_handle = - *((uint32_t *)(port->param_buf_mem_handle)); - cmd_set_param.module_id = module_id; - cmd_set_param.param_id = param_id; - cmd_set_param.hdr.token = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_set_param); - - if (rc < 0) { - pr_err("%s:write op[0x%x];rc[%d]\n", - __func__, cmd_set_param.hdr.opcode, rc); - } - - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: CMD_SET_PARAM: timeout=%d\n", - __func__, Q6USM_TIMEOUT_JIFFIES); - } else - rc = 0; - - return rc; -} - -int q6usm_get_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size) -{ - int rc = 0; - struct usm_stream_cmd_get_param cmd_get_param; - struct us_port_data *port = NULL; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[dir]; - - q6usm_add_hdr(usc, &cmd_get_param.hdr, sizeof(cmd_get_param), true); - - cmd_get_param.hdr.opcode = USM_STREAM_CMD_GET_PARAM; - cmd_get_param.buf_size = buf_size; - cmd_get_param.buf_addr_msw = - msm_audio_populate_upper_32_bits(port->param_phys); - cmd_get_param.buf_addr_lsw = lower_32_bits(port->param_phys); - cmd_get_param.mem_map_handle = - *((uint32_t *)(port->param_buf_mem_handle)); - cmd_get_param.module_id = module_id; - cmd_get_param.param_id = param_id; - cmd_get_param.hdr.token = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_get_param); - - if (rc < 0) { - pr_err("%s:write op[0x%x];rc[%d]\n", - __func__, cmd_get_param.hdr.opcode, rc); - } - - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: CMD_GET_PARAM: timeout=%d\n", - __func__, Q6USM_TIMEOUT_JIFFIES); - } else - rc = 0; - - return rc; -} - -int __init q6usm_init(void) -{ - pr_debug("%s\n", __func__); - init_waitqueue_head(&this_mmap.cmd_wait); - memset(session, 0, sizeof(session)); - return 0; -} diff --git a/techpack/audio/dsp/q6usm.h b/techpack/audio/dsp/q6usm.h deleted file mode 100644 index ba4f9a9a84a7..000000000000 --- a/techpack/audio/dsp/q6usm.h +++ /dev/null @@ -1,127 +0,0 @@ -/* Copyright (c) 2011-2014, 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __Q6_USM_H__ -#define __Q6_USM_H__ - -#include - -#define Q6USM_EVENT_UNDEF 0 -#define Q6USM_EVENT_READ_DONE 1 -#define Q6USM_EVENT_WRITE_DONE 2 -#define Q6USM_EVENT_SIGNAL_DETECT_RESULT 3 - -/* cyclic buffer with 1 gap support */ -#define USM_MIN_BUF_CNT 3 - -#define FORMAT_USPS_EPOS 0x00000000 -#define FORMAT_USRAW 0x00000001 -#define FORMAT_USPROX 0x00000002 -#define FORMAT_USGES_SYNC 0x00000003 -#define FORMAT_USRAW_SYNC 0x00000004 -#define INVALID_FORMAT 0xffffffff - -#define IN 0x000 -#define OUT 0x001 - -#define USM_WRONG_TOKEN 0xffffffff -#define USM_UNDEF_TOKEN 0xfffffffe - -#define CMD_CLOSE 0x0004 - -/* bit 0:1 represents priority of stream */ -#define STREAM_PRIORITY_NORMAL 0x0000 -#define STREAM_PRIORITY_LOW 0x0001 -#define STREAM_PRIORITY_HIGH 0x0002 - -/* bit 4 represents META enable of encoded data buffer */ -#define BUFFER_META_ENABLE 0x0010 - -struct us_port_data { - dma_addr_t phys; - /* cyclic region of buffers with 1 gap */ - void *data; - /* number of buffers in the region */ - uint32_t buf_cnt; - /* size of buffer */ - size_t buf_size; - /* write index */ - uint32_t dsp_buf; - /* read index */ - uint32_t cpu_buf; - /* expected token from dsp */ - uint32_t expected_token; - /* read or write locks */ - struct mutex lock; - spinlock_t dsp_lock; - /* ION dma_buf memory */ - struct dma_buf *dma_buf; - /* extended parameters, related to q6 variants */ - void *ext; - /* physical address of parameter buffer */ - dma_addr_t param_phys; - /* buffer which stores the parameter data */ - void *param_buf; - /* size of parameter buffer */ - uint32_t param_buf_size; - /* parameter buffer memory handle */ - void *param_buf_mem_handle; - /* ION dma_buf memory for parameter buffer */ - struct dma_buf *param_dma_buf; -}; - -struct us_client { - int session; - /* idx:1 out port, 0: in port*/ - struct us_port_data port[2]; - - struct apr_svc *apr; - struct mutex cmd_lock; - - atomic_t cmd_state; - atomic_t eos_state; - wait_queue_head_t cmd_wait; - - void (*cb)(uint32_t, uint32_t, uint32_t *, void *); - void *priv; -}; - -int q6usm_run(struct us_client *usc, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts); -int q6usm_cmd(struct us_client *usc, int cmd); -int q6usm_us_client_buf_alloc(unsigned int dir, struct us_client *usc, - unsigned int bufsz, unsigned int bufcnt); -int q6usm_us_param_buf_alloc(unsigned int dir, struct us_client *usc, - unsigned int bufsz); -int q6usm_enc_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg); -int q6usm_dec_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg); -int q6usm_read(struct us_client *usc, uint32_t read_ind); -struct us_client *q6usm_us_client_alloc( - void (*cb)(uint32_t, uint32_t, uint32_t *, void *), - void *priv); -int q6usm_open_read(struct us_client *usc, uint32_t format); -void q6usm_us_client_free(struct us_client *usc); -uint32_t q6usm_get_virtual_address(int dir, struct us_client *usc, - struct vm_area_struct *vms); -int q6usm_open_write(struct us_client *usc, uint32_t format); -int q6usm_write(struct us_client *usc, uint32_t write_ind); -bool q6usm_is_write_buf_full(struct us_client *usc, uint32_t *free_region); -int q6usm_set_us_detection(struct us_client *usc, - struct usm_session_cmd_detect_info *detect_info, - uint16_t detect_info_size); -int q6usm_set_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size); -int q6usm_get_us_stream_param(int dir, struct us_client *usc, - uint32_t module_id, uint32_t param_id, uint32_t buf_size); -int q6usm_init(void); - -#endif /* __Q6_USM_H__ */ diff --git a/techpack/audio/dsp/q6voice.c b/techpack/audio/dsp/q6voice.c deleted file mode 100644 index fa42543a2532..000000000000 --- a/techpack/audio/dsp/q6voice.c +++ /dev/null @@ -1,10086 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" -#include - -#define TIMEOUT_MS 300 - - -#define CMD_STATUS_SUCCESS 0 -#define CMD_STATUS_FAIL 1 -#define NUM_CHANNELS_MONO 1 -#define NUM_CHANNELS_STEREO 2 -#define NUM_CHANNELS_THREE 3 -#define NUM_CHANNELS_QUAD 4 -#define CVP_VERSION_2 2 -#define GAIN_Q14_FORMAT(a) (a << 14) - -enum { - VOC_TOKEN_NONE, - VOIP_MEM_MAP_TOKEN, - VOC_CAL_MEM_MAP_TOKEN, - VOC_VOICE_HOST_PCM_MAP_TOKEN, - VOC_RTAC_MEM_MAP_TOKEN, - VOC_SOURCE_TRACKING_MEM_MAP_TOKEN -}; - -struct cvd_version_table cvd_version_table_mapping[CVD_INT_VERSION_MAX] = { - {CVD_VERSION_DEFAULT, CVD_INT_VERSION_DEFAULT}, - {CVD_VERSION_0_0, CVD_INT_VERSION_0_0}, - {CVD_VERSION_2_1, CVD_INT_VERSION_2_1}, - {CVD_VERSION_2_2, CVD_INT_VERSION_2_2}, - {CVD_VERSION_2_3, CVD_INT_VERSION_2_3}, - {CVD_VERSION_2_4, CVD_INT_VERSION_2_4}, -}; - -static struct common_data common; -static bool module_initialized; - -static int voice_send_enable_vocproc_cmd(struct voice_data *v); -static int voice_send_netid_timing_cmd(struct voice_data *v); -static int voice_send_attach_vocproc_cmd(struct voice_data *v); -static int voice_send_set_device_cmd(struct voice_data *v); -static int voice_send_vol_step_cmd(struct voice_data *v); -static int voice_send_mvm_unmap_memory_physical_cmd(struct voice_data *v, - uint32_t mem_handle); -static int voice_send_mvm_cal_network_cmd(struct voice_data *v); -static int voice_send_mvm_media_type_cmd(struct voice_data *v); -static int voice_send_mvm_cvd_version_cmd(struct voice_data *v); -static int voice_send_mvm_event_class_cmd(struct voice_data *v, - uint32_t event_id, - uint32_t class_id); -static int voice_send_cvs_data_exchange_mode_cmd(struct voice_data *v); -static int voice_send_cvs_packet_exchange_config_cmd(struct voice_data *v); -static int voice_set_packet_exchange_mode_and_config(uint32_t session_id, - uint32_t mode); - -static int voice_send_cvs_register_cal_cmd(struct voice_data *v); -static int voice_send_cvs_deregister_cal_cmd(struct voice_data *v); -static int voice_send_cvp_create_cmd(struct voice_data *v); -static int voice_send_cvp_register_dev_cfg_cmd(struct voice_data *v); -static int voice_send_cvp_deregister_dev_cfg_cmd(struct voice_data *v); -static int voice_send_cvp_register_cal_cmd(struct voice_data *v); -static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v); -static int voice_send_cvp_register_vol_cal_cmd(struct voice_data *v); -static int voice_send_cvp_deregister_vol_cal_cmd(struct voice_data *v); -static int voice_send_cvp_media_fmt_info_cmd(struct voice_data *v); -static int voice_send_cvp_device_channels_cmd(struct voice_data *v); -static int voice_send_cvp_media_format_cmd(struct voice_data *v, - uint32_t param_type); -static int voice_send_cvp_topology_commit_cmd(struct voice_data *v); -static int voice_send_cvp_channel_info_cmd(struct voice_data *v); -static int voice_send_cvp_channel_info_v2(struct voice_data *v, - uint32_t param_type); -static int voice_get_avcs_version_per_service(uint32_t service_id); - -static void voice_load_topo_modules(int cal_index); -static void voice_unload_topo_modules(void); - -static int voice_cvs_stop_playback(struct voice_data *v); -static int voice_cvs_start_playback(struct voice_data *v); -static int voice_cvs_start_record(struct voice_data *v, uint32_t rec_mode, - uint32_t port_id); -static int voice_cvs_stop_record(struct voice_data *v); - -static int32_t qdsp_mvm_callback(struct apr_client_data *data, void *priv); -static int32_t qdsp_cvs_callback(struct apr_client_data *data, void *priv); -static int32_t qdsp_cvp_callback(struct apr_client_data *data, void *priv); - -static int voice_send_set_pp_enable_cmd( - struct voice_data *v, struct module_instance_info mod_inst_info, - int enable); -static int is_cal_memory_allocated(void); -static bool is_cvd_version_queried(void); -static int is_voip_memory_allocated(void); -static int voice_get_cvd_int_version(char *cvd_ver_string); -static int voice_alloc_cal_mem_map_table(void); -static int voice_alloc_rtac_mem_map_table(void); -static int voice_alloc_oob_shared_mem(void); -static int voice_free_oob_shared_mem(void); -static int voice_alloc_oob_mem_table(void); -static int voice_alloc_and_map_oob_mem(struct voice_data *v); - -static struct voice_data *voice_get_session_by_idx(int idx); - -static int remap_cal_data(struct cal_block_data *cal_block, - uint32_t session_id); -static int voice_unmap_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block); - -static int is_source_tracking_shared_memomry_allocated(void); -static int voice_alloc_source_tracking_shared_memory(void); -static int voice_alloc_and_map_source_tracking_shared_memory( - struct voice_data *v); -static int voice_unmap_and_free_source_tracking_shared_memory( - struct voice_data *v); -static int voice_send_set_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param soundFocusData); -static int voice_send_get_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param *soundFocusData); -static int voice_send_get_source_tracking_cmd(struct voice_data *v, - struct source_tracking_param *sourceTrackingData); -static int voice_pack_and_set_cvp_param(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data); -static int voice_pack_and_set_cvs_ui_property(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data); - -static void voice_itr_init(struct voice_session_itr *itr, - u32 session_id) -{ - if (itr == NULL) - return; - itr->session_idx = voice_get_idx_for_session(session_id); - if (session_id == ALL_SESSION_VSID) - itr->cur_idx = 0; - else - itr->cur_idx = itr->session_idx; - -} - -static bool voice_itr_get_next_session(struct voice_session_itr *itr, - struct voice_data **voice) -{ - bool ret = false; - - if (itr == NULL) - return false; - pr_debug("%s : cur idx = %d session idx = %d\n", - __func__, itr->cur_idx, itr->session_idx); - - if (itr->cur_idx <= itr->session_idx) { - ret = true; - *voice = voice_get_session_by_idx(itr->cur_idx); - itr->cur_idx++; - } else { - *voice = NULL; - } - - return ret; -} - -static bool voice_is_valid_session_id(uint32_t session_id) -{ - bool ret = false; - - switch (session_id) { - case VOICE_SESSION_VSID: - case VOICE2_SESSION_VSID: - case VOLTE_SESSION_VSID: - case VOIP_SESSION_VSID: - case QCHAT_SESSION_VSID: - case VOWLAN_SESSION_VSID: - case VOICEMMODE1_VSID: - case VOICEMMODE2_VSID: - case ALL_SESSION_VSID: - ret = true; - break; - default: - pr_err("%s: Invalid session_id : %x\n", __func__, session_id); - - break; - } - - return ret; -} - -static u16 voice_get_mvm_handle(struct voice_data *v) -{ - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return 0; - } - - pr_debug("%s: mvm_handle %d\n", __func__, v->mvm_handle); - - return v->mvm_handle; -} - -static void voice_set_mvm_handle(struct voice_data *v, u16 mvm_handle) -{ - pr_debug("%s: mvm_handle %d\n", __func__, mvm_handle); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return; - } - - v->mvm_handle = mvm_handle; -} - -static u16 voice_get_cvs_handle(struct voice_data *v) -{ - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return 0; - } - - pr_debug("%s: cvs_handle %d\n", __func__, v->cvs_handle); - - return v->cvs_handle; -} - -static void voice_set_cvs_handle(struct voice_data *v, u16 cvs_handle) -{ - pr_debug("%s: cvs_handle %d\n", __func__, cvs_handle); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return; - } - - v->cvs_handle = cvs_handle; -} - -static u16 voice_get_cvp_handle(struct voice_data *v) -{ - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return 0; - } - - pr_debug("%s: cvp_handle %d\n", __func__, v->cvp_handle); - - return v->cvp_handle; -} - -static void voice_set_cvp_handle(struct voice_data *v, u16 cvp_handle) -{ - pr_debug("%s: cvp_handle %d\n", __func__, cvp_handle); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return; - } - - v->cvp_handle = cvp_handle; -} - -char *voc_get_session_name(u32 session_id) -{ - char *session_name = NULL; - - if (session_id == common.voice[VOC_PATH_PASSIVE].session_id) { - session_name = VOICE_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOLTE_PASSIVE].session_id) { - session_name = VOLTE_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_QCHAT_PASSIVE].session_id) { - session_name = QCHAT_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id) { - session_name = VOWLAN_SESSION_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id) { - session_name = VOICEMMODE1_NAME; - } else if (session_id == - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id) { - session_name = VOICEMMODE2_NAME; - } else if (session_id == common.voice[VOC_PATH_FULL].session_id) { - session_name = VOIP_SESSION_NAME; - } - return session_name; -} - -/** - * voc_get_session_id - - * Get session ID of given voice session name - * - * @name: voice session name - * - * Returns session id for valid session or 0 if invalid. - */ -uint32_t voc_get_session_id(char *name) -{ - u32 session_id = 0; - - if (name != NULL) { - if (!strcmp(name, "Voice session")) - session_id = common.voice[VOC_PATH_PASSIVE].session_id; - else if (!strcmp(name, "Voice2 session")) - session_id = - common.voice[VOC_PATH_VOICE2_PASSIVE].session_id; - else if (!strcmp(name, "VoLTE session")) - session_id = - common.voice[VOC_PATH_VOLTE_PASSIVE].session_id; - else if (!strcmp(name, "QCHAT session")) - session_id = - common.voice[VOC_PATH_QCHAT_PASSIVE].session_id; - else if (!strcmp(name, "VoWLAN session")) - session_id = - common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id; - else if (!strcmp(name, "VoiceMMode1")) - session_id = - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id; - else if (!strcmp(name, "VoiceMMode2")) - session_id = - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id; - else - session_id = common.voice[VOC_PATH_FULL].session_id; - - pr_debug("%s: %s has session id 0x%x\n", __func__, name, - session_id); - } - - return session_id; -} -EXPORT_SYMBOL(voc_get_session_id); - -static struct voice_data *voice_get_session(u32 session_id) -{ - struct voice_data *v = NULL; - - switch (session_id) { - case VOICE_SESSION_VSID: - v = &common.voice[VOC_PATH_PASSIVE]; - break; - - case VOICE2_SESSION_VSID: - v = &common.voice[VOC_PATH_VOICE2_PASSIVE]; - break; - - case VOLTE_SESSION_VSID: - v = &common.voice[VOC_PATH_VOLTE_PASSIVE]; - break; - - case VOIP_SESSION_VSID: - v = &common.voice[VOC_PATH_FULL]; - break; - - case QCHAT_SESSION_VSID: - v = &common.voice[VOC_PATH_QCHAT_PASSIVE]; - break; - - case VOWLAN_SESSION_VSID: - v = &common.voice[VOC_PATH_VOWLAN_PASSIVE]; - break; - - case VOICEMMODE1_VSID: - v = &common.voice[VOC_PATH_VOICEMMODE1_PASSIVE]; - break; - - case VOICEMMODE2_VSID: - v = &common.voice[VOC_PATH_VOICEMMODE2_PASSIVE]; - break; - - case ALL_SESSION_VSID: - break; - - default: - pr_err("%s: Invalid session_id : %x\n", __func__, session_id); - - break; - } - - pr_debug("%s:session_id 0x%x session handle %pK\n", - __func__, session_id, v); - - return v; -} - -int voice_get_idx_for_session(u32 session_id) -{ - int idx = 0; - - switch (session_id) { - case VOICE_SESSION_VSID: - idx = VOC_PATH_PASSIVE; - break; - - case VOICE2_SESSION_VSID: - idx = VOC_PATH_VOICE2_PASSIVE; - break; - - case VOLTE_SESSION_VSID: - idx = VOC_PATH_VOLTE_PASSIVE; - break; - - case VOIP_SESSION_VSID: - idx = VOC_PATH_FULL; - break; - - case QCHAT_SESSION_VSID: - idx = VOC_PATH_QCHAT_PASSIVE; - break; - - case VOWLAN_SESSION_VSID: - idx = VOC_PATH_VOWLAN_PASSIVE; - break; - - case VOICEMMODE1_VSID: - idx = VOC_PATH_VOICEMMODE1_PASSIVE; - break; - - case VOICEMMODE2_VSID: - idx = VOC_PATH_VOICEMMODE2_PASSIVE; - break; - - case ALL_SESSION_VSID: - idx = MAX_VOC_SESSIONS - 1; - break; - - default: - pr_err("%s: Invalid session_id : %x\n", __func__, session_id); - - break; - } - - return idx; -} - -static struct voice_data *voice_get_session_by_idx(int idx) -{ - return ((idx < 0 || idx >= MAX_VOC_SESSIONS) ? - NULL : &common.voice[idx]); -} - -static bool is_voip_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_FULL].session_id); -} - -static bool is_volte_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_VOLTE_PASSIVE].session_id); -} - -static bool is_voice2_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_VOICE2_PASSIVE].session_id); -} - -static bool is_qchat_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_QCHAT_PASSIVE].session_id); -} - -static bool is_vowlan_session(u32 session_id) -{ - return (session_id == common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id); -} - -static bool is_voicemmode1(u32 session_id) -{ - return session_id == - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id; -} - -static bool is_voicemmode2(u32 session_id) -{ - return session_id == - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id; -} - -static bool is_voc_state_active(int voc_state) -{ - if ((voc_state == VOC_RUN) || - (voc_state == VOC_CHANGE) || - (voc_state == VOC_STANDBY)) - return true; - - return false; -} - -static void voc_set_error_state(uint16_t reset_proc) -{ - struct voice_data *v = NULL; - int i; - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - if (v != NULL) { - v->voc_state = VOC_ERROR; - v->rec_info.recording = 0; - } - } -} - -static bool is_other_session_active(u32 session_id) -{ - int i; - bool ret = false; - - /* Check if there is other active session except the input one */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - if (common.voice[i].session_id == session_id) - continue; - - if (is_voc_state_active(common.voice[i].voc_state)) { - ret = true; - break; - } - } - pr_debug("%s: ret %d\n", __func__, ret); - - return ret; -} - -static bool is_sub1_vsid(u32 session_id) -{ - bool ret; - - switch (session_id) { - case VOICE_SESSION_VSID: - case VOLTE_SESSION_VSID: - case VOWLAN_SESSION_VSID: - case VOICEMMODE1_VSID: - ret = true; - break; - default: - ret = false; - } - - return ret; -} - -static bool is_sub2_vsid(u32 session_id) -{ - bool ret; - - switch (session_id) { - case VOICE2_SESSION_VSID: - case VOICEMMODE2_VSID: - ret = true; - break; - default: - ret = false; - } - - return ret; -} - -static bool is_voice_app_id(u32 session_id) -{ - return is_sub1_vsid(session_id) || is_sub2_vsid(session_id); -} - -static void init_session_id(void) -{ - common.voice[VOC_PATH_PASSIVE].session_id = VOICE_SESSION_VSID; - common.voice[VOC_PATH_VOLTE_PASSIVE].session_id = VOLTE_SESSION_VSID; - common.voice[VOC_PATH_VOICE2_PASSIVE].session_id = VOICE2_SESSION_VSID; - common.voice[VOC_PATH_FULL].session_id = VOIP_SESSION_VSID; - common.voice[VOC_PATH_QCHAT_PASSIVE].session_id = QCHAT_SESSION_VSID; - common.voice[VOC_PATH_VOWLAN_PASSIVE].session_id = VOWLAN_SESSION_VSID; - common.voice[VOC_PATH_VOICEMMODE1_PASSIVE].session_id = - VOICEMMODE1_VSID; - common.voice[VOC_PATH_VOICEMMODE2_PASSIVE].session_id = - VOICEMMODE2_VSID; -} - -static bool is_cvd_version_queried(void) -{ - bool ret = 0; - - if (!strcmp(common.cvd_version, CVD_VERSION_DEFAULT)) - ret = false; - else - ret = true; - - return ret; -} - -static int voice_get_cvd_int_version(char *cvd_ver_string) -{ - unsigned int idx; - int cvd_int_ver = CVD_INT_VERSION_DEFAULT; - - for (idx = 0; idx < CVD_INT_VERSION_MAX; idx++) { - if (strcmp((char *)cvd_ver_string, - cvd_version_table_mapping[idx].cvd_ver) == 0) { - cvd_int_ver = - cvd_version_table_mapping[idx].cvd_ver_int; - break; - } - } - return cvd_int_ver; -} - -static int voice_apr_register(uint32_t session_id) -{ - - pr_debug("%s\n", __func__); - - mutex_lock(&common.common_lock); - - /* register callback to APR */ - if (common.apr_q6_mvm == NULL) { - pr_debug("%s: Start to register MVM callback\n", __func__); - - common.apr_q6_mvm = apr_register("ADSP", "MVM", - qdsp_mvm_callback, - 0xFFFFFFFF, &common); - - if (common.apr_q6_mvm == NULL) { - pr_err("%s: Unable to register MVM\n", __func__); - goto err; - } - } - - if (common.apr_q6_cvs == NULL) { - pr_debug("%s: Start to register CVS callback\n", __func__); - - common.apr_q6_cvs = apr_register("ADSP", "CVS", - qdsp_cvs_callback, - 0xFFFFFFFF, &common); - - if (common.apr_q6_cvs == NULL) { - pr_err("%s: Unable to register CVS\n", __func__); - goto err; - } - rtac_set_voice_handle(RTAC_CVS, common.apr_q6_cvs); - } - - if (common.apr_q6_cvp == NULL) { - pr_debug("%s: Start to register CVP callback\n", __func__); - - common.apr_q6_cvp = apr_register("ADSP", "CVP", - qdsp_cvp_callback, - 0xFFFFFFFF, &common); - - if (common.apr_q6_cvp == NULL) { - pr_err("%s: Unable to register CVP\n", __func__); - goto err; - } - rtac_set_voice_handle(RTAC_CVP, common.apr_q6_cvp); - } - - mutex_unlock(&common.common_lock); - - return 0; - -err: - if (common.apr_q6_cvs != NULL) { - apr_deregister(common.apr_q6_cvs); - common.apr_q6_cvs = NULL; - rtac_set_voice_handle(RTAC_CVS, NULL); - } - if (common.apr_q6_mvm != NULL) { - apr_deregister(common.apr_q6_mvm); - common.apr_q6_mvm = NULL; - } - - mutex_unlock(&common.common_lock); - - return -ENODEV; -} - -static int voice_send_mvm_cvd_version_cmd(struct voice_data *v) -{ - int ret; - struct apr_hdr cvd_version_get_cmd; - void *apr_mvm; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - /* Send command to CVD to retrieve Version */ - cvd_version_get_cmd.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvd_version_get_cmd.pkt_size = APR_PKT_SIZE( - APR_HDR_SIZE, - sizeof(cvd_version_get_cmd) - - APR_HDR_SIZE); - cvd_version_get_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvd_version_get_cmd.dest_port = 0; - cvd_version_get_cmd.token = 0; - cvd_version_get_cmd.opcode = VSS_IVERSION_CMD_GET; - - pr_debug("%s: send CVD version get cmd, pkt size = %d\n", - __func__, cvd_version_get_cmd.pkt_size); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &cvd_version_get_cmd); - if (ret < 0) { - pr_err("%s: Error sending command\n", __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout, fall back to default\n", - __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - ret = 0; - -done: - if (ret) { - strlcpy(common.cvd_version, CVD_VERSION_0_0, - sizeof(common.cvd_version)); - } - pr_debug("%s: CVD Version retrieved=%s\n", - __func__, common.cvd_version); - - return ret; -} - -static int voice_send_mvm_event_class_cmd(struct voice_data *v, - uint32_t event_id, - uint32_t class_id) -{ - struct vss_inotify_cmd_event_class_t mvm_event; - int ret = 0; - void *apr_mvm = NULL; - u16 mvm_handle = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - - memset(&mvm_event, 0, sizeof(mvm_event)); - mvm_handle = voice_get_mvm_handle(v); - mvm_event.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_event.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_event) - APR_HDR_SIZE); - mvm_event.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_event.hdr.dest_port = mvm_handle; - mvm_event.hdr.token = 0; - mvm_event.hdr.opcode = event_id; - mvm_event.class_id = class_id; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_event); - if (ret < 0) { - pr_err("%s: Error %d sending %x event\n", __func__, ret, - event_id); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - ret = -ETIMEDOUT; - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_dual_control_cmd(struct voice_data *v) -{ - int ret = 0; - struct mvm_modem_dual_control_session_cmd mvm_voice_ctl_cmd; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - pr_debug("%s: Send Dual Control command to MVM\n", __func__); - if (!is_voip_session(v->session_id)) { - mvm_handle = voice_get_mvm_handle(v); - mvm_voice_ctl_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_voice_ctl_cmd.hdr.pkt_size = APR_PKT_SIZE( - APR_HDR_SIZE, - sizeof(mvm_voice_ctl_cmd) - - APR_HDR_SIZE); - pr_debug("%s: send mvm Voice Ctl pkt size = %d\n", - __func__, mvm_voice_ctl_cmd.hdr.pkt_size); - mvm_voice_ctl_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_voice_ctl_cmd.hdr.dest_port = mvm_handle; - mvm_voice_ctl_cmd.hdr.token = 0; - mvm_voice_ctl_cmd.hdr.opcode = - VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL; - mvm_voice_ctl_cmd.voice_ctl.enable_flag = true; - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_voice_ctl_cmd); - if (ret < 0) { - pr_err("%s: Error sending MVM Voice CTL CMD\n", - __func__); - ret = -EINVAL; - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -EINVAL; - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } - ret = 0; -fail: - return ret; -} - - -static int voice_create_mvm_cvs_session(struct voice_data *v) -{ - int ret = 0; - struct mvm_create_ctl_session_cmd mvm_session_cmd; - struct cvs_create_passive_ctl_session_cmd cvs_session_cmd; - struct cvs_create_full_ctl_session_cmd cvs_full_ctl_cmd; - struct mvm_attach_stream_cmd attach_stream_cmd; - void *apr_mvm, *apr_cvs, *apr_cvp; - u16 mvm_handle, cvs_handle, cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - apr_cvs = common.apr_q6_cvs; - apr_cvp = common.apr_q6_cvp; - - if (!apr_mvm || !apr_cvs || !apr_cvp) { - pr_err("%s: apr_mvm or apr_cvs or apr_cvp is NULL\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvs_handle = voice_get_cvs_handle(v); - cvp_handle = voice_get_cvp_handle(v); - - pr_debug("%s: mvm_hdl=%d, cvs_hdl=%d\n", __func__, - mvm_handle, cvs_handle); - /* send cmd to create mvm session and wait for response */ - - if (!mvm_handle) { - memset(mvm_session_cmd.mvm_session.name, 0, - sizeof(mvm_session_cmd.mvm_session.name)); - if (!is_voip_session(v->session_id)) { - mvm_session_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_session_cmd.hdr.pkt_size = APR_PKT_SIZE( - APR_HDR_SIZE, - sizeof(mvm_session_cmd) - - APR_HDR_SIZE); - pr_debug("%s: send mvm create session pkt size = %d\n", - __func__, mvm_session_cmd.hdr.pkt_size); - mvm_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_session_cmd.hdr.dest_port = 0; - mvm_session_cmd.hdr.token = 0; - mvm_session_cmd.hdr.opcode = - VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION; - if (is_volte_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - "default volte voice", - strlen("default volte voice")+1); - } else if (is_voice2_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOICE2_SESSION_VSID_STR, - strlen(VOICE2_SESSION_VSID_STR)+1); - } else if (is_qchat_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - QCHAT_SESSION_VSID_STR, - strlen(QCHAT_SESSION_VSID_STR)+1); - } else if (is_vowlan_session(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOWLAN_SESSION_VSID_STR, - strlen(VOWLAN_SESSION_VSID_STR)+1); - } else if (is_voicemmode1(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOICEMMODE1_VSID_STR, - strlen(VOICEMMODE1_VSID_STR) + 1); - } else if (is_voicemmode2(v->session_id)) { - strlcpy(mvm_session_cmd.mvm_session.name, - VOICEMMODE2_VSID_STR, - strlen(VOICEMMODE2_VSID_STR) + 1); - } else { - strlcpy(mvm_session_cmd.mvm_session.name, - "default modem voice", - strlen("default modem voice")+1); - } - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &mvm_session_cmd); - if (ret < 0) { - pr_err("%s: Error sending MVM_CONTROL_SESSION\n", - __func__); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } else { - pr_debug("%s: creating MVM full ctrl\n", __func__); - mvm_session_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_session_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_session_cmd) - - APR_HDR_SIZE); - mvm_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_session_cmd.hdr.dest_port = 0; - mvm_session_cmd.hdr.token = 0; - mvm_session_cmd.hdr.opcode = - VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION; - strlcpy(mvm_session_cmd.mvm_session.name, - "default voip", - strlen("default voip")+1); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &mvm_session_cmd); - if (ret < 0) { - pr_err("Fail in sending MVM_CONTROL_SESSION\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } - /* Get the created MVM handle. */ - mvm_handle = voice_get_mvm_handle(v); - } - /* send cmd to create cvs session */ - if (!cvs_handle) { - memset(cvs_session_cmd.cvs_session.name, 0, - sizeof(cvs_session_cmd.cvs_session.name)); - if (!is_voip_session(v->session_id)) { - pr_debug("%s: creating CVS passive session\n", - __func__); - - cvs_session_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_session_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_session_cmd) - - APR_HDR_SIZE); - cvs_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_session_cmd.hdr.dest_port = 0; - cvs_session_cmd.hdr.token = 0; - cvs_session_cmd.hdr.opcode = - VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION; - if (is_volte_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - "default volte voice", - strlen("default volte voice")+1); - } else if (is_voice2_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOICE2_SESSION_VSID_STR, - strlen(VOICE2_SESSION_VSID_STR)+1); - } else if (is_qchat_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - QCHAT_SESSION_VSID_STR, - strlen(QCHAT_SESSION_VSID_STR)+1); - } else if (is_vowlan_session(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOWLAN_SESSION_VSID_STR, - strlen(VOWLAN_SESSION_VSID_STR)+1); - } else if (is_voicemmode1(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOICEMMODE1_VSID_STR, - strlen(VOICEMMODE1_VSID_STR) + 1); - } else if (is_voicemmode2(v->session_id)) { - strlcpy(cvs_session_cmd.cvs_session.name, - VOICEMMODE2_VSID_STR, - strlen(VOICEMMODE2_VSID_STR) + 1); - } else { - strlcpy(cvs_session_cmd.cvs_session.name, - "default modem voice", - strlen("default modem voice")+1); - } - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, - (uint32_t *) &cvs_session_cmd); - if (ret < 0) { - pr_err("Fail in sending STREAM_CONTROL_SESSION\n"); - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - /* Get the created CVS handle. */ - cvs_handle = voice_get_cvs_handle(v); - - } else { - pr_debug("%s: creating CVS full session\n", __func__); - - cvs_full_ctl_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - - cvs_full_ctl_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_full_ctl_cmd) - - APR_HDR_SIZE); - - cvs_full_ctl_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_full_ctl_cmd.hdr.dest_port = 0; - cvs_full_ctl_cmd.hdr.token = 0; - cvs_full_ctl_cmd.hdr.opcode = - VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION; - cvs_full_ctl_cmd.cvs_session.direction = 2; - cvs_full_ctl_cmd.cvs_session.enc_media_type = - common.mvs_info.media_type; - cvs_full_ctl_cmd.cvs_session.dec_media_type = - common.mvs_info.media_type; - cvs_full_ctl_cmd.cvs_session.network_id = - common.mvs_info.network_type; - strlcpy(cvs_full_ctl_cmd.cvs_session.name, - "default q6 voice", - strlen("default q6 voice")+1); - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, - (uint32_t *) &cvs_full_ctl_cmd); - - if (ret < 0) { - pr_err("%s: Err %d sending CREATE_FULL_CTRL\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - /* Get the created CVS handle. */ - cvs_handle = voice_get_cvs_handle(v); - - /* Attach MVM to CVS. */ - pr_debug("%s: Attach MVM to stream\n", __func__); - - attach_stream_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - attach_stream_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(attach_stream_cmd) - - APR_HDR_SIZE); - attach_stream_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - attach_stream_cmd.hdr.dest_port = mvm_handle; - attach_stream_cmd.hdr.token = 0; - attach_stream_cmd.hdr.opcode = - VSS_IMVM_CMD_ATTACH_STREAM; - attach_stream_cmd.attach_stream.handle = cvs_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, - (uint32_t *) &attach_stream_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending ATTACH_STREAM\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - } - } - return 0; - -fail: - return ret; -} - -static int voice_unmap_cal_block(struct voice_data *v, int cal_index) -{ - int result = 0; - struct cal_block_data *cal_block; - - if (common.cal_data[cal_index] == NULL) { - pr_err("%s: Cal type is NULL, index %d!\n", - __func__, cal_index); - - goto done; - } - - mutex_lock(&common.cal_data[cal_index]->lock); - cal_block = cal_utils_get_only_cal_block( - common.cal_data[cal_index]); - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL, index %d!\n", - __func__, cal_index); - - result = -EINVAL; - goto unlock; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_debug("%s: Q6 handle is not set!\n", __func__); - - result = -EINVAL; - goto unlock; - } - - result = voice_send_mvm_unmap_memory_physical_cmd( - v, cal_block->map_data.q6map_handle); - if (result) - pr_err("%s: Voice_send_mvm_unmap_memory_physical_cmd failed for session 0x%x, err %d!\n", - __func__, v->session_id, result); - - cal_block->map_data.q6map_handle = 0; -unlock: - mutex_unlock(&common.cal_data[cal_index]->lock); -done: - return result; -} - -static int voice_destroy_mvm_cvs_session(struct voice_data *v) -{ - int ret = 0; - struct mvm_detach_stream_cmd detach_stream; - struct apr_hdr mvm_destroy; - struct apr_hdr cvs_destroy; - void *apr_mvm, *apr_cvs; - u16 mvm_handle, cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - apr_cvs = common.apr_q6_cvs; - - if (!apr_mvm || !apr_cvs) { - pr_err("%s: apr_mvm or apr_cvs is NULL\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvs_handle = voice_get_cvs_handle(v); - - /* MVM, CVS sessions are destroyed only for Full control sessions. */ - if (is_voip_session(v->session_id)) { - pr_debug("%s: MVM detach stream, VOC_STATE: %d\n", __func__, - v->voc_state); - - /* Detach voice stream. */ - detach_stream.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - detach_stream.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(detach_stream) - APR_HDR_SIZE); - detach_stream.hdr.src_port = - voice_get_idx_for_session(v->session_id); - detach_stream.hdr.dest_port = mvm_handle; - detach_stream.hdr.token = 0; - detach_stream.hdr.opcode = VSS_IMVM_CMD_DETACH_STREAM; - detach_stream.detach_stream.handle = cvs_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &detach_stream); - if (ret < 0) { - pr_err("%s: Error %d sending DETACH_STREAM\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - /* Unmap memory */ - if (v->shmem_info.mem_handle != 0) { - ret = voice_send_mvm_unmap_memory_physical_cmd(v, - v->shmem_info.mem_handle); - if (ret < 0) { - pr_err("%s Memory_unmap for voip failed %d\n", - __func__, ret); - - goto fail; - } - v->shmem_info.mem_handle = 0; - } - } - - /* Unmap Source Tracking shared memory if mapped earlier */ - voice_unmap_and_free_source_tracking_shared_memory(v); - - if (is_voip_session(v->session_id) || - is_qchat_session(v->session_id) || - is_volte_session(v->session_id) || - is_vowlan_session(v->session_id) || - v->voc_state == VOC_ERROR || common.is_destroy_cvd) { - /* Destroy CVS. */ - pr_debug("%s: CVS destroy session\n", __func__); - - cvs_destroy.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_destroy.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_destroy) - APR_HDR_SIZE); - cvs_destroy.src_port = - voice_get_idx_for_session(v->session_id); - cvs_destroy.dest_port = cvs_handle; - cvs_destroy.token = 0; - cvs_destroy.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_destroy); - if (ret < 0) { - pr_err("%s: Error %d sending CVS DESTROY\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - cvs_handle = 0; - voice_set_cvs_handle(v, cvs_handle); - - /* Unmap physical memory for all calibration buffers */ - if (!is_other_session_active(v->session_id)) { - if (voice_unmap_cal_block(v, CVP_VOCPROC_CAL)) - pr_err("%s: Unmap VOCPROC cal failed\n", - __func__); - if (voice_unmap_cal_block(v, CVP_VOCVOL_CAL)) - pr_err("%s: Unmap VOCVOL cal failed\n", - __func__); - if (voice_unmap_cal_block(v, CVP_VOCDEV_CFG_CAL)) - pr_err("%s: Unmap VOCDEV_CFG cal failed\n", - __func__); - if (voice_unmap_cal_block(v, CVS_VOCSTRM_CAL)) - pr_err("%s: Unmap VOCSTRM cal failed\n", - __func__); - } - - /* Destroy MVM. */ - pr_debug("%s: MVM destroy session\n", __func__); - - mvm_destroy.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_destroy.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_destroy) - APR_HDR_SIZE); - mvm_destroy.src_port = - voice_get_idx_for_session(v->session_id); - mvm_destroy.dest_port = mvm_handle; - mvm_destroy.token = 0; - mvm_destroy.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_destroy); - if (ret < 0) { - pr_err("%s: Error %d sending MVM DESTROY\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - mvm_handle = 0; - voice_set_mvm_handle(v, mvm_handle); - } - return 0; -fail: - return ret; -} - -static int voice_send_tty_mode_cmd(struct voice_data *v) -{ - int ret = 0; - struct mvm_set_tty_mode_cmd mvm_tty_mode_cmd; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - /* send tty mode cmd to mvm */ - mvm_tty_mode_cmd.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_tty_mode_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_tty_mode_cmd) - - APR_HDR_SIZE); - pr_debug("%s: pkt size = %d\n", - __func__, mvm_tty_mode_cmd.hdr.pkt_size); - mvm_tty_mode_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_tty_mode_cmd.hdr.dest_port = mvm_handle; - mvm_tty_mode_cmd.hdr.token = 0; - mvm_tty_mode_cmd.hdr.opcode = VSS_ISTREAM_CMD_SET_TTY_MODE; - mvm_tty_mode_cmd.tty_mode.mode = v->tty_mode; - pr_debug("tty mode =%d\n", mvm_tty_mode_cmd.tty_mode.mode); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_tty_mode_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending SET_TTY_MODE\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_set_pp_enable_cmd( - struct voice_data *v, struct module_instance_info mod_inst_info, - int enable) -{ - struct enable_param enable_param; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&enable_param, 0, sizeof(enable_param)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - param_hdr.module_id = mod_inst_info.module_id; - param_hdr.instance_id = mod_inst_info.instance_id; - param_hdr.param_id = VOICE_PARAM_MOD_ENABLE; - param_hdr.param_size = sizeof(enable_param); - enable_param.enable = enable ? 1 : 0; - - pr_debug("%s: module_id=%d, instance_id=%d, enable=%d\n", - __func__, mod_inst_info.module_id, mod_inst_info.instance_id, - enable); - - ret = voice_pack_and_set_cvs_ui_property(v, param_hdr, - (uint8_t *) &enable_param); - if (ret < 0) - pr_err("Fail: sending cvs set pp enable\n"); - - return ret; -} - -static int voice_send_hd_cmd(struct voice_data *v, int enable) -{ - struct mvm_set_hd_enable_cmd mvm_set_hd_cmd; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - mvm_handle = voice_get_mvm_handle(v); - if (!mvm_handle) { - pr_err("%s: mvm_handle is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mvm_set_hd_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_hd_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_hd_cmd) - - APR_HDR_SIZE); - mvm_set_hd_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - mvm_set_hd_cmd.hdr.dest_port = mvm_handle; - mvm_set_hd_cmd.hdr.token = 0; - - if (enable) - mvm_set_hd_cmd.hdr.opcode = VSS_IHDVOICE_CMD_ENABLE; - else - mvm_set_hd_cmd.hdr.opcode = VSS_IHDVOICE_CMD_DISABLE; - - pr_debug("%s: enable=%d\n", __func__, enable); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_hd_cmd); - if (ret < 0) { - pr_err("%s: Failed to sending mvm set HD Voice enable %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_set_dtx(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct cvs_set_enc_dtx_mode_cmd cvs_set_dtx; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - /* Set DTX */ - cvs_set_dtx.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_dtx.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_dtx) - APR_HDR_SIZE); - cvs_set_dtx.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_dtx.hdr.dest_port = cvs_handle; - cvs_set_dtx.hdr.token = 0; - cvs_set_dtx.hdr.opcode = VSS_ISTREAM_CMD_SET_ENC_DTX_MODE; - cvs_set_dtx.dtx_mode.enable = common.mvs_info.dtx_mode; - - pr_debug("%s: Setting DTX %d\n", __func__, common.mvs_info.dtx_mode); - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_dtx); - if (ret < 0) { - pr_err("%s: Error %d sending SET_DTX\n", __func__, ret); - return -EINVAL; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - return -EINVAL; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - return ret; - } - - return 0; -} - -static int voice_send_mvm_media_type_cmd(struct voice_data *v) -{ - struct vss_imvm_cmd_set_cal_media_type_t mvm_set_cal_media_type; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_set_cal_media_type.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_cal_media_type.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_cal_media_type) - - APR_HDR_SIZE); - mvm_set_cal_media_type.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_cal_media_type.hdr.dest_port = mvm_handle; - mvm_set_cal_media_type.hdr.token = 0; - mvm_set_cal_media_type.hdr.opcode = VSS_IMVM_CMD_SET_CAL_MEDIA_TYPE; - mvm_set_cal_media_type.media_id = common.mvs_info.media_type; - pr_debug("%s: setting media_id as %x\n", - __func__, mvm_set_cal_media_type.media_id); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_cal_media_type); - if (ret < 0) { - pr_err("%s: Error %d sending media type\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_dtmf_rx_detection_cmd(struct voice_data *v, - uint32_t enable) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct cvs_set_rx_dtmf_detection_cmd cvs_dtmf_rx_detection; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - /* Set SET_DTMF_RX_DETECTION */ - cvs_dtmf_rx_detection.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_dtmf_rx_detection.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_dtmf_rx_detection) - APR_HDR_SIZE); - cvs_dtmf_rx_detection.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_dtmf_rx_detection.hdr.dest_port = cvs_handle; - cvs_dtmf_rx_detection.hdr.token = 0; - cvs_dtmf_rx_detection.hdr.opcode = - VSS_ISTREAM_CMD_SET_RX_DTMF_DETECTION; - cvs_dtmf_rx_detection.cvs_dtmf_det.enable = enable; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_dtmf_rx_detection); - if (ret < 0) { - pr_err("%s: Error %d sending SET_DTMF_RX_DETECTION\n", - __func__, - ret); - return -EINVAL; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - return -EINVAL; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - return ret; - } - - return ret; -} - -/** - * voc_disable_dtmf_det_on_active_sessions - - * command to disable DTMF detection for voice sessions - * - */ -void voc_disable_dtmf_det_on_active_sessions(void) -{ - struct voice_data *v = NULL; - int i; - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - if ((v->dtmf_rx_detect_en) && - is_voc_state_active(v->voc_state)) { - - pr_debug("disable dtmf det on ses_id=%d\n", - v->session_id); - voice_send_dtmf_rx_detection_cmd(v, 0); - } - } -} -EXPORT_SYMBOL(voc_disable_dtmf_det_on_active_sessions); - -/** - * voc_enable_dtmf_rx_detection - - * command to set DTMF RX detection - * - * @session_id: voice session ID to send this command - * @enable: Enable or Disable detection - * - * Returns 0 on success or error on failure - */ -int voc_enable_dtmf_rx_detection(uint32_t session_id, uint32_t enable) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - return -EINVAL; - } - - mutex_lock(&v->lock); - v->dtmf_rx_detect_en = enable; - - if (is_voc_state_active(v->voc_state)) - ret = voice_send_dtmf_rx_detection_cmd(v, - v->dtmf_rx_detect_en); - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_enable_dtmf_rx_detection); - -/** - * voc_set_destroy_cvd_flag - - * set flag for destroy CVD session - * - * @is_destroy_cvd: bool value used to indicate - * destroy CVD session or not. - * - */ -void voc_set_destroy_cvd_flag(bool is_destroy_cvd) -{ - pr_debug("%s: %d\n", __func__, is_destroy_cvd); - common.is_destroy_cvd = is_destroy_cvd; -} -EXPORT_SYMBOL(voc_set_destroy_cvd_flag); - -/** - * voc_alloc_cal_shared_memory - - * Alloc mem map table for calibration - * - * Returns 0 on success or error on failure - */ -int voc_alloc_cal_shared_memory(void) -{ - int rc = 0; - - mutex_lock(&common.common_lock); - if (is_cal_memory_allocated()) { - pr_debug("%s: Calibration shared buffer already allocated", - __func__); - } else { - /* Allocate memory for calibration memory map table. */ - rc = voice_alloc_cal_mem_map_table(); - if ((rc < 0) && (rc != -EPROBE_DEFER)) { - pr_err("%s: Failed to allocate cal memory, err=%d", - __func__, rc); - } - } - mutex_unlock(&common.common_lock); - - return rc; -} -EXPORT_SYMBOL(voc_alloc_cal_shared_memory); - -/** - * voc_alloc_voip_shared_memory - - * Alloc mem map table for OOB - * - * Returns 0 on success or error on failure - */ -int voc_alloc_voip_shared_memory(void) -{ - int rc = 0; - - /* Allocate shared memory for OOB Voip */ - rc = voice_alloc_oob_shared_mem(); - if (rc < 0) { - pr_err("%s: Failed to alloc shared memory for OOB rc:%d\n", - __func__, rc); - } else { - /* Allocate mem map table for OOB */ - rc = voice_alloc_oob_mem_table(); - if (rc < 0) { - pr_err("%s: Failed to alloc mem map talbe rc:%d\n", - __func__, rc); - - voice_free_oob_shared_mem(); - } - } - - return rc; -} -EXPORT_SYMBOL(voc_alloc_voip_shared_memory); - -static int is_cal_memory_allocated(void) -{ - bool ret; - - if (common.cal_mem_map_table.dma_buf != NULL) - ret = true; - else - ret = false; - - return ret; -} - - -static int free_cal_map_table(void) -{ - int ret = 0; - - if (common.cal_mem_map_table.dma_buf == NULL) - goto done; - - ret = msm_audio_ion_free(common.cal_mem_map_table.dma_buf); - if (ret < 0) - pr_err("%s: msm_audio_ion_free failed:\n", __func__); - -done: - common.cal_mem_map_table.dma_buf = NULL; - return ret; -} - -static int is_rtac_memory_allocated(void) -{ - bool ret; - - if (common.rtac_mem_map_table.dma_buf != NULL) - ret = true; - else - ret = false; - - return ret; -} - -static int free_rtac_map_table(void) -{ - int ret = 0; - - if (common.rtac_mem_map_table.dma_buf == NULL) - goto done; - - ret = msm_audio_ion_free(common.rtac_mem_map_table.dma_buf); - if (ret < 0) - pr_err("%s: msm_audio_ion_free failed:\n", __func__); - -done: - common.rtac_mem_map_table.dma_buf = NULL; - return ret; -} - - -static int is_voip_memory_allocated(void) -{ - bool ret; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - if (v == NULL) { - pr_err("%s: v is NULL, session_id:%d\n", __func__, - common.voice[VOC_PATH_FULL].session_id); - - ret = false; - goto done; - } - - mutex_lock(&common.common_lock); - if (v->shmem_info.sh_buf.dma_buf != NULL) - ret = true; - else - ret = false; - mutex_unlock(&common.common_lock); - -done: - return ret; -} - -static int voice_config_cvs_vocoder_amr_rate(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct cvs_set_amr_enc_rate_cmd cvs_set_amr_rate; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvs_handle = voice_get_cvs_handle(v); - - pr_debug("%s: Setting AMR rate. Media Type: %d\n", __func__, - common.mvs_info.media_type); - - cvs_set_amr_rate.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_amr_rate.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_amr_rate) - APR_HDR_SIZE); - cvs_set_amr_rate.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_amr_rate.hdr.dest_port = cvs_handle; - cvs_set_amr_rate.hdr.token = 0; - - if (common.mvs_info.media_type == VSS_MEDIA_ID_AMR_NB_MODEM) - cvs_set_amr_rate.hdr.opcode = - VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE; - else if (common.mvs_info.media_type == VSS_MEDIA_ID_AMR_WB_MODEM) - cvs_set_amr_rate.hdr.opcode = - VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE; - - cvs_set_amr_rate.amr_rate.mode = common.mvs_info.rate; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_amr_rate); - if (ret < 0) { - pr_err("%s: Error %d sending SET_AMR_RATE\n", - __func__, ret); - - goto done; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - return 0; -done: - return ret; -} - -static int voice_config_cvs_vocoder(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - /* Set media type. */ - struct cvs_set_media_type_cmd cvs_set_media_cmd; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - cvs_set_media_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_media_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_media_cmd) - - APR_HDR_SIZE); - cvs_set_media_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_media_cmd.hdr.dest_port = cvs_handle; - cvs_set_media_cmd.hdr.token = 0; - cvs_set_media_cmd.hdr.opcode = VSS_ISTREAM_CMD_SET_MEDIA_TYPE; - cvs_set_media_cmd.media_type.tx_media_id = common.mvs_info.media_type; - cvs_set_media_cmd.media_type.rx_media_id = common.mvs_info.media_type; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_media_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending SET_MEDIA_TYPE\n", - __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - /* Set encoder properties. */ - switch (common.mvs_info.media_type) { - case VSS_MEDIA_ID_EVRC_MODEM: - case VSS_MEDIA_ID_4GV_NB_MODEM: - case VSS_MEDIA_ID_4GV_WB_MODEM: - case VSS_MEDIA_ID_4GV_NW_MODEM: { - struct cvs_set_cdma_enc_minmax_rate_cmd cvs_set_cdma_rate; - - pr_debug("Setting EVRC min-max rate\n"); - - cvs_set_cdma_rate.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_set_cdma_rate.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_set_cdma_rate) - APR_HDR_SIZE); - cvs_set_cdma_rate.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_set_cdma_rate.hdr.dest_port = cvs_handle; - cvs_set_cdma_rate.hdr.token = 0; - cvs_set_cdma_rate.hdr.opcode = - VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE; - cvs_set_cdma_rate.cdma_rate.min_rate = - common.mvs_info.evrc_min_rate; - cvs_set_cdma_rate.cdma_rate.max_rate = - common.mvs_info.evrc_max_rate; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_cdma_rate); - if (ret < 0) { - pr_err("%s: Error %d sending SET_EVRC_MINMAX_RATE\n", - __func__, ret); - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - if (common.mvs_info.media_type != VSS_MEDIA_ID_EVRC_MODEM) { - ret = voice_set_dtx(v); - if (ret < 0) - goto fail; - } - - break; - } - case VSS_MEDIA_ID_AMR_NB_MODEM: - case VSS_MEDIA_ID_AMR_WB_MODEM: { - ret = voice_config_cvs_vocoder_amr_rate(v); - if (ret) { - pr_err("%s: Failed to update vocoder rate. %d\n", - __func__, ret); - - goto fail; - } - - ret = voice_set_dtx(v); - if (ret < 0) - goto fail; - - break; - } - case VSS_MEDIA_ID_G729: - case VSS_MEDIA_ID_G711_ALAW: - case VSS_MEDIA_ID_G711_MULAW: { - ret = voice_set_dtx(v); - - break; - } - default: - /* Do nothing. */ - break; - } - return 0; - -fail: - return ret; -} - -/** - * voc_update_amr_vocoder_rate - - * command to update AMR rate for voice session - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_update_amr_vocoder_rate(uint32_t session_id) -{ - int ret = 0; - struct voice_data *v; - - pr_debug("%s: session_id:%d", __func__, session_id); - - v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: v is NULL, session_id:%d\n", __func__, - session_id); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&v->lock); - ret = voice_config_cvs_vocoder_amr_rate(v); - mutex_unlock(&v->lock); - -done: - return ret; -} -EXPORT_SYMBOL(voc_update_amr_vocoder_rate); - -static int voice_send_start_voice_cmd(struct voice_data *v) -{ - struct apr_hdr mvm_start_voice_cmd; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_start_voice_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_start_voice_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_start_voice_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_start_voice_cmd pkt size = %d\n", - mvm_start_voice_cmd.pkt_size); - mvm_start_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_start_voice_cmd.dest_port = mvm_handle; - mvm_start_voice_cmd.token = 0; - mvm_start_voice_cmd.opcode = VSS_IMVM_CMD_START_VOICE; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_start_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_START_VOICE\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static void voc_get_tx_rx_topology(struct voice_data *v, - uint32_t *tx_topology_id, - uint32_t *rx_topology_id) -{ - uint32_t tx_id = 0; - uint32_t rx_id = 0; - - if (v->lch_mode == VOICE_LCH_START || v->disable_topology) { - pr_debug("%s: Setting TX and RX topology to NONE for LCH\n", - __func__); - - tx_id = VSS_IVOCPROC_TOPOLOGY_ID_NONE; - rx_id = VSS_IVOCPROC_TOPOLOGY_ID_NONE; - } else { - tx_id = voice_get_topology(CVP_VOC_TX_TOPOLOGY_CAL); - rx_id = voice_get_topology(CVP_VOC_RX_TOPOLOGY_CAL); - } - - *tx_topology_id = tx_id; - *rx_topology_id = rx_id; -} - -static int voice_send_set_device_cmd(struct voice_data *v) -{ - struct cvp_set_device_cmd cvp_setdev_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - cvp_handle = voice_get_cvp_handle(v); - - /* set device and wait for response */ - cvp_setdev_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_setdev_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_setdev_cmd) - APR_HDR_SIZE); - pr_debug(" send create cvp setdev, pkt size = %d\n", - cvp_setdev_cmd.hdr.pkt_size); - cvp_setdev_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_setdev_cmd.hdr.dest_port = cvp_handle; - cvp_setdev_cmd.hdr.token = 0; - - if (voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2) - cvp_setdev_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_SET_DEVICE_V3; - else - cvp_setdev_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_SET_DEVICE_V2; - - voc_get_tx_rx_topology(v, - &cvp_setdev_cmd.cvp_set_device_v2.tx_topology_id, - &cvp_setdev_cmd.cvp_set_device_v2.rx_topology_id); - - voice_set_topology_specific_info(v, CVP_VOC_RX_TOPOLOGY_CAL); - voice_set_topology_specific_info(v, CVP_VOC_TX_TOPOLOGY_CAL); - - cvp_setdev_cmd.cvp_set_device_v2.tx_port_id = v->dev_tx.port_id; - cvp_setdev_cmd.cvp_set_device_v2.rx_port_id = v->dev_rx.port_id; - - if (common.ec_ref_ext) { - cvp_setdev_cmd.cvp_set_device_v2.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING; - cvp_setdev_cmd.cvp_set_device_v2.ec_ref_port_id = - common.ec_media_fmt_info.port_id; - } else { - cvp_setdev_cmd.cvp_set_device_v2.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING; - cvp_setdev_cmd.cvp_set_device_v2.ec_ref_port_id = - VSS_IVOCPROC_PORT_ID_NONE; - } - pr_debug("topology=%d , tx_port_id=%d, rx_port_id=%d\n", - cvp_setdev_cmd.cvp_set_device_v2.tx_topology_id, - cvp_setdev_cmd.cvp_set_device_v2.tx_port_id, - cvp_setdev_cmd.cvp_set_device_v2.rx_port_id); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_setdev_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IVOCPROC_CMD_SET_DEVICE\n"); - goto fail; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_stop_voice_cmd(struct voice_data *v) -{ - struct apr_hdr mvm_stop_voice_cmd; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_stop_voice_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_stop_voice_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_stop_voice_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_stop_voice_cmd pkt size = %d\n", - mvm_stop_voice_cmd.pkt_size); - mvm_stop_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_stop_voice_cmd.dest_port = mvm_handle; - mvm_stop_voice_cmd.token = 0; - mvm_stop_voice_cmd.opcode = VSS_IMVM_CMD_STOP_VOICE; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_stop_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_STOP_VOICE\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} -static int voice_get_cal(struct cal_block_data **cal_block, - int cal_block_idx, - struct cal_block_data **col_data, - int col_data_idx, int session_id) -{ - int ret = 0; - - *cal_block = cal_utils_get_only_cal_block( - common.cal_data[cal_block_idx]); - if (*cal_block == NULL) { - pr_err("%s: No cal data for cal %d!\n", - __func__, cal_block_idx); - - ret = -ENODEV; - goto done; - } - ret = remap_cal_data(*cal_block, session_id); - if (ret < 0) { - pr_err("%s: Remap_cal_data failed for cal %d!\n", - __func__, cal_block_idx); - - ret = -ENODEV; - goto done; - } - - if (col_data == NULL) - goto done; - - *col_data = cal_utils_get_only_cal_block( - common.cal_data[col_data_idx]); - if (*col_data == NULL) { - pr_err("%s: No cal data for cal %d!\n", - __func__, col_data_idx); - - ret = -ENODEV; - goto done; - } -done: - return ret; -} - -static int voice_send_cvs_register_cal_cmd(struct voice_data *v) -{ - struct cvs_register_cal_data_cmd cvs_reg_cal_cmd; - struct cal_block_data *cal_block = NULL; - struct cal_block_data *col_data = NULL; - int ret = 0; - - memset(&cvs_reg_cal_cmd, 0, sizeof(cvs_reg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[CVS_VOCSTRM_CAL]->lock); - mutex_lock(&common.cal_data[CVS_VOCSTRM_COL_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVS_VOCSTRM_CAL, &col_data, - CVS_VOCSTRM_COL_CAL, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVS_VOCSTRM_CAL); - - goto unlock; - } - - memcpy(&cvs_reg_cal_cmd.cvs_cal_data.column_info[0], - (void *) &((struct audio_cal_info_voc_col *) - col_data->cal_info)->data, - col_data->cal_data.size); - - cvs_reg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_reg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_reg_cal_cmd) - APR_HDR_SIZE); - cvs_reg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_reg_cal_cmd.hdr.dest_port = voice_get_cvs_handle(v); - cvs_reg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvs_reg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_REGISTER_STATIC_CALIBRATION_DATA; - else - cvs_reg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_REGISTER_CALIBRATION_DATA_V2; - - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_handle = - cal_block->map_data.q6map_handle; - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvs_reg_cal_cmd.cvs_cal_data.cal_mem_size = - cal_block->cal_data.size; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_reg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVS cal\n", __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVS_VOCSTRM_COL_CAL]->lock); - mutex_unlock(&common.cal_data[CVS_VOCSTRM_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvs_deregister_cal_cmd(struct voice_data *v) -{ - struct cvs_deregister_cal_data_cmd cvs_dereg_cal_cmd; - int ret = 0; - - memset(&cvs_dereg_cal_cmd, 0, sizeof(cvs_dereg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - cvs_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_dereg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_dereg_cal_cmd) - APR_HDR_SIZE); - cvs_dereg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_dereg_cal_cmd.hdr.dest_port = voice_get_cvs_handle(v); - cvs_dereg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvs_dereg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_DEREGISTER_STATIC_CALIBRATION_DATA; - else - cvs_dereg_cal_cmd.hdr.opcode = - VSS_ISTREAM_CMD_DEREGISTER_CALIBRATION_DATA; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_dereg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVS cal\n", __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; - -} - -static void voice_load_topo_modules(int cal_index) -{ - uint32_t topology_id; - int ret; - - topology_id = voice_get_topology(cal_index); - ret = q6core_load_unload_topo_modules(topology_id, CORE_LOAD_TOPOLOGY); - if (ret < 0) - pr_debug("%s ret:%d load topo modules %d failed\n", - __func__, ret, topology_id); - -} - -static void voice_unload_topo_modules(void) -{ - uint32_t topology_id; - int i, ret; - - for (i = CVP_VOC_RX_TOPOLOGY_CAL; i <= CVP_VOC_TX_TOPOLOGY_CAL; i++) { - topology_id = voice_get_topology(i); - ret = q6core_load_unload_topo_modules(topology_id, - CORE_UNLOAD_TOPOLOGY); - if (ret < 0) { - pr_debug("%s ret:%d unload topo modules %d failed\n", - __func__, ret, topology_id); - } - } -} - -static int voice_send_cvp_create_cmd(struct voice_data *v) -{ - struct cvp_create_full_ctl_session_cmd cvp_session_cmd; - void *apr_cvp; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - /* create cvp session and wait for response */ - cvp_session_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_session_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_session_cmd) - APR_HDR_SIZE); - pr_debug("%s: send create cvp session, pkt size = %d\n", - __func__, cvp_session_cmd.hdr.pkt_size); - cvp_session_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_session_cmd.hdr.dest_port = 0; - cvp_session_cmd.hdr.token = 0; - - if (voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2) - cvp_session_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V3; - else - cvp_session_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2; - - voc_get_tx_rx_topology(v, - &cvp_session_cmd.cvp_session.tx_topology_id, - &cvp_session_cmd.cvp_session.rx_topology_id); - - voice_set_topology_specific_info(v, CVP_VOC_RX_TOPOLOGY_CAL); - voice_set_topology_specific_info(v, CVP_VOC_TX_TOPOLOGY_CAL); - - cvp_session_cmd.cvp_session.direction = 2; /*tx and rx*/ - cvp_session_cmd.cvp_session.tx_port_id = v->dev_tx.port_id; - cvp_session_cmd.cvp_session.rx_port_id = v->dev_rx.port_id; - cvp_session_cmd.cvp_session.profile_id = - VSS_ICOMMON_CAL_NETWORK_ID_NONE; - if (common.ec_ref_ext) { - cvp_session_cmd.cvp_session.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING; - cvp_session_cmd.cvp_session.ec_ref_port_id = - common.ec_media_fmt_info.port_id; - } else { - cvp_session_cmd.cvp_session.vocproc_mode = - VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING; - cvp_session_cmd.cvp_session.ec_ref_port_id = - VSS_IVOCPROC_PORT_ID_NONE; - } - - pr_debug("tx_topology: %d tx_port_id=%d, rx_port_id=%d, mode: 0x%x\n", - cvp_session_cmd.cvp_session.tx_topology_id, - cvp_session_cmd.cvp_session.tx_port_id, - cvp_session_cmd.cvp_session.rx_port_id, - cvp_session_cmd.cvp_session.vocproc_mode); - pr_debug("rx_topology: %d, profile_id: 0x%x, pkt_size: %d\n", - cvp_session_cmd.cvp_session.rx_topology_id, - cvp_session_cmd.cvp_session.profile_id, - cvp_session_cmd.hdr.pkt_size); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_session_cmd); - if (ret < 0) { - pr_err("Fail in sending VOCPROC_FULL_CONTROL_SESSION\n"); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_register_dev_cfg_cmd(struct voice_data *v) -{ - struct cvp_register_dev_cfg_cmd cvp_reg_dev_cfg_cmd; - struct cal_block_data *cal_block = NULL; - int ret = 0; - - memset(&cvp_reg_dev_cfg_cmd, 0, sizeof(cvp_reg_dev_cfg_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - mutex_lock(&common.cal_data[CVP_VOCDEV_CFG_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVP_VOCDEV_CFG_CAL, NULL, - 0, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVP_VOCDEV_CFG_CAL); - - goto unlock; - } - - cvp_reg_dev_cfg_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_reg_dev_cfg_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_reg_dev_cfg_cmd) - APR_HDR_SIZE); - cvp_reg_dev_cfg_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_reg_dev_cfg_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_reg_dev_cfg_cmd.hdr.token = 0; - cvp_reg_dev_cfg_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_DEVICE_CONFIG; - - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_handle = - cal_block->map_data.q6map_handle; - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_size = - cal_block->cal_data.size; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_reg_dev_cfg_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVP dev cfg cal\n", - __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVP_VOCDEV_CFG_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvp_deregister_dev_cfg_cmd(struct voice_data *v) -{ - struct cvp_deregister_dev_cfg_cmd cvp_dereg_dev_cfg_cmd; - int ret = 0; - - memset(&cvp_dereg_dev_cfg_cmd, 0, sizeof(cvp_dereg_dev_cfg_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - cvp_dereg_dev_cfg_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_dereg_dev_cfg_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_dereg_dev_cfg_cmd) - APR_HDR_SIZE); - cvp_dereg_dev_cfg_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_dereg_dev_cfg_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_dereg_dev_cfg_cmd.hdr.token = 0; - cvp_dereg_dev_cfg_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_DEVICE_CONFIG; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_dereg_dev_cfg_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVP dev cfg cal\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_register_cal_cmd(struct voice_data *v) -{ - struct cvp_register_cal_data_cmd cvp_reg_cal_cmd; - struct cal_block_data *cal_block = NULL; - struct cal_block_data *col_data = NULL; - int ret = 0; - - memset(&cvp_reg_cal_cmd, 0, sizeof(cvp_reg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); - mutex_lock(&common.cal_data[CVP_VOCPROC_COL_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVP_VOCPROC_CAL, &col_data, - CVP_VOCPROC_COL_CAL, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVP_VOCPROC_CAL); - - goto unlock; - } - - v->dev_tx.dev_id = ((struct audio_cal_info_vocproc *) - cal_block->cal_info)->tx_acdb_id; - v->dev_rx.dev_id = ((struct audio_cal_info_vocproc *) - cal_block->cal_info)->rx_acdb_id; - pr_debug("%s: %s: Tx acdb id = %d and Rx acdb id = %d", __func__, - voc_get_session_name(v->session_id), v->dev_tx.dev_id, - v->dev_rx.dev_id); - - memcpy(&cvp_reg_cal_cmd.cvp_cal_data.column_info[0], - (void *) &((struct audio_cal_info_voc_col *) - col_data->cal_info)->data, - col_data->cal_data.size); - - cvp_reg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_reg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_reg_cal_cmd) - APR_HDR_SIZE); - cvp_reg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_reg_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_reg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_reg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_STATIC_CALIBRATION_DATA; - else - cvp_reg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_CALIBRATION_DATA_V2; - - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_handle = - cal_block->map_data.q6map_handle; - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvp_reg_cal_cmd.cvp_cal_data.cal_mem_size = - cal_block->cal_data.size; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_reg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVP cal\n", __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVP_VOCPROC_COL_CAL]->lock); - mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v) -{ - struct cvp_deregister_cal_data_cmd cvp_dereg_cal_cmd; - int ret = 0; - - memset(&cvp_dereg_cal_cmd, 0, sizeof(cvp_dereg_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EPERM; - goto done; - } - - cvp_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_dereg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_dereg_cal_cmd) - APR_HDR_SIZE); - cvp_dereg_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_dereg_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_dereg_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_dereg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_STATIC_CALIBRATION_DATA; - else - cvp_dereg_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_CALIBRATION_DATA; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_dereg_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVP cal\n", __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_register_vol_cal_cmd(struct voice_data *v) -{ - struct cvp_register_vol_cal_data_cmd cvp_reg_vol_cal_cmd; - struct cal_block_data *cal_block = NULL; - struct cal_block_data *col_data = NULL; - int ret = 0; - - memset(&cvp_reg_vol_cal_cmd, 0, sizeof(cvp_reg_vol_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[CVP_VOCVOL_CAL]->lock); - mutex_lock(&common.cal_data[CVP_VOCVOL_COL_CAL]->lock); - - ret = voice_get_cal(&cal_block, CVP_VOCVOL_CAL, &col_data, - CVP_VOCVOL_COL_CAL, v->session_id); - if (ret < 0) { - pr_err("%s: Voice_get_cal failed for cal %d!\n", - __func__, CVP_VOCVOL_CAL); - - goto unlock; - } - - memcpy(&cvp_reg_vol_cal_cmd.cvp_vol_cal_data.column_info[0], - (void *) &((struct audio_cal_info_voc_col *) - col_data->cal_info)->data, - col_data->cal_data.size); - - cvp_reg_vol_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_reg_vol_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_reg_vol_cal_cmd) - APR_HDR_SIZE); - cvp_reg_vol_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_reg_vol_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_reg_vol_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_reg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_DYNAMIC_CALIBRATION_DATA; - else - cvp_reg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_REGISTER_VOL_CALIBRATION_DATA; - - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_handle = - cal_block->map_data.q6map_handle; - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_address_lsw = - lower_32_bits(cal_block->cal_data.paddr); - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_address_msw = - msm_audio_populate_upper_32_bits(cal_block->cal_data.paddr); - cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_size = - cal_block->cal_data.size; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_reg_vol_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d registering CVP vol cal\n", __func__, ret); - - ret = -EINVAL; - goto unlock; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto unlock; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto unlock; - } -unlock: - mutex_unlock(&common.cal_data[CVP_VOCVOL_COL_CAL]->lock); - mutex_unlock(&common.cal_data[CVP_VOCVOL_CAL]->lock); -done: - return ret; -} - -static int voice_send_cvp_deregister_vol_cal_cmd(struct voice_data *v) -{ - struct cvp_deregister_vol_cal_data_cmd cvp_dereg_vol_cal_cmd; - int ret = 0; - - memset(&cvp_dereg_vol_cal_cmd, 0, sizeof(cvp_dereg_vol_cal_cmd)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EPERM; - goto done; - } - - cvp_dereg_vol_cal_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_dereg_vol_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_dereg_vol_cal_cmd) - APR_HDR_SIZE); - cvp_dereg_vol_cal_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_dereg_vol_cal_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_dereg_vol_cal_cmd.hdr.token = 0; - if (common.is_per_vocoder_cal_enabled) - cvp_dereg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_DYNAMIC_CALIBRATION_DATA; - else - cvp_dereg_vol_cal_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_DEREGISTER_VOL_CALIBRATION_DATA; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, - (uint32_t *) &cvp_dereg_vol_cal_cmd); - if (ret < 0) { - pr_err("%s: Error %d de-registering CVP vol cal\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_map_memory_physical_cmd(struct voice_data *v, - struct mem_map_table *table_info, - dma_addr_t phys, - uint32_t size, - uint32_t token) -{ - struct vss_imemory_cmd_map_physical_t mvm_map_phys_cmd; - uint32_t *memtable; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!common.apr_q6_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!table_info->data) { - pr_err("%s: memory table is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - memtable = (uint32_t *) table_info->data; - - /* - * Store next table descriptor's address(64 bit) as NULL as there - * is only one memory block - */ - memtable[0] = 0; - memtable[1] = 0; - - /* Store next table descriptor's size */ - memtable[2] = 0; - - /* Store shared mem adddress (64 bit) */ - memtable[3] = lower_32_bits(phys); - memtable[4] = msm_audio_populate_upper_32_bits(phys); - - /* Store shared memory size */ - memtable[5] = size; - - mvm_map_phys_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_map_phys_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_map_phys_cmd) - APR_HDR_SIZE); - mvm_map_phys_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_map_phys_cmd.hdr.dest_port = voice_get_mvm_handle(v); - mvm_map_phys_cmd.hdr.token = token; - mvm_map_phys_cmd.hdr.opcode = VSS_IMEMORY_CMD_MAP_PHYSICAL; - - mvm_map_phys_cmd.table_descriptor.mem_address_lsw = - lower_32_bits(table_info->phys); - mvm_map_phys_cmd.table_descriptor.mem_address_msw = - msm_audio_populate_upper_32_bits(table_info->phys); - mvm_map_phys_cmd.table_descriptor.mem_size = - sizeof(struct vss_imemory_block_t) + - sizeof(struct vss_imemory_table_descriptor_t); - mvm_map_phys_cmd.is_cached = true; - mvm_map_phys_cmd.cache_line_size = 128; - mvm_map_phys_cmd.access_mask = 3; - mvm_map_phys_cmd.page_align = 4096; - mvm_map_phys_cmd.min_data_width = 8; - mvm_map_phys_cmd.max_data_width = 64; - - pr_debug("%s: next table desc: add: %lld, size: %d\n", - __func__, *((uint64_t *) memtable), - *(((uint32_t *) memtable) + 2)); - pr_debug("%s: phy add of of mem being mapped LSW:0x%x, MSW:0x%x size: %d\n", - __func__, *(((uint32_t *) memtable) + 3), - *(((uint32_t *) memtable) + 4), *(((uint32_t *) memtable) + 5)); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_mvm, (uint32_t *) &mvm_map_phys_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending mvm map phy cmd\n", __func__, ret); - - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; - -fail: - return ret; -} - -static int voice_pause_voice_call(struct voice_data *v) -{ - struct apr_hdr mvm_pause_voice_cmd; - void *apr_mvm; - int ret = 0; - - pr_debug("%s\n", __func__); - - if (v == NULL) { - pr_err("%s: Voice data is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - mvm_pause_voice_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_pause_voice_cmd.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_pause_voice_cmd) - APR_HDR_SIZE); - mvm_pause_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_pause_voice_cmd.dest_port = voice_get_mvm_handle(v); - mvm_pause_voice_cmd.token = 0; - mvm_pause_voice_cmd.opcode = VSS_IMVM_CMD_PAUSE_VOICE; - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - pr_debug("%s: send mvm_pause_voice_cmd pkt size = %d\n", - __func__, mvm_pause_voice_cmd.pkt_size); - - ret = apr_send_pkt(apr_mvm, - (uint32_t *)&mvm_pause_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_PAUSE_VOICE\n"); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_map_cal_memory(struct cal_block_data *cal_block, - uint32_t session_id) -{ - int result = 0; - int voc_index; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: Map size is 0!\n", __func__); - - result = -EINVAL; - goto done; - } - - voc_index = voice_get_idx_for_session(session_id); - if (voc_index < 0) { - pr_err("%s: Invalid session ID %d\n", __func__, session_id); - - goto done; - } - - mutex_lock(&common.common_lock); - v = &common.voice[voc_index]; - - result = voice_map_memory_physical_cmd(v, - &common.cal_mem_map_table, - (dma_addr_t)cal_block->cal_data.paddr, - cal_block->map_data.map_size, - VOC_CAL_MEM_MAP_TOKEN); - if (result < 0) { - pr_err("%s: Mmap did not work! addr = 0x%pK, size = %zd\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - - goto done_unlock; - } - - cal_block->map_data.q6map_handle = common.cal_mem_handle; -done_unlock: - mutex_unlock(&common.common_lock); -done: - return result; -} - -static int remap_cal_data(struct cal_block_data *cal_block, - uint32_t session_id) -{ - int ret = 0; - - pr_debug("%s\n", __func__); - - if (cal_block->map_data.dma_buf == NULL) { - pr_err("%s: No ION allocation for session_id %d!\n", - __func__, session_id); - ret = -EINVAL; - goto done; - } - - if ((cal_block->map_data.map_size > 0) && - (cal_block->map_data.q6map_handle == 0)) { - - /* cal type not used */ - ret = voice_map_cal_memory(cal_block, session_id); - if (ret < 0) { - pr_err("%s: Mmap did not work! size = %zd\n", - __func__, cal_block->map_data.map_size); - - goto done; - } - } else { - pr_debug("%s: Cal block 0x%pK, size %zd already mapped. Q6 map handle = %d\n", - __func__, &cal_block->cal_data.paddr, - cal_block->map_data.map_size, - cal_block->map_data.q6map_handle); - } -done: - return ret; -} - -static int voice_unmap_cal_memory(int32_t cal_type, - struct cal_block_data *cal_block) -{ - int result = 0; - int result2 = 0; - int i; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: Cal block is NULL!\n", __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.q6map_handle == 0) { - pr_debug("%s: Q6 handle is not set!\n", __func__); - - result = -EINVAL; - goto done; - } - - mutex_lock(&common.common_lock); - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - result2 = voice_pause_voice_call(v); - if (result2 < 0) { - pr_err("%s: Voice_pause_voice_call failed for session 0x%x, err %d!\n", - __func__, v->session_id, result2); - - result = result2; - } - - if (cal_type == CVP_VOCPROC_DYNAMIC_CAL_TYPE) - voice_send_cvp_deregister_vol_cal_cmd(v); - else if (cal_type == CVP_VOCPROC_STATIC_CAL_TYPE) - voice_send_cvp_deregister_cal_cmd(v); - else if (cal_type == CVP_VOCDEV_CFG_CAL_TYPE) - voice_send_cvp_deregister_dev_cfg_cmd(v); - else if (cal_type == CVS_VOCSTRM_STATIC_CAL_TYPE) - voice_send_cvs_deregister_cal_cmd(v); - else - pr_err("%s: Invalid cal type %d!\n", - __func__, cal_type); - - result2 = voice_send_start_voice_cmd(v); - if (result2) { - pr_err("%s: Voice_send_start_voice_cmd failed for session 0x%x, err %d!\n", - __func__, v->session_id, result2); - - result = result2; - } - } - - if ((cal_block->map_data.q6map_handle != 0) && - (!is_other_session_active(v->session_id))) { - - result2 = voice_send_mvm_unmap_memory_physical_cmd( - v, cal_block->map_data.q6map_handle); - if (result2) { - pr_err("%s: Voice_send_mvm_unmap_memory_physical_cmd failed for session 0x%x, err %d!\n", - __func__, v->session_id, result2); - - result = result2; - } - cal_block->map_data.q6map_handle = 0; - } - mutex_unlock(&v->lock); - } - mutex_unlock(&common.common_lock); -done: - return result; -} - -int voc_register_vocproc_vol_table(void) -{ - int result = 0; - int result2 = 0; - int i; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - mutex_lock(&common.common_lock); - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - result2 = voice_send_cvp_register_vol_cal_cmd(v); - if (result2 < 0) { - pr_err("%s: Failed to register vocvol table for session 0x%x!\n", - __func__, v->session_id); - - result = result2; - /* Still try to register other sessions */ - } - } - mutex_unlock(&v->lock); - } - - mutex_unlock(&common.common_lock); - return result; -} - -int voc_deregister_vocproc_vol_table(void) -{ - int result = 0; - int success = 0; - int i; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - mutex_lock(&common.common_lock); - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - v = &common.voice[i]; - - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - result = voice_send_cvp_deregister_vol_cal_cmd(v); - if (result < 0) { - pr_err("%s: Failed to deregister vocvol table for session 0x%x!\n", - __func__, v->session_id); - - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); - if (success) { - pr_err("%s: Try to re-register all deregistered sessions!\n", - __func__); - - voc_register_vocproc_vol_table(); - } - goto done; - } else { - success = 1; - } - } - mutex_unlock(&v->lock); - } - mutex_unlock(&common.common_lock); -done: - return result; -} - -int voc_map_rtac_block(struct rtac_cal_block_data *cal_block) -{ - int result = 0; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (cal_block == NULL) { - pr_err("%s: cal_block is NULL!\n", - __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->cal_data.paddr == 0) { - pr_debug("%s: No address to map!\n", - __func__); - - result = -EINVAL; - goto done; - } - - if (cal_block->map_data.map_size == 0) { - pr_debug("%s: map size is 0!\n", - __func__); - - result = -EINVAL; - goto done; - } - - mutex_lock(&common.common_lock); - /* use first session */ - v = &common.voice[0]; - mutex_lock(&v->lock); - - if (!is_rtac_memory_allocated()) { - result = voice_alloc_rtac_mem_map_table(); - if (result < 0) { - pr_err("%s: RTAC alloc mem map table did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - - common.rtac_mem_map_table.dma_buf = NULL; - goto done_unlock; - } - } - - result = voice_map_memory_physical_cmd(v, - &common.rtac_mem_map_table, - (dma_addr_t)cal_block->cal_data.paddr, - cal_block->map_data.map_size, - VOC_RTAC_MEM_MAP_TOKEN); - if (result < 0) { - pr_err("%s: RTAC mmap did not work! addr = 0x%pK, size = %d\n", - __func__, - &cal_block->cal_data.paddr, - cal_block->map_data.map_size); - - free_rtac_map_table(); - goto done_unlock; - } - - cal_block->map_data.map_handle = common.rtac_mem_handle; -done_unlock: - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); -done: - return result; -} - -int voc_unmap_rtac_block(uint32_t *mem_map_handle) -{ - int result = 0; - struct voice_data *v = NULL; - - pr_debug("%s\n", __func__); - - if (mem_map_handle == NULL) { - pr_debug("%s: Map handle is NULL, nothing to unmap\n", - __func__); - - goto done; - } - - if (*mem_map_handle == 0) { - pr_debug("%s: Map handle is 0, nothing to unmap\n", - __func__); - - goto done; - } - - mutex_lock(&common.common_lock); - /* Use first session */ - /* Only used for apr wait lock */ - v = &common.voice[0]; - mutex_lock(&v->lock); - - result = voice_send_mvm_unmap_memory_physical_cmd( - v, *mem_map_handle); - if (result) { - pr_err("%s: voice_send_mvm_unmap_memory_physical_cmd Failed for session 0x%x!\n", - __func__, v->session_id); - } else { - *mem_map_handle = 0; - common.rtac_mem_handle = 0; - free_rtac_map_table(); - } - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); -done: - return result; -} - -static int voice_send_cvp_channel_info_v2(struct voice_data *v, - uint32_t param_type) -{ - int ret; - struct cvp_set_channel_info_cmd_v2 cvp_set_channel_info_cmd; - void *apr_cvp; - u16 cvp_handle; - struct vss_icommon_param_data_channel_info_v2_t - *channel_info_param_data = - &cvp_set_channel_info_cmd. - cvp_set_ch_info_param_v2.param_data; - struct vss_param_vocproc_dev_channel_info_t *channel_info = - &channel_info_param_data->channel_info; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - memset(&cvp_set_channel_info_cmd, 0, sizeof(cvp_set_channel_info_cmd)); - - cvp_set_channel_info_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_channel_info_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_channel_info_cmd) - APR_HDR_SIZE); - cvp_set_channel_info_cmd.hdr.src_svc = 0; - cvp_set_channel_info_cmd.hdr.src_domain = APR_DOMAIN_APPS; - cvp_set_channel_info_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_channel_info_cmd.hdr.dest_svc = 0; - cvp_set_channel_info_cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cvp_set_channel_info_cmd.hdr.dest_port = cvp_handle; - cvp_set_channel_info_cmd.hdr.token = 0; - cvp_set_channel_info_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2; - - cvp_set_channel_info_cmd.cvp_set_ch_info_param_v2.mem_size = - sizeof(struct vss_icommon_param_data_channel_info_v2_t); - - channel_info_param_data->module_id = VSS_MODULE_CVD_GENERIC; - channel_info_param_data->param_size = - sizeof(struct vss_param_vocproc_dev_channel_info_t); - - /* Device specific data */ - switch (param_type) { - case RX_PATH: - channel_info_param_data->param_id = - VSS_PARAM_VOCPROC_RX_CHANNEL_INFO; - channel_info->num_channels = v->dev_rx.no_of_channels; - channel_info->bits_per_sample = v->dev_rx.bits_per_sample; - memcpy(&channel_info->channel_mapping, - v->dev_rx.channel_mapping, - VSS_NUM_CHANNELS_MAX * sizeof(uint8_t)); - break; - - case TX_PATH: - channel_info_param_data->param_id = - VSS_PARAM_VOCPROC_TX_CHANNEL_INFO; - channel_info->num_channels = v->dev_tx.no_of_channels; - channel_info->bits_per_sample = v->dev_tx.bits_per_sample; - memcpy(&channel_info->channel_mapping, - v->dev_tx.channel_mapping, - VSS_NUM_CHANNELS_MAX * sizeof(uint8_t)); - break; - - case EC_REF_PATH: - channel_info_param_data->param_id = - VSS_PARAM_VOCPROC_EC_REF_CHANNEL_INFO; - channel_info->num_channels = v->dev_rx.no_of_channels; - channel_info->bits_per_sample = v->dev_rx.bits_per_sample; - memcpy(&channel_info->channel_mapping, - v->dev_rx.channel_mapping, - VSS_NUM_CHANNELS_MAX * sizeof(uint8_t)); - break; - default: - pr_err("%s: Invalid param type\n", - __func__); - ret = -EINVAL; - goto done; - } - - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_set_channel_info_cmd); - if (ret < 0) { - pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2\n", - __func__); - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s] handle = %d\n", __func__, - adsp_err_get_err_str(v->async_err), cvp_handle); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - return ret; -} - -static int voice_send_cvp_channel_info_cmd(struct voice_data *v) -{ - int ret = 0; - - ret = voice_send_cvp_channel_info_v2(v, RX_PATH); - if (ret < 0) { - pr_err("%s: Error in sending cvp_channel_info RX: %d\n", - __func__, ret); - goto done; - } - - ret = voice_send_cvp_channel_info_v2(v, TX_PATH); - if (ret < 0) { - pr_err("%s: Error in sending cvp_channel_info TX: %d\n", - __func__, ret); - goto done; - } - - ret = voice_send_cvp_channel_info_v2(v, EC_REF_PATH); - if (ret < 0) { - pr_err("%s: Error in sending cvp_channel_info EC Ref: %d\n", - __func__, ret); - goto done; - } -done: - return ret; -} - -static int voice_send_cvp_ch_mixer_info_v2(struct voice_data *v) -{ - int ret; - struct cvp_set_channel_mixer_info_cmd_v2 cvp_set_ch_mixer_info_cmd; - void *apr_cvp; - u16 cvp_handle; - struct vss_icommon_param_data_ch_mixer_v2_t *cvp_config_param_data = - &cvp_set_ch_mixer_info_cmd. - cvp_set_ch_mixer_param_v2.param_data; - struct vss_param_channel_mixer_info_t *ch_mixer_info = - &cvp_config_param_data->ch_mixer_info; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - memset(&cvp_set_ch_mixer_info_cmd, 0, - sizeof(cvp_set_ch_mixer_info_cmd)); - - cvp_set_ch_mixer_info_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_ch_mixer_info_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_ch_mixer_info_cmd) - APR_HDR_SIZE); - cvp_set_ch_mixer_info_cmd.hdr.src_svc = 0; - cvp_set_ch_mixer_info_cmd.hdr.src_domain = APR_DOMAIN_APPS; - cvp_set_ch_mixer_info_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_ch_mixer_info_cmd.hdr.dest_svc = 0; - cvp_set_ch_mixer_info_cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cvp_set_ch_mixer_info_cmd.hdr.dest_port = cvp_handle; - cvp_set_ch_mixer_info_cmd.hdr.token = VOC_GENERIC_SET_PARAM_TOKEN; - cvp_set_ch_mixer_info_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2; - cvp_set_ch_mixer_info_cmd.cvp_set_ch_mixer_param_v2.mem_size = - sizeof(struct vss_icommon_param_data_ch_mixer_v2_t); - - cvp_config_param_data->module_id = AUDPROC_MODULE_ID_MFC; - cvp_config_param_data->param_id = - AUDPROC_CHMIXER_PARAM_ID_COEFF; - cvp_config_param_data->param_size = - sizeof(struct vss_param_channel_mixer_info_t); - - ch_mixer_info->index = 0; - ch_mixer_info->num_output_channels = v->dev_rx.no_of_channels; - /* - * Configure Rx input to be mono for channel mixer as the DSP - * configures vocproc input as mono. - */ - ch_mixer_info->num_input_channels = NUM_CHANNELS_MONO; - ch_mixer_info->out_channel_map[0] = PCM_CHANNEL_L; - ch_mixer_info->out_channel_map[1] = PCM_CHANNEL_R; - ch_mixer_info->in_channel_map[0] = PCM_CHANNEL_L; - ch_mixer_info->channel_weight_coeff[0][0] = GAIN_Q14_FORMAT(1); - ch_mixer_info->channel_weight_coeff[1][0] = GAIN_Q14_FORMAT(1); - ch_mixer_info->reserved = 0; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_ch_mixer_info_cmd); - if (ret < 0) { - pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2 %d\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s] handle = %d\n", __func__, - adsp_err_get_err_str(v->async_err), cvp_handle); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - return ret; -} - -static int voice_send_cvp_mfc_config_v2(struct voice_data *v) -{ - int ret; - struct cvp_set_mfc_config_cmd_v2 cvp_set_mfc_config_cmd; - void *apr_cvp; - u16 cvp_handle; - uint8_t ch_idx; - struct vss_icommon_param_data_mfc_config_v2_t *cvp_config_param_data = - &cvp_set_mfc_config_cmd.cvp_set_mfc_param_v2.param_data; - struct vss_param_mfc_config_info_t *mfc_config_info = - &cvp_config_param_data->mfc_config_info; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - memset(&cvp_set_mfc_config_cmd, 0, sizeof(cvp_set_mfc_config_cmd)); - - cvp_set_mfc_config_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_mfc_config_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_mfc_config_cmd) - APR_HDR_SIZE); - cvp_set_mfc_config_cmd.hdr.src_svc = 0; - cvp_set_mfc_config_cmd.hdr.src_domain = APR_DOMAIN_APPS; - cvp_set_mfc_config_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_mfc_config_cmd.hdr.dest_svc = 0; - cvp_set_mfc_config_cmd.hdr.dest_domain = APR_DOMAIN_ADSP; - cvp_set_mfc_config_cmd.hdr.dest_port = cvp_handle; - cvp_set_mfc_config_cmd.hdr.token = 0; - cvp_set_mfc_config_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_PARAM_V2; - cvp_set_mfc_config_cmd.cvp_set_mfc_param_v2.mem_size = - sizeof(struct vss_icommon_param_data_mfc_config_v2_t); - - cvp_config_param_data->module_id = AUDPROC_MODULE_ID_MFC; - cvp_config_param_data->param_id = - AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT; - cvp_config_param_data->param_size = - sizeof(struct vss_param_mfc_config_info_t); - - mfc_config_info->num_channels = v->dev_rx.no_of_channels; - mfc_config_info->bits_per_sample = 16; - mfc_config_info->sample_rate = v->dev_rx.sample_rate; - - /* - * Do not use memcpy here as channel_type in mfc_config structure is a - * uint16_t array while channel_mapping array of device is of uint8_t - */ - for (ch_idx = 0; ch_idx < VSS_NUM_CHANNELS_MAX; ch_idx++) { - mfc_config_info->channel_type[ch_idx] = - v->dev_rx.channel_mapping[ch_idx]; - } - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_mfc_config_cmd); - if (ret < 0) { - pr_err("%s: Failed to send VSS_ICOMMON_CMD_SET_PARAM_V2 %d\n", - __func__, ret); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s] handle = %d\n", __func__, - adsp_err_get_err_str(v->async_err), cvp_handle); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - return ret; -} - -static int voice_send_cvp_mfc_config_cmd(struct voice_data *v) -{ - int ret = 0; - - if (common.cvp_version >= CVP_VERSION_2) { - ret = voice_send_cvp_ch_mixer_info_v2(v); - if (ret < 0) - pr_warn("%s: Set channel mixer config failed err:%d", - __func__, ret); - - ret = voice_send_cvp_mfc_config_v2(v); - if (ret < 0) - pr_warn("%s: Set MFC config failed err:%d", - __func__, ret); - } else { - pr_warn("%s: CVP Version not supported\n", __func__); - ret = -EINVAL; - } - - return ret; -} - -static int voice_get_avcs_version_per_service(uint32_t service_id) -{ - int ret = 0; - size_t ver_size; - struct avcs_fwk_ver_info *ver_info = NULL; - - if (service_id == AVCS_SERVICE_ID_ALL) { - pr_err("%s: Invalid service id: %d", __func__, - AVCS_SERVICE_ID_ALL); - return -EINVAL; - } - - ver_size = sizeof(struct avcs_get_fwk_version) + - sizeof(struct avs_svc_api_info); - ver_info = kzalloc(ver_size, GFP_KERNEL); - if (ver_info == NULL) - return -ENOMEM; - - ret = q6core_get_service_version(service_id, ver_info, ver_size); - if (ret < 0) - goto done; - - ret = ver_info->services[0].api_version; - common.is_avcs_version_queried = true; -done: - kfree(ver_info); - return ret; -} - -static void voice_send_uevent(char *uevent) -{ - int ret = 0; - - if (uevent == NULL) - return; - - pr_info("uevent = %s\n", uevent); - mutex_lock(&common.common_lock); - ret = q6core_send_uevent(common.uevent_data, uevent); - if (ret) - pr_err("%s: Send UEvent %s failed :%d\n", __func__, - uevent, ret); - mutex_unlock(&common.common_lock); -} - -static void voice_mic_break_work_fn(struct work_struct *work) -{ - char event[25] = ""; - struct voice_data *v = container_of(work, struct voice_data, - voice_mic_break_work); - uint8_t mic_break_stat = - v->mic_break_status & MIC_BREAK_STAT_MIC_BREAK_MASK; - uint8_t mic_degrade_stat = - (v->mic_break_status & MIC_BREAK_STAT_MIC_DEGRADE_MASK) - >> MIC_DEGRADE_SHIFT_BITS; - - if (mic_break_stat) { - snprintf(event, sizeof(event), "MIC_BREAK_STATUS=%d", - mic_break_stat); - voice_send_uevent(event); - } - - if (mic_degrade_stat) { - snprintf(event, sizeof(event), "MIC_DEGRADE_STATUS=%d", - mic_degrade_stat); - voice_send_uevent(event); - } -} - -static int voice_setup_vocproc(struct voice_data *v) -{ - struct module_instance_info mod_inst_info; - int ret = 0; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - ret = voice_send_cvp_create_cmd(v); - if (ret < 0) { - pr_err("%s: CVP create failed err:%d\n", __func__, ret); - goto fail; - } -#if 0 - if (common.is_avcs_version_queried == false) - common.cvp_version = voice_get_avcs_version_per_service( - APRV2_IDS_SERVICE_ID_ADSP_CVP_V); - - if (common.cvp_version < 0) { - pr_err("%s: Invalid CVP version %d\n", - __func__, common.cvp_version); - ret = -EINVAL; - goto fail; - } -#endif - pr_debug("%s: CVP Version %d\n", __func__, common.cvp_version); - - ret = voice_send_cvp_media_fmt_info_cmd(v); - if (ret < 0) { - pr_err("%s: Set media format info failed err:%d\n", __func__, - ret); - goto fail; - } - - ret = voice_send_cvp_topology_commit_cmd(v); - if (ret < 0) { - pr_err("%s: Set topology commit failed err:%d\n", - __func__, ret); - goto fail; - } - - /* Send MFC config only when the no of channels are more than 1 */ - if (v->dev_rx.no_of_channels > NUM_CHANNELS_MONO) { - ret = voice_send_cvp_mfc_config_cmd(v); - if (ret < 0) { - pr_warn("%s: Set mfc config failed err:%d\n", - __func__, ret); - } - } - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - - voice_send_cvs_register_cal_cmd(v); - voice_send_cvp_register_dev_cfg_cmd(v); - voice_send_cvp_register_cal_cmd(v); - voice_send_cvp_register_vol_cal_cmd(v); - - /* enable vocproc */ - ret = voice_send_enable_vocproc_cmd(v); - if (ret < 0) - goto fail; - - /* attach vocproc */ - ret = voice_send_attach_vocproc_cmd(v); - if (ret < 0) - goto fail; - - /* send tty mode if tty device is used */ - voice_send_tty_mode_cmd(v); - - if (is_voip_session(v->session_id)) { - ret = voice_send_mvm_cal_network_cmd(v); - if (ret < 0) - pr_err("%s: voice_send_mvm_cal_network_cmd: %d\n", - __func__, ret); - - ret = voice_send_mvm_media_type_cmd(v); - if (ret < 0) - pr_err("%s: voice_send_mvm_media_type_cmd: %d\n", - __func__, ret); - - voice_send_netid_timing_cmd(v); - } - - if (v->st_enable && !v->tty_mode) - voice_send_set_pp_enable_cmd(v, mod_inst_info, v->st_enable); - /* Start in-call music delivery if this feature is enabled */ - if (v->music_info.play_enable) - voice_cvs_start_playback(v); - - /* Start in-call recording if this feature is enabled */ - if (v->rec_info.rec_enable) - voice_cvs_start_record(v, v->rec_info.rec_mode, - v->rec_info.port_id); - - if (v->dtmf_rx_detect_en) - voice_send_dtmf_rx_detection_cmd(v, v->dtmf_rx_detect_en); - - if (v->hd_enable) - voice_send_hd_cmd(v, v->hd_enable); - - if (common.mic_break_enable) - voice_send_mvm_event_class_cmd(v, - VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS, - VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE); - - rtac_add_voice(voice_get_cvs_handle(v), - voice_get_cvp_handle(v), - v->dev_rx.port_id, v->dev_tx.port_id, - v->dev_rx.dev_id, v->dev_tx.dev_id, - v->session_id); - - return 0; - -fail: - return ret; -} - -static int voice_send_cvp_device_channels_cmd(struct voice_data *v) -{ - int ret = 0; - struct cvp_set_dev_channels_cmd cvp_set_dev_channels_cmd; - void *apr_cvp; - u16 cvp_handle; - - if (!(voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2)) { - pr_debug("%s CVD ver %s doesn't support send_device_channels cmd\n", - __func__, common.cvd_version); - - goto done; - } - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - cvp_set_dev_channels_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_dev_channels_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_dev_channels_cmd) - APR_HDR_SIZE); - cvp_set_dev_channels_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_dev_channels_cmd.hdr.dest_port = cvp_handle; - cvp_set_dev_channels_cmd.hdr.token = 0; - cvp_set_dev_channels_cmd.hdr.opcode = - VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS; - cvp_set_dev_channels_cmd.cvp_set_channels.rx_num_channels = - VSS_NUM_DEV_CHANNELS_1; - cvp_set_dev_channels_cmd.cvp_set_channels.tx_num_channels = - v->dev_tx.no_of_channels; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_set_dev_channels_cmd); - if (ret < 0) { - pr_err("%s: Fail in sending VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS\n", - __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_cvp_media_fmt_info_cmd(struct voice_data *v) -{ - int ret = 0; - - if (common.cvp_version < CVP_VERSION_2) - ret = voice_send_cvp_device_channels_cmd(v); - else - ret = voice_send_cvp_channel_info_cmd(v); - - if (ret < 0) { - pr_err("%s: Set channel info failed err: %d\n", __func__, - ret); - goto done; - } - - if (voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_3) { - ret = voice_send_cvp_media_format_cmd(v, RX_PATH); - if (ret < 0) - goto done; - - ret = voice_send_cvp_media_format_cmd(v, TX_PATH); - if (ret < 0) - goto done; - - if (common.ec_ref_ext) - ret = voice_send_cvp_media_format_cmd(v, EC_REF_PATH); - } - -done: - return ret; -} - -static int voice_send_cvp_media_format_cmd(struct voice_data *v, - uint32_t param_type) -{ - struct vss_param_endpoint_media_format_info media_fmt_info; - struct param_hdr_v3 param_hdr; - int ret = 0; - - memset(&media_fmt_info, 0, sizeof(media_fmt_info)); - memset(¶m_hdr, 0, sizeof(param_hdr)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - - param_hdr.module_id = VSS_MODULE_CVD_GENERIC; - param_hdr.instance_id = INSTANCE_ID_0; - param_hdr.param_size = sizeof(media_fmt_info); - - switch (param_type) { - case RX_PATH: - param_hdr.param_id = VSS_PARAM_RX_PORT_ENDPOINT_MEDIA_INFO; - media_fmt_info.port_id = v->dev_rx.port_id; - media_fmt_info.num_channels = v->dev_rx.no_of_channels; - media_fmt_info.bits_per_sample = v->dev_rx.bits_per_sample; - media_fmt_info.sample_rate = v->dev_rx.sample_rate; - memcpy(&media_fmt_info.channel_mapping, - &v->dev_rx.channel_mapping, VSS_CHANNEL_MAPPING_SIZE); - break; - - case TX_PATH: - param_hdr.param_id = VSS_PARAM_TX_PORT_ENDPOINT_MEDIA_INFO; - media_fmt_info.port_id = v->dev_tx.port_id; - media_fmt_info.num_channels = v->dev_tx.no_of_channels; - media_fmt_info.bits_per_sample = v->dev_tx.bits_per_sample; - media_fmt_info.sample_rate = v->dev_tx.sample_rate; - memcpy(&media_fmt_info.channel_mapping, - &v->dev_tx.channel_mapping, VSS_CHANNEL_MAPPING_SIZE); - break; - - case EC_REF_PATH: - param_hdr.param_id = VSS_PARAM_EC_REF_PORT_ENDPOINT_MEDIA_INFO; - media_fmt_info.port_id = common.ec_media_fmt_info.port_id; - media_fmt_info.num_channels = - common.ec_media_fmt_info.num_channels; - media_fmt_info.bits_per_sample = - common.ec_media_fmt_info.bits_per_sample; - media_fmt_info.sample_rate = - common.ec_media_fmt_info.sample_rate; - memcpy(&media_fmt_info.channel_mapping, - &common.ec_media_fmt_info.channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - break; - - default: - pr_err("%s: Invalid param type %d\n", __func__, param_type); - ret = -EINVAL; - goto done; - } - - ret = voice_pack_and_set_cvp_param(v, param_hdr, - (u8 *) &media_fmt_info); - if (ret) - pr_err("%s: Failed to set media format params on CVP, err %d\n", - __func__, ret); - -done: - return ret; -} - -static int voice_send_cvp_topology_commit_cmd(struct voice_data *v) -{ - int ret = 0; - struct apr_hdr cvp_topology_commit_cmd; - void *apr_cvp; - u16 cvp_handle; - - if (!(voice_get_cvd_int_version(common.cvd_version) >= - CVD_INT_VERSION_2_2)) { - pr_debug("%s CVD version string %s doesn't support this command\n", - __func__, common.cvd_version); - - goto done; - } - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - cvp_topology_commit_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_topology_commit_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_topology_commit_cmd) - APR_HDR_SIZE); - cvp_topology_commit_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_topology_commit_cmd.dest_port = cvp_handle; - cvp_topology_commit_cmd.token = 0; - cvp_topology_commit_cmd.opcode = VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_topology_commit_cmd); - if (ret < 0) { - pr_err("%s: Fail in sending VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT\n", - __func__); - - ret = -EINVAL; - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -EINVAL; - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} - -static int voice_send_enable_vocproc_cmd(struct voice_data *v) -{ - int ret = 0; - struct apr_hdr cvp_enable_cmd; - void *apr_cvp; - u16 cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - cvp_handle = voice_get_cvp_handle(v); - - /* enable vocproc and wait for respose */ - cvp_enable_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_enable_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_enable_cmd) - APR_HDR_SIZE); - pr_debug("cvp_enable_cmd pkt size = %d, cvp_handle=%d\n", - cvp_enable_cmd.pkt_size, cvp_handle); - cvp_enable_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_enable_cmd.dest_port = cvp_handle; - cvp_enable_cmd.token = 0; - cvp_enable_cmd.opcode = VSS_IVOCPROC_CMD_ENABLE; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_enable_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IVOCPROC_CMD_ENABLE\n"); - goto fail; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_mvm_cal_network_cmd(struct voice_data *v) -{ - struct vss_imvm_cmd_set_cal_network_t mvm_set_cal_network; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mvm_set_cal_network.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_cal_network.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_cal_network) - APR_HDR_SIZE); - mvm_set_cal_network.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_cal_network.hdr.dest_port = mvm_handle; - mvm_set_cal_network.hdr.token = 0; - mvm_set_cal_network.hdr.opcode = VSS_IMVM_CMD_SET_CAL_NETWORK; - mvm_set_cal_network.network_id = VSS_ICOMMON_CAL_NETWORK_ID_NONE; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_cal_network); - if (ret < 0) { - pr_err("%s: Error %d sending SET_NETWORK\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_netid_timing_cmd(struct voice_data *v) -{ - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - struct mvm_set_network_cmd mvm_set_network; - struct mvm_set_voice_timing_cmd mvm_set_voice_timing; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - ret = voice_config_cvs_vocoder(v); - if (ret < 0) { - pr_err("%s: Error %d configuring CVS voc", - __func__, ret); - goto fail; - } - /* Set network ID. */ - pr_debug("Setting network ID %x\n", common.mvs_info.network_type); - - mvm_set_network.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_network.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_network) - APR_HDR_SIZE); - mvm_set_network.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_network.hdr.dest_port = mvm_handle; - mvm_set_network.hdr.token = 0; - mvm_set_network.hdr.opcode = VSS_IMVM_CMD_SET_CAL_NETWORK; - mvm_set_network.network.network_id = common.mvs_info.network_type; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_network); - if (ret < 0) { - pr_err("%s: Error %d sending SET_NETWORK\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - /* Set voice timing. */ - pr_debug("Setting voice timing\n"); - - mvm_set_voice_timing.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_set_voice_timing.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_set_voice_timing) - - APR_HDR_SIZE); - mvm_set_voice_timing.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_set_voice_timing.hdr.dest_port = mvm_handle; - mvm_set_voice_timing.hdr.token = 0; - mvm_set_voice_timing.hdr.opcode = VSS_ICOMMON_CMD_SET_VOICE_TIMING; - mvm_set_voice_timing.timing.mode = 0; - mvm_set_voice_timing.timing.enc_offset = 8000; - mvm_set_voice_timing.timing.dec_req_offset = 3300; - mvm_set_voice_timing.timing.dec_offset = 8300; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_voice_timing); - if (ret < 0) { - pr_err("%s: Error %d sending SET_TIMING\n", __func__, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_attach_vocproc_cmd(struct voice_data *v) -{ - int ret = 0; - struct mvm_attach_vocproc_cmd mvm_a_vocproc_cmd; - void *apr_mvm; - u16 mvm_handle, cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvp_handle = voice_get_cvp_handle(v); - - /* attach vocproc and wait for response */ - mvm_a_vocproc_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_a_vocproc_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_a_vocproc_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_a_vocproc_cmd pkt size = %d\n", - mvm_a_vocproc_cmd.hdr.pkt_size); - mvm_a_vocproc_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_a_vocproc_cmd.hdr.dest_port = mvm_handle; - mvm_a_vocproc_cmd.hdr.token = 0; - mvm_a_vocproc_cmd.hdr.opcode = VSS_IMVM_CMD_ATTACH_VOCPROC; - mvm_a_vocproc_cmd.mvm_attach_cvp_handle.handle = cvp_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_a_vocproc_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_ATTACH_VOCPROC\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static void voc_update_session_params(struct voice_data *v) -{ - /* reset LCH mode */ - v->lch_mode = 0; - - /* clear disable topology setting */ - v->disable_topology = false; - - /* clear mute setting */ - v->dev_rx.dev_mute = common.default_mute_val; - v->dev_tx.dev_mute = common.default_mute_val; - v->stream_rx.stream_mute = common.default_mute_val; - v->stream_tx.stream_mute = common.default_mute_val; -} - -static int voice_destroy_vocproc(struct voice_data *v) -{ - struct mvm_detach_vocproc_cmd mvm_d_vocproc_cmd; - struct apr_hdr cvp_destroy_session_cmd; - struct module_instance_info mod_inst_info; - int ret = 0; - void *apr_mvm, *apr_cvp; - u16 mvm_handle, cvp_handle; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - apr_cvp = common.apr_q6_cvp; - - if (!apr_mvm || !apr_cvp) { - pr_err("%s: apr_mvm or apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - cvp_handle = voice_get_cvp_handle(v); - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - - /* disable slowtalk if st_enable is set */ - if (v->st_enable) - voice_send_set_pp_enable_cmd(v, mod_inst_info, 0); - - /* Disable HD Voice if hd_enable is set */ - if (v->hd_enable) - voice_send_hd_cmd(v, 0); - - /* stop playback or recording */ - v->music_info.force = 1; - voice_cvs_stop_playback(v); - voice_cvs_stop_record(v); - /* If voice call is active during VoLTE, SRVCC happens. - * Start recording on voice session if recording started during VoLTE. - */ - if (is_volte_session(v->session_id) && - ((common.voice[VOC_PATH_PASSIVE].voc_state == VOC_RUN) || - (common.voice[VOC_PATH_PASSIVE].voc_state == VOC_CHANGE))) { - if (v->rec_info.rec_enable) { - voice_cvs_start_record( - &common.voice[VOC_PATH_PASSIVE], - v->rec_info.rec_mode, - v->rec_info.port_id); - common.srvcc_rec_flag = true; - - pr_debug("%s: switch recording, srvcc_rec_flag %d\n", - __func__, common.srvcc_rec_flag); - } - } - - /* send stop voice cmd */ - voice_send_stop_voice_cmd(v); - - /* send stop dtmf detecton cmd */ - if (v->dtmf_rx_detect_en) - voice_send_dtmf_rx_detection_cmd(v, 0); - - /* detach VOCPROC and wait for response from mvm */ - mvm_d_vocproc_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mvm_d_vocproc_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_d_vocproc_cmd) - APR_HDR_SIZE); - pr_debug("mvm_d_vocproc_cmd pkt size = %d\n", - mvm_d_vocproc_cmd.hdr.pkt_size); - mvm_d_vocproc_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mvm_d_vocproc_cmd.hdr.dest_port = mvm_handle; - mvm_d_vocproc_cmd.hdr.token = 0; - mvm_d_vocproc_cmd.hdr.opcode = VSS_IMVM_CMD_DETACH_VOCPROC; - mvm_d_vocproc_cmd.mvm_detach_cvp_handle.handle = cvp_handle; - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_d_vocproc_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_DETACH_VOCPROC\n"); - goto fail; - } - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - voice_send_cvp_deregister_vol_cal_cmd(v); - voice_send_cvp_deregister_cal_cmd(v); - voice_send_cvp_deregister_dev_cfg_cmd(v); - voice_send_cvs_deregister_cal_cmd(v); - - /* Unload topology modules */ - voice_unload_topo_modules(); - - if (common.mic_break_enable) - voice_send_mvm_event_class_cmd(v, - VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS, - VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE); - - /* destrop cvp session */ - cvp_destroy_session_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_destroy_session_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_destroy_session_cmd) - APR_HDR_SIZE); - pr_debug("cvp_destroy_session_cmd pkt size = %d\n", - cvp_destroy_session_cmd.pkt_size); - cvp_destroy_session_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_destroy_session_cmd.dest_port = cvp_handle; - cvp_destroy_session_cmd.token = 0; - cvp_destroy_session_cmd.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_destroy_session_cmd); - if (ret < 0) { - pr_err("Fail in sending APRV2_IBASIC_CMD_DESTROY_SESSION\n"); - goto fail; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - rtac_remove_voice(voice_get_cvs_handle(v)); - cvp_handle = 0; - voice_set_cvp_handle(v, cvp_handle); - return 0; -fail: - return ret; -} - -static int voice_send_mvm_unmap_memory_physical_cmd(struct voice_data *v, - uint32_t mem_handle) -{ - struct vss_imemory_cmd_unmap_t mem_unmap; - int ret = 0; - void *apr_mvm; - u16 mvm_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_mvm = common.apr_q6_mvm; - - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - return -EINVAL; - } - mvm_handle = voice_get_mvm_handle(v); - - mem_unmap.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mem_unmap.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mem_unmap) - APR_HDR_SIZE); - mem_unmap.hdr.src_port = - voice_get_idx_for_session(v->session_id); - mem_unmap.hdr.dest_port = mvm_handle; - mem_unmap.hdr.token = 0; - mem_unmap.hdr.opcode = VSS_IMEMORY_CMD_UNMAP; - mem_unmap.mem_handle = mem_handle; - - pr_debug("%s: mem_handle: 0x%x\n", __func__, mem_unmap.mem_handle); - - v->mvm_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mem_unmap); - if (ret < 0) { - pr_err("mem_unmap op[0x%x]ret[%d]\n", - mem_unmap.hdr.opcode, ret); - goto fail; - } - - ret = wait_event_timeout(v->mvm_wait, - (v->mvm_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout %d\n", __func__, ret); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; - -fail: - return ret; -} - -static int voice_send_cvs_packet_exchange_config_cmd(struct voice_data *v) -{ - struct vss_istream_cmd_set_oob_packet_exchange_config_t - packet_exchange_config_pkt; - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - packet_exchange_config_pkt.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - packet_exchange_config_pkt.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(packet_exchange_config_pkt) - - APR_HDR_SIZE); - packet_exchange_config_pkt.hdr.src_port = - voice_get_idx_for_session(v->session_id); - packet_exchange_config_pkt.hdr.dest_port = cvs_handle; - packet_exchange_config_pkt.hdr.token = 0; - packet_exchange_config_pkt.hdr.opcode = - VSS_ISTREAM_CMD_SET_OOB_PACKET_EXCHANGE_CONFIG; - packet_exchange_config_pkt.mem_handle = v->shmem_info.mem_handle; - /* dec buffer address */ - packet_exchange_config_pkt.dec_buf_addr_lsw = - lower_32_bits(v->shmem_info.sh_buf.buf[0].phys); - packet_exchange_config_pkt.dec_buf_addr_msw = - msm_audio_populate_upper_32_bits( - v->shmem_info.sh_buf.buf[0].phys); - packet_exchange_config_pkt.dec_buf_size = 4096; - /* enc buffer address */ - packet_exchange_config_pkt.enc_buf_addr_lsw = - lower_32_bits(v->shmem_info.sh_buf.buf[1].phys); - packet_exchange_config_pkt.enc_buf_addr_msw = - msm_audio_populate_upper_32_bits( - v->shmem_info.sh_buf.buf[1].phys); - packet_exchange_config_pkt.enc_buf_size = 4096; - - pr_debug("%s: dec buf add: lsw %0x msw %0x, size %d, enc buf add: lsw %0x msw %0x, size %d\n", - __func__, - packet_exchange_config_pkt.dec_buf_addr_lsw, - packet_exchange_config_pkt.dec_buf_addr_msw, - packet_exchange_config_pkt.dec_buf_size, - packet_exchange_config_pkt.enc_buf_addr_lsw, - packet_exchange_config_pkt.enc_buf_addr_msw, - packet_exchange_config_pkt.enc_buf_size); - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (uint32_t *) &packet_exchange_config_pkt); - if (ret < 0) { - pr_err("Failed to send packet exchange config cmd %d\n", ret); - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: wait_event timeout %d\n", __func__, ret); - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; -fail: - return ret; -} - -static int voice_send_cvs_data_exchange_mode_cmd(struct voice_data *v) -{ - struct vss_istream_cmd_set_packet_exchange_mode_t data_exchange_pkt; - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - data_exchange_pkt.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - data_exchange_pkt.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(data_exchange_pkt) - APR_HDR_SIZE); - data_exchange_pkt.hdr.src_port = - voice_get_idx_for_session(v->session_id); - data_exchange_pkt.hdr.dest_port = cvs_handle; - data_exchange_pkt.hdr.token = 0; - data_exchange_pkt.hdr.opcode = VSS_ISTREAM_CMD_SET_PACKET_EXCHANGE_MODE; - data_exchange_pkt.mode = VSS_ISTREAM_PACKET_EXCHANGE_MODE_OUT_OF_BAND; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (uint32_t *) &data_exchange_pkt); - if (ret < 0) { - pr_err("Failed to send data exchange mode %d\n", ret); - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) - pr_err("%s: wait_event timeout %d\n", __func__, ret); - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - return 0; -fail: - return ret; -} - -static int voice_send_stream_mute_cmd(struct voice_data *v, uint16_t direction, - uint16_t mute_flag, uint32_t ramp_duration) -{ - struct cvs_set_mute_cmd cvs_mute_cmd; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!common.apr_q6_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - /* send mute/unmute to cvs */ - cvs_mute_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_mute_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_mute_cmd) - APR_HDR_SIZE); - cvs_mute_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_mute_cmd.hdr.dest_port = voice_get_cvs_handle(v); - cvs_mute_cmd.hdr.token = 0; - cvs_mute_cmd.hdr.opcode = VSS_IVOLUME_CMD_MUTE_V2; - cvs_mute_cmd.cvs_set_mute.direction = direction; - cvs_mute_cmd.cvs_set_mute.mute_flag = mute_flag; - cvs_mute_cmd.cvs_set_mute.ramp_duration_ms = ramp_duration; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_mute_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending stream mute\n", __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; - -fail: - return ret; -} - -static int voice_send_device_mute_cmd(struct voice_data *v, uint16_t direction, - uint16_t mute_flag, uint32_t ramp_duration) -{ - struct cvp_set_mute_cmd cvp_mute_cmd; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto fail; - } - - if (!common.apr_q6_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - - cvp_mute_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_mute_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_mute_cmd) - APR_HDR_SIZE); - cvp_mute_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_mute_cmd.hdr.dest_port = voice_get_cvp_handle(v); - cvp_mute_cmd.hdr.token = 0; - cvp_mute_cmd.hdr.opcode = VSS_IVOLUME_CMD_MUTE_V2; - cvp_mute_cmd.cvp_set_mute.direction = direction; - cvp_mute_cmd.cvp_set_mute.mute_flag = mute_flag; - cvp_mute_cmd.cvp_set_mute.ramp_duration_ms = ramp_duration; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_mute_cmd); - if (ret < 0) { - pr_err("%s: Error %d sending rx device cmd\n", __func__, ret); - - goto fail; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: Command timeout\n", __func__); - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - return 0; - -fail: - return ret; -} - -static int voice_send_vol_step_cmd(struct voice_data *v) -{ - struct cvp_set_rx_volume_step_cmd cvp_vol_step_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - cvp_handle = voice_get_cvp_handle(v); - - /* send volume index to cvp */ - cvp_vol_step_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_vol_step_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_vol_step_cmd) - APR_HDR_SIZE); - cvp_vol_step_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_vol_step_cmd.hdr.dest_port = cvp_handle; - cvp_vol_step_cmd.hdr.token = 0; - cvp_vol_step_cmd.hdr.opcode = VSS_IVOLUME_CMD_SET_STEP; - cvp_vol_step_cmd.cvp_set_vol_step.direction = VSS_IVOLUME_DIRECTION_RX; - cvp_vol_step_cmd.cvp_set_vol_step.value = v->dev_rx.volume_step_value; - cvp_vol_step_cmd.cvp_set_vol_step.ramp_duration_ms = - v->dev_rx.volume_ramp_duration_ms; - pr_debug("%s step_value:%d, ramp_duration_ms:%d", - __func__, - cvp_vol_step_cmd.cvp_set_vol_step.value, - cvp_vol_step_cmd.cvp_set_vol_step.ramp_duration_ms); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_vol_step_cmd); - if (ret < 0) { - pr_err("Fail in sending RX VOL step\n"); - return -EINVAL; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - return -EINVAL; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - return ret; - } - return 0; -} - -static int voice_cvs_start_record(struct voice_data *v, uint32_t rec_mode, - uint32_t port_id) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - - struct cvs_start_record_cmd cvs_start_record; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (!v->rec_info.recording) { - cvs_start_record.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_start_record.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_start_record) - APR_HDR_SIZE); - cvs_start_record.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_start_record.hdr.dest_port = cvs_handle; - cvs_start_record.hdr.token = 0; - cvs_start_record.hdr.opcode = VSS_IRECORD_CMD_START; - - cvs_start_record.rec_mode.port_id = - VSS_IRECORD_PORT_ID_DEFAULT; - if (rec_mode == VOC_REC_UPLINK) { - cvs_start_record.rec_mode.rx_tap_point = - VSS_IRECORD_TAP_POINT_NONE; - cvs_start_record.rec_mode.tx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - } else if (rec_mode == VOC_REC_DOWNLINK) { - cvs_start_record.rec_mode.rx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - cvs_start_record.rec_mode.tx_tap_point = - VSS_IRECORD_TAP_POINT_NONE; - } else if (rec_mode == VOC_REC_BOTH) { - cvs_start_record.rec_mode.rx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - cvs_start_record.rec_mode.tx_tap_point = - VSS_IRECORD_TAP_POINT_STREAM_END; - if (common.rec_channel_count == - NUM_CHANNELS_STEREO) { - /* - * if channel count is not stereo, - * then default port_id and mode - * (mono) will be used - */ - cvs_start_record.rec_mode.mode = - VSS_IRECORD_MODE_TX_RX_STEREO; - cvs_start_record.rec_mode.port_id = - port_id; - } - } else { - pr_err("%s: Invalid in-call rec_mode %d\n", __func__, - rec_mode); - - ret = -EINVAL; - goto fail; - } - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_start_record); - if (ret < 0) { - pr_err("%s: Error %d sending START_RECORD\n", __func__, - ret); - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - v->rec_info.recording = 1; - } else { - pr_debug("%s: Start record already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -static int voice_cvs_stop_record(struct voice_data *v) -{ - int ret = 0; - void *apr_cvs; - u16 cvs_handle; - struct apr_hdr cvs_stop_record; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (v->rec_info.recording) { - cvs_stop_record.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_stop_record.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_stop_record) - APR_HDR_SIZE); - cvs_stop_record.src_port = - voice_get_idx_for_session(v->session_id); - cvs_stop_record.dest_port = cvs_handle; - cvs_stop_record.token = 0; - cvs_stop_record.opcode = VSS_IRECORD_CMD_STOP; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_stop_record); - if (ret < 0) { - pr_err("%s: Error %d sending STOP_RECORD\n", - __func__, ret); - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - v->rec_info.recording = 0; - } else { - pr_debug("%s: Stop record already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -/** - * voc_start_record - - * command to set record for voice session - * - * @port_id: Pseudo Port ID for record data - * @set: Enable or Disable for record start/stop - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_start_record(uint32_t port_id, uint32_t set, uint32_t session_id) -{ - int ret = 0; - int rec_mode = 0; - u16 cvs_handle; - int rec_set = 0; - struct voice_session_itr itr; - struct voice_data *v = NULL; - - /* check if session_id is valid */ - if (!voice_is_valid_session_id(session_id)) { - pr_err("%s: Invalid session id:%u\n", __func__, - session_id); - - return -EINVAL; - } - - voice_itr_init(&itr, session_id); - pr_debug("%s: session_id:%u\n", __func__, session_id); - - while (voice_itr_get_next_session(&itr, &v)) { - if (v == NULL) { - pr_err("%s: v is NULL, sessionid:%u\n", __func__, - session_id); - - break; - } - pr_debug("%s: port_id: %d, set: %d, v: %pK\n", - __func__, port_id, set, v); - - mutex_lock(&v->lock); - rec_mode = v->rec_info.rec_mode; - v->rec_info.port_id = port_id; - rec_set = set; - if (set) { - if ((v->rec_route_state.ul_flag != 0) && - (v->rec_route_state.dl_flag != 0)) { - pr_debug("%s: rec mode already set.\n", - __func__); - - mutex_unlock(&v->lock); - continue; - } - - if (port_id == VOICE_RECORD_TX) { - if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag == 0)) { - rec_mode = VOC_REC_UPLINK; - v->rec_route_state.ul_flag = 1; - } else if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag != 0)) { - voice_cvs_stop_record(v); - rec_mode = VOC_REC_BOTH; - v->rec_route_state.ul_flag = 1; - } - } else if (port_id == VOICE_RECORD_RX) { - if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag == 0)) { - rec_mode = VOC_REC_DOWNLINK; - v->rec_route_state.dl_flag = 1; - } else if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag == 0)) { - voice_cvs_stop_record(v); - rec_mode = VOC_REC_BOTH; - v->rec_route_state.dl_flag = 1; - } - } - rec_set = 1; - } else { - if ((v->rec_route_state.ul_flag == 0) && - (v->rec_route_state.dl_flag == 0)) { - pr_debug("%s: rec already stops.\n", - __func__); - mutex_unlock(&v->lock); - continue; - } - - if (port_id == VOICE_RECORD_TX) { - if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag == 0)) { - v->rec_route_state.ul_flag = 0; - rec_set = 0; - } else if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag != 0)) { - voice_cvs_stop_record(v); - v->rec_route_state.ul_flag = 0; - rec_mode = VOC_REC_DOWNLINK; - rec_set = 1; - } - } else if (port_id == VOICE_RECORD_RX) { - if ((v->rec_route_state.ul_flag == 0) - && (v->rec_route_state.dl_flag != 0)) { - v->rec_route_state.dl_flag = 0; - rec_set = 0; - } else if ((v->rec_route_state.ul_flag != 0) - && (v->rec_route_state.dl_flag != 0)) { - voice_cvs_stop_record(v); - v->rec_route_state.dl_flag = 0; - rec_mode = VOC_REC_UPLINK; - rec_set = 1; - } - } - } - pr_debug("%s: mode =%d, set =%d\n", __func__, - rec_mode, rec_set); - cvs_handle = voice_get_cvs_handle(v); - - if (cvs_handle != 0) { - if (rec_set) - ret = voice_cvs_start_record(v, rec_mode, - port_id); - else - ret = voice_cvs_stop_record(v); - } - - /* During SRVCC, recording will switch from VoLTE session to - * voice session. - * Then stop recording, need to stop recording on voice session. - */ - if ((!rec_set) && common.srvcc_rec_flag) { - pr_debug("%s, srvcc_rec_flag:%d\n", __func__, - common.srvcc_rec_flag); - - voice_cvs_stop_record(&common.voice[VOC_PATH_PASSIVE]); - common.srvcc_rec_flag = false; - } - - /* Cache the value */ - v->rec_info.rec_enable = rec_set; - v->rec_info.rec_mode = rec_mode; - - mutex_unlock(&v->lock); - } - - return ret; -} -EXPORT_SYMBOL(voc_start_record); - -static int voice_cvs_start_playback(struct voice_data *v) -{ - int ret = 0; - struct cvs_start_playback_cmd cvs_start_playback; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (!v->music_info.playing && v->music_info.count) { - cvs_start_playback.hdr.hdr_field = APR_HDR_FIELD( - APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvs_start_playback.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_start_playback) - APR_HDR_SIZE); - cvs_start_playback.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvs_start_playback.hdr.dest_port = cvs_handle; - cvs_start_playback.hdr.token = 0; - cvs_start_playback.hdr.opcode = VSS_IPLAYBACK_CMD_START; - cvs_start_playback.playback_mode.port_id = - v->music_info.port_id; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_start_playback); - - if (ret < 0) { - pr_err("%s: Error %d sending START_PLAYBACK\n", - __func__, ret); - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - v->music_info.playing = 1; - } else { - pr_debug("%s: Start playback already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -static int voice_cvs_stop_playback(struct voice_data *v) -{ - int ret = 0; - struct apr_hdr cvs_stop_playback; - void *apr_cvs; - u16 cvs_handle; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL.\n", __func__); - return -EINVAL; - } - - cvs_handle = voice_get_cvs_handle(v); - - if (v->music_info.playing && ((!v->music_info.count) || - (v->music_info.force))) { - cvs_stop_playback.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvs_stop_playback.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvs_stop_playback) - APR_HDR_SIZE); - cvs_stop_playback.src_port = - voice_get_idx_for_session(v->session_id); - cvs_stop_playback.dest_port = cvs_handle; - cvs_stop_playback.token = 0; - - cvs_stop_playback.opcode = VSS_IPLAYBACK_CMD_STOP; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_stop_playback); - if (ret < 0) { - pr_err("%s: Error %d sending STOP_PLAYBACK\n", - __func__, ret); - - - goto fail; - } - - ret = wait_event_timeout(v->cvs_wait, - (v->cvs_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - goto fail; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto fail; - } - - v->music_info.playing = 0; - v->music_info.force = 0; - } else { - pr_debug("%s: Stop playback already sent\n", __func__); - } - - return 0; - -fail: - return ret; -} - -static int voc_lch_ops(struct voice_data *v, enum voice_lch_mode lch_mode) -{ - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - switch (lch_mode) { - case VOICE_LCH_START: - - ret = voc_end_voice_call(v->session_id); - if (ret < 0) - pr_err("%s: voice call end failed %d\n", - __func__, ret); - break; - case VOICE_LCH_STOP: - - ret = voc_start_voice_call(v->session_id); - if (ret < 0) { - pr_err("%s: voice call start failed %d\n", - __func__, ret); - goto done; - } - break; - default: - pr_err("%s: Invalid LCH mode: %d\n", - __func__, v->lch_mode); - break; - } -done: - return ret; -} - -/** - * voc_start_playback - - * command to set playback for voice session - * - * @set: Enable or Disable for playback start/stop - * @port_id: Pseudo Port ID for playback data - * - * Returns 0 on success or error on failure - */ -int voc_start_playback(uint32_t set, uint16_t port_id) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - u16 cvs_handle; - - pr_debug("%s port_id = %#x set = %d", __func__, port_id, set); - - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if ((v != NULL) && - (((port_id == VOICE_PLAYBACK_TX) && - is_sub1_vsid(v->session_id)) || - ((port_id == VOICE2_PLAYBACK_TX) && - is_sub2_vsid(v->session_id)))) { - - mutex_lock(&v->lock); - v->music_info.port_id = port_id; - v->music_info.play_enable = set; - if (set) - v->music_info.count++; - else - v->music_info.count--; - pr_debug("%s: music_info count=%d\n", __func__, - v->music_info.count); - - cvs_handle = voice_get_cvs_handle(v); - if (cvs_handle != 0) { - if (set) - ret = voice_cvs_start_playback(v); - else - ret = voice_cvs_stop_playback(v); - } - mutex_unlock(&v->lock); - } else { - pr_err("%s: Invalid session\n", __func__); - } - } - - return ret; -} -EXPORT_SYMBOL(voc_start_playback); - -/** - * voc_disable_topology - - * disable topology for voice session - * - * @session_id: voice session ID to send this command - * @disable: disable value - * - * Returns 0 on success or error on failure - */ -int voc_disable_topology(uint32_t session_id, uint32_t disable) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - v->disable_topology = disable; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_disable_topology); - -/** - * voc_set_incall_capture_channel_config - - * command to set channel count for record - * - * @channel_count: number of channels - * - */ -void voc_set_incall_capture_channel_config(int channel_count) -{ - common.rec_channel_count = channel_count; -} -EXPORT_SYMBOL(voc_set_incall_capture_channel_config); - -/** - * voc_get_incall_capture_channel_config - - * command to get channel count for record - * - * Returns number of channels configured for record - */ -int voc_get_incall_capture_channel_config(void) -{ - return common.rec_channel_count; -} -EXPORT_SYMBOL(voc_get_incall_capture_channel_config); - -static int voice_set_packet_exchange_mode_and_config(uint32_t session_id, - uint32_t mode) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - return -EINVAL; - } - - if (v->voc_state != VOC_RUN) - ret = voice_send_cvs_data_exchange_mode_cmd(v); - - if (ret) { - pr_err("%s: Error voice_send_data_exchange_mode_cmd %d\n", - __func__, ret); - goto fail; - } - - ret = voice_send_cvs_packet_exchange_config_cmd(v); - if (ret) { - pr_err("%s: Error: voice_send_packet_exchange_config_cmd %d\n", - __func__, ret); - goto fail; - } - - return ret; -fail: - return -EINVAL; -} - -/** - * voc_set_tx_mute - - * command to send TX mute for voice session - * - * @session_id: voice session ID to send this command - * @dir: RX or TX - * @mute: TX mute value - * @ramp_duration: Ramp duration in ms - * - * Returns 0 on success or error on failure - */ -int voc_set_tx_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - v->stream_tx.stream_mute = mute; - v->stream_tx.stream_mute_ramp_duration_ms = - ramp_duration; - if (is_voc_state_active(v->voc_state) && - (v->lch_mode == 0)) - ret = voice_send_stream_mute_cmd(v, - VSS_IVOLUME_DIRECTION_TX, - v->stream_tx.stream_mute, - v->stream_tx.stream_mute_ramp_duration_ms); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_tx_mute); - -/** - * voc_set_device_mute - - * command to set device mute for voice session - * - * @session_id: voice session ID to send this command - * @dir: RX or TX - * @mute: mute value - * @ramp_duration: Ramp duration in ms - * - * Returns 0 on success or error on failure - */ -int voc_set_device_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (dir == VSS_IVOLUME_DIRECTION_TX) { - v->dev_tx.dev_mute = mute; - v->dev_tx.dev_mute_ramp_duration_ms = - ramp_duration; - } else { - v->dev_rx.dev_mute = mute; - v->dev_rx.dev_mute_ramp_duration_ms = - ramp_duration; - } - - if (((v->voc_state == VOC_RUN) || - (v->voc_state == VOC_STANDBY)) && - (v->lch_mode == 0)) - ret = voice_send_device_mute_cmd(v, - dir, - mute, - ramp_duration); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_device_mute); - -int voc_get_rx_device_mute(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - ret = v->dev_rx.dev_mute; - - mutex_unlock(&v->lock); - - return ret; -} - -/** - * voc_set_tty_mode - - * Update tty mode for voice session - * - * @session_id: voice session ID - * @tty_mode: TTY mode value - * - * Returns 0 on success or error on failure - */ -int voc_set_tty_mode(uint32_t session_id, uint8_t tty_mode) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - v->tty_mode = tty_mode; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_set_tty_mode); - -/** - * voc_get_tty_mode - - * Retrieve tty mode for voice session - * - * @session_id: voice session ID - * - * Returns 0 on success or error on failure - */ -uint8_t voc_get_tty_mode(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - ret = v->tty_mode; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_get_tty_mode); - -/** - * voc_set_pp_enable - - * Command to set PP for voice module - * - * @session_id: voice session ID to send this command - * @module_id: voice module id - * @enable: enable/disable flag - * - * Returns 0 on success or error on failure - */ -int voc_set_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info, - uint32_t enable) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - int mid = mod_inst_info.module_id; - int iid = mod_inst_info.instance_id; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - if (!(is_voice_app_id(v->session_id))) - continue; - - mutex_lock(&v->lock); - if (mid == MODULE_ID_VOICE_MODULE_ST && - iid == INSTANCE_ID_0) - v->st_enable = enable; - - if (v->voc_state == VOC_RUN) { - if ((mid == MODULE_ID_VOICE_MODULE_ST) && - iid == INSTANCE_ID_0 && (!v->tty_mode)) - ret = voice_send_set_pp_enable_cmd( - v, mod_inst_info, enable); - } - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_pp_enable); - -/** - * voc_set_hd_enable - - * Command to set HD for voice session - * - * @session_id: voice session ID to send this command - * @enable: enable/disable flag - * - * Returns 0 on success or error on failure - */ -int voc_set_hd_enable(uint32_t session_id, uint32_t enable) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - v->hd_enable = enable; - - if (v->voc_state == VOC_RUN) - ret = voice_send_hd_cmd(v, enable); - - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_hd_enable); - -/** - * voc_set_afe_sidetone - - * Command to set sidetone at AFE - * - * @session_id: voice session ID to send this command - * @sidetone_enable: enable/disable flag for sidetone - * - * Returns 0 on success or error on failure - */ -int voc_set_afe_sidetone(uint32_t session_id, bool sidetone_enable) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - u16 rx_port, tx_port; - - common.sidetone_enable = sidetone_enable; - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - ret = -EINVAL; - break; - } - mutex_lock(&v->lock); - if (v->voc_state != VOC_RUN) { - mutex_unlock(&v->lock); - continue; - } - rx_port = v->dev_rx.port_id; - tx_port = v->dev_tx.port_id; - ret = afe_sidetone_enable(tx_port, rx_port, - sidetone_enable); - if (!ret) { - mutex_unlock(&v->lock); - break; - } - mutex_unlock(&v->lock); - } - return ret; -} -EXPORT_SYMBOL(voc_set_afe_sidetone); - -/** - * voc_get_afe_sidetone - - * Retrieve sidetone status at AFE - * - * Returns sidetone enable status - */ -bool voc_get_afe_sidetone(void) -{ - bool ret; - - ret = common.sidetone_enable; - return ret; -} -EXPORT_SYMBOL(voc_get_afe_sidetone); -int voc_get_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - if (mod_inst_info.module_id == MODULE_ID_VOICE_MODULE_ST && - mod_inst_info.instance_id == INSTANCE_ID_0) - ret = v->st_enable; - mutex_unlock(&v->lock); - - return ret; -} - -/** - * voc_set_rx_vol_step - - * command to send voice RX volume in step value - * - * @session_id: voice session ID - * @dir: direction RX or TX - * @vol_step: Volume step value - * @ramp_duration: Ramp duration in ms - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_rx_vol_step(uint32_t session_id, uint32_t dir, uint32_t vol_step, - uint32_t ramp_duration) -{ - struct voice_data *v = NULL; - int ret = 0; - struct voice_session_itr itr; - - pr_debug("%s session id = %#x vol = %u", __func__, session_id, - vol_step); - - voice_itr_init(&itr, session_id); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - v->dev_rx.volume_step_value = vol_step; - v->dev_rx.volume_ramp_duration_ms = ramp_duration; - if (is_voc_state_active(v->voc_state)) - ret = voice_send_vol_step_cmd(v); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session_id 0x%x\n", __func__, - session_id); - - ret = -EINVAL; - break; - } - } - - return ret; -} -EXPORT_SYMBOL(voc_set_rx_vol_step); - -/** - * voc_set_device_config - - * Set voice path config for RX or TX - * - * @session_id: voice session ID - * @path_dir: direction RX or TX - * @finfo: format config info - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_device_config(uint32_t session_id, uint8_t path_dir, - struct media_format_info *finfo) -{ - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: Invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - pr_debug("%s: path_dir=%d port_id=%x, channels=%d, sample_rate=%d, bits_per_sample=%d\n", - __func__, path_dir, finfo->port_id, finfo->num_channels, - finfo->sample_rate, finfo->bits_per_sample); - - mutex_lock(&v->lock); - switch (path_dir) { - case RX_PATH: - v->dev_rx.port_id = q6audio_get_port_id(finfo->port_id); - v->dev_rx.no_of_channels = finfo->num_channels; - v->dev_rx.sample_rate = finfo->sample_rate; - v->dev_rx.bits_per_sample = finfo->bits_per_sample; - memcpy(&v->dev_rx.channel_mapping, &finfo->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - break; - case TX_PATH: - v->dev_tx.port_id = q6audio_get_port_id(finfo->port_id); - v->dev_tx.no_of_channels = finfo->num_channels; - v->dev_tx.sample_rate = finfo->sample_rate; - v->dev_tx.bits_per_sample = finfo->bits_per_sample; - memcpy(&v->dev_tx.channel_mapping, &finfo->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - break; - default: - pr_err("%s: Invalid path_dir %d\n", __func__, path_dir); - return -EINVAL; - } - - mutex_unlock(&v->lock); - - return 0; -} -EXPORT_SYMBOL(voc_set_device_config); - -/** - * voc_set_ext_ec_ref_media_fmt_info - - * Update voice EC media format info - * - * @finfo: media format info - * - */ -int voc_set_ext_ec_ref_media_fmt_info(struct media_format_info *finfo) -{ - mutex_lock(&common.common_lock); - if (common.ec_ref_ext) { - common.ec_media_fmt_info.num_channels = finfo->num_channels; - common.ec_media_fmt_info.bits_per_sample = - finfo->bits_per_sample; - common.ec_media_fmt_info.sample_rate = finfo->sample_rate; - memcpy(&common.ec_media_fmt_info.channel_mapping, - &finfo->channel_mapping, VSS_CHANNEL_MAPPING_SIZE); - } else { - pr_debug("%s: Ext Ec Ref not active, returning", __func__); - } - mutex_unlock(&common.common_lock); - return 0; -} -EXPORT_SYMBOL(voc_set_ext_ec_ref_media_fmt_info); - -/** - * voc_set_route_flag - - * Set voice route state for RX or TX - * - * @session_id: voice session ID - * @path_dir: direction RX or TX - * @set: Value of route state to set - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_route_flag(uint32_t session_id, uint8_t path_dir, uint8_t set) -{ - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - pr_debug("%s: path_dir=%d, set=%d\n", __func__, path_dir, set); - - mutex_lock(&v->lock); - - if (path_dir == RX_PATH) - v->voc_route_state.rx_route_flag = set; - else - v->voc_route_state.tx_route_flag = set; - - mutex_unlock(&v->lock); - - return 0; -} -EXPORT_SYMBOL(voc_set_route_flag); - -/** - * voc_get_route_flag - - * Retrieve voice route state for RX or TX - * - * @session_id: voice session ID - * @path_dir: direction RX or TX - * - * Returns route state on success or 0 on failure - */ -uint8_t voc_get_route_flag(uint32_t session_id, uint8_t path_dir) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return 0; - } - - mutex_lock(&v->lock); - - if (path_dir == RX_PATH) - ret = v->voc_route_state.rx_route_flag; - else - ret = v->voc_route_state.tx_route_flag; - - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_get_route_flag); - -/** - * voc_get_mbd_enable - - * Retrieve mic break detection enable state - * - * Returns true if mic break detection is enabled or false if disabled - */ -bool voc_get_mbd_enable(void) -{ - bool enable = false; - - mutex_lock(&common.common_lock); - enable = common.mic_break_enable; - mutex_unlock(&common.common_lock); - - return enable; -} -EXPORT_SYMBOL(voc_get_mbd_enable); - -/** - * voc_set_mbd_enable - - * Set mic break detection enable state - * - * @enable: mic break detection state to set - * - * Returns 0 - */ -uint8_t voc_set_mbd_enable(bool enable) -{ - struct voice_data *v = NULL; - struct voice_session_itr itr; - bool check_and_send_event = false; - uint32_t event_id = VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS; - uint32_t class_id = VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE; - - mutex_lock(&common.common_lock); - if (common.mic_break_enable != enable) - check_and_send_event = true; - common.mic_break_enable = enable; - mutex_unlock(&common.common_lock); - - if (!check_and_send_event) - return 0; - - if (!enable) - event_id = VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS; - - memset(&itr, 0, sizeof(itr)); - - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state)) { - voice_send_mvm_event_class_cmd(v, event_id, - class_id); - } - mutex_unlock(&v->lock); - } - } - - return 0; -} -EXPORT_SYMBOL(voc_set_mbd_enable); - -/** - * voc_end_voice_call - - * command to end voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_end_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - if (v->voc_state == VOC_RUN || v->voc_state == VOC_ERROR || - v->voc_state == VOC_CHANGE || v->voc_state == VOC_STANDBY) { - - pr_debug("%s: VOC_STATE: %d\n", __func__, v->voc_state); - - ret = voice_destroy_vocproc(v); - if (ret < 0) - pr_err("%s: destroy voice failed\n", __func__); - - voc_update_session_params(v); - - voice_destroy_mvm_cvs_session(v); - - ret = voice_mhi_end(); - if (ret < 0) - pr_debug("%s: voice_mhi_end failed! %d\n", - __func__, ret); - - v->voc_state = VOC_RELEASE; - } else { - pr_err("%s: Error: End voice called in state %d\n", - __func__, v->voc_state); - - ret = -EINVAL; - } - - mutex_unlock(&v->lock); - return ret; -} -EXPORT_SYMBOL(voc_end_voice_call); - -/** - * voc_standby_voice_call - - * command to standy voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_standby_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - struct apr_hdr mvm_standby_voice_cmd; - void *apr_mvm; - u16 mvm_handle; - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - pr_debug("%s: voc state=%d", __func__, v->voc_state); - - if (v->voc_state == VOC_RUN) { - apr_mvm = common.apr_q6_mvm; - if (!apr_mvm) { - pr_err("%s: apr_mvm is NULL.\n", __func__); - ret = -EINVAL; - goto fail; - } - mvm_handle = voice_get_mvm_handle(v); - mvm_standby_voice_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - mvm_standby_voice_cmd.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mvm_standby_voice_cmd) - APR_HDR_SIZE); - pr_debug("send mvm_standby_voice_cmd pkt size = %d\n", - mvm_standby_voice_cmd.pkt_size); - mvm_standby_voice_cmd.src_port = - voice_get_idx_for_session(v->session_id); - mvm_standby_voice_cmd.dest_port = mvm_handle; - mvm_standby_voice_cmd.token = 0; - mvm_standby_voice_cmd.opcode = VSS_IMVM_CMD_STANDBY_VOICE; - v->mvm_state = CMD_STATUS_FAIL; - ret = apr_send_pkt(apr_mvm, - (uint32_t *)&mvm_standby_voice_cmd); - if (ret < 0) { - pr_err("Fail in sending VSS_IMVM_CMD_STANDBY_VOICE\n"); - ret = -EINVAL; - goto fail; - } - v->voc_state = VOC_STANDBY; - } -fail: - return ret; -} -EXPORT_SYMBOL(voc_standby_voice_call); - -/** - * voc_disable_device - - * command to pause call and disable voice path - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_disable_device(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: voc state=%d\n", __func__, v->voc_state); - - mutex_lock(&v->lock); - if (v->voc_state == VOC_RUN) { - ret = voice_pause_voice_call(v); - if (ret < 0) { - pr_err("%s: Pause Voice Call failed for session 0x%x, err %d!\n", - __func__, v->session_id, ret); - goto done; - } - rtac_remove_voice(voice_get_cvs_handle(v)); - voice_send_cvp_deregister_vol_cal_cmd(v); - voice_send_cvp_deregister_cal_cmd(v); - voice_send_cvp_deregister_dev_cfg_cmd(v); - - /* Unload topology modules */ - voice_unload_topo_modules(); - - v->voc_state = VOC_CHANGE; - } else { - pr_debug("%s: called in voc state=%d, No_OP\n", - __func__, v->voc_state); - } - -done: - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_disable_device); - -/** - * voc_enable_device - - * command to enable voice path and start call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_enable_device(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - struct module_instance_info mod_inst_info; - int ret = 0; - - memset(&mod_inst_info, 0, sizeof(mod_inst_info)); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: voc state=%d\n", __func__, v->voc_state); - mutex_lock(&v->lock); - if (v->voc_state == VOC_CHANGE) { - ret = voice_send_tty_mode_cmd(v); - if (ret < 0) { - pr_err("%s: Sending TTY mode failed, ret=%d\n", - __func__, ret); - /* Not a critical error, allow voice call to continue */ - } - - mod_inst_info.module_id = MODULE_ID_VOICE_MODULE_ST; - mod_inst_info.instance_id = INSTANCE_ID_0; - - if (v->tty_mode) { - /* disable slowtalk */ - voice_send_set_pp_enable_cmd(v, mod_inst_info, 0); - } else { - /* restore slowtalk */ - voice_send_set_pp_enable_cmd(v, mod_inst_info, - v->st_enable); - } - - ret = voice_send_set_device_cmd(v); - if (ret < 0) { - pr_err("%s: Set device failed, ret=%d\n", - __func__, ret); - goto done; - } - - ret = voice_send_cvp_media_fmt_info_cmd(v); - if (ret < 0) { - pr_err("%s: Set format failed err:%d\n", __func__, ret); - goto done; - } - - ret = voice_send_cvp_topology_commit_cmd(v); - if (ret < 0) { - pr_err("%s: Set topology commit failed\n", __func__); - goto done; - } - - /* Send MFC config only when the no of channels are > 1 */ - if (v->dev_rx.no_of_channels > NUM_CHANNELS_MONO) { - ret = voice_send_cvp_mfc_config_cmd(v); - if (ret < 0) { - pr_warn("%s: Set mfc config failed err: %d\n", - __func__, ret); - } - } - - voice_send_cvp_register_dev_cfg_cmd(v); - voice_send_cvp_register_cal_cmd(v); - voice_send_cvp_register_vol_cal_cmd(v); - - rtac_add_voice(voice_get_cvs_handle(v), - voice_get_cvp_handle(v), - v->dev_rx.port_id, v->dev_tx.port_id, - v->dev_rx.dev_id, v->dev_tx.dev_id, - v->session_id); - - ret = voice_send_start_voice_cmd(v); - if (ret < 0) { - pr_err("%s: Fail in sending START_VOICE, ret=%d\n", - __func__, ret); - goto done; - } - v->voc_state = VOC_RUN; - } else { - pr_debug("%s: called in voc state=%d, No_OP\n", - __func__, v->voc_state); - } - -done: - mutex_unlock(&v->lock); - - return ret; -} -EXPORT_SYMBOL(voc_enable_device); - -/** - * voc_set_lch - - * command to set hold/unhold call state - * - * @session_id: voice session ID to send this command - * @lch_mode: LCH mode to set - * - * Returns 0 on success or error on failure - */ -int voc_set_lch(uint32_t session_id, enum voice_lch_mode lch_mode) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: Invalid session_id 0x%x\n", __func__, session_id); - - ret = -EINVAL; - goto done; - } - - mutex_lock(&v->lock); - if (v->lch_mode == lch_mode) { - pr_debug("%s: Session %d already in LCH mode %d\n", - __func__, session_id, lch_mode); - - mutex_unlock(&v->lock); - goto done; - } - - v->lch_mode = lch_mode; - mutex_unlock(&v->lock); - - ret = voc_lch_ops(v, v->lch_mode); - if (ret < 0) { - pr_err("%s: lch ops failed %d\n", __func__, ret); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_set_lch); - -/** - * voc_resume_voice_call - - * command to resume voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_resume_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - ret = voice_send_start_voice_cmd(v); - if (ret < 0) { - pr_err("Fail in sending START_VOICE\n"); - goto fail; - } - v->voc_state = VOC_RUN; - return 0; -fail: - return -EINVAL; -} -EXPORT_SYMBOL(voc_resume_voice_call); - -/** - * voc_start_voice_call - - * command to start voice call - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_start_voice_call(uint32_t session_id) -{ - struct voice_data *v = voice_get_session(session_id); - int ret = 0; - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", __func__, session_id); - - return -EINVAL; - } - - mutex_lock(&v->lock); - - if (v->voc_state == VOC_ERROR) { - pr_debug("%s: VOC in ERR state\n", __func__); - - voice_destroy_mvm_cvs_session(v); - v->voc_state = VOC_INIT; - } - - if ((v->voc_state == VOC_INIT) || - (v->voc_state == VOC_RELEASE)) { - ret = voice_apr_register(session_id); - if (ret < 0) { - pr_err("%s: apr register failed\n", __func__); - goto fail; - } - - if (is_cvd_version_queried()) { - pr_debug("%s: Returning the cached value %s\n", - __func__, common.cvd_version); - } else { - ret = voice_send_mvm_cvd_version_cmd(v); - if (ret < 0) - pr_debug("%s: Error retrieving CVD version %d\n", - __func__, ret); - } - - ret = voice_mhi_start(); - if (ret < 0) { - pr_debug("%s: voice_mhi_start failed! %d\n", - __func__, ret); - goto fail; - } - - ret = voice_create_mvm_cvs_session(v); - if (ret < 0) { - pr_err("create mvm and cvs failed\n"); - goto fail; - } - - if (is_voip_session(session_id)) { - /* Allocate oob mem if not already allocated and - * memory map the oob memory block. - */ - ret = voice_alloc_and_map_oob_mem(v); - if (ret < 0) { - pr_err("%s: voice_alloc_and_map_oob_mem() failed, ret:%d\n", - __func__, ret); - - goto fail; - } - - ret = voice_set_packet_exchange_mode_and_config( - session_id, - VSS_ISTREAM_PACKET_EXCHANGE_MODE_OUT_OF_BAND); - if (ret) { - pr_err("%s: Err: exchange_mode_and_config %d\n", - __func__, ret); - - goto fail; - } - } - ret = voice_send_dual_control_cmd(v); - if (ret < 0) { - pr_err("Err Dual command failed\n"); - goto fail; - } - ret = voice_setup_vocproc(v); - if (ret < 0) { - pr_err("setup voice failed\n"); - goto fail; - } - - ret = voice_send_vol_step_cmd(v); - if (ret < 0) - pr_err("voice volume failed\n"); - - ret = voice_send_stream_mute_cmd(v, - VSS_IVOLUME_DIRECTION_TX, - v->stream_tx.stream_mute, - v->stream_tx.stream_mute_ramp_duration_ms); - if (ret < 0) - pr_err("voice mute failed\n"); - - ret = voice_send_start_voice_cmd(v); - if (ret < 0) { - pr_err("start voice failed\n"); - goto fail; - } - - v->voc_state = VOC_RUN; - } else { - pr_err("%s: Error: Start voice called in state %d\n", - __func__, v->voc_state); - - ret = -EINVAL; - goto fail; - } -fail: - mutex_unlock(&v->lock); - return ret; -} -EXPORT_SYMBOL(voc_start_voice_call); - -/** - * voc_set_ext_ec_ref_port_id - - * Set EC ref port id - * - * Returns 0 on success or -EINVAL on failure - */ -int voc_set_ext_ec_ref_port_id(uint16_t port_id, bool state) -{ - int ret = 0; - - mutex_lock(&common.common_lock); - if (state == true) { - if (port_id == AFE_PORT_INVALID) { - pr_err("%s: Invalid port id", __func__); - ret = -EINVAL; - goto exit; - } - common.ec_ref_ext = true; - } else { - common.ec_ref_ext = false; - } - /* Cache EC Fromat Info in common */ - common.ec_media_fmt_info.port_id = port_id; -exit: - mutex_unlock(&common.common_lock); - return ret; -} -EXPORT_SYMBOL(voc_set_ext_ec_ref_port_id); - -/** - * voc_get_ext_ec_ref_port_id - - * Retrieve EC ref port id - * - * Returns EC Ref port id if present - * otherwise AFE_PORT_INVALID - */ -int voc_get_ext_ec_ref_port_id(void) -{ - if (common.ec_ref_ext) - return common.ec_media_fmt_info.port_id; - else - return AFE_PORT_INVALID; -} -EXPORT_SYMBOL(voc_get_ext_ec_ref_port_id); - -/** - * voc_register_mvs_cb - - * Update callback info for mvs - * - * @ul_cb: Uplink callback fn - * @dl_cb: downlink callback fn - * ssr_cb: SSR callback fn - * @private_data: private data of mvs - * - */ -void voc_register_mvs_cb(ul_cb_fn ul_cb, - dl_cb_fn dl_cb, - voip_ssr_cb ssr_cb, - void *private_data) -{ - common.mvs_info.ul_cb = ul_cb; - common.mvs_info.dl_cb = dl_cb; - common.mvs_info.ssr_cb = ssr_cb; - common.mvs_info.private_data = private_data; -} -EXPORT_SYMBOL(voc_register_mvs_cb); - -/** - * voc_register_dtmf_rx_detection_cb - - * Update callback info for dtmf - * - * @dtmf_rx_ul_cb: DTMF uplink RX callback fn - * @private_data: private data of dtmf info - * - */ -void voc_register_dtmf_rx_detection_cb(dtmf_rx_det_cb_fn dtmf_rx_ul_cb, - void *private_data) -{ - common.dtmf_info.dtmf_rx_ul_cb = dtmf_rx_ul_cb; - common.dtmf_info.private_data = private_data; -} -EXPORT_SYMBOL(voc_register_dtmf_rx_detection_cb); - -/** - * voc_config_vocoder - - * Update config for mvs params. - */ -void voc_config_vocoder(uint32_t media_type, - uint32_t rate, - uint32_t network_type, - uint32_t dtx_mode, - uint32_t evrc_min_rate, - uint32_t evrc_max_rate) -{ - common.mvs_info.media_type = media_type; - common.mvs_info.rate = rate; - common.mvs_info.network_type = network_type; - common.mvs_info.dtx_mode = dtx_mode; - common.mvs_info.evrc_min_rate = evrc_min_rate; - common.mvs_info.evrc_max_rate = evrc_max_rate; -} -EXPORT_SYMBOL(voc_config_vocoder); - -static int32_t qdsp_mvm_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr = NULL, min_payload_size = 0; - struct common_data *c = NULL; - struct voice_data *v = NULL; - struct vss_evt_voice_activity *voice_act_update = NULL; - int i = 0; - struct vss_iversion_rsp_get_t *version_rsp = NULL; - - if ((data == NULL) || (priv == NULL)) { - pr_err("%s: data or priv is NULL\n", __func__); - return -EINVAL; - } - - c = priv; - - pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__, - data->payload_size, data->opcode); - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event received in Voice service\n", - __func__); - - if (common.mvs_info.ssr_cb) { - pr_debug("%s: Informing reset event to VoIP\n", - __func__); - common.mvs_info.ssr_cb(data->opcode, - common.mvs_info.private_data); - } - - apr_reset(c->apr_q6_mvm); - c->apr_q6_mvm = NULL; - - /* clean up memory handle */ - c->cal_mem_handle = 0; - c->rtac_mem_handle = 0; - cal_utils_clear_cal_block_q6maps(MAX_VOICE_CAL_TYPES, - common.cal_data); - rtac_clear_mapping(VOICE_RTAC_CAL); - - /* Sub-system restart is applicable to all sessions. */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - c->voice[i].mvm_handle = 0; - c->voice[i].shmem_info.mem_handle = 0; - } - - /* Free the ION memory and clear handles for Source Tracking */ - if (is_source_tracking_shared_memomry_allocated()) { - msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = - NULL; - } - /* clean up srvcc rec flag */ - c->srvcc_rec_flag = false; - voc_set_error_state(data->reset_proc); - return 0; - } - - pr_debug("%s: session_idx 0x%x\n", __func__, data->dest_port); - - v = voice_get_session_by_idx(data->dest_port); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size >= sizeof(ptr[0]) * 2) { - ptr = data->payload; - - pr_debug("%x %x\n", ptr[0], ptr[1]); - /* ping mvm service ACK */ - switch (ptr[0]) { - case VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION: - case VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION: - /* Passive session is used for CS call - * Full session is used for VoIP call. - */ - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - if (!ptr[1]) { - pr_debug("%s: MVM handle is %d\n", - __func__, data->src_port); - voice_set_mvm_handle(v, data->src_port); - } else - pr_err("got NACK for sending MVM create session\n"); - v->mvm_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->mvm_wait); - break; - case VSS_IMVM_CMD_START_VOICE: - case VSS_IMVM_CMD_ATTACH_VOCPROC: - case VSS_IMVM_CMD_STOP_VOICE: - case VSS_IMVM_CMD_DETACH_VOCPROC: - case VSS_ISTREAM_CMD_SET_TTY_MODE: - case APRV2_IBASIC_CMD_DESTROY_SESSION: - case VSS_IMVM_CMD_ATTACH_STREAM: - case VSS_IMVM_CMD_DETACH_STREAM: - case VSS_ICOMMON_CMD_SET_NETWORK: - case VSS_ICOMMON_CMD_SET_VOICE_TIMING: - case VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL: - case VSS_IMVM_CMD_SET_CAL_NETWORK: - case VSS_IMVM_CMD_SET_CAL_MEDIA_TYPE: - case VSS_IMEMORY_CMD_MAP_PHYSICAL: - case VSS_IMEMORY_CMD_UNMAP: - case VSS_IMVM_CMD_PAUSE_VOICE: - case VSS_IMVM_CMD_STANDBY_VOICE: - case VSS_IHDVOICE_CMD_ENABLE: - case VSS_IHDVOICE_CMD_DISABLE: - case VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS: - case VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS: - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - v->mvm_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->mvm_wait); - break; - case VSS_IVERSION_CMD_GET: - pr_debug("%s: Error retrieving CVD Version, error:%d\n", - __func__, ptr[1]); - - strlcpy(common.cvd_version, CVD_VERSION_0_0, - sizeof(common.cvd_version)); - pr_debug("%s: Fall back to default value, CVD Version = %s\n", - __func__, common.cvd_version); - - v->mvm_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->mvm_wait); - break; - default: - pr_debug("%s: not match cmd = 0x%x\n", - __func__, ptr[0]); - break; - } - } - } else if (data->opcode == VSS_IMEMORY_RSP_MAP) { - pr_debug("%s, Revd VSS_IMEMORY_RSP_MAP response\n", __func__); - - if (data->payload_size < sizeof(ptr[0])) { - pr_err("%s: payload has invalid size[%d]\n", __func__, - data->payload_size); - return -EINVAL; - } - - if (data->token == VOIP_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - v->shmem_info.mem_handle = ptr[0]; - pr_debug("%s: shared mem_handle: 0x[%x]\n", - __func__, v->shmem_info.mem_handle); - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_CAL_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - c->cal_mem_handle = ptr[0]; - - pr_debug("%s: cal mem handle 0x%x\n", - __func__, c->cal_mem_handle); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_VOICE_HOST_PCM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - common.voice_host_pcm_mem_handle = ptr[0]; - - pr_debug("%s: vhpcm mem handle 0x%x\n", - __func__, - common.voice_host_pcm_mem_handle); - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_RTAC_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - c->rtac_mem_handle = ptr[0]; - - pr_debug("%s: cal mem handle 0x%x\n", - __func__, c->rtac_mem_handle); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->payload_size && - data->token == VOC_SOURCE_TRACKING_MEM_MAP_TOKEN) { - ptr = data->payload; - if (ptr[0]) { - common.source_tracking_sh_mem.mem_handle = - ptr[0]; - - pr_debug("%s: Source Tracking shared mem handle 0x%x\n", - __func__, - common.source_tracking_sh_mem.mem_handle); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else { - pr_err("%s: Unknown mem map token %d\n", - __func__, data->token); - } - } else if (data->opcode == VSS_IVERSION_RSP_GET) { - pr_debug("%s: Received VSS_IVERSION_RSP_GET\n", __func__); - - if (data->payload_size) { - min_payload_size = min_t(u32, (int)data->payload_size, - CVD_VERSION_STRING_MAX_SIZE); - version_rsp = - (struct vss_iversion_rsp_get_t *)data->payload; - memcpy(common.cvd_version, version_rsp->version, - min_payload_size); - common.cvd_version[min_payload_size - 1] = '\0'; - pr_debug("%s: CVD Version = %s\n", - __func__, common.cvd_version); - - v->mvm_state = CMD_STATUS_SUCCESS; - wake_up(&v->mvm_wait); - } - } else if (data->opcode == VSS_ICOMMON_EVT_VOICE_ACTIVITY_UPDATE) { - if (data->payload_size == sizeof(struct vss_evt_voice_activity)) { - voice_act_update = - (struct vss_evt_voice_activity *) - data->payload; - pr_debug("activity = 0x%x\n", voice_act_update->activity); - - if ((voice_act_update->activity >= - VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK_STAT_BASE) && - (voice_act_update->activity <= - VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK_STAT_BASE + - MIC_BREAK_STAT_MAX)) - v->mic_break_status = voice_act_update->activity - - VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK_STAT_BASE; - /* Drop notifications other than Mic Break */ - else if ((voice_act_update->activity - != VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK) - && (voice_act_update->activity - != VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK)) - return 0; - - switch (voice_act_update->activity) { - case VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK: - v->mic_break_status = true; - break; - case VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK: - v->mic_break_status = false; - break; - } - - if (c->mic_break_enable) - schedule_work(&(v->voice_mic_break_work)); - } - } - - return 0; -} - -static int32_t qdsp_cvs_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr = NULL; - struct common_data *c = NULL; - struct voice_data *v = NULL; - int i = 0; - - if ((data == NULL) || (priv == NULL)) { - pr_err("%s: data or priv is NULL\n", __func__); - return -EINVAL; - } - - c = priv; - - pr_debug("%s: session_id 0x%x\n", __func__, data->dest_port); - pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__, - data->payload_size, data->opcode); - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event received in Voice service\n", - __func__); - - apr_reset(c->apr_q6_cvs); - c->apr_q6_cvs = NULL; - - /* Sub-system restart is applicable to all sessions. */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) - c->voice[i].cvs_handle = 0; - - cal_utils_clear_cal_block_q6maps(MAX_VOICE_CAL_TYPES, - common.cal_data); - - /* Free the ION memory and clear handles for Source Tracking */ - if (is_source_tracking_shared_memomry_allocated()) { - msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = - NULL; - } - voc_set_error_state(data->reset_proc); - return 0; - } - - v = voice_get_session_by_idx(data->dest_port); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size) { - ptr = data->payload; - - pr_debug("%x %x\n", ptr[0], ptr[1]); - if (ptr[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, ptr[0], ptr[1]); - } - /*response from CVS */ - switch (ptr[0]) { - case VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION: - case VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION: - if (!ptr[1]) { - pr_debug("%s: CVS handle is %d\n", - __func__, data->src_port); - voice_set_cvs_handle(v, data->src_port); - } else - pr_err("got NACK for sending CVS create session\n"); - v->cvs_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvs_wait); - break; - case VSS_IVOLUME_CMD_MUTE_V2: - case VSS_ISTREAM_CMD_SET_MEDIA_TYPE: - case VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE: - case VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE: - case VSS_ISTREAM_CMD_SET_ENC_DTX_MODE: - case VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE: - case APRV2_IBASIC_CMD_DESTROY_SESSION: - case VSS_ISTREAM_CMD_REGISTER_CALIBRATION_DATA_V2: - case VSS_ISTREAM_CMD_DEREGISTER_CALIBRATION_DATA: - case VSS_ISTREAM_CMD_REGISTER_STATIC_CALIBRATION_DATA: - case VSS_ISTREAM_CMD_DEREGISTER_STATIC_CALIBRATION_DATA: - case VSS_ICOMMON_CMD_MAP_MEMORY: - case VSS_ICOMMON_CMD_UNMAP_MEMORY: - case VSS_ICOMMON_CMD_SET_UI_PROPERTY: - case VSS_ICOMMON_CMD_SET_UI_PROPERTY_V2: - case VSS_IPLAYBACK_CMD_START: - case VSS_IPLAYBACK_CMD_STOP: - case VSS_IRECORD_CMD_START: - case VSS_IRECORD_CMD_STOP: - case VSS_ISTREAM_CMD_SET_PACKET_EXCHANGE_MODE: - case VSS_ISTREAM_CMD_SET_OOB_PACKET_EXCHANGE_CONFIG: - case VSS_ISTREAM_CMD_SET_RX_DTMF_DETECTION: - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - v->cvs_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvs_wait); - break; - case VSS_ICOMMON_CMD_SET_PARAM_V2: - case VSS_ICOMMON_CMD_SET_PARAM_V3: - pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM\n", - __func__); - rtac_make_voice_callback(RTAC_CVS, ptr, - data->payload_size); - break; - case VSS_ICOMMON_CMD_GET_PARAM_V2: - case VSS_ICOMMON_CMD_GET_PARAM_V3: - pr_debug("%s: VSS_ICOMMON_CMD_GET_PARAM_V2\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* VSS_ICOMMON_RSP_GET_PARAM */ - if (ptr[1] != 0) { - pr_err("%s: CVP get param error = %d, resuming\n", - __func__, ptr[1]); - rtac_make_voice_callback(RTAC_CVP, - data->payload, - data->payload_size); - } - break; - default: - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - break; - } - } - } else if (data->opcode == - VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_READY) { - int ret = 0; - u16 cvs_handle; - uint32_t *cvs_voc_pkt; - struct cvs_enc_buffer_consumed_cmd send_enc_buf_consumed_cmd; - void *apr_cvs; - - pr_debug("Encoder buffer is ready\n"); - - apr_cvs = common.apr_q6_cvs; - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - send_enc_buf_consumed_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - send_enc_buf_consumed_cmd.hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(send_enc_buf_consumed_cmd) - APR_HDR_SIZE); - - send_enc_buf_consumed_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - send_enc_buf_consumed_cmd.hdr.dest_port = cvs_handle; - send_enc_buf_consumed_cmd.hdr.token = 0; - send_enc_buf_consumed_cmd.hdr.opcode = - VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_CONSUMED; - - cvs_voc_pkt = v->shmem_info.sh_buf.buf[1].data; - if (cvs_voc_pkt != NULL && common.mvs_info.ul_cb != NULL) { - if (v->shmem_info.sh_buf.buf[1].size < - ((3 * sizeof(uint32_t)) + cvs_voc_pkt[2])) { - pr_err("%s: invalid voc pkt size\n", __func__); - return -EINVAL; - } - /* cvs_voc_pkt[0] contains tx timestamp */ - common.mvs_info.ul_cb((uint8_t *)&cvs_voc_pkt[3], - cvs_voc_pkt[2], - cvs_voc_pkt[0], - common.mvs_info.private_data); - } else - pr_err("%s: cvs_voc_pkt or ul_cb is NULL\n", __func__); - - ret = apr_send_pkt(apr_cvs, - (uint32_t *) &send_enc_buf_consumed_cmd); - if (ret < 0) { - pr_err("%s: Err send ENC_BUF_CONSUMED_NOTIFY %d\n", - __func__, ret); - goto fail; - } - } else if (data->opcode == VSS_ISTREAM_EVT_SEND_ENC_BUFFER) { - pr_debug("Recd VSS_ISTREAM_EVT_SEND_ENC_BUFFER\n"); - } else if (data->opcode == - VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_REQUEST) { - int ret = 0; - u16 cvs_handle; - uint32_t *cvs_voc_pkt; - struct cvs_dec_buffer_ready_cmd send_dec_buf; - void *apr_cvs; - - apr_cvs = common.apr_q6_cvs; - - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - return -EINVAL; - } - cvs_handle = voice_get_cvs_handle(v); - - send_dec_buf.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - - send_dec_buf.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(send_dec_buf) - APR_HDR_SIZE); - - send_dec_buf.hdr.src_port = - voice_get_idx_for_session(v->session_id); - send_dec_buf.hdr.dest_port = cvs_handle; - send_dec_buf.hdr.token = 0; - send_dec_buf.hdr.opcode = - VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_READY; - - cvs_voc_pkt = (uint32_t *)(v->shmem_info.sh_buf.buf[0].data); - if (cvs_voc_pkt != NULL && common.mvs_info.dl_cb != NULL) { - /* Set timestamp to 0 and advance the pointer */ - cvs_voc_pkt[0] = 0; - /* Set media_type and advance the pointer */ - cvs_voc_pkt[1] = common.mvs_info.media_type; - common.mvs_info.dl_cb( - (uint8_t *)&cvs_voc_pkt[2], - common.mvs_info.private_data); - ret = apr_send_pkt(apr_cvs, (uint32_t *) &send_dec_buf); - if (ret < 0) { - pr_err("%s: Err send DEC_BUF_READY_NOTIFI %d\n", - __func__, ret); - goto fail; - } - } else { - pr_debug("%s: voc_pkt or dl_cb is NULL\n", __func__); - goto fail; - } - } else if (data->opcode == VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER) { - pr_debug("Recd VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER\n"); - } else if (data->opcode == VSS_ISTREAM_EVT_SEND_DEC_BUFFER) { - pr_debug("Send dec buf resp\n"); - } else if (data->opcode == APR_RSP_ACCEPTED) { - ptr = data->payload; - if (ptr[0]) - pr_debug("%s: APR_RSP_ACCEPTED for 0x%x:\n", - __func__, ptr[0]); - } else if (data->opcode == VSS_ISTREAM_EVT_NOT_READY) { - pr_debug("Recd VSS_ISTREAM_EVT_NOT_READY\n"); - } else if (data->opcode == VSS_ISTREAM_EVT_READY) { - pr_debug("Recd VSS_ISTREAM_EVT_READY\n"); - } else if (data->opcode == VSS_ICOMMON_RSP_GET_PARAM || - data->opcode == VSS_ICOMMON_RSP_GET_PARAM_V3) { - pr_debug("%s: VSS_ICOMMON_RSP_GET_PARAM\n", __func__); - ptr = data->payload; - if (ptr[0] != 0) { - pr_err("%s: VSS_ICOMMON_RSP_GET_PARAM returned error = 0x%x\n", - __func__, ptr[0]); - } - rtac_make_voice_callback(RTAC_CVS, data->payload, - data->payload_size); - } else if (data->opcode == VSS_ISTREAM_EVT_RX_DTMF_DETECTED) { - struct vss_istream_evt_rx_dtmf_detected *dtmf_rx_detected; - uint32_t *voc_pkt = data->payload; - uint32_t pkt_len = data->payload_size; - - if ((voc_pkt != NULL) && - (pkt_len == - sizeof(struct vss_istream_evt_rx_dtmf_detected))) { - - dtmf_rx_detected = - (struct vss_istream_evt_rx_dtmf_detected *) voc_pkt; - pr_debug("RX_DTMF_DETECTED low_freq=%d high_freq=%d\n", - dtmf_rx_detected->low_freq, - dtmf_rx_detected->high_freq); - if (c->dtmf_info.dtmf_rx_ul_cb) - c->dtmf_info.dtmf_rx_ul_cb((uint8_t *)voc_pkt, - voc_get_session_name(v->session_id), - c->dtmf_info.private_data); - } else { - pr_err("Invalid packet\n"); - } - } else - pr_debug("Unknown opcode 0x%x\n", data->opcode); - -fail: - return 0; -} - -static int32_t qdsp_cvp_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr = NULL; - struct common_data *c = NULL; - struct voice_data *v = NULL; - int i = 0; - - if ((data == NULL) || (priv == NULL)) { - pr_err("%s: data or priv is NULL\n", __func__); - return -EINVAL; - } - - c = priv; - - if (data->opcode == RESET_EVENTS) { - pr_debug("%s: Reset event received in Voice service\n", - __func__); - - apr_reset(c->apr_q6_cvp); - c->apr_q6_cvp = NULL; - cal_utils_clear_cal_block_q6maps(MAX_VOICE_CAL_TYPES, - common.cal_data); - - /* Sub-system restart is applicable to all sessions. */ - for (i = 0; i < MAX_VOC_SESSIONS; i++) - c->voice[i].cvp_handle = 0; - - /* - * Free the ION memory and clear handles for - * Source Tracking - */ - if (is_source_tracking_shared_memomry_allocated()) { - msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = - NULL; - } - voc_set_error_state(data->reset_proc); - return 0; - } - - v = voice_get_session_by_idx(data->dest_port); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - if (data->payload_size >= (2 * sizeof(uint32_t))) { - ptr = data->payload; - - pr_debug("%x %x\n", ptr[0], ptr[1]); - if (ptr[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, ptr[0], ptr[1]); - } - switch (ptr[0]) { - case VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2: - case VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V3: - /*response from CVP */ - pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]); - if (!ptr[1]) { - voice_set_cvp_handle(v, data->src_port); - pr_debug("status: %d, cvphdl=%d\n", - ptr[1], data->src_port); - } else - pr_err("got NACK from CVP create session response\n"); - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_IVOCPROC_CMD_SET_DEVICE_V2: - case VSS_IVOCPROC_CMD_SET_DEVICE_V3: - case VSS_IVOLUME_CMD_SET_STEP: - case VSS_IVOCPROC_CMD_ENABLE: - case VSS_IVOCPROC_CMD_DISABLE: - case APRV2_IBASIC_CMD_DESTROY_SESSION: - case VSS_IVOCPROC_CMD_REGISTER_VOL_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_DEREGISTER_VOL_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_CALIBRATION_DATA_V2: - case VSS_IVOCPROC_CMD_DEREGISTER_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_DYNAMIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_DEREGISTER_DYNAMIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_STATIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_DEREGISTER_STATIC_CALIBRATION_DATA: - case VSS_IVOCPROC_CMD_REGISTER_DEVICE_CONFIG: - case VSS_IVOCPROC_CMD_DEREGISTER_DEVICE_CONFIG: - case VSS_ICOMMON_CMD_MAP_MEMORY: - case VSS_ICOMMON_CMD_UNMAP_MEMORY: - case VSS_IVOLUME_CMD_MUTE_V2: - case VSS_IVPCM_CMD_START_V2: - case VSS_IVPCM_CMD_STOP: - case VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS: - case VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT: - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_IVPCM_EVT_PUSH_BUFFER_V2: - break; - case VSS_ICOMMON_CMD_SET_PARAM_V2: - case VSS_ICOMMON_CMD_SET_PARAM_V3: - switch (data->token) { - case VOC_SET_MEDIA_FORMAT_PARAM_TOKEN: - case VOC_GENERIC_SET_PARAM_TOKEN: - pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM called by voice_send_cvp_media_format_cmd\n", - __func__); - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VOC_RTAC_SET_PARAM_TOKEN: - pr_debug("%s: VSS_ICOMMON_CMD_SET_PARAM called by rtac\n", - __func__); - rtac_make_voice_callback( - RTAC_CVP, ptr, - data->payload_size); - break; - default: - pr_debug("%s: invalid token for command VSS_ICOMMON_CMD_SET_PARAM: %d\n", - __func__, data->token); - break; - } - break; - case VSS_ICOMMON_CMD_GET_PARAM_V2: - case VSS_ICOMMON_CMD_GET_PARAM_V3: - pr_debug("%s: VSS_ICOMMON_CMD_GET_PARAM_V2\n", - __func__); - /* Should only come here if there is an APR */ - /* error or malformed APR packet. Otherwise */ - /* response will be returned as */ - /* VSS_ICOMMON_RSP_GET_PARAM */ - if (ptr[1] != 0) { - pr_err("%s: CVP get param error = %d, resuming\n", - __func__, ptr[1]); - rtac_make_voice_callback(RTAC_CVP, - data->payload, - data->payload_size); - } - break; - case VSS_ISOUNDFOCUS_CMD_SET_SECTORS: - if (!ptr[1]) - common.is_sound_focus_resp_success = - true; - else - common.is_sound_focus_resp_success = - false; - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_ISOUNDFOCUS_CMD_GET_SECTORS: - /* - * Should only come here if there is an error - * response received from ADSP. Otherwise - * response will be returned as - * VSS_ISOUNDFOCUS_RSP_GET_SECTORS - */ - pr_err("%s: VSS_ISOUNDFOCUS_CMD_GET_SECTORS failed\n", - __func__); - - common.is_sound_focus_resp_success = false; - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - case VSS_ISOURCETRACK_CMD_GET_ACTIVITY: - if (!ptr[1]) { - /* Read data from shared memory */ - memcpy(&common.sourceTrackingResponse, - common.source_tracking_sh_mem. - sh_mem_block.data, - sizeof(struct - vss_isourcetrack_activity_data_t)); - common.is_source_tracking_resp_success = - true; - } else { - common.is_source_tracking_resp_success = - false; - pr_err("%s: Error received for source tracking params\n", - __func__); - } - v->cvp_state = CMD_STATUS_SUCCESS; - v->async_err = ptr[1]; - wake_up(&v->cvp_wait); - break; - default: - pr_debug("%s: not match cmd = 0x%x\n", - __func__, ptr[0]); - break; - } - } - } else if (data->opcode == VSS_ICOMMON_RSP_GET_PARAM || - data->opcode == VSS_ICOMMON_RSP_GET_PARAM_V3) { - pr_debug("%s: VSS_ICOMMON_RSP_GET_PARAM\n", __func__); - ptr = data->payload; - if (ptr[0] != 0) { - pr_err("%s: VSS_ICOMMON_RSP_GET_PARAM returned error = 0x%x\n", - __func__, ptr[0]); - } - rtac_make_voice_callback(RTAC_CVP, data->payload, - data->payload_size); - } else if (data->opcode == VSS_IVPCM_EVT_NOTIFY_V2) { - if ((data->payload != NULL) && data->payload_size == - sizeof(struct vss_ivpcm_evt_notify_v2_t) && - common.hostpcm_info.hostpcm_evt_cb != NULL) { - common.hostpcm_info.hostpcm_evt_cb(data->payload, - voc_get_session_name(v->session_id), - common.hostpcm_info.private_data); - } - } else if (data->opcode == VSS_ISOUNDFOCUS_RSP_GET_SECTORS) { - if (data->payload && (data->payload_size == - sizeof(struct vss_isoundfocus_rsp_get_sectors_t))) { - common.is_sound_focus_resp_success = true; - memcpy(&common.soundFocusResponse, - (struct vss_isoundfocus_rsp_get_sectors_t *) - data->payload, - sizeof(struct - vss_isoundfocus_rsp_get_sectors_t)); - } else { - common.is_sound_focus_resp_success = false; - pr_debug("%s: Invalid payload received from CVD\n", - __func__); - } - v->cvp_state = CMD_STATUS_SUCCESS; - wake_up(&v->cvp_wait); - } - return 0; -} - -static int voice_free_oob_shared_mem(void) -{ - int rc = 0; - int cnt = 0; - int bufcnt = NUM_OF_BUFFERS; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - mutex_lock(&common.common_lock); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - rc = -EINVAL; - goto done; - } - - rc = msm_audio_ion_free(v->shmem_info.sh_buf.dma_buf); - v->shmem_info.sh_buf.dma_buf = NULL; - if (rc < 0) { - pr_err("%s: Error:%d freeing memory\n", __func__, rc); - - goto done; - } - - - while (cnt < bufcnt) { - v->shmem_info.sh_buf.buf[cnt].data = NULL; - v->shmem_info.sh_buf.buf[cnt].phys = 0; - cnt++; - } - - v->shmem_info.sh_buf.dma_buf = NULL; - -done: - mutex_unlock(&common.common_lock); - return rc; -} - -static int voice_alloc_oob_shared_mem(void) -{ - int cnt = 0; - int rc = 0; - size_t len; - void *mem_addr = NULL; - dma_addr_t phys; - int bufsz = BUFFER_BLOCK_SIZE; - int bufcnt = NUM_OF_BUFFERS; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - mutex_lock(&common.common_lock); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - rc = -EINVAL; - goto done; - } - - rc = msm_audio_ion_alloc(&(v->shmem_info.sh_buf.dma_buf), - bufsz * bufcnt, - &phys, &len, - &mem_addr); - if (rc < 0) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, rc); - - goto done; - } - - while (cnt < bufcnt) { - v->shmem_info.sh_buf.buf[cnt].data = mem_addr + (cnt * bufsz); - v->shmem_info.sh_buf.buf[cnt].phys = phys + (cnt * bufsz); - v->shmem_info.sh_buf.buf[cnt].size = bufsz; - cnt++; - } - - pr_debug("%s buf[0].data:[%pK], buf[0].phys:[%pK], &buf[0].phys:[%pK],\n", - __func__, - (void *)v->shmem_info.sh_buf.buf[0].data, - &v->shmem_info.sh_buf.buf[0].phys, - (void *)&v->shmem_info.sh_buf.buf[0].phys); - pr_debug("%s: buf[1].data:[%pK], buf[1].phys[%pK], &buf[1].phys[%pK]\n", - __func__, - (void *)v->shmem_info.sh_buf.buf[1].data, - &v->shmem_info.sh_buf.buf[1].phys, - (void *)&v->shmem_info.sh_buf.buf[1].phys); - - memset((void *)v->shmem_info.sh_buf.buf[0].data, 0, (bufsz * bufcnt)); - -done: - mutex_unlock(&common.common_lock); - return rc; -} - -static int voice_alloc_oob_mem_table(void) -{ - int rc = 0; - size_t len; - struct voice_data *v = voice_get_session( - common.voice[VOC_PATH_FULL].session_id); - - mutex_lock(&common.common_lock); - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - rc = -EINVAL; - goto done; - } - - rc = msm_audio_ion_alloc(&(v->shmem_info.memtbl.dma_buf), - sizeof(struct vss_imemory_table_t), - &v->shmem_info.memtbl.phys, - &len, - &(v->shmem_info.memtbl.data)); - if (rc < 0) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, rc); - - goto done; - } - - v->shmem_info.memtbl.size = sizeof(struct vss_imemory_table_t); - pr_debug("%s data[%pK]phys[%pK][%pK]\n", __func__, - (void *)v->shmem_info.memtbl.data, - &v->shmem_info.memtbl.phys, - (void *)&v->shmem_info.memtbl.phys); - -done: - mutex_unlock(&common.common_lock); - return rc; -} - -/** - * voc_send_cvp_start_vocpcm - - * command to start voice hpcm - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_start_vocpcm(uint32_t session_id, - struct vss_ivpcm_tap_point *vpcm_tp, - uint32_t no_of_tp) -{ - struct cvp_start_cmd cvp_start_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - struct voice_data *v = voice_get_session(session_id); - int i = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - - /* Fill the header */ - cvp_start_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - cvp_start_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(struct vss_ivpcm_tap_point) * no_of_tp) + - sizeof(cvp_start_cmd.vpcm_start_cmd.num_tap_points) + - sizeof(cvp_start_cmd.vpcm_start_cmd.mem_handle); - cvp_start_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - cvp_start_cmd.hdr.dest_port = cvp_handle; - cvp_start_cmd.hdr.token = 0; - cvp_start_cmd.hdr.opcode = VSS_IVPCM_CMD_START_V2; - - for (i = 0; i < no_of_tp; i++) { - cvp_start_cmd.vpcm_start_cmd.tap_points[i].tap_point = - vpcm_tp[i].tap_point; - cvp_start_cmd.vpcm_start_cmd.tap_points[i].direction = - vpcm_tp[i].direction; - cvp_start_cmd.vpcm_start_cmd.tap_points[i].sampling_rate = - vpcm_tp[i].sampling_rate; - cvp_start_cmd.vpcm_start_cmd.tap_points[i].duration = 0; - } - - cvp_start_cmd.vpcm_start_cmd.mem_handle = - common.voice_host_pcm_mem_handle; - cvp_start_cmd.vpcm_start_cmd.num_tap_points = no_of_tp; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_start_cmd); - if (ret < 0) { - pr_err("%s: Fail: sending vocpcm map memory,\n", __func__); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto done; - } - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_start_vocpcm); - -/** - * voc_send_cvp_stop_vocpcm - - * command to stop voice hpcm - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_stop_vocpcm(uint32_t session_id) -{ - struct cvp_command vpcm_stop_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - - /* fill in the header */ - vpcm_stop_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - vpcm_stop_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(vpcm_stop_cmd) - APR_HDR_SIZE); - vpcm_stop_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - vpcm_stop_cmd.hdr.dest_port = cvp_handle; - vpcm_stop_cmd.hdr.token = 0; - vpcm_stop_cmd.hdr.opcode = VSS_IVPCM_CMD_STOP; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *) &vpcm_stop_cmd); - if (ret < 0) { - pr_err("Fail: sending vocpcm stop,\n"); - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_stop_vocpcm); - -/** - * voc_send_cvp_map_vocpcm_memory - - * command to map memory for voice hpcm - * - * @session_id: voice session ID to send this command - * @tp_mem_table: tap point memory table of hpcm - * paddr: Physical address of hpcm memory mapped area. - * bufsize: Buffer size of memory mapped area - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_map_vocpcm_memory(uint32_t session_id, - struct mem_map_table *tp_mem_table, - phys_addr_t paddr, uint32_t bufsize) -{ - return voice_map_memory_physical_cmd(voice_get_session(session_id), - tp_mem_table, - (dma_addr_t) paddr, bufsize, - VOC_VOICE_HOST_PCM_MAP_TOKEN); -} -EXPORT_SYMBOL(voc_send_cvp_map_vocpcm_memory); - -/** - * voc_send_cvp_unmap_vocpcm_memory - - * command to unmap memory for voice hpcm - * - * @session_id: voice session ID to send this command - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_unmap_vocpcm_memory(uint32_t session_id) -{ - int ret = 0; - - ret = voice_send_mvm_unmap_memory_physical_cmd( - voice_get_session(session_id), - common.voice_host_pcm_mem_handle); - - if (ret == 0) - common.voice_host_pcm_mem_handle = 0; - - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_unmap_vocpcm_memory); - -/** - * voc_send_cvp_vocpcm_push_buf_evt - Send buf event command - * - * @session_id: voice session ID to send this command - * @push_buff_evt: pointer with buffer event details - * - * Returns 0 on success or error on failure - */ -int voc_send_cvp_vocpcm_push_buf_evt(uint32_t session_id, - struct vss_ivpcm_evt_push_buffer_v2_t *push_buff_evt) -{ - struct cvp_push_buf_cmd vpcm_push_buf_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - struct voice_data *v = voice_get_session(session_id); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - ret = -EINVAL; - goto done; - } - - memset(&vpcm_push_buf_cmd, 0, sizeof(vpcm_push_buf_cmd)); - cvp_handle = voice_get_cvp_handle(v); - - /* fill in the header */ - vpcm_push_buf_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - vpcm_push_buf_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(vpcm_push_buf_cmd) - APR_HDR_SIZE); - vpcm_push_buf_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - vpcm_push_buf_cmd.hdr.dest_port = cvp_handle; - vpcm_push_buf_cmd.hdr.token = 0; - vpcm_push_buf_cmd.hdr.opcode = VSS_IVPCM_EVT_PUSH_BUFFER_V2; - - vpcm_push_buf_cmd.vpcm_evt_push_buffer.tap_point = - push_buff_evt->tap_point; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.push_buf_mask = - push_buff_evt->push_buf_mask; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.out_buf_mem_address = - push_buff_evt->out_buf_mem_address; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.in_buf_mem_address = - push_buff_evt->in_buf_mem_address; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.out_buf_mem_size = - push_buff_evt->out_buf_mem_size; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.in_buf_mem_size = - push_buff_evt->in_buf_mem_size; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.sampling_rate = - push_buff_evt->sampling_rate; - vpcm_push_buf_cmd.vpcm_evt_push_buffer.num_in_channels = - push_buff_evt->num_in_channels; - - ret = apr_send_pkt(apr_cvp, (uint32_t *) &vpcm_push_buf_cmd); - if (ret < 0) { - pr_err("Fail: sending vocpcm map memory,\n"); - goto done; - } - -done: - return ret; -} -EXPORT_SYMBOL(voc_send_cvp_vocpcm_push_buf_evt); - -/** - * voc_register_hpcm_evt_cb - Updates hostpcm info. - * - * @hostpcm_cb: callback function for hostpcm event - * @private_data: private data for hostpcm - * - */ -void voc_register_hpcm_evt_cb(hostpcm_cb_fn hostpcm_cb, - void *private_data) -{ - common.hostpcm_info.hostpcm_evt_cb = hostpcm_cb; - common.hostpcm_info.private_data = private_data; -} -EXPORT_SYMBOL(voc_register_hpcm_evt_cb); - -/** - * voc_deregister_hpcm_evt_cb - resets hostpcm info. - * - */ -void voc_deregister_hpcm_evt_cb(void) -{ - common.hostpcm_info.hostpcm_evt_cb = NULL; - common.hostpcm_info.private_data = NULL; -} -EXPORT_SYMBOL(voc_deregister_hpcm_evt_cb); - -/** - * voc_get_cvd_version - retrieve CVD version. - * - * @cvd_version: pointer to be updated with CVD version info. - * - * Returns 0 on success or error on failure - */ -int voc_get_cvd_version(char *cvd_version) -{ - int ret = 0; - struct voice_data *v = voice_get_session(VOICE_SESSION_VSID); - - - if (v == NULL) { - pr_err("%s: invalid session_id 0x%x\n", - __func__, VOICE_SESSION_VSID); - - ret = -EINVAL; - goto done; - } - - if (is_cvd_version_queried()) { - pr_debug("%s: Returning the cached value %s\n", - __func__, common.cvd_version); - - goto done; - } - - /* Register callback to APR */ - ret = voice_apr_register(VOICE_SESSION_VSID); - if (ret < 0) { - pr_err("%s: apr register failed\n", __func__); - goto done; - } - - mutex_lock(&common.common_lock); - mutex_lock(&v->lock); - ret = voice_send_mvm_cvd_version_cmd(v); - if (ret < 0) { - pr_err("%s: voice_send_mvm_cvd_version_cmd failed\n", __func__); - goto unlock; - } - ret = 0; - -unlock: - mutex_unlock(&v->lock); - mutex_unlock(&common.common_lock); - -done: - if (cvd_version) - memcpy(cvd_version, common.cvd_version, - CVD_VERSION_STRING_MAX_SIZE); - - return ret; -} -EXPORT_SYMBOL(voc_get_cvd_version); - -static int voice_alloc_cal_mem_map_table(void) -{ - int ret = 0; - size_t len; - - ret = msm_audio_ion_alloc(&(common.cal_mem_map_table.dma_buf), - sizeof(struct vss_imemory_table_t), - &common.cal_mem_map_table.phys, - &len, - &(common.cal_mem_map_table.data)); - if ((ret < 0) && (ret != -EPROBE_DEFER)) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, ret); - goto done; - } - - common.cal_mem_map_table.size = sizeof(struct vss_imemory_table_t); - pr_debug("%s: data %pK phys %pK\n", __func__, - common.cal_mem_map_table.data, - &common.cal_mem_map_table.phys); - -done: - return ret; -} - -static int voice_alloc_rtac_mem_map_table(void) -{ - int ret = 0; - size_t len; - - ret = msm_audio_ion_alloc( - &(common.rtac_mem_map_table.dma_buf), - sizeof(struct vss_imemory_table_t), - &common.rtac_mem_map_table.phys, - &len, - &(common.rtac_mem_map_table.data)); - if (ret < 0) { - pr_err("%s: audio ION alloc failed, rc = %d\n", - __func__, ret); - goto done; - } - - common.rtac_mem_map_table.size = sizeof(struct vss_imemory_table_t); - pr_debug("%s: data %pK phys %pK\n", __func__, - common.rtac_mem_map_table.data, - &common.rtac_mem_map_table.phys); - -done: - return ret; -} - -static int voice_alloc_and_map_oob_mem(struct voice_data *v) -{ - int ret = 0; - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - return -EINVAL; - } - - if (!is_voip_memory_allocated()) { - ret = voc_alloc_voip_shared_memory(); - if (ret < 0) { - pr_err("%s: Failed to create voip oob memory %d\n", - __func__, ret); - - goto done; - } - } - - ret = voice_map_memory_physical_cmd(v, - &v->shmem_info.memtbl, - v->shmem_info.sh_buf.buf[0].phys, - v->shmem_info.sh_buf.buf[0].size * NUM_OF_BUFFERS, - VOIP_MEM_MAP_TOKEN); - if (ret) { - pr_err("%s: mvm_map_memory_phy failed %d\n", - __func__, ret); - - goto done; - } - -done: - return ret; -} - -uint32_t voice_get_topology(uint32_t topology_idx) -{ - uint32_t topology = VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT; - struct cal_block_data *cal_block = NULL; - - /* initialize as default topology */ - if (topology_idx == CVP_VOC_RX_TOPOLOGY_CAL) { - topology = VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT; - } else if (topology_idx == CVP_VOC_TX_TOPOLOGY_CAL) { - topology = VSS_IVOCPROC_TOPOLOGY_ID_NONE; - } else { - pr_err("%s: cal index %x is invalid!\n", - __func__, topology_idx); - - goto done; - } - - if (common.cal_data[topology_idx] == NULL) { - pr_err("%s: cal type is NULL for cal index %x\n", - __func__, topology_idx); - - goto done; - } - - mutex_lock(&common.cal_data[topology_idx]->lock); - cal_block = cal_utils_get_only_cal_block( - common.cal_data[topology_idx]); - if (cal_block == NULL) { - pr_debug("%s: cal_block not found for cal index %x\n", - __func__, topology_idx); - - goto unlock; - } - - topology = ((struct audio_cal_info_voc_top *) - cal_block->cal_info)->topology; -unlock: - mutex_unlock(&common.cal_data[topology_idx]->lock); -done: - pr_debug("%s: Using topology %d\n", __func__, topology); - - return topology; -} - -int voice_set_topology_specific_info(struct voice_data *v, - uint32_t topology_idx) -{ - struct cal_block_data *cal_block = NULL; - int ret = 0; - uint32_t topo_channels; - - if (common.cal_data[topology_idx] == NULL) { - pr_err("%s: cal type is NULL for cal index %x\n", - __func__, topology_idx); - ret = -EINVAL; - goto done; - } - - mutex_lock(&common.cal_data[topology_idx]->lock); - cal_block = cal_utils_get_only_cal_block( - common.cal_data[topology_idx]); - if (cal_block == NULL) { - pr_debug("%s: cal_block not found for cal index %x\n", - __func__, topology_idx); - ret = -EINVAL; - goto unlock; - } - - if (topology_idx == CVP_VOC_RX_TOPOLOGY_CAL) { - topo_channels = ((struct audio_cal_info_voc_top *) - cal_block->cal_info)->num_channels; - if (topo_channels > 0) { - v->dev_rx.no_of_channels = topo_channels; - pr_debug("%s: Topology Rx no of channels: %d", - __func__, v->dev_rx.no_of_channels); - memcpy(&v->dev_rx.channel_mapping, - &((struct audio_cal_info_voc_top *) - cal_block->cal_info)->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - } else { - pr_debug("%s: cal data is zero, default to Rx backend config\n", - __func__); - if (v->dev_rx.no_of_channels == NUM_CHANNELS_MONO) { - v->dev_rx.channel_mapping[0] = PCM_CHANNEL_FC; - } else if (v->dev_rx.no_of_channels == - NUM_CHANNELS_STEREO) { - v->dev_rx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_rx.channel_mapping[1] = PCM_CHANNEL_FR; - } else { - pr_warn("%s: Unsupported Rx num channels: %d\n", - __func__, v->dev_rx.no_of_channels); - } - } - } else if (topology_idx == CVP_VOC_TX_TOPOLOGY_CAL) { - topo_channels = ((struct audio_cal_info_voc_top *) - cal_block->cal_info)->num_channels; - if (topo_channels > 0) { - v->dev_tx.no_of_channels = topo_channels; - pr_debug("%s: Topology Tx no of channels: %d", - __func__, v->dev_tx.no_of_channels); - memcpy(&v->dev_tx.channel_mapping, - &((struct audio_cal_info_voc_top *) - cal_block->cal_info)->channel_mapping, - VSS_CHANNEL_MAPPING_SIZE); - } else { - pr_debug("%s: cal data is zero, default to Tx backend config\n", - __func__); - if (v->dev_tx.no_of_channels == NUM_CHANNELS_MONO) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FC; - } else if (v->dev_tx.no_of_channels == - NUM_CHANNELS_STEREO) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR; - } else if (v->dev_tx.no_of_channels == - NUM_CHANNELS_THREE) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR; - v->dev_tx.channel_mapping[2] = PCM_CHANNEL_FC; - } else if (v->dev_tx.no_of_channels == - NUM_CHANNELS_QUAD) { - v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL; - v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR; - v->dev_tx.channel_mapping[2] = PCM_CHANNEL_LS; - v->dev_tx.channel_mapping[3] = PCM_CHANNEL_RS; - } else { - pr_warn("%s: Unsupported Tx num channels: %d\n", - __func__, v->dev_tx.no_of_channels); - } - } - } else { - pr_err("%s: topology index %x is invalid\n", - __func__, topology_idx); - } -unlock: - mutex_unlock(&common.cal_data[topology_idx]->lock); -done: - return ret; -} - -static int get_cal_type_index(int32_t cal_type) -{ - int ret = -EINVAL; - - switch (cal_type) { - case CVP_VOC_RX_TOPOLOGY_CAL_TYPE: - ret = CVP_VOC_RX_TOPOLOGY_CAL; - break; - case CVP_VOC_TX_TOPOLOGY_CAL_TYPE: - ret = CVP_VOC_TX_TOPOLOGY_CAL; - break; - case CVP_VOCPROC_STATIC_CAL_TYPE: - ret = CVP_VOCPROC_CAL; - break; - case CVP_VOCPROC_DYNAMIC_CAL_TYPE: - ret = CVP_VOCVOL_CAL; - break; - case CVS_VOCSTRM_STATIC_CAL_TYPE: - ret = CVS_VOCSTRM_CAL; - break; - case CVP_VOCDEV_CFG_CAL_TYPE: - ret = CVP_VOCDEV_CFG_CAL; - break; - case CVP_VOCPROC_STATIC_COL_CAL_TYPE: - ret = CVP_VOCPROC_COL_CAL; - break; - case CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE: - ret = CVP_VOCVOL_COL_CAL; - break; - case CVS_VOCSTRM_STATIC_COL_CAL_TYPE: - ret = CVS_VOCSTRM_COL_CAL; - break; - case VOICE_RTAC_INFO_CAL_TYPE: - ret = VOICE_RTAC_INFO_CAL; - break; - case VOICE_RTAC_APR_CAL_TYPE: - ret = VOICE_RTAC_APR_CAL; - break; - default: - pr_err("%s: Invalid cal type %d!\n", __func__, cal_type); - } - return ret; -} - -static int voice_prepare_volume_boost(int32_t cal_type, - size_t data_size, void *data) -{ - return voc_deregister_vocproc_vol_table(); -} - -static int voice_enable_volume_boost(int32_t cal_type, - size_t data_size, void *data) -{ - return voc_register_vocproc_vol_table(); -} - -static int voice_alloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - int cal_version; - - pr_debug("%s\n", __func__); - - cal_version = cal_utils_get_cal_type_version(data); - common.is_per_vocoder_cal_enabled = - !!(cal_version & PER_VOCODER_CAL_BIT_MASK); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d!\n", - __func__, cal_index); - ret = -EINVAL; - goto done; - } - - ret = cal_utils_alloc_cal(data_size, data, - common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: Cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int voice_dealloc_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d!\n", - __func__, cal_index); - - ret = -EINVAL; - goto done; - } - - ret = cal_utils_dealloc_cal(data_size, data, - common.cal_data[cal_index]); - if (ret < 0) { - pr_err("%s: Cal_utils_dealloc_block failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - - ret = -EINVAL; - goto done; - } -done: - return ret; -} - -static int voice_set_cal(int32_t cal_type, - size_t data_size, void *data) -{ - int ret = 0; - int cal_index; - - pr_debug("%s\n", __func__); - - cal_index = get_cal_type_index(cal_type); - if (cal_index < 0) { - pr_err("%s: Could not get cal index %d!\n", - __func__, cal_index); - - ret = -EINVAL; - goto done; - } - - ret = cal_utils_set_cal(data_size, data, - common.cal_data[cal_index], 0, NULL); - if (ret < 0) { - pr_err("%s: Cal_utils_set_cal failed, ret = %d, cal type = %d!\n", - __func__, ret, cal_type); - - ret = -EINVAL; - goto done; - } - /* Pre-load if it is voice Rx or Tx topology */ - if ((cal_index == CVP_VOC_RX_TOPOLOGY_CAL) || - (cal_index == CVP_VOC_TX_TOPOLOGY_CAL)) { - voice_load_topo_modules(cal_index); - } -done: - return ret; -} - -static void voice_delete_cal_data(void) -{ - pr_debug("%s\n", __func__); - - cal_utils_destroy_cal_types(MAX_VOICE_CAL_TYPES, common.cal_data); -} - -static int voice_init_cal_data(void) -{ - int ret = 0; - struct cal_type_info cal_type_info[] = { - {{CVP_VOC_RX_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVP_VOC_TX_TOPOLOGY_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_STATIC_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, NULL, - voice_set_cal, NULL, NULL} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_DYNAMIC_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, - voice_prepare_volume_boost, - voice_set_cal, NULL, - voice_enable_volume_boost} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVP_VOCDEV_CFG_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, NULL, - voice_set_cal, NULL, NULL} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_STATIC_COL_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{CVS_VOCSTRM_STATIC_CAL_TYPE, - {voice_alloc_cal, voice_dealloc_cal, NULL, - voice_set_cal, NULL, NULL} }, - {NULL, voice_unmap_cal_memory, - cal_utils_match_buf_num} }, - - {{CVS_VOCSTRM_STATIC_COL_CAL_TYPE, - {NULL, NULL, NULL, voice_set_cal, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{VOICE_RTAC_INFO_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - - {{VOICE_RTAC_APR_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - }; - - ret = cal_utils_create_cal_types(MAX_VOICE_CAL_TYPES, common.cal_data, - cal_type_info); - if (ret < 0) { - pr_err("%s: Could not create cal type!\n", - __func__); - - ret = -EINVAL; - goto err; - } - - return ret; -err: - voice_delete_cal_data(); - memset(&common, 0, sizeof(struct common_data)); - return ret; -} - -static int voice_send_set_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param soundFocusData) -{ - struct cvp_set_sound_focus_param_cmd_t cvp_set_sound_focus_param_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - int i; - - pr_debug("%s: Enter\n", __func__); - - if (v == NULL) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - - ret = -EINVAL; - goto done; - } - cvp_handle = voice_get_cvp_handle(v); - - /* send Sound Focus Params to cvp */ - cvp_set_sound_focus_param_cmd.hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_set_sound_focus_param_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_set_sound_focus_param_cmd) - APR_HDR_SIZE); - cvp_set_sound_focus_param_cmd.hdr.src_port = - voice_get_idx_for_session(v->session_id); - cvp_set_sound_focus_param_cmd.hdr.dest_port = cvp_handle; - cvp_set_sound_focus_param_cmd.hdr.token = 0; - cvp_set_sound_focus_param_cmd.hdr.opcode = - VSS_ISOUNDFOCUS_CMD_SET_SECTORS; - - memset(&(cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param), 0xFF, - sizeof(struct vss_isoundfocus_cmd_set_sectors_t)); - for (i = 0; i < MAX_SECTORS; i++) { - cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param. - start_angles[i] = soundFocusData.start_angle[i]; - cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param. - enables[i] = soundFocusData.enable[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData.start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData.enable[i]); - } - cvp_set_sound_focus_param_cmd.cvp_set_sound_focus_param.gain_step = - soundFocusData.gain_step; - pr_debug("%s: gain_step = %d\n", __func__, soundFocusData.gain_step); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_set_sound_focus_param_cmd); - if (ret < 0) { - pr_err("%s: Error in sending APR command\n", __func__); - - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - if (common.is_sound_focus_resp_success) { - ret = 0; - } else { - pr_err("%s: Error in setting sound focus params\n", __func__); - - ret = -EINVAL; - } - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -/** - * voc_set_sound_focus - sends sound focus data. - * - * @soundFocusData: sound focus data. - * - * Returns 0 on success or error on failure - */ -int voc_set_sound_focus(struct sound_focus_param soundFocusData) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - - pr_debug("%s: Enter\n", __func__); - - mutex_lock(&common.common_lock); - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state) && - (v->lch_mode != VOICE_LCH_START) && - !v->disable_topology) - ret = voice_send_set_sound_focus_cmd(v, - soundFocusData); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session\n", __func__); - - ret = -EINVAL; - break; - } - } - mutex_unlock(&common.common_lock); - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(voc_set_sound_focus); - -static int voice_send_get_sound_focus_cmd(struct voice_data *v, - struct sound_focus_param *soundFocusData) -{ - struct apr_hdr cvp_get_sound_focus_param_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - int i; - - pr_debug("%s: Enter\n", __func__); - - if (!v) { - pr_err("%s: v is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - - ret = -EINVAL; - goto done; - } - - cvp_handle = voice_get_cvp_handle(v); - - /* send APR command to retrieve Sound Focus Params */ - cvp_get_sound_focus_param_cmd.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - cvp_get_sound_focus_param_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(cvp_get_sound_focus_param_cmd) - APR_HDR_SIZE); - cvp_get_sound_focus_param_cmd.src_port = - voice_get_idx_for_session(v->session_id); - cvp_get_sound_focus_param_cmd.dest_port = cvp_handle; - cvp_get_sound_focus_param_cmd.token = 0; - cvp_get_sound_focus_param_cmd.opcode = VSS_ISOUNDFOCUS_CMD_GET_SECTORS; - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (uint32_t *)&cvp_get_sound_focus_param_cmd); - if (ret < 0) { - pr_err("%s: Error in sending APR command\n", __func__); - - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - if (common.is_sound_focus_resp_success) { - for (i = 0; i < MAX_SECTORS; i++) { - soundFocusData->start_angle[i] = - common.soundFocusResponse.start_angles[i]; - soundFocusData->enable[i] = - common.soundFocusResponse.enables[i]; - pr_debug("%s: start_angle[%d] = %d\n", - __func__, i, soundFocusData->start_angle[i]); - pr_debug("%s: enable[%d] = %d\n", - __func__, i, soundFocusData->enable[i]); - } - soundFocusData->gain_step = common.soundFocusResponse.gain_step; - pr_debug("%s: gain_step = %d\n", __func__, - soundFocusData->gain_step); - - common.is_sound_focus_resp_success = false; - ret = 0; - } else { - pr_err("%s: Invalid payload received from CVD\n", __func__); - - ret = -EINVAL; - } -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -/** - * voc_get_sound_focus - retrieves sound focus data. - * - * @soundFocusData: pointer to be updated with sound focus data. - * - * Returns 0 on success or error on failure - */ -int voc_get_sound_focus(struct sound_focus_param *soundFocusData) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - - pr_debug("%s: Enter\n", __func__); - - mutex_lock(&common.common_lock); - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state) && - (v->lch_mode != VOICE_LCH_START) && - !v->disable_topology) - ret = voice_send_get_sound_focus_cmd(v, - soundFocusData); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session\n", __func__); - - ret = -EINVAL; - break; - } - } - mutex_unlock(&common.common_lock); - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(voc_get_sound_focus); - -static int is_source_tracking_shared_memomry_allocated(void) -{ - bool ret; - - pr_debug("%s: Enter\n", __func__); - - if (common.source_tracking_sh_mem.sh_mem_block.dma_buf != NULL) - ret = true; - else - ret = false; - - pr_debug("%s: Exit\n", __func__); - - return ret; -} - -static int voice_alloc_source_tracking_shared_memory(void) -{ - int ret = 0; - - pr_debug("%s: Enter\n", __func__); - - ret = msm_audio_ion_alloc( - &(common.source_tracking_sh_mem.sh_mem_block.dma_buf), - BUFFER_BLOCK_SIZE, - &(common.source_tracking_sh_mem.sh_mem_block.phys), - (size_t *)&(common.source_tracking_sh_mem.sh_mem_block.size), - &(common.source_tracking_sh_mem.sh_mem_block.data)); - if (ret < 0) { - pr_err("%s: audio ION alloc failed for sh_mem block, ret = %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - memset((void *)(common.source_tracking_sh_mem.sh_mem_block.data), 0, - common.source_tracking_sh_mem.sh_mem_block.size); - - pr_debug("%s: sh_mem_block: phys:[%pK], data:[0x%pK], size:[%zd]\n", - __func__, - &(common.source_tracking_sh_mem.sh_mem_block.phys), - (void *)(common.source_tracking_sh_mem.sh_mem_block.data), - (size_t)(common.source_tracking_sh_mem.sh_mem_block.size)); - - ret = msm_audio_ion_alloc( - &(common.source_tracking_sh_mem.sh_mem_table.dma_buf), - sizeof(struct vss_imemory_table_t), - &(common.source_tracking_sh_mem.sh_mem_table.phys), - (size_t *)&(common.source_tracking_sh_mem.sh_mem_table.size), - &(common.source_tracking_sh_mem.sh_mem_table.data)); - if (ret < 0) { - pr_err("%s: audio ION alloc failed for sh_mem table, ret = %d\n", - __func__, ret); - - ret = msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - common.source_tracking_sh_mem.sh_mem_block.dma_buf = NULL; - if (ret < 0) - pr_err("%s: Error:%d freeing memory\n", __func__, ret); - - ret = -EINVAL; - goto done; - } - memset((void *)(common.source_tracking_sh_mem.sh_mem_table.data), 0, - common.source_tracking_sh_mem.sh_mem_table.size); - - pr_debug("%s sh_mem_table: phys:[%pK], data:[0x%pK], size:[%zd],\n", - __func__, - &(common.source_tracking_sh_mem.sh_mem_table.phys), - (void *)(common.source_tracking_sh_mem.sh_mem_table.data), - (size_t)(common.source_tracking_sh_mem.sh_mem_table.size)); - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -static int voice_alloc_and_map_source_tracking_shared_memory( - struct voice_data *v) -{ - int ret = 0; - - pr_debug("%s: Enter\n", __func__); - - ret = voice_alloc_source_tracking_shared_memory(); - if (ret) { - pr_err("%s: Failed to allocate shared memory %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - - ret = voice_map_memory_physical_cmd(v, - &(common.source_tracking_sh_mem.sh_mem_table), - common.source_tracking_sh_mem.sh_mem_block.phys, - common.source_tracking_sh_mem.sh_mem_block.size, - VOC_SOURCE_TRACKING_MEM_MAP_TOKEN); - if (ret) { - pr_err("%s: memory mapping failed %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -static int voice_unmap_and_free_source_tracking_shared_memory( - struct voice_data *v) -{ - int ret = 0; - - pr_debug("%s: Enter\n", __func__); - - if (common.source_tracking_sh_mem.mem_handle != 0) { - ret = voice_send_mvm_unmap_memory_physical_cmd(v, - common.source_tracking_sh_mem.mem_handle); - if (ret < 0) { - pr_err("%s: Memory_unmap failed err %d\n", - __func__, ret); - - ret = -EINVAL; - goto done; - } - } - - if (common.source_tracking_sh_mem.sh_mem_block.dma_buf == NULL) - goto done; - - ret = msm_audio_ion_free( - common.source_tracking_sh_mem.sh_mem_block.dma_buf); - if (ret < 0) { - pr_err("%s: Error:%d freeing memory\n", __func__, ret); - - ret = -EINVAL; - goto done; - } - -done: - common.source_tracking_sh_mem.mem_handle = 0; - common.source_tracking_sh_mem.sh_mem_block.dma_buf = NULL; - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -static int voice_send_get_source_tracking_cmd(struct voice_data *v, - struct source_tracking_param *sourceTrackingData) -{ - struct cvp_get_source_tracking_param_cmd_t st_cmd; - int ret = 0; - void *apr_cvp; - u16 cvp_handle; - int i; - - pr_debug("%s: Enter\n", __func__); - - if (!v) { - pr_err("%s: v is NULL\n", __func__); - return -EINVAL; - } - apr_cvp = common.apr_q6_cvp; - - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL.\n", __func__); - return -EINVAL; - } - - cvp_handle = voice_get_cvp_handle(v); - - if (!is_source_tracking_shared_memomry_allocated()) { - ret = voice_alloc_and_map_source_tracking_shared_memory(v); - if (ret) { - pr_err("%s: Fail in allocating/mapping shared memory\n", - __func__); - - ret = -EINVAL; - goto done; - } - } - st_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - st_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(st_cmd) - APR_HDR_SIZE); - st_cmd.hdr.src_port = voice_get_idx_for_session(v->session_id); - st_cmd.hdr.dest_port = cvp_handle; - st_cmd.hdr.token = 0; - st_cmd.hdr.opcode = VSS_ISOURCETRACK_CMD_GET_ACTIVITY; - - st_cmd.cvp_get_source_tracking_param.mem_handle = - common.source_tracking_sh_mem.mem_handle; - st_cmd.cvp_get_source_tracking_param.mem_address_lsw = - lower_32_bits(common.source_tracking_sh_mem.sh_mem_block.phys); - st_cmd.cvp_get_source_tracking_param.mem_address_msw = - msm_audio_populate_upper_32_bits(common.source_tracking_sh_mem. - sh_mem_block.phys); - st_cmd.cvp_get_source_tracking_param.mem_size = - (uint32_t)common.source_tracking_sh_mem.sh_mem_block.size; - pr_debug("%s: mem_handle=0x%x, mem_address_lsw=0x%x, msw=0x%x, mem_size=%d\n", - __func__, - st_cmd.cvp_get_source_tracking_param.mem_handle, - st_cmd.cvp_get_source_tracking_param.mem_address_lsw, - st_cmd.cvp_get_source_tracking_param.mem_address_msw, - (uint32_t)st_cmd.cvp_get_source_tracking_param.mem_size); - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, - (uint32_t *) &st_cmd); - if (ret < 0) { - pr_err("%s: Error in sending APR command\n", __func__); - - ret = -EINVAL; - goto done; - } - ret = wait_event_timeout(v->cvp_wait, - (v->cvp_state == CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - - ret = -EINVAL; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - v->async_err)); - ret = adsp_err_get_lnx_err_code( - v->async_err); - goto done; - } - - if (common.is_source_tracking_resp_success) { - for (i = 0; i < MAX_SECTORS; i++) { - sourceTrackingData->vad[i] = - common.sourceTrackingResponse.voice_active[i]; - pr_debug("%s: vad[%d] = %d\n", - __func__, i, sourceTrackingData->vad[i]); - } - sourceTrackingData->doa_speech = - common.sourceTrackingResponse.talker_doa; - pr_debug("%s: doa_speech = %d\n", - __func__, sourceTrackingData->doa_speech); - - for (i = 0; i < MAX_NOISE_SOURCE_INDICATORS; i++) { - sourceTrackingData->doa_noise[i] = - common.sourceTrackingResponse.interferer_doa[i]; - pr_debug("%s: doa_noise[%d] = %d\n", - __func__, i, sourceTrackingData->doa_noise[i]); - } - for (i = 0; i < MAX_POLAR_ACTIVITY_INDICATORS; i++) { - sourceTrackingData->polar_activity[i] = - common.sourceTrackingResponse.sound_strength[i]; - pr_debug("%s: polar_activity[%d] = %d\n", - __func__, i, sourceTrackingData->polar_activity[i]); - } - common.is_source_tracking_resp_success = false; - ret = 0; - } else { - pr_err("%s: Error response received from CVD\n", __func__); - - ret = -EINVAL; - } -done: - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} - -/** - * voc_get_source_tracking - retrieves source track data. - * - * @sourceTrackingData: pointer to be updated with source track data. - * - * Returns 0 on success or error on failure - */ -int voc_get_source_tracking(struct source_tracking_param *sourceTrackingData) -{ - struct voice_data *v = NULL; - int ret = -EINVAL; - struct voice_session_itr itr; - - pr_debug("%s: Enter\n", __func__); - - mutex_lock(&common.common_lock); - - voice_itr_init(&itr, ALL_SESSION_VSID); - while (voice_itr_get_next_session(&itr, &v)) { - if (v != NULL) { - mutex_lock(&v->lock); - if (is_voc_state_active(v->voc_state) && - (v->lch_mode != VOICE_LCH_START) && - !v->disable_topology) - ret = voice_send_get_source_tracking_cmd(v, - sourceTrackingData); - mutex_unlock(&v->lock); - } else { - pr_err("%s: invalid session\n", __func__); - - break; - } - } - - mutex_unlock(&common.common_lock); - pr_debug("%s: Exit, ret=%d\n", __func__, ret); - - return ret; -} -EXPORT_SYMBOL(voc_get_source_tracking); - -static int voice_set_cvp_param(struct voice_data *v, - struct vss_icommon_mem_mapping_hdr *mem_hdr, - u32 *param_data, u32 param_size) -{ - struct vss_icommon_cmd_set_param *set_param = NULL; - uint32_t pkt_size = sizeof(struct vss_icommon_cmd_set_param); - void *apr_cvp; - int ret = 0; - - apr_cvp = common.apr_q6_cvp; - if (!apr_cvp) { - pr_err("%s: apr_cvp is NULL\n", __func__); - return -EINVAL; - } - - if (param_data != NULL) - pkt_size += param_size; - set_param = kzalloc(pkt_size, GFP_KERNEL); - if (!set_param) - return -ENOMEM; - - set_param->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_param->apr_hdr.pkt_size = - APR_PKT_SIZE(APR_HDR_SIZE, pkt_size - APR_HDR_SIZE); - set_param->apr_hdr.src_svc = 0; - set_param->apr_hdr.src_domain = APR_DOMAIN_APPS; - set_param->apr_hdr.src_port = voice_get_idx_for_session(v->session_id); - set_param->apr_hdr.dest_svc = 0; - set_param->apr_hdr.dest_domain = APR_DOMAIN_ADSP; - set_param->apr_hdr.dest_port = voice_get_cvp_handle(v); - set_param->apr_hdr.token = VOC_SET_MEDIA_FORMAT_PARAM_TOKEN; - set_param->apr_hdr.opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_SET_PARAM_V3 : - VSS_ICOMMON_CMD_SET_PARAM_V2; - - set_param->payload_size = param_size; - - if (mem_hdr != NULL) { - set_param->mem_hdr = *mem_hdr; - } else if (param_data != NULL) { - memcpy(set_param->param_data, param_data, param_size); - } else { - pr_err("%s: Both memory header and param data are NULL\n", - __func__); - ret = -EINVAL; - goto done; - } - - v->cvp_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvp, (u32 *) set_param); - if (ret < 0) { - pr_err("%s: Failed to send apr packet, error %d\n", __func__, - ret); - goto done; - } - - ret = wait_event_timeout(v->cvp_wait, - v->cvp_state == CMD_STATUS_SUCCESS, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(v->async_err)); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; - -done: - kfree(set_param); - return ret; -} - -static int voice_pack_and_set_cvp_param(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - u8 *packed_data = NULL; - u32 total_size = 0; - int ret = 0; - - total_size = sizeof(union param_hdrs) + param_hdr.param_size; - packed_data = kzalloc(total_size, GFP_KERNEL); - if (!packed_data) - return -ENOMEM; - - ret = q6common_pack_pp_params(packed_data, ¶m_hdr, param_data, - &total_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d", __func__, ret); - goto done; - } - - ret = voice_set_cvp_param(v, NULL, (u32 *) packed_data, total_size); - -done: - kfree(packed_data); - return ret; -} - -/* - * Out of band is not supported and there are currently no pre-packed cases, - * so pack and set in the same function. When needed, split up. - */ -static int voice_pack_and_set_cvs_ui_property(struct voice_data *v, - struct param_hdr_v3 param_hdr, - u8 *param_data) -{ - struct vss_icommon_cmd_set_ui_property *set_ui_property = NULL; - u32 total_size = 0; - u32 pkt_size = 0; - u32 param_size = 0; - bool iid_supported = q6common_is_instance_id_supported(); - void *apr_cvs; - int ret = 0; - - apr_cvs = common.apr_q6_cvs; - if (!apr_cvs) { - pr_err("%s: apr_cvs is NULL\n", __func__); - return -EINVAL; - } - - pkt_size = sizeof(struct vss_icommon_cmd_set_ui_property); - param_size = sizeof(union param_hdrs) + param_hdr.param_size; - total_size = pkt_size + param_size; - set_ui_property = kzalloc(total_size, GFP_KERNEL); - if (!set_ui_property) - return -ENOMEM; - - ret = q6common_pack_pp_params(set_ui_property->param_data, ¶m_hdr, - param_data, ¶m_size); - if (ret) { - pr_err("%s: Failed to pack params, error %d", __func__, ret); - goto done; - } - - /* - * Pack the APR header after packing the data so we have the actual - * total size of the payload - */ - total_size = pkt_size + param_size; - set_ui_property->apr_hdr.hdr_field = - APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - set_ui_property->apr_hdr.pkt_size = total_size; - set_ui_property->apr_hdr.src_svc = 0; - set_ui_property->apr_hdr.src_domain = APR_DOMAIN_APPS; - set_ui_property->apr_hdr.src_port = - voice_get_idx_for_session(v->session_id); - set_ui_property->apr_hdr.dest_svc = 0; - set_ui_property->apr_hdr.dest_domain = APR_DOMAIN_ADSP; - set_ui_property->apr_hdr.dest_port = voice_get_cvs_handle(v); - set_ui_property->apr_hdr.token = 0; - - set_ui_property->apr_hdr.opcode = - iid_supported ? VSS_ICOMMON_CMD_SET_UI_PROPERTY_V2 : - VSS_ICOMMON_CMD_SET_UI_PROPERTY; - - v->cvs_state = CMD_STATUS_FAIL; - v->async_err = 0; - ret = apr_send_pkt(apr_cvs, (u32 *) set_ui_property); - if (ret < 0) { - pr_err("%s: Failed to send apr packet, error %d\n", __func__, - ret); - goto done; - } - - ret = wait_event_timeout(v->cvs_wait, - v->cvs_state == CMD_STATUS_SUCCESS, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIMEDOUT; - goto done; - } - - if (v->async_err > 0) { - pr_err("%s: DSP returned error[%s]\n", __func__, - adsp_err_get_err_str(v->async_err)); - ret = adsp_err_get_lnx_err_code(v->async_err); - goto done; - } - ret = 0; -done: - kfree(set_ui_property); - return ret; -} - -static void voc_release_uevent_data(struct kobject *kobj) -{ - struct audio_uevent_data *data = container_of(kobj, - struct audio_uevent_data, - kobj); - kfree(data); -} - -/** - * is_voc_initialized: - * - * Returns voice module init status - * - */ -int is_voc_initialized(void) -{ - return module_initialized; -} -EXPORT_SYMBOL(is_voc_initialized); - -int __init voice_init(void) -{ - int rc = 0, i = 0; - - memset(&common, 0, sizeof(struct common_data)); - - /* set default value */ - common.default_mute_val = 0; /* default is un-mute */ - common.default_sample_val = 8000; - common.default_vol_step_val = 0; - common.default_vol_ramp_duration_ms = DEFAULT_VOLUME_RAMP_DURATION; - common.default_mute_ramp_duration_ms = DEFAULT_MUTE_RAMP_DURATION; - common.cvp_version = 0; - common.is_avcs_version_queried = false; - /* Initialize EC Ref media format info */ - common.ec_ref_ext = false; - common.ec_media_fmt_info.port_id = AFE_PORT_INVALID; - common.ec_media_fmt_info.num_channels = 0; - common.ec_media_fmt_info.bits_per_sample = 16; - common.ec_media_fmt_info.sample_rate = 8000; - memset(&common.ec_media_fmt_info.channel_mapping, 0, - VSS_CHANNEL_MAPPING_SIZE); - - /* Initialize AFE Sidetone Enable */ - common.sidetone_enable = false; - - /* Initialize MVS info. */ - common.mvs_info.network_type = VSS_NETWORK_ID_DEFAULT; - - /* Initialize is low memory flag */ - common.is_destroy_cvd = false; - - /* Initialize CVD version */ - strlcpy(common.cvd_version, CVD_VERSION_DEFAULT, - sizeof(common.cvd_version)); - /* Initialize Per-Vocoder Calibration flag */ - common.is_per_vocoder_cal_enabled = false; - - /* - * Initialize in call record channel config - * to mono - */ - common.rec_channel_count = NUM_CHANNELS_MONO; - - mutex_init(&common.common_lock); - - common.uevent_data = kzalloc(sizeof(*(common.uevent_data)), GFP_KERNEL); - if (!common.uevent_data) - return -ENOMEM; - - /* - * Set release function to cleanup memory related to kobject - * before initializing the kobject. - */ - common.uevent_data->ktype.release = voc_release_uevent_data; - q6core_init_uevent_data(common.uevent_data, "q6voice_uevent"); - common.mic_break_enable = false; - - /* Initialize session id with vsid */ - init_session_id(); - - for (i = 0; i < MAX_VOC_SESSIONS; i++) { - - /* initialize dev_rx and dev_tx */ - common.voice[i].dev_rx.dev_mute = common.default_mute_val; - common.voice[i].dev_tx.dev_mute = common.default_mute_val; - common.voice[i].dev_rx.volume_step_value = - common.default_vol_step_val; - common.voice[i].dev_rx.volume_ramp_duration_ms = - common.default_vol_ramp_duration_ms; - common.voice[i].dev_rx.dev_mute_ramp_duration_ms = - common.default_mute_ramp_duration_ms; - common.voice[i].dev_tx.dev_mute_ramp_duration_ms = - common.default_mute_ramp_duration_ms; - common.voice[i].stream_rx.stream_mute = common.default_mute_val; - common.voice[i].stream_tx.stream_mute = common.default_mute_val; - - common.voice[i].dev_tx.port_id = 0x100B; - common.voice[i].dev_rx.port_id = 0x100A; - common.voice[i].dev_tx.dev_id = 0; - common.voice[i].dev_rx.dev_id = 0; - common.voice[i].dev_tx.no_of_channels = 0; - common.voice[i].dev_rx.no_of_channels = 0; - common.voice[i].dev_tx.sample_rate = 8000; - common.voice[i].dev_rx.sample_rate = 8000; - common.voice[i].dev_tx.bits_per_sample = 16; - common.voice[i].dev_rx.bits_per_sample = 16; - memset(&common.voice[i].dev_tx.channel_mapping, 0, - VSS_CHANNEL_MAPPING_SIZE); - memset(&common.voice[i].dev_rx.channel_mapping, 0, - VSS_CHANNEL_MAPPING_SIZE); - common.voice[i].sidetone_gain = 0x512; - common.voice[i].dtmf_rx_detect_en = 0; - common.voice[i].lch_mode = 0; - common.voice[i].disable_topology = false; - - common.voice[i].voc_state = VOC_INIT; - - INIT_WORK(&common.voice[i].voice_mic_break_work, - voice_mic_break_work_fn); - - init_waitqueue_head(&common.voice[i].mvm_wait); - init_waitqueue_head(&common.voice[i].cvs_wait); - init_waitqueue_head(&common.voice[i].cvp_wait); - - mutex_init(&common.voice[i].lock); - } - - if (voice_init_cal_data()) - pr_err("%s: Could not init cal data!\n", __func__); - - if (rc == 0) - module_initialized = true; - - pr_debug("%s: rc=%d\n", __func__, rc); - return rc; -} - - -void voice_exit(void) -{ - q6core_destroy_uevent_data(common.uevent_data); - voice_delete_cal_data(); - free_cal_map_table(); -} diff --git a/techpack/audio/dsp/rtac.c b/techpack/audio/dsp/rtac.c deleted file mode 100644 index 5c48cddd4345..000000000000 --- a/techpack/audio/dsp/rtac.c +++ /dev/null @@ -1,2068 +0,0 @@ -/* Copyright (c) 2012-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - - -/* Max size of payload (buf size - apr header) */ -#define MAX_PAYLOAD_SIZE 4076 -#define RTAC_MAX_ACTIVE_VOICE_COMBOS 2 -#define RTAC_MAX_ACTIVE_POPP 8 -#define RTAC_BUF_SIZE 163840 - -#define TIMEOUT_MS 1000 - -struct rtac_cal_block_data rtac_cal[MAX_RTAC_BLOCKS] = { -/* ADM_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} }, -/* ASM_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} }, -/* VOICE_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} }, -/* AFE_RTAC_CAL */ - {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} } -}; - -struct rtac_common_data { - atomic_t usage_count; - atomic_t apr_err_code; - struct mutex rtac_fops_mutex; -}; - -static struct rtac_common_data rtac_common; - -/* APR data */ -struct rtac_apr_data { - void *apr_handle; - atomic_t cmd_state; - wait_queue_head_t cmd_wait; -}; - -static struct rtac_apr_data rtac_adm_apr_data; -static struct rtac_apr_data rtac_asm_apr_data[ASM_ACTIVE_STREAMS_ALLOWED + 1]; -static struct rtac_apr_data rtac_afe_apr_data; -static struct rtac_apr_data rtac_voice_apr_data[RTAC_VOICE_MODES]; - -/* ADM info & APR */ -static struct rtac_adm rtac_adm_data; -static u32 *rtac_adm_buffer; - - -/* ASM APR */ -static u32 *rtac_asm_buffer; - -static u32 *rtac_afe_buffer; - -/* Voice info & APR */ -struct rtac_voice_data_t { - uint32_t tx_topology_id; - uint32_t rx_topology_id; - uint32_t tx_afe_topology; - uint32_t rx_afe_topology; - uint32_t tx_afe_port; - uint32_t rx_afe_port; - uint16_t cvs_handle; - uint16_t cvp_handle; - uint32_t tx_acdb_id; - uint32_t rx_acdb_id; -}; - -struct rtac_voice { - uint32_t num_of_voice_combos; - struct rtac_voice_data_t voice[RTAC_MAX_ACTIVE_VOICE_COMBOS]; -}; - -struct rtac_afe_user_data { - uint32_t buf_size; - uint32_t cmd_size; - uint32_t port_id; - union { - struct afe_rtac_user_data_set_v2 v2_set; - struct afe_rtac_user_data_set_v3 v3_set; - struct afe_rtac_user_data_get_v2 v2_get; - struct afe_rtac_user_data_get_v3 v3_get; - }; -} __packed; - -static struct rtac_voice rtac_voice_data; -static u32 *rtac_voice_buffer; -static u32 voice_session_id[RTAC_MAX_ACTIVE_VOICE_COMBOS]; - - -struct mutex rtac_adm_mutex; -struct mutex rtac_adm_apr_mutex; -struct mutex rtac_asm_apr_mutex; -struct mutex rtac_voice_mutex; -struct mutex rtac_voice_apr_mutex; -struct mutex rtac_afe_apr_mutex; - -int rtac_clear_mapping(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_debug("%s: invalid cal type %d\n", __func__, cal_type); - result = -EINVAL; - goto done; - } - - rtac_cal[cal_type].map_data.map_handle = 0; -done: - return result; -} - -int rtac_allocate_cal_buffer(uint32_t cal_type) -{ - int result = 0; - size_t len; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].cal_data.paddr != 0) { - pr_err("%s: memory already allocated! cal_type %d, paddr 0x%pK\n", - __func__, cal_type, &rtac_cal[cal_type].cal_data.paddr); - result = -EPERM; - goto done; - } - - result = msm_audio_ion_alloc(&rtac_cal[cal_type].map_data.dma_buf, - rtac_cal[cal_type].map_data.map_size, - &rtac_cal[cal_type].cal_data.paddr, - &len, - &rtac_cal[cal_type].cal_data.kvaddr); - if (result < 0) { - pr_err("%s: ION create client for RTAC failed\n", - __func__); - goto done; - } - - pr_debug("%s: cal_type %d, paddr 0x%pK, kvaddr 0x%pK, map_size 0x%x\n", - __func__, cal_type, - &rtac_cal[cal_type].cal_data.paddr, - rtac_cal[cal_type].cal_data.kvaddr, - rtac_cal[cal_type].map_data.map_size); -done: - return result; -} - -int rtac_free_cal_buffer(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].map_data.dma_buf == NULL) { - pr_debug("%s: cal_type %d not allocated!\n", - __func__, cal_type); - goto done; - } - - result = msm_audio_ion_free(rtac_cal[cal_type].map_data.dma_buf); - if (result < 0) { - pr_err("%s: ION free for RTAC failed! cal_type %d, paddr 0x%pK\n", - __func__, cal_type, &rtac_cal[cal_type].cal_data.paddr); - goto done; - } - - rtac_cal[cal_type].map_data.map_handle = 0; - rtac_cal[cal_type].map_data.dma_buf = NULL; - rtac_cal[cal_type].cal_data.size = 0; - rtac_cal[cal_type].cal_data.kvaddr = 0; - rtac_cal[cal_type].cal_data.paddr = 0; -done: - return result; -} - -int rtac_map_cal_buffer(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].map_data.map_handle != 0) { - pr_err("%s: already mapped cal_type %d\n", - __func__, cal_type); - result = -EPERM; - goto done; - } - - if (rtac_cal[cal_type].cal_data.paddr == 0) { - pr_err("%s: physical address is NULL cal_type %d\n", - __func__, cal_type); - result = -EPERM; - goto done; - } - - switch (cal_type) { - case ADM_RTAC_CAL: - result = adm_map_rtac_block(&rtac_cal[cal_type]); - break; - case ASM_RTAC_CAL: - result = q6asm_map_rtac_block(&rtac_cal[cal_type]); - break; - case VOICE_RTAC_CAL: - result = voc_map_rtac_block(&rtac_cal[cal_type]); - break; - case AFE_RTAC_CAL: - result = afe_map_rtac_block(&rtac_cal[cal_type]); - break; - } - if (result < 0) { - pr_err("%s: map RTAC failed! cal_type %d\n", - __func__, cal_type); - goto done; - } -done: - return result; -} - -int rtac_unmap_cal_buffer(uint32_t cal_type) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - if (cal_type >= MAX_RTAC_BLOCKS) { - pr_err("%s: cal_type %d is invalid!\n", - __func__, cal_type); - result = -EINVAL; - goto done; - } - - if (rtac_cal[cal_type].map_data.map_handle == 0) { - pr_debug("%s: nothing to unmap cal_type %d\n", - __func__, cal_type); - goto done; - } - - switch (cal_type) { - case ADM_RTAC_CAL: - result = adm_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - case ASM_RTAC_CAL: - result = q6asm_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - case VOICE_RTAC_CAL: - result = voc_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - case AFE_RTAC_CAL: - result = afe_unmap_rtac_block( - &rtac_cal[cal_type].map_data.map_handle); - break; - } - if (result < 0) { - pr_err("%s: unmap RTAC failed! cal_type %d\n", - __func__, cal_type); - goto done; - } -done: - return result; -} - -static int rtac_open(struct inode *inode, struct file *f) -{ - int result = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_common.rtac_fops_mutex); - atomic_inc(&rtac_common.usage_count); - mutex_unlock(&rtac_common.rtac_fops_mutex); - return result; -} - -static int rtac_release(struct inode *inode, struct file *f) -{ - int result = 0; - int result2 = 0; - int i; - - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_common.rtac_fops_mutex); - atomic_dec(&rtac_common.usage_count); - pr_debug("%s: ref count %d!\n", __func__, - atomic_read(&rtac_common.usage_count)); - - if (atomic_read(&rtac_common.usage_count) > 0) { - mutex_unlock(&rtac_common.rtac_fops_mutex); - goto done; - } - - for (i = 0; i < MAX_RTAC_BLOCKS; i++) { - result2 = rtac_unmap_cal_buffer(i); - if (result2 < 0) { - pr_err("%s: unmap buffer failed! error %d!\n", - __func__, result2); - result = result2; - } - - result2 = rtac_free_cal_buffer(i); - if (result2 < 0) { - pr_err("%s: free buffer failed! error %d!\n", - __func__, result2); - result = result2; - } - } - mutex_unlock(&rtac_common.rtac_fops_mutex); -done: - return result; -} - - -/* ADM Info */ -void add_popp(u32 dev_idx, u32 port_id, u32 popp_id) -{ - u32 i = 0; - - for (; i < rtac_adm_data.device[dev_idx].num_of_popp; i++) - if (rtac_adm_data.device[dev_idx].popp[i].popp == popp_id) - goto done; - - if (rtac_adm_data.device[dev_idx].num_of_popp == - RTAC_MAX_ACTIVE_POPP) { - pr_err("%s, Max POPP!\n", __func__); - goto done; - } - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp].popp = popp_id; - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp].popp_topology = - q6asm_get_asm_topology(popp_id); - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp++].app_type = - q6asm_get_asm_app_type(popp_id); - - pr_debug("%s: popp_id = %d, popp topology = 0x%x, popp app type = 0x%x\n", - __func__, - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp - 1].popp, - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp - 1].popp_topology, - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp - 1].app_type); -done: - return; -} - -void rtac_update_afe_topology(u32 port_id) -{ - u32 i = 0; - - mutex_lock(&rtac_adm_mutex); - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id) { - rtac_adm_data.device[i].afe_topology = - afe_get_topology(port_id); - pr_debug("%s: port_id = 0x%x topology_id = 0x%x copp_id = %d\n", - __func__, port_id, - rtac_adm_data.device[i].afe_topology, - rtac_adm_data.device[i].copp); - } - } - mutex_unlock(&rtac_adm_mutex); -} - -void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id, - u32 app_type, u32 acdb_id) -{ - u32 i = 0; - - pr_debug("%s: num rtac devices %d port_id = %d, copp_id = %d\n", - __func__, rtac_adm_data.num_of_dev, port_id, copp_id); - - mutex_lock(&rtac_adm_mutex); - if (rtac_adm_data.num_of_dev == RTAC_MAX_ACTIVE_DEVICES) { - pr_err("%s, Can't add anymore RTAC devices!\n", __func__); - goto done; - } - - /* Check if device already added */ - if (rtac_adm_data.num_of_dev != 0) { - for (; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id && - rtac_adm_data.device[i].copp == copp_id) { - add_popp(i, port_id, popp_id); - goto done; - } - if (rtac_adm_data.device[i].num_of_popp == - RTAC_MAX_ACTIVE_POPP) { - pr_err("%s, Max POPP!\n", __func__); - goto done; - } - } - } - - /* Add device */ - rtac_adm_data.num_of_dev++; - - rtac_adm_data.device[i].topology_id = - adm_get_topology_for_port_from_copp_id(port_id, copp_id); - rtac_adm_data.device[i].afe_topology = - afe_get_topology(port_id); - rtac_adm_data.device[i].afe_port = port_id; - rtac_adm_data.device[i].copp = copp_id; - rtac_adm_data.device[i].app_type = app_type; - rtac_adm_data.device[i].acdb_dev_id = acdb_id; - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp].popp = popp_id; - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp].popp_topology = - q6asm_get_asm_topology(popp_id); - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp++].app_type = - q6asm_get_asm_app_type(popp_id); - - pr_debug("%s: topology = 0x%x, afe_topology = 0x%x, port_id = %d, copp_id = %d, app id = 0x%x, acdb id = %d, popp_id = %d, popp topology = 0x%x, popp app type = 0x%x\n", - __func__, - rtac_adm_data.device[i].topology_id, - rtac_adm_data.device[i].afe_topology, - rtac_adm_data.device[i].afe_port, - rtac_adm_data.device[i].copp, - rtac_adm_data.device[i].app_type, - rtac_adm_data.device[i].acdb_dev_id, - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp - 1].popp, - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp - 1].popp_topology, - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp - 1].app_type); -done: - mutex_unlock(&rtac_adm_mutex); -} - -static void shift_adm_devices(u32 dev_idx) -{ - for (; dev_idx < rtac_adm_data.num_of_dev; dev_idx++) { - memcpy(&rtac_adm_data.device[dev_idx], - &rtac_adm_data.device[dev_idx + 1], - sizeof(rtac_adm_data.device[dev_idx])); - memset(&rtac_adm_data.device[dev_idx + 1], 0, - sizeof(rtac_adm_data.device[dev_idx])); - } -} - -static void shift_popp(u32 copp_idx, u32 popp_idx) -{ - for (; popp_idx < rtac_adm_data.device[copp_idx].num_of_popp; - popp_idx++) { - memcpy(&rtac_adm_data.device[copp_idx].popp[popp_idx].popp, - &rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp, sizeof(uint32_t)); - memcpy(&rtac_adm_data.device[copp_idx].popp[popp_idx]. - popp_topology, - &rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp_topology, - sizeof(uint32_t)); - memset(&rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp, 0, sizeof(uint32_t)); - memset(&rtac_adm_data.device[copp_idx].popp[popp_idx + 1]. - popp_topology, 0, sizeof(uint32_t)); - } -} - -void rtac_remove_adm_device(u32 port_id, u32 copp_id) -{ - s32 i; - - pr_debug("%s: num rtac devices %d port_id = %d, copp_id = %d\n", - __func__, rtac_adm_data.num_of_dev, port_id, copp_id); - - mutex_lock(&rtac_adm_mutex); - /* look for device */ - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id && - rtac_adm_data.device[i].copp == copp_id) { - memset(&rtac_adm_data.device[i], 0, - sizeof(rtac_adm_data.device[i])); - rtac_adm_data.num_of_dev--; - - if (rtac_adm_data.num_of_dev >= 1) { - shift_adm_devices(i); - break; - } - } - } - - mutex_unlock(&rtac_adm_mutex); -} - -void rtac_remove_popp_from_adm_devices(u32 popp_id) -{ - s32 i, j; - - pr_debug("%s: popp_id = %d\n", __func__, popp_id); - - mutex_lock(&rtac_adm_mutex); - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - for (j = 0; j < rtac_adm_data.device[i].num_of_popp; j++) { - if (rtac_adm_data.device[i].popp[j].popp == - popp_id) { - rtac_adm_data.device[i].popp[j].popp = 0; - rtac_adm_data.device[i].popp[j]. - popp_topology = 0; - rtac_adm_data.device[i].num_of_popp--; - shift_popp(i, j); - } - } - } - mutex_unlock(&rtac_adm_mutex); -} - - -/* Voice Info */ -static void set_rtac_voice_data(int idx, u32 cvs_handle, u32 cvp_handle, - u32 rx_afe_port, u32 tx_afe_port, - u32 rx_acdb_id, u32 tx_acdb_id, - u32 session_id) -{ - rtac_voice_data.voice[idx].tx_topology_id = - voice_get_topology(CVP_VOC_TX_TOPOLOGY_CAL); - rtac_voice_data.voice[idx].rx_topology_id = - voice_get_topology(CVP_VOC_RX_TOPOLOGY_CAL); - rtac_voice_data.voice[idx].tx_afe_topology = - afe_get_topology(tx_afe_port); - rtac_voice_data.voice[idx].rx_afe_topology = - afe_get_topology(rx_afe_port); - rtac_voice_data.voice[idx].tx_afe_port = tx_afe_port; - rtac_voice_data.voice[idx].rx_afe_port = rx_afe_port; - rtac_voice_data.voice[idx].tx_acdb_id = tx_acdb_id; - rtac_voice_data.voice[idx].rx_acdb_id = rx_acdb_id; - rtac_voice_data.voice[idx].cvs_handle = cvs_handle; - rtac_voice_data.voice[idx].cvp_handle = cvp_handle; - pr_debug("%s\n%s: %x\n%s: %d %s: %d\n%s: %d %s: %d\n %s: %d\n %s: %d\n%s: %d %s: %d\n%s", - "<---- Voice Data Info ---->", "Session id", session_id, - "cvs_handle", cvs_handle, "cvp_handle", cvp_handle, - "rx_afe_topology", rtac_voice_data.voice[idx].rx_afe_topology, - "tx_afe_topology", rtac_voice_data.voice[idx].tx_afe_topology, - "rx_afe_port", rx_afe_port, "tx_afe_port", tx_afe_port, - "rx_acdb_id", rx_acdb_id, "tx_acdb_id", tx_acdb_id, - "<-----------End----------->"); - - /* Store session ID for voice RTAC */ - voice_session_id[idx] = session_id; -} - -void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port, - u32 tx_afe_port, u32 rx_acdb_id, u32 tx_acdb_id, - u32 session_id) -{ - u32 i = 0; - - pr_debug("%s\n", __func__); - mutex_lock(&rtac_voice_mutex); - - if (rtac_voice_data.num_of_voice_combos == - RTAC_MAX_ACTIVE_VOICE_COMBOS) { - pr_err("%s, Can't add anymore RTAC devices!\n", __func__); - goto done; - } - - /* Check if device already added */ - if (rtac_voice_data.num_of_voice_combos != 0) { - for (; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == - cvs_handle) { - set_rtac_voice_data(i, cvs_handle, cvp_handle, - rx_afe_port, tx_afe_port, rx_acdb_id, - tx_acdb_id, session_id); - goto done; - } - } - } - - /* Add device */ - rtac_voice_data.num_of_voice_combos++; - set_rtac_voice_data(i, cvs_handle, cvp_handle, - rx_afe_port, tx_afe_port, - rx_acdb_id, tx_acdb_id, - session_id); -done: - mutex_unlock(&rtac_voice_mutex); -} - -static void shift_voice_devices(u32 idx) -{ - for (; idx < rtac_voice_data.num_of_voice_combos - 1; idx++) { - memcpy(&rtac_voice_data.voice[idx], - &rtac_voice_data.voice[idx + 1], - sizeof(rtac_voice_data.voice[idx])); - voice_session_id[idx] = voice_session_id[idx + 1]; - } -} - -void rtac_remove_voice(u32 cvs_handle) -{ - u32 i = 0; - - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_voice_mutex); - /* look for device */ - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == cvs_handle) { - shift_voice_devices(i); - rtac_voice_data.num_of_voice_combos--; - memset(&rtac_voice_data.voice[ - rtac_voice_data.num_of_voice_combos], 0, - sizeof(rtac_voice_data.voice - [rtac_voice_data.num_of_voice_combos])); - voice_session_id[rtac_voice_data.num_of_voice_combos] - = 0; - break; - } - } - mutex_unlock(&rtac_voice_mutex); -} - -static u32 get_voice_session_id_cvs(u32 cvs_handle) -{ - u32 i; - - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == cvs_handle) - return voice_session_id[i]; - } - - pr_err("%s: No voice index for CVS handle %d found returning 0\n", - __func__, cvs_handle); - return 0; -} - -static u32 get_voice_session_id_cvp(u32 cvp_handle) -{ - u32 i; - - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvp_handle == cvp_handle) - return voice_session_id[i]; - } - - pr_err("%s: No voice index for CVP handle %d found returning 0\n", - __func__, cvp_handle); - return 0; -} - -static int get_voice_index(u32 mode, u32 handle) -{ - if (mode == RTAC_CVP) - return voice_get_idx_for_session( - get_voice_session_id_cvp(handle)); - if (mode == RTAC_CVS) - return voice_get_idx_for_session( - get_voice_session_id_cvs(handle)); - - pr_err("%s: Invalid mode %d, returning 0\n", - __func__, mode); - return 0; -} - - -/* ADM APR */ -void rtac_set_adm_handle(void *handle) -{ - pr_debug("%s: handle = %pK\n", __func__, handle); - - mutex_lock(&rtac_adm_apr_mutex); - rtac_adm_apr_data.apr_handle = handle; - mutex_unlock(&rtac_adm_apr_mutex); -} - -bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size) -{ - pr_debug("%s:cmd_state = %d\n", __func__, - atomic_read(&rtac_adm_apr_data.cmd_state)); - if (atomic_read(&rtac_adm_apr_data.cmd_state) != 1) - return false; - - pr_debug("%s\n", __func__); - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_adm_apr_data.cmd_state, 0); - return true; -} - -int send_adm_apr(void *buf, u32 opcode) -{ - s32 result; - u32 user_buf_size = 0; - u32 bytes_returned = 0; - u32 copp_id; - u32 payload_size; - u32 data_size = 0; - int copp_idx; - int port_idx; - struct apr_hdr adm_params; - - pr_debug("%s\n", __func__); - - if (rtac_cal[ADM_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(ADM_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed!", - __func__); - goto done; - } - } - - if (rtac_cal[ADM_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(ADM_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed!", - __func__); - goto done; - } - } - - if (copy_from_user(&user_buf_size, (void *)buf, - sizeof(user_buf_size))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - if (user_buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_buf_size); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (copy_from_user(&copp_id, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy port id from user buffer\n", - __func__); - goto done; - } - - if (adm_get_indexes_from_copp_id(copp_id, &copp_idx, &port_idx) != 0) { - pr_err("%s: Copp Id-%d is not active\n", __func__, copp_id); - goto done; - } - - mutex_lock(&rtac_adm_apr_mutex); - if (rtac_adm_apr_data.apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - switch (opcode) { - case ADM_CMD_SET_PP_PARAMS_V5: - case ADM_CMD_SET_PP_PARAMS_V6: - /* set payload size to in-band payload */ - /* set data size to actual out of band payload size */ - data_size = payload_size - 4 * sizeof(u32); - if (data_size > rtac_cal[ADM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", - __func__, data_size); - result = -EINVAL; - goto err; - } - payload_size = 4 * sizeof(u32); - - /* Copy buffer to out-of-band payload */ - if (copy_from_user((void *) - rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr, - buf + 7 * sizeof(u32), data_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - - /* set payload size in packet */ - rtac_adm_buffer[8] = data_size; - break; - case ADM_CMD_GET_PP_PARAMS_V5: - case ADM_CMD_GET_PP_PARAMS_V6: - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - result = -EINVAL; - goto err; - } - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_adm_buffer + - sizeof(adm_params)/sizeof(u32), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* Pack header */ - adm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - adm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - adm_params.src_svc = APR_SVC_ADM; - adm_params.src_domain = APR_DOMAIN_APPS; - adm_params.src_port = copp_id; - adm_params.dest_svc = APR_SVC_ADM; - adm_params.dest_domain = APR_DOMAIN_ADSP; - adm_params.dest_port = copp_id; - adm_params.token = port_idx << 16 | copp_idx; - adm_params.opcode = opcode; - - /* fill for out-of-band */ - rtac_adm_buffer[5] = - lower_32_bits(rtac_cal[ADM_RTAC_CAL].cal_data.paddr); - rtac_adm_buffer[6] = - msm_audio_populate_upper_32_bits( - rtac_cal[ADM_RTAC_CAL].cal_data.paddr); - rtac_adm_buffer[7] = rtac_cal[ADM_RTAC_CAL].map_data.map_handle; - - memcpy(rtac_adm_buffer, &adm_params, sizeof(adm_params)); - atomic_set(&rtac_adm_apr_data.cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[ADM_RTAC_CAL].cal_data.paddr); - mutex_unlock(&rtac_adm_apr_mutex); - - result = adm_apr_send_pkt((uint32_t *)rtac_adm_buffer, - port_idx, copp_idx); - - mutex_lock(&rtac_adm_apr_mutex); - - if (result < 0) { - pr_err("%s: Set params failed copp = %d\n", __func__, copp_id); - goto err; - } - - if (opcode == ADM_CMD_GET_PP_PARAMS_V5) { - bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data. - kvaddr)[2] + 3 * sizeof(u32); - } else if (opcode == ADM_CMD_GET_PP_PARAMS_V6) { - bytes_returned = - ((u32 *) rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr)[3] + - 4 * sizeof(u32); - } else { - bytes_returned = data_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[ADM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_buf_size) { - pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", - __func__, user_buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_adm_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_adm_apr_mutex); - return result; -} - - -/* ASM APR */ -void rtac_set_asm_handle(u32 session_id, void *handle) -{ - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_asm_apr_mutex); - rtac_asm_apr_data[session_id].apr_handle = handle; - mutex_unlock(&rtac_asm_apr_mutex); -} - -bool rtac_make_asm_callback(u32 session_id, uint32_t *payload, - u32 payload_size) -{ - if (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) != 1) - return false; - - pr_debug("%s\n", __func__); - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 0); - wake_up(&rtac_asm_apr_data[session_id].cmd_wait); - return true; -} - -int send_rtac_asm_apr(void *buf, u32 opcode) -{ - s32 result; - u32 user_buf_size = 0; - u32 bytes_returned = 0; - u32 session_id = 0; - u32 payload_size; - u32 data_size = 0; - struct apr_hdr asm_params; - - pr_debug("%s\n", __func__); - - if (rtac_cal[ASM_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(ASM_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed!", - __func__); - goto done; - } - } - - if (rtac_cal[ASM_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(ASM_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed!", - __func__); - goto done; - } - } - - if (copy_from_user(&user_buf_size, (void *)buf, - sizeof(user_buf_size))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - if (user_buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_buf_size); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (copy_from_user(&session_id, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy session id from user buffer\n", - __func__); - goto done; - } - if (session_id >= (ASM_ACTIVE_STREAMS_ALLOWED + 1)) { - pr_err("%s: Invalid Session = %d\n", __func__, session_id); - goto done; - } - - mutex_lock(&rtac_asm_apr_mutex); - if (rtac_asm_apr_data[session_id].apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - switch (opcode) { - case ASM_STREAM_CMD_SET_PP_PARAMS_V2: - case ASM_STREAM_CMD_SET_PP_PARAMS_V3: - /* set payload size to in-band payload */ - /* set data size to actual out of band payload size */ - data_size = payload_size - 4 * sizeof(u32); - if (data_size > rtac_cal[ASM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", - __func__, data_size); - result = -EINVAL; - goto err; - } - payload_size = 4 * sizeof(u32); - - /* Copy buffer to out-of-band payload */ - if (copy_from_user((void *) - rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr, - buf + 7 * sizeof(u32), data_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - /* set payload size in packet */ - rtac_asm_buffer[8] = data_size; - break; - case ASM_STREAM_CMD_GET_PP_PARAMS_V2: - case ASM_STREAM_CMD_GET_PP_PARAMS_V3: - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - result = -EINVAL; - goto err; - } - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_asm_buffer + - sizeof(asm_params)/sizeof(u32), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* Pack header */ - asm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - asm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - asm_params.src_svc = q6asm_get_apr_service_id(session_id); - asm_params.src_domain = APR_DOMAIN_APPS; - asm_params.src_port = (session_id << 8) | 0x0001; - asm_params.dest_svc = APR_SVC_ASM; - asm_params.dest_domain = APR_DOMAIN_ADSP; - asm_params.dest_port = (session_id << 8) | 0x0001; - asm_params.token = session_id; - asm_params.opcode = opcode; - - /* fill for out-of-band */ - rtac_asm_buffer[5] = - lower_32_bits(rtac_cal[ASM_RTAC_CAL].cal_data.paddr); - rtac_asm_buffer[6] = - msm_audio_populate_upper_32_bits( - rtac_cal[ASM_RTAC_CAL].cal_data.paddr); - rtac_asm_buffer[7] = rtac_cal[ASM_RTAC_CAL].map_data.map_handle; - - memcpy(rtac_asm_buffer, &asm_params, sizeof(asm_params)); - atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[ASM_RTAC_CAL].cal_data.paddr); - - result = apr_send_pkt(rtac_asm_apr_data[session_id].apr_handle, - (uint32_t *)rtac_asm_buffer); - if (result < 0) { - pr_err("%s: Set params failed session = %d\n", - __func__, session_id); - goto err; - } - - /* Wait for the callback */ - result = wait_event_timeout(rtac_asm_apr_data[session_id].cmd_wait, - (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set params timed out session = %d\n", - __func__, session_id); - goto err; - } - if (atomic_read(&rtac_common.apr_err_code)) { - pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n", - __func__, adsp_err_get_err_str(atomic_read( - &rtac_common.apr_err_code)), - opcode); - result = adsp_err_get_lnx_err_code( - atomic_read( - &rtac_common.apr_err_code)); - goto err; - } - - if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V2) { - bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data. - kvaddr)[2] + 3 * sizeof(u32); - } else if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V3) { - bytes_returned = - ((u32 *) rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr)[3] + - 4 * sizeof(u32); - } else { - bytes_returned = data_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[ASM_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_buf_size) { - pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", - __func__, user_buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_asm_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_asm_apr_mutex); - return result; -} - -/* AFE APR */ -void rtac_set_afe_handle(void *handle) -{ - mutex_lock(&rtac_afe_apr_mutex); - rtac_afe_apr_data.apr_handle = handle; - mutex_unlock(&rtac_afe_apr_mutex); -} - -bool rtac_make_afe_callback(uint32_t *payload, uint32_t payload_size) -{ - pr_debug("%s:cmd_state = %d\n", __func__, - atomic_read(&rtac_afe_apr_data.cmd_state)); - if (atomic_read(&rtac_afe_apr_data.cmd_state) != 1) - return false; - - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_afe_apr_data.cmd_state, 0); - wake_up(&rtac_afe_apr_data.cmd_wait); - return true; -} - -static int fill_afe_apr_hdr(struct apr_hdr *apr_hdr, uint32_t port, - uint32_t opcode, uint32_t apr_msg_size) -{ - if (apr_hdr == NULL) { - pr_err("%s: invalid APR pointer", __func__); - return -EINVAL; - } - - apr_hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - apr_hdr->pkt_size = apr_msg_size; - apr_hdr->src_svc = APR_SVC_AFE; - apr_hdr->src_domain = APR_DOMAIN_APPS; - apr_hdr->src_port = 0; - apr_hdr->dest_svc = APR_SVC_AFE; - apr_hdr->dest_domain = APR_DOMAIN_ADSP; - apr_hdr->dest_port = 0; - apr_hdr->token = port; - apr_hdr->opcode = opcode; - - return 0; - -} -static int send_rtac_afe_apr(void __user *buf, uint32_t opcode) -{ - int32_t result; - uint32_t bytes_returned = 0; - uint32_t payload_size = 0; - uint32_t port_index = 0; - uint32_t *afe_cmd = NULL; - uint32_t apr_msg_size = 0; - struct rtac_afe_user_data user_afe_buf; - struct mem_mapping_hdr *mem_hdr = NULL; - struct param_hdr_v1 *get_resp_v2; - struct param_hdr_v3 *get_resp_v3; - - pr_debug("%s\n", __func__); - - if (rtac_cal[AFE_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(AFE_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed! ret = %d\n", - __func__, result); - goto done; - } - } - - if (rtac_cal[AFE_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(AFE_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed! ret = %d\n", - __func__, result); - goto done; - } - } - - if (copy_from_user(&user_afe_buf, (void *)buf, - sizeof(struct rtac_afe_user_data))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - - if (user_afe_buf.buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_afe_buf.buf_size); - goto done; - } - - port_index = q6audio_get_port_index(user_afe_buf.port_id); - if (port_index >= AFE_MAX_PORTS) { - pr_err("%s: Invalid AFE port = 0x%x\n", - __func__, user_afe_buf.port_id); - goto done; - } - - mutex_lock(&rtac_afe_apr_mutex); - if (rtac_afe_apr_data.apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - afe_cmd = - (u32 *) rtac_afe_buffer + sizeof(struct apr_hdr) / sizeof(u32); - - switch (opcode) { - case AFE_PORT_CMD_SET_PARAM_V2: - apr_msg_size = sizeof(struct afe_port_cmd_set_param_v2); - payload_size = user_afe_buf.v2_set.payload_size; - if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid payload size = %d\n", __func__, - payload_size); - result = -EINVAL; - goto err; - } - - /* Copy the command to the rtac buffer */ - memcpy(afe_cmd, &user_afe_buf.v2_set, - sizeof(user_afe_buf.v2_set)); - - /* Copy the param data to the out-of-band location */ - if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v2_set.param_hdr), - payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - case AFE_PORT_CMD_SET_PARAM_V3: - apr_msg_size = sizeof(struct afe_port_cmd_set_param_v3); - payload_size = user_afe_buf.v3_set.payload_size; - if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid payload size = %d\n", __func__, - payload_size); - result = -EINVAL; - goto err; - } - - /* Copy the command to the rtac buffer */ - memcpy(afe_cmd, &user_afe_buf.v3_set, - sizeof(user_afe_buf.v3_set)); - - /* Copy the param data to the out-of-band location */ - if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v3_set.param_hdr), - payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - case AFE_PORT_CMD_GET_PARAM_V2: - apr_msg_size = sizeof(struct afe_port_cmd_get_param_v2); - - if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", __func__, - user_afe_buf.cmd_size); - result = -EINVAL; - goto err; - } - - /* Copy the command and param data in-band */ - if (copy_from_user(afe_cmd, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v2_get), - user_afe_buf.cmd_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - case AFE_PORT_CMD_GET_PARAM_V3: - apr_msg_size = sizeof(struct afe_port_cmd_get_param_v3); - - if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", __func__, - user_afe_buf.cmd_size); - result = -EINVAL; - goto err; - } - - /* Copy the command and param data in-band */ - if (copy_from_user(afe_cmd, - (void __user *) buf + - offsetof(struct rtac_afe_user_data, - v3_get), - user_afe_buf.cmd_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* - * The memory header is in the same location in all commands. Therefore, - * it doesn't matter what command the buffer is cast into. - */ - mem_hdr = &((struct afe_port_cmd_set_param_v3 *) rtac_afe_buffer) - ->mem_hdr; - mem_hdr->data_payload_addr_lsw = - lower_32_bits(rtac_cal[AFE_RTAC_CAL].cal_data.paddr); - mem_hdr->data_payload_addr_msw = msm_audio_populate_upper_32_bits( - rtac_cal[AFE_RTAC_CAL].cal_data.paddr); - mem_hdr->mem_map_handle = rtac_cal[AFE_RTAC_CAL].map_data.map_handle; - - /* Fill the APR header at the end so we have the correct message size */ - fill_afe_apr_hdr((struct apr_hdr *) rtac_afe_buffer, - port_index, opcode, apr_msg_size); - - atomic_set(&rtac_afe_apr_data.cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[AFE_RTAC_CAL].cal_data.paddr); - - result = apr_send_pkt(rtac_afe_apr_data.apr_handle, - (uint32_t *)rtac_afe_buffer); - if (result < 0) { - pr_err("%s: Set params failed port = 0x%x, ret = %d\n", - __func__, user_afe_buf.port_id, result); - goto err; - } - /* Wait for the callback */ - result = wait_event_timeout(rtac_afe_apr_data.cmd_wait, - (atomic_read(&rtac_afe_apr_data.cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: Set params timed out port = 0x%x, ret = %d\n", - __func__, user_afe_buf.port_id, result); - goto err; - } - if (atomic_read(&rtac_common.apr_err_code)) { - pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n", - __func__, adsp_err_get_err_str(atomic_read( - &rtac_common.apr_err_code)), - opcode); - result = adsp_err_get_lnx_err_code( - atomic_read( - &rtac_common.apr_err_code)); - goto err; - } - - if (opcode == AFE_PORT_CMD_GET_PARAM_V2) { - get_resp_v2 = (struct param_hdr_v1 *) rtac_cal[AFE_RTAC_CAL] - .cal_data.kvaddr; - bytes_returned = - get_resp_v2->param_size + sizeof(struct param_hdr_v1); - } else if (opcode == AFE_PORT_CMD_GET_PARAM_V3) { - get_resp_v3 = (struct param_hdr_v3 *) rtac_cal[AFE_RTAC_CAL] - .cal_data.kvaddr; - bytes_returned = - get_resp_v3->param_size + sizeof(struct param_hdr_v3); - } else { - bytes_returned = payload_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[AFE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_afe_buf.buf_size) { - pr_err("%s: user size = 0x%x, returned size = 0x%x\n", __func__, - user_afe_buf.buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_afe_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_afe_apr_mutex); - return result; -} - -/* Voice APR */ -void rtac_set_voice_handle(u32 mode, void *handle) -{ - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_voice_apr_mutex); - rtac_voice_apr_data[mode].apr_handle = handle; - mutex_unlock(&rtac_voice_apr_mutex); -} - -bool rtac_make_voice_callback(u32 mode, uint32_t *payload, u32 payload_size) -{ - if ((atomic_read(&rtac_voice_apr_data[mode].cmd_state) != 1) || - (mode >= RTAC_VOICE_MODES)) - return false; - - pr_debug("%s\n", __func__); - if (payload_size == sizeof(uint32_t)) - atomic_set(&rtac_common.apr_err_code, payload[0]); - else if (payload_size == (2*sizeof(uint32_t))) - atomic_set(&rtac_common.apr_err_code, payload[1]); - - atomic_set(&rtac_voice_apr_data[mode].cmd_state, 0); - wake_up(&rtac_voice_apr_data[mode].cmd_wait); - return true; -} - -int send_voice_apr(u32 mode, void *buf, u32 opcode) -{ - s32 result; - u32 user_buf_size = 0; - u32 bytes_returned = 0; - u32 payload_size; - u32 dest_port; - u32 data_size = 0; - struct apr_hdr voice_params; - - pr_debug("%s\n", __func__); - - if (rtac_cal[VOICE_RTAC_CAL].map_data.dma_buf == NULL) { - result = rtac_allocate_cal_buffer(VOICE_RTAC_CAL); - if (result < 0) { - pr_err("%s: allocate buffer failed!", - __func__); - goto done; - } - } - - if (rtac_cal[VOICE_RTAC_CAL].map_data.map_handle == 0) { - result = rtac_map_cal_buffer(VOICE_RTAC_CAL); - if (result < 0) { - pr_err("%s: map buffer failed!", - __func__); - goto done; - } - } - - if (copy_from_user(&user_buf_size, (void *)buf, - sizeof(user_buf_size))) { - pr_err("%s: Copy from user failed! buf = 0x%pK\n", - __func__, buf); - goto done; - } - if (user_buf_size <= 0) { - pr_err("%s: Invalid buffer size = %d\n", - __func__, user_buf_size); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (copy_from_user(&dest_port, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy port id from user buffer\n", - __func__); - goto done; - } - - if ((mode != RTAC_CVP) && (mode != RTAC_CVS)) { - pr_err("%s: Invalid Mode for APR, mode = %d\n", - __func__, mode); - goto done; - } - - mutex_lock(&rtac_voice_apr_mutex); - if (rtac_voice_apr_data[mode].apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - result = -EINVAL; - goto err; - } - - switch (opcode) { - case VSS_ICOMMON_CMD_SET_PARAM_V2: - case VSS_ICOMMON_CMD_SET_PARAM_V3: - /* set payload size to in-band payload */ - /* set data size to actual out of band payload size */ - data_size = payload_size - 4 * sizeof(u32); - if (data_size > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", - __func__, data_size); - result = -EINVAL; - goto err; - } - payload_size = 4 * sizeof(u32); - - /* Copy buffer to out-of-band payload */ - if (copy_from_user((void *) - rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr, - buf + 7 * sizeof(u32), data_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - /* set payload size in packet */ - rtac_voice_buffer[8] = data_size; - /* set token for set param case */ - voice_params.token = VOC_RTAC_SET_PARAM_TOKEN; - break; - case VSS_ICOMMON_CMD_GET_PARAM_V2: - case VSS_ICOMMON_CMD_GET_PARAM_V3: - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - result = -EINVAL; - goto err; - } - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_voice_buffer + - sizeof(voice_params)/sizeof(u32), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - result = -EFAULT; - goto err; - } - /* set token for get param case */ - voice_params.token = 0; - break; - default: - pr_err("%s: Invalid opcode %d\n", __func__, opcode); - result = -EINVAL; - goto err; - } - - /* Pack header */ - voice_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - voice_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - voice_params.src_svc = 0; - voice_params.src_domain = APR_DOMAIN_APPS; - voice_params.src_port = get_voice_index(mode, dest_port); - voice_params.dest_svc = 0; - voice_params.dest_domain = APR_DOMAIN_MODEM; - voice_params.dest_port = (u16)dest_port; - voice_params.opcode = opcode; - - /* fill for out-of-band */ - rtac_voice_buffer[5] = rtac_cal[VOICE_RTAC_CAL].map_data.map_handle; - rtac_voice_buffer[6] = - lower_32_bits(rtac_cal[VOICE_RTAC_CAL].cal_data.paddr); - rtac_voice_buffer[7] = msm_audio_populate_upper_32_bits( - rtac_cal[VOICE_RTAC_CAL].cal_data.paddr); - - memcpy(rtac_voice_buffer, &voice_params, sizeof(voice_params)); - atomic_set(&rtac_voice_apr_data[mode].cmd_state, 1); - - pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n", - __func__, opcode, - &rtac_cal[VOICE_RTAC_CAL].cal_data.paddr); - - result = apr_send_pkt(rtac_voice_apr_data[mode].apr_handle, - (uint32_t *)rtac_voice_buffer); - if (result < 0) { - pr_err("%s: apr_send_pkt failed opcode = %x\n", - __func__, opcode); - goto err; - } - /* Wait for the callback */ - result = wait_event_timeout(rtac_voice_apr_data[mode].cmd_wait, - (atomic_read(&rtac_voice_apr_data[mode].cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - if (!result) { - pr_err("%s: apr_send_pkt timed out opcode = %x\n", - __func__, opcode); - goto err; - } - if (atomic_read(&rtac_common.apr_err_code)) { - pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n", - __func__, adsp_err_get_err_str(atomic_read( - &rtac_common.apr_err_code)), - opcode); - result = adsp_err_get_lnx_err_code( - atomic_read( - &rtac_common.apr_err_code)); - goto err; - } - - if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V2) { - bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data. - kvaddr)[2] + 3 * sizeof(u32); - } else if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V3) { - bytes_returned = - ((u32 *) rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr)[3] + - 4 * sizeof(u32); - } else { - bytes_returned = data_size; - goto unlock; - } - - if (bytes_returned > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) { - pr_err("%s: Invalid data size = %d\n", __func__, - bytes_returned); - result = -EINVAL; - goto err; - } - - if (bytes_returned > user_buf_size) { - pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", - __func__, user_buf_size, bytes_returned); - result = -EINVAL; - goto err; - } - - if (copy_to_user((void __user *) buf, - rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr, - bytes_returned)) { - pr_err("%s: Could not copy buffer to user, size = %d\n", - __func__, bytes_returned); - result = -EFAULT; - goto err; - } - -unlock: - mutex_unlock(&rtac_voice_apr_mutex); -done: - return bytes_returned; -err: - mutex_unlock(&rtac_voice_apr_mutex); - return result; -} - -void get_rtac_adm_data(struct rtac_adm *adm_data) -{ - mutex_lock(&rtac_adm_mutex); - memcpy(adm_data, &rtac_adm_data, sizeof(struct rtac_adm)); - mutex_unlock(&rtac_adm_mutex); -} - - -static long rtac_ioctl_shared(struct file *f, - unsigned int cmd, void *arg) -{ - u32 opcode; - int result = 0; - if (!arg) { - pr_err("%s: No data sent to driver!\n", __func__); - result = -EFAULT; - goto done; - } - - switch (cmd) { - case AUDIO_GET_RTAC_ADM_INFO: { - mutex_lock(&rtac_adm_mutex); - if (copy_to_user((void *)arg, &rtac_adm_data, - sizeof(rtac_adm_data))) { - pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_ADM_INFO\n", - __func__); - mutex_unlock(&rtac_adm_mutex); - return -EFAULT; - } - result = sizeof(rtac_adm_data); - mutex_unlock(&rtac_adm_mutex); - break; - } - case AUDIO_GET_RTAC_VOICE_INFO: { - mutex_lock(&rtac_voice_mutex); - if (copy_to_user((void *)arg, &rtac_voice_data, - sizeof(rtac_voice_data))) { - pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_VOICE_INFO\n", - __func__); - mutex_unlock(&rtac_voice_mutex); - return -EFAULT; - } - result = sizeof(rtac_voice_data); - mutex_unlock(&rtac_voice_mutex); - break; - } - - case AUDIO_GET_RTAC_ADM_CAL: - opcode = q6common_is_instance_id_supported() ? - ADM_CMD_GET_PP_PARAMS_V6 : - ADM_CMD_GET_PP_PARAMS_V5; - result = send_adm_apr((void *) arg, opcode); - break; - case AUDIO_SET_RTAC_ADM_CAL: - opcode = q6common_is_instance_id_supported() ? - ADM_CMD_SET_PP_PARAMS_V6 : - ADM_CMD_SET_PP_PARAMS_V5; - result = send_adm_apr((void *) arg, opcode); - break; - case AUDIO_GET_RTAC_ASM_CAL: - opcode = q6common_is_instance_id_supported() ? - ASM_STREAM_CMD_GET_PP_PARAMS_V3 : - ASM_STREAM_CMD_GET_PP_PARAMS_V2; - result = send_rtac_asm_apr((void *) arg, opcode); - break; - case AUDIO_SET_RTAC_ASM_CAL: - opcode = q6common_is_instance_id_supported() ? - ASM_STREAM_CMD_SET_PP_PARAMS_V3 : - ASM_STREAM_CMD_SET_PP_PARAMS_V2; - result = send_rtac_asm_apr((void *) arg, opcode); - break; - case AUDIO_GET_RTAC_CVS_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_GET_PARAM_V3 : - VSS_ICOMMON_CMD_GET_PARAM_V2; - result = send_voice_apr(RTAC_CVS, (void *) arg, opcode); - break; - case AUDIO_SET_RTAC_CVS_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_SET_PARAM_V3 : - VSS_ICOMMON_CMD_SET_PARAM_V2; - result = send_voice_apr(RTAC_CVS, (void *) arg, opcode); - break; - case AUDIO_GET_RTAC_CVP_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_GET_PARAM_V3 : - VSS_ICOMMON_CMD_GET_PARAM_V2; - result = send_voice_apr(RTAC_CVP, (void *) arg, opcode); - break; - case AUDIO_SET_RTAC_CVP_CAL: - opcode = q6common_is_instance_id_supported() ? - VSS_ICOMMON_CMD_SET_PARAM_V3 : - VSS_ICOMMON_CMD_SET_PARAM_V2; - result = send_voice_apr(RTAC_CVP, (void *) arg, opcode); - break; - case AUDIO_GET_RTAC_AFE_CAL: - opcode = q6common_is_instance_id_supported() ? - AFE_PORT_CMD_GET_PARAM_V3 : - AFE_PORT_CMD_GET_PARAM_V2; - result = send_rtac_afe_apr((void __user *) arg, opcode); - break; - case AUDIO_SET_RTAC_AFE_CAL: - opcode = q6common_is_instance_id_supported() ? - AFE_PORT_CMD_SET_PARAM_V3 : - AFE_PORT_CMD_SET_PARAM_V2; - result = send_rtac_afe_apr((void __user *) arg, opcode); - break; - default: - pr_err("%s: Invalid IOCTL, command = %d!\n", - __func__, cmd); - result = -EINVAL; - } -done: - return result; -} - -static long rtac_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - int result = 0; - - mutex_lock(&rtac_common.rtac_fops_mutex); - if (!arg) { - pr_err("%s: No data sent to driver!\n", __func__); - result = -EFAULT; - } else { - result = rtac_ioctl_shared(f, cmd, (void __user *)arg); - } - - mutex_unlock(&rtac_common.rtac_fops_mutex); - return result; -} - -#ifdef CONFIG_COMPAT -#define AUDIO_GET_RTAC_ADM_INFO_32 _IOR(CAL_IOCTL_MAGIC, 207, compat_uptr_t) -#define AUDIO_GET_RTAC_VOICE_INFO_32 _IOR(CAL_IOCTL_MAGIC, 208, compat_uptr_t) -#define AUDIO_GET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 209, compat_uptr_t) -#define AUDIO_SET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 210, compat_uptr_t) -#define AUDIO_GET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 211, compat_uptr_t) -#define AUDIO_SET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 212, compat_uptr_t) -#define AUDIO_GET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 213, compat_uptr_t) -#define AUDIO_SET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 214, compat_uptr_t) -#define AUDIO_GET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 215, compat_uptr_t) -#define AUDIO_SET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 216, compat_uptr_t) -#define AUDIO_GET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 217, compat_uptr_t) -#define AUDIO_SET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 218, compat_uptr_t) - -static long rtac_compat_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - int result = 0; - - mutex_lock(&rtac_common.rtac_fops_mutex); - if (!arg) { - pr_err("%s: No data sent to driver!\n", __func__); - result = -EINVAL; - goto done; - } - - switch (cmd) { - case AUDIO_GET_RTAC_ADM_INFO_32: - cmd = AUDIO_GET_RTAC_ADM_INFO; - goto process; - case AUDIO_GET_RTAC_VOICE_INFO_32: - cmd = AUDIO_GET_RTAC_VOICE_INFO; - goto process; - case AUDIO_GET_RTAC_AFE_CAL_32: - cmd = AUDIO_GET_RTAC_AFE_CAL; - goto process; - case AUDIO_SET_RTAC_AFE_CAL_32: - cmd = AUDIO_SET_RTAC_AFE_CAL; - goto process; - case AUDIO_GET_RTAC_ADM_CAL_32: - cmd = AUDIO_GET_RTAC_ADM_CAL; - goto process; - case AUDIO_SET_RTAC_ADM_CAL_32: - cmd = AUDIO_SET_RTAC_ADM_CAL; - goto process; - case AUDIO_GET_RTAC_ASM_CAL_32: - cmd = AUDIO_GET_RTAC_ASM_CAL; - goto process; - case AUDIO_SET_RTAC_ASM_CAL_32: - cmd = AUDIO_SET_RTAC_ASM_CAL; - goto process; - case AUDIO_GET_RTAC_CVS_CAL_32: - cmd = AUDIO_GET_RTAC_CVS_CAL; - goto process; - case AUDIO_SET_RTAC_CVS_CAL_32: - cmd = AUDIO_SET_RTAC_CVS_CAL; - goto process; - case AUDIO_GET_RTAC_CVP_CAL_32: - cmd = AUDIO_GET_RTAC_CVP_CAL; - goto process; - case AUDIO_SET_RTAC_CVP_CAL_32: - cmd = AUDIO_SET_RTAC_CVP_CAL; -process: - result = rtac_ioctl_shared(f, cmd, compat_ptr(arg)); - break; - default: - result = -EINVAL; - pr_err("%s: Invalid IOCTL, command = %d!\n", - __func__, cmd); - break; - } -done: - mutex_unlock(&rtac_common.rtac_fops_mutex); - return result; -} -#else -#define rtac_compat_ioctl NULL -#endif - -static const struct file_operations rtac_fops = { - .owner = THIS_MODULE, - .open = rtac_open, - .release = rtac_release, - .unlocked_ioctl = rtac_ioctl, - .compat_ioctl = rtac_compat_ioctl, -}; - -struct miscdevice rtac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_rtac", - .fops = &rtac_fops, -}; - -int __init rtac_init(void) -{ - int i = 0; - - /* Driver */ - atomic_set(&rtac_common.usage_count, 0); - atomic_set(&rtac_common.apr_err_code, 0); - mutex_init(&rtac_common.rtac_fops_mutex); - - /* ADM */ - memset(&rtac_adm_data, 0, sizeof(rtac_adm_data)); - rtac_adm_apr_data.apr_handle = NULL; - atomic_set(&rtac_adm_apr_data.cmd_state, 0); - init_waitqueue_head(&rtac_adm_apr_data.cmd_wait); - mutex_init(&rtac_adm_mutex); - mutex_init(&rtac_adm_apr_mutex); - - rtac_adm_buffer = kzalloc( - rtac_cal[ADM_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_adm_buffer == NULL) - goto nomem; - - /* ASM */ - for (i = 0; i < ASM_ACTIVE_STREAMS_ALLOWED+1; i++) { - rtac_asm_apr_data[i].apr_handle = NULL; - atomic_set(&rtac_asm_apr_data[i].cmd_state, 0); - init_waitqueue_head(&rtac_asm_apr_data[i].cmd_wait); - } - mutex_init(&rtac_asm_apr_mutex); - - rtac_asm_buffer = kzalloc( - rtac_cal[ASM_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_asm_buffer == NULL) { - kzfree(rtac_adm_buffer); - goto nomem; - } - - /* AFE */ - rtac_afe_apr_data.apr_handle = NULL; - atomic_set(&rtac_afe_apr_data.cmd_state, 0); - init_waitqueue_head(&rtac_afe_apr_data.cmd_wait); - mutex_init(&rtac_afe_apr_mutex); - - rtac_afe_buffer = kzalloc( - rtac_cal[AFE_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_afe_buffer == NULL) { - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - goto nomem; - } - - /* Voice */ - memset(&rtac_voice_data, 0, sizeof(rtac_voice_data)); - for (i = 0; i < RTAC_VOICE_MODES; i++) { - rtac_voice_apr_data[i].apr_handle = NULL; - atomic_set(&rtac_voice_apr_data[i].cmd_state, 0); - init_waitqueue_head(&rtac_voice_apr_data[i].cmd_wait); - } - mutex_init(&rtac_voice_mutex); - mutex_init(&rtac_voice_apr_mutex); - - rtac_voice_buffer = kzalloc( - rtac_cal[VOICE_RTAC_CAL].map_data.map_size, GFP_KERNEL); - if (rtac_voice_buffer == NULL) { - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - kzfree(rtac_afe_buffer); - goto nomem; - } - - if (misc_register(&rtac_misc) != 0) { - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - kzfree(rtac_afe_buffer); - kzfree(rtac_voice_buffer); - goto nomem; - } - - return 0; -nomem: - return -ENOMEM; -} - -void rtac_exit(void) -{ - misc_deregister(&rtac_misc); - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - kzfree(rtac_afe_buffer); - kzfree(rtac_voice_buffer); -} - -MODULE_DESCRIPTION("SoC QDSP6v2 Real-Time Audio Calibration driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/sp_params.c b/techpack/audio/dsp/sp_params.c deleted file mode 100644 index 2abb82e0d60b..000000000000 --- a/techpack/audio/dsp/sp_params.c +++ /dev/null @@ -1,434 +0,0 @@ -/* - * Copyright (c) 2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -/* export or show spk params at /sys/class/spk_params/cal_data */ -#define SPK_PARAMS "spk_params" -#define CLASS_NAME "cal_data" -#define BUF_SZ 20 -#define Q22 (1<<22) -#define Q13 (1<<13) -#define Q7 (1<<7) - -struct afe_spk_ctl { - struct class *p_class; - struct device *p_dev; - struct afe_sp_rx_tmax_xmax_logging_param xt_logging; - int32_t max_temperature_rd[SP_V2_NUM_MAX_SPKR]; -}; -struct afe_spk_ctl this_afe_spk; - -static ssize_t sp_count_exceeded_temperature_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1]); - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_temperature, 0644, - sp_count_exceeded_temperature_l_show, NULL); - -static ssize_t sp_count_exceeded_temperature_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2]); - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_temperature_r, 0644, - sp_count_exceeded_temperature_r_show, NULL); - -static ssize_t sp_count_exceeded_excursion_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1]); - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_excursion, 0644, - sp_count_exceeded_excursion_l_show, NULL); - -static ssize_t sp_count_exceeded_excursion_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2]); - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(count_exceeded_excursion_r, 0644, - sp_count_exceeded_excursion_r_show, NULL); - -static ssize_t sp_max_excursion_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - int32_t ex_val_frac; - int32_t ex_q27 = this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1]; - - ex_val_frac = ex_q27/Q13; - ex_val_frac = (ex_val_frac * 10000)/(Q7 * Q7); - ex_val_frac /= 100; - ret = snprintf(buf, BUF_SZ, "%d.%02d\n", 0, ex_val_frac); - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(max_excursion, 0644, sp_max_excursion_l_show, NULL); - -static ssize_t sp_max_excursion_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - int32_t ex_val_frac; - int32_t ex_q27 = this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2]; - - ex_val_frac = ex_q27/Q13; - ex_val_frac = (ex_val_frac * 10000)/(Q7 * Q7); - ex_val_frac /= 100; - ret = snprintf(buf, BUF_SZ, "%d.%02d\n", 0, ex_val_frac); - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(max_excursion_r, 0644, sp_max_excursion_r_show, NULL); - -static ssize_t sp_max_temperature_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1]/Q22); - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = 0; - return ret; -} -static DEVICE_ATTR(max_temperature, 0644, sp_max_temperature_l_show, NULL); - -static ssize_t sp_max_temperature_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2]/Q22); - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = 0; - return ret; -} -static DEVICE_ATTR(max_temperature_r, 0644, sp_max_temperature_r_show, NULL); - -static ssize_t sp_max_temperature_rd_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.max_temperature_rd[SP_V2_SPKR_1]/Q22); -} -static DEVICE_ATTR(max_temperature_rd, 0644, - sp_max_temperature_rd_l_show, NULL); - -static ssize_t sp_max_temperature_rd_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", - this_afe_spk.max_temperature_rd[SP_V2_SPKR_2]/Q22); -} -static DEVICE_ATTR(max_temperature_rd_r, 0644, - sp_max_temperature_rd_r_show, NULL); - -static ssize_t q6afe_initial_cal_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", afe_get_spk_initial_cal()); -} - -static ssize_t q6afe_initial_cal_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - int initial_cal = 0; - - if (!kstrtou32(buf, 0, &initial_cal)) { - initial_cal = initial_cal > 0 ? 1 : 0; - if (initial_cal == afe_get_spk_initial_cal()) - dev_dbg(dev, "%s: same value already present\n", - __func__); - else - afe_set_spk_initial_cal(initial_cal); - } - return size; -} - -static DEVICE_ATTR(initial_cal, 0644, - q6afe_initial_cal_show, q6afe_initial_cal_store); - -static ssize_t q6afe_v_vali_flag_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return snprintf(buf, BUF_SZ, "%d\n", afe_get_spk_v_vali_flag()); -} - -static ssize_t q6afe_v_vali_flag_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - int v_vali_flag = 0; - - if (!kstrtou32(buf, 0, &v_vali_flag)) { - v_vali_flag = v_vali_flag > 0 ? 1 : 0; - if (v_vali_flag == afe_get_spk_v_vali_flag()) - dev_dbg(dev, "%s: same value already present\n", - __func__); - else - afe_set_spk_v_vali_flag(v_vali_flag); - } - return size; -} - -static DEVICE_ATTR(v_vali_flag, 0644, - q6afe_v_vali_flag_show, q6afe_v_vali_flag_store); - -static ssize_t q6afe_spk_r0_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int r0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_r0(r0); - return snprintf(buf, BUF_SZ, "%d\n", r0[SP_V2_SPKR_1]); -} - -static DEVICE_ATTR(spk_r0, 0644, q6afe_spk_r0_l_show, NULL); - -static ssize_t q6afe_spk_t0_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int t0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_t0(t0); - return snprintf(buf, BUF_SZ, "%d\n", t0[SP_V2_SPKR_1]); -} - -static DEVICE_ATTR(spk_t0, 0644, q6afe_spk_t0_l_show, NULL); - -static ssize_t q6afe_spk_r0_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int r0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_r0(r0); - return snprintf(buf, BUF_SZ, "%d\n", r0[SP_V2_SPKR_2]); -} - -static DEVICE_ATTR(spk_r0_r, 0644, q6afe_spk_r0_r_show, NULL); - -static ssize_t q6afe_spk_t0_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int t0[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_t0(t0); - return snprintf(buf, BUF_SZ, "%d\n", t0[SP_V2_SPKR_2]); -} - -static DEVICE_ATTR(spk_t0_r, 0644, q6afe_spk_t0_r_show, NULL); - -static ssize_t q6afe_spk_v_vali_l_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int v_vali_sts[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_v_vali_sts(v_vali_sts); - return snprintf(buf, BUF_SZ, "%d\n", v_vali_sts[SP_V2_SPKR_1]); -} - -static DEVICE_ATTR(spk_v_vali_status, 0644, q6afe_spk_v_vali_l_show, NULL); - -static ssize_t q6afe_spk_v_vali_r_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int v_vali_sts[SP_V2_NUM_MAX_SPKRS]; - - afe_get_spk_v_vali_sts(v_vali_sts); - return snprintf(buf, BUF_SZ, "%d\n", v_vali_sts[SP_V2_SPKR_2]); -} - -static DEVICE_ATTR(spk_v_vali_r_status, 0644, q6afe_spk_v_vali_r_show, NULL); - -static struct attribute *afe_spk_cal_attr[] = { - &dev_attr_max_excursion.attr, - &dev_attr_max_excursion_r.attr, - &dev_attr_max_temperature.attr, - &dev_attr_max_temperature_r.attr, - &dev_attr_count_exceeded_excursion.attr, - &dev_attr_count_exceeded_excursion_r.attr, - &dev_attr_count_exceeded_temperature.attr, - &dev_attr_count_exceeded_temperature_r.attr, - &dev_attr_max_temperature_rd.attr, - &dev_attr_max_temperature_rd_r.attr, - &dev_attr_initial_cal.attr, - &dev_attr_spk_r0.attr, - &dev_attr_spk_t0.attr, - &dev_attr_spk_r0_r.attr, - &dev_attr_spk_t0_r.attr, - &dev_attr_v_vali_flag.attr, - &dev_attr_spk_v_vali_status.attr, - &dev_attr_spk_v_vali_r_status.attr, - NULL, -}; - -static struct attribute_group afe_spk_cal_attr_grp = { - .attrs = afe_spk_cal_attr, -}; - - -/** - * afe_get_sp_xt_logging_data - - * to get excursion logging data from DSP - * - * @port: AFE port ID - * - * Returns 0 on success or error on failure - */ -int afe_get_sp_xt_logging_data(u16 port_id) -{ - int ret = 0; - struct afe_sp_rx_tmax_xmax_logging_param xt_logging_data; - - ret = afe_get_sp_rx_tmax_xmax_logging_data(&xt_logging_data, port_id); - if (ret) { - pr_err("%s Excursion logging fail\n", __func__); - return ret; - } - /* storing max sp param value */ - if (this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] < - xt_logging_data.max_temperature[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = - xt_logging_data.max_temperature[SP_V2_SPKR_1]; - - - if (this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] < - xt_logging_data.max_temperature[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = - xt_logging_data.max_temperature[SP_V2_SPKR_2]; - - - /* update temp for max_temperature_rd node */ - if (this_afe_spk.max_temperature_rd[SP_V2_SPKR_1] < - xt_logging_data.max_temperature[SP_V2_SPKR_1]) - this_afe_spk.max_temperature_rd[SP_V2_SPKR_1] = - xt_logging_data.max_temperature[SP_V2_SPKR_1]; - - if (this_afe_spk.max_temperature_rd[SP_V2_SPKR_2] < - xt_logging_data.max_temperature[SP_V2_SPKR_2]) - this_afe_spk.max_temperature_rd[SP_V2_SPKR_2] = - xt_logging_data.max_temperature[SP_V2_SPKR_2]; - - - if (this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] < - xt_logging_data.max_excursion[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = - xt_logging_data.max_excursion[SP_V2_SPKR_1]; - - if (this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] < - xt_logging_data.max_excursion[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = - xt_logging_data.max_excursion[SP_V2_SPKR_2]; - - if (this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] < - xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] - += xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_1]; - - if (this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] < - xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] - += xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_2]; - - if (this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] < - xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_1]) - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] - += xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_1]; - - if (this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] < - xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_2]) - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] - += xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_2]; - - return ret; -} -EXPORT_SYMBOL(afe_get_sp_xt_logging_data); - -int __init spk_params_init(void) -{ - /* initialize xt param value with 0 */ - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = 0; - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = 0; - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] = 0; - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] = 0; - this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] = 0; - - this_afe_spk.p_class = class_create(THIS_MODULE, SPK_PARAMS); - if (this_afe_spk.p_class) { - this_afe_spk.p_dev = device_create(this_afe_spk.p_class, NULL, - 1, NULL, CLASS_NAME); - if (!IS_ERR(this_afe_spk.p_dev)) { - if (sysfs_create_group(&this_afe_spk.p_dev->kobj, - &afe_spk_cal_attr_grp)) - pr_err("%s: Failed to create sysfs group\n", - __func__); - } - } - return 0; -} - -void spk_params_exit(void) -{ - pr_debug("%s\n", __func__); -} diff --git a/techpack/audio/dsp/usf.c b/techpack/audio/dsp/usf.c deleted file mode 100644 index 263ba1f8b04e..000000000000 --- a/techpack/audio/dsp/usf.c +++ /dev/null @@ -1,2474 +0,0 @@ -/* Copyright (c) 2011-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6usm.h" -#include "usf.h" -#include "usfcdev.h" -#include "q6_init.h" - -/* The driver version*/ -#define DRV_VERSION "1.7.1" -#define USF_VERSION_ID 0x0171 - -/* Standard timeout in the asynchronous ops */ -#define USF_TIMEOUT_JIFFIES (1*HZ) /* 1 sec */ - -/* Undefined USF device */ -#define USF_UNDEF_DEV_ID 0xffff - -/* TX memory mapping flag */ -#define USF_VM_READ 1 -/* RX memory mapping flag */ -#define USF_VM_WRITE 2 - -/* Number of events, copied from the user space to kernel one */ -#define USF_EVENTS_PORTION_SIZE 20 - -/* Indexes in range definitions */ -#define MIN_IND 0 -#define MAX_IND 1 - -/* The coordinates indexes */ -#define X_IND 0 -#define Y_IND 1 -#define Z_IND 2 - -/* Shared memory limits */ -/* max_buf_size = (port_size(65535*2) * port_num(8) * group_size(3) */ -#define USF_MAX_BUF_SIZE 3145680 -#define USF_MAX_BUF_NUM 32 - -/* max size for buffer set from user space */ -#define USF_MAX_USER_BUF_SIZE 100000 - -/* Place for opreation result, received from QDSP6 */ -#define APR_RESULT_IND 1 - -/* Place for US detection result, received from QDSP6 */ -#define APR_US_DETECT_RESULT_IND 0 - -#define BITS_IN_BYTE 8 - -/* Time to stay awake after tx read event (e.g., proximity) */ -#define STAY_AWAKE_AFTER_READ_MSECS 3000 - -/* The driver states */ -enum usf_state_type { - USF_IDLE_STATE, - USF_OPENED_STATE, - USF_CONFIGURED_STATE, - USF_WORK_STATE, - USF_ADSP_RESTART_STATE, - USF_ERROR_STATE -}; - -/* The US detection status upon FW/HW based US detection results */ -enum usf_us_detect_type { - USF_US_DETECT_UNDEF, - USF_US_DETECT_YES, - USF_US_DETECT_NO -}; - -struct usf_xx_type { - /* Name of the client - event calculator */ - char client_name[USF_MAX_CLIENT_NAME_SIZE]; - /* The driver state in TX or RX direction */ - enum usf_state_type usf_state; - /* wait for q6 events mechanism */ - wait_queue_head_t wait; - /* IF with q6usm info */ - struct us_client *usc; - /* Q6:USM' Encoder/decoder configuration */ - struct us_encdec_cfg encdec_cfg; - /* Shared buffer (with Q6:USM) size */ - uint32_t buffer_size; - /* Number of the shared buffers (with Q6:USM) */ - uint32_t buffer_count; - /* Shared memory (Cyclic buffer with 1 gap) control */ - uint32_t new_region; - uint32_t prev_region; - /* Q6:USM's events handler */ - void (*cb)(uint32_t, uint32_t, uint32_t *, void *); - /* US detection result */ - enum usf_us_detect_type us_detect_type; - /* User's update info isn't acceptable */ - u8 user_upd_info_na; -}; - -struct usf_type { - /* TX device component configuration & control */ - struct usf_xx_type usf_tx; - /* RX device component configuration & control */ - struct usf_xx_type usf_rx; - /* Index into the opened device container */ - /* To prevent mutual usage of the same device */ - uint16_t dev_ind; - /* Event types, supported by device */ - uint16_t event_types; - /* The input devices are "input" module registered clients */ - struct input_dev *input_ifs[USF_MAX_EVENT_IND]; - /* Bitmap of types of events, conflicting to USF's ones */ - uint16_t conflicting_event_types; - /* Bitmap of types of events from devs, conflicting with USF */ - uint16_t conflicting_event_filters; - /* The requested buttons bitmap */ - uint16_t req_buttons_bitmap; - /* Mutex for exclusive operations (all public APIs) */ - struct mutex mutex; -}; - -struct usf_input_dev_type { - /* Input event type, supported by the input device */ - uint16_t event_type; - /* Input device name */ - const char *input_dev_name; - /* Input device registration function */ - int (*prepare_dev)(uint16_t, struct usf_type *, - struct us_input_info_type *, - const char *); - /* Input event notification function */ - void (*notify_event)(struct usf_type *, - uint16_t, - struct usf_event_type * - ); -}; - - -/* The MAX number of the supported devices */ -#define MAX_DEVS_NUMBER 1 - -/* - * code for a special button that is used to show/hide a - * hovering cursor in the input framework. Must be in - * sync with the button code definition in the framework - * (EventHub.h) - */ -#define BTN_USF_HOVERING_CURSOR 0x230 - -/* Supported buttons container */ -static const int s_button_map[] = { - BTN_STYLUS, - BTN_STYLUS2, - BTN_TOOL_PEN, - BTN_TOOL_RUBBER, - BTN_TOOL_FINGER, - BTN_USF_HOVERING_CURSOR -}; - -/* The opened devices container */ -static atomic_t s_opened_devs[MAX_DEVS_NUMBER]; - -static struct wakeup_source usf_wakeup_source; - -#define USF_NAME_PREFIX "usf_" -#define USF_NAME_PREFIX_SIZE 4 - - -static struct input_dev *allocate_dev(uint16_t ind, const char *name) -{ - struct input_dev *in_dev = input_allocate_device(); - - if (in_dev == NULL) { - pr_err("%s: input_allocate_device() failed\n", __func__); - } else { - /* Common part configuration */ - in_dev->name = name; - in_dev->phys = NULL; - in_dev->id.bustype = BUS_HOST; - in_dev->id.vendor = 0x0001; - in_dev->id.product = 0x0001; - in_dev->id.version = USF_VERSION_ID; - } - return in_dev; -} - -static int prepare_tsc_input_device(uint16_t ind, - struct usf_type *usf_info, - struct us_input_info_type *input_info, - const char *name) -{ - int i = 0; - - int num_buttons = min(ARRAY_SIZE(s_button_map), - sizeof(input_info->req_buttons_bitmap) * - BITS_IN_BYTE); - uint16_t max_buttons_bitmap = ((1 << ARRAY_SIZE(s_button_map)) - 1); - - struct input_dev *in_dev = allocate_dev(ind, name); - - if (in_dev == NULL) - return -ENOMEM; - - if (input_info->req_buttons_bitmap > max_buttons_bitmap) { - pr_err("%s: Requested buttons[%d] exceeds max buttons available[%d]\n", - __func__, - input_info->req_buttons_bitmap, - max_buttons_bitmap); - input_free_device(in_dev); - return -EINVAL; - } - - usf_info->input_ifs[ind] = in_dev; - usf_info->req_buttons_bitmap = - input_info->req_buttons_bitmap; - in_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); - in_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); - - for (i = 0; i < num_buttons; i++) - if (input_info->req_buttons_bitmap & (1 << i)) - in_dev->keybit[BIT_WORD(s_button_map[i])] |= - BIT_MASK(s_button_map[i]); - - input_set_abs_params(in_dev, ABS_X, - input_info->tsc_x_dim[MIN_IND], - input_info->tsc_x_dim[MAX_IND], - 0, 0); - input_set_abs_params(in_dev, ABS_Y, - input_info->tsc_y_dim[MIN_IND], - input_info->tsc_y_dim[MAX_IND], - 0, 0); - input_set_abs_params(in_dev, ABS_DISTANCE, - input_info->tsc_z_dim[MIN_IND], - input_info->tsc_z_dim[MAX_IND], - 0, 0); - - input_set_abs_params(in_dev, ABS_PRESSURE, - input_info->tsc_pressure[MIN_IND], - input_info->tsc_pressure[MAX_IND], - 0, 0); - - input_set_abs_params(in_dev, ABS_TILT_X, - input_info->tsc_x_tilt[MIN_IND], - input_info->tsc_x_tilt[MAX_IND], - 0, 0); - input_set_abs_params(in_dev, ABS_TILT_Y, - input_info->tsc_y_tilt[MIN_IND], - input_info->tsc_y_tilt[MAX_IND], - 0, 0); - - return 0; -} - -static int prepare_mouse_input_device(uint16_t ind, struct usf_type *usf_info, - struct us_input_info_type *input_info, - const char *name) -{ - struct input_dev *in_dev = allocate_dev(ind, name); - - if (in_dev == NULL) - return -ENOMEM; - - usf_info->input_ifs[ind] = in_dev; - in_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); - - in_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | - BIT_MASK(BTN_RIGHT) | - BIT_MASK(BTN_MIDDLE); - in_dev->relbit[0] = BIT_MASK(REL_X) | - BIT_MASK(REL_Y) | - BIT_MASK(REL_Z); - - return 0; -} - -static int prepare_keyboard_input_device( - uint16_t ind, - struct usf_type *usf_info, - struct us_input_info_type *input_info, - const char *name) -{ - struct input_dev *in_dev = allocate_dev(ind, name); - - if (in_dev == NULL) - return -ENOMEM; - - usf_info->input_ifs[ind] = in_dev; - in_dev->evbit[0] |= BIT_MASK(EV_KEY); - /* All keys are permitted */ - memset(in_dev->keybit, 0xff, sizeof(in_dev->keybit)); - - return 0; -} - -static void notify_tsc_event(struct usf_type *usf_info, - uint16_t if_ind, - struct usf_event_type *event) - -{ - int i = 0; - int num_buttons = min(ARRAY_SIZE(s_button_map), - sizeof(usf_info->req_buttons_bitmap) * - BITS_IN_BYTE); - - struct input_dev *input_if = usf_info->input_ifs[if_ind]; - struct point_event_type *pe = &(event->event_data.point_event); - - input_report_abs(input_if, ABS_X, pe->coordinates[X_IND]); - input_report_abs(input_if, ABS_Y, pe->coordinates[Y_IND]); - input_report_abs(input_if, ABS_DISTANCE, pe->coordinates[Z_IND]); - - input_report_abs(input_if, ABS_TILT_X, pe->inclinations[X_IND]); - input_report_abs(input_if, ABS_TILT_Y, pe->inclinations[Y_IND]); - - input_report_abs(input_if, ABS_PRESSURE, pe->pressure); - input_report_key(input_if, BTN_TOUCH, !!(pe->pressure)); - - for (i = 0; i < num_buttons; i++) { - uint16_t mask = (1 << i), - btn_state = !!(pe->buttons_state_bitmap & mask); - if (usf_info->req_buttons_bitmap & mask) - input_report_key(input_if, s_button_map[i], btn_state); - } - - input_sync(input_if); - - pr_debug("%s: TSC event: xyz[%d;%d;%d], incl[%d;%d], pressure[%d], buttons[%d]\n", - __func__, - pe->coordinates[X_IND], - pe->coordinates[Y_IND], - pe->coordinates[Z_IND], - pe->inclinations[X_IND], - pe->inclinations[Y_IND], - pe->pressure, - pe->buttons_state_bitmap); -} - -static void notify_mouse_event(struct usf_type *usf_info, - uint16_t if_ind, - struct usf_event_type *event) -{ - struct input_dev *input_if = usf_info->input_ifs[if_ind]; - struct mouse_event_type *me = &(event->event_data.mouse_event); - - input_report_rel(input_if, REL_X, me->rels[X_IND]); - input_report_rel(input_if, REL_Y, me->rels[Y_IND]); - input_report_rel(input_if, REL_Z, me->rels[Z_IND]); - - input_report_key(input_if, BTN_LEFT, - me->buttons_states & USF_BUTTON_LEFT_MASK); - input_report_key(input_if, BTN_MIDDLE, - me->buttons_states & USF_BUTTON_MIDDLE_MASK); - input_report_key(input_if, BTN_RIGHT, - me->buttons_states & USF_BUTTON_RIGHT_MASK); - - input_sync(input_if); - - pr_debug("%s: mouse event: dx[%d], dy[%d], buttons_states[%d]\n", - __func__, me->rels[X_IND], - me->rels[Y_IND], me->buttons_states); -} - -static void notify_key_event(struct usf_type *usf_info, - uint16_t if_ind, - struct usf_event_type *event) -{ - struct input_dev *input_if = usf_info->input_ifs[if_ind]; - struct key_event_type *ke = &(event->event_data.key_event); - - input_report_key(input_if, ke->key, ke->key_state); - input_sync(input_if); - pr_debug("%s: key event: key[%d], state[%d]\n", - __func__, - ke->key, - ke->key_state); - -} - -static struct usf_input_dev_type s_usf_input_devs[] = { - {USF_TSC_EVENT, "usf_tsc", - prepare_tsc_input_device, notify_tsc_event}, - {USF_TSC_PTR_EVENT, "usf_tsc_ptr", - prepare_tsc_input_device, notify_tsc_event}, - {USF_MOUSE_EVENT, "usf_mouse", - prepare_mouse_input_device, notify_mouse_event}, - {USF_KEYBOARD_EVENT, "usf_kb", - prepare_keyboard_input_device, notify_key_event}, - {USF_TSC_EXT_EVENT, "usf_tsc_ext", - prepare_tsc_input_device, notify_tsc_event}, -}; - -static void usf_rx_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct usf_xx_type *usf_xx = (struct usf_xx_type *) priv; - - if (usf_xx == NULL) { - pr_err("%s: the private data is NULL\n", __func__); - return; - } - - switch (opcode) { - case Q6USM_EVENT_WRITE_DONE: - wake_up(&usf_xx->wait); - break; - - case RESET_EVENTS: - pr_err("%s: received RESET_EVENTS\n", __func__); - usf_xx->usf_state = USF_ADSP_RESTART_STATE; - wake_up(&usf_xx->wait); - break; - - default: - break; - } -} - -static void usf_tx_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct usf_xx_type *usf_xx = (struct usf_xx_type *) priv; - - if (usf_xx == NULL) { - pr_err("%s: the private data is NULL\n", __func__); - return; - } - - switch (opcode) { - case Q6USM_EVENT_READ_DONE: - pr_debug("%s: acquiring %d msec wake lock\n", __func__, - STAY_AWAKE_AFTER_READ_MSECS); - __pm_wakeup_event(&usf_wakeup_source, - STAY_AWAKE_AFTER_READ_MSECS); - if (token == USM_WRONG_TOKEN) - usf_xx->usf_state = USF_ERROR_STATE; - usf_xx->new_region = token; - wake_up(&usf_xx->wait); - break; - - case Q6USM_EVENT_SIGNAL_DETECT_RESULT: - usf_xx->us_detect_type = (payload[APR_US_DETECT_RESULT_IND]) ? - USF_US_DETECT_YES : - USF_US_DETECT_NO; - - wake_up(&usf_xx->wait); - break; - - case APR_BASIC_RSP_RESULT: - if (payload[APR_RESULT_IND]) { - usf_xx->usf_state = USF_ERROR_STATE; - usf_xx->new_region = USM_WRONG_TOKEN; - wake_up(&usf_xx->wait); - } - break; - - case RESET_EVENTS: - pr_err("%s: received RESET_EVENTS\n", __func__); - usf_xx->usf_state = USF_ADSP_RESTART_STATE; - wake_up(&usf_xx->wait); - break; - - default: - break; - } -} - -static void release_xx(struct usf_xx_type *usf_xx) -{ - if (usf_xx != NULL) { - if (usf_xx->usc) { - q6usm_us_client_free(usf_xx->usc); - usf_xx->usc = NULL; - } - - if (usf_xx->encdec_cfg.params != NULL) { - kfree(usf_xx->encdec_cfg.params); - usf_xx->encdec_cfg.params = NULL; - } - } -} - -static void usf_disable(struct usf_xx_type *usf_xx) -{ - if (usf_xx != NULL) { - if ((usf_xx->usf_state != USF_IDLE_STATE) && - (usf_xx->usf_state != USF_OPENED_STATE)) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - usf_xx->usf_state = USF_OPENED_STATE; - wake_up(&usf_xx->wait); - } - release_xx(usf_xx); - } -} - -static int config_xx(struct usf_xx_type *usf_xx, struct us_xx_info_type *config) -{ - int rc = 0; - uint16_t data_map_size = 0; - uint16_t min_map_size = 0; - - if ((usf_xx == NULL) || - (config == NULL)) - return -EINVAL; - - if ((config->buf_size == 0) || - (config->buf_size > USF_MAX_BUF_SIZE) || - (config->buf_num == 0) || - (config->buf_num > USF_MAX_BUF_NUM)) { - pr_err("%s: wrong params: buf_size=%d; buf_num=%d\n", - __func__, config->buf_size, config->buf_num); - return -EINVAL; - } - - data_map_size = sizeof(usf_xx->encdec_cfg.cfg_common.data_map); - min_map_size = min(data_map_size, config->port_cnt); - - if (config->client_name != NULL) { - if (strncpy_from_user(usf_xx->client_name, - (char __user *)config->client_name, - sizeof(usf_xx->client_name) - 1) < 0) { - pr_err("%s: get client name failed\n", __func__); - return -EINVAL; - } - } - - pr_debug("%s: name=%s; buf_size:%d; dev_id:0x%x; sample_rate:%d\n", - __func__, usf_xx->client_name, config->buf_size, - config->dev_id, config->sample_rate); - - pr_debug("%s: buf_num:%d; format:%d; port_cnt:%d; data_size=%d\n", - __func__, config->buf_num, config->stream_format, - config->port_cnt, config->params_data_size); - - pr_debug("%s: id[0]=%d, id[1]=%d, id[2]=%d, id[3]=%d, id[4]=%d,\n", - __func__, - config->port_id[0], - config->port_id[1], - config->port_id[2], - config->port_id[3], - config->port_id[4]); - - pr_debug("id[5]=%d, id[6]=%d, id[7]=%d\n", - config->port_id[5], - config->port_id[6], - config->port_id[7]); - - /* q6usm allocation & configuration */ - usf_xx->buffer_size = config->buf_size; - usf_xx->buffer_count = config->buf_num; - usf_xx->encdec_cfg.cfg_common.bits_per_sample = - config->bits_per_sample; - usf_xx->encdec_cfg.cfg_common.sample_rate = config->sample_rate; - /* AFE port e.g. AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX */ - usf_xx->encdec_cfg.cfg_common.dev_id = config->dev_id; - - usf_xx->encdec_cfg.cfg_common.ch_cfg = config->port_cnt; - memcpy((void *)&usf_xx->encdec_cfg.cfg_common.data_map, - (void *)config->port_id, - min_map_size); - - usf_xx->encdec_cfg.format_id = config->stream_format; - usf_xx->encdec_cfg.params_size = config->params_data_size; - usf_xx->user_upd_info_na = 1; /* it's used in US_GET_TX_UPDATE */ - - if (config->params_data_size > 0) { /* transparent data copy */ - usf_xx->encdec_cfg.params = kzalloc(config->params_data_size, - GFP_KERNEL); - /* False memory leak here - pointer in packed struct - * is undetected by kmemleak tool - */ - kmemleak_ignore(usf_xx->encdec_cfg.params); - if (usf_xx->encdec_cfg.params == NULL) { - pr_err("%s: params memory alloc[%d] failure\n", - __func__, - config->params_data_size); - return -ENOMEM; - } - rc = copy_from_user(usf_xx->encdec_cfg.params, - (uint8_t __user *)config->params_data, - config->params_data_size); - if (rc) { - pr_err("%s: transparent data copy failure\n", - __func__); - kfree(usf_xx->encdec_cfg.params); - usf_xx->encdec_cfg.params = NULL; - return -EFAULT; - } - pr_debug("%s: params_size[%d]; params[%d,%d,%d,%d, %d]\n", - __func__, - config->params_data_size, - usf_xx->encdec_cfg.params[0], - usf_xx->encdec_cfg.params[1], - usf_xx->encdec_cfg.params[2], - usf_xx->encdec_cfg.params[3], - usf_xx->encdec_cfg.params[4] - ); - } - - usf_xx->usc = q6usm_us_client_alloc(usf_xx->cb, (void *)usf_xx); - if (!usf_xx->usc) { - pr_err("%s: Could not allocate q6usm client\n", __func__); - rc = -EFAULT; - } - - return rc; -} - -static bool usf_match(uint16_t event_type_ind, struct input_dev *dev) -{ - bool rc = false; - - rc = (event_type_ind < MAX_EVENT_TYPE_NUM) && - ((dev->name == NULL) || - strcmp(dev->name, USF_NAME_PREFIX)); - pr_debug("%s: name=[%s]; rc=%d\n", - __func__, dev->name, rc); - - return rc; -} - -static bool usf_register_conflicting_events(uint16_t event_types) -{ - bool rc = true; - uint16_t ind = 0; - uint16_t mask = 1; - - for (ind = 0; ind < MAX_EVENT_TYPE_NUM; ++ind) { - if (event_types & mask) { - rc = usfcdev_register(ind, usf_match); - if (!rc) - break; - } - mask = mask << 1; - } - - return rc; -} - -static void usf_unregister_conflicting_events(uint16_t event_types) -{ - uint16_t ind = 0; - uint16_t mask = 1; - - for (ind = 0; ind < MAX_EVENT_TYPE_NUM; ++ind) { - if (event_types & mask) - usfcdev_unregister(ind); - mask = mask << 1; - } -} - -static void usf_set_event_filters(struct usf_type *usf, uint16_t event_filters) -{ - uint16_t ind = 0; - uint16_t mask = 1; - - if (usf->conflicting_event_filters != event_filters) { - for (ind = 0; ind < MAX_EVENT_TYPE_NUM; ++ind) { - if (usf->conflicting_event_types & mask) - usfcdev_set_filter(ind, event_filters&mask); - mask = mask << 1; - } - usf->conflicting_event_filters = event_filters; - } -} - -static int register_input_device(struct usf_type *usf_info, - struct us_input_info_type *input_info) -{ - int rc = 0; - bool ret = true; - uint16_t ind = 0; - - if ((usf_info == NULL) || - (input_info == NULL) || - !(input_info->event_types & USF_ALL_EVENTS)) { - pr_err("%s: wrong input parameter(s)\n", __func__); - return -EINVAL; - } - - for (ind = 0; ind < USF_MAX_EVENT_IND; ++ind) { - if (usf_info->input_ifs[ind] != NULL) { - pr_err("%s: input_if[%d] is already allocated\n", - __func__, ind); - return -EFAULT; - } - if ((input_info->event_types & - s_usf_input_devs[ind].event_type) && - s_usf_input_devs[ind].prepare_dev) { - rc = (*s_usf_input_devs[ind].prepare_dev)( - ind, - usf_info, - input_info, - s_usf_input_devs[ind].input_dev_name); - if (rc) - return rc; - - rc = input_register_device(usf_info->input_ifs[ind]); - if (rc) { - pr_err("%s: input_reg_dev() failed; rc=%d\n", - __func__, rc); - input_free_device(usf_info->input_ifs[ind]); - usf_info->input_ifs[ind] = NULL; - } else { - usf_info->event_types |= - s_usf_input_devs[ind].event_type; - pr_debug("%s: input device[%s] was registered\n", - __func__, - s_usf_input_devs[ind].input_dev_name); - } - } /* supported event */ - } /* event types loop */ - - ret = usf_register_conflicting_events( - input_info->conflicting_event_types); - if (ret) - usf_info->conflicting_event_types = - input_info->conflicting_event_types; - - return 0; -} - - -static void handle_input_event(struct usf_type *usf_info, - uint16_t event_counter, - struct usf_event_type __user *event) -{ - uint16_t ind = 0; - uint16_t events_num = 0; - struct usf_event_type usf_events[USF_EVENTS_PORTION_SIZE]; - int rc = 0; - - if ((usf_info == NULL) || - (event == NULL) || (!event_counter)) { - return; - } - - while (event_counter > 0) { - if (event_counter > USF_EVENTS_PORTION_SIZE) { - events_num = USF_EVENTS_PORTION_SIZE; - event_counter -= USF_EVENTS_PORTION_SIZE; - } else { - events_num = event_counter; - event_counter = 0; - } - rc = copy_from_user(usf_events, - (struct usf_event_type __user *)event, - events_num * sizeof(struct usf_event_type)); - if (rc) { - pr_err("%s: copy upd_rx_info from user; rc=%d\n", - __func__, rc); - return; - } - for (ind = 0; ind < events_num; ++ind) { - struct usf_event_type *p_event = &usf_events[ind]; - uint16_t if_ind = p_event->event_type_ind; - - if ((if_ind >= USF_MAX_EVENT_IND) || - (usf_info->input_ifs[if_ind] == NULL)) - continue; /* event isn't supported */ - - if (s_usf_input_devs[if_ind].notify_event) - (*s_usf_input_devs[if_ind].notify_event)( - usf_info, - if_ind, - p_event); - } /* loop in the portion */ - } /* all events loop */ -} - -static int usf_start_tx(struct usf_xx_type *usf_xx) -{ - int rc = q6usm_run(usf_xx->usc, 0, 0, 0); - - pr_debug("%s: tx: q6usm_run; rc=%d\n", __func__, rc); - if (!rc) { - if (usf_xx->buffer_count >= USM_MIN_BUF_CNT) { - /* supply all buffers */ - rc = q6usm_read(usf_xx->usc, - usf_xx->buffer_count); - pr_debug("%s: q6usm_read[%d]\n", - __func__, rc); - - if (rc) - pr_err("%s: buf read failed", - __func__); - else - usf_xx->usf_state = - USF_WORK_STATE; - } else - usf_xx->usf_state = - USF_WORK_STATE; - } - - return rc; -} /* usf_start_tx */ - -static int usf_start_rx(struct usf_xx_type *usf_xx) -{ - int rc = q6usm_run(usf_xx->usc, 0, 0, 0); - - pr_debug("%s: rx: q6usm_run; rc=%d\n", - __func__, rc); - if (!rc) - usf_xx->usf_state = USF_WORK_STATE; - - return rc; -} /* usf_start_rx */ - -static int __usf_set_us_detection(struct usf_type *usf, - struct us_detect_info_type *detect_info) -{ - uint32_t timeout = 0; - struct usm_session_cmd_detect_info *p_allocated_memory = NULL; - struct usm_session_cmd_detect_info usm_detect_info; - struct usm_session_cmd_detect_info *p_usm_detect_info = - &usm_detect_info; - uint32_t detect_info_size = sizeof(struct usm_session_cmd_detect_info); - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - if (detect_info->us_detector != US_DETECT_FW) { - pr_err("%s: unsupported detector: %d\n", - __func__, detect_info->us_detector); - return -EINVAL; - } - - if ((detect_info->params_data_size != 0) && - (detect_info->params_data != NULL)) { - uint8_t *p_data = NULL; - - detect_info_size += detect_info->params_data_size; - p_allocated_memory = kzalloc(detect_info_size, GFP_KERNEL); - if (p_allocated_memory == NULL) { - pr_err("%s: detect_info[%d] allocation failed\n", - __func__, detect_info_size); - return -ENOMEM; - } - p_usm_detect_info = p_allocated_memory; - p_data = (uint8_t *)p_usm_detect_info + - sizeof(struct usm_session_cmd_detect_info); - - rc = copy_from_user(p_data, - (uint8_t __user *)(detect_info->params_data), - detect_info->params_data_size); - if (rc) { - pr_err("%s: copy params from user; rc=%d\n", - __func__, rc); - kfree(p_allocated_memory); - return -EFAULT; - } - p_usm_detect_info->algorithm_cfg_size = - detect_info->params_data_size; - } else - usm_detect_info.algorithm_cfg_size = 0; - - p_usm_detect_info->detect_mode = detect_info->us_detect_mode; - p_usm_detect_info->skip_interval = detect_info->skip_time; - - usf_xx->us_detect_type = USF_US_DETECT_UNDEF; - - rc = q6usm_set_us_detection(usf_xx->usc, - p_usm_detect_info, - detect_info_size); - if (rc || (detect_info->detect_timeout == USF_NO_WAIT_TIMEOUT)) { - kfree(p_allocated_memory); - return rc; - } - - /* Get US detection result */ - if (detect_info->detect_timeout == USF_INFINITIVE_TIMEOUT) { - rc = wait_event_interruptible(usf_xx->wait, - (usf_xx->us_detect_type != - USF_US_DETECT_UNDEF) || - (usf_xx->usf_state == - USF_ADSP_RESTART_STATE)); - } else { - if (detect_info->detect_timeout == USF_DEFAULT_TIMEOUT) - timeout = USF_TIMEOUT_JIFFIES; - else - timeout = detect_info->detect_timeout * HZ; - } - rc = wait_event_interruptible_timeout(usf_xx->wait, - (usf_xx->us_detect_type != - USF_US_DETECT_UNDEF) || - (usf_xx->usf_state == - USF_ADSP_RESTART_STATE), timeout); - - /* In the case of aDSP restart, "no US" is assumed */ - if (usf_xx->usf_state == USF_ADSP_RESTART_STATE) - rc = -EFAULT; - - /* In the case of timeout, "no US" is assumed */ - if (rc < 0) - pr_err("%s: Getting US detection failed rc[%d]\n", - __func__, rc); - else { - usf->usf_rx.us_detect_type = usf->usf_tx.us_detect_type; - detect_info->is_us = - (usf_xx->us_detect_type == USF_US_DETECT_YES); - } - - kfree(p_allocated_memory); - - return rc; -} /* __usf_set_us_detection */ - -static int usf_set_us_detection(struct usf_type *usf, unsigned long arg) -{ - struct us_detect_info_type detect_info; - - int rc = copy_from_user(&detect_info, - (struct us_detect_info_type __user *) arg, - sizeof(detect_info)); - - if (rc) { - pr_err("%s: copy detect_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (detect_info.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - rc = __usf_set_us_detection(usf, &detect_info); - if (rc < 0) { - pr_err("%s: set us detection failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &detect_info, - sizeof(detect_info)); - if (rc) { - pr_err("%s: copy detect_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_us_detection */ - -static int __usf_set_tx_info(struct usf_type *usf, - struct us_tx_info_type *config_tx) -{ - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - usf_xx->new_region = USM_UNDEF_TOKEN; - usf_xx->prev_region = USM_UNDEF_TOKEN; - usf_xx->cb = usf_tx_cb; - - init_waitqueue_head(&usf_xx->wait); - - if (config_tx->us_xx_info.client_name != NULL) { - int res = strncpy_from_user( - usf_xx->client_name, - (char __user *)(config_tx->us_xx_info.client_name), - sizeof(usf_xx->client_name)-1); - if (res < 0) { - pr_err("%s: get client name failed\n", - __func__); - return -EINVAL; - } - } - - rc = config_xx(usf_xx, &(config_tx->us_xx_info)); - if (rc) - return rc; - - rc = q6usm_open_read(usf_xx->usc, - usf_xx->encdec_cfg.format_id); - if (rc) - return rc; - - rc = q6usm_us_client_buf_alloc(OUT, usf_xx->usc, - usf_xx->buffer_size, - usf_xx->buffer_count); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_us_param_buf_alloc(OUT, usf_xx->usc, - config_tx->us_xx_info.max_get_set_param_buf_size); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_enc_cfg_blk(usf_xx->usc, - &usf_xx->encdec_cfg); - if (!rc && - (config_tx->input_info.event_types != USF_NO_EVENT)) { - rc = register_input_device(usf, - &(config_tx->input_info)); - } - - if (rc) - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - else - usf_xx->usf_state = USF_CONFIGURED_STATE; - - return rc; -} /* __usf_set_tx_info */ - -static int usf_set_tx_info(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_info_type config_tx; - - int rc = copy_from_user(&config_tx, - (struct us_tx_info_type __user *) arg, - sizeof(config_tx)); - - if (rc) { - pr_err("%s: copy config_tx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (config_tx.us_xx_info.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - return __usf_set_tx_info(usf, &config_tx); -} /* usf_set_tx_info */ - -static int __usf_set_rx_info(struct usf_type *usf, - struct us_rx_info_type *config_rx) -{ - struct usf_xx_type *usf_xx = &usf->usf_rx; - int rc = 0; - - usf_xx->new_region = USM_UNDEF_TOKEN; - usf_xx->prev_region = USM_UNDEF_TOKEN; - - usf_xx->cb = usf_rx_cb; - - rc = config_xx(usf_xx, &(config_rx->us_xx_info)); - if (rc) - return rc; - - rc = q6usm_open_write(usf_xx->usc, - usf_xx->encdec_cfg.format_id); - if (rc) - return rc; - - rc = q6usm_us_client_buf_alloc( - IN, - usf_xx->usc, - usf_xx->buffer_size, - usf_xx->buffer_count); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_us_param_buf_alloc(IN, usf_xx->usc, - config_rx->us_xx_info.max_get_set_param_buf_size); - if (rc) { - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - return rc; - } - - rc = q6usm_dec_cfg_blk(usf_xx->usc, - &usf_xx->encdec_cfg); - if (rc) - (void)q6usm_cmd(usf_xx->usc, CMD_CLOSE); - else { - init_waitqueue_head(&usf_xx->wait); - usf_xx->usf_state = USF_CONFIGURED_STATE; - } - - return rc; -} /* __usf_set_rx_info */ - -static int usf_set_rx_info(struct usf_type *usf, unsigned long arg) -{ - struct us_rx_info_type config_rx; - - int rc = copy_from_user(&config_rx, - (struct us_rx_info_type __user *) arg, - sizeof(config_rx)); - - if (rc) { - pr_err("%s: copy config_rx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (config_rx.us_xx_info.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - return __usf_set_rx_info(usf, &config_rx); -} /* usf_set_rx_info */ - -static int __usf_get_tx_update(struct usf_type *usf, - struct us_tx_update_info_type *upd_tx_info) -{ - unsigned long prev_jiffies = 0; - uint32_t timeout = 0; - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - if (!usf_xx->user_upd_info_na) { - usf_set_event_filters(usf, upd_tx_info->event_filters); - handle_input_event(usf, - upd_tx_info->event_counter, - upd_tx_info->event); - - /* Release available regions */ - rc = q6usm_read(usf_xx->usc, - upd_tx_info->free_region); - if (rc) - return rc; - } else - usf_xx->user_upd_info_na = 0; - - /* Get data ready regions */ - if (upd_tx_info->timeout == USF_INFINITIVE_TIMEOUT) { - rc = wait_event_interruptible(usf_xx->wait, - (usf_xx->prev_region != - usf_xx->new_region) || - (usf_xx->usf_state != - USF_WORK_STATE)); - } else { - if (upd_tx_info->timeout == USF_NO_WAIT_TIMEOUT) - rc = (usf_xx->prev_region != usf_xx->new_region); - else { - prev_jiffies = jiffies; - if (upd_tx_info->timeout == USF_DEFAULT_TIMEOUT) { - timeout = USF_TIMEOUT_JIFFIES; - rc = wait_event_timeout( - usf_xx->wait, - (usf_xx->prev_region != - usf_xx->new_region) || - (usf_xx->usf_state != - USF_WORK_STATE), - timeout); - } else { - timeout = upd_tx_info->timeout * HZ; - rc = wait_event_interruptible_timeout( - usf_xx->wait, - (usf_xx->prev_region != - usf_xx->new_region) || - (usf_xx->usf_state != - USF_WORK_STATE), - timeout); - } - } - if (!rc) { - pr_debug("%s: timeout. prev_j=%lu; j=%lu\n", - __func__, prev_jiffies, jiffies); - pr_debug("%s: timeout. prev=%d; new=%d\n", - __func__, usf_xx->prev_region, - usf_xx->new_region); - pr_debug("%s: timeout. free_region=%d;\n", - __func__, upd_tx_info->free_region); - if (usf_xx->prev_region == - usf_xx->new_region) { - pr_err("%s:read data: timeout\n", - __func__); - return -ETIME; - } - } - } - - if ((usf_xx->usf_state != USF_WORK_STATE) || - (rc == -ERESTARTSYS)) { - pr_err("%s: Get ready region failure; state[%d]; rc[%d]\n", - __func__, usf_xx->usf_state, rc); - return -EINTR; - } - - upd_tx_info->ready_region = usf_xx->new_region; - usf_xx->prev_region = upd_tx_info->ready_region; - - if (upd_tx_info->ready_region == USM_WRONG_TOKEN) { - pr_err("%s: TX path corrupted; prev=%d\n", - __func__, usf_xx->prev_region); - return -EIO; - } - - return rc; -} /* __usf_get_tx_update */ - -static int usf_get_tx_update(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_update_info_type upd_tx_info; - - int rc = copy_from_user(&upd_tx_info, - (struct us_tx_update_info_type __user *) arg, - sizeof(upd_tx_info)); - - if (rc < 0) { - pr_err("%s: copy upd_tx_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = __usf_get_tx_update(usf, &upd_tx_info); - if (rc < 0) { - pr_err("%s: get tx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &upd_tx_info, - sizeof(upd_tx_info)); - if (rc) { - pr_err("%s: copy upd_tx_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_tx_update */ - -static int __usf_set_rx_update(struct usf_xx_type *usf_xx, - struct us_rx_update_info_type *upd_rx_info) -{ - int rc = 0; - - /* Send available data regions */ - if (upd_rx_info->ready_region != - usf_xx->buffer_count) { - rc = q6usm_write( - usf_xx->usc, - upd_rx_info->ready_region); - if (rc) - return rc; - } - - /* Get free regions */ - rc = wait_event_timeout( - usf_xx->wait, - !q6usm_is_write_buf_full( - usf_xx->usc, - &(upd_rx_info->free_region)) || - (usf_xx->usf_state == USF_IDLE_STATE), - USF_TIMEOUT_JIFFIES); - - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. wait for write buf not full\n", - __func__); - } else { - if (usf_xx->usf_state != - USF_WORK_STATE) { - pr_err("%s: RX: state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EINTR; - } - } - - return rc; -} /* __usf_set_rx_update */ - -static int usf_set_rx_update(struct usf_xx_type *usf_xx, unsigned long arg) -{ - struct us_rx_update_info_type upd_rx_info; - - int rc = copy_from_user(&upd_rx_info, - (struct us_rx_update_info_type __user *) arg, - sizeof(upd_rx_info)); - - if (rc) { - pr_err("%s: copy upd_rx_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = __usf_set_rx_update(usf_xx, &upd_rx_info); - if (rc < 0) { - pr_err("%s: set rx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &upd_rx_info, - sizeof(upd_rx_info)); - if (rc) { - pr_err("%s: copy rx_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_rx_update */ - -static void usf_release_input(struct usf_type *usf) -{ - uint16_t ind = 0; - - usf_unregister_conflicting_events( - usf->conflicting_event_types); - usf->conflicting_event_types = 0; - for (ind = 0; ind < USF_MAX_EVENT_IND; ++ind) { - if (usf->input_ifs[ind] == NULL) - continue; - input_unregister_device(usf->input_ifs[ind]); - usf->input_ifs[ind] = NULL; - pr_debug("%s input_unregister_device[%s]\n", - __func__, - s_usf_input_devs[ind].input_dev_name); - } -} /* usf_release_input */ - -static int usf_stop_tx(struct usf_type *usf) -{ - struct usf_xx_type *usf_xx = &usf->usf_tx; - - usf_release_input(usf); - usf_disable(usf_xx); - - return 0; -} /* usf_stop_tx */ - -static int __usf_get_version(struct us_version_info_type *version_info) -{ - int rc = 0; - - if (version_info->buf_size < sizeof(DRV_VERSION)) { - pr_err("%s: buf_size (%d) < version string size (%zu)\n", - __func__, version_info->buf_size, sizeof(DRV_VERSION)); - return -EINVAL; - } - - rc = copy_to_user((void __user *)(version_info->pbuf), - DRV_VERSION, - sizeof(DRV_VERSION)); - if (rc) { - pr_err("%s: copy to version_info.pbuf; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* __usf_get_version */ - -static int usf_get_version(unsigned long arg) -{ - struct us_version_info_type version_info; - - int rc = copy_from_user(&version_info, - (struct us_version_info_type __user *) arg, - sizeof(version_info)); - - if (rc) { - pr_err("%s: copy version_info from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = __usf_get_version(&version_info); - if (rc < 0) { - pr_err("%s: get version failed; rc=%d\n", - __func__, rc); - return rc; - } - - rc = copy_to_user((void __user *)arg, - &version_info, - sizeof(version_info)); - if (rc) { - pr_err("%s: copy version_info to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_version */ - -static int __usf_set_stream_param(struct usf_xx_type *usf_xx, - struct us_stream_param_type *set_stream_param, - int dir) -{ - struct us_client *usc = usf_xx->usc; - struct us_port_data *port; - int rc = 0; - - if (usc == NULL) { - pr_err("%s: usc is null\n", - __func__); - return -EFAULT; - } - - port = &usc->port[dir]; - if (port == NULL) { - pr_err("%s: port is null\n", - __func__); - return -EFAULT; - } - - if (port->param_buf == NULL) { - pr_err("%s: parameter buffer is null\n", - __func__); - return -EFAULT; - } - - if (set_stream_param->buf_size > port->param_buf_size) { - pr_err("%s: buf_size (%d) > maximum buf size (%d)\n", - __func__, set_stream_param->buf_size, - port->param_buf_size); - return -EINVAL; - } - - if (set_stream_param->buf_size == 0) { - pr_err("%s: buf_size is 0\n", __func__); - return -EINVAL; - } - - rc = copy_from_user(port->param_buf, - (uint8_t __user *) set_stream_param->pbuf, - set_stream_param->buf_size); - if (rc) { - pr_err("%s: copy param buf from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = q6usm_set_us_stream_param(dir, usc, set_stream_param->module_id, - set_stream_param->param_id, - set_stream_param->buf_size); - if (rc) { - pr_err("%s: q6usm_set_us_stream_param failed; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return rc; -} - -static int usf_set_stream_param(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type set_stream_param; - int rc = 0; - - rc = copy_from_user(&set_stream_param, - (struct us_stream_param_type __user *) arg, - sizeof(set_stream_param)); - - if (rc) { - pr_err("%s: copy set_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return __usf_set_stream_param(usf_xx, &set_stream_param, dir); -} /* usf_set_stream_param */ - -static int __usf_get_stream_param(struct usf_xx_type *usf_xx, - struct us_stream_param_type *get_stream_param, - int dir) -{ - struct us_client *usc = usf_xx->usc; - struct us_port_data *port; - int rc = 0; - - if (usc == NULL) { - pr_err("%s: us_client is null\n", - __func__); - return -EFAULT; - } - - port = &usc->port[dir]; - - if (port->param_buf == NULL) { - pr_err("%s: parameter buffer is null\n", - __func__); - return -EFAULT; - } - - if (get_stream_param->buf_size > port->param_buf_size) { - pr_err("%s: buf_size (%d) > maximum buf size (%d)\n", - __func__, get_stream_param->buf_size, - port->param_buf_size); - return -EINVAL; - } - - if (get_stream_param->buf_size == 0) { - pr_err("%s: buf_size is 0\n", __func__); - return -EINVAL; - } - - rc = q6usm_get_us_stream_param(dir, usc, get_stream_param->module_id, - get_stream_param->param_id, - get_stream_param->buf_size); - if (rc) { - pr_err("%s: q6usm_get_us_stream_param failed; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - rc = copy_to_user((uint8_t __user *) get_stream_param->pbuf, - port->param_buf, - get_stream_param->buf_size); - if (rc) { - pr_err("%s: copy param buf to user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return rc; -} - -static int usf_get_stream_param(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type get_stream_param; - int rc = 0; - - rc = copy_from_user(&get_stream_param, - (struct us_stream_param_type __user *) arg, - sizeof(get_stream_param)); - - if (rc) { - pr_err("%s: copy get_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - return __usf_get_stream_param(usf_xx, &get_stream_param, dir); -} /* usf_get_stream_param */ - -static long __usf_ioctl(struct usf_type *usf, - unsigned int cmd, - unsigned long arg) -{ - - int rc = 0; - struct usf_xx_type *usf_xx = NULL; - - switch (cmd) { - case US_START_TX: { - usf_xx = &usf->usf_tx; - if (usf_xx->usf_state == USF_CONFIGURED_STATE) - rc = usf_start_tx(usf_xx); - else { - pr_err("%s: start_tx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } - - case US_START_RX: { - usf_xx = &usf->usf_rx; - if (usf_xx->usf_state == USF_CONFIGURED_STATE) - rc = usf_start_rx(usf_xx); - else { - pr_err("%s: start_rx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } - - case US_SET_TX_INFO: { - usf_xx = &usf->usf_tx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_tx_info(usf, arg); - else { - pr_err("%s: set_tx_info: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_TX_INFO */ - - case US_SET_RX_INFO: { - usf_xx = &usf->usf_rx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_rx_info(usf, arg); - else { - pr_err("%s: set_rx_info: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_RX_INFO */ - - case US_GET_TX_UPDATE: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_get_tx_update(usf, arg); - else { - pr_err("%s: get_tx_update: wrong state[%d]\n", __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_GET_TX_UPDATE */ - - case US_SET_RX_UPDATE: { - struct usf_xx_type *usf_xx = &usf->usf_rx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_rx_update(usf_xx, arg); - else { - pr_err("%s: set_rx_update: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_RX_UPDATE */ - - case US_STOP_TX: { - usf_xx = &usf->usf_tx; - if ((usf_xx->usf_state == USF_WORK_STATE) - || (usf_xx->usf_state == USF_ADSP_RESTART_STATE)) - rc = usf_stop_tx(usf); - else { - pr_err("%s: stop_tx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } /* US_STOP_TX */ - - case US_STOP_RX: { - usf_xx = &usf->usf_rx; - if ((usf_xx->usf_state == USF_WORK_STATE) - || (usf_xx->usf_state == USF_ADSP_RESTART_STATE)) - usf_disable(usf_xx); - else { - pr_err("%s: stop_rx: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - break; - } /* US_STOP_RX */ - - case US_SET_DETECTION: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_us_detection(usf, arg); - else { - pr_err("%s: set us detection: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_DETECTION */ - - case US_GET_VERSION: { - rc = usf_get_version(arg); - break; - } /* US_GET_VERSION */ - - case US_SET_TX_STREAM_PARAM: { - rc = usf_set_stream_param(&usf->usf_tx, arg, OUT); - break; - } /* US_SET_TX_STREAM_PARAM */ - - case US_GET_TX_STREAM_PARAM: { - rc = usf_get_stream_param(&usf->usf_tx, arg, OUT); - break; - } /* US_GET_TX_STREAM_PARAM */ - - case US_SET_RX_STREAM_PARAM: { - rc = usf_set_stream_param(&usf->usf_rx, arg, IN); - break; - } /* US_SET_RX_STREAM_PARAM */ - - case US_GET_RX_STREAM_PARAM: { - rc = usf_get_stream_param(&usf->usf_rx, arg, IN); - break; - } /* US_GET_RX_STREAM_PARAM */ - - default: - pr_err("%s: unsupported IOCTL command [%d]\n", - __func__, - cmd); - rc = -ENOTTY; - break; - } - - if (rc && - ((cmd == US_SET_TX_INFO) || - (cmd == US_SET_RX_INFO))) - release_xx(usf_xx); - - return rc; -} /* __usf_ioctl */ - -static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct usf_type *usf = file->private_data; - int rc = 0; - - mutex_lock(&usf->mutex); - rc = __usf_ioctl(usf, cmd, arg); - mutex_unlock(&usf->mutex); - - return rc; -} /* usf_ioctl */ - -#ifdef CONFIG_COMPAT - -#define US_SET_TX_INFO32 _IOW(USF_IOCTL_MAGIC, 0, \ - struct us_tx_info_type32) -#define US_GET_TX_UPDATE32 _IOWR(USF_IOCTL_MAGIC, 2, \ - struct us_tx_update_info_type32) -#define US_SET_RX_INFO32 _IOW(USF_IOCTL_MAGIC, 3, \ - struct us_rx_info_type32) -#define US_SET_RX_UPDATE32 _IOWR(USF_IOCTL_MAGIC, 4, \ - struct us_rx_update_info_type32) -#define US_SET_DETECTION32 _IOWR(USF_IOCTL_MAGIC, 8, \ - struct us_detect_info_type32) -#define US_GET_VERSION32 _IOWR(USF_IOCTL_MAGIC, 9, \ - struct us_version_info_type32) -#define US_SET_TX_STREAM_PARAM32 _IOW(USF_IOCTL_MAGIC, 10, \ - struct us_stream_param_type32) -#define US_GET_TX_STREAM_PARAM32 _IOWR(USF_IOCTL_MAGIC, 11, \ - struct us_stream_param_type32) -#define US_SET_RX_STREAM_PARAM32 _IOW(USF_IOCTL_MAGIC, 12, \ - struct us_stream_param_type32) -#define US_GET_RX_STREAM_PARAM32 _IOWR(USF_IOCTL_MAGIC, 13, \ - struct us_stream_param_type32) - -/* Info structure common for TX and RX */ -struct us_xx_info_type32 { -/* Input: general info */ -/* Name of the client - event calculator, ptr to char */ - const compat_uptr_t client_name; -/* Selected device identification, accepted in the kernel's CAD */ - uint32_t dev_id; -/* 0 - point_epos type; (e.g. 1 - gr_mmrd) */ - uint32_t stream_format; -/* Required sample rate in Hz */ - uint32_t sample_rate; -/* Size of a buffer (bytes) for US data transfer between the module and USF */ - uint32_t buf_size; -/* Number of the buffers for the US data transfer */ - uint16_t buf_num; -/* Number of the microphones (TX) or speakers(RX) */ - uint16_t port_cnt; -/* Microphones(TX) or speakers(RX) indexes in their enumeration */ - uint8_t port_id[USF_MAX_PORT_NUM]; -/* Bits per sample 16 or 32 */ - uint16_t bits_per_sample; -/* Input: Transparent info for encoder in the LPASS */ -/* Parameters data size in bytes */ - uint16_t params_data_size; -/* Pointer to the parameters, ptr to uint8_t */ - compat_uptr_t params_data; -/* Max size of buffer for get and set parameter */ - uint32_t max_get_set_param_buf_size; -}; - -struct us_tx_info_type32 { -/* Common info. This struct includes ptr and therefore the 32 version */ - struct us_xx_info_type32 us_xx_info; -/* Info specific for TX. This struct doesn't include long or ptr - * and therefore no 32 version - */ - struct us_input_info_type input_info; -}; - -struct us_tx_update_info_type32 { -/* Input general: */ -/* Number of calculated events */ - uint16_t event_counter; -/* Calculated events or NULL, ptr to struct usf_event_type */ - compat_uptr_t event; -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -/* Time (sec) to wait for data or special values: */ -/* USF_NO_WAIT_TIMEOUT, USF_INFINITIVE_TIMEOUT, USF_DEFAULT_TIMEOUT */ - uint32_t timeout; -/* Events (from conflicting devs) to be disabled/enabled */ - uint16_t event_filters; - -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* Pointer to the parameters, ptr to uint8_t */ - compat_uptr_t params_data; -/* Output parameters: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -}; - -struct us_rx_info_type32 { - /* Common info */ - struct us_xx_info_type32 us_xx_info; - /* Info specific for RX*/ -}; - -struct us_rx_update_info_type32 { -/* Input general: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* pPointer to the parameters, ptr to uint8_t */ - compat_uptr_t params_data; -/* Output parameters: */ -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -}; - -struct us_detect_info_type32 { -/* US detection place (HW|FW) */ -/* NA in the Active and OFF states */ - enum us_detect_place_enum us_detector; -/* US detection mode */ - enum us_detect_mode_enum us_detect_mode; -/* US data dropped during this time (msec) */ - uint32_t skip_time; -/* Transparent data size */ - uint16_t params_data_size; -/* Pointer to the transparent data, ptr to uint8_t */ - compat_uptr_t params_data; -/* Time (sec) to wait for US presence event */ - uint32_t detect_timeout; -/* Out parameter: US presence */ - bool is_us; -}; - -struct us_version_info_type32 { -/* Size of memory for the version string */ - uint16_t buf_size; -/* Pointer to the memory for the version string, ptr to char */ - compat_uptr_t pbuf; -}; - -struct us_stream_param_type32 { -/* Id of module */ - uint32_t module_id; -/* Id of parameter */ - uint32_t param_id; -/* Size of memory of the parameter buffer */ - uint32_t buf_size; -/* Pointer to the memory of the parameter buffer */ - compat_uptr_t pbuf; -}; - -static void usf_compat_xx_info_type(struct us_xx_info_type32 *us_xx_info32, - struct us_xx_info_type *us_xx_info) -{ - int i = 0; - - us_xx_info->client_name = compat_ptr(us_xx_info32->client_name); - us_xx_info->dev_id = us_xx_info32->dev_id; - us_xx_info->stream_format = us_xx_info32->stream_format; - us_xx_info->sample_rate = us_xx_info32->sample_rate; - us_xx_info->buf_size = us_xx_info32->buf_size; - us_xx_info->buf_num = us_xx_info32->buf_num; - us_xx_info->port_cnt = us_xx_info32->port_cnt; - for (i = 0; i < USF_MAX_PORT_NUM; i++) - us_xx_info->port_id[i] = us_xx_info32->port_id[i]; - us_xx_info->bits_per_sample = us_xx_info32->bits_per_sample; - us_xx_info->params_data_size = us_xx_info32->params_data_size; - us_xx_info->params_data = compat_ptr(us_xx_info32->params_data); - us_xx_info->max_get_set_param_buf_size = - us_xx_info32->max_get_set_param_buf_size; -} - -static int usf_set_tx_info32(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_info_type32 config_tx32; - struct us_tx_info_type config_tx; - - int rc = copy_from_user(&config_tx32, - (struct us_tx_info_type32 __user *) arg, - sizeof(config_tx32)); - - if (rc) { - pr_err("%s: copy config_tx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - memset(&config_tx, 0, sizeof(config_tx)); - usf_compat_xx_info_type(&(config_tx32.us_xx_info), - &(config_tx.us_xx_info)); - config_tx.input_info = config_tx32.input_info; - - return __usf_set_tx_info(usf, &config_tx); -} /* usf_set_tx_info 32*/ - -static int usf_set_rx_info32(struct usf_type *usf, unsigned long arg) -{ - struct us_rx_info_type32 config_rx32; - struct us_rx_info_type config_rx; - - int rc = copy_from_user(&config_rx32, - (struct us_rx_info_type32 __user *) arg, - sizeof(config_rx32)); - - if (rc) { - pr_err("%s: copy config_rx from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - memset(&config_rx, 0, sizeof(config_rx)); - usf_compat_xx_info_type(&(config_rx32.us_xx_info), - &(config_rx.us_xx_info)); - - return __usf_set_rx_info(usf, &config_rx); -} /* usf_set_rx_info32 */ - -static int usf_get_tx_update32(struct usf_type *usf, unsigned long arg) -{ - struct us_tx_update_info_type32 upd_tx_info32; - struct us_tx_update_info_type upd_tx_info; - - int rc = copy_from_user(&upd_tx_info32, - (struct us_tx_update_info_type32 __user *) arg, - sizeof(upd_tx_info32)); - - if (rc) { - pr_err("%s: copy upd_tx_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&upd_tx_info, 0, sizeof(upd_tx_info)); - upd_tx_info.event_counter = upd_tx_info32.event_counter; - upd_tx_info.event = compat_ptr(upd_tx_info32.event); - upd_tx_info.free_region = upd_tx_info32.free_region; - upd_tx_info.timeout = upd_tx_info32.timeout; - upd_tx_info.event_filters = upd_tx_info32.event_filters; - upd_tx_info.params_data_size = upd_tx_info32.params_data_size; - upd_tx_info.params_data = compat_ptr(upd_tx_info32.params_data); - upd_tx_info.ready_region = upd_tx_info32.ready_region; - - rc = __usf_get_tx_update(usf, &upd_tx_info); - if (rc < 0) { - pr_err("%s: get tx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* Update only the fields that were changed */ - upd_tx_info32.ready_region = upd_tx_info.ready_region; - - rc = copy_to_user((void __user *)arg, &upd_tx_info32, - sizeof(upd_tx_info32)); - if (rc) { - pr_err("%s: copy upd_tx_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_tx_update */ - -static int usf_set_rx_update32(struct usf_xx_type *usf_xx, unsigned long arg) -{ - struct us_rx_update_info_type32 upd_rx_info32; - struct us_rx_update_info_type upd_rx_info; - - int rc = copy_from_user(&upd_rx_info32, - (struct us_rx_update_info_type32 __user *) arg, - sizeof(upd_rx_info32)); - - if (rc) { - pr_err("%s: copy upd_rx_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&upd_rx_info, 0, sizeof(upd_rx_info)); - upd_rx_info.ready_region = upd_rx_info32.ready_region; - upd_rx_info.params_data_size = upd_rx_info32.params_data_size; - upd_rx_info.params_data = compat_ptr(upd_rx_info32.params_data); - upd_rx_info.free_region = upd_rx_info32.free_region; - - rc = __usf_set_rx_update(usf_xx, &upd_rx_info); - if (rc < 0) { - pr_err("%s: set rx update failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* Update only the fields that were changed */ - upd_rx_info32.free_region = upd_rx_info.free_region; - - rc = copy_to_user((void __user *)arg, - &upd_rx_info32, - sizeof(upd_rx_info32)); - if (rc) { - pr_err("%s: copy rx_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_rx_update32 */ - -static int usf_set_us_detection32(struct usf_type *usf, unsigned long arg) -{ - struct us_detect_info_type32 detect_info32; - struct us_detect_info_type detect_info; - - int rc = copy_from_user(&detect_info32, - (struct us_detect_info_type32 __user *) arg, - sizeof(detect_info32)); - - if (rc) { - pr_err("%s: copy detect_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - if (detect_info32.params_data_size > USF_MAX_USER_BUF_SIZE) { - pr_err("%s: user buffer size exceeds maximum\n", - __func__); - return -EFAULT; - } - - memset(&detect_info, 0, sizeof(detect_info)); - detect_info.us_detector = detect_info32.us_detector; - detect_info.us_detect_mode = detect_info32.us_detect_mode; - detect_info.skip_time = detect_info32.skip_time; - detect_info.params_data_size = detect_info32.params_data_size; - detect_info.params_data = compat_ptr(detect_info32.params_data); - detect_info.detect_timeout = detect_info32.detect_timeout; - detect_info.is_us = detect_info32.is_us; - - rc = __usf_set_us_detection(usf, &detect_info); - if (rc < 0) { - pr_err("%s: set us detection failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* Update only the fields that were changed */ - detect_info32.is_us = detect_info.is_us; - - rc = copy_to_user((void __user *)arg, - &detect_info32, - sizeof(detect_info32)); - if (rc) { - pr_err("%s: copy detect_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_set_us_detection32 */ - -static int usf_get_version32(unsigned long arg) -{ - struct us_version_info_type32 version_info32; - struct us_version_info_type version_info; - - int rc = copy_from_user(&version_info32, - (struct us_version_info_type32 __user *) arg, - sizeof(version_info32)); - - if (rc) { - pr_err("%s: copy version_info32 from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&version_info, 0, sizeof(version_info)); - version_info.buf_size = version_info32.buf_size; - version_info.pbuf = compat_ptr(version_info32.pbuf); - - rc = __usf_get_version(&version_info); - if (rc < 0) { - pr_err("%s: get version failed; rc=%d\n", - __func__, rc); - return rc; - } - - /* None of the fields were changed */ - - rc = copy_to_user((void __user *)arg, - &version_info32, - sizeof(version_info32)); - if (rc) { - pr_err("%s: copy version_info32 to user; rc=%d\n", - __func__, rc); - rc = -EFAULT; - } - - return rc; -} /* usf_get_version32 */ - -static int usf_set_stream_param32(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type32 set_stream_param32; - struct us_stream_param_type set_stream_param; - int rc = 0; - - rc = copy_from_user(&set_stream_param32, - (struct us_stream_param_type32 __user *) arg, - sizeof(set_stream_param32)); - - if (rc) { - pr_err("%s: copy set_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&set_stream_param, 0, sizeof(set_stream_param)); - set_stream_param.module_id = set_stream_param32.module_id; - set_stream_param.param_id = set_stream_param32.param_id; - set_stream_param.buf_size = set_stream_param32.buf_size; - set_stream_param.pbuf = compat_ptr(set_stream_param32.pbuf); - - return __usf_set_stream_param(usf_xx, &set_stream_param, dir); -} /* usf_set_stream_param32 */ - -static int usf_get_stream_param32(struct usf_xx_type *usf_xx, - unsigned long arg, int dir) -{ - struct us_stream_param_type32 get_stream_param32; - struct us_stream_param_type get_stream_param; - int rc = 0; - - rc = copy_from_user(&get_stream_param32, - (struct us_stream_param_type32 __user *) arg, - sizeof(get_stream_param32)); - - if (rc) { - pr_err("%s: copy get_stream_param from user; rc=%d\n", - __func__, rc); - return -EFAULT; - } - - memset(&get_stream_param, 0, sizeof(get_stream_param)); - get_stream_param.module_id = get_stream_param32.module_id; - get_stream_param.param_id = get_stream_param32.param_id; - get_stream_param.buf_size = get_stream_param32.buf_size; - get_stream_param.pbuf = compat_ptr(get_stream_param32.pbuf); - - return __usf_get_stream_param(usf_xx, &get_stream_param, dir); -} /* usf_get_stream_param32 */ - -static long __usf_compat_ioctl(struct usf_type *usf, - unsigned int cmd, - unsigned long arg) -{ - int rc = 0; - struct usf_xx_type *usf_xx = NULL; - - switch (cmd) { - case US_START_TX: - case US_START_RX: - case US_STOP_TX: - case US_STOP_RX: { - return __usf_ioctl(usf, cmd, arg); - } - - case US_SET_TX_INFO32: { - usf_xx = &usf->usf_tx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_tx_info32(usf, arg); - else { - pr_err("%s: set_tx_info32: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_TX_INFO32 */ - - case US_SET_RX_INFO32: { - usf_xx = &usf->usf_rx; - if (usf_xx->usf_state == USF_OPENED_STATE) - rc = usf_set_rx_info32(usf, arg); - else { - pr_err("%s: set_rx_info32: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - return -EBADFD; - } - - break; - } /* US_SET_RX_INFO32 */ - - case US_GET_TX_UPDATE32: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_get_tx_update32(usf, arg); - else { - pr_err("%s: get_tx_update32: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_GET_TX_UPDATE32 */ - - case US_SET_RX_UPDATE32: { - struct usf_xx_type *usf_xx = &usf->usf_rx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_rx_update32(usf_xx, arg); - else { - pr_err("%s: set_rx_update: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_RX_UPDATE32 */ - - case US_SET_DETECTION32: { - struct usf_xx_type *usf_xx = &usf->usf_tx; - - if (usf_xx->usf_state == USF_WORK_STATE) - rc = usf_set_us_detection32(usf, arg); - else { - pr_err("%s: set us detection: wrong state[%d]\n", - __func__, - usf_xx->usf_state); - rc = -EBADFD; - } - break; - } /* US_SET_DETECTION32 */ - - case US_GET_VERSION32: { - rc = usf_get_version32(arg); - break; - } /* US_GET_VERSION32 */ - - case US_SET_TX_STREAM_PARAM32: { - rc = usf_set_stream_param32(&usf->usf_tx, arg, OUT); - break; - } /* US_SET_TX_STREAM_PARAM32 */ - - case US_GET_TX_STREAM_PARAM32: { - rc = usf_get_stream_param32(&usf->usf_tx, arg, OUT); - break; - } /* US_GET_TX_STREAM_PARAM32 */ - - case US_SET_RX_STREAM_PARAM32: { - rc = usf_set_stream_param32(&usf->usf_rx, arg, IN); - break; - } /* US_SET_RX_STREAM_PARAM32 */ - - case US_GET_RX_STREAM_PARAM32: { - rc = usf_get_stream_param32(&usf->usf_rx, arg, IN); - break; - } /* US_GET_RX_STREAM_PARAM32 */ - - default: - pr_err("%s: unsupported IOCTL command [%d]\n", - __func__, - cmd); - rc = -ENOTTY; - break; - } - - if (rc && - ((cmd == US_SET_TX_INFO) || - (cmd == US_SET_RX_INFO))) - release_xx(usf_xx); - - return rc; -} /* __usf_compat_ioctl */ - -static long usf_compat_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg) -{ - struct usf_type *usf = file->private_data; - int rc = 0; - - mutex_lock(&usf->mutex); - rc = __usf_compat_ioctl(usf, cmd, arg); - mutex_unlock(&usf->mutex); - - return rc; -} /* usf_compat_ioctl */ -#endif /* CONFIG_COMPAT */ - -static int usf_mmap(struct file *file, struct vm_area_struct *vms) -{ - struct usf_type *usf = file->private_data; - int dir = OUT; - struct usf_xx_type *usf_xx = &usf->usf_tx; - int rc = 0; - - mutex_lock(&usf->mutex); - if (vms->vm_flags & USF_VM_WRITE) { /* RX buf mapping */ - dir = IN; - usf_xx = &usf->usf_rx; - } - rc = q6usm_get_virtual_address(dir, usf_xx->usc, vms); - mutex_unlock(&usf->mutex); - - return rc; -} - -static uint16_t add_opened_dev(int minor) -{ - uint16_t ind = 0; - - for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) { - if (minor == atomic_cmpxchg(&s_opened_devs[ind], 0, minor)) { - pr_err("%s: device %d is already opened\n", - __func__, minor); - return USF_UNDEF_DEV_ID; - } else { - pr_debug("%s: device %d is added; ind=%d\n", - __func__, minor, ind); - return ind; - } - } - - pr_err("%s: there is no place for device %d\n", - __func__, minor); - return USF_UNDEF_DEV_ID; -} - -static int usf_open(struct inode *inode, struct file *file) -{ - struct usf_type *usf = NULL; - uint16_t dev_ind = 0; - int minor = MINOR(inode->i_rdev); - - dev_ind = add_opened_dev(minor); - if (dev_ind == USF_UNDEF_DEV_ID) - return -EBUSY; - - usf = kzalloc(sizeof(struct usf_type), GFP_KERNEL); - if (usf == NULL) - return -ENOMEM; - - wakeup_source_init(&usf_wakeup_source, "usf"); - - file->private_data = usf; - usf->dev_ind = dev_ind; - - usf->usf_tx.usf_state = USF_OPENED_STATE; - usf->usf_rx.usf_state = USF_OPENED_STATE; - - usf->usf_tx.us_detect_type = USF_US_DETECT_UNDEF; - usf->usf_rx.us_detect_type = USF_US_DETECT_UNDEF; - - mutex_init(&usf->mutex); - - pr_debug("%s:usf in open\n", __func__); - return 0; -} - -static int usf_release(struct inode *inode, struct file *file) -{ - struct usf_type *usf = file->private_data; - - pr_debug("%s: release entry\n", __func__); - - mutex_lock(&usf->mutex); - usf_release_input(usf); - - usf_disable(&usf->usf_tx); - usf_disable(&usf->usf_rx); - - atomic_set(&s_opened_devs[usf->dev_ind], 0); - - wakeup_source_trash(&usf_wakeup_source); - mutex_unlock(&usf->mutex); - mutex_destroy(&usf->mutex); - kfree(usf); - pr_debug("%s: release exit\n", __func__); - return 0; -} - -extern long usf_compat_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg); - -static const struct file_operations usf_fops = { - .owner = THIS_MODULE, - .open = usf_open, - .release = usf_release, - .unlocked_ioctl = usf_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = usf_compat_ioctl, -#endif /* CONFIG_COMPAT */ - .mmap = usf_mmap, -}; - -static struct miscdevice usf_misc[MAX_DEVS_NUMBER] = { - { - .minor = MISC_DYNAMIC_MINOR, - .name = "usf1", - .fops = &usf_fops, - }, -}; - -static int __init usf_init(void) -{ - int rc = 0; - uint16_t ind = 0; - - pr_debug("%s: USF SW version %s.\n", __func__, DRV_VERSION); - pr_debug("%s: Max %d devs registration\n", __func__, MAX_DEVS_NUMBER); - - for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) { - rc = misc_register(&usf_misc[ind]); - if (rc) { - pr_err("%s: misc_register() failed ind=%d; rc = %d\n", - __func__, ind, rc); - break; - } - } - if (!rc) q6usm_init(); - - return rc; -} -module_init(usf_init); - -static void __exit usf_exit(void) -{ - uint16_t ind = 0; - - for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) - misc_deregister(&usf_misc[ind]); -} -module_exit(usf_exit); -MODULE_DESCRIPTION("Ultrasound framework driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/dsp/usf.h b/techpack/audio/dsp/usf.h deleted file mode 100644 index 544b624c2cda..000000000000 --- a/techpack/audio/dsp/usf.h +++ /dev/null @@ -1,298 +0,0 @@ -/* Copyright (c) 2011-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __USF_H__ -#define __USF_H__ - -#include -#include - -#define USF_IOCTL_MAGIC 'U' - -#define US_SET_TX_INFO _IOW(USF_IOCTL_MAGIC, 0, \ - struct us_tx_info_type) -#define US_START_TX _IO(USF_IOCTL_MAGIC, 1) -#define US_GET_TX_UPDATE _IOWR(USF_IOCTL_MAGIC, 2, \ - struct us_tx_update_info_type) -#define US_SET_RX_INFO _IOW(USF_IOCTL_MAGIC, 3, \ - struct us_rx_info_type) -#define US_SET_RX_UPDATE _IOWR(USF_IOCTL_MAGIC, 4, \ - struct us_rx_update_info_type) -#define US_START_RX _IO(USF_IOCTL_MAGIC, 5) - -#define US_STOP_TX _IO(USF_IOCTL_MAGIC, 6) -#define US_STOP_RX _IO(USF_IOCTL_MAGIC, 7) - -#define US_SET_DETECTION _IOWR(USF_IOCTL_MAGIC, 8, \ - struct us_detect_info_type) - -#define US_GET_VERSION _IOWR(USF_IOCTL_MAGIC, 9, \ - struct us_version_info_type) - -#define US_SET_TX_STREAM_PARAM _IOW(USF_IOCTL_MAGIC, 10, \ - struct us_stream_param_type) -#define US_GET_TX_STREAM_PARAM _IOWR(USF_IOCTL_MAGIC, 11, \ - struct us_stream_param_type) -#define US_SET_RX_STREAM_PARAM _IOW(USF_IOCTL_MAGIC, 12, \ - struct us_stream_param_type) -#define US_GET_RX_STREAM_PARAM _IOWR(USF_IOCTL_MAGIC, 13, \ - struct us_stream_param_type) - -/* Special timeout values */ -#define USF_NO_WAIT_TIMEOUT 0x00000000 -/* Infinitive */ -#define USF_INFINITIVE_TIMEOUT 0xffffffff -/* Default value, used by the driver */ -#define USF_DEFAULT_TIMEOUT 0xfffffffe - -/* US detection place (HW|FW) */ -enum us_detect_place_enum { -/* US is detected in HW */ - US_DETECT_HW, -/* US is detected in FW */ - US_DETECT_FW -}; - -/* US detection mode */ -enum us_detect_mode_enum { -/* US detection is disabled */ - US_DETECT_DISABLED_MODE, -/* US detection is enabled in continue mode */ - US_DETECT_CONTINUE_MODE, -/* US detection is enabled in one shot mode */ - US_DETECT_SHOT_MODE -}; - -/* Encoder (TX), decoder (RX) supported US data formats */ -#define USF_POINT_EPOS_FORMAT 0 -#define USF_RAW_FORMAT 1 - -/* Indexes of event types, produced by the calculators */ -#define USF_TSC_EVENT_IND 0 -#define USF_TSC_PTR_EVENT_IND 1 -#define USF_MOUSE_EVENT_IND 2 -#define USF_KEYBOARD_EVENT_IND 3 -#define USF_TSC_EXT_EVENT_IND 4 -#define USF_MAX_EVENT_IND 5 - -/* Types of events, produced by the calculators */ -#define USF_NO_EVENT 0 -#define USF_TSC_EVENT (1 << USF_TSC_EVENT_IND) -#define USF_TSC_PTR_EVENT (1 << USF_TSC_PTR_EVENT_IND) -#define USF_MOUSE_EVENT (1 << USF_MOUSE_EVENT_IND) -#define USF_KEYBOARD_EVENT (1 << USF_KEYBOARD_EVENT_IND) -#define USF_TSC_EXT_EVENT (1 << USF_TSC_EXT_EVENT_IND) -#define USF_ALL_EVENTS (USF_TSC_EVENT |\ - USF_TSC_PTR_EVENT |\ - USF_MOUSE_EVENT |\ - USF_KEYBOARD_EVENT |\ - USF_TSC_EXT_EVENT) - -/* min, max array dimension */ -#define MIN_MAX_DIM 2 - -/* coordinates (x,y,z) array dimension */ -#define COORDINATES_DIM 3 - -/* tilts (x,y) array dimension */ -#define TILTS_DIM 2 - -/* Max size of the client name */ -#define USF_MAX_CLIENT_NAME_SIZE 20 - -/* Max number of the ports (mics/speakers) */ -#define USF_MAX_PORT_NUM 8 - -/* Info structure common for TX and RX */ -struct us_xx_info_type { -/* Input: general info */ -/* Name of the client - event calculator */ - const char __user *client_name; -/* Selected device identification, accepted in the kernel's CAD */ - uint32_t dev_id; -/* 0 - point_epos type; (e.g. 1 - gr_mmrd) */ - uint32_t stream_format; -/* Required sample rate in Hz */ - uint32_t sample_rate; -/* Size of a buffer (bytes) for US data transfer between the module and USF */ - uint32_t buf_size; -/* Number of the buffers for the US data transfer */ - uint16_t buf_num; -/* Number of the microphones (TX) or speakers(RX) */ - uint16_t port_cnt; -/* Microphones(TX) or speakers(RX) indexes in their enumeration */ - uint8_t port_id[USF_MAX_PORT_NUM]; -/* Bits per sample 16 or 32 */ - uint16_t bits_per_sample; -/* Input: Transparent info for encoder in the LPASS */ -/* Parameters data size in bytes */ - uint16_t params_data_size; -/* Pointer to the parameters */ - uint8_t __user *params_data; -/* Max size of buffer for get and set parameter */ - uint32_t max_get_set_param_buf_size; -}; - -struct us_input_info_type { - /* Touch screen dimensions: min & max;for input module */ - int tsc_x_dim[MIN_MAX_DIM]; - int tsc_y_dim[MIN_MAX_DIM]; - int tsc_z_dim[MIN_MAX_DIM]; - /* Touch screen tilt dimensions: min & max;for input module */ - int tsc_x_tilt[MIN_MAX_DIM]; - int tsc_y_tilt[MIN_MAX_DIM]; - /* Touch screen pressure limits: min & max; for input module */ - int tsc_pressure[MIN_MAX_DIM]; - /* The requested buttons bitmap */ - uint16_t req_buttons_bitmap; - /* Bitmap of types of events (USF_X_EVENT), produced by calculator */ - uint16_t event_types; - /* Bitmap of types of events from devs, conflicting with USF */ - uint16_t conflicting_event_types; -}; - -struct us_tx_info_type { - /* Common info */ - struct us_xx_info_type us_xx_info; - /* Info specific for TX*/ - struct us_input_info_type input_info; -}; - -struct us_rx_info_type { - /* Common info */ - struct us_xx_info_type us_xx_info; - /* Info specific for RX*/ -}; - -struct point_event_type { -/* Pen coordinates (x, y, z) in units, defined by */ - int coordinates[COORDINATES_DIM]; - /* {x;y} in transparent units */ - int inclinations[TILTS_DIM]; -/* [0-1023] (10bits); 0 - pen up */ - uint32_t pressure; -/* Bitmap for button state. 1 - down, 0 - up */ - uint16_t buttons_state_bitmap; -}; - -/* Mouse buttons, supported by USF */ -#define USF_BUTTON_LEFT_MASK 1 -#define USF_BUTTON_MIDDLE_MASK 2 -#define USF_BUTTON_RIGHT_MASK 4 -struct mouse_event_type { -/* The mouse relative movement (dX, dY, dZ) */ - int rels[COORDINATES_DIM]; -/* Bitmap of mouse buttons states: 1 - down, 0 - up; */ - uint16_t buttons_states; -}; - -struct key_event_type { -/* Calculated MS key- see input.h. */ - uint32_t key; -/* Keyboard's key state: 1 - down, 0 - up; */ - uint8_t key_state; -}; - -struct usf_event_type { -/* Event sequence number */ - uint32_t seq_num; -/* Event generation system time */ - uint32_t timestamp; -/* Destination input event type index (e.g. touch screen, mouse, key) */ - uint16_t event_type_ind; - union { - struct point_event_type point_event; - struct mouse_event_type mouse_event; - struct key_event_type key_event; - } event_data; -}; - -struct us_tx_update_info_type { -/* Input general: */ -/* Number of calculated events */ - uint16_t event_counter; -/* Calculated events or NULL */ - struct usf_event_type __user *event; -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -/* Time (sec) to wait for data or special values: */ -/* USF_NO_WAIT_TIMEOUT, USF_INFINITIVE_TIMEOUT, USF_DEFAULT_TIMEOUT */ - uint32_t timeout; -/* Events (from conflicting devs) to be disabled/enabled */ - uint16_t event_filters; - -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* Pointer to the parameters */ - uint8_t __user *params_data; -/* Output parameters: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -}; - -struct us_rx_update_info_type { -/* Input general: */ -/* Pointer (write index) to the end of ready US data region */ -/* in the shared memory */ - uint32_t ready_region; -/* Input transparent data: */ -/* Parameters size */ - uint16_t params_data_size; -/* pPointer to the parameters */ - uint8_t __user *params_data; -/* Output parameters: */ -/* Pointer (read index) to the end of available region */ -/* in the shared US data memory */ - uint32_t free_region; -}; - -struct us_detect_info_type { -/* US detection place (HW|FW) */ -/* NA in the Active and OFF states */ - enum us_detect_place_enum us_detector; -/* US detection mode */ - enum us_detect_mode_enum us_detect_mode; -/* US data dropped during this time (msec) */ - uint32_t skip_time; -/* Transparent data size */ - uint16_t params_data_size; -/* Pointer to the transparent data */ - uint8_t __user *params_data; -/* Time (sec) to wait for US presence event */ - uint32_t detect_timeout; -/* Out parameter: US presence */ - bool is_us; -}; - -struct us_version_info_type { -/* Size of memory for the version string */ - uint16_t buf_size; -/* Pointer to the memory for the version string */ - char __user *pbuf; -}; - -struct us_stream_param_type { -/* Id of module */ - uint32_t module_id; -/* Id of parameter */ - uint32_t param_id; -/* Size of memory of the parameter buffer */ - uint32_t buf_size; -/* Pointer to the memory of the parameter buffer */ - uint8_t __user *pbuf; -}; - -#endif /* __USF_H__ */ diff --git a/techpack/audio/dsp/usfcdev.c b/techpack/audio/dsp/usfcdev.c deleted file mode 100644 index 289616669f48..000000000000 --- a/techpack/audio/dsp/usfcdev.c +++ /dev/null @@ -1,413 +0,0 @@ -/* Copyright (c) 2012-2013, 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "usfcdev.h" - -#define UNDEF_ID 0xffffffff -#define SLOT_CMD_ID 0 -#define MAX_RETRIES 10 - -enum usdev_event_status { - USFCDEV_EVENT_ENABLED, - USFCDEV_EVENT_DISABLING, - USFCDEV_EVENT_DISABLED, -}; - -struct usfcdev_event { - bool (*match_cb)(uint16_t, struct input_dev *dev); - bool registered_event; - bool interleaved; - enum usdev_event_status event_status; -}; -static struct usfcdev_event s_usfcdev_events[MAX_EVENT_TYPE_NUM]; - -struct usfcdev_input_command { - unsigned int type; - unsigned int code; - unsigned int value; -}; - -static long s_usf_pid; - -static bool usfcdev_filter(struct input_handle *handle, - unsigned int type, unsigned int code, int value); -static bool usfcdev_match(struct input_handler *handler, - struct input_dev *dev); -static int usfcdev_connect(struct input_handler *handler, - struct input_dev *dev, - const struct input_device_id *id); -static void usfcdev_disconnect(struct input_handle *handle); - -static const struct input_device_id usfc_tsc_ids[] = { - { - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | - INPUT_DEVICE_ID_MATCH_KEYBIT | - INPUT_DEVICE_ID_MATCH_ABSBIT, - .evbit = { BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY) }, - .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) }, - /* assumption: ABS_X & ABS_Y are in the same long */ - .absbit = { [BIT_WORD(ABS_X)] = BIT_MASK(ABS_X) | - BIT_MASK(ABS_Y) }, - }, - { - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | - INPUT_DEVICE_ID_MATCH_KEYBIT | - INPUT_DEVICE_ID_MATCH_ABSBIT, - .evbit = { BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY) }, - .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) }, - /* assumption: MT_.._X & MT_.._Y are in the same long */ - .absbit = { [BIT_WORD(ABS_MT_POSITION_X)] = - BIT_MASK(ABS_MT_POSITION_X) | - BIT_MASK(ABS_MT_POSITION_Y) }, - }, - { } /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE(input, usfc_tsc_ids); - -static struct input_handler s_usfc_handlers[MAX_EVENT_TYPE_NUM] = { - { /* TSC handler */ - .filter = usfcdev_filter, - .match = usfcdev_match, - .connect = usfcdev_connect, - .disconnect = usfcdev_disconnect, - /* .minor can be used as index in the container, */ - /* because .fops isn't supported */ - .minor = TSC_EVENT_TYPE_IND, - .name = "usfc_tsc_handler", - .id_table = usfc_tsc_ids, - }, -}; - -/* - * For each event type, there are a number conflicting devices (handles) - * The first registered device (primary) is real TSC device; it's mandatory - * Optionally, later registered devices are simulated ones. - * They are dynamically managed - * The primary device's handles are stored in the below static array - */ -static struct input_handle s_usfc_primary_handles[MAX_EVENT_TYPE_NUM] = { - { /* TSC handle */ - .handler = &s_usfc_handlers[TSC_EVENT_TYPE_IND], - .name = "usfc_tsc_handle", - }, -}; - -static struct usfcdev_input_command initial_clear_cmds[] = { - {EV_ABS, ABS_PRESSURE, 0}, - {EV_KEY, BTN_TOUCH, 0}, -}; - -static struct usfcdev_input_command slot_clear_cmds[] = { - {EV_ABS, ABS_MT_SLOT, 0}, - {EV_ABS, ABS_MT_TRACKING_ID, UNDEF_ID}, -}; - -static struct usfcdev_input_command no_filter_cmds[] = { - {EV_ABS, ABS_MT_SLOT, 0}, - {EV_ABS, ABS_MT_TRACKING_ID, UNDEF_ID}, - {EV_SYN, SYN_REPORT, 0}, -}; - -static bool usfcdev_match(struct input_handler *handler, struct input_dev *dev) -{ - bool rc = false; - int ind = handler->minor; - - pr_debug("%s: name=[%s]; ind=%d\n", __func__, dev->name, ind); - - if (s_usfcdev_events[ind].registered_event && - s_usfcdev_events[ind].match_cb) { - rc = (*s_usfcdev_events[ind].match_cb)((uint16_t)ind, dev); - pr_debug("%s: [%s]; rc=%d\n", __func__, dev->name, rc); - } - return rc; -} - -static int usfcdev_connect(struct input_handler *handler, struct input_dev *dev, - const struct input_device_id *id) -{ - int ret = 0; - uint16_t ind = handler->minor; - struct input_handle *usfc_handle = NULL; - - if (s_usfc_primary_handles[ind].dev == NULL) { - pr_debug("%s: primary device; ind=%d\n", - __func__, - ind); - usfc_handle = &s_usfc_primary_handles[ind]; - } else { - pr_debug("%s: secondary device; ind=%d\n", - __func__, - ind); - usfc_handle = kzalloc(sizeof(struct input_handle), - GFP_KERNEL); - if (!usfc_handle) - return -ENOMEM; - - usfc_handle->handler = &s_usfc_handlers[ind]; - usfc_handle->name = s_usfc_primary_handles[ind].name; - } - usfc_handle->dev = dev; - ret = input_register_handle(usfc_handle); - pr_debug("%s: name=[%s]; ind=%d; dev=0x%pK\n", - __func__, - dev->name, - ind, - usfc_handle->dev); - if (ret) - pr_err("%s: input_register_handle[%d] failed: ret=%d\n", - __func__, - ind, - ret); - else { - ret = input_open_device(usfc_handle); - if (ret) { - pr_err("%s: input_open_device[%d] failed: ret=%d\n", - __func__, - ind, - ret); - input_unregister_handle(usfc_handle); - } else - pr_debug("%s: device[%d] is opened\n", - __func__, - ind); - } - - return ret; -} - -static void usfcdev_disconnect(struct input_handle *handle) -{ - int ind = handle->handler->minor; - - input_close_device(handle); - input_unregister_handle(handle); - pr_debug("%s: handle[%d], name=[%s] is disconnected\n", - __func__, - ind, - handle->dev->name); - if (s_usfc_primary_handles[ind].dev == handle->dev) - s_usfc_primary_handles[ind].dev = NULL; - else - kfree(handle); -} - -static bool usfcdev_filter(struct input_handle *handle, - unsigned int type, unsigned int code, int value) -{ - uint16_t i = 0; - uint16_t ind = (uint16_t)handle->handler->minor; - bool rc = (s_usfcdev_events[ind].event_status != USFCDEV_EVENT_ENABLED); - - if (s_usf_pid == current->pid) { - /* Pass events from usfcdev driver */ - rc = false; - pr_debug("%s: event_type=%d; type=%d; code=%d; val=%d", - __func__, - ind, - type, - code, - value); - } else if (s_usfcdev_events[ind].event_status == - USFCDEV_EVENT_DISABLING) { - uint32_t u_value = value; - - s_usfcdev_events[ind].interleaved = true; - /* Pass events for freeing slots from TSC driver */ - for (i = 0; i < ARRAY_SIZE(no_filter_cmds); ++i) { - if ((no_filter_cmds[i].type == type) && - (no_filter_cmds[i].code == code) && - (no_filter_cmds[i].value <= u_value)) { - rc = false; - pr_debug("%s: no_filter_cmds[%d]; %d", - __func__, - i, - no_filter_cmds[i].value); - break; - } - } - } - - return rc; -} - -bool usfcdev_register( - uint16_t event_type_ind, - bool (*match_cb)(uint16_t, struct input_dev *dev)) -{ - int ret = 0; - bool rc = false; - - if ((event_type_ind >= MAX_EVENT_TYPE_NUM) || !match_cb) { - pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%pK\n", - __func__, - event_type_ind, - match_cb); - return false; - } - - if (s_usfcdev_events[event_type_ind].registered_event) { - pr_info("%s: handler[%d] was already registered\n", - __func__, - event_type_ind); - return true; - } - - s_usfcdev_events[event_type_ind].registered_event = true; - s_usfcdev_events[event_type_ind].match_cb = match_cb; - s_usfcdev_events[event_type_ind].event_status = USFCDEV_EVENT_ENABLED; - ret = input_register_handler(&s_usfc_handlers[event_type_ind]); - if (!ret) { - rc = true; - pr_debug("%s: handler[%d] was registered\n", - __func__, - event_type_ind); - } else { - s_usfcdev_events[event_type_ind].registered_event = false; - s_usfcdev_events[event_type_ind].match_cb = NULL; - pr_err("%s: handler[%d] registration failed: ret=%d\n", - __func__, - event_type_ind, - ret); - } - - return rc; -} - -void usfcdev_unregister(uint16_t event_type_ind) -{ - if (event_type_ind >= MAX_EVENT_TYPE_NUM) { - pr_err("%s: wrong input: event_type_ind=%d\n", - __func__, - event_type_ind); - return; - } - if (s_usfcdev_events[event_type_ind].registered_event) { - input_unregister_handler(&s_usfc_handlers[event_type_ind]); - pr_debug("%s: handler[%d] was unregistered\n", - __func__, - event_type_ind); - s_usfcdev_events[event_type_ind].registered_event = false; - s_usfcdev_events[event_type_ind].match_cb = NULL; - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_ENABLED; - - } -} - -static inline void usfcdev_send_cmd( - struct input_dev *dev, - struct usfcdev_input_command cmd) -{ - input_event(dev, cmd.type, cmd.code, cmd.value); -} - -static void usfcdev_clean_dev(uint16_t event_type_ind) -{ - struct input_dev *dev = NULL; - int i; - int j; - int retries = 0; - - if (event_type_ind >= MAX_EVENT_TYPE_NUM) { - pr_err("%s: wrong input: event_type_ind=%d\n", - __func__, - event_type_ind); - return; - } - /* Only primary device must exist */ - dev = s_usfc_primary_handles[event_type_ind].dev; - if (dev == NULL) { - pr_err("%s: NULL primary device\n", - __func__); - return; - } - - for (i = 0; i < ARRAY_SIZE(initial_clear_cmds); i++) - usfcdev_send_cmd(dev, initial_clear_cmds[i]); - input_sync(dev); - - /* Send commands to free all slots */ - for (i = 0; i < dev->mt->num_slots; i++) { - s_usfcdev_events[event_type_ind].interleaved = false; - if (input_mt_get_value(&dev->mt->slots[i], - ABS_MT_TRACKING_ID) < 0) { - pr_debug("%s: skipping slot %d", - __func__, i); - continue; - } - slot_clear_cmds[SLOT_CMD_ID].value = i; - for (j = 0; j < ARRAY_SIZE(slot_clear_cmds); j++) - usfcdev_send_cmd(dev, slot_clear_cmds[j]); - - if (s_usfcdev_events[event_type_ind].interleaved) { - pr_debug("%s: interleaved(%d): slot(%d)", - __func__, i, dev->mt->slot); - if (retries++ < MAX_RETRIES) { - --i; - continue; - } - pr_warn("%s: index(%d) reached max retires", - __func__, i); - } - - retries = 0; - input_sync(dev); - } -} - -bool usfcdev_set_filter(uint16_t event_type_ind, bool filter) -{ - bool rc = true; - - if (event_type_ind >= MAX_EVENT_TYPE_NUM) { - pr_err("%s: wrong input: event_type_ind=%d\n", - __func__, - event_type_ind); - return false; - } - - if (s_usfcdev_events[event_type_ind].registered_event) { - - pr_debug("%s: event_type[%d]; filter=%d\n", - __func__, - event_type_ind, - filter - ); - if (filter) { - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_DISABLING; - s_usf_pid = current->pid; - usfcdev_clean_dev(event_type_ind); - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_DISABLED; - } else - s_usfcdev_events[event_type_ind].event_status = - USFCDEV_EVENT_ENABLED; - } else { - pr_err("%s: event_type[%d] isn't registered\n", - __func__, - event_type_ind); - rc = false; - } - - return rc; -} diff --git a/techpack/audio/dsp/usfcdev.h b/techpack/audio/dsp/usfcdev.h deleted file mode 100644 index 03b62c5ec83c..000000000000 --- a/techpack/audio/dsp/usfcdev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2012, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __USFCDEV_H__ -#define __USFCDEV_H__ - -#include - -/* TSC event type index in the containers of the handlers & handles */ -#define TSC_EVENT_TYPE_IND 0 -/* Number of supported event types to be filtered */ -#define MAX_EVENT_TYPE_NUM 1 - -bool usfcdev_register( - uint16_t event_type_ind, - bool (*match_cb)(uint16_t, struct input_dev *dev)); -void usfcdev_unregister(uint16_t event_type_ind); -bool usfcdev_set_filter(uint16_t event_type_ind, bool filter); -#endif /* __USFCDEV_H__ */ diff --git a/techpack/audio/dsp/voice_mhi.c b/techpack/audio/dsp/voice_mhi.c deleted file mode 100644 index eeaa073efebc..000000000000 --- a/techpack/audio/dsp/voice_mhi.c +++ /dev/null @@ -1,628 +0,0 @@ -/* Copyright (c) 2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp_err.h" - -#define VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG 0x0001333B - -#define VOICE_MHI_STATE_SET(a, b) ((a) |= (1UL<<(b))) -#define VOICE_MHI_STATE_RESET(a, b) ((a) &= ~(1UL<<(b))) -#define VOICE_MHI_STATE_CHECK(a, b) (1UL & (a >> b)) - -#define CMD_STATUS_SUCCESS 0 -#define CMD_STATUS_FAIL 1 -#define TIMEOUT_MS 500 -#define PORT_NUM 0x01 -#define PORT_MASK 0x03 -#define CONVERT_PORT_APR(x, y) (x << 8 | y) - -enum voice_states { - VOICE_MHI_INIT = 0, - VOICE_MHI_PROBED = VOICE_MHI_INIT, - VOICE_MHI_ADSP_UP, - VOICE_MHI_SDX_UP, - VOICE_MHI_INCALL -}; - -struct voice_mhi_addr { - dma_addr_t base; - uint32_t size; -}; - -struct voice_mhi_dev_info { - struct platform_device *pdev; - struct voice_mhi_addr phys_addr; - struct voice_mhi_addr iova_pcie; - struct voice_mhi_addr iova_adsp; -}; - -struct voice_mhi { - struct voice_mhi_dev_info dev_info; - struct mhi_device *mhi_dev; - uint32_t vote_count; - struct mutex mutex; - enum voice_states voice_mhi_state; - bool vote_enable; - bool pcie_enabled; - void *apr_mvm_handle; - struct work_struct voice_mhi_work_pcie; - struct work_struct voice_mhi_work_adsp; - wait_queue_head_t voice_mhi_wait; - u32 mvm_state; - u32 async_err; -}; - -struct vss_ipktexg_cmd_set_mailbox_memory_config_t { - struct apr_hdr hdr; - uint64_t mailbox_mem_address_adsp; - /* - * IOVA of mailbox memory for ADSP access - */ - uint64_t mailbox_mem_address_pcie; - /* - * IOVA of mailbox memory for PCIe access - */ - uint32_t mem_size; - /* - * Size of mailbox memory allocated - */ -} __packed; - -static struct voice_mhi voice_mhi_lcl; - -static int voice_mhi_pcie_up_callback(struct mhi_device *, - const struct mhi_device_id *); -static void voice_mhi_pcie_down_callback(struct mhi_device *); -static void voice_mhi_pcie_status_callback(struct mhi_device *, enum MHI_CB); -static int32_t voice_mhi_apr_callback(struct apr_client_data *data, void *priv); -static int voice_mhi_notifier_service_cb(struct notifier_block *nb, - unsigned long opcode, void *ptr); -static int voice_mhi_apr_register(void); - -static struct notifier_block voice_mhi_service_nb = { - .notifier_call = voice_mhi_notifier_service_cb, - .priority = -INT_MAX, -}; - -static const struct mhi_device_id voice_mhi_match_table[] = { - { .chan = "AUDIO_VOICE_0", .driver_data = 0 }, - {}, -}; - -static struct mhi_driver voice_mhi_driver = { - .id_table = voice_mhi_match_table, - .probe = voice_mhi_pcie_up_callback, - .remove = voice_mhi_pcie_down_callback, - .status_cb = voice_mhi_pcie_status_callback, - .driver = { - .name = "voice_mhi_audio", - .owner = THIS_MODULE, - }, -}; - -static int voice_mhi_notifier_service_cb(struct notifier_block *nb, - unsigned long opcode, void *ptr) -{ - pr_debug("%s: opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - if (voice_mhi_lcl.apr_mvm_handle) { - apr_reset(voice_mhi_lcl.apr_mvm_handle); - voice_mhi_lcl.apr_mvm_handle = NULL; - VOICE_MHI_STATE_RESET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - } - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (!VOICE_MHI_STATE_CHECK(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP)) { - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - schedule_work(&voice_mhi_lcl.voice_mhi_work_adsp); - } - break; - default: - break; - } - - return NOTIFY_OK; - -} - -static int32_t voice_mhi_apr_callback(struct apr_client_data *data, void *priv) -{ - uint32_t *ptr1; - - if (data == NULL) { - pr_err("%s: data is NULL\n", __func__); - return -EINVAL; - } - - pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__, - data->payload_size, data->opcode); - - switch (data->opcode) { - - case APR_BASIC_RSP_RESULT: - if (data->payload_size < 2 * sizeof(uint32_t)) { - pr_err("%s: APR_BASIC_RSP_RESULT payload less than expected\n", - __func__); - return 0; - } - ptr1 = data->payload; - switch (ptr1[0]) { - case VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG: - pr_debug("%s: cmd VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG\n", - __func__); - voice_mhi_lcl.mvm_state = CMD_STATUS_SUCCESS; - voice_mhi_lcl.async_err = ptr1[1]; - wake_up(&voice_mhi_lcl.voice_mhi_wait); - break; - default: - pr_err("%s: Invalid cmd response 0x%x 0x%x\n", __func__, - ptr1[0], ptr1[1]); - break; - } - break; - - case APR_RSP_ACCEPTED: - if (data->payload_size < sizeof(uint32_t)) { - pr_err("%s: APR_RSP_ACCEPTED payload less than expected\n", - __func__); - return 0; - } - ptr1 = data->payload; - if (ptr1[0]) - pr_debug("%s: APR_RSP_ACCEPTED for 0x%x:\n", - __func__, ptr1[0]); - break; - - case RESET_EVENTS: - //Should we handle here or audio notifier down? - if (voice_mhi_lcl.apr_mvm_handle) { - apr_reset(voice_mhi_lcl.apr_mvm_handle); - voice_mhi_lcl.apr_mvm_handle = NULL; - VOICE_MHI_STATE_RESET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - } - break; - - default: - pr_err("%s: Invalid opcode %d\n", __func__, - data->opcode); - break; - - } - return 0; -} - -/** - * voice_mhi_start - - * Start vote for MHI/PCIe clock - * - * Returns 0 on success or error on failure - */ -int voice_mhi_start(void) -{ - int ret = 0; - - mutex_lock(&voice_mhi_lcl.mutex); - if (voice_mhi_lcl.pcie_enabled) { - if (!voice_mhi_lcl.mhi_dev) { - pr_err("%s: NULL device found\n", __func__); - ret = -EINVAL; - goto done; - } - if (voice_mhi_lcl.vote_count == 0) { - ret = mhi_device_get_sync(voice_mhi_lcl.mhi_dev, - MHI_VOTE_DEVICE); - if (ret) { - pr_err("%s: mhi_device_get_sync failed\n", - __func__); - ret = -EINVAL; - goto done; - } - pr_debug("%s: mhi_device_get_sync success\n", __func__); - } else { - /* For DSDA, no additional voting is needed */ - pr_debug("%s: mhi is already voted\n", __func__); - } - voice_mhi_lcl.vote_count++; - } else { - /* PCIe not supported - return success*/ - goto done; - } -done: - mutex_unlock(&voice_mhi_lcl.mutex); - - return ret; -} -EXPORT_SYMBOL(voice_mhi_start); - -/** - * voice_mhi_end - - * End vote for MHI/PCIe clock - * - * Returns 0 on success or error on failure - */ -int voice_mhi_end(void) -{ - mutex_lock(&voice_mhi_lcl.mutex); - if (voice_mhi_lcl.pcie_enabled) { - if (!voice_mhi_lcl.mhi_dev || voice_mhi_lcl.vote_count == 0) { - pr_err("%s: NULL device found\n", __func__); - mutex_unlock(&voice_mhi_lcl.mutex); - return -EINVAL; - } - - if (voice_mhi_lcl.vote_count == 1) - mhi_device_put(voice_mhi_lcl.mhi_dev, MHI_VOTE_DEVICE); - voice_mhi_lcl.vote_count--; - } - mutex_unlock(&voice_mhi_lcl.mutex); - - return 0; -} -EXPORT_SYMBOL(voice_mhi_end); - -static int voice_mhi_set_mailbox_memory_config(void) -{ - struct vss_ipktexg_cmd_set_mailbox_memory_config_t mb_memory_config; - int ret = 0; - void *apr_mvm; - - if (!voice_mhi_lcl.apr_mvm_handle) { - pr_err("%s: APR handle is NULL\n", __func__); - return -EINVAL; - } - - memset(&mb_memory_config, 0, sizeof(mb_memory_config)); - mb_memory_config.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - mb_memory_config.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(mb_memory_config) - APR_HDR_SIZE); - pr_debug("%s: pkt size = %d\n", __func__, - mb_memory_config.hdr.pkt_size); - - mutex_lock(&voice_mhi_lcl.mutex); - apr_mvm = voice_mhi_lcl.apr_mvm_handle; - - /* - * Handle can be NULL as it is not tied to any session - */ - mb_memory_config.hdr.src_port = CONVERT_PORT_APR(PORT_NUM, PORT_MASK); - mb_memory_config.hdr.dest_port = 0; - mb_memory_config.hdr.token = 0; - mb_memory_config.hdr.opcode = VSS_IPKTEXG_CMD_SET_MAILBOX_MEMORY_CONFIG; - mb_memory_config.mailbox_mem_address_pcie = - voice_mhi_lcl.dev_info.iova_pcie.base; - mb_memory_config.mailbox_mem_address_adsp = - voice_mhi_lcl.dev_info.iova_adsp.base; - mb_memory_config.mem_size = voice_mhi_lcl.dev_info.iova_adsp.size; - voice_mhi_lcl.mvm_state = CMD_STATUS_FAIL; - voice_mhi_lcl.async_err = 0; - - ret = apr_send_pkt(apr_mvm, (uint32_t *) &mb_memory_config); - if (ret < 0) { - pr_err("%s: Set mailbox memory config failed ret=%d\n", - __func__, ret); - goto unlock; - } - - ret = wait_event_timeout(voice_mhi_lcl.voice_mhi_wait, - (voice_mhi_lcl.mvm_state == - CMD_STATUS_SUCCESS), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIME; - goto unlock; - } - if (voice_mhi_lcl.async_err > 0) { - pr_err("%s: DSP returned error[%d]\n", - __func__, voice_mhi_lcl.async_err); - ret = voice_mhi_lcl.async_err; - goto unlock; - } - ret = 0; -unlock: - mutex_unlock(&voice_mhi_lcl.mutex); - return ret; -} - -static void voice_mhi_map_pcie_and_send(struct work_struct *work) -{ - dma_addr_t iova, phys_addr; - uint32_t mem_size; - struct device *md; - - mutex_lock(&voice_mhi_lcl.mutex); - if (voice_mhi_lcl.mhi_dev) { - md = &voice_mhi_lcl.mhi_dev->dev; - } else { - pr_err("%s: MHI device handle is NULL\n", __func__); - goto err; - } - - phys_addr = voice_mhi_lcl.dev_info.phys_addr.base; - mem_size = voice_mhi_lcl.dev_info.iova_pcie.size; - if (md) { - iova = dma_map_resource(md->parent, phys_addr, mem_size, - DMA_BIDIRECTIONAL, 0); - if (dma_mapping_error(md->parent, iova)) { - pr_err("%s: dma_mapping_error\n", __func__); - goto err; - } - pr_debug("%s: dma_mapping_success iova:0x%lx\n", - __func__, (unsigned long)iova); - voice_mhi_lcl.dev_info.iova_pcie.base = iova; - - if (q6core_is_adsp_ready()) { - if (VOICE_MHI_STATE_CHECK(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_SDX_UP)) { - mutex_unlock(&voice_mhi_lcl.mutex); - voice_mhi_set_mailbox_memory_config(); - return; - } - } - } - -err: - mutex_unlock(&voice_mhi_lcl.mutex); -} - -static void voice_mhi_register_apr_and_send(struct work_struct *work) -{ - int ret = 0; - - ret = voice_mhi_apr_register(); - if (ret) { - pr_err("%s: APR registration failed %d\n", __func__, ret); - return; - } - mutex_lock(&voice_mhi_lcl.mutex); - if (q6core_is_adsp_ready()) { - if (VOICE_MHI_STATE_CHECK(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_SDX_UP)) { - mutex_unlock(&voice_mhi_lcl.mutex); - voice_mhi_set_mailbox_memory_config(); - return; - } - } - mutex_unlock(&voice_mhi_lcl.mutex); -} - -static int voice_mhi_pcie_up_callback(struct mhi_device *voice_mhi_dev, - const struct mhi_device_id *id) -{ - - if ((!voice_mhi_dev) || (id != &voice_mhi_match_table[0])) { - pr_err("%s: Invalid device or table received\n", __func__); - return -EINVAL; - } - pr_debug("%s: MHI PCIe UP callback\n", __func__); - mutex_lock(&voice_mhi_lcl.mutex); - voice_mhi_lcl.mhi_dev = voice_mhi_dev; - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, VOICE_MHI_SDX_UP); - mutex_unlock(&voice_mhi_lcl.mutex); - schedule_work(&voice_mhi_lcl.voice_mhi_work_pcie); - return 0; -} - -static void voice_mhi_pcie_down_callback(struct mhi_device *voice_mhi_dev) -{ - dma_addr_t iova; - struct device *md = NULL; - - mutex_lock(&voice_mhi_lcl.mutex); - - if (voice_mhi_lcl.mhi_dev) - md = &voice_mhi_lcl.mhi_dev->dev; - - VOICE_MHI_STATE_RESET(voice_mhi_lcl.voice_mhi_state, VOICE_MHI_SDX_UP); - iova = voice_mhi_lcl.dev_info.iova_pcie.base; - - if (md) - dma_unmap_resource(md->parent, iova, PAGE_SIZE, - DMA_BIDIRECTIONAL, 0); - - voice_mhi_lcl.mhi_dev = NULL; - voice_mhi_lcl.vote_count = 0; - mutex_unlock(&voice_mhi_lcl.mutex); -} - -static void voice_mhi_pcie_status_callback(struct mhi_device *voice_mhi_dev, - enum MHI_CB mhi_cb) -{ - -} - -static int voice_mhi_apr_register(void) -{ - int ret = 0; - - mutex_lock(&voice_mhi_lcl.mutex); - voice_mhi_lcl.apr_mvm_handle = apr_register("ADSP", "MVM", - (apr_fn)voice_mhi_apr_callback, - CONVERT_PORT_APR(PORT_NUM, - PORT_MASK), - &voice_mhi_lcl); - if (voice_mhi_lcl.apr_mvm_handle == NULL) { - pr_err("%s: error in APR register\n", __func__); - ret = -ENODEV; - } - mutex_unlock(&voice_mhi_lcl.mutex); - - return ret; -} - -static int voice_mhi_probe(struct platform_device *pdev) -{ - int ret = 0; - struct device_node *node; - uint32_t mem_size = 0; - void *ptr; - dma_addr_t phys_addr, iova; - const __be32 *cell; - - pr_debug("%s:\n", __func__); - - INIT_WORK(&voice_mhi_lcl.voice_mhi_work_pcie, - voice_mhi_map_pcie_and_send); - INIT_WORK(&voice_mhi_lcl.voice_mhi_work_adsp, - voice_mhi_register_apr_and_send); - init_waitqueue_head(&voice_mhi_lcl.voice_mhi_wait); - - node = of_parse_phandle(pdev->dev.of_node, "memory-region", 0); - if (node) { - cell = of_get_property(node, "size", NULL); - if (cell) - mem_size = of_read_number(cell, 2); - else { - pr_err("%s: cell not found\n", __func__); - ret = -EINVAL; - goto done; - } - } else { - pr_err("%s: Node read failed\n", __func__); - ret = -EINVAL; - goto done; - } - - pr_debug("%s: mem_size = %d\n", __func__, mem_size); - - if (mem_size) { - ptr = dma_alloc_attrs(&pdev->dev, mem_size, &phys_addr, - GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING); - if (IS_ERR_OR_NULL(ptr)) { - pr_err("%s: Memory alloc failed\n", __func__); - ret = -ENOMEM; - goto done; - } else { - pr_debug("%s: Memory alloc success phys_addr:0x%lx\n", - __func__, (unsigned long)phys_addr); - } - - ret = msm_audio_ion_dma_map(&phys_addr, &iova, mem_size, - DMA_BIDIRECTIONAL); - if (ret) { - pr_err("%s: dma mapping failed %d\n", __func__, ret); - goto err_free; - } - pr_debug("%s: dma_mapping_success iova:0x%lx\n", - __func__, (unsigned long)iova); - - voice_mhi_lcl.dev_info.phys_addr.base = phys_addr; - voice_mhi_lcl.dev_info.iova_adsp.base = iova; - voice_mhi_lcl.dev_info.iova_adsp.size = mem_size; - voice_mhi_lcl.dev_info.iova_pcie.size = mem_size; - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_ADSP_UP); - - ret = voice_mhi_apr_register(); - /* If fails register during audio notifier UP event */ - if (ret) - pr_err("%s: APR register failed %d\n", __func__, ret); - ret = mhi_driver_register(&voice_mhi_driver); - if (ret) { - pr_err("%s: mhi register failed %d\n", __func__, ret); - goto done; - } - - ret = audio_notifier_register("voice_mhi", - AUDIO_NOTIFIER_ADSP_DOMAIN, - &voice_mhi_service_nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - - mutex_lock(&voice_mhi_lcl.mutex); - voice_mhi_lcl.dev_info.pdev = pdev; - voice_mhi_lcl.pcie_enabled = true; - VOICE_MHI_STATE_SET(voice_mhi_lcl.voice_mhi_state, - VOICE_MHI_PROBED); - mutex_unlock(&voice_mhi_lcl.mutex); - } else { - pr_err("%s: Memory size can't be zero\n", __func__); - ret = -ENOMEM; - goto done; - } - -done: - return ret; -err_free: - dma_free_attrs(&pdev->dev, mem_size, ptr, phys_addr, - DMA_ATTR_NO_KERNEL_MAPPING); - return 0; - -} - -static int voice_mhi_remove(struct platform_device *pdev) -{ - mhi_driver_unregister(&voice_mhi_driver); - return 0; -} -static const struct of_device_id voice_mhi_of_match[] = { - { .compatible = "qcom,voice-mhi-audio", }, - {}, -}; -static struct platform_driver voice_mhi_platform_driver = { - .probe = voice_mhi_probe, - .remove = voice_mhi_remove, - .driver = { - .name = "voice_mhi_audio", - .owner = THIS_MODULE, - .of_match_table = voice_mhi_of_match, - } -}; - -int __init voice_mhi_init(void) -{ - int ret = 0; - - memset(&voice_mhi_lcl, 0, sizeof(voice_mhi_lcl)); - mutex_init(&voice_mhi_lcl.mutex); - - //Add remaining init here - voice_mhi_lcl.pcie_enabled = false; - voice_mhi_lcl.voice_mhi_state = VOICE_MHI_INIT; - voice_mhi_lcl.vote_count = 0; - voice_mhi_lcl.apr_mvm_handle = NULL; - ret = platform_driver_register(&voice_mhi_platform_driver); - - return ret; -} - -void __exit voice_mhi_exit(void) -{ - mutex_destroy(&voice_mhi_lcl.mutex); - platform_driver_unregister(&voice_mhi_platform_driver); -} - -MODULE_DESCRIPTION("Voice MHI module"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/include/Kbuild b/techpack/audio/include/Kbuild deleted file mode 100644 index bab1145bc7a7..000000000000 --- a/techpack/audio/include/Kbuild +++ /dev/null @@ -1,2 +0,0 @@ -# Top-level Makefile calls into asm-$(ARCH) -# List only non-arch directories below diff --git a/techpack/audio/include/asoc/wcd-irq.h b/techpack/audio/include/asoc/wcd-irq.h deleted file mode 100644 index 63502f828ed8..000000000000 --- a/techpack/audio/include/asoc/wcd-irq.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __WCD_IRQ_H_ -#define __WCD_IRQ_H_ - -#include -#include -#include - -struct wcd_irq_info { - struct regmap_irq_chip *wcd_regmap_irq_chip; - char *codec_name; - struct regmap *regmap; - struct regmap_irq_chip_data *irq_chip; - struct device *dev; -}; - -#if IS_ENABLED(CONFIG_WCD9XXX_CODEC_CORE) -int wcd_irq_init(struct wcd_irq_info *irq_info, struct irq_domain **virq); -int wcd_irq_exit(struct wcd_irq_info *irq_info, struct irq_domain *virq); -int wcd_request_irq(struct wcd_irq_info *irq_info, int irq, const char *name, - irq_handler_t handler, void *data); -void wcd_free_irq(struct wcd_irq_info *irq_info, int irq, void *data); -void wcd_enable_irq(struct wcd_irq_info *irq_info, int irq); -void wcd_disable_irq(struct wcd_irq_info *irq_info, int irq); -#else -static inline int wcd_irq_init(struct wcd_irq_info *irq_info, - struct irq_domain **virq) -{ - return 0; -}; -static inline int wcd_irq_exit(struct wcd_irq_info *irq_info, - struct irq_domain *virq) -{ - return 0; -}; -static inline int wcd_request_irq(struct wcd_irq_info *irq, - int irq, const char *name, - irq_handler_t handler, void *data) -{ - return 0; -}; -static inline void wcd_free_irq(struct wcd_irq_info *irq, int irq, void *data); -{ -}; -static inline void wcd_enable_irq(struct wcd_irq_info *irq, int irq); -{ -}; -static inline void wcd_disable_irq(struct wcd_irq_info *irq, int irq); -{ -}; -#endif -#endif /* __WCD_IRQ_H_ */ diff --git a/techpack/audio/include/asoc/wcd934x_registers.h b/techpack/audio/include/asoc/wcd934x_registers.h deleted file mode 100644 index a824875096e4..000000000000 --- a/techpack/audio/include/asoc/wcd934x_registers.h +++ /dev/null @@ -1,1848 +0,0 @@ -/* - * Copyright (c) 2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD934X_REGISTERS_H -#define _WCD934X_REGISTERS_H - -#define WCD934X_PAGE_SIZE 256 -#define WCD934X_NUM_PAGES 256 - -extern const u8 * const wcd934x_reg[WCD934X_NUM_PAGES]; - -enum { - WCD934X_PAGE_0 = 0, - WCD934X_PAGE_1, - WCD934X_PAGE_2, - WCD934X_PAGE_4 = 4, - WCD934X_PAGE_5, - WCD934X_PAGE_6, - WCD934X_PAGE_7, - WCD934X_PAGE_10 = 0xA, - WCD934X_PAGE_11, - WCD934X_PAGE_12, - WCD934X_PAGE_13, - WCD934X_PAGE_14, - WCD934X_PAGE_15, - WCD934X_PAGE_0x50, - WCD934X_PAGE_0X80, -}; - -enum { - WCD934X_WRITE = 0, - WCD934X_READ, - WCD934X_READ_WRITE, -}; - -/* Page-0 Registers */ -#define WCD934X_PAGE0_PAGE_REGISTER 0x0000 -#define WCD934X_CODEC_RPM_CLK_BYPASS 0x0001 -#define WCD934X_CODEC_RPM_CLK_GATE 0x0002 -#define WCD934X_CODEC_RPM_CLK_MCLK_CFG 0x0003 -#define WCD934X_CODEC_RPM_CLK_MCLK2_CFG 0x0004 -#define WCD934X_CODEC_RPM_I2S_DSD_CLK_SEL 0x0005 -#define WCD934X_CODEC_RPM_RST_CTL 0x0009 -#define WCD934X_CODEC_RPM_PWR_CDC_DIG_HM_CTL 0x0011 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0 0x0021 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE1 0x0022 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE2 0x0023 -#define WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE3 0x0024 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_CTL 0x0025 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_TEST0 0x0026 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_TEST1 0x0027 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT0 0x0029 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 0x002a -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 0x002b -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT3 0x002c -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT4 0x002d -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT5 0x002e -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT6 0x002f -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT7 0x0030 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT8 0x0031 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT9 0x0032 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT10 0x0033 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT11 0x0034 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT12 0x0035 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT13 0x0036 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14 0x0037 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT15 0x0038 -#define WCD934X_CHIP_TIER_CTRL_EFUSE_STATUS 0x0039 -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO 0x003a -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_1 0x003b -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_2 0x003c -#define WCD934X_CHIP_TIER_CTRL_I2C_SLAVE_ID_3 0x003d -#define WCD934X_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL 0x003e -#define WCD934X_CHIP_TIER_CTRL_SLNQ_WAIT_STATE_CTL 0x003f -#define WCD934X_CHIP_TIER_CTRL_I2C_ACTIVE 0x0040 -#define WCD934X_CHIP_TIER_CTRL_ALT_FUNC_EN 0x0041 -#define WCD934X_CHIP_TIER_CTRL_GPIO_CTL_OE 0x0042 -#define WCD934X_CHIP_TIER_CTRL_GPIO_CTL_DATA 0x0043 -#define WCD934X_DATA_HUB_RX0_CFG 0x0051 -#define WCD934X_DATA_HUB_RX1_CFG 0x0052 -#define WCD934X_DATA_HUB_RX2_CFG 0x0053 -#define WCD934X_DATA_HUB_RX3_CFG 0x0054 -#define WCD934X_DATA_HUB_RX4_CFG 0x0055 -#define WCD934X_DATA_HUB_RX5_CFG 0x0056 -#define WCD934X_DATA_HUB_RX6_CFG 0x0057 -#define WCD934X_DATA_HUB_RX7_CFG 0x0058 -#define WCD934X_DATA_HUB_SB_TX0_INP_CFG 0x0061 -#define WCD934X_DATA_HUB_SB_TX1_INP_CFG 0x0062 -#define WCD934X_DATA_HUB_SB_TX2_INP_CFG 0x0063 -#define WCD934X_DATA_HUB_SB_TX3_INP_CFG 0x0064 -#define WCD934X_DATA_HUB_SB_TX4_INP_CFG 0x0065 -#define WCD934X_DATA_HUB_SB_TX5_INP_CFG 0x0066 -#define WCD934X_DATA_HUB_SB_TX6_INP_CFG 0x0067 -#define WCD934X_DATA_HUB_SB_TX7_INP_CFG 0x0068 -#define WCD934X_DATA_HUB_SB_TX8_INP_CFG 0x0069 -#define WCD934X_DATA_HUB_SB_TX9_INP_CFG 0x006a -#define WCD934X_DATA_HUB_SB_TX10_INP_CFG 0x006b -#define WCD934X_DATA_HUB_SB_TX11_INP_CFG 0x006c -#define WCD934X_DATA_HUB_SB_TX13_INP_CFG 0x006e -#define WCD934X_DATA_HUB_SB_TX14_INP_CFG 0x006f -#define WCD934X_DATA_HUB_SB_TX15_INP_CFG 0x0070 -#define WCD934X_DATA_HUB_I2S_TX0_CFG 0x0071 -#define WCD934X_DATA_HUB_I2S_TX1_0_CFG 0x0073 -#define WCD934X_DATA_HUB_I2S_TX1_1_CFG 0x0074 -#define WCD934X_DATA_HUB_I2S_0_CTL 0x0081 -#define WCD934X_DATA_HUB_I2S_1_CTL 0x0082 -#define WCD934X_DATA_HUB_I2S_2_CTL 0x0083 -#define WCD934X_DATA_HUB_I2S_3_CTL 0x0084 -#define WCD934X_DATA_HUB_I2S_CLKSRC_CTL 0x0085 -#define WCD934X_DATA_HUB_I2S_COMMON_CTL 0x0086 -#define WCD934X_DATA_HUB_I2S_0_TDM_CTL 0x0087 -#define WCD934X_DATA_HUB_I2S_STATUS 0x0088 -#define WCD934X_DMA_RDMA_CTL_0 0x0091 -#define WCD934X_DMA_CH_2_3_CFG_RDMA_0 0x0092 -#define WCD934X_DMA_CH_0_1_CFG_RDMA_0 0x0093 -#define WCD934X_DMA_RDMA_CTL_1 0x0094 -#define WCD934X_DMA_CH_2_3_CFG_RDMA_1 0x0095 -#define WCD934X_DMA_CH_0_1_CFG_RDMA_1 0x0096 -#define WCD934X_DMA_RDMA_CTL_2 0x0097 -#define WCD934X_DMA_CH_2_3_CFG_RDMA_2 0x0098 -#define WCD934X_DMA_CH_0_1_CFG_RDMA_2 0x0099 -#define WCD934X_DMA_RDMA_CTL_3 0x009A -#define WCD934X_DMA_CH_2_3_CFG_RDMA_3 0x009B -#define WCD934X_DMA_CH_0_1_CFG_RDMA_3 0x009C -#define WCD934X_DMA_RDMA_CTL_4 0x009D -#define WCD934X_DMA_CH_2_3_CFG_RDMA_4 0x009E -#define WCD934X_DMA_CH_0_1_CFG_RDMA_4 0x009F -#define WCD934X_DMA_RDMA4_PRT_CFG 0x00b1 -#define WCD934X_DMA_RDMA_SBTX0_7_CFG 0x00b9 -#define WCD934X_DMA_RDMA_SBTX8_11_CFG 0x00ba -#define WCD934X_DMA_WDMA_CTL_0 0x00c1 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_0 0x00c2 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_0 0x00c3 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_0 0x00c4 -#define WCD934X_DMA_WDMA_CTL_1 0x00C6 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_1 0x00C7 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_1 0x00C8 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_1 0x00C9 -#define WCD934X_DMA_WDMA_CTL_2 0x00CB -#define WCD934X_DMA_CH_4_5_CFG_WDMA_2 0x00CC -#define WCD934X_DMA_CH_2_3_CFG_WDMA_2 0x00CD -#define WCD934X_DMA_CH_0_1_CFG_WDMA_2 0x00CE -#define WCD934X_DMA_WDMA_CTL_3 0x00D0 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_3 0x00D1 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_3 0x00D2 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_3 0x00D3 -#define WCD934X_DMA_WDMA_CTL_4 0x00D5 -#define WCD934X_DMA_CH_4_5_CFG_WDMA_4 0x00D6 -#define WCD934X_DMA_CH_2_3_CFG_WDMA_4 0x00D7 -#define WCD934X_DMA_CH_0_1_CFG_WDMA_4 0x00D8 -#define WCD934X_DMA_WDMA0_PRT_CFG 0x00E1 -#define WCD934X_DMA_WDMA3_PRT_CFG 0x00E2 -#define WCD934X_DMA_WDMA4_PRT0_3_CFG 0x00E3 -#define WCD934X_DMA_WDMA4_PRT4_7_CFG 0x00E4 -#define WCD934X_PAGE1_PAGE_REGISTER 0x0100 -#define WCD934X_CPE_FLL_USER_CTL_0 0x0101 -#define WCD934X_CPE_FLL_USER_CTL_1 0x0102 -#define WCD934X_CPE_FLL_USER_CTL_2 0x0103 -#define WCD934X_CPE_FLL_USER_CTL_3 0x0104 -#define WCD934X_CPE_FLL_USER_CTL_4 0x0105 -#define WCD934X_CPE_FLL_USER_CTL_5 0x0106 -#define WCD934X_CPE_FLL_USER_CTL_6 0x0107 -#define WCD934X_CPE_FLL_USER_CTL_7 0x0108 -#define WCD934X_CPE_FLL_USER_CTL_8 0x0109 -#define WCD934X_CPE_FLL_USER_CTL_9 0x010a -#define WCD934X_CPE_FLL_L_VAL_CTL_0 0x010b -#define WCD934X_CPE_FLL_L_VAL_CTL_1 0x010c -#define WCD934X_CPE_FLL_DSM_FRAC_CTL_0 0x010d -#define WCD934X_CPE_FLL_DSM_FRAC_CTL_1 0x010e -#define WCD934X_CPE_FLL_CONFIG_CTL_0 0x010f -#define WCD934X_CPE_FLL_CONFIG_CTL_1 0x0110 -#define WCD934X_CPE_FLL_CONFIG_CTL_2 0x0111 -#define WCD934X_CPE_FLL_CONFIG_CTL_3 0x0112 -#define WCD934X_CPE_FLL_CONFIG_CTL_4 0x0113 -#define WCD934X_CPE_FLL_TEST_CTL_0 0x0114 -#define WCD934X_CPE_FLL_TEST_CTL_1 0x0115 -#define WCD934X_CPE_FLL_TEST_CTL_2 0x0116 -#define WCD934X_CPE_FLL_TEST_CTL_3 0x0117 -#define WCD934X_CPE_FLL_TEST_CTL_4 0x0118 -#define WCD934X_CPE_FLL_TEST_CTL_5 0x0119 -#define WCD934X_CPE_FLL_TEST_CTL_6 0x011a -#define WCD934X_CPE_FLL_TEST_CTL_7 0x011b -#define WCD934X_CPE_FLL_FREQ_CTL_0 0x011c -#define WCD934X_CPE_FLL_FREQ_CTL_1 0x011d -#define WCD934X_CPE_FLL_FREQ_CTL_2 0x011e -#define WCD934X_CPE_FLL_FREQ_CTL_3 0x011f -#define WCD934X_CPE_FLL_SSC_CTL_0 0x0120 -#define WCD934X_CPE_FLL_SSC_CTL_1 0x0121 -#define WCD934X_CPE_FLL_SSC_CTL_2 0x0122 -#define WCD934X_CPE_FLL_SSC_CTL_3 0x0123 -#define WCD934X_CPE_FLL_FLL_MODE 0x0124 -#define WCD934X_CPE_FLL_STATUS_0 0x0125 -#define WCD934X_CPE_FLL_STATUS_1 0x0126 -#define WCD934X_CPE_FLL_STATUS_2 0x0127 -#define WCD934X_CPE_FLL_STATUS_3 0x0128 -#define WCD934X_I2S_FLL_USER_CTL_0 0x0141 -#define WCD934X_I2S_FLL_USER_CTL_1 0x0142 -#define WCD934X_I2S_FLL_USER_CTL_2 0x0143 -#define WCD934X_I2S_FLL_USER_CTL_3 0x0144 -#define WCD934X_I2S_FLL_USER_CTL_4 0x0145 -#define WCD934X_I2S_FLL_USER_CTL_5 0x0146 -#define WCD934X_I2S_FLL_USER_CTL_6 0x0147 -#define WCD934X_I2S_FLL_USER_CTL_7 0x0148 -#define WCD934X_I2S_FLL_USER_CTL_8 0x0149 -#define WCD934X_I2S_FLL_USER_CTL_9 0x014a -#define WCD934X_I2S_FLL_L_VAL_CTL_0 0x014b -#define WCD934X_I2S_FLL_L_VAL_CTL_1 0x014c -#define WCD934X_I2S_FLL_DSM_FRAC_CTL_0 0x014d -#define WCD934X_I2S_FLL_DSM_FRAC_CTL_1 0x014e -#define WCD934X_I2S_FLL_CONFIG_CTL_0 0x014f -#define WCD934X_I2S_FLL_CONFIG_CTL_1 0x0150 -#define WCD934X_I2S_FLL_CONFIG_CTL_2 0x0151 -#define WCD934X_I2S_FLL_CONFIG_CTL_3 0x0152 -#define WCD934X_I2S_FLL_CONFIG_CTL_4 0x0153 -#define WCD934X_I2S_FLL_TEST_CTL_0 0x0154 -#define WCD934X_I2S_FLL_TEST_CTL_1 0x0155 -#define WCD934X_I2S_FLL_TEST_CTL_2 0x0156 -#define WCD934X_I2S_FLL_TEST_CTL_3 0x0157 -#define WCD934X_I2S_FLL_TEST_CTL_4 0x0158 -#define WCD934X_I2S_FLL_TEST_CTL_5 0x0159 -#define WCD934X_I2S_FLL_TEST_CTL_6 0x015a -#define WCD934X_I2S_FLL_TEST_CTL_7 0x015b -#define WCD934X_I2S_FLL_FREQ_CTL_0 0x015c -#define WCD934X_I2S_FLL_FREQ_CTL_1 0x015d -#define WCD934X_I2S_FLL_FREQ_CTL_2 0x015e -#define WCD934X_I2S_FLL_FREQ_CTL_3 0x015f -#define WCD934X_I2S_FLL_SSC_CTL_0 0x0160 -#define WCD934X_I2S_FLL_SSC_CTL_1 0x0161 -#define WCD934X_I2S_FLL_SSC_CTL_2 0x0162 -#define WCD934X_I2S_FLL_SSC_CTL_3 0x0163 -#define WCD934X_I2S_FLL_FLL_MODE 0x0164 -#define WCD934X_I2S_FLL_STATUS_0 0x0165 -#define WCD934X_I2S_FLL_STATUS_1 0x0166 -#define WCD934X_I2S_FLL_STATUS_2 0x0167 -#define WCD934X_I2S_FLL_STATUS_3 0x0168 -#define WCD934X_SB_FLL_USER_CTL_0 0x0181 -#define WCD934X_SB_FLL_USER_CTL_1 0x0182 -#define WCD934X_SB_FLL_USER_CTL_2 0x0183 -#define WCD934X_SB_FLL_USER_CTL_3 0x0184 -#define WCD934X_SB_FLL_USER_CTL_4 0x0185 -#define WCD934X_SB_FLL_USER_CTL_5 0x0186 -#define WCD934X_SB_FLL_USER_CTL_6 0x0187 -#define WCD934X_SB_FLL_USER_CTL_7 0x0188 -#define WCD934X_SB_FLL_USER_CTL_8 0x0189 -#define WCD934X_SB_FLL_USER_CTL_9 0x018a -#define WCD934X_SB_FLL_L_VAL_CTL_0 0x018b -#define WCD934X_SB_FLL_L_VAL_CTL_1 0x018c -#define WCD934X_SB_FLL_DSM_FRAC_CTL_0 0x018d -#define WCD934X_SB_FLL_DSM_FRAC_CTL_1 0x018e -#define WCD934X_SB_FLL_CONFIG_CTL_0 0x018f -#define WCD934X_SB_FLL_CONFIG_CTL_1 0x0190 -#define WCD934X_SB_FLL_CONFIG_CTL_2 0x0191 -#define WCD934X_SB_FLL_CONFIG_CTL_3 0x0192 -#define WCD934X_SB_FLL_CONFIG_CTL_4 0x0193 -#define WCD934X_SB_FLL_TEST_CTL_0 0x0194 -#define WCD934X_SB_FLL_TEST_CTL_1 0x0195 -#define WCD934X_SB_FLL_TEST_CTL_2 0x0196 -#define WCD934X_SB_FLL_TEST_CTL_3 0x0197 -#define WCD934X_SB_FLL_TEST_CTL_4 0x0198 -#define WCD934X_SB_FLL_TEST_CTL_5 0x0199 -#define WCD934X_SB_FLL_TEST_CTL_6 0x019a -#define WCD934X_SB_FLL_TEST_CTL_7 0x019b -#define WCD934X_SB_FLL_FREQ_CTL_0 0x019c -#define WCD934X_SB_FLL_FREQ_CTL_1 0x019d -#define WCD934X_SB_FLL_FREQ_CTL_2 0x019e -#define WCD934X_SB_FLL_FREQ_CTL_3 0x019f -#define WCD934X_SB_FLL_SSC_CTL_0 0x01a0 -#define WCD934X_SB_FLL_SSC_CTL_1 0x01a1 -#define WCD934X_SB_FLL_SSC_CTL_2 0x01a2 -#define WCD934X_SB_FLL_SSC_CTL_3 0x01a3 -#define WCD934X_SB_FLL_FLL_MODE 0x01a4 -#define WCD934X_SB_FLL_STATUS_0 0x01a5 -#define WCD934X_SB_FLL_STATUS_1 0x01a6 -#define WCD934X_SB_FLL_STATUS_2 0x01a7 -#define WCD934X_SB_FLL_STATUS_3 0x01a8 -#define WCD934X_PAGE2_PAGE_REGISTER 0x0200 -#define WCD934X_CPE_SS_CPE_CTL 0x0201 -#define WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_0 0x0202 -#define WCD934X_CPE_SS_PWR_SYS_PSTATE_CTL_1 0x0203 -#define WCD934X_CPE_SS_PWR_CPEFLL_CTL 0x0204 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0 0x0205 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1 0x0206 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_OVERRIDE 0x0207 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0 0x0208 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1 0x0209 -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2 0x020a -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3 0x020b -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4 0x020c -#define WCD934X_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_5 0x020d -#define WCD934X_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN 0x020e -#define WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL 0x020f -#define WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL 0x0210 -#define WCD934X_CPE_SS_SOC_SW_COLLAPSE_OVERRIDE_CTL1 0x0211 -#define WCD934X_CPE_SS_US_BUF_INT_PERIOD 0x0212 -#define WCD934X_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD 0x0213 -#define WCD934X_CPE_SS_SVA_CFG 0x0214 -#define WCD934X_CPE_SS_US_CFG 0x0215 -#define WCD934X_CPE_SS_MAD_CTL 0x0216 -#define WCD934X_CPE_SS_CPAR_CTL 0x0217 -#define WCD934X_CPE_SS_DMIC0_CTL 0x0218 -#define WCD934X_CPE_SS_DMIC1_CTL 0x0219 -#define WCD934X_CPE_SS_DMIC2_CTL 0x021a -#define WCD934X_CPE_SS_DMIC_CFG 0x021b -#define WCD934X_CPE_SS_CPAR_CFG 0x021c -#define WCD934X_CPE_SS_WDOG_CFG 0x021d -#define WCD934X_CPE_SS_BACKUP_INT 0x021e -#define WCD934X_CPE_SS_STATUS 0x021f -#define WCD934X_CPE_SS_CPE_OCD_CFG 0x0220 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A 0x0221 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_0B 0x0222 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_1A 0x0223 -#define WCD934X_CPE_SS_SS_ERROR_INT_MASK_1B 0x0224 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0A 0x0225 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_0B 0x0226 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1A 0x0227 -#define WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B 0x0228 -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0A 0x0229 -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_0B 0x022a -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1A 0x022b -#define WCD934X_CPE_SS_SS_ERROR_INT_CLEAR_1B 0x022c -#define WCD934X_SOC_MAD_MAIN_CTL_1 0x0281 -#define WCD934X_SOC_MAD_MAIN_CTL_2 0x0282 -#define WCD934X_SOC_MAD_AUDIO_CTL_1 0x0283 -#define WCD934X_SOC_MAD_AUDIO_CTL_2 0x0284 -#define WCD934X_SOC_MAD_AUDIO_CTL_3 0x0285 -#define WCD934X_SOC_MAD_AUDIO_CTL_4 0x0286 -#define WCD934X_SOC_MAD_AUDIO_CTL_5 0x0287 -#define WCD934X_SOC_MAD_AUDIO_CTL_6 0x0288 -#define WCD934X_SOC_MAD_AUDIO_CTL_7 0x0289 -#define WCD934X_SOC_MAD_AUDIO_CTL_8 0x028a -#define WCD934X_SOC_MAD_AUDIO_IIR_CTL_PTR 0x028b -#define WCD934X_SOC_MAD_AUDIO_IIR_CTL_VAL 0x028c -#define WCD934X_SOC_MAD_ULTR_CTL_1 0x028d -#define WCD934X_SOC_MAD_ULTR_CTL_2 0x028e -#define WCD934X_SOC_MAD_ULTR_CTL_3 0x028f -#define WCD934X_SOC_MAD_ULTR_CTL_4 0x0290 -#define WCD934X_SOC_MAD_ULTR_CTL_5 0x0291 -#define WCD934X_SOC_MAD_ULTR_CTL_6 0x0292 -#define WCD934X_SOC_MAD_ULTR_CTL_7 0x0293 -#define WCD934X_SOC_MAD_BEACON_CTL_1 0x0294 -#define WCD934X_SOC_MAD_BEACON_CTL_2 0x0295 -#define WCD934X_SOC_MAD_BEACON_CTL_3 0x0296 -#define WCD934X_SOC_MAD_BEACON_CTL_4 0x0297 -#define WCD934X_SOC_MAD_BEACON_CTL_5 0x0298 -#define WCD934X_SOC_MAD_BEACON_CTL_6 0x0299 -#define WCD934X_SOC_MAD_BEACON_CTL_7 0x029a -#define WCD934X_SOC_MAD_BEACON_CTL_8 0x029b -#define WCD934X_SOC_MAD_BEACON_IIR_CTL_PTR 0x029c -#define WCD934X_SOC_MAD_BEACON_IIR_CTL_VAL 0x029d -#define WCD934X_SOC_MAD_INP_SEL 0x029e -#define WCD934X_PAGE4_PAGE_REGISTER 0x0400 -#define WCD934X_INTR_CFG 0x0401 -#define WCD934X_INTR_CLR_COMMIT 0x0402 -#define WCD934X_INTR_PIN1_MASK0 0x0409 -#define WCD934X_INTR_PIN1_MASK1 0x040a -#define WCD934X_INTR_PIN1_MASK2 0x040b -#define WCD934X_INTR_PIN1_MASK3 0x040c -#define WCD934X_INTR_PIN1_STATUS0 0x0411 -#define WCD934X_INTR_PIN1_STATUS1 0x0412 -#define WCD934X_INTR_PIN1_STATUS2 0x0413 -#define WCD934X_INTR_PIN1_STATUS3 0x0414 -#define WCD934X_INTR_PIN1_CLEAR0 0x0419 -#define WCD934X_INTR_PIN1_CLEAR1 0x041a -#define WCD934X_INTR_PIN1_CLEAR2 0x041b -#define WCD934X_INTR_PIN1_CLEAR3 0x041c -#define WCD934X_INTR_PIN2_MASK3 0x0424 -#define WCD934X_INTR_PIN2_STATUS3 0x042c -#define WCD934X_INTR_PIN2_CLEAR3 0x0434 -#define WCD934X_INTR_CPESS_SUMRY_MASK2 0x043b -#define WCD934X_INTR_CPESS_SUMRY_MASK3 0x043c -#define WCD934X_INTR_CPESS_SUMRY_STATUS2 0x0443 -#define WCD934X_INTR_CPESS_SUMRY_STATUS3 0x0444 -#define WCD934X_INTR_CPESS_SUMRY_CLEAR2 0x044b -#define WCD934X_INTR_CPESS_SUMRY_CLEAR3 0x044c -#define WCD934X_INTR_LEVEL0 0x0461 -#define WCD934X_INTR_LEVEL1 0x0462 -#define WCD934X_INTR_LEVEL2 0x0463 -#define WCD934X_INTR_LEVEL3 0x0464 -#define WCD934X_INTR_BYPASS0 0x0469 -#define WCD934X_INTR_BYPASS1 0x046a -#define WCD934X_INTR_BYPASS2 0x046b -#define WCD934X_INTR_BYPASS3 0x046c -#define WCD934X_INTR_SET0 0x0471 -#define WCD934X_INTR_SET1 0x0472 -#define WCD934X_INTR_SET2 0x0473 -#define WCD934X_INTR_SET3 0x0474 -#define WCD934X_INTR_CODEC_MISC_MASK 0x04b1 -#define WCD934X_INTR_CODEC_MISC_STATUS 0x04b2 -#define WCD934X_INTR_CODEC_MISC_CLEAR 0x04b3 -#define WCD934X_PAGE5_PAGE_REGISTER 0x0500 -#define WCD934X_SLNQ_DIG_DEVICE 0x0501 -#define WCD934X_SLNQ_DIG_REVISION 0x0502 -#define WCD934X_SLNQ_DIG_H_COMMAND 0x0511 -#define WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_MSB 0x0512 -#define WCD934X_SLNQ_DIG_NUMBER_OF_BYTE_LSB 0x0513 -#define WCD934X_SLNQ_DIG_MASTER_ADDRESS_MSB 0x0514 -#define WCD934X_SLNQ_DIG_MASTER_ADDRESS_LSB 0x0515 -#define WCD934X_SLNQ_DIG_SLAVE_ADDRESS_MSB 0x0516 -#define WCD934X_SLNQ_DIG_SLAVE_ADDRESS_LSB 0x0517 -#define WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_MSB 0x0518 -#define WCD934X_SLNQ_DIG_TIMER0_INTERRUPT_LSB 0x0519 -#define WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_MSB 0x051a -#define WCD934X_SLNQ_DIG_TIMER1_INTERRUPT_LSB 0x051b -#define WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_MSB 0x051c -#define WCD934X_SLNQ_DIG_TIMER2_INTERRUPT_LSB 0x051d -#define WCD934X_SLNQ_DIG_COMM_CTL 0x0520 -#define WCD934X_SLNQ_DIG_FRAME_CTRL 0x0542 -#define WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH1_2 0x055c -#define WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH3_4 0x055d -#define WCD934X_SLNQ_DIG_PDM_2ND_DATA_CH5 0x055e -#define WCD934X_SLNQ_DIG_SW_EVENT_RD 0x0561 -#define WCD934X_SLNQ_DIG_SW_EVENT_CTRL 0x0562 -#define WCD934X_SLNQ_DIG_PDM_SELECT_1 0x0563 -#define WCD934X_SLNQ_DIG_PDM_SELECT_2 0x0564 -#define WCD934X_SLNQ_DIG_PDM_SELECT_3 0x0565 -#define WCD934X_SLNQ_DIG_PDM_SAMPLING_FREQ 0x0566 -#define WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_CTL 0x0569 -#define WCD934X_SLNQ_DIG_PDM_DC_CONVERSION_SEL 0x056a -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_MSB 0x056b -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHA_LSB 0x056c -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_MSB 0x056d -#define WCD934X_SLNQ_DIG_PDM_DC_CONV_CHB_LSB 0x056e -#define WCD934X_SLNQ_DIG_RAM_CNTRL 0x0571 -#define WCD934X_SLNQ_DIG_SRAM_BANK 0x0572 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_0 0x0573 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1 0x0574 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2 0x0575 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3 0x0576 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_4 0x0577 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_5 0x0578 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_6 0x0579 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_7 0x057a -#define WCD934X_SLNQ_DIG_SRAM_BYTE_8 0x057b -#define WCD934X_SLNQ_DIG_SRAM_BYTE_9 0x057c -#define WCD934X_SLNQ_DIG_SRAM_BYTE_A 0x057d -#define WCD934X_SLNQ_DIG_SRAM_BYTE_B 0x057e -#define WCD934X_SLNQ_DIG_SRAM_BYTE_C 0x057f -#define WCD934X_SLNQ_DIG_SRAM_BYTE_D 0x0580 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_E 0x0581 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_F 0x0582 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_10 0x0583 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_11 0x0584 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_12 0x0585 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_13 0x0586 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_14 0x0587 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_15 0x0588 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_16 0x0589 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_17 0x058a -#define WCD934X_SLNQ_DIG_SRAM_BYTE_18 0x058b -#define WCD934X_SLNQ_DIG_SRAM_BYTE_19 0x058c -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1A 0x058d -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1B 0x058e -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1C 0x058f -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1D 0x0590 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1E 0x0591 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_1F 0x0592 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_20 0x0593 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_21 0x0594 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_22 0x0595 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_23 0x0596 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_24 0x0597 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_25 0x0598 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_26 0x0599 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_27 0x059a -#define WCD934X_SLNQ_DIG_SRAM_BYTE_28 0x059b -#define WCD934X_SLNQ_DIG_SRAM_BYTE_29 0x059c -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2A 0x059d -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2B 0x059e -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2C 0x059f -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2D 0x05a0 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2E 0x05a1 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_2F 0x05a2 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_30 0x05a3 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_31 0x05a4 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_32 0x05a5 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_33 0x05a6 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_34 0x05a7 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_35 0x05a8 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_36 0x05a9 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_37 0x05aa -#define WCD934X_SLNQ_DIG_SRAM_BYTE_38 0x05ab -#define WCD934X_SLNQ_DIG_SRAM_BYTE_39 0x05ac -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3A 0x05ad -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3B 0x05ae -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3C 0x05af -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3D 0x05b0 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3E 0x05b1 -#define WCD934X_SLNQ_DIG_SRAM_BYTE_3F 0x05b2 -#define WCD934X_SLNQ_DIG_TOP_CTRL1 0x05b3 -#define WCD934X_SLNQ_DIG_TOP_CTRL2 0x05b4 -#define WCD934X_SLNQ_DIG_PDM_CTRL 0x05b5 -#define WCD934X_SLNQ_DIG_PDM_MUTE_CTRL 0x05b6 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_CTRL 0x05b7 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_STATUS 0x05b8 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_FS 0x05b9 -#define WCD934X_SLNQ_DIG_DEC_BYPASS_IN_SEL 0x05ba -#define WCD934X_SLNQ_DIG_GPOUT_ENABLE 0x05bb -#define WCD934X_SLNQ_DIG_GPOUT_VAL 0x05bc -#define WCD934X_SLNQ_DIG_ANA_INTERRUPT_MASK 0x05be -#define WCD934X_SLNQ_DIG_ANA_INTERRUPT_STATUS 0x05bf -#define WCD934X_SLNQ_DIG_ANA_INTERRUPT_CLR 0x05c0 -#define WCD934X_SLNQ_DIG_IP_TESTING 0x05c1 -#define WCD934X_SLNQ_DIG_INTERRUPT_CNTRL 0x05e3 -#define WCD934X_SLNQ_DIG_INTERRUPT_CNT 0x05e9 -#define WCD934X_SLNQ_DIG_INTERRUPT_CNT_MSB 0x05eb -#define WCD934X_SLNQ_DIG_INTERRUPT_CNT_LSB 0x05ec -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK0 0x05f1 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK1 0x05f2 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK2 0x05f3 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK3 0x05f4 -#define WCD934X_SLNQ_DIG_INTERRUPT_MASK4 0x05f5 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS0 0x05f6 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS1 0x05f7 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS2 0x05f8 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS3 0x05f9 -#define WCD934X_SLNQ_DIG_INTERRUPT_STATUS4 0x05fa -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR0 0x05fb -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR1 0x05fc -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR2 0x05fd -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR3 0x05fe -#define WCD934X_SLNQ_DIG_INTERRUPT_CLR4 0x05ff -#define WCD934X_ANA_PAGE_REGISTER 0x0600 -#define WCD934X_ANA_BIAS 0x0601 -#define WCD934X_ANA_RCO 0x0603 -#define WCD934X_ANA_PAGE6_SPARE2 0x0604 -#define WCD934X_ANA_PAGE6_SPARE3 0x0605 -#define WCD934X_ANA_BUCK_CTL 0x0606 -#define WCD934X_ANA_BUCK_STATUS 0x0607 -#define WCD934X_ANA_RX_SUPPLIES 0x0608 -#define WCD934X_ANA_HPH 0x0609 -#define WCD934X_ANA_EAR 0x060a -#define WCD934X_ANA_LO_1_2 0x060b -#define WCD934X_ANA_MAD_SETUP 0x060d -#define WCD934X_ANA_AMIC1 0x060e -#define WCD934X_ANA_AMIC2 0x060f -#define WCD934X_ANA_AMIC3 0x0610 -#define WCD934X_ANA_AMIC4 0x0611 -#define WCD934X_ANA_MBHC_MECH 0x0614 -#define WCD934X_ANA_MBHC_ELECT 0x0615 -#define WCD934X_ANA_MBHC_ZDET 0x0616 -#define WCD934X_ANA_MBHC_RESULT_1 0x0617 -#define WCD934X_ANA_MBHC_RESULT_2 0x0618 -#define WCD934X_ANA_MBHC_RESULT_3 0x0619 -#define WCD934X_ANA_MBHC_BTN0 0x061a -#define WCD934X_ANA_MBHC_BTN1 0x061b -#define WCD934X_ANA_MBHC_BTN2 0x061c -#define WCD934X_ANA_MBHC_BTN3 0x061d -#define WCD934X_ANA_MBHC_BTN4 0x061e -#define WCD934X_ANA_MBHC_BTN5 0x061f -#define WCD934X_ANA_MBHC_BTN6 0x0620 -#define WCD934X_ANA_MBHC_BTN7 0x0621 -#define WCD934X_ANA_MICB1 0x0622 -#define WCD934X_ANA_MICB2 0x0623 -#define WCD934X_ANA_MICB2_RAMP 0x0624 -#define WCD934X_ANA_MICB3 0x0625 -#define WCD934X_ANA_MICB4 0x0626 -#define WCD934X_ANA_VBADC 0x0627 -#define WCD934X_BIAS_CTL 0x0628 -#define WCD934X_BIAS_VBG_FINE_ADJ 0x0629 -#define WCD934X_RCO_CTRL_1 0x062e -#define WCD934X_RCO_CTRL_2 0x062f -#define WCD934X_RCO_CAL 0x0630 -#define WCD934X_RCO_CAL_1 0x0631 -#define WCD934X_RCO_CAL_2 0x0632 -#define WCD934X_RCO_TEST_CTRL 0x0633 -#define WCD934X_RCO_CAL_OUT_1 0x0634 -#define WCD934X_RCO_CAL_OUT_2 0x0635 -#define WCD934X_RCO_CAL_OUT_3 0x0636 -#define WCD934X_RCO_CAL_OUT_4 0x0637 -#define WCD934X_RCO_CAL_OUT_5 0x0638 -#define WCD934X_SIDO_MODE_1 0x063a -#define WCD934X_SIDO_MODE_2 0x063b -#define WCD934X_SIDO_MODE_3 0x063c -#define WCD934X_SIDO_MODE_4 0x063d -#define WCD934X_SIDO_VCL_1 0x063e -#define WCD934X_SIDO_VCL_2 0x063f -#define WCD934X_SIDO_VCL_3 0x0640 -#define WCD934X_SIDO_CCL_1 0x0641 -#define WCD934X_SIDO_CCL_2 0x0642 -#define WCD934X_SIDO_CCL_3 0x0643 -#define WCD934X_SIDO_CCL_4 0x0644 -#define WCD934X_SIDO_CCL_5 0x0645 -#define WCD934X_SIDO_CCL_6 0x0646 -#define WCD934X_SIDO_CCL_7 0x0647 -#define WCD934X_SIDO_CCL_8 0x0648 -#define WCD934X_SIDO_CCL_9 0x0649 -#define WCD934X_SIDO_CCL_10 0x064a -#define WCD934X_SIDO_FILTER_1 0x064b -#define WCD934X_SIDO_FILTER_2 0x064c -#define WCD934X_SIDO_DRIVER_1 0x064d -#define WCD934X_SIDO_DRIVER_2 0x064e -#define WCD934X_SIDO_DRIVER_3 0x064f -#define WCD934X_SIDO_CAL_CODE_EXT_1 0x0650 -#define WCD934X_SIDO_CAL_CODE_EXT_2 0x0651 -#define WCD934X_SIDO_CAL_CODE_OUT_1 0x0652 -#define WCD934X_SIDO_CAL_CODE_OUT_2 0x0653 -#define WCD934X_SIDO_TEST_1 0x0654 -#define WCD934X_SIDO_TEST_2 0x0655 -#define WCD934X_MBHC_CTL_CLK 0x0656 -#define WCD934X_MBHC_CTL_ANA 0x0657 -#define WCD934X_MBHC_CTL_SPARE_1 0x0658 -#define WCD934X_MBHC_CTL_SPARE_2 0x0659 -#define WCD934X_MBHC_CTL_BCS 0x065a -#define WCD934X_MBHC_STATUS_SPARE_1 0x065b -#define WCD934X_MBHC_TEST_CTL 0x065c -#define WCD934X_VBADC_SUBBLOCK_EN 0x065d -#define WCD934X_VBADC_IBIAS_FE 0x065e -#define WCD934X_VBADC_BIAS_ADC 0x065f -#define WCD934X_VBADC_FE_CTRL 0x0660 -#define WCD934X_VBADC_ADC_REF 0x0661 -#define WCD934X_VBADC_ADC_IO 0x0662 -#define WCD934X_VBADC_ADC_SAR 0x0663 -#define WCD934X_VBADC_DEBUG 0x0664 -#define WCD934X_LDOH_MODE 0x0667 -#define WCD934X_LDOH_BIAS 0x0668 -#define WCD934X_LDOH_STB_LOADS 0x0669 -#define WCD934X_LDOH_SLOWRAMP 0x066a -#define WCD934X_MICB1_TEST_CTL_1 0x066b -#define WCD934X_MICB1_TEST_CTL_2 0x066c -#define WCD934X_MICB1_TEST_CTL_3 0x066d -#define WCD934X_MICB2_TEST_CTL_1 0x066e -#define WCD934X_MICB2_TEST_CTL_2 0x066f -#define WCD934X_MICB2_TEST_CTL_3 0x0670 -#define WCD934X_MICB3_TEST_CTL_1 0x0671 -#define WCD934X_MICB3_TEST_CTL_2 0x0672 -#define WCD934X_MICB3_TEST_CTL_3 0x0673 -#define WCD934X_MICB4_TEST_CTL_1 0x0674 -#define WCD934X_MICB4_TEST_CTL_2 0x0675 -#define WCD934X_MICB4_TEST_CTL_3 0x0676 -#define WCD934X_TX_COM_ADC_VCM 0x0677 -#define WCD934X_TX_COM_BIAS_ATEST 0x0678 -#define WCD934X_TX_COM_ADC_INT1_IB 0x0679 -#define WCD934X_TX_COM_ADC_INT2_IB 0x067a -#define WCD934X_TX_COM_TXFE_DIV_CTL 0x067b -#define WCD934X_TX_COM_TXFE_DIV_START 0x067c -#define WCD934X_TX_COM_TXFE_DIV_STOP_9P6M 0x067d -#define WCD934X_TX_COM_TXFE_DIV_STOP_12P288M 0x067e -#define WCD934X_TX_1_2_TEST_EN 0x067f -#define WCD934X_TX_1_2_ADC_IB 0x0680 -#define WCD934X_TX_1_2_ATEST_REFCTL 0x0681 -#define WCD934X_TX_1_2_TEST_CTL 0x0682 -#define WCD934X_TX_1_2_TEST_BLK_EN 0x0683 -#define WCD934X_TX_1_2_TXFE_CLKDIV 0x0684 -#define WCD934X_TX_1_2_SAR1_ERR 0x0685 -#define WCD934X_TX_1_2_SAR2_ERR 0x0686 -#define WCD934X_TX_3_4_TEST_EN 0x0687 -#define WCD934X_TX_3_4_ADC_IB 0x0688 -#define WCD934X_TX_3_4_ATEST_REFCTL 0x0689 -#define WCD934X_TX_3_4_TEST_CTL 0x068a -#define WCD934X_TX_3_4_TEST_BLK_EN 0x068b -#define WCD934X_TX_3_4_TXFE_CLKDIV 0x068c -#define WCD934X_TX_3_4_SAR1_ERR 0x068d -#define WCD934X_TX_3_4_SAR2_ERR 0x068e -#define WCD934X_CLASSH_MODE_1 0x0697 -#define WCD934X_CLASSH_MODE_2 0x0698 -#define WCD934X_CLASSH_MODE_3 0x0699 -#define WCD934X_CLASSH_CTRL_VCL_1 0x069a -#define WCD934X_CLASSH_CTRL_VCL_2 0x069b -#define WCD934X_CLASSH_CTRL_CCL_1 0x069c -#define WCD934X_CLASSH_CTRL_CCL_2 0x069d -#define WCD934X_CLASSH_CTRL_CCL_3 0x069e -#define WCD934X_CLASSH_CTRL_CCL_4 0x069f -#define WCD934X_CLASSH_CTRL_CCL_5 0x06a0 -#define WCD934X_CLASSH_BUCK_TMUX_A_D 0x06a1 -#define WCD934X_CLASSH_BUCK_SW_DRV_CNTL 0x06a2 -#define WCD934X_CLASSH_SPARE 0x06a3 -#define WCD934X_FLYBACK_EN 0x06a4 -#define WCD934X_FLYBACK_VNEG_CTRL_1 0x06a5 -#define WCD934X_FLYBACK_VNEG_CTRL_2 0x06a6 -#define WCD934X_FLYBACK_VNEG_CTRL_3 0x06a7 -#define WCD934X_FLYBACK_VNEG_CTRL_4 0x06a8 -#define WCD934X_FLYBACK_VNEG_CTRL_5 0x06a9 -#define WCD934X_FLYBACK_VNEG_CTRL_6 0x06aa -#define WCD934X_FLYBACK_VNEG_CTRL_7 0x06ab -#define WCD934X_FLYBACK_VNEG_CTRL_8 0x06ac -#define WCD934X_FLYBACK_VNEG_CTRL_9 0x06ad -#define WCD934X_FLYBACK_VNEGDAC_CTRL_1 0x06ae -#define WCD934X_FLYBACK_VNEGDAC_CTRL_2 0x06af -#define WCD934X_FLYBACK_VNEGDAC_CTRL_3 0x06b0 -#define WCD934X_FLYBACK_CTRL_1 0x06b1 -#define WCD934X_FLYBACK_TEST_CTL 0x06b2 -#define WCD934X_RX_AUX_SW_CTL 0x06b3 -#define WCD934X_RX_PA_AUX_IN_CONN 0x06b4 -#define WCD934X_RX_TIMER_DIV 0x06b5 -#define WCD934X_RX_OCP_CTL 0x06b6 -#define WCD934X_RX_OCP_COUNT 0x06b7 -#define WCD934X_RX_BIAS_EAR_DAC 0x06b8 -#define WCD934X_RX_BIAS_EAR_AMP 0x06b9 -#define WCD934X_RX_BIAS_HPH_LDO 0x06ba -#define WCD934X_RX_BIAS_HPH_PA 0x06bb -#define WCD934X_RX_BIAS_HPH_RDACBUFF_CNP2 0x06bc -#define WCD934X_RX_BIAS_HPH_RDAC_LDO 0x06bd -#define WCD934X_RX_BIAS_HPH_CNP1 0x06be -#define WCD934X_RX_BIAS_HPH_LOWPOWER 0x06bf -#define WCD934X_RX_BIAS_DIFFLO_PA 0x06c0 -#define WCD934X_RX_BIAS_DIFFLO_REF 0x06c1 -#define WCD934X_RX_BIAS_DIFFLO_LDO 0x06c2 -#define WCD934X_RX_BIAS_SELO_DAC_PA 0x06c3 -#define WCD934X_RX_BIAS_BUCK_RST 0x06c4 -#define WCD934X_RX_BIAS_BUCK_VREF_ERRAMP 0x06c5 -#define WCD934X_RX_BIAS_FLYB_ERRAMP 0x06c6 -#define WCD934X_RX_BIAS_FLYB_BUFF 0x06c7 -#define WCD934X_RX_BIAS_FLYB_MID_RST 0x06c8 -#define WCD934X_HPH_L_STATUS 0x06c9 -#define WCD934X_HPH_R_STATUS 0x06ca -#define WCD934X_HPH_CNP_EN 0x06cb -#define WCD934X_HPH_CNP_WG_CTL 0x06cc -#define WCD934X_HPH_CNP_WG_TIME 0x06cd -#define WCD934X_HPH_OCP_CTL 0x06ce -#define WCD934X_HPH_AUTO_CHOP 0x06cf -#define WCD934X_HPH_CHOP_CTL 0x06d0 -#define WCD934X_HPH_PA_CTL1 0x06d1 -#define WCD934X_HPH_PA_CTL2 0x06d2 -#define WCD934X_HPH_L_EN 0x06d3 -#define WCD934X_HPH_L_TEST 0x06d4 -#define WCD934X_HPH_L_ATEST 0x06d5 -#define WCD934X_HPH_R_EN 0x06d6 -#define WCD934X_HPH_R_TEST 0x06d7 -#define WCD934X_HPH_R_ATEST 0x06d8 -#define WCD934X_HPH_RDAC_CLK_CTL1 0x06d9 -#define WCD934X_HPH_RDAC_CLK_CTL2 0x06da -#define WCD934X_HPH_RDAC_LDO_CTL 0x06db -#define WCD934X_HPH_RDAC_CHOP_CLK_LP_CTL 0x06dc -#define WCD934X_HPH_REFBUFF_UHQA_CTL 0x06dd -#define WCD934X_HPH_REFBUFF_LP_CTL 0x06de -#define WCD934X_HPH_L_DAC_CTL 0x06df -#define WCD934X_HPH_R_DAC_CTL 0x06e0 -#define WCD934X_EAR_EN_REG 0x06e1 -#define WCD934X_EAR_CMBUFF 0x06e2 -#define WCD934X_EAR_ICTL 0x06e3 -#define WCD934X_EAR_EN_DBG_CTL 0x06e4 -#define WCD934X_EAR_CNP 0x06e5 -#define WCD934X_EAR_DAC_CTL_ATEST 0x06e6 -#define WCD934X_EAR_STATUS_REG 0x06e7 -#define WCD934X_EAR_EAR_MISC 0x06e8 -#define WCD934X_DIFF_LO_MISC 0x06e9 -#define WCD934X_DIFF_LO_LO2_COMPANDER 0x06ea -#define WCD934X_DIFF_LO_LO1_COMPANDER 0x06eb -#define WCD934X_DIFF_LO_COMMON 0x06ec -#define WCD934X_DIFF_LO_BYPASS_EN 0x06ed -#define WCD934X_DIFF_LO_CNP 0x06ee -#define WCD934X_DIFF_LO_CORE_OUT_PROG 0x06ef -#define WCD934X_DIFF_LO_LDO_OUT_PROG 0x06f0 -#define WCD934X_DIFF_LO_COM_SWCAP_REFBUF_FREQ 0x06f1 -#define WCD934X_DIFF_LO_COM_PA_FREQ 0x06f2 -#define WCD934X_DIFF_LO_RESERVED_REG 0x06f3 -#define WCD934X_DIFF_LO_LO1_STATUS_1 0x06f4 -#define WCD934X_DIFF_LO_LO1_STATUS_2 0x06f5 -#define WCD934X_ANA_NEW_PAGE_REGISTER 0x0700 -#define WCD934X_HPH_NEW_ANA_HPH2 0x0701 -#define WCD934X_HPH_NEW_ANA_HPH3 0x0702 -#define WCD934X_SLNQ_ANA_EN 0x0703 -#define WCD934X_SLNQ_ANA_STATUS 0x0704 -#define WCD934X_SLNQ_ANA_LDO_CONFIG 0x0705 -#define WCD934X_SLNQ_ANA_LDO_OCP_CONFIG 0x0706 -#define WCD934X_SLNQ_ANA_TX_LDO_CONFIG 0x0707 -#define WCD934X_SLNQ_ANA_TX_DRV_CONFIG 0x0708 -#define WCD934X_SLNQ_ANA_RX_CONFIG_1 0x0709 -#define WCD934X_SLNQ_ANA_RX_CONFIG_2 0x070a -#define WCD934X_SLNQ_ANA_PLL_ENABLES 0x070b -#define WCD934X_SLNQ_ANA_PLL_PRESET 0x070c -#define WCD934X_SLNQ_ANA_PLL_STATUS 0x070d -#define WCD934X_CLK_SYS_PLL_ENABLES 0x070e -#define WCD934X_CLK_SYS_PLL_PRESET 0x070f -#define WCD934X_CLK_SYS_PLL_STATUS 0x0710 -#define WCD934X_CLK_SYS_MCLK_PRG 0x0711 -#define WCD934X_CLK_SYS_MCLK2_PRG1 0x0712 -#define WCD934X_CLK_SYS_MCLK2_PRG2 0x0713 -#define WCD934X_CLK_SYS_XO_PRG 0x0714 -#define WCD934X_CLK_SYS_XO_CAP_XTP 0x0715 -#define WCD934X_CLK_SYS_XO_CAP_XTM 0x0716 -#define WCD934X_BOOST_BST_EN_DLY 0x0718 -#define WCD934X_BOOST_CTRL_ILIM 0x0719 -#define WCD934X_BOOST_VOUT_SETTING 0x071a -#define WCD934X_SIDO_NEW_VOUT_A_STARTUP 0x071b -#define WCD934X_SIDO_NEW_VOUT_D_STARTUP 0x071c -#define WCD934X_SIDO_NEW_VOUT_D_FREQ1 0x071d -#define WCD934X_SIDO_NEW_VOUT_D_FREQ2 0x071e -#define WCD934X_MBHC_NEW_ELECT_REM_CLAMP_CTL 0x071f -#define WCD934X_MBHC_NEW_CTL_1 0x0720 -#define WCD934X_MBHC_NEW_CTL_2 0x0721 -#define WCD934X_MBHC_NEW_PLUG_DETECT_CTL 0x0722 -#define WCD934X_MBHC_NEW_ZDET_ANA_CTL 0x0723 -#define WCD934X_MBHC_NEW_ZDET_RAMP_CTL 0x0724 -#define WCD934X_MBHC_NEW_FSM_STATUS 0x0725 -#define WCD934X_MBHC_NEW_ADC_RESULT 0x0726 -#define WCD934X_TX_NEW_AMIC_4_5_SEL 0x0727 -#define WCD934X_VBADC_NEW_ADC_MODE 0x072f -#define WCD934X_VBADC_NEW_ADC_DOUTMSB 0x0730 -#define WCD934X_VBADC_NEW_ADC_DOUTLSB 0x0731 -#define WCD934X_HPH_NEW_INT_RDAC_GAIN_CTL 0x0732 -#define WCD934X_HPH_NEW_INT_RDAC_HD2_CTL 0x0733 -#define WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_L 0x0733 -#define WCD934X_HPH_NEW_INT_RDAC_VREF_CTL 0x0734 -#define WCD934X_HPH_NEW_INT_RDAC_OVERRIDE_CTL 0x0735 -#define WCD934X_HPH_NEW_INT_RDAC_MISC1 0x0736 -#define WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_R 0x0736 -#define WCD934X_HPH_NEW_INT_PA_MISC1 0x0737 -#define WCD934X_HPH_NEW_INT_PA_MISC2 0x0738 -#define WCD934X_HPH_NEW_INT_PA_RDAC_MISC 0x0739 -#define WCD934X_HPH_NEW_INT_HPH_TIMER1 0x073a -#define WCD934X_HPH_NEW_INT_HPH_TIMER2 0x073b -#define WCD934X_HPH_NEW_INT_HPH_TIMER3 0x073c -#define WCD934X_HPH_NEW_INT_HPH_TIMER4 0x073d -#define WCD934X_HPH_NEW_INT_PA_RDAC_MISC2 0x073e -#define WCD934X_HPH_NEW_INT_PA_RDAC_MISC3 0x073f -#define WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI 0x0745 -#define WCD934X_RX_NEW_INT_HPH_RDAC_BIAS_ULP 0x0746 -#define WCD934X_RX_NEW_INT_HPH_RDAC_LDO_LP 0x0747 -#define WCD934X_SLNQ_INT_ANA_INT_LDO_TEST 0x074b -#define WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_1 0x074c -#define WCD934X_SLNQ_INT_ANA_INT_LDO_DEBUG_2 0x074d -#define WCD934X_SLNQ_INT_ANA_INT_TX_LDO_TEST 0x074e -#define WCD934X_SLNQ_INT_ANA_INT_TX_DRV_TEST 0x074f -#define WCD934X_SLNQ_INT_ANA_INT_RX_TEST 0x0750 -#define WCD934X_SLNQ_INT_ANA_INT_RX_TEST_STATUS 0x0751 -#define WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_1 0x0752 -#define WCD934X_SLNQ_INT_ANA_INT_RX_DEBUG_2 0x0753 -#define WCD934X_SLNQ_INT_ANA_INT_CLK_CTRL 0x0754 -#define WCD934X_SLNQ_INT_ANA_INT_RESERVED_1 0x0755 -#define WCD934X_SLNQ_INT_ANA_INT_RESERVED_2 0x0756 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG0 0x0757 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_POST_DIV_REG1 0x0758 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG0 0x0759 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_REF_DIV_REG1 0x075a -#define WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG0 0x075b -#define WCD934X_SLNQ_INT_ANA_INT_PLL_FILTER_REG1 0x075c -#define WCD934X_SLNQ_INT_ANA_INT_PLL_L_VAL 0x075d -#define WCD934X_SLNQ_INT_ANA_INT_PLL_M_VAL 0x075e -#define WCD934X_SLNQ_INT_ANA_INT_PLL_N_VAL 0x075f -#define WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG0 0x0760 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_PFD_CP_DSM_PROG 0x0761 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_VCO_PROG 0x0762 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_TEST_REG1 0x0763 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_LDO_LOCK_CFG 0x0764 -#define WCD934X_SLNQ_INT_ANA_INT_PLL_DIG_LOCK_DET_CFG 0x0765 -#define WCD934X_CLK_SYS_INT_POST_DIV_REG0 0x076c -#define WCD934X_CLK_SYS_INT_POST_DIV_REG1 0x076d -#define WCD934X_CLK_SYS_INT_REF_DIV_REG0 0x076e -#define WCD934X_CLK_SYS_INT_REF_DIV_REG1 0x076f -#define WCD934X_CLK_SYS_INT_FILTER_REG0 0x0770 -#define WCD934X_CLK_SYS_INT_FILTER_REG1 0x0771 -#define WCD934X_CLK_SYS_INT_PLL_L_VAL 0x0772 -#define WCD934X_CLK_SYS_INT_PLL_M_VAL 0x0773 -#define WCD934X_CLK_SYS_INT_PLL_N_VAL 0x0774 -#define WCD934X_CLK_SYS_INT_TEST_REG0 0x0775 -#define WCD934X_CLK_SYS_INT_PFD_CP_DSM_PROG 0x0776 -#define WCD934X_CLK_SYS_INT_VCO_PROG 0x0777 -#define WCD934X_CLK_SYS_INT_TEST_REG1 0x0778 -#define WCD934X_CLK_SYS_INT_LDO_LOCK_CFG 0x0779 -#define WCD934X_CLK_SYS_INT_DIG_LOCK_DET_CFG 0x077a -#define WCD934X_CLK_SYS_INT_CLK_TEST1 0x077b -#define WCD934X_CLK_SYS_INT_CLK_TEST2 0x077c -#define WCD934X_CLK_SYS_INT_CLK_TEST3 0x077d -#define WCD934X_CLK_SYS_INT_XO_TEST1 0x077e -#define WCD934X_CLK_SYS_INT_XO_TEST2 0x077f -#define WCD934X_BOOST_INT_VCOMP_HYST 0x0787 -#define WCD934X_BOOST_INT_VLOOP_FILTER 0x0788 -#define WCD934X_BOOST_INT_CTRL_IDELTA 0x0789 -#define WCD934X_BOOST_INT_CTRL_ILIM_STARTUP 0x078a -#define WCD934X_BOOST_INT_CTRL_MIN_ONTIME 0x078b -#define WCD934X_BOOST_INT_CTRL_MAX_ONTIME 0x078c -#define WCD934X_BOOST_INT_CTRL_TIMING 0x078d -#define WCD934X_BOOST_INT_TMUX_A_D 0x078e -#define WCD934X_BOOST_INT_SW_DRV_CNTL 0x078f -#define WCD934X_BOOST_INT_SPARE1 0x0790 -#define WCD934X_BOOST_INT_SPARE2 0x0791 -#define WCD934X_SIDO_NEW_INT_RAMP_STATUS 0x0796 -#define WCD934X_SIDO_NEW_INT_SPARE_1 0x0797 -#define WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_A 0x0798 -#define WCD934X_SIDO_NEW_INT_DEBUG_VOUT_SETTING_D 0x0799 -#define WCD934X_SIDO_NEW_INT_RAMP_INC_WAIT 0x079a -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_CTL 0x079b -#define WCD934X_SIDO_NEW_INT_RAMP_IBLEED_CTL 0x079c -#define WCD934X_SIDO_NEW_INT_DEBUG_CPROVR_TEST 0x079d -#define WCD934X_SIDO_NEW_INT_RAMP_CTL_A 0x079e -#define WCD934X_SIDO_NEW_INT_RAMP_CTL_D 0x079f -#define WCD934X_SIDO_NEW_INT_RAMP_TIMEOUT_PERIOD 0x07a0 -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING1 0x07a1 -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING2 0x07a2 -#define WCD934X_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING3 0x07a3 -#define WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL1 0x07a4 -#define WCD934X_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL2 0x07a5 -#define WCD934X_MBHC_NEW_INT_SLNQ_HPF 0x07af -#define WCD934X_MBHC_NEW_INT_SLNQ_REF 0x07b0 -#define WCD934X_MBHC_NEW_INT_SLNQ_COMP 0x07b1 -#define WCD934X_MBHC_NEW_INT_SPARE_2 0x07b2 -#define WCD934X_PAGE10_PAGE_REGISTER 0x0a00 -#define WCD934X_CDC_ANC0_CLK_RESET_CTL 0x0a01 -#define WCD934X_CDC_ANC0_MODE_1_CTL 0x0a02 -#define WCD934X_CDC_ANC0_MODE_2_CTL 0x0a03 -#define WCD934X_CDC_ANC0_FF_SHIFT 0x0a04 -#define WCD934X_CDC_ANC0_FB_SHIFT 0x0a05 -#define WCD934X_CDC_ANC0_LPF_FF_A_CTL 0x0a06 -#define WCD934X_CDC_ANC0_LPF_FF_B_CTL 0x0a07 -#define WCD934X_CDC_ANC0_LPF_FB_CTL 0x0a08 -#define WCD934X_CDC_ANC0_SMLPF_CTL 0x0a09 -#define WCD934X_CDC_ANC0_DCFLT_SHIFT_CTL 0x0a0a -#define WCD934X_CDC_ANC0_IIR_ADAPT_CTL 0x0a0b -#define WCD934X_CDC_ANC0_IIR_COEFF_1_CTL 0x0a0c -#define WCD934X_CDC_ANC0_IIR_COEFF_2_CTL 0x0a0d -#define WCD934X_CDC_ANC0_FF_A_GAIN_CTL 0x0a0e -#define WCD934X_CDC_ANC0_FF_B_GAIN_CTL 0x0a0f -#define WCD934X_CDC_ANC0_FB_GAIN_CTL 0x0a10 -#define WCD934X_CDC_ANC0_RC_COMMON_CTL 0x0a11 -#define WCD934X_CDC_ANC0_FIFO_COMMON_CTL 0x0a13 -#define WCD934X_CDC_ANC0_RC0_STATUS_FMIN_CNTR 0x0a14 -#define WCD934X_CDC_ANC0_RC1_STATUS_FMIN_CNTR 0x0a15 -#define WCD934X_CDC_ANC0_RC0_STATUS_FMAX_CNTR 0x0a16 -#define WCD934X_CDC_ANC0_RC1_STATUS_FMAX_CNTR 0x0a17 -#define WCD934X_CDC_ANC0_STATUS_FIFO 0x0a18 -#define WCD934X_CDC_ANC1_CLK_RESET_CTL 0x0a19 -#define WCD934X_CDC_ANC1_MODE_1_CTL 0x0a1a -#define WCD934X_CDC_ANC1_MODE_2_CTL 0x0a1b -#define WCD934X_CDC_ANC1_FF_SHIFT 0x0a1c -#define WCD934X_CDC_ANC1_FB_SHIFT 0x0a1d -#define WCD934X_CDC_ANC1_LPF_FF_A_CTL 0x0a1e -#define WCD934X_CDC_ANC1_LPF_FF_B_CTL 0x0a1f -#define WCD934X_CDC_ANC1_LPF_FB_CTL 0x0a20 -#define WCD934X_CDC_ANC1_SMLPF_CTL 0x0a21 -#define WCD934X_CDC_ANC1_DCFLT_SHIFT_CTL 0x0a22 -#define WCD934X_CDC_ANC1_IIR_ADAPT_CTL 0x0a23 -#define WCD934X_CDC_ANC1_IIR_COEFF_1_CTL 0x0a24 -#define WCD934X_CDC_ANC1_IIR_COEFF_2_CTL 0x0a25 -#define WCD934X_CDC_ANC1_FF_A_GAIN_CTL 0x0a26 -#define WCD934X_CDC_ANC1_FF_B_GAIN_CTL 0x0a27 -#define WCD934X_CDC_ANC1_FB_GAIN_CTL 0x0a28 -#define WCD934X_CDC_ANC1_RC_COMMON_CTL 0x0a29 -#define WCD934X_CDC_ANC1_FIFO_COMMON_CTL 0x0a2b -#define WCD934X_CDC_ANC1_RC0_STATUS_FMIN_CNTR 0x0a2c -#define WCD934X_CDC_ANC1_RC1_STATUS_FMIN_CNTR 0x0a2d -#define WCD934X_CDC_ANC1_RC0_STATUS_FMAX_CNTR 0x0a2e -#define WCD934X_CDC_ANC1_RC1_STATUS_FMAX_CNTR 0x0a2f -#define WCD934X_CDC_ANC1_STATUS_FIFO 0x0a30 -#define WCD934X_CDC_TX0_TX_PATH_CTL 0x0a31 -#define WCD934X_CDC_TX0_TX_PATH_CFG0 0x0a32 -#define WCD934X_CDC_TX0_TX_PATH_CFG1 0x0a33 -#define WCD934X_CDC_TX0_TX_VOL_CTL 0x0a34 -#define WCD934X_CDC_TX0_TX_PATH_192_CTL 0x0a35 -#define WCD934X_CDC_TX0_TX_PATH_192_CFG 0x0a36 -#define WCD934X_CDC_TX0_TX_PATH_SEC0 0x0a37 -#define WCD934X_CDC_TX0_TX_PATH_SEC1 0x0a38 -#define WCD934X_CDC_TX0_TX_PATH_SEC2 0x0a39 -#define WCD934X_CDC_TX0_TX_PATH_SEC3 0x0a3a -#define WCD934X_CDC_TX0_TX_PATH_SEC4 0x0a3b -#define WCD934X_CDC_TX0_TX_PATH_SEC5 0x0a3c -#define WCD934X_CDC_TX0_TX_PATH_SEC6 0x0a3d -#define WCD934X_CDC_TX0_TX_PATH_SEC7 0x0a3e -#define WCD934X_CDC_TX1_TX_PATH_CTL 0x0a41 -#define WCD934X_CDC_TX1_TX_PATH_CFG0 0x0a42 -#define WCD934X_CDC_TX1_TX_PATH_CFG1 0x0a43 -#define WCD934X_CDC_TX1_TX_VOL_CTL 0x0a44 -#define WCD934X_CDC_TX1_TX_PATH_192_CTL 0x0a45 -#define WCD934X_CDC_TX1_TX_PATH_192_CFG 0x0a46 -#define WCD934X_CDC_TX1_TX_PATH_SEC0 0x0a47 -#define WCD934X_CDC_TX1_TX_PATH_SEC1 0x0a48 -#define WCD934X_CDC_TX1_TX_PATH_SEC2 0x0a49 -#define WCD934X_CDC_TX1_TX_PATH_SEC3 0x0a4a -#define WCD934X_CDC_TX1_TX_PATH_SEC4 0x0a4b -#define WCD934X_CDC_TX1_TX_PATH_SEC5 0x0a4c -#define WCD934X_CDC_TX1_TX_PATH_SEC6 0x0a4d -#define WCD934X_CDC_TX2_TX_PATH_CTL 0x0a51 -#define WCD934X_CDC_TX2_TX_PATH_CFG0 0x0a52 -#define WCD934X_CDC_TX2_TX_PATH_CFG1 0x0a53 -#define WCD934X_CDC_TX2_TX_VOL_CTL 0x0a54 -#define WCD934X_CDC_TX2_TX_PATH_192_CTL 0x0a55 -#define WCD934X_CDC_TX2_TX_PATH_192_CFG 0x0a56 -#define WCD934X_CDC_TX2_TX_PATH_SEC0 0x0a57 -#define WCD934X_CDC_TX2_TX_PATH_SEC1 0x0a58 -#define WCD934X_CDC_TX2_TX_PATH_SEC2 0x0a59 -#define WCD934X_CDC_TX2_TX_PATH_SEC3 0x0a5a -#define WCD934X_CDC_TX2_TX_PATH_SEC4 0x0a5b -#define WCD934X_CDC_TX2_TX_PATH_SEC5 0x0a5c -#define WCD934X_CDC_TX2_TX_PATH_SEC6 0x0a5d -#define WCD934X_CDC_TX3_TX_PATH_CTL 0x0a61 -#define WCD934X_CDC_TX3_TX_PATH_CFG0 0x0a62 -#define WCD934X_CDC_TX3_TX_PATH_CFG1 0x0a63 -#define WCD934X_CDC_TX3_TX_VOL_CTL 0x0a64 -#define WCD934X_CDC_TX3_TX_PATH_192_CTL 0x0a65 -#define WCD934X_CDC_TX3_TX_PATH_192_CFG 0x0a66 -#define WCD934X_CDC_TX3_TX_PATH_SEC0 0x0a67 -#define WCD934X_CDC_TX3_TX_PATH_SEC1 0x0a68 -#define WCD934X_CDC_TX3_TX_PATH_SEC2 0x0a69 -#define WCD934X_CDC_TX3_TX_PATH_SEC3 0x0a6a -#define WCD934X_CDC_TX3_TX_PATH_SEC4 0x0a6b -#define WCD934X_CDC_TX3_TX_PATH_SEC5 0x0a6c -#define WCD934X_CDC_TX3_TX_PATH_SEC6 0x0a6d -#define WCD934X_CDC_TX4_TX_PATH_CTL 0x0a71 -#define WCD934X_CDC_TX4_TX_PATH_CFG0 0x0a72 -#define WCD934X_CDC_TX4_TX_PATH_CFG1 0x0a73 -#define WCD934X_CDC_TX4_TX_VOL_CTL 0x0a74 -#define WCD934X_CDC_TX4_TX_PATH_192_CTL 0x0a75 -#define WCD934X_CDC_TX4_TX_PATH_192_CFG 0x0a76 -#define WCD934X_CDC_TX4_TX_PATH_SEC0 0x0a77 -#define WCD934X_CDC_TX4_TX_PATH_SEC1 0x0a78 -#define WCD934X_CDC_TX4_TX_PATH_SEC2 0x0a79 -#define WCD934X_CDC_TX4_TX_PATH_SEC3 0x0a7a -#define WCD934X_CDC_TX4_TX_PATH_SEC4 0x0a7b -#define WCD934X_CDC_TX4_TX_PATH_SEC5 0x0a7c -#define WCD934X_CDC_TX4_TX_PATH_SEC6 0x0a7d -#define WCD934X_CDC_TX5_TX_PATH_CTL 0x0a81 -#define WCD934X_CDC_TX5_TX_PATH_CFG0 0x0a82 -#define WCD934X_CDC_TX5_TX_PATH_CFG1 0x0a83 -#define WCD934X_CDC_TX5_TX_VOL_CTL 0x0a84 -#define WCD934X_CDC_TX5_TX_PATH_192_CTL 0x0a85 -#define WCD934X_CDC_TX5_TX_PATH_192_CFG 0x0a86 -#define WCD934X_CDC_TX5_TX_PATH_SEC0 0x0a87 -#define WCD934X_CDC_TX5_TX_PATH_SEC1 0x0a88 -#define WCD934X_CDC_TX5_TX_PATH_SEC2 0x0a89 -#define WCD934X_CDC_TX5_TX_PATH_SEC3 0x0a8a -#define WCD934X_CDC_TX5_TX_PATH_SEC4 0x0a8b -#define WCD934X_CDC_TX5_TX_PATH_SEC5 0x0a8c -#define WCD934X_CDC_TX5_TX_PATH_SEC6 0x0a8d -#define WCD934X_CDC_TX6_TX_PATH_CTL 0x0a91 -#define WCD934X_CDC_TX6_TX_PATH_CFG0 0x0a92 -#define WCD934X_CDC_TX6_TX_PATH_CFG1 0x0a93 -#define WCD934X_CDC_TX6_TX_VOL_CTL 0x0a94 -#define WCD934X_CDC_TX6_TX_PATH_192_CTL 0x0a95 -#define WCD934X_CDC_TX6_TX_PATH_192_CFG 0x0a96 -#define WCD934X_CDC_TX6_TX_PATH_SEC0 0x0a97 -#define WCD934X_CDC_TX6_TX_PATH_SEC1 0x0a98 -#define WCD934X_CDC_TX6_TX_PATH_SEC2 0x0a99 -#define WCD934X_CDC_TX6_TX_PATH_SEC3 0x0a9a -#define WCD934X_CDC_TX6_TX_PATH_SEC4 0x0a9b -#define WCD934X_CDC_TX6_TX_PATH_SEC5 0x0a9c -#define WCD934X_CDC_TX6_TX_PATH_SEC6 0x0a9d -#define WCD934X_CDC_TX7_TX_PATH_CTL 0x0aa1 -#define WCD934X_CDC_TX7_TX_PATH_CFG0 0x0aa2 -#define WCD934X_CDC_TX7_TX_PATH_CFG1 0x0aa3 -#define WCD934X_CDC_TX7_TX_VOL_CTL 0x0aa4 -#define WCD934X_CDC_TX7_TX_PATH_192_CTL 0x0aa5 -#define WCD934X_CDC_TX7_TX_PATH_192_CFG 0x0aa6 -#define WCD934X_CDC_TX7_TX_PATH_SEC0 0x0aa7 -#define WCD934X_CDC_TX7_TX_PATH_SEC1 0x0aa8 -#define WCD934X_CDC_TX7_TX_PATH_SEC2 0x0aa9 -#define WCD934X_CDC_TX7_TX_PATH_SEC3 0x0aaa -#define WCD934X_CDC_TX7_TX_PATH_SEC4 0x0aab -#define WCD934X_CDC_TX7_TX_PATH_SEC5 0x0aac -#define WCD934X_CDC_TX7_TX_PATH_SEC6 0x0aad -#define WCD934X_CDC_TX8_TX_PATH_CTL 0x0ab1 -#define WCD934X_CDC_TX8_TX_PATH_CFG0 0x0ab2 -#define WCD934X_CDC_TX8_TX_PATH_CFG1 0x0ab3 -#define WCD934X_CDC_TX8_TX_VOL_CTL 0x0ab4 -#define WCD934X_CDC_TX8_TX_PATH_192_CTL 0x0ab5 -#define WCD934X_CDC_TX8_TX_PATH_192_CFG 0x0ab6 -#define WCD934X_CDC_TX8_TX_PATH_SEC0 0x0ab7 -#define WCD934X_CDC_TX8_TX_PATH_SEC1 0x0ab8 -#define WCD934X_CDC_TX8_TX_PATH_SEC2 0x0ab9 -#define WCD934X_CDC_TX8_TX_PATH_SEC3 0x0aba -#define WCD934X_CDC_TX8_TX_PATH_SEC4 0x0abb -#define WCD934X_CDC_TX8_TX_PATH_SEC5 0x0abc -#define WCD934X_CDC_TX8_TX_PATH_SEC6 0x0abd -#define WCD934X_CDC_TX9_SPKR_PROT_PATH_CTL 0x0ac2 -#define WCD934X_CDC_TX9_SPKR_PROT_PATH_CFG0 0x0ac3 -#define WCD934X_CDC_TX10_SPKR_PROT_PATH_CTL 0x0ac6 -#define WCD934X_CDC_TX10_SPKR_PROT_PATH_CFG0 0x0ac7 -#define WCD934X_CDC_TX11_SPKR_PROT_PATH_CTL 0x0aca -#define WCD934X_CDC_TX11_SPKR_PROT_PATH_CFG0 0x0acb -#define WCD934X_CDC_TX12_SPKR_PROT_PATH_CTL 0x0ace -#define WCD934X_CDC_TX12_SPKR_PROT_PATH_CFG0 0x0acf -#define WCD934X_PAGE11_PAGE_REGISTER 0x0b00 -#define WCD934X_CDC_COMPANDER1_CTL0 0x0b01 -#define WCD934X_CDC_COMPANDER1_CTL1 0x0b02 -#define WCD934X_CDC_COMPANDER1_CTL2 0x0b03 -#define WCD934X_CDC_COMPANDER1_CTL3 0x0b04 -#define WCD934X_CDC_COMPANDER1_CTL4 0x0b05 -#define WCD934X_CDC_COMPANDER1_CTL5 0x0b06 -#define WCD934X_CDC_COMPANDER1_CTL6 0x0b07 -#define WCD934X_CDC_COMPANDER1_CTL7 0x0b08 -#define WCD934X_CDC_COMPANDER2_CTL0 0x0b09 -#define WCD934X_CDC_COMPANDER2_CTL1 0x0b0a -#define WCD934X_CDC_COMPANDER2_CTL2 0x0b0b -#define WCD934X_CDC_COMPANDER2_CTL3 0x0b0c -#define WCD934X_CDC_COMPANDER2_CTL4 0x0b0d -#define WCD934X_CDC_COMPANDER2_CTL5 0x0b0e -#define WCD934X_CDC_COMPANDER2_CTL6 0x0b0f -#define WCD934X_CDC_COMPANDER2_CTL7 0x0b10 -#define WCD934X_CDC_COMPANDER3_CTL0 0x0b11 -#define WCD934X_CDC_COMPANDER3_CTL1 0x0b12 -#define WCD934X_CDC_COMPANDER3_CTL2 0x0b13 -#define WCD934X_CDC_COMPANDER3_CTL3 0x0b14 -#define WCD934X_CDC_COMPANDER3_CTL4 0x0b15 -#define WCD934X_CDC_COMPANDER3_CTL5 0x0b16 -#define WCD934X_CDC_COMPANDER3_CTL6 0x0b17 -#define WCD934X_CDC_COMPANDER3_CTL7 0x0b18 -#define WCD934X_CDC_COMPANDER4_CTL0 0x0b19 -#define WCD934X_CDC_COMPANDER4_CTL1 0x0b1a -#define WCD934X_CDC_COMPANDER4_CTL2 0x0b1b -#define WCD934X_CDC_COMPANDER4_CTL3 0x0b1c -#define WCD934X_CDC_COMPANDER4_CTL4 0x0b1d -#define WCD934X_CDC_COMPANDER4_CTL5 0x0b1e -#define WCD934X_CDC_COMPANDER4_CTL6 0x0b1f -#define WCD934X_CDC_COMPANDER4_CTL7 0x0b20 -#define WCD934X_CDC_COMPANDER7_CTL0 0x0b31 -#define WCD934X_CDC_COMPANDER7_CTL1 0x0b32 -#define WCD934X_CDC_COMPANDER7_CTL2 0x0b33 -#define WCD934X_CDC_COMPANDER7_CTL3 0x0b34 -#define WCD934X_CDC_COMPANDER7_CTL4 0x0b35 -#define WCD934X_CDC_COMPANDER7_CTL5 0x0b36 -#define WCD934X_CDC_COMPANDER7_CTL6 0x0b37 -#define WCD934X_CDC_COMPANDER7_CTL7 0x0b38 -#define WCD934X_CDC_COMPANDER8_CTL0 0x0b39 -#define WCD934X_CDC_COMPANDER8_CTL1 0x0b3a -#define WCD934X_CDC_COMPANDER8_CTL2 0x0b3b -#define WCD934X_CDC_COMPANDER8_CTL3 0x0b3c -#define WCD934X_CDC_COMPANDER8_CTL4 0x0b3d -#define WCD934X_CDC_COMPANDER8_CTL5 0x0b3e -#define WCD934X_CDC_COMPANDER8_CTL6 0x0b3f -#define WCD934X_CDC_COMPANDER8_CTL7 0x0b40 -#define WCD934X_CDC_RX0_RX_PATH_CTL 0x0b41 -#define WCD934X_CDC_RX0_RX_PATH_CFG0 0x0b42 -#define WCD934X_CDC_RX0_RX_PATH_CFG1 0x0b43 -#define WCD934X_CDC_RX0_RX_PATH_CFG2 0x0b44 -#define WCD934X_CDC_RX0_RX_VOL_CTL 0x0b45 -#define WCD934X_CDC_RX0_RX_PATH_MIX_CTL 0x0b46 -#define WCD934X_CDC_RX0_RX_PATH_MIX_CFG 0x0b47 -#define WCD934X_CDC_RX0_RX_VOL_MIX_CTL 0x0b48 -#define WCD934X_CDC_RX0_RX_PATH_SEC0 0x0b49 -#define WCD934X_CDC_RX0_RX_PATH_SEC1 0x0b4a -#define WCD934X_CDC_RX0_RX_PATH_SEC2 0x0b4b -#define WCD934X_CDC_RX0_RX_PATH_SEC3 0x0b4c -#define WCD934X_CDC_RX0_RX_PATH_SEC5 0x0b4e -#define WCD934X_CDC_RX0_RX_PATH_SEC6 0x0b4f -#define WCD934X_CDC_RX0_RX_PATH_SEC7 0x0b50 -#define WCD934X_CDC_RX0_RX_PATH_MIX_SEC0 0x0b51 -#define WCD934X_CDC_RX0_RX_PATH_MIX_SEC1 0x0b52 -#define WCD934X_CDC_RX0_RX_PATH_DSMDEM_CTL 0x0b53 -#define WCD934X_CDC_RX1_RX_PATH_CTL 0x0b55 -#define WCD934X_CDC_RX1_RX_PATH_CFG0 0x0b56 -#define WCD934X_CDC_RX1_RX_PATH_CFG1 0x0b57 -#define WCD934X_CDC_RX1_RX_PATH_CFG2 0x0b58 -#define WCD934X_CDC_RX1_RX_VOL_CTL 0x0b59 -#define WCD934X_CDC_RX1_RX_PATH_MIX_CTL 0x0b5a -#define WCD934X_CDC_RX1_RX_PATH_MIX_CFG 0x0b5b -#define WCD934X_CDC_RX1_RX_VOL_MIX_CTL 0x0b5c -#define WCD934X_CDC_RX1_RX_PATH_SEC0 0x0b5d -#define WCD934X_CDC_RX1_RX_PATH_SEC1 0x0b5e -#define WCD934X_CDC_RX1_RX_PATH_SEC2 0x0b5f -#define WCD934X_CDC_RX1_RX_PATH_SEC3 0x0b60 -#define WCD934X_CDC_RX1_RX_PATH_SEC4 0x0b61 -#define WCD934X_CDC_RX1_RX_PATH_SEC5 0x0b62 -#define WCD934X_CDC_RX1_RX_PATH_SEC6 0x0b63 -#define WCD934X_CDC_RX1_RX_PATH_SEC7 0x0b64 -#define WCD934X_CDC_RX1_RX_PATH_MIX_SEC0 0x0b65 -#define WCD934X_CDC_RX1_RX_PATH_MIX_SEC1 0x0b66 -#define WCD934X_CDC_RX1_RX_PATH_DSMDEM_CTL 0x0b67 -#define WCD934X_CDC_RX2_RX_PATH_CTL 0x0b69 -#define WCD934X_CDC_RX2_RX_PATH_CFG0 0x0b6a -#define WCD934X_CDC_RX2_RX_PATH_CFG1 0x0b6b -#define WCD934X_CDC_RX2_RX_PATH_CFG2 0x0b6c -#define WCD934X_CDC_RX2_RX_VOL_CTL 0x0b6d -#define WCD934X_CDC_RX2_RX_PATH_MIX_CTL 0x0b6e -#define WCD934X_CDC_RX2_RX_PATH_MIX_CFG 0x0b6f -#define WCD934X_CDC_RX2_RX_VOL_MIX_CTL 0x0b70 -#define WCD934X_CDC_RX2_RX_PATH_SEC0 0x0b71 -#define WCD934X_CDC_RX2_RX_PATH_SEC1 0x0b72 -#define WCD934X_CDC_RX2_RX_PATH_SEC2 0x0b73 -#define WCD934X_CDC_RX2_RX_PATH_SEC3 0x0b74 -#define WCD934X_CDC_RX2_RX_PATH_SEC4 0x0b75 -#define WCD934X_CDC_RX2_RX_PATH_SEC5 0x0b76 -#define WCD934X_CDC_RX2_RX_PATH_SEC6 0x0b77 -#define WCD934X_CDC_RX2_RX_PATH_SEC7 0x0b78 -#define WCD934X_CDC_RX2_RX_PATH_MIX_SEC0 0x0b79 -#define WCD934X_CDC_RX2_RX_PATH_MIX_SEC1 0x0b7a -#define WCD934X_CDC_RX2_RX_PATH_DSMDEM_CTL 0x0b7b -#define WCD934X_CDC_RX3_RX_PATH_CTL 0x0b7d -#define WCD934X_CDC_RX3_RX_PATH_CFG0 0x0b7e -#define WCD934X_CDC_RX3_RX_PATH_CFG1 0x0b7f -#define WCD934X_CDC_RX3_RX_PATH_CFG2 0x0b80 -#define WCD934X_CDC_RX3_RX_VOL_CTL 0x0b81 -#define WCD934X_CDC_RX3_RX_PATH_MIX_CTL 0x0b82 -#define WCD934X_CDC_RX3_RX_PATH_MIX_CFG 0x0b83 -#define WCD934X_CDC_RX3_RX_VOL_MIX_CTL 0x0b84 -#define WCD934X_CDC_RX3_RX_PATH_SEC0 0x0b85 -#define WCD934X_CDC_RX3_RX_PATH_SEC1 0x0b86 -#define WCD934X_CDC_RX3_RX_PATH_SEC2 0x0b87 -#define WCD934X_CDC_RX3_RX_PATH_SEC3 0x0b88 -#define WCD934X_CDC_RX3_RX_PATH_SEC5 0x0b8a -#define WCD934X_CDC_RX3_RX_PATH_SEC6 0x0b8b -#define WCD934X_CDC_RX3_RX_PATH_SEC7 0x0b8c -#define WCD934X_CDC_RX3_RX_PATH_MIX_SEC0 0x0b8d -#define WCD934X_CDC_RX3_RX_PATH_MIX_SEC1 0x0b8e -#define WCD934X_CDC_RX3_RX_PATH_DSMDEM_CTL 0x0b8f -#define WCD934X_CDC_RX4_RX_PATH_CTL 0x0b91 -#define WCD934X_CDC_RX4_RX_PATH_CFG0 0x0b92 -#define WCD934X_CDC_RX4_RX_PATH_CFG1 0x0b93 -#define WCD934X_CDC_RX4_RX_PATH_CFG2 0x0b94 -#define WCD934X_CDC_RX4_RX_VOL_CTL 0x0b95 -#define WCD934X_CDC_RX4_RX_PATH_MIX_CTL 0x0b96 -#define WCD934X_CDC_RX4_RX_PATH_MIX_CFG 0x0b97 -#define WCD934X_CDC_RX4_RX_VOL_MIX_CTL 0x0b98 -#define WCD934X_CDC_RX4_RX_PATH_SEC0 0x0b99 -#define WCD934X_CDC_RX4_RX_PATH_SEC1 0x0b9a -#define WCD934X_CDC_RX4_RX_PATH_SEC2 0x0b9b -#define WCD934X_CDC_RX4_RX_PATH_SEC3 0x0b9c -#define WCD934X_CDC_RX4_RX_PATH_SEC5 0x0b9e -#define WCD934X_CDC_RX4_RX_PATH_SEC6 0x0b9f -#define WCD934X_CDC_RX4_RX_PATH_SEC7 0x0ba0 -#define WCD934X_CDC_RX4_RX_PATH_MIX_SEC0 0x0ba1 -#define WCD934X_CDC_RX4_RX_PATH_MIX_SEC1 0x0ba2 -#define WCD934X_CDC_RX4_RX_PATH_DSMDEM_CTL 0x0ba3 -#define WCD934X_CDC_RX7_RX_PATH_CTL 0x0bcd -#define WCD934X_CDC_RX7_RX_PATH_CFG0 0x0bce -#define WCD934X_CDC_RX7_RX_PATH_CFG1 0x0bcf -#define WCD934X_CDC_RX7_RX_PATH_CFG2 0x0bd0 -#define WCD934X_CDC_RX7_RX_VOL_CTL 0x0bd1 -#define WCD934X_CDC_RX7_RX_PATH_MIX_CTL 0x0bd2 -#define WCD934X_CDC_RX7_RX_PATH_MIX_CFG 0x0bd3 -#define WCD934X_CDC_RX7_RX_VOL_MIX_CTL 0x0bd4 -#define WCD934X_CDC_RX7_RX_PATH_SEC0 0x0bd5 -#define WCD934X_CDC_RX7_RX_PATH_SEC1 0x0bd6 -#define WCD934X_CDC_RX7_RX_PATH_SEC2 0x0bd7 -#define WCD934X_CDC_RX7_RX_PATH_SEC3 0x0bd8 -#define WCD934X_CDC_RX7_RX_PATH_SEC5 0x0bda -#define WCD934X_CDC_RX7_RX_PATH_SEC6 0x0bdb -#define WCD934X_CDC_RX7_RX_PATH_SEC7 0x0bdc -#define WCD934X_CDC_RX7_RX_PATH_MIX_SEC0 0x0bdd -#define WCD934X_CDC_RX7_RX_PATH_MIX_SEC1 0x0bde -#define WCD934X_CDC_RX7_RX_PATH_DSMDEM_CTL 0x0bdf -#define WCD934X_CDC_RX8_RX_PATH_CTL 0x0be1 -#define WCD934X_CDC_RX8_RX_PATH_CFG0 0x0be2 -#define WCD934X_CDC_RX8_RX_PATH_CFG1 0x0be3 -#define WCD934X_CDC_RX8_RX_PATH_CFG2 0x0be4 -#define WCD934X_CDC_RX8_RX_VOL_CTL 0x0be5 -#define WCD934X_CDC_RX8_RX_PATH_MIX_CTL 0x0be6 -#define WCD934X_CDC_RX8_RX_PATH_MIX_CFG 0x0be7 -#define WCD934X_CDC_RX8_RX_VOL_MIX_CTL 0x0be8 -#define WCD934X_CDC_RX8_RX_PATH_SEC0 0x0be9 -#define WCD934X_CDC_RX8_RX_PATH_SEC1 0x0bea -#define WCD934X_CDC_RX8_RX_PATH_SEC2 0x0beb -#define WCD934X_CDC_RX8_RX_PATH_SEC3 0x0bec -#define WCD934X_CDC_RX8_RX_PATH_SEC5 0x0bee -#define WCD934X_CDC_RX8_RX_PATH_SEC6 0x0bef -#define WCD934X_CDC_RX8_RX_PATH_SEC7 0x0bf0 -#define WCD934X_CDC_RX8_RX_PATH_MIX_SEC0 0x0bf1 -#define WCD934X_CDC_RX8_RX_PATH_MIX_SEC1 0x0bf2 -#define WCD934X_CDC_RX8_RX_PATH_DSMDEM_CTL 0x0bf3 -#define WCD934X_PAGE12_PAGE_REGISTER 0x0c00 -#define WCD934X_CDC_CLSH_CRC 0x0c01 -#define WCD934X_CDC_CLSH_DLY_CTRL 0x0c02 -#define WCD934X_CDC_CLSH_DECAY_CTRL 0x0c03 -#define WCD934X_CDC_CLSH_HPH_V_PA 0x0c04 -#define WCD934X_CDC_CLSH_EAR_V_PA 0x0c05 -#define WCD934X_CDC_CLSH_HPH_V_HD 0x0c06 -#define WCD934X_CDC_CLSH_EAR_V_HD 0x0c07 -#define WCD934X_CDC_CLSH_K1_MSB 0x0c08 -#define WCD934X_CDC_CLSH_K1_LSB 0x0c09 -#define WCD934X_CDC_CLSH_K2_MSB 0x0c0a -#define WCD934X_CDC_CLSH_K2_LSB 0x0c0b -#define WCD934X_CDC_CLSH_IDLE_CTRL 0x0c0c -#define WCD934X_CDC_CLSH_IDLE_HPH 0x0c0d -#define WCD934X_CDC_CLSH_IDLE_EAR 0x0c0e -#define WCD934X_CDC_CLSH_TEST0 0x0c0f -#define WCD934X_CDC_CLSH_TEST1 0x0c10 -#define WCD934X_CDC_CLSH_OVR_VREF 0x0c11 -#define WCD934X_CDC_BOOST0_BOOST_PATH_CTL 0x0c19 -#define WCD934X_CDC_BOOST0_BOOST_CTL 0x0c1a -#define WCD934X_CDC_BOOST0_BOOST_CFG1 0x0c1b -#define WCD934X_CDC_BOOST0_BOOST_CFG2 0x0c1c -#define WCD934X_CDC_BOOST1_BOOST_PATH_CTL 0x0c21 -#define WCD934X_CDC_BOOST1_BOOST_CTL 0x0c22 -#define WCD934X_CDC_BOOST1_BOOST_CFG1 0x0c23 -#define WCD934X_CDC_BOOST1_BOOST_CFG2 0x0c24 -#define WCD934X_CDC_VBAT_VBAT_PATH_CTL 0x0c3d -#define WCD934X_CDC_VBAT_VBAT_CFG 0x0c3e -#define WCD934X_CDC_VBAT_VBAT_ADC_CAL1 0x0c3f -#define WCD934X_CDC_VBAT_VBAT_ADC_CAL2 0x0c40 -#define WCD934X_CDC_VBAT_VBAT_ADC_CAL3 0x0c41 -#define WCD934X_CDC_VBAT_VBAT_PK_EST1 0x0c42 -#define WCD934X_CDC_VBAT_VBAT_PK_EST2 0x0c43 -#define WCD934X_CDC_VBAT_VBAT_PK_EST3 0x0c44 -#define WCD934X_CDC_VBAT_VBAT_RF_PROC1 0x0c45 -#define WCD934X_CDC_VBAT_VBAT_RF_PROC2 0x0c46 -#define WCD934X_CDC_VBAT_VBAT_TAC1 0x0c47 -#define WCD934X_CDC_VBAT_VBAT_TAC2 0x0c48 -#define WCD934X_CDC_VBAT_VBAT_TAC3 0x0c49 -#define WCD934X_CDC_VBAT_VBAT_TAC4 0x0c4a -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD1 0x0c4b -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD2 0x0c4c -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD3 0x0c4d -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD4 0x0c4e -#define WCD934X_CDC_VBAT_VBAT_DEBUG1 0x0c4f -#define WCD934X_CDC_VBAT_VBAT_GAIN_UPD_MON 0x0c50 -#define WCD934X_CDC_VBAT_VBAT_GAIN_MON_VAL 0x0c51 -#define WCD934X_CDC_VBAT_VBAT_BAN 0x0c52 -#define WCD934X_MIXING_ASRC0_CLK_RST_CTL 0x0c55 -#define WCD934X_MIXING_ASRC0_CTL0 0x0c56 -#define WCD934X_MIXING_ASRC0_CTL1 0x0c57 -#define WCD934X_MIXING_ASRC0_FIFO_CTL 0x0c58 -#define WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_LSB 0x0c59 -#define WCD934X_MIXING_ASRC0_STATUS_FMIN_CNTR_MSB 0x0c5a -#define WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_LSB 0x0c5b -#define WCD934X_MIXING_ASRC0_STATUS_FMAX_CNTR_MSB 0x0c5c -#define WCD934X_MIXING_ASRC0_STATUS_FIFO 0x0c5d -#define WCD934X_MIXING_ASRC1_CLK_RST_CTL 0x0c61 -#define WCD934X_MIXING_ASRC1_CTL0 0x0c62 -#define WCD934X_MIXING_ASRC1_CTL1 0x0c63 -#define WCD934X_MIXING_ASRC1_FIFO_CTL 0x0c64 -#define WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_LSB 0x0c65 -#define WCD934X_MIXING_ASRC1_STATUS_FMIN_CNTR_MSB 0x0c66 -#define WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_LSB 0x0c67 -#define WCD934X_MIXING_ASRC1_STATUS_FMAX_CNTR_MSB 0x0c68 -#define WCD934X_MIXING_ASRC1_STATUS_FIFO 0x0c69 -#define WCD934X_MIXING_ASRC2_CLK_RST_CTL 0x0c6d -#define WCD934X_MIXING_ASRC2_CTL0 0x0c6e -#define WCD934X_MIXING_ASRC2_CTL1 0x0c6f -#define WCD934X_MIXING_ASRC2_FIFO_CTL 0x0c70 -#define WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_LSB 0x0c71 -#define WCD934X_MIXING_ASRC2_STATUS_FMIN_CNTR_MSB 0x0c72 -#define WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_LSB 0x0c73 -#define WCD934X_MIXING_ASRC2_STATUS_FMAX_CNTR_MSB 0x0c74 -#define WCD934X_MIXING_ASRC2_STATUS_FIFO 0x0c75 -#define WCD934X_MIXING_ASRC3_CLK_RST_CTL 0x0c79 -#define WCD934X_MIXING_ASRC3_CTL0 0x0c7a -#define WCD934X_MIXING_ASRC3_CTL1 0x0c7b -#define WCD934X_MIXING_ASRC3_FIFO_CTL 0x0c7c -#define WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_LSB 0x0c7d -#define WCD934X_MIXING_ASRC3_STATUS_FMIN_CNTR_MSB 0x0c7e -#define WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_LSB 0x0c7f -#define WCD934X_MIXING_ASRC3_STATUS_FMAX_CNTR_MSB 0x0c80 -#define WCD934X_MIXING_ASRC3_STATUS_FIFO 0x0c81 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_0 0x0c85 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_1 0x0c86 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_2 0x0c87 -#define WCD934X_SWR_AHB_BRIDGE_WR_DATA_3 0x0c88 -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_0 0x0c89 -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_1 0x0c8a -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_2 0x0c8b -#define WCD934X_SWR_AHB_BRIDGE_WR_ADDR_3 0x0c8c -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_0 0x0c8d -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_1 0x0c8e -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_2 0x0c8f -#define WCD934X_SWR_AHB_BRIDGE_RD_ADDR_3 0x0c90 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_0 0x0c91 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_1 0x0c92 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_2 0x0c93 -#define WCD934X_SWR_AHB_BRIDGE_RD_DATA_3 0x0c94 -#define WCD934X_SWR_AHB_BRIDGE_ACCESS_CFG 0x0c95 -#define WCD934X_SWR_AHB_BRIDGE_ACCESS_STATUS 0x0c96 -#define WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL 0x0cb5 -#define WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1 0x0cb6 -#define WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL 0x0cb9 -#define WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CFG1 0x0cba -#define WCD934X_SIDETONE_ASRC0_CLK_RST_CTL 0x0cbd -#define WCD934X_SIDETONE_ASRC0_CTL0 0x0cbe -#define WCD934X_SIDETONE_ASRC0_CTL1 0x0cbf -#define WCD934X_SIDETONE_ASRC0_FIFO_CTL 0x0cc0 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB 0x0cc1 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB 0x0cc2 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB 0x0cc3 -#define WCD934X_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB 0x0cc4 -#define WCD934X_SIDETONE_ASRC0_STATUS_FIFO 0x0cc5 -#define WCD934X_SIDETONE_ASRC1_CLK_RST_CTL 0x0cc9 -#define WCD934X_SIDETONE_ASRC1_CTL0 0x0cca -#define WCD934X_SIDETONE_ASRC1_CTL1 0x0ccb -#define WCD934X_SIDETONE_ASRC1_FIFO_CTL 0x0ccc -#define WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_LSB 0x0ccd -#define WCD934X_SIDETONE_ASRC1_STATUS_FMIN_CNTR_MSB 0x0cce -#define WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_LSB 0x0ccf -#define WCD934X_SIDETONE_ASRC1_STATUS_FMAX_CNTR_MSB 0x0cd0 -#define WCD934X_SIDETONE_ASRC1_STATUS_FIFO 0x0cd1 -#define WCD934X_EC_REF_HQ0_EC_REF_HQ_PATH_CTL 0x0cd5 -#define WCD934X_EC_REF_HQ0_EC_REF_HQ_CFG0 0x0cd6 -#define WCD934X_EC_REF_HQ1_EC_REF_HQ_PATH_CTL 0x0cdd -#define WCD934X_EC_REF_HQ1_EC_REF_HQ_CFG0 0x0cde -#define WCD934X_EC_ASRC0_CLK_RST_CTL 0x0ce5 -#define WCD934X_EC_ASRC0_CTL0 0x0ce6 -#define WCD934X_EC_ASRC0_CTL1 0x0ce7 -#define WCD934X_EC_ASRC0_FIFO_CTL 0x0ce8 -#define WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_LSB 0x0ce9 -#define WCD934X_EC_ASRC0_STATUS_FMIN_CNTR_MSB 0x0cea -#define WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_LSB 0x0ceb -#define WCD934X_EC_ASRC0_STATUS_FMAX_CNTR_MSB 0x0cec -#define WCD934X_EC_ASRC0_STATUS_FIFO 0x0ced -#define WCD934X_EC_ASRC1_CLK_RST_CTL 0x0cf1 -#define WCD934X_EC_ASRC1_CTL0 0x0cf2 -#define WCD934X_EC_ASRC1_CTL1 0x0cf3 -#define WCD934X_EC_ASRC1_FIFO_CTL 0x0cf4 -#define WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_LSB 0x0cf5 -#define WCD934X_EC_ASRC1_STATUS_FMIN_CNTR_MSB 0x0cf6 -#define WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_LSB 0x0cf7 -#define WCD934X_EC_ASRC1_STATUS_FMAX_CNTR_MSB 0x0cf8 -#define WCD934X_EC_ASRC1_STATUS_FIFO 0x0cf9 -#define WCD934X_PAGE13_PAGE_REGISTER 0x0d00 -#define WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0 0x0d01 -#define WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1 0x0d02 -#define WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0 0x0d03 -#define WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1 0x0d04 -#define WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0 0x0d05 -#define WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1 0x0d06 -#define WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0 0x0d07 -#define WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1 0x0d08 -#define WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0 0x0d09 -#define WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1 0x0d0a -#define WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0 0x0d0f -#define WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1 0x0d10 -#define WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0 0x0d11 -#define WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1 0x0d12 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG0 0x0d13 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG1 0x0d14 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG2 0x0d15 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG3 0x0d16 -#define WCD934X_CDC_RX_INP_MUX_RX_MIX_CFG4 0x0d17 -#define WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 0x0d18 -#define WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1 0x0d19 -#define WCD934X_CDC_RX_INP_MUX_ANC_CFG0 0x0d1a -#define WCD934X_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0 0x0d1b -#define WCD934X_CDC_RX_INP_MUX_EC_REF_HQ_CFG0 0x0d1c -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 0x0d1d -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 0x0d1e -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0 0x0d1f -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1 0x0d20 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0 0x0d21 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1 0x0d22 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0 0x0d23 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1 0x0d25 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 0x0d26 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0 0x0d27 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0 0x0d28 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0 0x0d29 -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0 0x0d2a -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX10_CFG0 0x0d2b -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX11_CFG0 0x0d2c -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX12_CFG0 0x0d2d -#define WCD934X_CDC_TX_INP_MUX_ADC_MUX13_CFG0 0x0d2e -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0 0x0d31 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1 0x0d32 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2 0x0d33 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3 0x0d34 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0 0x0d35 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1 0x0d36 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2 0x0d37 -#define WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3 0x0d38 -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0 0x0d3a -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1 0x0d3b -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2 0x0d3c -#define WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3 0x0d3d -#define WCD934X_CDC_CLK_RST_CTRL_MCLK_CONTROL 0x0d41 -#define WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL 0x0d42 -#define WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL 0x0d43 -#define WCD934X_CDC_CLK_RST_CTRL_DSD_CONTROL 0x0d44 -#define WCD934X_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL 0x0d45 -#define WCD934X_CDC_CLK_RST_CTRL_GFM_CONTROL 0x0d46 -#define WCD934X_CDC_PROX_DETECT_PROX_CTL 0x0d49 -#define WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD0 0x0d4a -#define WCD934X_CDC_PROX_DETECT_PROX_POLL_PERIOD1 0x0d4b -#define WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB 0x0d4c -#define WCD934X_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB 0x0d4d -#define WCD934X_CDC_PROX_DETECT_PROX_STATUS 0x0d4e -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_CTRL 0x0d4f -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB 0x0d50 -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB 0x0d51 -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD 0x0d52 -#define WCD934X_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD 0x0d53 -#define WCD934X_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT 0x0d54 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_PATH_CTL 0x0d55 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL 0x0d56 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL 0x0d57 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL 0x0d58 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL 0x0d59 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL 0x0d5a -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL 0x0d5b -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL 0x0d5c -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL 0x0d5d -#define WCD934X_CDC_SIDETONE_IIR0_IIR_CTL 0x0d5e -#define WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL 0x0d5f -#define WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL 0x0d60 -#define WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL 0x0d61 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_PATH_CTL 0x0d65 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL 0x0d66 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL 0x0d67 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL 0x0d68 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL 0x0d69 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B5_CTL 0x0d6a -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B6_CTL 0x0d6b -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B7_CTL 0x0d6c -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B8_CTL 0x0d6d -#define WCD934X_CDC_SIDETONE_IIR1_IIR_CTL 0x0d6e -#define WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL 0x0d6f -#define WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B1_CTL 0x0d70 -#define WCD934X_CDC_SIDETONE_IIR1_IIR_COEF_B2_CTL 0x0d71 -#define WCD934X_CDC_TOP_TOP_CFG0 0x0d81 -#define WCD934X_CDC_TOP_TOP_CFG1 0x0d82 -#define WCD934X_CDC_TOP_TOP_CFG7 0x0d88 -#define WCD934X_CDC_TOP_HPHL_COMP_WR_LSB 0x0d89 -#define WCD934X_CDC_TOP_HPHL_COMP_WR_MSB 0x0d8a -#define WCD934X_CDC_TOP_HPHL_COMP_LUT 0x0d8b -#define WCD934X_CDC_TOP_HPHL_COMP_RD_LSB 0x0d8c -#define WCD934X_CDC_TOP_HPHL_COMP_RD_MSB 0x0d8d -#define WCD934X_CDC_TOP_HPHR_COMP_WR_LSB 0x0d8e -#define WCD934X_CDC_TOP_HPHR_COMP_WR_MSB 0x0d8f -#define WCD934X_CDC_TOP_HPHR_COMP_LUT 0x0d90 -#define WCD934X_CDC_TOP_HPHR_COMP_RD_LSB 0x0d91 -#define WCD934X_CDC_TOP_HPHR_COMP_RD_MSB 0x0d92 -#define WCD934X_CDC_TOP_DIFFL_COMP_WR_LSB 0x0d93 -#define WCD934X_CDC_TOP_DIFFL_COMP_WR_MSB 0x0d94 -#define WCD934X_CDC_TOP_DIFFL_COMP_LUT 0x0d95 -#define WCD934X_CDC_TOP_DIFFL_COMP_RD_LSB 0x0d96 -#define WCD934X_CDC_TOP_DIFFL_COMP_RD_MSB 0x0d97 -#define WCD934X_CDC_TOP_DIFFR_COMP_WR_LSB 0x0d98 -#define WCD934X_CDC_TOP_DIFFR_COMP_WR_MSB 0x0d99 -#define WCD934X_CDC_TOP_DIFFR_COMP_LUT 0x0d9a -#define WCD934X_CDC_TOP_DIFFR_COMP_RD_LSB 0x0d9b -#define WCD934X_CDC_TOP_DIFFR_COMP_RD_MSB 0x0d9c -#define WCD934X_CDC_DSD0_PATH_CTL 0x0db1 -#define WCD934X_CDC_DSD0_CFG0 0x0db2 -#define WCD934X_CDC_DSD0_CFG1 0x0db3 -#define WCD934X_CDC_DSD0_CFG2 0x0db4 -#define WCD934X_CDC_DSD0_CFG3 0x0db5 -#define WCD934X_CDC_DSD0_CFG4 0x0db6 -#define WCD934X_CDC_DSD0_CFG5 0x0db7 -#define WCD934X_CDC_DSD1_PATH_CTL 0x0dc1 -#define WCD934X_CDC_DSD1_CFG0 0x0dc2 -#define WCD934X_CDC_DSD1_CFG1 0x0dc3 -#define WCD934X_CDC_DSD1_CFG2 0x0dc4 -#define WCD934X_CDC_DSD1_CFG3 0x0dc5 -#define WCD934X_CDC_DSD1_CFG4 0x0dc6 -#define WCD934X_CDC_DSD1_CFG5 0x0dc7 -#define WCD934X_CDC_RX_IDLE_DET_PATH_CTL 0x0dd1 -#define WCD934X_CDC_RX_IDLE_DET_CFG0 0x0dd2 -#define WCD934X_CDC_RX_IDLE_DET_CFG1 0x0dd3 -#define WCD934X_CDC_RX_IDLE_DET_CFG2 0x0dd4 -#define WCD934X_CDC_RX_IDLE_DET_CFG3 0x0dd5 -#define WCD934X_PAGE14_PAGE_REGISTER 0x0e00 -#define WCD934X_CDC_RATE_EST0_RE_CLK_RST_CTL 0x0e01 -#define WCD934X_CDC_RATE_EST0_RE_CTL 0x0e02 -#define WCD934X_CDC_RATE_EST0_RE_PULSE_SUPR_CTL 0x0e03 -#define WCD934X_CDC_RATE_EST0_RE_TIMER 0x0e04 -#define WCD934X_CDC_RATE_EST0_RE_BW_SW 0x0e05 -#define WCD934X_CDC_RATE_EST0_RE_THRESH 0x0e06 -#define WCD934X_CDC_RATE_EST0_RE_STATUS 0x0e07 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_CTRL 0x0e09 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_TIMER2 0x0e0c -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW1 0x0e0d -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW2 0x0e0e -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW3 0x0e0f -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW4 0x0e10 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_OFFSET_BW5 0x0e11 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW1 0x0e12 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW2 0x0e13 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW3 0x0e14 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW4 0x0e15 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMIT_BW5 0x0e16 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW1 0x0e17 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW2 0x0e18 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW3 0x0e19 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW4 0x0e1a -#define WCD934X_CDC_RATE_EST0_RE_DIAG_LIMITD1_BW5 0x0e1b -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW1 0x0e1c -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW2 0x0e1d -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW3 0x0e1e -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW4 0x0e1f -#define WCD934X_CDC_RATE_EST0_RE_DIAG_HYST_BW5 0x0e20 -#define WCD934X_CDC_RATE_EST0_RE_RMAX_DIAG 0x0e21 -#define WCD934X_CDC_RATE_EST0_RE_RMIN_DIAG 0x0e22 -#define WCD934X_CDC_RATE_EST0_RE_PH_DET 0x0e23 -#define WCD934X_CDC_RATE_EST0_RE_DIAG_CLR 0x0e24 -#define WCD934X_CDC_RATE_EST0_RE_MB_SW_STATE 0x0e25 -#define WCD934X_CDC_RATE_EST0_RE_MAST_DIAG_STATE 0x0e26 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_7_0 0x0e27 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_15_8 0x0e28 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_23_16 0x0e29 -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_31_24 0x0e2a -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_39_32 0x0e2b -#define WCD934X_CDC_RATE_EST0_RE_RATE_OUT_40_43 0x0e2c -#define WCD934X_CDC_RATE_EST1_RE_CLK_RST_CTL 0x0e31 -#define WCD934X_CDC_RATE_EST1_RE_CTL 0x0e32 -#define WCD934X_CDC_RATE_EST1_RE_PULSE_SUPR_CTL 0x0e33 -#define WCD934X_CDC_RATE_EST1_RE_TIMER 0x0e34 -#define WCD934X_CDC_RATE_EST1_RE_BW_SW 0x0e35 -#define WCD934X_CDC_RATE_EST1_RE_THRESH 0x0e36 -#define WCD934X_CDC_RATE_EST1_RE_STATUS 0x0e37 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_CTRL 0x0e39 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_TIMER2 0x0e3c -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW1 0x0e3d -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW2 0x0e3e -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW3 0x0e3f -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW4 0x0e40 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_OFFSET_BW5 0x0e41 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW1 0x0e42 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW2 0x0e43 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW3 0x0e44 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW4 0x0e45 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMIT_BW5 0x0e46 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW1 0x0e47 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW2 0x0e48 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW3 0x0e49 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW4 0x0e4a -#define WCD934X_CDC_RATE_EST1_RE_DIAG_LIMITD1_BW5 0x0e4b -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW1 0x0e4c -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW2 0x0e4d -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW3 0x0e4e -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW4 0x0e4f -#define WCD934X_CDC_RATE_EST1_RE_DIAG_HYST_BW5 0x0e50 -#define WCD934X_CDC_RATE_EST1_RE_RMAX_DIAG 0x0e51 -#define WCD934X_CDC_RATE_EST1_RE_RMIN_DIAG 0x0e52 -#define WCD934X_CDC_RATE_EST1_RE_PH_DET 0x0e53 -#define WCD934X_CDC_RATE_EST1_RE_DIAG_CLR 0x0e54 -#define WCD934X_CDC_RATE_EST1_RE_MB_SW_STATE 0x0e55 -#define WCD934X_CDC_RATE_EST1_RE_MAST_DIAG_STATE 0x0e56 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_7_0 0x0e57 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_15_8 0x0e58 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_23_16 0x0e59 -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_31_24 0x0e5a -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_39_32 0x0e5b -#define WCD934X_CDC_RATE_EST1_RE_RATE_OUT_40_43 0x0e5c -#define WCD934X_CDC_RATE_EST2_RE_CLK_RST_CTL 0x0e61 -#define WCD934X_CDC_RATE_EST2_RE_CTL 0x0e62 -#define WCD934X_CDC_RATE_EST2_RE_PULSE_SUPR_CTL 0x0e63 -#define WCD934X_CDC_RATE_EST2_RE_TIMER 0x0e64 -#define WCD934X_CDC_RATE_EST2_RE_BW_SW 0x0e65 -#define WCD934X_CDC_RATE_EST2_RE_THRESH 0x0e66 -#define WCD934X_CDC_RATE_EST2_RE_STATUS 0x0e67 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_CTRL 0x0e69 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_TIMER2 0x0e6c -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW1 0x0e6d -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW2 0x0e6e -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW3 0x0e6f -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW4 0x0e70 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_OFFSET_BW5 0x0e71 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW1 0x0e72 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW2 0x0e73 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW3 0x0e74 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW4 0x0e75 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMIT_BW5 0x0e76 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW1 0x0e77 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW2 0x0e78 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW3 0x0e79 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW4 0x0e7a -#define WCD934X_CDC_RATE_EST2_RE_DIAG_LIMITD1_BW5 0x0e7b -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW1 0x0e7c -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW2 0x0e7d -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW3 0x0e7e -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW4 0x0e7f -#define WCD934X_CDC_RATE_EST2_RE_DIAG_HYST_BW5 0x0e80 -#define WCD934X_CDC_RATE_EST2_RE_RMAX_DIAG 0x0e81 -#define WCD934X_CDC_RATE_EST2_RE_RMIN_DIAG 0x0e82 -#define WCD934X_CDC_RATE_EST2_RE_PH_DET 0x0e83 -#define WCD934X_CDC_RATE_EST2_RE_DIAG_CLR 0x0e84 -#define WCD934X_CDC_RATE_EST2_RE_MB_SW_STATE 0x0e85 -#define WCD934X_CDC_RATE_EST2_RE_MAST_DIAG_STATE 0x0e86 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_7_0 0x0e87 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_15_8 0x0e88 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_23_16 0x0e89 -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_31_24 0x0e8a -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_39_32 0x0e8b -#define WCD934X_CDC_RATE_EST2_RE_RATE_OUT_40_43 0x0e8c -#define WCD934X_CDC_RATE_EST3_RE_CLK_RST_CTL 0x0e91 -#define WCD934X_CDC_RATE_EST3_RE_CTL 0x0e92 -#define WCD934X_CDC_RATE_EST3_RE_PULSE_SUPR_CTL 0x0e93 -#define WCD934X_CDC_RATE_EST3_RE_TIMER 0x0e94 -#define WCD934X_CDC_RATE_EST3_RE_BW_SW 0x0e95 -#define WCD934X_CDC_RATE_EST3_RE_THRESH 0x0e96 -#define WCD934X_CDC_RATE_EST3_RE_STATUS 0x0e97 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_CTRL 0x0e99 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_TIMER2 0x0e9c -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW1 0x0e9d -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW2 0x0e9e -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW3 0x0e9f -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW4 0x0ea0 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_OFFSET_BW5 0x0ea1 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW1 0x0ea2 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW2 0x0ea3 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW3 0x0ea4 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW4 0x0ea5 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMIT_BW5 0x0ea6 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW1 0x0ea7 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW2 0x0ea8 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW3 0x0ea9 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW4 0x0eaa -#define WCD934X_CDC_RATE_EST3_RE_DIAG_LIMITD1_BW5 0x0eab -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW1 0x0eac -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW2 0x0ead -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW3 0x0eae -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW4 0x0eaf -#define WCD934X_CDC_RATE_EST3_RE_DIAG_HYST_BW5 0x0eb0 -#define WCD934X_CDC_RATE_EST3_RE_RMAX_DIAG 0x0eb1 -#define WCD934X_CDC_RATE_EST3_RE_RMIN_DIAG 0x0eb2 -#define WCD934X_CDC_RATE_EST3_RE_PH_DET 0x0eb3 -#define WCD934X_CDC_RATE_EST3_RE_DIAG_CLR 0x0eb4 -#define WCD934X_CDC_RATE_EST3_RE_MB_SW_STATE 0x0eb5 -#define WCD934X_CDC_RATE_EST3_RE_MAST_DIAG_STATE 0x0eb6 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_7_0 0x0eb7 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_15_8 0x0eb8 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_23_16 0x0eb9 -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_31_24 0x0eba -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_39_32 0x0ebb -#define WCD934X_CDC_RATE_EST3_RE_RATE_OUT_40_43 0x0ebc -#define WCD934X_PAGE15_PAGE_REGISTER 0x0f00 -#define WCD934X_SPLINE_SRC0_CLK_RST_CTL_0 0x0f01 -#define WCD934X_SPLINE_SRC0_STATUS 0x0f02 -#define WCD934X_SPLINE_SRC1_CLK_RST_CTL_0 0x0f19 -#define WCD934X_SPLINE_SRC1_STATUS 0x0f1a -#define WCD934X_SPLINE_SRC2_CLK_RST_CTL_0 0x0f31 -#define WCD934X_SPLINE_SRC2_STATUS 0x0f32 -#define WCD934X_SPLINE_SRC3_CLK_RST_CTL_0 0x0f49 -#define WCD934X_SPLINE_SRC3_STATUS 0x0f4a -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG0 0x0fa1 -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG1 0x0fa2 -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG2 0x0fa3 -#define WCD934X_CDC_DEBUG_DSD0_DEBUG_CFG3 0x0fa4 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG0 0x0fa5 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG1 0x0fa6 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG2 0x0fa7 -#define WCD934X_CDC_DEBUG_DSD1_DEBUG_CFG3 0x0fa8 -#define WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG0 0x0fa9 -#define WCD934X_CDC_DEBUG_SPLINE_SRC_DEBUG_CFG1 0x0faa -#define WCD934X_CDC_DEBUG_RC_RE_ASRC_DEBUG_CFG0 0x0fab -#define WCD934X_CDC_DEBUG_ANC0_RC0_FIFO_CTL 0x0fac -#define WCD934X_CDC_DEBUG_ANC0_RC1_FIFO_CTL 0x0fad -#define WCD934X_CDC_DEBUG_ANC1_RC0_FIFO_CTL 0x0fae -#define WCD934X_CDC_DEBUG_ANC1_RC1_FIFO_CTL 0x0faf -#define WCD934X_CDC_DEBUG_ANC_RC_RST_DBG_CNTR 0x0fb0 -#define WCD934X_PAGE80_PAGE_REGISTER 0x5000 -#define WCD934X_CODEC_CPR_WR_DATA_0 0x5001 -#define WCD934X_CODEC_CPR_WR_DATA_1 0x5002 -#define WCD934X_CODEC_CPR_WR_DATA_2 0x5003 -#define WCD934X_CODEC_CPR_WR_DATA_3 0x5004 -#define WCD934X_CODEC_CPR_WR_ADDR_0 0x5005 -#define WCD934X_CODEC_CPR_WR_ADDR_1 0x5006 -#define WCD934X_CODEC_CPR_WR_ADDR_2 0x5007 -#define WCD934X_CODEC_CPR_WR_ADDR_3 0x5008 -#define WCD934X_CODEC_CPR_RD_ADDR_0 0x5009 -#define WCD934X_CODEC_CPR_RD_ADDR_1 0x500a -#define WCD934X_CODEC_CPR_RD_ADDR_2 0x500b -#define WCD934X_CODEC_CPR_RD_ADDR_3 0x500c -#define WCD934X_CODEC_CPR_RD_DATA_0 0x500d -#define WCD934X_CODEC_CPR_RD_DATA_1 0x500e -#define WCD934X_CODEC_CPR_RD_DATA_2 0x500f -#define WCD934X_CODEC_CPR_RD_DATA_3 0x5010 -#define WCD934X_CODEC_CPR_ACCESS_CFG 0x5011 -#define WCD934X_CODEC_CPR_ACCESS_STATUS 0x5012 -#define WCD934X_CODEC_CPR_NOM_CX_VDD 0x5021 -#define WCD934X_CODEC_CPR_SVS_CX_VDD 0x5022 -#define WCD934X_CODEC_CPR_SVS2_CX_VDD 0x5023 -#define WCD934X_CODEC_CPR_NOM_MX_VDD 0x5024 -#define WCD934X_CODEC_CPR_SVS_MX_VDD 0x5025 -#define WCD934X_CODEC_CPR_SVS2_MX_VDD 0x5026 -#define WCD934X_CODEC_CPR_SVS2_MIN_CX_VDD 0x5027 -#define WCD934X_CODEC_CPR_MAX_SVS2_STEP 0x5028 -#define WCD934X_CODEC_CPR_CTL 0x5029 -#define WCD934X_CODEC_CPR_SW_MODECHNG_STATUS 0x502a -#define WCD934X_CODEC_CPR_SW_MODECHNG_START 0x502b -#define WCD934X_CODEC_CPR_CPR_STATUS 0x502c -#define WCD934X_PAGE128_PAGE_REGISTER 0x8000 -#define WCD934X_TLMM_BIST_MODE_PINCFG 0x8001 -#define WCD934X_TLMM_RF_PA_ON_PINCFG 0x8002 -#define WCD934X_TLMM_INTR1_PINCFG 0x8003 -#define WCD934X_TLMM_INTR2_PINCFG 0x8004 -#define WCD934X_TLMM_SWR_DATA_PINCFG 0x8005 -#define WCD934X_TLMM_SWR_CLK_PINCFG 0x8006 -#define WCD934X_TLMM_I2S_2_SCK_PINCFG 0x8007 -#define WCD934X_TLMM_SLIMBUS_DATA1_PINCFG 0x8008 -#define WCD934X_TLMM_SLIMBUS_DATA2_PINCFG 0x8009 -#define WCD934X_TLMM_SLIMBUS_CLK_PINCFG 0x800a -#define WCD934X_TLMM_I2C_CLK_PINCFG 0x800b -#define WCD934X_TLMM_I2C_DATA_PINCFG 0x800c -#define WCD934X_TLMM_I2S_0_RX_PINCFG 0x800d -#define WCD934X_TLMM_I2S_0_TX_PINCFG 0x800e -#define WCD934X_TLMM_I2S_0_SCK_PINCFG 0x800f -#define WCD934X_TLMM_I2S_0_WS_PINCFG 0x8010 -#define WCD934X_TLMM_I2S_1_RX_PINCFG 0x8011 -#define WCD934X_TLMM_I2S_1_TX_PINCFG 0x8012 -#define WCD934X_TLMM_I2S_1_SCK_PINCFG 0x8013 -#define WCD934X_TLMM_I2S_1_WS_PINCFG 0x8014 -#define WCD934X_TLMM_DMIC1_CLK_PINCFG 0x8015 -#define WCD934X_TLMM_DMIC1_DATA_PINCFG 0x8016 -#define WCD934X_TLMM_DMIC2_CLK_PINCFG 0x8017 -#define WCD934X_TLMM_DMIC2_DATA_PINCFG 0x8018 -#define WCD934X_TLMM_DMIC3_CLK_PINCFG 0x8019 -#define WCD934X_TLMM_DMIC3_DATA_PINCFG 0x801a -#define WCD934X_TLMM_JTCK_PINCFG 0x801b -#define WCD934X_TLMM_GPIO1_PINCFG 0x801c -#define WCD934X_TLMM_GPIO2_PINCFG 0x801d -#define WCD934X_TLMM_GPIO3_PINCFG 0x801e -#define WCD934X_TLMM_GPIO4_PINCFG 0x801f -#define WCD934X_TLMM_SPI_S_CSN_PINCFG 0x8020 -#define WCD934X_TLMM_SPI_S_CLK_PINCFG 0x8021 -#define WCD934X_TLMM_SPI_S_DOUT_PINCFG 0x8022 -#define WCD934X_TLMM_SPI_S_DIN_PINCFG 0x8023 -#define WCD934X_TLMM_BA_N_PINCFG 0x8024 -#define WCD934X_TLMM_GPIO0_PINCFG 0x8025 -#define WCD934X_TLMM_I2S_2_RX_PINCFG 0x8026 -#define WCD934X_TLMM_I2S_2_WS_PINCFG 0x8027 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_0 0x8031 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_1 0x8032 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_2 0x8033 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_3 0x8034 -#define WCD934X_TEST_DEBUG_PIN_CTL_OE_4 0x8035 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_0 0x8036 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_1 0x8037 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_2 0x8038 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_3 0x8039 -#define WCD934X_TEST_DEBUG_PIN_CTL_DATA_4 0x803a -#define WCD934X_TEST_DEBUG_PAD_DRVCTL_0 0x803b -#define WCD934X_TEST_DEBUG_PAD_DRVCTL_1 0x803c -#define WCD934X_TEST_DEBUG_PIN_STATUS 0x803d -#define WCD934X_TEST_DEBUG_NPL_DLY_TEST_1 0x803e -#define WCD934X_TEST_DEBUG_NPL_DLY_TEST_2 0x803f -#define WCD934X_TEST_DEBUG_MEM_CTRL 0x8040 -#define WCD934X_TEST_DEBUG_DEBUG_BUS_SEL 0x8041 -#define WCD934X_TEST_DEBUG_DEBUG_JTAG 0x8042 -#define WCD934X_TEST_DEBUG_DEBUG_EN_1 0x8043 -#define WCD934X_TEST_DEBUG_DEBUG_EN_2 0x8044 -#define WCD934X_TEST_DEBUG_DEBUG_EN_3 0x8045 -#define WCD934X_TEST_DEBUG_DEBUG_EN_4 0x8046 -#define WCD934X_TEST_DEBUG_DEBUG_EN_5 0x8047 -#define WCD934X_TEST_DEBUG_ANA_DTEST_DIR 0x804a -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_0 0x804b -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_1 0x804c -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_2 0x804d -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_3 0x804e -#define WCD934X_TEST_DEBUG_PAD_INP_DISABLE_4 0x804f -#define WCD934X_TEST_DEBUG_SYSMEM_CTRL 0x8050 -#define WCD934X_TEST_DEBUG_SOC_SW_PWR_SEQ_DELAY 0x8051 -#define WCD934X_TEST_DEBUG_LVAL_NOM_LOW 0x8052 -#define WCD934X_TEST_DEBUG_LVAL_NOM_HIGH 0x8053 -#define WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_LOW 0x8054 -#define WCD934X_TEST_DEBUG_LVAL_SVS_SVS2_HIGH 0x8055 -#define WCD934X_TEST_DEBUG_SPI_SLAVE_CHAR 0x8056 -#define WCD934X_TEST_DEBUG_CODEC_DIAGS 0x8057 -#define WCD934X_MAX_REGISTER 0x80FF - -/* SLIMBUS Slave Registers */ -#define WCD934X_SLIM_PGD_PORT_INT_RX_EN0 (0x30) -#define WCD934X_SLIM_PGD_PORT_INT_TX_EN0 (0x32) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_RX_0 (0x34) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_RX_1 (0x35) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_TX_0 (0x36) -#define WCD934X_SLIM_PGD_PORT_INT_STATUS_TX_1 (0x37) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_RX_0 (0x38) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_RX_1 (0x39) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_TX_0 (0x3A) -#define WCD934X_SLIM_PGD_PORT_INT_CLR_TX_1 (0x3B) -#define WCD934X_SLIM_PGD_PORT_INT_RX_SOURCE0 (0x60) -#define WCD934X_SLIM_PGD_PORT_INT_TX_SOURCE0 (0x70) - -#endif diff --git a/techpack/audio/include/asoc/wcd9360-registers.h b/techpack/audio/include/asoc/wcd9360-registers.h deleted file mode 100644 index bca9de3019e3..000000000000 --- a/techpack/audio/include/asoc/wcd9360-registers.h +++ /dev/null @@ -1,1158 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD9360_REGISTERS_H -#define _WCD9360_REGISTERS_H - -#define WCD9360_PAGE_SIZE 256 -#define WCD9360_NUM_PAGES 256 - -enum { - WCD9360_PAGE_0 = 0, - WCD9360_PAGE_1, - WCD9360_PAGE_2, - WCD9360_PAGE_4 = 4, - WCD9360_PAGE_6 = 6, - WCD9360_PAGE_7, - WCD9360_PAGE_10 = 10, - WCD9360_PAGE_11, - WCD9360_PAGE_12, - WCD9360_PAGE_13, - WCD9360_PAGE_14, - WCD9360_PAGE_80, - WCD9360_PAGE_128, - WCD9360_PAGE_MAX, -}; - -enum { - WCD9360_WO = 0, - WCD9360_RO, - WCD9360_RW, -}; - -extern const u8 * const wcd9360_reg[WCD9360_PAGE_MAX]; - -/* Page-0 Registers */ -#define WCD9360_PAGE0_PAGE_REGISTER (0x00000000) -#define WCD9360_CODEC_RPM_CLK_BYPASS (0x00000001) -#define WCD9360_CODEC_RPM_CLK_GATE (0x00000002) -#define WCD9360_CODEC_RPM_CLK_MCLK_CFG (0x00000003) -#define WCD9360_CODEC_RPM_CLK_MCLK2_CFG (0x00000004) -#define WCD9360_CODEC_RPM_I2S_DSD_CLK_SEL (0x00000005) -#define WCD9360_CODEC_RPM_RST_CTL (0x00000009) -#define WCD9360_CODEC_RPM_PWR_CDC_DIG_HM_CTL (0x00000011) -#define WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE0 (0x00000021) -#define WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE1 (0x00000022) -#define WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE2 (0x00000023) -#define WCD9360_CHIP_TIER_CTRL_CHIP_ID_BYTE3 (0x00000024) -#define WCD9360_CHIP_TIER_CTRL_EFUSE_CTL (0x00000025) -#define WCD9360_CHIP_TIER_CTRL_EFUSE_TEST0 (0x00000026) -#define WCD9360_CHIP_TIER_CTRL_EFUSE_TEST1 (0x00000027) -#define WCD9360_CHIP_TIER_CTRL_EFUSE_STATUS (0x00000039) -#define WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_NONNEGO (0x0000003A) -#define WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_1 (0x0000003B) -#define WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_2 (0x0000003C) -#define WCD9360_CHIP_TIER_CTRL_I2C_SLAVE_ID_3 (0x0000003D) -#define WCD9360_CHIP_TIER_CTRL_ANA_WAIT_STATE_CTL (0x0000003E) -#define WCD9360_CHIP_TIER_CTRL_I2C_ACTIVE (0x00000040) -#define WCD9360_CHIP_TIER_CTRL_ALT_FUNC_EN (0x00000041) -#define WCD9360_CHIP_TIER_CTRL_GPIO_CTL_OE (0x00000042) -#define WCD9360_CHIP_TIER_CTRL_GPIO_CTL_DATA (0x00000043) -#define WCD9360_DATA_HUB_RX0_CFG (0x00000051) -#define WCD9360_DATA_HUB_RX1_CFG (0x00000052) -#define WCD9360_DATA_HUB_RX2_CFG (0x00000053) -#define WCD9360_DATA_HUB_RX3_CFG (0x00000054) -#define WCD9360_DATA_HUB_RX4_CFG (0x00000055) -#define WCD9360_DATA_HUB_RX5_CFG (0x00000056) -#define WCD9360_DATA_HUB_RX6_CFG (0x00000057) -#define WCD9360_DATA_HUB_RX7_CFG (0x00000058) -#define WCD9360_DATA_HUB_SB_TX0_INP_CFG (0x00000061) -#define WCD9360_DATA_HUB_SB_TX1_INP_CFG (0x00000062) -#define WCD9360_DATA_HUB_SB_TX2_INP_CFG (0x00000063) -#define WCD9360_DATA_HUB_SB_TX3_INP_CFG (0x00000064) -#define WCD9360_DATA_HUB_SB_TX4_INP_CFG (0x00000065) -#define WCD9360_DATA_HUB_SB_TX5_INP_CFG (0x00000066) -#define WCD9360_DATA_HUB_SB_TX6_INP_CFG (0x00000067) -#define WCD9360_DATA_HUB_SB_TX7_INP_CFG (0x00000068) -#define WCD9360_DATA_HUB_SB_TX8_INP_CFG (0x00000069) -#define WCD9360_DATA_HUB_SB_TX9_INP_CFG (0x0000006A) -#define WCD9360_DATA_HUB_SB_TX10_INP_CFG (0x0000006B) -#define WCD9360_DATA_HUB_SB_TX11_INP_CFG (0x0000006C) -#define WCD9360_DATA_HUB_SB_TX12_INP_CFG (0x0000006D) -#define WCD9360_DATA_HUB_SB_TX13_INP_CFG (0x0000006E) -#define WCD9360_DATA_HUB_SB_TX14_INP_CFG (0x0000006F) -#define WCD9360_DATA_HUB_SB_TX15_INP_CFG (0x00000070) -#define WCD9360_DATA_HUB_I2S_TX0_CFG (0x00000071) -#define WCD9360_DATA_HUB_I2S_TX0_CFG2 (0x00000072) -#define WCD9360_DATA_HUB_I2S_TX1_0_CFG (0x00000073) -#define WCD9360_DATA_HUB_I2S_TX1_1_CFG (0x00000074) -#define WCD9360_DATA_HUB_DATA_HUB_CFG (0x00000079) -#define WCD9360_DATA_HUB_I2S_0_CTL (0x00000081) -#define WCD9360_DATA_HUB_I2S_1_CTL (0x00000082) -#define WCD9360_DATA_HUB_I2S_0_CTL2 (0x00000083) -#define WCD9360_DATA_HUB_I2S_1_CTL2 (0x00000084) -#define WCD9360_DATA_HUB_I2S_CLKSRC_CTL (0x00000085) -#define WCD9360_DATA_HUB_I2S_COMMON_CTL (0x00000086) -#define WCD9360_DATA_HUB_I2S_0_TDM_CTL (0x00000087) -#define WCD9360_DATA_HUB_I2S_0_TDM_CTL2 (0x00000089) -#define WCD9360_DATA_HUB_I2S_0_TDM_CH_RX (0x0000008A) -#define WCD9360_DATA_HUB_I2S_0_TDM_CH_TX (0x0000008B) -#define WCD9360_DATA_HUB_I2S_0_TDM_CFG (0x0000008C) -#define WCD9360_DATA_HUB_I2S_0_TDM_STRETCH (0x0000008D) -#define WCD9360_DATA_HUB_I2S_RESET_CTL (0x00000090) -#define WCD9360_DMA_RDMA_CTL_0 (0x00000091) -#define WCD9360_DMA_CH_2_3_CFG_RDMA_0 (0x00000092) -#define WCD9360_DMA_CH_0_1_CFG_RDMA_0 (0x00000093) -#define WCD9360_DMA_RDMA_CTL_1 (0x00000094) -#define WCD9360_DMA_CH_2_3_CFG_RDMA_1 (0x00000095) -#define WCD9360_DMA_CH_0_1_CFG_RDMA_1 (0x00000096) -#define WCD9360_DMA_RDMA_CTL_2 (0x00000097) -#define WCD9360_DMA_CH_2_3_CFG_RDMA_2 (0x00000098) -#define WCD9360_DMA_CH_0_1_CFG_RDMA_2 (0x00000099) -#define WCD9360_DMA_RDMA_CTL_3 (0x0000009A) -#define WCD9360_DMA_CH_2_3_CFG_RDMA_3 (0x0000009B) -#define WCD9360_DMA_CH_0_1_CFG_RDMA_3 (0x0000009C) -#define WCD9360_DMA_RDMA_CTL_4 (0x0000009D) -#define WCD9360_DMA_CH_2_3_CFG_RDMA_4 (0x0000009E) -#define WCD9360_DMA_CH_0_1_CFG_RDMA_4 (0x0000009F) -#define WCD9360_DMA_RDMA4_PRT_CFG (0x000000B1) -#define WCD9360_DMA_RDMA_SBTX0_7_CFG (0x000000B9) -#define WCD9360_DMA_RDMA_SBTX8_10_CFG (0x000000BA) -#define WCD9360_DMA_WDMA_CTL_0 (0x000000C1) -#define WCD9360_DMA_WDMA_CTL_1 (0x000000C6) -#define WCD9360_DMA_WDMA_CTL_2 (0x000000CB) -#define WCD9360_DMA_WDMA_CTL_3 (0x000000D0) -#define WCD9360_DMA_WDMA_CTL_4 (0x000000D5) -#define WCD9360_DMA_CH_4_5_CFG_WDMA_0 (0x000000C2) -#define WCD9360_DMA_CH_4_5_CFG_WDMA_1 (0x000000C7) -#define WCD9360_DMA_CH_4_5_CFG_WDMA_2 (0x000000CC) -#define WCD9360_DMA_CH_4_5_CFG_WDMA_3 (0x000000D1) -#define WCD9360_DMA_CH_4_5_CFG_WDMA_4 (0x000000D6) -#define WCD9360_DMA_CH_2_3_CFG_WDMA_0 (0x000000C3) -#define WCD9360_DMA_CH_2_3_CFG_WDMA_1 (0x000000C8) -#define WCD9360_DMA_CH_2_3_CFG_WDMA_2 (0x000000CD) -#define WCD9360_DMA_CH_2_3_CFG_WDMA_3 (0x000000D2) -#define WCD9360_DMA_CH_2_3_CFG_WDMA_4 (0x000000D7) -#define WCD9360_DMA_CH_0_1_CFG_WDMA_0 (0x000000C4) -#define WCD9360_DMA_CH_0_1_CFG_WDMA_1 (0x000000C9) -#define WCD9360_DMA_CH_0_1_CFG_WDMA_2 (0x000000CE) -#define WCD9360_DMA_CH_0_1_CFG_WDMA_3 (0x000000D3) -#define WCD9360_DMA_CH_0_1_CFG_WDMA_4 (0x000000D8) -#define WCD9360_DMA_WDMA0_PRT_CFG (0x000000E1) -#define WCD9360_DMA_WDMA3_PRT_CFG (0x000000E2) -#define WCD9360_DMA_WDMA4_PRT0_3_CFG (0x000000E3) -#define WCD9360_DMA_WDMA4_PRT4_7_CFG (0x000000E4) -#define WCD9360_PAGE1_PAGE_REGISTER (0x00000100) -#define WCD9360_CPE_FLL_USER_CTL_0 (0x00000101) -#define WCD9360_CPE_FLL_USER_CTL_1 (0x00000102) -#define WCD9360_CPE_FLL_USER_CTL_2 (0x00000103) -#define WCD9360_CPE_FLL_USER_CTL_3 (0x00000104) -#define WCD9360_CPE_FLL_USER_CTL_4 (0x00000105) -#define WCD9360_CPE_FLL_USER_CTL_5 (0x00000106) -#define WCD9360_CPE_FLL_USER_CTL_6 (0x00000107) -#define WCD9360_CPE_FLL_USER_CTL_7 (0x00000108) -#define WCD9360_CPE_FLL_USER_CTL_8 (0x00000109) -#define WCD9360_CPE_FLL_USER_CTL_9 (0x0000010A) -#define WCD9360_CPE_FLL_L_VAL_CTL_0 (0x0000010B) -#define WCD9360_CPE_FLL_L_VAL_CTL_1 (0x0000010C) -#define WCD9360_CPE_FLL_DSM_FRAC_CTL_0 (0x0000010D) -#define WCD9360_CPE_FLL_DSM_FRAC_CTL_1 (0x0000010E) -#define WCD9360_CPE_FLL_CONFIG_CTL_0 (0x0000010F) -#define WCD9360_CPE_FLL_CONFIG_CTL_1 (0x00000110) -#define WCD9360_CPE_FLL_CONFIG_CTL_2 (0x00000111) -#define WCD9360_CPE_FLL_CONFIG_CTL_3 (0x00000112) -#define WCD9360_CPE_FLL_CONFIG_CTL_4 (0x00000113) -#define WCD9360_CPE_FLL_TEST_CTL_0 (0x00000114) -#define WCD9360_CPE_FLL_TEST_CTL_1 (0x00000115) -#define WCD9360_CPE_FLL_TEST_CTL_2 (0x00000116) -#define WCD9360_CPE_FLL_TEST_CTL_3 (0x00000117) -#define WCD9360_CPE_FLL_TEST_CTL_4 (0x00000118) -#define WCD9360_CPE_FLL_TEST_CTL_5 (0x00000119) -#define WCD9360_CPE_FLL_TEST_CTL_6 (0x0000011A) -#define WCD9360_CPE_FLL_TEST_CTL_7 (0x0000011B) -#define WCD9360_CPE_FLL_FREQ_CTL_0 (0x0000011C) -#define WCD9360_CPE_FLL_FREQ_CTL_1 (0x0000011D) -#define WCD9360_CPE_FLL_FREQ_CTL_2 (0x0000011E) -#define WCD9360_CPE_FLL_FREQ_CTL_3 (0x0000011F) -#define WCD9360_CPE_FLL_SSC_CTL_0 (0x00000120) -#define WCD9360_CPE_FLL_SSC_CTL_1 (0x00000121) -#define WCD9360_CPE_FLL_SSC_CTL_2 (0x00000122) -#define WCD9360_CPE_FLL_SSC_CTL_3 (0x00000123) -#define WCD9360_CPE_FLL_FLL_MODE (0x00000124) -#define WCD9360_CPE_FLL_STATUS_0 (0x00000125) -#define WCD9360_CPE_FLL_STATUS_1 (0x00000126) -#define WCD9360_CPE_FLL_STATUS_2 (0x00000127) -#define WCD9360_CPE_FLL_STATUS_3 (0x00000128) -#define WCD9360_I2S_FLL_USER_CTL_0 (0x00000141) -#define WCD9360_I2S_FLL_USER_CTL_1 (0x00000142) -#define WCD9360_I2S_FLL_USER_CTL_2 (0x00000143) -#define WCD9360_I2S_FLL_USER_CTL_3 (0x00000144) -#define WCD9360_I2S_FLL_USER_CTL_4 (0x00000145) -#define WCD9360_I2S_FLL_USER_CTL_5 (0x00000146) -#define WCD9360_I2S_FLL_USER_CTL_6 (0x00000147) -#define WCD9360_I2S_FLL_USER_CTL_7 (0x00000148) -#define WCD9360_I2S_FLL_USER_CTL_8 (0x00000149) -#define WCD9360_I2S_FLL_USER_CTL_9 (0x0000014A) -#define WCD9360_I2S_FLL_L_VAL_CTL_0 (0x0000014B) -#define WCD9360_I2S_FLL_L_VAL_CTL_1 (0x0000014C) -#define WCD9360_I2S_FLL_DSM_FRAC_CTL_0 (0x0000014D) -#define WCD9360_I2S_FLL_DSM_FRAC_CTL_1 (0x0000014E) -#define WCD9360_I2S_FLL_CONFIG_CTL_0 (0x0000014F) -#define WCD9360_I2S_FLL_CONFIG_CTL_1 (0x00000150) -#define WCD9360_I2S_FLL_CONFIG_CTL_2 (0x00000151) -#define WCD9360_I2S_FLL_CONFIG_CTL_3 (0x00000152) -#define WCD9360_I2S_FLL_CONFIG_CTL_4 (0x00000153) -#define WCD9360_I2S_FLL_TEST_CTL_0 (0x00000154) -#define WCD9360_I2S_FLL_TEST_CTL_1 (0x00000155) -#define WCD9360_I2S_FLL_TEST_CTL_2 (0x00000156) -#define WCD9360_I2S_FLL_TEST_CTL_3 (0x00000157) -#define WCD9360_I2S_FLL_TEST_CTL_4 (0x00000158) -#define WCD9360_I2S_FLL_TEST_CTL_5 (0x00000159) -#define WCD9360_I2S_FLL_TEST_CTL_6 (0x0000015A) -#define WCD9360_I2S_FLL_TEST_CTL_7 (0x0000015B) -#define WCD9360_I2S_FLL_FREQ_CTL_0 (0x0000015C) -#define WCD9360_I2S_FLL_FREQ_CTL_1 (0x0000015D) -#define WCD9360_I2S_FLL_FREQ_CTL_2 (0x0000015E) -#define WCD9360_I2S_FLL_FREQ_CTL_3 (0x0000015F) -#define WCD9360_I2S_FLL_SSC_CTL_0 (0x00000160) -#define WCD9360_I2S_FLL_SSC_CTL_1 (0x00000161) -#define WCD9360_I2S_FLL_SSC_CTL_2 (0x00000162) -#define WCD9360_I2S_FLL_SSC_CTL_3 (0x00000163) -#define WCD9360_I2S_FLL_FLL_MODE (0x00000164) -#define WCD9360_I2S_FLL_STATUS_0 (0x00000165) -#define WCD9360_I2S_FLL_STATUS_1 (0x00000166) -#define WCD9360_I2S_FLL_STATUS_2 (0x00000167) -#define WCD9360_I2S_FLL_STATUS_3 (0x00000168) -#define WCD9360_PAGE2_PAGE_REGISTER (0x00000200) -#define WCD9360_CPE_SS_CPE_CTL (0x00000201) -#define WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_0 (0x00000202) -#define WCD9360_CPE_SS_PWR_SYS_PSTATE_CTL_1 (0x00000203) -#define WCD9360_CPE_SS_PWR_CPEFLL_CTL (0x00000204) -#define WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_0 (0x00000205) -#define WCD9360_CPE_SS_PWR_CPE_SYSMEM_DEEPSLP_1 (0x00000206) -#define WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_0 (0x00000208) -#define WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_1 (0x00000209) -#define WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_2 (0x0000020A) -#define WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_3 (0x0000020B) -#define WCD9360_CPE_SS_PWR_CPE_SYSMEM_SHUTDOWN_4 (0x0000020C) -#define WCD9360_CPE_SS_PWR_CPE_DRAM1_SHUTDOWN (0x0000020E) -#define WCD9360_CPE_SS_US_BUF_INT_PERIOD (0x00000212) -#define WCD9360_CPE_SS_CPARMAD_BUFRDY_INT_PERIOD (0x00000213) -#define WCD9360_CPE_SS_SVA_CFG (0x00000214) -#define WCD9360_CPE_SS_US_CFG (0x00000215) -#define WCD9360_CPE_SS_MAD_CTL (0x00000216) -#define WCD9360_CPE_SS_CPAR_CTL (0x00000217) -#define WCD9360_CPE_SS_DMIC0_CTL (0x00000218) -#define WCD9360_CPE_SS_DMIC1_CTL (0x00000219) -#define WCD9360_CPE_SS_DMIC2_CTL (0x0000021A) -#define WCD9360_CPE_SS_DMIC_CFG (0x0000021B) -#define WCD9360_CPE_SS_CPAR_CFG (0x0000021C) -#define WCD9360_CPE_SS_WDOG_CFG (0x0000021D) -#define WCD9360_CPE_SS_BACKUP_INT (0x0000021E) -#define WCD9360_CPE_SS_STATUS (0x0000021F) -#define WCD9360_CPE_SS_CPE_OCD_CFG (0x00000220) -#define WCD9360_CPE_SS_SS_ERROR_INT_MASK_0A (0x00000221) -#define WCD9360_CPE_SS_SS_ERROR_INT_MASK_0B (0x00000222) -#define WCD9360_CPE_SS_SS_ERROR_INT_MASK_1A (0x00000223) -#define WCD9360_CPE_SS_SS_ERROR_INT_MASK_1B (0x00000224) -#define WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0A (0x00000225) -#define WCD9360_CPE_SS_SS_ERROR_INT_STATUS_0B (0x00000226) -#define WCD9360_CPE_SS_SS_ERROR_INT_STATUS_1A (0x00000227) -#define WCD9360_CPE_SS_SS_ERROR_INT_STATUS_1B (0x00000228) -#define WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0A (0x00000229) -#define WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_0B (0x0000022A) -#define WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_1A (0x0000022B) -#define WCD9360_CPE_SS_SS_ERROR_INT_CLEAR_1B (0x0000022C) -#define WCD9360_CPE_SS_DMIC3_CTL (0x00000231) -#define WCD9360_CPE_SS_WDOG_RESET (0x00000239) -#define WCD9360_CPE_SS_LPASS_MCLK_PRG (0x00000240) -#define WCD9360_CPE_SS_LPASS_IPC_IN_0 (0x00000241) -#define WCD9360_CPE_SS_LPASS_IPC_IN_1 (0x00000242) -#define WCD9360_CPE_SS_LPASS_IPC_IN_2 (0x00000243) -#define WCD9360_CPE_SS_LPASS_IPC_IN_3 (0x00000244) -#define WCD9360_CPE_SS_LPASS_IPC_IN_4 (0x00000245) -#define WCD9360_CPE_SS_LPASS_IPC_IN_5 (0x00000246) -#define WCD9360_CPE_SS_LPASS_IPC_IN_6 (0x00000247) -#define WCD9360_CPE_SS_LPASS_IPC_IN_7 (0x00000248) -#define WCD9360_CPE_SS_LPASS_IPC_IN_8 (0x00000249) -#define WCD9360_CPE_SS_LPASS_IPC_IN_9 (0x0000024A) -#define WCD9360_CPE_SS_LPASS_IPC_IN_10 (0x0000024B) -#define WCD9360_CPE_SS_LPASS_IPC_IN_11 (0x0000024C) -#define WCD9360_CPE_SS_LPASS_IPC_IN_12 (0x0000024D) -#define WCD9360_CPE_SS_LPASS_IPC_IN_13 (0x0000024E) -#define WCD9360_CPE_SS_LPASS_IPC_IN_14 (0x0000024F) -#define WCD9360_CPE_SS_LPASS_IPC_IN_15 (0x00000250) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_0 (0x00000251) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_1 (0x00000252) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_2 (0x00000253) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_3 (0x00000254) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_4 (0x00000255) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_5 (0x00000256) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_6 (0x00000257) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_7 (0x00000258) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_8 (0x00000259) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_9 (0x0000025A) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_10 (0x0000025B) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_11 (0x0000025C) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_12 (0x0000025D) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_13 (0x0000025E) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_14 (0x0000025F) -#define WCD9360_CPE_SS_LPASS_IPC_OUT_15 (0x00000260) -#define WCD9360_CPE_SS_LPASS_ARB_CTL (0x00000261) -#define WCD9360_CPE_SS_MEM_DEEPSLEEP_RD_0 (0x00000271) -#define WCD9360_CPE_SS_MEM_DEEPSLEEP_RD_1 (0x00000272) -#define WCD9360_CPE_SS_MEM_DEEPSLEEP_BYPASS_0 (0x00000273) -#define WCD9360_CPE_SS_MEM_DEEPSLEEP_BYPASS_1 (0x00000274) -#define WCD9360_SOC_MAD_MAIN_CTL_1 (0x00000281) -#define WCD9360_SOC_MAD_MAIN_CTL_2 (0x00000282) -#define WCD9360_SOC_MAD_AUDIO_CTL_1 (0x00000283) -#define WCD9360_SOC_MAD_AUDIO_CTL_2 (0x00000284) -#define WCD9360_SOC_MAD_AUDIO_CTL_3 (0x00000285) -#define WCD9360_SOC_MAD_AUDIO_CTL_4 (0x00000286) -#define WCD9360_SOC_MAD_AUDIO_CTL_5 (0x00000287) -#define WCD9360_SOC_MAD_AUDIO_CTL_6 (0x00000288) -#define WCD9360_SOC_MAD_AUDIO_CTL_7 (0x00000289) -#define WCD9360_SOC_MAD_AUDIO_CTL_8 (0x0000028A) -#define WCD9360_SOC_MAD_AUDIO_IIR_CTL_PTR (0x0000028B) -#define WCD9360_SOC_MAD_AUDIO_IIR_CTL_VAL (0x0000028C) -#define WCD9360_SOC_MAD_ULTR_CTL_1 (0x0000028D) -#define WCD9360_SOC_MAD_ULTR_CTL_2 (0x0000028E) -#define WCD9360_SOC_MAD_ULTR_CTL_3 (0x0000028F) -#define WCD9360_SOC_MAD_ULTR_CTL_4 (0x00000290) -#define WCD9360_SOC_MAD_ULTR_CTL_5 (0x00000291) -#define WCD9360_SOC_MAD_ULTR_CTL_6 (0x00000292) -#define WCD9360_SOC_MAD_ULTR_CTL_7 (0x00000293) -#define WCD9360_SOC_MAD_BEACON_CTL_1 (0x00000294) -#define WCD9360_SOC_MAD_BEACON_CTL_2 (0x00000295) -#define WCD9360_SOC_MAD_BEACON_CTL_3 (0x00000296) -#define WCD9360_SOC_MAD_BEACON_CTL_4 (0x00000297) -#define WCD9360_SOC_MAD_BEACON_CTL_5 (0x00000298) -#define WCD9360_SOC_MAD_BEACON_CTL_6 (0x00000299) -#define WCD9360_SOC_MAD_BEACON_CTL_7 (0x0000029A) -#define WCD9360_SOC_MAD_BEACON_CTL_8 (0x0000029B) -#define WCD9360_SOC_MAD_BEACON_IIR_CTL_PTR (0x0000029C) -#define WCD9360_SOC_MAD_BEACON_IIR_CTL_VAL (0x0000029D) -#define WCD9360_SOC_MAD_INP_SEL (0x0000029E) -#define WCD9360_SOC_MAD_MAD2_INP_SEL (0x0000029F) -#define WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_CTRL (0x000002B1) -#define WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_STATUS (0x000002B2) -#define WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_FS (0x000002B3) -#define WCD9360_SWR_SAMPLE_PACK_SWR_SAMPLE_PACK_IN_SEL (0x000002B4) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT0 (0x000002C1) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT1 (0x000002C2) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT2 (0x000002C3) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT3 (0x000002C4) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT4 (0x000002C5) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT5 (0x000002C6) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT6 (0x000002C7) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT7 (0x000002C8) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT8 (0x000002C9) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT9 (0x000002CA) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT10 (0x000002CB) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT11 (0x000002CC) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT12 (0x000002CD) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT13 (0x000002CE) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT14 (0x000002CF) -#define WCD9360_EFUSE_VALUE_EFUSE_VAL_OUT15 (0x000002D0) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT0 (0x000002D1) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT1 (0x000002D2) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT2 (0x000002D3) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT3 (0x000002D4) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT4 (0x000002D5) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT5 (0x000002D6) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT6 (0x000002D7) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT7 (0x000002D8) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT8 (0x000002D9) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT9 (0x000002DA) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT10 (0x000002DB) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT11 (0x000002DC) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT12 (0x000002DD) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT13 (0x000002DE) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT14 (0x000002DF) -#define WCD9360_EFUSE_VALUE_EFUSE2_VAL_OUT15 (0x000002E0) -#define WCD9360_PAGE4_PAGE_REGISTER (0x00000400) -#define WCD9360_INTR_CFG (0x00000401) -#define WCD9360_INTR_CLR_COMMIT (0x00000402) -#define WCD9360_INTR_PIN1_MASK0 (0x00000409) -#define WCD9360_INTR_PIN1_MASK1 (0x0000040A) -#define WCD9360_INTR_PIN1_MASK2 (0x0000040B) -#define WCD9360_INTR_PIN1_MASK3 (0x0000040C) -#define WCD9360_INTR_PIN1_STATUS0 (0x00000411) -#define WCD9360_INTR_PIN1_STATUS1 (0x00000412) -#define WCD9360_INTR_PIN1_STATUS2 (0x00000413) -#define WCD9360_INTR_PIN1_STATUS3 (0x00000414) -#define WCD9360_INTR_PIN1_CLEAR0 (0x00000419) -#define WCD9360_INTR_PIN1_CLEAR1 (0x0000041A) -#define WCD9360_INTR_PIN1_CLEAR2 (0x0000041B) -#define WCD9360_INTR_PIN1_CLEAR3 (0x0000041C) -#define WCD9360_INTR_PIN2_MASK3 (0x00000424) -#define WCD9360_INTR_PIN2_STATUS3 (0x0000042C) -#define WCD9360_INTR_PIN2_CLEAR3 (0x00000434) -#define WCD9360_INTR_CPESS_SUMRY_MASK2 (0x0000043B) -#define WCD9360_INTR_CPESS_SUMRY_MASK3 (0x0000043C) -#define WCD9360_INTR_CPESS_SUMRY_STATUS2 (0x00000443) -#define WCD9360_INTR_CPESS_SUMRY_STATUS3 (0x00000444) -#define WCD9360_INTR_CPESS_SUMRY_CLEAR2 (0x0000044B) -#define WCD9360_INTR_CPESS_SUMRY_CLEAR3 (0x0000044C) -#define WCD9360_INTR_LEVEL0 (0x00000461) -#define WCD9360_INTR_LEVEL1 (0x00000462) -#define WCD9360_INTR_LEVEL2 (0x00000463) -#define WCD9360_INTR_LEVEL3 (0x00000464) -#define WCD9360_INTR_BYPASS0 (0x00000469) -#define WCD9360_INTR_BYPASS1 (0x0000046A) -#define WCD9360_INTR_BYPASS2 (0x0000046B) -#define WCD9360_INTR_BYPASS3 (0x0000046C) -#define WCD9360_INTR_SET0 (0x00000471) -#define WCD9360_INTR_SET1 (0x00000472) -#define WCD9360_INTR_SET2 (0x00000473) -#define WCD9360_INTR_SET3 (0x00000474) -#define WCD9360_INTR_CODEC_MISC_MASK (0x000004B1) -#define WCD9360_INTR_CODEC_MISC_STATUS (0x000004B2) -#define WCD9360_INTR_CODEC_MISC_CLEAR (0x000004B3) -#define WCD9360_ANA_PAGE_REGISTER (0x00000600) -#define WCD9360_ANA_BIAS (0x00000601) -#define WCD9360_ANA_AMIC_INPUT_SWITCH_CTL (0x00000602) -#define WCD9360_ANA_RCO (0x00000603) -#define WCD9360_ANA_BUCK_CTL (0x00000606) -#define WCD9360_ANA_BUCK_STATUS (0x00000607) -#define WCD9360_ANA_EAR (0x0000060A) -#define WCD9360_ANA_MAD_SETUP (0x0000060D) -#define WCD9360_ANA_AMIC1 (0x0000060E) -#define WCD9360_ANA_AMIC2 (0x0000060F) -#define WCD9360_ANA_AMIC3 (0x00000610) -#define WCD9360_ANA_AMIC4 (0x00000611) -#define WCD9360_ANA_MICB1 (0x00000622) -#define WCD9360_ANA_MICB2 (0x00000623) -#define WCD9360_ANA_MICB3 (0x00000625) -#define WCD9360_ANA_MICB4 (0x00000626) -#define WCD9360_BIAS_CTL (0x00000628) -#define WCD9360_BIAS_VBG_FINE_ADJ (0x00000629) -#define WCD9360_RCO_CTRL_1 (0x0000062E) -#define WCD9360_RCO_CTRL_2 (0x0000062F) -#define WCD9360_RCO_CAL (0x00000630) -#define WCD9360_RCO_CAL_1 (0x00000631) -#define WCD9360_RCO_CAL_2 (0x00000632) -#define WCD9360_RCO_TEST_CTRL (0x00000633) -#define WCD9360_RCO_CAL_OUT_1 (0x00000634) -#define WCD9360_RCO_CAL_OUT_2 (0x00000635) -#define WCD9360_RCO_CAL_OUT_3 (0x00000636) -#define WCD9360_RCO_CAL_OUT_4 (0x00000637) -#define WCD9360_RCO_CAL_OUT_5 (0x00000638) -#define WCD9360_SIDO_MODE_1 (0x0000063A) -#define WCD9360_SIDO_MODE_2 (0x0000063B) -#define WCD9360_SIDO_MODE_3 (0x0000063C) -#define WCD9360_SIDO_MODE_4 (0x0000063D) -#define WCD9360_SIDO_VCL_1 (0x0000063E) -#define WCD9360_SIDO_VCL_2 (0x0000063F) -#define WCD9360_SIDO_VCL_3 (0x00000640) -#define WCD9360_SIDO_CCL_1 (0x00000641) -#define WCD9360_SIDO_CCL_2 (0x00000642) -#define WCD9360_SIDO_CCL_3 (0x00000643) -#define WCD9360_SIDO_CCL_4 (0x00000644) -#define WCD9360_SIDO_CCL_5 (0x00000645) -#define WCD9360_SIDO_CCL_6 (0x00000646) -#define WCD9360_SIDO_CCL_7 (0x00000647) -#define WCD9360_SIDO_CCL_8 (0x00000648) -#define WCD9360_SIDO_CCL_9 (0x00000649) -#define WCD9360_SIDO_CCL_10 (0x0000064A) -#define WCD9360_SIDO_FILTER_1 (0x0000064B) -#define WCD9360_SIDO_FILTER_2 (0x0000064C) -#define WCD9360_SIDO_DRIVER_1 (0x0000064D) -#define WCD9360_SIDO_DRIVER_2 (0x0000064E) -#define WCD9360_SIDO_DRIVER_3 (0x0000064F) -#define WCD9360_SIDO_CAL_CODE_EXT_1 (0x00000650) -#define WCD9360_SIDO_CAL_CODE_EXT_2 (0x00000651) -#define WCD9360_SIDO_CAL_CODE_OUT_1 (0x00000652) -#define WCD9360_SIDO_CAL_CODE_OUT_2 (0x00000653) -#define WCD9360_SIDO_TEST_1 (0x00000654) -#define WCD9360_SIDO_TEST_2 (0x00000655) -#define WCD9360_LDOH_MODE (0x00000667) -#define WCD9360_LDOH_BIAS (0x00000668) -#define WCD9360_LDOH_STB_LOADS (0x00000669) -#define WCD9360_LDOH_SLOWRAMP (0x0000066A) -#define WCD9360_MICB1_TEST_CTL_1 (0x0000066B) -#define WCD9360_MICB1_TEST_CTL_2 (0x0000066C) -#define WCD9360_MICB1_TEST_CTL_3 (0x0000066D) -#define WCD9360_MICB2_TEST_CTL_1 (0x0000066E) -#define WCD9360_MICB2_TEST_CTL_2 (0x0000066F) -#define WCD9360_MICB2_TEST_CTL_3 (0x00000670) -#define WCD9360_MICB3_TEST_CTL_1 (0x00000671) -#define WCD9360_MICB3_TEST_CTL_2 (0x00000672) -#define WCD9360_MICB3_TEST_CTL_3 (0x00000673) -#define WCD9360_MICB4_TEST_CTL_1 (0x00000674) -#define WCD9360_MICB4_TEST_CTL_2 (0x00000675) -#define WCD9360_MICB4_TEST_CTL_3 (0x00000676) -#define WCD9360_TX_COM_ADC_VCM (0x00000677) -#define WCD9360_TX_COM_BIAS_ATEST (0x00000678) -#define WCD9360_TX_COM_ADC_INT1_IB (0x00000679) -#define WCD9360_TX_COM_ADC_INT2_IB (0x0000067A) -#define WCD9360_TX_COM_TXFE_DIV_CTL (0x0000067B) -#define WCD9360_TX_COM_TXFE_DIV_START (0x0000067C) -#define WCD9360_TX_COM_TXFE_DIV_STOP_9P6M (0x0000067D) -#define WCD9360_TX_COM_TXFE_DIV_STOP_12P288M (0x0000067E) -#define WCD9360_TX_1_2_TEST_EN (0x0000067F) -#define WCD9360_TX_1_2_ADC_IB (0x00000680) -#define WCD9360_TX_1_2_ATEST_REFCTL (0x00000681) -#define WCD9360_TX_1_2_TEST_CTL (0x00000682) -#define WCD9360_TX_1_2_TEST_BLK_EN (0x00000683) -#define WCD9360_TX_1_2_TXFE_CLKDIV (0x00000684) -#define WCD9360_TX_1_2_SAR1_ERR (0x00000685) -#define WCD9360_TX_1_2_SAR2_ERR (0x00000686) -#define WCD9360_TX_3_4_TEST_EN (0x00000687) -#define WCD9360_TX_3_4_ADC_IB (0x00000688) -#define WCD9360_TX_3_4_ATEST_REFCTL (0x00000689) -#define WCD9360_TX_3_4_TEST_CTL (0x0000068A) -#define WCD9360_TX_3_4_TEST_BLK_EN (0x0000068B) -#define WCD9360_TX_3_4_TXFE_CLKDIV (0x0000068C) -#define WCD9360_TX_3_4_SAR1_ERR (0x0000068D) -#define WCD9360_TX_3_4_SAR2_ERR (0x0000068E) -#define WCD9360_RX_RX_EAR_BIAS_CON_1 (0x000006B3) -#define WCD9360_RX_RX_EAR_BIAS_CON_2 (0x000006B4) -#define WCD9360_RX_RX_AUX_BIAS_CON_1 (0x000006B5) -#define WCD9360_RX_RX_AUX_BIAS_CON_2 (0x000006B6) -#define WCD9360_RX_RX_BIAS_ATEST (0x000006B7) -#define WCD9360_RX_RXTOP_RESERVED (0x000006B8) -#define WCD9360_EAR_EAR_EN_REG (0x000006E1) -#define WCD9360_EAR_EAR_PA_CON (0x000006E2) -#define WCD9360_EAR_EAR_SP_CON (0x000006E3) -#define WCD9360_EAR_EAR_DAC_CON (0x000006E4) -#define WCD9360_EAR_EAR_CNP_FSM_CON (0x000006E5) -#define WCD9360_EAR_DAC_CTL_TEST (0x000006E6) -#define WCD9360_EAR_STATUS_REG (0x000006E7) -#define WCD9360_EAR_EAR_COMPANDER_CON (0x000006E8) -#define WCD9360_ANA_NEW_PAGE_REGISTER (0x00000700) -#define WCD9360_CLK_SYS_PLL_ENABLES (0x0000070E) -#define WCD9360_CLK_SYS_PLL_PRESET (0x0000070F) -#define WCD9360_CLK_SYS_PLL_STATUS (0x00000710) -#define WCD9360_CLK_SYS_MCLK_PRG (0x00000711) -#define WCD9360_CLK_SYS_MCLK2_PRG1 (0x00000712) -#define WCD9360_CLK_SYS_MCLK_MISC (0x00000713) -#define WCD9360_SIDO_NEW_VOUT_A_STARTUP (0x0000071B) -#define WCD9360_SIDO_NEW_VOUT_D_STARTUP (0x0000071C) -#define WCD9360_SIDO_NEW_VOUT_D_FREQ1 (0x0000071D) -#define WCD9360_SIDO_NEW_VOUT_D_FREQ2 (0x0000071E) -#define WCD9360_AUX_ANA_EAR (0x00000728) -#define WCD9360_LDORXTX_LDORXTX (0x00000729) -#define WCD9360_DIE_CRACK_CTL (0x0000072A) -#define WCD9360_DIE_CRACK_OUT (0x0000072B) -#define WCD9360_LOOP_BACK_EN (0x0000072C) -#define WCD9360_CLK_SYS_INT_POST_DIV_REG0 (0x0000076C) -#define WCD9360_CLK_SYS_INT_POST_DIV_REG1 (0x0000076D) -#define WCD9360_CLK_SYS_INT_REF_DIV_REG0 (0x0000076E) -#define WCD9360_CLK_SYS_INT_REF_DIV_REG1 (0x0000076F) -#define WCD9360_CLK_SYS_INT_FILTER_REG0 (0x00000770) -#define WCD9360_CLK_SYS_INT_FILTER_REG1 (0x00000771) -#define WCD9360_CLK_SYS_INT_PLL_L_VAL (0x00000772) -#define WCD9360_CLK_SYS_INT_PLL_M_VAL (0x00000773) -#define WCD9360_CLK_SYS_INT_PLL_N_VAL (0x00000774) -#define WCD9360_CLK_SYS_INT_TEST_REG0 (0x00000775) -#define WCD9360_CLK_SYS_INT_PFD_CP_DSM_PROG (0x00000776) -#define WCD9360_CLK_SYS_INT_VCO_PROG (0x00000777) -#define WCD9360_CLK_SYS_INT_TEST_REG1 (0x00000778) -#define WCD9360_CLK_SYS_INT_LDO_LOCK_CFG (0x00000779) -#define WCD9360_CLK_SYS_INT_DIG_LOCK_DET_CFG (0x0000077A) -#define WCD9360_CLK_SYS_INT_CLK_TEST1 (0x0000077B) -#define WCD9360_CLK_SYS_INT_CLK_TEST2 (0x0000077C) -#define WCD9360_CLK_SYS_INT_CLK_TEST3 (0x0000077D) -#define WCD9360_SIDO_NEW_INT_RAMP_STATUS (0x00000796) -#define WCD9360_SIDO_NEW_INT_SPARE_1 (0x00000797) -#define WCD9360_SIDO_NEW_INT_DEBUG_VOUT_SETTING_A (0x00000798) -#define WCD9360_SIDO_NEW_INT_DEBUG_VOUT_SETTING_D (0x00000799) -#define WCD9360_SIDO_NEW_INT_RAMP_INC_WAIT (0x0000079A) -#define WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_CTL (0x0000079B) -#define WCD9360_SIDO_NEW_INT_RAMP_IBLEED_CTL (0x0000079C) -#define WCD9360_SIDO_NEW_INT_DEBUG_CPROVR_TEST (0x0000079D) -#define WCD9360_SIDO_NEW_INT_RAMP_CTL_A (0x0000079E) -#define WCD9360_SIDO_NEW_INT_RAMP_CTL_D (0x0000079F) -#define WCD9360_SIDO_NEW_INT_RAMP_TIMEOUT_PERIOD (0x000007A0) -#define WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING1 (0x000007A1) -#define WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING2 (0x000007A2) -#define WCD9360_SIDO_NEW_INT_DYNAMIC_IPEAK_SETTING3 (0x000007A3) -#define WCD9360_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL1 (0x000007A4) -#define WCD9360_SIDO_NEW_INT_HIGH_ACCU_MODE_SEL2 (0x000007A5) -#define WCD9360_EAR_INT_NEW_EAR_CHOPPER_CON (0x000007B7) -#define WCD9360_EAR_INT_NEW_EAR_VCM_GEN_CON1 (0x000007B8) -#define WCD9360_EAR_INT_NEW_EAR_VCM_GEN_CON2 (0x000007B9) -#define WCD9360_EAR_INT_NEW_EAR_DYNAMIC_BIAS (0x000007BA) -#define WCD9360_AUX_INT_AUX_EN_REG (0x000007BD) -#define WCD9360_AUX_INT_AUX_PA_CON (0x000007BE) -#define WCD9360_AUX_INT_AUX_SP_CON (0x000007BF) -#define WCD9360_AUX_INT_AUX_DAC_CON (0x000007C0) -#define WCD9360_AUX_INT_AUX_CNP_FSM_CON (0x000007C1) -#define WCD9360_AUX_INT_AUX_TEST (0x000007C2) -#define WCD9360_AUX_INT_STATUS_REG (0x000007C3) -#define WCD9360_AUX_INT_AUX_MISC (0x000007C4) -#define WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL1 (0x000007C5) -#define WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL2 (0x000007C6) -#define WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL3 (0x000007C7) -#define WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL4 (0x000007C8) -#define WCD9360_LDORXTX_INT_ANA_LDORXTX_CTRL5 (0x000007C9) -#define WCD9360_LDORXTX_INT_ANA_LDORXTX_STATUS (0x000007CA) -#define WCD9360_DIE_CRACK_INT_INT1 (0x000007CC) -#define WCD9360_DIE_CRACK_INT_INT2 (0x000007CD) -#define WCD9360_LOOP_BACK_INT_SPARE (0x000007CE) -#define WCD9360_PAGE10_PAGE_REGISTER (0x00000A00) -#define WCD9360_CDC_ANC0_CLK_RESET_CTL (0x00000A01) -#define WCD9360_CDC_ANC0_MODE_1_CTL (0x00000A02) -#define WCD9360_CDC_ANC0_MODE_2_CTL (0x00000A03) -#define WCD9360_CDC_ANC0_FF_SHIFT (0x00000A04) -#define WCD9360_CDC_ANC0_FB_SHIFT (0x00000A05) -#define WCD9360_CDC_ANC0_LPF_FF_A_CTL (0x00000A06) -#define WCD9360_CDC_ANC0_LPF_FF_B_CTL (0x00000A07) -#define WCD9360_CDC_ANC0_LPF_FB_CTL (0x00000A08) -#define WCD9360_CDC_ANC0_SMLPF_CTL (0x00000A09) -#define WCD9360_CDC_ANC0_DCFLT_SHIFT_CTL (0x00000A0A) -#define WCD9360_CDC_ANC0_IIR_ADAPT_CTL (0x00000A0B) -#define WCD9360_CDC_ANC0_IIR_COEFF_1_CTL (0x00000A0C) -#define WCD9360_CDC_ANC0_IIR_COEFF_2_CTL (0x00000A0D) -#define WCD9360_CDC_ANC0_FF_A_GAIN_CTL (0x00000A0E) -#define WCD9360_CDC_ANC0_FF_B_GAIN_CTL (0x00000A0F) -#define WCD9360_CDC_ANC0_FB_GAIN_CTL (0x00000A10) -#define WCD9360_CDC_TX0_TX_PATH_CTL (0x00000A31) -#define WCD9360_CDC_TX0_TX_PATH_CFG0 (0x00000A32) -#define WCD9360_CDC_TX0_TX_PATH_CFG1 (0x00000A33) -#define WCD9360_CDC_TX0_TX_VOL_CTL (0x00000A34) -#define WCD9360_CDC_TX0_TX_PATH_192_CTL (0x00000A35) -#define WCD9360_CDC_TX0_TX_PATH_192_CFG (0x00000A36) -#define WCD9360_CDC_TX0_TX_PATH_SEC0 (0x00000A37) -#define WCD9360_CDC_TX0_TX_PATH_SEC1 (0x00000A38) -#define WCD9360_CDC_TX0_TX_PATH_SEC2 (0x00000A39) -#define WCD9360_CDC_TX0_TX_PATH_SEC3 (0x00000A3A) -#define WCD9360_CDC_TX0_TX_PATH_SEC4 (0x00000A3B) -#define WCD9360_CDC_TX0_TX_PATH_SEC5 (0x00000A3C) -#define WCD9360_CDC_TX0_TX_PATH_SEC6 (0x00000A3D) -#define WCD9360_CDC_TX1_TX_PATH_CTL (0x00000A41) -#define WCD9360_CDC_TX1_TX_PATH_CFG0 (0x00000A42) -#define WCD9360_CDC_TX1_TX_PATH_CFG1 (0x00000A43) -#define WCD9360_CDC_TX1_TX_VOL_CTL (0x00000A44) -#define WCD9360_CDC_TX1_TX_PATH_192_CTL (0x00000A45) -#define WCD9360_CDC_TX1_TX_PATH_192_CFG (0x00000A46) -#define WCD9360_CDC_TX1_TX_PATH_SEC0 (0x00000A47) -#define WCD9360_CDC_TX1_TX_PATH_SEC1 (0x00000A48) -#define WCD9360_CDC_TX1_TX_PATH_SEC2 (0x00000A49) -#define WCD9360_CDC_TX1_TX_PATH_SEC3 (0x00000A4A) -#define WCD9360_CDC_TX1_TX_PATH_SEC4 (0x00000A4B) -#define WCD9360_CDC_TX1_TX_PATH_SEC5 (0x00000A4C) -#define WCD9360_CDC_TX1_TX_PATH_SEC6 (0x00000A4D) -#define WCD9360_CDC_TX2_TX_PATH_CTL (0x00000A51) -#define WCD9360_CDC_TX2_TX_PATH_CFG0 (0x00000A52) -#define WCD9360_CDC_TX2_TX_PATH_CFG1 (0x00000A53) -#define WCD9360_CDC_TX2_TX_VOL_CTL (0x00000A54) -#define WCD9360_CDC_TX2_TX_PATH_192_CTL (0x00000A55) -#define WCD9360_CDC_TX2_TX_PATH_192_CFG (0x00000A56) -#define WCD9360_CDC_TX2_TX_PATH_SEC0 (0x00000A57) -#define WCD9360_CDC_TX2_TX_PATH_SEC1 (0x00000A58) -#define WCD9360_CDC_TX2_TX_PATH_SEC2 (0x00000A59) -#define WCD9360_CDC_TX2_TX_PATH_SEC3 (0x00000A5A) -#define WCD9360_CDC_TX2_TX_PATH_SEC4 (0x00000A5B) -#define WCD9360_CDC_TX2_TX_PATH_SEC5 (0x00000A5C) -#define WCD9360_CDC_TX2_TX_PATH_SEC6 (0x00000A5D) -#define WCD9360_CDC_TX3_TX_PATH_CTL (0x00000A61) -#define WCD9360_CDC_TX3_TX_PATH_CFG0 (0x00000A62) -#define WCD9360_CDC_TX3_TX_PATH_CFG1 (0x00000A63) -#define WCD9360_CDC_TX3_TX_VOL_CTL (0x00000A64) -#define WCD9360_CDC_TX3_TX_PATH_192_CTL (0x00000A65) -#define WCD9360_CDC_TX3_TX_PATH_192_CFG (0x00000A66) -#define WCD9360_CDC_TX3_TX_PATH_SEC0 (0x00000A67) -#define WCD9360_CDC_TX3_TX_PATH_SEC1 (0x00000A68) -#define WCD9360_CDC_TX3_TX_PATH_SEC2 (0x00000A69) -#define WCD9360_CDC_TX3_TX_PATH_SEC3 (0x00000A6A) -#define WCD9360_CDC_TX3_TX_PATH_SEC4 (0x00000A6B) -#define WCD9360_CDC_TX3_TX_PATH_SEC5 (0x00000A6C) -#define WCD9360_CDC_TX3_TX_PATH_SEC6 (0x00000A6D) -#define WCD9360_CDC_TX4_TX_PATH_CTL (0x00000A71) -#define WCD9360_CDC_TX4_TX_PATH_CFG0 (0x00000A72) -#define WCD9360_CDC_TX4_TX_PATH_CFG1 (0x00000A73) -#define WCD9360_CDC_TX4_TX_VOL_CTL (0x00000A74) -#define WCD9360_CDC_TX4_TX_PATH_192_CTL (0x00000A75) -#define WCD9360_CDC_TX4_TX_PATH_192_CFG (0x00000A76) -#define WCD9360_CDC_TX4_TX_PATH_SEC0 (0x00000A77) -#define WCD9360_CDC_TX4_TX_PATH_SEC1 (0x00000A78) -#define WCD9360_CDC_TX4_TX_PATH_SEC2 (0x00000A79) -#define WCD9360_CDC_TX4_TX_PATH_SEC3 (0x00000A7A) -#define WCD9360_CDC_TX4_TX_PATH_SEC4 (0x00000A7B) -#define WCD9360_CDC_TX4_TX_PATH_SEC5 (0x00000A7C) -#define WCD9360_CDC_TX4_TX_PATH_SEC6 (0x00000A7D) -#define WCD9360_CDC_TX5_TX_PATH_CTL (0x00000A81) -#define WCD9360_CDC_TX5_TX_PATH_CFG0 (0x00000A82) -#define WCD9360_CDC_TX5_TX_PATH_CFG1 (0x00000A83) -#define WCD9360_CDC_TX5_TX_VOL_CTL (0x00000A84) -#define WCD9360_CDC_TX5_TX_PATH_192_CTL (0x00000A85) -#define WCD9360_CDC_TX5_TX_PATH_192_CFG (0x00000A86) -#define WCD9360_CDC_TX5_TX_PATH_SEC0 (0x00000A87) -#define WCD9360_CDC_TX5_TX_PATH_SEC1 (0x00000A88) -#define WCD9360_CDC_TX5_TX_PATH_SEC2 (0x00000A89) -#define WCD9360_CDC_TX5_TX_PATH_SEC3 (0x00000A8A) -#define WCD9360_CDC_TX5_TX_PATH_SEC4 (0x00000A8B) -#define WCD9360_CDC_TX5_TX_PATH_SEC5 (0x00000A8C) -#define WCD9360_CDC_TX5_TX_PATH_SEC6 (0x00000A8D) -#define WCD9360_CDC_TX6_TX_PATH_CTL (0x00000A91) -#define WCD9360_CDC_TX6_TX_PATH_CFG0 (0x00000A92) -#define WCD9360_CDC_TX6_TX_PATH_CFG1 (0x00000A93) -#define WCD9360_CDC_TX6_TX_VOL_CTL (0x00000A94) -#define WCD9360_CDC_TX6_TX_PATH_192_CTL (0x00000A95) -#define WCD9360_CDC_TX6_TX_PATH_192_CFG (0x00000A96) -#define WCD9360_CDC_TX6_TX_PATH_SEC0 (0x00000A97) -#define WCD9360_CDC_TX6_TX_PATH_SEC1 (0x00000A98) -#define WCD9360_CDC_TX6_TX_PATH_SEC2 (0x00000A99) -#define WCD9360_CDC_TX6_TX_PATH_SEC3 (0x00000A9A) -#define WCD9360_CDC_TX6_TX_PATH_SEC4 (0x00000A9B) -#define WCD9360_CDC_TX6_TX_PATH_SEC5 (0x00000A9C) -#define WCD9360_CDC_TX6_TX_PATH_SEC6 (0x00000A9D) -#define WCD9360_CDC_TX7_TX_PATH_CTL (0x00000AA1) -#define WCD9360_CDC_TX7_TX_PATH_CFG0 (0x00000AA2) -#define WCD9360_CDC_TX7_TX_PATH_CFG1 (0x00000AA3) -#define WCD9360_CDC_TX7_TX_VOL_CTL (0x00000AA4) -#define WCD9360_CDC_TX7_TX_PATH_192_CTL (0x00000AA5) -#define WCD9360_CDC_TX7_TX_PATH_192_CFG (0x00000AA6) -#define WCD9360_CDC_TX7_TX_PATH_SEC0 (0x00000AA7) -#define WCD9360_CDC_TX7_TX_PATH_SEC1 (0x00000AA8) -#define WCD9360_CDC_TX7_TX_PATH_SEC2 (0x00000AA9) -#define WCD9360_CDC_TX7_TX_PATH_SEC3 (0x00000AAA) -#define WCD9360_CDC_TX7_TX_PATH_SEC4 (0x00000AAB) -#define WCD9360_CDC_TX7_TX_PATH_SEC5 (0x00000AAC) -#define WCD9360_CDC_TX7_TX_PATH_SEC6 (0x00000AAD) -#define WCD9360_CDC_TX8_TX_PATH_CTL (0x00000AB1) -#define WCD9360_CDC_TX8_TX_PATH_CFG0 (0x00000AB2) -#define WCD9360_CDC_TX8_TX_PATH_CFG1 (0x00000AB3) -#define WCD9360_CDC_TX8_TX_VOL_CTL (0x00000AB4) -#define WCD9360_CDC_TX8_TX_PATH_192_CTL (0x00000AB5) -#define WCD9360_CDC_TX8_TX_PATH_192_CFG (0x00000AB6) -#define WCD9360_CDC_TX8_TX_PATH_SEC0 (0x00000AB7) -#define WCD9360_CDC_TX8_TX_PATH_SEC1 (0x00000AB8) -#define WCD9360_CDC_TX8_TX_PATH_SEC2 (0x00000AB9) -#define WCD9360_CDC_TX8_TX_PATH_SEC3 (0x00000ABA) -#define WCD9360_CDC_TX8_TX_PATH_SEC4 (0x00000ABB) -#define WCD9360_CDC_TX8_TX_PATH_SEC5 (0x00000ABC) -#define WCD9360_CDC_TX8_TX_PATH_SEC6 (0x00000ABD) -#define WCD9360_CDC_TX9_SPKR_PROT_PATH_CTL (0x00000AC2) -#define WCD9360_CDC_TX9_SPKR_PROT_PATH_CFG0 (0x00000AC3) -#define WCD9360_CDC_TX10_SPKR_PROT_PATH_CTL (0x00000AC6) -#define WCD9360_CDC_TX10_SPKR_PROT_PATH_CFG0 (0x00000AC7) -#define WCD9360_CDC_TX11_SPKR_PROT_PATH_CTL (0x00000ACA) -#define WCD9360_CDC_TX11_SPKR_PROT_PATH_CFG0 (0x00000ACB) -#define WCD9360_CDC_TX12_SPKR_PROT_PATH_CTL (0x00000ACE) -#define WCD9360_CDC_TX12_SPKR_PROT_PATH_CFG0 (0x00000ACF) -#define WCD9360_PAGE11_PAGE_REGISTER (0x00000B00) -#define WCD9360_CDC_COMPANDER0_CTL0 (0x00000B21) -#define WCD9360_CDC_COMPANDER0_CTL1 (0x00000B22) -#define WCD9360_CDC_COMPANDER0_CTL2 (0x00000B23) -#define WCD9360_CDC_COMPANDER0_CTL3 (0x00000B24) -#define WCD9360_CDC_COMPANDER0_CTL4 (0x00000B25) -#define WCD9360_CDC_COMPANDER0_CTL5 (0x00000B26) -#define WCD9360_CDC_COMPANDER0_CTL6 (0x00000B27) -#define WCD9360_CDC_COMPANDER0_CTL7 (0x00000B28) -#define WCD9360_CDC_COMPANDER7_CTL0 (0x00000B31) -#define WCD9360_CDC_COMPANDER7_CTL1 (0x00000B32) -#define WCD9360_CDC_COMPANDER7_CTL2 (0x00000B33) -#define WCD9360_CDC_COMPANDER7_CTL3 (0x00000B34) -#define WCD9360_CDC_COMPANDER7_CTL4 (0x00000B35) -#define WCD9360_CDC_COMPANDER7_CTL5 (0x00000B36) -#define WCD9360_CDC_COMPANDER7_CTL6 (0x00000B37) -#define WCD9360_CDC_COMPANDER7_CTL7 (0x00000B38) -#define WCD9360_CDC_COMPANDER8_CTL0 (0x00000B39) -#define WCD9360_CDC_COMPANDER8_CTL1 (0x00000B3A) -#define WCD9360_CDC_COMPANDER8_CTL2 (0x00000B3B) -#define WCD9360_CDC_COMPANDER8_CTL3 (0x00000B3C) -#define WCD9360_CDC_COMPANDER8_CTL4 (0x00000B3D) -#define WCD9360_CDC_COMPANDER8_CTL5 (0x00000B3E) -#define WCD9360_CDC_COMPANDER8_CTL6 (0x00000B3F) -#define WCD9360_CDC_COMPANDER8_CTL7 (0x00000B40) -#define WCD9360_CDC_RX0_RX_PATH_CTL (0x00000B41) -#define WCD9360_CDC_RX0_RX_PATH_CFG0 (0x00000B42) -#define WCD9360_CDC_RX0_RX_PATH_CFG1 (0x00000B43) -#define WCD9360_CDC_RX0_RX_PATH_CFG2 (0x00000B44) -#define WCD9360_CDC_RX0_RX_VOL_CTL (0x00000B45) -#define WCD9360_CDC_RX0_RX_PATH_MIX_CTL (0x00000B46) -#define WCD9360_CDC_RX0_RX_PATH_MIX_CFG (0x00000B47) -#define WCD9360_CDC_RX0_RX_VOL_MIX_CTL (0x00000B48) -#define WCD9360_CDC_RX0_RX_PATH_SEC0 (0x00000B49) -#define WCD9360_CDC_RX0_RX_PATH_SEC1 (0x00000B4A) -#define WCD9360_CDC_RX0_RX_PATH_SEC2 (0x00000B4B) -#define WCD9360_CDC_RX0_RX_PATH_SEC3 (0x00000B4C) -#define WCD9360_CDC_RX0_RX_PATH_SEC5 (0x00000B4E) -#define WCD9360_CDC_RX0_RX_PATH_SEC6 (0x00000B4F) -#define WCD9360_CDC_RX0_RX_PATH_SEC7 (0x00000B50) -#define WCD9360_CDC_RX0_RX_PATH_MIX_SEC0 (0x00000B51) -#define WCD9360_CDC_RX0_RX_PATH_MIX_SEC1 (0x00000B52) -#define WCD9360_CDC_RX0_RX_PATH_DSMDEM_CTL (0x00000B53) -#define WCD9360_CDC_RX9_RX_PATH_CTL (0x00000BA5) -#define WCD9360_CDC_RX9_RX_PATH_CFG0 (0x00000BA6) -#define WCD9360_CDC_RX9_RX_PATH_CFG1 (0x00000BA7) -#define WCD9360_CDC_RX9_RX_PATH_CFG2 (0x00000BA8) -#define WCD9360_CDC_RX9_RX_VOL_CTL (0x00000BA9) -#define WCD9360_CDC_RX9_RX_PATH_MIX_CTL (0x00000BAA) -#define WCD9360_CDC_RX9_RX_PATH_MIX_CFG (0x00000BAB) -#define WCD9360_CDC_RX9_RX_VOL_MIX_CTL (0x00000BAC) -#define WCD9360_CDC_RX9_RX_PATH_SEC0 (0x00000BAD) -#define WCD9360_CDC_RX9_RX_PATH_SEC1 (0x00000BAE) -#define WCD9360_CDC_RX9_RX_PATH_SEC2 (0x00000BAF) -#define WCD9360_CDC_RX9_RX_PATH_SEC3 (0x00000BB0) -#define WCD9360_CDC_RX9_RX_PATH_SEC5 (0x00000BB2) -#define WCD9360_CDC_RX9_RX_PATH_SEC6 (0x00000BB3) -#define WCD9360_CDC_RX9_RX_PATH_SEC7 (0x00000BB4) -#define WCD9360_CDC_RX9_RX_PATH_MIX_SEC0 (0x00000BB5) -#define WCD9360_CDC_RX9_RX_PATH_MIX_SEC1 (0x00000BB6) -#define WCD9360_CDC_RX9_RX_PATH_DSMDEM_CTL (0x00000BB7) -#define WCD9360_CDC_RX7_RX_PATH_CTL (0x00000BCD) -#define WCD9360_CDC_RX7_RX_PATH_CFG0 (0x00000BCE) -#define WCD9360_CDC_RX7_RX_PATH_CFG1 (0x00000BCF) -#define WCD9360_CDC_RX7_RX_PATH_CFG2 (0x00000BD0) -#define WCD9360_CDC_RX7_RX_VOL_CTL (0x00000BD1) -#define WCD9360_CDC_RX7_RX_PATH_MIX_CTL (0x00000BD2) -#define WCD9360_CDC_RX7_RX_PATH_MIX_CFG (0x00000BD3) -#define WCD9360_CDC_RX7_RX_VOL_MIX_CTL (0x00000BD4) -#define WCD9360_CDC_RX7_RX_PATH_SEC0 (0x00000BD5) -#define WCD9360_CDC_RX7_RX_PATH_SEC1 (0x00000BD6) -#define WCD9360_CDC_RX7_RX_PATH_SEC2 (0x00000BD7) -#define WCD9360_CDC_RX7_RX_PATH_SEC3 (0x00000BD8) -#define WCD9360_CDC_RX7_RX_PATH_SEC5 (0x00000BDA) -#define WCD9360_CDC_RX7_RX_PATH_SEC6 (0x00000BDB) -#define WCD9360_CDC_RX7_RX_PATH_SEC7 (0x00000BDC) -#define WCD9360_CDC_RX7_RX_PATH_MIX_SEC0 (0x00000BDD) -#define WCD9360_CDC_RX7_RX_PATH_MIX_SEC1 (0x00000BDE) -#define WCD9360_CDC_RX7_RX_PATH_DSMDEM_CTL (0x00000BDF) -#define WCD9360_CDC_RX8_RX_PATH_CTL (0x00000BE1) -#define WCD9360_CDC_RX8_RX_PATH_CFG0 (0x00000BE2) -#define WCD9360_CDC_RX8_RX_PATH_CFG1 (0x00000BE3) -#define WCD9360_CDC_RX8_RX_PATH_CFG2 (0x00000BE4) -#define WCD9360_CDC_RX8_RX_VOL_CTL (0x00000BE5) -#define WCD9360_CDC_RX8_RX_PATH_MIX_CTL (0x00000BE6) -#define WCD9360_CDC_RX8_RX_PATH_MIX_CFG (0x00000BE7) -#define WCD9360_CDC_RX8_RX_VOL_MIX_CTL (0x00000BE8) -#define WCD9360_CDC_RX8_RX_PATH_SEC0 (0x00000BE9) -#define WCD9360_CDC_RX8_RX_PATH_SEC1 (0x00000BEA) -#define WCD9360_CDC_RX8_RX_PATH_SEC2 (0x00000BEB) -#define WCD9360_CDC_RX8_RX_PATH_SEC3 (0x00000BEC) -#define WCD9360_CDC_RX8_RX_PATH_SEC5 (0x00000BEE) -#define WCD9360_CDC_RX8_RX_PATH_SEC6 (0x00000BEF) -#define WCD9360_CDC_RX8_RX_PATH_SEC7 (0x00000BF0) -#define WCD9360_CDC_RX8_RX_PATH_MIX_SEC0 (0x00000BF1) -#define WCD9360_CDC_RX8_RX_PATH_MIX_SEC1 (0x00000BF2) -#define WCD9360_CDC_RX8_RX_PATH_DSMDEM_CTL (0x00000BF3) -#define WCD9360_PAGE12_PAGE_REGISTER (0x00000C00) -#define WCD9360_CDC_BOOST0_BOOST_PATH_CTL (0x00000C19) -#define WCD9360_CDC_BOOST0_BOOST_CTL (0x00000C1A) -#define WCD9360_CDC_BOOST0_BOOST_CFG1 (0x00000C1B) -#define WCD9360_CDC_BOOST0_BOOST_CFG2 (0x00000C1C) -#define WCD9360_CDC_BOOST1_BOOST_PATH_CTL (0x00000C21) -#define WCD9360_CDC_BOOST1_BOOST_CTL (0x00000C22) -#define WCD9360_CDC_BOOST1_BOOST_CFG1 (0x00000C23) -#define WCD9360_CDC_BOOST1_BOOST_CFG2 (0x00000C24) -#define WCD9360_MIXING_ASRC2_CLK_RST_CTL (0x00000C6D) -#define WCD9360_MIXING_ASRC2_CTL0 (0x00000C6E) -#define WCD9360_MIXING_ASRC2_CTL1 (0x00000C6F) -#define WCD9360_MIXING_ASRC2_FIFO_CTL (0x00000C70) -#define WCD9360_MIXING_ASRC2_STATUS_FMIN_CNTR_LSB (0x00000C71) -#define WCD9360_MIXING_ASRC2_STATUS_FMIN_CNTR_MSB (0x00000C72) -#define WCD9360_MIXING_ASRC2_STATUS_FMAX_CNTR_LSB (0x00000C73) -#define WCD9360_MIXING_ASRC2_STATUS_FMAX_CNTR_MSB (0x00000C74) -#define WCD9360_MIXING_ASRC2_STATUS_FIFO (0x00000C75) -#define WCD9360_MIXING_ASRC3_CLK_RST_CTL (0x00000C79) -#define WCD9360_MIXING_ASRC3_CTL0 (0x00000C7A) -#define WCD9360_MIXING_ASRC3_CTL1 (0x00000C7B) -#define WCD9360_MIXING_ASRC3_FIFO_CTL (0x00000C7C) -#define WCD9360_MIXING_ASRC3_STATUS_FMIN_CNTR_LSB (0x00000C7D) -#define WCD9360_MIXING_ASRC3_STATUS_FMIN_CNTR_MSB (0x00000C7E) -#define WCD9360_MIXING_ASRC3_STATUS_FMAX_CNTR_LSB (0x00000C7F) -#define WCD9360_MIXING_ASRC3_STATUS_FMAX_CNTR_MSB (0x00000C80) -#define WCD9360_MIXING_ASRC3_STATUS_FIFO (0x00000C81) -#define WCD9360_SWR_AHB_BRIDGE_WR_DATA_0 (0x00000C85) -#define WCD9360_SWR_AHB_BRIDGE_WR_DATA_1 (0x00000C86) -#define WCD9360_SWR_AHB_BRIDGE_WR_DATA_2 (0x00000C87) -#define WCD9360_SWR_AHB_BRIDGE_WR_DATA_3 (0x00000C88) -#define WCD9360_SWR_AHB_BRIDGE_WR_ADDR_0 (0x00000C89) -#define WCD9360_SWR_AHB_BRIDGE_WR_ADDR_1 (0x00000C8A) -#define WCD9360_SWR_AHB_BRIDGE_WR_ADDR_2 (0x00000C8B) -#define WCD9360_SWR_AHB_BRIDGE_WR_ADDR_3 (0x00000C8C) -#define WCD9360_SWR_AHB_BRIDGE_RD_ADDR_0 (0x00000C8D) -#define WCD9360_SWR_AHB_BRIDGE_RD_ADDR_1 (0x00000C8E) -#define WCD9360_SWR_AHB_BRIDGE_RD_ADDR_2 (0x00000C8F) -#define WCD9360_SWR_AHB_BRIDGE_RD_ADDR_3 (0x00000C90) -#define WCD9360_SWR_AHB_BRIDGE_RD_DATA_0 (0x00000C91) -#define WCD9360_SWR_AHB_BRIDGE_RD_DATA_1 (0x00000C92) -#define WCD9360_SWR_AHB_BRIDGE_RD_DATA_2 (0x00000C93) -#define WCD9360_SWR_AHB_BRIDGE_RD_DATA_3 (0x00000C94) -#define WCD9360_SWR_AHB_BRIDGE_ACCESS_CFG (0x00000C95) -#define WCD9360_SWR_AHB_BRIDGE_ACCESS_STATUS (0x00000C96) -#define WCD9360_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL (0x00000CB5) -#define WCD9360_CDC_SIDETONE_SRC0_ST_SRC_PATH_CFG1 (0x00000CB6) -#define WCD9360_SIDETONE_ASRC0_CLK_RST_CTL (0x00000CBD) -#define WCD9360_SIDETONE_ASRC0_CTL0 (0x00000CBE) -#define WCD9360_SIDETONE_ASRC0_CTL1 (0x00000CBF) -#define WCD9360_SIDETONE_ASRC0_FIFO_CTL (0x00000CC0) -#define WCD9360_SIDETONE_ASRC0_STATUS_FMIN_CNTR_LSB (0x00000CC1) -#define WCD9360_SIDETONE_ASRC0_STATUS_FMIN_CNTR_MSB (0x00000CC2) -#define WCD9360_SIDETONE_ASRC0_STATUS_FMAX_CNTR_LSB (0x00000CC3) -#define WCD9360_SIDETONE_ASRC0_STATUS_FMAX_CNTR_MSB (0x00000CC4) -#define WCD9360_SIDETONE_ASRC0_STATUS_FIFO (0x00000CC5) -#define WCD9360_EC_REF_HQ0_EC_REF_HQ_PATH_CTL (0x00000CD5) -#define WCD9360_EC_REF_HQ0_EC_REF_HQ_CFG0 (0x00000CD6) -#define WCD9360_EC_REF_HQ1_EC_REF_HQ_PATH_CTL (0x00000CDD) -#define WCD9360_EC_REF_HQ1_EC_REF_HQ_CFG0 (0x00000CDE) -#define WCD9360_EC_ASRC0_CLK_RST_CTL (0x00000CE5) -#define WCD9360_EC_ASRC0_CTL0 (0x00000CE6) -#define WCD9360_EC_ASRC0_CTL1 (0x00000CE7) -#define WCD9360_EC_ASRC0_FIFO_CTL (0x00000CE8) -#define WCD9360_EC_ASRC0_STATUS_FMIN_CNTR_LSB (0x00000CE9) -#define WCD9360_EC_ASRC0_STATUS_FMIN_CNTR_MSB (0x00000CEA) -#define WCD9360_EC_ASRC0_STATUS_FMAX_CNTR_LSB (0x00000CEB) -#define WCD9360_EC_ASRC0_STATUS_FMAX_CNTR_MSB (0x00000CEC) -#define WCD9360_EC_ASRC0_STATUS_FIFO (0x00000CED) -#define WCD9360_EC_ASRC1_CLK_RST_CTL (0x00000CF1) -#define WCD9360_EC_ASRC1_CTL0 (0x00000CF2) -#define WCD9360_EC_ASRC1_CTL1 (0x00000CF3) -#define WCD9360_EC_ASRC1_FIFO_CTL (0x00000CF4) -#define WCD9360_EC_ASRC1_STATUS_FMIN_CNTR_LSB (0x00000CF5) -#define WCD9360_EC_ASRC1_STATUS_FMIN_CNTR_MSB (0x00000CF6) -#define WCD9360_EC_ASRC1_STATUS_FMAX_CNTR_LSB (0x00000CF7) -#define WCD9360_EC_ASRC1_STATUS_FMAX_CNTR_MSB (0x00000CF8) -#define WCD9360_EC_ASRC1_STATUS_FIFO (0x00000CF9) -#define WCD9360_PAGE13_PAGE_REGISTER (0x00000D00) -#define WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG0 (0x00000D01) -#define WCD9360_CDC_RX_INP_MUX_RX_INT0_CFG1 (0x00000D02) -#define WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG0 (0x00000D0B) -#define WCD9360_CDC_RX_INP_MUX_RX_INT9_CFG1 (0x00000D0C) -#define WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG0 (0x00000D0F) -#define WCD9360_CDC_RX_INP_MUX_RX_INT7_CFG1 (0x00000D10) -#define WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG0 (0x00000D11) -#define WCD9360_CDC_RX_INP_MUX_RX_INT8_CFG1 (0x00000D12) -#define WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG0 (0x00000D13) -#define WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG1 (0x00000D14) -#define WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG2 (0x00000D15) -#define WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG3 (0x00000D16) -#define WCD9360_CDC_RX_INP_MUX_RX_MIX_CFG4 (0x00000D17) -#define WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 (0x00000D18) -#define WCD9360_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1 (0x00000D19) -#define WCD9360_CDC_RX_INP_MUX_ANC_CFG0 (0x00000D1A) -#define WCD9360_CDC_RX_INP_MUX_SPLINE_ASRC_CFG0 (0x00000D1B) -#define WCD9360_CDC_RX_INP_MUX_EC_REF_HQ_CFG0 (0x00000D1C) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG0 (0x00000D1D) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX0_CFG1 (0x00000D1E) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG0 (0x00000D1F) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX1_CFG1 (0x00000D20) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG0 (0x00000D21) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX2_CFG1 (0x00000D22) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG0 (0x00000D23) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX3_CFG1 (0x00000D25) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX4_CFG0 (0x00000D26) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX5_CFG0 (0x00000D27) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX6_CFG0 (0x00000D28) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX7_CFG0 (0x00000D29) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX8_CFG0 (0x00000D2A) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX10_CFG0 (0x00000D2B) -#define WCD9360_CDC_TX_INP_MUX_ADC_MUX11_CFG0 (0x00000D2C) -#define WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0 (0x00000D31) -#define WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1 (0x00000D32) -#define WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2 (0x00000D33) -#define WCD9360_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3 (0x00000D34) -#define WCD9360_CDC_IF_ROUTER_TX_MUX_CFG0 (0x00000D3A) -#define WCD9360_CDC_IF_ROUTER_TX_MUX_CFG1 (0x00000D3B) -#define WCD9360_CDC_IF_ROUTER_TX_MUX_CFG2 (0x00000D3C) -#define WCD9360_CDC_IF_ROUTER_TX_MUX_CFG3 (0x00000D3D) -#define WCD9360_CDC_CLK_RST_CTRL_MCLK_CONTROL (0x00000D41) -#define WCD9360_CDC_CLK_RST_CTRL_FS_CNT_CONTROL (0x00000D42) -#define WCD9360_CDC_CLK_RST_CTRL_SWR_CONTROL (0x00000D43) -#define WCD9360_CDC_CLK_RST_CTRL_ASRC_SHARE_CONTROL (0x00000D45) -#define WCD9360_CDC_PROX_DETECT_PROX_CTL (0x00000D49) -#define WCD9360_CDC_PROX_DETECT_PROX_POLL_PERIOD0 (0x00000D4A) -#define WCD9360_CDC_PROX_DETECT_PROX_POLL_PERIOD1 (0x00000D4B) -#define WCD9360_CDC_PROX_DETECT_PROX_SIG_PATTERN_LSB (0x00000D4C) -#define WCD9360_CDC_PROX_DETECT_PROX_SIG_PATTERN_MSB (0x00000D4D) -#define WCD9360_CDC_PROX_DETECT_PROX_STATUS (0x00000D4E) -#define WCD9360_CDC_PROX_DETECT_PROX_TEST_CTRL (0x00000D4F) -#define WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB (0x00000D50) -#define WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB (0x00000D51) -#define WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_LSB_RD (0x00000D52) -#define WCD9360_CDC_PROX_DETECT_PROX_TEST_BUFF_MSB_RD (0x00000D53) -#define WCD9360_CDC_PROX_DETECT_PROX_CTL_REPEAT_PAT (0x00000D54) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_PATH_CTL (0x00000D55) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL (0x00000D56) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL (0x00000D57) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL (0x00000D58) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL (0x00000D59) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B5_CTL (0x00000D5A) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B6_CTL (0x00000D5B) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B7_CTL (0x00000D5C) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_B8_CTL (0x00000D5D) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_CTL (0x00000D5E) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL (0x00000D5F) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL (0x00000D60) -#define WCD9360_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL (0x00000D61) -#define WCD9360_CDC_TOP_TOP_CFG0 (0x00000D81) -#define WCD9360_CDC_TOP_TOP_CFG1 (0x00000D82) -#define WCD9360_CDC_TOP_TOP_CFG7 (0x00000D88) -#define WCD9360_CDC_TOP_EAR_COMP_WR_LSB (0x00000DA9) -#define WCD9360_CDC_TOP_EAR_COMP_WR_MSB (0x00000DAA) -#define WCD9360_CDC_TOP_EAR_COMP_LUT (0x00000DAB) -#define WCD9360_CDC_TOP_EAR_COMP_RD_LSB (0x00000DAC) -#define WCD9360_CDC_TOP_EAR_COMP_RD_MSB (0x00000DAD) -#define WCD9360_CDC_TOP_TOP_DEBUG (0x00000DAE) -#define WCD9360_PAGE80_PAGE_REGISTER (0x00005000) -#define WCD9360_CODEC_CPR_WR_DATA_0 (0x00005001) -#define WCD9360_CODEC_CPR_WR_DATA_1 (0x00005002) -#define WCD9360_CODEC_CPR_WR_DATA_2 (0x00005003) -#define WCD9360_CODEC_CPR_WR_DATA_3 (0x00005004) -#define WCD9360_CODEC_CPR_WR_ADDR_0 (0x00005005) -#define WCD9360_CODEC_CPR_WR_ADDR_1 (0x00005006) -#define WCD9360_CODEC_CPR_WR_ADDR_2 (0x00005007) -#define WCD9360_CODEC_CPR_WR_ADDR_3 (0x00005008) -#define WCD9360_CODEC_CPR_RD_ADDR_0 (0x00005009) -#define WCD9360_CODEC_CPR_RD_ADDR_1 (0x0000500A) -#define WCD9360_CODEC_CPR_RD_ADDR_2 (0x0000500B) -#define WCD9360_CODEC_CPR_RD_ADDR_3 (0x0000500C) -#define WCD9360_CODEC_CPR_RD_DATA_0 (0x0000500D) -#define WCD9360_CODEC_CPR_RD_DATA_1 (0x0000500E) -#define WCD9360_CODEC_CPR_RD_DATA_2 (0x0000500F) -#define WCD9360_CODEC_CPR_RD_DATA_3 (0x00005010) -#define WCD9360_CODEC_CPR_ACCESS_CFG (0x00005011) -#define WCD9360_CODEC_CPR_ACCESS_STATUS (0x00005012) -#define WCD9360_CODEC_CPR_NOM_CX_VDD (0x00005021) -#define WCD9360_CODEC_CPR_SVS_CX_VDD (0x00005022) -#define WCD9360_CODEC_CPR_SVS2_CX_VDD (0x00005023) -#define WCD9360_CODEC_CPR_NOM_MX_VDD (0x00005024) -#define WCD9360_CODEC_CPR_SVS_MX_VDD (0x00005025) -#define WCD9360_CODEC_CPR_SVS2_MX_VDD (0x00005026) -#define WCD9360_CODEC_CPR_SVS2_MIN_CX_VDD (0x00005027) -#define WCD9360_CODEC_CPR_MAX_SVS2_STEP (0x00005028) -#define WCD9360_CODEC_CPR_CTL (0x00005029) -#define WCD9360_CODEC_CPR_SW_MODECHNG_STATUS (0x0000502A) -#define WCD9360_CODEC_CPR_SW_MODECHNG_START (0x0000502B) -#define WCD9360_CODEC_CPR_CPR_STATUS (0x0000502C) -#define WCD9360_PAGE128_PAGE_REGISTER (0x00008000) -#define WCD9360_TLMM_JTCK_PINCFG (0x00008001) -#define WCD9360_TLMM_INTR1_PINCFG (0x00008002) -#define WCD9360_TLMM_INTR2_PINCFG (0x00008003) -#define WCD9360_TLMM_SWR_DATA_PINCFG (0x00008004) -#define WCD9360_TLMM_SWR_CLK_PINCFG (0x00008005) -#define WCD9360_TLMM_SLIMBUS_DATA1_PINCFG (0x00008006) -#define WCD9360_TLMM_SLIMBUS_DATA2_PINCFG (0x00008007) -#define WCD9360_TLMM_SLIMBUS_CLK_PINCFG (0x00008008) -#define WCD9360_TLMM_I2C_CLK_PINCFG (0x00008009) -#define WCD9360_TLMM_I2C_DATA_PINCFG (0x0000800A) -#define WCD9360_TLMM_I2S_0_RX_PINCFG (0x0000800B) -#define WCD9360_TLMM_I2S_0_TX_PINCFG (0x0000800C) -#define WCD9360_TLMM_I2S_0_SCK_PINCFG (0x0000800D) -#define WCD9360_TLMM_I2S_0_WS_PINCFG (0x0000800E) -#define WCD9360_TLMM_I2S_1_RX_PINCFG (0x0000800F) -#define WCD9360_TLMM_I2S_1_TX_PINCFG (0x00008010) -#define WCD9360_TLMM_I2S_1_SCK_PINCFG (0x00008011) -#define WCD9360_TLMM_I2S_1_WS_PINCFG (0x00008012) -#define WCD9360_TLMM_DMIC1_CLK_PINCFG (0x00008013) -#define WCD9360_TLMM_DMIC1_DATA_PINCFG (0x00008014) -#define WCD9360_TLMM_DMIC2_CLK_PINCFG (0x00008015) -#define WCD9360_TLMM_DMIC2_DATA_PINCFG (0x00008016) -#define WCD9360_TLMM_GPIO1_PINCFG (0x00008017) -#define WCD9360_TLMM_GPIO2_PINCFG (0x00008018) -#define WCD9360_TLMM_GPIO3_PINCFG (0x00008019) -#define WCD9360_TLMM_GPIO4_PINCFG (0x0000801A) -#define WCD9360_TLMM_SPI_S_CSN_PINCFG (0x0000801B) -#define WCD9360_TLMM_SPI_S_CLK_PINCFG (0x0000801C) -#define WCD9360_TLMM_SPI_S_DOUT_PINCFG (0x0000801D) -#define WCD9360_TLMM_SPI_S_DIN_PINCFG (0x0000801E) -#define WCD9360_TLMM_GPIO0_PINCFG (0x0000801F) -#define WCD9360_TLMM_DMIC3_CLK_PINCFG (0x00008020) -#define WCD9360_TLMM_DMIC3_DATA_PINCFG (0x00008021) -#define WCD9360_TLMM_DMIC4_CLK_PINCFG (0x00008022) -#define WCD9360_TLMM_DMIC4_DATA_PINCFG (0x00008023) -#define WCD9360_TEST_DEBUG_PIN_CTL_OE_0 (0x00008031) -#define WCD9360_TEST_DEBUG_PIN_CTL_OE_1 (0x00008032) -#define WCD9360_TEST_DEBUG_PIN_CTL_OE_2 (0x00008033) -#define WCD9360_TEST_DEBUG_PIN_CTL_OE_3 (0x00008034) -#define WCD9360_TEST_DEBUG_PIN_CTL_OE_4 (0x00008035) -#define WCD9360_TEST_DEBUG_PIN_CTL_DATA_0 (0x00008036) -#define WCD9360_TEST_DEBUG_PIN_CTL_DATA_1 (0x00008037) -#define WCD9360_TEST_DEBUG_PIN_CTL_DATA_2 (0x00008038) -#define WCD9360_TEST_DEBUG_PIN_CTL_DATA_3 (0x00008039) -#define WCD9360_TEST_DEBUG_PIN_CTL_DATA_4 (0x0000803A) -#define WCD9360_TEST_DEBUG_PAD_DRVCTL_0 (0x0000803B) -#define WCD9360_TEST_DEBUG_PAD_DRVCTL_1 (0x0000803C) -#define WCD9360_TEST_DEBUG_PIN_STATUS (0x0000803D) -#define WCD9360_TEST_DEBUG_NPL_DLY_TEST_1 (0x0000803E) -#define WCD9360_TEST_DEBUG_NPL_DLY_TEST_2 (0x0000803F) -#define WCD9360_TEST_DEBUG_MEM_CTRL (0x00008040) -#define WCD9360_TEST_DEBUG_DEBUG_BUS_SEL (0x00008041) -#define WCD9360_TEST_DEBUG_DEBUG_JTAG (0x00008042) -#define WCD9360_TEST_DEBUG_DEBUG_EN_1 (0x00008043) -#define WCD9360_TEST_DEBUG_DEBUG_EN_2 (0x00008044) -#define WCD9360_TEST_DEBUG_DEBUG_EN_3 (0x00008045) -#define WCD9360_TEST_DEBUG_DEBUG_EN_4 (0x00008046) -#define WCD9360_TEST_DEBUG_DEBUG_EN_5 (0x00008047) -#define WCD9360_TEST_DEBUG_ANA_DTEST_DIR (0x0000804A) -#define WCD9360_TEST_DEBUG_PAD_INP_DISABLE_0 (0x0000804B) -#define WCD9360_TEST_DEBUG_PAD_INP_DISABLE_1 (0x0000804C) -#define WCD9360_TEST_DEBUG_PAD_INP_DISABLE_2 (0x0000804D) -#define WCD9360_TEST_DEBUG_PAD_INP_DISABLE_3 (0x0000804E) -#define WCD9360_TEST_DEBUG_PAD_INP_DISABLE_4 (0x0000804F) -#define WCD9360_TEST_DEBUG_SYSMEM_CTRL (0x00008050) -#define WCD9360_TEST_DEBUG_LVAL_NOM_LOW (0x00008052) -#define WCD9360_TEST_DEBUG_LVAL_NOM_HIGH (0x00008053) -#define WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_LOW (0x00008054) -#define WCD9360_TEST_DEBUG_LVAL_SVS_SVS2_HIGH (0x00008055) -#define WCD9360_TEST_DEBUG_SPI_SLAVE_CHAR (0x00008056) -#define WCD9360_TEST_DEBUG_CODEC_DIAGS (0x00008057) -#define WCD9360_TEST_DEBUG_PAD_TEST (0x00008058) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_0 (0x00008061) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_1 (0x00008062) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_2 (0x00008063) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_3 (0x00008064) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_4 (0x00008065) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_5 (0x00008066) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_6 (0x00008067) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_7 (0x00008068) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_8 (0x00008069) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_9 (0x0000806A) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_10 (0x0000806B) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_11 (0x0000806C) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_12 (0x0000806D) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_13 (0x0000806E) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_14 (0x0000806F) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_15 (0x00008070) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_16 (0x00008071) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_17 (0x00008072) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_18 (0x00008073) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_19 (0x00008074) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_20 (0x00008075) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_21 (0x00008076) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_22 (0x00008077) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_23 (0x00008078) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_24 (0x00008079) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_25 (0x0000807A) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_26 (0x0000807B) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_27 (0x0000807C) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_28 (0x0000807D) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_29 (0x0000807E) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_30 (0x0000807F) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_BIT_31 (0x00008080) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_RD_CTRL (0x00008081) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_RD_7_0 (0x00008082) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_RD_15_8 (0x00008083) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_RD_23_16 (0x00008084) -#define WCD9360_TEST_DEBUG_DEBUG_MUX_RD_31_24 (0x00008085) -#define WCD9360_MAX_REGISTER 0x80FF - -/* SLIMBUS Slave Registers */ -#define WCD9360_SLIM_PGD_PORT_INT_RX_EN0 (0x30) -#define WCD9360_SLIM_PGD_PORT_INT_TX_EN0 (0x32) -#define WCD9360_SLIM_PGD_PORT_INT_STATUS_RX_0 (0x34) -#define WCD9360_SLIM_PGD_PORT_INT_STATUS_RX_1 (0x35) -#define WCD9360_SLIM_PGD_PORT_INT_STATUS_TX_0 (0x36) -#define WCD9360_SLIM_PGD_PORT_INT_STATUS_TX_1 (0x37) -#define WCD9360_SLIM_PGD_PORT_INT_CLR_RX_0 (0x38) -#define WCD9360_SLIM_PGD_PORT_INT_CLR_RX_1 (0x39) -#define WCD9360_SLIM_PGD_PORT_INT_CLR_TX_0 (0x3A) -#define WCD9360_SLIM_PGD_PORT_INT_CLR_TX_1 (0x3B) -#define WCD9360_SLIM_PGD_PORT_INT_RX_SOURCE0 (0x60) -#define WCD9360_SLIM_PGD_PORT_INT_TX_SOURCE0 (0x70) - -#endif diff --git a/techpack/audio/include/asoc/wcd9xxx_registers.h b/techpack/audio/include/asoc/wcd9xxx_registers.h deleted file mode 100644 index 66809eff2cde..000000000000 --- a/techpack/audio/include/asoc/wcd9xxx_registers.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _WCD9XXX_REGISTERS_H -#define _WCD9XXX_REGISTERS_H - -#define WCD9XXX_BASE_ADDRESS 0x3000 - -#define WCD9XXX_ANA_RX_SUPPLIES (WCD9XXX_BASE_ADDRESS+0x008) -#define WCD9XXX_ANA_HPH (WCD9XXX_BASE_ADDRESS+0x009) -#define WCD9XXX_CLASSH_MODE_2 (WCD9XXX_BASE_ADDRESS+0x098) -#define WCD9XXX_CLASSH_MODE_3 (WCD9XXX_BASE_ADDRESS+0x099) -#define WCD9XXX_FLYBACK_VNEG_CTRL_1 (WCD9XXX_BASE_ADDRESS+0x0A5) -#define WCD9XXX_FLYBACK_VNEG_CTRL_4 (WCD9XXX_BASE_ADDRESS+0x0A8) -#define WCD9XXX_FLYBACK_VNEGDAC_CTRL_2 (WCD9XXX_BASE_ADDRESS+0x0AF) -#define WCD9XXX_RX_BIAS_HPH_LOWPOWER (WCD9XXX_BASE_ADDRESS+0x0BF) -#define WCD9XXX_RX_BIAS_FLYB_BUFF (WCD9XXX_BASE_ADDRESS+0x0C7) -#define WCD9XXX_HPH_PA_CTL1 (WCD9XXX_BASE_ADDRESS+0x0D1) -#define WCD9XXX_HPH_NEW_INT_PA_MISC2 (WCD9XXX_BASE_ADDRESS+0x138) - -#endif diff --git a/techpack/audio/include/dsp/apr_audio-v2.h b/techpack/audio/include/dsp/apr_audio-v2.h deleted file mode 100644 index a5c18ca98523..000000000000 --- a/techpack/audio/include/dsp/apr_audio-v2.h +++ /dev/null @@ -1,12396 +0,0 @@ -/* Copyright (c) 2012-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#ifndef _APR_AUDIO_V2_H_ -#define _APR_AUDIO_V2_H_ - -#include -#include - -/* size of header needed for passing data out of band */ -#define APR_CMD_OB_HDR_SZ 12 - -/* size of header needed for getting data */ -#define APR_CMD_GET_HDR_SZ 16 - -struct param_outband { - size_t size; - void *kvaddr; - phys_addr_t paddr; -}; - -/* Common structures and definitions used for instance ID support */ -/* Instance ID definitions */ -#define INSTANCE_ID_0 0x0000 - -struct mem_mapping_hdr { - /* - * LSW of parameter data payload address. Supported values: any. - * - Must be set to zero for in-band data. - */ - u32 data_payload_addr_lsw; - - /* - * MSW of Parameter data payload address. Supported values: any. - * - Must be set to zero for in-band data. - * - In the case of 32 bit Shared memory address, MSW field must be - * set to zero. - * - In the case of 36 bit shared memory address, bit 31 to bit 4 of - * MSW must be set to zero. - */ - u32 data_payload_addr_msw; - - /* - * Memory map handle returned by DSP through - * ASM_CMD_SHARED_MEM_MAP_REGIONS command. - * Supported Values: Any. - * If memory map handle is NULL, the parameter data payloads are - * within the message payload (in-band). - * If memory map handle is non-NULL, the parameter data payloads begin - * at the address specified in the address MSW and LSW (out-of-band). - */ - u32 mem_map_handle; - -} __packed; - -/* - * Payload format for parameter data. - * Immediately following these structures are param_size bytes of parameter - * data. - */ -struct param_hdr_v1 { - /* Valid ID of the module. */ - uint32_t module_id; - - /* Valid ID of the parameter. */ - uint32_t param_id; - - /* The size of the parameter specified by the module/param ID combo */ - uint16_t param_size; - - /* This field must be set to zero. */ - uint16_t reserved; -} __packed; - -struct param_hdr_v2 { - /* Valid ID of the module. */ - uint32_t module_id; - - /* Valid ID of the parameter. */ - uint32_t param_id; - - /* The size of the parameter specified by the module/param ID combo */ - uint32_t param_size; -} __packed; - -struct param_hdr_v3 { - /* Valid ID of the module. */ - uint32_t module_id; - - /* Instance of the module. */ - uint16_t instance_id; - - /* This field must be set to zero. */ - uint16_t reserved; - - /* Valid ID of the parameter. */ - uint32_t param_id; - - /* The size of the parameter specified by the module/param ID combo */ - uint32_t param_size; -} __packed; - -/* A union of all param_hdr versions for versitility and max size */ -union param_hdrs { - struct param_hdr_v1 v1; - struct param_hdr_v2 v2; - struct param_hdr_v3 v3; -}; - -struct module_instance_info { - /* Module ID. */ - u32 module_id; - - /* Instance of the module */ - u16 instance_id; - - /* Reserved. This field must be set to zero. */ - u16 reserved; -} __packed; - -/* Begin service specific definitions and structures */ - -#define ADSP_ADM_VERSION 0x00070000 - -#define ADM_CMD_SHARED_MEM_MAP_REGIONS 0x00010322 -#define ADM_CMDRSP_SHARED_MEM_MAP_REGIONS 0x00010323 -#define ADM_CMD_SHARED_MEM_UNMAP_REGIONS 0x00010324 - -#define ADM_CMD_MATRIX_MAP_ROUTINGS_V5 0x00010325 -#define ADM_CMD_STREAM_DEVICE_MAP_ROUTINGS_V5 0x0001033D -/* Enumeration for an audio Rx matrix ID.*/ -#define ADM_MATRIX_ID_AUDIO_RX 0 - -#define ADM_MATRIX_ID_AUDIO_TX 1 - -#define ADM_MATRIX_ID_COMPRESSED_AUDIO_RX 2 - -#define ADM_MATRIX_ID_COMPRESSED_AUDIO_TX 3 - -#define ADM_MATRIX_ID_LISTEN_TX 4 -/* Enumeration for an audio Tx matrix ID.*/ -#define ADM_MATRIX_ID_AUDIOX 1 - -#define ADM_MAX_COPPS 5 - -/* make sure this matches with msm_audio_calibration */ -#define SP_V2_NUM_MAX_SPKR 2 - -/* Session map node structure. - * Immediately following this structure are num_copps - * entries of COPP IDs. The COPP IDs are 16 bits, so - * there might be a padding 16-bit field if num_copps - * is odd. - */ -struct adm_session_map_node_v5 { - u16 session_id; - /* Handle of the ASM session to be routed. Supported values: 1 - * to 8. - */ - - - u16 num_copps; - /* Number of COPPs to which this session is to be routed. - * Supported values: 0 < num_copps <= ADM_MAX_COPPS. - */ -} __packed; - -/* Payload of the #ADM_CMD_MATRIX_MAP_ROUTINGS_V5 command. - * Immediately following this structure are num_sessions of the session map - * node payload (adm_session_map_node_v5). - */ - -struct adm_cmd_matrix_map_routings_v5 { - struct apr_hdr hdr; - - u32 matrix_id; - /* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx - * (1). Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - u32 num_sessions; - /* Number of sessions being updated by this command (optional). */ -} __packed; - -/* This command allows a client to open a COPP/Voice Proc. TX module - * and sets up the device session: Matrix -> COPP -> AFE on the RX - * and AFE -> COPP -> Matrix on the TX. This enables PCM data to - * be transferred to/from the endpoint (AFEPortID). - * - * @return - * #ADM_CMDRSP_DEVICE_OPEN_V5 with the resulting status and COPP ID. - */ -#define ADM_CMD_DEVICE_OPEN_V5 0x00010326 - -/* This command allows a client to open a COPP/Voice Proc the - * way as ADM_CMD_DEVICE_OPEN_V5 but supports multiple endpoint2 - * channels. - * - * @return - * #ADM_CMDRSP_DEVICE_OPEN_V6 with the resulting status and - * COPP ID. - */ -#define ADM_CMD_DEVICE_OPEN_V6 0x00010356 - -/* This command allows a client to open a COPP/Voice Proc the -* way as ADM_CMD_DEVICE_OPEN_V8 but supports any number channel -* of configuration. -* -* @return -* #ADM_CMDRSP_DEVICE_OPEN_V8 with the resulting status and -* COPP ID. -*/ -#define ADM_CMD_DEVICE_OPEN_V8 0x0001036A - - -/* Definition for a low latency stream session. */ -#define ADM_LOW_LATENCY_DEVICE_SESSION 0x2000 - -/* Definition for a ultra low latency stream session. */ -#define ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION 0x4000 - -/* Definition for a ultra low latency with Post Processing stream session. */ -#define ADM_ULL_POST_PROCESSING_DEVICE_SESSION 0x8000 - -/* Definition for a legacy device session. */ -#define ADM_LEGACY_DEVICE_SESSION 0 - -/* Indicates that endpoint_id_2 is to be ignored.*/ -#define ADM_CMD_COPP_OPEN_END_POINT_ID_2_IGNORE 0xFFFF - -#define ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_RX_PATH_COPP 1 - -#define ADM_CMD_COPP_OPEN_MODE_OF_OPERATIONX_PATH_LIVE_COPP 2 - -#define ADM_CMD_COPP_OPEN_MODE_OF_OPERATIONX_PATH_NON_LIVE_COPP 3 - -/* Indicates that an audio COPP is to send/receive a mono PCM - * stream to/from - * END_POINT_ID_1. - */ -#define ADM_CMD_COPP_OPEN_CHANNEL_CONFIG_MONO 1 - -/* Indicates that an audio COPP is to send/receive a - * stereo PCM stream to/from END_POINT_ID_1. - */ -#define ADM_CMD_COPP_OPEN_CHANNEL_CONFIG_STEREO 2 - -/* Sample rate is 8000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_8K 8000 - -/* Sample rate is 16000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_16K 16000 - -/* Sample rate is 32000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_32K 32000 - -/* Sample rate is 48000 Hz.*/ -#define ADM_CMD_COPP_OPEN_SAMPLE_RATE_48K 48000 - -/* Definition for a COPP live input flag bitmask.*/ -#define ADM_BIT_MASK_COPP_LIVE_INPUT_FLAG (0x0001U) - -/* Definition for a COPP live shift value bitmask.*/ -#define ADM_SHIFT_COPP_LIVE_INPUT_FLAG 0 - -/* Definition for the COPP ID bitmask.*/ -#define ADM_BIT_MASK_COPP_ID (0x0000FFFFUL) - -/* Definition for the COPP ID shift value.*/ -#define ADM_SHIFT_COPP_ID 0 - -/* Definition for the service ID bitmask.*/ -#define ADM_BIT_MASK_SERVICE_ID (0x00FF0000UL) - -/* Definition for the service ID shift value.*/ -#define ADM_SHIFT_SERVICE_ID 16 - -/* Definition for the domain ID bitmask.*/ -#define ADM_BIT_MASK_DOMAIN_ID (0xFF000000UL) - -/* Definition for the domain ID shift value.*/ -#define ADM_SHIFT_DOMAIN_ID 24 - -/* ADM device open command payload of the - * #ADM_CMD_DEVICE_OPEN_V5 command. - */ -struct adm_cmd_device_open_v5 { - struct apr_hdr hdr; - u16 flags; -/* Reserved for future use. Clients must set this field - * to zero. - */ - - u16 mode_of_operation; -/* Specifies whether the COPP must be opened on the Tx or Rx - * path. Use the ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_* macros for - * supported values and interpretation. - * Supported values: - * - 0x1 -- Rx path COPP - * - 0x2 -- Tx path live COPP - * - 0x3 -- Tx path nonlive COPP - * Live connections cause sample discarding in the Tx device - * matrix if the destination output ports do not pull them - * fast enough. Nonlive connections queue the samples - * indefinitely. - */ - - u16 endpoint_id_1; -/* Logical and physical endpoint ID of the audio path. - * If the ID is a voice processor Tx block, it receives near - * samples. Supported values: Any pseudoport, AFE Rx port, - * or AFE Tx port For a list of valid IDs, refer to - * @xhyperref{Q4,[Q4]}. - * Q4 = Hexagon Multimedia: AFE Interface Specification - */ - - u16 endpoint_id_2; -/* Logical and physical endpoint ID 2 for a voice processor - * Tx block. - * This is not applicable to audio COPP. - * Supported values: - * - AFE Rx port - * - 0xFFFF -- Endpoint 2 is unavailable and the voice - * processor Tx - * block ignores this endpoint - * When the voice processor Tx block is created on the audio - * record path, - * it can receive far-end samples from an AFE Rx port if the - * voice call - * is active. The ID of the AFE port is provided in this - * field. - * For a list of valid IDs, refer @xhyperref{Q4,[Q4]}. - */ - - u32 topology_id; -/* Audio COPP topology ID; 32-bit GUID. */ - - u16 dev_num_channel; -/* Number of channels the audio COPP sends to/receives from - * the endpoint. - * Supported values: 1 to 8. - * The value is ignored for the voice processor Tx block, - * where channel - * configuration is derived from the topology ID. - */ - - u16 bit_width; -/* Bit width (in bits) that the audio COPP sends to/receives - * from the - * endpoint. The value is ignored for the voice processing - * Tx block, - * where the PCM width is 16 bits. - */ - - u32 sample_rate; -/* Sampling rate at which the audio COPP/voice processor - * Tx block - * interfaces with the endpoint. - * Supported values for voice processor Tx: 8000, 16000, - * 48000 Hz - * Supported values for audio COPP: >0 and <=192 kHz - */ - - u8 dev_channel_mapping[8]; -/* Array of channel mapping of buffers that the audio COPP - * sends to the endpoint. Channel[i] mapping describes channel - * I inside the buffer, where 0 < i < dev_num_channel. - * This value is relevant only for an audio Rx COPP. - * For the voice processor block and Tx audio block, this field - * is set to zero and is ignored. - */ -} __packed; - -/* ADM device open command payload of the - * #ADM_CMD_DEVICE_OPEN_V6 command. - */ -struct adm_cmd_device_open_v6 { - struct apr_hdr hdr; - u16 flags; -/* Reserved for future use. Clients must set this field - * to zero. - */ - - u16 mode_of_operation; -/* Specifies whether the COPP must be opened on the Tx or Rx - * path. Use the ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_* macros for - * supported values and interpretation. - * Supported values: - * - 0x1 -- Rx path COPP - * - 0x2 -- Tx path live COPP - * - 0x3 -- Tx path nonlive COPP - * Live connections cause sample discarding in the Tx device - * matrix if the destination output ports do not pull them - * fast enough. Nonlive connections queue the samples - * indefinitely. - */ - - u16 endpoint_id_1; -/* Logical and physical endpoint ID of the audio path. - * If the ID is a voice processor Tx block, it receives near - * samples. Supported values: Any pseudoport, AFE Rx port, - * or AFE Tx port For a list of valid IDs, refer to - * @xhyperref{Q4,[Q4]}. - * Q4 = Hexagon Multimedia: AFE Interface Specification - */ - - u16 endpoint_id_2; -/* Logical and physical endpoint ID 2 for a voice processor - * Tx block. - * This is not applicable to audio COPP. - * Supported values: - * - AFE Rx port - * - 0xFFFF -- Endpoint 2 is unavailable and the voice - * processor Tx - * block ignores this endpoint - * When the voice processor Tx block is created on the audio - * record path, - * it can receive far-end samples from an AFE Rx port if the - * voice call - * is active. The ID of the AFE port is provided in this - * field. - * For a list of valid IDs, refer @xhyperref{Q4,[Q4]}. - */ - - u32 topology_id; -/* Audio COPP topology ID; 32-bit GUID. */ - - u16 dev_num_channel; -/* Number of channels the audio COPP sends to/receives from - * the endpoint. - * Supported values: 1 to 8. - * The value is ignored for the voice processor Tx block, - * where channel - * configuration is derived from the topology ID. - */ - - u16 bit_width; -/* Bit width (in bits) that the audio COPP sends to/receives - * from the - * endpoint. The value is ignored for the voice processing - * Tx block, - * where the PCM width is 16 bits. - */ - - u32 sample_rate; -/* Sampling rate at which the audio COPP/voice processor - * Tx block - * interfaces with the endpoint. - * Supported values for voice processor Tx: 8000, 16000, - * 48000 Hz - * Supported values for audio COPP: >0 and <=192 kHz - */ - - u8 dev_channel_mapping[8]; -/* Array of channel mapping of buffers that the audio COPP - * sends to the endpoint. Channel[i] mapping describes channel - * I inside the buffer, where 0 < i < dev_num_channel. - * This value is relevant only for an audio Rx COPP. - * For the voice processor block and Tx audio block, this field - * is set to zero and is ignored. - */ - - u16 dev_num_channel_eid2; -/* Number of channels the voice processor block sends - * to/receives from the endpoint2. - * Supported values: 1 to 8. - * The value is ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ - - u16 bit_width_eid2; -/* Bit width (in bits) that the voice processor sends - * to/receives from the endpoint2. - * Supported values: 16 and 24. - * The value is ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ - - u32 sample_rate_eid2; -/* Sampling rate at which the voice processor Tx block - * interfaces with the endpoint2. - * Supported values for Tx voice processor: >0 and <=384 kHz - * The value is ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ - - u8 dev_channel_mapping_eid2[8]; -/* Array of channel mapping of buffers that the voice processor - * sends to the endpoint. Channel[i] mapping describes channel - * I inside the buffer, where 0 < i < dev_num_channel. - * This value is relevant only for the Tx voice processor. - * The values are ignored for audio COPP or if endpoint_id_2 is - * set to 0xFFFF. - */ -} __packed; - - -/* ADM device open endpoint payload the - * #ADM_CMD_DEVICE_OPEN_V8 command. - */ -struct adm_device_endpoint_payload { - u16 dev_num_channel; -/* Number of channels the audio COPP sends to/receives from - * the endpoint. - * Supported values: 1 to 32. - * The value is ignored for the voice processor Tx block, - * where channel - * configuration is derived from the topology ID. - */ - - u16 bit_width; -/* Bit width (in bits) that the audio COPP sends to/receives - * from the - * endpoint. The value is ignored for the voice processing - * Tx block, - * where the PCM width is 16 bits. - */ - - u32 sample_rate; -/* Sampling rate at which the audio COPP/voice processor - * Tx block - * interfaces with the endpoint. - * Supported values for voice processor Tx: 8000, 16000, - * 48000 Hz - * Supported values for audio COPP: >0 and <=192 kHz - */ - - u8 dev_channel_mapping[32]; -} __packed; - -/* ADM device open command payload of the - * #ADM_CMD_DEVICE_OPEN_V8 command. - */ -struct adm_cmd_device_open_v8 { - struct apr_hdr hdr; - u16 flags; -/* Bit width Native mode enabled : 11th bit of flag parameter -* If 11th bit of flag is set then that means matrix mixer will be -* running in native mode for bit width for this device session. -* -* Channel Native mode enabled : 12th bit of flag parameter -* If 12th bit of flag is set then that means matrix mixer will be -* running in native mode for channel configuration for this device session. -* All other bits are reserved; clients must set them to 0. -*/ - u16 mode_of_operation; -/* Specifies whether the COPP must be opened on the Tx or Rx - * path. Use the ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_* macros for - * supported values and interpretation. - * Supported values: - * - 0x1 -- Rx path COPP - * - 0x2 -- Tx path live COPP - * - 0x3 -- Tx path nonlive COPP - * Live connections cause sample discarding in the Tx device - * matrix if the destination output ports do not pull them - * fast enough. Nonlive connections queue the samples - * indefinitely. - */ - u32 topology_id; -/* Audio COPP topology ID; 32-bit GUID. */ - - - u16 endpoint_id_1; -/* Logical and physical endpoint ID of the audio path. - * If the ID is a voice processor Tx block, it receives near - * samples. - * Supported values: Any pseudoport, AFE Rx port, - * or AFE Tx port For a list of valid IDs, refer to - * @xhyperref{Q4,[Q4]}. - * Q4 = Hexagon Multimedia: AFE Interface Specification - */ - - u16 endpoint_id_2; -/* Logical and physical endpoint ID 2 for a voice processor - * Tx block. - * This is not applicable to audio COPP. - * Supported values: - * - AFE Rx port - * - 0xFFFF -- Endpoint 2 is unavailable and the voice - * processor Tx - * block ignores this endpoint - * When the voice processor Tx block is created on the audio - * record path, - * it can receive far-end samples from an AFE Rx port if the - * voice call - * is active. The ID of the AFE port is provided in this - * field. - * For a list of valid IDs, refer @xhyperref{Q4,[Q4]}. - */ - - u16 endpoint_id_3; -/* - * Logical and physical endpoint ID of the audio path. - * This indicated afe rx port in ADM loopback use cases. - * In all other use cases this should be set to 0xffff - */ - - u16 reserved; -} __packed; - -/* - * This command allows the client to close a COPP and disconnect - * the device session. - */ -#define ADM_CMD_DEVICE_CLOSE_V5 0x00010327 - -/* Sets one or more parameters to a COPP. */ -#define ADM_CMD_SET_PP_PARAMS_V5 0x00010328 -#define ADM_CMD_SET_PP_PARAMS_V6 0x0001035D - -/* - * Structure of the ADM Set PP Params command. Parameter data must be - * pre-packed with correct header for either V2 or V3 when sent in-band. - * Use q6core_pack_pp_params to pack the header and data correctly depending on - * Instance ID support. - */ -struct adm_cmd_set_pp_params { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending out of band */ - struct mem_mapping_hdr mem_hdr; - - /* - * Size in bytes of the variable payload accompanying this - * message or - * in shared memory. This is used for parsing the parameter - * payload. - */ - u32 payload_size; - - /* - * Parameter data for in band payload. This should be structured as the - * parameter header immediately followed by the parameter data. Multiple - * parameters can be set in one command by repeating the header followed - * by the data for as many parameters as need to be set. - * Use q6core_pack_pp_params to pack the header and data correctly - * depending on Instance ID support. - */ - u8 param_data[0]; -} __packed; - - -#define ASM_STREAM_CMD_REGISTER_PP_EVENTS 0x00013213 -#define ASM_STREAM_PP_EVENT 0x00013214 -#define ASM_STREAM_CMD_REGISTER_IEC_61937_FMT_UPDATE 0x13333 -#define ASM_IEC_61937_MEDIA_FMT_EVENT 0x13334 - -#define DSP_STREAM_CMD "ADSP Stream Cmd" -#define DSP_STREAM_CALLBACK "ADSP Stream Callback Event" -#define DSP_STREAM_CALLBACK_QUEUE_SIZE 1024 - -struct dsp_stream_callback_list { - struct list_head list; - struct msm_adsp_event_data event; -}; - -struct dsp_stream_callback_prtd { - uint16_t event_count; - struct list_head event_queue; - spinlock_t prtd_spin_lock; -}; - -/* set customized mixing on matrix mixer */ -#define ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V5 0x00010344 -struct adm_cmd_set_pspd_mtmx_strtr_params_v5 { - struct apr_hdr hdr; - /* LSW of parameter data payload address.*/ - u32 payload_addr_lsw; - /* MSW of parameter data payload address.*/ - u32 payload_addr_msw; - /* Memory map handle returned by ADM_CMD_SHARED_MEM_MAP_REGIONS */ - /* command. If mem_map_handle is zero implies the message is in */ - /* the payload */ - u32 mem_map_handle; - /* Size in bytes of the variable payload accompanying this */ - /* message or in shared memory. This is used for parsing the */ - /* parameter payload. */ - u32 payload_size; - u16 direction; - u16 sessionid; - u16 deviceid; - u16 reserved; -} __packed; - -/* set customized mixing on matrix mixer. - * Updated to account for both LSM as well as ASM path. - */ -#define ADM_CMD_SET_PSPD_MTMX_STRTR_PARAMS_V6 0x00010364 -struct adm_cmd_set_pspd_mtmx_strtr_params_v6 { - struct apr_hdr hdr; - /* LSW of parameter data payload address.*/ - u32 payload_addr_lsw; - /* MSW of parameter data payload address.*/ - u32 payload_addr_msw; - /* Memory map handle returned by ADM_CMD_SHARED_MEM_MAP_REGIONS */ - /* command. If mem_map_handle is zero implies the message is in */ - /* the payload */ - u32 mem_map_handle; - /* Size in bytes of the variable payload accompanying this */ - /* message or in shared memory. This is used for parsing the */ - /* parameter payload. */ - u32 payload_size; - u16 direction; - u16 sessionid; - u16 deviceid; - u16 stream_type; -} __packed; -/* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V5 command. - */ -#define ADM_CMDRSP_DEVICE_OPEN_V5 0x00010329 - -/* Payload of the #ADM_CMDRSP_DEVICE_OPEN_V5 message, - * which returns the - * status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V5 command. - */ -struct adm_cmd_rsp_device_open_v5 { - u32 status; - /* Status message (error code).*/ - - u16 copp_id; - /* COPP ID: Supported values: 0 <= copp_id < ADM_MAX_COPPS*/ - - u16 reserved; - /* Reserved. This field must be set to zero.*/ -} __packed; - -/* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V6 command. */ -#define ADM_CMDRSP_DEVICE_OPEN_V6 0x00010357 - -/* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V8 command. */ -#define ADM_CMDRSP_DEVICE_OPEN_V8 0x0001036B - -/* Payload of the #ADM_CMDRSP_DEVICE_OPEN_V6 message, - * which returns the - * status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V6 command - * is the exact same as ADM_CMDRSP_DEVICE_OPEN_V5. - */ - -/* This command allows a query of one COPP parameter. */ -#define ADM_CMD_GET_PP_PARAMS_V5 0x0001032A -#define ADM_CMD_GET_PP_PARAMS_V6 0x0001035E - -/* - * Structure of the ADM Get PP Params command. Parameter header must be - * packed correctly for either V2 or V3. Use q6core_pack_pp_params to pack the - * header correctly depending on Instance ID support. - */ -struct adm_cmd_get_pp_params { - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when requesting outband */ - struct mem_mapping_hdr mem_hdr; - - /* Parameter header for in band payload. */ - union param_hdrs param_hdr; -} __packed; - -/* Returns parameter values - * in response to an #ADM_CMD_GET_PP_PARAMS_V5 command. - */ -#define ADM_CMDRSP_GET_PP_PARAMS_V5 0x0001032B - -/* Payload of the #ADM_CMDRSP_GET_PP_PARAMS_V5 message, - * which returns parameter values in response - * to an #ADM_CMD_GET_PP_PARAMS_V5 command. - * Immediately following this - * structure is the param_hdr_v1 - * structure containing the pre/postprocessing - * parameter data. For an in-band - * scenario, the variable payload depends - * on the size of the parameter. - */ -struct adm_cmd_rsp_get_pp_params_v5 { - /* Status message (error code).*/ - u32 status; - - /* The header that identifies the subsequent parameter data */ - struct param_hdr_v1 param_hdr; - - /* The parameter data returned */ - u32 param_data[0]; -} __packed; - -/* - * Returns parameter values in response to an #ADM_CMD_GET_PP_PARAMS_V5/6 - * command. - */ -#define ADM_CMDRSP_GET_PP_PARAMS_V6 0x0001035F - -/* - * Payload of the #ADM_CMDRSP_GET_PP_PARAMS_V6 message, - * which returns parameter values in response - * to an #ADM_CMD_GET_PP_PARAMS_V6 command. - * Immediately following this - * structure is the param_hdr_v3 - * structure containing the pre/postprocessing - * parameter data. For an in-band - * scenario, the variable payload depends - * on the size of the parameter. - */ -struct adm_cmd_rsp_get_pp_params_v6 { - /* Status message (error code).*/ - u32 status; - - /* The header that identifies the subsequent parameter data */ - struct param_hdr_v3 param_hdr; - - /* The parameter data returned */ - u32 param_data[0]; -} __packed; - -/* Structure for holding soft stepping volume parameters. */ - -/* - * Payload of the #ASM_PARAM_ID_SOFT_VOL_STEPPING_PARAMETERS - * parameters used by the Volume Control module. - */ - -struct audproc_softvolume_params { - u32 period; - u32 step; - u32 rampingcurve; -} __packed; - -/* - * ID of the Media Format Converter (MFC) module. - * This module supports the following parameter IDs: - * #AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT - * #AUDPROC_CHMIXER_PARAM_ID_COEFF - */ -#define AUDPROC_MODULE_ID_MFC 0x00010912 - -/* ID of the Output Media Format parameters used by AUDPROC_MODULE_ID_MFC. - * - */ -#define AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT 0x00010913 - -/* Param ID of Channel Mixer used by AUDPROC_MODULE_ID_MFC */ -#define AUDPROC_CHMIXER_PARAM_ID_COEFF 0x00010342 - - -struct adm_cmd_set_pp_params_v5 { - struct apr_hdr hdr; - u32 payload_addr_lsw; - /* LSW of parameter data payload address.*/ - u32 payload_addr_msw; - /* MSW of parameter data payload address.*/ - - u32 mem_map_handle; - /* - * Memory map handle returned by ADM_CMD_SHARED_MEM_MAP_REGIONS - * command. - * If mem_map_handle is zero implies the message is in - * the payload - */ - - u32 payload_size; - /* - * Size in bytes of the variable payload accompanying this - * message or - * in shared memory. This is used for parsing the parameter - * payload. - */ -} __packed; - -struct audproc_mfc_param_media_fmt { - uint32_t sampling_rate; - uint16_t bits_per_sample; - uint16_t num_channels; - uint16_t channel_type[8]; -} __packed; - -struct audproc_volume_ctrl_master_gain { - /* Linear gain in Q13 format. */ - uint16_t master_gain; - /* Clients must set this field to zero. */ - uint16_t reserved; -} __packed; - -struct audproc_soft_step_volume_params { -/* - * Period in milliseconds. - * Supported values: 0 to 15000 - */ - uint32_t period; -/* - * Step in microseconds. - * Supported values: 0 to 15000000 - */ - uint32_t step; -/* - * Ramping curve type. - * Supported values: - * - #AUDPROC_PARAM_SVC_RAMPINGCURVE_LINEAR - * - #AUDPROC_PARAM_SVC_RAMPINGCURVE_EXP - * - #AUDPROC_PARAM_SVC_RAMPINGCURVE_LOG - */ - uint32_t ramping_curve; -} __packed; - -struct audproc_enable_param_t { - /* - * Specifies whether the Audio processing module is enabled. - * This parameter is generic/common parameter to configure or - * determine the state of any audio processing module. - - * @values 0 : Disable 1: Enable - */ - uint32_t enable; -}; - -/* - * Allows a client to control the gains on various session-to-COPP paths. - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_V5 0x0001032C - -/* - * Allows a client to control the gains on various session-to-COPP paths. - * Maximum support 32 channels - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_V7 0x0001036C - -/* Indicates that the target gain in the - * current adm_session_copp_gain_v5 - * structure is to be applied to all - * the session-to-COPP paths that exist for - * the specified session. - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_COPP_ID_ALL_CONNECTED_COPPS 0xFFFF - -/* Indicates that the target gain is - * to be immediately applied to the - * specified session-to-COPP path, - * without a ramping fashion. - */ -#define ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE 0x0000 - -/* Enumeration for a linear ramping curve.*/ -#define ADM_CMD_MATRIX_RAMP_GAINS_RAMP_CURVE_LINEAR 0x0000 - -/* Payload of the #ADM_CMD_MATRIX_RAMP_GAINS_V5 command. - * Immediately following this structure are num_gains of the - * adm_session_copp_gain_v5structure. - */ -struct adm_cmd_matrix_ramp_gains_v5 { - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - - u16 num_gains; - /* Number of gains being applied. */ - - u16 reserved_for_align; - /* Reserved. This field must be set to zero.*/ -} __packed; - -/* Session-to-COPP path gain structure, used by the - * #ADM_CMD_MATRIX_RAMP_GAINS_V5 command. - * This structure specifies the target - * gain (per channel) that must be applied - * to a particular session-to-COPP path in - * the audio matrix. The structure can - * also be used to apply the gain globally - * to all session-to-COPP paths that - * exist for the given session. - * The aDSP uses device channel mapping to - * determine which channel gains to - * use from this command. For example, - * if the device is configured as stereo, - * the aDSP uses only target_gain_ch_1 and - * target_gain_ch_2, and it ignores - * the others. - */ -struct adm_session_copp_gain_v5 { - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to 8. - */ - - u16 copp_id; -/* Handle of the COPP. Gain will be applied on the Session ID - * COPP ID path. - */ - - u16 ramp_duration; -/* Duration (in milliseconds) of the ramp over - * which target gains are - * to be applied. Use - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE - * to indicate that gain must be applied immediately. - */ - - u16 step_duration; -/* Duration (in milliseconds) of each step in the ramp. - * This parameter is ignored if ramp_duration is equal to - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE. - * Supported value: 1 - */ - - u16 ramp_curve; -/* Type of ramping curve. - * Supported value: #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_CURVE_LINEAR - */ - - u16 reserved_for_align; - /* Reserved. This field must be set to zero. */ - - u16 target_gain_ch_1; - /* Target linear gain for channel 1 in Q13 format; */ - - u16 target_gain_ch_2; - /* Target linear gain for channel 2 in Q13 format; */ - - u16 target_gain_ch_3; - /* Target linear gain for channel 3 in Q13 format; */ - - u16 target_gain_ch_4; - /* Target linear gain for channel 4 in Q13 format; */ - - u16 target_gain_ch_5; - /* Target linear gain for channel 5 in Q13 format; */ - - u16 target_gain_ch_6; - /* Target linear gain for channel 6 in Q13 format; */ - - u16 target_gain_ch_7; - /* Target linear gain for channel 7 in Q13 format; */ - - u16 target_gain_ch_8; - /* Target linear gain for channel 8 in Q13 format; */ -} __packed; - -/* Payload of the #ADM_CMD_MATRIX_RAMP_GAINS_V7 command. - * Immediately following this structure are num_gains of the - * adm_session_copp_gain_v5structure. - */ -struct adm_cmd_matrix_ramp_gains_v7 { - struct apr_hdr hdr; - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. -*/ - - u16 num_gains; - /* Number of gains being applied. */ - - u16 reserved_for_align; - /* Reserved. This field must be set to zero.*/ -} __packed; - -/* Session-to-COPP path gain structure, used by the - * #ADM_CMD_MATRIX_RAMP_GAINS_V7 command. - * This structure specifies the target - * gain (per channel) that must be applied - * to a particular session-to-COPP path in - * the audio matrix. The structure can - * also be used to apply the gain globally - * to all session-to-COPP paths that - * exist for the given session. - * The aDSP uses device channel mapping to - * determine which channel gains to - * use from this command. For example, - * if the device is configured as stereo, - * the aDSP uses only target_gain_ch_1 and - * target_gain_ch_2, and it ignores - * the others. - */ -struct adm_session_copp_gain_v7 { - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to 8. - */ - - u16 copp_id; -/* Handle of the COPP. Gain will be applied on the Session ID - * COPP ID path. - */ - - u16 ramp_duration; -/* Duration (in milliseconds) of the ramp over - * which target gains are - * to be applied. Use - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE - * to indicate that gain must be applied immediately. - */ - - u16 step_duration; -/* Duration (in milliseconds) of each step in the ramp. - * This parameter is ignored if ramp_duration is equal to - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE. - * Supported value: 1 - */ - - u16 ramp_curve; -/* Type of ramping curve. - * Supported value: #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_CURVE_LINEAR - */ - - u16 stream_type; -/* Type of stream_type. - * Supported value: #STREAM_TYPE_ASM STREAM_TYPE_LSM - */ - u16 num_channels; -/* Number of channels on which gain needs to be applied. - * Supported value: 1 to 32. - */ - u16 reserved_for_align; - /* Reserved. This field must be set to zero. */ -} __packed; - -/* Allows to set mute/unmute on various session-to-COPP paths. - * For every session-to-COPP path (stream-device interconnection), - * mute/unmute can be set individually on the output channels. - */ -#define ADM_CMD_MATRIX_MUTE_V5 0x0001032D - -/* Allows to set mute/unmute on various session-to-COPP paths. - * For every session-to-COPP path (stream-device interconnection), - * mute/unmute can be set individually on the output channels. - */ -#define ADM_CMD_MATRIX_MUTE_V7 0x0001036D - -/* Indicates that mute/unmute in the - * current adm_session_copp_mute_v5structure - * is to be applied to all the session-to-COPP - * paths that exist for the specified session. - */ -#define ADM_CMD_MATRIX_MUTE_COPP_ID_ALL_CONNECTED_COPPS 0xFFFF - -/* Payload of the #ADM_CMD_MATRIX_MUTE_V5 command*/ -struct adm_cmd_matrix_mute_v5 { - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to 8. - */ - - u16 copp_id; -/* Handle of the COPP. - * Use ADM_CMD_MATRIX_MUTE_COPP_ID_ALL_CONNECTED_COPPS - * to indicate that mute/unmute must be applied to - * all the COPPs connected to session_id. - * Supported values: - * - 0xFFFF -- Apply mute/unmute to all connected COPPs - * - Other values -- Valid COPP ID - */ - - u8 mute_flag_ch_1; - /* Mute flag for channel 1 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_2; - /* Mute flag for channel 2 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_3; - /* Mute flag for channel 3 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_4; - /* Mute flag for channel 4 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_5; - /* Mute flag for channel 5 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_6; - /* Mute flag for channel 6 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_7; - /* Mute flag for channel 7 is set to unmute (0) or mute (1). */ - - u8 mute_flag_ch_8; - /* Mute flag for channel 8 is set to unmute (0) or mute (1). */ - - u16 ramp_duration; -/* Period (in milliseconds) over which the soft mute/unmute will be - * applied. - * Supported values: 0 (Default) to 0xFFFF - * The default of 0 means mute/unmute will be applied immediately. - */ - - u16 reserved_for_align; - /* Clients must set this field to zero.*/ -} __packed; - - -/* Payload of the #ADM_CMD_MATRIX_MUTE_V7 command*/ -struct adm_cmd_matrix_mute_v7 { - struct apr_hdr hdr; - u32 matrix_id; -/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1). - * Use the ADM_MATRIX_ID_AUDIO_RX or ADM_MATRIX_ID_AUDIOX - * macros to set this field. - */ - - u16 session_id; -/* Handle of the ASM session. - * Supported values: 1 to . - */ - - u16 copp_id; -/* Handle of the COPP. - * Use ADM_CMD_MATRIX_MUTE_COPP_ID_ALL_CONNECTED_COPPS - * to indicate that mute/unmute must be applied to - * all the COPPs connected to session_id. - * Supported values: - * - 0xFFFF -- Apply mute/unmute to all connected COPPs - * - Other values -- Valid COPP ID - */ - - u16 ramp_duration; -/* Duration (in milliseconds) of the ramp over - * which target gains are - * to be applied. Use - * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE - * to indicate that gain must be applied immediately. - */ - - u16 stream_type; -/* Specify whether the stream type is connectedon the ASM or LSM - * Supported value: 1 - */ - u16 num_channels; -/* Number of channels on which gain needs to be applied - * Supported value: 1 to 32 - */ -} __packed; - - -#define ASM_PARAM_ID_AAC_STEREO_MIX_COEFF_SELECTION_FLAG_V2 (0x00010DD8) - -struct asm_aac_stereo_mix_coeff_selection_param_v2 { - struct apr_hdr hdr; - u32 param_id; - u32 param_size; - u32 aac_stereo_mix_coeff_flag; -} __packed; - -/* Allows a client to connect the desired stream to - * the desired AFE port through the stream router - * - * This command allows the client to connect specified session to - * specified AFE port. This is used for compressed streams only - * opened using the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED or - * #ASM_STREAM_CMD_OPEN_READ_COMPRESSED command. - * - * @prerequisites - * Session ID and AFE Port ID must be valid. - * #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED or - * #ASM_STREAM_CMD_OPEN_READ_COMPRESSED - * must have been called on this session. - */ - -#define ADM_CMD_CONNECT_AFE_PORT_V5 0x0001032E -#define ADM_CMD_DISCONNECT_AFE_PORT_V5 0x0001032F -/* Enumeration for the Rx stream router ID.*/ -#define ADM_STRTR_ID_RX 0 -/* Enumeration for the Tx stream router ID.*/ -#define ADM_STRTR_IDX 1 - -/* Payload of the #ADM_CMD_CONNECT_AFE_PORT_V5 command.*/ -struct adm_cmd_connect_afe_port_v5 { - struct apr_hdr hdr; - u8 mode; -/* ID of the stream router (RX/TX). Use the - * ADM_STRTR_ID_RX or ADM_STRTR_IDX macros - * to set this field. - */ - - u8 session_id; - /* Session ID of the stream to connect */ - - u16 afe_port_id; - /* Port ID of the AFE port to connect to.*/ - u32 num_channels; -/* Number of device channels - * Supported values: 2(Audio Sample Packet), - * 8 (HBR Audio Stream Sample Packet) - */ - - u32 sampling_rate; -/* Device sampling rate - * Supported values: Any - */ -} __packed; - - -/* adsp_adm_api.h */ - - -/* Port ID. Update afe_get_port_index - * when a new port is added here. - */ -#define PRIMARY_I2S_RX 0 -#define PRIMARY_I2S_TX 1 -#define SECONDARY_I2S_RX 4 -#define SECONDARY_I2S_TX 5 -#define MI2S_RX 6 -#define MI2S_TX 7 -#define HDMI_RX 8 -#define RSVD_2 9 -#define RSVD_3 10 -#define DIGI_MIC_TX 11 -#define VOICE2_PLAYBACK_TX 0x8002 -#define VOICE_RECORD_RX 0x8003 -#define VOICE_RECORD_TX 0x8004 -#define VOICE_PLAYBACK_TX 0x8005 - -/* Slimbus Multi channel port id pool */ -#define SLIMBUS_0_RX 0x4000 -#define SLIMBUS_0_TX 0x4001 -#define SLIMBUS_1_RX 0x4002 -#define SLIMBUS_1_TX 0x4003 -#define SLIMBUS_2_RX 0x4004 -#define SLIMBUS_2_TX 0x4005 -#define SLIMBUS_3_RX 0x4006 -#define SLIMBUS_3_TX 0x4007 -#define SLIMBUS_4_RX 0x4008 -#define SLIMBUS_4_TX 0x4009 -#define SLIMBUS_5_RX 0x400a -#define SLIMBUS_5_TX 0x400b -#define SLIMBUS_6_RX 0x400c -#define SLIMBUS_6_TX 0x400d -#define SLIMBUS_7_RX 0x400e -#define SLIMBUS_7_TX 0x400f -#define SLIMBUS_8_RX 0x4010 -#define SLIMBUS_8_TX 0x4011 -#define SLIMBUS_9_RX 0x4012 -#define SLIMBUS_9_TX 0x4013 -#define SLIMBUS_PORT_LAST SLIMBUS_9_TX -#define INT_BT_SCO_RX 0x3000 -#define INT_BT_SCO_TX 0x3001 -#define INT_BT_A2DP_RX 0x3002 -#define INT_FM_RX 0x3004 -#define INT_FM_TX 0x3005 -#define RT_PROXY_PORT_001_RX 0x2000 -#define RT_PROXY_PORT_001_TX 0x2001 -#define DISPLAY_PORT_RX 0x6020 - -#define AFE_PORT_INVALID 0xFFFF -#define SLIMBUS_INVALID AFE_PORT_INVALID - -#define AFE_PORT_CMD_START 0x000100ca - -#define AFE_EVENT_RTPORT_START 0 -#define AFE_EVENT_RTPORT_STOP 1 -#define AFE_EVENT_RTPORT_LOW_WM 2 -#define AFE_EVENT_RTPORT_HI_WM 3 - -#define ADSP_AFE_VERSION 0x00200000 - -/* Size of the range of port IDs for the audio interface. */ -#define AFE_PORT_ID_AUDIO_IF_PORT_RANGE_SIZE 0xF - -/* Size of the range of port IDs for internal BT-FM ports. */ -#define AFE_PORT_ID_INTERNAL_BT_FM_RANGE_SIZE 0x6 - -/* Size of the range of port IDs for SLIMbus® - * multichannel - * ports. - */ -#define AFE_PORT_ID_SLIMBUS_RANGE_SIZE 0xA - -/* Size of the range of port IDs for real-time proxy ports. */ -#define AFE_PORT_ID_RT_PROXY_PORT_RANGE_SIZE 0x4 - -/* Size of the range of port IDs for pseudoports. */ -#define AFE_PORT_ID_PSEUDOPORT_RANGE_SIZE 0x5 - -/* Start of the range of port IDs for the audio interface. */ -#define AFE_PORT_ID_AUDIO_IF_PORT_RANGE_START 0x1000 - -/* End of the range of port IDs for the audio interface. */ -#define AFE_PORT_ID_AUDIO_IF_PORT_RANGE_END \ - (AFE_PORT_ID_AUDIO_IF_PORT_RANGE_START +\ - AFE_PORT_ID_AUDIO_IF_PORT_RANGE_SIZE - 1) - -/* Start of the range of port IDs for real-time proxy ports. */ -#define AFE_PORT_ID_RT_PROXY_PORT_RANGE_START 0x2000 - -/* End of the range of port IDs for real-time proxy ports. */ -#define AFE_PORT_ID_RT_PROXY_PORT_RANGE_END \ - (AFE_PORT_ID_RT_PROXY_PORT_RANGE_START +\ - AFE_PORT_ID_RT_PROXY_PORT_RANGE_SIZE-1) - -/* Start of the range of port IDs for internal BT-FM devices. */ -#define AFE_PORT_ID_INTERNAL_BT_FM_RANGE_START 0x3000 - -/* End of the range of port IDs for internal BT-FM devices. */ -#define AFE_PORT_ID_INTERNAL_BT_FM_RANGE_END \ - (AFE_PORT_ID_INTERNAL_BT_FM_RANGE_START +\ - AFE_PORT_ID_INTERNAL_BT_FM_RANGE_SIZE-1) - -/* Start of the range of port IDs for SLIMbus devices. */ -#define AFE_PORT_ID_SLIMBUS_RANGE_START 0x4000 - -/* End of the range of port IDs for SLIMbus devices. */ -#define AFE_PORT_ID_SLIMBUS_RANGE_END \ - (AFE_PORT_ID_SLIMBUS_RANGE_START +\ - AFE_PORT_ID_SLIMBUS_RANGE_SIZE-1) - -/* Start of the range of port IDs for pseudoports. */ -#define AFE_PORT_ID_PSEUDOPORT_RANGE_START 0x8001 - -/* End of the range of port IDs for pseudoports. */ -#define AFE_PORT_ID_PSEUDOPORT_RANGE_END \ - (AFE_PORT_ID_PSEUDOPORT_RANGE_START +\ - AFE_PORT_ID_PSEUDOPORT_RANGE_SIZE-1) - -/* Start of the range of port IDs for TDM devices. */ -#define AFE_PORT_ID_TDM_PORT_RANGE_START 0x9000 - -/* End of the range of port IDs for TDM devices. */ -#define AFE_PORT_ID_TDM_PORT_RANGE_END \ - (AFE_PORT_ID_TDM_PORT_RANGE_START+0x50-1) - -/* Size of the range of port IDs for TDM ports. */ -#define AFE_PORT_ID_TDM_PORT_RANGE_SIZE \ - (AFE_PORT_ID_TDM_PORT_RANGE_END - \ - AFE_PORT_ID_TDM_PORT_RANGE_START+1) - -#define AFE_PORT_ID_PRIMARY_MI2S_RX 0x1000 -#define AFE_PORT_ID_PRIMARY_MI2S_TX 0x1001 -#define AFE_PORT_ID_SECONDARY_MI2S_RX 0x1002 -#define AFE_PORT_ID_SECONDARY_MI2S_TX 0x1003 -#define AFE_PORT_ID_TERTIARY_MI2S_RX 0x1004 -#define AFE_PORT_ID_TERTIARY_MI2S_TX 0x1005 -#define AFE_PORT_ID_QUATERNARY_MI2S_RX 0x1006 -#define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007 -#define AUDIO_PORT_ID_I2S_RX 0x1008 -#define AFE_PORT_ID_DIGITAL_MIC_TX 0x1009 -#define AFE_PORT_ID_PRIMARY_PCM_RX 0x100A -#define AFE_PORT_ID_PRIMARY_PCM_TX 0x100B -#define AFE_PORT_ID_SECONDARY_PCM_RX 0x100C -#define AFE_PORT_ID_SECONDARY_PCM_TX 0x100D -#define AFE_PORT_ID_MULTICHAN_HDMI_RX 0x100E -#define AFE_PORT_ID_SECONDARY_MI2S_RX_SD1 0x1010 -#define AFE_PORT_ID_TERTIARY_PCM_RX 0x1012 -#define AFE_PORT_ID_TERTIARY_PCM_TX 0x1013 -#define AFE_PORT_ID_QUATERNARY_PCM_RX 0x1014 -#define AFE_PORT_ID_QUATERNARY_PCM_TX 0x1015 -#define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016 -#define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017 -/* ID of the senary MI2S Rx port. */ -#define AFE_PORT_ID_SENARY_MI2S_RX 0x1018 -/* ID of the senary MI2S Tx port. */ -#define AFE_PORT_ID_SENARY_MI2S_TX 0x1019 - -/* ID of the Internal 0 MI2S Rx port */ -#define AFE_PORT_ID_INT0_MI2S_RX 0x102E -/* ID of the Internal 0 MI2S Tx port */ -#define AFE_PORT_ID_INT0_MI2S_TX 0x102F -/* ID of the Internal 1 MI2S Rx port */ -#define AFE_PORT_ID_INT1_MI2S_RX 0x1030 -/* ID of the Internal 1 MI2S Tx port */ -#define AFE_PORT_ID_INT1_MI2S_TX 0x1031 -/* ID of the Internal 2 MI2S Rx port */ -#define AFE_PORT_ID_INT2_MI2S_RX 0x1032 -/* ID of the Internal 2 MI2S Tx port */ -#define AFE_PORT_ID_INT2_MI2S_TX 0x1033 -/* ID of the Internal 3 MI2S Rx port */ -#define AFE_PORT_ID_INT3_MI2S_RX 0x1034 -/* ID of the Internal 3 MI2S Tx port */ -#define AFE_PORT_ID_INT3_MI2S_TX 0x1035 -/* ID of the Internal 4 MI2S Rx port */ -#define AFE_PORT_ID_INT4_MI2S_RX 0x1036 -/* ID of the Internal 4 MI2S Tx port */ -#define AFE_PORT_ID_INT4_MI2S_TX 0x1037 -/* ID of the Internal 5 MI2S Rx port */ -#define AFE_PORT_ID_INT5_MI2S_RX 0x1038 -/* ID of the Internal 5 MI2S Tx port */ -#define AFE_PORT_ID_INT5_MI2S_TX 0x1039 -/* ID of the Internal 6 MI2S Rx port */ -#define AFE_PORT_ID_INT6_MI2S_RX 0x103A -/* ID of the Internal 6 MI2S Tx port */ -#define AFE_PORT_ID_INT6_MI2S_TX 0x103B - -#define AFE_PORT_ID_QUINARY_PCM_RX 0x103C -#define AFE_PORT_ID_QUINARY_PCM_TX 0x103D - -/* ID of the senary auxiliary PCM Rx port. */ -#define AFE_PORT_ID_SENARY_PCM_RX 0x103E -/* ID of the senary auxiliary PCM Tx port. */ -#define AFE_PORT_ID_SENARY_PCM_TX 0x103F - -#define AFE_PORT_ID_PRIMARY_SPDIF_RX 0x5000 -#define AFE_PORT_ID_PRIMARY_SPDIF_TX 0x5001 -#define AFE_PORT_ID_SECONDARY_SPDIF_RX 0x5002 -#define AFE_PORT_ID_SECONDARY_SPDIF_TX 0x5003 -#define AFE_PORT_ID_SPDIF_RX AFE_PORT_ID_PRIMARY_SPDIF_RX - -#define AFE_PORT_ID_RT_PROXY_PORT_001_RX 0x2000 -#define AFE_PORT_ID_RT_PROXY_PORT_001_TX 0x2001 -#define AFE_PORT_ID_INTERNAL_BT_SCO_RX 0x3000 -#define AFE_PORT_ID_INTERNAL_BT_SCO_TX 0x3001 -#define AFE_PORT_ID_INTERNAL_BT_A2DP_RX 0x3002 -#define AFE_PORT_ID_INTERNAL_FM_RX 0x3004 -#define AFE_PORT_ID_INTERNAL_FM_TX 0x3005 -/* SLIMbus Rx port on channel 0. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX 0x4000 -/* SLIMbus Tx port on channel 0. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX 0x4001 -/* SLIMbus Rx port on channel 1. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX 0x4002 -/* SLIMbus Tx port on channel 1. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX 0x4003 -/* SLIMbus Rx port on channel 2. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX 0x4004 -/* SLIMbus Tx port on channel 2. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX 0x4005 -/* SLIMbus Rx port on channel 3. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX 0x4006 -/* SLIMbus Tx port on channel 3. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX 0x4007 -/* SLIMbus Rx port on channel 4. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX 0x4008 -/* SLIMbus Tx port on channel 4. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX 0x4009 -/* SLIMbus Rx port on channel 5. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX 0x400a -/* SLIMbus Tx port on channel 5. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX 0x400b -/* SLIMbus Rx port on channel 6. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX 0x400c -/* SLIMbus Tx port on channel 6. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX 0x400d -/* SLIMbus Rx port on channel 7. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_RX 0x400e -/* SLIMbus Tx port on channel 7. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_TX 0x400f -/* SLIMbus Rx port on channel 8. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_RX 0x4010 -/* SLIMbus Tx port on channel 8. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_TX 0x4011 -/* SLIMbus Rx port on channel 9. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_RX 0x4012 -/* SLIMbus Tx port on channel 9. */ -#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_TX 0x4013 -/* AFE Rx port for audio over Display port */ -#define AFE_PORT_ID_HDMI_OVER_DP_RX 0x6020 -/*USB AFE port */ -#define AFE_PORT_ID_USB_RX 0x7000 -#define AFE_PORT_ID_USB_TX 0x7001 - -/* AFE WSA Codec DMA Rx port 0 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_RX_0 0xB000 - -/* AFE WSA Codec DMA Tx port 0 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_TX_0 0xB001 - -/* AFE WSA Codec DMA Rx port 1 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_RX_1 0xB002 - -/* AFE WSA Codec DMA Tx port 1 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_TX_1 0xB003 - -/* AFE WSA Codec DMA Tx port 2 */ -#define AFE_PORT_ID_WSA_CODEC_DMA_TX_2 0xB005 - -/* AFE VA Codec DMA Tx port 0 */ -#define AFE_PORT_ID_VA_CODEC_DMA_TX_0 0xB021 - -/* AFE VA Codec DMA Tx port 1 */ -#define AFE_PORT_ID_VA_CODEC_DMA_TX_1 0xB023 - -/* AFE Rx Codec DMA Rx port 0 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_0 0xB030 - -/* AFE Tx Codec DMA Tx port 0 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_0 0xB031 - -/* AFE Rx Codec DMA Rx port 1 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_1 0xB032 - -/* AFE Tx Codec DMA Tx port 1 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_1 0xB033 - -/* AFE Rx Codec DMA Rx port 2 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_2 0xB034 - -/* AFE Tx Codec DMA Tx port 2 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_2 0xB035 - -/* AFE Rx Codec DMA Rx port 3 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_3 0xB036 - -/* AFE Tx Codec DMA Tx port 3 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_3 0xB037 - -/* AFE Rx Codec DMA Rx port 4 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_4 0xB038 - -/* AFE Tx Codec DMA Tx port 4 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_4 0xB039 - -/* AFE Rx Codec DMA Rx port 5 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_5 0xB03A - -/* AFE Tx Codec DMA Tx port 5 */ -#define AFE_PORT_ID_TX_CODEC_DMA_TX_5 0xB03B - -/* AFE Rx Codec DMA Rx port 6 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_6 0xB03C - -/* AFE Rx Codec DMA Rx port 7 */ -#define AFE_PORT_ID_RX_CODEC_DMA_RX_7 0xB03E - -/* Generic pseudoport 1. */ -#define AFE_PORT_ID_PSEUDOPORT_01 0x8001 -/* Generic pseudoport 2. */ -#define AFE_PORT_ID_PSEUDOPORT_02 0x8002 - -/* @xreflabel{hdr:AfePortIdPrimaryAuxPcmTx} - * Primary Aux PCM Tx port ID. - */ -#define AFE_PORT_ID_PRIMARY_PCM_TX 0x100B -/* Pseudoport that corresponds to the voice Rx path. - * For recording, the voice Rx path samples are written to this - * port and consumed by the audio path. - */ - -#define AFE_PORT_ID_VOICE_RECORD_RX 0x8003 - -/* Pseudoport that corresponds to the voice Tx path. - * For recording, the voice Tx path samples are written to this - * port and consumed by the audio path. - */ - -#define AFE_PORT_ID_VOICE_RECORD_TX 0x8004 -/* Pseudoport that corresponds to in-call voice delivery samples. - * During in-call audio delivery, the audio path delivers samples - * to this port from where the voice path delivers them on the - * Rx path. - */ -#define AFE_PORT_ID_VOICE2_PLAYBACK_TX 0x8002 -#define AFE_PORT_ID_VOICE_PLAYBACK_TX 0x8005 - -/* - * Proxyport used for voice call data processing. - * In cases like call-screening feature, where user can communicate - * with caller with the help of "call screen" mode, and without - * connecting the call with any HW input/output devices in the phon, - * voice call can use Pseudo port to start voice data processing. - */ -#define RT_PROXY_PORT_002_TX 0x2003 -#define RT_PROXY_PORT_002_RX 0x2002 - -#define AFE_PORT_ID_PRIMARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x00) -#define AFE_PORT_ID_PRIMARY_TDM_RX_1 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x02) -#define AFE_PORT_ID_PRIMARY_TDM_RX_2 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x04) -#define AFE_PORT_ID_PRIMARY_TDM_RX_3 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x06) -#define AFE_PORT_ID_PRIMARY_TDM_RX_4 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x08) -#define AFE_PORT_ID_PRIMARY_TDM_RX_5 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_PRIMARY_TDM_RX_6 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_PRIMARY_TDM_RX_7 \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_PRIMARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x01) -#define AFE_PORT_ID_PRIMARY_TDM_TX_1 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x02) -#define AFE_PORT_ID_PRIMARY_TDM_TX_2 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x04) -#define AFE_PORT_ID_PRIMARY_TDM_TX_3 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x06) -#define AFE_PORT_ID_PRIMARY_TDM_TX_4 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x08) -#define AFE_PORT_ID_PRIMARY_TDM_TX_5 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_PRIMARY_TDM_TX_6 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_PRIMARY_TDM_TX_7 \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_SECONDARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x10) -#define AFE_PORT_ID_SECONDARY_TDM_RX_1 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x02) -#define AFE_PORT_ID_SECONDARY_TDM_RX_2 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x04) -#define AFE_PORT_ID_SECONDARY_TDM_RX_3 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x06) -#define AFE_PORT_ID_SECONDARY_TDM_RX_4 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x08) -#define AFE_PORT_ID_SECONDARY_TDM_RX_5 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_SECONDARY_TDM_RX_6 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_SECONDARY_TDM_RX_7 \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_SECONDARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x11) -#define AFE_PORT_ID_SECONDARY_TDM_TX_1 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x02) -#define AFE_PORT_ID_SECONDARY_TDM_TX_2 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x04) -#define AFE_PORT_ID_SECONDARY_TDM_TX_3 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x06) -#define AFE_PORT_ID_SECONDARY_TDM_TX_4 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x08) -#define AFE_PORT_ID_SECONDARY_TDM_TX_5 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_SECONDARY_TDM_TX_6 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_SECONDARY_TDM_TX_7 \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_TERTIARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x20) -#define AFE_PORT_ID_TERTIARY_TDM_RX_1 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x02) -#define AFE_PORT_ID_TERTIARY_TDM_RX_2 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x04) -#define AFE_PORT_ID_TERTIARY_TDM_RX_3 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x06) -#define AFE_PORT_ID_TERTIARY_TDM_RX_4 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x08) -#define AFE_PORT_ID_TERTIARY_TDM_RX_5 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_TERTIARY_TDM_RX_6 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_TERTIARY_TDM_RX_7 \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_TERTIARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x21) -#define AFE_PORT_ID_TERTIARY_TDM_TX_1 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x02) -#define AFE_PORT_ID_TERTIARY_TDM_TX_2 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x04) -#define AFE_PORT_ID_TERTIARY_TDM_TX_3 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x06) -#define AFE_PORT_ID_TERTIARY_TDM_TX_4 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x08) -#define AFE_PORT_ID_TERTIARY_TDM_TX_5 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_TERTIARY_TDM_TX_6 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_TERTIARY_TDM_TX_7 \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_QUATERNARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x30) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_1 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x02) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_2 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x04) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_3 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x06) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_4 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x08) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_5 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_6 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_QUATERNARY_TDM_RX_7 \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_QUATERNARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x31) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_1 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x02) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_2 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x04) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_3 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x06) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_4 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x08) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_5 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_6 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_QUATERNARY_TDM_TX_7 \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_QUINARY_TDM_RX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x40) -#define AFE_PORT_ID_QUINARY_TDM_RX_1 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x02) -#define AFE_PORT_ID_QUINARY_TDM_RX_2 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x04) -#define AFE_PORT_ID_QUINARY_TDM_RX_3 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x06) -#define AFE_PORT_ID_QUINARY_TDM_RX_4 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x08) -#define AFE_PORT_ID_QUINARY_TDM_RX_5 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x0A) -#define AFE_PORT_ID_QUINARY_TDM_RX_6 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x0C) -#define AFE_PORT_ID_QUINARY_TDM_RX_7 \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x0E) - -#define AFE_PORT_ID_QUINARY_TDM_TX \ - (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x41) -#define AFE_PORT_ID_QUINARY_TDM_TX_1 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x02) -#define AFE_PORT_ID_QUINARY_TDM_TX_2 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x04) -#define AFE_PORT_ID_QUINARY_TDM_TX_3 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x06) -#define AFE_PORT_ID_QUINARY_TDM_TX_4 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x08) -#define AFE_PORT_ID_QUINARY_TDM_TX_5 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x0A) -#define AFE_PORT_ID_QUINARY_TDM_TX_6 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x0C) -#define AFE_PORT_ID_QUINARY_TDM_TX_7 \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x0E) - -#define AFE_PORT_ID_INVALID 0xFFFF - -#define AAC_ENC_MODE_AAC_LC 0x02 -#define AAC_ENC_MODE_AAC_P 0x05 -#define AAC_ENC_MODE_EAAC_P 0x1D - -#define AFE_PSEUDOPORT_CMD_START 0x000100cf -struct afe_pseudoport_start_command { - struct apr_hdr hdr; - u16 port_id; /* Pseudo Port 1 = 0x8000 */ - /* Pseudo Port 2 = 0x8001 */ - /* Pseudo Port 3 = 0x8002 */ - u16 timing; /* FTRT = 0 , AVTimer = 1, */ -} __packed; - -#define AFE_PSEUDOPORT_CMD_STOP 0x000100d0 -struct afe_pseudoport_stop_command { - struct apr_hdr hdr; - u16 port_id; /* Pseudo Port 1 = 0x8000 */ - /* Pseudo Port 2 = 0x8001 */ - /* Pseudo Port 3 = 0x8002 */ - u16 reserved; -} __packed; - - -#define AFE_MODULE_SIDETONE_IIR_FILTER 0x00010202 -#define AFE_PARAM_ID_ENABLE 0x00010203 - -/* Payload of the #AFE_PARAM_ID_ENABLE - * parameter, which enables or - * disables any module. - * The fixed size of this structure is four bytes. - */ - -struct afe_mod_enable_param { - u16 enable; - /* Enables (1) or disables (0) the module. */ - - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -/* ID of the configuration parameter used by the - * #AFE_MODULE_SIDETONE_IIR_FILTER module. - */ -#define AFE_PARAM_ID_SIDETONE_IIR_FILTER_CONFIG 0x00010204 -#define MAX_SIDETONE_IIR_DATA_SIZE 224 -#define MAX_NO_IIR_FILTER_STAGE 10 - -struct afe_sidetone_iir_filter_config_params { - u16 num_biquad_stages; -/* Number of stages. - * Supported values: Minimum of 5 and maximum of 10 - */ - - u16 pregain; -/* Pregain for the compensating filter response. - * Supported values: Any number in Q13 format - */ - uint8_t iir_config[MAX_SIDETONE_IIR_DATA_SIZE]; -} __packed; - -#define AFE_MODULE_LOOPBACK 0x00010205 -#define AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH 0x00010206 - -/* Used by RTAC */ -struct afe_rtac_user_data_set_v2 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* Actual size of the payload in bytes. - * This is used for parsing the parameter payload. - * Supported values: > 0 - */ - u16 payload_size; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter header for the parameter data to set */ - struct param_hdr_v1 param_hdr; - - /* The parameter data to be filled when sent inband */ - u32 *param_data; -} __packed; - -struct afe_rtac_user_data_set_v3 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - /* Reserved for future enhancements. Must be 0. */ - u16 reserved; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The size of the parameter header and parameter data */ - u32 payload_size; - - /* The parameter header for the parameter data to set */ - struct param_hdr_v3 param_hdr; - - /* The parameter data to be filled when sent inband */ - u32 *param_data; -} __packed; - -struct afe_rtac_user_data_get_v2 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* Actual size of the payload in bytes. - * This is used for parsing the parameter payload. - * Supported values: > 0 - */ - u16 payload_size; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The module ID of the parameter to get */ - u32 module_id; - - /* The parameter ID of the parameter to get */ - u32 param_id; - - /* The parameter data to be filled when sent inband */ - struct param_hdr_v1 param_hdr; -} __packed; - -struct afe_rtac_user_data_get_v3 { - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - /* Reserved for future enhancements. Must be 0. */ - u16 reserved; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter data to be filled when sent inband */ - struct param_hdr_v3 param_hdr; -} __packed; - -#define AFE_PORT_CMD_SET_PARAM_V2 0x000100EF -struct afe_port_cmd_set_param_v2 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* - * Actual size of the payload in bytes. - * This is used for parsing the parameter payload. - * Supported values: > 0 - */ - u16 payload_size; - - /* The header detailing the memory mapping for out of band. */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter data to be filled when sent inband */ - u8 param_data[0]; -} __packed; - -#define AFE_PORT_CMD_SET_PARAM_V3 0x000100FA -struct afe_port_cmd_set_param_v3 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* Port ID of the AFE port to configure. Port interface and direction - * (Rx or Tx) to configure. An even number represents the Rx direction, - * and an odd number represents the Tx direction. - */ - u16 port_id; - - /* Reserved. This field must be set to zero. */ - u16 reserved; - - /* The memory mapping header to be used when sending outband */ - struct mem_mapping_hdr mem_hdr; - - /* The total size of the payload, including param_hdr_v3 */ - u32 payload_size; - - /* - * The parameter data to be filled when sent inband. - * Must include param_hdr packed correctly. - */ - u8 param_data[0]; -} __packed; - -/* Payload of the #AFE_PARAM_ID_LOOPBACK_GAIN_PER_PATH parameter, - * which gets/sets loopback gain of a port to an Rx port. - * The Tx port ID of the loopback is part of the set_param command. - */ - -struct afe_loopback_gain_per_path_param { - u16 rx_port_id; -/* Rx port of the loopback. */ - -u16 gain; -/* Loopback gain per path of the port. - * Supported values: Any number in Q13 format - */ -} __packed; - -/* Parameter ID used to configure and enable/disable the - * loopback path. The difference with respect to the existing - * API, AFE_PORT_CMD_LOOPBACK, is that it allows Rx port to be - * configured as source port in loopback path. Port-id in - * AFE_PORT_CMD_SET_PARAM cmd is the source port which can be - * Tx or Rx port. In addition, we can configure the type of - * routing mode to handle different use cases. - */ -#define AFE_PARAM_ID_LOOPBACK_CONFIG 0x0001020B -#define AFE_API_VERSION_LOOPBACK_CONFIG 0x1 - -enum afe_loopback_routing_mode { - LB_MODE_DEFAULT = 1, - /* Regular loopback from source to destination port */ - LB_MODE_SIDETONE, - /* Sidetone feed from Tx source to Rx destination port */ - LB_MODE_EC_REF_VOICE_AUDIO, - /* Echo canceller reference, voice + audio + DTMF */ - LB_MODE_EC_REF_VOICE - /* Echo canceller reference, voice alone */ -} __packed; - -/* Payload of the #AFE_PARAM_ID_LOOPBACK_CONFIG , - * which enables/disables one AFE loopback. - */ -struct afe_loopback_cfg_v1 { - u32 loopback_cfg_minor_version; -/* Minor version used for tracking the version of the RMC module - * configuration interface. - * Supported values: #AFE_API_VERSION_LOOPBACK_CONFIG - */ - u16 dst_port_id; - /* Destination Port Id. */ - u16 routing_mode; -/* Specifies data path type from src to dest port. - * Supported values: - * #LB_MODE_DEFAULT - * #LB_MODE_SIDETONE - * #LB_MODE_EC_REF_VOICE_AUDIO - * #LB_MODE_EC_REF_VOICE_A - * #LB_MODE_EC_REF_VOICE - */ - - u16 enable; -/* Specifies whether to enable (1) or - * disable (0) an AFE loopback. - */ - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0. - */ - -} __packed; - -struct afe_loopback_sidetone_gain { - u16 rx_port_id; - u16 gain; -} __packed; - -struct afe_display_stream_idx { - u32 minor_version; - u32 stream_idx; -} __packed; - -struct afe_display_ctl_idx { - u32 minor_version; - u32 ctl_idx; -} __packed; - -struct loopback_cfg_data { - u32 loopback_cfg_minor_version; -/* Minor version used for tracking the version of the RMC module - * configuration interface. - * Supported values: #AFE_API_VERSION_LOOPBACK_CONFIG - */ - u16 dst_port_id; - /* Destination Port Id. */ - u16 routing_mode; -/* Specifies data path type from src to dest port. - * Supported values: - * #LB_MODE_DEFAULT - * #LB_MODE_SIDETONE - * #LB_MODE_EC_REF_VOICE_AUDIO - * #LB_MODE_EC_REF_VOICE_A - * #LB_MODE_EC_REF_VOICE - */ - - u16 enable; -/* Specifies whether to enable (1) or - * disable (0) an AFE loopback. - */ - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0. - */ -} __packed; - -struct afe_st_loopback_cfg_v1 { - struct apr_hdr hdr; - struct mem_mapping_hdr mem_hdr; - struct param_hdr_v1 gain_pdata; - struct afe_loopback_sidetone_gain gain_data; - struct param_hdr_v1 cfg_pdata; - struct loopback_cfg_data cfg_data; -} __packed; - -struct afe_loopback_iir_cfg_v2 { - struct apr_hdr hdr; - struct mem_mapping_hdr param; - struct param_hdr_v1 st_iir_enable_pdata; - struct afe_mod_enable_param st_iir_mode_enable_data; - struct param_hdr_v1 st_iir_filter_config_pdata; - struct afe_sidetone_iir_filter_config_params st_iir_filter_config_data; -} __packed; - - -/* - * Param ID and related structures for AFE event - * registration. - */ -#define AFE_PORT_CMD_MOD_EVENT_CFG 0x000100FD - -struct afe_port_cmd_event_cfg { - struct apr_hdr hdr; - uint32_t version; - /* Version number. The current version is 0 */ - - uint32_t port_id; - /* - * Port ID for the AFE port hosting the modules - * being registered for the events - */ - - uint32_t num_events; - /* - * Number of events to be registered with the service - * Each event has the structure of - * afe_port_cmd_mod_evt_cfg_payload. - */ - uint8_t payload[0]; -}; - -/** Event registration for a module. */ -#define AFE_MODULE_REGISTER_EVENT_FLAG 1 - -/** Event de-registration for a module. */ -#define AFE_MODULE_DEREGISTER_EVENT_FLAG 0 - -struct afe_port_cmd_mod_evt_cfg_payload { - uint32_t module_id; - /* Valid ID of the module. */ - - uint16_t instance_id; - /* - * Valid ID of the module instance in the current topology. - * If both module_id and instance_id ID are set to 0, the event is - * registered with all modules and instances in the topology. - * If module_id is set to 0 and instance_id is set to a non-zero value, - * the payload is considered to be invalid. - */ - - uint16_t reserved; - /* Used for alignment; must be set to 0.*/ - - uint32_t event_id; - /* Unique ID of the event. */ - - uint32_t reg_flag; - /* - * Bit field for enabling or disabling event registration. - * values - * - #AFE_MODULE_REGISTER_EVENT_FLAG - * - #AFE_MODULE_DEREGISTER_EVENT_FLAG - */ -} __packed; - - -#define AFE_PORT_MOD_EVENT 0x0001010C - -struct afe_port_mod_evt_rsp_hdr { - uint32_t minor_version; - /* This indicates the minor version of the payload */ - - uint32_t port_id; - /* AFE port hosting this module */ - - uint32_t module_id; - /* Module ID which is raising the event */ - - uint16_t instance_id; - /* Instance ID of the module which is raising the event */ - - uint16_t reserved; - /* For alignment purpose, should be set to 0 */ - - uint32_t event_id; - /* Valid event ID registered by client */ - - uint32_t payload_size; - /* - * Size of the event payload - * This is followed by actual payload corresponding to the event - */ -} __packed; - -#define AFE_PORT_SP_DC_DETECTION_EVENT 0x0001010D - -#define AFE_MODULE_SPEAKER_PROTECTION 0x00010209 -#define AFE_PARAM_ID_SPKR_PROT_CONFIG 0x0001020a -#define AFE_API_VERSION_SPKR_PROT_CONFIG 0x1 -#define AFE_SPKR_PROT_EXCURSIONF_LEN 512 -struct afe_spkr_prot_cfg_param_v1 { - u32 spkr_prot_minor_version; -/* - * Minor version used for tracking the version of the - * speaker protection module configuration interface. - * Supported values: #AFE_API_VERSION_SPKR_PROT_CONFIG - */ - -int16_t win_size; -/* Analysis and synthesis window size (nWinSize). - * Supported values: 1024, 512, 256 samples - */ - -int16_t margin; -/* Allowable margin for excursion prediction, - * in L16Q15 format. This is a - * control parameter to allow - * for overestimation of peak excursion. - */ - -int16_t spkr_exc_limit; -/* Speaker excursion limit, in L16Q15 format.*/ - -int16_t spkr_resonance_freq; -/* Resonance frequency of the speaker; used - * to define a frequency range - * for signal modification. - * - * Supported values: 0 to 2000 Hz - */ - -int16_t limhresh; -/* Threshold of the hard limiter; used to - * prevent overshooting beyond a - * signal level that was set by the limiter - * prior to speaker protection. - * Supported values: 0 to 32767 - */ - -int16_t hpf_cut_off_freq; -/* High pass filter cutoff frequency. - * Supported values: 100, 200, 300 Hz - */ - -int16_t hpf_enable; -/* Specifies whether the high pass filter - * is enabled (0) or disabled (1). - */ - -int16_t reserved; -/* This field must be set to zero. */ - -int32_t amp_gain; -/* Amplifier gain in L32Q15 format. - * This is the RMS voltage at the - * loudspeaker when a 0dBFS tone - * is played in the digital domain. - */ - -int16_t excursionf[AFE_SPKR_PROT_EXCURSIONF_LEN]; -/* Array of the excursion transfer function. - * The peak excursion of the - * loudspeaker diaphragm is - * measured in millimeters for 1 Vrms Sine - * tone at all FFT bin frequencies. - * Supported values: Q15 format - */ -} __packed; - - -#define AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER 0x000100E0 - -/* Payload of the #AFE_SERVICE_CMD_REGISTER_RT_PORT_DRIVER - * command, which registers a real-time port driver - * with the AFE service. - */ -struct afe_service_cmd_register_rt_port_driver { - struct apr_hdr hdr; - u16 port_id; -/* Port ID with which the real-time driver exchanges data - * (registers for events). - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -#define AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER 0x000100E1 - -/* Payload of the #AFE_SERVICE_CMD_UNREGISTER_RT_PORT_DRIVER - * command, which unregisters a real-time port driver from - * the AFE service. - */ -struct afe_service_cmd_unregister_rt_port_driver { - struct apr_hdr hdr; - u16 port_id; -/* Port ID from which the real-time - * driver unregisters for events. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -#define AFE_EVENT_RT_PROXY_PORT_STATUS 0x00010105 -#define AFE_EVENTYPE_RT_PROXY_PORT_START 0 -#define AFE_EVENTYPE_RT_PROXY_PORT_STOP 1 -#define AFE_EVENTYPE_RT_PROXY_PORT_LOW_WATER_MARK 2 -#define AFE_EVENTYPE_RT_PROXY_PORT_HIGH_WATER_MARK 3 -#define AFE_EVENTYPE_RT_PROXY_PORT_INVALID 0xFFFF - -/* Payload of the #AFE_EVENT_RT_PROXY_PORT_STATUS - * message, which sends an event from the AFE service - * to a registered client. - */ -struct afe_event_rt_proxy_port_status { - u16 port_id; -/* Port ID to which the event is sent. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 eventype; -/* Type of event. - * Supported values: - * - #AFE_EVENTYPE_RT_PROXY_PORT_START - * - #AFE_EVENTYPE_RT_PROXY_PORT_STOP - * - #AFE_EVENTYPE_RT_PROXY_PORT_LOW_WATER_MARK - * - #AFE_EVENTYPE_RT_PROXY_PORT_HIGH_WATER_MARK - */ -} __packed; - -#define AFE_PORT_DATA_CMD_RT_PROXY_PORT_WRITE_V2 0x000100ED - -struct afe_port_data_cmd_rt_proxy_port_write_v2 { - struct apr_hdr hdr; - u16 port_id; -/* Tx (mic) proxy port ID with which the real-time - * driver exchanges data. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - */ - - u16 reserved; - /* This field must be set to zero. */ - - u32 buffer_address_lsw; -/* LSW Address of the buffer containing the - * data from the real-time source - * device on a client. - */ - - u32 buffer_address_msw; -/* MSW Address of the buffer containing the - * data from the real-time source - * device on a client. - */ - - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory - * attributes is returned if - * AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS - * command is successful. - * Supported Values: - * - Any 32 bit value - */ - - u32 available_bytes; -/* Number of valid bytes available - * in the buffer (including all - * channels: number of bytes per - * channel = availableBytesumChannels). - * Supported values: > 0 - * - * This field must be equal to the frame - * size specified in the #AFE_PORT_AUDIO_IF_CONFIG - * command that was sent to configure this - * port. - */ -} __packed; - -#define AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2 0x000100EE - -/* Payload of the - * #AFE_PORT_DATA_CMD_RT_PROXY_PORT_READ_V2 command, which - * delivers an empty buffer to the AFE service. On - * acknowledgment, data is filled in the buffer. - */ -struct afe_port_data_cmd_rt_proxy_port_read_v2 { - struct apr_hdr hdr; - u16 port_id; -/* Rx proxy port ID with which the real-time - * driver exchanges data. - * Supported values: #AFE_PORT_ID_RT_PROXY_PORT_RANGE_START to - * #AFE_PORT_ID_RT_PROXY_PORT_RANGE_END - * (This must be an Rx (speaker) port.) - */ - - u16 reserved; - /* This field must be set to zero. */ - - u32 buffer_address_lsw; -/* LSW Address of the buffer containing the data sent from the AFE - * service to a real-time sink device on the client. - */ - - - u32 buffer_address_msw; -/* MSW Address of the buffer containing the data sent from the AFE - * service to a real-time sink device on the client. - */ - - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory attributes is - * returned if AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS command is - * successful. - * Supported Values: - * - Any 32 bit value - */ - - u32 available_bytes; -/* Number of valid bytes available in the buffer (including all - * channels). - * Supported values: > 0 - * This field must be equal to the frame size specified in the - * #AFE_PORT_AUDIO_IF_CONFIG command that was sent to configure - * this port. - */ -} __packed; - -/* This module ID is related to device configuring like I2S,PCM, - * HDMI, SLIMBus etc. This module supports following parameter ids. - * - #AFE_PARAM_ID_I2S_CONFIG - * - #AFE_PARAM_ID_PCM_CONFIG - * - #AFE_PARAM_ID_DIGI_MIC_CONFIG - * - #AFE_PARAM_ID_HDMI_CONFIG - * - #AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG - * - #AFE_PARAM_ID_SLIMBUS_CONFIG - * - #AFE_PARAM_ID_RT_PROXY_CONFIG - */ - -#define AFE_MODULE_AUDIO_DEV_INTERFACE 0x0001020C -#define AFE_PORT_SAMPLE_RATE_8K 8000 -#define AFE_PORT_SAMPLE_RATE_16K 16000 -#define AFE_PORT_SAMPLE_RATE_48K 48000 -#define AFE_PORT_SAMPLE_RATE_96K 96000 -#define AFE_PORT_SAMPLE_RATE_176P4K 176400 -#define AFE_PORT_SAMPLE_RATE_192K 192000 -#define AFE_PORT_SAMPLE_RATE_352P8K 352800 -#define AFE_LINEAR_PCM_DATA 0x0 -#define AFE_NON_LINEAR_DATA 0x1 -#define AFE_LINEAR_PCM_DATA_PACKED_60958 0x2 -#define AFE_NON_LINEAR_DATA_PACKED_60958 0x3 -#define AFE_GENERIC_COMPRESSED 0x8 -#define AFE_LINEAR_PCM_DATA_PACKED_16BIT 0X6 - -/* This param id is used to configure I2S interface */ -#define AFE_PARAM_ID_I2S_CONFIG 0x0001020D -#define AFE_API_VERSION_I2S_CONFIG 0x1 -/* Enumeration for setting the I2S configuration - * channel_mode parameter to - * serial data wire number 1-3 (SD3). - */ -#define AFE_PORT_I2S_SD0 0x1 -#define AFE_PORT_I2S_SD1 0x2 -#define AFE_PORT_I2S_SD2 0x3 -#define AFE_PORT_I2S_SD3 0x4 -#define AFE_PORT_I2S_QUAD01 0x5 -#define AFE_PORT_I2S_QUAD23 0x6 -#define AFE_PORT_I2S_6CHS 0x7 -#define AFE_PORT_I2S_8CHS 0x8 -#define AFE_PORT_I2S_10CHS 0x9 -#define AFE_PORT_I2S_12CHS 0xA -#define AFE_PORT_I2S_14CHS 0xB -#define AFE_PORT_I2S_16CHS 0xC -#define AFE_PORT_I2S_SD4 0xD -#define AFE_PORT_I2S_SD5 0xE -#define AFE_PORT_I2S_SD6 0xF -#define AFE_PORT_I2S_SD7 0x10 -#define AFE_PORT_I2S_QUAD45 0x11 -#define AFE_PORT_I2S_QUAD67 0x12 -#define AFE_PORT_I2S_8CHS_2 0x13 -#define AFE_PORT_I2S_MONO 0x0 -#define AFE_PORT_I2S_STEREO 0x1 -#define AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL 0x0 -#define AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL 0x1 - -/* Payload of the #AFE_PARAM_ID_I2S_CONFIG - * command's (I2S configuration - * parameter). - */ -struct afe_param_id_i2s_cfg { - u32 i2s_cfg_minor_version; -/* Minor version used for tracking the version of the I2S - * configuration interface. - * Supported values: #AFE_API_VERSION_I2S_CONFIG - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - - u16 channel_mode; -/* I2S lines and multichannel operation. - * Supported values: - * - #AFE_PORT_I2S_SD0 - * - #AFE_PORT_I2S_SD1 - * - #AFE_PORT_I2S_SD2 - * - #AFE_PORT_I2S_SD3 - * - #AFE_PORT_I2S_QUAD01 - * - #AFE_PORT_I2S_QUAD23 - * - #AFE_PORT_I2S_6CHS - * - #AFE_PORT_I2S_8CHS - * - #AFE_PORT_I2S_10CHS - * - #AFE_PORT_I2S_12CHS - * - #AFE_PORT_I2S_14CHS - * - #AFE_PORT_I2S_16CHS - * - #AFE_PORT_I2S_SD4 - * - #AFE_PORT_I2S_SD5 - * - #AFE_PORT_I2S_SD6 - * - #AFE_PORT_I2S_SD7 - * - #AFE_PORT_I2S_QUAD45 - * - #AFE_PORT_I2S_QUAD67 - * - #AFE_PORT_I2S_8CHS_2 - */ - - u16 mono_stereo; -/* Specifies mono or stereo. This applies only when - * a single I2S line is used. - * Supported values: - * - #AFE_PORT_I2S_MONO - * - #AFE_PORT_I2S_STEREO - */ - - u16 ws_src; -/* Word select source: internal or external. - * Supported values: - * - #AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL - * - #AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_192K - */ - - u16 data_format; -/* data format - * Supported values: - * - #LINEAR_PCM_DATA - * - #NON_LINEAR_DATA - * - #LINEAR_PCM_DATA_PACKED_IN_60958 - * - #NON_LINEAR_DATA_PACKED_IN_60958 - */ - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -/* - * This param id is used to configure PCM interface - */ - -#define AFE_API_VERSION_SPDIF_CONFIG_V2 0x2 -#define AFE_API_VERSION_SPDIF_CONFIG 0x1 -#define AFE_API_VERSION_SPDIF_CH_STATUS_CONFIG 0x1 -#define AFE_API_VERSION_SPDIF_CLK_CONFIG 0x1 -#define AFE_CH_STATUS_A 1 -#define AFE_CH_STATUS_B 2 - -#define AFE_PARAM_ID_SPDIF_CONFIG 0x00010244 -#define AFE_PARAM_ID_CH_STATUS_CONFIG 0x00010245 -#define AFE_PARAM_ID_SPDIF_CLK_CONFIG 0x00010246 - -#define AFE_PORT_CLK_ROOT_LPAPLL 0x3 -#define AFE_PORT_CLK_ROOT_LPAQ6PLL 0x4 - -#define AFE_MODULE_CUSTOM_EVENTS 0x00010251 - -#define AFE_PORT_FMT_UPDATE_EVENT 0x0001010E - -#define AFE_API_VERSION_EVENT_FMT_UPDATE 0x1 -#define AFE_PORT_STATUS_NO_SIGNAL 0 -#define AFE_PORT_STATUS_AUDIO_ACTIVE 1 -#define AFE_PORT_STATUS_AUDIO_EOS 2 - -struct afe_param_id_spdif_cfg_v2 { -/* Minor version used for tracking the version of the SPDIF - * configuration interface. - * Supported values: #AFE_API_VERSION_SPDIF_CONFIG, - * #AFE_API_VERSION_SPDIF_CONFIG_V2 - */ - u32 spdif_cfg_minor_version; - -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_22_05K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_44_1K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_176_4K - * - #AFE_PORT_SAMPLE_RATE_192K - */ - u32 sample_rate; - -/* data format - * Supported values: - * - #AFE_LINEAR_PCM_DATA - * - #AFE_NON_LINEAR_DATA - */ - u16 data_format; -/* Number of channels supported by the port - * - PCM - 1, Compressed Case - 2 - */ - u16 num_channels; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - u16 bit_width; -/* This field must be set to zero. */ - u16 reserved; -/* Input select for spdif input, must be set to 0 for spdif output. */ - u32 src_sel; -} __packed; - -struct afe_param_id_spdif_ch_status_cfg { - u32 ch_status_cfg_minor_version; -/* Minor version used for tracking the version of channel - * status configuration. Current supported version is 1 - */ - - u32 status_type; -/* Indicate if the channel status is for channel A or B - * Supported values: - * - #AFE_CH_STATUS_A - * - #AFE_CH_STATUS_B - */ - - u8 status_bits[24]; -/* Channel status - 192 bits for channel - * Byte ordering as defined by IEC60958-3 - */ - - u8 status_mask[24]; -/* Channel status with mask bits 1 will be applied. - * Byte ordering as defined by IEC60958-3 - */ -} __packed; - -/* deprecated */ -struct afe_param_id_spdif_clk_cfg { - u32 clk_cfg_minor_version; -/* Minor version used for tracking the version of SPDIF - * interface clock configuration. Current supported version - * is 1 - */ - - u32 clk_value; -/* Specifies the clock frequency in Hz to set - * Supported values: - * 0 - Disable the clock - * 2 (byphase) * 32 (60958 subframe size) * sampling rate * 2 - * (channels A and B) - */ - - u32 clk_root; -/* Specifies SPDIF root clk source - * Supported Values: - * - #AFE_PORT_CLK_ROOT_LPAPLL - * - #AFE_PORT_CLK_ROOT_LPAQ6PLL - */ -} __packed; - -struct afe_event_fmt_update { - /* Tracks the configuration of this event. */ - u32 minor_version; - - /* Detected port status. - * Supported values: - * - #AFE_PORT_STATUS_NO_SIGNAL - * - #AFE_PORT_STATUS_AUDIO_ACTIVE - * - #AFE_PORT_STATUS_AUDIO_EOS - */ - u32 status; - - /* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_44_1K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_88_2K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_176_4K - * - #AFE_PORT_SAMPLE_RATE_192K - */ - u32 sample_rate; - - /* Data format of the port. - * Supported values: - * - #AFE_LINEAR_PCM_DATA - * - #AFE_NON_LINEAR_DATA - */ - u16 data_format; - - /* First 6 bytes of channel status bits */ - u8 channel_status[6]; -} __packed; - -struct afe_spdif_port_config { - struct afe_param_id_spdif_cfg_v2 cfg; - struct afe_param_id_spdif_ch_status_cfg ch_status; -} __packed; - -#define AFE_PARAM_ID_PCM_CONFIG 0x0001020E -#define AFE_API_VERSION_PCM_CONFIG 0x1 -/* Enumeration for the auxiliary PCM synchronization signal - * provided by an external source. - */ - -#define AFE_PORT_PCM_SYNC_SRC_EXTERNAL 0x0 -/* Enumeration for the auxiliary PCM synchronization signal - * provided by an internal source. - */ -#define AFE_PORT_PCM_SYNC_SRC_INTERNAL 0x1 -/* Enumeration for the PCM configuration aux_mode parameter, - * which configures the auxiliary PCM interface to use - * short synchronization. - */ -#define AFE_PORT_PCM_AUX_MODE_PCM 0x0 -/* - * Enumeration for the PCM configuration aux_mode parameter, - * which configures the auxiliary PCM interface to use long - * synchronization. - */ -#define AFE_PORT_PCM_AUX_MODE_AUX 0x1 -/* - * Enumeration for setting the PCM configuration frame to 8. - */ -#define AFE_PORT_PCM_BITS_PER_FRAME_8 0x0 -/* - * Enumeration for setting the PCM configuration frame to 16. - */ -#define AFE_PORT_PCM_BITS_PER_FRAME_16 0x1 - -/* Enumeration for setting the PCM configuration frame to 32.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_32 0x2 - -/* Enumeration for setting the PCM configuration frame to 64.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_64 0x3 - -/* Enumeration for setting the PCM configuration frame to 128.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_128 0x4 - -/* Enumeration for setting the PCM configuration frame to 256.*/ -#define AFE_PORT_PCM_BITS_PER_FRAME_256 0x5 - -/* Enumeration for setting the PCM configuration - * quantype parameter to A-law with no padding. - */ -#define AFE_PORT_PCM_ALAW_NOPADDING 0x0 - -/* Enumeration for setting the PCM configuration quantype - * parameter to mu-law with no padding. - */ -#define AFE_PORT_PCM_MULAW_NOPADDING 0x1 -/* Enumeration for setting the PCM configuration quantype - * parameter to linear with no padding. - */ -#define AFE_PORT_PCM_LINEAR_NOPADDING 0x2 -/* Enumeration for setting the PCM configuration quantype - * parameter to A-law with padding. - */ -#define AFE_PORT_PCM_ALAW_PADDING 0x3 -/* Enumeration for setting the PCM configuration quantype - * parameter to mu-law with padding. - */ -#define AFE_PORT_PCM_MULAW_PADDING 0x4 -/* Enumeration for setting the PCM configuration quantype - * parameter to linear with padding. - */ -#define AFE_PORT_PCM_LINEAR_PADDING 0x5 -/* Enumeration for disabling the PCM configuration - * ctrl_data_out_enable parameter. - * The PCM block is the only master. - */ -#define AFE_PORT_PCM_CTRL_DATA_OE_DISABLE 0x0 -/* - * Enumeration for enabling the PCM configuration - * ctrl_data_out_enable parameter. The PCM block shares - * the signal with other masters. - */ -#define AFE_PORT_PCM_CTRL_DATA_OE_ENABLE 0x1 - -/* Payload of the #AFE_PARAM_ID_PCM_CONFIG command's - * (PCM configuration parameter). - */ - -struct afe_param_id_pcm_cfg { - u32 pcm_cfg_minor_version; -/* Minor version used for tracking the version of the AUX PCM - * configuration interface. - * Supported values: #AFE_API_VERSION_PCM_CONFIG - */ - - u16 aux_mode; -/* PCM synchronization setting. - * Supported values: - * - #AFE_PORT_PCM_AUX_MODE_PCM - * - #AFE_PORT_PCM_AUX_MODE_AUX - */ - - u16 sync_src; -/* Synchronization source. - * Supported values: - * - #AFE_PORT_PCM_SYNC_SRC_EXTERNAL - * - #AFE_PORT_PCM_SYNC_SRC_INTERNAL - */ - - u16 frame_setting; -/* Number of bits per frame. - * Supported values: - * - #AFE_PORT_PCM_BITS_PER_FRAME_8 - * - #AFE_PORT_PCM_BITS_PER_FRAME_16 - * - #AFE_PORT_PCM_BITS_PER_FRAME_32 - * - #AFE_PORT_PCM_BITS_PER_FRAME_64 - * - #AFE_PORT_PCM_BITS_PER_FRAME_128 - * - #AFE_PORT_PCM_BITS_PER_FRAME_256 - */ - - u16 quantype; -/* PCM quantization type. - * Supported values: - * - #AFE_PORT_PCM_ALAW_NOPADDING - * - #AFE_PORT_PCM_MULAW_NOPADDING - * - #AFE_PORT_PCM_LINEAR_NOPADDING - * - #AFE_PORT_PCM_ALAW_PADDING - * - #AFE_PORT_PCM_MULAW_PADDING - * - #AFE_PORT_PCM_LINEAR_PADDING - */ - - u16 ctrl_data_out_enable; -/* Specifies whether the PCM block shares the data-out - * signal to the drive with other masters. - * Supported values: - * - #AFE_PORT_PCM_CTRL_DATA_OE_DISABLE - * - #AFE_PORT_PCM_CTRL_DATA_OE_ENABLE - */ - u16 reserved; - /* This field must be set to zero. */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to 4 - */ - - u16 slot_number_mapping[4]; -/* Specifies the slot number for the each channel in - * multi channel scenario. - * Supported values: 1 to 32 - */ -} __packed; - -/* - * This param id is used to configure DIGI MIC interface - */ -#define AFE_PARAM_ID_DIGI_MIC_CONFIG 0x0001020F -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_DIGI_MIC_CONFIG 0x1 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to left 0. - */ - -#define AFE_PORT_DIGI_MIC_MODE_LEFT0 0x1 - -/*Enumeration for setting the digital mic configuration - * channel_mode parameter to right 0. - */ - - -#define AFE_PORT_DIGI_MIC_MODE_RIGHT0 0x2 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to left 1. - */ - -#define AFE_PORT_DIGI_MIC_MODE_LEFT1 0x3 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to right 1. - */ - -#define AFE_PORT_DIGI_MIC_MODE_RIGHT1 0x4 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to stereo 0. - */ -#define AFE_PORT_DIGI_MIC_MODE_STEREO0 0x5 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to stereo 1. - */ - - -#define AFE_PORT_DIGI_MIC_MODE_STEREO1 0x6 - -/* Enumeration for setting the digital mic configuration - * channel_mode parameter to quad. - */ - -#define AFE_PORT_DIGI_MIC_MODE_QUAD 0x7 - -/* Payload of the #AFE_PARAM_ID_DIGI_MIC_CONFIG command's - * (DIGI MIC configuration - * parameter). - */ -struct afe_param_id_digi_mic_cfg { - u32 digi_mic_cfg_minor_version; -/* Minor version used for tracking the version of the DIGI Mic - * configuration interface. - * Supported values: #AFE_API_VERSION_DIGI_MIC_CONFIG - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u16 channel_mode; -/* Digital mic and multichannel operation. - * Supported values: - * - #AFE_PORT_DIGI_MIC_MODE_LEFT0 - * - #AFE_PORT_DIGI_MIC_MODE_RIGHT0 - * - #AFE_PORT_DIGI_MIC_MODE_LEFT1 - * - #AFE_PORT_DIGI_MIC_MODE_RIGHT1 - * - #AFE_PORT_DIGI_MIC_MODE_STEREO0 - * - #AFE_PORT_DIGI_MIC_MODE_STEREO1 - * - #AFE_PORT_DIGI_MIC_MODE_QUAD - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - */ -} __packed; - -/* This param id is used to configure HDMI interface */ -#define AFE_PARAM_ID_HDMI_CONFIG 0x00010210 -#define AFE_PARAM_ID_HDMI_DP_MST_VID_IDX_CFG 0x000102b5 -#define AFE_PARAM_ID_HDMI_DPTX_IDX_CFG 0x000102b6 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_HDMI_CONFIG 0x1 - -/* Payload of the #AFE_PARAM_ID_HDMI_CONFIG command, - * which configures a multichannel HDMI audio interface. - */ -struct afe_param_id_hdmi_multi_chan_audio_cfg { - u32 hdmi_cfg_minor_version; -/* Minor version used for tracking the version of the HDMI - * configuration interface. - * Supported values: #AFE_API_VERSION_HDMI_CONFIG - */ - -u16 datatype; -/* data type - * Supported values: - * - #LINEAR_PCM_DATA - * - #NON_LINEAR_DATA - * - #LINEAR_PCM_DATA_PACKED_IN_60958 - * - #NON_LINEAR_DATA_PACKED_IN_60958 - */ - -u16 channel_allocation; -/* HDMI channel allocation information for programming an HDMI - * frame. The default is 0 (Stereo). - * - * This information is defined in the HDMI standard, CEA 861-D - * (refer to @xhyperref{S1,[S1]}). The number of channels is also - * inferred from this parameter. - */ - - -u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - 22050, 44100, 176400 for compressed streams - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - u16 reserved; - /* This field must be set to zero. */ -} __packed; - -/* This param id is used to configure BT or FM(RIVA) interface */ -#define AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG 0x00010211 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_INTERNAL_BT_FM_CONFIG 0x1 - -/* Payload of the #AFE_PARAM_ID_INTERNAL_BT_FM_CONFIG - * command's BT voice/BT audio/FM configuration parameter. - */ -struct afe_param_id_internal_bt_fm_cfg { - u32 bt_fm_cfg_minor_version; -/* Minor version used for tracking the version of the BT and FM - * configuration interface. - * Supported values: #AFE_API_VERSION_INTERNAL_BT_FM_CONFIG - */ - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to 2 - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K (only for BTSCO) - * - #AFE_PORT_SAMPLE_RATE_16K (only for BTSCO) - * - #AFE_PORT_SAMPLE_RATE_48K (FM and A2DP) - */ -} __packed; - -/* This param id is used to configure SLIMBUS interface using - * shared channel approach. - */ - -/* ID of the parameter used to set the latency mode of the - * USB audio device. - */ -#define AFE_PARAM_ID_PORT_LATENCY_MODE_CONFIG 0x000102B3 - -/* Minor version used for tracking USB audio latency mode */ -#define AFE_API_MINOR_VERSION_USB_AUDIO_LATENCY_MODE 0x1 - -/* Supported AFE port latency modes */ -#define AFE_PORT_DEFAULT_LATENCY_MODE 0x0 -#define AFE_PORT_LOW_LATENCY_MODE 0x1 - -#define AFE_PARAM_ID_SLIMBUS_CONFIG 0x00010212 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_SLIMBUS_CONFIG 0x1 - -/* Enumeration for setting SLIMbus device ID 1. */ -#define AFE_SLIMBUS_DEVICE_1 0x0 - -/* Enumeration for setting SLIMbus device ID 2. */ -#define AFE_SLIMBUS_DEVICE_2 0x1 - -/* Enumeration for setting the SLIMbus data formats. */ -#define AFE_SB_DATA_FORMAT_NOT_INDICATED 0x0 - -/* Enumeration for setting the maximum number of streams per - * device. - */ - -#define AFE_PORT_MAX_AUDIO_CHAN_CNT 0x8 - -/* Payload of the #AFE_PORT_CMD_SLIMBUS_CONFIG command's SLIMbus - * port configuration parameter. - */ - -struct afe_param_id_slimbus_cfg { - u32 sb_cfg_minor_version; -/* Minor version used for tracking the version of the SLIMBUS - * configuration interface. - * Supported values: #AFE_API_VERSION_SLIMBUS_CONFIG - */ - - u16 slimbus_dev_id; -/* SLIMbus hardware device ID, which is required to handle - * multiple SLIMbus hardware blocks. - * Supported values: - #AFE_SLIMBUS_DEVICE_1 - #AFE_SLIMBUS_DEVICE_2 - */ - - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - - u16 data_format; -/* Data format supported by the SLIMbus hardware. The default is - * 0 (#AFE_SB_DATA_FORMAT_NOT_INDICATED), which indicates the - * hardware does not perform any format conversions before the data - * transfer. - */ - - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT - */ - - u8 shared_ch_mapping[AFE_PORT_MAX_AUDIO_CHAN_CNT]; -/* Mapping of shared channel IDs (128 to 255) to which the - * master port is to be connected. - * Shared_channel_mapping[i] represents the shared channel assigned - * for audio channel i in multichannel audio data. - */ - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_192K - */ -} __packed; - - -/* ID of the parameter used by AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS to configure - * USB audio device parameter. It should be used with - * AFE_MODULE_AUDIO_DEV_INTERFACE - */ -#define AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS 0x000102A5 - - -/* ID of the parameter used to set the endianness value for the - * USB audio device. It should be used with - * AFE_MODULE_AUDIO_DEV_INTERFACE - */ -#define AFE_PARAM_ID_USB_AUDIO_DEV_LPCM_FMT 0x000102AA - -/* Minor version used for tracking USB audio configuration */ -#define AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_usb_audio_dev_params { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Token of actual end USB aduio device */ - u32 dev_token; -} __packed; - -struct afe_param_id_usb_audio_dev_lpcm_fmt { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Endianness of actual end USB audio device */ - u32 endian; -} __packed; - -struct afe_param_id_usb_audio_dev_latency_mode { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_LATENCY_MODE - */ - u32 minor_version; -/* latency mode for the USB audio device */ - u32 mode; -} __packed; - -#define AFE_PARAM_ID_USB_AUDIO_SVC_INTERVAL 0x000102B7 - -struct afe_param_id_usb_audio_svc_interval { -/* Minor version used for tracking USB audio device parameter. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Endianness of actual end USB audio device */ - u32 svc_interval; -} __packed; - -/* ID of the parameter used by AFE_PARAM_ID_USB_AUDIO_CONFIG to configure - * USB audio interface. It should be used with AFE_MODULE_AUDIO_DEV_INTERFACE - */ -#define AFE_PARAM_ID_USB_AUDIO_CONFIG 0x000102A4 - -/* Payload of the AFE_PARAM_ID_USB_AUDIO_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_usb_audio_cfg { -/* Minor version used for tracking USB audio device configuration. - * Supported values: AFE_API_MINOR_VERSION_USB_AUDIO_CONFIG - */ - u32 cfg_minor_version; -/* Sampling rate of the port. - * Supported values: - * - AFE_PORT_SAMPLE_RATE_8K - * - AFE_PORT_SAMPLE_RATE_11025 - * - AFE_PORT_SAMPLE_RATE_12K - * - AFE_PORT_SAMPLE_RATE_16K - * - AFE_PORT_SAMPLE_RATE_22050 - * - AFE_PORT_SAMPLE_RATE_24K - * - AFE_PORT_SAMPLE_RATE_32K - * - AFE_PORT_SAMPLE_RATE_44P1K - * - AFE_PORT_SAMPLE_RATE_48K - * - AFE_PORT_SAMPLE_RATE_96K - * - AFE_PORT_SAMPLE_RATE_192K - */ - u32 sample_rate; -/* Bit width of the sample. - * Supported values: 16, 24 - */ - u16 bit_width; -/* Number of channels. - * Supported values: 1 and 2 - */ - u16 num_channels; -/* Data format supported by the USB. The supported value is - * 0 (#AFE_USB_AUDIO_DATA_FORMAT_LINEAR_PCM). - */ - u16 data_format; -/* this field must be 0 */ - u16 reserved; -/* device token of actual end USB aduio device */ - u32 dev_token; -/* endianness of this interface */ - u32 endian; -/* service interval */ - u32 service_interval; -} __packed; - -/* This param id is used to configure Real Time Proxy interface. */ -#define AFE_PARAM_ID_RT_PROXY_CONFIG 0x00010213 - -/* This version information is used to handle the new - * additions to the config interface in future in backward - * compatible manner. - */ -#define AFE_API_VERSION_RT_PROXY_CONFIG 0x1 - -/* Payload of the #AFE_PARAM_ID_RT_PROXY_CONFIG - * command (real-time proxy port configuration parameter). - */ -struct afe_param_id_rt_proxy_port_cfg { - u32 rt_proxy_cfg_minor_version; -/* Minor version used for tracking the version of rt-proxy - * config interface. - */ - - u16 bit_width; -/* Bit width of the sample. - * Supported values: 16 - */ - - u16 interleaved; -/* Specifies whether the data exchanged between the AFE - * interface and real-time port is interleaved. - * Supported values: - 0 -- Non-interleaved (samples from each - * channel are contiguous in the buffer) - 1 -- Interleaved - * (corresponding samples from each input channel are interleaved - * within the buffer) - */ - - - u16 frame_size; -/* Size of the frames that are used for PCM exchanges with this - * port. - * Supported values: > 0, in bytes - * For example, 5 ms buffers of 16 bits and 16 kHz stereo samples - * is 5 ms * 16 samples/ms * 2 bytes/sample * 2 channels = 320 - * bytes. - */ - u16 jitter_allowance; -/* Configures the amount of jitter that the port will allow. - * Supported values: > 0 - * For example, if +/-10 ms of jitter is anticipated in the timing - * of sending frames to the port, and the configuration is 16 kHz - * mono with 16-bit samples, this field is 10 ms * 16 samples/ms * 2 - * bytes/sample = 320. - */ - - u16 low_water_mark; -/* Low watermark in bytes (including all channels). - * Supported values: - * - 0 -- Do not send any low watermark events - * - > 0 -- Low watermark for triggering an event - * If the number of bytes in an internal circular buffer is lower - * than this low_water_mark parameter, a LOW_WATER_MARK event is - * sent to applications (via the #AFE_EVENT_RT_PROXY_PORT_STATUS - * event). - * Use of watermark events is optional for debugging purposes. - */ - - u16 high_water_mark; -/* High watermark in bytes (including all channels). - * Supported values: - * - 0 -- Do not send any high watermark events - * - > 0 -- High watermark for triggering an event - * If the number of bytes in an internal circular buffer exceeds - * TOTAL_CIRC_BUF_SIZE minus high_water_mark, a high watermark event - * is sent to applications (via the #AFE_EVENT_RT_PROXY_PORT_STATUS - * event). - * The use of watermark events is optional and for debugging - * purposes. - */ - - - u32 sample_rate; -/* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_48K - */ - - u16 num_channels; -/* Number of channels. - * Supported values: 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT - */ - - u16 reserved; - /* For 32 bit alignment. */ -} __packed; - - -/* This param id is used to configure the Pseudoport interface */ - -#define AFE_PARAM_ID_PSEUDO_PORT_CONFIG 0x00010219 - -/* Version information used to handle future additions to the configuration - * interface (for backward compatibility). - */ -#define AFE_API_VERSION_PSEUDO_PORT_CONFIG 0x1 - -/* Enumeration for setting the timing_mode parameter to faster than real - * time. - */ -#define AFE_PSEUDOPORT_TIMING_MODE_FTRT 0x0 - -/* Enumeration for setting the timing_mode parameter to real time using - * timers. - */ -#define AFE_PSEUDOPORT_TIMING_MODE_TIMER 0x1 - -/* Payload of the AFE_PARAM_ID_PSEUDO_PORT_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_pseudo_port_cfg { - u32 pseud_port_cfg_minor_version; - /* - * Minor version used for tracking the version of the pseudoport - * configuration interface. - */ - - u16 bit_width; - /* Bit width of the sample at values 16, 24 */ - - u16 num_channels; - /* Number of channels at values 1 to 8 */ - - u16 data_format; - /* Non-linear data format supported by the pseudoport (for future use). - * At values #AFE_LINEAR_PCM_DATA - */ - - u16 timing_mode; - /* Indicates whether the pseudoport synchronizes to the clock or - * operates faster than real time. - * at values - * - #AFE_PSEUDOPORT_TIMING_MODE_FTRT - * - #AFE_PSEUDOPORT_TIMING_MODE_TIMER @tablebulletend - */ - - u32 sample_rate; - /* Sample rate at which the pseudoport will run. - * at values - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_192K @tablebulletend - */ -} __packed; - -#define AFE_PARAM_ID_TDM_CONFIG 0x0001029D - -#define AFE_API_VERSION_TDM_CONFIG 1 - -#define AFE_PORT_TDM_SHORT_SYNC_BIT_MODE 0 -#define AFE_PORT_TDM_LONG_SYNC_MODE 1 -#define AFE_PORT_TDM_SHORT_SYNC_SLOT_MODE 2 - -#define AFE_PORT_TDM_SYNC_SRC_EXTERNAL 0 -#define AFE_PORT_TDM_SYNC_SRC_INTERNAL 1 - -#define AFE_PORT_TDM_CTRL_DATA_OE_DISABLE 0 -#define AFE_PORT_TDM_CTRL_DATA_OE_ENABLE 1 - -#define AFE_PORT_TDM_SYNC_NORMAL 0 -#define AFE_PORT_TDM_SYNC_INVERT 1 - -#define AFE_PORT_TDM_DATA_DELAY_0_BCLK_CYCLE 0 -#define AFE_PORT_TDM_DATA_DELAY_1_BCLK_CYCLE 1 -#define AFE_PORT_TDM_DATA_DELAY_2_BCLK_CYCLE 2 - -/* Payload of the AFE_PARAM_ID_TDM_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_tdm_cfg { - u32 tdm_cfg_minor_version; - /* < Minor version used to track TDM configuration. - * @values #AFE_API_VERSION_TDM_CONFIG - */ - - u32 num_channels; - /* < Number of enabled slots for TDM frame. - * @values 1 to 8 - */ - - u32 sample_rate; - /* < Sampling rate of the port. - * @values - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_24K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_176P4K - * - #AFE_PORT_SAMPLE_RATE_352P8K @tablebulletend - */ - - u32 bit_width; - /* < Bit width of the sample. - * @values 16, 24 - */ - - u16 data_format; - /* < Data format: linear ,compressed, generic compresssed - * @values - * - #AFE_LINEAR_PCM_DATA - * - #AFE_NON_LINEAR_DATA - * - #AFE_GENERIC_COMPRESSED - */ - - u16 sync_mode; - /* < TDM synchronization setting. - * @values (short, long, slot) sync mode - * - #AFE_PORT_TDM_SHORT_SYNC_BIT_MODE - * - #AFE_PORT_TDM_LONG_SYNC_MODE - * - #AFE_PORT_TDM_SHORT_SYNC_SLOT_MODE @tablebulletend - */ - - u16 sync_src; - /* < Synchronization source. - * @values - * - #AFE_PORT_TDM_SYNC_SRC_EXTERNAL - * - #AFE_PORT_TDM_SYNC_SRC_INTERNAL @tablebulletend - */ - - u16 nslots_per_frame; - /* < Number of slots per frame. Typical : 1, 2, 4, 8, 16, 32. - * @values 1 - 32 - */ - - u16 ctrl_data_out_enable; - /* < Specifies whether the TDM block shares the data-out signal to the - * drive with other masters. - * @values - * - #AFE_PORT_TDM_CTRL_DATA_OE_DISABLE - * - #AFE_PORT_TDM_CTRL_DATA_OE_ENABLE @tablebulletend - */ - - u16 ctrl_invert_sync_pulse; - /* < Specifies whether to invert the sync or not. - * @values - * - #AFE_PORT_TDM_SYNC_NORMAL - * - #AFE_PORT_TDM_SYNC_INVERT @tablebulletend - */ - - u16 ctrl_sync_data_delay; - /* < Specifies the number of bit clock to delay data with respect to - * sync edge. - * @values - * - #AFE_PORT_TDM_DATA_DELAY_0_BCLK_CYCLE - * - #AFE_PORT_TDM_DATA_DELAY_1_BCLK_CYCLE - * - #AFE_PORT_TDM_DATA_DELAY_2_BCLK_CYCLE @tablebulletend - */ - - u16 slot_width; - /* < Slot width of the slot in a TDM frame. (slot_width >= bit_width) - * have to be satisfied. - * @values 16, 24, 32 - */ - - u32 slot_mask; - /* < Position of active slots. When that bit is set, - * that paricular slot is active. - * Number of active slots can be inferred by number of - * bits set in the mask. Only 8 individual bits can be enabled. - * Bits 0..31 corresponding to slot 0..31 - * @values 1 to 2^32 - 1 - */ -} __packed; - -/* ID of Time Divsion Multiplexing (TDM) module, - * which is used for configuring the AFE TDM. - * - * This module supports following parameter IDs: - * - #AFE_PORT_TDM_SLOT_CONFIG - * - * To configure the TDM interface, the client must use the - * #AFE_PORT_CMD_SET_PARAM command, and fill the module ID with the - * respective parameter IDs as listed above. - */ - -#define AFE_MODULE_TDM 0x0001028A - -/* ID of the parameter used by #AFE_MODULE_TDM to configure - * the TDM slot mapping. #AFE_PORT_CMD_SET_PARAM can use this parameter ID. - */ -#define AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG 0x00010297 - -/* Version information used to handle future additions to slot mapping - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_SLOT_MAPPING_CONFIG 0x1 - -/* Data align type */ -#define AFE_SLOT_MAPPING_DATA_ALIGN_MSB 0 -#define AFE_SLOT_MAPPING_DATA_ALIGN_LSB 1 - -#define AFE_SLOT_MAPPING_OFFSET_INVALID 0xFFFF - -/* Payload of the AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG - * command's TDM configuration parameter. - */ -struct afe_param_id_slot_mapping_cfg { - u32 minor_version; - /* < Minor version used for tracking TDM slot configuration. - * @values #AFE_API_VERSION_TDM_SLOT_CONFIG - */ - - u16 num_channel; - /* < number of channel of the audio sample. - * @values 1, 2, 4, 6, 8 @tablebulletend - */ - - u16 bitwidth; - /* < Slot bit width for each channel - * @values 16, 24, 32 - */ - - u32 data_align_type; - /* < indicate how data packed from slot_offset for 32 slot bit width - * in case of sample bit width is 24. - * @values - * #AFE_SLOT_MAPPING_DATA_ALIGN_MSB - * #AFE_SLOT_MAPPING_DATA_ALIGN_LSB - */ - - u16 offset[AFE_PORT_MAX_AUDIO_CHAN_CNT]; - /* < Array of the slot mapping start offset in bytes for this frame. - * The bytes is counted from 0. The 0 is mapped to the 1st byte - * in or out of the digital serial data line this sub-frame belong to. - * slot_offset[] setting is per-channel based. - * The max num of channel supported is 8. - * The valid offset value must always be continuly placed in from - * index 0. - * Set offset as AFE_SLOT_MAPPING_OFFSET_INVALID for not used arrays. - * If "slot_bitwidth_per_channel" is 32 and "sample_bitwidth" is 24, - * "data_align_type" is used to indicate how 24 bit sample data in - * aligning with 32 bit slot width per-channel. - * @values, in byte - */ -} __packed; - -/* ID of the parameter used by #AFE_MODULE_TDM to configure - * the customer TDM header. #AFE_PORT_CMD_SET_PARAM can use this parameter ID. - */ -#define AFE_PARAM_ID_CUSTOM_TDM_HEADER_CONFIG 0x00010298 - -/* Version information used to handle future additions to custom TDM header - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_CUSTOM_TDM_HEADER_CONFIG 0x1 - -#define AFE_CUSTOM_TDM_HEADER_TYPE_INVALID 0x0 -#define AFE_CUSTOM_TDM_HEADER_TYPE_DEFAULT 0x1 -#define AFE_CUSTOM_TDM_HEADER_TYPE_ENTERTAINMENT_MOST 0x2 - -#define AFE_CUSTOM_TDM_HEADER_MAX_CNT 0x8 - -/* Payload of the AFE_PARAM_ID_CUSTOM_TDM_HEADER_CONFIG parameter ID */ -struct afe_param_id_custom_tdm_header_cfg { - u32 minor_version; - /* < Minor version used for tracking custom TDM header configuration. - * @values #AFE_API_VERSION_CUSTOM_TDM_HEADER_CONFIG - */ - - u16 start_offset; - /* < the slot mapping start offset in bytes from this sub-frame - * The bytes is counted from 0. The 0 is mapped to the 1st byte in or - * out of the digital serial data line this sub-frame belong to. - * @values, in byte, - * supported values are 0, 4, 8 - */ - - u16 header_width; - /* < the header width per-frame followed. - * 2 bytes for MOST/TDM case - * @values, in byte - * supported value is 2 - */ - - u16 header_type; - /* < Indicate what kind of custom TDM header it is. - * @values #AFE_CUSTOM_TDM_HEADER_TYPE_INVALID = 0 - * #AFE_CUSTOM_TDM_HEADER_TYPE_DEFAULT = 1 (for AAN channel per MOST) - * #AFE_CUSTOM_TDM_HEADER_TYPE_ENTERTAINMENT_MOST = 2 - * (for entertainment channel, which will overwrite - * AFE_API_VERSION_TDM_SAD_HEADER_TYPE_DEFAULT per MOST) - */ - - u16 num_frame_repeat; - /* < num of header followed. - * @values, supported value is 8 - */ - u16 header[AFE_CUSTOM_TDM_HEADER_MAX_CNT]; - /* < SAD header for MOST/TDM case is followed as payload as below. - * The size of followed SAD header in bytes is num_of_frame_repeat * - * header_width_per_frame, which is 2 * 8 = 16 bytes here. - * the supported payload format is in uint16_t as below - * uint16_t header0; SyncHi 0x3C Info[4] - CodecType -> 0x3C00 - * uint16_t header1; SyncLo 0xB2 Info[5] - SampleWidth -> 0xB218 - * uint16_t header2; DTCP Info Info[6] - unused -> 0x0 - * uint16_t header3; Extension Info[7] - ASAD-Value -> 0xC0 - * uint16_t header4; Reserved Info[0] - Num of bytes following -> 0x7 - * uint16_t header5; Reserved Info[1] - Media Type -> 0x0 - * uint16_t header6; Reserved Info[2] - Bitrate[kbps] - High Byte -> 0x0 - * uint16_t header7; Reserved Info[3] - Bitrate[kbps] - Low Byte -> 0x0 - */ -} __packed; - -struct afe_tdm_port_config { - struct afe_param_id_tdm_cfg tdm; - struct afe_param_id_slot_mapping_cfg slot_mapping; - struct afe_param_id_custom_tdm_header_cfg custom_tdm_header; -} __packed; - -#define AFE_PARAM_ID_DEVICE_HW_DELAY 0x00010243 -#define AFE_API_VERSION_DEVICE_HW_DELAY 0x1 - -struct afe_param_id_device_hw_delay_cfg { - uint32_t device_hw_delay_minor_version; - uint32_t delay_in_us; -} __packed; - -#define AFE_PARAM_ID_SET_TOPOLOGY 0x0001025A -#define AFE_API_VERSION_TOPOLOGY_V1 0x1 - -struct afe_param_id_set_topology_cfg { - /* - * Minor version used for tracking afe topology id configuration. - * @values #AFE_API_VERSION_TOPOLOGY_V1 - */ - u32 minor_version; - /* - * Id of the topology for the afe session. - * @values Any valid AFE topology ID - */ - u32 topology_id; -} __packed; - -#define MAX_ABR_LEVELS 5 - -struct afe_bit_rate_level_map_t { - /* - * Key value pair for link quality level to bitrate - * mapping in AFE - */ - uint32_t link_quality_level; - uint32_t bitrate; -} __packed; - -struct afe_quality_level_to_bitrate_info { - /* - * Number of quality levels being mapped. - * This will be equal to the size of mapping table. - */ - uint32_t num_levels; - /* - * Quality level to bitrate mapping table - */ - struct afe_bit_rate_level_map_t bit_rate_level_map[MAX_ABR_LEVELS]; -} __packed; - -struct afe_imc_dec_enc_info { - /* - * Decoder to encoder communication direction. - * Transmit = 0 / Receive = 1 - */ - uint32_t direction; - /* - * Enable / disable IMC between decoder and encoder - */ - uint32_t enable; - /* - * Purpose of IMC being set up between decoder and encoder. - * Param ID defined for link quality feedback in LPASS will - * be the default value sent as purpose. - * Supported values: - * AFE_ENCDEC_PURPOSE_ID_BT_INFO - */ - uint32_t purpose; - /* - * Unique communication instance ID. - * Data type a2dp_abr_instance used to set instance ID. - * purpose and comm_instance together form the actual key - * used in IMC registration, which must be the same for - * encoder and decoder for which IMC is being set up. - */ - uint32_t comm_instance; -} __packed; - -struct afe_abr_dec_cfg_t { - struct afe_imc_dec_enc_info imc_info; -} __packed; - -struct afe_abr_enc_cfg_t { - /* - * Link quality level to bitrate mapping info sent to DSP. - */ - struct afe_quality_level_to_bitrate_info mapping_info; - /* - * Information to set up IMC between decoder and encoder. - */ - struct afe_imc_dec_enc_info imc_info; - /* - * Flag to indicate whether ABR is enabled. - */ - bool is_abr_enabled; -} __packed; - -#define AFE_PARAM_ID_APTX_SYNC_MODE 0x00013205 - -struct afe_param_id_aptx_sync_mode { - /* - * sync mode: 0x0 = stereo sync mode (default) - * 0x01 = dual mono sync mode - * 0x02 = dual mono with no sync on either L or R - */ - uint32_t sync_mode; -} __packed; - -#define AFE_ID_APTX_ADAPTIVE_ENC_INIT 0x00013324 - -struct afe_id_aptx_adaptive_enc_init -{ - uint32_t sampling_freq; - uint32_t mtu; - uint32_t channel_mode; - uint32_t min_sink_modeA; - uint32_t max_sink_modeA; - uint32_t min_sink_modeB; - uint32_t max_sink_modeB; - uint32_t min_sink_modeC; - uint32_t max_sink_modeC; - uint32_t mode; -} __attribute__ ((packed)); - -/* - * Generic encoder module ID. - * This module supports the following parameter IDs: - * #AVS_ENCODER_PARAM_ID_ENC_FMT_ID (cannot be set run time) - * #AVS_ENCODER_PARAM_ID_ENC_CFG_BLK (may be set run time) - * #AVS_ENCODER_PARAM_ID_ENC_BITRATE (may be set run time) - * #AVS_ENCODER_PARAM_ID_PACKETIZER_ID (cannot be set run time) - * Opcode - AVS_MODULE_ID_ENCODER - * AFE Command AFE_PORT_CMD_SET_PARAM_V2 supports this module ID. - */ -#define AFE_MODULE_ID_ENCODER 0x00013229 - -/* Macro for defining the packetizer ID: COP. */ -#define AFE_MODULE_ID_PACKETIZER_COP 0x0001322A - -/* - * Packetizer type parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter cannot be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_PACKETIZER_ID 0x0001322E - -/* - * Encoder config block parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter may be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_ENC_CFG_BLK 0x0001322C - -/* - * Encoder format ID parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter cannot be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_ENC_FMT_ID 0x0001322B - -/* - * Decoder format ID parameter for the #AVS_MODULE_ID_DECODER module. - * This parameter cannot be set runtime. - */ -#define AFE_DECODER_PARAM_ID_DEC_FMT_ID 0x00013234 - -/* - * Encoder scrambler parameter for the #AVS_MODULE_ID_ENCODER module. - * This parameter cannot be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING 0x0001323C - -/* - * Link quality level to bitrate mapping info sent to AFE Encoder. - * This parameter may be set runtime. - */ -#define AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP 0x000132E1 - -/* - * Parameter to set up Inter Module Communication (IMC) between - * AFE Decoder and Encoder. - * This parameter may be set runtime. - */ -#define AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION 0x0001323D - -/* - * Purpose of IMC set up between encoder and decoder. - * Communication instance and purpose together form the - * actual key used for IMC registration. - */ -#define AFE_ENCDEC_PURPOSE_ID_BT_INFO 0x000132E2 - -#define AFE_MODULE_ID_DECODER 0x00013231 - -/* - * Macro for defining the depacketizer ID: COP. - */ -#define AFE_MODULE_ID_DEPACKETIZER_COP 0x00013233 -#define AFE_MODULE_ID_DEPACKETIZER_COP_V1 0x000132E9 - -/* - * Depacketizer type parameter for the #AVS_MODULE_ID_DECODER module. - * This parameter cannot be set runtime. - */ -#define AFE_DECODER_PARAM_ID_DEPACKETIZER_ID 0x00013235 - -#define CAPI_V2_PARAM_ID_APTX_ENC_SWITCH_TO_MONO 0x0001332A - -struct aptx_channel_mode_param_t { - u32 channel_mode; -} __packed; -/* - * Decoder buffer ID parameter for the #AVS_MODULE_ID_DECODER module. - * This parameter cannot be set runtime. - */ -#define AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE 0x000132ec - -/* - * Data format to send compressed data - * is transmitted/received over Slimbus lines. - */ -#define AFE_SB_DATA_FORMAT_GENERIC_COMPRESSED 0x3 - -/* - * Parameter to send frame control size - * to DSP for AAC encoder in AFE. - */ -#define AFE_PARAM_ID_AAC_FRM_SIZE_CONTROL 0x000132EA - -/* - * ID for AFE port module. This will be used to define port properties. - * This module supports following parameter IDs: - * #AFE_PARAM_ID_PORT_MEDIA_TYPE - * To configure the port property, the client must use the - * #AFE_PORT_CMD_SET_PARAM_V2 command, - * and fill the module ID with the respective parameter IDs as listed above. - * @apr_hdr_fields - * Opcode -- AFE_MODULE_PORT - */ -#define AFE_MODULE_PORT 0x000102a6 - -/* - * ID of the parameter used by #AFE_MODULE_PORT to set the port media type. - * parameter ID is currently supported using#AFE_PORT_CMD_SET_PARAM_V2 command. - */ -#define AFE_PARAM_ID_PORT_MEDIA_TYPE 0x000102a7 - -/* - * Macros for defining the "data_format" field in the - * #AFE_PARAM_ID_PORT_MEDIA_TYPE - */ -#define AFE_PORT_DATA_FORMAT_PCM 0x0 -#define AFE_PORT_DATA_FORMAT_GENERIC_COMPRESSED 0x1 - -/* - * Macro for defining the "minor_version" field in the - * #AFE_PARAM_ID_PORT_MEDIA_TYPE - */ -#define AFE_API_VERSION_PORT_MEDIA_TYPE 0x1 - -#define ASM_MEDIA_FMT_NONE 0x0 - -/* - * Media format ID for SBC encode configuration. - * @par SBC encode configuration (asm_sbc_enc_cfg_t) - * @table{weak__asm__sbc__enc__cfg__t} - */ -#define ASM_MEDIA_FMT_SBC 0x00010BF2 - -/* SBC channel Mono mode.*/ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_MONO 1 - -/* SBC channel Stereo mode. */ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_STEREO 2 - -/* SBC channel Dual Mono mode. */ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_DUAL_MONO 8 - -/* SBC channel Joint Stereo mode. */ -#define ASM_MEDIA_FMT_SBC_CHANNEL_MODE_JOINT_STEREO 9 - -/* SBC bit allocation method = loudness. */ -#define ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS 0 - -/* SBC bit allocation method = SNR. */ -#define ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR 1 - - -/* - * Payload of the SBC encoder configuration parameters in the - * #ASM_MEDIA_FMT_SBC media format. - */ -struct asm_sbc_enc_cfg_t { - /* - * Number of subbands. - * @values 4, 8 - */ - uint32_t num_subbands; - - /* - * Size of the encoded block in samples. - * @values 4, 8, 12, 16 - */ - uint32_t blk_len; - - /* - * Mode used to allocate bits between channels. - * @values - * 0 (Native mode) - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_MONO - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_STEREO - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_DUAL_MONO - * #ASM_MEDIA_FMT_SBC_CHANNEL_MODE_JOINT_STEREO - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - * If postprocessing outputs one-channel data, Mono mode is used. If - * postprocessing outputs two-channel data, Stereo mode is used. - * The number of channels must not change during encoding. - */ - uint32_t channel_mode; - - /* - * Encoder bit allocation method. - * @values - * #ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS - * #ASM_MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR @tablebulletend - */ - uint32_t alloc_method; - - /* - * Number of encoded bits per second. - * @values - * Mono channel -- Maximum of 320 kbps - * Stereo channel -- Maximum of 512 kbps @tablebulletend - */ - uint32_t bit_rate; - - /* - * Number of samples per second. - * @values 0 (Native mode), 16000, 32000, 44100, 48000 Hz - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - uint32_t sample_rate; -}; - -#define ASM_MEDIA_FMT_AAC_AOT_LC 2 -#define ASM_MEDIA_FMT_AAC_AOT_SBR 5 -#define ASM_MEDIA_FMT_AAC_AOT_PS 29 -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS 0 -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW 3 - -struct asm_aac_enc_cfg_v2_t { - - /* Encoding rate in bits per second.*/ - uint32_t bit_rate; - - /* - * Encoding mode. - * Supported values: - * #ASM_MEDIA_FMT_AAC_AOT_LC - * #ASM_MEDIA_FMT_AAC_AOT_SBR - * #ASM_MEDIA_FMT_AAC_AOT_PS - */ - uint32_t enc_mode; - - /* - * AAC format flag. - * Supported values: - * #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - */ - uint16_t aac_fmt_flag; - - /* - * Number of channels to encode. - * Supported values: - * 0 - Native mode - * 1 - Mono - * 2 - Stereo - * Other values are not supported. - * @note1hang The eAAC+ encoder mode supports only stereo. - * Native mode indicates that encoding must be performed with the - * number of channels at the input. - * The number of channels must not change during encoding. - */ - uint16_t channel_cfg; - - /* - * Number of samples per second. - * Supported values: - 0 -- Native mode - For other values, - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - uint32_t sample_rate; -} __packed; - -/* Structure to control frame size of AAC encoded frames. */ -struct asm_aac_frame_size_control_t { - /* Type of frame size control: MTU_SIZE / PEAK_BIT_RATE*/ - uint32_t ctl_type; - /* - * Control value - * MTU_SIZE: MTU size in bytes - * PEAK_BIT_RATE: Peak bitrate in bits per second. - */ - uint32_t ctl_value; -} __packed; - -struct asm_aac_enc_cfg_t { - struct asm_aac_enc_cfg_v2_t aac_cfg; - struct asm_aac_frame_size_control_t frame_ctl; -} __packed; - -/* FMT ID for apt-X Classic */ -#define ASM_MEDIA_FMT_APTX 0x000131ff - -/* FMT ID for apt-X HD */ -#define ASM_MEDIA_FMT_APTX_HD 0x00013200 - -/* FMT ID for apt-X Adaptive */ -#define ASM_MEDIA_FMT_APTX_ADAPTIVE 0x00013204 - -#define PCM_CHANNEL_L 1 -#define PCM_CHANNEL_R 2 -#define PCM_CHANNEL_C 3 - -struct asm_custom_enc_cfg_t { - uint32_t sample_rate; - /* Mono or stereo */ - uint16_t num_channels; - uint16_t reserved; - /* num_ch == 1, then PCM_CHANNEL_C, - * num_ch == 2, then {PCM_CHANNEL_L, PCM_CHANNEL_R} - */ - uint8_t channel_mapping[8]; - uint32_t custom_size; -} __packed; - -struct asm_aptx_v2_enc_cfg_ext_t { - /* - * sync mode: 0x0 = stereo sync mode (default) - * 0x01 = dual mono sync mode - * 0x02 = dual mono with no sync on either L or R - */ - uint32_t sync_mode; -} __packed; - -struct asm_aptx_enc_cfg_t { - struct asm_custom_enc_cfg_t custom_cfg; - struct asm_aptx_v2_enc_cfg_ext_t aptx_v2_cfg; -} __packed; - -struct asm_aptx_ad_enc_cfg_t -{ - struct asm_custom_enc_cfg_t custom_cfg; - struct afe_id_aptx_adaptive_enc_init aptx_ad_cfg; - struct afe_abr_enc_cfg_t abr_cfg; -} __attribute__ ((packed)); - -#define ASM_MEDIA_FMT_CELT 0x00013221 -struct asm_celt_specific_enc_cfg_t { - /* - * Bit rate used for encoding. - * This is used to calculate the upper threshold - * for bytes per frame if vbr_flag is 1. - * Or else, this will be used as a regular constant - * bit rate for encoder output. - * @Range : 32000 to 1536000 - * @Default: 128 - */ - uint32_t bit_rate; - /* - * Frame size used for encoding. - * @Range : 64, 128, 256, 512 - * @Default: 256 - */ - uint16_t frame_size; - /* - * complexity of algorithm. - * @Range : 0-10 - * @Default: 3 - */ - uint16_t complexity; - /* - * Switch variable for prediction feature. - * Used to choose between the level of interframe - * predictions allowed while encoding. - * @Range: - * 0: Independent Frames. - * 1: Short Term interframe prediction allowed. - * 2: Long term prediction allowed. - * @Default: 2 - */ - uint16_t prediction_mode; - /* - * Variable Bit Rate flag. - * @Default: 0 - */ - uint16_t vbr_flag; -} __packed; - -struct asm_celt_enc_cfg_t { - struct asm_custom_enc_cfg_t custom_config; - struct asm_celt_specific_enc_cfg_t celt_specific_config; -} __packed; - -#define ASM_MEDIA_FMT_LDAC 0x00013224 -#define ENC_CODEC_TYPE_LDAC 0x23000000 -struct asm_ldac_specific_enc_cfg_t { - /* - * This is used to calculate the encoder output - * bytes per frame (i.e. bytes per packet). - * Bit rate also configures the EQMID. - * The min bit rate 303000 bps is calculated for - * 44.1 kHz and 88.2 KHz sampling frequencies with - * Mobile use Quality. - * The max bit rate of 990000 bps is calculated for - * 96kHz and 48 KHz with High Quality - * @Range(in bits per second) - * 303000 for Mobile use Quality - * 606000 for standard Quality - * 909000 for High Quality - */ - uint32_t bit_rate; - /* - * The channel setting information for LDAC specification - * of Bluetooth A2DP which is determined by SRC and SNK - * devices in Bluetooth transmission. - * @Range: - * 0 for native mode - * 4 for mono - * 2 for dual channel - * 1 for stereo - */ - uint16_t channel_mode; - /* - * Maximum Transmission Unit (MTU). - * The minimum MTU that a L2CAP implementation for LDAC shall - * support is 679 bytes, because LDAC is optimized with 2-DH5 - * packet as its target. - * @Range : 679 - * @Default: 679 for LDACBT_MTU_2DH5 - */ - uint16_t mtu; -} __packed; - -struct asm_ldac_enc_cfg_t { - struct asm_custom_enc_cfg_t custom_config; - struct asm_ldac_specific_enc_cfg_t ldac_specific_config; - struct afe_abr_enc_cfg_t abr_config; -} __packed; - -struct afe_enc_fmt_id_param_t { - /* - * Supported values: - * #ASM_MEDIA_FMT_SBC - * #ASM_MEDIA_FMT_AAC_V2 - * Any OpenDSP supported values - */ - uint32_t fmt_id; -} __packed; - -struct afe_port_media_type_t { - /* - * Minor version - * @values #AFE_API_VERSION_PORT_MEDIA_TYPE. - */ - uint32_t minor_version; - - /* - * Sampling rate of the port. - * @values - * #AFE_PORT_SAMPLE_RATE_8K - * #AFE_PORT_SAMPLE_RATE_11_025K - * #AFE_PORT_SAMPLE_RATE_12K - * #AFE_PORT_SAMPLE_RATE_16K - * #AFE_PORT_SAMPLE_RATE_22_05K - * #AFE_PORT_SAMPLE_RATE_24K - * #AFE_PORT_SAMPLE_RATE_32K - * #AFE_PORT_SAMPLE_RATE_44_1K - * #AFE_PORT_SAMPLE_RATE_48K - * #AFE_PORT_SAMPLE_RATE_88_2K - * #AFE_PORT_SAMPLE_RATE_96K - * #AFE_PORT_SAMPLE_RATE_176_4K - * #AFE_PORT_SAMPLE_RATE_192K - * #AFE_PORT_SAMPLE_RATE_352_8K - * #AFE_PORT_SAMPLE_RATE_384K - */ - uint32_t sample_rate; - - /* - * Bit width of the sample. - * @values 16, 24 - */ - uint16_t bit_width; - - /* - * Number of channels. - * @values 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT - */ - uint16_t num_channels; - - /* - * Data format supported by this port. - * If the port media type and device media type are different, - * it signifies a encoding/decoding use case - * @values - * #AFE_PORT_DATA_FORMAT_PCM - * #AFE_PORT_DATA_FORMAT_GENERIC_COMPRESSED - */ - uint16_t data_format; - - /*This field must be set to zero.*/ - uint16_t reserved; -} __packed; - -/* - * Payload of the SBC decoder configuration parameters in the - * #ASM_MEDIA_FMT_SBC media format. - */ -struct asm_sbc_dec_cfg_t { - /* All configuration is extracted from the stream */ -} __packed; - -/* - * Payload of the MP3 decoder configuration parameters in the - * #ASM_MEDIA_FMT_MP3 media format. - */ -struct asm_mp3_dec_cfg_t { - /* All configuration is extracted from the stream */ -} __packed; - -struct asm_aac_dec_cfg_v2_t { - uint16_t aac_fmt_flag; - /* - * Bit stream format option. - * - * @values - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LOAS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADIF - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LATM - */ - - uint16_t audio_obj_type; - /* - * Audio Object Type (AOT) present in the AAC stream. - * - * @values - * - #ASM_MEDIA_FMT_AAC_AOT_LC - * - #ASM_MEDIA_FMT_AAC_AOT_SBR - * - #ASM_MEDIA_FMT_AAC_AOT_BSAC - * - #ASM_MEDIA_FMT_AAC_AOT_PS - * - * Other values are not supported. - */ - - uint16_t channel_config; - /* - * Number of channels present in the AAC stream. - * - * @values - * - 0 -- PCE - * - 1 -- Mono - * - 2 -- Stereo - * - 6 -- 5.1 content - */ - - uint16_t total_size_of_PCE_bits; - /* - * For RAW formats and if channel_config=0 (PCE), - * the client can send the bit stream containing PCE - * immediately following this structure (in band). - * - * @values @ge 0 (does not include the bits required - * for 32-bit alignment) - * - * If this field is set to 0, the PCE information is - * assumed to be available in the audio bit stream - * and not in band. - * - * If this field is greater than 0, the PCE information - * follows this structure. Additional bits might - * be required for 32-bit alignment. - */ - - uint32_t sample_rate; - /* - * Number of samples per second. - * - * @values 8000, 11025, 12000, 16000, 22050, 24000, 32000, - * 44100, 48000, 64000, 88200, 96000 Hz - * - * This field must be equal to the sample rate of the - * AAC-LC decoder output. - * - For MP4 or 3GP containers, this sample rate - * is indicated by the - * samplingFrequencyIndex field in the - * AudioSpecificConfig element. - * - For ADTS format, this sample rate is indicated by the - * samplingFrequencyIndex in the ADTS fixed header. - * - For ADIF format, this sample rate is indicated by the - * samplingFrequencyIndex in the program_config_element - * present in the ADIF header. - */ -} __packed; - -union afe_enc_config_data { - struct asm_sbc_enc_cfg_t sbc_config; - struct asm_aac_enc_cfg_t aac_config; - struct asm_custom_enc_cfg_t custom_config; - struct asm_celt_enc_cfg_t celt_config; - struct asm_aptx_enc_cfg_t aptx_config; - struct asm_ldac_enc_cfg_t ldac_config; - struct asm_aptx_ad_enc_cfg_t aptx_ad_config; -}; - -struct afe_enc_config { - u32 format; - u32 scrambler_mode; - u32 mono_mode; - union afe_enc_config_data data; -}; - -union afe_dec_config_data { - struct asm_sbc_dec_cfg_t sbc_config; - struct asm_aac_dec_cfg_v2_t aac_config; - struct asm_mp3_dec_cfg_t mp3_config; -}; - -struct afe_dec_config { - u32 format; - struct afe_abr_dec_cfg_t abr_dec_cfg; - union afe_dec_config_data data; -}; - -struct afe_enc_cfg_blk_param_t { - uint32_t enc_cfg_blk_size; - /* - *Size of the encoder configuration block that follows this member - */ - union afe_enc_config_data enc_blk_config; -}; - -/* - * Payload of the AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT parameter used by - * AVS_MODULE_ID_DECODER. - */ -struct afe_dec_media_fmt_t { - union afe_dec_config_data dec_media_config; -} __packed; - -/* - * Payload of the AVS_ENCODER_PARAM_ID_PACKETIZER_ID parameter. - */ -struct avs_enc_packetizer_id_param_t { - /* - * Supported values: - * #AVS_MODULE_ID_PACKETIZER_COP - * Any OpenDSP supported values - */ - uint32_t enc_packetizer_id; -}; - -/* - * Payload of the AVS_ENCODER_PARAM_ID_ENABLE_SCRAMBLING parameter. - */ -struct avs_enc_set_scrambler_param_t { - /* - * Supported values: - * 1 : enable scrambler - * 0 : disable scrambler - */ - uint32_t enable_scrambler; -}; - -/* - * Payload of the AVS_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP parameter. - */ -struct afe_enc_level_to_bitrate_map_param_t { - /* - * Parameter for mapping link quality level to bitrate. - */ - struct afe_quality_level_to_bitrate_info mapping_table; -}; - -/* - * Payload of the AVS_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION parameter. - */ -struct afe_enc_dec_imc_info_param_t { - /* - * Parameter to set up Inter Module Communication (IMC) between - * AFE Decoder and Encoder. - */ - struct afe_imc_dec_enc_info imc_info; -}; - -/* - * Payload of the AVS_DECODER_PARAM_ID_DEPACKETIZER_ID parameter. - */ -struct avs_dec_depacketizer_id_param_t { - /* - * Supported values: - * #AFE_MODULE_ID_DEPACKETIZER_COP - * #AFE_MODULE_ID_DEPACKETIZER_COP_V1 - * Any OpenDSP supported values - */ - uint32_t dec_depacketizer_id; -}; - -struct avs_dec_congestion_buffer_param_t { - uint32_t version; - uint16_t max_nr_buffers; - /* - * Maximum number of 1ms buffers: - * 0 - 256 - */ - uint16_t pre_buffer_size; - /* - * Pre-buffering size in 1ms: - * 1 - 128 - */ -}; - -/* - * ID of the parameter used by #AVS_MODULE_ID_DECODER to configure - * the decoder mode for the AFE module. - * This parameter cannot be set at runtime. - */ -#define AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT 0x00013232 - -/* ID of the parameter used by #AFE_MODULE_AUDIO_DEV_INTERFACE to configure - * the island mode for a given AFE port. - */ -#define AFE_PARAM_ID_ISLAND_CONFIG 0x000102B4 - -/* Version information used to handle future additions to codec DMA - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_ISLAND_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_ISLAND_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_island_cfg_t { - uint32_t island_cfg_minor_version; - /* Tracks the configuration of this parameter. - * Supported values: #AFE_API_VERSION_ISLAND_CONFIG - */ - - uint32_t island_enable; - /* Specifies whether island mode should be enabled or disabled for the - * use-case being setup. - * Supported values: 0 - Disable, 1 - Enable - */ -} __packed; - -/* ID of the parameter used by #AFE_MODULE_AUDIO_DEV_INTERFACE to configure - * the Codec DMA interface. - */ - -#define AFE_PARAM_ID_CODEC_DMA_CONFIG 0x000102B8 - -/* Version information used to handle future additions to codec DMA - * configuration (for backward compatibility). - */ -#define AFE_API_VERSION_CODEC_DMA_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_CODEC_DMA_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_cdc_dma_cfg_t { - uint32_t cdc_dma_cfg_minor_version; - /* Tracks the configuration of this parameter. - * Supported values: #AFE_API_VERSION_CODEC_DMA_CONFIG - */ - - uint32_t sample_rate; - /* Sampling rate of the port. - * Supported values: - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_11_025K - * - #AFE_PORT_SAMPLE_RATE_12K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_22_05K - * - #AFE_PORT_SAMPLE_RATE_24K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_44_1K - * - #AFE_PORT_SAMPLE_RATE_48K - * - #AFE_PORT_SAMPLE_RATE_88_2K - * - #AFE_PORT_SAMPLE_RATE_96K - * - #AFE_PORT_SAMPLE_RATE_176_4K - * - #AFE_PORT_SAMPLE_RATE_192K - * - #AFE_PORT_SAMPLE_RATE_352_8K - * - #AFE_PORT_SAMPLE_RATE_384K - */ - - uint16_t bit_width; - /* Bit width of the sample. - * Supported values: 16, 24, 32 - */ - - uint16_t data_format; - /* Data format supported by the codec DMA interface. - * Supported values: - * - #AFE_LINEAR_PCM_DATA - * - #AFE_LINEAR_PCM_DATA_PACKED_16BIT - */ - - uint16_t num_channels; - /* Number of channels. - * Supported values: 1 to Maximum number of channels supported - * for each interface - */ - - uint16_t active_channels_mask; - /* Active channels mask to denote the bit mask for active channels. - * Bits 0 to 7 denote channels 0 to 7. A 1 denotes the channel is active - * while a 0 denotes a channel is inactive. - * Supported values: - * Any mask with number of active bits equal to num_channels - */ -} __packed; - -union afe_port_config { - struct afe_param_id_pcm_cfg pcm; - struct afe_param_id_i2s_cfg i2s; - struct afe_param_id_hdmi_multi_chan_audio_cfg hdmi_multi_ch; - struct afe_param_id_slimbus_cfg slim_sch; - struct afe_param_id_rt_proxy_port_cfg rtproxy; - struct afe_param_id_internal_bt_fm_cfg int_bt_fm; - struct afe_param_id_pseudo_port_cfg pseudo_port; - struct afe_param_id_device_hw_delay_cfg hw_delay; - struct afe_param_id_spdif_cfg_v2 spdif; - struct afe_param_id_set_topology_cfg topology; - struct afe_param_id_tdm_cfg tdm; - struct afe_param_id_usb_audio_cfg usb_audio; - struct afe_param_id_aptx_sync_mode sync_mode_param; - struct asm_aac_frame_size_control_t frame_ctl_param; - struct afe_enc_fmt_id_param_t enc_fmt; - struct afe_port_media_type_t media_type; - struct afe_enc_cfg_blk_param_t enc_blk_param; - struct avs_enc_packetizer_id_param_t enc_pkt_id_param; - struct avs_enc_set_scrambler_param_t enc_set_scrambler_param; - struct avs_dec_depacketizer_id_param_t dec_depkt_id_param; - struct afe_dec_media_fmt_t dec_media_fmt; - struct afe_enc_level_to_bitrate_map_param_t map_param; - struct afe_enc_dec_imc_info_param_t imc_info_param; - struct afe_param_id_cdc_dma_cfg_t cdc_dma; -} __packed; - - -/* - * AFE event registration related APIs and corresponding payloads - */ -#define AFE_SVC_CMD_EVENT_CFG 0x000100FE - -#define AFE_CMD_APPS_WAKEUP_IRQ_REGISTER_MINOR_VERSION 0x1 - -/* Flag to indicate AFE to register APPS wakeup Interrupt */ -#define AFE_APPS_WAKEUP_IRQ_REGISTER_FLAG 1 - -/* Flag to indicate AFE to de-register APPS wakeup Interrupt */ -#define AFE_APPS_WAKEUP_IRQ_DEREGISTER_FLAG 0 - -/* Default interrupt trigger value. */ -#define DEFAULT_SETTINGS 0x00000001 - -/* Interrupt is triggered only if the input signal at the source is high. */ -#define LEVEL_HIGH_TRIGGER 0x00000002 - -/* Interrupt is triggered only if the input signal at the source is low. */ -#define LEVEL_LOW_TRIGGER 0x00000003 - -/* Interrupt is triggered only if the input signal at the source transitions - *from low to high. - */ -#define RISING_EDGE_TRIGGER 0x00000004 - -/* Interrupt is triggered only if the input signal at the source transitions - *from high to low. - */ -#define FALLING_EDGE_TRIGGER 0x00000005 - -/* Macro for invalid trigger type. This should not be used. */ -#define INVALID_TRIGGER 0x00000006 - -#define AFE_EVENT_ID_MBHC_DETECTION_SW_WA 0x1 - -/* @weakgroup weak_afe_svc_cmd_evt_cfg_payload - * - * This is payload of each event that is to be - * registered with AFE service. - */ -struct afe_svc_cmd_evt_cfg_payload { - struct apr_hdr hdr; - - uint32_t event_id; -/* Unique ID of the event. - * - * @values - * -# AFE_EVENT_ID_MBHC_DETECTION_SW_WA - */ - - uint32_t reg_flag; -/* Flag for registering or de-registering an event. - * @values - * - #AFE_SVC_REGISTER_EVENT_FLAG - * - #AFE_SVC_DEREGISTER_EVENT_FLAG - */ -} __packed; - -#define AFE_EVENT_MBHC_DETECTION_SW_WA 0x0001010F - -#define AFE_PORT_CMD_DEVICE_START 0x000100E5 - -/* Payload of the #AFE_PORT_CMD_DEVICE_START.*/ -struct afe_port_cmd_device_start { - struct apr_hdr hdr; - u16 port_id; -/* Port interface and direction (Rx or Tx) to start. An even - * number represents the Rx direction, and an odd number represents - * the Tx direction. - */ - - - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0.*/ - -} __packed; - -#define AFE_PORT_CMD_DEVICE_STOP 0x000100E6 - -/* Payload of the #AFE_PORT_CMD_DEVICE_STOP. */ -struct afe_port_cmd_device_stop { - struct apr_hdr hdr; - u16 port_id; -/* Port interface and direction (Rx or Tx) to start. An even - * number represents the Rx direction, and an odd number represents - * the Tx direction. - */ - - u16 reserved; -/* Reserved for 32-bit alignment. This field must be set to 0.*/ -} __packed; - -#define AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS 0x000100EA - -/* Memory map regions command payload used by the - * #AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS . - * This structure allows clients to map multiple shared memory - * regions in a single command. Following this structure are - * num_regions of afe_service_shared_map_region_payload. - */ -struct afe_service_cmd_shared_mem_map_regions { - struct apr_hdr hdr; -u16 mem_pool_id; -/* Type of memory on which this memory region is mapped. - * Supported values: - * - #ADSP_MEMORY_MAP_EBI_POOL - * - #ADSP_MEMORY_MAP_SMI_POOL - * - #ADSP_MEMORY_MAP_SHMEM8_4K_POOL - * - Other values are reserved - * - * The memory pool ID implicitly defines the characteristics of the - * memory. Characteristics may include alignment type, permissions, - * etc. - * - * ADSP_MEMORY_MAP_EBI_POOL is External Buffer Interface type memory - * ADSP_MEMORY_MAP_SMI_POOL is Shared Memory Interface type memory - * ADSP_MEMORY_MAP_SHMEM8_4K_POOL is shared memory, byte - * addressable, and 4 KB aligned. - */ - - - u16 num_regions; -/* Number of regions to map. - * Supported values: - * - Any value greater than zero - */ - - u32 property_flag; -/* Configures one common property for all the regions in the - * payload. - * - * Supported values: - 0x00000000 to 0x00000001 - * - * b0 - bit 0 indicates physical or virtual mapping 0 Shared memory - * address provided in afe_service_shared_map_region_payloadis a - * physical address. The shared memory needs to be mapped( hardware - * TLB entry) and a software entry needs to be added for internal - * book keeping. - * - * 1 Shared memory address provided in - * afe_service_shared_map_region_payloadis a virtual address. The - * shared memory must not be mapped (since hardware TLB entry is - * already available) but a software entry needs to be added for - * internal book keeping. This can be useful if two services with in - * ADSP is communicating via APR. They can now directly communicate - * via the Virtual address instead of Physical address. The virtual - * regions must be contiguous. num_regions must be 1 in this case. - * - * b31-b1 - reserved bits. must be set to zero - */ - - -} __packed; -/* Map region payload used by the - * afe_service_shared_map_region_payloadstructure. - */ -struct afe_service_shared_map_region_payload { - u32 shm_addr_lsw; -/* least significant word of starting address in the memory - * region to map. It must be contiguous memory, and it must be 4 KB - * aligned. - * Supported values: - Any 32 bit value - */ - - - u32 shm_addr_msw; -/* most significant word of startng address in the memory region - * to map. For 32 bit shared memory address, this field must be set - * to zero. For 36 bit shared memory address, bit31 to bit 4 must be - * set to zero - * - * Supported values: - For 32 bit shared memory address, this field - * must be set to zero. - For 36 bit shared memory address, bit31 to - * bit 4 must be set to zero - For 64 bit shared memory address, any - * 32 bit value - */ - - - u32 mem_size_bytes; -/* Number of bytes in the region. The aDSP will always map the - * regions as virtual contiguous memory, but the memory size must be - * in multiples of 4 KB to avoid gaps in the virtually contiguous - * mapped memory. - * - * Supported values: - multiples of 4KB - */ - -} __packed; - -#define AFE_SERVICE_CMDRSP_SHARED_MEM_MAP_REGIONS 0x000100EB -struct afe_service_cmdrsp_shared_mem_map_regions { - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory attributes is - * returned iff AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS command is - * successful. In the case of failure , a generic APR error response - * is returned to the client. - * - * Supported Values: - Any 32 bit value - */ - -} __packed; -#define AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS 0x000100EC -/* Memory unmap regions command payload used by the - * #AFE_SERVICE_CMD_SHARED_MEM_UNMAP_REGIONS - * - * This structure allows clients to unmap multiple shared memory - * regions in a single command. - */ - - -struct afe_service_cmd_shared_mem_unmap_regions { - struct apr_hdr hdr; -u32 mem_map_handle; -/* memory map handle returned by - * AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS commands - * - * Supported Values: - * - Any 32 bit value - */ -} __packed; - -/* Used by RTAC */ -struct afe_rtac_get_param_v2 { - u16 port_id; -/* Port interface and direction (Rx or Tx) to start. */ - - u16 payload_size; -/* Maximum data size of the parameter ID/module ID combination. - * This is a multiple of four bytes - * Supported values: > 0 - */ - - u32 payload_address_lsw; -/* LSW of 64 bit Payload address. Address should be 32-byte, - * 4kbyte aligned and must be contig memory. - */ - - - u32 payload_address_msw; -/* MSW of 64 bit Payload address. In case of 32-bit shared - * memory address, this field must be set to zero. In case of 36-bit - * shared memory address, bit-4 to bit-31 must be set to zero. - * Address should be 32-byte, 4kbyte aligned and must be contiguous - * memory. - */ - - u32 mem_map_handle; -/* Memory map handle returned by - * AFE_SERVICE_CMD_SHARED_MEM_MAP_REGIONS commands. - * Supported Values: - NULL -- Message. The parameter data is - * in-band. - Non-NULL -- The parameter data is Out-band.Pointer to - * - the physical address in shared memory of the payload data. - * For detailed payload content, see the afe_port_param_data_v2 - * structure - */ - - - u32 module_id; -/* ID of the module to be queried. - * Supported values: Valid module ID - */ - - u32 param_id; -/* ID of the parameter to be queried. - * Supported values: Valid parameter ID - */ -} __packed; - -#define AFE_PORT_CMD_GET_PARAM_V2 0x000100F0 - -/* Payload of the #AFE_PORT_CMD_GET_PARAM_V2 command, - * which queries for one post/preprocessing parameter of a - * stream. - */ -struct afe_port_cmd_get_param_v2 { - struct apr_hdr apr_hdr; - - /* Port interface and direction (Rx or Tx) to start. */ - u16 port_id; - - /* Maximum data size of the parameter ID/module ID combination. - * This is a multiple of four bytes - * Supported values: > 0 - */ - u16 payload_size; - - /* The memory mapping header to be used when requesting outband */ - struct mem_mapping_hdr mem_hdr; - - /* The module ID of the parameter data requested */ - u32 module_id; - - /* The parameter ID of the parameter data requested */ - u32 param_id; - - /* The header information for the parameter data */ - struct param_hdr_v1 param_hdr; -} __packed; - -#define AFE_PORT_CMDRSP_GET_PARAM_V2 0x00010106 - -/* Payload of the #AFE_PORT_CMDRSP_GET_PARAM_V2 message, which - * responds to an #AFE_PORT_CMD_GET_PARAM_V2 command. - * - * Immediately following this structure is the parameters structure - * (afe_port_param_data) containing the response(acknowledgment) - * parameter payload. This payload is included for an in-band - * scenario. For an address/shared memory-based set parameter, this - * payload is not needed. - */ - - -struct afe_port_cmdrsp_get_param_v2 { - u32 status; - struct param_hdr_v1 param_hdr; - u8 param_data[0]; -} __packed; - -#define AFE_PORT_CMD_GET_PARAM_V3 0x000100FB -struct afe_port_cmd_get_param_v3 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* Port ID of the AFE port to configure. Port interface and direction - * (Rx or Tx) to configure. An even number represents the Rx direction, - * and an odd number represents the Tx direction. - */ - u16 port_id; - - /* Reserved. This field must be set to zero. */ - u16 reserved; - - /* The memory mapping header to be used when requesting outband */ - struct mem_mapping_hdr mem_hdr; - - /* The header information for the parameter data */ - struct param_hdr_v3 param_hdr; -} __packed; - -#define AFE_PORT_CMDRSP_GET_PARAM_V3 0x00010108 -struct afe_port_cmdrsp_get_param_v3 { - /* The status of the command */ - uint32_t status; - - /* The header information for the parameter data */ - struct param_hdr_v3 param_hdr; - - /* The parameter data to be filled when sent inband */ - u8 param_data[0]; -} __packed; - -#define AFE_PARAM_ID_LPASS_CORE_SHARED_CLOCK_CONFIG 0x0001028C -#define AFE_API_VERSION_LPASS_CORE_SHARED_CLK_CONFIG 0x1 - -/* Payload of the AFE_PARAM_ID_LPASS_CORE_SHARED_CLOCK_CONFIG parameter used by - * AFE_MODULE_AUDIO_DEV_INTERFACE. - */ -struct afe_param_id_lpass_core_shared_clk_cfg { - u32 lpass_core_shared_clk_cfg_minor_version; -/* - * Minor version used for lpass core shared clock configuration - * Supported value: AFE_API_VERSION_LPASS_CORE_SHARED_CLK_CONFIG - */ - u32 enable; -/* - * Specifies whether the lpass core shared clock is - * enabled (1) or disabled (0). - */ -} __packed; - -/* adsp_afe_service_commands.h */ - -#define ADSP_MEMORY_MAP_EBI_POOL 0 - -#define ADSP_MEMORY_MAP_SMI_POOL 1 -#define ADSP_MEMORY_MAP_IMEM_POOL 2 -#define ADSP_MEMORY_MAP_SHMEM8_4K_POOL 3 -#define ADSP_MEMORY_MAP_MDF_SHMEM_4K_POOL 4 - -/* Definition of virtual memory flag */ -#define ADSP_MEMORY_MAP_VIRTUAL_MEMORY 1 - -/* Definition of physical memory flag */ -#define ADSP_MEMORY_MAP_PHYSICAL_MEMORY 0 - -#define NULL_POPP_TOPOLOGY 0x00010C68 -#define NULL_COPP_TOPOLOGY 0x00010312 -#define DEFAULT_COPP_TOPOLOGY 0x00010314 -#define DEFAULT_POPP_TOPOLOGY 0x00010BE4 -#define COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY 0x0001076B -#define COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY 0x00010774 -#define VPM_TX_SM_ECNS_V2_COPP_TOPOLOGY 0x00010F89 -#define VPM_TX_VOICE_SMECNS_V2_COPP_TOPOLOGY 0x10000003 -#define VPM_TX_DM_FLUENCE_COPP_TOPOLOGY 0x00010F72 -#define VPM_TX_QMIC_FLUENCE_COPP_TOPOLOGY 0x00010F75 -#define VPM_TX_DM_RFECNS_COPP_TOPOLOGY 0x00010F86 -#define ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX 0x10015002 -#define ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE 0x10028000 -#define VPM_TX_DM_FLUENCE_EF_COPP_TOPOLOGY 0x10000005 -#define ADM_TOPOLOGY_ID_AUDIO_RX_FVSAM 0x1000FFF0 - -/* Memory map regions command payload used by the - * #ASM_CMD_SHARED_MEM_MAP_REGIONS ,#ADM_CMD_SHARED_MEM_MAP_REGIONS - * commands. - * - * This structure allows clients to map multiple shared memory - * regions in a single command. Following this structure are - * num_regions of avs_shared_map_region_payload. - */ - - -struct avs_cmd_shared_mem_map_regions { - struct apr_hdr hdr; - u16 mem_pool_id; -/* Type of memory on which this memory region is mapped. - * - * Supported values: - #ADSP_MEMORY_MAP_EBI_POOL - - * #ADSP_MEMORY_MAP_SMI_POOL - #ADSP_MEMORY_MAP_IMEM_POOL - * (unsupported) - #ADSP_MEMORY_MAP_SHMEM8_4K_POOL - Other values - * are reserved - * - * The memory ID implicitly defines the characteristics of the - * memory. Characteristics may include alignment type, permissions, - * etc. - * - * SHMEM8_4K is shared memory, byte addressable, and 4 KB aligned. - */ - - - u16 num_regions; - /* Number of regions to map.*/ - - u32 property_flag; -/* Configures one common property for all the regions in the - * payload. No two regions in the same memory map regions cmd can - * have differnt property. Supported values: - 0x00000000 to - * 0x00000001 - * - * b0 - bit 0 indicates physical or virtual mapping 0 shared memory - * address provided in avs_shared_map_regions_payload is physical - * address. The shared memory needs to be mapped( hardware TLB - * entry) - * - * and a software entry needs to be added for internal book keeping. - * - * 1 Shared memory address provided in MayPayload[usRegions] is - * virtual address. The shared memory must not be mapped (since - * hardware TLB entry is already available) but a software entry - * needs to be added for internal book keeping. This can be useful - * if two services with in ADSP is communicating via APR. They can - * now directly communicate via the Virtual address instead of - * Physical address. The virtual regions must be contiguous. - * - * b31-b1 - reserved bits. must be set to zero - */ - -} __packed; - -struct avs_shared_map_region_payload { - u32 shm_addr_lsw; -/* least significant word of shared memory address of the memory - * region to map. It must be contiguous memory, and it must be 4 KB - * aligned. - */ - - u32 shm_addr_msw; -/* most significant word of shared memory address of the memory - * region to map. For 32 bit shared memory address, this field must - * tbe set to zero. For 36 bit shared memory address, bit31 to bit 4 - * must be set to zero - */ - - u32 mem_size_bytes; -/* Number of bytes in the region. - * - * The aDSP will always map the regions as virtual contiguous - * memory, but the memory size must be in multiples of 4 KB to avoid - * gaps in the virtually contiguous mapped memory. - */ - -} __packed; - -struct avs_cmd_shared_mem_unmap_regions { - struct apr_hdr hdr; - u32 mem_map_handle; -/* memory map handle returned by ASM_CMD_SHARED_MEM_MAP_REGIONS - * , ADM_CMD_SHARED_MEM_MAP_REGIONS, commands - */ - -} __packed; - -/* Memory map command response payload used by the - * #ASM_CMDRSP_SHARED_MEM_MAP_REGIONS - * ,#ADM_CMDRSP_SHARED_MEM_MAP_REGIONS - */ - - -struct avs_cmdrsp_shared_mem_map_regions { - u32 mem_map_handle; -/* A memory map handle encapsulating shared memory attributes is - * returned - */ - -} __packed; - -#define AVS_MDF_MDSP_PROC_ID 0x2 -#define AVS_MDF_SSC_PROC_ID 0x3 -#define AVS_MDF_CDSP_PROC_ID 0x4 - -/* Shared memory map command payload used by the - * #AVCS_CMD_MAP_MDF_SHARED_MEMORY. - * - * This structure allows clients to map multiple shared memory - * regions with remote processor ID. All mapped regions must be - * from the same memory pool. Following this structure are - * num_regions of avs_shared_map_region_payload. - */ -struct avs_cmd_map_mdf_shared_memory { - struct apr_hdr hdr; - uint32_t mem_map_handle; -/* Unique identifier for the shared memory address. - * - * The aDSP returns this handle for - * #AVCS_CMD_SHARED_MEM_MAP_REGIONS - * - * Supported values: - * Any 32-bit value - * - * The aDSP uses this handle to retrieve the shared memory - * attributes. This handle can be an abstract representation - * of the shared memory regions that are being mapped. - */ - - uint32_t proc_id; -/* Supported values: - * #AVS_MDF_MDSP_PROC_ID - * #AVS_MDF_SSC_PROC_ID - * #AVS_MDF_CDSP_PROC_ID - */ - - uint32_t num_regions; -/* Number of regions to be mapped with the remote DSP processor - * mentioned by proc_id field. - * - * Array of structures of avs_shared_map_region_payload will follow. - * The address fields in those arrays should correspond to the remote - * processor mentioned by proc_id. - * In case of DSPs with SMMU enabled, the address should be IOVA. - * And for DSPs without SMMU, the address should be physical address. - */ -} __packed; - -/*adsp_audio_memmap_api.h*/ - -/* ASM related data structures */ -struct asm_wma_cfg { - u16 format_tag; - u16 ch_cfg; - u32 sample_rate; - u32 avg_bytes_per_sec; - u16 block_align; - u16 valid_bits_per_sample; - u32 ch_mask; - u16 encode_opt; - u16 adv_encode_opt; - u32 adv_encode_opt2; - u32 drc_peak_ref; - u32 drc_peak_target; - u32 drc_ave_ref; - u32 drc_ave_target; -} __packed; - -struct asm_wmapro_cfg { - u16 format_tag; - u16 ch_cfg; - u32 sample_rate; - u32 avg_bytes_per_sec; - u16 block_align; - u16 valid_bits_per_sample; - u32 ch_mask; - u16 encode_opt; - u16 adv_encode_opt; - u32 adv_encode_opt2; - u32 drc_peak_ref; - u32 drc_peak_target; - u32 drc_ave_ref; - u32 drc_ave_target; -} __packed; - -struct asm_aac_cfg { - u16 format; - u16 aot; - u16 ep_config; - u16 section_data_resilience; - u16 scalefactor_data_resilience; - u16 spectral_data_resilience; - u16 ch_cfg; - u16 reserved; - u32 sample_rate; -} __packed; - -struct asm_amrwbplus_cfg { - u32 size_bytes; - u32 version; - u32 num_channels; - u32 amr_band_mode; - u32 amr_dtx_mode; - u32 amr_frame_fmt; - u32 amr_lsf_idx; -} __packed; - -struct asm_flac_cfg { - u32 sample_rate; - u32 ext_sample_rate; - u32 min_frame_size; - u32 max_frame_size; - u16 stream_info_present; - u16 min_blk_size; - u16 max_blk_size; - u16 ch_cfg; - u16 sample_size; - u16 md5_sum; -}; - -struct asm_alac_cfg { - u32 frame_length; - u8 compatible_version; - u8 bit_depth; - u8 pb; - u8 mb; - u8 kb; - u8 num_channels; - u16 max_run; - u32 max_frame_bytes; - u32 avg_bit_rate; - u32 sample_rate; - u32 channel_layout_tag; -}; - -struct asm_g711_dec_cfg { - u32 sample_rate; -}; - -struct asm_vorbis_cfg { - u32 bit_stream_fmt; -}; - -struct asm_ape_cfg { - u16 compatible_version; - u16 compression_level; - u32 format_flags; - u32 blocks_per_frame; - u32 final_frame_blocks; - u32 total_frames; - u16 bits_per_sample; - u16 num_channels; - u32 sample_rate; - u32 seek_table_present; -}; - -struct asm_dsd_cfg { - u16 num_version; - u16 is_bitwise_big_endian; - u16 dsd_channel_block_size; - u16 num_channels; - u8 channel_mapping[8]; - u32 dsd_data_rate; -}; - -struct asm_softpause_params { - u32 enable; - u32 period; - u32 step; - u32 rampingcurve; -} __packed; - -struct asm_softvolume_params { - u32 period; - u32 step; - u32 rampingcurve; -} __packed; - -#define ASM_END_POINT_DEVICE_MATRIX 0 - -#define PCM_CHANNEL_NULL 0 - -/* Front left channel. */ -#define PCM_CHANNEL_FL 1 - -/* Front right channel. */ -#define PCM_CHANNEL_FR 2 - -/* Front center channel. */ -#define PCM_CHANNEL_FC 3 - -/* Left surround channel.*/ -#define PCM_CHANNEL_LS 4 - -/* Right surround channel.*/ -#define PCM_CHANNEL_RS 5 - -/* Low frequency effect channel. */ -#define PCM_CHANNEL_LFE 6 - -/* Center surround channel; Rear center channel. */ -#define PCM_CHANNEL_CS 7 - -/* Left back channel; Rear left channel. */ -#define PCM_CHANNEL_LB 8 - -/* Right back channel; Rear right channel. */ -#define PCM_CHANNEL_RB 9 - -/* Top surround channel. */ -#define PCM_CHANNELS 10 - -/* Center vertical height channel.*/ -#define PCM_CHANNEL_CVH 11 - -/* Mono surround channel.*/ -#define PCM_CHANNEL_MS 12 - -/* Front left of center. */ -#define PCM_CHANNEL_FLC 13 - -/* Front right of center. */ -#define PCM_CHANNEL_FRC 14 - -/* Rear left of center. */ -#define PCM_CHANNEL_RLC 15 - -/* Rear right of center. */ -#define PCM_CHANNEL_RRC 16 - -/* Second low frequency channel. */ -#define PCM_CHANNEL_LFE2 17 - -/* Side left channel. */ -#define PCM_CHANNEL_SL 18 - -/* Side right channel. */ -#define PCM_CHANNEL_SR 19 - -/* Top front left channel. */ -#define PCM_CHANNEL_TFL 20 - -/* Left vertical height channel. */ -#define PCM_CHANNEL_LVH 20 - -/* Top front right channel. */ -#define PCM_CHANNEL_TFR 21 - -/* Right vertical height channel. */ -#define PCM_CHANNEL_RVH 21 - -/* Top center channel. */ -#define PCM_CHANNEL_TC 22 - -/* Top back left channel. */ -#define PCM_CHANNEL_TBL 23 - -/* Top back right channel. */ -#define PCM_CHANNEL_TBR 24 - -/* Top side left channel. */ -#define PCM_CHANNEL_TSL 25 - -/* Top side right channel. */ -#define PCM_CHANNEL_TSR 26 - -/* Top back center channel. */ -#define PCM_CHANNEL_TBC 27 - -/* Bottom front center channel. */ -#define PCM_CHANNEL_BFC 28 - -/* Bottom front left channel. */ -#define PCM_CHANNEL_BFL 29 - -/* Bottom front right channel. */ -#define PCM_CHANNEL_BFR 30 - -/* Left wide channel. */ -#define PCM_CHANNEL_LW 31 - -/* Right wide channel. */ -#define PCM_CHANNEL_RW 32 - -/* Left side direct channel. */ -#define PCM_CHANNEL_LSD 33 - -/* Right side direct channel. Update PCM_MAX_CHMAP_ID when - * this list is extended. - */ -#define PCM_CHANNEL_RSD 34 - -/* Max valid channel map index */ -#define PCM_MAX_CHMAP_ID PCM_CHANNEL_RSD - -#define PCM_FORMAT_MAX_NUM_CHANNEL 8 -#define PCM_FORMAT_MAX_CHANNELS_9 9 - -/* Used for ADM_CMD_DEVICE_OPEN_V8 */ -#define PCM_FORMAT_MAX_NUM_CHANNEL_V8 32 - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 0x00010DA5 - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 0x00010DDC - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 0x0001320C - -#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 0x00013222 - -#define ASM_MEDIA_FMT_EVRCB_FS 0x00010BEF - -#define ASM_MEDIA_FMT_EVRCWB_FS 0x00010BF0 - -#define ASM_MEDIA_FMT_GENERIC_COMPRESSED 0x00013212 - -#define ASM_MAX_EQ_BANDS 12 - -#define ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2 0x00010D98 - -struct asm_data_cmd_media_fmt_update_v2 { -u32 fmt_blk_size; - /* Media format block size in bytes.*/ -} __packed; - -struct asm_generic_compressed_fmt_blk_t { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - - /* - * Channel mapping array of bitstream output. - * Channel[i] mapping describes channel i inside the buffer, where - * i < num_channels. All valid used channels must be - * present at the beginning of the array. - */ - uint8_t channel_mapping[8]; - - /* - * Number of channels of the incoming bitstream. - * Supported values: 1,2,3,4,5,6,7,8 - */ - uint16_t num_channels; - - /* - * Nominal bits per sample value of the incoming bitstream. - * Supported values: 16, 32 - */ - uint16_t bits_per_sample; - - /* - * Nominal sampling rate of the incoming bitstream. - * Supported values: 8000, 11025, 16000, 22050, 24000, 32000, - * 44100, 48000, 88200, 96000, 176400, 192000, - * 352800, 384000 - */ - uint32_t sampling_rate; - -} __packed; - - -/* Command to send sample rate & channels for IEC61937 (compressed) or IEC60958 - * (pcm) streams. Both audio standards use the same format and are used for - * HDMI or SPDIF output. - */ -#define ASM_DATA_CMD_IEC_60958_MEDIA_FMT 0x0001321E - -struct asm_iec_compressed_fmt_blk_t { - struct apr_hdr hdr; - - /* - * Nominal sampling rate of the incoming bitstream. - * Supported values: 8000, 11025, 16000, 22050, 24000, 32000, - * 44100, 48000, 88200, 96000, 176400, 192000, - * 352800, 384000 - */ - uint32_t sampling_rate; - - /* - * Number of channels of the incoming bitstream. - * Supported values: 1,2,3,4,5,6,7,8 - */ - uint32_t num_channels; - -} __packed; - -struct asm_multi_channel_pcm_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - - u16 num_channels; - /* Number of channels. Supported values: 1 to 8 */ - u16 bits_per_sample; -/* Number of bits per sample per channel. * Supported values: - * 16, 24 * When used for playback, the client must send 24-bit - * samples packed in 32-bit words. The 24-bit samples must be placed - * in the most significant 24 bits of the 32-bit word. When used for - * recording, the aDSP sends 24-bit samples packed in 32-bit words. - * The 24-bit samples are placed in the most significant 24 bits of - * the 32-bit word. - */ - - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * Supported values: 2000 to 48000 - */ - - u16 is_signed; - /* Flag that indicates the samples are signed (1). */ - - u16 reserved; - /* reserved field for 32 bit alignment. must be set to zero. */ - - u8 channel_mapping[8]; -/* Channel array of size 8. - * Supported values: - * - #PCM_CHANNEL_L - * - #PCM_CHANNEL_R - * - #PCM_CHANNEL_C - * - #PCM_CHANNEL_LS - * - #PCM_CHANNEL_RS - * - #PCM_CHANNEL_LFE - * - #PCM_CHANNEL_CS - * - #PCM_CHANNEL_LB - * - #PCM_CHANNEL_RB - * - #PCM_CHANNELS - * - #PCM_CHANNEL_CVH - * - #PCM_CHANNEL_MS - * - #PCM_CHANNEL_FLC - * - #PCM_CHANNEL_FRC - * - #PCM_CHANNEL_RLC - * - #PCM_CHANNEL_RRC - * - * Channel[i] mapping describes channel I. Each element i of the - * array describes channel I inside the buffer where 0 @le I < - * num_channels. An unused channel is set to zero. - */ -} __packed; - -struct asm_multi_channel_pcm_fmt_blk_v3 { - uint16_t num_channels; -/* - * Number of channels - * Supported values: 1 to 8 - */ - - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel - * Supported values: 16, 24 - */ - - uint32_t sample_rate; -/* - * Number of samples per second - * Supported values: 2000 to 48000, 96000,192000 Hz - */ - - uint16_t is_signed; -/* Flag that indicates that PCM samples are signed (1) */ - - uint16_t sample_word_size; -/* - * Size in bits of the word that holds a sample of a channel. - * Supported values: 12,24,32 - */ - - uint8_t channel_mapping[8]; -/* - * Each element, i, in the array describes channel i inside the buffer where - * 0 <= i < num_channels. Unused channels are set to 0. - */ -} __packed; - -struct asm_multi_channel_pcm_fmt_blk_v4 { - uint16_t num_channels; -/* - * Number of channels - * Supported values: 1 to 8 - */ - - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel - * Supported values: 16, 24, 32 - */ - - uint32_t sample_rate; -/* - * Number of samples per second - * Supported values: 2000 to 48000, 96000,192000 Hz - */ - - uint16_t is_signed; -/* Flag that indicates that PCM samples are signed (1) */ - - uint16_t sample_word_size; -/* - * Size in bits of the word that holds a sample of a channel. - * Supported values: 12,24,32 - */ - - uint8_t channel_mapping[8]; -/* - * Each element, i, in the array describes channel i inside the buffer where - * 0 <= i < num_channels. Unused channels are set to 0. - */ - uint16_t endianness; -/* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; -/* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - * 31 - for 24b unpacked or 32bit - */ -} __packed; - - -struct asm_multi_channel_pcm_fmt_blk_v5 { - uint16_t num_channels; -/* - * Number of channels - * Supported values: 1 to 32 - */ - - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel - * Supported values: 16, 24, 32 - */ - - uint32_t sample_rate; -/* - * Number of samples per second - * Supported values: 2000 to 48000, 96000,192000 Hz - */ - - uint16_t is_signed; -/* Flag that indicates that PCM samples are signed (1) */ - - uint16_t sample_word_size; -/* - * Size in bits of the word that holds a sample of a channel. - * Supported values: 12,24,32 - */ - uint16_t endianness; -/* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; -/* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - * 31 - for 24b unpacked or 32bit - */ - - uint8_t channel_mapping[32]; -/* - * Each element, i, in the array describes channel i inside the buffer where - * 0 <= i < num_channels. Unused channels are set to 0. - */ -} __packed; -/* - * Payload of the multichannel PCM configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 media format. - */ -struct asm_multi_channel_pcm_fmt_blk_param_v3 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - struct asm_multi_channel_pcm_fmt_blk_v3 param; -} __packed; - -/* - * Payload of the multichannel PCM configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 media format. - */ -struct asm_multi_channel_pcm_fmt_blk_param_v4 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - struct asm_multi_channel_pcm_fmt_blk_v4 param; -} __packed; - -/* - * Payload of the multichannel PCM configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 media format. - */ -struct asm_multi_channel_pcm_fmt_blk_param_v5 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - struct asm_multi_channel_pcm_fmt_blk_v5 param; -} __packed; - -struct asm_stream_cmd_set_encdec_param { - u32 param_id; - /* ID of the parameter. */ - - u32 param_size; -/* Data size of this parameter, in bytes. The size is a multiple - * of 4 bytes. - */ - -} __packed; - -struct asm_enc_cfg_blk_param_v2 { - u32 frames_per_buf; -/* Number of encoded frames to pack into each buffer. - * - * @note1hang This is only guidance information for the aDSP. The - * number of encoded frames put into each buffer (specified by the - * client) is less than or equal to this number. - */ - - u32 enc_cfg_blk_size; -/* Size in bytes of the encoder configuration block that follows - * this member. - */ - -} __packed; - -struct asm_custom_enc_cfg_t_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint32_t sample_rate; - - uint16_t num_channels; - uint16_t reserved; - /* num_ch == 1, then PCM_CHANNEL_C, - * num_ch == 2, then {PCM_CHANNEL_L, PCM_CHANNEL_R} - */ - uint8_t channel_mapping[8]; - uint32_t custom_size; - uint8_t custom_data[15]; -} __packed; - -/* @brief Dolby Digital Plus end point configuration structure - */ -struct asm_dec_ddp_endp_param_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - int endp_param_value; -} __packed; - -/* - * Payload of the multichannel PCM encoder configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 media format. - */ -struct asm_multi_channel_pcm_enc_cfg_v5 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; -/* - * Number of PCM channels. - * @values - * - 0 -- Native mode - * - 1 -- 8 channels - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - */ - uint16_t bits_per_sample; -/* - * Number of bits per sample per channel. - * @values 16, 24 - */ - uint32_t sample_rate; -/* - * Number of samples per second. - * @values 0, 8000 to 48000 Hz - * A value of 0 indicates the native sampling rate. Encoding is - * performed at the input sampling rate. - */ - uint16_t is_signed; -/* - * Flag that indicates the PCM samples are signed (1). Currently, only - * signed PCM samples are supported. - */ - uint16_t sample_word_size; -/* - * The size in bits of the word that holds a sample of a channel. - * @values 16, 24, 32 - * 16-bit samples are always placed in 16-bit words: - * sample_word_size = 1. - * 24-bit samples can be placed in 32-bit words or in consecutive - * 24-bit words. - * - If sample_word_size = 32, 24-bit samples are placed in the - * most significant 24 bits of a 32-bit word. - * - If sample_word_size = 24, 24-bit samples are placed in - * 24-bit words. @tablebulletend - */ - uint16_t endianness; -/* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; -/* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - */ - uint8_t channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL_V8]; -/* - * Channel mapping array expected at the encoder output. - * Channel[i] mapping describes channel i inside the buffer, where - * 0 @le i < num_channels. All valid used channels must be present at - * the beginning of the array. - * If Native mode is set for the channels, this field is ignored. - * @values See Section @xref{dox:PcmChannelDefs} - */ -} __packed; - -/* - * Payload of the multichannel PCM encoder configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 media format. - */ - -struct asm_multi_channel_pcm_enc_cfg_v4 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; - /* - * Number of PCM channels. - * @values - * - 0 -- Native mode - * - 1 -- 8 channels - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - */ - uint16_t bits_per_sample; - /* - * Number of bits per sample per channel. - * @values 16, 24 - */ - uint32_t sample_rate; - /* - * Number of samples per second. - * @values 0, 8000 to 48000 Hz - * A value of 0 indicates the native sampling rate. Encoding is - * performed at the input sampling rate. - */ - uint16_t is_signed; - /* - * Flag that indicates the PCM samples are signed (1). Currently, only - * signed PCM samples are supported. - */ - uint16_t sample_word_size; - /* - * The size in bits of the word that holds a sample of a channel. - * @values 16, 24, 32 - * 16-bit samples are always placed in 16-bit words: - * sample_word_size = 1. - * 24-bit samples can be placed in 32-bit words or in consecutive - * 24-bit words. - * - If sample_word_size = 32, 24-bit samples are placed in the - * most significant 24 bits of a 32-bit word. - * - If sample_word_size = 24, 24-bit samples are placed in - * 24-bit words. @tablebulletend - */ - uint8_t channel_mapping[8]; - /* - * Channel mapping array expected at the encoder output. - * Channel[i] mapping describes channel i inside the buffer, where - * 0 @le i < num_channels. All valid used channels must be present at - * the beginning of the array. - * If Native mode is set for the channels, this field is ignored. - * @values See Section @xref{dox:PcmChannelDefs} - */ - uint16_t endianness; - /* - * Flag to indicate the endianness of the pcm sample - * Supported values: 0 - Little endian (all other formats) - * 1 - Big endian (AIFF) - */ - uint16_t mode; - /* - * Mode to provide additional info about the pcm input data. - * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b, - * Q31 for unpacked 24b or 32b) - * 15 - for 16 bit - * 23 - for 24b packed or 8.24 format - * 31 - for 24b unpacked or 32bit - */ -} __packed; - -/* - * Payload of the multichannel PCM encoder configuration parameters in - * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 media format. - */ - -struct asm_multi_channel_pcm_enc_cfg_v3 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; - /* - * Number of PCM channels. - * @values - * - 0 -- Native mode - * - 1 -- 8 channels - * Native mode indicates that encoding must be performed with the number - * of channels at the input. - */ - uint16_t bits_per_sample; - /* - * Number of bits per sample per channel. - * @values 16, 24 - */ - uint32_t sample_rate; - /* - * Number of samples per second. - * @values 0, 8000 to 48000 Hz - * A value of 0 indicates the native sampling rate. Encoding is - * performed at the input sampling rate. - */ - uint16_t is_signed; - /* - * Flag that indicates the PCM samples are signed (1). Currently, only - * signed PCM samples are supported. - */ - uint16_t sample_word_size; - /* - * The size in bits of the word that holds a sample of a channel. - * @values 16, 24, 32 - * 16-bit samples are always placed in 16-bit words: - * sample_word_size = 1. - * 24-bit samples can be placed in 32-bit words or in consecutive - * 24-bit words. - * - If sample_word_size = 32, 24-bit samples are placed in the - * most significant 24 bits of a 32-bit word. - * - If sample_word_size = 24, 24-bit samples are placed in - * 24-bit words. @tablebulletend - */ - uint8_t channel_mapping[8]; - /* - * Channel mapping array expected at the encoder output. - * Channel[i] mapping describes channel i inside the buffer, where - * 0 @le i < num_channels. All valid used channels must be present at - * the beginning of the array. - * If Native mode is set for the channels, this field is ignored. - * @values See Section @xref{dox:PcmChannelDefs} - */ -}; - -/* @brief Multichannel PCM encoder configuration structure used - * in the #ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2 command. - */ - -struct asm_multi_channel_pcm_enc_cfg_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - uint16_t num_channels; -/*< Number of PCM channels. - * - * Supported values: - 0 -- Native mode - 1 -- 8 Native mode - * indicates that encoding must be performed with the number of - * channels at the input. - */ - - uint16_t bits_per_sample; -/*< Number of bits per sample per channel. - * Supported values: 16, 24 - */ - - uint32_t sample_rate; -/*< Number of samples per second (in Hertz). - * - * Supported values: 0, 8000 to 48000 A value of 0 indicates the - * native sampling rate. Encoding is performed at the input sampling - * rate. - */ - - uint16_t is_signed; -/*< Specifies whether the samples are signed (1). Currently, - * only signed samples are supported. - */ - - uint16_t reserved; -/*< reserved field for 32 bit alignment. must be set to zero.*/ - - - uint8_t channel_mapping[8]; -} __packed; - -#define ASM_MEDIA_FMT_MP3 0x00010BE9 -#define ASM_MEDIA_FMT_AAC_V2 0x00010DA6 - -/* @xreflabel - * {hdr:AsmMediaFmtDolbyAac} Media format ID for the - * Dolby AAC decoder. This format ID is be used if the client wants - * to use the Dolby AAC decoder to decode MPEG2 and MPEG4 AAC - * contents. - */ - -#define ASM_MEDIA_FMT_DOLBY_AAC 0x00010D86 - -/* Enumeration for the audio data transport stream AAC format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS 0 - -/* Enumeration for low overhead audio stream AAC format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LOAS 1 - -/* Enumeration for the audio data interchange format - * AAC format. - */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADIF 2 - -/* Enumeration for the raw AAC format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW 3 - -/* Enumeration for the AAC LATM format. */ -#define ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LATM 4 - -#define ASM_MEDIA_FMT_AAC_AOT_LC 2 -#define ASM_MEDIA_FMT_AAC_AOT_SBR 5 -#define ASM_MEDIA_FMT_AAC_AOT_PS 29 -#define ASM_MEDIA_FMT_AAC_AOT_BSAC 22 - -struct asm_aac_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmt_blk; - - u16 aac_fmt_flag; -/* Bitstream format option. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_LOAS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADIF - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - */ - - u16 audio_objype; -/* Audio Object Type (AOT) present in the AAC stream. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_AOT_LC - * - #ASM_MEDIA_FMT_AAC_AOT_SBR - * - #ASM_MEDIA_FMT_AAC_AOT_BSAC - * - #ASM_MEDIA_FMT_AAC_AOT_PS - * - Otherwise -- Not supported - */ - - u16 channel_config; -/* Number of channels present in the AAC stream. - * Supported values: - * - 1 -- Mono - * - 2 -- Stereo - * - 6 -- 5.1 content - */ - - u16 total_size_of_PCE_bits; -/* greater or equal to zero. * -In case of RAW formats and - * channel config = 0 (PCE), client can send * the bit stream - * containing PCE immediately following this structure * (in-band). - * -This number does not include bits included for 32 bit alignment. - * -If zero, then the PCE info is assumed to be available in the - * audio -bit stream & not in-band. - */ - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * - * Supported values: 8000, 11025, 12000, 16000, 22050, 24000, 32000, - * 44100, 48000 - * - * This field must be equal to the sample rate of the AAC-LC - * decoder's output. - For MP4 or 3GP containers, this is indicated - * by the samplingFrequencyIndex field in the AudioSpecificConfig - * element. - For ADTS format, this is indicated by the - * samplingFrequencyIndex in the ADTS fixed header. - For ADIF - * format, this is indicated by the samplingFrequencyIndex in the - * program_config_element present in the ADIF header. - */ - -} __packed; - -struct asm_aac_enc_cfg_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u32 bit_rate; - /* Encoding rate in bits per second. */ - u32 enc_mode; -/* Encoding mode. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_AOT_LC - * - #ASM_MEDIA_FMT_AAC_AOT_SBR - * - #ASM_MEDIA_FMT_AAC_AOT_PS - */ - u16 aac_fmt_flag; -/* AAC format flag. - * Supported values: - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_ADTS - * - #ASM_MEDIA_FMT_AAC_FORMAT_FLAG_RAW - */ - u16 channel_cfg; -/* Number of channels to encode. - * Supported values: - * - 0 -- Native mode - * - 1 -- Mono - * - 2 -- Stereo - * - Other values are not supported. - * @note1hang The eAAC+ encoder mode supports only stereo. - * Native mode indicates that encoding must be performed with the - * number of channels at the input. - * The number of channels must not change during encoding. - */ - - u32 sample_rate; -/* Number of samples per second. - * Supported values: - 0 -- Native mode - For other values, - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - -} __packed; - -#define ASM_MEDIA_FMT_G711_ALAW_FS 0x00010BF7 -#define ASM_MEDIA_FMT_G711_MLAW_FS 0x00010C2E - -struct asm_g711_enc_cfg_v2 { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u32 sample_rate; -/* - * Number of samples per second. - * Supported values: 8000, 16000 Hz - */ - -} __packed; - -struct asm_vorbis_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u32 bit_stream_fmt; -/* Bit stream format. - * Supported values: - * - 0 -- Raw bitstream - * - 1 -- Transcoded bitstream - * - * Transcoded bitstream containing the size of the frame as the first - * word in each frame. - */ - -} __packed; - -struct asm_flac_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 is_stream_info_present; -/* Specifies whether stream information is present in the FLAC format - * block. - * - * Supported values: - * - 0 -- Stream information is not present in this message - * - 1 -- Stream information is present in this message - * - * When set to 1, the FLAC bitstream was successfully parsed by the - * client, and other fields in the FLAC format block can be read by the - * decoder to get metadata stream information. - */ - - u16 num_channels; -/* Number of channels for decoding. - * Supported values: 1 to 2 - */ - - u16 min_blk_size; -/* Minimum block size (in samples) used in the stream. It must be less - * than or equal to max_blk_size. - */ - - u16 max_blk_size; -/* Maximum block size (in samples) used in the stream. If the - * minimum block size equals the maximum block size, a fixed block - * size stream is implied. - */ - - u16 md5_sum[8]; -/* MD5 signature array of the unencoded audio data. This allows the - * decoder to determine if an error exists in the audio data, even when - * the error does not result in an invalid bitstream. - */ - - u32 sample_rate; -/* Number of samples per second. - * Supported values: 8000 to 48000 Hz - */ - - u32 min_frame_size; -/* Minimum frame size used in the stream. - * Supported values: - * - > 0 bytes - * - 0 -- The value is unknown - */ - - u32 max_frame_size; -/* Maximum frame size used in the stream. - * Supported values: - * -- > 0 bytes - * -- 0 . The value is unknown - */ - - u16 sample_size; -/* Bits per sample.Supported values: 8, 16 */ - - u16 reserved; -/* Clients must set this field to zero - */ - -} __packed; - -struct asm_alac_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u32 frame_length; - u8 compatible_version; - u8 bit_depth; - u8 pb; - u8 mb; - u8 kb; - u8 num_channels; - u16 max_run; - u32 max_frame_bytes; - u32 avg_bit_rate; - u32 sample_rate; - u32 channel_layout_tag; - -} __packed; - -struct asm_g711_dec_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u32 sample_rate; -} __packed; - -struct asm_ape_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 compatible_version; - u16 compression_level; - u32 format_flags; - u32 blocks_per_frame; - u32 final_frame_blocks; - u32 total_frames; - u16 bits_per_sample; - u16 num_channels; - u32 sample_rate; - u32 seek_table_present; - -} __packed; - -struct asm_dsd_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 num_version; - u16 is_bitwise_big_endian; - u16 dsd_channel_block_size; - u16 num_channels; - u8 channel_mapping[8]; - u32 dsd_data_rate; - -} __packed; - -#define ASM_MEDIA_FMT_AMRNB_FS 0x00010BEB - -/* Enumeration for 4.75 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MR475 0 - -/* Enumeration for 5.15 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MR515 1 - -/* Enumeration for 5.90 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR59 2 - -/* Enumeration for 6.70 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR67 3 - -/* Enumeration for 7.40 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR74 4 - -/* Enumeration for 7.95 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR795 5 - -/* Enumeration for 10.20 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR102 6 - -/* Enumeration for 12.20 kbps AMR-NB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_MMR122 7 - -/* Enumeration for AMR-NB Discontinuous Transmission mode off. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_OFF 0 - -/* Enumeration for AMR-NB DTX mode VAD1. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD1 1 - -/* Enumeration for AMR-NB DTX mode VAD2. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD2 2 - -/* Enumeration for AMR-NB DTX mode auto. */ -#define ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_AUTO 3 - -struct asm_amrnb_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u16 enc_mode; -/* AMR-NB encoding rate. - * Supported values: - * Use the ASM_MEDIA_FMT_AMRNB_FS_ENCODE_MODE_* - * macros - */ - - u16 dtx_mode; -/* Specifies whether DTX mode is disabled or enabled. - * Supported values: - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_OFF - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD1 - */ -} __packed; - -#define ASM_MEDIA_FMT_AMRWB_FS 0x00010BEC - -/* Enumeration for 6.6 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR66 0 - -/* Enumeration for 8.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR885 1 - -/* Enumeration for 12.65 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1265 2 - -/* Enumeration for 14.25 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1425 3 - -/* Enumeration for 15.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1585 4 - -/* Enumeration for 18.25 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1825 5 - -/* Enumeration for 19.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR1985 6 - -/* Enumeration for 23.05 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR2305 7 - -/* Enumeration for 23.85 kbps AMR-WB Encoding mode. */ -#define ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_MR2385 8 - -struct asm_amrwb_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u16 enc_mode; -/* AMR-WB encoding rate. - * Suupported values: - * Use the ASM_MEDIA_FMT_AMRWB_FS_ENCODE_MODE_* - * macros - */ - - u16 dtx_mode; -/* Specifies whether DTX mode is disabled or enabled. - * Supported values: - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_OFF - * - #ASM_MEDIA_FMT_AMRNB_FS_DTX_MODE_VAD1 - */ -} __packed; - -#define ASM_MEDIA_FMT_V13K_FS 0x00010BED - -/* Enumeration for 14.4 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1440 0 - -/* Enumeration for 12.2 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1220 1 - -/* Enumeration for 11.2 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1120 2 - -/* Enumeration for 9.0 kbps V13K Encoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR90 3 - -/* Enumeration for 7.2 kbps V13K eEncoding mode. */ -#define ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR720 4 - -/* Enumeration for 1/8 vocoder rate.*/ -#define ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE 1 - -/* Enumeration for 1/4 vocoder rate. */ -#define ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE 2 - -/* Enumeration for 1/2 vocoder rate. */ -#define ASM_MEDIA_FMT_VOC_HALF_RATE 3 - -/* Enumeration for full vocoder rate. */ -#define ASM_MEDIA_FMT_VOC_FULL_RATE 4 - -struct asm_v13k_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u16 max_rate; -/* Maximum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 min_rate; -/* Minimum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 reduced_rate_cmd; -/* Reduced rate command, used to change - * the average bitrate of the V13K - * vocoder. - * Supported values: - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1440 (Default) - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1220 - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR1120 - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR90 - * - #ASM_MEDIA_FMT_V13K_FS_ENCODE_MODE_MR720 - */ - - u16 rate_mod_cmd; -/* Rate modulation command. Default = 0. - *- If bit 0=1, rate control is enabled. - *- If bit 1=1, the maximum number of consecutive full rate - * frames is limited with numbers supplied in - * bits 2 to 10. - *- If bit 1=0, the minimum number of non-full rate frames - * in between two full rate frames is forced to - * the number supplied in bits 2 to 10. In both cases, if necessary, - * half rate is used to substitute full rate. - Bits 15 to 10 are - * reserved and must all be set to zero. - */ - -} __packed; - -#define ASM_MEDIA_FMT_EVRC_FS 0x00010BEE - -/* EVRC encoder configuration structure used in the - * #ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2 command. - */ -struct asm_evrc_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u16 max_rate; -/* Maximum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 min_rate; -/* Minimum allowed encoder frame rate. - * Supported values: - * - #ASM_MEDIA_FMT_VOC_ONE_EIGHTH_RATE - * - #ASM_MEDIA_FMT_VOC_ONE_FOURTH_RATE - * - #ASM_MEDIA_FMT_VOC_HALF_RATE - * - #ASM_MEDIA_FMT_VOC_FULL_RATE - */ - - u16 rate_mod_cmd; -/* Rate modulation command. Default: 0. - * - If bit 0=1, rate control is enabled. - * - If bit 1=1, the maximum number of consecutive full rate frames - * is limited with numbers supplied in bits 2 to 10. - * - * - If bit 1=0, the minimum number of non-full rate frames in - * between two full rate frames is forced to the number supplied in - * bits 2 to 10. In both cases, if necessary, half rate is used to - * substitute full rate. - * - * - Bits 15 to 10 are reserved and must all be set to zero. - */ - - u16 reserved; - /* Reserved. Clients must set this field to zero. */ -} __packed; - -#define ASM_MEDIA_FMT_WMA_V10PRO_V2 0x00010DA7 - -struct asm_wmaprov10_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - - u16 fmtag; -/* WMA format type. - * Supported values: - * - 0x162 -- WMA 9 Pro - * - 0x163 -- WMA 9 Pro Lossless - * - 0x166 -- WMA 10 Pro - * - 0x167 -- WMA 10 Pro Lossless - */ - - u16 num_channels; -/* Number of channels encoded in the input stream. - * Supported values: 1 to 8 - */ - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * Supported values: 11025, 16000, 22050, 32000, 44100, 48000, - * 88200, 96000 - */ - - u32 avg_bytes_per_sec; -/* Bitrate expressed as the average bytes per second. - * Supported values: 2000 to 96000 - */ - - u16 blk_align; -/* Size of the bitstream packet size in bytes. WMA Pro files - * have a payload of one block per bitstream packet. - * Supported values: @le 13376 - */ - - u16 bits_per_sample; -/* Number of bits per sample in the encoded WMA stream. - * Supported values: 16, 24 - */ - - u32 channel_mask; -/* Bit-packed double word (32-bits) that indicates the - * recommended speaker positions for each source channel. - */ - - u16 enc_options; -/* Bit-packed word with values that indicate whether certain - * features of the bitstream are used. - * Supported values: - 0x0001 -- ENCOPT3_PURE_LOSSLESS - 0x0006 -- - * ENCOPT3_FRM_SIZE_MOD - 0x0038 -- ENCOPT3_SUBFRM_DIV - 0x0040 -- - * ENCOPT3_WRITE_FRAMESIZE_IN_HDR - 0x0080 -- - * ENCOPT3_GENERATE_DRC_PARAMS - 0x0100 -- ENCOPT3_RTMBITS - */ - - - u16 usAdvancedEncodeOpt; - /* Advanced encoding option. */ - - u32 advanced_enc_options2; - /* Advanced encoding option 2. */ - -} __packed; - -#define ASM_MEDIA_FMT_WMA_V9_V2 0x00010DA8 -struct asm_wmastdv9_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u16 fmtag; -/* WMA format tag. - * Supported values: 0x161 (WMA 9 standard) - */ - - u16 num_channels; -/* Number of channels in the stream. - * Supported values: 1, 2 - */ - - u32 sample_rate; -/* Number of samples per second (in Hertz). - * Supported values: 48000 - */ - - u32 avg_bytes_per_sec; - /* Bitrate expressed as the average bytes per second. */ - - u16 blk_align; -/* Block align. All WMA files with a maximum packet size of - * 13376 are supported. - */ - - - u16 bits_per_sample; -/* Number of bits per sample in the output. - * Supported values: 16 - */ - - u32 channel_mask; -/* Channel mask. - * Supported values: - * - 3 -- Stereo (front left/front right) - * - 4 -- Mono (center) - */ - - u16 enc_options; - /* Options used during encoding. */ - - u16 reserved; - -} __packed; - -#define ASM_MEDIA_FMT_WMA_V8 0x00010D91 - -struct asm_wmastdv8_enc_cfg { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u32 bit_rate; - /* Encoding rate in bits per second. */ - - u32 sample_rate; -/* Number of samples per second. - * - * Supported values: - * - 0 -- Native mode - * - Other Supported values are 22050, 32000, 44100, and 48000. - * - * Native mode indicates that encoding must be performed with the - * sampling rate at the input. - * The sampling rate must not change during encoding. - */ - - u16 channel_cfg; -/* Number of channels to encode. - * Supported values: - * - 0 -- Native mode - * - 1 -- Mono - * - 2 -- Stereo - * - Other values are not supported. - * - * Native mode indicates that encoding must be performed with the - * number of channels at the input. - * The number of channels must not change during encoding. - */ - - u16 reserved; - /* Reserved. Clients must set this field to zero.*/ - } __packed; - -#define ASM_MEDIA_FMT_AMR_WB_PLUS_V2 0x00010DA9 - -struct asm_amrwbplus_fmt_blk_v2 { - struct apr_hdr hdr; - struct asm_data_cmd_media_fmt_update_v2 fmtblk; - u32 amr_frame_fmt; -/* AMR frame format. - * Supported values: - * - 6 -- Transport Interface Format (TIF) - * - Any other value -- File storage format (FSF) - * - * TIF stream contains 2-byte header for each frame within the - * superframe. FSF stream contains one 2-byte header per superframe. - */ - -} __packed; - -#define ASM_MEDIA_FMT_AC3 0x00010DEE -#define ASM_MEDIA_FMT_EAC3 0x00010DEF -#define ASM_MEDIA_FMT_DTS 0x00010D88 -#define ASM_MEDIA_FMT_MP2 0x00010DE9 -#define ASM_MEDIA_FMT_FLAC 0x00010C16 -#define ASM_MEDIA_FMT_ALAC 0x00012F31 -#define ASM_MEDIA_FMT_VORBIS 0x00010C15 -#define ASM_MEDIA_FMT_APE 0x00012F32 -#define ASM_MEDIA_FMT_DSD 0x00012F3E -#define ASM_MEDIA_FMT_TRUEHD 0x00013215 -/* 0x0 is used for fomat ID since ADSP dynamically determines the - * format encapsulated in the IEC61937 (compressed) or IEC60958 - * (pcm) packets. - */ -#define ASM_MEDIA_FMT_IEC 0x00000000 - -/* Media format ID for adaptive transform acoustic coding. This - * ID is used by the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED command - * only. - */ - -#define ASM_MEDIA_FMT_ATRAC 0x00010D89 - -/* Media format ID for metadata-enhanced audio transmission. - * This ID is used by the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED - * command only. - */ - -#define ASM_MEDIA_FMT_MAT 0x00010D8A - -/* adsp_media_fmt.h */ - -#define ASM_DATA_CMD_WRITE_V2 0x00010DAB - -struct asm_data_cmd_write_v2 { - struct apr_hdr hdr; - u32 buf_addr_lsw; -/* The 64 bit address msw-lsw should be a valid, mapped address. - * 64 bit address should be a multiple of 32 bytes - */ - - u32 buf_addr_msw; -/* The 64 bit address msw-lsw should be a valid, mapped address. - * 64 bit address should be a multiple of 32 bytes. - * -Address of the buffer containing the data to be decoded. - * The buffer should be aligned to a 32 byte boundary. - * -In the case of 32 bit Shared memory address, msw field must - * -be set to zero. - * -In the case of 36 bit shared memory address, bit 31 to bit 4 - * -of msw must be set to zero. - */ - u32 mem_map_handle; -/* memory map handle returned by DSP through - * ASM_CMD_SHARED_MEM_MAP_REGIONS command - */ - u32 buf_size; -/* Number of valid bytes available in the buffer for decoding. The - * first byte starts at buf_addr. - */ - - u32 seq_id; - /* Optional buffer sequence ID. */ - - u32 timestamp_lsw; -/* Lower 32 bits of the 64-bit session time in microseconds of the - * first buffer sample. - */ - - u32 timestamp_msw; -/* Upper 32 bits of the 64-bit session time in microseconds of the - * first buffer sample. - */ - - u32 flags; -/* Bitfield of flags. - * Supported values for bit 31: - * - 1 -- Valid timestamp. - * - 0 -- Invalid timestamp. - * - Use #ASM_BIT_MASKIMESTAMP_VALID_FLAG as the bitmask and - * #ASM_SHIFTIMESTAMP_VALID_FLAG as the shift value to set this bit. - * Supported values for bit 30: - * - 1 -- Last buffer. - * - 0 -- Not the last buffer. - * - * Supported values for bit 29: - * - 1 -- Continue the timestamp from the previous buffer. - * - 0 -- Timestamp of the current buffer is not related - * to the timestamp of the previous buffer. - * - Use #ASM_BIT_MASKS_CONTINUE_FLAG and #ASM_SHIFTS_CONTINUE_FLAG - * to set this bit. - * - * Supported values for bit 4: - * - 1 -- End of the frame. - * - 0 -- Not the end of frame, or this information is not known. - * - Use #ASM_BIT_MASK_EOF_FLAG as the bitmask and #ASM_SHIFT_EOF_FLAG - * as the shift value to set this bit. - * - * All other bits are reserved and must be set to 0. - * - * If bit 31=0 and bit 29=1: The timestamp of the first sample in - * this buffer continues from the timestamp of the last sample in - * the previous buffer. If there is no previous buffer (i.e., this - * is the first buffer sent after opening the stream or after a - * flush operation), or if the previous buffer does not have a valid - * timestamp, the samples in the current buffer also do not have a - * valid timestamp. They are played out as soon as possible. - * - * - * If bit 31=0 and bit 29=0: No timestamp is associated with the - * first sample in this buffer. The samples are played out as soon - * as possible. - * - * - * If bit 31=1 and bit 29 is ignored: The timestamp specified in - * this payload is honored. - * - * - * If bit 30=0: Not the last buffer in the stream. This is useful - * in removing trailing samples. - * - * - * For bit 4: The client can set this flag for every buffer sent in - * which the last byte is the end of a frame. If this flag is set, - * the buffer can contain data from multiple frames, but it should - * always end at a frame boundary. Restrictions allow the aDSP to - * detect an end of frame without requiring additional processing. - */ - -} __packed; - -#define ASM_DATA_CMD_READ_V2 0x00010DAC - -struct asm_data_cmd_read_v2 { - struct apr_hdr hdr; - u32 buf_addr_lsw; -/* the 64 bit address msw-lsw should be a valid mapped address - * and should be a multiple of 32 bytes - */ - - - u32 buf_addr_msw; -/* the 64 bit address msw-lsw should be a valid mapped address - * and should be a multiple of 32 bytes. - * - Address of the buffer where the DSP puts the encoded data, - * potentially, at an offset specified by the uOffset field in - * ASM_DATA_EVENT_READ_DONE structure. The buffer should be aligned - * to a 32 byte boundary. - * - In the case of 32 bit Shared memory address, msw field must - * - be set to zero. - * - In the case of 36 bit shared memory address, bit 31 to bit - * - 4 of msw must be set to zero. - */ - u32 mem_map_handle; -/* memory map handle returned by DSP through - * ASM_CMD_SHARED_MEM_MAP_REGIONS command. - */ - - u32 buf_size; -/* Number of bytes available for the aDSP to write. The aDSP - * starts writing from buf_addr. - */ - - u32 seq_id; - /* Optional buffer sequence ID. */ -} __packed; - -#define ASM_DATA_CMD_EOS 0x00010BDB -#define ASM_DATA_EVENT_RENDERED_EOS 0x00010C1C -#define ASM_DATA_EVENT_EOS 0x00010BDD - -#define ASM_DATA_EVENT_WRITE_DONE_V2 0x00010D99 -struct asm_data_event_write_done_v2 { - u32 buf_addr_lsw; - /* lsw of the 64 bit address */ - u32 buf_addr_msw; - /* msw of the 64 bit address. address given by the client in - * ASM_DATA_CMD_WRITE_V2 command. - */ - u32 mem_map_handle; - /* memory map handle in the ASM_DATA_CMD_WRITE_V2 */ - - u32 status; -/* Status message (error code) that indicates whether the - * referenced buffer has been successfully consumed. - * Supported values: Refer to @xhyperref{Q3,[Q3]} - */ -} __packed; - -#define ASM_DATA_EVENT_READ_DONE_V2 0x00010D9A - -/* Definition of the frame metadata flag bitmask.*/ -#define ASM_BIT_MASK_FRAME_METADATA_FLAG (0x40000000UL) - -/* Definition of the frame metadata flag shift value. */ -#define ASM_SHIFT_FRAME_METADATA_FLAG 30 - -struct asm_data_event_read_done_v2 { - u32 status; -/* Status message (error code). - * Supported values: Refer to @xhyperref{Q3,[Q3]} - */ - -u32 buf_addr_lsw; -/* 64 bit address msw-lsw is a valid, mapped address. 64 bit - * address is a multiple of 32 bytes. - */ - -u32 buf_addr_msw; -/* 64 bit address msw-lsw is a valid, mapped address. 64 bit - * address is a multiple of 32 bytes. - * - * -Same address provided by the client in ASM_DATA_CMD_READ_V2 - * -In the case of 32 bit Shared memory address, msw field is set to - * zero. - * -In the case of 36 bit shared memory address, bit 31 to bit 4 - * -of msw is set to zero. - */ - -u32 mem_map_handle; -/* memory map handle in the ASM_DATA_CMD_READ_V2 */ - -u32 enc_framesotal_size; -/* Total size of the encoded frames in bytes. - * Supported values: >0 - */ - -u32 offset; -/* Offset (from buf_addr) to the first byte of the first encoded - * frame. All encoded frames are consecutive, starting from this - * offset. - * Supported values: > 0 - */ - -u32 timestamp_lsw; -/* Lower 32 bits of the 64-bit session time in microseconds of - * the first sample in the buffer. If Bit 5 of mode_flags flag of - * ASM_STREAM_CMD_OPEN_READ_V2 is 1 then the 64 bit timestamp is - * absolute capture time otherwise it is relative session time. The - * absolute timestamp doesn't reset unless the system is reset. - */ - - -u32 timestamp_msw; -/* Upper 32 bits of the 64-bit session time in microseconds of - * the first sample in the buffer. - */ - - -u32 flags; -/* Bitfield of flags. Bit 30 indicates whether frame metadata is - * present. If frame metadata is present, num_frames consecutive - * instances of @xhyperref{hdr:FrameMetaData,Frame metadata} start - * at the buffer address. - * Supported values for bit 31: - * - 1 -- Timestamp is valid. - * - 0 -- Timestamp is invalid. - * - Use #ASM_BIT_MASKIMESTAMP_VALID_FLAG and - * #ASM_SHIFTIMESTAMP_VALID_FLAG to set this bit. - * - * Supported values for bit 30: - * - 1 -- Frame metadata is present. - * - 0 -- Frame metadata is absent. - * - Use #ASM_BIT_MASK_FRAME_METADATA_FLAG and - * #ASM_SHIFT_FRAME_METADATA_FLAG to set this bit. - * - * All other bits are reserved; the aDSP sets them to 0. - */ - -u32 num_frames; -/* Number of encoded frames in the buffer. */ - -u32 seq_id; -/* Optional buffer sequence ID. */ -} __packed; - -struct asm_data_read_buf_metadata_v2 { - u32 offset; -/* Offset from buf_addr in #ASM_DATA_EVENT_READ_DONE_PAYLOAD to - * the frame associated with this metadata. - * Supported values: > 0 - */ - -u32 frm_size; -/* Size of the encoded frame in bytes. - * Supported values: > 0 - */ - -u32 num_encoded_pcm_samples; -/* Number of encoded PCM samples (per channel) in the frame - * associated with this metadata. - * Supported values: > 0 - */ - -u32 timestamp_lsw; -/* Lower 32 bits of the 64-bit session time in microseconds of the - * first sample for this frame. - * If Bit 5 of mode_flags flag of ASM_STREAM_CMD_OPEN_READ_V2 is 1 - * then the 64 bit timestamp is absolute capture time otherwise it - * is relative session time. The absolute timestamp doesn't reset - * unless the system is reset. - */ - - -u32 timestamp_msw; -/* Lower 32 bits of the 64-bit session time in microseconds of the - * first sample for this frame. - */ - -u32 flags; -/* Frame flags. - * Supported values for bit 31: - * - 1 -- Time stamp is valid - * - 0 -- Time stamp is not valid - * - All other bits are reserved; the aDSP sets them to 0. - */ -} __packed; - -/* Notifies the client of a change in the data sampling rate or - * Channel mode. This event is raised by the decoder service. The - * event is enabled through the mode flags of - * #ASM_STREAM_CMD_OPEN_WRITE_V2 or - * #ASM_STREAM_CMD_OPEN_READWRITE_V2. - The decoder detects a change - * in the output sampling frequency or the number/positioning of - * output channels, or if it is the first frame decoded.The new - * sampling frequency or the new channel configuration is - * communicated back to the client asynchronously. - */ - -#define ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY 0x00010C65 - -/* Payload of the #ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY event. - * This event is raised when the following conditions are both true: - * - The event is enabled through the mode_flags of - * #ASM_STREAM_CMD_OPEN_WRITE_V2 or - * #ASM_STREAM_CMD_OPEN_READWRITE_V2. - The decoder detects a change - * in either the output sampling frequency or the number/positioning - * of output channels, or if it is the first frame decoded. - * This event is not raised (even if enabled) if the decoder is - * MIDI, because - */ - - -struct asm_data_event_sr_cm_change_notify { - u32 sample_rate; -/* New sampling rate (in Hertz) after detecting a change in the - * bitstream. - * Supported values: 2000 to 48000 - */ - - u16 num_channels; -/* New number of channels after detecting a change in the - * bitstream. - * Supported values: 1 to 8 - */ - - - u16 reserved; - /* Reserved for future use. This field must be set to 0.*/ - - u8 channel_mapping[8]; - -} __packed; - -/* Notifies the client of a data sampling rate or channel mode - * change. This event is raised by the encoder service. - * This event is raised when : - * - Native mode encoding was requested in the encoder - * configuration (i.e., the channel number was 0), the sample rate - * was 0, or both were 0. - * - * - The input data frame at the encoder is the first one, or the - * sampling rate/channel mode is different from the previous input - * data frame. - * - */ -#define ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY 0x00010BDE - -struct asm_data_event_enc_sr_cm_change_notify { - u32 sample_rate; -/* New sampling rate (in Hertz) after detecting a change in the - * input data. - * Supported values: 2000 to 48000 - */ - - - u16 num_channels; -/* New number of channels after detecting a change in the input - * data. Supported values: 1 to 8 - */ - - - u16 bits_per_sample; -/* New bits per sample after detecting a change in the input - * data. - * Supported values: 16, 24 - */ - - - u8 channel_mapping[8]; - -} __packed; -#define ASM_DATA_CMD_IEC_60958_FRAME_RATE 0x00010D87 - - -/* Payload of the #ASM_DATA_CMD_IEC_60958_FRAME_RATE command, - * which is used to indicate the IEC 60958 frame rate of a given - * packetized audio stream. - */ - -struct asm_data_cmd_iec_60958_frame_rate { - u32 frame_rate; -/* IEC 60958 frame rate of the incoming IEC 61937 packetized stream. - * Supported values: Any valid frame rate - */ -} __packed; - -/* adsp_asm_data_commands.h*/ -/* Definition of the stream ID bitmask.*/ -#define ASM_BIT_MASK_STREAM_ID (0x000000FFUL) - -/* Definition of the stream ID shift value.*/ -#define ASM_SHIFT_STREAM_ID 0 - -/* Definition of the session ID bitmask.*/ -#define ASM_BIT_MASK_SESSION_ID (0x0000FF00UL) - -/* Definition of the session ID shift value.*/ -#define ASM_SHIFT_SESSION_ID 8 - -/* Definition of the service ID bitmask.*/ -#define ASM_BIT_MASK_SERVICE_ID (0x00FF0000UL) - -/* Definition of the service ID shift value.*/ -#define ASM_SHIFT_SERVICE_ID 16 - -/* Definition of the domain ID bitmask.*/ -#define ASM_BIT_MASK_DOMAIN_ID (0xFF000000UL) - -/* Definition of the domain ID shift value.*/ -#define ASM_SHIFT_DOMAIN_ID 24 - -#define ASM_CMD_SHARED_MEM_MAP_REGIONS 0x00010D92 -#define ASM_CMDRSP_SHARED_MEM_MAP_REGIONS 0x00010D93 -#define ASM_CMD_SHARED_MEM_UNMAP_REGIONS 0x00010D94 - -/* adsp_asm_service_commands.h */ - -#define ASM_MAX_SESSION_ID (15) - -/* Maximum number of sessions.*/ -#define ASM_MAX_NUM_SESSIONS ASM_MAX_SESSION_ID - -/* Maximum number of streams per session.*/ -#define ASM_MAX_STREAMS_PER_SESSION (8) -#define ASM_SESSION_CMD_RUN_V2 0x00010DAA -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_IMMEDIATE 0 -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_ABSOLUTEIME 1 -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_RELATIVEIME 2 -#define ASM_SESSION_CMD_RUN_STARTIME_RUN_WITH_DELAY 3 - -#define ASM_BIT_MASK_RUN_STARTIME (0x00000003UL) - -/* Bit shift value used to specify the start time for the - * ASM_SESSION_CMD_RUN_V2 command. - */ -#define ASM_SHIFT_RUN_STARTIME 0 -struct asm_session_cmd_run_v2 { - struct apr_hdr hdr; - u32 flags; -/* Specifies whether to run immediately or at a specific - * rendering time or with a specified delay. Run with delay is - * useful for delaying in case of ASM loopback opened through - * ASM_STREAM_CMD_OPEN_LOOPBACK_V2. Use #ASM_BIT_MASK_RUN_STARTIME - * and #ASM_SHIFT_RUN_STARTIME to set this 2-bit flag. - * - * - *Bits 0 and 1 can take one of four possible values: - * - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_IMMEDIATE - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_ABSOLUTEIME - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_AT_RELATIVEIME - *- #ASM_SESSION_CMD_RUN_STARTIME_RUN_WITH_DELAY - * - *All other bits are reserved; clients must set them to zero. - */ - - u32 time_lsw; -/* Lower 32 bits of the time in microseconds used to align the - * session origin time. When bits 0-1 of flags is - * ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, time lsw is the lsw of - * the delay in us. For ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, - * maximum value of the 64 bit delay is 150 ms. - */ - - u32 time_msw; -/* Upper 32 bits of the time in microseconds used to align the - * session origin time. When bits 0-1 of flags is - * ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, time msw is the msw of - * the delay in us. For ASM_SESSION_CMD_RUN_START_RUN_WITH_DELAY, - * maximum value of the 64 bit delay is 150 ms. - */ - -} __packed; - -#define ASM_SESSION_CMD_PAUSE 0x00010BD3 -#define ASM_SESSION_CMD_SUSPEND 0x00010DEC -#define ASM_SESSION_CMD_GET_SESSIONTIME_V3 0x00010D9D -#define ASM_SESSION_CMD_REGISTER_FOR_RX_UNDERFLOW_EVENTS 0x00010BD5 - -struct asm_session_cmd_rgstr_rx_underflow { - struct apr_hdr hdr; - u16 enable_flag; -/* Specifies whether a client is to receive events when an Rx - * session underflows. - * Supported values: - * - 0 -- Do not send underflow events - * - 1 -- Send underflow events - */ - u16 reserved; - /* Reserved. This field must be set to zero.*/ -} __packed; - -#define ASM_SESSION_CMD_REGISTER_FORX_OVERFLOW_EVENTS 0x00010BD6 - -struct asm_session_cmd_regx_overflow { - struct apr_hdr hdr; - u16 enable_flag; -/* Specifies whether a client is to receive events when a Tx - * session overflows. - * Supported values: - * - 0 -- Do not send overflow events - * - 1 -- Send overflow events - */ - - u16 reserved; - /* Reserved. This field must be set to zero.*/ -} __packed; - -#define ASM_SESSION_EVENT_RX_UNDERFLOW 0x00010C17 -#define ASM_SESSION_EVENTX_OVERFLOW 0x00010C18 -#define ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3 0x00010D9E - -struct asm_session_cmdrsp_get_sessiontime_v3 { - u32 status; - /* Status message (error code). - * Supported values: Refer to @xhyperref{Q3,[Q3]} - */ - - u32 sessiontime_lsw; - /* Lower 32 bits of the current session time in microseconds.*/ - - u32 sessiontime_msw; - /* Upper 32 bits of the current session time in microseconds.*/ - - u32 absolutetime_lsw; -/* Lower 32 bits in micro seconds of the absolute time at which - * the * sample corresponding to the above session time gets - * rendered * to hardware. This absolute time may be slightly in the - * future or past. - */ - - - u32 absolutetime_msw; -/* Upper 32 bits in micro seconds of the absolute time at which - * the * sample corresponding to the above session time gets - * rendered to * hardware. This absolute time may be slightly in the - * future or past. - */ - -} __packed; - -#define ASM_SESSION_CMD_ADJUST_SESSION_CLOCK_V2 0x00010D9F - -struct asm_session_cmd_adjust_session_clock_v2 { - struct apr_hdr hdr; -u32 adjustime_lsw; -/* Lower 32 bits of the signed 64-bit quantity that specifies the - * adjustment time in microseconds to the session clock. - * - * Positive values indicate advancement of the session clock. - * Negative values indicate delay of the session clock. - */ - - - u32 adjustime_msw; -/* Upper 32 bits of the signed 64-bit quantity that specifies - * the adjustment time in microseconds to the session clock. - * Positive values indicate advancement of the session clock. - * Negative values indicate delay of the session clock. - */ - -} __packed; - -#define ASM_SESSION_CMDRSP_ADJUST_SESSION_CLOCK_V2 0x00010DA0 - -struct asm_session_cmdrsp_adjust_session_clock_v2 { - u32 status; -/* Status message (error code). - * Supported values: Refer to @xhyperref{Q3,[Q3]} - * An error means the session clock is not adjusted. In this case, - * the next two fields are irrelevant. - */ - - - u32 actual_adjustime_lsw; -/* Lower 32 bits of the signed 64-bit quantity that specifies - * the actual adjustment in microseconds performed by the aDSP. - * A positive value indicates advancement of the session clock. A - * negative value indicates delay of the session clock. - */ - - - u32 actual_adjustime_msw; -/* Upper 32 bits of the signed 64-bit quantity that specifies - * the actual adjustment in microseconds performed by the aDSP. - * A positive value indicates advancement of the session clock. A - * negative value indicates delay of the session clock. - */ - - - u32 cmd_latency_lsw; -/* Lower 32 bits of the unsigned 64-bit quantity that specifies - * the amount of time in microseconds taken to perform the session - * clock adjustment. - */ - - - u32 cmd_latency_msw; -/* Upper 32 bits of the unsigned 64-bit quantity that specifies - * the amount of time in microseconds taken to perform the session - * clock adjustment. - */ - -} __packed; - -#define ASM_SESSION_CMD_GET_PATH_DELAY_V2 0x00010DAF -#define ASM_SESSION_CMDRSP_GET_PATH_DELAY_V2 0x00010DB0 - -struct asm_session_cmdrsp_get_path_delay_v2 { - u32 status; -/* Status message (error code). Whether this get delay operation - * is successful or not. Delay value is valid only if status is - * success. - * Supported values: Refer to @xhyperref{Q5,[Q5]} - */ - - u32 audio_delay_lsw; - /* Upper 32 bits of the aDSP delay in microseconds. */ - - u32 audio_delay_msw; - /* Lower 32 bits of the aDSP delay in microseconds. */ - -} __packed; - -/* adsp_asm_session_command.h*/ -#define ASM_STREAM_CMD_OPEN_WRITE_V3 0x00010DB3 - -#define ASM_LOW_LATENCY_STREAM_SESSION 0x10000000 - -#define ASM_ULTRA_LOW_LATENCY_STREAM_SESSION 0x20000000 - -#define ASM_ULL_POST_PROCESSING_STREAM_SESSION 0x40000000 - -#define ASM_LEGACY_STREAM_SESSION 0 - - -struct asm_stream_cmd_open_write_v3 { - struct apr_hdr hdr; - uint32_t mode_flags; -/* Mode flags that configure the stream to notify the client - * whenever it detects an SR/CM change at the input to its POPP. - * Supported values for bits 0 to 1: - * - Reserved; clients must set them to zero. - * Supported values for bit 2: - * - 0 -- SR/CM change notification event is disabled. - * - 1 -- SR/CM change notification event is enabled. - * - Use #ASM_BIT_MASK_SR_CM_CHANGE_NOTIFY_FLAG and - * #ASM_SHIFT_SR_CM_CHANGE_NOTIFY_FLAG to set or get this bit. - * - * Supported values for bit 31: - * - 0 -- Stream to be opened in on-Gapless mode. - * - 1 -- Stream to be opened in Gapless mode. In Gapless mode, - * successive streams must be opened with same session ID but - * different stream IDs. - * - * - Use #ASM_BIT_MASK_GAPLESS_MODE_FLAG and - * #ASM_SHIFT_GAPLESS_MODE_FLAG to set or get this bit. - * - * - * @note1hang MIDI and DTMF streams cannot be opened in Gapless mode. - */ - - uint16_t sink_endpointype; -/*< Sink point type. - * Supported values: - * - 0 -- Device matrix - * - Other values are reserved. - * - * The device matrix is the gateway to the hardware ports. - */ - - uint16_t bits_per_sample; -/*< Number of bits per sample processed by ASM modules. - * Supported values: 16 and 24 bits per sample - */ - - uint32_t postprocopo_id; -/*< Specifies the topology (order of processing) of - * postprocessing algorithms. None means no postprocessing. - * Supported values: - * - #ASM_STREAM_POSTPROCOPO_ID_DEFAULT - * - #ASM_STREAM_POSTPROCOPO_ID_MCH_PEAK_VOL - * - #ASM_STREAM_POSTPROCOPO_ID_NONE - * - * This field can also be enabled through SetParams flags. - */ - - uint32_t dec_fmt_id; -/*< Configuration ID of the decoder media format. - * - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_ADPCM - * - #ASM_MEDIA_FMT_MP3 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_DOLBY_AAC - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_AMR_WB_PLUS_V2 - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_WMA_V10PRO_V2 - * - #ASM_MEDIA_FMT_WMA_V9_V2 - * - #ASM_MEDIA_FMT_AC3 - * - #ASM_MEDIA_FMT_EAC3 - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_FR_FS - * - #ASM_MEDIA_FMT_VORBIS - * - #ASM_MEDIA_FMT_FLAC - * - #ASM_MEDIA_FMT_ALAC - * - #ASM_MEDIA_FMT_APE - * - #ASM_MEDIA_FMT_EXAMPLE - */ -} __packed; - -#define ASM_STREAM_CMD_OPEN_PULL_MODE_WRITE 0x00010DD9 - -/* Bitmask for the stream_perf_mode subfield. */ -#define ASM_BIT_MASK_STREAM_PERF_FLAG_PULL_MODE_WRITE 0xE0000000UL - -/* Bitmask for the stream_perf_mode subfield. */ -#define ASM_SHIFT_STREAM_PERF_FLAG_PULL_MODE_WRITE 29 - -#define ASM_STREAM_CMD_OPEN_PUSH_MODE_READ 0x00010DDA - -#define ASM_BIT_MASK_STREAM_PERF_FLAG_PUSH_MODE_READ 0xE0000000UL - -#define ASM_SHIFT_STREAM_PERF_FLAG_PUSH_MODE_READ 29 - -#define ASM_DATA_EVENT_WATERMARK 0x00010DDB - -struct asm_shared_position_buffer { - volatile uint32_t frame_counter; -/* Counter used to handle interprocessor synchronization issues. - * When frame_counter is 0: read_index, wall_clock_us_lsw, and - * wall_clock_us_msw are invalid. - * Supported values: >= 0. - */ - - volatile uint32_t index; -/* Index in bytes from where the aDSP is reading/writing. - * Supported values: 0 to circular buffer size - 1 - */ - - volatile uint32_t wall_clock_us_lsw; -/* Lower 32 bits of the 64-bit wall clock time in microseconds when the - * read index was updated. - * Supported values: >= 0 - */ - - volatile uint32_t wall_clock_us_msw; -/* Upper 32 bits of the 64 bit wall clock time in microseconds when the - * read index was updated - * Supported values: >= 0 - */ -} __packed; - -struct asm_shared_watermark_level { - uint32_t watermark_level_bytes; -} __packed; - -struct asm_stream_cmd_open_shared_io { - struct apr_hdr hdr; - uint32_t mode_flags; - uint16_t endpoint_type; - uint16_t topo_bits_per_sample; - uint32_t topo_id; - uint32_t fmt_id; - uint32_t shared_pos_buf_phy_addr_lsw; - uint32_t shared_pos_buf_phy_addr_msw; - uint16_t shared_pos_buf_mem_pool_id; - uint16_t shared_pos_buf_num_regions; - uint32_t shared_pos_buf_property_flag; - uint32_t shared_circ_buf_start_phy_addr_lsw; - uint32_t shared_circ_buf_start_phy_addr_msw; - uint32_t shared_circ_buf_size; - uint16_t shared_circ_buf_mem_pool_id; - uint16_t shared_circ_buf_num_regions; - uint32_t shared_circ_buf_property_flag; - uint32_t num_watermark_levels; - struct asm_multi_channel_pcm_fmt_blk_v3 fmt; - struct avs_shared_map_region_payload map_region_pos_buf; - struct avs_shared_map_region_payload map_region_circ_buf; - struct asm_shared_watermark_level watermark[0]; -} __packed; - -#define ASM_STREAM_CMD_OPEN_READ_V3 0x00010DB4 - -/* Definition of the timestamp type flag bitmask */ -#define ASM_BIT_MASKIMESTAMPYPE_FLAG (0x00000020UL) - -/* Definition of the timestamp type flag shift value. */ -#define ASM_SHIFTIMESTAMPYPE_FLAG 5 - -/* Relative timestamp is identified by this value.*/ -#define ASM_RELATIVEIMESTAMP 0 - -/* Absolute timestamp is identified by this value.*/ -#define ASM_ABSOLUTEIMESTAMP 1 - -/* Bit value for Low Latency Tx stream subfield */ -#define ASM_LOW_LATENCY_TX_STREAM_SESSION 1 - -/* Bit shift for the stream_perf_mode subfield. */ -#define ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ 29 - -struct asm_stream_cmd_open_read_v3 { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags that indicate whether meta information per encoded - * frame is to be provided. - * Supported values for bit 4: - * - * - 0 -- Return data buffer contains all encoded frames only; it - * does not contain frame metadata. - * - * - 1 -- Return data buffer contains an array of metadata and - * encoded frames. - * - * - Use #ASM_BIT_MASK_META_INFO_FLAG as the bitmask and - * #ASM_SHIFT_META_INFO_FLAG as the shift value for this bit. - * - * - * Supported values for bit 5: - * - * - ASM_RELATIVEIMESTAMP -- ASM_DATA_EVENT_READ_DONE_V2 will have - * - relative time-stamp. - * - ASM_ABSOLUTEIMESTAMP -- ASM_DATA_EVENT_READ_DONE_V2 will - * - have absolute time-stamp. - * - * - Use #ASM_BIT_MASKIMESTAMPYPE_FLAG as the bitmask and - * #ASM_SHIFTIMESTAMPYPE_FLAG as the shift value for this bit. - * - * All other bits are reserved; clients must set them to zero. - */ - - u32 src_endpointype; -/* Specifies the endpoint providing the input samples. - * Supported values: - * - 0 -- Device matrix - * - All other values are reserved; clients must set them to zero. - * Otherwise, an error is returned. - * The device matrix is the gateway from the tunneled Tx ports. - */ - - u32 preprocopo_id; -/* Specifies the topology (order of processing) of preprocessing - * algorithms. None means no preprocessing. - * Supported values: - * - #ASM_STREAM_PREPROCOPO_ID_DEFAULT - * - #ASM_STREAM_PREPROCOPO_ID_NONE - * - * This field can also be enabled through SetParams flags. - */ - - u32 enc_cfg_id; -/* Media configuration ID for encoded output. - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_EXAMPLE - * - #ASM_MEDIA_FMT_WMA_V8 - */ - - u16 bits_per_sample; -/* Number of bits per sample processed by ASM modules. - * Supported values: 16 and 24 bits per sample - */ - - u16 reserved; -/* Reserved for future use. This field must be set to zero.*/ -} __packed; - -#define ASM_POPP_OUTPUT_SR_NATIVE_RATE 0 - -/* Enumeration for the maximum sampling rate at the POPP output.*/ -#define ASM_POPP_OUTPUT_SR_MAX_RATE 48000 - -#define ASM_STREAM_CMD_OPEN_READWRITE_V2 0x00010D8D -#define ASM_STREAM_CMD_OPEN_READWRITE_V2 0x00010D8D - -struct asm_stream_cmd_open_readwrite_v2 { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags. - * Supported values for bit 2: - * - 0 -- SR/CM change notification event is disabled. - * - 1 -- SR/CM change notification event is enabled. Use - * #ASM_BIT_MASK_SR_CM_CHANGE_NOTIFY_FLAG and - * #ASM_SHIFT_SR_CM_CHANGE_NOTIFY_FLAG to set or - * getting this flag. - * - * Supported values for bit 4: - * - 0 -- Return read data buffer contains all encoded frames only; it - * does not contain frame metadata. - * - 1 -- Return read data buffer contains an array of metadata and - * encoded frames. - * - * All other bits are reserved; clients must set them to zero. - */ - - u32 postprocopo_id; -/* Specifies the topology (order of processing) of postprocessing - * algorithms. None means no postprocessing. - * - * Supported values: - * - #ASM_STREAM_POSTPROCOPO_ID_DEFAULT - * - #ASM_STREAM_POSTPROCOPO_ID_MCH_PEAK_VOL - * - #ASM_STREAM_POSTPROCOPO_ID_NONE - */ - - u32 dec_fmt_id; -/* Specifies the media type of the input data. PCM indicates that - * no decoding must be performed, e.g., this is an NT encoder - * session. - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_ADPCM - * - #ASM_MEDIA_FMT_MP3 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_DOLBY_AAC - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_WMA_V10PRO_V2 - * - #ASM_MEDIA_FMT_WMA_V9_V2 - * - #ASM_MEDIA_FMT_AMR_WB_PLUS_V2 - * - #ASM_MEDIA_FMT_AC3 - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_EXAMPLE - */ - - u32 enc_cfg_id; -/* Specifies the media type for the output of the stream. PCM - * indicates that no encoding must be performed, e.g., this is an NT - * decoder session. - * Supported values: - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_AAC_V2 - * - #ASM_MEDIA_FMT_AMRNB_FS - * - #ASM_MEDIA_FMT_AMRWB_FS - * - #ASM_MEDIA_FMT_V13K_FS - * - #ASM_MEDIA_FMT_EVRC_FS - * - #ASM_MEDIA_FMT_EVRCB_FS - * - #ASM_MEDIA_FMT_EVRCWB_FS - * - #ASM_MEDIA_FMT_SBC - * - #ASM_MEDIA_FMT_G711_ALAW_FS - * - #ASM_MEDIA_FMT_G711_MLAW_FS - * - #ASM_MEDIA_FMT_G729A_FS - * - #ASM_MEDIA_FMT_EXAMPLE - * - #ASM_MEDIA_FMT_WMA_V8 - */ - - u16 bits_per_sample; -/* Number of bits per sample processed by ASM modules. - * Supported values: 16 and 24 bits per sample - */ - - u16 reserved; -/* Reserved for future use. This field must be set to zero.*/ - -} __packed; - -#define ASM_STREAM_CMD_OPEN_LOOPBACK_V2 0x00010D8E -struct asm_stream_cmd_open_loopback_v2 { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags. - * Bit 0-31: reserved; client should set these bits to 0 - */ - u16 src_endpointype; - /* Endpoint type. 0 = Tx Matrix */ - u16 sink_endpointype; - /* Endpoint type. 0 = Rx Matrix */ - u32 postprocopo_id; -/* Postprocessor topology ID. Specifies the topology of - * postprocessing algorithms. - */ - - u16 bits_per_sample; -/* The number of bits per sample processed by ASM modules - * Supported values: 16 and 24 bits per sample - */ - u16 reserved; -/* Reserved for future use. This field must be set to zero. */ -} __packed; - - -#define ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK 0x00010DBA - -/* Bitmask for the stream's Performance mode. */ -#define ASM_BIT_MASK_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK \ - (0x70000000UL) - -/* Bit shift for the stream's Performance mode. */ -#define ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK 28 - -/* Bitmask for the decoder converter enable flag. */ -#define ASM_BIT_MASK_DECODER_CONVERTER_FLAG (0x00000078UL) - -/* Shift value for the decoder converter enable flag. */ -#define ASM_SHIFT_DECODER_CONVERTER_FLAG 3 - -/* Converter mode is None (Default). */ -#define ASM_CONVERTER_MODE_NONE 0 - -/* Converter mode is DDP-to-DD. */ -#define ASM_DDP_DD_CONVERTER_MODE 1 - -/* Identifies a special converter mode where source and sink formats - * are the same but postprocessing must applied. Therefore, Decode - * @rarrow Re-encode is necessary. - */ -#define ASM_POST_PROCESS_CONVERTER_MODE 2 - - -struct asm_stream_cmd_open_transcode_loopback_t { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode Flags specifies the performance mode in which this stream - * is to be opened. - * Supported values{for bits 30 to 28}(stream_perf_mode flag) - * - * #ASM_LEGACY_STREAM_SESSION -- This mode ensures backward - * compatibility to the original behavior - * of ASM_STREAM_CMD_OPEN_TRANSCODE_LOOPBACK - * - * #ASM_LOW_LATENCY_STREAM_SESSION -- Opens a loopback session by using - * shortened buffers in low latency POPP - * - Recommendation: Do not enable high latency algorithms. They might - * negate the benefits of opening a low latency stream, and they - * might also suffer quality degradation from unexpected jitter. - * - This Low Latency mode is supported only for PCM In and PCM Out - * loopbacks. An error is returned if Low Latency mode is opened for - * other transcode loopback modes. - * - To configure this subfield, use - * ASM_BIT_MASK_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK and - * ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_TRANSCODE_LOOPBACK. - * - * Supported values{for bits 6 to 3} (decoder-converter compatibility) - * #ASM_CONVERTER_MODE_NONE (0x0) -- Default - * #ASM_DDP_DD_CONVERTER_MODE (0x1) - * #ASM_POST_PROCESS_CONVERTER_MODE (0x2) - * 0x3-0xF -- Reserved for future use - * - Use #ASM_BIT_MASK_DECODER_CONVERTER_FLAG and - * ASM_SHIFT_DECODER_CONVERTER_FLAG to set this bit - * All other bits are reserved; clients must set them to 0. - */ - - u32 src_format_id; -/* Specifies the media format of the input audio stream. - * - * Supported values - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 - * - #ASM_MEDIA_FMT_DTS - * - #ASM_MEDIA_FMT_EAC3_DEC - * - #ASM_MEDIA_FMT_EAC3 - * - #ASM_MEDIA_FMT_AC3_DEC - * - #ASM_MEDIA_FMT_AC3 - */ - u32 sink_format_id; -/* Specifies the media format of the output stream. - * - * Supported values - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 - * - #ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 - * - #ASM_MEDIA_FMT_DTS (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_EAC3_DEC (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_EAC3 (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_AC3_DEC (not supported in Low Latency mode) - * - #ASM_MEDIA_FMT_AC3 (not supported in Low Latency mode) - */ - - u32 audproc_topo_id; -/* Postprocessing topology ID, which specifies the topology (order of - * processing) of postprocessing algorithms. - * - * Supported values - * - #ASM_STREAM_POSTPROC_TOPO_ID_DEFAULT - * - #ASM_STREAM_POSTPROC_TOPO_ID_PEAKMETER - * - #ASM_STREAM_POSTPROC_TOPO_ID_MCH_PEAK_VOL - * - #ASM_STREAM_POSTPROC_TOPO_ID_NONE - * Topologies can be added through #ASM_CMD_ADD_TOPOLOGIES. - * This field is ignored for the Converter mode, in which no - * postprocessing is performed. - */ - - u16 src_endpoint_type; -/* Specifies the source endpoint that provides the input samples. - * - * Supported values - * - 0 -- Tx device matrix or stream router (gateway to the hardware - * ports) - * - All other values are reserved - * Clients must set this field to 0. Otherwise, an error is returned. - */ - - u16 sink_endpoint_type; -/* Specifies the sink endpoint type. - * - * Supported values - * - 0 -- Rx device matrix or stream router (gateway to the hardware - * ports) - * - All other values are reserved - * Clients must set this field to 0. Otherwise, an error is returned. - */ - - u16 bits_per_sample; -/* Number of bits per sample processed by the ASM modules. - * Supported values 16, 24 - */ - - u16 reserved; -/* This field must be set to 0. - */ -} __packed; - - -#define ASM_STREAM_CMD_CLOSE 0x00010BCD -#define ASM_STREAM_CMD_FLUSH 0x00010BCE - - -#define ASM_STREAM_CMD_FLUSH_READBUFS 0x00010C09 -#define ASM_STREAM_CMD_SET_PP_PARAMS_V2 0x00010DA1 -#define ASM_STREAM_CMD_SET_PP_PARAMS_V3 0x0001320D - -/* - * Structure for the ASM Stream Set PP Params command. Parameter data must be - * pre-packed with the correct header for either V2 or V3 when sent in-band. - * Use q6core_pack_pp_params to pack the header and data correctly depending on - * Instance ID support. - */ -struct asm_stream_cmd_set_pp_params { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending out of band */ - struct mem_mapping_hdr mem_hdr; - - /* The total size of the payload, including the parameter header */ - u32 payload_size; - - /* The parameter data to be filled when sent inband. Parameter data - * must be pre-packed with parameter header and then copied here. Use - * q6core_pack_pp_params to pack the header and param data correctly. - */ - u32 param_data[0]; -} __packed; - -#define ASM_STREAM_CMD_GET_PP_PARAMS_V2 0x00010DA2 -#define ASM_STREAM_CMD_GET_PP_PARAMS_V3 0x0001320E - -struct asm_stream_cmd_get_pp_params_v2 { - u32 data_payload_addr_lsw; - /* LSW of the parameter data payload address. */ - u32 data_payload_addr_msw; -/* MSW of the parameter data payload address. - * - Size of the shared memory, if specified, shall be large enough - * to contain the whole ParamData payload, including Module ID, - * Param ID, Param Size, and Param Values - * - Must be set to zero for in-band data - * - In the case of 32 bit Shared memory address, msw field must be - * set to zero. - * - In the case of 36 bit shared memory address, bit 31 to bit 4 of - * msw must be set to zero. - */ - - u32 mem_map_handle; -/* Supported Values: Any. - * memory map handle returned by DSP through ASM_CMD_SHARED_MEM_MAP_REGIONS - * command. - * if mmhandle is NULL, the ParamData payloads in the ACK are within the - * message payload (in-band). - * If mmhandle is non-NULL, the ParamData payloads in the ACK begin at the - * address specified in the address msw and lsw. - * (out-of-band). - */ - - u32 module_id; -/* Unique module ID. */ - - u32 param_id; -/* Unique parameter ID. */ - - u16 param_max_size; -/* Maximum data size of the module_id/param_id combination. This - * is a multiple of 4 bytes. - */ - - - u16 reserved; -/* Reserved for backward compatibility. Clients must set this - * field to zero. - */ -} __packed; - -#define ASM_STREAM_CMD_SET_ENCDEC_PARAM 0x00010C10 - -#define ASM_STREAM_CMD_SET_ENCDEC_PARAM_V2 0x00013218 - -struct asm_stream_cmd_set_encdec_param_v2 { - u16 service_id; - /* 0 - ASM_ENCODER_SVC; 1 - ASM_DECODER_SVC */ - - u16 reserved; - - u32 param_id; - /* ID of the parameter. */ - - u32 param_size; - /* - * Data size of this parameter, in bytes. The size is a multiple - * of 4 bytes. - */ -} __packed; - -#define ASM_STREAM_CMD_REGISTER_ENCDEC_EVENTS 0x00013219 - -#define ASM_STREAM_CMD_ENCDEC_EVENTS 0x0001321A - -#define AVS_PARAM_ID_RTIC_SHARED_MEMORY_ADDR 0x00013237 - -struct avs_rtic_shared_mem_addr { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param_v2 encdec; - u32 shm_buf_addr_lsw; - /* Lower 32 bit of the RTIC shared memory */ - - u32 shm_buf_addr_msw; - /* Upper 32 bit of the RTIC shared memory */ - - u32 buf_size; - /* Size of buffer */ - - u16 shm_buf_mem_pool_id; - /* ADSP_MEMORY_MAP_SHMEM8_4K_POOL */ - - u16 shm_buf_num_regions; - /* number of regions to map */ - - u32 shm_buf_flag; - /* buffer property flag */ - - struct avs_shared_map_region_payload map_region; - /* memory map region*/ -} __packed; - -#define AVS_PARAM_ID_RTIC_EVENT_ACK 0x00013238 - -struct avs_param_rtic_event_ack { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param_v2 encdec; -} __packed; - -#define ASM_PARAM_ID_ENCDEC_BITRATE 0x00010C13 - -struct asm_bitrate_param { - u32 bitrate; -/* Maximum supported bitrate. Only the AAC encoder is supported.*/ - -} __packed; - -#define ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2 0x00010DA3 -#define ASM_PARAM_ID_AAC_SBR_PS_FLAG 0x00010C63 - -/* Flag to turn off both SBR and PS processing, if they are - * present in the bitstream. - */ - -#define ASM_AAC_SBR_OFF_PS_OFF (2) - -/* Flag to turn on SBR but turn off PS processing,if they are - * present in the bitstream. - */ - -#define ASM_AAC_SBR_ON_PS_OFF (1) - -/* Flag to turn on both SBR and PS processing, if they are - * present in the bitstream (default behavior). - */ - - -#define ASM_AAC_SBR_ON_PS_ON (0) - -/* Structure for an AAC SBR PS processing flag. */ - -/* Payload of the #ASM_PARAM_ID_AAC_SBR_PS_FLAG parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -struct asm_aac_sbr_ps_flag_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - - u32 sbr_ps_flag; -/* Control parameter to enable or disable SBR/PS processing in - * the AAC bitstream. Use the following macros to set this field: - * - #ASM_AAC_SBR_OFF_PS_OFF -- Turn off both SBR and PS - * processing, if they are present in the bitstream. - * - #ASM_AAC_SBR_ON_PS_OFF -- Turn on SBR processing, but not PS - * processing, if they are present in the bitstream. - * - #ASM_AAC_SBR_ON_PS_ON -- Turn on both SBR and PS processing, - * if they are present in the bitstream (default behavior). - * - All other values are invalid. - * Changes are applied to the next decoded frame. - */ -} __packed; - -#define ASM_PARAM_ID_AAC_DUAL_MONO_MAPPING 0x00010C64 - -/* First single channel element in a dual mono bitstream.*/ -#define ASM_AAC_DUAL_MONO_MAP_SCE_1 (1) - -/* Second single channel element in a dual mono bitstream.*/ -#define ASM_AAC_DUAL_MONO_MAP_SCE_2 (2) - -/* Structure for AAC decoder dual mono channel mapping. */ - - -struct asm_aac_dual_mono_mapping_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - u16 left_channel_sce; - u16 right_channel_sce; - -} __packed; - -#define ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2 0x00010DA4 -#define ASM_STREAM_CMDRSP_GET_PP_PARAMS_V3 0x0001320F - -struct asm_stream_cmdrsp_get_pp_params_v2 { - u32 status; -} __packed; - -#define ASM_PARAM_ID_AC3_KARAOKE_MODE 0x00010D73 - -/* Enumeration for both vocals in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_NO_VOCAL (0) - -/* Enumeration for only the left vocal in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_LEFT_VOCAL (1) - -/* Enumeration for only the right vocal in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_RIGHT_VOCAL (2) - -/* Enumeration for both vocal channels in a karaoke stream.*/ -#define AC3_KARAOKE_MODE_BOTH_VOCAL (3) -#define ASM_PARAM_ID_AC3_DRC_MODE 0x00010D74 -/* Enumeration for the Custom Analog mode.*/ -#define AC3_DRC_MODE_CUSTOM_ANALOG (0) - -/* Enumeration for the Custom Digital mode.*/ -#define AC3_DRC_MODE_CUSTOM_DIGITAL (1) -/* Enumeration for the Line Out mode (light compression).*/ -#define AC3_DRC_MODE_LINE_OUT (2) - -/* Enumeration for the RF remodulation mode (heavy compression).*/ -#define AC3_DRC_MODE_RF_REMOD (3) -#define ASM_PARAM_ID_AC3_DUAL_MONO_MODE 0x00010D75 - -/* Enumeration for playing dual mono in stereo mode.*/ -#define AC3_DUAL_MONO_MODE_STEREO (0) - -/* Enumeration for playing left mono.*/ -#define AC3_DUAL_MONO_MODE_LEFT_MONO (1) - -/* Enumeration for playing right mono.*/ -#define AC3_DUAL_MONO_MODE_RIGHT_MONO (2) - -/* Enumeration for mixing both dual mono channels and playing them.*/ -#define AC3_DUAL_MONO_MODE_MIXED_MONO (3) -#define ASM_PARAM_ID_AC3_STEREO_DOWNMIX_MODE 0x00010D76 - -/* Enumeration for using the Downmix mode indicated in the bitstream. */ - -#define AC3_STEREO_DOWNMIX_MODE_AUTO_DETECT (0) - -/* Enumeration for Surround Compatible mode (preserves the - * surround information). - */ - -#define AC3_STEREO_DOWNMIX_MODE_LT_RT (1) -/* Enumeration for Mono Compatible mode (if the output is to be - * further downmixed to mono). - */ - -#define AC3_STEREO_DOWNMIX_MODE_LO_RO (2) - -/* ID of the AC3 PCM scale factor parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -#define ASM_PARAM_ID_AC3_PCM_SCALEFACTOR 0x00010D78 - -/* ID of the AC3 DRC boost scale factor parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -#define ASM_PARAM_ID_AC3_DRC_BOOST_SCALEFACTOR 0x00010D79 - -/* ID of the AC3 DRC cut scale factor parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -#define ASM_PARAM_ID_AC3_DRC_CUT_SCALEFACTOR 0x00010D7A - -/* Structure for AC3 Generic Parameter. */ - -/* Payload of the AC3 parameters in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -struct asm_ac3_generic_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; - u32 generic_parameter; -/* AC3 generic parameter. Select from one of the following - * possible values. - * - * For #ASM_PARAM_ID_AC3_KARAOKE_MODE, supported values are: - * - AC3_KARAOKE_MODE_NO_VOCAL - * - AC3_KARAOKE_MODE_LEFT_VOCAL - * - AC3_KARAOKE_MODE_RIGHT_VOCAL - * - AC3_KARAOKE_MODE_BOTH_VOCAL - * - * For #ASM_PARAM_ID_AC3_DRC_MODE, supported values are: - * - AC3_DRC_MODE_CUSTOM_ANALOG - * - AC3_DRC_MODE_CUSTOM_DIGITAL - * - AC3_DRC_MODE_LINE_OUT - * - AC3_DRC_MODE_RF_REMOD - * - * For #ASM_PARAM_ID_AC3_DUAL_MONO_MODE, supported values are: - * - AC3_DUAL_MONO_MODE_STEREO - * - AC3_DUAL_MONO_MODE_LEFT_MONO - * - AC3_DUAL_MONO_MODE_RIGHT_MONO - * - AC3_DUAL_MONO_MODE_MIXED_MONO - * - * For #ASM_PARAM_ID_AC3_STEREO_DOWNMIX_MODE, supported values are: - * - AC3_STEREO_DOWNMIX_MODE_AUTO_DETECT - * - AC3_STEREO_DOWNMIX_MODE_LT_RT - * - AC3_STEREO_DOWNMIX_MODE_LO_RO - * - * For #ASM_PARAM_ID_AC3_PCM_SCALEFACTOR, supported values are - * 0 to 1 in Q31 format. - * - * For #ASM_PARAM_ID_AC3_DRC_BOOST_SCALEFACTOR, supported values are - * 0 to 1 in Q31 format. - * - * For #ASM_PARAM_ID_AC3_DRC_CUT_SCALEFACTOR, supported values are - * 0 to 1 in Q31 format. - */ -} __packed; - -/* Enumeration for Raw mode (no downmixing), which specifies - * that all channels in the bitstream are to be played out as is - * without any downmixing. (Default) - */ - -#define WMAPRO_CHANNEL_MASK_RAW (-1) - -/* Enumeration for setting the channel mask to 0. The 7.1 mode - * (Home Theater) is assigned. - */ - - -#define WMAPRO_CHANNEL_MASK_ZERO 0x0000 - -/* Speaker layout mask for one channel (Home Theater, mono). - * - Speaker front center - */ -#define WMAPRO_CHANNEL_MASK_1_C 0x0004 - -/* Speaker layout mask for two channels (Home Theater, stereo). - * - Speaker front left - * - Speaker front right - */ -#define WMAPRO_CHANNEL_MASK_2_L_R 0x0003 - -/* Speaker layout mask for three channels (Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - */ -#define WMAPRO_CHANNEL_MASK_3_L_C_R 0x0007 - -/* Speaker layout mask for two channels (stereo). - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_2_Bl_Br 0x0030 - -/* Speaker layout mask for four channels. - * - Speaker front left - * - Speaker front right - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_4_L_R_Bl_Br 0x0033 - -/* Speaker layout mask for four channels (Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back center - */ -#define WMAPRO_CHANNEL_MASK_4_L_R_C_Bc_HT 0x0107 -/* Speaker layout mask for five channels. - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_5_L_C_R_Bl_Br 0x0037 - -/* Speaker layout mask for five channels (5 mode, Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_5_L_C_R_Sl_Sr_HT 0x0607 -/* Speaker layout mask for six channels (5.1 mode). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker back left - * - Speaker back right - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Bl_Br_SLF 0x003F -/* Speaker layout mask for six channels (5.1 mode, Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Sl_Sr_SLF_HT 0x060F -/* Speaker layout mask for six channels (5.1 mode, no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - * - Speaker back center - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Bl_Br_Bc 0x0137 -/* Speaker layout mask for six channels (5.1 mode, Home Theater, - * no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back center - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_5DOT1_L_C_R_Sl_Sr_Bc_HT 0x0707 - -/* Speaker layout mask for seven channels (6.1 mode). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker back left - * - Speaker back right - * - Speaker back center - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Bl_Br_Bc_SLF 0x013F - -/* Speaker layout mask for seven channels (6.1 mode, Home - * Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker low frequency - * - Speaker back center - * - Speaker side left - * - Speaker side right - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Sl_Sr_Bc_SLF_HT 0x070F - -/* Speaker layout mask for seven channels (6.1 mode, no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - * - Speaker front left of center - * - Speaker front right of center - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Bl_Br_SFLOC_SFROC 0x00F7 - -/* Speaker layout mask for seven channels (6.1 mode, Home - * Theater, no LFE). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker side left - * - Speaker side right - * - Speaker front left of center - * - Speaker front right of center - */ -#define WMAPRO_CHANNEL_MASK_6DOT1_L_C_R_Sl_Sr_SFLOC_SFROC_HT 0x0637 - -/* Speaker layout mask for eight channels (7.1 mode). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker back left - * - Speaker back right - * - Speaker low frequency - * - Speaker front left of center - * - Speaker front right of center - */ -#define WMAPRO_CHANNEL_MASK_7DOT1_L_C_R_Bl_Br_SLF_SFLOC_SFROC \ - 0x00FF - -/* Speaker layout mask for eight channels (7.1 mode, Home Theater). - * - Speaker front left - * - Speaker front right - * - Speaker front center - * - Speaker side left - * - Speaker side right - * - Speaker low frequency - * - Speaker front left of center - * - Speaker front right of center - * - */ -#define WMAPRO_CHANNEL_MASK_7DOT1_L_C_R_Sl_Sr_SLF_SFLOC_SFROC_HT \ - 0x063F - -#define ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP 0x00010D82 - -/* Maximum number of decoder output channels. */ -#define MAX_CHAN_MAP_CHANNELS 16 - -/* Structure for decoder output channel mapping. */ - -/* Payload of the #ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP parameter in the - * #ASM_STREAM_CMD_SET_ENCDEC_PARAM command. - */ -struct asm_dec_out_chan_map_param { - struct apr_hdr hdr; - struct asm_stream_cmd_set_encdec_param encdec; - u32 num_channels; -/* Number of decoder output channels. - * Supported values: 0 to #MAX_CHAN_MAP_CHANNELS - * - * A value of 0 indicates native channel mapping, which is valid - * only for NT mode. This means the output of the decoder is to be - * preserved as is. - */ - u8 channel_mapping[MAX_CHAN_MAP_CHANNELS]; -} __packed; - -#define ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED 0x00010D84 - -/* Bitmask for the IEC 61937 enable flag.*/ -#define ASM_BIT_MASK_IEC_61937_STREAM_FLAG (0x00000001UL) - -/* Shift value for the IEC 61937 enable flag.*/ -#define ASM_SHIFT_IEC_61937_STREAM_FLAG 0 - -/* Bitmask for the IEC 60958 enable flag.*/ -#define ASM_BIT_MASK_IEC_60958_STREAM_FLAG (0x00000002UL) - -/* Shift value for the IEC 60958 enable flag.*/ -#define ASM_SHIFT_IEC_60958_STREAM_FLAG 1 - -/* Payload format for open write compressed command */ - -/* Payload format for the #ASM_STREAM_CMD_OPEN_WRITE_COMPRESSED - * command, which opens a stream for a given session ID and stream ID - * to be rendered in the compressed format. - */ - -struct asm_stream_cmd_open_write_compressed { - struct apr_hdr hdr; - u32 flags; -/* Mode flags that configure the stream for a specific format. - * Supported values: - * - Bit 0 -- IEC 61937 compatibility - * - 0 -- Stream is not in IEC 61937 format - * - 1 -- Stream is in IEC 61937 format - * - Bit 1 -- IEC 60958 compatibility - * - 0 -- Stream is not in IEC 60958 format - * - 1 -- Stream is in IEC 60958 format - * - Bits 2 to 31 -- 0 (Reserved) - * - * For the same stream, bit 0 cannot be set to 0 and bit 1 cannot - * be set to 1. A compressed stream connot have IEC 60958 - * packetization applied without IEC 61937 packetization. - * @note1hang Currently, IEC 60958 packetized input streams are not - * supported. - */ - - - u32 fmt_id; -/* Specifies the media type of the HDMI stream to be opened. - * Supported values: - * - #ASM_MEDIA_FMT_AC3 - * - #ASM_MEDIA_FMT_EAC3 - * - #ASM_MEDIA_FMT_DTS - * - #ASM_MEDIA_FMT_ATRAC - * - #ASM_MEDIA_FMT_MAT - * - * @note1hang This field must be set to a valid media type even if - * IEC 61937 packetization is not performed by the aDSP. - */ - -} __packed; - - -/* Indicates the number of samples per channel to be removed from the - * beginning of the stream. - */ -#define ASM_DATA_CMD_REMOVE_INITIAL_SILENCE 0x00010D67 - -/* Indicates the number of samples per channel to be removed from - * the end of the stream. - */ -#define ASM_DATA_CMD_REMOVE_TRAILING_SILENCE 0x00010D68 - -struct asm_data_cmd_remove_silence { - struct apr_hdr hdr; - u32 num_samples_to_remove; - /* < Number of samples per channel to be removed. - * @values 0 to (2@sscr{32}-1) - */ -} __packed; - -#define ASM_STREAM_CMD_OPEN_READ_COMPRESSED 0x00010D95 - -/* Bitmask for the IEC 61937 to 61937 pass-through capture. */ -#define ASM_BIT_MASK_IEC_61937_PASS_THROUGH_FLAG (0x00000001UL) - -/* Shift value for the IEC 61937 to 61937 pass-through capture. */ -#define ASM_SHIFT_IEC_61937_PASS_THROUGH_FLAG 0 - -struct asm_stream_cmd_open_read_compressed { - struct apr_hdr hdr; - u32 mode_flags; -/* Mode flags that indicate whether meta information per encoded - * frame is to be provided and packaging. - * Supported values for bit 0: (IEC 61937 pass-through mode) - * - 0 -- Unpack the IEC 61937 format stream to RAW compressed format - * - 1 -- Pass-through transfer of the IEC 61937 format stream - * - Use #ASM_BIT_MASK_IEC_61937_PASS_THROUGH_FLAG to set the bitmask - * and #ASM_SHIFT_IEC_61937_PASS_THROUGH_FLAG to set the shift value - * for this bit. - * Supported values for bit 4: - * - 0 -- Return data buffer contains all encoded frames only; it does - * not contain frame metadata. - * - 1 -- Return data buffer contains an array of metadata and encoded - * frames. - * - Use #ASM_BIT_MASK_META_INFO_FLAG to set the bitmask and - * #ASM_SHIFT_META_INFO_FLAG to set the shift value for this bit. - * All other bits are reserved; clients must set them to zero. - */ - - u32 frames_per_buf; -/* Indicates the number of frames that need to be returned per - * read buffer - * Supported values: should be greater than 0 for IEC to RAW compressed - * unpack mode. - * Value is don't care for IEC 61937 pass-through mode. - */ - -} __packed; - -/* adsp_asm_stream_commands.h*/ - - -/* adsp_asm_api.h (no changes)*/ -#define ASM_STREAM_POSTPROCOPO_ID_DEFAULT \ - 0x00010BE4 -#define ASM_STREAM_POSTPROCOPO_ID_PEAKMETER \ - 0x00010D83 -#define ASM_STREAM_POSTPROCOPO_ID_NONE \ - 0x00010C68 -#define ASM_STREAM_POSTPROCOPO_ID_MCH_PEAK_VOL \ - 0x00010D8B -#define ASM_STREAM_PREPROCOPO_ID_DEFAULT \ - ASM_STREAM_POSTPROCOPO_ID_DEFAULT -#define ASM_STREAM_PREPROCOPO_ID_NONE \ - ASM_STREAM_POSTPROCOPO_ID_NONE -#define ADM_CMD_COPP_OPENOPOLOGY_ID_NONE_AUDIO_COPP \ - 0x00010312 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_MONO_AUDIO_COPP \ - 0x00010313 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_AUDIO_COPP \ - 0x00010314 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_IIR_AUDIO_COPP\ - 0x00010704 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_MONO_AUDIO_COPP_MBDRCV2\ - 0x0001070D -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_AUDIO_COPP_MBDRCV2\ - 0x0001070E -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_IIR_AUDIO_COPP_MBDRCV2\ - 0x0001070F -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_STEREO_AUDIO_COPP_MBDRC_V3 \ - 0x11000000 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_SPEAKER_MCH_PEAK_VOL \ - 0x0001031B -#define ADM_CMD_COPP_OPENOPOLOGY_ID_MIC_MONO_AUDIO_COPP 0x00010315 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_MIC_STEREO_AUDIO_COPP 0x00010316 -#define AUDPROC_COPPOPOLOGY_ID_MCHAN_IIR_AUDIO 0x00010715 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_DEFAULT_AUDIO_COPP 0x00010BE3 -#define ADM_CMD_COPP_OPENOPOLOGY_ID_PEAKMETER_AUDIO_COPP 0x00010317 -#define AUDPROC_MODULE_ID_AIG 0x00010716 -#define AUDPROC_PARAM_ID_AIG_ENABLE 0x00010717 -#define AUDPROC_PARAM_ID_AIG_CONFIG 0x00010718 - -struct Audio_AigParam { - uint16_t mode; -/*< Mode word for enabling AIG/SIG mode . - * Byte offset: 0 - */ - int16_t staticGainL16Q12; -/*< Static input gain when aigMode is set to 1. - * Byte offset: 2 - */ - int16_t initialGainDBL16Q7; -/*= 0 for clock frequency to set @tablebulletend - */ - uint32_t clk_freq_in_hz; - - /* Use to specific divider for two clocks if needed. - * Set to Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO for no divider - * relation clocks - * @values - * - #Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO - * - #Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVIDEND - * - #Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVISOR @tablebulletend - */ - uint16_t clk_attri; - - /* - * Specifies the root clock source. - * Currently, only Q6AFE_LPASS_CLK_ROOT_DEFAULT is valid - * @values - * - 0 @tablebulletend - */ - uint16_t clk_root; - - /* - * for enable and disable clock. - * "clk_freq_in_hz", "clk_attri", and "clk_root" - * are ignored in disable clock case. - * @values? - * - 0 -- Disabled - * - 1 -- Enabled @tablebulletend - */ - uint32_t enable; -}; - -struct afe_clk_cfg { -/* Minor version used for tracking the version of the I2S - * configuration interface. - * Supported values: #AFE_API_VERSION_I2S_CONFIG - */ - u32 i2s_cfg_minor_version; - -/* clk value 1 in MHz. */ - u32 clk_val1; - -/* clk value 2 in MHz. */ - u32 clk_val2; - -/* clk_src - * #Q6AFE_LPASS_CLK_SRC_EXTERNAL - * #Q6AFE_LPASS_CLK_SRC_INTERNAL - */ - - u16 clk_src; - -/* clk_root -0 for default */ - u16 clk_root; - -/* clk_set_mode - * #Q6AFE_LPASS_MODE_BOTH_INVALID - * #Q6AFE_LPASS_MODE_CLK1_VALID - * #Q6AFE_LPASS_MODE_CLK2_VALID - * #Q6AFE_LPASS_MODE_BOTH_VALID - */ - u16 clk_set_mode; - -/* This param id is used to configure I2S clk */ - u16 reserved; -} __packed; - -/* This param id is used to configure I2S clk */ -#define AFE_PARAM_ID_LPAIF_CLK_CONFIG 0x00010238 -#define AFE_MODULE_CLOCK_SET 0x0001028F -#define AFE_PARAM_ID_CLOCK_SET 0x00010290 - -enum afe_lpass_digital_clk_src { - Q6AFE_LPASS_DIGITAL_ROOT_INVALID, - Q6AFE_LPASS_DIGITAL_ROOT_PRI_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_SEC_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_TER_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_QUAD_MI2S_OSR, - Q6AFE_LPASS_DIGITAL_ROOT_CDC_ROOT_CLK, -} __packed; - -/* This param id is used to configure internal clk */ -#define AFE_PARAM_ID_INTERNAL_DIGIATL_CDC_CLK_CONFIG 0x00010239 - -struct afe_digital_clk_cfg { -/* Minor version used for tracking the version of the I2S - * configuration interface. - * Supported values: #AFE_API_VERSION_I2S_CONFIG - */ - u32 i2s_cfg_minor_version; - -/* clk value in MHz. */ - u32 clk_val; - -/* INVALID - * PRI_MI2S_OSR - * SEC_MI2S_OSR - * TER_MI2S_OSR - * QUAD_MI2S_OSR - * DIGT_CDC_ROOT - */ - u16 clk_root; - -/* This field must be set to zero. */ - u16 reserved; -} __packed; - -/* - * Opcode for AFE to start DTMF. - */ -#define AFE_PORTS_CMD_DTMF_CTL 0x00010102 - -/** DTMF payload.*/ -struct afe_dtmf_generation_command { - struct apr_hdr hdr; - - /* - * Duration of the DTMF tone in ms. - * -1 -> continuous, - * 0 -> disable - */ - int64_t duration_in_ms; - - /* - * The DTMF high tone frequency. - */ - uint16_t high_freq; - - /* - * The DTMF low tone frequency. - */ - uint16_t low_freq; - - /* - * The DTMF volume setting - */ - uint16_t gain; - - /* - * The number of ports to enable/disable on. - */ - uint16_t num_ports; - - /* - * The Destination ports - array . - * For DTMF on multiple ports, portIds needs to - * be populated numPorts times. - */ - uint16_t port_ids; - - /* - * variable for 32 bit alignment of APR packet. - */ - uint16_t reserved; -} __packed; - -enum afe_config_type { - AFE_SLIMBUS_SLAVE_PORT_CONFIG, - AFE_SLIMBUS_SLAVE_CONFIG, - AFE_CDC_REGISTERS_CONFIG, - AFE_AANC_VERSION, - AFE_CDC_CLIP_REGISTERS_CONFIG, - AFE_CLIP_BANK_SEL, - AFE_CDC_REGISTER_PAGE_CONFIG, - AFE_MAX_CONFIG_TYPES, -}; - -struct afe_param_slimbus_slave_port_cfg { - uint32_t minor_version; - uint16_t slimbus_dev_id; - uint16_t slave_dev_pgd_la; - uint16_t slave_dev_intfdev_la; - uint16_t bit_width; - uint16_t data_format; - uint16_t num_channels; - uint16_t slave_port_mapping[AFE_PORT_MAX_AUDIO_CHAN_CNT]; -} __packed; - -struct afe_param_cdc_slimbus_slave_cfg { - uint32_t minor_version; - uint32_t device_enum_addr_lsw; - uint32_t device_enum_addr_msw; - uint16_t tx_slave_port_offset; - uint16_t rx_slave_port_offset; -} __packed; - -struct afe_param_cdc_reg_cfg { - uint32_t minor_version; - uint32_t reg_logical_addr; - uint32_t reg_field_type; - uint32_t reg_field_bit_mask; - uint16_t reg_bit_width; - uint16_t reg_offset_scale; -} __packed; - -#define AFE_API_VERSION_CDC_REG_PAGE_CFG 1 - -enum { - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_0 = 0, - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_1, - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_2, - AFE_CDC_REG_PAGE_ASSIGN_PROC_ID_3, -}; - -struct afe_param_cdc_reg_page_cfg { - uint32_t minor_version; - uint32_t enable; - uint32_t proc_id; -} __packed; - -struct afe_param_cdc_reg_cfg_data { - uint32_t num_registers; - struct afe_param_cdc_reg_cfg *reg_data; -} __packed; - -struct afe_svc_cmd_set_param_v1 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The total size of the payload, including param_hdr_v3 */ - uint32_t payload_size; - - /* The memory mapping header to be used when sending outband */ - struct mem_mapping_hdr mem_hdr; - - /* The parameter data to be filled when sent inband */ - u32 param_data[0]; -} __packed; - -struct afe_svc_cmd_set_param_v2 { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending outband */ - struct mem_mapping_hdr mem_hdr; - - /* The total size of the payload, including param_hdr_v3 */ - u32 payload_size; - - /* The parameter data to be filled when sent inband */ - u32 param_data[0]; -} __packed; - -struct afe_param_hw_mad_ctrl { - uint32_t minor_version; - uint16_t mad_type; - uint16_t mad_enable; -} __packed; - -struct afe_port_cmd_set_aanc_acdb_table { - struct apr_hdr hdr; - struct mem_mapping_hdr mem_hdr; -} __packed; - -/* Dolby DAP topology */ -#define DOLBY_ADM_COPP_TOPOLOGY_ID 0x0001033B -#define DS2_ADM_COPP_TOPOLOGY_ID 0x1301033B - -/* RMS value from DSP */ -#define RMS_MODULEID_APPI_PASSTHRU 0x10009011 -#define RMS_PARAM_FIRST_SAMPLE 0x10009012 -#define RMS_PAYLOAD_LEN 4 - -/* Customized mixing in matix mixer */ -#define MTMX_MODULE_ID_DEFAULT_CHMIXER 0x00010341 -#define DEFAULT_CHMIXER_PARAM_ID_COEFF 0x00010342 -#define CUSTOM_STEREO_PAYLOAD_SIZE 9 -#define CUSTOM_STEREO_CMD_PARAM_SIZE 24 -#define CUSTOM_STEREO_NUM_OUT_CH 0x0002 -#define CUSTOM_STEREO_NUM_IN_CH 0x0002 -#define CUSTOM_STEREO_INDEX_PARAM 0x0002 -#define Q14_GAIN_ZERO_POINT_FIVE 0x2000 -#define Q14_GAIN_UNITY 0x4000 - -/* Ultrasound supported formats */ -#define US_POINT_EPOS_FORMAT_V2 0x0001272D -#define US_RAW_FORMAT_V2 0x0001272C -#define US_PROX_FORMAT_V4 0x0001273B -#define US_RAW_SYNC_FORMAT 0x0001272F -#define US_GES_SYNC_FORMAT 0x00012730 - -#define AFE_MODULE_GROUP_DEVICE 0x00010254 -#define AFE_PARAM_ID_GROUP_DEVICE_CFG 0x00010255 -#define AFE_PARAM_ID_GROUP_DEVICE_ENABLE 0x00010256 -#define AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX 0x1102 - -/* Payload of the #AFE_PARAM_ID_GROUP_DEVICE_CFG - * parameter, which configures max of 8 AFE ports - * into a group. - * The fixed size of this structure is sixteen bytes. - */ -struct afe_group_device_group_cfg { - u32 minor_version; - u16 group_id; - u16 num_channels; - u16 port_id[8]; -} __packed; - -#define AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX \ - (AFE_PORT_ID_PRIMARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX \ - (AFE_PORT_ID_PRIMARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX \ - (AFE_PORT_ID_SECONDARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX \ - (AFE_PORT_ID_SECONDARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX \ - (AFE_PORT_ID_TERTIARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX \ - (AFE_PORT_ID_TERTIARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX \ - (AFE_PORT_ID_QUATERNARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX \ - (AFE_PORT_ID_QUATERNARY_TDM_TX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX \ - (AFE_PORT_ID_QUINARY_TDM_RX + 0x100) -#define AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX \ - (AFE_PORT_ID_QUINARY_TDM_TX + 0x100) - -/* ID of the parameter used by #AFE_MODULE_GROUP_DEVICE to configure the - * group device. #AFE_SVC_CMD_SET_PARAM can use this parameter ID. - * - * Requirements: - * - Configure the group before the member ports in the group are - * configured and started. - * - Enable the group only after it is configured. - * - Stop all member ports in the group before disabling the group. - */ -#define AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG 0x0001029E - -/* Version information used to handle future additions to - * AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG processing (for backward compatibility). - */ -#define AFE_API_VERSION_GROUP_DEVICE_TDM_CONFIG 0x1 - -/* Number of AFE ports in group device */ -#define AFE_GROUP_DEVICE_NUM_PORTS 8 - -/* Payload of the AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG parameter ID - * used by AFE_MODULE_GROUP_DEVICE. - */ -struct afe_param_id_group_device_tdm_cfg { - u32 group_device_cfg_minor_version; - /* Minor version used to track group device configuration. - * @values #AFE_API_VERSION_GROUP_DEVICE_TDM_CONFIG - */ - - u16 group_id; - /* ID for the group device. - * @values - * - #AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX - * - #AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX - * - #AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX - * - #AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX - * - #AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX - */ - - u16 reserved; - /* 0 */ - - u16 port_id[AFE_GROUP_DEVICE_NUM_PORTS]; - /* Array of member port IDs of this group. - * @values - * - #AFE_PORT_ID_PRIMARY_TDM_RX - * - #AFE_PORT_ID_PRIMARY_TDM_RX_1 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_2 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_3 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_4 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_5 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_6 - * - #AFE_PORT_ID_PRIMARY_TDM_RX_7 - - * - #AFE_PORT_ID_PRIMARY_TDM_TX - * - #AFE_PORT_ID_PRIMARY_TDM_TX_1 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_2 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_3 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_4 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_5 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_6 - * - #AFE_PORT_ID_PRIMARY_TDM_TX_7 - - * - #AFE_PORT_ID_SECONDARY_TDM_RX - * - #AFE_PORT_ID_SECONDARY_TDM_RX_1 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_2 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_3 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_4 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_5 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_6 - * - #AFE_PORT_ID_SECONDARY_TDM_RX_7 - - * - #AFE_PORT_ID_SECONDARY_TDM_TX - * - #AFE_PORT_ID_SECONDARY_TDM_TX_1 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_2 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_3 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_4 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_5 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_6 - * - #AFE_PORT_ID_SECONDARY_TDM_TX_7 - - * - #AFE_PORT_ID_TERTIARY_TDM_RX - * - #AFE_PORT_ID_TERTIARY_TDM_RX_1 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_2 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_3 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_4 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_5 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_6 - * - #AFE_PORT_ID_TERTIARY_TDM_RX_7 - - * - #AFE_PORT_ID_TERTIARY_TDM_TX - * - #AFE_PORT_ID_TERTIARY_TDM_TX_1 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_2 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_3 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_4 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_5 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_6 - * - #AFE_PORT_ID_TERTIARY_TDM_TX_7 - - * - #AFE_PORT_ID_QUATERNARY_TDM_RX - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_1 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_2 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_3 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_4 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_5 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_6 - * - #AFE_PORT_ID_QUATERNARY_TDM_RX_7 - - * - #AFE_PORT_ID_QUATERNARY_TDM_TX - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_1 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_2 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_3 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_4 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_5 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_6 - * - #AFE_PORT_ID_QUATERNARY_TDM_TX_7 - * @tablebulletend - */ - - u32 num_channels; - /* Number of enabled slots for TDM frame. - * @values 1 to 8 - */ - - u32 sample_rate; - /* Sampling rate of the port. - * @values - * - #AFE_PORT_SAMPLE_RATE_8K - * - #AFE_PORT_SAMPLE_RATE_16K - * - #AFE_PORT_SAMPLE_RATE_24K - * - #AFE_PORT_SAMPLE_RATE_32K - * - #AFE_PORT_SAMPLE_RATE_48K @tablebulletend - */ - - u32 bit_width; - /* Bit width of the sample. - * @values 16, 24, (32) - */ - - u16 nslots_per_frame; - /* Number of slots per frame. Typical : 1, 2, 4, 8, 16, 32. - * @values 1 - 32 - */ - - u16 slot_width; - /* Slot width of the slot in a TDM frame. (slot_width >= bit_width) - * have to be satisfied. - * @values 16, 24, 32 - */ - - u32 slot_mask; - /* Position of active slots. When that bit is set, that paricular - * slot is active. - * Number of active slots can be inferred by number of bits set in - * the mask. Only 8 individual bits can be enabled. - * Bits 0..31 corresponding to slot 0..31 - * @values 1 to 2^32 -1 - */ -} __packed; - -/* Payload of the #AFE_PARAM_ID_GROUP_DEVICE_ENABLE - * parameter, which enables or - * disables any module. - * The fixed size of this structure is four bytes. - */ - -struct afe_group_device_enable { - u16 group_id; - /* valid value is AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX */ - u16 enable; - /* Enables (1) or disables (0) the module. */ -} __packed; - -union afe_port_group_config { - struct afe_group_device_group_cfg group_cfg; - struct afe_group_device_enable group_enable; - struct afe_param_id_group_device_tdm_cfg tdm_cfg; -} __packed; - -/* ID of the parameter used by #AFE_MODULE_AUDIO_DEV_INTERFACE to specify - * the timing statistics of the corresponding device interface. - * Client can periodically query for the device time statistics to help adjust - * the PLL based on the drift value. The get param command must be sent to - * AFE port ID corresponding to device interface - - * This parameter ID supports following get param commands: - * #AFE_PORT_CMD_GET_PARAM_V2 and - * #AFE_PORT_CMD_GET_PARAM_V3. - */ -#define AFE_PARAM_ID_DEV_TIMING_STATS 0x000102AD - -/* Version information used to handle future additions to AFE device - * interface timing statistics (for backward compatibility). - */ -#define AFE_API_VERSION_DEV_TIMING_STATS 0x1 - -/* Enumeration for specifying a sink(Rx) device */ -#define AFE_SINK_DEVICE 0x0 - -/* Enumeration for specifying a source(Tx) device */ -#define AFE_SOURCE_DEVICE 0x1 - -/* Enumeration for specifying the drift reference is of type AV Timer */ -#define AFE_REF_TIMER_TYPE_AVTIMER 0x0 - -/* Message payload structure for the - * AFE_PARAM_ID_DEV_TIMING_STATS parameter. - */ -struct afe_param_id_dev_timing_stats { - /* Minor version used to track the version of device interface timing - * statistics. Currently, the supported version is 1. - * @values #AFE_API_VERSION_DEV_TIMING_STATS - */ - u32 minor_version; - - /* Indicates the device interface direction as either - * source (Tx) or sink (Rx). - * @values - * #AFE_SINK_DEVICE - * #AFE_SOURCE_DEVICE - */ - u16 device_direction; - - /* Reference timer for drift accumulation and time stamp information. - * @values - * #AFE_REF_TIMER_TYPE_AVTIMER @tablebulletend - */ - u16 reference_timer; - - /* - * Flag to indicate if resync is required on the client side for - * drift correction. Flag is set to TRUE for the first get_param - * response after device interface starts. This flag value can be - * used by client to identify if device interface restart has - * happened and if any re-sync is required at their end for drift - * correction. - * @values - * 0: FALSE (Resync not required) - * 1: TRUE (Resync required) @tablebulletend - */ - u32 resync_flag; - - /* Accumulated drift value in microseconds. This value is updated - * every 100th ms. - * Positive drift value indicates AV timer is running faster than device - * Negative drift value indicates AV timer is running slower than device - * @values Any valid int32 number - */ - s32 acc_drift_value; - - /* Lower 32 bits of the 64-bit absolute timestamp of reference - * timer in microseconds. - - * This timestamp corresponds to the time when the drift values - * are accumlated for every 100th ms. - * @values Any valid uint32 number - */ - u32 ref_timer_abs_ts_lsw; - - /* Upper 32 bits of the 64-bit absolute timestamp of reference - * timer in microseconds. - * This timestamp corresponds to the time when the drift values - * are accumlated for every 100th ms. - * @values Any valid uint32 number - */ - u32 ref_timer_abs_ts_msw; -} __packed; - -struct afe_av_dev_drift_get_param_resp { - uint32_t status; - struct param_hdr_v3 pdata; - struct afe_param_id_dev_timing_stats timing_stats; -} __packed; - -/* Command for Matrix or Stream Router */ -#define ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2 0x00010DCE -/* Module for AVSYNC */ -#define ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC 0x00010DC6 - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC to specify the - * render window start value. This parameter is supported only for a Set - * command (not a Get command) in the Rx direction - * (#ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2). - * Render window start is a value (session time minus timestamp, or ST-TS) - * below which frames are held, and after which frames are immediately - * rendered. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2 0x00010DD1 - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC to specify the - * render window end value. This parameter is supported only for a Set - * command (not a Get command) in the Rx direction - * (#ASM_SESSION_CMD_SET_MTMX_STRTR_PARAMS_V2). Render window end is a value - * (session time minus timestamp) above which frames are dropped, and below - * which frames are immediately rendered. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2 0x00010DD2 - -/* Generic payload of the window parameters in the - * #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC module. - * This payload is supported only for a Set command - * (not a Get command) on the Rx path. - */ -struct asm_session_mtmx_strtr_param_window_v2_t { - u32 window_lsw; - /* Lower 32 bits of the render window start value. */ - - u32 window_msw; - /* Upper 32 bits of the render window start value. - * - * The 64-bit number formed by window_lsw and window_msw specifies a - * signed 64-bit window value in microseconds. The sign extension is - * necessary. This value is used by the following parameter IDs: - * #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_START_V2 - * #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_WINDOW_END_V2 - * #ASM_SESSION_MTMX_STRTR_PARAM_STAT_WINDOW_START_V2 - * #ASM_SESSION_MTMX_STRTR_PARAM_STAT_WINDOW_END_V2 - * The value depends on which parameter ID is used. - * The aDSP honors the windows at a granularity of 1 ms. - */ -}; - -struct asm_session_cmd_set_mtmx_strstr_params_v2 { - uint32_t data_payload_addr_lsw; - /* Lower 32 bits of the 64-bit data payload address. */ - - uint32_t data_payload_addr_msw; - /* Upper 32 bits of the 64-bit data payload address. - * If the address is not sent (NULL), the message is in the payload. - * If the address is sent (non-NULL), the parameter data payloads - * begin at the specified address. - */ - - uint32_t mem_map_handle; - /* Unique identifier for an address. This memory map handle is returned - * by the aDSP through the #ASM_CMD_SHARED_MEM_MAP_REGIONS command. - * values - * - NULL -- Parameter data payloads are within the message payload - * (in-band). - * - Non-NULL -- Parameter data payloads begin at the address specified - * in the data_payload_addr_lsw and data_payload_addr_msw fields - * (out-of-band). - */ - - uint32_t data_payload_size; - /* Actual size of the variable payload accompanying the message, or in - * shared memory. This field is used for parsing the parameter payload. - * values > 0 bytes - */ - - uint32_t direction; - /* Direction of the entity (matrix mixer or stream router) on which - * the parameter is to be set. - * values - * - 0 -- Rx (for Rx stream router or Rx matrix mixer) - * - 1 -- Tx (for Tx stream router or Tx matrix mixer) - */ -}; - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC which allows the - * audio client choose the rendering decision that the audio DSP should use. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_MODE_CMD 0x00012F0D - -/* Indicates that rendering decision will be based on default rate - * (session clock based rendering, device driven). - * 1. The default session clock based rendering is inherently driven - * by the timing of the device. - * 2. After the initial decision is made (first buffer after a run - * command), subsequent data rendering decisions are made with - * respect to the rate at which the device is rendering, thus deriving - * its timing from the device. - * 3. While this decision making is simple, it has some inherent limitations - * (mentioned in the next section). - * 4. If this API is not set, the session clock based rendering will be assumed - * and this will ensure that the DSP is backward compatible. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT 0 - -/* Indicates that rendering decision will be based on local clock rate. - * 1. In the DSP loopback/client loopback use cases (frame based - * inputs), the incoming data into audio DSP is time-stamped at the - * local clock rate (STC). - * 2. This TS rate may match the incoming data rate or maybe different - * from the incoming data rate. - * 3. Regardless, the data will be time-stamped with local STC and - * therefore, the client is recommended to set this mode for these - * use cases. This method is inherently more robust to sequencing - * (AFE Start/Stop) and device switches, among other benefits. - * 4. This API will inform the DSP to compare every incoming buffer TS - * against local STC. - * 5. DSP will continue to honor render windows APIs, as before. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC 1 - -/* Structure for rendering decision parameter */ -struct asm_session_mtmx_strtr_param_render_mode_t { - /* Specifies the type of rendering decision the audio DSP should use. - * - * @values - * - #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_DEFAULT - * - #ASM_SESSION_MTMX_STRTR_PARAM_RENDER_LOCAL_STC - */ - u32 flags; -} __packed; - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC which allows the - * audio client to specify the clock recovery mechanism that the audio DSP - * should use. - */ - -#define ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_CMD 0x00012F0E - -/* Indicates that default clock recovery will be used (no clock recovery). - * If the client wishes that no clock recovery be done, the client can - * choose this. This means that no attempt will made by the DSP to try and - * match the rates of the input and output audio. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_NONE 0 - -/* Indicates that independent clock recovery needs to be used. - * 1. In the DSP loopback/client loopback use cases (frame based inputs), - * the client should choose the independent clock recovery option. - * 2. This basically de-couples the audio and video from knowing each others - * clock sources and lets the audio DSP independently rate match the input - * and output rates. - * 3. After drift detection, the drift correction is achieved by either pulling - * the PLLs (if applicable) or by stream to device rate matching - * (for PCM use cases) by comparing drift with respect to STC. - * 4. For passthrough use cases, since the PLL pulling is the only option, - * a best effort will be made. - * If PLL pulling is not possible / available, the rendering will be - * done without rate matching. - */ -#define ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_AUTO 1 - -/* Payload of the #ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC parameter. - */ -struct asm_session_mtmx_strtr_param_clk_rec_t { - /* Specifies the type of clock recovery that the audio DSP should - * use for rate matching. - */ - - /* @values - * #ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_DEFAULT - * #ASM_SESSION_MTMX_STRTR_PARAM_CLK_REC_INDEPENDENT - */ - u32 flags; -} __packed; - - -/* Parameter used by #ASM_SESSION_MTMX_STRTR_MODULE_ID_AVSYNC to - * realize smoother adjustment of audio session clock for a specified session. - * The desired audio session clock adjustment(in micro seconds) is specified - * using the command #ASM_SESSION_CMD_ADJUST_SESSION_CLOCK_V2. - * Delaying/Advancing the session clock would be implemented by inserting - * interpolated/dropping audio samples in the playback path respectively. - * Also, this parameter has to be configured before the Audio Session is put - * to RUN state to avoid cold start latency/glitches in the playback. - */ - -#define ASM_SESSION_MTMX_PARAM_ADJUST_SESSION_TIME_CTL 0x00013217 - -struct asm_session_mtmx_param_adjust_session_time_ctl_t { - /* Specifies whether the module is enabled or not - * @values - * 0 -- disabled - * 1 -- enabled - */ - u32 enable; -}; - -union asm_session_mtmx_strtr_param_config { - struct asm_session_mtmx_strtr_param_window_v2_t window_param; - struct asm_session_mtmx_strtr_param_render_mode_t render_param; - struct asm_session_mtmx_strtr_param_clk_rec_t clk_rec_param; - struct asm_session_mtmx_param_adjust_session_time_ctl_t adj_time_param; -} __packed; - -struct asm_mtmx_strtr_params { - struct apr_hdr hdr; - struct asm_session_cmd_set_mtmx_strstr_params_v2 param; - struct param_hdr_v1 data; - union asm_session_mtmx_strtr_param_config config; -} __packed; - -#define ASM_SESSION_CMD_GET_MTMX_STRTR_PARAMS_V2 0x00010DCF -#define ASM_SESSION_CMDRSP_GET_MTMX_STRTR_PARAMS_V2 0x00010DD0 - -#define ASM_SESSION_MTMX_STRTR_PARAM_SESSION_TIME_V3 0x00012F0B -#define ASM_SESSION_MTMX_STRTR_PARAM_STIME_TSTMP_FLG_BMASK (0x80000000UL) - -struct asm_session_cmd_get_mtmx_strstr_params_v2 { - uint32_t data_payload_addr_lsw; - /* Lower 32 bits of the 64-bit data payload address. */ - - uint32_t data_payload_addr_msw; - /* - * Upper 32 bits of the 64-bit data payload address. - * If the address is not sent (NULL), the message is in the payload. - * If the address is sent (non-NULL), the parameter data payloads - * begin at the specified address. - */ - - uint32_t mem_map_handle; - /* - * Unique identifier for an address. This memory map handle is returned - * by the aDSP through the #ASM_CMD_SHARED_MEM_MAP_REGIONS command. - * values - * - NULL -- Parameter data payloads are within the message payload - * (in-band). - * - Non-NULL -- Parameter data payloads begin at the address specified - * in the data_payload_addr_lsw and data_payload_addr_msw fields - * (out-of-band). - */ - uint32_t direction; - /* - * Direction of the entity (matrix mixer or stream router) on which - * the parameter is to be set. - * values - * - 0 -- Rx (for Rx stream router or Rx matrix mixer) - * - 1 -- Tx (for Tx stream router or Tx matrix mixer) - */ - uint32_t module_id; - /* Unique module ID. */ - - uint32_t param_id; - /* Unique parameter ID. */ - - uint32_t param_max_size; -}; - -struct asm_session_mtmx_strtr_param_session_time_v3_t { - uint32_t session_time_lsw; - /* Lower 32 bits of the current session time in microseconds */ - - uint32_t session_time_msw; - /* - * Upper 32 bits of the current session time in microseconds. - * The 64-bit number formed by session_time_lsw and session_time_msw - * is treated as signed. - */ - - uint32_t absolute_time_lsw; - /* - * Lower 32 bits of the 64-bit absolute time in microseconds. - * This is the time when the sample corresponding to the - * session_time_lsw is rendered to the hardware. This absolute - * time can be slightly in the future or past. - */ - - uint32_t absolute_time_msw; - /* - * Upper 32 bits of the 64-bit absolute time in microseconds. - * This is the time when the sample corresponding to the - * session_time_msw is rendered to hardware. This absolute - * time can be slightly in the future or past. The 64-bit number - * formed by absolute_time_lsw and absolute_time_msw is treated as - * unsigned. - */ - - uint32_t time_stamp_lsw; - /* Lower 32 bits of the last processed timestamp in microseconds */ - - uint32_t time_stamp_msw; - /* - * Upper 32 bits of the last processed timestamp in microseconds. - * The 64-bit number formed by time_stamp_lsw and time_stamp_lsw - * is treated as unsigned. - */ - - uint32_t flags; - /* - * Keeps track of any additional flags needed. - * @values{for bit 31} - * - 0 -- Uninitialized/invalid - * - 1 -- Valid - * All other bits are reserved; clients must set them to zero. - */ -}; - -union asm_session_mtmx_strtr_data_type { - struct asm_session_mtmx_strtr_param_session_time_v3_t session_time; -}; - -struct asm_mtmx_strtr_get_params { - struct apr_hdr hdr; - struct asm_session_cmd_get_mtmx_strstr_params_v2 param_info; -} __packed; - -struct asm_mtmx_strtr_get_params_cmdrsp { - uint32_t err_code; - struct param_hdr_v1 param_info; - union asm_session_mtmx_strtr_data_type param_data; -} __packed; - -#define AUDPROC_MODULE_ID_RESAMPLER 0x00010719 - -enum { - LEGACY_PCM = 0, - COMPRESSED_PASSTHROUGH, - COMPRESSED_PASSTHROUGH_CONVERT, - COMPRESSED_PASSTHROUGH_DSD, - LISTEN, - COMPRESSED_PASSTHROUGH_GEN, - COMPRESSED_PASSTHROUGH_IEC61937 -}; - -#define AUDPROC_MODULE_ID_COMPRESSED_MUTE 0x00010770 -#define AUDPROC_PARAM_ID_COMPRESSED_MUTE 0x00010771 - -struct adm_set_compressed_device_mute { - u32 mute_on; -} __packed; - -#define AUDPROC_MODULE_ID_COMPRESSED_LATENCY 0x0001076E -#define AUDPROC_PARAM_ID_COMPRESSED_LATENCY 0x0001076F - -struct adm_set_compressed_device_latency { - u32 latency; -} __packed; - -#define VOICEPROC_MODULE_ID_GENERIC_TX 0x00010EF6 -#define VOICEPROC_MODULE_ID_FLUENCE_PRO_VC_TX 0x00010F35 -#define VOICEPROC_PARAM_ID_FLUENCE_SOUNDFOCUS 0x00010E37 -#define VOICEPROC_PARAM_ID_FLUENCE_SOURCETRACKING 0x00010E38 -#define MAX_SECTORS 8 -#define MAX_NOISE_SOURCE_INDICATORS 3 -#define MAX_POLAR_ACTIVITY_INDICATORS 360 - -struct sound_focus_param { - uint16_t start_angle[MAX_SECTORS]; - uint8_t enable[MAX_SECTORS]; - uint16_t gain_step; -} __packed; - -struct source_tracking_param { - uint8_t vad[MAX_SECTORS]; - uint16_t doa_speech; - uint16_t doa_noise[MAX_NOISE_SOURCE_INDICATORS]; - uint8_t polar_activity[MAX_POLAR_ACTIVITY_INDICATORS]; -} __packed; - -struct adm_param_fluence_soundfocus_t { - uint16_t start_angles[MAX_SECTORS]; - uint8_t enables[MAX_SECTORS]; - uint16_t gain_step; - uint16_t reserved; -} __packed; - -struct adm_param_fluence_sourcetracking_t { - uint8_t vad[MAX_SECTORS]; - uint16_t doa_speech; - uint16_t doa_noise[MAX_NOISE_SOURCE_INDICATORS]; - uint8_t polar_activity[MAX_POLAR_ACTIVITY_INDICATORS]; -} __packed; - -#define AUDPROC_MODULE_ID_AUDIOSPHERE 0x00010916 -#define AUDPROC_PARAM_ID_AUDIOSPHERE_ENABLE 0x00010917 -#define AUDPROC_PARAM_ID_AUDIOSPHERE_STRENGTH 0x00010918 -#define AUDPROC_PARAM_ID_AUDIOSPHERE_CONFIG_MODE 0x00010919 - -#define AUDPROC_PARAM_ID_AUDIOSPHERE_COEFFS_STEREO_INPUT 0x0001091A -#define AUDPROC_PARAM_ID_AUDIOSPHERE_COEFFS_MULTICHANNEL_INPUT 0x0001091B -#define AUDPROC_PARAM_ID_AUDIOSPHERE_DESIGN_STEREO_INPUT 0x0001091C -#define AUDPROC_PARAM_ID_AUDIOSPHERE_DESIGN_MULTICHANNEL_INPUT 0x0001091D - -#define AUDPROC_PARAM_ID_AUDIOSPHERE_OPERATING_INPUT_MEDIA_INFO 0x0001091E - -#define AUDPROC_MODULE_ID_VOICE_TX_SECNS 0x10027059 -#define AUDPROC_PARAM_IDX_SEC_PRIMARY_MIC_CH 0x10014444 - -struct admx_sec_primary_mic_ch { - uint16_t version; - uint16_t reserved; - uint16_t sec_primary_mic_ch; - uint16_t reserved1; -} __packed; - -#define FFECNS_MODULE_ID 0x00010952 -#define FLUENCE_CMN_GLOBAL_EFFECT_PARAM_ID 0x00010EAF -#define FFECNS_TOPOLOGY 0X10028003 - -struct ffecns_effect { - uint32_t payload; -}; - -/** ID of the Voice Activity Detection (VAD) module, which is used to - * configure AFE VAD. - */ -#define AFE_MODULE_VAD 0x000102B9 - -/** ID of the parameter used by #AFE_MODULE_VAD to configure the VAD. - */ -#define AFE_PARAM_ID_VAD_CFG 0x000102BA - -#define AFE_API_VERSION_VAD_CFG 0x1 - -/* Payload of the AFE_PARAM_ID_VAD_CONFIG parameter used by - * AFE_MODULE_VAD. - */ -struct afe_param_id_vad_cfg_t { - uint32_t vad_cfg_minor_version; - /** Tracks the configuration of this parameter. - * Supported Values: #AFE_API_VERSION_VAD_CFG - */ - - uint32_t pre_roll_in_ms; - /** Pre-roll period in ms. - * Supported Values: 0x0 to 0x3E8 - */ -} __packed; - -#define AFE_PARAM_ID_VAD_CORE_CFG 0x000102BB - -#endif /*_APR_AUDIO_V2_H_ */ diff --git a/techpack/audio/include/dsp/apr_elliptic.h b/techpack/audio/include/dsp/apr_elliptic.h deleted file mode 100755 index 4219144b6b99..000000000000 --- a/techpack/audio/include/dsp/apr_elliptic.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#define ELLIPTIC_SET_PARAMS_SIZE 114 -#define ELLIPTIC_ULTRASOUND_MODULE_TX 0x0F010201 -#define ELLIPTIC_ULTRASOUND_MODULE_RX 0x0FF10202 -#define ULTRASOUND_OPCODE 0x0FF10204 - -/* This need to be updated for all platforms */ -#define ELLIPTIC_PORT_ID SLIMBUS_2_TX - -/** Sequence of Elliptic Labs Ultrasound module parameters */ -struct afe_ultrasound_set_params_t { - uint32_t payload[ELLIPTIC_SET_PARAMS_SIZE]; -} __packed; - -/** Sequence of Elliptic Labs Ultrasound module parameters */ - -/** Elliptic APR public */ - -int32_t ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, - u8 *user_params, int32_t length); - -int32_t elliptic_process_apr_payload(uint32_t *payload); - -int elliptic_notify_gain_change_msg(int component_id, int gaindb); - -typedef struct afe_ultrasound_state { - atomic_t us_apr_state; - void **ptr_apr; - atomic_t *ptr_status; - atomic_t *ptr_state; - wait_queue_head_t *ptr_wait; - int timeout_ms; -} afe_ultrasound_state_t; - -extern afe_ultrasound_state_t elus_afe; diff --git a/techpack/audio/include/dsp/apr_mius.h b/techpack/audio/include/dsp/apr_mius.h deleted file mode 100644 index 8a372ffe65a2..000000000000 --- a/techpack/audio/include/dsp/apr_mius.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#define MIUS_SET_PARAMS_SIZE 114 -#define MIUS_ULTRASOUND_MODULE_TX 0x0F010201 -#define MIUS_ULTRASOUND_MODULE_RX 0x0FF10202 -#define MI_ULTRASOUND_OPCODE 0x0FF10208 - -/* This need to be updated for all platforms */ -#define MIUS_PORT_ID SLIMBUS_2_TX - -/** Sequence of MI Ultrasound module parameters */ -struct afe_mi_ultrasound_set_params_t { - uint32_t payload[MIUS_SET_PARAMS_SIZE]; -} __packed; - -/** Sequence of MI Ultrasound module parameters */ - -/** Elliptic APR public */ - -int32_t mi_ultrasound_apr_set_parameter(int32_t port_id, uint32_t param_id, - u8 *user_params, int32_t length); - -int32_t mius_process_apr_payload(uint32_t *payload); - -int mius_notify_gain_change_msg(int component_id, int gaindb); - -typedef struct afe_mi_ultrasound_state { - atomic_t us_apr_state; - void **ptr_apr; - atomic_t *ptr_status; - atomic_t *ptr_state; - wait_queue_head_t *ptr_wait; - int timeout_ms; -} afe_mi_ultrasound_state_t; - -extern afe_mi_ultrasound_state_t mius_afe; diff --git a/techpack/audio/include/dsp/audio_cal_utils.h b/techpack/audio/include/dsp/audio_cal_utils.h deleted file mode 100644 index 614ef236644d..000000000000 --- a/techpack/audio/include/dsp/audio_cal_utils.h +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2014, 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _AUDIO_CAL_UTILS_H -#define _AUDIO_CAL_UTILS_H - -#include -#include -#include -#include - -struct cal_data { - size_t size; - void *kvaddr; - phys_addr_t paddr; -}; - -struct mem_map_data { - size_t map_size; - int32_t q6map_handle; - int32_t ion_map_handle; - struct dma_buf *dma_buf; -}; - -struct cal_block_data { - size_t client_info_size; - void *client_info; - void *cal_info; - struct list_head list; - struct cal_data cal_data; - bool cal_stale; - struct mem_map_data map_data; - int32_t buffer_number; -}; - -struct cal_util_callbacks { - int (*map_cal) - (int32_t cal_type, struct cal_block_data *cal_block); - int (*unmap_cal) - (int32_t cal_type, struct cal_block_data *cal_block); - bool (*match_block) - (struct cal_block_data *cal_block, void *user_data); -}; - -struct cal_type_info { - struct audio_cal_reg reg; - struct cal_util_callbacks cal_util_callbacks; -}; - -struct cal_type_data { - struct cal_type_info info; - struct mutex lock; - struct list_head cal_blocks; -}; - - -/* to register & degregister with cal util driver */ -int cal_utils_create_cal_types(int num_cal_types, - struct cal_type_data **cal_type, - struct cal_type_info *info); -void cal_utils_destroy_cal_types(int num_cal_types, - struct cal_type_data **cal_type); - -/* common functions for callbacks */ -int cal_utils_alloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info); -int cal_utils_dealloc_cal(size_t data_size, void *data, - struct cal_type_data *cal_type); -int cal_utils_set_cal(size_t data_size, void *data, - struct cal_type_data *cal_type, - size_t client_info_size, void *client_info); - -/* use for SSR */ -void cal_utils_clear_cal_block_q6maps(int num_cal_types, - struct cal_type_data **cal_type); - - -/* common matching functions used to add blocks */ -bool cal_utils_match_buf_num(struct cal_block_data *cal_block, - void *user_data); - -/* common matching functions to find cal blocks */ -struct cal_block_data *cal_utils_get_only_cal_block( - struct cal_type_data *cal_type); - -/* Size of calibration specific data */ -size_t get_cal_info_size(int32_t cal_type); -size_t get_user_cal_type_size(int32_t cal_type); - -/* Version of the cal type*/ -int32_t cal_utils_get_cal_type_version(void *cal_type_data); - -void cal_utils_mark_cal_used(struct cal_block_data *cal_block); - -bool cal_utils_is_cal_stale(struct cal_block_data *cal_block); -#endif diff --git a/techpack/audio/include/dsp/audio_calibration.h b/techpack/audio/include/dsp/audio_calibration.h deleted file mode 100644 index 5decff913493..000000000000 --- a/techpack/audio/include/dsp/audio_calibration.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _AUDIO_CALIBRATION_H -#define _AUDIO_CALIBRATION_H - -#include - -/* Used by driver in buffer_number field to notify client - * To update all blocks, for example: freeing all memory - */ -#define ALL_CAL_BLOCKS -1 - - -struct audio_cal_callbacks { - int (*alloc)(int32_t cal_type, size_t data_size, void *data); - int (*dealloc)(int32_t cal_type, size_t data_size, void *data); - int (*pre_cal)(int32_t cal_type, size_t data_size, void *data); - int (*set_cal)(int32_t cal_type, size_t data_size, void *data); - int (*get_cal)(int32_t cal_type, size_t data_size, void *data); - int (*post_cal)(int32_t cal_type, size_t data_size, void *data); -}; - -struct audio_cal_reg { - int32_t cal_type; - struct audio_cal_callbacks callbacks; -}; - -int audio_cal_register(int num_cal_types, struct audio_cal_reg *reg_data); -int audio_cal_deregister(int num_cal_types, struct audio_cal_reg *reg_data); - -#endif diff --git a/techpack/audio/include/dsp/audio_notifier.h b/techpack/audio/include/dsp/audio_notifier.h deleted file mode 100644 index 7eda2c35c2d0..000000000000 --- a/techpack/audio/include/dsp/audio_notifier.h +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2016, 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __AUDIO_NOTIFIER_H_ -#define __AUDIO_NOTIFIER_H_ - -/* State of the notifier domain */ -enum { - AUDIO_NOTIFIER_SERVICE_DOWN, - AUDIO_NOTIFIER_SERVICE_UP -}; - -/* Service order determines connection priority - * Highest number connected first - */ -enum { - AUDIO_NOTIFIER_SSR_SERVICE, - AUDIO_NOTIFIER_PDR_SERVICE, - AUDIO_NOTIFIER_MAX_SERVICES -}; - -enum { - AUDIO_NOTIFIER_ADSP_DOMAIN, - AUDIO_NOTIFIER_MODEM_DOMAIN, - AUDIO_NOTIFIER_MAX_DOMAINS -}; - -/* Structure populated in void *data of nb function - * callback used for audio_notifier_register - */ -struct audio_notifier_cb_data { - int service; - int domain; -}; - -#if IS_ENABLED(CONFIG_MSM_QDSP6_NOTIFIER) - -/* - * Use audio_notifier_register to register any audio - * clients who need to be notified of a remote process. - * This API will determine and register the client with - * the best available subsystem (SSR or PDR) for that - * domain (Adsp or Modem). When an event is sent from that - * domain the notifier block callback function will be called. - * - * client_name - A unique user name defined by the client. - * If the same name is used for multiple calls each will - * be tracked & called back separately and a single call - * to deregister will delete them all. - * domain - Domain the client wants to get events from. - * AUDIO_NOTIFIER_ADSP_DOMAIN - * AUDIO_NOTIFIER_MODEM_DOMAIN - * *nb - Pointer to a notifier block. Provide a callback function - * to be notified of an even on that domain. - * - * nb_func(struct notifier_block *this, unsigned long opcode, void *data) - * this - pointer to own nb - * opcode - event from registered domain - * AUDIO_NOTIFIER_SERVICE_DOWN - * AUDIO_NOTIFIER_SERVICE_UP - * *data - pointer to struct audio_notifier_cb_data - * - * Returns: Success: 0 - * Error: -# - */ -int audio_notifier_register(char *client_name, int domain, - struct notifier_block *nb); - -/* - * Use audio_notifier_deregister to deregister the clients from - * all domains registered using audio_notifier_register that - * match the client name. - * - * client_name - Unique user name used in audio_notifier_register. - * Returns: Success: 0 - * Error: -# - */ -int audio_notifier_deregister(char *client_name); - -#else - -static inline int audio_notifier_register(char *client_name, int domain, - struct notifier_block *nb) -{ - return 0; -} - -static inline int audio_notifier_deregister(char *client_name) -{ - return 0; -} - -#endif /* CONFIG_MSM_QDSP6_NOTIFIER */ - -#endif diff --git a/techpack/audio/include/dsp/msm-audio-effects-q6-v2.h b/techpack/audio/include/dsp/msm-audio-effects-q6-v2.h deleted file mode 100644 index 6bc2338bcf55..000000000000 --- a/techpack/audio/include/dsp/msm-audio-effects-q6-v2.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2013-2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_AUDIO_EFFECTS_H -#define _MSM_AUDIO_EFFECTS_H - -#include - -#define MAX_PP_PARAMS_SZ 128 - -bool msm_audio_effects_is_effmodule_supp_in_top(int effect_module, - int topology); - -int msm_audio_effects_enable_extn(struct audio_client *ac, - struct msm_nt_eff_all_config *effects, - bool flag); - -int msm_audio_effects_reverb_handler(struct audio_client *ac, - struct reverb_params *reverb, - long *values); - -int msm_audio_effects_bass_boost_handler(struct audio_client *ac, - struct bass_boost_params *bass_boost, - long *values); - -int msm_audio_effects_pbe_handler(struct audio_client *ac, - struct pbe_params *pbe, - long *values); - -int msm_audio_effects_virtualizer_handler(struct audio_client *ac, - struct virtualizer_params *virtualizer, - long *values); - -int msm_audio_effects_popless_eq_handler(struct audio_client *ac, - struct eq_params *eq, - long *values); - -int msm_audio_effects_volume_handler(struct audio_client *ac, - struct soft_volume_params *vol, - long *values); - -int msm_audio_effects_volume_handler_v2(struct audio_client *ac, - struct soft_volume_params *vol, - long *values, int instance); -#endif /*_MSM_AUDIO_EFFECTS_H*/ diff --git a/techpack/audio/include/dsp/msm-audio-event-notify.h b/techpack/audio/include/dsp/msm-audio-event-notify.h deleted file mode 100644 index fc47eff8abbf..000000000000 --- a/techpack/audio/include/dsp/msm-audio-event-notify.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __MSM_AUDIO_EVENT_NOTIFY_H_ -#define __MSM_AUDIO_EVENT_NOTIFY_H_ - -#include - -#if IS_ENABLED(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) -int msm_aud_evt_register_client(struct notifier_block *nb); -int msm_aud_evt_unregister_client(struct notifier_block *nb); -int msm_aud_evt_notifier_call_chain(unsigned long val, void *v); -int msm_aud_evt_blocking_register_client(struct notifier_block *nb); -int msm_aud_evt_blocking_unregister_client(struct notifier_block *nb); -int msm_aud_evt_blocking_notifier_call_chain(unsigned long val, void *v); -#else -static inline int msm_aud_evt_register_client(struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_unregister_client(struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_notifier_call_chain(unsigned long val, void *v) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_blocking_register_client( - struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_blocking_unregister_client( - struct notifier_block *nb) -{ - return -ENOSYS; -} - -static inline int msm_aud_evt_blocking_notifier_call_chain( - unsigned long val, void *v) -{ - return -ENOSYS; -} -#endif - -enum { - MSM_AUD_DC_EVENT = 1, - SWR_WAKE_IRQ_REGISTER, - SWR_WAKE_IRQ_DEREGISTER, - SWR_WAKE_IRQ_EVENT, -}; - -#endif diff --git a/techpack/audio/include/dsp/msm-cirrus-playback.h b/techpack/audio/include/dsp/msm-cirrus-playback.h deleted file mode 100755 index 2991c4614f04..000000000000 --- a/techpack/audio/include/dsp/msm-cirrus-playback.h +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (c) 2015 Cirrus Logic, Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MSM_CIRRUS_PLAYBACK_H -#define MSM_CIRRUS_PLAYBACK_H -#define DEBUG -#include -#include -#include -#include -#include -#include - - -#define MIN_CHAN_SWAP_SAMPLES 48 -#define MAX_CHAN_SWAP_SAMPLES 9600 -#define VOL_ATTN_MAX 0x7FFFFFFF -#define VOL_ATTN_18DB 257698038 -#define VOL_ATTN_24DB 128849019 - -struct afe_cspl_state { - void **apr; - atomic_t *status; - atomic_t *state; - wait_queue_head_t *wait; - int timeout_ms; -}; - -extern struct afe_cspl_state cspl_afe; - -struct afe_custom_crus_set_config_v2_t { - struct apr_hdr hdr; - struct afe_port_cmd_set_param_v2 param; - struct param_hdr_v2 data; -} __packed; - -struct afe_custom_crus_get_config_v2_t { - struct apr_hdr hdr; - struct afe_port_cmd_get_param_v2 param; - struct param_hdr_v2 data; -} __packed; - -struct afe_custom_crus_set_config_t { - struct apr_hdr hdr; - struct afe_port_cmd_set_param_v3 param; - struct param_hdr_v3 data; -} __packed; - -struct afe_custom_crus_get_config_t { - struct apr_hdr hdr; - struct afe_port_cmd_get_param_v3 param; - struct param_hdr_v3 data; -} __packed; - -/* Payload struct for getting or setting one integer value from/to the DSP module */ -struct crus_single_data_t { - int32_t value; -}; - -/* Payload struct for getting or setting two integer values from/to the DSP module */ -struct crus_dual_data_t { - int32_t data1; - int32_t data2; -}; - -/* Payload struct for getting or setting three integer values from/to the DSP module */ -struct crus_triple_data_t { - int32_t data1; - int32_t data2; - int32_t data3; -}; - -/* Payload struct for setting the RX and TX use cases */ -struct crus_rx_run_case_ctrl_t { - int32_t value; - int32_t status_l; - int32_t checksum_l; - int32_t z_l; - int32_t status_r; - int32_t checksum_r; - int32_t z_r; - int32_t atemp; -}; - -/* Payload struct for getting calibration result from DSP module */ -struct cirrus_cal_result_t { - int32_t status_l; - int32_t checksum_l; - int32_t z_l; - int32_t status_r; - int32_t checksum_r; - int32_t z_r; -}; - -#define APR_CHUNK_SIZE 256 - -/* Payload struct for sending an external configuration string to the DSP - * module - */ -struct crus_external_config_t { - uint32_t total_size; - uint32_t chunk_size; - int32_t done; - int32_t reserved; - int32_t config; - char data[APR_CHUNK_SIZE]; -}; -/* Payload struct for sending an external tuning transition string to the DSP - * module - */ -struct crus_delta_config_t { - uint32_t total_size; - uint32_t chunk_size; - int32_t done; - int32_t index; - int32_t reserved; - int32_t config; - char data[APR_CHUNK_SIZE]; -}; - -struct crus_rx_temperature_t { - uint32_t cal_status_l; - uint32_t temp_r; - uint32_t z_r; - uint32_t temp_l; - uint32_t z_l; - uint32_t cal_status_r; - uint32_t amb_temp_l; - uint32_t excur_model_r; - uint32_t excur_model_l; - uint32_t cksum_r; - uint32_t amb_temp_r; - uint32_t cksum_l; - uint32_t hp_status_l; - uint32_t full_status_l; - uint32_t hp_status_r; - uint32_t full_status_r; -}; - -#define CONFIG_FILE_SIZE 128 -#define PAYLOAD_FOLLOWS_CONFIG 4 -#define MAX_TUNING_CONFIGS 4 -#define MIN_CHAN_SWAP_SAMPLES 48 -#define MAX_CHAN_SWAP_SAMPLES 9600 -#define CRUS_MAX_BUFFER_SIZE 384 - -struct crus_control_t { - struct device *device; - int32_t q6afe_rev; - bool afe_start; - bool enable; - bool prot_en; - int32_t fb_port_index; - int32_t fb_port; - int32_t ff_port; - int ch_sw_duration; - int32_t ch_sw; - int32_t vol_atten; - atomic_t callback_wait; - atomic_t count_wait; - struct mutex param_lock; - struct mutex sp_lock; - int32_t* user_buffer; - int32_t usecase; - int32_t config; - int32_t conf_sel; - int32_t delta_sel; - int32_t usecase_dt_count; -}; - -//extern int afe_apr_send_pkt_crus(void *data, int index, int set); - -int crus_afe_callback(void* payload, int size); -void msm_crus_pb_add_controls(struct snd_soc_platform *platform); -#endif /* _MSM_CIRRUS_PLAYBACK_H */ - diff --git a/techpack/audio/include/dsp/msm-dts-srs-tm-config.h b/techpack/audio/include/dsp/msm-dts-srs-tm-config.h deleted file mode 100644 index c00461b84bf0..000000000000 --- a/techpack/audio/include/dsp/msm-dts-srs-tm-config.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2012-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_DTS_SRS_TM_CONFIG_H_ -#define _MSM_DTS_SRS_TM_CONFIG_H_ - -#include -#include - -struct param_outband; - -#ifdef CONFIG_DTS_SRS_TM - -union srs_trumedia_params_u { - struct srs_trumedia_params srs_params; - __u16 raw_params[1]; -}; - -void msm_dts_srs_tm_ion_memmap(struct param_outband *po_); -void msm_dts_srs_tm_init(int port_id, int copp_idx); -void msm_dts_srs_tm_deinit(int port_id); -void msm_dts_srs_tm_add_controls(struct snd_soc_platform *platform); -#else -static inline void msm_dts_srs_tm_ion_memmap(struct param_outband *po_) { } -static inline void msm_dts_srs_tm_init(int port_id, int copp_idx) { } -static inline void msm_dts_srs_tm_deinit(int port_id) { } -static inline void msm_dts_srs_tm_add_controls( - struct snd_soc_platform *platform) { } - -#endif - -#endif diff --git a/techpack/audio/include/dsp/msm_audio_ion.h b/techpack/audio/include/dsp/msm_audio_ion.h deleted file mode 100644 index 01881cf69fd6..000000000000 --- a/techpack/audio/include/dsp/msm_audio_ion.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2013-2015, 2017-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _LINUX_MSM_AUDIO_ION_H -#define _LINUX_MSM_AUDIO_ION_H -#include -#include -#include -#include - -enum { - MSM_AUDIO_ION_INV_CACHES = 0, - MSM_AUDIO_ION_CLEAN_CACHES, -}; - -int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz, - dma_addr_t *paddr, size_t *pa_len, void **vaddr); - -int msm_audio_ion_import(struct dma_buf **dma_buf, int fd, - unsigned long *ionflag, size_t bufsz, - dma_addr_t *paddr, size_t *pa_len, void **vaddr); -int msm_audio_ion_free(struct dma_buf *dma_buf); -int msm_audio_ion_mmap(struct audio_buffer *abuff, struct vm_area_struct *vma); -int msm_audio_ion_cache_operations(struct audio_buffer *abuff, int cache_op); - -u32 msm_audio_populate_upper_32_bits(dma_addr_t pa); -int msm_audio_ion_get_smmu_info(struct device **cb_dev, u64 *smmu_sid); - -int msm_audio_ion_dma_map(dma_addr_t *phys_addr, dma_addr_t *iova_base, - u32 size, enum dma_data_direction dir); -#endif /* _LINUX_MSM_AUDIO_ION_H */ diff --git a/techpack/audio/include/dsp/msm_mdf.h b/techpack/audio/include/dsp/msm_mdf.h deleted file mode 100644 index 5b27f1211ae0..000000000000 --- a/techpack/audio/include/dsp/msm_mdf.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _LINUX_MSM_MDF_H -#define _LINUX_MSM_MDF_H - -#ifdef CONFIG_MSM_MDF - -/** - * msm_mdf_mem_init - allocate and map memory to ADSP be shared - * across multiple remote DSPs. - */ -int msm_mdf_mem_init(void); - -/** - * msm_mdf_mem_init - unmap and free memory to ADSP. - */ -int msm_mdf_mem_deinit(void); - -#else - -static inline int msm_mdf_mem_init(void) -{ - return 0; -} - -static inline int msm_mdf_mem_deinit(void) -{ - return 0; -} - -#endif /* CONFIG_MSM_MDF */ - -#endif /* _LINUX_MSM_MDF_H */ diff --git a/techpack/audio/include/dsp/q6adm-v2.h b/techpack/audio/include/dsp/q6adm-v2.h deleted file mode 100644 index 8e758d64897a..000000000000 --- a/techpack/audio/include/dsp/q6adm-v2.h +++ /dev/null @@ -1,219 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __Q6_ADM_V2_H__ -#define __Q6_ADM_V2_H__ - - -#define ADM_PATH_PLAYBACK 0x1 -#define ADM_PATH_LIVE_REC 0x2 -#define ADM_PATH_NONLIVE_REC 0x3 -#define ADM_PATH_COMPRESSED_RX 0x5 -#define ADM_PATH_COMPRESSED_TX 0x6 -#include -#include -#include - -#define MAX_MODULES_IN_TOPO 16 -#define ADM_GET_TOPO_MODULE_LIST_LENGTH\ - ((MAX_MODULES_IN_TOPO + 1) * sizeof(uint32_t)) -#define ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH \ - ((MAX_MODULES_IN_TOPO + 1) * 2 * sizeof(uint32_t)) -#define AUD_PROC_BLOCK_SIZE 4096 -#define AUD_VOL_BLOCK_SIZE 4096 -#define AUD_PROC_PERSIST_BLOCK_SIZE (2 * 1024 * 1020) -#define AUDIO_RX_CALIBRATION_SIZE (AUD_PROC_BLOCK_SIZE + \ - AUD_VOL_BLOCK_SIZE) -enum { - ADM_CUSTOM_TOP_CAL = 0, - ADM_AUDPROC_CAL, - ADM_LSM_AUDPROC_CAL, - ADM_AUDVOL_CAL, - ADM_RTAC_INFO_CAL, - ADM_RTAC_APR_CAL, - ADM_SRS_TRUMEDIA, - ADM_RTAC_AUDVOL_CAL, - ADM_LSM_AUDPROC_PERSISTENT_CAL, - ADM_MAX_CAL_TYPES -}; - -enum { - ADM_MEM_MAP_INDEX_SOURCE_TRACKING = ADM_MAX_CAL_TYPES, - ADM_MEM_MAP_INDEX_MAX -}; - -enum { - ADM_CLIENT_ID_DEFAULT = 0, - ADM_CLIENT_ID_SOURCE_TRACKING, - ADM_CLIENT_ID_MAX, -}; - -#define MAX_COPPS_PER_PORT 0x8 -#define ADM_MAX_CHANNELS 32 - -#define ADSP_ADM_API_VERSION_V3 3 - -/* multiple copp per stream. */ -struct route_payload { - unsigned int copp_idx[MAX_COPPS_PER_PORT]; - unsigned int port_id[MAX_COPPS_PER_PORT]; - int app_type[MAX_COPPS_PER_PORT]; - int acdb_dev_id[MAX_COPPS_PER_PORT]; - int sample_rate[MAX_COPPS_PER_PORT]; - unsigned short num_copps; - unsigned int session_id; -}; - -struct default_chmixer_param_id_coeff { - uint32_t index; - uint16_t num_output_channels; - uint16_t num_input_channels; -}; - -struct msm_pcm_channel_mixer { - int output_channel; - int input_channels[ADM_MAX_CHANNELS]; - bool enable; - int rule; - int channel_weight[ADM_MAX_CHANNELS][ADM_MAX_CHANNELS]; -}; - -int srs_trumedia_open(int port_id, int copp_idx, __s32 srs_tech_id, - void *srs_params); - -int adm_dts_eagle_set(int port_id, int copp_idx, int param_id, - void *data, uint32_t size); - -int adm_dts_eagle_get(int port_id, int copp_idx, int param_id, - void *data, uint32_t size); - -void adm_copp_mfc_cfg(int port_id, int copp_idx, int dst_sample_rate); - -int adm_get_pp_params(int port_id, int copp_idx, uint32_t client_id, - struct mem_mapping_hdr *mem_hdr, - struct param_hdr_v3 *param_hdr, u8 *returned_param_data); - -int adm_send_params_v5(int port_id, int copp_idx, char *params, - uint32_t params_length); - -int adm_set_pp_params(int port_id, int copp_idx, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 params_size); - -int adm_pack_and_set_one_pp_param(int port_id, int copp_idx, - struct param_hdr_v3 param_hdr, - u8 *param_data); - -int adm_open(int port, int path, int rate, int mode, int topology, - int perf_mode, uint16_t bits_per_sample, - int app_type, int acdbdev_id); - -int adm_map_rtac_block(struct rtac_cal_block_data *cal_block); - -int adm_unmap_rtac_block(uint32_t *mem_map_handle); - -int adm_close(int port, int topology, int perf_mode); - -int adm_matrix_map(int path, struct route_payload payload_map, - int perf_mode, uint32_t passthr_mode); - -int adm_connect_afe_port(int mode, int session_id, int port_id); - -void adm_ec_ref_rx_id(int port_id); - -void adm_num_ec_ref_rx_chans(int num_chans); - -void adm_ec_ref_rx_bit_width(int bit_width); - -void adm_ec_ref_rx_sampling_rate(int sampling_rate); - -int adm_get_lowlatency_copp_id(int port_id); - -int adm_set_multi_ch_map(char *channel_map, int path); - -int adm_get_multi_ch_map(char *channel_map, int path); - -void adm_set_port_multi_ch_map(char *channel_map, int port_id); - -int adm_validate_and_get_port_index(int port_id); - -int adm_get_default_copp_idx(int port_id); - -int adm_get_topology_for_port_from_copp_id(int port_id, int copp_id); - -int adm_get_topology_for_port_copp_idx(int port_id, int copp_idx); - -int adm_get_indexes_from_copp_id(int copp_id, int *port_idx, int *copp_idx); - -int adm_set_stereo_to_custom_stereo(int port_id, int copp_idx, - unsigned int session_id, - char *params, uint32_t params_length); - -int adm_get_pp_topo_module_list(int port_id, int copp_idx, int32_t param_length, - char *params); - -int adm_get_pp_topo_module_list_v2(int port_id, int copp_idx, - int32_t param_length, - int32_t *returned_params); - -int adm_set_volume(int port_id, int copp_idx, int volume); - -int adm_set_softvolume(int port_id, int copp_idx, - struct audproc_softvolume_params *softvol_param); - -int adm_set_mic_gain(int port_id, int copp_idx, int volume); - -int adm_send_set_multichannel_ec_primary_mic_ch(int port_id, int copp_idx, - int primary_mic_ch); - -int adm_set_ffecns_effect(int effect); - -int adm_param_enable(int port_id, int copp_idx, int module_id, int enable); - -int adm_param_enable_v2(int port_id, int copp_idx, - struct module_instance_info mod_inst_info, int enable); - -int adm_send_calibration(int port_id, int copp_idx, int path, int perf_mode, - int cal_type, char *params, int size); - -int adm_set_wait_parameters(int port_id, int copp_idx); - -int adm_reset_wait_parameters(int port_id, int copp_idx); - -int adm_wait_timeout(int port_id, int copp_idx, int wait_time); - -int adm_store_cal_data(int port_id, int copp_idx, int path, int perf_mode, - int cal_type, char *params, int *size); - -int adm_send_compressed_device_mute(int port_id, int copp_idx, bool mute_on); - -int adm_send_compressed_device_latency(int port_id, int copp_idx, int latency); -int adm_set_sound_focus(int port_id, int copp_idx, - struct sound_focus_param soundFocusData); -int adm_get_sound_focus(int port_id, int copp_idx, - struct sound_focus_param *soundFocusData); -int adm_get_source_tracking(int port_id, int copp_idx, - struct source_tracking_param *sourceTrackingData); -int adm_set_custom_chmix_cfg(int port_id, int copp_idx, - unsigned int session_id, char *params, - uint32_t params_length, int direction, - int stream_type); -int adm_swap_speaker_channels(int port_id, int copp_idx, int sample_rate, - bool spk_swap); -int adm_programable_channel_mixer(int port_id, int copp_idx, int session_id, - int session_type, - struct msm_pcm_channel_mixer *ch_mixer, - int channel_index); -void msm_dts_srs_acquire_lock(void); -void msm_dts_srs_release_lock(void); -void adm_set_native_mode(int mode); -int adm_apr_send_pkt(void *data, int port_idx, int copp_idx); -#endif /* __Q6_ADM_V2_H__ */ diff --git a/techpack/audio/include/dsp/q6afe-v2.h b/techpack/audio/include/dsp/q6afe-v2.h deleted file mode 100644 index 8258d37c3cf2..000000000000 --- a/techpack/audio/include/dsp/q6afe-v2.h +++ /dev/null @@ -1,518 +0,0 @@ -/* Copyright (c) 2012-2020, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __Q6AFE_V2_H__ -#define __Q6AFE_V2_H__ -#include -#include - -#define IN 0x000 -#define OUT 0x001 -#define MSM_AFE_MONO 0 -#define MSM_AFE_CH_STEREO 1 -#define MSM_AFE_MONO_RIGHT 1 -#define MSM_AFE_MONO_LEFT 2 -#define MSM_AFE_STEREO 3 -#define MSM_AFE_4CHANNELS 4 -#define MSM_AFE_6CHANNELS 6 -#define MSM_AFE_8CHANNELS 8 -#define MSM_AFE_10CHANNELS 10 -#define MSM_AFE_12CHANNELS 12 -#define MSM_AFE_14CHANNELS 14 -#define MSM_AFE_16CHANNELS 16 - -#define MSM_AFE_I2S_FORMAT_LPCM 0 -#define MSM_AFE_I2S_FORMAT_COMPR 1 -#define MSM_AFE_I2S_FORMAT_IEC60958_LPCM 2 -#define MSM_AFE_I2S_FORMAT_IEC60958_COMPR 3 - -#define MSM_AFE_PORT_TYPE_RX 0 -#define MSM_AFE_PORT_TYPE_TX 1 - -#define RT_PROXY_DAI_001_RX 0xE0 -#define RT_PROXY_DAI_001_TX 0xF0 -#define RT_PROXY_DAI_002_RX 0xF1 -#define RT_PROXY_DAI_002_TX 0xE1 -#define VIRTUAL_ID_TO_PORTID(val) ((val & 0xF) | 0x2000) - -#define AFE_CLK_VERSION_V1 1 -#define AFE_CLK_VERSION_V2 2 - -#define AFE_API_VERSION_SUPPORT_SPV3 2 -#define AFE_API_VERSION_V3 3 -/* for VAD and Island mode */ -#define AFE_API_VERSION_V4 4 - -typedef int (*routing_cb)(int port); - -enum { - /* IDX 0->4 */ - IDX_PRIMARY_I2S_RX, - IDX_PRIMARY_I2S_TX, - IDX_AFE_PORT_ID_PRIMARY_PCM_RX, - IDX_AFE_PORT_ID_PRIMARY_PCM_TX, - IDX_SECONDARY_I2S_RX, - /* IDX 5->9 */ - IDX_SECONDARY_I2S_TX, - IDX_MI2S_RX, - IDX_MI2S_TX, - IDX_HDMI_RX, - IDX_RSVD_2, - /* IDX 10->14 */ - IDX_RSVD_3, - IDX_DIGI_MIC_TX, - IDX_VOICE_RECORD_RX, - IDX_VOICE_RECORD_TX, - IDX_VOICE_PLAYBACK_TX, - /* IDX 15->19 */ - IDX_SLIMBUS_0_RX, - IDX_SLIMBUS_0_TX, - IDX_SLIMBUS_1_RX, - IDX_SLIMBUS_1_TX, - IDX_SLIMBUS_2_RX, - /* IDX 20->24 */ - IDX_SLIMBUS_2_TX, - IDX_SLIMBUS_3_RX, - IDX_SLIMBUS_3_TX, - IDX_SLIMBUS_4_RX, - IDX_SLIMBUS_4_TX, - /* IDX 25->29 */ - IDX_SLIMBUS_5_RX, - IDX_SLIMBUS_5_TX, - IDX_INT_BT_SCO_RX, - IDX_INT_BT_SCO_TX, - IDX_INT_BT_A2DP_RX, - /* IDX 30->34 */ - IDX_INT_FM_RX, - IDX_INT_FM_TX, - IDX_RT_PROXY_PORT_001_RX, - IDX_RT_PROXY_PORT_001_TX, - IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX, - /* IDX 35->39 */ - IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX, - IDX_AFE_PORT_ID_SECONDARY_MI2S_RX, - IDX_AFE_PORT_ID_SECONDARY_MI2S_TX, - IDX_AFE_PORT_ID_TERTIARY_MI2S_RX, - IDX_AFE_PORT_ID_TERTIARY_MI2S_TX, - /* IDX 40->44 */ - IDX_AFE_PORT_ID_PRIMARY_MI2S_RX, - IDX_AFE_PORT_ID_PRIMARY_MI2S_TX, - IDX_AFE_PORT_ID_SECONDARY_PCM_RX, - IDX_AFE_PORT_ID_SECONDARY_PCM_TX, - IDX_VOICE2_PLAYBACK_TX, - /* IDX 45->49 */ - IDX_SLIMBUS_6_RX, - IDX_SLIMBUS_6_TX, - IDX_PRIMARY_SPDIF_RX, - IDX_GLOBAL_CFG, - IDX_AUDIO_PORT_ID_I2S_RX, - /* IDX 50->53 */ - IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1, - IDX_AFE_PORT_ID_QUINARY_MI2S_RX, - IDX_AFE_PORT_ID_QUINARY_MI2S_TX, - IDX_AFE_PORT_ID_SENARY_MI2S_TX, - /* IDX 54->117 */ - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_0, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_0, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_1, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_1, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_2, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_2, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_3, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_3, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_4, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_4, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_5, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_5, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_6, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_6, - IDX_AFE_PORT_ID_PRIMARY_TDM_RX_7, - IDX_AFE_PORT_ID_PRIMARY_TDM_TX_7, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_0, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_0, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_1, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_1, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_2, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_2, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_3, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_3, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_4, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_4, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_5, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_5, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_6, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_6, - IDX_AFE_PORT_ID_SECONDARY_TDM_RX_7, - IDX_AFE_PORT_ID_SECONDARY_TDM_TX_7, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_0, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_0, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_1, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_1, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_2, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_2, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_3, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_3, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_4, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_4, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_5, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_5, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_6, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_6, - IDX_AFE_PORT_ID_TERTIARY_TDM_RX_7, - IDX_AFE_PORT_ID_TERTIARY_TDM_TX_7, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_0, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_0, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_1, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_1, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_2, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_2, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_3, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_3, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_4, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_4, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_5, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_5, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_6, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_6, - IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7, - IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7, - /* IDX 118->121 */ - IDX_SLIMBUS_7_RX, - IDX_SLIMBUS_7_TX, - IDX_SLIMBUS_8_RX, - IDX_SLIMBUS_8_TX, - /* IDX 122-> 123 */ - IDX_AFE_PORT_ID_USB_RX, - IDX_AFE_PORT_ID_USB_TX, - /* IDX 124 */ - IDX_DISPLAY_PORT_RX, - /* IDX 125-> 128 */ - IDX_AFE_PORT_ID_TERTIARY_PCM_RX, - IDX_AFE_PORT_ID_TERTIARY_PCM_TX, - IDX_AFE_PORT_ID_QUATERNARY_PCM_RX, - IDX_AFE_PORT_ID_QUATERNARY_PCM_TX, - /* IDX 129-> 142 */ - IDX_AFE_PORT_ID_INT0_MI2S_RX, - IDX_AFE_PORT_ID_INT0_MI2S_TX, - IDX_AFE_PORT_ID_INT1_MI2S_RX, - IDX_AFE_PORT_ID_INT1_MI2S_TX, - IDX_AFE_PORT_ID_INT2_MI2S_RX, - IDX_AFE_PORT_ID_INT2_MI2S_TX, - IDX_AFE_PORT_ID_INT3_MI2S_RX, - IDX_AFE_PORT_ID_INT3_MI2S_TX, - IDX_AFE_PORT_ID_INT4_MI2S_RX, - IDX_AFE_PORT_ID_INT4_MI2S_TX, - IDX_AFE_PORT_ID_INT5_MI2S_RX, - IDX_AFE_PORT_ID_INT5_MI2S_TX, - IDX_AFE_PORT_ID_INT6_MI2S_RX, - IDX_AFE_PORT_ID_INT6_MI2S_TX, - /* IDX 143-> 160 */ - IDX_AFE_PORT_ID_QUINARY_PCM_RX, - IDX_AFE_PORT_ID_QUINARY_PCM_TX, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_0, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_0, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_1, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_1, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_2, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_2, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_3, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_3, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_4, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_4, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_5, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_5, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_6, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_6, - IDX_AFE_PORT_ID_QUINARY_TDM_RX_7, - IDX_AFE_PORT_ID_QUINARY_TDM_TX_7, - /* IDX 161 to 181 */ - IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_0, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_0, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_1, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_1, - IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_2, - IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_0, - IDX_AFE_PORT_ID_VA_CODEC_DMA_TX_1, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_0, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_0, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_1, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_1, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_2, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_2, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_3, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_3, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_4, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_4, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_5, - IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6, - IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7, - /* IDX 182 to 184 */ - IDX_SECONDARY_SPDIF_RX, - IDX_PRIMARY_SPDIF_TX, - IDX_SECONDARY_SPDIF_TX, - /* IDX 185 to 186 */ - IDX_SLIMBUS_9_RX, - IDX_SLIMBUS_9_TX, - /* IDX 187 -> 188 */ - IDX_AFE_PORT_ID_SENARY_PCM_RX, - IDX_AFE_PORT_ID_SENARY_PCM_TX, - - IDX_AFE_PORT_ID_PSEUDOPORT_01, - /* IDX 189 -> 190 */ - IDX_RT_PROXY_PORT_002_RX, - IDX_RT_PROXY_PORT_002_TX, - AFE_MAX_PORTS -}; - -enum afe_mad_type { - MAD_HW_NONE = 0x00, - MAD_HW_AUDIO = 0x01, - MAD_HW_BEACON = 0x02, - MAD_HW_ULTRASOUND = 0x04, - MAD_SW_AUDIO = 0x05, -}; - -enum afe_cal_mode { - AFE_CAL_MODE_DEFAULT = 0x00, - AFE_CAL_MODE_NONE, -}; - -enum afe_vad_cfg_type { - AFE_VAD_ENABLE = 0x00, - AFE_VAD_PREROLL, -}; - -struct vad_config { - u32 is_enable; - u32 pre_roll; -}; - -struct afe_audio_buffer { - dma_addr_t phys; - void *data; - uint32_t used; - uint32_t size;/* size of buffer */ - uint32_t actual_size; /* actual number of bytes read by DSP */ - struct dma_buf *dma_buf; -}; - -struct afe_audio_port_data { - struct afe_audio_buffer *buf; - uint32_t max_buf_cnt; - uint32_t dsp_buf; - uint32_t cpu_buf; - struct list_head mem_map_handle; - uint32_t tmp_hdl; - /* read or write locks */ - struct mutex lock; - spinlock_t dsp_lock; -}; - -struct afe_audio_client { - atomic_t cmd_state; - /* Relative or absolute TS */ - uint32_t time_flag; - void *priv; - uint64_t time_stamp; - struct mutex cmd_lock; - /* idx:1 out port, 0: in port*/ - struct afe_audio_port_data port[2]; - wait_queue_head_t cmd_wait; - uint32_t mem_map_handle; -}; - -struct aanc_data { - bool aanc_active; - uint16_t aanc_rx_port; - uint16_t aanc_tx_port; - uint32_t aanc_rx_port_sample_rate; - uint32_t aanc_tx_port_sample_rate; - int level; -}; - -int afe_open(u16 port_id, union afe_port_config *afe_config, int rate); -int afe_close(int port_id); -int afe_loopback(u16 enable, u16 rx_port, u16 tx_port); -int afe_sidetone_enable(u16 tx_port_id, u16 rx_port_id, bool enable); -int afe_set_display_stream(u16 rx_port_id, u32 stream_idx, u32 ctl_idx); -int afe_loopback_gain(u16 port_id, u16 volume); -int afe_validate_port(u16 port_id); -int afe_get_port_index(u16 port_id); -int afe_get_topology(int port_id); -int afe_start_pseudo_port(u16 port_id); -int afe_stop_pseudo_port(u16 port_id); -uint32_t afe_req_mmap_handle(struct afe_audio_client *ac); -int afe_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz, - struct afe_audio_client *ac); -int afe_cmd_memory_map(phys_addr_t dma_addr_p, u32 dma_buf_sz); -int afe_cmd_memory_map_nowait(int port_id, phys_addr_t dma_addr_p, - u32 dma_buf_sz); -int afe_cmd_memory_unmap(u32 dma_addr_p); -int afe_cmd_memory_unmap_nowait(u32 dma_addr_p); -void afe_set_dtmf_gen_rx_portid(u16 rx_port_id, int set); -int afe_dtmf_generate_rx(int64_t duration_in_ms, - uint16_t high_freq, - uint16_t low_freq, uint16_t gain); -int afe_register_get_events(u16 port_id, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data); -int afe_unregister_get_events(u16 port_id); -int afe_rt_proxy_port_write(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes); -int afe_rt_proxy_port_read(phys_addr_t buf_addr_p, - u32 mem_map_handle, int bytes); -void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode); -void afe_set_vad_cfg(u32 vad_enable, u32 preroll_config, - u32 port_id); -void afe_set_island_mode_cfg(u16 port_id, u32 enable_flag); -void afe_get_island_mode_cfg(u16 port_id, u32 *enable_flag); -int afe_port_start(u16 port_id, union afe_port_config *afe_config, - u32 rate); -int afe_set_tws_channel_mode(u16 port_id, u32 channel_mode); -int afe_port_start_v2(u16 port_id, union afe_port_config *afe_config, - u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, - struct afe_enc_config *enc_config, - struct afe_dec_config *dec_config); -int afe_spk_prot_feed_back_cfg(int src_port, int dst_port, - int l_ch, int r_ch, u32 enable); -int afe_spk_prot_get_calib_data(struct afe_spkr_prot_get_vi_calib *calib); -int afe_port_stop_nowait(int port_id); -int afe_apply_gain(u16 port_id, u16 gain); -int afe_q6_interface_prepare(void); -int afe_get_port_type(u16 port_id); -int q6afe_audio_client_buf_alloc_contiguous(unsigned int dir, - struct afe_audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt); -struct afe_audio_client *q6afe_audio_client_alloc(void *priv); -int q6afe_audio_client_buf_free_contiguous(unsigned int dir, - struct afe_audio_client *ac); -void q6afe_audio_client_free(struct afe_audio_client *ac); -/* if port_id is virtual, convert to physical.. - * if port_id is already physical, return physical - */ -int afe_convert_virtual_to_portid(u16 port_id); - -int afe_pseudo_port_start_nowait(u16 port_id); -int afe_pseudo_port_stop_nowait(u16 port_id); -int afe_set_lpass_clock(u16 port_id, struct afe_clk_cfg *cfg); -int afe_set_lpass_clock_v2(u16 port_id, struct afe_clk_set *cfg); -int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg); -int afe_set_digital_codec_core_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg); -int afe_set_lpass_internal_digital_codec_clock(u16 port_id, - struct afe_digital_clk_cfg *cfg); -int afe_enable_lpass_core_shared_clock(u16 port_id, u32 enable); - -int q6afe_check_osr_clk_freq(u32 freq); - -int afe_send_spdif_clk_cfg(struct afe_param_id_spdif_clk_cfg *cfg, - u16 port_id); -int afe_send_spdif_ch_status_cfg(struct afe_param_id_spdif_ch_status_cfg - *ch_status_cfg, u16 port_id); - -int afe_spdif_port_start(u16 port_id, struct afe_spdif_port_config *spdif_port, - u32 rate); - -int afe_spdif_reg_event_cfg(u16 port_id, u16 reg_flag, - void (*cb)(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv), - void *private_data); - -int afe_turn_onoff_hw_mad(u16 mad_type, u16 mad_enable); -int afe_port_set_mad_type(u16 port_id, enum afe_mad_type mad_type); -enum afe_mad_type afe_port_get_mad_type(u16 port_id); -int afe_set_config(enum afe_config_type config_type, void *config_data, - int arg); -void afe_clear_config(enum afe_config_type config); -bool afe_has_config(enum afe_config_type config); - -void afe_set_aanc_info(struct aanc_data *aanc_info); -int afe_set_aanc_noise_level(int val); -int afe_port_group_set_param(u16 group_id, - union afe_port_group_config *afe_group_config); -int afe_port_group_enable(u16 group_id, - union afe_port_group_config *afe_group_config, u16 enable); -int afe_unmap_rtac_block(uint32_t *mem_map_handle); -int afe_map_rtac_block(struct rtac_cal_block_data *cal_block); -int afe_send_slot_mapping_cfg( - struct afe_param_id_slot_mapping_cfg *slot_mapping_cfg, - u16 port_id); -int afe_send_custom_tdm_header_cfg( - struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg, - u16 port_id); -int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port, - u32 rate, u16 num_groups); -void afe_set_routing_callback(routing_cb cb); -int afe_get_av_dev_drift(struct afe_param_id_dev_timing_stats *timing_stats, - u16 port); -int afe_get_sp_rx_tmax_xmax_logging_data( - struct afe_sp_rx_tmax_xmax_logging_param *xt_logging, - u16 port_id); -int afe_cal_init_hwdep(void *card); -int afe_send_port_island_mode(u16 port_id); - -#ifdef CONFIG_MSM_CSPL -int afe_apr_send_pkt_crus(void *data, int index, int set); -int crus_afe_port_close(u16 port_id); -int crus_afe_port_start(u16 port_id); -#endif - -int afe_send_cmd_wakeup_register(void *handle, bool enable); -void afe_register_wakeup_irq_callback( - void (*afe_cb_wakeup_irq)(void *handle)); - -#define AFE_LPASS_CORE_HW_BLOCK_ID_NONE 0 -#define AFE_LPASS_CORE_HW_BLOCK_ID_AVTIMER 2 -#define AFE_LPASS_CORE_HW_MACRO_BLOCK 3 - -/* Handles audio-video timer (avtimer) and BTSC vote requests from clients */ -#define AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST 0x000100f4 - -struct afe_cmd_remote_lpass_core_hw_vote_request { - struct apr_hdr hdr; - uint32_t hw_block_id; - /* ID of the hardware block. */ - char client_name[8]; - /* Name of the client. */ -} __packed; - -#define AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST 0x000100f5 - -struct afe_cmd_rsp_remote_lpass_core_hw_vote_request { - uint32_t client_handle; - /**< Handle of the client. */ -} __packed; - -#define AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST 0x000100f6 - -struct afe_cmd_remote_lpass_core_hw_devote_request { - struct apr_hdr hdr; - uint32_t hw_block_id; - /**< ID of the hardware block.*/ - - uint32_t client_handle; - /**< Handle of the client.*/ -} __packed; - -int afe_vote_lpass_core_hw(uint32_t hw_block_id, char *client_name, - uint32_t *client_handle); -int afe_unvote_lpass_core_hw(uint32_t hw_block_id, uint32_t client_handle); -int afe_get_spk_initial_cal(void); -void afe_get_spk_r0(int *spk_r0); -void afe_get_spk_t0(int *spk_t0); -int afe_get_spk_v_vali_flag(void); -void afe_get_spk_v_vali_sts(int *spk_v_vali_sts); -void afe_set_spk_initial_cal(int initial_cal); -void afe_set_spk_v_vali_flag(int v_vali_flag); -#endif /* __Q6AFE_V2_H__ */ diff --git a/techpack/audio/include/dsp/q6asm-v2.h b/techpack/audio/include/dsp/q6asm-v2.h deleted file mode 100644 index 2d738d6356ba..000000000000 --- a/techpack/audio/include/dsp/q6asm-v2.h +++ /dev/null @@ -1,751 +0,0 @@ -/* Copyright (c) 2012-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __Q6_ASM_V2_H__ -#define __Q6_ASM_V2_H__ - -#include -#include -#include -#include -#include - -#define IN 0x000 -#define OUT 0x001 -#define CH_MODE_MONO 0x001 -#define CH_MODE_STEREO 0x002 - -#define FORMAT_LINEAR_PCM 0x0000 -#define FORMAT_DTMF 0x0001 -#define FORMAT_ADPCM 0x0002 -#define FORMAT_YADPCM 0x0003 -#define FORMAT_MP3 0x0004 -#define FORMAT_MPEG4_AAC 0x0005 -#define FORMAT_AMRNB 0x0006 -#define FORMAT_AMRWB 0x0007 -#define FORMAT_V13K 0x0008 -#define FORMAT_EVRC 0x0009 -#define FORMAT_EVRCB 0x000a -#define FORMAT_EVRCWB 0x000b -#define FORMAT_MIDI 0x000c -#define FORMAT_SBC 0x000d -#define FORMAT_WMA_V10PRO 0x000e -#define FORMAT_WMA_V9 0x000f -#define FORMAT_AMR_WB_PLUS 0x0010 -#define FORMAT_MPEG4_MULTI_AAC 0x0011 -#define FORMAT_MULTI_CHANNEL_LINEAR_PCM 0x0012 -#define FORMAT_AC3 0x0013 -#define FORMAT_EAC3 0x0014 -#define FORMAT_MP2 0x0015 -#define FORMAT_FLAC 0x0016 -#define FORMAT_ALAC 0x0017 -#define FORMAT_VORBIS 0x0018 -#define FORMAT_APE 0x0019 -#define FORMAT_G711_ALAW_FS 0x001a -#define FORMAT_G711_MLAW_FS 0x001b -#define FORMAT_DTS 0x001c -#define FORMAT_DSD 0x001d -#define FORMAT_APTX 0x001e -#define FORMAT_GEN_COMPR 0x001f -#define FORMAT_TRUEHD 0x0020 -#define FORMAT_IEC61937 0x0021 -#define FORMAT_BESPOKE 0x0022 - -#define ENCDEC_SBCBITRATE 0x0001 -#define ENCDEC_IMMEDIATE_DECODE 0x0002 -#define ENCDEC_CFG_BLK 0x0003 - -#define ENC_CFG_ID_NONE 0x0000 - -#define CMD_PAUSE 0x0001 -#define CMD_FLUSH 0x0002 -#define CMD_EOS 0x0003 -#define CMD_CLOSE 0x0004 -#define CMD_OUT_FLUSH 0x0005 -#define CMD_SUSPEND 0x0006 - -/* bit 0:1 represents priority of stream */ -#define STREAM_PRIORITY_NORMAL 0x0000 -#define STREAM_PRIORITY_LOW 0x0001 -#define STREAM_PRIORITY_HIGH 0x0002 - -/* bit 4 represents META enable of encoded data buffer */ -#define BUFFER_META_ENABLE 0x0010 - -/* bit 5 represents timestamp */ -/* bit 5 - 0 -- ASM_DATA_EVENT_READ_DONE will have relative time-stamp*/ -/* bit 5 - 1 -- ASM_DATA_EVENT_READ_DONE will have absolute time-stamp*/ -#define ABSOLUTE_TIMESTAMP_ENABLE 0x0020 - -/* Enable Sample_Rate/Channel_Mode notification event from Decoder */ -#define SR_CM_NOTIFY_ENABLE 0x0004 - -#define TUN_WRITE_IO_MODE 0x0008 /* tunnel read write mode */ -#define TUN_READ_IO_MODE 0x0004 /* tunnel read write mode */ -#define SYNC_IO_MODE 0x0001 -#define ASYNC_IO_MODE 0x0002 -#define COMPRESSED_IO 0x0040 -#define COMPRESSED_STREAM_IO 0x0080 -#define NT_MODE 0x0400 - -#define NO_TIMESTAMP 0xFF00 -#define SET_TIMESTAMP 0x0000 - -#define SOFT_PAUSE_ENABLE 1 -#define SOFT_PAUSE_DISABLE 0 - -#define ASM_ACTIVE_STREAMS_ALLOWED 0x8 -/* Control session is used for mapping calibration memory */ -#define ASM_CONTROL_SESSION (ASM_ACTIVE_STREAMS_ALLOWED + 1) - -#define ASM_SHIFT_GAPLESS_MODE_FLAG 31 -#define ASM_SHIFT_LAST_BUFFER_FLAG 30 - -#define ASM_LITTLE_ENDIAN 0 -#define ASM_BIG_ENDIAN 1 - -#define ADSP_ASM_API_VERSION_V2 2 - -/* PCM_MEDIA_FORMAT_Version */ -enum { - PCM_MEDIA_FORMAT_V2 = 0, - PCM_MEDIA_FORMAT_V3, - PCM_MEDIA_FORMAT_V4, - PCM_MEDIA_FORMAT_V5, -}; - -/* PCM format modes in DSP */ -enum { - DEFAULT_QF = 0, - Q15 = 15, - Q23 = 23, - Q31 = 31, -}; - -/* payload structure bytes */ -#define READDONE_IDX_STATUS 0 -#define READDONE_IDX_BUFADD_LSW 1 -#define READDONE_IDX_BUFADD_MSW 2 -#define READDONE_IDX_MEMMAP_HDL 3 -#define READDONE_IDX_SIZE 4 -#define READDONE_IDX_OFFSET 5 -#define READDONE_IDX_LSW_TS 6 -#define READDONE_IDX_MSW_TS 7 -#define READDONE_IDX_FLAGS 8 -#define READDONE_IDX_NUMFRAMES 9 -#define READDONE_IDX_SEQ_ID 10 - -#define SOFT_PAUSE_PERIOD 30 /* ramp up/down for 30ms */ -#define SOFT_PAUSE_STEP 0 /* Step value 0ms or 0us */ -enum { - SOFT_PAUSE_CURVE_LINEAR = 0, - SOFT_PAUSE_CURVE_EXP, - SOFT_PAUSE_CURVE_LOG, -}; - -#define SOFT_VOLUME_PERIOD 30 /* ramp up/down for 30ms */ -#define SOFT_VOLUME_STEP 0 /* Step value 0ms or 0us */ -enum { - SOFT_VOLUME_CURVE_LINEAR = 0, - SOFT_VOLUME_CURVE_EXP, - SOFT_VOLUME_CURVE_LOG, -}; - -#define SOFT_VOLUME_INSTANCE_1 1 -#define SOFT_VOLUME_INSTANCE_2 2 - -typedef void (*app_cb)(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv); - -struct audio_buffer { - dma_addr_t phys; - void *data; - uint32_t used; - uint32_t size;/* size of buffer */ - uint32_t actual_size; /* actual number of bytes read by DSP */ - struct dma_buf *dma_buf; -}; - -struct audio_aio_write_param { - phys_addr_t paddr; - uint32_t len; - uint32_t uid; - uint32_t lsw_ts; - uint32_t msw_ts; - uint32_t flags; - uint32_t metadata_len; - uint32_t last_buffer; -}; - -struct audio_aio_read_param { - phys_addr_t paddr; - uint32_t len; - uint32_t uid; - uint32_t flags;/*meta data flags*/ -}; - -struct audio_port_data { - struct audio_buffer *buf; - uint32_t max_buf_cnt; - uint32_t dsp_buf; - uint32_t cpu_buf; - struct list_head mem_map_handle; - uint32_t tmp_hdl; - /* read or write locks */ - struct mutex lock; - spinlock_t dsp_lock; -}; - -struct shared_io_config { - uint32_t format; - uint16_t bits_per_sample; - uint32_t rate; - uint32_t channels; - uint16_t sample_word_size; - uint32_t bufsz; - uint32_t bufcnt; -}; - -struct audio_client { - int session; - app_cb cb; - atomic_t cmd_state; - atomic_t cmd_state_pp; - /* Relative or absolute TS */ - atomic_t time_flag; - atomic_t nowait_cmd_cnt; - atomic_t mem_state; - void *priv; - uint32_t io_mode; - uint64_t time_stamp; - struct apr_svc *apr; - struct apr_svc *mmap_apr; - struct apr_svc *apr2; - struct mutex cmd_lock; - /* idx:1 out port, 0: in port*/ - struct audio_port_data port[2]; - wait_queue_head_t cmd_wait; - wait_queue_head_t time_wait; - wait_queue_head_t mem_wait; - int perf_mode; - int stream_id; - struct device *dev; - int topology; - int app_type; - /* audio cache operations fptr*/ - int (*fptr_cache_ops)(struct audio_buffer *abuff, int cache_op); - atomic_t unmap_cb_success; - atomic_t reset; - /* holds latest DSP pipeline delay */ - uint32_t path_delay; - /* shared io */ - struct audio_buffer shared_pos_buf; - struct shared_io_config config; -}; - -struct q6asm_cal_info { - int topology_id; - int app_type; -}; - -void q6asm_audio_client_free(struct audio_client *ac); - -struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv); - -struct audio_client *q6asm_get_audio_client(int session_id); - -int q6asm_audio_client_buf_alloc(unsigned int dir/* 1:Out,0:In */, - struct audio_client *ac, - unsigned int bufsz, - uint32_t bufcnt); -int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir - /* 1:Out,0:In */, - struct audio_client *ac, - unsigned int bufsz, - unsigned int bufcnt); - -int q6asm_audio_client_buf_free_contiguous(unsigned int dir, - struct audio_client *ac); - -int q6asm_set_pp_params(struct audio_client *ac, - struct mem_mapping_hdr *mem_hdr, u8 *param_data, - u32 param_size); - -int q6asm_pack_and_set_pp_param_in_band(struct audio_client *ac, - struct param_hdr_v3 param_hdr, - u8 *param_data); - -int q6asm_set_soft_volume_module_instance_ids(int instance, - struct param_hdr_v3 *param_hdr); - -int q6asm_open_read(struct audio_client *ac, uint32_t format - /*, uint16_t bits_per_sample*/); - -int q6asm_open_read_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_read_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_read_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, - uint32_t enc_cfg_id); - -int q6asm_open_read_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, bool ts_mode, - uint32_t enc_cfg_id); - -int q6asm_open_write(struct audio_client *ac, uint32_t format - /*, uint16_t bits_per_sample*/); - -int q6asm_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_shared_io(struct audio_client *ac, - struct shared_io_config *c, int dir, - bool use_default_chmap, u8 *channel_map); - -int q6asm_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample); - -int q6asm_stream_open_write_v2(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_stream_open_write_v3(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_stream_open_write_v4(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_stream_open_write_v5(struct audio_client *ac, uint32_t format, - uint16_t bits_per_sample, int32_t stream_id, - bool is_gapless_mode); - -int q6asm_open_read_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag); - -int q6asm_open_write_compressed(struct audio_client *ac, uint32_t format, - uint32_t passthrough_flag); - -int q6asm_open_read_write(struct audio_client *ac, - uint32_t rd_format, - uint32_t wr_format); - -int q6asm_open_read_write_v2(struct audio_client *ac, uint32_t rd_format, - uint32_t wr_format, bool is_meta_data_mode, - uint32_t bits_per_sample, bool overwrite_topology, - int topology); - -int q6asm_open_loopback_v2(struct audio_client *ac, - uint16_t bits_per_sample); - -int q6asm_open_transcode_loopback(struct audio_client *ac, - uint16_t bits_per_sample, uint32_t source_format, - uint32_t sink_format); - -int q6asm_write(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags); -int q6asm_write_nolock(struct audio_client *ac, uint32_t len, uint32_t msw_ts, - uint32_t lsw_ts, uint32_t flags); - -int q6asm_async_write(struct audio_client *ac, - struct audio_aio_write_param *param); - -int q6asm_async_read(struct audio_client *ac, - struct audio_aio_read_param *param); - -int q6asm_read(struct audio_client *ac); -int q6asm_read_v2(struct audio_client *ac, uint32_t len); -int q6asm_read_nolock(struct audio_client *ac); - -int q6asm_memory_map(struct audio_client *ac, phys_addr_t buf_add, - int dir, uint32_t bufsz, uint32_t bufcnt); - -int q6asm_memory_unmap(struct audio_client *ac, phys_addr_t buf_add, - int dir); - -struct audio_buffer *q6asm_shared_io_buf(struct audio_client *ac, int dir); - -int q6asm_shared_io_free(struct audio_client *ac, int dir); - -int q6asm_get_shared_pos(struct audio_client *ac, uint32_t *si, uint32_t *msw, - uint32_t *lsw); - -int q6asm_map_rtac_block(struct rtac_cal_block_data *cal_block); - -int q6asm_unmap_rtac_block(uint32_t *mem_map_handle); - -int q6asm_send_cal(struct audio_client *ac); - -int q6asm_run(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts); - -int q6asm_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts); - -int q6asm_stream_run_nowait(struct audio_client *ac, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts, uint32_t stream_id); - -int q6asm_reg_tx_overflow(struct audio_client *ac, uint16_t enable); - -int q6asm_reg_rx_underflow(struct audio_client *ac, uint16_t enable); - -int q6asm_cmd(struct audio_client *ac, int cmd); - -int q6asm_stream_cmd(struct audio_client *ac, int cmd, uint32_t stream_id); - -int q6asm_cmd_nowait(struct audio_client *ac, int cmd); - -int q6asm_stream_cmd_nowait(struct audio_client *ac, int cmd, - uint32_t stream_id); - -void *q6asm_is_cpu_buf_avail(int dir, struct audio_client *ac, - uint32_t *size, uint32_t *idx); - -int q6asm_cpu_buf_release(int dir, struct audio_client *ac); - -void *q6asm_is_cpu_buf_avail_nolock(int dir, struct audio_client *ac, - uint32_t *size, uint32_t *idx); - -int q6asm_is_dsp_buf_avail(int dir, struct audio_client *ac); - -/* File format specific configurations to be added below */ - -int q6asm_enc_cfg_blk_aac(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate, uint32_t channels, - uint32_t bit_rate, - uint32_t mode, uint32_t format); - -int q6asm_enc_cfg_blk_g711(struct audio_client *ac, - uint32_t frames_per_buf, - uint32_t sample_rate); - -int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_enc_cfg_blk_pcm_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - bool use_default_chmap, bool use_back_flavor, - u8 *channel_map); - -int q6asm_enc_cfg_blk_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size); - -int q6asm_enc_cfg_blk_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, bool use_default_chmap, - bool use_back_flavor, u8 *channel_map, - uint16_t sample_word_size, uint16_t endianness, - uint16_t mode); - -int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample); - -int q6asm_enc_cfg_blk_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size); - -int q6asm_enc_cfg_blk_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_enc_cfg_blk_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_enc_cfg_blk_custom(struct audio_client *ac, - uint32_t sample_rate, uint32_t channels, - uint32_t format, void *cfg); - -int q6asm_set_encdec_chan_map(struct audio_client *ac, - uint32_t num_channels); - -int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_enable_sbrps(struct audio_client *ac, - uint32_t sbr_ps); - -int q6asm_cfg_dual_mono_aac(struct audio_client *ac, - uint16_t sce_left, uint16_t sce_right); - -int q6asm_cfg_aac_sel_mix_coef(struct audio_client *ac, uint32_t mix_coeff); - -int q6asm_enc_cfg_blk_qcelp(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t reduced_rate_level, uint16_t rate_modulation_cmd); - -int q6asm_enc_cfg_blk_evrc(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t min_rate, uint16_t max_rate, - uint16_t rate_modulation_cmd); - -int q6asm_enc_cfg_blk_amrnb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable); - -int q6asm_enc_cfg_blk_amrwb(struct audio_client *ac, uint32_t frames_per_buf, - uint16_t band_mode, uint16_t dtx_enable); - -int q6asm_media_format_block_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_media_format_block_pcm_format_support(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample); - -int q6asm_media_format_block_pcm_format_support_v2(struct audio_client *ac, - uint32_t rate, uint32_t channels, - uint16_t bits_per_sample, int stream_id, - bool use_default_chmap, char *channel_map); - -int q6asm_media_format_block_pcm_format_support_v3(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size); - -int q6asm_media_format_block_pcm_format_support_v4(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_pcm_format_support_v5(struct audio_client *ac, - uint32_t rate, - uint32_t channels, - uint16_t bits_per_sample, - int stream_id, - bool use_default_chmap, - char *channel_map, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map); - -int q6asm_media_format_block_multi_ch_pcm_v2( - struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample); -int q6asm_media_format_block_gen_compr( - struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, char *channel_map, - uint16_t bits_per_sample); - -int q6asm_media_format_block_iec( - struct audio_client *ac, - uint32_t rate, uint32_t channels); - -int q6asm_media_format_block_multi_ch_pcm_v3(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size); - -int q6asm_media_format_block_multi_ch_pcm_v4(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_multi_ch_pcm_v5(struct audio_client *ac, - uint32_t rate, uint32_t channels, - bool use_default_chmap, - char *channel_map, - uint16_t bits_per_sample, - uint16_t sample_word_size, - uint16_t endianness, - uint16_t mode); - -int q6asm_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg); - -int q6asm_stream_media_format_block_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg, int stream_id); - -int q6asm_media_format_block_multi_aac(struct audio_client *ac, - struct asm_aac_cfg *cfg); - -int q6asm_media_format_block_wma(struct audio_client *ac, - void *cfg, int stream_id); - -int q6asm_media_format_block_wmapro(struct audio_client *ac, - void *cfg, int stream_id); - -int q6asm_media_format_block_amrwbplus(struct audio_client *ac, - struct asm_amrwbplus_cfg *cfg); - -int q6asm_stream_media_format_block_flac(struct audio_client *ac, - struct asm_flac_cfg *cfg, int stream_id); - -int q6asm_media_format_block_alac(struct audio_client *ac, - struct asm_alac_cfg *cfg, int stream_id); - -int q6asm_media_format_block_g711(struct audio_client *ac, - struct asm_g711_dec_cfg *cfg, int stream_id); - -int q6asm_stream_media_format_block_vorbis(struct audio_client *ac, - struct asm_vorbis_cfg *cfg, int stream_id); - -int q6asm_media_format_block_ape(struct audio_client *ac, - struct asm_ape_cfg *cfg, int stream_id); - -int q6asm_media_format_block_dsd(struct audio_client *ac, - struct asm_dsd_cfg *cfg, int stream_id); - -int q6asm_stream_media_format_block_aptx_dec(struct audio_client *ac, - uint32_t sr, int stream_id); - -int q6asm_ds1_set_endp_params(struct audio_client *ac, - int param_id, int param_value); - -/* Send stream based end params */ -int q6asm_ds1_set_stream_endp_params(struct audio_client *ac, int param_id, - int param_value, int stream_id); - -/* PP specific */ -int q6asm_equalizer(struct audio_client *ac, void *eq); - -/* Send Volume Command */ -int q6asm_set_volume(struct audio_client *ac, int volume); - -/* Send Volume Command */ -int q6asm_set_volume_v2(struct audio_client *ac, int volume, int instance); - -/* DTS Eagle Params */ -int q6asm_dts_eagle_set(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id); -int q6asm_dts_eagle_get(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id); - -/* Send aptx decoder BT address */ -int q6asm_set_aptx_dec_bt_addr(struct audio_client *ac, - struct aptx_dec_bt_addr_cfg *cfg); - -/* Set SoftPause Params */ -int q6asm_set_softpause(struct audio_client *ac, - struct asm_softpause_params *param); - -/* Set Softvolume Params */ -int q6asm_set_softvolume(struct audio_client *ac, - struct asm_softvolume_params *param); - -/* Set Softvolume Params */ -int q6asm_set_softvolume_v2(struct audio_client *ac, - struct asm_softvolume_params *param, int instance); - -/* Send left-right channel gain */ -int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain); - -/* Send multi channel gain */ -int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, - uint32_t *gains, uint8_t *ch_map, bool use_default); - -/* Enable Mute/unmute flag */ -int q6asm_set_mute(struct audio_client *ac, int muteflag); - -int q6asm_get_session_time(struct audio_client *ac, uint64_t *tstamp); - -int q6asm_get_session_time_legacy(struct audio_client *ac, uint64_t *tstamp); - -int q6asm_send_stream_cmd(struct audio_client *ac, - struct msm_adsp_event_data *data); - -int q6asm_send_ion_fd(struct audio_client *ac, int fd); - -int q6asm_send_rtic_event_ack(struct audio_client *ac, - void *param, uint32_t params_length); - -/* Client can set the IO mode to either AIO/SIO mode */ -int q6asm_set_io_mode(struct audio_client *ac, uint32_t mode); - -/* Get Service ID for APR communication */ -int q6asm_get_apr_service_id(int session_id); - -/* Common format block without any payload */ -int q6asm_media_format_block(struct audio_client *ac, uint32_t format); - -/* Send the meta data to remove initial and trailing silence */ -int q6asm_send_meta_data(struct audio_client *ac, uint32_t initial_samples, - uint32_t trailing_samples); - -/* Send the stream meta data to remove initial and trailing silence */ -int q6asm_stream_send_meta_data(struct audio_client *ac, uint32_t stream_id, - uint32_t initial_samples, uint32_t trailing_samples); - -int q6asm_get_asm_topology(int session_id); -int q6asm_get_asm_app_type(int session_id); - -int q6asm_send_mtmx_strtr_window(struct audio_client *ac, - struct asm_session_mtmx_strtr_param_window_v2_t *window_param, - uint32_t param_id); - -/* Configure DSP render mode */ -int q6asm_send_mtmx_strtr_render_mode(struct audio_client *ac, - uint32_t render_mode); - -/* Configure DSP clock recovery mode */ -int q6asm_send_mtmx_strtr_clk_rec_mode(struct audio_client *ac, - uint32_t clk_rec_mode); - -/* Enable adjust session clock in DSP */ -int q6asm_send_mtmx_strtr_enable_adjust_session_clock(struct audio_client *ac, - bool enable); - -/* Retrieve the current DSP path delay */ -int q6asm_get_path_delay(struct audio_client *ac); - -/* Helper functions to retrieve data from token */ -uint8_t q6asm_get_buf_index_from_token(uint32_t token); -uint8_t q6asm_get_stream_id_from_token(uint32_t token); - -/* Adjust session clock in DSP */ -int q6asm_adjust_session_clock(struct audio_client *ac, - uint32_t adjust_time_lsw, - uint32_t adjust_time_msw); -#endif /* __Q6_ASM_H__ */ diff --git a/techpack/audio/include/dsp/q6audio-v2.h b/techpack/audio/include/dsp/q6audio-v2.h deleted file mode 100644 index 5df88fcbb6f0..000000000000 --- a/techpack/audio/include/dsp/q6audio-v2.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2012-2013, 2015 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _Q6_AUDIO_H_ -#define _Q6_AUDIO_H_ - -#include - -enum { - LEGACY_PCM_MODE = 0, - LOW_LATENCY_PCM_MODE, - ULTRA_LOW_LATENCY_PCM_MODE, - ULL_POST_PROCESSING_PCM_MODE, -}; - - -int q6audio_get_port_index(u16 port_id); - -int q6audio_convert_virtual_to_portid(u16 port_id); - -int q6audio_validate_port(u16 port_id); - -int q6audio_is_digital_pcm_interface(u16 port_id); - -int q6audio_get_port_id(u16 port_id); - -#endif diff --git a/techpack/audio/include/dsp/q6common.h b/techpack/audio/include/dsp/q6common.h deleted file mode 100644 index e2566c04a7c9..000000000000 --- a/techpack/audio/include/dsp/q6common.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2017-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __Q6COMMON_H__ -#define __Q6COMMON_H__ - -#include - -void q6common_update_instance_id_support(bool supported); -bool q6common_is_instance_id_supported(void); -int q6common_pack_pp_params(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size); -int q6common_pack_pp_params_v2(u8 *dest, struct param_hdr_v3 *v3_hdr, - u8 *param_data, u32 *total_size, - bool iid_supported); -#endif /* __Q6COMMON_H__ */ diff --git a/techpack/audio/include/dsp/q6core.h b/techpack/audio/include/dsp/q6core.h deleted file mode 100644 index dff5df22456b..000000000000 --- a/techpack/audio/include/dsp/q6core.h +++ /dev/null @@ -1,231 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __Q6CORE_H__ -#define __Q6CORE_H__ -#include -#include - - - -#define AVCS_CMD_ADSP_EVENT_GET_STATE 0x0001290C -#define AVCS_CMDRSP_ADSP_EVENT_GET_STATE 0x0001290D - -bool q6core_is_adsp_ready(void); - -int q6core_get_service_version(uint32_t service_id, - struct avcs_fwk_ver_info *ver_info, - size_t size); -size_t q6core_get_fwk_version_size(uint32_t service_id); - -struct audio_uevent_data { - struct kobject kobj; - struct kobj_type ktype; -}; - -int q6core_init_uevent_data(struct audio_uevent_data *uevent_data, char *name); -void q6core_destroy_uevent_data(struct audio_uevent_data *uevent_data); -int q6core_send_uevent(struct audio_uevent_data *uevent_data, char *name); -int q6core_get_avcs_api_version_per_service(uint32_t service_id); - -#define ADSP_CMD_SET_DTS_EAGLE_DATA_ID 0x00012919 -#define DTS_EAGLE_LICENSE_ID 0x00028346 -struct adsp_dts_eagle { - struct apr_hdr hdr; - uint32_t id; - uint32_t overwrite; - uint32_t size; - char data[]; -}; -int core_dts_eagle_set(int size, char *data); -int core_dts_eagle_get(int id, int size, char *data); - -#define ADSP_CMD_SET_DOLBY_MANUFACTURER_ID 0x00012918 - -struct adsp_dolby_manufacturer_id { - struct apr_hdr hdr; - int manufacturer_id; -}; - -uint32_t core_set_dolby_manufacturer_id(int manufacturer_id); - -/* Dolby Surround1 Module License ID. This ID is used as an identifier - * for DS1 license via ADSP generic license mechanism. - * Please refer AVCS_CMD_SET_LICENSE for more details. - */ -#define DOLBY_DS1_LICENSE_ID 0x00000001 - -#define AVCS_CMD_SET_LICENSE 0x00012919 -struct avcs_cmd_set_license { - struct apr_hdr hdr; - uint32_t id; /**< A unique ID used to refer to this license */ - uint32_t overwrite; - /* 0 = do not overwrite an existing license with this id. - * 1 = overwrite an existing license with this id. - */ - uint32_t size; - /**< Size in bytes of the license data following this header. */ - /* uint8_t* data , data and padding follows this structure - * total packet size needs to be multiple of 4 Bytes - */ - -}; - -#define AVCS_CMD_GET_LICENSE_VALIDATION_RESULT 0x0001291A -struct avcs_cmd_get_license_validation_result { - struct apr_hdr hdr; - uint32_t id; /**< A unique ID used to refer to this license */ -}; - -#define AVCS_CMDRSP_GET_LICENSE_VALIDATION_RESULT 0x0001291B -struct avcs_cmdrsp_get_license_validation_result { - uint32_t result; - /* ADSP_EOK if the license validation result was successfully retrieved. - * ADSP_ENOTEXIST if there is no license with the given id. - * ADSP_ENOTIMPL if there is no validation function for a license - * with this id. - */ - uint32_t size; - /* Length in bytes of the result that follows this structure*/ -}; - -/* Set Q6 topologies */ -/* - * Registers custom topologies in the aDSP for - * use in audio, voice, AFE and LSM. - */ - - -#define AVCS_CMD_SHARED_MEM_MAP_REGIONS 0x00012924 -#define AVCS_CMDRSP_SHARED_MEM_MAP_REGIONS 0x00012925 -#define AVCS_CMD_SHARED_MEM_UNMAP_REGIONS 0x00012926 - -/* Commands the AVCS to map multiple shared memory regions with remote - * processor ID. All mapped regions must be from the same memory pool. - * - * Return: - * ADSP_EOK : SUCCESS - * ADSP_EHANDLE : Failed due to incorrect handle. - * ADSP_EBADPARAM : Failed due to bad parameters. - * - * Dependencies: - * The mem_map_handle should be obtained earlier - * using AVCS_CMD_SHARED_MEM_MAP_REGIONS with pool ID - * ADSP_MEMORY_MAP_MDF_SHMEM_4K_POOL. - */ -#define AVCS_CMD_MAP_MDF_SHARED_MEMORY 0x00012930 - -#define AVCS_CMD_REGISTER_TOPOLOGIES 0x00012923 - -/* The payload for the AVCS_CMD_REGISTER_TOPOLOGIES command */ -struct avcs_cmd_register_topologies { - struct apr_hdr hdr; - uint32_t payload_addr_lsw; - /* Lower 32 bits of the topology buffer address. */ - - uint32_t payload_addr_msw; - /* Upper 32 bits of the topology buffer address. */ - - uint32_t mem_map_handle; - /* Unique identifier for an address. - * -This memory map handle is returned by the aDSP through the - * memory map command. - * -NULL mem_map_handle is interpreted as in-band parameter - * passing. - * -Client has the flexibility to choose in-band or out-of-band. - * -Out-of-band is recommended in this case. - */ - - uint32_t payload_size; - /* Size in bytes of the valid data in the topology buffer. */ -} __packed; - - -#define AVCS_CMD_DEREGISTER_TOPOLOGIES 0x0001292a - -/* The payload for the AVCS_CMD_DEREGISTER_TOPOLOGIES command */ -struct avcs_cmd_deregister_topologies { - struct apr_hdr hdr; - uint32_t payload_addr_lsw; - /* Lower 32 bits of the topology buffer address. */ - - uint32_t payload_addr_msw; - /* Upper 32 bits of the topology buffer address. */ - - uint32_t mem_map_handle; - /* Unique identifier for an address. - * -This memory map handle is returned by the aDSP through the - * memory map command. - * -NULL mem_map_handle is interpreted as in-band parameter - * passing. - * -Client has the flexibility to choose in-band or out-of-band. - * -Out-of-band is recommended in this case. - */ - - uint32_t payload_size; - /* Size in bytes of the valid data in the topology buffer. */ - - uint32_t mode; - /* 1: Deregister selected topologies - * 2: Deregister all topologies - */ -} __packed; - -#define AVCS_CMD_ADSP_CRASH 0x0001FFFF - -struct avcs_cmd_adsp_crash { - struct apr_hdr hdr; -} __packed; - -#define AVCS_MODE_DEREGISTER_ALL_CUSTOM_TOPOLOGIES 2 - -#define AVCS_CMD_LOAD_TOPO_MODULES 0x0001296C - -#define AVCS_CMD_UNLOAD_TOPO_MODULES 0x0001296D - -#define CORE_LOAD_TOPOLOGY 0 - -#define CORE_UNLOAD_TOPOLOGY 1 - -struct avcs_cmd_load_unload_topo_modules { - struct apr_hdr hdr; - uint32_t topology_id; -} __packed; - - -int q6core_map_memory_regions(phys_addr_t *buf_add, uint32_t mempool_id, - uint32_t *bufsz, uint32_t bufcnt, uint32_t *map_handle); -int q6core_memory_unmap_regions(uint32_t mem_map_handle); -int q6core_map_mdf_shared_memory(uint32_t map_handle, phys_addr_t *buf_add, - uint32_t proc_id, uint32_t *bufsz, uint32_t bufcnt); - -int32_t core_set_license(uint32_t key, uint32_t module_id); -int32_t core_get_license_status(uint32_t module_id); -int q6core_adsp_crash(void); - -int32_t q6core_load_unload_topo_modules(uint32_t topology_id, - bool preload_type); -int q6core_is_avs_up(int32_t *avs_state); - -#if IS_ENABLED(CONFIG_USE_Q6_32CH_SUPPORT) -static inline bool q6core_use_Q6_32ch_support(void) -{ - return true; -} -#else -static inline bool q6core_use_Q6_32ch_support(void) -{ - return false; -} -#endif - -#endif /* __Q6CORE_H__ */ diff --git a/techpack/audio/include/dsp/q6lsm.h b/techpack/audio/include/dsp/q6lsm.h deleted file mode 100644 index f3eecf73b807..000000000000 --- a/techpack/audio/include/dsp/q6lsm.h +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (c) 2013-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __Q6LSM_H__ -#define __Q6LSM_H__ - -#include -#include -#include -#include -#include - -#define MAX_NUM_CONFIDENCE 20 - -#define ADM_LSM_PORT_ID 0xADCB - -#define LSM_MAX_NUM_CHANNELS 8 -#define LSM_V3P0_MAX_NUM_CHANNELS 9 - -#define LSM_API_VERSION_V3 3 - -typedef void (*lsm_app_cb)(uint32_t opcode, uint32_t token, - uint32_t *payload, uint16_t client_size, void *priv); - -struct lsm_sound_model { - dma_addr_t phys; - void *data; - size_t size; /* size of buffer */ - uint32_t actual_size; /* actual number of bytes read by DSP */ - struct dma_buf *dma_buf; - uint32_t mem_map_handle; -}; - -struct snd_lsm_event_status_v2 { - uint16_t status; - uint16_t payload_size; - uint8_t confidence_value[0]; -}; - -struct lsm_lab_buffer { - dma_addr_t phys; - void *data; - size_t size; - struct dma_buf *dma_buf; - uint32_t mem_map_handle; -}; - -struct lsm_hw_params { - u16 sample_rate; - u16 sample_size; - u32 buf_sz; - u32 period_count; - u16 num_chs; -}; - -struct lsm_cal_data_info { - dma_addr_t phys; - void *data; - size_t size; - struct dma_buf *dma_buf; - uint32_t mem_map_handle; -}; - -struct lsm_stage_config { - uint32_t app_type; - uint32_t topology_id; - bool lpi_enable; - bool lab_enable; - struct lsm_sound_model sound_model; - struct lsm_cal_data_info cal_info; -}; - - -struct lsm_client { - int session; - lsm_app_cb cb; - atomic_t cmd_state; - void *priv; - struct apr_svc *apr; - struct apr_svc *mmap_apr; - struct mutex cmd_lock; - wait_queue_head_t cmd_wait; - uint32_t cmd_err_code; - uint16_t mode; - uint16_t connect_to_port; - uint8_t num_confidence_levels; - uint8_t *confidence_levels; - bool opened; - bool started; - uint32_t app_id; - bool lab_enable; - bool lab_started; - struct lsm_lab_buffer *lab_buffer; - struct lsm_hw_params out_hw_params; - struct lsm_hw_params in_hw_params; - bool use_topology; - int session_state; - bool poll_enable; - int perf_mode; - uint32_t event_mode; - uint32_t event_type; - uint32_t num_stages; - struct lsm_stage_config stage_cfg[LSM_MAX_STAGES_PER_SESSION]; -}; - -struct lsm_stream_cmd_open_tx { - struct apr_hdr hdr; - uint16_t app_id; - uint16_t reserved; - uint32_t sampling_rate; -} __packed; - -struct lsm_stream_cmd_open_tx_v2 { - struct apr_hdr hdr; - uint32_t topology_id; -} __packed; - -struct lsm_stream_stage_info { - uint32_t topology_id; - uint32_t island_enable; -} __packed; - -struct lsm_stream_cmd_open_tx_v3 { - struct apr_hdr hdr; - uint32_t num_stages; - struct lsm_stream_stage_info stage_info[0]; -} __packed; - -struct lsm_custom_topologies { - struct apr_hdr hdr; - uint32_t data_payload_addr_lsw; - uint32_t data_payload_addr_msw; - uint32_t mem_map_handle; - uint32_t buffer_size; -} __packed; - -struct lsm_session_cmd_set_params_v2 { - struct apr_hdr apr_hdr; - uint32_t payload_size; - struct mem_mapping_hdr mem_hdr; - u32 param_data[0]; -} __packed; - -struct lsm_session_cmd_set_params_v3 { - struct apr_hdr apr_hdr; - struct mem_mapping_hdr mem_hdr; - uint32_t payload_size; - u32 param_data[0]; -} __packed; - -struct lsm_param_op_mode { - uint32_t minor_version; - uint16_t mode; - uint16_t reserved; -} __packed; - -struct lsm_param_connect_to_port { - uint32_t minor_version; - /* AFE port id that receives voice wake up data */ - uint16_t port_id; - uint16_t reserved; -} __packed; - -struct lsm_param_poll_enable { - uint32_t minor_version; - /* indicates to voice wakeup that HW MAD/SW polling is enabled or not */ - uint32_t polling_enable; -} __packed; - -struct lsm_param_fwk_mode_cfg { - uint32_t minor_version; - uint32_t mode; -} __packed; - -struct lsm_param_media_fmt { - uint32_t minor_version; - uint32_t sample_rate; - uint16_t num_channels; - uint16_t bit_width; - uint8_t channel_mapping[LSM_MAX_NUM_CHANNELS]; -} __packed; - -struct lsm_param_media_fmt_v2 { - uint32_t minor_version; - uint32_t sample_rate; - uint16_t bit_width; - uint16_t num_channels; - uint8_t channel_mapping[0]; -} __packed; - - -struct lsm_param_confidence_levels { - uint8_t num_confidence_levels; - uint8_t confidence_levels[0]; -} __packed; - -struct lsm_param_epd_thres { - uint32_t minor_version; - uint32_t epd_begin; - uint32_t epd_end; -} __packed; - -struct lsm_param_gain { - uint32_t minor_version; - uint16_t gain; - uint16_t reserved; -} __packed; - -struct lsm_cmd_reg_snd_model { - struct apr_hdr hdr; - uint32_t model_size; - uint32_t model_addr_lsw; - uint32_t model_addr_msw; - uint32_t mem_map_handle; -} __packed; - -struct lsm_param_lab_enable { - uint16_t enable; - uint16_t reserved; -} __packed; - -struct lsm_param_lab_config { - uint32_t minor_version; - uint32_t wake_up_latency_ms; -} __packed; - -struct lsm_param_lab_out_ch_cfg { - uint32_t minor_version; - uint32_t num_channels; - uint8_t channel_indices[0]; -} __packed; - -struct lsm_cmd_read { - struct apr_hdr hdr; - uint32_t buf_addr_lsw; - uint32_t buf_addr_msw; - uint32_t mem_map_handle; - uint32_t buf_size; -} __packed; - -struct lsm_cmd_read_done { - struct apr_hdr hdr; - uint32_t status; - uint32_t buf_addr_lsw; - uint32_t buf_addr_msw; - uint32_t mem_map_handle; - uint32_t total_size; - uint32_t offset; - uint32_t timestamp_lsw; - uint32_t timestamp_msw; - uint32_t flags; -} __packed; - -struct lsm_param_det_event_type { - uint32_t minor_version; - uint32_t event_type; - uint32_t mode; -} __packed; - -struct lsm_client *q6lsm_client_alloc(lsm_app_cb cb, void *priv); -void q6lsm_client_free(struct lsm_client *client); -int q6lsm_open(struct lsm_client *client, uint16_t app_id); -int q6lsm_start(struct lsm_client *client, bool wait); -int q6lsm_stop(struct lsm_client *client, bool wait); -int q6lsm_snd_model_buf_alloc(struct lsm_client *client, size_t len, - struct lsm_params_info_v2 *p_info); -int q6lsm_snd_model_buf_free(struct lsm_client *client, - struct lsm_params_info_v2 *p_info); -int q6lsm_close(struct lsm_client *client); -int q6lsm_register_sound_model(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure); -int q6lsm_set_data(struct lsm_client *client, - enum lsm_detection_mode mode, - bool detectfailure); -int q6lsm_deregister_sound_model(struct lsm_client *client); -void set_lsm_port(int lsm_port); -int get_lsm_port(void); -int q6lsm_lab_control(struct lsm_client *client, u32 enable, - struct lsm_params_info_v2 *p_info); -int q6lsm_stop_lab(struct lsm_client *client); -int q6lsm_read(struct lsm_client *client, struct lsm_cmd_read *read); -int q6lsm_lab_buffer_alloc(struct lsm_client *client, bool alloc); -int q6lsm_set_one_param(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, void *data, - uint32_t param_type); -void q6lsm_sm_set_param_data(struct lsm_client *client, - struct lsm_params_info_v2 *p_info, - size_t *offset); -int q6lsm_set_port_connected(struct lsm_client *client); -int q6lsm_set_fwk_mode_cfg(struct lsm_client *client, uint32_t event_mode); -int q6lsm_set_media_fmt_params(struct lsm_client *client); -int q6lsm_set_media_fmt_v2_params(struct lsm_client *client); -int q6lsm_lab_out_ch_cfg(struct lsm_client *client, u8 *ch_map, - struct lsm_params_info_v2 *p_info); -bool q6lsm_adsp_supports_multi_stage_detection(void); -#endif /* __Q6LSM_H__ */ diff --git a/techpack/audio/include/dsp/q6voice.h b/techpack/audio/include/dsp/q6voice.h deleted file mode 100644 index cf395d720bdf..000000000000 --- a/techpack/audio/include/dsp/q6voice.h +++ /dev/null @@ -1,2118 +0,0 @@ -/* Copyright (c) 2012-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __QDSP6VOICE_H__ -#define __QDSP6VOICE_H__ - -#include -#include -#include -#include -#include - -#define MAX_VOC_PKT_SIZE 642 -#define SESSION_NAME_LEN 20 -#define NUM_OF_MEMORY_BLOCKS 1 -#define NUM_OF_BUFFERS 2 -#define VSS_NUM_CHANNELS_MAX 32 -#define VSS_CHANNEL_MAPPING_SIZE (sizeof(uint8_t) * VSS_NUM_CHANNELS_MAX) -/* - * BUFFER BLOCK SIZE based on - * the supported page size - */ -#define BUFFER_BLOCK_SIZE 4096 - -#define MAX_COL_INFO_SIZE 324 - -#define VOC_REC_UPLINK 0x00 -#define VOC_REC_DOWNLINK 0x01 -#define VOC_REC_BOTH 0x02 - -#define VSS_IVERSION_CMD_GET 0x00011378 -#define VSS_IVERSION_RSP_GET 0x00011379 -#define CVD_VERSION_STRING_MAX_SIZE 31 -#define CVD_VERSION_DEFAULT "" -#define CVD_VERSION_0_0 "0.0" -#define CVD_VERSION_2_1 "2.1" -#define CVD_VERSION_2_2 "2.2" -#define CVD_VERSION_2_3 "2.3" -#define CVD_VERSION_2_4 "2.4" - -#define CVD_INT_VERSION_DEFAULT 0 -#define CVD_INT_VERSION_0_0 1 -#define CVD_INT_VERSION_2_1 2 -#define CVD_INT_VERSION_2_2 3 -#define CVD_INT_VERSION_2_3 4 -#define CVD_INT_VERSION_2_4 5 -#define CVD_INT_VERSION_LAST CVD_INT_VERSION_2_4 -#define CVD_INT_VERSION_MAX (CVD_INT_VERSION_LAST + 1) - -struct cvd_version_table { - char cvd_ver[CVD_VERSION_STRING_MAX_SIZE]; - int cvd_ver_int; -}; - -int voc_get_cvd_version(char *cvd_version); - -/* Payload structure for the VSS_IVERSION_RSP_GET command response */ -struct vss_iversion_rsp_get_t { - char version[CVD_VERSION_STRING_MAX_SIZE]; - /* NULL-terminated version string */ -}; - -enum { - CVP_VOC_RX_TOPOLOGY_CAL = 0, - CVP_VOC_TX_TOPOLOGY_CAL, - CVP_VOCPROC_CAL, - CVP_VOCVOL_CAL, - CVP_VOCDEV_CFG_CAL, - CVP_VOCPROC_COL_CAL, - CVP_VOCVOL_COL_CAL, - CVS_VOCSTRM_CAL, - CVS_VOCSTRM_COL_CAL, - VOICE_RTAC_INFO_CAL, - VOICE_RTAC_APR_CAL, - MAX_VOICE_CAL_TYPES -}; - -struct voice_header { - uint32_t id; - uint32_t data_len; -}; - -struct voice_init { - struct voice_header hdr; - void *cb_handle; -}; - -/* Stream information payload structure */ -struct stream_data { - uint32_t stream_mute; - uint32_t stream_mute_ramp_duration_ms; -}; - -/* Device information payload structure */ -struct device_data { - uint32_t dev_mute; - uint32_t sample_rate; - uint16_t bits_per_sample; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; - uint32_t enabled; - uint32_t dev_id; - uint32_t port_id; - uint32_t volume_step_value; - uint32_t volume_ramp_duration_ms; - uint32_t dev_mute_ramp_duration_ms; - uint32_t no_of_channels; -}; - -/* - * Format information structure to match - * vss_param_endpoint_media_format_info_t - */ -struct media_format_info { - uint32_t port_id; - uint16_t num_channels; - uint16_t bits_per_sample; - uint32_t sample_rate; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -}; - -enum { - VOC_GENERIC_SET_PARAM_TOKEN = 0, - VOC_RTAC_SET_PARAM_TOKEN, - VOC_SET_MEDIA_FORMAT_PARAM_TOKEN, - VOC_SET_PARAM_TOKEN_MAX -}; - -struct voice_dev_route_state { - u16 rx_route_flag; - u16 tx_route_flag; -}; - -struct voice_rec_route_state { - u16 ul_flag; - u16 dl_flag; -}; - -enum { - VOC_INIT = 0, - VOC_RUN, - VOC_CHANGE, - VOC_RELEASE, - VOC_ERROR, - VOC_STANDBY, -}; - -struct mem_buffer { - dma_addr_t phys; - void *data; - uint32_t size; /* size of buffer */ -}; - -struct share_mem_buf { - struct dma_buf *dma_buf; - struct mem_buffer buf[NUM_OF_BUFFERS]; -}; - -struct mem_map_table { - dma_addr_t phys; - void *data; - size_t size; /* size of buffer */ - struct dma_buf *dma_buf; -}; - -/* Common */ -#define VSS_ICOMMON_CMD_SET_UI_PROPERTY 0x00011103 -#define VSS_ICOMMON_CMD_SET_UI_PROPERTY_V2 0x00013248 -/* Set a UI property */ -#define VSS_ICOMMON_CMD_MAP_MEMORY 0x00011025 -#define VSS_ICOMMON_CMD_UNMAP_MEMORY 0x00011026 -/* General shared memory; byte-accessible, 4 kB-aligned. */ -#define VSS_ICOMMON_MAP_MEMORY_SHMEM8_4K_POOL 3 - -struct vss_icommon_cmd_map_memory_t { - uint32_t phys_addr; - /* Physical address of a memory region; must be at least - * 4 kB aligned. - */ - - uint32_t mem_size; - /* Number of bytes in the region; should be a multiple of 32. */ - - uint16_t mem_pool_id; - /* Type of memory being provided. The memory ID implicitly defines - * the characteristics of the memory. The characteristics might include - * alignment type, permissions, etc. - * Memory pool ID. Possible values: - * 3 -- VSS_ICOMMON_MEM_TYPE_SHMEM8_4K_POOL. - */ -} __packed; - -struct vss_icommon_cmd_unmap_memory_t { - uint32_t phys_addr; - /* Physical address of a memory region; must be at least - * 4 kB aligned. - */ -} __packed; - -struct vss_map_memory_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_map_memory_t vss_map_mem; -} __packed; - -struct vss_unmap_memory_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_unmap_memory_t vss_unmap_mem; -} __packed; - -struct vss_param_endpoint_media_format_info { - /* AFE port ID to which this media format corresponds to. */ - uint32_t port_id; - /* - * Number of channels of data. - * Supported values: 1 to 8 - */ - uint16_t num_channels; - /* - * Bits per sample of data. - * Supported values: 16 and 24 - */ - uint16_t bits_per_sample; - /* - * Sampling rate in Hz. - * Supported values: 8000, 11025, 16000, 22050, 24000, 32000, - * 44100, 48000, 88200, 96000, 176400, and 192000 - */ - uint32_t sample_rate; - /* - * The channel[i] mapping describes channel i. Each element i - * of the array describes channel i inside the data buffer. An - * unused or unknown channel is set to 0. - */ - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -} __packed; - -struct vss_param_vocproc_dev_channel_info_t { - uint32_t num_channels; - uint32_t bits_per_sample; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -} __packed; - -struct vss_param_channel_mixer_info_t { - uint32_t index; - uint16_t num_output_channels; - uint16_t num_input_channels; - uint16_t out_channel_map[2]; - uint16_t in_channel_map[1]; - uint16_t channel_weight_coeff[2][1]; - uint16_t reserved; -} __packed; - -struct vss_param_mfc_config_info_t { - uint32_t sample_rate; - uint16_t bits_per_sample; - uint16_t num_channels; - uint16_t channel_type[VSS_NUM_CHANNELS_MAX]; -} __packed; - -struct vss_icommon_param_data_channel_info_v2_t { - /* Valid ID of the module. */ - uint32_t module_id; - /* Valid ID of the parameter. */ - uint32_t param_id; - /* - * Data size of the structure relating to the param_id/module_id - * combination in uint8_t bytes. - */ - uint16_t param_size; - /* This field must be set to zero. */ - uint16_t reserved; - struct vss_param_vocproc_dev_channel_info_t channel_info; -} __packed; - -struct vss_icommon_cmd_set_param_channel_info_v2_t { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; - /* Size of the parameter data payload in bytes. */ - uint32_t mem_size; - struct vss_icommon_param_data_channel_info_v2_t param_data; -} __packed; - -struct vss_icommon_param_data_ch_mixer_v2_t { - /* Valid ID of the module. */ - uint32_t module_id; - /* Valid ID of the parameter. */ - uint32_t param_id; - /* - * Data size of the structure relating to the param_id/module_id - * combination in uint8_t bytes. - */ - uint16_t param_size; - /* This field must be set to zero. */ - uint16_t reserved; - struct vss_param_channel_mixer_info_t ch_mixer_info; -} __packed; - -struct vss_icommon_cmd_set_param_ch_mixer_v2_t { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; - /* Size of the parameter data payload in bytes. */ - uint32_t mem_size; - - struct vss_icommon_param_data_ch_mixer_v2_t param_data; -} __packed; - -struct vss_icommon_param_data_mfc_config_v2_t { - /* Valid ID of the module. */ - uint32_t module_id; - /* Valid ID of the parameter. */ - uint32_t param_id; - /* - * Data size of the structure relating to the param_id/module_id - * combination in uint8_t bytes. - */ - uint16_t param_size; - /* This field must be set to zero. */ - uint16_t reserved; - struct vss_param_mfc_config_info_t mfc_config_info; -} __packed; - -struct vss_icommon_cmd_set_param_mfc_config_v2_t { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; - /* Size of the parameter data payload in bytes. */ - uint32_t mem_size; - - struct vss_icommon_param_data_mfc_config_v2_t param_data; -} __packed; - -struct vss_icommon_mem_mapping_hdr { - /* - * Pointer to the unique identifier for an address (physical/virtual). - * - * If the parameter data payload is within the message payload - * (in-band), set this field to 0. The parameter data begins at the - * specified data payload address. - * - * If the parameter data is out-of-band, this field is the handle to - * the physical address in the shared memory that holds the parameter - * data. - */ - uint32_t mem_handle; - /* - * Location of the parameter data payload. - * - * The payload is an array of vss_icommon_param_data_t. If the - * mem_handle is 0, this field is ignored. - */ - uint64_t mem_address; -} __packed; - -struct vss_icommon_cmd_set_param { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The memory mapping header to be used when sending outband */ - struct vss_icommon_mem_mapping_hdr mem_hdr; - - /* Size of the parameter data payload in bytes. */ - uint32_t payload_size; - - /* - * Parameter data payload when inband. Should have size param_size. - * Bit size of payload must be a multiple of 4. - */ - uint8_t param_data[0]; -} __packed; - -/* TO MVM commands */ -#define VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION 0x000110FF -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL 0x00011327 -/* - * VSS_IMVM_CMD_SET_POLICY_DUAL_CONTROL - * Description: This command is required to let MVM know - * who is in control of session. - * Payload: Defined by vss_imvm_cmd_set_policy_dual_control_t. - * Result: Wait for APRV2_IBASIC_RSP_RESULT response. - */ - -#define VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION 0x000110FE -/* Create a new full control MVM session. */ - -#define APRV2_IBASIC_CMD_DESTROY_SESSION 0x0001003C -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_ATTACH_STREAM 0x0001123C -/* Attach a stream to the MVM. */ - -#define VSS_IMVM_CMD_DETACH_STREAM 0x0001123D -/* Detach a stream from the MVM. */ - -#define VSS_IMVM_CMD_ATTACH_VOCPROC 0x0001123E -/* Attach a vocproc to the MVM. The MVM will symmetrically connect this vocproc - * to all the streams currently attached to it. - */ - -#define VSS_IMVM_CMD_DETACH_VOCPROC 0x0001123F -/* Detach a vocproc from the MVM. The MVM will symmetrically disconnect this - * vocproc from all the streams to which it is currently attached. - */ - -#define VSS_IMVM_CMD_START_VOICE 0x00011190 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_STANDBY_VOICE 0x00011191 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_STOP_VOICE 0x00011192 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IMVM_CMD_PAUSE_VOICE 0x0001137D -/* No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ISTREAM_CMD_ATTACH_VOCPROC 0x000110F8 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ISTREAM_CMD_DETACH_VOCPROC 0x000110F9 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - - -#define VSS_ISTREAM_CMD_SET_TTY_MODE 0x00011196 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ICOMMON_CMD_SET_NETWORK 0x0001119C -/* Set the network type. */ - -#define VSS_ICOMMON_CMD_SET_VOICE_TIMING 0x000111E0 -/* Set the voice timing parameters. */ - -#define VSS_IMEMORY_CMD_MAP_PHYSICAL 0x00011334 -#define VSS_IMEMORY_RSP_MAP 0x00011336 -#define VSS_IMEMORY_CMD_UNMAP 0x00011337 -#define VSS_IMVM_CMD_SET_CAL_NETWORK 0x0001137A -#define VSS_IMVM_CMD_SET_CAL_MEDIA_TYPE 0x0001137B -#define VSS_IHDVOICE_CMD_ENABLE 0x000130A2 -#define VSS_IHDVOICE_CMD_DISABLE 0x000130A3 - -/* To listen for events from MVM module */ -#define VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS 0x00012E56 -/* To cancel listening for events from MVM module */ -#define VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS 0x00012E57 -/* To receive ongoing voice activity notification */ -#define VSS_ICOMMON_EVENT_CLASS_VOICE_ACTIVITY_UPDATE 0x000131EF -/* Voice activity notification from MVM */ -#define VSS_ICOMMON_EVT_VOICE_ACTIVITY_UPDATE 0x000131F0 -/* Mic path is broken. */ -#define VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK 0x000131F3 -/* Mic path is restored. */ -#define VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK 0x000131F4 -/* Mic break status base. */ -#define VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK_STAT_BASE 0x00013300 - -enum mic_break_stat { - MIC_BREAK_STAT_OK = 0, - MIC_BREAK_STAT_MIC1_BREAK = 0x1, - MIC_BREAK_STAT_MIC2_BREAK = 0x2, - MIC_BREAK_STAT_MIC3_BREAK = 0x4, - MIC_BREAK_STAT_MIC_BREAK_MASK = 0x07, - MIC_BREAK_STAT_MIC1_DEGRADE = 0x8, - MIC_BREAK_STAT_MIC2_DEGRADE = 0x10, - MIC_BREAK_STAT_MIC3_DEGRADE = 0x20, - MIC_BREAK_STAT_MIC_DEGRADE_MASK = 0x38, - MIC_BREAK_STAT_MAX = 0x3F, -}; -#define MIC_DEGRADE_SHIFT_BITS 3 - -enum msm_audio_voc_rate { - VOC_0_RATE, /* Blank frame */ - VOC_8_RATE, /* 1/8 rate */ - VOC_4_RATE, /* 1/4 rate */ - VOC_2_RATE, /* 1/2 rate */ - VOC_1_RATE, /* Full rate */ - VOC_8_RATE_NC /* Noncritical 1/8 rate */ -}; - -struct vss_istream_cmd_set_tty_mode_t { - uint32_t mode; - /**< - * TTY mode. - * - * 0 : TTY disabled - * 1 : HCO - * 2 : VCO - * 3 : FULL - */ -} __packed; - -struct vss_istream_cmd_attach_vocproc_t { - uint16_t handle; - /**< Handle of vocproc being attached. */ -} __packed; - -struct vss_istream_cmd_detach_vocproc_t { - uint16_t handle; - /**< Handle of vocproc being detached. */ -} __packed; - -struct vss_imvm_cmd_attach_stream_t { - uint16_t handle; - /* The stream handle to attach. */ -} __packed; - -struct vss_imvm_cmd_detach_stream_t { - uint16_t handle; - /* The stream handle to detach. */ -} __packed; - -struct vss_icommon_cmd_set_network_t { - uint32_t network_id; - /* Network ID. (Refer to VSS_NETWORK_ID_XXX). */ -} __packed; - -struct vss_icommon_cmd_set_voice_timing_t { - uint16_t mode; - /* - * The vocoder frame synchronization mode. - * - * 0 : No frame sync. - * 1 : Hard VFR (20ms Vocoder Frame Reference interrupt). - */ - uint16_t enc_offset; - /* - * The offset in microseconds from the VFR to deliver a Tx vocoder - * packet. The offset should be less than 20000us. - */ - uint16_t dec_req_offset; - /* - * The offset in microseconds from the VFR to request for an Rx vocoder - * packet. The offset should be less than 20000us. - */ - uint16_t dec_offset; - /* - * The offset in microseconds from the VFR to indicate the deadline to - * receive an Rx vocoder packet. The offset should be less than 20000us. - * Rx vocoder packets received after this deadline are not guaranteed to - * be processed. - */ -} __packed; - -struct vss_imvm_cmd_create_control_session_t { - char name[SESSION_NAME_LEN]; - /* - * A variable-sized stream name. - * - * The stream name size is the payload size minus the size of the other - * fields. - */ -} __packed; - - -struct vss_imvm_cmd_set_policy_dual_control_t { - bool enable_flag; - /* Set to TRUE to enable modem state machine control */ -} __packed; - -struct mvm_attach_vocproc_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_attach_vocproc_t mvm_attach_cvp_handle; -} __packed; - -struct mvm_detach_vocproc_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_detach_vocproc_t mvm_detach_cvp_handle; -} __packed; - -struct mvm_create_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_create_control_session_t mvm_session; -} __packed; - -struct mvm_modem_dual_control_session_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_set_policy_dual_control_t voice_ctl; -} __packed; - -struct mvm_set_tty_mode_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_tty_mode_t tty_mode; -} __packed; - -struct mvm_attach_stream_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_attach_stream_t attach_stream; -} __packed; - -struct mvm_detach_stream_cmd { - struct apr_hdr hdr; - struct vss_imvm_cmd_detach_stream_t detach_stream; -} __packed; - -struct mvm_set_network_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_network_t network; -} __packed; - -struct mvm_set_voice_timing_cmd { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_voice_timing_t timing; -} __packed; - -struct mvm_set_hd_enable_cmd { - struct apr_hdr hdr; -} __packed; - -struct vss_imemory_table_descriptor_t { - uint32_t mem_address_lsw; - uint32_t mem_address_msw; - /* - * Base physical address of the table. The address must be aligned - * to LCM( cache_line_size, page_align, max_data_width ), where the - * attributes are specified in #VSS_IMEMORY_CMD_MAP_PHYSICAL, and - * LCM = Least Common Multiple. The table at the address must have - * the format specified by #vss_imemory_table_t. - */ - uint32_t mem_size; - /* Size in bytes of the table. */ -} __packed; - -struct vss_imemory_block_t { - uint64_t mem_address; - /* - * Base address of the memory block. The address is virtual for virtual - * memory and physical for physical memory. The address must be aligned - * to LCM( cache_line_size, page_align, max_data_width ), where the - * attributes are specified in VSS_IMEMORY_CMD_MAP_VIRTUAL or - * VSS_IMEMORY_CMD_MAP_PHYSICAL, and LCM = Least Common Multiple. - */ - uint32_t mem_size; - /* - * Size in bytes of the memory block. The size must be multiple of - * page_align, where page_align is specified in - * VSS_IMEMORY_CMD_MAP_VIRTUAL or #VSS_IMEMORY_CMD_MAP_PHYSICAL. - */ -} __packed; - -struct vss_imemory_table_t { - struct vss_imemory_table_descriptor_t next_table_descriptor; - /* - * Specifies the next table. If there is no next table, - * set the size of the table to 0 and the table address is ignored. - */ - struct vss_imemory_block_t blocks[NUM_OF_MEMORY_BLOCKS]; - /* Specifies one ore more memory blocks. */ -} __packed; - -struct vss_imemory_cmd_map_physical_t { - struct apr_hdr hdr; - struct vss_imemory_table_descriptor_t table_descriptor; - bool is_cached; - /* - * Indicates cached or uncached memory. Supported values: - * TRUE - Cached. - */ - uint16_t cache_line_size; - /* Cache line size in bytes. Supported values: 128 */ - uint32_t access_mask; - /* - * CVD's access permission to the memory while it is mapped. - * Supported values: - * bit 0 - If set, the memory is readable. - * bit 1 - If set, the memory is writable. - */ - uint32_t page_align; - /* Page frame alignment in bytes. Supported values: 4096 */ - uint8_t min_data_width; - /* - * Minimum native data type width in bits that can be accessed. - * Supported values: 8 - */ - uint8_t max_data_width; - /* - * Maximum native data type width in bits that can be accessed. - * Supported values: 64 - */ -} __packed; - -struct vss_imvm_cmd_set_cal_network_t { - struct apr_hdr hdr; - uint32_t network_id; -} __packed; - -struct vss_imvm_cmd_set_cal_media_type_t { - struct apr_hdr hdr; - uint32_t media_id; -} __packed; - -struct vss_imemory_cmd_unmap_t { - struct apr_hdr hdr; - uint32_t mem_handle; -} __packed; - -/* - * Payload structure for VSS_INOTIFY_CMD_LISTEN_FOR_EVENT_CLASS and - * VSS_INOTIFY_CMD_CANCEL_EVENT_CLASS commands. - */ -struct vss_inotify_cmd_event_class_t { - struct apr_hdr hdr; - /* Event class ID to listen for. */ - uint32_t class_id; -} __packed; - -/* Payload structure for the VSS_ICOMMOM_EVT_VOICE_ACTIVITY_UPDATE event. */ -struct vss_evt_voice_activity { - uint32_t activity; - /* - * Specifies the voice acitivity. - * @values - * #VSS_ICOMMON_VOICE_ACTIVITY_VPTX_MUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_VPTX_UNMUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_MIC_BREAK - * #VSS_ICOMMON_VOICE_ACITIVTY_MIC_UNBREAK - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_STREAM_TX_MUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_STREAM_TX_UNMUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_VOCPROC_TX_MUTE - * #VSS_ICOMMON_VOICE_ACTIVITY_UI_VOCPROC_TX_UNMUTE - */ -} __packed; - -/* TO CVS commands */ -#define VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION 0x00011140 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION 0x000110F7 -/* Create a new full control stream session. */ - -#define APRV2_IBASIC_CMD_DESTROY_SESSION 0x0001003C - -/* - * This command changes the mute setting. The new mute setting will - * be applied over the specified ramp duration. - */ -#define VSS_IVOLUME_CMD_MUTE_V2 0x0001138B - -#define VSS_ISTREAM_CMD_REGISTER_CALIBRATION_DATA_V2 0x00011369 - -#define VSS_ISTREAM_CMD_DEREGISTER_CALIBRATION_DATA 0x0001127A - -#define VSS_ISTREAM_CMD_REGISTER_STATIC_CALIBRATION_DATA 0x0001307D -#define VSS_ISTREAM_CMD_DEREGISTER_STATIC_CALIBRATION_DATA 0x0001307E - -#define VSS_ISTREAM_CMD_SET_MEDIA_TYPE 0x00011186 -/* Set media type on the stream. */ - -#define VSS_ISTREAM_EVT_SEND_ENC_BUFFER 0x00011015 -/* Event sent by the stream to its client to provide an encoded packet. */ - -#define VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER 0x00011017 -/* Event sent by the stream to its client requesting for a decoder packet. - * The client should respond with a VSS_ISTREAM_EVT_SEND_DEC_BUFFER event. - */ - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_REQUEST 0x0001136E - -#define VSS_ISTREAM_EVT_SEND_DEC_BUFFER 0x00011016 -/* Event sent by the client to the stream in response to a - * VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER event, providing a decoder packet. - */ - -#define VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE 0x0001113E -/* Set AMR encoder rate. */ - -#define VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE 0x0001113F -/* Set AMR-WB encoder rate. */ - -#define VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE 0x00011019 -/* Set encoder minimum and maximum rate. */ - -#define VSS_ISTREAM_CMD_SET_ENC_DTX_MODE 0x0001101D -/* Set encoder DTX mode. */ - -#define MODULE_ID_VOICE_MODULE_ST 0x00010EE3 -#define VOICE_PARAM_MOD_ENABLE 0x00010E00 - -#define VSS_IPLAYBACK_CMD_START 0x000112BD -/* Start in-call music delivery on the Tx voice path. */ - -#define VSS_IPLAYBACK_CMD_STOP 0x00011239 -/* Stop the in-call music delivery on the Tx voice path. */ - -#define VSS_IPLAYBACK_PORT_ID_DEFAULT 0x0000FFFF -/* Default AFE port ID. */ - -#define VSS_IPLAYBACK_PORT_ID_VOICE 0x00008005 -/* AFE port ID for VOICE 1. */ - -#define VSS_IPLAYBACK_PORT_ID_VOICE2 0x00008002 -/* AFE port ID for VOICE 2. */ - -#define VSS_IRECORD_CMD_START 0x000112BE -/* Start in-call conversation recording. */ -#define VSS_IRECORD_CMD_STOP 0x00011237 -/* Stop in-call conversation recording. */ - -#define VSS_IRECORD_PORT_ID_DEFAULT 0x0000FFFF -/* Default AFE port ID. */ - -#define VSS_IRECORD_TAP_POINT_NONE 0x00010F78 -/* Indicates no tapping for specified path. */ - -#define VSS_IRECORD_TAP_POINT_STREAM_END 0x00010F79 -/* Indicates that specified path should be tapped at the end of the stream. */ - -#define VSS_IRECORD_MODE_TX_RX_STEREO 0x00010F7A -/* Select Tx on left channel and Rx on right channel. */ - -#define VSS_IRECORD_MODE_TX_RX_MIXING 0x00010F7B -/* Select mixed Tx and Rx paths. */ - -#define VSS_PARAM_VOCPROC_TX_CHANNEL_INFO 0x0001328E - -#define VSS_PARAM_VOCPROC_RX_CHANNEL_INFO 0x0001328F - -#define VSS_PARAM_VOCPROC_EC_REF_CHANNEL_INFO 0x00013290 - -#define VSS_PARAM_TX_PORT_ENDPOINT_MEDIA_INFO 0x00013253 - -#define VSS_PARAM_RX_PORT_ENDPOINT_MEDIA_INFO 0x00013254 - -#define VSS_PARAM_EC_REF_PORT_ENDPOINT_MEDIA_INFO 0x00013255 - -#define VSS_MODULE_CVD_GENERIC 0x0001316E - -#define VSS_ISTREAM_EVT_NOT_READY 0x000110FD - -#define VSS_ISTREAM_EVT_READY 0x000110FC - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_DEC_BUFFER_READY 0x0001136F -/*notify dsp that decoder buffer is ready*/ - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_READY 0x0001136C -/*dsp notifying client that encoder buffer is ready*/ - -#define VSS_ISTREAM_EVT_OOB_NOTIFY_ENC_BUFFER_CONSUMED 0x0001136D -/*notify dsp that encoder buffer is consumed*/ - -#define VSS_ISTREAM_CMD_SET_OOB_PACKET_EXCHANGE_CONFIG 0x0001136B - -#define VSS_ISTREAM_PACKET_EXCHANGE_MODE_INBAND 0 -/* In-band packet exchange mode. */ - -#define VSS_ISTREAM_PACKET_EXCHANGE_MODE_OUT_OF_BAND 1 -/* Out-of-band packet exchange mode. */ - -#define VSS_ISTREAM_CMD_SET_PACKET_EXCHANGE_MODE 0x0001136A - -struct vss_iplayback_cmd_start_t { - uint16_t port_id; - /* - * AFE Port ID from which the audio samples are available. - * To use the default AFE pseudo port (0x8005), set this value to - * #VSS_IPLAYBACK_PORT_ID_DEFAULT. - */ -} __packed; - -struct vss_irecord_cmd_start_t { - uint32_t rx_tap_point; - /* Tap point to use on the Rx path. Supported values are: - * VSS_IRECORD_TAP_POINT_NONE : Do not record Rx path. - * VSS_IRECORD_TAP_POINT_STREAM_END : Rx tap point is at the end of - * the stream. - */ - uint32_t tx_tap_point; - /* Tap point to use on the Tx path. Supported values are: - * VSS_IRECORD_TAP_POINT_NONE : Do not record tx path. - * VSS_IRECORD_TAP_POINT_STREAM_END : Tx tap point is at the end of - * the stream. - */ - uint16_t port_id; - /* AFE Port ID to which the conversation recording stream needs to be - * sent. Set this to #VSS_IRECORD_PORT_ID_DEFAULT to use default AFE - * pseudo ports (0x8003 for Rx and 0x8004 for Tx). - */ - uint32_t mode; - /* Recording Mode. The mode parameter value is ignored if the port_id - * is set to #VSS_IRECORD_PORT_ID_DEFAULT. - * The supported values: - * #VSS_IRECORD_MODE_TX_RX_STEREO - * #VSS_IRECORD_MODE_TX_RX_MIXING - */ -} __packed; - -struct vss_istream_cmd_create_passive_control_session_t { - char name[SESSION_NAME_LEN]; - /**< - * A variable-sized stream name. - * - * The stream name size is the payload size minus the size of the other - * fields. - */ -} __packed; - -#define VSS_IVOLUME_DIRECTION_TX 0 -#define VSS_IVOLUME_DIRECTION_RX 1 - -#define VSS_IVOLUME_MUTE_OFF 0 -#define VSS_IVOLUME_MUTE_ON 1 - -#define DEFAULT_MUTE_RAMP_DURATION 500 -#define DEFAULT_VOLUME_RAMP_DURATION 20 -#define MAX_RAMP_DURATION 5000 - -struct vss_ivolume_cmd_mute_v2_t { - uint16_t direction; - /* - * The direction field sets the direction to apply the mute command. - * The Supported values: - * VSS_IVOLUME_DIRECTION_TX - * VSS_IVOLUME_DIRECTION_RX - */ - uint16_t mute_flag; - /* - * Turn mute on or off. The Supported values: - * VSS_IVOLUME_MUTE_OFF - * VSS_IVOLUME_MUTE_ON - */ - uint16_t ramp_duration_ms; - /* - * Mute change ramp duration in milliseconds. - * The Supported values: 0 to 5000. - */ -} __packed; - -struct vss_istream_cmd_create_full_control_session_t { - uint16_t direction; - /* - * Stream direction. - * - * 0 : TX only - * 1 : RX only - * 2 : TX and RX - * 3 : TX and RX loopback - */ - uint32_t enc_media_type; - /* Tx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ - uint32_t dec_media_type; - /* Rx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ - uint32_t network_id; - /* Network ID. (Refer to VSS_NETWORK_ID_XXX). */ - char name[SESSION_NAME_LEN]; - /* - * A variable-sized stream name. - * - * The stream name size is the payload size minus the size of the other - * fields. - */ -} __packed; - -struct vss_istream_cmd_set_media_type_t { - uint32_t rx_media_id; - /* Set the Rx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ - uint32_t tx_media_id; - /* Set the Tx vocoder type. (Refer to VSS_MEDIA_ID_XXX). */ -} __packed; - -struct vss_istream_evt_send_enc_buffer_t { - uint32_t media_id; - /* Media ID of the packet. */ - uint8_t packet_data[MAX_VOC_PKT_SIZE]; - /* Packet data buffer. */ -} __packed; - -struct vss_istream_evt_send_dec_buffer_t { - uint32_t media_id; - /* Media ID of the packet. */ - uint8_t packet_data[MAX_VOC_PKT_SIZE]; - /* Packet data. */ -} __packed; - -struct vss_istream_cmd_voc_amr_set_enc_rate_t { - uint32_t mode; - /* Set the AMR encoder rate. - * - * 0x00000000 : 4.75 kbps - * 0x00000001 : 5.15 kbps - * 0x00000002 : 5.90 kbps - * 0x00000003 : 6.70 kbps - * 0x00000004 : 7.40 kbps - * 0x00000005 : 7.95 kbps - * 0x00000006 : 10.2 kbps - * 0x00000007 : 12.2 kbps - */ -} __packed; - -struct vss_istream_cmd_voc_amrwb_set_enc_rate_t { - uint32_t mode; - /* Set the AMR-WB encoder rate. - * - * 0x00000000 : 6.60 kbps - * 0x00000001 : 8.85 kbps - * 0x00000002 : 12.65 kbps - * 0x00000003 : 14.25 kbps - * 0x00000004 : 15.85 kbps - * 0x00000005 : 18.25 kbps - * 0x00000006 : 19.85 kbps - * 0x00000007 : 23.05 kbps - * 0x00000008 : 23.85 kbps - */ -} __packed; - -struct vss_istream_cmd_cdma_set_enc_minmax_rate_t { - uint16_t min_rate; - /* Set the lower bound encoder rate. - * - * 0x0000 : Blank frame - * 0x0001 : Eighth rate - * 0x0002 : Quarter rate - * 0x0003 : Half rate - * 0x0004 : Full rate - */ - uint16_t max_rate; - /* Set the upper bound encoder rate. - * - * 0x0000 : Blank frame - * 0x0001 : Eighth rate - * 0x0002 : Quarter rate - * 0x0003 : Half rate - * 0x0004 : Full rate - */ -} __packed; - -struct vss_istream_cmd_set_enc_dtx_mode_t { - uint32_t enable; - /* Toggle DTX on or off. - * - * 0 : Disables DTX - * 1 : Enables DTX - */ -} __packed; - -struct vss_istream_cmd_register_calibration_data_v2_t { - uint32_t cal_mem_handle; - /* Handle to the shared memory that holds the calibration data. */ - uint32_t cal_mem_address_lsw; - uint32_t cal_mem_address_msw; - /* Location of calibration data. */ - uint32_t cal_mem_size; - /* Size of the calibration data in bytes. */ - uint8_t column_info[MAX_COL_INFO_SIZE]; - /* - * Column info contains the number of columns and the array of columns - * in the calibration table. The order in which the columns are provided - * here must match the order in which they exist in the calibration - * table provided. - */ -} __packed; - -struct enable_param { - uint16_t enable; - uint16_t reserved_field; - /* Reserved, set to 0. */ -}; - -struct vss_icommon_cmd_set_ui_property { - /* APR Header */ - struct apr_hdr apr_hdr; - - /* The parameter data to be filled when sent inband */ - u8 param_data[0]; -} __packed; - -/* - * Event sent by the stream to the client that enables Rx DTMF - * detection whenever DTMF is detected in the Rx path. - * - * The DTMF detection feature can only be used to detect DTMF - * frequencies as listed in the vss_istream_evt_rx_dtmf_detected_t - * structure. - */ - -#define VSS_ISTREAM_EVT_RX_DTMF_DETECTED 0x0001101A - -struct vss_istream_cmd_set_rx_dtmf_detection { - /* - * Enables/disables Rx DTMF detection - * - * Possible values are - * 0 - disable - * 1 - enable - * - */ - uint32_t enable; -}; - -#define VSS_ISTREAM_CMD_SET_RX_DTMF_DETECTION 0x00011027 - -struct vss_istream_evt_rx_dtmf_detected { - uint16_t low_freq; - /* - * Detected low frequency. Possible values: - * 697 Hz - * 770 Hz - * 852 Hz - * 941 Hz - */ - uint16_t high_freq; - /* - * Detected high frequency. Possible values: - * 1209 Hz - * 1336 Hz - * 1477 Hz - * 1633 Hz - */ -}; - -struct cvs_set_rx_dtmf_detection_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_rx_dtmf_detection cvs_dtmf_det; -} __packed; - - -struct cvs_create_passive_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_create_passive_control_session_t cvs_session; -} __packed; - -struct cvs_create_full_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_create_full_control_session_t cvs_session; -} __packed; - -struct cvs_destroy_session_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvs_set_mute_cmd { - struct apr_hdr hdr; - struct vss_ivolume_cmd_mute_v2_t cvs_set_mute; -} __packed; - -struct cvs_set_media_type_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_media_type_t media_type; -} __packed; - -struct cvs_send_dec_buf_cmd { - struct apr_hdr hdr; - struct vss_istream_evt_send_dec_buffer_t dec_buf; -} __packed; - -struct cvs_set_amr_enc_rate_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_voc_amr_set_enc_rate_t amr_rate; -} __packed; - -struct cvs_set_amrwb_enc_rate_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_voc_amrwb_set_enc_rate_t amrwb_rate; -} __packed; - -struct cvs_set_cdma_enc_minmax_rate_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_cdma_set_enc_minmax_rate_t cdma_rate; -} __packed; - -struct cvs_set_enc_dtx_mode_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_set_enc_dtx_mode_t dtx_mode; -} __packed; - -struct cvs_register_cal_data_cmd { - struct apr_hdr hdr; - struct vss_istream_cmd_register_calibration_data_v2_t cvs_cal_data; -} __packed; - -struct cvs_deregister_cal_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvs_start_record_cmd { - struct apr_hdr hdr; - struct vss_irecord_cmd_start_t rec_mode; -} __packed; - -struct cvs_start_playback_cmd { - struct apr_hdr hdr; - struct vss_iplayback_cmd_start_t playback_mode; -} __packed; - -struct cvs_dec_buffer_ready_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvs_enc_buffer_consumed_cmd { - struct apr_hdr hdr; -} __packed; - -struct vss_istream_cmd_set_oob_packet_exchange_config_t { - struct apr_hdr hdr; - uint32_t mem_handle; - uint32_t enc_buf_addr_lsw; - uint32_t enc_buf_addr_msw; - uint32_t enc_buf_size; - uint32_t dec_buf_addr_lsw; - uint32_t dec_buf_addr_msw; - uint32_t dec_buf_size; -} __packed; - -struct vss_istream_cmd_set_packet_exchange_mode_t { - struct apr_hdr hdr; - uint32_t mode; -} __packed; - -/* TO CVP commands */ - -#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION 0x000100C3 -/**< Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define APRV2_IBASIC_CMD_DESTROY_SESSION 0x0001003C - -#define VSS_IVOCPROC_CMD_SET_DEVICE_V2 0x000112C6 - -#define VSS_IVOCPROC_CMD_SET_DEVICE_V3 0x0001316A - -#define VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS 0x00013199 - -#define VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT 0x00013198 - -#define VSS_IVOCPROC_CMD_SET_VP3_DATA 0x000110EB - -#define VSS_IVOLUME_CMD_SET_STEP 0x000112C2 - -#define VSS_IVOCPROC_CMD_ENABLE 0x000100C6 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -#define VSS_IVOCPROC_CMD_DISABLE 0x000110E1 -/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */ - -/* - * Registers the memory that contains device specific configuration data with - * the vocproc. The client must register device configuration data with the - * vocproc that corresponds with the device being set on the vocproc. - */ -#define VSS_IVOCPROC_CMD_REGISTER_DEVICE_CONFIG 0x00011371 - -/* - * Deregisters the memory that holds device configuration data from the - vocproc. -*/ -#define VSS_IVOCPROC_CMD_DEREGISTER_DEVICE_CONFIG 0x00011372 - -#define CVD_CAL_DATA_FORMAT_MINOR_VERSION_V0 0x00000000 -#define CVD_CAL_DATA_FORMAT_MINOR_VERSION_V1 0x00000001 -#define VSS_IVOCPROC_CMD_REGISTER_CALIBRATION_DATA_V2 0x00011373 -#define VSS_IVOCPROC_CMD_DEREGISTER_CALIBRATION_DATA 0x00011276 - -#define VSS_IVOCPROC_CMD_REGISTER_VOL_CALIBRATION_DATA 0x00011374 -#define VSS_IVOCPROC_CMD_DEREGISTER_VOL_CALIBRATION_DATA 0x00011375 - -#define VSS_IVOCPROC_CMD_REGISTER_STATIC_CALIBRATION_DATA 0x00013079 -#define VSS_IVOCPROC_CMD_DEREGISTER_STATIC_CALIBRATION_DATA 0x0001307A - -#define VSS_IVOCPROC_CMD_REGISTER_DYNAMIC_CALIBRATION_DATA 0x0001307B -#define VSS_IVOCPROC_CMD_DEREGISTER_DYNAMIC_CALIBRATION_DATA 0x0001307C - -#define VSS_IVOCPROC_TOPOLOGY_ID_NONE 0x00010F70 -#define VSS_IVOCPROC_TOPOLOGY_ID_TX_SM_ECNS_V2 0x00010F89 -#define VSS_IVOCPROC_TOPOLOGY_ID_TX_DM_FLUENCE 0x00010F72 - -#define VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT 0x00010F77 - -/* Newtwork IDs */ -#define VSS_ICOMMON_CAL_NETWORK_ID_NONE 0x0001135E - -/* Select internal mixing mode. */ -#define VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING 0x00010F7C - -/* Select external mixing mode. */ -#define VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING 0x00010F7D - -/* Default AFE port ID. Applicable to Tx and Rx. */ -#define VSS_IVOCPROC_PORT_ID_NONE 0xFFFF - -#define VSS_NETWORK_ID_DEFAULT 0x00010037 - -/* Voice over Internet Protocol (VoIP) network ID. Common for all bands.*/ -#define VSS_NETWORK_ID_VOIP 0x00011362 - -/* Media types */ -#define VSS_MEDIA_ID_EVRC_MODEM 0x00010FC2 -/* 80-VF690-47 CDMA enhanced variable rate vocoder modem format. */ -#define VSS_MEDIA_ID_AMR_NB_MODEM 0x00010FC6 -/* 80-VF690-47 UMTS AMR-NB vocoder modem format. */ -#define VSS_MEDIA_ID_AMR_WB_MODEM 0x00010FC7 -/* 80-VF690-47 UMTS AMR-WB vocoder modem format. */ - -#define VSS_MEDIA_ID_PCM_8_KHZ 0x00010FCB -#define VSS_MEDIA_ID_PCM_16_KHZ 0x00010FCC -#define VSS_MEDIA_ID_PCM_32_KHZ 0x00010FD9 -#define VSS_MEDIA_ID_PCM_48_KHZ 0x00010FD6 - -/* Linear PCM (16-bit, little-endian). */ -#define VSS_MEDIA_ID_G711_ALAW 0x00010FCD -/* G.711 a-law (contains two 10ms vocoder frames). */ -#define VSS_MEDIA_ID_G711_MULAW 0x00010FCE -/* G.711 mu-law (contains two 10ms vocoder frames). */ -#define VSS_MEDIA_ID_G729 0x00010FD0 -/* G.729AB (contains two 10ms vocoder frames. */ -#define VSS_MEDIA_ID_4GV_NB_MODEM 0x00010FC3 -/*CDMA EVRC-B vocoder modem format */ -#define VSS_MEDIA_ID_4GV_WB_MODEM 0x00010FC4 -/*CDMA EVRC-WB vocoder modem format */ -#define VSS_MEDIA_ID_4GV_NW_MODEM 0x00010FC5 -/*CDMA EVRC-NW vocoder modem format */ - -#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2 0x000112BF -#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V3 0x00013169 - -#define VSS_NUM_DEV_CHANNELS_1 1 -#define VSS_NUM_DEV_CHANNELS_2 2 -#define VSS_NUM_DEV_CHANNELS_3 3 -#define VSS_NUM_DEV_CHANNELS_4 4 - -struct vss_ivocproc_cmd_create_full_control_session_v2_t { - uint16_t direction; - /* - * Vocproc direction. The supported values: - * VSS_IVOCPROC_DIRECTION_RX - * VSS_IVOCPROC_DIRECTION_TX - * VSS_IVOCPROC_DIRECTION_RX_TX - */ - uint16_t tx_port_id; - /* - * Tx device port ID to which the vocproc connects. If a port ID is - * not being supplied, set this to #VSS_IVOCPROC_PORT_ID_NONE. - */ - uint32_t tx_topology_id; - /* - * Tx path topology ID. If a topology ID is not being supplied, set - * this to #VSS_IVOCPROC_TOPOLOGY_ID_NONE. - */ - uint16_t rx_port_id; - /* - * Rx device port ID to which the vocproc connects. If a port ID is - * not being supplied, set this to #VSS_IVOCPROC_PORT_ID_NONE. - */ - uint32_t rx_topology_id; - /* - * Rx path topology ID. If a topology ID is not being supplied, set - * this to #VSS_IVOCPROC_TOPOLOGY_ID_NONE. - */ - uint32_t profile_id; - /* Voice calibration profile ID. */ - uint32_t vocproc_mode; - /* - * Vocproc mode. The supported values: - * VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING - * VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING - */ - uint16_t ec_ref_port_id; - /* - * Port ID to which the vocproc connects for receiving echo - * cancellation reference signal. If a port ID is not being supplied, - * set this to #VSS_IVOCPROC_PORT_ID_NONE. This parameter value is - * ignored when the vocproc_mode parameter is set to - * VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING. - */ - char name[SESSION_NAME_LEN]; - /* - * Session name string used to identify a session that can be shared - * with passive controllers (optional). The string size, including the - * NULL termination character, is limited to 31 characters. - */ -} __packed; - -struct vss_ivocproc_cmd_set_volume_index_t { - uint16_t vol_index; - /* - * Volume index utilized by the vocproc to index into the volume table - * provided in VSS_IVOCPROC_CMD_CACHE_VOLUME_CALIBRATION_TABLE and set - * volume on the VDSP. - */ -} __packed; - -struct vss_ivolume_cmd_set_step_t { - uint16_t direction; - /* - * The direction field sets the direction to apply the volume command. - * The supported values: - * #VSS_IVOLUME_DIRECTION_RX - */ - uint32_t value; - /* - * Volume step used to find the corresponding linear volume and - * the best match index in the registered volume calibration table. - */ - uint16_t ramp_duration_ms; - /* - * Volume change ramp duration in milliseconds. - * The supported values: 0 to 5000. - */ -} __packed; - -struct vss_ivocproc_cmd_set_device_v2_t { - uint16_t tx_port_id; - /* - * TX device port ID which vocproc will connect to. - * VSS_IVOCPROC_PORT_ID_NONE means vocproc will not connect to any port. - */ - uint32_t tx_topology_id; - /* - * TX leg topology ID. - * VSS_IVOCPROC_TOPOLOGY_ID_NONE means vocproc does not contain any - * pre/post-processing blocks and is pass-through. - */ - uint16_t rx_port_id; - /* - * RX device port ID which vocproc will connect to. - * VSS_IVOCPROC_PORT_ID_NONE means vocproc will not connect to any port. - */ - uint32_t rx_topology_id; - /* - * RX leg topology ID. - * VSS_IVOCPROC_TOPOLOGY_ID_NONE means vocproc does not contain any - * pre/post-processing blocks and is pass-through. - */ - uint32_t vocproc_mode; - /* Vocproc mode. The supported values: - * VSS_IVOCPROC_VOCPROC_MODE_EC_INT_MIXING - 0x00010F7C - * VSS_IVOCPROC_VOCPROC_MODE_EC_EXT_MIXING - 0x00010F7D - */ - uint16_t ec_ref_port_id; - /* Port ID to which the vocproc connects for receiving - * echo - */ -} __packed; - -struct vss_ivocproc_cmd_register_device_config_t { - uint32_t mem_handle; - /* - * Handle to the shared memory that holds the per-network calibration - * data. - */ - uint32_t mem_address_lsw; - uint32_t mem_address_msw; - /* Location of calibration data. */ - uint32_t mem_size; - /* Size of the calibration data in bytes. */ -} __packed; - -struct vss_ivocproc_cmd_register_calibration_data_v2_t { - uint32_t cal_mem_handle; - /* - * Handle to the shared memory that holds the per-network calibration - * data. - */ - uint32_t cal_mem_address_lsw; - uint32_t cal_mem_address_msw; - /* Location of calibration data. */ - uint32_t cal_mem_size; - /* Size of the calibration data in bytes. */ - uint8_t column_info[MAX_COL_INFO_SIZE]; - /* - * Column info contains the number of columns and the array of columns - * in the calibration table. The order in which the columns are provided - * here must match the order in which they exist in the calibration - * table provided. - */ -} __packed; - -struct vss_ivocproc_cmd_register_volume_cal_data_t { - uint32_t cal_mem_handle; - /* - * Handle to the shared memory that holds the volume calibration - * data. - */ - uint32_t cal_mem_address_lsw; - uint32_t cal_mem_address_msw; - /* Location of volume calibration data. */ - uint32_t cal_mem_size; - /* Size of the volume calibration data in bytes. */ - uint8_t column_info[MAX_COL_INFO_SIZE]; - /* - * Column info contains the number of columns and the array of columns - * in the calibration table. The order in which the columns are provided - * here must match the order in which they exist in the calibration - * table provided. - */ -} __packed; - -struct vss_ivocproc_cmd_topology_set_dev_channels_t { - uint16_t tx_num_channels; - /* - * Number of Mics. - * Supported values - * 1 VSS_NUM_DEV_CHANNELS_1 - * 2 VSS_NUM_DEV_CHANNELS_2 - * 3 VSS_NUM_DEV_CHANNELS_3 - * 4 VSS_NUM_DEV_CHANNELS_4 - */ - uint16_t rx_num_channels; - /* - * Number of speaker channels. - * Supported values - * 1 VSS_NUM_DEV_CHANNELS_1 - */ -} __packed; - -/* Starts a vocoder PCM session */ -#define VSS_IVPCM_CMD_START_V2 0x00011339 - -/* Default tap point location on the TX path. */ -#define VSS_IVPCM_TAP_POINT_TX_DEFAULT 0x00011289 - -/* Default tap point location on the RX path. */ -#define VSS_IVPCM_TAP_POINT_RX_DEFAULT 0x0001128A - -/* Indicates tap point direction is output. */ -#define VSS_IVPCM_TAP_POINT_DIR_OUT 0 - -/* Indicates tap point direction is input. */ -#define VSS_IVPCM_TAP_POINT_DIR_IN 1 - -/* Indicates tap point direction is output and input. */ -#define VSS_IVPCM_TAP_POINT_DIR_OUT_IN 2 - - -#define VSS_IVPCM_SAMPLING_RATE_AUTO 0 - -/* Indicates 8 KHz vocoder PCM sampling rate. */ -#define VSS_IVPCM_SAMPLING_RATE_8K 8000 - -/* Indicates 16 KHz vocoder PCM sampling rate. */ -#define VSS_IVPCM_SAMPLING_RATE_16K 16000 - -/* RX and TX */ -#define MAX_TAP_POINTS_SUPPORTED 2 - -struct vss_ivpcm_tap_point { - uint32_t tap_point; - uint16_t direction; - uint16_t sampling_rate; - uint16_t duration; -} __packed; - - -struct vss_ivpcm_cmd_start_v2_t { - uint32_t mem_handle; - uint32_t num_tap_points; - struct vss_ivpcm_tap_point tap_points[MAX_TAP_POINTS_SUPPORTED]; -} __packed; - -#define VSS_IVPCM_EVT_PUSH_BUFFER_V2 0x0001133A - -/* Push buffer event mask indicating output buffer is filled. */ -#define VSS_IVPCM_PUSH_BUFFER_MASK_OUTPUT_BUFFER 1 - -/* Push buffer event mask indicating input buffer is consumed. */ -#define VSS_IVPCM_PUSH_BUFFER_MASK_INPUT_BUFFER 2 - - -struct vss_ivpcm_evt_push_buffer_v2_t { - uint32_t tap_point; - uint32_t push_buf_mask; - uint64_t out_buf_mem_address; - uint16_t out_buf_mem_size; - uint64_t in_buf_mem_address; - uint16_t in_buf_mem_size; - uint16_t sampling_rate; - uint16_t num_in_channels; -} __packed; - -#define VSS_IVPCM_EVT_NOTIFY_V2 0x0001133B - -/* Notify event mask indicates output buffer is filled. */ -#define VSS_IVPCM_NOTIFY_MASK_OUTPUT_BUFFER 1 - -/* Notify event mask indicates input buffer is consumed. */ -#define VSS_IVPCM_NOTIFY_MASK_INPUT_BUFFER 2 - -/* Notify event mask indicates a timetick */ -#define VSS_IVPCM_NOTIFY_MASK_TIMETICK 4 - -/* Notify event mask indicates an error occurred in output buffer operation */ -#define VSS_IVPCM_NOTIFY_MASK_OUTPUT_ERROR 8 - -/* Notify event mask indicates an error occurred in input buffer operation */ -#define VSS_IVPCM_NOTIFY_MASK_INPUT_ERROR 16 - - -struct vss_ivpcm_evt_notify_v2_t { - uint32_t tap_point; - uint32_t notify_mask; - uint64_t out_buff_addr; - uint64_t in_buff_addr; - uint16_t filled_out_size; - uint16_t request_buf_size; - uint16_t sampling_rate; - uint16_t num_out_channels; -} __packed; - -struct cvp_start_cmd { - struct apr_hdr hdr; - struct vss_ivpcm_cmd_start_v2_t vpcm_start_cmd; -} __packed; - -struct cvp_push_buf_cmd { - struct apr_hdr hdr; - struct vss_ivpcm_evt_push_buffer_v2_t vpcm_evt_push_buffer; -} __packed; - -#define VSS_IVPCM_CMD_STOP 0x0001100B - -struct cvp_create_full_ctl_session_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_create_full_control_session_v2_t cvp_session; -} __packed; - -struct cvp_command { - struct apr_hdr hdr; -} __packed; - -struct cvp_set_device_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_set_device_v2_t cvp_set_device_v2; -} __packed; - -struct cvp_set_dev_channels_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_topology_set_dev_channels_t cvp_set_channels; -} __packed; - -struct cvp_set_channel_info_cmd_v2 { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_param_channel_info_v2_t - cvp_set_ch_info_param_v2; -} __packed; - -struct cvp_set_channel_mixer_info_cmd_v2 { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_param_ch_mixer_v2_t - cvp_set_ch_mixer_param_v2; -} __packed; - -struct cvp_set_mfc_config_cmd_v2 { - struct apr_hdr hdr; - struct vss_icommon_cmd_set_param_mfc_config_v2_t cvp_set_mfc_param_v2; -} __packed; - -struct cvp_set_vp3_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_set_rx_volume_index_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_set_volume_index_t cvp_set_vol_idx; -} __packed; - -struct cvp_set_rx_volume_step_cmd { - struct apr_hdr hdr; - struct vss_ivolume_cmd_set_step_t cvp_set_vol_step; -} __packed; - -struct cvp_register_dev_cfg_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_register_device_config_t cvp_dev_cfg_data; -} __packed; - -struct cvp_deregister_dev_cfg_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_register_cal_data_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_register_calibration_data_v2_t cvp_cal_data; -} __packed; - -struct cvp_deregister_cal_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_register_vol_cal_data_cmd { - struct apr_hdr hdr; - struct vss_ivocproc_cmd_register_volume_cal_data_t cvp_vol_cal_data; -} __packed; - -struct cvp_deregister_vol_cal_data_cmd { - struct apr_hdr hdr; -} __packed; - -struct cvp_set_mute_cmd { - struct apr_hdr hdr; - struct vss_ivolume_cmd_mute_v2_t cvp_set_mute; -} __packed; - -/* CB for up-link packets. */ -typedef void (*ul_cb_fn)(uint8_t *voc_pkt, - uint32_t pkt_len, - uint32_t timestamp, - void *private_data); - -/* CB for down-link packets. */ -typedef void (*dl_cb_fn)(uint8_t *voc_pkt, - void *private_data); - -/* CB for DTMF RX Detection */ -typedef void (*dtmf_rx_det_cb_fn)(uint8_t *pkt, - char *session, - void *private_data); - -typedef void (*voip_ssr_cb) (uint32_t opcode, - void *private_data); - -typedef void (*hostpcm_cb_fn)(uint8_t *data, - char *session, - void *private_data); - -struct mvs_driver_info { - uint32_t media_type; - uint32_t rate; - uint32_t network_type; - uint32_t dtx_mode; - ul_cb_fn ul_cb; - dl_cb_fn dl_cb; - voip_ssr_cb ssr_cb; - void *private_data; - uint32_t evrc_min_rate; - uint32_t evrc_max_rate; -}; - -struct dtmf_driver_info { - dtmf_rx_det_cb_fn dtmf_rx_ul_cb; - void *private_data; -}; - -struct hostpcm_driver_info { - hostpcm_cb_fn hostpcm_evt_cb; - void *private_data; -}; - -struct incall_rec_info { - uint32_t rec_enable; - uint32_t rec_mode; - uint32_t recording; - uint32_t port_id; -}; - -struct incall_music_info { - uint32_t play_enable; - uint32_t playing; - int count; - int force; - uint16_t port_id; -}; - -struct share_memory_info { - u32 mem_handle; - struct share_mem_buf sh_buf; - struct mem_map_table memtbl; -}; - -#define VSS_ISOUNDFOCUS_CMD_SET_SECTORS 0x00013133 -#define VSS_ISOUNDFOCUS_CMD_GET_SECTORS 0x00013134 -#define VSS_ISOUNDFOCUS_RSP_GET_SECTORS 0x00013135 -#define VSS_ISOURCETRACK_CMD_GET_ACTIVITY 0x00013136 - -struct vss_isoundfocus_cmd_set_sectors_t { - uint16_t start_angles[8]; - uint8_t enables[8]; - uint16_t gain_step; -} __packed; - -/* Payload of the VSS_ISOUNDFOCUS_RSP_GET_SECTORS response */ -struct vss_isoundfocus_rsp_get_sectors_t { - uint16_t start_angles[8]; - uint8_t enables[8]; - uint16_t gain_step; -} __packed; - -struct cvp_set_sound_focus_param_cmd_t { - struct apr_hdr hdr; - struct vss_isoundfocus_cmd_set_sectors_t cvp_set_sound_focus_param; -} __packed; - -/* Payload structure for the VSS_ISOURCETRACK_CMD_GET_ACTIVITY command */ -struct vss_isourcetrack_cmd_get_activity_t { - uint32_t mem_handle; - uint32_t mem_address_lsw; - uint32_t mem_address_msw; - uint32_t mem_size; -} __packed; - -struct cvp_get_source_tracking_param_cmd_t { - struct apr_hdr hdr; - struct vss_isourcetrack_cmd_get_activity_t - cvp_get_source_tracking_param; -} __packed; - -/* Structure for the sound activity data */ -struct vss_isourcetrack_activity_data_t { - uint8_t voice_active[8]; - uint16_t talker_doa; - uint16_t interferer_doa[3]; - uint8_t sound_strength[360]; -} __packed; - -struct shared_mem_info { - uint32_t mem_handle; - struct mem_map_table sh_mem_block; - struct mem_map_table sh_mem_table; -}; - -struct voice_data { - int voc_state;/*INIT, CHANGE, RELEASE, RUN */ - - /* Shared mem to store decoder and encoder packets */ - struct share_memory_info shmem_info; - - wait_queue_head_t mvm_wait; - wait_queue_head_t cvs_wait; - wait_queue_head_t cvp_wait; - - /* Cache the values related to Rx and Tx devices */ - struct device_data dev_rx; - struct device_data dev_tx; - - /* Cache the values related to Rx and Tx streams */ - struct stream_data stream_rx; - struct stream_data stream_tx; - - u32 mvm_state; - u32 cvs_state; - u32 cvp_state; - - u32 async_err; - - /* Handle to MVM in the Q6 */ - u16 mvm_handle; - /* Handle to CVS in the Q6 */ - u16 cvs_handle; - /* Handle to CVP in the Q6 */ - u16 cvp_handle; - - struct mutex lock; - - bool disable_topology; - - uint16_t sidetone_gain; - uint8_t tty_mode; - /* slowtalk enable value */ - uint32_t st_enable; - uint32_t hd_enable; - uint32_t dtmf_rx_detect_en; - /* Local Call Hold mode */ - uint8_t lch_mode; - - struct voice_dev_route_state voc_route_state; - - u32 session_id; - - struct incall_rec_info rec_info; - - struct incall_music_info music_info; - - struct voice_rec_route_state rec_route_state; - - uint8_t mic_break_status; - struct work_struct voice_mic_break_work; -}; - -#define MAX_VOC_SESSIONS 8 - -struct common_data { - /* these default values are for all devices */ - uint32_t default_mute_val; - uint32_t default_sample_val; - uint32_t default_vol_step_val; - uint32_t default_vol_ramp_duration_ms; - uint32_t default_mute_ramp_duration_ms; - bool ec_ref_ext; - struct media_format_info ec_media_fmt_info; - - /* APR to MVM in the Q6 */ - void *apr_q6_mvm; - /* APR to CVS in the Q6 */ - void *apr_q6_cvs; - /* APR to CVP in the Q6 */ - void *apr_q6_cvp; - - struct cal_type_data *cal_data[MAX_VOICE_CAL_TYPES]; - - struct mem_map_table cal_mem_map_table; - uint32_t cal_mem_handle; - - struct mem_map_table rtac_mem_map_table; - uint32_t rtac_mem_handle; - - uint32_t voice_host_pcm_mem_handle; - - struct mutex common_lock; - - struct mvs_driver_info mvs_info; - - struct dtmf_driver_info dtmf_info; - - struct hostpcm_driver_info hostpcm_info; - - struct voice_data voice[MAX_VOC_SESSIONS]; - - bool srvcc_rec_flag; - bool is_destroy_cvd; - char cvd_version[CVD_VERSION_STRING_MAX_SIZE]; - int cvp_version; - bool is_avcs_version_queried; - bool is_per_vocoder_cal_enabled; - bool is_sound_focus_resp_success; - bool is_source_tracking_resp_success; - struct vss_isoundfocus_rsp_get_sectors_t soundFocusResponse; - struct shared_mem_info source_tracking_sh_mem; - struct vss_isourcetrack_activity_data_t sourceTrackingResponse; - bool sidetone_enable; - bool mic_break_enable; - struct audio_uevent_data *uevent_data; - int32_t rec_channel_count; -}; - -struct voice_session_itr { - int cur_idx; - int session_idx; -}; - -void voc_register_mvs_cb(ul_cb_fn ul_cb, - dl_cb_fn dl_cb, - voip_ssr_cb ssr_cb, - void *private_data); - -void voc_register_dtmf_rx_detection_cb(dtmf_rx_det_cb_fn dtmf_rx_ul_cb, - void *private_data); - -void voc_config_vocoder(uint32_t media_type, - uint32_t rate, - uint32_t network_type, - uint32_t dtx_mode, - uint32_t evrc_min_rate, - uint32_t evrc_max_rate); - -enum { - DEV_RX = 0, - DEV_TX, -}; - -enum { - RX_PATH = 0, - TX_PATH, - EC_REF_PATH, -}; - -#define VOC_PATH_PASSIVE 0 -#define VOC_PATH_FULL 1 -#define VOC_PATH_VOLTE_PASSIVE 2 -#define VOC_PATH_VOICE2_PASSIVE 3 -#define VOC_PATH_QCHAT_PASSIVE 4 -#define VOC_PATH_VOWLAN_PASSIVE 5 -#define VOC_PATH_VOICEMMODE1_PASSIVE 6 -#define VOC_PATH_VOICEMMODE2_PASSIVE 7 - -#define MAX_SESSION_NAME_LEN 32 -#define VOICE_SESSION_NAME "Voice session" -#define VOIP_SESSION_NAME "VoIP session" -#define VOLTE_SESSION_NAME "VoLTE session" -#define VOICE2_SESSION_NAME "Voice2 session" -#define QCHAT_SESSION_NAME "QCHAT session" -#define VOWLAN_SESSION_NAME "VoWLAN session" -#define VOICEMMODE1_NAME "VoiceMMode1" -#define VOICEMMODE2_NAME "VoiceMMode2" - -#define VOICE2_SESSION_VSID_STR "10DC1000" -#define QCHAT_SESSION_VSID_STR "10803000" -#define VOWLAN_SESSION_VSID_STR "10002000" -#define VOICEMMODE1_VSID_STR "11C05000" -#define VOICEMMODE2_VSID_STR "11DC5000" -#define VOICE_SESSION_VSID 0x10C01000 -#define VOICE2_SESSION_VSID 0x10DC1000 -#define VOLTE_SESSION_VSID 0x10C02000 -#define VOIP_SESSION_VSID 0x10004000 -#define QCHAT_SESSION_VSID 0x10803000 -#define VOWLAN_SESSION_VSID 0x10002000 -#define VOICEMMODE1_VSID 0x11C05000 -#define VOICEMMODE2_VSID 0x11DC5000 -#define ALL_SESSION_VSID 0xFFFFFFFF -#define VSID_MAX ALL_SESSION_VSID - -/* called by alsa driver */ -int voc_set_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info, - uint32_t enable); -int voc_get_pp_enable(uint32_t session_id, - struct module_instance_info mod_inst_info); -int voc_set_hd_enable(uint32_t session_id, uint32_t enable); -uint8_t voc_get_tty_mode(uint32_t session_id); -int voc_set_tty_mode(uint32_t session_id, uint8_t tty_mode); -int voc_start_voice_call(uint32_t session_id); -int voc_end_voice_call(uint32_t session_id); -int voc_standby_voice_call(uint32_t session_id); -int voc_resume_voice_call(uint32_t session_id); -int voc_set_lch(uint32_t session_id, enum voice_lch_mode lch_mode); -int voc_set_rx_vol_step(uint32_t session_id, uint32_t dir, uint32_t vol_step, - uint32_t ramp_duration); -int voc_set_tx_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration); -int voc_set_device_mute(uint32_t session_id, uint32_t dir, uint32_t mute, - uint32_t ramp_duration); -int voc_get_rx_device_mute(uint32_t session_id); -int voc_set_route_flag(uint32_t session_id, uint8_t path_dir, uint8_t set); -uint8_t voc_get_route_flag(uint32_t session_id, uint8_t path_dir); -bool voc_get_mbd_enable(void); -uint8_t voc_set_mbd_enable(bool enable); -int voc_enable_dtmf_rx_detection(uint32_t session_id, uint32_t enable); -void voc_disable_dtmf_det_on_active_sessions(void); -int voc_alloc_cal_shared_memory(void); -int voc_alloc_voip_shared_memory(void); -int is_voc_initialized(void); -int voc_register_vocproc_vol_table(void); -int voc_deregister_vocproc_vol_table(void); -int voc_send_cvp_map_vocpcm_memory(uint32_t session_id, - struct mem_map_table *tp_mem_table, - phys_addr_t paddr, uint32_t bufsize); -int voc_send_cvp_unmap_vocpcm_memory(uint32_t session_id); -int voc_send_cvp_start_vocpcm(uint32_t session_id, - struct vss_ivpcm_tap_point *vpcm_tp, - uint32_t no_of_tp); -int voc_send_cvp_vocpcm_push_buf_evt(uint32_t session_id, - struct vss_ivpcm_evt_push_buffer_v2_t *push_buff_evt); -int voc_send_cvp_stop_vocpcm(uint32_t session_id); -void voc_register_hpcm_evt_cb(hostpcm_cb_fn hostpcm_cb, - void *private_data); -void voc_deregister_hpcm_evt_cb(void); - -int voc_map_rtac_block(struct rtac_cal_block_data *cal_block); -int voc_unmap_rtac_block(uint32_t *mem_map_handle); - -uint32_t voc_get_session_id(char *name); - -int voc_start_playback(uint32_t set, uint16_t port_id); -int voc_start_record(uint32_t port_id, uint32_t set, uint32_t session_id); -int voice_get_idx_for_session(u32 session_id); -int voc_set_ext_ec_ref_port_id(uint16_t port_id, bool state); -int voc_get_ext_ec_ref_port_id(void); -int voc_set_ext_ec_ref_media_fmt_info(struct media_format_info *finfo); -int voc_update_amr_vocoder_rate(uint32_t session_id); -int voc_disable_device(uint32_t session_id); -int voc_enable_device(uint32_t session_id); -void voc_set_destroy_cvd_flag(bool is_destroy_cvd); -int voc_disable_topology(uint32_t session_id, uint32_t disable); -int voc_set_device_config(uint32_t session_id, uint8_t path_dir, - struct media_format_info *finfo); -uint32_t voice_get_topology(uint32_t topology_idx); -void voc_set_incall_capture_channel_config(int channel_count); -int voc_get_incall_capture_channel_config(void); -int voice_set_topology_specific_info(struct voice_data *v, - uint32_t topology_idx); -int voc_set_sound_focus(struct sound_focus_param sound_focus_param); -int voc_get_sound_focus(struct sound_focus_param *soundFocusData); -int voc_get_source_tracking(struct source_tracking_param *sourceTrackingData); -int voc_set_afe_sidetone(uint32_t session_id, bool sidetone_enable); -bool voc_get_afe_sidetone(void); -#endif diff --git a/techpack/audio/include/dsp/rtac.h b/techpack/audio/include/dsp/rtac.h deleted file mode 100644 index 05dd82a7fcab..000000000000 --- a/techpack/audio/include/dsp/rtac.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2011, 2013-2015, 2017-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __RTAC_H__ -#define __RTAC_H__ - -#include - -/* Voice Modes */ -#define RTAC_CVP 0 -#define RTAC_CVS 1 -#define RTAC_VOICE_MODES 2 - -#define RTAC_MAX_ACTIVE_DEVICES 4 -#define RTAC_MAX_ACTIVE_POPP 8 - -#define DEFAULT_APP_TYPE 0x00011130 - -enum { - ADM_RTAC_CAL, - ASM_RTAC_CAL, - VOICE_RTAC_CAL, - AFE_RTAC_CAL, - MAX_RTAC_BLOCKS -}; - -struct rtac_cal_mem_map_data { - uint32_t map_size; - uint32_t map_handle; - struct dma_buf *dma_buf; -}; - -struct rtac_cal_data { - size_t size; - void *kvaddr; - phys_addr_t paddr; -}; - -struct rtac_cal_block_data { - struct rtac_cal_mem_map_data map_data; - struct rtac_cal_data cal_data; -}; - -struct rtac_popp_data { - uint32_t popp; - uint32_t popp_topology; - uint32_t app_type; -}; - -struct rtac_adm_data { - uint32_t topology_id; - uint32_t afe_topology; - uint32_t afe_port; - uint32_t copp; - uint32_t num_of_popp; - uint32_t app_type; - uint32_t acdb_dev_id; - struct rtac_popp_data popp[RTAC_MAX_ACTIVE_POPP]; -}; - -struct rtac_adm { - uint32_t num_of_dev; - struct rtac_adm_data device[RTAC_MAX_ACTIVE_DEVICES]; -}; - -void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id, - u32 app_type, u32 acdb_dev_id); -void rtac_remove_adm_device(u32 port_id, u32 copp_id); -void rtac_remove_popp_from_adm_devices(u32 popp_id); -void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port, - u32 tx_afe_port, u32 rx_acdb_id, u32 tx_acdb_id, u32 session_id); -void rtac_remove_voice(u32 cvs_handle); -void rtac_set_adm_handle(void *handle); -bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size); -void rtac_copy_adm_payload_to_user(void *payload, u32 payload_size); -void rtac_set_asm_handle(u32 session_id, void *handle); -bool rtac_make_asm_callback(u32 session_id, uint32_t *payload, - u32 payload_size); -void rtac_copy_asm_payload_to_user(void *payload, u32 payload_size); -void rtac_set_voice_handle(u32 mode, void *handle); -bool rtac_make_voice_callback(u32 mode, uint32_t *payload, u32 payload_size); -void rtac_copy_voice_payload_to_user(void *payload, u32 payload_size); -int rtac_clear_mapping(uint32_t cal_type); -bool rtac_make_afe_callback(uint32_t *payload, u32 payload_size); -void rtac_set_afe_handle(void *handle); -void get_rtac_adm_data(struct rtac_adm *adm_data); -void rtac_update_afe_topology(u32 port_id); -#endif diff --git a/techpack/audio/include/dsp/sp_params.h b/techpack/audio/include/dsp/sp_params.h deleted file mode 100644 index 88b2d14a6ba6..000000000000 --- a/techpack/audio/include/dsp/sp_params.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __SP_PARAMS_H__ -#define __SP_PARAMS_H__ - -#if IS_ENABLED(CONFIG_XT_LOGGING) -int afe_get_sp_xt_logging_data(u16 port_id); -#else -static inline int afe_get_sp_xt_logging_data(u16 port_id) -{ - return 0; -} -#endif - -#endif /* __SP_PARAMS_H__ */ - diff --git a/techpack/audio/include/dsp/voice_mhi.h b/techpack/audio/include/dsp/voice_mhi.h deleted file mode 100644 index 49f09c397daf..000000000000 --- a/techpack/audio/include/dsp/voice_mhi.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __VOICE_MHI_H__ -#define __VOICE_MHI_H__ - -#ifdef CONFIG_VOICE_MHI -int voice_mhi_start(void); -int voice_mhi_end(void); -#else -static inline int voice_mhi_start(void) -{ - return 0; -} - -static inline int voice_mhi_end(void) -{ - return 0; -} -#endif - -#endif diff --git a/techpack/audio/include/elliptic/elliptic_data_io.h b/techpack/audio/include/elliptic/elliptic_data_io.h deleted file mode 100644 index db087b1cae21..000000000000 --- a/techpack/audio/include/elliptic/elliptic_data_io.h +++ /dev/null @@ -1,156 +0,0 @@ -/** -* Copyright Elliptic Labs 2015-2016 -* Copyright (C) 2019 XiaoMi, Inc. -* -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#define ELLIPTIC_DATA_IO_AP_TO_DSP 0 -#define ELLIPTIC_DATA_IO_DSP_TO_AP 1 - -#define ELLIPTIC_DATA_IO_READ_OK 0 -#define ELLIPTIC_DATA_IO_READ_BUSY 1 -#define ELLIPTIC_DATA_IO_READ_CANCEL 2 - -#define ELLIPTIC_MSG_BUF_SIZE 512 - -/* wake source timeout in ms*/ -#define ELLIPTIC_WAKEUP_TIMEOUT 250 - -#define ELLIPTIC_DATA_FIFO_SIZE (PAGE_SIZE) - -#define ULTRASOUND_RX_PORT_ID 0 -#define ULTRASOUND_TX_PORT_ID 1 - -/* Elliptic Labs UltraSound Module */ -#define ELLIPTIC_ULTRASOUND_DISABLE 0 -#define ELLIPTIC_ULTRASOUND_ENABLE 1 -#define ELLIPTIC_ULTRASOUND_SET_PARAMS 2 -#define ELLIPTIC_ULTRASOUND_GET_PARAMS 3 -#define ELLIPTIC_ULTRASOUND_RAMP_DOWN 4 - -/** Param ID definition */ -#define ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_DATA 3 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_DATA 11 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_VERSION 12 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_BUILD_BRANCH 14 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA 15 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_SENSORHUB 16 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA 17 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_TAG 18 -#define ELLIPTIC_ULTRASOUND_PARAM_ID_ML_DATA 19 - -#define ELLIPTIC_DATA_READ_BUSY 0 -#define ELLIPTIC_DATA_READ_OK 1 -#define ELLIPTIC_DATA_READ_CANCEL 2 - -#define ELLIPTIC_ALL_DEVICES -1 -#define ELLIPTIC_DEVICE_0 0 -#define ELLIPTIC_DEVICE_1 1 - -enum elliptic_message_id { - ELLIPTIC_MESSAGE_PAYLOAD, /* Input to AP*/ - ELLIPTIC_MESSAGE_RAW, /* Output from AP*/ - ELLIPTIC_MESSAGE_CALIBRATION, - ELLIPTIC_MESSAGE_CALIBRATION_V2, - ELLIPTIC_MESSAGE_DIAGNOSTICS, - ELLIPTIC_MAX_MESSAGE_IDS -}; - -typedef enum { - ELLIPTIC_DATA_PUSH_FROM_KERNEL, - ELLIPTIC_DATA_PUSH_FROM_USERSPACE -} elliptic_data_push_t; - -struct elliptic_data { - /* wake lock timeout */ - unsigned int wakeup_timeout; - - /* members for top half interrupt handling */ - struct kfifo fifo_isr; - spinlock_t fifo_isr_spinlock; - wait_queue_head_t fifo_isr_not_empty; - struct mutex user_buffer_lock; - - /* buffer to swap data from isr fifo to userspace */ - uint8_t isr_swap_buffer[ELLIPTIC_MSG_BUF_SIZE]; - - atomic_t abort_io; - - /* debug counters, reset between open/close */ - uint32_t isr_fifo_discard; - - /* debug counters, persistent */ - uint32_t isr_fifo_discard_total; - uint32_t userspace_read_total; - uint32_t isr_write_total; - -}; - -/* Elliptic IO module API (implemented by IO module)*/ - -int elliptic_data_io_initialize(void); -int elliptic_data_io_cleanup(void); - -int32_t elliptic_data_io_write(uint32_t message_id, const char *data, - size_t data_size); - -int32_t elliptic_data_io_transact(uint32_t message_id, const char *data, - size_t data_size, char *output_data, size_t output_data_size); - - -/* Elliptic driver API (implemented by main driver)*/ -int elliptic_data_initialize(struct elliptic_data *, - size_t max_queue_size, unsigned int wakeup_timeout, int id); - -int elliptic_data_cleanup(struct elliptic_data *); - -void elliptic_data_reset_debug_counters(struct elliptic_data *); -void elliptic_data_update_debug_counters(struct elliptic_data *); -void elliptic_data_print_debug_counters(struct elliptic_data *); - -/* Called from elliptic device read */ -size_t elliptic_data_pop(struct elliptic_data *, - char __user *buffer, size_t buffer_size); - -/* Used for cancelling a blocking read */ -void elliptic_data_cancel(struct elliptic_data *); - -/* Called from IO module*/ -int elliptic_data_push(int deviceid, const char *buffer, size_t buffer_size, elliptic_data_push_t); - -/* Writes to io module and user space control */ -int32_t elliptic_data_write(uint32_t message_id, - const char *data, size_t data_size); - -/* Opens port */ -int elliptic_open_port(int portid); - -/* Closes port */ -int elliptic_close_port(int portid); - -/* Opens port */ -int elliptic_io_open_port(int portid); - -/* Closes port */ -int elliptic_io_close_port(int portid); - -/* Create device node for userspace io driver*/ -int elliptic_userspace_io_driver_init(void); -void elliptic_userspace_io_driver_exit(void); - -/* Create device node for userspace io driver*/ -int elliptic_userspace_ctrl_driver_init(void); -void elliptic_userspace_ctrl_driver_exit(void); -int32_t elliptic_userspace_ctrl_write(uint32_t message_id, - const char *data, size_t data_size); - diff --git a/techpack/audio/include/elliptic/elliptic_device.h b/techpack/audio/include/elliptic/elliptic_device.h deleted file mode 100644 index cd113c5cad69..000000000000 --- a/techpack/audio/include/elliptic/elliptic_device.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright Elliptic Labs - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#pragma once - -#include -#include -#include -#include - -#define ELLIPTIC_DEVICENAME "elliptic" -#define ELLIPTIC_NUM_DEVICES 2 - -#define IOCTL_ELLIPTIC_APP 197 -#define MIRROR_TAG 0x3D0A4842 - -#define IOCTL_ELLIPTIC_DATA_IO_CANCEL \ - _IO(IOCTL_ELLIPTIC_APP, 2) - -#define IOCTL_ELLIPTIC_ACTIVATE_ENGINE \ - _IOW(IOCTL_ELLIPTIC_APP, 3, int) - -#define IOCTL_ELLIPTIC_SET_RAMP_DOWN \ - _IO(IOCTL_ELLIPTIC_APP, 4) - -#define IOCTL_ELLIPTIC_SYSTEM_CONFIGURATION \ - _IOW(IOCTL_ELLIPTIC_APP, 5, int) - -#define IOCTL_ELLIPTIC_DATA_IO_MIRROR \ - _IOW(IOCTL_ELLIPTIC_APP, 117, unsigned char *) - -struct elliptic_device { - int opened; - struct cdev cdev; - struct semaphore sem; - struct elliptic_data el_data; -}; - -extern struct class *elliptic_class; - -#define EL_PRINT_E(string, arg...) \ - pr_err("[ELUS] : (%s) : " string "\n", __func__, ##arg) - -#define EL_PRINT_W(string, arg...) \ - pr_warn("[ELUS] : (%s) : " string "\n", __func__, ##arg) - -#define EL_PRINT_I(string, arg...) \ - pr_info("[ELUS] : (%s) : " string "\n", __func__, ##arg) - -#define EL_PRINT_D(string, arg...) \ - pr_debug("[ELUS] : (%s) : " string "\n", __func__, ##arg) - diff --git a/techpack/audio/include/elliptic/elliptic_mixer_controls.h b/techpack/audio/include/elliptic/elliptic_mixer_controls.h deleted file mode 100755 index 190f34703a19..000000000000 --- a/techpack/audio/include/elliptic/elliptic_mixer_controls.h +++ /dev/null @@ -1,188 +0,0 @@ -#pragma once -#include -#include -#include -#include - - -#define ELLIPTIC_OBJ_ID_CALIBRATION_DATA 1 -#define ELLIPTIC_OBJ_ID_VERSION_INFO 2 -#define ELLIPTIC_OBJ_ID_BRANCH_INFO 3 -#define ELLIPTIC_OBJ_ID_CALIBRATION_V2_DATA 4 -#define ELLIPTIC_OBJ_ID_DIAGNOSTICS_DATA 5 -#define ELLIPTIC_OBJ_ID_TAG_INFO 6 -#define ELLIPTIC_OBJ_ID_ML_DATA 7 - -#define ELLIPTIC_SYSTEM_CONFIGURATION_SIZE 96 -#define ELLIPTIC_CALIBRATION_DATA_SIZE 64 -#define ELLIPTIC_CALIBRATION_V2_DATA_SIZE 448 -#define ELLIPTIC_DIAGNOSTICS_DATA_SIZE 448 -#define ELLIPTIC_DIAGNOSTICS_U32_DATA_VALUES (ELLIPTIC_DIAGNOSTICS_DATA_SIZE>>2) -#define ELLIPTIC_SENSOR_DATA_SIZE 68 -#define ELLIPTIC_SENSOR_U32_DATA_VALUES (ELLIPTIC_SENSOR_DATA_SIZE>>2) -#define ELLIPTIC_VERSION_INFO_SIZE 16 -#define ELLIPTIC_BRANCH_INFO_SIZE 32 -#define ELLIPTIC_BRANCH_INFO_MAX_SIZE 128 -#define ELLIPTIC_TAG_INFO_SIZE 32 -#define ELLIPTIC_ML_DATA_SIZE 432 - -#define ELLIPTIC_ULTRASOUND_DISABLE 0 -#define ELLIPTIC_ULTRASOUND_ENABLE 1 -#define ELLIPTIC_ULTRASOUND_SET_PARAMS 2 -#define ELLIPTIC_ULTRASOUND_GET_PARAMS 3 -#define ELLIPTIC_ULTRASOUND_RAMP_DOWN 4 - -/** register */ -#define ELLIPTIC_CALIBRATION 1 -/** bits */ -#define ELLIPTIC_CALIBRATION_STATE 0 -#define ELLIPTIC_CALIBRATION_PROFILE 1 -#define ELLIPTIC_ULTRASOUND_GAIN 2 - -/** custom settings */ -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT 16 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE 0x7FFFFFFF - - -/** register */ -#define ELLIPTIC_SYSTEM_CONFIGURATION 0 -/** bits */ -#define ELLIPTIC_SYSTEM_CONFIGURATION_LATENCY 0 -#define ELLIPTIC_SYSTEM_CONFIGURATION_SENSITIVITY 1 -#define ELLIPTIC_SYSTEM_CONFIGURATION_SPEAKER_SCALING 2 -#define ELLIPTIC_SYSTEM_CONFIGURATION_MICROPHONE_INDEX 3 -#define ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE 4 -#define ELLIPTIC_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS 5 -#define ELLIPTIC_SYSTEM_CONFIGURATION_LOG_LEVEL 6 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 7 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1 8 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2 9 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3 10 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4 11 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5 12 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6 13 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7 14 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8 15 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9 16 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10 17 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11 18 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12 19 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13 20 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14 21 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15 22 - -#define ELLIPTIC_SYSTEM_CONFIGURATION_SUSPEND 23 -#define ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_ENABLED 24 -#define ELLIPTIC_SYSTEM_CONFIGURATION_OUTPUT_ENABLED 25 -#define ELLIPTIC_SYSTEM_CONFIGURATION_EXTERNAL_EVENT 26 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CALIBRATION_METHOD 27 -#define ELLIPTIC_SYSTEM_CONFIGURATION_DEBUG_MODE 28 -#define ELLIPTIC_SYSTEM_CONFIGURATION_NUMBER_OF_RUNS 29 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CONTEXT 30 -#define ELLIPTIC_SYSTEM_CONFIGURATION_CAPTURE 31 -#define ELLIPTIC_SYSTEM_CONFIGURATION_INPUT_CHANNELS 32 - -#define ELLIPTIC_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE 0x7FFFFFFF - - -struct elliptic_engine_version_info { - uint32_t major; - uint32_t minor; - uint32_t build; - uint32_t revision; -}; - -struct elliptic_shared_data_block { - uint32_t object_id; - size_t size; - void *buffer; -}; - -struct elliptic_shared_data_block *elliptic_get_shared_obj(uint32_t - object_id); - -extern unsigned int elliptic_add_platform_controls(void *platform); - -void elliptic_set_calibration_data(uint8_t *calib_data, size_t size); - -enum elliptic_system_configuration_parameter_type { - - ESCPT_SPEAKER_SCALING = 1, - ESCPT_CHANNEL_SENSITIVITY, - ESCPT_LATENCY, - ESCPT_MICROPHONE_INDEX, - ESCPT_OPERATION_MODE, - ESCPT_OPERATION_MODE_FLAGS, - ESCPT_COMPONENT_GAIN_CHANGE, - ESCPT_CALIBRATION_STATE, - ESCPT_ENGINE_VERSION, - ESCPT_CALIBRATION_PROFILE, - ESCPT_ULTRASOUND_GAIN, - ESCPT_LOG_LEVEL, - ESCPT_BUILD_BRANCH, //13 - - ESCPT_FSELECTION, - ESCPT_ENGINE_DIAGNOSTICS, - ESCPT_ENGINE_CUSTOM_SETTING_0, - ESCPT_ENGINE_CUSTOM_SETTING_1, - ESCPT_ENGINE_CUSTOM_SETTING_2, - ESCPT_ENGINE_CUSTOM_SETTING_3, - ESCPT_ENGINE_CUSTOM_SETTING_4, - ESCPT_ENGINE_CUSTOM_SETTING_5, - ESCPT_ENGINE_CUSTOM_SETTING_6, - ESCPT_ENGINE_CUSTOM_SETTING_7, - ESCPT_ENGINE_CUSTOM_SETTING_8, - ESCPT_ENGINE_CUSTOM_SETTING_9, - ESCPT_ENGINE_CUSTOM_SETTING_10, - ESCPT_ENGINE_CUSTOM_SETTING_11, - ESCPT_ENGINE_CUSTOM_SETTING_12, - ESCPT_ENGINE_CUSTOM_SETTING_13, - ESCPT_ENGINE_CUSTOM_SETTING_14, - ESCPT_ENGINE_CUSTOM_SETTING_15, - ESCPT_SUSPEND, // 32 - ESCPT_INPUT_ENABLED, - ESCPT_OUTPUT_ENABLED, - ESCPT_EXTERNAL_EVENT, - ESCPT_ENGINE_TAG, //36 - ESCPT_CALIBRATION_METHOD, - ESCPT_DEBUG_MODE, - ESCPT_NUMBER_OF_RUNS, - ESCPT_CONTEXT, - ESCPT_CAPTURE, - ESCPT_INPUT_CHANNELS, -}; - -struct elliptic_system_configuration_parameters_cache { - int32_t speaker_scaling[2]; - int32_t sensitivity; - int32_t latency; - int32_t microphone_index; - int32_t operation_mode; - int32_t operation_mode_flags; - int32_t component_gain_change; - int32_t calibration_state; - int32_t engine_version; - int32_t calibration_profile; - int32_t ultrasound_gain; - int32_t log_level; - int32_t custom_settings[ELLIPTIC_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT]; - int32_t engine_suspend; - int32_t input_enabled; - int32_t output_enabled; - int32_t external_event; - int32_t calibration_method; - int32_t debug_mode; - int32_t number_of_runs; - int32_t context; - int32_t capture; - int32_t input_channels; -}; - - -int elliptic_trigger_version_msg(void); - -int elliptic_trigger_branch_msg(void); - -int elliptic_trigger_tag_msg(void); - -int elliptic_trigger_diagnostics_msg(void); diff --git a/techpack/audio/include/elliptic/elliptic_sysfs.h b/techpack/audio/include/elliptic/elliptic_sysfs.h deleted file mode 100755 index 23f9d19d8ebd..000000000000 --- a/techpack/audio/include/elliptic/elliptic_sysfs.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#define ELLIPTIC_SYSFS_ENGINE_FOLDER "engine" -#define ELLIPTIC_SYSFS_ROOT_FOLDER "elliptic" -#define ELLIPTIC_SYSFS_CALIBRATION_FILENAME "calibration" -#define ELLIPTIC_SYSFS_VERSION_FILENAME "version" -#define ELLIPTIC_SYSFS_CALIBRATION_V2_FILENAME "calibration_v2" -#define ELLIPTIC_SYSFS_STATE_FILENAME "state" -#define ELLIPTIC_SYSFS_TAG_FILENAME "tag" -#define ELLIPTIC_SYSFS_OPMODE_FILENAME "opmode" -#define ELLIPTIC_SYSFS_OPMODE_FLAGS_FILENAME "opmode_flags" - - -int elliptic_initialize_sysfs(void); -void elliptic_cleanup_sysfs(void); diff --git a/techpack/audio/include/ipc/apr.h b/techpack/audio/include/ipc/apr.h deleted file mode 100644 index 6b4817edeeb5..000000000000 --- a/techpack/audio/include/ipc/apr.h +++ /dev/null @@ -1,193 +0,0 @@ -/* Copyright (c) 2010-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __APR_H_ -#define __APR_H_ - -#include -#include - -enum apr_subsys_state { - APR_SUBSYS_DOWN, - APR_SUBSYS_UP, - APR_SUBSYS_LOADED, -}; - -struct apr_q6 { - void *pil; - atomic_t q6_state; - atomic_t modem_state; - struct mutex lock; -}; - -struct apr_hdr { - uint16_t hdr_field; - uint16_t pkt_size; - uint8_t src_svc; - uint8_t src_domain; - uint16_t src_port; - uint8_t dest_svc; - uint8_t dest_domain; - uint16_t dest_port; - uint32_t token; - uint32_t opcode; -}; - -#define APR_HDR_LEN(hdr_len) ((hdr_len)/4) -#define APR_PKT_SIZE(hdr_len, payload_len) ((hdr_len) + (payload_len)) -#define APR_HDR_FIELD(msg_type, hdr_len, ver)\ - (((msg_type & 0x3) << 8) | ((hdr_len & 0xF) << 4) | (ver & 0xF)) - -#define APR_HDR_SIZE sizeof(struct apr_hdr) - -/* Version */ -#define APR_PKT_VER 0x0 - -/* Command and Response Types */ -#define APR_MSG_TYPE_EVENT 0x0 -#define APR_MSG_TYPE_CMD_RSP 0x1 -#define APR_MSG_TYPE_SEQ_CMD 0x2 -#define APR_MSG_TYPE_NSEQ_CMD 0x3 -#define APR_MSG_TYPE_MAX 0x04 - -/* APR Basic Response Message */ -#define APR_BASIC_RSP_RESULT 0x000110E8 -#define APR_RSP_ACCEPTED 0x000100BE - -/* Domain IDs */ -#define APR_DOMAIN_SIM 0x1 -#define APR_DOMAIN_PC 0x2 -#define APR_DOMAIN_MODEM 0x3 -#define APR_DOMAIN_ADSP 0x4 -#define APR_DOMAIN_APPS 0x5 -#define APR_DOMAIN_MAX 0x6 - -/* ADSP service IDs */ -#define APR_SVC_TEST_CLIENT 0x2 -#define APR_SVC_ADSP_CORE 0x3 -#define APR_SVC_AFE 0x4 -#define APR_SVC_VSM 0x5 -#define APR_SVC_VPM 0x6 -#define APR_SVC_ASM 0x7 -#define APR_SVC_ADM 0x8 -#define APR_SVC_ADSP_MVM 0x09 -#define APR_SVC_ADSP_CVS 0x0A -#define APR_SVC_ADSP_CVP 0x0B -#define APR_SVC_USM 0x0C -#define APR_SVC_LSM 0x0D -#define APR_SVC_VIDC 0x16 -#define APR_SVC_MAX 0x17 - -/* Modem Service IDs */ -#define APR_SVC_MVS 0x3 -#define APR_SVC_MVM 0x4 -#define APR_SVC_CVS 0x5 -#define APR_SVC_CVP 0x6 -#define APR_SVC_SRD 0x7 - -/* APR Port IDs */ -#define APR_MAX_PORTS 0x80 - -#define APR_NAME_MAX 0x40 - -#define RESET_EVENTS 0x000130D7 - -#define LPASS_RESTART_EVENT 0x1000 -#define LPASS_RESTART_READY 0x1001 - -struct apr_client_data { - uint16_t reset_event; - uint16_t reset_proc; - uint16_t payload_size; - uint16_t hdr_len; - uint16_t msg_type; - uint16_t src; - uint16_t dest_svc; - uint16_t src_port; - uint16_t dest_port; - uint32_t token; - uint32_t opcode; - void *payload; -}; - -typedef int32_t (*apr_fn)(struct apr_client_data *data, void *priv); - -struct apr_svc { - uint16_t id; - uint16_t dest_id; - uint16_t client_id; - uint16_t dest_domain; - uint8_t rvd; - uint8_t port_cnt; - uint8_t svc_cnt; - uint8_t need_reset; - apr_fn port_fn[APR_MAX_PORTS]; - void *port_priv[APR_MAX_PORTS]; - apr_fn fn; - void *priv; - struct mutex m_lock; - spinlock_t w_lock; - uint8_t pkt_owner; -}; - -struct apr_client { - uint8_t id; - uint8_t svc_cnt; - uint8_t rvd; - struct mutex m_lock; - struct apr_svc_ch_dev *handle; - struct apr_svc svc[APR_SVC_MAX]; -}; - -struct apr_rx_intents { - int num_of_intents; - uint32_t size; -}; - -struct apr_pkt_cfg { - uint8_t pkt_owner; - struct apr_rx_intents intents; -}; - -int apr_load_adsp_image(void); -struct apr_client *apr_get_client(int dest_id, int client_id); -int apr_wait_for_device_up(int dest_id); -int apr_get_svc(const char *svc_name, int dest_id, int *client_id, - int *svc_idx, int *svc_id); -void apr_cb_func(void *buf, int len, void *priv); -struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn, - uint32_t src_port, void *priv); -inline int apr_fill_hdr(void *handle, uint32_t *buf, uint16_t src_port, - uint16_t msg_type, uint16_t dest_port, - uint32_t token, uint32_t opcode, uint16_t len); - -int apr_send_pkt(void *handle, uint32_t *buf); -int apr_deregister(void *handle); -void subsys_notif_register(char *client_name, int domain, - struct notifier_block *nb); -void subsys_notif_deregister(char *client_name); -int apr_get_dest_id(char *dest); -uint16_t apr_get_data_src(struct apr_hdr *hdr); -void change_q6_state(int state); -void q6audio_dsp_not_responding(void); -void apr_reset(void *handle); -enum apr_subsys_state apr_get_subsys_state(void); -enum apr_subsys_state apr_get_modem_state(void); -void apr_set_modem_state(enum apr_subsys_state state); -enum apr_subsys_state apr_get_q6_state(void); -int apr_set_q6_state(enum apr_subsys_state state); -void apr_set_subsys_state(void); -const char *apr_get_lpass_subsys_name(void); -uint16_t apr_get_reset_domain(uint16_t proc); -int apr_start_rx_rt(void *handle); -int apr_end_rx_rt(void *handle); -#endif diff --git a/techpack/audio/include/ipc/apr_tal.h b/techpack/audio/include/ipc/apr_tal.h deleted file mode 100644 index 534fd84d2ba8..000000000000 --- a/techpack/audio/include/ipc/apr_tal.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (c) 2010-2011, 2016-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __APR_TAL_H_ -#define __APR_TAL_H_ - -#include -#include -#include - -/* APR Client IDs */ -#define APR_CLIENT_AUDIO 0x0 -#define APR_CLIENT_VOICE 0x1 -#define APR_CLIENT_MAX 0x2 - -#define APR_DL_SMD 0 -#define APR_DL_MAX 1 - -#define APR_DEST_MODEM 0 -#define APR_DEST_QDSP6 1 -#define APR_DEST_MAX 2 - -#if defined(CONFIG_MSM_QDSP6_APRV2_GLINK) || \ - defined(CONFIG_MSM_QDSP6_APRV3_GLINK) -#define APR_MAX_BUF 512 -#else -#define APR_MAX_BUF 8092 -#endif - -#define APR_DEFAULT_NUM_OF_INTENTS 20 - -#define APR_OPEN_TIMEOUT_MS 5000 - -enum { - /* If client sets the pkt_owner to APR_PKT_OWNER_DRIVER, APR - * driver will allocate a buffer, where the user packet is - * copied into, for each and every single Tx transmission. - * The buffer is thereafter passed to underlying link layer - * and freed upon the notification received from the link layer - * that the packet has been consumed. - */ - APR_PKT_OWNER_DRIVER, - /* If client sets the pkt_owner to APR_PKT_OWNER_CLIENT, APR - * will pass the user packet memory address directly to underlying - * link layer. In this case it is the client's responsibility to - * make sure the packet is intact until being notified that the - * packet has been consumed. - */ - APR_PKT_OWNER_CLIENT, -}; - -struct apr_pkt_priv { - /* This property is only applicable for APR over Glink. - * It is ignored in APR over SMD cases. - */ - uint8_t pkt_owner; -}; - -typedef void (*apr_svc_cb_fn)(void *buf, int len, void *priv); -struct apr_svc_ch_dev *apr_tal_open(uint32_t svc, uint32_t dest, - uint32_t dl, apr_svc_cb_fn func, void *priv); -int apr_tal_write(struct apr_svc_ch_dev *apr_ch, void *data, - struct apr_pkt_priv *pkt_priv, int len); -int apr_tal_close(struct apr_svc_ch_dev *apr_ch); -int apr_tal_rx_intents_config(struct apr_svc_ch_dev *apr_ch, - int num_of_intents, uint32_t size); -int apr_tal_init(void); -void apr_tal_exit(void); -int apr_tal_start_rx_rt(struct apr_svc_ch_dev *apr_ch); -int apr_tal_end_rx_rt(struct apr_svc_ch_dev *apr_ch); - -struct apr_svc_ch_dev { - void *handle; - spinlock_t w_lock; - spinlock_t r_lock; - struct mutex m_lock; - apr_svc_cb_fn func; - wait_queue_head_t wait; - void *priv; - unsigned int channel_state; - bool if_remote_intent_ready; -}; - -#endif diff --git a/techpack/audio/include/ipc/apr_us.h b/techpack/audio/include/ipc/apr_us.h deleted file mode 100644 index 6e2f63de9756..000000000000 --- a/techpack/audio/include/ipc/apr_us.h +++ /dev/null @@ -1,193 +0,0 @@ -/* Copyright (c) 2011-2014, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __APR_US_H__ -#define __APR_US_H__ - -#include - -/* ======================================================================= */ -/* Session Level commands */ - -#define USM_SESSION_CMD_RUN 0x00012306 -struct usm_stream_cmd_run { - struct apr_hdr hdr; - u32 flags; - u32 msw_ts; - u32 lsw_ts; -} __packed; - -/* Stream level commands */ -#define USM_STREAM_CMD_OPEN_READ 0x00012309 -struct usm_stream_cmd_open_read { - struct apr_hdr hdr; - u32 uMode; - u32 src_endpoint; - u32 pre_proc_top; - u32 format; -} __packed; - -#define USM_STREAM_CMD_OPEN_WRITE 0x00011271 -struct usm_stream_cmd_open_write { - struct apr_hdr hdr; - u32 format; -} __packed; - - -#define USM_STREAM_CMD_CLOSE 0x0001230A - -#define USM_STREAM_CMD_SET_PARAM 0x00012731 -struct usm_stream_cmd_set_param { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 module_id; - u32 param_id; -} __packed; - -#define USM_STREAM_CMD_GET_PARAM 0x00012732 -struct usm_stream_cmd_get_param { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 module_id; - u32 param_id; -} __packed; - -/* Encoder configuration definitions */ -#define USM_STREAM_CMD_SET_ENC_PARAM 0x0001230B -/* Decoder configuration definitions */ -#define USM_DATA_CMD_MEDIA_FORMAT_UPDATE 0x00011272 - -/* Encoder/decoder configuration block */ -#define USM_PARAM_ID_ENCDEC_ENC_CFG_BLK 0x0001230D - -/* Max number of static located ports (bytes) */ -#define USM_MAX_PORT_NUMBER 8 - -/* Max number of static located transparent data (bytes) */ -#define USM_MAX_CFG_DATA_SIZE 100 - -/* Parameter structures used in USM_STREAM_CMD_SET_ENCDEC_PARAM command */ -/* common declarations */ -struct usm_cfg_common { - u16 ch_cfg; - u16 bits_per_sample; - u32 sample_rate; - u32 dev_id; - u8 data_map[USM_MAX_PORT_NUMBER]; -} __packed; - -struct us_encdec_cfg { - u32 format_id; - struct usm_cfg_common cfg_common; - u16 params_size; - u8 *params; -} __packed; - -/* Start/stop US signal detection */ -#define USM_SESSION_CMD_SIGNAL_DETECT_MODE 0x00012719 - -struct usm_session_cmd_detect_info { - struct apr_hdr hdr; - u32 detect_mode; - u32 skip_interval; - u32 algorithm_cfg_size; -} __packed; - -/* US signal detection result */ -#define USM_SESSION_EVENT_SIGNAL_DETECT_RESULT 0x00012720 - -/* ======================================================================= */ -/* Session Level commands */ -#define USM_CMD_SHARED_MEM_MAP_REGION 0x00012728 -struct usm_cmd_memory_map_region { - struct apr_hdr hdr; - u16 mempool_id; - u16 num_regions; - u32 flags; - u32 shm_addr_lsw; - u32 shm_addr_msw; - u32 mem_size_bytes; -} __packed; - -#define USM_CMDRSP_SHARED_MEM_MAP_REGION 0x00012729 -struct usm_cmdrsp_memory_map_region { - u32 mem_map_handle; -} __packed; - -#define USM_CMD_SHARED_MEM_UNMAP_REGION 0x0001272A -struct usm_cmd_memory_unmap_region { - struct apr_hdr hdr; - u32 mem_map_handle; -} __packed; - -#define USM_DATA_CMD_READ 0x00012724 -struct usm_stream_cmd_read { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 seq_id; - u32 counter; -} __packed; - -#define USM_DATA_EVENT_READ_DONE 0x00012725 - -#define USM_DATA_CMD_WRITE 0x00012726 -struct usm_stream_cmd_write { - struct apr_hdr hdr; - u32 buf_addr_lsw; - u32 buf_addr_msw; - u32 mem_map_handle; - u32 buf_size; - u32 seq_id; - u32 res0; - u32 res1; - u32 res2; -} __packed; - -#define USM_DATA_EVENT_WRITE_DONE 0x00012727 - -struct usm_stream_media_format_update { - struct apr_hdr hdr; - u32 format_id; - /* = sizeof(usm_cfg_common)+|transp_data| */ - u32 cfg_size; - struct usm_cfg_common cfg_common; - /* Transparent configuration data for specific encoder */ - u8 transp_data[USM_MAX_CFG_DATA_SIZE]; -} __packed; - -struct usm_encode_cfg_blk { - u32 frames_per_buf; - u32 format_id; - /* = sizeof(usm_cfg_common)+|transp_data| */ - u32 cfg_size; - struct usm_cfg_common cfg_common; - /* Transparent configuration data for specific encoder */ - u8 transp_data[USM_MAX_CFG_DATA_SIZE]; -} __packed; - -struct usm_stream_cmd_encdec_cfg_blk { - struct apr_hdr hdr; - u32 param_id; - u32 param_size; - struct usm_encode_cfg_blk enc_blk; -} __packed; - -#endif /* __APR_US_H__ */ diff --git a/techpack/audio/include/mius/mius_data_io.h b/techpack/audio/include/mius/mius_data_io.h deleted file mode 100644 index c8a3ba1087a4..000000000000 --- a/techpack/audio/include/mius/mius_data_io.h +++ /dev/null @@ -1,156 +0,0 @@ -/** -* Copyright MI 2015-2016 -* Copyright (C) 2019 XiaoMi, Inc. -* -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#define MIUS_DATA_IO_AP_TO_DSP 0 -#define MIUS_DATA_IO_DSP_TO_AP 1 - -#define MIUS_DATA_IO_READ_OK 0 -#define MIUS_DATA_IO_READ_BUSY 1 -#define MIUS_DATA_IO_READ_CANCEL 2 - -#define MIUS_MSG_BUF_SIZE 512 - -/* wake source timeout in ms*/ -#define MIUS_WAKEUP_TIMEOUT 250 - -#define MIUS_DATA_FIFO_SIZE (PAGE_SIZE) - -#define ULTRASOUND_RX_PORT_ID 0 -#define ULTRASOUND_TX_PORT_ID 1 - -/* MI UltraSound Module */ -#define MIUS_ULTRASOUND_DISABLE 0 -#define MIUS_ULTRASOUND_ENABLE 1 -#define MIUS_ULTRASOUND_SET_PARAMS 2 -#define MIUS_ULTRASOUND_GET_PARAMS 3 -#define MIUS_ULTRASOUND_RAMP_DOWN 4 - -/** Param ID definition */ -#define MIUS_ULTRASOUND_PARAM_ID_ENGINE_DATA 3 -#define MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_DATA 11 -#define MIUS_ULTRASOUND_PARAM_ID_ENGINE_VERSION 12 -#define MIUS_ULTRASOUND_PARAM_ID_BUILD_BRANCH 14 -#define MIUS_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA 15 -#define MIUS_ULTRASOUND_PARAM_ID_SENSORHUB 16 -#define MIUS_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA 17 -#define MIUS_ULTRASOUND_PARAM_ID_TAG 18 -#define MIUS_ULTRASOUND_PARAM_ID_ML_DATA 19 - -#define MIUS_DATA_READ_BUSY 0 -#define MIUS_DATA_READ_OK 1 -#define MIUS_DATA_READ_CANCEL 2 - -#define MIUS_ALL_DEVICES -1 -#define MIUS_DEVICE_0 0 -#define MIUS_DEVICE_1 1 - -enum mius_message_id { - MIUS_MESSAGE_PAYLOAD, /* Input to AP*/ - MIUS_MESSAGE_RAW, /* Output from AP*/ - MIUS_MESSAGE_CALIBRATION, - MIUS_MESSAGE_CALIBRATION_V2, - MIUS_MESSAGE_DIAGNOSTICS, - MIUS_MAX_MESSAGE_IDS -}; - -typedef enum { - MIUS_DATA_PUSH_FROM_KERNEL, - MIUS_DATA_PUSH_FROM_USERSPACE -} mius_data_push_t; - -struct mius_data { - /* wake lock timeout */ - unsigned int wakeup_timeout; - - /* members for top half interrupt handling */ - struct kfifo fifo_isr; - spinlock_t fifo_isr_spinlock; - wait_queue_head_t fifo_isr_not_empty; - struct mutex user_buffer_lock; - - /* buffer to swap data from isr fifo to userspace */ - uint8_t isr_swap_buffer[MIUS_MSG_BUF_SIZE]; - - atomic_t abort_io; - - /* debug counters, reset between open/close */ - uint32_t isr_fifo_discard; - - /* debug counters, persistent */ - uint32_t isr_fifo_discard_total; - uint32_t userspace_read_total; - uint32_t isr_write_total; - -}; - -/* Elliptic IO module API (implemented by IO module)*/ - -int mius_data_io_initialize(void); -int mius_data_io_cleanup(void); - -int32_t mius_data_io_write(uint32_t message_id, const char *data, - size_t data_size); - -int32_t mius_data_io_transact(uint32_t message_id, const char *data, - size_t data_size, char *output_data, size_t output_data_size); - - -/* Elliptic driver API (implemented by main driver)*/ -int mius_data_initialize(struct mius_data *, - size_t max_queue_size, unsigned int wakeup_timeout, int id); - -int mius_data_cleanup(struct mius_data *); - -void mius_data_reset_debug_counters(struct mius_data *); -void mius_data_update_debug_counters(struct mius_data *); -void mius_data_print_debug_counters(struct mius_data *); - -/* Called from mius device read */ -size_t mius_data_pop(struct mius_data *, - char __user *buffer, size_t buffer_size); - -/* Used for cancelling a blocking read */ -void mius_data_cancel(struct mius_data *); - -/* Called from IO module*/ -int mius_data_push(int deviceid, const char *buffer, size_t buffer_size, mius_data_push_t); - -/* Writes to io module and user space control */ -int32_t mius_data_write(uint32_t message_id, - const char *data, size_t data_size); - -/* Opens port */ -int mius_open_port(int portid); - -/* Closes port */ -int mius_close_port(int portid); - -/* Opens port */ -int mius_io_open_port(int portid); - -/* Closes port */ -int mius_io_close_port(int portid); - -/* Create device node for userspace io driver*/ -int mius_userspace_io_driver_init(void); -void mius_userspace_io_driver_exit(void); - -/* Create device node for userspace io driver*/ -int mius_userspace_ctrl_driver_init(void); -void mius_userspace_ctrl_driver_exit(void); -int32_t mius_userspace_ctrl_write(uint32_t message_id, - const char *data, size_t data_size); - diff --git a/techpack/audio/include/mius/mius_device.h b/techpack/audio/include/mius/mius_device.h deleted file mode 100644 index d5fa058b93b0..000000000000 --- a/techpack/audio/include/mius/mius_device.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright MI - * Copyright (C) 2019 XiaoMi, Inc. - * - */ - -#pragma once - -#include -#include -#include -#include - -#define MIUS_DEVICENAME "mius" -#define MIUS_NUM_DEVICES 2 - -#define IOCTL_MIUS_APP 197 -#define MIRROR_TAG 0x3D0A4842 - -#define IOCTL_MIUS_DATA_IO_CANCEL \ - _IO(IOCTL_MIUS_APP, 2) - -#define IOCTL_MIUS_ACTIVATE_ENGINE \ - _IOW(IOCTL_MIUS_APP, 3, int) - -#define IOCTL_MIUS_SET_RAMP_DOWN \ - _IO(IOCTL_MIUS_APP, 4) - -#define IOCTL_MIUS_SYSTEM_CONFIGURATION \ - _IOW(IOCTL_MIUS_APP, 5, int) - -#define IOCTL_MIUS_DATA_IO_MIRROR \ - _IOW(IOCTL_MIUS_APP, 117, unsigned char *) - -struct mius_device { - int opened; - struct cdev cdev; - struct semaphore sem; - struct mius_data el_data; -}; - -extern struct class *mius_class; - -#define MI_PRINT_E(string, arg...) \ - pr_err("[MIUS] : (%s) : " string "\n", __func__, ##arg) - -#define MI_PRINT_W(string, arg...) \ - pr_warn("[MIUS] : (%s) : " string "\n", __func__, ##arg) - -#define MI_PRINT_I(string, arg...) \ - pr_info("[MIUS] : (%s) : " string "\n", __func__, ##arg) - -#define MI_PRINT_D(string, arg...) \ - pr_debug("[MIUS] : (%s) : " string "\n", __func__, ##arg) - diff --git a/techpack/audio/include/mius/mius_mixer_controls.h b/techpack/audio/include/mius/mius_mixer_controls.h deleted file mode 100644 index 5be6060d340b..000000000000 --- a/techpack/audio/include/mius/mius_mixer_controls.h +++ /dev/null @@ -1,187 +0,0 @@ -#pragma once -#include -#include -#include -#include - - -#define MIUS_OBJ_ID_CALIBRATION_DATA 1 -#define MIUS_OBJ_ID_VERSION_INFO 2 -#define MIUS_OBJ_ID_BRANCH_INFO 3 -#define MIUS_OBJ_ID_CALIBRATION_V2_DATA 4 -#define MIUS_OBJ_ID_DIAGNOSTICS_DATA 5 -#define MIUS_OBJ_ID_TAG_INFO 6 -#define MIUS_OBJ_ID_ML_DATA 7 - -#define MIUS_SYSTEM_CONFIGURATION_SIZE 96 -#define MIUS_CALIBRATION_DATA_SIZE 64 -#define MIUS_CALIBRATION_V2_DATA_SIZE 448 -#define MIUS_DIAGNOSTICS_DATA_SIZE 448 -#define MIUS_DIAGNOSTICS_U32_DATA_VALUES (MIUS_DIAGNOSTICS_DATA_SIZE>>2) -#define MIUS_SENSOR_DATA_SIZE 68 -#define MIUS_SENSOR_U32_DATA_VALUES (MIUS_SENSOR_DATA_SIZE>>2) -#define MIUS_VERSION_INFO_SIZE 16 -#define MIUS_BRANCH_INFO_SIZE 32 -#define MIUS_BRANCH_INFO_MAX_SIZE 128 -#define MIUS_TAG_INFO_SIZE 32 -#define MIUS_ML_DATA_SIZE 432 - -#define MIUS_ULTRASOUND_DISABLE 0 -#define MIUS_ULTRASOUND_ENABLE 1 -#define MIUS_ULTRASOUND_SET_PARAMS 2 -#define MIUS_ULTRASOUND_GET_PARAMS 3 -#define MIUS_ULTRASOUND_RAMP_DOWN 4 - -/** register */ -#define MIUS_CALIBRATION 1 -/** bits */ -#define MIUS_CALIBRATION_STATE 0 -#define MIUS_CALIBRATION_PROFILE 1 -#define MIUS_ULTRASOUND_GAIN 2 - -/** custom settings */ -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT 16 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_MAX_VALUE 0x7FFFFFFF - -/** register */ -#define MIUS_SYSTEM_CONFIGURATION 0 -/** bits */ -#define MIUS_SYSTEM_CONFIGURATION_LATENCY 0 -#define MIUS_SYSTEM_CONFIGURATION_SENSITIVITY 1 -#define MIUS_SYSTEM_CONFIGURATION_SPEAKER_SCALING 2 -#define MIUS_SYSTEM_CONFIGURATION_MICROPHONE_INDEX 3 -#define MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE 4 -#define MIUS_SYSTEM_CONFIGURATION_OPERATION_MODE_FLAGS 5 -#define MIUS_SYSTEM_CONFIGURATION_LOG_LEVEL 6 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_0 7 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_1 8 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_2 9 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_3 10 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_4 11 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_5 12 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_6 13 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_7 14 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_8 15 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_9 16 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_10 17 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_11 18 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_12 19 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_13 20 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_14 21 -#define MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_15 22 - -#define MIUS_SYSTEM_CONFIGURATION_SUSPEND 23 -#define MIUS_SYSTEM_CONFIGURATION_INPUT_ENABLED 24 -#define MIUS_SYSTEM_CONFIGURATION_OUTPUT_ENABLED 25 -#define MIUS_SYSTEM_CONFIGURATION_EXTERNAL_EVENT 26 -#define MIUS_SYSTEM_CONFIGURATION_CALIBRATION_METHOD 27 -#define MIUS_SYSTEM_CONFIGURATION_DEBUG_MODE 28 -#define MIUS_SYSTEM_CONFIGURATION_NUMBER_OF_RUNS 29 -#define MIUS_SYSTEM_CONFIGURATION_CONTEXT 30 -#define MIUS_SYSTEM_CONFIGURATION_CAPTURE 31 -#define MIUS_SYSTEM_CONFIGURATION_INPUT_CHANNELS 32 - -#define MIUS_SYSTEM_CONFIGURATION_MAX_CONTEXT_VALUE 0x7FFFFFFF - - -struct mius_engine_version_info { - uint32_t major; - uint32_t minor; - uint32_t build; - uint32_t revision; -}; - -struct mius_shared_data_block { - uint32_t object_id; - size_t size; - void *buffer; -}; - -struct mius_shared_data_block *mius_get_shared_obj(uint32_t - object_id); - -extern unsigned int mius_add_platform_controls(void *platform); - -void mius_set_calibration_data(uint8_t *calib_data, size_t size); - -enum mius_system_configuration_parameter_type { - - MSC_SPEAKER_SCALING = 1, - MSC_CHANNEL_SENSITIVITY, - MSC_LATENCY, - MSC_MICROPHONE_INDEX, - MSC_OPERATION_MODE, - MSC_OPERATION_MODE_FLAGS, - MSC_COMPONENT_GAIN_CHANGE, - MSC_CALIBRATION_STATE, - MSC_ENGINE_VERSION, - MSC_CALIBRATION_PROFILE, - MSC_ULTRASOUND_GAIN, - MSC_LOG_LEVEL, - MSC_BUILD_BRANCH, //13 - - MSC_FSELECTION, - MSC_ENGINE_DIAGNOSTICS, - MSC_ENGINE_CUSTOM_SETTING_0, - MSC_ENGINE_CUSTOM_SETTING_1, - MSC_ENGINE_CUSTOM_SETTING_2, - MSC_ENGINE_CUSTOM_SETTING_3, - MSC_ENGINE_CUSTOM_SETTING_4, - MSC_ENGINE_CUSTOM_SETTING_5, - MSC_ENGINE_CUSTOM_SETTING_6, - MSC_ENGINE_CUSTOM_SETTING_7, - MSC_ENGINE_CUSTOM_SETTING_8, - MSC_ENGINE_CUSTOM_SETTING_9, - MSC_ENGINE_CUSTOM_SETTING_10, - MSC_ENGINE_CUSTOM_SETTING_11, - MSC_ENGINE_CUSTOM_SETTING_12, - MSC_ENGINE_CUSTOM_SETTING_13, - MSC_ENGINE_CUSTOM_SETTING_14, - MSC_ENGINE_CUSTOM_SETTING_15, - MSC_SUSPEND, // 32 - MSC_INPUT_ENABLED, - MSC_OUTPUT_ENABLED, - MSC_EXTERNAL_EVENT, - MSC_ENGINE_TAG, //36 - MSC_CALIBRATION_METHOD, - MSC_DEBUG_MODE, - MSC_NUMBER_OF_RUNS, - MSC_CONTEXT, - MSC_CAPTURE, - MSC_INPUT_CHANNELS, -}; - -struct mius_system_configuration_parameters_cache { - int32_t speaker_scaling[2]; - int32_t sensitivity; - int32_t latency; - int32_t microphone_index; - int32_t operation_mode; - int32_t operation_mode_flags; - int32_t component_gain_change; - int32_t calibration_state; - int32_t engine_version; - int32_t calibration_profile; - int32_t ultrasound_gain; - int32_t log_level; - int32_t custom_settings[MIUS_SYSTEM_CONFIGURATION_CUSTOM_SETTING_COUNT]; - int32_t engine_suspend; - int32_t input_enabled; - int32_t output_enabled; - int32_t external_event; - int32_t calibration_method; - int32_t debug_mode; - int32_t number_of_runs; - int32_t context; - int32_t capture; - int32_t input_channels; -}; - - -int mius_trigger_version_msg(void); - -int mius_trigger_branch_msg(void); - -int mius_trigger_tag_msg(void); - -int mius_trigger_diagnostics_msg(void); diff --git a/techpack/audio/include/mius/mius_sysfs.h b/techpack/audio/include/mius/mius_sysfs.h deleted file mode 100644 index 5f89b35408de..000000000000 --- a/techpack/audio/include/mius/mius_sysfs.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#define MIUS_SYSFS_ENGINE_FOLDER "engine" -#define MIUS_SYSFS_ROOT_FOLDER "mius" -#define MIUS_SYSFS_CALIBRATION_FILENAME "calibration" -#define MIUS_SYSFS_VERSION_FILENAME "version" -#define MIUS_SYSFS_CALIBRATION_V2_FILENAME "calibration_v2" -#define MIUS_SYSFS_STATE_FILENAME "state" -#define MIUS_SYSFS_TAG_FILENAME "tag" -#define MIUS_SYSFS_OPMODE_FILENAME "opmode" -#define MIUS_SYSFS_OPMODE_FLAGS_FILENAME "opmode_flags" - - -int mius_initialize_sysfs(void); -void mius_cleanup_sysfs(void); diff --git a/techpack/audio/include/soc/internal.h b/techpack/audio/include/soc/internal.h deleted file mode 120000 index 2bc065526db0..000000000000 --- a/techpack/audio/include/soc/internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../drivers/base/regmap/internal.h \ No newline at end of file diff --git a/techpack/audio/include/soc/snd_event.h b/techpack/audio/include/soc/snd_event.h deleted file mode 100644 index 835941126e02..000000000000 --- a/techpack/audio/include/soc/snd_event.h +++ /dev/null @@ -1,79 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#ifndef _SND_EVENT_H_ -#define _SND_EVENT_H_ - -enum { - SND_EVENT_DOWN = 0, - SND_EVENT_UP, -}; - -struct snd_event_clients; - -struct snd_event_ops { - int (*enable)(struct device *dev, void *data); - void (*disable)(struct device *dev, void *data); -}; - -#ifdef CONFIG_SND_EVENT -int snd_event_client_register(struct device *dev, - const struct snd_event_ops *snd_ev_ops, - void *data); -int snd_event_client_deregister(struct device *dev); -int snd_event_master_register(struct device *dev, - const struct snd_event_ops *ops, - struct snd_event_clients *clients, - void *data); -int snd_event_master_deregister(struct device *dev); -int snd_event_notify(struct device *dev, unsigned int state); - -void snd_event_mstr_add_client(struct snd_event_clients **snd_clients, - int (*compare)(struct device *, void *), - void *data); -inline bool is_snd_event_fwk_enabled(void) -{ - return 1; -} -#else -static inline int snd_event_client_register(struct device *dev, - const struct snd_event_ops *snd_ev_ops, - void *data) -{ - return 0; -} -static inline int snd_event_client_deregister(struct device *dev) -{ - return 0; -} -static inline int snd_event_master_register(struct device *dev, - const struct snd_event_ops *ops, - struct snd_event_clients *clients, - void *data) -{ - return 0; -} -static inline int snd_event_master_deregister(struct device *dev) -{ - return 0; -} -static inline int snd_event_notify(struct device *dev, unsigned int state) -{ - return 0; -} - -static inline void snd_event_mstr_add_client(struct snd_event_clients **snd_clients, - int (*compare)(struct device *, void *), - void *data) -{ - return; -} -static inline bool is_snd_event_fwk_enabled(void) -{ - return 0; -} - -#endif /* CONFIG_SND_EVENT */ -#endif /* _SND_EVENT_H_ */ diff --git a/techpack/audio/include/soc/soundwire.h b/techpack/audio/include/soc/soundwire.h deleted file mode 100644 index 43ac1b9b96e6..000000000000 --- a/techpack/audio/include/soc/soundwire.h +++ /dev/null @@ -1,350 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _LINUX_SOUNDWIRE_H -#define _LINUX_SOUNDWIRE_H -#include -#include -#include -#include - -extern struct bus_type soundwire_type; - -/* Soundwire supports max. of 8 channels per port */ -#define SWR_MAX_CHANNEL_NUM 8 -/* Soundwire supports max. of 14 ports on each device */ -#define SWR_MAX_DEV_PORT_NUM 14 -/* Maximum number of slave devices that a master can control */ -#define SWR_MAX_DEV_NUM 11 -/* Maximum number of ports on master so that it can accommodate all the port - * configurations of all devices - */ -#define SWR_MAX_MSTR_PORT_NUM (SWR_MAX_DEV_NUM * SWR_MAX_DEV_PORT_NUM) - -/* Indicates soundwire devices group information */ -enum { - SWR_GROUP_NONE = 0, - SWR_GROUP_12 = 12, - SWR_GROUP_13 = 13, - SWR_BROADCAST = 15, -}; - -/* - * struct swr_port_info - represents new soundwire frame shape - * with full data ports - * @list: link with other soundwire port info nodes - * @dev_num: logical device number of the soundwire slave device - * @port_en: flag indicates whether the port is enabled - * @slave_port_id: logical port number of the soundwire slave device - * @offset1: sample offset indicating the offset of the channel - * from the start of the frame - * @offset2: channel offset indicating offset between to channels - * @hstart: start offset for subframe window. - * @hstop: start offset for subframe window. - * @master_port_id: logical port number of corresponding soundwire master device - * @blk_grp_count: grouping count for n.o of channels. - * @blk_pack_mode: packing mode for channels in each port. - * @sinterval: sample interval indicates spacing from one sample - * event to the next - * @ch_en: channels enabled in a port. - * @req_ch: channels requested to be enabled in a port. - * @num_ch: number of channels enabled in a port - * @ch_rate: sampling rate of the channel with which data will be - * transferred - * - * Soundwire frame shape is created based on swr_port_info struct - * parameters. - */ -struct swr_port_info { - u8 dev_num; - u8 port_en; - u8 slave_port_id; - u8 offset1; - u8 offset2; - u8 sinterval; - struct list_head list; - u8 master_port_id; - u8 hstart; - u8 hstop; - u8 blk_grp_count; - u8 blk_pack_mode; - u8 word_length; - u8 lane_ctrl; - u8 ch_en; - u8 req_ch; - u8 num_ch; - u32 ch_rate; -}; - -/* - * struct swr_params - represent transfer of data from soundwire slave - * to soundwire master - * @tid: transaction ID to track each transaction - * @dev_num: logical device number of the soundwire slave device - * @num_port: number of ports that needs to be configured - * @port_id: array of logical port numbers of the soundwire slave device - * @num_ch: array of number of channels enabled - * @ch_rate: array of sampling rate of different channels that need to - * be configured - * @ch_en: array of channels mask for all the ports - * @port_type: the required master port type - */ -struct swr_params { - u8 tid; - u8 dev_num; - u8 num_port; - u8 port_id[SWR_MAX_DEV_PORT_NUM]; - u8 num_ch[SWR_MAX_DEV_PORT_NUM]; - u32 ch_rate[SWR_MAX_DEV_PORT_NUM]; - u8 ch_en[SWR_MAX_DEV_PORT_NUM]; - u8 port_type[SWR_MAX_DEV_PORT_NUM]; -}; - -/* - * struct swr_reg - struct to handle soundwire slave register read/writes - * @tid: transaction id for reg read/writes - * @dev_id: logical device number of the soundwire slave device - * @regaddr: 16 bit regaddr of soundwire slave - * @buf: value to be written/read to/from regaddr - * @len: length of the buffer buf - */ -struct swr_reg { - u8 tid; - u8 dev_id; - u32 regaddr; - u32 *buf; - u32 len; -}; - -/* - * struct swr_master - Interface to the soundwire master controller - * @dev: device interface to this driver - * @list: link with other soundwire master controllers - * @bus_num: board/SoC specific identifier for a soundwire master - * @mlock: mutex protecting master data structures - * @devices: list of devices on this master - * @port: logical port numbers of the soundwire master. This array - * can hold maximum master ports which is equal to number of slave - * devices multiplied by number of ports in each slave device - * @port_txn: table of port config transactions with transaction id - * @reg_txn: table of register transactions with transaction id - * @last_tid: size of table port_txn (can't grow beyond 256 since - * tid is 8 bits) - * @num_port: number of active ports on soundwire master - * @gr_sid: slave id used by the group for write operations - * @connect_port: callback for configuration of soundwire port(s) - * @disconnect_port: callback for disable of soundwire port(s) - * @read: callback for soundwire slave register read - * @write: callback for soundwire slave register write - * @get_logical_dev_num: callback to get soundwire slave logical - * device number - * @port_en_mask: bit mask of active ports on soundwire master - */ -struct swr_master { - struct device dev; - struct list_head list; - unsigned int bus_num; - struct mutex mlock; - struct list_head devices; - struct swr_port_info port[SWR_MAX_MSTR_PORT_NUM]; - struct swr_params **port_txn; - struct swr_reg **reg_txn; - u8 last_tid; - u8 num_port; - u8 num_dev; - u8 gr_sid; - int (*connect_port)(struct swr_master *mstr, struct swr_params *txn); - int (*disconnect_port)(struct swr_master *mstr, struct swr_params *txn); - int (*read)(struct swr_master *mstr, u8 dev_num, u16 reg_addr, - void *buf, u32 len); - int (*write)(struct swr_master *mstr, u8 dev_num, u16 reg_addr, - const void *buf); - int (*bulk_write)(struct swr_master *master, u8 dev_num, void *reg, - const void *buf, size_t len); - int (*get_logical_dev_num)(struct swr_master *mstr, u64 dev_id, - u8 *dev_num); - int (*slvdev_datapath_control)(struct swr_master *mstr, bool enable); - bool (*remove_from_group)(struct swr_master *mstr); - void (*device_wakeup_vote)(struct swr_master *mstr); - void (*device_wakeup_unvote)(struct swr_master *mstr); - u16 port_en_mask; - -}; - -static inline struct swr_master *to_swr_master(struct device *dev) -{ - return dev ? container_of(dev, struct swr_master, dev) : NULL; -} - -/* - * struct swr_device - represent a soundwire slave device - * @name: indicates the name of the device, defined in devicetree - * binding under soundwire slave device node as a compatible field. - * @master: soundwire master managing the bus hosting this device - * @driver: Device's driver. Pointer to access routines - * @dev_list: list of devices on a controller - * @dev_num: logical device number of the soundwire slave device - * @dev: driver model representation of the device - * @addr: represents "ea-addr" which is unique-id of soundwire slave - * device - * @group_id: group id supported by the slave device - * @slave_irq: irq handle of slave to be invoked by master - * during slave interrupt - */ -struct swr_device { - char name[SOUNDWIRE_NAME_SIZE]; - struct swr_master *master; - struct swr_driver *driver; - struct list_head dev_list; - u8 dev_num; - struct device dev; - unsigned long addr; - u8 group_id; - struct irq_domain *slave_irq; - bool slave_irq_pending; -}; - -static inline struct swr_device *to_swr_device(struct device *dev) -{ - return dev ? container_of(dev, struct swr_device, dev) : NULL; -} - -/* - * struct swr_driver - Manage soundwire slave device driver - * @probe: binds this driver to soundwire device - * @remove: unbinds this driver from soundwire device - * @shutdown: standard shutdown callback used during power down/halt - * @suspend: standard suspend callback used during system suspend - * @resume: standard resume callback used during system resume - * @driver: soundwire device drivers should initialize name and - * owner field of this structure - * @id_table: list of soundwire devices supported by this driver - */ -struct swr_driver { - int (*probe)(struct swr_device *swr); - int (*remove)(struct swr_device *swr); - void (*shutdown)(struct swr_device *swr); - int (*suspend)(struct swr_device *swr, pm_message_t pmesg); - int (*resume)(struct swr_device *swr); - int (*device_up)(struct swr_device *swr); - int (*device_down)(struct swr_device *swr); - int (*reset_device)(struct swr_device *swr); - struct device_driver driver; - const struct swr_device_id *id_table; -}; - -static inline struct swr_driver *to_swr_driver(struct device_driver *drv) -{ - return drv ? container_of(drv, struct swr_driver, driver) : NULL; -} - -/* - * struct swr_boardinfo - Declare board info for soundwire device bringup - * @name: name to initialize swr_device.name - * @bus_num: identifies which soundwire master parents the soundwire - * slave_device - * @addr: represents "ea-addr" of soundwire slave device - * @of_node: pointer to OpenFirmware device node - * @swr_slave: device to be registered with soundwire - */ -struct swr_boardinfo { - char name[SOUNDWIRE_NAME_SIZE]; - int bus_num; - u64 addr; - struct device_node *of_node; - struct swr_device *swr_slave; -}; - -static inline void *swr_get_ctrl_data(const struct swr_master *master) -{ - return master ? dev_get_drvdata(&master->dev) : NULL; -} - -static inline void swr_set_ctrl_data(struct swr_master *master, void *data) -{ - dev_set_drvdata(&master->dev, data); -} - -static inline void *swr_get_dev_data(const struct swr_device *dev) -{ - return dev ? dev_get_drvdata(&dev->dev) : NULL; -} - -static inline void swr_set_dev_data(struct swr_device *dev, void *data) -{ - dev_set_drvdata(&dev->dev, data); -} - -extern int swr_startup_devices(struct swr_device *swr_dev); - -extern struct swr_device *swr_new_device(struct swr_master *master, - struct swr_boardinfo const *info); - -extern int of_register_swr_devices(struct swr_master *master); - -extern void swr_port_response(struct swr_master *mstr, u8 tid); - -extern int swr_get_logical_dev_num(struct swr_device *dev, u64 dev_id, - u8 *dev_num); - -extern int swr_read(struct swr_device *dev, u8 dev_num, u16 reg_addr, - void *buf, u32 len); - -extern int swr_write(struct swr_device *dev, u8 dev_num, u16 reg_addr, - const void *buf); - -extern int swr_bulk_write(struct swr_device *dev, u8 dev_num, void *reg_addr, - const void *buf, size_t len); - -extern int swr_connect_port(struct swr_device *dev, u8 *port_id, u8 num_port, - u8 *ch_mask, u32 *ch_rate, u8 *num_ch, - u8 *port_type); - -extern int swr_disconnect_port(struct swr_device *dev, - u8 *port_id, u8 num_port, u8 *ch_mask, - u8 *port_type); - -extern int swr_set_device_group(struct swr_device *swr_dev, u8 id); - -extern int swr_driver_register(struct swr_driver *drv); - -extern void swr_driver_unregister(struct swr_driver *drv); - -extern int swr_add_device(struct swr_master *master, - struct swr_device *swrdev); -extern void swr_remove_device(struct swr_device *swr); - -extern void swr_master_add_boarddevices(struct swr_master *master); - -extern void swr_unregister_master(struct swr_master *master); - -extern int swr_register_master(struct swr_master *master); - -extern int swr_device_up(struct swr_device *swr_dev); - -extern int swr_device_down(struct swr_device *swr_dev); - -extern int swr_reset_device(struct swr_device *swr_dev); - -extern int swr_slvdev_datapath_control(struct swr_device *swr_dev, u8 dev_num, - bool enable); -extern int swr_remove_from_group(struct swr_device *dev, u8 dev_num); - -extern void swr_remove_device(struct swr_device *swr_dev); - -extern struct swr_device *get_matching_swr_slave_device(struct device_node *np); - -extern int swr_device_wakeup_vote(struct swr_device *dev); - -extern int swr_device_wakeup_unvote(struct swr_device *dev); - -#endif /* _LINUX_SOUNDWIRE_H */ diff --git a/techpack/audio/include/soc/swr-wcd.h b/techpack/audio/include/soc/swr-wcd.h deleted file mode 100644 index 7eaad27562d2..000000000000 --- a/techpack/audio/include/soc/swr-wcd.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2015, 2017-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _LINUX_SWR_WCD_H -#define _LINUX_SWR_WCD_H -#include -#include -#include -#include - -enum { - SWR_CH_MAP, - SWR_DEVICE_DOWN, - SWR_DEVICE_UP, - SWR_SUBSYS_RESTART, - SWR_SET_NUM_RX_CH, - SWR_CLK_FREQ, - SWR_DEVICE_SSR_DOWN, - SWR_DEVICE_SSR_UP, - SWR_REGISTER_WAKE_IRQ, -}; - -struct swr_mstr_port { - int num_port; - u8 *port; -}; - -#define MCLK_FREQ 9600000 -#define MCLK_FREQ_NATIVE 11289600 - -#if (IS_ENABLED(CONFIG_SOUNDWIRE_WCD_CTRL) || \ - IS_ENABLED(CONFIG_SOUNDWIRE_MSTR_CTRL)) -extern int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data); -#else /* CONFIG_SOUNDWIRE_WCD_CTRL */ -static inline int swrm_wcd_notify(struct platform_device *pdev, u32 id, - void *data) -{ - return 0; -} -#endif /* CONFIG_SOUNDWIRE_WCD_CTRL */ -#endif /* _LINUX_SWR_WCD_H */ diff --git a/techpack/audio/include/uapi/Android.mk b/techpack/audio/include/uapi/Android.mk deleted file mode 100644 index b8c209adaa0e..000000000000 --- a/techpack/audio/include/uapi/Android.mk +++ /dev/null @@ -1,29 +0,0 @@ -# Use this by setting -# LOCAL_HEADER_LIBRARIES := audio_kernel_headers - -LOCAL_PATH := $(call my-dir) -MYLOCAL_PATH := $(LOCAL_PATH) - -UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/include - -AUDIO_KERNEL_HEADERS := $(call all-named-files-under,*.h,linux) $(call all-named-files-under,*.h,sound) - -HEADER_INSTALL_DIR := kernel/msm-$(TARGET_KERNEL_VERSION)/scripts - -BUILD_ROOT_RELATIVE := ../../../../../../../ - -include $(CLEAR_VARS) -LOCAL_MODULE := audio_kernel_headers -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_PREBUILT_INT_KERNEL) - -GEN := $(addprefix $(UAPI_OUT)/,$(AUDIO_KERNEL_HEADERS)) -$(GEN): $(KERNEL_USR) -$(GEN): PRIVATE_PATH := $(MYLOCAL_PATH) -$(GEN): PRIVATE_CUSTOM_TOOL = $(shell cd $(PRODUCT_OUT)/obj/KERNEL_OBJ; $(BUILD_ROOT_RELATIVE)$(HEADER_INSTALL_DIR)/headers_install.sh $(BUILD_ROOT_RELATIVE)$(dir $@) $(BUILD_ROOT_RELATIVE)$(subst $(UAPI_OUT),$(MYLOCAL_PATH),$(dir $@)) $(notdir $@)) -$(GEN): $(addprefix $(MYLOCAL_PATH)/,$(AUDIO_KERNEL_HEADERS)) - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES := $(GEN) -LOCAL_EXPORT_C_INCLUDE_DIRS := $(UAPI_OUT) - -include $(BUILD_HEADER_LIBRARY) diff --git a/techpack/audio/include/uapi/Kbuild b/techpack/audio/include/uapi/Kbuild deleted file mode 100644 index 2eb179d4de95..000000000000 --- a/techpack/audio/include/uapi/Kbuild +++ /dev/null @@ -1,6 +0,0 @@ -# UAPI Header export list -# Top-level Makefile calls into asm-$(ARCH) -# List only non-arch directories below - -header-y += linux/ -header-y += sound/ diff --git a/techpack/audio/include/uapi/linux/Kbuild b/techpack/audio/include/uapi/linux/Kbuild deleted file mode 100644 index f6af2bf8cca3..000000000000 --- a/techpack/audio/include/uapi/linux/Kbuild +++ /dev/null @@ -1,20 +0,0 @@ -# UAPI Header export list -header-y += avtimer.h -header-y += msm_audio.h -header-y += msm_audio_aac.h -header-y += msm_audio_ac3.h -header-y += msm_audio_amrnb.h -header-y += msm_audio_amrwb.h -header-y += msm_audio_amrwbplus.h -header-y += msm_audio_calibration.h -header-y += msm_audio_mvs.h -header-y += msm_audio_qcp.h -header-y += msm_audio_sbc.h -header-y += msm_audio_voicememo.h -header-y += msm_audio_wma.h -header-y += msm_audio_wmapro.h -header-y += msm_audio_alac.h -header-y += msm_audio_ape.h -header-y += msm_audio_g711.h -header-y += msm_audio_g711_dec.h -header-y += mfd/ diff --git a/techpack/audio/include/uapi/linux/avtimer.h b/techpack/audio/include/uapi/linux/avtimer.h deleted file mode 100644 index 96b5483fbf2e..000000000000 --- a/techpack/audio/include/uapi/linux/avtimer.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _UAPI_AVTIMER_H -#define _UAPI_AVTIMER_H - -#include - -#define MAJOR_NUM 100 - -#define IOCTL_GET_AVTIMER_TICK _IOR(MAJOR_NUM, 0, uint64_t) - -#endif diff --git a/techpack/audio/include/uapi/linux/mfd/Kbuild b/techpack/audio/include/uapi/linux/mfd/Kbuild deleted file mode 100644 index 9377c98b0aa3..000000000000 --- a/techpack/audio/include/uapi/linux/mfd/Kbuild +++ /dev/null @@ -1 +0,0 @@ -header-y += wcd9xxx/ diff --git a/techpack/audio/include/uapi/linux/mfd/wcd9xxx/Kbuild b/techpack/audio/include/uapi/linux/mfd/wcd9xxx/Kbuild deleted file mode 100644 index 8e55965bbe7e..000000000000 --- a/techpack/audio/include/uapi/linux/mfd/wcd9xxx/Kbuild +++ /dev/null @@ -1,2 +0,0 @@ -header-y += wcd9xxx_registers.h -header-y += wcd9320_registers.h diff --git a/techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h b/techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h deleted file mode 100644 index 63ab62419559..000000000000 --- a/techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9320_registers.h +++ /dev/null @@ -1,1399 +0,0 @@ -#ifndef WCD9320_REGISTERS_H -#define WCD9320_REGISTERS_H - -#include - -#define TAIKO_A_CHIP_CTL WCD9XXX_A_CHIP_CTL -#define TAIKO_A_CHIP_CTL__POR WCD9XXX_A_CHIP_CTL__POR -#define TAIKO_A_CHIP_STATUS WCD9XXX_A_CHIP_STATUS -#define TAIKO_A_CHIP_STATUS__POR WCD9XXX_A_CHIP_STATUS__POR -#define TAIKO_A_CHIP_ID_BYTE_0 WCD9XXX_A_CHIP_ID_BYTE_0 -#define TAIKO_A_CHIP_ID_BYTE_0__POR WCD9XXX_A_CHIP_ID_BYTE_0__POR -#define TAIKO_A_CHIP_ID_BYTE_1 WCD9XXX_A_CHIP_ID_BYTE_1 -#define TAIKO_A_CHIP_ID_BYTE_1__POR WCD9XXX_A_CHIP_ID_BYTE_1__POR -#define TAIKO_A_CHIP_ID_BYTE_2 WCD9XXX_A_CHIP_ID_BYTE_2 -#define TAIKO_A_CHIP_ID_BYTE_2__POR WCD9XXX_A_CHIP_ID_BYTE_2__POR -#define TAIKO_A_CHIP_ID_BYTE_3 WCD9XXX_A_CHIP_ID_BYTE_3 -#define TAIKO_A_CHIP_ID_BYTE_3__POR WCD9XXX_A_CHIP_ID_BYTE_3__POR -#define TAIKO_A_CHIP_VERSION WCD9XXX_A_CHIP_VERSION -#define TAIKO_A_CHIP_VERSION__POR WCD9XXX_A_CHIP_VERSION__POR -#define TAIKO_A_SB_VERSION WCD9XXX_A_SB_VERSION -#define TAIKO_A_SB_VERSION__POR WCD9XXX_A_SB_VERSION__POR -#define TAIKO_A_SLAVE_ID_1 WCD9XXX_A_SLAVE_ID_1 -#define TAIKO_A_SLAVE_ID_1__POR WCD9XXX_A_SLAVE_ID_1__POR -#define TAIKO_A_SLAVE_ID_2 WCD9XXX_A_SLAVE_ID_2 -#define TAIKO_A_SLAVE_ID_2__POR WCD9XXX_A_SLAVE_ID_2__POR -#define TAIKO_A_SLAVE_ID_3 WCD9XXX_A_SLAVE_ID_3 -#define TAIKO_A_SLAVE_ID_3__POR WCD9XXX_A_SLAVE_ID_3__POR -#define TAIKO_A_PIN_CTL_OE0 (0x010) -#define TAIKO_A_PIN_CTL_OE0__POR (0x00) -#define TAIKO_A_PIN_CTL_OE1 (0x011) -#define TAIKO_A_PIN_CTL_OE1__POR (0x00) -#define TAIKO_A_PIN_CTL_DATA0 (0x012) -#define TAIKO_A_PIN_CTL_DATA0__POR (0x00) -#define TAIKO_A_PIN_CTL_DATA1 (0x013) -#define TAIKO_A_PIN_CTL_DATA1__POR (0x00) -#define TAIKO_A_HDRIVE_GENERIC (0x018) -#define TAIKO_A_HDRIVE_GENERIC__POR (0x00) -#define TAIKO_A_HDRIVE_OVERRIDE (0x019) -#define TAIKO_A_HDRIVE_OVERRIDE__POR (0x08) -#define TAIKO_A_ANA_CSR_WAIT_STATE (0x020) -#define TAIKO_A_ANA_CSR_WAIT_STATE__POR (0x44) -#define TAIKO_A_PROCESS_MONITOR_CTL0 (0x040) -#define TAIKO_A_PROCESS_MONITOR_CTL0__POR (0x80) -#define TAIKO_A_PROCESS_MONITOR_CTL1 (0x041) -#define TAIKO_A_PROCESS_MONITOR_CTL1__POR (0x00) -#define TAIKO_A_PROCESS_MONITOR_CTL2 (0x042) -#define TAIKO_A_PROCESS_MONITOR_CTL2__POR (0x00) -#define TAIKO_A_PROCESS_MONITOR_CTL3 (0x043) -#define TAIKO_A_PROCESS_MONITOR_CTL3__POR (0x01) -#define TAIKO_A_QFUSE_CTL (0x048) -#define TAIKO_A_QFUSE_CTL__POR (0x00) -#define TAIKO_A_QFUSE_STATUS (0x049) -#define TAIKO_A_QFUSE_STATUS__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT0 (0x04A) -#define TAIKO_A_QFUSE_DATA_OUT0__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT1 (0x04B) -#define TAIKO_A_QFUSE_DATA_OUT1__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT2 (0x04C) -#define TAIKO_A_QFUSE_DATA_OUT2__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT3 (0x04D) -#define TAIKO_A_QFUSE_DATA_OUT3__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT4 (0x04E) -#define TAIKO_A_QFUSE_DATA_OUT4__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT5 (0x04F) -#define TAIKO_A_QFUSE_DATA_OUT5__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT6 (0x050) -#define TAIKO_A_QFUSE_DATA_OUT6__POR (0x00) -#define TAIKO_A_QFUSE_DATA_OUT7 (0x051) -#define TAIKO_A_QFUSE_DATA_OUT7__POR (0x00) -#define TAIKO_A_CDC_CTL WCD9XXX_A_CDC_CTL -#define TAIKO_A_CDC_CTL__POR WCD9XXX_A_CDC_CTL__POR -#define TAIKO_A_LEAKAGE_CTL WCD9XXX_A_LEAKAGE_CTL -#define TAIKO_A_LEAKAGE_CTL__POR WCD9XXX_A_LEAKAGE_CTL__POR -#define TAIKO_A_INTR_MODE (0x090) -#define TAIKO_A_INTR_MODE__POR (0x00) -#define TAIKO_A_INTR_MASK0 (0x094) -#define TAIKO_A_INTR_MASK0__POR (0xFF) -#define TAIKO_A_INTR_MASK1 (0x095) -#define TAIKO_A_INTR_MASK1__POR (0xFF) -#define TAIKO_A_INTR_MASK2 (0x096) -#define TAIKO_A_INTR_MASK2__POR (0x3F) -#define TAIKO_A_INTR_MASK3 (0x097) -#define TAIKO_A_INTR_MASK3__POR (0x3F) -#define TAIKO_A_INTR_STATUS0 (0x098) -#define TAIKO_A_INTR_STATUS0__POR (0x00) -#define TAIKO_A_INTR_STATUS1 (0x099) -#define TAIKO_A_INTR_STATUS1__POR (0x00) -#define TAIKO_A_INTR_STATUS2 (0x09A) -#define TAIKO_A_INTR_STATUS2__POR (0x00) -#define TAIKO_A_INTR_STATUS3 (0x09B) -#define TAIKO_A_INTR_STATUS3__POR (0x00) -#define TAIKO_A_INTR_CLEAR0 (0x09C) -#define TAIKO_A_INTR_CLEAR0__POR (0x00) -#define TAIKO_A_INTR_CLEAR1 (0x09D) -#define TAIKO_A_INTR_CLEAR1__POR (0x00) -#define TAIKO_A_INTR_CLEAR2 (0x09E) -#define TAIKO_A_INTR_CLEAR2__POR (0x00) -#define TAIKO_A_INTR_CLEAR3 (0x09F) -#define TAIKO_A_INTR_CLEAR3__POR (0x00) -#define TAIKO_A_INTR_LEVEL0 (0x0A0) -#define TAIKO_A_INTR_LEVEL0__POR (0x01) -#define TAIKO_A_INTR_LEVEL1 (0x0A1) -#define TAIKO_A_INTR_LEVEL1__POR (0x00) -#define TAIKO_A_INTR_LEVEL2 (0x0A2) -#define TAIKO_A_INTR_LEVEL2__POR (0x00) -#define TAIKO_A_INTR_LEVEL3 (0x0A3) -#define TAIKO_A_INTR_LEVEL3__POR (0x00) -#define TAIKO_A_INTR_TEST0 (0x0A4) -#define TAIKO_A_INTR_TEST0__POR (0x00) -#define TAIKO_A_INTR_TEST1 (0x0A5) -#define TAIKO_A_INTR_TEST1__POR (0x00) -#define TAIKO_A_INTR_TEST2 (0x0A6) -#define TAIKO_A_INTR_TEST2__POR (0x00) -#define TAIKO_A_INTR_TEST3 (0x0A7) -#define TAIKO_A_INTR_TEST3__POR (0x00) -#define TAIKO_A_INTR_SET0 (0x0A8) -#define TAIKO_A_INTR_SET0__POR (0x00) -#define TAIKO_A_INTR_SET1 (0x0A9) -#define TAIKO_A_INTR_SET1__POR (0x00) -#define TAIKO_A_INTR_SET2 (0x0AA) -#define TAIKO_A_INTR_SET2__POR (0x00) -#define TAIKO_A_INTR_SET3 (0x0AB) -#define TAIKO_A_INTR_SET3__POR (0x00) -#define TAIKO_A_INTR_DESTN0 (0x0AC) -#define TAIKO_A_INTR_DESTN0__POR (0x00) -#define TAIKO_A_INTR_DESTN1 (0x0AD) -#define TAIKO_A_INTR_DESTN1__POR (0x00) -#define TAIKO_A_INTR_DESTN2 (0x0AE) -#define TAIKO_A_INTR_DESTN2__POR (0x00) -#define TAIKO_A_INTR_DESTN3 (0x0AF) -#define TAIKO_A_INTR_DESTN3__POR (0x00) -#define TAIKO_A_CDC_TX_I2S_SCK_MODE (0x0C0) -#define TAIKO_A_CDC_TX_I2S_SCK_MODE__POR (0x00) -#define TAIKO_A_CDC_TX_I2S_WS_MODE (0x0C1) -#define TAIKO_A_CDC_TX_I2S_WS_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_DATA0_MODE (0x0C4) -#define TAIKO_A_CDC_DMIC_DATA0_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_CLK0_MODE (0x0C5) -#define TAIKO_A_CDC_DMIC_CLK0_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_DATA1_MODE (0x0C6) -#define TAIKO_A_CDC_DMIC_DATA1_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_CLK1_MODE (0x0C7) -#define TAIKO_A_CDC_DMIC_CLK1_MODE__POR (0x00) -#define TAIKO_A_CDC_RX_I2S_SCK_MODE (0x0C8) -#define TAIKO_A_CDC_RX_I2S_SCK_MODE__POR (0x00) -#define TAIKO_A_CDC_RX_I2S_WS_MODE (0x0C9) -#define TAIKO_A_CDC_RX_I2S_WS_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_DATA2_MODE (0x0CA) -#define TAIKO_A_CDC_DMIC_DATA2_MODE__POR (0x00) -#define TAIKO_A_CDC_DMIC_CLK2_MODE (0x0CB) -#define TAIKO_A_CDC_DMIC_CLK2_MODE__POR (0x00) -#define TAIKO_A_CDC_INTR1_MODE (0x0CC) -#define TAIKO_A_CDC_INTR1_MODE__POR (0x00) -#define TAIKO_A_CDC_SB_NRZ_SEL_MODE (0x0CD) -#define TAIKO_A_CDC_SB_NRZ_SEL_MODE__POR (0x00) -#define TAIKO_A_CDC_INTR2_MODE (0x0CE) -#define TAIKO_A_CDC_INTR2_MODE__POR (0x00) -#define TAIKO_A_CDC_RF_PA_ON_MODE (0x0CF) -#define TAIKO_A_CDC_RF_PA_ON_MODE__POR (0x00) -#define TAIKO_A_BIAS_REF_CTL (0x100) -#define TAIKO_A_BIAS_REF_CTL__POR (0x1C) -#define TAIKO_A_BIAS_CENTRAL_BG_CTL (0x101) -#define TAIKO_A_BIAS_CENTRAL_BG_CTL__POR (0x50) -#define TAIKO_A_BIAS_PRECHRG_CTL (0x102) -#define TAIKO_A_BIAS_PRECHRG_CTL__POR (0x07) -#define TAIKO_A_BIAS_CURR_CTL_1 (0x103) -#define TAIKO_A_BIAS_CURR_CTL_1__POR (0x52) -#define TAIKO_A_BIAS_CURR_CTL_2 (0x104) -#define TAIKO_A_BIAS_CURR_CTL_2__POR (0x00) -#define TAIKO_A_BIAS_OSC_BG_CTL (0x105) -#define TAIKO_A_BIAS_OSC_BG_CTL__POR (0x16) -#define TAIKO_A_CLK_BUFF_EN1 (0x108) -#define TAIKO_A_CLK_BUFF_EN1__POR (0x04) -#define TAIKO_A_CLK_BUFF_EN2 (0x109) -#define TAIKO_A_CLK_BUFF_EN2__POR (0x02) -#define TAIKO_A_LDO_H_MODE_1 (0x110) -#define TAIKO_A_LDO_H_MODE_1__POR (0x65) -#define TAIKO_A_LDO_H_MODE_2 (0x111) -#define TAIKO_A_LDO_H_MODE_2__POR (0xA8) -#define TAIKO_A_LDO_H_LOOP_CTL (0x112) -#define TAIKO_A_LDO_H_LOOP_CTL__POR (0x6B) -#define TAIKO_A_LDO_H_COMP_1 (0x113) -#define TAIKO_A_LDO_H_COMP_1__POR (0x84) -#define TAIKO_A_LDO_H_COMP_2 (0x114) -#define TAIKO_A_LDO_H_COMP_2__POR (0xE0) -#define TAIKO_A_LDO_H_BIAS_1 (0x115) -#define TAIKO_A_LDO_H_BIAS_1__POR (0x6D) -#define TAIKO_A_LDO_H_BIAS_2 (0x116) -#define TAIKO_A_LDO_H_BIAS_2__POR (0xA5) -#define TAIKO_A_LDO_H_BIAS_3 (0x117) -#define TAIKO_A_LDO_H_BIAS_3__POR (0x60) -#define TAIKO_A_VBAT_CLK (0x118) -#define TAIKO_A_VBAT_CLK__POR (0x03) -#define TAIKO_A_VBAT_LOOP (0x119) -#define TAIKO_A_VBAT_LOOP__POR (0x02) -#define TAIKO_A_VBAT_REF (0x11A) -#define TAIKO_A_VBAT_REF__POR (0x20) -#define TAIKO_A_VBAT_ADC_TEST (0x11B) -#define TAIKO_A_VBAT_ADC_TEST__POR (0x00) -#define TAIKO_A_VBAT_FE (0x11C) -#define TAIKO_A_VBAT_FE__POR (0x48) -#define TAIKO_A_VBAT_BIAS_1 (0x11D) -#define TAIKO_A_VBAT_BIAS_1__POR (0x03) -#define TAIKO_A_VBAT_BIAS_2 (0x11E) -#define TAIKO_A_VBAT_BIAS_2__POR (0x00) -#define TAIKO_A_VBAT_ADC_DATA_MSB (0x11F) -#define TAIKO_A_VBAT_ADC_DATA_MSB__POR (0x00) -#define TAIKO_A_VBAT_ADC_DATA_LSB (0x120) -#define TAIKO_A_VBAT_ADC_DATA_LSB__POR (0x00) -#define TAIKO_A_MICB_CFILT_1_CTL (0x128) -#define TAIKO_A_MICB_CFILT_1_CTL__POR (0x40) -#define TAIKO_A_MICB_CFILT_1_VAL (0x129) -#define TAIKO_A_MICB_CFILT_1_VAL__POR (0x80) -#define TAIKO_A_MICB_CFILT_1_PRECHRG (0x12A) -#define TAIKO_A_MICB_CFILT_1_PRECHRG__POR (0x38) -#define TAIKO_A_MICB_1_CTL (0x12B) -#define TAIKO_A_MICB_1_CTL__POR (0x16) -#define TAIKO_A_MICB_1_INT_RBIAS (0x12C) -#define TAIKO_A_MICB_1_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_1_MBHC (0x12D) -#define TAIKO_A_MICB_1_MBHC__POR (0x01) -#define TAIKO_A_MICB_CFILT_2_CTL (0x12E) -#define TAIKO_A_MICB_CFILT_2_CTL__POR (0x40) -#define TAIKO_A_MICB_CFILT_2_VAL (0x12F) -#define TAIKO_A_MICB_CFILT_2_VAL__POR (0x80) -#define TAIKO_A_MICB_CFILT_2_PRECHRG (0x130) -#define TAIKO_A_MICB_CFILT_2_PRECHRG__POR (0x38) -#define TAIKO_A_MICB_2_CTL (0x131) -#define TAIKO_A_MICB_2_CTL__POR (0x16) -#define TAIKO_A_MICB_2_INT_RBIAS (0x132) -#define TAIKO_A_MICB_2_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_2_MBHC (0x133) -#define TAIKO_A_MICB_2_MBHC__POR (0x02) -#define TAIKO_A_MICB_CFILT_3_CTL (0x134) -#define TAIKO_A_MICB_CFILT_3_CTL__POR (0x40) -#define TAIKO_A_MICB_CFILT_3_VAL (0x135) -#define TAIKO_A_MICB_CFILT_3_VAL__POR (0x80) -#define TAIKO_A_MICB_CFILT_3_PRECHRG (0x136) -#define TAIKO_A_MICB_CFILT_3_PRECHRG__POR (0x38) -#define TAIKO_A_MICB_3_CTL (0x137) -#define TAIKO_A_MICB_3_CTL__POR (0x16) -#define TAIKO_A_MICB_3_INT_RBIAS (0x138) -#define TAIKO_A_MICB_3_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_3_MBHC (0x139) -#define TAIKO_A_MICB_3_MBHC__POR (0x00) -#define TAIKO_A_MICB_4_CTL (0x13D) -#define TAIKO_A_MICB_4_CTL__POR (0x16) -#define TAIKO_A_MICB_4_INT_RBIAS (0x13E) -#define TAIKO_A_MICB_4_INT_RBIAS__POR (0x24) -#define TAIKO_A_MICB_4_MBHC (0x13F) -#define TAIKO_A_MICB_4_MBHC__POR (0x01) -#define TAIKO_A_MBHC_INSERT_DETECT (0x14A) -#define TAIKO_A_MBHC_INSERT_DETECT__POR (0x00) -#define TAIKO_A_MBHC_INSERT_DET_STATUS (0x14B) -#define TAIKO_A_MBHC_INSERT_DET_STATUS__POR (0x00) -#define TAIKO_A_TX_COM_BIAS (0x14C) -#define TAIKO_A_TX_COM_BIAS__POR (0xF0) -#define TAIKO_A_MBHC_SCALING_MUX_1 (0x14E) -#define TAIKO_A_MBHC_SCALING_MUX_1__POR (0x00) -#define TAIKO_A_MBHC_SCALING_MUX_2 (0x14F) -#define TAIKO_A_MBHC_SCALING_MUX_2__POR (0x80) -#define TAIKO_A_MAD_ANA_CTRL (0x150) -#define TAIKO_A_MAD_ANA_CTRL__POR (0xF1) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_1 (0x151) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_1__POR (0x00) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_2 (0x152) -#define TAIKO_A_TX_SUP_SWITCH_CTRL_2__POR (0x80) -#define TAIKO_A_TX_1_2_EN (0x153) -#define TAIKO_A_TX_1_2_EN__POR (0x00) -#define TAIKO_A_TX_1_2_TEST_EN (0x154) -#define TAIKO_A_TX_1_2_TEST_EN__POR (0xCC) -#define TAIKO_A_TX_1_2_ADC_CH1 (0x155) -#define TAIKO_A_TX_1_2_ADC_CH1__POR (0x44) -#define TAIKO_A_TX_1_2_ADC_CH2 (0x156) -#define TAIKO_A_TX_1_2_ADC_CH2__POR (0x44) -#define TAIKO_A_TX_1_2_ATEST_REFCTRL (0x157) -#define TAIKO_A_TX_1_2_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_1_2_TEST_CTL (0x158) -#define TAIKO_A_TX_1_2_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_1_2_TEST_BLOCK_EN (0x159) -#define TAIKO_A_TX_1_2_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_TX_1_2_TXFE_CLKDIV (0x15A) -#define TAIKO_A_TX_1_2_TXFE_CLKDIV__POR (0x55) -#define TAIKO_A_TX_1_2_SAR_ERR_CH1 (0x15B) -#define TAIKO_A_TX_1_2_SAR_ERR_CH1__POR (0x00) -#define TAIKO_A_TX_1_2_SAR_ERR_CH2 (0x15C) -#define TAIKO_A_TX_1_2_SAR_ERR_CH2__POR (0x00) -#define TAIKO_A_TX_3_4_EN (0x15D) -#define TAIKO_A_TX_3_4_EN__POR (0x00) -#define TAIKO_A_TX_3_4_TEST_EN (0x15E) -#define TAIKO_A_TX_3_4_TEST_EN__POR (0xCC) -#define TAIKO_A_TX_3_4_ADC_CH3 (0x15F) -#define TAIKO_A_TX_3_4_ADC_CH3__POR (0x44) -#define TAIKO_A_TX_3_4_ADC_CH4 (0x160) -#define TAIKO_A_TX_3_4_ADC_CH4__POR (0x44) -#define TAIKO_A_TX_3_4_ATEST_REFCTRL (0x161) -#define TAIKO_A_TX_3_4_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_3_4_TEST_CTL (0x162) -#define TAIKO_A_TX_3_4_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_3_4_TEST_BLOCK_EN (0x163) -#define TAIKO_A_TX_3_4_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_TX_3_4_TXFE_CKDIV (0x164) -#define TAIKO_A_TX_3_4_TXFE_CKDIV__POR (0x55) -#define TAIKO_A_TX_3_4_SAR_ERR_CH3 (0x165) -#define TAIKO_A_TX_3_4_SAR_ERR_CH3__POR (0x00) -#define TAIKO_A_TX_3_4_SAR_ERR_CH4 (0x166) -#define TAIKO_A_TX_3_4_SAR_ERR_CH4__POR (0x00) -#define TAIKO_A_TX_5_6_EN (0x167) -#define TAIKO_A_TX_5_6_EN__POR (0x11) -#define TAIKO_A_TX_5_6_TEST_EN (0x168) -#define TAIKO_A_TX_5_6_TEST_EN__POR (0xCC) -#define TAIKO_A_TX_5_6_ADC_CH5 (0x169) -#define TAIKO_A_TX_5_6_ADC_CH5__POR (0x44) -#define TAIKO_A_TX_5_6_ADC_CH6 (0x16A) -#define TAIKO_A_TX_5_6_ADC_CH6__POR (0x44) -#define TAIKO_A_TX_5_6_ATEST_REFCTRL (0x16B) -#define TAIKO_A_TX_5_6_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_5_6_TEST_CTL (0x16C) -#define TAIKO_A_TX_5_6_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_5_6_TEST_BLOCK_EN (0x16D) -#define TAIKO_A_TX_5_6_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_TX_5_6_TXFE_CKDIV (0x16E) -#define TAIKO_A_TX_5_6_TXFE_CKDIV__POR (0x55) -#define TAIKO_A_TX_5_6_SAR_ERR_CH5 (0x16F) -#define TAIKO_A_TX_5_6_SAR_ERR_CH5__POR (0x00) -#define TAIKO_A_TX_5_6_SAR_ERR_CH6 (0x170) -#define TAIKO_A_TX_5_6_SAR_ERR_CH6__POR (0x00) -#define TAIKO_A_TX_7_MBHC_EN (0x171) -#define TAIKO_A_TX_7_MBHC_EN__POR (0x0C) -#define TAIKO_A_TX_7_MBHC_ATEST_REFCTRL (0x172) -#define TAIKO_A_TX_7_MBHC_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_TX_7_MBHC_ADC (0x173) -#define TAIKO_A_TX_7_MBHC_ADC__POR (0x44) -#define TAIKO_A_TX_7_MBHC_TEST_CTL (0x174) -#define TAIKO_A_TX_7_MBHC_TEST_CTL__POR (0x38) -#define TAIKO_A_TX_7_MBHC_SAR_ERR (0x175) -#define TAIKO_A_TX_7_MBHC_SAR_ERR__POR (0x00) -#define TAIKO_A_TX_7_TXFE_CLKDIV (0x176) -#define TAIKO_A_TX_7_TXFE_CLKDIV__POR (0x0B) -#define TAIKO_A_BUCK_MODE_1 (0x181) -#define TAIKO_A_BUCK_MODE_1__POR (0x21) -#define TAIKO_A_BUCK_MODE_2 (0x182) -#define TAIKO_A_BUCK_MODE_2__POR (0xFF) -#define TAIKO_A_BUCK_MODE_3 (0x183) -#define TAIKO_A_BUCK_MODE_3__POR (0xCC) -#define TAIKO_A_BUCK_MODE_4 (0x184) -#define TAIKO_A_BUCK_MODE_4__POR (0x3A) -#define TAIKO_A_BUCK_MODE_5 (0x185) -#define TAIKO_A_BUCK_MODE_5__POR (0x00) -#define TAIKO_A_BUCK_CTRL_VCL_1 (0x186) -#define TAIKO_A_BUCK_CTRL_VCL_1__POR (0x48) -#define TAIKO_A_BUCK_CTRL_VCL_2 (0x187) -#define TAIKO_A_BUCK_CTRL_VCL_2__POR (0xA3) -#define TAIKO_A_BUCK_CTRL_VCL_3 (0x188) -#define TAIKO_A_BUCK_CTRL_VCL_3__POR (0x82) -#define TAIKO_A_BUCK_CTRL_CCL_1 (0x189) -#define TAIKO_A_BUCK_CTRL_CCL_1__POR (0xAB) -#define TAIKO_A_BUCK_CTRL_CCL_2 (0x18A) -#define TAIKO_A_BUCK_CTRL_CCL_2__POR (0xDC) -#define TAIKO_A_BUCK_CTRL_CCL_3 (0x18B) -#define TAIKO_A_BUCK_CTRL_CCL_3__POR (0x6A) -#define TAIKO_A_BUCK_CTRL_CCL_4 (0x18C) -#define TAIKO_A_BUCK_CTRL_CCL_4__POR (0x58) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_1 (0x18D) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_1__POR (0x50) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_2 (0x18E) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_2__POR (0x64) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_3 (0x18F) -#define TAIKO_A_BUCK_CTRL_PWM_DRVR_3__POR (0x77) -#define TAIKO_A_BUCK_TMUX_A_D (0x190) -#define TAIKO_A_BUCK_TMUX_A_D__POR (0x00) -#define TAIKO_A_NCP_BUCKREF (0x191) -#define TAIKO_A_NCP_BUCKREF__POR (0x00) -#define TAIKO_A_NCP_EN (0x192) -#define TAIKO_A_NCP_EN__POR (0xFE) -#define TAIKO_A_NCP_CLK (0x193) -#define TAIKO_A_NCP_CLK__POR (0x94) -#define TAIKO_A_NCP_STATIC (0x194) -#define TAIKO_A_NCP_STATIC__POR (0x28) -#define TAIKO_A_NCP_VTH_LOW (0x195) -#define TAIKO_A_NCP_VTH_LOW__POR (0x88) -#define TAIKO_A_NCP_VTH_HIGH (0x196) -#define TAIKO_A_NCP_VTH_HIGH__POR (0xA0) -#define TAIKO_A_NCP_ATEST (0x197) -#define TAIKO_A_NCP_ATEST__POR (0x00) -#define TAIKO_A_NCP_DTEST (0x198) -#define TAIKO_A_NCP_DTEST__POR (0x00) -#define TAIKO_A_NCP_DLY1 (0x199) -#define TAIKO_A_NCP_DLY1__POR (0x06) -#define TAIKO_A_NCP_DLY2 (0x19A) -#define TAIKO_A_NCP_DLY2__POR (0x06) -#define TAIKO_A_RX_AUX_SW_CTL (0x19B) -#define TAIKO_A_RX_AUX_SW_CTL__POR (0x00) -#define TAIKO_A_RX_PA_AUX_IN_CONN (0x19C) -#define TAIKO_A_RX_PA_AUX_IN_CONN__POR (0x00) -#define TAIKO_A_RX_COM_TIMER_DIV (0x19E) -#define TAIKO_A_RX_COM_TIMER_DIV__POR (0xE8) -#define TAIKO_A_RX_COM_OCP_CTL (0x19F) -#define TAIKO_A_RX_COM_OCP_CTL__POR (0x1F) -#define TAIKO_A_RX_COM_OCP_COUNT (0x1A0) -#define TAIKO_A_RX_COM_OCP_COUNT__POR (0x77) -#define TAIKO_A_RX_COM_DAC_CTL (0x1A1) -#define TAIKO_A_RX_COM_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_COM_BIAS (0x1A2) -#define TAIKO_A_RX_COM_BIAS__POR (0x00) -#define TAIKO_A_RX_HPH_AUTO_CHOP (0x1A4) -#define TAIKO_A_RX_HPH_AUTO_CHOP__POR (0x38) -#define TAIKO_A_RX_HPH_CHOP_CTL (0x1A5) -#define TAIKO_A_RX_HPH_CHOP_CTL__POR (0xB4) -#define TAIKO_A_RX_HPH_BIAS_PA (0x1A6) -#define TAIKO_A_RX_HPH_BIAS_PA__POR (0xAA) -#define TAIKO_A_RX_HPH_BIAS_LDO (0x1A7) -#define TAIKO_A_RX_HPH_BIAS_LDO__POR (0x87) -#define TAIKO_A_RX_HPH_BIAS_CNP (0x1A8) -#define TAIKO_A_RX_HPH_BIAS_CNP__POR (0x8A) -#define TAIKO_A_RX_HPH_BIAS_WG_OCP (0x1A9) -#define TAIKO_A_RX_HPH_BIAS_WG_OCP__POR (0x2A) -#define TAIKO_A_RX_HPH_OCP_CTL (0x1AA) -#define TAIKO_A_RX_HPH_OCP_CTL__POR (0x68) -#define TAIKO_A_RX_HPH_CNP_EN (0x1AB) -#define TAIKO_A_RX_HPH_CNP_EN__POR (0x80) -#define TAIKO_A_RX_HPH_CNP_WG_CTL (0x1AC) -#define TAIKO_A_RX_HPH_CNP_WG_CTL__POR (0xDE) -#define TAIKO_A_RX_HPH_CNP_WG_TIME (0x1AD) -#define TAIKO_A_RX_HPH_CNP_WG_TIME__POR (0x2A) -#define TAIKO_A_RX_HPH_L_GAIN (0x1AE) -#define TAIKO_A_RX_HPH_L_GAIN__POR (0x00) -#define TAIKO_A_RX_HPH_L_TEST (0x1AF) -#define TAIKO_A_RX_HPH_L_TEST__POR (0x00) -#define TAIKO_A_RX_HPH_L_PA_CTL (0x1B0) -#define TAIKO_A_RX_HPH_L_PA_CTL__POR (0x40) -#define TAIKO_A_RX_HPH_L_DAC_CTL (0x1B1) -#define TAIKO_A_RX_HPH_L_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_HPH_L_ATEST (0x1B2) -#define TAIKO_A_RX_HPH_L_ATEST__POR (0x00) -#define TAIKO_A_RX_HPH_L_STATUS (0x1B3) -#define TAIKO_A_RX_HPH_L_STATUS__POR (0x00) -#define TAIKO_A_RX_HPH_R_GAIN (0x1B4) -#define TAIKO_A_RX_HPH_R_GAIN__POR (0x00) -#define TAIKO_A_RX_HPH_R_TEST (0x1B5) -#define TAIKO_A_RX_HPH_R_TEST__POR (0x00) -#define TAIKO_A_RX_HPH_R_PA_CTL (0x1B6) -#define TAIKO_A_RX_HPH_R_PA_CTL__POR (0x40) -#define TAIKO_A_RX_HPH_R_DAC_CTL (0x1B7) -#define TAIKO_A_RX_HPH_R_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_HPH_R_ATEST (0x1B8) -#define TAIKO_A_RX_HPH_R_ATEST__POR (0x00) -#define TAIKO_A_RX_HPH_R_STATUS (0x1B9) -#define TAIKO_A_RX_HPH_R_STATUS__POR (0x00) -#define TAIKO_A_RX_EAR_BIAS_PA (0x1BA) -#define TAIKO_A_RX_EAR_BIAS_PA__POR (0xA6) -#define TAIKO_A_RX_EAR_BIAS_CMBUFF (0x1BB) -#define TAIKO_A_RX_EAR_BIAS_CMBUFF__POR (0xA0) -#define TAIKO_A_RX_EAR_EN (0x1BC) -#define TAIKO_A_RX_EAR_EN__POR (0x00) -#define TAIKO_A_RX_EAR_GAIN (0x1BD) -#define TAIKO_A_RX_EAR_GAIN__POR (0x02) -#define TAIKO_A_RX_EAR_CMBUFF (0x1BE) -#define TAIKO_A_RX_EAR_CMBUFF__POR (0x04) -#define TAIKO_A_RX_EAR_ICTL (0x1BF) -#define TAIKO_A_RX_EAR_ICTL__POR (0x40) -#define TAIKO_A_RX_EAR_CCOMP (0x1C0) -#define TAIKO_A_RX_EAR_CCOMP__POR (0x08) -#define TAIKO_A_RX_EAR_VCM (0x1C1) -#define TAIKO_A_RX_EAR_VCM__POR (0x03) -#define TAIKO_A_RX_EAR_CNP (0x1C2) -#define TAIKO_A_RX_EAR_CNP__POR (0xF2) -#define TAIKO_A_RX_EAR_DAC_CTL_ATEST (0x1C3) -#define TAIKO_A_RX_EAR_DAC_CTL_ATEST__POR (0x00) -#define TAIKO_A_RX_EAR_STATUS (0x1C5) -#define TAIKO_A_RX_EAR_STATUS__POR (0x04) -#define TAIKO_A_RX_LINE_BIAS_PA (0x1C6) -#define TAIKO_A_RX_LINE_BIAS_PA__POR (0xA8) -#define TAIKO_A_RX_BUCK_BIAS1 (0x1C7) -#define TAIKO_A_RX_BUCK_BIAS1__POR (0x42) -#define TAIKO_A_RX_BUCK_BIAS2 (0x1C8) -#define TAIKO_A_RX_BUCK_BIAS2__POR (0x84) -#define TAIKO_A_RX_LINE_COM (0x1C9) -#define TAIKO_A_RX_LINE_COM__POR (0x80) -#define TAIKO_A_RX_LINE_CNP_EN (0x1CA) -#define TAIKO_A_RX_LINE_CNP_EN__POR (0x00) -#define TAIKO_A_RX_LINE_CNP_WG_CTL (0x1CB) -#define TAIKO_A_RX_LINE_CNP_WG_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_CNP_WG_TIME (0x1CC) -#define TAIKO_A_RX_LINE_CNP_WG_TIME__POR (0x04) -#define TAIKO_A_RX_LINE_1_GAIN (0x1CD) -#define TAIKO_A_RX_LINE_1_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_1_TEST (0x1CE) -#define TAIKO_A_RX_LINE_1_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_1_DAC_CTL (0x1CF) -#define TAIKO_A_RX_LINE_1_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_1_STATUS (0x1D0) -#define TAIKO_A_RX_LINE_1_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_2_GAIN (0x1D1) -#define TAIKO_A_RX_LINE_2_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_2_TEST (0x1D2) -#define TAIKO_A_RX_LINE_2_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_2_DAC_CTL (0x1D3) -#define TAIKO_A_RX_LINE_2_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_2_STATUS (0x1D4) -#define TAIKO_A_RX_LINE_2_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_3_GAIN (0x1D5) -#define TAIKO_A_RX_LINE_3_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_3_TEST (0x1D6) -#define TAIKO_A_RX_LINE_3_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_3_DAC_CTL (0x1D7) -#define TAIKO_A_RX_LINE_3_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_3_STATUS (0x1D8) -#define TAIKO_A_RX_LINE_3_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_4_GAIN (0x1D9) -#define TAIKO_A_RX_LINE_4_GAIN__POR (0x00) -#define TAIKO_A_RX_LINE_4_TEST (0x1DA) -#define TAIKO_A_RX_LINE_4_TEST__POR (0x00) -#define TAIKO_A_RX_LINE_4_DAC_CTL (0x1DB) -#define TAIKO_A_RX_LINE_4_DAC_CTL__POR (0x00) -#define TAIKO_A_RX_LINE_4_STATUS (0x1DC) -#define TAIKO_A_RX_LINE_4_STATUS__POR (0x00) -#define TAIKO_A_RX_LINE_CNP_DBG (0x1DD) -#define TAIKO_A_RX_LINE_CNP_DBG__POR (0x00) -#define TAIKO_A_SPKR_DRV_EN (0x1DF) -#define TAIKO_A_SPKR_DRV_EN__POR (0x6F) -#define TAIKO_A_SPKR_DRV_GAIN (0x1E0) -#define TAIKO_A_SPKR_DRV_GAIN__POR (0x00) -#define TAIKO_A_SPKR_DRV_DAC_CTL (0x1E1) -#define TAIKO_A_SPKR_DRV_DAC_CTL__POR (0x04) -#define TAIKO_A_SPKR_DRV_OCP_CTL (0x1E2) -#define TAIKO_A_SPKR_DRV_OCP_CTL__POR (0x98) -#define TAIKO_A_SPKR_DRV_CLIP_DET (0x1E3) -#define TAIKO_A_SPKR_DRV_CLIP_DET__POR (0x48) -#define TAIKO_A_SPKR_DRV_IEC (0x1E4) -#define TAIKO_A_SPKR_DRV_IEC__POR (0x20) -#define TAIKO_A_SPKR_DRV_DBG_DAC (0x1E5) -#define TAIKO_A_SPKR_DRV_DBG_DAC__POR (0x05) -#define TAIKO_A_SPKR_DRV_DBG_PA (0x1E6) -#define TAIKO_A_SPKR_DRV_DBG_PA__POR (0x18) -#define TAIKO_A_SPKR_DRV_DBG_PWRSTG (0x1E7) -#define TAIKO_A_SPKR_DRV_DBG_PWRSTG__POR (0x00) -#define TAIKO_A_SPKR_DRV_BIAS_LDO (0x1E8) -#define TAIKO_A_SPKR_DRV_BIAS_LDO__POR (0x45) -#define TAIKO_A_SPKR_DRV_BIAS_INT (0x1E9) -#define TAIKO_A_SPKR_DRV_BIAS_INT__POR (0xA5) -#define TAIKO_A_SPKR_DRV_BIAS_PA (0x1EA) -#define TAIKO_A_SPKR_DRV_BIAS_PA__POR (0x55) -#define TAIKO_A_SPKR_DRV_STATUS_OCP (0x1EB) -#define TAIKO_A_SPKR_DRV_STATUS_OCP__POR (0x00) -#define TAIKO_A_SPKR_DRV_STATUS_PA (0x1EC) -#define TAIKO_A_SPKR_DRV_STATUS_PA__POR (0x00) -#define TAIKO_A_SPKR_PROT_EN (0x1ED) -#define TAIKO_A_SPKR_PROT_EN__POR (0x00) -#define TAIKO_A_SPKR_PROT_ADC_EN (0x1EE) -#define TAIKO_A_SPKR_PROT_ADC_EN__POR (0x44) -#define TAIKO_A_SPKR_PROT_ISENSE_BIAS (0x1EF) -#define TAIKO_A_SPKR_PROT_ISENSE_BIAS__POR (0x44) -#define TAIKO_A_SPKR_PROT_VSENSE_BIAS (0x1F0) -#define TAIKO_A_SPKR_PROT_VSENSE_BIAS__POR (0x44) -#define TAIKO_A_SPKR_PROT_ADC_ATEST_REFCTRL (0x1F1) -#define TAIKO_A_SPKR_PROT_ADC_ATEST_REFCTRL__POR (0x00) -#define TAIKO_A_SPKR_PROT_ADC_TEST_CTL (0x1F2) -#define TAIKO_A_SPKR_PROT_ADC_TEST_CTL__POR (0x38) -#define TAIKO_A_SPKR_PROT_TEST_BLOCK_EN (0x1F3) -#define TAIKO_A_SPKR_PROT_TEST_BLOCK_EN__POR (0xFC) -#define TAIKO_A_SPKR_PROT_ATEST (0x1F4) -#define TAIKO_A_SPKR_PROT_ATEST__POR (0x00) -#define TAIKO_A_SPKR_PROT_V_SAR_ERR (0x1F5) -#define TAIKO_A_SPKR_PROT_V_SAR_ERR__POR (0x00) -#define TAIKO_A_SPKR_PROT_I_SAR_ERR (0x1F6) -#define TAIKO_A_SPKR_PROT_I_SAR_ERR__POR (0x00) -#define TAIKO_A_SPKR_PROT_LDO_CTRL (0x1F7) -#define TAIKO_A_SPKR_PROT_LDO_CTRL__POR (0x00) -#define TAIKO_A_SPKR_PROT_ISENSE_CTRL (0x1F8) -#define TAIKO_A_SPKR_PROT_ISENSE_CTRL__POR (0x00) -#define TAIKO_A_SPKR_PROT_VSENSE_CTRL (0x1F9) -#define TAIKO_A_SPKR_PROT_VSENSE_CTRL__POR (0x00) -#define TAIKO_A_RC_OSC_FREQ (0x1FA) -#define TAIKO_A_RC_OSC_FREQ__POR (0x46) -#define TAIKO_A_RC_OSC_TEST (0x1FB) -#define TAIKO_A_RC_OSC_TEST__POR (0x0A) -#define TAIKO_A_RC_OSC_STATUS (0x1FC) -#define TAIKO_A_RC_OSC_STATUS__POR (0x18) -#define TAIKO_A_RC_OSC_TUNER (0x1FD) -#define TAIKO_A_RC_OSC_TUNER__POR (0x00) -#define TAIKO_A_MBHC_HPH (0x1FE) -#define TAIKO_A_MBHC_HPH__POR (0x44) -#define TAIKO_A_CDC_ANC1_B1_CTL (0x200) -#define TAIKO_A_CDC_ANC1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_B1_CTL (0x280) -#define TAIKO_A_CDC_ANC2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_SHIFT (0x201) -#define TAIKO_A_CDC_ANC1_SHIFT__POR (0x00) -#define TAIKO_A_CDC_ANC2_SHIFT (0x281) -#define TAIKO_A_CDC_ANC2_SHIFT__POR (0x00) -#define TAIKO_A_CDC_ANC1_IIR_B1_CTL (0x202) -#define TAIKO_A_CDC_ANC1_IIR_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_IIR_B1_CTL (0x282) -#define TAIKO_A_CDC_ANC2_IIR_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_IIR_B2_CTL (0x203) -#define TAIKO_A_CDC_ANC1_IIR_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_IIR_B2_CTL (0x283) -#define TAIKO_A_CDC_ANC2_IIR_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_IIR_B3_CTL (0x204) -#define TAIKO_A_CDC_ANC1_IIR_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_IIR_B3_CTL (0x284) -#define TAIKO_A_CDC_ANC2_IIR_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_LPF_B1_CTL (0x206) -#define TAIKO_A_CDC_ANC1_LPF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_LPF_B1_CTL (0x286) -#define TAIKO_A_CDC_ANC2_LPF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_LPF_B2_CTL (0x207) -#define TAIKO_A_CDC_ANC1_LPF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_LPF_B2_CTL (0x287) -#define TAIKO_A_CDC_ANC2_LPF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_SPARE (0x209) -#define TAIKO_A_CDC_ANC1_SPARE__POR (0x00) -#define TAIKO_A_CDC_ANC2_SPARE (0x289) -#define TAIKO_A_CDC_ANC2_SPARE__POR (0x00) -#define TAIKO_A_CDC_ANC1_SMLPF_CTL (0x20A) -#define TAIKO_A_CDC_ANC1_SMLPF_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_SMLPF_CTL (0x28A) -#define TAIKO_A_CDC_ANC2_SMLPF_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_DCFLT_CTL (0x20B) -#define TAIKO_A_CDC_ANC1_DCFLT_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_DCFLT_CTL (0x28B) -#define TAIKO_A_CDC_ANC2_DCFLT_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_GAIN_CTL (0x20C) -#define TAIKO_A_CDC_ANC1_GAIN_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_GAIN_CTL (0x28C) -#define TAIKO_A_CDC_ANC2_GAIN_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC1_B2_CTL (0x20D) -#define TAIKO_A_CDC_ANC1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_ANC2_B2_CTL (0x28D) -#define TAIKO_A_CDC_ANC2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_TX1_VOL_CTL_TIMER (0x220) -#define TAIKO_A_CDC_TX1_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX2_VOL_CTL_TIMER (0x228) -#define TAIKO_A_CDC_TX2_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX3_VOL_CTL_TIMER (0x230) -#define TAIKO_A_CDC_TX3_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX4_VOL_CTL_TIMER (0x238) -#define TAIKO_A_CDC_TX4_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX5_VOL_CTL_TIMER (0x240) -#define TAIKO_A_CDC_TX5_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX6_VOL_CTL_TIMER (0x248) -#define TAIKO_A_CDC_TX6_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX7_VOL_CTL_TIMER (0x250) -#define TAIKO_A_CDC_TX7_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX8_VOL_CTL_TIMER (0x258) -#define TAIKO_A_CDC_TX8_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX9_VOL_CTL_TIMER (0x260) -#define TAIKO_A_CDC_TX9_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX10_VOL_CTL_TIMER (0x268) -#define TAIKO_A_CDC_TX10_VOL_CTL_TIMER__POR (0x00) -#define TAIKO_A_CDC_TX1_VOL_CTL_GAIN (0x221) -#define TAIKO_A_CDC_TX1_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX2_VOL_CTL_GAIN (0x229) -#define TAIKO_A_CDC_TX2_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX3_VOL_CTL_GAIN (0x231) -#define TAIKO_A_CDC_TX3_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX4_VOL_CTL_GAIN (0x239) -#define TAIKO_A_CDC_TX4_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX5_VOL_CTL_GAIN (0x241) -#define TAIKO_A_CDC_TX5_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX6_VOL_CTL_GAIN (0x249) -#define TAIKO_A_CDC_TX6_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX7_VOL_CTL_GAIN (0x251) -#define TAIKO_A_CDC_TX7_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX8_VOL_CTL_GAIN (0x259) -#define TAIKO_A_CDC_TX8_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX9_VOL_CTL_GAIN (0x261) -#define TAIKO_A_CDC_TX9_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX10_VOL_CTL_GAIN (0x269) -#define TAIKO_A_CDC_TX10_VOL_CTL_GAIN__POR (0x00) -#define TAIKO_A_CDC_TX1_VOL_CTL_CFG (0x222) -#define TAIKO_A_CDC_TX1_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX2_VOL_CTL_CFG (0x22A) -#define TAIKO_A_CDC_TX2_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX3_VOL_CTL_CFG (0x232) -#define TAIKO_A_CDC_TX3_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX4_VOL_CTL_CFG (0x23A) -#define TAIKO_A_CDC_TX4_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX5_VOL_CTL_CFG (0x242) -#define TAIKO_A_CDC_TX5_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX6_VOL_CTL_CFG (0x24A) -#define TAIKO_A_CDC_TX6_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX7_VOL_CTL_CFG (0x252) -#define TAIKO_A_CDC_TX7_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX8_VOL_CTL_CFG (0x25A) -#define TAIKO_A_CDC_TX8_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX9_VOL_CTL_CFG (0x262) -#define TAIKO_A_CDC_TX9_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX10_VOL_CTL_CFG (0x26A) -#define TAIKO_A_CDC_TX10_VOL_CTL_CFG__POR (0x00) -#define TAIKO_A_CDC_TX1_MUX_CTL (0x223) -#define TAIKO_A_CDC_TX1_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX2_MUX_CTL (0x22B) -#define TAIKO_A_CDC_TX2_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX3_MUX_CTL (0x233) -#define TAIKO_A_CDC_TX3_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX4_MUX_CTL (0x23B) -#define TAIKO_A_CDC_TX4_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX5_MUX_CTL (0x243) -#define TAIKO_A_CDC_TX5_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX6_MUX_CTL (0x24B) -#define TAIKO_A_CDC_TX6_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX7_MUX_CTL (0x253) -#define TAIKO_A_CDC_TX7_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX8_MUX_CTL (0x25B) -#define TAIKO_A_CDC_TX8_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX9_MUX_CTL (0x263) -#define TAIKO_A_CDC_TX9_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX10_MUX_CTL (0x26B) -#define TAIKO_A_CDC_TX10_MUX_CTL__POR (0x08) -#define TAIKO_A_CDC_TX1_CLK_FS_CTL (0x224) -#define TAIKO_A_CDC_TX1_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX2_CLK_FS_CTL (0x22C) -#define TAIKO_A_CDC_TX2_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX3_CLK_FS_CTL (0x234) -#define TAIKO_A_CDC_TX3_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX4_CLK_FS_CTL (0x23C) -#define TAIKO_A_CDC_TX4_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX5_CLK_FS_CTL (0x244) -#define TAIKO_A_CDC_TX5_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX6_CLK_FS_CTL (0x24C) -#define TAIKO_A_CDC_TX6_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX7_CLK_FS_CTL (0x254) -#define TAIKO_A_CDC_TX7_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX8_CLK_FS_CTL (0x25C) -#define TAIKO_A_CDC_TX8_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX9_CLK_FS_CTL (0x264) -#define TAIKO_A_CDC_TX9_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX10_CLK_FS_CTL (0x26C) -#define TAIKO_A_CDC_TX10_CLK_FS_CTL__POR (0x03) -#define TAIKO_A_CDC_TX1_DMIC_CTL (0x225) -#define TAIKO_A_CDC_TX1_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX2_DMIC_CTL (0x22D) -#define TAIKO_A_CDC_TX2_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX3_DMIC_CTL (0x235) -#define TAIKO_A_CDC_TX3_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX4_DMIC_CTL (0x23D) -#define TAIKO_A_CDC_TX4_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX5_DMIC_CTL (0x245) -#define TAIKO_A_CDC_TX5_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX6_DMIC_CTL (0x24D) -#define TAIKO_A_CDC_TX6_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX7_DMIC_CTL (0x255) -#define TAIKO_A_CDC_TX7_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX8_DMIC_CTL (0x25D) -#define TAIKO_A_CDC_TX8_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX9_DMIC_CTL (0x265) -#define TAIKO_A_CDC_TX9_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_TX10_DMIC_CTL (0x26D) -#define TAIKO_A_CDC_TX10_DMIC_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B1_CTL (0x278) -#define TAIKO_A_CDC_DEBUG_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B2_CTL (0x279) -#define TAIKO_A_CDC_DEBUG_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B3_CTL (0x27A) -#define TAIKO_A_CDC_DEBUG_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B4_CTL (0x27B) -#define TAIKO_A_CDC_DEBUG_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B5_CTL (0x27C) -#define TAIKO_A_CDC_DEBUG_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B6_CTL (0x27D) -#define TAIKO_A_CDC_DEBUG_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_DEBUG_B7_CTL (0x27E) -#define TAIKO_A_CDC_DEBUG_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_SRC1_PDA_CFG (0x2A0) -#define TAIKO_A_CDC_SRC1_PDA_CFG__POR (0x00) -#define TAIKO_A_CDC_SRC2_PDA_CFG (0x2A8) -#define TAIKO_A_CDC_SRC2_PDA_CFG__POR (0x00) -#define TAIKO_A_CDC_SRC1_FS_CTL (0x2A1) -#define TAIKO_A_CDC_SRC1_FS_CTL__POR (0x1B) -#define TAIKO_A_CDC_SRC2_FS_CTL (0x2A9) -#define TAIKO_A_CDC_SRC2_FS_CTL__POR (0x1B) -#define TAIKO_A_CDC_RX1_B1_CTL (0x2B0) -#define TAIKO_A_CDC_RX1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B1_CTL (0x2B8) -#define TAIKO_A_CDC_RX2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B1_CTL (0x2C0) -#define TAIKO_A_CDC_RX3_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B1_CTL (0x2C8) -#define TAIKO_A_CDC_RX4_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B1_CTL (0x2D0) -#define TAIKO_A_CDC_RX5_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B1_CTL (0x2D8) -#define TAIKO_A_CDC_RX6_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B1_CTL (0x2E0) -#define TAIKO_A_CDC_RX7_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B2_CTL (0x2B1) -#define TAIKO_A_CDC_RX1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B2_CTL (0x2B9) -#define TAIKO_A_CDC_RX2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B2_CTL (0x2C1) -#define TAIKO_A_CDC_RX3_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B2_CTL (0x2C9) -#define TAIKO_A_CDC_RX4_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B2_CTL (0x2D1) -#define TAIKO_A_CDC_RX5_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B2_CTL (0x2D9) -#define TAIKO_A_CDC_RX6_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B2_CTL (0x2E1) -#define TAIKO_A_CDC_RX7_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B3_CTL (0x2B2) -#define TAIKO_A_CDC_RX1_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B3_CTL (0x2BA) -#define TAIKO_A_CDC_RX2_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B3_CTL (0x2C2) -#define TAIKO_A_CDC_RX3_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B3_CTL (0x2CA) -#define TAIKO_A_CDC_RX4_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B3_CTL (0x2D2) -#define TAIKO_A_CDC_RX5_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B3_CTL (0x2DA) -#define TAIKO_A_CDC_RX6_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B3_CTL (0x2E2) -#define TAIKO_A_CDC_RX7_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B4_CTL (0x2B3) -#define TAIKO_A_CDC_RX1_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_B4_CTL (0x2BB) -#define TAIKO_A_CDC_RX2_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_B4_CTL (0x2C3) -#define TAIKO_A_CDC_RX3_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_B4_CTL (0x2CB) -#define TAIKO_A_CDC_RX4_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_B4_CTL (0x2D3) -#define TAIKO_A_CDC_RX5_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_B4_CTL (0x2DB) -#define TAIKO_A_CDC_RX6_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_B4_CTL (0x2E3) -#define TAIKO_A_CDC_RX7_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_B5_CTL (0x2B4) -#define TAIKO_A_CDC_RX1_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX2_B5_CTL (0x2BC) -#define TAIKO_A_CDC_RX2_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX3_B5_CTL (0x2C4) -#define TAIKO_A_CDC_RX3_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX4_B5_CTL (0x2CC) -#define TAIKO_A_CDC_RX4_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX5_B5_CTL (0x2D4) -#define TAIKO_A_CDC_RX5_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX6_B5_CTL (0x2DC) -#define TAIKO_A_CDC_RX6_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX7_B5_CTL (0x2E4) -#define TAIKO_A_CDC_RX7_B5_CTL__POR (0x78) -#define TAIKO_A_CDC_RX1_B6_CTL (0x2B5) -#define TAIKO_A_CDC_RX1_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX2_B6_CTL (0x2BD) -#define TAIKO_A_CDC_RX2_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX3_B6_CTL (0x2C5) -#define TAIKO_A_CDC_RX3_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX4_B6_CTL (0x2CD) -#define TAIKO_A_CDC_RX4_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX5_B6_CTL (0x2D5) -#define TAIKO_A_CDC_RX5_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX6_B6_CTL (0x2DD) -#define TAIKO_A_CDC_RX6_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX7_B6_CTL (0x2E5) -#define TAIKO_A_CDC_RX7_B6_CTL__POR (0x80) -#define TAIKO_A_CDC_RX1_VOL_CTL_B1_CTL (0x2B6) -#define TAIKO_A_CDC_RX1_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_VOL_CTL_B1_CTL (0x2BE) -#define TAIKO_A_CDC_RX2_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_VOL_CTL_B1_CTL (0x2C6) -#define TAIKO_A_CDC_RX3_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_VOL_CTL_B1_CTL (0x2CE) -#define TAIKO_A_CDC_RX4_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_VOL_CTL_B1_CTL (0x2D6) -#define TAIKO_A_CDC_RX5_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_VOL_CTL_B1_CTL (0x2DE) -#define TAIKO_A_CDC_RX6_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_VOL_CTL_B1_CTL (0x2E6) -#define TAIKO_A_CDC_RX7_VOL_CTL_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL (0x2B7) -#define TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL (0x2BF) -#define TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL (0x2C7) -#define TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL (0x2CF) -#define TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL (0x2D7) -#define TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL (0x2DF) -#define TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_RX7_VOL_CTL_B2_CTL (0x2E7) -#define TAIKO_A_CDC_RX7_VOL_CTL_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_VBAT_CFG (0x2E8) -#define TAIKO_A_CDC_VBAT_CFG__POR (0x1A) -#define TAIKO_A_CDC_VBAT_ADC_CAL1 (0x2E9) -#define TAIKO_A_CDC_VBAT_ADC_CAL1__POR (0x00) -#define TAIKO_A_CDC_VBAT_ADC_CAL2 (0x2EA) -#define TAIKO_A_CDC_VBAT_ADC_CAL2__POR (0x00) -#define TAIKO_A_CDC_VBAT_ADC_CAL3 (0x2EB) -#define TAIKO_A_CDC_VBAT_ADC_CAL3__POR (0x04) -#define TAIKO_A_CDC_VBAT_PK_EST1 (0x2EC) -#define TAIKO_A_CDC_VBAT_PK_EST1__POR (0xE0) -#define TAIKO_A_CDC_VBAT_PK_EST2 (0x2ED) -#define TAIKO_A_CDC_VBAT_PK_EST2__POR (0x01) -#define TAIKO_A_CDC_VBAT_PK_EST3 (0x2EE) -#define TAIKO_A_CDC_VBAT_PK_EST3__POR (0x40) -#define TAIKO_A_CDC_VBAT_RF_PROC1 (0x2EF) -#define TAIKO_A_CDC_VBAT_RF_PROC1__POR (0x2A) -#define TAIKO_A_CDC_VBAT_RF_PROC2 (0x2F0) -#define TAIKO_A_CDC_VBAT_RF_PROC2__POR (0x86) -#define TAIKO_A_CDC_VBAT_TAC1 (0x2F1) -#define TAIKO_A_CDC_VBAT_TAC1__POR (0x70) -#define TAIKO_A_CDC_VBAT_TAC2 (0x2F2) -#define TAIKO_A_CDC_VBAT_TAC2__POR (0x18) -#define TAIKO_A_CDC_VBAT_TAC3 (0x2F3) -#define TAIKO_A_CDC_VBAT_TAC3__POR (0x18) -#define TAIKO_A_CDC_VBAT_TAC4 (0x2F4) -#define TAIKO_A_CDC_VBAT_TAC4__POR (0x03) -#define TAIKO_A_CDC_VBAT_GAIN_UPD1 (0x2F5) -#define TAIKO_A_CDC_VBAT_GAIN_UPD1__POR (0x01) -#define TAIKO_A_CDC_VBAT_GAIN_UPD2 (0x2F6) -#define TAIKO_A_CDC_VBAT_GAIN_UPD2__POR (0x00) -#define TAIKO_A_CDC_VBAT_GAIN_UPD3 (0x2F7) -#define TAIKO_A_CDC_VBAT_GAIN_UPD3__POR (0x64) -#define TAIKO_A_CDC_VBAT_GAIN_UPD4 (0x2F8) -#define TAIKO_A_CDC_VBAT_GAIN_UPD4__POR (0x01) -#define TAIKO_A_CDC_VBAT_DEBUG1 (0x2F9) -#define TAIKO_A_CDC_VBAT_DEBUG1__POR (0x00) -#define TAIKO_A_CDC_CLK_ANC_RESET_CTL (0x300) -#define TAIKO_A_CDC_CLK_ANC_RESET_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_RESET_CTL (0x301) -#define TAIKO_A_CDC_CLK_RX_RESET_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_RESET_B1_CTL (0x302) -#define TAIKO_A_CDC_CLK_TX_RESET_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_RESET_B2_CTL (0x303) -#define TAIKO_A_CDC_CLK_TX_RESET_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_DMIC_B1_CTL (0x304) -#define TAIKO_A_CDC_CLK_DMIC_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_DMIC_B2_CTL (0x305) -#define TAIKO_A_CDC_CLK_DMIC_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_I2S_CTL (0x306) -#define TAIKO_A_CDC_CLK_RX_I2S_CTL__POR (0x03) -#define TAIKO_A_CDC_CLK_TX_I2S_CTL (0x307) -#define TAIKO_A_CDC_CLK_TX_I2S_CTL__POR (0x03) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B1_CTL (0x308) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B2_CTL (0x309) -#define TAIKO_A_CDC_CLK_OTHR_RESET_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL (0x30A) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL (0x30B) -#define TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_OTHR_CTL (0x30C) -#define TAIKO_A_CDC_CLK_OTHR_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RDAC_CLK_EN_CTL (0x30D) -#define TAIKO_A_CDC_CLK_RDAC_CLK_EN_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_ANC_CLK_EN_CTL (0x30E) -#define TAIKO_A_CDC_CLK_ANC_CLK_EN_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_B1_CTL (0x30F) -#define TAIKO_A_CDC_CLK_RX_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_RX_B2_CTL (0x310) -#define TAIKO_A_CDC_CLK_RX_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_MCLK_CTL (0x311) -#define TAIKO_A_CDC_CLK_MCLK_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_PDM_CTL (0x312) -#define TAIKO_A_CDC_CLK_PDM_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_SD_CTL (0x313) -#define TAIKO_A_CDC_CLK_SD_CTL__POR (0x00) -#define TAIKO_A_CDC_CLK_POWER_CTL (0x314) -#define TAIKO_A_CDC_CLK_POWER_CTL__POR (0x00) -#define TAIKO_A_CDC_CLSH_B1_CTL (0x320) -#define TAIKO_A_CDC_CLSH_B1_CTL__POR (0xE4) -#define TAIKO_A_CDC_CLSH_B2_CTL (0x321) -#define TAIKO_A_CDC_CLSH_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CLSH_B3_CTL (0x322) -#define TAIKO_A_CDC_CLSH_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CLSH_BUCK_NCP_VARS (0x323) -#define TAIKO_A_CDC_CLSH_BUCK_NCP_VARS__POR (0x00) -#define TAIKO_A_CDC_CLSH_IDLE_HPH_THSD (0x324) -#define TAIKO_A_CDC_CLSH_IDLE_HPH_THSD__POR (0x12) -#define TAIKO_A_CDC_CLSH_IDLE_EAR_THSD (0x325) -#define TAIKO_A_CDC_CLSH_IDLE_EAR_THSD__POR (0x0C) -#define TAIKO_A_CDC_CLSH_FCLKONLY_HPH_THSD (0x326) -#define TAIKO_A_CDC_CLSH_FCLKONLY_HPH_THSD__POR (0x18) -#define TAIKO_A_CDC_CLSH_FCLKONLY_EAR_THSD (0x327) -#define TAIKO_A_CDC_CLSH_FCLKONLY_EAR_THSD__POR (0x23) -#define TAIKO_A_CDC_CLSH_K_ADDR (0x328) -#define TAIKO_A_CDC_CLSH_K_ADDR__POR (0x00) -#define TAIKO_A_CDC_CLSH_K_DATA (0x329) -#define TAIKO_A_CDC_CLSH_K_DATA__POR (0xA4) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_L (0x32A) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_L__POR (0xD7) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_U (0x32B) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_HPH_U__POR (0x05) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_L (0x32C) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_L__POR (0x60) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_U (0x32D) -#define TAIKO_A_CDC_CLSH_I_PA_FACT_EAR_U__POR (0x09) -#define TAIKO_A_CDC_CLSH_V_PA_HD_EAR (0x32E) -#define TAIKO_A_CDC_CLSH_V_PA_HD_EAR__POR (0x00) -#define TAIKO_A_CDC_CLSH_V_PA_HD_HPH (0x32F) -#define TAIKO_A_CDC_CLSH_V_PA_HD_HPH__POR (0x00) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_EAR (0x330) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_EAR__POR (0x00) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_HPH (0x331) -#define TAIKO_A_CDC_CLSH_V_PA_MIN_HPH__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B1_CTL (0x340) -#define TAIKO_A_CDC_IIR1_GAIN_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B1_CTL (0x350) -#define TAIKO_A_CDC_IIR2_GAIN_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B2_CTL (0x341) -#define TAIKO_A_CDC_IIR1_GAIN_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B2_CTL (0x351) -#define TAIKO_A_CDC_IIR2_GAIN_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B3_CTL (0x342) -#define TAIKO_A_CDC_IIR1_GAIN_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B3_CTL (0x352) -#define TAIKO_A_CDC_IIR2_GAIN_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B4_CTL (0x343) -#define TAIKO_A_CDC_IIR1_GAIN_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B4_CTL (0x353) -#define TAIKO_A_CDC_IIR2_GAIN_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B5_CTL (0x344) -#define TAIKO_A_CDC_IIR1_GAIN_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B5_CTL (0x354) -#define TAIKO_A_CDC_IIR2_GAIN_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B6_CTL (0x345) -#define TAIKO_A_CDC_IIR1_GAIN_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B6_CTL (0x355) -#define TAIKO_A_CDC_IIR2_GAIN_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B7_CTL (0x346) -#define TAIKO_A_CDC_IIR1_GAIN_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B7_CTL (0x356) -#define TAIKO_A_CDC_IIR2_GAIN_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_GAIN_B8_CTL (0x347) -#define TAIKO_A_CDC_IIR1_GAIN_B8_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_B8_CTL (0x357) -#define TAIKO_A_CDC_IIR2_GAIN_B8_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_CTL (0x348) -#define TAIKO_A_CDC_IIR1_CTL__POR (0x40) -#define TAIKO_A_CDC_IIR2_CTL (0x358) -#define TAIKO_A_CDC_IIR2_CTL__POR (0x40) -#define TAIKO_A_CDC_IIR1_GAIN_TIMER_CTL (0x349) -#define TAIKO_A_CDC_IIR1_GAIN_TIMER_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_GAIN_TIMER_CTL (0x359) -#define TAIKO_A_CDC_IIR2_GAIN_TIMER_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_COEF_B1_CTL (0x34A) -#define TAIKO_A_CDC_IIR1_COEF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_COEF_B1_CTL (0x35A) -#define TAIKO_A_CDC_IIR2_COEF_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR1_COEF_B2_CTL (0x34B) -#define TAIKO_A_CDC_IIR1_COEF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_IIR2_COEF_B2_CTL (0x35B) -#define TAIKO_A_CDC_IIR2_COEF_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_TOP_GAIN_UPDATE (0x360) -#define TAIKO_A_CDC_TOP_GAIN_UPDATE__POR (0x00) -#define TAIKO_A_CDC_COMP0_B1_CTL (0x368) -#define TAIKO_A_CDC_COMP0_B1_CTL__POR (0x30) -#define TAIKO_A_CDC_COMP1_B1_CTL (0x370) -#define TAIKO_A_CDC_COMP1_B1_CTL__POR (0x30) -#define TAIKO_A_CDC_COMP2_B1_CTL (0x378) -#define TAIKO_A_CDC_COMP2_B1_CTL__POR (0x30) -#define TAIKO_A_CDC_COMP0_B2_CTL (0x369) -#define TAIKO_A_CDC_COMP0_B2_CTL__POR (0xB5) -#define TAIKO_A_CDC_COMP1_B2_CTL (0x371) -#define TAIKO_A_CDC_COMP1_B2_CTL__POR (0xB5) -#define TAIKO_A_CDC_COMP2_B2_CTL (0x379) -#define TAIKO_A_CDC_COMP2_B2_CTL__POR (0xB5) -#define TAIKO_A_CDC_COMP0_B3_CTL (0x36A) -#define TAIKO_A_CDC_COMP0_B3_CTL__POR (0x28) -#define TAIKO_A_CDC_COMP1_B3_CTL (0x372) -#define TAIKO_A_CDC_COMP1_B3_CTL__POR (0x28) -#define TAIKO_A_CDC_COMP2_B3_CTL (0x37A) -#define TAIKO_A_CDC_COMP2_B3_CTL__POR (0x28) -#define TAIKO_A_CDC_COMP0_B4_CTL (0x36B) -#define TAIKO_A_CDC_COMP0_B4_CTL__POR (0x3C) -#define TAIKO_A_CDC_COMP1_B4_CTL (0x373) -#define TAIKO_A_CDC_COMP1_B4_CTL__POR (0x3C) -#define TAIKO_A_CDC_COMP2_B4_CTL (0x37B) -#define TAIKO_A_CDC_COMP2_B4_CTL__POR (0x3C) -#define TAIKO_A_CDC_COMP0_B5_CTL (0x36C) -#define TAIKO_A_CDC_COMP0_B5_CTL__POR (0x1F) -#define TAIKO_A_CDC_COMP1_B5_CTL (0x374) -#define TAIKO_A_CDC_COMP1_B5_CTL__POR (0x1F) -#define TAIKO_A_CDC_COMP2_B5_CTL (0x37C) -#define TAIKO_A_CDC_COMP2_B5_CTL__POR (0x1F) -#define TAIKO_A_CDC_COMP0_B6_CTL (0x36D) -#define TAIKO_A_CDC_COMP0_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_COMP1_B6_CTL (0x375) -#define TAIKO_A_CDC_COMP1_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_COMP2_B6_CTL (0x37D) -#define TAIKO_A_CDC_COMP2_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_COMP0_SHUT_DOWN_STATUS (0x36E) -#define TAIKO_A_CDC_COMP0_SHUT_DOWN_STATUS__POR (0x03) -#define TAIKO_A_CDC_COMP1_SHUT_DOWN_STATUS (0x376) -#define TAIKO_A_CDC_COMP1_SHUT_DOWN_STATUS__POR (0x03) -#define TAIKO_A_CDC_COMP2_SHUT_DOWN_STATUS (0x37E) -#define TAIKO_A_CDC_COMP2_SHUT_DOWN_STATUS__POR (0x03) -#define TAIKO_A_CDC_COMP0_FS_CFG (0x36F) -#define TAIKO_A_CDC_COMP0_FS_CFG__POR (0x03) -#define TAIKO_A_CDC_COMP1_FS_CFG (0x377) -#define TAIKO_A_CDC_COMP1_FS_CFG__POR (0x03) -#define TAIKO_A_CDC_COMP2_FS_CFG (0x37F) -#define TAIKO_A_CDC_COMP2_FS_CFG__POR (0x03) -#define TAIKO_A_CDC_CONN_RX1_B1_CTL (0x380) -#define TAIKO_A_CDC_CONN_RX1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX1_B2_CTL (0x381) -#define TAIKO_A_CDC_CONN_RX1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX1_B3_CTL (0x382) -#define TAIKO_A_CDC_CONN_RX1_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX2_B1_CTL (0x383) -#define TAIKO_A_CDC_CONN_RX2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX2_B2_CTL (0x384) -#define TAIKO_A_CDC_CONN_RX2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX2_B3_CTL (0x385) -#define TAIKO_A_CDC_CONN_RX2_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX3_B1_CTL (0x386) -#define TAIKO_A_CDC_CONN_RX3_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX3_B2_CTL (0x387) -#define TAIKO_A_CDC_CONN_RX3_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX4_B1_CTL (0x388) -#define TAIKO_A_CDC_CONN_RX4_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX4_B2_CTL (0x389) -#define TAIKO_A_CDC_CONN_RX4_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX5_B1_CTL (0x38A) -#define TAIKO_A_CDC_CONN_RX5_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX5_B2_CTL (0x38B) -#define TAIKO_A_CDC_CONN_RX5_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX6_B1_CTL (0x38C) -#define TAIKO_A_CDC_CONN_RX6_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX6_B2_CTL (0x38D) -#define TAIKO_A_CDC_CONN_RX6_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX7_B1_CTL (0x38E) -#define TAIKO_A_CDC_CONN_RX7_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX7_B2_CTL (0x38F) -#define TAIKO_A_CDC_CONN_RX7_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX7_B3_CTL (0x390) -#define TAIKO_A_CDC_CONN_RX7_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_ANC_B1_CTL (0x391) -#define TAIKO_A_CDC_CONN_ANC_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_ANC_B2_CTL (0x392) -#define TAIKO_A_CDC_CONN_ANC_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B1_CTL (0x393) -#define TAIKO_A_CDC_CONN_TX_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B2_CTL (0x394) -#define TAIKO_A_CDC_CONN_TX_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B3_CTL (0x395) -#define TAIKO_A_CDC_CONN_TX_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_B4_CTL (0x396) -#define TAIKO_A_CDC_CONN_TX_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B1_CTL (0x397) -#define TAIKO_A_CDC_CONN_EQ1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B2_CTL (0x398) -#define TAIKO_A_CDC_CONN_EQ1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B3_CTL (0x399) -#define TAIKO_A_CDC_CONN_EQ1_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ1_B4_CTL (0x39A) -#define TAIKO_A_CDC_CONN_EQ1_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B1_CTL (0x39B) -#define TAIKO_A_CDC_CONN_EQ2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B2_CTL (0x39C) -#define TAIKO_A_CDC_CONN_EQ2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B3_CTL (0x39D) -#define TAIKO_A_CDC_CONN_EQ2_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_EQ2_B4_CTL (0x39E) -#define TAIKO_A_CDC_CONN_EQ2_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC1_B1_CTL (0x39F) -#define TAIKO_A_CDC_CONN_SRC1_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC1_B2_CTL (0x3A0) -#define TAIKO_A_CDC_CONN_SRC1_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC2_B1_CTL (0x3A1) -#define TAIKO_A_CDC_CONN_SRC2_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_SRC2_B2_CTL (0x3A2) -#define TAIKO_A_CDC_CONN_SRC2_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B1_CTL (0x3A3) -#define TAIKO_A_CDC_CONN_TX_SB_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B2_CTL (0x3A4) -#define TAIKO_A_CDC_CONN_TX_SB_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B3_CTL (0x3A5) -#define TAIKO_A_CDC_CONN_TX_SB_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B4_CTL (0x3A6) -#define TAIKO_A_CDC_CONN_TX_SB_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B5_CTL (0x3A7) -#define TAIKO_A_CDC_CONN_TX_SB_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B6_CTL (0x3A8) -#define TAIKO_A_CDC_CONN_TX_SB_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B7_CTL (0x3A9) -#define TAIKO_A_CDC_CONN_TX_SB_B7_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B8_CTL (0x3AA) -#define TAIKO_A_CDC_CONN_TX_SB_B8_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B9_CTL (0x3AB) -#define TAIKO_A_CDC_CONN_TX_SB_B9_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B10_CTL (0x3AC) -#define TAIKO_A_CDC_CONN_TX_SB_B10_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_TX_SB_B11_CTL (0x3AD) -#define TAIKO_A_CDC_CONN_TX_SB_B11_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX_SB_B1_CTL (0x3AE) -#define TAIKO_A_CDC_CONN_RX_SB_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_RX_SB_B2_CTL (0x3AF) -#define TAIKO_A_CDC_CONN_RX_SB_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_CLSH_CTL (0x3B0) -#define TAIKO_A_CDC_CONN_CLSH_CTL__POR (0x00) -#define TAIKO_A_CDC_CONN_MISC (0x3B1) -#define TAIKO_A_CDC_CONN_MISC__POR (0x01) -#define TAIKO_A_CDC_CONN_MAD (0x3B2) -#define TAIKO_A_CDC_CONN_MAD__POR (0x01) -#define TAIKO_A_CDC_MBHC_EN_CTL (0x3C0) -#define TAIKO_A_CDC_MBHC_EN_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_FIR_B1_CFG (0x3C1) -#define TAIKO_A_CDC_MBHC_FIR_B1_CFG__POR (0x00) -#define TAIKO_A_CDC_MBHC_FIR_B2_CFG (0x3C2) -#define TAIKO_A_CDC_MBHC_FIR_B2_CFG__POR (0x06) -#define TAIKO_A_CDC_MBHC_TIMER_B1_CTL (0x3C3) -#define TAIKO_A_CDC_MBHC_TIMER_B1_CTL__POR (0x03) -#define TAIKO_A_CDC_MBHC_TIMER_B2_CTL (0x3C4) -#define TAIKO_A_CDC_MBHC_TIMER_B2_CTL__POR (0x09) -#define TAIKO_A_CDC_MBHC_TIMER_B3_CTL (0x3C5) -#define TAIKO_A_CDC_MBHC_TIMER_B3_CTL__POR (0x1E) -#define TAIKO_A_CDC_MBHC_TIMER_B4_CTL (0x3C6) -#define TAIKO_A_CDC_MBHC_TIMER_B4_CTL__POR (0x45) -#define TAIKO_A_CDC_MBHC_TIMER_B5_CTL (0x3C7) -#define TAIKO_A_CDC_MBHC_TIMER_B5_CTL__POR (0x04) -#define TAIKO_A_CDC_MBHC_TIMER_B6_CTL (0x3C8) -#define TAIKO_A_CDC_MBHC_TIMER_B6_CTL__POR (0x78) -#define TAIKO_A_CDC_MBHC_B1_STATUS (0x3C9) -#define TAIKO_A_CDC_MBHC_B1_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B2_STATUS (0x3CA) -#define TAIKO_A_CDC_MBHC_B2_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B3_STATUS (0x3CB) -#define TAIKO_A_CDC_MBHC_B3_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B4_STATUS (0x3CC) -#define TAIKO_A_CDC_MBHC_B4_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B5_STATUS (0x3CD) -#define TAIKO_A_CDC_MBHC_B5_STATUS__POR (0x00) -#define TAIKO_A_CDC_MBHC_B1_CTL (0x3CE) -#define TAIKO_A_CDC_MBHC_B1_CTL__POR (0xC0) -#define TAIKO_A_CDC_MBHC_B2_CTL (0x3CF) -#define TAIKO_A_CDC_MBHC_B2_CTL__POR (0x5D) -#define TAIKO_A_CDC_MBHC_VOLT_B1_CTL (0x3D0) -#define TAIKO_A_CDC_MBHC_VOLT_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B2_CTL (0x3D1) -#define TAIKO_A_CDC_MBHC_VOLT_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B3_CTL (0x3D2) -#define TAIKO_A_CDC_MBHC_VOLT_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B4_CTL (0x3D3) -#define TAIKO_A_CDC_MBHC_VOLT_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B5_CTL (0x3D4) -#define TAIKO_A_CDC_MBHC_VOLT_B5_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B6_CTL (0x3D5) -#define TAIKO_A_CDC_MBHC_VOLT_B6_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B7_CTL (0x3D6) -#define TAIKO_A_CDC_MBHC_VOLT_B7_CTL__POR (0xFF) -#define TAIKO_A_CDC_MBHC_VOLT_B8_CTL (0x3D7) -#define TAIKO_A_CDC_MBHC_VOLT_B8_CTL__POR (0x07) -#define TAIKO_A_CDC_MBHC_VOLT_B9_CTL (0x3D8) -#define TAIKO_A_CDC_MBHC_VOLT_B9_CTL__POR (0xFF) -#define TAIKO_A_CDC_MBHC_VOLT_B10_CTL (0x3D9) -#define TAIKO_A_CDC_MBHC_VOLT_B10_CTL__POR (0x7F) -#define TAIKO_A_CDC_MBHC_VOLT_B11_CTL (0x3DA) -#define TAIKO_A_CDC_MBHC_VOLT_B11_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_VOLT_B12_CTL (0x3DB) -#define TAIKO_A_CDC_MBHC_VOLT_B12_CTL__POR (0x80) -#define TAIKO_A_CDC_MBHC_CLK_CTL (0x3DC) -#define TAIKO_A_CDC_MBHC_CLK_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_INT_CTL (0x3DD) -#define TAIKO_A_CDC_MBHC_INT_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_DEBUG_CTL (0x3DE) -#define TAIKO_A_CDC_MBHC_DEBUG_CTL__POR (0x00) -#define TAIKO_A_CDC_MBHC_SPARE (0x3DF) -#define TAIKO_A_CDC_MBHC_SPARE__POR (0x00) -#define TAIKO_A_CDC_MAD_MAIN_CTL_1 (0x3E0) -#define TAIKO_A_CDC_MAD_MAIN_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_MAIN_CTL_2 (0x3E1) -#define TAIKO_A_CDC_MAD_MAIN_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_1 (0x3E2) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_2 (0x3E3) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_3 (0x3E4) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_3__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_4 (0x3E5) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_4__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_5 (0x3E6) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_5__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_6 (0x3E7) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_6__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_7 (0x3E8) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_7__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_8 (0x3E9) -#define TAIKO_A_CDC_MAD_AUDIO_CTL_8__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_PTR (0x3EA) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_PTR__POR (0x00) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_VAL (0x3EB) -#define TAIKO_A_CDC_MAD_AUDIO_IIR_CTL_VAL__POR (0x40) -#define TAIKO_A_CDC_MAD_ULTR_CTL_1 (0x3EC) -#define TAIKO_A_CDC_MAD_ULTR_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_2 (0x3ED) -#define TAIKO_A_CDC_MAD_ULTR_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_3 (0x3EE) -#define TAIKO_A_CDC_MAD_ULTR_CTL_3__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_4 (0x3EF) -#define TAIKO_A_CDC_MAD_ULTR_CTL_4__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_5 (0x3F0) -#define TAIKO_A_CDC_MAD_ULTR_CTL_5__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_6 (0x3F1) -#define TAIKO_A_CDC_MAD_ULTR_CTL_6__POR (0x00) -#define TAIKO_A_CDC_MAD_ULTR_CTL_7 (0x3F2) -#define TAIKO_A_CDC_MAD_ULTR_CTL_7__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_1 (0x3F3) -#define TAIKO_A_CDC_MAD_BEACON_CTL_1__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_2 (0x3F4) -#define TAIKO_A_CDC_MAD_BEACON_CTL_2__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_3 (0x3F5) -#define TAIKO_A_CDC_MAD_BEACON_CTL_3__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_4 (0x3F6) -#define TAIKO_A_CDC_MAD_BEACON_CTL_4__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_5 (0x3F7) -#define TAIKO_A_CDC_MAD_BEACON_CTL_5__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_6 (0x3F8) -#define TAIKO_A_CDC_MAD_BEACON_CTL_6__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_7 (0x3F9) -#define TAIKO_A_CDC_MAD_BEACON_CTL_7__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_CTL_8 (0x3FA) -#define TAIKO_A_CDC_MAD_BEACON_CTL_8__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_PTR (0x3FB) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_PTR__POR (0x00) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_VAL (0x3FC) -#define TAIKO_A_CDC_MAD_BEACON_IIR_CTL_VAL__POR (0x00) - -/* Taiko v2+ registers */ -#define TAIKO_A_CDC_TX_1_GAIN (0x153) -#define TAIKO_A_CDC_TX_1_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_2_GAIN (0x155) -#define TAIKO_A_CDC_TX_2_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_1_2_ADC_IB (0x156) -#define TAIKO_A_CDC_TX_1_2_ADC_IB__POR (0x44) -#define TAIKO_A_CDC_TX_3_GAIN (0x15D) -#define TAIKO_A_CDC_TX_3_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_4_GAIN (0x15F) -#define TAIKO_A_CDC_TX_4_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_3_4_ADC_IB (0x160) -#define TAIKO_A_CDC_TX_3_4_ADC_IB__POR (0x44) -#define TAIKO_A_CDC_TX_5_GAIN (0x167) -#define TAIKO_A_CDC_TX_5_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_6_GAIN (0x169) -#define TAIKO_A_CDC_TX_6_GAIN__POR (0x02) -#define TAIKO_A_CDC_TX_5_6_ADC_IB (0x16A) -#define TAIKO_A_CDC_TX_5_6_ADC_IB__POR (0x44) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL0 (0x270) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL0__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL1 (0x271) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL1__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL2 (0x272) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL2__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL3 (0x273) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL3__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL4 (0x274) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL4__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL5 (0x275) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL5__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL6 (0x276) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL6__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL7 (0x277) -#define TAIKO_A_CDC_SPKR_CLIPDET_VAL7__POR (0x00) -#define TAIKO_A_CDC_VBAT_GAIN_UPD_MON (0x2FA) -#define TAIKO_A_CDC_VBAT_GAIN_UPD_MON__POR (0x00) -#define TAIKO_A_CDC_VBAT_GAIN_MON_VAL (0x2FB) -#define TAIKO_A_CDC_VBAT_GAIN_MON_VAL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B1_CTL (0x361) -#define TAIKO_A_CDC_PA_RAMP_B1_CTL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B2_CTL (0x362) -#define TAIKO_A_CDC_PA_RAMP_B2_CTL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B3_CTL (0x363) -#define TAIKO_A_CDC_PA_RAMP_B3_CTL__POR (0x00) -#define TAIKO_A_CDC_PA_RAMP_B4_CTL (0x364) -#define TAIKO_A_CDC_PA_RAMP_B4_CTL__POR (0x00) -#define TAIKO_A_CDC_SPKR_CLIPDET_B1_CTL (0x365) -#define TAIKO_A_CDC_SPKR_CLIPDET_B1_CTL__POR (0x00) - -/* SLIMBUS Slave Registers */ -#define TAIKO_SLIM_PGD_PORT_INT_EN0 (0x30) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_RX_0 (0x34) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_RX_1 (0x35) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_TX_0 (0x36) -#define TAIKO_SLIM_PGD_PORT_INT_STATUS_TX_1 (0x37) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_RX_0 (0x38) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_RX_1 (0x39) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_TX_0 (0x3A) -#define TAIKO_SLIM_PGD_PORT_INT_CLR_TX_1 (0x3B) -#define TAIKO_SLIM_PGD_PORT_INT_RX_SOURCE0 (0x60) -#define TAIKO_SLIM_PGD_PORT_INT_TX_SOURCE0 (0x70) - -/* Macros for Packing Register Writes into a U32 */ -#define TAIKO_PACKED_REG_SIZE sizeof(u32) - -#define TAIKO_CODEC_PACK_ENTRY(reg, mask, val) ((val & 0xff)|\ - ((mask & 0xff) << 8)|((reg & 0xffff) << 16)) - -#define TAIKO_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ - do { \ - ((reg) = ((packed >> 16) & (0xffff))); \ - ((mask) = ((packed >> 8) & (0xff))); \ - ((val) = ((packed) & (0xff))); \ - } while (0); - -#endif diff --git a/techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h b/techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h deleted file mode 100644 index 7902cfbafad8..000000000000 --- a/techpack/audio/include/uapi/linux/mfd/wcd9xxx/wcd9xxx_registers.h +++ /dev/null @@ -1,361 +0,0 @@ -#ifndef WCD9XXX_CODEC_DIGITAL_H - -#define WCD9XXX_CODEC_DIGITAL_H - -#define WCD9XXX_A_CHIP_CTL (0x00) -#define WCD9XXX_A_CHIP_CTL__POR (0x00000000) -#define WCD9XXX_A_CHIP_STATUS (0x01) -#define WCD9XXX_A_CHIP_STATUS__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_0 (0x04) -#define WCD9XXX_A_CHIP_ID_BYTE_0__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_1 (0x05) -#define WCD9XXX_A_CHIP_ID_BYTE_1__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_2 (0x06) -#define WCD9XXX_A_CHIP_ID_BYTE_2__POR (0x00000000) -#define WCD9XXX_A_CHIP_ID_BYTE_3 (0x07) -#define WCD9XXX_A_CHIP_ID_BYTE_3__POR (0x00000001) -#define WCD9XXX_A_CHIP_VERSION (0x08) -#define WCD9XXX_A_CHIP_VERSION__POR (0x00000020) -#define WCD9XXX_A_SB_VERSION (0x09) -#define WCD9XXX_A_SB_VERSION__POR (0x00000010) -#define WCD9XXX_A_SLAVE_ID_1 (0x0C) -#define WCD9XXX_A_SLAVE_ID_1__POR (0x00000077) -#define WCD9XXX_A_SLAVE_ID_2 (0x0D) -#define WCD9XXX_A_SLAVE_ID_2__POR (0x00000066) -#define WCD9XXX_A_SLAVE_ID_3 (0x0E) -#define WCD9XXX_A_SLAVE_ID_3__POR (0x00000055) -#define WCD9XXX_A_CDC_CTL (0x80) -#define WCD9XXX_A_CDC_CTL__POR (0x00000000) -#define WCD9XXX_A_LEAKAGE_CTL (0x88) -#define WCD9XXX_A_LEAKAGE_CTL__POR (0x00000004) -#define WCD9XXX_A_INTR_MODE (0x90) -#define WCD9XXX_A_INTR_MASK0 (0x94) -#define WCD9XXX_A_INTR_STATUS0 (0x98) -#define WCD9XXX_A_INTR_CLEAR0 (0x9C) -#define WCD9XXX_A_INTR_LEVEL0 (0xA0) -#define WCD9XXX_A_INTR_LEVEL1 (0xA1) -#define WCD9XXX_A_INTR_LEVEL2 (0xA2) -#define WCD9XXX_A_RX_HPH_CNP_EN (0x1AB) -#define WCD9XXX_A_RX_HPH_CNP_EN__POR (0x80) -#define WCD9XXX_A_RX_HPH_CNP_EN (0x1AB) -#define WCD9XXX_A_RX_HPH_CNP_EN__POR (0x80) -#define WCD9XXX_A_BIAS_CENTRAL_BG_CTL (0x101) -#define WCD9XXX_A_BIAS_CENTRAL_BG_CTL__POR (0x50) -#define WCD9XXX_A_CLK_BUFF_EN1 (0x108) -#define WCD9XXX_A_CLK_BUFF_EN1__POR (0x04) -#define WCD9XXX_A_CLK_BUFF_EN2 (0x109) -#define WCD9XXX_A_CLK_BUFF_EN2__POR (0x02) -#define WCD9XXX_A_RX_COM_BIAS (0x1A2) -#define WCD9XXX_A_RX_COM_BIAS__POR (0x00) -#define WCD9XXX_A_RC_OSC_FREQ (0x1FA) -#define WCD9XXX_A_RC_OSC_FREQ__POR (0x46) -#define WCD9XXX_A_BIAS_OSC_BG_CTL (0x105) -#define WCD9XXX_A_BIAS_OSC_BG_CTL__POR (0x16) -#define WCD9XXX_A_RC_OSC_TEST (0x1FB) -#define WCD9XXX_A_RC_OSC_TEST__POR (0x0A) -#define WCD9XXX_A_CDC_CLK_MCLK_CTL (0x311) -#define WCD9XXX_A_CDC_CLK_MCLK_CTL__POR (0x00) - -#define WCD9XXX_A_CDC_MBHC_EN_CTL (0x3C0) -#define WCD9XXX_A_CDC_MBHC_EN_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_FIR_B1_CFG (0x3C1) -#define WCD9XXX_A_CDC_MBHC_FIR_B1_CFG__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_FIR_B2_CFG (0x3C2) -#define WCD9XXX_A_CDC_MBHC_FIR_B2_CFG__POR (0x06) -#define WCD9XXX_A_CDC_MBHC_TIMER_B1_CTL (0x3C3) -#define WCD9XXX_A_CDC_MBHC_TIMER_B1_CTL__POR (0x03) -#define WCD9XXX_A_CDC_MBHC_TIMER_B2_CTL (0x3C4) -#define WCD9XXX_A_CDC_MBHC_TIMER_B2_CTL__POR (0x09) -#define WCD9XXX_A_CDC_MBHC_TIMER_B3_CTL (0x3C5) -#define WCD9XXX_A_CDC_MBHC_TIMER_B3_CTL__POR (0x1E) -#define WCD9XXX_A_CDC_MBHC_TIMER_B4_CTL (0x3C6) -#define WCD9XXX_A_CDC_MBHC_TIMER_B4_CTL__POR (0x45) -#define WCD9XXX_A_CDC_MBHC_TIMER_B5_CTL (0x3C7) -#define WCD9XXX_A_CDC_MBHC_TIMER_B5_CTL__POR (0x04) -#define WCD9XXX_A_CDC_MBHC_TIMER_B6_CTL (0x3C8) -#define WCD9XXX_A_CDC_MBHC_TIMER_B6_CTL__POR (0x78) -#define WCD9XXX_A_CDC_MBHC_B1_STATUS (0x3C9) -#define WCD9XXX_A_CDC_MBHC_B1_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B2_STATUS (0x3CA) -#define WCD9XXX_A_CDC_MBHC_B2_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B3_STATUS (0x3CB) -#define WCD9XXX_A_CDC_MBHC_B3_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B4_STATUS (0x3CC) -#define WCD9XXX_A_CDC_MBHC_B4_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B5_STATUS (0x3CD) -#define WCD9XXX_A_CDC_MBHC_B5_STATUS__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_B1_CTL (0x3CE) -#define WCD9XXX_A_CDC_MBHC_B1_CTL__POR (0xC0) -#define WCD9XXX_A_CDC_MBHC_B2_CTL (0x3CF) -#define WCD9XXX_A_CDC_MBHC_B2_CTL__POR (0x5D) -#define WCD9XXX_A_CDC_MBHC_VOLT_B1_CTL (0x3D0) -#define WCD9XXX_A_CDC_MBHC_VOLT_B1_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B2_CTL (0x3D1) -#define WCD9XXX_A_CDC_MBHC_VOLT_B2_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL (0x3D2) -#define WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL (0x3D3) -#define WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL (0x3D4) -#define WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL (0x3D5) -#define WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B7_CTL (0x3D6) -#define WCD9XXX_A_CDC_MBHC_VOLT_B7_CTL__POR (0xFF) -#define WCD9XXX_A_CDC_MBHC_VOLT_B8_CTL (0x3D7) -#define WCD9XXX_A_CDC_MBHC_VOLT_B8_CTL__POR (0x07) -#define WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL (0x3D8) -#define WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL__POR (0xFF) -#define WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL (0x3D9) -#define WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL__POR (0x7F) -#define WCD9XXX_A_CDC_MBHC_VOLT_B11_CTL (0x3DA) -#define WCD9XXX_A_CDC_MBHC_VOLT_B11_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_VOLT_B12_CTL (0x3DB) -#define WCD9XXX_A_CDC_MBHC_VOLT_B12_CTL__POR (0x80) -#define WCD9XXX_A_CDC_MBHC_CLK_CTL (0x3DC) -#define WCD9XXX_A_CDC_MBHC_CLK_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_INT_CTL (0x3DD) -#define WCD9XXX_A_CDC_MBHC_INT_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_DEBUG_CTL (0x3DE) -#define WCD9XXX_A_CDC_MBHC_DEBUG_CTL__POR (0x00) -#define WCD9XXX_A_CDC_MBHC_SPARE (0x3DF) -#define WCD9XXX_A_CDC_MBHC_SPARE__POR (0x00) -#define WCD9XXX_A_MBHC_SCALING_MUX_1 (0x14E) -#define WCD9XXX_A_MBHC_SCALING_MUX_1__POR (0x00) -#define WCD9XXX_A_RX_HPH_OCP_CTL (0x1AA) -#define WCD9XXX_A_RX_HPH_OCP_CTL__POR (0x68) -#define WCD9XXX_A_MICB_1_CTL (0x12B) -#define WCD9XXX_A_MICB_1_CTL__POR (0x16) -#define WCD9XXX_A_MICB_1_INT_RBIAS (0x12C) -#define WCD9XXX_A_MICB_1_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_1_MBHC (0x12D) -#define WCD9XXX_A_MICB_1_MBHC__POR (0x01) -#define WCD9XXX_A_MICB_CFILT_2_CTL (0x12E) -#define WCD9XXX_A_MICB_CFILT_2_CTL__POR (0x40) -#define WCD9XXX_A_MICB_CFILT_2_VAL (0x12F) -#define WCD9XXX_A_MICB_CFILT_2_VAL__POR (0x80) -#define WCD9XXX_A_MICB_CFILT_2_PRECHRG (0x130) -#define WCD9XXX_A_MICB_CFILT_2_PRECHRG__POR (0x38) -#define WCD9XXX_A_MICB_2_CTL (0x131) -#define WCD9XXX_A_MICB_2_CTL__POR (0x16) -#define WCD9XXX_A_MICB_2_INT_RBIAS (0x132) -#define WCD9XXX_A_MICB_2_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_2_MBHC (0x133) -#define WCD9XXX_A_MICB_2_MBHC__POR (0x02) -#define WCD9XXX_A_MICB_CFILT_3_CTL (0x134) -#define WCD9XXX_A_MICB_CFILT_3_CTL__POR (0x40) -#define WCD9XXX_A_MICB_CFILT_3_VAL (0x135) -#define WCD9XXX_A_MICB_CFILT_3_VAL__POR (0x80) -#define WCD9XXX_A_MICB_CFILT_3_PRECHRG (0x136) -#define WCD9XXX_A_MICB_CFILT_3_PRECHRG__POR (0x38) -#define WCD9XXX_A_MICB_3_CTL (0x137) -#define WCD9XXX_A_MICB_3_CTL__POR (0x16) -#define WCD9XXX_A_MICB_3_INT_RBIAS (0x138) -#define WCD9XXX_A_MICB_3_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_3_MBHC (0x139) -#define WCD9XXX_A_MICB_3_MBHC__POR (0x00) -#define WCD9XXX_A_MICB_4_CTL (0x13D) -#define WCD9XXX_A_MICB_4_CTL__POR (0x16) -#define WCD9XXX_A_MICB_4_INT_RBIAS (0x13E) -#define WCD9XXX_A_MICB_4_INT_RBIAS__POR (0x24) -#define WCD9XXX_A_MICB_4_MBHC (0x13F) -#define WCD9XXX_A_MICB_4_MBHC__POR (0x01) -#define WCD9XXX_A_MICB_CFILT_1_VAL (0x129) -#define WCD9XXX_A_MICB_CFILT_1_VAL__POR (0x80) -#define WCD9XXX_A_RX_HPH_L_STATUS (0x1B3) -#define WCD9XXX_A_RX_HPH_L_STATUS__POR (0x00) -#define WCD9XXX_A_MBHC_HPH (0x1FE) -#define WCD9XXX_A_MBHC_HPH__POR (0x44) -#define WCD9XXX_A_RX_HPH_CNP_WG_TIME (0x1AD) -#define WCD9XXX_A_RX_HPH_CNP_WG_TIME__POR (0x2A) -#define WCD9XXX_A_RX_HPH_R_DAC_CTL (0x1B7) -#define WCD9XXX_A_RX_HPH_R_DAC_CTL__POR (0x00) -#define WCD9XXX_A_RX_HPH_L_DAC_CTL (0x1B1) -#define WCD9XXX_A_RX_HPH_L_DAC_CTL__POR (0x00) -#define WCD9XXX_A_TX_7_MBHC_EN (0x171) -#define WCD9XXX_A_TX_7_MBHC_EN__POR (0x0C) -#define WCD9XXX_A_PIN_CTL_OE0 (0x010) -#define WCD9XXX_A_PIN_CTL_OE0__POR (0x00) -#define WCD9XXX_A_PIN_CTL_OE1 (0x011) -#define WCD9XXX_A_PIN_CTL_OE1__POR (0x00) -#define WCD9XXX_A_MICB_CFILT_1_CTL (0x128) -#define WCD9XXX_A_LDO_H_MODE_1 (0x110) -#define WCD9XXX_A_LDO_H_MODE_1__POR (0x65) -#define WCD9XXX_A_MICB_CFILT_1_CTL__POR (0x40) -#define WCD9XXX_A_TX_7_MBHC_TEST_CTL (0x174) -#define WCD9XXX_A_TX_7_MBHC_TEST_CTL__POR (0x38) -#define WCD9XXX_A_MBHC_SCALING_MUX_2 (0x14F) -#define WCD9XXX_A_MBHC_SCALING_MUX_2__POR (0x80) -#define WCD9XXX_A_TX_COM_BIAS (0x14C) -#define WCD9XXX_A_TX_COM_BIAS__POR (0xF0) - -#define WCD9XXX_A_MBHC_INSERT_DETECT (0x14A) /* TAIKO and later */ -#define WCD9XXX_A_MBHC_INSERT_DETECT__POR (0x00) -#define WCD9XXX_A_MBHC_INSERT_DET_STATUS (0x14B) /* TAIKO and later */ -#define WCD9XXX_A_MBHC_INSERT_DET_STATUS__POR (0x00) -#define WCD9XXX_A_MAD_ANA_CTRL (0x150) -#define WCD9XXX_A_MAD_ANA_CTRL__POR (0xF1) - - -#define WCD9XXX_A_CDC_CLK_OTHR_CTL (0x30C) -#define WCD9XXX_A_CDC_CLK_OTHR_CTL__POR (0x00) - -/* Class H related common registers */ -#define WCD9XXX_A_BUCK_MODE_1 (0x181) -#define WCD9XXX_A_BUCK_MODE_1__POR (0x21) -#define WCD9XXX_A_BUCK_MODE_2 (0x182) -#define WCD9XXX_A_BUCK_MODE_2__POR (0xFF) -#define WCD9XXX_A_BUCK_MODE_3 (0x183) -#define WCD9XXX_A_BUCK_MODE_3__POR (0xCC) -#define WCD9XXX_A_BUCK_MODE_4 (0x184) -#define WCD9XXX_A_BUCK_MODE_4__POR (0x3A) -#define WCD9XXX_A_BUCK_MODE_5 (0x185) -#define WCD9XXX_A_BUCK_MODE_5__POR (0x00) -#define WCD9XXX_A_BUCK_CTRL_VCL_1 (0x186) -#define WCD9XXX_A_BUCK_CTRL_VCL_1__POR (0x48) -#define WCD9XXX_A_BUCK_CTRL_VCL_2 (0x187) -#define WCD9XXX_A_BUCK_CTRL_VCL_2__POR (0xA3) -#define WCD9XXX_A_BUCK_CTRL_VCL_3 (0x188) -#define WCD9XXX_A_BUCK_CTRL_VCL_3__POR (0x82) -#define WCD9XXX_A_BUCK_CTRL_CCL_1 (0x189) -#define WCD9XXX_A_BUCK_CTRL_CCL_1__POR (0xAB) -#define WCD9XXX_A_BUCK_CTRL_CCL_2 (0x18A) -#define WCD9XXX_A_BUCK_CTRL_CCL_2__POR (0xDC) -#define WCD9XXX_A_BUCK_CTRL_CCL_3 (0x18B) -#define WCD9XXX_A_BUCK_CTRL_CCL_3__POR (0x6A) -#define WCD9XXX_A_BUCK_CTRL_CCL_4 (0x18C) -#define WCD9XXX_A_BUCK_CTRL_CCL_4__POR (0x58) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_1 (0x18D) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_1__POR (0x50) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_2 (0x18E) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_2__POR (0x64) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_3 (0x18F) -#define WCD9XXX_A_BUCK_CTRL_PWM_DRVR_3__POR (0x77) -#define WCD9XXX_A_BUCK_TMUX_A_D (0x190) -#define WCD9XXX_A_BUCK_TMUX_A_D__POR (0x00) -#define WCD9XXX_A_NCP_EN (0x192) -#define WCD9XXX_A_NCP_EN__POR (0xFE) -#define WCD9XXX_A_NCP_STATIC (0x194) -#define WCD9XXX_A_NCP_STATIC__POR (0x28) -#define WCD9XXX_A_NCP_BUCKREF (0x191) -#define WCD9XXX_A_NCP_BUCKREF__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_B1_CTL (0x320) -#define WCD9XXX_A_CDC_CLSH_B1_CTL__POR (0xE4) -#define WCD9XXX_A_CDC_CLSH_B2_CTL (0x321) -#define WCD9XXX_A_CDC_CLSH_B2_CTL__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_B3_CTL (0x322) -#define WCD9XXX_A_CDC_CLSH_B3_CTL__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_BUCK_NCP_VARS (0x323) -#define WCD9XXX_A_CDC_CLSH_BUCK_NCP_VARS__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_IDLE_HPH_THSD (0x324) -#define WCD9XXX_A_CDC_CLSH_IDLE_HPH_THSD__POR (0x12) -#define WCD9XXX_A_CDC_CLSH_IDLE_EAR_THSD (0x325) -#define WCD9XXX_A_CDC_CLSH_IDLE_EAR_THSD__POR (0x0C) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_HPH_THSD (0x326) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_HPH_THSD__POR (0x18) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_EAR_THSD (0x327) -#define WCD9XXX_A_CDC_CLSH_FCLKONLY_EAR_THSD__POR (0x23) -#define WCD9XXX_A_CDC_CLSH_K_ADDR (0x328) -#define WCD9XXX_A_CDC_CLSH_K_ADDR__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_K_DATA (0x329) -#define WCD9XXX_A_CDC_CLSH_K_DATA__POR (0xA4) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_L (0x32A) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_L__POR (0xD7) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_U (0x32B) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_HPH_U__POR (0x05) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_L (0x32C) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_L__POR (0x60) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_U (0x32D) -#define WCD9XXX_A_CDC_CLSH_I_PA_FACT_EAR_U__POR (0x09) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_EAR (0x32E) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_EAR__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_HPH (0x32F) -#define WCD9XXX_A_CDC_CLSH_V_PA_HD_HPH__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_EAR (0x330) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_EAR__POR (0x00) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_HPH (0x331) -#define WCD9XXX_A_CDC_CLSH_V_PA_MIN_HPH__POR (0x00) - -#define WCD9XXX_A_CDC_RX1_B6_CTL (0x2B5) -#define WCD9XXX_A_CDC_RX1_B6_CTL__POR (0x80) -#define WCD9XXX_A_CDC_RX2_B6_CTL (0x2BD) -#define WCD9XXX_A_CDC_RX2_B6_CTL__POR (0x80) -#define WCD9XXX_A_RX_HPH_L_GAIN (0x1AE) -#define WCD9XXX_A_RX_HPH_L_GAIN__POR (0x00) -#define WCD9XXX_A_RX_HPH_R_GAIN (0x1B4) -#define WCD9XXX_A_RX_HPH_R_GAIN__POR (0x00) -#define WCD9XXX_A_RX_HPH_CHOP_CTL (0x1A5) -#define WCD9XXX_A_RX_HPH_CHOP_CTL__POR (0xB4) -#define WCD9XXX_A_RX_HPH_BIAS_PA (0x1A6) -#define WCD9XXX_A_RX_HPH_BIAS_PA__POR (0x7A) -#define WCD9XXX_A_RX_HPH_L_TEST (0x1AF) -#define WCD9XXX_A_RX_HPH_L_TEST__POR (0x00) -#define WCD9XXX_A_RX_HPH_R_TEST (0x1B5) -#define WCD9XXX_A_RX_HPH_R_TEST__POR (0x00) -#define WCD9XXX_A_CDC_CLK_RX_B1_CTL (0x30F) -#define WCD9XXX_A_CDC_CLK_RX_B1_CTL__POR (0x00) -#define WCD9XXX_A_NCP_CLK (0x193) -#define WCD9XXX_A_NCP_CLK__POR (0x94) -#define WCD9XXX_A_RX_HPH_BIAS_WG_OCP (0x1A9) -#define WCD9XXX_A_RX_HPH_BIAS_WG_OCP__POR (0x2A) -#define WCD9XXX_A_RX_HPH_CNP_WG_CTL (0x1AC) -#define WCD9XXX_A_RX_HPH_CNP_WG_CTL__POR (0xDE) -#define WCD9XXX_A_RX_HPH_L_PA_CTL (0x1B0) -#define WCD9XXX_A_RX_HPH_L_PA_CTL__POR (0x42) -#define WCD9XXX_A_RX_HPH_R_PA_CTL (0x1B6) -#define WCD9XXX_A_RX_HPH_R_PA_CTL__POR (0x42) -#define WCD9XXX_A_CDC_CONN_RX2_B1_CTL (0x383) -#define WCD9XXX_A_CDC_CONN_RX2_B1_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B1_CTL (0x361) -#define WCD9XXX_A_CDC_PA_RAMP_B1_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B2_CTL (0x362) -#define WCD9XXX_A_CDC_PA_RAMP_B2_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B3_CTL (0x363) -#define WCD9XXX_A_CDC_PA_RAMP_B3_CTL__POR (0x00) -#define WCD9XXX_A_CDC_PA_RAMP_B4_CTL (0x364) -#define WCD9XXX_A_CDC_PA_RAMP_B4_CTL__POR (0x00) - -#define WCD9330_A_LEAKAGE_CTL (0x03C) -#define WCD9330_A_LEAKAGE_CTL__POR (0x04) -#define WCD9330_A_CDC_CTL (0x034) -#define WCD9330_A_CDC_CTL__POR (0x00) - -/* Class-H registers for codecs from and above WCD9335 */ -#define WCD9XXX_A_CDC_RX0_RX_PATH_CFG0 (0xB42) -#define WCD9XXX_A_CDC_RX1_RX_PATH_CFG0 (0xB56) -#define WCD9XXX_A_CDC_RX2_RX_PATH_CFG0 (0xB6A) -#define WCD9XXX_A_CDC_CLSH_K1_MSB (0xC08) -#define WCD9XXX_A_CDC_CLSH_K1_LSB (0xC09) -#define WCD9XXX_A_ANA_RX_SUPPLIES (0x608) -#define WCD9XXX_A_ANA_HPH (0x609) -#define WCD9XXX_A_CDC_CLSH_CRC (0xC01) -#define WCD9XXX_FLYBACK_EN (0x6A4) -#define WCD9XXX_FLYBACK_VNEG_CTRL_1 (0x6A5) -#define WCD9XXX_FLYBACK_VNEGDAC_CTRL_2 (0x6AF) -#define WCD9XXX_RX_BIAS_FLYB_BUFF (0x6C7) -#define WCD9XXX_HPH_L_EN (0x6D3) -#define WCD9XXX_HPH_R_EN (0x6D6) -#define WCD9XXX_HPH_REFBUFF_UHQA_CTL (0x6DD) -#define WCD9XXX_CLASSH_CTRL_VCL_2 (0x69B) -#define WCD9XXX_CDC_CLSH_HPH_V_PA (0xC04) -#define WCD9XXX_CDC_RX0_RX_PATH_SEC0 (0xB49) -#define WCD9XXX_CDC_RX1_RX_PATH_CTL (0xB55) -#define WCD9XXX_CDC_RX2_RX_PATH_CTL (0xB69) -#define WCD9XXX_CDC_CLK_RST_CTRL_MCLK_CONTROL (0xD41) -#define WCD9XXX_CLASSH_CTRL_CCL_1 (0x69C) - -/* RX Gain control registers of codecs from and above WCD9335 */ -#define WCD9XXX_CDC_RX1_RX_VOL_CTL (0xB59) -#define WCD9XXX_CDC_RX1_RX_VOL_MIX_CTL (0xB5C) -#define WCD9XXX_CDC_RX1_RX_PATH_SEC1 (0xB5E) -#define WCD9XXX_CDC_RX2_RX_VOL_CTL (0xB6D) -#define WCD9XXX_CDC_RX2_RX_VOL_MIX_CTL (0xB70) -#define WCD9XXX_CDC_RX2_RX_PATH_SEC1 (0xB72) - -/* Class-H registers for codecs from and above WCD934X */ -#define WCD9XXX_HPH_CNP_WG_CTL (0x06cc) -#define WCD9XXX_FLYBACK_VNEG_CTRL_4 (0x06a8) -#define WCD9XXX_HPH_NEW_INT_PA_MISC2 (0x0738) -#define WCD9XXX_RX_BIAS_HPH_LOWPOWER (0x06bf) -#define WCD9XXX_HPH_PA_CTL1 (0x06d1) -#endif diff --git a/techpack/audio/include/uapi/linux/msm_audio.h b/techpack/audio/include/uapi/linux/msm_audio.h deleted file mode 100644 index 3213d00842c0..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio.h +++ /dev/null @@ -1,475 +0,0 @@ -/* include/linux/msm_audio.h - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2012, 2014, 2017 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _UAPI_LINUX_MSM_AUDIO_H -#define _UAPI_LINUX_MSM_AUDIO_H - -#include -#include - -/* PCM Audio */ - -#define AUDIO_IOCTL_MAGIC 'a' - -#define AUDIO_START _IOW(AUDIO_IOCTL_MAGIC, 0, unsigned int) -#define AUDIO_STOP _IOW(AUDIO_IOCTL_MAGIC, 1, unsigned int) -#define AUDIO_FLUSH _IOW(AUDIO_IOCTL_MAGIC, 2, unsigned int) -#define AUDIO_GET_CONFIG _IOR(AUDIO_IOCTL_MAGIC, 3, \ - struct msm_audio_config) -#define AUDIO_SET_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 4, \ - struct msm_audio_config) -#define AUDIO_GET_STATS _IOR(AUDIO_IOCTL_MAGIC, 5, \ - struct msm_audio_stats) -#define AUDIO_ENABLE_AUDPP _IOW(AUDIO_IOCTL_MAGIC, 6, unsigned int) -#define AUDIO_SET_ADRC _IOW(AUDIO_IOCTL_MAGIC, 7, unsigned int) -#define AUDIO_SET_EQ _IOW(AUDIO_IOCTL_MAGIC, 8, unsigned int) -#define AUDIO_SET_RX_IIR _IOW(AUDIO_IOCTL_MAGIC, 9, unsigned int) -#define AUDIO_SET_VOLUME _IOW(AUDIO_IOCTL_MAGIC, 10, unsigned int) -#define AUDIO_PAUSE _IOW(AUDIO_IOCTL_MAGIC, 11, unsigned int) -#define AUDIO_PLAY_DTMF _IOW(AUDIO_IOCTL_MAGIC, 12, unsigned int) -#define AUDIO_GET_EVENT _IOR(AUDIO_IOCTL_MAGIC, 13, \ - struct msm_audio_event) -#define AUDIO_ABORT_GET_EVENT _IOW(AUDIO_IOCTL_MAGIC, 14, unsigned int) -#define AUDIO_REGISTER_PMEM _IOW(AUDIO_IOCTL_MAGIC, 15, unsigned int) -#define AUDIO_DEREGISTER_PMEM _IOW(AUDIO_IOCTL_MAGIC, 16, unsigned int) -#define AUDIO_ASYNC_WRITE _IOW(AUDIO_IOCTL_MAGIC, 17, \ - struct msm_audio_aio_buf) -#define AUDIO_ASYNC_READ _IOW(AUDIO_IOCTL_MAGIC, 18, \ - struct msm_audio_aio_buf) -#define AUDIO_SET_INCALL _IOW(AUDIO_IOCTL_MAGIC, 19, struct msm_voicerec_mode) -#define AUDIO_GET_NUM_SND_DEVICE _IOR(AUDIO_IOCTL_MAGIC, 20, unsigned int) -#define AUDIO_GET_SND_DEVICES _IOWR(AUDIO_IOCTL_MAGIC, 21, \ - struct msm_snd_device_list) -#define AUDIO_ENABLE_SND_DEVICE _IOW(AUDIO_IOCTL_MAGIC, 22, unsigned int) -#define AUDIO_DISABLE_SND_DEVICE _IOW(AUDIO_IOCTL_MAGIC, 23, unsigned int) -#define AUDIO_ROUTE_STREAM _IOW(AUDIO_IOCTL_MAGIC, 24, \ - struct msm_audio_route_config) -#define AUDIO_GET_PCM_CONFIG _IOR(AUDIO_IOCTL_MAGIC, 30, unsigned int) -#define AUDIO_SET_PCM_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 31, unsigned int) -#define AUDIO_SWITCH_DEVICE _IOW(AUDIO_IOCTL_MAGIC, 32, unsigned int) -#define AUDIO_SET_MUTE _IOW(AUDIO_IOCTL_MAGIC, 33, unsigned int) -#define AUDIO_UPDATE_ACDB _IOW(AUDIO_IOCTL_MAGIC, 34, unsigned int) -#define AUDIO_START_VOICE _IOW(AUDIO_IOCTL_MAGIC, 35, unsigned int) -#define AUDIO_STOP_VOICE _IOW(AUDIO_IOCTL_MAGIC, 36, unsigned int) -#define AUDIO_REINIT_ACDB _IOW(AUDIO_IOCTL_MAGIC, 39, unsigned int) -#define AUDIO_OUTPORT_FLUSH _IOW(AUDIO_IOCTL_MAGIC, 40, unsigned short) -#define AUDIO_SET_ERR_THRESHOLD_VALUE _IOW(AUDIO_IOCTL_MAGIC, 41, \ - unsigned short) -#define AUDIO_GET_BITSTREAM_ERROR_INFO _IOR(AUDIO_IOCTL_MAGIC, 42, \ - struct msm_audio_bitstream_error_info) - -#define AUDIO_SET_SRS_TRUMEDIA_PARAM _IOW(AUDIO_IOCTL_MAGIC, 43, unsigned int) - -/* Qualcomm technologies inc extensions */ -#define AUDIO_SET_STREAM_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 80, \ - struct msm_audio_stream_config) -#define AUDIO_GET_STREAM_CONFIG _IOR(AUDIO_IOCTL_MAGIC, 81, \ - struct msm_audio_stream_config) -#define AUDIO_GET_SESSION_ID _IOR(AUDIO_IOCTL_MAGIC, 82, unsigned short) -#define AUDIO_GET_STREAM_INFO _IOR(AUDIO_IOCTL_MAGIC, 83, \ - struct msm_audio_bitstream_info) -#define AUDIO_SET_PAN _IOW(AUDIO_IOCTL_MAGIC, 84, unsigned int) -#define AUDIO_SET_QCONCERT_PLUS _IOW(AUDIO_IOCTL_MAGIC, 85, unsigned int) -#define AUDIO_SET_MBADRC _IOW(AUDIO_IOCTL_MAGIC, 86, unsigned int) -#define AUDIO_SET_VOLUME_PATH _IOW(AUDIO_IOCTL_MAGIC, 87, \ - struct msm_vol_info) -#define AUDIO_SET_MAX_VOL_ALL _IOW(AUDIO_IOCTL_MAGIC, 88, unsigned int) -#define AUDIO_ENABLE_AUDPRE _IOW(AUDIO_IOCTL_MAGIC, 89, unsigned int) -#define AUDIO_SET_AGC _IOW(AUDIO_IOCTL_MAGIC, 90, unsigned int) -#define AUDIO_SET_NS _IOW(AUDIO_IOCTL_MAGIC, 91, unsigned int) -#define AUDIO_SET_TX_IIR _IOW(AUDIO_IOCTL_MAGIC, 92, unsigned int) -#define AUDIO_GET_BUF_CFG _IOW(AUDIO_IOCTL_MAGIC, 93, \ - struct msm_audio_buf_cfg) -#define AUDIO_SET_BUF_CFG _IOW(AUDIO_IOCTL_MAGIC, 94, \ - struct msm_audio_buf_cfg) -#define AUDIO_SET_ACDB_BLK _IOW(AUDIO_IOCTL_MAGIC, 95, \ - struct msm_acdb_cmd_device) -#define AUDIO_GET_ACDB_BLK _IOW(AUDIO_IOCTL_MAGIC, 96, \ - struct msm_acdb_cmd_device) - -#define AUDIO_REGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 97, \ - struct msm_audio_ion_info) -#define AUDIO_DEREGISTER_ION _IOW(AUDIO_IOCTL_MAGIC, 98, \ - struct msm_audio_ion_info) -#define AUDIO_SET_EFFECTS_CONFIG _IOW(AUDIO_IOCTL_MAGIC, 99, \ - struct msm_hwacc_effects_config) -#define AUDIO_EFFECTS_SET_BUF_LEN _IOW(AUDIO_IOCTL_MAGIC, 100, \ - struct msm_hwacc_buf_cfg) -#define AUDIO_EFFECTS_GET_BUF_AVAIL _IOW(AUDIO_IOCTL_MAGIC, 101, \ - struct msm_hwacc_buf_avail) -#define AUDIO_EFFECTS_WRITE _IOW(AUDIO_IOCTL_MAGIC, 102, void *) -#define AUDIO_EFFECTS_READ _IOWR(AUDIO_IOCTL_MAGIC, 103, void *) -#define AUDIO_EFFECTS_SET_PP_PARAMS _IOW(AUDIO_IOCTL_MAGIC, 104, void *) - -#define AUDIO_PM_AWAKE _IOW(AUDIO_IOCTL_MAGIC, 105, unsigned int) -#define AUDIO_PM_RELAX _IOW(AUDIO_IOCTL_MAGIC, 106, unsigned int) - -#define AUDIO_MAX_COMMON_IOCTL_NUM 107 - - -#define HANDSET_MIC 0x01 -#define HANDSET_SPKR 0x02 -#define HEADSET_MIC 0x03 -#define HEADSET_SPKR_MONO 0x04 -#define HEADSET_SPKR_STEREO 0x05 -#define SPKR_PHONE_MIC 0x06 -#define SPKR_PHONE_MONO 0x07 -#define SPKR_PHONE_STEREO 0x08 -#define BT_SCO_MIC 0x09 -#define BT_SCO_SPKR 0x0A -#define BT_A2DP_SPKR 0x0B -#define TTY_HEADSET_MIC 0x0C -#define TTY_HEADSET_SPKR 0x0D - -/* Default devices are not supported in a */ -/* device switching context. Only supported */ -/* for stream devices. */ -/* DO NOT USE */ -#define DEFAULT_TX 0x0E -#define DEFAULT_RX 0x0F - -#define BT_A2DP_TX 0x10 - -#define HEADSET_MONO_PLUS_SPKR_MONO_RX 0x11 -#define HEADSET_MONO_PLUS_SPKR_STEREO_RX 0x12 -#define HEADSET_STEREO_PLUS_SPKR_MONO_RX 0x13 -#define HEADSET_STEREO_PLUS_SPKR_STEREO_RX 0x14 - -#define I2S_RX 0x20 -#define I2S_TX 0x21 - -#define ADRC_ENABLE 0x0001 -#define EQUALIZER_ENABLE 0x0002 -#define IIR_ENABLE 0x0004 -#define QCONCERT_PLUS_ENABLE 0x0008 -#define MBADRC_ENABLE 0x0010 -#define SRS_ENABLE 0x0020 -#define SRS_DISABLE 0x0040 - -#define AGC_ENABLE 0x0001 -#define NS_ENABLE 0x0002 -#define TX_IIR_ENABLE 0x0004 -#define FLUENCE_ENABLE 0x0008 - -#define VOC_REC_UPLINK 0x00 -#define VOC_REC_DOWNLINK 0x01 -#define VOC_REC_BOTH 0x02 - -struct msm_audio_config { - uint32_t buffer_size; - uint32_t buffer_count; - uint32_t channel_count; - uint32_t sample_rate; - uint32_t type; - uint32_t meta_field; - uint32_t bits; - uint32_t unused[3]; -}; - -struct msm_audio_stream_config { - uint32_t buffer_size; - uint32_t buffer_count; -}; - -struct msm_audio_buf_cfg { - uint32_t meta_info_enable; - uint32_t frames_per_buf; -}; - -struct msm_audio_stats { - uint32_t byte_count; - uint32_t sample_count; - uint32_t unused[2]; -}; - -struct msm_audio_ion_info { - int fd; - void *vaddr; -}; - -struct msm_audio_pmem_info { - int fd; - void *vaddr; -}; - -struct msm_audio_aio_buf { - void *buf_addr; - uint32_t buf_len; - uint32_t data_len; - void *private_data; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -/* Audio routing */ - -#define SND_IOCTL_MAGIC 's' - -#define SND_MUTE_UNMUTED 0 -#define SND_MUTE_MUTED 1 - -struct msm_mute_info { - uint32_t mute; - uint32_t path; -}; - -struct msm_vol_info { - uint32_t vol; - uint32_t path; -}; - -struct msm_voicerec_mode { - uint32_t rec_mode; -}; - -struct msm_snd_device_config { - uint32_t device; - uint32_t ear_mute; - uint32_t mic_mute; -}; - -#define SND_SET_DEVICE _IOW(SND_IOCTL_MAGIC, 2, struct msm_device_config *) - -enum cad_device_path_type { - CAD_DEVICE_PATH_RX, /*For Decoding session*/ - CAD_DEVICE_PATH_TX, /* For Encoding session*/ - CAD_DEVICE_PATH_RX_TX, /* For Voice call */ - CAD_DEVICE_PATH_LB, /* For loopback (FM Analog)*/ - CAD_DEVICE_PATH_MAX -}; - -struct cad_devices_type { - uint32_t rx_device; - uint32_t tx_device; - enum cad_device_path_type pathtype; -}; - -struct msm_cad_device_config { - struct cad_devices_type device; - uint32_t ear_mute; - uint32_t mic_mute; -}; - -#define CAD_SET_DEVICE _IOW(SND_IOCTL_MAGIC, 2, struct msm_cad_device_config *) - -#define SND_METHOD_VOICE 0 -#define SND_METHOD_MIDI 4 - -struct msm_snd_volume_config { - uint32_t device; - uint32_t method; - uint32_t volume; -}; - -#define SND_SET_VOLUME _IOW(SND_IOCTL_MAGIC, 3, struct msm_snd_volume_config *) - -struct msm_cad_volume_config { - struct cad_devices_type device; - uint32_t method; - uint32_t volume; -}; - -#define CAD_SET_VOLUME _IOW(SND_IOCTL_MAGIC, 3, struct msm_cad_volume_config *) - -/* Returns the number of SND endpoints supported. */ - -#define SND_GET_NUM_ENDPOINTS _IOR(SND_IOCTL_MAGIC, 4, unsigned int *) - -struct msm_snd_endpoint { - int id; /* input and output */ - char name[64]; /* output only */ -}; - -/* Takes an index between 0 and one less than the number returned by - * SND_GET_NUM_ENDPOINTS, and returns the SND index and name of a - * SND endpoint. On input, the .id field contains the number of the - * endpoint, and on exit it contains the SND index, while .name contains - * the description of the endpoint. - */ - -#define SND_GET_ENDPOINT _IOWR(SND_IOCTL_MAGIC, 5, struct msm_snd_endpoint *) - - -#define SND_AVC_CTL _IOW(SND_IOCTL_MAGIC, 6, unsigned int *) -#define SND_AGC_CTL _IOW(SND_IOCTL_MAGIC, 7, unsigned int *) - -/*return the number of CAD endpoints supported. */ - -#define CAD_GET_NUM_ENDPOINTS _IOR(SND_IOCTL_MAGIC, 4, unsigned int *) - -struct msm_cad_endpoint { - int id; /* input and output */ - char name[64]; /* output only */ -}; - -/* Takes an index between 0 and one less than the number returned by - * SND_GET_NUM_ENDPOINTS, and returns the CAD index and name of a - * CAD endpoint. On input, the .id field contains the number of the - * endpoint, and on exit it contains the SND index, while .name contains - * the description of the endpoint. - */ - -#define CAD_GET_ENDPOINT _IOWR(SND_IOCTL_MAGIC, 5, struct msm_cad_endpoint *) - -struct msm_audio_pcm_config { - uint32_t pcm_feedback; /* 0 - disable > 0 - enable */ - uint32_t buffer_count; /* Number of buffers to allocate */ - uint32_t buffer_size; /* Size of buffer for capturing of - * PCM samples - */ -}; - -#define AUDIO_EVENT_SUSPEND 0 -#define AUDIO_EVENT_RESUME 1 -#define AUDIO_EVENT_WRITE_DONE 2 -#define AUDIO_EVENT_READ_DONE 3 -#define AUDIO_EVENT_STREAM_INFO 4 -#define AUDIO_EVENT_BITSTREAM_ERROR_INFO 5 - -#define AUDIO_CODEC_TYPE_MP3 0 -#define AUDIO_CODEC_TYPE_AAC 1 - -struct msm_audio_bitstream_info { - uint32_t codec_type; - uint32_t chan_info; - uint32_t sample_rate; - uint32_t bit_stream_info; - uint32_t bit_rate; - uint32_t unused[3]; -}; - -struct msm_audio_bitstream_error_info { - uint32_t dec_id; - uint32_t err_msg_indicator; - uint32_t err_type; -}; - -union msm_audio_event_payload { - struct msm_audio_aio_buf aio_buf; - struct msm_audio_bitstream_info stream_info; - struct msm_audio_bitstream_error_info error_info; - int reserved; -}; - -struct msm_audio_event { - int event_type; - int timeout_ms; - union msm_audio_event_payload event_payload; -}; - -#define MSM_SNDDEV_CAP_RX 0x1 -#define MSM_SNDDEV_CAP_TX 0x2 -#define MSM_SNDDEV_CAP_VOICE 0x4 - -struct msm_snd_device_info { - uint32_t dev_id; - uint32_t dev_cap; /* bitmask describe capability of device */ - char dev_name[64]; -}; - -struct msm_snd_device_list { - uint32_t num_dev; /* Indicate number of device info to be retrieved */ - struct msm_snd_device_info *list; -}; - -struct msm_dtmf_config { - uint16_t path; - uint16_t dtmf_hi; - uint16_t dtmf_low; - uint16_t duration; - uint16_t tx_gain; - uint16_t rx_gain; - uint16_t mixing; -}; - -#define AUDIO_ROUTE_STREAM_VOICE_RX 0 -#define AUDIO_ROUTE_STREAM_VOICE_TX 1 -#define AUDIO_ROUTE_STREAM_PLAYBACK 2 -#define AUDIO_ROUTE_STREAM_REC 3 - -struct msm_audio_route_config { - uint32_t stream_type; - uint32_t stream_id; - uint32_t dev_id; -}; - -#define AUDIO_MAX_EQ_BANDS 12 - -struct msm_audio_eq_band { - uint16_t band_idx; /* The band index, 0 .. 11 */ - uint32_t filter_type; /* Filter band type */ - uint32_t center_freq_hz; /* Filter band center frequency */ - uint32_t filter_gain; /* Filter band initial gain (dB) */ - /* Range is +12 dB to -12 dB with 1dB increments. */ - uint32_t q_factor; -} __attribute__ ((packed)); - -struct msm_audio_eq_stream_config { - uint32_t enable; /* Number of consequtive bands specified */ - uint32_t num_bands; - struct msm_audio_eq_band eq_bands[AUDIO_MAX_EQ_BANDS]; -} __attribute__ ((packed)); - -struct msm_acdb_cmd_device { - uint32_t command_id; - uint32_t device_id; - uint32_t network_id; - uint32_t sample_rate_id; /* Actual sample rate value */ - uint32_t interface_id; /* See interface id's above */ - uint32_t algorithm_block_id; /* See enumerations above */ - uint32_t total_bytes; /* Length in bytes used by buffer */ - uint32_t *phys_buf; /* Physical Address of data */ -}; - -struct msm_hwacc_data_config { - __u32 buf_size; - __u32 num_buf; - __u32 num_channels; - __u8 channel_map[8]; - __u32 sample_rate; - __u32 bits_per_sample; -}; - -struct msm_hwacc_buf_cfg { - __u32 input_len; - __u32 output_len; -}; - -struct msm_hwacc_buf_avail { - __u32 input_num_avail; - __u32 output_num_avail; -}; - -struct msm_hwacc_effects_config { - struct msm_hwacc_data_config input; - struct msm_hwacc_data_config output; - struct msm_hwacc_buf_cfg buf_cfg; - __u32 meta_mode_enabled; - __u32 overwrite_topology; - __s32 topology; -}; - -#define ADSP_STREAM_PP_EVENT 0 -#define ADSP_STREAM_ENCDEC_EVENT 1 -#define ADSP_STREAM_IEC_61937_FMT_UPDATE_EVENT 2 -#define ADSP_STREAM_EVENT_MAX 3 - -struct msm_adsp_event_data { - __u32 event_type; - __u32 payload_len; - __u8 payload[0]; -}; - -#endif diff --git a/techpack/audio/include/uapi/linux/msm_audio_aac.h b/techpack/audio/include/uapi/linux/msm_audio_aac.h deleted file mode 100644 index 7e1e1b72424a..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_aac.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AAC_H -#define _UAPI_MSM_AUDIO_AAC_H - -#include - -#define AUDIO_SET_AAC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_aac_config) -#define AUDIO_GET_AAC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_aac_config) - -#define AUDIO_SET_AAC_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_aac_enc_config) - -#define AUDIO_GET_AAC_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+4), struct msm_audio_aac_enc_config) - -#define AUDIO_SET_AAC_MIX_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+5), uint32_t) - -#define AUDIO_AAC_FORMAT_ADTS -1 -#define AUDIO_AAC_FORMAT_RAW 0x0000 -#define AUDIO_AAC_FORMAT_PSUEDO_RAW 0x0001 -#define AUDIO_AAC_FORMAT_LOAS 0x0002 -#define AUDIO_AAC_FORMAT_ADIF 0x0003 - -#define AUDIO_AAC_OBJECT_LC 0x0002 -#define AUDIO_AAC_OBJECT_LTP 0x0004 -#define AUDIO_AAC_OBJECT_ERLC 0x0011 -#define AUDIO_AAC_OBJECT_BSAC 0x0016 - -#define AUDIO_AAC_SEC_DATA_RES_ON 0x0001 -#define AUDIO_AAC_SEC_DATA_RES_OFF 0x0000 - -#define AUDIO_AAC_SCA_DATA_RES_ON 0x0001 -#define AUDIO_AAC_SCA_DATA_RES_OFF 0x0000 - -#define AUDIO_AAC_SPEC_DATA_RES_ON 0x0001 -#define AUDIO_AAC_SPEC_DATA_RES_OFF 0x0000 - -#define AUDIO_AAC_SBR_ON_FLAG_ON 0x0001 -#define AUDIO_AAC_SBR_ON_FLAG_OFF 0x0000 - -#define AUDIO_AAC_SBR_PS_ON_FLAG_ON 0x0001 -#define AUDIO_AAC_SBR_PS_ON_FLAG_OFF 0x0000 - -/* Primary channel on both left and right channels */ -#define AUDIO_AAC_DUAL_MONO_PL_PR 0 -/* Secondary channel on both left and right channels */ -#define AUDIO_AAC_DUAL_MONO_SL_SR 1 -/* Primary channel on right channel and 2nd on left channel */ -#define AUDIO_AAC_DUAL_MONO_SL_PR 2 -/* 2nd channel on right channel and primary on left channel */ -#define AUDIO_AAC_DUAL_MONO_PL_SR 3 - -struct msm_audio_aac_config { - signed short format; - unsigned short audio_object; - unsigned short ep_config; /* 0 ~ 3 useful only obj = ERLC */ - unsigned short aac_section_data_resilience_flag; - unsigned short aac_scalefactor_data_resilience_flag; - unsigned short aac_spectral_data_resilience_flag; - unsigned short sbr_on_flag; - unsigned short sbr_ps_on_flag; - unsigned short dual_mono_mode; - unsigned short channel_configuration; - unsigned short sample_rate; -}; - -struct msm_audio_aac_enc_config { - uint32_t channels; - uint32_t sample_rate; - uint32_t bit_rate; - uint32_t stream_format; -}; - -#endif /* _UAPI_MSM_AUDIO_AAC_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_ac3.h b/techpack/audio/include/uapi/linux/msm_audio_ac3.h deleted file mode 100644 index 1df6e6949ccf..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_ac3.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AC3_H -#define _UAPI_MSM_AUDIO_AC3_H - -#include - -#define AUDIO_SET_AC3_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_GET_AC3_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) - -#define AUDAC3_DEF_WORDSIZE 0 -#define AUDAC3_DEF_USER_DOWNMIX_FLAG 0x0 -#define AUDAC3_DEF_USER_KARAOKE_FLAG 0x0 -#define AUDAC3_DEF_ERROR_CONCEALMENT 0 -#define AUDAC3_DEF_MAX_REPEAT_COUNT 0 - -struct msm_audio_ac3_config { - unsigned short numChans; - unsigned short wordSize; - unsigned short kCapableMode; - unsigned short compMode; - unsigned short outLfeOn; - unsigned short outputMode; - unsigned short stereoMode; - unsigned short dualMonoMode; - unsigned short fsCod; - unsigned short pcmScaleFac; - unsigned short dynRngScaleHi; - unsigned short dynRngScaleLow; - unsigned short user_downmix_flag; - unsigned short user_karaoke_flag; - unsigned short dm_address_high; - unsigned short dm_address_low; - unsigned short ko_address_high; - unsigned short ko_address_low; - unsigned short error_concealment; - unsigned short max_rep_count; - unsigned short channel_routing_mode[6]; -}; - -#endif /* _UAPI_MSM_AUDIO_AC3_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_alac.h b/techpack/audio/include/uapi/linux/msm_audio_alac.h deleted file mode 100644 index 5476e96d06fc..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_alac.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_ALAC_H -#define _UAPI_MSM_AUDIO_ALAC_H - -#define AUDIO_GET_ALAC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_alac_config) -#define AUDIO_SET_ALAC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_alac_config) - -struct msm_audio_alac_config { - uint32_t frameLength; - uint8_t compatVersion; - uint8_t bitDepth; - uint8_t pb; /* currently unused */ - uint8_t mb; /* currently unused */ - uint8_t kb; /* currently unused */ - uint8_t channelCount; - uint16_t maxRun; /* currently unused */ - uint32_t maxSize; - uint32_t averageBitRate; - uint32_t sampleRate; - uint32_t channelLayout; -}; - -#endif /* _UAPI_MSM_AUDIO_ALAC_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_amrnb.h b/techpack/audio/include/uapi/linux/msm_audio_amrnb.h deleted file mode 100644 index 619f928f7175..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_amrnb.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AMRNB_H -#define _UAPI_MSM_AUDIO_AMRNB_H - -#include - -#define AUDIO_GET_AMRNB_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_SET_AMRNB_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) -#define AUDIO_GET_AMRNB_ENC_CONFIG_V2 _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+2), \ - struct msm_audio_amrnb_enc_config_v2) -#define AUDIO_SET_AMRNB_ENC_CONFIG_V2 _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), \ - struct msm_audio_amrnb_enc_config_v2) - -struct msm_audio_amrnb_enc_config { - unsigned short voicememoencweight1; - unsigned short voicememoencweight2; - unsigned short voicememoencweight3; - unsigned short voicememoencweight4; - unsigned short dtx_mode_enable; /* 0xFFFF - enable, 0- disable */ - unsigned short test_mode_enable; /* 0xFFFF - enable, 0- disable */ - unsigned short enc_mode; /* 0-MR475,1-MR515,2-MR59,3-MR67,4-MR74 - * 5-MR795, 6- MR102, 7- MR122(default) - */ -}; - -struct msm_audio_amrnb_enc_config_v2 { - uint32_t band_mode; - uint32_t dtx_enable; - uint32_t frame_format; -}; -#endif /* _UAPI_MSM_AUDIO_AMRNB_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_amrwb.h b/techpack/audio/include/uapi/linux/msm_audio_amrwb.h deleted file mode 100644 index 51240389988f..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_amrwb.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AMRWB_H -#define _UAPI_MSM_AUDIO_AMRWB_H - -#include - -#define AUDIO_GET_AMRWB_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), \ - struct msm_audio_amrwb_enc_config) -#define AUDIO_SET_AMRWB_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), \ - struct msm_audio_amrwb_enc_config) - -struct msm_audio_amrwb_enc_config { - uint32_t band_mode; - uint32_t dtx_enable; - uint32_t frame_format; -}; -#endif /* _UAPI_MSM_AUDIO_AMRWB_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_amrwbplus.h b/techpack/audio/include/uapi/linux/msm_audio_amrwbplus.h deleted file mode 100644 index ba2d06e99aa1..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_amrwbplus.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_AMR_WB_PLUS_H -#define _UAPI_MSM_AUDIO_AMR_WB_PLUS_H - -#define AUDIO_GET_AMRWBPLUS_CONFIG_V2 _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+2), struct msm_audio_amrwbplus_config_v2) -#define AUDIO_SET_AMRWBPLUS_CONFIG_V2 _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_amrwbplus_config_v2) - -struct msm_audio_amrwbplus_config_v2 { - unsigned int size_bytes; - unsigned int version; - unsigned int num_channels; - unsigned int amr_band_mode; - unsigned int amr_dtx_mode; - unsigned int amr_frame_fmt; - unsigned int amr_lsf_idx; -}; -#endif /* _UAPI_MSM_AUDIO_AMR_WB_PLUS_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_ape.h b/techpack/audio/include/uapi/linux/msm_audio_ape.h deleted file mode 100644 index 587d3bc1832d..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_ape.h +++ /dev/null @@ -1,26 +0,0 @@ -/* The following structure has been taken - * from Monkey's Audio SDK with permission - */ - -#ifndef _UAPI_MSM_AUDIO_APE_H -#define _UAPI_MSM_AUDIO_APE_H - -#define AUDIO_GET_APE_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_ape_config) -#define AUDIO_SET_APE_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_ape_config) - -struct msm_audio_ape_config { - uint16_t compatibleVersion; - uint16_t compressionLevel; - uint32_t formatFlags; - uint32_t blocksPerFrame; - uint32_t finalFrameBlocks; - uint32_t totalFrames; - uint16_t bitsPerSample; - uint16_t numChannels; - uint32_t sampleRate; - uint32_t seekTablePresent; -}; - -#endif /* _UAPI_MSM_AUDIO_APE_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_calibration.h b/techpack/audio/include/uapi/linux/msm_audio_calibration.h deleted file mode 100644 index 35b596062247..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_calibration.h +++ /dev/null @@ -1,808 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_CALIBRATION_H -#define _UAPI_MSM_AUDIO_CALIBRATION_H - -#include -#include - -#define CAL_IOCTL_MAGIC 'a' - -#define AUDIO_ALLOCATE_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 200, void *) -#define AUDIO_DEALLOCATE_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 201, void *) -#define AUDIO_PREPARE_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 202, void *) -#define AUDIO_SET_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 203, void *) -#define AUDIO_GET_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 204, void *) -#define AUDIO_POST_CALIBRATION _IOWR(CAL_IOCTL_MAGIC, \ - 205, void *) - -/* For Real-Time Audio Calibration */ -#define AUDIO_GET_RTAC_ADM_INFO _IOR(CAL_IOCTL_MAGIC, \ - 207, void *) -#define AUDIO_GET_RTAC_VOICE_INFO _IOR(CAL_IOCTL_MAGIC, \ - 208, void *) -#define AUDIO_GET_RTAC_ADM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 209, void *) -#define AUDIO_SET_RTAC_ADM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 210, void *) -#define AUDIO_GET_RTAC_ASM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 211, void *) -#define AUDIO_SET_RTAC_ASM_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 212, void *) -#define AUDIO_GET_RTAC_CVS_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 213, void *) -#define AUDIO_SET_RTAC_CVS_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 214, void *) -#define AUDIO_GET_RTAC_CVP_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 215, void *) -#define AUDIO_SET_RTAC_CVP_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 216, void *) -#define AUDIO_GET_RTAC_AFE_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 217, void *) -#define AUDIO_SET_RTAC_AFE_CAL _IOWR(CAL_IOCTL_MAGIC, \ - 218, void *) -enum { - CVP_VOC_RX_TOPOLOGY_CAL_TYPE = 0, - CVP_VOC_TX_TOPOLOGY_CAL_TYPE, - CVP_VOCPROC_STATIC_CAL_TYPE, - CVP_VOCPROC_DYNAMIC_CAL_TYPE, - CVS_VOCSTRM_STATIC_CAL_TYPE, - CVP_VOCDEV_CFG_CAL_TYPE, - CVP_VOCPROC_STATIC_COL_CAL_TYPE, - CVP_VOCPROC_DYNAMIC_COL_CAL_TYPE, - CVS_VOCSTRM_STATIC_COL_CAL_TYPE, - - ADM_TOPOLOGY_CAL_TYPE, - ADM_CUST_TOPOLOGY_CAL_TYPE, - ADM_AUDPROC_CAL_TYPE, - ADM_AUDVOL_CAL_TYPE, - - ASM_TOPOLOGY_CAL_TYPE, - ASM_CUST_TOPOLOGY_CAL_TYPE, - ASM_AUDSTRM_CAL_TYPE, - - AFE_COMMON_RX_CAL_TYPE, - AFE_COMMON_TX_CAL_TYPE, - AFE_ANC_CAL_TYPE, - AFE_AANC_CAL_TYPE, - AFE_FB_SPKR_PROT_CAL_TYPE, - AFE_HW_DELAY_CAL_TYPE, - AFE_SIDETONE_CAL_TYPE, - AFE_TOPOLOGY_CAL_TYPE, - AFE_CUST_TOPOLOGY_CAL_TYPE, - - LSM_CUST_TOPOLOGY_CAL_TYPE, - LSM_TOPOLOGY_CAL_TYPE, - LSM_CAL_TYPE, - - ADM_RTAC_INFO_CAL_TYPE, - VOICE_RTAC_INFO_CAL_TYPE, - ADM_RTAC_APR_CAL_TYPE, - ASM_RTAC_APR_CAL_TYPE, - VOICE_RTAC_APR_CAL_TYPE, - - MAD_CAL_TYPE, - ULP_AFE_CAL_TYPE, - ULP_LSM_CAL_TYPE, - - DTS_EAGLE_CAL_TYPE, - AUDIO_CORE_METAINFO_CAL_TYPE, - SRS_TRUMEDIA_CAL_TYPE, - - CORE_CUSTOM_TOPOLOGIES_CAL_TYPE, - ADM_RTAC_AUDVOL_CAL_TYPE, - - ULP_LSM_TOPOLOGY_ID_CAL_TYPE, - AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE, - AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE, - AFE_SIDETONE_IIR_CAL_TYPE, - AFE_LSM_TOPOLOGY_CAL_TYPE, - AFE_LSM_TX_CAL_TYPE, - ADM_LSM_TOPOLOGY_CAL_TYPE, - ADM_LSM_AUDPROC_CAL_TYPE, - ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, - MAX_CAL_TYPES, -}; - -#define AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE AFE_FB_SPKR_PROT_TH_VI_CAL_TYPE -#define AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE AFE_FB_SPKR_PROT_EX_VI_CAL_TYPE - -#define AFE_SIDETONE_IIR_CAL_TYPE AFE_SIDETONE_IIR_CAL_TYPE - -#define AFE_LSM_TOPOLOGY_CAL_TYPE AFE_LSM_TOPOLOGY_CAL_TYPE -#define AFE_LSM_TX_CAL_TYPE AFE_LSM_TX_CAL_TYPE -#define ADM_LSM_TOPOLOGY_CAL_TYPE ADM_LSM_TOPOLOGY_CAL_TYPE -#define ADM_LSM_AUDPROC_CAL_TYPE ADM_LSM_AUDPROC_CAL_TYPE -#define ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE -#define LSM_CAL_TYPES - -#define TOPOLOGY_SPECIFIC_CHANNEL_INFO -#define MSM_SPKR_PROT_SPV3 - -enum { - VERSION_0_0, -}; - -enum { - PER_VOCODER_CAL_BIT_MASK = 0x10000, -}; - -#define MAX_IOCTL_CMD_SIZE 512 - -/* common structures */ - -struct audio_cal_header { - int32_t data_size; - int32_t version; - int32_t cal_type; - int32_t cal_type_size; -}; - -struct audio_cal_type_header { - int32_t version; - int32_t buffer_number; -}; - -struct audio_cal_data { - /* Size of cal data at mem_handle allocation or at vaddr */ - int32_t cal_size; - /* If mem_handle if shared memory is used*/ - int32_t mem_handle; - /* size of virtual memory if shared memory not used */ -}; - - -/* AUDIO_ALLOCATE_CALIBRATION */ -struct audio_cal_type_alloc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_alloc { - struct audio_cal_header hdr; - struct audio_cal_type_alloc cal_type; -}; - - -/* AUDIO_DEALLOCATE_CALIBRATION */ -struct audio_cal_type_dealloc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_dealloc { - struct audio_cal_header hdr; - struct audio_cal_type_dealloc cal_type; -}; - - -/* AUDIO_PREPARE_CALIBRATION */ -struct audio_cal_type_prepare { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_prepare { - struct audio_cal_header hdr; - struct audio_cal_type_prepare cal_type; -}; - - -/* AUDIO_POST_CALIBRATION */ -struct audio_cal_type_post { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_post { - struct audio_cal_header hdr; - struct audio_cal_type_post cal_type; -}; - -/*AUDIO_CORE_META_INFO */ - -struct audio_cal_info_metainfo { - uint32_t nKey; -}; - -/* Cal info types */ -enum { - RX_DEVICE, - TX_DEVICE, - MAX_PATH_TYPE -}; - -struct audio_cal_info_adm_top { - int32_t topology; - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; - int32_t sample_rate; -}; - -struct audio_cal_info_audproc { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; - int32_t sample_rate; -}; - -struct audio_cal_info_audvol { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; - int32_t vol_index; -}; - -struct audio_cal_info_afe { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t sample_rate; -}; - -struct audio_cal_info_afe_top { - int32_t topology; - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t sample_rate; -}; - -struct audio_cal_info_asm_top { - int32_t topology; - int32_t app_type; -}; - -struct audio_cal_info_audstrm { - int32_t app_type; -}; - -struct audio_cal_info_aanc { - int32_t acdb_id; -}; - -#define MAX_HW_DELAY_ENTRIES 25 - -struct audio_cal_hw_delay_entry { - uint32_t sample_rate; - uint32_t delay_usec; -}; - -struct audio_cal_hw_delay_data { - uint32_t num_entries; - struct audio_cal_hw_delay_entry entry[MAX_HW_DELAY_ENTRIES]; -}; - -struct audio_cal_info_hw_delay { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t property_type; - struct audio_cal_hw_delay_data data; -}; - -enum msm_spkr_prot_states { - MSM_SPKR_PROT_CALIBRATED, - MSM_SPKR_PROT_CALIBRATION_IN_PROGRESS, - MSM_SPKR_PROT_DISABLED, - MSM_SPKR_PROT_NOT_CALIBRATED, - MSM_SPKR_PROT_PRE_CALIBRATED, - MSM_SPKR_PROT_IN_FTM_MODE, - MSM_SPKR_PROT_IN_V_VALI_MODE -}; -#define MSM_SPKR_PROT_IN_FTM_MODE MSM_SPKR_PROT_IN_FTM_MODE -#define MSM_SPKR_PROT_IN_V_VALI_MODE MSM_SPKR_PROT_IN_V_VALI_MODE - -enum msm_spkr_count { - SP_V2_SPKR_1, - SP_V2_SPKR_2, - SP_V2_NUM_MAX_SPKRS -}; - -struct audio_cal_info_spk_prot_cfg { - int32_t r0[SP_V2_NUM_MAX_SPKRS]; - int32_t t0[SP_V2_NUM_MAX_SPKRS]; - uint32_t quick_calib_flag; - uint32_t mode; - /* - * 0 - Start spk prot - * 1 - Start calib - * 2 - Disable spk prot - */ -#ifdef MSM_SPKR_PROT_SPV3 - uint32_t sp_version; - int32_t limiter_th[SP_V2_NUM_MAX_SPKRS]; -#endif -}; - -struct audio_cal_info_sp_th_vi_ftm_cfg { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - /* - * 0 - normal running mode - * 1 - Calibration - * 2 - FTM mode - */ - uint32_t wait_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t ftm_time[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_sp_th_vi_v_vali_cfg { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - /* - * 0 - normal running mode - * 1 - Calibration - * 2 - FTM mode - * 3 - V-Validation mode - */ - uint32_t wait_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t vali_time[SP_V2_NUM_MAX_SPKRS]; - -}; - -struct audio_cal_info_sp_ex_vi_ftm_cfg { - uint32_t wait_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t ftm_time[SP_V2_NUM_MAX_SPKRS]; - uint32_t mode; - /* - * 0 - normal running mode - * 2 - FTM mode - */ -}; - -struct audio_cal_info_sp_ex_vi_param { - int32_t freq_q20[SP_V2_NUM_MAX_SPKRS]; - int32_t resis_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t qmct_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t status[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_sp_th_vi_param { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - int32_t r_dc_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t temp_q22[SP_V2_NUM_MAX_SPKRS]; - int32_t status[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_sp_th_vi_v_vali_param { - /* - * mode should be first param, add new params later to this. - * we use this mode(first 4 bytes) to differentiate - * whether it is TH_VI FTM or v-validation. - */ - uint32_t mode; - uint32_t vrms_q24[SP_V2_NUM_MAX_SPKRS]; - int32_t status[SP_V2_NUM_MAX_SPKRS]; -}; - -struct audio_cal_info_msm_spk_prot_status { - int32_t r0[SP_V2_NUM_MAX_SPKRS]; - int32_t status; -}; - -struct audio_cal_info_sidetone { - uint16_t enable; - uint16_t gain; - int32_t tx_acdb_id; - int32_t rx_acdb_id; - int32_t mid; - int32_t pid; -}; - -#define MAX_SIDETONE_IIR_DATA_SIZE 224 -#define MAX_NO_IIR_FILTER_STAGE 10 - -struct audio_cal_info_sidetone_iir { - uint16_t iir_enable; - uint16_t num_biquad_stages; - uint16_t pregain; - int32_t tx_acdb_id; - int32_t rx_acdb_id; - int32_t mid; - int32_t pid; - uint8_t iir_config[MAX_SIDETONE_IIR_DATA_SIZE]; -}; -struct audio_cal_info_lsm_top { - int32_t topology; - int32_t acdb_id; - int32_t app_type; -}; - - -struct audio_cal_info_lsm { - int32_t acdb_id; - /* RX_DEVICE or TX_DEVICE */ - int32_t path; - int32_t app_type; -}; - -#define VSS_NUM_CHANNELS_MAX 32 - -struct audio_cal_info_voc_top { - int32_t topology; - int32_t acdb_id; -#ifdef TOPOLOGY_SPECIFIC_CHANNEL_INFO - uint32_t num_channels; - uint8_t channel_mapping[VSS_NUM_CHANNELS_MAX]; -#endif -}; - -struct audio_cal_info_vocproc { - int32_t tx_acdb_id; - int32_t rx_acdb_id; - int32_t tx_sample_rate; - int32_t rx_sample_rate; -}; - -enum { - DEFAULT_FEATURE_SET, - VOL_BOOST_FEATURE_SET, -}; - -struct audio_cal_info_vocvol { - int32_t tx_acdb_id; - int32_t rx_acdb_id; - /* DEFAULT_ or VOL_BOOST_FEATURE_SET */ - int32_t feature_set; -}; - -struct audio_cal_info_vocdev_cfg { - int32_t tx_acdb_id; - int32_t rx_acdb_id; -}; - -#define MAX_VOICE_COLUMNS 20 - -union audio_cal_col_na { - uint8_t val8; - uint16_t val16; - uint32_t val32; - uint64_t val64; -} __packed; - -struct audio_cal_col { - uint32_t id; - uint32_t type; - union audio_cal_col_na na_value; -} __packed; - -struct audio_cal_col_data { - uint32_t num_columns; - struct audio_cal_col column[MAX_VOICE_COLUMNS]; -} __packed; - -struct audio_cal_info_voc_col { - int32_t table_id; - int32_t tx_acdb_id; - int32_t rx_acdb_id; - struct audio_cal_col_data data; -}; - -/* AUDIO_SET_CALIBRATION & */ -struct audio_cal_type_basic { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; -}; - -struct audio_cal_basic { - struct audio_cal_header hdr; - struct audio_cal_type_basic cal_type; -}; - -struct audio_cal_type_adm_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_adm_top cal_info; -}; - -struct audio_cal_adm_top { - struct audio_cal_header hdr; - struct audio_cal_type_adm_top cal_type; -}; - -struct audio_cal_type_metainfo { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_metainfo cal_info; -}; - -struct audio_core_metainfo { - struct audio_cal_header hdr; - struct audio_cal_type_metainfo cal_type; -}; - -struct audio_cal_type_audproc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_audproc cal_info; -}; - -struct audio_cal_audproc { - struct audio_cal_header hdr; - struct audio_cal_type_audproc cal_type; -}; - -struct audio_cal_type_audvol { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_audvol cal_info; -}; - -struct audio_cal_audvol { - struct audio_cal_header hdr; - struct audio_cal_type_audvol cal_type; -}; - -struct audio_cal_type_asm_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_asm_top cal_info; -}; - -struct audio_cal_asm_top { - struct audio_cal_header hdr; - struct audio_cal_type_asm_top cal_type; -}; - -struct audio_cal_type_audstrm { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_audstrm cal_info; -}; - -struct audio_cal_audstrm { - struct audio_cal_header hdr; - struct audio_cal_type_audstrm cal_type; -}; - -struct audio_cal_type_afe { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_afe cal_info; -}; - -struct audio_cal_afe { - struct audio_cal_header hdr; - struct audio_cal_type_afe cal_type; -}; - -struct audio_cal_type_afe_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_afe_top cal_info; -}; - -struct audio_cal_afe_top { - struct audio_cal_header hdr; - struct audio_cal_type_afe_top cal_type; -}; - -struct audio_cal_type_aanc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_aanc cal_info; -}; - -struct audio_cal_aanc { - struct audio_cal_header hdr; - struct audio_cal_type_aanc cal_type; -}; - -struct audio_cal_type_fb_spk_prot_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_spk_prot_cfg cal_info; -}; - -struct audio_cal_fb_spk_prot_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_fb_spk_prot_cfg cal_type; -}; - -struct audio_cal_type_sp_th_vi_ftm_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_ftm_cfg cal_info; -}; - -struct audio_cal_sp_th_vi_ftm_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_ftm_cfg cal_type; -}; - -struct audio_cal_type_sp_th_vi_v_vali_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_v_vali_cfg cal_info; -}; - -struct audio_cal_sp_th_vi_v_vali_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_v_vali_cfg cal_type; -}; - -struct audio_cal_type_sp_ex_vi_ftm_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_ex_vi_ftm_cfg cal_info; -}; - -struct audio_cal_sp_ex_vi_ftm_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_sp_ex_vi_ftm_cfg cal_type; -}; -struct audio_cal_type_hw_delay { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_hw_delay cal_info; -}; - -struct audio_cal_hw_delay { - struct audio_cal_header hdr; - struct audio_cal_type_hw_delay cal_type; -}; - -struct audio_cal_type_sidetone { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sidetone cal_info; -}; - -struct audio_cal_sidetone { - struct audio_cal_header hdr; - struct audio_cal_type_sidetone cal_type; -}; - -struct audio_cal_type_sidetone_iir { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sidetone_iir cal_info; -}; - -struct audio_cal_sidetone_iir { - struct audio_cal_header hdr; - struct audio_cal_type_sidetone_iir cal_type; -}; - -struct audio_cal_type_lsm_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_lsm_top cal_info; -}; - -struct audio_cal_lsm_top { - struct audio_cal_header hdr; - struct audio_cal_type_lsm_top cal_type; -}; - -struct audio_cal_type_lsm { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_lsm cal_info; -}; - -struct audio_cal_lsm { - struct audio_cal_header hdr; - struct audio_cal_type_lsm cal_type; -}; - -struct audio_cal_type_voc_top { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_voc_top cal_info; -}; - -struct audio_cal_voc_top { - struct audio_cal_header hdr; - struct audio_cal_type_voc_top cal_type; -}; - -struct audio_cal_type_vocproc { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_vocproc cal_info; -}; - -struct audio_cal_vocproc { - struct audio_cal_header hdr; - struct audio_cal_type_vocproc cal_type; -}; - -struct audio_cal_type_vocvol { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_vocvol cal_info; -}; - -struct audio_cal_vocvol { - struct audio_cal_header hdr; - struct audio_cal_type_vocvol cal_type; -}; - -struct audio_cal_type_vocdev_cfg { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_vocdev_cfg cal_info; -}; - -struct audio_cal_vocdev_cfg { - struct audio_cal_header hdr; - struct audio_cal_type_vocdev_cfg cal_type; -}; - -struct audio_cal_type_voc_col { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_voc_col cal_info; -}; - -struct audio_cal_voc_col { - struct audio_cal_header hdr; - struct audio_cal_type_voc_col cal_type; -}; - -/* AUDIO_GET_CALIBRATION */ -struct audio_cal_type_fb_spk_prot_status { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_msm_spk_prot_status cal_info; -}; - -struct audio_cal_fb_spk_prot_status { - struct audio_cal_header hdr; - struct audio_cal_type_fb_spk_prot_status cal_type; -}; - -struct audio_cal_type_sp_th_vi_param { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_param cal_info; -}; - -struct audio_cal_sp_th_vi_param { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_param cal_type; -}; - -struct audio_cal_type_sp_th_vi_v_vali_param { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_th_vi_v_vali_param cal_info; -}; - -struct audio_cal_sp_th_vi_v_vali_param { - struct audio_cal_header hdr; - struct audio_cal_type_sp_th_vi_v_vali_param cal_type; -}; -struct audio_cal_type_sp_ex_vi_param { - struct audio_cal_type_header cal_hdr; - struct audio_cal_data cal_data; - struct audio_cal_info_sp_ex_vi_param cal_info; -}; - -struct audio_cal_sp_ex_vi_param { - struct audio_cal_header hdr; - struct audio_cal_type_sp_ex_vi_param cal_type; -}; -#endif /* _UAPI_MSM_AUDIO_CALIBRATION_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_g711.h b/techpack/audio/include/uapi/linux/msm_audio_g711.h deleted file mode 100644 index 48ebd6a1131e..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_g711.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_G711_H -#define _UAPI_MSM_AUDIO_G711_H - -#include - -struct msm_audio_g711_enc_config { - uint32_t sample_rate; -}; - -#define AUDIO_SET_G711_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_enc_config) - -#define AUDIO_GET_G711_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_enc_config) - - -#endif /* _UAPI_MSM_AUDIO_G711_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_g711_dec.h b/techpack/audio/include/uapi/linux/msm_audio_g711_dec.h deleted file mode 100644 index ff7e4ce39fd5..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_g711_dec.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_G711_H -#define _UAPI_MSM_AUDIO_G711_H - -#include - -struct msm_audio_g711_dec_config { - uint32_t sample_rate; -}; - -#define AUDIO_SET_G711_DEC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_g711_dec_config) - -#define AUDIO_GET_G711_DEC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_g711_dec_config) - -#endif /* _UAPI_MSM_AUDIO_G711_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_mvs.h b/techpack/audio/include/uapi/linux/msm_audio_mvs.h deleted file mode 100644 index 5b76bf99a701..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_mvs.h +++ /dev/null @@ -1,155 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_MVS_H -#define _UAPI_MSM_AUDIO_MVS_H - -#include - -#define AUDIO_GET_MVS_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM + 0), unsigned int) -#define AUDIO_SET_MVS_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM + 1), unsigned int) - -/* MVS modes */ -#define MVS_MODE_IS733 0x1 /*QCELP 13K*/ -#define MVS_MODE_IS127 0x2 /*EVRC-8k*/ -#define MVS_MODE_4GV_NB 0x3 /*EVRC-B*/ -#define MVS_MODE_4GV_WB 0x4 /*EVRC-WB*/ -#define MVS_MODE_AMR 0x5 -#define MVS_MODE_EFR 0x6 -#define MVS_MODE_FR 0x7 -#define MVS_MODE_HR 0x8 -#define MVS_MODE_LINEAR_PCM 0x9 -#define MVS_MODE_G711 0xA -#define MVS_MODE_PCM 0xC -#define MVS_MODE_AMR_WB 0xD -#define MVS_MODE_G729A 0xE -#define MVS_MODE_G711A 0xF -#define MVS_MODE_G722 0x10 -#define MVS_MODE_PCM_WB 0x12 - -enum msm_audio_amr_mode { - MVS_AMR_MODE_0475, /* AMR 4.75 kbps */ - MVS_AMR_MODE_0515, /* AMR 5.15 kbps */ - MVS_AMR_MODE_0590, /* AMR 5.90 kbps */ - MVS_AMR_MODE_0670, /* AMR 6.70 kbps */ - MVS_AMR_MODE_0740, /* AMR 7.40 kbps */ - MVS_AMR_MODE_0795, /* AMR 7.95 kbps */ - MVS_AMR_MODE_1020, /* AMR 10.20 kbps */ - MVS_AMR_MODE_1220, /* AMR 12.20 kbps */ - MVS_AMR_MODE_0660, /* AMR-WB 6.60 kbps */ - MVS_AMR_MODE_0885, /* AMR-WB 8.85 kbps */ - MVS_AMR_MODE_1265, /* AMR-WB 12.65 kbps */ - MVS_AMR_MODE_1425, /* AMR-WB 14.25 kbps */ - MVS_AMR_MODE_1585, /* AMR-WB 15.85 kbps */ - MVS_AMR_MODE_1825, /* AMR-WB 18.25 kbps */ - MVS_AMR_MODE_1985, /* AMR-WB 19.85 kbps */ - MVS_AMR_MODE_2305, /* AMR-WB 23.05 kbps */ - MVS_AMR_MODE_2385, /* AMR-WB 23.85 kbps */ - MVS_AMR_MODE_UNDEF -}; - -/* The MVS VOC rate type is used to identify the rate of QCELP 13K(IS733), - * EVRC(IS127), 4GV, or 4GV-WB frame. - */ -enum msm_audio_voc_rate { - MVS_VOC_0_RATE, /* Blank frame */ - MVS_VOC_8_RATE, /* 1/8 rate */ - MVS_VOC_4_RATE, /* 1/4 rate */ - MVS_VOC_2_RATE, /* 1/2 rate */ - MVS_VOC_1_RATE, /* Full rate */ - MVS_VOC_ERASURE, /* erasure frame */ - MVS_VOC_RATE_MAX, - MVS_VOC_RATE_UNDEF = MVS_VOC_RATE_MAX -}; - -enum msm_audio_amr_frame_type { - MVS_AMR_SPEECH_GOOD, /* Good speech frame */ - MVS_AMR_SPEECH_DEGRADED, /* Speech degraded */ - MVS_AMR_ONSET, /* Onset */ - MVS_AMR_SPEECH_BAD, /* Corrupt speech frame (bad CRC) */ - MVS_AMR_SID_FIRST, /* First silence descriptor */ - MVS_AMR_SID_UPDATE, /* Comfort noise frame */ - MVS_AMR_SID_BAD, /* Corrupt SID frame (bad CRC) */ - MVS_AMR_NO_DATA, /* Nothing to transmit */ - MVS_AMR_SPEECH_LOST /* Downlink speech lost */ -}; - -enum msm_audio_g711a_mode { - MVS_G711A_MODE_MULAW, - MVS_G711A_MODE_ALAW -}; - -enum msm_audio_g711_mode { - MVS_G711_MODE_MULAW, - MVS_G711_MODE_ALAW -}; - -enum mvs_g722_mode_type { - MVS_G722_MODE_01, - MVS_G722_MODE_02, - MVS_G722_MODE_03, - MVS_G722_MODE_MAX, - MVS_G722_MODE_UNDEF -}; - -enum msm_audio_g711a_frame_type { - MVS_G711A_SPEECH_GOOD, - MVS_G711A_SID, - MVS_G711A_NO_DATA, - MVS_G711A_ERASURE -}; - -enum msm_audio_g729a_frame_type { - MVS_G729A_NO_DATA, - MVS_G729A_SPEECH_GOOD, - MVS_G729A_SID, - MVS_G729A_ERASURE -}; - -struct min_max_rate { - uint32_t min_rate; - uint32_t max_rate; -}; - -struct msm_audio_mvs_config { - uint32_t mvs_mode; - uint32_t rate_type; - struct min_max_rate min_max_rate; - uint32_t dtx_mode; -}; - -#define MVS_MAX_VOC_PKT_SIZE 640 - -struct gsm_header { - uint8_t bfi; - uint8_t sid; - uint8_t taf; - uint8_t ufi; -}; - -struct q6_msm_audio_mvs_frame { - union { - uint32_t frame_type; - uint32_t packet_rate; - struct gsm_header gsm_frame_type; - } header; - uint32_t len; - uint8_t voc_pkt[MVS_MAX_VOC_PKT_SIZE]; - -}; - -struct msm_audio_mvs_frame { - uint32_t frame_type; - uint32_t len; - uint8_t voc_pkt[MVS_MAX_VOC_PKT_SIZE]; - -}; - -#define Q5V2_MVS_MAX_VOC_PKT_SIZE 320 - -struct q5v2_msm_audio_mvs_frame { - uint32_t frame_type; - uint32_t len; - uint8_t voc_pkt[Q5V2_MVS_MAX_VOC_PKT_SIZE]; - -}; -#endif /* _UAPI_MSM_AUDIO_MVS_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_qcp.h b/techpack/audio/include/uapi/linux/msm_audio_qcp.h deleted file mode 100644 index fdb234e91acf..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_qcp.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_QCP_H -#define _UAPI_MSM_AUDIO_QCP_H - -#include - -#define AUDIO_SET_QCELP_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - 0, struct msm_audio_qcelp_enc_config) - -#define AUDIO_GET_QCELP_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - 1, struct msm_audio_qcelp_enc_config) - -#define AUDIO_SET_EVRC_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - 2, struct msm_audio_evrc_enc_config) - -#define AUDIO_GET_EVRC_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - 3, struct msm_audio_evrc_enc_config) - -#define CDMA_RATE_BLANK 0x00 -#define CDMA_RATE_EIGHTH 0x01 -#define CDMA_RATE_QUARTER 0x02 -#define CDMA_RATE_HALF 0x03 -#define CDMA_RATE_FULL 0x04 -#define CDMA_RATE_ERASURE 0x05 - -struct msm_audio_qcelp_enc_config { - uint32_t cdma_rate; - uint32_t min_bit_rate; - uint32_t max_bit_rate; -}; - -struct msm_audio_evrc_enc_config { - uint32_t cdma_rate; - uint32_t min_bit_rate; - uint32_t max_bit_rate; -}; - -#endif /* _UAPI_MSM_AUDIO_QCP_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_sbc.h b/techpack/audio/include/uapi/linux/msm_audio_sbc.h deleted file mode 100644 index 1c7c63da3da7..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_sbc.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_SBC_H -#define _UAPI_MSM_AUDIO_SBC_H - -#include - -#define AUDIO_SET_SBC_ENC_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_sbc_enc_config) - -#define AUDIO_GET_SBC_ENC_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_sbc_enc_config) - -#define AUDIO_SBC_BA_LOUDNESS 0x0 -#define AUDIO_SBC_BA_SNR 0x1 - -#define AUDIO_SBC_MODE_MONO 0x0 -#define AUDIO_SBC_MODE_DUAL 0x1 -#define AUDIO_SBC_MODE_STEREO 0x2 -#define AUDIO_SBC_MODE_JSTEREO 0x3 - -#define AUDIO_SBC_BANDS_8 0x1 - -#define AUDIO_SBC_BLOCKS_4 0x0 -#define AUDIO_SBC_BLOCKS_8 0x1 -#define AUDIO_SBC_BLOCKS_12 0x2 -#define AUDIO_SBC_BLOCKS_16 0x3 - -struct msm_audio_sbc_enc_config { - uint32_t channels; - uint32_t sample_rate; - uint32_t bit_allocation; - uint32_t number_of_subbands; - uint32_t number_of_blocks; - uint32_t bit_rate; - uint32_t mode; -}; -#endif /* _UAPI_MSM_AUDIO_SBC_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_voicememo.h b/techpack/audio/include/uapi/linux/msm_audio_voicememo.h deleted file mode 100644 index a7a7a4df17d5..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_voicememo.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_VOICEMEMO_H -#define _UAPI_MSM_AUDIO_VOICEMEMO_H - -#include - -#define AUDIO_GET_VOICEMEMO_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_SET_VOICEMEMO_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) - -/* rec_type */ -enum rpc_voc_rec_dir_type { - RPC_VOC_REC_NONE, - RPC_VOC_REC_FORWARD, - RPC_VOC_REC_REVERSE, - RPC_VOC_REC_BOTH, - RPC_VOC_MAX_REC_TYPE -}; - -/* capability */ -enum rpc_voc_capability_type { - RPC_VOC_CAP_IS733 = 4, - RPC_VOC_CAP_IS127 = 8, - RPC_VOC_CAP_AMR = 64, - RPC_VOC_CAP_32BIT_DUMMY = 2147483647 -}; - -/* Rate */ -enum rpc_voc_rate_type { - RPC_VOC_0_RATE = 0, - RPC_VOC_8_RATE, - RPC_VOC_4_RATE, - RPC_VOC_2_RATE, - RPC_VOC_1_RATE, - RPC_VOC_ERASURE, - RPC_VOC_ERR_RATE, - RPC_VOC_AMR_RATE_475 = 0, - RPC_VOC_AMR_RATE_515 = 1, - RPC_VOC_AMR_RATE_590 = 2, - RPC_VOC_AMR_RATE_670 = 3, - RPC_VOC_AMR_RATE_740 = 4, - RPC_VOC_AMR_RATE_795 = 5, - RPC_VOC_AMR_RATE_1020 = 6, - RPC_VOC_AMR_RATE_1220 = 7, -}; - -/* frame_format */ -enum rpc_voc_pb_len_rate_var_type { - RPC_VOC_PB_NATIVE_QCP = 3, - RPC_VOC_PB_AMR, - RPC_VOC_PB_EVB -}; - -struct msm_audio_voicememo_config { - uint32_t rec_type; - uint32_t rec_interval_ms; - uint32_t auto_stop_ms; - uint32_t capability; - uint32_t max_rate; - uint32_t min_rate; - uint32_t frame_format; - uint32_t dtx_enable; - uint32_t data_req_ms; -}; - -#endif /* _UAPI_MSM_AUDIO_VOICEMEMO_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_wma.h b/techpack/audio/include/uapi/linux/msm_audio_wma.h deleted file mode 100644 index 523fadef08d1..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_wma.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_WMA_H -#define _UAPI_MSM_AUDIO_WMA_H - -#define AUDIO_GET_WMA_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), unsigned int) -#define AUDIO_SET_WMA_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), unsigned int) - -#define AUDIO_GET_WMA_CONFIG_V2 _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+2), struct msm_audio_wma_config_v2) -#define AUDIO_SET_WMA_CONFIG_V2 _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+3), struct msm_audio_wma_config_v2) - -struct msm_audio_wma_config { - unsigned short armdatareqthr; - unsigned short channelsdecoded; - unsigned short wmabytespersec; - unsigned short wmasamplingfreq; - unsigned short wmaencoderopts; -}; - -struct msm_audio_wma_config_v2 { - unsigned short format_tag; - unsigned short numchannels; - uint32_t samplingrate; - uint32_t avgbytespersecond; - unsigned short block_align; - unsigned short validbitspersample; - uint32_t channelmask; - unsigned short encodeopt; -}; - -#endif /* _UAPI_MSM_AUDIO_WMA_H */ diff --git a/techpack/audio/include/uapi/linux/msm_audio_wmapro.h b/techpack/audio/include/uapi/linux/msm_audio_wmapro.h deleted file mode 100644 index 64cbf9e079d6..000000000000 --- a/techpack/audio/include/uapi/linux/msm_audio_wmapro.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _UAPI_MSM_AUDIO_WMAPRO_H -#define _UAPI_MSM_AUDIO_WMAPRO_H - -#define AUDIO_GET_WMAPRO_CONFIG _IOR(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+0), struct msm_audio_wmapro_config) -#define AUDIO_SET_WMAPRO_CONFIG _IOW(AUDIO_IOCTL_MAGIC, \ - (AUDIO_MAX_COMMON_IOCTL_NUM+1), struct msm_audio_wmapro_config) - -struct msm_audio_wmapro_config { - unsigned short armdatareqthr; - uint8_t validbitspersample; - uint8_t numchannels; - unsigned short formattag; - uint32_t samplingrate; - uint32_t avgbytespersecond; - unsigned short asfpacketlength; - uint32_t channelmask; - unsigned short encodeopt; - unsigned short advancedencodeopt; - uint32_t advancedencodeopt2; -}; -#endif /* _UAPI_MSM_AUDIO_WMAPRO_H */ diff --git a/techpack/audio/include/uapi/sound/Kbuild b/techpack/audio/include/uapi/sound/Kbuild deleted file mode 100644 index 175fb6f63359..000000000000 --- a/techpack/audio/include/uapi/sound/Kbuild +++ /dev/null @@ -1,8 +0,0 @@ -# UAPI Header export list -header-y += lsm_params.h -header-y += audio_slimslave.h -header-y += audio_effects.h -header-y += devdep_params.h -header-y += msmcal-hwdep.h -header-y += wcd-dsp-glink.h -header-y += voice_params.h diff --git a/techpack/audio/include/uapi/sound/audio_effects.h b/techpack/audio/include/uapi/sound/audio_effects.h deleted file mode 100644 index f38b2121a56e..000000000000 --- a/techpack/audio/include/uapi/sound/audio_effects.h +++ /dev/null @@ -1,365 +0,0 @@ -#ifndef _AUDIO_EFFECTS_H -#define _AUDIO_EFFECTS_H - -/** AUDIO EFFECTS **/ - - -/* CONFIG GET/SET */ -#define CONFIG_CACHE 0 -#define CONFIG_SET 1 -#define CONFIG_GET 2 - -/* CONFIG HEADER */ -/* - * MODULE_ID, - * DEVICE, - * NUM_COMMANDS, - * COMMAND_ID_1, - * CONFIG_CACHE/SET/GET, - * OFFSET_1, - * LENGTH_1, - * VALUES_1, - * ..., - * ..., - * COMMAND_ID_2, - * CONFIG_CACHE/SET/GET, - * OFFSET_2, - * LENGTH_2, - * VALUES_2, - * ..., - * ..., - * COMMAND_ID_3, - * ... - */ - - -/* CONFIG PARAM IDs */ -#define VIRTUALIZER_MODULE 0x00001000 -#define VIRTUALIZER_ENABLE 0x00001001 -#define VIRTUALIZER_STRENGTH 0x00001002 -#define VIRTUALIZER_OUT_TYPE 0x00001003 -#define VIRTUALIZER_GAIN_ADJUST 0x00001004 -#define VIRTUALIZER_ENABLE_PARAM_LEN 1 -#define VIRTUALIZER_STRENGTH_PARAM_LEN 1 -#define VIRTUALIZER_OUT_TYPE_PARAM_LEN 1 -#define VIRTUALIZER_GAIN_ADJUST_PARAM_LEN 1 - -#define REVERB_MODULE 0x00002000 -#define REVERB_ENABLE 0x00002001 -#define REVERB_MODE 0x00002002 -#define REVERB_PRESET 0x00002003 -#define REVERB_WET_MIX 0x00002004 -#define REVERB_GAIN_ADJUST 0x00002005 -#define REVERB_ROOM_LEVEL 0x00002006 -#define REVERB_ROOM_HF_LEVEL 0x00002007 -#define REVERB_DECAY_TIME 0x00002008 -#define REVERB_DECAY_HF_RATIO 0x00002009 -#define REVERB_REFLECTIONS_LEVEL 0x0000200a -#define REVERB_REFLECTIONS_DELAY 0x0000200b -#define REVERB_LEVEL 0x0000200c -#define REVERB_DELAY 0x0000200d -#define REVERB_DIFFUSION 0x0000200e -#define REVERB_DENSITY 0x0000200f -#define REVERB_ENABLE_PARAM_LEN 1 -#define REVERB_MODE_PARAM_LEN 1 -#define REVERB_PRESET_PARAM_LEN 1 -#define REVERB_WET_MIX_PARAM_LEN 1 -#define REVERB_GAIN_ADJUST_PARAM_LEN 1 -#define REVERB_ROOM_LEVEL_PARAM_LEN 1 -#define REVERB_ROOM_HF_LEVEL_PARAM_LEN 1 -#define REVERB_DECAY_TIME_PARAM_LEN 1 -#define REVERB_DECAY_HF_RATIO_PARAM_LEN 1 -#define REVERB_REFLECTIONS_LEVEL_PARAM_LEN 1 -#define REVERB_REFLECTIONS_DELAY_PARAM_LEN 1 -#define REVERB_LEVEL_PARAM_LEN 1 -#define REVERB_DELAY_PARAM_LEN 1 -#define REVERB_DIFFUSION_PARAM_LEN 1 -#define REVERB_DENSITY_PARAM_LEN 1 - -#define BASS_BOOST_MODULE 0x00003000 -#define BASS_BOOST_ENABLE 0x00003001 -#define BASS_BOOST_MODE 0x00003002 -#define BASS_BOOST_STRENGTH 0x00003003 -#define BASS_BOOST_ENABLE_PARAM_LEN 1 -#define BASS_BOOST_MODE_PARAM_LEN 1 -#define BASS_BOOST_STRENGTH_PARAM_LEN 1 - -#define EQ_MODULE 0x00004000 -#define EQ_ENABLE 0x00004001 -#define EQ_CONFIG 0x00004002 -#define EQ_NUM_BANDS 0x00004003 -#define EQ_BAND_LEVELS 0x00004004 -#define EQ_BAND_LEVEL_RANGE 0x00004005 -#define EQ_BAND_FREQS 0x00004006 -#define EQ_SINGLE_BAND_FREQ_RANGE 0x00004007 -#define EQ_SINGLE_BAND_FREQ 0x00004008 -#define EQ_BAND_INDEX 0x00004009 -#define EQ_PRESET_ID 0x0000400a -#define EQ_NUM_PRESETS 0x0000400b -#define EQ_PRESET_NAME 0x0000400c -#define EQ_ENABLE_PARAM_LEN 1 -#define EQ_CONFIG_PARAM_LEN 3 -#define EQ_CONFIG_PER_BAND_PARAM_LEN 5 -#define EQ_NUM_BANDS_PARAM_LEN 1 -#define EQ_BAND_LEVELS_PARAM_LEN 13 -#define EQ_BAND_LEVEL_RANGE_PARAM_LEN 2 -#define EQ_BAND_FREQS_PARAM_LEN 13 -#define EQ_SINGLE_BAND_FREQ_RANGE_PARAM_LEN 2 -#define EQ_SINGLE_BAND_FREQ_PARAM_LEN 1 -#define EQ_BAND_INDEX_PARAM_LEN 1 -#define EQ_PRESET_ID_PARAM_LEN 1 -#define EQ_NUM_PRESETS_PARAM_LEN 1 -#define EQ_PRESET_NAME_PARAM_LEN 32 - -#define EQ_TYPE_NONE 0 -#define EQ_BASS_BOOST 1 -#define EQ_BASS_CUT 2 -#define EQ_TREBLE_BOOST 3 -#define EQ_TREBLE_CUT 4 -#define EQ_BAND_BOOST 5 -#define EQ_BAND_CUT 6 - -#define SOFT_VOLUME_MODULE 0x00006000 -#define SOFT_VOLUME_ENABLE 0x00006001 -#define SOFT_VOLUME_GAIN_2CH 0x00006002 -#define SOFT_VOLUME_GAIN_MASTER 0x00006003 -#define SOFT_VOLUME_ENABLE_PARAM_LEN 1 -#define SOFT_VOLUME_GAIN_2CH_PARAM_LEN 2 -#define SOFT_VOLUME_GAIN_MASTER_PARAM_LEN 1 - -#define SOFT_VOLUME2_MODULE 0x00007000 -#define SOFT_VOLUME2_ENABLE 0x00007001 -#define SOFT_VOLUME2_GAIN_2CH 0x00007002 -#define SOFT_VOLUME2_GAIN_MASTER 0x00007003 -#define SOFT_VOLUME2_ENABLE_PARAM_LEN SOFT_VOLUME_ENABLE_PARAM_LEN -#define SOFT_VOLUME2_GAIN_2CH_PARAM_LEN SOFT_VOLUME_GAIN_2CH_PARAM_LEN -#define SOFT_VOLUME2_GAIN_MASTER_PARAM_LEN \ - SOFT_VOLUME_GAIN_MASTER_PARAM_LEN - -#define PBE_CONF_MODULE_ID 0x00010C2A -#define PBE_CONF_PARAM_ID 0x00010C49 - -#define PBE_MODULE 0x00008000 -#define PBE_ENABLE 0x00008001 -#define PBE_CONFIG 0x00008002 -#define PBE_ENABLE_PARAM_LEN 1 -#define PBE_CONFIG_PARAM_LEN 28 - -/* Command Payload length and size for Non-IID commands */ -#define COMMAND_PAYLOAD_LEN 3 -#define COMMAND_PAYLOAD_SZ (COMMAND_PAYLOAD_LEN * sizeof(uint32_t)) -/* Command Payload length and size for IID commands */ -#define COMMAND_IID_PAYLOAD_LEN 4 -#define COMMAND_IID_PAYLOAD_SZ (COMMAND_IID_PAYLOAD_LEN * sizeof(uint32_t)) -#define MAX_INBAND_PARAM_SZ 4096 -#define Q27_UNITY (1 << 27) -#define Q8_UNITY (1 << 8) -#define CUSTOM_OPENSL_PRESET 18 - -#define VIRTUALIZER_ENABLE_PARAM_SZ \ - (VIRTUALIZER_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define VIRTUALIZER_STRENGTH_PARAM_SZ \ - (VIRTUALIZER_STRENGTH_PARAM_LEN*sizeof(uint32_t)) -#define VIRTUALIZER_OUT_TYPE_PARAM_SZ \ - (VIRTUALIZER_OUT_TYPE_PARAM_LEN*sizeof(uint32_t)) -#define VIRTUALIZER_GAIN_ADJUST_PARAM_SZ \ - (VIRTUALIZER_GAIN_ADJUST_PARAM_LEN*sizeof(uint32_t)) -struct virtualizer_params { - uint32_t device; - uint32_t enable_flag; - uint32_t strength; - uint32_t out_type; - int32_t gain_adjust; -}; - -#define NUM_OSL_REVERB_PRESETS_SUPPORTED 6 -#define REVERB_ENABLE_PARAM_SZ \ - (REVERB_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_MODE_PARAM_SZ \ - (REVERB_MODE_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_PRESET_PARAM_SZ \ - (REVERB_PRESET_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_WET_MIX_PARAM_SZ \ - (REVERB_WET_MIX_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_GAIN_ADJUST_PARAM_SZ \ - (REVERB_GAIN_ADJUST_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_ROOM_LEVEL_PARAM_SZ \ - (REVERB_ROOM_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_ROOM_HF_LEVEL_PARAM_SZ \ - (REVERB_ROOM_HF_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DECAY_TIME_PARAM_SZ \ - (REVERB_DECAY_TIME_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DECAY_HF_RATIO_PARAM_SZ \ - (REVERB_DECAY_HF_RATIO_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_REFLECTIONS_LEVEL_PARAM_SZ \ - (REVERB_REFLECTIONS_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_REFLECTIONS_DELAY_PARAM_SZ \ - (REVERB_REFLECTIONS_DELAY_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_LEVEL_PARAM_SZ \ - (REVERB_LEVEL_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DELAY_PARAM_SZ \ - (REVERB_DELAY_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DIFFUSION_PARAM_SZ \ - (REVERB_DIFFUSION_PARAM_LEN*sizeof(uint32_t)) -#define REVERB_DENSITY_PARAM_SZ \ - (REVERB_DENSITY_PARAM_LEN*sizeof(uint32_t)) -struct reverb_params { - uint32_t device; - uint32_t enable_flag; - uint32_t mode; - uint32_t preset; - uint32_t wet_mix; - int32_t gain_adjust; - int32_t room_level; - int32_t room_hf_level; - uint32_t decay_time; - uint32_t decay_hf_ratio; - int32_t reflections_level; - uint32_t reflections_delay; - int32_t level; - uint32_t delay; - uint32_t diffusion; - uint32_t density; -}; - -#define BASS_BOOST_ENABLE_PARAM_SZ \ - (BASS_BOOST_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define BASS_BOOST_MODE_PARAM_SZ \ - (BASS_BOOST_MODE_PARAM_LEN*sizeof(uint32_t)) -#define BASS_BOOST_STRENGTH_PARAM_SZ \ - (BASS_BOOST_STRENGTH_PARAM_LEN*sizeof(uint32_t)) -struct bass_boost_params { - uint32_t device; - uint32_t enable_flag; - uint32_t mode; - uint32_t strength; -}; - - -#define MAX_EQ_BANDS 12 -#define MAX_OSL_EQ_BANDS 5 -#define EQ_ENABLE_PARAM_SZ \ - (EQ_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define EQ_CONFIG_PARAM_SZ \ - (EQ_CONFIG_PARAM_LEN*sizeof(uint32_t)) -#define EQ_CONFIG_PER_BAND_PARAM_SZ \ - (EQ_CONFIG_PER_BAND_PARAM_LEN*sizeof(uint32_t)) -#define EQ_CONFIG_PARAM_MAX_LEN (EQ_CONFIG_PARAM_LEN+\ - MAX_EQ_BANDS*EQ_CONFIG_PER_BAND_PARAM_LEN) -#define EQ_CONFIG_PARAM_MAX_SZ \ - (EQ_CONFIG_PARAM_MAX_LEN*sizeof(uint32_t)) -#define EQ_NUM_BANDS_PARAM_SZ \ - (EQ_NUM_BANDS_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_LEVELS_PARAM_SZ \ - (EQ_BAND_LEVELS_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_LEVEL_RANGE_PARAM_SZ \ - (EQ_BAND_LEVEL_RANGE_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_FREQS_PARAM_SZ \ - (EQ_BAND_FREQS_PARAM_LEN*sizeof(uint32_t)) -#define EQ_SINGLE_BAND_FREQ_RANGE_PARAM_SZ \ - (EQ_SINGLE_BAND_FREQ_RANGE_PARAM_LEN*sizeof(uint32_t)) -#define EQ_SINGLE_BAND_FREQ_PARAM_SZ \ - (EQ_SINGLE_BAND_FREQ_PARAM_LEN*sizeof(uint32_t)) -#define EQ_BAND_INDEX_PARAM_SZ \ - (EQ_BAND_INDEX_PARAM_LEN*sizeof(uint32_t)) -#define EQ_PRESET_ID_PARAM_SZ \ - (EQ_PRESET_ID_PARAM_LEN*sizeof(uint32_t)) -#define EQ_NUM_PRESETS_PARAM_SZ \ - (EQ_NUM_PRESETS_PARAM_LEN*sizeof(uint8_t)) -struct eq_config_t { - int32_t eq_pregain; - int32_t preset_id; - uint32_t num_bands; -}; -struct eq_per_band_config_t { - int32_t band_idx; - uint32_t filter_type; - uint32_t freq_millihertz; - int32_t gain_millibels; - uint32_t quality_factor; -}; -struct eq_per_band_freq_range_t { - uint32_t band_index; - uint32_t min_freq_millihertz; - uint32_t max_freq_millihertz; -}; - -struct eq_params { - uint32_t device; - uint32_t enable_flag; - struct eq_config_t config; - struct eq_per_band_config_t per_band_cfg[MAX_EQ_BANDS]; - struct eq_per_band_freq_range_t per_band_freq_range[MAX_EQ_BANDS]; - uint32_t band_index; - uint32_t freq_millihertz; -}; - -#define PBE_ENABLE_PARAM_SZ \ - (PBE_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define PBE_CONFIG_PARAM_SZ \ - (PBE_CONFIG_PARAM_LEN*sizeof(uint16_t)) -struct pbe_config_t { - int16_t real_bass_mix; - int16_t bass_color_control; - uint16_t main_chain_delay; - uint16_t xover_filter_order; - uint16_t bandpass_filter_order; - int16_t drc_delay; - uint16_t rms_tav; - int16_t exp_threshold; - uint16_t exp_slope; - int16_t comp_threshold; - uint16_t comp_slope; - uint16_t makeup_gain; - uint32_t comp_attack; - uint32_t comp_release; - uint32_t exp_attack; - uint32_t exp_release; - int16_t limiter_bass_threshold; - int16_t limiter_high_threshold; - int16_t limiter_bass_makeup_gain; - int16_t limiter_high_makeup_gain; - int16_t limiter_bass_gc; - int16_t limiter_high_gc; - int16_t limiter_delay; - uint16_t reserved; - /* place holder for filter coeffs to be followed */ - int32_t p1LowPassCoeffs[5*2]; - int32_t p1HighPassCoeffs[5*2]; - int32_t p1BandPassCoeffs[5*3]; - int32_t p1BassShelfCoeffs[5]; - int32_t p1TrebleShelfCoeffs[5]; -} __packed; - -struct pbe_params { - uint32_t device; - uint32_t enable_flag; - uint32_t cfg_len; - struct pbe_config_t config; -}; - -#define SOFT_VOLUME_ENABLE_PARAM_SZ \ - (SOFT_VOLUME_ENABLE_PARAM_LEN*sizeof(uint32_t)) -#define SOFT_VOLUME_GAIN_MASTER_PARAM_SZ \ - (SOFT_VOLUME_GAIN_MASTER_PARAM_LEN*sizeof(uint32_t)) -#define SOFT_VOLUME_GAIN_2CH_PARAM_SZ \ - (SOFT_VOLUME_GAIN_2CH_PARAM_LEN*sizeof(uint16_t)) -struct soft_volume_params { - uint32_t device; - uint32_t enable_flag; - uint32_t master_gain; - uint32_t left_gain; - uint32_t right_gain; -}; - -struct msm_nt_eff_all_config { - struct bass_boost_params bass_boost; - struct pbe_params pbe; - struct virtualizer_params virtualizer; - struct reverb_params reverb; - struct eq_params equalizer; - struct soft_volume_params saplus_vol; - struct soft_volume_params topo_switch_vol; -}; - -#endif /*_MSM_AUDIO_EFFECTS_H*/ diff --git a/techpack/audio/include/uapi/sound/audio_slimslave.h b/techpack/audio/include/uapi/sound/audio_slimslave.h deleted file mode 100644 index 316a5573f5b4..000000000000 --- a/techpack/audio/include/uapi/sound/audio_slimslave.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __AUDIO_SLIMSLAVE_H__ -#define __AUDIO_SLIMSLAVE_H__ - -#include -#include - -#define AUDIO_SLIMSLAVE_IOCTL_NAME "audio_slimslave" -#define AUDIO_SLIMSLAVE_MAGIC 'S' - -#define AUDIO_SLIMSLAVE_IOCTL_UNVOTE _IO(AUDIO_SLIMSLAVE_MAGIC, 0x00) -#define AUDIO_SLIMSLAVE_IOCTL_VOTE _IO(AUDIO_SLIMSLAVE_MAGIC, 0x01) - -enum { - AUDIO_SLIMSLAVE_UNVOTE, - AUDIO_SLIMSLAVE_VOTE -}; - -#endif diff --git a/techpack/audio/include/uapi/sound/cs35l41.h b/techpack/audio/include/uapi/sound/cs35l41.h deleted file mode 100755 index 59307dbe7e06..000000000000 --- a/techpack/audio/include/uapi/sound/cs35l41.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * linux/sound/cs35l41.h -- Platform data for CS35L41 - * - * Copyright (c) 2018 Cirrus Logic Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __CS35L41_H -#define __CS35L41_H - -struct classh_cfg { - bool classh_bst_override; - bool classh_algo_enable; - int classh_bst_max_limit; - int classh_mem_depth; - int classh_release_rate; - int classh_headroom; - int classh_wk_fet_delay; - int classh_wk_fet_thld; -}; - -struct irq_cfg { - bool is_present; - bool irq_pol_inv; - bool irq_out_en; - int irq_src_sel; -}; - -struct cs35l41_platform_data { - bool sclk_frc; - bool lrclk_frc; - bool right_channel; - bool amp_gain_zc; - bool ng_enable; - int bst_ind; - int bst_vctrl; - int bst_ipk; - int bst_cap; - int temp_warn_thld; - int ng_pcm_thld; - int ng_delay; - int dout_hiz; - struct irq_cfg irq_config1; - struct irq_cfg irq_config2; - struct classh_cfg classh_config; - int mnSpkType; - struct device_node *spk_id_gpio_p; -}; - -struct cs35l41_private { - struct wm_adsp dsp; /* needs to be first member */ - struct snd_soc_codec *codec; - struct cs35l41_platform_data pdata; - struct device *dev; - struct regmap *regmap; - struct regulator_bulk_data supplies[2]; - int num_supplies; - int irq; - int clksrc; - int extclk_freq; - int extclk_cfg; - int sclk; - unsigned int cspl_cmd; - bool dspa_mode; - bool i2s_mode; - bool swire_mode; - bool halo_booted; - bool bus_spi; - /* GPIO for /RST */ - //struct gpio_desc *reset_gpio; - int reset_gpio; - struct completion global_pup_done; - struct completion global_pdn_done; - struct completion mbox_cmd; -}; - -int cs35l41_probe(struct cs35l41_private *cs35l41, - struct cs35l41_platform_data *pdata); -int spk_id_get(struct device_node *np); -#endif /* __CS35L41_H */ diff --git a/techpack/audio/include/uapi/sound/devdep_params.h b/techpack/audio/include/uapi/sound/devdep_params.h deleted file mode 100644 index 66a9cacfcab9..000000000000 --- a/techpack/audio/include/uapi/sound/devdep_params.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef _DEV_DEP_H -#define _DEV_DEP_H - -struct dolby_param_data { - int32_t version; - int32_t device_id; - int32_t be_id; - int32_t param_id; - int32_t length; - int32_t __user *data; -}; - -struct dolby_param_license { - int32_t dmid; - int32_t license_key; -}; - -#define SNDRV_DEVDEP_DAP_IOCTL_SET_PARAM\ - _IOWR('U', 0x10, struct dolby_param_data) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_PARAM\ - _IOR('U', 0x11, struct dolby_param_data) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_COMMAND\ - _IOWR('U', 0x13, struct dolby_param_data) -#define SNDRV_DEVDEP_DAP_IOCTL_DAP_LICENSE\ - _IOWR('U', 0x14, struct dolby_param_license) -#define SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER\ - _IOR('U', 0x15, struct dolby_param_data) - -#define DTS_EAGLE_MODULE 0x00005000 -#define DTS_EAGLE_MODULE_ENABLE 0x00005001 -#define EAGLE_DRIVER_ID 0xF2 -#define DTS_EAGLE_IOCTL_GET_CACHE_SIZE _IOR(EAGLE_DRIVER_ID, 0, int) -#define DTS_EAGLE_IOCTL_SET_CACHE_SIZE _IOW(EAGLE_DRIVER_ID, 1, int) -#define DTS_EAGLE_IOCTL_GET_PARAM _IOR(EAGLE_DRIVER_ID, 2, void*) -#define DTS_EAGLE_IOCTL_SET_PARAM _IOW(EAGLE_DRIVER_ID, 3, void*) -#define DTS_EAGLE_IOCTL_SET_CACHE_BLOCK _IOW(EAGLE_DRIVER_ID, 4, void*) -#define DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE _IOW(EAGLE_DRIVER_ID, 5, void*) -#define DTS_EAGLE_IOCTL_GET_LICENSE _IOR(EAGLE_DRIVER_ID, 6, void*) -#define DTS_EAGLE_IOCTL_SET_LICENSE _IOW(EAGLE_DRIVER_ID, 7, void*) -#define DTS_EAGLE_IOCTL_SEND_LICENSE _IOW(EAGLE_DRIVER_ID, 8, int) -#define DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS _IOW(EAGLE_DRIVER_ID, 9, void*) -#define DTS_EAGLE_FLAG_IOCTL_PRE (1<<30) -#define DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE (1<<31) -#define DTS_EAGLE_FLAG_IOCTL_GETFROMCORE DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE -#define DTS_EAGLE_FLAG_IOCTL_MASK (~(DTS_EAGLE_FLAG_IOCTL_PRE | \ - DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE)) -#define DTS_EAGLE_FLAG_ALSA_GET (1<<31) - -struct dts_eagle_param_desc { - uint32_t id; - uint32_t size; - int32_t offset; - uint32_t device; -} __packed; - -#define HWDEP_FE_BASE 3000 /*unique base for FE hw dep nodes*/ -struct snd_pcm_mmap_fd { - int32_t dir; - int32_t fd; - int32_t size; - int32_t actual_size; -}; - -#define SNDRV_PCM_IOCTL_MMAP_DATA_FD _IOWR('U', 0xd2, struct snd_pcm_mmap_fd) - -#endif diff --git a/techpack/audio/include/uapi/sound/lsm_params.h b/techpack/audio/include/uapi/sound/lsm_params.h deleted file mode 100644 index 57dc3be5d454..000000000000 --- a/techpack/audio/include/uapi/sound/lsm_params.h +++ /dev/null @@ -1,315 +0,0 @@ -#ifndef _UAPI_LSM_PARAMS_H__ -#define _UAPI_LSM_PARAMS_H__ - -#define LSM_POLLING_ENABLE_SUPPORT -#define LSM_EVENT_TIMESTAMP_MODE_SUPPORT - -#include -#include - -#define SNDRV_LSM_VERSION SNDRV_PROTOCOL_VERSION(0, 3, 1) - -#define LSM_MAX_STAGES_PER_SESSION 2 -#define LSM_STAGE_INDEX_FIRST 0 - -#define LSM_OUT_FORMAT_PCM (0) -#define LSM_OUT_FORMAT_ADPCM (1 << 0) - -#define LSM_OUT_DATA_RAW (0) -#define LSM_OUT_DATA_PACKED (1) - -#define LSM_OUT_DATA_EVENTS_DISABLED (0) -#define LSM_OUT_DATA_EVENTS_ENABLED (1) - -#define LSM_OUT_TRANSFER_MODE_RT (0) -#define LSM_OUT_TRANSFER_MODE_FTRT (1) - -#define LSM_ENDPOINT_DETECT_THRESHOLD (0) -#define LSM_OPERATION_MODE (1) -#define LSM_GAIN (2) -#define LSM_MIN_CONFIDENCE_LEVELS (3) -#define LSM_REG_SND_MODEL (4) -#define LSM_DEREG_SND_MODEL (5) -#define LSM_CUSTOM_PARAMS (6) -#define LSM_POLLING_ENABLE (7) -#define LSM_DET_EVENT_TYPE (8) -#define LSM_LAB_CONTROL (9) -#define LSM_PARAMS_MAX (LSM_LAB_CONTROL + 1) - -#define LSM_EVENT_NON_TIME_STAMP_MODE (0) -#define LSM_EVENT_TIME_STAMP_MODE (1) - -#define LSM_DET_EVENT_TYPE_LEGACY (0) -#define LSM_DET_EVENT_TYPE_GENERIC (1) - -/* Valid sample rates for input hw_params */ -#define LSM_INPUT_SAMPLE_RATE_16K 16000 -#define LSM_INPUT_SAMPLE_RATE_48K 48000 - -/* Valid bit-widths for input hw_params */ -#define LSM_INPUT_BIT_WIDTH_16 16 -#define LSM_INPUT_BIT_WIDTH_24 24 - -/* Min and Max channels for input hw_params */ -#define LSM_INPUT_NUM_CHANNELS_MIN 1 -#define LSM_INPUT_NUM_CHANNELS_MAX 9 - -enum lsm_app_id { - LSM_VOICE_WAKEUP_APP_ID = 1, - LSM_VOICE_WAKEUP_APP_ID_V2 = 2, -}; - -enum lsm_detection_mode { - LSM_MODE_KEYWORD_ONLY_DETECTION = 1, - LSM_MODE_USER_KEYWORD_DETECTION -}; - -enum lsm_vw_status { - LSM_VOICE_WAKEUP_STATUS_RUNNING = 1, - LSM_VOICE_WAKEUP_STATUS_DETECTED, - LSM_VOICE_WAKEUP_STATUS_END_SPEECH, - LSM_VOICE_WAKEUP_STATUS_REJECTED -}; - -/* - * Data for LSM_ENDPOINT_DETECT_THRESHOLD param_type - * @epd_begin: Begin threshold - * @epd_end: End threshold - */ -struct snd_lsm_ep_det_thres { - __u32 epd_begin; - __u32 epd_end; -}; - -/* - * Data for LSM_OPERATION_MODE param_type - * @mode: The detection mode to be used - * @detect_failure: Setting to enable failure detections. - */ -struct snd_lsm_detect_mode { - enum lsm_detection_mode mode; - bool detect_failure; -}; - -/* - * Data for LSM_GAIN param_type - * @gain: The gain to be applied on LSM - */ -struct snd_lsm_gain { - __u16 gain; -}; - -/* - * Data for LSM_POLLING_ENABLE param_type - * @poll_en: Polling enable or disable - */ -struct snd_lsm_poll_enable { - bool poll_en; -}; - -/* - * Data for LSM_DET_EVENT_TYPE param_type - * @event_type: LSM_DET_EVENT_TYPE_LEGACY or LSM_DET_EVENT_TYPE_GENERIC - * @mode: Type of information in detection event payload - */ -struct snd_lsm_det_event_type { - __u32 event_type; - __u32 mode; -}; - -struct snd_lsm_sound_model_v2 { - __u8 __user *data; - __u8 *confidence_level; - __u32 data_size; - enum lsm_detection_mode detection_mode; - __u8 num_confidence_levels; - bool detect_failure; -}; - -struct snd_lsm_session_data { - enum lsm_app_id app_id; -}; - -/* - * Stage info for multi-stage session - * @app_type: acdb app_type to be used to map topology/cal for the stage - * @lpi_enable: low power island mode applicable for the stage - */ -struct snd_lsm_stage_info { - __u32 app_type; - __u32 lpi_enable; -}; - -/* - * Session info for multi-stage session - * @app_id: VoiceWakeup engine id, this is now used to just validate input arg - * @num_stages: number of detection stages to be used - * @stage_info: stage info for each of the stage being used, ordered by index - */ -struct snd_lsm_session_data_v2 { - enum lsm_app_id app_id; - __u32 num_stages; - struct snd_lsm_stage_info stage_info[LSM_MAX_STAGES_PER_SESSION]; -}; - -/* - * Data for LSM_LAB_CONTROL param_type - * @enable: lab enable or disable - */ -struct snd_lsm_lab_control { - __u32 enable; -}; - -struct snd_lsm_event_status { - __u16 status; - __u16 payload_size; - __u8 payload[0]; -}; - -struct snd_lsm_event_status_v3 { - __u32 timestamp_lsw; - __u32 timestamp_msw; - __u16 status; - __u16 payload_size; - __u8 payload[0]; -}; - -struct snd_lsm_detection_params { - __u8 *conf_level; - enum lsm_detection_mode detect_mode; - __u8 num_confidence_levels; - bool detect_failure; - bool poll_enable; -}; - -/* - * Param info for each parameter type - * @module_id: Module to which parameter is to be set - * @param_id: Parameter that is to be set - * @param_size: size (in number of bytes) for the data - * in param_data. - * For confidence levels, this is num_conf_levels - * For REG_SND_MODEL, this is size of sound model - * For CUSTOM_PARAMS, this is size of the entire blob of data - * @param_data: Data for the parameter. - * For some param_types this is a structure defined, ex: LSM_GAIN - * For CONFIDENCE_LEVELS, this is array of confidence levels - * For REG_SND_MODEL, this is the sound model data - * For CUSTOM_PARAMS, this is the blob of custom data. - * @param_type: Parameter type as defined in values upto LSM_PARAMS_MAX - */ -struct lsm_params_info { - __u32 module_id; - __u32 param_id; - __u32 param_size; - __u8 __user *param_data; - uint32_t param_type; -}; - -/* - * Param info(version 2) for each parameter type - * - * Existing member variables: - * @module_id: Module to which parameter is to be set - * @param_id: Parameter that is to be set - * @param_size: size (in number of bytes) for the data - * in param_data. - * For confidence levels, this is num_conf_levels - * For REG_SND_MODEL, this is size of sound model - * For CUSTOM_PARAMS, this is size of the entire blob of data - * @param_data: Data for the parameter. - * For some param_types this is a structure defined, ex: LSM_GAIN - * For CONFIDENCE_LEVELS, this is array of confidence levels - * For REG_SND_MODEL, this is the sound model data - * For CUSTOM_PARAMS, this is the blob of custom data. - * @param_type: Parameter type as defined in values upto LSM_PARAMS_MAX - * - * Member variables applicable only to V2: - * @instance_id: instance id of the param to which parameter is to be set - * @stage_idx: detection stage for which the param is applicable - */ -struct lsm_params_info_v2 { - __u32 module_id; - __u32 param_id; - __u32 param_size; - __u8 __user *param_data; - uint32_t param_type; - __u16 instance_id; - __u16 stage_idx; -}; - -/* - * Data passed to the SET_PARAM_V2 IOCTL - * @num_params: Number of params that are to be set - * should not be greater than LSM_PARAMS_MAX - * @params: Points to an array of lsm_params_info - * Each entry points to one parameter to set - * @data_size: size (in bytes) for params - * should be equal to - * num_params * sizeof(struct lsm_parms_info) - */ -struct snd_lsm_module_params { - __u8 __user *params; - __u32 num_params; - __u32 data_size; -}; - -/* - * Data passed to LSM_OUT_FORMAT_CFG IOCTL - * @format: The media format enum - * @packing: indicates the packing method used for data path - * @events: indicates whether data path events need to be enabled - * @transfer_mode: indicates whether FTRT mode or RT mode. - */ -struct snd_lsm_output_format_cfg { - __u8 format; - __u8 packing; - __u8 events; - __u8 mode; -}; - -/* - * Data passed to SNDRV_LSM_SET_INPUT_HW_PARAMS ioctl - * - * @sample_rate: Sample rate of input to lsm. - * valid values are 16000 and 48000 - * @bit_width: Bit width of audio samples input to lsm. - * valid values are 16 and 24 - * @num_channels: Number of channels input to lsm. - * valid values are range from 1 to 16 - */ -struct snd_lsm_input_hw_params { - __u32 sample_rate; - __u16 bit_width; - __u16 num_channels; -} __packed; - -#define SNDRV_LSM_DEREG_SND_MODEL _IOW('U', 0x01, int) -#define SNDRV_LSM_EVENT_STATUS _IOW('U', 0x02, struct snd_lsm_event_status) -#define SNDRV_LSM_ABORT_EVENT _IOW('U', 0x03, int) -#define SNDRV_LSM_START _IOW('U', 0x04, int) -#define SNDRV_LSM_STOP _IOW('U', 0x05, int) -#define SNDRV_LSM_SET_SESSION_DATA _IOW('U', 0x06, struct snd_lsm_session_data) -#define SNDRV_LSM_REG_SND_MODEL_V2 _IOW('U', 0x07,\ - struct snd_lsm_sound_model_v2) -#define SNDRV_LSM_LAB_CONTROL _IOW('U', 0x08, uint32_t) -#define SNDRV_LSM_STOP_LAB _IO('U', 0x09) -#define SNDRV_LSM_SET_PARAMS _IOW('U', 0x0A, \ - struct snd_lsm_detection_params) -#define SNDRV_LSM_SET_MODULE_PARAMS _IOW('U', 0x0B, \ - struct snd_lsm_module_params) -#define SNDRV_LSM_OUT_FORMAT_CFG _IOW('U', 0x0C, \ - struct snd_lsm_output_format_cfg) -#define SNDRV_LSM_SET_PORT _IO('U', 0x0D) -#define SNDRV_LSM_SET_FWK_MODE_CONFIG _IOW('U', 0x0E, uint32_t) -#define SNDRV_LSM_EVENT_STATUS_V3 _IOW('U', 0x0F, \ - struct snd_lsm_event_status_v3) -#define SNDRV_LSM_GENERIC_DET_EVENT _IOW('U', 0x10, struct snd_lsm_event_status) -#define SNDRV_LSM_SET_INPUT_HW_PARAMS _IOW('U', 0x11, \ - struct snd_lsm_input_hw_params) -#define SNDRV_LSM_SET_SESSION_DATA_V2 _IOW('U', 0x12, \ - struct snd_lsm_session_data_v2) -#define SNDRV_LSM_SET_MODULE_PARAMS_V2 _IOW('U', 0x13, \ - struct snd_lsm_module_params) - -#endif diff --git a/techpack/audio/include/uapi/sound/msm-cirrus-playback.h b/techpack/audio/include/uapi/sound/msm-cirrus-playback.h deleted file mode 100755 index 6f118a45497a..000000000000 --- a/techpack/audio/include/uapi/sound/msm-cirrus-playback.h +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (c) 2016 Cirrus Logic, Inc. - * Copyright (C) 2019 XiaoMi, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _UAPI_MSM_CIRRUS_SPK_PR_H -#define _UAPI_MSM_CIRRUS_SPK_PR_H - -#include -#include - - -#define CIRRUS_SP 0x10027053 -#define CIRRUS_SP_ENABLE 0x10002001 - -#define CRUS_MODULE_ID_TX 0x00000002 -#define CRUS_MODULE_ID_RX 0x00000001 - -/* - * CRUS_PARAM_RX/TX_SET_USECASE - * 0 = Music Playback in firmware - * 1 = VOICE Playback in firmware - * 2 = Tuning file loaded using external - * config load command - * - * uses crus_rx_run_case_ctrl for RX apr pckt - * uses crus_single_data_ctrl for TX apr pckt - * - */ -#define CRUS_PARAM_RX_SET_USECASE 0x00A1AF02 -#define CRUS_PARAM_TX_SET_USECASE 0x00A1BF0A -/* - * CRUS_PARAM_RX/TX_SET_CALIB - * Non-zero value to run speaker - * calibration sequence - * - * uses crus_single_data_t apr pckt - */ -#define CRUS_PARAM_RX_SET_CALIB 0x00A1AF03 -#define CRUS_PARAM_TX_SET_CALIB 0x00A1BF03 -/* - * CRUS_PARAM_RX/TX_SET_EXT_CONFIG - * config string loaded from libfirmware - * max of 7K paramters - * - * uses crus_external_config_t apr pckt - */ -#define CRUS_PARAM_RX_SET_EXT_CONFIG 0x00A1AF05 -#define CRUS_PARAM_TX_SET_EXT_CONFIG 0x00A1BF08 -/* - * CRUS_PARAM_RX_GET_TEMP - * get current Temp and calibration data - * - * CRUS_PARAM_TX_GET_TEMP_CAL - * get results of calibration sequence - * - * uses cirrus_cal_result_t apr pckt - */ -#define CRUS_PARAM_RX_GET_TEMP 0x00A1AF07 -#define CRUS_PARAM_TX_GET_TEMP_CAL 0x00A1BF06 -/* - * CRUS_PARAM_RX_SET_DELTA_CONFIG - * load seamless transition config string - * - * CRUS_PARAM_RX_RUN_DELTA_CONFIG - * execute the loaded seamless transition - */ -#define CRUS_PARAM_RX_SET_DELTA_CONFIG 0x00A1AF0D -#define CRUS_PARAM_RX_RUN_DELTA_CONFIG 0x00A1AF0E -/* - * CRUS_PARAM_RX_CHANNEL_SWAP - * initiate l/r channel swap transition - */ -#define CRUS_PARAM_RX_CHANNEL_SWAP 0x00A1AF12 -#define CRUS_PARAM_RX_GET_CHANNEL_SWAP 0x00A1AF13 -/* - * CRUS_PARAM_RX_SET_ATTENUATION - * set volume attenuation in volume control blocks 1 & 2 - */ -#define CRUS_PARAM_RX_SET_ATTENUATION 0x00A1AF0A -#define CRUS_AFE_PARAM_ID_ENABLE 0x00010203 - -#define SPK_PROT_IOCTL_MAGIC 'a' - -#define CRUS_SP_IOCTL_GET _IOWR(SPK_PROT_IOCTL_MAGIC, 219, void *) -#define CRUS_SP_IOCTL_SET _IOWR(SPK_PROT_IOCTL_MAGIC, 220, void *) -#define CRUS_SP_IOCTL_GET_CALIB _IOWR(SPK_PROT_IOCTL_MAGIC, 221, void *) -#define CRUS_SP_IOCTL_SET_CALIB _IOWR(SPK_PROT_IOCTL_MAGIC, 222, void *) -#define CRUS_SP_IOCTL_READ_CALIB_FROM_SLOT _IOWR(SPK_PROT_IOCTL_MAGIC, 223, void *) -#define CRUS_SP_IOCTL_WRITE_CALIB_TO_SLOT _IOWR(SPK_PROT_IOCTL_MAGIC, 224, void *) - -#define CRUS_SP_IOCTL_GET32 _IOWR(SPK_PROT_IOCTL_MAGIC, 219, \ - compat_uptr_t) -#define CRUS_SP_IOCTL_SET32 _IOWR(SPK_PROT_IOCTL_MAGIC, 220, \ - compat_uptr_t) -#define CRUS_SP_IOCTL_GET_CALIB32 _IOWR(SPK_PROT_IOCTL_MAGIC, 221, \ - compat_uptr_t) -#define CRUS_SP_IOCTL_SET_CALIB32 _IOWR(SPK_PROT_IOCTL_MAGIC, 222, \ - compat_uptr_t) -#define CRUS_SP_IOCTL_READ_CALIB_FROM_SLOT32 _IOWR(SPK_PROT_IOCTL_MAGIC, 223, \ - compat_uptr_t) -#define CRUS_SP_IOCTL_WRITE_CALIB_TO_SLOT32 _IOWR(SPK_PROT_IOCTL_MAGIC, 224, \ - compat_uptr_t) - -struct crus_sp_ioctl_header { - uint32_t size; - uint32_t module_id; - uint32_t param_id; - uint32_t data_length; - void *data; -}; - -#endif /* _UAPI_MSM_CIRRUS_SPK_PR_H */ diff --git a/techpack/audio/include/uapi/sound/msmcal-hwdep.h b/techpack/audio/include/uapi/sound/msmcal-hwdep.h deleted file mode 100644 index f2891863fa47..000000000000 --- a/techpack/audio/include/uapi/sound/msmcal-hwdep.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _CALIB_HWDEP_H -#define _CALIB_HWDEP_H - -#define WCD9XXX_CODEC_HWDEP_NODE 1000 -#define AQT1000_CODEC_HWDEP_NODE 1001 -#define Q6AFE_HWDEP_NODE 1002 -enum wcd_cal_type { - WCD9XXX_MIN_CAL, - WCD9XXX_ANC_CAL = WCD9XXX_MIN_CAL, - WCD9XXX_MAD_CAL, - WCD9XXX_MBHC_CAL, - WCD9XXX_VBAT_CAL, - WCD9XXX_MAX_CAL, -}; - -struct wcdcal_ioctl_buffer { - __u32 size; - __u8 __user *buffer; - enum wcd_cal_type cal_type; -}; - -#define SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE \ - _IOW('U', 0x1, struct wcdcal_ioctl_buffer) - -enum q6afe_cal_type { - Q6AFE_MIN_CAL, - Q6AFE_VAD_CORE_CAL = Q6AFE_MIN_CAL, - Q6AFE_MAX_CAL, -}; - -struct q6afecal_ioctl_buffer { - __u32 size; - __u8 __user *buffer; - enum q6afe_cal_type cal_type; -}; - -#define SNDRV_IOCTL_HWDEP_VAD_CAL_TYPE \ - _IOW('U', 0x1, struct q6afecal_ioctl_buffer) - -#endif /*_CALIB_HWDEP_H*/ diff --git a/techpack/audio/include/uapi/sound/voice_params.h b/techpack/audio/include/uapi/sound/voice_params.h deleted file mode 100644 index 43e3b9d0aa49..000000000000 --- a/techpack/audio/include/uapi/sound/voice_params.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __VOICE_PARAMS_H__ -#define __VOICE_PARAMS_H__ - -#include -#include - -enum voice_lch_mode { - VOICE_LCH_START = 1, - VOICE_LCH_STOP -}; - -#define SNDRV_VOICE_IOCTL_LCH _IOW('U', 0x00, enum voice_lch_mode) - -#endif diff --git a/techpack/audio/include/uapi/sound/wcd-dsp-glink.h b/techpack/audio/include/uapi/sound/wcd-dsp-glink.h deleted file mode 100644 index 39d128d370a0..000000000000 --- a/techpack/audio/include/uapi/sound/wcd-dsp-glink.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _WCD_DSP_GLINK_H -#define _WCD_DSP_GLINK_H - -#include - -#define WDSP_CH_NAME_MAX_LEN 50 - -enum { - WDSP_REG_PKT = 1, - WDSP_CMD_PKT, - WDSP_READY_PKT, -}; -#define WDSP_READY_PKT WDSP_READY_PKT - -/* - * struct wdsp_reg_pkt - Glink channel information structure format - * @no_of_channels: Number of glink channels to open - * @payload[0]: Dynamic array contains all the glink channels information - */ -struct wdsp_reg_pkt { - __u8 no_of_channels; - __u8 payload[0]; -}; - -/* - * struct wdsp_cmd_pkt - WDSP command packet format - * @ch_name: Name of the glink channel - * @payload_size: Size of the payload - * @payload[0]: Actual data payload - */ -struct wdsp_cmd_pkt { - char ch_name[WDSP_CH_NAME_MAX_LEN]; - __u32 payload_size; - __u8 payload[0]; -}; - -/* - * struct wdsp_write_pkt - Format that userspace send the data to driver. - * @pkt_type: Type of the packet(REG or CMD PKT) - * @payload[0]: Payload is either cmd or reg pkt structure based on pkt type - */ -struct wdsp_write_pkt { - __u8 pkt_type; - __u8 payload[0]; -}; - -/* - * struct wdsp_glink_ch_cfg - Defines the glink channel configuration. - * @ch_name: Name of the glink channel - * @latency_in_us: Latency specified in micro seconds for QOS - * @no_of_intents: Number of intents prequeued - * @intents_size[0]: Dynamic array to specify size of each intent - */ -struct wdsp_glink_ch_cfg { - char name[WDSP_CH_NAME_MAX_LEN]; - __u32 latency_in_us; - __u32 no_of_intents; - __u32 intents_size[0]; -}; -#endif /* _WCD_DSP_GLINK_H */ diff --git a/techpack/audio/ipc/Android.mk b/techpack/audio/ipc/Android.mk deleted file mode 100644 index af0fbef6eb3f..000000000000 --- a/techpack/audio/ipc/Android.mk +++ /dev/null @@ -1,73 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) atoll $(TRINKET)),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) atoll $(TRINKET)),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=apr_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_apr.ko -LOCAL_MODULE_KBUILD_NAME := apr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_wglink.ko -LOCAL_MODULE_KBUILD_NAME := wglink_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/ipc/Kbuild b/techpack/audio/ipc/Kbuild deleted file mode 100644 index edc3b3bf5615..000000000000 --- a/techpack/audio/ipc/Kbuild +++ /dev/null @@ -1,166 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -# These are configurable via Kconfig for kernel-based builds -# Need to explicitly configure for Android-based builds -KDIR := $(TOP)/kernel/msm-4.14 - -ifeq ($(KERNEL_BUILD), 1) - AUDIO_ROOT := $(KDIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ IPC ############ - -ifdef CONFIG_MSM_QDSP6_APRV2_RPMSG -APRV_GLINK += apr.o -APRV_GLINK += apr_v2.o -APRV_GLINK += apr_tal_rpmsg.o -endif - -ifdef CONFIG_MSM_QDSP6_APRV3_RPMSG -APRV_GLINK += apr.o -APRV_GLINK += apr_v3.o -APRV_GLINK += apr_tal_rpmsg.o -endif - -ifdef CONFIG_WCD_DSP_GLINK -WDSP_GLINK += wcd-dsp-glink.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -endif - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif -# If the module name is not "wlan", then the define MULTI_IF_NAME to be the -# same a the QCA CHIP name. The host driver will then append MULTI_IF_NAME to -# any string that must be unique for all instances of the driver on the system. -# This allows multiple instances of the driver with different module names. -# If the module name is wlan, leave MULTI_IF_NAME undefined and the code will -# treat the driver as the primary driver. -ifneq ($(MODNAME), qdsp6v2) -CHIP_NAME ?= $(MODNAME) -CDEFINES += -DMULTI_IF_NAME=\"$(CHIP_NAME)\" -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_MSM_QDSP6_APRV2_RPMSG) += apr_dlkm.o -obj-$(CONFIG_MSM_QDSP6_APRV3_RPMSG) += apr_dlkm.o -apr_dlkm-y := $(APRV_GLINK) - -obj-$(CONFIG_WCD_DSP_GLINK) += wglink_dlkm.o -wglink_dlkm-y := $(WDSP_GLINK) - -# inject some build related information diff --git a/techpack/audio/ipc/apr.c b/techpack/audio/ipc/apr.c deleted file mode 100644 index f5b602de4453..000000000000 --- a/techpack/audio/ipc/apr.c +++ /dev/null @@ -1,1254 +0,0 @@ -/* Copyright (c) 2010-2014, 2016-2020 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define APR_PKT_IPC_LOG_PAGE_CNT 2 - -static struct apr_q6 q6; -static struct apr_client client[APR_DEST_MAX][APR_CLIENT_MAX]; -static void *apr_pkt_ctx; -static wait_queue_head_t modem_wait; -static bool is_modem_up; -static char *subsys_name = NULL; -/* Subsystem restart: QDSP6 data, functions */ -static struct workqueue_struct *apr_reset_workqueue; -static void apr_reset_deregister(struct work_struct *work); -static void dispatch_event(unsigned long code, uint16_t proc); -struct apr_reset_work { - void *handle; - struct work_struct work; -}; - -struct apr_chld_device { - struct platform_device *pdev; - struct list_head node; -}; - -struct apr_private { - struct device *dev; - spinlock_t apr_lock; - bool is_initial_boot; - struct work_struct add_chld_dev_work; -}; - -static struct apr_private *apr_priv; -static bool apr_cf_debug; - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_apr_debug; -static ssize_t apr_debug_write(struct file *filp, const char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - char cmd; - - if (copy_from_user(&cmd, ubuf, 1)) - return -EFAULT; - - apr_cf_debug = (cmd == '1') ? true : false; - - return cnt; -} - -static const struct file_operations apr_debug_ops = { - .write = apr_debug_write, -}; -#endif - -#define APR_PKT_INFO(x...) \ -do { \ - if (apr_pkt_ctx) \ - ipc_log_string(apr_pkt_ctx, ": "x); \ -} while (0) - - -struct apr_svc_table { - char name[64]; - int idx; - int id; - int client_id; -}; - -static const struct apr_svc_table svc_tbl_qdsp6[] = { - { - .name = "AFE", - .idx = 0, - .id = APR_SVC_AFE, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "ASM", - .idx = 1, - .id = APR_SVC_ASM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "ADM", - .idx = 2, - .id = APR_SVC_ADM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "CORE", - .idx = 3, - .id = APR_SVC_ADSP_CORE, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "TEST", - .idx = 4, - .id = APR_SVC_TEST_CLIENT, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "MVM", - .idx = 5, - .id = APR_SVC_ADSP_MVM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "CVS", - .idx = 6, - .id = APR_SVC_ADSP_CVS, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "CVP", - .idx = 7, - .id = APR_SVC_ADSP_CVP, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "USM", - .idx = 8, - .id = APR_SVC_USM, - .client_id = APR_CLIENT_AUDIO, - }, - { - .name = "VIDC", - .idx = 9, - .id = APR_SVC_VIDC, - }, - { - .name = "LSM", - .idx = 10, - .id = APR_SVC_LSM, - .client_id = APR_CLIENT_AUDIO, - }, -}; - -static struct apr_svc_table svc_tbl_voice[] = { - { - .name = "VSM", - .idx = 0, - .id = APR_SVC_VSM, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "VPM", - .idx = 1, - .id = APR_SVC_VPM, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "MVS", - .idx = 2, - .id = APR_SVC_MVS, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "MVM", - .idx = 3, - .id = APR_SVC_MVM, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "CVS", - .idx = 4, - .id = APR_SVC_CVS, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "CVP", - .idx = 5, - .id = APR_SVC_CVP, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "SRD", - .idx = 6, - .id = APR_SVC_SRD, - .client_id = APR_CLIENT_VOICE, - }, - { - .name = "TEST", - .idx = 7, - .id = APR_SVC_TEST_CLIENT, - .client_id = APR_CLIENT_VOICE, - }, -}; - -/** - * apr_get_modem_state: - * - * Returns current modem load status - * - */ -enum apr_subsys_state apr_get_modem_state(void) -{ - return atomic_read(&q6.modem_state); -} -EXPORT_SYMBOL(apr_get_modem_state); - -/** - * apr_set_modem_state - Update modem load status. - * - * @state: State to update modem load status - * - */ -void apr_set_modem_state(enum apr_subsys_state state) -{ - atomic_set(&q6.modem_state, state); -} -EXPORT_SYMBOL(apr_set_modem_state); - -enum apr_subsys_state apr_cmpxchg_modem_state(enum apr_subsys_state prev, - enum apr_subsys_state new) -{ - return atomic_cmpxchg(&q6.modem_state, prev, new); -} - -static void apr_modem_down(unsigned long opcode) -{ - apr_set_modem_state(APR_SUBSYS_DOWN); - dispatch_event(opcode, APR_DEST_MODEM); -} - -static void apr_modem_up(void) -{ - if (apr_cmpxchg_modem_state(APR_SUBSYS_DOWN, APR_SUBSYS_UP) == - APR_SUBSYS_DOWN) - wake_up(&modem_wait); - is_modem_up = 1; -} - -enum apr_subsys_state apr_get_q6_state(void) -{ - return atomic_read(&q6.q6_state); -} -EXPORT_SYMBOL(apr_get_q6_state); - -int apr_set_q6_state(enum apr_subsys_state state) -{ - pr_debug("%s: setting adsp state %d\n", __func__, state); - if (state < APR_SUBSYS_DOWN || state > APR_SUBSYS_LOADED) - return -EINVAL; - atomic_set(&q6.q6_state, state); - return 0; -} -EXPORT_SYMBOL(apr_set_q6_state); - -static void apr_ssr_disable(struct device *dev, void *data) -{ - apr_set_q6_state(APR_SUBSYS_DOWN); -} - -static const struct snd_event_ops apr_ssr_ops = { - .disable = apr_ssr_disable, -}; - -static void apr_adsp_down(unsigned long opcode) -{ - pr_info("%s: Q6 is Down\n", __func__); - snd_event_notify(apr_priv->dev, SND_EVENT_DOWN); - apr_set_q6_state(APR_SUBSYS_DOWN); - dispatch_event(opcode, APR_DEST_QDSP6); -} - -static void apr_add_child_devices(struct work_struct *work) -{ - int ret; - - ret = of_platform_populate(apr_priv->dev->of_node, - NULL, NULL, apr_priv->dev); - if (ret) - dev_err(apr_priv->dev, "%s: failed to add child nodes, ret=%d\n", - __func__, ret); -} - -static void apr_adsp_up(void) -{ - pr_info("%s: Q6 is Up\n", __func__); - apr_set_q6_state(APR_SUBSYS_LOADED); - - spin_lock(&apr_priv->apr_lock); - if (apr_priv->is_initial_boot) - schedule_work(&apr_priv->add_chld_dev_work); - spin_unlock(&apr_priv->apr_lock); - snd_event_notify(apr_priv->dev, SND_EVENT_UP); -} - -int apr_load_adsp_image(void) -{ - int rc = 0; - - mutex_lock(&q6.lock); - if (apr_get_q6_state() == APR_SUBSYS_UP) { - q6.pil = subsystem_get("adsp"); - if (IS_ERR(q6.pil)) { - rc = PTR_ERR(q6.pil); - pr_err("APR: Unable to load q6 image, error:%d\n", rc); - } else { - apr_set_q6_state(APR_SUBSYS_LOADED); - pr_debug("APR: Image is loaded, stated\n"); - } - } else if (apr_get_q6_state() == APR_SUBSYS_LOADED) { - pr_debug("APR: q6 image already loaded\n"); - } else { - pr_debug("APR: cannot load state %d\n", apr_get_q6_state()); - } - mutex_unlock(&q6.lock); - return rc; -} - -struct apr_client *apr_get_client(int dest_id, int client_id) -{ - return &client[dest_id][client_id]; -} - -/** - * apr_send_pkt - Clients call to send packet - * to destination processor. - * - * @handle: APR service handle - * @buf: payload to send to destination processor. - * - * Returns Bytes(>0)pkt_size on success or error on failure. - */ -int apr_send_pkt(void *handle, uint32_t *buf) -{ - struct apr_svc *svc = handle; - struct apr_client *clnt; - struct apr_hdr *hdr; - uint16_t dest_id; - uint16_t client_id; - uint16_t w_len; - int rc; - unsigned long flags; - - if (!handle || !buf) { - pr_err("APR: Wrong parameters\n"); - return -EINVAL; - } - if (svc->need_reset) { - pr_err_ratelimited("apr: send_pkt service need reset\n"); - return -ENETRESET; - } - - if ((svc->dest_id == APR_DEST_QDSP6) && - (apr_get_q6_state() != APR_SUBSYS_LOADED)) { - pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); - return -ENETRESET; - } else if ((svc->dest_id == APR_DEST_MODEM) && - (apr_get_modem_state() == APR_SUBSYS_DOWN)) { - pr_err("apr: Still Modem is not Up\n"); - return -ENETRESET; - } - - spin_lock_irqsave(&svc->w_lock, flags); - dest_id = svc->dest_id; - client_id = svc->client_id; - clnt = &client[dest_id][client_id]; - - if (!client[dest_id][client_id].handle) { - pr_err_ratelimited("APR: Still service is not yet opened\n"); - spin_unlock_irqrestore(&svc->w_lock, flags); - return -EINVAL; - } - hdr = (struct apr_hdr *)buf; - - hdr->src_domain = APR_DOMAIN_APPS; - hdr->src_svc = svc->id; - hdr->dest_domain = svc->dest_domain; - hdr->dest_svc = svc->id; - - if (unlikely(apr_cf_debug)) { - APR_PKT_INFO( - "Tx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode, - hdr->token); - } - - rc = apr_tal_write(clnt->handle, buf, - (struct apr_pkt_priv *)&svc->pkt_owner, - hdr->pkt_size); - if (rc >= 0) { - w_len = rc; - if (w_len != hdr->pkt_size) { - pr_err("%s: Unable to write whole APR pkt successfully: %d\n", - __func__, rc); - rc = -EINVAL; - } - } else { - pr_err_ratelimited("%s: Write APR pkt failed with error %d\n", - __func__, rc); - if (rc == -ECONNRESET) { - pr_err_ratelimited("%s: Received reset error from tal\n", - __func__); - apr_set_q6_state(APR_SUBSYS_DOWN); - rc = -ENETRESET; - } - } - spin_unlock_irqrestore(&svc->w_lock, flags); - - return rc; -} -EXPORT_SYMBOL(apr_send_pkt); - -int apr_pkt_config(void *handle, struct apr_pkt_cfg *cfg) -{ - struct apr_svc *svc = (struct apr_svc *)handle; - uint16_t dest_id; - uint16_t client_id; - struct apr_client *clnt; - - if (!handle) { - pr_err("%s: Invalid handle\n", __func__); - return -EINVAL; - } - - if (svc->need_reset) { - pr_err("%s: service need reset\n", __func__); - return -ENETRESET; - } - - svc->pkt_owner = cfg->pkt_owner; - dest_id = svc->dest_id; - client_id = svc->client_id; - clnt = &client[dest_id][client_id]; - - return apr_tal_rx_intents_config(clnt->handle, - cfg->intents.num_of_intents, cfg->intents.size); -} - -/** - * apr_register - Clients call to register - * to APR. - * - * @dest: destination processor - * @svc_name: name of service to register as - * @svc_fn: callback function to trigger when response - * ack or packets received from destination processor. - * @src_port: Port number within a service - * @priv: private data of client, passed back in cb fn. - * - * Returns apr_svc handle on success or NULL on failure. - */ -struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn, - uint32_t src_port, void *priv) -{ - struct apr_client *clnt; - int client_id = 0; - int svc_idx = 0; - int svc_id = 0; - int dest_id = 0; - int domain_id = 0; - int temp_port = 0; - struct apr_svc *svc = NULL; - int rc = 0; - bool can_open_channel = true; - - if (!dest || !svc_name || !svc_fn) - return NULL; - - if (!strcmp(dest, "ADSP")) - domain_id = APR_DOMAIN_ADSP; - else if (!strcmp(dest, "MODEM")) { - /* Don't request for SMD channels if destination is MODEM, - * as these channels are no longer used and these clients - * are to listen only for MODEM SSR events - */ - can_open_channel = false; - domain_id = APR_DOMAIN_MODEM; - } else { - pr_err("APR: wrong destination\n"); - goto done; - } - - dest_id = apr_get_dest_id(dest); - - if (dest_id == APR_DEST_QDSP6) { - if (apr_get_q6_state() != APR_SUBSYS_LOADED) { - pr_err_ratelimited("%s: adsp not up\n", __func__); - return NULL; - } - pr_debug("%s: adsp Up\n", __func__); - } else if (dest_id == APR_DEST_MODEM) { - if (apr_get_modem_state() == APR_SUBSYS_DOWN) { - if (is_modem_up) { - pr_err("%s: modem shutdown due to SSR, ret", - __func__); - return NULL; - } - pr_debug("%s: Wait for modem to bootup\n", __func__); - rc = wait_event_interruptible_timeout(modem_wait, - (apr_get_modem_state() == APR_SUBSYS_UP), - (1 * HZ)); - if (rc == 0) { - pr_err("%s: Modem is not Up\n", __func__); - return NULL; - } - } - pr_debug("%s: modem Up\n", __func__); - } - - if (apr_get_svc(svc_name, domain_id, &client_id, &svc_idx, &svc_id)) { - pr_err_ratelimited("%s: apr_get_svc failed\n", __func__); - goto done; - } - - clnt = &client[dest_id][client_id]; - mutex_lock(&clnt->m_lock); - if (!clnt->handle && can_open_channel) { - clnt->handle = apr_tal_open(client_id, dest_id, - APR_DL_SMD, apr_cb_func, NULL); - if (!clnt->handle) { - svc = NULL; - pr_err_ratelimited("APR: Unable to open handle\n"); - mutex_unlock(&clnt->m_lock); - goto done; - } - } - mutex_unlock(&clnt->m_lock); - svc = &clnt->svc[svc_idx]; - mutex_lock(&svc->m_lock); - clnt->id = client_id; - if (svc->need_reset) { - mutex_unlock(&svc->m_lock); - pr_err_ratelimited("APR: Service needs reset\n"); - svc = NULL; - goto done; - } - svc->id = svc_id; - svc->dest_id = dest_id; - svc->client_id = client_id; - svc->dest_domain = domain_id; - svc->pkt_owner = APR_PKT_OWNER_DRIVER; - - if (src_port != 0xFFFFFFFF) { - temp_port = ((src_port >> 8) * 8) + (src_port & 0xFF); - pr_debug("port = %d t_port = %d\n", src_port, temp_port); - if (temp_port >= APR_MAX_PORTS || temp_port < 0) { - pr_err("APR: temp_port out of bounds\n"); - mutex_unlock(&svc->m_lock); - return NULL; - } - if (!svc->svc_cnt) - clnt->svc_cnt++; - svc->port_cnt++; - svc->port_fn[temp_port] = svc_fn; - svc->port_priv[temp_port] = priv; - svc->svc_cnt++; - } else { - if (!svc->fn) { - if (!svc->svc_cnt) - clnt->svc_cnt++; - svc->fn = svc_fn; - svc->priv = priv; - svc->svc_cnt++; - } - } - - mutex_unlock(&svc->m_lock); -done: - return svc; -} -EXPORT_SYMBOL(apr_register); - - -void apr_cb_func(void *buf, int len, void *priv) -{ - struct apr_client_data data; - struct apr_client *apr_client; - struct apr_svc *c_svc; - struct apr_hdr *hdr; - uint16_t hdr_size; - uint16_t msg_type; - uint16_t ver; - uint16_t src; - uint16_t svc; - uint16_t clnt; - int i; - int temp_port = 0; - uint32_t *ptr; - - pr_debug("APR2: len = %d\n", len); - ptr = buf; - pr_debug("\n*****************\n"); - for (i = 0; i < len/4; i++) - pr_debug("%x ", ptr[i]); - pr_debug("\n"); - pr_debug("\n*****************\n"); - - if (!buf || len <= APR_HDR_SIZE) { - pr_err("APR: Improper apr pkt received:%pK %d\n", buf, len); - return; - } - hdr = buf; - - ver = hdr->hdr_field; - ver = (ver & 0x000F); - if (ver > APR_PKT_VER + 1) { - pr_err("APR: Wrong version: %d\n", ver); - return; - } - - hdr_size = hdr->hdr_field; - hdr_size = ((hdr_size & 0x00F0) >> 0x4) * 4; - if (hdr_size < APR_HDR_SIZE) { - pr_err("APR: Wrong hdr size:%d\n", hdr_size); - return; - } - - if (hdr->pkt_size < APR_HDR_SIZE) { - pr_err("APR: Wrong paket size\n"); - return; - } - - if (hdr->pkt_size < hdr_size) { - pr_err("APR: Packet size less than header size\n"); - return; - } - - msg_type = hdr->hdr_field; - msg_type = (msg_type >> 0x08) & 0x0003; - if (msg_type >= APR_MSG_TYPE_MAX && msg_type != APR_BASIC_RSP_RESULT) { - pr_err("APR: Wrong message type: %d\n", msg_type); - return; - } - - if (hdr->src_domain >= APR_DOMAIN_MAX || - hdr->dest_domain >= APR_DOMAIN_MAX || - hdr->src_svc >= APR_SVC_MAX || - hdr->dest_svc >= APR_SVC_MAX) { - pr_err("APR: Wrong APR header\n"); - return; - } - - svc = hdr->dest_svc; - if (hdr->src_domain == APR_DOMAIN_MODEM) { - if (svc == APR_SVC_MVS || svc == APR_SVC_MVM || - svc == APR_SVC_CVS || svc == APR_SVC_CVP || - svc == APR_SVC_TEST_CLIENT) - clnt = APR_CLIENT_VOICE; - else { - pr_err("APR: Wrong svc :%d\n", svc); - return; - } - } else if (hdr->src_domain == APR_DOMAIN_ADSP) { - if (svc == APR_SVC_AFE || svc == APR_SVC_ASM || - svc == APR_SVC_VSM || svc == APR_SVC_VPM || - svc == APR_SVC_ADM || svc == APR_SVC_ADSP_CORE || - svc == APR_SVC_USM || - svc == APR_SVC_TEST_CLIENT || svc == APR_SVC_ADSP_MVM || - svc == APR_SVC_ADSP_CVS || svc == APR_SVC_ADSP_CVP || - svc == APR_SVC_LSM) - clnt = APR_CLIENT_AUDIO; - else if (svc == APR_SVC_VIDC) - clnt = APR_CLIENT_AUDIO; - else { - pr_err("APR: Wrong svc :%d\n", svc); - return; - } - } else { - pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain); - return; - } - - src = apr_get_data_src(hdr); - if (src == APR_DEST_MAX) - return; - - pr_debug("src =%d clnt = %d\n", src, clnt); - apr_client = &client[src][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) - if (apr_client->svc[i].id == svc) { - pr_debug("%d\n", apr_client->svc[i].id); - c_svc = &apr_client->svc[i]; - break; - } - - if (i == APR_SVC_MAX) { - pr_err("APR: service is not registered\n"); - return; - } - pr_debug("svc_idx = %d\n", i); - pr_debug("%x %x %x %pK %pK\n", c_svc->id, c_svc->dest_id, - c_svc->client_id, c_svc->fn, c_svc->priv); - data.payload_size = hdr->pkt_size - hdr_size; - data.opcode = hdr->opcode; - data.src = src; - data.src_port = hdr->src_port; - data.dest_port = hdr->dest_port; - data.token = hdr->token; - data.msg_type = msg_type; - data.payload = NULL; - if (data.payload_size > 0) - data.payload = (char *)hdr + hdr_size; - - if (unlikely(apr_cf_debug)) { - if (hdr->opcode == APR_BASIC_RSP_RESULT && data.payload) { - uint32_t *ptr = data.payload; - - APR_PKT_INFO( - "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X] rc[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, - hdr->opcode, hdr->token, ptr[1]); - } else { - APR_PKT_INFO( - "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]", - (hdr->src_domain << 8) | hdr->src_svc, - (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode, - hdr->token); - } - } - - temp_port = ((data.dest_port >> 8) * 8) + (data.dest_port & 0xFF); - if (((temp_port >= 0) && (temp_port < APR_MAX_PORTS)) - && (c_svc->port_cnt && c_svc->port_fn[temp_port])) - c_svc->port_fn[temp_port](&data, - c_svc->port_priv[temp_port]); - else if (c_svc->fn) - c_svc->fn(&data, c_svc->priv); - else - pr_err("APR: Rxed a packet for NULL callback\n"); -} - -int apr_get_svc(const char *svc_name, int domain_id, int *client_id, - int *svc_idx, int *svc_id) -{ - int i; - int size; - struct apr_svc_table *tbl; - int ret = 0; - - if (domain_id == APR_DOMAIN_ADSP) { - tbl = (struct apr_svc_table *)&svc_tbl_qdsp6; - size = ARRAY_SIZE(svc_tbl_qdsp6); - } else { - tbl = (struct apr_svc_table *)&svc_tbl_voice; - size = ARRAY_SIZE(svc_tbl_voice); - } - - for (i = 0; i < size; i++) { - if (!strcmp(svc_name, tbl[i].name)) { - *client_id = tbl[i].client_id; - *svc_idx = tbl[i].idx; - *svc_id = tbl[i].id; - break; - } - } - - pr_debug("%s: svc_name = %s c_id = %d domain_id = %d\n", - __func__, svc_name, *client_id, domain_id); - if (i == size) { - pr_err("%s: APR: Wrong svc name %s\n", __func__, svc_name); - ret = -EINVAL; - } - - return ret; -} - -static void apr_reset_deregister(struct work_struct *work) -{ - struct apr_svc *handle = NULL; - struct apr_reset_work *apr_reset = - container_of(work, struct apr_reset_work, work); - - handle = apr_reset->handle; - pr_debug("%s:handle[%pK]\n", __func__, handle); - apr_deregister(handle); - kfree(apr_reset); -} - -/** - * apr_start_rx_rt - Clients call to vote for thread - * priority upgrade whenever needed. - * - * @handle: APR service handle - * - * Returns 0 on success or error otherwise. - */ -int apr_start_rx_rt(void *handle) -{ - int rc = 0; - struct apr_svc *svc = handle; - uint16_t dest_id = 0; - uint16_t client_id = 0; - - if (!svc) { - pr_err("%s: Invalid APR handle\n", __func__); - return -EINVAL; - } - - mutex_lock(&svc->m_lock); - dest_id = svc->dest_id; - client_id = svc->client_id; - - if ((client_id >= APR_CLIENT_MAX) || (dest_id >= APR_DEST_MAX)) { - pr_err("%s: %s invalid. client_id = %u, dest_id = %u\n", - __func__, - client_id >= APR_CLIENT_MAX ? "Client ID" : "Dest ID", - client_id, dest_id); - rc = -EINVAL; - goto exit; - } - - if (!client[dest_id][client_id].handle) { - pr_err("%s: Client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - rc = apr_tal_start_rx_rt(client[dest_id][client_id].handle); - if (rc) - pr_err("%s: failed to set RT thread priority for APR RX. rc = %d\n", - __func__, rc); - -exit: - mutex_unlock(&svc->m_lock); - return rc; -} -EXPORT_SYMBOL(apr_start_rx_rt); - -/** - * apr_end_rx_rt - Clients call to unvote for thread - * priority upgrade (perviously voted with - * apr_start_rx_rt()). - * - * @handle: APR service handle - * - * Returns 0 on success or error otherwise. - */ -int apr_end_rx_rt(void *handle) -{ - int rc = 0; - struct apr_svc *svc = handle; - uint16_t dest_id = 0; - uint16_t client_id = 0; - - if (!svc) { - pr_err("%s: Invalid APR handle\n", __func__); - return -EINVAL; - } - - mutex_lock(&svc->m_lock); - dest_id = svc->dest_id; - client_id = svc->client_id; - - if ((client_id >= APR_CLIENT_MAX) || (dest_id >= APR_DEST_MAX)) { - pr_err("%s: %s invalid. client_id = %u, dest_id = %u\n", - __func__, - client_id >= APR_CLIENT_MAX ? "Client ID" : "Dest ID", - client_id, dest_id); - rc = -EINVAL; - goto exit; - } - - if (!client[dest_id][client_id].handle) { - pr_err("%s: Client handle is NULL\n", __func__); - rc = -EINVAL; - goto exit; - } - - rc = apr_tal_end_rx_rt(client[dest_id][client_id].handle); - if (rc) - pr_err("%s: failed to reset RT thread priority for APR RX. rc = %d\n", - __func__, rc); - -exit: - mutex_unlock(&svc->m_lock); - return rc; -} -EXPORT_SYMBOL(apr_end_rx_rt); - -/** - * apr_deregister - Clients call to de-register - * from APR. - * - * @handle: APR service handle to de-register - * - * Returns 0 on success or -EINVAL on error. - */ -int apr_deregister(void *handle) -{ - struct apr_svc *svc = handle; - struct apr_client *clnt; - uint16_t dest_id; - uint16_t client_id; - - if (!handle) - return -EINVAL; - - mutex_lock(&svc->m_lock); - if (!svc->svc_cnt) { - pr_err("%s: svc already deregistered. svc = %pK\n", - __func__, svc); - mutex_unlock(&svc->m_lock); - return -EINVAL; - } - - dest_id = svc->dest_id; - client_id = svc->client_id; - clnt = &client[dest_id][client_id]; - - if (svc->svc_cnt > 0) { - if (svc->port_cnt) - svc->port_cnt--; - svc->svc_cnt--; - if (!svc->svc_cnt) { - client[dest_id][client_id].svc_cnt--; - pr_debug("%s: service is reset %pK\n", __func__, svc); - } - } - - if (!svc->svc_cnt) { - svc->priv = NULL; - svc->id = 0; - svc->fn = NULL; - svc->dest_id = 0; - svc->client_id = 0; - svc->need_reset = 0x0; - } - if (client[dest_id][client_id].handle && - !client[dest_id][client_id].svc_cnt) { - apr_tal_close(client[dest_id][client_id].handle); - client[dest_id][client_id].handle = NULL; - } - mutex_unlock(&svc->m_lock); - - return 0; -} -EXPORT_SYMBOL(apr_deregister); - -/** - * apr_reset - sets up workqueue to de-register - * the given APR service handle. - * - * @handle: APR service handle - * - */ -void apr_reset(void *handle) -{ - struct apr_reset_work *apr_reset_worker = NULL; - - if (!handle) - return; - pr_debug("%s: handle[%pK]\n", __func__, handle); - - if (apr_reset_workqueue == NULL) { - pr_err("%s: apr_reset_workqueue is NULL\n", __func__); - return; - } - - apr_reset_worker = kzalloc(sizeof(struct apr_reset_work), - GFP_ATOMIC); - - if (apr_reset_worker == NULL) { - pr_err("%s: mem failure\n", __func__); - return; - } - - apr_reset_worker->handle = handle; - INIT_WORK(&apr_reset_worker->work, apr_reset_deregister); - queue_work(apr_reset_workqueue, &apr_reset_worker->work); -} -EXPORT_SYMBOL(apr_reset); - -/* Dispatch the Reset events to Modem and audio clients */ -static void dispatch_event(unsigned long code, uint16_t proc) -{ - struct apr_client *apr_client; - struct apr_client_data data; - struct apr_svc *svc; - uint16_t clnt; - int i, j; - - memset(&data, 0, sizeof(data)); - data.opcode = RESET_EVENTS; - data.reset_event = code; - - /* Service domain can be different from the processor */ - data.reset_proc = apr_get_reset_domain(proc); - - clnt = APR_CLIENT_AUDIO; - apr_client = &client[proc][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) { - mutex_lock(&apr_client->svc[i].m_lock); - if (apr_client->svc[i].fn) { - apr_client->svc[i].need_reset = 0x1; - apr_client->svc[i].fn(&data, apr_client->svc[i].priv); - } - if (apr_client->svc[i].port_cnt) { - svc = &(apr_client->svc[i]); - svc->need_reset = 0x1; - for (j = 0; j < APR_MAX_PORTS; j++) - if (svc->port_fn[j]) - svc->port_fn[j](&data, - svc->port_priv[j]); - } - mutex_unlock(&apr_client->svc[i].m_lock); - } - - clnt = APR_CLIENT_VOICE; - apr_client = &client[proc][clnt]; - for (i = 0; i < APR_SVC_MAX; i++) { - mutex_lock(&apr_client->svc[i].m_lock); - if (apr_client->svc[i].fn) { - apr_client->svc[i].need_reset = 0x1; - apr_client->svc[i].fn(&data, apr_client->svc[i].priv); - } - if (apr_client->svc[i].port_cnt) { - svc = &(apr_client->svc[i]); - svc->need_reset = 0x1; - for (j = 0; j < APR_MAX_PORTS; j++) - if (svc->port_fn[j]) - svc->port_fn[j](&data, - svc->port_priv[j]); - } - mutex_unlock(&apr_client->svc[i].m_lock); - } -} - -static int apr_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *data) -{ - struct audio_notifier_cb_data *cb_data = data; - - if (cb_data == NULL) { - pr_err("%s: Callback data is NULL!\n", __func__); - goto done; - } - - pr_debug("%s: Service opcode 0x%lx, domain %d\n", - __func__, opcode, cb_data->domain); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - /* - * Use flag to ignore down notifications during - * initial boot. There is no benefit from error - * recovery notifications during initial boot - * up since everything is expected to be down. - */ - spin_lock(&apr_priv->apr_lock); - if (apr_priv->is_initial_boot) { - spin_unlock(&apr_priv->apr_lock); - break; - } - spin_unlock(&apr_priv->apr_lock); - if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN) - apr_modem_down(opcode); - else - apr_adsp_down(opcode); - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN) - apr_modem_up(); - else - apr_adsp_up(); - spin_lock(&apr_priv->apr_lock); - apr_priv->is_initial_boot = false; - spin_unlock(&apr_priv->apr_lock); - break; - default: - break; - } -done: - return NOTIFY_OK; -} - -static struct notifier_block adsp_service_nb = { - .notifier_call = apr_notifier_service_cb, - .priority = 0, -}; - -static struct notifier_block modem_service_nb = { - .notifier_call = apr_notifier_service_cb, - .priority = 0, -}; - -#ifdef CONFIG_DEBUG_FS -static int __init apr_debug_init(void) -{ - debugfs_apr_debug = debugfs_create_file("msm_apr_debug", - S_IFREG | 0444, NULL, NULL, - &apr_debug_ops); - return 0; -} -#else -static int __init apr_debug_init(void) -{ - return 0; -} -#endif - -static void apr_cleanup(void) -{ - int i, j, k; - - of_platform_depopulate(apr_priv->dev); - subsys_notif_deregister(subsys_name); - if (apr_reset_workqueue) { - flush_workqueue(apr_reset_workqueue); - destroy_workqueue(apr_reset_workqueue); - } - mutex_destroy(&q6.lock); - for (i = 0; i < APR_DEST_MAX; i++) { - for (j = 0; j < APR_CLIENT_MAX; j++) { - mutex_destroy(&client[i][j].m_lock); - for (k = 0; k < APR_SVC_MAX; k++) - mutex_destroy(&client[i][j].svc[k].m_lock); - } - } -#ifdef CONFIG_DEBUG_FS - debugfs_remove(debugfs_apr_debug); -#endif -} - -static int apr_probe(struct platform_device *pdev) -{ - int i, j, k, ret = 0; - - init_waitqueue_head(&modem_wait); - - apr_priv = devm_kzalloc(&pdev->dev, sizeof(*apr_priv), GFP_KERNEL); - if (!apr_priv) - return -ENOMEM; - - apr_priv->dev = &pdev->dev; - spin_lock_init(&apr_priv->apr_lock); - INIT_WORK(&apr_priv->add_chld_dev_work, apr_add_child_devices); - - for (i = 0; i < APR_DEST_MAX; i++) - for (j = 0; j < APR_CLIENT_MAX; j++) { - mutex_init(&client[i][j].m_lock); - for (k = 0; k < APR_SVC_MAX; k++) { - mutex_init(&client[i][j].svc[k].m_lock); - spin_lock_init(&client[i][j].svc[k].w_lock); - } - } - apr_set_subsys_state(); - mutex_init(&q6.lock); - apr_reset_workqueue = create_singlethread_workqueue("apr_driver"); - if (!apr_reset_workqueue) { - apr_priv = NULL; - return -ENOMEM; - } - - apr_pkt_ctx = ipc_log_context_create(APR_PKT_IPC_LOG_PAGE_CNT, - "apr", 0); - if (!apr_pkt_ctx) - pr_err("%s: Unable to create ipc log context\n", __func__); - - spin_lock(&apr_priv->apr_lock); - apr_priv->is_initial_boot = true; - spin_unlock(&apr_priv->apr_lock); - ret = of_property_read_string(pdev->dev.of_node, - "qcom,subsys-name", - (const char **)(&subsys_name)); - if (ret) { - pr_err("%s: missing subsys-name entry in dt node\n", __func__); - return -EINVAL; - } - - if (!strcmp(subsys_name, "apr_adsp")) { - subsys_notif_register("apr_adsp", - AUDIO_NOTIFIER_ADSP_DOMAIN, - &adsp_service_nb); - } else if (!strcmp(subsys_name, "apr_modem")) { - subsys_notif_register("apr_modem", - AUDIO_NOTIFIER_MODEM_DOMAIN, - &modem_service_nb); - } else { - pr_err("%s: invalid subsys-name %s\n", __func__, subsys_name); - return -EINVAL; - } - - apr_tal_init(); - - ret = snd_event_client_register(&pdev->dev, &apr_ssr_ops, NULL); - if (ret) { - pr_err("%s: Registration with SND event fwk failed ret = %d\n", - __func__, ret); - ret = 0; - } - - return apr_debug_init(); -} - -static int apr_remove(struct platform_device *pdev) -{ - snd_event_client_deregister(&pdev->dev); - apr_cleanup(); - apr_tal_exit(); - apr_priv = NULL; - return 0; -} - -static const struct of_device_id apr_machine_of_match[] = { - { .compatible = "qcom,msm-audio-apr", }, - {}, -}; - -static struct platform_driver apr_driver = { - .probe = apr_probe, - .remove = apr_remove, - .driver = { - .name = "audio_apr", - .owner = THIS_MODULE, - .of_match_table = apr_machine_of_match, - } -}; - -module_platform_driver(apr_driver); - -MODULE_DESCRIPTION("APR DRIVER"); -MODULE_LICENSE("GPL v2"); -MODULE_DEVICE_TABLE(of, apr_machine_of_match); diff --git a/techpack/audio/ipc/apr_tal_rpmsg.c b/techpack/audio/ipc/apr_tal_rpmsg.c deleted file mode 100644 index 8bd14d5379f5..000000000000 --- a/techpack/audio/ipc/apr_tal_rpmsg.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (c) 2017-2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -enum apr_channel_state { - APR_CH_DISCONNECTED, - APR_CH_CONNECTED, -}; - -#define APR_MAXIMUM_NUM_OF_RETRIES 2 - -static struct apr_svc_ch_dev - apr_svc_ch[APR_DL_MAX][APR_DEST_MAX][APR_CLIENT_MAX]; - -/** - * apr_tal_write() - Write a message across to the remote processor - * @apr_ch: apr channel handle - * @data: buffer that needs to be transferred over the channel - * @pkt_priv: private data of the packet - * @len: length of the buffer - * - * Returns len of buffer successfully transferred on success - * and an appropriate error value on failure. - */ -int apr_tal_write(struct apr_svc_ch_dev *apr_ch, void *data, - struct apr_pkt_priv *pkt_priv, int len) -{ - int rc = 0, retries = 0; - unsigned long flags; - struct rpmsg_device *rpdev = NULL; - - if (!apr_ch || len > APR_MAX_BUF || - apr_ch->channel_state != APR_CH_CONNECTED) - return -EINVAL; - - spin_lock_irqsave(&apr_ch->w_lock, flags); - rpdev = apr_ch->handle; - if (!rpdev) { - spin_unlock_irqrestore(&apr_ch->w_lock, flags); - return -EINVAL; - } - - do { - if (rc == -EAGAIN) - udelay(50); - rc = rpmsg_trysend(rpdev->ept, data, len); - } while (rc == -EAGAIN && retries++ < APR_MAXIMUM_NUM_OF_RETRIES); - spin_unlock_irqrestore(&apr_ch->w_lock, flags); - - if (rc) - pr_err_ratelimited("%s: Unable to send the packet, rc:%d\n", __func__, rc); - else - rc = len; - - return rc; -} -EXPORT_SYMBOL(apr_tal_write); - -/** - * apr_tal_rx_intents_config() - Configure glink intents for remote processor - * @apr_ch: apr channel handle - * @num_of_intents: number of intents - * @size: size of the intents - * - * This api is not supported with RPMSG. Returns 0 to indicate success - */ -int apr_tal_rx_intents_config(struct apr_svc_ch_dev *apr_ch, - int num_of_intents, uint32_t size) -{ - pr_debug("%s: NO-OP\n", __func__); - return 0; -} -EXPORT_SYMBOL(apr_tal_rx_intents_config); - -/** - * apr_tal_start_rx_rt() - Set RT thread priority for APR RX transfer - * @apr_ch: apr channel handle - * - * This api is not supported with RPMSG as message transfer occurs - * in client's context. Returns 0 to indicate success. - */ -int apr_tal_start_rx_rt(struct apr_svc_ch_dev *apr_ch) -{ - pr_debug("%s: NO-OP\n", __func__); - return 0; -} -EXPORT_SYMBOL(apr_tal_start_rx_rt); - -/** - * apr_tal_end_rx_rt() - Remove RT thread priority for APR RX transfer - * @apr_ch: apr channel handle - * - * This api is not supported with RPMSG. Returns 0 to indicate success - */ -int apr_tal_end_rx_rt(struct apr_svc_ch_dev *apr_ch) -{ - pr_debug("%s: NO-OP\n", __func__); - return 0; -} -EXPORT_SYMBOL(apr_tal_end_rx_rt); - -/** - * apr_tal_open() - Open a transport channel for data transfer - * on remote processor. - * @clnt: apr client, audio or voice - * @dest: destination remote processor for which apr channel is requested for. - * @dl: type of data link - * @func: callback function to handle data transfer from remote processor - * @priv: private data of the client - * - * Returns apr_svc_ch_dev handle on success and NULL on failure. - */ -struct apr_svc_ch_dev *apr_tal_open(uint32_t clnt, uint32_t dest, uint32_t dl, - apr_svc_cb_fn func, void *priv) -{ - int rc = 0; - struct apr_svc_ch_dev *apr_ch = NULL; - - if ((clnt != APR_CLIENT_AUDIO) || (dest != APR_DEST_QDSP6) || - (dl != APR_DL_SMD)) { - pr_err("%s: Invalid params, clnt:%d, dest:%d, dl:%d\n", - __func__, clnt, dest, dl); - return NULL; - } - - apr_ch = &apr_svc_ch[APR_DL_SMD][APR_DEST_QDSP6][APR_CLIENT_AUDIO]; - mutex_lock(&apr_ch->m_lock); - if (!apr_ch->handle) { - rc = wait_event_timeout(apr_ch->wait, - (apr_ch->channel_state == APR_CH_CONNECTED), 5 * HZ); - - if (rc == 0) { - pr_err("%s: TIMEOUT for APR_CH_CONNECTED event\n", - __func__); - rc = -ETIMEDOUT; - goto unlock; - } - } - - pr_debug("%s: Channel connected, returning handle :%pK\n", - __func__, apr_ch->handle); - apr_ch->func = func; - apr_ch->priv = priv; - -unlock: - mutex_unlock(&apr_ch->m_lock); - return rc ? NULL : apr_ch; -} -EXPORT_SYMBOL(apr_tal_open); - -/** - * apr_tal_close() - Close transport channel on remote processor. - * @apr_ch: apr channel handle - * - * Returns 0 on success and an appropriate error value on failure. - */ -int apr_tal_close(struct apr_svc_ch_dev *apr_ch) -{ - int rc = 0; - - if (!apr_ch || !apr_ch->handle) { - rc = -EINVAL; - goto exit; - } - - mutex_lock(&apr_ch->m_lock); - apr_ch->func = NULL; - apr_ch->priv = NULL; - mutex_unlock(&apr_ch->m_lock); - -exit: - return rc; -} -EXPORT_SYMBOL(apr_tal_close); - -static int apr_tal_rpmsg_callback(struct rpmsg_device *rpdev, - void *data, int len, void *priv, u32 addr) -{ - struct apr_svc_ch_dev *apr_ch = dev_get_drvdata(&rpdev->dev); - unsigned long flags; - - if (!apr_ch || !data) { - pr_err("%s: Invalid apr_ch or ptr\n", __func__); - return -EINVAL; - } - - dev_dbg(&rpdev->dev, "%s: Rx packet received, len:%d\n", - __func__, len); - - spin_lock_irqsave(&apr_ch->r_lock, flags); - if (apr_ch->func) - apr_ch->func((void *)data, len, apr_ch->priv); - spin_unlock_irqrestore(&apr_ch->r_lock, flags); - - return 0; -} - -static int apr_tal_rpmsg_probe(struct rpmsg_device *rpdev) -{ - struct apr_svc_ch_dev *apr_ch = NULL; - - if (!strcmp(rpdev->id.name, "apr_audio_svc")) { - dev_info(&rpdev->dev, "%s: Channel[%s] state[Up]\n", - __func__, rpdev->id.name); - - apr_ch = - &apr_svc_ch[APR_DL_SMD][APR_DEST_QDSP6][APR_CLIENT_AUDIO]; - apr_ch->handle = rpdev; - apr_ch->channel_state = APR_CH_CONNECTED; - dev_set_drvdata(&rpdev->dev, apr_ch); - wake_up(&apr_ch->wait); - } else { - dev_err(&rpdev->dev, "%s, Invalid Channel [%s]\n", - __func__, rpdev->id.name); - return -EINVAL; - } - - return 0; -} - -static void apr_tal_rpmsg_remove(struct rpmsg_device *rpdev) -{ - struct apr_svc_ch_dev *apr_ch = dev_get_drvdata(&rpdev->dev); - - if (!apr_ch) { - dev_err(&rpdev->dev, "%s: Invalid apr_ch\n", __func__); - return; - } - - dev_info(&rpdev->dev, "%s: Channel[%s] state[Down]\n", - __func__, rpdev->id.name); - apr_ch->handle = NULL; - apr_ch->channel_state = APR_CH_DISCONNECTED; - dev_set_drvdata(&rpdev->dev, NULL); -} - -static const struct rpmsg_device_id apr_tal_rpmsg_match[] = { - { "apr_audio_svc" }, - {} -}; - -static struct rpmsg_driver apr_tal_rpmsg_driver = { - .probe = apr_tal_rpmsg_probe, - .remove = apr_tal_rpmsg_remove, - .callback = apr_tal_rpmsg_callback, - .id_table = apr_tal_rpmsg_match, - .drv = { - .name = "apr_tal_rpmsg", - }, -}; - -/** - * apr_tal_int() - Registers rpmsg driver with rpmsg framework. - * - * Returns 0 on success and an appropriate error value on failure. - */ -int apr_tal_init(void) -{ - int i, j, k; - int ret; - - memset(apr_svc_ch, 0, sizeof(struct apr_svc_ch_dev)); - for (i = 0; i < APR_DL_MAX; i++) { - for (j = 0; j < APR_DEST_MAX; j++) { - for (k = 0; k < APR_CLIENT_MAX; k++) { - init_waitqueue_head(&apr_svc_ch[i][j][k].wait); - spin_lock_init(&apr_svc_ch[i][j][k].w_lock); - spin_lock_init(&apr_svc_ch[i][j][k].r_lock); - mutex_init(&apr_svc_ch[i][j][k].m_lock); - } - } - } - ret = register_rpmsg_driver(&apr_tal_rpmsg_driver); - return ret; -} -EXPORT_SYMBOL(apr_tal_init); - -/** - * apr_tal_exit() - De-register rpmsg driver with rpmsg framework. - */ -void apr_tal_exit(void) -{ - unregister_rpmsg_driver(&apr_tal_rpmsg_driver); -} -EXPORT_SYMBOL(apr_tal_exit); - diff --git a/techpack/audio/ipc/apr_v2.c b/techpack/audio/ipc/apr_v2.c deleted file mode 100644 index e85173cd2158..000000000000 --- a/techpack/audio/ipc/apr_v2.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2012-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -/** - * apr_get_subsys_state - get Q6 subsys status - * - * Returns apr_subsys_state - */ -enum apr_subsys_state apr_get_subsys_state(void) -{ - return apr_get_q6_state(); -} -EXPORT_SYMBOL(apr_get_subsys_state); - -void apr_set_subsys_state(void) -{ - apr_set_q6_state(APR_SUBSYS_DOWN); - apr_set_modem_state(APR_SUBSYS_UP); -} - -uint16_t apr_get_data_src(struct apr_hdr *hdr) -{ - if (hdr->src_domain == APR_DOMAIN_MODEM) - return APR_DEST_MODEM; - else if (hdr->src_domain == APR_DOMAIN_ADSP) - return APR_DEST_QDSP6; - - pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain); - return APR_DEST_MAX; /*RETURN INVALID VALUE*/ -} - -int apr_get_dest_id(char *dest) -{ - if (!strcmp(dest, "ADSP")) - return APR_DEST_QDSP6; - else - return APR_DEST_MODEM; -} - -void subsys_notif_register(char *client_name, int domain, - struct notifier_block *nb) -{ - int ret; - - ret = audio_notifier_register(client_name, domain, nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed for domain %d ret = %d\n", - __func__, domain, ret); -} - -void subsys_notif_deregister(char *client_name) -{ - int ret; - - ret = audio_notifier_deregister(client_name); - if (ret < 0) - pr_err("%s: Audio notifier de-register failed for client %s\n", - __func__, client_name); -} - -uint16_t apr_get_reset_domain(uint16_t proc) -{ - return proc; -} diff --git a/techpack/audio/ipc/apr_v3.c b/techpack/audio/ipc/apr_v3.c deleted file mode 100644 index fa68daf55e84..000000000000 --- a/techpack/audio/ipc/apr_v3.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2013-2016, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -#define DEST_ID APR_DEST_MODEM - -enum apr_subsys_state apr_get_subsys_state(void) -{ - return apr_get_modem_state(); -} - -void apr_set_subsys_state(void) -{ - apr_set_modem_state(APR_SUBSYS_DOWN); -} - -uint16_t apr_get_data_src(struct apr_hdr *hdr) -{ - return DEST_ID; -} - -int apr_get_dest_id(char *dest) -{ - return DEST_ID; -} - -void subsys_notif_register(char *client_name, int domain, - struct notifier_block *nb) -{ - int ret; - - if (domain != AUDIO_NOTIFIER_MODEM_DOMAIN) { - pr_debug("%s: Unused domain %d not registering with notifier\n", - __func__, domain); - return; - } - - ret = audio_notifier_register(client_name, domain, nb); - if (ret < 0) - pr_err("%s: Audio notifier register failed for domain %d ret = %d\n", - __func__, domain, ret); -} - -void subsys_notif_deregister(char *client_name) -{ - int ret; - - ret = audio_notifier_deregister(client_name); - if (ret < 0) - pr_err("%s: Audio notifier de-register failed for client %s\n", - __func__, client_name); -} - -uint16_t apr_get_reset_domain(uint16_t proc) -{ - return APR_DEST_QDSP6; -} diff --git a/techpack/audio/ipc/wcd-dsp-glink.c b/techpack/audio/ipc/wcd-dsp-glink.c deleted file mode 100644 index 79ff26aef65a..000000000000 --- a/techpack/audio/ipc/wcd-dsp-glink.c +++ /dev/null @@ -1,781 +0,0 @@ -/* Copyright (c) 2016-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "sound/wcd-dsp-glink.h" - -#define WDSP_GLINK_DRIVER_NAME "wcd-dsp-glink" -#define WDSP_MAX_WRITE_SIZE (256 * 1024) -#define WDSP_MAX_READ_SIZE (4 * 1024) -#define WDSP_WRITE_PKT_SIZE (sizeof(struct wdsp_write_pkt)) -#define WDSP_CMD_PKT_SIZE (sizeof(struct wdsp_cmd_pkt)) - -#define MINOR_NUMBER_COUNT 1 -#define RESP_QUEUE_SIZE 3 -#define TIMEOUT_MS 2000 - -enum wdsp_ch_state { - WDSP_CH_DISCONNECTED, - WDSP_CH_CONNECTED, -}; - -struct wdsp_glink_dev { - struct class *cls; - struct device *dev; - struct cdev cdev; - dev_t dev_num; -}; - -struct wdsp_rsp_que { - /* Size of valid data in buffer */ - u32 buf_size; - - /* Response buffer */ - u8 buf[WDSP_MAX_READ_SIZE]; -}; - -struct wdsp_ch { - struct wdsp_glink_priv *wpriv; - /* rpmsg handle */ - void *handle; - /* Channel states like connect, disconnect */ - int ch_state; - char ch_name[RPMSG_NAME_SIZE]; - spinlock_t ch_lock; -}; - -struct wdsp_tx_buf { - struct work_struct tx_work; - - /* Glink channel information */ - struct wdsp_ch *ch; - - /* Tx buffer to send to glink */ - u8 buf[0]; -}; - -struct wdsp_glink_priv { - /* Respone buffer related */ - u8 rsp_cnt; - struct wdsp_rsp_que rsp[RESP_QUEUE_SIZE]; - u8 write_idx; - u8 read_idx; - struct completion rsp_complete; - spinlock_t rsp_lock; - - /* Glink channel related */ - int no_of_channels; - struct wdsp_ch **ch; - struct workqueue_struct *work_queue; - /* Wait for all channels state before sending any command */ - wait_queue_head_t ch_state_wait; - - struct wdsp_glink_dev *wdev; - struct device *dev; -}; -static struct wdsp_glink_priv *wpriv; - -static struct wdsp_ch *wdsp_get_ch(char *ch_name) -{ - int i; - - for (i = 0; i < wpriv->no_of_channels; i++) { - if (!strcmp(ch_name, wpriv->ch[i]->ch_name)) - return wpriv->ch[i]; - } - return NULL; -} - -/* - * wdsp_rpmsg_callback - Rpmsg callback for responses - * rpdev: Rpmsg device structure - * data: Pointer to the Rx data - * len: Size of the Rx data - * priv: Private pointer to the channel - * addr: Address variable - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_rpmsg_callback(struct rpmsg_device *rpdev, void *data, - int len, void *priv, u32 addr__unused) -{ - struct wdsp_ch *ch = dev_get_drvdata(&rpdev->dev); - struct wdsp_glink_priv *wpriv; - unsigned long flags; - u8 *rx_buf; - u8 rsp_cnt = 0; - - if (!ch || !data) { - pr_err("%s: Invalid ch or data\n", __func__); - return -EINVAL; - } - - wpriv = ch->wpriv; - rx_buf = (u8 *)data; - if (len > WDSP_MAX_READ_SIZE) { - dev_info_ratelimited(wpriv->dev, "%s: Size %d is greater than allowed %d\n", - __func__, len, WDSP_MAX_READ_SIZE); - len = WDSP_MAX_READ_SIZE; - } - dev_dbg_ratelimited(wpriv->dev, "%s: copy into buffer %d\n", __func__, - wpriv->rsp_cnt); - - if (wpriv->rsp_cnt >= RESP_QUEUE_SIZE) { - dev_info_ratelimited(wpriv->dev, "%s: Resp Queue is Full. Ignore new one.\n", - __func__); - return -EINVAL; - } - spin_lock_irqsave(&wpriv->rsp_lock, flags); - rsp_cnt = wpriv->rsp_cnt; - memcpy(wpriv->rsp[wpriv->write_idx].buf, rx_buf, len); - wpriv->rsp[wpriv->write_idx].buf_size = len; - wpriv->write_idx = (wpriv->write_idx + 1) % RESP_QUEUE_SIZE; - wpriv->rsp_cnt = ++rsp_cnt; - spin_unlock_irqrestore(&wpriv->rsp_lock, flags); - - complete(&wpriv->rsp_complete); - - return 0; -} - -/* - * wdsp_rpmsg_probe - Rpmsg channel probe function - * rpdev: Rpmsg device structure - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_rpmsg_probe(struct rpmsg_device *rpdev) -{ - struct wdsp_ch *ch; - - ch = wdsp_get_ch(rpdev->id.name); - if (!ch) { - dev_err(&rpdev->dev, "%s, Invalid Channel [%s]\n", - __func__, rpdev->id.name); - return -EINVAL; - } - - dev_dbg(&rpdev->dev, "%s: Channel[%s] state[Up]\n", - __func__, rpdev->id.name); - - spin_lock(&ch->ch_lock); - ch->handle = rpdev; - ch->ch_state = WDSP_CH_CONNECTED; - spin_unlock(&ch->ch_lock); - dev_set_drvdata(&rpdev->dev, ch); - wake_up(&wpriv->ch_state_wait); - - return 0; -} - -/* - * wdsp_rpmsg_remove - Rpmsg channel remove function - * rpdev: Rpmsg device structure - */ -static void wdsp_rpmsg_remove(struct rpmsg_device *rpdev) -{ - struct wdsp_ch *ch = dev_get_drvdata(&rpdev->dev); - - if (!ch) { - dev_err(&rpdev->dev, "%s: Invalid ch\n", __func__); - return; - } - - dev_dbg(&rpdev->dev, "%s: Channel[%s] state[Down]\n", - __func__, rpdev->id.name); - spin_lock(&ch->ch_lock); - ch->handle = NULL; - ch->ch_state = WDSP_CH_DISCONNECTED; - spin_unlock(&ch->ch_lock); - dev_set_drvdata(&rpdev->dev, NULL); -} - -static bool wdsp_is_ch_connected(struct wdsp_glink_priv *wpriv) -{ - int i; - - for (i = 0; i < wpriv->no_of_channels; i++) { - spin_lock(&wpriv->ch[i]->ch_lock); - if (wpriv->ch[i]->ch_state != WDSP_CH_CONNECTED) { - spin_unlock(&wpriv->ch[i]->ch_lock); - return false; - } - spin_unlock(&wpriv->ch[i]->ch_lock); - } - return true; -} - -static int wdsp_wait_for_all_ch_connect(struct wdsp_glink_priv *wpriv) -{ - int ret; - - ret = wait_event_timeout(wpriv->ch_state_wait, - wdsp_is_ch_connected(wpriv), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - dev_err_ratelimited(wpriv->dev, "%s: All channels are not connected\n", - __func__); - ret = -ETIMEDOUT; - goto err; - } - ret = 0; - -err: - return ret; -} - -/* - * wdsp_tx_buf_work - Work queue function to send tx buffer to glink - * work: Work structure - */ -static void wdsp_tx_buf_work(struct work_struct *work) -{ - struct wdsp_glink_priv *wpriv; - struct wdsp_ch *ch; - struct wdsp_tx_buf *tx_buf; - struct wdsp_write_pkt *wpkt; - struct wdsp_cmd_pkt *cpkt; - int ret = 0; - struct rpmsg_device *rpdev = NULL; - - tx_buf = container_of(work, struct wdsp_tx_buf, - tx_work); - ch = tx_buf->ch; - wpriv = ch->wpriv; - wpkt = (struct wdsp_write_pkt *)tx_buf->buf; - cpkt = (struct wdsp_cmd_pkt *)wpkt->payload; - - dev_dbg(wpriv->dev, "%s: ch name = %s, payload size = %d\n", - __func__, cpkt->ch_name, cpkt->payload_size); - - spin_lock(&ch->ch_lock); - rpdev = ch->handle; - if (rpdev && ch->ch_state == WDSP_CH_CONNECTED) { - spin_unlock(&ch->ch_lock); - ret = rpmsg_send(rpdev->ept, cpkt->payload, - cpkt->payload_size); - if (ret < 0) - dev_err(wpriv->dev, "%s: rpmsg send failed, ret = %d\n", - __func__, ret); - } else { - spin_unlock(&ch->ch_lock); - if (rpdev) - dev_err(wpriv->dev, "%s: channel %s is not in connected state\n", - __func__, ch->ch_name); - else - dev_err(wpriv->dev, "%s: rpdev is NULL\n", __func__); - } - vfree(tx_buf); -} - -/* - * wdsp_glink_read - Read API to send the data to userspace - * file: Pointer to the file structure - * buf: Pointer to the userspace buffer - * count: Number bytes to read from the file - * ppos: Pointer to the position into the file - * Returns 0 on success and an appropriate error value on failure - */ -static ssize_t wdsp_glink_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - int ret = 0, ret1 = 0; - struct wdsp_rsp_que *read_rsp = NULL; - struct wdsp_glink_priv *wpriv; - unsigned long flags; - - wpriv = (struct wdsp_glink_priv *)file->private_data; - if (!wpriv) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - if (count > WDSP_MAX_READ_SIZE) { - dev_info_ratelimited(wpriv->dev, "%s: count = %zd is more than WDSP_MAX_READ_SIZE\n", - __func__, count); - count = WDSP_MAX_READ_SIZE; - } - /* - * Complete signal has given from gwdsp_rpmsg_callback() - * or from flush API. Also use interruptible wait_for_completion API - * to allow the system to go in suspend. - */ - ret = wait_for_completion_interruptible(&wpriv->rsp_complete); - if (ret < 0) - return ret; - - read_rsp = kzalloc(sizeof(struct wdsp_rsp_que), GFP_KERNEL); - if (!read_rsp) - return -ENOMEM; - - spin_lock_irqsave(&wpriv->rsp_lock, flags); - if (wpriv->rsp_cnt) { - wpriv->rsp_cnt--; - dev_dbg(wpriv->dev, "%s: rsp_cnt=%d read from buffer %d\n", - __func__, wpriv->rsp_cnt, wpriv->read_idx); - - memcpy(read_rsp, &wpriv->rsp[wpriv->read_idx], - sizeof(struct wdsp_rsp_que)); - wpriv->read_idx = (wpriv->read_idx + 1) % RESP_QUEUE_SIZE; - spin_unlock_irqrestore(&wpriv->rsp_lock, flags); - - if (count < read_rsp->buf_size) { - ret1 = copy_to_user(buf, read_rsp->buf, count); - /* Return the number of bytes copied */ - ret = count; - } else { - ret1 = copy_to_user(buf, read_rsp->buf, - read_rsp->buf_size); - /* Return the number of bytes copied */ - ret = read_rsp->buf_size; - } - - if (ret1) { - dev_err_ratelimited(wpriv->dev, "%s: copy_to_user failed %d\n", - __func__, ret); - ret = -EFAULT; - goto done; - } - } else { - /* - * This will execute only if flush API is called or - * something wrong with ref_cnt - */ - dev_dbg(wpriv->dev, "%s: resp count = %d\n", __func__, - wpriv->rsp_cnt); - spin_unlock_irqrestore(&wpriv->rsp_lock, flags); - ret = -EINVAL; - } - -done: - kfree(read_rsp); - return ret; -} - -/* - * wdsp_glink_write - Write API to receive the data from userspace - * file: Pointer to the file structure - * buf: Pointer to the userspace buffer - * count: Number bytes to read from the file - * ppos: Pointer to the position into the file - * Returns 0 on success and an appropriate error value on failure - */ -static ssize_t wdsp_glink_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - int ret = 0, i, tx_buf_size; - struct wdsp_write_pkt *wpkt; - struct wdsp_cmd_pkt *cpkt; - struct wdsp_tx_buf *tx_buf; - struct wdsp_glink_priv *wpriv; - size_t pkt_max_size; - - wpriv = (struct wdsp_glink_priv *)file->private_data; - if (!wpriv) { - pr_err("%s: Invalid private data\n", __func__); - ret = -EINVAL; - goto done; - } - - if ((count < WDSP_WRITE_PKT_SIZE) || - (count > WDSP_MAX_WRITE_SIZE)) { - dev_err_ratelimited(wpriv->dev, "%s: Invalid count = %zd\n", - __func__, count); - ret = -EINVAL; - goto done; - } - - dev_dbg(wpriv->dev, "%s: count = %zd\n", __func__, count); - - tx_buf_size = count + sizeof(struct wdsp_tx_buf); - tx_buf = vzalloc(tx_buf_size); - if (!tx_buf) { - ret = -ENOMEM; - goto done; - } - - ret = copy_from_user(tx_buf->buf, buf, count); - if (ret) { - dev_err_ratelimited(wpriv->dev, "%s: copy_from_user failed %d\n", - __func__, ret); - ret = -EFAULT; - goto free_buf; - } - - wpkt = (struct wdsp_write_pkt *)tx_buf->buf; - switch (wpkt->pkt_type) { - case WDSP_REG_PKT: - /* Keep this case to support backward compatibility */ - vfree(tx_buf); - break; - case WDSP_READY_PKT: - ret = wdsp_wait_for_all_ch_connect(wpriv); - if (ret < 0) - dev_err_ratelimited(wpriv->dev, "%s: Channels not in connected state\n", - __func__); - vfree(tx_buf); - break; - case WDSP_CMD_PKT: - if (count <= (WDSP_WRITE_PKT_SIZE + WDSP_CMD_PKT_SIZE)) { - dev_err_ratelimited(wpriv->dev, "%s: Invalid cmd pkt size = %zd\n", - __func__, count); - ret = -EINVAL; - goto free_buf; - } - cpkt = (struct wdsp_cmd_pkt *)wpkt->payload; - pkt_max_size = sizeof(struct wdsp_write_pkt) + - sizeof(struct wdsp_cmd_pkt) + - cpkt->payload_size; - if (count < pkt_max_size) { - dev_err_ratelimited(wpriv->dev, "%s: Invalid cmd pkt count = %zd, pkt_size = %zd\n", - __func__, count, pkt_max_size); - ret = -EINVAL; - goto free_buf; - } - for (i = 0; i < wpriv->no_of_channels; i++) { - if (!strcmp(cpkt->ch_name, wpriv->ch[i]->ch_name)) { - tx_buf->ch = wpriv->ch[i]; - break; - } - } - if (!tx_buf->ch) { - dev_err_ratelimited(wpriv->dev, "%s: Failed to get channel\n", - __func__); - ret = -EINVAL; - goto free_buf; - } - dev_dbg(wpriv->dev, "%s: requested ch_name: %s, pkt_size: %zd\n", - __func__, cpkt->ch_name, pkt_max_size); - - spin_lock(&tx_buf->ch->ch_lock); - if (tx_buf->ch->ch_state != WDSP_CH_CONNECTED) { - spin_unlock(&tx_buf->ch->ch_lock); - ret = -ENETRESET; - dev_err_ratelimited(wpriv->dev, "%s: Channels are not in connected state\n", - __func__); - goto free_buf; - } - spin_unlock(&tx_buf->ch->ch_lock); - - INIT_WORK(&tx_buf->tx_work, wdsp_tx_buf_work); - queue_work(wpriv->work_queue, &tx_buf->tx_work); - break; - default: - dev_err_ratelimited(wpriv->dev, "%s: Invalid packet type\n", - __func__); - ret = -EINVAL; - vfree(tx_buf); - break; - } - goto done; - -free_buf: - vfree(tx_buf); - -done: - return ret; -} - -/* - * wdsp_glink_open - Open API to initialize private data - * inode: Pointer to the inode structure - * file: Pointer to the file structure - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_glink_open(struct inode *inode, struct file *file) -{ - - pr_debug("%s: wpriv = %pK\n", __func__, wpriv); - file->private_data = wpriv; - - return 0; -} - -/* - * wdsp_glink_flush - Flush API to unblock read. - * file: Pointer to the file structure - * id: Lock owner ID - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_glink_flush(struct file *file, fl_owner_t id) -{ - struct wdsp_glink_priv *wpriv; - - wpriv = (struct wdsp_glink_priv *)file->private_data; - if (!wpriv) { - pr_err("%s: Invalid private data\n", __func__); - return -EINVAL; - } - - complete(&wpriv->rsp_complete); - - return 0; -} - -/* - * wdsp_glink_release - Release API to clean up resources. - * Whenever a file structure is shared across multiple threads, - * release won't be invoked until all copies are closed - * (file->f_count.counter should be 0). If we need to flush pending - * data when any copy is closed, you should implement the flush method. - * - * inode: Pointer to the inode structure - * file: Pointer to the file structure - * Returns 0 on success and an appropriate error value on failure - */ -static int wdsp_glink_release(struct inode *inode, struct file *file) -{ - pr_debug("%s: file->private_data = %pK\n", __func__, - file->private_data); - file->private_data = NULL; - - return 0; -} - -static struct rpmsg_driver wdsp_rpmsg_driver = { - .probe = wdsp_rpmsg_probe, - .remove = wdsp_rpmsg_remove, - .callback = wdsp_rpmsg_callback, - /* Update this dynamically before register_rpmsg() */ - .id_table = NULL, - .drv = { - .name = "wdsp_rpmsg", - }, -}; - -static int wdsp_register_rpmsg(struct platform_device *pdev, - struct wdsp_glink_dev *wdev) -{ - int ret = 0; - int i, no_of_channels; - struct rpmsg_device_id *wdsp_rpmsg_id_table, *id_table; - const char *ch_name = NULL; - - wpriv = devm_kzalloc(&pdev->dev, - sizeof(struct wdsp_glink_priv), GFP_KERNEL); - if (!wpriv) - return -ENOMEM; - - no_of_channels = of_property_count_strings(pdev->dev.of_node, - "qcom,wdsp-channels"); - if (no_of_channels < 0) { - dev_err(&pdev->dev, "%s: channel name parse error %d\n", - __func__, no_of_channels); - return -EINVAL; - } - - wpriv->ch = devm_kzalloc(&pdev->dev, - (sizeof(struct wdsp_glink_priv *) * no_of_channels), - GFP_KERNEL); - if (!wpriv->ch) - return -ENOMEM; - - for (i = 0; i < no_of_channels; i++) { - ret = of_property_read_string_index(pdev->dev.of_node, - "qcom,wdsp-channels", i, - &ch_name); - if (ret) { - dev_err(&pdev->dev, "%s: channel name parse error %d\n", - __func__, ret); - return -EINVAL; - } - wpriv->ch[i] = devm_kzalloc(&pdev->dev, - sizeof(struct wdsp_glink_priv), - GFP_KERNEL); - if (!wpriv->ch[i]) - return -ENOMEM; - - strlcpy(wpriv->ch[i]->ch_name, ch_name, RPMSG_NAME_SIZE); - wpriv->ch[i]->wpriv = wpriv; - spin_lock_init(&wpriv->ch[i]->ch_lock); - } - init_waitqueue_head(&wpriv->ch_state_wait); - init_completion(&wpriv->rsp_complete); - spin_lock_init(&wpriv->rsp_lock); - - wpriv->wdev = wdev; - wpriv->dev = wdev->dev; - wpriv->work_queue = create_singlethread_workqueue("wdsp_glink_wq"); - if (!wpriv->work_queue) { - dev_err(&pdev->dev, "%s: Error creating wdsp_glink_wq\n", - __func__); - return -EINVAL; - } - - wdsp_rpmsg_id_table = devm_kzalloc(&pdev->dev, - (sizeof(struct rpmsg_device_id) * - (no_of_channels + 1)), - GFP_KERNEL); - if (!wdsp_rpmsg_id_table) { - ret = -ENOMEM; - goto err; - } - - wpriv->no_of_channels = no_of_channels; - id_table = wdsp_rpmsg_id_table; - for (i = 0; i < no_of_channels; i++) { - strlcpy(id_table->name, wpriv->ch[i]->ch_name, - RPMSG_NAME_SIZE); - id_table++; - } - wdsp_rpmsg_driver.id_table = wdsp_rpmsg_id_table; - ret = register_rpmsg_driver(&wdsp_rpmsg_driver); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Rpmsg driver register failed, err = %d\n", - __func__, ret); - goto err; - } - - return 0; - -err: - destroy_workqueue(wpriv->work_queue); - return ret; -} - -static const struct file_operations wdsp_glink_fops = { - .owner = THIS_MODULE, - .open = wdsp_glink_open, - .read = wdsp_glink_read, - .write = wdsp_glink_write, - .flush = wdsp_glink_flush, - .release = wdsp_glink_release, -}; - -static int wdsp_glink_probe(struct platform_device *pdev) -{ - int ret; - struct wdsp_glink_dev *wdev; - - wdev = devm_kzalloc(&pdev->dev, sizeof(*wdev), GFP_KERNEL); - if (!wdev) { - ret = -ENOMEM; - goto done; - } - - ret = alloc_chrdev_region(&wdev->dev_num, 0, MINOR_NUMBER_COUNT, - WDSP_GLINK_DRIVER_NAME); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Failed to alloc char dev, err = %d\n", - __func__, ret); - goto err_chrdev; - } - - wdev->cls = class_create(THIS_MODULE, WDSP_GLINK_DRIVER_NAME); - if (IS_ERR(wdev->cls)) { - ret = PTR_ERR(wdev->cls); - dev_err(&pdev->dev, "%s: Failed to create class, err = %d\n", - __func__, ret); - goto err_class; - } - - wdev->dev = device_create(wdev->cls, NULL, wdev->dev_num, - NULL, WDSP_GLINK_DRIVER_NAME); - if (IS_ERR(wdev->dev)) { - ret = PTR_ERR(wdev->dev); - dev_err(&pdev->dev, "%s: Failed to create device, err = %d\n", - __func__, ret); - goto err_dev_create; - } - - cdev_init(&wdev->cdev, &wdsp_glink_fops); - ret = cdev_add(&wdev->cdev, wdev->dev_num, MINOR_NUMBER_COUNT); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Failed to register char dev, err = %d\n", - __func__, ret); - goto err_cdev_add; - } - - ret = wdsp_register_rpmsg(pdev, wdev); - if (ret < 0) { - dev_err(&pdev->dev, "%s: Failed to register with rpmsg, err = %d\n", - __func__, ret); - goto err_cdev_add; - } - platform_set_drvdata(pdev, wpriv); - - goto done; - -err_cdev_add: - device_destroy(wdev->cls, wdev->dev_num); - -err_dev_create: - class_destroy(wdev->cls); - -err_class: - unregister_chrdev_region(0, MINOR_NUMBER_COUNT); - -err_chrdev: -done: - return ret; -} - -static int wdsp_glink_remove(struct platform_device *pdev) -{ - struct wdsp_glink_priv *wpriv = platform_get_drvdata(pdev); - - unregister_rpmsg_driver(&wdsp_rpmsg_driver); - - if (wpriv) { - flush_workqueue(wpriv->work_queue); - destroy_workqueue(wpriv->work_queue); - if (wpriv->wdev) { - cdev_del(&wpriv->wdev->cdev); - device_destroy(wpriv->wdev->cls, wpriv->wdev->dev_num); - class_destroy(wpriv->wdev->cls); - unregister_chrdev_region(0, MINOR_NUMBER_COUNT); - } - } - - return 0; -} - -static const struct of_device_id wdsp_glink_of_match[] = { - {.compatible = "qcom,wcd-dsp-glink"}, - { } -}; -MODULE_DEVICE_TABLE(of, wdsp_glink_of_match); - -static struct platform_driver wdsp_glink_driver = { - .probe = wdsp_glink_probe, - .remove = wdsp_glink_remove, - .driver = { - .name = WDSP_GLINK_DRIVER_NAME, - .owner = THIS_MODULE, - .of_match_table = wdsp_glink_of_match, - }, -}; - -static int __init wdsp_glink_init(void) -{ - return platform_driver_register(&wdsp_glink_driver); -} - -static void __exit wdsp_glink_exit(void) -{ - platform_driver_unregister(&wdsp_glink_driver); -} - -module_init(wdsp_glink_init); -module_exit(wdsp_glink_exit); -MODULE_DESCRIPTION("SoC WCD_DSP GLINK Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/soc/Android.mk b/techpack/audio/soc/Android.mk deleted file mode 100644 index 5e4beb3d3192..000000000000 --- a/techpack/audio/soc/Android.mk +++ /dev/null @@ -1,101 +0,0 @@ -# Android makefile for audio kernel modules - -# Assume no targets will be supported - -# Check if this driver needs be built for current target -ifeq ($(call is-board-platform,sdm845),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM845=m -endif - -ifeq ($(call is-board-platform,sdm660),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM660=m -endif - -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 qcs605),true) -AUDIO_SELECT := CONFIG_SND_SOC_SDM670=m -endif - -ifeq ($(call is-board-platform,msmnile),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM8150=m -endif - -ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) atoll),true) -AUDIO_SELECT := CONFIG_SND_SOC_SM6150=m -endif - -AUDIO_CHIPSET := audio -# Build/Package only in case of supported target -ifeq ($(call is-board-platform-in-list,msm8953 sdm845 sdm670 sdm660 qcs605 msmnile $(MSMSTEPPE) $(TRINKET) atoll),true) - -LOCAL_PATH := $(call my-dir) - -# This makefile is only for DLKM -ifneq ($(findstring vendor,$(LOCAL_PATH)),) - -ifneq ($(findstring opensource,$(LOCAL_PATH)),) - AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel -endif # opensource - -DLKM_DIR := $(TOP)/device/qcom/common/dlkm - -# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko -########################################################### -# This is set once per LOCAL_PATH, not per (kernel) module -KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR) - -# We are actually building audio.ko here, as per the -# requirement we are specifying _audio.ko as LOCAL_MODULE. -# This means we need to rename the module to _audio.ko -# after audio.ko is built. -KBUILD_OPTIONS += MODNAME=soc_dlkm -KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM) -KBUILD_OPTIONS += $(AUDIO_SELECT) - -########################################################### -ifeq ($(call is-board-platform-in-list,msm8953 sdm670 sdm660 qcs605 $(MSMSTEPPE) atoll),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_lpi.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_lpi_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_pinctrl_wcd.ko -LOCAL_MODULE_KBUILD_NAME := pinctrl_wcd_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr.ko -LOCAL_MODULE_KBUILD_NAME := swr_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_swr_ctrl.ko -LOCAL_MODULE_KBUILD_NAME := swr_ctrl_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -########################################################### -ifeq ($(call is-board-platform-in-list, $(MSMSTEPPE) atoll $(TRINKET)),true) -include $(CLEAR_VARS) -LOCAL_MODULE := $(AUDIO_CHIPSET)_snd_event.ko -LOCAL_MODULE_KBUILD_NAME := snd_event_dlkm.ko -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_DEBUG_ENABLE := true -LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) -include $(DLKM_DIR)/AndroidKernelModule.mk -endif -########################################################### - -endif # DLKM check -endif # supported target check diff --git a/techpack/audio/soc/Kbuild b/techpack/audio/soc/Kbuild deleted file mode 100644 index 4de44c62a307..000000000000 --- a/techpack/audio/soc/Kbuild +++ /dev/null @@ -1,177 +0,0 @@ -# We can build either as part of a standalone Kernel build or as -# an external module. Determine which mechanism is being used -ifeq ($(MODNAME),) - KERNEL_BUILD := 1 -else - KERNEL_BUILD := 0 -endif - -ifeq ($(KERNEL_BUILD), 1) - # These are configurable via Kconfig for kernel-based builds - # Need to explicitly configure for Android-based builds - AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.14 - AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio -endif - -ifeq ($(KERNEL_BUILD), 0) - ifeq ($(CONFIG_ARCH_SDM845), y) - include $(AUDIO_ROOT)/config/sdm845auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm845autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM660), y) - include $(AUDIO_ROOT)/config/sdm660auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm660autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM670), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SDM450), y) - include $(AUDIO_ROOT)/config/sdm670auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sdm670autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM8150), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_SM6150), y) - include $(AUDIO_ROOT)/config/sm6150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm6150autoconf.h - endif - ifeq ($(CONFIG_ARCH_TRINKET), y) - include $(AUDIO_ROOT)/config/trinketauto.conf - export - INCS += -include $(AUDIO_ROOT)/config/trinketautoconf.h - endif - ifeq ($(CONFIG_ARCH_SDMSHRIKE), y) - include $(AUDIO_ROOT)/config/sm8150auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/sm8150autoconf.h - endif - ifeq ($(CONFIG_ARCH_QCS405), y) - include $(AUDIO_ROOT)/config/qcs405auto.conf - export - INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h - endif -endif - -# As per target team, build is done as follows: -# Defconfig : build with default flags -# Slub : defconfig + CONFIG_SLUB_DEBUG := y + -# CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y -# Perf : Using appropriate msmXXXX-perf_defconfig -# -# Shipment builds (user variants) should not have any debug feature -# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds -# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since -# there is no other way to identify defconfig builds, QTI internal -# representation of perf builds (identified using the string 'perf'), -# is used to identify if the build is a slub or defconfig one. This -# way no critical debug feature will be enabled for perf and shipment -# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT -# config. - -############ UAPI ############ -UAPI_DIR := uapi -UAPI_INC := -I$(AUDIO_ROOT)/include/$(UAPI_DIR) - -############ COMMON ############ -COMMON_DIR := include -COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR) - -############ SoC Modules ############ - -# for pinctrl WCD driver -ifdef CONFIG_PINCTRL_WCD - PINCTRL_WCD_OBJS += pinctrl-wcd.o -endif - -# for pinctrl LPI driver -ifdef CONFIG_PINCTRL_LPI - PINCTRL_LPI_OBJS += pinctrl-lpi.o -endif - -# for soundwire driver -ifdef CONFIG_SOUNDWIRE_WCD_CTRL - SWR_CTRL_OBJS += swr-wcd-ctrl.o -endif - -# for new soundwire driver -ifdef CONFIG_SOUNDWIRE_MSTR_CTRL - SWR_CTRL_OBJS += swr-mstr-ctrl.o -endif - -ifdef CONFIG_SOUNDWIRE - SWR_OBJS += regmap-swr.o - SWR_OBJS += soundwire.o -endif - -ifdef CONFIG_SND_EVENT - SND_EVENT_OBJS += snd_event.o -endif - -LINUX_INC += -Iinclude/linux - -INCS += $(COMMON_INC) \ - $(UAPI_INC) - -EXTRA_CFLAGS += $(INCS) - - -CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ - -DANI_LITTLE_BIT_ENDIAN \ - -DDOT11F_LITTLE_ENDIAN_HOST \ - -DANI_COMPILER_TYPE_GCC \ - -DANI_OS_TYPE_ANDROID=6 \ - -DPTT_SOCK_SVC_ENABLE \ - -Wall\ - -Werror\ - -D__linux__ - -KBUILD_CPPFLAGS += $(CDEFINES) - -ifeq ($(KERNEL_BUILD), 0) -KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers -endif - -# Currently, for versions of gcc which support it, the kernel Makefile -# is disabling the maybe-uninitialized warning. Re-enable it for the -# AUDIO driver. Note that we must use EXTRA_CFLAGS here so that it -# will override the kernel settings. -ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) -EXTRA_CFLAGS += -Wmaybe-uninitialized -endif -#EXTRA_CFLAGS += -Wmissing-prototypes - -ifeq ($(call cc-option-yn, -Wheader-guard),y) -EXTRA_CFLAGS += -Wheader-guard -endif - -ifeq ($(CONFIG_SND_SOC_GCOV), y) -GCOV_PROFILE := y -endif - -# Module information used by KBuild framework -obj-$(CONFIG_PINCTRL_WCD) += pinctrl_wcd_dlkm.o -pinctrl_wcd_dlkm-y := $(PINCTRL_WCD_OBJS) - -obj-$(CONFIG_PINCTRL_LPI) += pinctrl_lpi_dlkm.o -pinctrl_lpi_dlkm-y := $(PINCTRL_LPI_OBJS) - -obj-$(CONFIG_SOUNDWIRE) += swr_dlkm.o -swr_dlkm-y := $(SWR_OBJS) - -obj-$(CONFIG_SND_EVENT) += snd_event_dlkm.o -snd_event_dlkm-y := $(SND_EVENT_OBJS) - -obj-$(CONFIG_SOUNDWIRE_WCD_CTRL) += swr_ctrl_dlkm.o -obj-$(CONFIG_SOUNDWIRE_MSTR_CTRL) += swr_ctrl_dlkm.o -swr_ctrl_dlkm-y := $(SWR_CTRL_OBJS) - -# inject some build related information diff --git a/techpack/audio/soc/core.h b/techpack/audio/soc/core.h deleted file mode 120000 index 8a2fa90df8cb..000000000000 --- a/techpack/audio/soc/core.h +++ /dev/null @@ -1 +0,0 @@ -../../../drivers/pinctrl/core.h \ No newline at end of file diff --git a/techpack/audio/soc/pinctrl-lpi.c b/techpack/audio/soc/pinctrl-lpi.c deleted file mode 100644 index 23edee736cec..000000000000 --- a/techpack/audio/soc/pinctrl-lpi.c +++ /dev/null @@ -1,794 +0,0 @@ -/* - * Copyright (c) 2016-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "core.h" -#include "pinctrl-utils.h" - -#define LPI_AUTO_SUSPEND_DELAY 100 /* delay in msec */ - -#define LPI_ADDRESS_SIZE 0x20000 - -#define LPI_GPIO_REG_VAL_CTL 0x00 -#define LPI_GPIO_REG_DIR_CTL 0x04 - -#define LPI_GPIO_REG_PULL_SHIFT 0x0 -#define LPI_GPIO_REG_PULL_MASK 0x3 - -#define LPI_GPIO_REG_FUNCTION_SHIFT 0x2 -#define LPI_GPIO_REG_FUNCTION_MASK 0x3C - -#define LPI_GPIO_REG_OUT_STRENGTH_SHIFT 0x6 -#define LPI_GPIO_REG_OUT_STRENGTH_MASK 0x1C0 - -#define LPI_GPIO_REG_OE_SHIFT 0x9 -#define LPI_GPIO_REG_OE_MASK 0x200 - -#define LPI_GPIO_REG_DIR_SHIFT 0x1 -#define LPI_GPIO_REG_DIR_MASK 0x2 - -#define LPI_GPIO_BIAS_DISABLE 0x0 -#define LPI_GPIO_PULL_DOWN 0x1 -#define LPI_GPIO_KEEPER 0x2 -#define LPI_GPIO_PULL_UP 0x3 - -#define LPI_GPIO_FUNC_GPIO "gpio" -#define LPI_GPIO_FUNC_FUNC1 "func1" -#define LPI_GPIO_FUNC_FUNC2 "func2" -#define LPI_GPIO_FUNC_FUNC3 "func3" -#define LPI_GPIO_FUNC_FUNC4 "func4" -#define LPI_GPIO_FUNC_FUNC5 "func5" - -static bool lpi_dev_up; -static struct device *lpi_dev; - -/* The index of each function in lpi_gpio_functions[] array */ -enum lpi_gpio_func_index { - LPI_GPIO_FUNC_INDEX_GPIO = 0x00, - LPI_GPIO_FUNC_INDEX_FUNC1 = 0x01, - LPI_GPIO_FUNC_INDEX_FUNC2 = 0x02, - LPI_GPIO_FUNC_INDEX_FUNC3 = 0x03, - LPI_GPIO_FUNC_INDEX_FUNC4 = 0x04, - LPI_GPIO_FUNC_INDEX_FUNC5 = 0x05, -}; - -/** - * struct lpi_gpio_pad - keep current GPIO settings - * @offset: Nth GPIO in supported GPIOs. - * @output_enabled: Set to true if GPIO output logic is enabled. - * @value: value of a pin - * @base: Address base of LPI GPIO PAD. - * @pullup: Constant current which flow through GPIO output buffer. - * @strength: No, Low, Medium, High - * @function: See lpi_gpio_functions[] - */ -struct lpi_gpio_pad { - u32 offset; - bool output_enabled; - bool value; - char __iomem *base; - unsigned int pullup; - unsigned int strength; - unsigned int function; -}; - -struct lpi_gpio_state { - struct device *dev; - struct pinctrl_dev *ctrl; - struct gpio_chip chip; - char __iomem *base; - struct clk *lpass_core_hw_vote; - bool core_hw_vote_status; -}; - -static const char *const lpi_gpio_groups[] = { - "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", - "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", - "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", - "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", - "gpio29", "gpio30", "gpio31", -}; - -#define LPI_TLMM_MAX_PINS 100 -static u32 lpi_offset[LPI_TLMM_MAX_PINS]; - -static const char *const lpi_gpio_functions[] = { - [LPI_GPIO_FUNC_INDEX_GPIO] = LPI_GPIO_FUNC_GPIO, - [LPI_GPIO_FUNC_INDEX_FUNC1] = LPI_GPIO_FUNC_FUNC1, - [LPI_GPIO_FUNC_INDEX_FUNC2] = LPI_GPIO_FUNC_FUNC2, - [LPI_GPIO_FUNC_INDEX_FUNC3] = LPI_GPIO_FUNC_FUNC3, - [LPI_GPIO_FUNC_INDEX_FUNC4] = LPI_GPIO_FUNC_FUNC4, - [LPI_GPIO_FUNC_INDEX_FUNC5] = LPI_GPIO_FUNC_FUNC5, -}; - -static int lpi_gpio_read(struct lpi_gpio_pad *pad, unsigned int addr) -{ - int ret; - - if (!lpi_dev_up) { - pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", - __func__); - return 0; - } - pm_runtime_get_sync(lpi_dev); - - ret = ioread32(pad->base + pad->offset + addr); - if (ret < 0) - pr_err("%s: read 0x%x failed\n", __func__, addr); - - pm_runtime_mark_last_busy(lpi_dev); - pm_runtime_put_autosuspend(lpi_dev); - return ret; -} - -static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, - unsigned int val) -{ - if (!lpi_dev_up) { - pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", - __func__); - return 0; - } - pm_runtime_get_sync(lpi_dev); - - iowrite32(val, pad->base + pad->offset + addr); - - pm_runtime_mark_last_busy(lpi_dev); - pm_runtime_put_autosuspend(lpi_dev); - return 0; -} - -static int lpi_gpio_get_groups_count(struct pinctrl_dev *pctldev) -{ - /* Every PIN is a group */ - return pctldev->desc->npins; -} - -static const char *lpi_gpio_get_group_name(struct pinctrl_dev *pctldev, - unsigned int pin) -{ - return pctldev->desc->pins[pin].name; -} - -static int lpi_gpio_get_group_pins(struct pinctrl_dev *pctldev, - unsigned int pin, - const unsigned int **pins, - unsigned int *num_pins) -{ - *pins = &pctldev->desc->pins[pin].number; - *num_pins = 1; - return 0; -} - -static const struct pinctrl_ops lpi_gpio_pinctrl_ops = { - .get_groups_count = lpi_gpio_get_groups_count, - .get_group_name = lpi_gpio_get_group_name, - .get_group_pins = lpi_gpio_get_group_pins, - .dt_node_to_map = pinconf_generic_dt_node_to_map_group, - .dt_free_map = pinctrl_utils_free_map, -}; - -static int lpi_gpio_get_functions_count(struct pinctrl_dev *pctldev) -{ - return ARRAY_SIZE(lpi_gpio_functions); -} - -static const char *lpi_gpio_get_function_name(struct pinctrl_dev *pctldev, - unsigned int function) -{ - return lpi_gpio_functions[function]; -} - -static int lpi_gpio_get_function_groups(struct pinctrl_dev *pctldev, - unsigned int function, - const char *const **groups, - unsigned *const num_qgroups) -{ - *groups = lpi_gpio_groups; - *num_qgroups = pctldev->desc->npins; - return 0; -} - -static int lpi_gpio_set_mux(struct pinctrl_dev *pctldev, unsigned int function, - unsigned int pin) -{ - struct lpi_gpio_pad *pad; - unsigned int val; - - pad = pctldev->desc->pins[pin].drv_data; - - pad->function = function; - - val = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - val &= ~(LPI_GPIO_REG_FUNCTION_MASK); - val |= pad->function << LPI_GPIO_REG_FUNCTION_SHIFT; - lpi_gpio_write(pad, LPI_GPIO_REG_VAL_CTL, val); - return 0; -} - -static const struct pinmux_ops lpi_gpio_pinmux_ops = { - .get_functions_count = lpi_gpio_get_functions_count, - .get_function_name = lpi_gpio_get_function_name, - .get_function_groups = lpi_gpio_get_function_groups, - .set_mux = lpi_gpio_set_mux, -}; - -static int lpi_config_get(struct pinctrl_dev *pctldev, - unsigned int pin, unsigned long *config) -{ - unsigned int param = pinconf_to_config_param(*config); - struct lpi_gpio_pad *pad; - unsigned int arg; - - pad = pctldev->desc->pins[pin].drv_data; - - switch (param) { - case PIN_CONFIG_BIAS_DISABLE: - arg = pad->pullup = LPI_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_DOWN: - arg = pad->pullup == LPI_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_BUS_HOLD: - arg = pad->pullup = LPI_GPIO_KEEPER; - break; - case PIN_CONFIG_BIAS_PULL_UP: - arg = pad->pullup == LPI_GPIO_PULL_UP; - break; - case PIN_CONFIG_INPUT_ENABLE: - case PIN_CONFIG_OUTPUT: - arg = pad->output_enabled; - break; - default: - return -EINVAL; - } - - *config = pinconf_to_config_packed(param, arg); - return 0; -} - -static unsigned int lpi_drive_to_regval(u32 arg) -{ - return (arg/2 - 1); -} - -static int lpi_config_set(struct pinctrl_dev *pctldev, unsigned int pin, - unsigned long *configs, unsigned int nconfs) -{ - struct lpi_gpio_pad *pad; - unsigned int param, arg; - int i, ret = 0, val; - - pad = pctldev->desc->pins[pin].drv_data; - - for (i = 0; i < nconfs; i++) { - param = pinconf_to_config_param(configs[i]); - arg = pinconf_to_config_argument(configs[i]); - - dev_dbg(pctldev->dev, "%s: param: %d arg: %d pin: %d\n", - __func__, param, arg, pin); - - switch (param) { - case PIN_CONFIG_BIAS_DISABLE: - pad->pullup = LPI_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_DOWN: - pad->pullup = LPI_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_BUS_HOLD: - pad->pullup = LPI_GPIO_KEEPER; - break; - case PIN_CONFIG_BIAS_PULL_UP: - pad->pullup = LPI_GPIO_PULL_UP; - break; - case PIN_CONFIG_INPUT_ENABLE: - pad->output_enabled = false; - break; - case PIN_CONFIG_OUTPUT: - pad->output_enabled = true; - pad->value = arg; - break; - case PIN_CONFIG_DRIVE_STRENGTH: - pad->strength = arg; - break; - default: - ret = -EINVAL; - goto done; - } - } - - val = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - val &= ~(LPI_GPIO_REG_PULL_MASK | LPI_GPIO_REG_OUT_STRENGTH_MASK | - LPI_GPIO_REG_OE_MASK); - val |= pad->pullup << LPI_GPIO_REG_PULL_SHIFT; - val |= lpi_drive_to_regval(pad->strength) << - LPI_GPIO_REG_OUT_STRENGTH_SHIFT; - if (pad->output_enabled) - val |= pad->value << LPI_GPIO_REG_OE_SHIFT; - - lpi_gpio_write(pad, LPI_GPIO_REG_VAL_CTL, val); - lpi_gpio_write(pad, LPI_GPIO_REG_DIR_CTL, - pad->output_enabled << LPI_GPIO_REG_DIR_SHIFT); -done: - return ret; -} - -static const struct pinconf_ops lpi_gpio_pinconf_ops = { - .is_generic = true, - .pin_config_group_get = lpi_config_get, - .pin_config_group_set = lpi_config_set, -}; - -static int lpi_gpio_direction_input(struct gpio_chip *chip, unsigned int pin) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1); - - return lpi_config_set(state->ctrl, pin, &config, 1); -} - -static int lpi_gpio_direction_output(struct gpio_chip *chip, - unsigned int pin, int val) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, val); - - return lpi_config_set(state->ctrl, pin, &config, 1); -} - -static int lpi_gpio_get(struct gpio_chip *chip, unsigned int pin) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - struct lpi_gpio_pad *pad; - int value; - - pad = state->ctrl->desc->pins[pin].drv_data; - - value = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - return value; -} - -static void lpi_gpio_set(struct gpio_chip *chip, unsigned int pin, int value) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, value); - - lpi_config_set(state->ctrl, pin, &config, 1); -} - -static int lpi_notifier_service_cb(struct notifier_block *this, - unsigned long opcode, void *ptr) -{ - static bool initial_boot = true; - - pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); - - switch (opcode) { - case AUDIO_NOTIFIER_SERVICE_DOWN: - if (initial_boot) { - initial_boot = false; - break; - } - snd_event_notify(lpi_dev, SND_EVENT_DOWN); - lpi_dev_up = false; - break; - case AUDIO_NOTIFIER_SERVICE_UP: - if (initial_boot) - initial_boot = false; - lpi_dev_up = true; - snd_event_notify(lpi_dev, SND_EVENT_UP); - break; - default: - break; - } - return NOTIFY_OK; -} - -static struct notifier_block service_nb = { - .notifier_call = lpi_notifier_service_cb, - .priority = -INT_MAX, -}; - -static void lpi_pinctrl_ssr_disable(struct device *dev, void *data) -{ - lpi_dev_up = false; -} - -static const struct snd_event_ops lpi_pinctrl_ssr_ops = { - .disable = lpi_pinctrl_ssr_disable, -}; - -#ifdef CONFIG_DEBUG_FS -#include - -static unsigned int lpi_regval_to_drive(u32 val) -{ - return (val + 1) * 2; -} - -static void lpi_gpio_dbg_show_one(struct seq_file *s, - struct pinctrl_dev *pctldev, - struct gpio_chip *chip, - unsigned int offset, - unsigned int gpio) -{ - struct lpi_gpio_state *state = gpiochip_get_data(chip); - struct pinctrl_pin_desc pindesc; - struct lpi_gpio_pad *pad; - unsigned int func; - int is_out; - int drive; - int pull; - u32 ctl_reg; - - static const char * const pulls[] = { - "no pull", - "pull down", - "keeper", - "pull up" - }; - - pctldev = pctldev ? : state->ctrl; - pindesc = pctldev->desc->pins[offset]; - pad = pctldev->desc->pins[offset].drv_data; - ctl_reg = lpi_gpio_read(pad, LPI_GPIO_REG_DIR_CTL); - is_out = (ctl_reg & LPI_GPIO_REG_DIR_MASK) >> LPI_GPIO_REG_DIR_SHIFT; - ctl_reg = lpi_gpio_read(pad, LPI_GPIO_REG_VAL_CTL); - - func = (ctl_reg & LPI_GPIO_REG_FUNCTION_MASK) >> - LPI_GPIO_REG_FUNCTION_SHIFT; - drive = (ctl_reg & LPI_GPIO_REG_OUT_STRENGTH_MASK) >> - LPI_GPIO_REG_OUT_STRENGTH_SHIFT; - pull = (ctl_reg & LPI_GPIO_REG_PULL_MASK) >> LPI_GPIO_REG_PULL_SHIFT; - - seq_printf(s, " %-8s: %-3s %d", - pindesc.name, is_out ? "out" : "in", func); - seq_printf(s, " %dmA", lpi_regval_to_drive(drive)); - seq_printf(s, " %s", pulls[pull]); -} - -static void lpi_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) -{ - unsigned int gpio = chip->base; - unsigned int i; - - for (i = 0; i < chip->ngpio; i++, gpio++) { - lpi_gpio_dbg_show_one(s, NULL, chip, i, gpio); - seq_puts(s, "\n"); - } -} - -#else -#define lpi_gpio_dbg_show NULL -#endif - -static const struct gpio_chip lpi_gpio_template = { - .direction_input = lpi_gpio_direction_input, - .direction_output = lpi_gpio_direction_output, - .get = lpi_gpio_get, - .set = lpi_gpio_set, - .request = gpiochip_generic_request, - .free = gpiochip_generic_free, - .dbg_show = lpi_gpio_dbg_show, -}; - -static int lpi_get_lpass_core_hw_clk(struct device *dev, - struct lpi_gpio_state *state) -{ - struct clk *lpass_core_hw_vote = NULL; - int ret = 0; - - if (state->lpass_core_hw_vote == NULL) { - lpass_core_hw_vote = devm_clk_get(dev, "lpass_core_hw_vote"); - if (IS_ERR(lpass_core_hw_vote) || lpass_core_hw_vote == NULL) { - ret = PTR_ERR(lpass_core_hw_vote); - dev_dbg(dev, "%s: clk get %s failed %d\n", - __func__, "lpass_core_hw_vote", ret); - return ret; - } - state->lpass_core_hw_vote = lpass_core_hw_vote; - } - return 0; -} - -static int lpi_pinctrl_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct pinctrl_pin_desc *pindesc; - struct pinctrl_desc *pctrldesc; - struct lpi_gpio_pad *pad, *pads; - struct lpi_gpio_state *state; - int ret, npins, i; - char __iomem *lpi_base; - u32 reg; - - ret = of_property_read_u32(dev->of_node, "reg", ®); - if (ret < 0) { - dev_err(dev, "missing base address\n"); - return ret; - } - - ret = of_property_read_u32(dev->of_node, "qcom,num-gpios", &npins); - if (ret < 0) - return ret; - - WARN_ON(npins > ARRAY_SIZE(lpi_gpio_groups)); - - ret = of_property_read_u32_array(dev->of_node, "qcom,lpi-offset-tbl", - lpi_offset, npins); - if (ret < 0) { - dev_err(dev, "error in reading lpi offset table: %d\n", ret); - return ret; - } - - state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); - if (!state) - return -ENOMEM; - - platform_set_drvdata(pdev, state); - - state->dev = &pdev->dev; - - pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL); - if (!pindesc) - return -ENOMEM; - - pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL); - if (!pads) - return -ENOMEM; - - pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL); - if (!pctrldesc) - return -ENOMEM; - - pctrldesc->pctlops = &lpi_gpio_pinctrl_ops; - pctrldesc->pmxops = &lpi_gpio_pinmux_ops; - pctrldesc->confops = &lpi_gpio_pinconf_ops; - pctrldesc->owner = THIS_MODULE; - pctrldesc->name = dev_name(dev); - pctrldesc->pins = pindesc; - pctrldesc->npins = npins; - - lpi_base = devm_ioremap(dev, reg, LPI_ADDRESS_SIZE); - if (lpi_base == NULL) { - dev_err(dev, "%s devm_ioremap failed\n", __func__); - return -ENOMEM; - } - - state->base = lpi_base; - - for (i = 0; i < npins; i++, pindesc++) { - pad = &pads[i]; - pindesc->drv_data = pad; - pindesc->number = i; - pindesc->name = lpi_gpio_groups[i]; - - pad->base = lpi_base; - pad->offset = lpi_offset[i]; - } - - state->chip = lpi_gpio_template; - state->chip.parent = dev; - state->chip.base = -1; - state->chip.ngpio = npins; - state->chip.label = dev_name(dev); - state->chip.of_gpio_n_cells = 2; - state->chip.can_sleep = false; - - state->ctrl = devm_pinctrl_register(dev, pctrldesc, state); - if (IS_ERR(state->ctrl)) - return PTR_ERR(state->ctrl); - - ret = gpiochip_add_data(&state->chip, state); - if (ret) { - dev_err(state->dev, "can't add gpio chip\n"); - goto err_chip; - } - - ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, npins); - if (ret) { - dev_err(dev, "failed to add pin range\n"); - goto err_range; - } - - lpi_dev = &pdev->dev; - lpi_dev_up = true; - ret = audio_notifier_register("lpi_tlmm", AUDIO_NOTIFIER_ADSP_DOMAIN, - &service_nb); - if (ret < 0) { - pr_err("%s: Audio notifier register failed ret = %d\n", - __func__, ret); - goto err_range; - } - - ret = snd_event_client_register(dev, &lpi_pinctrl_ssr_ops, NULL); - if (!ret) { - snd_event_notify(dev, SND_EVENT_UP); - } else { - dev_err(dev, "%s: snd_event registration failed, ret [%d]\n", - __func__, ret); - goto err_snd_evt; - } - - /* Register LPASS core hw vote */ - ret = lpi_get_lpass_core_hw_clk(dev, state); - if (ret) - dev_dbg(dev, "%s: unable to get core clk handle %d\n", - __func__, ret); - - state->core_hw_vote_status = false; - pm_runtime_set_autosuspend_delay(&pdev->dev, LPI_AUTO_SUSPEND_DELAY); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - pm_runtime_enable(&pdev->dev); - - return 0; - -err_snd_evt: - audio_notifier_deregister("lpi_tlmm"); -err_range: - gpiochip_remove(&state->chip); -err_chip: - return ret; -} - -static int lpi_pinctrl_remove(struct platform_device *pdev) -{ - struct lpi_gpio_state *state = platform_get_drvdata(pdev); - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - - snd_event_client_deregister(&pdev->dev); - audio_notifier_deregister("lpi_tlmm"); - gpiochip_remove(&state->chip); - return 0; -} - -static const struct of_device_id lpi_pinctrl_of_match[] = { - { .compatible = "qcom,lpi-pinctrl" }, /* Generic */ - { }, -}; - -MODULE_DEVICE_TABLE(of, lpi_pinctrl_of_match); - -static int lpi_pinctrl_runtime_resume(struct device *dev) -{ - struct lpi_gpio_state *state = dev_get_drvdata(dev); - int ret = 0; - - ret = lpi_get_lpass_core_hw_clk(dev, state); - if (ret) { - dev_err(dev, "%s: unable to get core clk handle %d\n", - __func__, ret); - return 0; - } - - ret = clk_prepare_enable(state->lpass_core_hw_vote); - if (ret < 0) - dev_err(dev, "%s: lpass core hw enable failed\n", - __func__); - else - state->core_hw_vote_status = true; - - pm_runtime_set_autosuspend_delay(dev, LPI_AUTO_SUSPEND_DELAY); - return 0; -} - -static int lpi_pinctrl_runtime_suspend(struct device *dev) -{ - struct lpi_gpio_state *state = dev_get_drvdata(dev); - int ret = 0; - - ret = lpi_get_lpass_core_hw_clk(dev, state); - if (ret) { - dev_err(dev, "%s: unable to get core clk handle %d\n", - __func__, ret); - return 0; - } - - if (state->core_hw_vote_status) { - clk_disable_unprepare(state->lpass_core_hw_vote); - state->core_hw_vote_status = false; - } - return 0; -} - -int lpi_pinctrl_suspend(struct device *dev) -{ - int ret = 0; - - dev_dbg(dev, "%s: system suspend\n", __func__); - - if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) { - ret = lpi_pinctrl_runtime_suspend(dev); - if (!ret) { - /* - * Synchronize runtime-pm and system-pm states: - * At this point, we are already suspended. If - * runtime-pm still thinks its active, then - * make sure its status is in sync with HW - * status. The three below calls let the - * runtime-pm know that we are suspended - * already without re-invoking the suspend - * callback - */ - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - - return ret; -} - -int lpi_pinctrl_resume(struct device *dev) -{ - return 0; -} - -static const struct dev_pm_ops lpi_pinctrl_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - lpi_pinctrl_suspend, - lpi_pinctrl_resume - ) - SET_RUNTIME_PM_OPS( - lpi_pinctrl_runtime_suspend, - lpi_pinctrl_runtime_resume, - NULL - ) -}; - -static struct platform_driver lpi_pinctrl_driver = { - .driver = { - .name = "qcom-lpi-pinctrl", - .pm = &lpi_pinctrl_dev_pm_ops, - .of_match_table = lpi_pinctrl_of_match, - }, - .probe = lpi_pinctrl_probe, - .remove = lpi_pinctrl_remove, -}; - -static int __init lpi_init(void) -{ - return platform_driver_register(&lpi_pinctrl_driver); -} -late_initcall(lpi_init); - -static void __exit lpi_exit(void) -{ - platform_driver_unregister(&lpi_pinctrl_driver); -} -module_exit(lpi_exit); - -MODULE_DESCRIPTION("QTI LPI GPIO pin control driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/soc/pinctrl-utils.h b/techpack/audio/soc/pinctrl-utils.h deleted file mode 120000 index 9aab5f24bd14..000000000000 --- a/techpack/audio/soc/pinctrl-utils.h +++ /dev/null @@ -1 +0,0 @@ -../../../drivers/pinctrl/pinctrl-utils.h \ No newline at end of file diff --git a/techpack/audio/soc/pinctrl-wcd.c b/techpack/audio/soc/pinctrl-wcd.c deleted file mode 100644 index d7695dbe77b8..000000000000 --- a/techpack/audio/soc/pinctrl-wcd.c +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Copyright (c) 2016-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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "core.h" -#include "pinctrl-utils.h" - -#define WCD_REG_DIR_CTL WCD934X_CHIP_TIER_CTRL_GPIO_CTL_OE -#define WCD_REG_VAL_CTL WCD934X_CHIP_TIER_CTRL_GPIO_CTL_DATA -#define WCD_GPIO_PULL_UP 1 -#define WCD_GPIO_PULL_DOWN 2 -#define WCD_GPIO_BIAS_DISABLE 3 -#define WCD_GPIO_STRING_LEN 20 - -/** - * struct wcd_gpio_pad - keep current GPIO settings - * @offset: offset of gpio. - * @is_valid: Set to false, when GPIO in high Z state. - * @value: value of a pin - * @output_enabled: Set to true if GPIO is output and false if it is input - * @pullup: Constant current which flow through GPIO output buffer. - * @strength: Drive strength of a pin - */ -struct wcd_gpio_pad { - u16 offset; - bool is_valid; - bool value; - bool output_enabled; - unsigned int pullup; - unsigned int strength; -}; - -struct wcd_gpio_priv { - struct device *dev; - struct regmap *map; - struct pinctrl_dev *ctrl; - struct gpio_chip chip; -}; - -static int wcd_gpio_read(struct wcd_gpio_priv *priv_data, - struct wcd_gpio_pad *pad, unsigned int addr) -{ - unsigned int val; - int ret; - - ret = regmap_read(priv_data->map, addr, &val); - if (ret < 0) - dev_err(priv_data->dev, "%s: read 0x%x failed\n", - __func__, addr); - else - ret = (val >> pad->offset); - - return ret; -} - -static int wcd_gpio_write(struct wcd_gpio_priv *priv_data, - struct wcd_gpio_pad *pad, unsigned int addr, - unsigned int val) -{ - int ret; - - ret = regmap_update_bits(priv_data->map, addr, (1 << pad->offset), - val << pad->offset); - if (ret < 0) - dev_err(priv_data->dev, "write 0x%x failed\n", addr); - - return ret; -} - -static int wcd_get_groups_count(struct pinctrl_dev *pctldev) -{ - return pctldev->desc->npins; -} - -static const char *wcd_get_group_name(struct pinctrl_dev *pctldev, - unsigned int pin) -{ - return pctldev->desc->pins[pin].name; -} - -static int wcd_get_group_pins(struct pinctrl_dev *pctldev, unsigned int pin, - const unsigned int **pins, unsigned int *num_pins) -{ - *pins = &pctldev->desc->pins[pin].number; - *num_pins = 1; - return 0; -} - -static const struct pinctrl_ops wcd_pinctrl_ops = { - .get_groups_count = wcd_get_groups_count, - .get_group_name = wcd_get_group_name, - .get_group_pins = wcd_get_group_pins, - .dt_node_to_map = pinconf_generic_dt_node_to_map_group, - .dt_free_map = pinctrl_utils_free_map, -}; - -static int wcd_config_get(struct pinctrl_dev *pctldev, - unsigned int pin, unsigned long *config) -{ - unsigned int param = pinconf_to_config_param(*config); - struct wcd_gpio_pad *pad; - unsigned int arg; - - pad = pctldev->desc->pins[pin].drv_data; - - switch (param) { - case PIN_CONFIG_BIAS_PULL_DOWN: - arg = pad->pullup == WCD_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_DISABLE: - arg = pad->pullup = WCD_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_UP: - arg = pad->pullup == WCD_GPIO_PULL_UP; - break; - case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: - arg = !pad->is_valid; - break; - case PIN_CONFIG_INPUT_ENABLE: - arg = pad->output_enabled; - break; - case PIN_CONFIG_OUTPUT: - arg = pad->value; - break; - default: - return -EINVAL; - } - - *config = pinconf_to_config_packed(param, arg); - return 0; -} - -static int wcd_config_set(struct pinctrl_dev *pctldev, unsigned int pin, - unsigned long *configs, unsigned int nconfs) -{ - struct wcd_gpio_priv *priv_data = pinctrl_dev_get_drvdata(pctldev); - struct wcd_gpio_pad *pad; - unsigned int param, arg; - int i, ret; - - pad = pctldev->desc->pins[pin].drv_data; - - for (i = 0; i < nconfs; i++) { - param = pinconf_to_config_param(configs[i]); - arg = pinconf_to_config_argument(configs[i]); - - dev_dbg(priv_data->dev, "%s: param: %d arg: %d", - __func__, param, arg); - - switch (param) { - case PIN_CONFIG_BIAS_DISABLE: - pad->pullup = WCD_GPIO_BIAS_DISABLE; - break; - case PIN_CONFIG_BIAS_PULL_UP: - pad->pullup = WCD_GPIO_PULL_UP; - break; - case PIN_CONFIG_BIAS_PULL_DOWN: - pad->pullup = WCD_GPIO_PULL_DOWN; - break; - case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: - pad->is_valid = false; - break; - case PIN_CONFIG_INPUT_ENABLE: - pad->output_enabled = false; - break; - case PIN_CONFIG_OUTPUT: - pad->output_enabled = true; - pad->value = arg; - break; - case PIN_CONFIG_DRIVE_STRENGTH: - pad->strength = arg; - break; - default: - ret = -EINVAL; - goto done; - } - } - - if (pad->output_enabled) { - ret = wcd_gpio_write(priv_data, pad, WCD_REG_DIR_CTL, - pad->output_enabled); - if (ret < 0) - goto done; - ret = wcd_gpio_write(priv_data, pad, WCD_REG_VAL_CTL, - pad->value); - } else - ret = wcd_gpio_write(priv_data, pad, WCD_REG_DIR_CTL, - pad->output_enabled); -done: - return ret; -} - -static const struct pinconf_ops wcd_pinconf_ops = { - .is_generic = true, - .pin_config_group_get = wcd_config_get, - .pin_config_group_set = wcd_config_set, -}; - -static int wcd_gpio_direction_input(struct gpio_chip *chip, unsigned int pin) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1); - - return wcd_config_set(priv_data->ctrl, pin, &config, 1); -} - -static int wcd_gpio_direction_output(struct gpio_chip *chip, - unsigned int pin, int val) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, val); - - return wcd_config_set(priv_data->ctrl, pin, &config, 1); -} - -static int wcd_gpio_get(struct gpio_chip *chip, unsigned int pin) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - struct wcd_gpio_pad *pad; - int value; - - pad = priv_data->ctrl->desc->pins[pin].drv_data; - - if (!pad->is_valid) - return -EINVAL; - - value = wcd_gpio_read(priv_data, pad, WCD_REG_VAL_CTL); - return value; -} - -static void wcd_gpio_set(struct gpio_chip *chip, unsigned int pin, int value) -{ - struct wcd_gpio_priv *priv_data = gpiochip_get_data(chip); - unsigned long config; - - config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, value); - - wcd_config_set(priv_data->ctrl, pin, &config, 1); -} - -static const struct gpio_chip wcd_gpio_chip = { - .direction_input = wcd_gpio_direction_input, - .direction_output = wcd_gpio_direction_output, - .get = wcd_gpio_get, - .set = wcd_gpio_set, -}; - -static int wcd_pinctrl_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct pinctrl_pin_desc *pindesc; - struct pinctrl_desc *pctrldesc; - struct wcd_gpio_pad *pad, *pads; - struct wcd_gpio_priv *priv_data; - int ret, i, j; - u32 npins; - char **name; - - ret = of_property_read_u32(dev->of_node, "qcom,num-gpios", &npins); - if (ret) { - dev_err(dev, "%s: Looking up %s property in node %s failed\n", - __func__, "qcom,num-gpios", dev->of_node->full_name); - ret = -EINVAL; - goto err_priv_alloc; - } - if (!npins) { - dev_err(dev, "%s: no.of pins are 0\n", __func__); - ret = -EINVAL; - goto err_priv_alloc; - } - - priv_data = devm_kzalloc(dev, sizeof(*priv_data), GFP_KERNEL); - if (!priv_data) { - ret = -ENOMEM; - goto err_priv_alloc; - } - - priv_data->dev = dev; - priv_data->map = dev_get_regmap(dev->parent, NULL); - if (!priv_data->map) { - dev_err(dev, "%s: failed to get regmap\n", __func__); - ret = -EINVAL; - goto err_regmap; - } - - pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL); - if (!pindesc) { - ret = -ENOMEM; - goto err_pinsec_alloc; - } - - pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL); - if (!pads) { - ret = -ENOMEM; - goto err_pads_alloc; - } - - pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL); - if (!pctrldesc) { - ret = -ENOMEM; - goto err_pinctrl_alloc; - } - - pctrldesc->pctlops = &wcd_pinctrl_ops; - pctrldesc->confops = &wcd_pinconf_ops; - pctrldesc->owner = THIS_MODULE; - pctrldesc->name = dev_name(dev); - pctrldesc->pins = pindesc; - pctrldesc->npins = npins; - - name = devm_kcalloc(dev, npins, sizeof(char *), GFP_KERNEL); - if (!name) { - ret = -ENOMEM; - goto err_name_alloc; - } - for (i = 0; i < npins; i++, pindesc++) { - name[i] = devm_kzalloc(dev, sizeof(char) * WCD_GPIO_STRING_LEN, - GFP_KERNEL); - if (!name[i]) { - ret = -ENOMEM; - goto err_pin; - } - pad = &pads[i]; - pindesc->drv_data = pad; - pindesc->number = i; - snprintf(name[i], (WCD_GPIO_STRING_LEN - 1), "gpio%d", (i+1)); - pindesc->name = name[i]; - pad->offset = i; - pad->is_valid = true; - } - - priv_data->chip = wcd_gpio_chip; - priv_data->chip.parent = dev; - priv_data->chip.base = -1; - priv_data->chip.ngpio = npins; - priv_data->chip.label = dev_name(dev); - priv_data->chip.of_gpio_n_cells = 2; - priv_data->chip.can_sleep = false; - - priv_data->ctrl = devm_pinctrl_register(dev, pctrldesc, priv_data); - if (IS_ERR(priv_data->ctrl)) { - dev_err(dev, "%s: failed to register to pinctrl\n", __func__); - ret = PTR_ERR(priv_data->ctrl); - goto err_pin; - } - - ret = gpiochip_add_data(&priv_data->chip, priv_data); - if (ret) { - dev_err(dev, "%s: can't add gpio chip\n", __func__); - goto err_pin; - } - - ret = gpiochip_add_pin_range(&priv_data->chip, dev_name(dev), 0, 0, - npins); - if (ret) { - dev_err(dev, "%s: failed to add pin range\n", __func__); - goto err_range; - } - platform_set_drvdata(pdev, priv_data); - - return 0; - -err_range: - gpiochip_remove(&priv_data->chip); -err_pin: - for (j = 0; j < i; j++) - devm_kfree(dev, name[j]); - devm_kfree(dev, name); -err_name_alloc: - devm_kfree(dev, pctrldesc); -err_pinctrl_alloc: - devm_kfree(dev, pads); -err_pads_alloc: - devm_kfree(dev, pindesc); -err_pinsec_alloc: -err_regmap: - devm_kfree(dev, priv_data); -err_priv_alloc: - return ret; -} - -static int wcd_pinctrl_remove(struct platform_device *pdev) -{ - struct wcd_gpio_priv *priv_data = platform_get_drvdata(pdev); - - gpiochip_remove(&priv_data->chip); - - return 0; -} - -static const struct of_device_id wcd_pinctrl_of_match[] = { - { .compatible = "qcom,wcd-pinctrl" }, - { }, -}; - -MODULE_DEVICE_TABLE(of, wcd_pinctrl_of_match); - -static struct platform_driver wcd_pinctrl_driver = { - .driver = { - .name = "qcom-wcd-pinctrl", - .of_match_table = wcd_pinctrl_of_match, - }, - .probe = wcd_pinctrl_probe, - .remove = wcd_pinctrl_remove, -}; - -module_platform_driver(wcd_pinctrl_driver); - -MODULE_DESCRIPTION("Qualcomm Technologies, Inc WCD GPIO pin control driver"); -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/soc/regmap-swr.c b/techpack/audio/soc/regmap-swr.c deleted file mode 100644 index ba092a2aaa70..000000000000 --- a/techpack/audio/soc/regmap-swr.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - - -static int regmap_swr_gather_write(void *context, - const void *reg, size_t reg_size, - const void *val, size_t val_len) -{ - struct device *dev = context; - struct swr_device *swr = to_swr_device(dev); - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - size_t val_bytes; - int i, ret = 0; - u16 reg_addr = 0; - u8 *value; - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - addr_bytes = map->format.reg_bytes; - if (swr == NULL) { - dev_err(dev, "%s: swr device is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != addr_bytes) { - dev_err(dev, "%s: reg size %zd bytes not supported\n", - __func__, reg_size); - return -EINVAL; - } - reg_addr = *(u16 *)reg; - val_bytes = map->format.val_bytes; - /* val_len = val_bytes * val_count */ - for (i = 0; i < (val_len / val_bytes); i++) { - value = (u8 *)val + (val_bytes * i); - ret = swr_write(swr, swr->dev_num, (reg_addr + i), value); - if (ret < 0) { - dev_err(dev, "%s: write reg 0x%x failed, err %d\n", - __func__, (reg_addr + i), ret); - break; - } - } - return ret; -} - -static int regmap_swr_raw_multi_reg_write(void *context, const void *data, - size_t count) -{ - struct device *dev = context; - struct swr_device *swr = to_swr_device(dev); - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - size_t val_bytes; - size_t pad_bytes; - size_t num_regs; - int i = 0; - int ret = 0; - u16 *reg; - u8 *val; - u8 *buf; - - if (swr == NULL) { - dev_err(dev, "%s: swr device is NULL\n", __func__); - return -EINVAL; - } - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - - addr_bytes = map->format.reg_bytes; - val_bytes = map->format.val_bytes; - pad_bytes = map->format.pad_bytes; - - if (addr_bytes + val_bytes + pad_bytes == 0) { - dev_err(dev, "%s: sum of addr, value and pad is 0\n", __func__); - return -EINVAL; - } - num_regs = count / (addr_bytes + val_bytes + pad_bytes); - - reg = kcalloc(num_regs, sizeof(u16), GFP_KERNEL); - if (!reg) - return -ENOMEM; - - val = kcalloc(num_regs, sizeof(u8), GFP_KERNEL); - if (!val) { - ret = -ENOMEM; - goto mem_fail; - } - - buf = (u8 *)data; - for (i = 0; i < num_regs; i++) { - reg[i] = *(u16 *)buf; - buf += (map->format.reg_bytes + map->format.pad_bytes); - val[i] = *buf; - buf += map->format.val_bytes; - } - ret = swr_bulk_write(swr, swr->dev_num, reg, val, num_regs); - if (ret) - dev_err(dev, "%s: multi reg write failed\n", __func__); - - kfree(val); -mem_fail: - kfree(reg); - return ret; -} - -static int regmap_swr_write(void *context, const void *data, size_t count) -{ - struct device *dev = context; - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - size_t val_bytes; - size_t pad_bytes; - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - addr_bytes = map->format.reg_bytes; - val_bytes = map->format.val_bytes; - pad_bytes = map->format.pad_bytes; - - WARN_ON(count < addr_bytes); - - if (count > (addr_bytes + val_bytes + pad_bytes)) - return regmap_swr_raw_multi_reg_write(context, data, count); - else - return regmap_swr_gather_write(context, data, addr_bytes, - (data + addr_bytes), - (count - addr_bytes)); -} - -static int regmap_swr_read(void *context, - const void *reg, size_t reg_size, - void *val, size_t val_size) -{ - struct device *dev = context; - struct swr_device *swr = to_swr_device(dev); - struct regmap *map = dev_get_regmap(dev, NULL); - size_t addr_bytes; - int ret = 0; - u16 reg_addr = 0; - - if (map == NULL) { - dev_err(dev, "%s: regmap is NULL\n", __func__); - return -EINVAL; - } - addr_bytes = map->format.reg_bytes; - if (swr == NULL) { - dev_err(dev, "%s: swr is NULL\n", __func__); - return -EINVAL; - } - if (reg_size != addr_bytes) { - dev_err(dev, "%s: register size %zd bytes not supported\n", - __func__, reg_size); - return -EINVAL; - } - reg_addr = *(u16 *)reg; - ret = swr_read(swr, swr->dev_num, reg_addr, val, val_size); - if (ret < 0) - dev_err(dev, "%s: codec reg 0x%x read failed %d\n", - __func__, reg_addr, ret); - return ret; -} - -static struct regmap_bus regmap_swr = { - .write = regmap_swr_write, - .gather_write = regmap_swr_gather_write, - .read = regmap_swr_read, - .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, -}; - -struct regmap *__regmap_init_swr(struct swr_device *swr, - const struct regmap_config *config, - struct lock_class_key *lock_key, - const char *lock_name) -{ - return __regmap_init(&swr->dev, ®map_swr, &swr->dev, config, - lock_key, lock_name); -} -EXPORT_SYMBOL(__regmap_init_swr); - -struct regmap *__devm_regmap_init_swr(struct swr_device *swr, - const struct regmap_config *config, - struct lock_class_key *lock_key, - const char *lock_name) -{ - return __devm_regmap_init(&swr->dev, ®map_swr, &swr->dev, config, - lock_key, lock_name); -} -EXPORT_SYMBOL(__devm_regmap_init_swr); - -MODULE_LICENSE("GPL v2"); diff --git a/techpack/audio/soc/snd_event.c b/techpack/audio/soc/snd_event.c deleted file mode 100644 index f8bffb81c2e4..000000000000 --- a/techpack/audio/soc/snd_event.c +++ /dev/null @@ -1,494 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - */ - -#include -#include -#include -#include -#include - -struct snd_event_client { - struct list_head node; - - struct device *dev; - const struct snd_event_ops *ops; - void *data; - - bool attached; - bool state; -}; - -struct snd_event_client_array { - struct device *dev; - struct snd_event_client *clnt; - void *data; - int (*compare)(struct device *, void *); -}; - -struct snd_event_clients { - size_t num_clients; - struct snd_event_client_array *cl_arr; -}; - -struct snd_master { - struct device *dev; - const struct snd_event_ops *ops; - void *data; - - bool state; - bool fwk_state; - bool clients_found; - struct snd_event_clients *clients; -}; - -static DEFINE_MUTEX(snd_event_mutex); -static LIST_HEAD(snd_event_client_list); -static struct snd_master *master; - -static struct snd_event_client *find_snd_event_client(struct device *dev) -{ - struct snd_event_client *c; - - list_for_each_entry(c, &snd_event_client_list, node) - if ((c->dev == dev) && c->ops) - return c; - - return NULL; -} - -static int check_and_update_fwk_state(void) -{ - bool new_fwk_state = true; - struct snd_event_client *c; - int ret = 0; - int i = 0; - - for (i = 0; i < master->clients->num_clients; i++) { - c = master->clients->cl_arr[i].clnt; - new_fwk_state &= c->state; - } - new_fwk_state &= master->state; - - if (master->fwk_state ^ new_fwk_state) { - if (new_fwk_state) { - for (i = 0; i < master->clients->num_clients; i++) { - c = master->clients->cl_arr[i].clnt; - if (c->ops->enable) { - ret = c->ops->enable(c->dev, c->data); - if (ret) { - dev_err(c->dev, - "%s: enable failed\n", - __func__); - goto dev_en_failed; - } - } - } - if (master->ops->enable) { - ret = master->ops->enable(master->dev, - master->data); - if (ret) { - dev_err(master->dev, - "%s: enable failed\n", - __func__); - goto mstr_en_failed; - } - } - } else { - if (master->ops->disable) - master->ops->disable(master->dev, - master->data); - for (i = 0; i < master->clients->num_clients; i++) { - c = master->clients->cl_arr[i].clnt; - if (c->ops->disable) - c->ops->disable(c->dev, c->data); - } - } - master->fwk_state = new_fwk_state; - } - goto exit; - -mstr_en_failed: - i = master->clients->num_clients; -dev_en_failed: - for (; i > 0; i--) { - c = master->clients->cl_arr[i - 1].clnt; - if (c->ops->disable) - c->ops->disable(c->dev, c->data); - } -exit: - return ret; -} - -static int snd_event_find_clients(struct snd_master *master) -{ - struct snd_event_clients *clients = master->clients; - int i = 0; - int ret = 0; - - for (i = 0; i < clients->num_clients; i++) { - struct snd_event_client_array *c_arr = &clients->cl_arr[i]; - struct snd_event_client *c; - - if (c_arr->dev) { - pr_err("%s: client already present dev=%pK\n", - __func__, c_arr->dev); - continue; - } - - list_for_each_entry(c, &snd_event_client_list, node) { - if (c->attached) - continue; - - if (c_arr->compare(c->dev, c_arr->data)) { - dev_dbg(master->dev, - "%s: found client, dev=%pK\n", - __func__, c->dev); - c_arr->dev = c->dev; - c_arr->clnt = c; - c->attached = true; - break; - } - } - if (!c_arr->dev) { - dev_dbg(master->dev, - "%s: failed to find some client\n", - __func__); - ret = -ENXIO; - break; - } - } - - return ret; -} - -/* - * snd_event_client_register - Register a client with the SND event FW - * - * @dev: Pointer to the "struct device" associated with the client - * @snd_ev_ops: Pointer to the snd_event_ops struct for the client containing - * callback functions - * @data: Pointer to any additional data that the caller wants to get back - * with callback functions - * - * Returns 0 on success or error on failure. - */ -int snd_event_client_register(struct device *dev, - const struct snd_event_ops *snd_ev_ops, - void *data) -{ - struct snd_event_client *c; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - c = kzalloc(sizeof(*c), GFP_KERNEL); - if (!c) - return -ENOMEM; - - c->dev = dev; - c->ops = snd_ev_ops; - c->data = data; - - dev_dbg(dev, "%s: adding client to SND event FW (ops %pK)\n", - __func__, snd_ev_ops); - - mutex_lock(&snd_event_mutex); - list_add_tail(&c->node, &snd_event_client_list); - - if (master && !master->clients_found) { - if (snd_event_find_clients(master)) { - dev_dbg(dev, "%s: Failed to find all clients\n", - __func__); - goto exit; - } - master->clients_found = true; - } - -exit: - mutex_unlock(&snd_event_mutex); - return 0; -} -EXPORT_SYMBOL(snd_event_client_register); - -/* - * snd_event_client_deregister - Remove a client from the SND event FW - * - * @dev: Pointer to the "struct device" associated with the client - * - * Returns 0 on success or error on failure. - */ -int snd_event_client_deregister(struct device *dev) -{ - struct snd_event_client *c; - int ret = 0; - int i = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (list_empty(&snd_event_client_list)) { - dev_dbg(dev, "%s: No SND client registered\n", __func__); - ret = -ENODEV; - goto exit; - } - - c = find_snd_event_client(dev); - if (!c || (c->dev != dev)) { - dev_dbg(dev, "%s: No matching snd dev found\n", __func__); - ret = -ENODEV; - goto exit; - } - - c->state = false; - - if (master && master->clients_found) { - struct snd_event_client *d; - bool dev_found = false; - - for (i = 0; i < master->clients->num_clients; i++) { - d = master->clients->cl_arr[i].clnt; - if (c->dev == d->dev) { - dev_found = true; - break; - } - } - if (dev_found) { - ret = check_and_update_fwk_state(); - master->clients_found = false; - } - } - - list_del(&c->node); - kfree(c); -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_client_deregister); - -/* - * snd_event_mstr_add_client - Add a client to the master's list of clients - * - * @snd_clients: list of clients associated with this master - * @compare: Pointer to the compare callback function that master will use to - * confirm the clients - * @data: Address to any additional data that the master wants to get back with - * compare callback functions - */ -void snd_event_mstr_add_client(struct snd_event_clients **snd_clients, - int (*compare)(struct device *, void *), - void *data) -{ - struct snd_event_clients *client = *snd_clients; - - if (IS_ERR(client)) { - pr_err("%s: snd_clients is invalid\n", __func__); - return; - } - - if (!client) { - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) { - *snd_clients = ERR_PTR(-ENOMEM); - return; - } - client->cl_arr = kzalloc(sizeof(struct snd_event_client_array), - GFP_KERNEL); - if (!client->cl_arr) { - *snd_clients = ERR_PTR(-ENOMEM); - return; - } - *snd_clients = client; - } else { - struct snd_event_client_array *new; - - new = krealloc(client->cl_arr, - (client->num_clients + 1) * sizeof(*new), - GFP_KERNEL | __GFP_ZERO); - if (!new) { - *snd_clients = ERR_PTR(-ENOMEM); - return; - } - client->cl_arr = new; - } - - client->cl_arr[client->num_clients].dev = NULL; - client->cl_arr[client->num_clients].data = data; - client->cl_arr[client->num_clients].compare = compare; - client->num_clients++; -} -EXPORT_SYMBOL(snd_event_mstr_add_client); - -/* - * snd_event_master_register - Register a master with the SND event FW - * - * @dev: Pointer to the "struct device" associated with the master - * @ops: Pointer to the snd_event_ops struct for the master containing - * callback functions - * @clients: List of clients for the master - * @data: Pointer to any additional data that the caller wants to get back - * with callback functions - * - * Returns 0 on success or error on failure. - * - * Prerequisite: - * clients list must not be empty. - * All clients for the master must have to be registered by calling - * snd_event_mstr_add_client() before calling this API to register a - * master with SND event fwk. - */ -int snd_event_master_register(struct device *dev, - const struct snd_event_ops *ops, - struct snd_event_clients *clients, - void *data) -{ - struct snd_master *new_master; - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (master) { - dev_err(dev, "%s: master already allocated with %pK\n", - __func__, master->dev); - ret = -EALREADY; - goto exit; - } - mutex_unlock(&snd_event_mutex); - - if (!clients || IS_ERR(clients)) { - dev_err(dev, "%s: Invalid clients ptr\n", __func__); - return -EINVAL; - } - - new_master = kzalloc(sizeof(*new_master), GFP_KERNEL); - if (!new_master) - return -ENOMEM; - - new_master->dev = dev; - new_master->ops = ops; - new_master->data = data; - new_master->clients = clients; - - dev_dbg(dev, "adding master to SND event FW (ops %pK)\n", ops); - - mutex_lock(&snd_event_mutex); - - master = new_master; - - ret = snd_event_find_clients(master); - if (ret) { - dev_dbg(dev, "%s: Failed to find all clients\n", __func__); - ret = 0; - goto exit; - } - master->clients_found = true; - -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_master_register); - -/* - * snd_event_master_deregister - Remove a master from the SND event FW - * - * @dev: Pointer to the "struct device" associated with the master - * - * Returns 0 on success or error on failure. - */ -int snd_event_master_deregister(struct device *dev) -{ - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (!master) { - dev_dbg(dev, "%s: No master found\n", __func__); - ret = -ENODEV; - goto exit; - } - - if (master->dev != dev) { - dev_dbg(dev, "%s: device is not a Master\n", __func__); - ret = -ENXIO; - goto exit; - } - - master->state = false; - - if (master && master->clients_found) - ret = check_and_update_fwk_state(); - - kfree(master->clients->cl_arr); - kfree(master->clients); - kfree(master); - master = NULL; -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_master_deregister); - -/* - * snd_event_notify - Update the state of the Master/client in the SND event FW - * - * @dev: Pointer to the "struct device" associated with the master/client - * @state: UP/DOWN state of the caller (master/client) - * - * Returns 0 on success or error on failure. - */ -int snd_event_notify(struct device *dev, unsigned int state) -{ - struct snd_event_client *c; - int ret = 0; - - if (!dev) { - pr_err("%s: dev is NULL\n", __func__); - return -EINVAL; - } - - mutex_lock(&snd_event_mutex); - if (list_empty(&snd_event_client_list) && !master) { - dev_err(dev, "%s: No device registered\n", __func__); - ret = -ENODEV; - goto exit; - } - - c = find_snd_event_client(dev); - if (!c && (!master || (master->dev != dev))) { - dev_err(dev, "%s: No snd dev entry found\n", __func__); - ret = -ENXIO; - goto exit; - } - - if (c) - c->state = !!state; - else - master->state = !!state; - - if (master && master->clients_found) - ret = check_and_update_fwk_state(); - -exit: - mutex_unlock(&snd_event_mutex); - return ret; -} -EXPORT_SYMBOL(snd_event_notify); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SND event module"); diff --git a/techpack/audio/soc/soundwire.c b/techpack/audio/soc/soundwire.c deleted file mode 100644 index fec288b4d753..000000000000 --- a/techpack/audio/soc/soundwire.c +++ /dev/null @@ -1,1130 +0,0 @@ -/* Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct boardinfo { - struct list_head list; - struct swr_boardinfo board_info; -}; - -static LIST_HEAD(board_list); -static LIST_HEAD(swr_master_list); -static DEFINE_MUTEX(board_lock); -static DEFINE_IDR(master_idr); -static DEFINE_MUTEX(swr_lock); - -static struct device_type swr_dev_type; - -#define SOUNDWIRE_NAME_SIZE 32 - -static void swr_master_put(struct swr_master *master) -{ - if (master) - put_device(&master->dev); -} - -static struct swr_master *swr_master_get(struct swr_master *master) -{ - if (!master || !get_device(&master->dev)) - return NULL; - return master; -} - -static void swr_dev_release(struct device *dev) -{ - struct swr_device *swr_dev = to_swr_device(dev); - struct swr_master *master; - - if (!swr_dev) - return; - master = swr_dev->master; - if (!master) - return; - mutex_lock(&master->mlock); - list_del_init(&swr_dev->dev_list); - mutex_unlock(&master->mlock); - swr_master_put(swr_dev->master); - kfree(swr_dev); -} - -/** - * swr_remove_device - remove a soundwire device - * @swr_dev: soundwire device to remove - * - * Remove a soundwire device. Go through the soundwire - * device list that master has and remove swr_dev from - * it. - */ -void swr_remove_device(struct swr_device *swr_dev) -{ - struct swr_device *swr_dev_loop, *safe; - - /* - * master still has reference to all nodes and deletes - * at platform_unregister, so need to init the deleted - * entry - */ - list_for_each_entry_safe(swr_dev_loop, safe, - &swr_dev->master->devices, - dev_list) { - if (swr_dev == swr_dev_loop) - list_del_init(&swr_dev_loop->dev_list); - } -} -EXPORT_SYMBOL(swr_remove_device); - -/** - * swr_new_device - instantiate a new soundwire device - * @master: Controller to which device is connected - * @info: Describes the soundwire device - * Context: can sleep - * - * Create a soundwire device. Binding is handled through driver model - * probe/remove methods. A driver may be bound to this device when - * the function gets returned. - * - * Returns a soundwire new device or NULL - */ -struct swr_device *swr_new_device(struct swr_master *master, - struct swr_boardinfo const *info) -{ - int result; - struct swr_device *swr; - - if (!master || !swr_master_get(master)) { - pr_err("%s: master is NULL\n", __func__); - return NULL; - } - - swr = kzalloc(sizeof(*swr), GFP_KERNEL); - if (!swr) { - put_device(&master->dev); - return NULL; - } - swr->master = master; - swr->addr = info->addr; - strlcpy(swr->name, info->name, sizeof(swr->name)); - swr->dev.type = &swr_dev_type; - swr->dev.parent = &master->dev; - swr->dev.bus = &soundwire_type; - swr->dev.release = swr_dev_release; - swr->dev.of_node = info->of_node; - mutex_lock(&master->mlock); - list_add_tail(&swr->dev_list, &master->devices); - mutex_unlock(&master->mlock); - - dev_set_name(&swr->dev, "%s.%lx", swr->name, swr->addr); - result = device_register(&swr->dev); - if (result) { - dev_err(&master->dev, "device [%s] register failed err %d\n", - swr->name, result); - goto err_out; - } - dev_dbg(&master->dev, "Device [%s] registered with bus id %s\n", - swr->name, dev_name(&swr->dev)); - return swr; - -err_out: - dev_dbg(&master->dev, "Failed to register swr device %s at 0x%lx %d\n", - swr->name, swr->addr, result); - swr_master_put(master); - kfree(swr); - return NULL; -} -EXPORT_SYMBOL(swr_new_device); - -/** - * of_register_swr_devices - register child devices on to the soundwire bus - * @master: pointer to soundwire master device - * - * Registers a soundwire device for each child node of master node which has - * a "swr-devid" property - * - */ -int of_register_swr_devices(struct swr_master *master) -{ - struct swr_device *swr; - struct device_node *node; - - if (!master->dev.of_node) - return -EINVAL; - - for_each_available_child_of_node(master->dev.of_node, node) { - struct swr_boardinfo info = {}; - u64 addr; - - dev_dbg(&master->dev, "of_swr:register %s\n", node->full_name); - - if (of_modalias_node(node, info.name, sizeof(info.name)) < 0) { - dev_err(&master->dev, "of_swr:modalias failure %s\n", - node->full_name); - continue; - } - if (of_property_read_u64(node, "reg", &addr)) { - dev_err(&master->dev, "of_swr:invalid reg %s\n", - node->full_name); - continue; - } - info.addr = addr; - info.of_node = of_node_get(node); - master->num_dev++; - swr = swr_new_device(master, &info); - if (!swr) { - dev_err(&master->dev, "of_swr: Register failed %s\n", - node->full_name); - of_node_put(node); - master->num_dev--; - continue; - } - } - return 0; -} -EXPORT_SYMBOL(of_register_swr_devices); - -/** - * swr_port_response - response from master to free the completed transaction - * @mstr: pointer to soundwire master device - * @tid: transaction id that indicates transaction to be freed. - * - * Master calls this function to free the compeleted transaction memory - */ -void swr_port_response(struct swr_master *mstr, u8 tid) -{ - struct swr_params *txn; - - txn = mstr->port_txn[tid]; - - if (txn == NULL) { - dev_err(&mstr->dev, "%s: transaction is already NULL\n", - __func__); - return; - } - mstr->port_txn[tid] = NULL; - kfree(txn); -} -EXPORT_SYMBOL(swr_port_response); - -/** - * swr_remove_from_group - remove soundwire slave devices from group - * @dev: pointer to the soundwire slave device - * dev_num: device number of the soundwire slave device - * - * Returns error code for failure and 0 for success - */ -int swr_remove_from_group(struct swr_device *dev, u8 dev_num) -{ - struct swr_master *master; - - if (!dev) - return -ENODEV; - - master = dev->master; - if (!master) - return -EINVAL; - - if (!dev->group_id) - return 0; - - if (master->gr_sid != dev_num) - return 0; - - if (master->remove_from_group && master->remove_from_group(master)) - dev_dbg(&master->dev, "%s: falling back to GROUP_NONE\n", - __func__); - - return 0; -} -EXPORT_SYMBOL(swr_remove_from_group); - -/** - * swr_slvdev_datapath_control - Enables/Disables soundwire slave device - * data path - * @dev: pointer to soundwire slave device - * @dev_num: device number of the soundwire slave device - * - * Returns error code for failure and 0 for success - */ -int swr_slvdev_datapath_control(struct swr_device *dev, u8 dev_num, - bool enable) -{ - struct swr_master *master; - int ret = 0; - - if (!dev) - return -ENODEV; - - master = dev->master; - if (!master) - return -EINVAL; - - if (dev->group_id) { - /* Broadcast */ - if (master->gr_sid != dev_num) { - if (!master->gr_sid) - master->gr_sid = dev_num; - else - return 0; - } - } - - if (master->slvdev_datapath_control) - ret = master->slvdev_datapath_control(master, enable); - - return ret; -} -EXPORT_SYMBOL(swr_slvdev_datapath_control); - -/** - * swr_connect_port - enable soundwire slave port(s) - * @dev: pointer to soundwire slave device - * @port_id: logical port id(s) of soundwire slave device - * @num_port: number of slave device ports need to be enabled - * @ch_mask: channels for each port that needs to be enabled - * @ch_rate: rate at which each port/channels operate - * @num_ch: number of channels for each port - * - * soundwire slave device call swr_connect_port API to enable all/some of - * its ports and corresponding channels and channel rate. This API will - * call master connect_port callback function to calculate frame structure - * and enable master and slave ports - */ -int swr_connect_port(struct swr_device *dev, u8 *port_id, u8 num_port, - u8 *ch_mask, u32 *ch_rate, u8 *num_ch, u8 *port_type) -{ - u8 i = 0; - int ret = 0; - struct swr_params *txn = NULL; - struct swr_params **temp_txn = NULL; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - if (num_port > SWR_MAX_DEV_PORT_NUM) { - dev_err(&master->dev, "%s: num_port %d exceeds max port %d\n", - __func__, num_port, SWR_MAX_DEV_PORT_NUM); - return -EINVAL; - } - - /* - * create "txn" to accommodate ports enablement of - * different slave devices calling swr_connect_port at the - * same time. Once master process the txn data, it calls - * swr_port_response() to free the transaction. Maximum - * of 256 transactions can be allocated. - */ - txn = kzalloc(sizeof(struct swr_params), GFP_KERNEL); - if (!txn) - return -ENOMEM; - - mutex_lock(&master->mlock); - for (i = 0; i < master->last_tid; i++) { - if (master->port_txn[i] == NULL) - break; - } - if (i >= master->last_tid) { - if (master->last_tid == 255) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Max tid reached\n", - __func__); - return -ENOMEM; - } - temp_txn = krealloc(master->port_txn, - (i + 1) * sizeof(struct swr_params *), - GFP_KERNEL); - if (!temp_txn) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Not able to allocate\n" - "master port transaction memory\n", - __func__); - return -ENOMEM; - } - master->port_txn = temp_txn; - master->last_tid++; - } - master->port_txn[i] = txn; - mutex_unlock(&master->mlock); - txn->tid = i; - - txn->dev_num = dev->dev_num; - txn->num_port = num_port; - for (i = 0; i < num_port; i++) { - txn->port_id[i] = port_id[i]; - txn->num_ch[i] = num_ch[i]; - txn->ch_rate[i] = ch_rate[i]; - txn->ch_en[i] = ch_mask[i]; - txn->port_type[i] = port_type[i]; - } - ret = master->connect_port(master, txn); - return ret; -} -EXPORT_SYMBOL(swr_connect_port); - -/** - * swr_disconnect_port - disable soundwire slave port(s) - * @dev: pointer to soundwire slave device - * @port_id: logical port id(s) of soundwire slave device - * @num_port: number of slave device ports need to be disabled - * - * soundwire slave device call swr_disconnect_port API to disable all/some of - * its ports. This API will call master disconnect_port callback function to - * disable master and slave port and (re)configure frame structure - */ -int swr_disconnect_port(struct swr_device *dev, u8 *port_id, u8 num_port, - u8 *ch_mask, u8 *port_type) -{ - u8 i = 0; - int ret; - struct swr_params *txn = NULL; - struct swr_params **temp_txn = NULL; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - - if (num_port > SWR_MAX_DEV_PORT_NUM) { - dev_err(&master->dev, "%s: num_port %d exceeds max port %d\n", - __func__, num_port, SWR_MAX_DEV_PORT_NUM); - return -EINVAL; - } - - txn = kzalloc(sizeof(struct swr_params), GFP_KERNEL); - if (!txn) - return -ENOMEM; - - mutex_lock(&master->mlock); - for (i = 0; i < master->last_tid; i++) { - if (master->port_txn[i] == NULL) - break; - } - if (i >= master->last_tid) { - if (master->last_tid == 255) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Max tid reached\n", - __func__); - return -ENOMEM; - } - temp_txn = krealloc(master->port_txn, - (i + 1) * sizeof(struct swr_params *), - GFP_KERNEL); - if (!temp_txn) { - mutex_unlock(&master->mlock); - kfree(txn); - dev_err(&master->dev, "%s Not able to allocate\n" - "master port transaction memory\n", - __func__); - return -ENOMEM; - } - master->port_txn = temp_txn; - master->last_tid++; - } - master->port_txn[i] = txn; - mutex_unlock(&master->mlock); - txn->tid = i; - - txn->dev_num = dev->dev_num; - txn->num_port = num_port; - for (i = 0; i < num_port; i++) { - txn->port_id[i] = port_id[i]; - txn->ch_en[i] = ch_mask[i]; - txn->port_type[i] = port_type[i]; - } - ret = master->disconnect_port(master, txn); - return ret; -} -EXPORT_SYMBOL(swr_disconnect_port); - -/** - * swr_get_logical_dev_num - Get soundwire slave logical device number - * @dev: pointer to soundwire slave device - * @dev_id: physical device id of soundwire slave device - * @dev_num: pointer to logical device num of soundwire slave device - * - * This API will get the logical device number of soundwire slave device - */ -int swr_get_logical_dev_num(struct swr_device *dev, u64 dev_id, - u8 *dev_num) -{ - int ret = 0; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&master->mlock); - ret = master->get_logical_dev_num(master, dev_id, dev_num); - if (ret) { - pr_err("%s: Error %d to get logical addr for device %llx\n", - __func__, ret, dev_id); - } - mutex_unlock(&master->mlock); - return ret; -} -EXPORT_SYMBOL(swr_get_logical_dev_num); - -/** - * swr_device_wakeup_vote - Wakeup master and slave devices from clock stop - * @dev: pointer to soundwire slave device - * - * This API will wake up soundwire master and slave device(s) from - * clock stop. - */ -int swr_device_wakeup_vote(struct swr_device *dev) -{ - int ret = 0; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&master->mlock); - if (master->device_wakeup_vote) - master->device_wakeup_vote(master); - else - ret = -EINVAL; - mutex_unlock(&master->mlock); - - return ret; -} -EXPORT_SYMBOL(swr_device_wakeup_vote); - -/** - * swr_device_wakeup_unvote - Unvote Wakeup so that master and slave - * devices can go back to clock stop - * @dev: pointer to soundwire slave device - * - * This API will remove vote for wakeup so that soundwire master and - * slave device(s) can go back to clock stop. - */ -int swr_device_wakeup_unvote(struct swr_device *dev) -{ - int ret = 0; - struct swr_master *master = dev->master; - - if (!master) { - pr_err("%s: Master is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&master->mlock); - if (master->device_wakeup_unvote) - master->device_wakeup_unvote(master); - else - ret = -EINVAL; - mutex_unlock(&master->mlock); - - return ret; -} -EXPORT_SYMBOL(swr_device_wakeup_unvote); - -/** - * swr_read - read soundwire slave device registers - * @dev: pointer to soundwire slave device - * @dev_num: logical device num of soundwire slave device - * @reg_addr: base register address that needs to be read - * @buf: pointer to store the values of registers from base address - * @len: length of the buffer - * - * This API will read the value of the register address from - * soundwire slave device - */ -int swr_read(struct swr_device *dev, u8 dev_num, u16 reg_addr, - void *buf, u32 len) -{ - struct swr_master *master = dev->master; - - if (!master) - return -EINVAL; - return master->read(master, dev_num, reg_addr, buf, len); -} -EXPORT_SYMBOL(swr_read); - -/** - * swr_bulk_write - write soundwire slave device registers - * @dev: pointer to soundwire slave device - * @dev_num: logical device num of soundwire slave device - * @reg_addr: register address of soundwire slave device - * @buf: contains value of register address - * @len: indicates number of registers - * - * This API will write the value of the register address to - * soundwire slave device - */ -int swr_bulk_write(struct swr_device *dev, u8 dev_num, void *reg, - const void *buf, size_t len) -{ - struct swr_master *master; - - if (!dev || !dev->master) - return -EINVAL; - - master = dev->master; - if (dev->group_id) { - if (master->gr_sid != dev_num) { - if (!master->gr_sid) - master->gr_sid = dev_num; - else - return 0; - } - dev_num = dev->group_id; - } - if (master->bulk_write) - return master->bulk_write(master, dev_num, reg, buf, len); - - return -EOPNOTSUPP; -} -EXPORT_SYMBOL(swr_bulk_write); - -/** - * swr_write - write soundwire slave device registers - * @dev: pointer to soundwire slave device - * @dev_num: logical device num of soundwire slave device - * @reg_addr: register address of soundwire slave device - * @buf: contains value of register address - * - * This API will write the value of the register address to - * soundwire slave device - */ -int swr_write(struct swr_device *dev, u8 dev_num, u16 reg_addr, - const void *buf) -{ - struct swr_master *master = dev->master; - - if (!master) - return -EINVAL; - - if (dev->group_id) { - if (master->gr_sid != dev_num) { - if (!master->gr_sid) - master->gr_sid = dev_num; - else - return 0; - } - dev_num = dev->group_id; - } - return master->write(master, dev_num, reg_addr, buf); -} -EXPORT_SYMBOL(swr_write); - -/** - * swr_device_up - Function to bringup the soundwire slave device - * @swr_dev: pointer to soundwire slave device - * Context: can sleep - * - * This API will be called by soundwire master to bringup the slave - * device. - */ -int swr_device_up(struct swr_device *swr_dev) -{ - struct device *dev; - const struct swr_driver *sdrv; - - if (!swr_dev) - return -EINVAL; - - dev = &swr_dev->dev; - sdrv = to_swr_driver(dev->driver); - if (!sdrv) - return 0; - - if (sdrv->device_up) - return sdrv->device_up(to_swr_device(dev)); - - return -ENODEV; -} -EXPORT_SYMBOL(swr_device_up); - -/** - * swr_device_down - Function to call soundwire slave device down - * @swr_dev: pointer to soundwire slave device - * Context: can sleep - * - * This API will be called by soundwire master to put slave device in - * shutdown state. - */ -int swr_device_down(struct swr_device *swr_dev) -{ - struct device *dev; - const struct swr_driver *sdrv; - - if (!swr_dev) - return -EINVAL; - - dev = &swr_dev->dev; - sdrv = to_swr_driver(dev->driver); - if (!sdrv) - return 0; - - if (sdrv->device_down) - return sdrv->device_down(to_swr_device(dev)); - - return -ENODEV; -} -EXPORT_SYMBOL(swr_device_down); - -/** - * swr_reset_device - reset soundwire slave device - * @swr_dev: pointer to soundwire slave device - * Context: can sleep - * - * This API will be called by soundwire master to reset the slave - * device when the slave device is not responding or in undefined - * state - */ -int swr_reset_device(struct swr_device *swr_dev) -{ - struct device *dev; - const struct swr_driver *sdrv; - - if (!swr_dev) - return -EINVAL; - - dev = &swr_dev->dev; - sdrv = to_swr_driver(dev->driver); - if (!sdrv) - return -EINVAL; - - if (sdrv->reset_device) - return sdrv->reset_device(to_swr_device(dev)); - - return -ENODEV; -} -EXPORT_SYMBOL(swr_reset_device); - -/** - * swr_set_device_group - Assign group id to the slave devices - * @swr_dev: pointer to soundwire slave device - * @id: group id to be assigned to slave device - * Context: can sleep - * - * This API will be called either from soundwire master or slave - * device to assign group id. - */ -int swr_set_device_group(struct swr_device *swr_dev, u8 id) -{ - struct swr_master *master; - - if (!swr_dev) - return -EINVAL; - - swr_dev->group_id = id; - master = swr_dev->master; - if (!id && master) - master->gr_sid = 0; - - return 0; -} -EXPORT_SYMBOL(swr_set_device_group); - -static int swr_drv_probe(struct device *dev) -{ - const struct swr_driver *sdrv = to_swr_driver(dev->driver); - - if (!sdrv) - return -EINVAL; - - if (sdrv->probe) - return sdrv->probe(to_swr_device(dev)); - return -ENODEV; -} - -static int swr_drv_remove(struct device *dev) -{ - const struct swr_driver *sdrv = to_swr_driver(dev->driver); - - if (!sdrv) - return -EINVAL; - - if (sdrv->remove) - return sdrv->remove(to_swr_device(dev)); - return -ENODEV; -} - -static void swr_drv_shutdown(struct device *dev) -{ - const struct swr_driver *sdrv = to_swr_driver(dev->driver); - - if (!sdrv) - return; - - if (sdrv->shutdown) - sdrv->shutdown(to_swr_device(dev)); -} - -/** - * swr_driver_register - register a soundwire driver - * @drv: the driver to register - * Context: can sleep - */ -int swr_driver_register(struct swr_driver *drv) -{ - drv->driver.bus = &soundwire_type; - if (drv->probe) - drv->driver.probe = swr_drv_probe; - if (drv->remove) - drv->driver.remove = swr_drv_remove; - - if (drv->shutdown) - drv->driver.shutdown = swr_drv_shutdown; - - return driver_register(&drv->driver); -} -EXPORT_SYMBOL(swr_driver_register); - -/** - * swr_driver_unregister - unregister a soundwire driver - * @drv: the driver to unregister - */ -void swr_driver_unregister(struct swr_driver *drv) -{ - if (drv) - driver_unregister(&drv->driver); -} -EXPORT_SYMBOL(swr_driver_unregister); - -static void swr_match_ctrl_to_boardinfo(struct swr_master *master, - struct swr_boardinfo *bi) -{ - struct swr_device *swr; - - if (master->bus_num != bi->bus_num) { - dev_dbg(&master->dev, - "%s: master# %d and bi# %d does not match\n", - __func__, master->bus_num, bi->bus_num); - return; - } - - swr = swr_new_device(master, bi); - if (!swr) - dev_err(&master->dev, "can't create new device for %s\n", - bi->swr_slave->name); -} - -/** - * swr_master_add_boarddevices - Add devices registered by board info - * @master: master to which these devices are to be added to. - * - * This API is called by master when it is up and running. If devices - * on a master were registered before master, this will make sure that - * they get probed when master is up. - */ -void swr_master_add_boarddevices(struct swr_master *master) -{ - struct boardinfo *bi; - - mutex_lock(&board_lock); - list_add_tail(&master->list, &swr_master_list); - list_for_each_entry(bi, &board_list, list) - swr_match_ctrl_to_boardinfo(master, &bi->board_info); - mutex_unlock(&board_lock); -} -EXPORT_SYMBOL(swr_master_add_boarddevices); - -struct swr_device *get_matching_swr_slave_device(struct device_node *np) -{ - struct swr_device *swr = NULL; - struct swr_master *master; - bool found = false; - - mutex_lock(&board_lock); - list_for_each_entry(master, &swr_master_list, list) { - mutex_lock(&master->mlock); - list_for_each_entry(swr, &master->devices, dev_list) { - if (swr->dev.of_node == np) { - found = true; - mutex_unlock(&master->mlock); - goto exit; - } - } - mutex_unlock(&master->mlock); - } -exit: - mutex_unlock(&board_lock); - if (!found) - return NULL; - return swr; -} -EXPORT_SYMBOL(get_matching_swr_slave_device); - -static void swr_unregister_device(struct swr_device *swr) -{ - if (swr) - device_unregister(&swr->dev); -} - -static void swr_master_release(struct device *dev) -{ - /* kfree of master done at swrm_remove of device */ -} - -#define swr_master_attr_gr NULL -static struct device_type swr_master_type = { - .groups = swr_master_attr_gr, - .release = swr_master_release, -}; - -static int __unregister(struct device *dev, void *null) -{ - swr_unregister_device(to_swr_device(dev)); - return 0; -} - -/** - * swr_unregister_master - unregister soundwire master controller - * @master: the master being unregistered - * - * This API is called by master controller driver to unregister - * master controller that was registered by swr_register_master API. - */ -void swr_unregister_master(struct swr_master *master) -{ - int dummy; - struct swr_master *m_ctrl; - - mutex_lock(&swr_lock); - m_ctrl = idr_find(&master_idr, master->bus_num); - mutex_unlock(&swr_lock); - if (m_ctrl != master) - return; - - mutex_lock(&board_lock); - list_del(&master->list); - mutex_unlock(&board_lock); - - /* free bus id */ - mutex_lock(&swr_lock); - idr_remove(&master_idr, master->bus_num); - mutex_unlock(&swr_lock); - - dummy = device_for_each_child(&master->dev, NULL, __unregister); - device_unregister(&master->dev); -} -EXPORT_SYMBOL(swr_unregister_master); - -/** - * swr_register_master - register soundwire master controller - * @master: master to be registered - * - * This API will register master with the framework. master->bus_num - * is the desired number with which soundwire framework registers the - * master. - */ -int swr_register_master(struct swr_master *master) -{ - int id; - int status = 0; - - mutex_lock(&swr_lock); - id = of_alias_get_id(master->dev.of_node, "swr"); - - if (id >= 0) - master->bus_num = id; - id = idr_alloc(&master_idr, master, master->bus_num, - master->bus_num + 1, GFP_KERNEL); - mutex_unlock(&swr_lock); - if (id < 0) - return id; - - master->bus_num = id; - /* Can't register until driver model init */ - if (WARN_ON(!soundwire_type.p)) { - status = -EAGAIN; - goto done; - } - - dev_set_name(&master->dev, "swr%u", master->bus_num); - master->dev.bus = &soundwire_type; - master->dev.type = &swr_master_type; - mutex_init(&master->mlock); - status = device_register(&master->dev); - if (status < 0) - goto done; - - INIT_LIST_HEAD(&master->devices); - pr_debug("%s: SWR master registered successfully %s\n", - __func__, dev_name(&master->dev)); - return 0; - -done: - idr_remove(&master_idr, master->bus_num); - return status; -} -EXPORT_SYMBOL(swr_register_master); - -#define swr_device_attr_gr NULL -#define swr_device_uevent NULL -static struct device_type swr_dev_type = { - .groups = swr_device_attr_gr, - .uevent = swr_device_uevent, - .release = swr_dev_release, -}; - -static const struct swr_device_id *swr_match(const struct swr_device_id *id, - const struct swr_device *swr_dev) -{ - while (id->name[0]) { - if (strcmp(swr_dev->name, id->name) == 0) - return id; - id++; - } - return NULL; -} - -static int swr_device_match(struct device *dev, struct device_driver *driver) -{ - struct swr_device *swr_dev; - struct swr_driver *drv = to_swr_driver(driver); - - if (!drv) - return -EINVAL; - - if (dev->type == &swr_dev_type) { - swr_dev = to_swr_device(dev); - if (!swr_dev) - return -EINVAL; - } else { - return 0; - } - - if (drv->id_table) - return swr_match(drv->id_table, swr_dev) != NULL; - - if (driver->name) - return strcmp(swr_dev->name, driver->name) == 0; - return 0; -} -#ifdef CONFIG_PM_SLEEP -static int swr_legacy_suspend(struct device *dev, pm_message_t mesg) -{ - struct swr_device *swr_dev = NULL; - struct swr_driver *driver; - - if (dev->type == &swr_dev_type) - swr_dev = to_swr_device(dev); - - if (!swr_dev || !dev->driver) - return 0; - - driver = to_swr_driver(dev->driver); - if (!driver->suspend) - return 0; - - return driver->suspend(swr_dev, mesg); -} - -static int swr_legacy_resume(struct device *dev) -{ - struct swr_device *swr_dev = NULL; - struct swr_driver *driver; - - if (dev->type == &swr_dev_type) - swr_dev = to_swr_device(dev); - - if (!swr_dev || !dev->driver) - return 0; - - driver = to_swr_driver(dev->driver); - if (!driver->resume) - return 0; - - return driver->resume(swr_dev); -} - -static int swr_pm_suspend(struct device *dev) -{ - const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; - - if (pm) - return pm_generic_suspend(dev); - else - return swr_legacy_suspend(dev, PMSG_SUSPEND); -} - -static int swr_pm_resume(struct device *dev) -{ - const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; - - if (pm) - return pm_generic_resume(dev); - else - return swr_legacy_resume(dev); -} -#else -#define swr_pm_suspend NULL -#define swr_pm_resume NULL -#endif /*CONFIG_PM_SLEEP*/ - -static const struct dev_pm_ops soundwire_pm = { - .suspend = swr_pm_suspend, - .resume = swr_pm_resume, - SET_RUNTIME_PM_OPS( - pm_generic_suspend, - pm_generic_resume, - NULL - ) -}; - -struct device soundwire_dev = { - .init_name = "soundwire", -}; - -struct bus_type soundwire_type = { - .name = "soundwire", - .match = swr_device_match, - .pm = &soundwire_pm, -}; -EXPORT_SYMBOL(soundwire_type); - -static void __exit soundwire_exit(void) -{ - device_unregister(&soundwire_dev); - bus_unregister(&soundwire_type); -} - -static int __init soundwire_init(void) -{ - int retval; - - retval = bus_register(&soundwire_type); - if (!retval) - retval = device_register(&soundwire_dev); - - if (retval) - bus_unregister(&soundwire_type); - - return retval; -} -module_init(soundwire_init); -module_exit(soundwire_exit); - - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Soundwire module"); -MODULE_ALIAS("platform:soundwire"); diff --git a/techpack/audio/soc/swr-mstr-ctrl.c b/techpack/audio/soc/swr-mstr-ctrl.c deleted file mode 100644 index 8471813580c2..000000000000 --- a/techpack/audio/soc/swr-mstr-ctrl.c +++ /dev/null @@ -1,2752 +0,0 @@ -/* Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "swrm_registers.h" -#include "swr-mstr-ctrl.h" -#include "swrm_port_config.h" - -#define SWRM_FRAME_SYNC_SEL 4000 /* 4KHz */ -#define SWRM_SYSTEM_RESUME_TIMEOUT_MS 700 -#define SWRM_SYS_SUSPEND_WAIT 1 -#define SWR_BROADCAST_CMD_ID 0x0F -#define SWR_AUTO_SUSPEND_DELAY 3 /* delay in sec */ -#define SWR_DEV_ID_MASK 0xFFFFFFFF -#define SWR_REG_VAL_PACK(data, dev, id, reg) \ - ((reg) | ((id) << 16) | ((dev) << 20) | ((data) << 24)) - -#define SWR_INVALID_PARAM 0xFF -#define SWR_HSTOP_MAX_VAL 0xF -#define SWR_HSTART_MIN_VAL 0x0 - -#define SWRM_INTERRUPT_STATUS_MASK 0x1FDFD - -#define SWRM_ROW_48 48 -#define SWRM_ROW_50 50 -#define SWRM_ROW_64 64 -#define SWRM_COL_02 02 -#define SWRM_COL_16 16 - -/* pm runtime auto suspend timer in msecs */ -static int auto_suspend_timer = SWR_AUTO_SUSPEND_DELAY * 1000; -module_param(auto_suspend_timer, int, 0664); -MODULE_PARM_DESC(auto_suspend_timer, "timer for auto suspend"); - -enum { - SWR_NOT_PRESENT, /* Device is detached/not present on the bus */ - SWR_ATTACHED_OK, /* Device is attached */ - SWR_ALERT, /* Device alters master for any interrupts */ - SWR_RESERVED, /* Reserved */ -}; - -enum { - MASTER_ID_WSA = 1, - MASTER_ID_RX, - MASTER_ID_TX -}; - -enum { - ENABLE_PENDING, - DISABLE_PENDING -}; -#define TRUE 1 -#define FALSE 0 - -#define SWRM_MAX_PORT_REG 120 -#define SWRM_MAX_INIT_REG 11 - -#define SWR_MSTR_MAX_REG_ADDR 0x1740 -#define SWR_MSTR_START_REG_ADDR 0x00 -#define SWR_MSTR_MAX_BUF_LEN 32 -#define BYTES_PER_LINE 12 -#define SWR_MSTR_RD_BUF_LEN 8 -#define SWR_MSTR_WR_BUF_LEN 32 - -#define MAX_FIFO_RD_FAIL_RETRY 3 - -static struct swr_mstr_ctrl *dbgswrm; -static struct dentry *debugfs_swrm_dent; -static struct dentry *debugfs_peek; -static struct dentry *debugfs_poke; -static struct dentry *debugfs_reg_dump; -static unsigned int read_data; - -static bool swrm_lock_sleep(struct swr_mstr_ctrl *swrm); -static void swrm_unlock_sleep(struct swr_mstr_ctrl *swrm); - -static bool swrm_is_msm_variant(int val) -{ - return (val == SWRM_VERSION_1_3); -} - -static int swrm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t swrm_reg_show(char __user *ubuf, size_t count, - loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[SWR_MSTR_MAX_BUF_LEN]; - - if (!ubuf || !ppos) - return 0; - - for (i = (((int) *ppos / BYTES_PER_LINE) + SWR_MSTR_START_REG_ADDR); - i <= SWR_MSTR_MAX_REG_ADDR; i += 4) { - reg_val = dbgswrm->read(dbgswrm->handle, i); - len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i, reg_val); - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t swrm_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_MSTR_RD_BUF_LEN]; - char *access_str; - ssize_t ret_cnt; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - access_str = file->private_data; - if (*ppos < 0) - return -EINVAL; - - if (!strcmp(access_str, "swrm_peek")) { - snprintf(lbuf, sizeof(lbuf), "0x%x\n", read_data); - ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); - } else if (!strcmp(access_str, "swrm_reg_dump")) { - ret_cnt = swrm_reg_show(ubuf, count, ppos); - } else { - pr_err("%s: %s not permitted to read\n", __func__, access_str); - ret_cnt = -EPERM; - } - return ret_cnt; -} - -static ssize_t swrm_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char lbuf[SWR_MSTR_WR_BUF_LEN]; - int rc; - u32 param[5]; - char *access_str; - - if (!filp || !ppos || !ubuf) - return -EINVAL; - - access_str = filp->private_data; - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - if (!strcmp(access_str, "swrm_poke")) { - /* write */ - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && - (param[1] <= 0xFFFFFFFF) && - (rc == 0)) - rc = dbgswrm->write(dbgswrm->handle, param[0], - param[1]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "swrm_peek")) { - /* read */ - rc = get_parameters(lbuf, param, 1); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && (rc == 0)) - read_data = dbgswrm->read(dbgswrm->handle, param[0]); - else - rc = -EINVAL; - } - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations swrm_debug_ops = { - .open = swrm_debug_open, - .write = swrm_debug_write, - .read = swrm_debug_read, -}; -static int swrm_get_ssp_period(struct swr_mstr_ctrl *swrm, - int row, int col, - int frame_sync) -{ - if (!swrm || !row || !col || !frame_sync) - return 1; - - return ((swrm->bus_clk * 2) / ((row * col) * frame_sync)); -} - -static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable) -{ - int ret = 0; - - if (!swrm->clk || !swrm->handle) - return -EINVAL; - - mutex_lock(&swrm->clklock); - if (enable) { - if (!swrm->dev_up) { - ret = -ENODEV; - goto exit; - } - swrm->clk_ref_count++; - if (swrm->clk_ref_count == 1) { - ret = swrm->clk(swrm->handle, true); - if (ret) { - dev_err_ratelimited(swrm->dev, - "%s: clock enable req failed", - __func__); - --swrm->clk_ref_count; - } - } - } else if (--swrm->clk_ref_count == 0) { - swrm->clk(swrm->handle, false); - complete(&swrm->clk_off_complete); - } - if (swrm->clk_ref_count < 0) { - pr_err("%s: swrm clk count mismatch\n", __func__); - swrm->clk_ref_count = 0; - } - -exit: - mutex_unlock(&swrm->clklock); - return ret; -} - -static int swrm_ahb_write(struct swr_mstr_ctrl *swrm, - u16 reg, u32 *value) -{ - u32 temp = (u32)(*value); - int ret = 0; - - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) - goto err; - - ret = swrm_clk_request(swrm, TRUE); - if (ret) { - dev_err_ratelimited(swrm->dev, "%s: clock request failed\n", - __func__); - goto err; - } - iowrite32(temp, swrm->swrm_dig_base + reg); - swrm_clk_request(swrm, FALSE); -err: - mutex_unlock(&swrm->devlock); - return ret; -} - -static int swrm_ahb_read(struct swr_mstr_ctrl *swrm, - u16 reg, u32 *value) -{ - u32 temp = 0; - int ret = 0; - - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) - goto err; - - ret = swrm_clk_request(swrm, TRUE); - if (ret) { - dev_err_ratelimited(swrm->dev, "%s: clock request failed\n", - __func__); - goto err; - } - temp = ioread32(swrm->swrm_dig_base + reg); - *value = temp; - swrm_clk_request(swrm, FALSE); -err: - mutex_unlock(&swrm->devlock); - return ret; -} - -static u32 swr_master_read(struct swr_mstr_ctrl *swrm, unsigned int reg_addr) -{ - u32 val = 0; - - if (swrm->read) - val = swrm->read(swrm->handle, reg_addr); - else - swrm_ahb_read(swrm, reg_addr, &val); - return val; -} - -static void swr_master_write(struct swr_mstr_ctrl *swrm, u16 reg_addr, u32 val) -{ - if (swrm->write) - swrm->write(swrm->handle, reg_addr, val); - else - swrm_ahb_write(swrm, reg_addr, &val); -} - -static int swr_master_bulk_write(struct swr_mstr_ctrl *swrm, u32 *reg_addr, - u32 *val, unsigned int length) -{ - int i = 0; - - if (swrm->bulk_write) - swrm->bulk_write(swrm->handle, reg_addr, val, length); - else { - mutex_lock(&swrm->iolock); - for (i = 0; i < length; i++) { - /* wait for FIFO WR command to complete to avoid overflow */ - usleep_range(100, 105); - swr_master_write(swrm, reg_addr[i], val[i]); - } - mutex_unlock(&swrm->iolock); - } - return 0; -} - -static bool swrm_is_port_en(struct swr_master *mstr) -{ - return !!(mstr->num_port); -} - -static void copy_port_tables(struct swr_mstr_ctrl *swrm, - struct port_params *params) -{ - u8 i; - struct port_params *config = params; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - /* wsa uses single frame structure for all configurations */ - if (!swrm->mport_cfg[i].port_en) - continue; - swrm->mport_cfg[i].sinterval = config[i].si; - swrm->mport_cfg[i].offset1 = config[i].off1; - swrm->mport_cfg[i].offset2 = config[i].off2; - swrm->mport_cfg[i].hstart = config[i].hstart; - swrm->mport_cfg[i].hstop = config[i].hstop; - swrm->mport_cfg[i].blk_pack_mode = config[i].bp_mode; - swrm->mport_cfg[i].blk_grp_count = config[i].bgp_ctrl; - swrm->mport_cfg[i].word_length = config[i].wd_len; - swrm->mport_cfg[i].lane_ctrl = config[i].lane_ctrl; - } -} -static int swrm_get_port_config(struct swr_mstr_ctrl *swrm) -{ - struct port_params *params; - - switch (swrm->master_id) { - case MASTER_ID_WSA: - params = wsa_frame_superset; - break; - case MASTER_ID_RX: - /* Two RX tables for dsd and without dsd enabled */ - if (swrm->mport_cfg[4].port_en) - params = rx_frame_params_dsd; - else - params = rx_frame_params; - break; - case MASTER_ID_TX: - if ((swrm->mport_cfg[0].port_en && - swrm->mport_cfg[0].ch_rate == swrm->mclk_freq) || - (swrm->mport_cfg[1].port_en && - swrm->mport_cfg[1].ch_rate == swrm->mclk_freq)) - params = tx_perf_frame_params_superset; - else - params = tx_frame_params_superset; - break; - default: /* MASTER_GENERIC*/ - /* computer generic frame parameters */ - return -EINVAL; - } - - copy_port_tables(swrm, params); - return 0; -} - -static int swrm_get_master_port(struct swr_mstr_ctrl *swrm, u8 *mstr_port_id, - u8 *mstr_ch_mask, u8 mstr_prt_type, - u8 slv_port_id) -{ - int i, j; - *mstr_port_id = 0; - - for (i = 1; i <= swrm->num_ports; i++) { - for (j = 0; j < SWR_MAX_CH_PER_PORT; j++) { - if (swrm->port_mapping[i][j].port_type == mstr_prt_type) - goto found; - } - } -found: - if (i > swrm->num_ports || j == SWR_MAX_CH_PER_PORT) { - dev_err(swrm->dev, "%s: port type not supported by master\n", - __func__); - return -EINVAL; - } - /* id 0 corresponds to master port 1 */ - *mstr_port_id = i - 1; - *mstr_ch_mask = swrm->port_mapping[i][j].ch_mask; - - return 0; - -} - -static u32 swrm_get_packed_reg_val(u8 *cmd_id, u8 cmd_data, - u8 dev_addr, u16 reg_addr) -{ - u32 val; - u8 id = *cmd_id; - - if (id != SWR_BROADCAST_CMD_ID) { - if (id < 14) - id += 1; - else - id = 0; - *cmd_id = id; - } - val = SWR_REG_VAL_PACK(cmd_data, dev_addr, id, reg_addr); - - return val; -} - -static int swrm_cmd_fifo_rd_cmd(struct swr_mstr_ctrl *swrm, int *cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr, - u32 len) -{ - u32 val; - u32 retry_attempt = 0; - - mutex_lock(&swrm->iolock); - val = swrm_get_packed_reg_val(&swrm->rcmd_id, len, dev_addr, reg_addr); - if (swrm->read) { - /* skip delay if read is handled in platform driver */ - swr_master_write(swrm, SWRM_CMD_FIFO_RD_CMD, val); - } else { - /* wait for FIFO RD to complete to avoid overflow */ - usleep_range(100, 105); - swr_master_write(swrm, SWRM_CMD_FIFO_RD_CMD, val); - /* wait for FIFO RD CMD complete to avoid overflow */ - usleep_range(250, 255); - } -retry_read: - *cmd_data = swr_master_read(swrm, SWRM_CMD_FIFO_RD_FIFO_ADDR); - dev_dbg(swrm->dev, "%s: reg: 0x%x, cmd_id: 0x%x, rcmd_id: 0x%x, \ - dev_num: 0x%x, cmd_data: 0x%x\n", __func__, reg_addr, - cmd_id, swrm->rcmd_id, dev_addr, *cmd_data); - if ((((*cmd_data) & 0xF00) >> 8) != swrm->rcmd_id) { - if (retry_attempt < MAX_FIFO_RD_FAIL_RETRY) { - /* wait 500 us before retry on fifo read failure */ - usleep_range(500, 505); - if (retry_attempt == (MAX_FIFO_RD_FAIL_RETRY - 1)) { - swr_master_write(swrm, SWRM_CMD_FIFO_CMD, 0x1); - swr_master_write(swrm, SWRM_CMD_FIFO_RD_CMD, val); - } - retry_attempt++; - goto retry_read; - } else { - dev_err_ratelimited(swrm->dev, "%s: reg: 0x%x, cmd_id: 0x%x, \ - rcmd_id: 0x%x, dev_num: 0x%x, cmd_data: 0x%x\n", - __func__, reg_addr, cmd_id, swrm->rcmd_id, - dev_addr, *cmd_data); - - dev_err_ratelimited(swrm->dev, - "%s: failed to read fifo\n", __func__); - } - } - mutex_unlock(&swrm->iolock); - - return 0; -} - -static int swrm_cmd_fifo_wr_cmd(struct swr_mstr_ctrl *swrm, u8 cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr) -{ - u32 val; - int ret = 0; - - mutex_lock(&swrm->iolock); - if (!cmd_id) - val = swrm_get_packed_reg_val(&swrm->wcmd_id, cmd_data, - dev_addr, reg_addr); - else - val = swrm_get_packed_reg_val(&cmd_id, cmd_data, - dev_addr, reg_addr); - dev_dbg(swrm->dev, "%s: reg: 0x%x, cmd_id: 0x%x,wcmd_id: 0x%x, \ - dev_num: 0x%x, cmd_data: 0x%x\n", __func__, - reg_addr, cmd_id, swrm->wcmd_id,dev_addr, cmd_data); - swr_master_write(swrm, SWRM_CMD_FIFO_WR_CMD, val); - /* - * wait for FIFO WR command to complete to avoid overflow - * skip delay if write is handled in platform driver. - */ - if(!swrm->write) - usleep_range(250, 255); - if (cmd_id == 0xF) { - /* - * sleep for 10ms for MSM soundwire variant to allow broadcast - * command to complete. - */ - if (swrm_is_msm_variant(swrm->version)) - usleep_range(10000, 10100); - else - wait_for_completion_timeout(&swrm->broadcast, - (2 * HZ/10)); - } - mutex_unlock(&swrm->iolock); - return ret; -} - -static int swrm_read(struct swr_master *master, u8 dev_num, u16 reg_addr, - void *buf, u32 len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int val; - u8 *reg_val = (u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (!dev_num) { - dev_err(&master->dev, "%s: invalid slave dev num\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return 0; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - ret = swrm_cmd_fifo_rd_cmd(swrm, &val, dev_num, 0, reg_addr, len); - - if (!ret) - *reg_val = (u8)val; - - pm_runtime_put_autosuspend(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - return ret; -} - -static int swrm_write(struct swr_master *master, u8 dev_num, u16 reg_addr, - const void *buf) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - u8 reg_val = *(u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (!dev_num) { - dev_err(&master->dev, "%s: invalid slave dev num\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return 0; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - ret = swrm_cmd_fifo_wr_cmd(swrm, reg_val, dev_num, 0, reg_addr); - - pm_runtime_put_autosuspend(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - return ret; -} - -static int swrm_bulk_write(struct swr_master *master, u8 dev_num, void *reg, - const void *buf, size_t len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int i; - u32 *val; - u32 *swr_fifo_reg; - - if (!swrm || !swrm->handle) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (len <= 0) - return -EINVAL; - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return 0; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - if (dev_num) { - swr_fifo_reg = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!swr_fifo_reg) { - ret = -ENOMEM; - goto err; - } - val = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!val) { - ret = -ENOMEM; - goto mem_fail; - } - - for (i = 0; i < len; i++) { - val[i] = swrm_get_packed_reg_val(&swrm->wcmd_id, - ((u8 *)buf)[i], - dev_num, - ((u16 *)reg)[i]); - swr_fifo_reg[i] = SWRM_CMD_FIFO_WR_CMD; - } - ret = swr_master_bulk_write(swrm, swr_fifo_reg, val, len); - if (ret) { - dev_err(&master->dev, "%s: bulk write failed\n", - __func__); - ret = -EINVAL; - } - } else { - dev_err(&master->dev, - "%s: No support of Bulk write for master regs\n", - __func__); - ret = -EINVAL; - goto err; - } - kfree(val); -mem_fail: - kfree(swr_fifo_reg); -err: - pm_runtime_put_autosuspend(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - return ret; -} - -static u8 get_inactive_bank_num(struct swr_mstr_ctrl *swrm) -{ - return (swr_master_read(swrm, SWRM_MCP_STATUS) & - SWRM_MCP_STATUS_BANK_NUM_MASK) ? 0 : 1; -} - -static void enable_bank_switch(struct swr_mstr_ctrl *swrm, u8 bank, - u8 row, u8 col) -{ - swrm_cmd_fifo_wr_cmd(swrm, ((row << 3) | col), 0xF, 0xF, - SWRS_SCP_FRAME_CTRL_BANK(bank)); -} - -static struct swr_port_info *swrm_get_port_req(struct swrm_mports *mport, - u8 slv_port, u8 dev_num) -{ - struct swr_port_info *port_req = NULL; - - list_for_each_entry(port_req, &mport->port_req_list, list) { - /* Store dev_id instead of dev_num if enumeration is changed run_time */ - if ((port_req->slave_port_id == slv_port) - && (port_req->dev_num == dev_num)) - return port_req; - } - return NULL; -} - -static bool swrm_remove_from_group(struct swr_master *master) -{ - struct swr_device *swr_dev; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - bool is_removed = false; - - if (!swrm) - goto end; - - mutex_lock(&swrm->mlock); - if ((swrm->num_rx_chs > 1) && - (swrm->num_rx_chs == swrm->num_cfg_devs)) { - list_for_each_entry(swr_dev, &master->devices, - dev_list) { - swr_dev->group_id = SWR_GROUP_NONE; - master->gr_sid = 0; - } - is_removed = true; - } - mutex_unlock(&swrm->mlock); - -end: - return is_removed; -} - -static void swrm_disable_ports(struct swr_master *master, - u8 bank) -{ - u32 value; - struct swr_port_info *port_req; - int i; - struct swrm_mports *mport; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - - for (i = 0; i < SWR_MSTR_PORT_LEN ; i++) { - - mport = &(swrm->mport_cfg[i]); - if (!mport->port_en) - continue; - - list_for_each_entry(port_req, &mport->port_req_list, list) { - /* skip ports with no change req's*/ - if (port_req->req_ch == port_req->ch_en) - continue; - - swrm_cmd_fifo_wr_cmd(swrm, port_req->req_ch, - port_req->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_req->slave_port_id, - bank)); - dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x\n", - __func__, i, - (SWRM_DP_PORT_CTRL_BANK(i + 1, bank))); - } - value = ((mport->req_ch) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - value |= ((mport->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((mport->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= mport->sinterval; - - swr_master_write(swrm, - 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); - } -} - -static void swrm_cleanup_disabled_port_reqs(struct swr_master *master) -{ - struct swr_port_info *port_req, *next; - int i; - struct swrm_mports *mport; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - mport = &(swrm->mport_cfg[i]); - list_for_each_entry_safe(port_req, next, - &mport->port_req_list, list) { - /* skip ports without new ch req */ - if (port_req->ch_en == port_req->req_ch) - continue; - - /* remove new ch req's*/ - port_req->ch_en = port_req->req_ch; - - /* If no streams enabled on port, remove the port req */ - if (port_req->ch_en == 0) { - list_del(&port_req->list); - kfree(port_req); - } - } - /* remove new ch req's on mport*/ - mport->ch_en = mport->req_ch; - - if (!(mport->ch_en)) { - mport->port_en = false; - master->port_en_mask &= ~i; - } - } -} -static void swrm_copy_data_port_config(struct swr_master *master, u8 bank) -{ - u32 value, slv_id; - struct swr_port_info *port_req; - int i; - struct swrm_mports *mport; - u32 reg[SWRM_MAX_PORT_REG]; - u32 val[SWRM_MAX_PORT_REG]; - int len = 0; - u8 hparams; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - mport = &(swrm->mport_cfg[i]); - if (!mport->port_en) - continue; - - list_for_each_entry(port_req, &mport->port_req_list, list) { - slv_id = port_req->slave_port_id; - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port_req->req_ch, - port_req->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(slv_id, - bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(mport->sinterval, - port_req->dev_num, 0x00, - SWRS_DP_SAMPLE_CONTROL_1_BANK(slv_id, - bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(mport->offset1, - port_req->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_1_BANK(slv_id, - bank)); - - if (mport->offset2 != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(mport->offset2, - port_req->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_2_BANK( - slv_id, bank)); - } - if (mport->hstart != SWR_INVALID_PARAM - && mport->hstop != SWR_INVALID_PARAM) { - hparams = (mport->hstart << 4) | mport->hstop; - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(hparams, - port_req->dev_num, 0x00, - SWRS_DP_HCONTROL_BANK(slv_id, - bank)); - } - if (mport->word_length != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->word_length, - port_req->dev_num, 0x00, - SWRS_DP_BLOCK_CONTROL_1(slv_id)); - } - if (mport->blk_pack_mode != SWR_INVALID_PARAM - && swrm->master_id != MASTER_ID_WSA) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->blk_pack_mode, - port_req->dev_num, 0x00, - SWRS_DP_BLOCK_CONTROL_3_BANK(slv_id, - bank)); - } - if (mport->blk_grp_count != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->blk_grp_count, - port_req->dev_num, 0x00, - SWRS_DP_BLOCK_CONTROL_2_BANK(slv_id, - bank)); - } - if (mport->lane_ctrl != SWR_INVALID_PARAM) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = - SWR_REG_VAL_PACK(mport->lane_ctrl, - port_req->dev_num, 0x00, - SWRS_DP_LANE_CONTROL_BANK(slv_id, - bank)); - } - port_req->ch_en = port_req->req_ch; - } - value = ((mport->req_ch) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - - if (mport->offset2 != SWR_INVALID_PARAM) - value |= ((mport->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((mport->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= mport->sinterval; - - - 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); - - if (mport->lane_ctrl != SWR_INVALID_PARAM) { - 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); - val[len++] = mport->word_length; - } - - if (mport->blk_grp_count != SWR_INVALID_PARAM) { - 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); - hparams = (mport->hstop << 4) | mport->hstart; - val[len++] = hparams; - } else { - 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); - val[len++] = mport->blk_pack_mode; - } - mport->ch_en = mport->req_ch; - - } - swr_master_bulk_write(swrm, reg, val, len); -} - -static void swrm_apply_port_config(struct swr_master *master) -{ - u8 bank; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - - bank = get_inactive_bank_num(swrm); - dev_dbg(swrm->dev, "%s: enter bank: %d master_ports: %d\n", - __func__, bank, master->num_port); - - - swrm_cmd_fifo_wr_cmd(swrm, 0x01, 0xF, 0x00, - SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(bank)); - - swrm_copy_data_port_config(master, bank); -} - -static int swrm_slvdev_datapath_control(struct swr_master *master, bool enable) -{ - u8 bank; - u32 value, n_row, n_col; - u32 row = 0, col = 0; - int ret; - u8 ssp_period = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int mask = (SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_BMSK); - u8 inactive_bank; - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return -EFAULT; - } - - mutex_lock(&swrm->mlock); - - bank = get_inactive_bank_num(swrm); - - if (enable) { - if (!test_bit(ENABLE_PENDING, &swrm->port_req_pending)) { - dev_dbg(swrm->dev, "%s:No pending connect port req\n", - __func__); - goto exit; - } - clear_bit(ENABLE_PENDING, &swrm->port_req_pending); - ret = swrm_get_port_config(swrm); - if (ret) { - /* cannot accommodate ports */ - swrm_cleanup_disabled_port_reqs(master); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - swr_master_write(swrm, SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, - SWRM_INTERRUPT_STATUS_MASK); - /* apply the new port config*/ - swrm_apply_port_config(master); - } else { - if (!test_bit(DISABLE_PENDING, &swrm->port_req_pending)) { - dev_dbg(swrm->dev, "%s:No pending disconn port req\n", - __func__); - goto exit; - } - clear_bit(DISABLE_PENDING, &swrm->port_req_pending); - swrm_disable_ports(master, bank); - } - dev_dbg(swrm->dev, "%s: enable: %d, cfg_devs: %d\n", - __func__, enable, swrm->num_cfg_devs); - - if (enable) { - /* set col = 16 */ - n_col = SWR_MAX_COL; - col = SWRM_COL_16; - } else { - /* - * Do not change to col = 2 if there are still active ports - */ - if (!master->num_port) { - n_col = SWR_MIN_COL; - col = SWRM_COL_02; - } else { - n_col = SWR_MAX_COL; - col = SWRM_COL_16; - } - } - /* Use default 50 * x, frame shape. Change based on mclk */ - if (swrm->mclk_freq == MCLK_FREQ_NATIVE) { - dev_dbg(swrm->dev, "setting 64 x %d frameshape\n", - n_col ? 16 : 2); - n_row = SWR_ROW_64; - row = SWRM_ROW_64; - } else { - dev_dbg(swrm->dev, "setting 50 x %d frameshape\n", - n_col ? 16 : 2); - n_row = SWR_ROW_50; - row = SWRM_ROW_50; - } - ssp_period = swrm_get_ssp_period(swrm, row, col, SWRM_FRAME_SYNC_SEL); - dev_dbg(swrm->dev, "%s: ssp_period: %d\n", __func__, ssp_period); - - value = swr_master_read(swrm, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank)); - value &= (~mask); - value |= ((n_row << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (n_col << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - ((ssp_period - 1) << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - swr_master_write(swrm, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - dev_dbg(swrm->dev, "%s: regaddr: 0x%x, value: 0x%x\n", __func__, - SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - enable_bank_switch(swrm, bank, n_row, n_col); - inactive_bank = bank ? 0 : 1; - - if (enable) - swrm_copy_data_port_config(master, inactive_bank); - else { - swrm_disable_ports(master, inactive_bank); - swrm_cleanup_disabled_port_reqs(master); - } - if (!swrm_is_port_en(master)) { - dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n", - __func__); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - } -exit: - mutex_unlock(&swrm->mlock); -return 0; -} - -static int swrm_connect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i; - struct swr_port_info *port_req; - int ret = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - struct swrm_mports *mport; - u8 mstr_port_id, mstr_ch_msk; - - dev_dbg(&master->dev, "%s: enter\n", __func__); - if (!portinfo) - return -EINVAL; - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - mutex_lock(&swrm->mlock); - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - mutex_unlock(&swrm->mlock); - ret = -EINVAL; - goto fail; - } - mutex_unlock(&swrm->devlock); - if (!swrm_is_port_en(master)) - pm_runtime_get_sync(swrm->dev); - - for (i = 0; i < portinfo->num_port; i++) { - ret = swrm_get_master_port(swrm, &mstr_port_id, &mstr_ch_msk, - portinfo->port_type[i], - portinfo->port_id[i]); - if (ret) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - goto port_fail; - } - - mport = &(swrm->mport_cfg[mstr_port_id]); - /* get port req */ - port_req = swrm_get_port_req(mport, portinfo->port_id[i], - portinfo->dev_num); - if (!port_req) { - dev_dbg(&master->dev, "%s: new req:port id %d dev %d\n", - __func__, portinfo->port_id[i], - portinfo->dev_num); - port_req = kzalloc(sizeof(struct swr_port_info), - GFP_KERNEL); - if (!port_req) { - ret = -ENOMEM; - goto mem_fail; - } - port_req->dev_num = portinfo->dev_num; - port_req->slave_port_id = portinfo->port_id[i]; - port_req->num_ch = portinfo->num_ch[i]; - port_req->ch_rate = portinfo->ch_rate[i]; - port_req->ch_en = 0; - port_req->master_port_id = mstr_port_id; - list_add(&port_req->list, &mport->port_req_list); - } - port_req->req_ch |= portinfo->ch_en[i]; - - dev_dbg(&master->dev, - "%s: mstr port %d, slv port %d ch_rate %d num_ch %d\n", - __func__, port_req->master_port_id, - port_req->slave_port_id, port_req->ch_rate, - port_req->num_ch); - /* Put the port req on master port */ - mport = &(swrm->mport_cfg[mstr_port_id]); - mport->port_en = true; - mport->req_ch |= mstr_ch_msk; - master->port_en_mask |= (1 << mstr_port_id); - } - master->num_port += portinfo->num_port; - set_bit(ENABLE_PENDING, &swrm->port_req_pending); - swr_port_response(master, portinfo->tid); - - mutex_unlock(&swrm->mlock); - return 0; - -port_fail: -mem_fail: - /* cleanup port reqs in error condition */ - swrm_cleanup_disabled_port_reqs(master); - mutex_unlock(&swrm->mlock); -fail: - swr_port_response(master, portinfo->tid); - return ret; -} - -static int swrm_disconnect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i, ret = 0; - struct swr_port_info *port_req; - struct swrm_mports *mport; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - u8 mstr_port_id, mstr_ch_mask; - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - if (!portinfo) { - dev_err(&master->dev, "%s: portinfo is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->mlock); - - for (i = 0; i < portinfo->num_port; i++) { - - ret = swrm_get_master_port(swrm, &mstr_port_id, &mstr_ch_mask, - portinfo->port_type[i], portinfo->port_id[i]); - if (ret) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - mport = &(swrm->mport_cfg[mstr_port_id]); - /* get port req */ - port_req = swrm_get_port_req(mport, portinfo->port_id[i], - portinfo->dev_num); - - if (!port_req) { - dev_err(&master->dev, "%s:port not enabled : port %d\n", - __func__, portinfo->port_id[i]); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - port_req->req_ch &= ~portinfo->ch_en[i]; - mport->req_ch &= ~mstr_ch_mask; - } - master->num_port -= portinfo->num_port; - set_bit(DISABLE_PENDING, &swrm->port_req_pending); - swr_port_response(master, portinfo->tid); - mutex_unlock(&swrm->mlock); - - return 0; -} - -static int swrm_find_alert_slave(struct swr_mstr_ctrl *swrm, - int status, u8 *devnum) -{ - int i; - bool found = false; - - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if ((status & SWRM_MCP_SLV_STATUS_MASK) == SWR_ALERT) { - *devnum = i; - found = true; - break; - } - status >>= 2; - } - if (found) - return 0; - else - return -EINVAL; -} - -static int swrm_check_slave_change_status(struct swr_mstr_ctrl *swrm, - int status, u8 *devnum) -{ - int i; - int new_sts = status; - int ret = SWR_NOT_PRESENT; - - if (status != swrm->slave_status) { - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if ((status & SWRM_MCP_SLV_STATUS_MASK) != - (swrm->slave_status & SWRM_MCP_SLV_STATUS_MASK)) { - ret = (status & SWRM_MCP_SLV_STATUS_MASK); - *devnum = i; - break; - } - status >>= 2; - swrm->slave_status >>= 2; - } - swrm->slave_status = new_sts; - } - return ret; -} - -static void swrm_new_slave_config(struct swr_mstr_ctrl *swrm) -{ - int i; - - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if ((swrm->slave_status & SWRM_MCP_SLV_STATUS_MASK) - == SWR_ATTACHED_OK) { - /* enable host irq on slave device*/ - swrm_cmd_fifo_wr_cmd(swrm, 0x4, i, 0x0, - SWRS_SCP_INT_STATUS_MASK_1); - } - swrm->slave_status >>= 2; - } -} - -static irqreturn_t swr_mstr_interrupt(int irq, void *dev) -{ - struct swr_mstr_ctrl *swrm = dev; - u32 value, intr_sts, intr_sts_masked; - u32 temp = 0; - u32 status, chg_sts, i; - u8 devnum = 0; - int ret = IRQ_HANDLED; - struct swr_device *swr_dev; - struct swr_master *mstr = &swrm->master; - - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - return IRQ_NONE; - } - - mutex_lock(&swrm->reslock); - if (swrm_clk_request(swrm, true)) { - dev_err_ratelimited(swrm->dev, "%s:clk request failed\n", - __func__); - mutex_unlock(&swrm->reslock); - goto exit; - } - mutex_unlock(&swrm->reslock); - - intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS); - intr_sts_masked = intr_sts & swrm->intr_mask; -handle_irq: - for (i = 0; i < SWRM_INTERRUPT_MAX; i++) { - value = intr_sts_masked & (1 << i); - if (!value) - continue; - - switch (value) { - case SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ: - dev_dbg(swrm->dev, "Trigger irq to slave device\n"); - status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - ret = swrm_find_alert_slave(swrm, status, &devnum); - if (ret) { - dev_err_ratelimited(swrm->dev, - "no slave alert found.spurious interrupt\n"); - break; - } - swrm_cmd_fifo_rd_cmd(swrm, &temp, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1, 1); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - swrm_cmd_fifo_wr_cmd(swrm, 0x0, devnum, 0x0, - SWRS_SCP_INT_STATUS_CLEAR_1); - - - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - if (swr_dev->dev_num != devnum) - continue; - if (swr_dev->slave_irq) { - do { - swr_dev->slave_irq_pending = 0; - handle_nested_irq( - irq_find_mapping( - swr_dev->slave_irq, 0)); - } while (swr_dev->slave_irq_pending); - } - - } - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED: - dev_dbg(swrm->dev, "SWR new slave attached\n"); - break; - case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS: - status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - if (status == swrm->slave_status) { - dev_dbg(swrm->dev, - "%s: No change in slave status: %d\n", - __func__, status); - swrm_new_slave_config(swrm); - break; - } - chg_sts = swrm_check_slave_change_status(swrm, status, - &devnum); - switch (chg_sts) { - case SWR_NOT_PRESENT: - dev_dbg(swrm->dev, "device %d got detached\n", - devnum); - break; - case SWR_ATTACHED_OK: - dev_dbg(swrm->dev, "device %d got attached\n", - devnum); - swrm_new_slave_config(swrm); - break; - case SWR_ALERT: - dev_dbg(swrm->dev, - "device %d has pending interrupt\n", - devnum); - break; - } - break; - case SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET: - dev_err_ratelimited(swrm->dev, - "SWR bus clsh detected\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO overflow\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO underflow\n"); - break; - case SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR write FIFO overflow\n"); - swr_master_write(swrm, SWRM_CMD_FIFO_CMD, 0x1); - break; - case SWRM_INTERRUPT_STATUS_CMD_ERROR: - value = swr_master_read(swrm, SWRM_CMD_FIFO_STATUS); - dev_err_ratelimited(swrm->dev, - "SWR CMD error, fifo status 0x%x, flushing fifo\n", - value); - swr_master_write(swrm, SWRM_CMD_FIFO_CMD, 0x1); - break; - case SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION: - dev_err_ratelimited(swrm->dev, "SWR Port collision detected\n"); - swrm->intr_mask &= ~SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION; - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, swrm->intr_mask); - break; - case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH: - dev_dbg(swrm->dev, "SWR read enable valid mismatch\n"); - swrm->intr_mask &= - ~SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH; - swr_master_write(swrm, - SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN, swrm->intr_mask); - break; - case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED: - complete(&swrm->broadcast); - dev_dbg(swrm->dev, "SWR cmd id finished\n"); - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_AUTO_ENUM_FINISHED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL: - break; - case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED: - complete(&swrm->reset); - break; - case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED: - break; - default: - dev_err_ratelimited(swrm->dev, - "SWR unknown interrupt\n"); - ret = IRQ_NONE; - break; - } - } - swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, intr_sts); - swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, 0x0); - - intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS); - intr_sts_masked = intr_sts & swrm->intr_mask; - - if (intr_sts_masked) { - dev_dbg(swrm->dev, "%s: new interrupt received\n", __func__); - goto handle_irq; - } - - mutex_lock(&swrm->reslock); - swrm_clk_request(swrm, false); - mutex_unlock(&swrm->reslock); -exit: - swrm_unlock_sleep(swrm); - return ret; -} - -static irqreturn_t swrm_wakeup_interrupt(int irq, void *dev) -{ - struct swr_mstr_ctrl *swrm = dev; - int ret = IRQ_HANDLED; - - if (!swrm || !(swrm->dev)) { - pr_err("%s: swrm or dev is null\n", __func__); - return IRQ_NONE; - } - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - if (swrm->wake_irq > 0) { - mutex_lock(&swrm->irq_lock); - if (!irqd_irq_disabled( - irq_get_irq_data(swrm->wake_irq))) - disable_irq_nosync(swrm->wake_irq); - mutex_unlock(&swrm->irq_lock); - } - mutex_unlock(&swrm->devlock); - return ret; - } - mutex_unlock(&swrm->devlock); - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - goto exit; - } - if (swrm->wake_irq > 0) { - mutex_lock(&swrm->irq_lock); - if (!irqd_irq_disabled( - irq_get_irq_data(swrm->wake_irq))) - disable_irq_nosync(swrm->wake_irq); - mutex_unlock(&swrm->irq_lock); - } - pm_runtime_get_sync(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - swrm_unlock_sleep(swrm); -exit: - return ret; -} - -static void swrm_wakeup_work(struct work_struct *work) -{ - struct swr_mstr_ctrl *swrm; - - swrm = container_of(work, struct swr_mstr_ctrl, - wakeup_work); - if (!swrm || !(swrm->dev)) { - pr_err("%s: swrm or dev is null\n", __func__); - return; - } - - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - goto exit; - } - mutex_unlock(&swrm->devlock); - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - goto exit; - } - pm_runtime_get_sync(swrm->dev); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - swrm_unlock_sleep(swrm); -exit: - pm_relax(swrm->dev); -} - -static int swrm_get_device_status(struct swr_mstr_ctrl *swrm, u8 devnum) -{ - u32 val; - - swrm->slave_status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); - val = (swrm->slave_status >> (devnum * 2)); - val &= SWRM_MCP_SLV_STATUS_MASK; - return val; -} - -static int swrm_get_logical_dev_num(struct swr_master *mstr, u64 dev_id, - u8 *dev_num) -{ - int i; - u64 id = 0; - int ret = -EINVAL; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - struct swr_device *swr_dev; - u32 num_dev = 0; - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return ret; - } - if (swrm->num_dev) - num_dev = swrm->num_dev; - else - num_dev = mstr->num_dev; - - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - mutex_unlock(&swrm->devlock); - return ret; - } - mutex_unlock(&swrm->devlock); - - pm_runtime_get_sync(swrm->dev); - for (i = 1; i < (num_dev + 1); i++) { - id = ((u64)(swr_master_read(swrm, - SWRM_ENUMERATOR_SLAVE_DEV_ID_2(i))) << 32); - id |= swr_master_read(swrm, - SWRM_ENUMERATOR_SLAVE_DEV_ID_1(i)); - - /* - * As pm_runtime_get_sync() brings all slaves out of reset - * update logical device number for all slaves. - */ - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - if (swr_dev->addr == (id & SWR_DEV_ID_MASK)) { - u32 status = swrm_get_device_status(swrm, i); - - if ((status == 0x01) || (status == 0x02)) { - swr_dev->dev_num = i; - if ((id & SWR_DEV_ID_MASK) == dev_id) { - *dev_num = i; - ret = 0; - } - dev_dbg(swrm->dev, - "%s: devnum %d is assigned for dev addr %lx\n", - __func__, i, swr_dev->addr); - } - } - } - } - if (ret) - dev_err(swrm->dev, "%s: device 0x%llx is not ready\n", - __func__, dev_id); - - swrm_new_slave_config(swrm); - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - return ret; -} - -static void swrm_device_wakeup_vote(struct swr_master *mstr) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - if (unlikely(swrm_lock_sleep(swrm) == false)) { - dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__); - return; - } - pm_runtime_get_sync(swrm->dev); -} - -static void swrm_device_wakeup_unvote(struct swr_master *mstr) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - pm_runtime_mark_last_busy(swrm->dev); - pm_runtime_put_autosuspend(swrm->dev); - swrm_unlock_sleep(swrm); -} - -static int swrm_master_init(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - u32 val; - u8 row_ctrl = SWR_ROW_50; - u8 col_ctrl = SWR_MIN_COL; - u8 ssp_period = 1; - u8 retry_cmd_num = 3; - u32 reg[SWRM_MAX_INIT_REG]; - u32 value[SWRM_MAX_INIT_REG]; - int len = 0; - - ssp_period = swrm_get_ssp_period(swrm, SWRM_ROW_50, - SWRM_COL_02, SWRM_FRAME_SYNC_SEL); - dev_dbg(swrm->dev, "%s: ssp_period: %d\n", __func__, ssp_period); - - /* Clear Rows and Cols */ - val = ((row_ctrl << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (col_ctrl << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - ((ssp_period - 1) << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - - reg[len] = SWRM_MCP_FRAME_CTRL_BANK_ADDR(0); - value[len++] = val; - - /* Set Auto enumeration flag */ - reg[len] = SWRM_ENUMERATOR_CFG_ADDR; - value[len++] = 1; - - /* Configure No pings */ - val = swr_master_read(swrm, SWRM_MCP_CFG_ADDR); - val &= ~SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK; - val |= (0x1f << SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT); - reg[len] = SWRM_MCP_CFG_ADDR; - value[len++] = val; - - /* Configure number of retries of a read/write cmd */ - val = (retry_cmd_num << SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT); - reg[len] = SWRM_CMD_FIFO_CFG_ADDR; - value[len++] = val; - - reg[len] = SWRM_MCP_BUS_CTRL_ADDR; - value[len++] = 0x2; - - /* Set IRQ to PULSE */ - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x02; - - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x03; - - reg[len] = SWRM_INTERRUPT_CLEAR; - value[len++] = 0xFFFFFFFF; - - swrm->intr_mask = SWRM_INTERRUPT_STATUS_MASK; - /* Mask soundwire interrupts */ - reg[len] = SWRM_INTERRUPT_MASK_ADDR; - value[len++] = swrm->intr_mask; - - reg[len] = SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN; - value[len++] = swrm->intr_mask; - - swr_master_bulk_write(swrm, reg, value, len); - - return ret; -} - -static int swrm_event_notify(struct notifier_block *self, - unsigned long action, void *data) -{ - struct swr_mstr_ctrl *swrm = container_of(self, struct swr_mstr_ctrl, - event_notifier); - - if (!swrm || !(swrm->dev)) { - pr_err("%s: swrm or dev is NULL\n", __func__); - return -EINVAL; - } - switch (action) { - case MSM_AUD_DC_EVENT: - schedule_work(&(swrm->dc_presence_work)); - break; - case SWR_WAKE_IRQ_EVENT: - if (swrm->ipc_wakeup && !swrm->ipc_wakeup_triggered) { - swrm->ipc_wakeup_triggered = true; - pm_stay_awake(swrm->dev); - schedule_work(&swrm->wakeup_work); - } - break; - default: - dev_err(swrm->dev, "%s: invalid event type: %lu\n", - __func__, action); - return -EINVAL; - } - - return 0; -} - -static void swrm_notify_work_fn(struct work_struct *work) -{ - struct swr_mstr_ctrl *swrm = container_of(work, struct swr_mstr_ctrl, - dc_presence_work); - - if (!swrm || !swrm->pdev) { - pr_err("%s: swrm or pdev is NULL\n", __func__); - return; - } - swrm_wcd_notify(swrm->pdev, SWR_DEVICE_DOWN, NULL); -} - -static int swrm_probe(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm; - struct swr_ctrl_platform_data *pdata; - u32 i, num_ports, port_num, port_type, ch_mask; - u32 *temp, map_size, map_length, ch_iter = 0, old_port_num = 0; - int ret = 0; - - /* Allocate soundwire master driver structure */ - swrm = devm_kzalloc(&pdev->dev, sizeof(struct swr_mstr_ctrl), - GFP_KERNEL); - if (!swrm) { - ret = -ENOMEM; - goto err_memory_fail; - } - swrm->pdev = pdev; - swrm->dev = &pdev->dev; - platform_set_drvdata(pdev, swrm); - swr_set_ctrl_data(&swrm->master, swrm); - pdata = dev_get_platdata(&pdev->dev); - if (!pdata) { - dev_err(&pdev->dev, "%s: pdata from parent is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->handle = (void *)pdata->handle; - if (!swrm->handle) { - dev_err(&pdev->dev, "%s: swrm->handle is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - ret = of_property_read_u32(pdev->dev.of_node, "qcom,swr_master_id", - &swrm->master_id); - if (ret) { - dev_err(&pdev->dev, "%s: failed to get master id\n", __func__); - goto err_pdata_fail; - } - if (!(of_property_read_u32(pdev->dev.of_node, - "swrm-io-base", &swrm->swrm_base_reg))) - ret = of_property_read_u32(pdev->dev.of_node, - "swrm-io-base", &swrm->swrm_base_reg); - if (!swrm->swrm_base_reg) { - swrm->read = pdata->read; - if (!swrm->read) { - dev_err(&pdev->dev, "%s: swrm->read is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->write = pdata->write; - if (!swrm->write) { - dev_err(&pdev->dev, "%s: swrm->write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->bulk_write = pdata->bulk_write; - if (!swrm->bulk_write) { - dev_err(&pdev->dev, "%s: swrm->bulk_write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - } else { - swrm->swrm_dig_base = devm_ioremap(&pdev->dev, - swrm->swrm_base_reg, SWRM_MAX_REGISTER); - } - - swrm->clk = pdata->clk; - if (!swrm->clk) { - dev_err(&pdev->dev, "%s: swrm->clk is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - if (of_property_read_u32(pdev->dev.of_node, - "qcom,swr-clock-stop-mode0", - &swrm->clk_stop_mode0_supp)) { - swrm->clk_stop_mode0_supp = FALSE; - } - - ret = of_property_read_u32(swrm->dev->of_node, "qcom,swr-num-dev", - &swrm->num_dev); - if (ret) { - dev_dbg(&pdev->dev, "%s: Looking up %s property failed\n", - __func__, "qcom,swr-num-dev"); - } else { - if (swrm->num_dev > SWR_MAX_SLAVE_DEVICES) { - dev_err(&pdev->dev, "%s: num_dev %d > max limit %d\n", - __func__, swrm->num_dev, SWR_MAX_SLAVE_DEVICES); - ret = -EINVAL; - goto err_pdata_fail; - } - } - - /* Parse soundwire port mapping */ - ret = of_property_read_u32(pdev->dev.of_node, "qcom,swr-num-ports", - &num_ports); - if (ret) { - dev_err(swrm->dev, "%s: Failed to get num_ports\n", __func__); - goto err_pdata_fail; - } - swrm->num_ports = num_ports; - - if (!of_find_property(pdev->dev.of_node, "qcom,swr-port-mapping", - &map_size)) { - dev_err(swrm->dev, "missing port mapping\n"); - goto err_pdata_fail; - } - - map_length = map_size / (3 * sizeof(u32)); - if (num_ports > SWR_MSTR_PORT_LEN) { - dev_err(&pdev->dev, "%s:invalid number of swr ports\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - temp = devm_kzalloc(&pdev->dev, map_size, GFP_KERNEL); - - if (!temp) { - ret = -ENOMEM; - goto err_pdata_fail; - } - ret = of_property_read_u32_array(pdev->dev.of_node, - "qcom,swr-port-mapping", temp, 3 * map_length); - if (ret) { - dev_err(swrm->dev, "%s: Failed to read port mapping\n", - __func__); - goto err_pdata_fail; - } - - for (i = 0; i < map_length; i++) { - port_num = temp[3 * i]; - port_type = temp[3 * i + 1]; - ch_mask = temp[3 * i + 2]; - - if (port_num != old_port_num) - ch_iter = 0; - swrm->port_mapping[port_num][ch_iter].port_type = port_type; - swrm->port_mapping[port_num][ch_iter++].ch_mask = ch_mask; - old_port_num = port_num; - } - devm_kfree(&pdev->dev, temp); - - swrm->reg_irq = pdata->reg_irq; - swrm->master.read = swrm_read; - swrm->master.write = swrm_write; - swrm->master.bulk_write = swrm_bulk_write; - swrm->master.get_logical_dev_num = swrm_get_logical_dev_num; - swrm->master.connect_port = swrm_connect_port; - swrm->master.disconnect_port = swrm_disconnect_port; - swrm->master.slvdev_datapath_control = swrm_slvdev_datapath_control; - swrm->master.remove_from_group = swrm_remove_from_group; - swrm->master.device_wakeup_vote = swrm_device_wakeup_vote; - swrm->master.device_wakeup_unvote = swrm_device_wakeup_unvote; - swrm->master.dev.parent = &pdev->dev; - swrm->master.dev.of_node = pdev->dev.of_node; - swrm->master.num_port = 0; - swrm->rcmd_id = 0; - swrm->wcmd_id = 0; - swrm->slave_status = 0; - swrm->num_rx_chs = 0; - swrm->clk_ref_count = 0; - swrm->swr_irq_wakeup_capable = 0; - swrm->mclk_freq = MCLK_FREQ; - swrm->bus_clk = MCLK_FREQ; - swrm->dev_up = true; - swrm->state = SWR_MSTR_UP; - swrm->ipc_wakeup = false; - swrm->ipc_wakeup_triggered = false; - init_completion(&swrm->reset); - init_completion(&swrm->broadcast); - init_completion(&swrm->clk_off_complete); - mutex_init(&swrm->irq_lock); - mutex_init(&swrm->mlock); - mutex_init(&swrm->reslock); - mutex_init(&swrm->force_down_lock); - mutex_init(&swrm->iolock); - mutex_init(&swrm->clklock); - mutex_init(&swrm->devlock); - mutex_init(&swrm->pm_lock); - swrm->wlock_holders = 0; - swrm->pm_state = SWRM_PM_SLEEPABLE; - init_waitqueue_head(&swrm->pm_wq); - pm_qos_add_request(&swrm->pm_qos_req, - PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - for (i = 0 ; i < SWR_MSTR_PORT_LEN; i++) - INIT_LIST_HEAD(&swrm->mport_cfg[i].port_req_list); - - if (swrm->reg_irq) { - ret = swrm->reg_irq(swrm->handle, swr_mstr_interrupt, swrm, - SWR_IRQ_REGISTER); - if (ret) { - dev_err(&pdev->dev, "%s: IRQ register failed ret %d\n", - __func__, ret); - goto err_irq_fail; - } - } else { - swrm->irq = platform_get_irq_byname(pdev, "swr_master_irq"); - if (swrm->irq < 0) { - dev_err(swrm->dev, "%s() error getting irq hdle: %d\n", - __func__, swrm->irq); - goto err_irq_fail; - } - - ret = request_threaded_irq(swrm->irq, NULL, - swr_mstr_interrupt, - IRQF_TRIGGER_RISING | IRQF_ONESHOT, - "swr_master_irq", swrm); - if (ret) { - dev_err(swrm->dev, "%s: Failed to request irq %d\n", - __func__, ret); - goto err_irq_fail; - } - - } - /* Make inband tx interrupts as wakeup capable for slave irq */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,swr-mstr-irq-wakeup-capable", - &swrm->swr_irq_wakeup_capable); - if (ret) - dev_dbg(swrm->dev, "%s: swrm irq wakeup capable not defined\n", - __func__); - if (swrm->swr_irq_wakeup_capable) - irq_set_irq_wake(swrm->irq, 1); - ret = swr_register_master(&swrm->master); - if (ret) { - dev_err(&pdev->dev, "%s: error adding swr master\n", __func__); - goto err_mstr_fail; - } - - /* Add devices registered with board-info as the - * controller will be up now - */ - swr_master_add_boarddevices(&swrm->master); - mutex_lock(&swrm->mlock); - swrm_clk_request(swrm, true); - ret = swrm_master_init(swrm); - if (ret < 0) { - dev_err(&pdev->dev, - "%s: Error in master Initialization , err %d\n", - __func__, ret); - mutex_unlock(&swrm->mlock); - goto err_mstr_fail; - } - swrm->version = swr_master_read(swrm, SWRM_COMP_HW_VERSION); - - mutex_unlock(&swrm->mlock); - INIT_WORK(&swrm->wakeup_work, swrm_wakeup_work); - - if (pdev->dev.of_node) - of_register_swr_devices(&swrm->master); - - dbgswrm = swrm; - debugfs_swrm_dent = debugfs_create_dir(dev_name(&pdev->dev), 0); - if (!IS_ERR(debugfs_swrm_dent)) { - debugfs_peek = debugfs_create_file("swrm_peek", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_peek", &swrm_debug_ops); - - debugfs_poke = debugfs_create_file("swrm_poke", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_poke", &swrm_debug_ops); - - debugfs_reg_dump = debugfs_create_file("swrm_reg_dump", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_reg_dump", - &swrm_debug_ops); - } - - ret = device_init_wakeup(swrm->dev, true); - if (ret) { - dev_err(swrm->dev, "Device wakeup init failed: %d\n", ret); - goto err_irq_wakeup_fail; - } - - pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_active(&pdev->dev); - pm_runtime_enable(&pdev->dev); - pm_runtime_mark_last_busy(&pdev->dev); - - INIT_WORK(&swrm->dc_presence_work, swrm_notify_work_fn); - swrm->event_notifier.notifier_call = swrm_event_notify; - msm_aud_evt_register_client(&swrm->event_notifier); - - return 0; -err_irq_wakeup_fail: - device_init_wakeup(swrm->dev, false); -err_mstr_fail: - if (swrm->reg_irq) - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); - else if (swrm->irq) - free_irq(swrm->irq, swrm); -err_irq_fail: - mutex_destroy(&swrm->irq_lock); - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->force_down_lock); - mutex_destroy(&swrm->iolock); - mutex_destroy(&swrm->clklock); - mutex_destroy(&swrm->pm_lock); - pm_qos_remove_request(&swrm->pm_qos_req); - -err_pdata_fail: -err_memory_fail: - return ret; -} - -static int swrm_remove(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - if (swrm->reg_irq) - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); - else if (swrm->irq) - free_irq(swrm->irq, swrm); - else if (swrm->wake_irq > 0) - free_irq(swrm->wake_irq, swrm); - if (swrm->swr_irq_wakeup_capable) - irq_set_irq_wake(swrm->irq, 0); - cancel_work_sync(&swrm->wakeup_work); - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - swr_unregister_master(&swrm->master); - msm_aud_evt_unregister_client(&swrm->event_notifier); - device_init_wakeup(swrm->dev, false); - mutex_destroy(&swrm->irq_lock); - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->iolock); - mutex_destroy(&swrm->clklock); - mutex_destroy(&swrm->force_down_lock); - mutex_destroy(&swrm->pm_lock); - pm_qos_remove_request(&swrm->pm_qos_req); - devm_kfree(&pdev->dev, swrm); - return 0; -} - -static int swrm_clk_pause(struct swr_mstr_ctrl *swrm) -{ - u32 val; - - dev_dbg(swrm->dev, "%s: state: %d\n", __func__, swrm->state); - swr_master_write(swrm, SWRM_INTERRUPT_MASK_ADDR, 0x1FDFD); - val = swr_master_read(swrm, SWRM_MCP_CFG_ADDR); - val |= SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK; - swr_master_write(swrm, SWRM_MCP_CFG_ADDR, val); - - return 0; -} - -#ifdef CONFIG_PM -static int swrm_runtime_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - - dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - - if ((swrm->state == SWR_MSTR_DOWN) || - (swrm->state == SWR_MSTR_SSR && swrm->dev_up)) { - if (swrm->clk_stop_mode0_supp) { - if (swrm->wake_irq > 0) { - mutex_lock(&swrm->irq_lock); - if (!irqd_irq_disabled( - irq_get_irq_data(swrm->wake_irq))) - disable_irq_nosync(swrm->wake_irq); - mutex_unlock(&swrm->irq_lock); - } - if (swrm->ipc_wakeup) - msm_aud_evt_blocking_notifier_call_chain( - SWR_WAKE_IRQ_DEREGISTER, (void *)swrm); - } - - if (swrm_clk_request(swrm, true)) - goto exit; - if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) { - enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_up(swr_dev); - if (ret) { - dev_err(dev, - "%s: failed to wakeup swr dev %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - goto exit; - } - } - swr_master_write(swrm, SWRM_COMP_SW_RESET, 0x01); - swr_master_write(swrm, SWRM_COMP_SW_RESET, 0x01); - swrm_master_init(swrm); - /* wait for hw enumeration to complete */ - usleep_range(100, 105); - swrm_cmd_fifo_wr_cmd(swrm, 0x4, 0xF, 0x0, - SWRS_SCP_INT_STATUS_MASK_1); - - } else { - /*wake up from clock stop*/ - swr_master_write(swrm, SWRM_MCP_BUS_CTRL_ADDR, 0x2); - usleep_range(100, 105); - } - swrm->state = SWR_MSTR_UP; - } -exit: - pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); - mutex_unlock(&swrm->reslock); - return ret; -} - -static int swrm_runtime_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - int current_state = 0; - - dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - mutex_lock(&swrm->force_down_lock); - current_state = swrm->state; - mutex_unlock(&swrm->force_down_lock); - if ((current_state == SWR_MSTR_UP) || - (current_state == SWR_MSTR_SSR)) { - - if ((current_state != SWR_MSTR_SSR) && - swrm_is_port_en(&swrm->master)) { - dev_dbg(dev, "%s ports are enabled\n", __func__); - ret = -EBUSY; - goto exit; - } - if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) { - enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL); - swrm_clk_pause(swrm); - swr_master_write(swrm, SWRM_COMP_CFG_ADDR, 0x00); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_down(swr_dev); - if (ret) { - dev_err(dev, - "%s: failed to shutdown swr dev %d\n", - __func__, swr_dev->dev_num); - goto exit; - } - } - } else { - /* clock stop sequence */ - swrm_cmd_fifo_wr_cmd(swrm, 0x2, 0xF, 0xF, - SWRS_SCP_CONTROL); - usleep_range(100, 105); - } - swrm_clk_request(swrm, false); - - if (swrm->clk_stop_mode0_supp) { - if (swrm->wake_irq > 0) { - enable_irq(swrm->wake_irq); - } else if (swrm->ipc_wakeup) { - msm_aud_evt_blocking_notifier_call_chain( - SWR_WAKE_IRQ_REGISTER, (void *)swrm); - swrm->ipc_wakeup_triggered = false; - } - } - - } - /* Retain SSR state until resume */ - if (current_state != SWR_MSTR_SSR) - swrm->state = SWR_MSTR_DOWN; -exit: - mutex_unlock(&swrm->reslock); - return ret; -} -#endif /* CONFIG_PM */ - -static int swrm_device_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - - dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) { - ret = swrm_runtime_suspend(dev); - if (!ret) { - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - - return 0; -} - -static int swrm_device_down(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state); - - mutex_lock(&swrm->force_down_lock); - swrm->state = SWR_MSTR_SSR; - mutex_unlock(&swrm->force_down_lock); - - swrm_device_suspend(dev); - return 0; -} - -int swrm_register_wake_irq(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - int irq, dir_apps_irq; - - if (!swrm->ipc_wakeup) { - irq = of_get_named_gpio(swrm->dev->of_node, - "qcom,swr-wakeup-irq", 0); - if (gpio_is_valid(irq)) { - swrm->wake_irq = gpio_to_irq(irq); - if (swrm->wake_irq < 0) { - dev_err(swrm->dev, - "Unable to configure irq\n"); - return swrm->wake_irq; - } - } else { - dir_apps_irq = platform_get_irq_byname(swrm->pdev, - "swr_wake_irq"); - if (dir_apps_irq < 0) { - dev_err(swrm->dev, - "TLMM connect gpio not found\n"); - return -EINVAL; - } - swrm->wake_irq = dir_apps_irq; - } - ret = request_threaded_irq(swrm->wake_irq, NULL, - swrm_wakeup_interrupt, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - "swr_wake_irq", swrm); - if (ret) { - dev_err(swrm->dev, "%s: Failed to request irq %d\n", - __func__, ret); - return -EINVAL; - } - irq_set_irq_wake(swrm->wake_irq, 1); - } - return ret; -} - -/** - * swrm_wcd_notify - parent device can notify to soundwire master through - * this function - * @pdev: pointer to platform device structure - * @id: command id from parent to the soundwire master - * @data: data from parent device to soundwire master - */ -int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data) -{ - struct swr_mstr_ctrl *swrm; - int ret = 0; - struct swr_master *mstr; - struct swr_device *swr_dev; - - if (!pdev) { - pr_err("%s: pdev is NULL\n", __func__); - return -EINVAL; - } - swrm = platform_get_drvdata(pdev); - if (!swrm) { - dev_err(&pdev->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - mstr = &swrm->master; - - switch (id) { - case SWR_CLK_FREQ: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - if (swrm->mclk_freq != *(int *)data) { - dev_dbg(swrm->dev, "%s: freq change: force mstr down\n", __func__); - if (swrm->state == SWR_MSTR_DOWN) - dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n", - __func__, swrm->state); - else - swrm_device_suspend(&pdev->dev); - } - swrm->mclk_freq = *(int *)data; - swrm->bus_clk = swrm->mclk_freq; - mutex_unlock(&swrm->mlock); - } - break; - case SWR_DEVICE_SSR_DOWN: - mutex_lock(&swrm->devlock); - swrm->dev_up = false; - mutex_unlock(&swrm->devlock); - mutex_lock(&swrm->reslock); - swrm->state = SWR_MSTR_SSR; - mutex_unlock(&swrm->reslock); - break; - case SWR_DEVICE_SSR_UP: - /* wait for clk voting to be zero */ - reinit_completion(&swrm->clk_off_complete); - if (swrm->clk_ref_count && - !wait_for_completion_timeout(&swrm->clk_off_complete, - msecs_to_jiffies(5000))) - dev_err(swrm->dev, "%s: clock voting not zero\n", - __func__); - - mutex_lock(&swrm->devlock); - swrm->dev_up = true; - mutex_unlock(&swrm->devlock); - break; - case SWR_DEVICE_DOWN: - dev_dbg(swrm->dev, "%s: swr master down called\n", __func__); - mutex_lock(&swrm->mlock); - if (swrm->state == SWR_MSTR_DOWN) - dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n", - __func__, swrm->state); - else - swrm_device_down(&pdev->dev); - mutex_unlock(&swrm->mlock); - break; - case SWR_DEVICE_UP: - dev_dbg(swrm->dev, "%s: swr master up called\n", __func__); - mutex_lock(&swrm->devlock); - if (!swrm->dev_up) { - dev_dbg(swrm->dev, "SSR not complete yet\n"); - mutex_unlock(&swrm->devlock); - return -EBUSY; - } - mutex_unlock(&swrm->devlock); - mutex_lock(&swrm->mlock); - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_get_sync(&pdev->dev); - mutex_lock(&swrm->reslock); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_reset_device(swr_dev); - if (ret) { - dev_err(swrm->dev, - "%s: failed to reset swr device %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - } - } - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_put_autosuspend(&pdev->dev); - mutex_unlock(&swrm->reslock); - mutex_unlock(&swrm->mlock); - break; - case SWR_SET_NUM_RX_CH: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - swrm->num_rx_chs = *(int *)data; - if ((swrm->num_rx_chs > 1) && !swrm->num_cfg_devs) { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_BROADCAST); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } else { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_GROUP_NONE); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } - mutex_unlock(&swrm->mlock); - } - break; - case SWR_REGISTER_WAKE_IRQ: - if (!data) { - dev_err(swrm->dev, "%s: reg wake irq data is NULL\n", - __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - swrm->ipc_wakeup = *(u32 *)data; - ret = swrm_register_wake_irq(swrm); - if (ret) - dev_err(swrm->dev, "%s: register wake_irq failed\n", - __func__); - mutex_unlock(&swrm->mlock); - } - break; - default: - dev_err(swrm->dev, "%s: swr master unknown id %d\n", - __func__, id); - break; - } - return ret; -} -EXPORT_SYMBOL(swrm_wcd_notify); - -/* - * swrm_pm_cmpxchg: - * Check old state and exchange with pm new state - * if old state matches with current state - * - * @swrm: pointer to wcd core resource - * @o: pm old state - * @n: pm new state - * - * Returns old state - */ -static enum swrm_pm_state swrm_pm_cmpxchg( - struct swr_mstr_ctrl *swrm, - enum swrm_pm_state o, - enum swrm_pm_state n) -{ - enum swrm_pm_state old; - - if (!swrm) - return o; - - mutex_lock(&swrm->pm_lock); - old = swrm->pm_state; - if (old == o) - swrm->pm_state = n; - mutex_unlock(&swrm->pm_lock); - - return old; -} - -static bool swrm_lock_sleep(struct swr_mstr_ctrl *swrm) -{ - enum swrm_pm_state os; - - /* - * swrm_{lock/unlock}_sleep will be called by swr irq handler - * and slave wake up requests.. - * - * If system didn't resume, we can simply return false so - * IRQ handler can return without handling IRQ. - */ - mutex_lock(&swrm->pm_lock); - if (swrm->wlock_holders++ == 0) { - dev_dbg(swrm->dev, "%s: holding wake lock\n", __func__); - pm_qos_update_request(&swrm->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - pm_stay_awake(swrm->dev); - } - mutex_unlock(&swrm->pm_lock); - - if (!wait_event_timeout(swrm->pm_wq, - ((os = swrm_pm_cmpxchg(swrm, - SWRM_PM_SLEEPABLE, - SWRM_PM_AWAKE)) == - SWRM_PM_SLEEPABLE || - (os == SWRM_PM_AWAKE)), - msecs_to_jiffies( - SWRM_SYSTEM_RESUME_TIMEOUT_MS))) { - dev_err(swrm->dev, "%s: system didn't resume within %dms, s %d, w %d\n", - __func__, SWRM_SYSTEM_RESUME_TIMEOUT_MS, swrm->pm_state, - swrm->wlock_holders); - swrm_unlock_sleep(swrm); - return false; - } - wake_up_all(&swrm->pm_wq); - return true; -} - -static void swrm_unlock_sleep(struct swr_mstr_ctrl *swrm) -{ - mutex_lock(&swrm->pm_lock); - if (--swrm->wlock_holders == 0) { - dev_dbg(swrm->dev, "%s: releasing wake lock pm_state %d -> %d\n", - __func__, swrm->pm_state, SWRM_PM_SLEEPABLE); - /* - * if swrm_lock_sleep failed, pm_state would be still - * swrm_PM_ASLEEP, don't overwrite - */ - if (likely(swrm->pm_state == SWRM_PM_AWAKE)) - swrm->pm_state = SWRM_PM_SLEEPABLE; - pm_qos_update_request(&swrm->pm_qos_req, - PM_QOS_DEFAULT_VALUE); - pm_relax(swrm->dev); - } - mutex_unlock(&swrm->pm_lock); - wake_up_all(&swrm->pm_wq); -} - -#ifdef CONFIG_PM_SLEEP -static int swrm_suspend(struct device *dev) -{ - int ret = -EBUSY; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system suspend, state: %d\n", __func__, swrm->state); - - mutex_lock(&swrm->pm_lock); - - if (swrm->pm_state == SWRM_PM_SLEEPABLE) { - dev_dbg(swrm->dev, "%s: suspending system, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - swrm->pm_state = SWRM_PM_ASLEEP; - } else if (swrm->pm_state == SWRM_PM_AWAKE) { - /* - * unlock to wait for pm_state == SWRM_PM_SLEEPABLE - * then set to SWRM_PM_ASLEEP - */ - dev_dbg(swrm->dev, "%s: waiting to suspend system, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - mutex_unlock(&swrm->pm_lock); - if (!(wait_event_timeout(swrm->pm_wq, swrm_pm_cmpxchg( - swrm, SWRM_PM_SLEEPABLE, - SWRM_PM_ASLEEP) == - SWRM_PM_SLEEPABLE, - msecs_to_jiffies( - SWRM_SYS_SUSPEND_WAIT)))) { - dev_dbg(swrm->dev, "%s: suspend failed state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - return -EBUSY; - } else { - dev_dbg(swrm->dev, - "%s: done, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - } - mutex_lock(&swrm->pm_lock); - } else if (swrm->pm_state == SWRM_PM_ASLEEP) { - dev_dbg(swrm->dev, "%s: system is already suspended, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - } - - mutex_unlock(&swrm->pm_lock); - - if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) { - ret = swrm_runtime_suspend(dev); - if (!ret) { - /* - * Synchronize runtime-pm and system-pm states: - * At this point, we are already suspended. If - * runtime-pm still thinks its active, then - * make sure its status is in sync with HW - * status. The three below calls let the - * runtime-pm know that we are suspended - * already without re-invoking the suspend - * callback - */ - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - if (ret == -EBUSY) { - /* - * There is a possibility that some audio stream is active - * during suspend. We dont want to return suspend failure in - * that case so that display and relevant components can still - * go to suspend. - * If there is some other error, then it should be passed-on - * to system level suspend - */ - ret = 0; - } - return ret; -} - -static int swrm_resume(struct device *dev) -{ - int ret = 0; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system resume, state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspend(dev)) { - ret = swrm_runtime_resume(dev); - if (!ret) { - pm_runtime_mark_last_busy(dev); - pm_request_autosuspend(dev); - } - } - mutex_lock(&swrm->pm_lock); - if (swrm->pm_state == SWRM_PM_ASLEEP) { - dev_dbg(swrm->dev, - "%s: resuming system, state %d, wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - swrm->pm_state = SWRM_PM_SLEEPABLE; - } else { - dev_dbg(swrm->dev, "%s: system is already awake, state %d wlock %d\n", - __func__, swrm->pm_state, - swrm->wlock_holders); - } - mutex_unlock(&swrm->pm_lock); - wake_up_all(&swrm->pm_wq); - - return ret; -} -#endif /* CONFIG_PM_SLEEP */ - -static const struct dev_pm_ops swrm_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - swrm_suspend, - swrm_resume - ) - SET_RUNTIME_PM_OPS( - swrm_runtime_suspend, - swrm_runtime_resume, - NULL - ) -}; - -static const struct of_device_id swrm_dt_match[] = { - { - .compatible = "qcom,swr-mstr", - }, - {} -}; - -static struct platform_driver swr_mstr_driver = { - .probe = swrm_probe, - .remove = swrm_remove, - .driver = { - .name = SWR_WCD_NAME, - .owner = THIS_MODULE, - .pm = &swrm_dev_pm_ops, - .of_match_table = swrm_dt_match, - }, -}; - -static int __init swrm_init(void) -{ - return platform_driver_register(&swr_mstr_driver); -} -module_init(swrm_init); - -static void __exit swrm_exit(void) -{ - platform_driver_unregister(&swr_mstr_driver); -} -module_exit(swrm_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SoundWire Master Controller"); -MODULE_ALIAS("platform:swr-mstr"); diff --git a/techpack/audio/soc/swr-mstr-ctrl.h b/techpack/audio/soc/swr-mstr-ctrl.h deleted file mode 100644 index 76bdb3eb90f3..000000000000 --- a/techpack/audio/soc/swr-mstr-ctrl.h +++ /dev/null @@ -1,178 +0,0 @@ -/* Copyright (c) 2015-2019, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _SWR_WCD_CTRL_H -#define _SWR_WCD_CTRL_H -#include -#include -#include -#include - -#define SWR_ROW_48 0 -#define SWR_ROW_50 1 -#define SWR_ROW_64 2 -#define SWR_MAX_COL 7 /* Cols = 16 */ -#define SWR_MIN_COL 0 /* Cols = 2 */ - -#define SWR_WCD_NAME "swr-wcd" - -#define SWR_MSTR_PORT_LEN 8 /* Number of master ports */ - -#define SWRM_VERSION_1_0 0x01010000 -#define SWRM_VERSION_1_2 0x01030000 -#define SWRM_VERSION_1_3 0x01040000 -#define SWRM_VERSION_1_5 0x01050000 - -#define SWR_MAX_CH_PER_PORT 8 - -#define SWR_MAX_SLAVE_DEVICES 11 - -enum { - SWR_MSTR_PAUSE, - SWR_MSTR_RESUME, - SWR_MSTR_UP, - SWR_MSTR_DOWN, - SWR_MSTR_SSR, -}; - -enum swrm_pm_state { - SWRM_PM_SLEEPABLE, - SWRM_PM_AWAKE, - SWRM_PM_ASLEEP, -}; - -enum { - SWR_IRQ_FREE, - SWR_IRQ_REGISTER, -}; - -enum { - SWR_DAC_PORT, - SWR_COMP_PORT, - SWR_BOOST_PORT, - SWR_VISENSE_PORT, -}; - -struct usecase { - u8 num_port; - u8 num_ch; - u32 chrate; -}; - -struct port_params { - u8 si; - u8 off1; - u8 off2; - u8 hstart;/* head start */ - u8 hstop; /* head stop */ - u8 wd_len;/* word length */ - u8 bp_mode; /* block pack mode */ - u8 bgp_ctrl;/* block group control */ - u8 lane_ctrl;/* lane to be used */ -}; - -struct swrm_mports { - struct list_head port_req_list; - bool port_en; - u8 ch_en; - u8 req_ch; - u8 ch_rate; - u8 offset1; - u8 offset2; - u8 sinterval; - u8 hstart; - u8 hstop; - u8 blk_grp_count; - u8 blk_pack_mode; - u8 word_length; - u8 lane_ctrl; -}; - -struct swrm_port_type { - u8 port_type; - u8 ch_mask; -}; - -struct swr_ctrl_platform_data { - void *handle; /* holds priv data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); -}; - -struct swr_mstr_ctrl { - struct swr_master master; - struct device *dev; - struct resource *supplies; - struct clk *mclk; - int clk_ref_count; - struct completion clk_off_complete; - struct completion reset; - struct completion broadcast; - struct mutex clklock; - struct mutex iolock; - struct mutex devlock; - struct mutex mlock; - struct mutex reslock; - struct mutex pm_lock; - struct mutex irq_lock; - u32 swrm_base_reg; - char __iomem *swrm_dig_base; - u8 rcmd_id; - u8 wcmd_id; - u32 master_id; - void *handle; /* SWR Master handle from client for read and writes */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); - int irq; - int wake_irq; - int version; - int mclk_freq; - int bus_clk; - u32 num_dev; - int slave_status; - struct swrm_mports mport_cfg[SWR_MAX_MSTR_PORT_NUM]; - struct list_head port_req_list; - unsigned long port_req_pending; - int state; - struct platform_device *pdev; - int num_rx_chs; - u8 num_cfg_devs; - struct mutex force_down_lock; - int force_down_state; - struct notifier_block event_notifier; - struct work_struct dc_presence_work; - u8 num_ports; - struct swrm_port_type - port_mapping[SWR_MSTR_PORT_LEN][SWR_MAX_CH_PER_PORT]; - int swr_irq; - u32 clk_stop_mode0_supp; - struct work_struct wakeup_work; - u32 ipc_wakeup; - bool dev_up; - bool ipc_wakeup_triggered; - struct pm_qos_request pm_qos_req; - enum swrm_pm_state pm_state; - wait_queue_head_t pm_wq; - int wlock_holders; - u32 intr_mask; - u32 swr_irq_wakeup_capable; -}; - -#endif /* _SWR_WCD_CTRL_H */ diff --git a/techpack/audio/soc/swr-wcd-ctrl.c b/techpack/audio/soc/swr-wcd-ctrl.c deleted file mode 100644 index dd5e4c5848e0..000000000000 --- a/techpack/audio/soc/swr-wcd-ctrl.c +++ /dev/null @@ -1,1963 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "swrm_registers.h" -#include "swr-wcd-ctrl.h" - -#define SWR_BROADCAST_CMD_ID 0x0F -#define SWR_AUTO_SUSPEND_DELAY 3 /* delay in sec */ -#define SWR_DEV_ID_MASK 0xFFFFFFFF -#define SWR_REG_VAL_PACK(data, dev, id, reg) \ - ((reg) | ((id) << 16) | ((dev) << 20) | ((data) << 24)) - -/* pm runtime auto suspend timer in msecs */ -static int auto_suspend_timer = SWR_AUTO_SUSPEND_DELAY * 1000; -module_param(auto_suspend_timer, int, 0664); -MODULE_PARM_DESC(auto_suspend_timer, "timer for auto suspend"); - -static u8 mstr_ports[] = {100, 101, 102, 103, 104, 105, 106, 107}; -static u8 mstr_port_type[] = {SWR_DAC_PORT, SWR_COMP_PORT, SWR_BOOST_PORT, - SWR_DAC_PORT, SWR_COMP_PORT, SWR_BOOST_PORT, - SWR_VISENSE_PORT, SWR_VISENSE_PORT}; - -struct usecase uc[] = { - {0, 0, 0}, /* UC0: no ports */ - {1, 1, 2400}, /* UC1: Spkr */ - {1, 4, 600}, /* UC2: Compander */ - {1, 2, 300}, /* UC3: Smart Boost */ - {1, 2, 1200}, /* UC4: VI Sense */ - {4, 9, 4500}, /* UC5: Spkr + Comp + SB + VI */ - {8, 18, 9000}, /* UC6: 2*(Spkr + Comp + SB + VI) */ - {2, 2, 4800}, /* UC7: 2*Spkr */ - {2, 5, 3000}, /* UC8: Spkr + Comp */ - {4, 10, 6000}, /* UC9: 2*(Spkr + Comp) */ - {3, 7, 3300}, /* UC10: Spkr + Comp + SB */ - {6, 14, 6600}, /* UC11: 2*(Spkr + Comp + SB) */ - {2, 3, 2700}, /* UC12: Spkr + SB */ - {4, 6, 5400}, /* UC13: 2*(Spkr + SB) */ - {3, 5, 3900}, /* UC14: Spkr + SB + VI */ - {6, 10, 7800}, /* UC15: 2*(Spkr + SB + VI) */ - {2, 3, 3600}, /* UC16: Spkr + VI */ - {4, 6, 7200}, /* UC17: 2*(Spkr + VI) */ - {3, 7, 4200}, /* UC18: Spkr + Comp + VI */ - {6, 14, 8400}, /* UC19: 2*(Spkr + Comp + VI) */ -}; -#define MAX_USECASE ARRAY_SIZE(uc) - -struct port_params pp[MAX_USECASE][SWR_MSTR_PORT_LEN] = { - /* UC 0 */ - { - {0, 0, 0}, - }, - /* UC 1 */ - { - {7, 1, 0}, - }, - /* UC 2 */ - { - {31, 2, 0}, - }, - /* UC 3 */ - { - {63, 12, 31}, - }, - /* UC 4 */ - { - {15, 7, 0}, - }, - /* UC 5 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - {15, 7, 0}, - }, - /* UC 6 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - {15, 7, 0}, - {7, 6, 0}, - {31, 18, 0}, - {63, 13, 31}, - {15, 10, 0}, - }, - /* UC 7 */ - { - {7, 1, 0}, - {7, 6, 0}, - - }, - /* UC 8 */ - { - {7, 1, 0}, - {31, 2, 0}, - }, - /* UC 9 */ - { - {7, 1, 0}, - {31, 2, 0}, - {7, 6, 0}, - {31, 18, 0}, - }, - /* UC 10 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - }, - /* UC 11 */ - { - {7, 1, 0}, - {31, 2, 0}, - {63, 12, 31}, - {7, 6, 0}, - {31, 18, 0}, - {63, 13, 31}, - }, - /* UC 12 */ - { - {7, 1, 0}, - {63, 12, 31}, - }, - /* UC 13 */ - { - {7, 1, 0}, - {63, 12, 31}, - {7, 6, 0}, - {63, 13, 31}, - }, - /* UC 14 */ - { - {7, 1, 0}, - {63, 12, 31}, - {15, 7, 0}, - }, - /* UC 15 */ - { - {7, 1, 0}, - {63, 12, 31}, - {15, 7, 0}, - {7, 6, 0}, - {63, 13, 31}, - {15, 10, 0}, - }, - /* UC 16 */ - { - {7, 1, 0}, - {15, 7, 0}, - }, - /* UC 17 */ - { - {7, 1, 0}, - {15, 7, 0}, - {7, 6, 0}, - {15, 10, 0}, - }, - /* UC 18 */ - { - {7, 1, 0}, - {31, 2, 0}, - {15, 7, 0}, - }, - /* UC 19 */ - { - {7, 1, 0}, - {31, 2, 0}, - {15, 7, 0}, - {7, 6, 0}, - {31, 18, 0}, - {15, 10, 0}, - }, -}; - -enum { - SWR_NOT_PRESENT, /* Device is detached/not present on the bus */ - SWR_ATTACHED_OK, /* Device is attached */ - SWR_ALERT, /* Device alters master for any interrupts */ - SWR_RESERVED, /* Reserved */ -}; - -#define SWRM_MAX_PORT_REG 40 -#define SWRM_MAX_INIT_REG 8 - -#define SWR_MSTR_MAX_REG_ADDR 0x1740 -#define SWR_MSTR_START_REG_ADDR 0x00 -#define SWR_MSTR_MAX_BUF_LEN 32 -#define BYTES_PER_LINE 12 -#define SWR_MSTR_RD_BUF_LEN 8 -#define SWR_MSTR_WR_BUF_LEN 32 - -static void swrm_copy_data_port_config(struct swr_master *master, - u8 inactive_bank); -static struct swr_mstr_ctrl *dbgswrm; -static struct dentry *debugfs_swrm_dent; -static struct dentry *debugfs_peek; -static struct dentry *debugfs_poke; -static struct dentry *debugfs_reg_dump; -static unsigned int read_data; - - -static bool swrm_is_msm_variant(int val) -{ - return (val == SWRM_VERSION_1_3); -} - -static int swrm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static int get_parameters(char *buf, u32 *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (kstrtou32(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } else - return -EINVAL; - } - return 0; -} - -static ssize_t swrm_reg_show(char __user *ubuf, size_t count, - loff_t *ppos) -{ - int i, reg_val, len; - ssize_t total = 0; - char tmp_buf[SWR_MSTR_MAX_BUF_LEN]; - - if (!ubuf || !ppos) - return 0; - - for (i = (((int) *ppos / BYTES_PER_LINE) + SWR_MSTR_START_REG_ADDR); - i <= SWR_MSTR_MAX_REG_ADDR; i += 4) { - reg_val = dbgswrm->read(dbgswrm->handle, i); - len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i, reg_val); - if (len < 0) { - pr_err("%s: fail to fill the buffer\n", __func__); - total = -EFAULT; - goto copy_err; - } - - if ((total + len) >= count - 1) - break; - if (copy_to_user((ubuf + total), tmp_buf, len)) { - pr_err("%s: fail to copy reg dump\n", __func__); - total = -EFAULT; - goto copy_err; - } - *ppos += len; - total += len; - } - -copy_err: - return total; -} - -static ssize_t swrm_debug_read(struct file *file, char __user *ubuf, - size_t count, loff_t *ppos) -{ - char lbuf[SWR_MSTR_RD_BUF_LEN]; - char *access_str; - ssize_t ret_cnt; - - if (!count || !file || !ppos || !ubuf) - return -EINVAL; - - access_str = file->private_data; - if (*ppos < 0) - return -EINVAL; - - if (!strcmp(access_str, "swrm_peek")) { - snprintf(lbuf, sizeof(lbuf), "0x%x\n", read_data); - ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf, - strnlen(lbuf, 7)); - } else if (!strcmp(access_str, "swrm_reg_dump")) { - ret_cnt = swrm_reg_show(ubuf, count, ppos); - } else { - pr_err("%s: %s not permitted to read\n", __func__, access_str); - ret_cnt = -EPERM; - } - return ret_cnt; -} - -static ssize_t swrm_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char lbuf[SWR_MSTR_WR_BUF_LEN]; - int rc; - u32 param[5]; - char *access_str; - - if (!filp || !ppos || !ubuf) - return -EINVAL; - - access_str = filp->private_data; - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - - rc = copy_from_user(lbuf, ubuf, cnt); - if (rc) - return -EFAULT; - - lbuf[cnt] = '\0'; - if (!strcmp(access_str, "swrm_poke")) { - /* write */ - rc = get_parameters(lbuf, param, 2); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && - (param[1] <= 0xFFFFFFFF) && - (rc == 0)) - rc = dbgswrm->write(dbgswrm->handle, param[0], - param[1]); - else - rc = -EINVAL; - } else if (!strcmp(access_str, "swrm_peek")) { - /* read */ - rc = get_parameters(lbuf, param, 1); - if ((param[0] <= SWR_MSTR_MAX_REG_ADDR) && (rc == 0)) - read_data = dbgswrm->read(dbgswrm->handle, param[0]); - else - rc = -EINVAL; - } - if (rc == 0) - rc = cnt; - else - pr_err("%s: rc = %d\n", __func__, rc); - - return rc; -} - -static const struct file_operations swrm_debug_ops = { - .open = swrm_debug_open, - .write = swrm_debug_write, - .read = swrm_debug_read, -}; - -static int swrm_set_ch_map(struct swr_mstr_ctrl *swrm, void *data) -{ - struct swr_mstr_port *pinfo = (struct swr_mstr_port *)data; - - swrm->mstr_port = kzalloc(sizeof(struct swr_mstr_port), GFP_KERNEL); - if (swrm->mstr_port == NULL) - return -ENOMEM; - swrm->mstr_port->num_port = pinfo->num_port; - swrm->mstr_port->port = kzalloc((pinfo->num_port * sizeof(u8)), - GFP_KERNEL); - if (!swrm->mstr_port->port) { - kfree(swrm->mstr_port); - swrm->mstr_port = NULL; - return -ENOMEM; - } - memcpy(swrm->mstr_port->port, pinfo->port, pinfo->num_port); - return 0; -} - -static bool swrm_is_port_en(struct swr_master *mstr) -{ - return !!(mstr->num_port); -} - -static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable) -{ - if (!swrm->clk || !swrm->handle) - return -EINVAL; - - if (enable) { - swrm->clk_ref_count++; - if (swrm->clk_ref_count == 1) { - swrm->clk(swrm->handle, true); - swrm->state = SWR_MSTR_UP; - } - } else if (--swrm->clk_ref_count == 0) { - swrm->clk(swrm->handle, false); - swrm->state = SWR_MSTR_DOWN; - } else if (swrm->clk_ref_count < 0) { - pr_err("%s: swrm clk count mismatch\n", __func__); - swrm->clk_ref_count = 0; - } - return 0; -} - -static int swrm_get_port_config(struct swr_master *master) -{ - u32 ch_rate = 0; - u32 num_ch = 0; - int i, uc_idx; - u32 portcount = 0; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - if (master->port[i].port_en) { - ch_rate += master->port[i].ch_rate; - num_ch += master->port[i].num_ch; - portcount++; - } - } - for (i = 0; i < ARRAY_SIZE(uc); i++) { - if ((uc[i].num_port == portcount) && - (uc[i].num_ch == num_ch) && - (uc[i].chrate == ch_rate)) { - uc_idx = i; - break; - } - } - - if (i >= ARRAY_SIZE(uc)) { - dev_err(&master->dev, - "%s: usecase port:%d, num_ch:%d, chrate:%d not found\n", - __func__, master->num_port, num_ch, ch_rate); - return -EINVAL; - } - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - if (master->port[i].port_en) { - master->port[i].sinterval = pp[uc_idx][i].si; - master->port[i].offset1 = pp[uc_idx][i].off1; - master->port[i].offset2 = pp[uc_idx][i].off2; - } - } - return 0; -} - -static int swrm_get_master_port(u8 *mstr_port_id, u8 slv_port_id) -{ - int i; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - if (mstr_ports[i] == slv_port_id) { - *mstr_port_id = i; - return 0; - } - } - return -EINVAL; -} - -static u32 swrm_get_packed_reg_val(u8 *cmd_id, u8 cmd_data, - u8 dev_addr, u16 reg_addr) -{ - u32 val; - u8 id = *cmd_id; - - if (id != SWR_BROADCAST_CMD_ID) { - if (id < 14) - id += 1; - else - id = 0; - *cmd_id = id; - } - val = SWR_REG_VAL_PACK(cmd_data, dev_addr, id, reg_addr); - - return val; -} - -static int swrm_cmd_fifo_rd_cmd(struct swr_mstr_ctrl *swrm, int *cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr, - u32 len) -{ - u32 val; - int ret = 0; - - val = swrm_get_packed_reg_val(&swrm->rcmd_id, len, dev_addr, reg_addr); - ret = swrm->write(swrm->handle, SWRM_CMD_FIFO_RD_CMD, val); - if (ret < 0) { - dev_err(swrm->dev, "%s: reg 0x%x write failed, err:%d\n", - __func__, val, ret); - goto err; - } - *cmd_data = swrm->read(swrm->handle, SWRM_CMD_FIFO_RD_FIFO_ADDR); - dev_dbg(swrm->dev, - "%s: reg: 0x%x, cmd_id: 0x%x, dev_id: 0x%x, cmd_data: 0x%x\n", - __func__, reg_addr, cmd_id, dev_addr, *cmd_data); -err: - return ret; -} - -static int swrm_cmd_fifo_wr_cmd(struct swr_mstr_ctrl *swrm, u8 cmd_data, - u8 dev_addr, u8 cmd_id, u16 reg_addr) -{ - u32 val; - int ret = 0; - - if (!cmd_id) - val = swrm_get_packed_reg_val(&swrm->wcmd_id, cmd_data, - dev_addr, reg_addr); - else - val = swrm_get_packed_reg_val(&cmd_id, cmd_data, - dev_addr, reg_addr); - - dev_dbg(swrm->dev, - "%s: reg: 0x%x, cmd_id: 0x%x, dev_id: 0x%x, cmd_data: 0x%x\n", - __func__, reg_addr, cmd_id, dev_addr, cmd_data); - ret = swrm->write(swrm->handle, SWRM_CMD_FIFO_WR_CMD, val); - if (ret < 0) { - dev_err(swrm->dev, "%s: reg 0x%x write failed, err:%d\n", - __func__, val, ret); - goto err; - } - if (cmd_id == 0xF) { - /* - * sleep for 10ms for MSM soundwire variant to allow broadcast - * command to complete. - */ - if (swrm_is_msm_variant(swrm->version)) - usleep_range(10000, 10100); - else - wait_for_completion_timeout(&swrm->broadcast, - (2 * HZ/10)); - } -err: - return ret; -} - -static int swrm_read(struct swr_master *master, u8 dev_num, u16 reg_addr, - void *buf, u32 len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int val; - u8 *reg_val = (u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - - if (dev_num) - ret = swrm_cmd_fifo_rd_cmd(swrm, &val, dev_num, 0, reg_addr, - len); - else - val = swrm->read(swrm->handle, reg_addr); - - if (!ret) - *reg_val = (u8)val; - - pm_runtime_mark_last_busy(&swrm->pdev->dev); - - return ret; -} - -static int swrm_write(struct swr_master *master, u8 dev_num, u16 reg_addr, - const void *buf) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - u8 reg_val = *(u8 *)buf; - - if (!swrm) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - - if (dev_num) - ret = swrm_cmd_fifo_wr_cmd(swrm, reg_val, dev_num, 0, reg_addr); - else - ret = swrm->write(swrm->handle, reg_addr, reg_val); - - pm_runtime_mark_last_busy(&swrm->pdev->dev); - - return ret; -} - -static int swrm_bulk_write(struct swr_master *master, u8 dev_num, void *reg, - const void *buf, size_t len) -{ - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int ret = 0; - int i; - u32 *val; - u32 *swr_fifo_reg; - - if (!swrm || !swrm->handle) { - dev_err(&master->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - if (len <= 0) - return -EINVAL; - - if (dev_num) { - swr_fifo_reg = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!swr_fifo_reg) { - ret = -ENOMEM; - goto err; - } - val = kcalloc(len, sizeof(u32), GFP_KERNEL); - if (!val) { - ret = -ENOMEM; - goto mem_fail; - } - - for (i = 0; i < len; i++) { - val[i] = swrm_get_packed_reg_val(&swrm->wcmd_id, - ((u8 *)buf)[i], - dev_num, - ((u16 *)reg)[i]); - swr_fifo_reg[i] = SWRM_CMD_FIFO_WR_CMD; - } - ret = swrm->bulk_write(swrm->handle, swr_fifo_reg, val, len); - if (ret) { - dev_err(&master->dev, "%s: bulk write failed\n", - __func__); - ret = -EINVAL; - } - } else { - dev_err(&master->dev, - "%s: No support of Bulk write for master regs\n", - __func__); - ret = -EINVAL; - goto err; - } - kfree(val); -mem_fail: - kfree(swr_fifo_reg); -err: - pm_runtime_mark_last_busy(&swrm->pdev->dev); - return ret; -} - -static u8 get_inactive_bank_num(struct swr_mstr_ctrl *swrm) -{ - return (swrm->read(swrm->handle, SWRM_MCP_STATUS) & - SWRM_MCP_STATUS_BANK_NUM_MASK) ? 0 : 1; -} - -static void enable_bank_switch(struct swr_mstr_ctrl *swrm, u8 bank, - u8 row, u8 col) -{ - /* apply div2 setting for inactive bank before bank switch */ - swrm_cmd_fifo_wr_cmd(swrm, 0x01, 0xF, 0x00, - SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(bank)); - - swrm_cmd_fifo_wr_cmd(swrm, ((row << 3) | col), 0xF, 0xF, - SWRS_SCP_FRAME_CTRL_BANK(bank)); -} - -static struct swr_port_info *swrm_get_port(struct swr_master *master, - u8 port_id) -{ - int i; - struct swr_port_info *port = NULL; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - port = &master->port[i]; - if (port->slave_port_id == port_id) { - dev_dbg(&master->dev, "%s: port_id: %d, index: %d\n", - __func__, port_id, i); - return port; - } - } - - return NULL; -} - -static struct swr_port_info *swrm_get_avail_port(struct swr_master *master) -{ - int i; - struct swr_port_info *port = NULL; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - port = &master->port[i]; - if (port->port_en) - continue; - - dev_dbg(&master->dev, "%s: port_id: %d, index: %d\n", - __func__, port->slave_port_id, i); - return port; - } - - return NULL; -} - -static struct swr_port_info *swrm_get_enabled_port(struct swr_master *master, - u8 port_id) -{ - int i; - struct swr_port_info *port = NULL; - - for (i = 0; i < SWR_MSTR_PORT_LEN; i++) { - port = &master->port[i]; - if ((port->slave_port_id == port_id) && (port->port_en == true)) - break; - } - if (i == SWR_MSTR_PORT_LEN) - port = NULL; - return port; -} - -static bool swrm_remove_from_group(struct swr_master *master) -{ - struct swr_device *swr_dev; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - bool is_removed = false; - - if (!swrm) - goto end; - - mutex_lock(&swrm->mlock); - if ((swrm->num_rx_chs > 1) && - (swrm->num_rx_chs == swrm->num_cfg_devs)) { - list_for_each_entry(swr_dev, &master->devices, - dev_list) { - swr_dev->group_id = SWR_GROUP_NONE; - master->gr_sid = 0; - } - is_removed = true; - } - mutex_unlock(&swrm->mlock); - -end: - return is_removed; -} - -static void swrm_cleanup_disabled_data_ports(struct swr_master *master, - u8 bank) -{ - u32 value; - struct swr_port_info *port; - int i; - int port_type; - struct swrm_mports *mport, *mport_next = NULL; - int port_disable_cnt = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - mport = list_first_entry_or_null(&swrm->mport_list, - struct swrm_mports, - list); - if (!mport) { - dev_err(swrm->dev, "%s: list is empty\n", __func__); - return; - } - - for (i = 0; i < master->num_port; i++) { - port = swrm_get_port(master, mstr_ports[mport->id]); - if (!port || port->ch_en) - goto inc_loop; - - port_disable_cnt++; - port_type = mstr_port_type[mport->id]; - value = ((port->ch_en) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - value |= ((port->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((port->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= port->sinterval; - - swrm->write(swrm->handle, - SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank), - value); - swrm_cmd_fifo_wr_cmd(swrm, 0x00, port->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank)); - - dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n", - __func__, mport->id, - (SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank)), value); - -inc_loop: - mport_next = list_next_entry(mport, list); - if (port && !port->ch_en) { - list_del(&mport->list); - kfree(mport); - } - if (!mport_next) { - dev_err(swrm->dev, "%s: end of list\n", __func__); - break; - } - mport = mport_next; - } - master->num_port -= port_disable_cnt; - - dev_dbg(swrm->dev, "%s:disable ports: %d, active ports (rem): %d\n", - __func__, port_disable_cnt, master->num_port); -} - -static int swrm_slvdev_datapath_control(struct swr_master *master, - bool enable) -{ - u8 bank; - u32 value, n_col; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - int mask = (SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK | - SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_BMSK); - u8 inactive_bank; - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return 0; - } - - bank = get_inactive_bank_num(swrm); - - dev_dbg(swrm->dev, "%s: enable: %d, cfg_devs: %d\n", - __func__, enable, swrm->num_cfg_devs); - - if (enable) { - /* set Row = 48 and col = 16 */ - n_col = SWR_MAX_COL; - } else { - /* - * Do not change to 48x2 if number of channels configured - * as stereo and if disable datapath is called for the - * first slave device - */ - if (swrm->num_cfg_devs > 0) - n_col = SWR_MAX_COL; - else - n_col = SWR_MIN_COL; - - /* - * All ports are already disabled, no need to perform - * bank-switch and copy operation. This case can arise - * when speaker channels are enabled in stereo mode with - * BROADCAST and disabled in GROUP_NONE - */ - if (master->num_port == 0) - return 0; - } - - value = swrm->read(swrm->handle, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank)); - value &= (~mask); - value |= ((0 << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (n_col << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - (0 << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - swrm->write(swrm->handle, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - dev_dbg(swrm->dev, "%s: regaddr: 0x%x, value: 0x%x\n", __func__, - SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank), value); - - enable_bank_switch(swrm, bank, SWR_MAX_ROW, n_col); - - inactive_bank = bank ? 0 : 1; - if (enable) - swrm_copy_data_port_config(master, inactive_bank); - else - swrm_cleanup_disabled_data_ports(master, inactive_bank); - - if (!swrm_is_port_en(master)) { - dev_dbg(&master->dev, "%s: pm_runtime auto suspend triggered\n", - __func__); - pm_runtime_mark_last_busy(&swrm->pdev->dev); - pm_runtime_put_autosuspend(&swrm->pdev->dev); - } - return 0; -} - -static void swrm_apply_port_config(struct swr_master *master) -{ - u8 bank; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return; - } - - bank = get_inactive_bank_num(swrm); - dev_dbg(swrm->dev, "%s: enter bank: %d master_ports: %d\n", - __func__, bank, master->num_port); - - swrm_copy_data_port_config(master, bank); -} - -static void swrm_copy_data_port_config(struct swr_master *master, u8 bank) -{ - u32 value; - struct swr_port_info *port; - int i; - int port_type; - struct swrm_mports *mport; - u32 reg[SWRM_MAX_PORT_REG]; - u32 val[SWRM_MAX_PORT_REG]; - int len = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - pr_err("%s: swrm is null\n", __func__); - return; - } - - dev_dbg(swrm->dev, "%s: master num_port: %d\n", __func__, - master->num_port); - - mport = list_first_entry_or_null(&swrm->mport_list, - struct swrm_mports, - list); - if (!mport) { - dev_err(swrm->dev, "%s: list is empty\n", __func__); - return; - } - for (i = 0; i < master->num_port; i++) { - - port = swrm_get_enabled_port(master, mstr_ports[mport->id]); - if (!port) - continue; - port_type = mstr_port_type[mport->id]; - if (!port->dev_num || (port->dev_num > master->num_dev)) { - dev_dbg(swrm->dev, "%s: invalid device id = %d\n", - __func__, port->dev_num); - continue; - } - value = ((port->ch_en) - << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT); - value |= ((port->offset2) - << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= ((port->offset1) - << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= port->sinterval; - - reg[len] = SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank); - val[len++] = value; - - dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n", - __func__, mport->id, - (SWRM_DP_PORT_CTRL_BANK((mport->id+1), bank)), value); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->ch_en, port->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->sinterval, - port->dev_num, 0x00, - SWRS_DP_SAMPLE_CONTROL_1_BANK(port_type, bank)); - - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->offset1, - port->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_1_BANK(port_type, bank)); - - if (port_type != 0) { - reg[len] = SWRM_CMD_FIFO_WR_CMD; - val[len++] = SWR_REG_VAL_PACK(port->offset2, - port->dev_num, 0x00, - SWRS_DP_OFFSET_CONTROL_2_BANK(port_type, - bank)); - } - mport = list_next_entry(mport, list); - if (!mport) { - dev_err(swrm->dev, "%s: end of list\n", __func__); - break; - } - } - swrm->bulk_write(swrm->handle, reg, val, len); -} - -static int swrm_connect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i; - struct swr_port_info *port; - int ret = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - struct swrm_mports *mport; - struct list_head *ptr, *next; - - dev_dbg(&master->dev, "%s: enter\n", __func__); - if (!portinfo) - return -EINVAL; - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - mutex_lock(&swrm->mlock); - if (!swrm_is_port_en(master)) - pm_runtime_get_sync(&swrm->pdev->dev); - - for (i = 0; i < portinfo->num_port; i++) { - mport = kzalloc(sizeof(struct swrm_mports), GFP_KERNEL); - if (!mport) { - ret = -ENOMEM; - goto mem_fail; - } - ret = swrm_get_master_port(&mport->id, - portinfo->port_id[i]); - if (ret < 0) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - goto port_fail; - } - port = swrm_get_avail_port(master); - if (!port) { - dev_err(&master->dev, - "%s: avail ports not found!\n", __func__); - goto port_fail; - } - list_add(&mport->list, &swrm->mport_list); - port->dev_num = portinfo->dev_num; - port->slave_port_id = portinfo->port_id[i]; - port->num_ch = portinfo->num_ch[i]; - port->ch_rate = portinfo->ch_rate[i]; - port->ch_en = portinfo->ch_en[i]; - port->port_en = true; - dev_dbg(&master->dev, - "%s: mstr port %d, slv port %d ch_rate %d num_ch %d\n", - __func__, mport->id, port->slave_port_id, port->ch_rate, - port->num_ch); - } - master->num_port += portinfo->num_port; - if (master->num_port >= SWR_MSTR_PORT_LEN) - master->num_port = SWR_MSTR_PORT_LEN; - - swrm_get_port_config(master); - swr_port_response(master, portinfo->tid); - swrm->num_cfg_devs += 1; - dev_dbg(&master->dev, "%s: cfg_devs: %d, rx_chs: %d\n", - __func__, swrm->num_cfg_devs, swrm->num_rx_chs); - if (swrm->num_rx_chs > 1) { - if (swrm->num_rx_chs == swrm->num_cfg_devs) - swrm_apply_port_config(master); - } else { - swrm_apply_port_config(master); - } - mutex_unlock(&swrm->mlock); - return 0; - -port_fail: - kfree(mport); -mem_fail: - list_for_each_safe(ptr, next, &swrm->mport_list) { - mport = list_entry(ptr, struct swrm_mports, list); - for (i = 0; i < portinfo->num_port; i++) { - if (portinfo->port_id[i] == mstr_ports[mport->id]) { - port = swrm_get_port(master, - portinfo->port_id[i]); - if (port) - port->ch_en = false; - list_del(&mport->list); - kfree(mport); - break; - } - } - } - mutex_unlock(&swrm->mlock); - return ret; -} - -static int swrm_disconnect_port(struct swr_master *master, - struct swr_params *portinfo) -{ - int i; - struct swr_port_info *port; - u8 bank; - u32 value; - int ret = 0; - u8 mport_id = 0; - int port_type = 0; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(master); - - if (!swrm) { - dev_err(&master->dev, - "%s: Invalid handle to swr controller\n", - __func__); - return -EINVAL; - } - - if (!portinfo) { - dev_err(&master->dev, "%s: portinfo is NULL\n", __func__); - return -EINVAL; - } - mutex_lock(&swrm->mlock); - bank = get_inactive_bank_num(swrm); - for (i = 0; i < portinfo->num_port; i++) { - ret = swrm_get_master_port(&mport_id, - portinfo->port_id[i]); - if (ret < 0) { - dev_err(&master->dev, - "%s: mstr portid for slv port %d not found\n", - __func__, portinfo->port_id[i]); - mutex_unlock(&swrm->mlock); - return -EINVAL; - } - port = swrm_get_enabled_port(master, portinfo->port_id[i]); - if (!port) { - dev_dbg(&master->dev, "%s: port %d already disabled\n", - __func__, portinfo->port_id[i]); - continue; - } - port_type = mstr_port_type[mport_id]; - port->dev_num = portinfo->dev_num; - port->port_en = false; - port->ch_en = 0; - value = port->ch_en << SWRM_DP_PORT_CTRL_EN_CHAN_SHFT; - value |= (port->offset2 << SWRM_DP_PORT_CTRL_OFFSET2_SHFT); - value |= (port->offset1 << SWRM_DP_PORT_CTRL_OFFSET1_SHFT); - value |= port->sinterval; - - - swrm->write(swrm->handle, - SWRM_DP_PORT_CTRL_BANK((mport_id+1), bank), - value); - swrm_cmd_fifo_wr_cmd(swrm, 0x00, port->dev_num, 0x00, - SWRS_DP_CHANNEL_ENABLE_BANK(port_type, bank)); - } - - swr_port_response(master, portinfo->tid); - swrm->num_cfg_devs -= 1; - dev_dbg(&master->dev, "%s: cfg_devs: %d, rx_chs: %d, active ports: %d\n", - __func__, swrm->num_cfg_devs, swrm->num_rx_chs, - master->num_port); - mutex_unlock(&swrm->mlock); - - return 0; -} - -static int swrm_check_slave_change_status(struct swr_mstr_ctrl *swrm, - int status, u8 *devnum) -{ - int i; - int new_sts = status; - int ret = SWR_NOT_PRESENT; - - if (status != swrm->slave_status) { - for (i = 0; i < (swrm->master.num_dev + 1); i++) { - if ((status & SWRM_MCP_SLV_STATUS_MASK) != - (swrm->slave_status & SWRM_MCP_SLV_STATUS_MASK)) { - ret = (status & SWRM_MCP_SLV_STATUS_MASK); - *devnum = i; - break; - } - status >>= 2; - swrm->slave_status >>= 2; - } - swrm->slave_status = new_sts; - } - return ret; -} - -static irqreturn_t swr_mstr_interrupt(int irq, void *dev) -{ - struct swr_mstr_ctrl *swrm = dev; - u32 value, intr_sts; - int status, chg_sts, i; - u8 devnum = 0; - int ret = IRQ_HANDLED; - - mutex_lock(&swrm->reslock); - swrm_clk_request(swrm, true); - mutex_unlock(&swrm->reslock); - - intr_sts = swrm->read(swrm->handle, SWRM_INTERRUPT_STATUS); - intr_sts &= SWRM_INTERRUPT_STATUS_RMSK; - for (i = 0; i < SWRM_INTERRUPT_MAX; i++) { - value = intr_sts & (1 << i); - if (!value) - continue; - - swrm->write(swrm->handle, SWRM_INTERRUPT_CLEAR, value); - switch (value) { - case SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ: - dev_dbg(swrm->dev, "SWR slave pend irq\n"); - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED: - dev_dbg(swrm->dev, "SWR new slave attached\n"); - break; - case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS: - status = swrm->read(swrm->handle, SWRM_MCP_SLV_STATUS); - if (status == swrm->slave_status) { - dev_dbg(swrm->dev, - "%s: No change in slave status: %d\n", - __func__, status); - break; - } - chg_sts = swrm_check_slave_change_status(swrm, status, - &devnum); - switch (chg_sts) { - case SWR_NOT_PRESENT: - dev_dbg(swrm->dev, "device %d got detached\n", - devnum); - break; - case SWR_ATTACHED_OK: - dev_dbg(swrm->dev, "device %d got attached\n", - devnum); - break; - case SWR_ALERT: - dev_dbg(swrm->dev, - "device %d has pending interrupt\n", - devnum); - break; - } - break; - case SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET: - dev_err_ratelimited(swrm->dev, "SWR bus clash detected\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO overflow\n"); - break; - case SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW: - dev_dbg(swrm->dev, "SWR read FIFO underflow\n"); - break; - case SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW: - dev_dbg(swrm->dev, "SWR write FIFO overflow\n"); - break; - case SWRM_INTERRUPT_STATUS_CMD_ERROR: - value = swrm->read(swrm->handle, SWRM_CMD_FIFO_STATUS); - dev_err_ratelimited(swrm->dev, - "SWR CMD error, fifo status 0x%x, flushing fifo\n", - value); - swrm->write(swrm->handle, SWRM_CMD_FIFO_CMD, 0x1); - break; - case SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION: - dev_dbg(swrm->dev, "SWR Port collision detected\n"); - break; - case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH: - dev_dbg(swrm->dev, "SWR read enable valid mismatch\n"); - break; - case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED: - complete(&swrm->broadcast); - dev_dbg(swrm->dev, "SWR cmd id finished\n"); - break; - case SWRM_INTERRUPT_STATUS_NEW_SLAVE_AUTO_ENUM_FINISHED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED: - break; - case SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL: - break; - case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED: - complete(&swrm->reset); - break; - case SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED: - break; - default: - dev_err_ratelimited(swrm->dev, "SWR unknown interrupt\n"); - ret = IRQ_NONE; - break; - } - } - - mutex_lock(&swrm->reslock); - swrm_clk_request(swrm, false); - mutex_unlock(&swrm->reslock); - return ret; -} - -static int swrm_get_device_status(struct swr_mstr_ctrl *swrm, u8 devnum) -{ - u32 val; - - swrm->slave_status = swrm->read(swrm->handle, SWRM_MCP_SLV_STATUS); - val = (swrm->slave_status >> (devnum * 2)); - val &= SWRM_MCP_SLV_STATUS_MASK; - return val; -} - -static int swrm_get_logical_dev_num(struct swr_master *mstr, u64 dev_id, - u8 *dev_num) -{ - int i; - u64 id = 0; - int ret = -EINVAL; - struct swr_mstr_ctrl *swrm = swr_get_ctrl_data(mstr); - struct swr_device *swr_dev; - u32 num_dev = 0; - - if (!swrm) { - pr_err("%s: Invalid handle to swr controller\n", - __func__); - return ret; - } - if (swrm->num_dev) - num_dev = swrm->num_dev; - else - num_dev = mstr->num_dev; - - pm_runtime_get_sync(&swrm->pdev->dev); - for (i = 1; i < (num_dev + 1); i++) { - id = ((u64)(swrm->read(swrm->handle, - SWRM_ENUMERATOR_SLAVE_DEV_ID_2(i))) << 32); - id |= swrm->read(swrm->handle, - SWRM_ENUMERATOR_SLAVE_DEV_ID_1(i)); - /* - * As pm_runtime_get_sync() brings all slaves out of reset - * update logical device number for all slaves. - */ - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - if (swr_dev->addr == (id & SWR_DEV_ID_MASK)) { - u32 status = swrm_get_device_status(swrm, i); - - if ((status == 0x01) || (status == 0x02)) { - swr_dev->dev_num = i; - if ((id & SWR_DEV_ID_MASK) == dev_id) { - *dev_num = i; - ret = 0; - } - dev_dbg(swrm->dev, "%s: devnum %d is assigned for dev addr %lx\n", - __func__, i, swr_dev->addr); - } - } - } - } - if (ret) - dev_err(swrm->dev, "%s: device 0x%llx is not ready\n", - __func__, dev_id); - - pm_runtime_mark_last_busy(&swrm->pdev->dev); - pm_runtime_put_autosuspend(&swrm->pdev->dev); - return ret; -} -static int swrm_master_init(struct swr_mstr_ctrl *swrm) -{ - int ret = 0; - u32 val; - u8 row_ctrl = SWR_MAX_ROW; - u8 col_ctrl = SWR_MIN_COL; - u8 ssp_period = 1; - u8 retry_cmd_num = 3; - u32 reg[SWRM_MAX_INIT_REG]; - u32 value[SWRM_MAX_INIT_REG]; - int len = 0; - - /* Clear Rows and Cols */ - val = ((row_ctrl << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | - (col_ctrl << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT) | - (ssp_period << SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT)); - - reg[len] = SWRM_MCP_FRAME_CTRL_BANK_ADDR(0); - value[len++] = val; - - /* Set Auto enumeration flag */ - reg[len] = SWRM_ENUMERATOR_CFG_ADDR; - value[len++] = 1; - - /* Mask soundwire interrupts */ - reg[len] = SWRM_INTERRUPT_MASK_ADDR; - value[len++] = 0x1FFFD; - - /* Configure No pings */ - val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR); - val &= ~SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK; - val |= (0x1f << SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT); - reg[len] = SWRM_MCP_CFG_ADDR; - value[len++] = val; - - /* Configure number of retries of a read/write cmd */ - val = (retry_cmd_num << SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT); - reg[len] = SWRM_CMD_FIFO_CFG_ADDR; - value[len++] = val; - - /* Set IRQ to PULSE */ - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x02; - - reg[len] = SWRM_COMP_CFG_ADDR; - value[len++] = 0x03; - - reg[len] = SWRM_INTERRUPT_CLEAR; - value[len++] = 0x08; - - swrm->bulk_write(swrm->handle, reg, value, len); - - return ret; -} - -static int swrm_event_notify(struct notifier_block *self, - unsigned long action, void *data) -{ - struct swr_mstr_ctrl *swrm = container_of(self, struct swr_mstr_ctrl, - event_notifier); - if (!swrm || !swrm->pdev) { - pr_err("%s: swrm or pdev is NULL\n", __func__); - return -EINVAL; - } - if (action != MSM_AUD_DC_EVENT) { - dev_err(&swrm->pdev->dev, "%s: invalid event type: %lu\n", __func__, action); - return -EINVAL; - } - - schedule_work(&(swrm->dc_presence_work)); - - return 0; -} - -static void swrm_notify_work_fn(struct work_struct *work) -{ - struct swr_mstr_ctrl *swrm = container_of(work, struct swr_mstr_ctrl, - dc_presence_work); - swrm_wcd_notify(swrm->pdev, SWR_DEVICE_DOWN, NULL); -} - -static int swrm_probe(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm; - struct swr_ctrl_platform_data *pdata; - int ret; - - /* Allocate soundwire master driver structure */ - swrm = kzalloc(sizeof(struct swr_mstr_ctrl), GFP_KERNEL); - if (!swrm) { - ret = -ENOMEM; - goto err_memory_fail; - } - swrm->dev = &pdev->dev; - swrm->pdev = pdev; - platform_set_drvdata(pdev, swrm); - swr_set_ctrl_data(&swrm->master, swrm); - pdata = dev_get_platdata(&pdev->dev); - if (!pdata) { - dev_err(&pdev->dev, "%s: pdata from parent is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->handle = (void *)pdata->handle; - if (!swrm->handle) { - dev_err(&pdev->dev, "%s: swrm->handle is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->read = pdata->read; - if (!swrm->read) { - dev_err(&pdev->dev, "%s: swrm->read is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->write = pdata->write; - if (!swrm->write) { - dev_err(&pdev->dev, "%s: swrm->write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->bulk_write = pdata->bulk_write; - if (!swrm->bulk_write) { - dev_err(&pdev->dev, "%s: swrm->bulk_write is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->clk = pdata->clk; - if (!swrm->clk) { - dev_err(&pdev->dev, "%s: swrm->clk is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->reg_irq = pdata->reg_irq; - if (!swrm->reg_irq) { - dev_err(&pdev->dev, "%s: swrm->reg_irq is NULL\n", - __func__); - ret = -EINVAL; - goto err_pdata_fail; - } - swrm->master.read = swrm_read; - swrm->master.write = swrm_write; - swrm->master.bulk_write = swrm_bulk_write; - swrm->master.get_logical_dev_num = swrm_get_logical_dev_num; - swrm->master.connect_port = swrm_connect_port; - swrm->master.disconnect_port = swrm_disconnect_port; - swrm->master.slvdev_datapath_control = swrm_slvdev_datapath_control; - swrm->master.remove_from_group = swrm_remove_from_group; - swrm->master.dev.parent = &pdev->dev; - swrm->master.dev.of_node = pdev->dev.of_node; - swrm->master.num_port = 0; - swrm->num_enum_slaves = 0; - swrm->rcmd_id = 0; - swrm->wcmd_id = 0; - swrm->slave_status = 0; - swrm->num_rx_chs = 0; - swrm->clk_ref_count = 0; - swrm->state = SWR_MSTR_RESUME; - init_completion(&swrm->reset); - init_completion(&swrm->broadcast); - mutex_init(&swrm->mlock); - INIT_LIST_HEAD(&swrm->mport_list); - mutex_init(&swrm->reslock); - mutex_init(&swrm->force_down_lock); - - ret = of_property_read_u32(swrm->dev->of_node, "qcom,swr-num-dev", - &swrm->num_dev); - if (ret) - dev_dbg(&pdev->dev, "%s: Looking up %s property failed\n", - __func__, "qcom,swr-num-dev"); - else { - if (swrm->num_dev > SWR_MAX_SLAVE_DEVICES) { - dev_err(&pdev->dev, "%s: num_dev %d > max limit %d\n", - __func__, swrm->num_dev, SWR_MAX_SLAVE_DEVICES); - ret = -EINVAL; - goto err_pdata_fail; - } - } - ret = swrm->reg_irq(swrm->handle, swr_mstr_interrupt, swrm, - SWR_IRQ_REGISTER); - if (ret) { - dev_err(&pdev->dev, "%s: IRQ register failed ret %d\n", - __func__, ret); - goto err_irq_fail; - } - - ret = swr_register_master(&swrm->master); - if (ret) { - dev_err(&pdev->dev, "%s: error adding swr master\n", __func__); - goto err_mstr_fail; - } - - /* Add devices registered with board-info as the - * controller will be up now - */ - swr_master_add_boarddevices(&swrm->master); - mutex_lock(&swrm->mlock); - swrm_clk_request(swrm, true); - ret = swrm_master_init(swrm); - if (ret < 0) { - dev_err(&pdev->dev, - "%s: Error in master Initializaiton, err %d\n", - __func__, ret); - mutex_unlock(&swrm->mlock); - goto err_mstr_fail; - } - swrm->version = swrm->read(swrm->handle, SWRM_COMP_HW_VERSION); - - mutex_unlock(&swrm->mlock); - - if (pdev->dev.of_node) - of_register_swr_devices(&swrm->master); - - dbgswrm = swrm; - debugfs_swrm_dent = debugfs_create_dir(dev_name(&pdev->dev), 0); - if (!IS_ERR(debugfs_swrm_dent)) { - debugfs_peek = debugfs_create_file("swrm_peek", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_peek", &swrm_debug_ops); - - debugfs_poke = debugfs_create_file("swrm_poke", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_poke", &swrm_debug_ops); - - debugfs_reg_dump = debugfs_create_file("swrm_reg_dump", - S_IFREG | 0444, debugfs_swrm_dent, - (void *) "swrm_reg_dump", - &swrm_debug_ops); - } - pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_active(&pdev->dev); - pm_runtime_enable(&pdev->dev); - pm_runtime_mark_last_busy(&pdev->dev); - - INIT_WORK(&swrm->dc_presence_work, swrm_notify_work_fn); - swrm->event_notifier.notifier_call = swrm_event_notify; - msm_aud_evt_register_client(&swrm->event_notifier); - - return 0; -err_mstr_fail: - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); -err_irq_fail: - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->force_down_lock); -err_pdata_fail: - kfree(swrm); -err_memory_fail: - return ret; -} - -static int swrm_remove(struct platform_device *pdev) -{ - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - if (swrm->reg_irq) - swrm->reg_irq(swrm->handle, swr_mstr_interrupt, - swrm, SWR_IRQ_FREE); - if (swrm->mstr_port) { - kfree(swrm->mstr_port->port); - swrm->mstr_port->port = NULL; - kfree(swrm->mstr_port); - swrm->mstr_port = NULL; - } - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - swr_unregister_master(&swrm->master); - msm_aud_evt_unregister_client(&swrm->event_notifier); - mutex_destroy(&swrm->mlock); - mutex_destroy(&swrm->reslock); - mutex_destroy(&swrm->force_down_lock); - kfree(swrm); - return 0; -} - -static int swrm_clk_pause(struct swr_mstr_ctrl *swrm) -{ - u32 val; - - dev_dbg(swrm->dev, "%s: state: %d\n", __func__, swrm->state); - swrm->write(swrm->handle, SWRM_INTERRUPT_MASK_ADDR, 0x1FDFD); - val = swrm->read(swrm->handle, SWRM_MCP_CFG_ADDR); - val |= SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK; - swrm->write(swrm->handle, SWRM_MCP_CFG_ADDR, val); - swrm->state = SWR_MSTR_PAUSE; - - return 0; -} - -#ifdef CONFIG_PM -static int swrm_runtime_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - - dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - if ((swrm->state == SWR_MSTR_PAUSE) || - (swrm->state == SWR_MSTR_DOWN)) { - if (swrm->state == SWR_MSTR_DOWN) { - if (swrm_clk_request(swrm, true)) - goto exit; - } - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_up(swr_dev); - if (ret) { - dev_err(dev, - "%s: failed to wakeup swr dev %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - goto exit; - } - } - swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01); - swrm->write(swrm->handle, SWRM_COMP_SW_RESET, 0x01); - swrm_master_init(swrm); - } -exit: - pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); - mutex_unlock(&swrm->reslock); - return ret; -} - -static int swrm_runtime_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - struct swr_master *mstr = &swrm->master; - struct swr_device *swr_dev; - int current_state = 0; - - dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n", - __func__, swrm->state); - mutex_lock(&swrm->reslock); - mutex_lock(&swrm->force_down_lock); - current_state = swrm->state; - mutex_unlock(&swrm->force_down_lock); - if ((current_state == SWR_MSTR_RESUME) || - (current_state == SWR_MSTR_UP) || - (current_state == SWR_MSTR_SSR)) { - - if ((current_state != SWR_MSTR_SSR) && - swrm_is_port_en(&swrm->master)) { - dev_dbg(dev, "%s ports are enabled\n", __func__); - ret = -EBUSY; - goto exit; - } - swrm_clk_pause(swrm); - swrm->write(swrm->handle, SWRM_COMP_CFG_ADDR, 0x00); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_device_down(swr_dev); - if (ret) { - dev_err(dev, - "%s: failed to shutdown swr dev %d\n", - __func__, swr_dev->dev_num); - goto exit; - } - } - swrm_clk_request(swrm, false); - } -exit: - mutex_unlock(&swrm->reslock); - return ret; -} -#endif /* CONFIG_PM */ - -static int swrm_device_down(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - int ret = 0; - - dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state); - - mutex_lock(&swrm->force_down_lock); - swrm->state = SWR_MSTR_SSR; - mutex_unlock(&swrm->force_down_lock); - /* Use pm runtime function to tear down */ - ret = pm_runtime_put_sync_suspend(dev); - pm_runtime_get_noresume(dev); - - return ret; -} - -/** - * swrm_wcd_notify - parent device can notify to soundwire master through - * this function - * @pdev: pointer to platform device structure - * @id: command id from parent to the soundwire master - * @data: data from parent device to soundwire master - */ -int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data) -{ - struct swr_mstr_ctrl *swrm; - int ret = 0; - struct swr_master *mstr; - struct swr_device *swr_dev; - - if (!pdev) { - pr_err("%s: pdev is NULL\n", __func__); - return -EINVAL; - } - swrm = platform_get_drvdata(pdev); - if (!swrm) { - dev_err(&pdev->dev, "%s: swrm is NULL\n", __func__); - return -EINVAL; - } - mstr = &swrm->master; - - switch (id) { - case SWR_CH_MAP: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - ret = swrm_set_ch_map(swrm, data); - } - break; - case SWR_DEVICE_DOWN: - dev_dbg(swrm->dev, "%s: swr master down called\n", __func__); - mutex_lock(&swrm->mlock); - if ((swrm->state == SWR_MSTR_PAUSE) || - (swrm->state == SWR_MSTR_DOWN)) - dev_dbg(swrm->dev, "%s: SWR master is already Down: %d\n", - __func__, swrm->state); - else - swrm_device_down(&pdev->dev); - mutex_unlock(&swrm->mlock); - break; - case SWR_DEVICE_UP: - dev_dbg(swrm->dev, "%s: swr master up called\n", __func__); - mutex_lock(&swrm->mlock); - mutex_lock(&swrm->reslock); - if ((swrm->state == SWR_MSTR_RESUME) || - (swrm->state == SWR_MSTR_UP)) { - dev_dbg(swrm->dev, "%s: SWR master is already UP: %d\n", - __func__, swrm->state); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) - swr_reset_device(swr_dev); - } else { - pm_runtime_mark_last_busy(&pdev->dev); - mutex_unlock(&swrm->reslock); - pm_runtime_get_sync(&pdev->dev); - mutex_lock(&swrm->reslock); - list_for_each_entry(swr_dev, &mstr->devices, dev_list) { - ret = swr_reset_device(swr_dev); - if (ret) { - dev_err(swrm->dev, - "%s: failed to reset swr device %d\n", - __func__, swr_dev->dev_num); - swrm_clk_request(swrm, false); - } - } - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_put_autosuspend(&pdev->dev); - } - mutex_unlock(&swrm->reslock); - mutex_unlock(&swrm->mlock); - break; - case SWR_SET_NUM_RX_CH: - if (!data) { - dev_err(swrm->dev, "%s: data is NULL\n", __func__); - ret = -EINVAL; - } else { - mutex_lock(&swrm->mlock); - swrm->num_rx_chs = *(int *)data; - if ((swrm->num_rx_chs > 1) && !swrm->num_cfg_devs) { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_BROADCAST); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } else { - list_for_each_entry(swr_dev, &mstr->devices, - dev_list) { - ret = swr_set_device_group(swr_dev, - SWR_GROUP_NONE); - if (ret) - dev_err(swrm->dev, - "%s: set num ch failed\n", - __func__); - } - } - mutex_unlock(&swrm->mlock); - } - break; - default: - dev_err(swrm->dev, "%s: swr master unknown id %d\n", - __func__, id); - break; - } - return ret; -} -EXPORT_SYMBOL(swrm_wcd_notify); - -#ifdef CONFIG_PM_SLEEP -static int swrm_suspend(struct device *dev) -{ - int ret = -EBUSY; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system suspend, state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) { - ret = swrm_runtime_suspend(dev); - if (!ret) { - /* - * Synchronize runtime-pm and system-pm states: - * At this point, we are already suspended. If - * runtime-pm still thinks its active, then - * make sure its status is in sync with HW - * status. The three below calls let the - * runtime-pm know that we are suspended - * already without re-invoking the suspend - * callback - */ - pm_runtime_disable(dev); - pm_runtime_set_suspended(dev); - pm_runtime_enable(dev); - } - } - if (ret == -EBUSY) { - /* - * There is a possibility that some audio stream is active - * during suspend. We dont want to return suspend failure in - * that case so that display and relevant components can still - * go to suspend. - * If there is some other error, then it should be passed-on - * to system level suspend - */ - ret = 0; - } - return ret; -} - -static int swrm_resume(struct device *dev) -{ - int ret = 0; - struct platform_device *pdev = to_platform_device(dev); - struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); - - dev_dbg(dev, "%s: system resume, state: %d\n", __func__, swrm->state); - if (!pm_runtime_enabled(dev) || !pm_runtime_suspend(dev)) { - ret = swrm_runtime_resume(dev); - if (!ret) { - pm_runtime_mark_last_busy(dev); - pm_request_autosuspend(dev); - } - } - return ret; -} -#endif /* CONFIG_PM_SLEEP */ - -static const struct dev_pm_ops swrm_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS( - swrm_suspend, - swrm_resume - ) - SET_RUNTIME_PM_OPS( - swrm_runtime_suspend, - swrm_runtime_resume, - NULL - ) -}; - -static const struct of_device_id swrm_dt_match[] = { - { - .compatible = "qcom,swr-wcd", - }, - {} -}; - -static struct platform_driver swr_mstr_driver = { - .probe = swrm_probe, - .remove = swrm_remove, - .driver = { - .name = SWR_WCD_NAME, - .owner = THIS_MODULE, - .pm = &swrm_dev_pm_ops, - .of_match_table = swrm_dt_match, - }, -}; - -static int __init swrm_init(void) -{ - return platform_driver_register(&swr_mstr_driver); -} -module_init(swrm_init); - -static void __exit swrm_exit(void) -{ - platform_driver_unregister(&swr_mstr_driver); -} -module_exit(swrm_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("WCD SoundWire Controller"); -MODULE_ALIAS("platform:swr-wcd"); diff --git a/techpack/audio/soc/swr-wcd-ctrl.h b/techpack/audio/soc/swr-wcd-ctrl.h deleted file mode 100644 index 14b2b48dbb84..000000000000 --- a/techpack/audio/soc/swr-wcd-ctrl.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (c) 2015-2018, 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _SWR_WCD_CTRL_H -#define _SWR_WCD_CTRL_H -#include -#include - -#define SWR_MAX_ROW 0 /* Rows = 48 */ -#define SWR_MAX_COL 7 /* Cols = 16 */ -#define SWR_MIN_COL 0 /* Cols = 2 */ - -#define SWR_WCD_NAME "swr-wcd" - -#define SWR_MSTR_PORT_LEN 8 /* Number of master ports */ - -#define SWR_MAX_SLAVE_DEVICES 11 - -#define SWRM_VERSION_1_0 0x01010000 -#define SWRM_VERSION_1_2 0x01030000 -#define SWRM_VERSION_1_3 0x01040000 - -enum { - SWR_MSTR_PAUSE, - SWR_MSTR_RESUME, - SWR_MSTR_UP, - SWR_MSTR_DOWN, - SWR_MSTR_SSR, -}; - -enum { - SWR_IRQ_FREE, - SWR_IRQ_REGISTER, -}; - -enum { - SWR_DAC_PORT, - SWR_COMP_PORT, - SWR_BOOST_PORT, - SWR_VISENSE_PORT, -}; - -struct usecase { - u8 num_port; - u8 num_ch; - u32 chrate; -}; - -struct port_params { - u8 si; - u8 off1; - u8 off2; -}; - -struct swrm_mports { - struct list_head list; - u8 id; -}; - -struct swr_ctrl_platform_data { - void *handle; /* holds priv data */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); -}; - -struct swr_mstr_ctrl { - struct swr_master master; - struct device *dev; - struct resource *supplies; - struct clk *mclk; - int clk_ref_count; - struct completion reset; - struct completion broadcast; - struct mutex mlock; - struct mutex reslock; - u8 rcmd_id; - u8 wcmd_id; - void *handle; /* SWR Master handle from client for read and writes */ - int (*read)(void *handle, int reg); - int (*write)(void *handle, int reg, int val); - int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len); - int (*clk)(void *handle, bool enable); - int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq, - void *data), void *swr_handle, int type); - int irq; - int version; - u32 num_dev; - int num_enum_slaves; - int slave_status; - struct swr_mstr_port *mstr_port; - struct list_head mport_list; - int state; - struct platform_device *pdev; - int num_rx_chs; - u8 num_cfg_devs; - struct mutex force_down_lock; - int force_down_state; - - struct notifier_block event_notifier; - struct work_struct dc_presence_work; -}; - -#endif /* _SWR_WCD_CTRL_H */ diff --git a/techpack/audio/soc/swrm_port_config.h b/techpack/audio/soc/swrm_port_config.h deleted file mode 100644 index 8c5d3653043b..000000000000 --- a/techpack/audio/soc/swrm_port_config.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (c) 2018-2019 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _SWRM_PORT_CONFIG -#define _SWRM_PORT_CONFIG - -#define WSA_MSTR_PORT_MASK 0xFF - - -/* - * Add port configuration in the format - *{ si, off1, off2, hstart, hstop, wd_len, bp_mode, bgp_ctrl, lane_ctrl} - */ - -/* WSA ports - DAC, COMP, BOOST, DAC, COMP, BOOST, VI, VI */ -struct port_params wsa_frame_superset[SWR_MSTR_PORT_LEN] = { - {7, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {31, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {63, 12, 31, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF}, - {7, 6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {31, 18, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {63, 13, 31, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF}, - {15, 7, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {15, 10, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, -}; - -/* RX ports - HPH, CLSH, COMP, LO, DSD */ -struct port_params rx_frame_params[SWR_MSTR_PORT_LEN] = { - {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, - {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, - {31, 11, 11, 0xFF, 0xFF, 4, 1, 0xFF, 0}, - {7, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, - {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0}, -}; - -struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { - {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, - {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, - {31, 11, 11, 0xFF, 0xFF, 4, 1, 0xFF, 0}, - {7, 9, 0, 0xFF, 0xFF, 0xFF, 0xFF, 1, 0}, - {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 3, 0}, -}; - -/* TX ports - PCM_OUT, TX1, TX2, TX3, TX4 */ -struct port_params tx_perf_frame_params_superset[SWR_MSTR_PORT_LEN] = { - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {1, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, - {1, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1}, - {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, - {3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1}, -}; - -struct port_params tx_frame_params_superset[SWR_MSTR_PORT_LEN] = { - {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, - {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, - {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, - {3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, -}; - -#endif /* _SWRM_REGISTERS_H */ diff --git a/techpack/audio/soc/swrm_registers.h b/techpack/audio/soc/swrm_registers.h deleted file mode 100644 index ecff48d69941..000000000000 --- a/techpack/audio/soc/swrm_registers.h +++ /dev/null @@ -1,248 +0,0 @@ -/* Copyright (c) 2015, 2018 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 - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _SWRM_REGISTERS_H -#define _SWRM_REGISTERS_H - -#define SWRM_BASE_ADDRESS 0x00 - -#define SWRM_COMP_HW_VERSION SWRM_BASE_ADDRESS -#define SWRM_COMP_CFG_ADDR (SWRM_BASE_ADDRESS+0x00000004) -#define SWRM_COMP_CFG_RMSK 0x3 -#define SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_BMSK 0x2 -#define SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_SHFT 0x1 -#define SWRM_COMP_CFG_ENABLE_BMSK 0x1 -#define SWRM_COMP_CFG_ENABLE_SHFT 0x0 - -#define SWRM_COMP_SW_RESET (SWRM_BASE_ADDRESS+0x00000008) - -#define SWRM_COMP_PARAMS (SWRM_BASE_ADDRESS+0x100) -#define SWRM_COMP_PARAMS_DOUT_PORTS_MASK 0x0000001F -#define SWRM_COMP_PARAMS_DIN_PORTS_MASK 0x000003E0 -#define SWRM_COMP_PARAMS_WR_FIFO_DEPTH 0x00007C00 -#define SWRM_COMP_PARAMS_RD_FIFO_DEPTH 0x000F8000 -#define SWRM_COMP_PARAMS_AUTO_ENUM_SLAVES 0x00F00000 -#define SWRM_COMP_PARAMS_DATA_LANES 0x07000000 - -#define SWRM_COMP_MASTER_ID (SWRM_BASE_ADDRESS+0x104) - -#define SWRM_INTERRUPT_STATUS (SWRM_BASE_ADDRESS+0x00000200) -#define SWRM_INTERRUPT_STATUS_RMSK 0x1FFFD - -#define SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ 0x1 -#define SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED 0x2 -#define SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS 0x4 -#define SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET 0x8 -#define SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW 0x10 -#define SWRM_INTERRUPT_STATUS_RD_FIFO_UNDERFLOW 0x20 -#define SWRM_INTERRUPT_STATUS_WR_CMD_FIFO_OVERFLOW 0x40 -#define SWRM_INTERRUPT_STATUS_CMD_ERROR 0x80 -#define SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION 0x100 -#define SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH 0x200 -#define SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED 0x400 -#define SWRM_INTERRUPT_STATUS_NEW_SLAVE_AUTO_ENUM_FINISHED 0x800 -#define SWRM_INTERRUPT_STATUS_AUTO_ENUM_FAILED 0x1000 -#define SWRM_INTERRUPT_STATUS_AUTO_ENUM_TABLE_IS_FULL 0x2000 -#define SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED 0x4000 -#define SWRM_INTERRUPT_STATUS_CLK_STOP_FINISHED 0x8000 -#define SWRM_INTERRUPT_STATUS_ERROR_PORT_TEST 0x10000 - -#define SWRM_INTERRUPT_MASK_ADDR (SWRM_BASE_ADDRESS+0x00000204) -#define SWRM_INTERRUPT_MASK_RMSK 0x1FFFF - -#define SWRM_INTERRUPT_MASK_SLAVE_PEND_IRQ_BMSK 0x1 -#define SWRM_INTERRUPT_MASK_SLAVE_PEND_IRQ_SHFT 0x0 - -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_ATTACHED_BMSK 0x2 -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_ATTACHED_SHFT 0x1 - -#define SWRM_INTERRUPT_MASK_CHANGE_ENUM_SLAVE_STATUS_BMSK 0x4 -#define SWRM_INTERRUPT_MASK_CHANGE_ENUM_SLAVE_STATUS_SHFT 0x2 - -#define SWRM_INTERRUPT_MASK_MASTER_CLASH_DET_BMSK 0x8 -#define SWRM_INTERRUPT_MASK_MASTER_CLASH_DET_SHFT 0x3 - -#define SWRM_INTERRUPT_MASK_RD_FIFO_OVERFLOW_BMSK 0x10 -#define SWRM_INTERRUPT_MASK_RD_FIFO_OVERFLOW_SHFT 0x4 - -#define SWRM_INTERRUPT_MASK_RD_FIFO_UNDERFLOW_BMSK 0x20 -#define SWRM_INTERRUPT_MASK_RD_FIFO_UNDERFLOW_SHFT 0x5 - -#define SWRM_INTERRUPT_MASK_WR_CMD_FIFO_OVERFLOW_BMSK 0x40 -#define SWRM_INTERRUPT_MASK_WR_CMD_FIFO_OVERFLOW_SHFT 0x6 - -#define SWRM_INTERRUPT_MASK_CMD_ERROR_BMSK 0x80 -#define SWRM_INTERRUPT_MASK_CMD_ERROR_SHFT 0x7 - -#define SWRM_INTERRUPT_MASK_DOUT_PORT_COLLISION_BMSK 0x100 -#define SWRM_INTERRUPT_MASK_DOUT_PORT_COLLISION_SHFT 0x8 - -#define SWRM_INTERRUPT_MASK_READ_EN_RD_VALID_MISMATCH_BMSK 0x200 -#define SWRM_INTERRUPT_MASK_READ_EN_RD_VALID_MISMATCH_SHFT 0x9 - -#define SWRM_INTERRUPT_MASK_SPECIAL_CMD_ID_FINISHED_BMSK 0x400 -#define SWRM_INTERRUPT_MASK_SPECIAL_CMD_ID_FINISHED_SHFT 0xA - -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_AUTO_ENUM_FINISHED_BMSK 0x800 -#define SWRM_INTERRUPT_MASK_NEW_SLAVE_AUTO_ENUM_FINISHED_SHFT 0xB - -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_FAILED_BMSK 0x1000 -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_FAILED_SHFT 0xC - -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_TABLE_IS_FULL_BMSK 0x2000 -#define SWRM_INTERRUPT_MASK_AUTO_ENUM_TABLE_IS_FULL_SHFT 0xD - -#define SWRM_INTERRUPT_MASK_BUS_RESET_FINISHED_BMSK 0x4000 -#define SWRM_INTERRUPT_MASK_BUS_RESET_FINISHED_SHFT 0xE - -#define SWRM_INTERRUPT_MASK_CLK_STOP_FINISHED_BMSK 0x8000 -#define SWRM_INTERRUPT_MASK_CLK_STOP_FINISHED_SHFT 0xF - -#define SWRM_INTERRUPT_MASK_ERROR_PORT_TEST_BMSK 0x10000 -#define SWRM_INTERRUPT_MASK_ERROR_PORT_TEST_SHFT 0x10 - -#define SWRM_INTERRUPT_MAX 0x11 - -#define SWRM_INTERRUPT_CLEAR (SWRM_BASE_ADDRESS+0x00000208) - -#define SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN (SWRM_BASE_ADDRESS+0x00000210) - -#define SWRM_CMD_FIFO_WR_CMD (SWRM_BASE_ADDRESS + 0x00000300) -#define SWRM_CMD_FIFO_WR_CMD_MASK 0xFFFFFFFF -#define SWRM_CMD_FIFO_RD_CMD (SWRM_BASE_ADDRESS + 0x00000304) -#define SWRM_CMD_FIFO_RD_CMD_MASK 0xFFFFFFF -#define SWRM_CMD_FIFO_CMD (SWRM_BASE_ADDRESS + 0x00000308) -#define SWRM_CMD_FIFO_STATUS (SWRM_BASE_ADDRESS + 0x0000030C) - -#define SWRM_CMD_FIFO_STATUS_WR_CMD_FIFO_CNT_MASK 0x1F00 -#define SWRM_CMD_FIFO_STATUS_RD_CMD_FIFO_CNT_MASK 0x7C00000 - -#define SWRM_CMD_FIFO_CFG_ADDR (SWRM_BASE_ADDRESS+0x00000314) -#define SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_BMSK 0x7 -#define SWRM_CMD_FIFO_CFG_NUM_OF_CMD_RETRY_SHFT 0x0 - -#define SWRM_CMD_FIFO_RD_FIFO_ADDR (SWRM_BASE_ADDRESS + 0x00000318) - -#define SWRM_ENUMERATOR_CFG_ADDR (SWRM_BASE_ADDRESS+0x00000500) -#define SWRM_ENUMERATOR_CFG_AUTO_ENUM_EN_BMSK 0x1 -#define SWRM_ENUMERATOR_CFG_AUTO_ENUM_EN_SHFT 0x0 - -#define SWRM_ENUMERATOR_SLAVE_DEV_ID_1(m) (SWRM_BASE_ADDRESS+0x530+0x8*m) -#define SWRM_ENUMERATOR_SLAVE_DEV_ID_2(m) (SWRM_BASE_ADDRESS+0x534+0x8*m) - -#define SWRM_MCP_FRAME_CTRL_BANK_ADDR(m) (SWRM_BASE_ADDRESS+0x101C+0x40*m) -#define SWRM_MCP_FRAME_CTRL_BANK_RMSK 0x00ff07ff -#define SWRM_MCP_FRAME_CTRL_BANK_SHFT 0 -#define SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_BMSK 0xff0000 -#define SWRM_MCP_FRAME_CTRL_BANK_SSP_PERIOD_SHFT 16 -#define SWRM_MCP_FRAME_CTRL_BANK_PHASE_BMSK 0xf800 -#define SWRM_MCP_FRAME_CTRL_BANK_PHASE_SHFT 11 -#define SWRM_MCP_FRAME_CTRL_BANK_CLK_DIV_VALUE_BMSK 0x700 -#define SWRM_MCP_FRAME_CTRL_BANK_CLK_DIV_VALUE_SHFT 8 -#define SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK 0xF8 -#define SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT 3 -#define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK 0x7 -#define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT 0 - -#define SWRM_MCP_BUS_CTRL_ADDR (SWRM_BASE_ADDRESS+0x00001044) -#define SWRM_MCP_BUS_CTRL_BUS_RESET_BMSK 0x1 -#define SWRM_MCP_BUS_CTRL_BUS_RESET_SHFT 0x0 -#define SWRM_MCP_BUS_CTRL_CLK_START_BMSK 0x2 -#define SWRM_MCP_BUS_CTRL_CLK_START_SHFT 0x1 - -#define SWRM_MCP_CFG_ADDR (SWRM_BASE_ADDRESS+0x00001048) -#define SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK 0x3E0000 -#define SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT 0x11 -#define SWRM_MCP_CFG_BUS_CLK_PAUSE_BMSK 0x02 - -#define SWRM_MCP_STATUS (SWRM_BASE_ADDRESS+0x104C) -#define SWRM_MCP_STATUS_BANK_NUM_MASK 0x01 - -#define SWRM_MCP_SLV_STATUS (SWRM_BASE_ADDRESS+0x1090) -#define SWRM_MCP_SLV_STATUS_MASK 0x03 - -#define SWRM_DP_PORT_CTRL_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001124 + \ - 0x100*(n-1) + \ - 0x40*m) -#define SWRM_DP_PORT_CTRL_BANK_MASK 0xFFFFFFFF -#define SWRM_DP_PORT_CTRL_EN_CHAN_MASK 0xFF000000 -#define SWRM_DP_PORT_CTRL_EN_CHAN_SHFT 0x18 -#define SWRM_DP_PORT_CTRL_OFFSET2_SHFT 0x10 -#define SWRM_DP_PORT_CTRL_OFFSET1_SHFT 0x08 -#define SWRM_DP_PORT_CTRL_SAMPLE_INTERVAL 0x00 - -#define SWRM_DP_PORT_CTRL_2_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001128 + \ - 0x100*(n-1) + \ - 0x40*m) - -#define SWRM_DP_BLOCK_CTRL_1(n) (SWRM_BASE_ADDRESS + \ - 0x0000112C + \ - 0x100*(n-1)) - -#define SWRM_DP_BLOCK_CTRL2_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001130 + \ - 0x100*(n-1) + \ - 0x40*m) - -#define SWRM_DP_PORT_HCTRL_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001134 + \ - 0x100*(n-1) + \ - 0x40*m) - -#define SWRM_DP_BLOCK_CTRL3_BANK(n, m) (SWRM_BASE_ADDRESS + \ - 0x00001138 + \ - 0x100*(n-1) + \ - 0x40*m) - - -#define SWRM_DIN_DPn_PCM_PORT_CTRL(n) (SWRM_BASE_ADDRESS + \ - 0x00001054 + 0x100*(n-1)) - -#define SWRM_MAX_REGISTER SWRM_DIN_DPn_PCM_PORT_CTRL(7) - -/* Soundwire Slave Register definition */ - -#define SWRS_BASE_ADDRESS 0x00 - -#define SWRS_DP_REG_OFFSET(port, bank) ((0x100*port)+(0x10*bank)) - -#define SWRS_SCP_INT_STATUS_CLEAR_1 0x40 -#define SWRS_SCP_INT_STATUS_MASK_1 0x41 - -#define SWRS_SCP_CONTROL 0x44 -#define SWRS_DP_BLOCK_CONTROL_1(n) (SWRS_BASE_ADDRESS + 0x103 + \ - 0x100 * n) - -#define SWRS_DP_CHANNEL_ENABLE_BANK(n, m) (SWRS_BASE_ADDRESS + 0x120 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_BLOCK_CONTROL_2_BANK(n, m) (SWRS_BASE_ADDRESS + 0x121 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_SAMPLE_CONTROL_1_BANK(n, m) (SWRS_BASE_ADDRESS + 0x122 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_OFFSET_CONTROL_1_BANK(n, m) (SWRS_BASE_ADDRESS + 0x124 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_OFFSET_CONTROL_2_BANK(n, m) (SWRS_BASE_ADDRESS + 0x125 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_HCONTROL_BANK(n, m) (SWRS_BASE_ADDRESS + 0x126 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_BLOCK_CONTROL_3_BANK(n, m) (SWRS_BASE_ADDRESS + 0x127 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_DP_LANE_CONTROL_BANK(n, m) (SWRS_BASE_ADDRESS + 0x128 + \ - SWRS_DP_REG_OFFSET(n, m)) -#define SWRS_SCP_FRAME_CTRL_BANK(m) (SWRS_BASE_ADDRESS + 0x60 + \ - 0x10*m) -#define SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(m) (SWRS_BASE_ADDRESS + 0xE0 + \ - 0x10*m) - -#endif /* _SWRM_REGISTERS_H */